From 74daf177e4a79ee4912bc430e3f38db4a30c1d41 Mon Sep 17 00:00:00 2001 From: Dan Aridor Date: Thu, 7 May 2026 21:17:45 +0300 Subject: [PATCH 01/94] security: add RestrictedUnpickler for safe v0 pickle deserialization Ref: google/adk-python#5634 --- .../adk/sessions/schemas/_safe_unpickle.py | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/google/adk/sessions/schemas/_safe_unpickle.py diff --git a/src/google/adk/sessions/schemas/_safe_unpickle.py b/src/google/adk/sessions/schemas/_safe_unpickle.py new file mode 100644 index 0000000000..9018953692 --- /dev/null +++ b/src/google/adk/sessions/schemas/_safe_unpickle.py @@ -0,0 +1,84 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Restricted unpickler for safe deserialization of v0 EventActions data. + +The v0 schema stored EventActions as pickle blobs. This module provides a +safe deserialization path that only allows known ADK and standard types, +blocking arbitrary code execution via crafted pickle payloads. + +See: https://docs.python.org/3/library/pickle.html#restricting-globals +""" + +from __future__ import annotations + +import io +import logging +import os +import pickle +from typing import Any + +logger = logging.getLogger("google_adk." + __name__) + +_ALLOWED_MODULE_PREFIXES: tuple[str, ...] = ( + "google.adk.", + "google.genai.", + "pydantic.", + "pydantic_core.", +) + +_ALLOWED_GLOBALS: dict[str, set[str]] = { + "builtins": { + "dict", "list", "set", "tuple", "frozenset", "bytes", + "bytearray", "True", "False", "None", "type", "object", + "complex", "slice", "range", "int", "float", "str", "bool", + }, + "collections": {"OrderedDict", "defaultdict"}, + "datetime": {"datetime", "date", "time", "timedelta", "timezone"}, + "copy_reg": {"_reconstructor"}, + "copyreg": {"_reconstructor", "__newobj__"}, + "_codecs": {"encode"}, +} + + +class _RestrictedUnpickler(pickle.Unpickler): + """Unpickler that only allows reconstruction of known-safe types.""" + + def find_class(self, module: str, name: str) -> Any: + for prefix in _ALLOWED_MODULE_PREFIXES: + if module.startswith(prefix): + return super().find_class(module, name) + allowed_names = _ALLOWED_GLOBALS.get(module) + if allowed_names and name in allowed_names: + return super().find_class(module, name) + raise pickle.UnpicklingError( + f"Blocked unsafe pickle global: {module}.{name}. " + f"If this is a legitimate ADK type, please file an issue at " + f"https://github.com/google/adk-python/issues" + ) + + +def safe_loads(data: bytes) -> Any: + """Deserialize pickle bytes using a restricted unpickler. + + If ADK_ALLOW_UNSAFE_V0_PICKLE=1 is set, falls back to unrestricted + pickle.loads() for compatibility. A deprecation warning is logged. + """ + if os.environ.get("ADK_ALLOW_UNSAFE_V0_PICKLE") == "1": + logger.warning( + "ADK_ALLOW_UNSAFE_V0_PICKLE is set - using unrestricted " + "pickle.loads(). This is unsafe and will be removed in a " + "future release. Migrate to the v1 JSON schema." + ) + return pickle.loads(data) # noqa: S301 + return _RestrictedUnpickler(io.BytesIO(data)).load() From 41df6998a265fa42639156276bf88c8b2617463b Mon Sep 17 00:00:00 2001 From: Dan Aridor Date: Thu, 7 May 2026 21:17:59 +0300 Subject: [PATCH 02/94] security: use RestrictedUnpickler in v0 runtime read path Replace raw pickle.loads() with safe_loads() in DynamicPickleType.process_result_value(). Ref: google/adk-python#5634 --- src/google/adk/sessions/schemas/v0.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/google/adk/sessions/schemas/v0.py b/src/google/adk/sessions/schemas/v0.py index e4a4368c6d..62ee72b607 100644 --- a/src/google/adk/sessions/schemas/v0.py +++ b/src/google/adk/sessions/schemas/v0.py @@ -31,6 +31,8 @@ import json import logging import pickle + +from ._safe_unpickle import safe_loads as _safe_pickle_loads from typing import Any from typing import Optional @@ -114,7 +116,7 @@ def process_result_value(self, value, dialect): """Ensures the raw bytes from the database are unpickled back into a Python object.""" if value is not None: if dialect.name in ("spanner+spanner", "mysql"): - return pickle.loads(value) + return _safe_pickle_loads(value) return value From 99c79fbe3810b2f0d61bc930b11f2c4eb40898c5 Mon Sep 17 00:00:00 2001 From: Dan Aridor Date: Thu, 7 May 2026 21:22:54 +0300 Subject: [PATCH 03/94] chore: retrigger CLA check after signing From e0ccf64c22cca3c1f86f81981c4a21599ad54612 Mon Sep 17 00:00:00 2001 From: Dan Aridor Date: Thu, 7 May 2026 22:50:56 +0300 Subject: [PATCH 04/94] security: add enum types to RestrictedUnpickler allowlist Covers potential enum values in state_delta/agent_state dict[str, Any] fields. Ref: google/adk-python#5634 --- src/google/adk/sessions/schemas/_safe_unpickle.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/google/adk/sessions/schemas/_safe_unpickle.py b/src/google/adk/sessions/schemas/_safe_unpickle.py index 9018953692..8309462d4b 100644 --- a/src/google/adk/sessions/schemas/_safe_unpickle.py +++ b/src/google/adk/sessions/schemas/_safe_unpickle.py @@ -48,6 +48,7 @@ "copy_reg": {"_reconstructor"}, "copyreg": {"_reconstructor", "__newobj__"}, "_codecs": {"encode"}, + "enum": {"__new__", "Enum", "IntEnum", "StrEnum"}, } From 7aeba1b0e4d6c4fef99e3d1a69401bccdf31a564 Mon Sep 17 00:00:00 2001 From: Dan Aridor Date: Sat, 9 May 2026 10:10:19 +0300 Subject: [PATCH 05/94] style: run pyink + isort on _safe_unpickle.py Ref: google/adk-python#5634 --- .../adk/sessions/schemas/_safe_unpickle.py | 72 +++++++++++-------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/src/google/adk/sessions/schemas/_safe_unpickle.py b/src/google/adk/sessions/schemas/_safe_unpickle.py index 8309462d4b..a61fcfb5b6 100644 --- a/src/google/adk/sessions/schemas/_safe_unpickle.py +++ b/src/google/adk/sessions/schemas/_safe_unpickle.py @@ -39,9 +39,25 @@ _ALLOWED_GLOBALS: dict[str, set[str]] = { "builtins": { - "dict", "list", "set", "tuple", "frozenset", "bytes", - "bytearray", "True", "False", "None", "type", "object", - "complex", "slice", "range", "int", "float", "str", "bool", + "dict", + "list", + "set", + "tuple", + "frozenset", + "bytes", + "bytearray", + "True", + "False", + "None", + "type", + "object", + "complex", + "slice", + "range", + "int", + "float", + "str", + "bool", }, "collections": {"OrderedDict", "defaultdict"}, "datetime": {"datetime", "date", "time", "timedelta", "timezone"}, @@ -53,33 +69,33 @@ class _RestrictedUnpickler(pickle.Unpickler): - """Unpickler that only allows reconstruction of known-safe types.""" + """Unpickler that only allows reconstruction of known-safe types.""" - def find_class(self, module: str, name: str) -> Any: - for prefix in _ALLOWED_MODULE_PREFIXES: - if module.startswith(prefix): - return super().find_class(module, name) - allowed_names = _ALLOWED_GLOBALS.get(module) - if allowed_names and name in allowed_names: - return super().find_class(module, name) - raise pickle.UnpicklingError( - f"Blocked unsafe pickle global: {module}.{name}. " - f"If this is a legitimate ADK type, please file an issue at " - f"https://github.com/google/adk-python/issues" - ) + def find_class(self, module: str, name: str) -> Any: + for prefix in _ALLOWED_MODULE_PREFIXES: + if module.startswith(prefix): + return super().find_class(module, name) + allowed_names = _ALLOWED_GLOBALS.get(module) + if allowed_names and name in allowed_names: + return super().find_class(module, name) + raise pickle.UnpicklingError( + f"Blocked unsafe pickle global: {module}.{name}. " + "If this is a legitimate ADK type, please file an issue at " + "https://github.com/google/adk-python/issues" + ) def safe_loads(data: bytes) -> Any: - """Deserialize pickle bytes using a restricted unpickler. + """Deserialize pickle bytes using a restricted unpickler. - If ADK_ALLOW_UNSAFE_V0_PICKLE=1 is set, falls back to unrestricted - pickle.loads() for compatibility. A deprecation warning is logged. - """ - if os.environ.get("ADK_ALLOW_UNSAFE_V0_PICKLE") == "1": - logger.warning( - "ADK_ALLOW_UNSAFE_V0_PICKLE is set - using unrestricted " - "pickle.loads(). This is unsafe and will be removed in a " - "future release. Migrate to the v1 JSON schema." - ) - return pickle.loads(data) # noqa: S301 - return _RestrictedUnpickler(io.BytesIO(data)).load() + If ADK_ALLOW_UNSAFE_V0_PICKLE=1 is set, falls back to unrestricted + pickle.loads() for compatibility. A deprecation warning is logged. + """ + if os.environ.get("ADK_ALLOW_UNSAFE_V0_PICKLE") == "1": + logger.warning( + "ADK_ALLOW_UNSAFE_V0_PICKLE is set - using unrestricted " + "pickle.loads(). This is unsafe and will be removed in a " + "future release. Migrate to the v1 JSON schema." + ) + return pickle.loads(data) # noqa: S301 + return _RestrictedUnpickler(io.BytesIO(data)).load() From 37b8fed27c2a6e162cddf31891b910c399fd382f Mon Sep 17 00:00:00 2001 From: Dan Aridor Date: Sat, 9 May 2026 10:10:21 +0300 Subject: [PATCH 06/94] style: run pyink + isort on v0.py Ref: google/adk-python#5634 --- src/google/adk/sessions/schemas/v0.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/google/adk/sessions/schemas/v0.py b/src/google/adk/sessions/schemas/v0.py index 62ee72b607..5b378cb7a8 100644 --- a/src/google/adk/sessions/schemas/v0.py +++ b/src/google/adk/sessions/schemas/v0.py @@ -31,8 +31,6 @@ import json import logging import pickle - -from ._safe_unpickle import safe_loads as _safe_pickle_loads from typing import Any from typing import Optional @@ -59,6 +57,7 @@ from ...events.event import Event from ...events.event_actions import EventActions from ..session import Session +from ._safe_unpickle import safe_loads as _safe_pickle_loads from .shared import DEFAULT_MAX_KEY_LENGTH from .shared import DEFAULT_MAX_VARCHAR_LENGTH from .shared import DynamicJSON From fc1cad565e542b35f994b6670c981d7d749df5c2 Mon Sep 17 00:00:00 2001 From: Dan Aridor Date: Sat, 9 May 2026 10:10:22 +0300 Subject: [PATCH 07/94] style: run pyink + isort on migrate_from_sqlalchemy_pickle.py Ref: google/adk-python#5634 --- .../adk/sessions/migration/migrate_from_sqlalchemy_pickle.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py b/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py index 65a78c9401..334fd9b907 100644 --- a/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py +++ b/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py @@ -30,6 +30,7 @@ from google.adk.sessions import _session_util from google.adk.sessions.migration import _schema_check_utils from google.adk.sessions.schemas import v1 +from google.adk.sessions.schemas._safe_unpickle import safe_loads as _safe_pickle_loads from google.genai import types import sqlalchemy from sqlalchemy import create_engine From c5218fa21a4dcc8c361c5169cf6d0f1b3a233d80 Mon Sep 17 00:00:00 2001 From: Dan Aridor Date: Mon, 11 May 2026 18:16:06 +0300 Subject: [PATCH 08/94] security: override result_processor for SQLite safe deserialization --- src/google/adk/sessions/schemas/v0.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/google/adk/sessions/schemas/v0.py b/src/google/adk/sessions/schemas/v0.py index 5b378cb7a8..486791b790 100644 --- a/src/google/adk/sessions/schemas/v0.py +++ b/src/google/adk/sessions/schemas/v0.py @@ -111,6 +111,19 @@ def process_bind_param(self, value, dialect): return pickle.dumps(value) return value + def result_processor(self, dialect, coltype): + if dialect.name in ("mysql", "spanner+spanner"): + return super().result_processor(dialect, coltype) + + def process(value): + if value is None: + return None + if isinstance(value, memoryview): + value = bytes(value) + return _safe_pickle_loads(value) + + return process + def process_result_value(self, value, dialect): """Ensures the raw bytes from the database are unpickled back into a Python object.""" if value is not None: From a9b863ecdfc23f7b80b0d473fd67aef8d7600ae1 Mon Sep 17 00:00:00 2001 From: Dan Aridor Date: Mon, 11 May 2026 18:22:14 +0300 Subject: [PATCH 09/94] Add unit tests for RestrictedUnpickler functionality This test suite verifies that the RestrictedUnpickler correctly blocks malicious pickle payloads and ensures legitimate data can be safely unpickled. It also checks the behavior of the unpickler when an environment variable allows unsafe pickling. --- .../unittests/sessions/test_safe_unpickle.py | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 tests/unittests/sessions/test_safe_unpickle.py diff --git a/tests/unittests/sessions/test_safe_unpickle.py b/tests/unittests/sessions/test_safe_unpickle.py new file mode 100644 index 0000000000..e28c98ed12 --- /dev/null +++ b/tests/unittests/sessions/test_safe_unpickle.py @@ -0,0 +1,139 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for _safe_unpickle RestrictedUnpickler.""" + +from __future__ import annotations + +import io +import os +import pickle +import struct +import unittest + +from google.adk.sessions.schemas._safe_unpickle import safe_loads + + +def _make_global_payload(module: str, func: str, *args: str) -> bytes: + """Craft a pickle stream that calls module.func(*args).""" + buf = io.BytesIO() + buf.write(pickle.PROTO + struct.pack("B", 2)) + buf.write(b"c" + f"{module}\n{func}\n".encode()) + buf.write(b"(") + for arg in args: + encoded = arg.encode("utf-8") + buf.write( + pickle.SHORT_BINUNICODE + struct.pack(" safe_loads.""" + + def _round_trip(self, obj): + return safe_loads(pickle.dumps(obj)) + + def test_string_values(self): + original = {"state_delta": {"key": "value"}, "artifact_delta": {}} + self.assertEqual(self._round_trip(original), original) + + def test_nested_dict(self): + original = { + "state_delta": { + "user_prefs": {"theme": "dark", "lang": "en"}, + "counter": 42, + }, + "artifact_delta": {"files": ["a.txt", "b.txt"]}, + } + self.assertEqual(self._round_trip(original), original) + + def test_none_and_bool(self): + original = { + "skip_summarization": True, + "requested_auth_configs": None, + "escalate": False, + } + self.assertEqual(self._round_trip(original), original) + + def test_empty_dict(self): + self.assertEqual(self._round_trip({}), {}) + + +class TestEnvVarFallback(unittest.TestCase): + """ADK_ALLOW_UNSAFE_V0_PICKLE=1 must bypass RestrictedUnpickler.""" + + _ENV_KEY = "ADK_ALLOW_UNSAFE_V0_PICKLE" + _PAYLOAD = _make_global_payload("collections", "Counter") + + def test_blocked_without_env_var(self): + old = os.environ.pop(self._ENV_KEY, None) + try: + with self.assertRaises(pickle.UnpicklingError): + safe_loads(self._PAYLOAD) + finally: + if old is not None: + os.environ[self._ENV_KEY] = old + + def test_allowed_with_env_var(self): + old = os.environ.get(self._ENV_KEY) + try: + os.environ[self._ENV_KEY] = "1" + from collections import Counter + result = safe_loads(self._PAYLOAD) + self.assertIsInstance(result, Counter) + finally: + if old is None: + os.environ.pop(self._ENV_KEY, None) + else: + os.environ[self._ENV_KEY] = old + + +if __name__ == "__main__": + unittest.main() From 9f9c67e9db18a6cd616c571cf2cb62a16516b0a2 Mon Sep 17 00:00:00 2001 From: Dan Aridor Date: Mon, 18 May 2026 20:48:45 +0300 Subject: [PATCH 10/94] test: add real EventActions round-trip smoke tests Add tests Ref: google/adk-python#5634for EventActions serialization and deserialization. --- .../unittests/sessions/test_safe_unpickle.py | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tests/unittests/sessions/test_safe_unpickle.py b/tests/unittests/sessions/test_safe_unpickle.py index e28c98ed12..f1b8d5fbd9 100644 --- a/tests/unittests/sessions/test_safe_unpickle.py +++ b/tests/unittests/sessions/test_safe_unpickle.py @@ -22,6 +22,7 @@ import struct import unittest +from google.adk.events.event_actions import EventActions from google.adk.sessions.schemas._safe_unpickle import safe_loads @@ -105,6 +106,54 @@ def test_none_and_bool(self): def test_empty_dict(self): self.assertEqual(self._round_trip({}), {}) +class TestRealEventActionsRoundTrip(unittest.TestCase): + """Smoke test: real EventActions instances survive pickle -> safe_loads.""" + + def _round_trip(self, obj): + return safe_loads(pickle.dumps(obj)) + + def test_minimal_event_actions(self): + original = EventActions() + result = self._round_trip(original) + self.assertIsInstance(result, EventActions) + self.assertEqual(result.state_delta, {}) + self.assertEqual(result.artifact_delta, {}) + + def test_event_actions_with_state_delta(self): + original = EventActions( + state_delta={"user_name": "alice", "turn_count": 3, "active": True}, + artifact_delta={"report.pdf": 2}, + ) + result = self._round_trip(original) + self.assertIsInstance(result, EventActions) + self.assertEqual(result.state_delta, original.state_delta) + self.assertEqual(result.artifact_delta, original.artifact_delta) + + def test_event_actions_with_transfer_and_escalate(self): + original = EventActions( + transfer_to_agent="specialist_agent", + escalate=True, + skip_summarization=True, + ) + result = self._round_trip(original) + self.assertIsInstance(result, EventActions) + self.assertEqual(result.transfer_to_agent, "specialist_agent") + self.assertTrue(result.escalate) + self.assertTrue(result.skip_summarization) + + def test_event_actions_with_complex_state_values(self): + original = EventActions( + state_delta={ + "nested": {"a": [1, 2, 3], "b": None}, + "count": 42, + "tags": ["ml", "security"], + }, + ) + result = self._round_trip(original) + self.assertIsInstance(result, EventActions) + self.assertEqual(result.state_delta["nested"]["a"], [1, 2, 3]) + self.assertIsNone(result.state_delta["nested"]["b"]) + class TestEnvVarFallback(unittest.TestCase): """ADK_ALLOW_UNSAFE_V0_PICKLE=1 must bypass RestrictedUnpickler.""" From 5c0ba0692f4b62d665deda779afdc6bdff1dcdf1 Mon Sep 17 00:00:00 2001 From: Dan Aridor Date: Sat, 30 May 2026 08:13:30 +0300 Subject: [PATCH 11/94] fix(sessions): annotate result_processor for mypy-diff; pyink-format test file - Add Any type hints to DynamicPickleType.result_processor and its inner process() to clear mypy-diff [no-untyped-def]. - Reformat test_safe_unpickle.py to 2-space pyink style. --- .../migrate_from_sqlalchemy_pickle.py | 1 - src/google/adk/sessions/schemas/v0.py | 4 +- .../unittests/sessions/test_safe_unpickle.py | 280 +++++++++--------- 3 files changed, 143 insertions(+), 142 deletions(-) diff --git a/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py b/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py index 334fd9b907..65a78c9401 100644 --- a/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py +++ b/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py @@ -30,7 +30,6 @@ from google.adk.sessions import _session_util from google.adk.sessions.migration import _schema_check_utils from google.adk.sessions.schemas import v1 -from google.adk.sessions.schemas._safe_unpickle import safe_loads as _safe_pickle_loads from google.genai import types import sqlalchemy from sqlalchemy import create_engine diff --git a/src/google/adk/sessions/schemas/v0.py b/src/google/adk/sessions/schemas/v0.py index 486791b790..ddd8b5d39f 100644 --- a/src/google/adk/sessions/schemas/v0.py +++ b/src/google/adk/sessions/schemas/v0.py @@ -111,11 +111,11 @@ def process_bind_param(self, value, dialect): return pickle.dumps(value) return value - def result_processor(self, dialect, coltype): + def result_processor(self, dialect: Any, coltype: Any) -> Any: if dialect.name in ("mysql", "spanner+spanner"): return super().result_processor(dialect, coltype) - def process(value): + def process(value: Any) -> Any: if value is None: return None if isinstance(value, memoryview): diff --git a/tests/unittests/sessions/test_safe_unpickle.py b/tests/unittests/sessions/test_safe_unpickle.py index f1b8d5fbd9..7e58522b47 100644 --- a/tests/unittests/sessions/test_safe_unpickle.py +++ b/tests/unittests/sessions/test_safe_unpickle.py @@ -27,162 +27,164 @@ def _make_global_payload(module: str, func: str, *args: str) -> bytes: - """Craft a pickle stream that calls module.func(*args).""" - buf = io.BytesIO() - buf.write(pickle.PROTO + struct.pack("B", 2)) - buf.write(b"c" + f"{module}\n{func}\n".encode()) - buf.write(b"(") - for arg in args: - encoded = arg.encode("utf-8") - buf.write( - pickle.SHORT_BINUNICODE + struct.pack(" safe_loads.""" - - def _round_trip(self, obj): - return safe_loads(pickle.dumps(obj)) - - def test_string_values(self): - original = {"state_delta": {"key": "value"}, "artifact_delta": {}} - self.assertEqual(self._round_trip(original), original) - - def test_nested_dict(self): - original = { - "state_delta": { - "user_prefs": {"theme": "dark", "lang": "en"}, - "counter": 42, - }, - "artifact_delta": {"files": ["a.txt", "b.txt"]}, - } - self.assertEqual(self._round_trip(original), original) - - def test_none_and_bool(self): - original = { - "skip_summarization": True, - "requested_auth_configs": None, - "escalate": False, - } - self.assertEqual(self._round_trip(original), original) - - def test_empty_dict(self): - self.assertEqual(self._round_trip({}), {}) + """Legitimate EventActions data must survive pickle -> safe_loads.""" + + def _round_trip(self, obj): + return safe_loads(pickle.dumps(obj)) + + def test_string_values(self): + original = {"state_delta": {"key": "value"}, "artifact_delta": {}} + self.assertEqual(self._round_trip(original), original) + + def test_nested_dict(self): + original = { + "state_delta": { + "user_prefs": {"theme": "dark", "lang": "en"}, + "counter": 42, + }, + "artifact_delta": {"files": ["a.txt", "b.txt"]}, + } + self.assertEqual(self._round_trip(original), original) + + def test_none_and_bool(self): + original = { + "skip_summarization": True, + "requested_auth_configs": None, + "escalate": False, + } + self.assertEqual(self._round_trip(original), original) + + def test_empty_dict(self): + self.assertEqual(self._round_trip({}), {}) + class TestRealEventActionsRoundTrip(unittest.TestCase): - """Smoke test: real EventActions instances survive pickle -> safe_loads.""" - - def _round_trip(self, obj): - return safe_loads(pickle.dumps(obj)) - - def test_minimal_event_actions(self): - original = EventActions() - result = self._round_trip(original) - self.assertIsInstance(result, EventActions) - self.assertEqual(result.state_delta, {}) - self.assertEqual(result.artifact_delta, {}) - - def test_event_actions_with_state_delta(self): - original = EventActions( - state_delta={"user_name": "alice", "turn_count": 3, "active": True}, - artifact_delta={"report.pdf": 2}, - ) - result = self._round_trip(original) - self.assertIsInstance(result, EventActions) - self.assertEqual(result.state_delta, original.state_delta) - self.assertEqual(result.artifact_delta, original.artifact_delta) - - def test_event_actions_with_transfer_and_escalate(self): - original = EventActions( - transfer_to_agent="specialist_agent", - escalate=True, - skip_summarization=True, - ) - result = self._round_trip(original) - self.assertIsInstance(result, EventActions) - self.assertEqual(result.transfer_to_agent, "specialist_agent") - self.assertTrue(result.escalate) - self.assertTrue(result.skip_summarization) - - def test_event_actions_with_complex_state_values(self): - original = EventActions( - state_delta={ - "nested": {"a": [1, 2, 3], "b": None}, - "count": 42, - "tags": ["ml", "security"], - }, - ) - result = self._round_trip(original) - self.assertIsInstance(result, EventActions) - self.assertEqual(result.state_delta["nested"]["a"], [1, 2, 3]) - self.assertIsNone(result.state_delta["nested"]["b"]) + """Smoke test: real EventActions instances survive pickle -> safe_loads.""" + + def _round_trip(self, obj): + return safe_loads(pickle.dumps(obj)) + + def test_minimal_event_actions(self): + original = EventActions() + result = self._round_trip(original) + self.assertIsInstance(result, EventActions) + self.assertEqual(result.state_delta, {}) + self.assertEqual(result.artifact_delta, {}) + + def test_event_actions_with_state_delta(self): + original = EventActions( + state_delta={"user_name": "alice", "turn_count": 3, "active": True}, + artifact_delta={"report.pdf": 2}, + ) + result = self._round_trip(original) + self.assertIsInstance(result, EventActions) + self.assertEqual(result.state_delta, original.state_delta) + self.assertEqual(result.artifact_delta, original.artifact_delta) + + def test_event_actions_with_transfer_and_escalate(self): + original = EventActions( + transfer_to_agent="specialist_agent", + escalate=True, + skip_summarization=True, + ) + result = self._round_trip(original) + self.assertIsInstance(result, EventActions) + self.assertEqual(result.transfer_to_agent, "specialist_agent") + self.assertTrue(result.escalate) + self.assertTrue(result.skip_summarization) + + def test_event_actions_with_complex_state_values(self): + original = EventActions( + state_delta={ + "nested": {"a": [1, 2, 3], "b": None}, + "count": 42, + "tags": ["ml", "security"], + }, + ) + result = self._round_trip(original) + self.assertIsInstance(result, EventActions) + self.assertEqual(result.state_delta["nested"]["a"], [1, 2, 3]) + self.assertIsNone(result.state_delta["nested"]["b"]) class TestEnvVarFallback(unittest.TestCase): - """ADK_ALLOW_UNSAFE_V0_PICKLE=1 must bypass RestrictedUnpickler.""" - - _ENV_KEY = "ADK_ALLOW_UNSAFE_V0_PICKLE" - _PAYLOAD = _make_global_payload("collections", "Counter") - - def test_blocked_without_env_var(self): - old = os.environ.pop(self._ENV_KEY, None) - try: - with self.assertRaises(pickle.UnpicklingError): - safe_loads(self._PAYLOAD) - finally: - if old is not None: - os.environ[self._ENV_KEY] = old - - def test_allowed_with_env_var(self): - old = os.environ.get(self._ENV_KEY) - try: - os.environ[self._ENV_KEY] = "1" - from collections import Counter - result = safe_loads(self._PAYLOAD) - self.assertIsInstance(result, Counter) - finally: - if old is None: - os.environ.pop(self._ENV_KEY, None) - else: - os.environ[self._ENV_KEY] = old + """ADK_ALLOW_UNSAFE_V0_PICKLE=1 must bypass RestrictedUnpickler.""" + + _ENV_KEY = "ADK_ALLOW_UNSAFE_V0_PICKLE" + _PAYLOAD = _make_global_payload("collections", "Counter") + + def test_blocked_without_env_var(self): + old = os.environ.pop(self._ENV_KEY, None) + try: + with self.assertRaises(pickle.UnpicklingError): + safe_loads(self._PAYLOAD) + finally: + if old is not None: + os.environ[self._ENV_KEY] = old + + def test_allowed_with_env_var(self): + old = os.environ.get(self._ENV_KEY) + try: + os.environ[self._ENV_KEY] = "1" + from collections import Counter + + result = safe_loads(self._PAYLOAD) + self.assertIsInstance(result, Counter) + finally: + if old is None: + os.environ.pop(self._ENV_KEY, None) + else: + os.environ[self._ENV_KEY] = old if __name__ == "__main__": - unittest.main() + unittest.main() From 8098d7648479122941b471a6df202addfd606484 Mon Sep 17 00:00:00 2001 From: Sasha Sobran Date: Mon, 18 May 2026 17:44:46 -0700 Subject: [PATCH 12/94] ADK changes Co-authored-by: Sasha Sobran PiperOrigin-RevId: 917516394 --- .agents/skills/adk-agent-builder/SKILL.md | 51 - .../references/advanced-patterns.md | 303 -- .../references/best-practices.md | 179 - .../references/callbacks-and-plugins.md | 98 - .../references/dynamic-nodes.md | 95 - .../references/function-nodes.md | 320 -- .../references/getting-started.md | 432 -- .../references/human-in-the-loop.md | 279 -- .../references/import-paths.md | 138 - .../references/llm-agent-nodes.md | 454 -- .../references/multi-agent.md | 142 - .../references/parallel-and-fanout.md | 238 - .../references/routing-and-conditions.md | 232 - .../references/session-and-state.md | 101 - .../references/state-and-events.md | 183 - .../adk-agent-builder/references/task-mode.md | 275 -- .../adk-agent-builder/references/testing.md | 344 -- .../references/tool-catalog.md | 177 - .agents/skills/adk-architecture/SKILL.md | 25 - .../architecture/checkpoint-resume.md | 69 - .../references/architecture/context.md | 104 - .../architecture/llm-context-orchestration.md | 42 - .../references/architecture/node-runner.md | 76 - .../references/architecture/observability.md | 164 - .../references/architecture/runner-roles.md | 12 - .../references/interfaces/agent.md | 38 - .../references/interfaces/base-agent.md | 31 - .../references/interfaces/base-node.md | 137 - .../references/interfaces/event.md | 25 - .../references/interfaces/runner.md | 35 - .../references/interfaces/workflow.md | 326 -- .../references/principles/api-principles.md | 42 - .agents/skills/adk-debug/SKILL.md | 367 -- .agents/skills/adk-git/SKILL.md | 90 - .agents/skills/adk-issue-analyze/SKILL.md | 108 - .agents/skills/adk-issue-fix/SKILL.md | 36 - .agents/skills/adk-issue/SKILL.md | 18 - .agents/skills/adk-pr-analyze/SKILL.md | 164 - .../adk-pr-analyze/scripts/triage_pr.py | 270 -- .agents/skills/adk-pr-triage/SKILL.md | 195 - .agents/skills/adk-review/SKILL.md | 76 - .agents/skills/adk-sample-creator/SKILL.md | 148 - .agents/skills/adk-setup/SKILL.md | 84 - .agents/skills/adk-style/SKILL.md | 19 - .../adk-style/references/documentation.md | 12 - .../adk-style/references/file-organization.md | 15 - .../skills/adk-style/references/formatting.md | 20 - .../skills/adk-style/references/imports.md | 29 - .../skills/adk-style/references/logging.md | 16 - .../skills/adk-style/references/pydantic.md | 78 - .../skills/adk-style/references/testing.md | 232 - .agents/skills/adk-style/references/typing.md | 50 - .../skills/adk-style/references/visibility.md | 61 - .github/.release-please-manifest-v1.json | 3 - .github/.release-please-manifest-v2.json | 3 + .github/.release-please-manifest.json | 2 +- ...-v1.json => release-please-config-v2.json} | 3 +- .github/release-please-config.json | 5 +- .../analyze-releases-for-adk-docs-updates.yml | 8 +- .github/workflows/check-file-contents.yml | 48 +- .github/workflows/copybara-pr-handler.yml | 22 +- .github/workflows/discussion_answering.yml | 2 +- .github/workflows/gemini-dispatch.yml | 189 + .github/workflows/gemini-invoke.yml | 104 + .github/workflows/gemini-review.yml | 100 + .github/workflows/issue-analyze.yml | 77 - .github/workflows/issue-fix.yml | 129 - .github/workflows/issue-monitor.yml | 4 +- .github/workflows/pr-analyze.yml | 128 - .github/workflows/pr-triage.yml | 2 +- .github/workflows/pre-commit.yml | 4 +- .github/workflows/python-unit-tests.yml | 19 +- .github/workflows/release-update-adk-web.yaml | 64 - .github/workflows/release-v1-cut.yml | 46 - ...ry-pick.yml => release-v2-cherry-pick.yml} | 14 +- .github/workflows/release-v2-cut.yml | 46 + ...1-finalize.yml => release-v2-finalize.yml} | 32 +- ...se-v1-please.yml => release-v2-please.yml} | 22 +- ...-v1-publish.yml => release-v2-publish.yml} | 26 +- .github/workflows/stale-bot.yml | 20 +- .github/workflows/triage.yml | 2 +- .../upload-adk-docs-to-vertex-ai-search.yml | 2 +- .github/workflows/v2-sync.yml | 59 + .gitignore | 5 - .pre-commit-config.yaml | 8 - AGENTS.md | 612 ++- CHANGELOG-v2.md | 14 - CHANGELOG.md | 142 - CONTRIBUTING.md | 93 +- README.md | 202 +- .../adk_project_overview_and_architecture.md | 9 - .../samples/{a2a => }/a2a_auth/README.md | 0 .../samples/{a2a => }/a2a_auth/__init__.py | 0 .../samples/{a2a => }/a2a_auth/agent.py | 2 + .../remote_a2a/bigquery_agent/__init__.py | 0 .../remote_a2a/bigquery_agent/agent.json | 26 +- .../remote_a2a/bigquery_agent/agent.py | 1 + .../samples/{a2a => }/a2a_basic/README.md | 0 .../samples/{a2a => }/a2a_basic/__init__.py | 0 .../samples/{a2a => }/a2a_basic/agent.py | 1 + .../remote_a2a/check_prime_agent/__init__.py | 0 .../remote_a2a/check_prime_agent/agent.json | 15 +- .../remote_a2a/check_prime_agent/agent.py | 1 + .../{a2a => }/a2a_human_in_loop/README.md | 0 .../{a2a => }/a2a_human_in_loop/__init__.py | 0 .../{a2a => }/a2a_human_in_loop/agent.py | 1 + .../remote_a2a/human_in_loop/__init__.py | 0 .../remote_a2a/human_in_loop/agent.json | 26 +- .../remote_a2a}/human_in_loop/agent.py | 1 + .../samples/{a2a => }/a2a_root/README.md | 0 .../samples/{a2a => }/a2a_root/agent.py | 0 .../remote_a2a/hello_world/__init__.py | 0 .../a2a_root/remote_a2a/hello_world/agent.py | 1 + .../adk_answering_agent/README.md | 0 .../adk_answering_agent/__init__.py | 0 .../adk_answering_agent/agent.py | 2 +- .../gemini_assistant/__init__.py | 0 .../gemini_assistant/agent.py | 2 +- .../adk_answering_agent/main.py | 0 .../adk_answering_agent/settings.py | 0 .../adk_answering_agent/tools.py | 0 .../upload_docs_to_vertex_ai_search.py | 0 .../adk_answering_agent/utils.py | 0 .../adk_documentation/__init__.py | 0 .../adk_docs_updater/__init__.py | 0 .../adk_docs_updater/agent.py | 2 +- .../adk_docs_updater/main.py | 0 .../adk_release_analyzer/README.md | 0 .../adk_release_analyzer/__init__.py | 0 .../adk_release_analyzer/agent.py | 0 .../adk_release_analyzer/main.py | 0 .../adk_documentation/settings.py | 0 .../{adk_team => }/adk_documentation/tools.py | 0 .../{adk_team => }/adk_documentation/utils.py | 0 .../adk_issue_formatting_agent/__init__.py | 0 .../adk_issue_formatting_agent/agent.py | 2 +- .../adk_issue_formatting_agent/settings.py | 0 .../adk_issue_formatting_agent/utils.py | 0 .../PROMPT_INSTRUCTION.txt | 0 .../adk_issue_monitoring_agent/README.md | 0 .../adk_issue_monitoring_agent/__init__.py | 0 .../adk_issue_monitoring_agent/agent.py | 0 .../adk_issue_monitoring_agent/main.py | 0 .../adk_issue_monitoring_agent/settings.py | 0 .../adk_issue_monitoring_agent/utils.py | 0 .../adk_knowledge_agent/README.md | 0 .../adk_knowledge_agent/__init__.py | 0 .../adk_knowledge_agent/agent.json | 16 +- .../adk_knowledge_agent/agent.py | 1 + .../adk_knowledge_agent/requirements.txt | 0 .../{adk_team => }/adk_pr_agent/__init__.py | 0 .../{adk_team => }/adk_pr_agent/agent.py | 1 + .../{adk_team => }/adk_pr_agent/main.py | 0 .../adk_pr_triaging_agent/README.md | 0 .../adk_pr_triaging_agent/__init__.py | 0 .../adk_pr_triaging_agent/agent.py | 4 +- .../adk_pr_triaging_agent/main.py | 0 .../adk_pr_triaging_agent/settings.py | 0 .../adk_pr_triaging_agent/utils.py | 0 .../adk_stale_agent/PROMPT_INSTRUCTION.txt | 0 .../{adk_team => }/adk_stale_agent/README.md | 0 .../adk_stale_agent/__init__.py | 0 .../{adk_team => }/adk_stale_agent/agent.py | 0 .../{adk_team => }/adk_stale_agent/main.py | 0 .../adk_stale_agent/settings.py | 0 .../{adk_team => }/adk_stale_agent/utils.py | 0 .../adk_triaging_agent/README.md | 0 .../adk_triaging_agent/__init__.py | 0 .../adk_triaging_agent/agent.py | 12 +- .../{adk_team => }/adk_triaging_agent/main.py | 0 .../adk_triaging_agent/settings.py | 0 .../adk_triaging_agent/utils.py | 0 .../agent_engine_code_execution/README | 0 .../agent_engine_code_execution/__init__.py | 0 .../agent_engine_code_execution/agent.py | 1 + .../agent_registry_agent/README.md | 0 .../__init__.py | 0 .../agent_registry_agent/agent.py | 0 .../__init__.py | 0 .../agent.py | 0 .../api_registry_agent/README.md | 0 .../__init__.py | 0 .../api_registry_agent/agent.py | 1 + .../application_integration_agent/README.md | 0 .../__init__.py | 0 .../application_integration_agent/agent.py | 1 + .../memory => artifact_save_text}/__init__.py | 0 .../samples/artifact_save_text/agent.py | 45 + .../authn-adk-all-in-one/README.md | 0 .../agent_openapi_tools}/__init__.py | 0 .../adk_agents/agent_openapi_tools/agent.py | 0 .../agent_openapi_tools/openapi.yaml | 0 .../adk_agents/requirements.txt | 0 .../adk_agents/sample.env | 0 .../doc_images/adk-auth-all-in-one.svg | 0 .../doc_images/jwks_updated.png | Bin .../doc_images/jwksgen.png | Bin .../hotel_booker_app/hotelbooker_core.py | 0 .../hotel_booker_app/main.py | 0 .../hotel_booker_app/openapi.yaml | 0 .../authn-adk-all-in-one/idp/app.py | 0 .../authn-adk-all-in-one/idp/sample.env | 0 .../authn-adk-all-in-one/idp/sample.jwks.json | 5 + .../idp/templates/admin.html | 0 .../idp/templates/consent.html | 0 .../idp/templates/login.html | 0 .../authn-adk-all-in-one/requirements.txt | 3 +- .../{integrations => }/bigquery/README.md | 0 .../__init__.py | 0 .../{integrations => }/bigquery/agent.py | 1 + .../{integrations => }/bigquery_mcp/README.md | 0 .../{core/abort => bigquery_mcp}/__init__.py | 0 .../{integrations => }/bigquery_mcp/agent.py | 1 + .../{integrations => }/bigtable/README.md | 0 .../{core/artifacts => bigtable}/__init__.py | 0 .../{integrations => }/bigtable/agent.py | 1 + .../built_in_multi_tools/README.md | 0 .../__init__.py | 0 .../{tools => }/built_in_multi_tools/agent.py | 0 contributing/samples/cache_analysis/README.md | 116 + .../cache_analysis/__init__.py | 0 .../cache_analysis/agent.py | 1 + .../cache_analysis/run_cache_experiments.py | 0 .../cache_analysis/utils.py | 0 .../hello_world => callbacks}/__init__.py | 0 contributing/samples/callbacks/agent.py | 198 + .../history_management => callbacks}/main.py | 0 .../logprobs => code_execution}/__init__.py | 0 .../{code_execution => }/agent.py | 1 + .../{code_execution => }/gke_sandbox_agent.py | 1 + .../{multimodal => }/computer_use/README.md | 0 .../{multimodal => }/computer_use/agent.py | 0 .../computer_use/playwright.py | 0 .../computer_use/requirements.txt | 0 .../cache_analysis/README.md | 131 - .../session_state_agent/input.json | 6 - .../README.md | 0 .../__init__.py | 0 .../context_offloading_with_artifact/agent.py | 1 + contributing/samples/core/abort/README.md | 91 - contributing/samples/core/abort/agent.py | 70 - contributing/samples/core/app/README.md | 91 - contributing/samples/core/app/agent.py | 76 - .../samples/core/app/tests/hello.json | 37 - .../samples/core/app/tests/help_trip.json | 37 - .../samples/core/app/tests/who_are_you.json | 37 - contributing/samples/core/artifacts/README.md | 54 - contributing/samples/core/artifacts/agent.py | 217 - contributing/samples/core/callbacks/README.md | 114 - contributing/samples/core/callbacks/agent.py | 118 - .../samples/core/callbacks/tests/hi.json | 36 - .../callbacks/tests/weather_in_london.json | 89 - .../callbacks/tests/weather_in_sunnyvale.json | 89 - .../samples/core/empty_agent/README.md | 30 - .../samples/core/empty_agent/agent.py | 21 - .../samples/core/empty_agent/tests/go.json | 37 - .../samples/core/empty_agent/tests/hello.json | 37 - .../core/empty_agent/tests/how_are_you.json | 37 - .../samples/core/hello_world/README.md | 91 - .../core/hello_world/tests/check_prime.json | 86 - .../hello_world/tests/roll_and_check.json | 138 - .../core/hello_world/tests/roll_die.json | 95 - .../core/input_output_schema/README.md | 54 - .../samples/core/input_output_schema/agent.py | 53 - .../tests/weather_cupertino.json | 106 - .../tests/weather_sanjose.json | 106 - .../tests/weather_tokyo.json | 106 - contributing/samples/core/logprobs/README.md | 78 - .../samples/core/logprobs/tests/hello.json | 40 - .../core/logprobs/tests/tell_joke.json | 40 - .../core/logprobs/tests/what_is_ai.json | 40 - .../samples/core/quickstart/README.md | 81 - .../core/quickstart/tests/time_ny.json | 84 - .../core/quickstart/tests/weather_ny.json | 84 - .../quickstart/tests/weather_time_ny.json | 103 - .../tests/stock_googl.json | 83 - .../tests/stock_nvda.json | 83 - .../tests/weather_sf.json | 90 - .../{config => }/core_basic_config/README.md | 0 .../core_basic_config/root_agent.yaml | 0 .../core_callback_config/__init__.py | 0 .../core_callback_config/callbacks.py | 14 - .../core_callback_config/root_agent.yaml | 0 .../core_callback_config/tools.py | 14 - .../core_custom_agent_config/__init__.py | 0 .../core_custom_agent_config/my_agents.py | 0 .../core_custom_agent_config/root_agent.yaml | 0 .../root_agent.yaml | 0 .../crewai_tool_kwargs/README.md | 0 .../__init__.py | 0 .../crewai_tool_kwargs/agent.py | 1 + .../crewai_tool_kwargs/main.py | 0 .../custom_code_execution/README.md | 0 .../__init__.py | 0 .../custom_code_execution/agent.py | 1 + .../{integrations => }/data_agent/README.md | 0 .../skills_agent => data_agent}/__init__.py | 0 .../{integrations => }/data_agent/agent.py | 61 +- .../environment_and_skills/skills/README.md | 115 - .../environment_and_skills/skills/__init__.py | 17 - .../environment_and_skills/skills/agent.py | 108 - .../skills/skills/weather-skill/SKILL.md | 12 - .../skills/tests/current_humidity.json | 201 - .../skills/tests/current_weather.json | 196 - .../skills/tests/support_hours.json | 242 - .../skills/tests/wind_speed.json | 193 - .../weather-skill/references/weather_info.md | 6 - .../weather-skill/scripts/get_humidity.py | 29 - .../__init__.py | 0 .../samples/fields_output_schema/agent.py | 60 + .../__init__.py | 0 .../{patterns => }/fields_planner/agent.py | 0 .../{patterns => }/fields_planner/main.py | 0 .../files_retrieval_agent/README.md | 0 .../__init__.py | 0 .../files_retrieval_agent/agent.py | 1 + .../data/adk_overview.txt | 0 .../data/tools_guide.txt | 0 .../{integrations => }/gcp_auth/README.md | 0 .../{integrations => }/gcp_auth/agent.py | 0 .../gcp_auth/client/index.html | 0 .../gcp_auth/client/main.py | 0 .../gcp_auth/client/requirements.txt | 0 .../__init__.py | 0 .../gcp_skill_registry_agent/agent.py | 0 .../__init__.py | 0 .../{multimodal => }/generate_image/agent.py | 1 + .../generate_image/sample.session.json | 0 .../samples/{integrations => }/gepa/README.md | 0 .../__init__.py | 0 .../{integrations => }/gepa/adk_agent.py | 0 .../{integrations => }/gepa/adk_agent_test.py | 0 .../{integrations => }/gepa/experiment.py | 0 .../gepa/gepa_tau_bench.ipynb | 0 .../{integrations => }/gepa/gepa_utils.py | 0 .../{integrations => }/gepa/rater_lib.py | 0 .../gepa/rubric_validation_template.txt | 0 .../{integrations => }/gepa/run_experiment.py | 0 .../gepa/tau_bench_agent.py | 0 .../gepa/voter_agent/eval_prompts.txt | 0 .../gepa/voter_agent/gepa.ipynb | 0 .../gepa/voter_agent/optimized_prompt.txt | 0 .../gepa/voter_agent/prompts.txt | 0 .../rubric_validation_template.txt | 0 .../gepa/voter_agent/tools.py | 0 .../gke_agent_sandbox/deployment_rbac.yaml | 0 .../{integrations => }/google_api/README.md | 0 .../__init__.py | 0 .../{integrations => }/google_api/agent.py | 1 + .../__init__.py | 0 .../google_search_agent/agent.py | 1 + .../__init__.py | 0 .../samples/{core => }/hello_world/agent.py | 1 + contributing/samples/hello_world/main.py | 111 + .../__init__.py | 0 .../hello_world_anthropic/agent.py | 0 .../hello_world_anthropic/main.py | 0 .../hello_world_apigeellm/.env-sample | 0 .../hello_world_apigeellm/README.md | 0 .../hello_world_apigeellm/agent.py | 0 .../hello_world_apigeellm/main.py | 0 .../bigquery => hello_world_app}/__init__.py | 0 contributing/samples/hello_world_app/agent.py | 160 + contributing/samples/hello_world_app/main.py | 103 + .../__init__.py | 0 .../{models => }/hello_world_gemma/agent.py | 0 .../{models => }/hello_world_gemma/main.py | 0 .../__init__.py | 0 .../hello_world_gemma3_ollama/agent.py | 0 .../hello_world_gemma3_ollama/main.py | 0 .../__init__.py | 0 .../{models => }/hello_world_litellm/agent.py | 0 .../{models => }/hello_world_litellm/main.py | 0 .../__init__.py | 0 .../agent.py | 0 .../main.py | 0 .../__init__.py | 0 .../{multi_agent => }/hello_world_ma/agent.py | 4 +- .../{models => }/hello_world_ollama/README.md | 0 .../__init__.py | 0 .../{models => }/hello_world_ollama/agent.py | 0 .../{models => }/hello_world_ollama/main.py | 0 .../__init__.py | 0 .../hello_world_stream_fc_args/agent.py | 0 .../__init__.py | 0 .../history_management/agent.py | 1 + .../samples/history_management/main.py | 80 + .../tests/auto_reimburse_coffee.json | 84 - .../human_in_loop/tests/reimburse_dinner.json | 88 - .../samples/hitl/request_input_tool/README.md | 49 - .../samples/hitl/request_input_tool/agent.py | 62 - .../tests/create_support_ticket.json | 159 - .../samples/hitl/tool_confirmation/README.md | 64 - .../samples/hitl/tool_confirmation/agent.py | 57 - ...Transfer_500_and_close_account_ACC123.json | 276 -- .../tests/close_account_acc123.json | 171 - .../tests/transfer_200_confirmed.json | 189 - .../tests/transfer_200_declined.json | 189 - .../tool_confirmation/tests/transfer_50.json | 84 - .../{hitl => }/human_in_loop/README.md | 0 .../__init__.py | 0 .../remote_a2a => }/human_in_loop/agent.py | 1 + .../samples/{hitl => }/human_in_loop/main.py | 0 .../__init__.py | 0 .../human_tool_confirmation/agent.py | 1 + .../integration_connector_euc_agent/README.md | 0 .../__init__.py | 0 .../integration_connector_euc_agent/agent.py | 1 + .../authn-adk-all-in-one/idp/sample.jwks.json | 5 - .../{models => }/interactions_api/README.md | 0 .../{models => }/interactions_api/__init__.py | 0 .../{models => }/interactions_api/agent.py | 23 +- .../{models => }/interactions_api/main.py | 56 +- .../{integrations => }/jira_agent/README.md | 0 .../__init__.py | 0 .../{integrations => }/jira_agent/agent.py | 1 + .../jira_agent/image-app-intg-editor.png | Bin .../image-application-integration.png | Bin .../jira_agent/image-connection-tool.png | Bin .../{integrations => }/jira_agent/tools.py | 0 .../json_passing_agent/README.md | 0 .../__init__.py | 0 .../json_passing_agent/agent.py | 2 + .../{patterns => }/json_passing_agent/main.py | 0 .../__init__.py | 0 .../langchain_structured_tool_agent/agent.py | 1 + .../langchain_youtube_search_agent/README.md | 0 .../__init__.py | 0 .../langchain_youtube_search_agent/agent.py | 1 + .../requirements.txt | 0 .../__init__.py | 0 .../litellm_inline_tool_call/agent.py | 0 .../__init__.py | 0 .../{models => }/litellm_streaming/agent.py | 0 .../{models => }/litellm_streaming/main.py | 0 .../__init__.py | 0 .../litellm_structured_output/agent.py | 0 .../litellm_with_fallback_models/README.md | 0 .../__init__.py | 0 .../litellm_with_fallback_models/agent.py | 0 .../check_prime_11.wav | Bin .../check_prime_15.wav | Bin .../live_agent_example.py | 0 .../live_agent_api_server_example/readme.md | 0 .../live_bidi_debug_utils/pcm_audio_player.py | 0 .../__init__.py | 0 .../live_bidi_streaming_multi_agent/agent.py | 0 .../live_bidi_streaming_multi_agent/readme.md | 0 .../README.md | 0 .../__init__.py | 0 .../agent.py | 0 .../__init__.py | 0 .../live_bidi_streaming_single_agent/agent.py | 0 .../readme.md | 0 .../__init__.py | 0 .../live_bidi_streaming_tools_agent/agent.py | 1 + .../live_bidi_streaming_tools_agent/readme.md | 0 .../__init__.py | 0 .../live_tool_callbacks_agent/agent.py | 0 .../live_tool_callbacks_agent/readme.md | 0 .../local_environment/README.md | 0 .../__init__.py | 0 .../local_environment/agent.py | 0 .../local_environment_skill/README.md | 0 .../__init__.py | 0 .../local_environment_skill/agent.py | 0 .../skills/weather-skill/SKILL.md | 0 .../weather-skill/references/weather_info.md | 0 .../weather-skill/scripts/get_humidity.py | 0 contributing/samples/logprobs/README.md | 62 + .../__init__.py | 0 .../samples/{core => }/logprobs/agent.py | 31 +- .../__init__.py | 0 .../{models => }/manual_ollama_test/agent.py | 0 .../mcp_dynamic_header_agent/README.md | 0 .../__init__.py | 0 .../mcp_dynamic_header_agent/agent.py | 1 + .../mcp_dynamic_header_agent/header_server.py | 0 .../mcp_in_agent_tool_remote/README.md | 0 .../__init__.py | 0 .../mcp_in_agent_tool_remote/agent.py | 2 + .../mcp_in_agent_tool_stdio/README.md | 0 .../__init__.py | 0 .../mcp_in_agent_tool_stdio/agent.py | 2 + .../{mcp => }/mcp_postgres_agent/README.md | 0 .../__init__.py | 0 .../{mcp => }/mcp_postgres_agent/agent.py | 1 + .../__init__.py | 0 .../mcp_progress_callback_agent/agent.py | 1 + .../mock_progress_server.py | 0 .../mcp_server_side_sampling/README.md | 2 +- .../__init__.py | 0 .../mcp_server_side_sampling/agent.py | 0 .../mcp_server_side_sampling/mcp_server.py | 0 .../mcp_service_account_agent/README.md | 0 .../__init__.py | 0 .../mcp_service_account_agent/agent.py | 1 + .../samples/{mcp => }/mcp_sse_agent/README.md | 0 .../__init__.py | 0 .../samples/{mcp => }/mcp_sse_agent/agent.py | 1 + .../mcp_sse_agent/filesystem_server.py | 0 .../mcp_stdio_notion_agent/README.md | 0 .../__init__.py | 0 .../{mcp => }/mcp_stdio_notion_agent/agent.py | 1 + .../__init__.py | 0 .../{mcp => }/mcp_stdio_server_agent/agent.py | 1 + .../mcp_streamablehttp_agent/README.md | 0 .../__init__.py | 0 .../mcp_streamablehttp_agent/agent.py | 1 + .../filesystem_server.py | 0 .../{mcp => }/mcp_toolset_auth/README.md | 0 .../__init__.py | 0 .../{mcp => }/mcp_toolset_auth/agent.py | 1 + .../{mcp => }/mcp_toolset_auth/main.py | 0 .../mcp_toolset_auth/oauth_mcp_server.py | 0 .../__init__.py | 0 .../{context_management => }/memory/agent.py | 1 + .../{context_management => }/memory/main.py | 0 .../migrate_session_db/README.md | 0 .../__init__.py | 0 .../migrate_session_db/agent.py | 1 + .../migrate_session_db/dnd_sessions.db | Bin .../migrate_session_db/main.py | 0 .../sample-output/alembic.ini | 0 .../sample-output/alembic/README | 0 .../sample-output/alembic/env.py | 0 .../sample-output/alembic/script.py.mako | 0 .../migrate_session_db/sessions.db | Bin .../litellm_inline_tool_call/__init__.py | 17 - .../tests/roll_die_and_check_prime.json | 296 -- .../single_turn_sub_agent/README.md | 52 - .../single_turn_sub_agent/agent.py | 81 - .../tests/gaming_1000.json | 440 -- .../tests/gaming_1000_large.json | 359 -- .../single_turn_sub_agent/tests/go.json | 383 -- .../samples/multi_agent/sub_agents/README.md | 72 - .../samples/multi_agent/sub_agents/agent.py | 64 - .../sub_agents/tests/check_and_close.json | 315 -- .../sub_agents/tests/check_status.json | 132 - .../multi_agent/task_sub_agent/README.md | 52 - .../multi_agent/task_sub_agent/agent.py | 83 - .../task_sub_agent/tests/10_burgers.json | 224 - .../task_sub_agent/tests/3_burgers.json | 410 -- .../tests/3_burgers_and_credit_card.json | 92 - .../task_sub_agent/tests/credit_card.json | 96 - .../task_sub_agent/tests/order_food.json | 198 - .../three_layer_transfer/README.md | 29 - .../multi_agent/three_layer_transfer/agent.py | 56 - .../multi_agent_basic_config/README.md | 0 .../code_tutor_agent.yaml | 0 .../math_tutor_agent.yaml | 0 .../multi_agent_basic_config/root_agent.yaml | 0 .../multi_agent_llm_config/README.md | 0 .../multi_agent_llm_config/__init__.py | 14 - .../multi_agent_llm_config/prime_agent.yaml | 0 .../multi_agent_llm_config/roll_agent.yaml | 0 .../multi_agent_llm_config/root_agent.yaml | 0 .../multi_agent_loop_config/README.md | 0 .../multi_agent_loop_config/loop_agent.yaml | 0 .../multi_agent_loop_config/root_agent.yaml | 0 .../writer_agents/critic_agent.yaml | 0 .../writer_agents/initial_writer_agent.yaml | 0 .../writer_agents/refiner_agent.yaml | 0 .../multi_agent_seq_config/README.md | 0 .../multi_agent_seq_config/root_agent.yaml | 0 .../sub_agents/code_refactorer_agent.yaml | 0 .../sub_agents/code_reviewer_agent.yaml | 0 .../sub_agents/code_writer_agent.yaml | 0 .../samples/multimodal/multimodal/README.md | 30 - .../samples/multimodal/multimodal/agent.py | 20 - .../__init__.py | 0 .../multimodal_tool_results/agent.py | 1 + .../__init__.py | 0 .../non_llm_sequential/agent.py | 2 + .../oauth2_client_credentials/README.md | 0 .../__init__.py | 0 .../oauth2_client_credentials/agent.py | 0 .../oauth2_client_credentials/main.py | 0 .../oauth2_test_server.py | 0 .../oauth_calendar_agent/README.md | 0 .../__init__.py | 0 .../oauth_calendar_agent/agent.py | 1 + .../output_schema_with_tools/README.md | 0 .../__init__.py | 0 .../output_schema_with_tools/agent.py | 1 + .../{tools => }/parallel_functions/README.md | 0 .../__init__.py | 0 .../{tools => }/parallel_functions/agent.py | 8 +- .../{plugin => }/plugin_basic/README.md | 0 .../{plugin => }/plugin_basic/__init__.py | 0 .../{plugin => }/plugin_basic/count_plugin.py | 0 .../samples/{plugin => }/plugin_basic/main.py | 1 + .../__init__.py | 0 .../plugin_debug_logging/agent.py | 1 + .../plugin_reflect_tool_retry/README.md | 0 .../basic}/__init__.py | 0 .../plugin_reflect_tool_retry/basic/agent.py | 1 + .../hallucinating_func_name}/__init__.py | 0 .../hallucinating_func_name/agent.py | 1 + .../postgres_session_service/README.md | 0 .../__init__.py | 0 .../postgres_session_service/agent.py | 1 + .../postgres_session_service/compose.yml | 0 .../postgres_session_service/main.py | 0 .../{integrations => }/pubsub/README.md | 0 .../manual_ollama_test => pubsub}/__init__.py | 0 .../{integrations => }/pubsub/agent.py | 1 + .../{tools => }/pydantic_argument/README.md | 0 .../__init__.py | 0 .../{tools => }/pydantic_argument/agent.py | 0 .../{tools => }/pydantic_argument/main.py | 0 .../sub_agents => quickstart}/__init__.py | 0 .../samples/{core => }/quickstart/agent.py | 10 +- .../__init__.py | 0 .../{integrations => }/rag_agent/agent.py | 1 + .../__init__.py | 0 .../rewind_session/agent.py | 1 + .../rewind_session/main.py | 0 .../{core => }/runner_debug_example/README.md | 4 +- .../runner_debug_example/__init__.py | 0 .../{core => }/runner_debug_example/agent.py | 71 +- .../{core => }/runner_debug_example/main.py | 17 +- .../__init__.py | 0 .../sandbox_computer_use/agent.py | 7 - .../sandbox_computer_use/main.py | 3 - .../session_state_agent/README.md | 0 .../__init__.py | 0 .../session_state_agent/agent.py | 0 .../samples/session_state_agent/input.json | 4 + .../__init__.py | 0 .../simple_sequential_agent/agent.py | 2 + .../__init__.py | 0 .../skills_agent/agent.py | 1 + .../skills/weather-skill/SKILL.md | 0 .../weather-skill/references/weather_info.md | 0 .../weather-skill/scripts/get_humidity.py | 0 .../__init__.py | 0 .../skills_agent_gcs/agent.py | 0 .../{integrations => }/slack_agent/agent.py | 0 .../{integrations => }/spanner/README.md | 0 .../workflow_triage => spanner}/__init__.py | 0 .../{integrations => }/spanner/agent.py | 1 + .../spanner_admin/README.md | 0 .../__init__.py | 0 .../{integrations => }/spanner_admin/agent.py | 1 + .../spanner_rag_agent/README.md | 0 .../Spanner_RAG_Sample_Agent.png | Bin .../basic => spanner_rag_agent}/__init__.py | 0 .../spanner_rag_agent/agent.py | 1 + .../static_instruction/README.md | 0 .../static_instruction/__init__.py | 0 .../static_instruction/agent.py | 1 + .../static_instruction/main.py | 0 .../static_non_text_content/README.md | 0 .../static_non_text_content/__init__.py | 0 .../static_non_text_content/agent.py | 1 + .../static_non_text_content/main.py | 0 .../gepa => sub_agents_config}/__init__.py | 0 .../sub_agents_config/life_agent.py | 0 .../sub_agents_config/root_agent.yaml | 0 .../sub_agents_config/work_agent.yaml | 0 contributing/samples/telemetry/agent.py | 110 + contributing/samples/telemetry/main.py | 118 + .../__init__.py | 0 contributing/samples/token_usage/agent.py | 97 + contributing/samples/token_usage/main.py | 102 + .../tool_agent_tool_config/root_agent.yaml | 0 .../summarizer_agent.yaml | 0 .../web_search_agent.yaml | 0 .../tool_builtin_config/root_agent.yaml | 0 .../__init__.py | 0 .../tool_functions_config/root_agent.yaml | 0 .../tool_functions_config/tools.py | 0 .../tool_human_in_the_loop_config/README.md | 0 .../__init__.py | 0 .../root_agent.yaml | 0 .../tool_human_in_the_loop_config/tools.py | 0 .../tool_mcp_stdio_notion_config/README.md | 0 .../root_agent.yaml | 0 .../toolbox_agent/README.md | 0 .../__init__.py | 0 .../{integrations => }/toolbox_agent/agent.py | 1 + .../toolbox_agent/tool_box.db | Bin .../toolbox_agent/tools.yaml | 0 .../samples/tools/function_tools/README.md | 52 - .../samples/tools/function_tools/agent.py | 58 - .../function_tools/tests/a_random_number.json | 81 - .../tests/a_random_number_and_check_even.json | 127 - .../tests/random_number_and_is_5_even.json | 99 - .../tools/long_running_functions/README.md | 60 - .../tools/long_running_functions/__init__.py | 15 - .../tools/long_running_functions/agent.py | 44 - .../tests/export_to_csv.json | 127 - .../tests/export_to_csv_and_json.json | 226 - .../output_schema_with_tools/__init__.py | 15 - .../tools/parallel_functions/__init__.py | 15 - .../tests/test_all_tools.json | 196 - .../tests/test_parallel_mixed.json | 128 - .../tests/test_parallel_weather.json | 129 - .../tools/pydantic_argument/__init__.py | 15 - .../tests/test_create_company.json | 96 - .../tests/test_create_user.json | 104 - .../tests/test_create_user_with_prefs.json | 107 - .../vertex_code_execution/README.md | 0 .../__init__.py | 0 .../vertex_code_execution/agent.py | 1 + .../workflow_agent_seq/README.md | 0 .../__init__.py | 0 .../workflow_agent_seq/agent.py | 3 + .../workflow_agent_seq/main.py | 0 .../workflow_agent_seq/sample.output | 0 .../{patterns => }/workflow_triage/README.md | 0 .../__init__.py | 0 .../{patterns => }/workflow_triage/agent.py | 1 + .../workflow_triage/execution_agent.py | 3 + .../samples/workflows/auth_api_key/README.md | 111 - .../samples/workflows/auth_api_key/agent.py | 83 - .../workflows/auth_api_key/tests/go.json | 120 - .../samples/workflows/auth_oauth/README.md | 112 - .../samples/workflows/auth_oauth/__init__.py | 15 - .../samples/workflows/auth_oauth/agent.py | 135 - .../dynamic_fan_out_fan_in/README.md | 61 - .../workflows/dynamic_fan_out_fan_in/agent.py | 69 - .../samples/workflows/dynamic_nodes/README.md | 59 - .../samples/workflows/dynamic_nodes/agent.py | 78 - .../workflows/dynamic_nodes/tests/flower.json | 159 - .../workflows/fan_out_fan_in/README.md | 59 - .../samples/workflows/fan_out_fan_in/agent.py | 55 - .../workflows/fan_out_fan_in/tests/go.json | 99 - contributing/samples/workflows/loop/README.md | 46 - contributing/samples/workflows/loop/agent.py | 80 - .../workflows/loop/tests/computer.json | 94 - .../samples/workflows/loop/tests/flower.json | 168 - .../samples/workflows/loop_config/README.md | 48 - .../samples/workflows/loop_config/agent.py | 43 - .../loop_config/evaluate_headline.yaml | 6 - .../loop_config/generate_headline.yaml | 6 - .../workflows/loop_config/root_agent.yaml | 10 - .../samples/workflows/loop_self/README.md | 44 - .../samples/workflows/loop_self/agent.py | 45 - .../samples/workflows/loop_self/tests/3.json | 191 - .../samples/workflows/message/README.md | 81 - .../samples/workflows/message/agent.py | 104 - .../samples/workflows/message/tests/go.json | 146 - .../workflows/multi_triggers/README.md | 53 - .../samples/workflows/multi_triggers/agent.py | 45 - .../workflows/multi_triggers/tests/go.json | 118 - .../workflows/nested_workflow/README.md | 64 - .../workflows/nested_workflow/__init__.py | 15 - .../workflows/nested_workflow/agent.py | 94 - .../workflows/nested_workflow/tests/1984.json | 139 - .../samples/workflows/node_output/README.md | 66 - .../samples/workflows/node_output/agent.py | 73 - .../workflows/node_output/tests/go.json | 86 - .../workflows/parallel_worker/README.md | 69 - .../workflows/parallel_worker/agent.py | 81 - .../parallel_worker/tests/flower.json | 225 - .../samples/workflows/request_input/README.md | 66 - .../samples/workflows/request_input/agent.py | 84 - .../request_input/tests/phone_broke.json | 236 - .../tests/phone_broke_reject.json | 136 - .../request_input_advanced/README.md | 76 - .../workflows/request_input_advanced/agent.py | 87 - .../tests/2_sick_days.json | 156 - .../workflows/request_input_rerun/README.md | 86 - .../workflows/request_input_rerun/agent.py | 81 - .../tests/phone_broke.json | 236 - .../samples/workflows/retry/README.md | 43 - contributing/samples/workflows/retry/agent.py | 49 - .../samples/workflows/retry/tests/go.json | 131 - .../samples/workflows/route/README.md | 43 - contributing/samples/workflows/route/agent.py | 77 - .../workflows/route/tests/who_are_you.json | 106 - .../samples/workflows/sequence/README.md | 39 - .../samples/workflows/sequence/__init__.py | 15 - .../samples/workflows/sequence/agent.py | 35 - .../samples/workflows/sequence/tests/go.json | 71 - .../samples/workflows/state/README.md | 60 - contributing/samples/workflows/state/agent.py | 57 - .../samples/workflows/state/tests/go.json | 91 - .../samples/workflows/use_as_output/README.md | 55 - .../samples/workflows/use_as_output/agent.py | 41 - .../workflows/use_as_output/tests/go.json | 63 - docs/design/cli/api_server/abort.md | 120 - docs/guides/cli/api_server/abort.md | 108 - pyproject.toml | 210 +- scripts/check_new_py_files.sh | 23 - scripts/db_migration.sh | 14 - scripts/generate_agent_config_schema.py | 67 - scripts/run_antigravity.py | 290 -- scripts/unittests.sh | 143 + src/google/adk/__init__.py | 4 +- src/google/adk/a2a/agent/__init__.py | 26 +- .../adk/a2a/converters/part_converter.py | 107 +- src/google/adk/a2a/converters/to_adk_event.py | 49 +- .../adk/a2a/utils/agent_card_builder.py | 88 +- src/google/adk/a2a/utils/agent_to_a2a.py | 30 +- src/google/adk/agents/__init__.py | 29 +- src/google/adk/agents/agent_config.py | 2 - src/google/adk/agents/base_agent.py | 52 +- src/google/adk/agents/base_agent_config.py | 4 - src/google/adk/agents/common_configs.py | 39 +- src/google/adk/agents/config_agent_utils.py | 40 +- .../agents/config_schemas/AgentConfig.json | 2247 ++------- src/google/adk/agents/context.py | 511 +- src/google/adk/agents/invocation_context.py | 99 +- src/google/adk/agents/llm/__init__.py | 13 - src/google/adk/agents/llm/task/__init__.py | 13 - .../adk/agents/llm/task/_finish_task_tool.py | 185 - .../adk/agents/llm/task/_task_models.py | 119 - src/google/adk/agents/llm_agent.py | 131 +- src/google/adk/agents/llm_agent_config.py | 36 +- src/google/adk/agents/loop_agent.py | 15 +- src/google/adk/agents/loop_agent_config.py | 4 - src/google/adk/agents/parallel_agent.py | 15 +- .../adk/agents/parallel_agent_config.py | 4 - src/google/adk/agents/remote_a2a_agent.py | 24 +- src/google/adk/agents/run_config.py | 3 - src/google/adk/agents/sequential_agent.py | 18 +- .../adk/agents/sequential_agent_config.py | 5 - src/google/adk/apps/app.py | 39 +- src/google/adk/apps/compaction.py | 25 +- src/google/adk/apps/llm_event_summarizer.py | 54 +- src/google/adk/auth/auth_preprocessor.py | 4 +- src/google/adk/auth/auth_schemes.py | 4 +- src/google/adk/auth/oauth2_credential_util.py | 6 +- src/google/adk/cli/adk_web_server.py | 2199 ++++++++- src/google/adk/cli/agent_graph.py | 49 +- src/google/adk/cli/agent_test_runner.py | 900 ---- src/google/adk/cli/api_server.py | 1708 ------- src/google/adk/cli/browser/chunk-257HQBMN.js | 132 - src/google/adk/cli/browser/chunk-27SWUPRL.js | 261 - src/google/adk/cli/browser/chunk-2DLZXFEQ.js | 1 - src/google/adk/cli/browser/chunk-2LZ42ZOW.js | 1 - .../{chunk-DM36II44.js => chunk-2MVVEOIQ.js} | 2 +- .../{chunk-Q6H4XMU7.js => chunk-2VKC3BHH.js} | 2 +- src/google/adk/cli/browser/chunk-3NJNOY56.js | 1 - src/google/adk/cli/browser/chunk-3YZ77ADE.js | 36 - src/google/adk/cli/browser/chunk-46YSBSFN.js | 1 - src/google/adk/cli/browser/chunk-4R6SYGKS.js | 1 - .../{chunk-Y7O3NHKW.js => chunk-4S2CIXCW.js} | 2 +- src/google/adk/cli/browser/chunk-5PR7OWPD.js | 43 - .../{chunk-R6ZR5LUR.js => chunk-5VJ6OSLK.js} | 2 +- src/google/adk/cli/browser/chunk-6UL33SIT.js | 89 - src/google/adk/cli/browser/chunk-75WMU75S.js | 1 - .../{chunk-URGIGLGR.js => chunk-7P7JIWGK.js} | 2 +- src/google/adk/cli/browser/chunk-7UW26RYS.js | 1 - .../{chunk-SXB5AC5V.js => chunk-A2SOFJNC.js} | 2 +- src/google/adk/cli/browser/chunk-APNCZOFE.js | 1 - src/google/adk/cli/browser/chunk-ASJUXEUE.js | 1 - src/google/adk/cli/browser/chunk-B2DSW4QB.js | 15 - src/google/adk/cli/browser/chunk-BDIW4D5I.js | 65 - .../{chunk-IT263FCL.js => chunk-CD6LWQYN.js} | 2 +- src/google/adk/cli/browser/chunk-DIR2LWLP.js | 1 - src/google/adk/cli/browser/chunk-DMWOYWYQ.js | 1 - src/google/adk/cli/browser/chunk-DRBE27N3.js | 1 - .../{chunk-BPUQWVAT.js => chunk-DTNGXRUJ.js} | 2 +- src/google/adk/cli/browser/chunk-EGBSMT36.js | 1 - .../{chunk-2SRK2U7X.js => chunk-EN473UE3.js} | 4 +- src/google/adk/cli/browser/chunk-F57TI45K.js | 1 - src/google/adk/cli/browser/chunk-FDH623K7.js | 1 - .../{chunk-ET35KXUM.js => chunk-GGOEHXD2.js} | 2 +- .../{chunk-HTWWQBR6.js => chunk-GLGRLUIJ.js} | 2 +- src/google/adk/cli/browser/chunk-GP6TCC26.js | 1 - .../{chunk-P4MFJI72.js => chunk-HCQ2TSHS.js} | 2 +- src/google/adk/cli/browser/chunk-HD4LLD2O.js | 1 - src/google/adk/cli/browser/chunk-HDC4PFPG.js | 1 - src/google/adk/cli/browser/chunk-I4UDKKN5.js | 1 - src/google/adk/cli/browser/chunk-ICVZGLGO.js | 68 - src/google/adk/cli/browser/chunk-IHY23QJP.js | 1 - src/google/adk/cli/browser/chunk-J4R5U4YL.js | 7 - src/google/adk/cli/browser/chunk-JDPVSVO4.js | 1 - src/google/adk/cli/browser/chunk-JHZIBEJC.js | 1 - src/google/adk/cli/browser/chunk-JNY2YWG7.js | 1 - src/google/adk/cli/browser/chunk-JRNAXTJ7.js | 1 - .../{chunk-4VDZU6IO.js => chunk-JUJUP2UX.js} | 2 +- src/google/adk/cli/browser/chunk-JW2YJHYO.js | 34 - src/google/adk/cli/browser/chunk-LA76DWZL.js | 70 - src/google/adk/cli/browser/chunk-LI24J5PW.js | 220 - src/google/adk/cli/browser/chunk-N5S45BK4.js | 1 - src/google/adk/cli/browser/chunk-NALL4A3P.js | 161 - .../{chunk-3BJ4SYVH.js => chunk-NK4C5UIR.js} | 2 +- src/google/adk/cli/browser/chunk-NMKTPNXE.js | 1 - src/google/adk/cli/browser/chunk-NQKWI5EB.js | 1 - src/google/adk/cli/browser/chunk-PM3FQFTD.js | 30 - .../{chunk-6CJBO2JX.js => chunk-PR5T53UC.js} | 2 +- src/google/adk/cli/browser/chunk-PRKFGJVH.js | 1 - src/google/adk/cli/browser/chunk-QFMJV7VH.js | 80 - src/google/adk/cli/browser/chunk-QGHEW6NO.js | 70 - src/google/adk/cli/browser/chunk-QMDHABEH.js | 139 - src/google/adk/cli/browser/chunk-RCKFX6QR.js | 162 - src/google/adk/cli/browser/chunk-RMXJBC7V.js | 1 - src/google/adk/cli/browser/chunk-S22PTQH2.js | 73 - src/google/adk/cli/browser/chunk-SMT27N2F.js | 1 - src/google/adk/cli/browser/chunk-ST54LLJ3.js | 1 - src/google/adk/cli/browser/chunk-T2UY75BD.js | 145 - src/google/adk/cli/browser/chunk-T3Q3QCCV.js | 3 - src/google/adk/cli/browser/chunk-TIJO3EOA.js | 189 - src/google/adk/cli/browser/chunk-TNJPXCAB.js | 7 - src/google/adk/cli/browser/chunk-TNYN2TVW.js | 4 - src/google/adk/cli/browser/chunk-TPDTRWWV.js | 1 - src/google/adk/cli/browser/chunk-UWBTGTN5.js | 24 - src/google/adk/cli/browser/chunk-V2DCVTQX.js | 7 - src/google/adk/cli/browser/chunk-VDPKVNDJ.js | 1 - .../{chunk-4LH47YYI.js => chunk-VUI6RO2X.js} | 2 +- src/google/adk/cli/browser/chunk-W67OU2Q2.js | 10 - src/google/adk/cli/browser/chunk-W7GRJBO5.js | 1 + src/google/adk/cli/browser/chunk-W7PRDKNL.js | 53 - src/google/adk/cli/browser/chunk-WAKWL6X3.js | 24 - src/google/adk/cli/browser/chunk-WBLSVR3V.js | 2 - src/google/adk/cli/browser/chunk-WLB2FJ7K.js | 10 - src/google/adk/cli/browser/chunk-WR6HISGZ.js | 1 - src/google/adk/cli/browser/chunk-WXI2IBAH.js | 70 - .../{chunk-AQDQIDAM.js => chunk-WXV43367.js} | 2 +- src/google/adk/cli/browser/chunk-WZIWL22C.js | 292 -- src/google/adk/cli/browser/chunk-XE4A3JWW.js | 1 - src/google/adk/cli/browser/chunk-XMBKBASC.js | 1 - src/google/adk/cli/browser/chunk-XULIXUQL.js | 1 - src/google/adk/cli/browser/chunk-YVVLWU7S.js | 321 -- src/google/adk/cli/browser/chunk-ZCQFE5RP.js | 61 - src/google/adk/cli/browser/chunk-ZMOC4H7T.js | 32 - src/google/adk/cli/browser/chunk-ZX24QP2W.js | 2 - src/google/adk/cli/browser/index.html | 1192 +---- src/google/adk/cli/browser/main-3CUQG2IN.js | 4196 ----------------- src/google/adk/cli/browser/main-TCIQIOZ3.js | 4155 ++++++++++++++++ src/google/adk/cli/browser/prism-dark.css | 1 + src/google/adk/cli/browser/prism-light.css | 1 + .../adk/cli/browser/styles-2ORK6PRA.css | 1 + .../adk/cli/browser/styles-LBC36Z6S.css | 1 - .../adk_agent_builder_assistant.py | 21 +- .../utils/resolve_root_directory.py | 36 +- src/google/adk/cli/cli.py | 621 +-- src/google/adk/cli/cli_deploy.py | 402 +- src/google/adk/cli/cli_tools_click.py | 495 +- src/google/adk/cli/dev_server.py | 1295 ----- src/google/adk/cli/fast_api.py | 883 ++-- src/google/adk/cli/utils/_onboarding.py | 7 +- src/google/adk/cli/utils/agent_loader.py | 58 +- src/google/adk/cli/utils/dot_adk_folder.py | 2 +- src/google/adk/cli/utils/evals.py | 23 +- src/google/adk/cli/utils/gcp_utils.py | 9 +- .../adk/cli/utils/graph_serialization.py | 294 -- .../adk/cli/utils/graph_visualization.py | 346 -- src/google/adk/cli/utils/local_storage.py | 297 +- src/google/adk/cli/utils/service_factory.py | 18 +- src/google/adk/dependencies/vertexai.py | 15 +- .../adk/evaluation/custom_metric_evaluator.py | 2 +- src/google/adk/evaluation/eval_config.py | 10 + src/google/adk/evaluation/eval_metrics.py | 17 - .../adk/evaluation/evaluation_generator.py | 40 +- .../adk/evaluation/final_response_match_v2.py | 17 +- .../adk/evaluation/llm_as_judge_utils.py | 41 +- .../adk/evaluation/local_eval_service.py | 19 +- .../evaluation/metric_evaluator_registry.py | 6 - .../adk/evaluation/metric_info_providers.py | 18 - .../rubric_based_final_response_quality_v1.py | 13 +- ...c_based_multi_turn_trajectory_evaluator.py | 366 -- src/google/adk/events/__init__.py | 2 - src/google/adk/events/_node_path_builder.py | 107 - src/google/adk/events/event.py | 218 +- src/google/adk/events/event_actions.py | 7 - src/google/adk/events/request_input.py | 67 - src/google/adk/features/_feature_registry.py | 6 +- .../adk/flows/llm_flows/_code_execution.py | 8 - .../llm_flows/_output_schema_processor.py | 1 - .../adk/flows/llm_flows/agent_transfer.py | 29 +- .../adk/flows/llm_flows/base_llm_flow.py | 149 +- src/google/adk/flows/llm_flows/basic.py | 21 +- src/google/adk/flows/llm_flows/contents.py | 158 +- src/google/adk/flows/llm_flows/functions.py | 83 +- src/google/adk/flows/llm_flows/identity.py | 9 +- .../adk/integrations/bigquery/__init__.py | 49 - .../bigquery/bigquery_credentials.py | 43 - .../integrations/bigquery/bigquery_toolset.py | 101 - .../adk/integrations/bigquery/client.py | 115 - .../adk/integrations/bigquery/config.py | 158 - .../bigquery/data_insights_tool.py | 167 - .../integrations/bigquery/metadata_tool.py | 594 --- .../adk/integrations/bigquery/query_tool.py | 1371 ------ .../adk/integrations/bigquery/search_tool.py | 182 - .../adk/integrations/crewai/__init__.py | 2 - .../firestore/firestore_session_service.py | 1 - .../adk/integrations/langchain/__init__.py | 2 - .../adk/integrations/slack/slack_runner.py | 6 +- .../integrations/vmaas/sandbox_computer.py | 60 +- src/google/adk/labs/README.md | 6 - src/google/adk/labs/__init__.py | 15 - src/google/adk/labs/openai/README.md | 24 - src/google/adk/labs/openai/__init__.py | 19 - src/google/adk/labs/openai/_openai_llm.py | 511 -- src/google/adk/memory/__init__.py | 1 - .../memory/vertex_ai_memory_bank_service.py | 7 - .../memory/vertex_ai_rag_memory_service.py | 7 - src/google/adk/models/__init__.py | 16 +- .../adk/models/gemini_llm_connection.py | 125 +- src/google/adk/models/interactions_utils.py | 773 ++- src/google/adk/models/lite_llm.py | 157 +- src/google/adk/models/llm_response.py | 6 - src/google/adk/models/registry.py | 43 +- .../adk/plugins/auto_tracing_helpers.py | 300 -- src/google/adk/plugins/auto_tracing_plugin.py | 177 - .../bigquery_agent_analytics_plugin.py | 311 +- .../adk/plugins/debug_logging_plugin.py | 2 +- src/google/adk/plugins/plugin_manager.py | 24 - src/google/adk/runners.py | 764 +-- src/google/adk/sessions/__init__.py | 8 +- .../adk/sessions/base_session_service.py | 40 - .../adk/sessions/database_session_service.py | 61 +- .../adk/sessions/in_memory_session_service.py | 6 - .../sessions/migration/_schema_check_utils.py | 9 +- .../migrate_from_sqlalchemy_pickle.py | 151 +- .../sessions/migration/migration_runner.py | 18 +- .../adk/sessions/sqlite_session_service.py | 9 +- src/google/adk/sessions/state.py | 60 +- .../adk/sessions/vertex_ai_session_service.py | 66 +- src/google/adk/skills/_utils.py | 18 +- src/google/adk/telemetry/_agent_engine.py | 106 - .../adk/telemetry/_experimental_semconv.py | 55 +- src/google/adk/telemetry/_instrumentation.py | 118 +- src/google/adk/telemetry/_metrics.py | 102 +- src/google/adk/telemetry/_token_usage.py | 94 - src/google/adk/telemetry/google_cloud.py | 206 +- src/google/adk/telemetry/node_tracing.py | 146 - src/google/adk/telemetry/tracing.py | 164 +- src/google/adk/tools/__init__.py | 2 - .../tools/_function_parameter_parse_util.py | 22 +- .../adk/tools/_function_tool_declarations.py | 19 +- src/google/adk/tools/_request_input_tool.py | 57 - src/google/adk/tools/agent_tool.py | 108 - src/google/adk/tools/base_tool.py | 28 +- src/google/adk/tools/base_toolset.py | 2 +- src/google/adk/tools/bash_tool.py | 8 +- src/google/adk/tools/bigquery/__init__.py | 40 +- .../tools/bigquery/bigquery_credentials.py | 33 +- .../adk/tools/bigquery/bigquery_toolset.py | 91 +- src/google/adk/tools/bigquery/client.py | 105 +- src/google/adk/tools/bigquery/config.py | 148 +- .../adk/tools/bigquery/data_insights_tool.py | 177 +- .../adk/tools/bigquery/metadata_tool.py | 584 ++- src/google/adk/tools/bigquery/query_tool.py | 1361 +++++- src/google/adk/tools/bigquery/search_tool.py | 172 +- .../tools/computer_use/computer_use_tool.py | 36 +- .../adk/tools/discovery_engine_search_tool.py | 6 - .../adk/tools/environment/_edit_file_tool.py | 140 - .../tools/environment/_environment_toolset.py | 8 +- .../adk/tools/environment/_execute_tool.py | 137 - .../adk/tools/environment/_read_file_tool.py | 170 - src/google/adk/tools/environment/_tools.py | 395 +- src/google/adk/tools/environment/_utils.py | 26 - .../adk/tools/environment/_write_file_tool.py | 92 - .../environment_simulation_config.py | 2 +- .../environment_simulation_plugin.py | 2 +- src/google/adk/tools/function_tool.py | 114 +- .../google_api_tool/google_api_toolset.py | 23 +- .../googleapi_to_openapi_converter.py | 15 +- src/google/adk/tools/google_tool.py | 6 - src/google/adk/tools/mcp_tool/mcp_tool.py | 6 - src/google/adk/tools/mcp_tool/mcp_toolset.py | 3 +- .../adk/tools/mcp_tool/session_context.py | 20 +- .../openapi_spec_parser/openapi_toolset.py | 38 +- .../openapi_spec_parser/rest_api_tool.py | 65 +- .../adk/tools/set_model_response_tool.py | 11 +- src/google/adk/tools/skill_toolset.py | 192 +- src/google/adk/utils/_dependency.py | 30 - .../adk/utils/_google_client_headers.py | 2 +- src/google/adk/utils/_schema_utils.py | 14 - .../adk/utils/_serialized_base_model.py | 43 - src/google/adk/utils/agent_info.py | 16 +- src/google/adk/utils/content_utils.py | 9 +- src/google/adk/utils/model_name_utils.py | 3 +- src/google/adk/utils/output_schema_utils.py | 1 + src/google/adk/utils/streaming_utils.py | 97 +- src/google/adk/version.py | 2 +- src/google/adk/workflow/__init__.py | 41 - src/google/adk/workflow/_base_node.py | 260 - .../adk/workflow/_dynamic_node_scheduler.py | 519 -- src/google/adk/workflow/_errors.py | 59 - src/google/adk/workflow/_function_node.py | 520 -- src/google/adk/workflow/_graph.py | 559 --- src/google/adk/workflow/_join_node.py | 77 - src/google/adk/workflow/_llm_agent_wrapper.py | 445 -- src/google/adk/workflow/_node.py | 213 - src/google/adk/workflow/_node_runner.py | 411 -- src/google/adk/workflow/_node_state.py | 60 - src/google/adk/workflow/_node_status.py | 44 - src/google/adk/workflow/_parallel_worker.py | 131 - src/google/adk/workflow/_retry_config.py | 75 - .../adk/workflow/_schedule_dynamic_node.py | 79 - src/google/adk/workflow/_tool_node.py | 90 - src/google/adk/workflow/_trigger.py | 40 - src/google/adk/workflow/_workflow.py | 875 ---- src/google/adk/workflow/utils/__init__.py | 13 - .../adk/workflow/utils/_rehydration_utils.py | 382 -- .../adk/workflow/utils/_replay_interceptor.py | 195 - .../utils/_replay_sequence_barrier.py | 50 - src/google/adk/workflow/utils/_retry_utils.py | 86 - .../adk/workflow/utils/_transfer_utils.py | 92 - .../workflow/utils/_workflow_graph_utils.py | 130 - .../workflow/utils/_workflow_hitl_utils.py | 261 - .../fixture/bigquery_agent/README.md | 4 +- tests/integration/test_cli_run.py | 78 - .../a2a/converters/test_part_converter.py | 46 - tests/unittests/a2a/converters/test_to_adk.py | 44 - .../a2a/utils/test_agent_card_builder.py | 159 +- .../unittests/a2a/utils/test_agent_to_a2a.py | 56 +- tests/unittests/agents/llm/__init__.py | 13 - tests/unittests/agents/llm/event_utils.py | 81 - tests/unittests/agents/llm/task/__init__.py | 13 - .../agents/llm/task/test_finish_task_tool.py | 363 -- tests/unittests/agents/test_agent_clone.py | 15 +- tests/unittests/agents/test_agent_config.py | 132 +- tests/unittests/agents/test_context.py | 28 - .../agents/test_invocation_context.py | 12 +- .../test_invocation_context_process_queue.py | 159 - .../unittests/agents/test_langgraph_agent.py | 1 - .../agents/test_live_request_queue.py | 14 - .../agents/test_llm_agent_error_messages.py | 2 +- .../unittests/agents/test_llm_agent_fields.py | 29 - .../agents/test_llm_agent_include_contents.py | 4 +- .../agents/test_llm_agent_interruptions.py | 481 -- .../unittests/agents/test_remote_a2a_agent.py | 2 - .../agents/test_resumable_llm_agent.py | 585 ++- tests/unittests/apps/test_apps.py | 33 +- tests/unittests/apps/test_compaction.py | 266 +- .../apps/test_llm_event_summarizer.py | 80 +- .../unittests/auth/test_auth_preprocessor.py | 2 +- .../auth/test_oauth2_credential_util.py | 76 - tests/unittests/auth/test_toolset_auth.py | 8 +- .../test_adk_web_server_import_isolation.py | 50 - .../cli/test_adk_web_server_tests.py | 156 - tests/unittests/cli/test_fast_api.py | 728 +-- .../cli/test_resolve_root_directory.py | 140 - .../unittests/cli/utils/test_agent_loader.py | 14 +- tests/unittests/cli/utils/test_cli.py | 44 +- tests/unittests/cli/utils/test_cli_create.py | 2 +- tests/unittests/cli/utils/test_cli_deploy.py | 205 +- .../cli/utils/test_cli_deploy_to_cloud_run.py | 5 +- .../cli/utils/test_cli_tools_click.py | 674 +-- .../cli/utils/test_dot_adk_folder.py | 10 - tests/unittests/cli/utils/test_evals.py | 4 +- tests/unittests/cli/utils/test_gcp_utils.py | 12 +- .../cli/utils/test_graph_serialization.py | 144 - .../unittests/cli/utils/test_local_storage.py | 245 - .../cli/utils/test_service_factory.py | 90 +- tests/unittests/conftest.py | 4 - tests/unittests/evaluation/mock_gcs_utils.py | 14 - .../unittests/evaluation/test_eval_config.py | 12 + .../evaluation/test_evaluation_generator.py | 56 - .../test_final_response_match_v2.py | 75 - .../evaluation/test_llm_as_judge_utils.py | 74 - .../evaluation/test_local_eval_service.py | 2 +- .../test_metric_evaluator_registry.py | 12 - .../test_request_intercepter_plugin.py | 1 - ...c_based_multi_turn_trajectory_evaluator.py | 298 -- tests/unittests/events/__init__.py | 13 - tests/unittests/events/test_event.py | 427 -- .../events/test_node_path_builder.py | 159 - .../llm_flows}/test_agent_transfer.py | 578 +-- ...test_agent_transfer_system_instructions.py | 46 - .../flows/llm_flows/test_base_llm_flow.py | 480 +- .../flows/llm_flows/test_basic_processor.py | 66 - .../flows/llm_flows/test_code_execution.py | 16 - .../flows/llm_flows/test_functions_simple.py | 265 -- .../flows/llm_flows/test_identity.py | 23 - .../llm_flows/test_request_confirmation.py | 107 - .../integrations/api_registry/__init__.py | 2 - .../integrations/crewai/test_crewai_tool.py | 1 - .../test_firestore_session_service.py | 9 - .../test_parameter_client.py | 7 +- .../secret_manager/test_secret_client.py | 3 - .../integrations/slack/test_slack_runner.py | 4 - tests/unittests/labs/__init__.py | 13 - tests/unittests/labs/openai/__init__.py | 13 - .../unittests/labs/openai/test_openai_llm.py | 351 -- .../models/test_gemini_llm_connection.py | 492 +- .../models/test_interactions_utils.py | 837 ++-- tests/unittests/models/test_litellm.py | 250 +- tests/unittests/models/test_models.py | 32 - .../gepa_root_agent_prompt_optimizer_test.py | 1 - .../plugins/test_auto_tracing_plugin.py | 461 -- .../test_bigquery_agent_analytics_plugin.py | 670 +-- .../unittests/plugins/test_plugin_manager.py | 46 - .../plugins/test_reflect_retry_tool_plugin.py | 2 - .../runners/test_pause_invocation.py | 184 +- .../runners/test_resume_invocation.py | 207 +- .../runners/test_run_tool_confirmation.py | 4 +- tests/unittests/runners/test_runner_debug.py | 36 +- tests/unittests/runners/test_runner_node.py | 1312 ------ .../sessions/migration/test_migration.py | 310 -- .../sessions/test_session_service.py | 127 - .../test_vertex_ai_session_service.py | 39 - tests/unittests/skills/test__utils.py | 30 - .../streaming/test_live_streaming_configs.py | 71 - .../streaming/test_streaming_audio_storage.py | 4 +- tests/unittests/telemetry/test_functional.py | 122 +- .../unittests/telemetry/test_google_cloud.py | 13 - .../telemetry/test_instrumentation.py | 35 - tests/unittests/telemetry/test_metrics.py | 100 - .../telemetry/test_node_functional.py | 476 -- tests/unittests/telemetry/test_setup.py | 14 +- tests/unittests/telemetry/test_spans.py | 404 +- tests/unittests/telemetry/test_token_usage.py | 221 - tests/unittests/telemetry/utils.py | 111 - tests/unittests/test_optional_dependencies.py | 307 -- tests/unittests/test_release_dependencies.py | 138 - tests/unittests/test_runners.py | 889 ++-- tests/unittests/test_samples.py | 59 - tests/unittests/testing_utils.py | 29 +- tests/unittests/tools/BUILD | 46 + .../bigquery/test_bigquery_client.py | 6 +- .../bigquery/test_bigquery_credentials.py | 2 +- .../test_bigquery_data_insights_tool.py | 2 +- .../bigquery/test_bigquery_metadata_tool.py | 6 +- .../bigquery/test_bigquery_query_tool.py | 12 +- .../bigquery/test_bigquery_search_tool.py | 6 +- .../bigquery/test_bigquery_tool_config.py | 2 +- .../bigquery/test_bigquery_toolset.py | 6 +- ...k_data_insights_penguins_highest_mass.yaml | 0 .../computer_use/test_computer_use_tool.py | 118 - .../tools/environment/test_edit_file_tool.py | 150 - .../test_google_api_toolset.py | 65 +- .../test_googleapi_to_openapi_converter.py | 21 - .../mcp_tool/test_mcp_session_manager.py | 34 +- .../tools/mcp_tool/test_mcp_toolset.py | 10 +- .../tools/mcp_tool/test_session_context.py | 102 - .../test_openapi_toolset.py | 23 - .../openapi_spec_parser/test_rest_api_tool.py | 107 - tests/unittests/tools/test_agent_tool.py | 63 +- .../test_base_google_credentials_manager.py | 4 +- tests/unittests/tools/test_base_tool.py | 16 - .../tools/test_from_function_with_options.py | 4 +- tests/unittests/tools/test_function_tool.py | 4 - .../tools/test_function_tool_declarations.py | 20 - .../tools/test_function_tool_pydantic.py | 243 +- ...t_function_tool_with_import_annotations.py | 32 - tests/unittests/tools/test_google_tool.py | 4 +- tests/unittests/tools/test_load_web_page.py | 15 +- .../tools/test_request_input_tool.py | 116 - .../tools/test_set_model_response_tool.py | 67 - .../tools/test_skill_path_traversal.py | 280 -- tests/unittests/tools/test_skill_toolset.py | 289 +- .../unittests/utils/test_feature_decorator.py | 14 - .../unittests/utils/test_model_name_utils.py | 28 - .../utils/test_output_schema_utils.py | 99 +- .../utils/test_serialized_base_model.py | 35 - tests/unittests/utils/test_streaming_utils.py | 116 +- tests/unittests/workflow/__init__.py | 13 - tests/unittests/workflow/test_agent_node.py | 71 - .../workflow/test_dynamic_node_scheduler.py | 1212 ----- .../workflow/test_dynamic_use_as_output.py | 588 --- .../unittests/workflow/test_function_node.py | 1738 ------- tests/unittests/workflow/test_graph.py | 793 ---- tests/unittests/workflow/test_join_node.py | 277 -- .../workflow/test_llm_agent_as_node.py | 1238 ----- .../workflow/test_node_runner_ctx.py | 608 --- .../workflow/test_node_runner_failure.py | 1121 ----- .../workflow/test_node_runner_integration.py | 539 --- tests/unittests/workflow/test_state_schema.py | 424 -- tests/unittests/workflow/test_task_api_e2e.py | 525 --- tests/unittests/workflow/test_workflow.py | 2181 --------- .../workflow/test_workflow_agent_as_node.py | 104 - .../unittests/workflow/test_workflow_bytes.py | 137 - .../workflow/test_workflow_concurrency.py | 132 - .../workflow/test_workflow_dynamic_nodes.py | 1299 ----- .../workflow/test_workflow_failures.py | 1070 ----- .../test_workflow_function_tool_as_node.py | 75 - .../unittests/workflow/test_workflow_hitl.py | 2152 --------- .../unittests/workflow/test_workflow_live.py | 672 --- .../test_workflow_llm_agent_interruptions.py | 887 ---- .../workflow/test_workflow_nested.py | 1161 ----- .../unittests/workflow/test_workflow_node.py | 321 -- .../workflow/test_workflow_node_timeout.py | 204 - .../test_workflow_output_deduplication.py | 161 - .../workflow/test_workflow_parallel_worker.py | 1092 ----- .../workflow/test_workflow_routes.py | 654 --- .../workflow/test_workflow_schema.py | 842 ---- tests/unittests/workflow/testing_utils.py | 507 -- tests/unittests/workflow/utils/__init__.py | 13 - .../workflow/utils/test_rehydration_utils.py | 389 -- .../workflow/utils/test_replay_interceptor.py | 209 - .../utils/test_replay_sequence_barrier.py | 96 - .../workflow/utils/test_retry_utils.py | 70 - .../workflow/utils/test_transfer_utils.py | 188 - .../utils/test_workflow_graph_utils.py | 119 - .../utils/test_workflow_hitl_utils.py | 175 - .../workflow/workflow_testing_utils.py | 399 -- tox.ini | 10 - 1287 files changed, 17314 insertions(+), 100488 deletions(-) delete mode 100644 .agents/skills/adk-agent-builder/SKILL.md delete mode 100644 .agents/skills/adk-agent-builder/references/advanced-patterns.md delete mode 100644 .agents/skills/adk-agent-builder/references/best-practices.md delete mode 100644 .agents/skills/adk-agent-builder/references/callbacks-and-plugins.md delete mode 100644 .agents/skills/adk-agent-builder/references/dynamic-nodes.md delete mode 100644 .agents/skills/adk-agent-builder/references/function-nodes.md delete mode 100644 .agents/skills/adk-agent-builder/references/getting-started.md delete mode 100644 .agents/skills/adk-agent-builder/references/human-in-the-loop.md delete mode 100644 .agents/skills/adk-agent-builder/references/import-paths.md delete mode 100644 .agents/skills/adk-agent-builder/references/llm-agent-nodes.md delete mode 100644 .agents/skills/adk-agent-builder/references/multi-agent.md delete mode 100644 .agents/skills/adk-agent-builder/references/parallel-and-fanout.md delete mode 100644 .agents/skills/adk-agent-builder/references/routing-and-conditions.md delete mode 100644 .agents/skills/adk-agent-builder/references/session-and-state.md delete mode 100644 .agents/skills/adk-agent-builder/references/state-and-events.md delete mode 100644 .agents/skills/adk-agent-builder/references/task-mode.md delete mode 100644 .agents/skills/adk-agent-builder/references/testing.md delete mode 100644 .agents/skills/adk-agent-builder/references/tool-catalog.md delete mode 100644 .agents/skills/adk-architecture/SKILL.md delete mode 100644 .agents/skills/adk-architecture/references/architecture/checkpoint-resume.md delete mode 100644 .agents/skills/adk-architecture/references/architecture/context.md delete mode 100644 .agents/skills/adk-architecture/references/architecture/llm-context-orchestration.md delete mode 100644 .agents/skills/adk-architecture/references/architecture/node-runner.md delete mode 100644 .agents/skills/adk-architecture/references/architecture/observability.md delete mode 100644 .agents/skills/adk-architecture/references/architecture/runner-roles.md delete mode 100644 .agents/skills/adk-architecture/references/interfaces/agent.md delete mode 100644 .agents/skills/adk-architecture/references/interfaces/base-agent.md delete mode 100644 .agents/skills/adk-architecture/references/interfaces/base-node.md delete mode 100644 .agents/skills/adk-architecture/references/interfaces/event.md delete mode 100644 .agents/skills/adk-architecture/references/interfaces/runner.md delete mode 100644 .agents/skills/adk-architecture/references/interfaces/workflow.md delete mode 100644 .agents/skills/adk-architecture/references/principles/api-principles.md delete mode 100644 .agents/skills/adk-debug/SKILL.md delete mode 100644 .agents/skills/adk-git/SKILL.md delete mode 100644 .agents/skills/adk-issue-analyze/SKILL.md delete mode 100644 .agents/skills/adk-issue-fix/SKILL.md delete mode 100644 .agents/skills/adk-issue/SKILL.md delete mode 100644 .agents/skills/adk-pr-analyze/SKILL.md delete mode 100644 .agents/skills/adk-pr-analyze/scripts/triage_pr.py delete mode 100644 .agents/skills/adk-pr-triage/SKILL.md delete mode 100644 .agents/skills/adk-review/SKILL.md delete mode 100644 .agents/skills/adk-sample-creator/SKILL.md delete mode 100644 .agents/skills/adk-setup/SKILL.md delete mode 100644 .agents/skills/adk-style/SKILL.md delete mode 100644 .agents/skills/adk-style/references/documentation.md delete mode 100644 .agents/skills/adk-style/references/file-organization.md delete mode 100644 .agents/skills/adk-style/references/formatting.md delete mode 100644 .agents/skills/adk-style/references/imports.md delete mode 100644 .agents/skills/adk-style/references/logging.md delete mode 100644 .agents/skills/adk-style/references/pydantic.md delete mode 100644 .agents/skills/adk-style/references/testing.md delete mode 100644 .agents/skills/adk-style/references/typing.md delete mode 100644 .agents/skills/adk-style/references/visibility.md delete mode 100644 .github/.release-please-manifest-v1.json create mode 100644 .github/.release-please-manifest-v2.json rename .github/{release-please-config-v1.json => release-please-config-v2.json} (95%) create mode 100644 .github/workflows/gemini-dispatch.yml create mode 100644 .github/workflows/gemini-invoke.yml create mode 100644 .github/workflows/gemini-review.yml delete mode 100644 .github/workflows/issue-analyze.yml delete mode 100644 .github/workflows/issue-fix.yml delete mode 100644 .github/workflows/pr-analyze.yml delete mode 100644 .github/workflows/release-update-adk-web.yaml delete mode 100644 .github/workflows/release-v1-cut.yml rename .github/workflows/{release-v1-cherry-pick.yml => release-v2-cherry-pick.yml} (75%) create mode 100644 .github/workflows/release-v2-cut.yml rename .github/workflows/{release-v1-finalize.yml => release-v2-finalize.yml} (74%) rename .github/workflows/{release-v1-please.yml => release-v2-please.yml} (60%) rename .github/workflows/{release-v1-publish.yml => release-v2-publish.yml} (81%) create mode 100644 .github/workflows/v2-sync.yml delete mode 100644 CHANGELOG-v2.md rename contributing/samples/{a2a => }/a2a_auth/README.md (100%) rename contributing/samples/{a2a => }/a2a_auth/__init__.py (100%) rename contributing/samples/{a2a => }/a2a_auth/agent.py (95%) rename contributing/samples/{a2a => }/a2a_auth/remote_a2a/bigquery_agent/__init__.py (100%) rename contributing/samples/{a2a => }/a2a_auth/remote_a2a/bigquery_agent/agent.json (70%) rename contributing/samples/{a2a => }/a2a_auth/remote_a2a/bigquery_agent/agent.py (98%) rename contributing/samples/{a2a => }/a2a_basic/README.md (100%) rename contributing/samples/{a2a => }/a2a_basic/__init__.py (100%) rename contributing/samples/{a2a => }/a2a_basic/agent.py (99%) rename contributing/samples/{a2a => }/a2a_basic/remote_a2a/check_prime_agent/__init__.py (100%) rename contributing/samples/{a2a => }/a2a_basic/remote_a2a/check_prime_agent/agent.json (70%) rename contributing/samples/{a2a => }/a2a_basic/remote_a2a/check_prime_agent/agent.py (98%) rename contributing/samples/{a2a => }/a2a_human_in_loop/README.md (100%) rename contributing/samples/{a2a => }/a2a_human_in_loop/__init__.py (100%) rename contributing/samples/{a2a => }/a2a_human_in_loop/agent.py (98%) rename contributing/samples/{a2a => }/a2a_human_in_loop/remote_a2a/human_in_loop/__init__.py (100%) rename contributing/samples/{a2a => }/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json (71%) rename contributing/samples/{hitl => a2a_human_in_loop/remote_a2a}/human_in_loop/agent.py (98%) rename contributing/samples/{a2a => }/a2a_root/README.md (100%) rename contributing/samples/{a2a => }/a2a_root/agent.py (100%) rename contributing/samples/{a2a => }/a2a_root/remote_a2a/hello_world/__init__.py (100%) rename contributing/samples/{a2a => }/a2a_root/remote_a2a/hello_world/agent.py (99%) rename contributing/samples/{adk_team => }/adk_answering_agent/README.md (100%) rename contributing/samples/{adk_team => }/adk_answering_agent/__init__.py (100%) rename contributing/samples/{adk_team => }/adk_answering_agent/agent.py (99%) rename contributing/samples/{adk_team => }/adk_answering_agent/gemini_assistant/__init__.py (100%) rename contributing/samples/{adk_team => }/adk_answering_agent/gemini_assistant/agent.py (99%) rename contributing/samples/{adk_team => }/adk_answering_agent/main.py (100%) rename contributing/samples/{adk_team => }/adk_answering_agent/settings.py (100%) rename contributing/samples/{adk_team => }/adk_answering_agent/tools.py (100%) rename contributing/samples/{adk_team => }/adk_answering_agent/upload_docs_to_vertex_ai_search.py (100%) rename contributing/samples/{adk_team => }/adk_answering_agent/utils.py (100%) rename contributing/samples/{adk_team => }/adk_documentation/__init__.py (100%) rename contributing/samples/{adk_team => }/adk_documentation/adk_docs_updater/__init__.py (100%) rename contributing/samples/{adk_team => }/adk_documentation/adk_docs_updater/agent.py (99%) rename contributing/samples/{adk_team => }/adk_documentation/adk_docs_updater/main.py (100%) rename contributing/samples/{adk_team => }/adk_documentation/adk_release_analyzer/README.md (100%) rename contributing/samples/{adk_team => }/adk_documentation/adk_release_analyzer/__init__.py (100%) rename contributing/samples/{adk_team => }/adk_documentation/adk_release_analyzer/agent.py (100%) rename contributing/samples/{adk_team => }/adk_documentation/adk_release_analyzer/main.py (100%) rename contributing/samples/{adk_team => }/adk_documentation/settings.py (100%) rename contributing/samples/{adk_team => }/adk_documentation/tools.py (100%) rename contributing/samples/{adk_team => }/adk_documentation/utils.py (100%) rename contributing/samples/{adk_team => }/adk_issue_formatting_agent/__init__.py (100%) rename contributing/samples/{adk_team => }/adk_issue_formatting_agent/agent.py (99%) rename contributing/samples/{adk_team => }/adk_issue_formatting_agent/settings.py (100%) rename contributing/samples/{adk_team => }/adk_issue_formatting_agent/utils.py (100%) rename contributing/samples/{adk_team => }/adk_issue_monitoring_agent/PROMPT_INSTRUCTION.txt (100%) rename contributing/samples/{adk_team => }/adk_issue_monitoring_agent/README.md (100%) rename contributing/samples/{adk_team => }/adk_issue_monitoring_agent/__init__.py (100%) rename contributing/samples/{adk_team => }/adk_issue_monitoring_agent/agent.py (100%) rename contributing/samples/{adk_team => }/adk_issue_monitoring_agent/main.py (100%) rename contributing/samples/{adk_team => }/adk_issue_monitoring_agent/settings.py (100%) rename contributing/samples/{adk_team => }/adk_issue_monitoring_agent/utils.py (100%) rename contributing/samples/{adk_team => }/adk_knowledge_agent/README.md (100%) rename contributing/samples/{adk_team => }/adk_knowledge_agent/__init__.py (100%) rename contributing/samples/{adk_team => }/adk_knowledge_agent/agent.json (68%) rename contributing/samples/{adk_team => }/adk_knowledge_agent/agent.py (98%) rename contributing/samples/{adk_team => }/adk_knowledge_agent/requirements.txt (100%) rename contributing/samples/{adk_team => }/adk_pr_agent/__init__.py (100%) rename contributing/samples/{adk_team => }/adk_pr_agent/agent.py (99%) rename contributing/samples/{adk_team => }/adk_pr_agent/main.py (100%) rename contributing/samples/{adk_team => }/adk_pr_triaging_agent/README.md (100%) rename contributing/samples/{adk_team => }/adk_pr_triaging_agent/__init__.py (100%) rename contributing/samples/{adk_team => }/adk_pr_triaging_agent/agent.py (99%) rename contributing/samples/{adk_team => }/adk_pr_triaging_agent/main.py (100%) rename contributing/samples/{adk_team => }/adk_pr_triaging_agent/settings.py (100%) rename contributing/samples/{adk_team => }/adk_pr_triaging_agent/utils.py (100%) rename contributing/samples/{adk_team => }/adk_stale_agent/PROMPT_INSTRUCTION.txt (100%) rename contributing/samples/{adk_team => }/adk_stale_agent/README.md (100%) rename contributing/samples/{adk_team => }/adk_stale_agent/__init__.py (100%) rename contributing/samples/{adk_team => }/adk_stale_agent/agent.py (100%) rename contributing/samples/{adk_team => }/adk_stale_agent/main.py (100%) rename contributing/samples/{adk_team => }/adk_stale_agent/settings.py (100%) rename contributing/samples/{adk_team => }/adk_stale_agent/utils.py (100%) rename contributing/samples/{adk_team => }/adk_triaging_agent/README.md (100%) rename contributing/samples/{adk_team => }/adk_triaging_agent/__init__.py (100%) rename contributing/samples/{adk_team => }/adk_triaging_agent/agent.py (95%) rename contributing/samples/{adk_team => }/adk_triaging_agent/main.py (100%) rename contributing/samples/{adk_team => }/adk_triaging_agent/settings.py (100%) rename contributing/samples/{adk_team => }/adk_triaging_agent/utils.py (100%) rename contributing/samples/{code_execution => }/agent_engine_code_execution/README (100%) rename contributing/samples/{code_execution => }/agent_engine_code_execution/__init__.py (100%) rename contributing/samples/{code_execution => }/agent_engine_code_execution/agent.py (99%) rename contributing/samples/{integrations => }/agent_registry_agent/README.md (100%) rename contributing/samples/{code_execution/code_execution => agent_registry_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/agent_registry_agent/agent.py (100%) rename contributing/samples/{code_execution/custom_code_execution => agent_tool_with_grounding_metadata}/__init__.py (100%) rename contributing/samples/{tools => }/agent_tool_with_grounding_metadata/agent.py (100%) rename contributing/samples/{integrations => }/api_registry_agent/README.md (100%) rename contributing/samples/{code_execution/vertex_code_execution => api_registry_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/api_registry_agent/agent.py (98%) rename contributing/samples/{integrations => }/application_integration_agent/README.md (100%) rename contributing/samples/{context_management/history_management => application_integration_agent}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{integrations => }/application_integration_agent/agent.py (98%) rename contributing/samples/{context_management/memory => artifact_save_text}/__init__.py (100%) create mode 100755 contributing/samples/artifact_save_text/agent.py rename contributing/samples/{integrations => }/authn-adk-all-in-one/README.md (100%) rename contributing/samples/{context_management/rewind_session => authn-adk-all-in-one/adk_agents/agent_openapi_tools}/__init__.py (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/adk_agents/requirements.txt (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/adk_agents/sample.env (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/doc_images/jwks_updated.png (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/doc_images/jwksgen.png (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/hotel_booker_app/main.py (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/hotel_booker_app/openapi.yaml (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/idp/app.py (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/idp/sample.env (100%) create mode 100644 contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json rename contributing/samples/{integrations => }/authn-adk-all-in-one/idp/templates/admin.html (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/idp/templates/consent.html (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/idp/templates/login.html (100%) rename contributing/samples/{integrations => }/authn-adk-all-in-one/requirements.txt (81%) rename contributing/samples/{integrations => }/bigquery/README.md (100%) rename contributing/samples/{context_management/session_state_agent => bigquery}/__init__.py (100%) rename contributing/samples/{integrations => }/bigquery/agent.py (99%) rename contributing/samples/{integrations => }/bigquery_mcp/README.md (100%) rename contributing/samples/{core/abort => bigquery_mcp}/__init__.py (100%) rename contributing/samples/{integrations => }/bigquery_mcp/agent.py (98%) rename contributing/samples/{integrations => }/bigtable/README.md (100%) rename contributing/samples/{core/artifacts => bigtable}/__init__.py (100%) rename contributing/samples/{integrations => }/bigtable/agent.py (99%) rename contributing/samples/{tools => }/built_in_multi_tools/README.md (100%) rename contributing/samples/{core/callbacks => built_in_multi_tools}/__init__.py (100%) rename contributing/samples/{tools => }/built_in_multi_tools/agent.py (100%) create mode 100644 contributing/samples/cache_analysis/README.md rename contributing/samples/{context_management => }/cache_analysis/__init__.py (100%) rename contributing/samples/{context_management => }/cache_analysis/agent.py (99%) rename contributing/samples/{context_management => }/cache_analysis/run_cache_experiments.py (100%) rename contributing/samples/{context_management => }/cache_analysis/utils.py (100%) rename contributing/samples/{core/hello_world => callbacks}/__init__.py (100%) mode change 100644 => 100755 create mode 100755 contributing/samples/callbacks/agent.py rename contributing/samples/{context_management/history_management => callbacks}/main.py (100%) rename contributing/samples/{core/logprobs => code_execution}/__init__.py (100%) rename contributing/samples/code_execution/{code_execution => }/agent.py (99%) rename contributing/samples/code_execution/{code_execution => }/gke_sandbox_agent.py (98%) rename contributing/samples/{multimodal => }/computer_use/README.md (100%) rename contributing/samples/{multimodal => }/computer_use/agent.py (100%) rename contributing/samples/{multimodal => }/computer_use/playwright.py (100%) rename contributing/samples/{multimodal => }/computer_use/requirements.txt (100%) delete mode 100644 contributing/samples/context_management/cache_analysis/README.md delete mode 100644 contributing/samples/context_management/session_state_agent/input.json rename contributing/samples/{patterns => }/context_offloading_with_artifact/README.md (100%) rename contributing/samples/{core/quickstart => context_offloading_with_artifact}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{patterns => }/context_offloading_with_artifact/agent.py (99%) delete mode 100644 contributing/samples/core/abort/README.md delete mode 100644 contributing/samples/core/abort/agent.py delete mode 100644 contributing/samples/core/app/README.md delete mode 100644 contributing/samples/core/app/agent.py delete mode 100644 contributing/samples/core/app/tests/hello.json delete mode 100644 contributing/samples/core/app/tests/help_trip.json delete mode 100644 contributing/samples/core/app/tests/who_are_you.json delete mode 100644 contributing/samples/core/artifacts/README.md delete mode 100644 contributing/samples/core/artifacts/agent.py delete mode 100644 contributing/samples/core/callbacks/README.md delete mode 100644 contributing/samples/core/callbacks/agent.py delete mode 100644 contributing/samples/core/callbacks/tests/hi.json delete mode 100644 contributing/samples/core/callbacks/tests/weather_in_london.json delete mode 100644 contributing/samples/core/callbacks/tests/weather_in_sunnyvale.json delete mode 100644 contributing/samples/core/empty_agent/README.md delete mode 100644 contributing/samples/core/empty_agent/agent.py delete mode 100644 contributing/samples/core/empty_agent/tests/go.json delete mode 100644 contributing/samples/core/empty_agent/tests/hello.json delete mode 100644 contributing/samples/core/empty_agent/tests/how_are_you.json delete mode 100644 contributing/samples/core/hello_world/README.md delete mode 100644 contributing/samples/core/hello_world/tests/check_prime.json delete mode 100644 contributing/samples/core/hello_world/tests/roll_and_check.json delete mode 100644 contributing/samples/core/hello_world/tests/roll_die.json delete mode 100644 contributing/samples/core/input_output_schema/README.md delete mode 100644 contributing/samples/core/input_output_schema/agent.py delete mode 100644 contributing/samples/core/input_output_schema/tests/weather_cupertino.json delete mode 100644 contributing/samples/core/input_output_schema/tests/weather_sanjose.json delete mode 100644 contributing/samples/core/input_output_schema/tests/weather_tokyo.json delete mode 100644 contributing/samples/core/logprobs/README.md delete mode 100644 contributing/samples/core/logprobs/tests/hello.json delete mode 100644 contributing/samples/core/logprobs/tests/tell_joke.json delete mode 100644 contributing/samples/core/logprobs/tests/what_is_ai.json delete mode 100644 contributing/samples/core/quickstart/README.md delete mode 100644 contributing/samples/core/quickstart/tests/time_ny.json delete mode 100644 contributing/samples/core/quickstart/tests/weather_ny.json delete mode 100644 contributing/samples/core/quickstart/tests/weather_time_ny.json delete mode 100644 contributing/samples/core/runner_debug_example/tests/stock_googl.json delete mode 100644 contributing/samples/core/runner_debug_example/tests/stock_nvda.json delete mode 100644 contributing/samples/core/runner_debug_example/tests/weather_sf.json rename contributing/samples/{config => }/core_basic_config/README.md (100%) rename contributing/samples/{config => }/core_basic_config/root_agent.yaml (100%) rename contributing/samples/{config => }/core_callback_config/__init__.py (100%) rename contributing/samples/{config => }/core_callback_config/callbacks.py (76%) rename contributing/samples/{config => }/core_callback_config/root_agent.yaml (100%) rename contributing/samples/{config => }/core_callback_config/tools.py (66%) rename contributing/samples/{config => }/core_custom_agent_config/__init__.py (100%) rename contributing/samples/{config => }/core_custom_agent_config/my_agents.py (100%) rename contributing/samples/{config => }/core_custom_agent_config/root_agent.yaml (100%) rename contributing/samples/{config => }/core_generate_content_config_config/root_agent.yaml (100%) rename contributing/samples/{integrations => }/crewai_tool_kwargs/README.md (100%) rename contributing/samples/{environment_and_skills/local_environment => crewai_tool_kwargs}/__init__.py (100%) rename contributing/samples/{integrations => }/crewai_tool_kwargs/agent.py (99%) rename contributing/samples/{integrations => }/crewai_tool_kwargs/main.py (100%) rename contributing/samples/{code_execution => }/custom_code_execution/README.md (100%) rename contributing/samples/{environment_and_skills/local_environment_skill => custom_code_execution}/__init__.py (100%) rename contributing/samples/{code_execution => }/custom_code_execution/agent.py (99%) rename contributing/samples/{integrations => }/data_agent/README.md (100%) rename contributing/samples/{environment_and_skills/skills_agent => data_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/data_agent/agent.py (61%) delete mode 100644 contributing/samples/environment_and_skills/skills/README.md delete mode 100644 contributing/samples/environment_and_skills/skills/__init__.py delete mode 100644 contributing/samples/environment_and_skills/skills/agent.py delete mode 100644 contributing/samples/environment_and_skills/skills/skills/weather-skill/SKILL.md delete mode 100644 contributing/samples/environment_and_skills/skills/tests/current_humidity.json delete mode 100644 contributing/samples/environment_and_skills/skills/tests/current_weather.json delete mode 100644 contributing/samples/environment_and_skills/skills/tests/support_hours.json delete mode 100644 contributing/samples/environment_and_skills/skills/tests/wind_speed.json delete mode 100644 contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/references/weather_info.md delete mode 100644 contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/scripts/get_humidity.py rename contributing/samples/{environment_and_skills/skills_agent_gcs => fields_output_schema}/__init__.py (100%) create mode 100644 contributing/samples/fields_output_schema/agent.py rename contributing/samples/{hitl/human_in_loop => fields_planner}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{patterns => }/fields_planner/agent.py (100%) rename contributing/samples/{patterns => }/fields_planner/main.py (100%) rename contributing/samples/{integrations => }/files_retrieval_agent/README.md (100%) rename contributing/samples/{hitl/human_tool_confirmation => files_retrieval_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/files_retrieval_agent/agent.py (98%) rename contributing/samples/{integrations => }/files_retrieval_agent/data/adk_overview.txt (100%) rename contributing/samples/{integrations => }/files_retrieval_agent/data/tools_guide.txt (100%) rename contributing/samples/{integrations => }/gcp_auth/README.md (100%) rename contributing/samples/{integrations => }/gcp_auth/agent.py (100%) rename contributing/samples/{integrations => }/gcp_auth/client/index.html (100%) rename contributing/samples/{integrations => }/gcp_auth/client/main.py (100%) rename contributing/samples/{integrations => }/gcp_auth/client/requirements.txt (100%) rename contributing/samples/{hitl/tool_confirmation => gcp_skill_registry_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/gcp_skill_registry_agent/agent.py (100%) rename contributing/samples/{integrations/agent_registry_agent => generate_image}/__init__.py (100%) rename contributing/samples/{multimodal => }/generate_image/agent.py (98%) rename contributing/samples/{multimodal => }/generate_image/sample.session.json (100%) rename contributing/samples/{integrations => }/gepa/README.md (100%) rename contributing/samples/{hitl/tool_human_in_the_loop_config => gepa}/__init__.py (100%) rename contributing/samples/{integrations => }/gepa/adk_agent.py (100%) rename contributing/samples/{integrations => }/gepa/adk_agent_test.py (100%) rename contributing/samples/{integrations => }/gepa/experiment.py (100%) rename contributing/samples/{integrations => }/gepa/gepa_tau_bench.ipynb (100%) rename contributing/samples/{integrations => }/gepa/gepa_utils.py (100%) rename contributing/samples/{integrations => }/gepa/rater_lib.py (100%) rename contributing/samples/{integrations => }/gepa/rubric_validation_template.txt (100%) rename contributing/samples/{integrations => }/gepa/run_experiment.py (100%) rename contributing/samples/{integrations => }/gepa/tau_bench_agent.py (100%) rename contributing/samples/{integrations => }/gepa/voter_agent/eval_prompts.txt (100%) rename contributing/samples/{integrations => }/gepa/voter_agent/gepa.ipynb (100%) rename contributing/samples/{integrations => }/gepa/voter_agent/optimized_prompt.txt (100%) rename contributing/samples/{integrations => }/gepa/voter_agent/prompts.txt (100%) rename contributing/samples/{integrations => }/gepa/voter_agent/rubric_validation_template.txt (100%) rename contributing/samples/{integrations => }/gepa/voter_agent/tools.py (100%) rename contributing/samples/{integrations => }/gke_agent_sandbox/deployment_rbac.yaml (100%) rename contributing/samples/{integrations => }/google_api/README.md (100%) rename contributing/samples/{integrations/api_registry_agent => google_api}/__init__.py (100%) rename contributing/samples/{integrations => }/google_api/agent.py (98%) rename contributing/samples/{integrations/application_integration_agent => google_search_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/google_search_agent/agent.py (97%) rename contributing/samples/{integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools => hello_world}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{core => }/hello_world/agent.py (99%) mode change 100644 => 100755 create mode 100755 contributing/samples/hello_world/main.py rename contributing/samples/{context_management/migrate_session_db => hello_world_anthropic}/__init__.py (100%) rename contributing/samples/{models => }/hello_world_anthropic/agent.py (100%) rename contributing/samples/{models => }/hello_world_anthropic/main.py (100%) rename contributing/samples/{models => }/hello_world_apigeellm/.env-sample (100%) rename contributing/samples/{models => }/hello_world_apigeellm/README.md (100%) rename contributing/samples/{models => }/hello_world_apigeellm/agent.py (100%) rename contributing/samples/{models => }/hello_world_apigeellm/main.py (100%) rename contributing/samples/{integrations/bigquery => hello_world_app}/__init__.py (100%) mode change 100644 => 100755 create mode 100755 contributing/samples/hello_world_app/agent.py create mode 100755 contributing/samples/hello_world_app/main.py rename contributing/samples/{context_management/postgres_session_service => hello_world_gemma}/__init__.py (100%) rename contributing/samples/{models => }/hello_world_gemma/agent.py (100%) rename contributing/samples/{models => }/hello_world_gemma/main.py (100%) rename contributing/samples/{models/hello_world_anthropic => hello_world_gemma3_ollama}/__init__.py (100%) rename contributing/samples/{models => }/hello_world_gemma3_ollama/agent.py (100%) rename contributing/samples/{models => }/hello_world_gemma3_ollama/main.py (100%) rename contributing/samples/{models/hello_world_gemma => hello_world_litellm}/__init__.py (100%) rename contributing/samples/{models => }/hello_world_litellm/agent.py (100%) rename contributing/samples/{models => }/hello_world_litellm/main.py (100%) rename contributing/samples/{models/hello_world_gemma3_ollama => hello_world_litellm_add_function_to_prompt}/__init__.py (100%) rename contributing/samples/{models => }/hello_world_litellm_add_function_to_prompt/agent.py (100%) rename contributing/samples/{models => }/hello_world_litellm_add_function_to_prompt/main.py (100%) rename contributing/samples/{integrations/bigquery_mcp => hello_world_ma}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{multi_agent => }/hello_world_ma/agent.py (98%) rename contributing/samples/{models => }/hello_world_ollama/README.md (100%) rename contributing/samples/{integrations/bigtable => hello_world_ollama}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{models => }/hello_world_ollama/agent.py (100%) rename contributing/samples/{models => }/hello_world_ollama/main.py (100%) rename contributing/samples/{integrations/crewai_tool_kwargs => hello_world_stream_fc_args}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{tools => }/hello_world_stream_fc_args/agent.py (100%) mode change 100644 => 100755 rename contributing/samples/{integrations/data_agent => history_management}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{context_management => }/history_management/agent.py (99%) create mode 100755 contributing/samples/history_management/main.py delete mode 100644 contributing/samples/hitl/human_in_loop/tests/auto_reimburse_coffee.json delete mode 100644 contributing/samples/hitl/human_in_loop/tests/reimburse_dinner.json delete mode 100644 contributing/samples/hitl/request_input_tool/README.md delete mode 100644 contributing/samples/hitl/request_input_tool/agent.py delete mode 100644 contributing/samples/hitl/request_input_tool/tests/create_support_ticket.json delete mode 100644 contributing/samples/hitl/tool_confirmation/README.md delete mode 100644 contributing/samples/hitl/tool_confirmation/agent.py delete mode 100644 contributing/samples/hitl/tool_confirmation/tests/Transfer_500_and_close_account_ACC123.json delete mode 100644 contributing/samples/hitl/tool_confirmation/tests/close_account_acc123.json delete mode 100644 contributing/samples/hitl/tool_confirmation/tests/transfer_200_confirmed.json delete mode 100644 contributing/samples/hitl/tool_confirmation/tests/transfer_200_declined.json delete mode 100644 contributing/samples/hitl/tool_confirmation/tests/transfer_50.json rename contributing/samples/{hitl => }/human_in_loop/README.md (100%) rename contributing/samples/{integrations/files_retrieval_agent => human_in_loop}/__init__.py (100%) rename contributing/samples/{a2a/a2a_human_in_loop/remote_a2a => }/human_in_loop/agent.py (98%) rename contributing/samples/{hitl => }/human_in_loop/main.py (100%) rename contributing/samples/{integrations/gcp_skill_registry_agent => human_tool_confirmation}/__init__.py (100%) rename contributing/samples/{hitl => }/human_tool_confirmation/agent.py (99%) rename contributing/samples/{integrations => }/integration_connector_euc_agent/README.md (100%) rename contributing/samples/{integrations/google_api => integration_connector_euc_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/integration_connector_euc_agent/agent.py (99%) delete mode 100644 contributing/samples/integrations/authn-adk-all-in-one/idp/sample.jwks.json rename contributing/samples/{models => }/interactions_api/README.md (100%) rename contributing/samples/{models => }/interactions_api/__init__.py (100%) rename contributing/samples/{models => }/interactions_api/agent.py (72%) rename contributing/samples/{models => }/interactions_api/main.py (88%) rename contributing/samples/{integrations => }/jira_agent/README.md (100%) rename contributing/samples/{integrations/google_search_agent => jira_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/jira_agent/agent.py (98%) rename contributing/samples/{integrations => }/jira_agent/image-app-intg-editor.png (100%) rename contributing/samples/{integrations => }/jira_agent/image-application-integration.png (100%) rename contributing/samples/{integrations => }/jira_agent/image-connection-tool.png (100%) rename contributing/samples/{integrations => }/jira_agent/tools.py (100%) rename contributing/samples/{patterns => }/json_passing_agent/README.md (100%) rename contributing/samples/{integrations/integration_connector_euc_agent => json_passing_agent}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{patterns => }/json_passing_agent/agent.py (98%) rename contributing/samples/{patterns => }/json_passing_agent/main.py (100%) rename contributing/samples/{integrations/jira_agent => langchain_structured_tool_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/langchain_structured_tool_agent/agent.py (98%) rename contributing/samples/{integrations => }/langchain_youtube_search_agent/README.md (100%) rename contributing/samples/{integrations/langchain_structured_tool_agent => langchain_youtube_search_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/langchain_youtube_search_agent/agent.py (94%) rename contributing/samples/{integrations => }/langchain_youtube_search_agent/requirements.txt (100%) rename contributing/samples/{core/empty_agent => litellm_inline_tool_call}/__init__.py (100%) rename contributing/samples/{models => }/litellm_inline_tool_call/agent.py (100%) rename contributing/samples/{integrations/langchain_youtube_search_agent => litellm_streaming}/__init__.py (100%) rename contributing/samples/{models => }/litellm_streaming/agent.py (100%) rename contributing/samples/{models => }/litellm_streaming/main.py (100%) rename contributing/samples/{integrations/oauth2_client_credentials => litellm_structured_output}/__init__.py (100%) rename contributing/samples/{models => }/litellm_structured_output/agent.py (100%) rename contributing/samples/{models => }/litellm_with_fallback_models/README.md (100%) rename contributing/samples/{integrations/oauth_calendar_agent => litellm_with_fallback_models}/__init__.py (100%) rename contributing/samples/{models => }/litellm_with_fallback_models/agent.py (100%) rename contributing/samples/{live => }/live_agent_api_server_example/check_prime_11.wav (100%) rename contributing/samples/{live => }/live_agent_api_server_example/check_prime_15.wav (100%) rename contributing/samples/{live => }/live_agent_api_server_example/live_agent_example.py (100%) rename contributing/samples/{live => }/live_agent_api_server_example/readme.md (100%) rename contributing/samples/{live => }/live_bidi_debug_utils/pcm_audio_player.py (100%) rename contributing/samples/{integrations/pubsub => live_bidi_streaming_multi_agent}/__init__.py (100%) rename contributing/samples/{live => }/live_bidi_streaming_multi_agent/agent.py (100%) rename contributing/samples/{live => }/live_bidi_streaming_multi_agent/readme.md (100%) rename contributing/samples/{live => }/live_bidi_streaming_parallel_tools_agent/README.md (100%) rename contributing/samples/{integrations/rag_agent => live_bidi_streaming_parallel_tools_agent}/__init__.py (100%) rename contributing/samples/{live => }/live_bidi_streaming_parallel_tools_agent/agent.py (100%) rename contributing/samples/{integrations/sandbox_computer_use => live_bidi_streaming_single_agent}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{live => }/live_bidi_streaming_single_agent/agent.py (100%) rename contributing/samples/{live => }/live_bidi_streaming_single_agent/readme.md (100%) rename contributing/samples/{integrations/spanner => live_bidi_streaming_tools_agent}/__init__.py (100%) rename contributing/samples/{live => }/live_bidi_streaming_tools_agent/agent.py (99%) rename contributing/samples/{live => }/live_bidi_streaming_tools_agent/readme.md (100%) rename contributing/samples/{integrations/spanner_admin => live_tool_callbacks_agent}/__init__.py (100%) rename contributing/samples/{live => }/live_tool_callbacks_agent/agent.py (100%) rename contributing/samples/{live => }/live_tool_callbacks_agent/readme.md (100%) rename contributing/samples/{environment_and_skills => }/local_environment/README.md (100%) rename contributing/samples/{integrations/spanner_rag_agent => local_environment}/__init__.py (100%) rename contributing/samples/{environment_and_skills => }/local_environment/agent.py (100%) rename contributing/samples/{environment_and_skills => }/local_environment_skill/README.md (100%) rename contributing/samples/{integrations/toolbox_agent => local_environment_skill}/__init__.py (100%) rename contributing/samples/{environment_and_skills => }/local_environment_skill/agent.py (100%) rename contributing/samples/{environment_and_skills => }/local_environment_skill/skills/weather-skill/SKILL.md (100%) rename contributing/samples/{environment_and_skills => }/local_environment_skill/skills/weather-skill/references/weather_info.md (100%) rename contributing/samples/{environment_and_skills => }/local_environment_skill/skills/weather-skill/scripts/get_humidity.py (100%) create mode 100644 contributing/samples/logprobs/README.md rename contributing/samples/{legacy_workflows/non_llm_sequential => logprobs}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{core => }/logprobs/agent.py (84%) rename contributing/samples/{legacy_workflows/simple_sequential_agent => manual_ollama_test}/__init__.py (100%) rename contributing/samples/{models => }/manual_ollama_test/agent.py (100%) rename contributing/samples/{mcp => }/mcp_dynamic_header_agent/README.md (100%) rename contributing/samples/{legacy_workflows/workflow_agent_seq => mcp_dynamic_header_agent}/__init__.py (100%) rename contributing/samples/{mcp => }/mcp_dynamic_header_agent/agent.py (97%) rename contributing/samples/{mcp => }/mcp_dynamic_header_agent/header_server.py (100%) rename contributing/samples/{mcp => }/mcp_in_agent_tool_remote/README.md (100%) rename contributing/samples/{live/live_bidi_streaming_multi_agent => mcp_in_agent_tool_remote}/__init__.py (100%) rename contributing/samples/{mcp => }/mcp_in_agent_tool_remote/agent.py (97%) rename contributing/samples/{mcp => }/mcp_in_agent_tool_stdio/README.md (100%) rename contributing/samples/{live/live_bidi_streaming_parallel_tools_agent => mcp_in_agent_tool_stdio}/__init__.py (100%) rename contributing/samples/{mcp => }/mcp_in_agent_tool_stdio/agent.py (97%) rename contributing/samples/{mcp => }/mcp_postgres_agent/README.md (100%) rename contributing/samples/{live/live_bidi_streaming_single_agent => mcp_postgres_agent}/__init__.py (100%) rename contributing/samples/{mcp => }/mcp_postgres_agent/agent.py (98%) rename contributing/samples/{live/live_bidi_streaming_tools_agent => mcp_progress_callback_agent}/__init__.py (100%) rename contributing/samples/{mcp => }/mcp_progress_callback_agent/agent.py (99%) rename contributing/samples/{mcp => }/mcp_progress_callback_agent/mock_progress_server.py (100%) rename contributing/samples/{mcp => }/mcp_server_side_sampling/README.md (99%) rename contributing/samples/{live/live_tool_callbacks_agent => mcp_server_side_sampling}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{mcp => }/mcp_server_side_sampling/agent.py (100%) rename contributing/samples/{mcp => }/mcp_server_side_sampling/mcp_server.py (100%) rename contributing/samples/{mcp => }/mcp_service_account_agent/README.md (100%) rename contributing/samples/{mcp/mcp_dynamic_header_agent => mcp_service_account_agent}/__init__.py (100%) rename contributing/samples/{mcp => }/mcp_service_account_agent/agent.py (99%) rename contributing/samples/{mcp => }/mcp_sse_agent/README.md (100%) rename contributing/samples/{mcp/mcp_in_agent_tool_remote => mcp_sse_agent}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{mcp => }/mcp_sse_agent/agent.py (98%) rename contributing/samples/{mcp => }/mcp_sse_agent/filesystem_server.py (100%) rename contributing/samples/{mcp => }/mcp_stdio_notion_agent/README.md (100%) rename contributing/samples/{mcp/mcp_in_agent_tool_stdio => mcp_stdio_notion_agent}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{mcp => }/mcp_stdio_notion_agent/agent.py (98%) rename contributing/samples/{mcp/mcp_postgres_agent => mcp_stdio_server_agent}/__init__.py (100%) rename contributing/samples/{mcp => }/mcp_stdio_server_agent/agent.py (98%) rename contributing/samples/{mcp => }/mcp_streamablehttp_agent/README.md (100%) rename contributing/samples/{mcp/mcp_progress_callback_agent => mcp_streamablehttp_agent}/__init__.py (100%) rename contributing/samples/{mcp => }/mcp_streamablehttp_agent/agent.py (98%) rename contributing/samples/{mcp => }/mcp_streamablehttp_agent/filesystem_server.py (100%) rename contributing/samples/{mcp => }/mcp_toolset_auth/README.md (100%) rename contributing/samples/{mcp/mcp_server_side_sampling => mcp_toolset_auth}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{mcp => }/mcp_toolset_auth/agent.py (98%) rename contributing/samples/{mcp => }/mcp_toolset_auth/main.py (100%) rename contributing/samples/{mcp => }/mcp_toolset_auth/oauth_mcp_server.py (100%) rename contributing/samples/{mcp/mcp_service_account_agent => memory}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{context_management => }/memory/agent.py (97%) rename contributing/samples/{context_management => }/memory/main.py (100%) rename contributing/samples/{context_management => }/migrate_session_db/README.md (100%) rename contributing/samples/{models/hello_world_litellm => migrate_session_db}/__init__.py (100%) rename contributing/samples/{context_management => }/migrate_session_db/agent.py (99%) rename contributing/samples/{context_management => }/migrate_session_db/dnd_sessions.db (100%) rename contributing/samples/{context_management => }/migrate_session_db/main.py (100%) rename contributing/samples/{context_management => }/migrate_session_db/sample-output/alembic.ini (100%) rename contributing/samples/{context_management => }/migrate_session_db/sample-output/alembic/README (100%) rename contributing/samples/{context_management => }/migrate_session_db/sample-output/alembic/env.py (100%) rename contributing/samples/{context_management => }/migrate_session_db/sample-output/alembic/script.py.mako (100%) rename contributing/samples/{context_management => }/migrate_session_db/sessions.db (100%) delete mode 100644 contributing/samples/models/litellm_inline_tool_call/__init__.py delete mode 100644 contributing/samples/multi_agent/hello_world_ma/tests/roll_die_and_check_prime.json delete mode 100644 contributing/samples/multi_agent/single_turn_sub_agent/README.md delete mode 100644 contributing/samples/multi_agent/single_turn_sub_agent/agent.py delete mode 100644 contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000.json delete mode 100644 contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000_large.json delete mode 100644 contributing/samples/multi_agent/single_turn_sub_agent/tests/go.json delete mode 100644 contributing/samples/multi_agent/sub_agents/README.md delete mode 100644 contributing/samples/multi_agent/sub_agents/agent.py delete mode 100644 contributing/samples/multi_agent/sub_agents/tests/check_and_close.json delete mode 100644 contributing/samples/multi_agent/sub_agents/tests/check_status.json delete mode 100644 contributing/samples/multi_agent/task_sub_agent/README.md delete mode 100644 contributing/samples/multi_agent/task_sub_agent/agent.py delete mode 100644 contributing/samples/multi_agent/task_sub_agent/tests/10_burgers.json delete mode 100644 contributing/samples/multi_agent/task_sub_agent/tests/3_burgers.json delete mode 100644 contributing/samples/multi_agent/task_sub_agent/tests/3_burgers_and_credit_card.json delete mode 100644 contributing/samples/multi_agent/task_sub_agent/tests/credit_card.json delete mode 100644 contributing/samples/multi_agent/task_sub_agent/tests/order_food.json delete mode 100644 contributing/samples/multi_agent/three_layer_transfer/README.md delete mode 100644 contributing/samples/multi_agent/three_layer_transfer/agent.py rename contributing/samples/{multi_agent => }/multi_agent_basic_config/README.md (100%) rename contributing/samples/{multi_agent => }/multi_agent_basic_config/code_tutor_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_basic_config/math_tutor_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_basic_config/root_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_llm_config/README.md (100%) rename contributing/samples/{multi_agent => }/multi_agent_llm_config/__init__.py (77%) rename contributing/samples/{multi_agent => }/multi_agent_llm_config/prime_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_llm_config/roll_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_llm_config/root_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_loop_config/README.md (100%) rename contributing/samples/{multi_agent => }/multi_agent_loop_config/loop_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_loop_config/root_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_loop_config/writer_agents/critic_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_loop_config/writer_agents/initial_writer_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_loop_config/writer_agents/refiner_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_seq_config/README.md (100%) rename contributing/samples/{multi_agent => }/multi_agent_seq_config/root_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_seq_config/sub_agents/code_refactorer_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_seq_config/sub_agents/code_reviewer_agent.yaml (100%) rename contributing/samples/{multi_agent => }/multi_agent_seq_config/sub_agents/code_writer_agent.yaml (100%) delete mode 100644 contributing/samples/multimodal/multimodal/README.md delete mode 100644 contributing/samples/multimodal/multimodal/agent.py rename contributing/samples/{mcp/mcp_sse_agent => multimodal_tool_results}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{multimodal => }/multimodal_tool_results/agent.py (97%) rename contributing/samples/{mcp/mcp_stdio_notion_agent => non_llm_sequential}/__init__.py (100%) rename contributing/samples/{legacy_workflows => }/non_llm_sequential/agent.py (94%) rename contributing/samples/{integrations => }/oauth2_client_credentials/README.md (100%) rename contributing/samples/{mcp/mcp_stdio_server_agent => oauth2_client_credentials}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{integrations => }/oauth2_client_credentials/agent.py (100%) rename contributing/samples/{integrations => }/oauth2_client_credentials/main.py (100%) rename contributing/samples/{integrations => }/oauth2_client_credentials/oauth2_test_server.py (100%) rename contributing/samples/{integrations => }/oauth_calendar_agent/README.md (100%) rename contributing/samples/{mcp/mcp_streamablehttp_agent => oauth_calendar_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/oauth_calendar_agent/agent.py (99%) rename contributing/samples/{tools => }/output_schema_with_tools/README.md (100%) rename contributing/samples/{mcp/mcp_toolset_auth => output_schema_with_tools}/__init__.py (100%) rename contributing/samples/{tools => }/output_schema_with_tools/agent.py (99%) rename contributing/samples/{tools => }/parallel_functions/README.md (100%) rename contributing/samples/{models/hello_world_ollama => parallel_functions}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{tools => }/parallel_functions/agent.py (96%) rename contributing/samples/{plugin => }/plugin_basic/README.md (100%) rename contributing/samples/{plugin => }/plugin_basic/__init__.py (100%) rename contributing/samples/{plugin => }/plugin_basic/count_plugin.py (100%) rename contributing/samples/{plugin => }/plugin_basic/main.py (98%) rename contributing/samples/{models/litellm_streaming => plugin_debug_logging}/__init__.py (100%) rename contributing/samples/{plugin => }/plugin_debug_logging/agent.py (99%) rename contributing/samples/{plugin => }/plugin_reflect_tool_retry/README.md (100%) rename contributing/samples/{models/litellm_structured_output => plugin_reflect_tool_retry/basic}/__init__.py (100%) rename contributing/samples/{plugin => }/plugin_reflect_tool_retry/basic/agent.py (98%) rename contributing/samples/{models/litellm_with_fallback_models => plugin_reflect_tool_retry/hallucinating_func_name}/__init__.py (100%) rename contributing/samples/{plugin => }/plugin_reflect_tool_retry/hallucinating_func_name/agent.py (98%) rename contributing/samples/{context_management => }/postgres_session_service/README.md (100%) rename contributing/samples/{models/hello_world_litellm_add_function_to_prompt => postgres_session_service}/__init__.py (100%) rename contributing/samples/{context_management => }/postgres_session_service/agent.py (97%) rename contributing/samples/{context_management => }/postgres_session_service/compose.yml (100%) rename contributing/samples/{context_management => }/postgres_session_service/main.py (100%) rename contributing/samples/{integrations => }/pubsub/README.md (100%) rename contributing/samples/{models/manual_ollama_test => pubsub}/__init__.py (100%) rename contributing/samples/{integrations => }/pubsub/agent.py (99%) rename contributing/samples/{tools => }/pydantic_argument/README.md (100%) rename contributing/samples/{multi_agent/hello_world_ma => pydantic_argument}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{tools => }/pydantic_argument/agent.py (100%) rename contributing/samples/{tools => }/pydantic_argument/main.py (100%) rename contributing/samples/{multi_agent/sub_agents => quickstart}/__init__.py (100%) rename contributing/samples/{core => }/quickstart/agent.py (91%) rename contributing/samples/{multi_agent/three_layer_transfer => rag_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/rag_agent/agent.py (98%) rename contributing/samples/{multimodal/generate_image => rewind_session}/__init__.py (100%) rename contributing/samples/{context_management => }/rewind_session/agent.py (98%) rename contributing/samples/{context_management => }/rewind_session/main.py (100%) rename contributing/samples/{core => }/runner_debug_example/README.md (97%) rename contributing/samples/{core => }/runner_debug_example/__init__.py (100%) rename contributing/samples/{core => }/runner_debug_example/agent.py (54%) rename contributing/samples/{core => }/runner_debug_example/main.py (94%) rename contributing/samples/{multimodal/multimodal => sandbox_computer_use}/__init__.py (100%) rename contributing/samples/{integrations => }/sandbox_computer_use/agent.py (86%) rename contributing/samples/{integrations => }/sandbox_computer_use/main.py (92%) rename contributing/samples/{context_management => }/session_state_agent/README.md (100%) rename contributing/samples/{multimodal/multimodal_tool_results => session_state_agent}/__init__.py (100%) rename contributing/samples/{context_management => }/session_state_agent/agent.py (100%) create mode 100644 contributing/samples/session_state_agent/input.json rename contributing/samples/{patterns/context_offloading_with_artifact => simple_sequential_agent}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{legacy_workflows => }/simple_sequential_agent/agent.py (98%) rename contributing/samples/{patterns/fields_planner => skills_agent}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{environment_and_skills => }/skills_agent/agent.py (99%) rename contributing/samples/{environment_and_skills => }/skills_agent/skills/weather-skill/SKILL.md (100%) rename contributing/samples/{environment_and_skills/skills => skills_agent}/skills/weather-skill/references/weather_info.md (100%) rename contributing/samples/{environment_and_skills/skills => skills_agent}/skills/weather-skill/scripts/get_humidity.py (100%) rename contributing/samples/{patterns/json_passing_agent => skills_agent_gcs}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{environment_and_skills => }/skills_agent_gcs/agent.py (100%) rename contributing/samples/{integrations => }/slack_agent/agent.py (100%) rename contributing/samples/{integrations => }/spanner/README.md (100%) rename contributing/samples/{patterns/workflow_triage => spanner}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{integrations => }/spanner/agent.py (99%) rename contributing/samples/{integrations => }/spanner_admin/README.md (100%) rename contributing/samples/{plugin/plugin_debug_logging => spanner_admin}/__init__.py (100%) rename contributing/samples/{integrations => }/spanner_admin/agent.py (99%) rename contributing/samples/{integrations => }/spanner_rag_agent/README.md (100%) rename contributing/samples/{integrations => }/spanner_rag_agent/Spanner_RAG_Sample_Agent.png (100%) rename contributing/samples/{plugin/plugin_reflect_tool_retry/basic => spanner_rag_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/spanner_rag_agent/agent.py (99%) rename contributing/samples/{context_management => }/static_instruction/README.md (100%) rename contributing/samples/{context_management => }/static_instruction/__init__.py (100%) rename contributing/samples/{context_management => }/static_instruction/agent.py (99%) rename contributing/samples/{context_management => }/static_instruction/main.py (100%) rename contributing/samples/{multimodal => }/static_non_text_content/README.md (100%) rename contributing/samples/{multimodal => }/static_non_text_content/__init__.py (100%) rename contributing/samples/{multimodal => }/static_non_text_content/agent.py (99%) rename contributing/samples/{multimodal => }/static_non_text_content/main.py (100%) rename contributing/samples/{integrations/gepa => sub_agents_config}/__init__.py (100%) rename contributing/samples/{multi_agent => }/sub_agents_config/life_agent.py (100%) rename contributing/samples/{multi_agent => }/sub_agents_config/root_agent.yaml (100%) rename contributing/samples/{multi_agent => }/sub_agents_config/work_agent.yaml (100%) create mode 100755 contributing/samples/telemetry/agent.py create mode 100755 contributing/samples/telemetry/main.py rename contributing/samples/{plugin/plugin_reflect_tool_retry/hallucinating_func_name => token_usage}/__init__.py (100%) mode change 100644 => 100755 create mode 100755 contributing/samples/token_usage/agent.py create mode 100755 contributing/samples/token_usage/main.py rename contributing/samples/{tools => }/tool_agent_tool_config/root_agent.yaml (100%) rename contributing/samples/{tools => }/tool_agent_tool_config/summarizer_agent.yaml (100%) rename contributing/samples/{tools => }/tool_agent_tool_config/web_search_agent.yaml (100%) rename contributing/samples/{tools => }/tool_builtin_config/root_agent.yaml (100%) rename contributing/samples/{multi_agent/sub_agents_config => tool_functions_config}/__init__.py (100%) rename contributing/samples/{tools => }/tool_functions_config/root_agent.yaml (100%) rename contributing/samples/{tools => }/tool_functions_config/tools.py (100%) rename contributing/samples/{hitl => }/tool_human_in_the_loop_config/README.md (100%) rename contributing/samples/{tools/tool_functions_config => tool_human_in_the_loop_config}/__init__.py (100%) rename contributing/samples/{hitl => }/tool_human_in_the_loop_config/root_agent.yaml (100%) rename contributing/samples/{hitl => }/tool_human_in_the_loop_config/tools.py (100%) rename contributing/samples/{mcp => }/tool_mcp_stdio_notion_config/README.md (100%) rename contributing/samples/{mcp => }/tool_mcp_stdio_notion_config/root_agent.yaml (100%) rename contributing/samples/{integrations => }/toolbox_agent/README.md (100%) rename contributing/samples/{tools/agent_tool_with_grounding_metadata => toolbox_agent}/__init__.py (100%) rename contributing/samples/{integrations => }/toolbox_agent/agent.py (96%) rename contributing/samples/{integrations => }/toolbox_agent/tool_box.db (100%) rename contributing/samples/{integrations => }/toolbox_agent/tools.yaml (100%) delete mode 100644 contributing/samples/tools/function_tools/README.md delete mode 100644 contributing/samples/tools/function_tools/agent.py delete mode 100644 contributing/samples/tools/function_tools/tests/a_random_number.json delete mode 100644 contributing/samples/tools/function_tools/tests/a_random_number_and_check_even.json delete mode 100644 contributing/samples/tools/function_tools/tests/random_number_and_is_5_even.json delete mode 100644 contributing/samples/tools/long_running_functions/README.md delete mode 100644 contributing/samples/tools/long_running_functions/__init__.py delete mode 100644 contributing/samples/tools/long_running_functions/agent.py delete mode 100644 contributing/samples/tools/long_running_functions/tests/export_to_csv.json delete mode 100644 contributing/samples/tools/long_running_functions/tests/export_to_csv_and_json.json delete mode 100644 contributing/samples/tools/output_schema_with_tools/__init__.py delete mode 100644 contributing/samples/tools/parallel_functions/__init__.py delete mode 100644 contributing/samples/tools/parallel_functions/tests/test_all_tools.json delete mode 100644 contributing/samples/tools/parallel_functions/tests/test_parallel_mixed.json delete mode 100644 contributing/samples/tools/parallel_functions/tests/test_parallel_weather.json delete mode 100644 contributing/samples/tools/pydantic_argument/__init__.py delete mode 100644 contributing/samples/tools/pydantic_argument/tests/test_create_company.json delete mode 100644 contributing/samples/tools/pydantic_argument/tests/test_create_user.json delete mode 100644 contributing/samples/tools/pydantic_argument/tests/test_create_user_with_prefs.json rename contributing/samples/{code_execution => }/vertex_code_execution/README.md (100%) rename contributing/samples/{tools/built_in_multi_tools => vertex_code_execution}/__init__.py (100%) rename contributing/samples/{code_execution => }/vertex_code_execution/agent.py (99%) rename contributing/samples/{legacy_workflows => }/workflow_agent_seq/README.md (100%) rename contributing/samples/{tools/function_tools => workflow_agent_seq}/__init__.py (100%) rename contributing/samples/{legacy_workflows => }/workflow_agent_seq/agent.py (98%) rename contributing/samples/{legacy_workflows => }/workflow_agent_seq/main.py (100%) rename contributing/samples/{legacy_workflows => }/workflow_agent_seq/sample.output (100%) rename contributing/samples/{patterns => }/workflow_triage/README.md (100%) rename contributing/samples/{tools/hello_world_stream_fc_args => workflow_triage}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{patterns => }/workflow_triage/agent.py (98%) rename contributing/samples/{patterns => }/workflow_triage/execution_agent.py (97%) delete mode 100644 contributing/samples/workflows/auth_api_key/README.md delete mode 100644 contributing/samples/workflows/auth_api_key/agent.py delete mode 100644 contributing/samples/workflows/auth_api_key/tests/go.json delete mode 100644 contributing/samples/workflows/auth_oauth/README.md delete mode 100644 contributing/samples/workflows/auth_oauth/__init__.py delete mode 100644 contributing/samples/workflows/auth_oauth/agent.py delete mode 100644 contributing/samples/workflows/dynamic_fan_out_fan_in/README.md delete mode 100644 contributing/samples/workflows/dynamic_fan_out_fan_in/agent.py delete mode 100644 contributing/samples/workflows/dynamic_nodes/README.md delete mode 100644 contributing/samples/workflows/dynamic_nodes/agent.py delete mode 100644 contributing/samples/workflows/dynamic_nodes/tests/flower.json delete mode 100644 contributing/samples/workflows/fan_out_fan_in/README.md delete mode 100644 contributing/samples/workflows/fan_out_fan_in/agent.py delete mode 100644 contributing/samples/workflows/fan_out_fan_in/tests/go.json delete mode 100644 contributing/samples/workflows/loop/README.md delete mode 100644 contributing/samples/workflows/loop/agent.py delete mode 100644 contributing/samples/workflows/loop/tests/computer.json delete mode 100644 contributing/samples/workflows/loop/tests/flower.json delete mode 100644 contributing/samples/workflows/loop_config/README.md delete mode 100644 contributing/samples/workflows/loop_config/agent.py delete mode 100644 contributing/samples/workflows/loop_config/evaluate_headline.yaml delete mode 100644 contributing/samples/workflows/loop_config/generate_headline.yaml delete mode 100644 contributing/samples/workflows/loop_config/root_agent.yaml delete mode 100644 contributing/samples/workflows/loop_self/README.md delete mode 100644 contributing/samples/workflows/loop_self/agent.py delete mode 100644 contributing/samples/workflows/loop_self/tests/3.json delete mode 100644 contributing/samples/workflows/message/README.md delete mode 100644 contributing/samples/workflows/message/agent.py delete mode 100644 contributing/samples/workflows/message/tests/go.json delete mode 100644 contributing/samples/workflows/multi_triggers/README.md delete mode 100644 contributing/samples/workflows/multi_triggers/agent.py delete mode 100644 contributing/samples/workflows/multi_triggers/tests/go.json delete mode 100644 contributing/samples/workflows/nested_workflow/README.md delete mode 100644 contributing/samples/workflows/nested_workflow/__init__.py delete mode 100644 contributing/samples/workflows/nested_workflow/agent.py delete mode 100644 contributing/samples/workflows/nested_workflow/tests/1984.json delete mode 100644 contributing/samples/workflows/node_output/README.md delete mode 100644 contributing/samples/workflows/node_output/agent.py delete mode 100644 contributing/samples/workflows/node_output/tests/go.json delete mode 100644 contributing/samples/workflows/parallel_worker/README.md delete mode 100644 contributing/samples/workflows/parallel_worker/agent.py delete mode 100644 contributing/samples/workflows/parallel_worker/tests/flower.json delete mode 100644 contributing/samples/workflows/request_input/README.md delete mode 100644 contributing/samples/workflows/request_input/agent.py delete mode 100644 contributing/samples/workflows/request_input/tests/phone_broke.json delete mode 100644 contributing/samples/workflows/request_input/tests/phone_broke_reject.json delete mode 100644 contributing/samples/workflows/request_input_advanced/README.md delete mode 100644 contributing/samples/workflows/request_input_advanced/agent.py delete mode 100644 contributing/samples/workflows/request_input_advanced/tests/2_sick_days.json delete mode 100644 contributing/samples/workflows/request_input_rerun/README.md delete mode 100644 contributing/samples/workflows/request_input_rerun/agent.py delete mode 100644 contributing/samples/workflows/request_input_rerun/tests/phone_broke.json delete mode 100644 contributing/samples/workflows/retry/README.md delete mode 100644 contributing/samples/workflows/retry/agent.py delete mode 100644 contributing/samples/workflows/retry/tests/go.json delete mode 100644 contributing/samples/workflows/route/README.md delete mode 100644 contributing/samples/workflows/route/agent.py delete mode 100644 contributing/samples/workflows/route/tests/who_are_you.json delete mode 100644 contributing/samples/workflows/sequence/README.md delete mode 100644 contributing/samples/workflows/sequence/__init__.py delete mode 100644 contributing/samples/workflows/sequence/agent.py delete mode 100644 contributing/samples/workflows/sequence/tests/go.json delete mode 100644 contributing/samples/workflows/state/README.md delete mode 100644 contributing/samples/workflows/state/agent.py delete mode 100644 contributing/samples/workflows/state/tests/go.json delete mode 100644 contributing/samples/workflows/use_as_output/README.md delete mode 100644 contributing/samples/workflows/use_as_output/agent.py delete mode 100644 contributing/samples/workflows/use_as_output/tests/go.json delete mode 100644 docs/design/cli/api_server/abort.md delete mode 100644 docs/guides/cli/api_server/abort.md delete mode 100755 scripts/check_new_py_files.sh delete mode 100644 scripts/generate_agent_config_schema.py delete mode 100644 scripts/run_antigravity.py create mode 100755 scripts/unittests.sh delete mode 100644 src/google/adk/agents/llm/__init__.py delete mode 100644 src/google/adk/agents/llm/task/__init__.py delete mode 100644 src/google/adk/agents/llm/task/_finish_task_tool.py delete mode 100644 src/google/adk/agents/llm/task/_task_models.py delete mode 100644 src/google/adk/cli/agent_test_runner.py delete mode 100644 src/google/adk/cli/api_server.py delete mode 100644 src/google/adk/cli/browser/chunk-257HQBMN.js delete mode 100644 src/google/adk/cli/browser/chunk-27SWUPRL.js delete mode 100644 src/google/adk/cli/browser/chunk-2DLZXFEQ.js delete mode 100644 src/google/adk/cli/browser/chunk-2LZ42ZOW.js rename src/google/adk/cli/browser/{chunk-DM36II44.js => chunk-2MVVEOIQ.js} (89%) rename src/google/adk/cli/browser/{chunk-Q6H4XMU7.js => chunk-2VKC3BHH.js} (93%) delete mode 100644 src/google/adk/cli/browser/chunk-3NJNOY56.js delete mode 100644 src/google/adk/cli/browser/chunk-3YZ77ADE.js delete mode 100644 src/google/adk/cli/browser/chunk-46YSBSFN.js delete mode 100644 src/google/adk/cli/browser/chunk-4R6SYGKS.js rename src/google/adk/cli/browser/{chunk-Y7O3NHKW.js => chunk-4S2CIXCW.js} (91%) delete mode 100644 src/google/adk/cli/browser/chunk-5PR7OWPD.js rename src/google/adk/cli/browser/{chunk-R6ZR5LUR.js => chunk-5VJ6OSLK.js} (87%) delete mode 100644 src/google/adk/cli/browser/chunk-6UL33SIT.js delete mode 100644 src/google/adk/cli/browser/chunk-75WMU75S.js rename src/google/adk/cli/browser/{chunk-URGIGLGR.js => chunk-7P7JIWGK.js} (89%) delete mode 100644 src/google/adk/cli/browser/chunk-7UW26RYS.js rename src/google/adk/cli/browser/{chunk-SXB5AC5V.js => chunk-A2SOFJNC.js} (95%) delete mode 100644 src/google/adk/cli/browser/chunk-APNCZOFE.js delete mode 100644 src/google/adk/cli/browser/chunk-ASJUXEUE.js delete mode 100644 src/google/adk/cli/browser/chunk-B2DSW4QB.js delete mode 100644 src/google/adk/cli/browser/chunk-BDIW4D5I.js rename src/google/adk/cli/browser/{chunk-IT263FCL.js => chunk-CD6LWQYN.js} (94%) delete mode 100644 src/google/adk/cli/browser/chunk-DIR2LWLP.js delete mode 100644 src/google/adk/cli/browser/chunk-DMWOYWYQ.js delete mode 100644 src/google/adk/cli/browser/chunk-DRBE27N3.js rename src/google/adk/cli/browser/{chunk-BPUQWVAT.js => chunk-DTNGXRUJ.js} (92%) delete mode 100644 src/google/adk/cli/browser/chunk-EGBSMT36.js rename src/google/adk/cli/browser/{chunk-2SRK2U7X.js => chunk-EN473UE3.js} (99%) delete mode 100644 src/google/adk/cli/browser/chunk-F57TI45K.js delete mode 100644 src/google/adk/cli/browser/chunk-FDH623K7.js rename src/google/adk/cli/browser/{chunk-ET35KXUM.js => chunk-GGOEHXD2.js} (95%) rename src/google/adk/cli/browser/{chunk-HTWWQBR6.js => chunk-GLGRLUIJ.js} (99%) delete mode 100644 src/google/adk/cli/browser/chunk-GP6TCC26.js rename src/google/adk/cli/browser/{chunk-P4MFJI72.js => chunk-HCQ2TSHS.js} (93%) delete mode 100644 src/google/adk/cli/browser/chunk-HD4LLD2O.js delete mode 100644 src/google/adk/cli/browser/chunk-HDC4PFPG.js delete mode 100644 src/google/adk/cli/browser/chunk-I4UDKKN5.js delete mode 100644 src/google/adk/cli/browser/chunk-ICVZGLGO.js delete mode 100644 src/google/adk/cli/browser/chunk-IHY23QJP.js delete mode 100644 src/google/adk/cli/browser/chunk-J4R5U4YL.js delete mode 100644 src/google/adk/cli/browser/chunk-JDPVSVO4.js delete mode 100644 src/google/adk/cli/browser/chunk-JHZIBEJC.js delete mode 100644 src/google/adk/cli/browser/chunk-JNY2YWG7.js delete mode 100644 src/google/adk/cli/browser/chunk-JRNAXTJ7.js rename src/google/adk/cli/browser/{chunk-4VDZU6IO.js => chunk-JUJUP2UX.js} (92%) delete mode 100644 src/google/adk/cli/browser/chunk-JW2YJHYO.js delete mode 100644 src/google/adk/cli/browser/chunk-LA76DWZL.js delete mode 100644 src/google/adk/cli/browser/chunk-LI24J5PW.js delete mode 100644 src/google/adk/cli/browser/chunk-N5S45BK4.js delete mode 100644 src/google/adk/cli/browser/chunk-NALL4A3P.js rename src/google/adk/cli/browser/{chunk-3BJ4SYVH.js => chunk-NK4C5UIR.js} (87%) delete mode 100644 src/google/adk/cli/browser/chunk-NMKTPNXE.js delete mode 100644 src/google/adk/cli/browser/chunk-NQKWI5EB.js delete mode 100644 src/google/adk/cli/browser/chunk-PM3FQFTD.js rename src/google/adk/cli/browser/{chunk-6CJBO2JX.js => chunk-PR5T53UC.js} (97%) delete mode 100644 src/google/adk/cli/browser/chunk-PRKFGJVH.js delete mode 100644 src/google/adk/cli/browser/chunk-QFMJV7VH.js delete mode 100644 src/google/adk/cli/browser/chunk-QGHEW6NO.js delete mode 100644 src/google/adk/cli/browser/chunk-QMDHABEH.js delete mode 100644 src/google/adk/cli/browser/chunk-RCKFX6QR.js delete mode 100644 src/google/adk/cli/browser/chunk-RMXJBC7V.js delete mode 100644 src/google/adk/cli/browser/chunk-S22PTQH2.js delete mode 100644 src/google/adk/cli/browser/chunk-SMT27N2F.js delete mode 100644 src/google/adk/cli/browser/chunk-ST54LLJ3.js delete mode 100644 src/google/adk/cli/browser/chunk-T2UY75BD.js delete mode 100644 src/google/adk/cli/browser/chunk-T3Q3QCCV.js delete mode 100644 src/google/adk/cli/browser/chunk-TIJO3EOA.js delete mode 100644 src/google/adk/cli/browser/chunk-TNJPXCAB.js delete mode 100644 src/google/adk/cli/browser/chunk-TNYN2TVW.js delete mode 100644 src/google/adk/cli/browser/chunk-TPDTRWWV.js delete mode 100644 src/google/adk/cli/browser/chunk-UWBTGTN5.js delete mode 100644 src/google/adk/cli/browser/chunk-V2DCVTQX.js delete mode 100644 src/google/adk/cli/browser/chunk-VDPKVNDJ.js rename src/google/adk/cli/browser/{chunk-4LH47YYI.js => chunk-VUI6RO2X.js} (86%) delete mode 100644 src/google/adk/cli/browser/chunk-W67OU2Q2.js create mode 100644 src/google/adk/cli/browser/chunk-W7GRJBO5.js delete mode 100644 src/google/adk/cli/browser/chunk-W7PRDKNL.js delete mode 100644 src/google/adk/cli/browser/chunk-WAKWL6X3.js delete mode 100644 src/google/adk/cli/browser/chunk-WBLSVR3V.js delete mode 100644 src/google/adk/cli/browser/chunk-WLB2FJ7K.js delete mode 100644 src/google/adk/cli/browser/chunk-WR6HISGZ.js delete mode 100644 src/google/adk/cli/browser/chunk-WXI2IBAH.js rename src/google/adk/cli/browser/{chunk-AQDQIDAM.js => chunk-WXV43367.js} (97%) delete mode 100644 src/google/adk/cli/browser/chunk-WZIWL22C.js delete mode 100644 src/google/adk/cli/browser/chunk-XE4A3JWW.js delete mode 100644 src/google/adk/cli/browser/chunk-XMBKBASC.js delete mode 100644 src/google/adk/cli/browser/chunk-XULIXUQL.js delete mode 100644 src/google/adk/cli/browser/chunk-YVVLWU7S.js delete mode 100644 src/google/adk/cli/browser/chunk-ZCQFE5RP.js delete mode 100644 src/google/adk/cli/browser/chunk-ZMOC4H7T.js delete mode 100644 src/google/adk/cli/browser/chunk-ZX24QP2W.js delete mode 100644 src/google/adk/cli/browser/main-3CUQG2IN.js create mode 100644 src/google/adk/cli/browser/main-TCIQIOZ3.js create mode 100644 src/google/adk/cli/browser/prism-dark.css create mode 100644 src/google/adk/cli/browser/prism-light.css create mode 100644 src/google/adk/cli/browser/styles-2ORK6PRA.css delete mode 100644 src/google/adk/cli/browser/styles-LBC36Z6S.css delete mode 100644 src/google/adk/cli/dev_server.py delete mode 100644 src/google/adk/cli/utils/graph_serialization.py delete mode 100644 src/google/adk/cli/utils/graph_visualization.py delete mode 100644 src/google/adk/evaluation/rubric_based_multi_turn_trajectory_evaluator.py delete mode 100644 src/google/adk/events/_node_path_builder.py delete mode 100644 src/google/adk/events/request_input.py delete mode 100644 src/google/adk/integrations/bigquery/__init__.py delete mode 100644 src/google/adk/integrations/bigquery/bigquery_credentials.py delete mode 100644 src/google/adk/integrations/bigquery/bigquery_toolset.py delete mode 100644 src/google/adk/integrations/bigquery/client.py delete mode 100644 src/google/adk/integrations/bigquery/config.py delete mode 100644 src/google/adk/integrations/bigquery/data_insights_tool.py delete mode 100644 src/google/adk/integrations/bigquery/metadata_tool.py delete mode 100644 src/google/adk/integrations/bigquery/query_tool.py delete mode 100644 src/google/adk/integrations/bigquery/search_tool.py delete mode 100644 src/google/adk/labs/README.md delete mode 100644 src/google/adk/labs/__init__.py delete mode 100644 src/google/adk/labs/openai/README.md delete mode 100644 src/google/adk/labs/openai/__init__.py delete mode 100644 src/google/adk/labs/openai/_openai_llm.py delete mode 100644 src/google/adk/plugins/auto_tracing_helpers.py delete mode 100644 src/google/adk/plugins/auto_tracing_plugin.py delete mode 100644 src/google/adk/telemetry/_agent_engine.py delete mode 100644 src/google/adk/telemetry/_token_usage.py delete mode 100644 src/google/adk/telemetry/node_tracing.py delete mode 100644 src/google/adk/tools/_request_input_tool.py delete mode 100644 src/google/adk/tools/environment/_edit_file_tool.py delete mode 100644 src/google/adk/tools/environment/_execute_tool.py delete mode 100644 src/google/adk/tools/environment/_read_file_tool.py delete mode 100644 src/google/adk/tools/environment/_utils.py delete mode 100644 src/google/adk/tools/environment/_write_file_tool.py delete mode 100644 src/google/adk/utils/_dependency.py delete mode 100644 src/google/adk/utils/_serialized_base_model.py delete mode 100644 src/google/adk/workflow/__init__.py delete mode 100644 src/google/adk/workflow/_base_node.py delete mode 100644 src/google/adk/workflow/_dynamic_node_scheduler.py delete mode 100644 src/google/adk/workflow/_errors.py delete mode 100644 src/google/adk/workflow/_function_node.py delete mode 100644 src/google/adk/workflow/_graph.py delete mode 100644 src/google/adk/workflow/_join_node.py delete mode 100644 src/google/adk/workflow/_llm_agent_wrapper.py delete mode 100644 src/google/adk/workflow/_node.py delete mode 100644 src/google/adk/workflow/_node_runner.py delete mode 100644 src/google/adk/workflow/_node_state.py delete mode 100644 src/google/adk/workflow/_node_status.py delete mode 100644 src/google/adk/workflow/_parallel_worker.py delete mode 100644 src/google/adk/workflow/_retry_config.py delete mode 100644 src/google/adk/workflow/_schedule_dynamic_node.py delete mode 100644 src/google/adk/workflow/_tool_node.py delete mode 100644 src/google/adk/workflow/_trigger.py delete mode 100644 src/google/adk/workflow/_workflow.py delete mode 100644 src/google/adk/workflow/utils/__init__.py delete mode 100644 src/google/adk/workflow/utils/_rehydration_utils.py delete mode 100644 src/google/adk/workflow/utils/_replay_interceptor.py delete mode 100644 src/google/adk/workflow/utils/_replay_sequence_barrier.py delete mode 100644 src/google/adk/workflow/utils/_retry_utils.py delete mode 100644 src/google/adk/workflow/utils/_transfer_utils.py delete mode 100644 src/google/adk/workflow/utils/_workflow_graph_utils.py delete mode 100644 src/google/adk/workflow/utils/_workflow_hitl_utils.py delete mode 100644 tests/integration/test_cli_run.py delete mode 100644 tests/unittests/agents/llm/__init__.py delete mode 100644 tests/unittests/agents/llm/event_utils.py delete mode 100644 tests/unittests/agents/llm/task/__init__.py delete mode 100644 tests/unittests/agents/llm/task/test_finish_task_tool.py delete mode 100644 tests/unittests/agents/test_invocation_context_process_queue.py delete mode 100644 tests/unittests/agents/test_llm_agent_interruptions.py delete mode 100644 tests/unittests/cli/test_adk_web_server_import_isolation.py delete mode 100644 tests/unittests/cli/test_adk_web_server_tests.py delete mode 100644 tests/unittests/cli/test_resolve_root_directory.py delete mode 100644 tests/unittests/cli/utils/test_graph_serialization.py delete mode 100644 tests/unittests/evaluation/test_rubric_based_multi_turn_trajectory_evaluator.py delete mode 100644 tests/unittests/events/__init__.py delete mode 100644 tests/unittests/events/test_event.py delete mode 100644 tests/unittests/events/test_node_path_builder.py rename tests/unittests/{workflow => flows/llm_flows}/test_agent_transfer.py (52%) delete mode 100644 tests/unittests/labs/__init__.py delete mode 100644 tests/unittests/labs/openai/__init__.py delete mode 100644 tests/unittests/labs/openai/test_openai_llm.py delete mode 100644 tests/unittests/plugins/test_auto_tracing_plugin.py delete mode 100644 tests/unittests/runners/test_runner_node.py delete mode 100644 tests/unittests/telemetry/test_node_functional.py delete mode 100644 tests/unittests/telemetry/test_token_usage.py delete mode 100644 tests/unittests/telemetry/utils.py delete mode 100644 tests/unittests/test_optional_dependencies.py delete mode 100644 tests/unittests/test_release_dependencies.py delete mode 100644 tests/unittests/test_samples.py create mode 100644 tests/unittests/tools/BUILD rename tests/unittests/{integrations => tools}/bigquery/test_bigquery_client.py (98%) rename tests/unittests/{integrations => tools}/bigquery/test_bigquery_credentials.py (98%) rename tests/unittests/{integrations => tools}/bigquery/test_bigquery_data_insights_tool.py (98%) rename tests/unittests/{integrations => tools}/bigquery/test_bigquery_metadata_tool.py (98%) rename tests/unittests/{integrations => tools}/bigquery/test_bigquery_query_tool.py (99%) rename tests/unittests/{integrations => tools}/bigquery/test_bigquery_search_tool.py (98%) rename tests/unittests/{integrations => tools}/bigquery/test_bigquery_tool_config.py (98%) rename tests/unittests/{integrations => tools}/bigquery/test_bigquery_toolset.py (95%) rename tests/unittests/{integrations => tools}/bigquery/test_data/ask_data_insights_penguins_highest_mass.yaml (100%) delete mode 100644 tests/unittests/tools/environment/test_edit_file_tool.py delete mode 100644 tests/unittests/tools/test_request_input_tool.py delete mode 100644 tests/unittests/tools/test_skill_path_traversal.py delete mode 100644 tests/unittests/utils/test_serialized_base_model.py delete mode 100644 tests/unittests/workflow/__init__.py delete mode 100644 tests/unittests/workflow/test_agent_node.py delete mode 100644 tests/unittests/workflow/test_dynamic_node_scheduler.py delete mode 100644 tests/unittests/workflow/test_dynamic_use_as_output.py delete mode 100644 tests/unittests/workflow/test_function_node.py delete mode 100644 tests/unittests/workflow/test_graph.py delete mode 100644 tests/unittests/workflow/test_join_node.py delete mode 100644 tests/unittests/workflow/test_llm_agent_as_node.py delete mode 100644 tests/unittests/workflow/test_node_runner_ctx.py delete mode 100644 tests/unittests/workflow/test_node_runner_failure.py delete mode 100644 tests/unittests/workflow/test_node_runner_integration.py delete mode 100644 tests/unittests/workflow/test_state_schema.py delete mode 100644 tests/unittests/workflow/test_task_api_e2e.py delete mode 100644 tests/unittests/workflow/test_workflow.py delete mode 100644 tests/unittests/workflow/test_workflow_agent_as_node.py delete mode 100644 tests/unittests/workflow/test_workflow_bytes.py delete mode 100644 tests/unittests/workflow/test_workflow_concurrency.py delete mode 100644 tests/unittests/workflow/test_workflow_dynamic_nodes.py delete mode 100644 tests/unittests/workflow/test_workflow_failures.py delete mode 100644 tests/unittests/workflow/test_workflow_function_tool_as_node.py delete mode 100644 tests/unittests/workflow/test_workflow_hitl.py delete mode 100644 tests/unittests/workflow/test_workflow_live.py delete mode 100644 tests/unittests/workflow/test_workflow_llm_agent_interruptions.py delete mode 100644 tests/unittests/workflow/test_workflow_nested.py delete mode 100644 tests/unittests/workflow/test_workflow_node.py delete mode 100644 tests/unittests/workflow/test_workflow_node_timeout.py delete mode 100644 tests/unittests/workflow/test_workflow_output_deduplication.py delete mode 100644 tests/unittests/workflow/test_workflow_parallel_worker.py delete mode 100644 tests/unittests/workflow/test_workflow_routes.py delete mode 100644 tests/unittests/workflow/test_workflow_schema.py delete mode 100644 tests/unittests/workflow/testing_utils.py delete mode 100644 tests/unittests/workflow/utils/__init__.py delete mode 100644 tests/unittests/workflow/utils/test_rehydration_utils.py delete mode 100644 tests/unittests/workflow/utils/test_replay_interceptor.py delete mode 100644 tests/unittests/workflow/utils/test_replay_sequence_barrier.py delete mode 100644 tests/unittests/workflow/utils/test_retry_utils.py delete mode 100644 tests/unittests/workflow/utils/test_transfer_utils.py delete mode 100644 tests/unittests/workflow/utils/test_workflow_graph_utils.py delete mode 100644 tests/unittests/workflow/utils/test_workflow_hitl_utils.py delete mode 100644 tests/unittests/workflow/workflow_testing_utils.py delete mode 100644 tox.ini diff --git a/.agents/skills/adk-agent-builder/SKILL.md b/.agents/skills/adk-agent-builder/SKILL.md deleted file mode 100644 index 7a495232d2..0000000000 --- a/.agents/skills/adk-agent-builder/SKILL.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -name: adk-agent-builder -description: Central hub for building, testing, and iterating on ADK agents. Trigger this skill when the user wants to create a new agent, configure modes (task, single-turn), or build graph-based workflows. ---- - -# ADK Agent Builder - -This file serves as a directory of specialized reference guides for developing agents with ADK. To avoid context pollution, read only the relevant reference file based on your current task. - -## Core Concepts Directory - -Refer to these files for foundational knowledge: -- **Getting Started & Basic Agents**: [getting-started.md](references/getting-started.md) - - Environment setup, API key configuration, and minimal agent definitions. -- **Tool Catalog**: [tool-catalog.md](references/tool-catalog.md) - - How to bind function tools, MCP tools, OpenAPI specs, and Google API tools. -- **Agent Modes (Task / Single-Turn)**: [task-mode.md](references/task-mode.md) - - Multi-turn structured delegation and autonomous single-turn execution patterns. - -## Workflow & Graph Orchestration - -Refer to these files when building complex graphs: -- **Function Nodes**: [function-nodes.md](references/function-nodes.md) - - How to use functions as nodes, type resolution, and generators. -- **Routing & Conditions**: [routing-and-conditions.md](references/routing-and-conditions.md) - - Edge patterns, dict-based routing, self-loops, and conditional execution. -- **LLM Agent Nodes**: [llm-agent-nodes.md](references/llm-agent-nodes.md) - - How to use LLM agents as workflow nodes, task wrappers, and handling output schemas. - -## Advanced Orchestration Patterns - -- **Parallel Processing & Fan-Out**: [parallel-and-fanout.md](references/parallel-and-fanout.md) - - `ParallelWorker` for list splitting and concurrent processing, fan-out/join patterns. -- **Human-in-the-Loop**: [human-in-the-loop.md](references/human-in-the-loop.md) - - Pausing execution for user input, resumable workflows, and AuthConfig on nodes. -- **Dynamic Nodes**: [dynamic-nodes.md](references/dynamic-nodes.md) - - Scheduling nodes at runtime dynamically via `ctx.run_node()`. - -## Infrastructure & Utilities - -- **State & Events**: [state-and-events.md](references/state-and-events.md) - - Using context API, sharing global state, and yield event structures. -- **Multi-Agent Systems**: [multi-agent.md](references/multi-agent.md) - - Hierarchical execution (e.g., `SequentialAgent`, `LoopAgent`, `ParallelAgent`). -- **Testing Strategies**: [testing.md](references/testing.md) - - Automated queries with `adk run`, unit tests, and integration testing with sample agents. - -## Standards & Guidelines - -- **Best Practices**: [best-practices.md](references/best-practices.md) - - Critical rules (Pydantic schemas, content events, state-based data flow). diff --git a/.agents/skills/adk-agent-builder/references/advanced-patterns.md b/.agents/skills/adk-agent-builder/references/advanced-patterns.md deleted file mode 100644 index 10da442cc3..0000000000 --- a/.agents/skills/adk-agent-builder/references/advanced-patterns.md +++ /dev/null @@ -1,303 +0,0 @@ -# Advanced Workflow Patterns Reference - -Nested workflows, dynamic nodes, retry configuration, custom node types, and graph construction. - -## 📋 Agent Verification Checklist (Advanced Patterns) -Use this checklist when implementing complex workflows: -- [ ] **Validation**: Does your graph follow all 7 validation rules? (e.g., no unconditional cycles) -- [ ] **Custom Nodes**: If creating a custom node, did you override `get_name()` and `run()`? -- [ ] **Dynamic Execution**: If using `run_node`, did you follow the rules in the dedicated dynamic-nodes reference? -- [ ] **Waiting State**: Did you use `wait_for_output=True` if the node should stay in WAITING state until output is yielded? - -## 💡 Quick Reference -- **Retry**: `RetryConfig(max_attempts=5, initial_delay=1.0)` -- **Custom Node Fields**: `rerun_on_resume`, `wait_for_output`, `retry_config`, `timeout` - -## Nested Workflows - -A `Workflow` is both an agent and a node. Use one workflow inside another: - -```python -from google.adk.workflow import Workflow - -# Inner workflow -inner = Workflow( - name="inner_pipeline", - edges=[ - ('START', step_a), - (step_a, step_b), - ], -) - -# Outer workflow using inner as a node -outer = Workflow( - name="outer_pipeline", - edges=[ - ('START', pre_process), - (pre_process, inner), # Nested workflow - (inner, post_process), - ], -) -``` - -The inner workflow receives the predecessor's output as its START input and its terminal output flows to the next node in the outer workflow. - -## Dynamic Node Scheduling - -Schedule nodes at runtime using `ctx.run_node()`. - -See the dedicated [Dynamic Node Scheduling Reference](file:///Users/deanchen/Desktop/adk-workflow/.agents/skills/adk-workflow/references/dynamic-nodes.md) for detailed rules, examples, and best practices. - -## Retry Configuration - -Configure automatic retry for nodes that may fail: - -```python -from google.adk.workflow import RetryConfig -from google.adk.workflow import FunctionNode - -retry = RetryConfig( - max_attempts=5, # Max attempts (default: 5). 0 or 1 = no retry - initial_delay=1.0, # Seconds before first retry (default: 1.0) - max_delay=60.0, # Max seconds between retries (default: 60.0) - backoff_factor=2.0, # Delay multiplier per attempt (default: 2.0) - jitter=1.0, # Randomness factor (default: 1.0, 0.0 = none) - exceptions=None, # Exception types to retry (None = all) -) - -node = FunctionNode( - flaky_api_call, - name="api_call", - retry_config=retry, -) -``` - -### Retry delay formula - -``` -delay = initial_delay * (backoff_factor ^ attempt) -delay = min(delay, max_delay) -delay = delay * (1 + random(0, jitter)) -``` - -### Accessing retry count - -```python -def my_node(ctx: Context, node_input: str) -> str: - if ctx.retry_count > 0: - print(f"Retry attempt {ctx.retry_count}") - return "result" -``` - -## Custom Node Types - -Subclass `BaseNode` for custom behavior: - -```python -from google.adk.workflow import BaseNode -from google.adk.events.event import Event -from google.adk.agents.context import Context -from pydantic import ConfigDict, Field -from typing import Any, AsyncGenerator -from typing_extensions import override - -class BatchProcessorNode(BaseNode): - """Processes items in batches.""" - model_config = ConfigDict(arbitrary_types_allowed=True) - - name: str = Field(default="batch_processor") - batch_size: int = Field(default=10) - - def __init__(self, *, name: str = "batch_processor", batch_size: int = 10): - super().__init__() - object.__setattr__(self, 'name', name) - object.__setattr__(self, 'batch_size', batch_size) - - @override - def get_name(self) -> str: - return self.name - - @override - async def run( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - items = node_input if isinstance(node_input, list) else [node_input] - results = [] - for i in range(0, len(items), self.batch_size): - batch = items[i:i + self.batch_size] - batch_result = await process_batch(batch) - results.extend(batch_result) - yield Event(output=results) -``` - -### BaseNode Fields - -| Field | Default | Description | -|-------|---------|-------------| -| `rerun_on_resume` | `False` | Whether to rerun after HITL interrupt | -| `wait_for_output` | `False` | Node stays in WAITING state until it yields output (see below) | -| `retry_config` | `None` | Retry configuration on failure | -| `timeout` | `None` | Max seconds for node to complete | - -### wait_for_output - -When `wait_for_output=True`, a node that finishes without yielding an `Event` with output moves to **WAITING** state instead of COMPLETED. Downstream nodes are **not** triggered. The node can then be re-triggered by upstream predecessors. - -This is how `JoinNode` works internally — it runs once per predecessor, storing partial inputs, and only yields output (triggering downstream) when all predecessors have completed. `LlmAgentWrapper` in `task` mode also sets `wait_for_output=True` automatically. - -```python -from google.adk.workflow import BaseNode - -class CollectorNode(BaseNode): - wait_for_output: bool = True # Stay in WAITING until output is yielded - - async def run(self, *, ctx, node_input): - # Store partial input, don't yield output yet - collected = ctx.state.get("collected", []) - collected.append(node_input) - yield Event(state={"collected": collected}) - - # Only yield output when we have enough - if len(collected) >= 3: - yield Event(output=collected) - # Now node transitions to COMPLETED and triggers downstream -``` - -Nodes with `wait_for_output=True` default: -- `JoinNode`: `True` (waits for all predecessors) -- `LlmAgentWrapper` (task mode): `True` (set in `model_post_init`) -- All other nodes: `False` - -### Required Methods - -| Method | Description | -|--------|-------------| -| `get_name() -> str` | Return the node name | -| `run(*, ctx, node_input) -> AsyncGenerator` | Execute the node, yield events | - -## ToolNode - -Wrap an ADK tool as a workflow node: - -```python -from google.adk.workflow._tool_node import _ToolNode as ToolNode -from google.adk.tools.function_tool import FunctionTool - -def search(query: str) -> str: - """Search for information.""" - return f"Results for: {query}" - -tool = FunctionTool(search) -tool_node = ToolNode(tool, name="search_node") - -agent = Workflow( - name="with_tool", - edges=[ - ('START', prepare_query), - (prepare_query, tool_node), # Input must be dict (tool args) or None - (tool_node, process_results), - ], -) -``` - -**Important**: ToolNode input must be a dictionary of tool arguments or None. - -## AgentNode - -Wrap any `BaseAgent` (not just LlmAgent) as a workflow node: - -```python -from google.adk.workflow._agent_node import AgentNode -from google.adk.agents.loop_agent import LoopAgent - -loop = LoopAgent( - name="refine_loop", - sub_agents=[writer, reviewer], - max_iterations=3, -) - -loop_node = AgentNode(agent=loop, name="refinement") - -agent = Workflow( - name="with_loop", - edges=[ - ('START', loop_node), - (loop_node, final_step), - ], -) -``` - -## Graph Validation Rules - -The workflow graph is validated on construction. These rules are enforced: - -1. START node must exist -2. START node must not have incoming edges -3. All non-START nodes must be reachable (appear as `to_node` in some edge) -4. No duplicate node names -5. No duplicate edges -6. At most one `__DEFAULT__` route per node -7. No unconditional cycles (cycles must have at least one routed edge) - -## Edge Construction Patterns - -```python -from google.adk.workflow import Edge -from google.adk.workflow._workflow_graph import WorkflowGraph - -# Tuple syntax (most common) -edges = [ - ('START', node_a), # Simple edge - (node_a, node_b, "route"), # Routed edge - (node_a, (node_b, node_c)), # Fan-out - ((node_b, node_c), join_node), # Fan-in -] - -# Sequence shorthand (tuple with 3+ elements creates chain) -edges = [('START', node_a, node_b, node_c)] -# Equivalent to: [('START', node_a), (node_a, node_b), (node_b, node_c)] - -# Routing map (dict syntax) -edges = [ - (classifier, {"success": handler_a, "error": handler_b}), -] - -# Edge objects (explicit) -edges = [ - Edge(START, node_a), - Edge(node_a, node_b, route="success"), -] - -# Edge.chain helper -edges = Edge.chain('START', node_a, node_b, node_c) -# Returns: [(START, node_a), (node_a, node_b), (node_b, node_c)] - -# WorkflowGraph.from_edge_items -graph = WorkflowGraph.from_edge_items([ - ('START', node_a), - (node_a, node_b), -]) -agent = Workflow(name="my_workflow", graph=graph) -``` - -## Source File Locations - -| Component | File | -|-----------|------| -| Workflow | `src/google/adk/workflow/_workflow.py` | -| WorkflowGraph, Edge | `src/google/adk/workflow/_workflow_graph.py` | -| Context | `src/google/adk/agents/context.py` | -| FunctionNode | `src/google/adk/workflow/_function_node.py` | -| _LlmAgentWrapper | `src/google/adk/workflow/_llm_agent_wrapper.py` | -| AgentNode | `src/google/adk/workflow/_agent_node.py` | -| _ToolNode | `src/google/adk/workflow/_tool_node.py` | -| JoinNode | `src/google/adk/workflow/_join_node.py` | -| ParallelWorker | `src/google/adk/workflow/_parallel_worker.py` | -| BaseNode, START | `src/google/adk/workflow/_base_node.py` | -| @node decorator | `src/google/adk/workflow/_node.py` | -| RetryConfig | `src/google/adk/workflow/_retry_config.py` | -| Event | `src/google/adk/events/event.py` | -| RequestInput | `src/google/adk/events/request_input.py` | diff --git a/.agents/skills/adk-agent-builder/references/best-practices.md b/.agents/skills/adk-agent-builder/references/best-practices.md deleted file mode 100644 index f54f61f680..0000000000 --- a/.agents/skills/adk-agent-builder/references/best-practices.md +++ /dev/null @@ -1,179 +0,0 @@ -# ADK Workflow Best Practices - -This document outlines the critical best practices and rules for developing reliable and maintainable workflows with the ADK. - -## 📋 Agent Code Verification Checklist -Use this checklist to verify your code before submitting or finalizing changes: -- [ ] **Schemas**: Are Pydantic `BaseModel` classes used for all inputs/outputs? (No raw dicts) -- [ ] **UI Output**: Do user-visible messages use `Event(message=...)`? (Not `output=`) -- [ ] **State Data Flow**: Is data stored in state and read via `{var}` or param names? -- [ ] **State Updates**: Are state updates done via `Event(state=...)`? (Avoid direct `ctx.state` mutation) -- [ ] **Outputs**: Does each node execution yield at most **one** `event.output`? -- [ ] **Semantics**: Are `yield` and `return` never mixed in the same function? -- [ ] **Instructions**: Are `{node_input}` templates NOT used in agent instructions? -- [ ] **HITL**: Are `interrupt_id`s unique per iteration in loops? - -## Best Practices (MUST FOLLOW) - -### Use Pydantic Models, Not Raw Dicts - -**Always define Pydantic `BaseModel` classes** for function node inputs, outputs, LLM `output_schema`, and structured data. Never use `dict[str, Any]` when the shape is known: - -```python -# ❌ WRONG: raw dicts -def lookup_flights(node_input: dict[str, Any]) -> dict[str, Any]: - return {"flight_cost": 500, "details": "Economy"} - -# ✅ CORRECT: typed schemas -class FlightInfo(BaseModel): - flight_cost: int - details: str - -def lookup_flights(node_input: Itinerary) -> FlightInfo: - return FlightInfo(flight_cost=500, details="Economy") -``` - -This applies to ALL data flowing through the graph: node inputs, node outputs, JoinNode results, LLM output schemas, and HITL response schemas. - -### Emit Content Events for Web UI Display - -`event.output` is internal — only `event.content` renders in the ADK web UI. For user-visible output, use `Event(message=...)`: - -```python -def final_output(node_input: str): - yield Event(message=node_input) # message= renders in web UI - yield Event(output=node_input) # output= passes data to downstream nodes - -# State-only event (no output, no message — just side-effect state update) -def store_data(node_input: str): - yield Event(state={"user_input": node_input}) - -> [!TIP] -> Function nodes can stream user-visible messages by yielding `Event(message="chunk", partial=True)`. -``` - -LLM agents emit content events automatically. Add them explicitly for function nodes that produce user-facing results. - -### Prefer State-Based Data Flow with LLM Agents - -Store data in state via `Event(state={...})` or `output_key`, then read it via instruction templates `{var}` or function parameter name injection. This is more robust than passing data through `node_input`, especially for routing workflows where multiple branches need the same data. - -```python -# ✅ State-based: store early, read anywhere via {var} or param name -def process_input(node_input: str): - yield Event(state={"topic": node_input}) - -writer = Agent(name="writer", instruction='Write about "{topic}".', output_key="draft") -def send(draft: str): # draft resolved from ctx.state["draft"] - yield Event(message=draft) - -# ❌ Fragile: threading data through node_input breaks at routing/loops -``` - -### Set State via Event, Not ctx.state - -**Prefer `Event(state=...)` over `ctx.state[key] = ...`** for writing state. Event-based state is persisted in event history and replayable during non-resumable HITL. Direct `ctx.state` mutations are side effects that may be lost on replay. - -```python -# ✅ Preferred -def save(node_input: str): - return Event(output=node_input, state={"user_request": node_input}) - -# ❌ Avoid -def save(ctx: Context, node_input: str) -> str: - ctx.state["user_request"] = node_input - return node_input -``` - -### One Output Event Per Node - -Each node execution can yield many events, but **at most one should have `event.output`**. This applies to function nodes, LLM agents (including `task` and `single_turn` mode), and nested workflows. Multiple output events get silently merged into a list, which changes the downstream `node_input` type and usually causes errors. Similarly, at most one event can have `route` — multiple routed events raise `ValueError`. - -```python -# ✅ Correct: one output event, other events for messages/state -def my_node(node_input: str): - yield Event(message="Processing...") # display only - yield Event(state={"status": "done"}) # state update only - yield Event(output="final result") # the single output - -# ❌ Wrong: multiple output events -def my_node(node_input: str): - yield Event(output="first") # these get merged into ["first", "second"] - yield Event(output="second") # downstream expects str, gets list → TypeError -``` - -### Don't Mix yield and return Event - -A function is either a **generator** (uses `yield`) or a **regular function** (uses `return`). Never mix them — in Python, a function with `yield` becomes a generator and any `return value` is silently ignored: - -```python -# ✅ Generator: use yield for all events -def my_node(node_input: str): - yield Event(state={"key": "value"}) - yield Event(output="result") - -# ✅ Regular function: use return for a single value/event -def my_node(node_input: str): - return Event(output="result", state={"key": "value"}) - -# ✅ Regular function: return plain value (auto-wrapped in Event) -def my_node(node_input: str) -> str: - return "result" - -# ❌ Wrong: mixing yield and return — the return is silently ignored -def my_node(node_input: str): - yield Event(state={"key": "value"}) - return Event(output="result") # IGNORED — Python generator semantics -``` - -Use generators (`yield`) when you need multiple events (state + output + message). Use regular functions (`return`) for simple single-value output. - -### Never Put node_input in LLM Agent Instructions - -`{var}` templates in `instruction` resolve **only** from `ctx.state`. `node_input` is NOT available as a template variable — it is automatically sent as the user message to the LLM. Do not try to reference it in the instruction: - -```python -# ❌ Wrong: {node_input} is not in state, raises KeyError -agent = Agent( - name="summarizer", - instruction="Summarize this: {node_input}", -) - -# ✅ Correct: node_input already becomes the user message, just instruct -agent = Agent( - name="summarizer", - instruction="Summarize the following text in one sentence.", -) - -# ✅ Correct: use state for data that needs to be in the instruction -agent = Agent( - name="writer", - instruction='Write about "{topic}". Previous feedback: {feedback?}', - output_key="draft", -) -``` - -### Workflow Cannot Be a Sub-Agent of LlmAgent - -`Workflow`, `SequentialAgent`, `LoopAgent`, and `ParallelAgent` cannot be added as `sub_agents` of an `LlmAgent`. Agent transfer to workflow agents is not supported. - -### Workflow Data Rules - -- **`Event.output` must be JSON-serializable.** FunctionNode auto-converts BaseModel returns via `model_dump()`. Never store `types.Content` or other non-serializable objects in `Event.output`. -- **`output_key` stores dicts, not BaseModel instances.** LLM agents with `output_schema` run `validate_schema()` → `model_dump()`, so `ctx.state[output_key]` is a plain dict. -- **`ctx.state.get(key)` returns a dict.** Use dict access (`data["field"]`) or reconstruct (`MyModel(**data)`) for typed access. - -## Human-in-the-Loop (HITL) Rules - -### Unique interrupt_id in Loops - -When a node requests input (yields `RequestInput`) inside a loop (e.g., a review-revise loop), you **MUST use a unique `interrupt_id` per iteration** (e.g., `review_{count}`). - -If you reuse the same `interrupt_id`, the event-based state reconstruction will confuse responses from earlier iterations with the current one, leading to infinite restart loops! - -```python -# ✅ Correct: unique ID per iteration -review_count = ctx.state.get('review_count', 0) -interrupt_id = f'review_{review_count}' -yield RequestInput(interrupt_id=interrupt_id, message="Approve?") -``` diff --git a/.agents/skills/adk-agent-builder/references/callbacks-and-plugins.md b/.agents/skills/adk-agent-builder/references/callbacks-and-plugins.md deleted file mode 100644 index 00d8a7658e..0000000000 --- a/.agents/skills/adk-agent-builder/references/callbacks-and-plugins.md +++ /dev/null @@ -1,98 +0,0 @@ -# Callbacks and Plugins - -## 📋 Agent Verification Checklist (Callbacks) -Use this checklist when implementing callbacks or plugins: -- [ ] **Override Behavior**: Remember that returning a non-`None` value in a callback *overrides* the default behavior (e.g., skips model call or tool execution). Is that intentional? -- [ ] **Context Type**: Remember that `CallbackContext` is an alias for `Context`. - -## 💡 Quick Reference (Callback Returns) -- **Continue Normal Flow**: Return `None`. -- **Override Model**: Return `LlmResponse` in `before_model`. -- **Override Tool**: Return `dict` in `before_tool`. - -## Agent Callbacks - -```python -root_agent = Agent( - before_agent_callback=my_before_cb, # Before agent runs - after_agent_callback=my_after_cb, # After agent runs - before_model_callback=my_before_model, # Before LLM call - after_model_callback=my_after_model, # After LLM call - before_tool_callback=my_before_tool, # Before tool call - after_tool_callback=my_after_tool, # After tool call - on_model_error_callback=my_error_cb, # On LLM error - on_tool_error_callback=my_tool_error_cb, # On tool error - ... -) -``` - -**Note:** `CallbackContext` is a backward-compatible alias for `Context`. Both work identically. - -## Callback Signatures - -```python -# before_agent / after_agent -def callback(callback_context: CallbackContext): - return None # Continue normal flow - # OR return ModelContent to override - -# before_model -def callback(callback_context, llm_request: LlmRequest): - return None # Continue to LLM - # OR return LlmResponse to skip LLM - -# after_model -def callback(callback_context, llm_response): - return None # Use actual response - # OR return LlmResponse to override - -# before_tool -def callback(tool, args, tool_context): - return None # Call tool normally - # OR return dict to skip tool - -# after_tool -def callback(tool, args, tool_context, tool_response): - return None # Use actual response - # OR return dict to override -``` - -**Multiple callbacks:** Pass a list. They execute in order until one -returns non-None. - -## Plugins (App-Level Callbacks) - -```python -from google.adk.plugins.base_plugin import BasePlugin - -class MyPlugin(BasePlugin): - def __init__(self): - super().__init__(name='my_plugin') - - async def before_agent_callback(self, *, agent, callback_context): - pass - - async def before_model_callback(self, *, callback_context, llm_request): - pass -``` - -## Built-in Plugins - -| Plugin | Import | Purpose | -|--------|--------|---------| -| `ContextFilterPlugin` | `from google.adk.plugins.context_filter_plugin import ContextFilterPlugin` | Limit history in context | -| `SaveFilesAsArtifactsPlugin` | `from google.adk.plugins.save_files_as_artifacts_plugin import SaveFilesAsArtifactsPlugin` | Auto-save file outputs | -| `GlobalInstructionPlugin` | `from google.adk.plugins.global_instruction_plugin import GlobalInstructionPlugin` | Inject global instructions | - -Usage with App: - -```python -from google.adk.apps import App -from google.adk.plugins.context_filter_plugin import ContextFilterPlugin - -app = App( - name='my_app', - root_agent=root_agent, - plugins=[ContextFilterPlugin(num_invocations_to_keep=3)], -) -``` diff --git a/.agents/skills/adk-agent-builder/references/dynamic-nodes.md b/.agents/skills/adk-agent-builder/references/dynamic-nodes.md deleted file mode 100644 index b066133658..0000000000 --- a/.agents/skills/adk-agent-builder/references/dynamic-nodes.md +++ /dev/null @@ -1,95 +0,0 @@ -# Dynamic Node Scheduling Reference - -Schedule nodes at runtime using `ctx.run_node()`. This allows a node within a workflow to trigger the run of another node (or a callable that can be built into a node) and asynchronously wait for its result. - -## 📋 Agent Verification Checklist (Dynamic Nodes) -Use this checklist when scheduling nodes dynamically: -- [ ] **Rerun on Resume**: Does the parent node calling `run_node` have `rerun_on_resume=True`? -- [ ] **Run ID**: If using an explicit `run_id`, does it contain non-numeric characters? -- [ ] **Param Name**: If passing input directly to a raw function via `node_input=...`, is that function's parameter named `node_input`? -- [ ] **Nesting**: If the child node *also* calls `run_node`, is it wrapped in `FunctionNode(..., rerun_on_resume=True)`? - -## 💡 Quick Reference -- **Call**: `await ctx.run_node(node_like, node_input=...)` -- **Output Delegation**: Set `use_as_output=True` to make child output be the parent's output. - -## Basic Usage - -```python -from google.adk import Agent, Context, Event, Workflow -from google.adk.workflow import node -from pydantic import BaseModel - -class Feedback(BaseModel): - grade: str - -generate_headline = Agent( - name="generate_headline", - instruction='Write a headline about the topic "{topic}".', -) - -evaluate_headline = Agent( - name="evaluate_headline", - instruction="Grade whether the headline is tech-related.", - output_schema=Feedback, - mode="single_turn", -) - -@node(rerun_on_resume=True) -async def orchestrate(ctx: Context, node_input: str) -> str: - yield Event(state={"topic": node_input}) - while True: - headline = await ctx.run_node(generate_headline) - feedback = Feedback.model_validate( - await ctx.run_node(evaluate_headline, node_input=headline) - ) - if feedback.grade == "tech-related": - yield headline - break - -root_agent = Workflow( - name="root_agent", - edges=[("START", orchestrate)], -) -``` - -## Requirements & Rules - -- **`rerun_on_resume=True`**: The parent node calling `ctx.run_node()` must have `rerun_on_resume=True`. This is required because dynamically scheduled nodes might be interrupted (e.g., for HITL), and the workflow needs to wake up and re-run the parent node to get the child node's response. -- **Unique Instance Names**: Each dynamic instance needs a unique name (auto-generated for Agent nodes). -- **Node-Like Acceptable**: `ctx.run_node()` accepts any node-like object (function, Agent, BaseNode). -- **Explicit `run_id` Constraint**: If you provide an explicit `run_id`, it **must contain non-numeric characters** (e.g., `"run_a"` instead of `"1"`) to prevent collision with auto-generated numeric IDs. -- **`use_as_output=True`**: Suppresses the parent node's own output and uses the child's output as the parent's output. This is achieved via `outputFor` annotation in events. This can only be called ONCE per parent node execution. -- **`use_sub_branch`**: (Optional) If set to `True`, attaches a branch segment (`node_name@run_id`) to the current execution branch to ensure event isolation for parallel or sub-agent runs. - -## Best Practices - -- Always `await` `ctx.run_node()` directly. Wrapping it in `asyncio.create_task()` means the task runs unsupervised — errors are silently swallowed and the task is not cancelled if the parent node is interrupted. - -## Imperative Workflow Construction - -As an alternative to defining static graph edges, you can use dynamic nodes to construct workflows in an imperative style using standard Python control flow. This approach can sometimes be more intuitive for complex conditional logic or parallel execution. - -### Replacing Graph Patterns - -#### 1. Sequences & Branching -Instead of defining edges with routes, use standard Python `if/else`: -```python -async def orchestrator(ctx: Context, node_input: str): - res_a = await ctx.run_node(step_a, node_input=node_input) - if "success" in res_a: - return await ctx.run_node(step_b, node_input=res_a) - else: - return await ctx.run_node(step_c, node_input=res_a) -``` - - -### Important Pits & Best Practices - -- **Function Parameter Mapping**: When passing a raw function to `run_node`, ADK defaults to `'state'` binding mode. If you want to pass input directly via `node_input=...` in `run_node`, **the function parameter MUST be named `node_input`**! - ```python - def my_worker(node_input: str): # MUST be named 'node_input' - return f"Done: {node_input}" - ``` -- **Nested Dynamic Nodes**: If a dynamically scheduled node *itself* calls `run_node`, it acts as a parent node and **MUST have `rerun_on_resume=True`**! Since raw functions passed to `run_node` default to `False`, you must manually wrap the inner parent function in `FunctionNode(..., rerun_on_resume=True)`! -- **Generator Returns**: In nodes that use `yield` (generators), you cannot use `return value` to produce the final output (Python syntax error in async generators). You must yield `Event(output=...)` instead. diff --git a/.agents/skills/adk-agent-builder/references/function-nodes.md b/.agents/skills/adk-agent-builder/references/function-nodes.md deleted file mode 100644 index 8354b818fd..0000000000 --- a/.agents/skills/adk-agent-builder/references/function-nodes.md +++ /dev/null @@ -1,320 +0,0 @@ -# Function Nodes Reference - -Function nodes are the most common node type. Any Python function becomes a workflow node. - -## 📋 Agent Verification Checklist (Function Nodes) -Use this checklist to verify your Function Node configuration: -- [ ] **Input Type**: If following an LLM agent without schema, is `node_input` typed as `Any` or `types.Content`? (Not `str`) -- [ ] **UI Output**: Do you yield `Event(message=...)` for results that should appear in the Web UI? -- [ ] **Outputs**: Does the function yield or return at most **one** `event.output`? -- [ ] **Union Types**: If using Union types for `node_input`, did you add `isinstance` checks in the body for actual validation? - -## 💡 Quick Reference (Param Resolution) -- **`ctx`**: Workflow `Context` object. -- **`node_input`**: Output from the predecessor node. -- **Any other name**: Auto-resolved from `ctx.state[param_name]`. - -## Imports - -```python -from google.adk.workflow import FunctionNode -from google.adk.events.event import Event -from google.adk.agents.context import Context -from google.adk.workflow import node # @node decorator -``` - -## Basic Functions - -A function returning a value automatically wraps it in an `Event`: - -```python -def process(node_input: str) -> str: - return f"Processed: {node_input}" - -# Async functions work too -async def fetch_data(node_input: str) -> dict: - result = await some_api_call(node_input) - return {"data": result} -``` - -## Function Signatures - -FunctionNode inspects the function signature to resolve parameters: - -| Parameter Name | Source | -|---------------|--------| -| `ctx` | Workflow `Context` object | -| `node_input` | Output from predecessor node | -| Any other name | Looked up from `ctx.state[param_name]` | - -```python -# Receives both context and input -def my_node(ctx: Context, node_input: str) -> str: - session_id = ctx.session.id - return f"Session {session_id}: {node_input}" - -# Receives only input -def simple(node_input: str) -> str: - return node_input.upper() - -# Reads from state (other params resolved from ctx.state) -def uses_state(node_input: str, user_name: str) -> str: - # user_name read from ctx.state['user_name'] - return f"{user_name}: {node_input}" - -# No parameters at all -def constant() -> str: - return "hello" -``` - -## Generator Functions - -Yield multiple events from a single node: - -```python -# Async generator -async def multi_output(ctx: Context) -> AsyncGenerator[Any, None]: - yield Event(output="first output") - yield Event(output="second output") - -# Sync generator -def sync_multi(node_input: str): - yield Event(output="step 1") - yield Event(output="step 2") -``` - -**At most one event should have `output`.** Multiple output events get silently merged into a list, changing the downstream type. Similarly, at most one event can have `route` (multiple raise `ValueError`). Use separate events for messages, state updates, and the single output. - -## Yielding Raw Values - -Yield raw values instead of Event objects. They are wrapped automatically: - -```python -async def raw_yield(node_input: str): - yield "output value" # Wrapped in Event(output="output value") -``` - -## Returning None - -If a function returns `None`, no event is emitted and no downstream node is triggered: - -```python -def maybe_output(node_input: str) -> str | None: - if not node_input: - return None # No downstream trigger - return f"Got: {node_input}" -``` - -## Auto Type Conversion - -FunctionNode automatically converts `dict` inputs to Pydantic models based on type hints: - -```python -from pydantic import BaseModel - -class Order(BaseModel): - item: str - quantity: int - -def process_order(node_input: Order) -> str: - # If node_input is {'item': 'widget', 'quantity': 3}, - # it's auto-converted to Order(item='widget', quantity=3) - return f"Order: {node_input.quantity}x {node_input.item}" -``` - -This works recursively for `list[Model]` and `dict[str, Model]` too. - -### Pydantic Schemas with LLM Agents (Recommended Pattern) - -Use `output_schema` on LLM agents to get structured, JSON-serializable output. This avoids `types.Content` serialization issues and enables auto-conversion in downstream function nodes: - -```python -from pydantic import BaseModel -from google.adk.agents.llm_agent import LlmAgent - -class ReviewResult(BaseModel): - score: int - feedback: str - approved: bool - -reviewer = LlmAgent( - name="reviewer", - model="gemini-2.5-flash", - instruction="Review the code and provide structured feedback.", - output_schema=ReviewResult, -) - -# Downstream function node receives dict, auto-converted to Pydantic model -def process_review(node_input: ReviewResult) -> str: - if node_input.approved: - return f"Approved with score {node_input.score}" - return f"Rejected: {node_input.feedback}" -``` - -**Why use `output_schema`:** -- LLM agent output becomes a `dict` (JSON-serializable) instead of `types.Content` -- Fixes `TypeError` when SQLite session service serializes JoinNode state -- Enables auto type conversion in downstream function nodes -- Provides structured data for programmatic access - -## Explicit FunctionNode - -For more control, create a `FunctionNode` explicitly: - -```python -from google.adk.workflow import FunctionNode -from google.adk.workflow import RetryConfig - -node = FunctionNode( - my_func, - name="custom_name", # Override inferred name - rerun_on_resume=True, # Rerun after HITL interrupt - retry_config=RetryConfig( # Retry on failure - max_attempts=3, - initial_delay=1.0, - ), -) -``` - -## @node Decorator - -The `@node` decorator provides syntactic sugar: - -```python -from google.adk.workflow import node - -@node -def my_func(node_input: str) -> str: - return node_input - -@node(name="custom_name", rerun_on_resume=True) -async def my_async_func(node_input: str) -> str: - return node_input - -# As a function call -my_node = node(some_func, name="renamed") - -# Wrap as ParallelWorker -parallel = node(some_func, parallel_worker=True) -``` - -## Prefer Typed Schemas Over Raw Dicts - -Use Pydantic models for node inputs, outputs, and state instead of raw `dict`. This gives you validation, IDE autocomplete, and self-documenting code: - -```python -# ❌ Avoid: raw dicts are error-prone and opaque -def process(node_input: dict) -> dict: - return {"status": "done", "count": node_input["items"]} - -# ✅ Prefer: typed schemas -class TaskInput(BaseModel): - items: list[str] - priority: str = "normal" - -class TaskResult(BaseModel): - status: str - count: int - -def process(node_input: TaskInput) -> TaskResult: - return TaskResult(status="done", count=len(node_input.items)) -``` - -This applies to: -- **Function node inputs/outputs**: Use Pydantic models as `node_input` type hints and return types -- **LLM agent `output_schema`**: Always set `output_schema=MyModel` to get structured dict output instead of `types.Content` -- **`RequestInput.response_schema`**: Pass a Pydantic `BaseModel` class directly (e.g., `response_schema=MyModel`) -- **State values**: Store Pydantic model dicts (via `.model_dump()`) rather than hand-built dicts - -FunctionNode auto-converts `dict` inputs to Pydantic models based on type hints (see [Auto Type Conversion](#auto-type-conversion) above), so typed schemas work seamlessly across the graph. - -## Emitting Content Events for Web UI Display - -In the ADK web UI, only `event.content` is rendered to the user — `event.output` is internal and not displayed. When a function node produces user-facing output, yield a content event in addition to the output event: - -```python -from google.genai import types -from google.adk.events.event import Event - -async def summarize(ctx: Context, node_input: str): - result = f"Summary: {node_input}" - - # Content event: rendered in the web UI - yield Event(content=types.ModelContent(result)) - - # Output event: passed to downstream nodes - yield Event(output=result) -``` - -LLM agents emit content events automatically. For function nodes that are terminal (no downstream edges) or produce user-visible intermediate results, add the content event so users see output in the web UI. - -## Events with Routes - -Return an `Event` with a `route` for conditional branching: - -```python -def classify(node_input: str): - if "urgent" in node_input: - return Event(output=node_input, route="urgent") - return Event(output=node_input, route="normal") -``` - -## Events with State Updates - -Update shared workflow state via the `state` constructor parameter: - -```python -def update_counter(node_input: str): - return Event( - output=node_input, - state={"counter": 1, "last_input": node_input}, - ) -``` - -Or use `ctx.state` directly: - -```python -def update_via_context(ctx: Context, node_input: str) -> str: - ctx.state["counter"] = ctx.state.get("counter", 0) + 1 - return node_input -``` - -## Type Validation (Important) - -FunctionNode strictly type-checks `node_input` against the type hint. A `TypeError` is raised if the actual type doesn't match. - -**Union types:** `node_input: list | dict` silently skips validation (FunctionNode detects Union via `get_origin()` and sets `is_instance = True`). This means Union hints won't crash, but they also won't catch wrong types — any value passes. Use `isinstance` checks inside the function body for actual validation. - -**Common pitfall: LLM agent -> function node.** LlmAgentWrapper outputs `types.Content` (not `str`). If your function node follows an LLM agent and declares `node_input: str`, it will fail with: - -``` -TypeError: Parameter "node_input" expects type - but received type -``` - -**Fix:** Use `Any` for `node_input` and extract text manually: - -```python -from typing import Any -from google.genai import types - -def process(node_input: Any) -> str: - # Handle types.Content from LLM agents - if isinstance(node_input, types.Content): - return ''.join(p.text for p in (node_input.parts or []) if p.text) - return str(node_input) if node_input is not None else '' -``` - -**Output type summary by predecessor:** - -| Predecessor Node Type | `node_input` Type | -|----------------------|-------------------| -| Function returning `str` | `str` | -| Function returning `dict` | `dict` | -| Function returning `Event(output=X)` | type of `X` | -| `LlmAgentWrapper` (no `output_schema`) | `types.Content` | -| `LlmAgentWrapper` (with `output_schema`) | `dict` | -| `JoinNode` | `dict[str, Any]` (keyed by predecessor names) | -| `ParallelWorker` | `list` | -| `START` (no `input_schema`) | `types.Content` (user's message) | -| `START` (with `input_schema`) | parsed schema type | diff --git a/.agents/skills/adk-agent-builder/references/getting-started.md b/.agents/skills/adk-agent-builder/references/getting-started.md deleted file mode 100644 index bea396da54..0000000000 --- a/.agents/skills/adk-agent-builder/references/getting-started.md +++ /dev/null @@ -1,432 +0,0 @@ -# Getting Started: Creating ADK Agents - -Step-by-step guide covering environment setup, basic LLM agents, and workflow agents. - -## 📋 New Agent Checklist -Use this checklist when creating a new agent to ensure it follows convention: -- [ ] **Directory**: Is there a directory for the agent? -- [ ] **__init__.py**: Does it contain `from . import agent`? -- [ ] **agent.py**: Does it define `root_agent` or `app`? -- [ ] **.env**: Is there a `.env` file with the appropriate API keys? (Do not commit to git) - -## 💡 Quick Reference (CLI Commands) -- **Create**: `adk create ` (Scaffolds a new agent project) -- **Web UI**: `adk web ` (Starts dev server at localhost:8000) -- **Run CLI**: `adk run ` (Interactive or query mode) - -## 1. Set Up the Environment - -Create a virtual environment and install the ADK: - -```bash -# Create and activate virtual environment -python -m venv .venv -source .venv/bin/activate # macOS/Linux - -# Install the ADK package -pip install google-adk -``` - -Or with `uv`: - -```bash -uv venv --python "python3.11" ".venv" -source .venv/bin/activate -uv pip install google-adk -``` - -## 2. Configure API Keys - -### Google AI Studio (recommended for getting started) - -Obtain an API key from [Google AI Studio](https://aistudio.google.com/app/apikey). - -Create a `.env` file in the agent directory: - -``` -GOOGLE_GENAI_USE_VERTEXAI=FALSE -GOOGLE_API_KEY=YOUR_API_KEY -``` - -### Vertex AI - -For production use with Google Cloud: - -``` -GOOGLE_GENAI_USE_VERTEXAI=TRUE -GOOGLE_CLOUD_PROJECT=your-project-id -GOOGLE_CLOUD_LOCATION=us-central1 -``` - -Run `gcloud auth application-default login` to authenticate. - -### Vertex AI Express Mode - -Combines Vertex AI with API key authentication: - -``` -GOOGLE_GENAI_USE_VERTEXAI=TRUE -GOOGLE_API_KEY=YOUR_EXPRESS_MODE_KEY -``` - -## 3. Agent Directory Structure - -The ADK CLI discovers agents by directory convention. Each agent directory must have: - -``` -my_agent/ -├── __init__.py # Must import the agent module -├── agent.py # Must define root_agent -└── .env # API keys (not committed to git) -``` - -### __init__.py - -```python -from . import agent -``` - -Or generate the project with the CLI: - -```bash -adk create my_agent -``` - -## 4. Basic LLM Agent with Tools - -Before building workflow agents, understand the basic LLM agent pattern. An `LlmAgent` (also aliased as `Agent`) connects an LLM to tools and instructions: - -### agent.py - -```python -from google.adk.agents.llm_agent import Agent - -def get_weather(city: str) -> dict: - """Returns the current weather for a specified city.""" - # In production, call a real weather API - return { - "status": "success", - "city": city, - "weather": "sunny", - "temperature": "72F", - } - -def get_current_time(city: str) -> dict: - """Returns the current time in a specified city.""" - import datetime - return { - "status": "success", - "city": city, - "time": datetime.datetime.now().strftime("%I:%M %p"), - } - -root_agent = Agent( - model="gemini-2.5-flash", - name="root_agent", - description="An assistant that provides weather and time information.", - instruction="""You are a helpful assistant. -Use the get_weather tool to look up weather and -get_current_time to check the time in any city. -Always be friendly and concise.""", - tools=[get_weather, get_current_time], -) -``` - -### Key concepts - -- **`model`**: The LLM to use (e.g., `"gemini-2.5-flash"`, `"gemini-2.5-pro"`) -- **`instruction`**: System prompt guiding the agent's behavior -- **`tools`**: Python functions the LLM can call. The function name, docstring, and type hints are sent to the LLM as the tool schema -- **`description`**: Used when this agent is a sub-agent (for transfer routing) -- **`output_key`**: Store the agent's final text output in session state under this key - -### Tool function conventions - -- Use clear function names and docstrings — the LLM sees these -- Type-hint all parameters — they define the tool's input schema -- Return a `dict` or `str` — the return value becomes the tool response - -## 5. Run the Agent - -### Web UI (primary debugging tool) - -```bash -adk web my_agent/ -``` - -Open `http://localhost:8000`. Select the agent from the dropdown, type a message, and see events in the Events tab. - -**Note**: `adk web` is for development only, not production. - -### CLI mode - -```bash -adk run my_agent/ -``` - -### API server - -```bash -adk api_server my_agent/ -``` - -### Programmatic execution - -```python -import asyncio -from google.adk.runners import InMemoryRunner -from google.genai import types - -async def main(): - from my_agent import agent - - runner = InMemoryRunner( - app_name="my_app", - agent=agent.root_agent, - ) - - session = await runner.session_service.create_session( - app_name="my_app", user_id="user1" - ) - - content = types.Content( - role="user", parts=[types.Part.from_text(text="What's the weather in Paris?")] - ) - - async for event in runner.run_async( - user_id="user1", - session_id=session.id, - new_message=content, - ): - if event.content and event.content.parts: - if event.content.parts[0].text: - print(f"{event.author}: {event.content.parts[0].text}") - -asyncio.run(main()) -``` - -## 6. From LLM Agent to Workflow Agent - -A `Workflow` extends the basic agent pattern with graph-based execution. Instead of a single LLM deciding what to do, define explicit nodes and edges: - -### agent.py — Minimal Workflow - -```python -from google.adk.workflow import Workflow - -def greet(node_input: str) -> str: - return f"Hello! You said: {node_input}" - -root_agent = Workflow( - name="my_workflow", - edges=[ - ('START', greet), - ], -) -``` - -## 5. Sample: Sequential Pipeline with LLM Agents - -A code write-review-refactor pipeline using `SequentialAgent`: - -### agent.py - -```python -from google.adk.agents.llm_agent import LlmAgent -from google.adk.agents.sequential_agent import SequentialAgent - -code_writer_agent = LlmAgent( - name="CodeWriterAgent", - model="gemini-2.5-flash", - instruction="""You are a Python Code Generator. -Based *only* on the user's request, write Python code that fulfills the requirement. -Output *only* the complete Python code block. -""", - description="Writes initial Python code based on a specification.", - output_key="generated_code", -) - -code_reviewer_agent = LlmAgent( - name="CodeReviewerAgent", - model="gemini-2.5-flash", - instruction="""You are an expert Python Code Reviewer. -Review the following code: - -```python -{generated_code} -``` - -Provide feedback as a concise, bulleted list. -If the code is excellent, state: "No major issues found." -""", - description="Reviews code and provides feedback.", - output_key="review_comments", -) - -code_refactorer_agent = LlmAgent( - name="CodeRefactorerAgent", - model="gemini-2.5-flash", - instruction="""You are a Python Code Refactoring AI. -Improve the code based on the review comments. - -**Original Code:** -```python -{generated_code} -``` - -**Review Comments:** -{review_comments} - -If no issues found, return the original code unchanged. -Output *only* the final Python code block. -""", - description="Refactors code based on review comments.", - output_key="refactored_code", -) - -root_agent = SequentialAgent( - name="CodePipelineAgent", - sub_agents=[code_writer_agent, code_reviewer_agent, code_refactorer_agent], - description="Executes a sequence of code writing, reviewing, and refactoring.", -) -``` - -### Key patterns in this sample - -- **`output_key`**: Each agent stores its output in session state, making it available to later agents -- **`{generated_code}`**: Instruction placeholders are resolved from session state at runtime -- **`SequentialAgent`**: Convenience wrapper that auto-generates `START -> agent1 -> agent2 -> agent3` edges - -## 6. Sample: Graph Workflow with Functions and Routing - -A data processing pipeline with conditional routing: - -### agent.py - -```python -from google.adk.workflow import Workflow -from google.adk.events.event import Event -from google.adk.agents.context import Context - -def parse_input(node_input: str) -> dict: - """Parse the user's input into a structured format.""" - words = node_input.strip().split() - return {"text": node_input, "word_count": len(words)} - -def classify(node_input: dict): - """Route based on input length.""" - if node_input["word_count"] > 10: - return Event(output=node_input, route="long") - return Event(output=node_input, route="short") - -def handle_short(node_input: dict) -> str: - return f"Short input ({node_input['word_count']} words): {node_input['text']}" - -def handle_long(node_input: dict) -> str: - return f"Long input ({node_input['word_count']} words). Summary: {node_input['text'][:50]}..." - -root_agent = Workflow( - name="classifier_workflow", - input_schema=str, - edges=[ - ('START', parse_input), - (parse_input, classify), - (classify, handle_short, "short"), - (classify, handle_long, "long"), - ], -) -``` - -## 7. Sample: Parallel Processing - -Process a list of items concurrently: - -### agent.py - -```python -from google.adk.workflow import Workflow -from google.adk.workflow import node - -def split_input(node_input: str) -> list: - """Split comma-separated input into a list.""" - return [item.strip() for item in node_input.split(",")] - -@node(parallel_worker=True) -def process_item(node_input: str) -> dict: - """Process a single item (runs in parallel for each list item).""" - return {"item": node_input, "length": len(node_input), "upper": node_input.upper()} - -def format_results(node_input: list) -> str: - """Format the parallel results into a readable summary.""" - lines = [f"- {r['item']}: {r['length']} chars -> {r['upper']}" for r in node_input] - return "Results:\n" + "\n".join(lines) - -root_agent = Workflow( - name="parallel_processor", - input_schema=str, - edges=[ - ('START', split_input), - (split_input, process_item), - (process_item, format_results), - ], -) -``` - -## 8. Sample: Workflow with LLM Agent and Tools - -Combine function nodes with an LLM agent that has tools: - -### agent.py - -```python -from google.adk.agents.llm_agent import LlmAgent -from google.adk.workflow import Workflow -from google.adk.agents.context import Context - -def get_weather(city: str) -> dict: - """Get the current weather for a city.""" - # In production, call a real API - return {"city": city, "temp": "72F", "condition": "sunny"} - -def extract_city(node_input: str) -> str: - """Extract city name from user input.""" - # Simple extraction; in production, use NLP or LLM - return node_input.strip() - -weather_agent = LlmAgent( - name="weather_reporter", - model="gemini-2.5-flash", - instruction="""You are a friendly weather reporter. -Use the get_weather tool to look up the weather, then give -a natural-language weather report for the city.""", - tools=[get_weather], -) - -def format_output(ctx: Context, node_input: str) -> str: - """Add a friendly sign-off.""" - return f"{node_input}\n\nHave a great day!" - -root_agent = Workflow( - name="weather_workflow", - input_schema=str, - edges=[ - ('START', extract_city), - (extract_city, weather_agent), - (weather_agent, format_output), - ], -) -``` - -## Troubleshooting - -### "No module named 'google.adk'" -Ensure the virtual environment is activated and `google-adk` is installed. - -### Agent not showing in `adk web` -Check that `__init__.py` contains `from . import agent` and `agent.py` defines `root_agent`. - -### API key errors -Verify `.env` is in the agent directory (not the parent) and contains a valid `GOOGLE_API_KEY`. - -### Model not found -Check the model name. Common models: `gemini-2.5-flash`, `gemini-2.5-pro`. The ADK also supports non-Google models (Anthropic, LiteLLM) with extra dependencies. diff --git a/.agents/skills/adk-agent-builder/references/human-in-the-loop.md b/.agents/skills/adk-agent-builder/references/human-in-the-loop.md deleted file mode 100644 index 164ece81a2..0000000000 --- a/.agents/skills/adk-agent-builder/references/human-in-the-loop.md +++ /dev/null @@ -1,279 +0,0 @@ -# Human-in-the-Loop (HITL) Reference - -Pause workflow execution to request user input and resume with their response. - -## 📋 Agent Verification Checklist (HITL) -Use this checklist when implementing human-in-the-loop logic: -- [ ] **Unique ID**: Is the `interrupt_id` unique per iteration in loops? (Critical to prevent infinite loops) -- [ ] **Resumability**: For multi-step HITL, did you export an `App` with `is_resumable=True`? -- [ ] **Resume Inputs**: If `rerun_on_resume=True` (default for LLM nodes), does the node handle `ctx.resume_inputs`? - -## 💡 Quick Reference -- **Request Input**: `yield RequestInput(message="Question", response_schema=Schema)` -- **Resumable Config**: `ResumabilityConfig(is_resumable=True)` - -HITL works in two modes: - -### Resumable mode (recommended for multi-step HITL) - -Export an `App` with resumability. The workflow checkpoints state and resumes at the interrupted node: - -```python -from google.adk.apps.app import App, ResumabilityConfig - -app = App( - name="my_app", - root_agent=workflow_agent, - resumability_config=ResumabilityConfig(is_resumable=True), -) -``` - -The agent loader checks for `app` before `root_agent`, so export both from `agent.py`. - -### Non-resumable mode (simpler, no App needed) - -The workflow replays from START on each user response, reconstructing state from session events. No `App` or `ResumabilityConfig` needed — just define `root_agent`. This works for simple single-interrupt HITL but replays all nodes up to the interrupt point on each resume. - -## Imports - -```python -from google.adk.events.request_input import RequestInput -from google.adk.agents.context import Context -from google.adk.workflow import Workflow -from google.adk.apps.app import App, ResumabilityConfig -``` - -## Basic Request Input - -Yield or return a `RequestInput` to pause execution and ask the user for input: - -```python -# Yield from a generator -async def approval_gate(ctx: Context, node_input: str): - yield RequestInput( - message="Please approve this action:", - response_schema={"type": "string"}, - ) - -# Or return directly from a regular function (no generator needed) -def evaluate_request(request: TimeOffRequest): - if request.days <= 1: - return TimeOffDecision(approved=True) # Auto-approve - return RequestInput( - interrupt_id="manager_approval", - message="Please review this time off request.", - payload=request, - response_schema=TimeOffDecision, - ) -``` - -The workflow pauses and emits a function call event to the user. When the user responds, the workflow resumes. - -## RequestInput Fields - -```python -from pydantic import BaseModel - -class ApprovalResponse(BaseModel): - approved: bool - comment: str - -RequestInput( - interrupt_id="custom_id", # Auto-generated UUID if omitted - message="Question for user", # Display message - payload={"key": "value"}, # Custom data to include - response_schema=ApprovalResponse, # Pydantic class, Python type, or JSON schema dict -) -``` - -| Field | Type | Description | -|-------|------|-------------| -| `interrupt_id` | `str` | Unique ID for this interrupt (auto-generated UUID) | -| `message` | `str` | Message shown to the user | -| `payload` | `Any` | Custom payload sent with the request | -| `response_schema` | `type \| dict` | Expected response format (Pydantic BaseModel class, Python type, or JSON schema dict) | - -## Resume Behavior: rerun_on_resume - -When a node is interrupted and the user responds, the `rerun_on_resume` flag controls what happens: - -### rerun_on_resume=False (default for FunctionNode) - -The user's response becomes the node's output. The node is NOT re-executed: - -```python -from google.adk.workflow import FunctionNode - -async def ask_approval(ctx: Context, node_input: str): - yield RequestInput(message="Approve?") - -# Node won't rerun; user's response is passed as output to next node -approval_node = FunctionNode(ask_approval, rerun_on_resume=False) -``` - -### rerun_on_resume=True (default for LlmAgentWrapper) - -The node is re-executed with the user's response available in `ctx.resume_inputs`: - -```python -async def interactive_node(ctx: Context, node_input: str): - if ctx.resume_inputs: - # Second run: user responded - user_answer = list(ctx.resume_inputs.values())[0] - yield Event(output=f"User said: {user_answer}") - else: - # First run: ask the user - yield RequestInput(message="What should I do?") -``` - -## HITL with LLM Agents - -LLM agents support HITL via `LongRunningFunctionTool`: - -```python -from google.adk.tools.long_running_tool import LongRunningFunctionTool - -def approval_tool(request: str) -> str: - """Request human approval for an action.""" - return f"Approved: {request}" - -llm_agent = LlmAgent( - name="agent_with_approval", - model="gemini-2.5-flash", - instruction="When you need approval, use the approval_tool.", - tools=[LongRunningFunctionTool(func=approval_tool)], -) - -# LlmAgentWrapper has rerun_on_resume=True by default -agent = Workflow( - name="hitl_workflow", - edges=[ - ('START', llm_agent), - (llm_agent, next_step), - ], -) -``` - -## Multi-Step HITL - -A node can request input multiple times by checking `ctx.resume_inputs`: - -```python -async def multi_step_form(ctx: Context, node_input: str): - if not ctx.resume_inputs: - # Step 1: Ask for name - yield RequestInput( - interrupt_id="ask_name", - message="What is your name?", - ) - return - - if "ask_name" in ctx.resume_inputs and "ask_email" not in ctx.resume_inputs: - # Step 2: Ask for email - yield RequestInput( - interrupt_id="ask_email", - message="What is your email?", - ) - return - - # All inputs collected - name = ctx.resume_inputs["ask_name"] - email = ctx.resume_inputs["ask_email"] - yield Event(output={"name": name, "email": email}) -``` - -## HITL in Loops (Unique interrupt_id) - -When a HITL node can fire multiple times in a loop (e.g. reject → revise → re-approve), you **must use a unique `interrupt_id` per iteration**. Reusing the same ID causes event-based state reconstruction to confuse earlier responses with the current interrupt, resulting in an infinite restart loop. - -```python -async def review(ctx: Context, node_input: Any): - # Counter-based unique ID per review cycle - review_count = ctx.state.get('review_count', 0) - interrupt_id = f'review_{review_count}' - - response = ctx.resume_inputs.get(interrupt_id) - if response: - route = 'approved' if response.get('approved') else 'rejected' - yield Event( - output=response, - route=route, - state={'review_count': review_count + 1}, - ) - return - - yield RequestInput( - interrupt_id=interrupt_id, - message="Approve this plan?", - response_schema=ApprovalSchema, - ) -``` - -Key points: -- Store a counter in `ctx.state` and increment on each response -- Use the counter in the `interrupt_id` (e.g. `review_0`, `review_1`, ...) -- Look up `ctx.resume_inputs` with the same counter-based ID -- This applies to both resumable and non-resumable modes - -## Resumability Configuration - -### Resumable mode (recommended for multi-step HITL) - -```python -from google.adk.apps.app import App, ResumabilityConfig - -# Export BOTH root_agent and app from agent.py -root_agent = Workflow(name="my_workflow", edges=[...]) - -app = App( - name="my_app", - root_agent=root_agent, - resumability_config=ResumabilityConfig(is_resumable=True), -) -``` - -When `is_resumable=True`: -- Workflow state is checkpointed in session's `agent_states` map -- On resume, the workflow loads checkpointed state and resumes at the interrupted node -- Required for multi-step HITL, `LongRunningFunctionTool`, and complex workflows - -### Non-resumable mode (simpler) - -When `is_resumable=False` (default) or no `App` is exported: -- No state checkpointing — the workflow replays from START on each user response -- State is reconstructed from session events during replay -- Completed nodes are skipped; execution resumes at the interrupted node -- Works for simple single-interrupt HITL without needing `App` or `ResumabilityConfig` -- For multi-step HITL or complex workflows, use resumable mode instead - -## Responding to HITL Requests - -From the client side, respond to function calls: - -```python -from google.genai import types - -# Extract function_call_id from the interrupt event -function_call_id = interrupt_event.content.parts[0].function_call.id - -# Create response -response = types.Content( - role="user", - parts=[types.Part( - function_response=types.FunctionResponse( - id=function_call_id, - name="adk_request_input", - response={"result": "User's answer here"}, - ) - )], -) - -# Send response to resume the workflow -async for event in runner.run_async( - user_id=user_id, - session_id=session_id, - new_message=response, -): - # Process resumed workflow events - pass -``` diff --git a/.agents/skills/adk-agent-builder/references/import-paths.md b/.agents/skills/adk-agent-builder/references/import-paths.md deleted file mode 100644 index 52946ea3ff..0000000000 --- a/.agents/skills/adk-agent-builder/references/import-paths.md +++ /dev/null @@ -1,138 +0,0 @@ -# ADK Import Paths Quick Reference - -## 📋 Agent Verification Checklist (Imports) -Use this checklist to ensure you are using the most idiomatic import paths: -- [ ] **Canonical Imports**: Did you use the short canonical imports where available (e.g., `from google.adk import Agent`) instead of the verbose ones? -- [ ] **Avoid Deprecated**: Are you avoiding deprecated paths (e.g., use `McpToolset` instead of `MCPToolset`)? - -## Canonical Imports (preferred, used by all samples) - -```python -from google.adk import Agent, Context, Event, Workflow -from google.adk.events import RequestInput -from google.adk.workflow import node, RetryConfig, Edge, JoinNode -``` - -## Core Agents - -| Component | Import | -|-----------|--------| -| `Agent` (canonical) | `from google.adk import Agent` | -| `Agent` (verbose) | `from google.adk.agents.llm_agent import Agent` | -| `LlmAgent` | `from google.adk.agents.llm_agent import LlmAgent` | -| `SequentialAgent` | `from google.adk.agents.sequential_agent import SequentialAgent` | -| `ParallelAgent` | `from google.adk.agents.parallel_agent import ParallelAgent` | -| `LoopAgent` | `from google.adk.agents.loop_agent import LoopAgent` | - -## Workflow Agents (Experimental) - -| Component | Import | -|-----------|--------| -| `Workflow` | `from google.adk.workflow import Workflow` | -| `Edge` | `from google.adk.workflow import Edge` | -| `Agent` (supports task/single_turn mode) | `from google.adk import Agent` | - -## Workflow Nodes - -| Component | Import | -|-----------|--------| -| `FunctionNode` | `from google.adk.workflow import FunctionNode` | -| `_LlmAgentWrapper` (private, auto-used) | `from google.adk.workflow._llm_agent_wrapper import _LlmAgentWrapper` | -| `AgentNode` | `from google.adk.workflow._agent_node import AgentNode` | -| `_ToolNode` (private) | `from google.adk.workflow._tool_node import _ToolNode` | -| `JoinNode` | `from google.adk.workflow import JoinNode` | -| `ParallelWorker` | `from google.adk.workflow._parallel_worker import ParallelWorker` | -| `BaseNode`, `START` | `from google.adk.workflow import BaseNode, START` | -| `@node` decorator | `from google.adk.workflow import node` | - -## Workflow Events and Context - -| Component | Import | -|-----------|--------| -| `Event` | `from google.adk.events.event import Event` | -| `RequestInput` | `from google.adk.events.request_input import RequestInput` | -| `Context` | `from google.adk.agents.context import Context` | -| `WorkflowGraph` | `from google.adk.workflow._workflow_graph import WorkflowGraph` | -| `RetryConfig` | `from google.adk.workflow import RetryConfig` | - -## Task Mode - -| Component | Import | -|-----------|--------| -| `RequestTaskTool` | `from google.adk.agents.llm.task._request_task_tool import RequestTaskTool` | -| `FinishTaskTool` | `from google.adk.agents.llm.task._finish_task_tool import FinishTaskTool` | -| `TaskRequest`, `TaskResult` | `from google.adk.agents.llm.task._task_models import TaskRequest, TaskResult` | - -## Tools - -| Component | Import | -|-----------|--------| -| `FunctionTool` | `from google.adk.tools.function_tool import FunctionTool` | -| `BaseTool` | `from google.adk.tools.base_tool import BaseTool` | -| `BaseToolset` | `from google.adk.tools.base_toolset import BaseToolset` | -| `ToolContext` | `from google.adk.tools.tool_context import ToolContext` | -| `LongRunningFunctionTool` | `from google.adk.tools.long_running_tool import LongRunningFunctionTool` | -| `McpToolset` | `from google.adk.tools.mcp_tool.mcp_toolset import McpToolset` | -| `StdioConnectionParams` | `from google.adk.tools.mcp_tool import StdioConnectionParams` | -| `SseConnectionParams` | `from google.adk.tools.mcp_tool import SseConnectionParams` | -| `OpenAPIToolset` | `from google.adk.tools.openapi_tool import OpenAPIToolset` | - -## Built-in Tools - -| Tool | Import | -|------|--------| -| `google_search` | `from google.adk.tools import google_search` | -| `load_artifacts` | `from google.adk.tools import load_artifacts` | -| `load_memory` | `from google.adk.tools import load_memory` | -| `exit_loop` | `from google.adk.tools import exit_loop` | -| `transfer_to_agent` | `from google.adk.tools import transfer_to_agent` | -| `get_user_choice` | `from google.adk.tools import get_user_choice` | - -## Runner and Session - -| Component | Import | -|-----------|--------| -| `Runner` | `from google.adk.runners import Runner` | -| `InMemoryRunner` | `from google.adk.runners import InMemoryRunner` | -| `InMemorySessionService` | `from google.adk.sessions import InMemorySessionService` | -| `DatabaseSessionService` | `from google.adk.sessions import DatabaseSessionService` | - -## App and Plugins - -| Component | Import | -|-----------|--------| -| `App` | `from google.adk.apps import App` | -| `ResumabilityConfig` | `from google.adk.apps.app import ResumabilityConfig` | -| `BasePlugin` | `from google.adk.plugins.base_plugin import BasePlugin` | -| `ContextFilterPlugin` | `from google.adk.plugins.context_filter_plugin import ContextFilterPlugin` | - -## Models - -| Component | Import | -|-----------|--------| -| `LiteLlm` | `from google.adk.models.lite_llm import LiteLlm` | -| `LlmRequest` | `from google.adk.models.llm_request import LlmRequest` | -| `LlmResponse` | `from google.adk.models.llm_response import LlmResponse` | - -## Callbacks - -| Component | Import | -|-----------|--------| -| `CallbackContext` | `from google.adk.agents.callback_context import CallbackContext` | -| `ReadonlyContext` | `from google.adk.agents.readonly_context import ReadonlyContext` | - -## Code Executors - -| Component | Import | -|-----------|--------| -| `BuiltInCodeExecutor` | `from google.adk.code_executors.built_in_code_executor import BuiltInCodeExecutor` | - -## Google GenAI Types - -| Component | Import | -|-----------|--------| -| `types` | `from google.genai import types` | -| `Content` | `from google.genai.types import Content` | -| `ModelContent` | `from google.genai.types import ModelContent` | -| `Part` | `from google.genai.types import Part` | -| `GenerateContentConfig` | `from google.genai.types import GenerateContentConfig` | diff --git a/.agents/skills/adk-agent-builder/references/llm-agent-nodes.md b/.agents/skills/adk-agent-builder/references/llm-agent-nodes.md deleted file mode 100644 index ee0cb9fa5f..0000000000 --- a/.agents/skills/adk-agent-builder/references/llm-agent-nodes.md +++ /dev/null @@ -1,454 +0,0 @@ -# LLM Agent Nodes Reference - -Embed LLM-powered agents as nodes in workflow graphs. - -## 📋 Agent Verification Checklist (LLM Nodes) -Use this checklist to verify your LLM agent configuration: -- [ ] **Output Type**: If no `output_schema` is set, downstream now receives `str` (auto-extracted from `types.Content`). You can safely type-hint `node_input: str`. -- [ ] **State Serialization**: If this agent feeds into a `JoinNode`, did you set `output_schema` to avoid non-serializable `types.Content` errors? -- [ ] **Instructions**: Are `{var}` templates used in instructions resolving ONLY from `ctx.state`? (Not `node_input`) -- [ ] **Config**: Are instructions, tools, and response schema set on the `LlmAgent` directly, and NOT in `generate_content_config`? - -## 💡 Quick Reference -- **Chat Mode**: Default. Multi-turn, keeps session history. -- **Single-Turn Mode**: Isolated. Set `mode="single_turn"` or rely on auto-wrapping defaults. -- **Task Mode**: Multi-turn within a task. Set `mode="task"`. -- **Stateless**: Set `include_contents="none"` to ignore session history. - -## Imports - -```python -from google.adk.agents.llm_agent import LlmAgent -from google.adk.workflow._llm_agent_wrapper import _LlmAgentWrapper # private -from google.adk.workflow import Workflow -``` - -## Choosing the Right LLM Agent - -**Use `google.adk.agents.llm_agent.LlmAgent`** in workflow edges. It is auto-wrapped as `LlmAgentWrapper`, which emits `Event(output=...)` for downstream data passing. This is required for any LLM agent that needs to pass output to downstream function nodes via `node_input`. - -```python -from google.adk.agents.llm_agent import LlmAgent - -writer = LlmAgent( - name="writer", - model="gemini-2.5-flash", - instruction="Write a short story.", - output_schema=Story, -) - -# writer is auto-wrapped as _LlmAgentWrapper — downstream gets Event(output=...) -agent = Workflow( - name="pipeline", - edges=[('START', writer), (writer, process_story)], -) -``` - -## Basic LLM Node - -```python -from google.adk.agents.llm_agent import LlmAgent - -writer = LlmAgent( - name="writer", - model="gemini-2.5-flash", - instruction="Write a short story based on the user's prompt.", -) - -reviewer = LlmAgent( - name="reviewer", - model="gemini-2.5-flash", - instruction="Review the following story and provide feedback.", -) - -agent = Workflow( - name="story_pipeline", - edges=[ - ('START', writer), # Auto-wrapped as LlmAgentWrapper - (writer, reviewer), - ], -) -``` - -## LLM Agent Output Types (Critical) - -**LlmAgentWrapper auto-extracts text and outputs `str` when no `output_schema` is set.** Previously, it outputted `types.Content` causing type errors. Now, if you type-hint `node_input: str`, it will work correctly for standard text output. - -**Solutions (pick one):** - -1. **Use `Any` and extract text** (recommended for function nodes after LLM agents): - -```python -from typing import Any -from google.genai import types - -def process_llm_output(node_input: Any) -> str: - if isinstance(node_input, types.Content): - return ''.join(p.text for p in (node_input.parts or []) if p.text) - return str(node_input) if node_input is not None else '' -``` - -2. **Use `output_schema`** on the LLM agent to get a parsed `dict` instead: - -```python -from pydantic import BaseModel - -class CodeOutput(BaseModel): - code: str - language: str - -writer = LlmAgent( - name="writer", - model="gemini-2.5-flash", - instruction="Write code. Return JSON with 'code' and 'language' fields.", - output_schema=CodeOutput, -) - -# Downstream node receives dict: {"code": "...", "language": "python"} -def process_code(node_input: dict) -> str: - return node_input["code"] -``` - -**Summary of LLM agent node output types:** - -| LLM Agent Config | `node_input` Type for Next Node | -|-----------------|-------------------------------| -| No `output_schema` | `types.Content` | -| With `output_schema` | `dict` (parsed from Pydantic model) | - -**State serialization warning:** When LLM agents feed into a `JoinNode`, the JoinNode stores intermediate results in session state. Without `output_schema`, this stores `types.Content` objects which are **not JSON-serializable** and will cause `TypeError` with SQLite/database session services. Always use `output_schema` on LLM agents that feed into a JoinNode. - -## Auto-Wrapping Behavior - -When you place an `LlmAgent` in workflow edges, it is auto-wrapped as `_LlmAgentWrapper`. The wrapper: -- Defaults to `single_turn` mode (agent sees only current input, not session history) -- Sets `rerun_on_resume=True` (reruns after HITL interrupts) -- Creates a content branch for isolation between parallel LLM agents - -The mode is set on the `LlmAgent` itself, not the wrapper: - -```python -from google.adk.agents.llm_agent import LlmAgent - -# single_turn (default when auto-wrapped): isolated, no session history -classifier = LlmAgent( - name="classifier", - model="gemini-2.5-flash", - instruction="Classify the input as positive, negative, or neutral.", - output_schema=ClassificationResult, -) - -# task mode: supports HITL, multi-turn within the task -task_agent = LlmAgent( - name="task_agent", - model="gemini-2.5-flash", - mode="task", - instruction="Process the request.", -) -``` - -## LlmAgent Configuration - -### Instructions - -Dynamic instructions with placeholders resolved from session state. **`{var}` templates only resolve from `ctx.state` — `node_input` is NOT available in templates.** To use predecessor data in instructions, store it in state first (via `Event(state={...})` or `output_key`): - -```python -agent = LlmAgent( - name="personalized", - model="gemini-2.5-flash", - instruction="""You are helping {user_name}. -Their preferences are: {preferences}. -Respond in {language}.""", -) -# {user_name}, {preferences}, {language} resolved from session state -# Missing variables raise KeyError at runtime — use {var?} for optional: -# instruction="Current mood: {mood?}" # empty string if 'mood' not in state -``` - -**Template variable behavior:** - -| Syntax | Missing Key Behavior | -|--------|---------------------| -| `{var}` | Raises `KeyError` at LLM call time | -| `{var?}` | Substitutes empty string, logs debug message | -| `{not.an" identifier}` | Left as-is (not substituted) | - -Instruction provider function for fully dynamic instructions: - -```python -from google.adk.agents.readonly_context import ReadonlyContext - -def build_instruction(ctx: ReadonlyContext) -> str: - agents = ctx.state.get("active_agents", []) - return f"Coordinate these agents: {', '.join(agents)}" - -agent = LlmAgent( - name="coordinator", - model="gemini-2.5-flash", - instruction=build_instruction, -) -``` - -### Output Schema - -Structure LLM output with Pydantic models: - -```python -from pydantic import BaseModel - -class ReviewResult(BaseModel): - score: int - feedback: str - approved: bool - -reviewer = LlmAgent( - name="reviewer", - model="gemini-2.5-flash", - instruction="Review the code and provide structured feedback.", - output_schema=ReviewResult, -) -``` - -When used as a workflow node, the output becomes a `dict` (via `model_dump()`) as `node_input` for the next node. - -### Output Key - -Store agent output in session state: - -```python -agent = LlmAgent( - name="writer", - model="gemini-2.5-flash", - instruction="Write a draft.", - output_key="draft", # Stores output in state['draft'] -) -``` - -### include_contents - -Control conversation history: - -```python -agent = LlmAgent( - name="stateless", - model="gemini-2.5-flash", - instruction="Process this input independently.", - include_contents="none", # Don't include session history -) -``` - -## Tools - -Add tools to LLM agents: - -```python -def search_database(query: str) -> str: - """Search the database for relevant records.""" - return f"Results for: {query}" - -def send_email(to: str, subject: str, body: str) -> str: - """Send an email to the specified address.""" - return "Email sent" - -agent = LlmAgent( - name="assistant", - model="gemini-2.5-flash", - instruction="Help the user with their request.", - tools=[search_database, send_email], -) -``` - -Tools can be: -- Python functions (auto-wrapped as `FunctionTool`) -- `BaseTool` instances -- `BaseToolset` instances (e.g., MCP toolsets) - -## Callbacks - -### Before Model Callback - -Intercept or modify LLM requests. Return an `LlmResponse` to skip the LLM call; return `None` to proceed: - -```python -from google.adk.agents.callback_context import CallbackContext -from google.adk.models.llm_request import LlmRequest -from google.adk.models.llm_response import LlmResponse - -def guard_callback( - callback_context: CallbackContext, - llm_request: LlmRequest, -) -> LlmResponse | None: - for content in llm_request.contents: - if content.parts: - for part in content.parts: - if part.text and "unsafe" in part.text: - return LlmResponse( - content=types.ModelContent("I cannot process that.") - ) - return None # Proceed with normal LLM call - -agent = LlmAgent( - name="guarded", - model="gemini-2.5-flash", - before_model_callback=guard_callback, -) -``` - -### After Model Callback - -Transform LLM responses. Return an `LlmResponse` to replace; return `None` to keep original: - -```python -def log_response( - callback_context: CallbackContext, - llm_response: LlmResponse, -) -> LlmResponse | None: - print(f"LLM responded: {llm_response.content}") - return None # Use original response - -agent = LlmAgent( - name="logged", - model="gemini-2.5-flash", - after_model_callback=log_response, -) -``` - -### Before/After Tool Callbacks - -Intercept tool calls. Return a `dict` to use as tool response (skipping actual execution); return `None` to proceed: - -```python -from google.adk.tools.base_tool import BaseTool -from google.adk.tools.tool_context import ToolContext - -def audit_tool( - tool: BaseTool, - args: dict[str, Any], - tool_context: ToolContext, -) -> dict | None: - print(f"Calling tool {tool.name} with args: {args}") - return None # Proceed with tool call - -def validate_tool_result( - tool: BaseTool, - args: dict[str, Any], - tool_context: ToolContext, - tool_response: dict, -) -> dict | None: - if "error" in tool_response: - return {"result": "Tool execution failed, please try again."} - return None # Use original result - -agent = LlmAgent( - name="audited", - model="gemini-2.5-flash", - tools=[my_tool], - before_tool_callback=audit_tool, - after_tool_callback=validate_tool_result, -) -``` - -### Multiple Callbacks - -Pass a list of callbacks. They execute in order until one returns non-None: - -```python -agent = LlmAgent( - name="multi_callback", - model="gemini-2.5-flash", - before_model_callback=[safety_check, rate_limiter, logger], -) -``` - -### Error Callbacks - -Handle LLM or tool errors gracefully: - -```python -def handle_model_error( - callback_context: CallbackContext, - llm_request: LlmRequest, - error: Exception, -) -> LlmResponse | None: - return LlmResponse( - content=types.ModelContent("Service temporarily unavailable.") - ) - -def handle_tool_error( - tool: BaseTool, - args: dict[str, Any], - tool_context: ToolContext, - error: Exception, -) -> dict | None: - return {"error": str(error), "fallback": True} - -agent = LlmAgent( - name="resilient", - model="gemini-2.5-flash", - on_model_error_callback=handle_model_error, - on_tool_error_callback=handle_tool_error, -) -``` - -## All Callback Types - -| Callback | Signature | Return to Override | -|----------|-----------|-------------------| -| `before_model_callback` | `(CallbackContext, LlmRequest) -> LlmResponse?` | Return `LlmResponse` to skip LLM | -| `after_model_callback` | `(CallbackContext, LlmResponse) -> LlmResponse?` | Return `LlmResponse` to replace | -| `on_model_error_callback` | `(CallbackContext, LlmRequest, Exception) -> LlmResponse?` | Return `LlmResponse` to suppress error | -| `before_tool_callback` | `(BaseTool, dict, ToolContext) -> dict?` | Return `dict` to skip tool | -| `after_tool_callback` | `(BaseTool, dict, ToolContext, dict) -> dict?` | Return `dict` to replace result | -| `on_tool_error_callback` | `(BaseTool, dict, ToolContext, Exception) -> dict?` | Return `dict` to suppress error | - -All callbacks can be sync or async. All accept a single callback or a list. - -## Generate Content Config - -Fine-tune LLM generation: - -```python -from google.genai import types - -agent = LlmAgent( - name="creative", - model="gemini-2.5-flash", - instruction="Write creative stories.", - generate_content_config=types.GenerateContentConfig( - temperature=0.9, - top_p=0.95, - max_output_tokens=2048, - ), -) -``` - -## Agent Transfer - -Agents can transfer control to sub-agents: - -```python -specialist = LlmAgent( - name="specialist", - model="gemini-2.5-flash", - instruction="Handle specialized requests.", -) - -coordinator = LlmAgent( - name="coordinator", - model="gemini-2.5-flash", - instruction="Route requests to the specialist when needed.", - sub_agents=[specialist], -) -``` - -Control transfer behavior: - -```python -agent = LlmAgent( - name="isolated", - model="gemini-2.5-flash", - disallow_transfer_to_parent=True, - disallow_transfer_to_peers=True, -) -``` diff --git a/.agents/skills/adk-agent-builder/references/multi-agent.md b/.agents/skills/adk-agent-builder/references/multi-agent.md deleted file mode 100644 index c3db216da3..0000000000 --- a/.agents/skills/adk-agent-builder/references/multi-agent.md +++ /dev/null @@ -1,142 +0,0 @@ -# Multi-Agent Patterns - -## 📋 Agent Verification Checklist (Multi-Agent) -Use this checklist when setting up multi-agent systems: -- [ ] **Description**: Does every sub-agent have a clear `description`? (Used by LLM for routing or tool generation) -- [ ] **Model Inheritance**: Did you let sub-agents inherit the model from the coordinator to avoid duplication? -- [ ] **Loop Termination**: If using `LoopAgent`, is there a clear way to call `exit_loop` to prevent infinite loops? - -## 💡 Quick Reference -- **Sequential**: `SequentialAgent(sub_agents=[a, b, c])` -- **Parallel**: `ParallelAgent(sub_agents=[a, b, c])` -- **Loop**: `LoopAgent(sub_agents=[a, b], max_iterations=5)` - -## LLM-Based Multi-Agent (Chat Transfer) - -```python -from google.adk.agents.llm_agent import Agent - -researcher = Agent( - name='researcher', - description='Researches topics.', - instruction='You research topics and provide findings.', - tools=[search_tool], -) - -writer = Agent( - name='writer', - description='Writes content.', - instruction='You write content based on research.', -) - -root_agent = Agent( - model='gemini-2.5-flash', - name='coordinator', - instruction=( - 'Delegate research to the researcher and ' - 'writing to the writer.' - ), - sub_agents=[researcher, writer], -) -``` - -**Key rules:** -- Only the root agent needs `model=`. Sub-agents inherit it. -- Each sub-agent needs a `description` (used for routing). -- Transfer between agents is automatic via LLM reasoning. -- `disallow_transfer_to_parent=True` prevents back-transfer. -- `disallow_transfer_to_peers=True` prevents peer-transfer. - -## Task-Based Multi-Agent (Structured Delegation) - -For structured input/output, use task mode instead of chat transfer. See **`task-mode.md`** for full details. - -```python -from google.adk import Agent - -worker = Agent( - name='worker', - mode='task', # or 'single_turn' - input_schema=WorkerInput, - output_schema=WorkerOutput, - instruction='Do work, then call finish_task.', - description='Performs structured work.', -) - -root_agent = Agent( - name='coordinator', - model='gemini-2.5-flash', - sub_agents=[worker], - instruction='Delegate to worker via request_task_worker.', -) -``` - -## Non-LLM Orchestration Agents - -### SequentialAgent - -Runs sub-agents in order, one after another: - -```python -from google.adk.agents.sequential_agent import SequentialAgent - -root_agent = SequentialAgent( - name='pipeline', - sub_agents=[step1_agent, step2_agent, step3_agent], -) -``` - -### ParallelAgent - -Runs sub-agents concurrently: - -```python -from google.adk.agents.parallel_agent import ParallelAgent - -root_agent = ParallelAgent( - name='fan_out', - sub_agents=[task_a, task_b, task_c], -) -``` - -### LoopAgent - -Repeats sub-agents until `exit_loop` is called: - -```python -from google.adk.tools import exit_loop -from google.adk.agents.loop_agent import LoopAgent - -looping_agent = Agent( - name='checker', - tools=[exit_loop], - instruction='Check the result and call exit_loop if done.', -) - -root_agent = LoopAgent( - name='retry_loop', - sub_agents=[worker_agent, looping_agent], - max_iterations=5, -) -``` - -## Model Configuration - -- Default model: `gemini-2.5-flash` -- Override globally: `Agent.set_default_model('gemini-2.5-pro')` -- Model inheritance: sub-agents inherit parent's model if not set -- Non-Gemini models via LiteLlm: - ```python - from google.adk.models.lite_llm import LiteLlm - root_agent = Agent(model=LiteLlm(model='anthropic/claude-sonnet-4-20250514'), ...) - ``` - -## Common Pitfalls - -- **Agent stuck in sub-agent:** Sub-agent has no path back to parent. - Set `disallow_transfer_to_parent=False` (default) or add explicit - transfer instructions. -- **Wrong agent handles request:** Ambiguous `description` fields. Make - each agent's description clearly differentiate its scope. -- **Circular imports:** Define all agents in a single `agent.py` file, - or use a shared module for sub-agents. diff --git a/.agents/skills/adk-agent-builder/references/parallel-and-fanout.md b/.agents/skills/adk-agent-builder/references/parallel-and-fanout.md deleted file mode 100644 index 3aca914ce6..0000000000 --- a/.agents/skills/adk-agent-builder/references/parallel-and-fanout.md +++ /dev/null @@ -1,238 +0,0 @@ -# Parallel Execution, Fan-Out, and Fan-In Reference - -Execute multiple nodes concurrently and collect their results. - -## 📋 Agent Verification Checklist (Parallel & Fan-Out) -Use this checklist when implementing parallel patterns: -- [ ] **JoinNode Serialization**: If LLM agents feed into a `JoinNode`, did you set `output_schema` on them to prevent JSON serialization errors? -- [ ] **ParallelWorker Usage**: Did you avoid using `parallel_worker=True` on fan-out nodes? (It expects a list input) -- [ ] **Multi-Trigger vs Join**: Do you understand that Multi-Trigger fires downstream once per branch, while JoinNode waits and fires once with merged dict? - -## 💡 Quick Reference -- **Fan-Out (Tuple)**: `('START', (node_a, node_b))` -- **Fan-In (JoinNode)**: `((node_a, node_b), join_node)` -- **List Worker**: `@node(parallel_worker=True)` (Takes list, outputs list) - -## Imports - -```python -from google.adk.workflow import Workflow -from google.adk.workflow._parallel_worker import ParallelWorker -from google.adk.workflow import JoinNode -from google.adk.workflow import node -``` - -## Fan-Out: Multiple Branches - -Send output to multiple nodes simultaneously using tuple syntax: - -```python -def analyze_text(node_input: str) -> str: - return f"Analysis: {node_input}" - -def translate_text(node_input: str) -> str: - return f"Translation: {node_input}" - -def summarize_text(node_input: str) -> str: - return f"Summary: {node_input}" - -agent = Workflow( - name="fan_out", - edges=[ - ('START', (analyze_text, translate_text, summarize_text)), - ], -) -``` - -Each branch receives the same input and runs concurrently. - -## Fan-In: JoinNode - -Collect outputs from multiple branches before continuing: - -```python -join = JoinNode(name="collect_results") - -agent = Workflow( - name="fan_out_fan_in", - edges=[ - ('START', (analyze_text, translate_text, summarize_text)), - ((analyze_text, translate_text, summarize_text), join), - (join, final_processor), - ], -) -``` - -### JoinNode Output Format - -JoinNode outputs a dictionary mapping predecessor names to their outputs: - -```python -# JoinNode output: -# { -# "analyze_text": "Analysis: hello", -# "translate_text": "Translation: hello", -# "summarize_text": "Summary: hello", -# } - -def final_processor(node_input: dict) -> str: - analysis = node_input["analyze_text"] - translation = node_input["translate_text"] - summary = node_input["summarize_text"] - return f"Combined: {analysis}, {translation}, {summary}" -``` - -### JoinNode Behavior - -- Waits for **all** predecessor nodes to complete -- Emits intermediate events while still waiting (downstream not triggered until all inputs received) -- Only triggers downstream when all inputs are received -- Stores partial inputs in workflow state - -**Serialization warning:** JoinNode stores partial inputs in session state while waiting. If predecessors are LLM agents without `output_schema`, the stored values are `types.Content` objects which are **not JSON-serializable**. This causes `TypeError` with SQLite/database session services. Fix: use `output_schema` on LLM agents feeding into a JoinNode. - -## ParallelWorker: Process Lists in Parallel - -Apply the same node to each item in a list concurrently: - -```python -def process_item(node_input: int) -> int: - return node_input * 2 - -parallel = ParallelWorker(node(process_item)) - -def produce_list(node_input: str) -> list: - return [1, 2, 3, 4, 5] - -agent = Workflow( - name="parallel_processing", - edges=[ - ('START', produce_list), - (produce_list, parallel), - ], -) -# Output: [2, 4, 6, 8, 10] -``` - -### ParallelWorker Details - -- Input: a **list** (or single item, which gets wrapped in a list) -- Output: a **list** of results in the same order as inputs -- Empty list input produces empty list output -- Each item is processed by a dynamically created worker node -- Workers are named `{parent_name}__{index}` (e.g., `process_item__0`) -- Default `rerun_on_resume=True` - -### ParallelWorker with @node Decorator - -```python -@node(parallel_worker=True) -def process_item(node_input: int) -> int: - return node_input * 2 - -# Equivalent to: ParallelWorker(FunctionNode(process_item_fn)) -``` - -### ParallelWorker with Agents - -Set `parallel_worker=True` directly on an Agent: - -```python -from google.adk import Agent - -explain_topic = Agent( - name="explain_topic", - instruction="Explain how this topic relates to the original topic: \"{topic}\".", - output_schema=TopicExplanation, - parallel_worker=True, # Each list item processed by a cloned agent -) - -agent = Workflow( - name="parallel_analysis", - edges=[ - ('START', process_input, find_related_topics, explain_topic, aggregate), - ], -) -``` - -Or wrap manually: - -```python -parallel_analyzer = ParallelWorker(analyzer) -``` - -**Do NOT use `parallel_worker=True` on fan-out nodes.** Fan-out edges `(a, (b, c, d))` already run nodes in parallel. Adding `parallel_worker=True` makes the node expect a list input and iterate over it — if it receives a single value or None, it produces no output and the JoinNode gets nothing. - -## Multi-Trigger (Fan-Out to Shared Downstream) - -Fan-out branches that all feed a single downstream node. The downstream node is triggered once per branch: - -```python -async def send_message(node_input: Any): - yield Event(message=f"Triggered for input: {node_input}") - -agent = Workflow( - name="root_agent", - edges=[( - "START", - (make_uppercase, count_characters, reverse_string), - send_message, - )], - input_schema=str, -) -``` - -This differs from JoinNode: here `send_message` fires 3 times (once per branch), while JoinNode waits for all branches and fires once with a merged dict. - -## Diamond Pattern - -Fan-out then fan-in (diamond shape): - -```python -def splitter(node_input: str) -> str: - return node_input - -def branch_a(node_input: str) -> str: - return f"A: {node_input}" - -def branch_b(node_input: str) -> str: - return f"B: {node_input}" - -join = JoinNode(name="merge") - -def combiner(node_input: dict) -> str: - return f"Combined: {node_input['branch_a']} + {node_input['branch_b']}" - -agent = Workflow( - name="diamond", - edges=[ - ('START', splitter), - (splitter, (branch_a, branch_b)), - ((branch_a, branch_b), join), - (join, combiner), - ], -) -``` - -## SequentialAgent and ParallelAgent - -Convenience subclasses for common patterns: - -```python -from google.adk.agents.sequential_agent import SequentialAgent -from google.adk.agents.parallel_agent import ParallelAgent - -# Sequential: runs sub_agents in order -pipeline = SequentialAgent( - name="pipeline", - sub_agents=[writer_agent, reviewer_agent, editor_agent], -) -# Equivalent to: START -> writer -> reviewer -> editor - -# Parallel: runs sub_agents concurrently -parallel = ParallelAgent( - name="concurrent", - sub_agents=[analyzer_agent, translator_agent, summarizer_agent], -) -# Equivalent to: START -> (analyzer, translator, summarizer) -``` diff --git a/.agents/skills/adk-agent-builder/references/routing-and-conditions.md b/.agents/skills/adk-agent-builder/references/routing-and-conditions.md deleted file mode 100644 index a2c6284742..0000000000 --- a/.agents/skills/adk-agent-builder/references/routing-and-conditions.md +++ /dev/null @@ -1,232 +0,0 @@ -# Routing and Conditional Branching Reference - -Route workflow execution along different paths based on node outputs. - -## 📋 Agent Verification Checklist (Routing) -Use this checklist when implementing routing logic: -- [ ] **Syntax**: Is the preferred dict syntax used for mapping routes to targets? (Avoid verbose individual edges) -- [ ] **Loops**: Are cycles (loops) routed? (Unconditional cycles are rejected during validation) -- [ ] **Triggering**: If a node has conditional routing, do ALL outgoing edges have routes? (To avoid unintended triggering by unconditional edges) - -## 💡 Quick Reference -- **Dict Routing**: `(source_node, {"route_a": target_a, "route_b": target_b})` -- **Sequence**: `("START", step_a, step_b, step_c)` -- **Default**: `"__DEFAULT__"` (Fallback route) - -## Basic Routing - -A node emits an `Event` with a `route` value. Use **dict syntax** to map routes to target nodes: - -```python -from google.adk import Event, Workflow - -def classify(node_input: str): - if "error" in node_input: - return Event(output=node_input, route="error") - return Event(output=node_input, route="success") - -def handle_success(node_input: str) -> str: - return f"Success: {node_input}" - -def handle_error(node_input: str) -> str: - return f"Error: {node_input}" - -agent = Workflow( - name="router", - edges=[ - ('START', classify), - (classify, {"success": handle_success, "error": handle_error}), - ], -) -``` - -## Routing Map (Dict Syntax) — Preferred - -The dict syntax is the idiomatic way to express routing. It maps route values to target nodes in a single edge tuple: - -```python -edges = [ - ("START", process_input, classifier, route_on_category), - (route_on_category, { - "question": answer_question, - "statement": comment_on_statement, - "other": handle_other, - }), -] -``` - -This replaces verbose individual routed edges: -```python -# ❌ Verbose — avoid -(classifier, answer_question, "question"), -(classifier, comment_on_statement, "statement"), -(classifier, handle_other, "other"), - -# ✅ Preferred — dict syntax -(classifier, {"question": answer_question, "statement": comment_on_statement, "other": handle_other}), -``` - -## Sequence Shorthand (Tuple Chains) - -A tuple with more than 2 elements creates a sequential chain: - -```python -# Shorthand: tuple creates chain edges -edges = [("START", step_a, step_b, step_c)] -# Equivalent to: [("START", step_a), (step_a, step_b), (step_b, step_c)] -``` - -Combine with dict routing: -```python -edges = [ - ("START", process_input, classify, route_on_result), - (route_on_result, {"approved": send, "rejected": discard}), -] -``` - -## Route Value Types - -Routes can be `str`, `bool`, or `int`: - -```python -# String routes (most common) -(decision_node, {"approve": path_a, "reject": path_b}) - -# Boolean routes -(decision_node, {True: yes_path, False: no_path}) - -# Integer routes -(decision_node, {0: path_0, 1: path_1}) -``` - -## Default Route - -Use `'__DEFAULT__'` as a fallback when no other route matches: - -```python -edges = [ - ("START", classify), - (classify, { - "success": handler_a, - "error": handler_b, - "__DEFAULT__": fallback_handler, - }), -] -``` - -Only one default route per node is allowed. - -**No duplicate edges:** Two edges from the same source to the same target are rejected, even with different routes. If you need both a named route and `__DEFAULT__` to reach the same destination, use a thin wrapper function for the default path. - -## Dynamic Routing with Functions - -A function node that emits different routes based on runtime data: - -```python -from google.adk import Context, Event - -def route_on_score(ctx: Context, node_input: dict): - score = node_input.get("score", 0) - if score > 0.8: - return Event(output=node_input, route="high") - elif score > 0.5: - return Event(output=node_input, route="medium") - else: - return Event(output=node_input, route="low") - -agent = Workflow( - name="scored_router", - edges=[ - ("START", compute_score, route_on_score), - (route_on_score, { - "high": premium_handler, - "medium": standard_handler, - "low": basic_handler, - }), - ], -) -``` - -## Multi-Route (Fan-Out via Route) - -A node can output multiple routes to trigger multiple downstream paths simultaneously: - -```python -def fan_out_router(node_input: str): - return Event(output=node_input, route=["path_a", "path_b"]) - -agent = Workflow( - name="multi_route", - edges=[ - ("START", fan_out_router), - (fan_out_router, {"path_a": branch_a, "path_b": branch_b}), - ], -) -``` - -## List of Routes on a Single Edge - -An edge can match multiple routes by passing a list as the route value. The edge fires if the node output matches **any** route in the list: - -```python -edges = [ - ("START", classifier), - (classifier, {"route_z": handler_b}), - # handler_a fires on either route_x or route_y - (classifier, handler_a, ["route_x", "route_y"]), -] -``` - -This is useful when multiple route values should lead to the same downstream node without duplicating edges. Note: list-of-routes on a single edge uses the 3-tuple syntax since dict syntax maps one route to one target. - -## Self-Loop - -A node can route back to itself: - -```python -def guess_number(target_number: int): - guess = random.randint(0, 10) - yield Event(message=f'Guessing {guess}...') - if guess == target_number: - yield Event(message='Correct!') - else: - yield Event(route='guessed_wrong') - -agent = Workflow( - name='root_agent', - edges=[ - ('START', validate_input, guess_number), - (guess_number, {'guessed_wrong': guess_number}), - ], -) -``` - -## Revision Loop - -A common pattern: route back to an earlier node for revision, or forward for approval: - -```python -edges = [ - ("START", process_input, draft_email, human_review), - (human_review, { - "revise": draft_email, - "approved": send, - "rejected": discard, - }), -] -``` - -**Important**: Cycles must have at least one routed edge (unconditional cycles are rejected during graph validation). - -## Unconditional Edges - -Edges without a route value are unconditional — they always fire: - -```python -edges = [ - ('START', node_a), # Unconditional - (node_a, node_b), # Unconditional (always fires) -] -``` - -**Important**: Unrouted edges always fire, regardless of whether the output event has a route. If a node has conditional routing, ALL outgoing edges should have routes to avoid unintended triggering. diff --git a/.agents/skills/adk-agent-builder/references/session-and-state.md b/.agents/skills/adk-agent-builder/references/session-and-state.md deleted file mode 100644 index 6855b30988..0000000000 --- a/.agents/skills/adk-agent-builder/references/session-and-state.md +++ /dev/null @@ -1,101 +0,0 @@ -# Session, Memory, and Artifact Patterns - -## 📋 Agent Verification Checklist (Session & State) -Use this checklist when managing state and artifacts: -- [ ] **State Mutation**: Did you use `ctx.state['key'] = value` instead of reassigning `state = {...}`? -- [ ] **Instruction Placeholders**: Did you use `{var?}` for variables that might not be in state yet? -- [ ] **Key Collisions**: In parallel workflows, do state keys have unique names or appropriate prefixes (e.g., `app:`) to prevent overwrites? - -## 💡 Quick Reference (State Keys) -- **Required**: `{key}` in instructions (raises error if missing). -- **Optional**: `{key?}` in instructions (empty string if missing). -- **App Scope**: `app:key` (Shared across agents). -- **Agent Scope**: `key` (Default, scoped to current agent). - -## Session State - -Session state is a dict that persists across turns within a session. -Access via `tool_context.state` or instruction placeholders: - -```python -# In instruction (template variable substitution) -instruction = 'Current user: {user_name}' - -# In tool -def my_tool(tool_context: ToolContext): - tool_context.state['user_name'] = 'Alice' - -# In callback -def before_agent(callback_context): - callback_context.state['_time'] = datetime.now().isoformat() -``` - -**State key conventions:** -- `app:key` -- app-level state (shared across agents) -- `key` -- agent-level state (scoped to current agent) -- `_key` -- convention for internal/framework state -- `{key?}` in instruction -- optional placeholder (empty if missing) -- `{key}` in instruction -- required placeholder (error if missing) - -## Session Services - -| Service | Use Case | -|---------|----------| -| `InMemorySessionService` | Local dev, testing (default) | -| `DatabaseSessionService` | Production (SQLite, PostgreSQL) | -| `VertexAiSessionService` | Vertex AI Agent Engine | - -```python -from google.adk import Runner -from google.adk.sessions import InMemorySessionService - -runner = Runner( - agent=root_agent, - app_name='my_app', - session_service=InMemorySessionService(), -) -``` - -## Artifacts - -Artifacts store non-textual data (files, images) associated with sessions: - -```python -from google.genai import types - -# Save from tool -async def save_chart(tool_context: ToolContext): - chart_bytes = generate_chart() - part = types.Part.from_bytes(data=chart_bytes, mime_type='image/png') - version = await tool_context.save_artifact('chart.png', part) - -# Load from tool -async def get_chart(tool_context: ToolContext): - part = await tool_context.load_artifact('chart.png') - return part.inline_data.data -``` - -## Memory Services - -Long-term recall across sessions: - -```python -from google.adk.memory.in_memory_memory_service import InMemoryMemoryService - -runner = Runner( - agent=root_agent, - memory_service=InMemoryMemoryService(), - ... -) -``` - -Use `load_memory` and `preload_memory` tools to access memory from -within agents. - -## Common Pitfalls - -- **State not persisting:** Assigning to `state` instead of mutating. - Use `tool_context.state['key'] = value` (not `state = {'key': value}`). -- **State overwritten by parallel tools:** Multiple tools modifying same - key concurrently. Use unique keys per tool, or `app:` prefix for shared - state. diff --git a/.agents/skills/adk-agent-builder/references/state-and-events.md b/.agents/skills/adk-agent-builder/references/state-and-events.md deleted file mode 100644 index 73e8e17075..0000000000 --- a/.agents/skills/adk-agent-builder/references/state-and-events.md +++ /dev/null @@ -1,183 +0,0 @@ -# State and Events Reference - -Manage shared state across workflow nodes and understand the event system. - -## 📋 Agent Verification Checklist (State & Events) -Use this checklist when working with state and events: -- [ ] **State Updates**: Did you use `Event(state=...)` for state updates? (Captures delta in event history) -- [ ] **Parameter Resolution**: Are custom parameters named after keys in `ctx.state`? -- [ ] **Output Serialization**: Is `event.output` JSON-serializable? (Required for DB session services) -- [ ] **Web UI Display**: Did you use `Event(message=...)` for output meant for users? - -## 💡 Quick Reference (Resolution Order) -1. **`ctx`**: Workflow `Context` object. -2. **`node_input`**: Predecessor output. -3. **Other names**: Looked up from `ctx.state[param_name]`. - -## Workflow Context - -Every node receives a `Context` object (when declaring a `ctx` parameter): - -```python -from google.adk.agents.context import Context - -def my_node(ctx: Context, node_input: str) -> str: - # Access shared state - value = ctx.state.get("key", "default") - - # Write to state - ctx.state["key"] = "new_value" - - # Access session info - session_id = ctx.session.id - invocation_id = ctx.invocation_id - - # Get node metadata - node_path = ctx.node_path # e.g., "MyWorkflow/my_node" - triggered_by = ctx.triggered_by # Name of predecessor node - retry_count = ctx.retry_count # 0 on first attempt - - return f"Processed: {value}" -``` - -## Context Properties - -### Common Properties (available everywhere) - -| Property | Type | Description | -|----------|------|-------------| -| `state` | `State` | Delta-aware session state (read/write like a dict) | -| `session` | `Session` | Current session (with local events merged in workflows) | -| `invocation_id` | `str` | Current invocation ID | -| `user_content` | `types.Content` | The user content that started this invocation (read-only) | -| `agent_name` | `str` | Name of the agent currently running | -| `user_id` | `str` | The user ID (read-only) | -| `run_config` | `RunConfig \| None` | Run configuration for this invocation (read-only) | -| `actions` | `EventActions` | Event actions for state/artifact deltas | - -### Workflow-Only Properties - -| Property | Type | Description | -|----------|------|-------------| -| `node_path` | `str` | Full path of current node (e.g., "WorkflowA/node1") | -| `execution_id` | `str` | Unique ID for this execution | -| `triggered_by` | `str` | Name of node that triggered current node | -| `in_nodes` | `frozenset[str]` | Names of all predecessor nodes | -| `resume_inputs` | `dict[str, Any]` | Inputs for resuming (keyed by interrupt_id) | -| `retry_count` | `int` | Number of times this node has been retried | - -### Workflow-Only Methods - -| Method | Returns | Description | -|--------|---------|-------------| -| `run_node(node, node_input, *, name)` | `Any` | Execute a node dynamically (requires `rerun_on_resume=True`) | -| `get_next_child_execution_id(name)` | `str` | Generate a deterministic child execution ID | - -## State Management - -State is shared across all nodes in a workflow invocation. **Prefer `Event(state=...)` over `ctx.state[...] =`** for setting state: - -```python -# ✅ Preferred: set state via Event (persisted in event history, replayable) -def node_a(node_input: str): - return Event( - output="done", - state={"user_data": {"name": "Alice", "score": 95}}, - ) - -# ❌ Avoid: direct ctx.state mutation (not captured in event history) -def node_a(ctx: Context, node_input: str) -> str: - ctx.state["user_data"] = {"name": "Alice", "score": 95} - return "done" -``` - -**Why `Event(state=...)` is preferred:** -- State deltas are persisted in event history as `event.actions.state_delta` -- Non-resumable HITL can reconstruct state by replaying events -- Makes state changes explicit and traceable -- `ctx.state` mutations are side effects that may be lost on replay - -Reading state is always done via `ctx.state`: - -```python -def node_b(ctx: Context, node_input: str) -> str: - user = ctx.state["user_data"] - return f"User {user['name']} scored {user['score']}" -``` - -The `state` dict is stored as `event.actions.state_delta` and applied to the session. - -## State as Function Parameters - -FunctionNode automatically resolves parameters from state: - -```python -# If ctx.state["user_name"] = "Alice" and ctx.state["threshold"] = 0.5 -def my_node(node_input: str, user_name: str, threshold: float) -> str: - # user_name = "Alice" (from state) - # threshold = 0.5 (from state) - return f"{user_name}: {node_input} (threshold={threshold})" -``` - -Resolution order: -1. `ctx` -> Context object -2. `node_input` -> predecessor output -3. Other names -> `ctx.state[param_name]` (with auto type conversion) -4. Default values if not in state - -## Event Fields - -| Field | Type | Description | -|-------|------|-------------| -| `output` | `Any` | Output data passed to downstream nodes | -| `route` | `str\|bool\|int\|list` | Routing signal for conditional edges (convenience kwarg → `actions.route`) | -| `state` | `dict` (constructor only) | State delta to apply (convenience kwarg → `actions.state_delta`) | -| `message` | `ContentUnion` (constructor only) | User-facing content (convenience kwarg → `content`) | -| `content` | `types.Content` | Content for display (set directly or via `message=`) | -| `node_path` | `str` | Set by workflow (convenience kwarg → `node_info.path`) | - -## Workflow Data Rules - -- **`Event.output` must be JSON-serializable.** FunctionNode auto-converts Pydantic `BaseModel` returns via `model_dump()`, so returning a model is safe. But `types.Content` and other non-serializable objects will fail with SQLite/database session services. -- **`output_key` stores dicts, not BaseModel instances.** LLM agents with `output_schema` use `validate_schema()` → `model_dump()` internally, so `ctx.state[output_key]` is always a plain dict. -- **`ctx.state.get(key)` returns a dict.** Use dict access (`data["field"]`) or reconstruct the model (`MyModel(**data)`) if you need typed access. - -```python -# Reading output_key from state — it's a dict, not a BaseModel -def use_plan(ctx: Context, node_input: Any) -> str: - plan = ctx.state.get('task_plan', {}) # dict, not TaskPlan - return plan['project_name'] # dict access - - # Or reconstruct if you need typed access: - plan_model = TaskPlan(**plan) - return plan_model.project_name -``` - -## Content Events (User-Visible Output) - -In the ADK web UI, only `event.content` is rendered — `event.output` is internal and not displayed. Emit content events for any user-facing output: - -```python -# Simple text message -yield Event(message="Processing step 1...") - -# Multimodal message (text + image) -from google.genai import types -yield Event( - message=[ - types.Part.from_text(text="Here is the result:"), - types.Part.from_bytes(data=image_bytes, mime_type="image/png"), - ] -) - -# Streaming: multiple messages from same node -async def verbose_node(ctx: Context, node_input: str): - yield Event(message="Processing step 1...") - await asyncio.sleep(1.0) - yield Event(message="Processing step 2...") - yield Event(output="final result") -``` - -## Workflow Output - -The Workflow emits its own output Event in `_finalize_workflow` after all nodes complete. Terminal nodes (nodes with no outgoing edges) have their data collected and emitted as the workflow's output. This output event has `author=workflow.name` and `node_path=workflow's own path`. diff --git a/.agents/skills/adk-agent-builder/references/task-mode.md b/.agents/skills/adk-agent-builder/references/task-mode.md deleted file mode 100644 index 0924973ee2..0000000000 --- a/.agents/skills/adk-agent-builder/references/task-mode.md +++ /dev/null @@ -1,275 +0,0 @@ -# Task Mode: Structured Delegation - -Delegate structured tasks to sub-agents with typed input/output schemas. - -## 📋 Agent Verification Checklist (Task Mode) -Use this checklist to verify your Task Mode configuration: -- [ ] **Mode Setting**: Did you explicitly set `mode='task'` or `mode='single_turn'` on the sub-agent? -- [ ] **Description**: Does the sub-agent have a clear `description`? (Crucial for the auto-generated tool's description) -- [ ] **Schemas**: Are `input_schema` and `output_schema` defined as Pydantic models? (If not, defaults are used) -- [ ] **Completion**: Does the sub-agent know it must call `finish_task` to return results to the coordinator? - -## 💡 Quick Reference (Generated Tools) -- **`request_task_{agent_name}`**: Generated on the **coordinator** to delegate tasks. -- **`finish_task`**: Generated on the **sub-agent** to return results and complete the task. - -## Overview - -ADK agents support three delegation modes via the `mode` parameter on `Agent`: - -| Mode | Tool Generated | User Interaction | Completion | -|------|---------------|------------------|------------| -| `chat` (default) | `transfer_to_agent` | Full conversational | Agent transfers back | -| `task` | `request_task_{name}` | Multi-turn (can chat with user) | Calls `finish_task` | -| `single_turn` | `request_task_{name}` | None (autonomous) | Calls `finish_task` | - -## Imports - -```python -from google.adk import Agent -from pydantic import BaseModel -``` - -**Note**: Task mode uses `Agent` (aliased from `LlmAgent`) from `google.adk`. Both task sub-agents and coordinators use the same `Agent` class — set `mode='task'` or `mode='single_turn'` on sub-agents. - -## Task Mode (`mode='task'`) - -A task agent receives structured input via `request_task_{name}`, can interact with the user for clarification, and returns structured output via `finish_task`. - -### Delegation Lifecycle - -1. User asks the coordinator to do something -2. Coordinator calls `request_task_{agent_name}(...)` with structured input -3. Task agent receives the input, works on it (may use tools, may chat with user) -4. Task agent calls `finish_task(...)` with structured output -5. Coordinator receives the result and responds to the user - -### Example - -```python -from google.adk import Agent -from pydantic import BaseModel - -class ResearchInput(BaseModel): - topic: str - depth: str = 'standard' - -class ResearchOutput(BaseModel): - summary: str - key_findings: str - confidence: str - -def search_web(query: str) -> str: - """Search the web for information.""" - return f'Results for "{query}": ...' - -def analyze_sources(sources: str) -> str: - """Analyze and synthesize source material.""" - return f'Analysis of {len(sources.split())} words complete.' - -researcher = Agent( - name='researcher', - mode='task', - input_schema=ResearchInput, - output_schema=ResearchOutput, - instruction=( - 'You are a research assistant. When given a topic:\n' - '1. Use search_web to find information.\n' - '2. Use analyze_sources to synthesize findings.\n' - '3. If the user asks for changes, adjust your research.\n' - '4. Call finish_task with summary, key_findings, and confidence.' - ), - description='Researches topics using web search and analysis.', - tools=[search_web, analyze_sources], -) - -root_agent = Agent( - name='coordinator', - model='gemini-2.5-flash', - sub_agents=[researcher], - instruction=( - 'When the user asks you to research something, delegate to' - ' the researcher using request_task_researcher. After the' - ' researcher completes, summarize the results for the user.' - ), -) -``` - -## Single-Turn Mode (`mode='single_turn'`) - -A single-turn agent completes autonomously with no user interaction. It receives input, does its work, and returns a result. - -### Example - -```python -class SummaryOutput(BaseModel): - summary: str - word_count: int - key_points: str - -def extract_text(url: str) -> str: - """Extract text from a URL.""" - return f'Extracted content from {url}: ...' - -summarizer = Agent( - name='summarizer', - mode='single_turn', - output_schema=SummaryOutput, - instruction=( - 'Summarize the document:\n' - '1. Use extract_text to get content.\n' - '2. Call finish_task with summary, word_count, key_points.\n' - 'Complete autonomously without user interaction.' - ), - description='Summarizes documents autonomously.', - tools=[extract_text], -) - -root_agent = Agent( - name='coordinator', - model='gemini-2.5-flash', - sub_agents=[summarizer], - instruction='Delegate summarization to summarizer via request_task_summarizer.', -) -``` - -## Input and Output Schemas - -### Custom Schemas (Pydantic Models) - -Define `input_schema` and/or `output_schema` with Pydantic `BaseModel`: - -```python -class TaskInput(BaseModel): - query: str - max_results: int = 10 - format: str = 'text' - -class TaskOutput(BaseModel): - results: str - count: int - status: str - -agent = Agent( - name='worker', - mode='task', - input_schema=TaskInput, # Validates request_task_worker args - output_schema=TaskOutput, # Validates finish_task args - ... -) -``` - -### Default Schemas - -When no custom schema is provided: - -**Default input** (used by `request_task_{name}`): -```python -class _DefaultTaskInput(BaseModel): - goal: str | None = None - background: str | None = None -``` - -**Default output** (used by `finish_task`): -```python -class _DefaultTaskOutput(BaseModel): - result: str -``` - -## Auto-Generated Tools - -### `request_task_{agent_name}` - -Auto-generated on the **coordinator** for each `mode='task'` or `mode='single_turn'` sub-agent. The tool name is `request_task_{agent.name}`. - -- Parameters come from `input_schema` (or default: `goal`, `background`) -- Description includes the agent's `description` field -- Validates input against the schema before delegating - -### `finish_task` - -Auto-generated on the **task agent** itself. Called by the task agent when work is complete. - -- Parameters come from `output_schema` (or default: `result`) -- Validates output against the schema before signaling completion -- Sets `tool_context.actions.finish_task` with a `TaskResult` - -## Mixed-Mode Patterns - -Combine task and single-turn agents under one coordinator: - -```python -# Interactive: user can discuss options -flight_searcher = Agent( - name='flight_searcher', - mode='task', - input_schema=FlightSearchInput, - output_schema=FlightSearchOutput, - instruction='Search flights, discuss with user, then finish_task.', - description='Searches and books flights interactively.', - tools=[search_flights, book_flight], -) - -# Autonomous: no user interaction -weather_checker = Agent( - name='weather_checker', - mode='single_turn', - output_schema=WeatherOutput, - instruction='Check weather and call finish_task. No user interaction.', - description='Checks weather for a destination.', - tools=[get_weather], -) - -# Autonomous: no user interaction -hotel_finder = Agent( - name='hotel_finder', - mode='single_turn', - output_schema=HotelOutput, - instruction='Find hotels and call finish_task. No user interaction.', - description='Finds hotels for a destination.', - tools=[find_hotels], -) - -root_agent = Agent( - name='travel_planner', - model='gemini-2.5-flash', - sub_agents=[flight_searcher, weather_checker, hotel_finder], - instruction=( - 'Help users plan trips:\n' - '- request_task_weather_checker: autonomous weather check\n' - '- request_task_hotel_finder: autonomous hotel search\n' - '- request_task_flight_searcher: interactive flight booking' - ), -) -``` - -## Key Rules - -- Both task sub-agents and coordinators use `Agent` from `google.adk` -- Each sub-agent needs a `description` (used in the auto-generated tool description) -- `input_schema` and `output_schema` are optional; defaults are provided -- Sub-agents inherit model from the coordinator if not set -- `finish_task` instructions are auto-injected into the task agent's LLM context -- Single-turn agents receive an extra instruction telling them no user replies will come - -## Task Mode vs Chat Mode - -| Feature | Chat (`transfer_to_agent`) | Task (`request_task`) | -|---------|---------------------------|----------------------| -| Input | Free-form conversation | Structured (schema-validated) | -| Output | Free-form conversation | Structured (schema-validated) | -| Control flow | Agent decides when to transfer back | Agent calls `finish_task` | -| User interaction | Full chat | `task`: multi-turn; `single_turn`: none | -| Tool name | `transfer_to_agent` | `request_task_{name}` | -| Parallel delegation | Not supported | Supported (multiple `request_task` calls) | - -## Source File Locations - -| Component | File | -|-----------|------| -| Agent/LlmAgent (mode, schemas) | `src/google/adk/agents/llm_agent.py` | -| BaseLlmFlow (base flow class) | `src/google/adk/flows/llm_flows/base_llm_flow.py` | -| RequestTaskTool | `src/google/adk/agents/llm/task/_request_task_tool.py` | -| FinishTaskTool | `src/google/adk/agents/llm/task/_finish_task_tool.py` | -| TaskRequest, TaskResult | `src/google/adk/agents/llm/task/_task_models.py` | -| Task samples | `contributing/task_samples/` | diff --git a/.agents/skills/adk-agent-builder/references/testing.md b/.agents/skills/adk-agent-builder/references/testing.md deleted file mode 100644 index 7f054b6971..0000000000 --- a/.agents/skills/adk-agent-builder/references/testing.md +++ /dev/null @@ -1,344 +0,0 @@ -# Testing Workflow Agents Reference - -Write unit tests for workflow agents using pytest with async support. - -## 📋 Agent Verification Checklist (Testing) -Use this checklist to verify your tests follow project conventions: -- [ ] **Asyncio**: Are async tests marked with `@pytest.mark.asyncio`? -- [ ] **Isolation**: Does each test create a new `InMemoryRunner`? -- [ ] **Naming**: Are unique app names used (e.g., via `request.node.name`) to avoid interference? -- [ ] **Mocking**: Are LLM calls mocked using `MockModel` rather than making real network calls? - -## 💡 Quick Reference (Commands) -- **Run all workflow tests**: `pytest tests/unittests/workflow/ -xvs` -- **Run specific test**: `pytest tests/unittests/workflow/test_file.py -xvs` -- **Install test deps**: `uv sync --extra test` - -## Setup - -```bash -# Install test dependencies -uv sync --extra test - -# Run workflow tests -pytest tests/unittests/workflow/ -xvs - -# Run a specific test file -pytest tests/unittests/workflow/test_workflow_agent.py -xvs -``` - -## Imports - -```python -import pytest -from google.genai import types -from google.adk.agents.llm_agent import LlmAgent -from google.adk.workflow import Workflow -from google.adk.events.event import Event -from google.adk.agents.context import Context -from google.adk.apps.app import App, ResumabilityConfig -from tests.unittests.workflow import testing_utils -``` - -## Basic Workflow Test - -```python -@pytest.mark.asyncio -async def test_simple_workflow(request): - def step_one(node_input: str) -> str: - return "step 1 done" - - def step_two(node_input: str) -> str: - return "step 2 done" - - agent = Workflow( - name="test_workflow", - edges=[ - ('START', step_one), - (step_one, step_two), - ], - ) - - app = App(name=request.node.name, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async( - testing_utils.get_user_content("hello") - ) - - # Verify events - simplified = testing_utils.simplify_events(events) - assert ('step_two', 'step 2 done') in simplified -``` - -## Testing Utilities - -### InMemoryRunner - -```python -from tests.unittests.testing_utils import InMemoryRunner - -runner = InMemoryRunner(app=app) - -# Run with user message -events = await runner.run_async( - testing_utils.get_user_content("user input") -) - -# Run with specific invocation (for resume) -events = await runner.run_async( - new_message=content, - invocation_id="previous_invocation_id", -) -``` - -### get_user_content - -```python -content = testing_utils.get_user_content("hello world") -# Returns types.Content(role="user", parts=[Part(text="hello world")]) -``` - -### simplify_events - -```python -simplified = testing_utils.simplify_events(events) -# Returns: [('author', 'text_or_data'), ...] -``` - -### Workflow-Specific Simplifiers - -```python -from tests.unittests.workflow.workflow_testing_utils import ( - simplify_events_with_node, - simplify_events_with_node_and_agent_state, -) - -# Show node names and outputs -simplified = simplify_events_with_node(events) -# Returns: [('node_name', {'node_name': 'X', 'output': data}), ...] - -# Show node names, outputs, AND agent state updates -simplified = simplify_events_with_node_and_agent_state( - events, - include_state_delta=True, - include_execution_id=True, -) -``` - -## MockModel for LLM Tests - -```python -from tests.unittests.testing_utils import MockModel - -# String responses -model = MockModel.create(responses=["response 1", "response 2"]) - -# Part responses (function calls) -model = MockModel.create(responses=[ - types.Part.from_text(text="thinking..."), - types.Part.from_function_call(name="my_tool", args={"key": "val"}), - types.Part.from_text(text="final answer"), -]) - -# Use in LlmAgent -agent = LlmAgent( - name="test_agent", - model=model, - instruction="Help the user.", -) -``` - -## Testing Conditional Routing - -```python -@pytest.mark.asyncio -async def test_routing(request): - def router(node_input: str): - if "error" in node_input: - return Event(output=node_input, route="error") - return Event(output=node_input, route="success") - - def success_handler(node_input: str) -> str: - return f"OK: {node_input}" - - def error_handler(node_input: str) -> str: - return f"ERR: {node_input}" - - agent = Workflow( - name="routing_test", - edges=[ - ('START', router), - (router, success_handler, "success"), - (router, error_handler, "error"), - ], - ) - - app = App(name=request.node.name, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - - events = await runner.run_async( - testing_utils.get_user_content("all good") - ) - simplified = simplify_events_with_node(events) - assert any( - e[1].get('output') == 'OK: all good' - for e in simplified if isinstance(e[1], dict) - ) -``` - -## Testing HITL (Pause and Resume) - -```python -from google.adk.events.request_input import RequestInput -from google.adk.workflow.utils._workflow_hitl_utils import ( - has_request_input_function_call, -) - -@pytest.mark.asyncio -async def test_hitl_workflow(request): - async def ask_user(ctx: Context, node_input: str): - yield RequestInput(message="Approve?") - - def after_approval(node_input: str) -> str: - return f"Approved: {node_input}" - - agent = Workflow( - name="hitl_test", - edges=[ - ('START', ask_user), - (ask_user, after_approval), - ], - ) - - app = App( - name=request.node.name, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # First run: should pause - events1 = await runner.run_async( - testing_utils.get_user_content("start") - ) - - # Find the interrupt event - interrupt_events = [ - e for e in events1 if has_request_input_function_call(e) - ] - assert len(interrupt_events) == 1 - - # Extract function call ID - fc = interrupt_events[0].content.parts[0].function_call - function_call_id = fc.id - - # Resume with user response - response = types.Content( - role="user", - parts=[types.Part( - function_response=types.FunctionResponse( - id=function_call_id, - name=fc.name, - response={"result": "yes"}, - ) - )], - ) - - events2 = await runner.run_async(new_message=response) - - simplified = simplify_events_with_node(events2) - assert any( - 'Approved' in str(e[1].get('output', '')) - for e in simplified if isinstance(e[1], dict) - ) -``` - -## Testing State Updates - -```python -@pytest.mark.asyncio -async def test_state_management(request): - def set_state(ctx: Context, node_input: str) -> str: - ctx.state["counter"] = 1 - return "state set" - - def read_state(ctx: Context, node_input: str) -> str: - return f"counter={ctx.state['counter']}" - - agent = Workflow( - name="state_test", - edges=[ - ('START', set_state), - (set_state, read_state), - ], - ) - - app = App(name=request.node.name, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async( - testing_utils.get_user_content("go") - ) - - simplified = simplify_events_with_node(events) - assert any( - e[1].get('output') == 'counter=1' - for e in simplified if isinstance(e[1], dict) - ) -``` - -## Testing Parallel Execution - -```python -from google.adk.workflow import node - -@pytest.mark.asyncio -async def test_parallel_worker(request): - def produce(node_input: str) -> list: - return [1, 2, 3] - - @node(parallel_worker=True) - def double(node_input: int) -> int: - return node_input * 2 - - def collect(node_input: list) -> str: - return f"results: {node_input}" - - agent = Workflow( - name="parallel_test", - edges=[ - ('START', produce), - (produce, double), - (double, collect), - ], - ) - - app = App(name=request.node.name, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async( - testing_utils.get_user_content("go") - ) - - simplified = simplify_events_with_node(events) - assert any( - 'results: [2, 4, 6]' in str(e[1].get('output', '')) - for e in simplified if isinstance(e[1], dict) - ) -``` - -## Test File Location - -Mirror the source structure: - -``` -src/google/adk/workflow/my_module.py - -> tests/unittests/workflow/test_my_module.py -``` - -## Testing Tips - -- Use `request.node.name` for unique app names to avoid test interference -- Each test should create its own `InMemoryRunner` for isolation -- Use `simplify_events_with_node` to focus on data flow -- Use `simplify_events_with_node_and_agent_state` to verify state changes -- AsyncIO mode is auto (`asyncio_mode = "auto"` in pyproject.toml) -- Mock only external dependencies (LLM APIs); use real ADK components diff --git a/.agents/skills/adk-agent-builder/references/tool-catalog.md b/.agents/skills/adk-agent-builder/references/tool-catalog.md deleted file mode 100644 index 1298cd5d8b..0000000000 --- a/.agents/skills/adk-agent-builder/references/tool-catalog.md +++ /dev/null @@ -1,177 +0,0 @@ -# ADK Tool Catalog - -## 📋 Agent Verification Checklist (Tools) -Use this checklist when creating or binding tools: -- [ ] **Python Functions**: Do they have both **type hints** and a **docstring**? (Required for schema generation) -- [ ] **Context Injection**: Is the special parameter named `tool_context` or `ctx` used for accessing state? -- [ ] **MCP Tools**: Did you verify that `pip install mcp` is run if using MCP tools? -- [ ] **Class Names**: Are you using `McpToolset` (the non-deprecated name)? - -## 💡 Quick Reference (Built-in Tools) -- **Google Search**: `from google.adk.tools import google_search` -- **Load Artifacts**: `from google.adk.tools import load_artifacts` -- **Agent Transfer**: `from google.adk.tools import transfer_to_agent` - -## Python Function Tools (Most Common) - -Any Python function with type annotations and a docstring becomes a tool: - -```python -def get_weather(city: str, unit: str = 'celsius') -> str: - """Get the current weather for a city. - - Args: - city: The city name to look up. - unit: Temperature unit, 'celsius' or 'fahrenheit'. - - Returns: - A string with the weather information. - """ - return f"Sunny, 22 degrees {unit} in {city}" - -root_agent = Agent(tools=[get_weather], ...) -``` - -**Rules:** -- Type hints required (they generate the JSON schema) -- Docstring required (becomes the tool description) -- Both sync and async functions supported -- Special parameter `tool_context: ToolContext` is auto-injected (not in schema) - -## ToolContext - -`ToolContext` is a backward-compatible alias for `Context`. Both work identically. - -```python -from google.adk.tools.tool_context import ToolContext - -async def my_tool(query: str, tool_context: ToolContext) -> str: - tool_context.state['key'] = 'value' # Session state - await tool_context.save_artifact('f.txt', part) # Save artifact - part = await tool_context.load_artifact('f.txt') # Load artifact - results = await tool_context.search_memory('q') # Search memory - return 'done' -``` - -## MCP Tools (Model Context Protocol) - -```python -from google.adk.tools.mcp_tool.mcp_toolset import McpToolset -from google.adk.tools.mcp_tool import StdioConnectionParams -from mcp import StdioServerParameters - -root_agent = Agent( - tools=[ - McpToolset( - connection_params=StdioConnectionParams( - server_params=StdioServerParameters( - command='npx', - args=['-y', '@modelcontextprotocol/server-filesystem', '/path'], - ), - timeout=5, - ), - tool_filter=['read_file', 'list_directory'], - ) - ], ... -) -``` - -Connection types: `StdioConnectionParams`, `SseConnectionParams`, -`StreamableHTTPConnectionParams`. - -**Pitfalls:** Requires `pip install mcp`. Use `McpToolset` (not deprecated -`MCPToolset`). `StdioServerParameters` is from the `mcp` package, not ADK. - -## OpenAPI Tools - -```python -from google.adk.tools.openapi_tool import OpenAPIToolset - -toolset = OpenAPIToolset(spec_str=open('openapi.yaml').read(), spec_str_type='yaml') -root_agent = Agent(tools=[toolset], ...) -``` - -Also: `from google.adk.tools.openapi_tool import RestApiTool` for individual endpoints. - -## Google API Tools - -```python -from google.adk.tools.google_api_tool.google_api_toolsets import BigQueryToolset - -bigquery = BigQueryToolset(client_id='...', client_secret='...', - tool_filter=['bigquery_datasets_list']) -root_agent = Agent(tools=[bigquery], ...) -``` - -## Built-in Tools - -| Tool | Import | -|------|--------| -| `google_search` | `from google.adk.tools import google_search` | -| `load_artifacts` | `from google.adk.tools import load_artifacts` | -| `load_memory` | `from google.adk.tools import load_memory` | -| `exit_loop` | `from google.adk.tools import exit_loop` | -| `transfer_to_agent` | `from google.adk.tools import transfer_to_agent` | -| `get_user_choice` | `from google.adk.tools import get_user_choice` | -| `url_context` | `from google.adk.tools import url_context` | - -## LongRunningFunctionTool - -```python -from google.adk.tools.long_running_tool import LongRunningFunctionTool - -def approve_expense(amount: float) -> dict: - """Submit expense for approval.""" - return {"status": "pending", "id": "exp-123"} - -root_agent = Agent(tools=[LongRunningFunctionTool(approve_expense)], ...) -``` - -## Code Execution - -```python -from google.adk.code_executors.built_in_code_executor import BuiltInCodeExecutor - -root_agent = Agent(code_executor=BuiltInCodeExecutor(), ...) -``` - -Note: `code_executor` is a separate parameter from `tools`. - -## Custom BaseTool - -```python -from google.adk.tools.base_tool import BaseTool -from google.genai import types - -class MyTool(BaseTool): - def __init__(self): - super().__init__(name='my_tool', description='Does something.') - - def _get_declaration(self): - return types.FunctionDeclaration( - name=self.name, description=self.description, - parameters_json_schema={ - 'type': 'object', - 'properties': {'param': {'type': 'string'}}, - 'required': ['param'], - }, - ) - - async def run_async(self, *, args, tool_context): - return {'result': args['param']} -``` - -## BaseToolset (Tool Collections) - -```python -from google.adk.tools.base_toolset import BaseToolset - -class MyToolset(BaseToolset): - async def get_tools(self, readonly_context=None): - return [ToolA(), ToolB()] - - async def process_llm_request(self, *, tool_context, llm_request): - llm_request.append_instructions(['Custom instruction']) -``` - -Toolsets support `tool_filter`, `tool_name_prefix`, and `process_llm_request`. diff --git a/.agents/skills/adk-architecture/SKILL.md b/.agents/skills/adk-architecture/SKILL.md deleted file mode 100644 index 788164ce3c..0000000000 --- a/.agents/skills/adk-architecture/SKILL.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -name: adk-architecture -description: ADK architectural knowledge — graph orchestration, resumption, execution flow, node contracts, observability, and LLM context orchestration. Use this skill whenever you need to understand the architecture, event flow, or state management of the ADK system, or when designing or modifying core components. Triggers on "how does X work", "design of", "architecture of", "event flow", "resumption state", "checkpoint", "BaseNode", "NodeRunner". ---- - -# ADK Architecture Guide - -## Core Interfaces (references/interfaces/) -- [BaseNode](references/interfaces/base-node.md) — node contract, output/streaming, state/routing, HITL, configuration -- [Workflow](references/interfaces/workflow.md) — graph orchestration, dynamic nodes (tracking/dedup/resume), transitive dynamic nodes, interrupt propagation, design rules for node authors -- [Runner](references/interfaces/runner.md) — The public interface for executing workflows and agents. Documents entrance methods `run` and `run_async`. -- [Agent](references/interfaces/agent.md) — Blueprint defining identity, instructions, and tools. Documents that `run` is the preferred entrance method. -- [BaseAgent](references/interfaces/base-agent.md) — Base class for all agents. Defines the contract for subclassing with `_run_impl` as the primary override point. -- [Event](references/interfaces/event.md) — Core data structure for state reconstruction and communication. Represents a conversation turn or action. - -## Key Principles (references/principles/) -- [API Principles](references/principles/api-principles.md) — stability, backward compatibility, and self-containment. Use when making design choices that affect the public API surface. - -## Runtime Knowledge (references/architecture/) -- [Context](references/architecture/context.md) — 1:1 node-context mapping, InvocationContext singleton, property reference -- [NodeRunner](references/architecture/node-runner.md) — two communication channels, execution flow, output delegation. Internal runtime details. -- [Runner Roles](references/architecture/runner-roles.md) — Runner vs NodeRunner vs Workflow separation. Explains why they are separate to avoid deadlocks. -- [Checkpoint and Resume](references/architecture/checkpoint-resume.md) — HITL lifecycle, `rerun_on_resume`, `run_id` -- [Observability](references/architecture/observability.md) — span-on-Context design, NodeRunner integration, correlated logs, metrics -- [LLM Context Orchestration](references/architecture/llm-context-orchestration.md) — relationship between events and LLM context, task delegation translation, branch isolation. Use when modifying event processing, context preparation for LLMs, or debugging context pollution issues. diff --git a/.agents/skills/adk-architecture/references/architecture/checkpoint-resume.md b/.agents/skills/adk-architecture/references/architecture/checkpoint-resume.md deleted file mode 100644 index a2f59044d7..0000000000 --- a/.agents/skills/adk-architecture/references/architecture/checkpoint-resume.md +++ /dev/null @@ -1,69 +0,0 @@ -# Checkpoint and Resume Lifecycle - -HITL (Human-in-the-Loop) follows this pattern: - -1. **Interrupt**: Node yields an event with `long_running_tool_ids`. - Each ancestor propagates the interrupt upward via `ctx.interrupt_ids`. -2. **Persist**: Only the leaf node's interrupt event is persisted to - session. Workflow sets `ctx._interrupt_ids` directly (no internal - event needed). -3. **Resume**: User sends a `FunctionResponse` message. The Runner - scans session events to find the matching `invocation_id`, then - reconstructs node state from persisted events. -4. **Continue**: The interrupted node receives the FR and continues - execution. Downstream nodes receive the resumed node's output. - -## run_id on resume - -Resumed nodes reuse the same `run_id` from the original -execution. From the node's perspective, the execution never paused -— events before and after the resume share the same run_id. - -Fresh dispatches (first run, loop re-trigger) get a new run_id. - -## Resume behavior by `rerun_on_resume` - -A node with multiple interrupt IDs may receive partial FRs (only -some resolved). The behavior depends on `rerun_on_resume`: - -**`rerun_on_resume=True`** (Workflow, orchestration nodes): - -| FRs received | Status | Behavior | -|---|---|---| -| Partial | PENDING | Re-execute immediately with partial `resume_inputs`. Node handles remaining interrupts internally (e.g., Workflow dispatches resolved children, keeps unresolved as WAITING). | -| All | PENDING | Re-execute with all `resume_inputs`. | - -This is critical for Workflow — when one child's FR arrives, it -re-runs immediately to dispatch that resolved child. It doesn't -wait for all children's FRs. - -**`rerun_on_resume=False`** (leaf nodes, simple HITL): - -| FRs received | Status | Behavior | -|---|---|---| -| Partial | WAITING | Stay waiting. Need all FRs. | -| All | COMPLETED | Auto-complete. Output = aggregated `resolved_responses`. No re-execution. | - -## Resume with prior output and interrupts - -A node can produce output AND interrupt in the same execution (e.g., -a Workflow where child A completes with output and child B interrupts). -On resume: - -- Some interrupt IDs are resolved (provided in `resume_inputs`) -- Remaining interrupt IDs carry forward via `prior_interrupt_ids` -- Prior output carries forward via `prior_output` -- NodeRunner pre-populates ctx with these values before re-executing - -```python -runner = NodeRunner( - node=node, parent_ctx=ctx, - run_id=prior_run_id, # reuse - prior_output=cached_output, - prior_interrupt_ids={'fc-2'}, # still unresolved -) -child_ctx = await runner.run( - node_input=input, - resume_inputs={'fc-1': response}, -) -``` diff --git a/.agents/skills/adk-architecture/references/architecture/context.md b/.agents/skills/adk-architecture/references/architecture/context.md deleted file mode 100644 index fd2691d415..0000000000 --- a/.agents/skills/adk-architecture/references/architecture/context.md +++ /dev/null @@ -1,104 +0,0 @@ -# Context - -## Architecture - -The runtime uses two scoping objects: - -- **InvocationContext** — singleton per invocation. Holds shared - state (session, services, event queue) accessible by all nodes. - Pydantic model at `agents/invocation_context.py`. -- **Context** — one per node execution. Holds per-node results - (output, route, interrupt_ids) and provides the API surface for - node code. At `agents/context.py`. - -Every Context holds a reference to the same InvocationContext -(`_invocation_context`). Service access (artifacts, memory, auth) -is delegated through it. - -``` -Root Context ← created by Runner from IC -└── Context [runner.node] ← the root node (e.g., Workflow) - ├── Context [child_a] ← child node A - └── Context [child_b] ← child node B - └── Context [grandchild] ← nested child -``` - -The Runner creates `root_ctx = Context(ic)` as the tree root and -passes it as `parent_ctx` to `NodeRunner(node=self.node)`. The -root Context has no node_path or run_id — it exists solely -as the parent for the Runner's root node. All Contexts in the tree -share the same InvocationContext singleton. - -InvocationContext contents: - -- `session`, `agent`, `user_content` -- `invocation_id`, `app_name`, `user_id` -- Services: `artifact_service`, `memory_service`, `credential_service` -- `run_config`, `live_request_queue` -- `process_queue` — shared event queue consumed by the main loop - -## 1:1 node-context mapping - -Every node execution gets its own Context instance. The relationship -is strictly 1:1: one node, one Context. The Context tree mirrors the -node execution tree. - -**NodeRunner** creates the child Context from the parent's Context -via `_create_child_context()`. The child inherits: - -- `_invocation_context` — same singleton (shared session, services) -- `node_path` — parent path + node name (e.g., `wf/child_a`) -- `run_id` — unique per execution (reused on resume) -- `event_author` — inherited from parent -- `schedule_dynamic_node_internal` — inherited from parent - -The child does NOT inherit output, route, or interrupt_ids — those -are per-execution results, starting fresh (unless resume carries -forward `prior_output` / `prior_interrupt_ids`). - -## Node result properties - -These properties on Context are the primary mechanism for -communicating results between nodes: - -- **`ctx.output`** — the node's result value. Set once per - execution. Can be set via `yield value` (framework sets it) or - `ctx.output = X` directly. Second write raises `ValueError`. -- **`ctx.route`** — routing value for conditional edges. Set - independently of output. Workflow-specific. -- **`ctx.interrupt_ids`** — accumulated interrupt IDs. Read-only - for user code. Set by framework when node yields an Event with - `long_running_tool_ids`. - -Output and interrupts can coexist — the orchestrator's `_finalize` -decides what to propagate. The orchestrator reads these properties -after the child node finishes. - -## Class hierarchy - -``` -ReadonlyContext (agents/readonly_context.py) - └── Context (agents/context.py) -``` - -**ReadonlyContext** — read-only view used in callbacks and plugins: -- `user_content`, `invocation_id`, `agent_name` -- `state` (returns `MappingProxyType` — immutable view) -- `session`, `user_id`, `run_config` - -**Context(ReadonlyContext)** — full read-write context for node -execution. Extends ReadonlyContext with mutable state, node results, -workflow metadata, and service methods. See property reference below. - -## Property reference - -| Category | Properties | -|---|---| -| State & actions | `state` (mutable `State`), `actions` (EventActions) | -| Node results | `output`, `route`, `interrupt_ids` (read-only) | -| Workflow | `node_path`, `run_id`, `triggered_by`, `in_nodes`, `resume_inputs`, `retry_count`, `event_author` | -| Methods | `run_node()`, `get_next_child_run_id()` | -| Artifacts | `load_artifact()`, `save_artifact()`, `list_artifacts()` | -| Memory | `search_memory()`, `add_session_to_memory()`, `add_events_to_memory()`, `add_memory()` | -| Auth | `request_credential()`, `load_credential()`, `save_credential()` | -| Tools | `request_confirmation()`, `function_call_id` | diff --git a/.agents/skills/adk-architecture/references/architecture/llm-context-orchestration.md b/.agents/skills/adk-architecture/references/architecture/llm-context-orchestration.md deleted file mode 100644 index 2417e41e48..0000000000 --- a/.agents/skills/adk-architecture/references/architecture/llm-context-orchestration.md +++ /dev/null @@ -1,42 +0,0 @@ -# LLM Context Orchestration from Events - -## Core Principle - -In ADK, there is a clear distinction between the **Event Stream** and the **LLM Context**: - -- **Events are the Ground Truth**: They are immutable records of what has happened in a session (user messages, model responses, tool calls, results). They serve as the audit log and persistence state. -- **LLM Context is an Orchestrated View**: The context passed to an LLM is not merely a dump of the raw event log. It is a carefully orchestrated view, filtered and transformed to match the specific role, task, and branch of the agent currently executing. - -## Orchestration Strategies - -The framework orchestrates the translation of events into LLM context using several strategies: - -### 1. Task Delegation Translation - -When a coordinator agent delegates a task to a sub-agent (Task Agent) via a tool call: - -- **Source Event**: Coordinator calls a tool like `request_task_(args...)`. -- **Orchestrated Context**: - - The arguments in the `request_task_` tool call are extracted and placed in the **System Instruction (SI)** or treated as the core instruction for the sub-agent. - - The first user message presented to the sub-agent is synthesized to represent the goal (e.g., "Finish task of [sub_agent_name] with arguments [args]"). -- **Goal**: Isolate the sub-agent from the coordinator's full history and give it a crisp, clear starting point. - -### 2. Branch Isolation - -In complex workflows with parallel execution: - -- **Source Events**: Events from all nodes and branches are stored in the same session chronologically. -- **Orchestrated Context**: The framework filters events by `branch` (e.g., `node:path.name`). An agent only sees events that belong to its own execution path. -- **Goal**: Prevent cross-node event pollution and ensure deterministic behavior in isolated tasks. - -### 3. History Trimming and Compaction - -To prevent context window overflow and stale instruction loops: - -- **Source Events**: A long history of retries, tool calls, and interactions. -- **Orchestrated Context**: The framework may trim older events or summarize them (event compaction). In task mode, it might keep only the essential setup events, ignoring stale retry loops that would otherwise confuse the LLM. -- **Goal**: Maintain a focused and efficient context window for the LLM. - -## Summary - -The relationship is one of **Source vs. View**. Events are the source of truth for the session, while LLM context is a highly orchestrated view of that truth, tailored for the active agent. diff --git a/.agents/skills/adk-architecture/references/architecture/node-runner.md b/.agents/skills/adk-architecture/references/architecture/node-runner.md deleted file mode 100644 index 532e21b8ba..0000000000 --- a/.agents/skills/adk-architecture/references/architecture/node-runner.md +++ /dev/null @@ -1,76 +0,0 @@ -# NodeRunner - -NodeRunner is the per-node executor. It drives `BaseNode.run()`, -creates the child Context, enriches events, and writes results -to ctx. - -## Two communication channels - -The runtime has two distinct channels for data flow: - -- **Context** — parent ↔ child communication. Output, route, state, - resume_inputs, and interrupt_ids flow through ctx. The orchestrator - reads ctx after the child completes to decide what to do next. -- **Event** — persistence and streaming. Events are appended to the - session and streamed to the caller. They carry message, state - deltas, function calls, and interrupt markers. - -A node writes to **ctx** to communicate with its parent. A node -yields **Events** to persist data and stream messages to the user. - -## Execution flow - -``` -Orchestrator - │ - ├─ NodeRunner(node=child, parent_ctx=ctx) - │ │ - │ ├─ _create_child_context() → child Context - │ ├─ _execute_node() → iterate node.run() - │ │ ├─ _track_event_in_context() → write to ctx - │ │ └─ _enqueue_event() → enrich + persist - │ ├─ _flush_output_and_deltas() → emit deferred output - │ └─ return child ctx - │ - └─ reads ctx.output, ctx.route, ctx.interrupt_ids -``` - -1. **Create child Context** — inherits `_invocation_context` (shared - singleton), builds `node_path` from parent, assigns `run_id`. - -2. **Iterate `node.run()`** — for each yielded Event: - - **Track in context** — `_track_event_in_context` writes output, - route, and interrupt_ids from the event to ctx (source of truth). - - **Enrich** — `_enrich_event` stamps metadata before persistence: - - `event.author` — node name (or `event_author` override) - - `event.invocation_id` — from InvocationContext - - `event.node_info.path` — full path (e.g., `wf/child_a`) - - `event.node_info.run_id` — unique per execution - - `event.node_info.output_for` — ancestor paths when - `use_as_output=True` - - **Flush deltas** — for non-partial events, `_flush_deltas` moves - pending state/artifact deltas from `ctx.actions` onto the event - before enqueueing. - - **Enqueue** — `ic.enqueue_event` puts the event on the shared - process queue for session persistence. - -3. **Flush deferred output** — if `ctx.output` was set directly - (not via yield), `_flush_output_and_deltas` emits the output - Event after `_run_impl` returns. Bundles any remaining - state/artifact deltas onto the same Event. - -4. **Return child ctx** — the orchestrator reads `ctx.output`, - `ctx.route`, and `ctx.interrupt_ids`. - -## Output delegation (`use_as_output`) - -When a child is scheduled with `use_as_output=True`, its output -Event also counts as the parent's output. NodeRunner: - -- Sets `ctx._output_delegated = True` on the parent -- Skips emitting the parent's own output Event -- Stamps `event.node_info.output_for` with ancestor paths diff --git a/.agents/skills/adk-architecture/references/architecture/observability.md b/.agents/skills/adk-architecture/references/architecture/observability.md deleted file mode 100644 index 0548d98448..0000000000 --- a/.agents/skills/adk-architecture/references/architecture/observability.md +++ /dev/null @@ -1,164 +0,0 @@ -# Observability - -## Design: span on Context - -Each Context carries a `_span` field. Since Context forms a 1:1 -parent-child tree with node executions (see [Context](context.md)), -span hierarchy follows naturally — no separate span management -needed. - -``` -Root Context._span (invocation) ← Runner sets this -└── ctx[workflow]._span ← NodeRunner creates - ├── ctx[child_a]._span ← NodeRunner creates - │ ├── (call_llm span) ← auto-parented - │ └── (execute_tool span) ← auto-parented - ├── ctx[child_b]._span ← NodeRunner creates - │ └── ctx[grandchild]._span ← nested - └── ctx[child_c]._span ← ctx.run_node() -``` - -**Runner** creates `root_ctx` and the `invocation` span, storing -it as `root_ctx._span`. This becomes the parent for all node spans. - -**NodeRunner** creates each node's span, explicitly parented to -`parent_ctx._span`, stores it on `child_ctx._span`, and closes it -before returning (see [NodeRunner](node-runner.md) for the -execution flow). - -**Always use `ctx._span` explicitly** — never rely on OTel's -implicit "current span" context. In a concurrent asyncio.Task -runtime, implicit context can be unreliable across concurrent -nodes. All tracing operations (attributes, logs, child spans) -should go through `ctx._span`. - -**Span lifecycle:** - -1. `NodeRunner.run()` creates span via `tracer.start_span()`, - parented to `parent_ctx._span`, stored on `ctx._span` -2. Node executes; all tracing goes through `ctx._span` explicitly -3. `NodeRunner.run()` calls `ctx._span.end()` before returning -4. `BatchSpanProcessor` buffers ended spans, exports periodically -5. `OTLPSpanExporter` sends batch to the OTLP endpoint - -**Interrupted nodes:** Span ends immediately when NodeRunner -returns — not left open waiting for resume. Otherwise the span -would be invisible to the backend until resume (which could be -minutes, hours, or never). The resumed execution starts a fresh -span in a new `Runner.run_async()` call (same invocation_id, -different trace — possibly on a different server). - -## NodeRunner integration - -**Context changes** — add `_span` field: - -```python -class Context(ReadonlyContext): - _span: Span | None = None -``` - -**NodeRunner.run():** - -**NodeRunner.run() lifecycle:** - -1. Create child ctx -2. Create span, parented to `parent_ctx._span` -3. Store on `ctx._span` -4. Set node attributes (name, path, run_id, type) -5. Execute node - - Node can add custom attributes to `ctx._span` during - execution (e.g., SingleAgentReactNode adds - `gen_ai.agent.name`, `gen_ai.request_model`) - - On interrupt: mark span `node.interrupted = True` - - On error: set span status `ERROR`, record exception -6. Set result attributes (has_output, interrupted, resumed) -7. **Close span** (`ctx._span.end()`) — always, even on interrupt -8. Return ctx - -Key points: -- Use `tracer.start_span()` with explicit parent context from - `parent_ctx._span` — never rely on implicit OTel context in - concurrent async code -- Span always ends before `run()` returns, even on interrupt - -## Span attributes and semantic conventions - -Set at span creation (available for sampling decisions): - -| Attribute | Source | Example | -|---|---|---| -| `node.name` | `self._node.name` | `"call_llm"` | -| `node.path` | `ctx.node_path` | `"wf/child_a"` | -| `node.run_id` | `self._run_id` | `"child_a_abc123"` | -| `node.type` | `type(self._node).__name__` | `"CallLlmNode"` | - -Set after execution (result attributes): - -| Attribute | Source | Example | -|---|---|---| -| `node.has_output` | `ctx.output is not None` | `true` | -| `node.interrupted` | `bool(ctx.interrupt_ids)` | `false` | -| `node.resumed` | `bool(resume_inputs)` | `false` | - -GenAI semantic conventions for node spans: - -- `gen_ai.operation.name` = `"invoke_agent"` for agent nodes -- `gen_ai.operation.name` = `"execute_tool"` for tool nodes -- `gen_ai.agent.name`, `gen_ai.tool.name` as appropriate -- Span kind: `INTERNAL` (in-process orchestration) - -## Correlated logs - -Use the OTel Logs API for point-in-time occurrences within a -node's span. Context provides `emit_log()` for better DX — -wraps `set_span_in_context(self._span)` internally so callers -don't manage OTel context: - -```python -# On Context: -def emit_log(self, body: str, **attributes): - span_ctx = set_span_in_context(self._span) - otel_logger.emit( - LogRecord(body=body, attributes=attributes), - context=span_ctx, - ) - -# Usage: -ctx.emit_log('node.event.yielded', - has_output=event.output is not None, - has_message=event.content is not None, -) -``` - -## Python logging - -Use the `google_adk` logger namespace: - -| Level | What to log | -|---|---| -| `DEBUG` | Node started, node completed, event enqueued | -| `INFO` | Node interrupted, node resumed, dynamic node scheduled | -| `WARNING` | Node timeout, retry triggered | -| `ERROR` | Node failed, unhandled exception | - -```python -logger = logging.getLogger("google_adk." + __name__) - -logger.debug( - 'Node %s started (run_id=%s, path=%s)', - node.name, run_id, ctx.node_path, -) -``` - -Use `%`-style formatting (lazy evaluation) for logging, not -f-strings. - -## Metrics (future) - -| Metric | Type | Description | -|---|---|---| -| `node.execution.duration` | Histogram | Per node type | -| `node.execution.count` | Counter | Per node type and status | -| `node.interrupt.count` | Counter | HITL interrupts | -| `node.resume.count` | Counter | Resumed executions | -| `workflow.active_nodes` | UpDownCounter | Currently executing | diff --git a/.agents/skills/adk-architecture/references/architecture/runner-roles.md b/.agents/skills/adk-architecture/references/architecture/runner-roles.md deleted file mode 100644 index 7ae17b8123..0000000000 --- a/.agents/skills/adk-architecture/references/architecture/runner-roles.md +++ /dev/null @@ -1,12 +0,0 @@ -# Runner vs NodeRunner vs Workflow - -These three are deliberately separate: - -- **Runner** = lifecycle orchestrator (InvocationContext, session, - plugins, invocation boundaries) -- **NodeRunner** = task scheduler (asyncio tasks, node execution, - completions) -- **Workflow** = graph engine (edges, traversal, node sequencing) - -Merging Runner and NodeRunner would deadlock on nested workflows -(inner workflow's NodeRunner would block the outer's Runner). diff --git a/.agents/skills/adk-architecture/references/interfaces/agent.md b/.agents/skills/adk-architecture/references/interfaces/agent.md deleted file mode 100644 index 9175c0da35..0000000000 --- a/.agents/skills/adk-architecture/references/interfaces/agent.md +++ /dev/null @@ -1,38 +0,0 @@ -# Agent - -The `Agent` (represented by `BaseAgent` in code) is a public interface in ADK that serves as a blueprint defining identity, instructions, and tools for an agentic entity. It inherits from `BaseNode` and can be part of a larger workflow or act as a standalone agent. - -## Key Characteristics -- **Name**: Unique identifier within the agent tree. Must be a valid Python identifier and cannot be "user". -- **Description**: Capability description used by the model for delegation. -- **Sub-agents**: Support for hierarchical agent structures. -- **Callbacks**: Supports `before_agent_callback` and `after_agent_callback` for intercepting lifecycle events. - -## Entrance Methods - -> [!IMPORTANT] -> Since agents now extend `BaseNode`, the original `run_async` entrance method is considered **deprecated**. Developers should rely on the new `run` method from `BaseNode` to execute agents as workflow nodes. - -### `run` (Preferred Entrance) -The method inherited from `BaseNode` to execute the agent. - -### `run_async` (Deprecated) -Legacy entry method to run an agent via text-based conversation. - -**Arguments:** -- `parent_context`: `InvocationContext`, the invocation context of the parent agent. - -**Yields:** -- `Event`: The events generated by the agent. - -### `run_live` -Entry method to run an agent via video/audio-based conversation. - -**Arguments:** -- `parent_context`: `InvocationContext`, the invocation context of the parent agent. - -**Yields:** -- `Event`: The events generated by the agent. - -### `from_config` -Class method to create an agent from a configuration object. diff --git a/.agents/skills/adk-architecture/references/interfaces/base-agent.md b/.agents/skills/adk-architecture/references/interfaces/base-agent.md deleted file mode 100644 index d975ba1ed3..0000000000 --- a/.agents/skills/adk-architecture/references/interfaces/base-agent.md +++ /dev/null @@ -1,31 +0,0 @@ -# BaseAgent - -`BaseAgent` is the base class for all agents in the ADK. Developers subclass `BaseAgent` to create custom agentic entities. It inherits from `BaseNode` and provides the core structure and lifecycle management for agents. - -## Core Contract for Subclasses - -> [!IMPORTANT] -> Since agents now extend `BaseNode`, the original `run_async` entrance method is considered **deprecated**. Developers should rely on the new `run` method from `BaseNode` and use `_run_impl` as the primary override point for custom logic. - -When creating a custom agent by subclassing `BaseAgent`, you should focus on the following: - -### `_run_impl` (Preferred Override Point) -Core logic to run the agent as a workflow node. - -**Arguments:** -- `ctx`: `Context`, the node execution context. -- `node_input`: `Any`, the input to the node. - -**Yields:** -- The results generated by the agent. - -### Legacy Methods (Deprecated for Node Execution) -The following methods were used for text and live conversations but are being superseded by the node-based execution model: -- `_run_async_impl`: Core logic for text-based conversation. -- `_run_live_impl`: Core logic for live conversation. - -## Key Attributes to Configure - -- **`name`**: The agent's name. Must be a valid Python identifier and unique within the agent tree. Cannot be "user". -- **`description`**: A description of the agent's capability, used by the model for delegation choices. -- **`sub_agents`**: A list of child agents to support hierarchical delegation. diff --git a/.agents/skills/adk-architecture/references/interfaces/base-node.md b/.agents/skills/adk-architecture/references/interfaces/base-node.md deleted file mode 100644 index 969c0f49a9..0000000000 --- a/.agents/skills/adk-architecture/references/interfaces/base-node.md +++ /dev/null @@ -1,137 +0,0 @@ -# BaseNode - -BaseNode is the primitive unit of execution in the workflow runtime. -Every computation — LLM calls, tool execution, orchestration — is -a node. It is a Pydantic `BaseModel` subclass. - -## The node contract - -Every node follows a two-method pattern: - -- `run()` is `@final` — normalizes yields to Events. Never override. -- `_run_impl()` is the extension point — subclasses implement their - logic here as an async generator. - -```python -class MyNode(BaseNode): - async def _run_impl(self, *, ctx, node_input): - result = do_work(node_input) - yield result # becomes Event(output=result) -``` - -**Why this split:** `run()` guarantees consistent normalization -regardless of what the subclass does. The subclass only thinks -about its domain logic. - -**Normalization rules** (`run()` applies these to each yield): - -- `None` → skipped -- `Event` → pass through -- `RequestInput` → interrupt Event -- any other value → `Event(output=value)` - -**Generator conventions:** - -A node can yield three types of data: - -- **Output** — the node's result value. Flows between nodes - (parent reads `ctx.output` after child completes). At most one - per execution (second raises `ValueError`). -- **Message** — user-visible content streamed to the end user - (e.g., progress text, partial responses). Multiple allowed. -- **Route** — Workflow-specific concept. Triggers conditional - edges in the graph. Set via `ctx.route` or `event.actions.route`. - -Additional rules: - -- Yielding nothing produces no output event -- `yield None` is silently skipped - -A custom node interacts with the runtime through two arguments: - -- **`ctx`** (Context) — communicate results to the parent node -- **`node_input`** — data passed by the parent/orchestrator - -## Output and streaming - -Three ways to produce output (pick one per execution): - -```python -# 1. Yield a value (most common) -async def _run_impl(self, *, ctx, node_input): - yield compute(node_input) - -# 2. Set ctx.output directly -async def _run_impl(self, *, ctx, node_input): - ctx.output = compute(node_input) - return - yield # generator contract - -# 3. Yield an Event with output -async def _run_impl(self, *, ctx, node_input): - yield Event(output=compute(node_input)) -``` - -A second output raises `ValueError` — at most one per execution. - -**Streaming messages** — yield Events with `message` to send -user-visible text (`message` is an alias for `content` on Event): - -```python -async def _run_impl(self, *, ctx, node_input): - yield Event(message='working...') - yield final_result # this is the output -``` - -## State and routing - -**Mutating state:** - -```python -async def _run_impl(self, *, ctx, node_input): - ctx.state['key'] = 'value' # recorded as state_delta - yield result -``` - -**Setting route for conditional edges:** - -```python -async def _run_impl(self, *, ctx, node_input): - ctx.route = 'approve' if score > 0.8 else 'reject' - yield node_input -``` - -## Advanced: child nodes and HITL - -**Running child nodes** via `ctx.run_node()`: - -```python -async def _run_impl(self, *, ctx, node_input): - child_result = await ctx.run_node(some_node, node_input) - yield f'child said: {child_result}' -``` - -Requires `rerun_on_resume = True` on the calling node. - -**Requesting interrupt (HITL):** - -```python -async def _run_impl(self, *, ctx, node_input): - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'approved: {ctx.resume_inputs["fc-1"]}' - return - yield Event(long_running_tool_ids={'fc-1'}) -``` - -## Configuration reference - -| Field | Type | Default | Purpose | -|---|---|---|---| -| `name` | `str` | required | Unique identifier | -| `description` | `str` | `''` | Human-readable description | -| `rerun_on_resume` | `bool` | `False` | Re-execute on resume (required for `ctx.run_node()`) | -| `wait_for_output` | `bool` | `False` | Stay WAITING until output is yielded (for join nodes) | -| `retry_config` | `RetryConfig \| None` | `None` | Retry on failure | -| `timeout` | `float \| None` | `None` | Max execution time in seconds | -| `input_schema` | `SchemaType \| None` | `None` | Validate/coerce input data | -| `output_schema` | `SchemaType \| None` | `None` | Validate/coerce output data | diff --git a/.agents/skills/adk-architecture/references/interfaces/event.md b/.agents/skills/adk-architecture/references/interfaces/event.md deleted file mode 100644 index 7e8a189fd8..0000000000 --- a/.agents/skills/adk-architecture/references/interfaces/event.md +++ /dev/null @@ -1,25 +0,0 @@ -# Event - -The `Event` class represents a single event in the conversation history or workflow execution in the ADK. It is the core data structure used for state reconstruction, communication, and persistence. - -## Purpose -- Stores conversation content between users and agents. -- Captures actions taken by agents (e.g., function calls, function responses, state updates). -- Holds metadata for workflow nodes, such as execution paths and run IDs. - -## Key Fields - -- **`invocation_id`**: The ID of the invocation this event belongs to. Non-empty before appending to a session. -- **`author`**: 'user' or the name of the agent, indicating who created the event. -- **`content`**: The actual content of the message (text, parts, etc.), inheriting from `LlmResponse`. -- **`actions`**: `EventActions` containing function calls, responses, or state changes. -- **`output`**: Generic data output from a workflow node. -- **`node_info`**: `NodeInfo` containing the execution path in the workflow (e.g., "A/B"). -- **`branch`**: Used for branch-aware isolation when peer sub-agents shouldn't see each other's history. -- **`id`**: Unique identifier for the event. -- **`timestamp`**: The timestamp of the event. - -## Methods of Interest -- `get_function_calls()`: Returns function calls in the event. -- `get_function_responses()`: Returns function responses in the event. -- `is_final_response()`: Returns whether the event is the final response of an agent. diff --git a/.agents/skills/adk-architecture/references/interfaces/runner.md b/.agents/skills/adk-architecture/references/interfaces/runner.md deleted file mode 100644 index 490f7464a6..0000000000 --- a/.agents/skills/adk-architecture/references/interfaces/runner.md +++ /dev/null @@ -1,35 +0,0 @@ -# Runner - -The `Runner` is the public interface for executing agents and workflows in ADK. It manages the execution lifecycle, handling message processing, event generation, and interaction with services like artifacts, sessions, and memory. - -## Entrance Methods - -### `run_async` -This is the main asynchronous entry method to run the agent in the runner. It should be used for production usage. - -**Key Features:** -- Supports event compaction if enabled in configuration. -- Does not block subsequent concurrent calls for new user queries. -- Yields events as they are generated. - -**Arguments:** -- `user_id`: The user ID of the session. -- `session_id`: The session ID of the session. -- `invocation_id`: Optional, set to resume an interrupted invocation. -- `new_message`: A new message to append to the session. -- `state_delta`: Optional state changes to apply to the session. -- `run_config`: The run config for the agent. -- `yield_user_message`: If True, yields the user message event before agent/node events. - -### `run` -This is a synchronous entry point provided for local testing and convenience purposes. - -**Key Features:** -- Runs the asynchronous execution in a background thread and re-yields events. -- Production usage should prefer `run_async`. - -**Arguments:** -- `user_id`: The user ID of the session. -- `session_id`: The session ID of the session. -- `new_message`: A new message to append to the session. -- `run_config`: The run config for the agent. diff --git a/.agents/skills/adk-architecture/references/interfaces/workflow.md b/.agents/skills/adk-architecture/references/interfaces/workflow.md deleted file mode 100644 index c3aeadc575..0000000000 --- a/.agents/skills/adk-architecture/references/interfaces/workflow.md +++ /dev/null @@ -1,326 +0,0 @@ -# Workflow - -Workflow is a graph-based orchestration node. It extends BaseNode -and implements `_run_impl()` as a scheduling loop that drives static -graph nodes and tracks dynamic nodes spawned by `ctx.run_node()`. - -## Two kinds of child nodes - -Workflow manages two kinds of child nodes: - -- **Static (graph) nodes** — declared in `edges`, compiled into a - `WorkflowGraph`. Scheduled by the orchestration loop via triggers - and `asyncio.Task`s. Tracked in `_LoopState.nodes` by node name. -- **Dynamic nodes** — spawned at runtime via `ctx.run_node()` from - inside a graph node's `_run_impl`. Tracked in - `_LoopState.dynamic_nodes` by full `node_path`. Managed by - `DynamicNodeScheduler`. - -Static and dynamic nodes share the same `_LoopState.interrupt_ids` -set, so the Workflow sees a unified view of all pending interrupts. - -## Implementing a graph node - -A graph node is a regular BaseNode placed in a Workflow's edges. -The Workflow wraps it in a NodeRunner, creates a child Context, and -reads `ctx.output`, `ctx.route`, and `ctx.interrupt_ids` after it -completes. - -**Output** — two paths. At most one per execution. The Workflow -reads the output to pass downstream. - -```python -# Yield (persisted immediately) -async def _run_impl(self, *, ctx, node_input): - yield compute(node_input) - -# ctx (deferred until node end) -async def _run_impl(self, *, ctx, node_input): - ctx.output = compute(node_input) - return - yield -``` - -**Routing** — two paths. The Workflow uses the route to select -conditional edges. - -```python -# Yield (persisted immediately) -async def _run_impl(self, *, ctx, node_input): - yield Event(route='approve' if node_input > 0.8 else 'reject') - -# ctx (deferred until node end) -async def _run_impl(self, *, ctx, node_input): - ctx.route = 'approve' if node_input > 0.8 else 'reject' - yield node_input -``` - -**State** — two paths. `ctx.state` deltas are flushed onto the next -yielded Event, or a final Event at node end. - -```python -# Yield (persisted immediately) -async def _run_impl(self, *, ctx, node_input): - yield Event(state={'count': 1}) - -# ctx (flushed onto next/final Event) -async def _run_impl(self, *, ctx, node_input): - ctx.state['count'] = 1 - yield result -``` - -**Interrupts** — yield only (`ctx.interrupt_ids` is read-only). The -Workflow marks the node WAITING and propagates the interrupt IDs -upward. On resume, if `rerun_on_resume=True` (default for Workflow), -the node is re-executed with `ctx.resume_inputs` populated. - -```python -async def _run_impl(self, *, ctx, node_input): - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'approved: {ctx.resume_inputs["fc-1"]}' - return - yield Event(long_running_tool_ids={'fc-1'}) -``` - -## Dynamic nodes via ctx.run_node() - -A graph node can spawn child nodes at runtime: - -```python -class Orchestrator(BaseNode): - rerun_on_resume: bool = True # required - - async def _run_impl(self, *, ctx, node_input): - result = await ctx.run_node(some_node, input_data) - yield f'child returned: {result}' -``` - -### Requirements - -- The calling node **must** have `rerun_on_resume = True`. Without - this, the Workflow cannot re-execute the node on resume to let it - re-acquire its dynamic children's results. - -### Tracking - -Dynamic nodes are tracked by **full node_path**, not by name alone. -The path is `parent_path/child_name`: - -``` -wf/graph_node_a/dynamic_child ← dynamic node under graph_node_a -wf/graph_node_a/dynamic_child/inner ← transitive dynamic node -``` - -The `child_name` comes from either: -- The `name` parameter on `ctx.run_node(node, name='explicit')` -- The node's own `name` field (default) - -Each unique `node_path` is tracked exactly once in -`_LoopState.dynamic_nodes`. This enables: - -- **Dedup** — if the same path is encountered again (after resume), - the cached output is returned without re-execution. -- **Resume** — if the node was interrupted, its state is - reconstructed from session events via lazy scan. - -### Dedup and resume protocol (DynamicNodeScheduler) - -When `ctx.run_node()` is called, the scheduler checks three cases: - -1. **Fresh** — no prior events for this `node_path`. Execute via - NodeRunner, record output or interrupts in `_LoopState`. - -2. **Completed** — prior events show the node produced output. - Return cached output immediately. No re-execution. - -3. **Waiting** — prior events show the node was interrupted: - - Unresolved interrupts → propagate interrupt IDs to the caller - (via `_LoopState.interrupt_ids`). The caller raises - `NodeInterruptedError`. - - All resolved → re-execute with `resume_inputs` from the - resolved function responses. - -State reconstruction is **lazy**: the scheduler scans session events -only on the first `ctx.run_node()` call for a given path, not -upfront. This avoids scanning for dynamic nodes that won't be -re-invoked. - -### Interrupt propagation - -When a dynamic child interrupts: - -1. `DynamicNodeScheduler._record_result` sets the child's status - to WAITING and adds its interrupt IDs to - `_LoopState.interrupt_ids`. -2. `ctx.run_node()` checks `child_ctx.interrupt_ids`. If non-empty, - it propagates them to the calling node's `ctx._interrupt_ids` - and raises `NodeInterruptedError`. -3. NodeRunner catches `NodeInterruptedError` in `_execute_node` and - records the interrupt on the calling node's Context. -4. The Workflow's `_handle_completion` sees the interrupt and marks - the graph node as WAITING. - -On resume, the Workflow re-executes the graph node (because -`rerun_on_resume=True`). The graph node calls `ctx.run_node()` -again, which hits the scheduler. The scheduler lazily scans events, -finds the resolved FR, and either returns cached output or -re-executes the dynamic child with `resume_inputs`. - -### Output delegation (use_as_output) - -`ctx.run_node(node, use_as_output=True)` makes the dynamic child's -output count as the calling node's output: - -```python -class Delegator(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl(self, *, ctx, node_input): - # child's output becomes this node's output - await ctx.run_node(worker, node_input, use_as_output=True) -``` - -- Sets `ctx._output_delegated = True` on the parent -- NodeRunner stamps `event.node_info.output_for` with ancestor paths -- Only one `use_as_output=True` per execution (second raises - `ValueError`) - -## Dynamic nodes from dynamic nodes (transitive) - -A dynamic node can itself call `ctx.run_node()`, creating a -transitive chain: - -```python -class Outer(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl(self, *, ctx, node_input): - result = await ctx.run_node(Inner(name='inner'), 'data') - yield result - -class Inner(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl(self, *, ctx, node_input): - sub = await ctx.run_node(Leaf(name='leaf'), node_input) - yield f'inner got: {sub}' -``` - -This works because: - -- All dynamic nodes in the subtree are tracked by the **same** - enclosing Workflow. The scheduler is inherited down the Context - tree automatically. -- Each level gets a unique `node_path`: - `wf/graph_node/outer/inner/leaf` -- Nested interrupts are correctly attributed — the scheduler - matches events from any descendant under a given path. -- Only a nested **orchestration node** (another Workflow or - SingleAgentReactNode) takes over scheduling. Regular nodes - inherit the enclosing Workflow's scheduler. - -### Scoping - -Each Workflow has its own `DynamicNodeScheduler` and `_LoopState`. -A nested Workflow creates a new scheduler, so dynamic nodes within -it are scoped to that inner Workflow — not mixed with the outer -Workflow's state. - -## event_author - -Workflow sets `ctx.event_author = self.name` at the start of -`_run_impl`. This propagates to all child Contexts via NodeRunner. -All events emitted by children carry this author, giving the UI -consistent attribution. - -An inner orchestration node (nested Workflow, SingleAgentReactNode) -overrides `event_author` with its own name, so events are attributed -to the nearest orchestration ancestor. - -## Orchestration loop lifecycle - -``` -_run_impl - ├─ SETUP: resume from events OR seed start triggers - ├─ ctx._schedule_dynamic_node_internal = DynamicNodeScheduler - ├─ LOOP: - │ ├─ _schedule_ready_nodes → pop triggers, create NodeRunners - │ ├─ asyncio.wait(FIRST_COMPLETED) - │ └─ _handle_completion → update state, buffer downstream - ├─ await dynamic_pending_tasks - ├─ _collect_remaining_interrupts - └─ FINALIZE: set ctx.output or ctx._interrupt_ids -``` - -Key behaviors: - -- **Concurrency** — `max_concurrency` limits parallel graph nodes. - Dynamic nodes are excluded (they run inline, throttling would - deadlock). -- **Terminal output** — nodes with no outgoing edges are terminal. - Their output is delegated to the Workflow's own output via - `output_for`. Only one terminal node may produce output. -- **Loop edges** — a completed node can be re-triggered by a - downstream edge pointing back to it. Its status resets to PENDING. - -## Resume from session events - -On resume (`ctx.resume_inputs` is non-empty), the Workflow -reconstructs static node states from session events: - -1. **Scan** — single forward pass through events for this - invocation. For each direct child, track output, interrupts, - and resolved FRs. -2. **Derive status per child:** - - Unresolved interrupts → WAITING - - All interrupts resolved → PENDING (re-run with `resume_inputs`) - - Has output → COMPLETED - - **Partial resume across children:** if child A's interrupt is - resolved but child B's is not, A becomes PENDING (re-runs) - while B stays WAITING. The Workflow re-interrupts with B's - remaining IDs. - - **Partial resume within a child:** if a single child emitted - multiple interrupts (e.g., fc-1 and fc-2) and only fc-1 is - resolved: - - `rerun_on_resume=True` (e.g., nested Workflow): re-run with - partial `resume_inputs` so it can dispatch resolved - grandchildren internally. Remaining interrupts propagate - back up. - - `rerun_on_resume=False`: stay WAITING until all interrupts - are resolved. -3. **Seed triggers** — PENDING nodes get triggers so the loop - re-executes them with `resume_inputs`. - -Dynamic node state is **not** scanned upfront — it's lazily -reconstructed by `DynamicNodeScheduler` when `ctx.run_node()` is -called during the re-execution. - -## Key design rules for node authors - -1. **Set `rerun_on_resume = True`** if your node calls - `ctx.run_node()`. The Workflow must be able to re-execute your - node so it can re-acquire dynamic children's results. - -2. **Use deterministic names** for dynamic children. The `name` - parameter on `ctx.run_node()` determines the `node_path`, which - is the dedup/resume key. Non-deterministic names break resume. - -3. **Always `await` ctx.run_node() directly.** Do not wrap in - `asyncio.create_task()` — the task won't be tracked by the - scheduler, errors are swallowed, and cancellation on interrupt - won't work. - -4. **Yield output after all dynamic children complete.** If your - node calls `ctx.run_node()` and then yields, the output is - emitted only after all children finish. This is the expected - pattern. - -5. **Handle `NodeInterruptedError` only if you need custom logic.** - Normally, `ctx.run_node()` raises `NodeInterruptedError` when a - child interrupts. NodeRunner catches it automatically. Only - catch it yourself if you need to clean up or adjust state before - the interrupt propagates. - -6. **Don't set `ctx.event_author`** unless your node is an - orchestration node (like Workflow or SingleAgentReactNode). The - Workflow sets it for you and it propagates to all descendants. diff --git a/.agents/skills/adk-architecture/references/principles/api-principles.md b/.agents/skills/adk-architecture/references/principles/api-principles.md deleted file mode 100644 index 1d42c2600d..0000000000 --- a/.agents/skills/adk-architecture/references/principles/api-principles.md +++ /dev/null @@ -1,42 +0,0 @@ -# API Principles - -Guidelines for designing and maintaining the ADK public API surface. - -## Public API Surface - -The public API surface of ADK includes: -- All public classes, methods, and functions in the `google.adk` namespace. -- The names, required parameters, and expected behavior of all built-in Tools. -- The structure and schema of persisted data (Sessions, Memory, Evaluation datasets). -- The JSON request/response format of the ADK API server. -- The command-line interface (CLI) commands, arguments, and flags. -- The expected file structure for agent definitions (e.g., `agent.py` convention loaded by CLI). - -## Design Principles - -### 1. Stability and Backward Compatibility -- ADK adheres to Semantic Versioning 2.0.0. -- Any change that forces a developer to alter their existing code to upgrade is a **breaking change** and necessitates a MAJOR version bump. -- Avoid breaking changes whenever possible by using optional parameters and deprecation cycles. - -### 2. Self-Containment -- Each package should be as self-contained as possible to reduce coupling. -- Within the ADK framework, importing from a package's `__init__.py` is **not allowed**. Import from the specific module directly. - -### 3. Explicit Exports -- The public API of a package must be explicitly exported in `__init__.py`. -- **Only public names** should be imported into `__init__.py`. This keeps `__init__.py` minimal and prevents accidental exposure of internal implementation details. - -### 4. Intuitive Naming -- Public method and class names should be concise and intuitive. -- Private method names can be longer and more self-explanatory to reduce the need for comments. - -#### Examples - -**Public Naming** -- **Good**: `Runner.run()`, `Session.get_events()` -- **Bad**: `Runner.orchestrate_agent_invocation_loop()`, `Session.retrieve_all_events_from_storage()` - -**Private Naming** -- **Good**: `_prepare_context_for_llm()`, `_should_trim_history()` -- **Bad**: `_prep()`, `_trim()` diff --git a/.agents/skills/adk-debug/SKILL.md b/.agents/skills/adk-debug/SKILL.md deleted file mode 100644 index b3afc8cb98..0000000000 --- a/.agents/skills/adk-debug/SKILL.md +++ /dev/null @@ -1,367 +0,0 @@ ---- -name: adk-debug -description: Use when debugging ADK agents, inspecting sessions, testing agent behavior, troubleshooting tool calls, event flow issues, or diagnosing LLM/model problems. ---- - -# Debugging ADK Agents - -Two debugging modes: `adk web` (browser UI + API) and `adk run` (CLI). - -> [!NOTE] -> **Preference**: For most development and debugging tasks, `adk run` (CLI) is preferred as it is faster and more convenient. **Within `adk run`, query mode is preferred over interactive mode** because it requires less human intervention. However, `adk web` is still required for UI-specific issues, session management visualization, or debugging the API server itself. - - ---- - -## Mode 1: adk web (Browser UI + REST API) - -Best for: visual inspection, session management, multi-turn testing. - -### Dev server workflow - -Before starting a server, ask the user: -1. **Is there already a running `adk web` server?** If yes, use it - (check with `curl -s http://localhost:8000/health`). -2. **If not**, start one. Use `run_in_background` so it doesn't - block. **Remember to shut it down when debugging is done.** - -```bash -# Check if server is already running -curl -s http://localhost:8000/health - -# Start server (if not running) -adk web path/to/agents_dir # default: http://localhost:8000 -adk web -v path/to/agents_dir # verbose (DEBUG level) -adk web --reload_agents path/to/agents_dir # auto-reload on file changes - -# Shut down when done (if you started it) -# Kill the background process or Ctrl+C -``` - -> [!TIP] -> **Coding Agent Friendly Setup**: To allow a coding agent to read the server logs, recommend the user to start the server and redirect output to a file in a location the agent can read (e.g., the conversation's artifact directory or a shared workspace folder): -> ```bash -> adk web -v path/to/agents_dir 2>&1 | tee path/to/agent_readable_log.log -> ``` -> This ensures both the user and the agent can inspect the full debug logs. - -Web UI: `http://localhost:8000/dev-ui/` - -### Session inspection via curl - -```bash -# List sessions -curl -s http://localhost:8000/apps/{app_name}/users/{user_id}/sessions | python3 -m json.tool - -# Get full session with events -curl -s http://localhost:8000/apps/{app_name}/users/{user_id}/sessions/{session_id} | python3 -m json.tool -``` - -Do NOT delete sessions after debugging — the user may want to -inspect them in the web UI. - -### Summarize events - -Fetch the session JSON and write a Python script to summarize -it. Do NOT use hardcoded inline scripts — the JSON schema may -change. Instead, fetch the raw JSON first: - -```bash -curl -s http://localhost:8000/apps/{app_name}/users/{user_id}/sessions/{session_id} | python3 -m json.tool -``` - -Then write a script based on the actual structure you see. -Key fields to look for in each event: `author`, `branch`, -`content.parts` (text, functionCall, functionResponse), -`output`, `actions` (transferToAgent, requestTask, finishTask), -`nodeInfo.path`. - -### Send test messages via curl - -```bash -SESSION=$(curl -s -X POST http://localhost:8000/apps/{app_name}/users/test/sessions \ - -H "Content-Type: application/json" -d '{}' | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])") - -curl -N -X POST http://localhost:8000/run_sse \ - -H "Content-Type: application/json" \ - -d "{\"app_name\":\"{app_name}\",\"user_id\":\"test\",\"session_id\":\"$SESSION\", - \"new_message\":{\"role\":\"user\",\"parts\":[{\"text\":\"your message here\"}]}, - \"streaming\":false}" -``` - -### Debug endpoints (traces) - -```bash -# Trace for a specific event -curl -s http://localhost:8000/debug/trace/{event_id} | python3 -m json.tool - -# All traces for a session -curl -s http://localhost:8000/debug/trace/session/{session_id} | python3 -m json.tool - -# Health check -curl -s http://localhost:8000/health -``` - -### Extract LLM content history - -Fetch trace data and inspect the `call_llm` spans. The LLM -request/response are in span attributes: - -```bash -curl -s http://localhost:8000/debug/trace/session/{session_id} | python3 -m json.tool -``` - -Look for spans with `name: "call_llm"` and inspect their -`attributes.gcp.vertex.agent.llm_request` (JSON string of the -full request including `contents`, `config`, `model`). - -### Key span attributes - -| Attribute | Description | -|-----------|-------------| -| `gcp.vertex.agent.llm_request` | Full LLM request JSON (contents, config, model) | -| `gcp.vertex.agent.llm_response` | Full LLM response JSON | -| `gcp.vertex.agent.event_id` | Event ID — correlate with session events | -| `gen_ai.request.model` | Model name | -| `gen_ai.usage.input_tokens` | Input token count | -| `gen_ai.usage.output_tokens` | Output token count | -| `gen_ai.response.finish_reasons` | Stop reason | - ---- - -## Mode 2: adk run (CLI) - -Best for: quick testing, scripting, CI/CD, headless debugging. - -### Run interactively - -```bash -adk run path/to/my_agent # interactive prompts -adk run -v path/to/my_agent # verbose logging -``` - -### Run with query (automated) - -```bash -adk run path/to/my_agent "query" # run with query -adk run --jsonl path/to/my_agent "query" # output structured JSONL (noise reduced) -``` - -### When to use automated query mode - -- **Fast & Lightweight**: Run tests quickly without starting the `adk web` dev server. -- **Easy Automation**: Perfect for CI/CD pipelines and regression scripts. -- **Highly Composable**: You can pipe the `--jsonl` output to standard tools like `jq`, `grep`, or `diff`. -- **Parallel Execution**: Each run is an isolated process. You can run multiple tests concurrently without port conflicts. -- **State Isolation**: Use `--in_memory` for fast, side-effect-free testing (no database updates). -- **Multi-Turn Support**: Remember to set a session ID if you need to maintain conversation state across turns. - -> [!TIP] -> Always read the sample's `README.md` first to understand expected inputs and behaviors! - -### Unit Tests vs. Sample Agents (When to use which) - -Choosing the right testing strategy is crucial for efficiency and coverage: - -- **Use Unit Tests when**: - - Testing **isolated logic**, specific methods, or edge cases of a single component. - - Verifying **data schemas**, Pydantic validations, or utility functions. - - *Location*: `tests/unittests/`. - -- **Use Sample Agents (Integration Testing) when**: - - Developing features with **multi-level integration** (Runner + Agent + Workflow) or changes with wide impact. - - Testing complex scenarios like **Human-in-the-Loop (HITL)** or long-running tools. - - You need to verify the **real behavior** of the agent in a simulated environment. - - *Location*: Create a sample under `contributing/agent_samples/` (refer to `adk-sample-creator`). - -> [!IMPORTANT] -> **AI Assistant Reminder**: If you create a temporary sample agent for testing, you **MUST delete it** after verification is complete, unless the user explicitly asks to keep it. - -### Exit Codes & Details - -- **Exit Code 0**: Success. -- **Exit Code 1**: Error (e.g., API key missing, agent load failure). -- **Exit Code 2**: Paused (Workflow is waiting for human input/HITL). - -For more options and flags, run: -```bash -adk run --help -``` - -### Event printing utility - -```python -from google.adk.utils._debug_output import print_event - -print_event(event, verbose=False) # text responses only -print_event(event, verbose=True) # tool calls, code execution, inline data -``` - -Location: `src/google/adk/utils/_debug_output.py` - -### Programmatic debugging - -```python -from google.adk import Agent, Runner -from google.adk.sessions import InMemorySessionService - -agent = Agent(name="test", model="gemini-2.5-flash", instruction="...") -runner = Runner(app_name="test", agent=agent, session_service=InMemorySessionService()) - -session = runner.session_service.create_session_sync(app_name="test", user_id="u") -for event in runner.run(user_id="u", session_id=session.id, new_message="hello"): - print(f"{event.author}: {event.content}") - if event.actions.transfer_to_agent: - print(f" -> transfer to {event.actions.transfer_to_agent}") - if event.output: - print(f" -> output: {event.output}") -``` - ---- - -## Logging - -Shared across both modes. - -Set log level with `--log_level` (DEBUG, INFO, WARNING, ERROR, CRITICAL) or `-v` for DEBUG. -Logs write to `/tmp/agents_log/`. Tail latest: `tail -F /tmp/agents_log/agent.latest.log` -Logger name: `google_adk`. Setup: `src/google/adk/cli/utils/logs.py` - -| Env Variable | Effect | -|---|---| -| `ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS` | Include prompt/response in traces (default: `true`) | -| `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT` | Enable prompt/response in OTEL spans | -| `GOOGLE_CLOUD_PROJECT` | Required for `--trace_to_cloud` | - ---- - -## Common Issues - -### 1. Agent outputs raw JSON instead of calling tools - -**Symptom:** Agent with `output_schema` dumps JSON text instead of calling tools. -**Cause:** `output_schema` sets `response_schema` on the LLM config, activating controlled generation (JSON-only mode). -**Check:** Look for `response_mime_type: "application/json"` in the LLM request. -**Location:** `src/google/adk/flows/llm_flows/basic.py` - -### 2. Events missing from session / not visible to plugins - -**Symptom:** Events from sub-agents don't appear in plugin callbacks or runner event stream. -**Cause:** Direct `append_event` calls inside components bypass the runner's event loop. -**Check:** Only the runner (`runners.py`) should call `append_event`. Components should yield events. - -### 3. `NameError: name 'X' is not defined` at runtime - -**Symptom:** `{"error": "name 'SomeClass' is not defined"}` -**Cause:** Class imported under `TYPE_CHECKING` but used at runtime (e.g., `isinstance()`). -**Fix:** Move import outside `TYPE_CHECKING` or use a local import. - -### 4. Sub-agent doesn't have context from parent conversation - -**Symptom:** Sub-agent only sees its own input, not the parent's history. -**Cause:** Branch isolation — sub-agents on a branch only see events on that branch. -**Fix:** Write the sub-agent's `description` to prompt the parent to include context in delegation input. - -### 5. Agent validation errors at startup - -**Symptom:** `ValueError` on agent construction. -**Common causes:** -- `"All tools must be set via LlmAgent.tools."` — Don't pass tools via `generate_content_config` -- `"System instruction must be set via LlmAgent.instruction."` — Don't set via `generate_content_config` -- `"Response schema must be set via LlmAgent.output_schema."` — Don't set via `generate_content_config` -**Location:** `src/google/adk/agents/llm_agent.py` — `validate_generate_content_config` - -### 6. LLM calls exceeding limit - -**Symptom:** `LlmCallsLimitExceededError: Max number of llm calls limit of N exceeded` -**Cause:** `run_config.max_llm_calls` limit reached. -**Fix:** Increase `max_llm_calls` in `RunConfig`, or investigate why the agent is looping. -**Location:** `src/google/adk/agents/invocation_context.py` - -### 7. Tool errors silently swallowed - -**Symptom:** Tool call fails but agent continues without expected result. -**Cause:** Errors are caught and returned as function response text. Set `on_tool_error_callback` to customize. -**Check:** Look for error text in function response events. - -### 8. Agent not loading / not discovered - -**Symptom:** `adk web` doesn't list the agent, or returns 404. -**Cause:** Agent directory must follow convention: -``` -my_agent/ - __init__.py # MUST contain: from . import agent - agent.py # MUST define: root_agent = Agent(...) OR app = App(...) -``` - -### 9. Sync tool blocking the event loop - -**Symptom:** Agent hangs or becomes very slow. -**Cause:** Sync tools run in a thread pool (max 4 workers). All workers busy → new tool calls block. -**Fix:** Make tools async if they do I/O. - ---- - -## LLM Finish Reasons - -- `STOP` — normal completion -- `MAX_TOKENS` — output truncated (increase `max_output_tokens`) -- `SAFETY` — blocked by safety filters -- `RECITATION` — blocked for recitation - ---- - -## Event Flow Architecture - -``` -User message - -> Runner.run_async() - -> Runner._exec_with_plugin() # persists events, runs plugins - -> agent.run_async() # yields events - -> LlmAgent._run_async_impl() - -> BaseLlmFlow.run_async() # Execution flow - -> _AutoFlow or _SingleFlow # Flow implementations - -> call_llm # LLM request + response - -> execute_tools # tool dispatch (functions.py) -``` - ---- - -## Callback Chain - -**Before model call:** PluginManager `run_before_model_callback()` → agent `canonical_before_model_callbacks` -**After model call:** PluginManager `run_after_model_callback()` → agent `canonical_after_model_callbacks` -**Before/after tool call:** PluginManager `run_before_tool_callback()` / `run_after_tool_callback()` → agent callbacks - ---- - -## Key Files for Debugging - -| Area | File | -|---|---| -| Runner event loop | `src/google/adk/runners.py` | -| LLM request building | `src/google/adk/flows/llm_flows/basic.py` | -| Tool dispatch | `src/google/adk/flows/llm_flows/functions.py` | -| Multi-agent orchestration | `src/google/adk/workflow/` | -| Content/context building | `src/google/adk/flows/llm_flows/contents.py` | -| Task support | `src/google/adk/agents/llm/task/` | -| Agent config + validation | `src/google/adk/agents/llm_agent.py` | -| Event model | `src/google/adk/events/event.py` | -| Session services | `src/google/adk/sessions/` | -| Invocation context | `src/google/adk/agents/invocation_context.py` | -| Web server + debug endpoints | `src/google/adk/cli/adk_web_server.py` | -| Debug output printer | `src/google/adk/utils/_debug_output.py` | - ---- - -## Debugging Checklist - -1. **Start with logs** — `-v` flag, check `/tmp/agents_log/agent.latest.log` -2. **Inspect the session** — curl endpoints (`adk web`) or print events (`adk run`) -3. **Check event actions** — `transfer_to_agent`, `request_task`, `finish_task`, `escalate` -4. **Check event.output** — single_turn and task agents set output here -5. **Check traces** — `/debug/trace/session/{id}` for model/token usage -6. **Verify agent structure** — `__init__.py` imports, `root_agent` or `app` defined -7. **Check tool responses** — look for error text in function response events -8. **Check LLM finish reason** — `STOP`, `MAX_TOKENS`, `SAFETY` -9. **Test in isolation** — create a minimal agent with just the problem tool/config diff --git a/.agents/skills/adk-git/SKILL.md b/.agents/skills/adk-git/SKILL.md deleted file mode 100644 index 2ff1e544cf..0000000000 --- a/.agents/skills/adk-git/SKILL.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -name: adk-git -description: Use for any git operation (commit, push, pull, rebase, branch, PR, cherry-pick, etc.). Provides commit message format and conventions. ---- - -# Git Operations for adk-python - -## Commit Message Format - -Use **Conventional Commits**: - -``` -(): -``` - -### Types - -- `feat`: New feature -- `fix`: Bug fix -- `docs`: Documentation only -- `style`: Formatting, no code change -- `refactor`: Code restructure without behavior change -- `perf`: Performance improvement -- `test`: Adding/updating tests -- `chore`: Build, config, dependencies -- `ci`: CI/CD changes - -### Description Phrasing - -**CRITICAL**: The subject line must answer **why**, not just **what**. -A reviewer reading only the subject should understand the motivation. - -- **State the outcome**, not the mechanics: - - Good: `Fix race condition when two agents write to same session` - - Bad: `Update session.py to add lock` -- **Name the capability added**, not the implementation: - - Good: `Support parallel tool execution in workflows` - - Bad: `Add asyncio.gather call in execute_tools_node` -- **For refactors, state the reason**, not just the action: - - Good: `Make graph public for dev UI serialization` - - Bad: `Make graph a public field on new Workflow` -- **For bug fixes, state what was broken**: - - Good: `Prevent duplicate events when resuming HITL` - - Bad: `Check interrupt_id before appending` - -### Detailed Commit Messages - -Promote detailed commit messages by including a short, concrete explanation in the body: -- For **features**: Give a sample usage or explain the new capability. -- For **fixes**: Explain what caused the error and how the fix addresses it. - -**Example (Feature):** -``` -feat(workflow): Support JSON string parsing in schema validation - -Automatically parse JSON strings into dicts or Pydantic models when input_schema or output_schema is defined on a node. -``` - -**Example (Fix):** -``` -fix(sessions): Prevent duplicate events when resuming HITL - -The interrupt_id was not checked before appending, causing duplicates if the user resumed multiple times. Added a check to ignore already processed interrupts. -``` - -Self-check before committing: read your subject line and ask "does this tell me _why_ someone made this change?" If it only describes _what_ changed, rewrite it. - -### Rules - -1. **Imperative mood** - "Add feature" not "Added feature". -2. **Capitalize** first letter of description (for release-please changelog). -3. **No period** at end of subject line. -4. **50 char limit** on subject line when possible, max 72. -5. **Use body for context** - Add a blank line then explain _why_, - not _how_, when the subject alone isn't enough. -6. **Reference GitHub issues** - If the commit fixes a GitHub issue, include "Fixes #" or "Closes #" (or the full issue URL if cross-repository) in the commit message body. - -### Examples - -``` -feat(agents): Support App pattern with lifecycle plugins -fix(sessions): Prevent memory leak on concurrent session cleanup -refactor(tools): Unify env var checks across tool implementations -docs: Add contributing guide for first-time contributors -``` - -## Pre-commit Hooks - -> [!IMPORTANT] -> Before performing any commit, check if `pre-commit` is installed and configured with the expected hooks (`isort`, `pyink`, `addlicense`, `mdformat`). If not, remind the user to set up pre-commit hooks using the `adk-setup` skill. diff --git a/.agents/skills/adk-issue-analyze/SKILL.md b/.agents/skills/adk-issue-analyze/SKILL.md deleted file mode 100644 index 56d171f4ae..0000000000 --- a/.agents/skills/adk-issue-analyze/SKILL.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -name: adk-issue-analyze -description: Analyze and triage a GitHub issue for the adk-python repository. Use this skill to retrieve issue details, inspect the codebase, evaluate justification, check for existing PRs, and produce a structured analysis report. Triggers on "/adk-issue-analyze" commands. This skill is strictly read-only and must be used whenever the "/adk-issue-analyze" command is explicitly called. ---- - -# ADK Issue Triage & Analysis (Read-Only) - -This skill provides a structured workflow for analyzing, verifying, and triaging GitHub issues from the `google/adk-python` repository. When instructed to analyze/triage an issue, follow this read-only workflow. - -> [!IMPORTANT] -> **Strict Read-Only Constraint**: -> This skill is strictly **read-only**. You MUST NOT modify any code, create new branches, or write any implementation. Your role is only to analyze the issue and output the report. Do NOT use file creation or editing tools (e.g. `write_to_file`, `replace_file_content`, `edit_file`, etc.). -> -> **Strict Tooling Constraint**: -> Do NOT use `curl`, `wget`, or any HTTP requests to fetch issue/PR content. You MUST parse/extract the issue number and use strictly the custom `fetch_github_issue` / `fetch_github_pr` python tools (or the `gh` command). - -## Step 1: Retrieve and Parse the Issue -1. **Extract the issue number**: Parse the number from the link or prompt (e.g., `https://github.com/google/adk-python/issues/5882` -> `5882`). -2. **Fetch issue details**: Use the custom python tool `fetch_github_issue(issue_number=)` to get the issue metadata. This is the preferred method as it avoids command execution policy issues. - *If the custom python tool is not available, fall back to running the gh command:* - ```bash - gh issue view --repo google/adk-python --json number,title,body,state,labels,comments,assignees,createdAt,closedAt - ``` - ---- - -## Step 2: Deep Investigation & Analysis -Address the following three critical questions and present your findings in a structured, premium report. - -### 1. What is broken? -Explain the root cause of the issue or failure: -- **Trace the execution flow**: Use `grep_search` and `view_file` to locate and analyze the malfunctioning components, classes, or functions in the local workspace. -- **Pinpoint the bug**: Detail why the system is behaving incorrectly and where the failure originates (e.g., incorrect logic, missing configuration, unhandled states). -- **Document code evidence**: Reference specific file paths and line ranges using clickable markdown file links, e.g., `[filename.py](file:///absolute/path/to/file#L100-L120)`. - -### 2. Is there a linked PR that fixes this issue? -Search for any existing pull requests that attempt to resolve the issue: -- **Search PRs**: Run `gh pr list --repo google/adk-python --search ""` to list pull requests mentioning the issue number in the branch name, title, or body. -- **Verify the PR details**: If PRs are found, fetch their details: - ```bash - gh pr view --repo google/adk-python --json number,title,state,url,body,author - ``` -- **Analyze progress**: Check if the PR is open, merged, or closed, and if it successfully fixes the issue according to the repository's testing patterns. - -### 3. Recommendation -Formulate a recommendation on whether the issue should be addressed: -- **Assess the impact**: - - Does it break core functionality? - - Does it affect standard developer workflows or introduce brittle workarounds? - - Is it a high-priority bug or a low-impact cosmetic/feature request? -- **Check alignment**: - - Does the suggested solution align with `adk-architecture` and `adk-style`? - - Is it consistent with Python idioms and Pydantic validation rules? -- **Evaluate workarounds**: Is there a clean workaround, or is a core fix necessary? -- **Final Recommendation**: Clearly declare whether we should fix it, along with the reasoning and estimated complexity/scope of the fix. - ---- - -## Report Template - -Present your final analysis as a high-quality markdown response using the following structure: - -```markdown -# GitHub Issue # Analysis: - -## Executive Summary -1. **What is broken?** [Brief explanation of the root cause or error] -2. **Is there a linked PR that fixes this issue?** [None / Yes, PR # - ] -3. **Recommendation**: [Should Fix (High Priority) / Should Fix (Medium/Low Priority) / Won't Fix / Needs Discussion - priority & brief reasoning] - -
-Detailed Analysis - -### 1. Root Cause Analysis ("What is broken?") -- Explanation of the failure or bug (what is failing and why). -- Pinpoint the exact file, function, or design component that is malfunctioning. -- Code references: [filename.py](file:///absolute/path/to/file#L100-L120) - -### 2. Existing Pull Requests ("Is there a linked PR that fixes this issue?") -- **Linked PR**: [None / Pull Request # - ()] -- **PR URL**: -- **Analysis**: Brief summary of the PR's approach and status (e.g., "Fixes the bug by implementing X in Y, currently awaiting review"). - -### 3. Recommendation -- **Recommendation**: [Should Fix (High Priority) / Should Fix (Medium/Low Priority) / Won't Fix / Needs Discussion] -- **Rationale**: - - Impact on user experience, workflows, or architecture. - - Implementation complexity and risk of side effects. -
-``` - ---- - -## Tips & Best Practices -> [!IMPORTANT] -> **Command Sandbox Policy**: -> When running commands via `run_command`, you MUST ONLY use `gh` or `git` commands. Commands like `curl`, `wget`, or direct HTTP network requests are strictly forbidden and will be automatically denied. -> Furthermore, you MUST ONLY use simple commands without special characters (such as `;`, `&`, `|`, `$`, `` ` ``, `<`, `>`, `\n`, `\r`, `(`, `)`, `{`, `}`, `\`). The runner environment runs a security policy that automatically denies any commands containing these characters. Always run clean `gh` or `git` commands directly with arguments, without redirections, command chaining, or shell expansions. - -> [!IMPORTANT] -> **Strict Read-Only Enforcement**: -> When executing the `adk-issue-analyze` skill, you MUST NOT use any file modification or editing tools (such as `edit_file`, `replace_file_content`, `write_to_file`, `notebook_edit`, etc.). Your output must strictly be a text markdown report following the template provided, without editing any workspace files or writing/fixing code. - -> [!TIP] -> Always use explicit repository qualifiers (`--repo google/adk-python`) when running `gh` commands to avoid failures due to custom internal or local git remotes. - -> [!IMPORTANT] -> When presenting code files and lines, always use markdown file links that point directly to the files in the workspace. Make sure the link is clickable and formatted as `[filename.py](file:///absolute/path/to/file#L100-L120)` without surrounding backticks around the brackets. diff --git a/.agents/skills/adk-issue-fix/SKILL.md b/.agents/skills/adk-issue-fix/SKILL.md deleted file mode 100644 index b450d9a615..0000000000 --- a/.agents/skills/adk-issue-fix/SKILL.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: adk-issue-fix -description: Implement a bug fix or feature for a GitHub issue in the adk-python repository. Use this skill after the triage/analysis is complete and approved. It creates a new branch, implements code changes, adds tests, and updates relevant documentation/samples. Triggers on "/adk-issue-fix" commands. ---- - -# ADK Issue Fix Implementation - -This skill provides a structured workflow for implementing bug fixes or new features for GitHub issues in the `google/adk-python` repository. Only invoke/use this skill once the user has approved the fix. - -## Implementation Steps - -### 1. Check for Existing Pull Requests (Entry Gate) -- **Check linked pull requests**: Before creating a branch or implementing changes, check if the issue is already linked to any pull requests by querying the issue details: - ```bash - gh issue view --repo google/adk-python --json closedByPullRequestsReferences - ``` -- **Refuse to Proceed**: If the `closedByPullRequestsReferences` list is not empty (which indicates that there are already pull requests linked to this issue): - - **Stop immediately**: You MUST refuse to proceed with the fix implementation. - - **Output details**: Report the linked PR details (PR number, URL) to the user and terminate the skill execution. - -### 2. Base the Branch on Remote HEAD & Create Branch -- **Do NOT commit the changes**: Leave them uncommitted in the workspace so the user can review and iterate on them. -- **Base the branch on remote HEAD**: When creating the new branch, ensure it is based on the remote tracking branch HEAD (`origin/main`), not the current local branch. For example: - ```bash - git checkout -b fix/issue- origin/main - ``` - -### 3. Implement the Fix -- Modify the necessary source files implementing clean, robust logic following `adk-style` and `adk-architecture`. - -### 4. Add or Update Unittests -- Write comprehensive unit tests to verify the behavior and prevent regressions. Refer to the testing patterns in the testing guides. - -### 5. Update Documentation & Samples -- Update `/docs/design` and `/docs/guides` if applicable to the changes. -- Update `/contributing/samples` if applicable to demonstrate the new capability or updated behavior. diff --git a/.agents/skills/adk-issue/SKILL.md b/.agents/skills/adk-issue/SKILL.md deleted file mode 100644 index 7d9ba963f1..0000000000 --- a/.agents/skills/adk-issue/SKILL.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -name: adk-issue -description: Orchestrate analyzing, triaging, and resolving GitHub issues for the adk-python repository. Use this skill when a user provides a GitHub issue number or link to perform both analysis and implementation. It coordinates triage analysis via `adk-issue-analyze` and implementation via `adk-issue-fix`. Triggers on "analyze issue", "issue #", "github issue", "github.com/google/adk-python/issues/". Do NOT trigger or use this skill when the prompt explicitly requests the "/adk-issue-analyze" command (use the read-only "adk-issue-analyze" skill instead). ---- - -# ADK Issue Resolution Orchestrator - -This skill orchestrates the analysis, triage, and resolution of GitHub issues for the `google/adk-python` repository. When a user provides a GitHub issue number or link, follow this two-phase workflow by delegating/calling the specific sub-skills: - -## Phase 1: Triage and Analysis (Read-Only) -1. **Delegate to `adk-issue-analyze`**: Follow the instructions in the `adk-issue-analyze` skill (located at `.agents/skills/adk-issue-analyze/SKILL.md`) to fetch the issue, inspect the codebase, evaluate justification, search for existing PRs, and present a structured analysis report. -2. **CRITICAL**: Do NOT modify any code, create new branches, or write any implementation yet. -3. **Ask for Approval**: Present the report and explicitly ask the user: - > "Would you like me to create and implement a fix for this issue in the workspace? (Note: The changes and tests will be created in a new branch but NOT committed, so you can review and iterate on them.)" -4. **Wait for Approval**: Do not proceed to Phase 2 until the user explicitly approves. - -## Phase 2: Implementation (After User Approval) -1. **Delegate to `adk-issue-fix`**: Once the user approves, follow the instructions in the `adk-issue-fix` skill (located at `.agents/skills/adk-issue-fix/SKILL.md`) to create the branch, implement the fix, add/update tests, update docs, and update samples. diff --git a/.agents/skills/adk-pr-analyze/SKILL.md b/.agents/skills/adk-pr-analyze/SKILL.md deleted file mode 100644 index 9763bd3625..0000000000 --- a/.agents/skills/adk-pr-analyze/SKILL.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -name: adk-pr-analyze -description: Analyze and triage GitHub pull requests for the adk-python repository in a strictly read-only manner. Use this skill to fetch PR details, verify the contributor's CLA, inspect the codebase, evaluate architectural and style alignment, and produce a structured analysis report. Triggers on "/adk-pr-analyze" commands. This skill is strictly read-only and must be used whenever the "/adk-pr-analyze" command is explicitly called. ---- - -# ADK Pull Request Analysis (adk-pr-analyze) - -This skill provides a structured workflow for analyzing, verifying, and triaging GitHub pull requests (PRs) from the `google/adk-python` repository. When instructed to analyze a PR, follow this read-only workflow. - -> [!IMPORTANT] -> **Strict Read-Only Constraint**: -> This skill is strictly **read-only**. You MUST NOT modify any code, create new branches, or write any implementation. Your role is only to analyze the PR and output the report. Do NOT use file creation or editing tools (e.g. `write_to_file`, `replace_file_content`, `edit_file`, etc.) in the workspace (except for assigning the PR to yourself if the user approves taking it over). -> -> **Strict Tooling Constraint**: -> Do NOT use `curl`, `wget`, or any HTTP requests to fetch PR/issue content. You MUST parse/extract the numbers and use strictly the custom `fetch_github_issue` / `fetch_github_pr` python tools, the `gh` command, or the helper scripts provided. - ---- - -## Phase 1: Retrieve and Parse the PR & Linked Context (Read-Only) - -### Step 1: Extract PR Identifier & Verify CLA Signature (Mandatory Entry Gate) -1. **Identify the PR identifier**: Parse the PR number or URL from the prompt (e.g., `https://github.com/google/adk-python/pull/5885` -> `5885`). -2. **CRITICAL COMPLIANCE GATE - Run Verification Script**: - * **Rule**: BEFORE doing any further work, diff reading, or analysis, you MUST run the verification helper script in read-only mode to verify the contributor's Contributor License Agreement (CLA) signature: - ```bash - .venv/bin/python .agents/skills/adk-pr-analyze/scripts/triage_pr.py --skip-update - ``` - * **Inspect the Exit Status & Verification Output**: - * **Exit Code 2 (Refusal)**: The contributor HAS NOT signed the Google CLA. You **MUST absolutely refuse** to perform any analysis, triage, diff-fetching, checking out, or workspace operations. Stop calling tools immediately and print a clear compliance refusal message stating that the Google CLA is not signed. - * **Exit Code 0 (Success)**: The Google CLA is verified. Proceed. -3. **Parse PR Details from Script Output**: The verification script outputs the complete PR details JSON directly to standard output, wrapped in `[PR_METADATA_JSON]` and `[/PR_METADATA_JSON]` tags. Do NOT write to or read from local cache files, and do NOT make separate network commands to fetch PR details. Parse the JSON metadata directly from the command's stdout: - * **Key JSON Attributes**: `number`, `title`, `body`, `state`, `url`, `author`, `additions`, `deletions`, `changedFiles`, `labels`, `assignees`, `closingIssuesReferences` (used to locate linked issues). -4. **Locate and Fetch Linked Issue(s)**: Extract linked closing issues directly from the `closingIssuesReferences` array in the parsed JSON metadata from the script's stdout. If any closing issues are linked, fetch their details using the custom python tool `fetch_github_issue(issue_number=)`. This is preferred as it avoids command execution policy issues. - *If the custom python tool is not available, run the gh command:* - ```bash - gh issue view --repo google/adk-python --json number,title,body,state - ``` - -### Step 2: Retrieve the Complete Diff -1. **Fetch pull request changes**: Run the `gh pr diff` command to view the actual line-by-line diff of the PR: - ```bash - gh pr diff --repo google/adk-python - ``` -2. **Review files modified**: Match the diff segments against existing repository files to identify the target components under review. - ---- - -## Phase 2: Deep Code & Architectural Analysis (Read-Only) - -Conduct an extremely thorough review of the changes by examining the diff and analyzing the local codebase. You must address the following three critical dimensions and organize your findings in a premium **PR Analysis Report**: - -### 1. Objectives & Impact ("What issue does it fix, or feature does it introduce?") -- **Core Change Summary**: Define what the code modifications do, where they are applied (classes, methods, functions), and the execution flow involved. -- **Problem Resolution**: Confirm how the implementation fixes the linked issue or introduces the target feature. -- **Context Tracing**: Trace the execution flow in the active workspace and explain what modules are impacted by this patch. - -### 2. Justification & Value ("Is it a justified issue or a useful feature?") -- **Codebase Verification**: Verify the bug/gap exists in the baseline code by searching the local workspace using `grep_search` and inspecting target files with `view_file`. -- **Aesthetic & Structural Value**: Analyze whether the problem represents a genuine, high-priority bug (e.g., causing hangs, memory leaks, or incorrect API validation) or if the feature adds actual, tangible utility to ADK developers. -- **Alternatives Assessment**: Assess if the PR's solution is the most elegant one, or if there is a cleaner, less intrusive, or more robust alternative pattern (e.g., utilizing an existing helper instead of introducing duplicate logic). -- **Scope & Depth Assessment**: - - Is the implementation a localized "point fix" for this specific issue, or does it consider wider implications and fix the whole picture? - - Does it address only the symptom, or does it fix the underlying root cause? - -### 3. Architectural & Principle Alignment ("Does it align with ADK's principles?") -Evaluate the implementation against the established architectural, style, and testing guidelines. Use direct file links to code reference examples. - -#### A. Public API and Visibility Principles -- **API Stability**: Does the change introduce a breaking change to any public classes, methods, or CLI structures in the `google.adk` namespace? (Breaking changes are unacceptable under Semantic Versioning without an official deprecation cycle). -- **Module and File Naming**: Are new `.py` module files under `src/google/adk/` private by default (prefixed with a leading underscore, e.g., `_my_module.py`)? -- **Explicit Exports**: Are new public symbols explicitly exposed via the package's `__init__.py` using the `__all__` list? Are internal helper classes and on-wire objects kept internal by omitting them from `__all__`? -- **Self-Containment**: Does inside-framework code import from the subsystem's specific module directly, rather than importing from `__init__.py`? (Within ADK, framework-level imports from `__init__.py` are strictly prohibited to avoid circular dependencies and maintain clean encapsulation). -- **Intuitive Naming**: Are public methods and class names concise (e.g., `Runner.run`), while private/internal methods are descriptive (e.g., `_validate_chat_agent_wiring`)? - -#### B. Code Quality, Style & Pythonic Conventions -- **Future Annotations**: Does every new or heavily edited python source file include `from __future__ import annotations` immediately after the license header? -- **Strong Typing**: Are type hints used for all function arguments and return values? Is the use of `Any` avoided in favor of precise types, abstract interfaces, or generics? -- **Modern Types**: Is the modern union syntax `X | None` preferred for new code over the legacy `Optional[X]`? -- **Keyword-Only Arguments**: Are swaps and parameter mismatches prevented by enforcing keyword-only arguments using `*` for constructors with multiple attributes? -- **Mutable Defaults**: Are mutable defaults (like `list`, `dict`, `set`) avoided? (Use `None` and instantiate within the method body). -- **Runtime Discrimination**: Does type validation use `isinstance(obj, Type)` instead of `type(obj) is Type` to support subclasses, and is a fallback `else` raise handled? -- **Pydantic v2 Idioms**: For Pydantic models: - - Do they use `Field()` constraints for simple boundary checks? - - Do validation rules use `@field_validator` (with `mode='after'`) and `@model_validator`? - - Is `use_attribute_docstrings=True` configured in the model `ConfigDict` so that docstrings are utilized as field descriptions? - - Are internal mutable states declared with `PrivateAttr()` and constructor logic mapped in `model_post_init()`? -- **Lazy Logging**: Does logging utilize lazy-evaluated `%`-based templates rather than eager `f-strings`? (e.g., `logging.info("Completed in %s ms", duration)` is correct; `logging.info(f"Completed in {duration} ms")` is a violation). -- **Error Handling**: Are specific exceptions caught with context, avoiding bare `except:` constructs? - -#### C. Test Integrity & Verification Quality -- **Behavior-Focused Testing**: Do the new unit or integration tests under `tests/` target public boundaries rather than internal execution states? -- **No Mocking of Core Components**: Are real ADK modules (`BaseNode`, `Event`, `Context`) used, restricting mocking exclusively to external web or network dependencies? -- **Minimal Fixtures & Locality**: Are test helper classes and fixtures kept close to the test functions (defined inline inside the test function when utilized by a single test) to improve discoverability? -- **Structure**: Do tests follow the clean **Arrange-Act-Assert** pattern separated by clear logical blocks? - ---- - -## Report Template - -Present the analysis using the following structured format: - -```markdown -# 🔍 ADK Pull Request Analysis: PR # -**Title**: -**Author**: @ -**Status**: `` -**Impact**: ` additions`, ` deletions` across ` files` - -## Executive Summary -1. **Core Objective**: [Briefly summarize what issue is fixed or feature is introduced] -2. **Justification & Value**: [Justified Fix / Valuable Feature / Duplicate / Redundant] - [1-sentence explanation] -3. **Alignment with Principles**: [Pass / Pass with Nits / Major Changes Required] - [1-sentence architecture alignment summary] -4. **Recommendation**: [Approve / Approve with Nits / Push Back (Request Changes)] - -
-Detailed Findings & Analysis - -### 1. Objectives & Impact ("What does it do?") -- **Context & Background**: [Briefly explain the background and the problem it targets. Reference linked Issue # using markdown links if available] -- **Implementation Mechanism**: [Detail precisely which modules are modified and how the execution flow is altered] -- **Affected Surface**: [Highlight any changes to public classes, CLI interfaces, state models, or setup pipelines] - -### 2. Justification & Value ("Is it a valid and useful change?") -- **Workspace Verification**: - - Investigated current workspace files: [file_name.py](file:///absolute/path/to/src/google/adk/...#L123-L145) (using `view_file` / `grep_search`). - - Found that: [Describe the baseline condition that proves the bug exists or the feature is missing] -- **Value Assessment**: [Explain why this is a good addition. Does it solve a genuine real-world developer problem, improve performance, or prevent resources leaks?] -- **Alternative Approaches**: [Evaluate if there is an alternative implementation path. Did the author choose the cleanest design?] -- **Scope & Depth**: [Point Fix / Systematic Fix] & [Symptom / Root Cause] (Explain whether the implementation targets only the specific symptom/point-issue or addresses the underlying root cause and wider implications). - -### 3. Principle & Style Alignment Checklist ("Does it follow rules?") -* **Public API & Visibility Boundaries**: - * *Status*: [Pass / Fail / N/A] - * *Analysis*: [Check for breaking changes, private module conventions `_`, and explicit exports in `__init__.py` using `__all__`] -* **Code Quality, Typing & Conventions**: - * *Status*: [Pass / Fail / Nits] - * *Analysis*: [Check for `from __future__ import annotations`, absence of `Any`, modern unions `X | None`, lazy logging `%`, specific exception catching, and Pydantic v2 structures] -* **Robustness & Edge Cases**: - * *Status*: [Pass / Fail] - * *Analysis*: [Check for type discrimination (`isinstance`), boundaries, null checks, fallback else routes, and thread/async safety] -* **Test Integrity & Quality**: - * *Status*: [Pass / Fail / N/A] - * *Analysis*: [Check coverage, testing through public interfaces, minimal inline fixtures, and Arrange-Act-Assert formatting] - -
-``` - ---- - -## Tips & Best Practices -> [!IMPORTANT] -> **Command Sandbox Policy**: -> When running commands via `run_command`, you MUST ONLY use `gh` or `git` commands. Commands like `curl`, `wget`, or direct HTTP network requests are strictly forbidden and will be automatically denied. -> Furthermore, you MUST ONLY use simple commands without special characters (such as `;`, `&`, `|`, `$`, `` ` ``, `<`, `>`, `\n`, `\r`, `(`, `)`, `{`, `}`, `\`). The runner environment runs a security policy that automatically denies any commands containing these characters. Always run clean `gh` or `git` commands directly with arguments, without redirections, command chaining, or shell expansions. - -> [!IMPORTANT] -> **Strict Read-Only Enforcement**: -> When executing the `adk-pr-analyze` skill, you MUST NOT use any file modification or editing tools (such as `edit_file`, `replace_file_content`, `write_to_file`, `notebook_edit`, etc.) in the workspace. Your output must strictly be a text markdown report following the template provided, without editing any workspace files or writing/fixing code. - -> [!TIP] -> Always verify the baseline behavior in your active workspace before claiming something is a bug or invalid. Reading the current source files using `view_file` gives you full context. - -> [!IMPORTANT] -> When presenting code files and lines, always use markdown file links that point directly to the files in the workspace. Make sure the link is clickable and formatted as `[filename.py](file:///absolute/path/to/file#L100-L120)` without surrounding backticks around the brackets. diff --git a/.agents/skills/adk-pr-analyze/scripts/triage_pr.py b/.agents/skills/adk-pr-analyze/scripts/triage_pr.py deleted file mode 100644 index 54aedb540c..0000000000 --- a/.agents/skills/adk-pr-analyze/scripts/triage_pr.py +++ /dev/null @@ -1,270 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Helper script for ADK PR Triage verification and remote update.""" - -from __future__ import annotations - -import argparse -import json -import subprocess -import sys - - -def run_command(args: list[str]) -> tuple[int, str, str]: - """Runs a shell command and returns its exit code, stdout, and stderr.""" - try: - res = subprocess.run(args, capture_output=True, text=True, check=False) - return res.returncode, res.stdout.strip(), res.stderr.strip() - except Exception as e: - return -1, "", str(e) - - -def fetch_pr_data(pr_number: str) -> dict | None: - """Fetches all PR metadata in one shot from GitHub.""" - print(f"[*] Fetching PR #{pr_number} metadata from GitHub...") - cmd = [ - "gh", - "pr", - "view", - pr_number, - "--repo", - "google/adk-python", - "--json", - ",".join([ - "number", - "title", - "body", - "state", - "url", - "author", - "additions", - "deletions", - "changedFiles", - "labels", - "statusCheckRollup", - "assignees", - "closingIssuesReferences", - ]), - ] - code, stdout, stderr = run_command(cmd) - if code != 0: - print( - f"Error: Failed to fetch PR details from GitHub: {stderr}", - file=sys.stderr, - ) - return None - try: - return json.loads(stdout) - except json.JSONDecodeError: - print("Error: Failed to parse GitHub API JSON response.", file=sys.stderr) - return None - - -def verify_cla(pr_data: dict) -> bool: - """Verifies if the Google CLA is signed using cached PR data.""" - status_checks = pr_data.get("statusCheckRollup") or [] - cla_check = None - for check in status_checks: - if check.get("name") == "cla/google": - cla_check = check - break - - if not cla_check: - print("\n" + "=" * 80) - print("🚨 CRITICAL COMPLIANCE REFUSAL: GOOGLE CLA NOT SIGNED/VERIFIED 🚨") - print("=" * 80) - print( - "Error: The mandatory 'cla/google' status check is completely missing" - " on GitHub." - ) - print( - "The contributor HAS NOT signed the Google Contributor License" - " Agreement." - ) - print( - "Legal policy strictly prohibits triaging, downloading, or reviewing" - " this PR." - ) - print("=" * 80 + "\n") - return False - - conclusion = cla_check.get("conclusion") - if conclusion != "SUCCESS": - print("\n" + "=" * 80) - print("🚨 CRITICAL COMPLIANCE REFUSAL: GOOGLE CLA NOT SIGNED/VERIFIED 🚨") - print("=" * 80) - print( - "Error: The 'cla/google' status check has the status:" - f" '{conclusion or 'UNKNOWN'}'." - ) - print( - "The contributor HAS NOT successfully signed or verified the Google" - " CLA." - ) - print( - "Legal policy strictly prohibits triaging, downloading, or reviewing" - " this PR." - ) - print("=" * 80 + "\n") - return False - - print("✅ Google CLA is verified and signed (status SUCCESS).") - return True - - -def get_current_user() -> str | None: - """Fetches the login name of the current authenticated GitHub user.""" - cmd = ["gh", "api", "user", "-q", ".login"] - code, stdout, stderr = run_command(cmd) - if code != 0: - return None - return stdout.strip() - - -def verify_pr_assignment(pr_data: dict, pr_number: str) -> bool: - """Checks if the PR is assigned to the current user using cached PR data.""" - print(f"\n[*] Verifying assignment for PR #{pr_number}...") - - # Fetch the current logged in user - current_user = get_current_user() - if not current_user: - print( - "Warning: Could not determine current GitHub user. Skipping assignment" - " check." - ) - return True - - print(f"[*] Current GitHub user: {current_user}") - - assignees = pr_data.get("assignees") or [] - assignee_logins = [a.get("login") for a in assignees if a.get("login")] - - if current_user in assignee_logins: - print(f"✅ Pull Request #{pr_number} is assigned to you.") - return True - - assignees_str = ", ".join(assignee_logins) if assignee_logins else "None" - print( - f"⚠️ WARNING: Pull Request #{pr_number} is NOT assigned to you!" - f" Current assignees: {assignees_str}" - ) - print("\n[!] ACTION REQUIRED: The Pull Request is not assigned to you.") - print(" Please ask the user if they want to take over the PR.") - return False - - -def update_pr_branch(pr_number: str) -> None: - """Updates the remote PR branch with the latest changes from the base branch.""" - print( - f"\n[*] Attempting to update PR #{pr_number} branch via remote REBASE..." - ) - rebase_cmd = [ - "gh", - "pr", - "update-branch", - pr_number, - "--rebase", - "--repo", - "google/adk-python", - ] - code, stdout, stderr = run_command(rebase_cmd) - if code == 0: - print( - "✅ Successfully updated PR branch on GitHub by rebasing onto base" - " branch!" - ) - if stdout: - print(stdout) - return - - print(f"Warning: Remote rebase-update failed: {stderr}") - print("[*] Falling back to standard remote MERGE commit update...") - - merge_cmd = [ - "gh", - "pr", - "update-branch", - pr_number, - "--repo", - "google/adk-python", - ] - code, stdout, stderr = run_command(merge_cmd) - if code == 0: - print( - "✅ Successfully updated PR branch on GitHub via standard merge commit!" - ) - if stdout: - print(stdout) - return - - print( - "\n[!] Warning: Remote branch update failed completely on GitHub server:" - f" {stderr}" - ) - print(" This is typical if edits are disabled on the contributor's fork.") - print( - " No worries! We will automatically rebase locally after checking out." - ) - - -def main() -> None: - parser = argparse.ArgumentParser( - description="Triage PR verification and sync helper." - ) - parser.add_argument( - "pr_number", help="The GitHub Pull Request number (e.g. 5875)." - ) - parser.add_argument( - "--skip-update", - action="store_true", - help="Skip updating the remote PR branch on GitHub.", - ) - parser.add_argument( - "--check-assignment", - action="store_true", - help="Verify if the PR is assigned to the current GitHub user.", - ) - args = parser.parse_args() - - # Step 0: Fetch PR data in one-shot - pr_data = fetch_pr_data(args.pr_number) - if not pr_data: - sys.exit(1) - - # Step 1: Verify CLA using cached PR data - if not verify_cla(pr_data): - sys.exit(2) # Exit code 2 indicates compliance refusal - - # Step 2: Output the PR metadata JSON directly to standard output - print("\n[PR_METADATA_JSON]") - print(json.dumps(pr_data, indent=2)) - print("[/PR_METADATA_JSON]") - - # Step 3: Verify PR Assignment using cached PR data if requested - if args.check_assignment: - if not verify_pr_assignment(pr_data, args.pr_number): - sys.exit(3) # Exit code 3 indicates assignment block - - # Step 4: Update branch - if not args.skip_update: - update_pr_branch(args.pr_number) - - print("\n[*] Verification complete. Safe to proceed with checkout.") - sys.exit(0) - - -if __name__ == "__main__": - main() diff --git a/.agents/skills/adk-pr-triage/SKILL.md b/.agents/skills/adk-pr-triage/SKILL.md deleted file mode 100644 index b1f5ad7b79..0000000000 --- a/.agents/skills/adk-pr-triage/SKILL.md +++ /dev/null @@ -1,195 +0,0 @@ ---- -name: adk-pr-triage -description: Orchestrate analyzing, triaging, and reviewing GitHub pull requests (PRs) for the adk-python repository. Use this skill when a user provides a PR number or URL. It coordinates analysis via `adk-pr-analyze` and review implementation/pushback via subsequent interactive steps. Triggers on "triage pr", "pr triage", "review pr", "pr review", "pull request", "github.com/google/adk-python/pull/". Do NOT trigger or use this skill when the prompt explicitly requests the "/adk-pr-analyze" command (use the read-only "adk-pr-analyze" skill instead). ---- - -# ADK Pull Request Triage Orchestrator (adk-pr-triage) - -This skill orchestrates the analysis, triage, and review process of GitHub pull requests (PRs) submitted to the `google/adk-python` repository. When a user provides a PR number or URL, follow this multi-phase workflow by delegating/calling the specific sub-skills: - -> [!IMPORTANT] -> ## CRITICAL EXECUTION RULES: STOP AND ASK DECISION GATES -> 1. **MANDATORY PR ASSIGNMENT BLOCK GATE**: -> * BEFORE doing any code analysis, diff-fetching, checkout, or workspace modifications, you MUST verify if the pull request is assigned to you. -> * Run the verification helper script with assignment checking enabled: -> ```bash -> .venv/bin/python .agents/skills/adk-pr-analyze/scripts/triage_pr.py --skip-update --check-assignment -> ``` -> * If the PR is NOT assigned to you: -> * **STOP calling tools and ask immediately**: You must present the PR Assignment Block gate in your chat response. -> * **Wait for Instructions**: Do NOT perform any checkout or workspace modifications in this turn. -> 2. **PR Analysis is strictly read-only**: Do NOT create branches, modify workspace files, or post any comments in your first response (unless performing PR assignment under the takeover gate). -> 3. **Triage Decision Gate**: You must present the PR Analysis Report first, and explicitly ask the user: -> > "Would you like me to push back on this pull request? (If yes, select one of the push-back reasons or write custom feedback, and I will author a professional and precise review message for you to review. If no, I will draft an approval response highlighting the positive aspects of the implementation.)" -> Wait for instructions before performing any branch creation or Gerrit push. - ---- - -## Phase 1: Triage and Analysis (Read-Only) - -1. **Verify PR Assignment**: Run the verification script with the `--check-assignment` flag: - ```bash - .venv/bin/python .agents/skills/adk-pr-analyze/scripts/triage_pr.py --skip-update --check-assignment - ``` - * **If Exit Code 3 (Assignment Block)**: Parse the script's output for current assignees. You **MUST stop calling tools immediately**, present the following assignment block decision gate in your chat response, and wait for the user's input: - > "⚠️ **Pull Request Assignment Block** - > Pull Request # is NOT assigned to you. (Current assignees: ). - > - > **Would you like to take over this Pull Request?** - > - **[Option 1]**: **Yes, take over Pull Request #** (Assign the PR to myself and proceed with the triage analysis). - > - **[Option 2]**: **No, do not take over** (Stop executing)." - * **If the user chooses Option 1**: Run the assignment command: - ```bash - gh pr edit --add-assignee "@me" --repo google/adk-python - ``` - Then proceed. - * **If the user chooses Option 2 (or declines)**: **Stop executing immediately** and do not run any further tools or operations. State that triage has terminated. - * **If Exit Code 0 (Success)**: The PR is already assigned to you. Proceed directly. -2. **Delegate to `adk-pr-analyze`**: Follow the instructions in the `adk-pr-analyze` skill (located at `.agents/skills/adk-pr-analyze/SKILL.md`) to fetch the PR metadata, check contributor CLA, and present the structured PR analysis report. -3. **Do NOT write code or create branches**: Keep this phase strictly read-only. -4. **Ask for Approval**: Present the report and explicitly call out the Review Decision Gate. - ---- - -## Phase 2: Stop and Ask for Push-Back or Local Review (Interactive Gate) - -Present the PR Analysis Report generated by `adk-pr-analyze` in your response. At the end of your report, stop calling tools and output this explicit message: - -> ### 🛑 Review Decision Gate -> I have completed my in-depth analysis of Pull Request #. Please review the findings above. -> -> **How would you like to proceed with this Pull Request?** -> - **[Option 1]**: **Push Back** (Draft a professional, constructive feedback response with recommendations for the author). -> - **[Option 2]**: **Local Review** (Checkout the PR locally under `pr-triage-[pr_number]-[short_desc]`, rebase onto the latest main, and run the `/adk-review` skill to thoroughly verify and polish before pushing to Gerrit). - ---- - -## Phase 3: Action Execution (Subsequent Turn) - -Once the user provides their decision, perform the tailored operations in your subsequent turns: - -### Branch A: Push Back -1. **Analyze the Push-Back Focus**: Read the user's specific feedback or selected points of concern. -2. **Draft Constructive Feedback**: Author a highly structured, objective, and supportive response that teaches the contributor while insisting on quality. -3. **Include Concrete Recommendations**: Quote specific files/lines in their diff and provide complete, refactored code blocks in your comments so they can easily apply the fixes. Reference the relevant ADK style guides. -4. **Present the Draft**: Format your draft using the **GitHub Review Draft Template** below. - -### Branch B: Local Review (Checkout & Revise) -If the user selects **Local Review**, run the following structured sequence: -1. **Step 0: Update the PR Head Branch on GitHub (Mandatory Sync)**: - * **Rule**: BEFORE downloading or checking out the pull request locally, you MUST trigger an update on the remote GitHub pull request to align it with the latest remote base branch (`main`). - * Run the verification & sync helper script to update the branch: - ```bash - .venv/bin/python .agents/skills/adk-pr-analyze/scripts/triage_pr.py - ``` - * *What it does*: This script automatically checks the Google CLA signature status again, attempts to update the PR branch on GitHub by rebasing onto `main`, and if rebase-update is blocked, falls back to updating via a merge commit. It handles all outputs and fallbacks gracefully. -2. **Step 1: Checkout the PR to a Local Branch**: - * Branch naming convention: `pr-triage--[short_desc]` (e.g. `pr-triage-5875-parallelize-tool-union`). - * Fetch the latest main branch from origin before checking out the PR: - ```bash - git fetch origin main - ``` - * Fetch the pull request ref directly from the remote GitHub endpoint: - ```bash - git fetch https://github.com/google/adk-python.git pull//head:pr-triage--[short_desc] - ``` - * Checkout to the newly created local branch: - ```bash - git checkout pr-triage--[short_desc] - ``` -3. **Step 2: Preserve the Commit Message & Append Merge Reference**: - * **CRITICAL**: You MUST preserve the exact same commit message from the pull request! - * Determine if the PR contains a single commit or multiple commits: - * **Single Commit**: Retrieve the exact original commit message: - ```bash - git log -1 --pretty=%B - ``` - * **Multiple Commits**: Squash them into a single local commit first, keeping the overall PR Title and PR Body as the exact commit message, AND preserving the original author. An elegant way to squash is: - ```bash - # 1. Capture the original author - ORIG_AUTHOR=$(git log -1 --format='%an <%ae>') - - # 2. Reset to base and commit with the original author - git reset --soft $(git merge-base HEAD origin/main) - git commit --author="$ORIG_AUTHOR" -m "" - ``` - * Append `"Merge "` to the very end of the commit message (separated by a blank line). If the PR metadata contains linked issues in `closingIssuesReferences`, you MUST also append `"closes https://github.com/google/adk-python/issues/"` for each linked issue on new lines. Use this shell command structure to do it in one-shot: - ```bash - git commit --amend -m "$(git log -1 --pretty=%B) - - Merge https://github.com/google/adk-python/pull/ - closes https://github.com/google/adk-python/issues/" - ``` - * *Note*: When you run git commit/amend, the Gerrit `commit-msg` hook will automatically execute and append the `Change-Id:` footprint if not already present. -4. **Step 3: Rebase on top of Main**: - * Run the rebase command to place the CL commit on top of the latest local remote tracking `main` branch: - ```bash - git rebase origin/main - ``` -5. **Step 4: Execute Code Verification & Polishing**: - * Trigger the local review process by invoking the **`/adk-review`** skill! - * Follow its comprehensive guidelines to audit edge cases, style compliance, dependencies, and test validation. Work in partnership with the user to revise the local changes as needed. -6. **Step 5: Squash User Revisions & Push to Gerrit**: - * If the user requests to push to Gerrit, squash/amend all local workspace revisions into the single original commit: - * **CRITICAL**: You MUST preserve the exact same commit message, including the `Merge ` footer, any `closes ` footers, and the original `Change-Id:` footer. Do NOT change it. - * Command to squash all changes into the current commit without opening an editor: - ```bash - git commit -a --amend --no-edit - ``` - * Push the single finalized CL commit to Gerrit: - ```bash - git push origin HEAD:refs/for/main - ``` - ---- - -## GitHub Review Draft Template - -Format the authored review response as a premium markdown snippet block: - -````markdown -# 💬 GitHub PR Review Draft Message -*Copy and paste this response directly into the GitHub review interface:* ---- -### PR Review: -Hello @! Thank you very much for contributing this pull request to improve ADK. I've conducted a thorough architectural and style review of your implementation against our design guidelines and standards. -Here is the feedback and a few suggested changes to align your patch with ADK's principles: -#### 🔴 Major Concerns / Blocks -1. **[Concern 1 Title, e.g., Import from init.py is not allowed]** - - **Target Code**: [filename.py:L100-L105](file:///absolute/path/to/src/google/adk/file_name.py#L100-L105) - - **Issue**: [Detailed explanation of why this violates design/architectural rules, referencing the relevant ADK skill like `adk-architecture` or `adk-style`] - - **Suggested Correction**: - ```python - # Provide full, drop-in replacement code block - ``` -2. **[Concern 2 Title, e.g., Missing Unit Tests for Edge Cases]** - - **Target Code**: [test_filename.py](file:///absolute/path/to/tests/unittests/test_filename.py) - - **Issue**: [Detail what is missing, e.g., "We need verification coverage of boundaries like empty string and negative values."] -#### 🟡 Style & Quality Nits -1. **[Style Nit, e.g., Eager Logging formatting]** - - **Target Code**: [filename.py:L42](file:///absolute/path/to/src/google/adk/file_name.py#L42) - - **Suggestion**: Use lazy-evaluated `%` template syntax: - ```python - # Corrected: - logging.info("User registered: %s", user_id) - ``` -2. **[Typing Nit, e.g., Optional[X] instead of X | None]** - - **Target Code**: [filename.py:L15](file:///absolute/path/to/src/google/adk/file_name.py#L15) - - **Suggestion**: Prefer more concise union type hint `X | None`. -#### 🟢 Positive Aspects -- [Highlight stellar work, e.g., "Excellent Pydantic v2 validation logic!" or "Highly readable and clean docstrings!"] -Please let me know if you have any questions on these suggestions, and let's work together to get this PR merged! -```` - ---- - -## Tips & Best Practices -> [!IMPORTANT] -> **Command Sandbox Policy**: -> When running commands via `run_command`, you MUST ONLY use `gh` or `git` commands. Commands like `curl`, `wget`, or direct HTTP network requests are strictly forbidden and will be automatically denied. -> Furthermore, you MUST ONLY use simple commands without special characters (such as `;`, `&`, `|`, `$`, `` ` ``, `<`, `>`, `\n`, `\r`, `(`, `)`, `{`, `}`, `\`). The runner environment runs a security policy that automatically denies any commands containing these characters. Always run clean `gh` or `git` commands directly with arguments, without redirections, command chaining, or shell expansions. - -> [!TIP] -> Always verify the baseline behavior in your active workspace before claiming something is a bug or invalid. Reading the current source files using `view_file` gives you full context. -> [!IMPORTANT] -> When referencing files and line numbers in your reports and draft reviews, always use clickable markdown file links of format `[filename.py](file:///absolute/path/to/file#L100-L120)` without surrounding backticks around the brackets. Ensure the links represent valid absolute file paths in the local workspace. diff --git a/.agents/skills/adk-review/SKILL.md b/.agents/skills/adk-review/SKILL.md deleted file mode 100644 index 3544da94ab..0000000000 --- a/.agents/skills/adk-review/SKILL.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -name: adk-review -description: Reviews all local changes in the repository for errors, styling compliance, unintended outcomes, and necessary documentation/test/sample updates. Generates a report and assists in fixing identified issues on-demand. Triggers on "adk-review", "review changes", "pr review", "check code style", "verify changes". ---- - -# ADK Change Reviewer (adk-review) - -This skill guides AI assistants in performing a comprehensive, rigorous review of local repository changes before they are committed or submitted. It evaluates code correctness, style guidelines, architectural impact, and checks if associated tests, samples, and documentation need updates. It generates a detailed report and, upon explicit user request, assists in automatically fixing the identified issues. - -> [!NOTE] -> Always read this skill and follow its steps when asked to review local changes or before finalizing a PR/commit. - ---- - -## Review Checklist Dimensions - -### 1. Code Correctness & Errors -- **Syntax & Types**: Ensure the code is free of syntax errors and conforms to strong typing guidelines. Avoid using `Any`, and prefer specific/abstract types. Use `X | None` instead of `Optional[X]`. -- **Imports**: Verify there are no circular imports. Ensure absolute imports are used where appropriate. -- **Exception Handling**: Avoid bare `except:`. Always catch specific exceptions and log them properly with context. -- **Visibility**: Ensure internal modules and package-private attributes use proper naming (e.g., prefixed with `_`) per ADK rules. -- **Edge Cases & Defensive Programming**: - - **Type & Attribute Discrimination**: Explicitly verify an object's type (e.g., using `isinstance`) before checking type-specific or custom attributes (e.g., checking if a node is an `LlmAgent` before inspecting its `mode`), avoiding errors on unexpected types. - - **Boundary and Null Conditions**: Ensure robust handling for boundary conditions and null values (e.g., `None`, empty collections, zero, or empty strings) using validation or fallback defaults. - - **Preconditions & Invariants**: Validate that preconditions and state invariants are checked before performing core logic. - -### 2. Style and Convention Compliance -- **ADK Style Guide**: Cross-reference all code changes with the guidelines in the `adk-style` skill (including Pydantic v2 patterns, lazy logging evaluation, and file structure). -- **Pre-commit Hooks**: Ensure changed files are formatted and linted. Remind the user to run `pre-commit run --files ` if hooks like `isort`, `pyink`, `addlicense`, or `mdformat` are not configured automatically. - -### 3. Architectural Integrity & Unintended Outcomes -- **Public API Stability**: Verify whether changes modify, remove, or restrict public-facing interfaces, classes, methods, argument lists, or CLI structures (e.g., in the public package namespaces under `src/google/adk/`). Breaking changes are unacceptable without a formal deprecation cycle under Semantic Versioning. -- **Execution & Resumption**: If changing workflows, nodes, or state management, ensure compatibility with the ADK 2.0 event execution lifecycle and session resumption (HITL/checkpoints). -- **Concurrency & Safety**: Check for race conditions or resource leaks. Ensure long-running or shared resources (like plugins, exporters, and connections) are closed/disposed of safely. - -### 4. Documentation Impact (`docs/design` and `docs/guides`) -- **Design & Architecture**: Determine if the change updates a core design contract. If so, check if design docs under `docs/design/` require updates or new documents need to be written. -- **Guides**: If the changes introduce a new feature or change a public API/workflow pattern, check if the guides under `docs/guides/` need updates. - -### 5. Sample Compatibility & Updates -- **Sample Integrity**: Verify if existing samples under `contributing/samples/` are affected by the change. -- **New Samples**: If the changes introduce a key new capability, assess whether a new sample should be added to demonstrate the feature (following `adk-sample-creator` conventions). - -### 6. Test Coverage & Quality -- **Coverage**: Ensure that all modified or new code paths have corresponding unit or integration tests under `tests/`. -- **ADK Test Rules**: Ensure test implementations adhere to the 9 rules in the `adk-style` testing reference (e.g., using deterministic IDs, event normalization, and clean up utilities). - ---- - -## Execution Workflow - -When the `adk-review` skill is triggered, you MUST execute the following steps: - -### Step 1: Retrieve Local Changes -Run `git status` and `git diff` to identify exactly which files have been modified, added, or deleted. - -### Step 2: Perform the Multi-Dimensional Review -Analyze the retrieved diffs file-by-file against the six dimensions in the Checklist. Identify any errors, deviations, or missing files (such as docs, tests, or samples). - -### Step 3: Generate and Present a Review Report -Generate a clear, beautifully formatted Markdown report categorized by priority: -- 🔴 **Critical Errors / Bugs**: Syntax, type safety violations, race conditions, or resource leaks. -- 🟡 **Style & Conventions**: Lints, formatting issues, non-lazy logging, or typing mismatches. -- 🔵 **Documentation, Tests, & Samples**: Missing or stale test coverage, design docs, or user guides. - -Include the specific filename and line number/context for each finding. - -### Step 4: Present Findings and Stop -Stop execution here. Do **NOT** call any code editing tools or modify the codebase automatically. Present the generated review report clearly to the user, highlighting key takeaways, and stop. - -Do **NOT** ask the user if they want you to fix the issues, and do **NOT** offer interactive fixing options by default. Simply stop and wait for the user to explicitly command or ask you to fix the changes. - -### Step 5 (Optional): Implement Authorized Fixes & Verify -If, and only if, the user explicitly instructs or requests you to apply a fix for some or all of the identified findings: -1. Perform the necessary edits using precise code editing tools. Ensure all fixes strictly comply with the established `adk-style` and `adk-architecture` rules. -2. Verify correctness by running associated unit and integration tests (e.g., via `pytest` or pre-commit hooks) before concluding. diff --git a/.agents/skills/adk-sample-creator/SKILL.md b/.agents/skills/adk-sample-creator/SKILL.md deleted file mode 100644 index c8f22f1f92..0000000000 --- a/.agents/skills/adk-sample-creator/SKILL.md +++ /dev/null @@ -1,148 +0,0 @@ ---- -name: adk-sample-creator -description: Author new samples for the ADK Python repository. Use this skill when the user wants to create a new sample demonstrating a feature or agent pattern (e.g., dynamic nodes, standalone agents, fan-out/fan-in) or when adding examples to subdirectories under `contributing/`. ---- - -# ADK Sample Creator - -This skill helps you create new samples for the ADK Python repository. You should search for subdirectories under `contributing` (such as `new_workflow_samples`, `workflow_samples`, etc.) and confirm with the user which folder they want to use before creating the sample. - -> [!TIP] - -> Before creating samples, you can use the `adk-style` skill to learn about ADK 2.0 architecture knowledge and best practices. - -A sample consists of: - -1. A directory per sample. -2. An `agent.py` file defining the agent or workflow logic. -3. A `README.md` file explaining the sample. - -## Guidelines - -### 1. Folder Name - -Use snake_case for the folder name (e.g., `dynamic_nodes`, `fan_out_fan_in`). - -### 2. `agent.py` Content - -The `agent.py` should focus on demonstrating a specific feature or agent pattern. Use absolute imports for testing convenience. - -> [!IMPORTANT] -> **Model Selection**: Do not set the `model` parameter explicitly (e.g., `model="gemini-2.5-flash"`) on `Agent` instances in sample agents. Instead, let them default to the system-configured model, unless a specific model is explicitly requested by the user. - -Choose one of the following patterns: - -#### Pattern A: Workflows (for complex graphs) - -Use this when you need multiple nodes, routing, or parallel execution. - -**Imports:** - -```python -from google.adk import Agent -from google.adk import Context -from google.adk.workflow import node -from google.adk.workflow import JoinNode -from google.adk.workflow._workflow_class import Workflow -``` - -**Anatomy:** - -```python -my_agent = Agent(name="my_agent", ...) - -@node() -async def my_node(node_input: str): - return "result" - -root_agent = Workflow( - name="root_wf", - edges=[("START", my_node)], -) -``` - -#### Pattern B: Standalone Agents (for single-agent or simple tool use) - -Use this when you don't need a graph and the agent handles the loop. - -**Imports:** - -```python -from google.adk import Agent -from google.adk.tools import google_search # example -``` - -**Anatomy:** - -```python -root_agent = Agent( - name="standalone_assistant", - instruction="You are a helpful assistant.", - description="An assistant that can help with queries.", - tools=[google_search], -) -``` - -### 3. `README.md` Content - -Each sample should have a `README.md` with the following structure: - -- **Overview**: What the sample does. -- **Sample Inputs**: Examples of inputs to test with. Each prompt must be wrapped in backticks. If a prompt has an explanation, always add a blank line between the prompt and the explanation, and indent the explanation by two spaces. -- **Graph**: Visualization of the graph flow (Mermaid recommended for workflows). -- **How To**: Explanation of key techniques used (e.g., `ctx.run_node`). - -#### README Example Template: - -````markdown -# ADK Sample Name - -## Overview - -Brief description. - -## Sample Inputs - -- `Prompt example 1` - -- `Prompt example 2` - - *Explanation or expected behavior* - -## Graph - -```mermaid -graph TD - START --> MyNode -``` - -```` - -## How To - -Explain the details. - -```` - -## Examples - -### Dynamic Nodes -Snippet from `dynamic_nodes/agent.py`: -```python -@node(rerun_on_resume=True) -async def orchestrate(ctx: Context, node_input: str) -> str: - while True: - headline = await ctx.run_node(generate_headline) - # ... -```` - -### Fan Out Fan In - -Snippet from `fan_out_fan_in/agent.py`: - -```python -root_agent = Workflow( - name="root_agent", - edges=[("START", (node_a, node_b), join_node, aggregate)], -) -``` diff --git a/.agents/skills/adk-setup/SKILL.md b/.agents/skills/adk-setup/SKILL.md deleted file mode 100644 index 019fba1b2b..0000000000 --- a/.agents/skills/adk-setup/SKILL.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -name: adk-setup -description: Set up a local development environment for the ADK Python project. Use when the user wants to get started developing, set up their environment, install dependencies, or prepare for contributing. -disable-model-invocation: true ---- - -Set up the local development environment for ADK Python. - -## Prerequisites - -Check the following before proceeding: - -1. **Python 3.11+** - - ```bash - python3 --version - ``` - -2. **uv package manager** (required — do not use pip/venv directly) - ```bash - uv --version - ``` - If not installed: - ```bash - curl -LsSf https://astral.sh/uv/install.sh | sh - ``` - -## Setup Steps - -Run these commands from the project root: - -3. **Create and activate a virtual environment:** - - ```bash - uv venv --python "python3.11" ".venv" - source .venv/bin/activate - ``` - -4. **Install all dependencies for development:** - - ```bash - uv sync --all-extras - ``` - -5. **Install development tools:** - - ```bash - uv tool install pre-commit - uv tool install tox --with tox-uv - ``` - -6. **Install addlicense (requires Go):** - - ```bash - go version && go install github.com/google/addlicense@latest - ``` - - > [!NOTE] - > If Go is not installed, tell the user: - > "Go is required for the addlicense tool. Please install Go from https://go.dev/dl/ and then re-run the `adk-setup` skill to complete the setup." - -7. **Set up pre-commit hooks:** - - ```bash - pre-commit install - ``` - -8. **Verify everything works by running tests locally:** - ```bash - pytest tests/unittests -n auto - ``` - -## Key Commands Reference - -| Task | Command | -| :----------------------------------- | :------------------------------------------------ | -| Run unit tests (Fast) | `pytest tests/unittests` | -| Run tests across all Python versions | `tox` | -| Format codebase | `pre-commit run --all-files` | -| Run tests in parallel | `pytest tests/unittests -n auto` | -| Run specific test file | `pytest tests/unittests/agents/test_llm_agent.py` | -| Launch web UI | `adk web path/to/agents_dir` | -| Run agent via CLI | `adk run path/to/my_agent` | -| Build wheel | `uv build` | diff --git a/.agents/skills/adk-style/SKILL.md b/.agents/skills/adk-style/SKILL.md deleted file mode 100644 index eb47597dab..0000000000 --- a/.agents/skills/adk-style/SKILL.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -name: adk-style -description: ADK development style guide for routine nits — Python idioms, codebase conventions, imports, typing, Pydantic patterns, formatting, logging, and file organization. Use this skill whenever writing code, tests, or reviewing PRs for the ADK project to ensure compliance with styling and coding conventions. Triggers on "code style", "how should I format", "naming convention", "lint", "nit", "imports", "typing", "Pydantic patterns", "testing rules". ---- - -# ADK Style Guide - -## Style Guide (references/) -- [Visibility](references/visibility.md) — naming conventions for module-private, internal, and package-private visibility. -- [Imports](references/imports.md) — relative vs absolute imports, `TYPE_CHECKING` patterns. -- [Typing](references/typing.md) — strong typing, avoiding Any, bare type names, keyword-only arguments, `Optional` vs `| None`, abstract parameter types, mutable default avoidance, runtime type discrimination. -- [Pydantic Patterns](references/pydantic.md) — Pydantic v2 usage, `Field()` constraints, `field_validator`, `model_validator`, private attributes, deprecation migration, post-init setup. -- [Formatting](references/formatting.md) — indentation, line limits, and running pre-commit hooks. -- [Documentation](references/documentation.md) — comments and docstrings. -- [Logging](references/logging.md) — lazy evaluation and log levels. -- [File Organization](references/file-organization.md) — file headers and class organization. - -## Testing -[references/testing.md](references/testing.md) — core principles, 9 rules for writing ADK tests, test structure template diff --git a/.agents/skills/adk-style/references/documentation.md b/.agents/skills/adk-style/references/documentation.md deleted file mode 100644 index 2a0fa7be61..0000000000 --- a/.agents/skills/adk-style/references/documentation.md +++ /dev/null @@ -1,12 +0,0 @@ -# Documentation and Comments - -## Public API Documentation - -- **Clear Usage**: For public interfaces, explain the intended usage clearly, with concise examples. -- **Public Classes**: Explain all public attributes. -- **Public Methods/Functions**: Explain all arguments, return values, and raised exceptions. - -## Internal Implementation Comments - -- **Explain Why, Not What**: For internal code and private methods, explain **why**, not **what** — the code itself should be self-documenting. -- **Stale References**: Don't reference RFCs or design docs in source code (they become stale). diff --git a/.agents/skills/adk-style/references/file-organization.md b/.agents/skills/adk-style/references/file-organization.md deleted file mode 100644 index e68e267625..0000000000 --- a/.agents/skills/adk-style/references/file-organization.md +++ /dev/null @@ -1,15 +0,0 @@ -# File Organization - -- One class per file in `workflow/`. -- Private modules prefixed with `_` (e.g., `_base_node.py`). -- Public API exported through `__init__.py`. -- Unit tests must be placed in the same folder hierarchy under `tests/unittests/` as the original file in `src/`. -- If a single source file has multiple test files (e.g. testing different classes or behaviors separately), use the source file name (without leading underscores or extension) as the prefix for the test file names. - - Example: `src/google/adk/tools/environment/_tools.py` -> `tests/unittests/tools/environment/test_tools_edit_file.py` - -## File Headers - -Every source file must have: -1. Apache 2.0 license header. -2. `from __future__ import annotations`. -3. Standard library imports, then third-party, then relative. diff --git a/.agents/skills/adk-style/references/formatting.md b/.agents/skills/adk-style/references/formatting.md deleted file mode 100644 index f65cb37670..0000000000 --- a/.agents/skills/adk-style/references/formatting.md +++ /dev/null @@ -1,20 +0,0 @@ -# Formatting Style Guide - -- 2-space indentation (never tabs). -- 80-character line limit. -- `pyink` formatter (Google-style). -- `isort` with Google profile for import sorting. -- Enforced automatically by pre-commit hooks (`isort`, `pyink`, `addlicense`, `mdformat`). Use the `adk-setup` skill to install and configure these tools. - -## Running Formatter Manually - -```bash -# Format only staged files (runs automatically on commit) -pre-commit run - -# Format all changed files (staged + unstaged) -pre-commit run --files $(git diff --name-only HEAD) - -# Format all files in the repo -pre-commit run --all-files -``` diff --git a/.agents/skills/adk-style/references/imports.md b/.agents/skills/adk-style/references/imports.md deleted file mode 100644 index 3d0a94e411..0000000000 --- a/.agents/skills/adk-style/references/imports.md +++ /dev/null @@ -1,29 +0,0 @@ -# Imports Style Guide - -## General Rules - -- **Source code** (`src/`): Use relative imports. - `from ..agents.llm_agent import LlmAgent` -- **Tests** (`tests/`): Use absolute imports. - `from google.adk.agents.llm_agent import LlmAgent` -- **Import from module**: Import from the module file, not from `__init__.py`. - `from ..agents.llm_agent import LlmAgent` (not `from ..agents import LlmAgent`) -- **CLI package** (`cli/`): - - Treat as an external package. - - Use **relative imports** for files within the `cli/` package. - - Use **absolute imports** for files outside of the `cli/` package. - - **Dependency Direction**: Only `cli/` can import from the rest of the codebase. The other codebase must **STRICTLY NOT** import from `cli/`. - -## TYPE_CHECKING Imports - -Use `TYPE_CHECKING` for imports needed only by type hints to avoid circular imports at runtime: - -```python -from __future__ import annotations -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from ..agents.invocation_context import InvocationContext -``` - -This works because `from __future__ import annotations` makes all annotations strings (deferred evaluation), so the import is never needed at runtime. diff --git a/.agents/skills/adk-style/references/logging.md b/.agents/skills/adk-style/references/logging.md deleted file mode 100644 index 2a2247af47..0000000000 --- a/.agents/skills/adk-style/references/logging.md +++ /dev/null @@ -1,16 +0,0 @@ -# Logging Style Guide - -## General Rules - -- **Lazy Evaluation**: Use lazy-evaluated `%`-based templates for logging to avoid overhead when the log level is not enabled. - - **Good**: `logging.info("Processing item %s", item_id)` - - **Bad**: `logging.info(f"Processing item {item_id}")` -- **Contextual Logging**: Leverage structured logging and trace IDs when available to correlate logs across operations. -- **No Secrets**: Never log sensitive information (API keys, user credentials, or PII). - -## Log Levels - -- **DEBUG**: Detailed information for diagnosing problems. Use generously in internal implementation but avoid cluttering production logs. -- **INFO**: Confirmation that things are working as expected (e.g., workflow started, node completed). -- **WARNING**: Indication that something unexpected happened or a problem might occur soon (e.g., retry triggered). -- **ERROR**: A serious problem that prevented a function or operation from completing. diff --git a/.agents/skills/adk-style/references/pydantic.md b/.agents/skills/adk-style/references/pydantic.md deleted file mode 100644 index 9635eb78a3..0000000000 --- a/.agents/skills/adk-style/references/pydantic.md +++ /dev/null @@ -1,78 +0,0 @@ -# Pydantic Patterns - -ADK models use Pydantic v2. This guide covers the key patterns used throughout the codebase. - -## Basic Model Structure - -- Use `Field()` for validation, defaults, and descriptions. -- Use `PrivateAttr()` for internal state that shouldn't be serialized. -- Use `model_post_init()` instead of `__init__` for setup logic. -- Prefer `model_dump()` over `dict()` (Pydantic v2). - -## On-Wire Models - -For Pydantic models that cross network or system boundaries (e.g., API payloads, WebSocket messages, event persistence), inherit from `SerializedBaseModel` located in `google.adk.utils._serialized_base_model`. - -This ensures: -- camelCase serialization by default (via `alias_generator=to_camel`). - -## Docstrings as Field Descriptions - -To keep code Pythonic and ensure that generated schemas stay in sync with documentation, it is **strongly recommended** to use docstrings as field descriptions for all Pydantic models in the ADK codebase. - -To enable this, add `use_attribute_docstrings=True` to your model's `ConfigDict`: - -```python -from pydantic import BaseModel, ConfigDict - -class MyModel(BaseModel): - model_config = ConfigDict(use_attribute_docstrings=True) - - field_name: str - """Description of the field.""" -``` - -Note: If you are inheriting from `SerializedBaseModel`, this is already enabled by default. - -## Summary of When to Use Each - -| Need | Pattern | -|---|---| -| Simple numeric/string bounds | `Field(ge=0, le=100)` | -| Single-field business logic | `@field_validator('field', mode='after')` | -| Cross-field consistency | `@model_validator(mode='after')` | -| Field deprecation/migration | `@model_validator(mode='before')` | -| Internal mutable state | `PrivateAttr(default_factory=...)` | -| Post-construction setup | `model_post_init()` | - -## `Field()` with Constraints - -Use `Field()` constraints for declarative validation directly on the field definition. This keeps validation close to the data declaration and avoids custom validator boilerplate. - - - -## `field_validator` — Single-Field Validation - -Use `@field_validator` for validation logic that goes beyond simple constraints. This is heavily used in ADK (36+ instances). Always use `mode='after'` unless you need to intercept raw input before Pydantic coercion. - - -**Rules:** -- Decorate with `@field_validator(...)`. While `@classmethod` is automatically applied by Pydantic v2, adding it is recommended in ADK for explicit visibility. -- Return the (possibly transformed) value. -- Raise `ValueError` with a descriptive message on failure. -- Prefer `mode='after'` (validates after Pydantic's own parsing/coercion). - -## `model_validator` — Cross-Field and Migration Validation - -Use `@model_validator` when validation depends on multiple fields, or when handling deprecation/migration of field names. - -### `mode='before'` — Deprecation and Field Migration - - -### `mode='after'` — Cross-Field Consistency - - -**Rules:** -- `mode='before'`: receives raw `data` (usually `dict`). Use for field renaming, deprecation, and input normalization. Must return the (modified) data. -- `mode='after'`: receives the fully constructed model instance (`self`). Use for cross-field consistency checks. Must return `self`. -- Always guard `mode='before'` validators with `isinstance(data, dict)` since data could also come as an existing model instance. diff --git a/.agents/skills/adk-style/references/testing.md b/.agents/skills/adk-style/references/testing.md deleted file mode 100644 index 93bb4d9197..0000000000 --- a/.agents/skills/adk-style/references/testing.md +++ /dev/null @@ -1,232 +0,0 @@ -# ADK Testing Style Guide - -## Core Principles - -- **Test through the public interface** — call what users call, assert what users see. -- **Test behavior, not implementation** — verify outcomes (outputs, side effects, errors), not internal mechanics. -- **Refactor-proof** — if an internal refactor preserves the same behavior, all tests should still pass. - -## Rules - -### 1. Test names describe the behavior, not the mechanism - -```python -# Good — describes what the caller observes -def test_empty_queue_returns_none(): -def test_retry_stops_after_max_attempts(): -def test_missing_key_raises_key_error(): - -# Bad — describes implementation details -def test_deque_popleft_called(): -def test_retry_counter_incremented(): -def test_dict_getitem_raises(): -``` - -### 2. Docstring: one-line summary, then setup/act/assert - -The first line describes the expected behavior from the caller's -perspective. For complex tests (multi-step, multi-invocation), -follow with a structured breakdown of Setup, Act, and Assert. - -```python -# Good — simple test, one-liner is enough -"""Getting from an empty cache returns the default value.""" - -# Good — complex test with structured breakdown -"""Partial FR re-runs nested Workflow, resolved child completes -while unresolved stays interrupted. - -Setup: outer_wf → inner_wf → (child_a, child_b) → join. - Both children interrupt on first run. -Act: - - Run 2: resolve only child_a's FR. - - Run 3: resolve child_b's FR. -Assert: - - Run 2: child_a produces output, invocation still interrupted. - - Run 3: child_b produces output, join completes, no interrupts. -""" - -# Bad — restates the implementation -"""LRUCache._store.get returns sentinel when key missing.""" -"""ThreadPool._accept_tasks flag checked in submit().""" -``` - -### 3. Each test covers one behavior - -If a test checks multiple unrelated behaviors, split it. If you can't -describe the test in one sentence, it's testing too much. - -```python -# Bad — tests capacity AND eviction AND default in one test -def test_cache_behavior(): - assert cache.size == 0 - assert cache.get('x') is None - cache.put('a', 1) - assert cache.size == 1 - -# Good — split into focused tests -def test_new_cache_is_empty(): - """A freshly created cache has no entries.""" - -def test_cache_evicts_oldest_when_full(): - """Adding to a full cache removes the least recently used entry.""" -``` - -### 4. Don't test internal state - -```python -# Bad — reaches into private attributes -assert pool._workers[0].is_alive -assert parser._state == 'HEADER' -assert isinstance(router._handler, _FastHandler) - -# Good — tests through the public interface -assert pool.active_count == 1 -assert parser.parse('data') == expected -assert router.route('/api') == handler -``` - -### 5. Use real components, mock only boundaries - -ADK tests should use real implementations as much as possible -instead of mocking. - -- Mock external dependencies: LLM APIs, cloud services, session stores -- Use real ADK components: BaseNode subclasses, Event, Context -- Mock InvocationContext when testing NodeRunner (it's a boundary) - -### 6. Test fixtures should be minimal - -Define the simplest possible setup that triggers the behavior: - -```python -# Good — minimal fixture, one purpose -def make_user(role='viewer'): - return User(name='test', email='t@t.com', role=role) - -# Bad — kitchen-sink fixture with unrelated setup -def make_full_test_env(): - db = create_database() - user = create_user_with_billing() - setup_notifications() - ... -``` - -### 7. Keep arrange logic close to the test - -When a helper class or fixture is used by only one test, define it -inline inside the test function. This keeps the setup visible at the -point of use and avoids scrolling to distant module-level definitions. -Extract to module level only when 3+ tests share the same helper. - -```python -# Good — helper defined inline, right next to the test -@pytest.mark.asyncio -async def test_state_delta_bundled_with_output(): - """State set before yield is flushed onto the output event.""" - - class _Node(BaseNode): - async def _run_impl(self, *, ctx, node_input): - ctx.state['color'] = 'blue' - yield 'result' - - ctx, events = _make_ctx() - - await NodeRunner(node=_Node(name='n'), parent_ctx=ctx).run() - - assert events[0].output == 'result' - assert events[0].actions.state_delta['color'] == 'blue' - -# Bad — helper defined 300 lines above, reader must scroll -class _StateThenOutputNode(BaseNode): - async def _run_impl(self, *, ctx, node_input): - ctx.state['color'] = 'blue' - yield 'result' - -# ... 300 lines later ... -async def test_state_delta_bundled_with_output(): - node = _StateThenOutputNode(name='n') - ... -``` - -### 8. Assertions tell a story - -```python -# Good — reads like a specification -assert queue.size == 0 -assert config.get('timeout') == 30 -assert response.status_code == 404 - -# Bad — overly defensive, tests framework behavior -assert isinstance(queue, Queue) -assert hasattr(config, 'get') -assert len(response.headers) > 0 -``` - -### 9. Structure tests as arrange, act, assert - -Every test has three distinct steps: - -- **Arrange** — set up the external state specific to the scenario. - General setup shared by many tests belongs in fixtures. -- **Act** — call the system under test. Usually a single call. -- **Assert** — verify return values or visible state changes. No - further calls to the system under test here. - -Keep steps distinct. Separate with blank lines. In simple tests where -each step is a single statement, blank lines can be omitted. In -complex tests, use descriptive comments like "Given [situation]", -"When [action]", "Then [expectation]" — avoid bare labels that add -no information. - -```python -# Good — clear visual separation -def test_cache_returns_stored_value(): - cache = Cache() - cache.put('key', 'value') - - result = cache.get('key') - - assert result == 'value' - -# Good — simple test, blank lines omitted -def test_new_cache_is_empty(): - assert Cache().size == 0 - -# Bad — steps interleaved -def test_cache_behavior(): - cache = Cache() - cache.put('key', 'value') - result = cache.get('key') - assert result == 'value' - cache.put('key2', 'value2') # more setup after assert - assert cache.size == 2 -``` - -### Test Structure Template - -```python -"""Tests for . - -Verifies that correctly . -""" - -# --- Fixtures (minimal, one purpose each) --- - -def _make_service(): - ... - -# --- Tests (one behavior per test) --- - -def test_(): - """""" - # Given a service with default config - service = _make_service() - input_data = 'hello' - - # When the operation is performed - result = service.do_something(input_data) - - # Then the result matches expectations - assert result == expected -``` diff --git a/.agents/skills/adk-style/references/typing.md b/.agents/skills/adk-style/references/typing.md deleted file mode 100644 index 7847433bc1..0000000000 --- a/.agents/skills/adk-style/references/typing.md +++ /dev/null @@ -1,50 +0,0 @@ -# Type Hints and Strong Typing - -## General Rules - -- **Prefer Strong Typing**: Use type hints for all function arguments and return types. Avoid leaving types unspecified. -- **Minimize `Any`**: Use specific types or `Generic` whenever possible. Avoid `Any` as it bypasses type checking. -- **No double-quoted type hints**: When `from __future__ import annotations` is present, use bare type names (e.g., `list[str]` instead of `"list[str]"`). -- **Always include `from __future__ import annotations`**: Every source file must include this immediately after the license header, before any other imports. This enables forward-referencing classes without quotes (PEP 563). - -## `Optional[X]` vs `X | None` - -The codebase uses both styles. Follow this convention: - -- **New code** (especially in `workflow/`): Prefer `X | None` — it is more concise and modern. -- **Existing files**: Match the style already used in the file for consistency. -- **Both are acceptable** — do not refactor one to the other without reason. - - -## Abstract Types for Function Parameters - -Use abstract types from `collections.abc` for function parameter annotations. This accepts the widest range of inputs while remaining type-safe. Use concrete types for return annotations to give callers the most useful information. - - - -## Keyword-Only Arguments - -Use `*` to force keyword-only arguments on functions with multiple parameters of the same type, or where argument order is error-prone. This is a widely used pattern in ADK (16+ files). - - -**When to use `*`:** -- Constructors (`__init__`) with 2+ non-self parameters -- Any function where swapping arguments would silently produce wrong results -- Methods with multiple `str` or `int` parameters - -## Mutable Default Arguments - -**Never use mutable default arguments.** Use `None` as a sentinel and initialize in the function body. This is a well-followed pattern throughout ADK. - - -This applies to `list`, `dict`, `set`, and any other mutable type. - -## Runtime Type Discrimination with `isinstance()` - -Use `isinstance()` for runtime type discrimination when handling polymorphic inputs. This is pervasive in ADK (700+ usages). Prefer exhaustive `if/elif` chains with a clear fallback. - - -**Guidelines:** -- Always include an `else` branch that raises `TypeError` or handles the unknown case. -- Prefer `isinstance(x, SomeType)` over `type(x) is SomeType` — it handles subclasses correctly. -- For checking multiple types: `isinstance(x, (TypeA, TypeB))`. diff --git a/.agents/skills/adk-style/references/visibility.md b/.agents/skills/adk-style/references/visibility.md deleted file mode 100644 index bba7488e5f..0000000000 --- a/.agents/skills/adk-style/references/visibility.md +++ /dev/null @@ -1,61 +0,0 @@ -# Visibility Style Guide - -Python does not have native access modifiers (like `public`, `private`, or `package-private`). ADK relies on naming conventions and module structure to define visibility boundaries. - -## Conventions - -### 1. Module-Private / Internal Files - -- **Private by Default**: All new `.py` module files under `src/google/adk/` must be private by default (prefixed with `_`). This is enforced by a pre-commit hook (`check-new-py-prefix`). -- Even if a file contains symbols intended for the public API, the file itself must have a leading underscore. The symbols are then exposed via the package's `__init__.py`. -- Files intended for internal use within a package or subsystem must also be prefixed with a leading underscore (e.g., `_task_models.py`). -- These files should **never** be imported directly by code outside of the ADK framework. - -### 2. Class and Function Visibility - -- **Public**: No leading underscore. Intended for use by consumers of the module or package. -- **Internal/Private**: Leading underscore (e.g., `_private_method()`). Intended only for use within the defining class or module. - -### 3. Package-Private (Subsystem Visibility) - -Since Python lacks true package-private access, we simulate it by: - -- **Not exporting** the symbol in the package's `__init__.py`. -- Using `_`-prefixed modules for internal implementation details. -- Code within the same package can import from these `_` modules, but code outside should not. -- **Direct Imports Required**: Within the ADK framework, importing from `__init__.py` is **not allowed**. You must import from the specific module directly. This helps keep `__init__.py` minimal and keeps packages as self-contained as possible. - -### 4. Public API Export - -- The public API of a package must be explicitly exported in `__init__.py`. -- **Use `__all__`**: The `__init__.py` file should define `__all__` to explicitly list the symbols that are part of the public API. -- **Only public names** (symbols intended for use outside the package) should be imported into `__init__.py` and listed in `__all__`. -- Users should be able to import public symbols directly from the package level, rather than digging into internal modules. - -## Examples - -### Exposing a Public Interface - -```python -# In src/google/adk/agents/llm/task/_task_agent.py (File is private by default) -class TaskAgent: # Public symbol - ... - -# In src/google/adk/agents/llm/task/__init__.py -from ._task_agent import TaskAgent - -__all__ = [ - 'TaskAgent', -] -``` - -### Keeping Implementation Details Private - -```python -# In src/google/adk/agents/llm/task/_task_models.py (Internal file) -class TaskRequest(BaseModel): # Public within the module, but module is private - ... - -# In src/google/adk/agents/llm/task/__init__.py -# We DO NOT export TaskRequest here if it is only for internal use within the task package. -``` diff --git a/.github/.release-please-manifest-v1.json b/.github/.release-please-manifest-v1.json deleted file mode 100644 index 4a263fa42a..0000000000 --- a/.github/.release-please-manifest-v1.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - ".": "2.0.0-alpha.1" -} diff --git a/.github/.release-please-manifest-v2.json b/.github/.release-please-manifest-v2.json new file mode 100644 index 0000000000..0739396e62 --- /dev/null +++ b/.github/.release-please-manifest-v2.json @@ -0,0 +1,3 @@ +{ + ".": "2.0.0-alpha.0" +} diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index a5d1cf2884..1aa7bc97e6 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "2.2.0" + ".": "1.34.0" } diff --git a/.github/release-please-config-v1.json b/.github/release-please-config-v2.json similarity index 95% rename from .github/release-please-config-v1.json rename to .github/release-please-config-v2.json index de82db0991..6947d9e15a 100644 --- a/.github/release-please-config-v1.json +++ b/.github/release-please-config-v2.json @@ -58,6 +58,5 @@ } ] } - }, - "last-release-sha": "4af7cbb5c8319208337e18b0a6bc55288b51b0b1" + } } diff --git a/.github/release-please-config.json b/.github/release-please-config.json index 4c50d83024..de6a8a5fb5 100644 --- a/.github/release-please-config.json +++ b/.github/release-please-config.json @@ -1,8 +1,10 @@ { "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "last-release-sha": "07a9a01b3c1fb2866cc8bdcd8d8ab0906aa88682", "packages": { ".": { "release-type": "python", + "versioning": "always-bump-minor", "package-name": "google-adk", "include-component-in-tag": false, "skip-github-release": true, @@ -55,6 +57,5 @@ } ] } - }, - "last-release-sha": "cd81f7bde91df78d6cece539a6f98dda2aa8c9c0" + } } diff --git a/.github/workflows/analyze-releases-for-adk-docs-updates.yml b/.github/workflows/analyze-releases-for-adk-docs-updates.yml index 0cb270eb5c..7932ecad32 100644 --- a/.github/workflows/analyze-releases-for-adk-docs-updates.yml +++ b/.github/workflows/analyze-releases-for-adk-docs-updates.yml @@ -51,7 +51,7 @@ jobs: if: ${{ github.event.inputs.resume == 'true' }} uses: actions/cache/restore@v4 with: - path: contributing/samples/adk_team/adk_documentation/adk_release_analyzer/sessions.db + path: contributing/samples/adk_documentation/adk_release_analyzer/sessions.db key: analyzer-session-db - name: Run Analyzing Script @@ -64,9 +64,9 @@ jobs: DOC_REPO: 'adk-docs' CODE_REPO: 'adk-python' INTERACTIVE: 0 - PYTHONPATH: contributing/samples/adk_team + PYTHONPATH: contributing/samples/adk_documentation run: >- - python -m adk_documentation.adk_release_analyzer.main + python -m adk_release_analyzer.main ${{ github.event.inputs.resume == 'true' && '--resume' || '' }} ${{ github.event.inputs.start_tag && format('--start-tag {0}', github.event.inputs.start_tag) || '' }} ${{ github.event.inputs.end_tag && format('--end-tag {0}', github.event.inputs.end_tag) || '' }} @@ -75,5 +75,5 @@ jobs: if: always() uses: actions/cache/save@v4 with: - path: contributing/samples/adk_team/adk_documentation/adk_release_analyzer/sessions.db + path: contributing/samples/adk_documentation/adk_release_analyzer/sessions.db key: analyzer-session-db diff --git a/.github/workflows/check-file-contents.yml b/.github/workflows/check-file-contents.yml index 42d820ab47..f703422f76 100644 --- a/.github/workflows/check-file-contents.yml +++ b/.github/workflows/check-file-contents.yml @@ -1,3 +1,17 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: "Check file contents" on: @@ -100,37 +114,3 @@ jobs: else echo "✅ No relevant Python files found." fi - - - name: Check for hardcoded googleapis.com endpoints - run: | - git fetch origin ${GITHUB_BASE_REF} - CHANGED_FILES=$(git diff --diff-filter=ACMR --name-only origin/${GITHUB_BASE_REF}...HEAD | grep -E '\.py$' || true) - if [ -n "$CHANGED_FILES" ]; then - echo "Checking for hardcoded endpoints in: $CHANGED_FILES" - - # 1. Identify files containing any googleapis.com URL. - set +e - FILES_WITH_ENDPOINTS=$(grep -lE 'https?://[a-zA-Z0-9.-]+\.googleapis\.com' $CHANGED_FILES) - - # 2. From those, identify files that are MISSING the required mTLS version. - if [ -n "$FILES_WITH_ENDPOINTS" ]; then - FILES_MISSING_MTLS=$(grep -L '.mtls.googleapis.com' $FILES_WITH_ENDPOINTS) - fi - set -e - - if [ -n "$FILES_MISSING_MTLS" ]; then - echo "❌ Found hardcoded googleapis.com endpoints without mTLS support." - echo "The following files must define both standard and mTLS (.mtls.googleapis.com) endpoints" - echo "to support dynamic endpoint selection as required by security policy:" - echo "$FILES_MISSING_MTLS" - echo "" - echo "To fix this, please follow these steps:" - echo "1. Initialize an AuthorizedSession with your credentials." - echo "2. Use 'mtls.has_default_client_cert_source() from google-auth' to check for available client certificates." - echo "3. If certificates are present, use 'session.configure_mtls_channel()'." - echo "4. Dynamically select the '.mtls.' variant of the endpoint when mTLS is active." - exit 1 - else - echo "✅ All hardcoded endpoints have corresponding mTLS definitions or no endpoints found." - fi - fi diff --git a/.github/workflows/copybara-pr-handler.yml b/.github/workflows/copybara-pr-handler.yml index 28c0f3cdcd..4ca3c48803 100644 --- a/.github/workflows/copybara-pr-handler.yml +++ b/.github/workflows/copybara-pr-handler.yml @@ -57,21 +57,15 @@ jobs: console.log(`\n--- Processing commit ${sha.substring(0, 7)} ---`); console.log(`Committer: ${committer}`); - // Check if this is a Copybara commit or has a pull request reference - const isCopybara = committer === 'Copybara-Service' || - commit.author?.email === 'genai-sdk-bot@google.com' || - message.includes('GitOrigin-RevId:') || - message.includes('PiperOrigin-RevId:') || - /Merge:?\s+https:\/\/github\.com\/google\/adk-python\/pull\/(\d+)/.test(message); - - if (!isCopybara) { + // Check if this is a Copybara commit + if (committer !== 'Copybara-Service') { console.log('Not a Copybara commit, skipping'); continue; } // Extract PR number from commit message - // Pattern matches both "Merge https://..." and "Merge: https://..." - const prMatch = message.match(/Merge:?\s+https:\/\/github\.com\/google\/adk-python\/pull\/(\d+)/); + // Pattern: "Merge https://github.com/google/adk-python/pull/3333" + const prMatch = message.match(/Merge https:\/\/github\.com\/google\/adk-python\/pull\/(\d+)/); if (!prMatch) { console.log('No PR number found in Copybara commit message'); @@ -119,14 +113,6 @@ jobs: body: `Thank you @${author} for your contribution! 🎉\n\nYour changes have been successfully imported and merged via Copybara in commit ${commitSha}.\n\nClosing this PR as the changes are now in the main branch.` }); - // Add 'merged' label to the PR - await github.rest.issues.addLabels({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: prNumber, - labels: ['merged'] - }); - // Close the PR await github.rest.pulls.update({ owner: context.repo.owner, diff --git a/.github/workflows/discussion_answering.yml b/.github/workflows/discussion_answering.yml index c5e2209137..eda9bb27dd 100644 --- a/.github/workflows/discussion_answering.yml +++ b/.github/workflows/discussion_answering.yml @@ -48,7 +48,7 @@ jobs: OWNER: 'google' REPO: 'adk-python' INTERACTIVE: 0 - PYTHONPATH: contributing/samples/adk_team + PYTHONPATH: contributing/samples run: | # Write discussion data to temporary file to avoid secret masking issues cat > /tmp/discussion.json << 'EOF' diff --git a/.github/workflows/gemini-dispatch.yml b/.github/workflows/gemini-dispatch.yml new file mode 100644 index 0000000000..9c2bf8ec9d --- /dev/null +++ b/.github/workflows/gemini-dispatch.yml @@ -0,0 +1,189 @@ +name: '🔀 Gemini Dispatch' + +on: + pull_request_review_comment: + types: + - 'created' + pull_request_review: + types: + - 'submitted' + issue_comment: + types: + - 'created' + +defaults: + run: + shell: 'bash' + +jobs: + debugger: + if: |- + ${{ fromJSON(vars.GEMINI_DEBUG || vars.ACTIONS_STEP_DEBUG || false) }} + runs-on: 'ubuntu-latest' + permissions: + contents: 'read' + steps: + - name: 'Print context for debugging' + env: + DEBUG_event_name: '${{ github.event_name }}' + DEBUG_event__action: '${{ github.event.action }}' + DEBUG_event__comment__author_association: '${{ github.event.comment.author_association }}' + DEBUG_event__issue__author_association: '${{ github.event.issue.author_association }}' + DEBUG_event__pull_request__author_association: '${{ github.event.pull_request.author_association }}' + DEBUG_event__review__author_association: '${{ github.event.review.author_association }}' + DEBUG_event: '${{ toJSON(github.event) }}' + run: |- + env | grep '^DEBUG_' + + dispatch: + # Only trigger if user types @gemini-cli and author association is OWNER, MEMBER, or COLLABORATOR + if: |- + github.event.sender.type == 'User' && + startsWith(github.event.comment.body || github.event.review.body, '@gemini-cli') && + contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association || github.event.review.author_association) + runs-on: 'ubuntu-latest' + permissions: + contents: 'read' + issues: 'write' + pull-requests: 'write' + outputs: + command: '${{ steps.extract_command.outputs.command }}' + request: '${{ steps.extract_command.outputs.request }}' + additional_context: '${{ steps.extract_command.outputs.additional_context }}' + issue_number: '${{ github.event.pull_request.number || github.event.issue.number }}' + steps: + - name: 'Mint identity token' + id: 'mint_identity_token' + if: |- + ${{ vars.APP_ID }} + uses: 'actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf' # ratchet:actions/create-github-app-token@v2 + with: + app-id: '${{ vars.APP_ID }}' + private-key: '${{ secrets.APP_PRIVATE_KEY }}' + permission-contents: 'read' + permission-issues: 'write' + permission-pull-requests: 'write' + + - name: 'Extract command' + id: 'extract_command' + uses: 'actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd' # ratchet:actions/github-script@v8.0.0 + env: + REQUEST: '${{ github.event.comment.body || github.event.review.body }}' + IS_PR: '${{ !!(github.event.pull_request || github.event.issue.pull_request) }}' + with: + script: | + const request = process.env.REQUEST; + const isPr = process.env.IS_PR === 'true'; + core.setOutput('request', request); + + // Ensure request is on a PR targeting the main branch + let baseRef = ''; + if (context.eventName === 'pull_request_review' || context.eventName === 'pull_request_review_comment') { + baseRef = context.payload.pull_request.base.ref; + } else if (context.eventName === 'issue_comment' && context.payload.issue.pull_request) { + const pr = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.payload.issue.number + }); + baseRef = pr.data.base.ref; + } + + if (isPr && baseRef !== 'main') { + console.log(`Skipping: PR targets '${baseRef}', but only 'main' is allowed.`); + core.setOutput('command', 'fallthrough'); + return; + } + + if (request.startsWith("@gemini-cli /review")) { + if (isPr) { + core.setOutput('command', 'review'); + const additionalContext = request.replace(/^@gemini-cli \/review/, '').trim(); + core.setOutput('additional_context', additionalContext); + } else { + core.setOutput('command', 'fallthrough'); + } + } else if (request.startsWith("@gemini-cli")) { + const additionalContext = request.replace(/^@gemini-cli/, '').trim(); + core.setOutput('command', 'invoke'); + core.setOutput('additional_context', additionalContext); + } else { + core.setOutput('command', 'fallthrough'); + } + + - name: 'Acknowledge request' + env: + GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}' + ISSUE_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}' + MESSAGE: |- + 🤖 Hi @${{ github.actor }}, I've received your request, and I'm working on it now! You can track my progress [in the logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details. + REPOSITORY: '${{ github.repository }}' + run: |- + gh issue comment "${ISSUE_NUMBER}" \ + --body "${MESSAGE}" \ + --repo "${REPOSITORY}" + + review: + needs: 'dispatch' + if: |- + ${{ needs.dispatch.outputs.command == 'review' }} + uses: './.github/workflows/gemini-review.yml' + permissions: + contents: 'read' + id-token: 'write' + issues: 'write' + pull-requests: 'write' + with: + additional_context: '${{ needs.dispatch.outputs.additional_context }}' + secrets: 'inherit' + + invoke: + needs: 'dispatch' + if: |- + ${{ needs.dispatch.outputs.command == 'invoke' }} + uses: './.github/workflows/gemini-invoke.yml' + permissions: + contents: 'read' + id-token: 'write' + issues: 'write' + pull-requests: 'write' + with: + additional_context: '${{ needs.dispatch.outputs.additional_context }}' + secrets: 'inherit' + + fallthrough: + needs: + - 'dispatch' + - 'review' + - 'invoke' + if: |- + ${{ always() && !cancelled() && (failure() || needs.dispatch.outputs.command == 'fallthrough') }} + runs-on: 'ubuntu-latest' + permissions: + contents: 'read' + issues: 'write' + pull-requests: 'write' + steps: + - name: 'Mint identity token' + id: 'mint_identity_token' + if: |- + ${{ vars.APP_ID }} + uses: 'actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf' # ratchet:actions/create-github-app-token@v2 + with: + app-id: '${{ vars.APP_ID }}' + private-key: '${{ secrets.APP_PRIVATE_KEY }}' + permission-contents: 'read' + permission-issues: 'write' + permission-pull-requests: 'write' + + - name: 'Send failure comment' + env: + GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}' + ISSUE_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}' + MESSAGE: |- + 🤖 I'm sorry @${{ github.actor }}, but I was unable to process your request. Please [see the logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details. + REPOSITORY: '${{ github.repository }}' + run: |- + gh issue comment "${ISSUE_NUMBER}" \ + --body "${MESSAGE}" \ + --repo "${REPOSITORY}" diff --git a/.github/workflows/gemini-invoke.yml b/.github/workflows/gemini-invoke.yml new file mode 100644 index 0000000000..5138d6f729 --- /dev/null +++ b/.github/workflows/gemini-invoke.yml @@ -0,0 +1,104 @@ +name: '▶️ Gemini Invoke' + +on: + workflow_call: + inputs: + additional_context: + type: 'string' + description: 'Any additional context from the request' + required: false + +concurrency: + group: '${{ github.workflow }}-invoke-${{ github.event_name }}-${{ github.event.pull_request.number || github.event.issue.number }}' + cancel-in-progress: false + +defaults: + run: + shell: 'bash' + +jobs: + invoke: + runs-on: 'ubuntu-latest' + permissions: + contents: 'read' + id-token: 'write' + issues: 'write' + pull-requests: 'write' + steps: + - name: 'Mint identity token' + id: 'mint_identity_token' + if: |- + ${{ vars.APP_ID }} + uses: 'actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf' # ratchet:actions/create-github-app-token@v2 + with: + app-id: '${{ vars.APP_ID }}' + private-key: '${{ secrets.APP_PRIVATE_KEY }}' + permission-contents: 'read' + permission-issues: 'write' + permission-pull-requests: 'write' + + - name: 'Checkout Code' + uses: 'actions/checkout@v4' # ratchet:exclude + + - name: 'Run Gemini CLI' + id: 'run_gemini' + uses: 'google-github-actions/run-gemini-cli@v0' # ratchet:exclude + env: + TITLE: '${{ github.event.pull_request.title || github.event.issue.title }}' + DESCRIPTION: '${{ github.event.pull_request.body || github.event.issue.body }}' + EVENT_NAME: '${{ github.event_name }}' + GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}' + IS_PULL_REQUEST: '${{ !!github.event.pull_request }}' + ISSUE_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}' + REPOSITORY: '${{ github.repository }}' + ADDITIONAL_CONTEXT: '${{ inputs.additional_context }}' + # Required to allow the Gemini CLI to process files in the ephemeral GitHub Actions runner + GEMINI_CLI_TRUST_WORKSPACE: 'true' + with: + gcp_location: '${{ vars.GOOGLE_CLOUD_LOCATION }}' + gcp_project_id: '${{ vars.GOOGLE_CLOUD_PROJECT }}' + gcp_service_account: '${{ vars.SERVICE_ACCOUNT_EMAIL }}' + gcp_workload_identity_provider: '${{ vars.GCP_WIF_PROVIDER }}' + gemini_api_key: '${{ secrets.GOOGLE_API_KEY }}' + gemini_cli_version: '${{ vars.GEMINI_CLI_VERSION }}' + gemini_debug: '${{ fromJSON(vars.GEMINI_DEBUG || vars.ACTIONS_STEP_DEBUG || false) }}' + gemini_model: '${{ vars.GEMINI_MODEL }}' + google_api_key: '${{ secrets.GOOGLE_API_KEY }}' + use_gemini_code_assist: '${{ vars.GOOGLE_GENAI_USE_GCA }}' + use_vertex_ai: '${{ vars.GOOGLE_GENAI_USE_VERTEXAI }}' + upload_artifacts: '${{ vars.UPLOAD_ARTIFACTS }}' + workflow_name: 'gemini-invoke' + # Assistant workflows can be triggered by comments on either Issues or PRs. + # We explicitly map both fields so the CLI can correctly categorize the interaction. + github_pr_number: '${{ github.event.pull_request.number }}' + github_issue_number: '${{ github.event.issue.number }}' + settings: |- + { + "model": { + "maxSessionTurns": 25 + }, + "telemetry": { + "enabled": true, + "target": "local", + "outfile": ".gemini/telemetry.log" + }, + "mcpServers": { + "github": { + "command": "docker", + "args": [ + "run", + "-i", + "--rm", + "-e", + "GITHUB_PERSONAL_ACCESS_TOKEN", + "ghcr.io/github/github-mcp-server:v0.27.0" + ], + "env": { + "GITHUB_PERSONAL_ACCESS_TOKEN": "${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}" + } + } + } + } + prompt: |- + /gemini-invoke + [IMPORTANT] Do not generate execution plans and do not ask for approval (such as suggesting `@gemini-cli /approve`). Perform the requested task or answer the question directly and immediately. diff --git a/.github/workflows/gemini-review.yml b/.github/workflows/gemini-review.yml new file mode 100644 index 0000000000..9c1b1bf442 --- /dev/null +++ b/.github/workflows/gemini-review.yml @@ -0,0 +1,100 @@ +name: '🔎 Gemini Review' + +on: + workflow_call: + inputs: + additional_context: + type: 'string' + description: 'Any additional context from the request' + required: false + +concurrency: + group: '${{ github.workflow }}-review-${{ github.event_name }}-${{ github.event.pull_request.number || github.event.issue.number }}' + cancel-in-progress: true + +defaults: + run: + shell: 'bash' + +jobs: + review: + runs-on: 'ubuntu-latest' + timeout-minutes: 7 + permissions: + contents: 'read' + id-token: 'write' + issues: 'write' + pull-requests: 'write' + steps: + - name: 'Mint identity token' + id: 'mint_identity_token' + if: |- + ${{ vars.APP_ID }} + uses: 'actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf' # ratchet:actions/create-github-app-token@v2 + with: + app-id: '${{ vars.APP_ID }}' + private-key: '${{ secrets.APP_PRIVATE_KEY }}' + permission-contents: 'read' + permission-issues: 'write' + permission-pull-requests: 'write' + + - name: 'Checkout repository' + uses: 'actions/checkout@v4' # ratchet:exclude + + - name: 'Run Gemini pull request review' + uses: 'google-github-actions/run-gemini-cli@v0' # ratchet:exclude + id: 'gemini_pr_review' + env: + GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}' + ISSUE_TITLE: '${{ github.event.pull_request.title || github.event.issue.title }}' + ISSUE_BODY: '${{ github.event.pull_request.body || github.event.issue.body }}' + PULL_REQUEST_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}' + REPOSITORY: '${{ github.repository }}' + ADDITIONAL_CONTEXT: '${{ inputs.additional_context }}' + GEMINI_API_KEY: '${{ secrets.GOOGLE_API_KEY }}' + # Required to allow the Gemini CLI to process files in the ephemeral GitHub Actions runner + GEMINI_CLI_TRUST_WORKSPACE: 'true' + with: + gcp_location: '${{ vars.GOOGLE_CLOUD_LOCATION }}' + gcp_project_id: '${{ vars.GOOGLE_CLOUD_PROJECT }}' + gcp_service_account: '${{ vars.SERVICE_ACCOUNT_EMAIL }}' + gcp_workload_identity_provider: '${{ vars.GCP_WIF_PROVIDER }}' + gemini_api_key: '${{ secrets.GOOGLE_API_KEY }}' + gemini_cli_version: '${{ vars.GEMINI_CLI_VERSION }}' + gemini_debug: '${{ fromJSON(vars.GEMINI_DEBUG || vars.ACTIONS_STEP_DEBUG || false) }}' + gemini_model: '${{ vars.GEMINI_MODEL }}' + google_api_key: '${{ secrets.GOOGLE_API_KEY }}' + use_gemini_code_assist: '${{ vars.GOOGLE_GENAI_USE_GCA }}' + use_vertex_ai: '${{ vars.GOOGLE_GENAI_USE_VERTEXAI }}' + upload_artifacts: '${{ vars.UPLOAD_ARTIFACTS }}' + workflow_name: 'gemini-review' + # Explicitly set the PR number to handle `issue_comment` triggers (which GitHub treats as issues, not PRs) + github_pr_number: '${{ github.event.pull_request.number || github.event.issue.number }}' + settings: |- + { + "model": { + "maxSessionTurns": 25 + }, + "telemetry": { + "enabled": true, + "target": "local", + "outfile": ".gemini/telemetry.log" + }, + "mcpServers": { + "github": { + "command": "docker", + "args": [ + "run", + "-i", + "--rm", + "-e", + "GITHUB_PERSONAL_ACCESS_TOKEN", + "ghcr.io/github/github-mcp-server:v0.27.0" + ], + "env": { + "GITHUB_PERSONAL_ACCESS_TOKEN": "${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}" + } + } + } + } + prompt: 'Please use the pull_request_read tool to read pull request #${{ github.event.pull_request.number || github.event.issue.number }}. Analyze the code for bugs, security issues, and best practices. Then, use the add_comment_to_pending_review and pull_request_review_write tools to post your review directly on pull request #${{ github.event.pull_request.number || github.event.issue.number }}.' diff --git a/.github/workflows/issue-analyze.yml b/.github/workflows/issue-analyze.yml deleted file mode 100644 index 9f50fd547e..0000000000 --- a/.github/workflows/issue-analyze.yml +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -name: ADK Issue Triage & Analysis - -on: - issues: - types: [opened] - issue_comment: - types: [created] - workflow_dispatch: - inputs: - issue_url: - description: 'The URL of the GitHub issue to analyze' - required: true - type: string - -jobs: - issue-analyze: - if: >- - github.repository == 'google/adk-python' && ( - github.event_name == 'issues' || - github.event_name == 'workflow_dispatch' || - (github.event_name == 'issue_comment' && - startsWith(github.event.comment.body, '/adk-issue-analyze') && ( - github.event.comment.author_association == 'OWNER' || - github.event.comment.author_association == 'MEMBER' || - github.event.comment.author_association == 'COLLABORATOR' - )) - ) - runs-on: ubuntu-latest - permissions: - issues: write - contents: read - - steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: '3.11' - - - name: Authenticate to Google Cloud - id: auth - uses: 'google-github-actions/auth@v3' - with: - credentials_json: '${{ secrets.ADK_GCP_SA_KEY }}' - - - name: Install Google Antigravity SDK - run: pip install google-antigravity - - - name: Run Antigravity Triage - env: - GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }} - GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} - run: | - python scripts/run_antigravity.py "/adk-issue-analyze ${{ github.event.issue.html_url || inputs.issue_url }}" > triage_report.md - cat triage_report.md - - - name: Post Triage Report as Comment - env: - GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }} - run: | - gh issue comment "${{ github.event.issue.html_url || inputs.issue_url }}" --body-file triage_report.md diff --git a/.github/workflows/issue-fix.yml b/.github/workflows/issue-fix.yml deleted file mode 100644 index 9955170f72..0000000000 --- a/.github/workflows/issue-fix.yml +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -name: ADK Issue Fix Implementation - -on: - issue_comment: - types: [created] - workflow_dispatch: - inputs: - issue_url: - description: 'The URL of the GitHub issue to fix' - required: true - type: string - -jobs: - issue-fix: - if: >- - github.repository == 'google/adk-python' && ( - github.event_name == 'workflow_dispatch' || - (github.event_name == 'issue_comment' && - !github.event.issue.pull_request && - startsWith(github.event.comment.body, '/adk-issue-fix') && ( - github.event.comment.author_association == 'OWNER' || - github.event.comment.author_association == 'MEMBER' || - github.event.comment.author_association == 'COLLABORATOR' - )) - ) - runs-on: ubuntu-latest - permissions: - issues: write - contents: write - pull-requests: write - - steps: - - name: Checkout repository - uses: actions/checkout@v6 - with: - token: ${{ secrets.ADK_TRIAGE_AGENT }} - fetch-depth: 0 - - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: '3.11' - - - name: Authenticate to Google Cloud - id: auth - uses: 'google-github-actions/auth@v3' - with: - credentials_json: '${{ secrets.ADK_GCP_SA_KEY }}' - - - name: Install Google Antigravity SDK - run: pip install google-antigravity - - - name: Run Antigravity Fix - env: - GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }} - GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} - run: | - python scripts/run_antigravity.py "/adk-issue-fix ${{ github.event.issue.html_url || inputs.issue_url }}" - - - name: Check for changes and create Pull Request - env: - GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }} - GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} - run: | - if [ -n "$(git status --porcelain)" ]; then - echo "Changes detected in workspace. Committing and creating Pull Request..." - - # Setup git configs - git config --local user.name "adk-bot" - git config --local user.email "adk-bot@google.com" - - # Extract issue number and export it for python - ISSUE_URL="${{ github.event.issue.html_url || inputs.issue_url }}" - export ISSUE_NUMBER=$(echo "$ISSUE_URL" | grep -oP '/issues/\K[0-9]+') - - # Determine branch name to push - CURRENT_BRANCH=$(git branch --show-current) - EXPECTED_BRANCH="fix/issue-${ISSUE_NUMBER}" - if [ "$CURRENT_BRANCH" != "$EXPECTED_BRANCH" ]; then - echo "Error: Current branch is '$CURRENT_BRANCH', but expected '$EXPECTED_BRANCH'." - echo "The Antigravity Agent was expected to create and checkout '$EXPECTED_BRANCH'." - exit 1 - fi - BRANCH_NAME="$CURRENT_BRANCH" - - # Run Antigravity to stage and commit changes with autogenerated message - python scripts/run_antigravity.py "Analyze the unstaged changes in the workspace, stage all of them, and commit them using git. Generate a highly precise conventional commit message based on the diff." - - # Append the closes tag using Python to avoid relying on LLM formatting - python -c "import os, subprocess; msg = subprocess.check_output(['git', 'log', '-1', '--pretty=%B'], text=True); tag = 'closes https://github.com/google/adk-python/issues/' + os.environ['ISSUE_NUMBER']; subprocess.run(['git', 'commit', '--amend', '-m', msg.strip() + '\n\n' + tag], check=True) if tag not in msg else None" - - # Retrieve the username of the authenticated user - BOT_USER=$(gh api user --jq .login) - echo "Authenticated bot user is $BOT_USER" - - # Ensure the fork exists - gh repo fork google/adk-python --clone=false || true - - # Push the branch to the bot fork - git remote add fork "https://x-access-token:${{ secrets.ADK_TRIAGE_AGENT }}@github.com/${BOT_USER}/adk-python.git" - git push fork "$BRANCH_NAME" --force - - # Retrieve the commit message of the last commit - COMMIT_MSG=$(git log -1 --pretty=%B) - - # Create PR from the bot fork to the main repository - gh pr create \ - --repo google/adk-python \ - --title "fix(issue): fix issue #${ISSUE_NUMBER}" \ - --body "$COMMIT_MSG" \ - --head "${BOT_USER}:$BRANCH_NAME" \ - --base "main" - else - echo "No changes made by the agent. Skipping PR creation." - fi diff --git a/.github/workflows/issue-monitor.yml b/.github/workflows/issue-monitor.yml index 2f0ca04612..e0dc82dcf7 100644 --- a/.github/workflows/issue-monitor.yml +++ b/.github/workflows/issue-monitor.yml @@ -58,6 +58,6 @@ jobs: REPO: ${{ github.event.repository.name }} CONCURRENCY_LIMIT: 3 INITIAL_FULL_SCAN: ${{ github.event.inputs.full_scan == 'true' }} - LLM_MODEL_NAME: "gemini-3.5-flash" - PYTHONPATH: contributing/samples/adk_team + LLM_MODEL_NAME: "gemini-2.5-flash" + PYTHONPATH: contributing/samples run: python -m adk_issue_monitoring_agent.main diff --git a/.github/workflows/pr-analyze.yml b/.github/workflows/pr-analyze.yml deleted file mode 100644 index 87bd974850..0000000000 --- a/.github/workflows/pr-analyze.yml +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -name: ADK Pull Request Triage & Analysis - -on: - pull_request_target: - types: [opened, synchronize, reopened] - issue_comment: - types: [created] - status: - workflow_dispatch: - inputs: - pr_number: - description: 'The Pull Request number to analyze' - required: true - type: string - -jobs: - pr-analyze: - if: >- - github.repository == 'google/adk-python' && ( - github.event_name == 'pull_request_target' || - github.event_name == 'workflow_dispatch' || - (github.event_name == 'status' && - github.event.context == 'cla/google' && - github.event.state == 'success') || - (github.event_name == 'issue_comment' && - github.event.issue.pull_request != null && - startsWith(github.event.comment.body, '/adk-pr-analyze') && ( - github.event.comment.author_association == 'OWNER' || - github.event.comment.author_association == 'MEMBER' || - github.event.comment.author_association == 'COLLABORATOR' - )) - ) - runs-on: ubuntu-latest - permissions: - pull-requests: write - issues: write - contents: read - - steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: '3.11' - - - name: Check CLA Status - id: check-cla - env: - GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }} - run: | - if [ "${{ github.event_name }}" = "status" ]; then - echo "Resolving PR number for commit ${{ github.event.sha }}" - PR_NUM=$(gh api repos/${{ github.repository }}/commits/${{ github.event.sha }}/pulls --jq '.[] | select(.state=="open") | .number' | head -n 1) - if [ -z "$PR_NUM" ]; then - echo "No open PR found for commit ${{ github.event.sha }}. Skipping." - echo "signed=false" >> $GITHUB_OUTPUT - exit 0 - fi - else - PR_NUM="${{ github.event.pull_request.number || github.event.issue.number || inputs.pr_number }}" - fi - - echo "PR_NUM=$PR_NUM" >> $GITHUB_ENV - echo "Checking CLA status for PR #$PR_NUM" - - # Run triage_pr.py to check CLA status and pull request data - set +e - python .agents/skills/adk-pr-analyze/scripts/triage_pr.py "$PR_NUM" --skip-update > pr_info.txt 2>&1 - exit_code=$? - set -e - - cat pr_info.txt - - if [ $exit_code -eq 2 ]; then - echo "❌ Google CLA is NOT signed. Skipping analysis." - echo "signed=false" >> $GITHUB_OUTPUT - elif [ $exit_code -eq 0 ] || [ $exit_code -eq 3 ]; then - # exit code 0: CLA signed, assigned to current user - # exit code 3: CLA signed, but assignment block (which is expected on automated action runs) - echo "✅ Google CLA is signed." - echo "signed=true" >> $GITHUB_OUTPUT - else - echo "❌ Verification script failed with unexpected exit code $exit_code." - exit $exit_code - fi - - - name: Authenticate to Google Cloud - if: steps.check-cla.outputs.signed == 'true' - id: auth - uses: 'google-github-actions/auth@v3' - with: - credentials_json: '${{ secrets.ADK_GCP_SA_KEY }}' - - - name: Install Google Antigravity SDK - if: steps.check-cla.outputs.signed == 'true' - run: pip install google-antigravity - - - name: Run Antigravity Triage & Analysis - if: steps.check-cla.outputs.signed == 'true' - env: - GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }} - GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} - run: | - python scripts/run_antigravity.py "/adk-pr-analyze $PR_NUM" > triage_report.md - cat triage_report.md - - - name: Post Triage Report as Comment - if: steps.check-cla.outputs.signed == 'true' - env: - GITHUB_TOKEN: ${{ secrets.ADK_TRIAGE_AGENT }} - run: | - gh issue comment "$PR_NUM" --repo google/adk-python --body-file triage_report.md diff --git a/.github/workflows/pr-triage.yml b/.github/workflows/pr-triage.yml index 13199667de..6557820f04 100644 --- a/.github/workflows/pr-triage.yml +++ b/.github/workflows/pr-triage.yml @@ -41,5 +41,5 @@ jobs: REPO: 'adk-python' PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number || github.event.inputs.pr_number }} INTERACTIVE: ${{ vars.PR_TRIAGE_INTERACTIVE }} - PYTHONPATH: contributing/samples/adk_team + PYTHONPATH: contributing/samples run: python -m adk_pr_triaging_agent.main diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index f18020a86b..23a032f87a 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -16,13 +16,13 @@ name: Pre-commit Checks on: push: - branches: [main, v1, v2] + branches: [main, v2] paths: - '**.py' - '.pre-commit-config.yaml' - 'pyproject.toml' pull_request: - branches: [main, v1, v2] + branches: [main, v2] paths: - '**.py' - '.pre-commit-config.yaml' diff --git a/.github/workflows/python-unit-tests.yml b/.github/workflows/python-unit-tests.yml index cff6d69923..6e204a8e67 100644 --- a/.github/workflows/python-unit-tests.yml +++ b/.github/workflows/python-unit-tests.yml @@ -1,10 +1,24 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Python Unit Tests on: push: - branches: [main, v1, v2] + branches: [ main ] pull_request: - branches: [main, v1, v2] + branches: [ main ] permissions: contents: read @@ -12,7 +26,6 @@ permissions: jobs: test: runs-on: ubuntu-latest - timeout-minutes: 10 strategy: matrix: python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] diff --git a/.github/workflows/release-update-adk-web.yaml b/.github/workflows/release-update-adk-web.yaml deleted file mode 100644 index 72d1d71d27..0000000000 --- a/.github/workflows/release-update-adk-web.yaml +++ /dev/null @@ -1,64 +0,0 @@ -name: "Release: Update ADk Web" - -on: - workflow_dispatch: - inputs: - adk_web_repo: - description: 'Source adk-web repository' - required: true - default: 'google/adk-web' # Default source repo - adk_web_tag: - description: 'Tag of the release to download (e.g. v1.0.0).' - required: false - default: '' - -jobs: - update-frontend: - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - - steps: - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Fetch and unzip frontend assets - run: | - TARGET_DIR="src/google/adk/cli/browser" - REPO="${{ github.event.inputs.adk_web_repo }}" - TAG="${{ github.event.inputs.adk_web_tag }}" - # Clean target directory - rm -rf "$TARGET_DIR"/* - mkdir -p "$TARGET_DIR" - if [ -z "$TAG" ]; then - echo "Fetching latest release metadata for $REPO..." - RELEASE_JSON=$(curl -s "https://api.github.com/repos/$REPO/releases/latest") - else - echo "Fetching release metadata for $REPO tag $TAG..." - RELEASE_JSON=$(curl -s "https://api.github.com/repos/$REPO/releases/tags/$TAG") - fi - # Extract download URL for adk-web-browser.zip - DOWNLOAD_URL=$(echo "$RELEASE_JSON" | grep -o -E '"browser_download_url": "[^"]+"' | grep -o -E 'https://[^"]+' | grep 'adk-web-browser.zip' | head -n 1) - if [ -z "$DOWNLOAD_URL" ]; then - echo "Error: Could not find adk-web-browser.zip asset in the release." - exit 1 - fi - echo "Downloading assets from: $DOWNLOAD_URL" - curl -L -o frontend.zip "$DOWNLOAD_URL" - echo "Extracting assets to $TARGET_DIR..." - unzip -o frontend.zip -d "$TARGET_DIR" - rm frontend.zip - echo "Assets extracted successfully." - - - name: Create Pull Request - uses: peter-evans/create-pull-request@v6 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: "Update compiled adk web files from ${{ github.event.inputs.adk_web_repo }}@${{ github.event.inputs.adk_web_tag || 'latest' }}" - branch: update-frontend-assets - delete-branch: true - title: "chore: update compiled adk web assets" - body: | - This PR automatically updates the compiled adk web files in `src/google/adk/cli/browser/` using the assets from `${{ github.event.inputs.adk_web_repo }}@${{ github.event.inputs.adk_web_tag || 'latest' }}`. - Please review the diff before merging. diff --git a/.github/workflows/release-v1-cut.yml b/.github/workflows/release-v1-cut.yml deleted file mode 100644 index 7a35b6a120..0000000000 --- a/.github/workflows/release-v1-cut.yml +++ /dev/null @@ -1,46 +0,0 @@ -# Step 1 (v1): Starts the v1 release process by creating a release/v1-candidate branch. -# Generates a changelog PR for review (step 2). -name: "Release v1: Cut" - -on: - workflow_dispatch: - inputs: - commit_sha: - description: 'Commit SHA to cut from (leave empty for latest v1)' - required: false - type: string - -permissions: - contents: write - actions: write - -jobs: - cut-release: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - with: - ref: ${{ inputs.commit_sha || 'v1' }} - - - name: Check for existing release/v1-candidate branch - env: - GH_TOKEN: ${{ github.token }} - run: | - if git ls-remote --exit-code --heads origin release/v1-candidate &>/dev/null; then - echo "Error: release/v1-candidate branch already exists" - echo "Please finalize or delete the existing release candidate before starting a new one" - exit 1 - fi - - - name: Create and push release/v1-candidate branch - run: | - git checkout -b release/v1-candidate - git push origin release/v1-candidate - echo "Created branch: release/v1-candidate" - - - name: Trigger Release Please - env: - GH_TOKEN: ${{ github.token }} - run: | - gh workflow run release-v1-please.yml --repo ${{ github.repository }} --ref release/v1-candidate - echo "Triggered Release Please workflow for v1" diff --git a/.github/workflows/release-v1-cherry-pick.yml b/.github/workflows/release-v2-cherry-pick.yml similarity index 75% rename from .github/workflows/release-v1-cherry-pick.yml rename to .github/workflows/release-v2-cherry-pick.yml index 91e858590b..f5641a55b3 100644 --- a/.github/workflows/release-v1-cherry-pick.yml +++ b/.github/workflows/release-v2-cherry-pick.yml @@ -1,7 +1,7 @@ -# Step 3 (v1, optional): Cherry-picks a commit from v1 to the release/v1-candidate branch. +# Step 3 (v2, optional): Cherry-picks a commit from v2 to the release/v2-candidate branch. # Use between step 1 and step 4 to include bug fixes in an in-progress release. # Note: Does NOT auto-trigger release-please to preserve manual changelog edits. -name: "Release v1: Cherry-pick" +name: "Release v2: Cherry-pick" on: workflow_dispatch: @@ -20,7 +20,7 @@ jobs: steps: - uses: actions/checkout@v6 with: - ref: release/v1-candidate + ref: release/v2-candidate fetch-depth: 0 - name: Configure git @@ -30,14 +30,14 @@ jobs: - name: Cherry-pick commit run: | - echo "Cherry-picking ${INPUTS_COMMIT_SHA} to release/v1-candidate" + echo "Cherry-picking ${INPUTS_COMMIT_SHA} to release/v2-candidate" git cherry-pick ${INPUTS_COMMIT_SHA} env: INPUTS_COMMIT_SHA: ${{ inputs.commit_sha }} - name: Push changes run: | - git push origin release/v1-candidate - echo "Successfully cherry-picked commit to release/v1-candidate" + git push origin release/v2-candidate + echo "Successfully cherry-picked commit to release/v2-candidate" echo "Note: Release Please is NOT auto-triggered to preserve manual changelog edits." - echo "Run release-v1-please.yml manually if you want to regenerate the changelog." + echo "Run release-v2-please.yml manually if you want to regenerate the changelog." diff --git a/.github/workflows/release-v2-cut.yml b/.github/workflows/release-v2-cut.yml new file mode 100644 index 0000000000..52af5bf038 --- /dev/null +++ b/.github/workflows/release-v2-cut.yml @@ -0,0 +1,46 @@ +# Step 1 (v2): Starts the v2 release process by creating a release/v2-candidate branch. +# Generates a changelog PR for review (step 2). +name: "Release v2: Cut" + +on: + workflow_dispatch: + inputs: + commit_sha: + description: 'Commit SHA to cut from (leave empty for latest v2)' + required: false + type: string + +permissions: + contents: write + actions: write + +jobs: + cut-release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + with: + ref: ${{ inputs.commit_sha || 'v2' }} + + - name: Check for existing release/v2-candidate branch + env: + GH_TOKEN: ${{ github.token }} + run: | + if git ls-remote --exit-code --heads origin release/v2-candidate &>/dev/null; then + echo "Error: release/v2-candidate branch already exists" + echo "Please finalize or delete the existing release candidate before starting a new one" + exit 1 + fi + + - name: Create and push release/v2-candidate branch + run: | + git checkout -b release/v2-candidate + git push origin release/v2-candidate + echo "Created branch: release/v2-candidate" + + - name: Trigger Release Please + env: + GH_TOKEN: ${{ github.token }} + run: | + gh workflow run release-v2-please.yml --repo ${{ github.repository }} --ref release/v2-candidate + echo "Triggered Release Please workflow for v2" diff --git a/.github/workflows/release-v1-finalize.yml b/.github/workflows/release-v2-finalize.yml similarity index 74% rename from .github/workflows/release-v1-finalize.yml rename to .github/workflows/release-v2-finalize.yml index df6e3477e7..c8b1020948 100644 --- a/.github/workflows/release-v1-finalize.yml +++ b/.github/workflows/release-v2-finalize.yml @@ -1,12 +1,12 @@ -# Step 4 (v1): Triggers when the changelog PR is merged to release/v1-candidate. -# Records last-release-sha and renames release/v1-candidate to release/v{version}. -name: "Release v1: Finalize" +# Step 4 (v2): Triggers when the changelog PR is merged to release/v2-candidate. +# Records last-release-sha and renames release/v2-candidate to release/v{version}. +name: "Release v2: Finalize" on: pull_request: types: [closed] branches: - - release/v1-candidate + - release/v2-candidate permissions: contents: write @@ -32,7 +32,7 @@ jobs: - uses: actions/checkout@v6 if: steps.check.outputs.is_release_pr == 'true' with: - ref: release/v1-candidate + ref: release/v2-candidate token: ${{ secrets.RELEASE_PAT }} fetch-depth: 0 @@ -40,7 +40,7 @@ jobs: if: steps.check.outputs.is_release_pr == 'true' id: version run: | - VERSION=$(jq -r '.["."]' .github/.release-please-manifest-v1.json) + VERSION=$(jq -r '.["."]' .github/.release-please-manifest-v2.json) echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Extracted version: $VERSION" @@ -56,21 +56,21 @@ jobs: - name: Record last-release-sha for release-please if: steps.check.outputs.is_release_pr == 'true' run: | - git fetch origin v1 - CUT_SHA=$(git merge-base origin/v1 HEAD) - echo "Release was cut from v1 at: $CUT_SHA" + git fetch origin v2 + CUT_SHA=$(git merge-base origin/v2 HEAD) + echo "Release was cut from v2 at: $CUT_SHA" jq --arg sha "$CUT_SHA" '. + {"last-release-sha": $sha}' \ - .github/release-please-config-v1.json > tmp.json && mv tmp.json .github/release-please-config-v1.json - git add .github/release-please-config-v1.json - git commit -m "chore: update last-release-sha for next v1 release" - git push origin release/v1-candidate + .github/release-please-config-v2.json > tmp.json && mv tmp.json .github/release-please-config-v2.json + git add .github/release-please-config-v2.json + git commit -m "chore: update last-release-sha for next v2 release" + git push origin release/v2-candidate - - name: Rename release/v1-candidate to release/v{version} + - name: Rename release/v2-candidate to release/v{version} if: steps.check.outputs.is_release_pr == 'true' run: | VERSION="v${STEPS_VERSION_OUTPUTS_VERSION}" - git push origin "release/v1-candidate:refs/heads/release/$VERSION" ":release/v1-candidate" - echo "Renamed release/v1-candidate to release/$VERSION" + git push origin "release/v2-candidate:refs/heads/release/$VERSION" ":release/v2-candidate" + echo "Renamed release/v2-candidate to release/$VERSION" env: STEPS_VERSION_OUTPUTS_VERSION: ${{ steps.version.outputs.version }} diff --git a/.github/workflows/release-v1-please.yml b/.github/workflows/release-v2-please.yml similarity index 60% rename from .github/workflows/release-v1-please.yml rename to .github/workflows/release-v2-please.yml index 9f1344dd31..d659ca1c4e 100644 --- a/.github/workflows/release-v1-please.yml +++ b/.github/workflows/release-v2-please.yml @@ -1,10 +1,10 @@ -# Runs release-please to create/update a PR with version bump and changelog for v1. -# Triggered only by workflow_dispatch (from release-v1-cut.yml). +# Runs release-please to create/update a PR with version bump and changelog for v2. +# Triggered only by workflow_dispatch (from release-v2-cut.yml). # Does NOT auto-run on push to preserve manual changelog edits after cherry-picks. -name: "Release v1: Please" +name: "Release v2: Please" on: - # Only run via workflow_dispatch (triggered by release-v1-cut.yml) + # Only run via workflow_dispatch (triggered by release-v2-cut.yml) workflow_dispatch: permissions: @@ -15,27 +15,27 @@ jobs: release-please: runs-on: ubuntu-latest steps: - - name: Check if release/v1-candidate still exists + - name: Check if release/v2-candidate still exists id: check env: GH_TOKEN: ${{ github.token }} run: | - if gh api repos/${{ github.repository }}/branches/release/v1-candidate --silent 2>/dev/null; then + if gh api repos/${{ github.repository }}/branches/release/v2-candidate --silent 2>/dev/null; then echo "exists=true" >> $GITHUB_OUTPUT else - echo "release/v1-candidate branch no longer exists, skipping" + echo "release/v2-candidate branch no longer exists, skipping" echo "exists=false" >> $GITHUB_OUTPUT fi - uses: actions/checkout@v6 if: steps.check.outputs.exists == 'true' with: - ref: release/v1-candidate + ref: release/v2-candidate - uses: googleapis/release-please-action@v4 if: steps.check.outputs.exists == 'true' with: token: ${{ secrets.RELEASE_PAT }} - config-file: .github/release-please-config-v1.json - manifest-file: .github/.release-please-manifest-v1.json - target-branch: release/v1-candidate + config-file: .github/release-please-config-v2.json + manifest-file: .github/.release-please-manifest-v2.json + target-branch: release/v2-candidate diff --git a/.github/workflows/release-v1-publish.yml b/.github/workflows/release-v2-publish.yml similarity index 81% rename from .github/workflows/release-v1-publish.yml rename to .github/workflows/release-v2-publish.yml index a4f3b1419f..41edc78d9e 100644 --- a/.github/workflows/release-v1-publish.yml +++ b/.github/workflows/release-v2-publish.yml @@ -1,8 +1,8 @@ -# Step 6 (v1): Builds and publishes the v1 package to PyPI from a release/v{version} branch. -# Reads version from .release-please-manifest-v1.json, converts to PEP 440, +# Step 6 (v2): Builds and publishes the v2 package to PyPI from a release/v{version} branch. +# Reads version from .release-please-manifest-v2.json, converts to PEP 440, # updates version.py, then builds and publishes. -# Creates a merge-back PR (step 7) to sync release changes to v1. -name: "Release v1: Publish to PyPi" +# Creates a merge-back PR (step 7) to sync release changes to v2. +name: "Release v2: Publish to PyPi" on: workflow_dispatch: @@ -18,7 +18,7 @@ jobs: - name: Validate branch run: | if [[ ! "${GITHUB_REF_NAME}" =~ ^release/v[0-9]+\.[0-9]+\.[0-9]+ ]]; then - echo "Error: Must run from a release/v* branch (e.g., release/v1.34.1)" + echo "Error: Must run from a release/v* branch (e.g., release/v2.0.0-alpha.2)" exit 1 fi @@ -27,15 +27,15 @@ jobs: - name: Extract version from manifest and convert to PEP 440 id: version run: | - VERSION=$(jq -r '.["."]' .github/.release-please-manifest-v1.json) + VERSION=$(jq -r '.["."]' .github/.release-please-manifest-v2.json) echo "semver=$VERSION" >> $GITHUB_OUTPUT echo "Semver version: $VERSION" # Convert semver pre-release to PEP 440: - # 1.35.0-alpha.1 -> 1.35.0a1 - # 1.35.0-beta.1 -> 1.35.0b1 - # 1.35.0-rc.1 -> 1.35.0rc1 - # 1.35.0 -> 1.35.0 (no change for stable) + # 2.0.0-alpha.1 -> 2.0.0a1 + # 2.0.0-beta.1 -> 2.0.0b1 + # 2.0.0-rc.1 -> 2.0.0rc1 + # 2.0.0 -> 2.0.0 (no change for stable) PEP440=$(echo "$VERSION" | sed -E 's/-alpha\./a/; s/-beta\./b/; s/-rc\./rc/') echo "pep440=$PEP440" >> $GITHUB_OUTPUT echo "PEP 440 version: $PEP440" @@ -73,7 +73,7 @@ jobs: PEP440_VERSION: ${{ steps.version.outputs.pep440 }} run: | gh pr create \ - --base v1 \ + --base v2 \ --head "${GITHUB_REF_NAME}" \ - --title "chore: merge release v${PEP440_VERSION} to v1" \ - --body "Syncs version bump and CHANGELOG from release v${SEMVER_VERSION} to v1." + --title "chore: merge release v${PEP440_VERSION} to v2" \ + --body "Syncs version bump and CHANGELOG from release v${SEMVER_VERSION} to v2." diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml index 5653dd9eee..d3b7533228 100644 --- a/.github/workflows/stale-bot.yml +++ b/.github/workflows/stale-bot.yml @@ -1,3 +1,17 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: ADK Stale Issue Auditor on: @@ -29,7 +43,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install requests google-adk python-dateutil + pip install requests google-adk - name: Run Auditor Agent Script env: @@ -38,7 +52,7 @@ jobs: OWNER: ${{ github.repository_owner }} REPO: adk-python CONCURRENCY_LIMIT: 3 - LLM_MODEL_NAME: "gemini-3.5-flash" - PYTHONPATH: contributing/samples/adk_team + LLM_MODEL_NAME: "gemini-2.5-flash" + PYTHONPATH: contributing/samples run: python -m adk_stale_agent.main diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index 396d1647bd..7ff668c589 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -50,5 +50,5 @@ jobs: ISSUE_TITLE: ${{ github.event.issue.title }} ISSUE_BODY: ${{ github.event.issue.body }} ISSUE_COUNT_TO_PROCESS: '3' # Process 3 issues at a time on schedule - PYTHONPATH: contributing/samples/adk_team + PYTHONPATH: contributing/samples run: python -m adk_triaging_agent.main diff --git a/.github/workflows/upload-adk-docs-to-vertex-ai-search.yml b/.github/workflows/upload-adk-docs-to-vertex-ai-search.yml index b3b069341b..465fed4c21 100644 --- a/.github/workflows/upload-adk-docs-to-vertex-ai-search.yml +++ b/.github/workflows/upload-adk-docs-to-vertex-ai-search.yml @@ -51,5 +51,5 @@ jobs: GCS_BUCKET_NAME: ${{ secrets.GCS_BUCKET_NAME }} ADK_DOCS_ROOT_PATH: /tmp/adk-docs ADK_PYTHON_ROOT_PATH: /tmp/adk-python - PYTHONPATH: ${{ github.workspace }}/contributing/samples/adk_team + PYTHONPATH: contributing/samples run: python -m adk_answering_agent.upload_docs_to_vertex_ai_search diff --git a/.github/workflows/v2-sync.yml b/.github/workflows/v2-sync.yml new file mode 100644 index 0000000000..c627f40d46 --- /dev/null +++ b/.github/workflows/v2-sync.yml @@ -0,0 +1,59 @@ +# Automatically creates a PR to merge main (v1) into v2 to keep v2 up to date. +# The oncall is responsible for reviewing and merging the sync PR. +name: "Sync: main -> v2" + +on: + schedule: + - cron: '0 6 * * *' # Daily at 6am UTC + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + sync: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + with: + ref: v2 + fetch-depth: 0 + token: ${{ secrets.RELEASE_PAT }} + + - name: Check for new commits on main + id: check + run: | + git fetch origin main + BEHIND=$(git rev-list --count HEAD..origin/main) + echo "behind=$BEHIND" >> $GITHUB_OUTPUT + if [ "$BEHIND" -eq 0 ]; then + echo "v2 is up to date with main, nothing to sync" + else + echo "v2 is $BEHIND commit(s) behind main" + fi + + - name: Check for existing sync PR + if: steps.check.outputs.behind != '0' + id: existing + env: + GH_TOKEN: ${{ github.token }} + run: | + PR=$(gh pr list --base v2 --head main --state open --json number --jq '.[0].number // empty') + if [ -n "$PR" ]; then + echo "Sync PR #$PR already exists, skipping" + echo "exists=true" >> $GITHUB_OUTPUT + else + echo "exists=false" >> $GITHUB_OUTPUT + fi + + - name: Create sync PR + if: steps.check.outputs.behind != '0' && steps.existing.outputs.exists == 'false' + env: + GH_TOKEN: ${{ secrets.RELEASE_PAT }} + run: | + gh pr create \ + --base v2 \ + --head main \ + --title "chore: sync main -> v2" \ + --body "Automated sync of v1 changes from main into v2. The oncall is responsible for reviewing and merging this PR. Resolve conflicts in favor of the v2 implementation." diff --git a/.gitignore b/.gitignore index c3ddc7ea99..47f633c5c5 100644 --- a/.gitignore +++ b/.gitignore @@ -103,8 +103,6 @@ Thumbs.db # Developers should symlink or copy AGENTS.md and add their own overrides locally .adk/ .claude/ -.jetski* -.antigravity* CLAUDE.md .cursor/ .cursorrules @@ -118,6 +116,3 @@ CLAUDE.md .rooignore .bolt/ .v0/ - -# Conformance test outputs (timestamped folders from --test mode) -**/conformance/20*-*-*_*-*-*/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 39066dfd64..60bb4d50d9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,3 @@ -exclude: ^(src/google/adk/cli/browser/|src/google/adk/v1/|v1_tests/) repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.6.0 @@ -29,13 +28,6 @@ repos: else echo "Warning: addlicense not installed, skipping"; fi' -- language: system files: \.(py|sh)$ - - id: check-new-py-prefix - name: Check new Python files have _ prefix - description: Enforces private-by-default policy for new Python files (see .agents/skills/adk-style/references/visibility.md). - entry: scripts/check_new_py_files.sh - language: script - files: ^src/google/adk/.*\.py$ - pass_filenames: false - repo: https://github.com/executablebooks/mdformat rev: 0.7.22 hooks: diff --git a/AGENTS.md b/AGENTS.md index e2c4092da5..2e63c52c5a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,54 +1,588 @@ # AI Coding Assistant Context -This document provides context for AI coding assistants (Antigravity, Gemini CLI, etc.) to understand the ADK Python project and assist with development. - -## ADK Knowledge, Architecture, and Style - -For all matters regarding ADK development, please use the appropriate skill: - -- **`adk-architecture`**: Use this skill whenever you need to understand the architecture, event flow, or state management of the ADK system, or when designing or modifying core components and public APIs. - - Read `.agents/skills/adk-architecture/SKILL.md` for full instructions. -- **`adk-style`**: Use this skill whenever writing code, tests, or reviewing PRs for the ADK project to ensure compliance with styling and coding conventions. Also use it for committing, bug fixing, and testing rules. - - Read `.agents/skills/adk-style/SKILL.md` for full instructions. -- **`adk-git`**: Use this skill for any git operation (commit, push, pull, rebase, etc.). It provides guidelines for Conventional Commits and branch naming. - - Read `.agents/skills/adk-git/SKILL.md` for full instructions. -- **`adk-sample-creator`**: Use this skill when creating new samples demonstrating features or agent patterns, or when adding examples to subdirectories under `contributing/`. - - Read `.agents/skills/adk-sample-creator/SKILL.md` for full instructions. -- **`adk-review`**: Use this skill to review local changes for errors, style compliance, unintended outcomes, and to check if associated design docs, guides, samples, or tests need updates. - - Read `.agents/skills/adk-review/SKILL.md` for full instructions. -- **`adk-issue`**: Use this skill when analyzing, triaging, and resolving GitHub issues for the adk-python repository (orchestrating both triage and fix implementation). Do NOT use this skill if the "/adk-issue-analyze" command is explicitly requested. - - Read `.agents/skills/adk-issue/SKILL.md` for full instructions. -- **`adk-issue-analyze`**: Use this skill to fetch, inspect, and analyze a GitHub issue in a strictly read-only manner. Use this skill when the "/adk-issue-analyze" command is explicitly called. - - Read `.agents/skills/adk-issue-analyze/SKILL.md` for full instructions. -- **`adk-issue-fix`**: Use this skill to implement the code changes, unit tests, and documentation updates for an approved GitHub issue fix. Use this skill when the "/adk-issue-fix" command is explicitly called. - - Read `.agents/skills/adk-issue-fix/SKILL.md` for full instructions. -- **`adk-pr-analyze`**: Use this skill to fetch, inspect, and analyze a GitHub pull request in a strictly read-only manner. Use this skill when the "/adk-pr-analyze" command is explicitly called. - - Read `.agents/skills/adk-pr-analyze/SKILL.md` for full instructions. -- **`adk-pr-triage`**: Use this skill to orchestrate triaging and reviewing GitHub pull requests (PRs) (orchestrating both analysis and user review/checkout). Do NOT use this skill if the "/adk-pr-analyze" command is explicitly requested. - - Read `.agents/skills/adk-pr-triage/SKILL.md` for full instructions. - +This document provides context for AI coding assistants (Claude Code, Gemini +CLI, GitHub Copilot, Cursor, etc.) to understand the ADK Python project and +assist with development. ## Project Overview -The Agent Development Kit (ADK) is an open-source, code-first Python toolkit for building, evaluating, and deploying sophisticated AI agents. +The Agent Development Kit (ADK) is an open-source, code-first Python toolkit for +building, evaluating, and deploying sophisticated AI agents with flexibility and +control. While optimized for Gemini and the Google ecosystem, ADK is +model-agnostic, deployment-agnostic, and is built for compatibility with other +frameworks. ADK was designed to make agent development feel more like software +development, to make it easier for developers to create, deploy, and orchestrate +agentic architectures that range from simple tasks to complex workflows. ### Key Components -- **Agent**: Blueprint defining identity, instructions, and tools. -- **Runner**: Stateless execution engine that orchestrates agent execution. -- **Tool**: Functions/capabilities agents can call. -- **Session**: Conversation state management. -- **Memory**: Long-term recall across sessions. -- **Workflow** (ADK 2.0): Graph-based orchestration of complex, multi-step agent interactions. -- **BaseNode** (ADK 2.0): Contract for all nodes, supporting output streaming and human-in-the-loop steps. -- **Context** (ADK 2.0): Holds execution state and telemetry context mapped 1:1 to nodes. +- **Agent** - Blueprint defining identity, instructions, and tools + (`LlmAgent`, `LoopAgent`, `ParallelAgent`, `SequentialAgent`, etc.) +- **Runner** - Execution engine that orchestrates agent execution. It manages + the 'Reason-Act' loop, processes messages within a session, generates + events, calls LLMs, executes tools, and handles multi-agent coordination. It + interacts with various services like session management, artifact storage, + and memory, and integrates with application-wide plugins. The runner + provides different execution modes: `run_async` for asynchronous execution + in production, `run_live` for bidirectional streaming interaction, and + `run` for synchronous execution suitable for local testing and debugging. At + the end of each invocation, it can perform event compaction to manage + session history size. +- **Tool** - Functions/capabilities agents can call (Python functions, OpenAPI + specs, MCP tools, Google API tools) +- **Session** - Conversation state management (in-memory, Vertex AI, + Spanner-backed) +- **Memory** - Long-term recall across sessions + +### How the Runner Works + +The Runner is the stateless orchestration engine that manages agent execution. +It does not hold conversation history in memory; instead, it relies on services +like `SessionService`, `ArtifactService`, and `MemoryService` for persistence. + +**Invocation Lifecycle:** + +Each call to `runner.run_async()` or `runner.run()` processes a single user +turn, known as an **invocation**. -For details on how the Runner works and the invocation lifecycle, please refer to the `adk-architecture` skill and the referenced documentation therein. +1. **Session Retrieval:** When `run_async()` is called with a `session_id`, the + runner fetches the session state, including all conversation events, from + the `SessionService`. +2. **Context Creation:** It creates an `InvocationContext` containing the + session, the new user message, and references to persistence services. +3. **Agent Execution:** The runner calls `agent.run_async()` with this context. + The agent then enters its reason-act loop, which may involve: + * Calling an LLM for reasoning. + * Executing tools (function calling). + * Generating text or audio responses. + * Transferring control to sub-agents. +4. **Event Streaming & Persistence:** Each step in the agent's execution (LLM + call, tool call, tool response, model response) generates `Event` objects. + The runner streams these events back to the caller and simultaneously + appends them to the session via `SessionService`. +5. **Invocation Completion:** Once the agent has produced its final response + for the turn (e.g., a text response to the user), the agent's execution loop + finishes. +6. **Event Compaction:** If event compaction is configured, the runner may + summarize older events in the session to manage context window limits, + appending a `CompactedEvent` to the session. +7. **Next Turn:** When the user sends another message, a new `run_async()` + invocation begins, repeating the cycle by loading the session, which now + includes the events from all prior turns. ## Project Architecture -For detailed architecture patterns, component descriptions, and core interfaces, please refer to the **`adk-architecture`** skill at `.agents/skills/adk-architecture/SKILL.md`. +Please refer to +[ADK Project Overview and Architecture](https://github.com/google/adk-python/blob/main/contributing/adk_project_overview_and_architecture.md) +for details. + +### Source Structure + +``` +src/google/adk/ +├── agents/ # Agent implementations (LlmAgent, LoopAgent, ParallelAgent, etc.) +├── runners.py # Core Runner orchestration class +├── tools/ # Tool ecosystem (50+ files) +│ ├── google_api_tool/ +│ ├── bigtable/, bigquery/, spanner/ +│ ├── openapi_tool/ +│ └── mcp_tool/ # Model Context Protocol +├── models/ # LLM integrations (Gemini, Anthropic, LiteLLM) +├── sessions/ # Session management (in-memory, Vertex AI, Spanner) +├── memory/ # Long-term memory services +├── evaluation/ # Evaluation framework (47 files) +├── cli/ # CLI tools and web UI +├── flows/ # Execution flow orchestration +├── a2a/ # Agent-to-Agent protocol +├── telemetry/ # Observability and tracing +└── utils/ # Utility functions +``` + +### Test Structure + +``` +tests/ +├── unittests/ # 2600+ unit tests across 236+ files +│ ├── agents/ +│ ├── tools/ +│ ├── models/ +│ ├── evaluation/ +│ ├── a2a/ +│ └── ... +└── integration/ # Integration tests +``` + +### ADK Live (Bidi-streaming) + +- ADK live feature can be accessed from runner.run_live(...) and corresponding + FAST api endpoint. +- ADK live feature is built on top of + [Gemini Live API](https://cloud.google.com/vertex-ai/generative-ai/docs/live-api). + We integrate Gemini Live API through + [GenAI SDK](https://github.com/googleapis/python-genai). +- ADK live related configs are in + [run_config.py](https://github.com/google/adk-python/blob/main/src/google/adk/agents/run_config.py). +- ADK live under multi-agent scenario: we convert the audio into text. This + text will be passed to next agent as context. +- Most logics are in + [base_llm_flow.py](https://github.com/google/adk-python/blob/main/src/google/adk/flows/llm_flows/base_llm_flow.py) + and + [gemini_llm_connection.py](https://github.com/google/adk-python/blob/main/src/google/adk/models/gemini_llm_connection.py). +- Input transcription and output transcription should be added to session as + Event. +- User audio or model audio should be saved into artifacts with a reference in + Event to it. +- Tests are in + [tests/unittests/streaming](https://github.com/google/adk-python/tree/main/tests/unittests/streaming). + +### Agent Structure Convention (Required) + +**All agent directories must follow this structure:** `my_agent/ ├── +__init__.py # MUST contain: from . import agent └── agent.py # MUST define: +root_agent = Agent(...) OR app = App(...)` + +**Choose one pattern based on your needs:** + +**Option 1 - Simple Agent (for basic agents without plugins):** ```python from +google.adk.agents import Agent from google.adk.tools import google_search + +root_agent = Agent( name="search_assistant", model="gemini-2.5-flash", +instruction="You are a helpful assistant.", description="An assistant that can +search the web.", tools=[google_search] ) ``` + +**Option 2 - App Pattern (when you need plugins, event compaction, custom +configuration):** ```python from google.adk import Agent from google.adk.apps +import App from google.adk.plugins import ContextFilterPlugin + +root_agent = Agent( name="my_agent", model="gemini-2.5-flash", instruction="You +are a helpful assistant.", tools=[...], ) + +app = App( name="my_app", root_agent=root_agent, plugins=[ +ContextFilterPlugin(num_invocations_to_keep=3), ], ) ``` + +**Rationale:** This structure allows the ADK CLI (`adk web`, `adk run`, etc.) to +automatically discover and load agents without additional configuration. ## Development Setup -The project uses `uv` for package management and Python 3.11+. Please refer to the **`adk-setup`** skill at `.agents/skills/adk-setup/SKILL.md` for detailed instructions. +### Requirements + +**Minimum requirements:** + +- Python 3.10+ (**Python 3.11+ strongly recommended** for best performance) +- `uv` package manager (**required** - faster than pip/venv) + +**Install uv if not already installed:** `bash curl -LsSf +https://astral.sh/uv/install.sh | sh` + +### Setup Instructions + +**Standard setup for development:** ```bash + +# Create virtual environment with Python 3.11 + +uv venv --python "python3.11" ".venv" source .venv/bin/activate + +# Install all dependencies for development + +uv sync --all-extras ``` + +**Minimal setup for testing only (matches CI):** `bash uv sync --extra test` + +**Virtual Environment Usage (Required):** - **Always use** `.venv/bin/python` or +`.venv/bin/pytest` directly - **Or activate** with `source .venv/bin/activate` +before running commands - **Never use** `python -m venv` - always create with +`uv venv` if missing + +**Rationale:** `uv` is significantly faster and ensures consistent dependency +resolution across the team. + +### Building + +```bash +# Build wheel +uv build + +# Install local build for testing +pip install dist/google_adk--py3-none-any.whl +``` + +### Running Agents Locally + +**For interactive development and debugging:** ```bash + +# Launch web UI (recommended for development) + +adk web path/to/agents_dir ``` + +**For CLI-based testing:** ```bash + +# Interactive CLI (prompts for user input) + +adk run path/to/my_agent ``` + +**For API/production mode:** ```bash + +# Start FastAPI server + +adk api_server path/to/agents_dir ``` + +**For running evaluations:** ```bash + +# Run evaluation set against agent + +adk eval path/to/my_agent path/to/eval_set.json ``` + +## ADK: Style Guides + +### Python Style Guide + +The project follows the Google Python Style Guide. Key conventions are enforced +using `pylint` with the provided `pylintrc` configuration file. Here are some of +the key style points: + +* **Indentation**: 2 spaces. +* **Line Length**: Maximum 80 characters. +* **Naming Conventions**: + * `function_and_variable_names`: `snake_case` + * `ClassNames`: `CamelCase` + * `CONSTANTS`: `UPPERCASE_SNAKE_CASE` +* **Docstrings**: Required for all public modules, functions, classes, and + methods. +* **Imports**: Organized and sorted. +* **Error Handling**: Specific exceptions should be caught, not general ones + like `Exception`. + +### Autoformat (Required Before Committing) + +**Always run** before committing code: `pre-commit run --all-files` + +**Check formatting** without making changes: `bash pyink --check --diff --config +pyproject.toml src/ isort --check src/` + +**Formatting Standards (Enforced by CI):** - **Formatter:** `pyink` +(Google-style Python formatter) - **Line length:** 80 characters maximum - +**Indentation:** 2 spaces (never tabs) - **Import sorter:** `isort` with Google +profile - **Linter:** `pylint` with Google Python Style Guide + +**Rationale:** Consistent formatting eliminates style debates and makes code +reviews focus on logic rather than style. + +### In ADK source + +Below styles applies to the ADK source code (under `src/` folder of the GitHub +repo). + +#### Use relative imports (Required) + +```python +# DO - Use relative imports +from ..agents.llm_agent import LlmAgent + +# DON'T - No absolute imports +from google.adk.agents.llm_agent import LlmAgent +``` + +**Rationale:** Relative imports make the code more maintainable and avoid +circular import issues in large codebases. + +#### Import from module, not from `__init__.py` (Required) + +```python +# DO - Import directly from module +from ..agents.llm_agent import LlmAgent + +# DON'T - Import from __init__.py +from ..agents import LlmAgent +``` + +**Rationale:** Direct module imports make dependencies explicit and improve IDE +navigation and refactoring. + +#### Always do `from __future__ import annotations` (Required) + +**Rule:** Every source file must include `from __future__ import annotations` +immediately after the license header, before any other imports. + +```python +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations # REQUIRED - Always include this + +# ... rest of imports ... +``` + +**Rationale:** This enables forward-referencing classes without quotes, +improving code readability and type hint support (PEP 563). + +### In ADK tests + +#### Use absolute imports (Required) + +**Rule:** Test code must use absolute imports (`google.adk.*`) to match how +users import ADK. + +```python +# DO - Use absolute imports +from google.adk.agents.llm_agent import LlmAgent + +# DON'T - No relative imports in tests +from ..agents.llm_agent import LlmAgent +``` + +**Rationale:** Tests should exercise the same import paths that users will use, +catching issues with the public API. + +## ADK: Local Testing + +### Unit Tests + +**Quick start:** Run all tests with: `bash pytest tests/unittests` + +**Recommended:** Match CI configuration before submitting PRs: `bash uv sync +--extra test && pytest tests/unittests` + +**Additional options:** ```bash + +# Run tests in parallel for faster execution + +pytest tests/unittests -n auto + +# Run a specific test file during development + +pytest tests/unittests/agents/test_llm_agent.py + +``` + +### Testing Philosophy + +**Use real code over mocks:** ADK tests should use real implementations as much +as possible instead of mocking. Only mock external dependencies like network +calls or cloud services. + +**Test interface behavior, not implementation details:** Tests should verify +that the public API behaves correctly, not how it's implemented internally. This +makes tests resilient to refactoring and ensures the contract with users remains +intact. + +**Test Requirements:** - Fast and isolated tests where possible - Use real ADK +components; mock only external dependencies (LLM APIs, cloud services, etc.) - +Focus on testing public interfaces and behavior, not internal implementation - +Descriptive test names that explain what behavior is being tested - High +coverage for new features, edge cases, and error conditions - Location: +`tests/unittests/` following source structure + +## Docstring and comments + +### Comments - Explaining the Why, Not the What + +Philosophy: Well-written code should be largely self-documenting. Comments serve +a different purpose: they should explain the complex algorithms, non-obvious +business logic, or the rationale behind a particular implementation choice—the +things the code cannot express on its own. Avoid comments that merely restate +what the code does (e.g., # increment i above i += 1). + +Style: Comments should be written as complete sentences. Block comments must +begin with a # followed by a single space. + +## Versioning + +ADK adherence to Semantic Versioning 2.0.0 + +Core Principle: The adk-python project strictly adheres to the Semantic +Versioning 2.0.0 specification. All release versions will follow the +MAJOR.MINOR.PATCH format. + +### Breaking Change + +A breaking change is any modification that introduces backward-incompatible +changes to the public API. In the context of the ADK, this means a change that +could force a developer using the framework to alter their existing code to +upgrade to the new version. The public API is not limited to just the Python +function and class signatures; it also encompasses data schemas for stored +information (like evaluation datasets), the command-line interface (CLI), and +the data format used for server communications. + +### Public API Surface Definition + +The "public API" of ADK is a broad contract that extends beyond its Python +function signatures. A breaking change in any of the following areas can disrupt +user workflows and the wider ecosystem of agents and tools built with ADK. The +analysis of the breaking changes introduced in v1.0.0 demonstrates the expansive +nature of this contract. For the purposes of versioning, the ADK Public API +Surface is defined as: + +- All public classes, methods, and functions in the google.adk namespace. + +- The names, required parameters, and expected behavior of all built-in Tools + (e.g., google_search, BuiltInCodeExecutor). + +- The structure and schema of persisted data, including Session data, Memory, + and Evaluation datasets. + +- The JSON request/response format of the ADK API server(FastAPI server) used + by adk web, including field casing conventions. + +- The command-line interface (CLI) commands, arguments, and flags (e.g., adk + deploy). + +- The expected file structure for agent definitions that are loaded by the + framework (e.g., the agent.py convention). + +#### Checklist for Breaking Changes: + +The following changes are considered breaking and necessitate a MAJOR version +bump. + +- API Signature Change: Renaming, removing, or altering the required + parameters of any public class, method, or function (e.g., the removal of + the list_events method from BaseSessionService). + +- Architectural Shift: A fundamental change to a core component's behavior + (e.g., making all service methods async, which requires consumers to use + await). + +- Data Schema Change: A non-additive change to a persisted data schema that + renders old data unreadable or invalid (e.g., the redesign of the + MemoryService and evaluation dataset schemas). + +- Tool Interface Change: Renaming a built-in tool, changing its required + parameters, or altering its fundamental purpose (e.g., replacing + BuiltInCodeExecutionTool with BuiltInCodeExecutor and moving it from the + tools parameter to the code_executor parameter of an Agent). + +- Configuration Change: Altering the required structure of configuration files + or agent definition files that the framework loads (e.g., the simplification + of the agent.py structure for MCPToolset). + +- Wire Format Change: Modifying the data format for API server interactions + (e.g., the switch from snake_case to camelCase for all JSON payloads). + +- Dependency Removal: Removing support for a previously integrated third-party + library or tool type. + +## Commit Message Format (Required) + +**All commits must** follow +[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format. + +**Format:** ``` (): + +[optional body] + +[optional footer] ``` + +**Common types:** `feat`, `fix`, `refactor`, `docs`, `test`, `chore` + +**Examples:** ``` feat(agents): Add support for App pattern with plugins + +fix(sessions): Prevent memory leak in session cleanup + +refactor(tools): Unify environment variable enabled checks ``` + +**Rationale:** Conventional commits enable automated changelog generation and +version management. + +## Key Files and Locations + +Quick reference to important project files: + +- **Main config:** `pyproject.toml` (uses `flit_core` build backend) +- **Dependencies:** `uv.lock` (managed by `uv`) +- **Linting:** `pylintrc` (Google Python Style Guide) +- **Auto-format:** `pre-commit` (runs isort + pyink) +- **Run on all files:** `pre-commit run --all-files` +- **Install as hook:** `pre-commit install` +- **CLI entry point:** `src/google/adk/cli/cli_tools_click.py` +- **Web UI backend:** `src/google/adk/cli/adk_web_server.py` +- **Main exports:** `src/google/adk/__init__.py` (exports Agent, Runner) +- **Examples:** `contributing/samples/` (100+ agent implementations) + +## Additional Resources + +- **Documentation:** https://google.github.io/adk-docs +- **Samples:** https://github.com/google/adk-samples +- **Architecture Details:** `contributing/adk_project_overview_and_architecture.md` +- **Contributing Guide:** `CONTRIBUTING.md` +- **LLM Context:** `llms.txt` (summarized), `llms-full.txt` (comprehensive) + +## Python Tips + +### General Python Best Practices + +* **Constants:** Use immutable global constant collections (tuple, frozenset, immutabledict) to avoid hard-to-find bugs. Prefer constants over wild string/int literals, especially for dictionary keys, pathnames, and enums. +* **Naming:** Name mappings like `value_by_key` to enhance readability in lookups (e.g., `item = item_by_id[id]`). +* **Readability:** Use f-strings for concise string formatting, but use lazy-evaluated `%`-based templates for logging. Use `repr()` or `pprint.pformat()` for human-readable debug messages. Use `_` as a separator in numeric literals to improve readability. +* **Comprehensions:** Use list, set, and dict comprehensions for building collections concisely. +* **Iteration:** Iterate directly over containers without indices. Use `enumerate()` when you need the index, `dict.items()` for keys and values, and `zip()` for parallel iteration. +* **Built-ins:** Leverage built-in functions like `all()`, `any()`, `reversed()`, `sum()`, etc., to write more concise and efficient code. +* **Flattening Lists:** Use `itertools.chain.from_iterable()` to flatten a list of lists efficiently without unnecessary copying. +* **String Methods:** Use `startswith()` and `endswith()` with a tuple of strings to check for multiple prefixes or suffixes at once. +* **Decorators:** Use decorators to add common functionality (like logging, timing, caching) to functions without modifying their core logic. Use `functools.wraps()` to preserve the original function's metadata. +* **Context Managers:** Use `with` statements and context managers (from `contextlib` or custom classes with `__enter__`/`__exit__`) to ensure resources are properly initialized and torn down, even in the presence of exceptions. +* **Else Clauses:** Utilize the `else` clause in `try/except` blocks (runs if no exception), and in `for/while` loops (runs if the loop completes without a `break`) to write more expressive and less error-prone code. +* **Single Assignment:** Prefer single-assignment form (assign to a variable once) over assign-and-mutate to reduce bugs and improve readability. Use conditional expressions where appropriate. +* **Equality vs. Identity:** Use `is` or `is not` for singleton comparisons (e.g., `None`, `True`, `False`). Use `==` for value comparison. +* **Object Comparisons:** When implementing custom classes, be careful with `__eq__`. Return `NotImplemented` for unhandled types. Consider edge cases like subclasses and hashing. Prefer using `attrs` or `dataclasses` to handle this automatically. +* **Hashing:** If objects are equal, their hashes must be equal. Ensure attributes used in `__hash__` are immutable. Disable hashing with `__hash__ = None` if custom `__eq__` is implemented without a proper `__hash__`. +* **`__init__()` vs. `__new__()`:** `__new__()` creates the object, `__init__()` initializes it. For immutable types, modifications must happen in `__new__()`. +* **Default Arguments:** NEVER use mutable default arguments. Use `None` as a sentinel value instead. +* **`__add__()` vs. `__iadd__()`:** `x += y` (in-place add) can modify the object in-place if `__iadd__` is implemented (like for lists), while `x = x + y` creates a new object. This matters when multiple variables reference the same object. +* **Properties:** Use `@property` to create getters and setters only when needed, maintaining a simple attribute access syntax. Avoid properties for computationally expensive operations or those that can fail. +* **Modules for Namespacing:** Use modules as the primary mechanism for grouping and namespacing code elements, not classes. Avoid `@staticmethod` and methods that don't use `self`. +* **Argument Passing:** Python is call-by-value, where the values are object references (pointers). Assignment binds a name to an object. Modifying a mutable object through one name affects all names bound to it. +* **Keyword/Positional Arguments:** Use `*` to force keyword-only arguments and `/` to force positional-only arguments. This can prevent argument transposition errors and make APIs clearer, especially for functions with multiple arguments of the same type. +* **Type Hinting:** Annotate code with types to improve readability, debuggability, and maintainability. Use abstract types from `collections.abc` for container annotations (e.g., `Sequence`, `Mapping`, `Iterable`). Annotate return values, including `None`. Choose the most appropriate abstract type for function arguments and return types. +* **`NewType`:** Use `typing.NewType` to create distinct types from primitives (like `int` or `str`) to prevent argument transposition and improve type safety. +* **`__repr__()` vs. `__str__()`:** Implement `__repr__()` for unambiguous, developer-focused string representations, ideally evaluable. Implement `__str__()` for human-readable output. `__str__()` defaults to `__repr__()`. +* **F-string Debug:** Use `f"{expr=}"` for concise debug printing, showing both the expression and its value. + +### Libraries and Tools + +* **`collections.Counter`:** Use for efficiently counting hashable objects in an iterable. +* **`collections.defaultdict`:** Useful for avoiding key checks when initializing dictionary values, e.g., appending to lists. +* **`heapq`:** Use `heapq.nlargest()` and `heapq.nsmallest()` for efficiently finding the top/bottom N items. Use `heapq.merge()` to merge multiple sorted iterables. +* **`attrs` / `dataclasses`:** Use these libraries to easily define simple classes with boilerplate methods like `__init__`, `__repr__`, `__eq__`, etc., automatically generated. +* **NumPy:** Use NumPy for efficient array computing, element-wise operations, math functions, filtering, and aggregations on numerical data. +* **Pandas:** When constructing DataFrames row by row, append to a list of dicts and call `pd.DataFrame()` once to avoid inefficient copying. Use `TypedDict` or `dataclasses` for intermediate row data. +* **Flags:** Use libraries like `argparse` or `click` for command-line flag parsing. Access flag values in a type-safe manner. +* **Serialization:** For cross-language serialization, consider JSON (built-in), Protocol Buffers, or msgpack. For Python serialization with validation, use `pydantic` for runtime validation and automatic (de)serialization, or `cattrs` for performance-focused (de)serialization with `dataclasses` or `attrs`. +* **Regular Expressions:** Use `re.VERBOSE` to make complex regexes more readable with whitespace and comments. Choose the right method (`re.search`, `re.fullmatch`). Avoid regexes for simple string checks (`in`, `startswith`, `endswith`). Compile regexes used multiple times with `re.compile()`. +* **Caching:** Use `functools.lru_cache` with care. Prefer immutable return types. Be cautious when memoizing methods, as it can lead to memory leaks if the instance is part of the cache key; consider `functools.cached_property`. +* **Pickle:** Avoid using `pickle` due to security risks and compatibility issues. Prefer JSON, Protocol Buffers, or msgpack for serialization. +* **Multiprocessing:** Be aware of potential issues with `multiprocessing` on some platforms, especially concerning `fork`. Consider alternatives like threads (`concurrent.futures.ThreadPoolExecutor`) or `asyncio` for I/O-bound tasks. +* **Debugging:** Use `IPython.embed()` or `pdb.set_trace()` to drop into an interactive shell for debugging. Use visual debuggers if available. Log with context, including inputs and exception info using `logging.exception()` or `exc_info=True`. +* **Property-Based Testing & Fuzzing:** Use `hypothesis` for property-based testing that generates test cases automatically. For coverage-guided fuzzing, consider `atheris` or `python-afl`. + +### Testing + +* **Assertions:** Use pytest's native `assert` statements with informative expressions. Pytest automatically provides detailed failure messages showing the values involved. Add custom messages with `assert condition, "helpful message"` when the expression alone isn't clear. +* **Custom Assertions:** Write reusable helper functions (not methods) for repeated complex checks. Use `pytest.fail("message")` to explicitly fail a test with a custom message. +* **Parameterized Tests:** Use `@pytest.mark.parametrize` to reduce duplication when running the same test logic with different inputs. This is more idiomatic than the `parameterized` library. +* **Fixtures:** Use pytest fixtures (with `@pytest.fixture`) for test setup, teardown, and dependency injection. Fixtures are cleaner than class-based setup methods and can be easily shared across tests. +* **Mocking:** Use `mock.create_autospec()` with `spec_set=True` to create mocks that match the original object's interface, preventing typos and API mismatch issues. Use context managers (`with mock.patch(...)`) to manage mock lifecycles and ensure patches are stopped. Prefer injecting dependencies via fixtures over patching. +* **Asserting Mock Calls:** Use `mock.ANY` and other matchers for partial argument matching when asserting mock calls (e.g., `assert_called_once_with`). +* **Temporary Files:** Use pytest's `tmp_path` and `tmp_path_factory` fixtures for creating isolated and automatically cleaned-up temporary files/directories. These are preferred over the `tempfile` module in pytest tests. +* **Avoid Randomness:** Do not use random number generators to create inputs for unit tests. This leads to flaky, hard-to-debug tests. Instead, use deterministic, easy-to-reason-about inputs that cover specific behaviors. +* **Test Invariants:** Focus tests on the invariant behaviors of public APIs, not implementation details. +* **Test Organization:** Prefer simple test functions over class-based tests unless you need to share fixtures across multiple test methods in a class. Use descriptive test names that explain the behavior being tested. + +### Error Handling + +* **Re-raising Exceptions:** Use a bare `raise` to re-raise the current exception, preserving the original stack trace. Use `raise NewException from original_exception` to chain exceptions, providing context. Use `raise NewException from None` to suppress the original exception's context. +* **Exception Messages:** Always include a descriptive message when raising exceptions. +* **Converting Exceptions to Strings:** `str(e)` can be uninformative. `repr(e)` is often better. For full details including tracebacks and chained exceptions, use functions from the `traceback` module (e.g., `traceback.format_exception(e)`, `traceback.format_exc()`). +* **Terminating Programs:** Use `sys.exit()` for expected terminations. Uncaught non-`SystemExit` exceptions should signal bugs. Avoid functions that cause immediate, unclean exits like `os.abort()`. +* **Returning None:** Be consistent. If a function can return a value, all paths should return a value (use `return None` explicitly). Bare `return` is only for early exit in conceptually void functions (annotated with `-> None`). diff --git a/CHANGELOG-v2.md b/CHANGELOG-v2.md deleted file mode 100644 index fd8796b82b..0000000000 --- a/CHANGELOG-v2.md +++ /dev/null @@ -1,14 +0,0 @@ -# Changelog - -## [2.0.0-alpha.1](https://github.com/google/adk-python/compare/v2.0.0-alpha.0...v2.0.0-alpha.1) (2026-03-18) - -### Features - -Introduces two major capabilities: -* Workflow runtime: graph-based execution engine for composing - deterministic execution flows for agentic apps, with support for - routing, fan-out/fan-in, loops, retry, state management, dynamic - nodes, human-in-the-loop, and nested workflows -* Task API: structured agent-to-agent delegation with multi-turn - task mode, single-turn controlled output, mixed delegation - patterns, human-in-the-loop, and task agents as workflow nodes diff --git a/CHANGELOG.md b/CHANGELOG.md index 63687e1754..08799f7a13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,147 +1,5 @@ # Changelog -## [2.2.0](https://github.com/google/adk-python/compare/v2.1.0...v2.2.0) (2026-06-04) - - -### Features - -* Add `--trigger_sources` and ADK service options to `cli_deploy_agent_engine` ([ffa057c](https://github.com/google/adk-python/commit/ffa057c11212c0110992ac5525b7b8909de610ed)) -* add AutoTracingPlugin for OpenTelemetry auto-instrumentation ([bc3a4fa](https://github.com/google/adk-python/commit/bc3a4fab8096a8086bae7d39d289929b0cd98a20)) -* add RubricBasedMultiTurnTrajectoryEvaluator ([cae2337](https://github.com/google/adk-python/commit/cae23371a1cfb0b74de18e8583be9504864bf1aa)) -* **agents:** restore 1.x agent config wiring for backward compatibility ([44cd116](https://github.com/google/adk-python/commit/44cd11675e9c3dc2deb5607d20083c10031fa708)) -* **api_server:** Abort runs on client drops to avoid leaks ([6a53357](https://github.com/google/adk-python/commit/6a533573dbeee3256a192e73b78eccf237ddafff)) -* BigQuery Agent Analytics reliability fixes ([a5fa3da](https://github.com/google/adk-python/commit/a5fa3da0214e0bd027b6fea88e447c78baa1c6d8)) -* distinguish input-required vs auth-required in A2A conversion ([9d139ea](https://github.com/google/adk-python/commit/9d139ea2e8fe03d50328192225782b0d0efaf1ec)) -* emit OTel gen_ai.client.* metrics natively ([0bb329b](https://github.com/google/adk-python/commit/0bb329ba53ad356a70e73377fff4f429ffa99961)) -* forward custom_metadata from run requests into the run config ([460cb8c](https://github.com/google/adk-python/commit/460cb8c7c7dfc12d181e1998a7bcc7ef5de5ca70)) -* include thoughts and tool calls in compaction summaries ([bdb5582](https://github.com/google/adk-python/commit/bdb558262489fd3c723166d407981b14ec45a273)) -* **interactions:** update ADK to support Google GenAI SDK v2.0.0 ([da1d8f1](https://github.com/google/adk-python/commit/da1d8f15529bf6c741bb32a86c380d5cb3633ed1)) -* **models:** Support turn_complete_reason in Live responses to capture safety info ([9126acb](https://github.com/google/adk-python/commit/9126acbace9c6b323041c21aff860916f618a139)) -* preserve A2A message metadata field in ADK event ([d4d955d](https://github.com/google/adk-python/commit/d4d955d1503c8950ff2fdf17286f8c3f6bc0ad5a)) -* raise explicit error for unsupported LiteLlm file attachments ([8847f23](https://github.com/google/adk-python/commit/8847f2384ab3ed17ae080e5e99b5a3c435b3e29f)), closes [#5546](https://github.com/google/adk-python/issues/5546) -* **sessions:** add get_user_state(app_name, user_id) to BaseSessionService ([d029bce](https://github.com/google/adk-python/commit/d029bce53ecf9e8861e7fa547f2814524f38a544)) -* **skills:** Add adk-issue skill to analyze and triage GitHub issues ([be03166](https://github.com/google/adk-python/commit/be03166f533a2c1a14ba0e4268a20323d21064d6)) -* **skills:** Add adk-review skill for rigorous change quality control ([cc6f78c](https://github.com/google/adk-python/commit/cc6f78c3dca5b5e70fd5035da09392a457c7f0c6)) -* **skills:** Automate PR triage and CLA verification ([ce9011c](https://github.com/google/adk-python/commit/ce9011c10389685b76890f902a31893d5269a193)) -* **skills:** Enforce PR assignment gates and stream metadata via stdout ([4006fe4](https://github.com/google/adk-python/commit/4006fe408c583bffd95c23455f00184baa4fad6d)) -* Support additional scopes and custom discovery doc in Google API Tools ([dc6e293](https://github.com/google/adk-python/commit/dc6e293503d3d34e6d215e4fb017fa094392bebb)) -* **tools:** expose httpx_client_factory on RestApiTool and OpenAPIToolset ([7eb9b3d](https://github.com/google/adk-python/commit/7eb9b3de8aa239608370a50bcb313315dcd9ca1d)) -* **tools:** Standardize request_input tool for proactive LLM clarification ([afb0a64](https://github.com/google/adk-python/commit/afb0a64f9647c03c32132e184f40e108dc2a4482)) - - -### Bug Fixes - -* **a2a:** Support to_a2a(Workflow) and reject non-agent root nodes ([0478b02](https://github.com/google/adk-python/commit/0478b0262de8334c516e34cc4be8cbfbaa7e8cd2)) -* accept Azure assistant file ids ([b73679e](https://github.com/google/adk-python/commit/b73679e58fd4f296d8abc299be55c96829260046)), closes [#5664](https://github.com/google/adk-python/issues/5664) -* add artifacts in each agent's .adk folder ([bae5b1a](https://github.com/google/adk-python/commit/bae5b1a1a40d9b4da1dd0c8d9903825e0ef3ab36)) -* add future annotations import and prefix task models logger ([2874874](https://github.com/google/adk-python/commit/2874874af497dcbc432e624e94a592d610003688)) -* add missing crop helper to data file helper lib ([b5181cf](https://github.com/google/adk-python/commit/b5181cf1351d16e1133196c6da9396e40ed6e97c)), closes [#4011](https://github.com/google/adk-python/issues/4011) -* add PEP 604 union syntax in function tool parameters ([551445e](https://github.com/google/adk-python/commit/551445e797a7f55670aac2610c33a675c65e5a1d)) -* add telemetry metric assertions to the test's own agent ([b7766ce](https://github.com/google/adk-python/commit/b7766ceb2c7f36fd8c98c4f1248c40e61462f8c2)) -* **agents:** Improve git hygiene in adk-pr-triage skill ([62bcdd3](https://github.com/google/adk-python/commit/62bcdd343c5ea12583f98fa479c265f3b108a50e)) -* **agents:** restore abc.ABC base for BaseAgent and LlmAgent ([020386a](https://github.com/google/adk-python/commit/020386a06cd9a461abbc71d8c4e59a4d83917b42)) -* allow internal builder assistant app name ([f6e26cc](https://github.com/google/adk-python/commit/f6e26ccc4f8327e634ed2416f30d1a4c9565c800)) -* append trailing newline to runtime-config.json in ADK Web Server ([4baccf6](https://github.com/google/adk-python/commit/4baccf61795d70c26f2557ed21a30a7c2c4aa8c9)) -* **auth:** omit scope from OAuth2 token requests ([6ce4b87](https://github.com/google/adk-python/commit/6ce4b87858b1fca8d5f0609bb92f198678555c4a)) -* block path traversal in Agent Builder file tools ([1fa7cda](https://github.com/google/adk-python/commit/1fa7cda96a41d8bcadefb7cb7346d4795560d9f6)) -* **dependencies:** clarify missing Vertex AI extra ([fde6a2b](https://github.com/google/adk-python/commit/fde6a2b854b1194fa618c4ece22c3dac1e58c085)) -* **deps:** bump starlette and fastapi to address CVE-2026-48710 ([81add39](https://github.com/google/adk-python/commit/81add3987ada11c862c24143218d434a6504a57a)) -* **eval:** Support include_intermediate_responses_in_final in final_response_match_v2 ([8519602](https://github.com/google/adk-python/commit/8519602116d2217ed4347aed1e3ca546b81d8948)), closes [#5695](https://github.com/google/adk-python/issues/5695) -* Event.message honors subclass field ([5bebfd4](https://github.com/google/adk-python/commit/5bebfd4881332f6619e064b450c8fc7bbd38c9f8)) -* exclude temp: state keys from Firestore session writes ([a5db346](https://github.com/google/adk-python/commit/a5db3467c8d556f60150bbf913770df36c38fe89)) -* Fix path traversal in GCS skill extraction (Zip Slip) ([2f15c6c](https://github.com/google/adk-python/commit/2f15c6cb507c10a8ad93d1f12346e0fbcc2f94f4)) -* **flows:** preserve transparent config on live session reconnect ([5ad1942](https://github.com/google/adk-python/commit/5ad1942cb98c211d64b1cedd74f24492fa662e8f)), closes [#5675](https://github.com/google/adk-python/issues/5675) -* Format the files to fix pre-commit failures ([af8bfe0](https://github.com/google/adk-python/commit/af8bfe08acbcbba6796b0e113197536b599724e0)) -* guard peer agent mode access in agent transfer ([bb16958](https://github.com/google/adk-python/commit/bb16958bf8682ce7c7f5fc57201b41e17f365c59)), closes [#5863](https://github.com/google/adk-python/issues/5863) -* **live:** Resolve 1007 error and support Gemini 3.1 Flash Live protocol ([e5af12c](https://github.com/google/adk-python/commit/e5af12c29ccaa07abc4fec118971a9fd44b8384c)) -* **mcp:** Prevent initialization hangs and task group leaks ([334ef81](https://github.com/google/adk-python/commit/334ef81568675282956c36a54779f09ca643e2c0)), closes [#5886](https://github.com/google/adk-python/issues/5886) -* **migration:** restrict unpickling of v0 actions blobs ([9db48ce](https://github.com/google/adk-python/commit/9db48ce92e77651e888159b4e9a79904dc3c9cd3)) -* **models:** Prevent grounding metadata loss in Gemini 3.1 ([e896c62](https://github.com/google/adk-python/commit/e896c620f6d913f0da2497b077941c8c4a3fdd38)) -* parse noncanonical litellm tool call arguments ([31cc5a1](https://github.com/google/adk-python/commit/31cc5a17cc7d3fc04902e9b3de4ddaaa20ff5a28)) -* populate user_content in resumed invocations ([660bbd4](https://github.com/google/adk-python/commit/660bbd465212feb6433c2789381798d6f72f0707)) -* preserve media blocks in ollama content flattening ([47ceeba](https://github.com/google/adk-python/commit/47ceebac92b89be517cb10ea2b5018cde5def49b)), closes [#4975](https://github.com/google/adk-python/issues/4975) -* **runners:** fall back to root agent when a resumed call author is not in the tree ([a86efa6](https://github.com/google/adk-python/commit/a86efa65f5f7880435c3433a941a7d772dd5b89c)) -* **runners:** Preserve state_delta in NodeRunner path ([c56bec8](https://github.com/google/adk-python/commit/c56bec8d6d6d9823744a6032e18a640d4c71cae0)) -* **sessions:** guard None event.actions before reading state_delta ([03ef3f6](https://github.com/google/adk-python/commit/03ef3f612b4c136028d16fa9b34e1605c8ecbb4b)) -* **streaming:** Ensure final partial=False frame is always yielded ([cd81f7b](https://github.com/google/adk-python/commit/cd81f7bde91df78d6cece539a6f98dda2aa8c9c0)), closes [#3754](https://github.com/google/adk-python/issues/3754) -* Support generalized history config injection for Gemini 3.1 Live on Vertex AI ([61a3933](https://github.com/google/adk-python/commit/61a39330dfafbd365e71e0c11cc0128bbaf2fe89)) -* terminate infinite retry loop in LoadSkillResourceTool on RESOURCE_NOT_FOUND ([bc45ee6](https://github.com/google/adk-python/commit/bc45ee67cd34182e75023405320e47f1155f6881)) -* tolerate context-likes without user_content or session in record_agent_invocation ([0775da5](https://github.com/google/adk-python/commit/0775da5ae406b6db04d401b779b3ab72e9a0fc9f)) -* **tools:** add skill script dir to sys.path ([9296198](https://github.com/google/adk-python/commit/9296198b21a80b211b75f0e9263f618fbe9e8744)) -* **tools:** don't close parent's plugins from AgentTool's sub-Runner ([2a68c4e](https://github.com/google/adk-python/commit/2a68c4e7463881397be0e9036e509ce59fa5bf3c)) -* **tools:** Prevent broken skill tool references when prefix is set and support tool_filter ([4366cca](https://github.com/google/adk-python/commit/4366ccaf1224ea556da25e506aa99fc4ecd91378)) -* **tools:** Shell escape path and range in ReadFileTool command ([e16629b](https://github.com/google/adk-python/commit/e16629b38814ec31ed55dc6412dcc7ec33774749)) -* validate session_id and enforce ownership in delete_session ([b2916c7](https://github.com/google/adk-python/commit/b2916c71523f3acecbbde782fe8a799ef83b74d5)) -* **workflow:** Prevent incorrect chat agent wiring in graphs ([d7aa7b5](https://github.com/google/adk-python/commit/d7aa7b5720ed6b28104c84009680b3e5a61b5e01)), closes [#5868](https://github.com/google/adk-python/issues/5868) -* **workflow:** Resolve raw Content output crash on rehydration ([4f992b0](https://github.com/google/adk-python/commit/4f992b0c6455fb23f0e25ac78687aa2099af421e)) - - -### Performance Improvements - -* **flows:** Resolve agent tool unions in parallel ([ae95a97](https://github.com/google/adk-python/commit/ae95a972280cbf0fcd6a989e19590cad68f3d847)) - - -### Code Refactoring - -* **agents:** default model to gemini-3-flash-preview ([ad8b6c7](https://github.com/google/adk-python/commit/ad8b6c769d65c293ca58a078ae447fe499209d15)) -* **skills:** Split adk-issue skill to separate issue analysis from implementation ([51b18eb](https://github.com/google/adk-python/commit/51b18ebbbc22b6c6310b9e1ca393663805763a7e)) -* **tests:** Consolidate event tests into test_event.py ([77aeadf](https://github.com/google/adk-python/commit/77aeadf131b00133963e5c56a3d510a326cabae7)) -* **tools:** Split environment tools into single-class _tool files ([1cc298e](https://github.com/google/adk-python/commit/1cc298edb801f9a4538aa532f3fa1c4d4187dc96)) -* update tool and agent retrieval functions to support asynchronous execution ([e623b3b](https://github.com/google/adk-python/commit/e623b3b4db9109d2f53915a7c3e8140db71ca336)) - - -### Documentation - -* **agents:** Add issue closing support to PR triage skill ([2748c1b](https://github.com/google/adk-python/commit/2748c1bbbd1f56f16cd61f266a82bcd0ecf21e68)) -* **skills:** Add rule to specify GitHub issues in commit messages ([8f2c1e3](https://github.com/google/adk-python/commit/8f2c1e38cbdc1d9c7c91fa942f6287e4801c454c)) -* **skills:** Use default model in sample agent templates ([2d465aa](https://github.com/google/adk-python/commit/2d465aa2e1569b27d2a348529f3cb5860a5a9783)) - -## [2.1.0](https://github.com/google/adk-python/compare/v2.0.0...v2.1.0) (2026-05-23) - - -### Features - -* Add chart generation and artifact loading to data agent ([db06416](https://github.com/google/adk-python/commit/db064160bf634b1c7e644012076f077cde6cfcef)) -* Add support for creating sandboxes from templates and snapshots ([cbd14eb](https://github.com/google/adk-python/commit/cbd14ebf99bbff22ed28273f095f1fc05793bed2)) -* Add user.id to gen_ai.user.message log records for telemetry ([eb379be](https://github.com/google/adk-python/commit/eb379bea5b87579d5a649698c3fdd7473ac5e5a2)) -* Fix error message telemetry for tool calls ([e56c021](https://github.com/google/adk-python/commit/e56c021ef73193b24023494d853ac4fdab9115bb)) -* Preserve transcription event order in conversation trajectory ([b3d0759](https://github.com/google/adk-python/commit/b3d0759e42d0def400160e4196a874171579a101)) - - -### Bug Fixes - -* **ci:** Add python-dateutil dependency to stale-bot workflow ([84fa984](https://github.com/google/adk-python/commit/84fa984ae087c10b59355f915077d1119969c3f2)) -* **ci:** Prevent workflow failures in relocated adk_team samples ([55cbc8c](https://github.com/google/adk-python/commit/55cbc8c9e8b649c48a79c26fb112dbc005386338)) -* **ci:** Use absolute path for PYTHONPATH in upload docs workflow ([85223e6](https://github.com/google/adk-python/commit/85223e629e160cad7dd9877483e04faacc151bc2)) -* **cli:** Fix --reload_agents for web ([1307f8e](https://github.com/google/adk-python/commit/1307f8eeba4252f43dad057438ba68686e3b7e41)) -* **cli:** Inform user to install optional dependency on missing google.cloud ([57d677c](https://github.com/google/adk-python/commit/57d677c5cde6a87a24574042013c0c5382a0a2d3)) -* convert Union[Pydantic, Pydantic] tool args at runtime ([104edc8](https://github.com/google/adk-python/commit/104edc83170a5871075285b336d19ac9515c1a90)), closes [#5799](https://github.com/google/adk-python/issues/5799) -* Fix bug where grounding metadata in Gemini 3.1 live was being silently discarded ([b9751eb](https://github.com/google/adk-python/commit/b9751eb9df7868223551b4ce33f2ff360f7d3f3e)) -* fix input and output transcription finished events for Gemini v3.1 ([d17a2a3](https://github.com/google/adk-python/commit/d17a2a322156c4d4c617e8d4cbac14f24652e617)) -* lazy-import GCS evaluation managers in evals utility ([5f91a9d](https://github.com/google/adk-python/commit/5f91a9db032bb9ffd0b59ba24aad04b680481c98)) -* Make google-cloud-storage import lazy in skill utils ([416775d](https://github.com/google/adk-python/commit/416775dcceae8f57badf0cd55c44148f6426b6db)) -* resolve circular import caused by llm_request ([7e38fc8](https://github.com/google/adk-python/commit/7e38fc811ed58235aa5c120c48c419e0f10a8de2)) -* Resolve circular import in base_tool ([92cf192](https://github.com/google/adk-python/commit/92cf19255e21a6edc08a5cf09a1cfbe936b5690e)) -* **tests:** Append trailing newline to JSON test outputs ([3329ced](https://github.com/google/adk-python/commit/3329ced0b9ddb2e681a849d62416f14f837e40dd)) -* **tools:** Prevent session drop on MCP tool error ([933653c](https://github.com/google/adk-python/commit/933653c61c5498fa0febe1a984d92b82a899e446)) -* update EditFileTool to handle cross-platform line breaks and escape regex characters ([1f24553](https://github.com/google/adk-python/commit/1f245535ff1107b428f4fb0837db985457ddf024)) - - -## [2.0.0](https://github.com/google/adk-python/compare/v2.0.0b1...v2.0.0) (2026-05-19) - -### ADK 2.0 General Availability - -This release introduces v2.0.0 General Availability (GA) of the Google Agent Development Kit (ADK), establishing production-grade foundations for multi-agent workflows and advanced dynamic agent collaboration. - -### Core Architecture Highlights - -#### Multi-Agent Workflow Engine -* **Flexible Execution Graphs:** Establishes a model-agnostic engine for orchestrating non-linear, conditional, and cyclical agent execution patterns. -* **Intelligent Task Delegation:** Introduces modular workflow abstractions enabling parallel sub-agent workers, nested hierarchical team structures, and resilient dynamic scheduling across complex task execution steps. - -#### Dynamic Agent Collaboration -* **Native Inter-Agent Routing:** Provides seamless orchestration for inter-agent messaging, control state handoffs, and context variable propagation across collaborative multi-agent flows. - ## [1.34.0](https://github.com/google/adk-python/compare/v1.33.0...v1.34.0) (2026-05-18) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 577e8f39e4..892599930d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -133,7 +133,7 @@ part before or alongside your code PR. 1. **Clone the repository:** ```shell - gh repo clone google/adk-python -- -b v2 + gh repo clone google/adk-python cd adk-python ``` @@ -142,71 +142,80 @@ part before or alongside your code PR. Check out [uv installation guide](https://docs.astral.sh/uv/getting-started/installation/). -1. **Setup Development Tools:** +1. **Create and activate a virtual environment:** - We use `pre-commit` for code formatting and license enforcement, - `tox` with `tox-uv` for isolated multi-version testing, and - `addlicense` for Apache 2.0 license headers. + **NOTE**: ADK supports Python 3.10+. Python 3.11 and above is strongly + recommended. + + Create a workspace venv using uv. ```shell - uv tool install pre-commit - uv tool install tox --with tox-uv + uv venv --python "python3.11" ".venv" ``` - Optionally, install Google's `addlicense` tool for license header - checks (requires Go): + Activate the workspace venv. ```shell - go install github.com/google/addlicense@latest + source .venv/bin/activate ``` - If `addlicense` is not installed, the pre-commit hook will be - skipped and CI will catch missing headers. - - Install the git hooks to automatically format and check your code - before committing: + **Windows** ```shell - pre-commit install + source .\.venv\Scripts\activate ``` - The pre-commit hooks run `isort`, `pyink`, `addlicense`, and - `mdformat` automatically on each commit. - -1. **Create virtual environment and install dependencies:** +1. **Install dependencies:** ```shell - uv venv --python "python3.11" ".venv" - source .venv/bin/activate uv sync --all-extras ``` -1. **Run unit tests locally (Fast):** + **NOTE**: for convenience, installing all extra deps as a starting point. - If you just want to run tests quickly while developing, run `pytest`: +1. **Run unit tests:** ```shell pytest ./tests/unittests ``` -1. **Run multi-version unit tests (Required before PR):** + NOTE: for accurate repro of test failure, only include `test` as extra + dependencies. + + ```shell + uv sync --extra test + pytest ./tests/unittests + ``` - ADK guarantees compatibility across Python versions. You must run the full test suite across all supported versions using `tox`. This will execute tests in pristine, isolated environments. + **Alternatively**, use the included `unittests.sh` script which handles + environment setup and restoration automatically: ```shell - tox + ./scripts/unittests.sh ``` - _(Note: `uv` will automatically download any Python interpreters you are missing!)_ + This script will: + + - Set up the test environment with minimal dependencies (`test`, `eval`, `a2a`) + - Run the unit tests + - Restore the full development environment (`--all-extras`) 1. **Auto-format the code:** - If you installed the git hooks in Step 3, this happens automatically on commit. To run it manually across all files: + We use `pre-commit` to manage code style and formatting (including `isort` and `pyink`). + + To run it manually on all files: ```shell pre-commit run --all-files ``` + You can also install it as a git hook to run automatically on every commit: + + ```shell + pre-commit install + ``` + 1. **Build the wheel file:** ```shell @@ -246,26 +255,8 @@ part before or alongside your code PR. [Contributing folder](https://github.com/google/adk-python/tree/main/contributing) has resources that are helpful for contributors. -## AI-Assisted Development - -This repo includes built-in skills for AI coding agents -(Antigravity, Gemini CLI, and others) to help with ADK development: - -- **`setup-dev-env`** — Set up the local development environment: - install dependencies, configure pre-commit hooks, and verify - the setup. - -- **`adk-debug`** — Debug ADK agents: inspect sessions, trace event - flows, check LLM requests/responses, diagnose tool call issues. - Supports both `adk web` (browser UI) and `adk run` (CLI) workflows. - -- **`adk-workflow`** — Build graph-based workflow agents: function - nodes, LLM agent nodes, edge patterns, routing, parallel processing - (fan-out and ParallelWorker), human-in-the-loop, state management, - and best practices. Includes reference docs and tested samples. - -These skills are in `.agents/skills/` and are automatically available -when using compatible AI coding tools in this repo. +## Vibe Coding -The `AGENTS.md` file provides additional project context that can -be used as LLM input. +If you want to contribute by leveraging vibe coding, the AGENTS.md +(https://github.com/google/adk-python/tree/main/AGENTS.md) could be used as +context to your LLM. diff --git a/README.md b/README.md index 4a26756e09..99283688cc 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,74 @@ -# Agent Development Kit (ADK) 2.0 +# Agent Development Kit (ADK) [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) - -

- -

-

- An open-source, code-first Python framework for building, evaluating, and deploying sophisticated AI agents with flexibility and control. -

-

- Important Links: - Docs, - Samples & - ADK Web. -

+[![PyPI](https://img.shields.io/pypi/v/google-adk)](https://pypi.org/project/google-adk/) +[![Python Unit Tests](https://github.com/google/adk-python/actions/workflows/python-unit-tests.yml/badge.svg)](https://github.com/google/adk-python/actions/workflows/python-unit-tests.yml) +[![r/agentdevelopmentkit](https://img.shields.io/badge/Reddit-r%2Fagentdevelopmentkit-FF4500?style=flat&logo=reddit&logoColor=white)](https://www.reddit.com/r/agentdevelopmentkit/) +Ask Code Wiki + + +

+ +

+

+ An open-source, code-first Python framework for building, evaluating, and deploying sophisticated AI agents with flexibility and control. +

+

+ Important Links: + Docs, + Samples, + Java ADK, + Go ADK & + ADK Web. +

+ + +Agent Development Kit (ADK) is a flexible and modular framework that applies +software development principles to AI agent creation. It is designed to +simplify building, deploying, and orchestrating agent workflows, from simple +tasks to complex systems. While optimized for Gemini, ADK is model-agnostic, +deployment-agnostic, and compatible with other frameworks. ______________________________________________________________________ -> **⚠️ BREAKING CHANGES FROM 1.x** -> -> This release includes breaking changes to the agent API, event model, and -> session schema. **Sessions generated by ADK 2.0 are readable by ADK 1.28+ -> (extra fields will be ignored), but are incompatible with older 1.x versions.** +## 🔥 What's new -______________________________________________________________________ +- **Custom Service Registration**: Add a service registry to provide a generic way to register custom service implementations to be used in FastAPI server. See [short instruction](https://github.com/google/adk-python/discussions/3175#discussioncomment-14745120). ([391628f](https://github.com/google/adk-python/commit/391628fcdc7b950c6835f64ae3ccab197163c990)) + +- **Rewind**: Add the ability to rewind a session to before a previous invocation ([9dce06f](https://github.com/google/adk-python/commit/9dce06f9b00259ec42241df4f6638955e783a9d1)). + +- **New CodeExecutor**: Introduces a new AgentEngineSandboxCodeExecutor class that supports executing agent-generated code using the Vertex AI Code Execution Sandbox API ([ee39a89](https://github.com/google/adk-python/commit/ee39a891106316b790621795b5cc529e89815a98)) + +## ✨ Key Features + +- **Rich Tool Ecosystem**: Utilize pre-built tools, custom functions, + OpenAPI specs, MCP tools or integrate existing tools to give agents diverse + capabilities, all for tight integration with the Google ecosystem. -## 🔥 What's New in 2.0 +- **Code-First Development**: Define agent logic, tools, and orchestration + directly in Python for ultimate flexibility, testability, and versioning. -- **Workflow Runtime**: A graph-based execution engine for composing - deterministic execution flows for agentic apps, with support for routing, - fan-out/fan-in, loops, retry, state management, dynamic nodes, - human-in-the-loop, and nested workflows. +- **Agent Config**: Build agents without code. Check out the + [Agent Config](https://google.github.io/adk-docs/agents/config/) feature. -- **Task API**: Structured agent-to-agent delegation with multi-turn task - mode, single-turn controlled output, mixed delegation patterns, - human-in-the-loop, and task agents as workflow nodes. +- **Tool Confirmation**: A [tool confirmation flow(HITL)](https://google.github.io/adk-docs/tools/confirmation/) that can guard tool execution with explicit confirmation and custom input. + +- **Modular Multi-Agent Systems**: Design scalable applications by composing + multiple specialized agents into flexible hierarchies. + +- **Deploy Anywhere**: Easily containerize and deploy agents on Cloud Run or + scale seamlessly with Vertex AI Agent Engine. ## 🚀 Installation +### Stable Release (Recommended) + +You can install the latest stable version of ADK using `pip`: + ```bash pip install google-adk ``` -**Requirements:** Python 3.11+. - To install optional integrations, you can use the following command: ```bash @@ -52,62 +77,111 @@ pip install "google-adk[extensions]" The release cadence is roughly bi-weekly. -## Quick Start +This version is recommended for most users as it represents the most recent official release. + +### Development Version + +Bug fixes and new features are merged into the main branch on GitHub first. If you need access to changes that haven't been included in an official PyPI release yet, you can install directly from the main branch: + +```bash +pip install git+https://github.com/google/adk-python.git@main +``` + +Note: The development version is built directly from the latest code commits. While it includes the newest fixes and features, it may also contain experimental changes or bugs not present in the stable release. Use it primarily for testing upcoming changes or accessing critical fixes before they are officially released. + +## 🤖 Agent2Agent (A2A) Protocol and ADK Integration + +For remote agent-to-agent communication, ADK integrates with the +[A2A protocol](https://github.com/google-a2a/A2A/). +See this [example](https://github.com/a2aproject/a2a-samples/tree/main/samples/python/agents) +for how they can work together. + +## 📚 Documentation + +Explore the full documentation for detailed guides on building, evaluating, and +deploying agents: + +- **[Documentation](https://google.github.io/adk-docs)** -### Agent +## 🏁 Feature Highlight + +### Define a single agent: ```python -from google.adk import Agent +from google.adk.agents import Agent +from google.adk.tools import google_search root_agent = Agent( - name="greeting_agent", - model="gemini-2.5-flash", - instruction="You are a helpful assistant. Greet the user warmly.", + name="search_assistant", + model="gemini-2.5-flash", # Or your preferred Gemini model + instruction="You are a helpful assistant. Answer user questions using Google Search when needed.", + description="An assistant that can search the web.", + tools=[google_search] ) ``` -### Workflow +### Define a multi-agent system: -```python -from google.adk import Agent, Workflow +Define a multi-agent system with coordinator agent, greeter agent, and task execution agent. Then ADK engine and the model will guide the agents to work together to accomplish the task. -generate_fruit_agent = Agent( - name="generate_fruit_agent", - instruction="Return the name of a random fruit. Return only the name.", -) +```python +from google.adk.agents import LlmAgent, BaseAgent -generate_benefit_agent = Agent( - name="generate_benefit_agent", - instruction="Tell me a health benefit about the specified fruit.", -) +# Define individual agents +greeter = LlmAgent(name="greeter", model="gemini-2.5-flash", ...) +task_executor = LlmAgent(name="task_executor", model="gemini-2.5-flash", ...) -root_agent = Workflow( - name="root_agent", - edges=[("START", generate_fruit_agent, generate_benefit_agent)], +# Create parent agent and assign children via sub_agents +coordinator = LlmAgent( + name="Coordinator", + model="gemini-2.5-flash", + description="I coordinate greetings and tasks.", + sub_agents=[ # Assign sub_agents here + greeter, + task_executor + ] ) ``` -### Run Locally +### Development UI -```bash -# Interactive CLI -adk run path/to/my_agent +A built-in development UI to help you test, evaluate, debug, and showcase your agent(s). -# Web UI (supports multi-agent directories or pointing directly to a single agent folder) -adk web path/to/agents_dir -``` + -## 📚 Documentation +### Evaluate Agents -- **Getting Started**: https://google.github.io/adk-docs/ -- **Samples**: See `contributing/workflow_samples/` and - `contributing/task_samples/` for workflow and task API examples. +```bash +adk eval \ + samples_for_testing/hello_world \ + samples_for_testing/hello_world/hello_world_eval_set_001.evalset.json +``` ## 🤝 Contributing -See [CONTRIBUTING.md](CONTRIBUTING.md) for details. +We welcome contributions from the community! Whether it's bug reports, feature requests, documentation improvements, or code contributions, please see our + +- [General contribution guideline and flow](https://google.github.io/adk-docs/contributing-guide/). +- Then if you want to contribute code, please read [Code Contributing Guidelines](./CONTRIBUTING.md) to get started. + +## Community Repo + +We have [adk-python-community repo](https://github.com/google/adk-python-community) that is home to a growing ecosystem of community-contributed tools, third-party +service integrations, and deployment scripts that extend the core capabilities +of the ADK. + +## Vibe Coding + +If you want to develop agent via vibe coding the [llms.txt](./llms.txt) and the [llms-full.txt](./llms-full.txt) can be used as context to LLM. While the former one is a summarized one and the later one has the full information in case your LLM has big enough context window. + +## Community Events + +- [Completed] ADK's 1st community meeting on Wednesday, October 15, 2025. Remember to [join our group](https://groups.google.com/g/adk-community) to get access to the [recording](https://drive.google.com/file/d/1rpXDq5NSH8-MyMeYI6_5pZ3Lhn0X9BQf/view), and [deck](https://docs.google.com/presentation/d/1_b8LG4xaiadbUUDzyNiapSFyxanc9ZgFdw7JQ6zmZ9Q/edit?slide=id.g384e60cdaca_0_658&resourcekey=0-tjFFv0VBQhpXBPCkZr0NOg#slide=id.g384e60cdaca_0_658). ## 📄 License -This project is licensed under the Apache 2.0 License — see the -[LICENSE](LICENSE) file for details. +This project is licensed under the Apache 2.0 License - see the [LICENSE](LICENSE) file for details. + +______________________________________________________________________ + +*Happy Agent Building!* diff --git a/contributing/adk_project_overview_and_architecture.md b/contributing/adk_project_overview_and_architecture.md index 8c28aff385..4a4b3432c6 100644 --- a/contributing/adk_project_overview_and_architecture.md +++ b/contributing/adk_project_overview_and_architecture.md @@ -79,15 +79,6 @@ async def health_check(): return {"status": "ok"} ``` -### Default Application Resolution (`ADK_DEFAULT_APP_NAME`) - -By default, the ADK API server expects an explicit application context in all requests (e.g., via the `/apps/{app_name}/...` path or in the payload body). - -However, if the environment variable `ADK_DEFAULT_APP_NAME` is set, or if the server is running in **single agent mode** (when pointing directly to a directory containing an agent instead of a directory of agents), the server will automatically resolve and fall back to that agent as the default application whenever a request lacks an explicit app name. In single agent mode, the local agent takes precedence over the `ADK_DEFAULT_APP_NAME` environment variable. - -- **URL Path-Rewriting (Production Endpoints)**: Requests to production endpoints that omit the `/apps/{app_name}` prefix (such as `/users/{user_id}/sessions` or `/app-info`) are automatically rewritten by an internal ASGI middleware to target the default application. (Note: `/dev` and `/builder` endpoints are excluded from rewriting). -- **Agent Execution & Streaming**: Requests to `/run`, `/run_sse`, or `/run_live` that omit the `app_name` parameter in their payload body or query string will automatically resolve to the default application. - ## Deployment to Production The adk cli provides the "adk deploy" command to deploy to Google Vertex Agent Engine, Google CloudRun, Google GKE. diff --git a/contributing/samples/a2a/a2a_auth/README.md b/contributing/samples/a2a_auth/README.md similarity index 100% rename from contributing/samples/a2a/a2a_auth/README.md rename to contributing/samples/a2a_auth/README.md diff --git a/contributing/samples/a2a/a2a_auth/__init__.py b/contributing/samples/a2a_auth/__init__.py similarity index 100% rename from contributing/samples/a2a/a2a_auth/__init__.py rename to contributing/samples/a2a_auth/__init__.py diff --git a/contributing/samples/a2a/a2a_auth/agent.py b/contributing/samples/a2a_auth/agent.py similarity index 95% rename from contributing/samples/a2a/a2a_auth/agent.py rename to contributing/samples/a2a_auth/agent.py index ef370c6ac8..aa6ebbee9d 100644 --- a/contributing/samples/a2a/a2a_auth/agent.py +++ b/contributing/samples/a2a_auth/agent.py @@ -29,6 +29,7 @@ youtube_search_agent = Agent( name="youtube_search_agent", + model="gemini-2.5-flash", # Replace with the actual model name instruction=""" Ask customer to provide singer name, and the number of videos to search. """, @@ -46,6 +47,7 @@ ) root_agent = Agent( + model="gemini-2.5-flash", name="root_agent", instruction=""" You are a helpful assistant that can help search youtube videos, look up BigQuery datasets and tables. diff --git a/contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/__init__.py b/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/__init__.py similarity index 100% rename from contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/__init__.py rename to contributing/samples/a2a_auth/remote_a2a/bigquery_agent/__init__.py diff --git a/contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/agent.json b/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.json similarity index 70% rename from contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/agent.json rename to contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.json index d071109d6e..b91fd79660 100644 --- a/contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/agent.json +++ b/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.json @@ -1,11 +1,7 @@ { "capabilities": {}, - "defaultInputModes": [ - "text/plain" - ], - "defaultOutputModes": [ - "application/json" - ], + "defaultInputModes": ["text/plain"], + "defaultOutputModes": ["application/json"], "description": "A Google BigQuery agent that helps manage users' data on Google BigQuery. Can list, get, and create datasets, as well as manage tables within datasets. Supports OAuth authentication for secure access to BigQuery resources.", "name": "bigquery_agent", "skills": [ @@ -13,31 +9,19 @@ "id": "dataset_management", "name": "Dataset Management", "description": "List, get details, and create BigQuery datasets", - "tags": [ - "bigquery", - "datasets", - "google-cloud" - ] + "tags": ["bigquery", "datasets", "google-cloud"] }, { "id": "table_management", "name": "Table Management", "description": "List, get details, and create BigQuery tables within datasets", - "tags": [ - "bigquery", - "tables", - "google-cloud" - ] + "tags": ["bigquery", "tables", "google-cloud"] }, { "id": "oauth_authentication", "name": "OAuth Authentication", "description": "Secure authentication with Google BigQuery using OAuth", - "tags": [ - "authentication", - "oauth", - "security" - ] + "tags": ["authentication", "oauth", "security"] } ], "url": "http://localhost:8001/a2a/bigquery_agent", diff --git a/contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/agent.py b/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.py similarity index 98% rename from contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/agent.py rename to contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.py index dad89cc55c..06fcd213c1 100644 --- a/contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/agent.py +++ b/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.py @@ -39,6 +39,7 @@ ) root_agent = Agent( + model="gemini-2.5-flash", name="bigquery_agent", instruction=""" You are a helpful Google BigQuery agent that help to manage users' data on Google BigQuery. diff --git a/contributing/samples/a2a/a2a_basic/README.md b/contributing/samples/a2a_basic/README.md similarity index 100% rename from contributing/samples/a2a/a2a_basic/README.md rename to contributing/samples/a2a_basic/README.md diff --git a/contributing/samples/a2a/a2a_basic/__init__.py b/contributing/samples/a2a_basic/__init__.py similarity index 100% rename from contributing/samples/a2a/a2a_basic/__init__.py rename to contributing/samples/a2a_basic/__init__.py diff --git a/contributing/samples/a2a/a2a_basic/agent.py b/contributing/samples/a2a_basic/agent.py similarity index 99% rename from contributing/samples/a2a/a2a_basic/agent.py rename to contributing/samples/a2a_basic/agent.py index 7728c9ed74..00301cd1f6 100755 --- a/contributing/samples/a2a/a2a_basic/agent.py +++ b/contributing/samples/a2a_basic/agent.py @@ -94,6 +94,7 @@ def roll_die(sides: int) -> int: root_agent = Agent( + model="gemini-2.5-flash", name="root_agent", instruction=""" You are a helpful assistant that can roll dice and check if numbers are prime. diff --git a/contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/__init__.py b/contributing/samples/a2a_basic/remote_a2a/check_prime_agent/__init__.py similarity index 100% rename from contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/__init__.py rename to contributing/samples/a2a_basic/remote_a2a/check_prime_agent/__init__.py diff --git a/contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/agent.json b/contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.json similarity index 70% rename from contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/agent.json rename to contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.json index 8071f50985..e625bc3435 100644 --- a/contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/agent.json +++ b/contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.json @@ -1,11 +1,7 @@ { "capabilities": {}, - "defaultInputModes": [ - "text/plain" - ], - "defaultOutputModes": [ - "application/json" - ], + "defaultInputModes": ["text/plain"], + "defaultOutputModes": ["application/json"], "description": "An agent specialized in checking whether numbers are prime. It can efficiently determine the primality of individual numbers or lists of numbers.", "name": "check_prime_agent", "skills": [ @@ -13,12 +9,7 @@ "id": "prime_checking", "name": "Prime Number Checking", "description": "Check if numbers in a list are prime using efficient mathematical algorithms", - "tags": [ - "mathematical", - "computation", - "prime", - "numbers" - ] + "tags": ["mathematical", "computation", "prime", "numbers"] } ], "url": "http://localhost:8001/a2a/check_prime_agent", diff --git a/contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/agent.py b/contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.py similarity index 98% rename from contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/agent.py rename to contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.py index a2b9e4427c..424f39e1f4 100755 --- a/contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/agent.py +++ b/contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.py @@ -48,6 +48,7 @@ async def check_prime(nums: list[int]) -> str: root_agent = Agent( + model='gemini-2.5-flash', name='check_prime_agent', description='check prime agent that can check whether numbers are prime.', instruction=""" diff --git a/contributing/samples/a2a/a2a_human_in_loop/README.md b/contributing/samples/a2a_human_in_loop/README.md similarity index 100% rename from contributing/samples/a2a/a2a_human_in_loop/README.md rename to contributing/samples/a2a_human_in_loop/README.md diff --git a/contributing/samples/a2a/a2a_human_in_loop/__init__.py b/contributing/samples/a2a_human_in_loop/__init__.py similarity index 100% rename from contributing/samples/a2a/a2a_human_in_loop/__init__.py rename to contributing/samples/a2a_human_in_loop/__init__.py diff --git a/contributing/samples/a2a/a2a_human_in_loop/agent.py b/contributing/samples/a2a_human_in_loop/agent.py similarity index 98% rename from contributing/samples/a2a/a2a_human_in_loop/agent.py rename to contributing/samples/a2a_human_in_loop/agent.py index 667de8d94f..07ff3ae9ad 100644 --- a/contributing/samples/a2a/a2a_human_in_loop/agent.py +++ b/contributing/samples/a2a_human_in_loop/agent.py @@ -36,6 +36,7 @@ def reimburse(purpose: str, amount: float) -> str: root_agent = Agent( + model='gemini-2.5-flash', name='reimbursement_agent', instruction=""" You are an agent whose job is to handle the reimbursement process for diff --git a/contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/__init__.py b/contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/__init__.py similarity index 100% rename from contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/__init__.py rename to contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/__init__.py diff --git a/contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json b/contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json similarity index 71% rename from contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json rename to contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json index a3beb619d3..c0b850cb52 100644 --- a/contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json +++ b/contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json @@ -1,11 +1,7 @@ { "capabilities": {}, - "defaultInputModes": [ - "text/plain" - ], - "defaultOutputModes": [ - "application/json" - ], + "defaultInputModes": ["text/plain"], + "defaultOutputModes": ["application/json"], "description": "A reimbursement agent that handles employee expense reimbursement requests. Automatically approves amounts under $100 and requires manager approval for larger amounts using long-running tools for human-in-the-loop workflows.", "name": "reimbursement_agent", "skills": [ @@ -13,31 +9,19 @@ "id": "automatic_reimbursement", "name": "Automatic Reimbursement", "description": "Automatically process and approve reimbursements under $100", - "tags": [ - "reimbursement", - "automation", - "finance" - ] + "tags": ["reimbursement", "automation", "finance"] }, { "id": "approval_workflow", "name": "Approval Workflow", "description": "Request manager approval for reimbursements over $100 using long-running tools", - "tags": [ - "approval", - "workflow", - "human-in-loop" - ] + "tags": ["approval", "workflow", "human-in-loop"] }, { "id": "expense_processing", "name": "Expense Processing", "description": "Process employee expense claims and handle reimbursement logic", - "tags": [ - "expenses", - "processing", - "employee-services" - ] + "tags": ["expenses", "processing", "employee-services"] } ], "url": "http://localhost:8001/a2a/human_in_loop", diff --git a/contributing/samples/hitl/human_in_loop/agent.py b/contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py similarity index 98% rename from contributing/samples/hitl/human_in_loop/agent.py rename to contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py index 89a4282f6e..3ea740b7a1 100644 --- a/contributing/samples/hitl/human_in_loop/agent.py +++ b/contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py @@ -39,6 +39,7 @@ def ask_for_approval( root_agent = Agent( + model='gemini-2.5-flash', name='reimbursement_agent', instruction=""" You are an agent whose job is to handle the reimbursement process for diff --git a/contributing/samples/a2a/a2a_root/README.md b/contributing/samples/a2a_root/README.md similarity index 100% rename from contributing/samples/a2a/a2a_root/README.md rename to contributing/samples/a2a_root/README.md diff --git a/contributing/samples/a2a/a2a_root/agent.py b/contributing/samples/a2a_root/agent.py similarity index 100% rename from contributing/samples/a2a/a2a_root/agent.py rename to contributing/samples/a2a_root/agent.py diff --git a/contributing/samples/a2a/a2a_root/remote_a2a/hello_world/__init__.py b/contributing/samples/a2a_root/remote_a2a/hello_world/__init__.py similarity index 100% rename from contributing/samples/a2a/a2a_root/remote_a2a/hello_world/__init__.py rename to contributing/samples/a2a_root/remote_a2a/hello_world/__init__.py diff --git a/contributing/samples/a2a/a2a_root/remote_a2a/hello_world/agent.py b/contributing/samples/a2a_root/remote_a2a/hello_world/agent.py similarity index 99% rename from contributing/samples/a2a/a2a_root/remote_a2a/hello_world/agent.py rename to contributing/samples/a2a_root/remote_a2a/hello_world/agent.py index cf4c41980a..ec4ddd8983 100755 --- a/contributing/samples/a2a/a2a_root/remote_a2a/hello_world/agent.py +++ b/contributing/samples/a2a_root/remote_a2a/hello_world/agent.py @@ -66,6 +66,7 @@ async def check_prime(nums: list[int]) -> str: root_agent = Agent( + model='gemini-2.5-flash', name='hello_world_agent', description=( 'hello world agent that can roll a dice of 8 sides and check prime' diff --git a/contributing/samples/adk_team/adk_answering_agent/README.md b/contributing/samples/adk_answering_agent/README.md similarity index 100% rename from contributing/samples/adk_team/adk_answering_agent/README.md rename to contributing/samples/adk_answering_agent/README.md diff --git a/contributing/samples/adk_team/adk_answering_agent/__init__.py b/contributing/samples/adk_answering_agent/__init__.py similarity index 100% rename from contributing/samples/adk_team/adk_answering_agent/__init__.py rename to contributing/samples/adk_answering_agent/__init__.py diff --git a/contributing/samples/adk_team/adk_answering_agent/agent.py b/contributing/samples/adk_answering_agent/agent.py similarity index 99% rename from contributing/samples/adk_team/adk_answering_agent/agent.py rename to contributing/samples/adk_answering_agent/agent.py index 04ef4c69df..ff82e5029a 100644 --- a/contributing/samples/adk_team/adk_answering_agent/agent.py +++ b/contributing/samples/adk_answering_agent/agent.py @@ -38,7 +38,7 @@ root_agent = Agent( - model="gemini-3.5-flash", + model="gemini-2.5-pro", name="adk_answering_agent", description="Answer questions about ADK repo.", instruction=f""" diff --git a/contributing/samples/adk_team/adk_answering_agent/gemini_assistant/__init__.py b/contributing/samples/adk_answering_agent/gemini_assistant/__init__.py similarity index 100% rename from contributing/samples/adk_team/adk_answering_agent/gemini_assistant/__init__.py rename to contributing/samples/adk_answering_agent/gemini_assistant/__init__.py diff --git a/contributing/samples/adk_team/adk_answering_agent/gemini_assistant/agent.py b/contributing/samples/adk_answering_agent/gemini_assistant/agent.py similarity index 99% rename from contributing/samples/adk_team/adk_answering_agent/gemini_assistant/agent.py rename to contributing/samples/adk_answering_agent/gemini_assistant/agent.py index d93fa1d2aa..812a78174f 100644 --- a/contributing/samples/adk_team/adk_answering_agent/gemini_assistant/agent.py +++ b/contributing/samples/adk_answering_agent/gemini_assistant/agent.py @@ -72,7 +72,7 @@ def search_gemini_api_docs(queries: List[str]) -> Dict[str, Any]: root_agent = Agent( - model="gemini-3.5-flash", + model="gemini-2.5-pro", name="gemini_assistant", description="Answer questions about Gemini API.", instruction=""" diff --git a/contributing/samples/adk_team/adk_answering_agent/main.py b/contributing/samples/adk_answering_agent/main.py similarity index 100% rename from contributing/samples/adk_team/adk_answering_agent/main.py rename to contributing/samples/adk_answering_agent/main.py diff --git a/contributing/samples/adk_team/adk_answering_agent/settings.py b/contributing/samples/adk_answering_agent/settings.py similarity index 100% rename from contributing/samples/adk_team/adk_answering_agent/settings.py rename to contributing/samples/adk_answering_agent/settings.py diff --git a/contributing/samples/adk_team/adk_answering_agent/tools.py b/contributing/samples/adk_answering_agent/tools.py similarity index 100% rename from contributing/samples/adk_team/adk_answering_agent/tools.py rename to contributing/samples/adk_answering_agent/tools.py diff --git a/contributing/samples/adk_team/adk_answering_agent/upload_docs_to_vertex_ai_search.py b/contributing/samples/adk_answering_agent/upload_docs_to_vertex_ai_search.py similarity index 100% rename from contributing/samples/adk_team/adk_answering_agent/upload_docs_to_vertex_ai_search.py rename to contributing/samples/adk_answering_agent/upload_docs_to_vertex_ai_search.py diff --git a/contributing/samples/adk_team/adk_answering_agent/utils.py b/contributing/samples/adk_answering_agent/utils.py similarity index 100% rename from contributing/samples/adk_team/adk_answering_agent/utils.py rename to contributing/samples/adk_answering_agent/utils.py diff --git a/contributing/samples/adk_team/adk_documentation/__init__.py b/contributing/samples/adk_documentation/__init__.py similarity index 100% rename from contributing/samples/adk_team/adk_documentation/__init__.py rename to contributing/samples/adk_documentation/__init__.py diff --git a/contributing/samples/adk_team/adk_documentation/adk_docs_updater/__init__.py b/contributing/samples/adk_documentation/adk_docs_updater/__init__.py similarity index 100% rename from contributing/samples/adk_team/adk_documentation/adk_docs_updater/__init__.py rename to contributing/samples/adk_documentation/adk_docs_updater/__init__.py diff --git a/contributing/samples/adk_team/adk_documentation/adk_docs_updater/agent.py b/contributing/samples/adk_documentation/adk_docs_updater/agent.py similarity index 99% rename from contributing/samples/adk_team/adk_documentation/adk_docs_updater/agent.py rename to contributing/samples/adk_documentation/adk_docs_updater/agent.py index fc441b8457..4b3cac0794 100644 --- a/contributing/samples/adk_team/adk_documentation/adk_docs_updater/agent.py +++ b/contributing/samples/adk_documentation/adk_docs_updater/agent.py @@ -46,7 +46,7 @@ ) root_agent = Agent( - model="gemini-3.5-flash", + model="gemini-2.5-pro", name="adk_docs_updater", description=( "Update the ADK docs based on the code in the ADK Python codebase" diff --git a/contributing/samples/adk_team/adk_documentation/adk_docs_updater/main.py b/contributing/samples/adk_documentation/adk_docs_updater/main.py similarity index 100% rename from contributing/samples/adk_team/adk_documentation/adk_docs_updater/main.py rename to contributing/samples/adk_documentation/adk_docs_updater/main.py diff --git a/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/README.md b/contributing/samples/adk_documentation/adk_release_analyzer/README.md similarity index 100% rename from contributing/samples/adk_team/adk_documentation/adk_release_analyzer/README.md rename to contributing/samples/adk_documentation/adk_release_analyzer/README.md diff --git a/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/__init__.py b/contributing/samples/adk_documentation/adk_release_analyzer/__init__.py similarity index 100% rename from contributing/samples/adk_team/adk_documentation/adk_release_analyzer/__init__.py rename to contributing/samples/adk_documentation/adk_release_analyzer/__init__.py diff --git a/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/agent.py b/contributing/samples/adk_documentation/adk_release_analyzer/agent.py similarity index 100% rename from contributing/samples/adk_team/adk_documentation/adk_release_analyzer/agent.py rename to contributing/samples/adk_documentation/adk_release_analyzer/agent.py diff --git a/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/main.py b/contributing/samples/adk_documentation/adk_release_analyzer/main.py similarity index 100% rename from contributing/samples/adk_team/adk_documentation/adk_release_analyzer/main.py rename to contributing/samples/adk_documentation/adk_release_analyzer/main.py diff --git a/contributing/samples/adk_team/adk_documentation/settings.py b/contributing/samples/adk_documentation/settings.py similarity index 100% rename from contributing/samples/adk_team/adk_documentation/settings.py rename to contributing/samples/adk_documentation/settings.py diff --git a/contributing/samples/adk_team/adk_documentation/tools.py b/contributing/samples/adk_documentation/tools.py similarity index 100% rename from contributing/samples/adk_team/adk_documentation/tools.py rename to contributing/samples/adk_documentation/tools.py diff --git a/contributing/samples/adk_team/adk_documentation/utils.py b/contributing/samples/adk_documentation/utils.py similarity index 100% rename from contributing/samples/adk_team/adk_documentation/utils.py rename to contributing/samples/adk_documentation/utils.py diff --git a/contributing/samples/adk_team/adk_issue_formatting_agent/__init__.py b/contributing/samples/adk_issue_formatting_agent/__init__.py similarity index 100% rename from contributing/samples/adk_team/adk_issue_formatting_agent/__init__.py rename to contributing/samples/adk_issue_formatting_agent/__init__.py diff --git a/contributing/samples/adk_team/adk_issue_formatting_agent/agent.py b/contributing/samples/adk_issue_formatting_agent/agent.py similarity index 99% rename from contributing/samples/adk_team/adk_issue_formatting_agent/agent.py rename to contributing/samples/adk_issue_formatting_agent/agent.py index 3c29bd1267..ae906f3993 100644 --- a/contributing/samples/adk_team/adk_issue_formatting_agent/agent.py +++ b/contributing/samples/adk_issue_formatting_agent/agent.py @@ -132,7 +132,7 @@ def list_comments_on_issue(issue_number: int) -> dict[str, any]: root_agent = Agent( - model="gemini-3.5-flash", + model="gemini-2.5-pro", name="adk_issue_formatting_assistant", description="Check ADK issue format and content.", instruction=f""" diff --git a/contributing/samples/adk_team/adk_issue_formatting_agent/settings.py b/contributing/samples/adk_issue_formatting_agent/settings.py similarity index 100% rename from contributing/samples/adk_team/adk_issue_formatting_agent/settings.py rename to contributing/samples/adk_issue_formatting_agent/settings.py diff --git a/contributing/samples/adk_team/adk_issue_formatting_agent/utils.py b/contributing/samples/adk_issue_formatting_agent/utils.py similarity index 100% rename from contributing/samples/adk_team/adk_issue_formatting_agent/utils.py rename to contributing/samples/adk_issue_formatting_agent/utils.py diff --git a/contributing/samples/adk_team/adk_issue_monitoring_agent/PROMPT_INSTRUCTION.txt b/contributing/samples/adk_issue_monitoring_agent/PROMPT_INSTRUCTION.txt similarity index 100% rename from contributing/samples/adk_team/adk_issue_monitoring_agent/PROMPT_INSTRUCTION.txt rename to contributing/samples/adk_issue_monitoring_agent/PROMPT_INSTRUCTION.txt diff --git a/contributing/samples/adk_team/adk_issue_monitoring_agent/README.md b/contributing/samples/adk_issue_monitoring_agent/README.md similarity index 100% rename from contributing/samples/adk_team/adk_issue_monitoring_agent/README.md rename to contributing/samples/adk_issue_monitoring_agent/README.md diff --git a/contributing/samples/adk_team/adk_issue_monitoring_agent/__init__.py b/contributing/samples/adk_issue_monitoring_agent/__init__.py similarity index 100% rename from contributing/samples/adk_team/adk_issue_monitoring_agent/__init__.py rename to contributing/samples/adk_issue_monitoring_agent/__init__.py diff --git a/contributing/samples/adk_team/adk_issue_monitoring_agent/agent.py b/contributing/samples/adk_issue_monitoring_agent/agent.py similarity index 100% rename from contributing/samples/adk_team/adk_issue_monitoring_agent/agent.py rename to contributing/samples/adk_issue_monitoring_agent/agent.py diff --git a/contributing/samples/adk_team/adk_issue_monitoring_agent/main.py b/contributing/samples/adk_issue_monitoring_agent/main.py similarity index 100% rename from contributing/samples/adk_team/adk_issue_monitoring_agent/main.py rename to contributing/samples/adk_issue_monitoring_agent/main.py diff --git a/contributing/samples/adk_team/adk_issue_monitoring_agent/settings.py b/contributing/samples/adk_issue_monitoring_agent/settings.py similarity index 100% rename from contributing/samples/adk_team/adk_issue_monitoring_agent/settings.py rename to contributing/samples/adk_issue_monitoring_agent/settings.py diff --git a/contributing/samples/adk_team/adk_issue_monitoring_agent/utils.py b/contributing/samples/adk_issue_monitoring_agent/utils.py similarity index 100% rename from contributing/samples/adk_team/adk_issue_monitoring_agent/utils.py rename to contributing/samples/adk_issue_monitoring_agent/utils.py diff --git a/contributing/samples/adk_team/adk_knowledge_agent/README.md b/contributing/samples/adk_knowledge_agent/README.md similarity index 100% rename from contributing/samples/adk_team/adk_knowledge_agent/README.md rename to contributing/samples/adk_knowledge_agent/README.md diff --git a/contributing/samples/adk_team/adk_knowledge_agent/__init__.py b/contributing/samples/adk_knowledge_agent/__init__.py similarity index 100% rename from contributing/samples/adk_team/adk_knowledge_agent/__init__.py rename to contributing/samples/adk_knowledge_agent/__init__.py diff --git a/contributing/samples/adk_team/adk_knowledge_agent/agent.json b/contributing/samples/adk_knowledge_agent/agent.json similarity index 68% rename from contributing/samples/adk_team/adk_knowledge_agent/agent.json rename to contributing/samples/adk_knowledge_agent/agent.json index 972adf18d9..9002ba82e2 100644 --- a/contributing/samples/adk_team/adk_knowledge_agent/agent.json +++ b/contributing/samples/adk_knowledge_agent/agent.json @@ -1,11 +1,7 @@ { "capabilities": {}, - "defaultInputModes": [ - "text/plain" - ], - "defaultOutputModes": [ - "application/json" - ], + "defaultInputModes": ["text/plain"], + "defaultOutputModes": ["application/json"], "description": "Agent for performing Vertex AI Search to find ADK knowledge and documentation", "name": "adk_knowledge_agent", "skills": [ @@ -13,13 +9,7 @@ "id": "adk_knowledge_search", "name": "ADK Knowledge Search", "description": "Searches for ADK examples and documentation using the Vertex AI Search tool", - "tags": [ - "search", - "documentation", - "knowledge base", - "Vertex AI", - "ADK" - ] + "tags": ["search", "documentation", "knowledge base", "Vertex AI", "ADK"] } ], "url": "https://adk-agent-builder-knowledge-service-654646711756.us-central1.run.app/a2a/adk_knowledge_agent", diff --git a/contributing/samples/adk_team/adk_knowledge_agent/agent.py b/contributing/samples/adk_knowledge_agent/agent.py similarity index 98% rename from contributing/samples/adk_team/adk_knowledge_agent/agent.py rename to contributing/samples/adk_knowledge_agent/agent.py index 7effb777c3..9ac23dc1f1 100644 --- a/contributing/samples/adk_team/adk_knowledge_agent/agent.py +++ b/contributing/samples/adk_knowledge_agent/agent.py @@ -68,6 +68,7 @@ def citation_retrieval_after_model_callback( You can use the VertexAiSearchTool to search for ADK examples and documentation in the document store. """, + model="gemini-2.5-flash", tools=[VertexAiSearchTool(data_store_id=VERTEXAI_DATASTORE_ID)], after_model_callback=citation_retrieval_after_model_callback, ) diff --git a/contributing/samples/adk_team/adk_knowledge_agent/requirements.txt b/contributing/samples/adk_knowledge_agent/requirements.txt similarity index 100% rename from contributing/samples/adk_team/adk_knowledge_agent/requirements.txt rename to contributing/samples/adk_knowledge_agent/requirements.txt diff --git a/contributing/samples/adk_team/adk_pr_agent/__init__.py b/contributing/samples/adk_pr_agent/__init__.py similarity index 100% rename from contributing/samples/adk_team/adk_pr_agent/__init__.py rename to contributing/samples/adk_pr_agent/__init__.py diff --git a/contributing/samples/adk_team/adk_pr_agent/agent.py b/contributing/samples/adk_pr_agent/agent.py similarity index 99% rename from contributing/samples/adk_team/adk_pr_agent/agent.py rename to contributing/samples/adk_pr_agent/agent.py index e416a013a9..76e54c9fc0 100644 --- a/contributing/samples/adk_team/adk_pr_agent/agent.py +++ b/contributing/samples/adk_pr_agent/agent.py @@ -143,6 +143,7 @@ def get_github_pr_info_http(pr_number: int) -> str | None: """ root_agent = Agent( + model="gemini-2.5-flash", name="github_pr_agent", description="Generate pull request descriptions for ADK.", instruction=system_prompt, diff --git a/contributing/samples/adk_team/adk_pr_agent/main.py b/contributing/samples/adk_pr_agent/main.py similarity index 100% rename from contributing/samples/adk_team/adk_pr_agent/main.py rename to contributing/samples/adk_pr_agent/main.py diff --git a/contributing/samples/adk_team/adk_pr_triaging_agent/README.md b/contributing/samples/adk_pr_triaging_agent/README.md similarity index 100% rename from contributing/samples/adk_team/adk_pr_triaging_agent/README.md rename to contributing/samples/adk_pr_triaging_agent/README.md diff --git a/contributing/samples/adk_team/adk_pr_triaging_agent/__init__.py b/contributing/samples/adk_pr_triaging_agent/__init__.py similarity index 100% rename from contributing/samples/adk_team/adk_pr_triaging_agent/__init__.py rename to contributing/samples/adk_pr_triaging_agent/__init__.py diff --git a/contributing/samples/adk_team/adk_pr_triaging_agent/agent.py b/contributing/samples/adk_pr_triaging_agent/agent.py similarity index 99% rename from contributing/samples/adk_team/adk_pr_triaging_agent/agent.py rename to contributing/samples/adk_pr_triaging_agent/agent.py index 8e70cc4a0c..7f849fe358 100644 --- a/contributing/samples/adk_team/adk_pr_triaging_agent/agent.py +++ b/contributing/samples/adk_pr_triaging_agent/agent.py @@ -41,7 +41,7 @@ ] CONTRIBUTING_MD = read_file( - Path(__file__).resolve().parents[4] / "CONTRIBUTING.md" + Path(__file__).resolve().parents[3] / "CONTRIBUTING.md" ) APPROVAL_INSTRUCTION = ( @@ -220,7 +220,7 @@ def add_comment_to_pr(pr_number: int, comment: str) -> dict[str, Any]: root_agent = Agent( - model="gemini-3.5-flash", + model="gemini-2.5-pro", name="adk_pr_triaging_assistant", description="Triage ADK pull requests.", instruction=f""" diff --git a/contributing/samples/adk_team/adk_pr_triaging_agent/main.py b/contributing/samples/adk_pr_triaging_agent/main.py similarity index 100% rename from contributing/samples/adk_team/adk_pr_triaging_agent/main.py rename to contributing/samples/adk_pr_triaging_agent/main.py diff --git a/contributing/samples/adk_team/adk_pr_triaging_agent/settings.py b/contributing/samples/adk_pr_triaging_agent/settings.py similarity index 100% rename from contributing/samples/adk_team/adk_pr_triaging_agent/settings.py rename to contributing/samples/adk_pr_triaging_agent/settings.py diff --git a/contributing/samples/adk_team/adk_pr_triaging_agent/utils.py b/contributing/samples/adk_pr_triaging_agent/utils.py similarity index 100% rename from contributing/samples/adk_team/adk_pr_triaging_agent/utils.py rename to contributing/samples/adk_pr_triaging_agent/utils.py diff --git a/contributing/samples/adk_team/adk_stale_agent/PROMPT_INSTRUCTION.txt b/contributing/samples/adk_stale_agent/PROMPT_INSTRUCTION.txt similarity index 100% rename from contributing/samples/adk_team/adk_stale_agent/PROMPT_INSTRUCTION.txt rename to contributing/samples/adk_stale_agent/PROMPT_INSTRUCTION.txt diff --git a/contributing/samples/adk_team/adk_stale_agent/README.md b/contributing/samples/adk_stale_agent/README.md similarity index 100% rename from contributing/samples/adk_team/adk_stale_agent/README.md rename to contributing/samples/adk_stale_agent/README.md diff --git a/contributing/samples/adk_team/adk_stale_agent/__init__.py b/contributing/samples/adk_stale_agent/__init__.py similarity index 100% rename from contributing/samples/adk_team/adk_stale_agent/__init__.py rename to contributing/samples/adk_stale_agent/__init__.py diff --git a/contributing/samples/adk_team/adk_stale_agent/agent.py b/contributing/samples/adk_stale_agent/agent.py similarity index 100% rename from contributing/samples/adk_team/adk_stale_agent/agent.py rename to contributing/samples/adk_stale_agent/agent.py diff --git a/contributing/samples/adk_team/adk_stale_agent/main.py b/contributing/samples/adk_stale_agent/main.py similarity index 100% rename from contributing/samples/adk_team/adk_stale_agent/main.py rename to contributing/samples/adk_stale_agent/main.py diff --git a/contributing/samples/adk_team/adk_stale_agent/settings.py b/contributing/samples/adk_stale_agent/settings.py similarity index 100% rename from contributing/samples/adk_team/adk_stale_agent/settings.py rename to contributing/samples/adk_stale_agent/settings.py diff --git a/contributing/samples/adk_team/adk_stale_agent/utils.py b/contributing/samples/adk_stale_agent/utils.py similarity index 100% rename from contributing/samples/adk_team/adk_stale_agent/utils.py rename to contributing/samples/adk_stale_agent/utils.py diff --git a/contributing/samples/adk_team/adk_triaging_agent/README.md b/contributing/samples/adk_triaging_agent/README.md similarity index 100% rename from contributing/samples/adk_team/adk_triaging_agent/README.md rename to contributing/samples/adk_triaging_agent/README.md diff --git a/contributing/samples/adk_team/adk_triaging_agent/__init__.py b/contributing/samples/adk_triaging_agent/__init__.py similarity index 100% rename from contributing/samples/adk_team/adk_triaging_agent/__init__.py rename to contributing/samples/adk_triaging_agent/__init__.py diff --git a/contributing/samples/adk_team/adk_triaging_agent/agent.py b/contributing/samples/adk_triaging_agent/agent.py similarity index 95% rename from contributing/samples/adk_team/adk_triaging_agent/agent.py rename to contributing/samples/adk_triaging_agent/agent.py index 09eb728d97..5797361af8 100644 --- a/contributing/samples/adk_team/adk_triaging_agent/agent.py +++ b/contributing/samples/adk_triaging_agent/agent.py @@ -29,16 +29,13 @@ "agent engine": "yeesian", "auth": "xuanyang15", "bq": "shobsi", - "cli": "wyf7107", "core": "Jacksunwei", "documentation": "joefernandez", "eval": "ankursharmas", - "integrations": "wukath", "live": "wuliang229", "mcp": "wukath", "models": "xuanyang15", "services": "DeanChensj", - "skills": "wukath", "tools": "xuanyang15", "tracing": "mhenc", "web": "wyf7107", @@ -66,13 +63,8 @@ - "live": Streaming, bidi, audio, or Gemini Live configuration. - "models": Non-Gemini model adapters (LiteLLM, Ollama, OpenAI, etc.). - "tracing": Telemetry, observability, structured logs, or spans. - - "cli": ADK CLI commands (e.g., create, deploy, eval) and CLI tools. - - "skills": GCP Skills Registry (`GCPSkillRegistry`), skill prompt models, - and dynamic skill toolsets. - - "integrations": Third-party integrations (e.g., CrewAI, LangChain, - Slack) excluding BigQuery. - "core": Core ADK runtime (Agent definitions, Runner, planners, - thinking config, GlobalInstructionPlugin, CPU usage, or + thinking config, CLI commands, GlobalInstructionPlugin, CPU usage, or general orchestration including agent transfer for multi-agents system). Default to "core" when the topic is about ADK behavior and no other label is a better fit. @@ -252,7 +244,7 @@ def change_issue_type(issue_number: int, issue_type: str) -> dict[str, Any]: root_agent = Agent( - model="gemini-3.5-flash", + model="gemini-2.5-pro", name="adk_triaging_assistant", description="Triage ADK issues.", instruction=f""" diff --git a/contributing/samples/adk_team/adk_triaging_agent/main.py b/contributing/samples/adk_triaging_agent/main.py similarity index 100% rename from contributing/samples/adk_team/adk_triaging_agent/main.py rename to contributing/samples/adk_triaging_agent/main.py diff --git a/contributing/samples/adk_team/adk_triaging_agent/settings.py b/contributing/samples/adk_triaging_agent/settings.py similarity index 100% rename from contributing/samples/adk_team/adk_triaging_agent/settings.py rename to contributing/samples/adk_triaging_agent/settings.py diff --git a/contributing/samples/adk_team/adk_triaging_agent/utils.py b/contributing/samples/adk_triaging_agent/utils.py similarity index 100% rename from contributing/samples/adk_team/adk_triaging_agent/utils.py rename to contributing/samples/adk_triaging_agent/utils.py diff --git a/contributing/samples/code_execution/agent_engine_code_execution/README b/contributing/samples/agent_engine_code_execution/README similarity index 100% rename from contributing/samples/code_execution/agent_engine_code_execution/README rename to contributing/samples/agent_engine_code_execution/README diff --git a/contributing/samples/code_execution/agent_engine_code_execution/__init__.py b/contributing/samples/agent_engine_code_execution/__init__.py similarity index 100% rename from contributing/samples/code_execution/agent_engine_code_execution/__init__.py rename to contributing/samples/agent_engine_code_execution/__init__.py diff --git a/contributing/samples/code_execution/agent_engine_code_execution/agent.py b/contributing/samples/agent_engine_code_execution/agent.py similarity index 99% rename from contributing/samples/code_execution/agent_engine_code_execution/agent.py rename to contributing/samples/agent_engine_code_execution/agent.py index 661c105a91..eb320b077c 100644 --- a/contributing/samples/code_execution/agent_engine_code_execution/agent.py +++ b/contributing/samples/agent_engine_code_execution/agent.py @@ -66,6 +66,7 @@ def base_system_instruction(): root_agent = Agent( + model="gemini-2.5-flash", name="agent_engine_code_execution_agent", instruction=base_system_instruction() + """ diff --git a/contributing/samples/integrations/agent_registry_agent/README.md b/contributing/samples/agent_registry_agent/README.md similarity index 100% rename from contributing/samples/integrations/agent_registry_agent/README.md rename to contributing/samples/agent_registry_agent/README.md diff --git a/contributing/samples/code_execution/code_execution/__init__.py b/contributing/samples/agent_registry_agent/__init__.py similarity index 100% rename from contributing/samples/code_execution/code_execution/__init__.py rename to contributing/samples/agent_registry_agent/__init__.py diff --git a/contributing/samples/integrations/agent_registry_agent/agent.py b/contributing/samples/agent_registry_agent/agent.py similarity index 100% rename from contributing/samples/integrations/agent_registry_agent/agent.py rename to contributing/samples/agent_registry_agent/agent.py diff --git a/contributing/samples/code_execution/custom_code_execution/__init__.py b/contributing/samples/agent_tool_with_grounding_metadata/__init__.py similarity index 100% rename from contributing/samples/code_execution/custom_code_execution/__init__.py rename to contributing/samples/agent_tool_with_grounding_metadata/__init__.py diff --git a/contributing/samples/tools/agent_tool_with_grounding_metadata/agent.py b/contributing/samples/agent_tool_with_grounding_metadata/agent.py similarity index 100% rename from contributing/samples/tools/agent_tool_with_grounding_metadata/agent.py rename to contributing/samples/agent_tool_with_grounding_metadata/agent.py diff --git a/contributing/samples/integrations/api_registry_agent/README.md b/contributing/samples/api_registry_agent/README.md similarity index 100% rename from contributing/samples/integrations/api_registry_agent/README.md rename to contributing/samples/api_registry_agent/README.md diff --git a/contributing/samples/code_execution/vertex_code_execution/__init__.py b/contributing/samples/api_registry_agent/__init__.py similarity index 100% rename from contributing/samples/code_execution/vertex_code_execution/__init__.py rename to contributing/samples/api_registry_agent/__init__.py diff --git a/contributing/samples/integrations/api_registry_agent/agent.py b/contributing/samples/api_registry_agent/agent.py similarity index 98% rename from contributing/samples/integrations/api_registry_agent/agent.py rename to contributing/samples/api_registry_agent/agent.py index 27dac7a6c7..87faea3116 100644 --- a/contributing/samples/integrations/api_registry_agent/agent.py +++ b/contributing/samples/api_registry_agent/agent.py @@ -26,6 +26,7 @@ mcp_server_name=MCP_SERVER_NAME, ) root_agent = LlmAgent( + model="gemini-2.5-flash", name="bigquery_assistant", instruction=f""" You are a helpful data analyst assistant with access to BigQuery. The project ID is: {PROJECT_ID} diff --git a/contributing/samples/integrations/application_integration_agent/README.md b/contributing/samples/application_integration_agent/README.md similarity index 100% rename from contributing/samples/integrations/application_integration_agent/README.md rename to contributing/samples/application_integration_agent/README.md diff --git a/contributing/samples/context_management/history_management/__init__.py b/contributing/samples/application_integration_agent/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/context_management/history_management/__init__.py rename to contributing/samples/application_integration_agent/__init__.py diff --git a/contributing/samples/integrations/application_integration_agent/agent.py b/contributing/samples/application_integration_agent/agent.py similarity index 98% rename from contributing/samples/integrations/application_integration_agent/agent.py rename to contributing/samples/application_integration_agent/agent.py index 66b8a1102e..a033122f3a 100644 --- a/contributing/samples/integrations/application_integration_agent/agent.py +++ b/contributing/samples/application_integration_agent/agent.py @@ -37,6 +37,7 @@ ) root_agent = LlmAgent( + model="gemini-2.5-flash", name="Issue_Management_Agent", instruction=""" You are an agent that helps manage issues in a Jira instance. diff --git a/contributing/samples/context_management/memory/__init__.py b/contributing/samples/artifact_save_text/__init__.py similarity index 100% rename from contributing/samples/context_management/memory/__init__.py rename to contributing/samples/artifact_save_text/__init__.py diff --git a/contributing/samples/artifact_save_text/agent.py b/contributing/samples/artifact_save_text/agent.py new file mode 100755 index 0000000000..408d64fc5a --- /dev/null +++ b/contributing/samples/artifact_save_text/agent.py @@ -0,0 +1,45 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from google.adk import Agent +from google.adk.tools.tool_context import ToolContext +from google.genai import types + + +async def log_query(tool_context: ToolContext, query: str): + """Saves the provided query string as a 'text/plain' artifact named 'query'.""" + query_bytes = query.encode('utf-8') + artifact_part = types.Part( + inline_data=types.Blob(mime_type='text/plain', data=query_bytes) + ) + await tool_context.save_artifact('query', artifact_part) + + +root_agent = Agent( + model='gemini-2.5-flash', + name='log_agent', + description='Log user query.', + instruction="""Always log the user query and reply "kk, I've logged." + """, + tools=[log_query], + generate_content_config=types.GenerateContentConfig( + safety_settings=[ + types.SafetySetting( # avoid false alarm about rolling dice. + category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, + threshold=types.HarmBlockThreshold.OFF, + ), + ] + ), +) diff --git a/contributing/samples/integrations/authn-adk-all-in-one/README.md b/contributing/samples/authn-adk-all-in-one/README.md similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/README.md rename to contributing/samples/authn-adk-all-in-one/README.md diff --git a/contributing/samples/context_management/rewind_session/__init__.py b/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py similarity index 100% rename from contributing/samples/context_management/rewind_session/__init__.py rename to contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py diff --git a/contributing/samples/integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py b/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py rename to contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py diff --git a/contributing/samples/integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml b/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml rename to contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml diff --git a/contributing/samples/integrations/authn-adk-all-in-one/adk_agents/requirements.txt b/contributing/samples/authn-adk-all-in-one/adk_agents/requirements.txt similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/adk_agents/requirements.txt rename to contributing/samples/authn-adk-all-in-one/adk_agents/requirements.txt diff --git a/contributing/samples/integrations/authn-adk-all-in-one/adk_agents/sample.env b/contributing/samples/authn-adk-all-in-one/adk_agents/sample.env similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/adk_agents/sample.env rename to contributing/samples/authn-adk-all-in-one/adk_agents/sample.env diff --git a/contributing/samples/integrations/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg b/contributing/samples/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg rename to contributing/samples/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg diff --git a/contributing/samples/integrations/authn-adk-all-in-one/doc_images/jwks_updated.png b/contributing/samples/authn-adk-all-in-one/doc_images/jwks_updated.png similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/doc_images/jwks_updated.png rename to contributing/samples/authn-adk-all-in-one/doc_images/jwks_updated.png diff --git a/contributing/samples/integrations/authn-adk-all-in-one/doc_images/jwksgen.png b/contributing/samples/authn-adk-all-in-one/doc_images/jwksgen.png similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/doc_images/jwksgen.png rename to contributing/samples/authn-adk-all-in-one/doc_images/jwksgen.png diff --git a/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py b/contributing/samples/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py rename to contributing/samples/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py diff --git a/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/main.py b/contributing/samples/authn-adk-all-in-one/hotel_booker_app/main.py similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/main.py rename to contributing/samples/authn-adk-all-in-one/hotel_booker_app/main.py diff --git a/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/openapi.yaml b/contributing/samples/authn-adk-all-in-one/hotel_booker_app/openapi.yaml similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/openapi.yaml rename to contributing/samples/authn-adk-all-in-one/hotel_booker_app/openapi.yaml diff --git a/contributing/samples/integrations/authn-adk-all-in-one/idp/app.py b/contributing/samples/authn-adk-all-in-one/idp/app.py similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/idp/app.py rename to contributing/samples/authn-adk-all-in-one/idp/app.py diff --git a/contributing/samples/integrations/authn-adk-all-in-one/idp/sample.env b/contributing/samples/authn-adk-all-in-one/idp/sample.env similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/idp/sample.env rename to contributing/samples/authn-adk-all-in-one/idp/sample.env diff --git a/contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json b/contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json new file mode 100644 index 0000000000..f811d6ba31 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json @@ -0,0 +1,5 @@ +{ + "keys": [ + "Replace with JWKS from jwkset.com/generate" + ] +} diff --git a/contributing/samples/integrations/authn-adk-all-in-one/idp/templates/admin.html b/contributing/samples/authn-adk-all-in-one/idp/templates/admin.html similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/idp/templates/admin.html rename to contributing/samples/authn-adk-all-in-one/idp/templates/admin.html diff --git a/contributing/samples/integrations/authn-adk-all-in-one/idp/templates/consent.html b/contributing/samples/authn-adk-all-in-one/idp/templates/consent.html similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/idp/templates/consent.html rename to contributing/samples/authn-adk-all-in-one/idp/templates/consent.html diff --git a/contributing/samples/integrations/authn-adk-all-in-one/idp/templates/login.html b/contributing/samples/authn-adk-all-in-one/idp/templates/login.html similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/idp/templates/login.html rename to contributing/samples/authn-adk-all-in-one/idp/templates/login.html diff --git a/contributing/samples/integrations/authn-adk-all-in-one/requirements.txt b/contributing/samples/authn-adk-all-in-one/requirements.txt similarity index 81% rename from contributing/samples/integrations/authn-adk-all-in-one/requirements.txt rename to contributing/samples/authn-adk-all-in-one/requirements.txt index d5bc65a788..45cba168a5 100644 --- a/contributing/samples/integrations/authn-adk-all-in-one/requirements.txt +++ b/contributing/samples/authn-adk-all-in-one/requirements.txt @@ -1,4 +1,5 @@ -google-adk==1.12 +google-adk==1.28.1 + Flask==3.1.3 flask-cors==6.0.1 python-dotenv==1.1.1 diff --git a/contributing/samples/integrations/bigquery/README.md b/contributing/samples/bigquery/README.md similarity index 100% rename from contributing/samples/integrations/bigquery/README.md rename to contributing/samples/bigquery/README.md diff --git a/contributing/samples/context_management/session_state_agent/__init__.py b/contributing/samples/bigquery/__init__.py similarity index 100% rename from contributing/samples/context_management/session_state_agent/__init__.py rename to contributing/samples/bigquery/__init__.py diff --git a/contributing/samples/integrations/bigquery/agent.py b/contributing/samples/bigquery/agent.py similarity index 99% rename from contributing/samples/integrations/bigquery/agent.py rename to contributing/samples/bigquery/agent.py index 0db42297ee..7e2031030c 100644 --- a/contributing/samples/integrations/bigquery/agent.py +++ b/contributing/samples/bigquery/agent.py @@ -91,6 +91,7 @@ # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( + model="gemini-2.5-flash", name=BIGQUERY_AGENT_NAME, description=( "Agent to answer questions about BigQuery data and models and execute" diff --git a/contributing/samples/integrations/bigquery_mcp/README.md b/contributing/samples/bigquery_mcp/README.md similarity index 100% rename from contributing/samples/integrations/bigquery_mcp/README.md rename to contributing/samples/bigquery_mcp/README.md diff --git a/contributing/samples/core/abort/__init__.py b/contributing/samples/bigquery_mcp/__init__.py similarity index 100% rename from contributing/samples/core/abort/__init__.py rename to contributing/samples/bigquery_mcp/__init__.py diff --git a/contributing/samples/integrations/bigquery_mcp/agent.py b/contributing/samples/bigquery_mcp/agent.py similarity index 98% rename from contributing/samples/integrations/bigquery_mcp/agent.py rename to contributing/samples/bigquery_mcp/agent.py index b852b2c62a..fb3a16f22d 100644 --- a/contributing/samples/integrations/bigquery_mcp/agent.py +++ b/contributing/samples/bigquery_mcp/agent.py @@ -37,6 +37,7 @@ # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( + model="gemini-2.5-flash", name=BIGQUERY_AGENT_NAME, description=( "Agent to answer questions about BigQuery data and models and execute" diff --git a/contributing/samples/integrations/bigtable/README.md b/contributing/samples/bigtable/README.md similarity index 100% rename from contributing/samples/integrations/bigtable/README.md rename to contributing/samples/bigtable/README.md diff --git a/contributing/samples/core/artifacts/__init__.py b/contributing/samples/bigtable/__init__.py similarity index 100% rename from contributing/samples/core/artifacts/__init__.py rename to contributing/samples/bigtable/__init__.py diff --git a/contributing/samples/integrations/bigtable/agent.py b/contributing/samples/bigtable/agent.py similarity index 99% rename from contributing/samples/integrations/bigtable/agent.py rename to contributing/samples/bigtable/agent.py index 6d0ead8698..1d52e1fef2 100644 --- a/contributing/samples/integrations/bigtable/agent.py +++ b/contributing/samples/bigtable/agent.py @@ -112,6 +112,7 @@ def search_hotels_by_location( # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( + model="gemini-2.5-flash", name="bigtable_agent", description=( "Agent to answer questions about Bigtable database tables and" diff --git a/contributing/samples/tools/built_in_multi_tools/README.md b/contributing/samples/built_in_multi_tools/README.md similarity index 100% rename from contributing/samples/tools/built_in_multi_tools/README.md rename to contributing/samples/built_in_multi_tools/README.md diff --git a/contributing/samples/core/callbacks/__init__.py b/contributing/samples/built_in_multi_tools/__init__.py similarity index 100% rename from contributing/samples/core/callbacks/__init__.py rename to contributing/samples/built_in_multi_tools/__init__.py diff --git a/contributing/samples/tools/built_in_multi_tools/agent.py b/contributing/samples/built_in_multi_tools/agent.py similarity index 100% rename from contributing/samples/tools/built_in_multi_tools/agent.py rename to contributing/samples/built_in_multi_tools/agent.py diff --git a/contributing/samples/cache_analysis/README.md b/contributing/samples/cache_analysis/README.md new file mode 100644 index 0000000000..f01ff54a9f --- /dev/null +++ b/contributing/samples/cache_analysis/README.md @@ -0,0 +1,116 @@ +# Cache Analysis Research Assistant + +This sample demonstrates ADK context caching features with a comprehensive research assistant agent designed to test both Gemini 2.0 Flash and 2.5 Flash context caching capabilities. The sample showcases the difference between explicit ADK caching and Google's built-in implicit caching. + +## Key Features + +- **App-Level Cache Configuration**: Context cache settings applied at the App level +- **Large Context Instructions**: Over 4200 tokens in system instructions to trigger context caching thresholds +- **Comprehensive Tool Suite**: 7 specialized research and analysis tools +- **Multi-Model Support**: Compatible with any Gemini model, automatically adapts experiment type +- **Performance Metrics**: Detailed token usage tracking including `cached_content_token_count` + +## Cache Configuration + +```python +ContextCacheConfig( + min_tokens=4096, + ttl_seconds=600, # 10 mins for research sessions + cache_intervals=3, # Maximum invocations before cache invalidation +``` + +## Usage + +### Run Cache Experiments + +The `run_cache_experiments.py` script compares caching performance between models: + +```bash +# Test any Gemini model - script automatically determines experiment type +python run_cache_experiments.py --output results.json + +# Examples: +python run_cache_experiments.py gemini-2.5-flash --output gemini_2_5_results.json + +# Run multiple iterations for averaged results +python run_cache_experiments.py --repeat 3 --output averaged_results.json +``` + +### Direct Agent Usage + +```bash +# Run the agent directly +adk run contributing/samples/cache_analysis/agent.py + +# Web interface for debugging +adk web contributing/samples/cache_analysis +``` + +## Experiment Types + +The script automatically determines the experiment type based on the model name: + +### Models with "2.5" (e.g., gemini-2.5-flash) + +- **Explicit Caching**: ADK explicit caching + Google's implicit caching +- **Implicit Only**: Google's built-in implicit caching alone +- **Measures**: Added benefit of explicit caching over Google's built-in implicit caching + +## Tools Included + +1. **analyze_data_patterns** - Statistical analysis and pattern recognition in datasets +1. **research_literature** - Academic and professional literature research with citations +1. **generate_test_scenarios** - Comprehensive test case generation and validation strategies +1. **benchmark_performance** - System performance measurement and bottleneck analysis +1. **optimize_system_performance** - Performance optimization recommendations and strategies +1. **analyze_security_vulnerabilities** - Security risk assessment and vulnerability analysis +1. **design_scalability_architecture** - Scalable system architecture design and planning + +## Expected Results + +### Performance vs Cost Trade-offs + +**Note**: This sample uses a tool-heavy agent that may show different performance characteristics than simple text-based agents. + +### Performance Improvements + +- **Simple Text Agents**: Typically see 30-70% latency reduction with caching +- **Tool-Heavy Agents**: May experience higher latency due to cache setup overhead, but still provide cost benefits +- **Gemini 2.5 Flash**: Compares explicit ADK caching against Google's built-in implicit caching + +### Cost Savings + +- **Input Token Cost**: 75% reduction for cached content (25% of normal cost) +- **Typical Savings**: 30-60% on input costs for multi-turn conversations +- **Tool-Heavy Workloads**: Cost savings often outweigh latency trade-offs + +### Token Metrics + +- **Cached Content Token Count**: Non-zero values indicating successful cache hits +- **Cache Hit Ratio**: Proportion of tokens served from cache vs fresh computation + +## Troubleshooting + +### Zero Cached Tokens + +If `cached_content_token_count` is always 0: + +- Verify model names match exactly (e.g., `gemini-2.5-flash`) +- Check that cache configuration `min_tokens` threshold is met +- Ensure proper App-based configuration is used + +### Session Errors + +If seeing "Session not found" errors: + +- Verify `runner.app_name` is used for session creation +- Check App vs Agent object usage in InMemoryRunner initialization + +## Technical Implementation + +This sample demonstrates: + +- **Modern App Architecture**: App-level cache configuration following ADK best practices +- **Integration Testing**: Comprehensive cache functionality validation +- **Performance Analysis**: Detailed metrics collection and comparison methodology +- **Error Handling**: Robust session management and cache invalidation handling diff --git a/contributing/samples/context_management/cache_analysis/__init__.py b/contributing/samples/cache_analysis/__init__.py similarity index 100% rename from contributing/samples/context_management/cache_analysis/__init__.py rename to contributing/samples/cache_analysis/__init__.py diff --git a/contributing/samples/context_management/cache_analysis/agent.py b/contributing/samples/cache_analysis/agent.py similarity index 99% rename from contributing/samples/context_management/cache_analysis/agent.py rename to contributing/samples/cache_analysis/agent.py index dde66f4410..55abaf709c 100644 --- a/contributing/samples/context_management/cache_analysis/agent.py +++ b/contributing/samples/cache_analysis/agent.py @@ -640,6 +640,7 @@ def benchmark_performance( # Create the cache analysis research assistant agent cache_analysis_agent = Agent( name="cache_analysis_assistant", + model="gemini-2.5-flash", description=""" Advanced Research and Analysis Assistant specializing in comprehensive system analysis, performance benchmarking, literature research, and test scenario generation for diff --git a/contributing/samples/context_management/cache_analysis/run_cache_experiments.py b/contributing/samples/cache_analysis/run_cache_experiments.py similarity index 100% rename from contributing/samples/context_management/cache_analysis/run_cache_experiments.py rename to contributing/samples/cache_analysis/run_cache_experiments.py diff --git a/contributing/samples/context_management/cache_analysis/utils.py b/contributing/samples/cache_analysis/utils.py similarity index 100% rename from contributing/samples/context_management/cache_analysis/utils.py rename to contributing/samples/cache_analysis/utils.py diff --git a/contributing/samples/core/hello_world/__init__.py b/contributing/samples/callbacks/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/core/hello_world/__init__.py rename to contributing/samples/callbacks/__init__.py diff --git a/contributing/samples/callbacks/agent.py b/contributing/samples/callbacks/agent.py new file mode 100755 index 0000000000..66c76dcd42 --- /dev/null +++ b/contributing/samples/callbacks/agent.py @@ -0,0 +1,198 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import random + +from google.adk import Agent +from google.adk.planners.built_in_planner import BuiltInPlanner +from google.adk.planners.plan_re_act_planner import PlanReActPlanner +from google.adk.tools.tool_context import ToolContext +from google.genai import types + + +def roll_die(sides: int, tool_context: ToolContext) -> int: + """Roll a die and return the rolled result. + + Args: + sides: The integer number of sides the die has. + + Returns: + An integer of the result of rolling the die. + """ + result = random.randint(1, sides) + if not 'rolls' in tool_context.state: + tool_context.state['rolls'] = [] + + tool_context.state['rolls'] = tool_context.state['rolls'] + [result] + return result + + +async def check_prime(nums: list[int]) -> str: + """Check if a given list of numbers are prime. + + Args: + nums: The list of numbers to check. + + Returns: + A str indicating which number is prime. + """ + primes = set() + for number in nums: + number = int(number) + if number <= 1: + continue + is_prime = True + for i in range(2, int(number**0.5) + 1): + if number % i == 0: + is_prime = False + break + if is_prime: + primes.add(number) + return ( + 'No prime numbers found.' + if not primes + else f"{', '.join(str(num) for num in primes)} are prime numbers." + ) + + +async def before_agent_callback(callback_context): + print('@before_agent_callback') + return None + + +async def after_agent_callback(callback_context): + print('@after_agent_callback') + return None + + +async def before_model_callback(callback_context, llm_request): + print('@before_model_callback') + return None + + +async def after_model_callback(callback_context, llm_response): + print('@after_model_callback') + return None + + +def after_agent_cb1(callback_context): + print('@after_agent_cb1') + + +def after_agent_cb2(callback_context): + print('@after_agent_cb2') + # ModelContent (or Content with role set to 'model') must be returned. + # Otherwise, the event will be excluded from the context in the next turn. + return types.ModelContent( + parts=[ + types.Part( + text='(stopped) after_agent_cb2', + ), + ], + ) + + +def after_agent_cb3(callback_context): + print('@after_agent_cb3') + + +def before_agent_cb1(callback_context): + print('@before_agent_cb1') + + +def before_agent_cb2(callback_context): + print('@before_agent_cb2') + + +def before_agent_cb3(callback_context): + print('@before_agent_cb3') + + +def before_tool_cb1(tool, args, tool_context): + print('@before_tool_cb1') + + +def before_tool_cb2(tool, args, tool_context): + print('@before_tool_cb2') + + +def before_tool_cb3(tool, args, tool_context): + print('@before_tool_cb3') + + +def after_tool_cb1(tool, args, tool_context, tool_response): + print('@after_tool_cb1') + + +def after_tool_cb2(tool, args, tool_context, tool_response): + print('@after_tool_cb2') + return {'test': 'after_tool_cb2', 'response': tool_response} + + +def after_tool_cb3(tool, args, tool_context, tool_response): + print('@after_tool_cb3') + + +root_agent = Agent( + model='gemini-2.5-flash', + name='data_processing_agent', + description=( + 'hello world agent that can roll a dice of 8 sides and check prime' + ' numbers.' + ), + instruction=""" + You roll dice and answer questions about the outcome of the dice rolls. + You can roll dice of different sizes. + You can use multiple tools in parallel by calling functions in parallel(in one request and in one round). + It is ok to discuss previous dice roles, and comment on the dice rolls. + When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string. + You should never roll a die on your own. + When checking prime numbers, call the check_prime tool with a list of integers. Be sure to pass in a list of integers. You should never pass in a string. + You should not check prime numbers before calling the tool. + When you are asked to roll a die and check prime numbers, you should always make the following two function calls: + 1. You should first call the roll_die tool to get a roll. Wait for the function response before calling the check_prime tool. + 2. After you get the function response from roll_die tool, you should call the check_prime tool with the roll_die result. + 2.1 If user asks you to check primes based on previous rolls, make sure you include the previous rolls in the list. + 3. When you respond, you must include the roll_die result from step 1. + You should always perform the previous 3 steps when asking for a roll and checking prime numbers. + You should not rely on the previous history on prime results. + """, + tools=[ + roll_die, + check_prime, + ], + # planner=BuiltInPlanner( + # thinking_config=types.ThinkingConfig( + # include_thoughts=True, + # ), + # ), + generate_content_config=types.GenerateContentConfig( + safety_settings=[ + types.SafetySetting( # avoid false alarm about rolling dice. + category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, + threshold=types.HarmBlockThreshold.OFF, + ), + ] + ), + before_agent_callback=[ + before_agent_cb1, + before_agent_cb2, + before_agent_cb3, + ], + after_agent_callback=[after_agent_cb1, after_agent_cb2, after_agent_cb3], + before_model_callback=before_model_callback, + after_model_callback=after_model_callback, + before_tool_callback=[before_tool_cb1, before_tool_cb2, before_tool_cb3], + after_tool_callback=[after_tool_cb1, after_tool_cb2, after_tool_cb3], +) diff --git a/contributing/samples/context_management/history_management/main.py b/contributing/samples/callbacks/main.py similarity index 100% rename from contributing/samples/context_management/history_management/main.py rename to contributing/samples/callbacks/main.py diff --git a/contributing/samples/core/logprobs/__init__.py b/contributing/samples/code_execution/__init__.py similarity index 100% rename from contributing/samples/core/logprobs/__init__.py rename to contributing/samples/code_execution/__init__.py diff --git a/contributing/samples/code_execution/code_execution/agent.py b/contributing/samples/code_execution/agent.py similarity index 99% rename from contributing/samples/code_execution/code_execution/agent.py rename to contributing/samples/code_execution/agent.py index 482adf7ab8..c8f808528d 100644 --- a/contributing/samples/code_execution/code_execution/agent.py +++ b/contributing/samples/code_execution/agent.py @@ -78,6 +78,7 @@ def base_system_instruction(): root_agent = Agent( + model="gemini-2.5-flash", name="data_science_agent", instruction=base_system_instruction() + """ diff --git a/contributing/samples/code_execution/code_execution/gke_sandbox_agent.py b/contributing/samples/code_execution/gke_sandbox_agent.py similarity index 98% rename from contributing/samples/code_execution/code_execution/gke_sandbox_agent.py rename to contributing/samples/code_execution/gke_sandbox_agent.py index 26d7390892..8948f4f469 100644 --- a/contributing/samples/code_execution/code_execution/gke_sandbox_agent.py +++ b/contributing/samples/code_execution/gke_sandbox_agent.py @@ -39,6 +39,7 @@ def gke_agent_system_instruction(): root_agent = LlmAgent( name="gke_coding_agent", + model="gemini-2.5-flash", description=( "A general-purpose agent that executes Python code in a secure GKE" " Sandbox." diff --git a/contributing/samples/multimodal/computer_use/README.md b/contributing/samples/computer_use/README.md similarity index 100% rename from contributing/samples/multimodal/computer_use/README.md rename to contributing/samples/computer_use/README.md diff --git a/contributing/samples/multimodal/computer_use/agent.py b/contributing/samples/computer_use/agent.py similarity index 100% rename from contributing/samples/multimodal/computer_use/agent.py rename to contributing/samples/computer_use/agent.py diff --git a/contributing/samples/multimodal/computer_use/playwright.py b/contributing/samples/computer_use/playwright.py similarity index 100% rename from contributing/samples/multimodal/computer_use/playwright.py rename to contributing/samples/computer_use/playwright.py diff --git a/contributing/samples/multimodal/computer_use/requirements.txt b/contributing/samples/computer_use/requirements.txt similarity index 100% rename from contributing/samples/multimodal/computer_use/requirements.txt rename to contributing/samples/computer_use/requirements.txt diff --git a/contributing/samples/context_management/cache_analysis/README.md b/contributing/samples/context_management/cache_analysis/README.md deleted file mode 100644 index 44b7cf7628..0000000000 --- a/contributing/samples/context_management/cache_analysis/README.md +++ /dev/null @@ -1,131 +0,0 @@ -# Cache Analysis Research Assistant - -## Overview - -This sample demonstrates ADK context caching features using a comprehensive research assistant agent designed to test both Gemini 2.0 Flash and 2.5 Flash context caching capabilities. The sample showcases the difference between explicit ADK caching and Google's built-in implicit caching. - -### Key Features - -- **App-Level Cache Configuration**: Context cache settings applied at the App level following ADK best practices. -- **Large Context Instructions**: Over 4,200 tokens in system instructions to trigger context caching thresholds. -- **Comprehensive Tool Suite**: 7 specialized research and analysis tools. -- **Multi-Model Support**: Compatible with any Gemini model, automatically adapting the experiment type. -- **Performance Metrics**: Detailed token usage tracking, including `cached_content_token_count`. - -## Sample Inputs - -- `Hello, what can you do for me?` - - *General question that does not trigger function calls, serving as a baseline query.* - -- `What is artificial intelligence and how does it work in modern applications?` - - *General question exploring domain knowledge without specific tool requests.* - -- `Use benchmark_performance with system_name='E-commerce Platform', metrics=['latency', 'throughput'], duration='standard', load_profile='realistic'.` - - *Specific request triggering the benchmark_performance tool with explicit parameters.* - -- `Call analyze_user_behavior_patterns with user_segment='premium_customers', time_period='last_30_days', metrics=['engagement', 'conversion'].` - - *Specific request triggering data analysis tools with required parameters.* - -## Graph - -```mermaid -graph TD - Agent[Agent: cache_analysis_assistant] --> Tool1[Tool: analyze_data_patterns] - Agent --> Tool2[Tool: research_literature] - Agent --> Tool3[Tool: generate_test_scenarios] - Agent --> Tool4[Tool: benchmark_performance] - Agent --> Tool5[Tool: optimize_system_performance] - Agent --> Tool6[Tool: analyze_security_vulnerabilities] - Agent --> Tool7[Tool: design_scalability_architecture] -``` - -## How To - -### 1. Cache Configuration - -Context caching is configured at the App level using `ContextCacheConfig`. This ensures that the agent's extensive system instructions and tool definitions are cached for repeated invocations. - -```python -from google.adk.agents.context_cache_config import ContextCacheConfig -from google.adk.apps.app import App - -cache_analysis_app = App( - name="cache_analysis", - root_agent=cache_analysis_agent, - context_cache_config=ContextCacheConfig( - min_tokens=4096, - ttl_seconds=600, # 10 minutes for research sessions - cache_intervals=3, # Maximum invocations before cache refresh - ), -) -``` - -### 2. Run Cache Experiments - -The `run_cache_experiments.py` script automates the execution of prompts and compares caching performance between models: - -```bash -# Test any Gemini model - script automatically determines experiment type -python run_cache_experiments.py --output results.json - -# Examples: -python run_cache_experiments.py gemini-2.5-flash --output gemini_2_5_results.json - -# Run multiple iterations for averaged results -python run_cache_experiments.py gemini-2.5-flash --repeat 3 --output averaged_results.json -``` - -### 3. Direct Agent Usage - -You can also run or debug the agent directly using the ADK CLI: - -```bash -# Run the agent directly -adk run contributing/samples/cache_analysis/agent.py - -# Web interface for debugging -adk web contributing/samples/cache_analysis -``` - -### 4. Experiment Types - -The script automatically adapts the experiment based on the specified model name: - -#### Models with "2.5" (e.g., `gemini-2.5-flash`) - -- **Explicit Caching**: ADK explicit caching + Google's implicit caching. -- **Implicit Only**: Google's built-in implicit caching alone. -- **Measures**: The added benefit and performance differences of explicit caching over built-in implicit caching. - -#### Other Models (e.g., `gemini-2.0-flash`) - -- **Explicit Caching**: ADK explicit caching enabled. -- **Uncached**: Caching completely disabled. -- **Measures**: Baseline performance and cost benefits of context caching. - -### 5. Expected Results - -- **Performance Improvements**: Simple text agents typically see a 30-70% latency reduction with caching. Tool-heavy agents may experience slight cache setup overhead but still provide significant cost benefits. -- **Cost Savings**: Up to 75% reduction in input token costs for cached content (paying only 25% of normal input cost). -- **Token Metrics**: Successful cache hits are indicated by non-zero `cached_content_token_count` values. - -### 6. Troubleshooting - -#### Zero Cached Tokens - -If `cached_content_token_count` is always `0`: - -- Verify model names match exactly (e.g., `gemini-2.5-flash`). -- Check that the `min_tokens` threshold (4,096 tokens) is met by the prompt and system instructions. -- Ensure proper App-based configuration is used rather than passing standalone agents without App wrappers. - -#### Session Errors - -If you encounter "Session not found" errors: - -- Verify `runner.app_name` is used for session creation. -- Ensure correct initialization of `InMemoryRunner` with the `App` object. diff --git a/contributing/samples/context_management/session_state_agent/input.json b/contributing/samples/context_management/session_state_agent/input.json deleted file mode 100644 index fd09168e12..0000000000 --- a/contributing/samples/context_management/session_state_agent/input.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "state": {}, - "queries": [ - "hello world!" - ] -} diff --git a/contributing/samples/patterns/context_offloading_with_artifact/README.md b/contributing/samples/context_offloading_with_artifact/README.md similarity index 100% rename from contributing/samples/patterns/context_offloading_with_artifact/README.md rename to contributing/samples/context_offloading_with_artifact/README.md diff --git a/contributing/samples/core/quickstart/__init__.py b/contributing/samples/context_offloading_with_artifact/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/core/quickstart/__init__.py rename to contributing/samples/context_offloading_with_artifact/__init__.py diff --git a/contributing/samples/patterns/context_offloading_with_artifact/agent.py b/contributing/samples/context_offloading_with_artifact/agent.py similarity index 99% rename from contributing/samples/patterns/context_offloading_with_artifact/agent.py rename to contributing/samples/context_offloading_with_artifact/agent.py index b6a301e39d..6e62e8f034 100755 --- a/contributing/samples/patterns/context_offloading_with_artifact/agent.py +++ b/contributing/samples/context_offloading_with_artifact/agent.py @@ -219,6 +219,7 @@ async def process_llm_request( root_agent = Agent( + model='gemini-2.5-flash', name='context_offloading_with_artifact', description='An assistant for querying large sales reports.', instruction=""" diff --git a/contributing/samples/core/abort/README.md b/contributing/samples/core/abort/README.md deleted file mode 100644 index 28c386eaf6..0000000000 --- a/contributing/samples/core/abort/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Abort Agent Sample - -## Overview - -This sample demonstrates a standalone ADK agent designed specifically to showcase cooperative task cancellation on client disconnections. - -The agent leverages a custom tool that counts from 1 to a target number requested by the user, pausing 1 second between each count and printing the progress directly to the server's stdout terminal. This delay allows you to easily trigger connection drops (by cancelling client requests mid-execution) and visually observe that background agent execution halts immediately in the server terminal, resolving resource leaks. - -## Sample Inputs - -- `Count to 10 seconds` - - The agent will call the `count_seconds` tool with a target count of 10, pausing 1 second between each increment. - -- `Please count up to 20` - - The agent will invoke the tool to count to 20. If you close the client connection (such as pressing `Ctrl+C` in a cURL window or closing your browser tab) while the loop is running, counting halts immediately. - -## Graph - -```mermaid -graph TD - START --> AbortAgent - AbortAgent --> |"Invoke Tool"| count_seconds - count_seconds --> |"Abort if Disconnected / Done"| AbortAgent - AbortAgent --> ANSWER -``` - -## How To - -### 1. Running Locally via the CLI - -To interact with the agent in your local shell terminal: - -```bash -adk run contributing/samples/core/abort/ -``` - -Type `count to 10` at the `[user]:` prompt. Pressing `Ctrl+C` mid-run will abort counting and exit. - -### 2. Running via HTTP Server and cURL - -To verify connection-drop abortion over network protocols (e.g. simple HTTP REST request): - -1. Start the local development server to watch the sample workspace: - ```bash - adk web --allow_origins=http://localhost:4200 contributing/samples/ - ``` -1. In a separate terminal, register the test session (local CLI development servers run with `--auto_create_session` set to `False` by default): - ```bash - curl -X POST http://localhost:8000/apps/abort_agent/users/user/sessions \ - -H "Content-Type: application/json" \ - -d '{"session_id": "8b24e6ed-1fff-4f0c-a06a-e065692a446e"}' - ``` -1. Initiate the count request (this blocks waiting for a response): - ```bash - curl -X POST http://localhost:8000/run \ - -H "Content-Type: application/json" \ - -d '{ - "app_name": "abort_agent", - "user_id": "user", - "session_id": "8b24e6ed-1fff-4f0c-a06a-e065692a446e", - "new_message": { - "role": "user", - "parts": [{"text": "count to 100"}] - } - }' - ``` -1. Observe your `adk web` terminal window. You will see the counting progress logging. -1. **Trigger the Abort**: Press `Ctrl+C` in your cURL terminal window to close the client connection. -1. Observe the server console window. Counting halts instantly and prints: - ```text - [Counting Tool] Count was ABORTED mid-run at progress: X/100 (Client Disconnected)! - ``` - -### 3. Running and Testing via ADK Web (Dev UI) - -To observe cooperative aborts interactively in the web-based developer interface: - -1. Start the local development server: - ```bash - adk web --allow_origins=http://localhost:4200 contributing/samples/ - ``` -1. Open the ADK Web interface (`http://localhost:4200`) in your web browser. -1. Select the **`abort_agent`** app from the left sidebar panel. -1. Type `count to 100` in the message input box and click submit. -1. **Trigger the Abort**: Simply close your browser tab, refresh the page, or navigate away from the chat panel. -1. Observe the server's stdout terminal console. You will see that counting halts immediately and logs: - ```text - [Counting Tool] Count was ABORTED mid-run (Client Disconnected)! - ``` diff --git a/contributing/samples/core/abort/agent.py b/contributing/samples/core/abort/agent.py deleted file mode 100644 index 117cb2d70e..0000000000 --- a/contributing/samples/core/abort/agent.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import asyncio -import logging - -from google.adk import Agent - -logger = logging.getLogger("google_adk." + __name__) - - -async def count_seconds(target: int) -> str: - """Counts from 1 to the target number, pausing 1 second between counts, and prints each count. - - Args: - target: The target number to count to. - """ - logger.info("Starting count from 1 to %d...", target) - print( - f"\n[Counting Tool] Starting counting up to {target} in console...", - flush=True, - ) - - i = 0 - try: - for i in range(1, target + 1): - await asyncio.sleep(1) - # Print to standard stdout so it shows directly in the server terminal - print(f"[Counting Tool] Progress: {i}/{target}", flush=True) - logger.info("Counted: %d/%d", i, target) - - print( - f"[Counting Tool] Finished counting up to {target}.\n", - flush=True, - ) - return f"Successfully counted from 1 to {target} in the console." - except asyncio.CancelledError: - print( - f"\n[Counting Tool] Count was ABORTED mid-run at progress: {i}/{target}" - " (Client Disconnected)!\n", - flush=True, - ) - logger.warning("Counting tool was cancelled mid-run.") - raise - - -root_agent = Agent( - name="abort_agent", - description=( - "An agent designed to demonstrate how ADK handles client disconnects" - " and aborts agent executions mid-run using a counting loop with a" - " 1-second delay." - ), - instruction="""You are an abort coordinator. -Your goal is to demonstrate cooperative task abortion. -When asked to count to a number (or count for a number of seconds), invoke the `count_seconds` tool with the target number. -Do not try to count by yourself; always delegate counting to the `count_seconds` tool so that progress is accurately printed and logs can show task cancellation when a disconnect happens.""", - tools=[count_seconds], -) diff --git a/contributing/samples/core/app/README.md b/contributing/samples/core/app/README.md deleted file mode 100644 index 9a150af97c..0000000000 --- a/contributing/samples/core/app/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Application Configuration (App) - -## Overview - -This sample demonstrates how to configure an `App` in ADK. An `App` serves as the top-level container for an agentic system, wrapping a root agent or workflow and providing application-wide configurations such as plugins, event compaction, and context caching. - -## Sample Inputs - -- `Hello, who are you?` - - *The application executes `greeter_agent`. The `CountInvocationPlugin` logs the agent and LLM run counts to the console.* - -- `Can you help me plan a trip?` - - *As the conversation continues, event compaction automatically summarizes past turns every 2 invocations, while context caching optimizes token usage.* - -## Graph - -```mermaid -graph TD - User[User Input] --> AppContainer[App: app] - subgraph AppContainer [App Container] - Plugins[Plugins: CountInvocation, SaveFilesAsArtifacts] --> GreeterAgent[root_agent: greeter_agent] - GreeterAgent --> Configs[Configs: EventCompaction, ContextCache] - end - AppContainer --> Response[User Response] -``` - -## How To - -### Wrapping an Agent in an App - -To configure application-level behaviors, instantiate an `App` object and pass your root agent to the `root_agent` parameter: - -```python -from google.adk import Agent -from google.adk.apps.app import App - -root_agent = Agent( - name="greeter_agent", - instruction="You are a friendly assistant.", -) - -app = App( - name="app", - root_agent=root_agent, -) -``` - -### Configuring Application Plugins - -Plugins provide cross-cutting capabilities (such as telemetry, custom logging, or artifact saving) across the entire application. Pass a list of plugin instances to `plugins`: - -```python -from google.adk.plugins.save_files_as_artifacts_plugin import SaveFilesAsArtifactsPlugin - -app = App( - name="app", - root_agent=root_agent, - plugins=[ - CountInvocationPlugin(), - SaveFilesAsArtifactsPlugin(), - ], -) -``` - -### Configuring Event Compaction and Caching - -The `App` container is also where you define long-term session behavior and optimization strategies: - -- **`events_compaction_config`**: Manages token usage by periodically summarizing older turns in a session. -- **`context_cache_config`**: Enables prompt caching across invocations to reduce latency and cost. - -```python -from google.adk.apps.app import EventsCompactionConfig -from google.adk.agents.context_cache_config import ContextCacheConfig - -app = App( - name="app", - root_agent=root_agent, - events_compaction_config=EventsCompactionConfig( - compaction_interval=2, - overlap_size=1, - ), - context_cache_config=ContextCacheConfig( - cache_intervals=10, - ttl_seconds=1800, - min_tokens=1000, - ), -) -``` diff --git a/contributing/samples/core/app/agent.py b/contributing/samples/core/app/agent.py deleted file mode 100644 index 85808b0f53..0000000000 --- a/contributing/samples/core/app/agent.py +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk import Agent -from google.adk.agents.base_agent import BaseAgent -from google.adk.agents.callback_context import CallbackContext -from google.adk.agents.context_cache_config import ContextCacheConfig -from google.adk.apps.app import App -from google.adk.apps.app import EventsCompactionConfig -from google.adk.models.llm_request import LlmRequest -from google.adk.plugins.base_plugin import BasePlugin -from google.adk.plugins.save_files_as_artifacts_plugin import SaveFilesAsArtifactsPlugin - - -class CountInvocationPlugin(BasePlugin): - """A custom plugin that counts agent and LLM invocations.""" - - def __init__(self) -> None: - """Initialize the plugin with counters.""" - super().__init__(name="count_invocation") - self.agent_count: int = 0 - self.llm_request_count: int = 0 - - async def before_agent_callback( - self, *, agent: BaseAgent, callback_context: CallbackContext - ) -> None: - """Count agent runs.""" - self.agent_count += 1 - print(f"[Plugin] Agent run count: {self.agent_count}") - - async def before_model_callback( - self, *, callback_context: CallbackContext, llm_request: LlmRequest - ) -> None: - """Count LLM requests.""" - self.llm_request_count += 1 - print(f"[Plugin] LLM request count: {self.llm_request_count}") - - -root_agent = Agent( - name="greeter_agent", - instruction="""\ -You are a friendly and helpful concierge assistant. Greet the user and answer their questions. -""", -) - - -app = App( - name="app", - root_agent=root_agent, - plugins=[ - CountInvocationPlugin(), - SaveFilesAsArtifactsPlugin(), - ], - events_compaction_config=EventsCompactionConfig( - compaction_interval=2, - overlap_size=1, - ), - context_cache_config=ContextCacheConfig( - cache_intervals=10, - ttl_seconds=1800, - min_tokens=1000, - ), -) diff --git a/contributing/samples/core/app/tests/hello.json b/contributing/samples/core/app/tests/hello.json deleted file mode 100644 index 9572ae3b1d..0000000000 --- a/contributing/samples/core/app/tests/hello.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Hello, who are you?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "greeter_agent", - "content": { - "parts": [ - { - "text": "Hello there! I'm a friendly and helpful concierge assistant, ready to answer your questions. My internal name is `greeter_agent`. How can I assist you today?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "greeter_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/app/tests/help_trip.json b/contributing/samples/core/app/tests/help_trip.json deleted file mode 100644 index 8e2ea4696f..0000000000 --- a/contributing/samples/core/app/tests/help_trip.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Can you help me plan a trip?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "greeter_agent", - "content": { - "parts": [ - { - "text": "Hello there! I'd be absolutely delighted to help you plan your trip. To get started, I'll need a little more information.\n\nCould you tell me:\n\n1. **Where are you hoping to go?** (e.g., a specific city, country, or region)\n2. **When are you planning to travel?** (e.g., specific dates, a season, or a general time of year)\n3. **What kind of trip are you envisioning?** (e.g., a relaxing beach vacation, an adventurous hiking trip, a cultural city break, a family holiday, etc.)\n4. **Who are you traveling with?** (e.g., solo, with a partner, family with kids, friends)\n5. **Do you have any specific interests or preferences?** (e.g., food, history, art, nature, nightlife, budget considerations)\n\nThe more details you can provide, the better I can assist you in creating an amazing itinerary!" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "greeter_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/app/tests/who_are_you.json b/contributing/samples/core/app/tests/who_are_you.json deleted file mode 100644 index 33111d1cb0..0000000000 --- a/contributing/samples/core/app/tests/who_are_you.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Who are you?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "greeter_agent", - "content": { - "parts": [ - { - "text": "Hello there! I'm a friendly and helpful concierge assistant. How can I assist you today?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "greeter_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/artifacts/README.md b/contributing/samples/core/artifacts/README.md deleted file mode 100644 index 4d0d498b53..0000000000 --- a/contributing/samples/core/artifacts/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# Artifacts Sample - -## Overview - -This sample demonstrates how to use the Artifacts feature in ADK to handle different media types (image, audio, video), formats (text, HTML), and artifact versions. Artifacts allow agents to save large pieces of data or binary files outside the main conversation history to avoid cluttering the LLM context window. The agent can then load these artifacts when needed. - -This sample showcases: - -- Generating and saving a valid **Image** (BMP). -- Generating and saving a valid **Audio** file (WAV). -- Generating and saving a valid **Video** file (MP4) using OpenCV. -- Generating reports in both **Text** and **HTML** formats. -- Automatic handling of **Artifact Versions**. - -## Sample Inputs - -- `Generate a text report about AI agents` - -- `Generate an HTML report about AI agents` - -- `Generate a dummy image artifact` - -- `Generate a dummy audio artifact` - -- `Generate a dummy video artifact` - -- `Load the latest version of the image artifact` - -## Graph - -```mermaid -graph TD - START --> artifacts_agent -``` - -## How To - -1. **Text and HTML Reports**: The `generate_report` tool allows generating reports in either `text` or `html` format. It saves the content with the appropriate MIME type (`text/plain` or `text/html`) and file extension (`.txt` or `.html`). -1. **Media Artifacts**: The `generate_media_artifact` tool demonstrates how to save binary data (image, audio, video) as artifacts using `types.Part.from_bytes` and `ctx.save_artifact`. - - **Image**: Generated manually as a valid 100x100 red BMP file using standard libraries. - - **Audio**: Generated manually as a valid 1-second sine wave WAV file using standard libraries. - - **Video**: Generated as a valid 3-second MP4 file with a moving square using OpenCV (codec `avc1` for better compatibility). -1. **Versioning**: The `generate_report` tool creates a new version of the artifact every time it is called with the same format (`text` or `html`), as it uses fixed filenames (`report.txt` or `report.html`). The version number is returned to the user. -1. **Loading Latest Version**: The standard `LoadArtifactsTool` (available as `load_artifacts` to the model) can be used to load the latest version of any artifact, including media files. - -## Dependencies - -To generate the video artifact, the sample requires `opencv-python` and `numpy`. You can install them with: - -```bash -pip install opencv-python numpy -``` - -If these libraries are not installed, the tool will return a helpful error message explaining how to install them, while image and audio generation will still work. diff --git a/contributing/samples/core/artifacts/agent.py b/contributing/samples/core/artifacts/agent.py deleted file mode 100644 index 76f80bb289..0000000000 --- a/contributing/samples/core/artifacts/agent.py +++ /dev/null @@ -1,217 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import math -import os -import struct -import tempfile -import wave - -from google.adk import Agent -from google.adk import Context -from google.adk.tools.load_artifacts_tool import LoadArtifactsTool -from google.genai import types - - -def generate_wav(filename: str): - """Generates a simple valid WAV file (a 440Hz sine wave).""" - sample_rate = 44100.0 - duration = 1.0 # seconds - frequency = 440.0 # sine wave frequency (A4) - num_samples = int(sample_rate * duration) - - with wave.open(filename, "w") as wav_file: - wav_file.setnchannels(1) - wav_file.setsampwidth(2) - wav_file.setframerate(int(sample_rate)) - for i in range(num_samples): - value = int( - 32767.0 * math.sin(2.0 * math.pi * frequency * i / sample_rate) - ) - wav_file.writeframes(struct.pack(" dict: - """Generates a report on a topic and saves it as an artifact. - - Args: - topic: The topic of the report. - ctx: The tool context for saving artifacts. - format: The format of the report ('text' or 'html'). - """ - if format.lower() == "html": - mime_type = "text/html" - filename = "report.html" - content = f""" -Report on {topic} - -

REPORT: {topic}

-
-

This is a detailed report about {topic}.

-

It contains a lot of useful information that would clutter the conversation history.

-
    -
  • Key point 1
  • -
  • Key point 2
  • -
  • Key point 3
  • -
- -""" - else: - mime_type = "text/plain" - filename = "report.txt" - content = f"""REPORT: {topic} -========================================= -This is a detailed report about {topic}. -It contains a lot of useful information that would clutter the conversation history. -- Key point 1 -- Key point 2 -- Key point 3 -""" - - version = await ctx.save_artifact( - filename, - types.Part.from_bytes(data=content.encode("utf-8"), mime_type=mime_type), - ) - return { - "message": ( - f"Report on {topic} saved as artifact '{filename}' (version" - f" {version})." - ), - "filename": filename, - "version": version, - } - - -async def generate_media_artifact(media_type: str, ctx: Context) -> dict: - """Generates a valid media artifact of specified type. - - Args: - media_type: One of 'image', 'audio', 'video'. - ctx: The tool context for saving artifacts. - """ - - with tempfile.TemporaryDirectory() as tmpdir: - if media_type == "image": - mime_type = "image/bmp" - file_path = os.path.join(tmpdir, "sample.bmp") - generate_bmp(file_path) - filename = "sample_image.bmp" - elif media_type == "audio": - mime_type = "audio/wav" - file_path = os.path.join(tmpdir, "sample.wav") - generate_wav(file_path) - filename = "sample_audio.wav" - elif media_type == "video": - mime_type = "video/mp4" - file_path = os.path.join(tmpdir, "sample.mp4") - try: - generate_video(file_path) - except (ImportError, RuntimeError) as e: - return {"error": str(e)} - filename = "sample_video.mp4" - else: - return {"error": f"Unsupported media type: {media_type}"} - - with open(file_path, "rb") as f: - data = f.read() - - version = await ctx.save_artifact( - filename, - types.Part.from_bytes(data=data, mime_type=mime_type), - ) - - return { - "message": ( - f"Media artifact '{filename}' generated and saved (version" - f" {version})." - ), - "filename": filename, - "version": version, - } - - -root_agent = Agent( - name="artifacts_agent", - tools=[generate_report, generate_media_artifact, LoadArtifactsTool()], - instruction="""You are an agent that can manage artifacts, including different media types. - - - To generate a text report, use `generate_report`. - - To generate image, audio, or video artifacts, use `generate_media_artifact`. - - When the user asks about an artifact or to load it, use `load_artifacts`. - """, -) diff --git a/contributing/samples/core/callbacks/README.md b/contributing/samples/core/callbacks/README.md deleted file mode 100644 index 9b72046d02..0000000000 --- a/contributing/samples/core/callbacks/README.md +++ /dev/null @@ -1,114 +0,0 @@ -# Callback Sample - -## Overview - -This sample demonstrates how to use callbacks in ADK to intercept and handle events. Specifically, it shows: - -1. **`before_tool_callback`**: Intercepts tool calls and conditionally short-circuits them. -1. **`before_model_callback`**: Intercepts requests to the LLM and conditionally short-circuits them. -1. **`after_model_callback`**: Runs after the model completes, allowing you to inspect or modify the response (e.g., appending token usage). - -## Sample Inputs - -- `What is the weather in Paris?` - - *Calls the tool normally* - -- `What is the weather in London?` - - *Intercepted by the before_tool_callback and returns a mock response* - -- `Hi` - - *Intercepted by the before_model_callback and returns a direct response* - -## How To - -### Tool Callback - -The sample defines a `before_tool_callback` function: - -```python -def before_tool_callback( - tool: BaseTool, - args: dict[str, Any], - tool_context: ToolContext, -) -> dict[str, Any] | None: - # Intercept tool calls for London and return a mocked response - if args.get("city") == "London": - return { - "result": "Weather in London is always rainy (intercepted by callback)." - } - - return None -``` - -If the function returns a dictionary with a `result` key (or any other response data), ADK uses that as the tool output and skips calling the actual tool. - -### Model Callback - -The sample also defines a `before_model_callback` function: - -```python -def before_model_callback( - callback_context: CallbackContext, - llm_request: LlmRequest, -) -> LlmResponse | None: - # Short-circuit if the user simply says "Hi" - if llm_request.contents: - last_content = llm_request.contents[-1] - if last_content.parts: - last_part = last_content.parts[-1] - if last_part.text and last_part.text.strip().lower() == "hi": - return LlmResponse( - content=types.Content( - role="model", - parts=[ - types.Part.from_text( - text="Hello from before_model callback!" - ) - ], - ) - ) - - return None -``` - -If this function returns an `LlmResponse`, ADK skips calling the LLM and returns this response to the user. - -### After Model Callback - -The sample also defines an `after_model_callback` function: - -```python -def after_model_callback( - callback_context: CallbackContext, - llm_response: LlmResponse, -) -> LlmResponse: - # Append token usage to the response text if available - if llm_response.usage_metadata: - usage = llm_response.usage_metadata - usage_text = f"\n\nafter_model_callback: [Token Usage: Input={usage.prompt_token_count}, Output={usage.candidates_token_count}]" - - if not llm_response.content: - llm_response.content = types.Content(role="model", parts=[]) - - llm_response.content.parts.append(types.Part.from_text(text=usage_text)) - - return llm_response - -``` - -This callback runs after the LLM returns a response. It checks if `usage_metadata` is available in the `llm_response`, constructs a string with input and output token counts, and appends it as a new part to the content. - -All callbacks are registered in the `Agent` constructor: - -```python -root_agent = Agent( - name="callback_demo_agent", - tools=[get_weather], - before_tool_callback=before_tool_callback, - before_model_callback=before_model_callback, - after_model_callback=after_model_callback, -) -``` diff --git a/contributing/samples/core/callbacks/agent.py b/contributing/samples/core/callbacks/agent.py deleted file mode 100644 index f3980bf62c..0000000000 --- a/contributing/samples/core/callbacks/agent.py +++ /dev/null @@ -1,118 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from typing import Any - -from google.adk.agents import Agent -from google.adk.agents.callback_context import CallbackContext -from google.adk.models.llm_request import LlmRequest -from google.adk.models.llm_response import LlmResponse -from google.adk.tools import BaseTool -from google.adk.tools import ToolContext -from google.genai import types - - -def get_weather(city: str) -> str: - return f"The weather in {city} is sunny." - - -def before_tool_callback( - tool: BaseTool, - args: dict[str, Any], - tool_context: ToolContext, -) -> dict[str, Any] | None: - """A callback that runs before a tool is called. - - Args: - tool: The tool instance being called. - args: The arguments passed to the tool. - tool_context: The context for the tool execution. - - Returns: - A dict containing the mock response if the call should be short-circuited, - or None to proceed with the actual tool call. - """ - # Intercept tool calls for London and return a mocked response - if args.get("city") == "London": - return { - "result": "Weather in London is always rainy (intercepted by callback)." - } - - return None - - -def before_model_callback( - callback_context: CallbackContext, - llm_request: LlmRequest, -) -> LlmResponse | None: - """A callback that runs before the model is called. - - Args: - callback_context: The context for the callback. - llm_request: The request that is about to be sent to the model. - - Returns: - An LlmResponse to short-circuit the model call, or None to proceed. - """ - # Short-circuit if the user simply says "Hi" - if llm_request.contents: - last_content = llm_request.contents[-1] - if last_content.parts: - last_part = last_content.parts[-1] - if last_part.text and last_part.text.strip().lower() == "hi": - return LlmResponse( - content=types.Content( - role="model", - parts=[ - types.Part.from_text( - text="Hello from before_model callback!" - ) - ], - ) - ) - - return None - - -def after_model_callback( - callback_context: CallbackContext, - llm_response: LlmResponse, -) -> LlmResponse: - """A callback that runs after the model is called.""" - if llm_response.usage_metadata: - usage = llm_response.usage_metadata - usage_text = ( - "\n\nafter_model_callback: [Token Usage:" - f" Input={usage.prompt_token_count}," - f" Output={usage.candidates_token_count}]" - ) - - if not llm_response.content: - llm_response.content = types.Content(role="model", parts=[]) - - llm_response.content.parts.append(types.Part.from_text(text=usage_text)) - print(llm_response.content) - - return llm_response - - -root_agent = Agent( - name="callback_demo_agent", - tools=[get_weather], - before_tool_callback=before_tool_callback, - before_model_callback=before_model_callback, - after_model_callback=after_model_callback, -) diff --git a/contributing/samples/core/callbacks/tests/hi.json b/contributing/samples/core/callbacks/tests/hi.json deleted file mode 100644 index 32e4524d52..0000000000 --- a/contributing/samples/core/callbacks/tests/hi.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Hi" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "callback_demo_agent", - "content": { - "parts": [ - { - "text": "Hello from before_model callback!" - } - ], - "role": "model" - }, - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "callback_demo_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/callbacks/tests/weather_in_london.json b/contributing/samples/core/callbacks/tests/weather_in_london.json deleted file mode 100644 index 15a0b6090e..0000000000 --- a/contributing/samples/core/callbacks/tests/weather_in_london.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "weather in London" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "callback_demo_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "city": "London" - }, - "id": "fc-1", - "name": "get_weather" - } - }, - { - "text": "\n\nafter_model_callback: [Token Usage: Input=22, Output=5]" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "callback_demo_agent@1" - } - }, - { - "author": "callback_demo_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "get_weather", - "response": { - "result": "Weather in London is always rainy (intercepted by callback)." - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "callback_demo_agent@1" - } - }, - { - "author": "callback_demo_agent", - "content": { - "parts": [ - { - "text": "The weather in London is always rainy (intercepted by callback)." - }, - { - "text": "\n\nafter_model_callback: [Token Usage: Input=133, Output=13]" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "callback_demo_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/callbacks/tests/weather_in_sunnyvale.json b/contributing/samples/core/callbacks/tests/weather_in_sunnyvale.json deleted file mode 100644 index da6bb98c88..0000000000 --- a/contributing/samples/core/callbacks/tests/weather_in_sunnyvale.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "weather in Sunnyvale" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "callback_demo_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "city": "Sunnyvale" - }, - "id": "fc-1", - "name": "get_weather" - } - }, - { - "text": "\n\nafter_model_callback: [Token Usage: Input=23, Output=6]" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "callback_demo_agent@1" - } - }, - { - "author": "callback_demo_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "get_weather", - "response": { - "result": "The weather in Sunnyvale is sunny." - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "callback_demo_agent@1" - } - }, - { - "author": "callback_demo_agent", - "content": { - "parts": [ - { - "text": "The weather in Sunnyvale is sunny." - }, - { - "text": "\n\nafter_model_callback: [Token Usage: Input=108, Output=8]" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "callback_demo_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/empty_agent/README.md b/contributing/samples/core/empty_agent/README.md deleted file mode 100644 index d535d12865..0000000000 --- a/contributing/samples/core/empty_agent/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# ADK Agent Empty Sample - -## Overview - -This sample demonstrates how to create a minimal, empty agent using the **ADK** framework. - -It defines a simple `Agent` that doesn't have any specific tools or complex instructions attached to it. This is useful as a basic template or starting point for defining more complex agentic behaviors over time, ensuring it follows the core directory requirements of `adk`. - -## Sample Inputs - -- `go` - -## Graph - -```mermaid -graph TD - empty_agent[Agent: empty_agent] -``` - -## How To - -1. Define a basic agent using the `Agent` class, specifying a unique name: - - ```python - from google.adk.agents import Agent - - root_agent = Agent( - name="empty_agent", - ) - ``` diff --git a/contributing/samples/core/empty_agent/agent.py b/contributing/samples/core/empty_agent/agent.py deleted file mode 100644 index c782157475..0000000000 --- a/contributing/samples/core/empty_agent/agent.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk.agents import Agent - -root_agent = Agent( - name="empty_agent", -) diff --git a/contributing/samples/core/empty_agent/tests/go.json b/contributing/samples/core/empty_agent/tests/go.json deleted file mode 100644 index 6eae19c48b..0000000000 --- a/contributing/samples/core/empty_agent/tests/go.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "go" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "empty_agent", - "content": { - "parts": [ - { - "text": "Okay, I'm ready! What would you like to do or talk about?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "empty_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/empty_agent/tests/hello.json b/contributing/samples/core/empty_agent/tests/hello.json deleted file mode 100644 index 81c8bfd5be..0000000000 --- a/contributing/samples/core/empty_agent/tests/hello.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Hello" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "empty_agent", - "content": { - "parts": [ - { - "text": "Hello there! How can I help you today?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "empty_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/empty_agent/tests/how_are_you.json b/contributing/samples/core/empty_agent/tests/how_are_you.json deleted file mode 100644 index 5242b78ec1..0000000000 --- a/contributing/samples/core/empty_agent/tests/how_are_you.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "How are you?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "empty_agent", - "content": { - "parts": [ - { - "text": "As an AI, I don't have feelings or a physical state, so I can't be \"fine\" in the human sense. However, I'm ready and operational to help you!\n\nHow can I assist you today?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "empty_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/hello_world/README.md b/contributing/samples/core/hello_world/README.md deleted file mode 100644 index 9e33186374..0000000000 --- a/contributing/samples/core/hello_world/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Hello World Assistant - -## Overview - -This sample demonstrates a foundational ADK standalone agent that interacts with a user, manages session state via `ToolContext`, and uses multiple tools. Specifically, it features a `hello_world_agent` that can roll an N-sided die (storing roll history in the session state) and check whether numbers in a list are prime. - -## Sample Inputs - -- `Hi` - - *General greeting that does not trigger tool calls.* - -- `Roll a dice with 100 sides` - - *The agent invokes the `roll_die` tool with `sides=100`. The rolled result is appended to the session's `ToolContext` state under the `'rolls'` key.* - -- `Roll a dice again with 100 sides.` - - *The agent invokes `roll_die` again, appending a second roll to the session state.* - -- `What numbers did I got?` - - *The agent references the conversation history and previous tool outcomes to summarize the rolled numbers.* - -- `Roll a die with 8 sides and check if the result is prime.` - - *Demonstrates multi-step tool orchestration. The agent first calls `roll_die(sides=8)`, waits for the response, and then calls `check_prime(nums=[...])` with the rolled result before formulating its final response.* - -## Graph - -```mermaid -graph TD - Agent[Agent: hello_world_agent] --> Tool1[Tool: roll_die] - Agent --> Tool2[Tool: check_prime] -``` - -## How To - -### 1. Defining Tools with ToolContext - -Demonstrates how tools can access and modify persistent session state by including `tool_context: ToolContext` as a parameter. - -```python -def roll_die(sides: int, tool_context: ToolContext) -> int: - result = random.randint(1, sides) - if not 'rolls' in tool_context.state: - tool_context.state['rolls'] = [] - tool_context.state['rolls'] = tool_context.state['rolls'] + [result] - return result -``` - -### 2. Configuring Safety Settings - -Demonstrates adjusting `GenerateContentConfig` safety settings to prevent false alarms (e.g., avoiding harm category triggers when discussing rolling dice). - -```python -root_agent = Agent( - model='gemini-3-flash-preview', - name='hello_world_agent', - ... - generate_content_config=types.GenerateContentConfig( - safety_settings=[ - types.SafetySetting( - category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, - threshold=types.HarmBlockThreshold.OFF, - ), - ] - ), -) -``` - -### 3. Running and Inspecting the Agent Programmatically - -You can execute the agent and inspect its session state programmatically by initializing an `InMemoryRunner`, creating a session, and executing prompts asynchronously: - -```python -runner = InMemoryRunner(agent=agent.root_agent, app_name='my_app') -session = await runner.session_service.create_session('my_app', 'user1') - -async for event in runner.run_async( - user_id='user1', - session_id=session.id, - new_message=types.Content(...), -): - # Process execution events - pass - -# Inspect modified session state -session = await runner.session_service.get_session('my_app', 'user1', session.id) -print(session.state['rolls']) -``` diff --git a/contributing/samples/core/hello_world/tests/check_prime.json b/contributing/samples/core/hello_world/tests/check_prime.json deleted file mode 100644 index 2f8280d795..0000000000 --- a/contributing/samples/core/hello_world/tests/check_prime.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Check if 7 and 10 are prime numbers" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "hello_world_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "nums": [ - 7, - 10 - ] - }, - "id": "fc-1", - "name": "check_prime" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "hello_world_agent@1" - } - }, - { - "author": "hello_world_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "check_prime", - "response": { - "result": "7 are prime numbers." - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "hello_world_agent@1" - } - }, - { - "author": "hello_world_agent", - "content": { - "parts": [ - { - "text": "7 are prime numbers." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "hello_world_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/hello_world/tests/roll_and_check.json b/contributing/samples/core/hello_world/tests/roll_and_check.json deleted file mode 100644 index c734bac921..0000000000 --- a/contributing/samples/core/hello_world/tests/roll_and_check.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Roll a 10-sided die and check if the result is prime" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "hello_world_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "sides": 10 - }, - "id": "fc-1", - "name": "roll_die" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "hello_world_agent@1" - } - }, - { - "actions": { - "stateDelta": { - "rolls": [ - 2 - ] - } - }, - "author": "hello_world_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "roll_die", - "response": { - "result": 2 - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "hello_world_agent@1" - } - }, - { - "author": "hello_world_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "nums": [ - 2 - ] - }, - "id": "fc-2", - "name": "check_prime" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "hello_world_agent@1" - } - }, - { - "author": "hello_world_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "check_prime", - "response": { - "result": "2 are prime numbers." - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "hello_world_agent@1" - } - }, - { - "author": "hello_world_agent", - "content": { - "parts": [ - { - "text": "I rolled a 10-sided die and got a 2.\n2 are prime numbers." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "hello_world_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/hello_world/tests/roll_die.json b/contributing/samples/core/hello_world/tests/roll_die.json deleted file mode 100644 index 13354fa849..0000000000 --- a/contributing/samples/core/hello_world/tests/roll_die.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Roll a 6-sided die" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "hello_world_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "sides": 6 - }, - "id": "fc-1", - "name": "roll_die" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "hello_world_agent@1" - } - }, - { - "actions": { - "stateDelta": { - "rolls": [ - 6 - ] - } - }, - "author": "hello_world_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "roll_die", - "response": { - "result": 6 - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "hello_world_agent@1" - } - }, - { - "author": "hello_world_agent", - "content": { - "parts": [ - { - "text": "You rolled a 6-sided die and got a 6." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "hello_world_agent@1" - } - } - ], - "mocks": { - "random.randint": [ - 6 - ] - } -} diff --git a/contributing/samples/core/input_output_schema/README.md b/contributing/samples/core/input_output_schema/README.md deleted file mode 100644 index 68e8b7c1fe..0000000000 --- a/contributing/samples/core/input_output_schema/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# Input and Output Schema - -## Overview - -This sample demonstrates how to configure structured `input_schema` and `output_schema` on an ADK agent. When configured with these schemas and `mode='single_turn'`, the agent can be seamlessly used as a structured tool by a parent agent. - -## Sample Inputs - -- `What is the weather in San Jose?` - - *The parent agent calls `weather_agent` with `{"city": "San Jose"}`. The sub-agent returns `{"temperature": "26 C", "conditions": "Sunny"}`. The parent agent then formulates a friendly response.* - -- `Can you check the weather for Cupertino?` - - *The parent agent calls `weather_agent` with `{"city": "Cupertino"}`. The sub-agent returns `{"temperature": "16 C", "conditions": "Foggy"}`.* - -## Graph - -```mermaid -graph TD - User[User Input] --> RootAgent[root_agent] - RootAgent -- Tool Call: CityQuery --> WeatherAgent[weather_agent] - WeatherAgent -- Structured Output: WeatherInfo --> RootAgent - RootAgent --> Response[User Response] -``` - -## How To - -### Configuring Input and Output Schemas - -To define structured input and output contracts for an agent, pass Pydantic models to the `input_schema` and `output_schema` parameters of the `Agent` constructor: - -```python -class CityQuery(BaseModel): - city: str = Field(description="The name of the city") - -class WeatherInfo(BaseModel): - temperature: str = Field(description="The temperature in Celsius") - conditions: str = Field(description="The weather condition") - -weather_agent = Agent( - name="weather_agent", - mode="single_turn", - input_schema=CityQuery, - output_schema=WeatherInfo, - instruction="Provide weather information for the requested city.", -) -``` - -### Using the Agent as a Tool - -When `weather_agent` is included in the `sub_agents` list of `root_agent`, the ADK framework automatically wraps it in an `AgentTool`. The parent agent sees a tool that accepts `CityQuery` parameters and returns `WeatherInfo`. - -When the tool is invoked, the framework executes `weather_agent` in an isolated context, validates its input against `input_schema`, and validates its generated response against `output_schema`. diff --git a/contributing/samples/core/input_output_schema/agent.py b/contributing/samples/core/input_output_schema/agent.py deleted file mode 100644 index 0c782aa20f..0000000000 --- a/contributing/samples/core/input_output_schema/agent.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk import Agent -from pydantic import BaseModel -from pydantic import Field - - -class CityQuery(BaseModel): - city: str = Field( - description='The name of the city to query weather for, e.g. San Jose' - ) - - -class WeatherInfo(BaseModel): - temperature: str = Field(description='The temperature in Celsius') - conditions: str = Field(description='The weather condition, e.g. Sunny') - - -weather_agent = Agent( - name='weather_agent', - mode='single_turn', - input_schema=CityQuery, - output_schema=WeatherInfo, - instruction="""\ -Provide weather information for the requested city. - -For San Jose, return temperature: 26 C, conditions: Sunny. -For Cupertino, return temperature: 16 C, conditions: Foggy. -For any other city, return temperature: unknown, conditions: unknown. -""", -) - -root_agent = Agent( - name='root_agent', - instruction="""\ -You are a helpful weather concierge assistant. Use the weather_agent tool to get weather information for the user's city, and then answer the user in a friendly manner. -""", - sub_agents=[weather_agent], -) diff --git a/contributing/samples/core/input_output_schema/tests/weather_cupertino.json b/contributing/samples/core/input_output_schema/tests/weather_cupertino.json deleted file mode 100644 index a036ca8fb7..0000000000 --- a/contributing/samples/core/input_output_schema/tests/weather_cupertino.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What is the weather in Cupertino?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "city": "Cupertino" - }, - "id": "fc-1", - "name": "weather_agent" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "weather_agent", - "branch": "weather_agent@1", - "content": { - "parts": [ - { - "text": "{\"temperature\": \"16 C\", \"conditions\": \"Foggy\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/weather_agent@1" - ], - "path": "root_agent@1/weather_agent@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "weather_agent", - "response": { - "conditions": "Foggy", - "temperature": "16 C" - } - } - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "The weather in Cupertino is Foggy with a temperature of 16 C.\n" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/input_output_schema/tests/weather_sanjose.json b/contributing/samples/core/input_output_schema/tests/weather_sanjose.json deleted file mode 100644 index 8b76e47add..0000000000 --- a/contributing/samples/core/input_output_schema/tests/weather_sanjose.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What is the weather in San Jose?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "city": "San Jose" - }, - "id": "fc-1", - "name": "weather_agent" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "weather_agent", - "branch": "weather_agent@1", - "content": { - "parts": [ - { - "text": "{\"temperature\": \"26 C\", \"conditions\": \"Sunny\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/weather_agent@1" - ], - "path": "root_agent@1/weather_agent@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "weather_agent", - "response": { - "conditions": "Sunny", - "temperature": "26 C" - } - } - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "The weather in San Jose is sunny with a temperature of 26 degrees Celsius. Enjoy your day!" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/input_output_schema/tests/weather_tokyo.json b/contributing/samples/core/input_output_schema/tests/weather_tokyo.json deleted file mode 100644 index e531c244ab..0000000000 --- a/contributing/samples/core/input_output_schema/tests/weather_tokyo.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What is the weather in Tokyo?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "city": "Tokyo" - }, - "id": "fc-1", - "name": "weather_agent" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "weather_agent", - "branch": "weather_agent@1", - "content": { - "parts": [ - { - "text": "{\"temperature\": \"unknown\", \"conditions\": \"unknown\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/weather_agent@1" - ], - "path": "root_agent@1/weather_agent@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "weather_agent", - "response": { - "conditions": "unknown", - "temperature": "unknown" - } - } - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "I'm sorry, I don't have the current weather information for Tokyo." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/logprobs/README.md b/contributing/samples/core/logprobs/README.md deleted file mode 100644 index b149cf1506..0000000000 --- a/contributing/samples/core/logprobs/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# Log Probabilities Demo Agent - -## Overview - -This sample demonstrates how to access and display log probabilities from language model responses using the `avg_logprobs` and `logprobs_result` fields in `LlmResponse`. It shows how to configure an ADK agent to request log probabilities and how to use an `after_model_callback` to analyze and append confidence metrics to the response. - -## Sample Inputs - -- `What is the capital of France?` - - *A factual, straightforward question. The agent will answer confidently (e.g., "Paris"), resulting in a high average log probability and confidence score near 100%.* - -- `What are the philosophical implications of artificial consciousness?` - - *A complex, open-ended question. The agent will provide a nuanced answer with varied vocabulary, resulting in a lower average log probability and medium/low confidence score.* - -## Graph - -```mermaid -graph TD - User[User Input] --> RootAgent[root_agent: logprobs_demo_agent] - RootAgent --> Callback[after_model_callback: append_logprobs_to_response] - Callback -- Appended Logprobs Analysis --> Response[User Response] -``` - -## How To - -### 1. Enabling Log Probabilities - -To enable log probability collection, configure `generate_content_config` on the `Agent` using `types.GenerateContentConfig`: - -```python -from google.genai import types - -root_agent = Agent( - name="logprobs_demo_agent", - generate_content_config=types.GenerateContentConfig( - response_logprobs=True, # Enable log probability collection - logprobs=5, # Collect top 5 alternatives for analysis - temperature=0.7, - ), - after_model_callback=append_logprobs_to_response, -) -``` - -### 2. Extracting Log Probabilities in a Callback - -The `after_model_callback` receives the `LlmResponse` object, which contains the `avg_logprobs` and `logprobs_result` fields. You can use this data for confidence analysis, quality filtering, or appending information to the response content: - -```python -async def append_logprobs_to_response( - callback_context: CallbackContext, llm_response: LlmResponse -) -> LlmResponse: - if llm_response.avg_logprobs is not None: - print(f"📊 Average log probability: {llm_response.avg_logprobs:.4f}") - - # Analyze confidence - confidence_level = ( - "High" if llm_response.avg_logprobs >= -0.5 - else "Medium" if llm_response.avg_logprobs >= -1.0 - else "Low" - ) - - # Access detailed candidates - if llm_response.logprobs_result and llm_response.logprobs_result.top_candidates: - num_candidates = len(llm_response.logprobs_result.top_candidates) - - return llm_response -``` - -### 3. Understanding Log Probabilities - -- **Range**: -∞ to 0 (0 = 100% confident, -1 ≈ 37% confident, -2 ≈ 14% confident) -- **Confidence Levels**: - - **High**: `>= -0.5` (typically factual, straightforward responses) - - **Medium**: `-1.0` to `-0.5` (reasonably confident responses) - - **Low**: `< -1.0` (uncertain or complex responses) -- **Use Cases**: Quality control, uncertainty detection, and response filtering. diff --git a/contributing/samples/core/logprobs/tests/hello.json b/contributing/samples/core/logprobs/tests/hello.json deleted file mode 100644 index d68ed085f5..0000000000 --- a/contributing/samples/core/logprobs/tests/hello.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Hello" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "logprobs_demo_agent", - "content": { - "parts": [ - { - "text": "Hello there! How can I help you today?" - }, - { - "text": "\n\n---\n\n### \ud83d\udcca Log Probability Analysis\n\n* **Average Log Probability**: -0.1564\n* **Confidence Level**: High\n* **Confidence Score**: 89.7%\n* **Top Alternatives Analyzed**: 10" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "logprobs_demo_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/logprobs/tests/tell_joke.json b/contributing/samples/core/logprobs/tests/tell_joke.json deleted file mode 100644 index 514e1e965d..0000000000 --- a/contributing/samples/core/logprobs/tests/tell_joke.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Tell me a joke" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "logprobs_demo_agent", - "content": { - "parts": [ - { - "text": "Why don't scientists trust atoms?\n\nBecause they make up everything!" - }, - { - "text": "\n\n---\n\n### \ud83d\udcca Log Probability Analysis\n\n* **Average Log Probability**: -0.4411\n* **Confidence Level**: High\n* **Confidence Score**: 73.7%\n* **Top Alternatives Analyzed**: 15" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "logprobs_demo_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/logprobs/tests/what_is_ai.json b/contributing/samples/core/logprobs/tests/what_is_ai.json deleted file mode 100644 index 2c31a79987..0000000000 --- a/contributing/samples/core/logprobs/tests/what_is_ai.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What is AI?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "logprobs_demo_agent", - "content": { - "parts": [ - { - "text": "Artificial Intelligence (AI) refers to the simulation of human intelligence processes by machines, especially computer systems. These processes include learning (the acquisition of information and rules for using the information), reasoning (using rules to reach approximate or definite conclusions), and self-correction.\n\nThe ultimate goal of AI is to enable machines to perform tasks that typically require human intelligence, such as understanding natural language, recognizing patterns, solving problems, making decisions, and even learning from experience." - }, - { - "text": "\n\n---\n\n### \ud83d\udcca Log Probability Analysis\n\n* **Average Log Probability**: -0.1382\n* **Confidence Level**: High\n* **Confidence Score**: 90.9%\n* **Top Alternatives Analyzed**: 92" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "logprobs_demo_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/quickstart/README.md b/contributing/samples/core/quickstart/README.md deleted file mode 100644 index 4d66f248c8..0000000000 --- a/contributing/samples/core/quickstart/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# Weather & Time Quickstart Agent - -## Overview - -This sample demonstrates a fundamental standalone ADK `Agent` configured with multiple tools. It illustrates how an agent can autonomously select and execute Python functions (`get_weather` and `get_current_time`) to gather real-world information and answer user inquiries. - -## Sample Inputs - -- `What is the weather in New York?` - - *The agent will invoke the `get_weather` tool with `city="New York"` and return the current weather report.* - -- `What time is it in New York?` - - *The agent will invoke the `get_current_time` tool with `city="New York"` and return the current timestamp.* - -- `Can you tell me the weather in Tokyo?` - - *The agent will attempt to invoke `get_weather`, which returns an error status for cities other than New York, and gracefully explain that the information is unavailable.* - -## Graph - -```mermaid -graph TD - User[User Input] --> RootAgent[root_agent: weather_time_agent] - RootAgent -.->|Tool Call: get_weather| WeatherTool[get_weather] - WeatherTool -.->|Tool Result| RootAgent - RootAgent -.->|Tool Call: get_current_time| TimeTool[get_current_time] - TimeTool -.->|Tool Result| RootAgent - RootAgent --> Response[User Response] -``` - -## How To - -### 1. Defining Tools - -In ADK, standard Python functions with type hints and docstrings can be used directly as tools. The docstring and parameter type hints inform the language model when and how to invoke the function: - -```python -def get_weather(city: str) -> dict: - """Retrieves the current weather report for a specified city. - - Args: - city (str): The name of the city for which to retrieve the weather report. - - Returns: - dict: status and result or error msg. - """ - if city.lower() == "new york": - return { - "status": "success", - "report": ( - "The weather in New York is sunny with a temperature of 25 degrees" - " Celsius (77 degrees Fahrenheit)." - ), - } - else: - return { - "status": "error", - "error_message": f"Weather information for '{city}' is not available.", - } -``` - -### 2. Configuring the Agent - -To equip an agent with tools, instantiate an `Agent` and pass the functions in the `tools` parameter list, along with clear instructions and description: - -```python -from google.adk.agents.llm_agent import Agent - -root_agent = Agent( - name="weather_time_agent", - description=( - "Agent to answer questions about the time and weather in a city." - ), - instruction=( - "I can answer your questions about the time and weather in a city." - ), - tools=[get_weather, get_current_time], -) -``` diff --git a/contributing/samples/core/quickstart/tests/time_ny.json b/contributing/samples/core/quickstart/tests/time_ny.json deleted file mode 100644 index 01fcb6635d..0000000000 --- a/contributing/samples/core/quickstart/tests/time_ny.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What time is it in New York?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "weather_time_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "city": "New York" - }, - "id": "fc-1", - "name": "get_current_time" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "weather_time_agent@1" - } - }, - { - "author": "weather_time_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "get_current_time", - "response": { - "report": "The current time in New York is 2026-05-15 12:00:00 EDT-0400", - "status": "success" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "weather_time_agent@1" - } - }, - { - "author": "weather_time_agent", - "content": { - "parts": [ - { - "text": "The current time in New York is 2026-05-15 12:00:00 EDT-0400." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "weather_time_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/quickstart/tests/weather_ny.json b/contributing/samples/core/quickstart/tests/weather_ny.json deleted file mode 100644 index 98fd351fcf..0000000000 --- a/contributing/samples/core/quickstart/tests/weather_ny.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What is the weather in New York?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "weather_time_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "city": "New York" - }, - "id": "fc-1", - "name": "get_weather" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "weather_time_agent@1" - } - }, - { - "author": "weather_time_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "get_weather", - "response": { - "report": "The weather in New York is sunny with a temperature of 25 degrees Celsius (77 degrees Fahrenheit).", - "status": "success" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "weather_time_agent@1" - } - }, - { - "author": "weather_time_agent", - "content": { - "parts": [ - { - "text": "The weather in New York is sunny with a temperature of 25 degrees Celsius (77 degrees Fahrenheit)." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "weather_time_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/quickstart/tests/weather_time_ny.json b/contributing/samples/core/quickstart/tests/weather_time_ny.json deleted file mode 100644 index df5612e7ff..0000000000 --- a/contributing/samples/core/quickstart/tests/weather_time_ny.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What is the weather and time in New York?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "weather_time_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "city": "New York" - }, - "id": "fc-1", - "name": "get_weather" - } - }, - { - "functionCall": { - "args": { - "city": "New York" - }, - "id": "fc-2", - "name": "get_current_time" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "weather_time_agent@1" - } - }, - { - "author": "weather_time_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "get_weather", - "response": { - "report": "The weather in New York is sunny with a temperature of 25 degrees Celsius (77 degrees Fahrenheit).", - "status": "success" - } - } - }, - { - "functionResponse": { - "id": "fc-2", - "name": "get_current_time", - "response": { - "report": "The current time in New York is 2026-05-15 12:00:00 EDT-0400", - "status": "success" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "weather_time_agent@1" - } - }, - { - "author": "weather_time_agent", - "content": { - "parts": [ - { - "text": "The weather in New York is sunny with a temperature of 25 degrees Celsius (77 degrees Fahrenheit). The current time in New York is 2026-05-15 12:00:00 EDT-0400." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "weather_time_agent@1" - } - } - ] -} diff --git a/contributing/samples/core/runner_debug_example/tests/stock_googl.json b/contributing/samples/core/runner_debug_example/tests/stock_googl.json deleted file mode 100644 index 5337530c5a..0000000000 --- a/contributing/samples/core/runner_debug_example/tests/stock_googl.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What's the stock price of GOOGL?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "ticker": "GOOGL" - }, - "id": "fc-1", - "name": "get_stock_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "agent@1" - } - }, - { - "author": "agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "get_stock_price", - "response": { - "result": "Price for GOOGL: 175.50 USD" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "agent@1" - } - }, - { - "author": "agent", - "content": { - "parts": [ - { - "text": "The current stock price for GOOGL is 175.50 USD." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "agent@1" - } - } - ] -} diff --git a/contributing/samples/core/runner_debug_example/tests/stock_nvda.json b/contributing/samples/core/runner_debug_example/tests/stock_nvda.json deleted file mode 100644 index d285358dea..0000000000 --- a/contributing/samples/core/runner_debug_example/tests/stock_nvda.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What's the stock price of NVDA?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "ticker": "NVDA" - }, - "id": "fc-1", - "name": "get_stock_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "agent@1" - } - }, - { - "author": "agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "get_stock_price", - "response": { - "result": "Price for NVDA: 125.00 USD" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "agent@1" - } - }, - { - "author": "agent", - "content": { - "parts": [ - { - "text": "The current stock price for NVDA is 125.00 USD." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "agent@1" - } - } - ] -} diff --git a/contributing/samples/core/runner_debug_example/tests/weather_sf.json b/contributing/samples/core/runner_debug_example/tests/weather_sf.json deleted file mode 100644 index 0f26d51b4d..0000000000 --- a/contributing/samples/core/runner_debug_example/tests/weather_sf.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What is the weather in San Francisco?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "city": "San Francisco" - }, - "id": "fc-1", - "name": "get_weather" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "agent@1" - } - }, - { - "actions": { - "stateDelta": { - "weather_queries": [ - "San Francisco" - ] - } - }, - "author": "agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "get_weather", - "response": { - "result": "Foggy, 15\u00b0C (59\u00b0F)" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "agent@1" - } - }, - { - "author": "agent", - "content": { - "parts": [ - { - "text": "The weather in San Francisco is foggy, with a temperature of 15\u00b0C (59\u00b0F). Is there anything else I can help you with?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "agent@1" - } - } - ] -} diff --git a/contributing/samples/config/core_basic_config/README.md b/contributing/samples/core_basic_config/README.md similarity index 100% rename from contributing/samples/config/core_basic_config/README.md rename to contributing/samples/core_basic_config/README.md diff --git a/contributing/samples/config/core_basic_config/root_agent.yaml b/contributing/samples/core_basic_config/root_agent.yaml similarity index 100% rename from contributing/samples/config/core_basic_config/root_agent.yaml rename to contributing/samples/core_basic_config/root_agent.yaml diff --git a/contributing/samples/config/core_callback_config/__init__.py b/contributing/samples/core_callback_config/__init__.py similarity index 100% rename from contributing/samples/config/core_callback_config/__init__.py rename to contributing/samples/core_callback_config/__init__.py diff --git a/contributing/samples/config/core_callback_config/callbacks.py b/contributing/samples/core_callback_config/callbacks.py similarity index 76% rename from contributing/samples/config/core_callback_config/callbacks.py rename to contributing/samples/core_callback_config/callbacks.py index 57f8d38675..1614a9351a 100644 --- a/contributing/samples/config/core_callback_config/callbacks.py +++ b/contributing/samples/core_callback_config/callbacks.py @@ -1,17 +1,3 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - from google.genai import types diff --git a/contributing/samples/config/core_callback_config/root_agent.yaml b/contributing/samples/core_callback_config/root_agent.yaml similarity index 100% rename from contributing/samples/config/core_callback_config/root_agent.yaml rename to contributing/samples/core_callback_config/root_agent.yaml diff --git a/contributing/samples/config/core_callback_config/tools.py b/contributing/samples/core_callback_config/tools.py similarity index 66% rename from contributing/samples/config/core_callback_config/tools.py rename to contributing/samples/core_callback_config/tools.py index 08531a971c..6d6e3111c8 100644 --- a/contributing/samples/config/core_callback_config/tools.py +++ b/contributing/samples/core_callback_config/tools.py @@ -1,17 +1,3 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - import random from google.adk.tools.tool_context import ToolContext diff --git a/contributing/samples/config/core_custom_agent_config/__init__.py b/contributing/samples/core_custom_agent_config/__init__.py similarity index 100% rename from contributing/samples/config/core_custom_agent_config/__init__.py rename to contributing/samples/core_custom_agent_config/__init__.py diff --git a/contributing/samples/config/core_custom_agent_config/my_agents.py b/contributing/samples/core_custom_agent_config/my_agents.py similarity index 100% rename from contributing/samples/config/core_custom_agent_config/my_agents.py rename to contributing/samples/core_custom_agent_config/my_agents.py diff --git a/contributing/samples/config/core_custom_agent_config/root_agent.yaml b/contributing/samples/core_custom_agent_config/root_agent.yaml similarity index 100% rename from contributing/samples/config/core_custom_agent_config/root_agent.yaml rename to contributing/samples/core_custom_agent_config/root_agent.yaml diff --git a/contributing/samples/config/core_generate_content_config_config/root_agent.yaml b/contributing/samples/core_generate_content_config_config/root_agent.yaml similarity index 100% rename from contributing/samples/config/core_generate_content_config_config/root_agent.yaml rename to contributing/samples/core_generate_content_config_config/root_agent.yaml diff --git a/contributing/samples/integrations/crewai_tool_kwargs/README.md b/contributing/samples/crewai_tool_kwargs/README.md similarity index 100% rename from contributing/samples/integrations/crewai_tool_kwargs/README.md rename to contributing/samples/crewai_tool_kwargs/README.md diff --git a/contributing/samples/environment_and_skills/local_environment/__init__.py b/contributing/samples/crewai_tool_kwargs/__init__.py similarity index 100% rename from contributing/samples/environment_and_skills/local_environment/__init__.py rename to contributing/samples/crewai_tool_kwargs/__init__.py diff --git a/contributing/samples/integrations/crewai_tool_kwargs/agent.py b/contributing/samples/crewai_tool_kwargs/agent.py similarity index 99% rename from contributing/samples/integrations/crewai_tool_kwargs/agent.py rename to contributing/samples/crewai_tool_kwargs/agent.py index 8853edb380..4583d9aa9c 100644 --- a/contributing/samples/integrations/crewai_tool_kwargs/agent.py +++ b/contributing/samples/crewai_tool_kwargs/agent.py @@ -95,6 +95,7 @@ def _run(self, query: str, **kwargs) -> str: ) root_agent = Agent( + model="gemini-2.5-flash", name="search_agent", description="An agent that can search with flexible filtering options", instruction=""" diff --git a/contributing/samples/integrations/crewai_tool_kwargs/main.py b/contributing/samples/crewai_tool_kwargs/main.py similarity index 100% rename from contributing/samples/integrations/crewai_tool_kwargs/main.py rename to contributing/samples/crewai_tool_kwargs/main.py diff --git a/contributing/samples/code_execution/custom_code_execution/README.md b/contributing/samples/custom_code_execution/README.md similarity index 100% rename from contributing/samples/code_execution/custom_code_execution/README.md rename to contributing/samples/custom_code_execution/README.md diff --git a/contributing/samples/environment_and_skills/local_environment_skill/__init__.py b/contributing/samples/custom_code_execution/__init__.py similarity index 100% rename from contributing/samples/environment_and_skills/local_environment_skill/__init__.py rename to contributing/samples/custom_code_execution/__init__.py diff --git a/contributing/samples/code_execution/custom_code_execution/agent.py b/contributing/samples/custom_code_execution/agent.py similarity index 99% rename from contributing/samples/code_execution/custom_code_execution/agent.py rename to contributing/samples/custom_code_execution/agent.py index 903b15025e..2c6efed348 100644 --- a/contributing/samples/code_execution/custom_code_execution/agent.py +++ b/contributing/samples/custom_code_execution/agent.py @@ -144,6 +144,7 @@ def base_system_instruction(): root_agent = Agent( + model="gemini-2.5-flash", name="data_science_agent", instruction=base_system_instruction() + """ diff --git a/contributing/samples/integrations/data_agent/README.md b/contributing/samples/data_agent/README.md similarity index 100% rename from contributing/samples/integrations/data_agent/README.md rename to contributing/samples/data_agent/README.md diff --git a/contributing/samples/environment_and_skills/skills_agent/__init__.py b/contributing/samples/data_agent/__init__.py similarity index 100% rename from contributing/samples/environment_and_skills/skills_agent/__init__.py rename to contributing/samples/data_agent/__init__.py diff --git a/contributing/samples/integrations/data_agent/agent.py b/contributing/samples/data_agent/agent.py similarity index 61% rename from contributing/samples/integrations/data_agent/agent.py rename to contributing/samples/data_agent/agent.py index 696430cf06..0ab675c387 100644 --- a/contributing/samples/integrations/data_agent/agent.py +++ b/contributing/samples/data_agent/agent.py @@ -12,22 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import annotations - -import asyncio import os -from typing import Any from google.adk.agents import Agent from google.adk.auth.auth_credential import AuthCredentialTypes -from google.adk.tools import load_artifacts from google.adk.tools.data_agent.config import DataAgentToolConfig from google.adk.tools.data_agent.credentials import DataAgentCredentialsConfig from google.adk.tools.data_agent.data_agent_toolset import DataAgentToolset -from google.adk.tools.tool_context import ToolContext import google.auth import google.auth.transport.requests -from google.genai import types # Define the desired credential type. # By default use Application Default Credentials (ADC) from the local @@ -79,63 +72,17 @@ ], ) - -# NOTE: The generate_chart tool requires 'altair' and 'vl-convert-python' to be -# installed in your environment. You can install them using: -# pip install altair vl-convert-python -async def generate_chart( - chart_spec: dict[str, Any], tool_context: ToolContext -) -> dict[str, str]: - """Generates a professional chart using Altair based on a Vega-Lite spec. - - Args: - chart_spec: A dictionary defining a Vega-Lite chart. - tool_context: The tool context. - - Returns: - A dictionary containing the status of the chart generation ("success" or - "error"), a detail message, and the filename if successful. - """ - import altair as alt - import vl_convert as vlc - - try: - # Altair can take a Vega-Lite dict directly and render it. - # We use vl-convert to transform the spec into a high-quality PNG. - png_data = await asyncio.to_thread(vlc.vegalite_to_png, chart_spec, scale=2) - - # Save as artifact - await tool_context.save_artifact( - "chart.png", - types.Part.from_bytes(data=png_data, mime_type="image/png"), - ) - title = chart_spec.get("title", "Chart") - return { - "status": "success", - "detail": ( - f"Professional chart '{title}' rendered using Altair/Vega-Lite." - ), - "filename": "chart.png", - } - except Exception as e: # pylint: disable=broad-exception-caught - return {"status": "error", "detail": f"Failed to render chart: {str(e)}"} - - root_agent = Agent( name="data_agent", - description=( - "Agent to answer user questions using Data Agents and generate charts." - ), + model="gemini-2.5-flash", + description="Agent to answer user questions using Data Agents.", instruction=( "## Persona\nYou are a helpful assistant that uses Data Agents" " to answer user questions about their data.\n\n## Tools\n- You can" " list available data agents using `list_accessible_data_agents`.\n-" " You can get information about a specific data agent using" " `get_data_agent_info`.\n- You can chat with a specific data" - " agent using `ask_data_agent`.\n- `generate_chart` renders" - " professional charts from a `chart_spec` (Vega-Lite JSON). Use this" - " whenever you need to visualize data; do not show raw JSON to the" - " user.\n- You can load artifacts using `load_artifacts`.\n" + " agent using `ask_data_agent`.\n" ), - tools=[da_toolset, generate_chart, load_artifacts], + tools=[da_toolset], ) diff --git a/contributing/samples/environment_and_skills/skills/README.md b/contributing/samples/environment_and_skills/skills/README.md deleted file mode 100644 index 34b3961b8d..0000000000 --- a/contributing/samples/environment_and_skills/skills/README.md +++ /dev/null @@ -1,115 +0,0 @@ -# ADK Skills Agent Sample - -## Overview - -This sample demonstrates how to use **Skills** and the **SkillToolset** in ADK. - -Skills are specialized folders of instructions, reference materials, assets, and scripts that extend an agent's capabilities. The agent can dynamically search for, load, and run resources/scripts from these skills depending on the user's query. - -This sample showcases: - -1. **Programmatic Skills**: Creating a skill directly within Python (`support-hours-skill`). -1. **Directory-based Skills**: Loading a skill from a directory structure (`weather-skill`). -1. **Skill Metadata & Additional Tools**: Declaring that a skill requires specific tools, making them dynamically active only when that skill is loaded. -1. **Script Execution**: Executing a Python script inside a skill using a code executor. - -## Sample Inputs - -- `What are the support hours for Tokyo?` - - *Triggers the support-hours-skill which checks get_timezone and reads support_policy.txt* - -- `What is the current weather in SF?` - - *Loads weather-skill and reads weather_info.md reference file* - -- `Can you fetch the current humidity for Mountain View?` - - *Executes scripts/get_humidity.py via run_skill_script* - -- `What is the wind speed in Seattle?` - - *Loads weather-skill which dynamically activates and calls get_wind_speed* - -## Graph - -```mermaid -graph TD - Agent[Agent: skills_agent] --> Toolset[SkillToolset] - Toolset --> Skill1[support-hours-skill] - Toolset --> Skill2[weather-skill] - - Skill1 --> Resource1["Resource: support_policy.txt"] - Skill1 --> Tool1["Dynamic Tool: get_timezone"] - - Skill2 --> Resource2["Resource: weather_info.md"] - Skill2 --> Script1["Script: get_humidity.py"] - Skill2 --> Tool2["Dynamic Tool: get_wind_speed"] -``` - -## How To - -### 1. Declaring a Skill Programmatically - -You can declare a skill in Python code using `models.Skill`: - -```python -from google.adk.skills import models - -support_hours_skill = models.Skill( - frontmatter=models.Frontmatter( - name="support-hours-skill", - description="A skill to check customer support hours...", - metadata={"adk_additional_tools": ["get_timezone"]}, - ), - instructions="Step 1: Look up the timezone... Step 2: Read 'references/support_policy.txt'...", - resources=models.Resources( - references={ - "support_policy.txt": "Customer support is available Monday through Friday...", - }, - ), -) -``` - -### 2. Loading a Skill from a Directory - -Skills can be organized as folders. Each folder must contain a `SKILL.md` file. The folder structure typically looks like: - -``` -weather-skill/ -├── SKILL.md -├── references/ -│ └── weather_info.md -└── scripts/ - └── get_humidity.py -``` - -To load a skill from a directory: - -```python -from google.adk.skills import load_skill_from_dir - -weather_skill = load_skill_from_dir( - pathlib.Path(__file__).parent / "skills" / "weather-skill" -) -``` - -### 3. Registering a SkillToolset - -Use `SkillToolset` to bundle all your skills and any dynamic tools. Then pass this toolset to your agent's `tools` list: - -```python -from google.adk.tools.skill_toolset import SkillToolset -from google.adk.code_executors.unsafe_local_code_executor import UnsafeLocalCodeExecutor - -my_skill_toolset = SkillToolset( - skills=[support_hours_skill, weather_skill], - additional_tools=[GetTimezoneTool(), get_wind_speed], - code_executor=UnsafeLocalCodeExecutor(), -) - -root_agent = Agent( - name="skills_agent", - tools=[my_skill_toolset], -) -``` diff --git a/contributing/samples/environment_and_skills/skills/__init__.py b/contributing/samples/environment_and_skills/skills/__init__.py deleted file mode 100644 index 606228d280..0000000000 --- a/contributing/samples/environment_and_skills/skills/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from . import agent diff --git a/contributing/samples/environment_and_skills/skills/agent.py b/contributing/samples/environment_and_skills/skills/agent.py deleted file mode 100644 index 0ced757f21..0000000000 --- a/contributing/samples/environment_and_skills/skills/agent.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import pathlib - -from google.adk.agents import Agent -from google.adk.code_executors.unsafe_local_code_executor import UnsafeLocalCodeExecutor -from google.adk.skills import load_skill_from_dir -from google.adk.skills import models -from google.adk.tools.base_tool import BaseTool -from google.adk.tools.skill_toolset import SkillToolset -from google.genai import types - - -class GetTimezoneTool(BaseTool): - """A tool to get the timezone for a given location.""" - - def __init__(self): - super().__init__( - name="get_timezone", - description="Returns the timezone for a given location.", - ) - - def _get_declaration(self) -> types.FunctionDeclaration | None: - return types.FunctionDeclaration( - name=self.name, - description=self.description, - parameters_json_schema={ - "type": "object", - "properties": { - "location": { - "type": "string", - "description": "The location to get the timezone for.", - }, - }, - "required": ["location"], - }, - ) - - async def run_async(self, *, args: dict, tool_context) -> str: - return f"The timezone for {args['location']} is UTC-08:00." - - -def get_wind_speed(location: str) -> str: - """Returns the current wind speed for a given location.""" - return f"The wind speed in {location} is 10 mph." - - -# 1. Define a skill programmatically -support_hours_skill = models.Skill( - frontmatter=models.Frontmatter( - name="support-hours-skill", - description=( - "A skill to check customer support hours for a given location." - ), - metadata={"adk_additional_tools": ["get_timezone"]}, - ), - instructions=( - "Step 1: Look up the timezone for the user's location using" - " 'get_timezone'. Step 2: Read 'references/support_policy.txt' to" - " understand support hours policy. Step 3: Explain the support hours" - " relative to the location's timezone." - ), - resources=models.Resources( - references={ - "support_policy.txt": ( - "Customer support is available Monday through Friday, " - "from 9:00 AM to 5:00 PM local time." - ), - }, - ), -) - -# 2. Load a skill from a directory -weather_skill = load_skill_from_dir( - pathlib.Path(__file__).parent / "skills" / "weather-skill" -) - -# 3. Combine them into a SkillToolset -# NOTE: UnsafeLocalCodeExecutor has security concerns and should NOT -# be used in production environments. -my_skill_toolset = SkillToolset( - skills=[support_hours_skill, weather_skill], - additional_tools=[GetTimezoneTool(), get_wind_speed], - code_executor=UnsafeLocalCodeExecutor(), -) - -# 4. Set up the agent with the toolset -root_agent = Agent( - name="skills_agent", - description="An agent that can use specialized skills.", - tools=[ - my_skill_toolset, - ], -) diff --git a/contributing/samples/environment_and_skills/skills/skills/weather-skill/SKILL.md b/contributing/samples/environment_and_skills/skills/skills/weather-skill/SKILL.md deleted file mode 100644 index 95096cc2de..0000000000 --- a/contributing/samples/environment_and_skills/skills/skills/weather-skill/SKILL.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -name: weather-skill -description: A skill that provides weather information based on reference data and scripts. -metadata: - adk_additional_tools: - - get_wind_speed ---- - -Step 1: Check 'references/weather_info.md' for the current weather. -Step 2: If humidity is requested, run 'scripts/get_humidity.py' with the `location` argument. -Step 3: If wind speed is requested, use the `get_wind_speed` tool. -Step 4: Provide the complete weather update to the user. diff --git a/contributing/samples/environment_and_skills/skills/tests/current_humidity.json b/contributing/samples/environment_and_skills/skills/tests/current_humidity.json deleted file mode 100644 index 661be9467a..0000000000 --- a/contributing/samples/environment_and_skills/skills/tests/current_humidity.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Can you fetch the current humidity for Mountain View?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": {}, - "id": "fc-1", - "name": "list_skills" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "list_skills", - "response": { - "result": "\n\n\nsupport-hours-skill\n\n\nA skill to check customer support hours for a given location.\n\n\n\n\nweather-skill\n\n\nA skill that provides weather information based on reference data and scripts.\n\n\n" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "skill_name": "weather-skill" - }, - "id": "fc-2", - "name": "load_skill" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "actions": { - "stateDelta": { - "_adk_activated_skill_skills_agent": [ - "weather-skill" - ] - } - }, - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "load_skill", - "response": { - "frontmatter": { - "allowed_tools": null, - "compatibility": null, - "description": "A skill that provides weather information based on reference data and scripts.", - "license": null, - "metadata": { - "adk_additional_tools": [ - "get_wind_speed" - ] - }, - "name": "weather-skill" - }, - "instructions": "Step 1: Check 'references/weather_info.md' for the current weather.\nStep 2: If humidity is requested, run 'scripts/get_humidity.py' with the `location` argument.\nStep 3: If wind speed is requested, use the `get_wind_speed` tool.\nStep 4: Provide the complete weather update to the user.", - "skill_name": "weather-skill" - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "args": { - "location": "Mountain View" - }, - "file_path": "scripts/get_humidity.py", - "skill_name": "weather-skill" - }, - "id": "fc-3", - "name": "run_skill_script" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-3", - "name": "run_skill_script", - "response": { - "file_path": "scripts/get_humidity.py", - "skill_name": "weather-skill", - "status": "success", - "stderr": "", - "stdout": "Fetching live humidity for Mountain View...\n45% (Simulated)\n" - } - } - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "text": "The current humidity in Mountain View is 45% (Simulated)." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - } - ] -} diff --git a/contributing/samples/environment_and_skills/skills/tests/current_weather.json b/contributing/samples/environment_and_skills/skills/tests/current_weather.json deleted file mode 100644 index 240aad3500..0000000000 --- a/contributing/samples/environment_and_skills/skills/tests/current_weather.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What is the current weather in SF?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": {}, - "id": "fc-1", - "name": "list_skills" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "list_skills", - "response": { - "result": "\n\n\nsupport-hours-skill\n\n\nA skill to check customer support hours for a given location.\n\n\n\n\nweather-skill\n\n\nA skill that provides weather information based on reference data and scripts.\n\n\n" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "skill_name": "weather-skill" - }, - "id": "fc-2", - "name": "load_skill" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "actions": { - "stateDelta": { - "_adk_activated_skill_skills_agent": [ - "weather-skill" - ] - } - }, - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "load_skill", - "response": { - "frontmatter": { - "allowed_tools": null, - "compatibility": null, - "description": "A skill that provides weather information based on reference data and scripts.", - "license": null, - "metadata": { - "adk_additional_tools": [ - "get_wind_speed" - ] - }, - "name": "weather-skill" - }, - "instructions": "Step 1: Check 'references/weather_info.md' for the current weather.\nStep 2: If humidity is requested, run 'scripts/get_humidity.py' with the `location` argument.\nStep 3: If wind speed is requested, use the `get_wind_speed` tool.\nStep 4: Provide the complete weather update to the user.", - "skill_name": "weather-skill" - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "file_path": "references/weather_info.md", - "skill_name": "weather-skill" - }, - "id": "fc-3", - "name": "load_skill_resource" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-3", - "name": "load_skill_resource", - "response": { - "content": "# Weather Information\n\n- **Location:** San Francisco, CA\n- **Condition:** Sunny \u2600\ufe0f\n- **Temperature:** 72\u00b0F (22\u00b0C)\n- **Forecast:** Clear skies all day.\n", - "file_path": "references/weather_info.md", - "skill_name": "weather-skill" - } - } - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "text": "The current weather in San Francisco, CA is Sunny with a temperature of 72\u00b0F (22\u00b0C). The forecast is clear skies all day." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - } - ] -} diff --git a/contributing/samples/environment_and_skills/skills/tests/support_hours.json b/contributing/samples/environment_and_skills/skills/tests/support_hours.json deleted file mode 100644 index 5a98a27fcc..0000000000 --- a/contributing/samples/environment_and_skills/skills/tests/support_hours.json +++ /dev/null @@ -1,242 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What are the support hours for Tokyo?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": {}, - "id": "fc-1", - "name": "list_skills" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "list_skills", - "response": { - "result": "\n\n\nsupport-hours-skill\n\n\nA skill to check customer support hours for a given location.\n\n\n\n\nweather-skill\n\n\nA skill that provides weather information based on reference data and scripts.\n\n\n" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "skill_name": "support-hours-skill" - }, - "id": "fc-2", - "name": "load_skill" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "actions": { - "stateDelta": { - "_adk_activated_skill_skills_agent": [ - "support-hours-skill" - ] - } - }, - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "load_skill", - "response": { - "frontmatter": { - "allowed_tools": null, - "compatibility": null, - "description": "A skill to check customer support hours for a given location.", - "license": null, - "metadata": { - "adk_additional_tools": [ - "get_timezone" - ] - }, - "name": "support-hours-skill" - }, - "instructions": "Step 1: Look up the timezone for the user's location using 'get_timezone'. Step 2: Read 'references/support_policy.txt' to understand support hours policy. Step 3: Explain the support hours relative to the location's timezone.", - "skill_name": "support-hours-skill" - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "location": "Tokyo" - }, - "id": "fc-3", - "name": "get_timezone" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-3", - "name": "get_timezone", - "response": { - "result": "The timezone for Tokyo is UTC-08:00." - } - } - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "file_path": "references/support_policy.txt", - "skill_name": "support-hours-skill" - }, - "id": "fc-4", - "name": "load_skill_resource" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-8", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-4", - "name": "load_skill_resource", - "response": { - "content": "Customer support is available Monday through Friday, from 9:00 AM to 5:00 PM local time.", - "file_path": "references/support_policy.txt", - "skill_name": "support-hours-skill" - } - } - } - ], - "role": "user" - }, - "id": "e-9", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "text": "Customer support in Tokyo is available Monday through Friday, from 9:00 AM to 5:00 PM local time (UTC-08:00)." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-10", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - } - ] -} diff --git a/contributing/samples/environment_and_skills/skills/tests/wind_speed.json b/contributing/samples/environment_and_skills/skills/tests/wind_speed.json deleted file mode 100644 index 6912b37135..0000000000 --- a/contributing/samples/environment_and_skills/skills/tests/wind_speed.json +++ /dev/null @@ -1,193 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What is the wind speed in Seattle?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": {}, - "id": "fc-1", - "name": "list_skills" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "list_skills", - "response": { - "result": "\n\n\nsupport-hours-skill\n\n\nA skill to check customer support hours for a given location.\n\n\n\n\nweather-skill\n\n\nA skill that provides weather information based on reference data and scripts.\n\n\n" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "skill_name": "weather-skill" - }, - "id": "fc-2", - "name": "load_skill" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "actions": { - "stateDelta": { - "_adk_activated_skill_skills_agent": [ - "weather-skill" - ] - } - }, - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "load_skill", - "response": { - "frontmatter": { - "allowed_tools": null, - "compatibility": null, - "description": "A skill that provides weather information based on reference data and scripts.", - "license": null, - "metadata": { - "adk_additional_tools": [ - "get_wind_speed" - ] - }, - "name": "weather-skill" - }, - "instructions": "Step 1: Check 'references/weather_info.md' for the current weather.\nStep 2: If humidity is requested, run 'scripts/get_humidity.py' with the `location` argument.\nStep 3: If wind speed is requested, use the `get_wind_speed` tool.\nStep 4: Provide the complete weather update to the user.", - "skill_name": "weather-skill" - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "location": "Seattle" - }, - "id": "fc-3", - "name": "get_wind_speed" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-3", - "name": "get_wind_speed", - "response": { - "result": "The wind speed in Seattle is 10 mph." - } - } - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - }, - { - "author": "skills_agent", - "content": { - "parts": [ - { - "text": "The wind speed in Seattle is 10 mph." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "path": "skills_agent@1" - } - } - ] -} diff --git a/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/references/weather_info.md b/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/references/weather_info.md deleted file mode 100644 index ebe6b63315..0000000000 --- a/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/references/weather_info.md +++ /dev/null @@ -1,6 +0,0 @@ -# Weather Information - -- **Location:** San Francisco, CA -- **Condition:** Sunny ☀️ -- **Temperature:** 72°F (22°C) -- **Forecast:** Clear skies all day. diff --git a/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/scripts/get_humidity.py b/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/scripts/get_humidity.py deleted file mode 100644 index a2e1dc4701..0000000000 --- a/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/scripts/get_humidity.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import argparse - - -def get_humidity(location: str) -> str: - """Fetch live humidity for a given location. (Simulated)""" - print(f"Fetching live humidity for {location}...") - return "45% (Simulated)" - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--location", type=str, default="Mountain View") - args = parser.parse_args() - - print(get_humidity(args.location)) diff --git a/contributing/samples/environment_and_skills/skills_agent_gcs/__init__.py b/contributing/samples/fields_output_schema/__init__.py similarity index 100% rename from contributing/samples/environment_and_skills/skills_agent_gcs/__init__.py rename to contributing/samples/fields_output_schema/__init__.py diff --git a/contributing/samples/fields_output_schema/agent.py b/contributing/samples/fields_output_schema/agent.py new file mode 100644 index 0000000000..f948668ac2 --- /dev/null +++ b/contributing/samples/fields_output_schema/agent.py @@ -0,0 +1,60 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk import Agent +from pydantic import BaseModel + + +class WeatherData(BaseModel): + temperature: str + humidity: str + wind_speed: str + + +def get_current_year() -> str: + """Get the current year. + + Returns: + The current year as a string + """ + from datetime import datetime + + return str(datetime.now().year) + + +root_agent = Agent( + name='root_agent', + model='gemini-2.5-flash', + instruction="""\ +Answer user's questions based on the data you have. + +If you don't have the data, you can just say you don't know. + +Here are the data you have for San Jose + +* temperature: 26 C +* humidity: 20% +* wind_speed: 29 mph + +Here are the data you have for Cupertino + +* temperature: 16 C +* humidity: 10% +* wind_speed: 13 mph + +""", + output_schema=list[WeatherData], + output_key='weather_data', + tools=[get_current_year], +) diff --git a/contributing/samples/hitl/human_in_loop/__init__.py b/contributing/samples/fields_planner/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/hitl/human_in_loop/__init__.py rename to contributing/samples/fields_planner/__init__.py diff --git a/contributing/samples/patterns/fields_planner/agent.py b/contributing/samples/fields_planner/agent.py similarity index 100% rename from contributing/samples/patterns/fields_planner/agent.py rename to contributing/samples/fields_planner/agent.py diff --git a/contributing/samples/patterns/fields_planner/main.py b/contributing/samples/fields_planner/main.py similarity index 100% rename from contributing/samples/patterns/fields_planner/main.py rename to contributing/samples/fields_planner/main.py diff --git a/contributing/samples/integrations/files_retrieval_agent/README.md b/contributing/samples/files_retrieval_agent/README.md similarity index 100% rename from contributing/samples/integrations/files_retrieval_agent/README.md rename to contributing/samples/files_retrieval_agent/README.md diff --git a/contributing/samples/hitl/human_tool_confirmation/__init__.py b/contributing/samples/files_retrieval_agent/__init__.py similarity index 100% rename from contributing/samples/hitl/human_tool_confirmation/__init__.py rename to contributing/samples/files_retrieval_agent/__init__.py diff --git a/contributing/samples/integrations/files_retrieval_agent/agent.py b/contributing/samples/files_retrieval_agent/agent.py similarity index 98% rename from contributing/samples/integrations/files_retrieval_agent/agent.py rename to contributing/samples/files_retrieval_agent/agent.py index 48ff1d2d6b..c23671f1cb 100644 --- a/contributing/samples/integrations/files_retrieval_agent/agent.py +++ b/contributing/samples/files_retrieval_agent/agent.py @@ -42,6 +42,7 @@ ) root_agent = Agent( + model="gemini-2.5-flash", name="files_retrieval_agent", instruction=( "You are a helpful assistant that answers questions about the Agent" diff --git a/contributing/samples/integrations/files_retrieval_agent/data/adk_overview.txt b/contributing/samples/files_retrieval_agent/data/adk_overview.txt similarity index 100% rename from contributing/samples/integrations/files_retrieval_agent/data/adk_overview.txt rename to contributing/samples/files_retrieval_agent/data/adk_overview.txt diff --git a/contributing/samples/integrations/files_retrieval_agent/data/tools_guide.txt b/contributing/samples/files_retrieval_agent/data/tools_guide.txt similarity index 100% rename from contributing/samples/integrations/files_retrieval_agent/data/tools_guide.txt rename to contributing/samples/files_retrieval_agent/data/tools_guide.txt diff --git a/contributing/samples/integrations/gcp_auth/README.md b/contributing/samples/gcp_auth/README.md similarity index 100% rename from contributing/samples/integrations/gcp_auth/README.md rename to contributing/samples/gcp_auth/README.md diff --git a/contributing/samples/integrations/gcp_auth/agent.py b/contributing/samples/gcp_auth/agent.py similarity index 100% rename from contributing/samples/integrations/gcp_auth/agent.py rename to contributing/samples/gcp_auth/agent.py diff --git a/contributing/samples/integrations/gcp_auth/client/index.html b/contributing/samples/gcp_auth/client/index.html similarity index 100% rename from contributing/samples/integrations/gcp_auth/client/index.html rename to contributing/samples/gcp_auth/client/index.html diff --git a/contributing/samples/integrations/gcp_auth/client/main.py b/contributing/samples/gcp_auth/client/main.py similarity index 100% rename from contributing/samples/integrations/gcp_auth/client/main.py rename to contributing/samples/gcp_auth/client/main.py diff --git a/contributing/samples/integrations/gcp_auth/client/requirements.txt b/contributing/samples/gcp_auth/client/requirements.txt similarity index 100% rename from contributing/samples/integrations/gcp_auth/client/requirements.txt rename to contributing/samples/gcp_auth/client/requirements.txt diff --git a/contributing/samples/hitl/tool_confirmation/__init__.py b/contributing/samples/gcp_skill_registry_agent/__init__.py similarity index 100% rename from contributing/samples/hitl/tool_confirmation/__init__.py rename to contributing/samples/gcp_skill_registry_agent/__init__.py diff --git a/contributing/samples/integrations/gcp_skill_registry_agent/agent.py b/contributing/samples/gcp_skill_registry_agent/agent.py similarity index 100% rename from contributing/samples/integrations/gcp_skill_registry_agent/agent.py rename to contributing/samples/gcp_skill_registry_agent/agent.py diff --git a/contributing/samples/integrations/agent_registry_agent/__init__.py b/contributing/samples/generate_image/__init__.py similarity index 100% rename from contributing/samples/integrations/agent_registry_agent/__init__.py rename to contributing/samples/generate_image/__init__.py diff --git a/contributing/samples/multimodal/generate_image/agent.py b/contributing/samples/generate_image/agent.py similarity index 98% rename from contributing/samples/multimodal/generate_image/agent.py rename to contributing/samples/generate_image/agent.py index 6db6f1ed9f..b7c53ed7ea 100644 --- a/contributing/samples/multimodal/generate_image/agent.py +++ b/contributing/samples/generate_image/agent.py @@ -44,6 +44,7 @@ async def generate_image(prompt: str, tool_context: 'ToolContext'): root_agent = Agent( + model='gemini-2.5-flash', name='root_agent', description="""An agent that generates images and answer questions about the images.""", instruction="""You are an agent whose job is to generate or edit an image based on the user's prompt. diff --git a/contributing/samples/multimodal/generate_image/sample.session.json b/contributing/samples/generate_image/sample.session.json similarity index 100% rename from contributing/samples/multimodal/generate_image/sample.session.json rename to contributing/samples/generate_image/sample.session.json diff --git a/contributing/samples/integrations/gepa/README.md b/contributing/samples/gepa/README.md similarity index 100% rename from contributing/samples/integrations/gepa/README.md rename to contributing/samples/gepa/README.md diff --git a/contributing/samples/hitl/tool_human_in_the_loop_config/__init__.py b/contributing/samples/gepa/__init__.py similarity index 100% rename from contributing/samples/hitl/tool_human_in_the_loop_config/__init__.py rename to contributing/samples/gepa/__init__.py diff --git a/contributing/samples/integrations/gepa/adk_agent.py b/contributing/samples/gepa/adk_agent.py similarity index 100% rename from contributing/samples/integrations/gepa/adk_agent.py rename to contributing/samples/gepa/adk_agent.py diff --git a/contributing/samples/integrations/gepa/adk_agent_test.py b/contributing/samples/gepa/adk_agent_test.py similarity index 100% rename from contributing/samples/integrations/gepa/adk_agent_test.py rename to contributing/samples/gepa/adk_agent_test.py diff --git a/contributing/samples/integrations/gepa/experiment.py b/contributing/samples/gepa/experiment.py similarity index 100% rename from contributing/samples/integrations/gepa/experiment.py rename to contributing/samples/gepa/experiment.py diff --git a/contributing/samples/integrations/gepa/gepa_tau_bench.ipynb b/contributing/samples/gepa/gepa_tau_bench.ipynb similarity index 100% rename from contributing/samples/integrations/gepa/gepa_tau_bench.ipynb rename to contributing/samples/gepa/gepa_tau_bench.ipynb diff --git a/contributing/samples/integrations/gepa/gepa_utils.py b/contributing/samples/gepa/gepa_utils.py similarity index 100% rename from contributing/samples/integrations/gepa/gepa_utils.py rename to contributing/samples/gepa/gepa_utils.py diff --git a/contributing/samples/integrations/gepa/rater_lib.py b/contributing/samples/gepa/rater_lib.py similarity index 100% rename from contributing/samples/integrations/gepa/rater_lib.py rename to contributing/samples/gepa/rater_lib.py diff --git a/contributing/samples/integrations/gepa/rubric_validation_template.txt b/contributing/samples/gepa/rubric_validation_template.txt similarity index 100% rename from contributing/samples/integrations/gepa/rubric_validation_template.txt rename to contributing/samples/gepa/rubric_validation_template.txt diff --git a/contributing/samples/integrations/gepa/run_experiment.py b/contributing/samples/gepa/run_experiment.py similarity index 100% rename from contributing/samples/integrations/gepa/run_experiment.py rename to contributing/samples/gepa/run_experiment.py diff --git a/contributing/samples/integrations/gepa/tau_bench_agent.py b/contributing/samples/gepa/tau_bench_agent.py similarity index 100% rename from contributing/samples/integrations/gepa/tau_bench_agent.py rename to contributing/samples/gepa/tau_bench_agent.py diff --git a/contributing/samples/integrations/gepa/voter_agent/eval_prompts.txt b/contributing/samples/gepa/voter_agent/eval_prompts.txt similarity index 100% rename from contributing/samples/integrations/gepa/voter_agent/eval_prompts.txt rename to contributing/samples/gepa/voter_agent/eval_prompts.txt diff --git a/contributing/samples/integrations/gepa/voter_agent/gepa.ipynb b/contributing/samples/gepa/voter_agent/gepa.ipynb similarity index 100% rename from contributing/samples/integrations/gepa/voter_agent/gepa.ipynb rename to contributing/samples/gepa/voter_agent/gepa.ipynb diff --git a/contributing/samples/integrations/gepa/voter_agent/optimized_prompt.txt b/contributing/samples/gepa/voter_agent/optimized_prompt.txt similarity index 100% rename from contributing/samples/integrations/gepa/voter_agent/optimized_prompt.txt rename to contributing/samples/gepa/voter_agent/optimized_prompt.txt diff --git a/contributing/samples/integrations/gepa/voter_agent/prompts.txt b/contributing/samples/gepa/voter_agent/prompts.txt similarity index 100% rename from contributing/samples/integrations/gepa/voter_agent/prompts.txt rename to contributing/samples/gepa/voter_agent/prompts.txt diff --git a/contributing/samples/integrations/gepa/voter_agent/rubric_validation_template.txt b/contributing/samples/gepa/voter_agent/rubric_validation_template.txt similarity index 100% rename from contributing/samples/integrations/gepa/voter_agent/rubric_validation_template.txt rename to contributing/samples/gepa/voter_agent/rubric_validation_template.txt diff --git a/contributing/samples/integrations/gepa/voter_agent/tools.py b/contributing/samples/gepa/voter_agent/tools.py similarity index 100% rename from contributing/samples/integrations/gepa/voter_agent/tools.py rename to contributing/samples/gepa/voter_agent/tools.py diff --git a/contributing/samples/integrations/gke_agent_sandbox/deployment_rbac.yaml b/contributing/samples/gke_agent_sandbox/deployment_rbac.yaml similarity index 100% rename from contributing/samples/integrations/gke_agent_sandbox/deployment_rbac.yaml rename to contributing/samples/gke_agent_sandbox/deployment_rbac.yaml diff --git a/contributing/samples/integrations/google_api/README.md b/contributing/samples/google_api/README.md similarity index 100% rename from contributing/samples/integrations/google_api/README.md rename to contributing/samples/google_api/README.md diff --git a/contributing/samples/integrations/api_registry_agent/__init__.py b/contributing/samples/google_api/__init__.py similarity index 100% rename from contributing/samples/integrations/api_registry_agent/__init__.py rename to contributing/samples/google_api/__init__.py diff --git a/contributing/samples/integrations/google_api/agent.py b/contributing/samples/google_api/agent.py similarity index 98% rename from contributing/samples/integrations/google_api/agent.py rename to contributing/samples/google_api/agent.py index 4685dd74bd..561746c43d 100644 --- a/contributing/samples/integrations/google_api/agent.py +++ b/contributing/samples/google_api/agent.py @@ -39,6 +39,7 @@ ) root_agent = Agent( + model="gemini-2.5-flash", name="google_api_bigquery_agent", instruction=""" You are a helpful Google BigQuery agent that help to manage users' data on Google BigQuery. diff --git a/contributing/samples/integrations/application_integration_agent/__init__.py b/contributing/samples/google_search_agent/__init__.py similarity index 100% rename from contributing/samples/integrations/application_integration_agent/__init__.py rename to contributing/samples/google_search_agent/__init__.py diff --git a/contributing/samples/integrations/google_search_agent/agent.py b/contributing/samples/google_search_agent/agent.py similarity index 97% rename from contributing/samples/integrations/google_search_agent/agent.py rename to contributing/samples/google_search_agent/agent.py index b17ce63a0f..7f4745a0d9 100644 --- a/contributing/samples/integrations/google_search_agent/agent.py +++ b/contributing/samples/google_search_agent/agent.py @@ -16,6 +16,7 @@ from google.adk.tools.google_search_tool import google_search root_agent = Agent( + model='gemini-2.5-flash', name='root_agent', description="""an agent whose job it is to perform Google search queries and answer questions about the results.""", instruction="""You are an agent whose job is to perform Google search queries and answer questions about the results. diff --git a/contributing/samples/integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py b/contributing/samples/hello_world/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py rename to contributing/samples/hello_world/__init__.py diff --git a/contributing/samples/core/hello_world/agent.py b/contributing/samples/hello_world/agent.py old mode 100644 new mode 100755 similarity index 99% rename from contributing/samples/core/hello_world/agent.py rename to contributing/samples/hello_world/agent.py index 9912c248bf..d5cfc3ef5f --- a/contributing/samples/core/hello_world/agent.py +++ b/contributing/samples/hello_world/agent.py @@ -65,6 +65,7 @@ async def check_prime(nums: list[int]) -> str: root_agent = Agent( + model='gemini-3-flash-preview', name='hello_world_agent', description=( 'hello world agent that can roll a dice of 8 sides and check prime' diff --git a/contributing/samples/hello_world/main.py b/contributing/samples/hello_world/main.py new file mode 100755 index 0000000000..20305e5acc --- /dev/null +++ b/contributing/samples/hello_world/main.py @@ -0,0 +1,111 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import time + +import agent +from dotenv import load_dotenv +from google.adk.agents.run_config import RunConfig +from google.adk.cli.utils import logs +from google.adk.runners import InMemoryRunner +from google.adk.sessions.session import Session +from google.genai import types + +load_dotenv(override=True) +logs.log_to_tmp_folder() + + +async def main(): + app_name = 'my_app' + user_id_1 = 'user1' + runner = InMemoryRunner( + agent=agent.root_agent, + app_name=app_name, + ) + session_11 = await runner.session_service.create_session( + app_name=app_name, user_id=user_id_1 + ) + + async def run_prompt(session: Session, new_message: str): + content = types.Content( + role='user', parts=[types.Part.from_text(text=new_message)] + ) + print('** User says:', content.model_dump(exclude_none=True)) + async for event in runner.run_async( + user_id=user_id_1, + session_id=session.id, + new_message=content, + ): + if event.content.parts: + for part in event.content.parts: + if part.text: + print(f'** {event.author}: {part.text}') + if part.function_call: + print( + f'** {event.author} calls tool: {part.function_call.name} with' + f' args {part.function_call.args}' + ) + + async def run_prompt_bytes(session: Session, new_message: str): + content = types.Content( + role='user', + parts=[ + types.Part.from_bytes( + data=str.encode(new_message), mime_type='text/plain' + ) + ], + ) + print('** User says:', content.model_dump(exclude_none=True)) + async for event in runner.run_async( + user_id=user_id_1, + session_id=session.id, + new_message=content, + run_config=RunConfig(save_input_blobs_as_artifacts=True), + ): + if event.content.parts and event.content.parts[0].text: + print(f'** {event.author}: {event.content.parts[0].text}') + + async def check_rolls_in_state(rolls_size: int): + session = await runner.session_service.get_session( + app_name=app_name, user_id=user_id_1, session_id=session_11.id + ) + print('** session.state:', session.state) + assert len(session.state['rolls']) == rolls_size + for roll in session.state['rolls']: + assert roll > 0 and roll <= 100 + + start_time = time.time() + print('Start time:', start_time) + print('------------------------------------') + await run_prompt(session_11, 'Hi') + await run_prompt(session_11, 'Roll a dice with 100 sides') + await check_rolls_in_state(1) + await run_prompt(session_11, 'Roll a dice again with 100 sides.') + await check_rolls_in_state(2) + await run_prompt(session_11, 'What numbers did I got?') + await run_prompt_bytes(session_11, 'Hi bytes') + print( + await runner.artifact_service.list_artifact_keys( + app_name=app_name, user_id=user_id_1, session_id=session_11.id + ) + ) + end_time = time.time() + print('------------------------------------') + print('End time:', end_time) + print('Total time:', end_time - start_time) + + +if __name__ == '__main__': + asyncio.run(main()) diff --git a/contributing/samples/context_management/migrate_session_db/__init__.py b/contributing/samples/hello_world_anthropic/__init__.py similarity index 100% rename from contributing/samples/context_management/migrate_session_db/__init__.py rename to contributing/samples/hello_world_anthropic/__init__.py diff --git a/contributing/samples/models/hello_world_anthropic/agent.py b/contributing/samples/hello_world_anthropic/agent.py similarity index 100% rename from contributing/samples/models/hello_world_anthropic/agent.py rename to contributing/samples/hello_world_anthropic/agent.py diff --git a/contributing/samples/models/hello_world_anthropic/main.py b/contributing/samples/hello_world_anthropic/main.py similarity index 100% rename from contributing/samples/models/hello_world_anthropic/main.py rename to contributing/samples/hello_world_anthropic/main.py diff --git a/contributing/samples/models/hello_world_apigeellm/.env-sample b/contributing/samples/hello_world_apigeellm/.env-sample similarity index 100% rename from contributing/samples/models/hello_world_apigeellm/.env-sample rename to contributing/samples/hello_world_apigeellm/.env-sample diff --git a/contributing/samples/models/hello_world_apigeellm/README.md b/contributing/samples/hello_world_apigeellm/README.md similarity index 100% rename from contributing/samples/models/hello_world_apigeellm/README.md rename to contributing/samples/hello_world_apigeellm/README.md diff --git a/contributing/samples/models/hello_world_apigeellm/agent.py b/contributing/samples/hello_world_apigeellm/agent.py similarity index 100% rename from contributing/samples/models/hello_world_apigeellm/agent.py rename to contributing/samples/hello_world_apigeellm/agent.py diff --git a/contributing/samples/models/hello_world_apigeellm/main.py b/contributing/samples/hello_world_apigeellm/main.py similarity index 100% rename from contributing/samples/models/hello_world_apigeellm/main.py rename to contributing/samples/hello_world_apigeellm/main.py diff --git a/contributing/samples/integrations/bigquery/__init__.py b/contributing/samples/hello_world_app/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/integrations/bigquery/__init__.py rename to contributing/samples/hello_world_app/__init__.py diff --git a/contributing/samples/hello_world_app/agent.py b/contributing/samples/hello_world_app/agent.py new file mode 100755 index 0000000000..3e762f949e --- /dev/null +++ b/contributing/samples/hello_world_app/agent.py @@ -0,0 +1,160 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import random + +from google.adk import Agent +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.callback_context import CallbackContext +from google.adk.apps import App +from google.adk.apps.app import EventsCompactionConfig +from google.adk.apps.llm_event_summarizer import LlmEventSummarizer +from google.adk.models.llm_request import LlmRequest +from google.adk.plugins.base_plugin import BasePlugin +from google.adk.plugins.context_filter_plugin import ContextFilterPlugin +from google.adk.plugins.save_files_as_artifacts_plugin import SaveFilesAsArtifactsPlugin +from google.adk.tools import load_artifacts +from google.adk.tools.tool_context import ToolContext +from google.genai import types + + +def roll_die(sides: int, tool_context: ToolContext) -> int: + """Roll a die and return the rolled result. + + Args: + sides: The integer number of sides the die has. + + Returns: + An integer of the result of rolling the die. + """ + result = random.randint(1, sides) + if not 'rolls' in tool_context.state: + tool_context.state['rolls'] = [] + + tool_context.state['rolls'] = tool_context.state['rolls'] + [result] + return result + + +async def check_prime(nums: list[int]) -> str: + """Check if a given list of numbers are prime. + + Args: + nums: The list of numbers to check. + + Returns: + A str indicating which number is prime. + """ + primes = set() + for number in nums: + number = int(number) + if number <= 1: + continue + is_prime = True + for i in range(2, int(number**0.5) + 1): + if number % i == 0: + is_prime = False + break + if is_prime: + primes.add(number) + return ( + 'No prime numbers found.' + if not primes + else f"{', '.join(str(num) for num in primes)} are prime numbers." + ) + + +root_agent = Agent( + model='gemini-2.5-flash', + name='hello_world_agent', + description=( + 'hello world agent that can roll a dice of 8 sides and check prime' + ' numbers.' + ), + instruction=""" + You roll dice and answer questions about the outcome of the dice rolls. + You can roll dice of different sizes. + You can use multiple tools in parallel by calling functions in parallel(in one request and in one round). + It is ok to discuss previous dice roles, and comment on the dice rolls. + When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string. + You should never roll a die on your own. + When checking prime numbers, call the check_prime tool with a list of integers. Be sure to pass in a list of integers. You should never pass in a string. + You should not check prime numbers before calling the tool. + When you are asked to roll a die and check prime numbers, you should always make the following two function calls: + 1. You should first call the roll_die tool to get a roll. Wait for the function response before calling the check_prime tool. + 2. After you get the function response from roll_die tool, you should call the check_prime tool with the roll_die result. + 2.1 If user asks you to check primes based on previous rolls, make sure you include the previous rolls in the list. + 3. When you respond, you must include the roll_die result from step 1. + You should always perform the previous 3 steps when asking for a roll and checking prime numbers. + You should not rely on the previous history on prime results. + """, + tools=[ + roll_die, + check_prime, + load_artifacts, + ], + # planner=BuiltInPlanner( + # thinking_config=types.ThinkingConfig( + # include_thoughts=True, + # ), + # ), + generate_content_config=types.GenerateContentConfig( + safety_settings=[ + types.SafetySetting( # avoid false alarm about rolling dice. + category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, + threshold=types.HarmBlockThreshold.OFF, + ), + ] + ), +) + + +class CountInvocationPlugin(BasePlugin): + """A custom plugin that counts agent and tool invocations.""" + + def __init__(self) -> None: + """Initialize the plugin with counters.""" + super().__init__(name='count_invocation') + self.agent_count: int = 0 + self.tool_count: int = 0 + self.llm_request_count: int = 0 + + async def before_agent_callback( + self, *, agent: BaseAgent, callback_context: CallbackContext + ) -> None: + """Count agent runs.""" + self.agent_count += 1 + print(f'[Plugin] Agent run count: {self.agent_count}') + + async def before_model_callback( + self, *, callback_context: CallbackContext, llm_request: LlmRequest + ) -> None: + """Count LLM requests.""" + self.llm_request_count += 1 + print(f'[Plugin] LLM request count: {self.llm_request_count}') + + +app = App( + name='hello_world_app', + root_agent=root_agent, + plugins=[ + CountInvocationPlugin(), + # ContextFilterPlugin(num_invocations_to_keep=3), + SaveFilesAsArtifactsPlugin(), + ], + # Enable event compaction with an LLM-based summarizer. + events_compaction_config=EventsCompactionConfig( + compaction_interval=2, + overlap_size=1, + ), +) diff --git a/contributing/samples/hello_world_app/main.py b/contributing/samples/hello_world_app/main.py new file mode 100755 index 0000000000..d024b4cef2 --- /dev/null +++ b/contributing/samples/hello_world_app/main.py @@ -0,0 +1,103 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import time + +import agent +from dotenv import load_dotenv +from google.adk.agents.run_config import RunConfig +from google.adk.cli.utils import logs +from google.adk.runners import InMemoryRunner +from google.adk.sessions.session import Session +from google.genai import types + +load_dotenv(override=True) +logs.log_to_tmp_folder() + + +async def main(): + app_name = 'my_app' + user_id_1 = 'user1' + runner = InMemoryRunner( + agent=agent.root_agent, + app_name=app_name, + ) + session_11 = await runner.session_service.create_session( + app_name=app_name, user_id=user_id_1 + ) + + async def run_prompt(session: Session, new_message: str): + content = types.Content( + role='user', parts=[types.Part.from_text(text=new_message)] + ) + print('** User says:', content.model_dump(exclude_none=True)) + async for event in runner.run_async( + user_id=user_id_1, + session_id=session.id, + new_message=content, + ): + if event.content.parts and event.content.parts[0].text: + print(f'** {event.author}: {event.content.parts[0].text}') + + async def run_prompt_bytes(session: Session, new_message: str): + content = types.Content( + role='user', + parts=[ + types.Part.from_bytes( + data=str.encode(new_message), mime_type='text/plain' + ) + ], + ) + print('** User says:', content.model_dump(exclude_none=True)) + async for event in runner.run_async( + user_id=user_id_1, + session_id=session.id, + new_message=content, + run_config=RunConfig(save_input_blobs_as_artifacts=False), + ): + if event.content.parts and event.content.parts[0].text: + print(f'** {event.author}: {event.content.parts[0].text}') + + async def check_rolls_in_state(rolls_size: int): + session = await runner.session_service.get_session( + app_name=app_name, user_id=user_id_1, session_id=session_11.id + ) + assert len(session.state['rolls']) == rolls_size + for roll in session.state['rolls']: + assert roll > 0 and roll <= 100 + + start_time = time.time() + print('Start time:', start_time) + print('------------------------------------') + await run_prompt(session_11, 'Hi') + await run_prompt(session_11, 'Roll a die with 100 sides') + await check_rolls_in_state(1) + await run_prompt(session_11, 'Roll a die again with 100 sides.') + await check_rolls_in_state(2) + await run_prompt(session_11, 'What numbers did I got?') + await run_prompt_bytes(session_11, 'Hi bytes') + print( + await runner.artifact_service.list_artifact_keys( + app_name=app_name, user_id=user_id_1, session_id=session_11.id + ) + ) + end_time = time.time() + print('------------------------------------') + print('End time:', end_time) + print('Total time:', end_time - start_time) + + +if __name__ == '__main__': + asyncio.run(main()) diff --git a/contributing/samples/context_management/postgres_session_service/__init__.py b/contributing/samples/hello_world_gemma/__init__.py similarity index 100% rename from contributing/samples/context_management/postgres_session_service/__init__.py rename to contributing/samples/hello_world_gemma/__init__.py diff --git a/contributing/samples/models/hello_world_gemma/agent.py b/contributing/samples/hello_world_gemma/agent.py similarity index 100% rename from contributing/samples/models/hello_world_gemma/agent.py rename to contributing/samples/hello_world_gemma/agent.py diff --git a/contributing/samples/models/hello_world_gemma/main.py b/contributing/samples/hello_world_gemma/main.py similarity index 100% rename from contributing/samples/models/hello_world_gemma/main.py rename to contributing/samples/hello_world_gemma/main.py diff --git a/contributing/samples/models/hello_world_anthropic/__init__.py b/contributing/samples/hello_world_gemma3_ollama/__init__.py similarity index 100% rename from contributing/samples/models/hello_world_anthropic/__init__.py rename to contributing/samples/hello_world_gemma3_ollama/__init__.py diff --git a/contributing/samples/models/hello_world_gemma3_ollama/agent.py b/contributing/samples/hello_world_gemma3_ollama/agent.py similarity index 100% rename from contributing/samples/models/hello_world_gemma3_ollama/agent.py rename to contributing/samples/hello_world_gemma3_ollama/agent.py diff --git a/contributing/samples/models/hello_world_gemma3_ollama/main.py b/contributing/samples/hello_world_gemma3_ollama/main.py similarity index 100% rename from contributing/samples/models/hello_world_gemma3_ollama/main.py rename to contributing/samples/hello_world_gemma3_ollama/main.py diff --git a/contributing/samples/models/hello_world_gemma/__init__.py b/contributing/samples/hello_world_litellm/__init__.py similarity index 100% rename from contributing/samples/models/hello_world_gemma/__init__.py rename to contributing/samples/hello_world_litellm/__init__.py diff --git a/contributing/samples/models/hello_world_litellm/agent.py b/contributing/samples/hello_world_litellm/agent.py similarity index 100% rename from contributing/samples/models/hello_world_litellm/agent.py rename to contributing/samples/hello_world_litellm/agent.py diff --git a/contributing/samples/models/hello_world_litellm/main.py b/contributing/samples/hello_world_litellm/main.py similarity index 100% rename from contributing/samples/models/hello_world_litellm/main.py rename to contributing/samples/hello_world_litellm/main.py diff --git a/contributing/samples/models/hello_world_gemma3_ollama/__init__.py b/contributing/samples/hello_world_litellm_add_function_to_prompt/__init__.py similarity index 100% rename from contributing/samples/models/hello_world_gemma3_ollama/__init__.py rename to contributing/samples/hello_world_litellm_add_function_to_prompt/__init__.py diff --git a/contributing/samples/models/hello_world_litellm_add_function_to_prompt/agent.py b/contributing/samples/hello_world_litellm_add_function_to_prompt/agent.py similarity index 100% rename from contributing/samples/models/hello_world_litellm_add_function_to_prompt/agent.py rename to contributing/samples/hello_world_litellm_add_function_to_prompt/agent.py diff --git a/contributing/samples/models/hello_world_litellm_add_function_to_prompt/main.py b/contributing/samples/hello_world_litellm_add_function_to_prompt/main.py similarity index 100% rename from contributing/samples/models/hello_world_litellm_add_function_to_prompt/main.py rename to contributing/samples/hello_world_litellm_add_function_to_prompt/main.py diff --git a/contributing/samples/integrations/bigquery_mcp/__init__.py b/contributing/samples/hello_world_ma/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/integrations/bigquery_mcp/__init__.py rename to contributing/samples/hello_world_ma/__init__.py diff --git a/contributing/samples/multi_agent/hello_world_ma/agent.py b/contributing/samples/hello_world_ma/agent.py similarity index 98% rename from contributing/samples/multi_agent/hello_world_ma/agent.py rename to contributing/samples/hello_world_ma/agent.py index 49ab34e3ed..fad1e2b9eb 100755 --- a/contributing/samples/multi_agent/hello_world_ma/agent.py +++ b/contributing/samples/hello_world_ma/agent.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os import random from google.adk.agents.llm_agent import Agent @@ -24,8 +23,6 @@ # --- Roll Die Sub-Agent --- def roll_die(sides: int) -> int: """Roll a die and return the rolled result.""" - if "PYTEST_CURRENT_TEST" in os.environ: - return 2 return random.randint(1, sides) @@ -134,6 +131,7 @@ def check_prime(nums: list[int]) -> str: root_agent = Agent( + model="gemini-2.5-flash", name="root_agent", instruction=""" You are a helpful assistant that can roll dice and check if numbers are prime. diff --git a/contributing/samples/models/hello_world_ollama/README.md b/contributing/samples/hello_world_ollama/README.md similarity index 100% rename from contributing/samples/models/hello_world_ollama/README.md rename to contributing/samples/hello_world_ollama/README.md diff --git a/contributing/samples/integrations/bigtable/__init__.py b/contributing/samples/hello_world_ollama/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/integrations/bigtable/__init__.py rename to contributing/samples/hello_world_ollama/__init__.py diff --git a/contributing/samples/models/hello_world_ollama/agent.py b/contributing/samples/hello_world_ollama/agent.py similarity index 100% rename from contributing/samples/models/hello_world_ollama/agent.py rename to contributing/samples/hello_world_ollama/agent.py diff --git a/contributing/samples/models/hello_world_ollama/main.py b/contributing/samples/hello_world_ollama/main.py similarity index 100% rename from contributing/samples/models/hello_world_ollama/main.py rename to contributing/samples/hello_world_ollama/main.py diff --git a/contributing/samples/integrations/crewai_tool_kwargs/__init__.py b/contributing/samples/hello_world_stream_fc_args/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/integrations/crewai_tool_kwargs/__init__.py rename to contributing/samples/hello_world_stream_fc_args/__init__.py diff --git a/contributing/samples/tools/hello_world_stream_fc_args/agent.py b/contributing/samples/hello_world_stream_fc_args/agent.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/tools/hello_world_stream_fc_args/agent.py rename to contributing/samples/hello_world_stream_fc_args/agent.py diff --git a/contributing/samples/integrations/data_agent/__init__.py b/contributing/samples/history_management/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/integrations/data_agent/__init__.py rename to contributing/samples/history_management/__init__.py diff --git a/contributing/samples/context_management/history_management/agent.py b/contributing/samples/history_management/agent.py similarity index 99% rename from contributing/samples/context_management/history_management/agent.py rename to contributing/samples/history_management/agent.py index 78096da4be..11142386f8 100755 --- a/contributing/samples/context_management/history_management/agent.py +++ b/contributing/samples/history_management/agent.py @@ -88,6 +88,7 @@ async def before_model_callback( root_agent = Agent( + model='gemini-2.5-flash', name='short_history_agent', description=( 'an agent that maintains only the last turn in its context window.' diff --git a/contributing/samples/history_management/main.py b/contributing/samples/history_management/main.py new file mode 100755 index 0000000000..17038c42f7 --- /dev/null +++ b/contributing/samples/history_management/main.py @@ -0,0 +1,80 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import time +import warnings + +import agent +from dotenv import load_dotenv +from google.adk import Runner +from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService +from google.adk.cli.utils import logs +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.sessions.session import Session +from google.genai import types + +load_dotenv(override=True) +warnings.filterwarnings('ignore', category=UserWarning) +logs.log_to_tmp_folder() + + +async def main(): + app_name = 'my_app' + user_id_1 = 'user1' + session_service = InMemorySessionService() + artifact_service = InMemoryArtifactService() + runner = Runner( + app_name=app_name, + agent=agent.root_agent, + artifact_service=artifact_service, + session_service=session_service, + ) + session_11 = await session_service.create_session( + app_name=app_name, user_id=user_id_1 + ) + + async def run_prompt(session: Session, new_message: str): + content = types.Content( + role='user', parts=[types.Part.from_text(text=new_message)] + ) + print('** User says:', content.model_dump(exclude_none=True)) + async for event in runner.run_async( + user_id=user_id_1, + session_id=session.id, + new_message=content, + ): + if event.content.parts and event.content.parts[0].text: + print(f'** {event.author}: {event.content.parts[0].text}') + + start_time = time.time() + print('Start time:', start_time) + print('------------------------------------') + await run_prompt(session_11, 'Hi') + await run_prompt(session_11, 'Roll a die with 100 sides') + await run_prompt(session_11, 'Roll a die again with 100 sides.') + await run_prompt(session_11, 'What numbers did I got?') + print( + await artifact_service.list_artifact_keys( + app_name=app_name, user_id=user_id_1, session_id=session_11.id + ) + ) + end_time = time.time() + print('------------------------------------') + print('End time:', end_time) + print('Total time:', end_time - start_time) + + +if __name__ == '__main__': + asyncio.run(main()) diff --git a/contributing/samples/hitl/human_in_loop/tests/auto_reimburse_coffee.json b/contributing/samples/hitl/human_in_loop/tests/auto_reimburse_coffee.json deleted file mode 100644 index 840b742044..0000000000 --- a/contributing/samples/hitl/human_in_loop/tests/auto_reimburse_coffee.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Can I get a reimbursement of $15.50 for some coffee?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "reimbursement_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "amount": 15.5, - "purpose": "coffee" - }, - "id": "fc-1", - "name": "reimburse" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "reimbursement_agent@1" - } - }, - { - "author": "reimbursement_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "reimburse", - "response": { - "status": "ok" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "reimbursement_agent@1" - } - }, - { - "author": "reimbursement_agent", - "content": { - "parts": [ - { - "text": "You got it! I've reimbursed you $15.50 for coffee." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "reimbursement_agent@1" - } - } - ] -} diff --git a/contributing/samples/hitl/human_in_loop/tests/reimburse_dinner.json b/contributing/samples/hitl/human_in_loop/tests/reimburse_dinner.json deleted file mode 100644 index d96f9d427f..0000000000 --- a/contributing/samples/hitl/human_in_loop/tests/reimburse_dinner.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "I would like to request a reimbursement of $150 for a client dinner." - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "reimbursement_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "amount": 150, - "purpose": "client dinner" - }, - "id": "fc-1", - "name": "ask_for_approval" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-1" - ], - "nodeInfo": { - "path": "reimbursement_agent@1" - } - }, - { - "author": "reimbursement_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "ask_for_approval", - "response": { - "amount": 150, - "status": "pending", - "ticketId": "reimbursement-ticket-001" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "reimbursement_agent@1" - } - }, - { - "author": "reimbursement_agent", - "content": { - "parts": [ - { - "text": "Your reimbursement request for $150 for a client dinner has been sent for approval. Your ticket ID is reimbursement-ticket-001. I will let you know once I have an update." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "reimbursement_agent@1" - } - } - ] -} diff --git a/contributing/samples/hitl/request_input_tool/README.md b/contributing/samples/hitl/request_input_tool/README.md deleted file mode 100644 index a9c8b507b2..0000000000 --- a/contributing/samples/hitl/request_input_tool/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Request Input Tool Sample - -## Overview - -This sample demonstrates how an LLM agent can proactively request clarification or confirmation from the user using the built-in `request_input` tool without losing its context/flow. - -It showcases a highly realistic support assistant that dynamically constructs a JSON schema to only ask for missing details when creating IT support tickets. - -## Sample Inputs - -- `I want to file a technical ticket for a database crash.` - - The agent will analyze the prompt, identify that the `title` and `category` are already provided, and dynamically call `request_input` with a schema requesting only `description` and `priority`. - -- `File a priority HIGH technical ticket titled database crash explained as the MySQL server throwing OOM errors.` - - The agent has all required details and will call `create_support_ticket` immediately without needing clarification. - -## Graph - -```mermaid -graph TD - User[User Prompt] --> Agent[Support Assistant Agent] - Agent -->|Needs Clarification| RequestInput[request_input tool] - RequestInput -->|User Response| Agent - Agent -->|All Details Gathered| CreateTicket[create_support_ticket tool] -``` - -## How To - -This sample uses **Pattern B: Standalone Agents** with the `request_input` tool: - -1. **Import `request_input`**: - - ```python - from google.adk.tools import request_input - ``` - -1. **Add it to the LLM Agent's tools list**: - - ```python - root_agent = Agent( - name="support_assistant_agent", - tools=[create_support_ticket, request_input], - ... - ) - ``` - -When the LLM decides it needs clarification, it calls `request_input` with a question and a dynamic `response_schema`. The ADK framework automatically intercepts this, yields a long-running interrupt to the client, and injects the user's reply back as a `FunctionResponse` into the LLM's chat history. diff --git a/contributing/samples/hitl/request_input_tool/agent.py b/contributing/samples/hitl/request_input_tool/agent.py deleted file mode 100644 index ef3631961a..0000000000 --- a/contributing/samples/hitl/request_input_tool/agent.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from google.adk import Agent -from google.adk.tools import request_input -from google.genai import types -from pydantic import BaseModel -from pydantic import Field - - -class SupportTicket(BaseModel): - """Details of the IT support ticket to be created.""" - - title: str = Field(description="A brief summary of the issue.") - description: str = Field(description="Detailed explanation of the problem.") - priority: str = Field( - default="MEDIUM", - description="Ticket priority: LOW, MEDIUM, HIGH, or CRITICAL.", - ) - category: str = Field( - description=( - "Issue category, e.g., billing, technical, account, or database." - ) - ) - - -def create_support_ticket(ticket: SupportTicket) -> dict[str, str]: - """Create a support ticket in the IT ticketing system.""" - return { - "status": "success", - "message": ( - f"Successfully created ticket '{ticket.title}'" - f" [Category: {ticket.category}, Priority: {ticket.priority}]." - ), - "ticket_id": "INC-98471", - } - - -root_agent = Agent( - name="support_assistant_agent", - instruction=""" - You are a helpful IT support assistant responsible for creating support tickets. - When the user requests to create or file a ticket: - 1. Identify which ticket details (title, description, priority, category) are already provided in the conversation. - 2. If any mandatory details are missing, call the `request_input` tool. - 3. When calling `request_input`, you must construct a dynamic JSON `response_schema` (type: "object") that ONLY requests the missing details, and specify a helpful message explaining what is needed. - 4. Once all details are gathered, call `create_support_ticket` with the complete SupportTicket details. - """, - tools=[create_support_ticket, request_input], - generate_content_config=types.GenerateContentConfig(temperature=0.1), -) diff --git a/contributing/samples/hitl/request_input_tool/tests/create_support_ticket.json b/contributing/samples/hitl/request_input_tool/tests/create_support_ticket.json deleted file mode 100644 index 6610d47c66..0000000000 --- a/contributing/samples/hitl/request_input_tool/tests/create_support_ticket.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "I want to file a technical ticket for a database crash." - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "support_assistant_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "message": "I can help with that. Please provide the description and priority of the database crash:", - "response_schema": { - "properties": { - "description": { - "description": "Detailed explanation of the database crash problem.", - "title": "Description", - "type": "string" - }, - "priority": { - "description": "Ticket priority: LOW, MEDIUM, HIGH, or CRITICAL.", - "title": "Priority", - "type": "string" - } - }, - "required": [ - "description", - "priority" - ], - "title": "TicketClarification", - "type": "object" - } - }, - "id": "fc-1", - "name": "adk_request_input" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-1" - ], - "nodeInfo": { - "path": "support_assistant_agent@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "adk_request_input", - "response": { - "description": "The MySQL server is throwing OOM errors and restarting repeatedly.", - "priority": "HIGH" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "support_assistant_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "ticket": { - "category": "database", - "description": "The MySQL server is throwing OOM errors and restarting repeatedly.", - "priority": "HIGH", - "title": "Database crash" - } - }, - "id": "fc-2", - "name": "create_support_ticket" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "support_assistant_agent@1" - } - }, - { - "author": "support_assistant_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "create_support_ticket", - "response": { - "message": "Successfully created ticket 'Database crash' [Category: database, Priority: HIGH].", - "status": "success", - "ticket_id": "INC-98471" - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "support_assistant_agent@1" - } - }, - { - "author": "support_assistant_agent", - "content": { - "parts": [ - { - "text": "Successfully created ticket 'Database crash' [Category: database, Priority: HIGH] with ticket ID INC-98471." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "support_assistant_agent@1" - } - } - ] -} diff --git a/contributing/samples/hitl/tool_confirmation/README.md b/contributing/samples/hitl/tool_confirmation/README.md deleted file mode 100644 index c57e334cd5..0000000000 --- a/contributing/samples/hitl/tool_confirmation/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# Tool Confirmation Sample - -## Overview - -This sample demonstrates how to use the Tool Confirmation feature in ADK to implement Human-in-the-Loop (HITL) flows. It shows how a tool can dynamically request confirmation from the user before proceeding with a sensitive action (e.g., transferring funds). - -## Sample Inputs - -- `Transfer $50 to Alice` - -- `Transfer $200 to Bob` - -- `Close account ACC123` - -- `Transfer $500 to Charlie and close account ACC123` - - *This will cause parallel tools being called in a single step* - -## How To - -### 1. Requesting Confirmation - -In your tool function, you can access the `ToolContext` and check if `tool_confirmation` is present. If not, you can call `tool_context.request_confirmation()` to request approval from the user. - -```python -def transfer_funds(amount: float, recipient: str, tool_context: ToolContext): - # Only request confirmation for amounts >= 100 - if amount >= 100: - if not tool_context.tool_confirmation: - tool_context.request_confirmation( - hint=f"Confirm transfer of ${amount} to {recipient}.", - ) - return {"error": "This tool call requires confirmation, please approve or reject."} -``` - -### 2. Handling the Response - -When the user responds to the confirmation request, the tool will be called again. This time, `tool_context.tool_confirmation` will be populated with the user's decision (`confirmed` boolean). - -```python - elif not tool_context.tool_confirmation.confirmed: - return {"error": "Transfer rejected by user."} - - return {"result": f"Successfully transferred ${amount} to {recipient}."} -``` - -### 3. Using `FunctionTool` for Automatic Confirmation - -Alternatively, you can specify that a tool always requires confirmation by wrapping it in a `FunctionTool` and setting `require_confirmation=True` when defining the agent's tools. In this case, the runner will automatically handle the confirmation request before calling your function. - -```python -from google.adk.tools.function_tool import FunctionTool - -def close_account(account_id: str, tool_context: ToolContext): - # This code only runs if the user approves the confirmation - return {"result": f"Account {account_id} closed."} - -root_agent = Agent( - ... - tools=[ - FunctionTool(func=close_account, require_confirmation=True), - ], -) -``` diff --git a/contributing/samples/hitl/tool_confirmation/agent.py b/contributing/samples/hitl/tool_confirmation/agent.py deleted file mode 100644 index aa20e497ae..0000000000 --- a/contributing/samples/hitl/tool_confirmation/agent.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk.agents import Agent -from google.adk.tools.function_tool import FunctionTool -from google.adk.tools.tool_context import ToolContext - - -def transfer_funds( - amount: float, recipient: str, tool_context: ToolContext -) -> dict[str, str]: - """Transfers funds to a recipient.""" - # Only request confirmation for amounts >= 100 - if amount >= 100: - if not tool_context.tool_confirmation: - tool_context.request_confirmation( - hint=f"Confirm transfer of ${amount} to {recipient}.", - ) - return { - "error": ( - "This tool call requires confirmation, please approve or reject." - ) - } - elif not tool_context.tool_confirmation.confirmed: - return {"error": "Transfer rejected by user."} - - # Proceed with transfer for amounts < 100 or if confirmed - return {"result": f"Successfully transferred ${amount} to {recipient}."} - - -def close_account(account_id: str) -> dict[str, str]: - """Closes a user account. This is a destructive action.""" - # With require_confirmation=True, this function is only called if the user - # approves. - return {"result": f"Account {account_id} closed successfully."} - - -root_agent = Agent( - name="money_transfer_assistant", - tools=[ - transfer_funds, - FunctionTool(func=close_account, require_confirmation=True), - ], -) diff --git a/contributing/samples/hitl/tool_confirmation/tests/Transfer_500_and_close_account_ACC123.json b/contributing/samples/hitl/tool_confirmation/tests/Transfer_500_and_close_account_ACC123.json deleted file mode 100644 index cbd0061758..0000000000 --- a/contributing/samples/hitl/tool_confirmation/tests/Transfer_500_and_close_account_ACC123.json +++ /dev/null @@ -1,276 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Transfer $500 to Charlie and close account ACC123" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "amount": 500, - "recipient": "Charlie" - }, - "id": "fc-1", - "name": "transfer_funds" - } - }, - { - "functionCall": { - "args": { - "account_id": "ACC123" - }, - "id": "fc-2", - "name": "close_account" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "originalFunctionCall": { - "args": { - "amount": 500, - "recipient": "Charlie" - }, - "id": "fc-1", - "name": "transfer_funds" - }, - "toolConfirmation": { - "confirmed": false, - "hint": "Confirm transfer of $500 to Charlie." - } - }, - "id": "fc-3", - "name": "adk_request_confirmation" - } - }, - { - "functionCall": { - "args": { - "originalFunctionCall": { - "args": { - "account_id": "ACC123" - }, - "id": "fc-2", - "name": "close_account" - }, - "toolConfirmation": { - "confirmed": false, - "hint": "Please approve or reject the tool call close_account() by responding with a FunctionResponse with an expected ToolConfirmation payload." - } - }, - "id": "fc-4", - "name": "adk_request_confirmation" - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-4", - "fc-3" - ], - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "actions": { - "requestedToolConfirmations": { - "fc-1": { - "confirmed": false, - "hint": "Confirm transfer of $500 to Charlie." - }, - "fc-2": { - "confirmed": false, - "hint": "Please approve or reject the tool call close_account() by responding with a FunctionResponse with an expected ToolConfirmation payload." - } - }, - "skipSummarization": true - }, - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "transfer_funds", - "response": { - "error": "This tool call requires confirmation, please approve or reject." - } - } - }, - { - "functionResponse": { - "id": "fc-2", - "name": "close_account", - "response": { - "error": "This tool call requires confirmation, please approve or reject." - } - } - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-3", - "name": "adk_request_confirmation", - "response": { - "confirmed": true - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "transfer_funds", - "response": { - "result": "Successfully transferred $500 to Charlie." - } - } - } - ], - "role": "user" - }, - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "text": "I transferred $500 to Charlie. I can close account ACC123, but it is a destructive action that requires confirmation. Do you want me to go ahead and close it?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-4", - "name": "adk_request_confirmation", - "response": { - "confirmed": true - } - } - } - ], - "role": "user" - }, - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "close_account", - "response": { - "result": "Account ACC123 closed successfully." - } - } - } - ], - "role": "user" - }, - "id": "e-9", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "text": "I have transferred $500 to Charlie and closed account ACC123.\n" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-10", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - } - ] -} diff --git a/contributing/samples/hitl/tool_confirmation/tests/close_account_acc123.json b/contributing/samples/hitl/tool_confirmation/tests/close_account_acc123.json deleted file mode 100644 index 8c5b560437..0000000000 --- a/contributing/samples/hitl/tool_confirmation/tests/close_account_acc123.json +++ /dev/null @@ -1,171 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Close account ACC123\n" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "account_id": "ACC123" - }, - "id": "fc-1", - "name": "close_account" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "originalFunctionCall": { - "args": { - "account_id": "ACC123" - }, - "id": "fc-1", - "name": "close_account" - }, - "toolConfirmation": { - "confirmed": false, - "hint": "Please approve or reject the tool call close_account() by responding with a FunctionResponse with an expected ToolConfirmation payload." - } - }, - "id": "fc-2", - "name": "adk_request_confirmation" - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-2" - ], - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "actions": { - "requestedToolConfirmations": { - "fc-1": { - "confirmed": false, - "hint": "Please approve or reject the tool call close_account() by responding with a FunctionResponse with an expected ToolConfirmation payload." - } - }, - "skipSummarization": true - }, - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "close_account", - "response": { - "error": "This tool call requires confirmation, please approve or reject." - } - } - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "adk_request_confirmation", - "response": { - "confirmed": true - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "close_account", - "response": { - "result": "Account ACC123 closed successfully." - } - } - } - ], - "role": "user" - }, - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "text": "I have closed the account ACC123." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - } - ] -} diff --git a/contributing/samples/hitl/tool_confirmation/tests/transfer_200_confirmed.json b/contributing/samples/hitl/tool_confirmation/tests/transfer_200_confirmed.json deleted file mode 100644 index 9fa99baa35..0000000000 --- a/contributing/samples/hitl/tool_confirmation/tests/transfer_200_confirmed.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Transfer $200 to Bob" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "amount": 200, - "recipient": "Bob" - }, - "id": "fc-1", - "name": "transfer_funds" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "originalFunctionCall": { - "args": { - "amount": 200, - "recipient": "Bob" - }, - "id": "fc-1", - "name": "transfer_funds" - }, - "toolConfirmation": { - "confirmed": false, - "hint": "Confirm transfer of $200 to Bob." - } - }, - "id": "fc-2", - "name": "adk_request_confirmation" - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-2" - ], - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "actions": { - "requestedToolConfirmations": { - "fc-1": { - "confirmed": false, - "hint": "Confirm transfer of $200 to Bob." - } - } - }, - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "transfer_funds", - "response": { - "error": "This tool call requires confirmation, please approve or reject." - } - } - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "text": "I need to confirm this transfer with you. Please approve or reject." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "adk_request_confirmation", - "response": { - "confirmed": true - } - } - } - ], - "role": "user" - }, - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "transfer_funds", - "response": { - "result": "Successfully transferred $200 to Bob." - } - } - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "text": "Successfully transferred $200 to Bob." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - } - ] -} diff --git a/contributing/samples/hitl/tool_confirmation/tests/transfer_200_declined.json b/contributing/samples/hitl/tool_confirmation/tests/transfer_200_declined.json deleted file mode 100644 index 3a1279f6f4..0000000000 --- a/contributing/samples/hitl/tool_confirmation/tests/transfer_200_declined.json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Transfer $200 to Bob" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "amount": 200, - "recipient": "Bob" - }, - "id": "fc-1", - "name": "transfer_funds" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "originalFunctionCall": { - "args": { - "amount": 200, - "recipient": "Bob" - }, - "id": "fc-1", - "name": "transfer_funds" - }, - "toolConfirmation": { - "confirmed": false, - "hint": "Confirm transfer of $200 to Bob." - } - }, - "id": "fc-2", - "name": "adk_request_confirmation" - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-2" - ], - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "actions": { - "requestedToolConfirmations": { - "fc-1": { - "confirmed": false, - "hint": "Confirm transfer of $200 to Bob." - } - } - }, - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "transfer_funds", - "response": { - "error": "This tool call requires confirmation, please approve or reject." - } - } - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "text": "Your transfer of $200 to Bob requires confirmation." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "adk_request_confirmation", - "response": { - "confirmed": false - } - } - } - ], - "role": "user" - }, - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "transfer_funds", - "response": { - "error": "Transfer rejected by user." - } - } - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "text": "I'm sorry, your transfer could not be completed. It was rejected by the user." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - } - ] -} diff --git a/contributing/samples/hitl/tool_confirmation/tests/transfer_50.json b/contributing/samples/hitl/tool_confirmation/tests/transfer_50.json deleted file mode 100644 index 624c93aa2a..0000000000 --- a/contributing/samples/hitl/tool_confirmation/tests/transfer_50.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Transfer $50 to Alice\n" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "amount": 50, - "recipient": "Alice" - }, - "id": "fc-1", - "name": "transfer_funds" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "transfer_funds", - "response": { - "result": "Successfully transferred $50 to Alice." - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - }, - { - "author": "money_transfer_assistant", - "content": { - "parts": [ - { - "text": "Successfully transferred $50 to Alice." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "money_transfer_assistant@1" - } - } - ] -} diff --git a/contributing/samples/hitl/human_in_loop/README.md b/contributing/samples/human_in_loop/README.md similarity index 100% rename from contributing/samples/hitl/human_in_loop/README.md rename to contributing/samples/human_in_loop/README.md diff --git a/contributing/samples/integrations/files_retrieval_agent/__init__.py b/contributing/samples/human_in_loop/__init__.py similarity index 100% rename from contributing/samples/integrations/files_retrieval_agent/__init__.py rename to contributing/samples/human_in_loop/__init__.py diff --git a/contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py b/contributing/samples/human_in_loop/agent.py similarity index 98% rename from contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py rename to contributing/samples/human_in_loop/agent.py index 89a4282f6e..3ea740b7a1 100644 --- a/contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py +++ b/contributing/samples/human_in_loop/agent.py @@ -39,6 +39,7 @@ def ask_for_approval( root_agent = Agent( + model='gemini-2.5-flash', name='reimbursement_agent', instruction=""" You are an agent whose job is to handle the reimbursement process for diff --git a/contributing/samples/hitl/human_in_loop/main.py b/contributing/samples/human_in_loop/main.py similarity index 100% rename from contributing/samples/hitl/human_in_loop/main.py rename to contributing/samples/human_in_loop/main.py diff --git a/contributing/samples/integrations/gcp_skill_registry_agent/__init__.py b/contributing/samples/human_tool_confirmation/__init__.py similarity index 100% rename from contributing/samples/integrations/gcp_skill_registry_agent/__init__.py rename to contributing/samples/human_tool_confirmation/__init__.py diff --git a/contributing/samples/hitl/human_tool_confirmation/agent.py b/contributing/samples/human_tool_confirmation/agent.py similarity index 99% rename from contributing/samples/hitl/human_tool_confirmation/agent.py rename to contributing/samples/human_tool_confirmation/agent.py index c7591d8974..bf9e6cdfc3 100644 --- a/contributing/samples/hitl/human_tool_confirmation/agent.py +++ b/contributing/samples/human_tool_confirmation/agent.py @@ -69,6 +69,7 @@ def request_time_off(days: int, tool_context: ToolContext): root_agent = Agent( + model='gemini-2.5-flash', name='time_off_agent', instruction=""" You are a helpful assistant that can help employees with reimbursement and time off requests. diff --git a/contributing/samples/integrations/integration_connector_euc_agent/README.md b/contributing/samples/integration_connector_euc_agent/README.md similarity index 100% rename from contributing/samples/integrations/integration_connector_euc_agent/README.md rename to contributing/samples/integration_connector_euc_agent/README.md diff --git a/contributing/samples/integrations/google_api/__init__.py b/contributing/samples/integration_connector_euc_agent/__init__.py similarity index 100% rename from contributing/samples/integrations/google_api/__init__.py rename to contributing/samples/integration_connector_euc_agent/__init__.py diff --git a/contributing/samples/integrations/integration_connector_euc_agent/agent.py b/contributing/samples/integration_connector_euc_agent/agent.py similarity index 99% rename from contributing/samples/integrations/integration_connector_euc_agent/agent.py rename to contributing/samples/integration_connector_euc_agent/agent.py index 7f696b7993..a44a4b0d1c 100644 --- a/contributing/samples/integrations/integration_connector_euc_agent/agent.py +++ b/contributing/samples/integration_connector_euc_agent/agent.py @@ -77,6 +77,7 @@ ) root_agent = Agent( + model="gemini-2.5-flash", name="data_processing_agent", description="Agent that can list events in a calendar.", instruction=""" diff --git a/contributing/samples/integrations/authn-adk-all-in-one/idp/sample.jwks.json b/contributing/samples/integrations/authn-adk-all-in-one/idp/sample.jwks.json deleted file mode 100644 index ab4f36ac39..0000000000 --- a/contributing/samples/integrations/authn-adk-all-in-one/idp/sample.jwks.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "keys": [ - "Replace with JWKS from jwkset.com/generate" - ] -} diff --git a/contributing/samples/models/interactions_api/README.md b/contributing/samples/interactions_api/README.md similarity index 100% rename from contributing/samples/models/interactions_api/README.md rename to contributing/samples/interactions_api/README.md diff --git a/contributing/samples/models/interactions_api/__init__.py b/contributing/samples/interactions_api/__init__.py similarity index 100% rename from contributing/samples/models/interactions_api/__init__.py rename to contributing/samples/interactions_api/__init__.py diff --git a/contributing/samples/models/interactions_api/agent.py b/contributing/samples/interactions_api/agent.py similarity index 72% rename from contributing/samples/models/interactions_api/agent.py rename to contributing/samples/interactions_api/agent.py index 59cec77c45..908a853948 100644 --- a/contributing/samples/models/interactions_api/agent.py +++ b/contributing/samples/interactions_api/agent.py @@ -12,7 +12,19 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Agent definition for testing the Interactions API integration.""" +"""Agent definition for testing the Interactions API integration. + +NOTE: The Interactions API does NOT support mixing custom function calling tools +with built-in tools in the same agent. To work around this limitation, we use +bypass_multi_tools_limit=True on GoogleSearchTool, which converts the built-in +google_search to a function calling tool (via GoogleSearchAgentTool). + +The bypass is only triggered when len(agent.tools) > 1, so we include multiple +tools in the agent (GoogleSearchTool + get_current_weather). + +With bypass_multi_tools_limit=True and multiple tools, all tools become function +calling tools, which allows mixing google_search with custom function tools. +""" from google.adk.agents.llm_agent import Agent from google.adk.models.google_llm import Gemini @@ -62,13 +74,16 @@ def get_current_weather(city: str) -> dict: } -# Main agent with google_search built-in tool and custom function tools +# Main agent with google_search (via bypass) and custom function tools +# Using bypass_multi_tools_limit=True converts google_search to a function calling tool. +# We need len(tools) > 1 to trigger the bypass, so we include get_current_weather directly. +# This allows mixing google_search with custom function tools via the Interactions API. # # NOTE: code_executor is not compatible with function calling mode because the model # tries to call a function (e.g., run_code) instead of outputting code in markdown. root_agent = Agent( model=Gemini( - model="gemini-3.1-flash-lite", + model="gemini-2.5-flash", use_interactions_api=True, ), name="interactions_test_agent", @@ -84,7 +99,7 @@ def get_current_weather(city: str) -> dict: Be concise and helpful in your responses. Always confirm what you did. """, tools=[ - GoogleSearchTool(), + GoogleSearchTool(bypass_multi_tools_limit=True), get_current_weather, ], ) diff --git a/contributing/samples/models/interactions_api/main.py b/contributing/samples/interactions_api/main.py similarity index 88% rename from contributing/samples/models/interactions_api/main.py rename to contributing/samples/interactions_api/main.py index 8b40c3c12e..a776f31ea9 100644 --- a/contributing/samples/models/interactions_api/main.py +++ b/contributing/samples/interactions_api/main.py @@ -16,11 +16,17 @@ This script tests the following features: 1. Basic text generation -2. Google Search tool +2. Google Search tool (via bypass_multi_tools_limit) 3. Multi-turn conversations with stateful interactions 4. Google Search tool (additional coverage) 5. Custom function tool (get_current_weather) +NOTE: The Interactions API does NOT support mixing custom function calling tools +with built-in tools. To work around this, we use bypass_multi_tools_limit=True +on GoogleSearchTool, which converts it to a function calling tool (via +GoogleSearchAgentTool). The bypass only triggers when len(agent.tools) > 1, +so we include both GoogleSearchTool and get_current_weather in the agent. + NOTE: Code execution via UnsafeLocalCodeExecutor is not compatible with function calling mode because the model tries to call a function instead of outputting code in markdown. @@ -35,6 +41,7 @@ import logging from pathlib import Path import time +from typing import Optional from dotenv import load_dotenv from google.adk.agents.run_config import RunConfig @@ -42,7 +49,6 @@ from google.adk.runners import InMemoryRunner from google.adk.runners import Runner from google.genai import types -import httpx from .agent import root_agent @@ -61,8 +67,7 @@ async def call_agent_async( prompt: str, agent_name: str = "", show_interaction_id: bool = True, - additional_parts: list[types.Part] | None = None, -) -> tuple[str, str | None]: +) -> tuple[str, Optional[str]]: """Call the agent asynchronously with the user's prompt. Args: @@ -72,16 +77,13 @@ async def call_agent_async( prompt: The prompt to send agent_name: The expected agent name for filtering responses show_interaction_id: Whether to show interaction IDs in output - additional_parts: Optional list of additional content parts (e.g. files) Returns: A tuple of (response_text, interaction_id) """ - parts = [types.Part.from_text(text=prompt)] - if additional_parts: - parts.extend(additional_parts) - - content = types.Content(role="user", parts=parts) + content = types.Content( + role="user", parts=[types.Part.from_text(text=prompt)] + ) final_response_text = "" last_interaction_id = None @@ -262,39 +264,6 @@ async def test_custom_function_tool(runner: Runner, session_id: str): return interaction_id -async def test_pdf_summarization(runner: Runner, session_id: str) -> str | None: - """Test PDF summarization using the Interactions API.""" - print("\n" + "=" * 60) - print("TEST 6: PDF Summarization") - print("=" * 60) - - url = "https://storage.googleapis.com/cloud-samples-data/generative-ai/pdf/2403.05530.pdf" - print(f"Downloading {url}...") - async with httpx.AsyncClient() as client: - response = await client.get( - url, headers={"User-Agent": "Mozilla/5.0"}, follow_redirects=True - ) - response.raise_for_status() - pdf_bytes = response.content - - pdf_part = types.Part.from_bytes(data=pdf_bytes, mime_type="application/pdf") - response, interaction_id = await call_agent_async( - runner, - USER_ID, - session_id, - "Please summarize the attached PDF document.", - additional_parts=[pdf_part], - ) - - assert response, "Expected a non-empty response" - assert len(response) > 0, f"Expected summary in response: {response}" - assert ( - "gemini" in response.lower() or "multimodal" in response.lower() - ), f"Expected summary of PDF in response: {response}" - print("PASSED: PDF Summarization works") - return interaction_id - - def check_interactions_api_available() -> bool: """Check if the interactions API is available in the SDK.""" try: @@ -342,7 +311,6 @@ async def run_all_tests(): await test_multi_turn_conversation(runner, session.id) await test_google_search_tool(runner, session.id) await test_custom_function_tool(runner, session.id) - await test_pdf_summarization(runner, session.id) print("\n" + "=" * 60) print("ALL TESTS PASSED (Interactions API)") diff --git a/contributing/samples/integrations/jira_agent/README.md b/contributing/samples/jira_agent/README.md similarity index 100% rename from contributing/samples/integrations/jira_agent/README.md rename to contributing/samples/jira_agent/README.md diff --git a/contributing/samples/integrations/google_search_agent/__init__.py b/contributing/samples/jira_agent/__init__.py similarity index 100% rename from contributing/samples/integrations/google_search_agent/__init__.py rename to contributing/samples/jira_agent/__init__.py diff --git a/contributing/samples/integrations/jira_agent/agent.py b/contributing/samples/jira_agent/agent.py similarity index 98% rename from contributing/samples/integrations/jira_agent/agent.py rename to contributing/samples/jira_agent/agent.py index 82541e1a3e..6c3de9eedd 100644 --- a/contributing/samples/integrations/jira_agent/agent.py +++ b/contributing/samples/jira_agent/agent.py @@ -17,6 +17,7 @@ from .tools import jira_tool root_agent = Agent( + model='gemini-2.5-flash', name='jira_connector_agent', description='This agent helps search issues in Jira', instruction=""" diff --git a/contributing/samples/integrations/jira_agent/image-app-intg-editor.png b/contributing/samples/jira_agent/image-app-intg-editor.png similarity index 100% rename from contributing/samples/integrations/jira_agent/image-app-intg-editor.png rename to contributing/samples/jira_agent/image-app-intg-editor.png diff --git a/contributing/samples/integrations/jira_agent/image-application-integration.png b/contributing/samples/jira_agent/image-application-integration.png similarity index 100% rename from contributing/samples/integrations/jira_agent/image-application-integration.png rename to contributing/samples/jira_agent/image-application-integration.png diff --git a/contributing/samples/integrations/jira_agent/image-connection-tool.png b/contributing/samples/jira_agent/image-connection-tool.png similarity index 100% rename from contributing/samples/integrations/jira_agent/image-connection-tool.png rename to contributing/samples/jira_agent/image-connection-tool.png diff --git a/contributing/samples/integrations/jira_agent/tools.py b/contributing/samples/jira_agent/tools.py similarity index 100% rename from contributing/samples/integrations/jira_agent/tools.py rename to contributing/samples/jira_agent/tools.py diff --git a/contributing/samples/patterns/json_passing_agent/README.md b/contributing/samples/json_passing_agent/README.md similarity index 100% rename from contributing/samples/patterns/json_passing_agent/README.md rename to contributing/samples/json_passing_agent/README.md diff --git a/contributing/samples/integrations/integration_connector_euc_agent/__init__.py b/contributing/samples/json_passing_agent/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/integrations/integration_connector_euc_agent/__init__.py rename to contributing/samples/json_passing_agent/__init__.py diff --git a/contributing/samples/patterns/json_passing_agent/agent.py b/contributing/samples/json_passing_agent/agent.py similarity index 98% rename from contributing/samples/patterns/json_passing_agent/agent.py rename to contributing/samples/json_passing_agent/agent.py index a7a5e035b5..7d71ce3a65 100755 --- a/contributing/samples/patterns/json_passing_agent/agent.py +++ b/contributing/samples/json_passing_agent/agent.py @@ -52,6 +52,7 @@ def get_available_toppings() -> list[str]: # conforms to the PizzaOrder model. order_intake_agent = Agent( name='order_intake_agent', + model='gemini-2.5-flash', instruction=( "You are a pizza order intake agent. Your goal is to get the user's" ' pizza order. Use the available tools to find out what sizes, crusts,' @@ -94,6 +95,7 @@ def calculate_price(tool_context: ToolContext) -> str: # the order_intake_agent) and confirms the order with the user. order_confirmation_agent = Agent( name='order_confirmation_agent', + model='gemini-2.5-flash', instruction=( 'Confirm the pizza order with the user. The order is in the state' ' variable `pizza_order`. First, use the `calculate_price` tool to get' diff --git a/contributing/samples/patterns/json_passing_agent/main.py b/contributing/samples/json_passing_agent/main.py similarity index 100% rename from contributing/samples/patterns/json_passing_agent/main.py rename to contributing/samples/json_passing_agent/main.py diff --git a/contributing/samples/integrations/jira_agent/__init__.py b/contributing/samples/langchain_structured_tool_agent/__init__.py similarity index 100% rename from contributing/samples/integrations/jira_agent/__init__.py rename to contributing/samples/langchain_structured_tool_agent/__init__.py diff --git a/contributing/samples/integrations/langchain_structured_tool_agent/agent.py b/contributing/samples/langchain_structured_tool_agent/agent.py similarity index 98% rename from contributing/samples/integrations/langchain_structured_tool_agent/agent.py rename to contributing/samples/langchain_structured_tool_agent/agent.py index d59fea21c0..ce88cdf5db 100644 --- a/contributing/samples/integrations/langchain_structured_tool_agent/agent.py +++ b/contributing/samples/langchain_structured_tool_agent/agent.py @@ -52,6 +52,7 @@ class MinusSchema(BaseModel): ) root_agent = Agent( + model="gemini-2.5-flash", name="test_app", description="A helpful assistant for user questions.", instruction=( diff --git a/contributing/samples/integrations/langchain_youtube_search_agent/README.md b/contributing/samples/langchain_youtube_search_agent/README.md similarity index 100% rename from contributing/samples/integrations/langchain_youtube_search_agent/README.md rename to contributing/samples/langchain_youtube_search_agent/README.md diff --git a/contributing/samples/integrations/langchain_structured_tool_agent/__init__.py b/contributing/samples/langchain_youtube_search_agent/__init__.py similarity index 100% rename from contributing/samples/integrations/langchain_structured_tool_agent/__init__.py rename to contributing/samples/langchain_youtube_search_agent/__init__.py diff --git a/contributing/samples/integrations/langchain_youtube_search_agent/agent.py b/contributing/samples/langchain_youtube_search_agent/agent.py similarity index 94% rename from contributing/samples/integrations/langchain_youtube_search_agent/agent.py rename to contributing/samples/langchain_youtube_search_agent/agent.py index a0bd6eb81c..ee3124caea 100644 --- a/contributing/samples/integrations/langchain_youtube_search_agent/agent.py +++ b/contributing/samples/langchain_youtube_search_agent/agent.py @@ -26,6 +26,7 @@ root_agent = LlmAgent( name="youtube_search_agent", + model="gemini-2.5-flash", # Replace with the actual model name instruction=""" Ask customer to provide singer name, and the number of videos to search. """, diff --git a/contributing/samples/integrations/langchain_youtube_search_agent/requirements.txt b/contributing/samples/langchain_youtube_search_agent/requirements.txt similarity index 100% rename from contributing/samples/integrations/langchain_youtube_search_agent/requirements.txt rename to contributing/samples/langchain_youtube_search_agent/requirements.txt diff --git a/contributing/samples/core/empty_agent/__init__.py b/contributing/samples/litellm_inline_tool_call/__init__.py similarity index 100% rename from contributing/samples/core/empty_agent/__init__.py rename to contributing/samples/litellm_inline_tool_call/__init__.py diff --git a/contributing/samples/models/litellm_inline_tool_call/agent.py b/contributing/samples/litellm_inline_tool_call/agent.py similarity index 100% rename from contributing/samples/models/litellm_inline_tool_call/agent.py rename to contributing/samples/litellm_inline_tool_call/agent.py diff --git a/contributing/samples/integrations/langchain_youtube_search_agent/__init__.py b/contributing/samples/litellm_streaming/__init__.py similarity index 100% rename from contributing/samples/integrations/langchain_youtube_search_agent/__init__.py rename to contributing/samples/litellm_streaming/__init__.py diff --git a/contributing/samples/models/litellm_streaming/agent.py b/contributing/samples/litellm_streaming/agent.py similarity index 100% rename from contributing/samples/models/litellm_streaming/agent.py rename to contributing/samples/litellm_streaming/agent.py diff --git a/contributing/samples/models/litellm_streaming/main.py b/contributing/samples/litellm_streaming/main.py similarity index 100% rename from contributing/samples/models/litellm_streaming/main.py rename to contributing/samples/litellm_streaming/main.py diff --git a/contributing/samples/integrations/oauth2_client_credentials/__init__.py b/contributing/samples/litellm_structured_output/__init__.py similarity index 100% rename from contributing/samples/integrations/oauth2_client_credentials/__init__.py rename to contributing/samples/litellm_structured_output/__init__.py diff --git a/contributing/samples/models/litellm_structured_output/agent.py b/contributing/samples/litellm_structured_output/agent.py similarity index 100% rename from contributing/samples/models/litellm_structured_output/agent.py rename to contributing/samples/litellm_structured_output/agent.py diff --git a/contributing/samples/models/litellm_with_fallback_models/README.md b/contributing/samples/litellm_with_fallback_models/README.md similarity index 100% rename from contributing/samples/models/litellm_with_fallback_models/README.md rename to contributing/samples/litellm_with_fallback_models/README.md diff --git a/contributing/samples/integrations/oauth_calendar_agent/__init__.py b/contributing/samples/litellm_with_fallback_models/__init__.py similarity index 100% rename from contributing/samples/integrations/oauth_calendar_agent/__init__.py rename to contributing/samples/litellm_with_fallback_models/__init__.py diff --git a/contributing/samples/models/litellm_with_fallback_models/agent.py b/contributing/samples/litellm_with_fallback_models/agent.py similarity index 100% rename from contributing/samples/models/litellm_with_fallback_models/agent.py rename to contributing/samples/litellm_with_fallback_models/agent.py diff --git a/contributing/samples/live/live_agent_api_server_example/check_prime_11.wav b/contributing/samples/live_agent_api_server_example/check_prime_11.wav similarity index 100% rename from contributing/samples/live/live_agent_api_server_example/check_prime_11.wav rename to contributing/samples/live_agent_api_server_example/check_prime_11.wav diff --git a/contributing/samples/live/live_agent_api_server_example/check_prime_15.wav b/contributing/samples/live_agent_api_server_example/check_prime_15.wav similarity index 100% rename from contributing/samples/live/live_agent_api_server_example/check_prime_15.wav rename to contributing/samples/live_agent_api_server_example/check_prime_15.wav diff --git a/contributing/samples/live/live_agent_api_server_example/live_agent_example.py b/contributing/samples/live_agent_api_server_example/live_agent_example.py similarity index 100% rename from contributing/samples/live/live_agent_api_server_example/live_agent_example.py rename to contributing/samples/live_agent_api_server_example/live_agent_example.py diff --git a/contributing/samples/live/live_agent_api_server_example/readme.md b/contributing/samples/live_agent_api_server_example/readme.md similarity index 100% rename from contributing/samples/live/live_agent_api_server_example/readme.md rename to contributing/samples/live_agent_api_server_example/readme.md diff --git a/contributing/samples/live/live_bidi_debug_utils/pcm_audio_player.py b/contributing/samples/live_bidi_debug_utils/pcm_audio_player.py similarity index 100% rename from contributing/samples/live/live_bidi_debug_utils/pcm_audio_player.py rename to contributing/samples/live_bidi_debug_utils/pcm_audio_player.py diff --git a/contributing/samples/integrations/pubsub/__init__.py b/contributing/samples/live_bidi_streaming_multi_agent/__init__.py similarity index 100% rename from contributing/samples/integrations/pubsub/__init__.py rename to contributing/samples/live_bidi_streaming_multi_agent/__init__.py diff --git a/contributing/samples/live/live_bidi_streaming_multi_agent/agent.py b/contributing/samples/live_bidi_streaming_multi_agent/agent.py similarity index 100% rename from contributing/samples/live/live_bidi_streaming_multi_agent/agent.py rename to contributing/samples/live_bidi_streaming_multi_agent/agent.py diff --git a/contributing/samples/live/live_bidi_streaming_multi_agent/readme.md b/contributing/samples/live_bidi_streaming_multi_agent/readme.md similarity index 100% rename from contributing/samples/live/live_bidi_streaming_multi_agent/readme.md rename to contributing/samples/live_bidi_streaming_multi_agent/readme.md diff --git a/contributing/samples/live/live_bidi_streaming_parallel_tools_agent/README.md b/contributing/samples/live_bidi_streaming_parallel_tools_agent/README.md similarity index 100% rename from contributing/samples/live/live_bidi_streaming_parallel_tools_agent/README.md rename to contributing/samples/live_bidi_streaming_parallel_tools_agent/README.md diff --git a/contributing/samples/integrations/rag_agent/__init__.py b/contributing/samples/live_bidi_streaming_parallel_tools_agent/__init__.py similarity index 100% rename from contributing/samples/integrations/rag_agent/__init__.py rename to contributing/samples/live_bidi_streaming_parallel_tools_agent/__init__.py diff --git a/contributing/samples/live/live_bidi_streaming_parallel_tools_agent/agent.py b/contributing/samples/live_bidi_streaming_parallel_tools_agent/agent.py similarity index 100% rename from contributing/samples/live/live_bidi_streaming_parallel_tools_agent/agent.py rename to contributing/samples/live_bidi_streaming_parallel_tools_agent/agent.py diff --git a/contributing/samples/integrations/sandbox_computer_use/__init__.py b/contributing/samples/live_bidi_streaming_single_agent/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/integrations/sandbox_computer_use/__init__.py rename to contributing/samples/live_bidi_streaming_single_agent/__init__.py diff --git a/contributing/samples/live/live_bidi_streaming_single_agent/agent.py b/contributing/samples/live_bidi_streaming_single_agent/agent.py similarity index 100% rename from contributing/samples/live/live_bidi_streaming_single_agent/agent.py rename to contributing/samples/live_bidi_streaming_single_agent/agent.py diff --git a/contributing/samples/live/live_bidi_streaming_single_agent/readme.md b/contributing/samples/live_bidi_streaming_single_agent/readme.md similarity index 100% rename from contributing/samples/live/live_bidi_streaming_single_agent/readme.md rename to contributing/samples/live_bidi_streaming_single_agent/readme.md diff --git a/contributing/samples/integrations/spanner/__init__.py b/contributing/samples/live_bidi_streaming_tools_agent/__init__.py similarity index 100% rename from contributing/samples/integrations/spanner/__init__.py rename to contributing/samples/live_bidi_streaming_tools_agent/__init__.py diff --git a/contributing/samples/live/live_bidi_streaming_tools_agent/agent.py b/contributing/samples/live_bidi_streaming_tools_agent/agent.py similarity index 99% rename from contributing/samples/live/live_bidi_streaming_tools_agent/agent.py rename to contributing/samples/live_bidi_streaming_tools_agent/agent.py index 0902802afb..543870f949 100644 --- a/contributing/samples/live/live_bidi_streaming_tools_agent/agent.py +++ b/contributing/samples/live_bidi_streaming_tools_agent/agent.py @@ -90,6 +90,7 @@ async def monitor_video_stream( # Call the model to generate content based on the provided image and prompt response = client.models.generate_content( + model="gemini-2.5-flash", contents=contents, config=genai_types.GenerateContentConfig( system_instruction=( diff --git a/contributing/samples/live/live_bidi_streaming_tools_agent/readme.md b/contributing/samples/live_bidi_streaming_tools_agent/readme.md similarity index 100% rename from contributing/samples/live/live_bidi_streaming_tools_agent/readme.md rename to contributing/samples/live_bidi_streaming_tools_agent/readme.md diff --git a/contributing/samples/integrations/spanner_admin/__init__.py b/contributing/samples/live_tool_callbacks_agent/__init__.py similarity index 100% rename from contributing/samples/integrations/spanner_admin/__init__.py rename to contributing/samples/live_tool_callbacks_agent/__init__.py diff --git a/contributing/samples/live/live_tool_callbacks_agent/agent.py b/contributing/samples/live_tool_callbacks_agent/agent.py similarity index 100% rename from contributing/samples/live/live_tool_callbacks_agent/agent.py rename to contributing/samples/live_tool_callbacks_agent/agent.py diff --git a/contributing/samples/live/live_tool_callbacks_agent/readme.md b/contributing/samples/live_tool_callbacks_agent/readme.md similarity index 100% rename from contributing/samples/live/live_tool_callbacks_agent/readme.md rename to contributing/samples/live_tool_callbacks_agent/readme.md diff --git a/contributing/samples/environment_and_skills/local_environment/README.md b/contributing/samples/local_environment/README.md similarity index 100% rename from contributing/samples/environment_and_skills/local_environment/README.md rename to contributing/samples/local_environment/README.md diff --git a/contributing/samples/integrations/spanner_rag_agent/__init__.py b/contributing/samples/local_environment/__init__.py similarity index 100% rename from contributing/samples/integrations/spanner_rag_agent/__init__.py rename to contributing/samples/local_environment/__init__.py diff --git a/contributing/samples/environment_and_skills/local_environment/agent.py b/contributing/samples/local_environment/agent.py similarity index 100% rename from contributing/samples/environment_and_skills/local_environment/agent.py rename to contributing/samples/local_environment/agent.py diff --git a/contributing/samples/environment_and_skills/local_environment_skill/README.md b/contributing/samples/local_environment_skill/README.md similarity index 100% rename from contributing/samples/environment_and_skills/local_environment_skill/README.md rename to contributing/samples/local_environment_skill/README.md diff --git a/contributing/samples/integrations/toolbox_agent/__init__.py b/contributing/samples/local_environment_skill/__init__.py similarity index 100% rename from contributing/samples/integrations/toolbox_agent/__init__.py rename to contributing/samples/local_environment_skill/__init__.py diff --git a/contributing/samples/environment_and_skills/local_environment_skill/agent.py b/contributing/samples/local_environment_skill/agent.py similarity index 100% rename from contributing/samples/environment_and_skills/local_environment_skill/agent.py rename to contributing/samples/local_environment_skill/agent.py diff --git a/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/SKILL.md b/contributing/samples/local_environment_skill/skills/weather-skill/SKILL.md similarity index 100% rename from contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/SKILL.md rename to contributing/samples/local_environment_skill/skills/weather-skill/SKILL.md diff --git a/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/references/weather_info.md b/contributing/samples/local_environment_skill/skills/weather-skill/references/weather_info.md similarity index 100% rename from contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/references/weather_info.md rename to contributing/samples/local_environment_skill/skills/weather-skill/references/weather_info.md diff --git a/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/scripts/get_humidity.py b/contributing/samples/local_environment_skill/skills/weather-skill/scripts/get_humidity.py similarity index 100% rename from contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/scripts/get_humidity.py rename to contributing/samples/local_environment_skill/skills/weather-skill/scripts/get_humidity.py diff --git a/contributing/samples/logprobs/README.md b/contributing/samples/logprobs/README.md new file mode 100644 index 0000000000..d509be6ec5 --- /dev/null +++ b/contributing/samples/logprobs/README.md @@ -0,0 +1,62 @@ +# Log Probabilities Demo Agent + +This sample demonstrates how to access and display log probabilities from language model responses using the new `avg_logprobs` and `logprobs_result` fields in `LlmResponse`. + +## Overview + +This simple example shows: + +- **Log Probability Access**: How to extract `avg_logprobs` and `logprobs_result` from `LlmResponse` +- **After-Model Callback**: How to append log probability information to responses +- **Confidence Analysis**: How to interpret and display confidence metrics +- **Practical Usage**: Real-world example of accessing logprobs data + +## How It Works + +``` +User Query → Agent Response → Log Probability Analysis Appended + +1. User asks a question +2. Agent generates response with log probabilities enabled +3. After-model callback extracts avg_logprobs from LlmResponse +4. Callback appends log probability analysis to response content +5. User sees both the response and confidence information +``` + +## What You'll See + +The agent response will include log probability analysis like: + +``` +[LOG PROBABILITY ANALYSIS] +📊 Average Log Probability: -0.23 +🎯 Confidence Level: High +📈 Confidence Score: 79.4% +🔍 Top alternatives analyzed: 5 +``` + +## Usage + +### Basic Usage + +```bash +# Run the agent in web UI +adk web contributing/samples + +# Or run via CLI +adk run contributing/samples/logprobs +``` + +## Understanding Log Probabilities + +- **Range**: -∞ to 0 (0 = 100% confident, -1 ≈ 37% confident, -2 ≈ 14% confident) +- **Confidence Levels**: + - High: >= -0.5 (typically factual, straightforward responses) + - Medium: -1.0 to -0.5 (reasonably confident responses) + - Low: < -1.0 (uncertain or complex responses) +- **Use Cases**: Quality control, uncertainty detection, response filtering + +## Key Fields in LlmResponse + +- **`avg_logprobs`**: Average log probability across all tokens in the response +- **`logprobs_result`**: Detailed log probability information including top alternative tokens diff --git a/contributing/samples/legacy_workflows/non_llm_sequential/__init__.py b/contributing/samples/logprobs/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/legacy_workflows/non_llm_sequential/__init__.py rename to contributing/samples/logprobs/__init__.py diff --git a/contributing/samples/core/logprobs/agent.py b/contributing/samples/logprobs/agent.py similarity index 84% rename from contributing/samples/core/logprobs/agent.py rename to contributing/samples/logprobs/agent.py index 1c6e7a2ec6..a281a7480f 100644 --- a/contributing/samples/core/logprobs/agent.py +++ b/contributing/samples/logprobs/agent.py @@ -43,13 +43,9 @@ async def append_logprobs_to_response( # Build log probability analysis if llm_response.avg_logprobs is None: print("⚠️ No log probability data available") - logprobs_info = """ - ---- - -### 📊 Log Probability Analysis - -⚠️ *No log probability data available*""" + logprobs_info = ( + "\n\n[LOG PROBABILITY ANALYSIS]\n⚠️ No log probability data available" + ) else: print(f"📊 Average log probability: {llm_response.avg_logprobs:.4f}") @@ -64,13 +60,10 @@ async def append_logprobs_to_response( logprobs_info = f""" ---- - -### 📊 Log Probability Analysis - -* **Average Log Probability**: {llm_response.avg_logprobs:.4f} -* **Confidence Level**: {confidence_level} -* **Confidence Score**: {100 * (2 ** llm_response.avg_logprobs):.1f}%""" +[LOG PROBABILITY ANALYSIS] +📊 Average Log Probability: {llm_response.avg_logprobs:.4f} +🎯 Confidence Level: {confidence_level} +📈 Confidence Score: {100 * (2 ** llm_response.avg_logprobs):.1f}%""" # Optionally include detailed logprobs_result information if ( @@ -78,24 +71,20 @@ async def append_logprobs_to_response( and llm_response.logprobs_result.top_candidates ): logprobs_info += ( - "\n* **Top Alternatives Analyzed**:" + "\n🔍 Top alternatives analyzed:" f" {len(llm_response.logprobs_result.top_candidates)}" ) # Append logprobs analysis to the response if llm_response.content and llm_response.content.parts: - if not any( - "### 📊 Log Probability Analysis" in p.text - for p in llm_response.content.parts - if p.text - ): - llm_response.content.parts.append(types.Part(text=logprobs_info)) + llm_response.content.parts.append(types.Part(text=logprobs_info)) return llm_response # Create a simple agent that demonstrates logprobs usage root_agent = Agent( + model="gemini-2.5-flash", name="logprobs_demo_agent", description=( "A simple agent that demonstrates log probability extraction and" diff --git a/contributing/samples/legacy_workflows/simple_sequential_agent/__init__.py b/contributing/samples/manual_ollama_test/__init__.py similarity index 100% rename from contributing/samples/legacy_workflows/simple_sequential_agent/__init__.py rename to contributing/samples/manual_ollama_test/__init__.py diff --git a/contributing/samples/models/manual_ollama_test/agent.py b/contributing/samples/manual_ollama_test/agent.py similarity index 100% rename from contributing/samples/models/manual_ollama_test/agent.py rename to contributing/samples/manual_ollama_test/agent.py diff --git a/contributing/samples/mcp/mcp_dynamic_header_agent/README.md b/contributing/samples/mcp_dynamic_header_agent/README.md similarity index 100% rename from contributing/samples/mcp/mcp_dynamic_header_agent/README.md rename to contributing/samples/mcp_dynamic_header_agent/README.md diff --git a/contributing/samples/legacy_workflows/workflow_agent_seq/__init__.py b/contributing/samples/mcp_dynamic_header_agent/__init__.py similarity index 100% rename from contributing/samples/legacy_workflows/workflow_agent_seq/__init__.py rename to contributing/samples/mcp_dynamic_header_agent/__init__.py diff --git a/contributing/samples/mcp/mcp_dynamic_header_agent/agent.py b/contributing/samples/mcp_dynamic_header_agent/agent.py similarity index 97% rename from contributing/samples/mcp/mcp_dynamic_header_agent/agent.py rename to contributing/samples/mcp_dynamic_header_agent/agent.py index 9b5d552807..0d3ce7f6a6 100644 --- a/contributing/samples/mcp/mcp_dynamic_header_agent/agent.py +++ b/contributing/samples/mcp_dynamic_header_agent/agent.py @@ -18,6 +18,7 @@ from google.adk.tools.mcp_tool.mcp_toolset import McpToolset root_agent = LlmAgent( + model='gemini-2.5-flash', name='tenant_agent', instruction="""You are a helpful assistant that helps users get tenant information. Call the get_tenant_data tool when the user asks for tenant data.""", diff --git a/contributing/samples/mcp/mcp_dynamic_header_agent/header_server.py b/contributing/samples/mcp_dynamic_header_agent/header_server.py similarity index 100% rename from contributing/samples/mcp/mcp_dynamic_header_agent/header_server.py rename to contributing/samples/mcp_dynamic_header_agent/header_server.py diff --git a/contributing/samples/mcp/mcp_in_agent_tool_remote/README.md b/contributing/samples/mcp_in_agent_tool_remote/README.md similarity index 100% rename from contributing/samples/mcp/mcp_in_agent_tool_remote/README.md rename to contributing/samples/mcp_in_agent_tool_remote/README.md diff --git a/contributing/samples/live/live_bidi_streaming_multi_agent/__init__.py b/contributing/samples/mcp_in_agent_tool_remote/__init__.py similarity index 100% rename from contributing/samples/live/live_bidi_streaming_multi_agent/__init__.py rename to contributing/samples/mcp_in_agent_tool_remote/__init__.py diff --git a/contributing/samples/mcp/mcp_in_agent_tool_remote/agent.py b/contributing/samples/mcp_in_agent_tool_remote/agent.py similarity index 97% rename from contributing/samples/mcp/mcp_in_agent_tool_remote/agent.py rename to contributing/samples/mcp_in_agent_tool_remote/agent.py index 6d1a305566..f486274aa8 100644 --- a/contributing/samples/mcp/mcp_in_agent_tool_remote/agent.py +++ b/contributing/samples/mcp_in_agent_tool_remote/agent.py @@ -32,6 +32,7 @@ # This agent has direct access to MCP tools sub_agent = Agent( name="mcp_helper", + model="gemini-2.5-flash", description=( "A helpful assistant with access to MCP tools for fetching websites." ), @@ -55,6 +56,7 @@ # This agent can delegate to the sub-agent via AgentTool root_agent = Agent( name="main_agent", + model="gemini-2.5-flash", description="Main agent that can delegate to a sub-agent with MCP tools.", instruction="""You are a helpful assistant. You have access to a sub-agent (mcp_helper) that has MCP tools for fetching websites. diff --git a/contributing/samples/mcp/mcp_in_agent_tool_stdio/README.md b/contributing/samples/mcp_in_agent_tool_stdio/README.md similarity index 100% rename from contributing/samples/mcp/mcp_in_agent_tool_stdio/README.md rename to contributing/samples/mcp_in_agent_tool_stdio/README.md diff --git a/contributing/samples/live/live_bidi_streaming_parallel_tools_agent/__init__.py b/contributing/samples/mcp_in_agent_tool_stdio/__init__.py similarity index 100% rename from contributing/samples/live/live_bidi_streaming_parallel_tools_agent/__init__.py rename to contributing/samples/mcp_in_agent_tool_stdio/__init__.py diff --git a/contributing/samples/mcp/mcp_in_agent_tool_stdio/agent.py b/contributing/samples/mcp_in_agent_tool_stdio/agent.py similarity index 97% rename from contributing/samples/mcp/mcp_in_agent_tool_stdio/agent.py rename to contributing/samples/mcp_in_agent_tool_stdio/agent.py index d4c61ca827..74e20387e9 100644 --- a/contributing/samples/mcp/mcp_in_agent_tool_stdio/agent.py +++ b/contributing/samples/mcp_in_agent_tool_stdio/agent.py @@ -39,6 +39,7 @@ # This agent has direct access to MCP tools sub_agent = Agent( name="mcp_helper", + model="gemini-2.5-flash", description=( "A helpful assistant with access to MCP tools for fetching websites." ), @@ -62,6 +63,7 @@ # This agent can delegate to the sub-agent via AgentTool root_agent = Agent( name="main_agent", + model="gemini-2.5-flash", description="Main agent that can delegate to a sub-agent with MCP tools.", instruction="""You are a helpful assistant. You have access to a sub-agent (mcp_helper) that has MCP tools for fetching websites. diff --git a/contributing/samples/mcp/mcp_postgres_agent/README.md b/contributing/samples/mcp_postgres_agent/README.md similarity index 100% rename from contributing/samples/mcp/mcp_postgres_agent/README.md rename to contributing/samples/mcp_postgres_agent/README.md diff --git a/contributing/samples/live/live_bidi_streaming_single_agent/__init__.py b/contributing/samples/mcp_postgres_agent/__init__.py similarity index 100% rename from contributing/samples/live/live_bidi_streaming_single_agent/__init__.py rename to contributing/samples/mcp_postgres_agent/__init__.py diff --git a/contributing/samples/mcp/mcp_postgres_agent/agent.py b/contributing/samples/mcp_postgres_agent/agent.py similarity index 98% rename from contributing/samples/mcp/mcp_postgres_agent/agent.py rename to contributing/samples/mcp_postgres_agent/agent.py index 61f67a562f..09e75b44d0 100644 --- a/contributing/samples/mcp/mcp_postgres_agent/agent.py +++ b/contributing/samples/mcp_postgres_agent/agent.py @@ -31,6 +31,7 @@ ) root_agent = LlmAgent( + model="gemini-2.5-flash", name="postgres_agent", instruction=( "You are a PostgreSQL database assistant. " diff --git a/contributing/samples/live/live_bidi_streaming_tools_agent/__init__.py b/contributing/samples/mcp_progress_callback_agent/__init__.py similarity index 100% rename from contributing/samples/live/live_bidi_streaming_tools_agent/__init__.py rename to contributing/samples/mcp_progress_callback_agent/__init__.py diff --git a/contributing/samples/mcp/mcp_progress_callback_agent/agent.py b/contributing/samples/mcp_progress_callback_agent/agent.py similarity index 99% rename from contributing/samples/mcp/mcp_progress_callback_agent/agent.py rename to contributing/samples/mcp_progress_callback_agent/agent.py index fa6094033f..756d646f4e 100644 --- a/contributing/samples/mcp/mcp_progress_callback_agent/agent.py +++ b/contributing/samples/mcp_progress_callback_agent/agent.py @@ -132,6 +132,7 @@ async def callback( root_agent = LlmAgent( + model="gemini-2.5-flash", name="progress_demo_agent", instruction="""\ You are a helpful assistant that can run long-running tasks. diff --git a/contributing/samples/mcp/mcp_progress_callback_agent/mock_progress_server.py b/contributing/samples/mcp_progress_callback_agent/mock_progress_server.py similarity index 100% rename from contributing/samples/mcp/mcp_progress_callback_agent/mock_progress_server.py rename to contributing/samples/mcp_progress_callback_agent/mock_progress_server.py diff --git a/contributing/samples/mcp/mcp_server_side_sampling/README.md b/contributing/samples/mcp_server_side_sampling/README.md similarity index 99% rename from contributing/samples/mcp/mcp_server_side_sampling/README.md rename to contributing/samples/mcp_server_side_sampling/README.md index 5ad437e3f5..65eecd4e77 100644 --- a/contributing/samples/mcp/mcp_server_side_sampling/README.md +++ b/contributing/samples/mcp_server_side_sampling/README.md @@ -23,7 +23,7 @@ The flow is as follows: ### Prerequisites -- Python 3.11+ +- Python 3.10+ - `google-adk` library installed. - A configured OpenAI API key. diff --git a/contributing/samples/live/live_tool_callbacks_agent/__init__.py b/contributing/samples/mcp_server_side_sampling/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/live/live_tool_callbacks_agent/__init__.py rename to contributing/samples/mcp_server_side_sampling/__init__.py diff --git a/contributing/samples/mcp/mcp_server_side_sampling/agent.py b/contributing/samples/mcp_server_side_sampling/agent.py similarity index 100% rename from contributing/samples/mcp/mcp_server_side_sampling/agent.py rename to contributing/samples/mcp_server_side_sampling/agent.py diff --git a/contributing/samples/mcp/mcp_server_side_sampling/mcp_server.py b/contributing/samples/mcp_server_side_sampling/mcp_server.py similarity index 100% rename from contributing/samples/mcp/mcp_server_side_sampling/mcp_server.py rename to contributing/samples/mcp_server_side_sampling/mcp_server.py diff --git a/contributing/samples/mcp/mcp_service_account_agent/README.md b/contributing/samples/mcp_service_account_agent/README.md similarity index 100% rename from contributing/samples/mcp/mcp_service_account_agent/README.md rename to contributing/samples/mcp_service_account_agent/README.md diff --git a/contributing/samples/mcp/mcp_dynamic_header_agent/__init__.py b/contributing/samples/mcp_service_account_agent/__init__.py similarity index 100% rename from contributing/samples/mcp/mcp_dynamic_header_agent/__init__.py rename to contributing/samples/mcp_service_account_agent/__init__.py diff --git a/contributing/samples/mcp/mcp_service_account_agent/agent.py b/contributing/samples/mcp_service_account_agent/agent.py similarity index 99% rename from contributing/samples/mcp/mcp_service_account_agent/agent.py rename to contributing/samples/mcp_service_account_agent/agent.py index bd3a18095a..975ff0ccb7 100644 --- a/contributing/samples/mcp/mcp_service_account_agent/agent.py +++ b/contributing/samples/mcp_service_account_agent/agent.py @@ -29,6 +29,7 @@ SCOPES = {"https://www.googleapis.com/auth/cloud-platform": ""} root_agent = LlmAgent( + model="gemini-2.5-flash", name="enterprise_assistant", instruction=""" Help the user with the tools available to you. diff --git a/contributing/samples/mcp/mcp_sse_agent/README.md b/contributing/samples/mcp_sse_agent/README.md similarity index 100% rename from contributing/samples/mcp/mcp_sse_agent/README.md rename to contributing/samples/mcp_sse_agent/README.md diff --git a/contributing/samples/mcp/mcp_in_agent_tool_remote/__init__.py b/contributing/samples/mcp_sse_agent/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/mcp/mcp_in_agent_tool_remote/__init__.py rename to contributing/samples/mcp_sse_agent/__init__.py diff --git a/contributing/samples/mcp/mcp_sse_agent/agent.py b/contributing/samples/mcp_sse_agent/agent.py similarity index 98% rename from contributing/samples/mcp/mcp_sse_agent/agent.py rename to contributing/samples/mcp_sse_agent/agent.py index f26191a441..8bddbca79f 100755 --- a/contributing/samples/mcp/mcp_sse_agent/agent.py +++ b/contributing/samples/mcp_sse_agent/agent.py @@ -28,6 +28,7 @@ ) root_agent = LlmAgent( + model='gemini-2.5-flash', name='enterprise_assistant', instruction=McpInstructionProvider( connection_params=connection_params, diff --git a/contributing/samples/mcp/mcp_sse_agent/filesystem_server.py b/contributing/samples/mcp_sse_agent/filesystem_server.py similarity index 100% rename from contributing/samples/mcp/mcp_sse_agent/filesystem_server.py rename to contributing/samples/mcp_sse_agent/filesystem_server.py diff --git a/contributing/samples/mcp/mcp_stdio_notion_agent/README.md b/contributing/samples/mcp_stdio_notion_agent/README.md similarity index 100% rename from contributing/samples/mcp/mcp_stdio_notion_agent/README.md rename to contributing/samples/mcp_stdio_notion_agent/README.md diff --git a/contributing/samples/mcp/mcp_in_agent_tool_stdio/__init__.py b/contributing/samples/mcp_stdio_notion_agent/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/mcp/mcp_in_agent_tool_stdio/__init__.py rename to contributing/samples/mcp_stdio_notion_agent/__init__.py diff --git a/contributing/samples/mcp/mcp_stdio_notion_agent/agent.py b/contributing/samples/mcp_stdio_notion_agent/agent.py similarity index 98% rename from contributing/samples/mcp/mcp_stdio_notion_agent/agent.py rename to contributing/samples/mcp_stdio_notion_agent/agent.py index 7d348eaa91..1a624f7ee1 100644 --- a/contributing/samples/mcp/mcp_stdio_notion_agent/agent.py +++ b/contributing/samples/mcp_stdio_notion_agent/agent.py @@ -29,6 +29,7 @@ }) root_agent = LlmAgent( + model="gemini-2.5-flash", name="notion_agent", instruction=( "You are my workspace assistant. " diff --git a/contributing/samples/mcp/mcp_postgres_agent/__init__.py b/contributing/samples/mcp_stdio_server_agent/__init__.py similarity index 100% rename from contributing/samples/mcp/mcp_postgres_agent/__init__.py rename to contributing/samples/mcp_stdio_server_agent/__init__.py diff --git a/contributing/samples/mcp/mcp_stdio_server_agent/agent.py b/contributing/samples/mcp_stdio_server_agent/agent.py similarity index 98% rename from contributing/samples/mcp/mcp_stdio_server_agent/agent.py rename to contributing/samples/mcp_stdio_server_agent/agent.py index f4e929e2b5..8b336ba281 100755 --- a/contributing/samples/mcp/mcp_stdio_server_agent/agent.py +++ b/contributing/samples/mcp_stdio_server_agent/agent.py @@ -23,6 +23,7 @@ _allowed_path = os.path.dirname(os.path.abspath(__file__)) root_agent = LlmAgent( + model='gemini-2.5-flash', name='enterprise_assistant', instruction=f"""\ Help user accessing their file systems. diff --git a/contributing/samples/mcp/mcp_streamablehttp_agent/README.md b/contributing/samples/mcp_streamablehttp_agent/README.md similarity index 100% rename from contributing/samples/mcp/mcp_streamablehttp_agent/README.md rename to contributing/samples/mcp_streamablehttp_agent/README.md diff --git a/contributing/samples/mcp/mcp_progress_callback_agent/__init__.py b/contributing/samples/mcp_streamablehttp_agent/__init__.py similarity index 100% rename from contributing/samples/mcp/mcp_progress_callback_agent/__init__.py rename to contributing/samples/mcp_streamablehttp_agent/__init__.py diff --git a/contributing/samples/mcp/mcp_streamablehttp_agent/agent.py b/contributing/samples/mcp_streamablehttp_agent/agent.py similarity index 98% rename from contributing/samples/mcp/mcp_streamablehttp_agent/agent.py rename to contributing/samples/mcp_streamablehttp_agent/agent.py index ae5b3b5a70..cc88cf4e5b 100644 --- a/contributing/samples/mcp/mcp_streamablehttp_agent/agent.py +++ b/contributing/samples/mcp_streamablehttp_agent/agent.py @@ -22,6 +22,7 @@ _allowed_path = os.path.dirname(os.path.abspath(__file__)) root_agent = LlmAgent( + model='gemini-2.5-flash', name='enterprise_assistant', instruction=f"""\ Help user accessing their file systems. diff --git a/contributing/samples/mcp/mcp_streamablehttp_agent/filesystem_server.py b/contributing/samples/mcp_streamablehttp_agent/filesystem_server.py similarity index 100% rename from contributing/samples/mcp/mcp_streamablehttp_agent/filesystem_server.py rename to contributing/samples/mcp_streamablehttp_agent/filesystem_server.py diff --git a/contributing/samples/mcp/mcp_toolset_auth/README.md b/contributing/samples/mcp_toolset_auth/README.md similarity index 100% rename from contributing/samples/mcp/mcp_toolset_auth/README.md rename to contributing/samples/mcp_toolset_auth/README.md diff --git a/contributing/samples/mcp/mcp_server_side_sampling/__init__.py b/contributing/samples/mcp_toolset_auth/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/mcp/mcp_server_side_sampling/__init__.py rename to contributing/samples/mcp_toolset_auth/__init__.py diff --git a/contributing/samples/mcp/mcp_toolset_auth/agent.py b/contributing/samples/mcp_toolset_auth/agent.py similarity index 98% rename from contributing/samples/mcp/mcp_toolset_auth/agent.py rename to contributing/samples/mcp_toolset_auth/agent.py index a0bde37541..bc0e8e54dd 100644 --- a/contributing/samples/mcp/mcp_toolset_auth/agent.py +++ b/contributing/samples/mcp_toolset_auth/agent.py @@ -63,6 +63,7 @@ # Define the agent that uses the OAuth-protected MCP toolset root_agent = LlmAgent( + model='gemini-2.5-flash', name='oauth_mcp_agent', instruction="""You are a helpful assistant that can access user information. diff --git a/contributing/samples/mcp/mcp_toolset_auth/main.py b/contributing/samples/mcp_toolset_auth/main.py similarity index 100% rename from contributing/samples/mcp/mcp_toolset_auth/main.py rename to contributing/samples/mcp_toolset_auth/main.py diff --git a/contributing/samples/mcp/mcp_toolset_auth/oauth_mcp_server.py b/contributing/samples/mcp_toolset_auth/oauth_mcp_server.py similarity index 100% rename from contributing/samples/mcp/mcp_toolset_auth/oauth_mcp_server.py rename to contributing/samples/mcp_toolset_auth/oauth_mcp_server.py diff --git a/contributing/samples/mcp/mcp_service_account_agent/__init__.py b/contributing/samples/memory/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/mcp/mcp_service_account_agent/__init__.py rename to contributing/samples/memory/__init__.py diff --git a/contributing/samples/context_management/memory/agent.py b/contributing/samples/memory/agent.py similarity index 97% rename from contributing/samples/context_management/memory/agent.py rename to contributing/samples/memory/agent.py index 96f1d15b45..325ec0d78c 100755 --- a/contributing/samples/context_management/memory/agent.py +++ b/contributing/samples/memory/agent.py @@ -26,6 +26,7 @@ def update_current_time(callback_context: CallbackContext): root_agent = Agent( + model='gemini-2.5-flash', name='memory_agent', description='agent that have access to memory tools.', before_agent_callback=update_current_time, diff --git a/contributing/samples/context_management/memory/main.py b/contributing/samples/memory/main.py similarity index 100% rename from contributing/samples/context_management/memory/main.py rename to contributing/samples/memory/main.py diff --git a/contributing/samples/context_management/migrate_session_db/README.md b/contributing/samples/migrate_session_db/README.md similarity index 100% rename from contributing/samples/context_management/migrate_session_db/README.md rename to contributing/samples/migrate_session_db/README.md diff --git a/contributing/samples/models/hello_world_litellm/__init__.py b/contributing/samples/migrate_session_db/__init__.py similarity index 100% rename from contributing/samples/models/hello_world_litellm/__init__.py rename to contributing/samples/migrate_session_db/__init__.py diff --git a/contributing/samples/context_management/migrate_session_db/agent.py b/contributing/samples/migrate_session_db/agent.py similarity index 99% rename from contributing/samples/context_management/migrate_session_db/agent.py rename to contributing/samples/migrate_session_db/agent.py index f7440fc553..a6f5aaac80 100644 --- a/contributing/samples/context_management/migrate_session_db/agent.py +++ b/contributing/samples/migrate_session_db/agent.py @@ -59,6 +59,7 @@ async def check_prime(nums: list[int]) -> str: root_agent = Agent( + model="gemini-2.5-flash", name="migrate_session_db_agent", description=( "hello world agent that can roll a dice of 8 sides and check prime" diff --git a/contributing/samples/context_management/migrate_session_db/dnd_sessions.db b/contributing/samples/migrate_session_db/dnd_sessions.db similarity index 100% rename from contributing/samples/context_management/migrate_session_db/dnd_sessions.db rename to contributing/samples/migrate_session_db/dnd_sessions.db diff --git a/contributing/samples/context_management/migrate_session_db/main.py b/contributing/samples/migrate_session_db/main.py similarity index 100% rename from contributing/samples/context_management/migrate_session_db/main.py rename to contributing/samples/migrate_session_db/main.py diff --git a/contributing/samples/context_management/migrate_session_db/sample-output/alembic.ini b/contributing/samples/migrate_session_db/sample-output/alembic.ini similarity index 100% rename from contributing/samples/context_management/migrate_session_db/sample-output/alembic.ini rename to contributing/samples/migrate_session_db/sample-output/alembic.ini diff --git a/contributing/samples/context_management/migrate_session_db/sample-output/alembic/README b/contributing/samples/migrate_session_db/sample-output/alembic/README similarity index 100% rename from contributing/samples/context_management/migrate_session_db/sample-output/alembic/README rename to contributing/samples/migrate_session_db/sample-output/alembic/README diff --git a/contributing/samples/context_management/migrate_session_db/sample-output/alembic/env.py b/contributing/samples/migrate_session_db/sample-output/alembic/env.py similarity index 100% rename from contributing/samples/context_management/migrate_session_db/sample-output/alembic/env.py rename to contributing/samples/migrate_session_db/sample-output/alembic/env.py diff --git a/contributing/samples/context_management/migrate_session_db/sample-output/alembic/script.py.mako b/contributing/samples/migrate_session_db/sample-output/alembic/script.py.mako similarity index 100% rename from contributing/samples/context_management/migrate_session_db/sample-output/alembic/script.py.mako rename to contributing/samples/migrate_session_db/sample-output/alembic/script.py.mako diff --git a/contributing/samples/context_management/migrate_session_db/sessions.db b/contributing/samples/migrate_session_db/sessions.db similarity index 100% rename from contributing/samples/context_management/migrate_session_db/sessions.db rename to contributing/samples/migrate_session_db/sessions.db diff --git a/contributing/samples/models/litellm_inline_tool_call/__init__.py b/contributing/samples/models/litellm_inline_tool_call/__init__.py deleted file mode 100644 index 606228d280..0000000000 --- a/contributing/samples/models/litellm_inline_tool_call/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from . import agent diff --git a/contributing/samples/multi_agent/hello_world_ma/tests/roll_die_and_check_prime.json b/contributing/samples/multi_agent/hello_world_ma/tests/roll_die_and_check_prime.json deleted file mode 100644 index b45cfd9f19..0000000000 --- a/contributing/samples/multi_agent/hello_world_ma/tests/roll_die_and_check_prime.json +++ /dev/null @@ -1,296 +0,0 @@ -{ - "appName": "hello_world_ma", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "hi" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Hello! How can I help you today?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "roll a dice of 10 dies" - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-2", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "agent_name": "roll_agent" - }, - "id": "fc-1", - "name": "transfer_to_agent" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-2", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "actions": { - "transferToAgent": "roll_agent" - }, - "author": "root_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "transfer_to_agent", - "response": { - "result": null - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-2", - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "roll_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "sides": 10 - }, - "id": "fc-2", - "name": "roll_die" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-2", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/roll_agent@1" - } - }, - { - "author": "roll_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "roll_die", - "response": { - "result": 2 - } - } - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-2", - "nodeInfo": { - "path": "root_agent@1/roll_agent@1" - } - }, - { - "author": "roll_agent", - "content": { - "parts": [ - { - "text": "You rolled a 2.\n" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-8", - "invocationId": "i-2", - "nodeInfo": { - "path": "root_agent@1/roll_agent@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "check it" - } - ], - "role": "user" - }, - "id": "e-9", - "invocationId": "i-3", - "nodeInfo": { - "path": "" - } - }, - { - "author": "roll_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "agent_name": "prime_agent" - }, - "id": "fc-3", - "name": "transfer_to_agent" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-10", - "invocationId": "i-3", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/roll_agent@1" - } - }, - { - "actions": { - "transferToAgent": "prime_agent" - }, - "author": "roll_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-3", - "name": "transfer_to_agent", - "response": { - "result": null - } - } - } - ], - "role": "user" - }, - "id": "e-11", - "invocationId": "i-3", - "nodeInfo": { - "path": "root_agent@1/roll_agent@1" - } - }, - { - "author": "prime_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "nums": [ - 2 - ] - }, - "id": "fc-4", - "name": "check_prime" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-12", - "invocationId": "i-3", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/prime_agent@1" - } - }, - { - "author": "prime_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-4", - "name": "check_prime", - "response": { - "result": "2 are prime numbers." - } - } - } - ], - "role": "user" - }, - "id": "e-13", - "invocationId": "i-3", - "nodeInfo": { - "path": "root_agent@1/prime_agent@1" - } - }, - { - "author": "prime_agent", - "content": { - "parts": [ - { - "text": "2 are prime numbers." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-14", - "invocationId": "i-3", - "nodeInfo": { - "path": "root_agent@1/prime_agent@1" - } - } - ] -} diff --git a/contributing/samples/multi_agent/single_turn_sub_agent/README.md b/contributing/samples/multi_agent/single_turn_sub_agent/README.md deleted file mode 100644 index b08ba9ca39..0000000000 --- a/contributing/samples/multi_agent/single_turn_sub_agent/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# ADK Single-turn Agent as Sub-agent Sample - -## Overview - -This sample demonstrates how a "single_turn" mode agent can act as an autonomous sub-agent to an LLM agent, utilizing schemas and tools without ever interacting with the user. - -**Note**: This is the recommended mechanism to replace the older `AgentTool` pattern. Unlike `AgentTool`, using a `single_turn` sub-agent preserves the sub-agent's internal interactions (like tool calls) in the session history. - -Single-turn agents are designed to execute their function fully in one prompt-response cycle. In this sample: - -1. `phone_recommender`: A single-turn agent that receives structured input (`UserPreferences`), uses a mocked tool (`check_phone_price`), and returns structured output (`PhoneRecommendation`). -1. `root_agent`: The main agent that interacts with the user, translates their natural language request into the structured `UserPreferences`, and delegates to `phone_recommender`. - -## Sample Inputs - -- `I need a phone mostly for gaming. I have about $1000 to spend.` - -- `What is a good cheap phone from Google for basic tasks?` - -- `I love photography but prefer smaller phones. My budget is $600.` - -## Graph - -```mermaid -graph TD - root_agent --> phone_recommender - phone_recommender -.->|uses| check_phone_price[check_phone_price tool] -``` - -## How To - -1. Define a sub-agent with `mode="single_turn"`, `input_schema`, `output_schema`: - - ```python - phone_recommender = Agent( - name="phone_recommender", - mode="single_turn", - input_schema=UserPreferences, - output_schema=PhoneRecommendation, - tools=[check_phone_price], - ... - ) - ``` - -1. Assign it to a parent agent: - - ```python - root_agent = Agent( - sub_agents=[phone_recommender], - ... - ) - ``` diff --git a/contributing/samples/multi_agent/single_turn_sub_agent/agent.py b/contributing/samples/multi_agent/single_turn_sub_agent/agent.py deleted file mode 100644 index ec25e167a7..0000000000 --- a/contributing/samples/multi_agent/single_turn_sub_agent/agent.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from google.adk import Agent -from pydantic import BaseModel -from pydantic import Field - - -class UserPreferences(BaseModel): - budget: int = Field(description="The user's maximum budget in USD") - primary_use: str = Field( - description=( - "What the user primarily uses their phone for (e.g., photography," - " gaming, basics)" - ) - ) - preferred_size: str = Field( - description="Preferred phone size (e.g., small, large, any)" - ) - - -class PhoneRecommendation(BaseModel): - """Output schema for the phone recommendation.""" - - model_name: str - price: float - reason: str - - -def check_phone_price(model_name: str) -> float: - """Mock tool to check the current price of a Pixel phone model.""" - prices = { - "Pixel 10a": 499.0, - "Pixel 10": 799.0, - "Pixel 10 Pro": 999.0, - "Pixel 10 Pro XL": 1199.0, - "Pixel 10 Pro Fold": 1799.0, - } - # Simple mock logic, defaulting to 799 if not found exactly - for key, value in prices.items(): - if key.lower() in model_name.lower(): - return value - return 799.0 - - -phone_recommender = Agent( - name="phone_recommender", - mode="single_turn", - input_schema=UserPreferences, - output_schema=PhoneRecommendation, - tools=[check_phone_price], - instruction=("""\ -You are an expert Google Pixel hardware recommender. -Based on the provided UserPreferences, recommend exactly one Pixel phone model. -You must use the `check_phone_price` tool to find the exact current price of the model you are recommending before you finish your task. -Only recommend these phones: Pixel 10a, Pixel 10, Pixel 10 Pro, Pixel 10 Pro XL, Pixel 10 Pro Fold. - """), - description="Recommends a Pixel phone based on preferences.", -) - - -root_agent = Agent( - name="root_agent", - sub_agents=[phone_recommender], - instruction=("""\ -You are a helpful phone sales associate. -If the user is asking for a phone recommendation, use the `phone_recommender` to get a structured recommendation. -Once the recommender finishes, present the model, price, and reason to the user in a friendly way. - """), -) diff --git a/contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000.json b/contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000.json deleted file mode 100644 index 9112d546db..0000000000 --- a/contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000.json +++ /dev/null @@ -1,440 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "gaming, $1000" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "That sounds like a great budget for a gaming phone! To give you the best recommendation, could you tell me what size phone you prefer? Do you like something **small**, **large**, or is **any** size okay with you?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "large" - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-2", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "budget": 1000, - "preferred_size": "large", - "primary_use": "gaming" - }, - "id": "fc-1", - "name": "phone_recommender" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-2", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10 Pro XL" - }, - "id": "fc-2", - "name": "check_phone_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-2", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "check_phone_price", - "response": { - "result": 799.0 - } - } - } - ], - "role": "user" - }, - "id": "e-6", - "invocationId": "i-2", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10 Pro Fold" - }, - "id": "fc-3", - "name": "check_phone_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-7", - "invocationId": "i-2", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-3", - "name": "check_phone_price", - "response": { - "result": 799.0 - } - } - } - ], - "role": "user" - }, - "id": "e-8", - "invocationId": "i-2", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10 Pro" - }, - "id": "fc-4", - "name": "check_phone_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-9", - "invocationId": "i-2", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-4", - "name": "check_phone_price", - "response": { - "result": 799.0 - } - } - } - ], - "role": "user" - }, - "id": "e-10", - "invocationId": "i-2", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10" - }, - "id": "fc-5", - "name": "check_phone_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-11", - "invocationId": "i-2", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-5", - "name": "check_phone_price", - "response": { - "result": 799.0 - } - } - } - ], - "role": "user" - }, - "id": "e-12", - "invocationId": "i-2", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10a" - }, - "id": "fc-6", - "name": "check_phone_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-13", - "invocationId": "i-2", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-6", - "name": "check_phone_price", - "response": { - "result": 499.0 - } - } - } - ], - "role": "user" - }, - "id": "e-14", - "invocationId": "i-2", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10 Pro XL", - "price": 799, - "reason": "The Pixel 10 Pro XL is the best fit for your gaming needs and preference for a large screen. At $799, it is well within your $1000 budget and provides the high performance and large display area required for an optimal gaming experience." - }, - "id": "fc-7", - "name": "set_model_response" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-15", - "invocationId": "i-2", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "actions": { - "setModelResponse": { - "model_name": "Pixel 10 Pro XL", - "price": 799.0, - "reason": "The Pixel 10 Pro XL is the best fit for your gaming needs and preference for a large screen. At $799, it is well within your $1000 budget and provides the high performance and large display area required for an optimal gaming experience." - } - }, - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-7", - "name": "set_model_response", - "response": { - "model_name": "Pixel 10 Pro XL", - "price": 799.0, - "reason": "The Pixel 10 Pro XL is the best fit for your gaming needs and preference for a large screen. At $799, it is well within your $1000 budget and provides the high performance and large display area required for an optimal gaming experience." - } - } - } - ], - "role": "user" - }, - "id": "e-16", - "invocationId": "i-2", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "text": "{\"model_name\": \"Pixel 10 Pro XL\", \"price\": 799.0, \"reason\": \"The Pixel 10 Pro XL is the best fit for your gaming needs and preference for a large screen. At $799, it is well within your $1000 budget and provides the high performance and large display area required for an optimal gaming experience.\"}" - } - ], - "role": "model" - }, - "id": "e-17", - "invocationId": "i-2", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/phone_recommender@1" - ], - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "phone_recommender", - "response": { - "model_name": "Pixel 10 Pro XL", - "price": 799.0, - "reason": "The Pixel 10 Pro XL is the best fit for your gaming needs and preference for a large screen. At $799, it is well within your $1000 budget and provides the high performance and large display area required for an optimal gaming experience." - } - } - } - ], - "role": "user" - }, - "id": "e-18", - "invocationId": "i-2", - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "OK! Based on what you're looking for, I recommend the **Pixel 10 Pro XL**.\n\n* **Price:** $799\n* **Why it's for you:** It\u2019s the perfect fit for your gaming needs and preference for a large screen. Since it's $799, it's well under your $1,000 budget while providing the high performance and large display area you need for the best gaming experience." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-19", - "invocationId": "i-2", - "nodeInfo": { - "path": "root_agent@1" - } - } - ] -} diff --git a/contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000_large.json b/contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000_large.json deleted file mode 100644 index 93be74f981..0000000000 --- a/contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000_large.json +++ /dev/null @@ -1,359 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "gaming, $1000, large" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "budget": 1000, - "preferred_size": "large", - "primary_use": "gaming" - }, - "id": "fc-1", - "name": "phone_recommender" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10 Pro XL" - }, - "id": "fc-2", - "name": "check_phone_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "check_phone_price", - "response": { - "result": 799.0 - } - } - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10 Pro" - }, - "id": "fc-3", - "name": "check_phone_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-3", - "name": "check_phone_price", - "response": { - "result": 799.0 - } - } - } - ], - "role": "user" - }, - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10 Pro Fold" - }, - "id": "fc-4", - "name": "check_phone_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-7", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-4", - "name": "check_phone_price", - "response": { - "result": 799.0 - } - } - } - ], - "role": "user" - }, - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10" - }, - "id": "fc-5", - "name": "check_phone_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-9", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-5", - "name": "check_phone_price", - "response": { - "result": 799.0 - } - } - } - ], - "role": "user" - }, - "id": "e-10", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10 Pro XL", - "price": 799, - "reason": "The Pixel 10 Pro XL is the best choice for gaming due to its large screen and high performance. It fits perfectly within your $1000 budget and satisfies your preference for a large device." - }, - "id": "fc-6", - "name": "set_model_response" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-11", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "actions": { - "setModelResponse": { - "model_name": "Pixel 10 Pro XL", - "price": 799.0, - "reason": "The Pixel 10 Pro XL is the best choice for gaming due to its large screen and high performance. It fits perfectly within your $1000 budget and satisfies your preference for a large device." - } - }, - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-6", - "name": "set_model_response", - "response": { - "model_name": "Pixel 10 Pro XL", - "price": 799.0, - "reason": "The Pixel 10 Pro XL is the best choice for gaming due to its large screen and high performance. It fits perfectly within your $1000 budget and satisfies your preference for a large device." - } - } - } - ], - "role": "user" - }, - "id": "e-12", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "text": "{\"model_name\": \"Pixel 10 Pro XL\", \"price\": 799.0, \"reason\": \"The Pixel 10 Pro XL is the best choice for gaming due to its large screen and high performance. It fits perfectly within your $1000 budget and satisfies your preference for a large device.\"}" - } - ], - "role": "model" - }, - "id": "e-13", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/phone_recommender@1" - ], - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "phone_recommender", - "response": { - "model_name": "Pixel 10 Pro XL", - "price": 799.0, - "reason": "The Pixel 10 Pro XL is the best choice for gaming due to its large screen and high performance. It fits perfectly within your $1000 budget and satisfies your preference for a large device." - } - } - } - ], - "role": "user" - }, - "id": "e-14", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "OK! Based on your preferences, I recommend the **Pixel 10 Pro XL**.\n\n* **Model:** Pixel 10 Pro XL\n* **Price:** $799\n* **Why it's for you:** The Pixel 10 Pro XL is the best choice for gaming due to its large screen and high performance. It fits perfectly within your $1000 budget and satisfies your preference for a large device." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-15", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1" - } - } - ] -} diff --git a/contributing/samples/multi_agent/single_turn_sub_agent/tests/go.json b/contributing/samples/multi_agent/single_turn_sub_agent/tests/go.json deleted file mode 100644 index 8eea2f7d70..0000000000 --- a/contributing/samples/multi_agent/single_turn_sub_agent/tests/go.json +++ /dev/null @@ -1,383 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "go" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Hello! I'm here to help you find the perfect Pixel phone. \n\nTo get started, could you tell me a bit about what you're looking for? Specifically:\n\n1. **What is your maximum budget?**\n2. **What size phone do you prefer?** (e.g., small, large, or doesn't matter)\n3. **What will be your primary use for the phone?** (e.g., photography, gaming, just the basics)\n\nOnce I have those details, I can give you a great recommendation!" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "$1000, gaming" - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-2", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "That sounds like a great budget for a gaming-focused phone! To make sure I get the recommendation just right, **what size phone do you prefer?** (e.g., small, large, or any size)." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-2", - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "large" - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-3", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "budget": 1000, - "preferred_size": "large", - "primary_use": "gaming" - }, - "id": "fc-1", - "name": "phone_recommender" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-3", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10 Pro XL" - }, - "id": "fc-2", - "name": "check_phone_price" - } - }, - { - "functionCall": { - "args": { - "model_name": "Pixel 10 Pro Fold" - }, - "id": "fc-3", - "name": "check_phone_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-7", - "invocationId": "i-3", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "check_phone_price", - "response": { - "result": 799.0 - } - } - }, - { - "functionResponse": { - "id": "fc-3", - "name": "check_phone_price", - "response": { - "result": 799.0 - } - } - } - ], - "role": "user" - }, - "id": "e-8", - "invocationId": "i-3", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10a" - }, - "id": "fc-4", - "name": "check_phone_price" - } - }, - { - "functionCall": { - "args": { - "model_name": "Pixel 10" - }, - "id": "fc-5", - "name": "check_phone_price" - } - }, - { - "functionCall": { - "args": { - "model_name": "Pixel 10 Pro" - }, - "id": "fc-6", - "name": "check_phone_price" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-9", - "invocationId": "i-3", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-4", - "name": "check_phone_price", - "response": { - "result": 499.0 - } - } - }, - { - "functionResponse": { - "id": "fc-5", - "name": "check_phone_price", - "response": { - "result": 799.0 - } - } - }, - { - "functionResponse": { - "id": "fc-6", - "name": "check_phone_price", - "response": { - "result": 799.0 - } - } - } - ], - "role": "user" - }, - "id": "e-10", - "invocationId": "i-3", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "model_name": "Pixel 10 Pro XL", - "price": 799, - "reason": "The Pixel 10 Pro XL fits your budget of $1000 and matches your preference for a large screen, which is ideal for gaming. At $799, it offers the best balance of performance and display size within your requirements." - }, - "id": "fc-7", - "name": "set_model_response" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-11", - "invocationId": "i-3", - "longRunningToolIds": [], - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "actions": { - "setModelResponse": { - "model_name": "Pixel 10 Pro XL", - "price": 799.0, - "reason": "The Pixel 10 Pro XL fits your budget of $1000 and matches your preference for a large screen, which is ideal for gaming. At $799, it offers the best balance of performance and display size within your requirements." - } - }, - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-7", - "name": "set_model_response", - "response": { - "model_name": "Pixel 10 Pro XL", - "price": 799.0, - "reason": "The Pixel 10 Pro XL fits your budget of $1000 and matches your preference for a large screen, which is ideal for gaming. At $799, it offers the best balance of performance and display size within your requirements." - } - } - } - ], - "role": "user" - }, - "id": "e-12", - "invocationId": "i-3", - "nodeInfo": { - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "phone_recommender", - "branch": "phone_recommender@1", - "content": { - "parts": [ - { - "text": "{\"model_name\": \"Pixel 10 Pro XL\", \"price\": 799.0, \"reason\": \"The Pixel 10 Pro XL fits your budget of $1000 and matches your preference for a large screen, which is ideal for gaming. At $799, it offers the best balance of performance and display size within your requirements.\"}" - } - ], - "role": "model" - }, - "id": "e-13", - "invocationId": "i-3", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/phone_recommender@1" - ], - "path": "root_agent@1/phone_recommender@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "phone_recommender", - "response": { - "model_name": "Pixel 10 Pro XL", - "price": 799.0, - "reason": "The Pixel 10 Pro XL fits your budget of $1000 and matches your preference for a large screen, which is ideal for gaming. At $799, it offers the best balance of performance and display size within your requirements." - } - } - } - ], - "role": "user" - }, - "id": "e-14", - "invocationId": "i-3", - "nodeInfo": { - "path": "root_agent@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Based on what you're looking for, I highly recommend the **Pixel 10 Pro XL**.\n\n* **Model:** Pixel 10 Pro XL\n* **Price:** $799\n* **Why it's perfect for you:** It fits perfectly within your $1000 budget and features the large display you prefer, which is fantastic for an immersive gaming experience. It offers a great balance of top-tier performance and screen real estate!\n\nHow does that sound to you?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-15", - "invocationId": "i-3", - "nodeInfo": { - "path": "root_agent@1" - } - } - ] -} diff --git a/contributing/samples/multi_agent/sub_agents/README.md b/contributing/samples/multi_agent/sub_agents/README.md deleted file mode 100644 index 31767a3232..0000000000 --- a/contributing/samples/multi_agent/sub_agents/README.md +++ /dev/null @@ -1,72 +0,0 @@ -# ADK Agent Sub-Agents Sample - -## Overview - -This sample demonstrates how to create a hierarchical agent setup using sub-agents in the **ADK** framework, and also showcases how to use tool confirmation. - -It defines a root `Agent` named `sub_agents` that coordinates two sub-agents: `info_agent` and `close_agent`. - -- `info_agent` is equipped with a tool to check account status. -- `close_agent` is equipped with a tool to close accounts, which requires user confirmation before execution. - -The root agent delegates tasks to these sub-agents based on the user's prompt. This sample illustrates how to modularize capabilities into separate agents instead of combining all tools on a single agent. - -## Sample Inputs - -- `Check the status of account ACC-123.` - -- `Close account ACC-123.` - -- `Check if account ACC-123 is active, and if so, close it.` - -## Graph - -```mermaid -graph TD - sub_agents[Agent: sub_agents] --> info_agent[Agent: info_agent] - sub_agents --> close_agent[Agent: close_agent] - info_agent --> get_account_status[Tool: get_account_status] - close_agent --> close_account[Tool: close_account
requires confirmation] -``` - -## How To - -1. Define the specific tools for each sub-agent: - - ```python - def get_account_status(account_id: str) -> str: - """Gets the status of a bank account.""" - return f"Account {account_id} is active." - - def close_account(account_id: str) -> str: - """Closes a bank account.""" - return f"Account {account_id} has been closed." - ``` - -1. Register tools to their respective sub-agents, using `FunctionTool` for confirmation: - - ```python - from google.adk.agents import Agent - from google.adk.tools.function_tool import FunctionTool - - info_agent = Agent( - name="info_agent", - description="An agent that can check account status.", - tools=[get_account_status], - ) - - close_agent = Agent( - name="close_agent", - description="An agent that can close accounts.", - tools=[FunctionTool(func=close_account, require_confirmation=True)], - ) - ``` - -1. Add the sub-agents to the root agent's `sub_agents` list: - - ```python - root_agent = Agent( - name="sub_agents", - sub_agents=[info_agent, close_agent], - ) - ``` diff --git a/contributing/samples/multi_agent/sub_agents/agent.py b/contributing/samples/multi_agent/sub_agents/agent.py deleted file mode 100644 index 5bec705773..0000000000 --- a/contributing/samples/multi_agent/sub_agents/agent.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk.agents import Agent -from google.adk.tools.function_tool import FunctionTool - - -def get_account_status(account_id: str) -> str: - """Gets the status of a bank account. - - Args: - account_id: The account ID to check. - - Returns: - The status of the account. - """ - return f"Account {account_id} is active." - - -def close_account(account_id: str) -> str: - """Closes a bank account. This action requires user confirmation. - - Args: - account_id: The account ID to close. - - Returns: - A confirmation message. - """ - return f"Account {account_id} has been closed." - - -info_agent = Agent( - name="info_agent", - description="An agent that can check account status.", - tools=[get_account_status], -) - -close_agent = Agent( - name="close_agent", - description="An agent that can close accounts.", - tools=[FunctionTool(func=close_account, require_confirmation=True)], -) - -root_agent = Agent( - name="sub_agents", - description=( - "A root agent that can check accounts and close them by delegating to" - " sub-agents." - ), - sub_agents=[info_agent, close_agent], -) diff --git a/contributing/samples/multi_agent/sub_agents/tests/check_and_close.json b/contributing/samples/multi_agent/sub_agents/tests/check_and_close.json deleted file mode 100644 index 5bd623ebe6..0000000000 --- a/contributing/samples/multi_agent/sub_agents/tests/check_and_close.json +++ /dev/null @@ -1,315 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Check if account ACC-123 is active, and if so, close it." - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "sub_agents", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "agent_name": "info_agent" - }, - "id": "fc-1", - "name": "transfer_to_agent" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "sub_agents@1" - } - }, - { - "actions": { - "transferToAgent": "info_agent" - }, - "author": "sub_agents", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "transfer_to_agent", - "response": { - "result": null - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "sub_agents@1" - } - }, - { - "author": "info_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "account_id": "ACC-123" - }, - "id": "fc-2", - "name": "get_account_status" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "sub_agents@1/info_agent@1" - } - }, - { - "author": "info_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "get_account_status", - "response": { - "result": "Account ACC-123 is active." - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "sub_agents@1/info_agent@1" - } - }, - { - "author": "info_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "agent_name": "close_agent" - }, - "id": "fc-3", - "name": "transfer_to_agent" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "sub_agents@1/info_agent@1" - } - }, - { - "actions": { - "transferToAgent": "close_agent" - }, - "author": "info_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-3", - "name": "transfer_to_agent", - "response": { - "result": null - } - } - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "sub_agents@1/info_agent@1" - } - }, - { - "author": "close_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "account_id": "ACC-123" - }, - "id": "fc-4", - "name": "close_account" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-8", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "sub_agents@1/close_agent@1" - } - }, - { - "author": "close_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "originalFunctionCall": { - "args": { - "account_id": "ACC-123" - }, - "id": "fc-4", - "name": "close_account" - }, - "toolConfirmation": { - "confirmed": false, - "hint": "Please approve or reject the tool call close_account() by responding with a FunctionResponse with an expected ToolConfirmation payload." - } - }, - "id": "fc-5", - "name": "adk_request_confirmation" - } - } - ], - "role": "user" - }, - "id": "e-9", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-5" - ], - "nodeInfo": { - "path": "sub_agents@1/close_agent@1" - } - }, - { - "actions": { - "requestedToolConfirmations": { - "fc-4": { - "confirmed": false, - "hint": "Please approve or reject the tool call close_account() by responding with a FunctionResponse with an expected ToolConfirmation payload." - } - }, - "skipSummarization": true - }, - "author": "close_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-4", - "name": "close_account", - "response": { - "error": "This tool call requires confirmation, please approve or reject." - } - } - } - ], - "role": "user" - }, - "id": "e-10", - "invocationId": "i-1", - "nodeInfo": { - "path": "sub_agents@1/close_agent@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-5", - "name": "adk_request_confirmation", - "response": { - "confirmed": true - } - } - } - ], - "role": "user" - }, - "id": "e-11", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "close_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-4", - "name": "close_account", - "response": { - "result": "Account ACC-123 has been closed." - } - } - } - ], - "role": "user" - }, - "id": "e-12", - "invocationId": "i-1", - "nodeInfo": { - "path": "sub_agents@1/close_agent@1" - } - }, - { - "author": "close_agent", - "content": { - "parts": [ - { - "text": "Account ACC-123 has been closed." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-13", - "invocationId": "i-1", - "nodeInfo": { - "path": "sub_agents@1/close_agent@1" - } - } - ] -} diff --git a/contributing/samples/multi_agent/sub_agents/tests/check_status.json b/contributing/samples/multi_agent/sub_agents/tests/check_status.json deleted file mode 100644 index e90a8cdf63..0000000000 --- a/contributing/samples/multi_agent/sub_agents/tests/check_status.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Check the status of account ACC-123" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "sub_agents", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "agent_name": "info_agent" - }, - "id": "fc-1", - "name": "transfer_to_agent" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "sub_agents@1" - } - }, - { - "actions": { - "transferToAgent": "info_agent" - }, - "author": "sub_agents", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "transfer_to_agent", - "response": { - "result": null - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "sub_agents@1" - } - }, - { - "author": "info_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "account_id": "ACC-123" - }, - "id": "fc-2", - "name": "get_account_status" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "sub_agents@1/info_agent@1" - } - }, - { - "author": "info_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "get_account_status", - "response": { - "result": "Account ACC-123 is active." - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "sub_agents@1/info_agent@1" - } - }, - { - "author": "info_agent", - "content": { - "parts": [ - { - "text": "Account ACC-123 is active." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "sub_agents@1/info_agent@1" - } - } - ] -} diff --git a/contributing/samples/multi_agent/task_sub_agent/README.md b/contributing/samples/multi_agent/task_sub_agent/README.md deleted file mode 100644 index 936d02f844..0000000000 --- a/contributing/samples/multi_agent/task_sub_agent/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# ADK Task as Sub-agent Sample - -## Overview - -This sample demonstrates how a "task mode" agent can act as a sub-agent to an LLM agent, effectively extracting structured data from a conversational flow. - -The main agent (`coordinator`) delegates interactions to two sub-agents: - -1. `order_collector`: A task agent that collects the user's food order (from a menu of Pizza, Burger, Salad) and returns a structured list of selected items as a `list[OrderItem]`. -1. `payment_collector`: A task agent that collects the user's credit card and CVV information, returning a `PaymentInfo` object. - -Once the tasks are completed, the coordinator automatically uses a `place_order` tool with the structured data returned by both agents. - -## Sample Inputs - -- `I would like to order some food please.` - -- `I want 2 pizzas and 1 salad.` - -- `My credit card is 1234-5678-9012-3456 and my CVV is 123.` - -## Graph - -```mermaid -graph TD - coordinator --> order_collector - coordinator --> payment_collector - coordinator -.->|uses| place_order[place_order tool] -``` - -## How To - -1. Define a sub-agent with `mode="task"` and an output schema: - - ```python - order_collector = Agent( - name="order_collector", - mode="task", - output_schema=list[OrderItem], - ... - ) - ``` - -1. Assign it to a parent agent and use it in the instruction to collect the information: - - ```python - coordinator = Agent( - sub_agents=[order_collector], - instruction="Delegate using `order_collector`...", - ... - ) - ``` diff --git a/contributing/samples/multi_agent/task_sub_agent/agent.py b/contributing/samples/multi_agent/task_sub_agent/agent.py deleted file mode 100644 index 8b3d1d25b0..0000000000 --- a/contributing/samples/multi_agent/task_sub_agent/agent.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk import Agent -from google.adk.tools.function_tool import FunctionTool -from pydantic import BaseModel -from pydantic import Field - - -class OrderItem(BaseModel): - name: str = Field(description="Name of the food item ordered") - quantity: int = Field(description="Quantity ordered") - - -class PaymentInfo(BaseModel): - """Output schema for the payment collection task.""" - - credit_card_number: str - cvv: str - - -def place_order(orders: list[OrderItem], payment_info: PaymentInfo) -> str: - """Mock an order placement operation.""" - total_items = sum(item.quantity for item in orders) - return f"Successfully placed order for {total_items} items." - - -def confirmation() -> str: - """Confirm proceeding with the order.""" - return "Proceeding with order." - - -order_collector = Agent( - name="order_collector", - mode="task", - output_schema=list[OrderItem], - instruction=("""\ -You are an order collection assistant for a food delivery service. -Our menu today has exactly 3 items: 1. Pizza, 2. Burger, 3. Salad. -Ask the user what they would like to order and collect their choice and quantity. -Do not offer anything else. -If the combined quantity of items exceeds 5, you MUST use the `confirmation` tool to get user's confirmation before proceeding. -Do not ask for confirmation in natural language, always use the confirmation tool. -Once you have their final order and confirmation if needed, finish your task. - """), - description="Collects the food order from the user.", - tools=[FunctionTool(confirmation, require_confirmation=True)], -) - -payment_collector = Agent( - name="payment_collector", - mode="task", - output_schema=PaymentInfo, - instruction=("""\ -You are a payment collection assistant. -Ask the user for their credit card number and CVV. -Once you have both pieces of information, finish your task. - """), - description="Collects credit card and CVV from the user.", -) - -root_agent = Agent( - name="coordinator", - sub_agents=[order_collector, payment_collector], - tools=[place_order], - instruction="""\ -You are a helpful coordinator for a food delivery service. -You need both order and payment information to place an order. - """, -) diff --git a/contributing/samples/multi_agent/task_sub_agent/tests/10_burgers.json b/contributing/samples/multi_agent/task_sub_agent/tests/10_burgers.json deleted file mode 100644 index 4eb98f4d48..0000000000 --- a/contributing/samples/multi_agent/task_sub_agent/tests/10_burgers.json +++ /dev/null @@ -1,224 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "10 burgers" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "coordinator", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "request": "The user wants 10 burgers. Please confirm the details of the burgers and any other items they might want." - }, - "id": "fc-1", - "name": "order_collector" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "coordinator@1" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "text": "I've noted that you'd like 10 burgers. Would you like to add any pizza or salad to your order?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "isolationScope": "fc-1", - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-3", - "name": "adk_request_confirmation", - "response": { - "confirmed": true, - "payload": {} - } - } - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "", - "nodeInfo": { - "path": "" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "1234-1234" - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-2", - "nodeInfo": { - "path": "" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "text": "I'm sorry, I didn't quite catch that. We offer Pizza, Burgers, and Salads. You've mentioned 10 burgers so far. Would you like to add any pizza or salad to your order, or is that everything?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-2", - "isolationScope": "fc-1", - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "123" - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-3", - "nodeInfo": { - "path": "" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "functionCall": { - "args": {}, - "id": "fc-2", - "name": "confirmation" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-8", - "invocationId": "i-3", - "isolationScope": "fc-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "originalFunctionCall": { - "args": {}, - "id": "fc-2", - "name": "confirmation" - }, - "toolConfirmation": { - "confirmed": false, - "hint": "Please approve or reject the tool call confirmation() by responding with a FunctionResponse with an expected ToolConfirmation payload." - } - }, - "id": "fc-3", - "name": "adk_request_confirmation" - } - } - ], - "role": "user" - }, - "id": "e-9", - "invocationId": "i-3", - "isolationScope": "fc-1", - "longRunningToolIds": [ - "fc-3" - ], - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - }, - { - "actions": { - "requestedToolConfirmations": { - "fc-2": { - "confirmed": false, - "hint": "Please approve or reject the tool call confirmation() by responding with a FunctionResponse with an expected ToolConfirmation payload." - } - }, - "skipSummarization": true - }, - "author": "order_collector", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "confirmation", - "response": { - "error": "This tool call requires confirmation, please approve or reject." - } - } - } - ], - "role": "user" - }, - "id": "e-10", - "invocationId": "i-3", - "isolationScope": "fc-1", - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - } - ] -} diff --git a/contributing/samples/multi_agent/task_sub_agent/tests/3_burgers.json b/contributing/samples/multi_agent/task_sub_agent/tests/3_burgers.json deleted file mode 100644 index e564a0b73f..0000000000 --- a/contributing/samples/multi_agent/task_sub_agent/tests/3_burgers.json +++ /dev/null @@ -1,410 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "3 burgers" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "coordinator", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "request": "The user wants to order 3 burgers. Please confirm if there are any specific types or details they'd like for these burgers." - }, - "id": "fc-1", - "name": "order_collector" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "coordinator@1" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "text": "Hello! We have Pizza, Burgers, and Salads on our menu today. You've chosen 3 Burgers. Would you like to add any Pizza or Salads to your order, or is that all for today?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "isolationScope": "fc-1", - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "ready to pay" - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-2", - "nodeInfo": { - "path": "" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "result": [ - { - "name": "Burger", - "quantity": 3 - } - ] - }, - "id": "fc-2", - "name": "finish_task" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-2", - "isolationScope": "fc-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "finish_task", - "response": { - "result": "Task completed." - } - } - } - ], - "role": "user" - }, - "id": "e-6", - "invocationId": "i-2", - "isolationScope": "fc-1", - "nodeInfo": { - "outputFor": [ - "coordinator@1/order_collector@fc-1" - ], - "path": "coordinator@1/order_collector@fc-1" - }, - "output": [ - { - "name": "Burger", - "quantity": 3 - } - ] - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "order_collector", - "response": { - "output": [ - { - "name": "Burger", - "quantity": 3 - } - ] - } - } - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-2", - "nodeInfo": { - "path": "coordinator@1" - } - }, - { - "author": "coordinator", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "request": "Please collect the user's credit card number and CVV for their order of 3 burgers." - }, - "id": "fc-3", - "name": "payment_collector" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-8", - "invocationId": "i-2", - "longRunningToolIds": [], - "nodeInfo": { - "path": "coordinator@1" - } - }, - { - "author": "payment_collector", - "content": { - "parts": [ - { - "text": "To process your order for 3 burgers, could you please provide your credit card number and the 3-digit CVV code?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-9", - "invocationId": "i-2", - "isolationScope": "fc-3", - "nodeInfo": { - "path": "coordinator@1/payment_collector@fc-3" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "1234-1234" - } - ], - "role": "user" - }, - "id": "e-10", - "invocationId": "i-3", - "nodeInfo": { - "path": "" - } - }, - { - "author": "payment_collector", - "content": { - "parts": [ - { - "text": "Thank you. Could you also provide the 3-digit CVV code for your card?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-11", - "invocationId": "i-3", - "isolationScope": "fc-3", - "nodeInfo": { - "path": "coordinator@1/payment_collector@fc-3" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "123" - } - ], - "role": "user" - }, - "id": "e-12", - "invocationId": "i-4", - "nodeInfo": { - "path": "" - } - }, - { - "author": "payment_collector", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "credit_card_number": "1234-1234", - "cvv": "123" - }, - "id": "fc-4", - "name": "finish_task" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-13", - "invocationId": "i-4", - "isolationScope": "fc-3", - "longRunningToolIds": [], - "nodeInfo": { - "path": "coordinator@1/payment_collector@fc-3" - } - }, - { - "author": "payment_collector", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-4", - "name": "finish_task", - "response": { - "result": "Task completed." - } - } - } - ], - "role": "user" - }, - "id": "e-14", - "invocationId": "i-4", - "isolationScope": "fc-3", - "nodeInfo": { - "outputFor": [ - "coordinator@1/payment_collector@fc-3" - ], - "path": "coordinator@1/payment_collector@fc-3" - }, - "output": { - "credit_card_number": "1234-1234", - "cvv": "123" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-3", - "name": "payment_collector", - "response": { - "credit_card_number": "1234-1234", - "cvv": "123" - } - } - } - ], - "role": "user" - }, - "id": "e-15", - "invocationId": "i-4", - "nodeInfo": { - "path": "coordinator@1" - } - }, - { - "author": "coordinator", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "orders": [ - { - "name": "Burger", - "quantity": 3 - } - ], - "payment_info": { - "credit_card_number": "1234-1234", - "cvv": "123" - } - }, - "id": "fc-5", - "name": "place_order" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-16", - "invocationId": "i-4", - "longRunningToolIds": [], - "nodeInfo": { - "path": "coordinator@1" - } - }, - { - "author": "coordinator", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-5", - "name": "place_order", - "response": { - "result": "Successfully placed order for 3 items." - } - } - } - ], - "role": "user" - }, - "id": "e-17", - "invocationId": "i-4", - "nodeInfo": { - "path": "coordinator@1" - } - }, - { - "author": "coordinator", - "content": { - "parts": [ - { - "text": "Your order for 3 burgers has been successfully placed!" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-18", - "invocationId": "i-4", - "nodeInfo": { - "path": "coordinator@1" - } - } - ] -} diff --git a/contributing/samples/multi_agent/task_sub_agent/tests/3_burgers_and_credit_card.json b/contributing/samples/multi_agent/task_sub_agent/tests/3_burgers_and_credit_card.json deleted file mode 100644 index 1b09556129..0000000000 --- a/contributing/samples/multi_agent/task_sub_agent/tests/3_burgers_and_credit_card.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "3 burgers, credit card 1234-1234, cvv 123" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "coordinator", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "orders": [ - { - "name": "burger", - "quantity": 3 - } - ], - "payment_info": { - "credit_card_number": "1234-1234", - "cvv": "123" - } - }, - "id": "fc-1", - "name": "place_order" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "coordinator@1" - } - }, - { - "author": "coordinator", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "place_order", - "response": { - "result": "Successfully placed order for 3 items." - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "coordinator@1" - } - }, - { - "author": "coordinator", - "content": { - "parts": [ - { - "text": "Your order for 3 burgers has been successfully placed." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "coordinator@1" - } - } - ] -} diff --git a/contributing/samples/multi_agent/task_sub_agent/tests/credit_card.json b/contributing/samples/multi_agent/task_sub_agent/tests/credit_card.json deleted file mode 100644 index 40c0d998e8..0000000000 --- a/contributing/samples/multi_agent/task_sub_agent/tests/credit_card.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "credit card 1234-1234, cvv 123" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "coordinator", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "request": "The user has provided payment info. Please find out what food they would like to order." - }, - "id": "fc-1", - "name": "order_collector" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "coordinator@1" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "text": "Hello! What would you like to order today? We have Pizza, Burgers, and Salads available. Please let me know your choice and the quantity." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "isolationScope": "fc-1", - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "3 burgers" - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-2", - "nodeInfo": { - "path": "" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "text": "I have added 3 Burgers to your order. Would you like to add any Pizza or Salad, or is that all for today?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-2", - "isolationScope": "fc-1", - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - } - ] -} diff --git a/contributing/samples/multi_agent/task_sub_agent/tests/order_food.json b/contributing/samples/multi_agent/task_sub_agent/tests/order_food.json deleted file mode 100644 index 1763337d6b..0000000000 --- a/contributing/samples/multi_agent/task_sub_agent/tests/order_food.json +++ /dev/null @@ -1,198 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "order food" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "coordinator", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "request": "Please help the user order food by collecting the items and quantities they want." - }, - "id": "fc-1", - "name": "order_collector" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "coordinator@1" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "text": "Hello! What would you like to order today? Our menu includes:\n1. Pizza\n2. Burger\n3. Salad\n\nPlease let me know which items and how many of each you'd like." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "isolationScope": "fc-1", - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "burger" - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-2", - "nodeInfo": { - "path": "" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "text": "How many burgers would you like to order?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-2", - "isolationScope": "fc-1", - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "3" - } - ], - "role": "user" - }, - "id": "e-6", - "invocationId": "i-3", - "nodeInfo": { - "path": "" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "text": "Great! You've ordered 3 burgers. Would you like to add anything else to your order (Pizza or Salad), or is that all for today?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-7", - "invocationId": "i-3", - "isolationScope": "fc-1", - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "1234-1234" - } - ], - "role": "user" - }, - "id": "e-8", - "invocationId": "i-4", - "nodeInfo": { - "path": "" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "text": "I'm sorry, I didn't quite understand that. Would you like to add any Pizza or Salad to your order of 3 Burgers, or is that all?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-9", - "invocationId": "i-4", - "isolationScope": "fc-1", - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "text": "123" - } - ], - "role": "user" - }, - "id": "e-10", - "invocationId": "i-5", - "nodeInfo": { - "path": "" - } - }, - { - "author": "order_collector", - "content": { - "parts": [ - { - "text": "I'm sorry, I'm not sure what you mean by \"123\". Would you like to add 123 of one of our menu items (Pizza or Salad) to your order, or would you like to finish your order with just the 3 burgers?" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-11", - "invocationId": "i-5", - "isolationScope": "fc-1", - "nodeInfo": { - "path": "coordinator@1/order_collector@fc-1" - } - } - ] -} diff --git a/contributing/samples/multi_agent/three_layer_transfer/README.md b/contributing/samples/multi_agent/three_layer_transfer/README.md deleted file mode 100644 index 9da5e9f465..0000000000 --- a/contributing/samples/multi_agent/three_layer_transfer/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Three Layer Transfer Sample - -## Overview - -This sample demonstrates a three-layer multi-agent system built with the ADK Python toolkit, showcasing structured double-round-trip hierarchical transfers. - -## Sample Inputs - -- `Hello, who are you?` -- `Can you write a short story about a lost kitten?` -- `Please translate it into Spanish.` -- `Looks great! Let's return to the project coordinator.` - -## Graph - -```mermaid -graph TD - root_agent[root_agent] --> writer_agent[writer_agent] - writer_agent --> translator_agent[translator_agent] -``` - -## How To - -This sample demonstrates: - -1. Root delegating to middle-child node `writer_agent`. -1. `writer_agent` delegating to leaf-grandchild node `translator_agent`. -1. Grandchild returning back to the parent `writer_agent`. -1. Parent returning back to the root coordinator `root_agent`. diff --git a/contributing/samples/multi_agent/three_layer_transfer/agent.py b/contributing/samples/multi_agent/three_layer_transfer/agent.py deleted file mode 100644 index 367a56df68..0000000000 --- a/contributing/samples/multi_agent/three_layer_transfer/agent.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from google.adk.agents.llm_agent import Agent - -# --- Leaf Agent (Grandchild) --- -translator_agent = Agent( - name="translator_agent", - description="Translates text into different languages.", - instruction=""" - You are a translator. Your job is to translate the text provided to you into the requested language. - Once the translation is complete, output the translated text, explain what you did, and then transfer back to the writer_agent. - """, -) - - -# --- Middle Agent (Child) --- -writer_agent = Agent( - name="writer_agent", - description=( - "Writes stories, articles, or essays, and manages translation requests." - ), - instruction=""" - You are a professional writer. - When asked to write something, perform the writing task and present the result to the user. - If the user asks to translate the written content into another language, transfer the task to the translator_agent. - If the user is satisfied and wants to return to the main coordinator, transfer back to the root_agent. - """, - sub_agents=[translator_agent], -) - - -# --- Root Agent (Parent) --- -root_agent = Agent( - name="root_agent", - description=( - "Project coordinator that delegates writing and translation tasks." - ), - instruction=""" - You are a project coordinator. - If the user wants to write a story, essay, or article, transfer the task to the writer_agent. - Answer general inquiries yourself, but delegate writing-related tasks. - """, - sub_agents=[writer_agent], -) diff --git a/contributing/samples/multi_agent/multi_agent_basic_config/README.md b/contributing/samples/multi_agent_basic_config/README.md similarity index 100% rename from contributing/samples/multi_agent/multi_agent_basic_config/README.md rename to contributing/samples/multi_agent_basic_config/README.md diff --git a/contributing/samples/multi_agent/multi_agent_basic_config/code_tutor_agent.yaml b/contributing/samples/multi_agent_basic_config/code_tutor_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_basic_config/code_tutor_agent.yaml rename to contributing/samples/multi_agent_basic_config/code_tutor_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_basic_config/math_tutor_agent.yaml b/contributing/samples/multi_agent_basic_config/math_tutor_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_basic_config/math_tutor_agent.yaml rename to contributing/samples/multi_agent_basic_config/math_tutor_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_basic_config/root_agent.yaml b/contributing/samples/multi_agent_basic_config/root_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_basic_config/root_agent.yaml rename to contributing/samples/multi_agent_basic_config/root_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_llm_config/README.md b/contributing/samples/multi_agent_llm_config/README.md similarity index 100% rename from contributing/samples/multi_agent/multi_agent_llm_config/README.md rename to contributing/samples/multi_agent_llm_config/README.md diff --git a/contributing/samples/multi_agent/multi_agent_llm_config/__init__.py b/contributing/samples/multi_agent_llm_config/__init__.py similarity index 77% rename from contributing/samples/multi_agent/multi_agent_llm_config/__init__.py rename to contributing/samples/multi_agent_llm_config/__init__.py index 56a17cc799..6515866032 100644 --- a/contributing/samples/multi_agent/multi_agent_llm_config/__init__.py +++ b/contributing/samples/multi_agent_llm_config/__init__.py @@ -1,17 +1,3 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - import random from google.adk.examples.example import Example diff --git a/contributing/samples/multi_agent/multi_agent_llm_config/prime_agent.yaml b/contributing/samples/multi_agent_llm_config/prime_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_llm_config/prime_agent.yaml rename to contributing/samples/multi_agent_llm_config/prime_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_llm_config/roll_agent.yaml b/contributing/samples/multi_agent_llm_config/roll_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_llm_config/roll_agent.yaml rename to contributing/samples/multi_agent_llm_config/roll_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_llm_config/root_agent.yaml b/contributing/samples/multi_agent_llm_config/root_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_llm_config/root_agent.yaml rename to contributing/samples/multi_agent_llm_config/root_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_loop_config/README.md b/contributing/samples/multi_agent_loop_config/README.md similarity index 100% rename from contributing/samples/multi_agent/multi_agent_loop_config/README.md rename to contributing/samples/multi_agent_loop_config/README.md diff --git a/contributing/samples/multi_agent/multi_agent_loop_config/loop_agent.yaml b/contributing/samples/multi_agent_loop_config/loop_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_loop_config/loop_agent.yaml rename to contributing/samples/multi_agent_loop_config/loop_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_loop_config/root_agent.yaml b/contributing/samples/multi_agent_loop_config/root_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_loop_config/root_agent.yaml rename to contributing/samples/multi_agent_loop_config/root_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_loop_config/writer_agents/critic_agent.yaml b/contributing/samples/multi_agent_loop_config/writer_agents/critic_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_loop_config/writer_agents/critic_agent.yaml rename to contributing/samples/multi_agent_loop_config/writer_agents/critic_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_loop_config/writer_agents/initial_writer_agent.yaml b/contributing/samples/multi_agent_loop_config/writer_agents/initial_writer_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_loop_config/writer_agents/initial_writer_agent.yaml rename to contributing/samples/multi_agent_loop_config/writer_agents/initial_writer_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_loop_config/writer_agents/refiner_agent.yaml b/contributing/samples/multi_agent_loop_config/writer_agents/refiner_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_loop_config/writer_agents/refiner_agent.yaml rename to contributing/samples/multi_agent_loop_config/writer_agents/refiner_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_seq_config/README.md b/contributing/samples/multi_agent_seq_config/README.md similarity index 100% rename from contributing/samples/multi_agent/multi_agent_seq_config/README.md rename to contributing/samples/multi_agent_seq_config/README.md diff --git a/contributing/samples/multi_agent/multi_agent_seq_config/root_agent.yaml b/contributing/samples/multi_agent_seq_config/root_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_seq_config/root_agent.yaml rename to contributing/samples/multi_agent_seq_config/root_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_seq_config/sub_agents/code_refactorer_agent.yaml b/contributing/samples/multi_agent_seq_config/sub_agents/code_refactorer_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_seq_config/sub_agents/code_refactorer_agent.yaml rename to contributing/samples/multi_agent_seq_config/sub_agents/code_refactorer_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_seq_config/sub_agents/code_reviewer_agent.yaml b/contributing/samples/multi_agent_seq_config/sub_agents/code_reviewer_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_seq_config/sub_agents/code_reviewer_agent.yaml rename to contributing/samples/multi_agent_seq_config/sub_agents/code_reviewer_agent.yaml diff --git a/contributing/samples/multi_agent/multi_agent_seq_config/sub_agents/code_writer_agent.yaml b/contributing/samples/multi_agent_seq_config/sub_agents/code_writer_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/multi_agent_seq_config/sub_agents/code_writer_agent.yaml rename to contributing/samples/multi_agent_seq_config/sub_agents/code_writer_agent.yaml diff --git a/contributing/samples/multimodal/multimodal/README.md b/contributing/samples/multimodal/multimodal/README.md deleted file mode 100644 index a982dc2145..0000000000 --- a/contributing/samples/multimodal/multimodal/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Multimodal Agent - -## Overview - -This sample demonstrates a simple standalone agent that supports multimodal input and output. It uses the "nano banana model" (`gemini-2.5-flash-image`) that can understand and generate images directly. - -## Sample Inputs - -- `An image of a banana with the question: "Is this banana ripe?"` - -- `A text prompt: "Generate a picture of a banana split."` - -## Graph - -Since this is a simple standalone agent without tools, the flow is a direct interaction between the user and the agent: - -```mermaid -graph TD - User -->|Sends Image + Text| Agent[Multimodal Agent] - Agent -->|Responds with Image + Text| User -``` - -## How To - -This sample demonstrates: - -1. **Multimodal Input**: The agent can process both text and image parts in the conversation history. -1. **Multimodal Output**: The agent can generate images directly in its response. - -To run this sample, ensure you have the necessary environment variables set for the Gemini client. diff --git a/contributing/samples/multimodal/multimodal/agent.py b/contributing/samples/multimodal/multimodal/agent.py deleted file mode 100644 index b45e99ff51..0000000000 --- a/contributing/samples/multimodal/multimodal/agent.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from google.adk import Agent - -root_agent = Agent( - name='multimodal_agent', - model='gemini-2.5-flash-image', -) diff --git a/contributing/samples/mcp/mcp_sse_agent/__init__.py b/contributing/samples/multimodal_tool_results/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/mcp/mcp_sse_agent/__init__.py rename to contributing/samples/multimodal_tool_results/__init__.py diff --git a/contributing/samples/multimodal/multimodal_tool_results/agent.py b/contributing/samples/multimodal_tool_results/agent.py similarity index 97% rename from contributing/samples/multimodal/multimodal_tool_results/agent.py rename to contributing/samples/multimodal_tool_results/agent.py index be978ab294..d112eba960 100644 --- a/contributing/samples/multimodal/multimodal_tool_results/agent.py +++ b/contributing/samples/multimodal_tool_results/agent.py @@ -29,6 +29,7 @@ def get_image(): name="image_describing_agent", description="image describing agent", instruction="""Whatever the user says, get the image using the get_image tool, and describe it.""", + model="gemini-2.5-flash", tools=[get_image], ) diff --git a/contributing/samples/mcp/mcp_stdio_notion_agent/__init__.py b/contributing/samples/non_llm_sequential/__init__.py similarity index 100% rename from contributing/samples/mcp/mcp_stdio_notion_agent/__init__.py rename to contributing/samples/non_llm_sequential/__init__.py diff --git a/contributing/samples/legacy_workflows/non_llm_sequential/agent.py b/contributing/samples/non_llm_sequential/agent.py similarity index 94% rename from contributing/samples/legacy_workflows/non_llm_sequential/agent.py rename to contributing/samples/non_llm_sequential/agent.py index 80e03dfc8e..3b4c835967 100755 --- a/contributing/samples/legacy_workflows/non_llm_sequential/agent.py +++ b/contributing/samples/non_llm_sequential/agent.py @@ -19,12 +19,14 @@ sub_agent_1 = Agent( name='sub_agent_1', description='No.1 sub agent.', + model='gemini-2.5-flash', instruction='JUST SAY 1.', ) sub_agent_2 = Agent( name='sub_agent_2', description='No.2 sub agent.', + model='gemini-2.5-flash', instruction='JUST SAY 2.', ) sequential_agent = SequentialAgent( diff --git a/contributing/samples/integrations/oauth2_client_credentials/README.md b/contributing/samples/oauth2_client_credentials/README.md similarity index 100% rename from contributing/samples/integrations/oauth2_client_credentials/README.md rename to contributing/samples/oauth2_client_credentials/README.md diff --git a/contributing/samples/mcp/mcp_stdio_server_agent/__init__.py b/contributing/samples/oauth2_client_credentials/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/mcp/mcp_stdio_server_agent/__init__.py rename to contributing/samples/oauth2_client_credentials/__init__.py diff --git a/contributing/samples/integrations/oauth2_client_credentials/agent.py b/contributing/samples/oauth2_client_credentials/agent.py similarity index 100% rename from contributing/samples/integrations/oauth2_client_credentials/agent.py rename to contributing/samples/oauth2_client_credentials/agent.py diff --git a/contributing/samples/integrations/oauth2_client_credentials/main.py b/contributing/samples/oauth2_client_credentials/main.py similarity index 100% rename from contributing/samples/integrations/oauth2_client_credentials/main.py rename to contributing/samples/oauth2_client_credentials/main.py diff --git a/contributing/samples/integrations/oauth2_client_credentials/oauth2_test_server.py b/contributing/samples/oauth2_client_credentials/oauth2_test_server.py similarity index 100% rename from contributing/samples/integrations/oauth2_client_credentials/oauth2_test_server.py rename to contributing/samples/oauth2_client_credentials/oauth2_test_server.py diff --git a/contributing/samples/integrations/oauth_calendar_agent/README.md b/contributing/samples/oauth_calendar_agent/README.md similarity index 100% rename from contributing/samples/integrations/oauth_calendar_agent/README.md rename to contributing/samples/oauth_calendar_agent/README.md diff --git a/contributing/samples/mcp/mcp_streamablehttp_agent/__init__.py b/contributing/samples/oauth_calendar_agent/__init__.py similarity index 100% rename from contributing/samples/mcp/mcp_streamablehttp_agent/__init__.py rename to contributing/samples/oauth_calendar_agent/__init__.py diff --git a/contributing/samples/integrations/oauth_calendar_agent/agent.py b/contributing/samples/oauth_calendar_agent/agent.py similarity index 99% rename from contributing/samples/integrations/oauth_calendar_agent/agent.py rename to contributing/samples/oauth_calendar_agent/agent.py index 981b942f01..3ac531623b 100644 --- a/contributing/samples/integrations/oauth_calendar_agent/agent.py +++ b/contributing/samples/oauth_calendar_agent/agent.py @@ -127,6 +127,7 @@ def update_time(callback_context: CallbackContext): root_agent = Agent( + model="gemini-2.5-flash", name="calendar_agent", instruction=""" You are a helpful personal calendar assistant. diff --git a/contributing/samples/tools/output_schema_with_tools/README.md b/contributing/samples/output_schema_with_tools/README.md similarity index 100% rename from contributing/samples/tools/output_schema_with_tools/README.md rename to contributing/samples/output_schema_with_tools/README.md diff --git a/contributing/samples/mcp/mcp_toolset_auth/__init__.py b/contributing/samples/output_schema_with_tools/__init__.py similarity index 100% rename from contributing/samples/mcp/mcp_toolset_auth/__init__.py rename to contributing/samples/output_schema_with_tools/__init__.py diff --git a/contributing/samples/tools/output_schema_with_tools/agent.py b/contributing/samples/output_schema_with_tools/agent.py similarity index 99% rename from contributing/samples/tools/output_schema_with_tools/agent.py rename to contributing/samples/output_schema_with_tools/agent.py index 467e4bcb6e..f294b897f7 100644 --- a/contributing/samples/tools/output_schema_with_tools/agent.py +++ b/contributing/samples/output_schema_with_tools/agent.py @@ -83,6 +83,7 @@ def get_current_year() -> str: # Create the knowledge agent that uses google_search tool. knowledge_agent = LlmAgent( name="knowledge_agent", + model="gemini-2.5-flash", instruction=""" You are a helpful assistant that gathers information about famous people. Use google_search tool to find information about them. diff --git a/contributing/samples/tools/parallel_functions/README.md b/contributing/samples/parallel_functions/README.md similarity index 100% rename from contributing/samples/tools/parallel_functions/README.md rename to contributing/samples/parallel_functions/README.md diff --git a/contributing/samples/models/hello_world_ollama/__init__.py b/contributing/samples/parallel_functions/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/models/hello_world_ollama/__init__.py rename to contributing/samples/parallel_functions/__init__.py diff --git a/contributing/samples/tools/parallel_functions/agent.py b/contributing/samples/parallel_functions/agent.py similarity index 96% rename from contributing/samples/tools/parallel_functions/agent.py rename to contributing/samples/parallel_functions/agent.py index 02327509e2..07dd0b81db 100644 --- a/contributing/samples/tools/parallel_functions/agent.py +++ b/contributing/samples/parallel_functions/agent.py @@ -60,7 +60,7 @@ async def get_weather(city: str, tool_context: ToolContext) -> dict: if 'weather_requests' not in tool_context.state: tool_context.state['weather_requests'] = [] tool_context.state['weather_requests'].append( - {'city': city, 'result': result} + {'city': city, 'timestamp': time.time(), 'result': result} ) return { @@ -108,12 +108,14 @@ async def get_currency_rate( 'from': from_currency, 'to': to_currency, 'rate': rate, + 'timestamp': time.time(), }) return { 'from_currency': from_currency, 'to_currency': to_currency, 'exchange_rate': rate, + 'timestamp': time.time(), } @@ -161,6 +163,7 @@ async def calculate_distance( 'city1': city1, 'city2': city2, 'distance': distance, + 'timestamp': time.time(), }) return { @@ -201,7 +204,7 @@ async def get_population(cities: List[str], tool_context: ToolContext) -> dict: if 'population_requests' not in tool_context.state: tool_context.state['population_requests'] = [] tool_context.state['population_requests'].append( - {'cities': cities, 'results': results} + {'cities': cities, 'results': results, 'timestamp': time.time()} ) return { @@ -212,6 +215,7 @@ async def get_population(cities: List[str], tool_context: ToolContext) -> dict: root_agent = Agent( + model='gemini-2.5-flash', name='parallel_function_test_agent', description=( 'Agent for testing parallel function calling performance and thread' diff --git a/contributing/samples/plugin/plugin_basic/README.md b/contributing/samples/plugin_basic/README.md similarity index 100% rename from contributing/samples/plugin/plugin_basic/README.md rename to contributing/samples/plugin_basic/README.md diff --git a/contributing/samples/plugin/plugin_basic/__init__.py b/contributing/samples/plugin_basic/__init__.py similarity index 100% rename from contributing/samples/plugin/plugin_basic/__init__.py rename to contributing/samples/plugin_basic/__init__.py diff --git a/contributing/samples/plugin/plugin_basic/count_plugin.py b/contributing/samples/plugin_basic/count_plugin.py similarity index 100% rename from contributing/samples/plugin/plugin_basic/count_plugin.py rename to contributing/samples/plugin_basic/count_plugin.py diff --git a/contributing/samples/plugin/plugin_basic/main.py b/contributing/samples/plugin_basic/main.py similarity index 98% rename from contributing/samples/plugin/plugin_basic/main.py rename to contributing/samples/plugin_basic/main.py index 5cb81fba40..e0d97bd1b5 100644 --- a/contributing/samples/plugin/plugin_basic/main.py +++ b/contributing/samples/plugin_basic/main.py @@ -28,6 +28,7 @@ async def hello_world(tool_context: ToolContext, query: str): root_agent = Agent( + model='gemini-2.5-flash', name='hello_world', description='Prints hello world with user query.', instruction="""Use hello_world tool to print hello world and user query. diff --git a/contributing/samples/models/litellm_streaming/__init__.py b/contributing/samples/plugin_debug_logging/__init__.py similarity index 100% rename from contributing/samples/models/litellm_streaming/__init__.py rename to contributing/samples/plugin_debug_logging/__init__.py diff --git a/contributing/samples/plugin/plugin_debug_logging/agent.py b/contributing/samples/plugin_debug_logging/agent.py similarity index 99% rename from contributing/samples/plugin/plugin_debug_logging/agent.py rename to contributing/samples/plugin_debug_logging/agent.py index 91e4eadcd1..7b6f0bee8b 100644 --- a/contributing/samples/plugin/plugin_debug_logging/agent.py +++ b/contributing/samples/plugin_debug_logging/agent.py @@ -99,6 +99,7 @@ def calculate(expression: str) -> dict[str, Any]: When asked about weather, use the get_weather tool. When asked to calculate, use the calculate tool. Be concise in your responses.""", + model="gemini-2.5-flash", tools=[get_weather, calculate], ) diff --git a/contributing/samples/plugin/plugin_reflect_tool_retry/README.md b/contributing/samples/plugin_reflect_tool_retry/README.md similarity index 100% rename from contributing/samples/plugin/plugin_reflect_tool_retry/README.md rename to contributing/samples/plugin_reflect_tool_retry/README.md diff --git a/contributing/samples/models/litellm_structured_output/__init__.py b/contributing/samples/plugin_reflect_tool_retry/basic/__init__.py similarity index 100% rename from contributing/samples/models/litellm_structured_output/__init__.py rename to contributing/samples/plugin_reflect_tool_retry/basic/__init__.py diff --git a/contributing/samples/plugin/plugin_reflect_tool_retry/basic/agent.py b/contributing/samples/plugin_reflect_tool_retry/basic/agent.py similarity index 98% rename from contributing/samples/plugin/plugin_reflect_tool_retry/basic/agent.py rename to contributing/samples/plugin_reflect_tool_retry/basic/agent.py index 24962d34b4..6604c07142 100644 --- a/contributing/samples/plugin/plugin_reflect_tool_retry/basic/agent.py +++ b/contributing/samples/plugin_reflect_tool_retry/basic/agent.py @@ -67,6 +67,7 @@ async def extract_error_from_result( 'status: success'. Start by guessing 50, and use the tool's feedback to adjust your guesses and find the target number.""", + model="gemini-2.5-flash", tools=[guess_number_tool], ) diff --git a/contributing/samples/models/litellm_with_fallback_models/__init__.py b/contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/__init__.py similarity index 100% rename from contributing/samples/models/litellm_with_fallback_models/__init__.py rename to contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/__init__.py diff --git a/contributing/samples/plugin/plugin_reflect_tool_retry/hallucinating_func_name/agent.py b/contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/agent.py similarity index 98% rename from contributing/samples/plugin/plugin_reflect_tool_retry/hallucinating_func_name/agent.py rename to contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/agent.py index 61ca95a84f..d42acad770 100644 --- a/contributing/samples/plugin/plugin_reflect_tool_retry/hallucinating_func_name/agent.py +++ b/contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/agent.py @@ -68,6 +68,7 @@ def after_model_callback( name="hello_world", description="Helpful agent", instruction="""Use guess_number_tool to guess a number.""", + model="gemini-2.5-flash", tools=[roll_die], after_model_callback=after_model_callback, ) diff --git a/contributing/samples/context_management/postgres_session_service/README.md b/contributing/samples/postgres_session_service/README.md similarity index 100% rename from contributing/samples/context_management/postgres_session_service/README.md rename to contributing/samples/postgres_session_service/README.md diff --git a/contributing/samples/models/hello_world_litellm_add_function_to_prompt/__init__.py b/contributing/samples/postgres_session_service/__init__.py similarity index 100% rename from contributing/samples/models/hello_world_litellm_add_function_to_prompt/__init__.py rename to contributing/samples/postgres_session_service/__init__.py diff --git a/contributing/samples/context_management/postgres_session_service/agent.py b/contributing/samples/postgres_session_service/agent.py similarity index 97% rename from contributing/samples/context_management/postgres_session_service/agent.py rename to contributing/samples/postgres_session_service/agent.py index a67ebdf0a7..a00fc5ef2c 100644 --- a/contributing/samples/context_management/postgres_session_service/agent.py +++ b/contributing/samples/postgres_session_service/agent.py @@ -30,6 +30,7 @@ def get_current_time() -> str: root_agent = Agent( + model="gemini-2.5-flash", name="postgres_session_agent", description="A sample agent demonstrating PostgreSQL session persistence.", instruction=""" diff --git a/contributing/samples/context_management/postgres_session_service/compose.yml b/contributing/samples/postgres_session_service/compose.yml similarity index 100% rename from contributing/samples/context_management/postgres_session_service/compose.yml rename to contributing/samples/postgres_session_service/compose.yml diff --git a/contributing/samples/context_management/postgres_session_service/main.py b/contributing/samples/postgres_session_service/main.py similarity index 100% rename from contributing/samples/context_management/postgres_session_service/main.py rename to contributing/samples/postgres_session_service/main.py diff --git a/contributing/samples/integrations/pubsub/README.md b/contributing/samples/pubsub/README.md similarity index 100% rename from contributing/samples/integrations/pubsub/README.md rename to contributing/samples/pubsub/README.md diff --git a/contributing/samples/models/manual_ollama_test/__init__.py b/contributing/samples/pubsub/__init__.py similarity index 100% rename from contributing/samples/models/manual_ollama_test/__init__.py rename to contributing/samples/pubsub/__init__.py diff --git a/contributing/samples/integrations/pubsub/agent.py b/contributing/samples/pubsub/agent.py similarity index 99% rename from contributing/samples/integrations/pubsub/agent.py rename to contributing/samples/pubsub/agent.py index 922618c723..98434fb46c 100644 --- a/contributing/samples/integrations/pubsub/agent.py +++ b/contributing/samples/pubsub/agent.py @@ -66,6 +66,7 @@ # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( + model="gemini-2.5-flash", name=PUBSUB_AGENT_NAME, description=( "Agent to publish, pull, and acknowledge messages from Google Cloud" diff --git a/contributing/samples/tools/pydantic_argument/README.md b/contributing/samples/pydantic_argument/README.md similarity index 100% rename from contributing/samples/tools/pydantic_argument/README.md rename to contributing/samples/pydantic_argument/README.md diff --git a/contributing/samples/multi_agent/hello_world_ma/__init__.py b/contributing/samples/pydantic_argument/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/multi_agent/hello_world_ma/__init__.py rename to contributing/samples/pydantic_argument/__init__.py diff --git a/contributing/samples/tools/pydantic_argument/agent.py b/contributing/samples/pydantic_argument/agent.py similarity index 100% rename from contributing/samples/tools/pydantic_argument/agent.py rename to contributing/samples/pydantic_argument/agent.py diff --git a/contributing/samples/tools/pydantic_argument/main.py b/contributing/samples/pydantic_argument/main.py similarity index 100% rename from contributing/samples/tools/pydantic_argument/main.py rename to contributing/samples/pydantic_argument/main.py diff --git a/contributing/samples/multi_agent/sub_agents/__init__.py b/contributing/samples/quickstart/__init__.py similarity index 100% rename from contributing/samples/multi_agent/sub_agents/__init__.py rename to contributing/samples/quickstart/__init__.py diff --git a/contributing/samples/core/quickstart/agent.py b/contributing/samples/quickstart/agent.py similarity index 91% rename from contributing/samples/core/quickstart/agent.py rename to contributing/samples/quickstart/agent.py index 8042d0f25f..c183429fee 100644 --- a/contributing/samples/core/quickstart/agent.py +++ b/contributing/samples/quickstart/agent.py @@ -49,17 +49,8 @@ def get_current_time(city: str) -> dict: dict: status and result or error msg. """ import datetime - import os from zoneinfo import ZoneInfo - if "PYTEST_CURRENT_TEST" in os.environ: - return { - "status": "success", - "report": ( - "The current time in New York is 2026-05-15 12:00:00 EDT-0400" - ), - } - if city.lower() == "new york": tz_identifier = "America/New_York" else: @@ -80,6 +71,7 @@ def get_current_time(city: str) -> dict: root_agent = Agent( name="weather_time_agent", + model="gemini-2.5-flash", description=( "Agent to answer questions about the time and weather in a city." ), diff --git a/contributing/samples/multi_agent/three_layer_transfer/__init__.py b/contributing/samples/rag_agent/__init__.py similarity index 100% rename from contributing/samples/multi_agent/three_layer_transfer/__init__.py rename to contributing/samples/rag_agent/__init__.py diff --git a/contributing/samples/integrations/rag_agent/agent.py b/contributing/samples/rag_agent/agent.py similarity index 98% rename from contributing/samples/integrations/rag_agent/agent.py rename to contributing/samples/rag_agent/agent.py index 257abc2af4..a56de4fe8a 100644 --- a/contributing/samples/integrations/rag_agent/agent.py +++ b/contributing/samples/rag_agent/agent.py @@ -39,6 +39,7 @@ ) root_agent = Agent( + model="gemini-2.5-flash", name="root_agent", instruction=( "You are an AI assistant with access to specialized corpus of" diff --git a/contributing/samples/multimodal/generate_image/__init__.py b/contributing/samples/rewind_session/__init__.py similarity index 100% rename from contributing/samples/multimodal/generate_image/__init__.py rename to contributing/samples/rewind_session/__init__.py diff --git a/contributing/samples/context_management/rewind_session/agent.py b/contributing/samples/rewind_session/agent.py similarity index 98% rename from contributing/samples/context_management/rewind_session/agent.py rename to contributing/samples/rewind_session/agent.py index 4628cfe38a..53af846ec7 100644 --- a/contributing/samples/context_management/rewind_session/agent.py +++ b/contributing/samples/rewind_session/agent.py @@ -52,6 +52,7 @@ async def load_artifact(tool_context: ToolContext, filename: str) -> dict: # Create the agent root_agent = Agent( name="state_agent", + model="gemini-2.5-flash", instruction="""You are an agent that manages state and artifacts. You can: diff --git a/contributing/samples/context_management/rewind_session/main.py b/contributing/samples/rewind_session/main.py similarity index 100% rename from contributing/samples/context_management/rewind_session/main.py rename to contributing/samples/rewind_session/main.py diff --git a/contributing/samples/core/runner_debug_example/README.md b/contributing/samples/runner_debug_example/README.md similarity index 97% rename from contributing/samples/core/runner_debug_example/README.md rename to contributing/samples/runner_debug_example/README.md index dbb94ceee7..45d2bf76ed 100644 --- a/contributing/samples/core/runner_debug_example/README.md +++ b/contributing/samples/runner_debug_example/README.md @@ -14,7 +14,7 @@ The `run_debug()` method reduces agent interaction boilerplate from 7-8 lines to ## Files Included -- `agent.py` - Agent with 2 tools: weather and stock price +- `agent.py` - Agent with 2 tools: weather and calculate - `main.py` - 8 examples demonstrating all features - `README.md` - This documentation @@ -64,7 +64,7 @@ The `run_debug()` method properly displays all ADK part types: The example agent includes 2 tools to demonstrate tool handling: 1. **`get_weather(city)`** - Returns mock weather data for major cities -1. **`get_stock_price(ticker)`** - Returns mock stock prices for major tech companies +1. **`calculate(expression)`** - Evaluates mathematical expressions safely ## Key Benefits diff --git a/contributing/samples/core/runner_debug_example/__init__.py b/contributing/samples/runner_debug_example/__init__.py similarity index 100% rename from contributing/samples/core/runner_debug_example/__init__.py rename to contributing/samples/runner_debug_example/__init__.py diff --git a/contributing/samples/core/runner_debug_example/agent.py b/contributing/samples/runner_debug_example/agent.py similarity index 54% rename from contributing/samples/core/runner_debug_example/agent.py rename to contributing/samples/runner_debug_example/agent.py index 35b674e9fd..620e1b2745 100644 --- a/contributing/samples/core/runner_debug_example/agent.py +++ b/contributing/samples/runner_debug_example/agent.py @@ -50,28 +50,65 @@ def get_weather(city: str, tool_context: ToolContext) -> str: ) -def get_stock_price(ticker: str) -> str: - """Get the current stock price for a given ticker symbol. +def calculate(expression: str) -> str: + """Safely evaluate a mathematical expression. This tool demonstrates how function calls are displayed in run_debug(). Args: - ticker: Stock ticker symbol (e.g., GOOGL, AAPL, MSFT). + expression: Mathematical expression to evaluate. Returns: - Stock price information as a string. + Result of the calculation as a string. """ - prices = { - "GOOGL": "175.50 USD", - "AAPL": "225.00 USD", - "MSFT": "420.00 USD", - "AMZN": "190.00 USD", - "NVDA": "125.00 USD", + import ast + import operator + + # Supported operators for safe evaluation + operators = { + ast.Add: operator.add, + ast.Sub: operator.sub, + ast.Mult: operator.mul, + ast.Div: operator.truediv, + ast.Pow: operator.pow, + ast.USub: operator.neg, } - ticker = ticker.upper() - if ticker in prices: - return f"Price for {ticker}: {prices[ticker]}" - return f"Stock ticker {ticker} not found in database." + + def _eval(node): + """Recursively evaluate an AST node.""" + if isinstance(node, ast.Expression): + return _eval(node.body) + elif isinstance(node, ast.Constant): # Python 3.8+ + return node.value + elif isinstance(node, ast.Num): # For older Python versions + return node.n + elif isinstance(node, ast.BinOp): + op = operators.get(type(node.op)) + if op: + return op(_eval(node.left), _eval(node.right)) + else: + raise ValueError(f"Unsupported operation: {type(node.op).__name__}") + elif isinstance(node, ast.UnaryOp): + op = operators.get(type(node.op)) + if op: + return op(_eval(node.operand)) + else: + raise ValueError(f"Unsupported operation: {type(node.op).__name__}") + else: + raise ValueError(f"Unsupported expression type: {type(node).__name__}") + + try: + # Parse the expression into an AST + tree = ast.parse(expression, mode="eval") + # Safely evaluate the AST + result = _eval(tree) + return f"Result: {result}" + except (SyntaxError, ValueError) as e: + return f"Error: {str(e)}" + except ZeroDivisionError: + return "Error: Division by zero" + except Exception as e: + return f"Error: {str(e)}" root_agent = Agent( @@ -80,11 +117,11 @@ def get_stock_price(ticker: str) -> str: description="A helpful assistant demonstrating run_debug() helper method", instruction="""You are a helpful assistant that can: 1. Provide weather information for major cities - 2. Provide stock prices for major tech companies + 2. Perform mathematical calculations 3. Remember previous queries in the conversation When users ask about weather, use the get_weather tool. - When users ask for stock prices, use the get_stock_price tool. + When users ask for calculations, use the calculate tool. Be friendly and conversational.""", - tools=[get_weather, get_stock_price], + tools=[get_weather, calculate], ) diff --git a/contributing/samples/core/runner_debug_example/main.py b/contributing/samples/runner_debug_example/main.py similarity index 94% rename from contributing/samples/core/runner_debug_example/main.py rename to contributing/samples/runner_debug_example/main.py index 783a896bc4..2fa8461f58 100644 --- a/contributing/samples/core/runner_debug_example/main.py +++ b/contributing/samples/runner_debug_example/main.py @@ -47,7 +47,7 @@ async def example_multiple_messages(): "Hi there!", "What's the weather in Tokyo?", "How about New York?", - "What's the stock price of GOOGL?", + "Calculate 15 * 7 + 3", ]) @@ -91,7 +91,7 @@ async def example_separate_sessions(): # Bob's session (separate) print("\n-- Bob's session --") await runner.run_debug( - "What is the price of AAPL?", user_id="bob", session_id="bob_debug" + "Calculate 100 / 5", user_id="bob", session_id="bob_debug" ) # Continue Alice's session @@ -115,7 +115,7 @@ async def example_with_tools(): # Without verbose: Only shows final agent responses await runner.run_debug([ "What's the weather in Tokyo?", - "Check MSFT stock price", + "Calculate (42 * 3.14) + 10", ]) print("\n-- With verbose=True - Detailed output --") @@ -123,7 +123,7 @@ async def example_with_tools(): await runner.run_debug( [ "What's the weather in Paris?", - "What's the stock price of NVDA?", + "Calculate 100 / 5", ], verbose=True, ) @@ -139,7 +139,7 @@ async def example_capture_events(): # Capture events without printing for inspection events = await runner.run_debug( - ["Get weather for London", "Get stock price of AMZN"], + ["Get weather for London", "Calculate 42 * 3.14"], quiet=True, ) @@ -245,11 +245,8 @@ async def main(): print("\nHow different part types appear:") print(" Text: agent > Hello world (always shown)") print("\nWith verbose=True only:") - print( - " Tool call: agent > [Calling tool: get_stock_price({'ticker':" - " 'GOOGL'})]" - ) - print(" Tool result: agent > [Tool result: Price for GOOGL: 175.50 USD]") + print(" Tool call: agent > [Calling tool: calculate({'expression': '2+2'})]") + print(" Tool result: agent > [Tool result: Result: 4]") print("\nNote: When models have code execution enabled (verbose=True):") print(" Code exec: agent > [Executing python code...]") print(" Code output: agent > [Code output: Result: 42]") diff --git a/contributing/samples/multimodal/multimodal/__init__.py b/contributing/samples/sandbox_computer_use/__init__.py similarity index 100% rename from contributing/samples/multimodal/multimodal/__init__.py rename to contributing/samples/sandbox_computer_use/__init__.py diff --git a/contributing/samples/integrations/sandbox_computer_use/agent.py b/contributing/samples/sandbox_computer_use/agent.py similarity index 86% rename from contributing/samples/integrations/sandbox_computer_use/agent.py rename to contributing/samples/sandbox_computer_use/agent.py index f559dc167f..b95dbad89a 100644 --- a/contributing/samples/integrations/sandbox_computer_use/agent.py +++ b/contributing/samples/sandbox_computer_use/agent.py @@ -24,8 +24,6 @@ - GOOGLE_CLOUD_PROJECT: Your GCP project ID - VMAAS_SERVICE_ACCOUNT: Your service account email - VMAAS_SANDBOX_NAME: (Optional) Existing sandbox resource name for BYOS mode - - VMAAS_SANDBOX_TEMPLATE_NAME: (Optional) Sandbox template name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) - - VMAAS_SANDBOX_SNAPSHOT_NAME: (Optional) Sandbox snapshot name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) Usage: # Run via ADK web UI @@ -55,17 +53,12 @@ SANDBOX_NAME = os.environ.get("SANDBOX_NAME") or os.environ.get( "VMAAS_SANDBOX_NAME" ) -SANDBOX_TEMPLATE_NAME = os.environ.get("VMAAS_SANDBOX_TEMPLATE_NAME") -SANDBOX_SNAPSHOT_NAME = os.environ.get("VMAAS_SANDBOX_SNAPSHOT_NAME") - # Create the sandbox computer sandbox_computer = AgentEngineSandboxComputer( project_id=PROJECT_ID, service_account_email=SERVICE_ACCOUNT, sandbox_name=SANDBOX_NAME, - sandbox_template_name=SANDBOX_TEMPLATE_NAME, - sandbox_snapshot_name=SANDBOX_SNAPSHOT_NAME, search_engine_url="https://www.google.com", ) diff --git a/contributing/samples/integrations/sandbox_computer_use/main.py b/contributing/samples/sandbox_computer_use/main.py similarity index 92% rename from contributing/samples/integrations/sandbox_computer_use/main.py rename to contributing/samples/sandbox_computer_use/main.py index 19fbd8a517..e6c60bc298 100644 --- a/contributing/samples/integrations/sandbox_computer_use/main.py +++ b/contributing/samples/sandbox_computer_use/main.py @@ -22,9 +22,6 @@ - GOOGLE_CLOUD_PROJECT: Your GCP project ID - VMAAS_SERVICE_ACCOUNT: Your service account email with roles/iam.serviceAccountTokenCreator permission - - VMAAS_SANDBOX_NAME: (Optional) Existing sandbox resource name for BYOS mode - - VMAAS_SANDBOX_TEMPLATE_NAME: (Optional) Sandbox template name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) - - VMAAS_SANDBOX_SNAPSHOT_NAME: (Optional) Sandbox snapshot name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) Usage: cd contributing/samples diff --git a/contributing/samples/context_management/session_state_agent/README.md b/contributing/samples/session_state_agent/README.md similarity index 100% rename from contributing/samples/context_management/session_state_agent/README.md rename to contributing/samples/session_state_agent/README.md diff --git a/contributing/samples/multimodal/multimodal_tool_results/__init__.py b/contributing/samples/session_state_agent/__init__.py similarity index 100% rename from contributing/samples/multimodal/multimodal_tool_results/__init__.py rename to contributing/samples/session_state_agent/__init__.py diff --git a/contributing/samples/context_management/session_state_agent/agent.py b/contributing/samples/session_state_agent/agent.py similarity index 100% rename from contributing/samples/context_management/session_state_agent/agent.py rename to contributing/samples/session_state_agent/agent.py diff --git a/contributing/samples/session_state_agent/input.json b/contributing/samples/session_state_agent/input.json new file mode 100644 index 0000000000..6f76f166b1 --- /dev/null +++ b/contributing/samples/session_state_agent/input.json @@ -0,0 +1,4 @@ +{ + "state": {}, + "queries": ["hello world!"] +} diff --git a/contributing/samples/patterns/context_offloading_with_artifact/__init__.py b/contributing/samples/simple_sequential_agent/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/patterns/context_offloading_with_artifact/__init__.py rename to contributing/samples/simple_sequential_agent/__init__.py diff --git a/contributing/samples/legacy_workflows/simple_sequential_agent/agent.py b/contributing/samples/simple_sequential_agent/agent.py similarity index 98% rename from contributing/samples/legacy_workflows/simple_sequential_agent/agent.py rename to contributing/samples/simple_sequential_agent/agent.py index 0730e9a668..708f520b49 100644 --- a/contributing/samples/legacy_workflows/simple_sequential_agent/agent.py +++ b/contributing/samples/simple_sequential_agent/agent.py @@ -28,6 +28,7 @@ def roll_die(sides: int) -> int: roll_agent = LlmAgent( name="roll_agent", description="Handles rolling dice of different sizes.", + model="gemini-2.5-flash", instruction=""" You are responsible for rolling dice based on the user's request. When asked to roll a die, you must call the roll_die tool with the number of sides as an integer. @@ -68,6 +69,7 @@ def check_prime(nums: list[int]) -> str: prime_agent = LlmAgent( name="prime_agent", description="Handles checking if numbers are prime.", + model="gemini-2.5-flash", instruction=""" You are responsible for checking whether numbers are prime. When asked to check primes, you must call the check_prime tool with a list of integers. diff --git a/contributing/samples/patterns/fields_planner/__init__.py b/contributing/samples/skills_agent/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/patterns/fields_planner/__init__.py rename to contributing/samples/skills_agent/__init__.py diff --git a/contributing/samples/environment_and_skills/skills_agent/agent.py b/contributing/samples/skills_agent/agent.py similarity index 99% rename from contributing/samples/environment_and_skills/skills_agent/agent.py rename to contributing/samples/skills_agent/agent.py index da9f2bd5d5..a42fa2583e 100644 --- a/contributing/samples/environment_and_skills/skills_agent/agent.py +++ b/contributing/samples/skills_agent/agent.py @@ -92,6 +92,7 @@ def get_wind_speed(location: str) -> str: ) root_agent = Agent( + model="gemini-2.5-flash", name="skill_user_agent", description="An agent that can use specialized skills.", tools=[ diff --git a/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/SKILL.md b/contributing/samples/skills_agent/skills/weather-skill/SKILL.md similarity index 100% rename from contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/SKILL.md rename to contributing/samples/skills_agent/skills/weather-skill/SKILL.md diff --git a/contributing/samples/environment_and_skills/skills/skills/weather-skill/references/weather_info.md b/contributing/samples/skills_agent/skills/weather-skill/references/weather_info.md similarity index 100% rename from contributing/samples/environment_and_skills/skills/skills/weather-skill/references/weather_info.md rename to contributing/samples/skills_agent/skills/weather-skill/references/weather_info.md diff --git a/contributing/samples/environment_and_skills/skills/skills/weather-skill/scripts/get_humidity.py b/contributing/samples/skills_agent/skills/weather-skill/scripts/get_humidity.py similarity index 100% rename from contributing/samples/environment_and_skills/skills/skills/weather-skill/scripts/get_humidity.py rename to contributing/samples/skills_agent/skills/weather-skill/scripts/get_humidity.py diff --git a/contributing/samples/patterns/json_passing_agent/__init__.py b/contributing/samples/skills_agent_gcs/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/patterns/json_passing_agent/__init__.py rename to contributing/samples/skills_agent_gcs/__init__.py diff --git a/contributing/samples/environment_and_skills/skills_agent_gcs/agent.py b/contributing/samples/skills_agent_gcs/agent.py similarity index 100% rename from contributing/samples/environment_and_skills/skills_agent_gcs/agent.py rename to contributing/samples/skills_agent_gcs/agent.py diff --git a/contributing/samples/integrations/slack_agent/agent.py b/contributing/samples/slack_agent/agent.py similarity index 100% rename from contributing/samples/integrations/slack_agent/agent.py rename to contributing/samples/slack_agent/agent.py diff --git a/contributing/samples/integrations/spanner/README.md b/contributing/samples/spanner/README.md similarity index 100% rename from contributing/samples/integrations/spanner/README.md rename to contributing/samples/spanner/README.md diff --git a/contributing/samples/patterns/workflow_triage/__init__.py b/contributing/samples/spanner/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/patterns/workflow_triage/__init__.py rename to contributing/samples/spanner/__init__.py diff --git a/contributing/samples/integrations/spanner/agent.py b/contributing/samples/spanner/agent.py similarity index 99% rename from contributing/samples/integrations/spanner/agent.py rename to contributing/samples/spanner/agent.py index eb8e5e7776..36dde57260 100644 --- a/contributing/samples/integrations/spanner/agent.py +++ b/contributing/samples/spanner/agent.py @@ -179,6 +179,7 @@ def search_hotels( # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( + model="gemini-2.5-flash", name="spanner_agent", description=( "Agent to answer questions about Spanner database tables and" diff --git a/contributing/samples/integrations/spanner_admin/README.md b/contributing/samples/spanner_admin/README.md similarity index 100% rename from contributing/samples/integrations/spanner_admin/README.md rename to contributing/samples/spanner_admin/README.md diff --git a/contributing/samples/plugin/plugin_debug_logging/__init__.py b/contributing/samples/spanner_admin/__init__.py similarity index 100% rename from contributing/samples/plugin/plugin_debug_logging/__init__.py rename to contributing/samples/spanner_admin/__init__.py diff --git a/contributing/samples/integrations/spanner_admin/agent.py b/contributing/samples/spanner_admin/agent.py similarity index 99% rename from contributing/samples/integrations/spanner_admin/agent.py rename to contributing/samples/spanner_admin/agent.py index 00899d11fe..6129207e87 100644 --- a/contributing/samples/integrations/spanner_admin/agent.py +++ b/contributing/samples/spanner_admin/agent.py @@ -59,6 +59,7 @@ # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( + model="gemini-2.5-flash", name="spanner_admin_agent", description=( "Agent to perform Spanner admin tasks and answer questions about" diff --git a/contributing/samples/integrations/spanner_rag_agent/README.md b/contributing/samples/spanner_rag_agent/README.md similarity index 100% rename from contributing/samples/integrations/spanner_rag_agent/README.md rename to contributing/samples/spanner_rag_agent/README.md diff --git a/contributing/samples/integrations/spanner_rag_agent/Spanner_RAG_Sample_Agent.png b/contributing/samples/spanner_rag_agent/Spanner_RAG_Sample_Agent.png similarity index 100% rename from contributing/samples/integrations/spanner_rag_agent/Spanner_RAG_Sample_Agent.png rename to contributing/samples/spanner_rag_agent/Spanner_RAG_Sample_Agent.png diff --git a/contributing/samples/plugin/plugin_reflect_tool_retry/basic/__init__.py b/contributing/samples/spanner_rag_agent/__init__.py similarity index 100% rename from contributing/samples/plugin/plugin_reflect_tool_retry/basic/__init__.py rename to contributing/samples/spanner_rag_agent/__init__.py diff --git a/contributing/samples/integrations/spanner_rag_agent/agent.py b/contributing/samples/spanner_rag_agent/agent.py similarity index 99% rename from contributing/samples/integrations/spanner_rag_agent/agent.py rename to contributing/samples/spanner_rag_agent/agent.py index 47361c3035..cd479c0caf 100644 --- a/contributing/samples/integrations/spanner_rag_agent/agent.py +++ b/contributing/samples/spanner_rag_agent/agent.py @@ -97,6 +97,7 @@ root_agent = LlmAgent( + model="gemini-2.5-flash", name="spanner_knowledge_base_agent", description=( "Agent to answer questions about product-specific recommendations." diff --git a/contributing/samples/context_management/static_instruction/README.md b/contributing/samples/static_instruction/README.md similarity index 100% rename from contributing/samples/context_management/static_instruction/README.md rename to contributing/samples/static_instruction/README.md diff --git a/contributing/samples/context_management/static_instruction/__init__.py b/contributing/samples/static_instruction/__init__.py similarity index 100% rename from contributing/samples/context_management/static_instruction/__init__.py rename to contributing/samples/static_instruction/__init__.py diff --git a/contributing/samples/context_management/static_instruction/agent.py b/contributing/samples/static_instruction/agent.py similarity index 99% rename from contributing/samples/context_management/static_instruction/agent.py rename to contributing/samples/static_instruction/agent.py index 5e8aadf350..fcf70b51b6 100644 --- a/contributing/samples/context_management/static_instruction/agent.py +++ b/contributing/samples/static_instruction/agent.py @@ -201,6 +201,7 @@ def provide_dynamic_instruction(ctx: ReadonlyContext | None = None): # Create Bingo the digital pet agent root_agent = Agent( + model="gemini-2.5-flash", name="bingo_digital_pet", description="Bingo - A lovable digital pet that needs feeding and care", # Static instruction - defines Bingo's core personality (cached) diff --git a/contributing/samples/context_management/static_instruction/main.py b/contributing/samples/static_instruction/main.py similarity index 100% rename from contributing/samples/context_management/static_instruction/main.py rename to contributing/samples/static_instruction/main.py diff --git a/contributing/samples/multimodal/static_non_text_content/README.md b/contributing/samples/static_non_text_content/README.md similarity index 100% rename from contributing/samples/multimodal/static_non_text_content/README.md rename to contributing/samples/static_non_text_content/README.md diff --git a/contributing/samples/multimodal/static_non_text_content/__init__.py b/contributing/samples/static_non_text_content/__init__.py similarity index 100% rename from contributing/samples/multimodal/static_non_text_content/__init__.py rename to contributing/samples/static_non_text_content/__init__.py diff --git a/contributing/samples/multimodal/static_non_text_content/agent.py b/contributing/samples/static_non_text_content/agent.py similarity index 99% rename from contributing/samples/multimodal/static_non_text_content/agent.py rename to contributing/samples/static_non_text_content/agent.py index c651690b95..e3c69f6fbb 100644 --- a/contributing/samples/multimodal/static_non_text_content/agent.py +++ b/contributing/samples/static_non_text_content/agent.py @@ -212,6 +212,7 @@ def create_static_instruction_with_file_upload(): # Create the root agent with Files API integration root_agent = Agent( + model="gemini-2.5-flash", name="static_non_text_content_demo_agent", description=( "Demonstrates static instructions with non-text content (inline_data" diff --git a/contributing/samples/multimodal/static_non_text_content/main.py b/contributing/samples/static_non_text_content/main.py similarity index 100% rename from contributing/samples/multimodal/static_non_text_content/main.py rename to contributing/samples/static_non_text_content/main.py diff --git a/contributing/samples/integrations/gepa/__init__.py b/contributing/samples/sub_agents_config/__init__.py similarity index 100% rename from contributing/samples/integrations/gepa/__init__.py rename to contributing/samples/sub_agents_config/__init__.py diff --git a/contributing/samples/multi_agent/sub_agents_config/life_agent.py b/contributing/samples/sub_agents_config/life_agent.py similarity index 100% rename from contributing/samples/multi_agent/sub_agents_config/life_agent.py rename to contributing/samples/sub_agents_config/life_agent.py diff --git a/contributing/samples/multi_agent/sub_agents_config/root_agent.yaml b/contributing/samples/sub_agents_config/root_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/sub_agents_config/root_agent.yaml rename to contributing/samples/sub_agents_config/root_agent.yaml diff --git a/contributing/samples/multi_agent/sub_agents_config/work_agent.yaml b/contributing/samples/sub_agents_config/work_agent.yaml similarity index 100% rename from contributing/samples/multi_agent/sub_agents_config/work_agent.yaml rename to contributing/samples/sub_agents_config/work_agent.yaml diff --git a/contributing/samples/telemetry/agent.py b/contributing/samples/telemetry/agent.py new file mode 100755 index 0000000000..a9f1c47a98 --- /dev/null +++ b/contributing/samples/telemetry/agent.py @@ -0,0 +1,110 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import random + +from google.adk import Agent +from google.adk.planners.built_in_planner import BuiltInPlanner +from google.adk.planners.plan_re_act_planner import PlanReActPlanner +from google.adk.tools.tool_context import ToolContext +from google.genai import types + + +def roll_die(sides: int, tool_context: ToolContext) -> int: + """Roll a die and return the rolled result. + + Args: + sides: The integer number of sides the die has. + + Returns: + An integer of the result of rolling the die. + """ + result = random.randint(1, sides) + if not 'rolls' in tool_context.state: + tool_context.state['rolls'] = [] + + tool_context.state['rolls'] = tool_context.state['rolls'] + [result] + return result + + +async def check_prime(nums: list[int]) -> str: + """Check if a given list of numbers are prime. + + Args: + nums: The list of numbers to check. + + Returns: + A str indicating which number is prime. + """ + primes = set() + for number in nums: + number = int(number) + if number <= 1: + continue + is_prime = True + for i in range(2, int(number**0.5) + 1): + if number % i == 0: + is_prime = False + break + if is_prime: + primes.add(number) + return ( + 'No prime numbers found.' + if not primes + else f"{', '.join(str(num) for num in primes)} are prime numbers." + ) + + +root_agent = Agent( + model='gemini-2.5-flash', + name='data_processing_agent', + description=( + 'hello world agent that can roll a dice of 8 sides and check prime' + ' numbers.' + ), + instruction=""" + You roll dice and answer questions about the outcome of the dice rolls. + You can roll dice of different sizes. + You can use multiple tools in parallel by calling functions in parallel(in one request and in one round). + It is ok to discuss previous dice roles, and comment on the dice rolls. + When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string. + You should never roll a die on your own. + When checking prime numbers, call the check_prime tool with a list of integers. Be sure to pass in a list of integers. You should never pass in a string. + You should not check prime numbers before calling the tool. + When you are asked to roll a die and check prime numbers, you should always make the following two function calls: + 1. You should first call the roll_die tool to get a roll. Wait for the function response before calling the check_prime tool. + 2. After you get the function response from roll_die tool, you should call the check_prime tool with the roll_die result. + 2.1 If user asks you to check primes based on previous rolls, make sure you include the previous rolls in the list. + 3. When you respond, you must include the roll_die result from step 1. + You should always perform the previous 3 steps when asking for a roll and checking prime numbers. + You should not rely on the previous history on prime results. + """, + tools=[ + roll_die, + check_prime, + ], + # planner=BuiltInPlanner( + # thinking_config=types.ThinkingConfig( + # include_thoughts=True, + # ), + # ), + generate_content_config=types.GenerateContentConfig( + safety_settings=[ + types.SafetySetting( # avoid false alarm about rolling dice. + category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, + threshold=types.HarmBlockThreshold.OFF, + ), + ] + ), +) diff --git a/contributing/samples/telemetry/main.py b/contributing/samples/telemetry/main.py new file mode 100755 index 0000000000..885dc6489f --- /dev/null +++ b/contributing/samples/telemetry/main.py @@ -0,0 +1,118 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +from contextlib import aclosing +import os +import time + +import agent +from dotenv import load_dotenv +from google.adk.agents.run_config import RunConfig +from google.adk.runners import InMemoryRunner +from google.adk.sessions.session import Session +from google.genai import types +from opentelemetry import trace +from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter +from opentelemetry.sdk.trace import export +from opentelemetry.sdk.trace import TracerProvider + +load_dotenv(override=True) + + +async def main(): + app_name = 'my_app' + user_id_1 = 'user1' + runner = InMemoryRunner( + agent=agent.root_agent, + app_name=app_name, + ) + session_11 = await runner.session_service.create_session( + app_name=app_name, user_id=user_id_1 + ) + + async def run_prompt(session: Session, new_message: str): + content = types.Content( + role='user', parts=[types.Part.from_text(text=new_message)] + ) + print('** User says:', content.model_dump(exclude_none=True)) + async with aclosing( + runner.run_async( + user_id=user_id_1, + session_id=session.id, + new_message=content, + ) + ) as agen: + async for event in agen: + if event.content.parts and event.content.parts[0].text: + print(f'** {event.author}: {event.content.parts[0].text}') + + async def run_prompt_bytes(session: Session, new_message: str): + content = types.Content( + role='user', + parts=[ + types.Part.from_bytes( + data=str.encode(new_message), mime_type='text/plain' + ) + ], + ) + print('** User says:', content.model_dump(exclude_none=True)) + async with aclosing( + runner.run_async( + user_id=user_id_1, + session_id=session.id, + new_message=content, + run_config=RunConfig(save_input_blobs_as_artifacts=True), + ) + ) as agen: + async for event in agen: + if event.content.parts and event.content.parts[0].text: + print(f'** {event.author}: {event.content.parts[0].text}') + + start_time = time.time() + print('Start time:', start_time) + print('------------------------------------') + await run_prompt(session_11, 'Hi') + await run_prompt(session_11, 'Roll a die with 100 sides') + await run_prompt(session_11, 'Roll a die again with 100 sides.') + await run_prompt(session_11, 'What numbers did I got?') + await run_prompt_bytes(session_11, 'Hi bytes') + print( + await runner.artifact_service.list_artifact_keys( + app_name=app_name, user_id=user_id_1, session_id=session_11.id + ) + ) + end_time = time.time() + print('------------------------------------') + print('End time:', end_time) + print('Total time:', end_time - start_time) + + +if __name__ == '__main__': + + provider = TracerProvider() + project_id = os.environ.get('GOOGLE_CLOUD_PROJECT') + if not project_id: + raise ValueError('GOOGLE_CLOUD_PROJECT environment variable is not set.') + print('Tracing to project', project_id) + processor = export.BatchSpanProcessor( + CloudTraceSpanExporter(project_id=project_id) + ) + provider.add_span_processor(processor) + trace.set_tracer_provider(provider) + + asyncio.run(main()) + + provider.force_flush() + print('Done tracing to project', project_id) diff --git a/contributing/samples/plugin/plugin_reflect_tool_retry/hallucinating_func_name/__init__.py b/contributing/samples/token_usage/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/plugin/plugin_reflect_tool_retry/hallucinating_func_name/__init__.py rename to contributing/samples/token_usage/__init__.py diff --git a/contributing/samples/token_usage/agent.py b/contributing/samples/token_usage/agent.py new file mode 100755 index 0000000000..0964147e4b --- /dev/null +++ b/contributing/samples/token_usage/agent.py @@ -0,0 +1,97 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import random + +from google.adk import Agent +from google.adk.agents.llm_agent import LlmAgent +from google.adk.agents.sequential_agent import SequentialAgent +from google.adk.models.anthropic_llm import Claude +from google.adk.models.lite_llm import LiteLlm +from google.adk.planners.built_in_planner import BuiltInPlanner +from google.adk.planners.plan_re_act_planner import PlanReActPlanner +from google.adk.tools.tool_context import ToolContext +from google.genai import types + + +def roll_die(sides: int, tool_context: ToolContext) -> int: + """Roll a die and return the rolled result. + + Args: + sides: The integer number of sides the die has. + + Returns: + An integer of the result of rolling the die. + """ + result = random.randint(1, sides) + if 'rolls' not in tool_context.state: + tool_context.state['rolls'] = [] + + tool_context.state['rolls'] = tool_context.state['rolls'] + [result] + return result + + +roll_agent_with_openai = LlmAgent( + model=LiteLlm(model='openai/gpt-4o'), + description='Handles rolling dice of different sizes.', + name='roll_agent_with_openai', + instruction=""" + You are responsible for rolling dice based on the user's request. + When asked to roll a die, you must call the roll_die tool with the number of sides as an integer. + """, + tools=[roll_die], +) + +roll_agent_with_claude = LlmAgent( + model=Claude(model='claude-3-7-sonnet@20250219'), + description='Handles rolling dice of different sizes.', + name='roll_agent_with_claude', + instruction=""" + You are responsible for rolling dice based on the user's request. + When asked to roll a die, you must call the roll_die tool with the number of sides as an integer. + """, + tools=[roll_die], +) + +roll_agent_with_litellm_claude = LlmAgent( + model=LiteLlm(model='vertex_ai/claude-3-7-sonnet'), + description='Handles rolling dice of different sizes.', + name='roll_agent_with_litellm_claude', + instruction=""" + You are responsible for rolling dice based on the user's request. + When asked to roll a die, you must call the roll_die tool with the number of sides as an integer. + """, + tools=[roll_die], +) + +roll_agent_with_gemini = LlmAgent( + model='gemini-2.5-flash', + description='Handles rolling dice of different sizes.', + name='roll_agent_with_gemini', + instruction=""" + You are responsible for rolling dice based on the user's request. + When asked to roll a die, you must call the roll_die tool with the number of sides as an integer. + """, + tools=[roll_die], +) + +root_agent = SequentialAgent( + name='code_pipeline_agent', + sub_agents=[ + roll_agent_with_openai, + roll_agent_with_claude, + roll_agent_with_litellm_claude, + roll_agent_with_gemini, + ], +) diff --git a/contributing/samples/token_usage/main.py b/contributing/samples/token_usage/main.py new file mode 100755 index 0000000000..b8a3164f13 --- /dev/null +++ b/contributing/samples/token_usage/main.py @@ -0,0 +1,102 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import time +import warnings + +import agent +from dotenv import load_dotenv +from google.adk import Runner +from google.adk.agents.run_config import RunConfig +from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService +from google.adk.cli.utils import logs +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.sessions.session import Session +from google.genai import types + +load_dotenv(override=True) +warnings.filterwarnings('ignore', category=UserWarning) +logs.log_to_tmp_folder() + + +async def main(): + app_name = 'my_app' + user_id_1 = 'user1' + session_service = InMemorySessionService() + artifact_service = InMemoryArtifactService() + runner = Runner( + app_name=app_name, + agent=agent.root_agent, + artifact_service=artifact_service, + session_service=session_service, + ) + session_11 = await session_service.create_session( + app_name=app_name, user_id=user_id_1 + ) + + total_prompt_tokens = 0 + total_candidate_tokens = 0 + total_tokens = 0 + + async def run_prompt(session: Session, new_message: str): + nonlocal total_prompt_tokens + nonlocal total_candidate_tokens + nonlocal total_tokens + content = types.Content( + role='user', parts=[types.Part.from_text(text=new_message)] + ) + print('** User says:', content.model_dump(exclude_none=True)) + async for event in runner.run_async( + user_id=user_id_1, + session_id=session.id, + new_message=content, + ): + if event.content.parts and event.content.parts[0].text: + print(f'** {event.author}: {event.content.parts[0].text}') + if event.usage_metadata: + total_prompt_tokens += event.usage_metadata.prompt_token_count or 0 + total_candidate_tokens += ( + event.usage_metadata.candidates_token_count or 0 + ) + total_tokens += event.usage_metadata.total_token_count or 0 + print( + f'Turn tokens: {event.usage_metadata.total_token_count}' + f' (prompt={event.usage_metadata.prompt_token_count},' + f' candidates={event.usage_metadata.candidates_token_count})' + ) + + print( + f'Session tokens: {total_tokens} (prompt={total_prompt_tokens},' + f' candidates={total_candidate_tokens})' + ) + + start_time = time.time() + print('Start time:', start_time) + print('------------------------------------') + await run_prompt(session_11, 'Hi') + await run_prompt(session_11, 'Roll a die with 100 sides') + print( + await artifact_service.list_artifact_keys( + app_name=app_name, user_id=user_id_1, session_id=session_11.id + ) + ) + end_time = time.time() + print('------------------------------------') + print('End time:', end_time) + print('Total time:', end_time - start_time) + + +if __name__ == '__main__': + asyncio.run(main()) diff --git a/contributing/samples/tools/tool_agent_tool_config/root_agent.yaml b/contributing/samples/tool_agent_tool_config/root_agent.yaml similarity index 100% rename from contributing/samples/tools/tool_agent_tool_config/root_agent.yaml rename to contributing/samples/tool_agent_tool_config/root_agent.yaml diff --git a/contributing/samples/tools/tool_agent_tool_config/summarizer_agent.yaml b/contributing/samples/tool_agent_tool_config/summarizer_agent.yaml similarity index 100% rename from contributing/samples/tools/tool_agent_tool_config/summarizer_agent.yaml rename to contributing/samples/tool_agent_tool_config/summarizer_agent.yaml diff --git a/contributing/samples/tools/tool_agent_tool_config/web_search_agent.yaml b/contributing/samples/tool_agent_tool_config/web_search_agent.yaml similarity index 100% rename from contributing/samples/tools/tool_agent_tool_config/web_search_agent.yaml rename to contributing/samples/tool_agent_tool_config/web_search_agent.yaml diff --git a/contributing/samples/tools/tool_builtin_config/root_agent.yaml b/contributing/samples/tool_builtin_config/root_agent.yaml similarity index 100% rename from contributing/samples/tools/tool_builtin_config/root_agent.yaml rename to contributing/samples/tool_builtin_config/root_agent.yaml diff --git a/contributing/samples/multi_agent/sub_agents_config/__init__.py b/contributing/samples/tool_functions_config/__init__.py similarity index 100% rename from contributing/samples/multi_agent/sub_agents_config/__init__.py rename to contributing/samples/tool_functions_config/__init__.py diff --git a/contributing/samples/tools/tool_functions_config/root_agent.yaml b/contributing/samples/tool_functions_config/root_agent.yaml similarity index 100% rename from contributing/samples/tools/tool_functions_config/root_agent.yaml rename to contributing/samples/tool_functions_config/root_agent.yaml diff --git a/contributing/samples/tools/tool_functions_config/tools.py b/contributing/samples/tool_functions_config/tools.py similarity index 100% rename from contributing/samples/tools/tool_functions_config/tools.py rename to contributing/samples/tool_functions_config/tools.py diff --git a/contributing/samples/hitl/tool_human_in_the_loop_config/README.md b/contributing/samples/tool_human_in_the_loop_config/README.md similarity index 100% rename from contributing/samples/hitl/tool_human_in_the_loop_config/README.md rename to contributing/samples/tool_human_in_the_loop_config/README.md diff --git a/contributing/samples/tools/tool_functions_config/__init__.py b/contributing/samples/tool_human_in_the_loop_config/__init__.py similarity index 100% rename from contributing/samples/tools/tool_functions_config/__init__.py rename to contributing/samples/tool_human_in_the_loop_config/__init__.py diff --git a/contributing/samples/hitl/tool_human_in_the_loop_config/root_agent.yaml b/contributing/samples/tool_human_in_the_loop_config/root_agent.yaml similarity index 100% rename from contributing/samples/hitl/tool_human_in_the_loop_config/root_agent.yaml rename to contributing/samples/tool_human_in_the_loop_config/root_agent.yaml diff --git a/contributing/samples/hitl/tool_human_in_the_loop_config/tools.py b/contributing/samples/tool_human_in_the_loop_config/tools.py similarity index 100% rename from contributing/samples/hitl/tool_human_in_the_loop_config/tools.py rename to contributing/samples/tool_human_in_the_loop_config/tools.py diff --git a/contributing/samples/mcp/tool_mcp_stdio_notion_config/README.md b/contributing/samples/tool_mcp_stdio_notion_config/README.md similarity index 100% rename from contributing/samples/mcp/tool_mcp_stdio_notion_config/README.md rename to contributing/samples/tool_mcp_stdio_notion_config/README.md diff --git a/contributing/samples/mcp/tool_mcp_stdio_notion_config/root_agent.yaml b/contributing/samples/tool_mcp_stdio_notion_config/root_agent.yaml similarity index 100% rename from contributing/samples/mcp/tool_mcp_stdio_notion_config/root_agent.yaml rename to contributing/samples/tool_mcp_stdio_notion_config/root_agent.yaml diff --git a/contributing/samples/integrations/toolbox_agent/README.md b/contributing/samples/toolbox_agent/README.md similarity index 100% rename from contributing/samples/integrations/toolbox_agent/README.md rename to contributing/samples/toolbox_agent/README.md diff --git a/contributing/samples/tools/agent_tool_with_grounding_metadata/__init__.py b/contributing/samples/toolbox_agent/__init__.py similarity index 100% rename from contributing/samples/tools/agent_tool_with_grounding_metadata/__init__.py rename to contributing/samples/toolbox_agent/__init__.py diff --git a/contributing/samples/integrations/toolbox_agent/agent.py b/contributing/samples/toolbox_agent/agent.py similarity index 96% rename from contributing/samples/integrations/toolbox_agent/agent.py rename to contributing/samples/toolbox_agent/agent.py index 5b459e1c6b..e7eec45f28 100644 --- a/contributing/samples/integrations/toolbox_agent/agent.py +++ b/contributing/samples/toolbox_agent/agent.py @@ -17,6 +17,7 @@ from google.adk.tools.toolbox_toolset import ToolboxToolset root_agent = Agent( + model="gemini-2.5-flash", name="root_agent", instruction="You are a helpful assistant", # Add Toolbox tools to ADK agent diff --git a/contributing/samples/integrations/toolbox_agent/tool_box.db b/contributing/samples/toolbox_agent/tool_box.db similarity index 100% rename from contributing/samples/integrations/toolbox_agent/tool_box.db rename to contributing/samples/toolbox_agent/tool_box.db diff --git a/contributing/samples/integrations/toolbox_agent/tools.yaml b/contributing/samples/toolbox_agent/tools.yaml similarity index 100% rename from contributing/samples/integrations/toolbox_agent/tools.yaml rename to contributing/samples/toolbox_agent/tools.yaml diff --git a/contributing/samples/tools/function_tools/README.md b/contributing/samples/tools/function_tools/README.md deleted file mode 100644 index 1331cf0577..0000000000 --- a/contributing/samples/tools/function_tools/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# ADK Agent Function Tools Sample - -## Overview - -This sample demonstrates how to create an agent equipped with built-in Python function tools using the **ADK** framework. - -It defines an `Agent` wrapped around two utility functions: `generate_random_number` and `is_even`. The LLM can automatically invoke these underlying Python functions based on user prompts. This sample shows how simple it is to turn raw python methods into actionable capabilities for your agents. - -## Sample Inputs - -- `Give me a random number.` - -- `Give me a random number up to 50, and tell me if it's even.` - -- `Give me a random number and is 44 even?` - - *This will cause parallel tools being called in a single step* - -## Graph - -```mermaid -graph TD - Agent[Agent: function_tools] --> Tool1[Tool: generate_random_number] - Agent --> Tool2[Tool: is_even] -``` - -## How To - -1. Define standard Python functions with type hints and precise docstrings: - - ```python - import random - - def generate_random_number(max_value: int = 100) -> int: - """Generates a random integer between 0 and max_value (inclusive). ...""" - return random.randint(0, max_value) - - def is_even(number: int) -> bool: - """Checks if a given number is even. ...""" - return number % 2 == 0 - ``` - -1. Register the functions directly to the agent's `tools` list during instantiation: - - ```python - from google.adk.agents import Agent - - root_agent = Agent( - name="function_tools", - tools=[generate_random_number, is_even], - ) - ``` diff --git a/contributing/samples/tools/function_tools/agent.py b/contributing/samples/tools/function_tools/agent.py deleted file mode 100644 index 5d0f3aaf38..0000000000 --- a/contributing/samples/tools/function_tools/agent.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import os -import random - -from google.adk.agents import Agent - -_counter = 0 - - -def generate_random_number(max_value: int = 100) -> int: - """Generates a random integer between 0 and max_value (inclusive). - - Args: - max_value: The upper limit for the random number. - - Returns: - A random integer between 0 and max_value. - """ - # Return a growing value in tests to ensure determinism while allowing - # multiple calls. - if "PYTEST_CURRENT_TEST" in os.environ: - global _counter - _counter += 1 - return _counter - return random.randint(0, max_value) - - -def is_even(number: int) -> bool: - """Checks if a given number is even. - - Args: - number: The number to check. - - Returns: - True if the number is even, False otherwise. - """ - return number % 2 == 0 - - -root_agent = Agent( - name="function_tools", - tools=[generate_random_number, is_even], -) diff --git a/contributing/samples/tools/function_tools/tests/a_random_number.json b/contributing/samples/tools/function_tools/tests/a_random_number.json deleted file mode 100644 index d1f3935782..0000000000 --- a/contributing/samples/tools/function_tools/tests/a_random_number.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "a random number" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "function_tools", - "content": { - "parts": [ - { - "functionCall": { - "args": {}, - "id": "fc-1", - "name": "generate_random_number" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "function_tools@1" - } - }, - { - "author": "function_tools", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "generate_random_number", - "response": { - "result": 1 - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "function_tools@1" - } - }, - { - "author": "function_tools", - "content": { - "parts": [ - { - "text": "Here is a random number: 1\n" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "function_tools@1" - } - } - ] -} diff --git a/contributing/samples/tools/function_tools/tests/a_random_number_and_check_even.json b/contributing/samples/tools/function_tools/tests/a_random_number_and_check_even.json deleted file mode 100644 index 0fb091c8c2..0000000000 --- a/contributing/samples/tools/function_tools/tests/a_random_number_and_check_even.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "a random number and check even" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "function_tools", - "content": { - "parts": [ - { - "functionCall": { - "args": {}, - "id": "fc-1", - "name": "generate_random_number" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "function_tools@1" - } - }, - { - "author": "function_tools", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "generate_random_number", - "response": { - "result": 1 - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "function_tools@1" - } - }, - { - "author": "function_tools", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "number": 1 - }, - "id": "fc-2", - "name": "is_even" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "function_tools@1" - } - }, - { - "author": "function_tools", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "is_even", - "response": { - "result": false - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "function_tools@1" - } - }, - { - "author": "function_tools", - "content": { - "parts": [ - { - "text": "The random number is 1. It is not an even number." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "function_tools@1" - } - } - ] -} diff --git a/contributing/samples/tools/function_tools/tests/random_number_and_is_5_even.json b/contributing/samples/tools/function_tools/tests/random_number_and_is_5_even.json deleted file mode 100644 index 856530af68..0000000000 --- a/contributing/samples/tools/function_tools/tests/random_number_and_is_5_even.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "random number and is 5 even?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "function_tools", - "content": { - "parts": [ - { - "functionCall": { - "args": {}, - "id": "fc-1", - "name": "generate_random_number" - } - }, - { - "functionCall": { - "args": { - "number": 5 - }, - "id": "fc-2", - "name": "is_even" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "function_tools@1" - } - }, - { - "author": "function_tools", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "generate_random_number", - "response": { - "result": 1 - } - } - }, - { - "functionResponse": { - "id": "fc-2", - "name": "is_even", - "response": { - "result": false - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "function_tools@1" - } - }, - { - "author": "function_tools", - "content": { - "parts": [ - { - "text": "A random number is 1, and no, 5 is not an even number." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "function_tools@1" - } - } - ] -} diff --git a/contributing/samples/tools/long_running_functions/README.md b/contributing/samples/tools/long_running_functions/README.md deleted file mode 100644 index e7c1236ada..0000000000 --- a/contributing/samples/tools/long_running_functions/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# Long Running Functions - -## Overview - -This sample demonstrates how to use `LongRunningFunctionTool` in ADK to handle operations that take a significant amount of time to complete. - -When a tool is marked as long-running, the framework understands that the function may return a pending status and that the final result will be provided asynchronously. This is useful for tasks like starting a background job, requesting human approval, or any operation where the result is not immediately available. - -## Sample Inputs - -- `Export my data to CSV` - -- `Start a JSON data export` - -- `Export my data to both CSV and JSON simultaneously` - -## Graph - -```mermaid -sequenceDiagram - actor User - participant Agent - participant Tool - - User->>Agent: "Export my data to CSV" - Agent->>Tool: export_data(export_type="csv") - Tool-->>Agent: {"status": "pending", ...} - Agent-->>User: "Started csv export. Ticket ID: export-12345" -``` - -## How To - -To create a long-running function tool: - -1. Define your Python function. It can return a status indicating it is in-progress (e.g., `{"status": "in-progress"}`). -1. Wrap the function using `LongRunningFunctionTool(func=your_function)`. -1. Pass the wrapped tool to the `Agent`. - -After the initial in-progress response, you can send additional function responses (e.g., containing progress updates like `{"status": "in-progress", "progress": "50%"}`) to the agent. This will trigger another model turn, allowing the agent to report the current progress back to the user. - -In the ADK Web UI, you can send an additional response by hovering over the function response button and selecting 'Send another response' from the menu. - -```python -from google.adk import Agent -from google.adk.tools.long_running_tool import LongRunningFunctionTool -def export_data(export_type: str) -> dict[str, str]: - # Start async task... - return { - "status": "in-progress", - "progress": "0%", - "message": f"Exporting {export_type} data. This may take some time.", - } - - -agent = Agent( - name="my_agent", - model="gemini-2.5-flash", - tools=[LongRunningFunctionTool(func=export_data)], -) -``` diff --git a/contributing/samples/tools/long_running_functions/__init__.py b/contributing/samples/tools/long_running_functions/__init__.py deleted file mode 100644 index 4015e47d6e..0000000000 --- a/contributing/samples/tools/long_running_functions/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from . import agent diff --git a/contributing/samples/tools/long_running_functions/agent.py b/contributing/samples/tools/long_running_functions/agent.py deleted file mode 100644 index ea3e949ade..0000000000 --- a/contributing/samples/tools/long_running_functions/agent.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from google.adk import Agent -from google.adk.tools.long_running_tool import LongRunningFunctionTool - - -def export_data(export_type: str) -> dict[str, str]: - """Exports user data. - - Args: - export_type: The type of data to export (e.g., 'csv', 'json'). - - Returns: - A dict with the status. - """ - # In a real application, this would kick off a background job. - # Here we just return a status. - return { - "status": "in-progress", - "progress": "0%", - "message": f"Exporting {export_type} data. This may take some time.", - } - - -root_agent = Agent( - name="long_running_functions", - instruction=""" - You are an assistant that can export user data. - When the user asks to export data, call the `export_data` tool. - """, - tools=[LongRunningFunctionTool(func=export_data)], -) diff --git a/contributing/samples/tools/long_running_functions/tests/export_to_csv.json b/contributing/samples/tools/long_running_functions/tests/export_to_csv.json deleted file mode 100644 index 77c59729b5..0000000000 --- a/contributing/samples/tools/long_running_functions/tests/export_to_csv.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "export to csv" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "long_running_functions", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "export_type": "csv" - }, - "id": "fc-1", - "name": "export_data" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-1" - ], - "nodeInfo": { - "path": "long_running_functions@1" - } - }, - { - "author": "long_running_functions", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "export_data", - "response": { - "message": "Exporting csv data. This may take some time.", - "progress": "0%", - "status": "in-progress" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "long_running_functions@1" - } - }, - { - "author": "long_running_functions", - "content": { - "parts": [ - { - "text": "I'm exporting your data to CSV. This may take some time. I will let you know when it's done." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "long_running_functions@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "export_data", - "response": { - "progress": "50%", - "status": "in-progress" - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "long_running_functions", - "content": { - "parts": [ - { - "text": "Your data is 50% exported. The export is still in progress." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "long_running_functions@1" - } - } - ] -} diff --git a/contributing/samples/tools/long_running_functions/tests/export_to_csv_and_json.json b/contributing/samples/tools/long_running_functions/tests/export_to_csv_and_json.json deleted file mode 100644 index f37322c34e..0000000000 --- a/contributing/samples/tools/long_running_functions/tests/export_to_csv_and_json.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "export to csv and json" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "long_running_functions", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "export_type": "csv" - }, - "id": "fc-1", - "name": "export_data" - } - }, - { - "functionCall": { - "args": { - "export_type": "json" - }, - "id": "fc-2", - "name": "export_data" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-1", - "fc-2" - ], - "nodeInfo": { - "path": "long_running_functions@1" - } - }, - { - "author": "long_running_functions", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "export_data", - "response": { - "message": "Exporting csv data. This may take some time.", - "progress": "0%", - "status": "in-progress" - } - } - }, - { - "functionResponse": { - "id": "fc-2", - "name": "export_data", - "response": { - "message": "Exporting json data. This may take some time.", - "progress": "0%", - "status": "in-progress" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "long_running_functions@1" - } - }, - { - "author": "long_running_functions", - "content": { - "parts": [ - { - "text": "I've started exporting your data to both CSV and JSON formats. This may take some time. I will notify you when it's complete." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "long_running_functions@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "export_data", - "response": { - "progress": "50%", - "status": "in-progress" - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "long_running_functions", - "content": { - "parts": [ - { - "text": "I've started exporting your data to both CSV and JSON formats. This may take some time to complete." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "long_running_functions@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "export_data", - "response": { - "status": "completed" - } - } - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "long_running_functions", - "content": { - "parts": [ - { - "text": "I've started exporting your data to CSV and JSON. The JSON export is complete, and the CSV export is 50% complete. I'll let you know when the CSV export is finished." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "path": "long_running_functions@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "export_data", - "response": { - "status": "completed" - } - } - } - ], - "role": "user" - }, - "id": "e-9", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "long_running_functions", - "content": { - "parts": [ - { - "text": "I have exported the data to both CSV and JSON formats." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-10", - "invocationId": "i-1", - "nodeInfo": { - "path": "long_running_functions@1" - } - } - ] -} diff --git a/contributing/samples/tools/output_schema_with_tools/__init__.py b/contributing/samples/tools/output_schema_with_tools/__init__.py deleted file mode 100644 index 4015e47d6e..0000000000 --- a/contributing/samples/tools/output_schema_with_tools/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from . import agent diff --git a/contributing/samples/tools/parallel_functions/__init__.py b/contributing/samples/tools/parallel_functions/__init__.py deleted file mode 100644 index 4015e47d6e..0000000000 --- a/contributing/samples/tools/parallel_functions/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from . import agent diff --git a/contributing/samples/tools/parallel_functions/tests/test_all_tools.json b/contributing/samples/tools/parallel_functions/tests/test_all_tools.json deleted file mode 100644 index 4b6caece90..0000000000 --- a/contributing/samples/tools/parallel_functions/tests/test_all_tools.json +++ /dev/null @@ -1,196 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Tell me about Paris and Sydney: weather, distance between them, and their populations." - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "parallel_function_test_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "city": "Paris" - }, - "id": "fc-1", - "name": "get_weather" - } - }, - { - "functionCall": { - "args": { - "city": "Sydney" - }, - "id": "fc-2", - "name": "get_weather" - } - }, - { - "functionCall": { - "args": { - "city1": "Paris", - "city2": "Sydney" - }, - "id": "fc-3", - "name": "calculate_distance" - } - }, - { - "functionCall": { - "args": { - "cities": [ - "Paris", - "Sydney" - ] - }, - "id": "fc-4", - "name": "get_population" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "parallel_function_test_agent@1" - } - }, - { - "actions": { - "stateDelta": { - "distance_requests": [ - { - "city1": "Paris", - "city2": "Sydney", - "distance": 18903 - } - ], - "population_requests": [ - { - "cities": [ - "Paris", - "Sydney" - ], - "results": { - "Paris": 2161000, - "Sydney": 5312163 - } - } - ], - "weather_requests": [ - { - "city": "Paris", - "result": { - "condition": "overcast", - "humidity": 70, - "temp": 58 - } - }, - { - "city": "Sydney", - "result": { - "condition": "sunny", - "humidity": 60, - "temp": 75 - } - } - ] - } - }, - "author": "parallel_function_test_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "get_weather", - "response": { - "city": "Paris", - "condition": "overcast", - "humidity": 70, - "temperature": 58 - } - } - }, - { - "functionResponse": { - "id": "fc-2", - "name": "get_weather", - "response": { - "city": "Sydney", - "condition": "sunny", - "humidity": 60, - "temperature": 75 - } - } - }, - { - "functionResponse": { - "id": "fc-3", - "name": "calculate_distance", - "response": { - "city1": "Paris", - "city2": "Sydney", - "distance_km": 18903, - "distance_miles": 11745 - } - } - }, - { - "functionResponse": { - "id": "fc-4", - "name": "get_population", - "response": { - "cities_count": 2, - "populations": { - "Paris": 2161000, - "Sydney": 5312163 - }, - "total_population": 7473163 - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "parallel_function_test_agent@1" - } - }, - { - "author": "parallel_function_test_agent", - "content": { - "parts": [ - { - "text": "Here's the information about Paris and Sydney:\n\n**Paris:**\n* **Weather:** The current weather in Paris is overcast with a temperature of 58\u00b0F and 70% humidity.\n* **Population:** The population of Paris is 2,161,000.\n\n**Sydney:**\n* **Weather:** The current weather in Sydney is sunny with a temperature of 75\u00b0F and 60% humidity.\n* **Population:** The population of Sydney is 5,312,163.\n\n**Distance between Paris and Sydney:**\nThe distance between Paris and Sydney is 18,903 km (11,745 miles)." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "parallel_function_test_agent@1" - } - } - ] -} diff --git a/contributing/samples/tools/parallel_functions/tests/test_parallel_mixed.json b/contributing/samples/tools/parallel_functions/tests/test_parallel_mixed.json deleted file mode 100644 index 1fa993e391..0000000000 --- a/contributing/samples/tools/parallel_functions/tests/test_parallel_mixed.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What is the weather in Tokyo and the exchange rate from USD to EUR?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "parallel_function_test_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "city": "Tokyo" - }, - "id": "fc-1", - "name": "get_weather" - } - }, - { - "functionCall": { - "args": { - "from_currency": "USD", - "to_currency": "EUR" - }, - "id": "fc-2", - "name": "get_currency_rate" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "parallel_function_test_agent@1" - } - }, - { - "actions": { - "stateDelta": { - "currency_requests": [ - { - "from": "USD", - "rate": 0.85, - "to": "EUR" - } - ], - "weather_requests": [ - { - "city": "Tokyo", - "result": { - "condition": "rainy", - "humidity": 90, - "temp": 68 - } - } - ] - } - }, - "author": "parallel_function_test_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "get_weather", - "response": { - "city": "Tokyo", - "condition": "rainy", - "humidity": 90, - "temperature": 68 - } - } - }, - { - "functionResponse": { - "id": "fc-2", - "name": "get_currency_rate", - "response": { - "exchange_rate": 0.85, - "from_currency": "USD", - "to_currency": "EUR" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "parallel_function_test_agent@1" - } - }, - { - "author": "parallel_function_test_agent", - "content": { - "parts": [ - { - "text": "The weather in Tokyo is rainy with a temperature of 68 degrees Fahrenheit and 90% humidity. The exchange rate from USD to EUR is 0.85." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "parallel_function_test_agent@1" - } - } - ] -} diff --git a/contributing/samples/tools/parallel_functions/tests/test_parallel_weather.json b/contributing/samples/tools/parallel_functions/tests/test_parallel_weather.json deleted file mode 100644 index 660e754ef7..0000000000 --- a/contributing/samples/tools/parallel_functions/tests/test_parallel_weather.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "What is the weather in New York and London?" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "parallel_function_test_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "city": "New York" - }, - "id": "fc-1", - "name": "get_weather" - } - }, - { - "functionCall": { - "args": { - "city": "London" - }, - "id": "fc-2", - "name": "get_weather" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "parallel_function_test_agent@1" - } - }, - { - "actions": { - "stateDelta": { - "weather_requests": [ - { - "city": "New York", - "result": { - "condition": "sunny", - "humidity": 45, - "temp": 72 - } - }, - { - "city": "London", - "result": { - "condition": "cloudy", - "humidity": 80, - "temp": 60 - } - } - ] - } - }, - "author": "parallel_function_test_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "get_weather", - "response": { - "city": "New York", - "condition": "sunny", - "humidity": 45, - "temperature": 72 - } - } - }, - { - "functionResponse": { - "id": "fc-2", - "name": "get_weather", - "response": { - "city": "London", - "condition": "cloudy", - "humidity": 80, - "temperature": 60 - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "parallel_function_test_agent@1" - } - }, - { - "author": "parallel_function_test_agent", - "content": { - "parts": [ - { - "text": "The weather in New York is sunny with a temperature of 72 degrees Fahrenheit and 45% humidity. In London, it is cloudy with a temperature of 60 degrees Fahrenheit and 80% humidity." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "parallel_function_test_agent@1" - } - } - ] -} diff --git a/contributing/samples/tools/pydantic_argument/__init__.py b/contributing/samples/tools/pydantic_argument/__init__.py deleted file mode 100644 index 4015e47d6e..0000000000 --- a/contributing/samples/tools/pydantic_argument/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from . import agent diff --git a/contributing/samples/tools/pydantic_argument/tests/test_create_company.json b/contributing/samples/tools/pydantic_argument/tests/test_create_company.json deleted file mode 100644 index bf8d2ab0be..0000000000 --- a/contributing/samples/tools/pydantic_argument/tests/test_create_company.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Create a profile for company Acme Corp in tech industry with 50 employees." - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "profile_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "entity": { - "company_name": "Acme Corp", - "employee_count": 50, - "industry": "tech" - } - }, - "id": "fc-1", - "name": "create_entity_profile" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "profile_agent@1" - } - }, - { - "author": "profile_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "create_entity_profile", - "response": { - "entity_type": "company", - "message": "Company profile created for Acme Corp!", - "profile": { - "company_name": "Acme Corp", - "employee_count": 50, - "industry": "tech", - "model_type": "CompanyProfile", - "website": "Not provided" - }, - "status": "company_profile_created" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "profile_agent@1" - } - }, - { - "author": "profile_agent", - "content": { - "parts": [ - { - "text": "I have created a profile for Acme Corp in the tech industry with 50 employees." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "profile_agent@1" - } - } - ] -} diff --git a/contributing/samples/tools/pydantic_argument/tests/test_create_user.json b/contributing/samples/tools/pydantic_argument/tests/test_create_user.json deleted file mode 100644 index ce1ae1b374..0000000000 --- a/contributing/samples/tools/pydantic_argument/tests/test_create_user.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Create a user account for Alice, age 30, email alice@example.com." - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "profile_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "profile": { - "age": 30, - "email": "alice@example.com", - "name": "Alice" - } - }, - "id": "fc-1", - "name": "create_full_user_account" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "profile_agent@1" - } - }, - { - "author": "profile_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "create_full_user_account", - "response": { - "conversion_demo": { - "preferences_converted": "JSON dict \u2192 UserPreferences instance", - "profile_converted": "JSON dict \u2192 UserProfile instance" - }, - "message": "Full account created for Alice!", - "preferences": { - "language": "English", - "notifications_enabled": true, - "preferences_type": "UserPreferences", - "theme": "light" - }, - "profile": { - "age": 30, - "email": "alice@example.com", - "name": "Alice", - "profile_type": "UserProfile" - }, - "status": "account_created" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "profile_agent@1" - } - }, - { - "author": "profile_agent", - "content": { - "parts": [ - { - "text": "I have created a user account for Alice, age 30, with the email alice@example.com." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "profile_agent@1" - } - } - ] -} diff --git a/contributing/samples/tools/pydantic_argument/tests/test_create_user_with_prefs.json b/contributing/samples/tools/pydantic_argument/tests/test_create_user_with_prefs.json deleted file mode 100644 index a5e9969bc8..0000000000 --- a/contributing/samples/tools/pydantic_argument/tests/test_create_user_with_prefs.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "Create a user account for Bob, age 25, with dark theme and French language." - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "profile_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "preferences": { - "language": "French", - "theme": "dark" - }, - "profile": { - "age": 25, - "name": "Bob" - } - }, - "id": "fc-1", - "name": "create_full_user_account" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "profile_agent@1" - } - }, - { - "author": "profile_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "create_full_user_account", - "response": { - "conversion_demo": { - "preferences_converted": "JSON dict \u2192 UserPreferences instance", - "profile_converted": "JSON dict \u2192 UserProfile instance" - }, - "message": "Full account created for Bob!", - "preferences": { - "language": "French", - "notifications_enabled": true, - "preferences_type": "UserPreferences", - "theme": "dark" - }, - "profile": { - "age": 25, - "email": "Not provided", - "name": "Bob", - "profile_type": "UserProfile" - }, - "status": "account_created" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "profile_agent@1" - } - }, - { - "author": "profile_agent", - "content": { - "parts": [ - { - "text": "OK. I have created a user account for Bob, age 25, with a dark theme and French language preference." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "profile_agent@1" - } - } - ] -} diff --git a/contributing/samples/code_execution/vertex_code_execution/README.md b/contributing/samples/vertex_code_execution/README.md similarity index 100% rename from contributing/samples/code_execution/vertex_code_execution/README.md rename to contributing/samples/vertex_code_execution/README.md diff --git a/contributing/samples/tools/built_in_multi_tools/__init__.py b/contributing/samples/vertex_code_execution/__init__.py similarity index 100% rename from contributing/samples/tools/built_in_multi_tools/__init__.py rename to contributing/samples/vertex_code_execution/__init__.py diff --git a/contributing/samples/code_execution/vertex_code_execution/agent.py b/contributing/samples/vertex_code_execution/agent.py similarity index 99% rename from contributing/samples/code_execution/vertex_code_execution/agent.py rename to contributing/samples/vertex_code_execution/agent.py index 1ea3a5e5a2..79e5a03d1b 100644 --- a/contributing/samples/code_execution/vertex_code_execution/agent.py +++ b/contributing/samples/vertex_code_execution/agent.py @@ -78,6 +78,7 @@ def base_system_instruction(): root_agent = Agent( + model="gemini-2.5-flash", name="data_science_agent", instruction=base_system_instruction() + """ diff --git a/contributing/samples/legacy_workflows/workflow_agent_seq/README.md b/contributing/samples/workflow_agent_seq/README.md similarity index 100% rename from contributing/samples/legacy_workflows/workflow_agent_seq/README.md rename to contributing/samples/workflow_agent_seq/README.md diff --git a/contributing/samples/tools/function_tools/__init__.py b/contributing/samples/workflow_agent_seq/__init__.py similarity index 100% rename from contributing/samples/tools/function_tools/__init__.py rename to contributing/samples/workflow_agent_seq/__init__.py diff --git a/contributing/samples/legacy_workflows/workflow_agent_seq/agent.py b/contributing/samples/workflow_agent_seq/agent.py similarity index 98% rename from contributing/samples/legacy_workflows/workflow_agent_seq/agent.py rename to contributing/samples/workflow_agent_seq/agent.py index 77a3e70d02..5e26c20d62 100644 --- a/contributing/samples/legacy_workflows/workflow_agent_seq/agent.py +++ b/contributing/samples/workflow_agent_seq/agent.py @@ -23,6 +23,7 @@ # Takes the initial specification (from user query) and writes code. code_writer_agent = LlmAgent( name="CodeWriterAgent", + model="gemini-2.5-flash", # Change 3: Improved instruction instruction="""You are a Python Code Generator. Based *only* on the user's request, write Python code that fulfills the requirement. @@ -37,6 +38,7 @@ # Takes the code generated by the previous agent (read from state) and provides feedback. code_reviewer_agent = LlmAgent( name="CodeReviewerAgent", + model="gemini-2.5-flash", # Change 3: Improved instruction, correctly using state key injection instruction="""You are an expert Python Code Reviewer. Your task is to provide constructive feedback on the provided code. @@ -67,6 +69,7 @@ # Takes the original code and the review comments (read from state) and refactors the code. code_refactorer_agent = LlmAgent( name="CodeRefactorerAgent", + model="gemini-2.5-flash", # Change 3: Improved instruction, correctly using state key injection instruction="""You are a Python Code Refactoring AI. Your goal is to improve the given Python code based on the provided review comments. diff --git a/contributing/samples/legacy_workflows/workflow_agent_seq/main.py b/contributing/samples/workflow_agent_seq/main.py similarity index 100% rename from contributing/samples/legacy_workflows/workflow_agent_seq/main.py rename to contributing/samples/workflow_agent_seq/main.py diff --git a/contributing/samples/legacy_workflows/workflow_agent_seq/sample.output b/contributing/samples/workflow_agent_seq/sample.output similarity index 100% rename from contributing/samples/legacy_workflows/workflow_agent_seq/sample.output rename to contributing/samples/workflow_agent_seq/sample.output diff --git a/contributing/samples/patterns/workflow_triage/README.md b/contributing/samples/workflow_triage/README.md similarity index 100% rename from contributing/samples/patterns/workflow_triage/README.md rename to contributing/samples/workflow_triage/README.md diff --git a/contributing/samples/tools/hello_world_stream_fc_args/__init__.py b/contributing/samples/workflow_triage/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/tools/hello_world_stream_fc_args/__init__.py rename to contributing/samples/workflow_triage/__init__.py diff --git a/contributing/samples/patterns/workflow_triage/agent.py b/contributing/samples/workflow_triage/agent.py similarity index 98% rename from contributing/samples/patterns/workflow_triage/agent.py rename to contributing/samples/workflow_triage/agent.py index 1627939d32..9b0cc66943 100755 --- a/contributing/samples/patterns/workflow_triage/agent.py +++ b/contributing/samples/workflow_triage/agent.py @@ -29,6 +29,7 @@ def update_execution_plan( root_agent = Agent( + model="gemini-2.5-flash", name="execution_manager_agent", instruction="""\ You are the Execution Manager Agent, responsible for setting up execution plan and delegate to plan_execution_agent for the actual plan execution. diff --git a/contributing/samples/patterns/workflow_triage/execution_agent.py b/contributing/samples/workflow_triage/execution_agent.py similarity index 97% rename from contributing/samples/patterns/workflow_triage/execution_agent.py rename to contributing/samples/workflow_triage/execution_agent.py index 987b0ec583..ca97939d56 100644 --- a/contributing/samples/patterns/workflow_triage/execution_agent.py +++ b/contributing/samples/workflow_triage/execution_agent.py @@ -47,6 +47,7 @@ def callback(callback_context: CallbackContext) -> Optional[types.Content]: code_agent = Agent( + model="gemini-2.5-flash", name="code_agent", instruction="""\ You are the Code Agent, responsible for generating code. @@ -58,6 +59,7 @@ def callback(callback_context: CallbackContext) -> Optional[types.Content]: ) math_agent = Agent( + model="gemini-2.5-flash", name="math_agent", instruction="""\ You are the Math Agent, responsible for performing mathematical calculations. @@ -102,6 +104,7 @@ def instruction_provider_for_execution_summary_agent( execution_summary_agent = Agent( + model="gemini-2.5-flash", name="execution_summary_agent", instruction=instruction_provider_for_execution_summary_agent, include_contents="none", diff --git a/contributing/samples/workflows/auth_api_key/README.md b/contributing/samples/workflows/auth_api_key/README.md deleted file mode 100644 index 609fc52b13..0000000000 --- a/contributing/samples/workflows/auth_api_key/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# ADK Workflow Auth Config Sample - -## Overview - -This sample demonstrates how to use `auth_config` on a `FunctionNode` to require user authentication before the node runs. - -When a node has `auth_config`, the workflow automatically: - -1. Pauses the node and emits an `adk_request_credential` FunctionCall event -1. The invocation ends — the node is marked as waiting -1. The client sends a new request with the credential as a FunctionResponse -1. The workflow stores the credential in session state and re-runs the node - -The **ADK web UI** (`adk web`) handles step 3 automatically — it recognizes auth -requests and presents an auth dialog. If you use a custom client, you need to -handle the `adk_request_credential` FunctionCall and respond with the credential -yourself. - -This sample uses **API key** authentication (the simplest credential type). - -## No External Setup Required - -This sample uses a mock weather lookup. No external API key or server is needed. When the auth UI prompts for a key, you can enter any value (e.g., `my-test-key-123`). - -## Sample Inputs - -Send any message (e.g., `go`) to start the workflow. - -## Graph - -```mermaid -graph TD - START --> fetch_weather[fetch_weather
pauses for auth on first run] - fetch_weather --> summarize -``` - -## How To - -1. Define an `AuthConfig` with the auth scheme and credential type: - - ```python - from google.adk.auth.auth_tool import AuthConfig - from google.adk.auth.auth_credential import AuthCredential, AuthCredentialTypes - - auth_config = AuthConfig( - auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), - raw_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.API_KEY, - api_key='placeholder', - ), - credential_key='weather_api_key', - ) - ``` - -1. Use the `@node` decorator with `auth_config` and `rerun_on_resume=True`: - - ```python - @node(auth_config=auth_config, rerun_on_resume=True) - def fetch_weather(ctx: Context): - ... - ``` - -1. Inside the function, retrieve the credential from `ctx`: - - ```python - def fetch_weather(ctx: Context): - cred = ctx.get_auth_response(auth_config) - api_key = cred.api_key - # Use api_key to call your API... - ``` - -## OAuth2 - -The same `auth_config` pattern works with OAuth2 and OpenID Connect. The key -differences: - -- **Auth scheme**: Use `OAuth2` (from `fastapi.openapi.models`) instead of - `APIKey`. Configure the authorization and token URLs in the OAuth2 flows. -- **Raw credential**: Set `auth_type=AuthCredentialTypes.OAUTH2` and provide - `client_id`, `client_secret`, and `redirect_uri` in the `oauth2` field. -- **Web UI flow**: The ADK web UI recognizes OAuth2 auth requests and opens - an authorization popup automatically. The user authenticates with the - provider, and the UI sends the full `AuthConfig` response back. No special - handling is needed in the node. -- **Token exchange**: The framework automatically exchanges the authorization - code for an access token via `AuthHandler.exchange_auth_token()`. - -```python -from fastapi.openapi.models import OAuth2, OAuthFlowAuthorizationCode, OAuthFlows - -auth_config = AuthConfig( - auth_scheme=OAuth2( - flows=OAuthFlows( - authorizationCode=OAuthFlowAuthorizationCode( - authorizationUrl='https://provider.com/authorize', - tokenUrl='https://provider.com/token', - scopes={'read': 'Read access'}, - ) - ) - ), - raw_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.OAUTH2, - oauth2=OAuth2Auth( - client_id='YOUR_CLIENT_ID', - client_secret='YOUR_CLIENT_SECRET', - redirect_uri='http://localhost:8000/callback', - ), - ), - credential_key='my_oauth_credential', -) -``` diff --git a/contributing/samples/workflows/auth_api_key/agent.py b/contributing/samples/workflows/auth_api_key/agent.py deleted file mode 100644 index c98dc55ac4..0000000000 --- a/contributing/samples/workflows/auth_api_key/agent.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Auth API Key sample: FunctionNode with API key authentication. - -Demonstrates how to use `auth_config` on a FunctionNode to pause -the workflow and request user credentials before running the node. - -Flow: - 1. User sends any message to start the workflow. - 2. The `fetch_weather` node pauses and requests an API key. - 3. The user provides the API key through the auth UI. - 4. The node runs with the credential available in session state. - 5. The `summarize` node displays the result. -""" - -from fastapi.openapi.models import APIKey -from fastapi.openapi.models import APIKeyIn -from google.adk import Event -from google.adk import Workflow -from google.adk.agents.context import Context -from google.adk.auth.auth_credential import AuthCredential -from google.adk.auth.auth_credential import AuthCredentialTypes -from google.adk.auth.auth_tool import AuthConfig -from google.adk.workflow import node - -# --- Auth configuration --- -# Uses API key auth: the simplest credential type. -# The user will be prompted to provide an API key via the auth UI. -auth_config = AuthConfig( - auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), - raw_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.API_KEY, - api_key='placeholder', - ), - credential_key='weather_api_key', -) - - -@node(auth_config=auth_config, rerun_on_resume=True) -def fetch_weather(ctx: Context): - """Fetches weather data using the authenticated API key.""" - # After auth completes, the credential is available via ctx. - cred = ctx.get_auth_response(auth_config) - api_key = cred.api_key if cred else 'unknown' - - # In a real agent, you would use the api_key to call an external API. - # For this sample, we just echo it back (masked). - masked = api_key[:4] + '****' if len(api_key) > 4 else '****' - return { - 'city': 'San Francisco', - 'temperature': '18C', - 'condition': 'Sunny', - 'api_key_used': masked, - } - - -def summarize(node_input: dict): - """Displays the weather result.""" - yield Event( - message=( - f"Weather for {node_input['city']}:" - f" {node_input['temperature']}, {node_input['condition']}." - f" (Authenticated with key: {node_input['api_key_used']})" - ) - ) - - -root_agent = Workflow( - name='auth_api_key', - edges=[('START', fetch_weather, summarize)], -) diff --git a/contributing/samples/workflows/auth_api_key/tests/go.json b/contributing/samples/workflows/auth_api_key/tests/go.json deleted file mode 100644 index 853bf5ddcd..0000000000 --- a/contributing/samples/workflows/auth_api_key/tests/go.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "appName": "auth_api_key", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "go" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "auth_api_key", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "authConfig": { - "authScheme": { - "in": "header", - "name": "X-Api-Key", - "type": "apiKey" - }, - "credentialKey": "weather_api_key", - "rawAuthCredential": { - "apiKey": "placeholder", - "authType": "apiKey" - } - }, - "functionCallId": "fc-1", - "message": "Please provide your API key for X-Api-Key." - }, - "id": "fc-1", - "name": "adk_request_credential" - } - } - ] - }, - "id": "e-2", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-1" - ], - "nodeInfo": { - "path": "auth_api_key@1/fetch_weather@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "adk_request_credential", - "response": { - "result": "12345678" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "auth_api_key", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "auth_api_key@1/fetch_weather@1" - ], - "path": "auth_api_key@1/fetch_weather@1" - }, - "output": { - "api_key_used": "1234****", - "city": "San Francisco", - "condition": "Sunny", - "temperature": "18C" - } - }, - { - "author": "auth_api_key", - "content": { - "parts": [ - { - "text": "Weather for San Francisco: 18C, Sunny. (Authenticated with key: 1234****)" - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "auth_api_key@1/summarize@1" - } - } - ], - "id": "3bb54ead-8f56-468e-b64f-f0d534a66c69", - "state": { - "__session_metadata__": { - "displayName": "go" - } - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/auth_oauth/README.md b/contributing/samples/workflows/auth_oauth/README.md deleted file mode 100644 index 3f1658b23a..0000000000 --- a/contributing/samples/workflows/auth_oauth/README.md +++ /dev/null @@ -1,112 +0,0 @@ -# GitHub OAuth Authentication Sample - -## Overview - -This sample demonstrates how to use `AuthConfig` with GitHub OAuth2 on a `FunctionNode` in a workflow. It shows how to pause execution to request a GitHub OAuth token from the user and then use that token to list the user's owned repositories via the GitHub API. - -## Prerequisites - -To run this sample and actually log in, you need to: - -1. **Register an OAuth Application on GitHub**: - - Go to your GitHub account settings. - - Navigate to **Developer settings** > **OAuth Apps** > **New OAuth App**. - - Set the **Homepage URL** and **Authorization callback URL** appropriate for your testing environment (e.g., `http://localhost:8000` if running locally). -1. **Get Credentials**: - - Copy the **Client ID** and **Client Secret**. -1. **Configure Environment Variables**: - - Set the following environment variables in your terminal before running the sample: - ```bash - export GITHUB_CLIENT_ID="your_actual_client_id" - export GITHUB_CLIENT_SECRET="your_actual_client_secret" - ``` - - Alternatively, you can create a `.env` file in the sample directory (`contributing/workflow_samples/auth_oauth/.env`) with the following content: - ```env - GITHUB_CLIENT_ID="your_actual_client_id" - GITHUB_CLIENT_SECRET="your_actual_client_secret" - ``` - The ADK CLI automatically loads `.env` files from the agent directory. - -## Sample Inputs - -- `start` - -- `list my repos` - -## Graph - -```mermaid -graph TD - START --> list_github_repos - list_github_repos --> display_result -``` - -## How To - -### 1. Define the AuthConfig for GitHub - -We define an `AuthConfig` that specifies the GitHub OAuth2 endpoints and reads credentials from environment variables. - -```python -auth_config = AuthConfig( - auth_scheme=OAuth2( - flows=OAuthFlows( - authorizationCode=OAuthFlowAuthorizationCode( - authorizationUrl="https://github.com/login/oauth/authorize", - tokenUrl="https://github.com/login/oauth/access_token", - scopes={ - "user": "Read user profile", - "repo": "Access public repositories", - }, - ) - ) - ), - raw_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.OAUTH2, - oauth2=OAuth2Auth( - client_id=os.environ.get("GITHUB_CLIENT_ID", "YOUR_GITHUB_CLIENT_ID"), - client_secret=os.environ.get("GITHUB_CLIENT_SECRET", "YOUR_GITHUB_CLIENT_SECRET"), - ), - ), - credential_key="github_oauth_token", -) -``` - -### 2. Apply to a Node - -We apply the `auth_config` to the `list_github_repos` node. - -```python -@node(auth_config=auth_config, rerun_on_resume=True) -def list_github_repos(ctx: Context): - # ... -``` - -### 3. Call GitHub API - -Inside the node, we retrieve the token and use the `requests` library to call the GitHub API. - -```python - cred = ctx.get_auth_response(auth_config) - access_token = cred.oauth2.access_token if cred and cred.oauth2 else None - - # ... (headers setup) ... - - response = requests.get("https://api.github.com/user/repos", headers=headers) - repos_data = response.json() - repo_names = [repo["name"] for repo in repos_data] -``` - -## Running the Sample - -To run this sample interactively, use the ADK CLI: - -```bash -adk run contributing/workflow_samples/auth_oauth -``` - -Or use the Web UI: - -```bash -adk web contributing/workflow_samples/ -``` diff --git a/contributing/samples/workflows/auth_oauth/__init__.py b/contributing/samples/workflows/auth_oauth/__init__.py deleted file mode 100644 index 4015e47d6e..0000000000 --- a/contributing/samples/workflows/auth_oauth/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from . import agent diff --git a/contributing/samples/workflows/auth_oauth/agent.py b/contributing/samples/workflows/auth_oauth/agent.py deleted file mode 100644 index 25a1955f3d..0000000000 --- a/contributing/samples/workflows/auth_oauth/agent.py +++ /dev/null @@ -1,135 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""OAuth Authentication sample: FunctionNode with GitHub OAuth2 token request. - -Demonstrates how to use `auth_config` with GitHub OAuth2 on a FunctionNode to pause -the workflow, request an OAuth token from the user, and use it to list the user's -GitHub repositories. - -Flow: - 1. User sends any message to start the workflow. - 2. The `list_github_repos` node pauses and requests GitHub OAuth credentials. - 3. The user provides the credentials (after logging in to GitHub). - 4. The node runs, calls the GitHub API to list repos, and returns the list. - 5. The `display_result` node displays the repository names. - -Sample queries: - - "start" - - "list my repos" -""" - -import os - -from fastapi.openapi.models import OAuth2 -from fastapi.openapi.models import OAuthFlowAuthorizationCode -from fastapi.openapi.models import OAuthFlows -from google.adk import Event -from google.adk import Workflow -from google.adk.agents.context import Context -from google.adk.auth.auth_credential import AuthCredential -from google.adk.auth.auth_credential import AuthCredentialTypes -from google.adk.auth.auth_credential import OAuth2Auth -from google.adk.auth.auth_tool import AuthConfig -from google.adk.workflow import node -import requests - -# --- Auth configuration --- -# Uses GitHub OAuth2 authorization code flow. -# To use this sample, you need to register an OAuth application on GitHub -# and get a Client ID and Client Secret. -# Set the GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET environment variables. -auth_config = AuthConfig( - auth_scheme=OAuth2( - flows=OAuthFlows( - authorizationCode=OAuthFlowAuthorizationCode( - authorizationUrl="https://github.com/login/oauth/authorize", - tokenUrl="https://github.com/login/oauth/access_token", - scopes={ - "user": "Read user profile", - "repo": "Access public repositories", - }, - ) - ) - ), - raw_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.OAUTH2, - oauth2=OAuth2Auth( - client_id=os.environ.get( - "GITHUB_CLIENT_ID", "YOUR_GITHUB_CLIENT_ID" - ), - client_secret=os.environ.get( - "GITHUB_CLIENT_SECRET", "YOUR_GITHUB_CLIENT_SECRET" - ), - ), - ), - credential_key="github_oauth_token", -) - - -@node(auth_config=auth_config, rerun_on_resume=True) -def list_github_repos(ctx: Context): - """Fetches GitHub repositories for the authenticated user.""" - # After auth completes, the credential is available via ctx. - cred = ctx.get_auth_response(auth_config) - - access_token = cred.oauth2.access_token if cred and cred.oauth2 else None - - if not access_token: - return {"status": "Error", "message": "No access token found"} - - # GitHub API requires a User-Agent header - headers = { - "Authorization": f"Bearer {access_token}", - "User-Agent": "ADK-Sample-Agent", - "Accept": "application/json", - } - - try: - response = requests.get( - "https://api.github.com/user/repos", headers=headers - ) - response.raise_for_status() - repos_data = response.json() - # Extract repo names - repo_names = [repo["name"] for repo in repos_data] - return { - "status": "Success", - "repos": repo_names, - } - except Exception as e: - return { - "status": "Error", - "message": f"Failed to fetch repos: {e}", - } - - -def display_result(node_input: dict): - """Displays the result of accessing the resource.""" - if node_input["status"] == "Success": - repos_str = ", ".join(node_input["repos"]) - yield Event(message=f"Successfully fetched repositories: {repos_str}") - else: - yield Event( - message=( - "Failed to fetch repositories. Error:" - f" {node_input.get('message', 'Unknown error')}" - ) - ) - - -root_agent = Workflow( - name="auth_oauth", - edges=[("START", list_github_repos, display_result)], -) diff --git a/contributing/samples/workflows/dynamic_fan_out_fan_in/README.md b/contributing/samples/workflows/dynamic_fan_out_fan_in/README.md deleted file mode 100644 index 1486f78f57..0000000000 --- a/contributing/samples/workflows/dynamic_fan_out_fan_in/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# Dynamic Fan-Out / Fan-In with Dynamic Nodes - -## Overview - -This sample demonstrates how to perform **Dynamic Fan-Out and Fan-In** using ADK's dynamic node scheduling (`ctx.run_node()`). - -Unlike static graph-based parallel execution (which requires pre-defined branches), this pattern allows you to determine the number of parallel tasks at runtime based on the input data. - -## Sample Inputs - -- `AI, Cloud Computing, Quantum Computing` - -- `Python, Go, Rust, TypeScript` - -## Graph - -```mermaid -graph TD - START --> Orchestrator - Orchestrator --> Gen_0[Generator Task 0] - Orchestrator --> Gen_1[Generator Task 1] - Orchestrator --> Gen_N[Generator Task N] - Gen_0 --> Aggregator[Orchestrator Fan-In] - Gen_1 --> Aggregator - Gen_N --> Aggregator -``` - -## How To - -Key techniques demonstrated in this sample: - -1. **Dynamic Scheduling**: Using a loop to create tasks via `ctx.run_node()`. -1. **Context Isolation**: Using `sub_branch` in `run_node` to isolate events for each parallel task, preventing context contamination. -1. **`rerun_on_resume=True`**: Required on the orchestrator node to support resumption if any child node interrupts. - -### Code Snippet - -```python - # Fan-out: Schedule a dynamic node for each topic - tasks = [] - for i, topic in enumerate(topics): - tasks.append( - ctx.run_node( - generator, - node_input=topic, - sub_branch=f"branch_{i}" - ) - ) - - # Wait for all tasks to complete - results = await asyncio.gather(*tasks) -``` - -## Pro Tip: Custom `run_id` - -ADK auto-generates numeric IDs (e.g., `@1`), but you can pass a custom `run_id` to improve log readability (e.g., `generator@task_AI`) or map events to business keys. - -**Rules**: - -- **Unique**: Must be unique per node for fresh executions (otherwise returns cached results). -- **Non-Numeric**: Must contain non-numeric characters to avoid collision with auto-generated IDs. diff --git a/contributing/samples/workflows/dynamic_fan_out_fan_in/agent.py b/contributing/samples/workflows/dynamic_fan_out_fan_in/agent.py deleted file mode 100644 index cf49cc5dad..0000000000 --- a/contributing/samples/workflows/dynamic_fan_out_fan_in/agent.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import asyncio - -from google.adk import Agent -from google.adk import Context -from google.adk import Event -from google.adk import Workflow -from google.adk.workflow import node - -# Worker agent to generate a headline for a single topic -generator = Agent( - name="generator", - instruction=( - "Write a catchy one-line headline about the topic provided in the user" - " message." - ), -) - - -@node(rerun_on_resume=True) -async def orchestrator(ctx: Context, node_input: str) -> str: - """Orchestrator node that performs dynamic fan-out and fan-in.""" - # Split input comma-separated string into topics - topics = [t.strip() for t in node_input.split(",") if t.strip()] - yield Event(message=f"Processing {len(topics)} topics in parallel.") - - # Fan-out: Schedule a dynamic node for each topic - tasks = [] - for i, topic in enumerate(topics): - tasks.append( - ctx.run_node( - generator, - node_input=topic, - use_sub_branch=True, - ) - ) - - # Wait for all tasks to complete - results = await asyncio.gather(*tasks) - - # Fan-in: Aggregate results - aggregated = "### Aggregated Headlines\n\n" - aggregated += "| Topic | Headline |\n" - aggregated += "| :--- | :--- |\n" - for topic, headline in zip(topics, results): - aggregated += f"| {topic} | {headline} |\n" - - yield Event(message=aggregated) - - -root_agent = Workflow( - name="dynamic_fan_out_fan_in", - edges=[("START", orchestrator)], -) diff --git a/contributing/samples/workflows/dynamic_nodes/README.md b/contributing/samples/workflows/dynamic_nodes/README.md deleted file mode 100644 index 52452d5d77..0000000000 --- a/contributing/samples/workflows/dynamic_nodes/README.md +++ /dev/null @@ -1,59 +0,0 @@ -# ADK Workflow Dynamic Node Execution Sample - -## Overview - -This sample demonstrates how to use `ctx.run_node` to execute nodes dynamically during workflow execution in **ADK Workflows**. - -In standard workflow execution, the execution path is defined statically by the `edges`. However, there are scenarios where the exact nodes, or the number of times a node runs, cannot be determined until runtime. - -In this sample, we handle the dynamic loop scenario: an `orchestrate` Python node acts as the driver. It uses a `while True:` loop to first execute a `generate_headline` agent to create a headline based on a given topic, and then an `evaluate_headline` agent to grade it. If the grade is `"tech-related"`, the loop returns the headline. If `"unrelated"`, the feedback is passed back into the state, and the loop repeats. - -This is a rewritten version of the standard `loop` sample, achieved without complex graph edge routing (e.g., without conditional routing functions in `edges`), by instead leveraging native Python control flow (`while` loops) combined with asynchronous `ctx.run_node` calls. - -## Sample Inputs - -- `flower` - -- `quantum mechanics` - -- `renewable energy` - -## Graph - -```mermaid -graph TD - START --> orchestrate[orchestrate
PYTHON FUNCTION] - orchestrate -.->|ctx.run_node| generate_headline - generate_headline --> evaluate_headline - evaluate_headline -.-> orchestrate -``` - -## How To - -1. **Enable Resumability**: For a python node to use `ctx.run_node`, it must be declared with `@node(rerun_on_resume=True)`. This tells the engine to pause and possibly re-run the orchestrator if any dynamically scheduled node gets interrupted (e.g., waiting for human-in-the-loop). - - ```python - from google.adk.workflow import node - - @node(rerun_on_resume=True) - async def orchestrate(ctx: Context, node_input: str) -> str: - # ... - ``` - -1. **Run Node from Context**: Inject `ctx: Context` into your python node definition and await `ctx.run_node(node_to_run)`. The return value is the final output of that execution. You can also yield events to update the state within the loop before the next iteration. - - ```python - @node(rerun_on_resume=True) - async def orchestrate(ctx: Context, node_input: str) -> str: - yield Event(state={"topic": node_input}) - - while True: - headline = await ctx.run_node(generate_headline) - feedback = Feedback.model_validate( - await ctx.run_node(evaluate_headline, node_input=headline) - ) - - if feedback.grade == "tech-related": - yield headline - break # or return headline - ``` diff --git a/contributing/samples/workflows/dynamic_nodes/agent.py b/contributing/samples/workflows/dynamic_nodes/agent.py deleted file mode 100644 index 57c2ec1054..0000000000 --- a/contributing/samples/workflows/dynamic_nodes/agent.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import Literal - -from google.adk import Agent -from google.adk import Context -from google.adk import Event -from google.adk import Workflow -from google.adk.workflow import node -from pydantic import BaseModel -from pydantic import Field - - -class Feedback(BaseModel): - grade: Literal["tech-related", "unrelated"] = Field( - description=( - "Decide if the headline is related to technology or software" - " engineering." - ), - ) - feedback: str = Field( - description=( - "If the headline is unrelated to technology, provide feedback on how" - " to make it more tech-focused." - ), - ) - - -generate_headline = Agent( - name="generate_headline", - instruction=""" - Write a headline about the topic "{topic}". - If feedback is provided, take it into account. - The feedback: {feedback?} - """, -) - - -evaluate_headline = Agent( - name="evaluate_headline", - instruction=""" - Grade whether the headline is related to technology or software engineering. - """, - output_schema=Feedback, - output_key="feedback", -) - - -@node(rerun_on_resume=True) -async def orchestrate(ctx: Context, node_input: str) -> str: - yield Event(state={"topic": node_input}) - - while True: - headline = await ctx.run_node(generate_headline) - feedback = Feedback.model_validate( - await ctx.run_node(evaluate_headline, node_input=headline) - ) - if feedback.grade == "tech-related": - yield headline - break - - -root_agent = Workflow( - name="root_agent", - edges=[("START", orchestrate)], -) diff --git a/contributing/samples/workflows/dynamic_nodes/tests/flower.json b/contributing/samples/workflows/dynamic_nodes/tests/flower.json deleted file mode 100644 index 4a62580329..0000000000 --- a/contributing/samples/workflows/dynamic_nodes/tests/flower.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "appName": "dynamic_nodes", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "flower" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "stateDelta": { - "topic": "flower" - } - }, - "author": "root_agent", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/orchestrate@1" - } - }, - { - "author": "generate_headline", - "content": { - "parts": [ - { - "text": "A World of Petals" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/orchestrate@1/generate_headline@1" - ], - "path": "root_agent@1/orchestrate@1/generate_headline@1" - } - }, - { - "actions": { - "stateDelta": { - "feedback": { - "feedback": "This headline sounds like it's about botany, gardening, or a natural theme. To make it more tech-focused, consider incorporating terms like 'AI', 'software', 'virtual reality', 'digital', 'engineering', 'innovation', 'data', or 'development'. For example, 'The AI-Powered World of Digital Petals' or 'Engineering a Virtual Reality of Petals'.", - "grade": "unrelated" - } - } - }, - "author": "evaluate_headline", - "content": { - "parts": [ - { - "text": "{\"grade\": \"unrelated\", \"feedback\": \"This headline sounds like it's about botany, gardening, or a natural theme. To make it more tech-focused, consider incorporating terms like 'AI', 'software', 'virtual reality', 'digital', 'engineering', 'innovation', 'data', or 'development'. For example, 'The AI-Powered World of Digital Petals' or 'Engineering a Virtual Reality of Petals'.\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/orchestrate@1/evaluate_headline@1" - ], - "path": "root_agent@1/orchestrate@1/evaluate_headline@1" - } - }, - { - "author": "generate_headline", - "content": { - "parts": [ - { - "text": "**Digital Petals: Engineering AI-Enhanced Blooms**" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/orchestrate@1/generate_headline@2" - ], - "path": "root_agent@1/orchestrate@1/generate_headline@2" - } - }, - { - "actions": { - "stateDelta": { - "feedback": { - "feedback": "This headline is clearly tech-related, specifically mentioning 'Engineering' and 'AI-Enhanced', which are direct ties to technology and software engineering.", - "grade": "tech-related" - } - } - }, - "author": "evaluate_headline", - "content": { - "parts": [ - { - "text": "{\"grade\": \"tech-related\", \"feedback\": \"This headline is clearly tech-related, specifically mentioning 'Engineering' and 'AI-Enhanced', which are direct ties to technology and software engineering.\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/orchestrate@1/evaluate_headline@2" - ], - "path": "root_agent@1/orchestrate@1/evaluate_headline@2" - } - }, - { - "author": "root_agent", - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/orchestrate@1", - "root_agent@1" - ], - "path": "root_agent@1/orchestrate@1" - }, - "output": "**Digital Petals: Engineering AI-Enhanced Blooms**" - } - ], - "id": "1cf606cf-0c65-4512-96c2-07ccb0181853", - "state": { - "__session_metadata__": { - "displayName": "flower" - }, - "feedback": { - "feedback": "This headline is already very tech-focused, mentioning 'AI-Powered' and 'Smart Technology' in the context of innovation.", - "grade": "tech-related" - }, - "topic": "flower" - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/fan_out_fan_in/README.md b/contributing/samples/workflows/fan_out_fan_in/README.md deleted file mode 100644 index 08cb510c3c..0000000000 --- a/contributing/samples/workflows/fan_out_fan_in/README.md +++ /dev/null @@ -1,59 +0,0 @@ -# ADK Workflow Fan-Out / Fan-In Sample - -## Overview - -This sample demonstrates how to run multiple nodes in parallel and aggregate their results using a **Fan-Out / Fan-In** pattern in **ADK Workflows**. - -It takes an input string and fans out to three different processing functions concurrently: `make_uppercase`, `count_characters`, and `reverse_string`. Instead of independently triggering the downstream node (as seen in the `multi_triggers` sample), this workflow uses a `JoinNode` to wait for all the parallel processes to complete. Once all results are ready, the `JoinNode` packages them into a single dictionary and passes it to an `aggregate` node, which formats the final combined response. - -In ADK Workflows, the `JoinNode` is a critical component for synchronizing parallel execution paths, ensuring that a downstream node only executes once all of its required upstream dependencies have furnished their outputs. - -## Sample Inputs - -- `Hello World` - -- `ADK workflows` - -- `testing concurrent nodes` - -## Graph - -```mermaid -graph TD - START --> make_uppercase - START --> count_characters - START --> reverse_string - make_uppercase --> join_node[join_node
Waits for all 3] - count_characters --> join_node - reverse_string --> join_node - join_node --> aggregate -``` - -## How To - -1. Define a `JoinNode` in your code: - - ```python - from google.adk.workflow import JoinNode - - join_node = JoinNode(name="join_for_results") - ``` - -1. In the `Workflow` edges definition, specify a tuple of nodes to fan out execution, followed by your `join_node` to fan in the results, and finally the node that processes the aggregated output: - - ```python - ( - "START", - (make_uppercase, count_characters, reverse_string), - join_node, - aggregate, - ) - ``` - -1. The node following the `JoinNode` (in this case, `aggregate`) will receive a `dict` as its input. The keys of this dictionary are the names of the upstream nodes, and the values are their respective outputs: - - ```python - async def aggregate(node_input: dict[str, Any]): - uppercase_result = node_input['make_uppercase'] - # ... - ``` diff --git a/contributing/samples/workflows/fan_out_fan_in/agent.py b/contributing/samples/workflows/fan_out_fan_in/agent.py deleted file mode 100644 index 97e46889bb..0000000000 --- a/contributing/samples/workflows/fan_out_fan_in/agent.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import Any - -from google.adk import Event -from google.adk import Workflow -from google.adk.workflow import JoinNode - - -def make_uppercase(node_input: str): - return node_input.upper() - - -def count_characters(node_input: str): - return len(node_input) - - -def reverse_string(node_input: str): - return node_input[::-1] - - -join_node = JoinNode(name="join_for_results") - - -async def aggregate(node_input: dict[str, Any]): - yield Event( - message=( - f"Uppercase: {node_input['make_uppercase']}\n\n" - f"Character Count: {node_input['count_characters']}\n\n" - f"Reversed: {node_input['reverse_string']}\n\n" - ), - ) - - -root_agent = Workflow( - name="root_agent", - edges=[( - "START", - (make_uppercase, count_characters, reverse_string), - join_node, - aggregate, - )], -) diff --git a/contributing/samples/workflows/fan_out_fan_in/tests/go.json b/contributing/samples/workflows/fan_out_fan_in/tests/go.json deleted file mode 100644 index 96f6383c4e..0000000000 --- a/contributing/samples/workflows/fan_out_fan_in/tests/go.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "appName": "fan_out_fan_in", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "go" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "branch": "make_uppercase@1", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/make_uppercase@1" - ], - "path": "root_agent@1/make_uppercase@1" - }, - "output": "GO" - }, - { - "author": "root_agent", - "branch": "count_characters@1", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/count_characters@1" - ], - "path": "root_agent@1/count_characters@1" - }, - "output": 2 - }, - { - "author": "root_agent", - "branch": "reverse_string@1", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/reverse_string@1" - ], - "path": "root_agent@1/reverse_string@1" - }, - "output": "og" - }, - { - "author": "root_agent", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/join_for_results@1" - ], - "path": "root_agent@1/join_for_results@1" - }, - "output": { - "count_characters": 2, - "make_uppercase": "GO", - "reverse_string": "og" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Uppercase: GO\n\nCharacter Count: 2\n\nReversed: og\n\n" - } - ], - "role": "user" - }, - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/aggregate@1" - } - } - ], - "id": "de416178-357c-4f4c-bf32-ff19e39f33db", - "state": { - "__session_metadata__": { - "displayName": "go" - } - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/loop/README.md b/contributing/samples/workflows/loop/README.md deleted file mode 100644 index 67021bd536..0000000000 --- a/contributing/samples/workflows/loop/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# ADK Workflow Loop Sample - -## Overview - -This sample demonstrates how to create a feedback loop between different nodes in **ADK Workflows**. - -It takes a user-provided topic and uses the `generate_headline` agent to write a headline. The `evaluate_headline` agent then grades the headline as either "tech-related" or "unrelated", providing feedback if it's unrelated. The `route_headline` function checks this grade. If the headline is "unrelated", the workflow loops back to the `generate_headline` agent, passing the feedback so it can try again. This process repeats until a "tech-related" headline is generated. - -In ADK Workflows, loops allow for iterative refinement and evaluation by conditionally routing execution back to an earlier node in the sequence. - -## Sample Inputs - -- `flower` - -- `quantum mechanics` - -- `renewable energy` - -## Graph - -```mermaid -graph TD - START --> process_input - process_input --> generate_headline - generate_headline --> evaluate_headline - evaluate_headline --> route_headline - route_headline -->|unrelated| generate_headline - route_headline -->|tech-related| END[Loop ends] -``` - -## How To - -1. Define a node (like `route_headline`) that yields an `Event` with a specific route based on a condition: - - ```python - def route_headline(node_input: Feedback): - return Event(route=node_input.grade) - ``` - -1. In the `Workflow` edges definition, create a conditional edge that connects the routing node back to a previous node in the workflow, using a routing map dict: - - ```python - (route_headline, {"unrelated": generate_headline}) - ``` - - This creates the cycle. If the route yielded by `route_headline` is "unrelated", execution jumps back to `generate_headline`. diff --git a/contributing/samples/workflows/loop/agent.py b/contributing/samples/workflows/loop/agent.py deleted file mode 100644 index 3b8ee65d76..0000000000 --- a/contributing/samples/workflows/loop/agent.py +++ /dev/null @@ -1,80 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import Literal - -from google.adk import Agent -from google.adk import Event -from google.adk import Workflow -from pydantic import BaseModel -from pydantic import Field - - -class Feedback(BaseModel): - grade: Literal["tech-related", "unrelated"] = Field( - description=( - "Decide if the headline is related to technology or software" - " engineering." - ), - ) - feedback: str = Field( - description=( - "If the headline is unrelated to technology, provide feedback on how" - " to make it more tech-focused." - ), - ) - - -def process_input(node_input: str): - """Puts user input in the state.""" - return Event(state={"topic": node_input}) - - -generate_headline = Agent( - name="generate_headline", - instruction=""" - Write a headline about the topic "{topic}". - If feedback is provided, take it into account. - The feedback: {feedback?} - """, -) - - -evaluate_headline = Agent( - name="evaluate_headline", - instruction=""" - Grade whether the headline is related to technology or software engineering. - """, - output_schema=Feedback, - output_key="feedback", -) - - -def route_headline(node_input: Feedback): - return Event(route=node_input.grade) - - -root_agent = Workflow( - name="root_agent", - edges=[ - ( - "START", - process_input, - generate_headline, - evaluate_headline, - route_headline, - ), - (route_headline, {"unrelated": generate_headline}), - ], -) diff --git a/contributing/samples/workflows/loop/tests/computer.json b/contributing/samples/workflows/loop/tests/computer.json deleted file mode 100644 index 8b6ae12999..0000000000 --- a/contributing/samples/workflows/loop/tests/computer.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "computer" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "stateDelta": { - "topic": "computer" - } - }, - "author": "root_agent", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/process_input@1" - } - }, - { - "author": "generate_headline", - "content": { - "parts": [ - { - "text": "Computers: Shaping Our World" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/generate_headline@1" - ], - "path": "root_agent@1/generate_headline@1" - } - }, - { - "actions": { - "stateDelta": { - "feedback": { - "feedback": "This headline is clearly tech-related as it directly discusses computers.", - "grade": "tech-related" - } - } - }, - "author": "evaluate_headline", - "content": { - "parts": [ - { - "text": "{\"grade\": \"tech-related\", \"feedback\": \"This headline is clearly tech-related as it directly discusses computers.\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/evaluate_headline@1" - ], - "path": "root_agent@1/evaluate_headline@1" - } - }, - { - "actions": { - "route": "tech-related" - }, - "author": "root_agent", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/route_headline@1" - } - } - ] -} diff --git a/contributing/samples/workflows/loop/tests/flower.json b/contributing/samples/workflows/loop/tests/flower.json deleted file mode 100644 index 26b42c8130..0000000000 --- a/contributing/samples/workflows/loop/tests/flower.json +++ /dev/null @@ -1,168 +0,0 @@ -{ - "appName": "loop", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "flower" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "stateDelta": { - "topic": "flower" - } - }, - "author": "root_agent", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/process_input@1" - } - }, - { - "author": "generate_headline", - "content": { - "parts": [ - { - "text": "\"Petal Power: The Timeless Allure of Flowers\"" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/generate_headline@1" - ], - "path": "root_agent@1/generate_headline@1" - } - }, - { - "actions": { - "stateDelta": { - "feedback": { - "feedback": "To make this headline more tech-focused, consider incorporating elements like AI for plant recognition, robotics in gardening, biotechnology in horticulture, or data analytics related to flower cultivation and sales. For example, 'AI-Driven Botany: The Tech Unlocking Petal Power' or 'Smart Gardens: Engineering the Timeless Allure of Flowers'.", - "grade": "unrelated" - } - } - }, - "author": "evaluate_headline", - "content": { - "parts": [ - { - "text": "{\"grade\": \"unrelated\", \"feedback\": \"To make this headline more tech-focused, consider incorporating elements like AI for plant recognition, robotics in gardening, biotechnology in horticulture, or data analytics related to flower cultivation and sales. For example, 'AI-Driven Botany: The Tech Unlocking Petal Power' or 'Smart Gardens: Engineering the Timeless Allure of Flowers'.\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/evaluate_headline@1" - ], - "path": "root_agent@1/evaluate_headline@1" - } - }, - { - "actions": { - "route": "unrelated" - }, - "author": "root_agent", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/route_headline@1" - } - }, - { - "author": "generate_headline", - "content": { - "parts": [ - { - "text": "AI-Powered Petals: The Tech Revolution Blooming in Modern Floriculture" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/generate_headline@2" - ], - "path": "root_agent@1/generate_headline@2" - } - }, - { - "actions": { - "stateDelta": { - "feedback": { - "feedback": "This headline is strongly tech-related, explicitly mentioning 'AI-Powered' and 'Tech Revolution'. It effectively combines a traditional field (floriculture) with advanced technology.", - "grade": "tech-related" - } - } - }, - "author": "evaluate_headline", - "content": { - "parts": [ - { - "text": "{\"grade\": \"tech-related\", \"feedback\": \"This headline is strongly tech-related, explicitly mentioning 'AI-Powered' and 'Tech Revolution'. It effectively combines a traditional field (floriculture) with advanced technology.\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/evaluate_headline@2" - ], - "path": "root_agent@1/evaluate_headline@2" - } - }, - { - "actions": { - "route": "tech-related" - }, - "author": "root_agent", - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/route_headline@2" - } - } - ], - "id": "2779014d-3ee3-429e-951d-e69756ddf789", - "state": { - "__session_metadata__": { - "displayName": "flower" - }, - "feedback": { - "feedback": "This headline is already strongly tech-focused due to the explicit mention of AI and 'Tech Revolution'.", - "grade": "tech-related" - }, - "topic": "flower" - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/loop_config/README.md b/contributing/samples/workflows/loop_config/README.md deleted file mode 100644 index eb030705c4..0000000000 --- a/contributing/samples/workflows/loop_config/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# Workflow Loop Config Sample - -## Overview - -This sample demonstrates how to define a workflow with a feedback loop using a YAML configuration file. It mirrors the `workflow_samples/loop` sample, but uses YAML to define the workflow structure instead of Python. - -## Sample Inputs - -- `Python programming` - -- `Baking cookies` - -## Graph - -```mermaid -graph TD - START --> process_input[process_input] - process_input --> generate_headline[generate_headline.yaml] - generate_headline --> evaluate_headline[evaluate_headline.yaml] - evaluate_headline --> route_headline[route_headline] - route_headline -->|unrelated| generate_headline -``` - -## How To - -This sample uses some special syntax in `root_agent.yaml` to support dynamic resolution and graph construction: - -### 1. `_code` Suffix - -Fields ending with `_code` (like `output_schema_code` in `evaluate_headline.yaml`) tell the ADK YAML mapper to resolve the value as a Python code reference rather than treating it as a plain string. - -- If it starts with `.`, it resolves relative to the current agent directory's Python package path. -- Example: `output_schema_code: .agent.Feedback` resolves to the `Feedback` Pydantic model in `agent.py` in the same directory. - -### 2. Function References in Edges - -If a string in the edge list does not end with `.yaml` and is not `'START'`, it is treated as a function reference. - -- If it starts with `.`, it resolves relative to the current agent directory's Python package path. -- Example: `.agent.process_input` resolves to the `process_input` function in `agent.py`. -- It automatically creates a `FunctionNode` with the function's name as the node name. - -### 3. External Agent Files - -Agents can be defined in their own YAML files and referenced by filename in the edges list. - -- Example: `generate_headline.yaml` references the agent defined in that file. -- The mapper caches resolved nodes by their string value, so using the same filename in multiple edges correctly reuses the same agent instance, preserving the graph structure (e.g. for loops). diff --git a/contributing/samples/workflows/loop_config/agent.py b/contributing/samples/workflows/loop_config/agent.py deleted file mode 100644 index 4b13e5c254..0000000000 --- a/contributing/samples/workflows/loop_config/agent.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import Literal - -from google.adk import Event -from pydantic import BaseModel -from pydantic import Field - - -class Feedback(BaseModel): - grade: Literal["tech-related", "unrelated"] = Field( - description=( - "Decide if the headline is related to technology or software" - " engineering." - ) - ) - feedback: str = Field( - description=( - "If the headline is unrelated to technology, provide feedback on how" - " to make it more tech-focused." - ) - ) - - -def process_input(node_input: str): - """Puts user input in the state.""" - return Event(state={"topic": node_input}) - - -def route_headline(node_input: Feedback): - return Event(route=node_input.grade) diff --git a/contributing/samples/workflows/loop_config/evaluate_headline.yaml b/contributing/samples/workflows/loop_config/evaluate_headline.yaml deleted file mode 100644 index e45ef95d2a..0000000000 --- a/contributing/samples/workflows/loop_config/evaluate_headline.yaml +++ /dev/null @@ -1,6 +0,0 @@ -agent_class: LlmAgent -name: evaluate_headline -instruction: | - Grade whether the headline is related to technology or software engineering. -output_schema_code: .agent.Feedback -output_key: feedback diff --git a/contributing/samples/workflows/loop_config/generate_headline.yaml b/contributing/samples/workflows/loop_config/generate_headline.yaml deleted file mode 100644 index 9d62519de5..0000000000 --- a/contributing/samples/workflows/loop_config/generate_headline.yaml +++ /dev/null @@ -1,6 +0,0 @@ -agent_class: LlmAgent -name: generate_headline -instruction: | - Write a headline about the topic "{topic}". - If feedback is provided, take it into account. - The feedback: {feedback?} diff --git a/contributing/samples/workflows/loop_config/root_agent.yaml b/contributing/samples/workflows/loop_config/root_agent.yaml deleted file mode 100644 index 4b1a1f5bd7..0000000000 --- a/contributing/samples/workflows/loop_config/root_agent.yaml +++ /dev/null @@ -1,10 +0,0 @@ -agent_class: Workflow -name: loop_workflow -edges: - - - START - - .agent.process_input - - generate_headline.yaml - - evaluate_headline.yaml - - .agent.route_headline - - - .agent.route_headline - - unrelated: generate_headline.yaml diff --git a/contributing/samples/workflows/loop_self/README.md b/contributing/samples/workflows/loop_self/README.md deleted file mode 100644 index 0601cafa60..0000000000 --- a/contributing/samples/workflows/loop_self/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# ADK Workflow Loop Self Sample - -## Overview - -This sample demonstrates how a node can repeatedly loop back to itself based on a specific route condition in **ADK Workflows**. - -It takes a user-provided target number (between 0 and 10), and uses a `guess_number` function to randomly generate guesses. If the guess is incorrect, the function yields a specific route (`guessed_wrong`). The workflow is configured such that this route directs the execution right back to the `guess_number` node, creating a loop that continues until the correct number is guessed. - -In ADK Workflows, you can create self-referential loops or iterative processes by routing a node's output back to itself. - -## Sample Inputs - -- `5` - -- `0` - -- `10` - -## Graph - -```mermaid -graph TD - START --> validate_input - validate_input --> guess_number - guess_number -->|guessed_wrong| guess_number - guess_number -->|correct| END[Loop ends] -``` - -## How To - -1. From within your node (agent or function), yield a specific `Event` with a route name when you determine the node needs to be executed again: - - ```python - def guess_number(target_number: int): - # ... - if guess != target_number: - yield Event(route='guessed_wrong') - ``` - -1. In the `Workflow` edges definition, create a conditional edge where the source and target are the same node, using a routing map dict: - - ```python - (guess_number, {'guessed_wrong': guess_number}) - ``` diff --git a/contributing/samples/workflows/loop_self/agent.py b/contributing/samples/workflows/loop_self/agent.py deleted file mode 100644 index bc128aabeb..0000000000 --- a/contributing/samples/workflows/loop_self/agent.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import random - -from google.adk import Event -from google.adk import Workflow - - -def validate_input(node_input: str): - parsed_number = int(node_input) - if parsed_number > 10 or parsed_number < 0: - yield Event(message='Please provide a number between 0 and 10.') - raise ValueError('Invalid input.') - else: - yield Event(state={'target_number': parsed_number}) - - -def guess_number(target_number: int): - guess = random.randint(0, 10) - yield Event(message=f'Guessing {guess}...') - if guess == target_number: - yield Event(message='Correct!') - else: - yield Event(route='guessed_wrong') - - -root_agent = Workflow( - name='root_agent', - edges=[ - ('START', validate_input, guess_number), - (guess_number, {'guessed_wrong': guess_number}), - ], -) diff --git a/contributing/samples/workflows/loop_self/tests/3.json b/contributing/samples/workflows/loop_self/tests/3.json deleted file mode 100644 index 0405447528..0000000000 --- a/contributing/samples/workflows/loop_self/tests/3.json +++ /dev/null @@ -1,191 +0,0 @@ -{ - "appName": "loop_self", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "3" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "stateDelta": { - "target_number": 3 - } - }, - "author": "root_agent", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/validate_input@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Guessing 10..." - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/guess_number@1" - } - }, - { - "actions": { - "route": "guessed_wrong" - }, - "author": "root_agent", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/guess_number@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Guessing 1..." - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/guess_number@2" - } - }, - { - "actions": { - "route": "guessed_wrong" - }, - "author": "root_agent", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/guess_number@2" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Guessing 0..." - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/guess_number@3" - } - }, - { - "actions": { - "route": "guessed_wrong" - }, - "author": "root_agent", - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/guess_number@3" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Guessing 4..." - } - ], - "role": "user" - }, - "id": "e-9", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/guess_number@4" - } - }, - { - "actions": { - "route": "guessed_wrong" - }, - "author": "root_agent", - "id": "e-10", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/guess_number@4" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Guessing 3..." - } - ], - "role": "user" - }, - "id": "e-11", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/guess_number@5" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Correct!" - } - ], - "role": "user" - }, - "id": "e-12", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/guess_number@5" - } - } - ], - "id": "1f627a81-1341-43b7-b971-c8809ff8f6d1", - "mocks": { - "random.randint": [ - 10, - 1, - 0, - 4, - 3 - ] - }, - "state": { - "__session_metadata__": { - "displayName": "3" - }, - "target_number": 3 - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/message/README.md b/contributing/samples/workflows/message/README.md deleted file mode 100644 index 6cd15eb0c4..0000000000 --- a/contributing/samples/workflows/message/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# ADK Workflow Message Sample - -## Overview - -This sample demonstrates different ways to send a message to a user using `Event(message=...)` within an **ADK Workflows** node. It covers: - -1. **String Messages**: Standard string text replies. -1. **Multi-modal Messages**: Returning mixed modality inputs, such as a string combined with an inline image. -1. **Multiple Messages**: Emitting multiple full messages from the same node with a delay between them. -1. **Streaming Messages**: Simulating an LLM streaming response by breaking a message into chunks and yielding them with the `partial=True` flag at intervals. - -## Sample Inputs - -This workflow executes sequentially and successfully without any expected user input. Since it has only one `Workflow` node chain that automatically progresses from `START`, you can just type anything (e.g. `start`) to kick it off. - -## Graph - -```mermaid -graph TD - START --> send_string - send_string --> send_multimodal - send_multimodal --> multiple_messages - multiple_messages --> stream_sentence - stream_sentence --> END[Workflow Ends] -``` - -## How To - -To send messages in an ADK node, yield an `Event` object with the `message` argument: - -1. **Send a simple string**: - - ```python - yield Event(message="Hello world!") - ``` - -1. **Send text with an image** (multi-modal): - - ```python - from google.genai import types - yield Event( - message=[ - types.Part.from_text(text="Look at this image:"), - types.Part.from_bytes(data=image_bytes, mime_type="image/png"), - ] - ) - ``` - -1. **Send multiple messages**: - To send multiple distinct messages from a single node, yield multiple `Event` objects sequentially. - - > **Note**: When yielding multiple messages with delays (`await asyncio.sleep(...)`), your node function **must be an asynchronous generator** (`async def`). This allows ADK to yield each message to the client immediately without blocking. - - ```python - import asyncio - - async def multiple_messages(node_input: Any = None): - yield Event(message="Processing step 1...") - await asyncio.sleep(1.0) - - yield Event(message="Processing step 2...") - await asyncio.sleep(1.0) - - yield Event(message="Done processing.") - ``` - -1. **Stream a message in chunks**: - Provide the `partial=True` flag for intermediate chunks. This provides a better user experience by allowing the UI to show the response in a streaming fashion, thereby lowering the latency to see the first word. ADK automatically accumulates all partial messages and merges them into a final message for you for session storage. - - > **Note**: To stream multiple messages or tokens smoothly, your node function **must be an asynchronous generator** (`async def`). This allows ADK to yield messages to the client immediately without blocking. - - ```python - import asyncio - - async def stream_sentence(node_input: str): - yield Event(message="How ", partial=True) - await asyncio.sleep(0.5) - yield Event(message="may I", partial=True) - await asyncio.sleep(0.5) - yield Event(message=" help you?", partial=True) - ``` diff --git a/contributing/samples/workflows/message/agent.py b/contributing/samples/workflows/message/agent.py deleted file mode 100644 index c62c691688..0000000000 --- a/contributing/samples/workflows/message/agent.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import asyncio -import base64 -import os -from typing import Any - -from google.adk import Event -from google.adk import Workflow -from google.genai import types - - -async def sleep_if_not_pytest(seconds: float): - if "PYTEST_CURRENT_TEST" not in os.environ: - await asyncio.sleep(seconds) - - -def send_string(node_input: Any = None): - """Sends a single string message.""" - yield Event(message="#1 This is a simple string message.") - - -def send_multimodal(node_input: Any = None): - """Sends a multi-modal message containing a string and an inline image.""" - # A 16x16 solid red PNG base64 encoded - red_square_png = base64.b64decode( - "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAXElEQVR4nO2TSQ7AIAwD" - "7fz/z+ZQtapwmrJc8QklmjBIgZJgIZMiAIl9KYbhjx4fgwosbNxgMrF0+4uhgHnYDM6" - "AzQHJeg5HYtyHFfgy2AztN/5tZWfrBtVzkl4DzfQkEPd+cEkAAAAASUVORK5CYII=" - ) - yield Event( - message=[ - types.Part.from_text( - text=( - "#2 Here is a multi-modal message with an inline image (red" - " circle):" - ) - ), - types.Part.from_bytes(data=red_square_png, mime_type="image/png"), - ] - ) - - -async def multiple_messages(node_input: Any = None): - """Sends multiple complete messages from the same node with an interval.""" - yield Event(message="#3 Multiple messages") - await sleep_if_not_pytest(1.0) - - yield Event(message="Processing step 1...") - await sleep_if_not_pytest(1.0) - - yield Event(message="Processing step 2...") - await sleep_if_not_pytest(1.0) - - yield Event(message="Done processing.") - - -async def stream_sentence(node_input: Any = None): - """ - Demonstrates streaming by sending a sentence in chunks. - The `partial=True` flag tells the UI that this is part of an ongoing message. - """ - yield Event(message="#4 Starting to stream...") - sentence = """\ -This is a streaming message sent in chunks. - -You can stream in markdown as well. For example, the table below: - -| Header 1 | Header 2 | -|----------|----------| -| Cell 1 | Cell 2 | -| Cell 3 | Cell 4 | -""" - - for i in range(0, len(sentence), 5): - chunk = sentence[i : i + 5] - yield Event(message=chunk, partial=True) - await sleep_if_not_pytest(0.2) - - -root_agent = Workflow( - name="message", - edges=[ - ( - "START", - send_string, - send_multimodal, - multiple_messages, - stream_sentence, - ), - ], -) diff --git a/contributing/samples/workflows/message/tests/go.json b/contributing/samples/workflows/message/tests/go.json deleted file mode 100644 index 694a997855..0000000000 --- a/contributing/samples/workflows/message/tests/go.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "appName": "message", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "go" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "message", - "content": { - "parts": [ - { - "text": "#1 This is a simple string message." - } - ], - "role": "user" - }, - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "message@1/send_string@1" - } - }, - { - "author": "message", - "content": { - "parts": [ - { - "text": "#2 Here is a multi-modal message with an inline image (red circle):" - }, - { - "inlineData": { - "data": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8_9hAAAAXElEQVR4nO2TSQ7AIAwD7fz_z-ZQtapwmrJc8QklmjBIgZJgIZMiAIl9KYbhjx4fgwosbNxgMrF0-4uhgHnYDM6AzQHJeg5HYtyHFfgy2AztN_5tZWfrBtVzkl4DzfQkEPd-cEkAAAAASUVORK5CYII=", - "mimeType": "image/png" - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "message@1/send_multimodal@1" - } - }, - { - "author": "message", - "content": { - "parts": [ - { - "text": "#3 Multiple messages" - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "message@1/multiple_messages@1" - } - }, - { - "author": "message", - "content": { - "parts": [ - { - "text": "Processing step 1..." - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "message@1/multiple_messages@1" - } - }, - { - "author": "message", - "content": { - "parts": [ - { - "text": "Processing step 2..." - } - ], - "role": "user" - }, - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "message@1/multiple_messages@1" - } - }, - { - "author": "message", - "content": { - "parts": [ - { - "text": "Done processing." - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "message@1/multiple_messages@1" - } - }, - { - "author": "message", - "content": { - "parts": [ - { - "text": "#4 Starting to stream..." - } - ], - "role": "user" - }, - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "path": "message@1/stream_sentence@1" - } - } - ], - "id": "9cfc0ef6-11d6-4260-84cf-be22731ab69e", - "state": { - "__session_metadata__": { - "displayName": "go" - } - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/multi_triggers/README.md b/contributing/samples/workflows/multi_triggers/README.md deleted file mode 100644 index 7f2f7ea122..0000000000 --- a/contributing/samples/workflows/multi_triggers/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# ADK Workflow Multi-Triggers Sample - -## Overview - -This sample demonstrates how a single node can fan out to execute multiple downstream nodes concurrently, and how multiple upstream nodes can trigger a single downstream node independently in **ADK Workflows**. - -In this example, the `START` node fans out to three different processing functions (`make_uppercase`, `count_characters`, and `reverse_string`). Each of these functions receives the initial user input string, processes it, and then independently outputs its result. - -Because the subsequent `send_message` node receives a continuous flow of outputs and does not use an aggregation mechanism (like `JoinNode`), it is triggered multiple times—once for every upstream event. - -## Sample Inputs - -- `Hello World` - -- `ADK workflows` - -- `testing concurrent nodes` - -## Graph - -```mermaid -graph TD - START --> make_uppercase - START --> count_characters - START --> reverse_string - make_uppercase --> send_message - count_characters --> send_message - reverse_string --> send_message -``` - -## How To - -1. You can specify a tuple of nodes within an edge to create a parallel fan-out segment where the same input is provided to multiple nodes: - - ```python - ( - "START", - (make_uppercase, count_characters, reverse_string), - # ... - ) - ``` - -1. By continuing the sequence to another node after the tuple, the outputs of all nodes in the tuple will independently trigger that target node: - - ```python - ( - "START", - (make_uppercase, count_characters, reverse_string), - send_message, - ) - ``` - - In this case, `send_message` will be executed once for `make_uppercase`'s output, once for `count_characters`'s output, and once for `reverse_string`'s output. diff --git a/contributing/samples/workflows/multi_triggers/agent.py b/contributing/samples/workflows/multi_triggers/agent.py deleted file mode 100644 index 0fd555a02a..0000000000 --- a/contributing/samples/workflows/multi_triggers/agent.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import Any - -from google.adk import Event -from google.adk import Workflow - - -def make_uppercase(node_input: str): - return node_input.upper() - - -def count_characters(node_input: str): - return len(node_input) - - -def reverse_string(node_input: str): - return node_input[::-1] - - -async def send_message(node_input: Any): - yield Event(message=f"Triggered for input: {node_input}") - - -root_agent = Workflow( - name="root_agent", - edges=[( - "START", - (make_uppercase, count_characters, reverse_string), - send_message, - )], - input_schema=str, -) diff --git a/contributing/samples/workflows/multi_triggers/tests/go.json b/contributing/samples/workflows/multi_triggers/tests/go.json deleted file mode 100644 index 9d7e22cb1c..0000000000 --- a/contributing/samples/workflows/multi_triggers/tests/go.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "appName": "multi_triggers", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "go" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "branch": "make_uppercase@1", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/make_uppercase@1" - ], - "path": "root_agent@1/make_uppercase@1" - }, - "output": "GO" - }, - { - "author": "root_agent", - "branch": "count_characters@1", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/count_characters@1" - ], - "path": "root_agent@1/count_characters@1" - }, - "output": 2 - }, - { - "author": "root_agent", - "branch": "reverse_string@1", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/reverse_string@1" - ], - "path": "root_agent@1/reverse_string@1" - }, - "output": "og" - }, - { - "author": "root_agent", - "branch": "make_uppercase@1", - "content": { - "parts": [ - { - "text": "Triggered for input: GO" - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/send_message@1" - } - }, - { - "author": "root_agent", - "branch": "count_characters@1", - "content": { - "parts": [ - { - "text": "Triggered for input: 2" - } - ], - "role": "user" - }, - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/send_message@2" - } - }, - { - "author": "root_agent", - "branch": "reverse_string@1", - "content": { - "parts": [ - { - "text": "Triggered for input: og" - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/send_message@3" - } - } - ], - "id": "5cf6403e-fd4e-4fef-ad66-8ae78d26ba29", - "state": { - "__session_metadata__": { - "displayName": "go" - } - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/nested_workflow/README.md b/contributing/samples/workflows/nested_workflow/README.md deleted file mode 100644 index d6e6a5d993..0000000000 --- a/contributing/samples/workflows/nested_workflow/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# ADK Workflow Nested Workflow Sample - -## Overview - -This sample demonstrates how to compose workflows by embedding one workflow inside another as a single node in **ADK Workflows**. - -It takes a 4-digit year as input and performs two tasks in parallel: - -1. **Historical Event (`find_historical_event`)**: A straightforward Agent node that generates a 2-sentence description of an event that happened that year. -1. **Famous Person (`find_famous_person`)**: A nested Workflow that first finds a person born in that year (`find_name`), and then forwards that name to another agent to write a biography (`generate_bio`). - -From the perspective of the `root_agent` workflow, `find_famous_person` is just another node. The root workflow doesn't need to know the internal steps; it just waits for the parallel branches to finish, then synchronizes their outputs using a `JoinNode` before formatting them in `aggregate_results`. - -## Sample Inputs - -- `1969` - -- `2000` - -- `1984` - -## Graph - -### Root Workflow (`root_agent`) - -```mermaid -graph TD - START --> process_input - process_input --> find_historical_event[find_historical_event
AGENT] - process_input --> find_famous_person[find_famous_person
WORKFLOW] - find_historical_event --> join_for_aggregation[join_for_aggregation
JOIN] - find_famous_person --> join_for_aggregation - join_for_aggregation --> aggregate_results -``` - -### Nested Workflow (`find_famous_person`) - -```mermaid -graph TD - START --> find_name - find_name --> generate_bio -``` - -## How To - -1. Define your sub-workflow just like any regular workflow. Ensure it accepts the required state (e.g., `year`) and outputs the expected state (e.g., `person_bio`). - - ```python - find_famous_person = Workflow( - name="find_famous_person", - edges=[("START", find_name, generate_bio)], - ) - ``` - -1. Treat the sub-workflow as a normal node when defining the edges of the parent workflow. To run them concurrently, place the nodes in a tuple, then use a `JoinNode` to synchronize their parallel executions before the final aggregation. - - ```python - root_agent = Workflow( - name="root_agent", - edges=[ - ("START", process_input, (find_famous_person, find_historical_event), join_for_aggregation, aggregate_results), - ], - ) - ``` diff --git a/contributing/samples/workflows/nested_workflow/__init__.py b/contributing/samples/workflows/nested_workflow/__init__.py deleted file mode 100644 index 4015e47d6e..0000000000 --- a/contributing/samples/workflows/nested_workflow/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from . import agent diff --git a/contributing/samples/workflows/nested_workflow/agent.py b/contributing/samples/workflows/nested_workflow/agent.py deleted file mode 100644 index 217ef65735..0000000000 --- a/contributing/samples/workflows/nested_workflow/agent.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# NOT WORKING YET - -import re - -from google.adk import Agent -from google.adk import Event -from google.adk import Workflow -from google.adk.workflow import JoinNode - - -def process_input(node_input: str): - """Validates the input is a valid 4-digit year.""" - match = re.search(r"\b\d{4}\b", node_input) - if not match: - yield Event(message="Please provide a valid 4-digit year (e.g., 1955).") - raise ValueError("Invalid year format.") - - yield Event(state={"year": match.group(0)}) - - -find_name = Agent( - name="find_name", - instruction=""" - Find the name of one famous person who was born in this year: {year}. - Return ONLY their name, nothing else. - """, -) - - -generate_bio = Agent( - name="generate_bio", - instruction=""" - Write a short, engaging 3-sentence biography for the specified person. - """, -) - - -# Sub-workflow that acts as a single node in the parent workflow -find_famous_person = Workflow( - name="find_famous_person", - edges=[("START", find_name, generate_bio)], -) - - -find_historical_event = Agent( - name="find_historical_event", - instruction=""" - Describe one highly significant historical event that occurred in this year: {year}. - Keep the description to 2 sentences. - """, -) - -join_for_aggregation = JoinNode(name="join_for_aggregation") - - -def aggregate_results(node_input: dict[str, str], year: str): - """Combines outputs from parallel branches found in context state.""" - - combined_message = ( - f"# Year: {year}\n\n" - "## Famous Person Bio:\n\n" - f"{node_input['find_famous_person']}\n\n" - "## Historical Event:\n\n" - f"{node_input['find_historical_event']}" - ) - yield Event(message=combined_message) - - -root_agent = Workflow( - name="root_agent", - edges=[ - ( - "START", - process_input, - (find_famous_person, find_historical_event), - join_for_aggregation, - aggregate_results, - ), - ], -) diff --git a/contributing/samples/workflows/nested_workflow/tests/1984.json b/contributing/samples/workflows/nested_workflow/tests/1984.json deleted file mode 100644 index 740c526609..0000000000 --- a/contributing/samples/workflows/nested_workflow/tests/1984.json +++ /dev/null @@ -1,139 +0,0 @@ -{ - "appName": "nested_workflow", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "1984" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "stateDelta": { - "year": "1984" - } - }, - "author": "root_agent", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/process_input@1" - } - }, - { - "author": "find_name", - "branch": "find_famous_person@1", - "content": { - "parts": [ - { - "text": "Scarlett Johansson" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/find_famous_person@1/find_name@1" - ], - "path": "root_agent@1/find_famous_person@1/find_name@1" - } - }, - { - "author": "generate_bio", - "branch": "find_famous_person@1", - "content": { - "parts": [ - { - "text": "Scarlett Johansson is an acclaimed actress renowned for her distinctive voice and versatile performances across a wide range of genres. From her captivating early roles in films like \"Lost in Translation\" to her iconic portrayal of Black Widow in the Marvel Cinematic Universe, she has consistently delivered powerful performances. A four-time Golden Globe nominee and two-time Academy Award nominee, she remains one of Hollywood's most bankable and respected stars." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/find_famous_person@1/generate_bio@1", - "root_agent@1/find_famous_person@1" - ], - "path": "root_agent@1/find_famous_person@1/generate_bio@1" - } - }, - { - "author": "find_historical_event", - "branch": "find_historical_event@1", - "content": { - "parts": [ - { - "text": "In December 1984, the Union Carbide chemical plant in Bhopal, India, experienced a catastrophic gas leak, releasing deadly methyl isocyanate. This disaster killed thousands instantly and caused hundreds of thousands of injuries, becoming one of the world's worst industrial accidents and a lasting symbol of corporate negligence." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/find_historical_event@1" - ], - "path": "root_agent@1/find_historical_event@1" - } - }, - { - "author": "root_agent", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/join_for_aggregation@1" - ], - "path": "root_agent@1/join_for_aggregation@1" - }, - "output": { - "find_famous_person": "Scarlett Johansson is an acclaimed actress renowned for her distinctive voice and versatile performances across a wide range of genres. From her captivating early roles in films like \"Lost in Translation\" to her iconic portrayal of Black Widow in the Marvel Cinematic Universe, she has consistently delivered powerful performances. A four-time Golden Globe nominee and two-time Academy Award nominee, she remains one of Hollywood's most bankable and respected stars.", - "find_historical_event": "In December 1984, the Union Carbide chemical plant in Bhopal, India, experienced a catastrophic gas leak, releasing deadly methyl isocyanate. This disaster killed thousands instantly and caused hundreds of thousands of injuries, becoming one of the world's worst industrial accidents and a lasting symbol of corporate negligence." - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "# Year: 1984\n\n## Famous Person Bio:\n\nScarlett Johansson is an acclaimed actress renowned for her distinctive voice and versatile performances across a wide range of genres. From her captivating early roles in films like \"Lost in Translation\" to her iconic portrayal of Black Widow in the Marvel Cinematic Universe, she has consistently delivered powerful performances. A four-time Golden Globe nominee and two-time Academy Award nominee, she remains one of Hollywood's most bankable and respected stars.\n\n## Historical Event:\n\nIn December 1984, the Union Carbide chemical plant in Bhopal, India, experienced a catastrophic gas leak, releasing deadly methyl isocyanate. This disaster killed thousands instantly and caused hundreds of thousands of injuries, becoming one of the world's worst industrial accidents and a lasting symbol of corporate negligence." - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/aggregate_results@1" - } - } - ], - "id": "b7848178-784d-4fe3-a11f-568b3419acb7", - "state": { - "__session_metadata__": { - "displayName": "1984" - } - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/node_output/README.md b/contributing/samples/workflows/node_output/README.md deleted file mode 100644 index 0f6b70b7db..0000000000 --- a/contributing/samples/workflows/node_output/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# ADK Workflow Node Output Sample - -## Overview - -This sample demonstrates how to manage component outputs and structure data between nodes in an **ADK Workflow**. - -When stringing nodes together, it's critical to know how the ADK framework passes data along edges. This sample shows: - -1. Returning a raw string (it gets automatically wrapped in an `Event`). -1. Returning an explicit `Event` for more granular control over routes and state. -1. Generating a structured dictionary via `Agent(output_schema=MyModel)`. -1. Automatically coercing that raw dictionary back into a fully formed Pydantic model simply by defining it as a type-hint parameter in the Python function. - -## Sample Inputs - -- `cyberpunk future` - -- `gardening tips for beginners` - -## Graph - -```mermaid -graph TD - START --> generate_string_output - generate_string_output --> generate_event_output - generate_event_output --> generate_pydantic_output - generate_pydantic_output --> consume_pydantic_output -``` - -## How To - -1. **Return raw types (string, dict, list):** The node runner will automatically wrap primitives in an `Event(output=...)`. - - ```python - def generate_string_output(node_input: str): - return "Processed input: " + node_input - ``` - -1. **Return an Event explicitly:** Use this when you also need to emit a `route` or modify `ctx.state`. - - ```python - def generate_event_output(node_input: str): - return Event(output=f"Wrapped output: {node_input}") - ``` - -1. **Generate structured data from an LLM:** Pass a Pydantic class to the `Agent`'s `output_schema`. The LLM returns a dictionary/JSON matching the structure. - - ```python - class TopicDetails(BaseModel): - title: str - description: str - category: str - - generate_pydantic_output = Agent( - name="generate_pydantic_output", - output_schema=TopicDetails, - ) - ``` - -1. **Consume structured data in a function:** Simply type-hint the parameter. `FunctionNode` leverages Pydantic to parse the dictionary back into your fully accessible `TopicDetails` class automatically before your function starts running. - - ```python - def consume_pydantic_output(node_input: TopicDetails): - # Type coercion converts dict to model. Now you have .title, .category, etc. - return f"Title: {node_input.title}" - ``` diff --git a/contributing/samples/workflows/node_output/agent.py b/contributing/samples/workflows/node_output/agent.py deleted file mode 100644 index fdb8e83c2b..0000000000 --- a/contributing/samples/workflows/node_output/agent.py +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# NOT WORKING YET -# Pending on correct output passing from LLM node - -from google.adk import Agent -from google.adk import Event -from google.adk import Workflow -from pydantic import BaseModel -from pydantic import Field - - -class TopicDetails(BaseModel): - title: str = Field(description="The title of the generated topic.") - description: str = Field(description="A short description of the topic.") - category: str = Field(description="The broad category of the topic.") - - -def generate_string_output(node_input: str): - """Returns a simple string. Framework automatically wraps it in an Event.""" - return f"Processed input: {node_input}" - - -def generate_event_output(node_input: str): - """Explicitly returns an Event object for more control.""" - return Event(output=f"Event wrapped output: {node_input}") - - -generate_pydantic_output = Agent( - name="generate_pydantic_output", - instruction="Generate a creative topic based on the following input.", - output_schema=TopicDetails, -) - - -def consume_pydantic_output(node_input: TopicDetails): - """ - Relying on the FunctionNode's automatic type parsing. - The framework will coerce the dictionary or JSON into a TopicDetails - object automatically. - """ - return ( - "Received Pydantic Model!\n" - f"Title: {node_input.title}\n" - f"Description: {node_input.description}\n" - f"Category: {node_input.category}" - ) - - -root_agent = Workflow( - name="root_agent", - edges=[ - ( - "START", - generate_string_output, - generate_event_output, - generate_pydantic_output, - consume_pydantic_output, - ), - ], -) diff --git a/contributing/samples/workflows/node_output/tests/go.json b/contributing/samples/workflows/node_output/tests/go.json deleted file mode 100644 index 3df7d48d53..0000000000 --- a/contributing/samples/workflows/node_output/tests/go.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "appName": "node_output", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "go" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/generate_string_output@1" - ], - "path": "root_agent@1/generate_string_output@1" - }, - "output": "Processed input: go" - }, - { - "author": "root_agent", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/generate_event_output@1" - ], - "path": "root_agent@1/generate_event_output@1" - }, - "output": "Event wrapped output: Processed input: go" - }, - { - "author": "generate_pydantic_output", - "content": { - "parts": [ - { - "text": "{\"title\": \"The Impulse to Go: Decoding Humanity's Perpetual Motion\", \"description\": \"Investigating the fundamental human drive to 'go' - exploring its manifestations from ancient migrations and pioneering expeditions to the relentless pursuit of progress in science, technology, and personal growth, and what happens when we pause.\", \"category\": \"Human Behavior & Future Studies\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/generate_pydantic_output@1" - ], - "path": "root_agent@1/generate_pydantic_output@1" - } - }, - { - "author": "root_agent", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/consume_pydantic_output@1", - "root_agent@1" - ], - "path": "root_agent@1/consume_pydantic_output@1" - }, - "output": "Received Pydantic Model!\nTitle: The Impulse to Go: Decoding Humanity's Perpetual Motion\nDescription: Investigating the fundamental human drive to 'go' - exploring its manifestations from ancient migrations and pioneering expeditions to the relentless pursuit of progress in science, technology, and personal growth, and what happens when we pause.\nCategory: Human Behavior & Future Studies" - } - ], - "id": "82ce71ce-e580-4ae2-b291-f82e90221bbd", - "state": { - "__session_metadata__": { - "displayName": "go" - } - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/parallel_worker/README.md b/contributing/samples/workflows/parallel_worker/README.md deleted file mode 100644 index 2dca76c261..0000000000 --- a/contributing/samples/workflows/parallel_worker/README.md +++ /dev/null @@ -1,69 +0,0 @@ -# ADK Workflow Parallel Worker Sample - -## Overview - -This sample demonstrates how to use **parallel workers** in ADK Workflows. - -It takes a user-provided topic, uses an agent to find a list of related topics. The workflow engine will automatically fan-out execution across multiple concurrently running nodes when given an iterable of inputs. First, it dynamically spins up multiple instances of the `make_upper_case` function in parallel to capitalize the topics. Then, it dynamically spins up parallel instances of the `explain_topic` agent to explain each related topic concurrently. Finally, an `aggregate` function collects and formats all the parallel explanations into a single response. - -## Sample Inputs - -- `machine learning` - -- `renewable energy` - -- `space exploration` - -## Graph - -```mermaid -graph TD - START --> process_input - process_input --> find_related_topics - find_related_topics --> make_upper_case[make_upper_case
parallel_worker=True] - - make_upper_case --> worker1[worker 1] - make_upper_case --> worker2[worker 2] - make_upper_case --> workerN[worker N] - - worker1 --> explain_topic[explain_topic
parallel_worker=True] - worker2 --> explain_topic - workerN --> explain_topic - - explain_topic --> eworker1[worker 1] - explain_topic --> eworker2[worker 2] - explain_topic --> eworkerN[worker N] - - eworker1 --> aggregate - eworker2 --> aggregate - eworkerN --> aggregate -``` - -## How To - -Both agents and functions can be designed as parallel workers in an ADK Workflow. - -1. Ensure the preceding node in the workflow outputs an iterable (e.g., a `list`). The workflow engine will automatically fan-out and execute the parallel worker node concurrently for each item in the iterable. - -1. To define an **Agent** as a parallel worker, use the `parallel_worker=True` parameter: - - ```python - explain_topic = Agent( - name="explain_topic", - instruction="""Explain how the following topic relates to the original topic: "{topic}".""", - parallel_worker=True, - output_schema=TopicExplanation, - ) - ``` - -1. To define a **Python function** as a parallel worker, decorate it with `@node(parallel_worker=True)`: - - ```python - from google.adk.workflow import node - - @node(parallel_worker=True) - def make_upper_case(node_input: str): - yield node_input.upper() - ``` - -1. The subsequent node in the workflow will receive the results from all parallel executions as a single aggregated list (e.g., `list[TopicExplanation]`). diff --git a/contributing/samples/workflows/parallel_worker/agent.py b/contributing/samples/workflows/parallel_worker/agent.py deleted file mode 100644 index 2b00b5ea85..0000000000 --- a/contributing/samples/workflows/parallel_worker/agent.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# NOT WORKING YET - -from google.adk import Agent -from google.adk import Event -from google.adk import Workflow -from google.adk.workflow import node -from pydantic import BaseModel - - -class TopicExplanation(BaseModel): - topic: str - explanation: str - - -def process_input(node_input: str): - """Puts user input in the state.""" - return Event(state={"topic": node_input}) - - -find_related_topics = Agent( - name="find_related_topics", - instruction=( - 'Given the specific topic "{topic}", generate a list of 3 ' - "related topics." - ), - output_schema=list[str], -) - - -@node(parallel_worker=True) -def make_upper_case(node_input: str): - yield node_input.upper() - - -explain_topic = Agent( - name="explain_topic", - instruction=( - "Explain how the following topic relates the the original topic: " - '"{topic}".' - ), - parallel_worker=True, - output_schema=TopicExplanation, -) - - -def aggregate(node_input: list[TopicExplanation]): - return Event( - message="\n\n---\n\n".join( - f"{explanation.topic}: {explanation.explanation}" - for explanation in node_input - ), - ) - - -root_agent = Workflow( - name="root_agent", - edges=[ - ( - "START", - process_input, - find_related_topics, - make_upper_case, - explain_topic, - aggregate, - ), - ], -) diff --git a/contributing/samples/workflows/parallel_worker/tests/flower.json b/contributing/samples/workflows/parallel_worker/tests/flower.json deleted file mode 100644 index 571b6208b9..0000000000 --- a/contributing/samples/workflows/parallel_worker/tests/flower.json +++ /dev/null @@ -1,225 +0,0 @@ -{ - "appName": "parallel_worker", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "flower" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "stateDelta": { - "topic": "flower" - } - }, - "author": "root_agent", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/process_input@1" - } - }, - { - "author": "find_related_topics", - "content": { - "parts": [ - { - "text": "[\"gardening\", \"plants\", \"botany\"]" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/find_related_topics@1" - ], - "path": "root_agent@1/find_related_topics@1" - } - }, - { - "author": "root_agent", - "branch": "make_upper_case@1", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/make_upper_case@1/make_upper_case@1" - ], - "path": "root_agent@1/make_upper_case@1/make_upper_case@1" - }, - "output": "GARDENING" - }, - { - "author": "root_agent", - "branch": "make_upper_case@2", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/make_upper_case@1/make_upper_case@2" - ], - "path": "root_agent@1/make_upper_case@1/make_upper_case@2" - }, - "output": "PLANTS" - }, - { - "author": "root_agent", - "branch": "make_upper_case@3", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/make_upper_case@1/make_upper_case@3" - ], - "path": "root_agent@1/make_upper_case@1/make_upper_case@3" - }, - "output": "BOTANY" - }, - { - "author": "root_agent", - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/make_upper_case@1" - ], - "path": "root_agent@1/make_upper_case@1" - }, - "output": [ - "GARDENING", - "PLANTS", - "BOTANY" - ] - }, - { - "author": "explain_topic", - "branch": "explain_topic@1", - "content": { - "parts": [ - { - "text": "{\"topic\": \"GARDENING\", \"explanation\": \"Gardening is the practice of growing and cultivating plants, and flowers are a central element in many gardening practices. Gardeners often plant, nurture, and arrange flowers for their aesthetic beauty, fragrance, or to attract pollinators, making flowers an integral part of the gardening world.\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/explain_topic@1/explain_topic@1" - ], - "path": "root_agent@1/explain_topic@1/explain_topic@1" - } - }, - { - "author": "explain_topic", - "branch": "explain_topic@2", - "content": { - "parts": [ - { - "text": "{\"topic\": \"PLANTS\", \"explanation\": \"A flower is a reproductive part of many types of plants. Plants are the larger biological kingdom to which flowers belong, as flowers grow on and are integral components of flowering plants (angiosperms).\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-9", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/explain_topic@1/explain_topic@2" - ], - "path": "root_agent@1/explain_topic@1/explain_topic@2" - } - }, - { - "author": "explain_topic", - "branch": "explain_topic@3", - "content": { - "parts": [ - { - "text": "{\"topic\": \"BOTANY\", \"explanation\": \"Botany is the scientific study of plants, including their structure, growth, reproduction, metabolism, development, diseases, and chemical properties. Flowers are the reproductive organs of many plants, specifically angiosperms, and are therefore a primary subject of study within botany, with botanists analyzing their morphology, physiology, ecology, and evolutionary significance.\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-10", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/explain_topic@1/explain_topic@3" - ], - "path": "root_agent@1/explain_topic@1/explain_topic@3" - } - }, - { - "author": "root_agent", - "id": "e-11", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/explain_topic@1" - ], - "path": "root_agent@1/explain_topic@1" - }, - "output": [ - { - "explanation": "Gardening is the practice of growing and cultivating plants, and flowers are a central element in many gardening practices. Gardeners often plant, nurture, and arrange flowers for their aesthetic beauty, fragrance, or to attract pollinators, making flowers an integral part of the gardening world.", - "topic": "GARDENING" - }, - { - "explanation": "A flower is a reproductive part of many types of plants. Plants are the larger biological kingdom to which flowers belong, as flowers grow on and are integral components of flowering plants (angiosperms).", - "topic": "PLANTS" - }, - { - "explanation": "Botany is the scientific study of plants, including their structure, growth, reproduction, metabolism, development, diseases, and chemical properties. Flowers are the reproductive organs of many plants, specifically angiosperms, and are therefore a primary subject of study within botany, with botanists analyzing their morphology, physiology, ecology, and evolutionary significance.", - "topic": "BOTANY" - } - ] - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "GARDENING: Gardening is the practice of growing and cultivating plants, and flowers are a central element in many gardening practices. Gardeners often plant, nurture, and arrange flowers for their aesthetic beauty, fragrance, or to attract pollinators, making flowers an integral part of the gardening world.\n\n---\n\nPLANTS: A flower is a reproductive part of many types of plants. Plants are the larger biological kingdom to which flowers belong, as flowers grow on and are integral components of flowering plants (angiosperms).\n\n---\n\nBOTANY: Botany is the scientific study of plants, including their structure, growth, reproduction, metabolism, development, diseases, and chemical properties. Flowers are the reproductive organs of many plants, specifically angiosperms, and are therefore a primary subject of study within botany, with botanists analyzing their morphology, physiology, ecology, and evolutionary significance." - } - ], - "role": "user" - }, - "id": "e-12", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/aggregate@1" - } - } - ], - "id": "70e3790b-df94-4567-93c9-3c60abc6a4e6", - "state": { - "__session_metadata__": { - "displayName": "flower" - }, - "topic": "flower" - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/request_input/README.md b/contributing/samples/workflows/request_input/README.md deleted file mode 100644 index 6a42e3bf54..0000000000 --- a/contributing/samples/workflows/request_input/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# ADK Workflow Request Input Sample - -## Overview - -This sample demonstrates how to create a **Human-in-the-Loop** workflow in **ADK Workflows** using the `RequestInput` event. - -It shows a customer support scenario where an LLM agent (`draft_email`) drafts a response to a customer complaint. The workflow then halts execution and prompts a human user for review (`request_human_review`). Depending on the human's input (`approve`, `reject`, or custom feedback), the workflow either completes, aborts, or loops back to the AI for revisions. - -This pattern is crucial for tasks where AI actions require human verification before proceeding. - -## Sample Inputs - -- `My phone battery drains too fast` - -- `I never received my order` - -- `The software crashes when I open the settings` - -## Graph - -```mermaid -graph TD - START --> draft_email - draft_email --> request_human_review - request_human_review --> handle_human_review - handle_human_review -->|revise| draft_email - handle_human_review -->|approved| send_email - handle_human_review -->|rejected| END_rejected[END rejected] -``` - -## How To - -1. Yield a `RequestInput` event from a node to halt the workflow and prompt the user for input. - - ```python - from google.adk.events import RequestInput - - def request_human_review(draft: str): - yield RequestInput( - message="Please review the draft...", - ) - ``` - -1. The subsequent node will receive the user's input as its argument (`node_input`). You can use this input to determine the next routing step. - - ```python - def handle_human_review(node_input: str): - if node_input == "approve": - yield Event(route="approved") - elif node_input == "reject": - yield Event(route="rejected") - else: - yield Event(state={"feedback": node_input}, route="revise") - ``` - -1. Define the edges in your workflow to handle the different routes, including looping back for revisions. - - ```python - Workflow( - name="request_input", - edges=[ - ("START", ..., draft_email, request_human_review, handle_human_review), - (handle_human_review, {"revise": draft_email, "approved": send_email}), - ], - ) - ``` diff --git a/contributing/samples/workflows/request_input/agent.py b/contributing/samples/workflows/request_input/agent.py deleted file mode 100644 index ca2b98ca81..0000000000 --- a/contributing/samples/workflows/request_input/agent.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# NOT WORKING YET - -from google.adk import Agent -from google.adk import Event -from google.adk import Workflow -from google.adk.events import RequestInput - - -def process_input(node_input: str): - """Takes the initial customer complaint as input and sets it in the state.""" - yield Event(state={"complaint": node_input, "feedback": ""}) - - -draft_email = Agent( - name="draft_email", - instruction=""" - Please write a polite, helpful response email to the following customer complaint: "{complaint}" - - If there is any feedback from the manager to revise the draft, please incorporate it: "{feedback?}" - """, - output_key="draft", -) - - -def request_human_review(draft: str): - yield RequestInput( - message=( - "Please review the following draft email and provide 'approve'," - f" 'reject', or feedback to revise.\n\n---\n{draft}\n---" - ), - ) - - -def handle_human_review(node_input: str): - if node_input == "reject": - yield Event(route="rejected") - elif node_input == "approve": - yield Event(route="approved") - else: - yield Event(state={"feedback": node_input}, route="revise") - - -def reject_email(): - yield Event(message="Draft rejected.") - - -def send_email(draft: str): - yield Event(message="Draft approved and sent successfully.") - - -root_agent = Workflow( - name="request_input", - edges=[ - ( - "START", - process_input, - draft_email, - request_human_review, - handle_human_review, - ), - ( - handle_human_review, - { - "revise": draft_email, - "approved": send_email, - "rejected": reject_email, - }, - ), - ], -) diff --git a/contributing/samples/workflows/request_input/tests/phone_broke.json b/contributing/samples/workflows/request_input/tests/phone_broke.json deleted file mode 100644 index cecebf7269..0000000000 --- a/contributing/samples/workflows/request_input/tests/phone_broke.json +++ /dev/null @@ -1,236 +0,0 @@ -{ - "appName": "request_input", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "phone broke" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "stateDelta": { - "complaint": "phone broke", - "feedback": "" - } - }, - "author": "request_input", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "request_input@1/process_input@1" - } - }, - { - "actions": { - "stateDelta": { - "draft": "Subject: Regarding Your Phone Issue - How We Can Help\n\nDear Customer,\n\nWe're very sorry to hear that your phone has broken. We understand how frustrating and disruptive this can be.\n\nTo help us understand what happened and assist you as quickly and efficiently as possible, could you please provide a few more details?\n\nPlease tell us:\n* **What is the make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n* **When did the phone break, and what happened?** (e.g., dropped it, it got wet, stopped turning on suddenly, screen went blank, etc.)\n* **When and where was the phone purchased?** (This helps us determine warranty status.)\n* **Have you already tried any troubleshooting steps?** (e.g., restarting, charging, etc.)\n\nOnce we have this information, we can guide you through the appropriate next steps, which may include troubleshooting, repair options, or warranty claims.\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call our support team at [Your Company Phone Number] during our business hours [Business Hours, e.g., Monday-Friday, 9 AM - 5 PM EST].\n\nWe're here to help get your phone back up and running as quickly as possible.\n\nThank you for your patience.\n\nSincerely,\n\nThe [Your Company Name] Support Team" - } - }, - "author": "draft_email", - "content": { - "parts": [ - { - "text": "Subject: Regarding Your Phone Issue - How We Can Help\n\nDear Customer,\n\nWe're very sorry to hear that your phone has broken. We understand how frustrating and disruptive this can be.\n\nTo help us understand what happened and assist you as quickly and efficiently as possible, could you please provide a few more details?\n\nPlease tell us:\n* **What is the make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n* **When did the phone break, and what happened?** (e.g., dropped it, it got wet, stopped turning on suddenly, screen went blank, etc.)\n* **When and where was the phone purchased?** (This helps us determine warranty status.)\n* **Have you already tried any troubleshooting steps?** (e.g., restarting, charging, etc.)\n\nOnce we have this information, we can guide you through the appropriate next steps, which may include troubleshooting, repair options, or warranty claims.\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call our support team at [Your Company Phone Number] during our business hours [Business Hours, e.g., Monday-Friday, 9 AM - 5 PM EST].\n\nWe're here to help get your phone back up and running as quickly as possible.\n\nThank you for your patience.\n\nSincerely,\n\nThe [Your Company Name] Support Team" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "request_input@1/draft_email@1" - ], - "path": "request_input@1/draft_email@1" - } - }, - { - "author": "request_input", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "interruptId": "fc-1", - "message": "Please review the following draft email and provide 'approve', 'reject', or feedback to revise.\n\n---\nSubject: Regarding Your Phone Issue - How We Can Help\n\nDear Customer,\n\nWe're very sorry to hear that your phone has broken. We understand how frustrating and disruptive this can be.\n\nTo help us understand what happened and assist you as quickly and efficiently as possible, could you please provide a few more details?\n\nPlease tell us:\n* **What is the make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n* **When did the phone break, and what happened?** (e.g., dropped it, it got wet, stopped turning on suddenly, screen went blank, etc.)\n* **When and where was the phone purchased?** (This helps us determine warranty status.)\n* **Have you already tried any troubleshooting steps?** (e.g., restarting, charging, etc.)\n\nOnce we have this information, we can guide you through the appropriate next steps, which may include troubleshooting, repair options, or warranty claims.\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call our support team at [Your Company Phone Number] during our business hours [Business Hours, e.g., Monday-Friday, 9 AM - 5 PM EST].\n\nWe're here to help get your phone back up and running as quickly as possible.\n\nThank you for your patience.\n\nSincerely,\n\nThe [Your Company Name] Support Team\n---", - "payload": null, - "response_schema": null - }, - "id": "fc-1", - "name": "adk_request_input" - } - } - ] - }, - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-1" - ], - "nodeInfo": { - "path": "request_input@1/request_human_review@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "adk_request_input", - "response": { - "result": "shorter" - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "route": "revise", - "stateDelta": { - "feedback": "shorter" - } - }, - "author": "request_input", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "request_input@1/handle_human_review@1" - } - }, - { - "actions": { - "stateDelta": { - "draft": "Subject: Your Phone Issue - How We Can Help\n\nDear Customer,\n\nWe're sorry to hear your phone has broken. To help us assist you quickly, please provide the following details:\n\n* **Make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n* **When and how did it break?** (e.g., dropped, got wet, stopped turning on)\n* **When and where was it purchased?** (This helps with warranty)\n* **Have you tried any troubleshooting steps?** (e.g., restarting, charging)\n\nOnce we have this information, we can guide you through the appropriate next steps.\n\nPlease reply to this email with the requested details, or call our support team at [Your Company Phone Number] during [Business Hours] if you prefer to speak directly.\n\nWe look forward to helping you.\n\nSincerely,\n\nThe [Your Company Name] Support Team" - } - }, - "author": "draft_email", - "content": { - "parts": [ - { - "text": "Subject: Your Phone Issue - How We Can Help\n\nDear Customer,\n\nWe're sorry to hear your phone has broken. To help us assist you quickly, please provide the following details:\n\n* **Make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n* **When and how did it break?** (e.g., dropped, got wet, stopped turning on)\n* **When and where was it purchased?** (This helps with warranty)\n* **Have you tried any troubleshooting steps?** (e.g., restarting, charging)\n\nOnce we have this information, we can guide you through the appropriate next steps.\n\nPlease reply to this email with the requested details, or call our support team at [Your Company Phone Number] during [Business Hours] if you prefer to speak directly.\n\nWe look forward to helping you.\n\nSincerely,\n\nThe [Your Company Name] Support Team" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "request_input@1/draft_email@2" - ], - "path": "request_input@1/draft_email@2" - } - }, - { - "author": "request_input", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "interruptId": "fc-2", - "message": "Please review the following draft email and provide 'approve', 'reject', or feedback to revise.\n\n---\nSubject: Your Phone Issue - How We Can Help\n\nDear Customer,\n\nWe're sorry to hear your phone has broken. To help us assist you quickly, please provide the following details:\n\n* **Make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n* **When and how did it break?** (e.g., dropped, got wet, stopped turning on)\n* **When and where was it purchased?** (This helps with warranty)\n* **Have you tried any troubleshooting steps?** (e.g., restarting, charging)\n\nOnce we have this information, we can guide you through the appropriate next steps.\n\nPlease reply to this email with the requested details, or call our support team at [Your Company Phone Number] during [Business Hours] if you prefer to speak directly.\n\nWe look forward to helping you.\n\nSincerely,\n\nThe [Your Company Name] Support Team\n---", - "payload": null, - "response_schema": null - }, - "id": "fc-2", - "name": "adk_request_input" - } - } - ] - }, - "id": "e-8", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-2" - ], - "nodeInfo": { - "path": "request_input@1/request_human_review@2" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "adk_request_input", - "response": { - "result": "approve" - } - } - } - ], - "role": "user" - }, - "id": "e-9", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "route": "approved" - }, - "author": "request_input", - "id": "e-10", - "invocationId": "i-1", - "nodeInfo": { - "path": "request_input@1/handle_human_review@2" - } - }, - { - "author": "request_input", - "content": { - "parts": [ - { - "text": "Draft approved and sent successfully." - } - ], - "role": "user" - }, - "id": "e-11", - "invocationId": "i-1", - "nodeInfo": { - "path": "request_input@1/send_email@1" - } - } - ], - "id": "cbd1b977-915d-4000-a8f8-f1c747fd3d0e", - "state": { - "__session_metadata__": { - "displayName": "phone broke" - }, - "complaint": "phone broke", - "draft": "Subject: Regarding Your Phone Issue\n\nDear [Customer Name],\n\nI'm sorry to hear your phone has broken. I understand how inconvenient this must be.\n\nTo help us investigate and find the best solution for you, please reply with details about your phone (model, purchase date) and what happened. If you have an order number, please include that too.\n\nWe're ready to assist you further once we have this information.\n\nSincerely,\n[Your Name/Company Support Team]", - "feedback": "shorter" - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/request_input/tests/phone_broke_reject.json b/contributing/samples/workflows/request_input/tests/phone_broke_reject.json deleted file mode 100644 index 3174457aa5..0000000000 --- a/contributing/samples/workflows/request_input/tests/phone_broke_reject.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "phone broke" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "stateDelta": { - "complaint": "phone broke", - "feedback": "" - } - }, - "author": "request_input", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "request_input@1/process_input@1" - } - }, - { - "actions": { - "stateDelta": { - "draft": "Subject: Regarding Your Phone Issue – We're Here to Help\n\nDear Customer,\n\nThank you for reaching out. I'm very sorry to hear that your phone has broken. I understand how disruptive and frustrating it can be when your primary device isn't working as it should.\n\nTo help us understand the best way to assist you with a repair or replacement, could you please provide us with a few more details?\n\n1. **What is the make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n2. **When did you purchase the phone?** (This helps us check warranty status.)\n3. **Can you briefly describe what happened or how it broke?** (e.g., dropped, water damage, stopped turning on, screen issues)\n4. **Have you already tried any troubleshooting steps?** (e.g., restarting, charging)\n\nOnce we have this information, we can guide you through the next steps, which may include:\n* **Warranty Service:** If your phone is still under warranty and the damage is covered.\n* **Repair Options:** Providing details on how to send your device for repair.\n* **Replacement Options:** Discussing potential replacement pathways.\n\nIn the meantime, you can also visit our dedicated support page for common issues and troubleshooting at [Link to your support/repair page, e.g., www.yourcompany.com/support/repairs].\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call us at [Your Customer Service Phone Number] during business hours.\n\nWe appreciate your patience and look forward to helping you get this resolved as quickly as possible.\n\nSincerely,\n\nThe [Your Company Name] Support Team" - } - }, - "author": "draft_email", - "content": { - "parts": [ - { - "text": "Subject: Regarding Your Phone Issue – We're Here to Help\n\nDear Customer,\n\nThank you for reaching out. I'm very sorry to hear that your phone has broken. I understand how disruptive and frustrating it can be when your primary device isn't working as it should.\n\nTo help us understand the best way to assist you with a repair or replacement, could you please provide us with a few more details?\n\n1. **What is the make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n2. **When did you purchase the phone?** (This helps us check warranty status.)\n3. **Can you briefly describe what happened or how it broke?** (e.g., dropped, water damage, stopped turning on, screen issues)\n4. **Have you already tried any troubleshooting steps?** (e.g., restarting, charging)\n\nOnce we have this information, we can guide you through the next steps, which may include:\n* **Warranty Service:** If your phone is still under warranty and the damage is covered.\n* **Repair Options:** Providing details on how to send your device for repair.\n* **Replacement Options:** Discussing potential replacement pathways.\n\nIn the meantime, you can also visit our dedicated support page for common issues and troubleshooting at [Link to your support/repair page, e.g., www.yourcompany.com/support/repairs].\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call us at [Your Customer Service Phone Number] during business hours.\n\nWe appreciate your patience and look forward to helping you get this resolved as quickly as possible.\n\nSincerely,\n\nThe [Your Company Name] Support Team" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "request_input@1/draft_email@1" - ], - "path": "request_input@1/draft_email@1" - } - }, - { - "author": "request_input", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "interruptId": "fc-1", - "message": "Please review the following draft email and provide 'approve', 'reject', or feedback to revise.\n\n---\nSubject: Regarding Your Phone Issue – We're Here to Help\n\nDear Customer,\n\nThank you for reaching out. I'm very sorry to hear that your phone has broken. I understand how disruptive and frustrating it can be when your primary device isn't working as it should.\n\nTo help us understand the best way to assist you with a repair or replacement, could you please provide us with a few more details?\n\n1. **What is the make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n2. **When did you purchase the phone?** (This helps us check warranty status.)\n3. **Can you briefly describe what happened or how it broke?** (e.g., dropped, water damage, stopped turning on, screen issues)\n4. **Have you already tried any troubleshooting steps?** (e.g., restarting, charging)\n\nOnce we have this information, we can guide you through the next steps, which may include:\n* **Warranty Service:** If your phone is still under warranty and the damage is covered.\n* **Repair Options:** Providing details on how to send your device for repair.\n* **Replacement Options:** Discussing potential replacement pathways.\n\nIn the meantime, you can also visit our dedicated support page for common issues and troubleshooting at [Link to your support/repair page, e.g., www.yourcompany.com/support/repairs].\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call us at [Your Customer Service Phone Number] during business hours.\n\nWe appreciate your patience and look forward to helping you get this resolved as quickly as possible.\n\nSincerely,\n\nThe [Your Company Name] Support Team\n---", - "payload": null, - "response_schema": null - }, - "id": "fc-1", - "name": "adk_request_input" - } - } - ] - }, - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-1" - ], - "nodeInfo": { - "path": "request_input@1/request_human_review@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "adk_request_input", - "response": { - "result": "reject" - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "route": "rejected" - }, - "author": "request_input", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "request_input@1/handle_human_review@1" - } - }, - { - "author": "request_input", - "content": { - "parts": [ - { - "text": "Draft rejected." - } - ], - "role": "user" - }, - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "path": "request_input@1/reject_email@1" - } - } - ] -} diff --git a/contributing/samples/workflows/request_input_advanced/README.md b/contributing/samples/workflows/request_input_advanced/README.md deleted file mode 100644 index 476bf819c7..0000000000 --- a/contributing/samples/workflows/request_input_advanced/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# ADK Workflow Request Input Advanced Sample - -## Overview - -This sample demonstrates advanced features for requesting Human-in-the-Loop (HITL) input dynamically during an **ADK Workflow** execution. - -Specifically, it highlights how to pass structured data to the client UI using the `payload` parameter, and how to mandate a structured response type using the `response_schema` parameter on the yielded `RequestInput` event. - -In this scenario, an employee requests time off by providing a natural language description of their request (e.g., "I need next Monday off to go to the dentist"). - -- An LLM agent (`process_request`) parses the natural language into a structured Pydantic model containing the number of `days` and a `reason`. -- A python node (`evaluate_request`) evaluates the parsed request: - - If `days <= 1`, it yields a `TimeOffDecision` approving the request. - - If `days > 1`, it yields a `RequestInput` to a manager. It attaches the request details to the `payload` so the client UI can render it. It enforces that the manager must respond with a JSON object containing an `approved` boolean and an optional `approved_days` integer by specifying `response_schema` with a valid Pydantic JSON schema. - -## Sample Inputs - -Start the workflow by providing the initial time off request in natural language: - -- `I'm feeling under the weather and need to take today off.` - - *Parses as 1 day, auto-approves.* - -- `Taking my family to Disney World, I'll be out for 5 days next week.` - - *Parses as 5 days, routes to manager review.* - -When the terminal prompts you as the manager, provide valid JSON matching the schema: - -- `{"approved": true, "approved_days": 5}` - -- `{"approved": false, "approved_days": 0}` - -## Graph - -```mermaid -graph TD - START --> process_request[process_request
LLM Agent] - process_request --> evaluate_request - evaluate_request -->|Yields TimeOffDecision OR RequestInput| process_decision - process_decision --> END[END] -``` - -## How To - -1. **Define the Response Schema:** Use a Pydantic model's `model_json_schema()` to get a standard layout of what the human should return. - - ```python - from typing import Optional - from pydantic import BaseModel, Field - - class TimeOffDecision(BaseModel): - approved: bool = Field(...) - approved_days: Optional[int] = Field(None) - ``` - -1. **Yield a RequestInput:** Pass the schema and optionally a `payload` for the client to display. - - ```python - def evaluate_request(request: TimeOffRequest): - # ... logic to check if manager review is needed ... - yield RequestInput( - interrupt_id="manager_approval", - message="Please review this time off request.", - payload=request, - response_schema=TimeOffDecision.model_json_schema() - ) - ``` - -1. **Parse the Resumed Input:** When the workflow resumes, the `node_input` to the next node will be the parsed Pydantic model implicitly (if type-hinted). - - ```python - def process_decision(request: TimeOffRequest, node_input: TimeOffDecision): - if node_input.approved: - # ... - ``` diff --git a/contributing/samples/workflows/request_input_advanced/agent.py b/contributing/samples/workflows/request_input_advanced/agent.py deleted file mode 100644 index d026d55411..0000000000 --- a/contributing/samples/workflows/request_input_advanced/agent.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import Optional - -from google.adk import Agent -from google.adk import Event -from google.adk import Workflow -from google.adk.events import RequestInput -from pydantic import BaseModel -from pydantic import Field - - -class TimeOffRequest(BaseModel): - days: int = Field(description="Number of days requested.") - reason: str = Field(description="Reason for the time off.") - - -class TimeOffDecision(BaseModel): - """The structured response we expect back from the human manager.""" - - approved: bool = Field(description="Whether the time off is approved.") - approved_days: Optional[int] = Field( - default=None, description="Number of days approved." - ) - - -process_request = Agent( - name="process_request", - instruction=( - "Extract the number of days and the reason from the user's natural" - " language time off request." - ), - output_schema=TimeOffRequest, - output_key="request", -) - - -def evaluate_request(request: TimeOffRequest): - """ - If days <= 1, it's auto-approved. Otherwise, routes to manager review. - """ - if request.days <= 1: - return TimeOffDecision(approved=True) - else: - return RequestInput( - interrupt_id="manager_approval", - message="Please review this time off request.", - payload=request, - response_schema=TimeOffDecision, - ) - - -def process_decision(request: TimeOffRequest, node_input: TimeOffDecision): - if node_input.approved: - approved_days = ( - node_input.approved_days - if node_input.approved_days is not None - else request.days - ) - message = ( - f"Time Off Approved! {approved_days} out of {request.days} days" - " granted." - ) - else: - message = "Time Off Denied." - - yield Event(message=message) - - -root_agent = Workflow( - name="request_input_advanced", - edges=[ - ("START", process_request, evaluate_request, process_decision), - ], -) diff --git a/contributing/samples/workflows/request_input_advanced/tests/2_sick_days.json b/contributing/samples/workflows/request_input_advanced/tests/2_sick_days.json deleted file mode 100644 index a042a1b8f7..0000000000 --- a/contributing/samples/workflows/request_input_advanced/tests/2_sick_days.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "appName": "request_input_advanced", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "2 sick days" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "stateDelta": { - "request": { - "days": 2, - "reason": "sick" - } - } - }, - "author": "process_request", - "content": { - "parts": [ - { - "text": "{\"days\":2,\"reason\":\"sick\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "request_input_advanced@1/process_request@1" - ], - "path": "request_input_advanced@1/process_request@1" - } - }, - { - "author": "request_input_advanced", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "interruptId": "fc-1", - "message": "Please review this time off request.", - "payload": { - "days": 2, - "reason": "sick" - }, - "response_schema": { - "description": "The structured response we expect back from the human manager.", - "properties": { - "approved": { - "description": "Whether the time off is approved.", - "title": "Approved", - "type": "boolean" - }, - "approved_days": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Number of days approved.", - "title": "Approved Days" - } - }, - "required": [ - "approved" - ], - "title": "TimeOffDecision", - "type": "object" - } - }, - "id": "fc-1", - "name": "adk_request_input" - } - } - ] - }, - "id": "e-3", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-1" - ], - "nodeInfo": { - "path": "request_input_advanced@1/evaluate_request@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "adk_request_input", - "response": { - "result": "{\"approved\": true}" - } - } - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "request_input_advanced", - "content": { - "parts": [ - { - "text": "Time Off Approved! 2 out of 2 days granted." - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "request_input_advanced@1/process_decision@1" - } - } - ], - "id": "131bfe8b-de90-47bd-b442-957f27dc58a6", - "state": { - "__session_metadata__": { - "displayName": "2 sick days" - }, - "request": { - "days": 2, - "reason": "sick days" - } - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/request_input_rerun/README.md b/contributing/samples/workflows/request_input_rerun/README.md deleted file mode 100644 index d0372118ba..0000000000 --- a/contributing/samples/workflows/request_input_rerun/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# ADK Workflow Request Input Rerun Sample - -## Overview - -This sample demonstrates an alternative way to handle a **Human-in-the-Loop** workflow in **ADK Workflows** using the `RequestInput` event combined with the `@node(rerun_on_resume=True)` decorator. - -Like the standard `request_input` sample, this workflow simulates a customer support scenario where an AI drafts an email and a human reviews it. The key difference lies in *how* the human input is processed when the workflow resumes. - -### `request_input` vs `request_input_rerun` - -- **Standard (`request_input`):** The workflow pauses after a node yields `RequestInput`. When the user provides input and execution resumes, the input is automatically passed as the argument to the **next node** in the edge definition. This requires two separate nodes: one to request the input and one to handle it. -- **Rerun (`request_input_rerun`):** The node yielding `RequestInput` is decorated with `@node(rerun_on_resume=True)`. When execution resumes, the workflow **re-runs the exact same node** that asked for the input. The node can then access the provided input via the execution `Context`. - -This allows you to combine the requesting and handling of human input into a single, cohesive node. - -## Sample Inputs - -- `The delivery was a week late` - -- `I received the wrong item` - -- `My account was charged twice` - -## Graph - -```mermaid -graph TD - START --> draft_email - draft_email --> human_review[human_review
reruns on resume] - human_review -->|revise| draft_email - human_review -->|approved| send_email - human_review -->|rejected| END_rejected[END rejected] -``` - -## How To - -1. Decorate the node that needs human input with `@node(rerun_on_resume=True)`. Ensure the function signature includes the workflow `Context`. - - ```python - from google.adk.workflow import node - from google.adk import Context - - @node(rerun_on_resume=True) - def human_review(draft: str, ctx: Context): - # ... - ``` - -1. Inside the node, check if you are being resumed by looking for the `interrupt_id` in `ctx.resume_inputs`. - - ```python - resume_input = ctx.resume_inputs.get('human_review') - ``` - -1. If `resume_input` is missing (i.e., this is the first time the node is executing), yield the `RequestInput` event to pause the workflow. Include an explicit `interrupt_id`. - - ```python - if not resume_input: - yield RequestInput( - interrupt_id="human_review", - message="Please review the draft...", - ) - return # Important: Stop execution of this node for now - ``` - -1. If `resume_input` is present (i.e., the workflow was resumed with user input), process the input and yield the appropriate routing events. - - ```python - if resume_input == "reject": - yield Event(route="rejected") - elif resume_input == "approve": - yield Event(route="approved") - else: - yield Event(state={"feedback": resume_input}, route="revise") - ``` - -1. The edge definition is much simpler because the single `human_review` node handles everything: - - ```python - Workflow( - name="request_input", - edges=[ - ("START", process_input, draft_email, human_review), - (human_review, {"revise": draft_email, "approved": send_email}), - ], - ) - ``` diff --git a/contributing/samples/workflows/request_input_rerun/agent.py b/contributing/samples/workflows/request_input_rerun/agent.py deleted file mode 100644 index c7bc96c34e..0000000000 --- a/contributing/samples/workflows/request_input_rerun/agent.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from google.adk import Agent -from google.adk import Context -from google.adk import Event -from google.adk import Workflow -from google.adk.events import RequestInput -from google.adk.workflow import node - - -def process_input(node_input: str): - """Takes the initial customer complaint as input and sets it in the state.""" - yield Event(state={"complaint": node_input, "feedback": ""}) - - -draft_email = Agent( - name="draft_email", - instruction=""" - Please write a polite, helpful response email to the following customer complaint: "{complaint}" - - If there is any feedback from the manager to revise the draft, please incorporate it: "{feedback?}" - """, - output_key="draft", -) - - -@node(rerun_on_resume=True) -def human_review(draft: str, ctx: Context): - resume_input = ctx.resume_inputs.get("human_review") - if not resume_input: - yield RequestInput( - interrupt_id="human_review", - message=( - "Please review the following draft email and provide 'approve'," - f" 'reject', or feedback to revise.\n\n---\n{draft}\n---" - ), - ) - return - - if resume_input == "reject": - yield Event(route="rejected") - elif resume_input == "approve": - yield Event(route="approved") - else: - yield Event(state={"feedback": resume_input}, route="revise") - - -def reject_email(): - yield Event(message="Draft rejected.") - - -def send_email(draft: str): - yield Event(message="Draft approved and sent successfully.") - - -root_agent = Workflow( - name="request_input_rerun", - edges=[ - ("START", process_input, draft_email, human_review), - ( - human_review, - { - "revise": draft_email, - "approved": send_email, - "rejected": reject_email, - }, - ), - ], -) diff --git a/contributing/samples/workflows/request_input_rerun/tests/phone_broke.json b/contributing/samples/workflows/request_input_rerun/tests/phone_broke.json deleted file mode 100644 index b10c98e525..0000000000 --- a/contributing/samples/workflows/request_input_rerun/tests/phone_broke.json +++ /dev/null @@ -1,236 +0,0 @@ -{ - "appName": "request_input_rerun", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "phone broke" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "stateDelta": { - "complaint": "phone broke", - "feedback": "" - } - }, - "author": "request_input_rerun", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "request_input_rerun@1/process_input@1" - } - }, - { - "actions": { - "stateDelta": { - "draft": "Subject: Regarding Your Phone Issue - How We Can Help - [Your Company Name]\n\nDear Valued Customer,\n\nThank you for reaching out to us. We're very sorry to hear that you're experiencing an issue with your phone. We understand how frustrating it can be when your device isn't working as expected, and we're here to help.\n\nTo assist you as quickly and effectively as possible, could you please provide a few more details about the situation? This will help us understand the problem and guide you towards the best solution.\n\nPlease tell us:\n\n1. **What is the model of your phone?** (e.g., iPhone 15, Samsung Galaxy S24, Google Pixel 8, etc.)\n2. **When did you purchase the phone?** (Rough date or year is fine if you don't have the exact date.)\n3. **Could you describe what happened and how the phone \"broke\"?** (e.g., \"It fell and the screen cracked,\" \"It won't turn on,\" \"It got wet,\" \"The battery stopped charging,\" \"It's stuck in a loop,\" etc.)\n4. **Have you already attempted any troubleshooting steps?** (e.g., restarting the phone, checking charging cables, etc.)\n\nOnce we have this information, our support team will be able to assess the situation, discuss potential solutions such as troubleshooting, repair options, or warranty service, and guide you through the next steps.\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call us at [Your Phone Number] during our business hours of [Your Business Hours].\n\nWe look forward to helping you resolve this issue soon.\n\nSincerely,\n\nThe Customer Support Team\n[Your Company Name]\n[Your Company Website (Optional)]" - } - }, - "author": "draft_email", - "content": { - "parts": [ - { - "text": "Subject: Regarding Your Phone Issue - How We Can Help - [Your Company Name]\n\nDear Valued Customer,\n\nThank you for reaching out to us. We're very sorry to hear that you're experiencing an issue with your phone. We understand how frustrating it can be when your device isn't working as expected, and we're here to help.\n\nTo assist you as quickly and effectively as possible, could you please provide a few more details about the situation? This will help us understand the problem and guide you towards the best solution.\n\nPlease tell us:\n\n1. **What is the model of your phone?** (e.g., iPhone 15, Samsung Galaxy S24, Google Pixel 8, etc.)\n2. **When did you purchase the phone?** (Rough date or year is fine if you don't have the exact date.)\n3. **Could you describe what happened and how the phone \"broke\"?** (e.g., \"It fell and the screen cracked,\" \"It won't turn on,\" \"It got wet,\" \"The battery stopped charging,\" \"It's stuck in a loop,\" etc.)\n4. **Have you already attempted any troubleshooting steps?** (e.g., restarting the phone, checking charging cables, etc.)\n\nOnce we have this information, our support team will be able to assess the situation, discuss potential solutions such as troubleshooting, repair options, or warranty service, and guide you through the next steps.\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call us at [Your Phone Number] during our business hours of [Your Business Hours].\n\nWe look forward to helping you resolve this issue soon.\n\nSincerely,\n\nThe Customer Support Team\n[Your Company Name]\n[Your Company Website (Optional)]" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "request_input_rerun@1/draft_email@1" - ], - "path": "request_input_rerun@1/draft_email@1" - } - }, - { - "author": "request_input_rerun", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "interruptId": "fc-1", - "message": "Please review the following draft email and provide 'approve', 'reject', or feedback to revise.\n\n---\nSubject: Regarding Your Phone Issue - How We Can Help - [Your Company Name]\n\nDear Valued Customer,\n\nThank you for reaching out to us. We're very sorry to hear that you're experiencing an issue with your phone. We understand how frustrating it can be when your device isn't working as expected, and we're here to help.\n\nTo assist you as quickly and effectively as possible, could you please provide a few more details about the situation? This will help us understand the problem and guide you towards the best solution.\n\nPlease tell us:\n\n1. **What is the model of your phone?** (e.g., iPhone 15, Samsung Galaxy S24, Google Pixel 8, etc.)\n2. **When did you purchase the phone?** (Rough date or year is fine if you don't have the exact date.)\n3. **Could you describe what happened and how the phone \"broke\"?** (e.g., \"It fell and the screen cracked,\" \"It won't turn on,\" \"It got wet,\" \"The battery stopped charging,\" \"It's stuck in a loop,\" etc.)\n4. **Have you already attempted any troubleshooting steps?** (e.g., restarting the phone, checking charging cables, etc.)\n\nOnce we have this information, our support team will be able to assess the situation, discuss potential solutions such as troubleshooting, repair options, or warranty service, and guide you through the next steps.\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call us at [Your Phone Number] during our business hours of [Your Business Hours].\n\nWe look forward to helping you resolve this issue soon.\n\nSincerely,\n\nThe Customer Support Team\n[Your Company Name]\n[Your Company Website (Optional)]\n---", - "payload": null, - "response_schema": null - }, - "id": "fc-1", - "name": "adk_request_input" - } - } - ] - }, - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-1" - ], - "nodeInfo": { - "path": "request_input_rerun@1/human_review@1" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-1", - "name": "adk_request_input", - "response": { - "result": "shorter" - } - } - } - ], - "role": "user" - }, - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "route": "revise", - "stateDelta": { - "feedback": "shorter" - } - }, - "author": "request_input_rerun", - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "request_input_rerun@1/human_review@1" - } - }, - { - "actions": { - "stateDelta": { - "draft": "Subject: Regarding Your Phone Issue - How We Can Help - [Your Company Name]\n\nDear Valued Customer,\n\nThank you for contacting us. We're sorry to hear about your phone issue and are ready to help.\n\nTo assist you efficiently, please provide the following details:\n\n1. **What is the model of your phone?** (e.g., iPhone 15, Samsung Galaxy S24)\n2. **When did you purchase the phone?** (Rough date or year is fine)\n3. **How did the phone \"break\"?** (e.g., screen cracked, won't turn on, got wet)\n4. **Have you attempted any troubleshooting steps?** (e.g., restarting, checking cables)\n\nWith this information, our team can better assess the problem and outline next steps (troubleshooting, repair, warranty).\n\nPlease reply to this email with the details. You can also call us at [Your Phone Number] during [Your Business Hours] if you prefer to speak directly.\n\nWe look forward to helping you resolve this soon.\n\nSincerely,\n\nThe Customer Support Team\n[Your Company Name]\n[Your Company Website (Optional)]" - } - }, - "author": "draft_email", - "content": { - "parts": [ - { - "text": "Subject: Regarding Your Phone Issue - How We Can Help - [Your Company Name]\n\nDear Valued Customer,\n\nThank you for contacting us. We're sorry to hear about your phone issue and are ready to help.\n\nTo assist you efficiently, please provide the following details:\n\n1. **What is the model of your phone?** (e.g., iPhone 15, Samsung Galaxy S24)\n2. **When did you purchase the phone?** (Rough date or year is fine)\n3. **How did the phone \"break\"?** (e.g., screen cracked, won't turn on, got wet)\n4. **Have you attempted any troubleshooting steps?** (e.g., restarting, checking cables)\n\nWith this information, our team can better assess the problem and outline next steps (troubleshooting, repair, warranty).\n\nPlease reply to this email with the details. You can also call us at [Your Phone Number] during [Your Business Hours] if you prefer to speak directly.\n\nWe look forward to helping you resolve this soon.\n\nSincerely,\n\nThe Customer Support Team\n[Your Company Name]\n[Your Company Website (Optional)]" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "request_input_rerun@1/draft_email@2" - ], - "path": "request_input_rerun@1/draft_email@2" - } - }, - { - "author": "request_input_rerun", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "interruptId": "fc-2", - "message": "Please review the following draft email and provide 'approve', 'reject', or feedback to revise.\n\n---\nSubject: Regarding Your Phone Issue - How We Can Help - [Your Company Name]\n\nDear Valued Customer,\n\nThank you for contacting us. We're sorry to hear about your phone issue and are ready to help.\n\nTo assist you efficiently, please provide the following details:\n\n1. **What is the model of your phone?** (e.g., iPhone 15, Samsung Galaxy S24)\n2. **When did you purchase the phone?** (Rough date or year is fine)\n3. **How did the phone \"break\"?** (e.g., screen cracked, won't turn on, got wet)\n4. **Have you attempted any troubleshooting steps?** (e.g., restarting, checking cables)\n\nWith this information, our team can better assess the problem and outline next steps (troubleshooting, repair, warranty).\n\nPlease reply to this email with the details. You can also call us at [Your Phone Number] during [Your Business Hours] if you prefer to speak directly.\n\nWe look forward to helping you resolve this soon.\n\nSincerely,\n\nThe Customer Support Team\n[Your Company Name]\n[Your Company Website (Optional)]\n---", - "payload": null, - "response_schema": null - }, - "id": "fc-2", - "name": "adk_request_input" - } - } - ] - }, - "id": "e-8", - "invocationId": "i-1", - "longRunningToolIds": [ - "fc-2" - ], - "nodeInfo": { - "path": "request_input_rerun@1/human_review@2" - } - }, - { - "author": "user", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "adk_request_input", - "response": { - "result": "approve" - } - } - } - ], - "role": "user" - }, - "id": "e-9", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "route": "approved" - }, - "author": "request_input_rerun", - "id": "e-10", - "invocationId": "i-1", - "nodeInfo": { - "path": "request_input_rerun@1/human_review@2" - } - }, - { - "author": "request_input_rerun", - "content": { - "parts": [ - { - "text": "Draft approved and sent successfully." - } - ], - "role": "user" - }, - "id": "e-11", - "invocationId": "i-1", - "nodeInfo": { - "path": "request_input_rerun@1/send_email@1" - } - } - ], - "id": "2daf1ec0-1582-419d-95e9-c5be7269e701", - "state": { - "__session_metadata__": { - "displayName": "phone broke" - }, - "complaint": "phone broke", - "draft": "Subject: Regarding Your Broken Phone\n\nDear [Customer Name],\n\nWe're very sorry to hear your phone has broken. We understand this is frustrating, and we want to help resolve it for you as quickly as possible.\n\nTo assist you best, please reply with some additional details:\n* Your phone's model\n* When you purchased it\n* A brief description of what happened\n* Whether it is currently under warranty\n\nYou can also find immediate support and repair options on our website here: [Link to Repair/Support Page]\n\nAlternatively, please feel free to call us directly at [Phone Number] if you prefer to speak with someone.\n\nWe appreciate your patience and look forward to helping.\n\nSincerely,\n\nThe [Your Company Name] Team", - "feedback": "shorter" - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/retry/README.md b/contributing/samples/workflows/retry/README.md deleted file mode 100644 index 0c86625b3b..0000000000 --- a/contributing/samples/workflows/retry/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# ADK Workflow Sample: Node Retries - -## Overview - -In real-world applications, interacting with external APIs, databases, or third-party services can occasionally result in transient failures (e.g., temporary network outages, rate limits, or bad gateways). - -The ADK framework allows you to easily handle these scenarios by wrapping the unreliable logic in a `@node` decorator configured with `RetryConfig`. If the node raises one of the expected exceptions, the workflow engine automatically pauses, waits for a backoff delay, and reschedules the node for another attempt. - -When a node raises an exception, the framework automatically emits an error event (with `error_code` and `error_message`) so the error is visible in the event stream. If the node has retry configured, it will be retried after the backoff delay. - -This sample demonstrates a `get_weather` node that intentionally fails randomly (70% chance) by raising an `HTTPError` representing a 500 Internal Server error. The framework gracefully recovers and eventually succeeds, passing the result to `report_weather`. - -## Graph - -```mermaid -graph TD - START --> get_weather[get_weather
Retries on HTTPError] - get_weather --> report_weather -``` - -## How To - -1. **Import `RetryConfig`**: Ensure you import the configuration class to set your retry parameters. - - ```python - from google.adk.workflow import RetryConfig - ``` - -1. **Configure the Decorator**: Apply the `@node` decorator to your Python function and specify the `retry_config` parameter with your desired logic (e.g., `max_attempts`, `initial_delay`). - - ```python - @node(retry_config=RetryConfig(max_attempts=5, initial_delay=1)) - def get_weather(ctx: Context) -> str: - # ... flaky logic here ... - ``` - - When an exception like `HTTPError` occurs, the ADK framework catches it, emits an error event, and processes the backoff delay automatically. As long as `max_attempts` hasn't been exceeded, the node executes again. - -1. **Track Retries (Optional)**: If you need to know which attempt the node is currently running, you can access `ctx.attempt_count` from the `Context`. - - ```python - yield Event(message=f"Getting weather... attempt {ctx.attempt_count}") - ``` diff --git a/contributing/samples/workflows/retry/agent.py b/contributing/samples/workflows/retry/agent.py deleted file mode 100644 index c8bb6fb986..0000000000 --- a/contributing/samples/workflows/retry/agent.py +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import random -from urllib.error import HTTPError - -from google.adk import Context -from google.adk import Event -from google.adk import Workflow -from google.adk.workflow import node -from google.adk.workflow import RetryConfig - - -@node(retry_config=RetryConfig(max_attempts=5, initial_delay=1)) -def get_weather(ctx: Context) -> str: - """A mock task that fails randomly.""" - - yield Event(message=f"Getting weather... attempt {ctx.attempt_count}") - if random.random() < 0.7: # 70% chance of failure - raise HTTPError( - url="http://mock-api.example.com", - code=500, - msg="Internal Server Error", - hdrs={}, - fp=None, - ) - - yield "sunny" - - -def report_weather(node_input: str): - yield Event(message=f"The weather is {node_input}") - - -root_agent = Workflow( - name="root_agent", - edges=[("START", get_weather, report_weather)], -) diff --git a/contributing/samples/workflows/retry/tests/go.json b/contributing/samples/workflows/retry/tests/go.json deleted file mode 100644 index fea19306dd..0000000000 --- a/contributing/samples/workflows/retry/tests/go.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "appName": "retry", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "go" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Getting weather... attempt 1" - } - ], - "role": "user" - }, - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/get_weather@1" - } - }, - { - "author": "root_agent", - "errorCode": "HTTPError", - "errorMessage": "HTTP Error 500: Internal Server Error", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/get_weather@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Getting weather... attempt 2" - } - ], - "role": "user" - }, - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/get_weather@1" - } - }, - { - "author": "root_agent", - "errorCode": "HTTPError", - "errorMessage": "HTTP Error 500: Internal Server Error", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/get_weather@1" - } - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "Getting weather... attempt 3" - } - ], - "role": "user" - }, - "id": "e-6", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/get_weather@1" - } - }, - { - "author": "root_agent", - "id": "e-7", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/get_weather@1" - ], - "path": "root_agent@1/get_weather@1" - }, - "output": "sunny" - }, - { - "author": "root_agent", - "content": { - "parts": [ - { - "text": "The weather is sunny" - } - ], - "role": "user" - }, - "id": "e-8", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/report_weather@1" - } - } - ], - "id": "c0e0c167-1e63-4e18-84b6-ad64ba59376f", - "mocks": { - "random.random": [ - 0.5, - 0.5, - 0.8 - ] - }, - "state": { - "__session_metadata__": { - "displayName": "go" - } - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/route/README.md b/contributing/samples/workflows/route/README.md deleted file mode 100644 index 66f54d8a5e..0000000000 --- a/contributing/samples/workflows/route/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# ADK Workflow Routing Sample - -## Overview - -This sample demonstrates how to use routing in **ADK Workflows**. - -It takes user input and uses an LLM node to categorize it as a **question**, a **statement**, or **other**. Based on the classification, it appropriately routes the execution to a specialized agent or function to handle that specific type of input. - -In ADK Workflows, **routing** allows conditionally executing different execution paths based on the output of a previous node. - -## Sample Inputs - -- `What is the capital of France?` - -- `The weather is very nice today.` - -- `Translate bonjour to english` - -## Graph - -```mermaid -graph TD - START --> process_input - process_input --> classify_input - classify_input --> route_on_category - route_on_category -->|question| answer_question - route_on_category -->|statement| comment_on_statement - route_on_category -->|other| handle_other -``` - -## How To - -1. A node (agent or function) yields an `Event` with a specific route name: - - ```python - yield Event(route="your_route_name") - ``` - -1. In the `Workflow` edges definition, conditional edges are constructed using a routing map dict as the second element of the edge tuple: - - ```python - (source_node, {"your_route_name": target_node}) - ``` diff --git a/contributing/samples/workflows/route/agent.py b/contributing/samples/workflows/route/agent.py deleted file mode 100644 index 1722e94de6..0000000000 --- a/contributing/samples/workflows/route/agent.py +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import Literal - -from google.adk import Agent -from google.adk import Event -from google.adk import Workflow -from pydantic import BaseModel - - -class InputCategory(BaseModel): - category: Literal["question", "statement", "other"] - - -def process_input(node_input: str): - return Event(state={"input": node_input}) - - -classify_input = Agent( - name="classify_input", - instruction=( - "Based on this input, decide which category it belongs to: {input}" - ), - output_schema=InputCategory, - output_key="category", -) - - -def route_on_category(category: InputCategory): - """Yields an Event with a specific route based on the classification.""" - yield Event(route=category.category) - - -answer_question = Agent( - name="answer_question", - instruction="""Answer the question: {input}""", -) - - -comment_on_statement = Agent( - name="comment_on_statement", - instruction="""Comment on the statement: {input}""", -) - - -def handle_other(): - yield Event( - message="Sorry I can only anwer questions or comment on statements." - ) - - -root_agent = Workflow( - name="root_agent", - edges=[ - ("START", process_input, classify_input, route_on_category), - ( - route_on_category, - { - "question": answer_question, - "statement": comment_on_statement, - "other": handle_other, - }, - ), - ], -) diff --git a/contributing/samples/workflows/route/tests/who_are_you.json b/contributing/samples/workflows/route/tests/who_are_you.json deleted file mode 100644 index 90426b1ca1..0000000000 --- a/contributing/samples/workflows/route/tests/who_are_you.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "appName": "route", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "who are you" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "stateDelta": { - "input": "who are you" - } - }, - "author": "root_agent", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/process_input@1" - } - }, - { - "actions": { - "stateDelta": { - "category": { - "category": "question" - } - } - }, - "author": "classify_input", - "content": { - "parts": [ - { - "text": "{\"category\": \"question\"}" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/classify_input@1" - ], - "path": "root_agent@1/classify_input@1" - } - }, - { - "actions": { - "route": "question" - }, - "author": "root_agent", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "path": "root_agent@1/route_on_category@1" - } - }, - { - "author": "answer_question", - "content": { - "parts": [ - { - "text": "I am a large language model, trained by Google." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/answer_question@1", - "root_agent@1" - ], - "path": "root_agent@1/answer_question@1" - } - } - ], - "id": "f1ec33bf-99ef-49a5-b64a-e4d31f85db85", - "state": { - "__session_metadata__": { - "displayName": "who are you" - }, - "category": { - "category": "question" - }, - "input": "who are you" - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/sequence/README.md b/contributing/samples/workflows/sequence/README.md deleted file mode 100644 index 42ef9f46e7..0000000000 --- a/contributing/samples/workflows/sequence/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# ADK Workflow Sequence Sample - -## Overview - -This sample demonstrates how to create a simple sequential workflow with **ADK Workflows**. - -It connects two LLM agents in a chain. The first agent (`generate_fruit_agent`) is instructed to return the name of a random fruit. The output of this agent becomes the input for the second agent (`generate_benefit_agent`), which then tells a health benefit about that specific fruit. - -In a sequence, the execution flows unconditionally from one node to the next in the order they are defined. - -## Sample Inputs - -This sample does not require any input to run. - -## Graph - -```mermaid -graph TD - START --> generate_fruit_agent - generate_fruit_agent --> generate_benefit_agent -``` - -## How To - -1. Define the agents or functions that will make up the steps in your sequence. - - ```python - generate_fruit_agent = Agent(...) - generate_benefit_agent = Agent(...) - ``` - -1. Pass a tuple of three or more elements to `edges` to define an unconditional sequence starting from the first element and passing through each subsequent node in order. - - ```python - Workflow( - name="root_agent", - edges=[("START", generate_fruit_agent, generate_benefit_agent)], - ) - ``` diff --git a/contributing/samples/workflows/sequence/__init__.py b/contributing/samples/workflows/sequence/__init__.py deleted file mode 100644 index 4015e47d6e..0000000000 --- a/contributing/samples/workflows/sequence/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from . import agent diff --git a/contributing/samples/workflows/sequence/agent.py b/contributing/samples/workflows/sequence/agent.py deleted file mode 100644 index 594d8a900c..0000000000 --- a/contributing/samples/workflows/sequence/agent.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Sample workflow for simple sequential workflow with LLM agents.""" - -from google.adk import Agent -from google.adk import Workflow - -generate_fruit_agent = Agent( - name="generate_fruit_agent", - instruction="""Return the name of a random fruit. - Return only the name, nothing else.""", -) - -generate_benefit_agent = Agent( - name="generate_benefit_agent", - instruction="""Tell me a health benefit about the specified fruit.""", -) - - -root_agent = Workflow( - name="root_agent", - edges=[("START", generate_fruit_agent, generate_benefit_agent)], -) diff --git a/contributing/samples/workflows/sequence/tests/go.json b/contributing/samples/workflows/sequence/tests/go.json deleted file mode 100644 index 62bb7241dd..0000000000 --- a/contributing/samples/workflows/sequence/tests/go.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "appName": "sequence", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "go" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "generate_fruit_agent", - "content": { - "parts": [ - { - "text": "Apple" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/generate_fruit_agent@1" - ], - "path": "root_agent@1/generate_fruit_agent@1" - } - }, - { - "author": "generate_benefit_agent", - "content": { - "parts": [ - { - "text": "Apples are a good source of **dietary fiber**, particularly soluble fiber like pectin. This can help with digestion, promote a feeling of fullness (aiding in weight management), and may contribute to lowering cholesterol levels." - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/generate_benefit_agent@1", - "root_agent@1" - ], - "path": "root_agent@1/generate_benefit_agent@1" - } - } - ], - "id": "0e5ab646-61d6-49cd-b058-24fde0afebae", - "state": { - "__session_metadata__": { - "displayName": "go" - } - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/state/README.md b/contributing/samples/workflows/state/README.md deleted file mode 100644 index cf4d9845fe..0000000000 --- a/contributing/samples/workflows/state/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# ADK Workflow State Sample - -## Overview - -This sample demonstrates different ways to manage state in an **ADK Workflow**. State is a dictionary shared across all nodes in the workflow execution, useful for gathering information across multiple steps without passing everything directly from one node's output to another's input. - -In this sample, we show four techniques: - -1. Updating state via direct dictionary mutation: `ctx.state["key"] = "value"` -1. Updating state by yielding an event: `yield Event(state={"key": "value"})` -1. Reading state via direct dictionary access: `ctx.state["key"]` -1. Reading state via automatic parameter injection: `def func(key: str): ...` - -## Sample Inputs - -- `Hello ADK!` - -- `Testing state management.` - -## Graph - -```mermaid -graph TD - START --> process_initial_input - process_initial_input --> update_state_via_event - update_state_via_event --> read_state_via_ctx - read_state_via_ctx --> read_state_via_param -``` - -## How To - -1. **Update state via direct mutation:** Access the context and modify `ctx.state` directly. - - ```python - def process_initial_input(ctx, node_input: str): - ctx.state["original_text"] = node_input - ``` - -1. **Update state via Event:** Yield an `Event` object with a `state` delta dictionary. - - ```python - def update_state_via_event(node_input: str): - yield Event( - state={"uppercased_text": node_input.upper()} - ) - ``` - -1. **Read state via context:** Retrieve values from `ctx.state`. - - ```python - def read_state_via_ctx(ctx): - original = ctx.state["original_text"] - ``` - -1. **Read state via parameter injection:** Declare a function parameter that matches the key in the workflow state, and ADK will automatically populate it. - - ```python - def read_state_via_param(appended_text: str): - return f"Final Result: {appended_text}!" - ``` diff --git a/contributing/samples/workflows/state/agent.py b/contributing/samples/workflows/state/agent.py deleted file mode 100644 index 34e8038582..0000000000 --- a/contributing/samples/workflows/state/agent.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -from google.adk import Event -from google.adk import Workflow - - -def process_initial_input(ctx, node_input: str): - """Takes initial input and sets it in state via direct dict modification.""" - ctx.state["original_text"] = node_input - return node_input - - -def update_state_via_event(node_input: str): - """Returns an Event that implicitly updates the shared workflow state.""" - yield Event(state={"uppercased_text": node_input.upper()}) - - -def read_state_via_ctx(ctx): - """Reads a state variable via direct dictionary access and appends to it.""" - original = ctx.state["original_text"] - uppercased = ctx.state["uppercased_text"] - - result = f"{uppercased} (Original was: {original})" - ctx.state["appended_text"] = result - return result - - -def read_state_via_param(appended_text: str): - """Reads a state variable via automatic parameter injection.""" - return f"Final Result: {appended_text}!" - - -root_agent = Workflow( - name="state_sample", - edges=[ - ( - "START", - process_initial_input, - update_state_via_event, - read_state_via_ctx, - read_state_via_param, - ), - ], -) diff --git a/contributing/samples/workflows/state/tests/go.json b/contributing/samples/workflows/state/tests/go.json deleted file mode 100644 index 024ed14108..0000000000 --- a/contributing/samples/workflows/state/tests/go.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "appName": "state", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "go" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "actions": { - "stateDelta": { - "original_text": "go" - } - }, - "author": "state_sample", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "state_sample@1/process_initial_input@1" - ], - "path": "state_sample@1/process_initial_input@1" - }, - "output": "go" - }, - { - "actions": { - "stateDelta": { - "uppercased_text": "GO" - } - }, - "author": "state_sample", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "state_sample@1/update_state_via_event@1" - } - }, - { - "actions": { - "stateDelta": { - "appended_text": "GO (Original was: go)" - } - }, - "author": "state_sample", - "id": "e-4", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "state_sample@1/read_state_via_ctx@1" - ], - "path": "state_sample@1/read_state_via_ctx@1" - }, - "output": "GO (Original was: go)" - }, - { - "author": "state_sample", - "id": "e-5", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "state_sample@1/read_state_via_param@1", - "state_sample@1" - ], - "path": "state_sample@1/read_state_via_param@1" - }, - "output": "Final Result: GO (Original was: go)!" - } - ], - "id": "89d894be-5d57-4d5c-9a29-ccc15b3b5eb7", - "state": { - "__session_metadata__": { - "displayName": "go" - }, - "appended_text": "GO (Original was: go)", - "original_text": "go", - "uppercased_text": "GO" - }, - "userId": "user" -} diff --git a/contributing/samples/workflows/use_as_output/README.md b/contributing/samples/workflows/use_as_output/README.md deleted file mode 100644 index 1140398116..0000000000 --- a/contributing/samples/workflows/use_as_output/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# ADK Workflow use_as_output Sample - -## Overview - -This sample demonstrates how to use `ctx.run_node(node, use_as_output=True)` to delegate a node's output to a dynamically executed child node. - -When `use_as_output=True` is set, the child node's output replaces the parent's output. The parent's own output event is suppressed to avoid duplication, and the child's output flows downstream through the graph as if the parent produced it. - -The child node can be any node type — this sample uses a single_turn LLM agent (`summarizer`) as the delegated child. - -## Sample Inputs - -- `The quick brown fox jumped over the lazy dog near the riverbank on a warm summer afternoon` - -## Graph - -```mermaid -graph TD - START --> orchestrate - orchestrate -.->|delegates output via ctx.run_node| summarizer - summarizer --> finalize -``` - -## How To - -1. **Define the child node**: The child can be a function or an LLM agent. Its output becomes the parent's output and flows to downstream nodes. - - ```python - from google.adk import Agent - - summarizer = Agent( - name='summarizer', - model='gemini-2.5-flash', - instruction='Summarize the following text in one sentence.', - ) - ``` - -1. **Mark the orchestrator as rerun_on_resume**: The parent node that calls `ctx.run_node` must use `@node(rerun_on_resume=True)`. - - ```python - from google.adk.workflow import node - - @node(rerun_on_resume=True) - async def orchestrate(ctx: Context, node_input: str) -> str: - return await ctx.run_node( - summarizer, node_input=node_input, use_as_output=True - ) - ``` - -1. **Downstream receives delegated output**: The `finalize` node receives the LLM's summary as its `node_input`, not the parent's. - - ```python - def finalize(node_input: str) -> str: - return f'final: {node_input}' - ``` diff --git a/contributing/samples/workflows/use_as_output/agent.py b/contributing/samples/workflows/use_as_output/agent.py deleted file mode 100644 index 9516fedcec..0000000000 --- a/contributing/samples/workflows/use_as_output/agent.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from google.adk import Agent -from google.adk import Context -from google.adk.workflow import node -from google.adk.workflow import Workflow -from google.adk.workflow._base_node import START - -summarizer = Agent( - name='summarizer', - instruction='Summarize the following text in one sentence.', -) - - -@node(rerun_on_resume=True) -async def orchestrate(ctx: Context, node_input: str) -> str: - return await ctx.run_node( - summarizer, node_input=node_input, use_as_output=True - ) - - -def finalize(node_input: str) -> str: - return f'final: {node_input}' - - -root_agent = Workflow( - name='root_agent', - edges=[(START, orchestrate, finalize)], -) diff --git a/contributing/samples/workflows/use_as_output/tests/go.json b/contributing/samples/workflows/use_as_output/tests/go.json deleted file mode 100644 index ebda898a6a..0000000000 --- a/contributing/samples/workflows/use_as_output/tests/go.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "appName": "use_as_output", - "events": [ - { - "author": "user", - "content": { - "parts": [ - { - "text": "go" - } - ], - "role": "user" - }, - "id": "e-1", - "invocationId": "i-1", - "nodeInfo": { - "path": "" - } - }, - { - "author": "summarizer", - "content": { - "parts": [ - { - "text": "Please provide the text you would like me to summarize!" - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-2", - "invocationId": "i-1", - "nodeInfo": { - "messageAsOutput": true, - "outputFor": [ - "root_agent@1/orchestrate@1/summarizer@1", - "root_agent@1/orchestrate@1" - ], - "path": "root_agent@1/orchestrate@1/summarizer@1" - } - }, - { - "author": "root_agent", - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "outputFor": [ - "root_agent@1/finalize@1", - "root_agent@1" - ], - "path": "root_agent@1/finalize@1" - }, - "output": "final: Please provide the text you would like me to summarize!" - } - ], - "id": "ba40366e-0563-469f-a4b2-09e007adf6ff", - "state": { - "__session_metadata__": { - "displayName": "go" - } - }, - "userId": "user" -} diff --git a/docs/design/cli/api_server/abort.md b/docs/design/cli/api_server/abort.md deleted file mode 100644 index d362c1e7af..0000000000 --- a/docs/design/cli/api_server/abort.md +++ /dev/null @@ -1,120 +0,0 @@ -# Design: Connection-Drop Abort Mechanism in ADK API Server - -## Problem Statement - -In web-based AI agent applications, users frequently interrupt or navigate away from long-running operations. For example, a user might close their browser tab, refresh the page, or click a "Stop" button in the middle of a 30-second multi-step agent workflow. - -Under traditional REST API handlers in FastAPI/Starlette, standard synchronous or asynchronous POST request handlers are executed to completion in the background, even if the client terminates the TCP connection early. This creates: -1. **API Key & Token Leaks**: The backend continues to run expensive LLM generation calls (such as Gemini API queries) that are never delivered to anyone. -2. **Resource Leaks**: Database connections, locked directories, and long-running sandbox tools (such as sandboxed bash executions) continue to run, consuming system threads and database handles. -3. **State Pollution**: The session events stream continues to append half-generated models or state deltas that pollute the session history database, making session rehydration unstable. - ---- - -## Technical Architecture - -The ADK implements a unified cooperative multitasking architecture to monitor, intercept, and propagate cancellations immediately on TCP disconnections across all supported transport protocols: - -``` - +-----------------------+ - | HTTP Client Drop | - +-----------+-----------+ - | - +------------------------+------------------------+ - | | | - [WS: /run_live] [SSE: /run_sse] [REST: /run] - | | | - WebSocketDisconnect Task Group Cancellation ASGI http.disconnect - | | | - +------------------------+------------------------+ - | - Task Cancellation raised - | - v - asyncio.CancelledError - | - +------------------------+------------------------+ - | | - v v - Active Node Teardown Active Tool Abortion - (agen.aclose() -> GeneratorExit) (try/except asyncio.CancelledError) -``` - -### 1. WebSocket Duplexing (`/run_live`) -During standard bidirectional streaming, the endpoint handler runs two parallel tasks inside an `asyncio.wait` block: a receiver loop and a transmitter loop. Client-side socket drop is natively handled: -* The receiver loop's `websocket.receive_text()` call instantly raises a `WebSocketDisconnect` exception. -* This terminates the receiver task, which signals the wait group to cancel the pending transmitter task concurrently. -* The cancellation propagates down to the underlying `run_live` generator, closing all tasks. - -### 2. Server-Sent Events (`/run_sse`) -For event streaming, the `/run_sse` endpoint delegates consumption to a `StreamingResponse` object: -* Starlette's `StreamingResponse` runs a concurrent task group that blocks on the raw ASGI receive channel (`http.disconnect` receiver) while iterating over the generator. -* The moment the TCP socket closes, the disconnect monitor fires, cancelling the active iteration task. -* The generator's `__anext__` raises a `CancelledError`, triggering full generator close (`aclose()`), which terminates the background workflow engine. - -### 3. Simple REST POST Request (`/run`) -Standard REST endpoint execution lacks any default connection monitoring inside FastAPI. To resolve this, we designed and implemented a **0% CPU Blocking Monitor** mechanism inside `/run`: - -```mermaid -sequenceDiagram - autonumber - actor Client - participant Server as REST API Handler - participant Monitor as Disconnect Monitor (Task) - participant Worker as Agent Worker (Task) - participant Engine as ADK Runner Engine - - Client->>Server: POST /run (Payload) - Note over Server: FastAPI parses full request body.
ASGI receive queue is now exhausted of body data. - - create participant Monitor - Server->>Monitor: spawn monitor() - Note over Monitor: Calls request.receive()
Blocks asynchronously (0% CPU) - - create participant Worker - Server->>Worker: spawn worker() - Worker->>Engine: runner.run_async() - Engine-->>Worker: Yields Event 1 - - Client-XServer: Client drops TCP socket connection! - Note over Server: Uvicorn inserts 'http.disconnect' event into ASGI receive queue. - - Monitor->>Monitor: request.receive() wakes up instantly! - Note over Monitor: Message type matches 'http.disconnect' - Monitor->>Worker: worker_task.cancel() - - Worker->>Engine: Cancels pending await checkpoint - Note over Engine: task.cancel() propagates CancelledError.
Aclosing context manager exits.
Generator Exit clears all subtasks. - - destroy Worker - Worker-->>Server: Raises asyncio.CancelledError - - destroy Monitor - Server->>Monitor: monitor_task.cancel() (finally block) - - Server->>Server: Checks request.is_disconnected() -> True - Server-->>Client: Returns HTTP 499 (Client Closed Request) -``` - -#### Cooperative Concurrency Model -The endpoint handler isolates the synchronous iteration of the `run_async` generator into a nested coroutine called `worker()` and schedules it as an independent `asyncio.Task`: - -```python -worker_task = asyncio.create_task(worker()) -``` - -#### Non-Polling Disconnect Monitor -Concurrently, it launches a `monitor()` task that calls: - -```python -message = await request.receive() -``` - -* **ASGI Buffer Property**: Because standard FastAPI body parameters are fully resolved and parsed prior to the path handler's invocation, the ASGI receive queue has been completely exhausted of request payload. Under the ASGI specification, the *only* subsequent message that can arrive on the queue is `http.disconnect` when the connection is closed. -* **Zero CPU Consumption**: Calling `request.receive()` blocks asynchronously inside the event loop, consuming **0% CPU** (unlike periodic polling loops utilizing `await request.is_disconnected()` with `asyncio.sleep()`, which incur latency and execution overhead). -* **Instant Interruption**: When the TCP connection is closed, the ASGI server immediately pushes a `{"type": "http.disconnect"}` message into the receive channel. The monitor task wakes up instantly and invokes `worker_task.cancel()`. - -#### Clean Termination & 499 Response Serialization -* **Task Cancel Propagation**: Cancelling `worker_task` raises `asyncio.CancelledError` inside whatever asynchronous task the workflow runner is currently awaiting (such as standard `httpx` Gemini API calls, database reads, or sandbox tool execution). -* **Generator Cleanup**: The cancellation bubbles up to the handler's `Aclosing(runner.run_async(...))` context manager (where `Aclosing` is a backward-compatibility re-export of Python's standard `contextlib.aclosing`). Exiting the block triggers `aclose()`, throwing a `GeneratorExit` inside the generator. The `finally` block in the runner immediately cancels the underlying root node execution task, resolving all background scheduler closures. -* **Graceful Suppression**: If `asyncio.CancelledError` is allowed to bubble up out of the FastAPI application, Uvicorn logs an ugly and alarming stack trace (`ERROR: Exception in ASGI application`). To prevent log pollution, our handler catches the `CancelledError`, validates that the connection was indeed dropped via `await request.is_disconnected()`, and returns a clean, standard `Response(status_code=499)` (**Client Closed Request**). In FastAPI, returning a custom Response object bypasses serialization type validation and halts error propagation cleanly, resulting in a clean traceback-free log. diff --git a/docs/guides/cli/api_server/abort.md b/docs/guides/cli/api_server/abort.md deleted file mode 100644 index 847ca042f4..0000000000 --- a/docs/guides/cli/api_server/abort.md +++ /dev/null @@ -1,108 +0,0 @@ -# Guide: Handling and Triggering Agent Aborts - -## Overview - -When running sophisticated AI agents under microservice backends, operations are highly asynchronous, long-running, and token-expensive. A user navigating away from the page, refreshing their browser, or closing their tab should not trigger background leakage. - -The Agent Development Kit (ADK) features cooperative multitasking capabilities designed to immediately **abort agent execution upon client disconnections or programmatic cancellations**. - -This guide covers: -- When agent run aborts are triggered. -- How to handle task abortion inside custom agents and tools. -- How to test and trigger connection drops using our code, standard Dev UI browser, or cURL. - ---- - -## When Agent Execution Will Abort - -The ADK framework tracks connection lifecycles across all communication interfaces. The running agent execution is immediately aborted under any of the following boundaries: - -1. **Simple HTTP REST Disconnect**: When requesting the POST `/run` endpoint, the API Server hosts a background monitor task. If the TCP connection is severed early, the server detects the drop, cancels the backend task, and returns a clean `499 Client Closed Request` status. -2. **SSE Streaming Disconnect**: When streaming Server-Sent Events on `/run_sse`, Starlette's custom `StreamingResponse` runs a concurrent task group that monitors client disconnect. Termination of the stream halts the generator and triggers target task cleanup. -3. **WebSocket Closure**: During live speech/text duplexing on `/run_live`, client connection loss raises a `WebSocketDisconnect` exception inside the message processing loop, immediately shutting down the active speech generator. -4. **Local Thread/Task Cancellation**: If running the SDK locally inside a Python loop, calling `.cancel()` on the driver task (or calling `aclose()` on the `run_async` async generator) cleanly terminates active workflow executions. - ---- - -## How to Handle Aborts in Your Agent - -Because the ADK runtime processes workflows, nodes, and tool runs in a standard `asyncio` task environment, a cancellation event is propagated as a standard Python `asyncio.CancelledError` raised at the active coroutine's nearest `await` checkpoint. - -If you author custom async agents, nodes, or tools, you must write cooperatively to ensure clean releases. - -### 1. Resource Releases & Transaction Rollbacks -If your tool locks local directories, writes files, or interfaces with external databases, you should catch `asyncio.CancelledError` inside your tool logic to roll back changes: - -```python -import asyncio -from google.adk import Context - -async def count_and_write(ctx: Context, count_to: int) -> str: - try: - await ctx.run_node(lock_directory_node) - - for i in range(1, count_to + 1): - await asyncio.sleep(1) # <- Await point where CancelledError is raised on disconnect - await ctx.run_node(write_progress_node) - - return "Done!" - except asyncio.CancelledError: - # 1. Clean up local state - print("[Tool] Cancellation intercepted! Releasing sandbox locks...", flush=True) - await ctx.run_node(release_locks_node) - - # 2. CRITICAL: Always re-raise CancelledError to let the runtime teardown successfully! - raise -``` - -### 2. Automatic Context Closures -If utilizing database pools, HTTP clients (such as `httpx.AsyncClient`), or sandbox clients that implement asynchronous context managers, the python runtime handles releases automatically when a cancellation occurs: - -```python -import httpx - -async def fetch_analytics_tool() -> str: - async with httpx.AsyncClient() as client: - # If the task is aborted during request execution, the context manager's - # __aexit__ method is guaranteed to run, closing network handles immediately! - response = await client.get("https://api.analytics.com/data") - return response.text -``` - ---- - -## How to Trigger and Test Aborts - -### 1. Programmatic Cancellation in Code - -When consuming the runner in Python, the `run_async` method returns an `AsyncGenerator`. To ensure that any early exits (such as breaking out of the loop, executing a `return` statement, or encountering an uncaught exception) propagate cleanup successfully, you should wrap the generator in Python's standard **`contextlib.aclosing`** context manager (available in standard library since Python 3.10). Exiting the block immediately invokes the generator's `aclose()` method: - -```python -from contextlib import aclosing - -async with aclosing(runner.run_async(...)) as agen: - async for event in agen: - if stop_condition_met: - break # Exiting the block immediately triggers aclose() under the hood! -``` - -#### ⚠️ Critical: Consequences of Not Using `aclosing` - -If you do not wrap the async generator in a context manager like `aclosing` and exit the loop early, you trigger severe resource and token leaks: - -1. **Suspended State & Deferred Teardown**: In accordance with the Async Generator Specification ([PEP 525](https://peps.python.org/pep-0525/)), exiting an `async for` loop early leaves the generator object **alive and suspended** in a memory reference scope. Python does *not* immediately run teardown logic at loop exit; instead, finalization is deferred entirely until the next **Garbage Collection (GC)** sweep. -2. **Leaked Background Agent Invocations**: Because the generator remains active and suspended, the ADK runner's background driving task continues to run concurrently in the event loop. The agent will continue to invoke expensive LLM API models, run sandbox tools, and pollute session states in the background for seconds, minutes, or ever (if a reference cycle blocks GC finalization), resulting in major production resource drains and billing leakages. -3. **Finalization Warning Pollution**: When the Garbage Collector eventually sweeps and finalizes the generator, if the main loop or executing thread has already shut down or migrated contexts, finalization will fail, and Python will pollute your server standard error streams with alarming warnings: - `RuntimeWarning: coroutine 'AsyncGenerator.aclose' was never awaited` - `RuntimeError: generator ignored GeneratorExit` - -By wrapping the stream in `aclosing(...)`, you guarantee that `await generator.aclose()` is executed **instantly, synchronously, and deterministically within the current call frame**, terminating the running task tree and all API calls immediately. - -### 2. Live Testing and Verification - -To see a live demonstration of connection-drop aborts and to test this behavior yourself, refer to the [Abort Agent Sample README](../../../../contributing/samples/core/abort/README.md). - -The sample provides a complete agent and instructions to test the cancellation behavior using: -- **The local terminal CLI** -- **A cURL request** -- **The ADK Web developer interface (Dev UI)** diff --git a/pyproject.toml b/pyproject.toml index fe33e65229..0e7c449b9f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,85 +33,69 @@ classifiers = [ dynamic = [ "version" ] dependencies = [ - "aiosqlite>=0.21", - "authlib>=1.6.6,<2", - "click>=8.1.8,<9", - "fastapi>=0.133,<1", - "google-auth[pyopenssl]>=2.47", - "google-genai>=2.4,<3", - "graphviz>=0.20.2,<1", - "httpx>=0.27,<1", - "jsonschema>=4.23,<5", - "opentelemetry-api>=1.36,<=1.41.1", + "aiosqlite>=0.21", # For SQLite database + "anyio>=4.9,<5", # For MCP Session Manager + "authlib>=1.6.6,<2", # For RestAPI Tool + "click>=8.1.8,<9", # For CLI tools + "fastapi>=0.124.1,<1", # FastAPI framework + "google-api-python-client>=2.157,<3", # Google API client discovery + "google-auth[pyopenssl]>=2.47", # Google Auth library + "google-cloud-aiplatform[agent-engines]>=1.148.1,<2", # For VertexAI integrations, e.g. example store. + "google-cloud-bigquery>=2.2", + "google-cloud-bigquery-storage>=2", + "google-cloud-bigtable>=2.32", # For Bigtable database + "google-cloud-dataplex>=1.7,<3", # For Dataplex Catalog Search tool + "google-cloud-discoveryengine>=0.13.12,<0.14", # For Discovery Engine Search Tool + "google-cloud-pubsub>=2,<3", # For Pub/Sub Tool + "google-cloud-secret-manager>=2.22,<3", # Fetching secrets in RestAPI Tool + "google-cloud-spanner>=3.56,<4", # For Spanner database + "google-cloud-speech>=2.30,<3", # For Audio Transcription + "google-cloud-storage>=2.18,<4", # For GCS Artifact service + "google-genai>=1.72,<2", # Google GenAI SDK + "graphviz>=0.20.2,<1", # Graphviz for graph rendering + "httpx>=0.27,<1", # HTTP client library + "jsonschema>=4.23,<5", # Agent Builder config validation + "mcp>=1.24,<2", # For MCP Toolset + "opentelemetry-api>=1.36,<=1.41.1", # OpenTelemetry - allow 1.39+ up to latest published at time of resolution. + "opentelemetry-exporter-gcp-logging>=1.9.0a0,<=1.12.0a0", + "opentelemetry-exporter-gcp-monitoring>=1.9.0a0,<2", + "opentelemetry-exporter-gcp-trace>=1.9,<2", + "opentelemetry-exporter-otlp-proto-http>=1.36", + "opentelemetry-resourcedetector-gcp>=1.9.0a0,<2", "opentelemetry-sdk>=1.36,<=1.41.1", - "packaging>=21", - "pydantic>=2.12,<3", - "python-dotenv>=1,<2", - "python-multipart>=0.0.9,<1", - # go/keep-sorted start - "pyyaml>=6.0.2,<7", + "pyarrow>=14", + "pydantic>=2.12,<3", # For data validation/models + "python-dateutil>=2.9.0.post0,<3", # For Vertext AI Session Service + "python-dotenv>=1,<2", # To manage environment variables + "pyyaml>=6.0.2,<7", # For APIHubToolset. "requests>=2.32.4,<3", - "starlette>=1.0.1,<2", - "tenacity>=9,<10", + "sqlalchemy>=2,<3", # SQL database ORM + "sqlalchemy-spanner>=1.14", # Spanner database session service + "starlette>=0.49.1,<1", # For FastAPI CLI + "tenacity>=9,<10", # For Retry management "typing-extensions>=4.5,<5", - "tzlocal>=5.3,<6", - "uvicorn>=0.34,<1", - "watchdog>=6,<7", - "websockets>=15.0.1,<16", - # go/keep-sorted end + "tzlocal>=5.3,<6", # Time zone utilities + "uvicorn>=0.34,<1", # ASGI server for FastAPI + "watchdog>=6,<7", # For file change detection and hot reload + "websockets>=15.0.1,<16", # For BaseLlmFlow ] - optional-dependencies.a2a = [ "a2a-sdk>=0.3.4,<0.4", ] optional-dependencies.agent-identity = [ "google-cloud-iamconnectorcredentials>=0.1,<0.2", ] -optional-dependencies.all = [ - "anyio>=4.9,<5", - "google-api-python-client>=2.157,<3", - "google-cloud-aiplatform[agent-engines]>=1.148.1,<2", - "google-cloud-bigquery>=2.2", - "google-cloud-bigquery-storage>=2", - "google-cloud-bigtable>=2.32", - "google-cloud-dataplex>=1.7,<3", - "google-cloud-discoveryengine>=0.13.12,<0.14", - "google-cloud-pubsub>=2,<3", - "google-cloud-resource-manager>=1.12,<2", - "google-cloud-secret-manager>=2.22,<3", - "google-cloud-spanner>=3.56,<4", - "google-cloud-speech>=2.30,<3", - "google-cloud-storage>=2.18,<4", - "mcp>=1.24,<2", - "opentelemetry-exporter-gcp-logging>=1.9.0a0,<=1.12.0a0", - "opentelemetry-exporter-gcp-monitoring>=1.9.0a0,<2", - "opentelemetry-exporter-gcp-trace>=1.9,<2", - "opentelemetry-exporter-otlp-proto-http>=1.36", - "opentelemetry-resourcedetector-gcp>=1.9.0a0,<2", - "pyarrow>=14", - "python-dateutil>=2.9.0.post0,<3", - "sqlalchemy>=2,<3", - "sqlalchemy-spanner>=1.14", -] - optional-dependencies.community = [ "google-adk-community", ] -optional-dependencies.db = [ - "sqlalchemy>=2,<3", - "sqlalchemy-spanner>=1.14", -] - optional-dependencies.dev = [ "flit>=3.10", + "isort>=6", "mypy>=1.15", "pre-commit>=4", "pyink>=25.12", "pylint>=2.6", - "tox>=4.23.2", - "tox-uv>=1.33.2", ] - optional-dependencies.docs = [ "autodoc-pydantic", "furo", @@ -121,7 +105,6 @@ optional-dependencies.docs = [ "sphinx-click", "sphinx-rtd-theme", ] - optional-dependencies.eval = [ "gepa>=0.1", "google-cloud-aiplatform[evaluation]>=1.148", @@ -130,7 +113,7 @@ optional-dependencies.eval = [ "rouge-score>=0.1.2", "tabulate>=0.9", ] - +# Optional extensions optional-dependencies.extensions = [ "anthropic>=0.78", # For anthropic model support; 0.78 introduced ThinkingConfigAdaptiveParam (required for Claude Opus 4.7). "beautifulsoup4>=3.2.2", # For load_web_page tool. @@ -138,109 +121,43 @@ optional-dependencies.extensions = [ "docker>=7", # For ContainerCodeExecutor "google-cloud-firestore>=2.11,<3", # For Firestore services "google-cloud-parametermanager>=0.4,<1", - "k8s-agent-sandbox>=0.1.1.post3", - "kubernetes>=29", - "langgraph>=0.2.60,<0.4.8", - "litellm>=1.83.7,<=1.83.14", - "llama-index-embeddings-google-genai>=0.3", - "llama-index-readers-file>=0.4", - "lxml>=5.3", - "pypika>=0.50", - "toolbox-adk>=1,<2", -] - -optional-dependencies.gcp = [ - "google-cloud-aiplatform[agent-engines]>=1.148.1,<2", - "google-cloud-bigquery>=2.2", - "google-cloud-bigquery-storage>=2", - "google-cloud-bigtable>=2.32", - "google-cloud-dataplex>=1.7,<3", - "google-cloud-discoveryengine>=0.13.12,<0.14", - "google-cloud-pubsub>=2,<3", - "google-cloud-resource-manager>=1.12,<2", - "google-cloud-secret-manager>=2.22,<3", - "google-cloud-spanner>=3.56,<4", - "google-cloud-speech>=2.30,<3", - "google-cloud-storage>=2.18,<4", - "opentelemetry-exporter-gcp-logging>=1.9.0a0,<=1.12.0a0", - "opentelemetry-exporter-gcp-monitoring>=1.9.0a0,<2", - "opentelemetry-exporter-gcp-trace>=1.9,<2", - "opentelemetry-exporter-otlp-proto-http>=1.36", - "opentelemetry-resourcedetector-gcp>=1.9.0a0,<2", - "pyarrow>=14", - "python-dateutil>=2.9.0.post0,<3", -] - -optional-dependencies.mcp = [ - "anyio>=4.9,<5", - "mcp>=1.24,<2", -] - -optional-dependencies.otel-gcp = [ - "opentelemetry-instrumentation-google-genai>=0.6b0,<1", - "opentelemetry-instrumentation-grpc>=0.43b0,<1", - "opentelemetry-instrumentation-httpx>=0.54b0,<1", -] + "k8s-agent-sandbox>=0.1.1.post3", # For GkeCodeExecutor sandbox mode + "kubernetes>=29", # For GkeCodeExecutor + "langgraph>=0.2.60,<0.4.8", # For LangGraphAgent + "litellm>=1.83.7,<=1.83.14", # For LiteLlm class. Lower bound: 5 CVE patches (2026-04). Upper bound pinned to current latest; bump deliberately. See #5488. + "llama-index-embeddings-google-genai>=0.3", # For files retrieval using LlamaIndex. + "llama-index-readers-file>=0.4", # For retrieval using LlamaIndex. + "lxml>=5.3", # For load_web_page tool. + "pypika>=0.50", # For crewai->chromadb dependency + "toolbox-adk>=1,<2", # For tools.toolbox_toolset.ToolboxToolset +] +optional-dependencies.otel-gcp = [ "opentelemetry-instrumentation-google-genai>=0.6b0,<1" ] optional-dependencies.slack = [ "slack-bolt>=1.22" ] optional-dependencies.test = [ "a2a-sdk>=0.3,<0.4", "anthropic>=0.78", # For anthropic model tests; 0.78 introduced ThinkingConfigAdaptiveParam (required for Claude Opus 4.7). - "anyio>=4.9,<5", "crewai[tools]; python_version>='3.11' and python_version<'3.12'", # For CrewaiTool tests; chromadb/pypika fail on 3.12+ - "gepa>=0.1", - "google-api-python-client>=2.157,<3", - "google-cloud-aiplatform[agent-engines,evaluation]>=1.148.1,<2", - "google-cloud-bigquery>=2.2", - "google-cloud-bigquery-storage>=2", - "google-cloud-bigtable>=2.32", - "google-cloud-dataplex>=1.7,<3", - "google-cloud-discoveryengine>=0.13.12,<0.14", "google-cloud-firestore>=2.11,<3", "google-cloud-iamconnectorcredentials>=0.1,<0.2", "google-cloud-parametermanager>=0.4,<1", - "google-cloud-pubsub>=2,<3", - "google-cloud-resource-manager>=1.12,<2", - "google-cloud-secret-manager>=2.22,<3", - "google-cloud-spanner>=3.56,<4", - "google-cloud-speech>=2.30,<3", - "google-cloud-storage>=2.18,<4", - "jinja2>=3.1.4,<4", - "kubernetes>=29", + "kubernetes>=29", # For GkeCodeExecutor "langchain-community>=0.3.17", - "langgraph>=0.2.60,<0.4.8", - "litellm>=1.83.7,<=1.83.14", - "llama-index-readers-file>=0.4", - "mcp>=1.24,<2", - "openai>=1.100.2", - "opentelemetry-exporter-gcp-logging>=1.9.0a0,<=1.12.0a0", - "opentelemetry-exporter-gcp-monitoring>=1.9.0a0,<2", - "opentelemetry-exporter-gcp-trace>=1.9,<2", - "opentelemetry-exporter-otlp-proto-http>=1.36", + "langgraph>=0.2.60,<0.4.8", # For LangGraphAgent + "litellm>=1.83.7,<=1.83.14", # For LiteLLM tests. Lower bound: 5 CVE patches (2026-04). Upper bound pinned to current latest; bump deliberately. See #5488. + "llama-index-readers-file>=0.4", # For retrieval tests + "openai>=1.100.2", # For LiteLLM "opentelemetry-instrumentation-google-genai>=0.3b0,<1", - "opentelemetry-resourcedetector-gcp>=1.9.0a0,<2", - "pandas>=2.2.3", - "pyarrow>=14", - "pypika>=0.50", + "pypika>=0.50", # For crewai->chromadb dependency "pytest>=9,<10", "pytest-asyncio>=0.25", "pytest-mock>=3.14", "pytest-xdist>=3.6.1", - "python-dateutil>=2.9.0.post0,<3", "python-multipart>=0.0.9", "rouge-score>=0.1.2", "slack-bolt>=1.22", - "sqlalchemy>=2,<3", - "sqlalchemy-spanner>=1.14", "tabulate>=0.9", - "tomli>=2,<3; python_version<'3.11'", ] - optional-dependencies.toolbox = [ "toolbox-adk>=1,<2" ] - -optional-dependencies.tools = [ - "google-api-python-client>=2.157,<3", -] - urls.changelog = "https://github.com/google/adk-python/blob/main/CHANGELOG.md" urls.documentation = "https://google.github.io/adk-docs/" urls.homepage = "https://google.github.io/adk-docs/" @@ -258,7 +175,7 @@ include = [ "py.typed" ] [tool.isort] profile = "google" single_line_exclusions = [ ] -line_length = 200 +line_length = 200 # Prevent line wrap flickering. known_third_party = [ "google.adk", "a2a" ] [tool.pytest.ini_options] @@ -267,7 +184,7 @@ asyncio_default_fixture_loop_scope = "function" asyncio_mode = "auto" [tool.mypy] -python_version = "3.11" +python_version = "3.10" exclude = [ "tests/", "contributing/samples/" ] plugins = [ "pydantic.mypy" ] strict = true @@ -275,6 +192,7 @@ disable_error_code = [ "import-not-found", "import-untyped", "unused-ignore" ] follow_imports = "skip" [tool.pyink] +# Format py files following Google style-guide line-length = 80 unstable = true pyink-indentation = 2 diff --git a/scripts/check_new_py_files.sh b/scripts/check_new_py_files.sh deleted file mode 100755 index 45cbda55f5..0000000000 --- a/scripts/check_new_py_files.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -exit_code=0 - -# Get list of newly added files using diff-filter=A -# Using process substitution to avoid subshell and handle spaces in filenames -while read -r file; do - # Check if file is not empty (happens if no new files) - if [[ -n "$file" ]]; then - if [[ "$file" == src/google/adk/*.py ]]; then - filename=$(basename "$file") - if [[ ! "$filename" == _* ]]; then - echo "Error: New Python file '$file' must have a '_' prefix." - echo "All new Python files in src/google/adk/ must be private by default." - echo "To expose a public interface, use __init__.py and list public symbols in __all__." - echo "See .agents/skills/adk-style/references/visibility.md for details." - exit_code=1 - fi - fi - fi -done < <(git diff --cached --name-only --diff-filter=A) - -exit $exit_code diff --git a/scripts/db_migration.sh b/scripts/db_migration.sh index c72c4fbf81..8d6a1384cf 100755 --- a/scripts/db_migration.sh +++ b/scripts/db_migration.sh @@ -1,18 +1,4 @@ #!/bin/bash -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - # This script is to update sessions DB that is created in previous ADK version, diff --git a/scripts/generate_agent_config_schema.py b/scripts/generate_agent_config_schema.py deleted file mode 100644 index 6915ce6365..0000000000 --- a/scripts/generate_agent_config_schema.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Script to generate AgentConfig.json from AgentConfig.""" - -from __future__ import annotations - -import json -import os - -from google.adk.agents.agent_config import AgentConfig -from pydantic.json_schema import GenerateJsonSchema -from pydantic.json_schema import PydanticInvalidForJsonSchema - - -class CustomGenerateJsonSchema(GenerateJsonSchema): - """Custom schema generator that handles invalid types by falling back.""" - - def handle_invalid_for_json_schema(self, schema, error_info): - try: - return super().handle_invalid_for_json_schema(schema, error_info) - except PydanticInvalidForJsonSchema: - # Return a fallback schema instead of failing - return { - "type": "object", - "description": f"Fallback for invalid schema: {error_info}", - } - - -def main(): - """Generates the AgentConfig.json schema.""" - # Use the custom generator to avoid failing on httpx.Client - schema = AgentConfig.model_json_schema( - schema_generator=CustomGenerateJsonSchema - ) - - # Find the repo root relative to this file. - script_dir = os.path.dirname(os.path.abspath(__file__)) - repo_root = os.path.dirname(script_dir) - - output_path = os.path.join( - repo_root, "src/google/adk/agents/config_schemas/AgentConfig.json" - ) - - # Ensure directory exists - os.makedirs(os.path.dirname(output_path), exist_ok=True) - - with open(output_path, "w", encoding="utf-8") as f: - json.dump(schema, f, indent=2) - f.write("\n") - - print(f"Successfully generated {output_path}") - - -if __name__ == "__main__": - main() diff --git a/scripts/run_antigravity.py b/scripts/run_antigravity.py deleted file mode 100644 index b43c4c5394..0000000000 --- a/scripts/run_antigravity.py +++ /dev/null @@ -1,290 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Runner script to execute prompts/commands via the Antigravity SDK.""" - -import argparse -import asyncio -import json -import os -import shlex -import subprocess -import sys -from typing import Any - -try: - from google.antigravity import Agent - from google.antigravity import CapabilitiesConfig - from google.antigravity import LocalAgentConfig - from google.antigravity.hooks import policy - from google.antigravity.types import Text - from google.antigravity.types import Thought - from google.antigravity.types import ToolCall - from google.antigravity.types import ToolResult -except ImportError: - print( - "Error: google-antigravity package is not installed. Run 'pip install" - " google-antigravity'", - file=sys.stderr, - ) - sys.exit(1) - - -def _is_safe_command(args: dict[str, Any]) -> bool: - """Validates if the command is a safe 'gh' or 'git' execution with no shell injections.""" - cmd = (args.get("command_line") or args.get("CommandLine") or "").strip() - if not cmd: - return False - - # Forbid shell metacharacters and control characters - forbidden_chars = { - ";", - "&", - "|", - "$", - "`", - "<", - ">", - "\n", - "\r", - "(", - ")", - "\\", - "{", - "}", - } - if any(char in cmd for char in forbidden_chars): - return False - - try: - tokens = shlex.split(cmd) - except ValueError: - return False - - if not tokens: - return False - - return tokens[0] in {"gh", "git"} - - -def fetch_github_issue(issue_number: int) -> str: - """Fetches the details of a GitHub issue from the google/adk-python repository. - - Args: - issue_number: The issue number (e.g. 5949). - """ - # Use curl to fetch the issue details. - # This supports running it outside of the gh CLI environment (e.g. without login/remotes setup). - cmd = [ - "curl", - "-s", - ] - token = os.environ.get("GITHUB_TOKEN") - if token: - cmd.extend(["-H", f"Authorization: token {token}"]) - - issue_cmd = cmd + [ - f"https://api.github.com/repos/google/adk-python/issues/{issue_number}" - ] - comments_cmd = cmd + [ - f"https://api.github.com/repos/google/adk-python/issues/{issue_number}/comments" - ] - - try: - res = subprocess.run(issue_cmd, capture_output=True, text=True, check=False) - if res.returncode != 0: - return ( - f"Error: Failed to fetch issue {issue_number}: {res.stderr.strip()}" - ) - - try: - issue_data = json.loads(res.stdout.strip()) - except json.JSONDecodeError as e: - return ( - f"Error: Failed to parse issue JSON response: {e}. Output:" - f" {res.stdout.strip()}" - ) - - res_comments = subprocess.run( - comments_cmd, capture_output=True, text=True, check=False - ) - if res_comments.returncode == 0: - try: - comments_data = json.loads(res_comments.stdout.strip()) - issue_data["comments_data"] = comments_data - except json.JSONDecodeError: - pass - - return json.dumps(issue_data, indent=2) - except Exception as e: - return f"Error: Failed to run curl command: {e}" - - -def fetch_github_pr(pr_number: int) -> str: - """Fetches the details of a GitHub Pull Request from the google/adk-python repository. - - Args: - pr_number: The PR number (e.g. 5956). - """ - # Use curl to fetch the PR details. - # This supports running it outside of the gh CLI environment (e.g. without login/remotes setup). - cmd = [ - "curl", - "-s", - ] - token = os.environ.get("GITHUB_TOKEN") - if token: - cmd.extend(["-H", f"Authorization: token {token}"]) - - pr_cmd = cmd + [ - f"https://api.github.com/repos/google/adk-python/pulls/{pr_number}" - ] - issue_comments_cmd = cmd + [ - f"https://api.github.com/repos/google/adk-python/issues/{pr_number}/comments" - ] - review_comments_cmd = cmd + [ - f"https://api.github.com/repos/google/adk-python/pulls/{pr_number}/comments" - ] - - try: - res = subprocess.run(pr_cmd, capture_output=True, text=True, check=False) - if res.returncode != 0: - return f"Error: Failed to fetch PR {pr_number}: {res.stderr.strip()}" - - try: - pr_data = json.loads(res.stdout.strip()) - except json.JSONDecodeError as e: - return ( - f"Error: Failed to parse PR JSON response: {e}. Output:" - f" {res.stdout.strip()}" - ) - - # Fetch issue-level comments - res_issue_comments = subprocess.run( - issue_comments_cmd, capture_output=True, text=True, check=False - ) - if res_issue_comments.returncode == 0: - try: - pr_data["comments_data"] = json.loads(res_issue_comments.stdout.strip()) - except json.JSONDecodeError: - pass - - # Fetch review/inline comments - res_review_comments = subprocess.run( - review_comments_cmd, capture_output=True, text=True, check=False - ) - if res_review_comments.returncode == 0: - try: - pr_data["review_comments_data"] = json.loads( - res_review_comments.stdout.strip() - ) - except json.JSONDecodeError: - pass - - return json.dumps(pr_data, indent=2) - except Exception as e: - return f"Error: Failed to run curl command: {e}" - - -async def main(): - parser = argparse.ArgumentParser( - description=( - "Runner script to execute prompts/commands via the Antigravity SDK." - ) - ) - parser.add_argument( - "--show-steps", - action="store_true", - help="Show intermediate thoughts, tool calls, and tool results.", - ) - parser.add_argument( - "prompt", - nargs="+", - help="The prompt to send to the Antigravity Agent.", - ) - parsed_args = parser.parse_args() - - show_steps = parsed_args.show_steps - prompt = " ".join(parsed_args.prompt) - - # Ensure GEMINI_API_KEY is set (using GOOGLE_API_KEY as fallback) - if "GOOGLE_API_KEY" in os.environ and "GEMINI_API_KEY" not in os.environ: - os.environ["GEMINI_API_KEY"] = os.environ["GOOGLE_API_KEY"] - - if "GEMINI_API_KEY" not in os.environ: - print( - "Error: GEMINI_API_KEY environment variable is not set.", - file=sys.stderr, - ) - sys.exit(1) - - skills_dir = os.path.abspath( - os.path.join(os.path.dirname(__file__), "..", ".agents", "skills") - ) - config = LocalAgentConfig( - capabilities=CapabilitiesConfig(), - tools=[fetch_github_issue, fetch_github_pr], - policies=[ - policy.deny( - "run_command", - when=lambda args: not _is_safe_command(args), - name="only_allow_gh_and_git", - ), - ], - skills_paths=[skills_dir], - ) - - try: - async with Agent(config) as agent: - response = await agent.chat(prompt) - if show_steps: - in_thinking = False - async for chunk in response.chunks: - if isinstance(chunk, Thought): - if not in_thinking: - sys.stdout.write("[Thinking...]\n") - in_thinking = True - sys.stdout.write(chunk.text) - sys.stdout.flush() - elif isinstance(chunk, ToolCall): - if in_thinking: - sys.stdout.write("\n[End of Thinking]\n") - in_thinking = False - print( - f"\n[Calling Tool: {chunk.name} with args: {chunk.args}]", - flush=True, - ) - elif isinstance(chunk, ToolResult): - status = f"Error: {chunk.error}" if chunk.error else "Success" - print(f"\n[Tool {chunk.name} finished: {status}]", flush=True) - elif isinstance(chunk, Text): - if in_thinking: - sys.stdout.write("\n[End of Thinking]\n") - in_thinking = False - sys.stdout.write(chunk.text) - sys.stdout.flush() - if in_thinking: - sys.stdout.write("\n[End of Thinking]\n") - else: - async for token in response: - sys.stdout.write(token) - sys.stdout.flush() - print() - except Exception as e: # pylint: disable=broad-exception-caught - print(f"\nError running Antigravity Agent: {e}", file=sys.stderr) - sys.exit(1) - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/scripts/unittests.sh b/scripts/unittests.sh new file mode 100755 index 0000000000..eb9805f698 --- /dev/null +++ b/scripts/unittests.sh @@ -0,0 +1,143 @@ +#!/bin/bash +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# Runs all unit tests for adk codebase. Sets up test environment according to +# CONTRIBUTING.md. +# Usage: ./unittests.sh [--version ] [pytest_args] + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" +cd .. + +# Argument Parsing +ALL_VERSIONS=("3.10" "3.11" "3.12" "3.13" "3.14") +versions_to_run=() +PYTEST_ARGS=() + +while [[ $# -gt 0 ]]; do + case "$1" in + --version) + if [[ -z "${2:-}" ]]; then + echo "Error: Missing version for --version flag." >&2 + echo "Usage: $0 [--version ] [pytest_args]" >&2 + exit 1 + fi + # Validate version + if ! [[ " ${ALL_VERSIONS[*]} " =~ " $2 " ]]; then + echo "Error: Invalid version '$2'. Supported versions: ${ALL_VERSIONS[*]}" >&2 + exit 1 + fi + versions_to_run=("$2") + shift 2 + ;; + *) + PYTEST_ARGS+=("$1") + shift + ;; + esac +done + +if [[ ${#versions_to_run[@]} -eq 0 ]]; then + versions_to_run=("${ALL_VERSIONS[@]}") +fi + + +# Capture original venv for restoration +ORIGINAL_VENV="${VIRTUAL_ENV:-}" + +restore_venv() { + # Deactivate the unittest_venv if it is active + if command -v deactivate &> /dev/null; then + deactivate + fi + + echo "Cleaning up temporary directories..." + [[ -n "${VENV_DIR:-}" ]] && rm -rf "$VENV_DIR" + [[ -n "${UV_CACHE_DIR:-}" ]] && rm -rf "$UV_CACHE_DIR" + + if [[ -n "$ORIGINAL_VENV" ]]; then + echo "Reactivating pre-existing venv: $ORIGINAL_VENV" + source "$ORIGINAL_VENV/bin/activate" + fi +} + +# Ensure the environment is restored when the script exits. +trap restore_venv EXIT + +# Temporary directory for the virtual environment. +VENV_DIR=$(mktemp -d "${TMPDIR:-/tmp}/unittest_venv.XXXXXX") + +# Move uv cache to temp to prevent workspace bloat and IDE performance issues. +export UV_CACHE_DIR=$(mktemp -d "${TMPDIR:-/tmp}/uv_cache.XXXXXX") + +# Force 'copy' mode; hardlinks (uv default) fail on many virtual filesystems. +export UV_LINK_MODE=copy + +# 1. deactivate the current venv +if [[ -n "${VIRTUAL_ENV:-}" ]]; then + echo "Deactivating current venv: $VIRTUAL_ENV" + if command -v deactivate &> /dev/null; then + deactivate + fi + +fi + +for version in "${versions_to_run[@]}"; do + echo "" + echo "==================================================" + echo " RUNNING TESTS FOR PYTHON $version" + echo "==================================================" + + # 2. create a unittest_venv just for unit tests + echo "Creating/Using unittest_venv for python${version} in $VENV_DIR..." + uv venv --python "${version}" "$VENV_DIR" --clear + source "$VENV_DIR/bin/activate" + + # 3. perform the unit tests + echo "Setting up test environment in $VENV_DIR..." + uv sync --extra test --active --frozen + + # Determine if PYTEST_ARGS contains explicit test targets (e.g. file, dir, or node ID) + HAS_TEST_TARGET=false + for arg in "${PYTEST_ARGS[@]:-}"; do + [[ "$arg" == *.py || -d "$arg" || "$arg" == *::* ]] && HAS_TEST_TARGET=true && break + done + + echo "Running unit tests..." + TEST_EXIT_CODE=0 + if [[ "$HAS_TEST_TARGET" == true ]]; then + pytest "${PYTEST_ARGS[@]}" || TEST_EXIT_CODE=$? + else + pytest ./tests/unittests "${PYTEST_ARGS[@]:-}" || TEST_EXIT_CODE=$? + fi + # 4. report the unit tests status as is + if [[ $TEST_EXIT_CODE -ne 0 ]]; then + echo "" + echo "--------------------------------------------------" + echo "Unit tests failed for Python $version with exit code $TEST_EXIT_CODE" + echo "--------------------------------------------------" + exit $TEST_EXIT_CODE + fi +done + + +# 5. reactivate the pre-existing venv if the unit test succeeds +echo "" +echo "--------------------------------------------------" +echo "Unit tests passed for all specified versions!" +echo "--------------------------------------------------" diff --git a/src/google/adk/__init__.py b/src/google/adk/__init__.py index be9d2af08b..d48806bacd 100644 --- a/src/google/adk/__init__.py +++ b/src/google/adk/__init__.py @@ -17,9 +17,7 @@ from . import version from .agents.context import Context from .agents.llm_agent import Agent -from .events.event import Event from .runners import Runner -from .workflow import Workflow __version__ = version.__version__ -__all__ = ["Agent", "Context", "Event", "Runner", "Workflow"] +__all__ = ["Agent", "Context", "Runner"] diff --git a/src/google/adk/a2a/agent/__init__.py b/src/google/adk/a2a/agent/__init__.py index 6e247a8fb3..8026986eea 100644 --- a/src/google/adk/a2a/agent/__init__.py +++ b/src/google/adk/a2a/agent/__init__.py @@ -14,32 +14,12 @@ """A2A agents package.""" -from ...utils._dependency import missing_extra +from .config import A2aRemoteAgentConfig +from .config import ParametersConfig +from .config import RequestInterceptor __all__ = [ "A2aRemoteAgentConfig", "ParametersConfig", "RequestInterceptor", ] - - -def __getattr__(name: str): - if name in [ - "A2aRemoteAgentConfig", - "ParametersConfig", - "RequestInterceptor", - ]: - try: - from .config import A2aRemoteAgentConfig - from .config import ParametersConfig - from .config import RequestInterceptor - - if name == "A2aRemoteAgentConfig": - return A2aRemoteAgentConfig - elif name == "ParametersConfig": - return ParametersConfig - elif name == "RequestInterceptor": - return RequestInterceptor - except ImportError as e: - raise missing_extra("a2a-sdk", "a2a") from e - raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/src/google/adk/a2a/converters/part_converter.py b/src/google/adk/a2a/converters/part_converter.py index ac644010b8..cb7eb688cd 100644 --- a/src/google/adk/a2a/converters/part_converter.py +++ b/src/google/adk/a2a/converters/part_converter.py @@ -22,7 +22,6 @@ from collections.abc import Callable import json import logging -from typing import Any from typing import List from typing import Optional from typing import Union @@ -65,9 +64,7 @@ def convert_a2a_part_to_genai_part( thought = None if part.metadata: thought = part.metadata.get(_get_adk_metadata_key('thought')) - return genai_types.Part( - text=part.text, thought=thought, part_metadata=part.metadata - ) + return genai_types.Part(text=part.text, thought=thought) if isinstance(part, a2a_types.FilePart): if isinstance(part.file, a2a_types.FileWithUri): @@ -76,8 +73,7 @@ def convert_a2a_part_to_genai_part( file_uri=part.file.uri, mime_type=part.file.mime_type, display_name=part.file.name, - ), - part_metadata=part.metadata, + ) ) elif isinstance(part.file, a2a_types.FileWithBytes): @@ -86,8 +82,7 @@ def convert_a2a_part_to_genai_part( data=base64.b64decode(part.file.bytes), mime_type=part.file.mime_type, display_name=part.file.name, - ), - part_metadata=part.metadata, + ) ) else: logger.warning( @@ -131,7 +126,6 @@ def convert_a2a_part_to_genai_part( part.data, by_alias=True ), thought_signature=thought_signature, - part_metadata=part.metadata, ) if ( part.metadata[_get_adk_metadata_key(A2A_DATA_PART_METADATA_TYPE_KEY)] @@ -140,8 +134,7 @@ def convert_a2a_part_to_genai_part( return genai_types.Part( function_response=genai_types.FunctionResponse.model_validate( part.data, by_alias=True - ), - part_metadata=part.metadata, + ) ) if ( part.metadata[_get_adk_metadata_key(A2A_DATA_PART_METADATA_TYPE_KEY)] @@ -150,8 +143,7 @@ def convert_a2a_part_to_genai_part( return genai_types.Part( code_execution_result=genai_types.CodeExecutionResult.model_validate( part.data, by_alias=True - ), - part_metadata=part.metadata, + ) ) if ( part.metadata[_get_adk_metadata_key(A2A_DATA_PART_METADATA_TYPE_KEY)] @@ -160,8 +152,7 @@ def convert_a2a_part_to_genai_part( return genai_types.Part( executable_code=genai_types.ExecutableCode.model_validate( part.data, by_alias=True - ), - part_metadata=part.metadata, + ) ) return genai_types.Part( inline_data=genai_types.Blob( @@ -171,8 +162,7 @@ def convert_a2a_part_to_genai_part( ) + A2A_DATA_PART_END_TAG, mime_type=A2A_DATA_PART_TEXT_MIME_TYPE, - ), - part_metadata=part.metadata, + ) ) logger.warning( @@ -189,34 +179,22 @@ def convert_genai_part_to_a2a_part( ) -> Optional[a2a_types.Part]: """Convert a Google GenAI Part to an A2A Part.""" - def add_metadata_to_a2a_part( - a2a_part: a2a_types.Part, - metadata: dict[str, Any], - ) -> None: - """Adds metadata to an A2A part.""" - if a2a_part.metadata is None: - a2a_part.metadata = {} - a2a_part.metadata.update(metadata) - if part.text is not None: a2a_part = a2a_types.TextPart(text=part.text) if part.thought is not None: a2a_part.metadata = {_get_adk_metadata_key('thought'): part.thought} - if part.part_metadata: - add_metadata_to_a2a_part(a2a_part, part.part_metadata) return a2a_types.Part(root=a2a_part) if part.file_data: - a2a_part = a2a_types.FilePart( - file=a2a_types.FileWithUri( - uri=part.file_data.file_uri, - mime_type=part.file_data.mime_type, - name=part.file_data.display_name, + return a2a_types.Part( + root=a2a_types.FilePart( + file=a2a_types.FileWithUri( + uri=part.file_data.file_uri, + mime_type=part.file_data.mime_type, + name=part.file_data.display_name, + ) ) ) - if part.part_metadata: - add_metadata_to_a2a_part(a2a_part, part.part_metadata) - return a2a_types.Part(root=a2a_part) if part.inline_data: if ( @@ -225,14 +203,13 @@ def add_metadata_to_a2a_part( and part.inline_data.data.startswith(A2A_DATA_PART_START_TAG) and part.inline_data.data.endswith(A2A_DATA_PART_END_TAG) ): - a2a_part = a2a_types.DataPart.model_validate_json( - part.inline_data.data[ - len(A2A_DATA_PART_START_TAG) : -len(A2A_DATA_PART_END_TAG) - ] + return a2a_types.Part( + root=a2a_types.DataPart.model_validate_json( + part.inline_data.data[ + len(A2A_DATA_PART_START_TAG) : -len(A2A_DATA_PART_END_TAG) + ] + ) ) - if part.part_metadata: - add_metadata_to_a2a_part(a2a_part, part.part_metadata) - return a2a_types.Part(root=a2a_part) # The default case for inline_data is to convert it to FileWithBytes. a2a_part = a2a_types.FilePart( file=a2a_types.FileWithBytes( @@ -249,9 +226,6 @@ def add_metadata_to_a2a_part( ): part.video_metadata.model_dump(by_alias=True, exclude_none=True) } - if part.part_metadata: - add_metadata_to_a2a_part(a2a_part, part.part_metadata) - return a2a_types.Part(root=a2a_part) # Convert the funcall and function response to A2A DataPart. @@ -270,8 +244,6 @@ def add_metadata_to_a2a_part( fc_metadata[_get_adk_metadata_key('thought_signature')] = ( base64.b64encode(part.thought_signature).decode('utf-8') ) - if part.part_metadata: - fc_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.function_call.model_dump( @@ -282,53 +254,44 @@ def add_metadata_to_a2a_part( ) if part.function_response: - fr_metadata = { - _get_adk_metadata_key( - A2A_DATA_PART_METADATA_TYPE_KEY - ): A2A_DATA_PART_METADATA_TYPE_FUNCTION_RESPONSE - } - if part.part_metadata: - fr_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.function_response.model_dump( by_alias=True, exclude_none=True ), - metadata=fr_metadata, + metadata={ + _get_adk_metadata_key( + A2A_DATA_PART_METADATA_TYPE_KEY + ): A2A_DATA_PART_METADATA_TYPE_FUNCTION_RESPONSE + }, ) ) if part.code_execution_result: - cer_metadata = { - _get_adk_metadata_key( - A2A_DATA_PART_METADATA_TYPE_KEY - ): A2A_DATA_PART_METADATA_TYPE_CODE_EXECUTION_RESULT - } - if part.part_metadata: - cer_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.code_execution_result.model_dump( by_alias=True, exclude_none=True ), - metadata=cer_metadata, + metadata={ + _get_adk_metadata_key( + A2A_DATA_PART_METADATA_TYPE_KEY + ): A2A_DATA_PART_METADATA_TYPE_CODE_EXECUTION_RESULT + }, ) ) if part.executable_code: - ec_metadata = { - _get_adk_metadata_key( - A2A_DATA_PART_METADATA_TYPE_KEY - ): A2A_DATA_PART_METADATA_TYPE_EXECUTABLE_CODE - } - if part.part_metadata: - ec_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.executable_code.model_dump( by_alias=True, exclude_none=True ), - metadata=ec_metadata, + metadata={ + _get_adk_metadata_key( + A2A_DATA_PART_METADATA_TYPE_KEY + ): A2A_DATA_PART_METADATA_TYPE_EXECUTABLE_CODE + }, ) ) diff --git a/src/google/adk/a2a/converters/to_adk_event.py b/src/google/adk/a2a/converters/to_adk_event.py index a28330a19b..eab89c20f5 100644 --- a/src/google/adk/a2a/converters/to_adk_event.py +++ b/src/google/adk/a2a/converters/to_adk_event.py @@ -46,9 +46,6 @@ MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT = ( "mock_function_call_for_required_user_input" ) -MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH = ( - "mock_function_call_for_required_user_auth" -) A2AMessageToEventConverter = Callable[ [ @@ -292,36 +289,24 @@ def _create_mock_function_call_for_required_user_input( This solution allows to unblock the A2A integration with non-ADK agents from ADK side by replacing the last text part with a synthetic function call. All - other parts are preserved. The args key used on the synthetic function call - differs depending on whether the task is in input-required or auth-required - state, so downstream consumers can distinguish between the two. + other parts are preserved. """ - if long_running_function_ids: - return output_parts, long_running_function_ids - - if state == TaskState.input_required: - args_key = "input_required" - function_name = MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT - elif state == TaskState.auth_required: - args_key = "auth_required" - function_name = MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH - else: - return output_parts, long_running_function_ids - - # Find the last text part from the bottom to replace it with a function call. - # In case of input-required / auth-required events, the LLM should stop the - # production of other parts. - for i in range(len(output_parts) - 1, -1, -1): - if output_parts[i].text: - function_call = genai_types.FunctionCall( - id=str(uuid.uuid4()), - name=function_name, - args={args_key: output_parts[i].text}, - ) - long_running_function_ids = set() - long_running_function_ids.add(function_call.id) - output_parts[i] = genai_types.Part(function_call=function_call) - break + if ( + state == TaskState.input_required or state == TaskState.auth_required + ) and (not long_running_function_ids or len(long_running_function_ids) == 0): + # Find the last text part from the bottom to replace it with a function call. + # In case of input-required events, the LLM should stop the production of other parts. + for i in range(len(output_parts) - 1, -1, -1): + if output_parts[i].text: + function_call = genai_types.FunctionCall( + id=str(uuid.uuid4()), + name=MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT, + args={"input_required": output_parts[i].text}, + ) + long_running_function_ids = set() + long_running_function_ids.add(function_call.id) + output_parts[i] = genai_types.Part(function_call=function_call) + break return output_parts, long_running_function_ids diff --git a/src/google/adk/a2a/utils/agent_card_builder.py b/src/google/adk/a2a/utils/agent_card_builder.py index 58ed886544..1e8cecad79 100644 --- a/src/google/adk/a2a/utils/agent_card_builder.py +++ b/src/google/adk/a2a/utils/agent_card_builder.py @@ -32,9 +32,6 @@ from ...agents.parallel_agent import ParallelAgent from ...agents.sequential_agent import SequentialAgent from ...tools.example_tool import ExampleTool -from ...workflow import BaseNode -from ...workflow import START -from ...workflow import Workflow from ..experimental import a2a_experimental logger = logging.getLogger('google_adk.' + __name__) @@ -52,7 +49,7 @@ class AgentCardBuilder: def __init__( self, *, - agent: BaseAgent | Workflow, + agent: BaseAgent, rpc_url: Optional[str] = None, capabilities: Optional[AgentCapabilities] = None, doc_url: Optional[str] = None, @@ -62,11 +59,6 @@ def __init__( ): if not agent: raise ValueError('Agent cannot be None or empty.') - if not isinstance(agent, (BaseAgent, Workflow)): - raise TypeError( - 'AgentCardBuilder requires a BaseAgent or Workflow, got ' - f'{type(agent).__name__}.' - ) self._agent = agent self._rpc_url = rpc_url or 'http://localhost:80/a2a' @@ -104,17 +96,8 @@ async def build(self) -> AgentCard: # Module-level helper functions -def _iter_child_nodes(agent: BaseNode) -> List[BaseNode]: - """Returns the immediate child nodes of an agent or a workflow.""" - if isinstance(agent, BaseAgent): - return list(agent.sub_agents) - if isinstance(agent, Workflow) and agent.graph is not None: - return [n for n in agent.graph.nodes if n.name != START.name] - return [] - - -async def _build_primary_skills(agent: BaseNode) -> List[AgentSkill]: - """Build skills for any node type.""" +async def _build_primary_skills(agent: BaseAgent) -> List[AgentSkill]: + """Build skills for any agent type.""" if isinstance(agent, LlmAgent): return await _build_llm_agent_skills(agent) else: @@ -157,10 +140,10 @@ async def _build_llm_agent_skills(agent: LlmAgent) -> List[AgentSkill]: return skills -async def _build_sub_agent_skills(agent: BaseNode) -> List[AgentSkill]: - """Build skills for all child nodes (sub-agents or workflow nodes).""" +async def _build_sub_agent_skills(agent: BaseAgent) -> List[AgentSkill]: + """Build skills for all sub-agents.""" sub_agent_skills = [] - for sub_agent in _iter_child_nodes(agent): + for sub_agent in agent.sub_agents: try: sub_skills = await _build_primary_skills(sub_agent) for skill in sub_skills: @@ -242,8 +225,8 @@ def _build_code_executor_skill(agent: LlmAgent) -> AgentSkill: ) -async def _build_non_llm_agent_skills(agent: BaseNode) -> List[AgentSkill]: - """Build skills for non-LLM agents and workflow nodes.""" +async def _build_non_llm_agent_skills(agent: BaseAgent) -> List[AgentSkill]: + """Build skills for non-LLM agents.""" skills = [] # 1. Agent skill (main agent skill) @@ -266,8 +249,8 @@ async def _build_non_llm_agent_skills(agent: BaseNode) -> List[AgentSkill]: ) ) - # 2. Orchestration skill (for agents/workflows with child nodes) - if _iter_child_nodes(agent): + # 2. Sub-agent orchestration skill (for agents with sub-agents) + if agent.sub_agents: orchestration_skill = _build_orchestration_skill(agent, agent_type) if orchestration_skill: skills.append(orchestration_skill) @@ -276,11 +259,11 @@ async def _build_non_llm_agent_skills(agent: BaseNode) -> List[AgentSkill]: def _build_orchestration_skill( - agent: BaseNode, agent_type: str + agent: BaseAgent, agent_type: str ) -> Optional[AgentSkill]: - """Build orchestration skill for agents/workflows with child nodes.""" + """Build orchestration skill for agents with sub-agents.""" sub_agent_descriptions = [] - for sub_agent in _iter_child_nodes(agent): + for sub_agent in agent.sub_agents: description = sub_agent.description or 'No description' sub_agent_descriptions.append(f'{sub_agent.name}: {description}') @@ -298,7 +281,7 @@ def _build_orchestration_skill( ) -def _get_agent_type(agent: BaseNode) -> str: +def _get_agent_type(agent: BaseAgent) -> str: """Get the agent type for tagging.""" if isinstance(agent, LlmAgent): return 'llm' @@ -308,23 +291,21 @@ def _get_agent_type(agent: BaseNode) -> str: return 'parallel_workflow' elif isinstance(agent, LoopAgent): return 'loop_workflow' - elif isinstance(agent, Workflow): - return 'graph_workflow' else: return 'custom_agent' -def _get_agent_skill_name(agent: BaseNode) -> str: +def _get_agent_skill_name(agent: BaseAgent) -> str: """Get the skill name based on agent type.""" if isinstance(agent, LlmAgent): return 'model' - elif isinstance(agent, (SequentialAgent, ParallelAgent, LoopAgent, Workflow)): + elif isinstance(agent, (SequentialAgent, ParallelAgent, LoopAgent)): return 'workflow' else: return 'custom' -def _build_agent_description(agent: BaseNode) -> str: +def _build_agent_description(agent: BaseAgent) -> str: """Build agent description from agent.description and workflow-specific descriptions.""" description_parts = [] @@ -401,9 +382,9 @@ def _replace_pronouns(text: str) -> str: ) -def _get_workflow_description(agent: BaseNode) -> Optional[str]: - """Get workflow-specific description for non-LLM agents and workflows.""" - if not _iter_child_nodes(agent): +def _get_workflow_description(agent: BaseAgent) -> Optional[str]: + """Get workflow-specific description for non-LLM agents.""" + if not agent.sub_agents: return None if isinstance(agent, SequentialAgent): @@ -412,8 +393,6 @@ def _get_workflow_description(agent: BaseNode) -> Optional[str]: return _build_parallel_description(agent) elif isinstance(agent, LoopAgent): return _build_loop_description(agent) - elif isinstance(agent, Workflow): - return _build_graph_workflow_description(agent) return None @@ -469,32 +448,13 @@ def _build_loop_description(agent: LoopAgent) -> str: ) -def _build_graph_workflow_description(workflow: Workflow) -> str: - """Build description for a graph-based Workflow.""" - child_nodes = _iter_child_nodes(workflow) - descriptions = [] - for node in child_nodes: - node_description = ( - node.description.rstrip('.') - if node.description - else f'execute the {node.name} node' - ) - descriptions.append(f'{node.name}: {node_description}') - return ( - 'This workflow orchestrates the following nodes: ' - + '; '.join(descriptions) - + '.' - ) - - -def _get_default_description(agent: BaseNode) -> str: +def _get_default_description(agent: BaseAgent) -> str: """Get default description based on agent type.""" agent_type_descriptions = { LlmAgent: 'An LLM-based agent', SequentialAgent: 'A sequential workflow agent', ParallelAgent: 'A parallel workflow agent', LoopAgent: 'A loop workflow agent', - Workflow: 'A graph-based workflow agent', } for agent_type, description in agent_type_descriptions.items(): @@ -532,7 +492,7 @@ def _extract_inputs_from_examples(examples: Optional[list[dict]]) -> list[str]: async def _extract_examples_from_agent( - agent: BaseNode, + agent: BaseAgent, ) -> Optional[List[Dict]]: """Extract examples from example_tool if configured; otherwise, from agent instruction.""" if not isinstance(agent, LlmAgent): @@ -598,7 +558,7 @@ def _extract_examples_from_instruction( return examples if examples else None -def _get_input_modes(agent: BaseNode) -> Optional[List[str]]: +def _get_input_modes(agent: BaseAgent) -> Optional[List[str]]: """Get input modes based on agent model.""" if not isinstance(agent, LlmAgent): return None @@ -608,7 +568,7 @@ def _get_input_modes(agent: BaseNode) -> Optional[List[str]]: return None -def _get_output_modes(agent: BaseNode) -> Optional[List[str]]: +def _get_output_modes(agent: BaseAgent) -> Optional[List[str]]: """Get output modes from Agent.generate_content_config.response_modalities.""" if not isinstance(agent, LlmAgent): return None diff --git a/src/google/adk/a2a/utils/agent_to_a2a.py b/src/google/adk/a2a/utils/agent_to_a2a.py index 980c917478..48454a632a 100644 --- a/src/google/adk/a2a/utils/agent_to_a2a.py +++ b/src/google/adk/a2a/utils/agent_to_a2a.py @@ -34,7 +34,6 @@ from ...memory.in_memory_memory_service import InMemoryMemoryService from ...runners import Runner from ...sessions.in_memory_session_service import InMemorySessionService -from ...workflow import Workflow from ..executor.a2a_agent_executor import A2aAgentExecutor from ..executor.config import A2aAgentExecutorConfig from ..experimental import a2a_experimental @@ -78,7 +77,7 @@ def _load_agent_card( @a2a_experimental def to_a2a( - agent: BaseAgent | Workflow, + agent: BaseAgent, *, host: str = "localhost", port: int = 8000, @@ -90,11 +89,10 @@ def to_a2a( lifespan: Callable[[Starlette], AsyncIterator[None]] | None = None, agent_executor_factory: Callable[[Runner], A2aAgentExecutor] | None = None, ) -> Starlette: - """Convert an ADK BaseAgent or Workflow to an A2A Starlette application. + """Convert an ADK agent to a A2A Starlette application. Args: - agent: The ADK BaseAgent (e.g. LlmAgent) or Workflow to - convert. + agent: The ADK agent to convert host: The host for the A2A RPC URL (default: "localhost") port: The port for the A2A RPC URL (default: 8000) protocol: The protocol for the A2A RPC URL (default: "http") @@ -154,20 +152,16 @@ async def lifespan(app): adk_logger.setLevel(logging.INFO) def create_runner() -> Runner: - """Create a runner for the agent or workflow.""" - runner_kwargs = { - "app_name": agent.name or "adk_agent", + """Create a runner for the agent.""" + return Runner( + app_name=agent.name or "adk_agent", + agent=agent, # Use minimal services - in a real implementation these could be configured - "artifact_service": InMemoryArtifactService(), - "session_service": InMemorySessionService(), - "memory_service": InMemoryMemoryService(), - "credential_service": InMemoryCredentialService(), - } - if isinstance(agent, Workflow): - runner_kwargs["node"] = agent - else: - runner_kwargs["agent"] = agent - return Runner(**runner_kwargs) + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + credential_service=InMemoryCredentialService(), + ) # Create A2A components if task_store is None: diff --git a/src/google/adk/agents/__init__.py b/src/google/adk/agents/__init__.py index 9d5749f50f..bfb597f84d 100644 --- a/src/google/adk/agents/__init__.py +++ b/src/google/adk/agents/__init__.py @@ -13,25 +13,19 @@ # limitations under the License. import importlib -from typing import Any from typing import TYPE_CHECKING from .base_agent import BaseAgent -from .base_agent_config import BaseAgentConfig from .context import Context from .invocation_context import InvocationContext from .live_request_queue import LiveRequest from .live_request_queue import LiveRequestQueue from .llm_agent import Agent from .llm_agent import LlmAgent -from .llm_agent_config import LlmAgentConfig from .loop_agent import LoopAgent -from .loop_agent_config import LoopAgentConfig from .parallel_agent import ParallelAgent -from .parallel_agent_config import ParallelAgentConfig from .run_config import RunConfig from .sequential_agent import SequentialAgent -from .sequential_agent_config import SequentialAgentConfig if TYPE_CHECKING: from .mcp_instruction_provider import McpInstructionProvider @@ -49,22 +43,17 @@ 'LiveRequest', 'LiveRequestQueue', 'RunConfig', - 'BaseAgentConfig', - 'LlmAgentConfig', - 'LoopAgentConfig', - 'ParallelAgentConfig', - 'SequentialAgentConfig', ] -def __getattr__(name: str) -> Any: +def __getattr__(name: str): if name == 'McpInstructionProvider': - module = importlib.import_module('.mcp_instruction_provider', __name__) - attr = getattr(module, 'McpInstructionProvider') - globals()[name] = attr - return attr + try: + module = importlib.import_module(f'{__name__}.mcp_instruction_provider') + except ImportError as e: + raise ImportError( + '`McpInstructionProvider` requires the `mcp` package.' + ' Install with: pip install google-adk[extensions]' + ) from e + return module.McpInstructionProvider raise AttributeError(f'module {__name__!r} has no attribute {name!r}') - - -def __dir__() -> list[str]: - return list(globals().keys()) + __all__ diff --git a/src/google/adk/agents/agent_config.py b/src/google/adk/agents/agent_config.py index f7e9d5ebda..2d3c6270ca 100644 --- a/src/google/adk/agents/agent_config.py +++ b/src/google/adk/agents/agent_config.py @@ -21,7 +21,6 @@ from pydantic import Discriminator from pydantic import RootModel from pydantic import Tag -from typing_extensions import deprecated from ..features import experimental from ..features import FeatureName @@ -69,7 +68,6 @@ def agent_config_discriminator(v: Any) -> str: # Use a RootModel to represent the agent directly at the top level. # The `discriminator` is applied to the union within the RootModel. -@deprecated("AgentConfig is deprecated and will be removed in future versions.") @experimental(FeatureName.AGENT_CONFIG) class AgentConfig(RootModel[ConfigsUnion]): """The config for the YAML schema to create an agent.""" diff --git a/src/google/adk/agents/base_agent.py b/src/google/adk/agents/base_agent.py index c21b7a8ee9..91fb568cd3 100644 --- a/src/google/adk/agents/base_agent.py +++ b/src/google/adk/agents/base_agent.py @@ -14,7 +14,6 @@ from __future__ import annotations -import abc import inspect import logging from typing import Any @@ -36,7 +35,6 @@ from pydantic import ConfigDict from pydantic import Field from pydantic import field_validator -from typing_extensions import deprecated from typing_extensions import override from typing_extensions import TypeAlias @@ -46,12 +44,8 @@ from ..features import FeatureName from ..telemetry import _instrumentation from ..utils.context_utils import Aclosing -from ..workflow import BaseNode -from .base_agent_config import BaseAgentConfig as BaseAgentConfig +from .base_agent_config import BaseAgentConfig from .callback_context import CallbackContext -from .context import Context - -__all__ = ['BaseAgentConfig'] if TYPE_CHECKING: from .invocation_context import InvocationContext @@ -88,9 +82,7 @@ class BaseAgentState(BaseModel): AgentState = TypeVar('AgentState', bound=BaseAgentState) -# TODO: drop the explicit abc.ABC base once BaseNode surfaces ABCMeta to -# static type checkers. -class BaseAgent(BaseNode, abc.ABC): +class BaseAgent(BaseModel): """Base class for all agents in Agent Development Kit.""" model_config = ConfigDict( @@ -102,9 +94,6 @@ class BaseAgent(BaseNode, abc.ABC): config_type: ClassVar[type[BaseAgentConfig]] = BaseAgentConfig """The config type for this agent. - DEPRECATED: This attribute is deprecated and will be removed in a future - version, along with the AgentConfig YAML loader. - Sub-classes should override this to specify their own config type. Example: @@ -280,6 +269,7 @@ def clone( cloned_agent.parent_agent = None return cloned_agent + @final async def run_async( self, parent_context: InvocationContext, @@ -311,25 +301,6 @@ async def run_async( if event := await self._handle_after_agent_callback(ctx): yield event - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - """Runs the agent as a node.""" - async for event in self.run_async( - parent_context=ctx.get_invocation_context() - ): - # Preserve author by setting it in context for NodeRunner - if event.author: - ctx.event_author = event.author - - if not event.node_info.path and event.author == self.name: - event.node_info.path = ctx.node_path - yield event - @final async def run_live( self, @@ -576,7 +547,6 @@ async def _handle_after_agent_callback( @override def model_post_init(self, __context: Any) -> None: - super().model_post_init(__context) self.__set_parent_agent_for_sub_agents() @field_validator('name', mode='after') @@ -646,11 +616,8 @@ def __set_parent_agent_for_sub_agents(self) -> BaseAgent: sub_agent.parent_agent = self return self + @final @classmethod - @deprecated( - 'BaseAgent.from_config is deprecated and will be removed in future' - ' versions.' - ) @experimental(FeatureName.AGENT_CONFIG) def from_config( cls: Type[SelfAgent], @@ -659,8 +626,8 @@ def from_config( ) -> SelfAgent: """Creates an agent from a config. - If sub-classes use a custom agent config, override `_parse_config` to - return updated kwargs for the agent constructor. + If sub-classes uses a custom agent config, override `_from_config_kwargs` + method to return an updated kwargs for agent constructor. Args: config: The config to create the agent from. @@ -727,11 +694,4 @@ def __create_kwargs( kwargs['after_agent_callback'] = resolve_callbacks( config.after_agent_callbacks ) - - # Preserves 1.x AgentConfigMapper behavior: extra YAML fields that match - # a constructor parameter pass through automatically. - if config.model_extra: - for key, value in config.model_extra.items(): - if key in cls.model_fields and key not in kwargs: - kwargs[key] = value return kwargs diff --git a/src/google/adk/agents/base_agent_config.py b/src/google/adk/agents/base_agent_config.py index 6d20fed9d9..3859cb3550 100644 --- a/src/google/adk/agents/base_agent_config.py +++ b/src/google/adk/agents/base_agent_config.py @@ -25,7 +25,6 @@ from pydantic import BaseModel from pydantic import ConfigDict from pydantic import Field -from typing_extensions import deprecated from ..features import experimental from ..features import FeatureName @@ -35,9 +34,6 @@ TBaseAgentConfig = TypeVar('TBaseAgentConfig', bound='BaseAgentConfig') -@deprecated( - 'BaseAgentConfig is deprecated and will be removed in future versions.' -) @experimental(FeatureName.AGENT_CONFIG) class BaseAgentConfig(BaseModel): """The config for the YAML schema of a BaseAgent. diff --git a/src/google/adk/agents/common_configs.py b/src/google/adk/agents/common_configs.py index 73ee07e9ee..cefab0e8d1 100644 --- a/src/google/adk/agents/common_configs.py +++ b/src/google/adk/agents/common_configs.py @@ -16,6 +16,8 @@ from __future__ import annotations +from typing import Any +from typing import List from typing import Optional from pydantic import BaseModel @@ -26,18 +28,33 @@ from ..features import FeatureName +@experimental(FeatureName.AGENT_CONFIG) +class ArgumentConfig(BaseModel): + """An argument passed to a function or a class's constructor.""" + + model_config = ConfigDict(extra="forbid") + + name: Optional[str] = None + """Optional. The argument name. + + When the argument is for a positional argument, this can be omitted. + """ + + value: Any + """The argument value.""" + + @experimental(FeatureName.AGENT_CONFIG) class CodeConfig(BaseModel): """Code reference config for a variable, a function, or a class. - Only references an object by name. YAML cannot pass constructor args; to - use a configured object, build it in Python and reference its FQN here. + This config is used for configuring callbacks and tools. """ model_config = ConfigDict(extra="forbid") name: str - """Required. The fully qualified name of the variable, function, or class. + """Required. The name of the variable, function, class, etc. in code. Examples: @@ -48,6 +65,22 @@ class CodeConfig(BaseModel): When used for callbacks, it refers to a function, e.g. `my_library.my_callbacks.my_callback` """ + args: Optional[List[ArgumentConfig]] = None + """Optional. The arguments for the code when `name` refers to a function or a + class's constructor. + + Examples: + ``` + tools + - name: AgentTool + args: + - name: agent + value: search_agent.yaml + - name: skip_summarization + value: True + ``` + """ + @experimental(FeatureName.AGENT_CONFIG) class AgentRefConfig(BaseModel): diff --git a/src/google/adk/agents/config_agent_utils.py b/src/google/adk/agents/config_agent_utils.py index 82aaa6e452..f9a3e7f594 100644 --- a/src/google/adk/agents/config_agent_utils.py +++ b/src/google/adk/agents/config_agent_utils.py @@ -20,7 +20,6 @@ from typing import Any from typing import List -from typing_extensions import deprecated import yaml from ..features import experimental @@ -32,7 +31,6 @@ from .common_configs import CodeConfig -@deprecated("from_config is deprecated and will be removed in future versions.") @experimental(FeatureName.AGENT_CONFIG) def from_config(config_path: str) -> BaseAgent: """Build agent from a configfile path. @@ -82,6 +80,31 @@ def _resolve_agent_class(agent_class: str) -> type[BaseAgent]: ) +_BLOCKED_YAML_KEYS = frozenset({"args"}) +_ENFORCE_DENYLIST = False + + +def _set_enforce_denylist(value: bool) -> None: + global _ENFORCE_DENYLIST + _ENFORCE_DENYLIST = value + + +def _check_config_for_blocked_keys(node: Any, filename: str) -> None: + """Recursively check if the configuration contains any blocked keys.""" + if isinstance(node, dict): + for key, value in node.items(): + if key in _BLOCKED_YAML_KEYS: + raise ValueError( + f"Blocked key {key!r} found in {filename!r}. " + f"The '{key}' field is not allowed in agent configurations " + "because it can execute arbitrary code." + ) + _check_config_for_blocked_keys(value, filename) + elif isinstance(node, list): + for item in node: + _check_config_for_blocked_keys(item, filename) + + def _load_config_from_path(config_path: str) -> AgentConfig: """Load an agent's configuration from a YAML file. @@ -102,6 +125,9 @@ def _load_config_from_path(config_path: str) -> AgentConfig: with open(config_path, "r", encoding="utf-8") as f: config_data = yaml.safe_load(f) + if _ENFORCE_DENYLIST: + _check_config_for_blocked_keys(config_data, config_path) + return AgentConfig.model_validate(config_data) @@ -191,7 +217,15 @@ def resolve_code_reference(code_config: CodeConfig) -> Any: module_path, obj_name = code_config.name.rsplit(".", 1) module = importlib.import_module(module_path) - return getattr(module, obj_name) + obj = getattr(module, obj_name) + + if code_config.args and callable(obj): + kwargs = {arg.name: arg.value for arg in code_config.args if arg.name} + positional_args = [arg.value for arg in code_config.args if not arg.name] + + return obj(*positional_args, **kwargs) + else: + return obj @experimental(FeatureName.AGENT_CONFIG) diff --git a/src/google/adk/agents/config_schemas/AgentConfig.json b/src/google/adk/agents/config_schemas/AgentConfig.json index 9a252dafda..5d1999e6b6 100644 --- a/src/google/adk/agents/config_schemas/AgentConfig.json +++ b/src/google/adk/agents/config_schemas/AgentConfig.json @@ -34,7 +34,7 @@ }, "ApiAuth": { "additionalProperties": false, - "description": "The generic reusable api auth config.\n\nDeprecated. Please use AuthConfig (google/cloud/aiplatform/master/auth.proto)\ninstead. This data type is not supported in Gemini API.", + "description": "The generic reusable api auth config.\n\nDeprecated. Please use AuthConfig (google/cloud/aiplatform/master/auth.proto)\ninstead.", "properties": { "apiKeyConfig": { "anyOf": [ @@ -54,7 +54,7 @@ }, "ApiAuthApiKeyConfig": { "additionalProperties": false, - "description": "The API secret. This data type is not supported in Gemini API.", + "description": "The API secret.", "properties": { "apiKeySecretVersion": { "anyOf": [ @@ -88,21 +88,8 @@ }, "ApiKeyConfig": { "additionalProperties": false, - "description": "Config for authentication with API key.\n\nThis data type is not supported in Gemini API.", + "description": "Config for authentication with API key.", "properties": { - "apiKeySecret": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The name of the SecretManager secret version resource storing the API key. Format: `projects/{project}/secrets/{secrete}/versions/{version}` - If both `api_key_secret` and `api_key_string` are specified, this field takes precedence over `api_key_string`. - If specified, the `secretmanager.versions.access` permission should be granted to Vertex AI Extension Service Agent (https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents) on the specified resource.", - "title": "Apikeysecret" - }, "apiKeyString": { "anyOf": [ { @@ -113,40 +100,15 @@ } ], "default": null, - "description": "Optional. The API key to be used in the request directly.", + "description": "The API key to be used in the request directly.", "title": "Apikeystring" - }, - "httpElementLocation": { - "anyOf": [ - { - "$ref": "#/$defs/HttpElementLocation" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The location of the API key." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The parameter name of the API key. E.g. If the API request is \"https://example.com/act?api_key=\", \"api_key\" would be the parameter name.", - "title": "Name" } }, "title": "ApiKeyConfig", "type": "object" }, "ApiSpec": { - "description": "The API spec that the external API implements.\n\nThis enum is not supported in Gemini API.", + "description": "The API spec that the external API implements.", "enum": [ "API_SPEC_UNSPECIFIED", "SIMPLE_SEARCH", @@ -155,11 +117,11 @@ "title": "ApiSpec", "type": "string" }, - "AuthConfig": { + "ArgumentConfig": { "additionalProperties": false, - "description": "The authentication config to access the API.", + "description": "An argument passed to a function or a class's constructor.", "properties": { - "apiKey": { + "name": { "anyOf": [ { "type": "string" @@ -169,9 +131,22 @@ } ], "default": null, - "description": "The authentication config to access the API. Only API key is supported. This field is not supported in Gemini API.", - "title": "Apikey" + "title": "Name" }, + "value": { + "title": "Value" + } + }, + "required": [ + "value" + ], + "title": "ArgumentConfig", + "type": "object" + }, + "AuthConfig": { + "additionalProperties": false, + "description": "Auth configuration to run the extension.", + "properties": { "apiKeyConfig": { "anyOf": [ { @@ -250,7 +225,7 @@ }, "AuthConfigGoogleServiceAccountConfig": { "additionalProperties": false, - "description": "Config for Google Service Account Authentication.\n\nThis data type is not supported in Gemini API.", + "description": "Config for Google Service Account Authentication.", "properties": { "serviceAccount": { "anyOf": [ @@ -271,7 +246,7 @@ }, "AuthConfigHttpBasicAuthConfig": { "additionalProperties": false, - "description": "Config for HTTP Basic Authentication.\n\nThis data type is not supported in Gemini API.", + "description": "Config for HTTP Basic Authentication.", "properties": { "credentialSecret": { "anyOf": [ @@ -292,7 +267,7 @@ }, "AuthConfigOauthConfig": { "additionalProperties": false, - "description": "Config for user oauth. This data type is not supported in Gemini API.", + "description": "Config for user oauth.", "properties": { "accessToken": { "anyOf": [ @@ -326,7 +301,7 @@ }, "AuthConfigOidcConfig": { "additionalProperties": false, - "description": "Config for user OIDC auth.\n\nThis data type is not supported in Gemini API.", + "description": "Config for user OIDC auth.", "properties": { "idToken": { "anyOf": [ @@ -359,7 +334,7 @@ "type": "object" }, "AuthType": { - "description": "Type of auth scheme. This enum is not supported in Gemini API.", + "description": "Type of auth scheme.", "enum": [ "AUTH_TYPE_UNSPECIFIED", "NO_AUTH", @@ -421,7 +396,6 @@ }, "BaseAgentConfig": { "additionalProperties": true, - "deprecated": true, "description": "The config for the YAML schema of a BaseAgent.\n\nDo not use this class directly. It's the base class for all agent configs.", "properties": { "agent_class": { @@ -505,7 +479,7 @@ "type": "object" }, "Behavior": { - "description": "Specifies the function Behavior.\n\nCurrently only supported by the BidiGenerateContent method. This enum is not\nsupported in Vertex AI.", + "description": "Defines the function behavior. Defaults to `BLOCKING`.", "enum": [ "UNSPECIFIED", "BLOCKING", @@ -516,12 +490,11 @@ }, "Blob": { "additionalProperties": false, - "description": "A content blob.\n\nA Blob contains data of a specific media type. It is used to represent images,\naudio, and video.", + "description": "Content blob.", "properties": { - "data": { + "displayName": { "anyOf": [ { - "format": "base64url", "type": "string" }, { @@ -529,12 +502,13 @@ } ], "default": null, - "description": "Required. The raw bytes of the data.", - "title": "Data" + "description": "Optional. Display name of the blob. Used to provide a label or filename to distinguish blobs. This field is not currently used in the Gemini GenerateContent calls.", + "title": "Displayname" }, - "displayName": { + "data": { "anyOf": [ { + "format": "base64url", "type": "string" }, { @@ -542,8 +516,8 @@ } ], "default": null, - "description": "Optional. The display name of the blob. Used to provide a label or filename to distinguish blobs. This field is only returned in `PromptMessage` for prompt management. It is used in the Gemini calls only when server-side tools (`code_execution`, `google_search`, and `url_context`) are enabled. This field is not supported in Gemini API.", - "title": "Displayname" + "description": "Required. Raw bytes.", + "title": "Data" }, "mimeType": { "anyOf": [ @@ -564,11 +538,26 @@ }, "CodeConfig": { "additionalProperties": false, - "description": "Code reference config for a variable, a function, or a class.\n\nOnly references an object by name. YAML cannot pass constructor args; to\nuse a configured object, build it in Python and reference its FQN here.", + "description": "Code reference config for a variable, a function, or a class.\n\nThis config is used for configuring callbacks and tools.", "properties": { "name": { "title": "Name", "type": "string" + }, + "args": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/ArgumentConfig" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Args" } }, "required": [ @@ -579,7 +568,7 @@ }, "CodeExecutionResult": { "additionalProperties": false, - "description": "Result of executing the `ExecutableCode`.\n\nGenerated only when the `CodeExecution` tool is used.", + "description": "Result of executing the [ExecutableCode].\n\nOnly generated when using the [CodeExecution] tool, and always follows a\n`part` containing the [ExecutableCode].", "properties": { "outcome": { "anyOf": [ @@ -605,60 +594,11 @@ "default": null, "description": "Optional. Contains stdout when code execution is successful, stderr or other description otherwise.", "title": "Output" - }, - "id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The identifier of the `ExecutableCode` part this result is for. Only populated if the corresponding `ExecutableCode` has an id.", - "title": "Id" } }, "title": "CodeExecutionResult", "type": "object" }, - "ComputerUse": { - "additionalProperties": false, - "description": "Tool to support computer use.", - "properties": { - "environment": { - "anyOf": [ - { - "$ref": "#/$defs/Environment" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. The environment being operated." - }, - "excludedPredefinedFunctions": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "By default, predefined functions are included in the final model call.\n Some of them can be explicitly excluded from being automatically included.\n This can serve two purposes:\n 1. Using a more restricted / different action space.\n 2. Improving the definitions / instructions of predefined functions.", - "title": "Excludedpredefinedfunctions" - } - }, - "title": "ComputerUse", - "type": "object" - }, "Content": { "additionalProperties": false, "description": "Contains the multi-part content of a message.", @@ -689,7 +629,7 @@ } ], "default": null, - "description": "Optional. The producer of the content. Must be either 'user' or 'model'. If not set, the service will default to 'user'.", + "description": "Optional. The producer of the content. Must be either 'user' or\n 'model'. Useful to set for multi-turn conversations; otherwise, can be\n empty. If role is not specified, SDK will determine the role.", "title": "Role" } }, @@ -700,37 +640,37 @@ "additionalProperties": false, "description": "Describes the options to customize dynamic retrieval.", "properties": { - "dynamicThreshold": { + "mode": { "anyOf": [ { - "type": "number" + "$ref": "#/$defs/DynamicRetrievalConfigMode" }, { "type": "null" } ], "default": null, - "description": "Optional. The threshold to be used in dynamic retrieval. If not set, a system default value is used.", - "title": "Dynamicthreshold" + "description": "The mode of the predictor to be used in dynamic retrieval." }, - "mode": { + "dynamicThreshold": { "anyOf": [ { - "$ref": "#/$defs/DynamicRetrievalConfigMode" + "type": "number" }, { "type": "null" } ], "default": null, - "description": "The mode of the predictor to be used in dynamic retrieval." + "description": "Optional. The threshold to be used in dynamic retrieval. If not set, a system default value is used.", + "title": "Dynamicthreshold" } }, "title": "DynamicRetrievalConfig", "type": "object" }, "DynamicRetrievalConfigMode": { - "description": "The mode of the predictor to be used in dynamic retrieval.", + "description": "Config for the dynamic retrieval config mode.", "enum": [ "MODE_UNSPECIFIED", "MODE_DYNAMIC" @@ -740,20 +680,8 @@ }, "EnterpriseWebSearch": { "additionalProperties": false, - "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.\n\nThis data type is not supported in Gemini API.", + "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", "properties": { - "blockingConfidence": { - "anyOf": [ - { - "$ref": "#/$defs/PhishBlockThreshold" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Sites with confidence level chosen & above this value will be blocked from the search results." - }, "excludeDomains": { "anyOf": [ { @@ -785,7 +713,7 @@ }, "ExecutableCode": { "additionalProperties": false, - "description": "Model-generated code executed server-side, results returned to the model.\n\nOnly generated when using the `CodeExecution` tool, in which the code will\nbe automatically executed, and a corresponding `CodeExecutionResult` will\nalso be generated.", + "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", "properties": { "code": { "anyOf": [ @@ -811,19 +739,6 @@ ], "default": null, "description": "Required. Programming language of the `code`." - }, - "id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Unique identifier of the `ExecutableCode` part. The server returns the `CodeExecutionResult` with the matching `id`.", - "title": "Id" } }, "title": "ExecutableCode", @@ -831,7 +746,7 @@ }, "ExternalApi": { "additionalProperties": false, - "description": "Retrieve from data source powered by external API for grounding.\n\nThe external API is not owned by Google, but need to follow the pre-defined\nAPI spec. This data type is not supported in Gemini API.", + "description": "Retrieve from data source powered by external API for grounding.\n\nThe external API is not owned by Google, but need to follow the pre-defined\nAPI spec.", "properties": { "apiAuth": { "anyOf": [ @@ -912,7 +827,7 @@ }, "ExternalApiElasticSearchParams": { "additionalProperties": false, - "description": "The search parameters to use for the ELASTIC_SEARCH spec.\n\nThis data type is not supported in Gemini API.", + "description": "The search parameters to use for the ELASTIC_SEARCH spec.", "properties": { "index": { "anyOf": [ @@ -959,7 +874,7 @@ }, "ExternalApiSimpleSearchParams": { "additionalProperties": false, - "description": "The search parameters to use for SIMPLE_SEARCH spec.\n\nThis data type is not supported in Gemini API.", + "description": "The search parameters to use for SIMPLE_SEARCH spec.", "properties": {}, "title": "ExternalApiSimpleSearchParams", "type": "object" @@ -1168,7 +1083,7 @@ }, "FileData": { "additionalProperties": false, - "description": "URI-based data.\n\nA FileData message contains a URI pointing to data of a specific media type.\nIt is used to represent images, audio, and video stored in Google Cloud\nStorage.", + "description": "URI based data.", "properties": { "displayName": { "anyOf": [ @@ -1180,7 +1095,7 @@ } ], "default": null, - "description": "Optional. The display name of the file. Used to provide a label or filename to distinguish files. This field is only returned in `PromptMessage` for prompt management. It is used in the Gemini calls only when server side tools (`code_execution`, `google_search`, and `url_context`) are enabled. This field is not supported in Gemini API.", + "description": "Optional. Display name of the file data. Used to provide a label or filename to distinguish file data. It is not currently used in the Gemini GenerateContent calls.", "title": "Displayname" }, "fileUri": { @@ -1193,7 +1108,7 @@ } ], "default": null, - "description": "Required. The URI of the file in Google Cloud Storage.", + "description": "Required. URI.", "title": "Fileuri" }, "mimeType": { @@ -1213,63 +1128,12 @@ "title": "FileData", "type": "object" }, - "FileSearch": { - "additionalProperties": false, - "description": "The FileSearch tool that retrieves knowledge from Semantic Retrieval corpora.\n\nFiles are imported to Semantic Retrieval corpora using the ImportFile API.\nThis data type is not supported in Vertex AI.", - "properties": { - "fileSearchStoreNames": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. The names of the file_search_stores to retrieve from. Example: `fileSearchStores/my-file-search-store-123`", - "title": "Filesearchstorenames" - }, - "topK": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The number of semantic retrieval chunks to retrieve.", - "title": "Topk" - }, - "metadataFilter": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Metadata filter to apply to the semantic retrieval documents and chunks.", - "title": "Metadatafilter" - } - }, - "title": "FileSearch", - "type": "object" - }, "FileSource": { "description": "Source of the File.", "enum": [ "SOURCE_UNSPECIFIED", "UPLOADED", - "GENERATED", - "REGISTERED" + "GENERATED" ], "title": "FileSource", "type": "string" @@ -1350,7 +1214,7 @@ } ], "default": null, - "description": "The unique id of the function call. If populated, the client to execute the\n `function_call` and return the response with the matching `id`.", + "description": "The unique ID of the function call. If populated, the client to execute the\n `function_call` and return the response with the matching `id`.", "title": "Id" }, "args": { @@ -1377,37 +1241,8 @@ } ], "default": null, - "description": "Optional. The name of the function to call. Matches [FunctionDeclaration.name].", + "description": "Required. The name of the function to call. Matches [FunctionDeclaration.name].", "title": "Name" - }, - "partialArgs": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/PartialArg" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The partial argument value of the function call. If provided, represents the arguments/fields that are streamed incrementally. This field is not supported in Gemini API.", - "title": "Partialargs" - }, - "willContinue": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Whether this is the last part of the FunctionCall. If true, another partial message for the current FunctionCall is expected to follow. This field is not supported in Gemini API.", - "title": "Willcontinue" } }, "title": "FunctionCall", @@ -1417,22 +1252,6 @@ "additionalProperties": false, "description": "Function calling config.", "properties": { - "allowedFunctionNames": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Function names to call. Only set when the Mode is ANY. Function names should match [FunctionDeclaration.name]. With mode set to ANY, model will predict a function call from the set of function names provided.", - "title": "Allowedfunctionnames" - }, "mode": { "anyOf": [ { @@ -1445,39 +1264,53 @@ "default": null, "description": "Optional. Function calling mode." }, - "streamFunctionCallArguments": { + "allowedFunctionNames": { "anyOf": [ { - "type": "boolean" + "items": { + "type": "string" + }, + "type": "array" }, { "type": "null" } ], "default": null, - "description": "Optional. When set to true, arguments of a single function call will be streamed out in multiple parts/contents/responses. Partial parameter results will be returned in the [FunctionCall.partial_args] field. This field is not supported in Gemini API.", - "title": "Streamfunctioncallarguments" + "description": "Optional. Function names to call. Only set when the Mode is ANY. Function names should match [FunctionDeclaration.name]. With mode set to ANY, model will predict a function call from the set of function names provided.", + "title": "Allowedfunctionnames" } }, "title": "FunctionCallingConfig", "type": "object" }, "FunctionCallingConfigMode": { - "description": "Function calling mode.", + "description": "Config for the function calling config mode.", "enum": [ "MODE_UNSPECIFIED", "AUTO", "ANY", - "NONE", - "VALIDATED" + "NONE" ], "title": "FunctionCallingConfigMode", "type": "string" }, "FunctionDeclaration": { "additionalProperties": false, - "description": "Structured representation of a function declaration as defined by the [OpenAPI 3.0 specification](https://spec.openapis.org/oas/v3.0.3).\n\nIncluded in this declaration are the function name, description, parameters\nand response type. This FunctionDeclaration is a representation of a block of\ncode that can be used as a `Tool` by the model and executed by the client.", + "description": "Defines a function that the model can generate JSON inputs for.\n\nThe inputs are based on `OpenAPI 3.0 specifications\n`_.", "properties": { + "behavior": { + "anyOf": [ + { + "$ref": "#/$defs/Behavior" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Defines the function behavior." + }, "description": { "anyOf": [ { @@ -1501,7 +1334,7 @@ } ], "default": null, - "description": "Required. The name of the function to call. Must start with a letter or an underscore. Must be a-z, A-Z, 0-9, or contain underscores, dots, colons and dashes, with a maximum length of 64.", + "description": "Required. The name of the function to call. Must start with a letter or an underscore. Must be a-z, A-Z, 0-9, or contain underscores, dots and dashes, with a maximum length of 64.", "title": "Name" }, "parameters": { @@ -1514,7 +1347,7 @@ } ], "default": null, - "description": "Optional. Describes the parameters to this function in JSON Schema Object format. Reflects the Open API 3.03 Parameter Object. string Key: the name of the parameter. Parameter names are case sensitive. Schema Value: the Schema defining the type used for the parameter. For function with no parameters, this can be left unset. Parameter names must start with a letter or an underscore and must only contain chars a-z, A-Z, 0-9, or underscores with a maximum length of 64. Example with 1 required and 1 optional parameter: type: OBJECT properties: param1: type: STRING param2: type: INTEGER required: - param1" + "description": "Optional. Describes the parameters to this function in JSON Schema Object format. Reflects the Open API 3.03 Parameter Object. string Key: the name of the parameter. Parameter names are case-sensitive. Schema Value: the Schema defining the type used for the parameter. For function with no parameters, this can be left unset. Parameter names must start with a letter or an underscore and must only contain chars a-z, A-Z, 0-9, or underscores with a maximum length of 64. Example with 1 required and 1 optional parameter: type: OBJECT properties: param1: type: STRING param2: type: INTEGER required: - param1" }, "parametersJsonSchema": { "anyOf": [ @@ -1549,18 +1382,6 @@ "default": null, "description": "Optional. Describes the output from this function in JSON Schema format. The value specified by the schema is the response value of the function. This field is mutually exclusive with `response`.", "title": "Responsejsonschema" - }, - "behavior": { - "anyOf": [ - { - "$ref": "#/$defs/Behavior" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Specifies the function Behavior. Currently only supported by the BidiGenerateContent method. This field is not supported in Vertex AI." } }, "title": "FunctionDeclaration", @@ -1595,22 +1416,6 @@ "default": null, "description": "Specifies how the response should be scheduled in the conversation. Only applicable to NON_BLOCKING function calls, is ignored otherwise. Defaults to WHEN_IDLE." }, - "parts": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/FunctionResponsePart" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "List of parts that constitute a function response. Each part may\n have a different IANA MIME type.", - "title": "Parts" - }, "id": { "anyOf": [ { @@ -1621,7 +1426,7 @@ } ], "default": null, - "description": "Optional. The id of the function call this response is for. Populated by the client to match the corresponding function call `id`.", + "description": "Optional. The ID of the function call this response is for. Populated by the client to match the corresponding function call `id`.", "title": "Id" }, "name": { @@ -1655,133 +1460,6 @@ "title": "FunctionResponse", "type": "object" }, - "FunctionResponseBlob": { - "additionalProperties": false, - "description": "Raw media bytes for function response.\n\nText should not be sent as raw bytes, use the FunctionResponse.response\nfield.", - "properties": { - "mimeType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. The IANA standard MIME type of the source data.", - "title": "Mimetype" - }, - "data": { - "anyOf": [ - { - "format": "base64url", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. Inline media bytes.", - "title": "Data" - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Display name of the blob.\n Used to provide a label or filename to distinguish blobs.", - "title": "Displayname" - } - }, - "title": "FunctionResponseBlob", - "type": "object" - }, - "FunctionResponseFileData": { - "additionalProperties": false, - "description": "URI based data for function response.", - "properties": { - "fileUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. URI.", - "title": "Fileuri" - }, - "mimeType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. The IANA standard MIME type of the source data.", - "title": "Mimetype" - }, - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Display name of the file.\n Used to provide a label or filename to distinguish files.", - "title": "Displayname" - } - }, - "title": "FunctionResponseFileData", - "type": "object" - }, - "FunctionResponsePart": { - "additionalProperties": false, - "description": "A datatype containing media that is part of a `FunctionResponse` message.\n\nA `FunctionResponsePart` consists of data which has an associated datatype. A\n`FunctionResponsePart` can only contain one of the accepted types in\n`FunctionResponsePart.data`.\n\nA `FunctionResponsePart` must have a fixed IANA MIME type identifying the\ntype and subtype of the media if the `inline_data` field is filled with raw\nbytes.", - "properties": { - "inlineData": { - "anyOf": [ - { - "$ref": "#/$defs/FunctionResponseBlob" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Inline media bytes." - }, - "fileData": { - "anyOf": [ - { - "$ref": "#/$defs/FunctionResponseFileData" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. URI based data." - } - }, - "title": "FunctionResponsePart", - "type": "object" - }, "FunctionResponseScheduling": { "description": "Specifies how the response should be scheduled in the conversation.", "enum": [ @@ -1809,19 +1487,6 @@ "default": null, "description": "Used to override HTTP request options." }, - "shouldReturnHttpResponse": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": " If true, the raw HTTP response will be returned in the 'sdk_http_response' field.", - "title": "Shouldreturnhttpresponse" - }, "systemInstruction": { "anyOf": [ { @@ -1830,10 +1495,6 @@ { "type": "string" }, - { - "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", - "type": "object" - }, { "$ref": "#/$defs/File" }, @@ -1846,10 +1507,6 @@ { "type": "string" }, - { - "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", - "type": "object" - }, { "$ref": "#/$defs/File" }, @@ -2024,7 +1681,7 @@ } ], "default": null, - "description": "Output response mimetype of the generated candidate text.\n Supported mimetype:\n - `text/plain`: (default) Text output.\n - `application/json`: JSON response in the candidates.\n The model needs to be prompted to output the appropriate response type,\n otherwise the behavior is undefined.\n ", + "description": "Output response mimetype of the generated candidate text.\n Supported mimetype:\n - `text/plain`: (default) Text output.\n - `application/json`: JSON response in the candidates.\n The model needs to be prompted to output the appropriate response type,\n otherwise the behavior is undefined.\n This is a preview feature.\n ", "title": "Responsemimetype" }, "responseSchema": { @@ -2033,27 +1690,15 @@ "additionalProperties": true, "type": "object" }, - { - "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", - "type": "object" - }, { "$ref": "#/$defs/Schema" }, - { - "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", - "type": "object" - }, - { - "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", - "type": "object" - }, { "type": "null" } ], "default": null, - "description": "The `Schema` object allows the definition of input and output data types.\n These types can be objects, but also primitives and arrays.\n Represents a select subset of an [OpenAPI 3.0 schema\n object](https://spec.openapis.org/oas/v3.0.3#schema).\n If set, a compatible response_mime_type must also be set.\n Compatible mimetypes: `application/json`: Schema for JSON response.\n\n If `response_schema` doesn't process your schema correctly, try using\n `response_json_schema` instead.\n ", + "description": "The `Schema` object allows the definition of input and output data types.\n These types can be objects, but also primitives and arrays.\n Represents a select subset of an [OpenAPI 3.0 schema\n object](https://spec.openapis.org/oas/v3.0.3#schema).\n If set, a compatible response_mime_type must also be set.\n Compatible mimetypes: `application/json`: Schema for JSON response.\n ", "title": "Responseschema" }, "responseJsonSchema": { @@ -2115,16 +1760,8 @@ { "$ref": "#/$defs/google__genai__types__Tool" }, - { - "description": "Fallback for invalid schema: core_schema.CallableSchema", - "type": "object" - }, { "$ref": "#/$defs/mcp__types__Tool" - }, - { - "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", - "type": "object" } ] }, @@ -2259,55 +1896,6 @@ ], "default": null, "description": "The thinking features configuration.\n " - }, - "imageConfig": { - "anyOf": [ - { - "$ref": "#/$defs/ImageConfig" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The image generation configuration.\n " - }, - "enableEnhancedCivicAnswers": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Enables enhanced civic answers. It may not be available for all\n models. This field is not supported in Gemini Enterprise Agent Platform.\n ", - "title": "Enableenhancedcivicanswers" - }, - "modelArmorConfig": { - "anyOf": [ - { - "$ref": "#/$defs/ModelArmorConfig" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Settings for prompt and response sanitization using the Model Armor\n service. If supplied, safety_settings must not be supplied.\n " - }, - "serviceTier": { - "anyOf": [ - { - "$ref": "#/$defs/ServiceTier" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The service tier to use for the request. For example, ServiceTier.FLEX." } }, "title": "GenerateContentConfig", @@ -2315,7 +1903,7 @@ }, "GenerationConfigRoutingConfig": { "additionalProperties": false, - "description": "The configuration for routing the request to a specific model.\n\nThis can be used to control which model is used for the generation, either\nautomatically or by specifying a model name. This data type is not supported\nin Gemini API.", + "description": "The configuration for routing the request to a specific model.", "properties": { "autoMode": { "anyOf": [ @@ -2327,7 +1915,7 @@ } ], "default": null, - "description": "In this mode, the model is selected automatically based on the content of the request." + "description": "Automated routing." }, "manualMode": { "anyOf": [ @@ -2339,7 +1927,7 @@ } ], "default": null, - "description": "In this mode, the model is specified manually." + "description": "Manual routing." } }, "title": "GenerationConfigRoutingConfig", @@ -2347,7 +1935,7 @@ }, "GenerationConfigRoutingConfigAutoRoutingMode": { "additionalProperties": false, - "description": "The configuration for automated routing.\n\nWhen automated routing is specified, the routing will be determined by the\npretrained routing model and customer provided model routing preference. This\ndata type is not supported in Gemini API.", + "description": "When automated routing is specified, the routing will be determined by the pretrained routing model and customer provided model routing preference.", "properties": { "modelRoutingPreference": { "anyOf": [ @@ -2374,7 +1962,7 @@ }, "GenerationConfigRoutingConfigManualRoutingMode": { "additionalProperties": false, - "description": "The configuration for manual routing.\n\nWhen manual routing is specified, the model will be selected based on the\nmodel name provided. This data type is not supported in Gemini API.", + "description": "When manual routing is set, the specified model will be used directly.", "properties": { "modelName": { "anyOf": [ @@ -2386,7 +1974,7 @@ } ], "default": null, - "description": "The name of the model to use. Only public LLM models are accepted.", + "description": "The model name to use. Only the public LLM models are accepted. See [Supported models](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/inference#supported-models).", "title": "Modelname" } }, @@ -2395,7 +1983,7 @@ }, "GoogleMaps": { "additionalProperties": false, - "description": "Tool to retrieve knowledge from Google Maps.", + "description": "Tool to support Google Maps in Model.", "properties": { "authConfig": { "anyOf": [ @@ -2407,20 +1995,7 @@ } ], "default": null, - "description": "The authentication config to access the API. Only API key is supported. This field is not supported in Gemini API." - }, - "enableWidget": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Whether to return a widget context token in the GroundingMetadata of the response. Developers can use the widget context token to render a Google Maps widget with geospatial context related to the places that the model references in the response.", - "title": "Enablewidget" + "description": "Optional. Auth config for the Google Maps tool." } }, "title": "GoogleMaps", @@ -2428,31 +2003,19 @@ }, "GoogleSearch": { "additionalProperties": false, - "description": "GoogleSearch tool type.\n\nTool to support Google Search in Model. Powered by Google.", + "description": "Tool to support Google Search in Model. Powered by Google.", "properties": { - "searchTypes": { - "anyOf": [ - { - "$ref": "#/$defs/SearchTypes" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The set of search types to enable. If not set, web search is enabled by default." - }, - "blockingConfidence": { + "timeRangeFilter": { "anyOf": [ { - "$ref": "#/$defs/PhishBlockThreshold" + "$ref": "#/$defs/Interval" }, { "type": "null" } ], "default": null, - "description": "Optional. Sites with confidence level chosen & above this value will be blocked from the search results. This field is not supported in Gemini API." + "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " }, "excludeDomains": { "anyOf": [ @@ -2467,20 +2030,8 @@ } ], "default": null, - "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains. Example: [\"amazon.com\", \"facebook.com\"]. This field is not supported in Gemini API.", + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", "title": "Excludedomains" - }, - "timeRangeFilter": { - "anyOf": [ - { - "$ref": "#/$defs/Interval" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Filter search results to a specific time range. If customers set a start time, they must set an end time (and vice versa). This field is not supported in Vertex AI." } }, "title": "GoogleSearch", @@ -2507,7 +2058,7 @@ "type": "object" }, "HarmBlockMethod": { - "description": "The method for blocking content.\n\nIf not specified, the default behavior is to use the probability score. This\nenum is not supported in Gemini API.", + "description": "Optional.\n\nSpecify if the threshold is used for probability or severity score. If not\nspecified, the threshold is used for probability score.", "enum": [ "HARM_BLOCK_METHOD_UNSPECIFIED", "SEVERITY", @@ -2517,7 +2068,7 @@ "type": "string" }, "HarmBlockThreshold": { - "description": "The threshold for blocking content.\n\nIf the harm probability exceeds this threshold, the content will be blocked.", + "description": "Required. The harm block threshold.", "enum": [ "HARM_BLOCK_THRESHOLD_UNSPECIFIED", "BLOCK_LOW_AND_ABOVE", @@ -2530,36 +2081,22 @@ "type": "string" }, "HarmCategory": { - "description": "The harm category to be blocked.", + "description": "Required. Harm category.", "enum": [ "HARM_CATEGORY_UNSPECIFIED", - "HARM_CATEGORY_HARASSMENT", "HARM_CATEGORY_HATE_SPEECH", - "HARM_CATEGORY_SEXUALLY_EXPLICIT", "HARM_CATEGORY_DANGEROUS_CONTENT", + "HARM_CATEGORY_HARASSMENT", + "HARM_CATEGORY_SEXUALLY_EXPLICIT", "HARM_CATEGORY_CIVIC_INTEGRITY", "HARM_CATEGORY_IMAGE_HATE", "HARM_CATEGORY_IMAGE_DANGEROUS_CONTENT", "HARM_CATEGORY_IMAGE_HARASSMENT", - "HARM_CATEGORY_IMAGE_SEXUALLY_EXPLICIT", - "HARM_CATEGORY_JAILBREAK" + "HARM_CATEGORY_IMAGE_SEXUALLY_EXPLICIT" ], "title": "HarmCategory", "type": "string" }, - "HttpElementLocation": { - "description": "The location of the API key. This enum is not supported in Gemini API.", - "enum": [ - "HTTP_IN_UNSPECIFIED", - "HTTP_IN_QUERY", - "HTTP_IN_HEADER", - "HTTP_IN_PATH", - "HTTP_IN_BODY", - "HTTP_IN_COOKIE" - ], - "title": "HttpElementLocation", - "type": "string" - }, "HttpOptions": { "additionalProperties": false, "description": "HTTP options to be used in each of the requests.", @@ -2577,18 +2114,6 @@ "description": "The base URL for the AI platform service endpoint.", "title": "Baseurl" }, - "baseUrlResourceScope": { - "anyOf": [ - { - "$ref": "#/$defs/ResourceScope" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The resource scope used to constructing the resource name when base_url is set" - }, "apiVersion": { "anyOf": [ { @@ -2670,7 +2195,7 @@ } ], "default": null, - "description": "Extra parameters to add to the request body.\n The structure must match the backend API's request structure.\n - Gemini Enterprise Agent Platform backend API docs: https://cloud.google.com/vertex-ai/docs/reference/rest\n - GeminiAPI backend API docs: https://ai.google.dev/api/rest", + "description": "Extra parameters to add to the request body.\n The structure must match the backend API's request structure.\n - VertexAI backend API docs: https://cloud.google.com/vertex-ai/docs/reference/rest\n - GeminiAPI backend API docs: https://ai.google.dev/api/rest", "title": "Extrabody" }, "retryOptions": { @@ -2684,69 +2209,27 @@ ], "default": null, "description": "HTTP retry options for the request." - }, - "httpxClient": { + } + }, + "title": "HttpOptions", + "type": "object" + }, + "HttpRetryOptions": { + "additionalProperties": false, + "description": "HTTP retry options to be used in each of the requests.", + "properties": { + "attempts": { "anyOf": [ { - "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", - "type": "object" + "type": "integer" }, { "type": "null" } ], "default": null, - "description": "A custom httpx client to be used for the request.", - "title": "Httpxclient" - }, - "httpxAsyncClient": { - "anyOf": [ - { - "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "A custom httpx async client to be used for the request.", - "title": "Httpxasyncclient" - }, - "aiohttpClient": { - "anyOf": [ - { - "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "A custom aiohttp client session to be used for the request.", - "title": "Aiohttpclient" - } - }, - "title": "HttpOptions", - "type": "object" - }, - "HttpRetryOptions": { - "additionalProperties": false, - "description": "HTTP retry options to be used in each of the requests.", - "properties": { - "attempts": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Maximum number of attempts, including the original request.\n If 0 or 1, it means no retries. If not specified, default to 5.", - "title": "Attempts" + "description": "Maximum number of attempts, including the original request.\n If 0 or 1, it means no retries.", + "title": "Attempts" }, "initialDelay": { "anyOf": [ @@ -2758,7 +2241,7 @@ } ], "default": null, - "description": "Initial delay before the first retry, in fractions of a second. If not specified, default to 1.0 second.", + "description": "Initial delay before the first retry, in fractions of a second.", "title": "Initialdelay" }, "maxDelay": { @@ -2771,7 +2254,7 @@ } ], "default": null, - "description": "Maximum delay between retries, in fractions of a second. If not specified, default to 60.0 seconds.", + "description": "Maximum delay between retries, in fractions of a second.", "title": "Maxdelay" }, "expBase": { @@ -2784,7 +2267,7 @@ } ], "default": null, - "description": "Multiplier by which the delay increases after each attempt. If not specified, default to 2.0.", + "description": "Multiplier by which the delay increases after each attempt.", "title": "Expbase" }, "jitter": { @@ -2797,7 +2280,7 @@ } ], "default": null, - "description": "Randomness factor for the delay. If not specified, default to 1.0.", + "description": "Randomness factor for the delay.", "title": "Jitter" }, "httpStatusCodes": { @@ -2813,198 +2296,18 @@ } ], "default": null, - "description": "List of HTTP status codes that should trigger a retry.\n If not specified, a default set of retryable codes (408, 429, and 5xx) may be used.", + "description": "List of HTTP status codes that should trigger a retry.\n If not specified, a default set of retryable codes may be used.", "title": "Httpstatuscodes" } }, "title": "HttpRetryOptions", "type": "object" }, - "Icon": { - "additionalProperties": true, - "description": "An icon for display in user interfaces.", - "properties": { - "src": { - "title": "Src", - "type": "string" - }, - "mimeType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Mimetype" - }, - "sizes": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Sizes" - } - }, - "required": [ - "src" - ], - "title": "Icon", - "type": "object" - }, - "ImageConfig": { - "additionalProperties": false, - "description": "The image generation configuration to be used in GenerateContentConfig.", - "properties": { - "aspectRatio": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Aspect ratio of the generated images. Supported values are\n \"1:1\", \"2:3\", \"3:2\", \"3:4\", \"4:3\", \"9:16\", \"16:9\", and \"21:9\".", - "title": "Aspectratio" - }, - "imageSize": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Specifies the size of generated images. Supported\n values are `1K`, `2K`, `4K`. If not specified, the model will use default\n value `1K`.", - "title": "Imagesize" - }, - "personGeneration": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Controls the generation of people. Supported values are:\n ALLOW_ALL, ALLOW_ADULT, ALLOW_NONE.", - "title": "Persongeneration" - }, - "prominentPeople": { - "anyOf": [ - { - "$ref": "#/$defs/ProminentPeople" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Controls whether prominent people (celebrities) generation is allowed. If used with personGeneration, personGeneration enum would take precedence. For instance, if ALLOW_NONE is set, all person generation would be blocked. If this field is unspecified, the default behavior is to allow prominent people. This field is not supported in Gemini API." - }, - "outputMimeType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "MIME type of the generated image. This field is not\n supported in Gemini API.", - "title": "Outputmimetype" - }, - "outputCompressionQuality": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Compression quality of the generated image (for\n ``image/jpeg`` only). This field is not supported in Gemini API.", - "title": "Outputcompressionquality" - }, - "imageOutputOptions": { - "anyOf": [ - { - "$ref": "#/$defs/ImageConfigImageOutputOptions" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The image output format for generated images. This field is not supported in Gemini API." - } - }, - "title": "ImageConfig", - "type": "object" - }, - "ImageConfigImageOutputOptions": { - "additionalProperties": false, - "description": "The image output format for generated images.\n\nThis data type is not supported in Gemini API.", - "properties": { - "compressionQuality": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The compression quality of the output image.", - "title": "Compressionquality" - }, - "mimeType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The image format that the output should be saved as.", - "title": "Mimetype" - } - }, - "title": "ImageConfigImageOutputOptions", - "type": "object" - }, - "ImageSearch": { - "additionalProperties": false, - "description": "Image search for grounding and related configurations.", - "properties": {}, - "title": "ImageSearch", - "type": "object" - }, "Interval": { "additionalProperties": false, - "description": "Represents a time interval, encoded as a Timestamp start (inclusive) and a Timestamp end (exclusive).\n\nThe start must be less than or equal to the end. When the start equals the\nend, the interval is empty (matches no time). When both start and end are\nunspecified, the interval matches any time.", + "description": "Represents a time interval, encoded as a start time (inclusive) and an end time (exclusive).\n\nThe start time must be less than or equal to the end time.\nWhen the start equals the end time, the interval is an empty interval.\n(matches no time)\nWhen both start and end are unspecified, the interval matches any time.", "properties": { - "endTime": { + "startTime": { "anyOf": [ { "format": "date-time", @@ -3015,10 +2318,10 @@ } ], "default": null, - "description": "Optional. Exclusive end of the interval. If specified, a Timestamp matching this interval will have to be before the end.", - "title": "Endtime" + "description": "The start time of the interval.", + "title": "Starttime" }, - "startTime": { + "endTime": { "anyOf": [ { "format": "date-time", @@ -3029,15 +2332,15 @@ } ], "default": null, - "description": "Optional. Inclusive start of the interval. If specified, a Timestamp matching this interval will have to be the same or after the start.", - "title": "Starttime" + "description": "The end time of the interval.", + "title": "Endtime" } }, "title": "Interval", "type": "object" }, "Language": { - "description": "Programming language of the `code`.", + "description": "Required. Programming language of the `code`.", "enum": [ "LANGUAGE_UNSPECIFIED", "PYTHON" @@ -3081,7 +2384,6 @@ }, "LlmAgentConfig": { "additionalProperties": false, - "deprecated": true, "description": "The config for the YAML schema of a LlmAgent.", "properties": { "agent_class": { @@ -3159,72 +2461,14 @@ } ], "default": null, - "description": "Optional. LlmAgent.model. Provide a model name string (e.g. \"gemini-3-flash-preview\"). If not set, the model will be inherited from the ancestor or fall back to the system default (gemini-3-flash-preview unless overridden via LlmAgent.set_default_model). To construct a model instance from code, use model_code.", + "description": "Optional. LlmAgent.model. Provide a model name string (e.g. \"gemini-2.5-flash\"). If not set, the model will be inherited from the ancestor or fall back to the system default (gemini-2.5-flash unless overridden via LlmAgent.set_default_model). To construct a model instance from code, use model_code.", "title": "Model" }, - "model_code": { - "anyOf": [ - { - "$ref": "#/$defs/CodeConfig" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. A CodeConfig that instantiates a BaseLlm implementation such as LiteLlm with custom arguments (API base, fallbacks, etc.). Cannot be set together with `model`." - }, "instruction": { - "description": "Required. LlmAgent.instruction. Dynamic instructions with placeholder support. Behavior: if static_instruction is None, goes to system_instruction; if static_instruction is set, goes to user content after static content.", + "description": "Required. LlmAgent.instruction.", "title": "Instruction", "type": "string" }, - "static_instruction": { - "anyOf": [ - { - "$ref": "#/$defs/Content" - }, - { - "type": "string" - }, - { - "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", - "type": "object" - }, - { - "$ref": "#/$defs/File" - }, - { - "$ref": "#/$defs/Part" - }, - { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", - "type": "object" - }, - { - "$ref": "#/$defs/File" - }, - { - "$ref": "#/$defs/Part" - } - ] - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. LlmAgent.static_instruction. Static content sent literally at position 0 without placeholder processing. When set, changes instruction behavior to go to user content instead of system_instruction. Supports context caching. Accepts types.ContentUnion (str, types.Content, types.Part, PIL.Image.Image, types.File, or list[PartUnion]).", - "title": "Static Instruction" - }, "disallow_transfer_to_parent": { "anyOf": [ { @@ -3311,7 +2555,7 @@ } ], "default": null, - "description": "Optional. LlmAgent.tools.\n\nExamples:\n\n For ADK built-in tools in `google.adk.tools` package, they can be referenced\n directly with the name:\n\n ```\n tools:\n - name: google_search\n - name: load_memory\n ```\n\n For user-defined tools, they can be referenced with fully qualified name:\n\n ```\n tools:\n - name: my_library.my_tools.my_tool\n ```\n\n For tools that needs to be created via functions:\n\n ```\n tools:\n - name: my_library.my_tools.create_tool\n args:\n - name: param1\n value: value1\n - name: param2\n value: value2\n ```\n\n For more advanced tools, instead of specifying arguments in config, it's\n recommended to define them in Python files and reference them. E.g.,\n\n ```\n # tools.py\n my_mcp_toolset = McpToolset(\n connection_params=StdioServerParameters(\n command=\"npx\",\n args=[\"-y\", \"@notionhq/notion-mcp-server\"],\n env={\"OPENAPI_MCP_HEADERS\": NOTION_HEADERS},\n )\n )\n ```\n\n Then, reference the toolset in config:\n\n ```\n tools:\n - name: tools.my_mcp_toolset\n ```", + "description": "Optional. LlmAgent.tools.\n\nExamples:\n\n For ADK built-in tools in `google.adk.tools` package, they can be referenced\n directly with the name:\n\n ```\n tools:\n - name: google_search\n - name: load_memory\n ```\n\n For user-defined tools, they can be referenced with fully qualified name:\n\n ```\n tools:\n - name: my_library.my_tools.my_tool\n ```\n\n For tools that needs to be created via functions:\n\n ```\n tools:\n - name: my_library.my_tools.create_tool\n args:\n - name: param1\n value: value1\n - name: param2\n value: value2\n ```\n\n For more advanced tools, instead of specifying arguments in config, it's\n recommended to define them in Python files and reference them. E.g.,\n\n ```\n # tools.py\n my_mcp_toolset = MCPToolset(\n connection_params=StdioServerParameters(\n command=\"npx\",\n args=[\"-y\", \"@notionhq/notion-mcp-server\"],\n env={\"OPENAPI_MCP_HEADERS\": NOTION_HEADERS},\n )\n )\n ```\n\n Then, reference the toolset in config:\n\n ```\n tools:\n - name: tools.my_mcp_toolset\n ```", "title": "Tools" }, "before_model_callbacks": { @@ -3400,7 +2644,6 @@ }, "LoopAgentConfig": { "additionalProperties": false, - "deprecated": true, "description": "The config for the YAML schema of a LoopAgent.", "properties": { "agent_class": { @@ -3488,92 +2731,25 @@ "title": "LoopAgentConfig", "type": "object" }, - "McpServer": { + "MediaResolution": { + "description": "The media resolution to use.", + "enum": [ + "MEDIA_RESOLUTION_UNSPECIFIED", + "MEDIA_RESOLUTION_LOW", + "MEDIA_RESOLUTION_MEDIUM", + "MEDIA_RESOLUTION_HIGH" + ], + "title": "MediaResolution", + "type": "string" + }, + "ModelSelectionConfig": { "additionalProperties": false, - "description": "A MCPServer is a server that can be called by the model to perform actions.\n\nIt is a server that implements the MCP protocol. Next ID: 5. This data type is\nnot supported in Vertex AI.", + "description": "Config for model selection.", "properties": { - "name": { + "featureSelectionPreference": { "anyOf": [ { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The name of the MCPServer.", - "title": "Name" - }, - "streamableHttpTransport": { - "anyOf": [ - { - "$ref": "#/$defs/StreamableHttpTransport" - }, - { - "type": "null" - } - ], - "default": null, - "description": "A transport that can stream HTTP requests and responses." - } - }, - "title": "McpServer", - "type": "object" - }, - "MediaResolution": { - "description": "The media resolution to use.", - "enum": [ - "MEDIA_RESOLUTION_UNSPECIFIED", - "MEDIA_RESOLUTION_LOW", - "MEDIA_RESOLUTION_MEDIUM", - "MEDIA_RESOLUTION_HIGH" - ], - "title": "MediaResolution", - "type": "string" - }, - "ModelArmorConfig": { - "additionalProperties": false, - "description": "Configuration for Model Armor.\n\nModel Armor is a Google Cloud service that provides safety and security\nfiltering for prompts and responses. It helps protect your AI applications\nfrom risks such as harmful content, sensitive data leakage, and prompt\ninjection attacks. This data type is not supported in Gemini API.", - "properties": { - "promptTemplateName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The resource name of the Model Armor template to use for prompt screening. A Model Armor template is a set of customized filters and thresholds that define how Model Armor screens content. If specified, Model Armor will use this template to check the user's prompt for safety and security risks before it is sent to the model. The name must be in the format `projects/{project}/locations/{location}/templates/{template}`.", - "title": "Prompttemplatename" - }, - "responseTemplateName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The resource name of the Model Armor template to use for response screening. A Model Armor template is a set of customized filters and thresholds that define how Model Armor screens content. If specified, Model Armor will use this template to check the model's response for safety and security risks before it is returned to the user. The name must be in the format `projects/{project}/locations/{location}/templates/{template}`.", - "title": "Responsetemplatename" - } - }, - "title": "ModelArmorConfig", - "type": "object" - }, - "ModelSelectionConfig": { - "additionalProperties": false, - "description": "Config for model selection.", - "properties": { - "featureSelectionPreference": { - "anyOf": [ - { - "$ref": "#/$defs/FeatureSelectionPreference" + "$ref": "#/$defs/FeatureSelectionPreference" }, { "type": "null" @@ -3588,7 +2764,7 @@ }, "MultiSpeakerVoiceConfig": { "additionalProperties": false, - "description": "Configuration for a multi-speaker text-to-speech request.", + "description": "The configuration for the multi-speaker setup.", "properties": { "speakerVoiceConfigs": { "anyOf": [ @@ -3603,7 +2779,7 @@ } ], "default": null, - "description": "Required. A list of configurations for the voices of the speakers. Exactly two speaker voice configurations must be provided.", + "description": "The configuration for the speaker to use.", "title": "Speakervoiceconfigs" } }, @@ -3611,7 +2787,7 @@ "type": "object" }, "Outcome": { - "description": "Outcome of the code execution.", + "description": "Required. Outcome of the code execution.", "enum": [ "OUTCOME_UNSPECIFIED", "OUTCOME_OK", @@ -3623,7 +2799,6 @@ }, "ParallelAgentConfig": { "additionalProperties": false, - "deprecated": true, "description": "The config for the YAML schema of a ParallelAgent.", "properties": { "agent_class": { @@ -3702,77 +2877,30 @@ "additionalProperties": false, "description": "A datatype containing media content.\n\nExactly one field within a Part should be set, representing the specific type\nof content being conveyed. Using multiple fields within the same `Part`\ninstance is considered invalid.", "properties": { - "mediaResolution": { - "anyOf": [ - { - "$ref": "#/$defs/PartMediaResolution" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Media resolution for the input media.\n " - }, - "codeExecutionResult": { - "anyOf": [ - { - "$ref": "#/$defs/CodeExecutionResult" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The result of executing the ExecutableCode." - }, - "executableCode": { - "anyOf": [ - { - "$ref": "#/$defs/ExecutableCode" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Code generated by the model that is intended to be executed." - }, - "fileData": { - "anyOf": [ - { - "$ref": "#/$defs/FileData" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The URI-based data of the part. This can be used to include files from Google Cloud Storage." - }, - "functionCall": { + "videoMetadata": { "anyOf": [ { - "$ref": "#/$defs/FunctionCall" + "$ref": "#/$defs/VideoMetadata" }, { "type": "null" } ], "default": null, - "description": "Optional. A predicted function call returned from the model. This contains the name of the function to call and the arguments to pass to the function." + "description": "Metadata for a given video." }, - "functionResponse": { + "thought": { "anyOf": [ { - "$ref": "#/$defs/FunctionResponse" + "type": "boolean" }, { "type": "null" } ], "default": null, - "description": "Optional. The result of a function call. This is used to provide the model with the result of a function call that it predicted." + "description": "Indicates if the part is thought from the model.", + "title": "Thought" }, "inlineData": { "anyOf": [ @@ -3784,33 +2912,19 @@ } ], "default": null, - "description": "Optional. The inline data content of the part. This can be used to include images, audio, or video in a request." - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The text content of the part. When sent from the VSCode Gemini Code Assist extension, references to @mentioned items will be converted to markdown boldface text. For example `@my-repo` will be converted to and sent as `**my-repo**` by the IDE agent.", - "title": "Text" + "description": "Optional. Inlined bytes data." }, - "thought": { + "fileData": { "anyOf": [ { - "type": "boolean" + "$ref": "#/$defs/FileData" }, { "type": "null" } ], "default": null, - "description": "Optional. Indicates whether the `part` represents the model's thought process or reasoning.", - "title": "Thought" + "description": "Optional. URI based data." }, "thoughtSignature": { "anyOf": [ @@ -3823,166 +2937,58 @@ } ], "default": null, - "description": "Optional. An opaque signature for the thought so it can be reused in subsequent requests.", + "description": "An opaque signature for the thought so it can be reused in subsequent requests.", "title": "Thoughtsignature" }, - "videoMetadata": { - "anyOf": [ - { - "$ref": "#/$defs/VideoMetadata" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Video metadata. The metadata should only be specified while the video data is presented in inline_data or file_data." - }, - "toolCall": { - "anyOf": [ - { - "$ref": "#/$defs/ToolCall" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Server-side tool call. This field is populated when the model predicts a tool invocation that should be executed on the server. The client is expected to echo this message back to the API." - }, - "toolResponse": { - "anyOf": [ - { - "$ref": "#/$defs/ToolResponse" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The output from a server-side ToolCall execution. This field is populated by the client with the results of executing the corresponding ToolCall." - }, - "partMetadata": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Custom metadata associated with the Part. Agents using genai.Part as content representation may need to keep track of the additional information. For example it can be name of a file/source from which the Part originates or a way to multiplex multiple Part streams. This field is not supported in Vertex AI.", - "title": "Partmetadata" - } - }, - "title": "Part", - "type": "object" - }, - "PartMediaResolution": { - "additionalProperties": false, - "description": "Media resolution for the input media.", - "properties": { - "level": { - "anyOf": [ - { - "$ref": "#/$defs/PartMediaResolutionLevel" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The tokenization quality used for given media.\n " - }, - "numTokens": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Specifies the required sequence length for media tokenization.\n ", - "title": "Numtokens" - } - }, - "title": "PartMediaResolution", - "type": "object" - }, - "PartMediaResolutionLevel": { - "description": "The tokenization quality used for given media.", - "enum": [ - "MEDIA_RESOLUTION_UNSPECIFIED", - "MEDIA_RESOLUTION_LOW", - "MEDIA_RESOLUTION_MEDIUM", - "MEDIA_RESOLUTION_HIGH", - "MEDIA_RESOLUTION_ULTRA_HIGH" - ], - "title": "PartMediaResolutionLevel", - "type": "string" - }, - "PartialArg": { - "additionalProperties": false, - "description": "Partial argument value of the function call.\n\nThis data type is not supported in Gemini API.", - "properties": { - "boolValue": { + "codeExecutionResult": { "anyOf": [ { - "type": "boolean" + "$ref": "#/$defs/CodeExecutionResult" }, { "type": "null" } ], "default": null, - "description": "Optional. Represents a boolean value.", - "title": "Boolvalue" + "description": "Optional. Result of executing the [ExecutableCode]." }, - "jsonPath": { + "executableCode": { "anyOf": [ { - "type": "string" + "$ref": "#/$defs/ExecutableCode" }, { "type": "null" } ], "default": null, - "description": "Required. A JSON Path (RFC 9535) to the argument being streamed. https://datatracker.ietf.org/doc/html/rfc9535. e.g. \"$.foo.bar[0].data\".", - "title": "Jsonpath" + "description": "Optional. Code generated by the model that is meant to be executed." }, - "nullValue": { + "functionCall": { "anyOf": [ { - "const": "NULL_VALUE", - "type": "string" + "$ref": "#/$defs/FunctionCall" }, { "type": "null" } ], "default": null, - "description": "Optional. Represents a null value.", - "title": "Nullvalue" + "description": "Optional. A predicted [FunctionCall] returned from the model that contains a string representing the [FunctionDeclaration.name] with the parameters and their values." }, - "numberValue": { + "functionResponse": { "anyOf": [ { - "type": "number" + "$ref": "#/$defs/FunctionResponse" }, { "type": "null" } ], "default": null, - "description": "Optional. Represents a double value.", - "title": "Numbervalue" + "description": "Optional. The result output of a [FunctionCall] that contains a string representing the [FunctionDeclaration.name] and a structured JSON object containing any output from the function call. It is used as context to the model." }, - "stringValue": { + "text": { "anyOf": [ { "type": "string" @@ -3992,43 +2998,16 @@ } ], "default": null, - "description": "Optional. Represents a string value.", - "title": "Stringvalue" - }, - "willContinue": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Whether this is not the last part of the same json_path. If true, another PartialArg message for the current json_path is expected to follow.", - "title": "Willcontinue" + "description": "Optional. Text part (can be code).", + "title": "Text" } }, - "title": "PartialArg", + "title": "Part", "type": "object" }, - "PhishBlockThreshold": { - "description": "Sites with confidence level chosen & above this value will be blocked from the search results.\n\nThis enum is not supported in Gemini API.", - "enum": [ - "PHISH_BLOCK_THRESHOLD_UNSPECIFIED", - "BLOCK_LOW_AND_ABOVE", - "BLOCK_MEDIUM_AND_ABOVE", - "BLOCK_HIGH_AND_ABOVE", - "BLOCK_HIGHER_AND_ABOVE", - "BLOCK_VERY_HIGH_AND_ABOVE", - "BLOCK_ONLY_EXTREMELY_HIGH" - ], - "title": "PhishBlockThreshold", - "type": "string" - }, "PrebuiltVoiceConfig": { "additionalProperties": false, - "description": "Configuration for a prebuilt voice.", + "description": "The configuration for the prebuilt speaker to use.", "properties": { "voiceName": { "anyOf": [ @@ -4047,19 +3026,9 @@ "title": "PrebuiltVoiceConfig", "type": "object" }, - "ProminentPeople": { - "description": "Controls whether prominent people (celebrities) generation is allowed.\n\nIf used with personGeneration, personGeneration enum would take precedence.\nFor instance, if ALLOW_NONE is set, all person generation would be blocked. If\nthis field is unspecified, the default behavior is to allow prominent people.\nThis enum is not supported in Gemini API.", - "enum": [ - "PROMINENT_PEOPLE_UNSPECIFIED", - "ALLOW_PROMINENT_PEOPLE", - "BLOCK_PROMINENT_PEOPLE" - ], - "title": "ProminentPeople", - "type": "string" - }, "RagRetrievalConfig": { "additionalProperties": false, - "description": "Specifies the context retrieval config.\n\nThis data type is not supported in Gemini API.", + "description": "Specifies the context retrieval config.", "properties": { "filter": { "anyOf": [ @@ -4116,7 +3085,7 @@ }, "RagRetrievalConfigFilter": { "additionalProperties": false, - "description": "Config for filters. This data type is not supported in Gemini API.", + "description": "Config for filters.", "properties": { "metadataFilter": { "anyOf": [ @@ -4163,7 +3132,7 @@ }, "RagRetrievalConfigHybridSearch": { "additionalProperties": false, - "description": "Config for Hybrid Search. This data type is not supported in Gemini API.", + "description": "Config for Hybrid Search.", "properties": { "alpha": { "anyOf": [ @@ -4184,7 +3153,7 @@ }, "RagRetrievalConfigRanking": { "additionalProperties": false, - "description": "Config for ranking and reranking.\n\nThis data type is not supported in Gemini API.", + "description": "Config for ranking and reranking.", "properties": { "llmRanker": { "anyOf": [ @@ -4216,7 +3185,7 @@ }, "RagRetrievalConfigRankingLlmRanker": { "additionalProperties": false, - "description": "Config for LlmRanker. This data type is not supported in Gemini API.", + "description": "Config for LlmRanker.", "properties": { "modelName": { "anyOf": [ @@ -4233,101 +3202,32 @@ } }, "title": "RagRetrievalConfigRankingLlmRanker", - "type": "object" - }, - "RagRetrievalConfigRankingRankService": { - "additionalProperties": false, - "description": "Config for Rank Service. This data type is not supported in Gemini API.", - "properties": { - "modelName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The model name of the rank service. Format: `semantic-ranker-512@latest`", - "title": "Modelname" - } - }, - "title": "RagRetrievalConfigRankingRankService", - "type": "object" - }, - "ReplicatedVoiceConfig": { - "additionalProperties": false, - "description": "The configuration for the replicated voice to use.", - "properties": { - "mimeType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The mimetype of the voice sample. The only currently supported\n value is `audio/wav`. This represents 16-bit signed little-endian wav\n data, with a 24kHz sampling rate.\n ", - "title": "Mimetype" - }, - "voiceSampleAudio": { - "anyOf": [ - { - "format": "base64url", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The sample of the custom voice.\n ", - "title": "Voicesampleaudio" - }, - "consentAudio": { - "anyOf": [ - { - "format": "base64url", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Recorded consent verifying ownership of the voice. This\n represents 16-bit signed little-endian wav data, with a 24kHz sampling\n rate.", - "title": "Consentaudio" - }, - "voiceConsentSignature": { + "type": "object" + }, + "RagRetrievalConfigRankingRankService": { + "additionalProperties": false, + "description": "Config for Rank Service.", + "properties": { + "modelName": { "anyOf": [ { - "$ref": "#/$defs/VoiceConsentSignature" + "type": "string" }, { "type": "null" } ], "default": null, - "description": "Signature of a previously verified consent audio. This should be\n populated with a signature generated by the server for a previous\n request containing the consent_audio field. When provided, the\n signature is verified instead of the consent_audio field to reduce\n latency. Requests will fail if the signature is invalid or expired." + "description": "Optional. The model name of the rank service. Format: `semantic-ranker-512@latest`", + "title": "Modelname" } }, - "title": "ReplicatedVoiceConfig", + "title": "RagRetrievalConfigRankingRankService", "type": "object" }, - "ResourceScope": { - "description": "Resource scope.", - "enum": [ - "COLLECTION" - ], - "title": "ResourceScope", - "type": "string" - }, "Retrieval": { "additionalProperties": false, - "description": "Defines a retrieval tool that model can call to access external knowledge.\n\nThis data type is not supported in Gemini API.", + "description": "Defines a retrieval tool that model can call to access external knowledge.", "properties": { "disableAttribution": { "anyOf": [ @@ -4417,31 +3317,31 @@ }, "SafetySetting": { "additionalProperties": false, - "description": "A safety setting that affects the safety-blocking behavior.\n\nA SafetySetting consists of a harm category and a threshold for that category.", + "description": "Safety settings.", "properties": { - "category": { + "method": { "anyOf": [ { - "$ref": "#/$defs/HarmCategory" + "$ref": "#/$defs/HarmBlockMethod" }, { "type": "null" } ], "default": null, - "description": "Required. The harm category to be blocked." + "description": "Determines if the harm block method uses probability or probability\n and severity scores." }, - "method": { + "category": { "anyOf": [ { - "$ref": "#/$defs/HarmBlockMethod" + "$ref": "#/$defs/HarmCategory" }, { "type": "null" } ], "default": null, - "description": "Optional. The method for blocking content. If not specified, the default behavior is to use the probability score. This field is not supported in Gemini API." + "description": "Required. Harm category." }, "threshold": { "anyOf": [ @@ -4453,7 +3353,7 @@ } ], "default": null, - "description": "Required. The threshold for blocking content. If the harm probability exceeds this threshold, the content will be blocked." + "description": "Required. The harm block threshold." } }, "title": "SafetySetting", @@ -4516,7 +3416,7 @@ } ], "default": null, - "description": "Optional. The instance must be valid against any (one or more) of the subschemas listed in `any_of`.", + "description": "Optional. The value should be validated against any (one or more) of the subschemas in the list.", "title": "Anyof" }, "default": { @@ -4527,7 +3427,7 @@ } ], "default": null, - "description": "Optional. Default value to use if the field is not specified.", + "description": "Optional. Default value of the data.", "title": "Default" }, "description": { @@ -4540,7 +3440,7 @@ } ], "default": null, - "description": "Optional. Describes the data. The model uses this field to understand the purpose of the schema and how to use it. It is a best practice to provide a clear and descriptive explanation for the schema and its properties here, rather than in the prompt.", + "description": "Optional. The description of the data.", "title": "Description" }, "enum": { @@ -4556,7 +3456,7 @@ } ], "default": null, - "description": "Optional. Possible values of the field. This field can be used to restrict a value to a fixed set of values. To mark a field as an enum, set `format` to `enum` and provide the list of possible values in `enum`. For example: 1. To define directions: `{type:STRING, format:enum, enum:[\"EAST\", \"NORTH\", \"SOUTH\", \"WEST\"]}` 2. To define apartment numbers: `{type:INTEGER, format:enum, enum:[\"101\", \"201\", \"301\"]}`", + "description": "Optional. Possible values of the element of primitive type with enum format. Examples: 1. We can define direction as : {type:STRING, format:enum, enum:[\"EAST\", NORTH\", \"SOUTH\", \"WEST\"]} 2. We can define apartment number as : {type:INTEGER, format:enum, enum:[\"101\", \"201\", \"301\"]}", "title": "Enum" }, "example": { @@ -4567,7 +3467,7 @@ } ], "default": null, - "description": "Optional. Example of an instance of this schema.", + "description": "Optional. Example of the object. Will only populated when the object is the root.", "title": "Example" }, "format": { @@ -4580,7 +3480,7 @@ } ], "default": null, - "description": "Optional. The format of the data. For `NUMBER` type, format can be `float` or `double`. For `INTEGER` type, format can be `int32` or `int64`. For `STRING` type, format can be `email`, `byte`, `date`, `date-time`, `password`, and other formats to further refine the data type.", + "description": "Optional. The format of the data. Supported formats: for NUMBER type: \"float\", \"double\" for INTEGER type: \"int32\", \"int64\" for STRING type: \"email\", \"byte\", etc", "title": "Format" }, "items": { @@ -4593,7 +3493,7 @@ } ], "default": null, - "description": "Optional. If type is `ARRAY`, `items` specifies the schema of elements in the array." + "description": "Optional. SCHEMA FIELDS FOR TYPE ARRAY Schema of the elements of Type.ARRAY." }, "maxItems": { "anyOf": [ @@ -4605,7 +3505,7 @@ } ], "default": null, - "description": "Optional. If type is `ARRAY`, `max_items` specifies the maximum number of items in an array.", + "description": "Optional. Maximum number of the elements for Type.ARRAY.", "title": "Maxitems" }, "maxLength": { @@ -4618,7 +3518,7 @@ } ], "default": null, - "description": "Optional. If type is `STRING`, `max_length` specifies the maximum length of the string.", + "description": "Optional. Maximum length of the Type.STRING", "title": "Maxlength" }, "maxProperties": { @@ -4631,7 +3531,7 @@ } ], "default": null, - "description": "Optional. If type is `OBJECT`, `max_properties` specifies the maximum number of properties that can be provided.", + "description": "Optional. Maximum number of the properties for Type.OBJECT.", "title": "Maxproperties" }, "maximum": { @@ -4644,7 +3544,7 @@ } ], "default": null, - "description": "Optional. If type is `INTEGER` or `NUMBER`, `maximum` specifies the maximum allowed value.", + "description": "Optional. Maximum value of the Type.INTEGER and Type.NUMBER", "title": "Maximum" }, "minItems": { @@ -4657,7 +3557,7 @@ } ], "default": null, - "description": "Optional. If type is `ARRAY`, `min_items` specifies the minimum number of items in an array.", + "description": "Optional. Minimum number of the elements for Type.ARRAY.", "title": "Minitems" }, "minLength": { @@ -4670,7 +3570,7 @@ } ], "default": null, - "description": "Optional. If type is `STRING`, `min_length` specifies the minimum length of the string.", + "description": "Optional. SCHEMA FIELDS FOR TYPE STRING Minimum length of the Type.STRING", "title": "Minlength" }, "minProperties": { @@ -4683,7 +3583,7 @@ } ], "default": null, - "description": "Optional. If type is `OBJECT`, `min_properties` specifies the minimum number of properties that can be provided.", + "description": "Optional. Minimum number of the properties for Type.OBJECT.", "title": "Minproperties" }, "minimum": { @@ -4696,7 +3596,7 @@ } ], "default": null, - "description": "Optional. If type is `INTEGER` or `NUMBER`, `minimum` specifies the minimum allowed value.", + "description": "Optional. SCHEMA FIELDS FOR TYPE INTEGER and NUMBER Minimum value of the Type.INTEGER and Type.NUMBER", "title": "Minimum" }, "nullable": { @@ -4709,7 +3609,7 @@ } ], "default": null, - "description": "Optional. Indicates if the value of this field can be null.", + "description": "Optional. Indicates if the value may be null.", "title": "Nullable" }, "pattern": { @@ -4722,7 +3622,7 @@ } ], "default": null, - "description": "Optional. If type is `STRING`, `pattern` specifies a regular expression that the string must match.", + "description": "Optional. Pattern of the Type.STRING to restrict a string to a regular expression.", "title": "Pattern" }, "properties": { @@ -4738,7 +3638,7 @@ } ], "default": null, - "description": "Optional. If type is `OBJECT`, `properties` is a map of property names to schema definitions for each property of the object.", + "description": "Optional. SCHEMA FIELDS FOR TYPE OBJECT Properties of Type.OBJECT.", "title": "Properties" }, "propertyOrdering": { @@ -4754,7 +3654,7 @@ } ], "default": null, - "description": "Optional. Order of properties displayed or used where order matters. This is not a standard field in OpenAPI specification, but can be used to control the order of properties.", + "description": "Optional. The order of the properties. Not a standard field in open api spec. Only used to support the order of the properties.", "title": "Propertyordering" }, "required": { @@ -4770,7 +3670,7 @@ } ], "default": null, - "description": "Optional. If type is `OBJECT`, `required` lists the names of properties that must be present.", + "description": "Optional. Required properties of Type.OBJECT.", "title": "Required" }, "title": { @@ -4783,7 +3683,7 @@ } ], "default": null, - "description": "Optional. Title for the schema.", + "description": "Optional. The title of the Schema.", "title": "Title" }, "type": { @@ -4796,47 +3696,14 @@ } ], "default": null, - "description": "Optional. Data type of the schema field." + "description": "Optional. The type of the data." } }, "title": "Schema", "type": "object" }, - "SearchTypes": { - "additionalProperties": false, - "description": "Different types of search that can be enabled on the GoogleSearch tool.", - "properties": { - "webSearch": { - "anyOf": [ - { - "$ref": "#/$defs/WebSearch" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Setting this field enables web search. Only text results are returned." - }, - "imageSearch": { - "anyOf": [ - { - "$ref": "#/$defs/ImageSearch" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Setting this field enables image search. Image bytes are returned." - } - }, - "title": "SearchTypes", - "type": "object" - }, "SequentialAgentConfig": { "additionalProperties": false, - "deprecated": true, "description": "The config for the YAML schema of a SequentialAgent.", "properties": { "agent_class": { @@ -4911,20 +3778,9 @@ "title": "SequentialAgentConfig", "type": "object" }, - "ServiceTier": { - "description": "Pricing and performance service tier.", - "enum": [ - "unspecified", - "flex", - "standard", - "priority" - ], - "title": "ServiceTier", - "type": "string" - }, "SpeakerVoiceConfig": { "additionalProperties": false, - "description": "Configuration for a single speaker in a multi-speaker setup.", + "description": "The configuration for the speaker to use.", "properties": { "speaker": { "anyOf": [ @@ -4936,7 +3792,7 @@ } ], "default": null, - "description": "Required. The name of the speaker. This should be the same as the speaker name used in the prompt.", + "description": "The name of the speaker to use. Should be the same as in the\n prompt.", "title": "Speaker" }, "voiceConfig": { @@ -4949,7 +3805,7 @@ } ], "default": null, - "description": "Required. The configuration for the voice of this speaker." + "description": "The configuration for the voice to use." } }, "title": "SpeakerVoiceConfig", @@ -4957,7 +3813,7 @@ }, "SpeechConfig": { "additionalProperties": false, - "description": "Config for speech generation and transcription.", + "description": "The speech generation configuration.", "properties": { "voiceConfig": { "anyOf": [ @@ -4969,20 +3825,7 @@ } ], "default": null, - "description": "The configuration in case of single-voice output." - }, - "languageCode": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The language code (ISO 639-1) for the speech synthesis.", - "title": "Languagecode" + "description": "The configuration for the speaker to use.\n " }, "multiSpeakerVoiceConfig": { "anyOf": [ @@ -4991,229 +3834,12 @@ }, { "type": "null" - } - ], - "default": null, - "description": "The configuration for a multi-speaker text-to-speech request. This field is mutually exclusive with `voice_config`." - } - }, - "title": "SpeechConfig", - "type": "object" - }, - "StreamableHttpTransport": { - "additionalProperties": false, - "description": "A transport that can stream HTTP requests and responses.\n\nNext ID: 6. This data type is not supported in Vertex AI.", - "properties": { - "headers": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional: Fields for authentication headers, timeouts, etc., if needed.", - "title": "Headers" - }, - "sseReadTimeout": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Timeout for SSE read operations.", - "title": "Ssereadtimeout" - }, - "terminateOnClose": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Whether to close the client session when the transport closes.", - "title": "Terminateonclose" - }, - "timeout": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "HTTP timeout for regular operations.", - "title": "Timeout" - }, - "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The full URL for the MCPServer endpoint. Example: \"https://api.example.com/mcp\".", - "title": "Url" - } - }, - "title": "StreamableHttpTransport", - "type": "object" - }, - "ThinkingConfig": { - "additionalProperties": false, - "description": "The thinking features configuration.", - "properties": { - "includeThoughts": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Indicates whether to include thoughts in the response. If true, thoughts are returned only if the model supports thought and thoughts are available.\n ", - "title": "Includethoughts" - }, - "thinkingBudget": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Indicates the thinking budget in tokens. 0 is DISABLED. -1 is AUTOMATIC. The default values and allowed ranges are model dependent.\n ", - "title": "Thinkingbudget" - }, - "thinkingLevel": { - "anyOf": [ - { - "$ref": "#/$defs/ThinkingLevel" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The number of thoughts tokens that the model should generate." - } - }, - "title": "ThinkingConfig", - "type": "object" - }, - "ThinkingLevel": { - "description": "The number of thoughts tokens that the model should generate.", - "enum": [ - "THINKING_LEVEL_UNSPECIFIED", - "MINIMAL", - "LOW", - "MEDIUM", - "HIGH" - ], - "title": "ThinkingLevel", - "type": "string" - }, - "ToolAnnotations": { - "additionalProperties": true, - "description": "Additional properties describing a Tool to clients.\n\nNOTE: all properties in ToolAnnotations are **hints**.\nThey are not guaranteed to provide a faithful description of\ntool behavior (including descriptive properties like `title`).\n\nClients should never make tool use decisions based on ToolAnnotations\nreceived from untrusted servers.", - "properties": { - "title": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Title" - }, - "readOnlyHint": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Readonlyhint" - }, - "destructiveHint": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Destructivehint" - }, - "idempotentHint": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Idempotenthint" - }, - "openWorldHint": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Openworldhint" - } - }, - "title": "ToolAnnotations", - "type": "object" - }, - "ToolArgsConfig": { - "additionalProperties": true, - "description": "Config to host free key-value pairs for the args in ToolConfig.", - "properties": {}, - "title": "ToolArgsConfig", - "type": "object" - }, - "ToolCall": { - "additionalProperties": false, - "description": "A predicted server-side `ToolCall` returned from the model.\n\nThis message contains information about a tool that the model wants to invoke.\nThe client is NOT expected to execute this `ToolCall`. Instead, the\nclient should pass this `ToolCall` back to the API in a subsequent turn\nwithin a `Content` message, along with the corresponding `ToolResponse`.", - "properties": { - "id": { + } + ], + "default": null, + "description": "The configuration for the multi-speaker setup.\n It is mutually exclusive with the voice_config field.\n " + }, + "languageCode": { "anyOf": [ { "type": "string" @@ -5223,58 +3849,54 @@ } ], "default": null, - "description": "Unique identifier of the tool call. The server returns the tool response with the matching `id`.", - "title": "Id" - }, - "toolType": { + "description": "Language code (ISO 639. e.g. en-US) for the speech synthesization.\n Only available for Live API.\n ", + "title": "Languagecode" + } + }, + "title": "SpeechConfig", + "type": "object" + }, + "ThinkingConfig": { + "additionalProperties": false, + "description": "The thinking features configuration.", + "properties": { + "includeThoughts": { "anyOf": [ { - "$ref": "#/$defs/ToolType" + "type": "boolean" }, { "type": "null" } ], "default": null, - "description": "The type of tool that was called." + "description": "Indicates whether to include thoughts in the response. If true, thoughts are returned only if the model supports thought and thoughts are available.\n ", + "title": "Includethoughts" }, - "args": { + "thinkingBudget": { "anyOf": [ { - "additionalProperties": true, - "type": "object" + "type": "integer" }, { "type": "null" } ], "default": null, - "description": "The tool call arguments. Example: {\"arg1\": \"value1\", \"arg2\": \"value2\"}.", - "title": "Args" + "description": "Indicates the thinking budget in tokens. 0 is DISABLED. -1 is AUTOMATIC. The default values and allowed ranges are model dependent.\n ", + "title": "Thinkingbudget" } }, - "title": "ToolCall", - "type": "object" - }, - "ToolCodeExecution": { - "additionalProperties": false, - "description": "Tool that executes code generated by the model, and automatically returns the result to the model.\n\nSee also [ExecutableCode]and [CodeExecutionResult] which are input and output\nto this tool. This data type is not supported in Gemini API.", - "properties": {}, - "title": "ToolCodeExecution", + "title": "ThinkingConfig", "type": "object" }, - "ToolExecution": { + "ToolAnnotations": { "additionalProperties": true, - "description": "Execution-related properties for a tool.", + "description": "Additional properties describing a Tool to clients.\n\nNOTE: all properties in ToolAnnotations are **hints**.\nThey are not guaranteed to provide a faithful description of\ntool behavior (including descriptive properties like `title`).\n\nClients should never make tool use decisions based on ToolAnnotations\nreceived from untrusted servers.", "properties": { - "taskSupport": { + "title": { "anyOf": [ { - "enum": [ - "forbidden", - "optional", - "required" - ], "type": "string" }, { @@ -5282,109 +3904,96 @@ } ], "default": null, - "title": "Tasksupport" - } - }, - "title": "ToolExecution", - "type": "object" - }, - "ToolParallelAiSearch": { - "additionalProperties": false, - "description": "ParallelAiSearch tool type.\n\nA tool that uses the Parallel.ai search engine for grounding. This data type\nis not supported in Gemini API.", - "properties": { - "apiKey": { + "title": "Title" + }, + "readOnlyHint": { "anyOf": [ { - "type": "string" + "type": "boolean" }, { "type": "null" } ], "default": null, - "description": "Optional. The API key for ParallelAiSearch. If an API key is not provided, the system will attempt to verify access by checking for an active Parallel.ai subscription through the Google Cloud Marketplace. See https://docs.parallel.ai/search/search-quickstart for more details.", - "title": "Apikey" + "title": "Readonlyhint" }, - "customConfigs": { + "destructiveHint": { "anyOf": [ { - "additionalProperties": true, - "type": "object" + "type": "boolean" }, { "type": "null" } ], "default": null, - "description": "Optional. Custom configs for ParallelAiSearch. This field can be used to pass any parameter from the Parallel.ai Search API. See the Parallel.ai documentation for the full list of available parameters and their usage: https://docs.parallel.ai/api-reference/search-beta/search Currently only `source_policy`, `excerpts`, `max_results`, `mode`, `fetch_policy` can be set via this field. For example: { \"source_policy\": { \"include_domains\": [\"google.com\", \"wikipedia.org\"], \"exclude_domains\": [\"example.com\"] }, \"fetch_policy\": { \"max_age_seconds\": 3600 } }", - "title": "Customconfigs" - } - }, - "title": "ToolParallelAiSearch", - "type": "object" - }, - "ToolResponse": { - "additionalProperties": false, - "description": "The output from a server-side `ToolCall` execution.\n\nThis message contains the results of a tool invocation that was initiated by a\n`ToolCall` from the model. The client should pass this `ToolResponse` back to\nthe API in a subsequent turn within a `Content` message, along with the\ncorresponding `ToolCall`.", - "properties": { - "id": { + "title": "Destructivehint" + }, + "idempotentHint": { "anyOf": [ { - "type": "string" + "type": "boolean" }, { "type": "null" } ], "default": null, - "description": "The identifier of the tool call this response is for.", - "title": "Id" + "title": "Idempotenthint" }, - "toolType": { + "openWorldHint": { "anyOf": [ { - "$ref": "#/$defs/ToolType" + "type": "boolean" }, { "type": "null" } ], "default": null, - "description": "The type of tool that was called, matching the tool_type in the corresponding ToolCall." - }, - "response": { + "title": "Openworldhint" + } + }, + "title": "ToolAnnotations", + "type": "object" + }, + "ToolArgsConfig": { + "additionalProperties": true, + "description": "Config to host free key-value pairs for the args in ToolConfig.", + "properties": {}, + "title": "ToolArgsConfig", + "type": "object" + }, + "ToolCodeExecution": { + "additionalProperties": false, + "description": "Tool that executes code generated by the model, and automatically returns the result to the model.\n\nSee also [ExecutableCode]and [CodeExecutionResult] which are input and output\nto this tool.", + "properties": {}, + "title": "ToolCodeExecution", + "type": "object" + }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { "anyOf": [ { - "additionalProperties": true, - "type": "object" + "$ref": "#/$defs/Environment" }, { "type": "null" } ], "default": null, - "description": "The tool response.", - "title": "Response" + "description": "Required. The environment being operated." } }, - "title": "ToolResponse", + "title": "ToolComputerUse", "type": "object" }, - "ToolType": { - "description": "The type of tool in the function call.", - "enum": [ - "TOOL_TYPE_UNSPECIFIED", - "GOOGLE_SEARCH_WEB", - "GOOGLE_SEARCH_IMAGE", - "URL_CONTEXT", - "GOOGLE_MAPS", - "FILE_SEARCH" - ], - "title": "ToolType", - "type": "string" - }, "Type": { - "description": "Data type of the schema field.", + "description": "Optional. The type of the data.", "enum": [ "TYPE_UNSPECIFIED", "STRING", @@ -5400,14 +4009,14 @@ }, "UrlContext": { "additionalProperties": false, - "description": "Tool to support URL context.", + "description": "Tool to support URL context retrieval.", "properties": {}, "title": "UrlContext", "type": "object" }, "VertexAISearch": { "additionalProperties": false, - "description": "Retrieve from Vertex AI Search datastore or engine for grounding.\n\ndatastore and engine are mutually exclusive. See\nhttps://cloud.google.com/products/agent-builder. This data type is not\nsupported in Gemini API.", + "description": "Retrieve from Vertex AI Search datastore or engine for grounding.\n\ndatastore and engine are mutually exclusive. See\nhttps://cloud.google.com/products/agent-builder", "properties": { "dataStoreSpecs": { "anyOf": [ @@ -5474,7 +4083,7 @@ } ], "default": null, - "description": "Optional. Number of search results to return per query. The default value is 10. The maximumm allowed value is 10.", + "description": "Optional. Number of search results to return per query. The default value is 10. The maximum allowed value is 10.", "title": "Maxresults" } }, @@ -5483,7 +4092,7 @@ }, "VertexAISearchDataStoreSpec": { "additionalProperties": false, - "description": "Define data stores within engine to filter on in a search call and configurations for those data stores.\n\nFor more information, see\nhttps://cloud.google.com/generative-ai-app-builder/docs/reference/rpc/google.cloud.discoveryengine.v1#datastorespec.\nThis data type is not supported in Gemini API.", + "description": "Define data stores within engine to filter on in a search call and configurations for those data stores.\n\nFor more information, see\nhttps://cloud.google.com/generative-ai-app-builder/docs/reference/rpc/google.cloud.discoveryengine.v1#datastorespec", "properties": { "dataStore": { "anyOf": [ @@ -5517,7 +4126,7 @@ }, "VertexRagStore": { "additionalProperties": false, - "description": "Retrieve from Vertex RAG Store for grounding.\n\nThis data type is not supported in Gemini API.", + "description": "Retrieve from Vertex RAG Store for grounding.", "properties": { "ragCorpora": { "anyOf": [ @@ -5608,7 +4217,7 @@ }, "VertexRagStoreRagResource": { "additionalProperties": false, - "description": "The definition of the Rag resource.\n\nThis data type is not supported in Gemini API.", + "description": "The definition of the Rag resource.", "properties": { "ragCorpus": { "anyOf": [ @@ -5645,33 +4254,33 @@ }, "VideoMetadata": { "additionalProperties": false, - "description": "Provides metadata for a video, including the start and end offsets for clipping and the frame rate.", + "description": "Describes how the video in the Part should be used by the model.", "properties": { - "endOffset": { + "fps": { "anyOf": [ { - "type": "string" + "type": "number" }, { "type": "null" } ], "default": null, - "description": "Optional. The end offset of the video.", - "title": "Endoffset" + "description": "The frame rate of the video sent to the model. If not specified, the\n default value will be 1.0. The fps range is (0.0, 24.0].", + "title": "Fps" }, - "fps": { + "endOffset": { "anyOf": [ { - "type": "number" + "type": "string" }, { "type": "null" } ], "default": null, - "description": "Optional. The frame rate of the video sent to the model. If not specified, the default value is 1.0. The valid range is (0.0, 24.0].", - "title": "Fps" + "description": "Optional. The end offset of the video.", + "title": "Endoffset" }, "startOffset": { "anyOf": [ @@ -5694,18 +4303,6 @@ "additionalProperties": false, "description": "The configuration for the voice to use.", "properties": { - "replicatedVoiceConfig": { - "anyOf": [ - { - "$ref": "#/$defs/ReplicatedVoiceConfig" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The configuration for a replicated voice, which is a clone of a\n user's voice that can be used for speech synthesis. If this is unset, a\n default voice is used." - }, "prebuiltVoiceConfig": { "anyOf": [ { @@ -5716,40 +4313,12 @@ } ], "default": null, - "description": "The configuration for a prebuilt voice." + "description": "The configuration for the speaker to use.\n " } }, "title": "VoiceConfig", "type": "object" }, - "VoiceConsentSignature": { - "additionalProperties": false, - "description": "The signature of the voice consent check.", - "properties": { - "signature": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The signature string.\n ", - "title": "Signature" - } - }, - "title": "VoiceConsentSignature", - "type": "object" - }, - "WebSearch": { - "additionalProperties": false, - "description": "Standard web search for grounding and related configurations.\n\nOnly text results are returned.", - "properties": {}, - "title": "WebSearch", - "type": "object" - }, "google__adk__tools__tool_configs__ToolConfig": { "additionalProperties": false, "description": "The configuration for a tool.\n\nThe config supports these types of tools:\n1. ADK built-in tools\n2. User-defined tool instances\n3. User-defined tool classes\n4. User-defined functions that generate tool instances\n5. User-defined function tools\n\nFor examples:\n\n 1. For ADK built-in tool instances or classes in `google.adk.tools` package,\n they can be referenced directly with the `name` and optionally with\n `args`.\n\n ```\n tools:\n - name: google_search\n - name: AgentTool\n args:\n agent: ./another_agent.yaml\n skip_summarization: true\n ```\n\n 2. For user-defined tool instances, the `name` is the fully qualified path\n to the tool instance.\n\n ```\n tools:\n - name: my_package.my_module.my_tool\n ```\n\n 3. For user-defined tool classes (custom tools), the `name` is the fully\n qualified path to the tool class and `args` is the arguments for the tool.\n\n ```\n tools:\n - name: my_package.my_module.my_tool_class\n args:\n my_tool_arg1: value1\n my_tool_arg2: value2\n ```\n\n 4. For user-defined functions that generate tool instances, the `name` is\n the fully qualified path to the function and `args` is passed to the\n function as arguments.\n\n ```\n tools:\n - name: my_package.my_module.my_tool_function\n args:\n my_function_arg1: value1\n my_function_arg2: value2\n ```\n\n The function must have the following signature:\n ```\n def my_function(args: ToolArgsConfig) -> BaseTool:\n ...\n ```\n\n 5. For user-defined function tools, the `name` is the fully qualified path\n to the function.\n\n ```\n tools:\n - name: my_package.my_module.my_function_tool\n ```\n\n If the above use cases don't suffice, users can define a custom tool config\n by extending BaseToolConfig and override from_config() in the custom tool.", @@ -5782,41 +4351,33 @@ "additionalProperties": false, "description": "Tool details of a tool that the model may use to generate a response.", "properties": { - "retrieval": { - "anyOf": [ - { - "$ref": "#/$defs/Retrieval" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Retrieval tool type. System will always execute the provided retrieval tool(s) to get external knowledge to answer the prompt. Retrieval results are presented to the model for generation. This field is not supported in Gemini API." - }, - "computerUse": { + "functionDeclarations": { "anyOf": [ { - "$ref": "#/$defs/ComputerUse" + "items": { + "$ref": "#/$defs/FunctionDeclaration" + }, + "type": "array" }, { "type": "null" } ], "default": null, - "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + "description": "List of function declarations that the tool supports.", + "title": "Functiondeclarations" }, - "fileSearch": { + "retrieval": { "anyOf": [ { - "$ref": "#/$defs/FileSearch" + "$ref": "#/$defs/Retrieval" }, { "type": "null" } ], "default": null, - "description": "Optional. FileSearch tool type. Tool to retrieve knowledge from Semantic Retrieval corpora. This field is not supported in Vertex AI." + "description": "Optional. Retrieval tool type. System will always execute the provided retrieval tool(s) to get external knowledge to answer the prompt. Retrieval results are presented to the model for generation." }, "googleSearch": { "anyOf": [ @@ -5828,31 +4389,19 @@ } ], "default": null, - "description": "Optional. GoogleSearch tool type. Tool to support Google Search in Model. Powered by Google." - }, - "googleMaps": { - "anyOf": [ - { - "$ref": "#/$defs/GoogleMaps" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Tool that allows grounding the model's response with\n geospatial context related to the user's query." + "description": "Optional. Google Search tool type. Specialized retrieval tool\n that is powered by Google Search." }, - "codeExecution": { + "googleSearchRetrieval": { "anyOf": [ { - "$ref": "#/$defs/ToolCodeExecution" + "$ref": "#/$defs/GoogleSearchRetrieval" }, { "type": "null" } ], "default": null, - "description": "Optional. CodeExecution tool type. Enables the model to execute code as part of generation." + "description": "Optional. GoogleSearchRetrieval tool type. Specialized retrieval tool that is powered by Google search." }, "enterpriseWebSearch": { "anyOf": [ @@ -5864,75 +4413,55 @@ } ], "default": null, - "description": "Optional. Tool to support searching public web data, powered by Vertex AI Search and Sec4 compliance. This field is not supported in Gemini API." - }, - "functionDeclarations": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/FunctionDeclaration" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Function tool type. One or more function declarations to be passed to the model along with the current user query. Model may decide to call a subset of these functions by populating FunctionCall in the response. User should provide a FunctionResponse for each function call in the next turn. Based on the function responses, Model will generate the final response back to the user. Maximum 512 function declarations can be provided.", - "title": "Functiondeclarations" + "description": "Optional. Enterprise web search tool type. Specialized retrieval\n tool that is powered by Vertex AI Search and Sec4 compliance." }, - "googleSearchRetrieval": { + "googleMaps": { "anyOf": [ { - "$ref": "#/$defs/GoogleSearchRetrieval" + "$ref": "#/$defs/GoogleMaps" }, { "type": "null" } ], "default": null, - "description": "Optional. Specialized retrieval tool that is powered by Google Search." + "description": "Optional. Google Maps tool type. Specialized retrieval tool\n that is powered by Google Maps." }, - "parallelAiSearch": { + "urlContext": { "anyOf": [ { - "$ref": "#/$defs/ToolParallelAiSearch" + "$ref": "#/$defs/UrlContext" }, { "type": "null" } ], "default": null, - "description": "Optional. If specified, Vertex AI will use Parallel.ai to search for information to answer user queries. The search results will be grounded on Parallel.ai and presented to the model for response generation. This field is not supported in Gemini API." + "description": "Optional. Tool to support URL context retrieval." }, - "urlContext": { + "computerUse": { "anyOf": [ { - "$ref": "#/$defs/UrlContext" + "$ref": "#/$defs/ToolComputerUse" }, { "type": "null" } ], "default": null, - "description": "Optional. Tool to support URL context retrieval." + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." }, - "mcpServers": { + "codeExecution": { "anyOf": [ { - "items": { - "$ref": "#/$defs/McpServer" - }, - "type": "array" + "$ref": "#/$defs/ToolCodeExecution" }, { "type": "null" } ], "default": null, - "description": "Optional. MCP Servers to connect to. This field is not supported in Vertex AI.", - "title": "Mcpservers" + "description": "Optional. CodeExecution tool type. Enables the model to execute code as part of generation." } }, "title": "Tool", @@ -5942,18 +4471,6 @@ "additionalProperties": false, "description": "Tool config.\n\nThis config is shared for all tools provided in the request.", "properties": { - "retrievalConfig": { - "anyOf": [ - { - "$ref": "#/$defs/RetrievalConfig" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Retrieval config." - }, "functionCallingConfig": { "anyOf": [ { @@ -5966,18 +4483,17 @@ "default": null, "description": "Optional. Function calling config." }, - "includeServerSideToolInvocations": { + "retrievalConfig": { "anyOf": [ { - "type": "boolean" + "$ref": "#/$defs/RetrievalConfig" }, { "type": "null" } ], "default": null, - "description": "If true, the API response will include the server-side tool calls and responses within the `Content` message. This allows clients to observe the server's tool invocations.", - "title": "Includeserversidetoolinvocations" + "description": "Optional. Retrieval config." } }, "title": "ToolConfig", @@ -5985,7 +4501,7 @@ }, "mcp__types__Tool": { "additionalProperties": true, - "description": "Definition for a tool the client can call.", + "description": "Definition for a tool that the client can call.", "properties": { "name": { "title": "Name", @@ -6033,21 +4549,6 @@ "default": null, "title": "Outputschema" }, - "icons": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/Icon" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Icons" - }, "annotations": { "anyOf": [ { @@ -6071,17 +4572,6 @@ ], "default": null, "title": "Meta" - }, - "execution": { - "anyOf": [ - { - "$ref": "#/$defs/ToolExecution" - }, - { - "type": "null" - } - ], - "default": null } }, "required": [ @@ -6092,7 +4582,6 @@ "type": "object" } }, - "deprecated": true, "description": "The config for the YAML schema to create an agent.", "oneOf": [ { diff --git a/src/google/adk/agents/context.py b/src/google/adk/agents/context.py index d39f6d1271..7a66f17a41 100644 --- a/src/google/adk/agents/context.py +++ b/src/google/adk/agents/context.py @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Context class for ADK agents.""" - from __future__ import annotations from collections.abc import Mapping @@ -21,14 +19,12 @@ from typing import Any from typing import TYPE_CHECKING -from opentelemetry import context as context_api from typing_extensions import override from .readonly_context import ReadonlyContext if TYPE_CHECKING: from google.genai import types - from pydantic import BaseModel from ..artifacts.base_artifact_service import ArtifactVersion from ..auth.auth_credential import AuthCredential @@ -38,108 +34,21 @@ from ..events.ui_widget import UiWidget from ..memory.base_memory_service import SearchMemoryResponse from ..memory.memory_entry import MemoryEntry - from ..sessions.session import Session from ..sessions.state import State - from ..telemetry.node_tracing import TelemetryContext from ..tools.tool_confirmation import ToolConfirmation - from ..workflow._base_node import BaseNode - from ..workflow._graph import NodeLike - from ..workflow._graph import RouteValue - from ..workflow._schedule_dynamic_node import ScheduleDynamicNode from .invocation_context import InvocationContext -_MAX_PARENT_DEPTH = 50 - - -def _derive_scheduler( - parent_ctx: Context | None, -) -> ScheduleDynamicNode | None: - """Derives the dynamic node scheduler from the parent context.""" - if parent_ctx: - scheduler = parent_ctx._workflow_scheduler - if scheduler is None: - from ..workflow._dynamic_node_scheduler import DynamicNodeScheduler - from ..workflow._dynamic_node_scheduler import DynamicNodeState - - scheduler = DynamicNodeScheduler(state=DynamicNodeState()) - return scheduler - return None - - -def _derive_node_path( - node_name: str | None, - run_id: str, - node_path: str | None, - parent_path: str | None, - *, - node: BaseNode | None = None, -) -> tuple[str, str]: - """Derives the node path and run ID.""" - if node_path: - return node_path, run_id - - # Fallback: Reconstruct parent_path from static parent_agent Tree - # if parent_path is missing during multi-turn session resumption. - from ..agents.base_agent import BaseAgent - from ..events._node_path_builder import _NodePathBuilder - - derived_run_id = run_id or '1' - - if not parent_path and isinstance(node, BaseAgent) and node.parent_agent: - path_builder = _NodePathBuilder([]) - curr = node.parent_agent - parent_agents = [] - depth = 0 - while curr is not None and depth < _MAX_PARENT_DEPTH: - parent_agents.insert(0, curr) - curr = curr.parent_agent - depth += 1 - for agent in parent_agents: - path_builder = path_builder.append(agent.name, '1') - parent_path = str(path_builder) - - # Root contexts have no node name and no parent path. Return an empty path - # to ensure they are correctly identified as the root of the execution - # hierarchy. - if not node_name and not parent_path: - return '', derived_run_id - - base_path_builder = ( - _NodePathBuilder.from_string(parent_path) - if parent_path - else _NodePathBuilder([]) - ) - - derived_node_path = str( - base_path_builder.append(node_name or '', derived_run_id) - ) - return derived_node_path, derived_run_id - class Context(ReadonlyContext): - """The context within an agent run. - - When used in a workflow, additional fields under the ``Workflow-specific - fields`` section are available. - """ + """The context within an agent run.""" def __init__( self, invocation_context: InvocationContext, *, - # Core State & Actions event_actions: EventActions | None = None, - # Tool Execution function_call_id: str | None = None, tool_confirmation: ToolConfirmation | None = None, - # Workflow Execution - parent_ctx: Context | None = None, - node: BaseNode | None = None, - node_path: str | None = None, - run_id: str = '', - resume_inputs: dict[str, Any] | None = None, - attempt_count: int = 1, - use_as_output: bool = False, ) -> None: """Initializes the Context. @@ -150,85 +59,20 @@ def __init__( for tool-specific methods like request_credential and request_confirmation. tool_confirmation: The tool confirmation of the current tool call. - parent_ctx: The parent node's Context. - node: The current node. - node_path: The path of the current node in the workflow graph. If not - provided, it will be derived from parent_ctx and node. - run_id: The execution ID of the current node. - resume_inputs: Inputs for resuming node, keyed by interrupt id. - attempt_count: Number of times this node has been attempted. - use_as_output: If True, this node's output also represents the parent - node's output. """ super().__init__(invocation_context) - self._parent_ctx = parent_ctx - self._node = node - from ..events.event_actions import EventActions from ..sessions.state import State - from ..telemetry.node_tracing import TelemetryContext - # Core State & Actions, Event & Telemetry self._event_actions = event_actions or EventActions() - - computed_state_schema = None - if node and node.state_schema: - computed_state_schema = node.state_schema - elif parent_ctx: - computed_state_schema = parent_ctx.state._schema - self._state = State( value=invocation_context.session.state, delta=self._event_actions.state_delta, - schema=computed_state_schema - or getattr(invocation_context, '_state_schema', None), ) - - self._event_author = parent_ctx.event_author if parent_ctx else '' - - self._telemetry_context = TelemetryContext( - otel_context=context_api.get_current() - ) - - # Tool Execution self._function_call_id = function_call_id self._tool_confirmation = tool_confirmation - # Workflow Execution - self._node_path, self._run_id = _derive_node_path( - node.name if node else None, - run_id, - node_path, - parent_ctx.node_path if parent_ctx else None, - node=node, - ) - self._resume_inputs = resume_inputs or {} - self._workflow_scheduler = _derive_scheduler(parent_ctx) - self._node_rerun_on_resume = node.rerun_on_resume if node else True - self._child_run_counters: dict[str, int] = {} - self._attempt_count = attempt_count - self._output_delegated = False - self._output_value: Any = None - self._output_emitted: bool = False - self._route_value: RouteValue | list[RouteValue] | None = None - self._route_emitted: bool = False - self._interrupt_ids: set[str] = set() - # scope tag inherited from parent ctx by default; - # NodeRunner / Workflow may override before the node runs. - self._isolation_scope: str | None = ( - parent_ctx.isolation_scope if parent_ctx else None - ) - - if use_as_output and parent_ctx: - self._output_for_ancestors: list[str] = [parent_ctx.node_path] + list( - parent_ctx._output_for_ancestors or [] - ) - else: - self._output_for_ancestors: list[str] = [] - self._error: Exception | None = None - self._error_node_path: str = '' - @property def function_call_id(self) -> str | None: """The function call id of the current tool call.""" @@ -239,20 +83,6 @@ def function_call_id(self, value: str | None) -> None: """Sets the function call id of the current tool call.""" self._function_call_id = value - @property - def isolation_scope(self) -> str | None: - """Scope tag inherited from parent or set explicitly via override. - - See ``Event.isolation_scope`` for format. - - ⚠️ DO NOT USE THIS DIRECTLY. Internal mechanism, may change. - """ - return self._isolation_scope - - @isolation_scope.setter - def isolation_scope(self, value: str | None) -> None: - self._isolation_scope = value - @property def tool_confirmation(self) -> ToolConfirmation | None: """The tool confirmation of the current tool call.""" @@ -278,283 +108,6 @@ def actions(self) -> EventActions: """The event actions for the current context.""" return self._event_actions - @property - @override - def session(self) -> Session: - """Returns the current session for this invocation.""" - return self._invocation_context.session - - # ============================================================================ - # Workflow-specific properties and methods - # ============================================================================ - - @property - def parent_ctx(self) -> Context | None: - """Returns the parent node's Context.""" - return self._parent_ctx - - @property - def node(self) -> BaseNode | None: - """Returns the node instance of this context.""" - return self._node - - @property - def node_path(self) -> str: - """Returns the path of the current node in the workflow graph.""" - return self._node_path - - @property - def run_id(self) -> str: - """Returns the execution ID of the current node.""" - return self._run_id - - @property - def attempt_count(self) -> int: - """Returns the current attempt number (1-based).""" - return self._attempt_count - - @property - def resume_inputs(self) -> dict[str, Any]: - """Returns inputs for resuming node, keyed by interrupt id.""" - return self._resume_inputs - - @property - def error(self) -> Exception | None: - """The exception raised by the node, if any.""" - return self._error - - @property - def error_node_path(self) -> str: - """The path of the node that failed.""" - return self._error_node_path - - @property - def output(self) -> Any: - """The node's result value. Source of truth for node output. - - Set once per run. Also set by the framework when the node - yields Event(output=X) or yields a raw value. If the value was - set via yield, the output Event is already enqueued. If set - directly, the framework emits the output Event after _run_impl - returns. - - Raises ValueError if: - - Set a second time (at most one output per execution). - - Set when interrupt_ids is non-empty (output and interrupt - are mutually exclusive). - """ - return self._output_value - - @output.setter - def output(self, value: Any) -> None: - if self._output_value is not None: - raise ValueError( - 'Output already set. A node can produce at most one output.' - ) - self._output_value = value - - @property - def route(self) -> RouteValue | list[RouteValue] | None: - """Routing value for conditional edges. - - Read by the orchestrator to decide which downstream edge to - follow. Can be set independently of output. - """ - return self._route_value - - @route.setter - def route(self, value: RouteValue | list[RouteValue]) -> None: - self._route_value = value - self._route_emitted = False - - @property - def interrupt_ids(self) -> set[str]: - """Interrupt IDs accumulated during this execution. Read-only. - - Set by the framework when the node yields an Event with - long_running_tool_ids. - """ - return set(self._interrupt_ids) - - @property - def event_author(self) -> str: - """Author name stamped on events emitted by this node. - - Set by the orchestrator to override the default (node name). - For example, Workflow sets this to its own name so all child - events appear under the workflow's author. - - Empty string means use the node's own name (default). - """ - return self._event_author - - @event_author.setter - def event_author(self, value: str) -> None: - self._event_author = value - - @property - def telemetry_context(self) -> TelemetryContext: - """Returns the telemetry context.""" - return self._telemetry_context - - def get_invocation_context(self) -> InvocationContext: - """Returns a copy of the invocation context with the proxy session.""" - ctx = self._invocation_context - ctx_with_proxy = ctx.model_copy( - update={ - 'session': self.session, - } - ) - return ctx_with_proxy - - async def run_node( - self, - node: NodeLike, - node_input: Any = None, - *, - use_as_output: bool = False, - run_id: str | None = None, - use_sub_branch: bool = False, - override_branch: str | None = None, - override_isolation_scope: str | None = None, - raise_on_wait: bool = False, - ) -> Any: - """Executes a node dynamically. - - This method allows a node within a workflow to trigger the run of - another node (or a callable that can be built into a node) and - asynchronously wait for its result. The dynamically executed node becomes - a child run of the current node in the workflow. - - IMPORTANT: Always ``await`` this method directly. Wrapping it in - ``asyncio.create_task()`` means the task runs unsupervised — errors - are silently swallowed and the task is not cancelled if the parent - node is interrupted (e.g. via HITL). - - Args: - node: The node to be executed. This can be a BaseNode instance or a - callable that can be built into a node. - node_input: The input data to be passed to the dynamically executed node. - Defaults to None. - use_as_output: If True, the dynamic node's output is used as the - calling node's output. The calling node's own output event is - suppressed to avoid duplication. - run_id: An optional custom run ID for the dynamic node execution. - If not provided, a default run ID is generated. Useful for - correlating events across runs. - use_sub_branch: If True, the dynamic node will be executed in a sub-branch - to isolate its state and events from the main branch. - override_branch: An optional branch to use instead of parent's branch. - - Returns: - The output of the dynamically executed node, once it finishes executing. - """ - - if not self._node_rerun_on_resume: - raise ValueError( - 'A node must have rerun_on_resume=True. Reason is that dynamically' - ' scheduled nodes might be interrupted, and the workflow' - ' wakes-up/re-runs the parent node, so it can get the child node' - ' response.' - ) - - from ..workflow.utils._workflow_graph_utils import build_node # pylint: disable=g-import-not-at-top - - built_node = build_node(node) - - from ..agents.base_agent import BaseAgent - - if isinstance(node, BaseAgent) and isinstance(built_node, BaseAgent): - built_node.parent_agent = node.parent_agent - - # Mode 1: Running within a Workflow graph. - # The workflow orchestrator provides a scheduler to handle resume, dedup, - # etc. - if self._workflow_scheduler: - from ..workflow._errors import NodeInterruptedError - - # Output delegation: once set, the calling node's own output - # events are suppressed — the child's output (annotated with - # output_for) becomes the calling node's output. - if use_as_output: - if self._output_delegated: - raise ValueError( - f'Node {self.node_path} already has a use_as_output delegate.' - ) - self._output_delegated = True - - if run_id: - if run_id.isdigit(): - raise ValueError( - f'Explicit run_id "{run_id}" for node "{built_node.name}" must' - ' contain non-numeric characters to prevent collision with' - ' auto-generated IDs.' - ) - else: - self._child_run_counters[built_node.name] = ( - self._child_run_counters.get(built_node.name, 0) + 1 - ) - run_id = str(self._child_run_counters[built_node.name]) - - child_ctx = await self._workflow_scheduler( - self, - built_node, - node_input, - node_name=built_node.name, - use_as_output=use_as_output, - run_id=run_id, - use_sub_branch=use_sub_branch, - override_branch=override_branch, - override_isolation_scope=override_isolation_scope, - ) - if child_ctx.error: - from ..workflow._errors import DynamicNodeFailError - - raise DynamicNodeFailError( - message=f'Dynamic node {built_node.name} failed', - error=child_ctx.error, - error_node_path=child_ctx.error_node_path, - ) - if child_ctx.interrupt_ids: - # Propagate child's interrupt_ids to this node's ctx - # so NodeRunner sees them after catching the error. - self._interrupt_ids.update(child_ctx.interrupt_ids) - raise NodeInterruptedError() - # When the caller passes raise_on_wait=True, surface a child - # that's WAITING (wait_for_output, no output, not transferring) - # as NodeInterruptedError so the parent's NodeRunner records - # the parent as WAITING instead of falsely COMPLETED. - if ( - raise_on_wait - and built_node.wait_for_output - and child_ctx.output is None - and not child_ctx.actions.transfer_to_agent - ): - raise NodeInterruptedError() - return child_ctx.output - - # Mode 2: Standalone execution (outside of workflow). - # Run the node directly via NodeRunner. - result = await self._run_node_standalone( - built_node, - node_input, - use_as_output=use_as_output, - use_sub_branch=use_sub_branch, - override_branch=override_branch, - override_isolation_scope=override_isolation_scope, - run_id=run_id, - ) - if ( - raise_on_wait - and built_node.wait_for_output - and result.output is None - and not result.actions.transfer_to_agent - ): - from ..workflow._errors import NodeInterruptedError - - raise NodeInterruptedError() - return result.output - # ============================================================================ # Artifact methods # ============================================================================ @@ -573,7 +126,7 @@ async def load_artifact( The artifact. """ if self._invocation_context.artifact_service is None: - raise ValueError('Artifact service is not initialized.') + raise ValueError("Artifact service is not initialized.") return await self._invocation_context.artifact_service.load_artifact( app_name=self._invocation_context.app_name, user_id=self._invocation_context.user_id, @@ -599,7 +152,7 @@ async def save_artifact( The version of the artifact. """ if self._invocation_context.artifact_service is None: - raise ValueError('Artifact service is not initialized.') + raise ValueError("Artifact service is not initialized.") version = await self._invocation_context.artifact_service.save_artifact( app_name=self._invocation_context.app_name, user_id=self._invocation_context.user_id, @@ -625,7 +178,7 @@ async def get_artifact_version( The artifact version info. """ if self._invocation_context.artifact_service is None: - raise ValueError('Artifact service is not initialized.') + raise ValueError("Artifact service is not initialized.") return await self._invocation_context.artifact_service.get_artifact_version( app_name=self._invocation_context.app_name, user_id=self._invocation_context.user_id, @@ -637,7 +190,7 @@ async def get_artifact_version( async def list_artifacts(self) -> list[str]: """Lists the filenames of the artifacts attached to the current session.""" if self._invocation_context.artifact_service is None: - raise ValueError('Artifact service is not initialized.') + raise ValueError("Artifact service is not initialized.") return await self._invocation_context.artifact_service.list_artifact_keys( app_name=self._invocation_context.app_name, user_id=self._invocation_context.user_id, @@ -655,7 +208,7 @@ async def save_credential(self, auth_config: AuthConfig) -> None: auth_config: The authentication configuration containing the credential. """ if self._invocation_context.credential_service is None: - raise ValueError('Credential service is not initialized.') + raise ValueError("Credential service is not initialized.") await self._invocation_context.credential_service.save_credential( auth_config, self ) @@ -672,7 +225,7 @@ async def load_credential( The loaded credential, or None if not found. """ if self._invocation_context.credential_service is None: - raise ValueError('Credential service is not initialized.') + raise ValueError("Credential service is not initialized.") return await self._invocation_context.credential_service.load_credential( auth_config, self ) @@ -710,9 +263,9 @@ def request_credential(self, auth_config: AuthConfig) -> None: if not self.function_call_id: raise ValueError( - 'request_credential requires function_call_id. ' - 'This method can only be used in a tool context, not a callback ' - 'context. Consider using save_credential/load_credential instead.' + "request_credential requires function_call_id. " + "This method can only be used in a tool context, not a callback " + "context. Consider using save_credential/load_credential instead." ) self._event_actions.requested_auth_configs[self.function_call_id] = ( AuthHandler(auth_config).generate_auth_request() @@ -744,8 +297,8 @@ def request_confirmation( if not self.function_call_id: raise ValueError( - 'request_confirmation requires function_call_id. ' - 'This method can only be used in a tool context.' + "request_confirmation requires function_call_id. " + "This method can only be used in a tool context." ) self._event_actions.requested_tool_confirmations[self.function_call_id] = ( ToolConfirmation( @@ -776,7 +329,7 @@ async def my_after_agent_callback(ctx: Context): """ if self._invocation_context.memory_service is None: raise ValueError( - 'Cannot add session to memory: memory service is not available.' + "Cannot add session to memory: memory service is not available." ) await self._invocation_context.memory_service.add_session_to_memory( self._invocation_context.session @@ -802,7 +355,7 @@ async def add_events_to_memory( """ if self._invocation_context.memory_service is None: raise ValueError( - 'Cannot add events to memory: memory service is not available.' + "Cannot add events to memory: memory service is not available." ) await self._invocation_context.memory_service.add_events_to_memory( app_name=self._invocation_context.session.app_name, @@ -831,7 +384,7 @@ async def add_memory( ValueError: If memory service is not available. """ if self._invocation_context.memory_service is None: - raise ValueError('Cannot add memory: memory service is not available.') + raise ValueError("Cannot add memory: memory service is not available.") await self._invocation_context.memory_service.add_memory( app_name=self._invocation_context.session.app_name, user_id=self._invocation_context.session.user_id, @@ -852,7 +405,7 @@ async def search_memory(self, query: str) -> SearchMemoryResponse: ValueError: If memory service is not available. """ if self._invocation_context.memory_service is None: - raise ValueError('Memory service is not available.') + raise ValueError("Memory service is not available.") return await self._invocation_context.memory_service.search_memory( app_name=self._invocation_context.app_name, user_id=self._invocation_context.user_id, @@ -880,37 +433,7 @@ def render_ui_widget(self, ui_widget: UiWidget) -> None: if existing_widget.id == ui_widget.id: raise ValueError( f"UI widget with ID '{ui_widget.id}' already exists in the current" - ' event actions.' + " event actions." ) self._event_actions.render_ui_widgets.append(ui_widget) - - # ============================================================================ - # Node Execution Dispatcher - # ============================================================================ - - async def _run_node_standalone( - self, - node: BaseNode, - node_input: Any, - *, - use_as_output: bool = False, - run_id: str | None = None, - use_sub_branch: bool = False, - override_branch: str | None = None, - override_isolation_scope: str | None = None, - resume_inputs: dict[str, Any] | None = None, - ) -> Context: - """Run a node directly via NodeRunner without an orchestrator.""" - from ..workflow._node_runner import NodeRunner - - runner = NodeRunner( - node=node, - parent_ctx=self, - run_id=run_id, - use_as_output=use_as_output, - use_sub_branch=use_sub_branch, - override_branch=override_branch, - override_isolation_scope=override_isolation_scope, - ) - return await runner.run(node_input=node_input, resume_inputs=resume_inputs) diff --git a/src/google/adk/agents/invocation_context.py b/src/google/adk/agents/invocation_context.py index 89d831a884..8dc1a01af2 100644 --- a/src/google/adk/agents/invocation_context.py +++ b/src/google/adk/agents/invocation_context.py @@ -14,7 +14,6 @@ from __future__ import annotations -import asyncio from typing import Any from typing import cast from typing import Optional @@ -37,7 +36,6 @@ from ..sessions.base_session_service import BaseSessionService from ..sessions.session import Session from ..tools.base_tool import BaseTool -from ..workflow._base_node import BaseNode from .active_streaming_tool import ActiveStreamingTool from .base_agent import BaseAgent from .base_agent import BaseAgentState @@ -163,36 +161,13 @@ class InvocationContext(BaseModel): Branch is used when multiple sub-agents shouldn't see their peer agents' conversation history. """ - isolation_scope: Optional[str] = None - """Scope tag for filtering session events visible to this agent. - - When set, the LLM content-builder restricts session events to those - whose ``event.isolation_scope`` matches. One usage today is the - Task API: task-mode and single_turn-mode agents are scoped under - the originating function-call id; chat coordinators are unscoped - and see only unscoped events. - - ⚠️ DO NOT USE THIS FIELD DIRECTLY. It is an internal mechanism - that may change without notice. - """ - agent: Optional[BaseAgent | BaseNode] = None - """The current agent of this invocation context. - - None when Runner drives a BaseNode (not a BaseAgent). - """ + agent: BaseAgent + """The current agent of this invocation context. Readonly.""" user_content: Optional[types.Content] = None """The user content that started this invocation. Readonly.""" session: Session """The current session of this invocation context. Readonly.""" - node_path: Optional[str] = None - """The path of the current agent in the workflow call stack. - - Used by workflow agents to track their position in nested agent hierarchies. - Format: "agent_1/agent_2/agent_3" where agent_1 is the outermost workflow. - None for non-workflow agents. - """ - agent_states: dict[str, dict[str, Any]] = Field(default_factory=dict) """The state of the agent for this invocation.""" @@ -237,25 +212,9 @@ class InvocationContext(BaseModel): plugin_manager: PluginManager = Field(default_factory=PluginManager) """The manager for keeping track of plugins in this invocation.""" - _state_schema: Optional[type[BaseModel]] = None - """The Pydantic model declaring the expected state keys and types. - - Propagated from the owning agent down the hierarchy. When set, - ``ctx.state`` mutations and ``Event(state={...})`` deltas are - validated against this schema at runtime. - """ - canonical_tools_cache: Optional[list[BaseTool]] = None """The cache of canonical tools for this invocation.""" - _event_queue: Optional[asyncio.Queue] = PrivateAttr(default=None) - """Shared event queue for all nodes in this invocation. - - All nodes enqueue events here via ``_enqueue_event()``. The Runner - main loop is the sole consumer — it appends events to session and - yields them to SSE. - """ - credential_by_key: dict[str, AuthCredential] = Field(default_factory=dict) """The resolved credentials for this invocation, keyed by credential_key.""" @@ -274,30 +233,6 @@ def is_resumable(self) -> bool: and self.resumability_config.is_resumable ) - async def _enqueue_event(self, event: Event) -> None: - """Enqueue an event for the Runner main loop to process. - - Non-partial events block until the main loop has appended them - to session, ensuring session consistency before the node - continues. Partial events (SSE streaming) flow through without - blocking. - """ - if self._event_queue is None: - raise RuntimeError( - "_enqueue_event called but _event_queue is not set. " - "Ensure the Runner initialises _event_queue on " - "InvocationContext." - ) - - if event.partial: - # Partial events: SSE streaming only, no session append, no blocking. - await self._event_queue.put((event, None)) - else: - # Non-partial events: block until main loop appends to session. - processed = asyncio.Event() - await self._event_queue.put((event, processed)) - await processed.wait() - def set_agent_state( self, agent_name: str, @@ -361,27 +296,24 @@ def populate_invocation_agent_states(self) -> None: if not self.is_resumable: return for event in self._get_events(current_invocation=True): - # Use node_info.path if available (workflow events), otherwise fall - # back to author (non-workflow events). - key = event.node_info.path or event.author if event.actions.end_of_agent: - self.end_of_agents[key] = True + self.end_of_agents[event.author] = True # Delete agent_state when it is end - self.agent_states.pop(key, None) + self.agent_states.pop(event.author, None) elif event.actions.agent_state is not None: - self.agent_states[key] = event.actions.agent_state + self.agent_states[event.author] = event.actions.agent_state # Invalidate the end_of_agent flag - self.end_of_agents[key] = False + self.end_of_agents[event.author] = False elif ( event.author != "user" and event.content - and not self.agent_states.get(key) + and not self.agent_states.get(event.author) ): # If the agent has generated some contents but its agent_state is not # set, set its agent_state to an empty agent_state. - self.agent_states[key] = BaseAgentState().model_dump(mode="json") + self.agent_states[event.author] = BaseAgentState() # Invalidate the end_of_agent flag - self.end_of_agents[key] = False + self.end_of_agents[event.author] = False def increment_llm_call_count( self, @@ -429,12 +361,7 @@ def _get_events( if event.invocation_id == self.invocation_id ] if current_branch: - results = [ - event - for event in results - if event.branch == self.branch - or (event.branch is None and event.author == "user") - ] + results = [event for event in results if event.branch == self.branch] return results def should_pause_invocation(self, event: Event) -> bool: @@ -452,7 +379,8 @@ def should_pause_invocation(self, event: Event) -> bool: running. Should meet all following conditions to pause an invocation: - 1. The current event has a long running function call. + 1. The app is resumable. + 2. The current event has a long running function call. Args: event: The current event. @@ -460,6 +388,9 @@ def should_pause_invocation(self, event: Event) -> bool: Returns: Whether to pause the invocation right after this event. """ + if not self.is_resumable: + return False + if not event.long_running_tool_ids or not event.get_function_calls(): return False diff --git a/src/google/adk/agents/llm/__init__.py b/src/google/adk/agents/llm/__init__.py deleted file mode 100644 index 58d482ea38..0000000000 --- a/src/google/adk/agents/llm/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/src/google/adk/agents/llm/task/__init__.py b/src/google/adk/agents/llm/task/__init__.py deleted file mode 100644 index 58d482ea38..0000000000 --- a/src/google/adk/agents/llm/task/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/src/google/adk/agents/llm/task/_finish_task_tool.py b/src/google/adk/agents/llm/task/_finish_task_tool.py deleted file mode 100644 index 05c61b96b5..0000000000 --- a/src/google/adk/agents/llm/task/_finish_task_tool.py +++ /dev/null @@ -1,185 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""FinishTaskTool: signals task completion and sets finish_task action.""" - -from __future__ import annotations - -from typing import Any -from typing import Optional -from typing import TYPE_CHECKING - -from google.genai import types -from pydantic import TypeAdapter -from pydantic import ValidationError -from typing_extensions import override - -from ....tools.base_tool import BaseTool -from ....utils._schema_utils import SchemaType -from ._task_models import _DefaultTaskOutput -from ._task_models import TaskResult - -if TYPE_CHECKING: - from ....models.llm_request import LlmRequest - from ....tools.tool_context import ToolContext - from ...llm_agent import LlmAgent - -# Name of the finish_task tool -FINISH_TASK_TOOL_NAME = 'finish_task' - -# Success result returned by FinishTaskTool.run_async when validation -# passes. The wrapper uses this to distinguish a successful completion -# from a validation-error retry signal. -FINISH_TASK_SUCCESS_RESULT = 'Task completed.' - - -class FinishTaskTool(BaseTool): - """Tool for signaling LlmAgent task completion. - - This tool allows the model to signal that the agent has completed its - task. On success it sets ``tool_context.actions.finish_task`` with a - serialized ``TaskResult`` dict. - """ - - def __init__( - self, - task_agent: LlmAgent, - ): - """Initialize the finish_task tool. - - Args: - task_agent: The task agent this tool belongs to. The agent's - ``output_schema`` is used for validation. If None, the default - schema (a single ``result`` string) is used. - """ - self._task_agent_name = task_agent.name - - output_schema = task_agent.output_schema - self.output_schema: SchemaType = ( - output_schema if output_schema is not None else _DefaultTaskOutput - ) - self._adapter: TypeAdapter[Any] = TypeAdapter(self.output_schema) - raw_schema = self._adapter.json_schema() - # FunctionDeclaration parameters must be a JSON object schema. - # If the schema is already an object (e.g. BaseModel), use it directly. - # Otherwise wrap it in an object with a single key. - self._wrapper_key: str | None = ( - None if raw_schema.get('type') == 'object' else 'result' - ) - - description = ( - 'Signal that this agent has completed its delegated task. Call this' - ' when you have finished your delegated task.' - ) - if output_schema: - description += ' Pass the required output data in the parameters.' - - super().__init__( - name=FINISH_TASK_TOOL_NAME, - description=description, - ) - - @override - def _get_declaration(self) -> Optional[types.FunctionDeclaration]: - """Get the function declaration for this tool.""" - raw_schema = self._adapter.json_schema() - if self._wrapper_key: - # Extract $defs to the root level so $ref pointers remain valid - # after wrapping the schema inside an object property. - defs = raw_schema.pop('$defs', None) - schema_json = { - 'type': 'object', - 'properties': {self._wrapper_key: raw_schema}, - 'required': [self._wrapper_key], - } - if defs: - schema_json['$defs'] = defs - else: - schema_json = raw_schema - - return types.FunctionDeclaration( - name=FINISH_TASK_TOOL_NAME, - description=self.description, - parameters_json_schema=schema_json, - ) - - @override - async def process_llm_request( - self, *, tool_context: ToolContext, llm_request: LlmRequest - ) -> None: - """Process the outgoing LLM request to add tool and instructions. - - Args: - tool_context: The context of the tool. - llm_request: The outgoing LLM request. - """ - await super().process_llm_request( - tool_context=tool_context, llm_request=llm_request - ) - - instruction = self._build_instruction() - llm_request.append_instructions([instruction]) - - def _build_instruction(self) -> str: - """Build the finish_task instruction. - - Returns: - Instruction text for the LLM about when to call finish_task. - """ - return """\ -Do NOT call `finish_task` prematurely. Use your available tools to -fully complete every aspect of the delegated task first. If the -task is unclear, ask the user for clarification before proceeding. -Once the task is fully complete, call `finish_task` by itself with -no accompanying text output.""" - - @override - async def run_async( - self, - *, - args: dict[str, Any], - tool_context: ToolContext, - ) -> str | dict[str, str]: - """Execute the finish_task tool. - - Validates args against the output schema and sets - ``tool_context.actions.finish_task`` on success. - - Args: - args: The arguments passed to the tool. - tool_context: The tool execution context. - - Returns: - Confirmation message, or error dict if validation fails. - """ - try: - raw_value = args.get(self._wrapper_key) if self._wrapper_key else args - validated = self._adapter.validate_python(raw_value) - validated_output = self._adapter.dump_python(validated, mode='json') - except ValidationError as e: - return { - 'error': ( - f'Invoking `{self.name}()` failed due to validation' - f' errors:\n{e}\nYou could retry calling this tool, but' - ' it is IMPORTANT for you to provide all the mandatory' - ' parameters with correct types.' - ) - } - - # do not write actions.finish_task. The LlmAgent - # wrapper sniffs the finish_task FC's `output` arg directly to - # set event.output on the task agent's run. - del validated_output - - return FINISH_TASK_SUCCESS_RESULT diff --git a/src/google/adk/agents/llm/task/_task_models.py b/src/google/adk/agents/llm/task/_task_models.py deleted file mode 100644 index 62e4afdeeb..0000000000 --- a/src/google/adk/agents/llm/task/_task_models.py +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Data models for task-mode LlmAgent delegation. - -Used by ``FinishTaskTool`` to validate and serialize task input/result -payloads. -""" - -from __future__ import annotations - -import logging -from typing import Any -from typing import Optional - -from pydantic import alias_generators -from pydantic import BaseModel -from pydantic import ConfigDict - -logger = logging.getLogger('google_adk.' + __name__) - - -class TaskRequest(BaseModel): - """A request to delegate a task to a sub-agent.""" - - model_config = ConfigDict( - extra='forbid', - alias_generator=alias_generators.to_camel, - populate_by_name=True, - ) - - agent_name: str - """The name of the target agent to delegate to.""" - - input: dict[str, Any] - """The validated input data for the task.""" - - -class TaskResult(BaseModel): - """The result returned by a task agent upon completion.""" - - model_config = ConfigDict( - extra='forbid', - alias_generator=alias_generators.to_camel, - populate_by_name=True, - ) - - output: Any - """The validated output data from the task.""" - - -def _as_task_request(value: Any) -> TaskRequest: - """Convert a value to a TaskRequest instance. - - Handles both TaskRequest instances (same-invocation, stored directly) - and plain dicts (after session deserialization via model_dump()). - - Args: - value: A TaskRequest instance or a dict representation. - - Returns: - A TaskRequest instance. - """ - if isinstance(value, TaskRequest): - return value - if not isinstance(value, dict): - logger.error( - 'Unexpected type for TaskRequest: %s. Expected TaskRequest or dict.', - type(value).__name__, - ) - return TaskRequest.model_validate(value) - - -class _DefaultTaskInput(BaseModel): - """Default input schema when no custom input_schema is provided. - - Used by RequestTaskTool to generate the function declaration when the - target agent does not define an explicit input_schema. - """ - - model_config = ConfigDict( - extra='forbid', - alias_generator=alias_generators.to_camel, - populate_by_name=True, - ) - - goal: Optional[str] = None - """The goal or objective for the task agent.""" - - background: Optional[str] = None - """Additional background context for the task agent.""" - - -class _DefaultTaskOutput(BaseModel): - """Default output schema when no custom output_schema is provided. - - Used by FinishTaskTool to generate the function declaration when the - task agent does not define an explicit output_schema. - """ - - model_config = ConfigDict( - extra='forbid', - alias_generator=alias_generators.to_camel, - populate_by_name=True, - ) - - result: str - """A brief summary of what the agent accomplished.""" diff --git a/src/google/adk/agents/llm_agent.py b/src/google/adk/agents/llm_agent.py index ee1b05c535..b41b7f4eff 100644 --- a/src/google/adk/agents/llm_agent.py +++ b/src/google/adk/agents/llm_agent.py @@ -14,7 +14,6 @@ from __future__ import annotations -import abc import asyncio import importlib import inspect @@ -62,10 +61,10 @@ from ..utils.context_utils import Aclosing from .base_agent import BaseAgent from .base_agent import BaseAgentState -from .base_agent_config import BaseAgentConfig as BaseAgentConfig +from .base_agent_config import BaseAgentConfig from .callback_context import CallbackContext from .invocation_context import InvocationContext -from .llm_agent_config import LlmAgentConfig as LlmAgentConfig +from .llm_agent_config import LlmAgentConfig from .readonly_context import ReadonlyContext logger = logging.getLogger('google_adk.' + __name__) @@ -193,37 +192,25 @@ async def _convert_tool_union_to_tools( return [] -# TODO: drop the explicit abc.ABC base once BaseNode surfaces ABCMeta to -# static type checkers. -class LlmAgent(BaseAgent, abc.ABC): +class LlmAgent(BaseAgent): """LLM-based Agent.""" - DEFAULT_MODEL: ClassVar[str] = 'gemini-3-flash-preview' + DEFAULT_MODEL: ClassVar[str] = 'gemini-2.5-flash' """System default model used when no model is set on an agent.""" - DEFAULT_LIVE_MODEL: ClassVar[str] = 'gemini-live-2.5-flash-native-audio' - """System default model used for live mode when no model is set on an agent.""" - _default_model: ClassVar[Union[str, BaseLlm]] = DEFAULT_MODEL """Current default model used when an agent has no model set.""" - _default_live_model: ClassVar[Union[str, BaseLlm]] = DEFAULT_LIVE_MODEL - """Current default model used for live mode when an agent has no model set.""" - model: Union[str, BaseLlm] = '' """The model to use for the agent. When not set, the agent will inherit the model from its ancestor. If no ancestor provides a model, the agent uses the default model configured via - LlmAgent.set_default_model. The built-in default is gemini-3-flash-preview. + LlmAgent.set_default_model. The built-in default is gemini-2.5-flash. """ config_type: ClassVar[Type[BaseAgentConfig]] = LlmAgentConfig - """The config type for this agent. - - DEPRECATED: This attribute is deprecated and will be removed in a future - version, along with the AgentConfig YAML loader. - """ + """The config type for this agent.""" instruction: Union[str, InstructionProvider] = '' """Dynamic instructions for the LLM model, guiding the agent's behavior. @@ -316,20 +303,6 @@ class LlmAgent(BaseAgent, abc.ABC): settings, etc. """ - mode: Literal['chat', 'task', 'single_turn'] | None = None - """The delegation mode for this agent. - - Options: - chat: Standard chat agent reachable via transfer_to_agent. - task: Task agent that chats with the user to accomplish a task. - single_turn: Agents that complete a task without chatting with the user. - - Default value is chat as a sub-agent, single_turn as a node in a workflow. - """ - - parallel_worker: bool | None = None - """Whether to run the agent in parallel worker mode.""" - # LLM-based agent transfer configs - Start disallow_transfer_to_parent: bool = False """Disallows LLM-controlled transferring to the parent agent. @@ -542,27 +515,6 @@ async def _run_live_impl( if ctx.end_invocation: return - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - """Runs the agent as a node in a workflow graph.""" - from ..utils.context_utils import Aclosing - from ..workflow._llm_agent_wrapper import run_llm_agent_as_node - - async with Aclosing( - run_llm_agent_as_node(self, ctx=ctx, node_input=node_input) - ) as agen: - async for event in agen: - # Keep the agent's true event author so the outer NodeRunner does - # not overwrite it with the parent workflow's event_author. - if event.author: - ctx.event_author = event.author - yield event - @property def canonical_model(self) -> BaseLlm: """The resolved self.model field as BaseLlm. @@ -581,24 +533,6 @@ def canonical_model(self) -> BaseLlm: ancestor_agent = ancestor_agent.parent_agent return self._resolve_default_model() - @property - def canonical_live_model(self) -> BaseLlm: - """The resolved self.model field as BaseLlm for live mode. - - This method is only for use by Agent Development Kit. - """ - if isinstance(self.model, BaseLlm): - return self.model - elif self.model: # model is non-empty str - return LLMRegistry.new_llm(self.model) - else: # find model from ancestors. - ancestor_agent = self.parent_agent - while ancestor_agent is not None: - if isinstance(ancestor_agent, LlmAgent): - return ancestor_agent.canonical_live_model - ancestor_agent = ancestor_agent.parent_agent - return self._resolve_default_live_model() - @classmethod def set_default_model(cls, model: Union[str, BaseLlm]) -> None: """Overrides the default model used when an agent has no model set.""" @@ -616,23 +550,6 @@ def _resolve_default_model(cls) -> BaseLlm: return default_model return LLMRegistry.new_llm(default_model) - @classmethod - def set_default_live_model(cls, model: Union[str, BaseLlm]) -> None: - """Overrides the default model used for live mode when an agent has no model set.""" - if not isinstance(model, (str, BaseLlm)): - raise TypeError('Default live model must be a model name or BaseLlm.') - if isinstance(model, str) and not model: - raise ValueError('Default live model must be a non-empty string.') - cls._default_live_model = model - - @classmethod - def _resolve_default_live_model(cls) -> BaseLlm: - """Resolves the current default live model to a BaseLlm instance.""" - default_live_model = cls._default_live_model - if isinstance(default_live_model, BaseLlm): - return default_live_model - return LLMRegistry.new_llm(default_live_model) - async def canonical_instruction( self, ctx: ReadonlyContext ) -> tuple[str, bool]: @@ -981,14 +898,10 @@ def model_post_init(self, __context: Any) -> None: """Provides a warning if multiple thinking configurations are found.""" super().model_post_init(__context) - from ..planners.built_in_planner import BuiltInPlanner - - if ( - self.generate_content_config is not None - and self.generate_content_config.thinking_config is not None - and isinstance(self.planner, BuiltInPlanner) - and self.planner.thinking_config is not None - ): + # Note: Using getattr to check both locations for thinking_config + if getattr( + self.generate_content_config, 'thinking_config', None + ) and getattr(self.planner, 'thinking_config', None): warnings.warn( 'Both `thinking_config` in `generate_content_config` and a ' 'planner with `thinking_config` are provided. The ' @@ -997,30 +910,6 @@ def model_post_init(self, __context: Any) -> None: stacklevel=3, ) - if self.mode == 'task': - from .llm.task._finish_task_tool import FinishTaskTool - - self.tools.append(FinishTaskTool(self)) - - # Add sub-agents as tools based on their mode - from ..tools.agent_tool import _SingleTurnAgentTool - from ..tools.agent_tool import _TaskAgentTool - - if self.sub_agents: - for sub_agent in self.sub_agents: - if isinstance(sub_agent, LlmAgent): - mode = getattr(sub_agent, 'mode', None) - if mode is None: - try: - sub_agent.mode = 'chat' - mode = 'chat' - except (AttributeError, TypeError): - continue - if mode == 'single_turn': - self.tools.append(_SingleTurnAgentTool(sub_agent)) - elif mode == 'task': - self.tools.append(_TaskAgentTool(sub_agent)) - @classmethod @experimental(FeatureName.AGENT_CONFIG) def _resolve_tools( diff --git a/src/google/adk/agents/llm_agent_config.py b/src/google/adk/agents/llm_agent_config.py index 23a6737445..93ca718094 100644 --- a/src/google/adk/agents/llm_agent_config.py +++ b/src/google/adk/agents/llm_agent_config.py @@ -14,6 +14,8 @@ from __future__ import annotations +import logging +from typing import Any from typing import List from typing import Literal from typing import Optional @@ -22,16 +24,14 @@ from pydantic import ConfigDict from pydantic import Field from pydantic import model_validator -from typing_extensions import deprecated from ..tools.tool_configs import ToolConfig from .base_agent_config import BaseAgentConfig from .common_configs import CodeConfig +logger = logging.getLogger('google_adk.' + __name__) + -@deprecated( - 'LlmAgentConfig is deprecated and will be removed in future versions.' -) class LlmAgentConfig(BaseAgentConfig): """The config for the YAML schema of a LlmAgent.""" @@ -55,11 +55,10 @@ class LlmAgentConfig(BaseAgentConfig): default=None, description=( 'Optional. LlmAgent.model. Provide a model name string (e.g.' - ' "gemini-3-flash-preview"). If not set, the model will be inherited' - ' from the ancestor or fall back to the system default' - ' (gemini-3-flash-preview unless overridden via' - ' LlmAgent.set_default_model). To construct a model instance from' - ' code, use model_code.' + ' "gemini-2.5-flash"). If not set, the model will be inherited from' + ' the ancestor or fall back to the system default (gemini-2.5-flash' + ' unless overridden via LlmAgent.set_default_model). To construct a' + ' model instance from code, use model_code.' ), ) @@ -72,6 +71,25 @@ class LlmAgentConfig(BaseAgentConfig): ), ) + @model_validator(mode='before') + @classmethod + def _normalize_model_code(cls, data: Any) -> dict[str, Any] | Any: + if not isinstance(data, dict): + return data + + model_value = data.get('model') + model_code = data.get('model_code') + if isinstance(model_value, dict) and model_code is None: + logger.warning( + 'Detected legacy `model` mapping. Use `model_code` to provide a' + ' CodeConfig for custom model construction.' + ) + data = dict(data) + data['model_code'] = model_value + data['model'] = None + + return data + @model_validator(mode='after') def _validate_model_sources(self) -> LlmAgentConfig: if self.model and self.model_code: diff --git a/src/google/adk/agents/loop_agent.py b/src/google/adk/agents/loop_agent.py index 6bf5221404..13480a9e01 100644 --- a/src/google/adk/agents/loop_agent.py +++ b/src/google/adk/agents/loop_agent.py @@ -23,7 +23,6 @@ from typing import Dict from typing import Optional -from typing_extensions import deprecated from typing_extensions import override from ..events.event import Event @@ -50,27 +49,15 @@ class LoopAgentState(BaseAgentState): """The number of times the loop agent has looped.""" -@deprecated( - 'LoopAgent is deprecated and will be removed in future versions.' - ' Please use Workflow instead.' -) class LoopAgent(BaseAgent): """A shell agent that run its sub-agents in a loop. When sub-agent generates an event with escalate or max_iterations are reached, the loop agent will stop. - - .. deprecated:: - LoopAgent is deprecated and will be removed in future versions. - Please use Workflow instead. """ config_type: ClassVar[type[BaseAgentConfig]] = LoopAgentConfig - """The config type for this agent. - - DEPRECATED: This attribute is deprecated and will be removed in a future - version, along with the AgentConfig YAML loader. - """ + """The config type for this agent.""" max_iterations: Optional[int] = None """The maximum number of iterations to run the loop agent. diff --git a/src/google/adk/agents/loop_agent_config.py b/src/google/adk/agents/loop_agent_config.py index 61ec049e97..78fc790b04 100644 --- a/src/google/adk/agents/loop_agent_config.py +++ b/src/google/adk/agents/loop_agent_config.py @@ -20,16 +20,12 @@ from pydantic import ConfigDict from pydantic import Field -from typing_extensions import deprecated from ..features import experimental from ..features import FeatureName from .base_agent_config import BaseAgentConfig -@deprecated( - 'LoopAgentConfig is deprecated and will be removed in future versions.' -) @experimental(FeatureName.AGENT_CONFIG) class LoopAgentConfig(BaseAgentConfig): """The config for the YAML schema of a LoopAgent.""" diff --git a/src/google/adk/agents/parallel_agent.py b/src/google/adk/agents/parallel_agent.py index 8284ec6232..cb8b09f655 100644 --- a/src/google/adk/agents/parallel_agent.py +++ b/src/google/adk/agents/parallel_agent.py @@ -21,7 +21,6 @@ from typing import AsyncGenerator from typing import ClassVar -from typing_extensions import deprecated from typing_extensions import override from ..events.event import Event @@ -148,10 +147,6 @@ async def process_an_agent(events_for_one_agent): task.cancel() -@deprecated( - 'ParallelAgent is deprecated and will be removed in future versions.' - ' Please use Workflow instead.' -) class ParallelAgent(BaseAgent): """A shell agent that runs its sub-agents in parallel in an isolated manner. @@ -160,18 +155,10 @@ class ParallelAgent(BaseAgent): - Running different algorithms simultaneously. - Generating multiple responses for review by a subsequent evaluation agent. - - .. deprecated:: - ParallelAgent is deprecated and will be removed in future versions. - Please use Workflow instead. """ config_type: ClassVar[type[BaseAgentConfig]] = ParallelAgentConfig - """The config type for this agent. - - DEPRECATED: This attribute is deprecated and will be removed in a future - version, along with the AgentConfig YAML loader. - """ + """The config type for this agent.""" @override async def _run_async_impl( diff --git a/src/google/adk/agents/parallel_agent_config.py b/src/google/adk/agents/parallel_agent_config.py index aa025893c6..96a75b6512 100644 --- a/src/google/adk/agents/parallel_agent_config.py +++ b/src/google/adk/agents/parallel_agent_config.py @@ -18,16 +18,12 @@ from pydantic import ConfigDict from pydantic import Field -from typing_extensions import deprecated from ..features import experimental from ..features import FeatureName from .base_agent_config import BaseAgentConfig -@deprecated( - "ParallelAgentConfig is deprecated and will be removed in future versions." -) @experimental(FeatureName.AGENT_CONFIG) class ParallelAgentConfig(BaseAgentConfig): """The config for the YAML schema of a ParallelAgent.""" diff --git a/src/google/adk/agents/remote_a2a_agent.py b/src/google/adk/agents/remote_a2a_agent.py index dbbc30558f..495a715d76 100644 --- a/src/google/adk/agents/remote_a2a_agent.py +++ b/src/google/adk/agents/remote_a2a_agent.py @@ -66,7 +66,6 @@ from ..a2a.converters.part_converter import convert_genai_part_to_a2a_part from ..a2a.converters.part_converter import GenAIPartToA2APartConverter from ..a2a.converters.to_adk_event import _create_mock_function_call_for_required_user_input -from ..a2a.converters.to_adk_event import MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH from ..a2a.converters.to_adk_event import MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT from ..a2a.converters.utils import _get_adk_metadata_key from ..a2a.experimental import a2a_experimental @@ -381,28 +380,23 @@ def _create_a2a_request_for_user_function_response( event = ctx.session.events[-1] # If the user function_response replies to a function_call for non-ADK - # input-required / auth-required events (fc.name in - # {MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT, - # MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH}), the function_response part - # is replaced with text extracted from the function response. - # The implementation is based on the assumption that the user - # function_response event will contain a function_response with one of - # those names and the response will contain a "result" field with the user - # input as a string text. - mock_function_call_names = { - MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT, - MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH, - } + # input-required events (fc.name = MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT), + # the function_response part is replaced with text extracted from the + # function response. + # The implementation is based on the assumption that the user function_response + # event will contain a function_response with the name + # MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT and the response will + # contain a "result" field with the user input as a string text. mock_function_call = [ fc for fc in function_call_event.get_function_calls() - if fc.name in mock_function_call_names + if fc.name == MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT ] if mock_function_call: new_parts = [] for function_response in event.get_function_responses(): if ( - function_response.name in mock_function_call_names + function_response.name == MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT and function_response.response and "result" in function_response.response ): diff --git a/src/google/adk/agents/run_config.py b/src/google/adk/agents/run_config.py index 8126ac5bf3..e059cd957d 100644 --- a/src/google/adk/agents/run_config.py +++ b/src/google/adk/agents/run_config.py @@ -247,9 +247,6 @@ class RunConfig(BaseModel): session_resumption: Optional[types.SessionResumptionConfig] = None """Configures session resumption mechanism. Only support transparent session resumption mode now.""" - history_config: Optional[types.HistoryConfig] = None - """Configures the exchange of history between the client and the server.""" - context_window_compression: Optional[types.ContextWindowCompressionConfig] = ( None ) diff --git a/src/google/adk/agents/sequential_agent.py b/src/google/adk/agents/sequential_agent.py index 01510ff4cb..06a2377bc0 100644 --- a/src/google/adk/agents/sequential_agent.py +++ b/src/google/adk/agents/sequential_agent.py @@ -21,7 +21,6 @@ from typing import ClassVar from typing import Type -from typing_extensions import deprecated from typing_extensions import override from ..events.event import Event @@ -46,24 +45,11 @@ class SequentialAgentState(BaseAgentState): """The name of the current sub-agent to run.""" -@deprecated( - 'SequentialAgent is deprecated and will be removed in future versions.' - ' Please use Workflow instead.' -) class SequentialAgent(BaseAgent): - """A shell agent that runs its sub-agents in sequence. - - .. deprecated:: - SequentialAgent is deprecated and will be removed in future versions. - Please use Workflow instead. - """ + """A shell agent that runs its sub-agents in sequence.""" config_type: ClassVar[Type[BaseAgentConfig]] = SequentialAgentConfig - """The config type for this agent. - - DEPRECATED: This attribute is deprecated and will be removed in a future - version, along with the AgentConfig YAML loader. - """ + """The config type for this agent.""" @override async def _run_async_impl( diff --git a/src/google/adk/agents/sequential_agent_config.py b/src/google/adk/agents/sequential_agent_config.py index 1855085cd9..44551c427f 100644 --- a/src/google/adk/agents/sequential_agent_config.py +++ b/src/google/adk/agents/sequential_agent_config.py @@ -18,17 +18,12 @@ from pydantic import ConfigDict from pydantic import Field -from typing_extensions import deprecated from ..agents.base_agent_config import BaseAgentConfig from ..features import experimental from ..features import FeatureName -@deprecated( - "SequentialAgentConfig is deprecated and will be removed in future" - " versions." -) @experimental(FeatureName.AGENT_CONFIG) class SequentialAgentConfig(BaseAgentConfig): """The config for the YAML schema of a SequentialAgent.""" diff --git a/src/google/adk/apps/app.py b/src/google/adk/apps/app.py index 6cbcb52c60..9bde128b7a 100644 --- a/src/google/adk/apps/app.py +++ b/src/google/adk/apps/app.py @@ -13,10 +13,7 @@ # limitations under the License. from __future__ import annotations -import re -from typing import Any from typing import Optional -from typing import Union from pydantic import BaseModel from pydantic import ConfigDict @@ -36,15 +33,13 @@ "validate_app_name", ] -_VALID_APP_NAME_RE = re.compile(r"^[a-zA-Z][a-zA-Z0-9_-]*$") - def validate_app_name(name: str) -> None: """Ensures the provided application name is safe and intuitive.""" - if not _VALID_APP_NAME_RE.match(name): + if not name.isidentifier(): raise ValueError( - f"Invalid app name '{name}': must start with a letter and can only" - " consist of letters, digits, underscores, and hyphens." + f"Invalid app name '{name}': must be a valid identifier consisting of" + " letters, digits, and underscores." ) if name == "user": raise ValueError("App name cannot be 'user'; reserved for end-user input.") @@ -54,11 +49,9 @@ class App(BaseModel): """Represents an LLM-backed agentic application. An `App` is the top-level container for an agentic system powered by LLMs. - It manages either a root agent (`root_agent`) or a root node (`root_node`), - which serves as the entry point for execution. - - Exactly one of `root_agent` or `root_node` must be provided. - + It manages a root agent (`root_agent`), which serves as the root of an agent + tree, enabling coordination and communication across all agents in the + hierarchy. The `plugins` are application-wide components that provide shared capabilities and services to the entire system. """ @@ -71,12 +64,8 @@ class App(BaseModel): name: str """The name of the application.""" - # Change to Union[BaseAgent, BaseNode, None] after dependency is fixed. - root_agent: Union[BaseAgent, Any, None] = None - """The root agent or node in the application. - - Accepts either a BaseAgent or a BaseNode instance. - """ + root_agent: BaseAgent + """The root agent in the application. One app can only have one root agent.""" plugins: list[BasePlugin] = Field(default_factory=list) """The plugins in the application.""" @@ -94,16 +83,6 @@ class App(BaseModel): """ @model_validator(mode="after") - def _validate(self) -> App: + def _validate_name(self) -> App: validate_app_name(self.name) - if self.root_agent is None: - raise ValueError("root_agent must be provided.") - - from ..workflow._base_node import BaseNode - - if not isinstance(self.root_agent, (BaseAgent, BaseNode)): - raise TypeError( - "root_agent must be a BaseAgent or BaseNode instance, got" - f" {type(self.root_agent).__name__}" - ) return self diff --git a/src/google/adk/apps/compaction.py b/src/google/adk/apps/compaction.py index 5a1dd4af8b..1e33003a95 100644 --- a/src/google/adk/apps/compaction.py +++ b/src/google/adk/apps/compaction.py @@ -79,7 +79,7 @@ def _valid_compactions( """Returns compaction events with fully-defined compaction ranges.""" compactions: list[tuple[int, float, float, Event]] = [] for i, event in enumerate(events): - if not event.actions.compaction: + if not (event.actions and event.actions.compaction): continue compaction = event.actions.compaction if ( @@ -135,9 +135,9 @@ def _estimate_prompt_token_count( """ # Deferred import: contents depends on agents.invocation_context which # imports from apps, so a top-level import would create a circular dependency. - from ..flows.llm_flows import contents as _contents + from ..flows.llm_flows import contents - effective_contents = _contents._get_contents( + effective_contents = contents._get_contents( current_branch=current_branch, events=events, agent_name=agent_name, @@ -252,7 +252,7 @@ def _events_to_compact_for_token_threshold( candidate_events = [ event for event in events - if not event.actions.compaction + if not (event.actions and event.actions.compaction) and event.timestamp > last_compacted_end_timestamp ] if len(candidate_events) <= event_retention_size: @@ -278,6 +278,7 @@ def _events_to_compact_for_token_threshold( if ( latest_compaction_event + and latest_compaction_event.actions and latest_compaction_event.actions.compaction and latest_compaction_event.actions.compaction.start_timestamp is not None and latest_compaction_event.actions.compaction.compacted_content @@ -479,8 +480,6 @@ async def _run_compaction_for_token_threshold( If triggered, this compacts older raw events and keeps the last `event_retention_size` raw events un-compacted. """ - if app.root_agent is None: - return None return await _run_compaction_for_token_threshold_config( config=app.events_compaction_config, session=session, @@ -603,7 +602,11 @@ async def _run_compaction_for_sliding_window( # Find the last compaction event and its range. last_compacted_end_timestamp = 0.0 for event in reversed(events): - if event.actions.compaction and event.actions.compaction.end_timestamp: + if ( + event.actions + and event.actions.compaction + and event.actions.compaction.end_timestamp + ): last_compacted_end_timestamp = event.actions.compaction.end_timestamp break @@ -611,7 +614,7 @@ async def _run_compaction_for_sliding_window( invocation_latest_timestamps = {} for event in events: # Only consider non-compaction events for unique invocation IDs. - if event.invocation_id and not event.actions.compaction: + if event.invocation_id and not (event.actions and event.actions.compaction): invocation_latest_timestamps[event.invocation_id] = max( invocation_latest_timestamps.get(event.invocation_id, 0.0), event.timestamp, @@ -662,7 +665,9 @@ async def _run_compaction_for_sliding_window( events_to_compact = events[first_event_start_inv_idx : last_event_idx + 1] # Filter out any existing compaction events from the list. events_to_compact = [ - e for e in events_to_compact if not e.actions.compaction + e + for e in events_to_compact + if not (e.actions and e.actions.compaction) ] pending_ids = _pending_function_call_ids(events) events_to_compact = _truncate_events_before_pending_function_call( @@ -675,8 +680,6 @@ async def _run_compaction_for_sliding_window( if not events_to_compact: return None - if app.root_agent is None: - return None _ensure_compaction_summarizer(config=config, agent=app.root_agent) if config.summarizer is None: return None diff --git a/src/google/adk/apps/llm_event_summarizer.py b/src/google/adk/apps/llm_event_summarizer.py index 5bb7275232..28cbea4adf 100644 --- a/src/google/adk/apps/llm_event_summarizer.py +++ b/src/google/adk/apps/llm_event_summarizer.py @@ -47,19 +47,13 @@ class LlmEventSummarizer(BaseEventsSummarizer): """ _DEFAULT_PROMPT_TEMPLATE = ( - 'The following is a conversation history between a user and an AI agent.' - ' It may or may not start from a compacted history. Please identify and' - ' reiterate the user request, summarize the context so far, focusing on' - ' key decisions made and information obtained, as well as any unresolved' + 'The following is a conversation history between a user and an AI' + ' agent. Please summarize the conversation, focusing on key' + ' information and decisions made, as well as any unresolved' ' questions or tasks. The summary should be concise and capture the' - ' essence of the interaction.\n\n{conversation_history}' + ' essence of the interaction.\\n\\n{conversation_history}' ) - # Tool call args and responses can be large (e.g. search results). Cap how - # much of each is rendered so compaction does not inflate the very context - # it exists to shrink. - _MAX_TOOL_CONTENT_CHARS = 2000 - def __init__( self, llm: BaseLlm, @@ -77,42 +71,14 @@ def __init__( self._prompt_template = prompt_template or self._DEFAULT_PROMPT_TEMPLATE def _format_events_for_prompt(self, events: list[Event]) -> str: - """Formats events into prompt text, including thoughts and tool calls. - - Thoughts carry the agent's analysis of tool responses, and tool calls and - responses carry the evidence retrieved so far, so all three are included. - Thoughts emitted by a compaction event are skipped so a prior summary's - reasoning does not leak into the next summary. - """ + """Formats a list of events into a string for the LLM prompt.""" formatted_history = [] for event in events: - if not (event.content and event.content.parts): - continue - is_compaction = bool(event.actions and event.actions.compaction) - for part in event.content.parts: - if part.thought and part.text: - if not is_compaction: - formatted_history.append(f'{event.author} (thought): {part.text}') - elif part.text: - formatted_history.append(f'{event.author}: {part.text}') - if part.function_call: - args = self._truncate(str(part.function_call.args)) - formatted_history.append( - f'{event.author} called tool: {part.function_call.name}({args})' - ) - if part.function_response: - response = self._truncate(str(part.function_response.response)) - formatted_history.append( - f'Tool response from {part.function_response.name}: {response}' - ) - return '\n'.join(formatted_history) - - def _truncate(self, text: str) -> str: - """Caps `text` at the tool-content limit, marking dropped characters.""" - limit = self._MAX_TOOL_CONTENT_CHARS - if len(text) <= limit: - return text - return f'{text[:limit]}... [truncated {len(text) - limit} chars]' + if event.content and event.content.parts: + for part in event.content.parts: + if part.text: + formatted_history.append(f'{event.author}: {part.text}') + return '\\n'.join(formatted_history) async def maybe_summarize_events( self, *, events: list[Event] diff --git a/src/google/adk/auth/auth_preprocessor.py b/src/google/adk/auth/auth_preprocessor.py index b0fa1e0ba8..76dd2ddab4 100644 --- a/src/google/adk/auth/auth_preprocessor.py +++ b/src/google/adk/auth/auth_preprocessor.py @@ -22,8 +22,8 @@ from ..agents.invocation_context import InvocationContext from ..agents.readonly_context import ReadonlyContext from ..events.event import Event +from ..flows.llm_flows import functions from ..flows.llm_flows._base_llm_processor import BaseLlmRequestProcessor -from ..flows.llm_flows.functions import handle_function_calls_async from ..flows.llm_flows.functions import REQUEST_EUC_FUNCTION_CALL_NAME from ..models.llm_request import LlmRequest from ..sessions.state import State @@ -189,7 +189,7 @@ async def run_async( function_call.id in tools_to_resume for function_call in function_calls ]): - if function_response_event := await handle_function_calls_async( + if function_response_event := await functions.handle_function_calls_async( invocation_context, event, { diff --git a/src/google/adk/auth/auth_schemes.py b/src/google/adk/auth/auth_schemes.py index d3ec675092..3d6364ff66 100644 --- a/src/google/adk/auth/auth_schemes.py +++ b/src/google/adk/auth/auth_schemes.py @@ -54,8 +54,8 @@ class CustomAuthScheme(BaseModelWithConfig): # AuthSchemes contains SecuritySchemes from OpenAPI 3.0, an extra flattened -# OpenIdConnectWithConfig, and supports external schemes -# that subclass CustomAuthScheme. +# OpenIdConnectWithConfig, and supports external schemes that subclasses +# CustomAuthScheme AuthScheme = Union[SecurityScheme, OpenIdConnectWithConfig, CustomAuthScheme] diff --git a/src/google/adk/auth/oauth2_credential_util.py b/src/google/adk/auth/oauth2_credential_util.py index 978d645a05..d0d1255fbe 100644 --- a/src/google/adk/auth/oauth2_credential_util.py +++ b/src/google/adk/auth/oauth2_credential_util.py @@ -49,6 +49,7 @@ def create_oauth2_session( logger.warning("OpenIdConnect scheme missing token_endpoint") return None, None token_endpoint = auth_scheme.token_endpoint + scopes = auth_scheme.scopes or [] elif isinstance(auth_scheme, OAuth2): # Support both authorization code and client credentials flows if ( @@ -56,11 +57,13 @@ def create_oauth2_session( and auth_scheme.flows.authorizationCode.tokenUrl ): token_endpoint = auth_scheme.flows.authorizationCode.tokenUrl + scopes = list(auth_scheme.flows.authorizationCode.scopes.keys()) elif ( auth_scheme.flows.clientCredentials and auth_scheme.flows.clientCredentials.tokenUrl ): token_endpoint = auth_scheme.flows.clientCredentials.tokenUrl + scopes = list(auth_scheme.flows.clientCredentials.scopes.keys()) else: logger.warning( "OAuth2 scheme missing required flow configuration. Expected either" @@ -81,12 +84,11 @@ def create_oauth2_session( ): return None, None - # Scope is intentionally omitted: token exchange and refresh don't require - # it per RFC 6749, and some providers reject it on these requests. return ( OAuth2Session( auth_credential.oauth2.client_id, auth_credential.oauth2.client_secret, + scope=" ".join(scopes), redirect_uri=auth_credential.oauth2.redirect_uri, state=auth_credential.oauth2.state, token_endpoint_auth_method=auth_credential.oauth2.token_endpoint_auth_method, diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index 4ea3e698bb..917aadf7d0 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -14,23 +14,2200 @@ from __future__ import annotations +import asyncio +from contextlib import asynccontextmanager +import importlib +import json import logging +import os +import re +import sys +import time +import traceback +import typing +from typing import Any +from typing import Callable +from typing import List +from typing import Literal +from typing import Optional +from fastapi import FastAPI +from fastapi import HTTPException +from fastapi import Query +from fastapi import Response +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import RedirectResponse +from fastapi.responses import StreamingResponse +from fastapi.staticfiles import StaticFiles +from fastapi.websockets import WebSocket +from fastapi.websockets import WebSocketDisconnect +from google.genai import types +import graphviz +from opentelemetry import trace +import opentelemetry.sdk.environment_variables as otel_env +from opentelemetry.sdk.trace import export as export_lib +from opentelemetry.sdk.trace import ReadableSpan +from opentelemetry.sdk.trace import SpanProcessor +from opentelemetry.sdk.trace import TracerProvider +from pydantic import Field +from pydantic import ValidationError +from starlette.types import Lifespan from typing_extensions import deprecated +from typing_extensions import override +from watchdog.observers import Observer +import yaml -from .api_server import _parse_cors_origins -from .api_server import RunAgentRequest -from .dev_server import DevServer -from .utils.base_agent_loader import BaseAgentLoader as BaseAgentLoader +from . import agent_graph +from ..agents.base_agent import BaseAgent +from ..agents.live_request_queue import LiveRequest +from ..agents.live_request_queue import LiveRequestQueue +from ..agents.llm_agent import LlmAgent +from ..agents.llm_agent import ToolUnion +from ..agents.run_config import RunConfig +from ..agents.run_config import StreamingMode +from ..apps.app import App +from ..artifacts.base_artifact_service import ArtifactVersion +from ..artifacts.base_artifact_service import BaseArtifactService +from ..auth.credential_service.base_credential_service import BaseCredentialService +from ..errors.already_exists_error import AlreadyExistsError +from ..errors.input_validation_error import InputValidationError +from ..errors.not_found_error import NotFoundError +from ..errors.session_not_found_error import SessionNotFoundError +from ..evaluation.base_eval_service import InferenceConfig +from ..evaluation.base_eval_service import InferenceRequest +from ..evaluation.constants import MISSING_EVAL_DEPENDENCIES_MESSAGE +from ..evaluation.eval_case import EvalCase +from ..evaluation.eval_case import SessionInput +from ..evaluation.eval_metrics import EvalMetric +from ..evaluation.eval_metrics import EvalMetricResult +from ..evaluation.eval_metrics import EvalMetricResultPerInvocation +from ..evaluation.eval_metrics import EvalStatus +from ..evaluation.eval_metrics import MetricInfo +from ..evaluation.eval_result import EvalSetResult +from ..evaluation.eval_set import EvalSet +from ..evaluation.eval_set_results_manager import EvalSetResultsManager +from ..evaluation.eval_sets_manager import EvalSetsManager +from ..events.event import Event +from ..memory.base_memory_service import BaseMemoryService +from ..plugins.base_plugin import BasePlugin +from ..runners import Runner +from ..sessions.base_session_service import BaseSessionService +from ..sessions.session import Session +from ..utils.agent_info import AgentInfo +from ..utils.agent_info import get_agents_dict +from ..utils.context_utils import Aclosing +from ..utils.feature_decorator import experimental +from ..version import __version__ +from .cli_eval import EVAL_SESSION_ID_PREFIX +from .utils import cleanup +from .utils import common +from .utils import envs +from .utils import evals +from .utils.base_agent_loader import BaseAgentLoader +from .utils.shared_value import SharedValue +from .utils.state import create_empty_state logger = logging.getLogger("google_adk." + __name__) +_EVAL_SET_FILE_EXTENSION = ".evalset.json" -@deprecated( - "AdkWebServer is deprecated and has been refactored into ApiServer and" - " DevServer. Use DevServer instead." -) -class AdkWebServer(DevServer): - """Deprecated wrapper class around DevServer for backward compatibility.""" +TAG_DEBUG = "Debug" +TAG_EVALUATION = "Evaluation" - pass +_REGEX_PREFIX = "regex:" + + +def _parse_cors_origins( + allow_origins: list[str], +) -> tuple[list[str], Optional[str]]: + """Parse allow_origins into literal origins and a combined regex pattern. + + Args: + allow_origins: List of origin strings. Entries prefixed with 'regex:' are + treated as regex patterns; all others are treated as literal origins. + + Returns: + A tuple of (literal_origins, combined_regex) where combined_regex is None + if no regex patterns were provided, or a single pattern joining all regex + patterns with '|'. + """ + literal_origins = [] + regex_patterns = [] + for origin in allow_origins: + if origin.startswith(_REGEX_PREFIX): + pattern = origin[len(_REGEX_PREFIX) :] + if pattern: + regex_patterns.append(pattern) + else: + literal_origins.append(origin) + + combined_regex = "|".join(regex_patterns) if regex_patterns else None + return literal_origins, combined_regex + + +def _is_origin_allowed( + origin: str, + allowed_literal_origins: list[str], + allowed_origin_regex: Optional[re.Pattern[str]], +) -> bool: + """Check whether the given origin matches the allowed origins.""" + if "*" in allowed_literal_origins: + return True + if origin in allowed_literal_origins: + return True + if allowed_origin_regex is not None: + return allowed_origin_regex.fullmatch(origin) is not None + return False + + +def _normalize_origin_scheme(scheme: str) -> str: + """Normalize request schemes to the browser Origin scheme space.""" + if scheme == "ws": + return "http" + if scheme == "wss": + return "https" + return scheme + + +def _strip_optional_quotes(value: str) -> str: + """Strip a single pair of wrapping quotes from a header value.""" + if len(value) >= 2 and value[0] == '"' and value[-1] == '"': + return value[1:-1] + return value + + +def _get_scope_header( + scope: dict[str, Any], header_name: bytes +) -> Optional[str]: + """Return the first matching header value from an ASGI scope.""" + for candidate_name, candidate_value in scope.get("headers", []): + if candidate_name == header_name: + return candidate_value.decode("latin-1").split(",", 1)[0].strip() + return None + + +def _get_request_origin(scope: dict[str, Any]) -> Optional[str]: + """Compute the effective origin for the current HTTP/WebSocket request.""" + forwarded = _get_scope_header(scope, b"forwarded") + if forwarded is not None: + proto = None + host = None + for element in forwarded.split(",", 1)[0].split(";"): + if "=" not in element: + continue + name, value = element.split("=", 1) + if name.strip().lower() == "proto": + proto = _strip_optional_quotes(value.strip()) + elif name.strip().lower() == "host": + host = _strip_optional_quotes(value.strip()) + if proto is not None and host is not None: + return f"{_normalize_origin_scheme(proto)}://{host}" + + host = _get_scope_header(scope, b"x-forwarded-host") + if host is None: + host = _get_scope_header(scope, b"host") + if host is None: + return None + + proto = _get_scope_header(scope, b"x-forwarded-proto") + if proto is None: + proto = scope.get("scheme", "http") + return f"{_normalize_origin_scheme(proto)}://{host}" + + +def _is_request_origin_allowed( + origin: str, + scope: dict[str, Any], + allowed_literal_origins: list[str], + allowed_origin_regex: Optional[re.Pattern[str]], + has_configured_allowed_origins: bool, +) -> bool: + """Validate an Origin header against explicit config or same-origin.""" + if has_configured_allowed_origins and _is_origin_allowed( + origin, allowed_literal_origins, allowed_origin_regex + ): + return True + + request_origin = _get_request_origin(scope) + if request_origin is None: + return False + return origin == request_origin + + +_SAFE_HTTP_METHODS = frozenset({"GET", "HEAD", "OPTIONS"}) + + +class _OriginCheckMiddleware: + """ASGI middleware that blocks cross-origin state-changing requests.""" + + def __init__( + self, + app: Any, + has_configured_allowed_origins: bool, + allowed_origins: list[str], + allowed_origin_regex: Optional[re.Pattern[str]], + ) -> None: + self._app = app + self._has_configured_allowed_origins = has_configured_allowed_origins + self._allowed_origins = allowed_origins + self._allowed_origin_regex = allowed_origin_regex + + async def __call__( + self, + scope: dict[str, Any], + receive: Any, + send: Any, + ) -> None: + if scope["type"] != "http": + await self._app(scope, receive, send) + return + + method = scope.get("method", "GET") + if method in _SAFE_HTTP_METHODS: + await self._app(scope, receive, send) + return + + origin = _get_scope_header(scope, b"origin") + if origin is None: + await self._app(scope, receive, send) + return + + if _is_request_origin_allowed( + origin, + scope, + self._allowed_origins, + self._allowed_origin_regex, + self._has_configured_allowed_origins, + ): + await self._app(scope, receive, send) + return + + response_body = b"Forbidden: origin not allowed" + await send({ + "type": "http.response.start", + "status": 403, + "headers": [ + (b"content-type", b"text/plain"), + (b"content-length", str(len(response_body)).encode()), + ], + }) + await send({ + "type": "http.response.body", + "body": response_body, + }) + + +class ApiServerSpanExporter(export_lib.SpanExporter): + + def __init__(self, trace_dict): + self.trace_dict = trace_dict + + def export( + self, spans: typing.Sequence[ReadableSpan] + ) -> export_lib.SpanExportResult: + for span in spans: + if ( + span.name == "call_llm" + or span.name == "send_data" + or span.name.startswith("execute_tool") + ): + attributes = dict(span.attributes) + attributes["trace_id"] = span.get_span_context().trace_id + attributes["span_id"] = span.get_span_context().span_id + if attributes.get("gcp.vertex.agent.event_id", None): + self.trace_dict[attributes["gcp.vertex.agent.event_id"]] = attributes + return export_lib.SpanExportResult.SUCCESS + + def force_flush(self, timeout_millis: int = 30000) -> bool: + return True + + +class InMemoryExporter(export_lib.SpanExporter): + + def __init__(self, trace_dict): + super().__init__() + self._spans = [] + self.trace_dict = trace_dict + + @override + def export( + self, spans: typing.Sequence[ReadableSpan] + ) -> export_lib.SpanExportResult: + for span in spans: + trace_id = span.context.trace_id + if span.name == "call_llm": + attributes = dict(span.attributes) + session_id = attributes.get("gcp.vertex.agent.session_id", None) + if session_id: + if session_id not in self.trace_dict: + self.trace_dict[session_id] = [trace_id] + else: + self.trace_dict[session_id] += [trace_id] + self._spans.extend(spans) + return export_lib.SpanExportResult.SUCCESS + + @override + def force_flush(self, timeout_millis: int = 30000) -> bool: + return True + + def get_finished_spans(self, session_id: str): + trace_ids = self.trace_dict.get(session_id, None) + if trace_ids is None or not trace_ids: + return [] + return [x for x in self._spans if x.context.trace_id in trace_ids] + + def clear(self): + self._spans.clear() + + +class RunAgentRequest(common.BaseModel): + app_name: str + user_id: str + session_id: str + new_message: Optional[types.Content] = None + streaming: bool = False + state_delta: Optional[dict[str, Any]] = None + # for long-running function resume requests (e.g., OAuth callback) + function_call_event_id: Optional[str] = None + # for resume long-running functions + invocation_id: Optional[str] = None + + +class CreateSessionRequest(common.BaseModel): + session_id: Optional[str] = Field( + default=None, + description=( + "The ID of the session to create. If not provided, a random session" + " ID will be generated." + ), + ) + state: Optional[dict[str, Any]] = Field( + default=None, description="The initial state of the session." + ) + events: Optional[list[Event]] = Field( + default=None, + description="A list of events to initialize the session with.", + ) + + +class SaveArtifactRequest(common.BaseModel): + """Request payload for saving a new artifact.""" + + filename: str = Field(description="Artifact filename.") + artifact: types.Part = Field( + description="Artifact payload encoded as google.genai.types.Part." + ) + custom_metadata: Optional[dict[str, Any]] = Field( + default=None, + description="Optional metadata to associate with the artifact version.", + ) + + +class AddSessionToEvalSetRequest(common.BaseModel): + eval_id: str + session_id: str + user_id: str + + +class RunEvalRequest(common.BaseModel): + eval_ids: list[str] = Field( + deprecated=True, + default_factory=list, + description="This field is deprecated, use eval_case_ids instead.", + ) + eval_case_ids: list[str] = Field( + default_factory=list, + description=( + "List of eval case ids to evaluate. if empty, then all eval cases in" + " the eval set are run." + ), + ) + eval_metrics: list[EvalMetric] + + +class UpdateMemoryRequest(common.BaseModel): + """Request to add a session to the memory service.""" + + session_id: str + """The ID of the session to add to memory.""" + + +class UpdateSessionRequest(common.BaseModel): + """Request to update session state without running the agent.""" + + state_delta: dict[str, Any] + """The state changes to apply to the session.""" + + +class RunEvalResult(common.BaseModel): + eval_set_file: str + eval_set_id: str + eval_id: str + final_eval_status: EvalStatus + eval_metric_results: list[tuple[EvalMetric, EvalMetricResult]] = Field( + deprecated=True, + default=[], + description=( + "This field is deprecated, use overall_eval_metric_results instead." + ), + ) + overall_eval_metric_results: list[EvalMetricResult] + eval_metric_result_per_invocation: list[EvalMetricResultPerInvocation] + user_id: str + session_id: str + + +class RunEvalResponse(common.BaseModel): + run_eval_results: list[RunEvalResult] + + +class GetEventGraphResult(common.BaseModel): + dot_src: str + + +class CreateEvalSetRequest(common.BaseModel): + eval_set: EvalSet + + +class ListEvalSetsResponse(common.BaseModel): + eval_set_ids: list[str] + + +class EvalResult(EvalSetResult): + """This class has no field intentionally. + + The goal here is to just give a new name to the class to align with the API + endpoint. + """ + + +class ListEvalResultsResponse(common.BaseModel): + eval_result_ids: list[str] + + +class ListMetricsInfoResponse(common.BaseModel): + metrics_info: list[MetricInfo] + + +class AppInfo(common.BaseModel): + name: str + root_agent_name: str + description: str + language: Literal["yaml", "python"] + is_computer_use: bool = False + agents: Optional[dict[str, AgentInfo]] = None + + +class ListAppsResponse(common.BaseModel): + apps: list[AppInfo] + + +def _setup_telemetry( + otel_to_cloud: bool = False, + internal_exporters: Optional[list[SpanProcessor]] = None, +): + # TODO - remove the else branch here once maybe_set_otel_providers is no + # longer experimental. + if otel_to_cloud: + _setup_gcp_telemetry(internal_exporters=internal_exporters) + elif _otel_env_vars_enabled(): + _setup_telemetry_from_env(internal_exporters=internal_exporters) + else: + # Old logic - to be removed when above leaves experimental. + tracer_provider = TracerProvider() + if internal_exporters is not None: + for exporter in internal_exporters: + tracer_provider.add_span_processor(exporter) + trace.set_tracer_provider(tracer_provider=tracer_provider) + + +def _otel_env_vars_enabled() -> bool: + return any([ + os.getenv(endpoint_var) + for endpoint_var in [ + otel_env.OTEL_EXPORTER_OTLP_ENDPOINT, + otel_env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, + otel_env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT, + otel_env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, + ] + ]) + + +def _setup_gcp_telemetry( + internal_exporters: list[SpanProcessor] = None, +): + if typing.TYPE_CHECKING: + from ..telemetry.setup import OTelHooks + + otel_hooks_to_add: list[OTelHooks] = [] + + if internal_exporters: + from ..telemetry.setup import OTelHooks + + # Register ADK-specific exporters in trace provider. + otel_hooks_to_add.append(OTelHooks(span_processors=internal_exporters)) + + import google.auth + + from ..telemetry.google_cloud import get_gcp_exporters + from ..telemetry.google_cloud import get_gcp_resource + from ..telemetry.setup import maybe_set_otel_providers + + credentials, project_id = google.auth.default() + + otel_hooks_to_add.append( + get_gcp_exporters( + # TODO - use trace_to_cloud here as well once otel_to_cloud is no + # longer experimental. + enable_cloud_tracing=True, + # TODO - re-enable metrics once errors during shutdown are fixed. + enable_cloud_metrics=False, + enable_cloud_logging=True, + google_auth=(credentials, project_id), + ) + ) + otel_resource = get_gcp_resource(project_id) + + maybe_set_otel_providers( + otel_hooks_to_setup=otel_hooks_to_add, + otel_resource=otel_resource, + ) + _setup_instrumentation_lib_if_installed() + + +def _setup_telemetry_from_env( + internal_exporters: list[SpanProcessor] = None, +): + from ..telemetry.setup import maybe_set_otel_providers + + otel_hooks_to_add = [] + + if internal_exporters: + from ..telemetry.setup import OTelHooks + + # Register ADK-specific exporters in trace provider. + otel_hooks_to_add.append(OTelHooks(span_processors=internal_exporters)) + + maybe_set_otel_providers(otel_hooks_to_setup=otel_hooks_to_add) + _setup_instrumentation_lib_if_installed() + + +def _setup_instrumentation_lib_if_installed(): + # Set instrumentation to enable emitting OTel data from GenAISDK + # Currently the instrumentation lib is in extras dependencies, make sure to + # warn the user if it's not installed. + try: + from opentelemetry.instrumentation.google_genai import GoogleGenAiSdkInstrumentor + + GoogleGenAiSdkInstrumentor().instrument() + except ImportError: + logger.warning( + "Unable to import GoogleGenAiSdkInstrumentor - some" + " telemetry will be disabled. Make sure to install google-adk[otel-gcp]" + ) + + +class AdkWebServer: + """Helper class for setting up and running the ADK web server on FastAPI. + + You construct this class with all the Services required to run ADK agents and + can then call the get_fast_api_app method to get a FastAPI app instance that + can will use your provided service instances, static assets, and agent loader. + If you pass in a web_assets_dir, the static assets will be served under + /dev-ui in addition to the API endpoints created by default. + + You can add additional API endpoints by modifying the FastAPI app + instance returned by get_fast_api_app as this class exposes the agent runners + and most other bits of state retained during the lifetime of the server. + + Attributes: + agent_loader: An instance of BaseAgentLoader for loading agents. + session_service: An instance of BaseSessionService for managing sessions. + memory_service: An instance of BaseMemoryService for managing memory. + artifact_service: An instance of BaseArtifactService for managing + artifacts. + credential_service: An instance of BaseCredentialService for managing + credentials. + eval_sets_manager: An instance of EvalSetsManager for managing evaluation + sets. + eval_set_results_manager: An instance of EvalSetResultsManager for + managing evaluation set results. + agents_dir: Root directory containing subdirs for agents with those + containing resources (e.g. .env files, eval sets, etc.) for the agents. + extra_plugins: A list of fully qualified names of extra plugins to load. + logo_text: Text to display in the logo of the UI. + logo_image_url: URL of an image to display as logo of the UI. + runners_to_clean: Set of runner names marked for cleanup. + current_app_name_ref: A shared reference to the latest ran app name. + runner_dict: A dict of instantiated runners for each app. + """ + + def __init__( + self, + *, + agent_loader: BaseAgentLoader, + session_service: BaseSessionService, + memory_service: BaseMemoryService, + artifact_service: BaseArtifactService, + credential_service: BaseCredentialService, + eval_sets_manager: EvalSetsManager, + eval_set_results_manager: EvalSetResultsManager, + agents_dir: str, + extra_plugins: Optional[list[str]] = None, + logo_text: Optional[str] = None, + logo_image_url: Optional[str] = None, + url_prefix: Optional[str] = None, + auto_create_session: bool = False, + trigger_sources: Optional[list[str]] = None, + ): + self.agent_loader = agent_loader + self.session_service = session_service + self.memory_service = memory_service + self.artifact_service = artifact_service + self.credential_service = credential_service + self.eval_sets_manager = eval_sets_manager + self.eval_set_results_manager = eval_set_results_manager + self.agents_dir = agents_dir + self.extra_plugins = extra_plugins or [] + self.logo_text = logo_text + self.logo_image_url = logo_image_url + # Internal properties we want to allow being modified from callbacks. + self.runners_to_clean: set[str] = set() + self.current_app_name_ref: SharedValue[str] = SharedValue(value="") + self.runner_dict = {} + self.url_prefix = url_prefix + self.auto_create_session = auto_create_session + self.trigger_sources = trigger_sources + + async def get_runner_async(self, app_name: str) -> Runner: + """Returns the cached runner for the given app.""" + # Handle cleanup + if app_name in self.runners_to_clean: + self.runners_to_clean.remove(app_name) + runner = self.runner_dict.pop(app_name, None) + await cleanup.close_runners(list([runner])) + + # Return cached runner if exists + if app_name in self.runner_dict: + return self.runner_dict[app_name] + + # Create new runner + envs.load_dotenv_for_agent(os.path.basename(app_name), self.agents_dir) + agent_or_app = self.agent_loader.load_agent(app_name) + + # Instantiate extra plugins if configured + extra_plugins_instances = self._instantiate_extra_plugins() + + plugins_yaml_path = os.path.join(self.agents_dir, app_name, "plugins.yaml") + bq_analytics_config = None + if os.path.exists(plugins_yaml_path): + with open(plugins_yaml_path, "r", encoding="utf-8") as f: + plugins_config = yaml.safe_load(f) + if plugins_config and isinstance(plugins_config, dict): + bq_analytics_config = plugins_config.get("bigquery_agent_analytics") + + # All YAML agents are treated as visual builder agents. + is_visual_builder_agent = os.path.exists( + os.path.join(self.agents_dir, app_name, "root_agent.yaml") + ) + + if isinstance(agent_or_app, BaseAgent): + plugins = extra_plugins_instances + + # Handle BigQuery Analytics Plugin injection + if bq_analytics_config and all([ + bq_analytics_config.get("project_id"), + bq_analytics_config.get("dataset_id"), + bq_analytics_config.get("dataset_location"), + ]): + from ..plugins.bigquery_agent_analytics_plugin import BigQueryAgentAnalyticsPlugin + + plugins.append( + BigQueryAgentAnalyticsPlugin( + project_id=bq_analytics_config.get("project_id"), + dataset_id=bq_analytics_config.get("dataset_id"), + table_id=bq_analytics_config.get("table_id"), + location=bq_analytics_config.get("dataset_location"), + ) + ) + + agentic_app = App( + name=app_name, + root_agent=agent_or_app, + plugins=plugins, + ) + else: + # Combine existing plugins with extra plugins + agent_or_app.plugins = agent_or_app.plugins + extra_plugins_instances + agentic_app = agent_or_app + + # If the root agent was loaded from YAML, we treat it as being from Visual Builder + if is_visual_builder_agent: + object.__setattr__(agentic_app, "_is_visual_builder_app", True) + + runner = self._create_runner(agentic_app) + self.runner_dict[app_name] = runner + return runner + + def _get_root_agent(self, agent_or_app: BaseAgent | App) -> BaseAgent: + """Extract root agent from either a BaseAgent or App object.""" + if isinstance(agent_or_app, App): + return agent_or_app.root_agent + return agent_or_app + + def _create_runner(self, agentic_app: App) -> Runner: + """Create a runner with common services.""" + return Runner( + app=agentic_app, + artifact_service=self.artifact_service, + session_service=self.session_service, + memory_service=self.memory_service, + credential_service=self.credential_service, + auto_create_session=self.auto_create_session, + ) + + def _instantiate_extra_plugins(self) -> list[BasePlugin]: + """Instantiate extra plugins from the configured list. + + Returns: + List of instantiated BasePlugin objects. + """ + extra_plugins_instances = [] + for qualified_name in self.extra_plugins: + try: + plugin_obj = self._import_plugin_object(qualified_name) + if isinstance(plugin_obj, BasePlugin): + extra_plugins_instances.append(plugin_obj) + elif issubclass(plugin_obj, BasePlugin): + extra_plugins_instances.append(plugin_obj(name=qualified_name)) + except Exception as e: + logger.error("Failed to load plugin %s: %s", qualified_name, e) + return extra_plugins_instances + + def _import_plugin_object(self, qualified_name: str) -> Any: + """Import a plugin object (class or instance) from a fully qualified name. + + Args: + qualified_name: Fully qualified name (e.g., + 'my_package.my_plugin.MyPlugin') + + Returns: + The imported object, which can be either a class or an instance. + + Raises: + ImportError: If the module cannot be imported. + AttributeError: If the object doesn't exist in the module. + """ + module_name, obj_name = qualified_name.rsplit(".", 1) + module = importlib.import_module(module_name) + return getattr(module, obj_name) + + def _setup_runtime_config(self, web_assets_dir: str): + """Sets up the runtime config for the web server.""" + # Read existing runtime config file. + runtime_config_path = os.path.join( + web_assets_dir, "assets", "config", "runtime-config.json" + ) + runtime_config = {} + try: + with open(runtime_config_path, "r") as f: + runtime_config = json.load(f) + except FileNotFoundError: + logger.info( + "File not found: %s. A new runtime config file will be created.", + runtime_config_path, + ) + except json.JSONDecodeError: + logger.warning( + "Failed to decode JSON from %s. The file content will be" + " overwritten.", + runtime_config_path, + ) + runtime_config["backendUrl"] = self.url_prefix if self.url_prefix else "" + + # Set custom logo config. + if self.logo_text or self.logo_image_url: + if not self.logo_text or not self.logo_image_url: + raise ValueError( + "Both --logo-text and --logo-image-url must be defined when using" + " logo config." + ) + runtime_config["logo"] = { + "text": self.logo_text, + "imageUrl": self.logo_image_url, + } + elif "logo" in runtime_config: + del runtime_config["logo"] + + # Write the runtime config file. + try: + os.makedirs(os.path.dirname(runtime_config_path), exist_ok=True) + with open(runtime_config_path, "w") as f: + json.dump(runtime_config, f, indent=2) + except IOError as e: + logger.error( + "Failed to write runtime config file %s: %s", runtime_config_path, e + ) + + async def _create_session( + self, + *, + app_name: str, + user_id: str, + session_id: Optional[str] = None, + state: Optional[dict[str, Any]] = None, + ) -> Session: + try: + session = await self.session_service.create_session( + app_name=app_name, + user_id=user_id, + state=state, + session_id=session_id, + ) + logger.info("New session created: %s", session.id) + return session + except AlreadyExistsError as e: + raise HTTPException( + status_code=409, detail=f"Session already exists: {session_id}" + ) from e + except Exception as e: + logger.error( + "Internal server error during session creation: %s", e, exc_info=True + ) + raise HTTPException(status_code=500, detail=str(e)) from e + + def get_fast_api_app( + self, + lifespan: Optional[Lifespan[FastAPI]] = None, + allow_origins: Optional[list[str]] = None, + web_assets_dir: Optional[str] = None, + setup_observer: Callable[ + [Observer, "AdkWebServer"], None + ] = lambda o, s: None, + tear_down_observer: Callable[ + [Observer, "AdkWebServer"], None + ] = lambda o, s: None, + register_processors: Callable[[TracerProvider], None] = lambda o: None, + otel_to_cloud: bool = False, + with_ui: bool = False, + ): + """Creates a FastAPI app for the ADK web server. + + By default it'll just return a FastAPI instance with the API server + endpoints, + but if you specify a web_assets_dir, it'll also serve the static web assets + from that directory. + + Args: + lifespan: The lifespan of the FastAPI app. + allow_origins: The origins that are allowed to make cross-origin requests. + Entries can be literal origins (e.g., 'https://example.com') or regex + patterns prefixed with 'regex:' (e.g., + 'regex:https://.*\\.example\\.com'). + web_assets_dir: The directory containing the web assets to serve. + setup_observer: Callback for setting up the file system observer. + tear_down_observer: Callback for cleaning up the file system observer. + register_processors: Callback for additional Span processors to be added + to the TracerProvider. + otel_to_cloud: Whether to enable Cloud Trace and Cloud Logging + integrations. + + Returns: + A FastAPI app instance. + """ + # Properties we don't need to modify from callbacks + trace_dict = {} + session_trace_dict = {} + # Set up a file system watcher to detect changes in the agents directory. + observer = Observer() + setup_observer(observer, self) + + @asynccontextmanager + async def internal_lifespan(app: FastAPI): + try: + if lifespan: + async with lifespan(app) as lifespan_context: + yield lifespan_context + else: + yield + finally: + tear_down_observer(observer, self) + # Create tasks for all runner closures to run concurrently + await cleanup.close_runners(list(self.runner_dict.values())) + + memory_exporter = InMemoryExporter(session_trace_dict) + + _setup_telemetry( + otel_to_cloud=otel_to_cloud, + internal_exporters=[ + export_lib.SimpleSpanProcessor(ApiServerSpanExporter(trace_dict)), + export_lib.SimpleSpanProcessor(memory_exporter), + ], + ) + if web_assets_dir: + self._setup_runtime_config(web_assets_dir) + + # TODO - register_processors to be removed once --otel_to_cloud is no + # longer experimental. + tracer_provider = trace.get_tracer_provider() + register_processors(tracer_provider) + + # Run the FastAPI server. + app = FastAPI(lifespan=internal_lifespan) + + has_configured_allowed_origins = bool(allow_origins) + if allow_origins: + literal_origins, combined_regex = _parse_cors_origins(allow_origins) + compiled_origin_regex = ( + re.compile(combined_regex) if combined_regex is not None else None + ) + app.add_middleware( + CORSMiddleware, + allow_origins=literal_origins, + allow_origin_regex=combined_regex, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + else: + literal_origins = [] + compiled_origin_regex = None + + app.add_middleware( + _OriginCheckMiddleware, + has_configured_allowed_origins=has_configured_allowed_origins, + allowed_origins=literal_origins, + allowed_origin_regex=compiled_origin_regex, + ) + + @app.get("/health") + async def health() -> dict[str, str]: + return {"status": "ok"} + + @app.get("/version") + async def version() -> dict[str, str]: + return { + "version": __version__, + "language": "python", + "language_version": ( + f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}" + ), + } + + @app.get("/list-apps") + async def list_apps( + detailed: bool = Query( + default=False, description="Return detailed app information" + ) + ) -> list[str] | ListAppsResponse: + if detailed: + apps_info = self.agent_loader.list_agents_detailed() + return ListAppsResponse(apps=[AppInfo(**app) for app in apps_info]) + return self.agent_loader.list_agents() + + @experimental + @app.get("/apps/{app_name}/app-info", response_model_exclude_none=True) + async def get_adk_app_info(app_name: str) -> AppInfo: + """Returns the detailed info for a given ADK app.""" + agent_or_app = self.agent_loader.load_agent(app_name) + root_agent = self._get_root_agent(agent_or_app) + if isinstance(root_agent, LlmAgent): + return AppInfo( + name=app_name, + root_agent_name=root_agent.name, + description=root_agent.description, + language="python", + agents=get_agents_dict(root_agent), + ) + else: + raise HTTPException( + status_code=400, detail="Root agent is not an LlmAgent" + ) + + @app.get("/debug/trace/{event_id}", tags=[TAG_DEBUG]) + async def get_trace_dict(event_id: str) -> Any: + event_dict = trace_dict.get(event_id, None) + if event_dict is None: + raise HTTPException(status_code=404, detail="Trace not found") + return event_dict + + if web_assets_dir: + + @app.get("/dev/build_graph/{app_name}") + async def get_app_info(app_name: str) -> Any: + runner = await self.get_runner_async(app_name) + + if not runner.app: + raise HTTPException( + status_code=404, detail=f"App not found: {app_name}" + ) + + def serialize_agent(agent: BaseAgent) -> dict[str, Any]: + """Recursively serialize an agent, excluding non-serializable fields.""" + agent_dict = {} + + for field_name, field_info in agent.__class__.model_fields.items(): + # Skip non-serializable fields + if field_name in [ + "parent_agent", + "before_agent_callback", + "after_agent_callback", + "before_model_callback", + "after_model_callback", + "on_model_error_callback", + "before_tool_callback", + "after_tool_callback", + "on_tool_error_callback", + ]: + continue + + value = getattr(agent, field_name, None) + + # Handle sub_agents recursively + if field_name == "sub_agents" and value: + agent_dict[field_name] = [ + serialize_agent(sub_agent) for sub_agent in value + ] + elif value is None or field_name == "tools": + continue + else: + try: + if isinstance(value, (str, int, float, bool, list, dict)): + agent_dict[field_name] = value + elif hasattr(value, "model_dump"): + agent_dict[field_name] = value.model_dump( + mode="python", exclude_none=True + ) + else: + agent_dict[field_name] = str(value) + except Exception: + pass + + return agent_dict + + app_info = { + "name": runner.app.name, + "root_agent": serialize_agent(runner.app.root_agent), + } + + # Add optional fields if present + if runner.app.plugins: + app_info["plugins"] = [ + {"name": getattr(plugin, "name", type(plugin).__name__)} + for plugin in runner.app.plugins + ] + + if runner.app.context_cache_config: + try: + app_info["context_cache_config"] = ( + runner.app.context_cache_config.model_dump( + mode="python", exclude_none=True + ) + ) + except Exception: + pass + + if runner.app.resumability_config: + try: + app_info["resumability_config"] = ( + runner.app.resumability_config.model_dump( + mode="python", exclude_none=True + ) + ) + except Exception: + pass + + return app_info + + @app.get("/debug/trace/session/{session_id}", tags=[TAG_DEBUG]) + async def get_session_trace(session_id: str) -> Any: + spans = memory_exporter.get_finished_spans(session_id) + if not spans: + return [] + return [ + { + "name": s.name, + "span_id": s.context.span_id, + "trace_id": s.context.trace_id, + "start_time": s.start_time, + "end_time": s.end_time, + "attributes": dict(s.attributes), + "parent_span_id": s.parent.span_id if s.parent else None, + } + for s in spans + ] + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}", + response_model_exclude_none=True, + ) + async def get_session( + app_name: str, user_id: str, session_id: str + ) -> Session: + session = await self.session_service.get_session( + app_name=app_name, user_id=user_id, session_id=session_id + ) + if not session: + raise HTTPException(status_code=404, detail="Session not found") + self.current_app_name_ref.value = app_name + return session + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions", + response_model_exclude_none=True, + ) + async def list_sessions(app_name: str, user_id: str) -> list[Session]: + list_sessions_response = await self.session_service.list_sessions( + app_name=app_name, user_id=user_id + ) + return [ + session + for session in list_sessions_response.sessions + # Remove sessions that were generated as a part of Eval. + if not session.id.startswith(EVAL_SESSION_ID_PREFIX) + ] + + @deprecated( + "Please use create_session instead. This will be removed in future" + " releases." + ) + @app.post( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}", + response_model_exclude_none=True, + ) + async def create_session_with_id( + app_name: str, + user_id: str, + session_id: str, + state: Optional[dict[str, Any]] = None, + ) -> Session: + return await self._create_session( + app_name=app_name, + user_id=user_id, + state=state, + session_id=session_id, + ) + + @app.post( + "/apps/{app_name}/users/{user_id}/sessions", + response_model_exclude_none=True, + ) + async def create_session( + app_name: str, + user_id: str, + req: Optional[CreateSessionRequest] = None, + ) -> Session: + if not req: + return await self._create_session(app_name=app_name, user_id=user_id) + + session = await self._create_session( + app_name=app_name, + user_id=user_id, + state=req.state, + session_id=req.session_id, + ) + + if req.events: + for event in req.events: + await self.session_service.append_event(session=session, event=event) + + return session + + @app.delete("/apps/{app_name}/users/{user_id}/sessions/{session_id}") + async def delete_session( + app_name: str, user_id: str, session_id: str + ) -> None: + await self.session_service.delete_session( + app_name=app_name, user_id=user_id, session_id=session_id + ) + + @app.patch( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}", + response_model_exclude_none=True, + ) + async def update_session( + app_name: str, + user_id: str, + session_id: str, + req: UpdateSessionRequest, + ) -> Session: + """Updates session state without running the agent. + + Args: + app_name: The name of the application. + user_id: The ID of the user. + session_id: The ID of the session to update. + req: The patch request containing state changes. + + Returns: + The updated session. + + Raises: + HTTPException: If the session is not found. + """ + session = await self.session_service.get_session( + app_name=app_name, user_id=user_id, session_id=session_id + ) + if not session: + raise HTTPException(status_code=404, detail="Session not found") + + # Create an event to record the state change + import uuid + + from ..events.event import Event + from ..events.event import EventActions + + state_update_event = Event( + invocation_id="p-" + str(uuid.uuid4()), + author="user", + actions=EventActions(state_delta=req.state_delta), + ) + + # Append the event to the session + # This will automatically update the session state through __update_session_state + await self.session_service.append_event( + session=session, event=state_update_event + ) + + return session + + @app.post( + "/apps/{app_name}/eval-sets", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def create_eval_set( + app_name: str, create_eval_set_request: CreateEvalSetRequest + ) -> EvalSet: + try: + return self.eval_sets_manager.create_eval_set( + app_name=app_name, + eval_set_id=create_eval_set_request.eval_set.eval_set_id, + ) + except ValueError as ve: + raise HTTPException( + status_code=400, + detail=str(ve), + ) from ve + + # TODO - remove after migration + @deprecated( + "Please use create_eval_set instead. This will be removed in future" + " releases." + ) + @app.post( + "/apps/{app_name}/eval_sets/{eval_set_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def create_eval_set_legacy( + app_name: str, + eval_set_id: str, + ): + """Creates an eval set, given the id.""" + await create_eval_set( + app_name=app_name, + create_eval_set_request=CreateEvalSetRequest( + eval_set=EvalSet(eval_set_id=eval_set_id, eval_cases=[]) + ), + ) + + # TODO - remove after migration + @deprecated( + "Please use list_eval_sets instead. This will be removed in future" + " releases." + ) + @app.get( + "/apps/{app_name}/eval_sets", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_eval_sets_legacy(app_name: str) -> list[str]: + list_eval_sets_response = await list_eval_sets(app_name) + return list_eval_sets_response.eval_set_ids + + # TODO - remove after migration + @deprecated( + "Please use run_eval instead. This will be removed in future releases." + ) + @app.post( + "/apps/{app_name}/eval_sets/{eval_set_id}/run_eval", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def run_eval_legacy( + app_name: str, eval_set_id: str, req: RunEvalRequest + ) -> list[RunEvalResult]: + run_eval_response = await run_eval( + app_name=app_name, eval_set_id=eval_set_id, req=req + ) + return run_eval_response.run_eval_results + + # TODO - remove after migration + @deprecated( + "Please use get_eval_result instead. This will be removed in future" + " releases." + ) + @app.get( + "/apps/{app_name}/eval_results/{eval_result_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def get_eval_result_legacy( + app_name: str, + eval_result_id: str, + ) -> EvalSetResult: + try: + return self.eval_set_results_manager.get_eval_set_result( + app_name, eval_result_id + ) + except ValueError as ve: + raise HTTPException(status_code=404, detail=str(ve)) from ve + except ValidationError as ve: + raise HTTPException(status_code=500, detail=str(ve)) from ve + + # TODO - remove after migration + @deprecated( + "Please use list_eval_results instead. This will be removed in future" + " releases." + ) + @app.get( + "/apps/{app_name}/eval_results", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_eval_results_legacy(app_name: str) -> list[str]: + list_eval_results_response = await list_eval_results(app_name) + return list_eval_results_response.eval_result_ids + + @app.get( + "/apps/{app_name}/eval-sets", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_eval_sets(app_name: str) -> ListEvalSetsResponse: + """Lists all eval sets for the given app.""" + eval_sets = [] + try: + eval_sets = self.eval_sets_manager.list_eval_sets(app_name) + except NotFoundError as e: + logger.warning(e) + + return ListEvalSetsResponse(eval_set_ids=eval_sets) + + @app.post( + "/apps/{app_name}/eval-sets/{eval_set_id}/add-session", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + @app.post( + "/apps/{app_name}/eval_sets/{eval_set_id}/add_session", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def add_session_to_eval_set( + app_name: str, eval_set_id: str, req: AddSessionToEvalSetRequest + ): + # Get the session + session = await self.session_service.get_session( + app_name=app_name, user_id=req.user_id, session_id=req.session_id + ) + assert session, "Session not found." + + # Convert the session data to eval invocations + invocations = evals.convert_session_to_eval_invocations(session) + + # Populate the session with initial session state. + agent_or_app = self.agent_loader.load_agent(app_name) + root_agent = self._get_root_agent(agent_or_app) + initial_session_state = create_empty_state(root_agent) + + new_eval_case = EvalCase( + eval_id=req.eval_id, + conversation=invocations, + session_input=SessionInput( + app_name=app_name, + user_id=req.user_id, + state=initial_session_state, + ), + creation_timestamp=time.time(), + ) + + try: + self.eval_sets_manager.add_eval_case( + app_name, eval_set_id, new_eval_case + ) + except ValueError as ve: + raise HTTPException(status_code=400, detail=str(ve)) from ve + + @app.get( + "/apps/{app_name}/eval_sets/{eval_set_id}/evals", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_evals_in_eval_set( + app_name: str, + eval_set_id: str, + ) -> list[str]: + """Lists all evals in an eval set.""" + eval_set_data = self.eval_sets_manager.get_eval_set(app_name, eval_set_id) + + if not eval_set_data: + raise HTTPException( + status_code=400, detail=f"Eval set `{eval_set_id}` not found." + ) + + return sorted([x.eval_id for x in eval_set_data.eval_cases]) + + @app.get( + "/apps/{app_name}/eval-sets/{eval_set_id}/eval-cases/{eval_case_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + @app.get( + "/apps/{app_name}/eval_sets/{eval_set_id}/evals/{eval_case_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def get_eval( + app_name: str, eval_set_id: str, eval_case_id: str + ) -> EvalCase: + """Gets an eval case in an eval set.""" + eval_case_to_find = self.eval_sets_manager.get_eval_case( + app_name, eval_set_id, eval_case_id + ) + + if eval_case_to_find: + return eval_case_to_find + + raise HTTPException( + status_code=404, + detail=( + f"Eval set `{eval_set_id}` or Eval `{eval_case_id}` not found." + ), + ) + + @app.put( + "/apps/{app_name}/eval-sets/{eval_set_id}/eval-cases/{eval_case_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + @app.put( + "/apps/{app_name}/eval_sets/{eval_set_id}/evals/{eval_case_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def update_eval( + app_name: str, + eval_set_id: str, + eval_case_id: str, + updated_eval_case: EvalCase, + ): + if ( + updated_eval_case.eval_id + and updated_eval_case.eval_id != eval_case_id + ): + raise HTTPException( + status_code=400, + detail=( + "Eval id in EvalCase should match the eval id in the API route." + ), + ) + + # Overwrite the value. We are either overwriting the same value or an empty + # field. + updated_eval_case.eval_id = eval_case_id + try: + self.eval_sets_manager.update_eval_case( + app_name, eval_set_id, updated_eval_case + ) + except NotFoundError as nfe: + raise HTTPException(status_code=404, detail=str(nfe)) from nfe + + @app.delete( + "/apps/{app_name}/eval-sets/{eval_set_id}/eval-cases/{eval_case_id}", + tags=[TAG_EVALUATION], + ) + @app.delete( + "/apps/{app_name}/eval_sets/{eval_set_id}/evals/{eval_case_id}", + tags=[TAG_EVALUATION], + ) + async def delete_eval( + app_name: str, eval_set_id: str, eval_case_id: str + ) -> None: + try: + self.eval_sets_manager.delete_eval_case( + app_name, eval_set_id, eval_case_id + ) + except NotFoundError as nfe: + raise HTTPException(status_code=404, detail=str(nfe)) from nfe + + @app.post( + "/apps/{app_name}/eval-sets/{eval_set_id}/run", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def run_eval( + app_name: str, eval_set_id: str, req: RunEvalRequest + ) -> RunEvalResponse: + """Runs an eval given the details in the eval request.""" + # Create a mapping from eval set file to all the evals that needed to be + # run. + try: + from ..evaluation.local_eval_service import LocalEvalService + from .cli_eval import _collect_eval_results + from .cli_eval import _collect_inferences + + eval_set = self.eval_sets_manager.get_eval_set(app_name, eval_set_id) + + if not eval_set: + raise HTTPException( + status_code=400, detail=f"Eval set `{eval_set_id}` not found." + ) + + agent_or_app = self.agent_loader.load_agent(app_name) + root_agent = self._get_root_agent(agent_or_app) + + eval_case_results = [] + + eval_service = LocalEvalService( + root_agent=root_agent, + eval_sets_manager=self.eval_sets_manager, + eval_set_results_manager=self.eval_set_results_manager, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + inference_request = InferenceRequest( + app_name=app_name, + eval_set_id=eval_set.eval_set_id, + eval_case_ids=req.eval_case_ids or req.eval_ids, + inference_config=InferenceConfig(), + ) + inference_results = await _collect_inferences( + inference_requests=[inference_request], eval_service=eval_service + ) + + eval_case_results = await _collect_eval_results( + inference_results=inference_results, + eval_service=eval_service, + eval_metrics=req.eval_metrics, + ) + except ModuleNotFoundError as e: + logger.exception("%s", e) + raise HTTPException( + status_code=400, detail=MISSING_EVAL_DEPENDENCIES_MESSAGE + ) from e + + run_eval_results = [] + for eval_case_result in eval_case_results: + run_eval_results.append( + RunEvalResult( + eval_set_file=eval_case_result.eval_set_file, + eval_set_id=eval_set_id, + eval_id=eval_case_result.eval_id, + final_eval_status=eval_case_result.final_eval_status, + overall_eval_metric_results=eval_case_result.overall_eval_metric_results, + eval_metric_result_per_invocation=eval_case_result.eval_metric_result_per_invocation, + user_id=eval_case_result.user_id, + session_id=eval_case_result.session_id, + ) + ) + + return RunEvalResponse(run_eval_results=run_eval_results) + + @app.get( + "/apps/{app_name}/eval-results/{eval_result_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def get_eval_result( + app_name: str, + eval_result_id: str, + ) -> EvalResult: + """Gets the eval result for the given eval id.""" + try: + eval_set_result = self.eval_set_results_manager.get_eval_set_result( + app_name, eval_result_id + ) + return EvalResult(**eval_set_result.model_dump()) + except ValueError as ve: + raise HTTPException(status_code=404, detail=str(ve)) from ve + except ValidationError as ve: + raise HTTPException(status_code=500, detail=str(ve)) from ve + + @app.get( + "/apps/{app_name}/eval-results", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_eval_results(app_name: str) -> ListEvalResultsResponse: + """Lists all eval results for the given app.""" + eval_result_ids = self.eval_set_results_manager.list_eval_set_results( + app_name + ) + return ListEvalResultsResponse(eval_result_ids=eval_result_ids) + + @app.get( + "/apps/{app_name}/metrics-info", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_metrics_info(app_name: str) -> ListMetricsInfoResponse: + """Lists all eval metrics for the given app.""" + try: + from ..evaluation.metric_evaluator_registry import DEFAULT_METRIC_EVALUATOR_REGISTRY + + # Right now we ignore the app_name as eval metrics are not tied to the + # app_name, but they could be moving forward. + metrics_info = ( + DEFAULT_METRIC_EVALUATOR_REGISTRY.get_registered_metrics() + ) + return ListMetricsInfoResponse(metrics_info=metrics_info) + except ModuleNotFoundError as e: + logger.exception("%s\n%s", MISSING_EVAL_DEPENDENCIES_MESSAGE, e) + raise HTTPException( + status_code=400, detail=MISSING_EVAL_DEPENDENCIES_MESSAGE + ) from e + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}", + response_model_exclude_none=True, + ) + async def load_artifact( + app_name: str, + user_id: str, + session_id: str, + artifact_name: str, + version: Optional[int] = Query(None), + ) -> Optional[types.Part]: + artifact = await self.artifact_service.load_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=artifact_name, + version=version, + ) + if not artifact: + raise HTTPException(status_code=404, detail="Artifact not found") + return artifact + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/metadata", + response_model=list[ArtifactVersion], + response_model_exclude_none=True, + ) + async def list_artifact_versions_metadata( + app_name: str, + user_id: str, + session_id: str, + artifact_name: str, + ) -> list[ArtifactVersion]: + return await self.artifact_service.list_artifact_versions( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=artifact_name, + ) + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/{version_id}", + response_model_exclude_none=True, + ) + async def load_artifact_version( + app_name: str, + user_id: str, + session_id: str, + artifact_name: str, + version_id: int, + ) -> Optional[types.Part]: + artifact = await self.artifact_service.load_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=artifact_name, + version=version_id, + ) + if not artifact: + raise HTTPException(status_code=404, detail="Artifact not found") + return artifact + + @app.post( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts", + response_model=ArtifactVersion, + response_model_exclude_none=True, + ) + async def save_artifact( + app_name: str, + user_id: str, + session_id: str, + req: SaveArtifactRequest, + ) -> ArtifactVersion: + try: + version = await self.artifact_service.save_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=req.filename, + artifact=req.artifact, + custom_metadata=req.custom_metadata, + ) + except InputValidationError as ive: + raise HTTPException(status_code=400, detail=str(ive)) from ive + except Exception as exc: # pylint: disable=broad-exception-caught + logger.error( + "Internal error while saving artifact %s for app=%s user=%s" + " session=%s: %s", + req.filename, + app_name, + user_id, + session_id, + exc, + exc_info=True, + ) + raise HTTPException(status_code=500, detail=str(exc)) from exc + artifact_version = await self.artifact_service.get_artifact_version( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=req.filename, + version=version, + ) + if artifact_version is None: + raise HTTPException( + status_code=500, detail="Artifact metadata unavailable" + ) + return artifact_version + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/{version_id}/metadata", + response_model=ArtifactVersion, + response_model_exclude_none=True, + ) + async def get_artifact_version_metadata( + app_name: str, + user_id: str, + session_id: str, + artifact_name: str, + version_id: int, + ) -> ArtifactVersion: + artifact_version = await self.artifact_service.get_artifact_version( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=artifact_name, + version=version_id, + ) + if not artifact_version: + raise HTTPException( + status_code=404, detail="Artifact version not found" + ) + return artifact_version + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts", + response_model_exclude_none=True, + ) + async def list_artifact_names( + app_name: str, user_id: str, session_id: str + ) -> list[str]: + return await self.artifact_service.list_artifact_keys( + app_name=app_name, user_id=user_id, session_id=session_id + ) + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions", + response_model_exclude_none=True, + ) + async def list_artifact_versions( + app_name: str, user_id: str, session_id: str, artifact_name: str + ) -> list[int]: + return await self.artifact_service.list_versions( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=artifact_name, + ) + + @app.delete( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}", + ) + async def delete_artifact( + app_name: str, user_id: str, session_id: str, artifact_name: str + ) -> None: + await self.artifact_service.delete_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=artifact_name, + ) + + @app.patch("/apps/{app_name}/users/{user_id}/memory") + async def patch_memory( + app_name: str, user_id: str, update_memory_request: UpdateMemoryRequest + ) -> None: + """Adds all events from a given session to the memory service. + + Args: + app_name: The name of the application. + user_id: The ID of the user. + update_memory_request: The memory request for the update + + Raises: + HTTPException: If the memory service is not configured or the request + is invalid. + """ + if not self.memory_service: + raise HTTPException( + status_code=400, detail="Memory service is not configured." + ) + if ( + update_memory_request is None + or update_memory_request.session_id is None + ): + raise HTTPException( + status_code=400, detail="Update memory request is invalid." + ) + + session = await self.session_service.get_session( + app_name=app_name, + user_id=user_id, + session_id=update_memory_request.session_id, + ) + if not session: + raise HTTPException(status_code=404, detail="Session not found") + await self.memory_service.add_session_to_memory(session) + + def _set_telemetry_context_if_needed(runner: Runner): + """Helper to set contextvars for the current request task.""" + app = getattr(runner, "app", None) + from ..utils._telemetry_context import _is_visual_builder + + if app and getattr(app, "_is_visual_builder_app", False): + _is_visual_builder.set(True) + else: + _is_visual_builder.set(False) + + @app.post("/run", response_model_exclude_none=True) + async def run_agent(req: RunAgentRequest) -> list[Event]: + self.current_app_name_ref.value = req.app_name + runner = await self.get_runner_async(req.app_name) + _set_telemetry_context_if_needed(runner) + try: + async with Aclosing( + runner.run_async( + user_id=req.user_id, + session_id=req.session_id, + new_message=req.new_message, + state_delta=req.state_delta, + invocation_id=req.invocation_id, + ) + ) as agen: + events = [event async for event in agen] + except SessionNotFoundError as e: + raise HTTPException(status_code=404, detail=str(e)) from e + logger.info("Generated %s events in agent run", len(events)) + logger.debug("Events generated: %s", events) + return events + + @app.post("/run_sse") + async def run_agent_sse(req: RunAgentRequest) -> StreamingResponse: + self.current_app_name_ref.value = req.app_name + stream_mode = StreamingMode.SSE if req.streaming else StreamingMode.NONE + runner = await self.get_runner_async(req.app_name) + _set_telemetry_context_if_needed(runner) + + # Validate session existence before starting the stream. + # We check directly here instead of eagerly advancing the + # runner's async generator with anext(), because splitting + # generator consumption across two asyncio Tasks (request + # handler vs StreamingResponse) breaks OpenTelemetry context + # detachment. + if not runner.auto_create_session: + session = await self.session_service.get_session( + app_name=req.app_name, + user_id=req.user_id, + session_id=req.session_id, + ) + if not session: + raise HTTPException( + status_code=404, + detail=f"Session not found: {req.session_id}", + ) + + # Convert the events to properly formatted SSE + async def event_generator(): + async with Aclosing( + runner.run_async( + user_id=req.user_id, + session_id=req.session_id, + new_message=req.new_message, + state_delta=req.state_delta, + run_config=RunConfig(streaming_mode=stream_mode), + invocation_id=req.invocation_id, + ) + ) as agen: + try: + async for event in agen: + # ADK Web renders artifacts from `actions.artifactDelta` + # during part processing *and* during action processing + # 1) the original event with `artifactDelta` cleared (content) + # 2) a content-less "action-only" event carrying `artifactDelta` + events_to_stream = [event] + if ( + not req.function_call_event_id + and event.actions.artifact_delta + and event.content + and event.content.parts + ): + content_event = event.model_copy(deep=True) + content_event.actions.artifact_delta = {} + artifact_event = event.model_copy(deep=True) + artifact_event.content = None + events_to_stream = [content_event, artifact_event] + + for event_to_stream in events_to_stream: + sse_event = event_to_stream.model_dump_json( + exclude_none=True, + by_alias=True, + ) + logger.debug( + "Generated event in agent run streaming: %s", sse_event + ) + yield f"data: {sse_event}\n\n" + except Exception as e: + logger.exception("Error in event_generator: %s", e) + yield f"data: {json.dumps({'error': str(e)})}\n\n" + + # Returns a streaming response with the proper media type for SSE + return StreamingResponse( + event_generator(), + media_type="text/event-stream", + ) + + @app.get( + "/dev/{app_name}/graph", + response_model_exclude_none=True, + tags=[TAG_DEBUG], + ) + async def get_app_graph_dot( + app_name: str, dark_mode: bool = False + ) -> GetEventGraphResult | dict: + """Returns the base agent graph in DOT format without any highlights. + + This endpoint allows the frontend to fetch the graph structure once + and compute highlights client-side for better performance. + + Args: + app_name: The name of the agent/app + dark_mode: Whether to use dark theme background color + """ + agent_or_app = self.agent_loader.load_agent(app_name) + root_agent = self._get_root_agent(agent_or_app) + + # Get graph with NO highlights (empty list) and specified theme + dot_graph = await agent_graph.get_agent_graph( + root_agent, [], dark_mode=dark_mode + ) + + if dot_graph and isinstance(dot_graph, graphviz.Digraph): + return GetEventGraphResult(dot_src=dot_graph.source) + else: + return {} + + # TODO: This endpoint can be removed once we update adk web to stop consuming it + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/events/{event_id}/graph", + response_model_exclude_none=True, + tags=[TAG_DEBUG], + ) + async def get_event_graph( + app_name: str, user_id: str, session_id: str, event_id: str + ): + session = await self.session_service.get_session( + app_name=app_name, user_id=user_id, session_id=session_id + ) + session_events = session.events if session else [] + event = next((x for x in session_events if x.id == event_id), None) + if not event: + return {} + + function_calls = event.get_function_calls() + function_responses = event.get_function_responses() + agent_or_app = self.agent_loader.load_agent(app_name) + root_agent = self._get_root_agent(agent_or_app) + dot_graph = None + if function_calls: + function_call_highlights = [] + for function_call in function_calls: + from_name = event.author + to_name = function_call.name + function_call_highlights.append((from_name, to_name)) + dot_graph = await agent_graph.get_agent_graph( + root_agent, function_call_highlights + ) + elif function_responses: + function_responses_highlights = [] + for function_response in function_responses: + from_name = function_response.name + to_name = event.author + function_responses_highlights.append((from_name, to_name)) + dot_graph = await agent_graph.get_agent_graph( + root_agent, function_responses_highlights + ) + else: + from_name = event.author + to_name = "" + dot_graph = await agent_graph.get_agent_graph( + root_agent, [(from_name, to_name)] + ) + if dot_graph and isinstance(dot_graph, graphviz.Digraph): + return GetEventGraphResult(dot_src=dot_graph.source) + else: + return {} + + @app.websocket("/run_live") + async def run_agent_live( + websocket: WebSocket, + app_name: str, + user_id: str, + session_id: str, + modalities: List[Literal["TEXT", "AUDIO"]] = Query( + default=["AUDIO"] + ), # Only allows "TEXT" or "AUDIO" + proactive_audio: bool | None = Query(default=None), + enable_affective_dialog: bool | None = Query(default=None), + enable_session_resumption: bool | None = Query(default=None), + save_live_blob: bool = Query(default=False), + ) -> None: + ws_origin = websocket.headers.get("origin") + if ws_origin is not None and not _is_request_origin_allowed( + ws_origin, + websocket.scope, + literal_origins, + compiled_origin_regex, + has_configured_allowed_origins, + ): + await websocket.close(code=1008, reason="Origin not allowed") + return + + await websocket.accept() + self.current_app_name_ref.value = app_name + runner_for_context = await self.get_runner_async(app_name) + _set_telemetry_context_if_needed(runner_for_context) + + session = await self.session_service.get_session( + app_name=app_name, user_id=user_id, session_id=session_id + ) + if not session: + await websocket.close(code=1002, reason="Session not found") + return + + live_request_queue = LiveRequestQueue() + + async def forward_events(): + runner = await self.get_runner_async(app_name) + run_config = RunConfig( + response_modalities=modalities, + proactivity=( + types.ProactivityConfig(proactive_audio=proactive_audio) + if proactive_audio is not None + else None + ), + enable_affective_dialog=enable_affective_dialog, + session_resumption=( + types.SessionResumptionConfig( + transparent=enable_session_resumption + ) + if enable_session_resumption is not None + else None + ), + save_live_blob=save_live_blob, + ) + async with Aclosing( + runner.run_live( + session=session, + live_request_queue=live_request_queue, + run_config=run_config, + ) + ) as agen: + async for event in agen: + await websocket.send_text( + event.model_dump_json(exclude_none=True, by_alias=True) + ) + + async def process_messages(): + try: + while True: + data = await websocket.receive_text() + # Validate and send the received message to the live queue. + live_request_queue.send(LiveRequest.model_validate_json(data)) + except ValidationError as ve: + logger.error("Validation error in process_messages: %s", ve) + + # Run both tasks concurrently and cancel all if one fails. + tasks = [ + asyncio.create_task(forward_events()), + asyncio.create_task(process_messages()), + ] + done, pending = await asyncio.wait( + tasks, return_when=asyncio.FIRST_EXCEPTION + ) + try: + # This will re-raise any exception from the completed tasks. + for task in done: + task.result() + except WebSocketDisconnect: + # Disconnection could happen when receive or send text via websocket + logger.info("Client disconnected during live session.") + except Exception as e: + logger.exception("Error during live websocket communication: %s", e) + traceback.print_exc() + WEBSOCKET_INTERNAL_ERROR_CODE = 1011 + WEBSOCKET_MAX_BYTES_FOR_REASON = 123 + await websocket.close( + code=WEBSOCKET_INTERNAL_ERROR_CODE, + reason=str(e)[:WEBSOCKET_MAX_BYTES_FOR_REASON], + ) + finally: + for task in pending: + task.cancel() + + # Register /trigger/* endpoints when enabled. + if self.trigger_sources: + from .trigger_routes import TriggerRouter + + trigger_router = TriggerRouter(self, trigger_sources=self.trigger_sources) + trigger_router.register(app) + + if web_assets_dir: + import mimetypes + + mimetypes.add_type("application/javascript", ".js", True) + mimetypes.add_type("text/javascript", ".js", True) + + redirect_dev_ui_url = ( + self.url_prefix + "/dev-ui/" if self.url_prefix else "/dev-ui/" + ) + + @app.get("/dev-ui/config") + async def get_ui_config(): + return { + "logo_text": self.logo_text, + "logo_image_url": self.logo_image_url, + } + + @app.get("/") + async def redirect_root_to_dev_ui(): + return RedirectResponse(redirect_dev_ui_url) + + @app.get("/dev-ui") + async def redirect_dev_ui_add_slash(): + return RedirectResponse(redirect_dev_ui_url) + + app.mount( + "/dev-ui/", + StaticFiles(directory=web_assets_dir, html=True, follow_symlink=True), + name="static", + ) + + return app diff --git a/src/google/adk/cli/agent_graph.py b/src/google/adk/cli/agent_graph.py index d1c940be55..84166c39d9 100644 --- a/src/google/adk/cli/agent_graph.py +++ b/src/google/adk/cli/agent_graph.py @@ -55,9 +55,6 @@ async def build_graph( Returns: None """ - from ..workflow._base_node import START - from ..workflow._workflow import Workflow - dark_green = '#0F5223' light_green = '#69CB87' light_gray = '#cccccc' @@ -76,8 +73,6 @@ def get_node_name(tool_or_agent: Union[BaseAgent, BaseTool]): return tool_or_agent.name elif isinstance(tool_or_agent, BaseTool): return tool_or_agent.name - elif hasattr(tool_or_agent, 'name'): - return tool_or_agent.name else: raise ValueError(f'Unsupported tool type: {tool_or_agent}') @@ -95,8 +90,6 @@ def get_node_caption(tool_or_agent: Union[BaseAgent, BaseTool]): return '🤖 ' + tool_or_agent.name elif isinstance(tool_or_agent, BaseTool): return '🔧 ' + tool_or_agent.name - elif hasattr(tool_or_agent, 'name'): - return tool_or_agent.name else: logger.warning( 'Unsupported tool, type: %s, obj: %s', @@ -108,6 +101,7 @@ def get_node_caption(tool_or_agent: Union[BaseAgent, BaseTool]): def get_node_shape(tool_or_agent: Union[BaseAgent, BaseTool]): if isinstance(tool_or_agent, BaseAgent): return 'ellipse' + elif retrieval_tool_module_loaded and isinstance( tool_or_agent, BaseRetrievalTool ): @@ -116,8 +110,6 @@ def get_node_shape(tool_or_agent: Union[BaseAgent, BaseTool]): return 'box' elif isinstance(tool_or_agent, BaseTool): return 'box' - elif hasattr(tool_or_agent, 'name'): - return 'box' else: logger.warning( 'Unsupported tool, type: %s, obj: %s', @@ -126,10 +118,8 @@ def get_node_shape(tool_or_agent: Union[BaseAgent, BaseTool]): ) return 'cylinder' - def should_build_agent_cluster(tool_or_agent): - if isinstance(tool_or_agent, Workflow): - return True - elif isinstance(tool_or_agent, BaseAgent): + def should_build_agent_cluster(tool_or_agent: Union[BaseAgent, BaseTool]): + if isinstance(tool_or_agent, BaseAgent): if isinstance(tool_or_agent, SequentialAgent): return True elif isinstance(tool_or_agent, LoopAgent): @@ -147,6 +137,11 @@ def should_build_agent_cluster(tool_or_agent): elif isinstance(tool_or_agent, BaseTool): return False else: + logger.warning( + 'Unsupported tool, type: %s, obj: %s', + type(tool_or_agent), + tool_or_agent, + ) return False async def build_cluster(child: graphviz.Digraph, agent: BaseAgent, name: str): @@ -193,16 +188,6 @@ async def build_cluster(child: graphviz.Digraph, agent: BaseAgent, name: str): await build_graph(child, sub_agent, highlight_pairs) if parent_agent: draw_edge(parent_agent.name, sub_agent.name) - elif isinstance(agent, Workflow) and agent._graph is not None: - for wf_node in agent._graph.nodes: - if wf_node.name == START.name: - continue - await build_graph(child, wf_node, highlight_pairs) - for edge in agent._graph.edges: - if edge.from_node.name == START.name: - continue - label = str(edge.route) if edge.route is not None else '' - draw_edge(edge.from_node.name, edge.to_node.name) else: for sub_agent in agent.sub_agents: await build_graph(child, sub_agent, highlight_pairs) @@ -243,6 +228,7 @@ async def draw_node(tool_or_agent: Union[BaseAgent, BaseTool]): return # if not in highlight, draw non-highlight node if as_cluster: + cluster = graphviz.Digraph( name='cluster_' + name ) # adding "cluster_" to the name makes the graph render as a cluster subgraph @@ -282,15 +268,14 @@ def draw_edge(from_name, to_name): graph.edge(from_name, to_name, arrowhead='none', color=light_gray) await draw_node(agent) - if hasattr(agent, 'sub_agents'): - for sub_agent in agent.sub_agents: - await build_graph(graph, sub_agent, highlight_pairs, agent) - if not should_build_agent_cluster( - sub_agent - ) and not should_build_agent_cluster( - agent - ): # This is to avoid making a node for a Workflow Agent - draw_edge(agent.name, sub_agent.name) + for sub_agent in agent.sub_agents: + await build_graph(graph, sub_agent, highlight_pairs, agent) + if not should_build_agent_cluster( + sub_agent + ) and not should_build_agent_cluster( + agent + ): # This is to avoid making a node for a Workflow Agent + draw_edge(agent.name, sub_agent.name) if isinstance(agent, LlmAgent): for tool in await agent.canonical_tools(): await draw_node(tool) diff --git a/src/google/adk/cli/agent_test_runner.py b/src/google/adk/cli/agent_test_runner.py deleted file mode 100644 index aca43111a9..0000000000 --- a/src/google/adk/cli/agent_test_runner.py +++ /dev/null @@ -1,900 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import json -import os -from pathlib import Path -from typing import Any -from typing import AsyncGenerator -from typing import Optional -from unittest import mock - -from google.adk.apps.app import App -from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService -from google.adk.cli.utils.agent_loader import AgentLoader -from google.adk.events.event import Event as AdkEvent -from google.adk.memory.in_memory_memory_service import InMemoryMemoryService -from google.adk.models.base_llm import BaseLlm -from google.adk.models.llm_request import LlmRequest -from google.adk.models.llm_response import LlmResponse -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.genai import types -from pydantic import alias_generators -import pytest - -EXCLUDED_EVENT_FIELDS = { - "id", - "timestamp", - "invocation_id", - "model_version", - "finish_reason", - "usage_metadata", - "avg_logprobs", - "cache_metadata", - "logprobs_result", - "citation_metadata", -} - - -# Read target folder from environment -def get_test_files( - target_folder: str | None = None, -) -> list[pytest.ParameterSet]: - """Returns list of (agent_dir, test_file_path) recursively.""" - folder = target_folder or os.environ.get("ADK_TEST_FOLDER") - if not folder: - return [] - target_dir = Path(folder) - if not target_dir.exists(): - return [] - - samples_dir = ( - Path(__file__).parent.parent.parent.parent.parent - / "contributing" - / "samples" - ) - - results = [] - for test_file in target_dir.rglob("tests/*.json"): - agent_dir = test_file.parent.parent - # Verify it looks like an agent directory - if ( - (agent_dir / "agent.py").exists() - or (agent_dir / "__init__.py").exists() - or (agent_dir / "root_agent.yaml").exists() - ): - try: - rel_dir = agent_dir.relative_to(samples_dir) - test_id = f"{rel_dir}/{test_file.name}" - except ValueError: - test_id = f"{agent_dir.name}/{test_file.name}" - - if test_file.stem.endswith("_xfail"): - results.append( - pytest.param( - agent_dir, test_file, id=test_id, marks=pytest.mark.xfail - ) - ) - else: - results.append(pytest.param(agent_dir, test_file, id=test_id)) - return results - - -class MockModel(BaseLlm): - model: str = "mock" - requests: list[LlmRequest] = [] - responses: list[LlmResponse] = [] - response_index: int = -1 - - @classmethod - def create(cls, contents: list[types.Content]): - llm_responses = [LlmResponse(content=content) for content in contents] - return cls(responses=llm_responses) - - @classmethod - def supported_models(cls) -> list[str]: - return ["mock"] - - async def generate_content_async( - self, llm_request: LlmRequest, stream: bool = False - ) -> AsyncGenerator[LlmResponse, None]: - self.response_index += 1 - self.requests.append(llm_request) - yield self.responses[self.response_index] - - -class InMemoryRunner: - - def __init__(self, root_agent=None, app=None): - if app: - self.app_name = app.name - self.runner = Runner( - app=app, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - ) - else: - self.app_name = "test_app" - self.runner = Runner( - app_name="test_app", - agent=root_agent, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - ) - self.session_id = None - - @property - def session(self): - if not self.session_id: - session = self.runner.session_service.create_session_sync( - app_name=self.app_name, user_id="test_user" - ) - self.session_id = session.id - return session - return self.runner.session_service.get_session_sync( - app_name=self.app_name, user_id="test_user", session_id=self.session_id - ) - - def run(self, new_message) -> list[AdkEvent]: - content = ( - new_message - if isinstance(new_message, types.Content) - else types.Content( - role="user", parts=[types.Part.from_text(text=new_message)] - ) - ) - return list( - self.runner.run( - user_id=self.session.user_id, - session_id=self.session.id, - new_message=content, - ) - ) - - -def normalize_events(events, is_json=False): - normalized = [] - for e in events: - if is_json: - d = dict(e) - for k in EXCLUDED_EVENT_FIELDS: - d.pop(k, None) - d.pop(alias_generators.to_camel(k), None) - d = {k: v for k, v in d.items() if v is not None} - else: - d = e.model_dump( - mode="json", - by_alias=True, - exclude=EXCLUDED_EVENT_FIELDS, - exclude_none=True, - ) - - if "content" in d and isinstance(d["content"], dict): - content = d["content"] - if "parts" in content and isinstance(content["parts"], list): - for part in content["parts"]: - if isinstance(part, dict) and "thoughtSignature" in part: - del part["thoughtSignature"] - - if "longRunningToolIds" in d: - if isinstance(d["longRunningToolIds"], list): - if not d["longRunningToolIds"]: - del d["longRunningToolIds"] - else: - d["longRunningToolIds"] = sorted(d["longRunningToolIds"]) - - if "actions" in d: - actions = d["actions"] - if isinstance(actions, dict): - # Remove empty dicts inside actions - for k in list(actions.keys()): - if actions[k] == {}: - del actions[k] - # If actions itself is now empty, remove it! - if not actions: - del d["actions"] - - actions = d.get("actions", {}) - state_delta = actions.get("stateDelta", {}) if actions else {} - if state_delta: - keys_to_remove = [k for k in state_delta if k.endswith("_join_state")] - for k in keys_to_remove: - del state_delta[k] - - normalized.append(d) - return normalized - - -def make_sort_key(d): - node_path = d.get("nodeInfo", {}).get("path", "") - author = d.get("author", "") - return (author, node_path, json.dumps(d, sort_keys=True)) - - -def _make_nodes_sequential(obj, visited=None): - if visited is None: - visited = set() - - if id(obj) in visited: - return - visited.add(id(obj)) - - from google.adk.workflow._parallel_worker import _ParallelWorker - from google.adk.workflow._workflow import Workflow - - if isinstance(obj, Workflow): - obj.max_concurrency = 1 - if obj.graph and obj.graph.nodes: - for node in obj.graph.nodes: - _make_nodes_sequential(node, visited) - elif isinstance(obj, _ParallelWorker): - obj.max_concurrency = 1 - if hasattr(obj, "_node"): - _make_nodes_sequential(obj._node, visited) - - -def _extract_user_content(event: dict) -> Optional[types.Content]: - """Extracts user content from an event dict and returns a types.Content object. - - Agent-emitted user-role events (e.g., task FRs synthesized by the Task - Delegation API wrapper) are skipped — those are produced by the agent - itself and carry a non-empty ``nodeInfo.path``. Re-feeding them to - ``runner.run`` would trigger extra LLM calls. - """ - if event.get("author") != "user": - return None - - # Real external user input has no node path; agent-emitted events do. - if event.get("nodeInfo", {}).get("path"): - return None - - content_dict = event.get("content", {}) - if not content_dict: - return None - - parts = content_dict.get("parts", []) - real_parts = [] - for p in parts: - if "functionResponse" in p: - fr = p["functionResponse"] - real_parts.append( - types.Part( - function_response=types.FunctionResponse( - id=fr.get("id"), - name=fr.get("name"), - response=fr.get("response"), - ) - ) - ) - elif "text" in p: - real_parts.append(types.Part(text=p["text"])) - elif "functionCall" in p: - fc = p["functionCall"] - real_parts.append( - types.Part( - function_call=types.FunctionCall( - id=fc.get("id"), - name=fc.get("name"), - args=fc.get("args"), - ) - ) - ) - - if real_parts: - return types.Content(role="user", parts=real_parts) - return None - - -def _remap_node_path(path: str, id_map: dict[str, str]) -> str: - """Rewrite ``@`` segments in a node path using ``id_map``. - - Path segments encode ``@``; when the run_id was an - LLM-generated FC id, it gets canonicalized to ``fc-N`` via ``id_map``. - Segments without ``@`` and ids not in ``id_map`` pass through unchanged. - """ - segments = [] - for seg in path.split("/"): - if "@" in seg: - name, rid = seg.split("@", 1) - if rid in id_map: - seg = f"{name}@{id_map[rid]}" - segments.append(seg) - return "/".join(segments) - - -def _normalize_ids(events: list[AdkEvent]) -> list[AdkEvent]: - """Filters partial events and normalizes event, function call, and response IDs.""" - events = [e for e in events if not getattr(e, "partial", False)] - - # Re-assign sequential event IDs - for i, e in enumerate(events, 1): - e.id = f"e-{i}" - - # Post-process all events to inject deterministic function IDs - final_fc_counter = 0 - final_orig_to_new_id = {} - for e in events: - for fc in e.get_function_calls(): - orig_id = fc.id - final_fc_counter += 1 - new_id = f"fc-{final_fc_counter}" - final_orig_to_new_id[orig_id] = new_id - fc.id = new_id - if e.long_running_tool_ids: - e.long_running_tool_ids = { - new_id if tid == orig_id else tid for tid in e.long_running_tool_ids - } - if fc.args: - for k, v in fc.args.items(): - if v == orig_id: - fc.args[k] = new_id - - # Pass 2: Update actions and user responses in all events - call_name_to_ids = {} - for e in events: - for fc in e.get_function_calls(): - call_name_to_ids.setdefault(fc.name, []).append(fc.id) - - if getattr(e, "branch", None) and e.branch.startswith("task:"): - parts = e.branch.split(":") - if len(parts) > 1: - fc_id = parts[1] - if fc_id in final_orig_to_new_id: - e.branch = f"task:{final_orig_to_new_id[fc_id]}" - - # Task wrappers stamp isolation_scope with the dispatching FC's - # id (random at run time) and ``node_info.path`` encodes - # ``@`` for the same id — remap both. - if e.isolation_scope in final_orig_to_new_id: - e.isolation_scope = final_orig_to_new_id[e.isolation_scope] - if e.node_info.path: - e.node_info.path = _remap_node_path( - e.node_info.path, final_orig_to_new_id - ) - if e.node_info.output_for: - e.node_info.output_for = [ - _remap_node_path(pth, final_orig_to_new_id) - for pth in e.node_info.output_for - ] - - if e.content and e.content.parts: - for part in e.content.parts: - if part.function_response: - name = part.function_response.name - if name in call_name_to_ids and call_name_to_ids[name]: - part.function_response.id = call_name_to_ids[name].pop(0) - elif part.function_response.id in final_orig_to_new_id: - part.function_response.id = final_orig_to_new_id[ - part.function_response.id - ] - # Tool-confirmation FCs nest the original FC's id inside their - # args; remap so the confirmation event aligns with the - # canonical fc-N id of the call it confirms. - if part.function_call and part.function_call.args: - _remap_ids_in_args(part.function_call.args, final_orig_to_new_id) - - # actions.requested_tool_confirmations is keyed by the FC id of the - # tool call awaiting confirmation; remap the keys to canonical ids. - if e.actions and e.actions.requested_tool_confirmations: - e.actions.requested_tool_confirmations = { - final_orig_to_new_id.get(k, k): v - for k, v in e.actions.requested_tool_confirmations.items() - } - - return events - - -def _remap_ids_in_args(value: Any, id_map: dict[str, str]) -> None: - """Walk a FC ``args`` value and remap any ``id`` field that names an FC. - - Tool-confirmation FCs (``adk_request_confirmation``) carry the - original FC as ``args.originalFunctionCall``; its ``id`` needs to be - remapped to the canonical ``fc-N`` value just like the top-level FC id. - """ - if isinstance(value, dict): - for k, v in list(value.items()): - if k == "id" and isinstance(v, str) and v in id_map: - value[k] = id_map[v] - else: - _remap_ids_in_args(v, id_map) - elif isinstance(value, list): - for item in value: - _remap_ids_in_args(item, id_map) - - -@pytest.mark.parametrize( - "agent_dir, test_file", - get_test_files(), -) -def test_agent_replay(agent_dir, test_file, monkeypatch): - # Add agent_dir.parent to sys.path so relative imports work - import sys - - sys_path_saved = list(sys.path) - sys.path.insert(0, str(agent_dir.parent)) - - try: - import random - - random.seed(42) - - loader = AgentLoader(str(agent_dir.parent)) - loader.remove_agent_from_cache(agent_dir.name) - agent_or_app = loader.load_agent(agent_dir.name) - - root_agent = ( - agent_or_app.root_agent - if isinstance(agent_or_app, App) - else agent_or_app - ) - _make_nodes_sequential(root_agent) - - with open(test_file, "r") as f: - session_data = json.load(f) - - events_data = session_data.get("events", []) - if not events_data: - pytest.skip(f"No events in {test_file}") - - first_event = events_data[0] - user_message = "" - if first_event.get("author") == "user": - parts = first_event.get("content", {}).get("parts", []) - if parts and "text" in parts[0]: - user_message = parts[0]["text"] - - if not user_message: - pytest.skip(f"Could not find user message in {test_file}") - - expected_events = events_data[1:] - - import re - - parallel_pattern = re.compile(r"^(.+)__(\d+)$") - - all_responses = [] - last_was_set_model_response = False - for ev in expected_events: - if "content" in ev: - content_dict = ev["content"] - role = content_dict.get("role") - - if role == "user": - parts = content_dict.get("parts", []) - for part in parts: - if "functionResponse" in part: - func_resp = part["functionResponse"] - if func_resp.get("name") == "set_model_response": - last_was_set_model_response = True - - elif role == "model": - if last_was_set_model_response: - last_was_set_model_response = False - continue - - try: - content_obj = types.Content.model_validate(content_dict) - all_responses.append( - {"author": ev.get("author", ""), "content": content_obj} - ) - except Exception: - pass - - mock_responses = [] - current_parallel_base = None - current_parallel_items = [] - - for resp in all_responses: - match = parallel_pattern.match(resp["author"]) - if match: - base_name, index = match.groups() - index = int(index) - - if current_parallel_base and current_parallel_base != base_name: - # Flush previous parallel group - current_parallel_items.sort(key=lambda x: x[0]) - mock_responses.extend([x[1] for x in current_parallel_items]) - current_parallel_items = [] - - current_parallel_base = base_name - current_parallel_items.append((index, resp["content"])) - else: - if current_parallel_base: - # Flush previous parallel group - current_parallel_items.sort(key=lambda x: x[0]) - mock_responses.extend([x[1] for x in current_parallel_items]) - current_parallel_items = [] - current_parallel_base = None - - mock_responses.append(resp["content"]) - - # Flush last group - if current_parallel_base: - current_parallel_items.sort(key=lambda x: x[0]) - mock_responses.extend([x[1] for x in current_parallel_items]) - - if mock_responses: - mock_model = MockModel.create(contents=mock_responses) - - async def mock_gen_async(instance, llm_request, stream=False): - async for resp in mock_model.generate_content_async( - llm_request, stream - ): - yield resp - - from google.adk.models.base_llm import BaseLlm - from google.adk.models.google_llm import Gemini - - monkeypatch.setattr(BaseLlm, "generate_content_async", mock_gen_async) - monkeypatch.setattr(Gemini, "generate_content_async", mock_gen_async) - - # Make RequestInput IDs deterministic during replay as well - fc_counter = 0 - - def get_next_fc_id(): - nonlocal fc_counter - fc_counter += 1 - return f"fc-{fc_counter}" - - runner = ( - InMemoryRunner(app=agent_or_app) - if isinstance(agent_or_app, App) - else InMemoryRunner(root_agent=agent_or_app) - ) - - # Extract all function call IDs from old events - old_fc_ids = [] - for ev in events_data: - content = ev.get("content", {}) - parts = content.get("parts", []) if isinstance(content, dict) else [] - for p in parts: - if isinstance(p, dict) and "functionCall" in p: - fc = p["functionCall"] - if isinstance(fc, dict) and "id" in fc: - old_fc_ids.append(fc["id"]) - - orig_to_new_id = {} - fc_counter = 0 - mapping_counter = 0 - - actual_events = [] - import random - - mocks_data = session_data.get("mocks", {}) - if mocks_data: - if "random.random" in mocks_data: - random_values = list(mocks_data["random.random"]) - - def mock_random(): - if random_values: - return random_values.pop(0) - return 0.8 - - monkeypatch.setattr(random, "random", mock_random) - - if "random.randint" in mocks_data: - randint_values = list(mocks_data["random.randint"]) - - def mock_randint(a, b): - if randint_values: - return randint_values.pop(0) - return b - - monkeypatch.setattr(random, "randint", mock_randint) - else: - random.seed(42) - first_run_events = runner.run(user_message) - - # Post-process events to inject deterministic function IDs - for e in first_run_events: - for fc in e.get_function_calls(): - # Build mapping from old IDs to new agent IDs - if mapping_counter < len(old_fc_ids): - old_id = old_fc_ids[mapping_counter] - orig_to_new_id[old_id] = fc.id - mapping_counter += 1 - - actual_events.extend(first_run_events) - - for event in events_data[1:]: - if event.get("author") == "user": - content = _extract_user_content(event) - if content: - # Update function response IDs if mapped - if content.parts: - for part in content.parts: - if ( - part.function_response - and part.function_response.id in orig_to_new_id - ): - part.function_response.id = orig_to_new_id[ - part.function_response.id - ] - - actual_events.append( - AdkEvent( - author="user", - content=content, - ) - ) - next_run_events = runner.run(content) - - # Post-process events to inject deterministic function IDs - for e in next_run_events: - for fc in e.get_function_calls(): - # Build mapping from old IDs to new agent IDs - if mapping_counter < len(old_fc_ids): - old_id = old_fc_ids[mapping_counter] - orig_to_new_id[old_id] = fc.id - mapping_counter += 1 - - actual_events.extend(next_run_events) - - actual_events = _normalize_ids(actual_events) - - actual_dicts = normalize_events(actual_events, is_json=False) - expected_dicts = normalize_events(expected_events, is_json=True) - - actual_dicts.sort(key=make_sort_key) - expected_dicts.sort(key=make_sort_key) - - assert actual_dicts == expected_dicts - finally: - sys.path = sys_path_saved - - -def rebuild_tests(path: str): - """Discovers test files and rebuilds them by running the agent live.""" - import json - import sys - import time - - from google.adk.apps.app import App - from google.adk.events.event import Event as AdkEvent - from google.genai import types - - path_obj = Path(path) - if path_obj.is_dir(): - folder = path - expected_name = None - else: - folder = str(path_obj.parent.parent) - expected_name = path_obj.name - - test_files = get_test_files(folder) - if not test_files: - print(f"No test files found in {folder}") - return - - for item in test_files: - agent_dir, test_file = item.values - if expected_name and test_file.name != expected_name: - continue - print(f"Rebuilding {test_file}...") - - # Add agent_dir.parent to sys.path so relative imports work - sys_path_saved = list(sys.path) - sys.path.insert(0, str(agent_dir.parent)) - - try: - import random - - loader = AgentLoader(str(agent_dir.parent)) - loader.remove_agent_from_cache(agent_dir.name) - agent_or_app = loader.load_agent(agent_dir.name) - - root_agent = ( - agent_or_app.root_agent - if isinstance(agent_or_app, App) - else agent_or_app - ) - _make_nodes_sequential(root_agent) - - with open(test_file, "r") as f: - session_data = json.load(f) - - events_data = session_data.get("events", []) - if not events_data: - print(f"No events in {test_file}, skipping.") - continue - - # Extract user messages - user_messages = [] - for event in events_data: - content = _extract_user_content(event) - if content: - user_messages.append(content) - - if not user_messages: - print(f"No user messages found in {test_file}, skipping.") - continue - - runner = ( - InMemoryRunner(app=agent_or_app) - if isinstance(agent_or_app, App) - else InMemoryRunner(root_agent=agent_or_app) - ) - - new_events = [] - inv_counter = 1 - - def mock_inv_id(): - nonlocal inv_counter - res = f"i-{inv_counter}" - inv_counter += 1 - return res - - ev_counter = 1 - - def mock_ev_id(): - nonlocal ev_counter - res = f"e-{ev_counter}" - ev_counter += 1 - return res - - fc_counter = 0 - orig_to_new_id = {} - - # Extract all function call IDs and response IDs from old events - old_fc_ids = [] - old_fr_ids = [] - for ev in events_data: - content = ev.get("content", {}) - parts = content.get("parts", []) if isinstance(content, dict) else [] - for p in parts: - if isinstance(p, dict): - if "functionCall" in p: - fc = p["functionCall"] - if isinstance(fc, dict) and "id" in fc: - old_fc_ids.append(fc["id"]) - elif "functionResponse" in p: - fr = p["functionResponse"] - if isinstance(fr, dict) and "id" in fr: - old_fr_ids.append(fr["id"]) - - def get_next_fc_id(): - nonlocal fc_counter - fc_counter += 1 - new_id = f"fc-{fc_counter}" - if fc_counter <= len(old_fc_ids): - orig_id = old_fc_ids[fc_counter - 1] - orig_to_new_id[orig_id] = new_id - if fc_counter <= len(old_fr_ids): - orig_fr_id = old_fr_ids[fc_counter - 1] - orig_to_new_id[orig_fr_id] = new_id - return new_id - - with ( - mock.patch( - "google.adk.runners.new_invocation_context_id", - side_effect=mock_inv_id, - ), - mock.patch( - "google.adk.events.event.Event.new_id", side_effect=mock_ev_id - ), - mock.patch( - "google.adk.flows.llm_flows.functions.generate_client_function_call_id", - side_effect=get_next_fc_id, - ), - mock.patch.dict(os.environ, {"PYTEST_CURRENT_TEST": "rebuild"}), - ): - random.seed(42) - for msg in user_messages: - - # Update function response IDs if mapped - if msg.parts: - for part in msg.parts: - if ( - part.function_response - and part.function_response.id in orig_to_new_id - ): - part.function_response.id = orig_to_new_id[ - part.function_response.id - ] - - # Create user event - user_ev = AdkEvent( - author="user", - content=msg, - ) - - run_events = runner.run(msg) - - # Build mapping from old IDs to new agent IDs - for e in run_events: - for fc in e.get_function_calls(): - if fc_counter < len(old_fc_ids): - old_id = old_fc_ids[fc_counter] - orig_to_new_id[old_id] = fc.id - fc_counter += 1 - - # Set invocation_id from runner's output if available - if run_events: - user_ev.invocation_id = run_events[0].invocation_id - - new_events.append(user_ev) - new_events.extend(run_events) - - new_events = _normalize_ids(new_events) - - # Convert to dicts - # Also exclude timestamp to make it deterministic - new_events_dicts = [ - e.model_dump( - mode="json", - by_alias=True, - exclude_none=True, - exclude={ - "timestamp", - "usage_metadata", - "model_version", - "avg_logprobs", - "cache_metadata", - "logprobs_result", - "citation_metadata", - }, - ) - for e in new_events - ] - - # Clean up thoughtSignature if present - for ev in new_events_dicts: - if "content" in ev and isinstance(ev["content"], dict): - content = ev["content"] - if "parts" in content and isinstance(content["parts"], list): - for part in content["parts"]: - if isinstance(part, dict) and "thoughtSignature" in part: - del part["thoughtSignature"] - - # Clean up empty actions items and actions itself if empty - for ev in new_events_dicts: - if "actions" in ev: - actions = ev["actions"] - ev["actions"] = { - k: v - for k, v in actions.items() - if not (isinstance(v, dict) and not v) - } - if not ev["actions"]: - del ev["actions"] - - # Update session data - session_data["events"] = new_events_dicts - session_data.pop("lastUpdateTime", None) - - # Write back to file - with open(test_file, "w") as f: - json.dump(session_data, f, indent=2, sort_keys=True) - f.write("\n") - - print(f"Successfully rebuilt {test_file}") - - except Exception as e: - print(f"Error rebuilding {test_file}: {e}") - finally: - sys.path = sys_path_saved - - -if __name__ == "__main__": - import sys - - if len(sys.argv) > 1: - rebuild_tests(sys.argv[1]) - else: - print("Usage: python agent_test_runner.py ") diff --git a/src/google/adk/cli/api_server.py b/src/google/adk/cli/api_server.py deleted file mode 100644 index f9b34c164c..0000000000 --- a/src/google/adk/cli/api_server.py +++ /dev/null @@ -1,1708 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -Api server with all production ADK endpoints. -""" - -from __future__ import annotations - -import asyncio -from contextlib import asynccontextmanager -import importlib -import json -import logging -import os -import re -import sys -import traceback -import typing -from typing import Any -from typing import Callable -from typing import List -from typing import Literal -from typing import Optional - -from fastapi import FastAPI -from fastapi import HTTPException -from fastapi import Query -from fastapi import Request -from fastapi import Response -from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import RedirectResponse -from fastapi.responses import StreamingResponse -from fastapi.staticfiles import StaticFiles -from fastapi.websockets import WebSocket -from fastapi.websockets import WebSocketDisconnect -from google.genai import types -from opentelemetry import trace -import opentelemetry.sdk.environment_variables as otel_env -from opentelemetry.sdk.trace import export as export_lib -from opentelemetry.sdk.trace import ReadableSpan -from opentelemetry.sdk.trace import SpanProcessor -from opentelemetry.sdk.trace import TracerProvider -from pydantic import Field -from pydantic import ValidationError -from starlette.types import Lifespan -from typing_extensions import deprecated -from typing_extensions import override -from watchdog.observers import Observer -import yaml - -from ..agents.base_agent import BaseAgent -from ..agents.live_request_queue import LiveRequest -from ..agents.live_request_queue import LiveRequestQueue -from ..agents.llm_agent import LlmAgent -from ..agents.run_config import RunConfig -from ..agents.run_config import StreamingMode -from ..apps.app import App -from ..artifacts.base_artifact_service import ArtifactVersion -from ..artifacts.base_artifact_service import BaseArtifactService -from ..auth.credential_service.base_credential_service import BaseCredentialService -from ..errors.already_exists_error import AlreadyExistsError -from ..errors.input_validation_error import InputValidationError -from ..errors.session_not_found_error import SessionNotFoundError -from ..events.event import Event -from ..memory.base_memory_service import BaseMemoryService -from ..plugins.base_plugin import BasePlugin -from ..runners import Runner -from ..sessions.base_session_service import BaseSessionService -from ..sessions.session import Session -from ..utils.agent_info import AgentInfo -from ..utils.agent_info import get_agents_dict -from ..utils.context_utils import Aclosing -from ..utils.feature_decorator import experimental -from ..version import __version__ -from .cli_eval import EVAL_SESSION_ID_PREFIX -from .utils import cleanup -from .utils import common -from .utils import envs -from .utils.base_agent_loader import BaseAgentLoader -from .utils.shared_value import SharedValue - -logger = logging.getLogger("google_adk." + __name__) - -_REGEX_PREFIX = "regex:" - - -def _parse_cors_origins( - allow_origins: list[str], -) -> tuple[list[str], Optional[str]]: - """Parse allow_origins into literal origins and a combined regex pattern. - - Args: - allow_origins: List of origin strings. Entries prefixed with 'regex:' are - treated as regex patterns; all others are treated as literal origins. - - Returns: - A tuple of (literal_origins, combined_regex) where combined_regex is None - if no regex patterns were provided, or a single pattern joining all regex - patterns with '|'. - """ - literal_origins = [] - regex_patterns = [] - for origin in allow_origins: - if origin.startswith(_REGEX_PREFIX): - pattern = origin[len(_REGEX_PREFIX) :] - if pattern: - regex_patterns.append(pattern) - else: - literal_origins.append(origin) - - combined_regex = "|".join(regex_patterns) if regex_patterns else None - return literal_origins, combined_regex - - -def _is_origin_allowed( - origin: str, - allowed_literal_origins: list[str], - allowed_origin_regex: Optional[re.Pattern[str]], -) -> bool: - """Check whether the given origin matches the allowed origins.""" - if "*" in allowed_literal_origins: - return True - if origin in allowed_literal_origins: - return True - if allowed_origin_regex is not None: - return allowed_origin_regex.fullmatch(origin) is not None - return False - - -def _normalize_origin_scheme(scheme: str) -> str: - """Normalize request schemes to the browser Origin scheme space.""" - if scheme == "ws": - return "http" - if scheme == "wss": - return "https" - return scheme - - -def _strip_optional_quotes(value: str) -> str: - """Strip a single pair of wrapping quotes from a header value.""" - if len(value) >= 2 and value[0] == '"' and value[-1] == '"': - return value[1:-1] - return value - - -def _get_scope_header( - scope: dict[str, Any], header_name: bytes -) -> Optional[str]: - """Return the first matching header value from an ASGI scope.""" - for candidate_name, candidate_value in scope.get("headers", []): - if candidate_name == header_name: - return candidate_value.decode("latin-1").split(",", 1)[0].strip() - return None - - -def _get_request_origin(scope: dict[str, Any]) -> Optional[str]: - """Compute the effective origin for the current HTTP/WebSocket request.""" - forwarded = _get_scope_header(scope, b"forwarded") - if forwarded is not None: - proto = None - host = None - for element in forwarded.split(",", 1)[0].split(";"): - if "=" not in element: - continue - name, value = element.split("=", 1) - if name.strip().lower() == "proto": - proto = _strip_optional_quotes(value.strip()) - elif name.strip().lower() == "host": - host = _strip_optional_quotes(value.strip()) - if proto is not None and host is not None: - return f"{_normalize_origin_scheme(proto)}://{host}" - - host = _get_scope_header(scope, b"x-forwarded-host") - if host is None: - host = _get_scope_header(scope, b"host") - if host is None: - return None - - proto = _get_scope_header(scope, b"x-forwarded-proto") - if proto is None: - proto = scope.get("scheme", "http") - return f"{_normalize_origin_scheme(proto)}://{host}" - - -def _is_request_origin_allowed( - origin: str, - scope: dict[str, Any], - allowed_literal_origins: list[str], - allowed_origin_regex: Optional[re.Pattern[str]], - has_configured_allowed_origins: bool, -) -> bool: - """Validate an Origin header against explicit config or same-origin.""" - if has_configured_allowed_origins and _is_origin_allowed( - origin, allowed_literal_origins, allowed_origin_regex - ): - return True - - request_origin = _get_request_origin(scope) - if request_origin is None: - return False - return origin == request_origin - - -_SAFE_HTTP_METHODS = frozenset({"GET", "HEAD", "OPTIONS"}) - - -class _OriginCheckMiddleware: - """ASGI middleware that blocks cross-origin state-changing requests.""" - - def __init__( - self, - app: Any, - has_configured_allowed_origins: bool, - allowed_origins: list[str], - allowed_origin_regex: Optional[re.Pattern[str]], - ) -> None: - self._app = app - self._has_configured_allowed_origins = has_configured_allowed_origins - self._allowed_origins = allowed_origins - self._allowed_origin_regex = allowed_origin_regex - - async def __call__( - self, - scope: dict[str, Any], - receive: Any, - send: Any, - ) -> None: - if scope["type"] != "http": - await self._app(scope, receive, send) - return - - method = scope.get("method", "GET") - if method in _SAFE_HTTP_METHODS: - await self._app(scope, receive, send) - return - - origin = _get_scope_header(scope, b"origin") - if origin is None: - await self._app(scope, receive, send) - return - - if _is_request_origin_allowed( - origin, - scope, - self._allowed_origins, - self._allowed_origin_regex, - self._has_configured_allowed_origins, - ): - await self._app(scope, receive, send) - return - - response_body = b"Forbidden: origin not allowed" - await send({ - "type": "http.response.start", - "status": 403, - "headers": [ - (b"content-type", b"text/plain"), - (b"content-length", str(len(response_body)).encode()), - ], - }) - await send({ - "type": "http.response.body", - "body": response_body, - }) - - -class _DefaultAppRewriteMiddleware: - """ASGI middleware that rewrites URLs to inject default app name if set and missing.""" - - _PRODUCTION_PATH_PATTERNS = [ - re.compile(r"^/users/"), - re.compile(r"^/app-info$"), - re.compile(r"^/trigger/"), - ] - - def __init__(self, app: Any, default_app_name: Optional[str] = None) -> None: - self._app = app - self._default_app_name = default_app_name - - async def __call__( - self, - scope: dict[str, Any], - receive: Any, - send: Any, - ) -> None: - if scope["type"] in ("http", "websocket"): - if self._default_app_name: - path: str = scope.get("path", "") - - if any( - pattern.match(path) for pattern in self._PRODUCTION_PATH_PATTERNS - ): - scope["path"] = f"/apps/{self._default_app_name}{path}" - - if "raw_path" in scope: - scope["raw_path"] = scope["path"].encode("latin-1") - - await self._app(scope, receive, send) - - -class ApiServerSpanExporter(export_lib.SpanExporter): - - def __init__(self, trace_dict): - self.trace_dict = trace_dict - - def export( - self, spans: typing.Sequence[ReadableSpan] - ) -> export_lib.SpanExportResult: - for span in spans: - if ( - span.name == "call_llm" - or span.name == "send_data" - or span.name.startswith("execute_tool") - ): - attributes = dict(span.attributes) - attributes["trace_id"] = span.get_span_context().trace_id - attributes["span_id"] = span.get_span_context().span_id - if attributes.get("gcp.vertex.agent.event_id", None): - self.trace_dict[attributes["gcp.vertex.agent.event_id"]] = attributes - return export_lib.SpanExportResult.SUCCESS - - def force_flush(self, timeout_millis: int = 30000) -> bool: - return True - - -class InMemoryExporter(export_lib.SpanExporter): - - def __init__(self, trace_dict): - super().__init__() - self._spans = [] - self.trace_dict = trace_dict - - @override - def export( - self, spans: typing.Sequence[ReadableSpan] - ) -> export_lib.SpanExportResult: - for span in spans: - trace_id = span.context.trace_id - attributes = dict(span.attributes) - session_id = attributes.get( - "gcp.vertex.agent.session_id", None - ) or attributes.get("gen_ai.conversation.id", None) - if session_id: - trace_ids = self.trace_dict.setdefault(session_id, []) - if trace_id not in trace_ids: - trace_ids.append(trace_id) - self._spans.extend(spans) - return export_lib.SpanExportResult.SUCCESS - - @override - def force_flush(self, timeout_millis: int = 30000) -> bool: - return True - - def get_finished_spans(self, session_id: str): - trace_ids = self.trace_dict.get(session_id, None) - if trace_ids is None or not trace_ids: - return [] - return [x for x in self._spans if x.context.trace_id in trace_ids] - - def clear(self): - self._spans.clear() - - -class RunAgentRequest(common.BaseModel): - app_name: Optional[str] = None - user_id: str - session_id: str - new_message: Optional[types.Content] = None - streaming: bool = False - state_delta: Optional[dict[str, Any]] = None - # for long-running function resume requests (e.g., OAuth callback) - function_call_event_id: Optional[str] = None - # for resume long-running functions - invocation_id: Optional[str] = None - custom_metadata: Optional[dict[str, Any]] = None - - -class CreateSessionRequest(common.BaseModel): - session_id: Optional[str] = Field( - default=None, - description=( - "The ID of the session to create. If not provided, a random session" - " ID will be generated." - ), - ) - state: Optional[dict[str, Any]] = Field( - default=None, description="The initial state of the session." - ) - events: Optional[list[Event]] = Field( - default=None, - description="A list of events to initialize the session with.", - ) - - -class SaveArtifactRequest(common.BaseModel): - """Request payload for saving a new artifact.""" - - filename: str = Field(description="Artifact filename.") - artifact: types.Part = Field( - description="Artifact payload encoded as google.genai.types.Part." - ) - custom_metadata: Optional[dict[str, Any]] = Field( - default=None, - description="Optional metadata to associate with the artifact version.", - ) - - -class UpdateMemoryRequest(common.BaseModel): - """Request to add a session to the memory service.""" - - session_id: str - """The ID of the session to add to memory.""" - - -class UpdateSessionRequest(common.BaseModel): - """Request to update session state without running the agent.""" - - state_delta: dict[str, Any] - """The state changes to apply to the session.""" - - -class AppInfo(common.BaseModel): - name: str - root_agent_name: str - description: str - language: Literal["yaml", "python"] - is_computer_use: bool = False - agents: Optional[dict[str, AgentInfo]] = None - - -class ListAppsResponse(common.BaseModel): - apps: list[AppInfo] - - -def _setup_telemetry( - otel_to_cloud: bool = False, - internal_exporters: Optional[list[SpanProcessor]] = None, -): - # TODO - remove the else branch here once maybe_set_otel_providers is no - # longer experimental. - if otel_to_cloud: - _setup_gcp_telemetry(internal_exporters=internal_exporters) - elif _otel_env_vars_enabled(): - _setup_telemetry_from_env(internal_exporters=internal_exporters) - else: - # Old logic - to be removed when above leaves experimental. - tracer_provider = TracerProvider() - if internal_exporters is not None: - for exporter in internal_exporters: - tracer_provider.add_span_processor(exporter) - trace.set_tracer_provider(tracer_provider=tracer_provider) - - -def _otel_env_vars_enabled() -> bool: - return any([ - os.getenv(endpoint_var) - for endpoint_var in [ - otel_env.OTEL_EXPORTER_OTLP_ENDPOINT, - otel_env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, - otel_env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT, - otel_env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, - ] - ]) - - -def _setup_gcp_telemetry( - internal_exporters: list[SpanProcessor] = None, -): - if typing.TYPE_CHECKING: - from ..telemetry.setup import OTelHooks - - otel_hooks_to_add: list[OTelHooks] = [] - - if internal_exporters: - from ..telemetry.setup import OTelHooks - - # Register ADK-specific exporters in trace provider. - otel_hooks_to_add.append(OTelHooks(span_processors=internal_exporters)) - - import google.auth - - from ..telemetry.google_cloud import get_gcp_exporters - from ..telemetry.google_cloud import get_gcp_resource - from ..telemetry.setup import maybe_set_otel_providers - - credentials, project_id = google.auth.default() - - otel_hooks_to_add.append( - get_gcp_exporters( - # TODO - use trace_to_cloud here as well once otel_to_cloud is no - # longer experimental. - enable_cloud_tracing=True, - # TODO - re-enable metrics once errors during shutdown are fixed. - enable_cloud_metrics=False, - enable_cloud_logging=True, - google_auth=(credentials, project_id), - ) - ) - otel_resource = get_gcp_resource(project_id) - - maybe_set_otel_providers( - otel_hooks_to_setup=otel_hooks_to_add, - otel_resource=otel_resource, - ) - _setup_instrumentation_lib_if_installed() - - -def _setup_telemetry_from_env( - internal_exporters: list[SpanProcessor] = None, -): - from ..telemetry.setup import maybe_set_otel_providers - - otel_hooks_to_add = [] - - if internal_exporters: - from ..telemetry.setup import OTelHooks - - # Register ADK-specific exporters in trace provider. - otel_hooks_to_add.append(OTelHooks(span_processors=internal_exporters)) - - maybe_set_otel_providers(otel_hooks_to_setup=otel_hooks_to_add) - _setup_instrumentation_lib_if_installed() - - -def _setup_instrumentation_lib_if_installed(): - # Set instrumentation to enable emitting OTel data from GenAISDK - # Currently the instrumentation lib is in extras dependencies, make sure to - # warn the user if it's not installed. - try: - from opentelemetry.instrumentation.google_genai import GoogleGenAiSdkInstrumentor - - GoogleGenAiSdkInstrumentor().instrument() - except ImportError: - logger.warning( - "Unable to import GoogleGenAiSdkInstrumentor - some" - " telemetry will be disabled. Make sure to install google-adk[otel-gcp]" - ) - if os.getenv("GOOGLE_CLOUD_AGENT_ENGINE_ID"): - # Set up HTTPX and gRPC instrumentation for A2A multi-agent observability. - try: - from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor - - HTTPXClientInstrumentor().instrument() - except (ImportError, AttributeError): - logger.warning( - "telemetry enabled but proceeding without HTTPX instrumentation," - " because google-adk[otel-gcp] has not been installed" - ) - try: - from opentelemetry.instrumentation.grpc import GrpcInstrumentorClient - - GrpcInstrumentorClient().instrument() - except (ImportError, AttributeError): - logger.warning( - "telemetry enabled but proceeding without gRPC instrumentation," - " because google-adk[otel-gcp] has not been installed" - ) - - -class ApiServer: - """Helper class for setting up and running the ADK web server on FastAPI. - - You construct this class with all the Services required to run ADK agents and - can then call the get_fast_api_app method to get a FastAPI app instance that - can will use your provided service instances, static assets, and agent loader. - If you pass in a web_assets_dir, the static assets will be served under - /dev-ui in addition to the API endpoints created by default. - - You can add additional API endpoints by modifying the FastAPI app - instance returned by get_fast_api_app as this class exposes the agent runners - and most other bits of state retained during the lifetime of the server. - - Attributes: - agent_loader: An instance of BaseAgentLoader for loading agents. - session_service: An instance of BaseSessionService for managing sessions. - memory_service: An instance of BaseMemoryService for managing memory. - artifact_service: An instance of BaseArtifactService for managing - artifacts. - credential_service: An instance of BaseCredentialService for managing - credentials. - eval_sets_manager: An instance of EvalSetsManager for managing evaluation - sets. - eval_set_results_manager: An instance of EvalSetResultsManager for - managing evaluation set results. - agents_dir: Root directory containing subdirs for agents with those - containing resources (e.g. .env files, eval sets, etc.) for the agents. - extra_plugins: A list of fully qualified names of extra plugins to load. - logo_text: Text to display in the logo of the UI. - logo_image_url: URL of an image to display as logo of the UI. - runners_to_clean: Set of runner names marked for cleanup. - current_app_name_ref: A shared reference to the latest ran app name. - runner_dict: A dict of instantiated runners for each app. - """ - - def __init__( - self, - *, - agent_loader: BaseAgentLoader, - session_service: BaseSessionService, - memory_service: BaseMemoryService, - artifact_service: BaseArtifactService, - credential_service: BaseCredentialService, - eval_sets_manager: EvalSetsManager, - eval_set_results_manager: EvalSetResultsManager, - agents_dir: str, - extra_plugins: Optional[list[str]] = None, - logo_text: Optional[str] = None, - logo_image_url: Optional[str] = None, - url_prefix: Optional[str] = None, - auto_create_session: bool = False, - trigger_sources: Optional[list[str]] = None, - default_llm_model: Optional[str] = None, - ): - self.agent_loader = agent_loader - self.session_service = session_service - self.memory_service = memory_service - self.artifact_service = artifact_service - self.credential_service = credential_service - self.eval_sets_manager = eval_sets_manager - self.eval_set_results_manager = eval_set_results_manager - self.agents_dir = agents_dir - self.extra_plugins = extra_plugins or [] - self.logo_text = logo_text - self.logo_image_url = logo_image_url - # Internal properties we want to allow being modified from callbacks. - self.runners_to_clean: set[str] = set() - self.current_app_name_ref: SharedValue[str] = SharedValue(value="") - self.runner_dict = {} - self.url_prefix = url_prefix - self.auto_create_session = auto_create_session - self.trigger_sources = trigger_sources - self.default_llm_model = default_llm_model - self.default_app_name = os.getenv("ADK_DEFAULT_APP_NAME") - - async def get_runner_async(self, app_name: str) -> Runner: - """Returns the cached runner for the given app.""" - # Handle cleanup - if app_name in self.runners_to_clean: - self.runners_to_clean.remove(app_name) - runner = self.runner_dict.pop(app_name, None) - await cleanup.close_runners(list([runner])) - - # Return cached runner if exists - if app_name in self.runner_dict: - return self.runner_dict[app_name] - - # Create new runner - envs.load_dotenv_for_agent(os.path.basename(app_name), self.agents_dir) - agent_or_app = self.agent_loader.load_agent(app_name) - - if self.default_llm_model: - from .cli import _override_default_llm_model - - _override_default_llm_model(self.default_llm_model) - - # Instantiate extra plugins if configured - extra_plugins_instances = self._instantiate_extra_plugins() - - plugins_yaml_path = os.path.join(self.agents_dir, app_name, "plugins.yaml") - bq_analytics_config = None - if os.path.exists(plugins_yaml_path): - with open(plugins_yaml_path, "r", encoding="utf-8") as f: - plugins_config = yaml.safe_load(f) - if plugins_config and isinstance(plugins_config, dict): - bq_analytics_config = plugins_config.get("bigquery_agent_analytics") - - # All YAML agents are treated as visual builder agents. - is_visual_builder_agent = os.path.exists( - os.path.join(self.agents_dir, app_name, "root_agent.yaml") - ) - - def _maybe_add_bq_plugin(plugins: list[BasePlugin]) -> list[BasePlugin]: - if bq_analytics_config and all([ - bq_analytics_config.get("project_id"), - bq_analytics_config.get("dataset_id"), - bq_analytics_config.get("dataset_location"), - ]): - from ..plugins.bigquery_agent_analytics_plugin import BigQueryAgentAnalyticsPlugin - - plugins.append( - BigQueryAgentAnalyticsPlugin( - project_id=bq_analytics_config.get("project_id"), - dataset_id=bq_analytics_config.get("dataset_id"), - table_id=bq_analytics_config.get("table_id"), - location=bq_analytics_config.get("dataset_location"), - ) - ) - return plugins - - def _wrap_loaded_agent( - app_name: str, - agent_or_app: Any, - plugins: list[BasePlugin], - ) -> App: - if app_name.startswith("__"): - # AgentLoader validates special agents before they reach this point. - return App.model_construct( - name=app_name, - root_agent=agent_or_app, - plugins=plugins, - ) - return App( - name=app_name, - root_agent=agent_or_app, - plugins=plugins, - ) - - if isinstance(agent_or_app, App): - # Combine existing plugins with extra plugins - plugins = _maybe_add_bq_plugin( - agent_or_app.plugins + extra_plugins_instances - ) - agent_or_app.plugins = plugins - agentic_app = agent_or_app - elif isinstance(agent_or_app, BaseAgent): - plugins = _maybe_add_bq_plugin(extra_plugins_instances) - agentic_app = _wrap_loaded_agent(app_name, agent_or_app, plugins) - else: - # BaseNode (non-agent) - agentic_app = _wrap_loaded_agent( - app_name, agent_or_app, extra_plugins_instances - ) - - # If the root agent was loaded from YAML, we treat it as being from Visual Builder - if is_visual_builder_agent: - object.__setattr__(agentic_app, "_is_visual_builder_app", True) - - runner = self._create_runner(agentic_app) - self.runner_dict[app_name] = runner - return runner - - def _get_root_agent(self, agent_or_app: BaseAgent | App) -> BaseAgent: - """Extract root agent from either a BaseAgent or App object.""" - if isinstance(agent_or_app, App): - return agent_or_app.root_agent - return agent_or_app - - def _create_runner(self, agentic_app: App) -> Runner: - """Create a runner with common services.""" - return Runner( - app=agentic_app, - artifact_service=self.artifact_service, - session_service=self.session_service, - memory_service=self.memory_service, - credential_service=self.credential_service, - auto_create_session=self.auto_create_session, - ) - - def _instantiate_extra_plugins(self) -> list[BasePlugin]: - """Instantiate extra plugins from the configured list. - - Returns: - List of instantiated BasePlugin objects. - """ - extra_plugins_instances = [] - for qualified_name in self.extra_plugins: - try: - plugin_obj = self._import_plugin_object(qualified_name) - if isinstance(plugin_obj, BasePlugin): - extra_plugins_instances.append(plugin_obj) - elif issubclass(plugin_obj, BasePlugin): - extra_plugins_instances.append(plugin_obj(name=qualified_name)) - except Exception as e: - logger.error("Failed to load plugin %s: %s", qualified_name, e) - return extra_plugins_instances - - def _import_plugin_object(self, qualified_name: str) -> Any: - """Import a plugin object (class or instance) from a fully qualified name. - - Args: - qualified_name: Fully qualified name (e.g., - 'my_package.my_plugin.MyPlugin') - - Returns: - The imported object, which can be either a class or an instance. - - Raises: - ImportError: If the module cannot be imported. - AttributeError: If the object doesn't exist in the module. - """ - module_name, obj_name = qualified_name.rsplit(".", 1) - module = importlib.import_module(module_name) - return getattr(module, obj_name) - - def _setup_runtime_config(self, web_assets_dir: str): - """Sets up the runtime config for the web server.""" - # Read existing runtime config file. - runtime_config_path = os.path.join( - web_assets_dir, "assets", "config", "runtime-config.json" - ) - runtime_config = {} - try: - with open(runtime_config_path, "r") as f: - runtime_config = json.load(f) - except FileNotFoundError: - logger.info( - "File not found: %s. A new runtime config file will be created.", - runtime_config_path, - ) - except json.JSONDecodeError: - logger.warning( - "Failed to decode JSON from %s. The file content will be" - " overwritten.", - runtime_config_path, - ) - runtime_config["backendUrl"] = self.url_prefix if self.url_prefix else "" - - # Set custom logo config. - if self.logo_text or self.logo_image_url: - if not self.logo_text or not self.logo_image_url: - raise ValueError( - "Both --logo-text and --logo-image-url must be defined when using" - " logo config." - ) - runtime_config["logo"] = { - "text": self.logo_text, - "imageUrl": self.logo_image_url, - } - elif "logo" in runtime_config: - del runtime_config["logo"] - - # Write the runtime config file. - try: - os.makedirs(os.path.dirname(runtime_config_path), exist_ok=True) - with open(runtime_config_path, "w") as f: - json.dump(runtime_config, f, indent=2) - f.write("\n") - except IOError as e: - logger.error( - "Failed to write runtime config file %s: %s", runtime_config_path, e - ) - - async def _create_session( - self, - *, - app_name: str, - user_id: str, - session_id: Optional[str] = None, - state: Optional[dict[str, Any]] = None, - ) -> Session: - try: - session = await self.session_service.create_session( - app_name=app_name, - user_id=user_id, - state=state, - session_id=session_id, - ) - logger.info("New session created: %s", session.id) - return session - except AlreadyExistsError as e: - raise HTTPException( - status_code=409, detail=f"Session already exists: {session_id}" - ) from e - except Exception as e: - logger.error( - "Internal server error during session creation: %s", e, exc_info=True - ) - raise HTTPException(status_code=500, detail=str(e)) from e - - def get_fast_api_app( - self, - lifespan: Optional[Lifespan[FastAPI]] = None, - allow_origins: Optional[list[str]] = None, - web_assets_dir: Optional[str] = None, - setup_observer: Callable[ - [Observer, "ApiServer"], None - ] = lambda o, s: None, - tear_down_observer: Callable[ - [Observer, "ApiServer"], None - ] = lambda o, s: None, - register_processors: Callable[[TracerProvider], None] = lambda o: None, - otel_to_cloud: bool = False, - with_ui: bool = False, - ): - """Creates a FastAPI app for the ADK web server. - - By default it'll just return a FastAPI instance with the API server - endpoints, - but if you specify a web_assets_dir, it'll also serve the static web assets - from that directory. - - Args: - lifespan: The lifespan of the FastAPI app. - allow_origins: The origins that are allowed to make cross-origin requests. - Entries can be literal origins (e.g., 'https://example.com') or regex - patterns prefixed with 'regex:' (e.g., - 'regex:https://.*\\.example\\.com'). - web_assets_dir: The directory containing the web assets to serve. - setup_observer: Callback for setting up the file system observer. - tear_down_observer: Callback for cleaning up the file system observer. - register_processors: Callback for additional Span processors to be added - to the TracerProvider. - otel_to_cloud: Whether to enable Cloud Trace and Cloud Logging - integrations. - - Returns: - A FastAPI app instance. - """ - trace_dict = {} - session_trace_dict = {} - self._trace_dict = trace_dict - self._session_trace_dict = session_trace_dict - - # Set up a file system watcher to detect changes in the agents directory. - observer = Observer() - setup_observer(observer, self) - - @asynccontextmanager - async def internal_lifespan(app: FastAPI): - try: - if lifespan: - async with lifespan(app) as lifespan_context: - yield lifespan_context - else: - yield - finally: - tear_down_observer(observer, self) - # Create tasks for all runner closures to run concurrently - await cleanup.close_runners(list(self.runner_dict.values())) - - memory_exporter = InMemoryExporter(session_trace_dict) - self._memory_exporter = memory_exporter - - _setup_telemetry( - otel_to_cloud=otel_to_cloud, - internal_exporters=[ - export_lib.SimpleSpanProcessor(ApiServerSpanExporter(trace_dict)), - export_lib.SimpleSpanProcessor(memory_exporter), - ], - ) - if web_assets_dir: - self._setup_runtime_config(web_assets_dir) - - tracer_provider = trace.get_tracer_provider() - register_processors(tracer_provider) - - # Run the FastAPI server. - app = FastAPI(lifespan=internal_lifespan) - - has_configured_allowed_origins = bool(allow_origins) - if allow_origins: - literal_origins, combined_regex = _parse_cors_origins(allow_origins) - compiled_origin_regex = ( - re.compile(combined_regex) if combined_regex is not None else None - ) - app.add_middleware( - CORSMiddleware, - allow_origins=literal_origins, - allow_origin_regex=combined_regex, - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) - else: - literal_origins = [] - compiled_origin_regex = None - - app.add_middleware( - _OriginCheckMiddleware, - has_configured_allowed_origins=has_configured_allowed_origins, - allowed_origins=literal_origins, - allowed_origin_regex=compiled_origin_regex, - ) - - app.add_middleware( - _DefaultAppRewriteMiddleware, - default_app_name=self.default_app_name, - ) - - # Register production endpoints (22 total) - self._register_production_endpoints( - app, - trace_dict, - memory_exporter, - literal_origins, - compiled_origin_regex, - has_configured_allowed_origins, - ) - - if web_assets_dir: - import mimetypes - - mimetypes.add_type("application/javascript", ".js", True) - mimetypes.add_type("text/javascript", ".js", True) - - redirect_dev_ui_url = ( - self.url_prefix + "/dev-ui/" if self.url_prefix else "/dev-ui/" - ) - - @app.get("/dev-ui/config") - async def get_ui_config(): - return { - "logo_text": self.logo_text, - "logo_image_url": self.logo_image_url, - } - - @app.get("/") - async def redirect_root_to_dev_ui(): - return RedirectResponse(redirect_dev_ui_url) - - @app.get("/dev-ui") - async def redirect_dev_ui_add_slash(): - return RedirectResponse(redirect_dev_ui_url) - - app.mount( - "/dev-ui/", - StaticFiles(directory=web_assets_dir, html=True, follow_symlink=True), - name="static", - ) - - # Register /trigger/* endpoints when enabled. - if self.trigger_sources: - from .trigger_routes import TriggerRouter - - trigger_router = TriggerRouter(self, trigger_sources=self.trigger_sources) - trigger_router.register(app) - - return app - - def _register_production_endpoints( - self, - app: FastAPI, - trace_dict: dict, - memory_exporter: Any, - literal_origins: list[str], - compiled_origin_regex: Optional[re.Pattern[str]], - has_configured_allowed_origins: bool, - ): - """Register all core production-safe endpoints.""" - - @app.get("/health") - async def health() -> dict[str, str]: - return {"status": "ok"} - - @app.get("/version") - async def version() -> dict[str, str]: - return { - "version": __version__, - "language": "python", - "language_version": ( - f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}" - ), - } - - @app.get("/list-apps") - async def list_apps( - detailed: bool = Query( - default=False, description="Return detailed app information" - ) - ) -> list[str] | ListAppsResponse: - if detailed: - apps_info = self.agent_loader.list_agents_detailed() - return ListAppsResponse(apps=[AppInfo(**app) for app in apps_info]) - return self.agent_loader.list_agents() - - @experimental - @app.get("/apps/{app_name}/app-info", response_model_exclude_none=True) - async def get_adk_app_info(app_name: str) -> AppInfo: - """Returns the detailed info for a given ADK app.""" - agent_or_app = self.agent_loader.load_agent(app_name) - root_agent = self._get_root_agent(agent_or_app) - if isinstance(root_agent, LlmAgent): - return AppInfo( - name=app_name, - root_agent_name=root_agent.name, - description=root_agent.description, - language="python", - agents=await get_agents_dict(root_agent), - ) - else: - raise HTTPException( - status_code=400, detail="Root agent is not an LlmAgent" - ) - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}", - response_model_exclude_none=True, - ) - async def get_session( - app_name: str, user_id: str, session_id: str - ) -> Session: - session = await self.session_service.get_session( - app_name=app_name, user_id=user_id, session_id=session_id - ) - if not session: - raise HTTPException(status_code=404, detail="Session not found") - self.current_app_name_ref.value = app_name - return session - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions", - response_model_exclude_none=True, - ) - async def list_sessions(app_name: str, user_id: str) -> list[Session]: - list_sessions_response = await self.session_service.list_sessions( - app_name=app_name, user_id=user_id - ) - return [ - session - for session in list_sessions_response.sessions - # Remove sessions that were generated as a part of Eval. - if not session.id.startswith(EVAL_SESSION_ID_PREFIX) - ] - - @deprecated( - "Please use create_session instead. This will be removed in future" - " releases." - ) - @app.post( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}", - response_model_exclude_none=True, - ) - async def create_session_with_id( - app_name: str, - user_id: str, - session_id: str, - state: Optional[dict[str, Any]] = None, - ) -> Session: - return await self._create_session( - app_name=app_name, - user_id=user_id, - state=state, - session_id=session_id, - ) - - @app.post( - "/apps/{app_name}/users/{user_id}/sessions", - response_model_exclude_none=True, - ) - async def create_session( - app_name: str, - user_id: str, - req: Optional[CreateSessionRequest] = None, - ) -> Session: - if not req: - return await self._create_session(app_name=app_name, user_id=user_id) - - session = await self._create_session( - app_name=app_name, - user_id=user_id, - state=req.state, - session_id=req.session_id, - ) - - if req.events: - for event in req.events: - await self.session_service.append_event(session=session, event=event) - - return session - - @app.delete("/apps/{app_name}/users/{user_id}/sessions/{session_id}") - async def delete_session( - app_name: str, user_id: str, session_id: str - ) -> None: - await self.session_service.delete_session( - app_name=app_name, user_id=user_id, session_id=session_id - ) - - @app.patch( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}", - response_model_exclude_none=True, - ) - async def update_session( - app_name: str, - user_id: str, - session_id: str, - req: UpdateSessionRequest, - ) -> Session: - """Updates session state without running the agent. - - Args: - app_name: The name of the application. - user_id: The ID of the user. - session_id: The ID of the session to update. - req: The patch request containing state changes. - - Returns: - The updated session. - - Raises: - HTTPException: If the session is not found. - """ - session = await self.session_service.get_session( - app_name=app_name, user_id=user_id, session_id=session_id - ) - if not session: - raise HTTPException(status_code=404, detail="Session not found") - - # Create an event to record the state change - import uuid - - from ..events.event import Event - from ..events.event import EventActions - - state_update_event = Event( - invocation_id="p-" + str(uuid.uuid4()), - author="user", - actions=EventActions(state_delta=req.state_delta), - ) - - # Append the event to the session - # This will automatically update the session state through __update_session_state - await self.session_service.append_event( - session=session, event=state_update_event - ) - - return session - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}", - response_model_exclude_none=True, - ) - async def load_artifact( - app_name: str, - user_id: str, - session_id: str, - artifact_name: str, - version: Optional[int] = Query(None), - ) -> Optional[types.Part]: - artifact = await self.artifact_service.load_artifact( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=artifact_name, - version=version, - ) - if not artifact: - raise HTTPException(status_code=404, detail="Artifact not found") - return artifact - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/metadata", - response_model=list[ArtifactVersion], - response_model_exclude_none=True, - ) - async def list_artifact_versions_metadata( - app_name: str, - user_id: str, - session_id: str, - artifact_name: str, - ) -> list[ArtifactVersion]: - return await self.artifact_service.list_artifact_versions( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=artifact_name, - ) - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/{version_id}", - response_model_exclude_none=True, - ) - async def load_artifact_version( - app_name: str, - user_id: str, - session_id: str, - artifact_name: str, - version_id: int, - ) -> Optional[types.Part]: - artifact = await self.artifact_service.load_artifact( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=artifact_name, - version=version_id, - ) - if not artifact: - raise HTTPException(status_code=404, detail="Artifact not found") - return artifact - - @app.post( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts", - response_model=ArtifactVersion, - response_model_exclude_none=True, - ) - async def save_artifact( - app_name: str, - user_id: str, - session_id: str, - req: SaveArtifactRequest, - ) -> ArtifactVersion: - """Request payload for saving a new artifact.""" - try: - version = await self.artifact_service.save_artifact( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=req.filename, - artifact=req.artifact, - custom_metadata=req.custom_metadata, - ) - except InputValidationError as ive: - raise HTTPException(status_code=400, detail=str(ive)) from ive - except Exception as exc: # pylint: disable=broad-exception-caught - logger.error( - "Internal error while saving artifact %s for app=%s user=%s" - " session=%s: %s", - req.filename, - app_name, - user_id, - session_id, - exc, - exc_info=True, - ) - raise HTTPException(status_code=500, detail=str(exc)) from exc - artifact_version = await self.artifact_service.get_artifact_version( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=req.filename, - version=version, - ) - if artifact_version is None: - raise HTTPException( - status_code=500, detail="Artifact metadata unavailable" - ) - return artifact_version - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/{version_id}/metadata", - response_model=ArtifactVersion, - response_model_exclude_none=True, - ) - async def get_artifact_version_metadata( - app_name: str, - user_id: str, - session_id: str, - artifact_name: str, - version_id: int, - ) -> ArtifactVersion: - artifact_version = await self.artifact_service.get_artifact_version( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=artifact_name, - version=version_id, - ) - if not artifact_version: - raise HTTPException( - status_code=404, detail="Artifact version not found" - ) - return artifact_version - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts", - response_model_exclude_none=True, - ) - async def list_artifact_names( - app_name: str, user_id: str, session_id: str - ) -> list[str]: - return await self.artifact_service.list_artifact_keys( - app_name=app_name, user_id=user_id, session_id=session_id - ) - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions", - response_model_exclude_none=True, - ) - async def list_artifact_versions( - app_name: str, user_id: str, session_id: str, artifact_name: str - ) -> list[int]: - return await self.artifact_service.list_versions( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=artifact_name, - ) - - @app.delete( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}", - ) - async def delete_artifact( - app_name: str, user_id: str, session_id: str, artifact_name: str - ) -> None: - await self.artifact_service.delete_artifact( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=artifact_name, - ) - - @app.patch("/apps/{app_name}/users/{user_id}/memory") - async def patch_memory( - app_name: str, user_id: str, update_memory_request: UpdateMemoryRequest - ) -> None: - """Adds all events from a given session to the memory service. - - Args: - app_name: The name of the application. - user_id: The ID of the user. - update_memory_request: The memory request for the update - - Raises: - HTTPException: If the memory service is not configured or the request - is invalid. - """ - if not self.memory_service: - raise HTTPException( - status_code=400, detail="Memory service is not configured." - ) - if ( - update_memory_request is None - or update_memory_request.session_id is None - ): - raise HTTPException( - status_code=400, detail="Update memory request is invalid." - ) - - session = await self.session_service.get_session( - app_name=app_name, - user_id=user_id, - session_id=update_memory_request.session_id, - ) - if not session: - raise HTTPException(status_code=404, detail="Session not found") - await self.memory_service.add_session_to_memory(session) - - def _set_telemetry_context_if_needed(runner: Runner): - """Helper to set contextvars for the current request task.""" - app = getattr(runner, "app", None) - from ..utils._telemetry_context import _is_visual_builder - - if app and getattr(app, "_is_visual_builder_app", False): - _is_visual_builder.set(True) - else: - _is_visual_builder.set(False) - - @app.post("/run", response_model_exclude_none=True) - async def run_agent(req: RunAgentRequest, request: Request) -> list[Event]: - app_name = req.app_name or self.default_app_name - if not app_name: - raise HTTPException( - status_code=400, - detail="app_name is required when ADK_DEFAULT_APP_NAME is not set", - ) - req.app_name = app_name - self.current_app_name_ref.value = req.app_name - runner = await self.get_runner_async(req.app_name) - _set_telemetry_context_if_needed(runner) - run_config = ( - RunConfig(custom_metadata=req.custom_metadata) - if req.custom_metadata - else None - ) - - async def worker(): - try: - async with Aclosing( - runner.run_async( - user_id=req.user_id, - session_id=req.session_id, - new_message=req.new_message, - state_delta=req.state_delta, - invocation_id=req.invocation_id, - run_config=run_config, - ) - ) as agen: - return [event async for event in agen] - except SessionNotFoundError as e: - raise HTTPException(status_code=404, detail=str(e)) from e - - worker_task = asyncio.create_task(worker()) - - async def monitor(): - try: - while True: - message = await request.receive() - if message.get("type") == "http.disconnect": - logger.warning( - "Client disconnected. Aborting agent run for session %s.", - req.session_id, - ) - worker_task.cancel() - break - except asyncio.CancelledError: - pass - except Exception as e: # pylint: disable=broad-exception-caught - logger.error("Exception in disconnect monitor: %s", e, exc_info=True) - - monitor_task = asyncio.create_task(monitor()) - - try: - events = await worker_task - logger.info("Generated %s events in agent run", len(events)) - logger.debug("Events generated: %s", events) - return events - except asyncio.CancelledError: - if await request.is_disconnected(): - return Response(status_code=499) - raise - finally: - monitor_task.cancel() - - @app.post("/run_sse") - async def run_agent_sse(req: RunAgentRequest) -> StreamingResponse: - app_name = req.app_name or self.default_app_name - if not app_name: - raise HTTPException( - status_code=400, - detail="app_name is required when ADK_DEFAULT_APP_NAME is not set", - ) - req.app_name = app_name - self.current_app_name_ref.value = req.app_name - stream_mode = StreamingMode.SSE if req.streaming else StreamingMode.NONE - runner = await self.get_runner_async(req.app_name) - _set_telemetry_context_if_needed(runner) - - # Validate session existence before starting the stream. - # We check directly here instead of eagerly advancing the - # runner's async generator with anext(), because splitting - # generator consumption across two asyncio Tasks (request - # handler vs StreamingResponse) breaks OpenTelemetry context - # detachment. - if not runner.auto_create_session: - session = await self.session_service.get_session( - app_name=req.app_name, - user_id=req.user_id, - session_id=req.session_id, - ) - if not session: - raise HTTPException( - status_code=404, - detail=f"Session not found: {req.session_id}", - ) - - # Convert the events to properly formatted SSE - async def event_generator(): - async with Aclosing( - runner.run_async( - user_id=req.user_id, - session_id=req.session_id, - new_message=req.new_message, - state_delta=req.state_delta, - run_config=RunConfig( - streaming_mode=stream_mode, - custom_metadata=req.custom_metadata, - ), - invocation_id=req.invocation_id, - ) - ) as agen: - try: - async for event in agen: - # ADK Web renders artifacts from `actions.artifactDelta` - # during part processing *and* during action processing - # 1) the original event with `artifactDelta` cleared (content) - # 2) a content-less "action-only" event carrying `artifactDelta` - events_to_stream = [event] - if ( - not req.function_call_event_id - and event.actions.artifact_delta - and event.content - and event.content.parts - ): - content_event = event.model_copy(deep=True) - content_event.actions.artifact_delta = {} - artifact_event = event.model_copy(deep=True) - artifact_event.content = None - events_to_stream = [content_event, artifact_event] - - for event_to_stream in events_to_stream: - sse_event = event_to_stream.model_dump_json( - exclude_none=True, - by_alias=True, - ) - logger.debug( - "Generated event in agent run streaming: %s", sse_event - ) - yield f"data: {sse_event}\n\n" - except Exception as e: - logger.exception("Error in event_generator: %s", e) - yield f"data: {json.dumps({'error': str(e)})}\n\n" - - # Returns a streaming response with the proper media type for SSE - return StreamingResponse( - event_generator(), - media_type="text/event-stream", - ) - - @app.websocket("/run_live") - async def run_agent_live( - websocket: WebSocket, - user_id: str, - session_id: str, - app_name: Optional[str] = Query(default=None), - modalities: List[Literal["TEXT", "AUDIO"]] = Query( - default=["AUDIO"] - ), # Only allows "TEXT" or "AUDIO" - proactive_audio: bool | None = Query(default=None), - enable_affective_dialog: bool | None = Query(default=None), - enable_session_resumption: bool | None = Query(default=None), - save_live_blob: bool = Query(default=False), - ) -> None: - resolved_app_name = app_name or self.default_app_name - if not resolved_app_name: - await websocket.close( - code=1008, - reason=( - "app_name query parameter is required when ADK_DEFAULT_APP_NAME" - " is not set" - ), - ) - return - app_name = resolved_app_name - - ws_origin = websocket.headers.get("origin") - if ws_origin is not None and not _is_request_origin_allowed( - ws_origin, - websocket.scope, - literal_origins, - compiled_origin_regex, - has_configured_allowed_origins, - ): - await websocket.close(code=1008, reason="Origin not allowed") - return - - await websocket.accept() - self.current_app_name_ref.value = app_name - runner_for_context = await self.get_runner_async(app_name) - _set_telemetry_context_if_needed(runner_for_context) - - session = await self.session_service.get_session( - app_name=app_name, user_id=user_id, session_id=session_id - ) - if not session: - await websocket.close(code=1002, reason="Session not found") - return - - live_request_queue = LiveRequestQueue() - - async def forward_events(): - runner = await self.get_runner_async(app_name) - run_config = RunConfig( - response_modalities=modalities, - proactivity=( - types.ProactivityConfig(proactive_audio=proactive_audio) - if proactive_audio is not None - else None - ), - enable_affective_dialog=enable_affective_dialog, - session_resumption=( - types.SessionResumptionConfig( - transparent=enable_session_resumption - ) - if enable_session_resumption is not None - else None - ), - save_live_blob=save_live_blob, - ) - async with Aclosing( - runner.run_live( - session=session, - live_request_queue=live_request_queue, - run_config=run_config, - ) - ) as agen: - async for event in agen: - await websocket.send_text( - event.model_dump_json(exclude_none=True, by_alias=True) - ) - - async def process_messages(): - try: - while True: - data = await websocket.receive_text() - # Validate and send the received message to the live queue. - live_request_queue.send(LiveRequest.model_validate_json(data)) - except ValidationError as ve: - logger.error("Validation error in process_messages: %s", ve) - - # Run both tasks concurrently and cancel all if one fails. - tasks = [ - asyncio.create_task(forward_events()), - asyncio.create_task(process_messages()), - ] - done, pending = await asyncio.wait( - tasks, return_when=asyncio.FIRST_EXCEPTION - ) - try: - # This will re-raise any exception from the completed tasks. - for task in done: - task.result() - except WebSocketDisconnect: - # Disconnection could happen when receive or send text via websocket - logger.info("Client disconnected during live session.") - except Exception as e: - logger.exception("Error during live websocket communication: %s", e) - traceback.print_exc() - WEBSOCKET_INTERNAL_ERROR_CODE = 1011 - WEBSOCKET_MAX_BYTES_FOR_REASON = 123 - await websocket.close( - code=WEBSOCKET_INTERNAL_ERROR_CODE, - reason=str(e)[:WEBSOCKET_MAX_BYTES_FOR_REASON], - ) - finally: - for task in pending: - task.cancel() diff --git a/src/google/adk/cli/browser/chunk-257HQBMN.js b/src/google/adk/cli/browser/chunk-257HQBMN.js deleted file mode 100644 index 8ca8bd8847..0000000000 --- a/src/google/adk/cli/browser/chunk-257HQBMN.js +++ /dev/null @@ -1,132 +0,0 @@ -import{a as qt}from"./chunk-XMBKBASC.js";import{a as Jt}from"./chunk-B2DSW4QB.js";import{a as et,d as jt}from"./chunk-JHZIBEJC.js";import{a as Zt,b as Gt}from"./chunk-DRBE27N3.js";import{f as ht}from"./chunk-WXI2IBAH.js";import{d as Vt,m as rt,o as Lt}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as tt,E as F,G as kt,H as Wt,M as Yt,N as Ht,R as Kt,Y as O,a as Ft,b as Pt}from"./chunk-QFMJV7VH.js";import{M as Ut,Q as Xt,a as D,g,i as L}from"./chunk-JRNAXTJ7.js";import{e as Mt}from"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as at,b as st,j as _}from"./chunk-RMXJBC7V.js";var vt=(function(){var e=g(function(B,m,d,b){for(d=d||{},b=B.length;b--;d[B[b]]=m);return d},"o"),t=[1,15],a=[1,7],i=[1,13],l=[1,14],s=[1,19],r=[1,16],n=[1,17],c=[1,18],x=[8,30],o=[8,10,21,28,29,30,31,39,43,46],u=[1,23],y=[1,24],f=[8,10,15,16,21,28,29,30,31,39,43,46],w=[8,10,15,16,21,27,28,29,30,31,39,43,46],v=[1,49],k={trace:g(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,NODE_ID:31,nodeShapeNLabel:32,dirList:33,DIR:34,NODE_DSTART:35,NODE_DEND:36,BLOCK_ARROW_START:37,BLOCK_ARROW_END:38,classDef:39,CLASSDEF_ID:40,CLASSDEF_STYLEOPTS:41,DEFAULT:42,class:43,CLASSENTITY_IDS:44,STYLECLASS:45,style:46,STYLE_ENTITY_IDS:47,STYLE_DEFINITION_DATA:48,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"NODE_ID",34:"DIR",35:"NODE_DSTART",36:"NODE_DEND",37:"BLOCK_ARROW_START",38:"BLOCK_ARROW_END",39:"classDef",40:"CLASSDEF_ID",41:"CLASSDEF_STYLEOPTS",42:"DEFAULT",43:"class",44:"CLASSENTITY_IDS",45:"STYLECLASS",46:"style",47:"STYLE_ENTITY_IDS",48:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[33,1],[33,2],[32,3],[32,4],[23,3],[23,3],[24,3],[25,3]],performAction:g(function(m,d,b,S,E,h,Y){var p=h.length-1;switch(E){case 4:S.getLogger().debug("Rule: separator (NL) ");break;case 5:S.getLogger().debug("Rule: separator (Space) ");break;case 6:S.getLogger().debug("Rule: separator (EOF) ");break;case 7:S.getLogger().debug("Rule: hierarchy: ",h[p-1]),S.setHierarchy(h[p-1]);break;case 8:S.getLogger().debug("Stop NL ");break;case 9:S.getLogger().debug("Stop EOF ");break;case 10:S.getLogger().debug("Stop NL2 ");break;case 11:S.getLogger().debug("Stop EOF2 ");break;case 12:S.getLogger().debug("Rule: statement: ",h[p]),typeof h[p].length=="number"?this.$=h[p]:this.$=[h[p]];break;case 13:S.getLogger().debug("Rule: statement #2: ",h[p-1]),this.$=[h[p-1]].concat(h[p]);break;case 14:S.getLogger().debug("Rule: link: ",h[p],m),this.$={edgeTypeStr:h[p],label:""};break;case 15:S.getLogger().debug("Rule: LABEL link: ",h[p-3],h[p-1],h[p]),this.$={edgeTypeStr:h[p],label:h[p-1]};break;case 18:let z=parseInt(h[p]),q=S.generateId();this.$={id:q,type:"space",label:"",width:z,children:[]};break;case 23:S.getLogger().debug("Rule: (nodeStatement link node) ",h[p-2],h[p-1],h[p]," typestr: ",h[p-1].edgeTypeStr);let Z=S.edgeStrToEdgeData(h[p-1].edgeTypeStr);this.$=[{id:h[p-2].id,label:h[p-2].label,type:h[p-2].type,directions:h[p-2].directions},{id:h[p-2].id+"-"+h[p].id,start:h[p-2].id,end:h[p].id,label:h[p-1].label,type:"edge",directions:h[p].directions,arrowTypeEnd:Z,arrowTypeStart:"arrow_open"},{id:h[p].id,label:h[p].label,type:S.typeStr2Type(h[p].typeStr),directions:h[p].directions}];break;case 24:S.getLogger().debug("Rule: nodeStatement (abc88 node size) ",h[p-1],h[p]),this.$={id:h[p-1].id,label:h[p-1].label,type:S.typeStr2Type(h[p-1].typeStr),directions:h[p-1].directions,widthInColumns:parseInt(h[p],10)};break;case 25:S.getLogger().debug("Rule: nodeStatement (node) ",h[p]),this.$={id:h[p].id,label:h[p].label,type:S.typeStr2Type(h[p].typeStr),directions:h[p].directions,widthInColumns:1};break;case 26:S.getLogger().debug("APA123",this?this:"na"),S.getLogger().debug("COLUMNS: ",h[p]),this.$={type:"column-setting",columns:h[p]==="auto"?-1:parseInt(h[p])};break;case 27:S.getLogger().debug("Rule: id-block statement : ",h[p-2],h[p-1]);let Rt=S.generateId();this.$=st(at({},h[p-2]),{type:"composite",children:h[p-1]});break;case 28:S.getLogger().debug("Rule: blockStatement : ",h[p-2],h[p-1],h[p]);let lt=S.generateId();this.$={id:lt,type:"composite",label:"",children:h[p-1]};break;case 29:S.getLogger().debug("Rule: node (NODE_ID separator): ",h[p]),this.$={id:h[p]};break;case 30:S.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",h[p-1],h[p]),this.$={id:h[p-1],label:h[p].label,typeStr:h[p].typeStr,directions:h[p].directions};break;case 31:S.getLogger().debug("Rule: dirList: ",h[p]),this.$=[h[p]];break;case 32:S.getLogger().debug("Rule: dirList: ",h[p-1],h[p]),this.$=[h[p-1]].concat(h[p]);break;case 33:S.getLogger().debug("Rule: nodeShapeNLabel: ",h[p-2],h[p-1],h[p]),this.$={typeStr:h[p-2]+h[p],label:h[p-1]};break;case 34:S.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",h[p-3],h[p-2]," #3:",h[p-1],h[p]),this.$={typeStr:h[p-3]+h[p],label:h[p-2],directions:h[p-1]};break;case 35:case 36:this.$={type:"classDef",id:h[p-1].trim(),css:h[p].trim()};break;case 37:this.$={type:"applyClass",id:h[p-1].trim(),styleClass:h[p].trim()};break;case 38:this.$={type:"applyStyles",id:h[p-1].trim(),stylesStr:h[p].trim()};break}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{10:t,11:3,13:4,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:i,29:l,31:s,39:r,43:n,46:c},{8:[1,20]},e(x,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,10:t,21:a,28:i,29:l,31:s,39:r,43:n,46:c}),e(o,[2,16],{14:22,15:u,16:y}),e(o,[2,17]),e(o,[2,18]),e(o,[2,19]),e(o,[2,20]),e(o,[2,21]),e(o,[2,22]),e(f,[2,25],{27:[1,25]}),e(o,[2,26]),{19:26,26:12,31:s},{10:t,11:27,13:4,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:i,29:l,31:s,39:r,43:n,46:c},{40:[1,28],42:[1,29]},{44:[1,30]},{47:[1,31]},e(w,[2,29],{32:32,35:[1,33],37:[1,34]}),{1:[2,7]},e(x,[2,13]),{26:35,31:s},{31:[2,14]},{17:[1,36]},e(f,[2,24]),{10:t,11:37,13:4,14:22,15:u,16:y,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:i,29:l,31:s,39:r,43:n,46:c},{30:[1,38]},{41:[1,39]},{41:[1,40]},{45:[1,41]},{48:[1,42]},e(w,[2,30]),{18:[1,43]},{18:[1,44]},e(f,[2,23]),{18:[1,45]},{30:[1,46]},e(o,[2,28]),e(o,[2,35]),e(o,[2,36]),e(o,[2,37]),e(o,[2,38]),{36:[1,47]},{33:48,34:v},{15:[1,50]},e(o,[2,27]),e(w,[2,33]),{38:[1,51]},{33:52,34:v,38:[2,31]},{31:[2,15]},e(w,[2,34]),{38:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:g(function(m,d){if(d.recoverable)this.trace(m);else{var b=new Error(m);throw b.hash=d,b}},"parseError"),parse:g(function(m){var d=this,b=[0],S=[],E=[null],h=[],Y=this.table,p="",z=0,q=0,Z=0,Rt=2,lt=1,Ee=h.slice.call(arguments,1),A=Object.create(this.lexer),J={yy:{}};for(var xt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,xt)&&(J.yy[xt]=this.yy[xt]);A.setInput(m,J.yy),J.yy.lexer=A,J.yy.parser=this,typeof A.yylloc>"u"&&(A.yylloc={});var bt=A.yylloc;h.push(bt);var _e=A.options&&A.options.ranges;typeof J.yy.parseError=="function"?this.parseError=J.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function De(H){b.length=b.length-2*H,E.length=E.length-H,h.length=h.length-H}g(De,"popStack");function zt(){var H;return H=S.pop()||A.lex()||lt,typeof H!="number"&&(H instanceof Array&&(S=H,H=S.pop()),H=d.symbols_[H]||H),H}g(zt,"lex");for(var W,yt,Q,U,Qr,mt,$={},ct,G,At,ot;;){if(Q=b[b.length-1],this.defaultActions[Q]?U=this.defaultActions[Q]:((W===null||typeof W>"u")&&(W=zt()),U=Y[Q]&&Y[Q][W]),typeof U>"u"||!U.length||!U[0]){var wt="";ot=[];for(ct in Y[Q])this.terminals_[ct]&&ct>Rt&&ot.push("'"+this.terminals_[ct]+"'");A.showPosition?wt="Parse error on line "+(z+1)+`: -`+A.showPosition()+` -Expecting `+ot.join(", ")+", got '"+(this.terminals_[W]||W)+"'":wt="Parse error on line "+(z+1)+": Unexpected "+(W==lt?"end of input":"'"+(this.terminals_[W]||W)+"'"),this.parseError(wt,{text:A.match,token:this.terminals_[W]||W,line:A.yylineno,loc:bt,expected:ot})}if(U[0]instanceof Array&&U.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Q+", token: "+W);switch(U[0]){case 1:b.push(W),E.push(A.yytext),h.push(A.yylloc),b.push(U[1]),W=null,yt?(W=yt,yt=null):(q=A.yyleng,p=A.yytext,z=A.yylineno,bt=A.yylloc,Z>0&&Z--);break;case 2:if(G=this.productions_[U[1]][1],$.$=E[E.length-G],$._$={first_line:h[h.length-(G||1)].first_line,last_line:h[h.length-1].last_line,first_column:h[h.length-(G||1)].first_column,last_column:h[h.length-1].last_column},_e&&($._$.range=[h[h.length-(G||1)].range[0],h[h.length-1].range[1]]),mt=this.performAction.apply($,[p,q,z,J.yy,U[1],E,h].concat(Ee)),typeof mt<"u")return mt;G&&(b=b.slice(0,-1*G*2),E=E.slice(0,-1*G),h=h.slice(0,-1*G)),b.push(this.productions_[U[1]][0]),E.push($.$),h.push($._$),At=Y[b[b.length-2]][b[b.length-1]],b.push(At);break;case 3:return!0}}return!0},"parse")},T=(function(){var B={EOF:1,parseError:g(function(d,b){if(this.yy.parser)this.yy.parser.parseError(d,b);else throw new Error(d)},"parseError"),setInput:g(function(m,d){return this.yy=d||this.yy||{},this._input=m,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:g(function(){var m=this._input[0];this.yytext+=m,this.yyleng++,this.offset++,this.match+=m,this.matched+=m;var d=m.match(/(?:\r\n?|\n).*/g);return d?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),m},"input"),unput:g(function(m){var d=m.length,b=m.split(/(?:\r\n?|\n)/g);this._input=m+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-d),this.offset-=d;var S=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),b.length-1&&(this.yylineno-=b.length-1);var E=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:b?(b.length===S.length?this.yylloc.first_column:0)+S[S.length-b.length].length-b[0].length:this.yylloc.first_column-d},this.options.ranges&&(this.yylloc.range=[E[0],E[0]+this.yyleng-d]),this.yyleng=this.yytext.length,this},"unput"),more:g(function(){return this._more=!0,this},"more"),reject:g(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:g(function(m){this.unput(this.match.slice(m))},"less"),pastInput:g(function(){var m=this.matched.substr(0,this.matched.length-this.match.length);return(m.length>20?"...":"")+m.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:g(function(){var m=this.match;return m.length<20&&(m+=this._input.substr(0,20-m.length)),(m.substr(0,20)+(m.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:g(function(){var m=this.pastInput(),d=new Array(m.length+1).join("-");return m+this.upcomingInput()+` -`+d+"^"},"showPosition"),test_match:g(function(m,d){var b,S,E;if(this.options.backtrack_lexer&&(E={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(E.yylloc.range=this.yylloc.range.slice(0))),S=m[0].match(/(?:\r\n?|\n).*/g),S&&(this.yylineno+=S.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:S?S[S.length-1].length-S[S.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+m[0].length},this.yytext+=m[0],this.match+=m[0],this.matches=m,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(m[0].length),this.matched+=m[0],b=this.performAction.call(this,this.yy,this,d,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),b)return b;if(this._backtrack){for(var h in E)this[h]=E[h];return!1}return!1},"test_match"),next:g(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var m,d,b,S;this._more||(this.yytext="",this.match="");for(var E=this._currentRules(),h=0;hd[0].length)){if(d=b,S=h,this.options.backtrack_lexer){if(m=this.test_match(b,E[h]),m!==!1)return m;if(this._backtrack){d=!1;continue}else return!1}else if(!this.options.flex)break}return d?(m=this.test_match(d,E[S]),m!==!1?m:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:g(function(){var d=this.next();return d||this.lex()},"lex"),begin:g(function(d){this.conditionStack.push(d)},"begin"),popState:g(function(){var d=this.conditionStack.length-1;return d>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:g(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:g(function(d){return d=this.conditionStack.length-1-Math.abs(d||0),d>=0?this.conditionStack[d]:"INITIAL"},"topState"),pushState:g(function(d){this.begin(d)},"pushState"),stateStackSize:g(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:g(function(d,b,S,E){var h=E;switch(S){case 0:return d.getLogger().debug("Found block-beta"),10;break;case 1:return d.getLogger().debug("Found id-block"),29;break;case 2:return d.getLogger().debug("Found block"),10;break;case 3:d.getLogger().debug(".",b.yytext);break;case 4:d.getLogger().debug("_",b.yytext);break;case 5:return 5;case 6:return b.yytext=-1,28;break;case 7:return b.yytext=b.yytext.replace(/columns\s+/,""),d.getLogger().debug("COLUMNS (LEX)",b.yytext),28;break;case 8:this.pushState("md_string");break;case 9:return"MD_STR";case 10:this.popState();break;case 11:this.pushState("string");break;case 12:d.getLogger().debug("LEX: POPPING STR:",b.yytext),this.popState();break;case 13:return d.getLogger().debug("LEX: STR end:",b.yytext),"STR";break;case 14:return b.yytext=b.yytext.replace(/space\:/,""),d.getLogger().debug("SPACE NUM (LEX)",b.yytext),21;break;case 15:return b.yytext="1",d.getLogger().debug("COLUMNS (LEX)",b.yytext),21;break;case 16:return 42;case 17:return"LINKSTYLE";case 18:return"INTERPOLATE";case 19:return this.pushState("CLASSDEF"),39;break;case 20:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 21:return this.popState(),this.pushState("CLASSDEFID"),40;break;case 22:return this.popState(),41;break;case 23:return this.pushState("CLASS"),43;break;case 24:return this.popState(),this.pushState("CLASS_STYLE"),44;break;case 25:return this.popState(),45;break;case 26:return this.pushState("STYLE_STMNT"),46;break;case 27:return this.popState(),this.pushState("STYLE_DEFINITION"),47;break;case 28:return this.popState(),48;break;case 29:return this.pushState("acc_title"),"acc_title";break;case 30:return this.popState(),"acc_title_value";break;case 31:return this.pushState("acc_descr"),"acc_descr";break;case 32:return this.popState(),"acc_descr_value";break;case 33:this.pushState("acc_descr_multiline");break;case 34:this.popState();break;case 35:return"acc_descr_multiline_value";case 36:return 30;case 37:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 38:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 39:return this.popState(),d.getLogger().debug("Lex: ))"),"NODE_DEND";break;case 40:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 41:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 42:return this.popState(),d.getLogger().debug("Lex: (-"),"NODE_DEND";break;case 43:return this.popState(),d.getLogger().debug("Lex: -)"),"NODE_DEND";break;case 44:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 45:return this.popState(),d.getLogger().debug("Lex: ]]"),"NODE_DEND";break;case 46:return this.popState(),d.getLogger().debug("Lex: ("),"NODE_DEND";break;case 47:return this.popState(),d.getLogger().debug("Lex: ])"),"NODE_DEND";break;case 48:return this.popState(),d.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 49:return this.popState(),d.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 50:return this.popState(),d.getLogger().debug("Lex: )]"),"NODE_DEND";break;case 51:return this.popState(),d.getLogger().debug("Lex: )"),"NODE_DEND";break;case 52:return this.popState(),d.getLogger().debug("Lex: ]>"),"NODE_DEND";break;case 53:return this.popState(),d.getLogger().debug("Lex: ]"),"NODE_DEND";break;case 54:return d.getLogger().debug("Lexa: -)"),this.pushState("NODE"),35;break;case 55:return d.getLogger().debug("Lexa: (-"),this.pushState("NODE"),35;break;case 56:return d.getLogger().debug("Lexa: ))"),this.pushState("NODE"),35;break;case 57:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 58:return d.getLogger().debug("Lex: ((("),this.pushState("NODE"),35;break;case 59:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 60:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 61:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 62:return d.getLogger().debug("Lexc: >"),this.pushState("NODE"),35;break;case 63:return d.getLogger().debug("Lexa: (["),this.pushState("NODE"),35;break;case 64:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 65:return this.pushState("NODE"),35;break;case 66:return this.pushState("NODE"),35;break;case 67:return this.pushState("NODE"),35;break;case 68:return this.pushState("NODE"),35;break;case 69:return this.pushState("NODE"),35;break;case 70:return this.pushState("NODE"),35;break;case 71:return this.pushState("NODE"),35;break;case 72:return d.getLogger().debug("Lexa: ["),this.pushState("NODE"),35;break;case 73:return this.pushState("BLOCK_ARROW"),d.getLogger().debug("LEX ARR START"),37;break;case 74:return d.getLogger().debug("Lex: NODE_ID",b.yytext),31;break;case 75:return d.getLogger().debug("Lex: EOF",b.yytext),8;break;case 76:this.pushState("md_string");break;case 77:this.pushState("md_string");break;case 78:return"NODE_DESCR";case 79:this.popState();break;case 80:d.getLogger().debug("Lex: Starting string"),this.pushState("string");break;case 81:d.getLogger().debug("LEX ARR: Starting string"),this.pushState("string");break;case 82:return d.getLogger().debug("LEX: NODE_DESCR:",b.yytext),"NODE_DESCR";break;case 83:d.getLogger().debug("LEX POPPING"),this.popState();break;case 84:d.getLogger().debug("Lex: =>BAE"),this.pushState("ARROW_DIR");break;case 85:return b.yytext=b.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (right): dir:",b.yytext),"DIR";break;case 86:return b.yytext=b.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (left):",b.yytext),"DIR";break;case 87:return b.yytext=b.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (x):",b.yytext),"DIR";break;case 88:return b.yytext=b.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (y):",b.yytext),"DIR";break;case 89:return b.yytext=b.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (up):",b.yytext),"DIR";break;case 90:return b.yytext=b.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (down):",b.yytext),"DIR";break;case 91:return b.yytext="]>",d.getLogger().debug("Lex (ARROW_DIR end):",b.yytext),this.popState(),this.popState(),"BLOCK_ARROW_END";break;case 92:return d.getLogger().debug("Lex: LINK","#"+b.yytext+"#"),15;break;case 93:return d.getLogger().debug("Lex: LINK",b.yytext),15;break;case 94:return d.getLogger().debug("Lex: LINK",b.yytext),15;break;case 95:return d.getLogger().debug("Lex: LINK",b.yytext),15;break;case 96:return d.getLogger().debug("Lex: START_LINK",b.yytext),this.pushState("LLABEL"),16;break;case 97:return d.getLogger().debug("Lex: START_LINK",b.yytext),this.pushState("LLABEL"),16;break;case 98:return d.getLogger().debug("Lex: START_LINK",b.yytext),this.pushState("LLABEL"),16;break;case 99:this.pushState("md_string");break;case 100:return d.getLogger().debug("Lex: Starting string"),this.pushState("string"),"LINK_LABEL";break;case 101:return this.popState(),d.getLogger().debug("Lex: LINK","#"+b.yytext+"#"),15;break;case 102:return this.popState(),d.getLogger().debug("Lex: LINK",b.yytext),15;break;case 103:return this.popState(),d.getLogger().debug("Lex: LINK",b.yytext),15;break;case 104:return d.getLogger().debug("Lex: COLON",b.yytext),b.yytext=b.yytext.slice(1),27;break}},"anonymous"),rules:[/^(?:block-beta\b)/,/^(?:block:)/,/^(?:block\b)/,/^(?:[\s]+)/,/^(?:[\n]+)/,/^(?:((\u000D\u000A)|(\u000A)))/,/^(?:columns\s+auto\b)/,/^(?:columns\s+[\d]+)/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:space[:]\d+)/,/^(?:space\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\s+)/,/^(?:DEFAULT\s+)/,/^(?:\w+\s+)/,/^(?:[^\n]*)/,/^(?:class\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:style\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:end\b\s*)/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:[\)]\))/,/^(?:\}\})/,/^(?:\})/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\()/,/^(?:\]\])/,/^(?:\()/,/^(?:\]\))/,/^(?:\\\])/,/^(?:\/\])/,/^(?:\)\])/,/^(?:[\)])/,/^(?:\]>)/,/^(?:[\]])/,/^(?:-\))/,/^(?:\(-)/,/^(?:\)\))/,/^(?:\))/,/^(?:\(\(\()/,/^(?:\(\()/,/^(?:\{\{)/,/^(?:\{)/,/^(?:>)/,/^(?:\(\[)/,/^(?:\()/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\[\\)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:\[)/,/^(?:<\[)/,/^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/,/^(?:$)/,/^(?:["][`])/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:\]>\s*\()/,/^(?:,?\s*right\s*)/,/^(?:,?\s*left\s*)/,/^(?:,?\s*x\s*)/,/^(?:,?\s*y\s*)/,/^(?:,?\s*up\s*)/,/^(?:,?\s*down\s*)/,/^(?:\)\s*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*~~[\~]+\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:["][`])/,/^(?:["])/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?::\d+)/],conditions:{STYLE_DEFINITION:{rules:[28],inclusive:!1},STYLE_STMNT:{rules:[27],inclusive:!1},CLASSDEFID:{rules:[22],inclusive:!1},CLASSDEF:{rules:[20,21],inclusive:!1},CLASS_STYLE:{rules:[25],inclusive:!1},CLASS:{rules:[24],inclusive:!1},LLABEL:{rules:[99,100,101,102,103],inclusive:!1},ARROW_DIR:{rules:[85,86,87,88,89,90,91],inclusive:!1},BLOCK_ARROW:{rules:[76,81,84],inclusive:!1},NODE:{rules:[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,77,80],inclusive:!1},md_string:{rules:[9,10,78,79],inclusive:!1},space:{rules:[],inclusive:!1},string:{rules:[12,13,82,83],inclusive:!1},acc_descr_multiline:{rules:[34,35],inclusive:!1},acc_descr:{rules:[32],inclusive:!1},acc_title:{rules:[30],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,11,14,15,16,17,18,19,23,26,29,31,33,36,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,92,93,94,95,96,97,98,104],inclusive:!0}}};return B})();k.lexer=T;function C(){this.yy={}}return g(C,"Parser"),C.prototype=k,k.Parser=C,new C})();vt.parser=vt;var Te=vt,j=new Map,Bt=[],Et=new Map,Qt="color",$t="fill",Be="bgFill",le=",",Ne=O(),dt=new Map,Ie=g(e=>Yt.sanitizeText(e,Ne),"sanitizeText"),Ce=g(function(e,t=""){let a=dt.get(e);a||(a={id:e,styles:[],textStyles:[]},dt.set(e,a)),t?.split(le).forEach(i=>{let l=i.replace(/([^;]*);/,"$1").trim();if(RegExp(Qt).exec(i)){let r=l.replace($t,Be).replace(Qt,$t);a.textStyles.push(r)}a.styles.push(l)})},"addStyleClass"),Oe=g(function(e,t=""){let a=j.get(e);t!=null&&(a.styles=t.split(le))},"addStyle2Node"),Re=g(function(e,t){e.split(",").forEach(function(a){let i=j.get(a);if(i===void 0){let l=a.trim();i={id:l,type:"na",children:[]},j.set(l,i)}i.classes||(i.classes=[]),i.classes.push(t)})},"setCssClass"),ce=g((e,t)=>{let a=e.flat(),i=[],s=a.find(r=>r?.type==="column-setting")?.columns??-1;for(let r of a){if(typeof s=="number"&&s>0&&r.type!=="column-setting"&&typeof r.widthInColumns=="number"&&r.widthInColumns>s&&L.warn(`Block ${r.id} width ${r.widthInColumns} exceeds configured column width ${s}`),r.label&&(r.label=Ie(r.label)),r.type==="classDef"){Ce(r.id,r.css);continue}if(r.type==="applyClass"){Re(r.id,r?.styleClass??"");continue}if(r.type==="applyStyles"){r?.stylesStr&&Oe(r.id,r?.stylesStr);continue}if(r.type==="column-setting")t.columns=r.columns??-1;else if(r.type==="edge"){let n=(Et.get(r.id)??0)+1;Et.set(r.id,n),r.id=n+"-"+r.id,Bt.push(r)}else{r.label||(r.type==="composite"?r.label="":r.label=r.id);let n=j.get(r.id);if(n===void 0?j.set(r.id,r):(r.type!=="na"&&(n.type=r.type),r.label!==r.id&&(n.label=r.label)),r.children&&ce(r.children,r),r.type==="space"){let c=r.width??1;for(let x=0;x{L.debug("Clear called"),Kt(),nt={id:"root",type:"composite",children:[],columns:-1},j=new Map([["root",nt]]),Nt=[],dt=new Map,Bt=[],Et=new Map},"clear");function oe(e){switch(L.debug("typeStr2Type",e),e){case"[]":return"square";case"()":return L.debug("we have a round"),"round";case"(())":return"circle";case">]":return"rect_left_inv_arrow";case"{}":return"diamond";case"{{}}":return"hexagon";case"([])":return"stadium";case"[[]]":return"subroutine";case"[()]":return"cylinder";case"((()))":return"doublecircle";case"[//]":return"lean_right";case"[\\\\]":return"lean_left";case"[/\\]":return"trapezoid";case"[\\/]":return"inv_trapezoid";case"<[]>":return"block_arrow";default:return"na"}}g(oe,"typeStr2Type");function he(e){return L.debug("typeStr2Type",e),e==="=="?"thick":"normal"}g(he,"edgeTypeStr2Type");function ge(e){switch(e.replace(/^[\s-]+|[\s-]+$/g,"")){case"x":return"arrow_cross";case"o":return"arrow_circle";case">":return"arrow_point";default:return""}}g(ge,"edgeStrToEdgeData");var te=0,Ae=g(()=>(te++,"id-"+Math.random().toString(36).substr(2,12)+"-"+te),"generateId"),Me=g(e=>{nt.children=e,ce(e,nt),Nt=nt.children},"setHierarchy"),Fe=g(e=>{let t=j.get(e);return t?t.columns?t.columns:t.children?t.children.length:-1:-1},"getColumns"),Pe=g(()=>[...j.values()],"getBlocksFlat"),We=g(()=>Nt||[],"getBlocks"),Ye=g(()=>Bt,"getEdges"),He=g(e=>j.get(e),"getBlock"),Ke=g(e=>{j.set(e.id,e)},"setBlock"),Ue=g(()=>L,"getLogger"),Xe=g(function(){return dt},"getClasses"),je={getConfig:g(()=>tt().block,"getConfig"),typeStr2Type:oe,edgeTypeStr2Type:he,edgeStrToEdgeData:ge,getLogger:Ue,getBlocksFlat:Pe,getBlocks:We,getEdges:Ye,setHierarchy:Me,getBlock:He,setBlock:Ke,getColumns:Fe,getClasses:Xe,clear:ze,generateId:Ae},Ve=je,St=g((e,t)=>{let a=Pt,i=a(e,"r"),l=a(e,"g"),s=a(e,"b");return Ft(i,l,s,t)},"fade"),Ze=g(e=>`.label { - font-family: ${e.fontFamily}; - color: ${e.nodeTextColor||e.textColor}; - } - .cluster-label text { - fill: ${e.titleColor}; - } - .cluster-label span,p { - color: ${e.titleColor}; - } - - - - .label text,span,p { - fill: ${e.nodeTextColor||e.textColor}; - color: ${e.nodeTextColor||e.textColor}; - } - - .node rect, - .node circle, - .node ellipse, - .node polygon, - .node path { - fill: ${e.mainBkg}; - stroke: ${e.nodeBorder}; - stroke-width: 1px; - } - .flowchart-label text { - text-anchor: middle; - } - // .flowchart-label .text-outer-tspan { - // text-anchor: middle; - // } - // .flowchart-label .text-inner-tspan { - // text-anchor: start; - // } - - .node .label { - text-align: center; - } - .node.clickable { - cursor: pointer; - } - - .arrowheadPath { - fill: ${e.arrowheadColor}; - } - - .edgePath .path { - stroke: ${e.lineColor}; - stroke-width: 2.0px; - } - - .flowchart-link { - stroke: ${e.lineColor}; - fill: none; - } - - .edgeLabel { - background-color: ${e.edgeLabelBackground}; - /* - * This is for backward compatibility with existing code that didn't - * add a \`

\` around edge labels. - * - * TODO: We should probably remove this in a future release. - */ - p { - margin: 0; - padding: 0; - display: inline; - } - rect { - opacity: 0.5; - background-color: ${e.edgeLabelBackground}; - fill: ${e.edgeLabelBackground}; - } - text-align: center; - } - - /* For html labels only */ - .labelBkg { - background-color: ${e.edgeLabelBackground}; - } - - .node .cluster { - // fill: ${St(e.mainBkg,.5)}; - fill: ${St(e.clusterBkg,.5)}; - stroke: ${St(e.clusterBorder,.2)}; - box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; - stroke-width: 1px; - } - - .cluster text { - fill: ${e.titleColor}; - } - - .cluster span,p { - color: ${e.titleColor}; - } - /* .cluster div { - color: ${e.titleColor}; - } */ - - div.mermaidTooltip { - position: absolute; - text-align: center; - max-width: 200px; - padding: 2px; - font-family: ${e.fontFamily}; - font-size: 12px; - background: ${e.tertiaryColor}; - border: 1px solid ${e.border2}; - border-radius: 2px; - pointer-events: none; - z-index: 100; - } - - .flowchartTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${e.textColor}; - } - ${Jt()} -`,"getStyles"),Ge=Ze,qe=g((e,t,a,i)=>{t.forEach(l=>{nr[l](e,a,i)})},"insertMarkers"),Je=g((e,t,a)=>{L.trace("Making markers for ",a),e.append("defs").append("marker").attr("id",a+"_"+t+"-extensionStart").attr("class","marker extension "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),e.append("defs").append("marker").attr("id",a+"_"+t+"-extensionEnd").attr("class","marker extension "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),Qe=g((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-compositionStart").attr("class","marker composition "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),e.append("defs").append("marker").attr("id",a+"_"+t+"-compositionEnd").attr("class","marker composition "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),$e=g((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-aggregationStart").attr("class","marker aggregation "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),e.append("defs").append("marker").attr("id",a+"_"+t+"-aggregationEnd").attr("class","marker aggregation "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),tr=g((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-dependencyStart").attr("class","marker dependency "+t).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),e.append("defs").append("marker").attr("id",a+"_"+t+"-dependencyEnd").attr("class","marker dependency "+t).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),er=g((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-lollipopStart").attr("class","marker lollipop "+t).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),e.append("defs").append("marker").attr("id",a+"_"+t+"-lollipopEnd").attr("class","marker lollipop "+t).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),rr=g((e,t,a)=>{e.append("marker").attr("id",a+"_"+t+"-pointEnd").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",6).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),e.append("marker").attr("id",a+"_"+t+"-pointStart").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),ar=g((e,t,a)=>{e.append("marker").attr("id",a+"_"+t+"-circleEnd").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),e.append("marker").attr("id",a+"_"+t+"-circleStart").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),sr=g((e,t,a)=>{e.append("marker").attr("id",a+"_"+t+"-crossEnd").attr("class","marker cross "+t).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),e.append("marker").attr("id",a+"_"+t+"-crossStart").attr("class","marker cross "+t).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),ir=g((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),nr={extension:Je,composition:Qe,aggregation:$e,dependency:tr,lollipop:er,point:rr,circle:ar,cross:sr,barb:ir},lr=qe,R=O()?.block?.padding??8;function _t(e,t){if(e===0||!Number.isInteger(e))throw new Error("Columns must be an integer !== 0.");if(t<0||!Number.isInteger(t))throw new Error("Position must be a non-negative integer."+t);if(e<0)return{px:t,py:0};if(e===1)return{px:0,py:t};let a=t%e,i=Math.floor(t/e);return{px:a,py:i}}g(_t,"calculateBlockPosition");var cr=g(e=>{let t=0,a=0;for(let i of e.children){let{width:l,height:s,x:r,y:n}=i.size??{width:0,height:0,x:0,y:0};L.debug("getMaxChildSize abc95 child:",i.id,"width:",l,"height:",s,"x:",r,"y:",n,i.type),i.type!=="space"&&(l>t&&(t=l/(i.widthInColumns??1)),s>a&&(a=s))}return{width:t,height:a}},"getMaxChildSize");function ut(e,t,a=0,i=0){L.debug("setBlockSizes abc95 (start)",e.id,e?.size?.x,"block width =",e?.size,"siblingWidth",a),e?.size?.width||(e.size={width:a,height:i,x:0,y:0});let l=0,s=0;if(e.children?.length>0){for(let f of e.children)ut(f,t);let r=cr(e);l=r.width,s=r.height,L.debug("setBlockSizes abc95 maxWidth of",e.id,":s children is ",l,s);for(let f of e.children)f.size&&(L.debug(`abc95 Setting size of children of ${e.id} id=${f.id} ${l} ${s} ${JSON.stringify(f.size)}`),f.size.width=l*(f.widthInColumns??1)+R*((f.widthInColumns??1)-1),f.size.height=s,f.size.x=0,f.size.y=0,L.debug(`abc95 updating size of ${e.id} children child:${f.id} maxWidth:${l} maxHeight:${s}`));for(let f of e.children)ut(f,t,l,s);let n=e.columns??-1,c=0;for(let f of e.children)c+=f.widthInColumns??1;let x=e.children.length;n>0&&n0?Math.min(e.children.length,n):e.children.length;if(f>0){let w=(u-f*R-R)/f;L.debug("abc95 (growing to fit) width",e.id,u,e.size?.width,w);for(let v of e.children)v.size&&(v.size.width=w)}}e.size={width:u,height:y,x:0,y:0}}L.debug("setBlockSizes abc94 (done)",e.id,e?.size?.x,e?.size?.width,e?.size?.y,e?.size?.height)}g(ut,"setBlockSizes");function It(e,t){L.debug(`abc85 layout blocks (=>layoutBlocks) ${e.id} x: ${e?.size?.x} y: ${e?.size?.y} width: ${e?.size?.width}`);let a=e.columns??-1;if(L.debug("layoutBlocks columns abc95",e.id,"=>",a,e),e.children&&e.children.length>0){let i=e?.children[0]?.size?.width??0,l=e.children.length*i+(e.children.length-1)*R;L.debug("widthOfChildren 88",l,"posX");let s=new Map;{let o=0;for(let u of e.children){if(!u.size)continue;let{py:y}=_t(a,o),f=s.get(y)??0;u.size.height>f&&s.set(y,u.size.height);let w=u?.widthInColumns??1;a>0&&(w=Math.min(w,a-o%a)),o+=w}}let r=new Map;{let o=0,u=[...s.keys()].sort((y,f)=>y-f);for(let y of u)r.set(y,o),o+=(s.get(y)??0)+R}let n=0;L.debug("abc91 block?.size?.x",e.id,e?.size?.x);let c=e?.size?.x?e?.size?.x+(-e?.size?.width/2||0):-R,x=0;for(let o of e.children){let u=e;if(!o.size)continue;let{width:y,height:f}=o.size,{px:w,py:v}=_t(a,n);if(v!=x&&(x=v,c=e?.size?.x?e?.size?.x+(-e?.size?.width/2||0):-R,L.debug("New row in layout for block",e.id," and child ",o.id,x)),L.debug(`abc89 layout blocks (child) id: ${o.id} Pos: ${n} (px, py) ${w},${v} (${u?.size?.x},${u?.size?.y}) parent: ${u.id} width: ${y}${R}`),u.size){let T=y/2;o.size.x=c+R+T,L.debug(`abc91 layout blocks (calc) px, pyid:${o.id} startingPos=X${c} new startingPosX${o.size.x} ${T} padding=${R} width=${y} halfWidth=${T} => x:${o.size.x} y:${o.size.y} ${o.widthInColumns} (width * (child?.w || 1)) / 2 ${y*(o?.widthInColumns??1)/2}`),c=o.size.x+T;let C=r.get(v)??0,B=s.get(v)??f;o.size.y=u.size.y-u.size.height/2+C+B/2+R,L.debug(`abc88 layout blocks (calc) px, pyid:${o.id}startingPosX${c}${R}${T}=>x:${o.size.x}y:${o.size.y}${o.widthInColumns}(width * (child?.w || 1)) / 2${y*(o?.widthInColumns??1)/2}`)}o.children&&It(o,t);let k=o?.widthInColumns??1;a>0&&(k=Math.min(k,a-n%a)),n+=k,L.debug("abc88 columnsPos",o,n)}}L.debug(`layout blocks (<==layoutBlocks) ${e.id} x: ${e?.size?.x} y: ${e?.size?.y} width: ${e?.size?.width}`)}g(It,"layoutBlocks");function Ct(e,{minX:t,minY:a,maxX:i,maxY:l}={minX:0,minY:0,maxX:0,maxY:0}){if(e.size&&e.id!=="root"){let{x:s,y:r,width:n,height:c}=e.size;s-n/2i&&(i=s+n/2),r+c/2>l&&(l=r+c/2)}if(e.children)for(let s of e.children)({minX:t,minY:a,maxX:i,maxY:l}=Ct(s,{minX:t,minY:a,maxX:i,maxY:l}));return{minX:t,minY:a,maxX:i,maxY:l}}g(Ct,"findBounds");function de(e){let t=e.getBlock("root");if(!t)return;ut(t,e,0,0),It(t,e),L.debug("getBlocks",JSON.stringify(t,null,2));let{minX:a,minY:i,maxX:l,maxY:s}=Ct(t),r=s-i,n=l-a;return{x:a,y:i,width:n,height:r}}g(de,"layout");var or=g((e,t,a,i=!1,l=!1)=>_(null,null,function*(){let s=t||"";typeof s=="object"&&(s=s[0]);let r=O(),n=F(r);return yield ht(e,s,{style:a,isTitle:i,useHtmlLabels:n,markdown:!1,isNode:l,width:Number.POSITIVE_INFINITY},r)}),"createLabel"),X=or,hr=g((e,t,a,i,l)=>{t.arrowTypeStart&&ee(e,"start",t.arrowTypeStart,a,i,l),t.arrowTypeEnd&&ee(e,"end",t.arrowTypeEnd,a,i,l)},"addEdgeMarkers"),gr={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},ee=g((e,t,a,i,l,s)=>{let r=gr[a];if(!r){L.warn(`Unknown arrow type: ${a}`);return}let n=t==="start"?"Start":"End";e.attr(`marker-${t}`,`url(${i}#${l}_${s}-${r}${n})`)},"addEdgeMarker"),Dt={},P={},dr=g((e,t)=>_(null,null,function*(){let a=O(),i=F(a),l=e.insert("g").attr("class","edgeLabel"),s=l.insert("g").attr("class","label"),r=t.labelType==="markdown",n=yield ht(e,t.label,{style:t.labelStyle,useHtmlLabels:i,addSvgBackground:r,isNode:!1,markdown:r,width:r?void 0:Number.POSITIVE_INFINITY},a);s.node().appendChild(n);let c=n.getBBox(),x=c;if(i){let u=n.children[0],y=D(n);c=u.getBoundingClientRect(),x=c,y.attr("width",c.width),y.attr("height",c.height)}else{let u=D(n).select("text").node();u&&typeof u.getBBox=="function"&&(x=u.getBBox())}s.attr("transform",et(x,i)),Dt[t.id]=l,t.width=c.width,t.height=c.height;let o;if(t.startLabelLeft){let u=e.insert("g").attr("class","edgeTerminals"),y=u.insert("g").attr("class","inner"),f=yield X(y,t.startLabelLeft,t.labelStyle);o=f;let w=f.getBBox();if(i){let v=f.children[0],k=D(f);w=v.getBoundingClientRect(),k.attr("width",w.width),k.attr("height",w.height)}y.attr("transform",et(w,i)),P[t.id]||(P[t.id]={}),P[t.id].startLeft=u,it(o,t.startLabelLeft)}if(t.startLabelRight){let u=e.insert("g").attr("class","edgeTerminals"),y=u.insert("g").attr("class","inner"),f=yield X(u,t.startLabelRight,t.labelStyle);o=f,y.node().appendChild(f);let w=f.getBBox();if(i){let v=f.children[0],k=D(f);w=v.getBoundingClientRect(),k.attr("width",w.width),k.attr("height",w.height)}y.attr("transform",et(w,i)),P[t.id]||(P[t.id]={}),P[t.id].startRight=u,it(o,t.startLabelRight)}if(t.endLabelLeft){let u=e.insert("g").attr("class","edgeTerminals"),y=u.insert("g").attr("class","inner"),f=yield X(y,t.endLabelLeft,t.labelStyle);o=f;let w=f.getBBox();if(i){let v=f.children[0],k=D(f);w=v.getBoundingClientRect(),k.attr("width",w.width),k.attr("height",w.height)}y.attr("transform",et(w,i)),u.node().appendChild(f),P[t.id]||(P[t.id]={}),P[t.id].endLeft=u,it(o,t.endLabelLeft)}if(t.endLabelRight){let u=e.insert("g").attr("class","edgeTerminals"),y=u.insert("g").attr("class","inner"),f=yield X(y,t.endLabelRight,t.labelStyle);o=f;let w=f.getBBox();if(i){let v=f.children[0],k=D(f);w=v.getBoundingClientRect(),k.attr("width",w.width),k.attr("height",w.height)}y.attr("transform",et(w,i)),u.node().appendChild(f),P[t.id]||(P[t.id]={}),P[t.id].endRight=u,it(o,t.endLabelRight)}return n}),"insertEdgeLabel");function it(e,t){F(O())&&e&&(e.style.width=t.length*9+"px",e.style.height="12px")}g(it,"setTerminalWidth");var ur=g((e,t)=>{L.debug("Moving label abc88 ",e.id,e.label,Dt[e.id],t);let a=t.updatedPath?t.updatedPath:t.originalPath,i=O(),{subGraphTitleTotalMargin:l}=Zt(i);if(e.label){let s=Dt[e.id],r=e.x,n=e.y;if(a){let c=rt.calcLabelPosition(a);L.debug("Moving label "+e.label+" from (",r,",",n,") to (",c.x,",",c.y,") abc88"),t.updatedPath&&(r=c.x,n=c.y)}s.attr("transform",`translate(${r}, ${n+l/2})`)}if(e.startLabelLeft){let s=P[e.id].startLeft,r=e.x,n=e.y;if(a){let c=rt.calcTerminalLabelPosition(e.arrowTypeStart?10:0,"start_left",a);r=c.x,n=c.y}s.attr("transform",`translate(${r}, ${n})`)}if(e.startLabelRight){let s=P[e.id].startRight,r=e.x,n=e.y;if(a){let c=rt.calcTerminalLabelPosition(e.arrowTypeStart?10:0,"start_right",a);r=c.x,n=c.y}s.attr("transform",`translate(${r}, ${n})`)}if(e.endLabelLeft){let s=P[e.id].endLeft,r=e.x,n=e.y;if(a){let c=rt.calcTerminalLabelPosition(e.arrowTypeEnd?10:0,"end_left",a);r=c.x,n=c.y}s.attr("transform",`translate(${r}, ${n})`)}if(e.endLabelRight){let s=P[e.id].endRight,r=e.x,n=e.y;if(a){let c=rt.calcTerminalLabelPosition(e.arrowTypeEnd?10:0,"end_right",a);r=c.x,n=c.y}s.attr("transform",`translate(${r}, ${n})`)}},"positionEdgeLabel"),pr=g((e,t)=>{let a=e.x,i=e.y,l=Math.abs(t.x-a),s=Math.abs(t.y-i),r=e.width/2,n=e.height/2;return l>=r||s>=n},"outsideNode"),fr=g((e,t,a)=>{L.debug(`intersection calc abc89: - outsidePoint: ${JSON.stringify(t)} - insidePoint : ${JSON.stringify(a)} - node : x:${e.x} y:${e.y} w:${e.width} h:${e.height}`);let i=e.x,l=e.y,s=Math.abs(i-a.x),r=e.width/2,n=a.xMath.abs(i-t.x)*c){let u=a.y{L.debug("abc88 cutPathAtIntersect",e,t);let a=[],i=e[0],l=!1;return e.forEach(s=>{if(!pr(t,s)&&!l){let r=fr(t,i,s),n=!1;a.forEach(c=>{n=n||c.x===r.x&&c.y===r.y}),a.some(c=>c.x===r.x&&c.y===r.y)||a.push(r),l=!0}else i=s,l||a.push(s)}),a},"cutPathAtIntersect"),xr=g(function(e,t,a,i,l,s,r){let n=a.points;L.debug("abc88 InsertEdge: edge=",a,"e=",t);let c=!1,x=s.node(t.v);var o=s.node(t.w);o?.intersect&&x?.intersect&&(n=n.slice(1,a.points.length-1),n.unshift(x.intersect(n[0])),n.push(o.intersect(n[n.length-1]))),a.toCluster&&(L.debug("to cluster abc88",i[a.toCluster]),n=re(a.points,i[a.toCluster].node),c=!0),a.fromCluster&&(L.debug("from cluster abc88",i[a.fromCluster]),n=re(n.reverse(),i[a.fromCluster].node).reverse(),c=!0);let u=n.filter(m=>!Number.isNaN(m.y)),y=Xt;a.curve&&(l==="graph"||l==="flowchart")&&(y=a.curve);let{x:f,y:w}=jt(a),v=Ut().x(f).y(w).curve(y),k;switch(a.thickness){case"normal":k="edge-thickness-normal";break;case"thick":k="edge-thickness-thick";break;case"invisible":k="edge-thickness-thick";break;default:k=""}switch(a.pattern){case"solid":k+=" edge-pattern-solid";break;case"dotted":k+=" edge-pattern-dotted";break;case"dashed":k+=" edge-pattern-dashed";break}let T=e.append("path").attr("d",v(u)).attr("id",a.id).attr("class"," "+k+(a.classes?" "+a.classes:"")).attr("style",a.style),C="";(O().flowchart.arrowMarkerAbsolute||O().state.arrowMarkerAbsolute)&&(C=Wt(!0)),hr(T,a,C,r,l);let B={};return c&&(B.updatedPath=n),B.originalPath=a.points,B},"insertEdge"),br=g(e=>{let t=new Set;for(let a of e)switch(a){case"x":t.add("right"),t.add("left");break;case"y":t.add("up"),t.add("down");break;default:t.add(a);break}return t},"expandAndDeduplicateDirections"),yr=g((e,t,a)=>{let i=br(e),l=2,s=t.height+2*a.padding,r=s/l,n=t.width+2*r+a.padding,c=a.padding/2;return i.has("right")&&i.has("left")&&i.has("up")&&i.has("down")?[{x:0,y:0},{x:r,y:0},{x:n/2,y:2*c},{x:n-r,y:0},{x:n,y:0},{x:n,y:-s/3},{x:n+2*c,y:-s/2},{x:n,y:-2*s/3},{x:n,y:-s},{x:n-r,y:-s},{x:n/2,y:-s-2*c},{x:r,y:-s},{x:0,y:-s},{x:0,y:-2*s/3},{x:-2*c,y:-s/2},{x:0,y:-s/3}]:i.has("right")&&i.has("left")&&i.has("up")?[{x:r,y:0},{x:n-r,y:0},{x:n,y:-s/2},{x:n-r,y:-s},{x:r,y:-s},{x:0,y:-s/2}]:i.has("right")&&i.has("left")&&i.has("down")?[{x:0,y:0},{x:r,y:-s},{x:n-r,y:-s},{x:n,y:0}]:i.has("right")&&i.has("up")&&i.has("down")?[{x:0,y:0},{x:n,y:-r},{x:n,y:-s+r},{x:0,y:-s}]:i.has("left")&&i.has("up")&&i.has("down")?[{x:n,y:0},{x:0,y:-r},{x:0,y:-s+r},{x:n,y:-s}]:i.has("right")&&i.has("left")?[{x:r,y:0},{x:r,y:-c},{x:n-r,y:-c},{x:n-r,y:0},{x:n,y:-s/2},{x:n-r,y:-s},{x:n-r,y:-s+c},{x:r,y:-s+c},{x:r,y:-s},{x:0,y:-s/2}]:i.has("up")&&i.has("down")?[{x:n/2,y:0},{x:0,y:-c},{x:r,y:-c},{x:r,y:-s+c},{x:0,y:-s+c},{x:n/2,y:-s},{x:n,y:-s+c},{x:n-r,y:-s+c},{x:n-r,y:-c},{x:n,y:-c}]:i.has("right")&&i.has("up")?[{x:0,y:0},{x:n,y:-r},{x:0,y:-s}]:i.has("right")&&i.has("down")?[{x:0,y:0},{x:n,y:0},{x:0,y:-s}]:i.has("left")&&i.has("up")?[{x:n,y:0},{x:0,y:-r},{x:n,y:-s}]:i.has("left")&&i.has("down")?[{x:n,y:0},{x:0,y:0},{x:n,y:-s}]:i.has("right")?[{x:r,y:-c},{x:r,y:-c},{x:n-r,y:-c},{x:n-r,y:0},{x:n,y:-s/2},{x:n-r,y:-s},{x:n-r,y:-s+c},{x:r,y:-s+c},{x:r,y:-s+c}]:i.has("left")?[{x:r,y:0},{x:r,y:-c},{x:n-r,y:-c},{x:n-r,y:-s+c},{x:r,y:-s+c},{x:r,y:-s},{x:0,y:-s/2}]:i.has("up")?[{x:r,y:-c},{x:r,y:-s+c},{x:0,y:-s+c},{x:n/2,y:-s},{x:n,y:-s+c},{x:n-r,y:-s+c},{x:n-r,y:-c}]:i.has("down")?[{x:n/2,y:0},{x:0,y:-c},{x:r,y:-c},{x:r,y:-s+c},{x:n-r,y:-s+c},{x:n-r,y:-c},{x:n,y:-c}]:[{x:0,y:0}]},"getArrowPoints");function ue(e,t){return e.intersect(t)}g(ue,"intersectNode");var mr=ue;function pe(e,t,a,i){var l=e.x,s=e.y,r=l-i.x,n=s-i.y,c=Math.sqrt(t*t*n*n+a*a*r*r),x=Math.abs(t*a*r/c);i.x0}g(Tt,"sameSign");var kr=be,Lr=ye;function ye(e,t,a){var i=e.x,l=e.y,s=[],r=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY;typeof t.forEach=="function"?t.forEach(function(w){r=Math.min(r,w.x),n=Math.min(n,w.y)}):(r=Math.min(r,t.x),n=Math.min(n,t.y));for(var c=i-e.width/2-r,x=l-e.height/2-n,o=0;o1&&s.sort(function(w,v){var k=w.x-a.x,T=w.y-a.y,C=Math.sqrt(k*k+T*T),B=v.x-a.x,m=v.y-a.y,d=Math.sqrt(B*B+m*m);return C{var a=e.x,i=e.y,l=t.x-a,s=t.y-i,r=e.width/2,n=e.height/2,c,x;return Math.abs(s)*r>Math.abs(l)*n?(s<0&&(n=-n),c=s===0?0:n*l/s,x=n):(l<0&&(r=-r),c=r,x=l===0?0:r*s/l),{x:a+c,y:i+x}},"intersectRect"),vr=Sr,N={node:mr,circle:wr,ellipse:fe,polygon:Lr,rect:vr},M=g((e,t,a,i)=>_(null,null,function*(){let l=O(),s,r=t.useHtmlLabels||F(l);a?s=a:s="node default";let n=e.insert("g").attr("class",s).attr("id",t.domId||t.id),c=n.insert("g").attr("class","label").attr("style",t.labelStyle),x;t.labelText===void 0?x="":x=typeof t.labelText=="string"?t.labelText:t.labelText[0];let o;t.labelType==="markdown"?o=ht(c,kt(Lt(x),l),{useHtmlLabels:r,width:t.width||l.flowchart.wrappingWidth,classes:"markdown-node-label"},l):o=yield X(c,kt(Lt(x),l),t.labelStyle,!1,i);let u=o.getBBox(),y=t.padding/2;if(F(l)){let f=o.children[0],w=D(o);yield Gt(f,x),u=f.getBoundingClientRect(),w.attr("width",u.width),w.attr("height",u.height)}return r?c.attr("transform","translate("+-u.width/2+", "+-u.height/2+")"):c.attr("transform","translate(0, "+-u.height/2+")"),t.centerLabel&&c.attr("transform","translate("+-u.width/2+", "+-u.height/2+")"),c.insert("rect",":first-child"),{shapeSvg:n,bbox:u,halfPadding:y,label:c}}),"labelHelper"),I=g((e,t)=>{let a=t.node().getBBox();e.width=a.width,e.height=a.height},"updateNodeBounds");function V(e,t,a,i){return e.insert("polygon",":first-child").attr("points",i.map(function(l){return l.x+","+l.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-t/2+","+a/2+")")}g(V,"insertPolygonShape");var Er=g((e,t)=>_(null,null,function*(){t.useHtmlLabels||F(O())||(t.centerLabel=!0);let{shapeSvg:i,bbox:l,halfPadding:s}=yield M(e,t,"node "+t.classes,!0);L.info("Classes = ",t.classes);let r=i.insert("rect",":first-child");return r.attr("rx",t.rx).attr("ry",t.ry).attr("x",-l.width/2-s).attr("y",-l.height/2-s).attr("width",l.width+t.padding).attr("height",l.height+t.padding),I(t,r),t.intersect=function(n){return N.rect(t,n)},i}),"note"),_r=Er,ae=g(e=>e?" "+e:"","formatClass"),K=g((e,t)=>`${t||"node default"}${ae(e.classes)} ${ae(e.class)}`,"getClassesFromNode"),se=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=l+s,n=[{x:r/2,y:0},{x:r,y:-r/2},{x:r/2,y:-r},{x:0,y:-r/2}];L.info("Question main (Circle)");let c=V(a,r,r,n);return c.attr("style",t.style),I(t,c),t.intersect=function(x){return L.warn("Intersect called"),N.polygon(t,n,x)},a}),"question"),Dr=g((e,t)=>{let a=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),i=28,l=[{x:0,y:i/2},{x:i/2,y:0},{x:0,y:-i/2},{x:-i/2,y:0}];return a.insert("polygon",":first-child").attr("points",l.map(function(r){return r.x+","+r.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),t.width=28,t.height=28,t.intersect=function(r){return N.circle(t,14,r)},a},"choice"),Tr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=4,s=i.height+t.padding,r=s/l,n=i.width+2*r+t.padding,c=[{x:r,y:0},{x:n-r,y:0},{x:n,y:-s/2},{x:n-r,y:-s},{x:r,y:-s},{x:0,y:-s/2}],x=V(a,n,s,c);return x.attr("style",t.style),I(t,x),t.intersect=function(o){return N.polygon(t,c,o)},a}),"hexagon"),Br=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,void 0,!0),l=2,s=i.height+2*t.padding,r=s/l,n=i.width+2*r+t.padding,c=yr(t.directions,i,t),x=V(a,n,s,c);return x.attr("style",t.style),I(t,x),t.intersect=function(o){return N.polygon(t,c,o)},a}),"block_arrow"),Nr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:-s/2,y:0},{x:l,y:0},{x:l,y:-s},{x:-s/2,y:-s},{x:0,y:-s/2}];return V(a,l,s,r).attr("style",t.style),t.width=l+s,t.height=s,t.intersect=function(c){return N.polygon(t,r,c)},a}),"rect_left_inv_arrow"),Ir=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:-2*s/6,y:0},{x:l-s/6,y:0},{x:l+2*s/6,y:-s},{x:s/6,y:-s}],n=V(a,l,s,r);return n.attr("style",t.style),I(t,n),t.intersect=function(c){return N.polygon(t,r,c)},a}),"lean_right"),Cr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:2*s/6,y:0},{x:l+s/6,y:0},{x:l-2*s/6,y:-s},{x:-s/6,y:-s}],n=V(a,l,s,r);return n.attr("style",t.style),I(t,n),t.intersect=function(c){return N.polygon(t,r,c)},a}),"lean_left"),Or=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:-2*s/6,y:0},{x:l+2*s/6,y:0},{x:l-s/6,y:-s},{x:s/6,y:-s}],n=V(a,l,s,r);return n.attr("style",t.style),I(t,n),t.intersect=function(c){return N.polygon(t,r,c)},a}),"trapezoid"),Rr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:s/6,y:0},{x:l-s/6,y:0},{x:l+2*s/6,y:-s},{x:-2*s/6,y:-s}],n=V(a,l,s,r);return n.attr("style",t.style),I(t,n),t.intersect=function(c){return N.polygon(t,r,c)},a}),"inv_trapezoid"),zr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:0,y:0},{x:l+s/2,y:0},{x:l,y:-s/2},{x:l+s/2,y:-s},{x:0,y:-s}],n=V(a,l,s,r);return n.attr("style",t.style),I(t,n),t.intersect=function(c){return N.polygon(t,r,c)},a}),"rect_right_inv_arrow"),Ar=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=l/2,r=s/(2.5+l/50),n=i.height+r+t.padding,c="M 0,"+r+" a "+s+","+r+" 0,0,0 "+l+" 0 a "+s+","+r+" 0,0,0 "+-l+" 0 l 0,"+n+" a "+s+","+r+" 0,0,0 "+l+" 0 l 0,"+-n,x=a.attr("label-offset-y",r).insert("path",":first-child").attr("style",t.style).attr("d",c).attr("transform","translate("+-l/2+","+-(n/2+r)+")");return I(t,x),t.intersect=function(o){let u=N.rect(t,o),y=u.x-t.x;if(s!=0&&(Math.abs(y)t.height/2-r)){let f=r*r*(1-y*y/(s*s));f!=0&&(f=Math.sqrt(f)),f=r-f,o.y-t.y>0&&(f=-f),u.y+=f}return u},a}),"cylinder"),Mr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i,halfPadding:l}=yield M(e,t,"node "+t.classes+" "+t.class,!0),s=a.insert("rect",":first-child"),r=t.positioned?t.width:i.width+t.padding,n=t.positioned?t.height:i.height+t.padding,c=t.positioned?-r/2:-i.width/2-l,x=t.positioned?-n/2:-i.height/2-l;if(s.attr("class","basic label-container").attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("x",c).attr("y",x).attr("width",r).attr("height",n),t.props){let o=new Set(Object.keys(t.props));t.props.borders&&(pt(s,t.props.borders,r,n),o.delete("borders")),o.forEach(u=>{L.warn(`Unknown node property ${u}`)})}return I(t,s),t.intersect=function(o){return N.rect(t,o)},a}),"rect"),Fr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i,halfPadding:l}=yield M(e,t,"node "+t.classes,!0),s=a.insert("rect",":first-child"),r=t.positioned?t.width:i.width+t.padding,n=t.positioned?t.height:i.height+t.padding,c=t.positioned?-r/2:-i.width/2-l,x=t.positioned?-n/2:-i.height/2-l;if(s.attr("class","basic cluster composite label-container").attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("x",c).attr("y",x).attr("width",r).attr("height",n),t.props){let o=new Set(Object.keys(t.props));t.props.borders&&(pt(s,t.props.borders,r,n),o.delete("borders")),o.forEach(u=>{L.warn(`Unknown node property ${u}`)})}return I(t,s),t.intersect=function(o){return N.rect(t,o)},a}),"composite"),Pr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a}=yield M(e,t,"label",!0);L.trace("Classes = ",t.class);let i=a.insert("rect",":first-child"),l=0,s=0;if(i.attr("width",l).attr("height",s),a.attr("class","label edgeLabel"),t.props){let r=new Set(Object.keys(t.props));t.props.borders&&(pt(i,t.props.borders,l,s),r.delete("borders")),r.forEach(n=>{L.warn(`Unknown node property ${n}`)})}return I(t,i),t.intersect=function(r){return N.rect(t,r)},a}),"labelRect");function pt(e,t,a,i){let l=[],s=g(n=>{l.push(n,0)},"addBorder"),r=g(n=>{l.push(0,n)},"skipBorder");t.includes("t")?(L.debug("add top border"),s(a)):r(a),t.includes("r")?(L.debug("add right border"),s(i)):r(i),t.includes("b")?(L.debug("add bottom border"),s(a)):r(a),t.includes("l")?(L.debug("add left border"),s(i)):r(i),e.attr("stroke-dasharray",l.join(" "))}g(pt,"applyNodePropertyBorders");var Wr=g((e,t)=>_(null,null,function*(){let a;t.classes?a="node "+t.classes:a="node default";let i=e.insert("g").attr("class",a).attr("id",t.domId||t.id),l=i.insert("rect",":first-child"),s=i.insert("line"),r=i.insert("g").attr("class","label"),n=t.labelText.flat?t.labelText.flat():t.labelText,c="";typeof n=="object"?c=n[0]:c=n,L.info("Label text abc79",c,n,typeof n=="object");let x=yield X(r,c,t.labelStyle,!0,!0),o={width:0,height:0};if(F(O())){let v=x.children[0],k=D(x);o=v.getBoundingClientRect(),k.attr("width",o.width),k.attr("height",o.height)}L.info("Text 2",n);let u=n.slice(1,n.length),y=x.getBBox(),f=yield X(r,u.join?u.join("
"):u,t.labelStyle,!0,!0);if(F(O())){let v=f.children[0],k=D(f);o=v.getBoundingClientRect(),k.attr("width",o.width),k.attr("height",o.height)}let w=t.padding/2;return D(f).attr("transform","translate( "+(o.width>y.width?0:(y.width-o.width)/2)+", "+(y.height+w+5)+")"),D(x).attr("transform","translate( "+(o.width_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.height+t.padding,s=i.width+l/4+t.padding,r=a.insert("rect",":first-child").attr("style",t.style).attr("rx",l/2).attr("ry",l/2).attr("x",-s/2).attr("y",-l/2).attr("width",s).attr("height",l);return I(t,r),t.intersect=function(n){return N.rect(t,n)},a}),"stadium"),Hr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i,halfPadding:l}=yield M(e,t,K(t,void 0),!0),s=a.insert("circle",":first-child");return s.attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("r",i.width/2+l).attr("width",i.width+t.padding).attr("height",i.height+t.padding),L.info("Circle main"),I(t,s),t.intersect=function(r){return L.info("Circle intersect",t,i.width/2+l,r),N.circle(t,i.width/2+l,r)},a}),"circle"),Kr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i,halfPadding:l}=yield M(e,t,K(t,void 0),!0),s=5,r=a.insert("g",":first-child"),n=r.insert("circle"),c=r.insert("circle");return r.attr("class",t.class),n.attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("r",i.width/2+l+s).attr("width",i.width+t.padding+s*2).attr("height",i.height+t.padding+s*2),c.attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("r",i.width/2+l).attr("width",i.width+t.padding).attr("height",i.height+t.padding),L.info("DoubleCircle main"),I(t,n),t.intersect=function(x){return L.info("DoubleCircle intersect",t,i.width/2+l+s,x),N.circle(t,i.width/2+l+s,x)},a}),"doublecircle"),Ur=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:0,y:0},{x:l,y:0},{x:l,y:-s},{x:0,y:-s},{x:0,y:0},{x:-8,y:0},{x:l+8,y:0},{x:l+8,y:-s},{x:-8,y:-s},{x:-8,y:0}],n=V(a,l,s,r);return n.attr("style",t.style),I(t,n),t.intersect=function(c){return N.polygon(t,r,c)},a}),"subroutine"),Xr=g((e,t)=>{let a=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),i=a.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),I(t,i),t.intersect=function(l){return N.circle(t,7,l)},a},"start"),ie=g((e,t,a)=>{let i=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),l=70,s=10;a==="LR"&&(l=10,s=70);let r=i.append("rect").attr("x",-1*l/2).attr("y",-1*s/2).attr("width",l).attr("height",s).attr("class","fork-join");return I(t,r),t.height=t.height+t.padding/2,t.width=t.width+t.padding/2,t.intersect=function(n){return N.rect(t,n)},i},"forkJoin"),jr=g((e,t)=>{let a=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),i=a.insert("circle",":first-child"),l=a.insert("circle",":first-child");return l.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),i.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),I(t,l),t.intersect=function(s){return N.circle(t,7,s)},a},"end"),Vr=g((e,t)=>_(null,null,function*(){let a=t.padding/2,i=4,l=8,s;t.classes?s="node "+t.classes:s="node default";let r=e.insert("g").attr("class",s).attr("id",t.domId||t.id),n=r.insert("rect",":first-child"),c=r.insert("line"),x=r.insert("line"),o=0,u=i,y=r.insert("g").attr("class","label"),f=0,w=t.classData.annotations?.[0],v=t.classData.annotations[0]?"\xAB"+t.classData.annotations[0]+"\xBB":"",k=yield X(y,v,t.labelStyle,!0,!0),T=k.getBBox();if(F(O())){let E=k.children[0],h=D(k);T=E.getBoundingClientRect(),h.attr("width",T.width),h.attr("height",T.height)}t.classData.annotations[0]&&(u+=T.height+i,o+=T.width);let C=t.classData.label;t.classData.type!==void 0&&t.classData.type!==""&&(F(O())?C+="<"+t.classData.type+">":C+="<"+t.classData.type+">");let B=yield X(y,C,t.labelStyle,!0,!0);D(B).attr("class","classTitle");let m=B.getBBox();if(F(O())){let E=B.children[0],h=D(B);m=E.getBoundingClientRect(),h.attr("width",m.width),h.attr("height",m.height)}u+=m.height+i,m.width>o&&(o=m.width);let d=[];t.classData.members.forEach(E=>_(null,null,function*(){let h=E.getDisplayDetails(),Y=h.displayText;F(O())&&(Y=Y.replace(//g,">"));let p=yield X(y,Y,h.cssStyle?h.cssStyle:t.labelStyle,!0,!0),z=p.getBBox();if(F(O())){let q=p.children[0],Z=D(p);z=q.getBoundingClientRect(),Z.attr("width",z.width),Z.attr("height",z.height)}z.width>o&&(o=z.width),u+=z.height+i,d.push(p)})),u+=l;let b=[];if(t.classData.methods.forEach(E=>_(null,null,function*(){let h=E.getDisplayDetails(),Y=h.displayText;F(O())&&(Y=Y.replace(//g,">"));let p=yield X(y,Y,h.cssStyle?h.cssStyle:t.labelStyle,!0,!0),z=p.getBBox();if(F(O())){let q=p.children[0],Z=D(p);z=q.getBoundingClientRect(),Z.attr("width",z.width),Z.attr("height",z.height)}z.width>o&&(o=z.width),u+=z.height+i,b.push(p)})),u+=l,w){let E=(o-T.width)/2;D(k).attr("transform","translate( "+(-1*o/2+E)+", "+-1*u/2+")"),f=T.height+i}let S=(o-m.width)/2;return D(B).attr("transform","translate( "+(-1*o/2+S)+", "+(-1*u/2+f)+")"),f+=m.height+i,c.attr("class","divider").attr("x1",-o/2-a).attr("x2",o/2+a).attr("y1",-u/2-a+l+f).attr("y2",-u/2-a+l+f),f+=l,d.forEach(E=>{D(E).attr("transform","translate( "+-o/2+", "+(-1*u/2+f+l/2)+")");let h=E?.getBBox();f+=(h?.height??0)+i}),f+=l,x.attr("class","divider").attr("x1",-o/2-a).attr("x2",o/2+a).attr("y1",-u/2-a+l+f).attr("y2",-u/2-a+l+f),f+=l,b.forEach(E=>{D(E).attr("transform","translate( "+-o/2+", "+(-1*u/2+f)+")");let h=E?.getBBox();f+=(h?.height??0)+i}),n.attr("style",t.style).attr("class","outer title-state").attr("x",-o/2-a).attr("y",-(u/2)-a).attr("width",o+t.padding).attr("height",u+t.padding),I(t,n),t.intersect=function(E){return N.rect(t,E)},r}),"class_box"),ne={rhombus:se,composite:Fr,question:se,rect:Mr,labelRect:Pr,rectWithTitle:Wr,choice:Dr,circle:Hr,doublecircle:Kr,stadium:Yr,hexagon:Tr,block_arrow:Br,rect_left_inv_arrow:Nr,lean_right:Ir,lean_left:Cr,trapezoid:Or,inv_trapezoid:Rr,rect_right_inv_arrow:zr,cylinder:Ar,start:Xr,end:jr,note:_r,subroutine:Ur,fork:ie,join:ie,class_box:Vr},gt={},me=g((e,t,a)=>_(null,null,function*(){let i,l;if(t.link){let s;O().securityLevel==="sandbox"?s="_top":t.linkTarget&&(s=t.linkTarget||"_blank"),i=e.insert("svg:a").attr("xlink:href",t.link).attr("target",s),l=yield ne[t.shape](i,t,a)}else l=yield ne[t.shape](e,t,a),i=l;return t.tooltip&&l.attr("title",t.tooltip),t.class&&l.attr("class","node default "+t.class),gt[t.id]=i,t.haveCallback&>[t.id].attr("class",gt[t.id].attr("class")+" clickable"),i}),"insertNode"),Zr=g(e=>{let t=gt[e.id];L.trace("Transforming node",e.diff,e,"translate("+(e.x-e.width/2-5)+", "+e.width/2+")");let a=8,i=e.diff||0;return e.clusterNode?t.attr("transform","translate("+(e.x+i-e.width/2)+", "+(e.y-e.height/2-a)+")"):t.attr("transform","translate("+e.x+", "+e.y+")"),i},"positionNode");function Ot(e,t,a=!1){let i=e,l="default";(i?.classes?.length||0)>0&&(l=(i?.classes??[]).join(" ")),l=l+" flowchart-label";let s=0,r="",n;switch(i.type){case"round":s=5,r="rect";break;case"composite":s=0,r="composite",n=0;break;case"square":r="rect";break;case"diamond":r="question";break;case"hexagon":r="hexagon";break;case"block_arrow":r="block_arrow";break;case"odd":r="rect_left_inv_arrow";break;case"lean_right":r="lean_right";break;case"lean_left":r="lean_left";break;case"trapezoid":r="trapezoid";break;case"inv_trapezoid":r="inv_trapezoid";break;case"rect_left_inv_arrow":r="rect_left_inv_arrow";break;case"circle":r="circle";break;case"ellipse":r="ellipse";break;case"stadium":r="stadium";break;case"subroutine":r="subroutine";break;case"cylinder":r="cylinder";break;case"group":r="rect";break;case"doublecircle":r="doublecircle";break;default:r="rect"}let c=Vt(i?.styles??[]),x=i.label,o=i.size??{width:0,height:0,x:0,y:0};return{labelStyle:c.labelStyle,shape:r,labelText:x,rx:s,ry:s,class:l,style:c.style,id:i.id,directions:i.directions,width:o.width,height:o.height,x:o.x,y:o.y,positioned:a,intersect:void 0,type:i.type,padding:n??tt()?.block?.padding??0}}g(Ot,"getNodeFromBlock");function we(e,t,a){return _(this,null,function*(){let i=Ot(t,a,!1);if(i.type==="group")return;let l=tt(),s=yield me(e,i,{config:l}),r=s.node().getBBox(),n=a.getBlock(i.id);n.size={width:r.width,height:r.height,x:0,y:0,node:s},a.setBlock(n),s.remove()})}g(we,"calculateBlockSize");function ke(e,t,a){return _(this,null,function*(){let i=Ot(t,a,!0);if(a.getBlock(i.id).type!=="space"){let s=tt();yield me(e,i,{config:s}),t.intersect=i?.intersect,Zr(i)}})}g(ke,"insertBlockPositioned");function ft(e,t,a,i){return _(this,null,function*(){for(let l of t)yield i(e,l,a),l.children&&(yield ft(e,l.children,a,i))})}g(ft,"performOperations");function Le(e,t,a){return _(this,null,function*(){yield ft(e,t,a,we)})}g(Le,"calculateBlockSizes");function Se(e,t,a){return _(this,null,function*(){yield ft(e,t,a,ke)})}g(Se,"insertBlocks");function ve(e,t,a,i,l){return _(this,null,function*(){let s=new qt({multigraph:!0,compound:!0});s.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(let r of a)r.size&&s.setNode(r.id,{width:r.size.width,height:r.size.height,intersect:r.intersect});for(let r of t)if(r.start&&r.end){let n=i.getBlock(r.start),c=i.getBlock(r.end);if(n?.size&&c?.size){let x=n.size,o=c.size,u=[{x:x.x,y:x.y},{x:x.x+(o.x-x.x)/2,y:x.y+(o.y-x.y)/2},{x:o.x,y:o.y}];xr(e,{v:r.start,w:r.end,name:r.id},st(at({},r),{arrowTypeEnd:r.arrowTypeEnd,arrowTypeStart:r.arrowTypeStart,points:u,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"}),void 0,"block",s,l),r.label&&(yield dr(e,st(at({},r),{label:r.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:r.arrowTypeEnd,arrowTypeStart:r.arrowTypeStart,points:u,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"})),ur(st(at({},r),{x:u[1].x,y:u[1].y}),{originalPath:u}))}}})}g(ve,"insertEdges");var Gr=g(function(e,t){return t.db.getClasses()},"getClasses"),qr=g(function(e,t,a,i){return _(this,null,function*(){let{securityLevel:l,block:s}=tt(),r=i.db,n;l==="sandbox"&&(n=D("#i"+t));let c=l==="sandbox"?D(n.nodes()[0].contentDocument.body):D("body"),x=l==="sandbox"?c.select(`[id="${t}"]`):D(`[id="${t}"]`);lr(x,["point","circle","cross"],i.type,t);let u=r.getBlocks(),y=r.getBlocksFlat(),f=r.getEdges(),w=x.insert("g").attr("class","block");yield Le(w,u,r);let v=de(r);if(yield Se(w,u,r),yield ve(w,f,y,r,t),v){let k=v,T=Math.max(1,Math.round(.125*(k.width/k.height))),C=k.height+T+10,B=k.width+10,{useMaxWidth:m}=s;Ht(x,C,B,!!m),L.debug("Here Bounds",v,k),x.attr("viewBox",`${k.x-5} ${k.y-5} ${k.width+10} ${k.height+10}`)}})},"draw"),Jr={draw:qr,getClasses:Gr},ua={parser:Te,db:Ve,renderer:Jr,styles:Ge};export{ua as diagram}; diff --git a/src/google/adk/cli/browser/chunk-27SWUPRL.js b/src/google/adk/cli/browser/chunk-27SWUPRL.js deleted file mode 100644 index 470236667f..0000000000 --- a/src/google/adk/cli/browser/chunk-27SWUPRL.js +++ /dev/null @@ -1,261 +0,0 @@ -import"./chunk-RMXJBC7V.js";var z=class r extends Error{constructor(e,t){var a="KaTeX parse error: "+e,n,l,u=t&&t.loc;if(u&&u.start<=u.end){var h=u.lexer.input;n=u.start,l=u.end,n===h.length?a+=" at end of input: ":a+=" at position "+(n+1)+": ";var c=h.slice(n,l).replace(/[^]/g,"$&\u0332"),v;n>15?v="\u2026"+h.slice(n-15,n):v=h.slice(0,n);var g;l+15r.replace(H1,"-$1").toLowerCase(),N1={"&":"&",">":">","<":"<",'"':""","'":"'"},O1=/[&><"']/g,n0=r=>String(r).replace(O1,e=>N1[e]),Ee=r=>r.type==="ordgroup"||r.type==="color"?r.body.length===1?Ee(r.body[0]):r:r.type==="font"?Ee(r.body):r,F1=new Set(["mathord","textord","atom"]),q0=r=>F1.has(Ee(r).type),L1=r=>{var e=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(r);return e?e[2]!==":"||!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(e[1])?null:e[1].toLowerCase():"_relative"},vt={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:r=>"#"+r},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(r,e)=>(e.push(r),e)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:r=>Math.max(0,r),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:r=>Math.max(0,r),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:r=>Math.max(0,r),cli:"-e, --max-expand ",cliProcessor:r=>r==="Infinity"?1/0:parseInt(r)},globalGroup:{type:"boolean",cli:!1}};function P1(r){if("default"in r)return r.default;var e=r.type,t=Array.isArray(e)?e[0]:e;if(typeof t!="string")return t.enum[0];switch(t){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}var me=class{constructor(e){e===void 0&&(e={}),e=e||{};for(var t of Object.keys(vt)){var a=vt[t],n=e[t];this[t]=n!==void 0?a.processor?a.processor(n):n:P1(a)}}reportNonstrict(e,t,a){var n=this.strict;if(typeof n=="function"&&(n=n(e,t,a)),!(!n||n==="ignore")){if(n===!0||n==="error")throw new z("LaTeX-incompatible input and strict mode is set to 'error': "+(t+" ["+e+"]"),a);n==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(t+" ["+e+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+n+"': "+t+" ["+e+"]"))}}useStrictBehavior(e,t,a){var n=this.strict;if(typeof n=="function")try{n=n(e,t,a)}catch(l){n="error"}return!n||n==="ignore"?!1:n===!0||n==="error"?!0:n==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(t+" ["+e+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+n+"': "+t+" ["+e+"]")),!1)}isTrusted(e){if("url"in e&&e.url&&!e.protocol){var t=L1(e.url);if(t==null)return!1;e.protocol=t}var a=typeof this.trust=="function"?this.trust(e):this.trust;return!!a}},w0=class{constructor(e,t,a){this.id=e,this.size=t,this.cramped=a}sup(){return k0[G1[this.id]]}sub(){return k0[U1[this.id]]}fracNum(){return k0[V1[this.id]]}fracDen(){return k0[X1[this.id]]}cramp(){return k0[Y1[this.id]]}text(){return k0[W1[this.id]]}isTight(){return this.size>=2}},Rt=0,He=1,_0=2,C0=3,ce=4,p0=5,ee=6,s0=7,k0=[new w0(Rt,0,!1),new w0(He,0,!0),new w0(_0,1,!1),new w0(C0,1,!0),new w0(ce,2,!1),new w0(p0,2,!0),new w0(ee,3,!1),new w0(s0,3,!0)],G1=[ce,p0,ce,p0,ee,s0,ee,s0],U1=[p0,p0,p0,p0,s0,s0,s0,s0],V1=[_0,C0,ce,p0,ee,s0,ee,s0],X1=[C0,C0,p0,p0,s0,s0,s0,s0],Y1=[He,He,C0,C0,p0,p0,s0,s0],W1=[Rt,He,_0,C0,_0,C0,_0,C0],H={DISPLAY:k0[Rt],TEXT:k0[_0],SCRIPT:k0[ce],SCRIPTSCRIPT:k0[ee]},pt=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];function $1(r){for(var e=0;e=n[0]&&r<=n[1])return t.name}return null}var Ie=[];pt.forEach(r=>r.blocks.forEach(e=>Ie.push(...e)));function Rr(r){for(var e=0;e=Ie[e]&&r<=Ie[e+1])return!0;return!1}var Q0=80,j1=function(e,t){return"M95,"+(622+e+t)+` -c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 -c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 -c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10 -s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429 -c69,-144,104.5,-217.7,106.5,-221 -l`+e/2.075+" -"+e+` -c5.3,-9.3,12,-14,20,-14 -H400000v`+(40+e)+`H845.2724 -s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7 -c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z -M`+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"},Z1=function(e,t){return"M263,"+(601+e+t)+`c0.7,0,18,39.7,52,119 -c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120 -c340,-704.7,510.7,-1060.3,512,-1067 -l`+e/2.084+" -"+e+` -c4.7,-7.3,11,-11,19,-11 -H40000v`+(40+e)+`H1012.3 -s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232 -c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1 -s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26 -c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z -M`+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"},K1=function(e,t){return"M983 "+(10+e+t)+` -l`+e/3.13+" -"+e+` -c4,-6.7,10,-10,18,-10 H400000v`+(40+e)+` -H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7 -s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744 -c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30 -c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722 -c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5 -c53.7,-170.3,84.5,-266.8,92.5,-289.5z -M`+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"},J1=function(e,t){return"M424,"+(2398+e+t)+` -c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514 -c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20 -s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121 -s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081 -l`+e/4.223+" -"+e+`c4,-6.7,10,-10,18,-10 H400000 -v`+(40+e)+`H1014.6 -s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185 -c-2,6,-10,9,-24,9 -c-8,0,-12,-0.7,-12,-2z M`+(1001+e)+" "+t+` -h400000v`+(40+e)+"h-400000z"},Q1=function(e,t){return"M473,"+(2713+e+t)+` -c339.3,-1799.3,509.3,-2700,510,-2702 l`+e/5.298+" -"+e+` -c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+e)+`H1017.7 -s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9 -c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200 -c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26 -s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104, -606zM`+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"},_1=function(e){var t=e/2;return"M400000 "+e+" H0 L"+t+" 0 l65 45 L145 "+(e-80)+" H400000z"},ea=function(e,t,a){var n=a-54-t-e;return"M702 "+(e+t)+"H400000"+(40+e)+` -H742v`+n+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1 -h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170 -c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667 -219 661 l218 661zM702 `+t+"H400000v"+(40+e)+"H742z"},ta=function(e,t,a){t=1e3*t;var n="";switch(e){case"sqrtMain":n=j1(t,Q0);break;case"sqrtSize1":n=Z1(t,Q0);break;case"sqrtSize2":n=K1(t,Q0);break;case"sqrtSize3":n=J1(t,Q0);break;case"sqrtSize4":n=Q1(t,Q0);break;case"sqrtTall":n=ea(t,Q0,a)}return n},ra=function(e,t){switch(e){case"\u239C":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"\u2223":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"\u2225":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z"+("M367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z");case"\u239F":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"\u23A2":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"\u23A5":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"\u23AA":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"\u23D0":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"\u2016":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257z"+("M478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z");default:return""}},ar={doubleleftarrow:`M262 157 -l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3 - 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28 - 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5 -c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5 - 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87 --86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7 --2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z -m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l --10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5 - 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88 --33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68 --17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18 --13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782 -c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3 --107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120 - 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 --5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 -c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208 - 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3 - 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202 - l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117 --45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 - 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 - 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 - 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7 --331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,leftgroup:`M400000 80 -H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0 - 435 0h399565z`,leftgroupunder:`M400000 262 -H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219 - 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3 --3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5 --18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7 --196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5 - 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3 --4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7 --10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z -m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333 - 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5 - 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667 --152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12 - 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7 --2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0 -v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5 --83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3 --68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21 - 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:`M40 281 V428 H0 V94 H40 V241 H400000 v40z -M40 281 V428 H0 V94 H40 V241 H400000 v40z`,leftmapsto:`M40 281 V448H0V74H40V241H400000v40z -M40 281 V448H0V74H40V241H400000v40z`,leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23 --.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8 -c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3 - 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:`M0 50 h400000 v40H0z m0 194h40000v40H0z -M0 50 h400000 v40H0z m0 194h40000v40H0z`,midbrace:`M200428 334 -c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14 --53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 - 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 - 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214 -c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 - 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 - 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0 --5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6 --320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z -m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8 -60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8 --451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z -m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2 -c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6 --480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z -m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0 -85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8 --707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z -m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1 -c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128 --16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 - 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 - 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85 --40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 --12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 - 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l --6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5 -s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1 -c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 - 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237 --174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0 - 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18 - 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3 --3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2 --10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 - 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11 --18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7 - 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z -m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 - 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5 --7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95 --27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8 - 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 - 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3 --64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z -m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3 - 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0 --13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21 - 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:`M399960 241 V94 h40 V428 h-40 V281 H0 v-40z -M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23 - 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32 --52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142 --167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40 - 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69 --70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3 --40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19 --37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101 - 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167 -c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 - 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42 - 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333 --19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70 - 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,tilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7 --2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0 - 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0 - 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128 --68.267.847-113-73.952-191-73.952z`,tilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418 --8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9 - 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114 -c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751 - 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,tilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457 --11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0 - 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697 - 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696 - -338 0-409-156.573-744-156.573z`,tilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345 --11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409 - 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9 - 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409 - -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 -3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 -10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 --1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 --7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 -H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 -c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22 -c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10 --11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10 --11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10 --11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1, --5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, --11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, --11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, --11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202 -c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5 -c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130 -s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47 -121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6 -s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11 -c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z -M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32 --27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 -13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39 --84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5 --119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 --12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 -151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 -c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17 -c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21 -c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40 -c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z -M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0 -c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, --231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 -c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z -M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 -c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9, -1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7, --152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z -M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0 -c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, --231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 -c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z -M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`},aa=function(e,t){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+` v1759 h347 v-84 -H403z M403 1759 V0 H319 V1759 v`+t+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+` v1759 H0 v84 H347z -M347 1759 V0 H263 V1759 v`+t+" v1759 h84z";case"vert":return"M145 15 v585 v"+t+` v585 c2.667,10,9.667,15,21,15 -c10,0,16.667,-5,20,-15 v-585 v`+-t+` v-585 c-2.667,-10,-9.667,-15,-21,-15 -c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+t+" v585 h43z";case"doublevert":return"M145 15 v585 v"+t+` v585 c2.667,10,9.667,15,21,15 -c10,0,16.667,-5,20,-15 v-585 v`+-t+` v-585 c-2.667,-10,-9.667,-15,-21,-15 -c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+t+` v585 h43z -M367 15 v585 v`+t+` v585 c2.667,10,9.667,15,21,15 -c10,0,16.667,-5,20,-15 v-585 v`+-t+` v-585 c-2.667,-10,-9.667,-15,-21,-15 -c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+t+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+t+` v1715 h263 v84 H319z -MM319 602 V0 H403 V602 v`+t+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+t+` v1799 H0 v-84 H319z -MM319 602 V0 H403 V602 v`+t+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+` v602 h84z -M403 1759 V0 H319 V1759 v`+t+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+` v602 h84z -M347 1759 V0 h-84 V1759 v`+t+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1 -c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, --36,557 l0,`+(t+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, -949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 -c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, --544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 -l0,-`+(t+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, --210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3, -63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5 -c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(t+9)+` -c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664 -c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11 -c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 -c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 -l0,-`+(t+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, --470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}},L0=class{constructor(e){this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return this.classes.includes(e)}toNode(){for(var e=document.createDocumentFragment(),t=0;tt.toText();return this.children.map(e).join("")}},gt={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},na={ex:!0,em:!0,mu:!0},Er=function(e){return typeof e!="string"&&(e=e.unit),e in gt||e in na||e==="ex"},J=function(e,t){var a;if(e.unit in gt)a=gt[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if(e.unit==="mu")a=t.fontMetrics().cssEmPerMu;else{var n;if(t.style.isTight()?n=t.havingStyle(t.style.text()):n=t,e.unit==="ex")a=n.fontMetrics().xHeight;else if(e.unit==="em")a=n.fontMetrics().quad;else throw new z("Invalid unit: '"+e.unit+"'");n!==t&&(a*=n.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*a,t.maxSize)},M=function(e){return+e.toFixed(4)+"em"},P0=function(e){return e.filter(t=>t).join(" ")},Ir=function(e,t,a){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=a||{},t){t.style.isTight()&&this.classes.push("mtight");var n=t.getColor();n&&(this.style.color=n)}},Hr=function(e){var t=document.createElement(e);t.className=P0(this.classes);for(var a of Object.keys(this.style))t.style[a]=this.style[a];for(var n of Object.keys(this.attributes))t.setAttribute(n,this.attributes[n]);for(var l=0;l/=\x00-\x1f]/,Nr=function(e){var t="<"+e;this.classes.length&&(t+=' class="'+n0(P0(this.classes))+'"');var a="";for(var n of Object.keys(this.style))a+=qt(n)+":"+this.style[n]+";";a&&(t+=' style="'+n0(a)+'"');for(var l of Object.keys(this.attributes)){if(ia.test(l))throw new z("Invalid attribute name '"+l+"'");t+=" "+l+'="'+n0(this.attributes[l])+'"'}t+=">";for(var u=0;u",t},G0=class{constructor(e,t,a,n){Ir.call(this,e,a,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return this.classes.includes(e)}toNode(){return Hr.call(this,"span")}toMarkup(){return Nr.call(this,"span")}},te=class{constructor(e,t,a,n){Ir.call(this,t,n),this.children=a||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return this.classes.includes(e)}toNode(){return Hr.call(this,"a")}toMarkup(){return Nr.call(this,"a")}},bt=class{constructor(e,t,a){this.alt=t,this.src=e,this.classes=["mord"],this.height=0,this.depth=0,this.maxFontSize=0,this.style=a}hasClass(e){return this.classes.includes(e)}toNode(){var e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(var t of Object.keys(this.style))e.style[t]=this.style[t];return e}toMarkup(){var e=''+n0(this.alt)+'0&&(t=document.createElement("span"),t.style.marginRight=M(this.italic)),this.classes.length>0&&(t=t||document.createElement("span"),t.className=P0(this.classes));for(var a of Object.keys(this.style))t=t||document.createElement("span"),t.style[a]=this.style[a];return t?(t.appendChild(e),t):e}toMarkup(){var e=!1,t="0&&(a+="margin-right:"+this.italic+"em;");for(var n of Object.keys(this.style))a+=qt(n)+":"+this.style[n]+";";a&&(e=!0,t+=' style="'+n0(a)+'"');var l=n0(this.text);return e?(t+=">",t+=l,t+="",t):l}},x0=class{constructor(e,t){this.children=e||[],this.attributes=t||{}}toNode(){var e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"svg");for(var a of Object.keys(this.attributes))t.setAttribute(a,this.attributes[a]);for(var n=0;n':''}},de=class{constructor(e){this.attributes=e||{}}toNode(){var e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"line");for(var a of Object.keys(this.attributes))t.setAttribute(a,this.attributes[a]);return t}toMarkup(){var e=" but got "+String(r)+".")}var oa=r=>r instanceof G0||r instanceof te||r instanceof L0,S0={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},ke={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},nr={\u00C5:"A",\u00D0:"D",\u00DE:"o",\u00E5:"a",\u00F0:"d",\u00FE:"o",\u0410:"A",\u0411:"B",\u0412:"B",\u0413:"F",\u0414:"A",\u0415:"E",\u0416:"K",\u0417:"3",\u0418:"N",\u0419:"N",\u041A:"K",\u041B:"N",\u041C:"M",\u041D:"H",\u041E:"O",\u041F:"N",\u0420:"P",\u0421:"C",\u0422:"T",\u0423:"y",\u0424:"O",\u0425:"X",\u0426:"U",\u0427:"h",\u0428:"W",\u0429:"W",\u042A:"B",\u042B:"X",\u042C:"B",\u042D:"3",\u042E:"X",\u042F:"R",\u0430:"a",\u0431:"b",\u0432:"a",\u0433:"r",\u0434:"y",\u0435:"e",\u0436:"m",\u0437:"e",\u0438:"n",\u0439:"n",\u043A:"n",\u043B:"n",\u043C:"m",\u043D:"n",\u043E:"o",\u043F:"n",\u0440:"p",\u0441:"c",\u0442:"o",\u0443:"y",\u0444:"b",\u0445:"x",\u0446:"n",\u0447:"n",\u0448:"w",\u0449:"w",\u044A:"a",\u044B:"m",\u044C:"a",\u044D:"e",\u044E:"m",\u044F:"r"};function ha(r,e){S0[r]=e}function Et(r,e,t){if(!S0[e])throw new Error("Font metrics not found for font: "+e+".");var a=r.charCodeAt(0),n=S0[e][a];if(!n&&r[0]in nr&&(a=nr[r[0]].charCodeAt(0),n=S0[e][a]),!n&&t==="text"&&Rr(a)&&(n=S0[e][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var tt={};function ma(r){var e;if(r>=5?e=0:r>=3?e=1:e=2,!tt[e]){var t=tt[e]={cssEmPerMu:ke.quad[e]/18};for(var a in ke)ke.hasOwnProperty(a)&&(t[a]=ke[a][e])}return tt[e]}var ca={bin:1,close:1,inner:1,open:1,punct:1,rel:1},da={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},$={math:{},text:{}};function i(r,e,t,a,n,l){$[r][n]={font:e,group:t,replace:a},l&&a&&($[r][a]=$[r][n])}var s="math",w="text",o="main",d="ams",j="accent-token",D="bin",o0="close",ne="inner",R="mathord",e0="op-token",f0="open",Ve="punct",f="rel",R0="spacing",p="textord";i(s,o,f,"\u2261","\\equiv",!0);i(s,o,f,"\u227A","\\prec",!0);i(s,o,f,"\u227B","\\succ",!0);i(s,o,f,"\u223C","\\sim",!0);i(s,o,f,"\u22A5","\\perp");i(s,o,f,"\u2AAF","\\preceq",!0);i(s,o,f,"\u2AB0","\\succeq",!0);i(s,o,f,"\u2243","\\simeq",!0);i(s,o,f,"\u2223","\\mid",!0);i(s,o,f,"\u226A","\\ll",!0);i(s,o,f,"\u226B","\\gg",!0);i(s,o,f,"\u224D","\\asymp",!0);i(s,o,f,"\u2225","\\parallel");i(s,o,f,"\u22C8","\\bowtie",!0);i(s,o,f,"\u2323","\\smile",!0);i(s,o,f,"\u2291","\\sqsubseteq",!0);i(s,o,f,"\u2292","\\sqsupseteq",!0);i(s,o,f,"\u2250","\\doteq",!0);i(s,o,f,"\u2322","\\frown",!0);i(s,o,f,"\u220B","\\ni",!0);i(s,o,f,"\u221D","\\propto",!0);i(s,o,f,"\u22A2","\\vdash",!0);i(s,o,f,"\u22A3","\\dashv",!0);i(s,o,f,"\u220B","\\owns");i(s,o,Ve,".","\\ldotp");i(s,o,Ve,"\u22C5","\\cdotp");i(s,o,p,"#","\\#");i(w,o,p,"#","\\#");i(s,o,p,"&","\\&");i(w,o,p,"&","\\&");i(s,o,p,"\u2135","\\aleph",!0);i(s,o,p,"\u2200","\\forall",!0);i(s,o,p,"\u210F","\\hbar",!0);i(s,o,p,"\u2203","\\exists",!0);i(s,o,p,"\u2207","\\nabla",!0);i(s,o,p,"\u266D","\\flat",!0);i(s,o,p,"\u2113","\\ell",!0);i(s,o,p,"\u266E","\\natural",!0);i(s,o,p,"\u2663","\\clubsuit",!0);i(s,o,p,"\u2118","\\wp",!0);i(s,o,p,"\u266F","\\sharp",!0);i(s,o,p,"\u2662","\\diamondsuit",!0);i(s,o,p,"\u211C","\\Re",!0);i(s,o,p,"\u2661","\\heartsuit",!0);i(s,o,p,"\u2111","\\Im",!0);i(s,o,p,"\u2660","\\spadesuit",!0);i(s,o,p,"\xA7","\\S",!0);i(w,o,p,"\xA7","\\S");i(s,o,p,"\xB6","\\P",!0);i(w,o,p,"\xB6","\\P");i(s,o,p,"\u2020","\\dag");i(w,o,p,"\u2020","\\dag");i(w,o,p,"\u2020","\\textdagger");i(s,o,p,"\u2021","\\ddag");i(w,o,p,"\u2021","\\ddag");i(w,o,p,"\u2021","\\textdaggerdbl");i(s,o,o0,"\u23B1","\\rmoustache",!0);i(s,o,f0,"\u23B0","\\lmoustache",!0);i(s,o,o0,"\u27EF","\\rgroup",!0);i(s,o,f0,"\u27EE","\\lgroup",!0);i(s,o,D,"\u2213","\\mp",!0);i(s,o,D,"\u2296","\\ominus",!0);i(s,o,D,"\u228E","\\uplus",!0);i(s,o,D,"\u2293","\\sqcap",!0);i(s,o,D,"\u2217","\\ast");i(s,o,D,"\u2294","\\sqcup",!0);i(s,o,D,"\u25EF","\\bigcirc",!0);i(s,o,D,"\u2219","\\bullet",!0);i(s,o,D,"\u2021","\\ddagger");i(s,o,D,"\u2240","\\wr",!0);i(s,o,D,"\u2A3F","\\amalg");i(s,o,D,"&","\\And");i(s,o,f,"\u27F5","\\longleftarrow",!0);i(s,o,f,"\u21D0","\\Leftarrow",!0);i(s,o,f,"\u27F8","\\Longleftarrow",!0);i(s,o,f,"\u27F6","\\longrightarrow",!0);i(s,o,f,"\u21D2","\\Rightarrow",!0);i(s,o,f,"\u27F9","\\Longrightarrow",!0);i(s,o,f,"\u2194","\\leftrightarrow",!0);i(s,o,f,"\u27F7","\\longleftrightarrow",!0);i(s,o,f,"\u21D4","\\Leftrightarrow",!0);i(s,o,f,"\u27FA","\\Longleftrightarrow",!0);i(s,o,f,"\u21A6","\\mapsto",!0);i(s,o,f,"\u27FC","\\longmapsto",!0);i(s,o,f,"\u2197","\\nearrow",!0);i(s,o,f,"\u21A9","\\hookleftarrow",!0);i(s,o,f,"\u21AA","\\hookrightarrow",!0);i(s,o,f,"\u2198","\\searrow",!0);i(s,o,f,"\u21BC","\\leftharpoonup",!0);i(s,o,f,"\u21C0","\\rightharpoonup",!0);i(s,o,f,"\u2199","\\swarrow",!0);i(s,o,f,"\u21BD","\\leftharpoondown",!0);i(s,o,f,"\u21C1","\\rightharpoondown",!0);i(s,o,f,"\u2196","\\nwarrow",!0);i(s,o,f,"\u21CC","\\rightleftharpoons",!0);i(s,d,f,"\u226E","\\nless",!0);i(s,d,f,"\uE010","\\@nleqslant");i(s,d,f,"\uE011","\\@nleqq");i(s,d,f,"\u2A87","\\lneq",!0);i(s,d,f,"\u2268","\\lneqq",!0);i(s,d,f,"\uE00C","\\@lvertneqq");i(s,d,f,"\u22E6","\\lnsim",!0);i(s,d,f,"\u2A89","\\lnapprox",!0);i(s,d,f,"\u2280","\\nprec",!0);i(s,d,f,"\u22E0","\\npreceq",!0);i(s,d,f,"\u22E8","\\precnsim",!0);i(s,d,f,"\u2AB9","\\precnapprox",!0);i(s,d,f,"\u2241","\\nsim",!0);i(s,d,f,"\uE006","\\@nshortmid");i(s,d,f,"\u2224","\\nmid",!0);i(s,d,f,"\u22AC","\\nvdash",!0);i(s,d,f,"\u22AD","\\nvDash",!0);i(s,d,f,"\u22EA","\\ntriangleleft");i(s,d,f,"\u22EC","\\ntrianglelefteq",!0);i(s,d,f,"\u228A","\\subsetneq",!0);i(s,d,f,"\uE01A","\\@varsubsetneq");i(s,d,f,"\u2ACB","\\subsetneqq",!0);i(s,d,f,"\uE017","\\@varsubsetneqq");i(s,d,f,"\u226F","\\ngtr",!0);i(s,d,f,"\uE00F","\\@ngeqslant");i(s,d,f,"\uE00E","\\@ngeqq");i(s,d,f,"\u2A88","\\gneq",!0);i(s,d,f,"\u2269","\\gneqq",!0);i(s,d,f,"\uE00D","\\@gvertneqq");i(s,d,f,"\u22E7","\\gnsim",!0);i(s,d,f,"\u2A8A","\\gnapprox",!0);i(s,d,f,"\u2281","\\nsucc",!0);i(s,d,f,"\u22E1","\\nsucceq",!0);i(s,d,f,"\u22E9","\\succnsim",!0);i(s,d,f,"\u2ABA","\\succnapprox",!0);i(s,d,f,"\u2246","\\ncong",!0);i(s,d,f,"\uE007","\\@nshortparallel");i(s,d,f,"\u2226","\\nparallel",!0);i(s,d,f,"\u22AF","\\nVDash",!0);i(s,d,f,"\u22EB","\\ntriangleright");i(s,d,f,"\u22ED","\\ntrianglerighteq",!0);i(s,d,f,"\uE018","\\@nsupseteqq");i(s,d,f,"\u228B","\\supsetneq",!0);i(s,d,f,"\uE01B","\\@varsupsetneq");i(s,d,f,"\u2ACC","\\supsetneqq",!0);i(s,d,f,"\uE019","\\@varsupsetneqq");i(s,d,f,"\u22AE","\\nVdash",!0);i(s,d,f,"\u2AB5","\\precneqq",!0);i(s,d,f,"\u2AB6","\\succneqq",!0);i(s,d,f,"\uE016","\\@nsubseteqq");i(s,d,D,"\u22B4","\\unlhd");i(s,d,D,"\u22B5","\\unrhd");i(s,d,f,"\u219A","\\nleftarrow",!0);i(s,d,f,"\u219B","\\nrightarrow",!0);i(s,d,f,"\u21CD","\\nLeftarrow",!0);i(s,d,f,"\u21CF","\\nRightarrow",!0);i(s,d,f,"\u21AE","\\nleftrightarrow",!0);i(s,d,f,"\u21CE","\\nLeftrightarrow",!0);i(s,d,f,"\u25B3","\\vartriangle");i(s,d,p,"\u210F","\\hslash");i(s,d,p,"\u25BD","\\triangledown");i(s,d,p,"\u25CA","\\lozenge");i(s,d,p,"\u24C8","\\circledS");i(s,d,p,"\xAE","\\circledR");i(w,d,p,"\xAE","\\circledR");i(s,d,p,"\u2221","\\measuredangle",!0);i(s,d,p,"\u2204","\\nexists");i(s,d,p,"\u2127","\\mho");i(s,d,p,"\u2132","\\Finv",!0);i(s,d,p,"\u2141","\\Game",!0);i(s,d,p,"\u2035","\\backprime");i(s,d,p,"\u25B2","\\blacktriangle");i(s,d,p,"\u25BC","\\blacktriangledown");i(s,d,p,"\u25A0","\\blacksquare");i(s,d,p,"\u29EB","\\blacklozenge");i(s,d,p,"\u2605","\\bigstar");i(s,d,p,"\u2222","\\sphericalangle",!0);i(s,d,p,"\u2201","\\complement",!0);i(s,d,p,"\xF0","\\eth",!0);i(w,o,p,"\xF0","\xF0");i(s,d,p,"\u2571","\\diagup");i(s,d,p,"\u2572","\\diagdown");i(s,d,p,"\u25A1","\\square");i(s,d,p,"\u25A1","\\Box");i(s,d,p,"\u25CA","\\Diamond");i(s,d,p,"\xA5","\\yen",!0);i(w,d,p,"\xA5","\\yen",!0);i(s,d,p,"\u2713","\\checkmark",!0);i(w,d,p,"\u2713","\\checkmark");i(s,d,p,"\u2136","\\beth",!0);i(s,d,p,"\u2138","\\daleth",!0);i(s,d,p,"\u2137","\\gimel",!0);i(s,d,p,"\u03DD","\\digamma",!0);i(s,d,p,"\u03F0","\\varkappa");i(s,d,f0,"\u250C","\\@ulcorner",!0);i(s,d,o0,"\u2510","\\@urcorner",!0);i(s,d,f0,"\u2514","\\@llcorner",!0);i(s,d,o0,"\u2518","\\@lrcorner",!0);i(s,d,f,"\u2266","\\leqq",!0);i(s,d,f,"\u2A7D","\\leqslant",!0);i(s,d,f,"\u2A95","\\eqslantless",!0);i(s,d,f,"\u2272","\\lesssim",!0);i(s,d,f,"\u2A85","\\lessapprox",!0);i(s,d,f,"\u224A","\\approxeq",!0);i(s,d,D,"\u22D6","\\lessdot");i(s,d,f,"\u22D8","\\lll",!0);i(s,d,f,"\u2276","\\lessgtr",!0);i(s,d,f,"\u22DA","\\lesseqgtr",!0);i(s,d,f,"\u2A8B","\\lesseqqgtr",!0);i(s,d,f,"\u2251","\\doteqdot");i(s,d,f,"\u2253","\\risingdotseq",!0);i(s,d,f,"\u2252","\\fallingdotseq",!0);i(s,d,f,"\u223D","\\backsim",!0);i(s,d,f,"\u22CD","\\backsimeq",!0);i(s,d,f,"\u2AC5","\\subseteqq",!0);i(s,d,f,"\u22D0","\\Subset",!0);i(s,d,f,"\u228F","\\sqsubset",!0);i(s,d,f,"\u227C","\\preccurlyeq",!0);i(s,d,f,"\u22DE","\\curlyeqprec",!0);i(s,d,f,"\u227E","\\precsim",!0);i(s,d,f,"\u2AB7","\\precapprox",!0);i(s,d,f,"\u22B2","\\vartriangleleft");i(s,d,f,"\u22B4","\\trianglelefteq");i(s,d,f,"\u22A8","\\vDash",!0);i(s,d,f,"\u22AA","\\Vvdash",!0);i(s,d,f,"\u2323","\\smallsmile");i(s,d,f,"\u2322","\\smallfrown");i(s,d,f,"\u224F","\\bumpeq",!0);i(s,d,f,"\u224E","\\Bumpeq",!0);i(s,d,f,"\u2267","\\geqq",!0);i(s,d,f,"\u2A7E","\\geqslant",!0);i(s,d,f,"\u2A96","\\eqslantgtr",!0);i(s,d,f,"\u2273","\\gtrsim",!0);i(s,d,f,"\u2A86","\\gtrapprox",!0);i(s,d,D,"\u22D7","\\gtrdot");i(s,d,f,"\u22D9","\\ggg",!0);i(s,d,f,"\u2277","\\gtrless",!0);i(s,d,f,"\u22DB","\\gtreqless",!0);i(s,d,f,"\u2A8C","\\gtreqqless",!0);i(s,d,f,"\u2256","\\eqcirc",!0);i(s,d,f,"\u2257","\\circeq",!0);i(s,d,f,"\u225C","\\triangleq",!0);i(s,d,f,"\u223C","\\thicksim");i(s,d,f,"\u2248","\\thickapprox");i(s,d,f,"\u2AC6","\\supseteqq",!0);i(s,d,f,"\u22D1","\\Supset",!0);i(s,d,f,"\u2290","\\sqsupset",!0);i(s,d,f,"\u227D","\\succcurlyeq",!0);i(s,d,f,"\u22DF","\\curlyeqsucc",!0);i(s,d,f,"\u227F","\\succsim",!0);i(s,d,f,"\u2AB8","\\succapprox",!0);i(s,d,f,"\u22B3","\\vartriangleright");i(s,d,f,"\u22B5","\\trianglerighteq");i(s,d,f,"\u22A9","\\Vdash",!0);i(s,d,f,"\u2223","\\shortmid");i(s,d,f,"\u2225","\\shortparallel");i(s,d,f,"\u226C","\\between",!0);i(s,d,f,"\u22D4","\\pitchfork",!0);i(s,d,f,"\u221D","\\varpropto");i(s,d,f,"\u25C0","\\blacktriangleleft");i(s,d,f,"\u2234","\\therefore",!0);i(s,d,f,"\u220D","\\backepsilon");i(s,d,f,"\u25B6","\\blacktriangleright");i(s,d,f,"\u2235","\\because",!0);i(s,d,f,"\u22D8","\\llless");i(s,d,f,"\u22D9","\\gggtr");i(s,d,D,"\u22B2","\\lhd");i(s,d,D,"\u22B3","\\rhd");i(s,d,f,"\u2242","\\eqsim",!0);i(s,o,f,"\u22C8","\\Join");i(s,d,f,"\u2251","\\Doteq",!0);i(s,d,D,"\u2214","\\dotplus",!0);i(s,d,D,"\u2216","\\smallsetminus");i(s,d,D,"\u22D2","\\Cap",!0);i(s,d,D,"\u22D3","\\Cup",!0);i(s,d,D,"\u2A5E","\\doublebarwedge",!0);i(s,d,D,"\u229F","\\boxminus",!0);i(s,d,D,"\u229E","\\boxplus",!0);i(s,d,D,"\u22C7","\\divideontimes",!0);i(s,d,D,"\u22C9","\\ltimes",!0);i(s,d,D,"\u22CA","\\rtimes",!0);i(s,d,D,"\u22CB","\\leftthreetimes",!0);i(s,d,D,"\u22CC","\\rightthreetimes",!0);i(s,d,D,"\u22CF","\\curlywedge",!0);i(s,d,D,"\u22CE","\\curlyvee",!0);i(s,d,D,"\u229D","\\circleddash",!0);i(s,d,D,"\u229B","\\circledast",!0);i(s,d,D,"\u22C5","\\centerdot");i(s,d,D,"\u22BA","\\intercal",!0);i(s,d,D,"\u22D2","\\doublecap");i(s,d,D,"\u22D3","\\doublecup");i(s,d,D,"\u22A0","\\boxtimes",!0);i(s,d,f,"\u21E2","\\dashrightarrow",!0);i(s,d,f,"\u21E0","\\dashleftarrow",!0);i(s,d,f,"\u21C7","\\leftleftarrows",!0);i(s,d,f,"\u21C6","\\leftrightarrows",!0);i(s,d,f,"\u21DA","\\Lleftarrow",!0);i(s,d,f,"\u219E","\\twoheadleftarrow",!0);i(s,d,f,"\u21A2","\\leftarrowtail",!0);i(s,d,f,"\u21AB","\\looparrowleft",!0);i(s,d,f,"\u21CB","\\leftrightharpoons",!0);i(s,d,f,"\u21B6","\\curvearrowleft",!0);i(s,d,f,"\u21BA","\\circlearrowleft",!0);i(s,d,f,"\u21B0","\\Lsh",!0);i(s,d,f,"\u21C8","\\upuparrows",!0);i(s,d,f,"\u21BF","\\upharpoonleft",!0);i(s,d,f,"\u21C3","\\downharpoonleft",!0);i(s,o,f,"\u22B6","\\origof",!0);i(s,o,f,"\u22B7","\\imageof",!0);i(s,d,f,"\u22B8","\\multimap",!0);i(s,d,f,"\u21AD","\\leftrightsquigarrow",!0);i(s,d,f,"\u21C9","\\rightrightarrows",!0);i(s,d,f,"\u21C4","\\rightleftarrows",!0);i(s,d,f,"\u21A0","\\twoheadrightarrow",!0);i(s,d,f,"\u21A3","\\rightarrowtail",!0);i(s,d,f,"\u21AC","\\looparrowright",!0);i(s,d,f,"\u21B7","\\curvearrowright",!0);i(s,d,f,"\u21BB","\\circlearrowright",!0);i(s,d,f,"\u21B1","\\Rsh",!0);i(s,d,f,"\u21CA","\\downdownarrows",!0);i(s,d,f,"\u21BE","\\upharpoonright",!0);i(s,d,f,"\u21C2","\\downharpoonright",!0);i(s,d,f,"\u21DD","\\rightsquigarrow",!0);i(s,d,f,"\u21DD","\\leadsto");i(s,d,f,"\u21DB","\\Rrightarrow",!0);i(s,d,f,"\u21BE","\\restriction");i(s,o,p,"\u2018","`");i(s,o,p,"$","\\$");i(w,o,p,"$","\\$");i(w,o,p,"$","\\textdollar");i(s,o,p,"%","\\%");i(w,o,p,"%","\\%");i(s,o,p,"_","\\_");i(w,o,p,"_","\\_");i(w,o,p,"_","\\textunderscore");i(s,o,p,"\u2220","\\angle",!0);i(s,o,p,"\u221E","\\infty",!0);i(s,o,p,"\u2032","\\prime");i(s,o,p,"\u25B3","\\triangle");i(s,o,p,"\u0393","\\Gamma",!0);i(s,o,p,"\u0394","\\Delta",!0);i(s,o,p,"\u0398","\\Theta",!0);i(s,o,p,"\u039B","\\Lambda",!0);i(s,o,p,"\u039E","\\Xi",!0);i(s,o,p,"\u03A0","\\Pi",!0);i(s,o,p,"\u03A3","\\Sigma",!0);i(s,o,p,"\u03A5","\\Upsilon",!0);i(s,o,p,"\u03A6","\\Phi",!0);i(s,o,p,"\u03A8","\\Psi",!0);i(s,o,p,"\u03A9","\\Omega",!0);i(s,o,p,"A","\u0391");i(s,o,p,"B","\u0392");i(s,o,p,"E","\u0395");i(s,o,p,"Z","\u0396");i(s,o,p,"H","\u0397");i(s,o,p,"I","\u0399");i(s,o,p,"K","\u039A");i(s,o,p,"M","\u039C");i(s,o,p,"N","\u039D");i(s,o,p,"O","\u039F");i(s,o,p,"P","\u03A1");i(s,o,p,"T","\u03A4");i(s,o,p,"X","\u03A7");i(s,o,p,"\xAC","\\neg",!0);i(s,o,p,"\xAC","\\lnot");i(s,o,p,"\u22A4","\\top");i(s,o,p,"\u22A5","\\bot");i(s,o,p,"\u2205","\\emptyset");i(s,d,p,"\u2205","\\varnothing");i(s,o,R,"\u03B1","\\alpha",!0);i(s,o,R,"\u03B2","\\beta",!0);i(s,o,R,"\u03B3","\\gamma",!0);i(s,o,R,"\u03B4","\\delta",!0);i(s,o,R,"\u03F5","\\epsilon",!0);i(s,o,R,"\u03B6","\\zeta",!0);i(s,o,R,"\u03B7","\\eta",!0);i(s,o,R,"\u03B8","\\theta",!0);i(s,o,R,"\u03B9","\\iota",!0);i(s,o,R,"\u03BA","\\kappa",!0);i(s,o,R,"\u03BB","\\lambda",!0);i(s,o,R,"\u03BC","\\mu",!0);i(s,o,R,"\u03BD","\\nu",!0);i(s,o,R,"\u03BE","\\xi",!0);i(s,o,R,"\u03BF","\\omicron",!0);i(s,o,R,"\u03C0","\\pi",!0);i(s,o,R,"\u03C1","\\rho",!0);i(s,o,R,"\u03C3","\\sigma",!0);i(s,o,R,"\u03C4","\\tau",!0);i(s,o,R,"\u03C5","\\upsilon",!0);i(s,o,R,"\u03D5","\\phi",!0);i(s,o,R,"\u03C7","\\chi",!0);i(s,o,R,"\u03C8","\\psi",!0);i(s,o,R,"\u03C9","\\omega",!0);i(s,o,R,"\u03B5","\\varepsilon",!0);i(s,o,R,"\u03D1","\\vartheta",!0);i(s,o,R,"\u03D6","\\varpi",!0);i(s,o,R,"\u03F1","\\varrho",!0);i(s,o,R,"\u03C2","\\varsigma",!0);i(s,o,R,"\u03C6","\\varphi",!0);i(s,o,D,"\u2217","*",!0);i(s,o,D,"+","+");i(s,o,D,"\u2212","-",!0);i(s,o,D,"\u22C5","\\cdot",!0);i(s,o,D,"\u2218","\\circ",!0);i(s,o,D,"\xF7","\\div",!0);i(s,o,D,"\xB1","\\pm",!0);i(s,o,D,"\xD7","\\times",!0);i(s,o,D,"\u2229","\\cap",!0);i(s,o,D,"\u222A","\\cup",!0);i(s,o,D,"\u2216","\\setminus",!0);i(s,o,D,"\u2227","\\land");i(s,o,D,"\u2228","\\lor");i(s,o,D,"\u2227","\\wedge",!0);i(s,o,D,"\u2228","\\vee",!0);i(s,o,p,"\u221A","\\surd");i(s,o,f0,"\u27E8","\\langle",!0);i(s,o,f0,"\u2223","\\lvert");i(s,o,f0,"\u2225","\\lVert");i(s,o,o0,"?","?");i(s,o,o0,"!","!");i(s,o,o0,"\u27E9","\\rangle",!0);i(s,o,o0,"\u2223","\\rvert");i(s,o,o0,"\u2225","\\rVert");i(s,o,f,"=","=");i(s,o,f,":",":");i(s,o,f,"\u2248","\\approx",!0);i(s,o,f,"\u2245","\\cong",!0);i(s,o,f,"\u2265","\\ge");i(s,o,f,"\u2265","\\geq",!0);i(s,o,f,"\u2190","\\gets");i(s,o,f,">","\\gt",!0);i(s,o,f,"\u2208","\\in",!0);i(s,o,f,"\uE020","\\@not");i(s,o,f,"\u2282","\\subset",!0);i(s,o,f,"\u2283","\\supset",!0);i(s,o,f,"\u2286","\\subseteq",!0);i(s,o,f,"\u2287","\\supseteq",!0);i(s,d,f,"\u2288","\\nsubseteq",!0);i(s,d,f,"\u2289","\\nsupseteq",!0);i(s,o,f,"\u22A8","\\models");i(s,o,f,"\u2190","\\leftarrow",!0);i(s,o,f,"\u2264","\\le");i(s,o,f,"\u2264","\\leq",!0);i(s,o,f,"<","\\lt",!0);i(s,o,f,"\u2192","\\rightarrow",!0);i(s,o,f,"\u2192","\\to");i(s,d,f,"\u2271","\\ngeq",!0);i(s,d,f,"\u2270","\\nleq",!0);i(s,o,R0,"\xA0","\\ ");i(s,o,R0,"\xA0","\\space");i(s,o,R0,"\xA0","\\nobreakspace");i(w,o,R0,"\xA0","\\ ");i(w,o,R0,"\xA0"," ");i(w,o,R0,"\xA0","\\space");i(w,o,R0,"\xA0","\\nobreakspace");i(s,o,R0,null,"\\nobreak");i(s,o,R0,null,"\\allowbreak");i(s,o,Ve,",",",");i(s,o,Ve,";",";");i(s,d,D,"\u22BC","\\barwedge",!0);i(s,d,D,"\u22BB","\\veebar",!0);i(s,o,D,"\u2299","\\odot",!0);i(s,o,D,"\u2295","\\oplus",!0);i(s,o,D,"\u2297","\\otimes",!0);i(s,o,p,"\u2202","\\partial",!0);i(s,o,D,"\u2298","\\oslash",!0);i(s,d,D,"\u229A","\\circledcirc",!0);i(s,d,D,"\u22A1","\\boxdot",!0);i(s,o,D,"\u25B3","\\bigtriangleup");i(s,o,D,"\u25BD","\\bigtriangledown");i(s,o,D,"\u2020","\\dagger");i(s,o,D,"\u22C4","\\diamond");i(s,o,D,"\u22C6","\\star");i(s,o,D,"\u25C3","\\triangleleft");i(s,o,D,"\u25B9","\\triangleright");i(s,o,f0,"{","\\{");i(w,o,p,"{","\\{");i(w,o,p,"{","\\textbraceleft");i(s,o,o0,"}","\\}");i(w,o,p,"}","\\}");i(w,o,p,"}","\\textbraceright");i(s,o,f0,"{","\\lbrace");i(s,o,o0,"}","\\rbrace");i(s,o,f0,"[","\\lbrack",!0);i(w,o,p,"[","\\lbrack",!0);i(s,o,o0,"]","\\rbrack",!0);i(w,o,p,"]","\\rbrack",!0);i(s,o,f0,"(","\\lparen",!0);i(s,o,o0,")","\\rparen",!0);i(w,o,p,"<","\\textless",!0);i(w,o,p,">","\\textgreater",!0);i(s,o,f0,"\u230A","\\lfloor",!0);i(s,o,o0,"\u230B","\\rfloor",!0);i(s,o,f0,"\u2308","\\lceil",!0);i(s,o,o0,"\u2309","\\rceil",!0);i(s,o,p,"\\","\\backslash");i(s,o,p,"\u2223","|");i(s,o,p,"\u2223","\\vert");i(w,o,p,"|","\\textbar",!0);i(s,o,p,"\u2225","\\|");i(s,o,p,"\u2225","\\Vert");i(w,o,p,"\u2225","\\textbardbl");i(w,o,p,"~","\\textasciitilde");i(w,o,p,"\\","\\textbackslash");i(w,o,p,"^","\\textasciicircum");i(s,o,f,"\u2191","\\uparrow",!0);i(s,o,f,"\u21D1","\\Uparrow",!0);i(s,o,f,"\u2193","\\downarrow",!0);i(s,o,f,"\u21D3","\\Downarrow",!0);i(s,o,f,"\u2195","\\updownarrow",!0);i(s,o,f,"\u21D5","\\Updownarrow",!0);i(s,o,e0,"\u2210","\\coprod");i(s,o,e0,"\u22C1","\\bigvee");i(s,o,e0,"\u22C0","\\bigwedge");i(s,o,e0,"\u2A04","\\biguplus");i(s,o,e0,"\u22C2","\\bigcap");i(s,o,e0,"\u22C3","\\bigcup");i(s,o,e0,"\u222B","\\int");i(s,o,e0,"\u222B","\\intop");i(s,o,e0,"\u222C","\\iint");i(s,o,e0,"\u222D","\\iiint");i(s,o,e0,"\u220F","\\prod");i(s,o,e0,"\u2211","\\sum");i(s,o,e0,"\u2A02","\\bigotimes");i(s,o,e0,"\u2A01","\\bigoplus");i(s,o,e0,"\u2A00","\\bigodot");i(s,o,e0,"\u222E","\\oint");i(s,o,e0,"\u222F","\\oiint");i(s,o,e0,"\u2230","\\oiiint");i(s,o,e0,"\u2A06","\\bigsqcup");i(s,o,e0,"\u222B","\\smallint");i(w,o,ne,"\u2026","\\textellipsis");i(s,o,ne,"\u2026","\\mathellipsis");i(w,o,ne,"\u2026","\\ldots",!0);i(s,o,ne,"\u2026","\\ldots",!0);i(s,o,ne,"\u22EF","\\@cdots",!0);i(s,o,ne,"\u22F1","\\ddots",!0);i(s,o,p,"\u22EE","\\varvdots");i(w,o,p,"\u22EE","\\varvdots");i(s,o,j,"\u02CA","\\acute");i(s,o,j,"\u02CB","\\grave");i(s,o,j,"\xA8","\\ddot");i(s,o,j,"~","\\tilde");i(s,o,j,"\u02C9","\\bar");i(s,o,j,"\u02D8","\\breve");i(s,o,j,"\u02C7","\\check");i(s,o,j,"^","\\hat");i(s,o,j,"\u20D7","\\vec");i(s,o,j,"\u02D9","\\dot");i(s,o,j,"\u02DA","\\mathring");i(s,o,R,"\uE131","\\@imath");i(s,o,R,"\uE237","\\@jmath");i(s,o,p,"\u0131","\u0131");i(s,o,p,"\u0237","\u0237");i(w,o,p,"\u0131","\\i",!0);i(w,o,p,"\u0237","\\j",!0);i(w,o,p,"\xDF","\\ss",!0);i(w,o,p,"\xE6","\\ae",!0);i(w,o,p,"\u0153","\\oe",!0);i(w,o,p,"\xF8","\\o",!0);i(w,o,p,"\xC6","\\AE",!0);i(w,o,p,"\u0152","\\OE",!0);i(w,o,p,"\xD8","\\O",!0);i(w,o,j,"\u02CA","\\'");i(w,o,j,"\u02CB","\\`");i(w,o,j,"\u02C6","\\^");i(w,o,j,"\u02DC","\\~");i(w,o,j,"\u02C9","\\=");i(w,o,j,"\u02D8","\\u");i(w,o,j,"\u02D9","\\.");i(w,o,j,"\xB8","\\c");i(w,o,j,"\u02DA","\\r");i(w,o,j,"\u02C7","\\v");i(w,o,j,"\xA8",'\\"');i(w,o,j,"\u02DD","\\H");i(w,o,j,"\u25EF","\\textcircled");var Or={"--":!0,"---":!0,"``":!0,"''":!0};i(w,o,p,"\u2013","--",!0);i(w,o,p,"\u2013","\\textendash");i(w,o,p,"\u2014","---",!0);i(w,o,p,"\u2014","\\textemdash");i(w,o,p,"\u2018","`",!0);i(w,o,p,"\u2018","\\textquoteleft");i(w,o,p,"\u2019","'",!0);i(w,o,p,"\u2019","\\textquoteright");i(w,o,p,"\u201C","``",!0);i(w,o,p,"\u201C","\\textquotedblleft");i(w,o,p,"\u201D","''",!0);i(w,o,p,"\u201D","\\textquotedblright");i(s,o,p,"\xB0","\\degree",!0);i(w,o,p,"\xB0","\\degree");i(w,o,p,"\xB0","\\textdegree",!0);i(s,o,p,"\xA3","\\pounds");i(s,o,p,"\xA3","\\mathsterling",!0);i(w,o,p,"\xA3","\\pounds");i(w,o,p,"\xA3","\\textsterling",!0);i(s,d,p,"\u2720","\\maltese");i(w,d,p,"\u2720","\\maltese");var ir='0123456789/@."';for(Se=0;Se{var t=r.charCodeAt(0),a=r.charCodeAt(1),n=(t-55296)*1024+(a-56320)+65536,l=e==="math"?0:1;if(119808<=n&&n<120484){var u=Math.floor((n-119808)/26);return[Te[u][2],Te[u][l]]}else if(120782<=n&&n<=120831){var h=Math.floor((n-120782)/10);return[sr[h][2],sr[h][l]]}else{if(n===120485||n===120486)return[Te[0][2],Te[0][l]];if(1204860)return l0(l,v,n,t,u.concat(g));if(c){var b,y;if(c==="boldsymbol"){var x=va(l,n,t,u,a);b=x.fontName,y=[x.fontClass]}else h?(b=xt[c].fontName,y=[c]):(b=Be(c,t.fontWeight,t.fontShape),y=[c,t.fontWeight,t.fontShape]);if(Xe(l,b,n).metrics)return l0(l,b,n,t,u.concat(y));if(Or.hasOwnProperty(l)&&b.slice(0,10)==="Typewriter"){for(var A=[],T=0;T{if(P0(r.classes)!==P0(e.classes)||r.skew!==e.skew||r.maxFontSize!==e.maxFontSize||r.italic!==0&&r.hasClass("mathnormal"))return!1;if(r.classes.length===1){var t=r.classes[0];if(t==="mbin"||t==="mord")return!1}for(var a of Object.keys(r.style))if(r.style[a]!==e.style[a])return!1;for(var n of Object.keys(e.style))if(r.style[n]!==e.style[n])return!1;return!0},Fr=r=>{for(var e=0;et&&(t=u.height),u.depth>a&&(a=u.depth),u.maxFontSize>n&&(n=u.maxFontSize)}e.height=t,e.depth=a,e.maxFontSize=n},k=function(e,t,a,n){var l=new G0(e,t,a,n);return Ht(l),l},U0=(r,e,t,a)=>new G0(r,e,t,a),re=function(e,t,a){var n=k([e],[],t);return n.height=Math.max(a||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=M(n.height),n.maxFontSize=1,n},ga=function(e,t,a,n){var l=new te(e,t,a,n);return Ht(l),l},E0=function(e){var t=new L0(e);return Ht(t),t},ae=function(e,t){return e instanceof L0?k([],[e],t):e},ba=function(e){if(e.positionType==="individualShift"){for(var t=e.children,a=[t[0]],n=-t[0].shift-t[0].elem.depth,l=n,u=1;u{var t=k(["mspace"],[],e),a=J(r,e);return t.style.marginRight=M(a),t},Be=function(e,t,a){var n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}var l;return t==="textbf"&&a==="textit"?l="BoldItalic":t==="textbf"?l="Bold":t==="textit"?l="Italic":l="Regular",n+"-"+l},xt={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Pr={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Gr=function(e,t){var[a,n,l]=Pr[e],u=new z0(a),h=new x0([u],{width:M(n),height:M(l),style:"width:"+M(n),viewBox:"0 0 "+1e3*n+" "+1e3*l,preserveAspectRatio:"xMinYMin"}),c=U0(["overlay"],[h],t);return c.height=l,c.style.height=M(l),c.style.width=M(n),c},K={number:3,unit:"mu"},W0={number:4,unit:"mu"},D0={number:5,unit:"mu"},ya={mord:{mop:K,mbin:W0,mrel:D0,minner:K},mop:{mord:K,mop:K,mrel:D0,minner:K},mbin:{mord:W0,mop:W0,mopen:W0,minner:W0},mrel:{mord:D0,mop:D0,mopen:D0,minner:D0},mopen:{},mclose:{mop:K,mbin:W0,mrel:D0,minner:K},mpunct:{mord:K,mop:K,mrel:D0,mopen:K,mclose:K,mpunct:K,minner:K},minner:{mord:K,mop:K,mbin:W0,mrel:D0,mopen:K,mpunct:K,minner:K}},xa={mord:{mop:K},mop:{mord:K,mop:K},mbin:{},mrel:{},mopen:{},mclose:{mop:K},mpunct:{},minner:{mop:K}},Ur={},Oe={},Fe={};function B(r){for(var{type:e,names:t,props:a,handler:n,htmlBuilder:l,mathmlBuilder:u}=r,h={type:e,numArgs:a.numArgs,argTypes:a.argTypes,allowedInArgument:!!a.allowedInArgument,allowedInText:!!a.allowedInText,allowedInMath:a.allowedInMath===void 0?!0:a.allowedInMath,numOptionalArgs:a.numOptionalArgs||0,infix:!!a.infix,primitive:!!a.primitive,handler:n},c=0;c{var C=T.classes[0],q=A.classes[0];C==="mbin"&&ka.has(q)?T.classes[0]="mord":q==="mbin"&&wa.has(C)&&(A.classes[0]="mord")},{node:b},y,x),wt(l,(A,T)=>{var C,q,I=St(T),N=St(A),F=I&&N?A.hasClass("mtight")?(C=xa[I])==null?void 0:C[N]:(q=ya[I])==null?void 0:q[N]:null;if(F)return Lr(F,v)},{node:b},y,x),l},wt=function(e,t,a,n,l){n&&e.push(n);for(var u=0;uy=>{e.splice(b+1,0,y),u++})(u)}n&&e.pop()},Vr=function(e){return e instanceof L0||e instanceof te||e instanceof G0&&e.hasClass("enclosing")?e:null},kt=function(e,t){var a=Vr(e);if(a){var n=a.children;if(n.length){if(t==="right")return kt(n[n.length-1],"right");if(t==="left")return kt(n[0],"left")}}return e},St=function(e,t){if(!e)return null;t&&(e=kt(e,t));var a=e.classes[0];return za[a]||null},fe=function(e,t){var a=["nulldelimiter"].concat(e.baseSizingClasses());return k(t.concat(a))},U=function(e,t,a){if(!e)return k();if(Oe[e.type]){var n=Oe[e.type](e,t);if(a&&t.size!==a.size){n=k(t.sizingClasses(a),[n],t);var l=t.sizeMultiplier/a.sizeMultiplier;n.height*=l,n.depth*=l}return n}else throw new z("Got group of unknown type: '"+e.type+"'")};function De(r,e){var t=k(["base"],r,e),a=k(["strut"]);return a.style.height=M(t.height+t.depth),t.depth&&(a.style.verticalAlign=M(-t.depth)),t.children.unshift(a),t}function zt(r,e){var t=null;r.length===1&&r[0].type==="tag"&&(t=r[0].tag,r=r[0].body);var a=r0(r,e,"root"),n;a.length===2&&a[1].hasClass("tag")&&(n=a.pop());for(var l=[],u=[],h=0;h0&&(l.push(De(u,e)),u=[]),l.push(a[h]));u.length>0&&l.push(De(u,e));var v;t?(v=De(r0(t,e,!0),e),v.classes=["tag"],l.push(v)):n&&l.push(n);var g=k(["katex-html"],l);if(g.setAttribute("aria-hidden","true"),v){var b=v.children[0];b.style.height=M(g.height+g.depth),g.depth&&(b.style.verticalAlign=M(-g.depth))}return g}function Xr(r){return new L0(r)}var S=class{constructor(e,t,a){this.type=e,this.attributes={},this.children=t||[],this.classes=a||[]}setAttribute(e,t){this.attributes[e]=t}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=P0(this.classes));for(var a=0;a0&&(e+=' class ="'+n0(P0(this.classes))+'"'),e+=">";for(var a=0;a",e}toText(){return this.children.map(e=>e.toText()).join("")}},Q=class{constructor(e){this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return n0(this.toText())}toText(){return this.text}},Pe=class{constructor(e){this.width=e,e>=.05555&&e<=.05556?this.character="\u200A":e>=.1666&&e<=.1667?this.character="\u2009":e>=.2222&&e<=.2223?this.character="\u2005":e>=.2777&&e<=.2778?this.character="\u2005\u200A":e>=-.05556&&e<=-.05555?this.character="\u200A\u2063":e>=-.1667&&e<=-.1666?this.character="\u2009\u2063":e>=-.2223&&e<=-.2222?this.character="\u205F\u2063":e>=-.2778&&e<=-.2777?this.character="\u2005\u2063":this.character=null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",M(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},Ma=new Set(["\\imath","\\jmath"]),Aa=new Set(["mrow","mtable"]),g0=function(e,t,a){return $[t][e]&&$[t][e].replace&&e.charCodeAt(0)!==55349&&!(Or.hasOwnProperty(e)&&a&&(a.fontFamily&&a.fontFamily.slice(4,6)==="tt"||a.font&&a.font.slice(4,6)==="tt"))&&(e=$[t][e].replace),new Q(e)},Nt=function(e){return e.length===1?e[0]:new S("mrow",e)},Ot=function(e,t){if(t.fontFamily==="texttt")return"monospace";if(t.fontFamily==="textsf")return t.fontShape==="textit"&&t.fontWeight==="textbf"?"sans-serif-bold-italic":t.fontShape==="textit"?"sans-serif-italic":t.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(t.fontShape==="textit"&&t.fontWeight==="textbf")return"bold-italic";if(t.fontShape==="textit")return"italic";if(t.fontWeight==="textbf")return"bold";var a=t.font;if(!a||a==="mathnormal")return null;var n=e.mode;if(a==="mathit")return"italic";if(a==="boldsymbol")return e.type==="textord"?"bold":"bold-italic";if(a==="mathbf")return"bold";if(a==="mathbb")return"double-struck";if(a==="mathsfit")return"sans-serif-italic";if(a==="mathfrak")return"fraktur";if(a==="mathscr"||a==="mathcal")return"script";if(a==="mathsf")return"sans-serif";if(a==="mathtt")return"monospace";var l=e.text;if(Ma.has(l))return null;if($[n][l]){var u=$[n][l].replace;u&&(l=u)}var h=xt[a].fontName;return Et(l,h,n)?xt[a].variant:null};function nt(r){if(!r)return!1;if(r.type==="mi"&&r.children.length===1){var e=r.children[0];return e instanceof Q&&e.text==="."}else if(r.type==="mo"&&r.children.length===1&&r.getAttribute("separator")==="true"&&r.getAttribute("lspace")==="0em"&&r.getAttribute("rspace")==="0em"){var t=r.children[0];return t instanceof Q&&t.text===","}else return!1}var v0=function(e,t,a){if(e.length===1){var n=Y(e[0],t);return a&&n instanceof S&&n.type==="mo"&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}for(var l=[],u,h=0;h=1&&(u.type==="mn"||nt(u))){var v=c.children[0];v instanceof S&&v.type==="mn"&&(v.children=[...u.children,...v.children],l.pop())}else if(u.type==="mi"&&u.children.length===1){var g=u.children[0];if(g instanceof Q&&g.text==="\u0338"&&(c.type==="mo"||c.type==="mi"||c.type==="mn")){var b=c.children[0];b instanceof Q&&b.text.length>0&&(b.text=b.text.slice(0,1)+"\u0338"+b.text.slice(1),l.pop())}}}l.push(c),u=c}return l},V0=function(e,t,a){return Nt(v0(e,t,a))},Y=function(e,t){if(!e)return new S("mrow");if(Fe[e.type]){var a=Fe[e.type](e,t);return a}else throw new z("Got group of unknown type: '"+e.type+"'")};function ur(r,e,t,a,n){var l=v0(r,t),u;l.length===1&&l[0]instanceof S&&Aa.has(l[0].type)?u=l[0]:u=new S("mrow",l);var h=new S("annotation",[new Q(e)]);h.setAttribute("encoding","application/x-tex");var c=new S("semantics",[u,h]),v=new S("math",[c]);v.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),a&&v.setAttribute("display","block");var g=n?"katex":"katex-mathml";return k([g],[v])}var Ta=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],or=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],hr=function(e,t){return t.size<2?e:Ta[e-1][t.size-1]},Ba=(()=>{class r{constructor(t){this.style=t.style,this.color=t.color,this.size=t.size||r.BASESIZE,this.textSize=t.textSize||this.size,this.phantom=!!t.phantom,this.font=t.font||"",this.fontFamily=t.fontFamily||"",this.fontWeight=t.fontWeight||"",this.fontShape=t.fontShape||"",this.sizeMultiplier=or[this.size-1],this.maxSize=t.maxSize,this.minRuleThickness=t.minRuleThickness,this._fontMetrics=void 0}extend(t){var a={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};return Object.assign(a,t),new r(a)}havingStyle(t){return this.style===t?this:this.extend({style:t,size:hr(this.textSize,t)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(t){return this.size===t&&this.textSize===t?this:this.extend({style:this.style.text(),size:t,textSize:t,sizeMultiplier:or[t-1]})}havingBaseStyle(t){t=t||this.style.text();var a=hr(r.BASESIZE,t);return this.size===a&&this.textSize===r.BASESIZE&&this.style===t?this:this.extend({style:t,size:a})}havingBaseSizing(){var t;switch(this.style.id){case 4:case 5:t=3;break;case 6:case 7:t=1;break;default:t=6}return this.extend({style:this.style.text(),size:t})}withColor(t){return this.extend({color:t})}withPhantom(){return this.extend({phantom:!0})}withFont(t){return this.extend({font:t})}withTextFontFamily(t){return this.extend({fontFamily:t,font:""})}withTextFontWeight(t){return this.extend({fontWeight:t,font:""})}withTextFontShape(t){return this.extend({fontShape:t,font:""})}sizingClasses(t){return t.size!==this.size?["sizing","reset-size"+t.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==r.BASESIZE?["sizing","reset-size"+this.size,"size"+r.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=ma(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}return r.BASESIZE=6,r})(),Yr=function(e){return new Ba({style:e.displayMode?H.DISPLAY:H.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Wr=function(e,t){if(t.displayMode){var a=["katex-display"];t.leqno&&a.push("leqno"),t.fleqn&&a.push("fleqn"),e=k(a,[e])}return e},Da=function(e,t,a){var n=Yr(a),l;if(a.output==="mathml")return ur(e,t,n,a.displayMode,!0);if(a.output==="html"){var u=zt(e,n);l=k(["katex"],[u])}else{var h=ur(e,t,n,a.displayMode,!1),c=zt(e,n);l=k(["katex"],[h,c])}return Wr(l,a)},Ca=function(e,t,a){var n=Yr(a),l=zt(e,n),u=k(["katex"],[l]);return Wr(u,a)},qa={widehat:"^",widecheck:"\u02C7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23DF",overbrace:"\u23DE",overgroup:"\u23E0",undergroup:"\u23E1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21D2",xRightarrow:"\u21D2",overleftharpoon:"\u21BC",xleftharpoonup:"\u21BC",overrightharpoon:"\u21C0",xrightharpoonup:"\u21C0",xLeftarrow:"\u21D0",xLeftrightarrow:"\u21D4",xhookleftarrow:"\u21A9",xhookrightarrow:"\u21AA",xmapsto:"\u21A6",xrightharpoondown:"\u21C1",xleftharpoondown:"\u21BD",xrightleftharpoons:"\u21CC",xleftrightharpoons:"\u21CB",xtwoheadleftarrow:"\u219E",xtwoheadrightarrow:"\u21A0",xlongequal:"=",xtofrom:"\u21C4",xrightleftarrows:"\u21C4",xrightequilibrium:"\u21CC",xleftequilibrium:"\u21CB","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},We=function(e){var t=new S("mo",[new Q(qa[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},Ra={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Ea=new Set(["widehat","widecheck","widetilde","utilde"]),$e=function(e,t){function a(){var h=4e5,c=e.label.slice(1);if(Ea.has(c)){var v=e,g=v.base.type==="ordgroup"?v.base.body.length:1,b,y,x;if(g>5)c==="widehat"||c==="widecheck"?(b=420,h=2364,x=.42,y=c+"4"):(b=312,h=2340,x=.34,y="tilde4");else{var A=[1,1,2,2,3,3][g];c==="widehat"||c==="widecheck"?(h=[0,1062,2364,2364,2364][A],b=[0,239,300,360,420][A],x=[0,.24,.3,.3,.36,.42][A],y=c+A):(h=[0,600,1033,2339,2340][A],b=[0,260,286,306,312][A],x=[0,.26,.286,.3,.306,.34][A],y="tilde"+A)}var T=new z0(y),C=new x0([T],{width:"100%",height:M(x),viewBox:"0 0 "+h+" "+b,preserveAspectRatio:"none"});return{span:U0([],[C],t),minWidth:0,height:x}}else{var q=[],I=Ra[c],[N,F,V]=I,L=V/1e3,P=N.length,W,X;if(P===1){var h0=I[3];W=["hide-tail"],X=[h0]}else if(P===2)W=["halfarrow-left","halfarrow-right"],X=["xMinYMin","xMaxYMin"];else if(P===3)W=["brace-left","brace-center","brace-right"],X=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support - `+P+" children.");for(var i0=0;i00&&(n.style.minWidth=M(l)),n},Ia=function(e,t,a,n,l){var u,h=e.height+e.depth+a+n;if(/fbox|color|angl/.test(t)){if(u=k(["stretchy",t],[],l),t==="fbox"){var c=l.color&&l.getColor();c&&(u.style.borderColor=c)}}else{var v=[];/^[bx]cancel$/.test(t)&&v.push(new de({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&v.push(new de({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var g=new x0(v,{width:"100%",height:M(h)});u=U0([],[g],l)}return u.height=h,u.style.height=M(h),u};function O(r,e){if(!r||r.type!==e)throw new Error("Expected node of type "+e+", but got "+(r?"node of type "+r.type:String(r)));return r}function je(r){var e=Ze(r);if(!e)throw new Error("Expected node of symbol group type, but got "+(r?"node of type "+r.type:String(r)));return e}function Ze(r){return r&&(r.type==="atom"||da.hasOwnProperty(r.type))?r:null}var $r=r=>{if(r instanceof u0)return r;if(oa(r)&&r.children.length===1)return $r(r.children[0])},Ft=(r,e)=>{var t,a,n;r&&r.type==="supsub"?(a=O(r.base,"accent"),t=a.base,r.base=t,n=ua(U(r,e)),r.base=a):(a=O(r,"accent"),t=a.base);var l=U(t,e.havingCrampedStyle()),u=a.isShifty&&q0(t),h=0;if(u){var c,v;h=(c=(v=$r(l))==null?void 0:v.skew)!=null?c:0}var g=a.label==="\\c",b=g?l.height+l.depth:Math.min(l.height,e.fontMetrics().xHeight),y;if(a.isStretchy)y=$e(a,e),y=G({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"elem",elem:y,wrapperClasses:["svg-align"],wrapperStyle:h>0?{width:"calc(100% - "+M(2*h)+")",marginLeft:M(2*h)}:void 0}]});else{var x,A;a.label==="\\vec"?(x=Gr("vec",e),A=Pr.vec[1]):(x=Ye({type:"textord",mode:a.mode,text:a.label},e,"textord"),x=sa(x),x.italic=0,A=x.width,g&&(b+=x.depth)),y=k(["accent-body"],[x]);var T=a.label==="\\textcircled";T&&(y.classes.push("accent-full"),b=l.height);var C=h;T||(C-=A/2),y.style.left=M(C),a.label==="\\textcircled"&&(y.style.top=".2em"),y=G({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:-b},{type:"elem",elem:y}]})}var q=k(["mord","accent"],[y],e);return n?(n.children[0]=q,n.height=Math.max(q.height,n.height),n.classes[0]="mord",n):q},jr=(r,e)=>{var t=r.isStretchy?We(r.label):new S("mo",[g0(r.label,r.mode)]),a=new S("mover",[Y(r.base,e),t]);return a.setAttribute("accent","true"),a},Ha=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(r=>"\\"+r).join("|"));B({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(r,e)=>{var t=Le(e[0]),a=!Ha.test(r.funcName),n=!a||r.funcName==="\\widehat"||r.funcName==="\\widetilde"||r.funcName==="\\widecheck";return{type:"accent",mode:r.parser.mode,label:r.funcName,isStretchy:a,isShifty:n,base:t}},htmlBuilder:Ft,mathmlBuilder:jr});B({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(r,e)=>{var t=e[0],a=r.parser.mode;return a==="math"&&(r.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+r.funcName+" works only in text mode"),a="text"),{type:"accent",mode:a,label:r.funcName,isStretchy:!1,isShifty:!0,base:t}},htmlBuilder:Ft,mathmlBuilder:jr});B({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"accentUnder",mode:t.mode,label:a,base:n}},htmlBuilder:(r,e)=>{var t=U(r.base,e),a=$e(r,e),n=r.label==="\\utilde"?.12:0,l=G({positionType:"top",positionData:t.height,children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:n},{type:"elem",elem:t}]});return k(["mord","accentunder"],[l],e)},mathmlBuilder:(r,e)=>{var t=We(r.label),a=new S("munder",[Y(r.base,e),t]);return a.setAttribute("accentunder","true"),a}});var Ce=r=>{var e=new S("mpadded",r?[r]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e};B({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(r,e,t){var{parser:a,funcName:n}=r;return{type:"xArrow",mode:a.mode,label:n,body:e[0],below:t[0]}},htmlBuilder(r,e){var t=e.style,a=e.havingStyle(t.sup()),n=ae(U(r.body,a,e),e),l=r.label.slice(0,2)==="\\x"?"x":"cd";n.classes.push(l+"-arrow-pad");var u;r.below&&(a=e.havingStyle(t.sub()),u=ae(U(r.below,a,e),e),u.classes.push(l+"-arrow-pad"));var h=$e(r,e),c=-e.fontMetrics().axisHeight+.5*h.height,v=-e.fontMetrics().axisHeight-.5*h.height-.111;(n.depth>.25||r.label==="\\xleftequilibrium")&&(v-=n.depth);var g;if(u){var b=-e.fontMetrics().axisHeight+u.height+.5*h.height+.111;g=G({positionType:"individualShift",children:[{type:"elem",elem:n,shift:v},{type:"elem",elem:h,shift:c},{type:"elem",elem:u,shift:b}]})}else g=G({positionType:"individualShift",children:[{type:"elem",elem:n,shift:v},{type:"elem",elem:h,shift:c}]});return g.children[0].children[0].children[1].classes.push("svg-align"),k(["mrel","x-arrow"],[g],e)},mathmlBuilder(r,e){var t=We(r.label);t.setAttribute("minsize",r.label.charAt(0)==="x"?"1.75em":"3.0em");var a;if(r.body){var n=Ce(Y(r.body,e));if(r.below){var l=Ce(Y(r.below,e));a=new S("munderover",[t,l,n])}else a=new S("mover",[t,n])}else if(r.below){var u=Ce(Y(r.below,e));a=new S("munder",[t,u])}else a=Ce(),a=new S("mover",[t,a]);return a}});function Zr(r,e){var t=r0(r.body,e,!0);return k([r.mclass],t,e)}function Kr(r,e){var t,a=v0(r.body,e);return r.mclass==="minner"?t=new S("mpadded",a):r.mclass==="mord"?r.isCharacterBox?(t=a[0],t.type="mi"):t=new S("mi",a):(r.isCharacterBox?(t=a[0],t.type="mo"):t=new S("mo",a),r.mclass==="mbin"?(t.attributes.lspace="0.22em",t.attributes.rspace="0.22em"):r.mclass==="mpunct"?(t.attributes.lspace="0em",t.attributes.rspace="0.17em"):r.mclass==="mopen"||r.mclass==="mclose"?(t.attributes.lspace="0em",t.attributes.rspace="0em"):r.mclass==="minner"&&(t.attributes.lspace="0.0556em",t.attributes.width="+0.1111em")),t}B({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"mclass",mode:t.mode,mclass:"m"+a.slice(5),body:_(n),isCharacterBox:q0(n)}},htmlBuilder:Zr,mathmlBuilder:Kr});var Ke=r=>{var e=r.type==="ordgroup"&&r.body.length?r.body[0]:r;return e.type==="atom"&&(e.family==="bin"||e.family==="rel")?"m"+e.family:"mord"};B({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(r,e){var{parser:t}=r;return{type:"mclass",mode:t.mode,mclass:Ke(e[0]),body:_(e[1]),isCharacterBox:q0(e[1])}}});B({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(r,e){var{parser:t,funcName:a}=r,n=e[1],l=e[0],u;a!=="\\stackrel"?u=Ke(n):u="mrel";var h={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:a!=="\\stackrel",body:_(n)},c={type:"supsub",mode:l.mode,base:h,sup:a==="\\underset"?null:l,sub:a==="\\underset"?l:null};return{type:"mclass",mode:t.mode,mclass:u,body:[c],isCharacterBox:q0(c)}},htmlBuilder:Zr,mathmlBuilder:Kr});B({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"pmb",mode:t.mode,mclass:Ke(e[0]),body:_(e[0])}},htmlBuilder(r,e){var t=r0(r.body,e,!0),a=k([r.mclass],t,e);return a.style.textShadow="0.02em 0.01em 0.04px",a},mathmlBuilder(r,e){var t=v0(r.body,e),a=new S("mstyle",t);return a.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),a}});var Na={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},mr=()=>({type:"styling",body:[],mode:"math",style:"display"}),cr=r=>r.type==="textord"&&r.text==="@",Oa=(r,e)=>(r.type==="mathord"||r.type==="atom")&&r.text===e;function Fa(r,e,t){var a=Na[r];switch(a){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return t.callFunction(a,[e[0]],[e[1]]);case"\\uparrow":case"\\downarrow":{var n=t.callFunction("\\\\cdleft",[e[0]],[]),l={type:"atom",text:a,mode:"math",family:"rel"},u=t.callFunction("\\Big",[l],[]),h=t.callFunction("\\\\cdright",[e[1]],[]),c={type:"ordgroup",mode:"math",body:[n,u,h]};return t.callFunction("\\\\cdparent",[c],[])}case"\\\\cdlongequal":return t.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var v={type:"textord",text:"\\Vert",mode:"math"};return t.callFunction("\\Big",[v],[])}default:return{type:"textord",text:" ",mode:"math"}}}function La(r){var e=[];for(r.gullet.beginGroup(),r.gullet.macros.set("\\cr","\\\\\\relax"),r.gullet.beginGroup();;){e.push(r.parseExpression(!1,"\\\\")),r.gullet.endGroup(),r.gullet.beginGroup();var t=r.fetch().text;if(t==="&"||t==="\\\\")r.consume();else if(t==="\\end"){e[e.length-1].length===0&&e.pop();break}else throw new z("Expected \\\\ or \\cr or \\end",r.nextToken)}for(var a=[],n=[a],l=0;lAV".includes(v))for(var b=0;b<2;b++){for(var y=!0,x=c+1;xAV=|." after @',u[c]);var A=Fa(v,g,r),T={type:"styling",body:[A],mode:"math",style:"display"};a.push(T),h=mr()}l%2===0?a.push(h):a.shift(),a=[],n.push(a)}r.gullet.endGroup(),r.gullet.endGroup();var C=new Array(n[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:n,arraystretch:1,addJot:!0,rowGaps:[null],cols:C,colSeparationType:"CD",hLinesBeforeRow:new Array(n.length+1).fill([])}}B({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(r,e){var{parser:t,funcName:a}=r;return{type:"cdlabel",mode:t.mode,side:a.slice(4),label:e[0]}},htmlBuilder(r,e){var t=e.havingStyle(e.style.sup()),a=ae(U(r.label,t,e),e);return a.classes.push("cd-label-"+r.side),a.style.bottom=M(.8-a.depth),a.height=0,a.depth=0,a},mathmlBuilder(r,e){var t=new S("mrow",[Y(r.label,e)]);return t=new S("mpadded",[t]),t.setAttribute("width","0"),r.side==="left"&&t.setAttribute("lspace","-1width"),t.setAttribute("voffset","0.7em"),t=new S("mstyle",[t]),t.setAttribute("displaystyle","false"),t.setAttribute("scriptlevel","1"),t}});B({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(r,e){var{parser:t}=r;return{type:"cdlabelparent",mode:t.mode,fragment:e[0]}},htmlBuilder(r,e){var t=ae(U(r.fragment,e),e);return t.classes.push("cd-vert-arrow"),t},mathmlBuilder(r,e){return new S("mrow",[Y(r.fragment,e)])}});B({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(r,e){for(var{parser:t}=r,a=O(e[0],"ordgroup"),n=a.body,l="",u=0;u=1114111)throw new z("\\@char with invalid code point "+l);return c<=65535?v=String.fromCharCode(c):(c-=65536,v=String.fromCharCode((c>>10)+55296,(c&1023)+56320)),{type:"textord",mode:t.mode,text:v}}});var Jr=(r,e)=>{var t=r0(r.body,e.withColor(r.color),!1);return E0(t)},Qr=(r,e)=>{var t=v0(r.body,e.withColor(r.color)),a=new S("mstyle",t);return a.setAttribute("mathcolor",r.color),a};B({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(r,e){var{parser:t}=r,a=O(e[0],"color-token").color,n=e[1];return{type:"color",mode:t.mode,color:a,body:_(n)}},htmlBuilder:Jr,mathmlBuilder:Qr});B({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(r,e){var{parser:t,breakOnTokenText:a}=r,n=O(e[0],"color-token").color;t.gullet.macros.set("\\current@color",n);var l=t.parseExpression(!0,a);return{type:"color",mode:t.mode,color:n,body:l}},htmlBuilder:Jr,mathmlBuilder:Qr});B({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(r,e,t){var{parser:a}=r,n=a.gullet.future().text==="["?a.parseSizeGroup(!0):null,l=!a.settings.displayMode||!a.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:a.mode,newLine:l,size:n&&O(n,"size").value}},htmlBuilder(r,e){var t=k(["mspace"],[],e);return r.newLine&&(t.classes.push("newline"),r.size&&(t.style.marginTop=M(J(r.size,e)))),t},mathmlBuilder(r,e){var t=new S("mspace");return r.newLine&&(t.setAttribute("linebreak","newline"),r.size&&t.setAttribute("height",M(J(r.size,e)))),t}});var Mt={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},_r=r=>{var e=r.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new z("Expected a control sequence",r);return e},Pa=r=>{var e=r.gullet.popToken();return e.text==="="&&(e=r.gullet.popToken(),e.text===" "&&(e=r.gullet.popToken())),e},e1=(r,e,t,a)=>{var n=r.gullet.macros.get(t.text);n==null&&(t.noexpand=!0,n={tokens:[t],numArgs:0,unexpandable:!r.gullet.isExpandable(t.text)}),r.gullet.macros.set(e,n,a)};B({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(r){var{parser:e,funcName:t}=r;e.consumeSpaces();var a=e.fetch();if(Mt[a.text])return(t==="\\global"||t==="\\\\globallong")&&(a.text=Mt[a.text]),O(e.parseFunction(),"internal");throw new z("Invalid token after macro prefix",a)}});B({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r){var{parser:e,funcName:t}=r,a=e.gullet.popToken(),n=a.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(n))throw new z("Expected a control sequence",a);for(var l=0,u,h=[[]];e.gullet.future().text!=="{";)if(a=e.gullet.popToken(),a.text==="#"){if(e.gullet.future().text==="{"){u=e.gullet.future(),h[l].push("{");break}if(a=e.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new z('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==l+1)throw new z('Argument number "'+a.text+'" out of order');l++,h.push([])}else{if(a.text==="EOF")throw new z("Expected a macro definition");h[l].push(a.text)}var{tokens:c}=e.gullet.consumeArg();return u&&c.unshift(u),(t==="\\edef"||t==="\\xdef")&&(c=e.gullet.expandTokens(c),c.reverse()),e.gullet.macros.set(n,{tokens:c,numArgs:l,delimiters:h},t===Mt[t]),{type:"internal",mode:e.mode}}});B({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r){var{parser:e,funcName:t}=r,a=_r(e.gullet.popToken());e.gullet.consumeSpaces();var n=Pa(e);return e1(e,a,n,t==="\\\\globallet"),{type:"internal",mode:e.mode}}});B({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r){var{parser:e,funcName:t}=r,a=_r(e.gullet.popToken()),n=e.gullet.popToken(),l=e.gullet.popToken();return e1(e,a,l,t==="\\\\globalfuture"),e.gullet.pushToken(l),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}});var oe=function(e,t,a){var n=$.math[e]&&$.math[e].replace,l=Et(n||e,t,a);if(!l)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return l},Lt=function(e,t,a,n){var l=a.havingBaseStyle(t),u=k(n.concat(l.sizingClasses(a)),[e],a),h=l.sizeMultiplier/a.sizeMultiplier;return u.height*=h,u.depth*=h,u.maxFontSize=l.sizeMultiplier,u},t1=function(e,t,a){var n=t.havingBaseStyle(a),l=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=M(l),e.height-=l,e.depth+=l},Ga=function(e,t,a,n,l,u){var h=l0(e,"Main-Regular",l,n),c=Lt(h,t,n,u);return a&&t1(c,n,t),c},Ua=function(e,t,a,n){return l0(e,"Size"+t+"-Regular",a,n)},r1=function(e,t,a,n,l,u){var h=Ua(e,t,l,n),c=Lt(k(["delimsizing","size"+t],[h],n),H.TEXT,n,u);return a&&t1(c,n,H.TEXT),c},it=function(e,t,a){var n;t==="Size1-Regular"?n="delim-size1":n="delim-size4";var l=k(["delimsizinginner",n],[k([],[l0(e,t,a)])]);return{type:"elem",elem:l}},lt=function(e,t,a){var n=S0["Size4-Regular"][e.charCodeAt(0)]?S0["Size4-Regular"][e.charCodeAt(0)][4]:S0["Size1-Regular"][e.charCodeAt(0)][4],l=new z0("inner",ra(e,Math.round(1e3*t))),u=new x0([l],{width:M(n),height:M(t),style:"width:"+M(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),h=U0([],[u],a);return h.height=t,h.style.height=M(t),h.style.width=M(n),{type:"elem",elem:h}},At=.008,qe={type:"kern",size:-1*At},Va=new Set(["|","\\lvert","\\rvert","\\vert"]),Xa=new Set(["\\|","\\lVert","\\rVert","\\Vert"]),a1=function(e,t,a,n,l,u){var h,c,v,g,b="",y=0;h=v=g=e,c=null;var x="Size1-Regular";e==="\\uparrow"?v=g="\u23D0":e==="\\Uparrow"?v=g="\u2016":e==="\\downarrow"?h=v="\u23D0":e==="\\Downarrow"?h=v="\u2016":e==="\\updownarrow"?(h="\\uparrow",v="\u23D0",g="\\downarrow"):e==="\\Updownarrow"?(h="\\Uparrow",v="\u2016",g="\\Downarrow"):Va.has(e)?(v="\u2223",b="vert",y=333):Xa.has(e)?(v="\u2225",b="doublevert",y=556):e==="["||e==="\\lbrack"?(h="\u23A1",v="\u23A2",g="\u23A3",x="Size4-Regular",b="lbrack",y=667):e==="]"||e==="\\rbrack"?(h="\u23A4",v="\u23A5",g="\u23A6",x="Size4-Regular",b="rbrack",y=667):e==="\\lfloor"||e==="\u230A"?(v=h="\u23A2",g="\u23A3",x="Size4-Regular",b="lfloor",y=667):e==="\\lceil"||e==="\u2308"?(h="\u23A1",v=g="\u23A2",x="Size4-Regular",b="lceil",y=667):e==="\\rfloor"||e==="\u230B"?(v=h="\u23A5",g="\u23A6",x="Size4-Regular",b="rfloor",y=667):e==="\\rceil"||e==="\u2309"?(h="\u23A4",v=g="\u23A5",x="Size4-Regular",b="rceil",y=667):e==="("||e==="\\lparen"?(h="\u239B",v="\u239C",g="\u239D",x="Size4-Regular",b="lparen",y=875):e===")"||e==="\\rparen"?(h="\u239E",v="\u239F",g="\u23A0",x="Size4-Regular",b="rparen",y=875):e==="\\{"||e==="\\lbrace"?(h="\u23A7",c="\u23A8",g="\u23A9",v="\u23AA",x="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(h="\u23AB",c="\u23AC",g="\u23AD",v="\u23AA",x="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(h="\u23A7",g="\u23A9",v="\u23AA",x="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(h="\u23AB",g="\u23AD",v="\u23AA",x="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(h="\u23A7",g="\u23AD",v="\u23AA",x="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(h="\u23AB",g="\u23A9",v="\u23AA",x="Size4-Regular");var A=oe(h,x,l),T=A.height+A.depth,C=oe(v,x,l),q=C.height+C.depth,I=oe(g,x,l),N=I.height+I.depth,F=0,V=1;if(c!==null){var L=oe(c,x,l);F=L.height+L.depth,V=2}var P=T+N+F,W=Math.max(0,Math.ceil((t-P)/(V*q))),X=P+W*V*q,h0=n.fontMetrics().axisHeight;a&&(h0*=n.sizeMultiplier);var i0=X/2-h0,t0=[];if(b.length>0){var Y0=X-T-N,m0=Math.round(X*1e3),b0=aa(b,Math.round(Y0*1e3)),I0=new z0(b,b0),j0=(y/1e3).toFixed(3)+"em",Z0=(m0/1e3).toFixed(3)+"em",_e=new x0([I0],{width:j0,height:Z0,viewBox:"0 0 "+y+" "+m0}),H0=U0([],[_e],n);H0.height=m0/1e3,H0.style.width=j0,H0.style.height=Z0,t0.push({type:"elem",elem:H0})}else{if(t0.push(it(g,x,l)),t0.push(qe),c===null){var N0=X-T-N+2*At;t0.push(lt(v,N0,n))}else{var le=(X-T-N-F)/2+2*At;t0.push(lt(v,le,n)),t0.push(qe),t0.push(it(c,x,l)),t0.push(qe),t0.push(lt(v,le,n))}t0.push(qe),t0.push(it(h,x,l))}var y0=n.havingBaseStyle(H.TEXT),pe=G({positionType:"bottom",positionData:i0,children:t0});return Lt(k(["delimsizing","mult"],[pe],y0),H.TEXT,n,u)},st=80,ut=.08,ot=function(e,t,a,n,l){var u=ta(e,n,a),h=new z0(e,u),c=new x0([h],{width:"400em",height:M(t),viewBox:"0 0 400000 "+a,preserveAspectRatio:"xMinYMin slice"});return U0(["hide-tail"],[c],l)},Ya=function(e,t){var a=t.havingBaseSizing(),n=u1("\\surd",e*a.sizeMultiplier,s1,a),l=a.sizeMultiplier,u=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),h,c=0,v=0,g=0,b;return n.type==="small"?(g=1e3+1e3*u+st,e<1?l=1:e<1.4&&(l=.7),c=(1+u+ut)/l,v=(1+u)/l,h=ot("sqrtMain",c,g,u,t),h.style.minWidth="0.853em",b=.833/l):n.type==="large"?(g=(1e3+st)*he[n.size],v=(he[n.size]+u)/l,c=(he[n.size]+u+ut)/l,h=ot("sqrtSize"+n.size,c,g,u,t),h.style.minWidth="1.02em",b=1/l):(c=e+u+ut,v=e+u,g=Math.floor(1e3*e+u)+st,h=ot("sqrtTall",c,g,u,t),h.style.minWidth="0.742em",b=1.056),h.height=v,h.style.height=M(c),{span:h,advanceWidth:b,ruleWidth:(t.fontMetrics().sqrtRuleThickness+u)*l}},n1=new Set(["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"]),Wa=new Set(["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1"]),i1=new Set(["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"]),he=[0,1.2,1.8,2.4,3],l1=function(e,t,a,n,l){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),n1.has(e)||i1.has(e))return r1(e,t,!1,a,n,l);if(Wa.has(e))return a1(e,he[t],!1,a,n,l);throw new z("Illegal delimiter: '"+e+"'")},$a=[{type:"small",style:H.SCRIPTSCRIPT},{type:"small",style:H.SCRIPT},{type:"small",style:H.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],ja=[{type:"small",style:H.SCRIPTSCRIPT},{type:"small",style:H.SCRIPT},{type:"small",style:H.TEXT},{type:"stack"}],s1=[{type:"small",style:H.SCRIPTSCRIPT},{type:"small",style:H.SCRIPT},{type:"small",style:H.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],Za=function(e){if(e.type==="small")return"Main-Regular";if(e.type==="large")return"Size"+e.size+"-Regular";if(e.type==="stack")return"Size4-Regular";var t=e.type;throw new Error("Add support for delim type '"+t+"' here.")},u1=function(e,t,a,n){for(var l=Math.min(2,3-n.style.size),u=l;ut)return h}return a[a.length-1]},Tt=function(e,t,a,n,l,u){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var h;i1.has(e)?h=$a:n1.has(e)?h=s1:h=ja;var c=u1(e,t,h,n);return c.type==="small"?Ga(e,c.style,a,n,l,u):c.type==="large"?r1(e,c.size,a,n,l,u):a1(e,t,a,n,l,u)},ht=function(e,t,a,n,l,u){var h=n.fontMetrics().axisHeight*n.sizeMultiplier,c=901,v=5/n.fontMetrics().ptPerEm,g=Math.max(t-h,a+h),b=Math.max(g/500*c,2*g-v);return Tt(e,b,!0,n,l,u)},dr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Ka=new Set(["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27E8","\\rangle","\u27E9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."]);function Je(r,e){var t=Ze(r);if(t&&Ka.has(t.text))return t;throw t?new z("Invalid delimiter '"+t.text+"' after '"+e.funcName+"'",r):new z("Invalid delimiter type '"+r.type+"'",r)}B({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(r,e)=>{var t=Je(e[0],r);return{type:"delimsizing",mode:r.parser.mode,size:dr[r.funcName].size,mclass:dr[r.funcName].mclass,delim:t.text}},htmlBuilder:(r,e)=>r.delim==="."?k([r.mclass]):l1(r.delim,r.size,e,r.mode,[r.mclass]),mathmlBuilder:r=>{var e=[];r.delim!=="."&&e.push(g0(r.delim,r.mode));var t=new S("mo",e);r.mclass==="mopen"||r.mclass==="mclose"?t.setAttribute("fence","true"):t.setAttribute("fence","false"),t.setAttribute("stretchy","true");var a=M(he[r.size]);return t.setAttribute("minsize",a),t.setAttribute("maxsize",a),t}});function fr(r){if(!r.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}B({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var t=r.parser.gullet.macros.get("\\current@color");if(t&&typeof t!="string")throw new z("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:r.parser.mode,delim:Je(e[0],r).text,color:t}}});B({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var t=Je(e[0],r),a=r.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect("\\right",!1);var l=O(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:t.text,right:l.delim,rightColor:l.color}},htmlBuilder:(r,e)=>{fr(r);for(var t=r0(r.body,e,!0,["mopen","mclose"]),a=0,n=0,l=!1,u=0;u{fr(r);var t=v0(r.body,e);if(r.left!=="."){var a=new S("mo",[g0(r.left,r.mode)]);a.setAttribute("fence","true"),t.unshift(a)}if(r.right!=="."){var n=new S("mo",[g0(r.right,r.mode)]);n.setAttribute("fence","true"),r.rightColor&&n.setAttribute("mathcolor",r.rightColor),t.push(n)}return Nt(t)}});B({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var t=Je(e[0],r);if(!r.parser.leftrightDepth)throw new z("\\middle without preceding \\left",t);return{type:"middle",mode:r.parser.mode,delim:t.text}},htmlBuilder:(r,e)=>{var t;if(r.delim===".")t=fe(e,[]);else{t=l1(r.delim,1,e,r.mode,[]);var a={delim:r.delim,options:e};t.isMiddle=a}return t},mathmlBuilder:(r,e)=>{var t=r.delim==="\\vert"||r.delim==="|"?g0("|","text"):g0(r.delim,r.mode),a=new S("mo",[t]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var Pt=(r,e)=>{var t=ae(U(r.body,e),e),a=r.label.slice(1),n=e.sizeMultiplier,l,u=0,h=q0(r.body);if(a==="sout")l=k(["stretchy","sout"]),l.height=e.fontMetrics().defaultRuleThickness/n,u=-.5*e.fontMetrics().xHeight;else if(a==="phase"){var c=J({number:.6,unit:"pt"},e),v=J({number:.35,unit:"ex"},e),g=e.havingBaseSizing();n=n/g.sizeMultiplier;var b=t.height+t.depth+c+v;t.style.paddingLeft=M(b/2+c);var y=Math.floor(1e3*b*n),x=_1(y),A=new x0([new z0("phase",x)],{width:"400em",height:M(y/1e3),viewBox:"0 0 400000 "+y,preserveAspectRatio:"xMinYMin slice"});l=U0(["hide-tail"],[A],e),l.style.height=M(b),u=t.depth+c+v}else{/cancel/.test(a)?h||t.classes.push("cancel-pad"):a==="angl"?t.classes.push("anglpad"):t.classes.push("boxpad");var T=0,C=0,q=0;/box/.test(a)?(q=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),T=e.fontMetrics().fboxsep+(a==="colorbox"?0:q),C=T):a==="angl"?(q=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),T=4*q,C=Math.max(0,.25-t.depth)):(T=h?.2:0,C=T),l=Ia(t,a,T,C,e),/fbox|boxed|fcolorbox/.test(a)?(l.style.borderStyle="solid",l.style.borderWidth=M(q)):a==="angl"&&q!==.049&&(l.style.borderTopWidth=M(q),l.style.borderRightWidth=M(q)),u=t.depth+C,r.backgroundColor&&(l.style.backgroundColor=r.backgroundColor,r.borderColor&&(l.style.borderColor=r.borderColor))}var I;if(r.backgroundColor)I=G({positionType:"individualShift",children:[{type:"elem",elem:l,shift:u},{type:"elem",elem:t,shift:0}]});else{var N=/cancel|phase/.test(a)?["svg-align"]:[];I=G({positionType:"individualShift",children:[{type:"elem",elem:t,shift:0},{type:"elem",elem:l,shift:u,wrapperClasses:N}]})}return/cancel/.test(a)&&(I.height=t.height,I.depth=t.depth),/cancel/.test(a)&&!h?k(["mord","cancel-lap"],[I],e):k(["mord"],[I],e)},Gt=(r,e)=>{var t=0,a=new S(r.label.includes("colorbox")?"mpadded":"menclose",[Y(r.body,e)]);switch(r.label){case"\\cancel":a.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":a.setAttribute("notation","downdiagonalstrike");break;case"\\phase":a.setAttribute("notation","phasorangle");break;case"\\sout":a.setAttribute("notation","horizontalstrike");break;case"\\fbox":a.setAttribute("notation","box");break;case"\\angl":a.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(t=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,a.setAttribute("width","+"+2*t+"pt"),a.setAttribute("height","+"+2*t+"pt"),a.setAttribute("lspace",t+"pt"),a.setAttribute("voffset",t+"pt"),r.label==="\\fcolorbox"){var n=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);a.setAttribute("style","border: "+n+"em solid "+String(r.borderColor))}break;case"\\xcancel":a.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return r.backgroundColor&&a.setAttribute("mathbackground",r.backgroundColor),a};B({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(r,e,t){var{parser:a,funcName:n}=r,l=O(e[0],"color-token").color,u=e[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:l,body:u}},htmlBuilder:Pt,mathmlBuilder:Gt});B({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(r,e,t){var{parser:a,funcName:n}=r,l=O(e[0],"color-token").color,u=O(e[1],"color-token").color,h=e[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:u,borderColor:l,body:h}},htmlBuilder:Pt,mathmlBuilder:Gt});B({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"enclose",mode:t.mode,label:"\\fbox",body:e[0]}}});B({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"enclose",mode:t.mode,label:a,body:n}},htmlBuilder:Pt,mathmlBuilder:Gt});B({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(r,e){var{parser:t}=r;return{type:"enclose",mode:t.mode,label:"\\angl",body:e[0]}}});var o1={};function M0(r){for(var{type:e,names:t,props:a,handler:n,htmlBuilder:l,mathmlBuilder:u}=r,h={type:e,numArgs:a.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:n},c=0;c{var e=r.parser.settings;if(!e.displayMode)throw new z("{"+r.envName+"} can be used only in display mode.")},Ja=new Set(["gather","gather*"]);function Ut(r){if(!r.includes("ed"))return!r.includes("*")}function X0(r,e,t){var{hskipBeforeAndAfter:a,addJot:n,cols:l,arraystretch:u,colSeparationType:h,autoTag:c,singleRow:v,emptySingleRow:g,maxNumCols:b,leqno:y}=e;if(r.gullet.beginGroup(),v||r.gullet.macros.set("\\cr","\\\\\\relax"),!u){var x=r.gullet.expandMacroAsText("\\arraystretch");if(x==null)u=1;else if(u=parseFloat(x),!u||u<0)throw new z("Invalid \\arraystretch: "+x)}r.gullet.beginGroup();var A=[],T=[A],C=[],q=[],I=c!=null?[]:void 0;function N(){c&&r.gullet.macros.set("\\@eqnsw","1",!0)}function F(){I&&(r.gullet.macros.get("\\df@tag")?(I.push(r.subparse([new d0("\\df@tag")])),r.gullet.macros.set("\\df@tag",void 0,!0)):I.push(!!c&&r.gullet.macros.get("\\@eqnsw")==="1"))}for(N(),q.push(vr(r));;){var V=r.parseExpression(!1,v?"\\end":"\\\\");r.gullet.endGroup(),r.gullet.beginGroup();var L={type:"ordgroup",mode:r.mode,body:V};t&&(L={type:"styling",mode:r.mode,style:t,body:[L]}),A.push(L);var P=r.fetch().text;if(P==="&"){if(b&&A.length===b){if(v||h)throw new z("Too many tab characters: &",r.nextToken);r.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}r.consume()}else if(P==="\\end"){F(),A.length===1&&L.type==="styling"&&L.body.length===1&&L.body[0].type==="ordgroup"&&L.body[0].body.length===0&&(T.length>1||!g)&&T.pop(),q.length0&&(N+=.25),v.push({pos:N,isDashed:xe[we]})}for(F(u[0]),a=0;a0&&(i0+=I,Pxe))for(a=0;a=h)){var J0=void 0;if(n>0||e.hskipBeforeAndAfter){var Kt,Jt;J0=(Kt=(Jt=y0)==null?void 0:Jt.pregap)!=null?Kt:y,J0!==0&&(b0=k(["arraycolsep"],[]),b0.style.width=M(J0),m0.push(b0))}var Qt=[];for(a=0;a0){for(var q1=re("hline",t,g),R1=re("hdashline",t,g),et=[{type:"elem",elem:ye,shift:0}];v.length>0;){var tr=v.pop(),rr=tr.pos-t0;tr.isDashed?et.push({type:"elem",elem:R1,shift:rr}):et.push({type:"elem",elem:q1,shift:rr})}ye=G({positionType:"individualShift",children:et})}if(j0.length===0)return k(["mord"],[ye],t);var E1=G({positionType:"individualShift",children:j0}),I1=k(["tag"],[E1],t);return E0([ye,I1])},Qa={c:"center ",l:"left ",r:"right "},T0=function(e,t){for(var a=[],n=new S("mtd",[],["mtr-glue"]),l=new S("mtd",[],["mml-eqn-num"]),u=0;u0){var A=e.cols,T="",C=!1,q=0,I=A.length;A[0].type==="separator"&&(y+="top ",q=1),A[A.length-1].type==="separator"&&(y+="bottom ",I-=1);for(var N=q;N0?"left ":"",y+=X[X.length-1].length>0?"right ":"";for(var h0=1;h00&&x&&(C=1),a[A]={type:"align",align:T,pregap:C,postgap:0}}return u.colSeparationType=x?"align":"alignat",u};M0({type:"array",names:["array","darray"],props:{numArgs:1},handler(r,e){var t=Ze(e[0]),a=t?[e[0]]:O(e[0],"ordgroup").body,n=a.map(function(u){var h=je(u),c=h.text;if("lcr".includes(c))return{type:"align",align:c};if(c==="|")return{type:"separator",separator:"|"};if(c===":")return{type:"separator",separator:":"};throw new z("Unknown column alignment: "+c,u)}),l={cols:n,hskipBeforeAndAfter:!0,maxNumCols:n.length};return X0(r.parser,l,Vt(r.envName))},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(r){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[r.envName.replace("*","")],t="c",a={hskipBeforeAndAfter:!1,cols:[{type:"align",align:t}]};if(r.envName.charAt(r.envName.length-1)==="*"){var n=r.parser;if(n.consumeSpaces(),n.fetch().text==="["){if(n.consume(),n.consumeSpaces(),t=n.fetch().text,!"lcr".includes(t))throw new z("Expected l or c or r",n.nextToken);n.consume(),n.consumeSpaces(),n.expect("]"),n.consume(),a.cols=[{type:"align",align:t}]}}var l=X0(r.parser,a,Vt(r.envName)),u=Math.max(0,...l.body.map(h=>h.length));return l.cols=new Array(u).fill({type:"align",align:t}),e?{type:"leftright",mode:r.mode,body:[l],left:e[0],right:e[1],rightColor:void 0}:l},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(r){var e={arraystretch:.5},t=X0(r.parser,e,"script");return t.colSeparationType="small",t},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["subarray"],props:{numArgs:1},handler(r,e){var t=Ze(e[0]),a=t?[e[0]]:O(e[0],"ordgroup").body,n=a.map(function(h){var c=je(h),v=c.text;if("lc".includes(v))return{type:"align",align:v};throw new z("Unknown column alignment: "+v,h)});if(n.length>1)throw new z("{subarray} can contain only one column");var l={cols:n,hskipBeforeAndAfter:!1,arraystretch:.5},u=X0(r.parser,l,"script");if(u.body.length>0&&u.body[0].length>1)throw new z("{subarray} can contain only one column");return u},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(r){var e={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},t=X0(r.parser,e,Vt(r.envName));return{type:"leftright",mode:r.mode,body:[t],left:r.envName.includes("r")?".":"\\{",right:r.envName.includes("r")?"\\}":".",rightColor:void 0}},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:m1,htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(r){Ja.has(r.envName)&&Qe(r);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Ut(r.envName),emptySingleRow:!0,leqno:r.parser.settings.leqno};return X0(r.parser,e,"display")},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:m1,htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(r){Qe(r);var e={autoTag:Ut(r.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:r.parser.settings.leqno};return X0(r.parser,e,"display")},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["CD"],props:{numArgs:0},handler(r){return Qe(r),La(r.parser)},htmlBuilder:A0,mathmlBuilder:T0});m("\\nonumber","\\gdef\\@eqnsw{0}");m("\\notag","\\nonumber");B({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(r,e){throw new z(r.funcName+" valid only within array environment")}});var pr=o1;B({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];if(n.type!=="ordgroup")throw new z("Invalid environment name",n);for(var l="",u=0;u{var t=r.font,a=e.withFont(t);return U(r.body,a)},d1=(r,e)=>{var t=r.font,a=e.withFont(t);return Y(r.body,a)},gr={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};B({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=Le(e[0]),l=a;return l in gr&&(l=gr[l]),{type:"font",mode:t.mode,font:l.slice(1),body:n}},htmlBuilder:c1,mathmlBuilder:d1});B({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"mclass",mode:t.mode,mclass:Ke(a),body:[{type:"font",mode:t.mode,font:"boldsymbol",body:a}],isCharacterBox:q0(a)}}});B({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(r,e)=>{var{parser:t,funcName:a,breakOnTokenText:n}=r,{mode:l}=t,u=t.parseExpression(!0,n),h="math"+a.slice(1);return{type:"font",mode:l,font:h,body:{type:"ordgroup",mode:t.mode,body:u}}},htmlBuilder:c1,mathmlBuilder:d1});var _a=(r,e)=>{var t=e.style,a=t.fracNum(),n=t.fracDen(),l;l=e.havingStyle(a);var u=U(r.numer,l,e);if(r.continued){var h=8.5/e.fontMetrics().ptPerEm,c=3.5/e.fontMetrics().ptPerEm;u.height=u.height0?A=3*y:A=7*y,T=e.fontMetrics().denom1):(b>0?(x=e.fontMetrics().num2,A=y):(x=e.fontMetrics().num3,A=3*y),T=e.fontMetrics().denom2);var C;if(g){var I=e.fontMetrics().axisHeight;x-u.depth-(I+.5*b){var t=new S("mfrac",[Y(r.numer,e),Y(r.denom,e)]);if(!r.hasBarLine)t.setAttribute("linethickness","0px");else if(r.barSize){var a=J(r.barSize,e);t.setAttribute("linethickness",M(a))}if(r.leftDelim!=null||r.rightDelim!=null){var n=[];if(r.leftDelim!=null){var l=new S("mo",[new Q(r.leftDelim.replace("\\",""))]);l.setAttribute("fence","true"),n.push(l)}if(n.push(t),r.rightDelim!=null){var u=new S("mo",[new Q(r.rightDelim.replace("\\",""))]);u.setAttribute("fence","true"),n.push(u)}return Nt(n)}return t},f1=(r,e)=>{if(!e)return r;var t={type:"styling",mode:r.mode,style:e,body:[r]};return t};B({type:"genfrac",names:["\\cfrac","\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0],l=e[1],u,h=null,c=null;switch(a){case"\\cfrac":case"\\dfrac":case"\\frac":case"\\tfrac":u=!0;break;case"\\\\atopfrac":u=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":u=!1,h="(",c=")";break;case"\\\\bracefrac":u=!1,h="\\{",c="\\}";break;case"\\\\brackfrac":u=!1,h="[",c="]";break;default:throw new Error("Unrecognized genfrac command")}var v=a==="\\cfrac",g=null;return v||a.startsWith("\\d")?g="display":a.startsWith("\\t")&&(g="text"),f1({type:"genfrac",mode:t.mode,numer:n,denom:l,continued:v,hasBarLine:u,leftDelim:h,rightDelim:c,barSize:null},g)},htmlBuilder:_a,mathmlBuilder:e4});B({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(r){var{parser:e,funcName:t,token:a}=r,n;switch(t){case"\\over":n="\\frac";break;case"\\choose":n="\\binom";break;case"\\atop":n="\\\\atopfrac";break;case"\\brace":n="\\\\bracefrac";break;case"\\brack":n="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:n,token:a}}});var br=["display","text","script","scriptscript"],yr=function(e){var t=null;return e.length>0&&(t=e,t=t==="."?null:t),t};B({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(r,e){var{parser:t}=r,a=e[4],n=e[5],l=Le(e[0]),u=l.type==="atom"&&l.family==="open"?yr(l.text):null,h=Le(e[1]),c=h.type==="atom"&&h.family==="close"?yr(h.text):null,v=O(e[2],"size"),g,b=null;v.isBlank?g=!0:(b=v.value,g=b.number>0);var y=null,x=e[3];if(x.type==="ordgroup"){if(x.body.length>0){var A=O(x.body[0],"textord");y=br[Number(A.text)]}}else x=O(x,"textord"),y=br[Number(x.text)];return f1({type:"genfrac",mode:t.mode,numer:a,denom:n,continued:!1,hasBarLine:g,barSize:b,leftDelim:u,rightDelim:c},y)}});B({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(r,e){var{parser:t,funcName:a,token:n}=r;return{type:"infix",mode:t.mode,replaceWith:"\\\\abovefrac",size:O(e[0],"size").value,token:n}}});B({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0],l=O(e[1],"infix").size;if(!l)throw new Error("\\\\abovefrac expected size, but got "+String(l));var u=e[2],h=l.number>0;return{type:"genfrac",mode:t.mode,numer:n,denom:u,continued:!1,hasBarLine:h,barSize:l,leftDelim:null,rightDelim:null}}});var v1=(r,e)=>{var t=e.style,a,n;r.type==="supsub"?(a=r.sup?U(r.sup,e.havingStyle(t.sup()),e):U(r.sub,e.havingStyle(t.sub()),e),n=O(r.base,"horizBrace")):n=O(r,"horizBrace");var l=U(n.base,e.havingBaseStyle(H.DISPLAY)),u=$e(n,e),h;if(n.isOver?(h=G({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.1},{type:"elem",elem:u}]}),h.children[0].children[0].children[1].classes.push("svg-align")):(h=G({positionType:"bottom",positionData:l.depth+.1+u.height,children:[{type:"elem",elem:u},{type:"kern",size:.1},{type:"elem",elem:l}]}),h.children[0].children[0].children[0].classes.push("svg-align")),a){var c=k(["mord",n.isOver?"mover":"munder"],[h],e);n.isOver?h=G({positionType:"firstBaseline",children:[{type:"elem",elem:c},{type:"kern",size:.2},{type:"elem",elem:a}]}):h=G({positionType:"bottom",positionData:c.depth+.2+a.height+a.depth,children:[{type:"elem",elem:a},{type:"kern",size:.2},{type:"elem",elem:c}]})}return k(["mord",n.isOver?"mover":"munder"],[h],e)},t4=(r,e)=>{var t=We(r.label);return new S(r.isOver?"mover":"munder",[Y(r.base,e),t])};B({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(r,e){var{parser:t,funcName:a}=r;return{type:"horizBrace",mode:t.mode,label:a,isOver:/^\\over/.test(a),base:e[0]}},htmlBuilder:v1,mathmlBuilder:t4});B({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[1],n=O(e[0],"url").url;return t.settings.isTrusted({command:"\\href",url:n})?{type:"href",mode:t.mode,href:n,body:_(a)}:t.formatUnsupportedCmd("\\href")},htmlBuilder:(r,e)=>{var t=r0(r.body,e,!1);return ga(r.href,[],t,e)},mathmlBuilder:(r,e)=>{var t=V0(r.body,e);return t instanceof S||(t=new S("mrow",[t])),t.setAttribute("href",r.href),t}});B({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=O(e[0],"url").url;if(!t.settings.isTrusted({command:"\\url",url:a}))return t.formatUnsupportedCmd("\\url");for(var n=[],l=0;l{var{parser:t,funcName:a,token:n}=r,l=O(e[0],"raw").string,u=e[1];t.settings.strict&&t.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var h,c={};switch(a){case"\\htmlClass":c.class=l,h={command:"\\htmlClass",class:l};break;case"\\htmlId":c.id=l,h={command:"\\htmlId",id:l};break;case"\\htmlStyle":c.style=l,h={command:"\\htmlStyle",style:l};break;case"\\htmlData":{for(var v=l.split(","),g=0;g{var t=r0(r.body,e,!1),a=["enclosing"];r.attributes.class&&a.push(...r.attributes.class.trim().split(/\s+/));var n=k(a,t,e);for(var l in r.attributes)l!=="class"&&r.attributes.hasOwnProperty(l)&&n.setAttribute(l,r.attributes[l]);return n},mathmlBuilder:(r,e)=>V0(r.body,e)});B({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInArgument:!0,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r;return{type:"htmlmathml",mode:t.mode,html:_(e[0]),mathml:_(e[1])}},htmlBuilder:(r,e)=>{var t=r0(r.html,e,!1);return E0(t)},mathmlBuilder:(r,e)=>V0(r.mathml,e)});var mt=function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var t=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!t)throw new z("Invalid size: '"+e+"' in \\includegraphics");var a={number:+(t[1]+t[2]),unit:t[3]};if(!Er(a))throw new z("Invalid unit: '"+a.unit+"' in \\includegraphics.");return a};B({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(r,e,t)=>{var{parser:a}=r,n={number:0,unit:"em"},l={number:.9,unit:"em"},u={number:0,unit:"em"},h="";if(t[0])for(var c=O(t[0],"raw").string,v=c.split(","),g=0;g{var t=J(r.height,e),a=0;r.totalheight.number>0&&(a=J(r.totalheight,e)-t);var n=0;r.width.number>0&&(n=J(r.width,e));var l={height:M(t+a)};n>0&&(l.width=M(n)),a>0&&(l.verticalAlign=M(-a));var u=new bt(r.src,r.alt,l);return u.height=t,u.depth=a,u},mathmlBuilder:(r,e)=>{var t=new S("mglyph",[]);t.setAttribute("alt",r.alt);var a=J(r.height,e),n=0;if(r.totalheight.number>0&&(n=J(r.totalheight,e)-a,t.setAttribute("valign",M(-n))),t.setAttribute("height",M(a+n)),r.width.number>0){var l=J(r.width,e);t.setAttribute("width",M(l))}return t.setAttribute("src",r.src),t}});B({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(r,e){var{parser:t,funcName:a}=r,n=O(e[0],"size");if(t.settings.strict){var l=a[1]==="m",u=n.value.unit==="mu";l?(u||t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" supports only mu units, "+("not "+n.value.unit+" units")),t.mode!=="math"&&t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" works only in math mode")):u&&t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" doesn't support mu units")}return{type:"kern",mode:t.mode,dimension:n.value}},htmlBuilder(r,e){return Lr(r.dimension,e)},mathmlBuilder(r,e){var t=J(r.dimension,e);return new Pe(t)}});B({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"lap",mode:t.mode,alignment:a.slice(5),body:n}},htmlBuilder:(r,e)=>{var t;r.alignment==="clap"?(t=k([],[U(r.body,e)]),t=k(["inner"],[t],e)):t=k(["inner"],[U(r.body,e)]);var a=k(["fix"],[]),n=k([r.alignment],[t,a],e),l=k(["strut"]);return l.style.height=M(n.height+n.depth),n.depth&&(l.style.verticalAlign=M(-n.depth)),n.children.unshift(l),n=k(["thinbox"],[n],e),k(["mord","vbox"],[n],e)},mathmlBuilder:(r,e)=>{var t=new S("mpadded",[Y(r.body,e)]);if(r.alignment!=="rlap"){var a=r.alignment==="llap"?"-1":"-0.5";t.setAttribute("lspace",a+"width")}return t.setAttribute("width","0px"),t}});B({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(r,e){var{funcName:t,parser:a}=r,n=a.mode;a.switchMode("math");var l=t==="\\("?"\\)":"$",u=a.parseExpression(!1,l);return a.expect(l),a.switchMode(n),{type:"styling",mode:a.mode,style:"text",body:u}}});B({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(r,e){throw new z("Mismatched "+r.funcName)}});var xr=(r,e)=>{switch(e.style.size){case H.DISPLAY.size:return r.display;case H.TEXT.size:return r.text;case H.SCRIPT.size:return r.script;case H.SCRIPTSCRIPT.size:return r.scriptscript;default:return r.text}};B({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(r,e)=>{var{parser:t}=r;return{type:"mathchoice",mode:t.mode,display:_(e[0]),text:_(e[1]),script:_(e[2]),scriptscript:_(e[3])}},htmlBuilder:(r,e)=>{var t=xr(r,e),a=r0(t,e,!1);return E0(a)},mathmlBuilder:(r,e)=>{var t=xr(r,e);return V0(t,e)}});var p1=(r,e,t,a,n,l,u)=>{r=k([],[r]);var h=t&&q0(t),c,v;if(e){var g=U(e,a.havingStyle(n.sup()),a);v={elem:g,kern:Math.max(a.fontMetrics().bigOpSpacing1,a.fontMetrics().bigOpSpacing3-g.depth)}}if(t){var b=U(t,a.havingStyle(n.sub()),a);c={elem:b,kern:Math.max(a.fontMetrics().bigOpSpacing2,a.fontMetrics().bigOpSpacing4-b.height)}}var y;if(v&&c){var x=a.fontMetrics().bigOpSpacing5+c.elem.height+c.elem.depth+c.kern+r.depth+u;y=G({positionType:"bottom",positionData:x,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:c.elem,marginLeft:M(-l)},{type:"kern",size:c.kern},{type:"elem",elem:r},{type:"kern",size:v.kern},{type:"elem",elem:v.elem,marginLeft:M(l)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]})}else if(c){var A=r.height-u;y=G({positionType:"top",positionData:A,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:c.elem,marginLeft:M(-l)},{type:"kern",size:c.kern},{type:"elem",elem:r}]})}else if(v){var T=r.depth+u;y=G({positionType:"bottom",positionData:T,children:[{type:"elem",elem:r},{type:"kern",size:v.kern},{type:"elem",elem:v.elem,marginLeft:M(l)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]})}else return r;var C=[y];if(c&&l!==0&&!h){var q=k(["mspace"],[],a);q.style.marginRight=M(l),C.unshift(q)}return k(["mop","op-limits"],C,a)},g1=new Set(["\\smallint"]),ie=(r,e)=>{var t,a,n=!1,l;r.type==="supsub"?(t=r.sup,a=r.sub,l=O(r.base,"op"),n=!0):l=O(r,"op");var u=e.style,h=!1;u.size===H.DISPLAY.size&&l.symbol&&!g1.has(l.name)&&(h=!0);var c;if(l.symbol){var v=h?"Size2-Regular":"Size1-Regular",g="";if((l.name==="\\oiint"||l.name==="\\oiiint")&&(g=l.name.slice(1),l.name=g==="oiint"?"\\iint":"\\iiint"),c=l0(l.name,v,"math",e,["mop","op-symbol",h?"large-op":"small-op"]),g.length>0){var b=c.italic,y=Gr(g+"Size"+(h?"2":"1"),e);c=G({positionType:"individualShift",children:[{type:"elem",elem:c,shift:0},{type:"elem",elem:y,shift:h?.08:0}]}),l.name="\\"+g,c.classes.unshift("mop"),c.italic=b}}else if(l.body){var x=r0(l.body,e,!0);x.length===1&&x[0]instanceof u0?(c=x[0],c.classes[0]="mop"):c=k(["mop"],x,e)}else{for(var A=[],T=1;T{var t;if(r.symbol)t=new S("mo",[g0(r.name,r.mode)]),g1.has(r.name)&&t.setAttribute("largeop","false");else if(r.body)t=new S("mo",v0(r.body,e));else{t=new S("mi",[new Q(r.name.slice(1))]);var a=new S("mo",[g0("\u2061","text")]);r.parentIsSupSub?t=new S("mrow",[t,a]):t=Xr([t,a])}return t},r4={"\u220F":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22C0":"\\bigwedge","\u22C1":"\\bigvee","\u22C2":"\\bigcap","\u22C3":"\\bigcup","\u2A00":"\\bigodot","\u2A01":"\\bigoplus","\u2A02":"\\bigotimes","\u2A04":"\\biguplus","\u2A06":"\\bigsqcup"};B({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220F","\u2210","\u2211","\u22C0","\u22C1","\u22C2","\u22C3","\u2A00","\u2A01","\u2A02","\u2A04","\u2A06"],props:{numArgs:0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=a;return n.length===1&&(n=r4[n]),{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:ie,mathmlBuilder:ve});B({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:_(a)}},htmlBuilder:ie,mathmlBuilder:ve});var a4={"\u222B":"\\int","\u222C":"\\iint","\u222D":"\\iiint","\u222E":"\\oint","\u222F":"\\oiint","\u2230":"\\oiiint"};B({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(r){var{parser:e,funcName:t}=r;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:ie,mathmlBuilder:ve});B({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(r){var{parser:e,funcName:t}=r;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:ie,mathmlBuilder:ve});B({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222B","\u222C","\u222D","\u222E","\u222F","\u2230"],props:{numArgs:0,allowedInArgument:!0},handler(r){var{parser:e,funcName:t}=r,a=t;return a.length===1&&(a=a4[a]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:ie,mathmlBuilder:ve});var b1=(r,e)=>{var t,a,n=!1,l;r.type==="supsub"?(t=r.sup,a=r.sub,l=O(r.base,"operatorname"),n=!0):l=O(r,"operatorname");var u;if(l.body.length>0){for(var h=l.body.map(b=>{var y="text"in b?b.text:void 0;return typeof y=="string"?{type:"textord",mode:b.mode,text:y}:b}),c=r0(h,e.withFont("mathrm"),!0),v=0;v{for(var t=v0(r.body,e.withFont("mathrm")),a=!0,n=0;ng.toText()).join("");t=[new Q(h)]}var c=new S("mi",t);c.setAttribute("mathvariant","normal");var v=new S("mo",[g0("\u2061","text")]);return r.parentIsSupSub?new S("mrow",[c,v]):Xr([c,v])};B({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"operatorname",mode:t.mode,body:_(n),alwaysHandleSupSub:a==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},htmlBuilder:b1,mathmlBuilder:n4});m("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");$0({type:"ordgroup",htmlBuilder(r,e){return r.semisimple?E0(r0(r.body,e,!1)):k(["mord"],r0(r.body,e,!0),e)},mathmlBuilder(r,e){return V0(r.body,e,!0)}});B({type:"overline",names:["\\overline"],props:{numArgs:1},handler(r,e){var{parser:t}=r,a=e[0];return{type:"overline",mode:t.mode,body:a}},htmlBuilder(r,e){var t=U(r.body,e.havingCrampedStyle()),a=re("overline-line",e),n=e.fontMetrics().defaultRuleThickness,l=G({positionType:"firstBaseline",children:[{type:"elem",elem:t},{type:"kern",size:3*n},{type:"elem",elem:a},{type:"kern",size:n}]});return k(["mord","overline"],[l],e)},mathmlBuilder(r,e){var t=new S("mo",[new Q("\u203E")]);t.setAttribute("stretchy","true");var a=new S("mover",[Y(r.body,e),t]);return a.setAttribute("accent","true"),a}});B({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"phantom",mode:t.mode,body:_(a)}},htmlBuilder:(r,e)=>{var t=r0(r.body,e.withPhantom(),!1);return E0(t)},mathmlBuilder:(r,e)=>{var t=v0(r.body,e);return new S("mphantom",t)}});m("\\hphantom","\\smash{\\phantom{#1}}");B({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"vphantom",mode:t.mode,body:a}},htmlBuilder:(r,e)=>{var t=k(["inner"],[U(r.body,e.withPhantom())]),a=k(["fix"],[]);return k(["mord","rlap"],[t,a],e)},mathmlBuilder:(r,e)=>{var t=v0(_(r.body),e),a=new S("mphantom",t),n=new S("mpadded",[a]);return n.setAttribute("width","0px"),n}});B({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(r,e){var{parser:t}=r,a=O(e[0],"size").value,n=e[1];return{type:"raisebox",mode:t.mode,dy:a,body:n}},htmlBuilder(r,e){var t=U(r.body,e),a=J(r.dy,e);return G({positionType:"shift",positionData:-a,children:[{type:"elem",elem:t}]})},mathmlBuilder(r,e){var t=new S("mpadded",[Y(r.body,e)]),a=r.dy.number+r.dy.unit;return t.setAttribute("voffset",a),t}});B({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0,allowedInArgument:!0},handler(r){var{parser:e}=r;return{type:"internal",mode:e.mode}}});B({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(r,e,t){var{parser:a}=r,n=t[0],l=O(e[0],"size"),u=O(e[1],"size");return{type:"rule",mode:a.mode,shift:n&&O(n,"size").value,width:l.value,height:u.value}},htmlBuilder(r,e){var t=k(["mord","rule"],[],e),a=J(r.width,e),n=J(r.height,e),l=r.shift?J(r.shift,e):0;return t.style.borderRightWidth=M(a),t.style.borderTopWidth=M(n),t.style.bottom=M(l),t.width=a,t.height=n+l,t.depth=-l,t.maxFontSize=n*1.125*e.sizeMultiplier,t},mathmlBuilder(r,e){var t=J(r.width,e),a=J(r.height,e),n=r.shift?J(r.shift,e):0,l=e.color&&e.getColor()||"black",u=new S("mspace");u.setAttribute("mathbackground",l),u.setAttribute("width",M(t)),u.setAttribute("height",M(a));var h=new S("mpadded",[u]);return n>=0?h.setAttribute("height",M(n)):(h.setAttribute("height",M(n)),h.setAttribute("depth",M(-n))),h.setAttribute("voffset",M(n)),h}});function y1(r,e,t){for(var a=r0(r,e,!1),n=e.sizeMultiplier/t.sizeMultiplier,l=0;l{var t=e.havingSize(r.size);return y1(r.body,t,e)};B({type:"sizing",names:wr,props:{numArgs:0,allowedInText:!0},handler:(r,e)=>{var{breakOnTokenText:t,funcName:a,parser:n}=r,l=n.parseExpression(!1,t);return{type:"sizing",mode:n.mode,size:wr.indexOf(a)+1,body:l}},htmlBuilder:i4,mathmlBuilder:(r,e)=>{var t=e.havingSize(r.size),a=v0(r.body,t),n=new S("mstyle",a);return n.setAttribute("mathsize",M(t.sizeMultiplier)),n}});B({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(r,e,t)=>{var{parser:a}=r,n=!1,l=!1,u=t[0]&&O(t[0],"ordgroup");if(u)for(var h="",c=0;c{var t=k([],[U(r.body,e)]);if(!r.smashHeight&&!r.smashDepth)return t;if(r.smashHeight&&(t.height=0),r.smashDepth&&(t.depth=0),r.smashHeight&&r.smashDepth)return k(["mord","smash"],[t],e);if(t.children)for(var a=0;a{var t=new S("mpadded",[Y(r.body,e)]);return r.smashHeight&&t.setAttribute("height","0px"),r.smashDepth&&t.setAttribute("depth","0px"),t}});B({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(r,e,t){var{parser:a}=r,n=t[0],l=e[0];return{type:"sqrt",mode:a.mode,body:l,index:n}},htmlBuilder(r,e){var t=U(r.body,e.havingCrampedStyle());t.height===0&&(t.height=e.fontMetrics().xHeight),t=ae(t,e);var a=e.fontMetrics(),n=a.defaultRuleThickness,l=n;e.style.idt.height+t.depth+u&&(u=(u+b-t.height-t.depth)/2);var y=c.height-t.height-u-v;t.style.paddingLeft=M(g);var x=G({positionType:"firstBaseline",children:[{type:"elem",elem:t,wrapperClasses:["svg-align"]},{type:"kern",size:-(t.height+y)},{type:"elem",elem:c},{type:"kern",size:v}]});if(r.index){var A=e.havingStyle(H.SCRIPTSCRIPT),T=U(r.index,A,e),C=.6*(x.height-x.depth),q=G({positionType:"shift",positionData:-C,children:[{type:"elem",elem:T}]}),I=k(["root"],[q]);return k(["mord","sqrt"],[I,x],e)}else return k(["mord","sqrt"],[x],e)},mathmlBuilder(r,e){var{body:t,index:a}=r;return a?new S("mroot",[Y(t,e),Y(a,e)]):new S("msqrt",[Y(t,e)])}});var kr={display:H.DISPLAY,text:H.TEXT,script:H.SCRIPT,scriptscript:H.SCRIPTSCRIPT};B({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r,e){var{breakOnTokenText:t,funcName:a,parser:n}=r,l=n.parseExpression(!0,t),u=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:u,body:l}},htmlBuilder(r,e){var t=kr[r.style],a=e.havingStyle(t).withFont("");return y1(r.body,a,e)},mathmlBuilder(r,e){var t=kr[r.style],a=e.havingStyle(t),n=v0(r.body,a),l=new S("mstyle",n),u={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},h=u[r.style];return l.setAttribute("scriptlevel",h[0]),l.setAttribute("displaystyle",h[1]),l}});var l4=function(e,t){var a=e.base;if(a)if(a.type==="op"){var n=a.limits&&(t.style.size===H.DISPLAY.size||a.alwaysHandleSupSub);return n?ie:null}else if(a.type==="operatorname"){var l=a.alwaysHandleSupSub&&(t.style.size===H.DISPLAY.size||a.limits);return l?b1:null}else{if(a.type==="accent")return q0(a.base)?Ft:null;if(a.type==="horizBrace"){var u=!e.sub;return u===a.isOver?v1:null}else return null}else return null};$0({type:"supsub",htmlBuilder(r,e){var t=l4(r,e);if(t)return t(r,e);var{base:a,sup:n,sub:l}=r,u=U(a,e),h,c,v=e.fontMetrics(),g=0,b=0,y=a&&q0(a);if(n){var x=e.havingStyle(e.style.sup());h=U(n,x,e),y||(g=u.height-x.fontMetrics().supDrop*x.sizeMultiplier/e.sizeMultiplier)}if(l){var A=e.havingStyle(e.style.sub());c=U(l,A,e),y||(b=u.depth+A.fontMetrics().subDrop*A.sizeMultiplier/e.sizeMultiplier)}var T;e.style===H.DISPLAY?T=v.sup1:e.style.cramped?T=v.sup3:T=v.sup2;var C=e.sizeMultiplier,q=M(.5/v.ptPerEm/C),I=null;if(c){var N=r.base&&r.base.type==="op"&&r.base.name&&(r.base.name==="\\oiint"||r.base.name==="\\oiiint");(u instanceof u0||N)&&(I=M(-u.italic))}var F;if(h&&c){g=Math.max(g,T,h.depth+.25*v.xHeight),b=Math.max(b,v.sub2);var V=v.defaultRuleThickness,L=4*V;if(g-h.depth-(c.height-b)0&&(g+=P,b-=P)}var W=[{type:"elem",elem:c,shift:b,marginRight:q,marginLeft:I},{type:"elem",elem:h,shift:-g,marginRight:q}];F=G({positionType:"individualShift",children:W})}else if(c){b=Math.max(b,v.sub1,c.height-.8*v.xHeight);var X=[{type:"elem",elem:c,marginLeft:I,marginRight:q}];F=G({positionType:"shift",positionData:b,children:X})}else if(h)g=Math.max(g,T,h.depth+.25*v.xHeight),F=G({positionType:"shift",positionData:-g,children:[{type:"elem",elem:h,marginRight:q}]});else throw new Error("supsub must have either sup or sub.");var h0=St(u,"right")||"mord";return k([h0],[u,k(["msupsub"],[F])],e)},mathmlBuilder(r,e){var t=!1,a,n;r.base&&r.base.type==="horizBrace"&&(n=!!r.sup,n===r.base.isOver&&(t=!0,a=r.base.isOver)),r.base&&(r.base.type==="op"||r.base.type==="operatorname")&&(r.base.parentIsSupSub=!0);var l=[Y(r.base,e)];r.sub&&l.push(Y(r.sub,e)),r.sup&&l.push(Y(r.sup,e));var u;if(t)u=a?"mover":"munder";else if(r.sub)if(r.sup){var v=r.base;v&&v.type==="op"&&v.limits&&e.style===H.DISPLAY||v&&v.type==="operatorname"&&v.alwaysHandleSupSub&&(e.style===H.DISPLAY||v.limits)?u="munderover":u="msubsup"}else{var c=r.base;c&&c.type==="op"&&c.limits&&(e.style===H.DISPLAY||c.alwaysHandleSupSub)||c&&c.type==="operatorname"&&c.alwaysHandleSupSub&&(c.limits||e.style===H.DISPLAY)?u="munder":u="msub"}else{var h=r.base;h&&h.type==="op"&&h.limits&&(e.style===H.DISPLAY||h.alwaysHandleSupSub)||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(h.limits||e.style===H.DISPLAY)?u="mover":u="msup"}return new S(u,l)}});$0({type:"atom",htmlBuilder(r,e){return It(r.text,r.mode,e,["m"+r.family])},mathmlBuilder(r,e){var t=new S("mo",[g0(r.text,r.mode)]);if(r.family==="bin"){var a=Ot(r,e);a==="bold-italic"&&t.setAttribute("mathvariant",a)}else r.family==="punct"?t.setAttribute("separator","true"):(r.family==="open"||r.family==="close")&&t.setAttribute("stretchy","false");return t}});var x1={mi:"italic",mn:"normal",mtext:"normal"};$0({type:"mathord",htmlBuilder(r,e){return Ye(r,e,"mathord")},mathmlBuilder(r,e){var t=new S("mi",[g0(r.text,r.mode,e)]),a=Ot(r,e)||"italic";return a!==x1[t.type]&&t.setAttribute("mathvariant",a),t}});$0({type:"textord",htmlBuilder(r,e){return Ye(r,e,"textord")},mathmlBuilder(r,e){var t=g0(r.text,r.mode,e),a=Ot(r,e)||"normal",n;return r.mode==="text"?n=new S("mtext",[t]):/[0-9]/.test(r.text)?n=new S("mn",[t]):r.text==="\\prime"?n=new S("mo",[t]):n=new S("mi",[t]),a!==x1[n.type]&&n.setAttribute("mathvariant",a),n}});var ct={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},dt={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};$0({type:"spacing",htmlBuilder(r,e){if(dt.hasOwnProperty(r.text)){var t=dt[r.text].className||"";if(r.mode==="text"){var a=Ye(r,e,"textord");return a.classes.push(t),a}else return k(["mspace",t],[It(r.text,r.mode,e)],e)}else{if(ct.hasOwnProperty(r.text))return k(["mspace",ct[r.text]],[],e);throw new z('Unknown type of space "'+r.text+'"')}},mathmlBuilder(r,e){var t;if(dt.hasOwnProperty(r.text))t=new S("mtext",[new Q("\xA0")]);else{if(ct.hasOwnProperty(r.text))return new S("mspace");throw new z('Unknown type of space "'+r.text+'"')}return t}});var Sr=()=>{var r=new S("mtd",[]);return r.setAttribute("width","50%"),r};$0({type:"tag",mathmlBuilder(r,e){var t=new S("mtable",[new S("mtr",[Sr(),new S("mtd",[V0(r.body,e)]),Sr(),new S("mtd",[V0(r.tag,e)])])]);return t.setAttribute("width","100%"),t}});var zr={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Mr={"\\textbf":"textbf","\\textmd":"textmd"},s4={"\\textit":"textit","\\textup":"textup"},Ar=(r,e)=>{var t=r.font;if(t){if(zr[t])return e.withTextFontFamily(zr[t]);if(Mr[t])return e.withTextFontWeight(Mr[t]);if(t==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(s4[t])};B({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"text",mode:t.mode,body:_(n),font:a}},htmlBuilder(r,e){var t=Ar(r,e),a=r0(r.body,t,!0);return k(["mord","text"],a,t)},mathmlBuilder(r,e){var t=Ar(r,e);return V0(r.body,t)}});B({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"underline",mode:t.mode,body:e[0]}},htmlBuilder(r,e){var t=U(r.body,e),a=re("underline-line",e),n=e.fontMetrics().defaultRuleThickness,l=G({positionType:"top",positionData:t.height,children:[{type:"kern",size:n},{type:"elem",elem:a},{type:"kern",size:3*n},{type:"elem",elem:t}]});return k(["mord","underline"],[l],e)},mathmlBuilder(r,e){var t=new S("mo",[new Q("\u203E")]);t.setAttribute("stretchy","true");var a=new S("munder",[Y(r.body,e),t]);return a.setAttribute("accentunder","true"),a}});B({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(r,e){var{parser:t}=r;return{type:"vcenter",mode:t.mode,body:e[0]}},htmlBuilder(r,e){var t=U(r.body,e),a=e.fontMetrics().axisHeight,n=.5*(t.height-a-(t.depth+a));return G({positionType:"shift",positionData:n,children:[{type:"elem",elem:t}]})},mathmlBuilder(r,e){return new S("mpadded",[Y(r.body,e)],["vcenter"])}});B({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(r,e,t){throw new z("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(r,e){for(var t=Tr(r),a=[],n=e.havingStyle(e.style.text()),l=0;lr.body.replace(/ /g,r.star?"\u2423":"\xA0"),F0=Ur,w1=`[ \r - ]`,u4="\\\\[a-zA-Z@]+",o4="\\\\[^\uD800-\uDFFF]",h4="("+u4+")"+w1+"*",m4=`\\\\( -|[ \r ]+ -?)[ \r ]*`,Bt="[\u0300-\u036F]",c4=new RegExp(Bt+"+$"),d4="("+w1+"+)|"+(m4+"|")+"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]"+(Bt+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(Bt+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+h4)+("|"+o4+")"),Ge=class{constructor(e,t){this.input=e,this.settings=t,this.tokenRegex=new RegExp(d4,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){var e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new d0("EOF",new c0(this,t,t));var a=this.tokenRegex.exec(e);if(a===null||a.index!==t)throw new z("Unexpected character: '"+e[t]+"'",new d0(e[t],new c0(this,t,t+1)));var n=a[6]||a[3]||(a[2]?"\\ ":" ");if(this.catcodes[n]===14){var l=e.indexOf(` -`,this.tokenRegex.lastIndex);return l===-1?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=l+1,this.lex()}return new d0(n,new c0(this,t,this.tokenRegex.lastIndex))}},Dt=class{constructor(e,t){e===void 0&&(e={}),t===void 0&&(t={}),this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new z("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var t in e)e.hasOwnProperty(t)&&(e[t]==null?delete this.current[t]:this.current[t]=e[t])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,t,a){if(a===void 0&&(a=!1),a){for(var n=0;n0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var l=this.undefStack[this.undefStack.length-1];l&&!l.hasOwnProperty(e)&&(l[e]=this.current[e])}t==null?delete this.current[e]:this.current[e]=t}},f4=h1;m("\\noexpand",function(r){var e=r.popToken();return r.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});m("\\expandafter",function(r){var e=r.popToken();return r.expandOnce(!0),{tokens:[e],numArgs:0}});m("\\@firstoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[0],numArgs:0}});m("\\@secondoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[1],numArgs:0}});m("\\@ifnextchar",function(r){var e=r.consumeArgs(3);r.consumeSpaces();var t=r.future();return e[0].length===1&&e[0][0].text===t.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});m("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");m("\\TextOrMath",function(r){var e=r.consumeArgs(2);return r.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var Br={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};m("\\char",function(r){var e=r.popToken(),t,a=0;if(e.text==="'")t=8,e=r.popToken();else if(e.text==='"')t=16,e=r.popToken();else if(e.text==="`")if(e=r.popToken(),e.text[0]==="\\")a=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new z("\\char` missing argument");a=e.text.charCodeAt(0)}else t=10;if(t){if(a=Br[e.text],a==null||a>=t)throw new z("Invalid base-"+t+" digit "+e.text);for(var n;(n=Br[r.future().text])!=null&&n{var n=r.consumeArg().tokens;if(n.length!==1)throw new z("\\newcommand's first argument must be a macro name");var l=n[0].text,u=r.isDefined(l);if(u&&!e)throw new z("\\newcommand{"+l+"} attempting to redefine "+(l+"; use \\renewcommand"));if(!u&&!t)throw new z("\\renewcommand{"+l+"} when command "+l+" does not yet exist; use \\newcommand");var h=0;if(n=r.consumeArg().tokens,n.length===1&&n[0].text==="["){for(var c="",v=r.expandNextToken();v.text!=="]"&&v.text!=="EOF";)c+=v.text,v=r.expandNextToken();if(!c.match(/^\s*[0-9]+\s*$/))throw new z("Invalid number of arguments: "+c);h=parseInt(c),n=r.consumeArg().tokens}return u&&a||r.macros.set(l,{tokens:n,numArgs:h}),""};m("\\newcommand",r=>Xt(r,!1,!0,!1));m("\\renewcommand",r=>Xt(r,!0,!1,!1));m("\\providecommand",r=>Xt(r,!0,!0,!0));m("\\message",r=>{var e=r.consumeArgs(1)[0];return console.log(e.reverse().map(t=>t.text).join("")),""});m("\\errmessage",r=>{var e=r.consumeArgs(1)[0];return console.error(e.reverse().map(t=>t.text).join("")),""});m("\\show",r=>{var e=r.popToken(),t=e.text;return console.log(e,r.macros.get(t),F0[t],$.math[t],$.text[t]),""});m("\\bgroup","{");m("\\egroup","}");m("~","\\nobreakspace");m("\\lq","`");m("\\rq","'");m("\\aa","\\r a");m("\\AA","\\r A");m("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");m("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");m("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");m("\u212C","\\mathscr{B}");m("\u2130","\\mathscr{E}");m("\u2131","\\mathscr{F}");m("\u210B","\\mathscr{H}");m("\u2110","\\mathscr{I}");m("\u2112","\\mathscr{L}");m("\u2133","\\mathscr{M}");m("\u211B","\\mathscr{R}");m("\u212D","\\mathfrak{C}");m("\u210C","\\mathfrak{H}");m("\u2128","\\mathfrak{Z}");m("\\Bbbk","\\Bbb{k}");m("\xB7","\\cdotp");m("\\llap","\\mathllap{\\textrm{#1}}");m("\\rlap","\\mathrlap{\\textrm{#1}}");m("\\clap","\\mathclap{\\textrm{#1}}");m("\\mathstrut","\\vphantom{(}");m("\\underbar","\\underline{\\text{#1}}");m("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}\\nobreak}{\\char"338}');m("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");m("\\ne","\\neq");m("\u2260","\\neq");m("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");m("\u2209","\\notin");m("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");m("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");m("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");m("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");m("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");m("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");m("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");m("\u27C2","\\perp");m("\u203C","\\mathclose{!\\mkern-0.8mu!}");m("\u220C","\\notni");m("\u231C","\\ulcorner");m("\u231D","\\urcorner");m("\u231E","\\llcorner");m("\u231F","\\lrcorner");m("\xA9","\\copyright");m("\xAE","\\textregistered");m("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');m("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');m("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');m("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');m("\\vdots","{\\varvdots\\rule{0pt}{15pt}}");m("\u22EE","\\vdots");m("\\varGamma","\\mathit{\\Gamma}");m("\\varDelta","\\mathit{\\Delta}");m("\\varTheta","\\mathit{\\Theta}");m("\\varLambda","\\mathit{\\Lambda}");m("\\varXi","\\mathit{\\Xi}");m("\\varPi","\\mathit{\\Pi}");m("\\varSigma","\\mathit{\\Sigma}");m("\\varUpsilon","\\mathit{\\Upsilon}");m("\\varPhi","\\mathit{\\Phi}");m("\\varPsi","\\mathit{\\Psi}");m("\\varOmega","\\mathit{\\Omega}");m("\\substack","\\begin{subarray}{c}#1\\end{subarray}");m("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");m("\\boxed","\\fbox{$\\displaystyle{#1}$}");m("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");m("\\implies","\\DOTSB\\;\\Longrightarrow\\;");m("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");m("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}");m("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");var Dr={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"},v4=new Set(["bin","rel"]);m("\\dots",function(r){var e="\\dotso",t=r.expandAfterFuture().text;return t in Dr?e=Dr[t]:(t.slice(0,4)==="\\not"||t in $.math&&v4.has($.math[t].group))&&(e="\\dotsb"),e});var Yt={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};m("\\dotso",function(r){var e=r.future().text;return e in Yt?"\\ldots\\,":"\\ldots"});m("\\dotsc",function(r){var e=r.future().text;return e in Yt&&e!==","?"\\ldots\\,":"\\ldots"});m("\\cdots",function(r){var e=r.future().text;return e in Yt?"\\@cdots\\,":"\\@cdots"});m("\\dotsb","\\cdots");m("\\dotsm","\\cdots");m("\\dotsi","\\!\\cdots");m("\\dotsx","\\ldots\\,");m("\\DOTSI","\\relax");m("\\DOTSB","\\relax");m("\\DOTSX","\\relax");m("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");m("\\,","\\tmspace+{3mu}{.1667em}");m("\\thinspace","\\,");m("\\>","\\mskip{4mu}");m("\\:","\\tmspace+{4mu}{.2222em}");m("\\medspace","\\:");m("\\;","\\tmspace+{5mu}{.2777em}");m("\\thickspace","\\;");m("\\!","\\tmspace-{3mu}{.1667em}");m("\\negthinspace","\\!");m("\\negmedspace","\\tmspace-{4mu}{.2222em}");m("\\negthickspace","\\tmspace-{5mu}{.277em}");m("\\enspace","\\kern.5em ");m("\\enskip","\\hskip.5em\\relax");m("\\quad","\\hskip1em\\relax");m("\\qquad","\\hskip2em\\relax");m("\\tag","\\@ifstar\\tag@literal\\tag@paren");m("\\tag@paren","\\tag@literal{({#1})}");m("\\tag@literal",r=>{if(r.macros.get("\\df@tag"))throw new z("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});m("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");m("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");m("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");m("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");m("\\newline","\\\\\\relax");m("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var k1=M(S0["Main-Regular"][84][1]-.7*S0["Main-Regular"][65][1]);m("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+k1+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");m("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+k1+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");m("\\hspace","\\@ifstar\\@hspacer\\@hspace");m("\\@hspace","\\hskip #1\\relax");m("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");m("\\ordinarycolon",":");m("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");m("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');m("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');m("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');m("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');m("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');m("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');m("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');m("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');m("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');m("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');m("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');m("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');m("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');m("\u2237","\\dblcolon");m("\u2239","\\eqcolon");m("\u2254","\\coloneqq");m("\u2255","\\eqqcolon");m("\u2A74","\\Coloneqq");m("\\ratio","\\vcentcolon");m("\\coloncolon","\\dblcolon");m("\\colonequals","\\coloneqq");m("\\coloncolonequals","\\Coloneqq");m("\\equalscolon","\\eqqcolon");m("\\equalscoloncolon","\\Eqqcolon");m("\\colonminus","\\coloneq");m("\\coloncolonminus","\\Coloneq");m("\\minuscolon","\\eqcolon");m("\\minuscoloncolon","\\Eqcolon");m("\\coloncolonapprox","\\Colonapprox");m("\\coloncolonsim","\\Colonsim");m("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");m("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");m("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");m("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");m("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");m("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");m("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");m("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");m("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");m("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");m("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");m("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");m("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");m("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");m("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");m("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");m("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");m("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");m("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");m("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");m("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");m("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");m("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");m("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");m("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");m("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");m("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");m("\\imath","\\html@mathml{\\@imath}{\u0131}");m("\\jmath","\\html@mathml{\\@jmath}{\u0237}");m("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");m("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");m("\u27E6","\\llbracket");m("\u27E7","\\rrbracket");m("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");m("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");m("\u2983","\\lBrace");m("\u2984","\\rBrace");m("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");m("\u29B5","\\minuso");m("\\darr","\\downarrow");m("\\dArr","\\Downarrow");m("\\Darr","\\Downarrow");m("\\lang","\\langle");m("\\rang","\\rangle");m("\\uarr","\\uparrow");m("\\uArr","\\Uparrow");m("\\Uarr","\\Uparrow");m("\\N","\\mathbb{N}");m("\\R","\\mathbb{R}");m("\\Z","\\mathbb{Z}");m("\\alef","\\aleph");m("\\alefsym","\\aleph");m("\\Alpha","\\mathrm{A}");m("\\Beta","\\mathrm{B}");m("\\bull","\\bullet");m("\\Chi","\\mathrm{X}");m("\\clubs","\\clubsuit");m("\\cnums","\\mathbb{C}");m("\\Complex","\\mathbb{C}");m("\\Dagger","\\ddagger");m("\\diamonds","\\diamondsuit");m("\\empty","\\emptyset");m("\\Epsilon","\\mathrm{E}");m("\\Eta","\\mathrm{H}");m("\\exist","\\exists");m("\\harr","\\leftrightarrow");m("\\hArr","\\Leftrightarrow");m("\\Harr","\\Leftrightarrow");m("\\hearts","\\heartsuit");m("\\image","\\Im");m("\\infin","\\infty");m("\\Iota","\\mathrm{I}");m("\\isin","\\in");m("\\Kappa","\\mathrm{K}");m("\\larr","\\leftarrow");m("\\lArr","\\Leftarrow");m("\\Larr","\\Leftarrow");m("\\lrarr","\\leftrightarrow");m("\\lrArr","\\Leftrightarrow");m("\\Lrarr","\\Leftrightarrow");m("\\Mu","\\mathrm{M}");m("\\natnums","\\mathbb{N}");m("\\Nu","\\mathrm{N}");m("\\Omicron","\\mathrm{O}");m("\\plusmn","\\pm");m("\\rarr","\\rightarrow");m("\\rArr","\\Rightarrow");m("\\Rarr","\\Rightarrow");m("\\real","\\Re");m("\\reals","\\mathbb{R}");m("\\Reals","\\mathbb{R}");m("\\Rho","\\mathrm{P}");m("\\sdot","\\cdot");m("\\sect","\\S");m("\\spades","\\spadesuit");m("\\sub","\\subset");m("\\sube","\\subseteq");m("\\supe","\\supseteq");m("\\Tau","\\mathrm{T}");m("\\thetasym","\\vartheta");m("\\weierp","\\wp");m("\\Zeta","\\mathrm{Z}");m("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");m("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");m("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");m("\\bra","\\mathinner{\\langle{#1}|}");m("\\ket","\\mathinner{|{#1}\\rangle}");m("\\braket","\\mathinner{\\langle{#1}\\rangle}");m("\\Bra","\\left\\langle#1\\right|");m("\\Ket","\\left|#1\\right\\rangle");var S1=r=>e=>{var t=e.consumeArg().tokens,a=e.consumeArg().tokens,n=e.consumeArg().tokens,l=e.consumeArg().tokens,u=e.macros.get("|"),h=e.macros.get("\\|");e.macros.beginGroup();var c=b=>y=>{r&&(y.macros.set("|",u),n.length&&y.macros.set("\\|",h));var x=b;if(!b&&n.length){var A=y.future();A.text==="|"&&(y.popToken(),x=!0)}return{tokens:x?n:a,numArgs:0}};e.macros.set("|",c(!1)),n.length&&e.macros.set("\\|",c(!0));var v=e.consumeArg().tokens,g=e.expandTokens([...l,...v,...t]);return e.macros.endGroup(),{tokens:g.reverse(),numArgs:0}};m("\\bra@ket",S1(!1));m("\\bra@set",S1(!0));m("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");m("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");m("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");m("\\angln","{\\angl n}");m("\\blue","\\textcolor{##6495ed}{#1}");m("\\orange","\\textcolor{##ffa500}{#1}");m("\\pink","\\textcolor{##ff00af}{#1}");m("\\red","\\textcolor{##df0030}{#1}");m("\\green","\\textcolor{##28ae7b}{#1}");m("\\gray","\\textcolor{gray}{#1}");m("\\purple","\\textcolor{##9d38bd}{#1}");m("\\blueA","\\textcolor{##ccfaff}{#1}");m("\\blueB","\\textcolor{##80f6ff}{#1}");m("\\blueC","\\textcolor{##63d9ea}{#1}");m("\\blueD","\\textcolor{##11accd}{#1}");m("\\blueE","\\textcolor{##0c7f99}{#1}");m("\\tealA","\\textcolor{##94fff5}{#1}");m("\\tealB","\\textcolor{##26edd5}{#1}");m("\\tealC","\\textcolor{##01d1c1}{#1}");m("\\tealD","\\textcolor{##01a995}{#1}");m("\\tealE","\\textcolor{##208170}{#1}");m("\\greenA","\\textcolor{##b6ffb0}{#1}");m("\\greenB","\\textcolor{##8af281}{#1}");m("\\greenC","\\textcolor{##74cf70}{#1}");m("\\greenD","\\textcolor{##1fab54}{#1}");m("\\greenE","\\textcolor{##0d923f}{#1}");m("\\goldA","\\textcolor{##ffd0a9}{#1}");m("\\goldB","\\textcolor{##ffbb71}{#1}");m("\\goldC","\\textcolor{##ff9c39}{#1}");m("\\goldD","\\textcolor{##e07d10}{#1}");m("\\goldE","\\textcolor{##a75a05}{#1}");m("\\redA","\\textcolor{##fca9a9}{#1}");m("\\redB","\\textcolor{##ff8482}{#1}");m("\\redC","\\textcolor{##f9685d}{#1}");m("\\redD","\\textcolor{##e84d39}{#1}");m("\\redE","\\textcolor{##bc2612}{#1}");m("\\maroonA","\\textcolor{##ffbde0}{#1}");m("\\maroonB","\\textcolor{##ff92c6}{#1}");m("\\maroonC","\\textcolor{##ed5fa6}{#1}");m("\\maroonD","\\textcolor{##ca337c}{#1}");m("\\maroonE","\\textcolor{##9e034e}{#1}");m("\\purpleA","\\textcolor{##ddd7ff}{#1}");m("\\purpleB","\\textcolor{##c6b9fc}{#1}");m("\\purpleC","\\textcolor{##aa87ff}{#1}");m("\\purpleD","\\textcolor{##7854ab}{#1}");m("\\purpleE","\\textcolor{##543b78}{#1}");m("\\mintA","\\textcolor{##f5f9e8}{#1}");m("\\mintB","\\textcolor{##edf2df}{#1}");m("\\mintC","\\textcolor{##e0e5cc}{#1}");m("\\grayA","\\textcolor{##f6f7f7}{#1}");m("\\grayB","\\textcolor{##f0f1f2}{#1}");m("\\grayC","\\textcolor{##e3e5e6}{#1}");m("\\grayD","\\textcolor{##d6d8da}{#1}");m("\\grayE","\\textcolor{##babec2}{#1}");m("\\grayF","\\textcolor{##888d93}{#1}");m("\\grayG","\\textcolor{##626569}{#1}");m("\\grayH","\\textcolor{##3b3e40}{#1}");m("\\grayI","\\textcolor{##21242c}{#1}");m("\\kaBlue","\\textcolor{##314453}{#1}");m("\\kaGreen","\\textcolor{##71B307}{#1}");var z1={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},Ct=class{constructor(e,t,a){this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new Dt(f4,t.macros),this.mode=a,this.stack=[]}feed(e){this.lexer=new Ge(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var t,a,n;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;t=this.popToken(),{tokens:n,end:a}=this.consumeArg(["]"])}else({tokens:n,start:t,end:a}=this.consumeArg());return this.pushToken(new d0("EOF",a.loc)),this.pushTokens(n),new d0("",c0.range(t,a))}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var t=[],a=e&&e.length>0;a||this.consumeSpaces();var n=this.future(),l,u=0,h=0;do{if(l=this.popToken(),t.push(l),l.text==="{")++u;else if(l.text==="}"){if(--u,u===-1)throw new z("Extra }",l)}else if(l.text==="EOF")throw new z("Unexpected end of input in a macro argument, expected '"+(e&&a?e[h]:"}")+"'",l);if(e&&a)if((u===0||u===1&&e[h]==="{")&&l.text===e[h]){if(++h,h===e.length){t.splice(-h,h);break}}else h=0}while(u!==0||a);return n.text==="{"&&t[t.length-1].text==="}"&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:n,end:l}}consumeArgs(e,t){if(t){if(t.length!==e+1)throw new z("The length of delimiters doesn't match the number of args!");for(var a=t[0],n=0;nthis.settings.maxExpand)throw new z("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),a=t.text,n=t.noexpand?null:this._getExpansion(a);if(n==null||e&&n.unexpandable){if(e&&n==null&&a[0]==="\\"&&!this.isDefined(a))throw new z("Undefined control sequence: "+a);return this.pushToken(t),!1}this.countExpansion(1);var l=n.tokens,u=this.consumeArgs(n.numArgs,n.delimiters);if(n.numArgs){l=l.slice();for(var h=l.length-1;h>=0;--h){var c=l[h];if(c.text==="#"){if(h===0)throw new z("Incomplete placeholder at end of macro body",c);if(c=l[--h],c.text==="#")l.splice(h+1,1);else if(/^[1-9]$/.test(c.text))l.splice(h,2,...u[+c.text-1]);else throw new z("Not a valid argument number",c)}}}return this.pushTokens(l),l.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}}expandMacro(e){return this.macros.has(e)?this.expandTokens([new d0(e)]):void 0}expandTokens(e){var t=[],a=this.stack.length;for(this.pushTokens(e);this.stack.length>a;)if(this.expandOnce(!0)===!1){var n=this.stack.pop();n.treatAsRelax&&(n.noexpand=!1,n.treatAsRelax=!1),t.push(n)}return this.countExpansion(t.length),t}expandMacroAsText(e){var t=this.expandMacro(e);return t&&t.map(a=>a.text).join("")}_getExpansion(e){var t=this.macros.get(e);if(t==null)return t;if(e.length===1){var a=this.lexer.catcodes[e];if(a!=null&&a!==13)return}var n=typeof t=="function"?t(this):t;if(typeof n=="string"){var l=0;if(n.includes("#"))for(var u=n.replace(/##/g,"");u.includes("#"+(l+1));)++l;for(var h=new Ge(n,this.settings),c=[],v=h.lex();v.text!=="EOF";)c.push(v),v=h.lex();c.reverse();var g={tokens:c,numArgs:l};return g}return n}isDefined(e){return this.macros.has(e)||F0.hasOwnProperty(e)||$.math.hasOwnProperty(e)||$.text.hasOwnProperty(e)||z1.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return t!=null?typeof t=="string"||typeof t=="function"||!t.unexpandable:F0.hasOwnProperty(e)&&!F0[e].primitive}},Cr=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,Re=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),ft={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},qr={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},Ue=class r{constructor(e,t){this.mode="math",this.gullet=new Ct(e,t,this.mode),this.settings=t,this.leftrightDepth=0,this.nextToken=null}expect(e,t){if(t===void 0&&(t=!0),this.fetch().text!==e)throw new z("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new d0("}")),this.gullet.pushTokens(e);var a=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,a}parseExpression(e,t){for(var a=[];;){this.mode==="math"&&this.consumeSpaces();var n=this.fetch();if(r.endOfExpression.has(n.text)||t&&n.text===t||e&&F0[n.text]&&F0[n.text].infix)break;var l=this.parseAtom(t);if(l){if(l.type==="internal")continue}else break;a.push(l)}return this.mode==="text"&&this.formLigatures(a),this.handleInfixNodes(a)}handleInfixNodes(e){for(var t=-1,a,n=0;n=128)this.settings.strict&&(Rr(t.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'"'+(" ("+t.charCodeAt(0)+")"),e)),u={type:"textord",mode:"text",loc:c0.range(e),text:t};else return null;if(this.consume(),l)for(var b=0;bnew p,"TokenBuilder"),ValueConverter:e(()=>new G,"ValueConverter")}};function h(s=n){let r=t(o(s),u),a=t(i({shared:r}),d,m);return r.ServiceRegistry.register(a),{shared:r,GitGraph:a}}e(h,"createGitGraphServices");export{m as a,h as b}; diff --git a/src/google/adk/cli/browser/chunk-2LZ42ZOW.js b/src/google/adk/cli/browser/chunk-2LZ42ZOW.js deleted file mode 100644 index 5e2e957a6a..0000000000 --- a/src/google/adk/cli/browser/chunk-2LZ42ZOW.js +++ /dev/null @@ -1 +0,0 @@ -import{a as _,c as N,d as F}from"./chunk-LI24J5PW.js";import{a as U}from"./chunk-JDPVSVO4.js";import{a as C}from"./chunk-XMBKBASC.js";import"./chunk-APNCZOFE.js";import"./chunk-ST54LLJ3.js";import"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import{m as P}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{H as A,M as z,N as R,Y as t}from"./chunk-QFMJV7VH.js";import{M as W,Q as G,a as T,g as u,i as S}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";var D=u(e=>e.append("circle").attr("class","start-state").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit).attr("cy",t().state.padding+t().state.sizeUnit),"drawStartState"),Y=u(e=>e.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",t().state.textHeight).attr("class","divider").attr("x2",t().state.textHeight*2).attr("y1",0).attr("y2",0),"drawDivider"),I=u((e,i)=>{let s=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+2*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),g=s.node().getBBox();return e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",g.width+2*t().state.padding).attr("height",g.height+2*t().state.padding).attr("rx",t().state.radius),s},"drawSimpleState"),$=u((e,i)=>{let s=u(function(c,m,w){let E=c.append("tspan").attr("x",2*t().state.padding).text(m);w||E.attr("dy",t().state.textHeight)},"addTspan"),n=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+1.3*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.descriptions[0]).node().getBBox(),h=n.height,x=e.append("text").attr("x",t().state.padding).attr("y",h+t().state.padding*.4+t().state.dividerMargin+t().state.textHeight).attr("class","state-description"),a=!0,d=!0;i.descriptions.forEach(function(c){a||(s(x,c,d),d=!1),a=!1});let y=e.append("line").attr("x1",t().state.padding).attr("y1",t().state.padding+h+t().state.dividerMargin/2).attr("y2",t().state.padding+h+t().state.dividerMargin/2).attr("class","descr-divider"),p=x.node().getBBox(),o=Math.max(p.width,n.width);return y.attr("x2",o+3*t().state.padding),e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",o+2*t().state.padding).attr("height",p.height+h+2*t().state.padding).attr("rx",t().state.radius),e},"drawDescrState"),q=u((e,i,s)=>{let g=t().state.padding,n=2*t().state.padding,h=e.node().getBBox(),x=h.width,a=h.x,d=e.append("text").attr("x",0).attr("y",t().state.titleShift).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),p=d.node().getBBox().width+n,o=Math.max(p,x);o===x&&(o=o+n);let c,m=e.node().getBBox();i.doc,c=a-g,p>x&&(c=(x-o)/2+g),Math.abs(a-m.x)x&&(c=a-(p-x)/2);let w=1-t().state.textHeight;return e.insert("rect",":first-child").attr("x",c).attr("y",w).attr("class",s?"alt-composit":"composit").attr("width",o).attr("height",m.height+t().state.textHeight+t().state.titleShift+1).attr("rx","0"),d.attr("x",c+g),p<=x&&d.attr("x",a+(o-n)/2-p/2+g),e.insert("rect",":first-child").attr("x",c).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",o).attr("height",t().state.textHeight*3).attr("rx",t().state.radius),e.insert("rect",":first-child").attr("x",c).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",o).attr("height",m.height+3+2*t().state.textHeight).attr("rx",t().state.radius),e},"addTitleAndBox"),Z=u(e=>(e.append("circle").attr("class","end-state-outer").attr("r",t().state.sizeUnit+t().state.miniPadding).attr("cx",t().state.padding+t().state.sizeUnit+t().state.miniPadding).attr("cy",t().state.padding+t().state.sizeUnit+t().state.miniPadding),e.append("circle").attr("class","end-state-inner").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit+2).attr("cy",t().state.padding+t().state.sizeUnit+2)),"drawEndState"),j=u((e,i)=>{let s=t().state.forkWidth,g=t().state.forkHeight;if(i.parentId){let n=s;s=g,g=n}return e.append("rect").style("stroke","black").style("fill","black").attr("width",s).attr("height",g).attr("x",t().state.padding).attr("y",t().state.padding)},"drawForkJoinState"),K=u((e,i,s,g)=>{let n=0,h=g.append("text");h.style("text-anchor","start"),h.attr("class","noteText");let x=e.replace(/\r\n/g,"
");x=x.replace(/\n/g,"
");let a=x.split(z.lineBreakRegex),d=1.25*t().state.noteMargin;for(let y of a){let p=y.trim();if(p.length>0){let o=h.append("tspan");if(o.text(p),d===0){let c=o.node().getBBox();d+=c.height}n+=d,o.attr("x",i+t().state.noteMargin),o.attr("y",s+n+1.25*t().state.noteMargin)}}return{textWidth:h.node().getBBox().width,textHeight:n}},"_drawLongText"),Q=u((e,i)=>{i.attr("class","state-note");let s=i.append("rect").attr("x",0).attr("y",t().state.padding),g=i.append("g"),{textWidth:n,textHeight:h}=K(e,0,0,g);return s.attr("height",h+2*t().state.noteMargin),s.attr("width",n+t().state.noteMargin*2),s},"drawNote"),O=u(function(e,i){let s=i.id,g={id:s,label:i.id,width:0,height:0},n=e.append("g").attr("id",s).attr("class","stateGroup");i.type==="start"&&D(n),i.type==="end"&&Z(n),(i.type==="fork"||i.type==="join")&&j(n,i),i.type==="note"&&Q(i.note.text,n),i.type==="divider"&&Y(n),i.type==="default"&&i.descriptions.length===0&&I(n,i),i.type==="default"&&i.descriptions.length>0&&$(n,i);let h=n.node().getBBox();return g.width=h.width+2*t().state.padding,g.height=h.height+2*t().state.padding,g},"drawState"),J=0,V=u(function(e,i,s){let g=u(function(d){switch(d){case N.relationType.AGGREGATION:return"aggregation";case N.relationType.EXTENSION:return"extension";case N.relationType.COMPOSITION:return"composition";case N.relationType.DEPENDENCY:return"dependency"}},"getRelationType");i.points=i.points.filter(d=>!Number.isNaN(d.y));let n=i.points,h=W().x(function(d){return d.x}).y(function(d){return d.y}).curve(G),x=e.append("path").attr("d",h(n)).attr("id","edge"+J).attr("class","transition"),a="";if(t().state.arrowMarkerAbsolute&&(a=A(!0)),x.attr("marker-end","url("+a+"#"+g(N.relationType.DEPENDENCY)+"End)"),s.title!==void 0){let d=e.append("g").attr("class","stateLabel"),{x:y,y:p}=P.calcLabelPosition(i.points),o=z.getRows(s.title),c=0,m=[],w=0,E=0;for(let r=0;r<=o.length;r++){let f=d.append("text").attr("text-anchor","middle").text(o[r]).attr("x",y).attr("y",p+c),l=f.node().getBBox();w=Math.max(w,l.width),E=Math.min(E,l.x),S.info(l.x,y,p+c),c===0&&(c=f.node().getBBox().height,S.info("Title height",c,p)),m.push(f)}let k=c*o.length;if(o.length>1){let r=(o.length-1)*c*.5;m.forEach((f,l)=>f.attr("y",p+l*c-r)),k=c*o.length}let M=d.node().getBBox();d.insert("rect",":first-child").attr("class","box").attr("x",y-w/2-t().state.padding/2).attr("y",p-k/2-t().state.padding/2-3.5).attr("width",w+t().state.padding).attr("height",k+t().state.padding),S.info(M)}J++},"drawEdge"),b,L={},tt=u(function(){},"setConf"),et=u(function(e){e.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"insertMarkers"),at=u(function(e,i,s,g){b=t().state;let n=t().securityLevel,h;n==="sandbox"&&(h=T("#i"+i));let x=n==="sandbox"?T(h.nodes()[0].contentDocument.body):T("body"),a=n==="sandbox"?h.nodes()[0].contentDocument:document;S.debug("Rendering diagram "+e);let d=x.select(`[id='${i}']`);et(d);let y=g.db.getRootDoc();X(y,d,void 0,!1,x,a,g);let p=b.padding,o=d.node().getBBox(),c=o.width+p*2,m=o.height+p*2,w=c*1.75;R(d,m,w,b.useMaxWidth),d.attr("viewBox",`${o.x-b.padding} ${o.y-b.padding} `+c+" "+m)},"draw"),it=u(e=>e?e.length*b.fontSizeFactor:1,"getLabelWidth"),X=u((e,i,s,g,n,h,x)=>{let a=new C({compound:!0,multigraph:!0}),d,y=!0;for(d=0;d{let B=l.parentElement,v=0,H=0;B&&(B.parentElement&&(v=B.parentElement.getBBox().width),H=parseInt(B.getAttribute("data-x-shift"),10),Number.isNaN(H)&&(H=0)),l.setAttribute("x1",0-H+8),l.setAttribute("x2",v-H-8)})):S.debug("No Node "+r+": "+JSON.stringify(a.node(r)))});let k=E.getBBox();a.edges().forEach(function(r){r!==void 0&&a.edge(r)!==void 0&&(S.debug("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(a.edge(r))),V(i,a.edge(r),a.edge(r).relation))}),k=E.getBBox();let M={id:s||"root",label:s||"root",width:0,height:0};return M.width=k.width+2*b.padding,M.height=k.height+2*b.padding,S.debug("Doc rendered",M,a),M},"renderDoc"),rt={setConf:tt,draw:at},St={parser:_,get db(){return new N(1)},renderer:rt,styles:F,init:u(e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")};export{St as diagram}; diff --git a/src/google/adk/cli/browser/chunk-DM36II44.js b/src/google/adk/cli/browser/chunk-2MVVEOIQ.js similarity index 89% rename from src/google/adk/cli/browser/chunk-DM36II44.js rename to src/google/adk/cli/browser/chunk-2MVVEOIQ.js index dc3e6651b6..589050f63b 100644 --- a/src/google/adk/cli/browser/chunk-DM36II44.js +++ b/src/google/adk/cli/browser/chunk-2MVVEOIQ.js @@ -1 +1 @@ -import{$a as r,Ca as o,Db as d,Yb as l,Zb as s,eb as a,pd as m}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var f=(()=>{class e extends m{static \u0275fac=(()=>{let i;return function(t){return(i||(i=o(e)))(t||e)}})();static \u0275cmp=r({type:e,selectors:[["a2ui-divider"]],features:[a],decls:1,vars:4,template:function(n,t){n&1&&d(0,"hr"),n&2&&(l(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Divider),s(t.theme.components.Divider))},styles:["[_nghost-%COMP%]{display:block;min-height:0;overflow:auto}hr[_ngcontent-%COMP%]{height:1px;background:#ccc;border:none}"]})}return e})();export{f as Divider}; +import{$a as r,Ca as o,Db as d,Yb as l,Zb as s,eb as a,pd as m}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var f=(()=>{class e extends m{static \u0275fac=(()=>{let i;return function(t){return(i||(i=o(e)))(t||e)}})();static \u0275cmp=r({type:e,selectors:[["a2ui-divider"]],features:[a],decls:1,vars:4,template:function(n,t){n&1&&d(0,"hr"),n&2&&(l(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Divider),s(t.theme.components.Divider))},styles:["[_nghost-%COMP%]{display:block;min-height:0;overflow:auto}hr[_ngcontent-%COMP%]{height:1px;background:#ccc;border:none}"]})}return e})();export{f as Divider}; diff --git a/src/google/adk/cli/browser/chunk-Q6H4XMU7.js b/src/google/adk/cli/browser/chunk-2VKC3BHH.js similarity index 93% rename from src/google/adk/cli/browser/chunk-Q6H4XMU7.js rename to src/google/adk/cli/browser/chunk-2VKC3BHH.js index c182271548..9662795485 100644 --- a/src/google/adk/cli/browser/chunk-Q6H4XMU7.js +++ b/src/google/adk/cli/browser/chunk-2VKC3BHH.js @@ -1 +1 @@ -import{$a as r,Ca as o,Cc as h,Gb as u,Jb as p,Pa as a,Yb as m,Zb as f,eb as c,pd as y,qd as g,xb as s,yb as l,zb as d}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var _=(()=>{class n extends y{action=h.required();handleClick(){let t=this.action();t&&super.sendAction(t)}static \u0275fac=(()=>{let t;return function(e){return(t||(t=o(n)))(e||n)}})();static \u0275cmp=r({type:n,selectors:[["a2ui-button"]],inputs:{action:[1,"action"]},features:[c],decls:2,vars:6,consts:[[3,"click"],["a2ui-renderer","",3,"surfaceId","component"]],template:function(i,e){i&1&&(l(0,"button",0),p("click",function(){return e.handleClick()}),u(1,1),d()),i&2&&(m(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Button),f(e.theme.components.Button),a(),s("surfaceId",e.surfaceId())("component",e.component().properties.child))},dependencies:[g],styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0}"]})}return n})();export{_ as Button}; +import{$a as r,Ca as o,Cc as h,Gb as u,Jb as p,Pa as a,Yb as m,Zb as f,eb as c,pd as y,qd as g,xb as s,yb as l,zb as d}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var _=(()=>{class n extends y{action=h.required();handleClick(){let t=this.action();t&&super.sendAction(t)}static \u0275fac=(()=>{let t;return function(e){return(t||(t=o(n)))(e||n)}})();static \u0275cmp=r({type:n,selectors:[["a2ui-button"]],inputs:{action:[1,"action"]},features:[c],decls:2,vars:6,consts:[[3,"click"],["a2ui-renderer","",3,"surfaceId","component"]],template:function(i,e){i&1&&(l(0,"button",0),p("click",function(){return e.handleClick()}),u(1,1),d()),i&2&&(m(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Button),f(e.theme.components.Button),a(),s("surfaceId",e.surfaceId())("component",e.component().properties.child))},dependencies:[g],styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0}"]})}return n})();export{_ as Button}; diff --git a/src/google/adk/cli/browser/chunk-3NJNOY56.js b/src/google/adk/cli/browser/chunk-3NJNOY56.js deleted file mode 100644 index 60df62ef40..0000000000 --- a/src/google/adk/cli/browser/chunk-3NJNOY56.js +++ /dev/null @@ -1 +0,0 @@ -import{a as t,b as a,c as o,d as i,e as f,f as e,g as u,j as d,p as s,q as l}from"./chunk-NALL4A3P.js";var m=class extends l{static{e(this,"InfoTokenBuilder")}constructor(){super(["info","showInfo"])}},v={parser:{TokenBuilder:e(()=>new m,"TokenBuilder"),ValueConverter:e(()=>new s,"ValueConverter")}};function I(c=i){let r=o(a(c),u),n=o(t({shared:r}),d,v);return r.ServiceRegistry.register(n),{shared:r,Info:n}}e(I,"createInfoServices");export{v as a,I as b}; diff --git a/src/google/adk/cli/browser/chunk-3YZ77ADE.js b/src/google/adk/cli/browser/chunk-3YZ77ADE.js deleted file mode 100644 index 08b10f4c24..0000000000 --- a/src/google/adk/cli/browser/chunk-3YZ77ADE.js +++ /dev/null @@ -1,36 +0,0 @@ -import{a as Ke}from"./chunk-DMWOYWYQ.js";import{a as je}from"./chunk-T3Q3QCCV.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import{a as Ne}from"./chunk-YVVLWU7S.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{a as ke}from"./chunk-TPDTRWWV.js";import{b as Qe,c as Je,d as ce,f as ge}from"./chunk-WXI2IBAH.js";import{l as Ze,p as qe}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as Ge,G as Ue,O as Ye,R as Xe,S as He,T as We,U as Ve,V as ze,W as Be,X as $e,Y as fe,r as Pe}from"./chunk-QFMJV7VH.js";import{a as be,g as ct,i as Te}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as ee,b as le,e as me,h as pr,j as Zt}from"./chunk-RMXJBC7V.js";var Ce=me((ne,Le)=>{"use strict";(function(w,N){typeof ne=="object"&&typeof Le=="object"?Le.exports=N():typeof define=="function"&&define.amd?define([],N):typeof ne=="object"?ne.layoutBase=N():w.layoutBase=N()})(ne,function(){return(function(E){var w={};function N(u){if(w[u])return w[u].exports;var o=w[u]={i:u,l:!1,exports:{}};return E[u].call(o.exports,o,o.exports,N),o.l=!0,o.exports}return N.m=E,N.c=w,N.i=function(u){return u},N.d=function(u,o,a){N.o(u,o)||Object.defineProperty(u,o,{configurable:!1,enumerable:!0,get:a})},N.n=function(u){var o=u&&u.__esModule?function(){return u.default}:function(){return u};return N.d(o,"a",o),o},N.o=function(u,o){return Object.prototype.hasOwnProperty.call(u,o)},N.p="",N(N.s=28)})([(function(E,w,N){"use strict";function u(){}u.QUALITY=1,u.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,u.DEFAULT_INCREMENTAL=!1,u.DEFAULT_ANIMATION_ON_LAYOUT=!0,u.DEFAULT_ANIMATION_DURING_LAYOUT=!1,u.DEFAULT_ANIMATION_PERIOD=50,u.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,u.DEFAULT_GRAPH_MARGIN=15,u.NODE_DIMENSIONS_INCLUDE_LABELS=!1,u.SIMPLE_NODE_SIZE=40,u.SIMPLE_NODE_HALF_SIZE=u.SIMPLE_NODE_SIZE/2,u.EMPTY_COMPOUND_NODE_SIZE=40,u.MIN_EDGE_LENGTH=1,u.WORLD_BOUNDARY=1e6,u.INITIAL_WORLD_BOUNDARY=u.WORLD_BOUNDARY/1e3,u.WORLD_CENTER_X=1200,u.WORLD_CENTER_Y=900,E.exports=u}),(function(E,w,N){"use strict";var u=N(2),o=N(8),a=N(9);function e(c,t,g){u.call(this,g),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=g,this.bendpoints=[],this.source=c,this.target=t}e.prototype=Object.create(u.prototype);for(var n in u)e[n]=u[n];e.prototype.getSource=function(){return this.source},e.prototype.getTarget=function(){return this.target},e.prototype.isInterGraph=function(){return this.isInterGraph},e.prototype.getLength=function(){return this.length},e.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},e.prototype.getBendpoints=function(){return this.bendpoints},e.prototype.getLca=function(){return this.lca},e.prototype.getSourceInLca=function(){return this.sourceInLca},e.prototype.getTargetInLca=function(){return this.targetInLca},e.prototype.getOtherEnd=function(c){if(this.source===c)return this.target;if(this.target===c)return this.source;throw"Node is not incident with this edge"},e.prototype.getOtherEndInGraph=function(c,t){for(var g=this.getOtherEnd(c),i=t.getGraphManager().getRoot();;){if(g.getOwner()==t)return g;if(g.getOwner()==i)break;g=g.getOwner().getParent()}return null},e.prototype.updateLength=function(){var c=new Array(4);this.isOverlapingSourceAndTarget=o.getIntersection(this.target.getRect(),this.source.getRect(),c),this.isOverlapingSourceAndTarget||(this.lengthX=c[0]-c[2],this.lengthY=c[1]-c[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},e.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},E.exports=e}),(function(E,w,N){"use strict";function u(o){this.vGraphObject=o}E.exports=u}),(function(E,w,N){"use strict";var u=N(2),o=N(10),a=N(13),e=N(0),n=N(16),c=N(5);function t(i,r,h,f){h==null&&f==null&&(f=r),u.call(this,f),i.graphManager!=null&&(i=i.graphManager),this.estimatedSize=o.MIN_VALUE,this.inclusionTreeDepth=o.MAX_VALUE,this.vGraphObject=f,this.edges=[],this.graphManager=i,h!=null&&r!=null?this.rect=new a(r.x,r.y,h.width,h.height):this.rect=new a}t.prototype=Object.create(u.prototype);for(var g in u)t[g]=u[g];t.prototype.getEdges=function(){return this.edges},t.prototype.getChild=function(){return this.child},t.prototype.getOwner=function(){return this.owner},t.prototype.getWidth=function(){return this.rect.width},t.prototype.setWidth=function(i){this.rect.width=i},t.prototype.getHeight=function(){return this.rect.height},t.prototype.setHeight=function(i){this.rect.height=i},t.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},t.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},t.prototype.getCenter=function(){return new c(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},t.prototype.getLocation=function(){return new c(this.rect.x,this.rect.y)},t.prototype.getRect=function(){return this.rect},t.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},t.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},t.prototype.setRect=function(i,r){this.rect.x=i.x,this.rect.y=i.y,this.rect.width=r.width,this.rect.height=r.height},t.prototype.setCenter=function(i,r){this.rect.x=i-this.rect.width/2,this.rect.y=r-this.rect.height/2},t.prototype.setLocation=function(i,r){this.rect.x=i,this.rect.y=r},t.prototype.moveBy=function(i,r){this.rect.x+=i,this.rect.y+=r},t.prototype.getEdgeListToNode=function(i){var r=[],h,f=this;return f.edges.forEach(function(l){if(l.target==i){if(l.source!=f)throw"Incorrect edge source!";r.push(l)}}),r},t.prototype.getEdgesBetween=function(i){var r=[],h,f=this;return f.edges.forEach(function(l){if(!(l.source==f||l.target==f))throw"Incorrect edge source and/or target";(l.target==i||l.source==i)&&r.push(l)}),r},t.prototype.getNeighborsList=function(){var i=new Set,r=this;return r.edges.forEach(function(h){if(h.source==r)i.add(h.target);else{if(h.target!=r)throw"Incorrect incidency!";i.add(h.source)}}),i},t.prototype.withChildren=function(){var i=new Set,r,h;if(i.add(this),this.child!=null)for(var f=this.child.getNodes(),l=0;lr?(this.rect.x-=(this.labelWidth-r)/2,this.setWidth(this.labelWidth)):this.labelPosHorizontal=="right"&&this.setWidth(r+this.labelWidth)),this.labelHeight&&(this.labelPosVertical=="top"?(this.rect.y-=this.labelHeight,this.setHeight(h+this.labelHeight)):this.labelPosVertical=="center"&&this.labelHeight>h?(this.rect.y-=(this.labelHeight-h)/2,this.setHeight(this.labelHeight)):this.labelPosVertical=="bottom"&&this.setHeight(h+this.labelHeight))}}},t.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==o.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},t.prototype.transform=function(i){var r=this.rect.x;r>e.WORLD_BOUNDARY?r=e.WORLD_BOUNDARY:r<-e.WORLD_BOUNDARY&&(r=-e.WORLD_BOUNDARY);var h=this.rect.y;h>e.WORLD_BOUNDARY?h=e.WORLD_BOUNDARY:h<-e.WORLD_BOUNDARY&&(h=-e.WORLD_BOUNDARY);var f=new c(r,h),l=i.inverseTransformPoint(f);this.setLocation(l.x,l.y)},t.prototype.getLeft=function(){return this.rect.x},t.prototype.getRight=function(){return this.rect.x+this.rect.width},t.prototype.getTop=function(){return this.rect.y},t.prototype.getBottom=function(){return this.rect.y+this.rect.height},t.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},E.exports=t}),(function(E,w,N){"use strict";var u=N(0);function o(){}for(var a in u)o[a]=u[a];o.MAX_ITERATIONS=2500,o.DEFAULT_EDGE_LENGTH=50,o.DEFAULT_SPRING_STRENGTH=.45,o.DEFAULT_REPULSION_STRENGTH=4500,o.DEFAULT_GRAVITY_STRENGTH=.4,o.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,o.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,o.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,o.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,o.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,o.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,o.COOLING_ADAPTATION_FACTOR=.33,o.ADAPTATION_LOWER_NODE_LIMIT=1e3,o.ADAPTATION_UPPER_NODE_LIMIT=5e3,o.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,o.MAX_NODE_DISPLACEMENT=o.MAX_NODE_DISPLACEMENT_INCREMENTAL*3,o.MIN_REPULSION_DIST=o.DEFAULT_EDGE_LENGTH/10,o.CONVERGENCE_CHECK_PERIOD=100,o.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,o.MIN_EDGE_LENGTH=1,o.GRID_CALCULATION_CHECK_PERIOD=10,E.exports=o}),(function(E,w,N){"use strict";function u(o,a){o==null&&a==null?(this.x=0,this.y=0):(this.x=o,this.y=a)}u.prototype.getX=function(){return this.x},u.prototype.getY=function(){return this.y},u.prototype.setX=function(o){this.x=o},u.prototype.setY=function(o){this.y=o},u.prototype.getDifference=function(o){return new DimensionD(this.x-o.x,this.y-o.y)},u.prototype.getCopy=function(){return new u(this.x,this.y)},u.prototype.translate=function(o){return this.x+=o.width,this.y+=o.height,this},E.exports=u}),(function(E,w,N){"use strict";var u=N(2),o=N(10),a=N(0),e=N(7),n=N(3),c=N(1),t=N(13),g=N(12),i=N(11);function r(f,l,L){u.call(this,L),this.estimatedSize=o.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=f,l!=null&&l instanceof e?this.graphManager=l:l!=null&&l instanceof Layout&&(this.graphManager=l.graphManager)}r.prototype=Object.create(u.prototype);for(var h in u)r[h]=u[h];r.prototype.getNodes=function(){return this.nodes},r.prototype.getEdges=function(){return this.edges},r.prototype.getGraphManager=function(){return this.graphManager},r.prototype.getParent=function(){return this.parent},r.prototype.getLeft=function(){return this.left},r.prototype.getRight=function(){return this.right},r.prototype.getTop=function(){return this.top},r.prototype.getBottom=function(){return this.bottom},r.prototype.isConnected=function(){return this.isConnected},r.prototype.add=function(f,l,L){if(l==null&&L==null){var y=f;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(y)>-1)throw"Node already in graph!";return y.owner=this,this.getNodes().push(y),y}else{var p=f;if(!(this.getNodes().indexOf(l)>-1&&this.getNodes().indexOf(L)>-1))throw"Source or target not in graph!";if(!(l.owner==L.owner&&l.owner==this))throw"Both owners must be this graph!";return l.owner!=L.owner?null:(p.source=l,p.target=L,p.isInterGraph=!1,this.getEdges().push(p),l.edges.push(p),L!=l&&L.edges.push(p),p)}},r.prototype.remove=function(f){var l=f;if(f instanceof n){if(l==null)throw"Node is null!";if(!(l.owner!=null&&l.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var L=l.edges.slice(),y,p=L.length,C=0;C-1&&S>-1))throw"Source and/or target doesn't know this edge!";y.source.edges.splice(A,1),y.target!=y.source&&y.target.edges.splice(S,1);var R=y.source.owner.getEdges().indexOf(y);if(R==-1)throw"Not in owner's edge list!";y.source.owner.getEdges().splice(R,1)}},r.prototype.updateLeftTop=function(){for(var f=o.MAX_VALUE,l=o.MAX_VALUE,L,y,p,C=this.getNodes(),R=C.length,A=0;AL&&(f=L),l>y&&(l=y)}return f==o.MAX_VALUE?null:(C[0].getParent().paddingLeft!=null?p=C[0].getParent().paddingLeft:p=this.margin,this.left=l-p,this.top=f-p,new g(this.left,this.top))},r.prototype.updateBounds=function(f){for(var l=o.MAX_VALUE,L=-o.MAX_VALUE,y=o.MAX_VALUE,p=-o.MAX_VALUE,C,R,A,S,B,Y=this.nodes,tt=Y.length,x=0;xC&&(l=C),LA&&(y=A),pC&&(l=C),LA&&(y=A),p=this.nodes.length){var tt=0;L.forEach(function(x){x.owner==f&&tt++}),tt==this.nodes.length&&(this.isConnected=!0)}},E.exports=r}),(function(E,w,N){"use strict";var u,o=N(1);function a(e){u=N(6),this.layout=e,this.graphs=[],this.edges=[]}a.prototype.addRoot=function(){var e=this.layout.newGraph(),n=this.layout.newNode(null),c=this.add(e,n);return this.setRootGraph(c),this.rootGraph},a.prototype.add=function(e,n,c,t,g){if(c==null&&t==null&&g==null){if(e==null)throw"Graph is null!";if(n==null)throw"Parent node is null!";if(this.graphs.indexOf(e)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(e),e.parent!=null)throw"Already has a parent!";if(n.child!=null)throw"Already has a child!";return e.parent=n,n.child=e,e}else{g=c,t=n,c=e;var i=t.getOwner(),r=g.getOwner();if(!(i!=null&&i.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(r!=null&&r.getGraphManager()==this))throw"Target not in this graph mgr!";if(i==r)return c.isInterGraph=!1,i.add(c,t,g);if(c.isInterGraph=!0,c.source=t,c.target=g,this.edges.indexOf(c)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(c),!(c.source!=null&&c.target!=null))throw"Edge source and/or target is null!";if(!(c.source.edges.indexOf(c)==-1&&c.target.edges.indexOf(c)==-1))throw"Edge already in source and/or target incidency list!";return c.source.edges.push(c),c.target.edges.push(c),c}},a.prototype.remove=function(e){if(e instanceof u){var n=e;if(n.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(n==this.rootGraph||n.parent!=null&&n.parent.graphManager==this))throw"Invalid parent node!";var c=[];c=c.concat(n.getEdges());for(var t,g=c.length,i=0;i=e.getRight()?n[0]+=Math.min(e.getX()-a.getX(),a.getRight()-e.getRight()):e.getX()<=a.getX()&&e.getRight()>=a.getRight()&&(n[0]+=Math.min(a.getX()-e.getX(),e.getRight()-a.getRight())),a.getY()<=e.getY()&&a.getBottom()>=e.getBottom()?n[1]+=Math.min(e.getY()-a.getY(),a.getBottom()-e.getBottom()):e.getY()<=a.getY()&&e.getBottom()>=a.getBottom()&&(n[1]+=Math.min(a.getY()-e.getY(),e.getBottom()-a.getBottom()));var g=Math.abs((e.getCenterY()-a.getCenterY())/(e.getCenterX()-a.getCenterX()));e.getCenterY()===a.getCenterY()&&e.getCenterX()===a.getCenterX()&&(g=1);var i=g*n[0],r=n[1]/g;n[0]i)return n[0]=c,n[1]=h,n[2]=g,n[3]=Y,!1;if(tg)return n[0]=r,n[1]=t,n[2]=S,n[3]=i,!1;if(cg?(n[0]=l,n[1]=L,s=!0):(n[0]=f,n[1]=h,s=!0):v===d&&(c>g?(n[0]=r,n[1]=h,s=!0):(n[0]=y,n[1]=L,s=!0)),-T===d?g>c?(n[2]=B,n[3]=Y,m=!0):(n[2]=S,n[3]=A,m=!0):T===d&&(g>c?(n[2]=R,n[3]=A,m=!0):(n[2]=tt,n[3]=Y,m=!0)),s&&m)return!1;if(c>g?t>i?(D=this.getCardinalDirection(v,d,4),O=this.getCardinalDirection(T,d,2)):(D=this.getCardinalDirection(-v,d,3),O=this.getCardinalDirection(-T,d,1)):t>i?(D=this.getCardinalDirection(-v,d,1),O=this.getCardinalDirection(-T,d,3)):(D=this.getCardinalDirection(v,d,2),O=this.getCardinalDirection(T,d,4)),!s)switch(D){case 1:F=h,P=c+-C/d,n[0]=P,n[1]=F;break;case 2:P=y,F=t+p*d,n[0]=P,n[1]=F;break;case 3:F=L,P=c+C/d,n[0]=P,n[1]=F;break;case 4:P=l,F=t+-p*d,n[0]=P,n[1]=F;break}if(!m)switch(O){case 1:k=A,I=g+-Z/d,n[2]=I,n[3]=k;break;case 2:I=tt,k=i+x*d,n[2]=I,n[3]=k;break;case 3:k=Y,I=g+Z/d,n[2]=I,n[3]=k;break;case 4:I=B,k=i+-x*d,n[2]=I,n[3]=k;break}}return!1},o.getCardinalDirection=function(a,e,n){return a>e?n:1+n%4},o.getIntersection=function(a,e,n,c){if(c==null)return this.getIntersection2(a,e,n);var t=a.x,g=a.y,i=e.x,r=e.y,h=n.x,f=n.y,l=c.x,L=c.y,y=void 0,p=void 0,C=void 0,R=void 0,A=void 0,S=void 0,B=void 0,Y=void 0,tt=void 0;return C=r-g,A=t-i,B=i*g-t*r,R=L-f,S=h-l,Y=l*f-h*L,tt=C*S-R*A,tt===0?null:(y=(A*Y-S*B)/tt,p=(R*B-C*Y)/tt,new u(y,p))},o.angleOfVector=function(a,e,n,c){var t=void 0;return a!==n?(t=Math.atan((c-e)/(n-a)),n=0){var L=(-h+Math.sqrt(h*h-4*r*f))/(2*r),y=(-h-Math.sqrt(h*h-4*r*f))/(2*r),p=null;return L>=0&&L<=1?[L]:y>=0&&y<=1?[y]:p}else return null},o.HALF_PI=.5*Math.PI,o.ONE_AND_HALF_PI=1.5*Math.PI,o.TWO_PI=2*Math.PI,o.THREE_PI=3*Math.PI,E.exports=o}),(function(E,w,N){"use strict";function u(){}u.sign=function(o){return o>0?1:o<0?-1:0},u.floor=function(o){return o<0?Math.ceil(o):Math.floor(o)},u.ceil=function(o){return o<0?Math.floor(o):Math.ceil(o)},E.exports=u}),(function(E,w,N){"use strict";function u(){}u.MAX_VALUE=2147483647,u.MIN_VALUE=-2147483648,E.exports=u}),(function(E,w,N){"use strict";var u=(function(){function t(g,i){for(var r=0;r"u"?"undefined":u(a);return a==null||e!="object"&&e!="function"},E.exports=o}),(function(E,w,N){"use strict";function u(h){if(Array.isArray(h)){for(var f=0,l=Array(h.length);f0&&f;){for(C.push(A[0]);C.length>0&&f;){var S=C[0];C.splice(0,1),p.add(S);for(var B=S.getEdges(),y=0;y-1&&A.splice(Z,1)}p=new Set,R=new Map}}return h},r.prototype.createDummyNodesForBendpoints=function(h){for(var f=[],l=h.source,L=this.graphManager.calcLowestCommonAncestor(h.source,h.target),y=0;y0){for(var L=this.edgeToDummyNodes.get(l),y=0;y=0&&f.splice(Y,1);var tt=R.getNeighborsList();tt.forEach(function(s){if(l.indexOf(s)<0){var m=L.get(s),v=m-1;v==1&&S.push(s),L.set(s,v)}})}l=l.concat(S),(f.length==1||f.length==2)&&(y=!0,p=f[0])}return p},r.prototype.setGraphManager=function(h){this.graphManager=h},E.exports=r}),(function(E,w,N){"use strict";function u(){}u.seed=1,u.x=0,u.nextDouble=function(){return u.x=Math.sin(u.seed++)*1e4,u.x-Math.floor(u.x)},E.exports=u}),(function(E,w,N){"use strict";var u=N(5);function o(a,e){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o.prototype.getWorldOrgX=function(){return this.lworldOrgX},o.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},o.prototype.getWorldOrgY=function(){return this.lworldOrgY},o.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},o.prototype.getWorldExtX=function(){return this.lworldExtX},o.prototype.setWorldExtX=function(a){this.lworldExtX=a},o.prototype.getWorldExtY=function(){return this.lworldExtY},o.prototype.setWorldExtY=function(a){this.lworldExtY=a},o.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},o.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},o.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},o.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},o.prototype.getDeviceExtX=function(){return this.ldeviceExtX},o.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},o.prototype.getDeviceExtY=function(){return this.ldeviceExtY},o.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},o.prototype.transformX=function(a){var e=0,n=this.lworldExtX;return n!=0&&(e=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/n),e},o.prototype.transformY=function(a){var e=0,n=this.lworldExtY;return n!=0&&(e=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/n),e},o.prototype.inverseTransformX=function(a){var e=0,n=this.ldeviceExtX;return n!=0&&(e=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/n),e},o.prototype.inverseTransformY=function(a){var e=0,n=this.ldeviceExtY;return n!=0&&(e=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/n),e},o.prototype.inverseTransformPoint=function(a){var e=new u(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return e},E.exports=o}),(function(E,w,N){"use strict";function u(i){if(Array.isArray(i)){for(var r=0,h=Array(i.length);ra.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(i-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(i>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(i-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.displacementThresholdPerNode=3*a.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},t.prototype.calcSpringForces=function(){for(var i=this.getAllEdges(),r,h=0;h0&&arguments[0]!==void 0?arguments[0]:!0,r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,h,f,l,L,y=this.getAllNodes(),p;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&i&&this.updateGrid(),p=new Set,h=0;hC||p>C)&&(i.gravitationForceX=-this.gravityConstant*l,i.gravitationForceY=-this.gravityConstant*L)):(C=r.getEstimatedSize()*this.compoundGravityRangeFactor,(y>C||p>C)&&(i.gravitationForceX=-this.gravityConstant*l*this.compoundGravityConstant,i.gravitationForceY=-this.gravityConstant*L*this.compoundGravityConstant))},t.prototype.isConverged=function(){var i,r=!1;return this.totalIterations>this.maxIterations/3&&(r=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),i=this.totalDisplacement=y.length||C>=y[0].length)){for(var R=0;Rt}}]),n})();E.exports=e}),(function(E,w,N){"use strict";function u(){}u.svd=function(o){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=o.length,this.n=o[0].length;var a=Math.min(this.m,this.n);this.s=(function(Dt){for(var Nt=[];Dt-- >0;)Nt.push(0);return Nt})(Math.min(this.m+1,this.n)),this.U=(function(Dt){var Nt=function $t(Rt){if(Rt.length==0)return 0;for(var Xt=[],zt=0;zt0;)Nt.push(0);return Nt})(this.n),n=(function(Dt){for(var Nt=[];Dt-- >0;)Nt.push(0);return Nt})(this.m),c=!0,t=!0,g=Math.min(this.m-1,this.n),i=Math.max(0,Math.min(this.n-2,this.m)),r=0;r=0;d--)if(this.s[d]!==0){for(var D=d+1;D=0;b--){if((function(Dt,Nt){return Dt&&Nt})(b0;){var Q=void 0,Ut=void 0;for(Q=m-2;Q>=-1&&Q!==-1;Q--)if(Math.abs(e[Q])<=St+Lt*(Math.abs(this.s[Q])+Math.abs(this.s[Q+1]))){e[Q]=0;break}if(Q===m-2)Ut=4;else{var Mt=void 0;for(Mt=m-1;Mt>=Q&&Mt!==Q;Mt--){var at=(Mt!==m?Math.abs(e[Mt]):0)+(Mt!==Q+1?Math.abs(e[Mt-1]):0);if(Math.abs(this.s[Mt])<=St+Lt*at){this.s[Mt]=0;break}}Mt===Q?Ut=3:Mt===m-1?Ut=1:(Ut=2,Q=Mt)}switch(Q++,Ut){case 1:{var et=e[m-2];e[m-2]=0;for(var pt=m-2;pt>=Q;pt--){var Et=u.hypot(this.s[pt],et),Ct=this.s[pt]/Et,mt=et/Et;if(this.s[pt]=Et,pt!==Q&&(et=-mt*e[pt-1],e[pt-1]=Ct*e[pt-1]),t)for(var Tt=0;Tt=this.s[Q+1]);){var lt=this.s[Q];if(this.s[Q]=this.s[Q+1],this.s[Q+1]=lt,t&&QMath.abs(a)?(e=a/o,e=Math.abs(o)*Math.sqrt(1+e*e)):a!=0?(e=o/a,e=Math.abs(a)*Math.sqrt(1+e*e)):e=0,e},E.exports=u}),(function(E,w,N){"use strict";var u=(function(){function e(n,c){for(var t=0;t2&&arguments[2]!==void 0?arguments[2]:1,g=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;o(this,e),this.sequence1=n,this.sequence2=c,this.match_score=t,this.mismatch_penalty=g,this.gap_penalty=i,this.iMax=n.length+1,this.jMax=c.length+1,this.grid=new Array(this.iMax);for(var r=0;r=0;n--){var c=this.listeners[n];c.event===a&&c.callback===e&&this.listeners.splice(n,1)}},o.emit=function(a,e){for(var n=0;n{"use strict";(function(w,N){typeof ae=="object"&&typeof Ae=="object"?Ae.exports=N(Ce()):typeof define=="function"&&define.amd?define(["layout-base"],N):typeof ae=="object"?ae.coseBase=N(Ce()):w.coseBase=N(w.layoutBase)})(ae,function(E){return(()=>{"use strict";var w={45:((a,e,n)=>{var c={};c.layoutBase=n(551),c.CoSEConstants=n(806),c.CoSEEdge=n(767),c.CoSEGraph=n(880),c.CoSEGraphManager=n(578),c.CoSELayout=n(765),c.CoSENode=n(991),c.ConstraintHandler=n(902),a.exports=c}),806:((a,e,n)=>{var c=n(551).FDLayoutConstants;function t(){}for(var g in c)t[g]=c[g];t.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,t.DEFAULT_RADIAL_SEPARATION=c.DEFAULT_EDGE_LENGTH,t.DEFAULT_COMPONENT_SEPERATION=60,t.TILE=!0,t.TILING_PADDING_VERTICAL=10,t.TILING_PADDING_HORIZONTAL=10,t.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,t.ENFORCE_CONSTRAINTS=!0,t.APPLY_LAYOUT=!0,t.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,t.TREE_REDUCTION_ON_INCREMENTAL=!0,t.PURE_INCREMENTAL=t.DEFAULT_INCREMENTAL,a.exports=t}),767:((a,e,n)=>{var c=n(551).FDLayoutEdge;function t(i,r,h){c.call(this,i,r,h)}t.prototype=Object.create(c.prototype);for(var g in c)t[g]=c[g];a.exports=t}),880:((a,e,n)=>{var c=n(551).LGraph;function t(i,r,h){c.call(this,i,r,h)}t.prototype=Object.create(c.prototype);for(var g in c)t[g]=c[g];a.exports=t}),578:((a,e,n)=>{var c=n(551).LGraphManager;function t(i){c.call(this,i)}t.prototype=Object.create(c.prototype);for(var g in c)t[g]=c[g];a.exports=t}),765:((a,e,n)=>{var c=n(551).FDLayout,t=n(578),g=n(880),i=n(991),r=n(767),h=n(806),f=n(902),l=n(551).FDLayoutConstants,L=n(551).LayoutConstants,y=n(551).Point,p=n(551).PointD,C=n(551).DimensionD,R=n(551).Layout,A=n(551).Integer,S=n(551).IGeometry,B=n(551).LGraph,Y=n(551).Transform,tt=n(551).LinkedList;function x(){c.call(this),this.toBeTiled={},this.constraints={}}x.prototype=Object.create(c.prototype);for(var Z in c)x[Z]=c[Z];x.prototype.newGraphManager=function(){var s=new t(this);return this.graphManager=s,s},x.prototype.newGraph=function(s){return new g(null,this.graphManager,s)},x.prototype.newNode=function(s){return new i(this.graphManager,s)},x.prototype.newEdge=function(s){return new r(null,null,s)},x.prototype.initParameters=function(){c.prototype.initParameters.call(this,arguments),this.isSubLayout||(h.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=h.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=h.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=l.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=l.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=l.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=l.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},x.prototype.initSpringEmbedder=function(){c.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/l.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},x.prototype.layout=function(){var s=L.DEFAULT_CREATE_BENDS_AS_NEEDED;return s&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},x.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental){if(h.TREE_REDUCTION_ON_INCREMENTAL){this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var m=new Set(this.getAllNodes()),v=this.nodesWithGravity.filter(function(D){return m.has(D)});this.graphManager.setAllNodesToApplyGravitation(v)}}else{var s=this.getFlatForest();if(s.length>0)this.positionNodesRadially(s);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var m=new Set(this.getAllNodes()),v=this.nodesWithGravity.filter(function(T){return m.has(T)});this.graphManager.setAllNodesToApplyGravitation(v),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(f.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),h.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},x.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%l.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var s=new Set(this.getAllNodes()),m=this.nodesWithGravity.filter(function(d){return s.has(d)});this.graphManager.setAllNodesToApplyGravitation(m),this.graphManager.updateBounds(),this.updateGrid(),h.PURE_INCREMENTAL?this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),h.PURE_INCREMENTAL?this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var v=!this.isTreeGrowing&&!this.isGrowthFinished,T=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(v,T),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},x.prototype.getPositionsData=function(){for(var s=this.graphManager.getAllNodes(),m={},v=0;v0&&this.updateDisplacements();for(var v=0;v0&&(T.fixedNodeWeight=D)}}if(this.constraints.relativePlacementConstraint){var O=new Map,P=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(M){s.fixedNodesOnHorizontal.add(M),s.fixedNodesOnVertical.add(M)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var F=this.constraints.alignmentConstraint.vertical,v=0;v=2*M.length/3;J--)U=Math.floor(Math.random()*(J+1)),X=M[J],M[J]=M[U],M[U]=X;return M},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(M){if(M.left){var U=O.has(M.left)?O.get(M.left):M.left,X=O.has(M.right)?O.get(M.right):M.right;s.nodesInRelativeHorizontal.includes(U)||(s.nodesInRelativeHorizontal.push(U),s.nodeToRelativeConstraintMapHorizontal.set(U,[]),s.dummyToNodeForVerticalAlignment.has(U)?s.nodeToTempPositionMapHorizontal.set(U,s.idToNodeMap.get(s.dummyToNodeForVerticalAlignment.get(U)[0]).getCenterX()):s.nodeToTempPositionMapHorizontal.set(U,s.idToNodeMap.get(U).getCenterX())),s.nodesInRelativeHorizontal.includes(X)||(s.nodesInRelativeHorizontal.push(X),s.nodeToRelativeConstraintMapHorizontal.set(X,[]),s.dummyToNodeForVerticalAlignment.has(X)?s.nodeToTempPositionMapHorizontal.set(X,s.idToNodeMap.get(s.dummyToNodeForVerticalAlignment.get(X)[0]).getCenterX()):s.nodeToTempPositionMapHorizontal.set(X,s.idToNodeMap.get(X).getCenterX())),s.nodeToRelativeConstraintMapHorizontal.get(U).push({right:X,gap:M.gap}),s.nodeToRelativeConstraintMapHorizontal.get(X).push({left:U,gap:M.gap})}else{var J=P.has(M.top)?P.get(M.top):M.top,st=P.has(M.bottom)?P.get(M.bottom):M.bottom;s.nodesInRelativeVertical.includes(J)||(s.nodesInRelativeVertical.push(J),s.nodeToRelativeConstraintMapVertical.set(J,[]),s.dummyToNodeForHorizontalAlignment.has(J)?s.nodeToTempPositionMapVertical.set(J,s.idToNodeMap.get(s.dummyToNodeForHorizontalAlignment.get(J)[0]).getCenterY()):s.nodeToTempPositionMapVertical.set(J,s.idToNodeMap.get(J).getCenterY())),s.nodesInRelativeVertical.includes(st)||(s.nodesInRelativeVertical.push(st),s.nodeToRelativeConstraintMapVertical.set(st,[]),s.dummyToNodeForHorizontalAlignment.has(st)?s.nodeToTempPositionMapVertical.set(st,s.idToNodeMap.get(s.dummyToNodeForHorizontalAlignment.get(st)[0]).getCenterY()):s.nodeToTempPositionMapVertical.set(st,s.idToNodeMap.get(st).getCenterY())),s.nodeToRelativeConstraintMapVertical.get(J).push({bottom:st,gap:M.gap}),s.nodeToRelativeConstraintMapVertical.get(st).push({top:J,gap:M.gap})}});else{var k=new Map,_=new Map;this.constraints.relativePlacementConstraint.forEach(function(M){if(M.left){var U=O.has(M.left)?O.get(M.left):M.left,X=O.has(M.right)?O.get(M.right):M.right;k.has(U)?k.get(U).push(X):k.set(U,[X]),k.has(X)?k.get(X).push(U):k.set(X,[U])}else{var J=P.has(M.top)?P.get(M.top):M.top,st=P.has(M.bottom)?P.get(M.bottom):M.bottom;_.has(J)?_.get(J).push(st):_.set(J,[st]),_.has(st)?_.get(st).push(J):_.set(st,[J])}});var b=function(U,X){var J=[],st=[],Lt=new tt,St=new Set,Q=0;return U.forEach(function(Ut,Mt){if(!St.has(Mt)){J[Q]=[],st[Q]=!1;var at=Mt;for(Lt.push(at),St.add(at),J[Q].push(at);Lt.length!=0;){at=Lt.shift(),X.has(at)&&(st[Q]=!0);var et=U.get(at);et.forEach(function(pt){St.has(pt)||(Lt.push(pt),St.add(pt),J[Q].push(pt))})}Q++}}),{components:J,isFixed:st}},j=b(k,s.fixedNodesOnHorizontal);this.componentsOnHorizontal=j.components,this.fixedComponentsOnHorizontal=j.isFixed;var V=b(_,s.fixedNodesOnVertical);this.componentsOnVertical=V.components,this.fixedComponentsOnVertical=V.isFixed}}},x.prototype.updateDisplacements=function(){var s=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(V){var M=s.idToNodeMap.get(V.nodeId);M.displacementX=0,M.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var m=this.constraints.alignmentConstraint.vertical,v=0;v1){var P;for(P=0;PT&&(T=Math.floor(O.y)),D=Math.floor(O.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new p(L.WORLD_CENTER_X-O.x/2,L.WORLD_CENTER_Y-O.y/2))},x.radialLayout=function(s,m,v){var T=Math.max(this.maxDiagonalInTree(s),h.DEFAULT_RADIAL_SEPARATION);x.branchRadialLayout(m,null,0,359,0,T);var d=B.calculateBounds(s),D=new Y;D.setDeviceOrgX(d.getMinX()),D.setDeviceOrgY(d.getMinY()),D.setWorldOrgX(v.x),D.setWorldOrgY(v.y);for(var O=0;O1;){var J=X[0];X.splice(0,1);var st=b.indexOf(J);st>=0&&b.splice(st,1),M--,j--}m!=null?U=(b.indexOf(X[0])+1)%M:U=0;for(var Lt=Math.abs(T-v)/j,St=U;V!=j;St=++St%M){var Q=b[St].getOtherEnd(s);if(Q!=m){var Ut=(v+V*Lt)%360,Mt=(Ut+Lt)%360;x.branchRadialLayout(Q,s,Ut,Mt,d+D,D),V++}}},x.maxDiagonalInTree=function(s){for(var m=A.MIN_VALUE,v=0;vm&&(m=d)}return m},x.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},x.prototype.groupZeroDegreeMembers=function(){var s=this,m={};this.memberGroups={},this.idToDummyNode={};for(var v=[],T=this.graphManager.getAllNodes(),d=0;d"u"&&(m[P]=[]),m[P]=m[P].concat(D)}Object.keys(m).forEach(function(F){if(m[F].length>1){var I="DummyCompound_"+F;s.memberGroups[I]=m[F];var k=m[F][0].getParent(),_=new i(s.graphManager);_.id=I,_.paddingLeft=k.paddingLeft||0,_.paddingRight=k.paddingRight||0,_.paddingBottom=k.paddingBottom||0,_.paddingTop=k.paddingTop||0,s.idToDummyNode[I]=_;var b=s.getGraphManager().add(s.newGraph(),_),j=k.getChild();j.add(_);for(var V=0;Vd?(T.rect.x-=(T.labelWidth-d)/2,T.setWidth(T.labelWidth),T.labelMarginLeft=(T.labelWidth-d)/2):T.labelPosHorizontal=="right"&&T.setWidth(d+T.labelWidth)),T.labelHeight&&(T.labelPosVertical=="top"?(T.rect.y-=T.labelHeight,T.setHeight(D+T.labelHeight),T.labelMarginTop=T.labelHeight):T.labelPosVertical=="center"&&T.labelHeight>D?(T.rect.y-=(T.labelHeight-D)/2,T.setHeight(T.labelHeight),T.labelMarginTop=(T.labelHeight-D)/2):T.labelPosVertical=="bottom"&&T.setHeight(D+T.labelHeight))}})},x.prototype.repopulateCompounds=function(){for(var s=this.compoundOrder.length-1;s>=0;s--){var m=this.compoundOrder[s],v=m.id,T=m.paddingLeft,d=m.paddingTop,D=m.labelMarginLeft,O=m.labelMarginTop;this.adjustLocations(this.tiledMemberPack[v],m.rect.x,m.rect.y,T,d,D,O)}},x.prototype.repopulateZeroDegreeMembers=function(){var s=this,m=this.tiledZeroDegreePack;Object.keys(m).forEach(function(v){var T=s.idToDummyNode[v],d=T.paddingLeft,D=T.paddingTop,O=T.labelMarginLeft,P=T.labelMarginTop;s.adjustLocations(m[v],T.rect.x,T.rect.y,d,D,O,P)})},x.prototype.getToBeTiled=function(s){var m=s.id;if(this.toBeTiled[m]!=null)return this.toBeTiled[m];var v=s.getChild();if(v==null)return this.toBeTiled[m]=!1,!1;for(var T=v.getNodes(),d=0;d0)return this.toBeTiled[m]=!1,!1;if(D.getChild()==null){this.toBeTiled[D.id]=!1;continue}if(!this.getToBeTiled(D))return this.toBeTiled[m]=!1,!1}return this.toBeTiled[m]=!0,!0},x.prototype.getNodeDegree=function(s){for(var m=s.id,v=s.getEdges(),T=0,d=0;dk&&(k=b.rect.height)}v+=k+s.verticalPadding}},x.prototype.tileCompoundMembers=function(s,m){var v=this;this.tiledMemberPack=[],Object.keys(s).forEach(function(T){var d=m[T];if(v.tiledMemberPack[T]=v.tileNodes(s[T],d.paddingLeft+d.paddingRight),d.rect.width=v.tiledMemberPack[T].width,d.rect.height=v.tiledMemberPack[T].height,d.setCenter(v.tiledMemberPack[T].centerX,v.tiledMemberPack[T].centerY),d.labelMarginLeft=0,d.labelMarginTop=0,h.NODE_DIMENSIONS_INCLUDE_LABELS){var D=d.rect.width,O=d.rect.height;d.labelWidth&&(d.labelPosHorizontal=="left"?(d.rect.x-=d.labelWidth,d.setWidth(D+d.labelWidth),d.labelMarginLeft=d.labelWidth):d.labelPosHorizontal=="center"&&d.labelWidth>D?(d.rect.x-=(d.labelWidth-D)/2,d.setWidth(d.labelWidth),d.labelMarginLeft=(d.labelWidth-D)/2):d.labelPosHorizontal=="right"&&d.setWidth(D+d.labelWidth)),d.labelHeight&&(d.labelPosVertical=="top"?(d.rect.y-=d.labelHeight,d.setHeight(O+d.labelHeight),d.labelMarginTop=d.labelHeight):d.labelPosVertical=="center"&&d.labelHeight>O?(d.rect.y-=(d.labelHeight-O)/2,d.setHeight(d.labelHeight),d.labelMarginTop=(d.labelHeight-O)/2):d.labelPosVertical=="bottom"&&d.setHeight(O+d.labelHeight))}})},x.prototype.tileNodes=function(s,m){var v=this.tileNodesByFavoringDim(s,m,!0),T=this.tileNodesByFavoringDim(s,m,!1),d=this.getOrgRatio(v),D=this.getOrgRatio(T),O;return DP&&(P=V.getWidth())});var F=D/d,I=O/d,k=Math.pow(v-T,2)+4*(F+T)*(I+v)*d,_=(T-v+Math.sqrt(k))/(2*(F+T)),b;m?(b=Math.ceil(_),b==_&&b++):b=Math.floor(_);var j=b*(F+T)-T;return P>j&&(j=P),j+=T*2,j},x.prototype.tileNodesByFavoringDim=function(s,m,v){var T=h.TILING_PADDING_VERTICAL,d=h.TILING_PADDING_HORIZONTAL,D=h.TILING_COMPARE_BY,O={rows:[],rowWidth:[],rowHeight:[],width:0,height:m,verticalPadding:T,horizontalPadding:d,centerX:0,centerY:0};D&&(O.idealRowWidth=this.calcIdealRowWidth(s,v));var P=function(M){return M.rect.width*M.rect.height},F=function(M,U){return P(U)-P(M)};s.sort(function(V,M){var U=F;return O.idealRowWidth?(U=D,U(V.id,M.id)):U(V,M)});for(var I=0,k=0,_=0;_0&&(O+=s.horizontalPadding),s.rowWidth[v]=O,s.width0&&(P+=s.verticalPadding);var F=0;P>s.rowHeight[v]&&(F=s.rowHeight[v],s.rowHeight[v]=P,F=s.rowHeight[v]-F),s.height+=F,s.rows[v].push(m)},x.prototype.getShortestRowIndex=function(s){for(var m=-1,v=Number.MAX_VALUE,T=0;Tv&&(m=T,v=s.rowWidth[T]);return m},x.prototype.canAddHorizontal=function(s,m,v){if(s.idealRowWidth){var T=s.rows.length-1,d=s.rowWidth[T];return d+m+s.horizontalPadding<=s.idealRowWidth}var D=this.getShortestRowIndex(s);if(D<0)return!0;var O=s.rowWidth[D];if(O+s.horizontalPadding+m<=s.width)return!0;var P=0;s.rowHeight[D]0&&(P=v+s.verticalPadding-s.rowHeight[D]);var F;s.width-O>=m+s.horizontalPadding?F=(s.height+P)/(O+m+s.horizontalPadding):F=(s.height+P)/s.width,P=v+s.verticalPadding;var I;return s.widthD&&m!=v){T.splice(-1,1),s.rows[v].push(d),s.rowWidth[m]=s.rowWidth[m]-D,s.rowWidth[v]=s.rowWidth[v]+D,s.width=s.rowWidth[instance.getLongestRowIndex(s)];for(var O=Number.MIN_VALUE,P=0;PO&&(O=T[P].height);m>0&&(O+=s.verticalPadding);var F=s.rowHeight[m]+s.rowHeight[v];s.rowHeight[m]=O,s.rowHeight[v]0)for(var j=d;j<=D;j++)b[0]+=this.grid[j][O-1].length+this.grid[j][O].length-1;if(D0)for(var j=O;j<=P;j++)b[3]+=this.grid[d-1][j].length+this.grid[d][j].length-1;for(var V=A.MAX_VALUE,M,U,X=0;X{var c=n(551).FDLayoutNode,t=n(551).IMath;function g(r,h,f,l){c.call(this,r,h,f,l)}g.prototype=Object.create(c.prototype);for(var i in c)g[i]=c[i];g.prototype.calculateDisplacement=function(){var r=this.graphManager.getLayout();this.getChild()!=null&&this.fixedNodeWeight?(this.displacementX+=r.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=r.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=r.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=r.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>r.coolingFactor*r.maxNodeDisplacement&&(this.displacementX=r.coolingFactor*r.maxNodeDisplacement*t.sign(this.displacementX)),Math.abs(this.displacementY)>r.coolingFactor*r.maxNodeDisplacement&&(this.displacementY=r.coolingFactor*r.maxNodeDisplacement*t.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},g.prototype.propogateDisplacementToChildren=function(r,h){for(var f=this.getChild().getNodes(),l,L=0;L{function c(f){if(Array.isArray(f)){for(var l=0,L=Array(f.length);l0){var dt=0;it.forEach(function(lt){W=="horizontal"?(q.set(lt,y.has(lt)?p[y.get(lt)]:$.get(lt)),dt+=q.get(lt)):(q.set(lt,y.has(lt)?C[y.get(lt)]:$.get(lt)),dt+=q.get(lt))}),dt=dt/it.length,ot.forEach(function(lt){z.has(lt)||q.set(lt,dt)})}else{var nt=0;ot.forEach(function(lt){W=="horizontal"?nt+=y.has(lt)?p[y.get(lt)]:$.get(lt):nt+=y.has(lt)?C[y.get(lt)]:$.get(lt)}),nt=nt/ot.length,ot.forEach(function(lt){q.set(lt,nt)})}});for(var rt=function(){var it=gt.shift(),dt=H.get(it);dt.forEach(function(nt){if(q.get(nt.id)lt&&(lt=Xt),ztFt&&(Ft=zt)}}catch(te){Vt=!0,Dt=te}finally{try{!xt&&Nt.return&&Nt.return()}finally{if(Vt)throw Dt}}var de=(dt+lt)/2-(nt+Ft)/2,Qt=!0,Kt=!1,jt=void 0;try{for(var Jt=ot[Symbol.iterator](),he;!(Qt=(he=Jt.next()).done);Qt=!0){var _t=he.value;q.set(_t,q.get(_t)+de)}}catch(te){Kt=!0,jt=te}finally{try{!Qt&&Jt.return&&Jt.return()}finally{if(Kt)throw jt}}})}return q},Z=function(H){var W=0,z=0,$=0,K=0;if(H.forEach(function(ht){ht.left?p[y.get(ht.left)]-p[y.get(ht.right)]>=0?W++:z++:C[y.get(ht.top)]-C[y.get(ht.bottom)]>=0?$++:K++}),W>z&&$>K)for(var ut=0;utz)for(var ft=0;ftK)for(var q=0;q1)l.fixedNodeConstraint.forEach(function(G,H){T[H]=[G.position.x,G.position.y],d[H]=[p[y.get(G.nodeId)],C[y.get(G.nodeId)]]}),D=!0;else if(l.alignmentConstraint)(function(){var G=0;if(l.alignmentConstraint.vertical){for(var H=l.alignmentConstraint.vertical,W=function(q){var ht=new Set;H[q].forEach(function(vt){ht.add(vt)});var gt=new Set([].concat(c(ht)).filter(function(vt){return P.has(vt)})),rt=void 0;gt.size>0?rt=p[y.get(gt.values().next().value)]:rt=tt(ht).x,H[q].forEach(function(vt){T[G]=[rt,C[y.get(vt)]],d[G]=[p[y.get(vt)],C[y.get(vt)]],G++})},z=0;z0?rt=p[y.get(gt.values().next().value)]:rt=tt(ht).y,$[q].forEach(function(vt){T[G]=[p[y.get(vt)],rt],d[G]=[p[y.get(vt)],C[y.get(vt)]],G++})},ut=0;ut<$.length;ut++)K(ut);D=!0}l.relativePlacementConstraint&&(O=!0)})();else if(l.relativePlacementConstraint){for(var _=0,b=0,j=0;j_&&(_=k[j].length,b=j);if(_0){var Ct={x:0,y:0};l.fixedNodeConstraint.forEach(function(G,H){var W={x:p[y.get(G.nodeId)],y:C[y.get(G.nodeId)]},z=G.position,$=Y(z,W);Ct.x+=$.x,Ct.y+=$.y}),Ct.x/=l.fixedNodeConstraint.length,Ct.y/=l.fixedNodeConstraint.length,p.forEach(function(G,H){p[H]+=Ct.x}),C.forEach(function(G,H){C[H]+=Ct.y}),l.fixedNodeConstraint.forEach(function(G){p[y.get(G.nodeId)]=G.position.x,C[y.get(G.nodeId)]=G.position.y})}if(l.alignmentConstraint){if(l.alignmentConstraint.vertical)for(var mt=l.alignmentConstraint.vertical,Tt=function(H){var W=new Set;mt[H].forEach(function(K){W.add(K)});var z=new Set([].concat(c(W)).filter(function(K){return P.has(K)})),$=void 0;z.size>0?$=p[y.get(z.values().next().value)]:$=tt(W).x,W.forEach(function(K){P.has(K)||(p[y.get(K)]=$)})},Ot=0;Ot0?$=C[y.get(z.values().next().value)]:$=tt(W).y,W.forEach(function(K){P.has(K)||(C[y.get(K)]=$)})},Pt=0;Pt{a.exports=E})},N={};function u(a){var e=N[a];if(e!==void 0)return e.exports;var n=N[a]={exports:{}};return w[a](n,n.exports,u),n.exports}var o=u(45);return o})()})});var _e=me((oe,Me)=>{"use strict";(function(w,N){typeof oe=="object"&&typeof Me=="object"?Me.exports=N(we()):typeof define=="function"&&define.amd?define(["cose-base"],N):typeof oe=="object"?oe.cytoscapeFcose=N(we()):w.cytoscapeFcose=N(w.coseBase)})(oe,function(E){return(()=>{"use strict";var w={658:(a=>{a.exports=Object.assign!=null?Object.assign.bind(Object):function(e){for(var n=arguments.length,c=Array(n>1?n-1:0),t=1;t{var c=(function(){function i(r,h){var f=[],l=!0,L=!1,y=void 0;try{for(var p=r[Symbol.iterator](),C;!(l=(C=p.next()).done)&&(f.push(C.value),!(h&&f.length===h));l=!0);}catch(R){L=!0,y=R}finally{try{!l&&p.return&&p.return()}finally{if(L)throw y}}return f}return function(r,h){if(Array.isArray(r))return r;if(Symbol.iterator in Object(r))return i(r,h);throw new TypeError("Invalid attempt to destructure non-iterable instance")}})(),t=n(140).layoutBase.LinkedList,g={};g.getTopMostNodes=function(i){for(var r={},h=0;h0&&D.merge(I)});for(var O=0;O1){C=y[0],R=C.connectedEdges().length,y.forEach(function(d){d.connectedEdges().length0&&f.set("dummy"+(f.size+1),B),Y},g.relocateComponent=function(i,r,h){if(!h.fixedNodeConstraint){var f=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,L=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY;if(h.quality=="draft"){var p=!0,C=!1,R=void 0;try{for(var A=r.nodeIndexes[Symbol.iterator](),S;!(p=(S=A.next()).done);p=!0){var B=S.value,Y=c(B,2),tt=Y[0],x=Y[1],Z=h.cy.getElementById(tt);if(Z){var s=Z.boundingBox(),m=r.xCoords[x]-s.w/2,v=r.xCoords[x]+s.w/2,T=r.yCoords[x]-s.h/2,d=r.yCoords[x]+s.h/2;ml&&(l=v),Ty&&(y=d)}}}catch(I){C=!0,R=I}finally{try{!p&&A.return&&A.return()}finally{if(C)throw R}}var D=i.x-(l+f)/2,O=i.y-(y+L)/2;r.xCoords=r.xCoords.map(function(I){return I+D}),r.yCoords=r.yCoords.map(function(I){return I+O})}else{Object.keys(r).forEach(function(I){var k=r[I],_=k.getRect().x,b=k.getRect().x+k.getRect().width,j=k.getRect().y,V=k.getRect().y+k.getRect().height;_l&&(l=b),jy&&(y=V)});var P=i.x-(l+f)/2,F=i.y-(y+L)/2;Object.keys(r).forEach(function(I){var k=r[I];k.setCenter(k.getCenterX()+P,k.getCenterY()+F)})}}},g.calcBoundingBox=function(i,r,h,f){for(var l=Number.MAX_SAFE_INTEGER,L=Number.MIN_SAFE_INTEGER,y=Number.MAX_SAFE_INTEGER,p=Number.MIN_SAFE_INTEGER,C=void 0,R=void 0,A=void 0,S=void 0,B=i.descendants().not(":parent"),Y=B.length,tt=0;ttC&&(l=C),LA&&(y=A),p{var c=n(548),t=n(140).CoSELayout,g=n(140).CoSENode,i=n(140).layoutBase.PointD,r=n(140).layoutBase.DimensionD,h=n(140).layoutBase.LayoutConstants,f=n(140).layoutBase.FDLayoutConstants,l=n(140).CoSEConstants,L=function(p,C){var R=p.cy,A=p.eles,S=A.nodes(),B=A.edges(),Y=void 0,tt=void 0,x=void 0,Z={};p.randomize&&(Y=C.nodeIndexes,tt=C.xCoords,x=C.yCoords);var s=function(I){return typeof I=="function"},m=function(I,k){return s(I)?I(k):I},v=c.calcParentsWithoutChildren(R,A),T=function F(I,k,_,b){for(var j=k.length,V=0;V0){var Lt=void 0;Lt=_.getGraphManager().add(_.newGraph(),X),F(Lt,U,_,b)}}},d=function(I,k,_){for(var b=0,j=0,V=0;V<_.length;V++){var M=_[V],U=Z[M.data("source")],X=Z[M.data("target")];if(U&&X&&U!==X&&U.getEdgesBetween(X).length==0){var J=k.add(I.newEdge(),U,X);J.id=M.id(),J.idealLength=m(p.idealEdgeLength,M),J.edgeElasticity=m(p.edgeElasticity,M),b+=J.idealLength,j++}}p.idealEdgeLength!=null&&(j>0?l.DEFAULT_EDGE_LENGTH=f.DEFAULT_EDGE_LENGTH=b/j:s(p.idealEdgeLength)?l.DEFAULT_EDGE_LENGTH=f.DEFAULT_EDGE_LENGTH=50:l.DEFAULT_EDGE_LENGTH=f.DEFAULT_EDGE_LENGTH=p.idealEdgeLength,l.MIN_REPULSION_DIST=f.MIN_REPULSION_DIST=f.DEFAULT_EDGE_LENGTH/10,l.DEFAULT_RADIAL_SEPARATION=f.DEFAULT_EDGE_LENGTH)},D=function(I,k){k.fixedNodeConstraint&&(I.constraints.fixedNodeConstraint=k.fixedNodeConstraint),k.alignmentConstraint&&(I.constraints.alignmentConstraint=k.alignmentConstraint),k.relativePlacementConstraint&&(I.constraints.relativePlacementConstraint=k.relativePlacementConstraint)};p.nestingFactor!=null&&(l.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=f.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=p.nestingFactor),p.gravity!=null&&(l.DEFAULT_GRAVITY_STRENGTH=f.DEFAULT_GRAVITY_STRENGTH=p.gravity),p.numIter!=null&&(l.MAX_ITERATIONS=f.MAX_ITERATIONS=p.numIter),p.gravityRange!=null&&(l.DEFAULT_GRAVITY_RANGE_FACTOR=f.DEFAULT_GRAVITY_RANGE_FACTOR=p.gravityRange),p.gravityCompound!=null&&(l.DEFAULT_COMPOUND_GRAVITY_STRENGTH=f.DEFAULT_COMPOUND_GRAVITY_STRENGTH=p.gravityCompound),p.gravityRangeCompound!=null&&(l.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=f.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=p.gravityRangeCompound),p.initialEnergyOnIncremental!=null&&(l.DEFAULT_COOLING_FACTOR_INCREMENTAL=f.DEFAULT_COOLING_FACTOR_INCREMENTAL=p.initialEnergyOnIncremental),p.tilingCompareBy!=null&&(l.TILING_COMPARE_BY=p.tilingCompareBy),p.quality=="proof"?h.QUALITY=2:h.QUALITY=0,l.NODE_DIMENSIONS_INCLUDE_LABELS=f.NODE_DIMENSIONS_INCLUDE_LABELS=h.NODE_DIMENSIONS_INCLUDE_LABELS=p.nodeDimensionsIncludeLabels,l.DEFAULT_INCREMENTAL=f.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!p.randomize,l.ANIMATE=f.ANIMATE=h.ANIMATE=p.animate,l.TILE=p.tile,l.TILING_PADDING_VERTICAL=typeof p.tilingPaddingVertical=="function"?p.tilingPaddingVertical.call():p.tilingPaddingVertical,l.TILING_PADDING_HORIZONTAL=typeof p.tilingPaddingHorizontal=="function"?p.tilingPaddingHorizontal.call():p.tilingPaddingHorizontal,l.DEFAULT_INCREMENTAL=f.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!0,l.PURE_INCREMENTAL=!p.randomize,h.DEFAULT_UNIFORM_LEAF_NODE_SIZES=p.uniformNodeDimensions,p.step=="transformed"&&(l.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,l.ENFORCE_CONSTRAINTS=!1,l.APPLY_LAYOUT=!1),p.step=="enforced"&&(l.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,l.ENFORCE_CONSTRAINTS=!0,l.APPLY_LAYOUT=!1),p.step=="cose"&&(l.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,l.ENFORCE_CONSTRAINTS=!1,l.APPLY_LAYOUT=!0),p.step=="all"&&(p.randomize?l.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:l.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,l.ENFORCE_CONSTRAINTS=!0,l.APPLY_LAYOUT=!0),p.fixedNodeConstraint||p.alignmentConstraint||p.relativePlacementConstraint?l.TREE_REDUCTION_ON_INCREMENTAL=!1:l.TREE_REDUCTION_ON_INCREMENTAL=!0;var O=new t,P=O.newGraphManager();return T(P.addRoot(),c.getTopMostNodes(S),O,p),d(O,P,B),D(O,p),O.runLayout(),Z};a.exports={coseLayout:L}}),212:((a,e,n)=>{var c=(function(){function p(C,R){for(var A=0;A0)if(d){var P=i.getTopMostNodes(A.eles.nodes());if(s=i.connectComponents(S,A.eles,P),s.forEach(function(at){var et=at.boundingBox();m.push({x:et.x1+et.w/2,y:et.y1+et.h/2})}),A.randomize&&s.forEach(function(at){A.eles=at,Y.push(h(A))}),A.quality=="default"||A.quality=="proof"){var F=S.collection();if(A.tile){var I=new Map,k=[],_=[],b=0,j={nodeIndexes:I,xCoords:k,yCoords:_},V=[];if(s.forEach(function(at,et){at.edges().length==0&&(at.nodes().forEach(function(pt,Et){F.merge(at.nodes()[Et]),pt.isParent()||(j.nodeIndexes.set(at.nodes()[Et].id(),b++),j.xCoords.push(at.nodes()[0].position().x),j.yCoords.push(at.nodes()[0].position().y))}),V.push(et))}),F.length>1){var M=F.boundingBox();m.push({x:M.x1+M.w/2,y:M.y1+M.h/2}),s.push(F),Y.push(j);for(var U=V.length-1;U>=0;U--)s.splice(V[U],1),Y.splice(V[U],1),m.splice(V[U],1)}}s.forEach(function(at,et){A.eles=at,Z.push(l(A,Y[et])),i.relocateComponent(m[et],Z[et],A)})}else s.forEach(function(at,et){i.relocateComponent(m[et],Y[et],A)});var X=new Set;if(s.length>1){var J=[],st=B.filter(function(at){return at.css("display")=="none"});s.forEach(function(at,et){var pt=void 0;if(A.quality=="draft"&&(pt=Y[et].nodeIndexes),at.nodes().not(st).length>0){var Et={};Et.edges=[],Et.nodes=[];var Ct=void 0;at.nodes().not(st).forEach(function(mt){if(A.quality=="draft")if(!mt.isParent())Ct=pt.get(mt.id()),Et.nodes.push({x:Y[et].xCoords[Ct]-mt.boundingbox().w/2,y:Y[et].yCoords[Ct]-mt.boundingbox().h/2,width:mt.boundingbox().w,height:mt.boundingbox().h});else{var Tt=i.calcBoundingBox(mt,Y[et].xCoords,Y[et].yCoords,pt);Et.nodes.push({x:Tt.topLeftX,y:Tt.topLeftY,width:Tt.width,height:Tt.height})}else Z[et][mt.id()]&&Et.nodes.push({x:Z[et][mt.id()].getLeft(),y:Z[et][mt.id()].getTop(),width:Z[et][mt.id()].getWidth(),height:Z[et][mt.id()].getHeight()})}),at.edges().forEach(function(mt){var Tt=mt.source(),Ot=mt.target();if(Tt.css("display")!="none"&&Ot.css("display")!="none")if(A.quality=="draft"){var It=pt.get(Tt.id()),Wt=pt.get(Ot.id()),Pt=[],Yt=[];if(Tt.isParent()){var bt=i.calcBoundingBox(Tt,Y[et].xCoords,Y[et].yCoords,pt);Pt.push(bt.topLeftX+bt.width/2),Pt.push(bt.topLeftY+bt.height/2)}else Pt.push(Y[et].xCoords[It]),Pt.push(Y[et].yCoords[It]);if(Ot.isParent()){var G=i.calcBoundingBox(Ot,Y[et].xCoords,Y[et].yCoords,pt);Yt.push(G.topLeftX+G.width/2),Yt.push(G.topLeftY+G.height/2)}else Yt.push(Y[et].xCoords[Wt]),Yt.push(Y[et].yCoords[Wt]);Et.edges.push({startX:Pt[0],startY:Pt[1],endX:Yt[0],endY:Yt[1]})}else Z[et][Tt.id()]&&Z[et][Ot.id()]&&Et.edges.push({startX:Z[et][Tt.id()].getCenterX(),startY:Z[et][Tt.id()].getCenterY(),endX:Z[et][Ot.id()].getCenterX(),endY:Z[et][Ot.id()].getCenterY()})}),Et.nodes.length>0&&(J.push(Et),X.add(et))}});var Lt=T.packComponents(J,A.randomize).shifts;if(A.quality=="draft")Y.forEach(function(at,et){var pt=at.xCoords.map(function(Ct){return Ct+Lt[et].dx}),Et=at.yCoords.map(function(Ct){return Ct+Lt[et].dy});at.xCoords=pt,at.yCoords=Et});else{var St=0;X.forEach(function(at){Object.keys(Z[at]).forEach(function(et){var pt=Z[at][et];pt.setCenter(pt.getCenterX()+Lt[St].dx,pt.getCenterY()+Lt[St].dy)}),St++})}}}else{var D=A.eles.boundingBox();if(m.push({x:D.x1+D.w/2,y:D.y1+D.h/2}),A.randomize){var O=h(A);Y.push(O)}A.quality=="default"||A.quality=="proof"?(Z.push(l(A,Y[0])),i.relocateComponent(m[0],Z[0],A)):i.relocateComponent(m[0],Y[0],A)}var Q=function(et,pt){if(A.quality=="default"||A.quality=="proof"){typeof et=="number"&&(et=pt);var Et=void 0,Ct=void 0,mt=et.data("id");return Z.forEach(function(Ot){mt in Ot&&(Et={x:Ot[mt].getRect().getCenterX(),y:Ot[mt].getRect().getCenterY()},Ct=Ot[mt])}),A.nodeDimensionsIncludeLabels&&(Ct.labelWidth&&(Ct.labelPosHorizontal=="left"?Et.x+=Ct.labelWidth/2:Ct.labelPosHorizontal=="right"&&(Et.x-=Ct.labelWidth/2)),Ct.labelHeight&&(Ct.labelPosVertical=="top"?Et.y+=Ct.labelHeight/2:Ct.labelPosVertical=="bottom"&&(Et.y-=Ct.labelHeight/2))),Et==null&&(Et={x:et.position("x"),y:et.position("y")}),{x:Et.x,y:Et.y}}else{var Tt=void 0;return Y.forEach(function(Ot){var It=Ot.nodeIndexes.get(et.id());It!=null&&(Tt={x:Ot.xCoords[It],y:Ot.yCoords[It]})}),Tt==null&&(Tt={x:et.position("x"),y:et.position("y")}),{x:Tt.x,y:Tt.y}}};if(A.quality=="default"||A.quality=="proof"||A.randomize){var Ut=i.calcParentsWithoutChildren(S,B),Mt=B.filter(function(at){return at.css("display")=="none"});A.eles=B.not(Mt),B.nodes().not(":parent").not(Mt).layoutPositions(R,A,Q),Ut.length>0&&Ut.forEach(function(at){at.position(Q(at))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")}}]),p})();a.exports=y}),657:((a,e,n)=>{var c=n(548),t=n(140).layoutBase.Matrix,g=n(140).layoutBase.SVD,i=function(h){var f=h.cy,l=h.eles,L=l.nodes(),y=l.nodes(":parent"),p=new Map,C=new Map,R=new Map,A=[],S=[],B=[],Y=[],tt=[],x=[],Z=[],s=[],m=void 0,v=void 0,T=1e8,d=1e-9,D=h.piTol,O=h.samplingType,P=h.nodeSeparation,F=void 0,I=function(){for(var W=0,z=0,$=!1;z=ut;){q=K[ut++];for(var ot=A[q],it=0;itrt&&(rt=tt[nt],vt=nt)}return vt},_=function(W){var z=void 0;if(W){z=Math.floor(Math.random()*v),m=z;for(var K=0;K=1)break;rt=gt}for(var ot=0;ot=1)break;rt=gt}for(var dt=0;dt0&&(z.isParent()?A[W].push(R.get(z.id())):A[W].push(z.id()))})});var Ut=function(W){var z=C.get(W),$=void 0;p.get(W).forEach(function(K){f.getElementById(K).isParent()?$=R.get(K):$=K,A[z].push($),A[C.get($)].push(W)})},Mt=!0,at=!1,et=void 0;try{for(var pt=p.keys()[Symbol.iterator](),Et;!(Mt=(Et=pt.next()).done);Mt=!0){var Ct=Et.value;Ut(Ct)}}catch(H){at=!0,et=H}finally{try{!Mt&&pt.return&&pt.return()}finally{if(at)throw et}}v=C.size;var mt=void 0;if(v>2){F=v{var c=n(212),t=function(i){i&&i("layout","fcose",c)};typeof cytoscape<"u"&&t(cytoscape),a.exports=t}),140:(a=>{a.exports=E})},N={};function u(a){var e=N[a];if(e!==void 0)return e.exports;var n=N[a]={exports:{}};return w[a](n,n.exports,u),n.exports}var o=u(579);return o})()})});var or=pr(_e(),1);var tr={L:"left",R:"right",T:"top",B:"bottom"},er={L:ct(E=>`${E},${E/2} 0,${E} 0,0`,"L"),R:ct(E=>`0,${E/2} ${E},0 ${E},${E}`,"R"),T:ct(E=>`0,0 ${E},0 ${E/2},${E}`,"T"),B:ct(E=>`${E/2},0 ${E},${E} 0,${E}`,"B")},ue={L:ct((E,w)=>E-w+2,"L"),R:ct((E,w)=>E-2,"R"),T:ct((E,w)=>E-w+2,"T"),B:ct((E,w)=>E-2,"B")},yr=ct(function(E){return Ht(E)?E==="L"?"R":"L":E==="T"?"B":"T"},"getOppositeArchitectureDirection"),rr=ct(function(E){let w=E;return w==="L"||w==="R"||w==="T"||w==="B"},"isArchitectureDirection"),Ht=ct(function(E){let w=E;return w==="L"||w==="R"},"isArchitectureDirectionX"),qt=ct(function(E){let w=E;return w==="T"||w==="B"},"isArchitectureDirectionY"),De=ct(function(E,w){let N=Ht(E)&&qt(w),u=qt(E)&&Ht(w);return N||u},"isArchitectureDirectionXY"),Er=ct(function(E){let w=E[0],N=E[1],u=Ht(w)&&qt(N),o=qt(w)&&Ht(N);return u||o},"isArchitecturePairXY"),mr=ct(function(E){return E!=="LL"&&E!=="RR"&&E!=="TT"&&E!=="BB"},"isValidArchitectureDirectionPair"),Oe=ct(function(E,w){let N=`${E}${w}`;return mr(N)?N:void 0},"getArchitectureDirectionPair"),Tr=ct(function([E,w],N){let u=N[0],o=N[1];return Ht(u)?qt(o)?[E+(u==="L"?-1:1),w+(o==="T"?1:-1)]:[E+(u==="L"?-1:1),w]:Ht(o)?[E+(o==="L"?1:-1),w+(u==="T"?1:-1)]:[E,w+(u==="T"?1:-1)]},"shiftPositionByArchitectureDirectionPair"),Nr=ct(function(E){return E==="LT"||E==="TL"?[1,1]:E==="BL"||E==="LB"?[1,-1]:E==="BR"||E==="RB"?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),Lr=ct(function(E,w){return De(E,w)?"bend":Ht(E)?"horizontal":"vertical"},"getArchitectureDirectionAlignment"),Cr=ct(function(E){return E.type==="service"},"isArchitectureService"),Ar=ct(function(E){return E.type==="junction"},"isArchitectureJunction"),ir=ct(E=>E.data(),"edgeData"),ie=ct(E=>E.data(),"nodeData"),wr=Pe.architecture,nr=class{constructor(){this.nodes={},this.groups={},this.edges=[],this.registeredIds={},this.elements={},this.setAccTitle=He,this.getAccTitle=We,this.setDiagramTitle=Be,this.getDiagramTitle=$e,this.getAccDescription=ze,this.setAccDescription=Ve,this.clear()}static{ct(this,"ArchitectureDB")}clear(){this.nodes={},this.groups={},this.edges=[],this.registeredIds={},this.dataStructures=void 0,this.elements={},Xe()}addService({id:E,icon:w,in:N,title:u,iconText:o}){if(this.registeredIds[E]!==void 0)throw new Error(`The service id [${E}] is already in use by another ${this.registeredIds[E]}`);if(N!==void 0){if(E===N)throw new Error(`The service [${E}] cannot be placed within itself`);if(this.registeredIds[N]===void 0)throw new Error(`The service [${E}]'s parent does not exist. Please make sure the parent is created before this service`);if(this.registeredIds[N]==="node")throw new Error(`The service [${E}]'s parent is not a group`)}this.registeredIds[E]="node",this.nodes[E]={id:E,type:"service",icon:w,iconText:o,title:u,edges:[],in:N}}getServices(){return Object.values(this.nodes).filter(Cr)}addJunction({id:E,in:w}){if(this.registeredIds[E]!==void 0)throw new Error(`The junction id [${E}] is already in use by another ${this.registeredIds[E]}`);if(w!==void 0){if(E===w)throw new Error(`The junction [${E}] cannot be placed within itself`);if(this.registeredIds[w]===void 0)throw new Error(`The junction [${E}]'s parent does not exist. Please make sure the parent is created before this junction`);if(this.registeredIds[w]==="node")throw new Error(`The junction [${E}]'s parent is not a group`)}this.registeredIds[E]="node",this.nodes[E]={id:E,type:"junction",edges:[],in:w}}getJunctions(){return Object.values(this.nodes).filter(Ar)}getNodes(){return Object.values(this.nodes)}getNode(E){return this.nodes[E]??null}addGroup({id:E,icon:w,in:N,title:u}){if(this.registeredIds?.[E]!==void 0)throw new Error(`The group id [${E}] is already in use by another ${this.registeredIds[E]}`);if(N!==void 0){if(E===N)throw new Error(`The group [${E}] cannot be placed within itself`);if(this.registeredIds?.[N]===void 0)throw new Error(`The group [${E}]'s parent does not exist. Please make sure the parent is created before this group`);if(this.registeredIds?.[N]==="node")throw new Error(`The group [${E}]'s parent is not a group`)}this.registeredIds[E]="group",this.groups[E]={id:E,icon:w,title:u,in:N}}getGroups(){return Object.values(this.groups)}addEdge({lhsId:E,rhsId:w,lhsDir:N,rhsDir:u,lhsInto:o,rhsInto:a,lhsGroup:e,rhsGroup:n,title:c}){if(!rr(N))throw new Error(`Invalid direction given for left hand side of edge ${E}--${w}. Expected (L,R,T,B) got ${String(N)}`);if(!rr(u))throw new Error(`Invalid direction given for right hand side of edge ${E}--${w}. Expected (L,R,T,B) got ${String(u)}`);if(this.nodes[E]===void 0&&this.groups[E]===void 0)throw new Error(`The left-hand id [${E}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(this.nodes[w]===void 0&&this.groups[w]===void 0)throw new Error(`The right-hand id [${w}] does not yet exist. Please create the service/group before declaring an edge to it.`);let t=this.nodes[E].in,g=this.nodes[w].in;if(e&&t&&g&&t==g)throw new Error(`The left-hand id [${E}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(n&&t&&g&&t==g)throw new Error(`The right-hand id [${w}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let i={lhsId:E,lhsDir:N,lhsInto:o,lhsGroup:e,rhsId:w,rhsDir:u,rhsInto:a,rhsGroup:n,title:c};this.edges.push(i),this.nodes[E]&&this.nodes[w]&&(this.nodes[E].edges.push(this.edges[this.edges.length-1]),this.nodes[w].edges.push(this.edges[this.edges.length-1]))}getEdges(){return this.edges}getDataStructures(){if(this.dataStructures===void 0){let E={},w=Object.entries(this.nodes).reduce((n,[c,t])=>(n[c]=t.edges.reduce((g,i)=>{let r=this.getNode(i.lhsId)?.in,h=this.getNode(i.rhsId)?.in;if(r&&h&&r!==h){let f=Lr(i.lhsDir,i.rhsDir);f!=="bend"&&(E[r]??={},E[r][h]=f,E[h]??={},E[h][r]=f)}if(i.lhsId===c){let f=Oe(i.lhsDir,i.rhsDir);f&&(g[f]=i.rhsId)}else{let f=Oe(i.rhsDir,i.lhsDir);f&&(g[f]=i.lhsId)}return g},{}),n),{}),N=Object.keys(w)[0],u={[N]:1},o=Object.keys(w).reduce((n,c)=>c===N?n:le(ee({},n),{[c]:1}),{}),a=ct(n=>{let c={[n]:[0,0]},t=[n];for(;t.length>0;){let g=t.shift();if(g){u[g]=1,delete o[g];let i=w[g],[r,h]=c[g];Object.entries(i).forEach(([f,l])=>{u[l]||(c[l]=Tr([r,h],f),t.push(l))})}}return c},"BFS"),e=[a(N)];for(;Object.keys(o).length>0;)e.push(a(Object.keys(o)[0]));this.dataStructures={adjList:w,spatialMaps:e,groupAlignments:E}}return this.dataStructures}setElementForId(E,w){this.elements[E]=w}getElementById(E){return this.elements[E]}getConfig(){return Ze(ee(ee({},wr),Ge().architecture))}getConfigField(E){return this.getConfig()[E]}},Mr=ct((E,w)=>{Ke(E,w),E.groups.map(N=>w.addGroup(N)),E.services.map(N=>w.addService(le(ee({},N),{type:"service"}))),E.junctions.map(N=>w.addJunction(le(ee({},N),{type:"junction"}))),E.edges.map(N=>w.addEdge(N))},"populateDb"),ar={parser:{yy:void 0},parse:ct(E=>Zt(null,null,function*(){let w=yield je("architecture",E);Te.debug(w);let N=ar.parser?.yy;if(!(N instanceof nr))throw new Error("parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");Mr(w,N)}),"parse")},Or=ct(E=>` - .edge { - stroke-width: ${E.archEdgeWidth}; - stroke: ${E.archEdgeColor}; - fill: none; - } - - .arrow { - fill: ${E.archEdgeArrowColor}; - } - - .node-bkg { - fill: none; - stroke: ${E.archGroupBorderColor}; - stroke-width: ${E.archGroupBorderWidth}; - stroke-dasharray: 8; - } - .node-icon-text { - display: flex; - align-items: center; - } - - .node-icon-text > div { - color: #fff; - margin: 1px; - height: fit-content; - text-align: center; - overflow: hidden; - display: -webkit-box; - -webkit-box-orient: vertical; - } -`,"getStyles"),Dr=Or,re=ct(E=>`${E}`,"wrapIcon"),se={prefix:"mermaid-architecture",height:80,width:80,icons:{database:{body:re('')},server:{body:re('')},disk:{body:re('')},internet:{body:re('')},cloud:{body:re('')},unknown:Qe,blank:{body:re("")}}},xr=ct(function(E,w,N){return Zt(this,null,function*(){let u=N.getConfigField("padding"),o=N.getConfigField("iconSize"),a=o/2,e=o/6,n=e/2;yield Promise.all(w.edges().map(c=>Zt(null,null,function*(){let{source:t,sourceDir:g,sourceArrow:i,sourceGroup:r,target:h,targetDir:f,targetArrow:l,targetGroup:L,label:y}=ir(c),{x:p,y:C}=c[0].sourceEndpoint(),{x:R,y:A}=c[0].midpoint(),{x:S,y:B}=c[0].targetEndpoint(),Y=u+4;if(r&&(Ht(g)?p+=g==="L"?-Y:Y:C+=g==="T"?-Y:Y+18),L&&(Ht(f)?S+=f==="L"?-Y:Y:B+=f==="T"?-Y:Y+18),!r&&N.getNode(t)?.type==="junction"&&(Ht(g)?p+=g==="L"?a:-a:C+=g==="T"?a:-a),!L&&N.getNode(h)?.type==="junction"&&(Ht(f)?S+=f==="L"?a:-a:B+=f==="T"?a:-a),c[0]._private.rscratch){let tt=E.insert("g");if(tt.insert("path").attr("d",`M ${p},${C} L ${R},${A} L${S},${B} `).attr("class","edge").attr("id",qe(t,h,{prefix:"L"})),i){let x=Ht(g)?ue[g](p,e):p-n,Z=qt(g)?ue[g](C,e):C-n;tt.insert("polygon").attr("points",er[g](e)).attr("transform",`translate(${x},${Z})`).attr("class","arrow")}if(l){let x=Ht(f)?ue[f](S,e):S-n,Z=qt(f)?ue[f](B,e):B-n;tt.insert("polygon").attr("points",er[f](e)).attr("transform",`translate(${x},${Z})`).attr("class","arrow")}if(y){let x=De(g,f)?"XY":Ht(g)?"X":"Y",Z=0;x==="X"?Z=Math.abs(p-S):x==="Y"?Z=Math.abs(C-B)/1.5:Z=Math.abs(p-S)/2;let s=tt.append("g");if(yield ge(s,y,{useHtmlLabels:!1,width:Z,classes:"architecture-service-label"},fe()),s.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),x==="X")s.attr("transform","translate("+R+", "+A+")");else if(x==="Y")s.attr("transform","translate("+R+", "+A+") rotate(-90)");else if(x==="XY"){let m=Oe(g,f);if(m&&Er(m)){let v=s.node().getBoundingClientRect(),[T,d]=Nr(m);s.attr("dominant-baseline","auto").attr("transform",`rotate(${-1*T*d*45})`);let D=s.node().getBoundingClientRect();s.attr("transform",` - translate(${R}, ${A-v.height/2}) - translate(${T*D.width/2}, ${d*D.height/2}) - rotate(${-1*T*d*45}, 0, ${v.height/2}) - `)}}}}})))})},"drawEdges"),Ir=ct(function(E,w,N){return Zt(this,null,function*(){let o=N.getConfigField("padding")*.75,a=N.getConfigField("fontSize"),n=N.getConfigField("iconSize")/2;yield Promise.all(w.nodes().map(c=>Zt(null,null,function*(){let t=ie(c);if(t.type==="group"){let{h:g,w:i,x1:r,y1:h}=c.boundingBox(),f=E.append("rect");f.attr("id",`group-${t.id}`).attr("x",r+n).attr("y",h+n).attr("width",i).attr("height",g).attr("class","node-bkg");let l=E.append("g"),L=r,y=h;if(t.icon){let p=l.append("g");p.html(`${yield ce(t.icon,{height:o,width:o,fallbackPrefix:se.prefix})}`),p.attr("transform","translate("+(L+n+1)+", "+(y+n+1)+")"),L+=o,y+=a/2-1-2}if(t.label){let p=l.append("g");yield ge(p,t.label,{useHtmlLabels:!1,width:i,classes:"architecture-service-label"},fe()),p.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),p.attr("transform","translate("+(L+n+4)+", "+(y+n+2)+")")}N.setElementForId(t.id,f)}})))})},"drawGroups"),Rr=ct(function(E,w,N){return Zt(this,null,function*(){let u=fe();for(let o of N){let a=w.append("g"),e=E.getConfigField("iconSize");if(o.title){let g=a.append("g");yield ge(g,o.title,{useHtmlLabels:!1,width:e*1.5,classes:"architecture-service-label"},u),g.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),g.attr("transform","translate("+e/2+", "+e+")")}let n=a.append("g");if(o.icon)n.html(`${yield ce(o.icon,{height:e,width:e,fallbackPrefix:se.prefix})}`);else if(o.iconText){n.html(`${yield ce("blank",{height:e,width:e,fallbackPrefix:se.prefix})}`);let r=n.append("g").append("foreignObject").attr("width",e).attr("height",e).append("div").attr("class","node-icon-text").attr("style",`height: ${e}px;`).append("div").html(Ue(o.iconText,u)),h=parseInt(window.getComputedStyle(r.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;r.attr("style",`-webkit-line-clamp: ${Math.floor((e-2)/h)};`)}else n.append("path").attr("class","node-bkg").attr("id","node-"+o.id).attr("d",`M0,${e} V5 Q0,0 5,0 H${e-5} Q${e},0 ${e},5 V${e} Z`);a.attr("id",`service-${o.id}`).attr("class","architecture-service");let{width:c,height:t}=a.node().getBBox();o.width=c,o.height=t,E.setElementForId(o.id,a)}return 0})},"drawServices"),Sr=ct(function(E,w,N){N.forEach(u=>{let o=w.append("g"),a=E.getConfigField("iconSize");o.append("g").append("rect").attr("id","node-"+u.id).attr("fill-opacity","0").attr("width",a).attr("height",a),o.attr("class","architecture-junction");let{width:n,height:c}=o._groups[0][0].getBBox();o.width=n,o.height=c,E.setElementForId(u.id,o)})},"drawJunctions");Je([{name:se.prefix,icons:se}]);Ne.use(or.default);function sr(E,w,N){E.forEach(u=>{w.add({group:"nodes",data:{type:"service",id:u.id,icon:u.icon,label:u.title,parent:u.in,width:N.getConfigField("iconSize"),height:N.getConfigField("iconSize")},classes:"node-service"})})}ct(sr,"addServices");function hr(E,w,N){E.forEach(u=>{w.add({group:"nodes",data:{type:"junction",id:u.id,parent:u.in,width:N.getConfigField("iconSize"),height:N.getConfigField("iconSize")},classes:"node-junction"})})}ct(hr,"addJunctions");function lr(E,w){w.nodes().map(N=>{let u=ie(N);if(u.type==="group")return;u.x=N.position().x,u.y=N.position().y,E.getElementById(u.id).attr("transform","translate("+(u.x||0)+","+(u.y||0)+")")})}ct(lr,"positionNodes");function fr(E,w){E.forEach(N=>{w.add({group:"nodes",data:{type:"group",id:N.id,icon:N.icon,label:N.title,parent:N.in},classes:"node-group"})})}ct(fr,"addGroups");function cr(E,w){E.forEach(N=>{let{lhsId:u,rhsId:o,lhsInto:a,lhsGroup:e,rhsInto:n,lhsDir:c,rhsDir:t,rhsGroup:g,title:i}=N,r=De(N.lhsDir,N.rhsDir)?"segments":"straight",h={id:`${u}-${o}`,label:i,source:u,sourceDir:c,sourceArrow:a,sourceGroup:e,sourceEndpoint:c==="L"?"0 50%":c==="R"?"100% 50%":c==="T"?"50% 0":"50% 100%",target:o,targetDir:t,targetArrow:n,targetGroup:g,targetEndpoint:t==="L"?"0 50%":t==="R"?"100% 50%":t==="T"?"50% 0":"50% 100%"};w.add({group:"edges",data:h,classes:r})})}ct(cr,"addEdges");function gr(E,w,N){let u=ct((n,c)=>Object.entries(n).reduce((t,[g,i])=>{let r=0,h=Object.entries(i);if(h.length===1)return t[g]=h[0][1],t;for(let f=0;f{let c={},t={};return Object.entries(n).forEach(([g,[i,r]])=>{let h=E.getNode(g)?.in??"default";c[r]??={},c[r][h]??=[],c[r][h].push(g),t[i]??={},t[i][h]??=[],t[i][h].push(g)}),{horiz:Object.values(u(c,"horizontal")).filter(g=>g.length>1),vert:Object.values(u(t,"vertical")).filter(g=>g.length>1)}}),[a,e]=o.reduce(([n,c],{horiz:t,vert:g})=>[[...n,...t],[...c,...g]],[[],[]]);return{horizontal:a,vertical:e}}ct(gr,"getAlignments");function ur(E,w){let N=[],u=ct(a=>`${a[0]},${a[1]}`,"posToStr"),o=ct(a=>a.split(",").map(e=>parseInt(e)),"strToPos");return E.forEach(a=>{let e=Object.fromEntries(Object.entries(a).map(([g,i])=>[u(i),g])),n=[u([0,0])],c={},t={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;n.length>0;){let g=n.shift();if(g){c[g]=1;let i=e[g];if(i){let r=o(g);Object.entries(t).forEach(([h,f])=>{let l=u([r[0]+f[0],r[1]+f[1]]),L=e[l];L&&!c[l]&&(n.push(l),N.push({[tr[h]]:L,[tr[yr(h)]]:i,gap:1.5*w.getConfigField("iconSize")}))})}}}}),N}ct(ur,"getRelativeConstraints");function dr(E,w,N,u,o,{spatialMaps:a,groupAlignments:e}){return new Promise(n=>{let c=be("body").append("div").attr("id","cy").attr("style","display:none"),t=Ne({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"straight",label:"data(label)","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"edge.segments",style:{"curve-style":"segments","segment-weights":"0","segment-distances":[.5],"edge-distances":"endpoints","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"node",style:{"compound-sizing-wrt-labels":"include"}},{selector:"node[label]",style:{"text-valign":"bottom","text-halign":"center","font-size":`${o.getConfigField("fontSize")}px`}},{selector:".node-service",style:{label:"data(label)",width:"data(width)",height:"data(height)"}},{selector:".node-junction",style:{width:"data(width)",height:"data(height)"}},{selector:".node-group",style:{padding:`${o.getConfigField("padding")}px`}}],layout:{name:"grid",boundingBox:{x1:0,x2:100,y1:0,y2:100}}});c.remove(),fr(N,t),sr(E,t,o),hr(w,t,o),cr(u,t);let g=gr(o,a,e),i=ur(a,o),r=t.layout({name:"fcose",quality:"proof",styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(h){let[f,l]=h.connectedNodes(),{parent:L}=ie(f),{parent:y}=ie(l);return L===y?1.5*o.getConfigField("iconSize"):.5*o.getConfigField("iconSize")},edgeElasticity(h){let[f,l]=h.connectedNodes(),{parent:L}=ie(f),{parent:y}=ie(l);return L===y?.45:.001},alignmentConstraint:g,relativePlacementConstraint:i});r.one("layoutstop",()=>{function h(f,l,L,y){let p,C,{x:R,y:A}=f,{x:S,y:B}=l;C=(y-A+(R-L)*(A-B)/(R-S))/Math.sqrt(1+Math.pow((A-B)/(R-S),2)),p=Math.sqrt(Math.pow(y-A,2)+Math.pow(L-R,2)-Math.pow(C,2));let Y=Math.sqrt(Math.pow(S-R,2)+Math.pow(B-A,2));p=p/Y;let tt=(S-R)*(y-A)-(B-A)*(L-R);switch(!0){case tt>=0:tt=1;break;case tt<0:tt=-1;break}let x=(S-R)*(L-R)+(B-A)*(y-A);switch(!0){case x>=0:x=1;break;case x<0:x=-1;break}return C=Math.abs(C)*tt,p=p*x,{distances:C,weights:p}}ct(h,"getSegmentWeights"),t.startBatch();for(let f of Object.values(t.edges()))if(f.data?.()){let{x:l,y:L}=f.source().position(),{x:y,y:p}=f.target().position();if(l!==y&&L!==p){let C=f.sourceEndpoint(),R=f.targetEndpoint(),{sourceDir:A}=ir(f),[S,B]=qt(A)?[C.x,R.y]:[R.x,C.y],{weights:Y,distances:tt}=h(C,R,S,B);f.style("segment-distances",tt),f.style("segment-weights",Y)}}t.endBatch(),r.run()}),r.run(),t.ready(h=>{Te.info("Ready",h),n(t)})})}ct(dr,"layoutArchitecture");var Fr=ct((E,w,N,u)=>Zt(null,null,function*(){let o=u.db,a=o.getServices(),e=o.getJunctions(),n=o.getGroups(),c=o.getEdges(),t=o.getDataStructures(),g=ke(w),i=g.append("g");i.attr("class","architecture-edges");let r=g.append("g");r.attr("class","architecture-services");let h=g.append("g");h.attr("class","architecture-groups"),yield Rr(o,r,a),Sr(o,r,e);let f=yield dr(a,e,n,c,o,t);yield xr(i,f,o),yield Ir(h,f,o),lr(o,f),Ye(void 0,g,o.getConfigField("padding"),o.getConfigField("useMaxWidth"))}),"draw"),br={draw:Fr},Br={parser:ar,get db(){return new nr},renderer:br,styles:Dr};export{Br as diagram}; diff --git a/src/google/adk/cli/browser/chunk-46YSBSFN.js b/src/google/adk/cli/browser/chunk-46YSBSFN.js deleted file mode 100644 index 38b07a71e3..0000000000 --- a/src/google/adk/cli/browser/chunk-46YSBSFN.js +++ /dev/null @@ -1 +0,0 @@ -import{a as i,b as e,c as o,d as a}from"./chunk-TIJO3EOA.js";import"./chunk-B2DSW4QB.js";import"./chunk-NMKTPNXE.js";import"./chunk-APNCZOFE.js";import"./chunk-ST54LLJ3.js";import"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import"./chunk-QFMJV7VH.js";import{g as t}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";var y={parser:i,get db(){return new e},renderer:a,styles:o,init:t(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{y as diagram}; diff --git a/src/google/adk/cli/browser/chunk-4R6SYGKS.js b/src/google/adk/cli/browser/chunk-4R6SYGKS.js deleted file mode 100644 index b1f4852fce..0000000000 --- a/src/google/adk/cli/browser/chunk-4R6SYGKS.js +++ /dev/null @@ -1 +0,0 @@ -import{g as t}from"./chunk-JRNAXTJ7.js";var s=class{constructor(i){this.init=i,this.records=this.init()}static{t(this,"ImperativeState")}reset(){this.records=this.init()}};export{s as a}; diff --git a/src/google/adk/cli/browser/chunk-Y7O3NHKW.js b/src/google/adk/cli/browser/chunk-4S2CIXCW.js similarity index 91% rename from src/google/adk/cli/browser/chunk-Y7O3NHKW.js rename to src/google/adk/cli/browser/chunk-4S2CIXCW.js index 64e0fba907..62cdc0909a 100644 --- a/src/google/adk/cli/browser/chunk-Y7O3NHKW.js +++ b/src/google/adk/cli/browser/chunk-4S2CIXCW.js @@ -1 +1 @@ -import{$a as s,Ca as o,Cc as _,Gb as u,Lb as g,Pa as r,Yb as y,Zb as C,eb as c,ob as a,pd as M,qd as v,ub as d,vb as l,wb as p,xb as m,yb as f,zb as h}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function O(e,x){if(e&1&&u(0,0),e&2){let n=x.$implicit,i=g();m("surfaceId",i.surfaceId())("component",n)}}var D=(()=>{class e extends M{direction=_("vertical");static \u0275fac=(()=>{let n;return function(t){return(n||(n=o(e)))(t||e)}})();static \u0275cmp=s({type:e,selectors:[["a2ui-list"]],hostVars:1,hostBindings:function(i,t){i&2&&a("direction",t.direction())},inputs:{direction:[1,"direction"]},features:[c],decls:3,vars:4,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(i,t){i&1&&(f(0,"section"),l(1,O,1,2,"ng-container",0,d),h()),i&2&&(y(t.theme.additionalStyles==null?null:t.theme.additionalStyles.List),C(t.theme.components.List),r(),p(t.component().properties.children))},dependencies:[v],styles:['[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}[direction="vertical"][_nghost-%COMP%] section[_ngcontent-%COMP%]{display:grid}[direction="horizontal"][_nghost-%COMP%] section[_ngcontent-%COMP%]{display:flex;max-width:100%;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none}[direction="horizontal"][_nghost-%COMP%] section[_ngcontent-%COMP%] > [_ngcontent-%COMP%]::slotted(*){flex:1 0 fit-content;max-width:min(80%,400px)}']})}return e})();export{D as List}; +import{$a as s,Ca as o,Cc as _,Gb as u,Lb as g,Pa as r,Yb as y,Zb as C,eb as c,ob as a,pd as M,qd as v,ub as d,vb as l,wb as p,xb as m,yb as f,zb as h}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function O(e,x){if(e&1&&u(0,0),e&2){let n=x.$implicit,i=g();m("surfaceId",i.surfaceId())("component",n)}}var D=(()=>{class e extends M{direction=_("vertical");static \u0275fac=(()=>{let n;return function(t){return(n||(n=o(e)))(t||e)}})();static \u0275cmp=s({type:e,selectors:[["a2ui-list"]],hostVars:1,hostBindings:function(i,t){i&2&&a("direction",t.direction())},inputs:{direction:[1,"direction"]},features:[c],decls:3,vars:4,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(i,t){i&1&&(f(0,"section"),l(1,O,1,2,"ng-container",0,d),h()),i&2&&(y(t.theme.additionalStyles==null?null:t.theme.additionalStyles.List),C(t.theme.components.List),r(),p(t.component().properties.children))},dependencies:[v],styles:['[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}[direction="vertical"][_nghost-%COMP%] section[_ngcontent-%COMP%]{display:grid}[direction="horizontal"][_nghost-%COMP%] section[_ngcontent-%COMP%]{display:flex;max-width:100%;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none}[direction="horizontal"][_nghost-%COMP%] section[_ngcontent-%COMP%] > [_ngcontent-%COMP%]::slotted(*){flex:1 0 fit-content;max-width:min(80%,400px)}']})}return e})();export{D as List}; diff --git a/src/google/adk/cli/browser/chunk-5PR7OWPD.js b/src/google/adk/cli/browser/chunk-5PR7OWPD.js deleted file mode 100644 index 22e4ffa1d8..0000000000 --- a/src/google/adk/cli/browser/chunk-5PR7OWPD.js +++ /dev/null @@ -1,43 +0,0 @@ -import{a as D}from"./chunk-DMWOYWYQ.js";import{a as z}from"./chunk-T3Q3QCCV.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{a as _}from"./chunk-TPDTRWWV.js";import{l as y}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as w,N as T,R as S,S as O,T as k,U as R,V as I,W as E,X as F,p as A,r as L}from"./chunk-QFMJV7VH.js";import{g as o,i as M}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as C,j as b}from"./chunk-RMXJBC7V.js";var x={showLegend:!0,ticks:5,max:null,min:0,graticule:"circle"},G={axes:[],curves:[],options:x},g=structuredClone(G),U=L.radar,X=o(()=>y(C(C({},U),w().radar)),"getConfig"),P=o(()=>g.axes,"getAxes"),Y=o(()=>g.curves,"getCurves"),Z=o(()=>g.options,"getOptions"),q=o(a=>{g.axes=a.map(t=>({name:t.name,label:t.label??t.name}))},"setAxes"),J=o(a=>{g.curves=a.map(t=>({name:t.name,label:t.label??t.name,entries:K(t.entries)}))},"setCurves"),K=o(a=>{if(a[0].axis==null)return a.map(e=>e.value);let t=P();if(t.length===0)throw new Error("Axes must be populated before curves for reference entries");return t.map(e=>{let r=a.find(n=>n.axis?.$refText===e.name);if(r===void 0)throw new Error("Missing entry for axis "+e.label);return r.value})},"computeCurveEntries"),Q=o(a=>{let t=a.reduce((e,r)=>(e[r.name]=r,e),{});g.options={showLegend:t.showLegend?.value??x.showLegend,ticks:t.ticks?.value??x.ticks,max:t.max?.value??x.max,min:t.min?.value??x.min,graticule:t.graticule?.value??x.graticule}},"setOptions"),tt=o(()=>{S(),g=structuredClone(G)},"clear"),$={getAxes:P,getCurves:Y,getOptions:Z,setAxes:q,setCurves:J,setOptions:Q,getConfig:X,clear:tt,setAccTitle:O,getAccTitle:k,setDiagramTitle:E,getDiagramTitle:F,getAccDescription:I,setAccDescription:R},et=o(a=>{D(a,$);let{axes:t,curves:e,options:r}=a;$.setAxes(t),$.setCurves(e),$.setOptions(r)},"populate"),at={parse:o(a=>b(null,null,function*(){let t=yield z("radar",a);M.debug(t),et(t)}),"parse")},rt=o((a,t,e,r)=>{let n=r.db,i=n.getAxes(),l=n.getCurves(),s=n.getOptions(),c=n.getConfig(),d=n.getDiagramTitle(),p=_(t),u=nt(p,c),m=s.max??Math.max(...l.map(f=>Math.max(...f.entries))),h=s.min,v=Math.min(c.width,c.height)/2;st(u,i,v,s.ticks,s.graticule),ot(u,i,v,c),W(u,i,l,h,m,s.graticule,c),H(u,l,s.showLegend,c),u.append("text").attr("class","radarTitle").text(d).attr("x",0).attr("y",-c.height/2-c.marginTop)},"draw"),nt=o((a,t)=>{let e=t.width+t.marginLeft+t.marginRight,r=t.height+t.marginTop+t.marginBottom,n={x:t.marginLeft+t.width/2,y:t.marginTop+t.height/2};return T(a,r,e,t.useMaxWidth??!0),a.attr("viewBox",`0 0 ${e} ${r}`),a.append("g").attr("transform",`translate(${n.x}, ${n.y})`)},"drawFrame"),st=o((a,t,e,r,n)=>{if(n==="circle")for(let i=0;i{let u=2*p*Math.PI/i-Math.PI/2,m=s*Math.cos(u),h=s*Math.sin(u);return`${m},${h}`}).join(" ");a.append("polygon").attr("points",c).attr("class","radarGraticule")}}},"drawGraticule"),ot=o((a,t,e,r)=>{let n=t.length;for(let i=0;i{if(d.entries.length!==s)return;let u=d.entries.map((m,h)=>{let v=2*Math.PI*h/s-Math.PI/2,f=B(m,r,n,c),j=f*Math.cos(v),N=f*Math.sin(v);return{x:j,y:N}});i==="circle"?a.append("path").attr("d",V(u,l.curveTension)).attr("class",`radarCurve-${p}`):i==="polygon"&&a.append("polygon").attr("points",u.map(m=>`${m.x},${m.y}`).join(" ")).attr("class",`radarCurve-${p}`)})}o(W,"drawCurves");function B(a,t,e,r){let n=Math.min(Math.max(a,t),e);return r*(n-t)/(e-t)}o(B,"relativeRadius");function V(a,t){let e=a.length,r=`M${a[0].x},${a[0].y}`;for(let n=0;n{let d=a.append("g").attr("transform",`translate(${n}, ${i+c*l})`);d.append("rect").attr("width",12).attr("height",12).attr("class",`radarLegendBox-${c}`),d.append("text").attr("x",16).attr("y",0).attr("class","radarLegendText").text(s.label)})}o(H,"drawLegend");var it={draw:rt},lt=o((a,t)=>{let e="";for(let r=0;r{let t=A(),e=w(),r=y(t,e.themeVariables),n=y(r.radar,a);return{themeVariables:r,radarOptions:n}},"buildRadarStyleOptions"),dt=o(({radar:a}={})=>{let{themeVariables:t,radarOptions:e}=ct(a);return` - .radarTitle { - font-size: ${t.fontSize}; - color: ${t.titleColor}; - dominant-baseline: hanging; - text-anchor: middle; - } - .radarAxisLine { - stroke: ${e.axisColor}; - stroke-width: ${e.axisStrokeWidth}; - } - .radarAxisLabel { - dominant-baseline: middle; - text-anchor: middle; - font-size: ${e.axisLabelFontSize}px; - color: ${e.axisColor}; - } - .radarGraticule { - fill: ${e.graticuleColor}; - fill-opacity: ${e.graticuleOpacity}; - stroke: ${e.graticuleColor}; - stroke-width: ${e.graticuleStrokeWidth}; - } - .radarLegendText { - text-anchor: start; - font-size: ${e.legendFontSize}px; - dominant-baseline: hanging; - } - ${lt(t,e)} - `},"styles"),vt={parser:at,db:$,renderer:it,styles:dt};export{vt as diagram}; diff --git a/src/google/adk/cli/browser/chunk-R6ZR5LUR.js b/src/google/adk/cli/browser/chunk-5VJ6OSLK.js similarity index 87% rename from src/google/adk/cli/browser/chunk-R6ZR5LUR.js rename to src/google/adk/cli/browser/chunk-5VJ6OSLK.js index e3dea3c53d..b1df2d73d2 100644 --- a/src/google/adk/cli/browser/chunk-R6ZR5LUR.js +++ b/src/google/adk/cli/browser/chunk-5VJ6OSLK.js @@ -1 +1 @@ -import{$a as d,Bb as m,Ca as r,Cb as u,Cc as _,Db as p,Ib as v,Lb as f,Ma as l,Pa as n,Yb as y,Zb as g,eb as s,fc as h,gc as x,hc as C,pd as b,qb as a,sb as c,wc as M}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function U(e,V){if(e&1&&(m(0,"section"),p(1,"video",1),u()),e&2){let t=f(),i=C(0);y(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Video),g(t.theme.components.Video),n(),v("src",i,l)}}var L=(()=>{class e extends b{url=_.required();resolvedUrl=M(()=>this.resolvePrimitive(this.url()));static \u0275fac=(()=>{let t;return function(o){return(t||(t=r(e)))(o||e)}})();static \u0275cmp=d({type:e,selectors:[["a2ui-video"]],inputs:{url:[1,"url"]},features:[s],decls:2,vars:2,consts:[[3,"class","style"],["controls","",3,"src"]],template:function(i,o){if(i&1&&(h(0),a(1,U,2,5,"section",0)),i&2){let D=x(o.resolvedUrl());n(),c(D?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}video[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return e})();export{L as Video}; +import{$a as d,Bb as m,Ca as r,Cb as u,Cc as _,Db as p,Ib as v,Lb as f,Ma as l,Pa as n,Yb as y,Zb as g,eb as s,fc as h,gc as x,hc as C,pd as b,qb as a,sb as c,wc as M}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function U(e,V){if(e&1&&(m(0,"section"),p(1,"video",1),u()),e&2){let t=f(),i=C(0);y(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Video),g(t.theme.components.Video),n(),v("src",i,l)}}var L=(()=>{class e extends b{url=_.required();resolvedUrl=M(()=>this.resolvePrimitive(this.url()));static \u0275fac=(()=>{let t;return function(o){return(t||(t=r(e)))(o||e)}})();static \u0275cmp=d({type:e,selectors:[["a2ui-video"]],inputs:{url:[1,"url"]},features:[s],decls:2,vars:2,consts:[[3,"class","style"],["controls","",3,"src"]],template:function(i,o){if(i&1&&(h(0),a(1,U,2,5,"section",0)),i&2){let D=x(o.resolvedUrl());n(),c(D?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}video[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return e})();export{L as Video}; diff --git a/src/google/adk/cli/browser/chunk-6UL33SIT.js b/src/google/adk/cli/browser/chunk-6UL33SIT.js deleted file mode 100644 index 21d3afb53d..0000000000 --- a/src/google/adk/cli/browser/chunk-6UL33SIT.js +++ /dev/null @@ -1,89 +0,0 @@ -import{a as _e}from"./chunk-B2DSW4QB.js";import{a as fe}from"./chunk-TPDTRWWV.js";import{a as be,b as ye}from"./chunk-ZMOC4H7T.js";import{d as ke,g as me,j as Ee}from"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{G as B,O as pe,Y as M,c as de,d as te,e as ne,r as W}from"./chunk-QFMJV7VH.js";import{g as o,i as Y}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{j as ge}from"./chunk-RMXJBC7V.js";var ie=(function(){var e=o(function(O,i,n,s){for(n=n||{},s=O.length;s--;n[O[s]]=i);return n},"o"),u=[1,4],p=[1,13],r=[1,12],d=[1,15],_=[1,16],y=[1,20],l=[1,19],D=[6,7,8],I=[1,26],g=[1,24],w=[1,25],m=[6,7,11],U=[1,31],N=[6,7,11,24],j=[1,6,13,16,17,20,23],k=[1,35],A=[1,36],L=[1,6,7,11,13,16,17,20,23],H=[1,38],T={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,KANBAN:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,shapeData:15,ICON:16,CLASS:17,nodeWithId:18,nodeWithoutId:19,NODE_DSTART:20,NODE_DESCR:21,NODE_DEND:22,NODE_ID:23,SHAPE_DATA:24,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"KANBAN",11:"EOF",13:"SPACELIST",16:"ICON",17:"CLASS",20:"NODE_DSTART",21:"NODE_DESCR",22:"NODE_DEND",23:"NODE_ID",24:"SHAPE_DATA"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,3],[12,2],[12,2],[12,2],[12,1],[12,2],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[19,3],[18,1],[18,4],[15,2],[15,1]],performAction:o(function(i,n,s,a,h,t,R){var c=t.length-1;switch(h){case 6:case 7:return a;case 8:a.getLogger().trace("Stop NL ");break;case 9:a.getLogger().trace("Stop EOF ");break;case 11:a.getLogger().trace("Stop NL2 ");break;case 12:a.getLogger().trace("Stop EOF2 ");break;case 15:a.getLogger().info("Node: ",t[c-1].id),a.addNode(t[c-2].length,t[c-1].id,t[c-1].descr,t[c-1].type,t[c]);break;case 16:a.getLogger().info("Node: ",t[c].id),a.addNode(t[c-1].length,t[c].id,t[c].descr,t[c].type);break;case 17:a.getLogger().trace("Icon: ",t[c]),a.decorateNode({icon:t[c]});break;case 18:case 23:a.decorateNode({class:t[c]});break;case 19:a.getLogger().trace("SPACELIST");break;case 20:a.getLogger().trace("Node: ",t[c-1].id),a.addNode(0,t[c-1].id,t[c-1].descr,t[c-1].type,t[c]);break;case 21:a.getLogger().trace("Node: ",t[c].id),a.addNode(0,t[c].id,t[c].descr,t[c].type);break;case 22:a.decorateNode({icon:t[c]});break;case 27:a.getLogger().trace("node found ..",t[c-2]),this.$={id:t[c-1],descr:t[c-1],type:a.getType(t[c-2],t[c])};break;case 28:this.$={id:t[c],descr:t[c],type:0};break;case 29:a.getLogger().trace("node found ..",t[c-3]),this.$={id:t[c-3],descr:t[c-1],type:a.getType(t[c-2],t[c])};break;case 30:this.$=t[c-1]+t[c];break;case 31:this.$=t[c];break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:u},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:u},{6:p,7:[1,10],9:9,12:11,13:r,14:14,16:d,17:_,18:17,19:18,20:y,23:l},e(D,[2,3]),{1:[2,2]},e(D,[2,4]),e(D,[2,5]),{1:[2,6],6:p,12:21,13:r,14:14,16:d,17:_,18:17,19:18,20:y,23:l},{6:p,9:22,12:11,13:r,14:14,16:d,17:_,18:17,19:18,20:y,23:l},{6:I,7:g,10:23,11:w},e(m,[2,24],{18:17,19:18,14:27,16:[1,28],17:[1,29],20:y,23:l}),e(m,[2,19]),e(m,[2,21],{15:30,24:U}),e(m,[2,22]),e(m,[2,23]),e(N,[2,25]),e(N,[2,26]),e(N,[2,28],{20:[1,32]}),{21:[1,33]},{6:I,7:g,10:34,11:w},{1:[2,7],6:p,12:21,13:r,14:14,16:d,17:_,18:17,19:18,20:y,23:l},e(j,[2,14],{7:k,11:A}),e(L,[2,8]),e(L,[2,9]),e(L,[2,10]),e(m,[2,16],{15:37,24:U}),e(m,[2,17]),e(m,[2,18]),e(m,[2,20],{24:H}),e(N,[2,31]),{21:[1,39]},{22:[1,40]},e(j,[2,13],{7:k,11:A}),e(L,[2,11]),e(L,[2,12]),e(m,[2,15],{24:H}),e(N,[2,30]),{22:[1,41]},e(N,[2,27]),e(N,[2,29])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(i,n){if(n.recoverable)this.trace(i);else{var s=new Error(i);throw s.hash=n,s}},"parseError"),parse:o(function(i){var n=this,s=[0],a=[],h=[null],t=[],R=this.table,c="",z=0,oe=0,ce=0,Ne=2,le=1,xe=t.slice.call(arguments,1),b=Object.create(this.lexer),P={yy:{}};for(var q in this.yy)Object.prototype.hasOwnProperty.call(this.yy,q)&&(P.yy[q]=this.yy[q]);b.setInput(i,P.yy),P.yy.lexer=b,P.yy.parser=this,typeof b.yylloc>"u"&&(b.yylloc={});var Q=b.yylloc;t.push(Q);var ve=b.options&&b.options.ranges;typeof P.yy.parseError=="function"?this.parseError=P.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function De(S){s.length=s.length-2*S,h.length=h.length-S,t.length=t.length-S}o(De,"popStack");function he(){var S;return S=a.pop()||b.lex()||le,typeof S!="number"&&(S instanceof Array&&(a=S,S=a.pop()),S=n.symbols_[S]||S),S}o(he,"lex");for(var E,Z,V,x,ze,$,G={},X,C,ue,K;;){if(V=s[s.length-1],this.defaultActions[V]?x=this.defaultActions[V]:((E===null||typeof E>"u")&&(E=he()),x=R[V]&&R[V][E]),typeof x>"u"||!x.length||!x[0]){var ee="";K=[];for(X in R[V])this.terminals_[X]&&X>Ne&&K.push("'"+this.terminals_[X]+"'");b.showPosition?ee="Parse error on line "+(z+1)+`: -`+b.showPosition()+` -Expecting `+K.join(", ")+", got '"+(this.terminals_[E]||E)+"'":ee="Parse error on line "+(z+1)+": Unexpected "+(E==le?"end of input":"'"+(this.terminals_[E]||E)+"'"),this.parseError(ee,{text:b.match,token:this.terminals_[E]||E,line:b.yylineno,loc:Q,expected:K})}if(x[0]instanceof Array&&x.length>1)throw new Error("Parse Error: multiple actions possible at state: "+V+", token: "+E);switch(x[0]){case 1:s.push(E),h.push(b.yytext),t.push(b.yylloc),s.push(x[1]),E=null,Z?(E=Z,Z=null):(oe=b.yyleng,c=b.yytext,z=b.yylineno,Q=b.yylloc,ce>0&&ce--);break;case 2:if(C=this.productions_[x[1]][1],G.$=h[h.length-C],G._$={first_line:t[t.length-(C||1)].first_line,last_line:t[t.length-1].last_line,first_column:t[t.length-(C||1)].first_column,last_column:t[t.length-1].last_column},ve&&(G._$.range=[t[t.length-(C||1)].range[0],t[t.length-1].range[1]]),$=this.performAction.apply(G,[c,oe,z,P.yy,x[1],h,t].concat(xe)),typeof $<"u")return $;C&&(s=s.slice(0,-1*C*2),h=h.slice(0,-1*C),t=t.slice(0,-1*C)),s.push(this.productions_[x[1]][0]),h.push(G.$),t.push(G._$),ue=R[s[s.length-2]][s[s.length-1]],s.push(ue);break;case 3:return!0}}return!0},"parse")},J=(function(){var O={EOF:1,parseError:o(function(n,s){if(this.yy.parser)this.yy.parser.parseError(n,s);else throw new Error(n)},"parseError"),setInput:o(function(i,n){return this.yy=n||this.yy||{},this._input=i,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var i=this._input[0];this.yytext+=i,this.yyleng++,this.offset++,this.match+=i,this.matched+=i;var n=i.match(/(?:\r\n?|\n).*/g);return n?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),i},"input"),unput:o(function(i){var n=i.length,s=i.split(/(?:\r\n?|\n)/g);this._input=i+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-n),this.offset-=n;var a=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),s.length-1&&(this.yylineno-=s.length-1);var h=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:s?(s.length===a.length?this.yylloc.first_column:0)+a[a.length-s.length].length-s[0].length:this.yylloc.first_column-n},this.options.ranges&&(this.yylloc.range=[h[0],h[0]+this.yyleng-n]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(i){this.unput(this.match.slice(i))},"less"),pastInput:o(function(){var i=this.matched.substr(0,this.matched.length-this.match.length);return(i.length>20?"...":"")+i.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var i=this.match;return i.length<20&&(i+=this._input.substr(0,20-i.length)),(i.substr(0,20)+(i.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var i=this.pastInput(),n=new Array(i.length+1).join("-");return i+this.upcomingInput()+` -`+n+"^"},"showPosition"),test_match:o(function(i,n){var s,a,h;if(this.options.backtrack_lexer&&(h={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(h.yylloc.range=this.yylloc.range.slice(0))),a=i[0].match(/(?:\r\n?|\n).*/g),a&&(this.yylineno+=a.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:a?a[a.length-1].length-a[a.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+i[0].length},this.yytext+=i[0],this.match+=i[0],this.matches=i,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(i[0].length),this.matched+=i[0],s=this.performAction.call(this,this.yy,this,n,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),s)return s;if(this._backtrack){for(var t in h)this[t]=h[t];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var i,n,s,a;this._more||(this.yytext="",this.match="");for(var h=this._currentRules(),t=0;tn[0].length)){if(n=s,a=t,this.options.backtrack_lexer){if(i=this.test_match(s,h[t]),i!==!1)return i;if(this._backtrack){n=!1;continue}else return!1}else if(!this.options.flex)break}return n?(i=this.test_match(n,h[a]),i!==!1?i:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var n=this.next();return n||this.lex()},"lex"),begin:o(function(n){this.conditionStack.push(n)},"begin"),popState:o(function(){var n=this.conditionStack.length-1;return n>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(n){return n=this.conditionStack.length-1-Math.abs(n||0),n>=0?this.conditionStack[n]:"INITIAL"},"topState"),pushState:o(function(n){this.begin(n)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(n,s,a,h){var t=h;switch(a){case 0:return this.pushState("shapeData"),s.yytext="",24;break;case 1:return this.pushState("shapeDataStr"),24;break;case 2:return this.popState(),24;break;case 3:let R=/\n\s*/g;return s.yytext=s.yytext.replace(R,"
"),24;break;case 4:return 24;case 5:this.popState();break;case 6:return n.getLogger().trace("Found comment",s.yytext),6;break;case 7:return 8;case 8:this.begin("CLASS");break;case 9:return this.popState(),17;break;case 10:this.popState();break;case 11:n.getLogger().trace("Begin icon"),this.begin("ICON");break;case 12:return n.getLogger().trace("SPACELINE"),6;break;case 13:return 7;case 14:return 16;case 15:n.getLogger().trace("end icon"),this.popState();break;case 16:return n.getLogger().trace("Exploding node"),this.begin("NODE"),20;break;case 17:return n.getLogger().trace("Cloud"),this.begin("NODE"),20;break;case 18:return n.getLogger().trace("Explosion Bang"),this.begin("NODE"),20;break;case 19:return n.getLogger().trace("Cloud Bang"),this.begin("NODE"),20;break;case 20:return this.begin("NODE"),20;break;case 21:return this.begin("NODE"),20;break;case 22:return this.begin("NODE"),20;break;case 23:return this.begin("NODE"),20;break;case 24:return 13;case 25:return 23;case 26:return 11;case 27:this.begin("NSTR2");break;case 28:return"NODE_DESCR";case 29:this.popState();break;case 30:n.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 31:return n.getLogger().trace("description:",s.yytext),"NODE_DESCR";break;case 32:this.popState();break;case 33:return this.popState(),n.getLogger().trace("node end ))"),"NODE_DEND";break;case 34:return this.popState(),n.getLogger().trace("node end )"),"NODE_DEND";break;case 35:return this.popState(),n.getLogger().trace("node end ...",s.yytext),"NODE_DEND";break;case 36:return this.popState(),n.getLogger().trace("node end (("),"NODE_DEND";break;case 37:return this.popState(),n.getLogger().trace("node end (-"),"NODE_DEND";break;case 38:return this.popState(),n.getLogger().trace("node end (-"),"NODE_DEND";break;case 39:return this.popState(),n.getLogger().trace("node end (("),"NODE_DEND";break;case 40:return this.popState(),n.getLogger().trace("node end (("),"NODE_DEND";break;case 41:return n.getLogger().trace("Long description:",s.yytext),21;break;case 42:return n.getLogger().trace("Long description:",s.yytext),21;break}},"anonymous"),rules:[/^(?:@\{)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^\"]+)/i,/^(?:[^}^"]+)/i,/^(?:\})/i,/^(?:\s*%%.*)/i,/^(?:kanban\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}@]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{shapeDataEndBracket:{rules:[],inclusive:!1},shapeDataStr:{rules:[2,3],inclusive:!1},shapeData:{rules:[1,4,5],inclusive:!1},CLASS:{rules:[9,10],inclusive:!1},ICON:{rules:[14,15],inclusive:!1},NSTR2:{rules:[28,29],inclusive:!1},NSTR:{rules:[31,32],inclusive:!1},NODE:{rules:[27,30,33,34,35,36,37,38,39,40,41,42],inclusive:!1},INITIAL:{rules:[0,6,7,8,11,12,13,16,17,18,19,20,21,22,23,24,25,26],inclusive:!0}}};return O})();T.lexer=J;function F(){this.yy={}}return o(F,"Parser"),F.prototype=T,T.Parser=F,new F})();ie.parser=ie;var Le=ie,v=[],se=[],re=0,ae={},Oe=o(()=>{v=[],se=[],re=0,ae={}},"clear"),Ie=o(e=>{if(v.length===0)return null;let u=v[0].level,p=null;for(let r=v.length-1;r>=0;r--)if(v[r].level===u&&!p&&(p=v[r]),v[r].levell.parentId===d.id);for(let l of y){let D={id:l.id,parentId:d.id,label:B(l.label??"",r),labelType:"markdown",isGroup:!1,ticket:l?.ticket,priority:l?.priority,assigned:l?.assigned,icon:l?.icon,shape:"kanbanItem",level:l.level,rx:5,ry:5,cssStyles:["text-align: left"]};u.push(D)}}return{nodes:u,edges:e,other:{},config:M()}},"getData"),we=o((e,u,p,r,d)=>{let _=M(),y=_.mindmap?.padding??W.mindmap.padding;switch(r){case f.ROUNDED_RECT:case f.RECT:case f.HEXAGON:y*=2}let l={id:B(u,_)||"kbn"+re++,level:e,label:B(p,_),width:_.mindmap?.maxNodeWidth??W.mindmap.maxNodeWidth,padding:y,isGroup:!1};if(d!==void 0){let I;d.includes(` -`)?I=d+` -`:I=`{ -`+d+` -}`;let g=ye(I,{schema:be});if(g.shape&&(g.shape!==g.shape.toLowerCase()||g.shape.includes("_")))throw new Error(`No such shape: ${g.shape}. Shape names should be lowercase.`);g?.shape&&g.shape==="kanbanItem"&&(l.shape=g?.shape),g?.label&&(l.label=g?.label),g?.icon&&(l.icon=g?.icon.toString()),g?.assigned&&(l.assigned=g?.assigned.toString()),g?.ticket&&(l.ticket=g?.ticket.toString()),g?.priority&&(l.priority=g?.priority)}let D=Ie(e);D?l.parentId=D.id||"kbn"+re++:se.push(l),v.push(l)},"addNode"),f={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},Ae=o((e,u)=>{switch(Y.debug("In get type",e,u),e){case"[":return f.RECT;case"(":return u===")"?f.ROUNDED_RECT:f.CLOUD;case"((":return f.CIRCLE;case")":return f.CLOUD;case"))":return f.BANG;case"{{":return f.HEXAGON;default:return f.DEFAULT}},"getType"),Te=o((e,u)=>{ae[e]=u},"setElementForId"),Re=o(e=>{if(!e)return;let u=M(),p=v[v.length-1];e.icon&&(p.icon=B(e.icon,u)),e.class&&(p.cssClasses=B(e.class,u))},"decorateNode"),Pe=o(e=>{switch(e){case f.DEFAULT:return"no-border";case f.RECT:return"rect";case f.ROUNDED_RECT:return"rounded-rect";case f.CIRCLE:return"circle";case f.CLOUD:return"cloud";case f.BANG:return"bang";case f.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),Ve=o(()=>Y,"getLogger"),Be=o(e=>ae[e],"getElementById"),je={clear:Oe,addNode:we,getSections:Se,getData:Ce,nodeType:f,getType:Ae,setElementForId:Te,decorateNode:Re,type2Str:Pe,getLogger:Ve,getElementById:Be},Fe=je,Ge=o((e,u,p,r)=>ge(null,null,function*(){Y.debug(`Rendering kanban diagram -`+e);let _=r.db.getData(),y=M();y.htmlLabels=!1;let l=fe(u),D=l.append("g");D.attr("class","sections");let I=l.append("g");I.attr("class","items");let g=_.nodes.filter(k=>k.isGroup),w=0,m=10,U=[],N=25;for(let k of g){let A=y?.kanban?.sectionWidth||200;w=w+1,k.x=A*w+(w-1)*m/2,k.width=A,k.y=0,k.height=A*3,k.rx=5,k.ry=5,k.cssClasses=k.cssClasses+" section-"+w;let L=yield ke(D,k);N=Math.max(N,L?.labelBBox?.height),U.push(L)}let j=0;for(let k of g){let A=U[j];j=j+1;let L=y?.kanban?.sectionWidth||200,H=-L*3/2+N,T=H,J=_.nodes.filter(i=>i.parentId===k.id);for(let i of J){if(i.isGroup)throw new Error("Groups within groups are not allowed in Kanban diagrams");i.x=k.x,i.width=L-1.5*m;let s=(yield me(I,i,{config:y})).node().getBBox();i.y=T+s.height/2,yield Ee(i),T=i.y+s.height/2+m/2}let F=A.cluster.select("rect"),O=Math.max(T-H+3*m,50)+(N-25);F.attr("height",O)}pe(void 0,l,y.mindmap?.padding??W.kanban.padding,y.mindmap?.useMaxWidth??W.kanban.useMaxWidth)}),"draw"),Me={draw:Ge},Ue=o(e=>{let u="";for(let r=0;re.darkMode?ne(r,d):te(r,d),"adjuster");for(let r=0;r` - .edge { - stroke-width: 3; - } - ${Ue(e)} - .section-root rect, .section-root path, .section-root circle, .section-root polygon { - fill: ${e.git0}; - } - .section-root text { - fill: ${e.gitBranchLabel0}; - } - .icon-container { - height:100%; - display: flex; - justify-content: center; - align-items: center; - } - .edge { - fill: none; - } - .cluster-label, .label { - color: ${e.textColor}; - fill: ${e.textColor}; - } - .kanban-label { - dy: 1em; - alignment-baseline: middle; - text-anchor: middle; - dominant-baseline: middle; - text-align: center; - } - ${_e()} -`,"getStyles"),We=He,it={db:Fe,renderer:Me,parser:Le,styles:We};export{it as diagram}; diff --git a/src/google/adk/cli/browser/chunk-75WMU75S.js b/src/google/adk/cli/browser/chunk-75WMU75S.js deleted file mode 100644 index 38b07a71e3..0000000000 --- a/src/google/adk/cli/browser/chunk-75WMU75S.js +++ /dev/null @@ -1 +0,0 @@ -import{a as i,b as e,c as o,d as a}from"./chunk-TIJO3EOA.js";import"./chunk-B2DSW4QB.js";import"./chunk-NMKTPNXE.js";import"./chunk-APNCZOFE.js";import"./chunk-ST54LLJ3.js";import"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import"./chunk-QFMJV7VH.js";import{g as t}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";var y={parser:i,get db(){return new e},renderer:a,styles:o,init:t(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{y as diagram}; diff --git a/src/google/adk/cli/browser/chunk-URGIGLGR.js b/src/google/adk/cli/browser/chunk-7P7JIWGK.js similarity index 89% rename from src/google/adk/cli/browser/chunk-URGIGLGR.js rename to src/google/adk/cli/browser/chunk-7P7JIWGK.js index 3440b4a67a..816c525ea5 100644 --- a/src/google/adk/cli/browser/chunk-URGIGLGR.js +++ b/src/google/adk/cli/browser/chunk-7P7JIWGK.js @@ -1 +1 @@ -import{$a as m,Bb as g,Ca as a,Cb as p,Cc as r,Db as v,Ib as h,Lb as f,Ma as l,Nc as D,Pa as o,Yb as y,Zb as x,eb as d,fc as M,gc as b,hc as C,pd as I,qb as c,sb as u,wc as s}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function H(t,U){if(t&1&&(g(0,"section"),v(1,"img",1),p()),t&2){let e=f(),i=C(0);y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Image),x(e.classes()),o(),h("src",i,l)}}var w=(()=>{class t extends I{url=r.required();usageHint=r.required();resolvedUrl=s(()=>this.resolvePrimitive(this.url()));classes=s(()=>{let e=this.usageHint();return D.merge(this.theme.components.Image.all,e?this.theme.components.Image[e]:{})});static \u0275fac=(()=>{let e;return function(n){return(e||(e=a(t)))(n||t)}})();static \u0275cmp=m({type:t,selectors:[["a2ui-image"]],inputs:{url:[1,"url"],usageHint:[1,"usageHint"]},features:[d],decls:2,vars:2,consts:[[3,"class","style"],[3,"src"]],template:function(i,n){if(i&1&&(M(0),c(1,H,2,5,"section",0)),i&2){let _=b(n.resolvedUrl());o(),u(_?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}img[_ngcontent-%COMP%]{display:block;width:100%;height:100%;box-sizing:border-box}"]})}return t})();export{w as Image}; +import{$a as m,Bb as g,Ca as a,Cb as p,Cc as r,Db as v,Ib as h,Lb as f,Ma as l,Nc as D,Pa as o,Yb as y,Zb as x,eb as d,fc as M,gc as b,hc as C,pd as I,qb as c,sb as u,wc as s}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function H(t,U){if(t&1&&(g(0,"section"),v(1,"img",1),p()),t&2){let e=f(),i=C(0);y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Image),x(e.classes()),o(),h("src",i,l)}}var w=(()=>{class t extends I{url=r.required();usageHint=r.required();resolvedUrl=s(()=>this.resolvePrimitive(this.url()));classes=s(()=>{let e=this.usageHint();return D.merge(this.theme.components.Image.all,e?this.theme.components.Image[e]:{})});static \u0275fac=(()=>{let e;return function(n){return(e||(e=a(t)))(n||t)}})();static \u0275cmp=m({type:t,selectors:[["a2ui-image"]],inputs:{url:[1,"url"],usageHint:[1,"usageHint"]},features:[d],decls:2,vars:2,consts:[[3,"class","style"],[3,"src"]],template:function(i,n){if(i&1&&(M(0),c(1,H,2,5,"section",0)),i&2){let _=b(n.resolvedUrl());o(),u(_?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}img[_ngcontent-%COMP%]{display:block;width:100%;height:100%;box-sizing:border-box}"]})}return t})();export{w as Image}; diff --git a/src/google/adk/cli/browser/chunk-7UW26RYS.js b/src/google/adk/cli/browser/chunk-7UW26RYS.js deleted file mode 100644 index b1e248b6c7..0000000000 --- a/src/google/adk/cli/browser/chunk-7UW26RYS.js +++ /dev/null @@ -1 +0,0 @@ -import{a as e,b as r}from"./chunk-XULIXUQL.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{e as TreemapModule,r as createTreemapServices}; diff --git a/src/google/adk/cli/browser/chunk-SXB5AC5V.js b/src/google/adk/cli/browser/chunk-A2SOFJNC.js similarity index 95% rename from src/google/adk/cli/browser/chunk-SXB5AC5V.js rename to src/google/adk/cli/browser/chunk-A2SOFJNC.js index 8514b7fc0f..b63c9780bf 100644 --- a/src/google/adk/cli/browser/chunk-SXB5AC5V.js +++ b/src/google/adk/cli/browser/chunk-A2SOFJNC.js @@ -1 +1 @@ -import{$a as p,$b as b,Bb as l,Ca as m,Cb as r,Cc as c,Ib as d,Kb as h,Pa as o,Yb as v,Zb as a,_b as g,eb as u,pd as f,wc as s}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var E=(()=>{class i extends f{value=c.required();label=c.required();inputChecked=s(()=>super.resolvePrimitive(this.value())??!1);resolvedLabel=s(()=>super.resolvePrimitive(this.label()));inputId=super.getUniqueId("a2ui-checkbox");handleChange(t){let n=this.value()?.path;!(t.target instanceof HTMLInputElement)||!n||this.processor.setData(this.component(),n,t.target.checked,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(i)))(e||i)}})();static \u0275cmp=p({type:i,selectors:[["a2ui-checkbox"]],inputs:{value:[1,"value"],label:[1,"label"]},features:[u],decls:4,vars:12,consts:[["autocomplete","off","type","checkbox",3,"change","id","checked"],[3,"htmlFor"]],template:function(n,e){n&1&&(l(0,"section")(1,"input",0),h("change",function(k){return e.handleChange(k)}),r(),l(2,"label",1),g(3),r()()),n&2&&(v(e.theme.additionalStyles==null?null:e.theme.additionalStyles.CheckBox),a(e.theme.components.CheckBox.container),o(),a(e.theme.components.CheckBox.element),d("id",e.inputId)("checked",e.inputChecked()),o(),a(e.theme.components.CheckBox.label),d("htmlFor",e.inputId),o(),b(e.resolvedLabel()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}input[_ngcontent-%COMP%]{display:block;width:100%}"]})}return i})();export{E as Checkbox}; +import{$a as p,$b as b,Bb as l,Ca as m,Cb as r,Cc as c,Ib as d,Kb as h,Pa as o,Yb as v,Zb as a,_b as g,eb as u,pd as f,wc as s}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var E=(()=>{class i extends f{value=c.required();label=c.required();inputChecked=s(()=>super.resolvePrimitive(this.value())??!1);resolvedLabel=s(()=>super.resolvePrimitive(this.label()));inputId=super.getUniqueId("a2ui-checkbox");handleChange(t){let n=this.value()?.path;!(t.target instanceof HTMLInputElement)||!n||this.processor.setData(this.component(),n,t.target.checked,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(i)))(e||i)}})();static \u0275cmp=p({type:i,selectors:[["a2ui-checkbox"]],inputs:{value:[1,"value"],label:[1,"label"]},features:[u],decls:4,vars:12,consts:[["autocomplete","off","type","checkbox",3,"change","id","checked"],[3,"htmlFor"]],template:function(n,e){n&1&&(l(0,"section")(1,"input",0),h("change",function(k){return e.handleChange(k)}),r(),l(2,"label",1),g(3),r()()),n&2&&(v(e.theme.additionalStyles==null?null:e.theme.additionalStyles.CheckBox),a(e.theme.components.CheckBox.container),o(),a(e.theme.components.CheckBox.element),d("id",e.inputId)("checked",e.inputChecked()),o(),a(e.theme.components.CheckBox.label),d("htmlFor",e.inputId),o(),b(e.resolvedLabel()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}input[_ngcontent-%COMP%]{display:block;width:100%}"]})}return i})();export{E as Checkbox}; diff --git a/src/google/adk/cli/browser/chunk-APNCZOFE.js b/src/google/adk/cli/browser/chunk-APNCZOFE.js deleted file mode 100644 index 442fbb8e79..0000000000 --- a/src/google/adk/cli/browser/chunk-APNCZOFE.js +++ /dev/null @@ -1 +0,0 @@ -import{a as o,g as m}from"./chunk-JRNAXTJ7.js";var g=m((t,e)=>{let n;return e==="sandbox"&&(n=o("#i"+t)),(e==="sandbox"?o(n.nodes()[0].contentDocument.body):o("body")).select(`[id="${t}"]`)},"getDiagramElement");export{g as a}; diff --git a/src/google/adk/cli/browser/chunk-ASJUXEUE.js b/src/google/adk/cli/browser/chunk-ASJUXEUE.js deleted file mode 100644 index 72d655ef2f..0000000000 --- a/src/google/adk/cli/browser/chunk-ASJUXEUE.js +++ /dev/null @@ -1 +0,0 @@ -import{A as fr,B as rr,C as D,D as q,E as Lr,F as wt,G as Et,H as W,I as Cr,J as Pt,K as Rt,L as Mt,M as $,N as Lt,O as ut,P as _r,Q as Ct,R as _t,S as Ft,T as Fr,U as Or,a as B,b as M,c as K,d as w,e as p,f as E,g as C,i as V,j as k,k as At,m as vt,n as Pr,o as Rr,p as Mr,q as Z,r as N,s as Ot,t as z,u as Tt,v as T,w as _,x as St,y as or,z as It}from"./chunk-EGBSMT36.js";function _o(r,t){for(var e=-1,o=r==null?0:r.length;++e2?t[2]:void 0;for(f&&_(t[0],t[1],f)&&(o=1);++ei))return!1;var u=a.get(r),s=a.get(t);if(u&&s)return u==t&&s==r;var l=-1,d=!0,A=e&Na?new sr:void 0;for(a.set(r,t),a.set(t,r);++lt}var Be=ni;function ii(r){return r&&r.length?cr(r,C,Be):void 0}var mi=ii;function ui(r,t,e,o){if(!E(r))return r;t=J(t,r);for(var f=-1,a=t.length,n=a-1,i=r;i!=null&&++f0&&e(i)?t>1?Ue(i,t-1,e,o,f):mr(f,i):o||(f[f.length]=i)}return f}var j=Ue;function di(r){var t=r==null?0:r.length;return t?j(r,1):[]}var xt=di;function xi(r){return vt(Ot(r,void 0,xt),r+"")}var je=xi;var gi=je(function(r,t){return r==null?{}:De(r,t)}),ci=gi;function bi(r,t,e,o){var f=-1,a=r==null?0:r.length;for(o&&a&&(e=r[++f]);++f-1}var at=Ii;function wi(r,t,e){for(var o=-1,f=r==null?0:r.length;++o=Mi){var u=t?null:ke(r);if(u)return dr(u);n=!1,f=lr,m=new sr}else m=t?[]:i;r:for(;++of?0:f+t),e=e>f?f:e,e<0&&(e+=f),f=t>e?0:e-t>>>0,t>>>=0;for(var a=Array(f);++o=t||Y<0||l&&vr>=a}function b(){var h=Ir();if(c(h))return F(h);i=setTimeout(b,O(h))}function F(h){return i=void 0,d&&o?A(h):(o=f=void 0,n)}function Er(){i!==void 0&&clearTimeout(i),u=0,o=m=f=i=void 0}function er(){return i===void 0?n:F(Ir())}function H(){var h=Ir(),Y=c(h);if(o=arguments,f=this,m=h,Y){if(i===void 0)return v(m);if(l)return clearTimeout(i),i=setTimeout(b,t),A(m)}return i===void 0&&(i=setTimeout(b,t)),n}return H.cancel=Er,H.flush=er,H}var Sm=Tm;var Im=200;function wm(r,t,e,o){var f=-1,a=at,n=!0,i=r.length,m=[],u=t.length;if(!i)return m;e&&(t=I(t,D(e))),o?(a=nt,n=!1):t.length>=Im&&(a=lr,n=!1,t=new sr(t));r:for(;++f-1?f[a?t[n]:n]:void 0}}var io=qm;var Hm=Math.max;function Ym(r,t,e){var o=r==null?0:r.length;if(!o)return-1;var f=e==null?0:L(e);return f<0&&(f=Hm(o+f,0)),ft(r,x(t,3),f)}var mo=Ym;var km=io(mo),Zm=km;function zm(r){return r&&r.length?r[0]:void 0}var uo=zm;function $m(r,t){return j(lt(r,t),1)}var Xm=$m;function Jm(r,t){return r==null?r:Fr(r,G(t),W)}var Qm=Jm;function Vm(r,t){return r&&pr(r,G(t))}var ru=Vm;var tu=Object.prototype,eu=tu.hasOwnProperty,ou=it(function(r,t,e){eu.call(r,e)?r[e].push(t):Rr(r,e,[t])}),fu=ou;var au=Object.prototype,nu=au.hasOwnProperty;function iu(r,t){return r!=null&&nu.call(r,t)}var po=iu;function mu(r,t){return r!=null&&Vr(r,t,po)}var uu=mu;var pu="[object String]";function su(r){return typeof r=="string"||!p(r)&&w(r)&&K(r)==pu}var wr=su;var lu=Math.max;function du(r,t,e,o){r=T(r)?r:dt(r),e=e&&!o?L(e):0;var f=r.length;return e<0&&(e=lu(f+e,0)),wr(r)?e<=f&&r.indexOf(t,e)>-1:!!f&&br(r,t,e)>-1}var xu=du;var gu=Math.max;function cu(r,t,e){var o=r==null?0:r.length;if(!o)return-1;var f=e==null?0:L(e);return f<0&&(f=gu(o+f,0)),br(r,t,f)}var bu=cu;function hu(r){var t=r==null?0:r.length;return t?Ar(r,0,-1):[]}var yu=hu;function Au(r,t){return xr(r,t)}var vu=Au;var Ou="[object RegExp]";function Tu(r){return w(r)&&K(r)==Ou}var so=Tu;var lo=q&&q.isRegExp,Su=lo?D(lo):so,Iu=Su;function wu(r,t){return rt||a&&n&&m&&!i&&!u||o&&n&&m||!e&&m||!f)return 1;if(!o&&!a&&!u&&r=i)return m;var u=e[o];return m*(u=="desc"?-1:1)}}return r.index-t.index}var bo=Du;function Wu(r,t,e){t.length?t=I(t,function(a){return p(a)?function(n){return Q(n,a.length===1?a[0]:a)}:a}):t=[C];var o=-1;t=I(t,D(x));var f=et(r,function(a,n,i){var m=I(t,function(u){return u(a)});return{criteria:m,index:++o,value:a}});return go(f,function(a,n){return bo(a,n,e)})}var ho=Wu;var Gu=tt("length"),yo=Gu;var vo="\\ud800-\\udfff",Uu="\\u0300-\\u036f",ju="\\ufe20-\\ufe2f",Ku="\\u20d0-\\u20ff",qu=Uu+ju+Ku,Hu="\\ufe0e\\ufe0f",Yu="["+vo+"]",ct="["+qu+"]",bt="\\ud83c[\\udffb-\\udfff]",ku="(?:"+ct+"|"+bt+")",Oo="[^"+vo+"]",To="(?:\\ud83c[\\udde6-\\uddff]){2}",So="[\\ud800-\\udbff][\\udc00-\\udfff]",Zu="\\u200d",Io=ku+"?",wo="["+Hu+"]?",zu="(?:"+Zu+"(?:"+[Oo,To,So].join("|")+")"+wo+Io+")*",$u=wo+Io+zu,Xu="(?:"+[Oo+ct+"?",ct,To,So,Yu].join("|")+")",Ao=RegExp(bt+"(?="+bt+")|"+Xu+$u,"g");function Ju(r){for(var t=Ao.lastIndex=0;Ao.test(r);)++t;return t}var Eo=Ju;function Qu(r){return Je(r)?Eo(r):yo(r)}var Po=Qu;var Vu=it(function(r,t,e){r[e?0:1].push(t)},function(){return[[],[]]}),rp=Vu;var tp=Math.ceil,ep=Math.max;function op(r,t,e,o){for(var f=-1,a=ep(tp((t-r)/(e||1)),0),n=Array(a);a--;)n[o?a:++f]=r,r+=e;return n}var Ro=op;function fp(r){return function(t,e,o){return o&&typeof o!="number"&&_(t,e,o)&&(e=o=void 0),t=yr(t),e===void 0?(e=t,t=0):e=yr(e),o=o===void 0?t1&&_(r,t[0],t[1])?t=[]:e>2&&_(t[0],t[1],t[2])&&(t=[t[0]]),ho(r,j(t,1),[])}),bp=cp;var hp=9007199254740991,ht=4294967295,yp=Math.min;function Ap(r,t){if(r=L(r),r<1||r>hp)return[];var e=ht,o=yp(r,ht);t=G(t),r-=ht;for(var f=It(o,t);++e` - /* Font Awesome icon styling - consolidated */ - .label-icon { - display: inline-block; - height: 1em; - overflow: visible; - vertical-align: -0.125em; - } - - .node .label-icon path { - fill: currentColor; - stroke: revert; - stroke-width: revert; - } -`,"getIconStyles");export{l as a}; diff --git a/src/google/adk/cli/browser/chunk-BDIW4D5I.js b/src/google/adk/cli/browser/chunk-BDIW4D5I.js deleted file mode 100644 index 0dbe5bd4a3..0000000000 --- a/src/google/adk/cli/browser/chunk-BDIW4D5I.js +++ /dev/null @@ -1,65 +0,0 @@ -import{a as re}from"./chunk-DMWOYWYQ.js";import{a as se}from"./chunk-T3Q3QCCV.js";import{a as ae}from"./chunk-4R6SYGKS.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{f as Q,l as ee,m as te}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as j,M as C,R as F,S as K,T as Y,U as Z,V as U,W as V,X as J,aa as X,r as z}from"./chunk-QFMJV7VH.js";import{a as S,g as l,i as u}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as I,b as _,j as N}from"./chunk-RMXJBC7V.js";var x={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4},me=z.gitGraph,M=l(()=>ee(I(I({},me),j().gitGraph)),"getConfig"),n=new ae(()=>{let r=M(),e=r.mainBranchName,a=r.mainBranchOrder;return{mainBranchName:e,commits:new Map,head:null,branchConfig:new Map([[e,{name:e,order:a}]]),branches:new Map([[e,null]]),currBranch:e,direction:"LR",seq:0,options:{}}});function A(){return Q({length:7})}l(A,"getID");function ce(r,e){let a=Object.create(null);return r.reduce((o,t)=>{let s=e(t);return a[s]||(a[s]=!0,o.push(t)),o},[])}l(ce,"uniqBy");var pe=l(function(r){n.records.direction=r},"setDirection"),ge=l(function(r){u.debug("options str",r),r=r?.trim(),r=r||"{}";try{n.records.options=JSON.parse(r)}catch(e){u.error("error while parsing gitGraph options",e.message)}},"setOptions"),fe=l(function(){return n.records.options},"getOptions"),ye=l(function(r){let e=r.msg,a=r.id,o=r.type,t=r.tags;u.info("commit",e,a,o,t),u.debug("Entering commit:",e,a,o,t);let s=M();a=C.sanitizeText(a,s),e=C.sanitizeText(e,s),t=t?.map(d=>C.sanitizeText(d,s));let h={id:a||n.records.seq+"-"+A(),message:e,seq:n.records.seq++,type:o??x.NORMAL,tags:t??[],parents:n.records.head==null?[]:[n.records.head.id],branch:n.records.currBranch};n.records.head=h,u.info("main branch",s.mainBranchName),n.records.commits.has(h.id)&&u.warn(`Commit ID ${h.id} already exists`),n.records.commits.set(h.id,h),n.records.branches.set(n.records.currBranch,h.id),u.debug("in pushCommit "+h.id)},"commit"),$e=l(function(r){let e=r.name,a=r.order;if(e=C.sanitizeText(e,M()),n.records.branches.has(e))throw new Error(`Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout ${e}")`);n.records.branches.set(e,n.records.head!=null?n.records.head.id:null),n.records.branchConfig.set(e,{name:e,order:a}),ne(e),u.debug("in createBranch")},"branch"),xe=l(r=>{let e=r.branch,a=r.id,o=r.type,t=r.tags,s=M();e=C.sanitizeText(e,s),a&&(a=C.sanitizeText(a,s));let h=n.records.branches.get(n.records.currBranch),d=n.records.branches.get(e),c=h?n.records.commits.get(h):void 0,m=d?n.records.commits.get(d):void 0;if(c&&m&&c.branch===e)throw new Error(`Cannot merge branch '${e}' into itself.`);if(n.records.currBranch===e){let i=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},i}if(c===void 0||!c){let i=new Error(`Incorrect usage of "merge". Current branch (${n.records.currBranch})has no commits`);throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["commit"]},i}if(!n.records.branches.has(e)){let i=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") does not exist");throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:[`branch ${e}`]},i}if(m===void 0||!m){let i=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") has no commits");throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:['"commit"']},i}if(c===m){let i=new Error('Incorrect usage of "merge". Both branches have same head');throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},i}if(a&&n.records.commits.has(a)){let i=new Error('Incorrect usage of "merge". Commit with id:'+a+" already exists, use different custom id");throw i.hash={text:`merge ${e} ${a} ${o} ${t?.join(" ")}`,token:`merge ${e} ${a} ${o} ${t?.join(" ")}`,expected:[`merge ${e} ${a}_UNIQUE ${o} ${t?.join(" ")}`]},i}let p=d||"",f={id:a||`${n.records.seq}-${A()}`,message:`merged branch ${e} into ${n.records.currBranch}`,seq:n.records.seq++,parents:n.records.head==null?[]:[n.records.head.id,p],branch:n.records.currBranch,type:x.MERGE,customType:o,customId:!!a,tags:t??[]};n.records.head=f,n.records.commits.set(f.id,f),n.records.branches.set(n.records.currBranch,f.id),u.debug(n.records.branches),u.debug("in mergeBranch")},"merge"),ue=l(function(r){let e=r.id,a=r.targetId,o=r.tags,t=r.parent;u.debug("Entering cherryPick:",e,a,o);let s=M();if(e=C.sanitizeText(e,s),a=C.sanitizeText(a,s),o=o?.map(c=>C.sanitizeText(c,s)),t=C.sanitizeText(t,s),!e||!n.records.commits.has(e)){let c=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw c.hash={text:`cherryPick ${e} ${a}`,token:`cherryPick ${e} ${a}`,expected:["cherry-pick abc"]},c}let h=n.records.commits.get(e);if(h===void 0||!h)throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');if(t&&!(Array.isArray(h.parents)&&h.parents.includes(t)))throw new Error("Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.");let d=h.branch;if(h.type===x.MERGE&&!t)throw new Error("Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.");if(!a||!n.records.commits.has(a)){if(d===n.records.currBranch){let f=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw f.hash={text:`cherryPick ${e} ${a}`,token:`cherryPick ${e} ${a}`,expected:["cherry-pick abc"]},f}let c=n.records.branches.get(n.records.currBranch);if(c===void 0||!c){let f=new Error(`Incorrect usage of "cherry-pick". Current branch (${n.records.currBranch})has no commits`);throw f.hash={text:`cherryPick ${e} ${a}`,token:`cherryPick ${e} ${a}`,expected:["cherry-pick abc"]},f}let m=n.records.commits.get(c);if(m===void 0||!m){let f=new Error(`Incorrect usage of "cherry-pick". Current branch (${n.records.currBranch})has no commits`);throw f.hash={text:`cherryPick ${e} ${a}`,token:`cherryPick ${e} ${a}`,expected:["cherry-pick abc"]},f}let p={id:n.records.seq+"-"+A(),message:`cherry-picked ${h?.message} into ${n.records.currBranch}`,seq:n.records.seq++,parents:n.records.head==null?[]:[n.records.head.id,h.id],branch:n.records.currBranch,type:x.CHERRY_PICK,tags:o?o.filter(Boolean):[`cherry-pick:${h.id}${h.type===x.MERGE?`|parent:${t}`:""}`]};n.records.head=p,n.records.commits.set(p.id,p),n.records.branches.set(n.records.currBranch,p.id),u.debug(n.records.branches),u.debug("in cherryPick")}},"cherryPick"),ne=l(function(r){if(r=C.sanitizeText(r,M()),n.records.branches.has(r)){n.records.currBranch=r;let e=n.records.branches.get(n.records.currBranch);e===void 0||!e?n.records.head=null:n.records.head=n.records.commits.get(e)??null}else{let e=new Error(`Trying to checkout branch which is not yet created. (Help try using "branch ${r}")`);throw e.hash={text:`checkout ${r}`,token:`checkout ${r}`,expected:[`branch ${r}`]},e}},"checkout");function W(r,e,a){let o=r.indexOf(e);o===-1?r.push(a):r.splice(o,1,a)}l(W,"upsert");function H(r){let e=r.reduce((t,s)=>t.seq>s.seq?t:s,r[0]),a="";r.forEach(function(t){t===e?a+=" *":a+=" |"});let o=[a,e.id,e.seq];for(let t in n.records.branches)n.records.branches.get(t)===e.id&&o.push(t);if(u.debug(o.join(" ")),e.parents&&e.parents.length==2&&e.parents[0]&&e.parents[1]){let t=n.records.commits.get(e.parents[0]);W(r,e,t),e.parents[1]&&r.push(n.records.commits.get(e.parents[1]))}else{if(e.parents.length==0)return;if(e.parents[0]){let t=n.records.commits.get(e.parents[0]);W(r,e,t)}}r=ce(r,t=>t.id),H(r)}l(H,"prettyPrintCommitHistory");var be=l(function(){u.debug(n.records.commits);let r=ie()[0];H([r])},"prettyPrint"),we=l(function(){n.reset(),F()},"clear"),Ce=l(function(){return[...n.records.branchConfig.values()].map((e,a)=>e.order!==null&&e.order!==void 0?e:_(I({},e),{order:parseFloat(`0.${a}`)})).sort((e,a)=>(e.order??0)-(a.order??0)).map(({name:e})=>({name:e}))},"getBranchesAsObjArray"),Be=l(function(){return n.records.branches},"getBranches"),ve=l(function(){return n.records.commits},"getCommits"),ie=l(function(){let r=[...n.records.commits.values()];return r.forEach(function(e){u.debug(e.id)}),r.sort((e,a)=>e.seq-a.seq),r},"getCommitsArray"),ke=l(function(){return n.records.currBranch},"getCurrentBranch"),Te=l(function(){return n.records.direction},"getDirection"),Ee=l(function(){return n.records.head},"getHead"),de={commitType:x,getConfig:M,setDirection:pe,setOptions:ge,getOptions:fe,commit:ye,branch:$e,merge:xe,cherryPick:ue,checkout:ne,prettyPrint:be,clear:we,getBranchesAsObjArray:Ce,getBranches:Be,getCommits:ve,getCommitsArray:ie,getCurrentBranch:ke,getDirection:Te,getHead:Ee,setAccTitle:K,getAccTitle:Y,getAccDescription:U,setAccDescription:Z,setDiagramTitle:V,getDiagramTitle:J},Le=l((r,e)=>{re(r,e),r.dir&&e.setDirection(r.dir);for(let a of r.statements)Me(a,e)},"populate"),Me=l((r,e)=>{let o={Commit:l(t=>e.commit(Pe(t)),"Commit"),Branch:l(t=>e.branch(Re(t)),"Branch"),Merge:l(t=>e.merge(Oe(t)),"Merge"),Checkout:l(t=>e.checkout(Ie(t)),"Checkout"),CherryPicking:l(t=>e.cherryPick(qe(t)),"CherryPicking")}[r.$type];o?o(r):u.error(`Unknown statement type: ${r.$type}`)},"parseStatement"),Pe=l(r=>({id:r.id,msg:r.message??"",type:r.type!==void 0?x[r.type]:x.NORMAL,tags:r.tags??void 0}),"parseCommit"),Re=l(r=>({name:r.name,order:r.order??0}),"parseBranch"),Oe=l(r=>({branch:r.branch,id:r.id??"",type:r.type!==void 0?x[r.type]:void 0,tags:r.tags??void 0}),"parseMerge"),Ie=l(r=>r.branch,"parseCheckout"),qe=l(r=>({id:r.id,targetId:"",tags:r.tags?.length===0?void 0:r.tags,parent:r.parent}),"parseCherryPicking"),Ge={parse:l(r=>N(null,null,function*(){let e=yield se("gitGraph",r);u.debug(e),Le(e,de)}),"parse")},T=10,E=40,B=4,v=2,L=8,b=new Map,w=new Map,q=30,P=new Map,G=[],k=0,$="LR",Ae=l(()=>{b.clear(),w.clear(),P.clear(),k=0,G=[],$="LR"},"clear"),he=l(r=>{let e=document.createElementNS("http://www.w3.org/2000/svg","text");return(typeof r=="string"?r.split(/\\n|\n|/gi):r).forEach(o=>{let t=document.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),t.setAttribute("dy","1em"),t.setAttribute("x","0"),t.setAttribute("class","row"),t.textContent=o.trim(),e.appendChild(t)}),e},"drawText"),le=l(r=>{let e,a,o;return $==="BT"?(a=l((t,s)=>t<=s,"comparisonFunc"),o=1/0):(a=l((t,s)=>t>=s,"comparisonFunc"),o=0),r.forEach(t=>{let s=$==="TB"||$=="BT"?w.get(t)?.y:w.get(t)?.x;s!==void 0&&a(s,o)&&(e=t,o=s)}),e},"findClosestParent"),De=l(r=>{let e="",a=1/0;return r.forEach(o=>{let t=w.get(o).y;t<=a&&(e=o,a=t)}),e||void 0},"findClosestParentBT"),We=l((r,e,a)=>{let o=a,t=a,s=[];r.forEach(h=>{let d=e.get(h);if(!d)throw new Error(`Commit not found for key ${h}`);d.parents.length?(o=_e(d),t=Math.max(o,t)):s.push(d),Ne(d,o)}),o=t,s.forEach(h=>{Se(h,o,a)}),r.forEach(h=>{let d=e.get(h);if(d?.parents.length){let c=De(d.parents);o=w.get(c).y-E,o<=t&&(t=o);let m=b.get(d.branch).pos,p=o-T;w.set(d.id,{x:m,y:p})}})},"setParallelBTPos"),He=l(r=>{let e=le(r.parents.filter(o=>o!==null));if(!e)throw new Error(`Closest parent not found for commit ${r.id}`);let a=w.get(e)?.y;if(a===void 0)throw new Error(`Closest parent position not found for commit ${r.id}`);return a},"findClosestParentPos"),_e=l(r=>He(r)+E,"calculateCommitPosition"),Ne=l((r,e)=>{let a=b.get(r.branch);if(!a)throw new Error(`Branch not found for commit ${r.id}`);let o=a.pos,t=e+T;return w.set(r.id,{x:o,y:t}),{x:o,y:t}},"setCommitPosition"),Se=l((r,e,a)=>{let o=b.get(r.branch);if(!o)throw new Error(`Branch not found for commit ${r.id}`);let t=e+a,s=o.pos;w.set(r.id,{x:s,y:t})},"setRootPosition"),ze=l((r,e,a,o,t,s)=>{if(s===x.HIGHLIGHT)r.append("rect").attr("x",a.x-10).attr("y",a.y-10).attr("width",20).attr("height",20).attr("class",`commit ${e.id} commit-highlight${t%L} ${o}-outer`),r.append("rect").attr("x",a.x-6).attr("y",a.y-6).attr("width",12).attr("height",12).attr("class",`commit ${e.id} commit${t%L} ${o}-inner`);else if(s===x.CHERRY_PICK)r.append("circle").attr("cx",a.x).attr("cy",a.y).attr("r",10).attr("class",`commit ${e.id} ${o}`),r.append("circle").attr("cx",a.x-3).attr("cy",a.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${o}`),r.append("circle").attr("cx",a.x+3).attr("cy",a.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${o}`),r.append("line").attr("x1",a.x+3).attr("y1",a.y+1).attr("x2",a.x).attr("y2",a.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${o}`),r.append("line").attr("x1",a.x-3).attr("y1",a.y+1).attr("x2",a.x).attr("y2",a.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${o}`);else{let h=r.append("circle");if(h.attr("cx",a.x),h.attr("cy",a.y),h.attr("r",e.type===x.MERGE?9:10),h.attr("class",`commit ${e.id} commit${t%L}`),s===x.MERGE){let d=r.append("circle");d.attr("cx",a.x),d.attr("cy",a.y),d.attr("r",6),d.attr("class",`commit ${o} ${e.id} commit${t%L}`)}s===x.REVERSE&&r.append("path").attr("d",`M ${a.x-5},${a.y-5}L${a.x+5},${a.y+5}M${a.x-5},${a.y+5}L${a.x+5},${a.y-5}`).attr("class",`commit ${o} ${e.id} commit${t%L}`)}},"drawCommitBullet"),je=l((r,e,a,o,t)=>{if(e.type!==x.CHERRY_PICK&&(e.customId&&e.type===x.MERGE||e.type!==x.MERGE)&&t.showCommitLabel){let s=r.append("g"),h=s.insert("rect").attr("class","commit-label-bkg"),d=s.append("text").attr("x",o).attr("y",a.y+25).attr("class","commit-label").text(e.id),c=d.node()?.getBBox();if(c&&(h.attr("x",a.posWithOffset-c.width/2-v).attr("y",a.y+13.5).attr("width",c.width+2*v).attr("height",c.height+2*v),$==="TB"||$==="BT"?(h.attr("x",a.x-(c.width+4*B+5)).attr("y",a.y-12),d.attr("x",a.x-(c.width+4*B)).attr("y",a.y+c.height-12)):d.attr("x",a.posWithOffset-c.width/2),t.rotateCommitLabel))if($==="TB"||$==="BT")d.attr("transform","rotate(-45, "+a.x+", "+a.y+")"),h.attr("transform","rotate(-45, "+a.x+", "+a.y+")");else{let m=-7.5-(c.width+10)/25*9.5,p=10+c.width/25*8.5;s.attr("transform","translate("+m+", "+p+") rotate(-45, "+o+", "+a.y+")")}}},"drawCommitLabel"),Fe=l((r,e,a,o)=>{if(e.tags.length>0){let t=0,s=0,h=0,d=[];for(let c of e.tags.reverse()){let m=r.insert("polygon"),p=r.append("circle"),f=r.append("text").attr("y",a.y-16-t).attr("class","tag-label").text(c),i=f.node()?.getBBox();if(!i)throw new Error("Tag bbox not found");s=Math.max(s,i.width),h=Math.max(h,i.height),f.attr("x",a.posWithOffset-i.width/2),d.push({tag:f,hole:p,rect:m,yOffset:t}),t+=20}for(let{tag:c,hole:m,rect:p,yOffset:f}of d){let i=h/2,y=a.y-19.2-f;if(p.attr("class","tag-label-bkg").attr("points",` - ${o-s/2-B/2},${y+v} - ${o-s/2-B/2},${y-v} - ${a.posWithOffset-s/2-B},${y-i-v} - ${a.posWithOffset+s/2+B},${y-i-v} - ${a.posWithOffset+s/2+B},${y+i+v} - ${a.posWithOffset-s/2-B},${y+i+v}`),m.attr("cy",y).attr("cx",o-s/2+B/2).attr("r",1.5).attr("class","tag-hole"),$==="TB"||$==="BT"){let g=o+f;p.attr("class","tag-label-bkg").attr("points",` - ${a.x},${g+2} - ${a.x},${g-2} - ${a.x+T},${g-i-2} - ${a.x+T+s+4},${g-i-2} - ${a.x+T+s+4},${g+i+2} - ${a.x+T},${g+i+2}`).attr("transform","translate(12,12) rotate(45, "+a.x+","+o+")"),m.attr("cx",a.x+B/2).attr("cy",g).attr("transform","translate(12,12) rotate(45, "+a.x+","+o+")"),c.attr("x",a.x+5).attr("y",g+3).attr("transform","translate(14,14) rotate(45, "+a.x+","+o+")")}}}},"drawCommitTags"),Ke=l(r=>{switch(r.customType??r.type){case x.NORMAL:return"commit-normal";case x.REVERSE:return"commit-reverse";case x.HIGHLIGHT:return"commit-highlight";case x.MERGE:return"commit-merge";case x.CHERRY_PICK:return"commit-cherry-pick";default:return"commit-normal"}},"getCommitClassType"),Ye=l((r,e,a,o)=>{let t={x:0,y:0};if(r.parents.length>0){let s=le(r.parents);if(s){let h=o.get(s)??t;return e==="TB"?h.y+E:e==="BT"?(o.get(r.id)??t).y-E:h.x+E}}else return e==="TB"?q:e==="BT"?(o.get(r.id)??t).y-E:0;return 0},"calculatePosition"),Ze=l((r,e,a)=>{let o=$==="BT"&&a?e:e+T,t=$==="TB"||$==="BT"?o:b.get(r.branch)?.pos,s=$==="TB"||$==="BT"?b.get(r.branch)?.pos:o;if(s===void 0||t===void 0)throw new Error(`Position were undefined for commit ${r.id}`);return{x:s,y:t,posWithOffset:o}},"getCommitPosition"),oe=l((r,e,a,o)=>{let t=r.append("g").attr("class","commit-bullets"),s=r.append("g").attr("class","commit-labels"),h=$==="TB"||$==="BT"?q:0,d=[...e.keys()],c=o.parallelCommits??!1,m=l((f,i)=>{let y=e.get(f)?.seq,g=e.get(i)?.seq;return y!==void 0&&g!==void 0?y-g:0},"sortKeys"),p=d.sort(m);$==="BT"&&(c&&We(p,e,h),p=p.reverse()),p.forEach(f=>{let i=e.get(f);if(!i)throw new Error(`Commit not found for key ${f}`);c&&(h=Ye(i,$,h,w));let y=Ze(i,h,c);if(a){let g=Ke(i),O=i.customType??i.type,D=b.get(i.branch)?.index??0;ze(t,i,y,g,D,O),je(s,i,y,h,o),Fe(s,i,y,h)}$==="TB"||$==="BT"?w.set(i.id,{x:y.x,y:y.posWithOffset}):w.set(i.id,{x:y.posWithOffset,y:y.y}),h=$==="BT"&&c?h+E:h+E+T,h>k&&(k=h)})},"drawCommits"),Ue=l((r,e,a,o,t)=>{let h=($==="TB"||$==="BT"?a.xm.branch===h,"isOnBranchToGetCurve"),c=l(m=>m.seq>r.seq&&m.seqc(m)&&d(m))},"shouldRerouteArrow"),R=l((r,e,a=0)=>{let o=r+Math.abs(r-e)/2;if(a>5)return o;if(G.every(h=>Math.abs(h-o)>=10))return G.push(o),o;let s=Math.abs(r-e);return R(r,e-s/5,a+1)},"findLane"),Ve=l((r,e,a,o)=>{let t=w.get(e.id),s=w.get(a.id);if(t===void 0||s===void 0)throw new Error(`Commit positions not found for commits ${e.id} and ${a.id}`);let h=Ue(e,a,t,s,o),d="",c="",m=0,p=0,f=b.get(a.branch)?.index;a.type===x.MERGE&&e.id!==a.parents[0]&&(f=b.get(e.branch)?.index);let i;if(h){d="A 10 10, 0, 0, 0,",c="A 10 10, 0, 0, 1,",m=10,p=10;let y=t.ys.x&&(d="A 20 20, 0, 0, 0,",c="A 20 20, 0, 0, 1,",m=20,p=20,a.type===x.MERGE&&e.id!==a.parents[0]?i=`M ${t.x} ${t.y} L ${t.x} ${s.y-m} ${c} ${t.x-p} ${s.y} L ${s.x} ${s.y}`:i=`M ${t.x} ${t.y} L ${s.x+m} ${t.y} ${d} ${s.x} ${t.y+p} L ${s.x} ${s.y}`),t.x===s.x&&(i=`M ${t.x} ${t.y} L ${s.x} ${s.y}`)):$==="BT"?(t.xs.x&&(d="A 20 20, 0, 0, 0,",c="A 20 20, 0, 0, 1,",m=20,p=20,a.type===x.MERGE&&e.id!==a.parents[0]?i=`M ${t.x} ${t.y} L ${t.x} ${s.y+m} ${d} ${t.x-p} ${s.y} L ${s.x} ${s.y}`:i=`M ${t.x} ${t.y} L ${s.x+m} ${t.y} ${c} ${s.x} ${t.y-p} L ${s.x} ${s.y}`),t.x===s.x&&(i=`M ${t.x} ${t.y} L ${s.x} ${s.y}`)):(t.ys.y&&(a.type===x.MERGE&&e.id!==a.parents[0]?i=`M ${t.x} ${t.y} L ${s.x-m} ${t.y} ${d} ${s.x} ${t.y-p} L ${s.x} ${s.y}`:i=`M ${t.x} ${t.y} L ${t.x} ${s.y+m} ${c} ${t.x+p} ${s.y} L ${s.x} ${s.y}`),t.y===s.y&&(i=`M ${t.x} ${t.y} L ${s.x} ${s.y}`));if(i===void 0)throw new Error("Line definition not found");r.append("path").attr("d",i).attr("class","arrow arrow"+f%L)},"drawArrow"),Je=l((r,e)=>{let a=r.append("g").attr("class","commit-arrows");[...e.keys()].forEach(o=>{let t=e.get(o);t.parents&&t.parents.length>0&&t.parents.forEach(s=>{Ve(a,e.get(s),t,e)})})},"drawArrows"),Xe=l((r,e,a)=>{let o=r.append("g");e.forEach((t,s)=>{let h=s%L,d=b.get(t.name)?.pos;if(d===void 0)throw new Error(`Position not found for branch ${t.name}`);let c=o.append("line");c.attr("x1",0),c.attr("y1",d),c.attr("x2",k),c.attr("y2",d),c.attr("class","branch branch"+h),$==="TB"?(c.attr("y1",q),c.attr("x1",d),c.attr("y2",k),c.attr("x2",d)):$==="BT"&&(c.attr("y1",k),c.attr("x1",d),c.attr("y2",q),c.attr("x2",d)),G.push(d);let m=t.name,p=he(m),f=o.insert("rect"),y=o.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+h);y.node().appendChild(p);let g=p.getBBox();f.attr("class","branchLabelBkg label"+h).attr("rx",4).attr("ry",4).attr("x",-g.width-4-(a.rotateCommitLabel===!0?30:0)).attr("y",-g.height/2+8).attr("width",g.width+18).attr("height",g.height+4),y.attr("transform","translate("+(-g.width-14-(a.rotateCommitLabel===!0?30:0))+", "+(d-g.height/2-1)+")"),$==="TB"?(f.attr("x",d-g.width/2-10).attr("y",0),y.attr("transform","translate("+(d-g.width/2-5)+", 0)")):$==="BT"?(f.attr("x",d-g.width/2-10).attr("y",k),y.attr("transform","translate("+(d-g.width/2-5)+", "+k+")")):f.attr("transform","translate(-19, "+(d-g.height/2)+")")})},"drawBranches"),Qe=l(function(r,e,a,o,t){return b.set(r,{pos:e,index:a}),e+=50+(t?40:0)+($==="TB"||$==="BT"?o.width/2:0),e},"setBranchPosition"),et=l(function(r,e,a,o){Ae(),u.debug("in gitgraph renderer",r+` -`,"id:",e,a);let t=o.db;if(!t.getConfig){u.error("getConfig method is not available on db");return}let s=t.getConfig(),h=s.rotateCommitLabel??!1;P=t.getCommits();let d=t.getBranchesAsObjArray();$=t.getDirection();let c=S(`[id="${e}"]`),m=0;d.forEach((p,f)=>{let i=he(p.name),y=c.append("g"),g=y.insert("g").attr("class","branchLabel"),O=g.insert("g").attr("class","label branch-label");O.node()?.appendChild(i);let D=i.getBBox();m=Qe(p.name,m,f,D,h),O.remove(),g.remove(),y.remove()}),oe(c,P,!1,s),s.showBranches&&Xe(c,d,s),Je(c,P),oe(c,P,!0,s),te.insertTitle(c,"gitTitleText",s.titleTopMargin??0,t.getDiagramTitle()),X(void 0,c,s.diagramPadding,s.useMaxWidth)},"draw"),tt={draw:et},rt=l(r=>` - .commit-id, - .commit-msg, - .branch-label { - fill: lightgrey; - color: lightgrey; - font-family: 'trebuchet ms', verdana, arial, sans-serif; - font-family: var(--mermaid-font-family); - } - ${[0,1,2,3,4,5,6,7].map(e=>` - .branch-label${e} { fill: ${r["gitBranchLabel"+e]}; } - .commit${e} { stroke: ${r["git"+e]}; fill: ${r["git"+e]}; } - .commit-highlight${e} { stroke: ${r["gitInv"+e]}; fill: ${r["gitInv"+e]}; } - .label${e} { fill: ${r["git"+e]}; } - .arrow${e} { stroke: ${r["git"+e]}; } - `).join(` -`)} - - .branch { - stroke-width: 1; - stroke: ${r.lineColor}; - stroke-dasharray: 2; - } - .commit-label { font-size: ${r.commitLabelFontSize}; fill: ${r.commitLabelColor};} - .commit-label-bkg { font-size: ${r.commitLabelFontSize}; fill: ${r.commitLabelBackground}; opacity: 0.5; } - .tag-label { font-size: ${r.tagLabelFontSize}; fill: ${r.tagLabelColor};} - .tag-label-bkg { fill: ${r.tagLabelBackground}; stroke: ${r.tagLabelBorder}; } - .tag-hole { fill: ${r.textColor}; } - - .commit-merge { - stroke: ${r.primaryColor}; - fill: ${r.primaryColor}; - } - .commit-reverse { - stroke: ${r.primaryColor}; - fill: ${r.primaryColor}; - stroke-width: 3; - } - .commit-highlight-outer { - } - .commit-highlight-inner { - stroke: ${r.primaryColor}; - fill: ${r.primaryColor}; - } - - .arrow { stroke-width: 8; stroke-linecap: round; fill: none} - .gitTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${r.textColor}; - } -`,"getStyles"),at=rt,lt={parser:Ge,db:de,renderer:tt,styles:at};export{lt as diagram}; diff --git a/src/google/adk/cli/browser/chunk-IT263FCL.js b/src/google/adk/cli/browser/chunk-CD6LWQYN.js similarity index 94% rename from src/google/adk/cli/browser/chunk-IT263FCL.js rename to src/google/adk/cli/browser/chunk-CD6LWQYN.js index b6b5935eb3..1f6f58a36f 100644 --- a/src/google/adk/cli/browser/chunk-IT263FCL.js +++ b/src/google/adk/cli/browser/chunk-CD6LWQYN.js @@ -1,2 +1,2 @@ -import{$a as c,Ca as o,Gb as h,Lb as y,Pa as a,Yb as C,Zb as g,eb as d,nc as v,pd as _,qd as w,ub as s,vb as l,wb as p,xb as m,yb as u,zb as f}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var D=e=>[e];function M(e,F){if(e&1&&h(0,0),e&2){let i=F.$implicit,n=y();m("surfaceId",n.surfaceId())("component",i)}}var T=(()=>{class e extends _{static \u0275fac=(()=>{let i;return function(t){return(i||(i=o(e)))(t||e)}})();static \u0275cmp=c({type:e,selectors:[["a2ui-card"]],features:[d],decls:3,vars:6,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(n,t){if(n&1&&(u(0,"section"),l(1,M,1,2,"ng-container",0,s),f()),n&2){let r=t.component().properties,I=r.children||v(4,D,r.child);C(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Card),g(t.theme.components.Card),a(),p(I)}},dependencies:[w],styles:[`a2ui-card{display:block;flex:var(--weight);min-height:0;overflow:auto}a2ui-card>section{height:100%;width:100%;min-height:0;overflow:auto}a2ui-card>section>*{height:100%;width:100%} +import{$a as c,Ca as o,Gb as h,Lb as y,Pa as a,Yb as C,Zb as g,eb as d,nc as v,pd as _,qd as w,ub as s,vb as l,wb as p,xb as m,yb as u,zb as f}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var D=e=>[e];function M(e,F){if(e&1&&h(0,0),e&2){let i=F.$implicit,n=y();m("surfaceId",n.surfaceId())("component",i)}}var T=(()=>{class e extends _{static \u0275fac=(()=>{let i;return function(t){return(i||(i=o(e)))(t||e)}})();static \u0275cmp=c({type:e,selectors:[["a2ui-card"]],features:[d],decls:3,vars:6,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(n,t){if(n&1&&(u(0,"section"),l(1,M,1,2,"ng-container",0,s),f()),n&2){let r=t.component().properties,I=r.children||v(4,D,r.child);C(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Card),g(t.theme.components.Card),a(),p(I)}},dependencies:[w],styles:[`a2ui-card{display:block;flex:var(--weight);min-height:0;overflow:auto}a2ui-card>section{height:100%;width:100%;min-height:0;overflow:auto}a2ui-card>section>*{height:100%;width:100%} `],encapsulation:2})}return e})();export{T as Card}; diff --git a/src/google/adk/cli/browser/chunk-DIR2LWLP.js b/src/google/adk/cli/browser/chunk-DIR2LWLP.js deleted file mode 100644 index 9529d256b9..0000000000 --- a/src/google/adk/cli/browser/chunk-DIR2LWLP.js +++ /dev/null @@ -1 +0,0 @@ -import{a as o,b as e}from"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{o as InfoModule,e as createInfoServices}; diff --git a/src/google/adk/cli/browser/chunk-DMWOYWYQ.js b/src/google/adk/cli/browser/chunk-DMWOYWYQ.js deleted file mode 100644 index ebc3890142..0000000000 --- a/src/google/adk/cli/browser/chunk-DMWOYWYQ.js +++ /dev/null @@ -1 +0,0 @@ -import{g as i}from"./chunk-JRNAXTJ7.js";function t(c,e){c.accDescr&&e.setAccDescription?.(c.accDescr),c.accTitle&&e.setAccTitle?.(c.accTitle),c.title&&e.setDiagramTitle?.(c.title)}i(t,"populateCommonDb");export{t as a}; diff --git a/src/google/adk/cli/browser/chunk-DRBE27N3.js b/src/google/adk/cli/browser/chunk-DRBE27N3.js deleted file mode 100644 index 47caf1de8e..0000000000 --- a/src/google/adk/cli/browser/chunk-DRBE27N3.js +++ /dev/null @@ -1 +0,0 @@ -import{k as m}from"./chunk-WBLSVR3V.js";import{Y as s,r as p}from"./chunk-QFMJV7VH.js";import{g as a}from"./chunk-JRNAXTJ7.js";import{j as g}from"./chunk-RMXJBC7V.js";var S=a(({flowchart:o})=>{let n=o?.subGraphTitleMargin?.top??0,t=o?.subGraphTitleMargin?.bottom??0,r=n+t;return{subGraphTitleTopMargin:n,subGraphTitleBottomMargin:t,subGraphTitleTotalMargin:r}},"getSubGraphTitleMargins");function b(o,n){return g(this,null,function*(){let t=o.getElementsByTagName("img");if(!t||t.length===0)return;let r=n.replace(/]*>/g,"").trim()==="";yield Promise.all([...t].map(e=>new Promise(u=>{function i(){if(e.style.display="flex",e.style.flexDirection="column",r){let f=s().fontSize?s().fontSize:window.getComputedStyle(document.body).fontSize,c=5,[d=p.fontSize]=m(f),l=d*c+"px";e.style.minWidth=l,e.style.maxWidth=l}else e.style.width="100%";u(e)}a(i,"setupImage"),setTimeout(()=>{e.complete&&i()}),e.addEventListener("error",i),e.addEventListener("load",i)})))})}a(b,"configureLabelImages");export{S as a,b}; diff --git a/src/google/adk/cli/browser/chunk-BPUQWVAT.js b/src/google/adk/cli/browser/chunk-DTNGXRUJ.js similarity index 92% rename from src/google/adk/cli/browser/chunk-BPUQWVAT.js rename to src/google/adk/cli/browser/chunk-DTNGXRUJ.js index cdcd953203..d76f6df711 100644 --- a/src/google/adk/cli/browser/chunk-BPUQWVAT.js +++ b/src/google/adk/cli/browser/chunk-DTNGXRUJ.js @@ -1 +1 @@ -import{$a as h,$b as u,Bb as l,Ca as m,Cb as a,Cc as c,Ib as r,Kb as M,Lb as C,Pa as n,Yb as y,Zb as s,_b as d,eb as v,pd as b,vb as g,wb as f,wc as _}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var D=(i,p)=>p.value;function P(i,p){if(i&1&&(l(0,"option",2),d(1),a()),i&2){let t=p.$implicit,o=C();r("value",t.value),n(),u(o.resolvePrimitive(t.label))}}var x=(()=>{class i extends b{options=c.required();value=c.required();description=c.required();selectId=super.getUniqueId("a2ui-multiple-choice");selectValue=_(()=>super.resolvePrimitive(this.value()));handleChange(t){let o=this.value()?.path;!(t.target instanceof HTMLSelectElement)||!t.target.value||!o||this.processor.setData(this.component(),this.processor.resolvePath(o,this.component().dataContextPath),t.target.value)}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(i)))(e||i)}})();static \u0275cmp=h({type:i,selectors:[["a2ui-multiple-choice"]],inputs:{options:[1,"options"],value:[1,"value"],description:[1,"description"]},features:[v],decls:6,vars:12,consts:[[3,"for"],[3,"change","id","value"],[3,"value"]],template:function(o,e){o&1&&(l(0,"section")(1,"label",0),d(2),a(),l(3,"select",1),M("change",function(E){return e.handleChange(E)}),g(4,P,2,2,"option",2,D),a()()),o&2&&(s(e.theme.components.MultipleChoice.container),n(),s(e.theme.components.MultipleChoice.label),r("htmlFor",e.selectId),n(),u(e.description()),n(),y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.MultipleChoice),s(e.theme.components.MultipleChoice.element),r("id",e.selectId)("value",e.selectValue()),n(),f(e.options()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}select[_ngcontent-%COMP%]{width:100%;box-sizing:border-box}"]})}return i})();export{x as MultipleChoice}; +import{$a as h,$b as u,Bb as l,Ca as m,Cb as a,Cc as c,Ib as r,Kb as M,Lb as C,Pa as n,Yb as y,Zb as s,_b as d,eb as v,pd as b,vb as g,wb as f,wc as _}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var D=(i,p)=>p.value;function P(i,p){if(i&1&&(l(0,"option",2),d(1),a()),i&2){let t=p.$implicit,o=C();r("value",t.value),n(),u(o.resolvePrimitive(t.label))}}var x=(()=>{class i extends b{options=c.required();value=c.required();description=c.required();selectId=super.getUniqueId("a2ui-multiple-choice");selectValue=_(()=>super.resolvePrimitive(this.value()));handleChange(t){let o=this.value()?.path;!(t.target instanceof HTMLSelectElement)||!t.target.value||!o||this.processor.setData(this.component(),this.processor.resolvePath(o,this.component().dataContextPath),t.target.value)}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(i)))(e||i)}})();static \u0275cmp=h({type:i,selectors:[["a2ui-multiple-choice"]],inputs:{options:[1,"options"],value:[1,"value"],description:[1,"description"]},features:[v],decls:6,vars:12,consts:[[3,"for"],[3,"change","id","value"],[3,"value"]],template:function(o,e){o&1&&(l(0,"section")(1,"label",0),d(2),a(),l(3,"select",1),M("change",function(E){return e.handleChange(E)}),g(4,P,2,2,"option",2,D),a()()),o&2&&(s(e.theme.components.MultipleChoice.container),n(),s(e.theme.components.MultipleChoice.label),r("htmlFor",e.selectId),n(),u(e.description()),n(),y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.MultipleChoice),s(e.theme.components.MultipleChoice.element),r("id",e.selectId)("value",e.selectValue()),n(),f(e.options()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}select[_ngcontent-%COMP%]{width:100%;box-sizing:border-box}"]})}return i})();export{x as MultipleChoice}; diff --git a/src/google/adk/cli/browser/chunk-EGBSMT36.js b/src/google/adk/cli/browser/chunk-EGBSMT36.js deleted file mode 100644 index d272229d61..0000000000 --- a/src/google/adk/cli/browser/chunk-EGBSMT36.js +++ /dev/null @@ -1 +0,0 @@ -var Pr=typeof global=="object"&&global&&global.Object===Object&&global,U=Pr;var Sr=typeof self=="object"&&self&&self.Object===Object&&self,Ir=U||Sr||Function("return this")(),c=Ir;var Mr=c.Symbol,_=Mr;var nt=Object.prototype,Er=nt.hasOwnProperty,Fr=nt.toString,E=_?_.toStringTag:void 0;function Lr(t){var r=Er.call(t,E),e=t[E];try{t[E]=void 0;var o=!0}catch(i){}var a=Fr.call(t);return o&&(r?t[E]=e:delete t[E]),a}var it=Lr;var Dr=Object.prototype,Gr=Dr.toString;function Nr(t){return Gr.call(t)}var ft=Nr;var zr="[object Null]",Ur="[object Undefined]",pt=_?_.toStringTag:void 0;function Rr(t){return t==null?t===void 0?Ur:zr:pt&&pt in Object(t)?it(t):ft(t)}var g=Rr;function Hr(t){var r=typeof t;return t!=null&&(r=="object"||r=="function")}var s=Hr;var Br="[object AsyncFunction]",Vr="[object Function]",Kr="[object GeneratorFunction]",qr="[object Proxy]";function $r(t){if(!s(t))return!1;var r=g(t);return r==Vr||r==Kr||r==Br||r==qr}var O=$r;function Xr(t){return function(){return t}}var ut=Xr;var Jr=c["__core-js_shared__"],R=Jr;var st=(function(){var t=/[^.]+$/.exec(R&&R.keys&&R.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""})();function Wr(t){return!!st&&st in t}var mt=Wr;var Yr=Function.prototype,Zr=Yr.toString;function Qr(t){if(t!=null){try{return Zr.call(t)}catch(r){}try{return t+""}catch(r){}}return""}var lt=Qr;var kr=/[\\^$.*+?()[\]{}|]/g,te=/^\[object .+?Constructor\]$/,re=Function.prototype,ee=Object.prototype,oe=re.toString,ae=ee.hasOwnProperty,ne=RegExp("^"+oe.call(ae).replace(kr,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ie(t){if(!s(t)||mt(t))return!1;var r=O(t)?ne:te;return r.test(lt(t))}var ct=ie;function fe(t,r){return t?.[r]}var dt=fe;function pe(t,r){var e=dt(t,r);return ct(e)?e:void 0}var T=pe;var ue=T(Object,"create"),h=ue;function se(){this.__data__=h?h(null):{},this.size=0}var ht=se;function me(t){var r=this.has(t)&&delete this.__data__[t];return this.size-=r?1:0,r}var gt=me;var le="__lodash_hash_undefined__",ce=Object.prototype,de=ce.hasOwnProperty;function he(t){var r=this.__data__;if(h){var e=r[t];return e===le?void 0:e}return de.call(r,t)?r[t]:void 0}var yt=he;var ge=Object.prototype,ye=ge.hasOwnProperty;function be(t){var r=this.__data__;return h?r[t]!==void 0:ye.call(r,t)}var bt=be;var xe="__lodash_hash_undefined__";function ve(t,r){var e=this.__data__;return this.size+=this.has(t)?0:1,e[t]=h&&r===void 0?xe:r,this}var xt=ve;function j(t){var r=-1,e=t==null?0:t.length;for(this.clear();++r-1}var Tt=Pe;function Se(t,r){var e=this.__data__,o=b(e,t);return o<0?(++this.size,e.push([t,r])):e[o][1]=r,this}var jt=Se;function A(t){var r=-1,e=t==null?0:t.length;for(this.clear();++r-1&&t%1==0&&t<=go}var K=yo;function bo(t){return t!=null&&K(t.length)&&!O(t)}var I=bo;function xo(t){return d(t)&&I(t)}var Qt=xo;function vo(){return!1}var kt=vo;var er=typeof exports=="object"&&exports&&!exports.nodeType&&exports,tr=er&&typeof module=="object"&&module&&!module.nodeType&&module,_o=tr&&tr.exports===er,rr=_o?c.Buffer:void 0,Oo=rr?rr.isBuffer:void 0,To=Oo||kt,q=To;var jo="[object Object]",Ao=Function.prototype,Co=Object.prototype,or=Ao.toString,wo=Co.hasOwnProperty,Po=or.call(Object);function So(t){if(!d(t)||g(t)!=jo)return!1;var r=B(t);if(r===null)return!0;var e=wo.call(r,"constructor")&&r.constructor;return typeof e=="function"&&e instanceof e&&or.call(e)==Po}var ar=So;var Io="[object Arguments]",Mo="[object Array]",Eo="[object Boolean]",Fo="[object Date]",Lo="[object Error]",Do="[object Function]",Go="[object Map]",No="[object Number]",zo="[object Object]",Uo="[object RegExp]",Ro="[object Set]",Ho="[object String]",Bo="[object WeakMap]",Vo="[object ArrayBuffer]",Ko="[object DataView]",qo="[object Float32Array]",$o="[object Float64Array]",Xo="[object Int8Array]",Jo="[object Int16Array]",Wo="[object Int32Array]",Yo="[object Uint8Array]",Zo="[object Uint8ClampedArray]",Qo="[object Uint16Array]",ko="[object Uint32Array]",p={};p[qo]=p[$o]=p[Xo]=p[Jo]=p[Wo]=p[Yo]=p[Zo]=p[Qo]=p[ko]=!0;p[Io]=p[Mo]=p[Vo]=p[Eo]=p[Ko]=p[Fo]=p[Lo]=p[Do]=p[Go]=p[No]=p[zo]=p[Uo]=p[Ro]=p[Ho]=p[Bo]=!1;function ta(t){return d(t)&&K(t.length)&&!!p[g(t)]}var nr=ta;function ra(t){return function(r){return t(r)}}var ir=ra;var fr=typeof exports=="object"&&exports&&!exports.nodeType&&exports,N=fr&&typeof module=="object"&&module&&!module.nodeType&&module,ea=N&&N.exports===fr,et=ea&&U.process,oa=(function(){try{var t=N&&N.require&&N.require("util").types;return t||et&&et.binding&&et.binding("util")}catch(r){}})(),ot=oa;var pr=ot&&ot.isTypedArray,aa=pr?ir(pr):nr,$=aa;function na(t,r){if(!(r==="constructor"&&typeof t[r]=="function")&&r!="__proto__")return t[r]}var z=na;var ia=Object.prototype,fa=ia.hasOwnProperty;function pa(t,r,e){var o=t[r];(!(fa.call(t,r)&&y(o,e))||e===void 0&&!(r in t))&&S(t,r,e)}var ur=pa;function ua(t,r,e,o){var a=!e;e||(e={});for(var i=-1,f=r.length;++i-1&&t%1==0&&t0){if(++r>=Pa)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}var Tr=Ma;var Ea=Tr(Or),jr=Ea;function Fa(t,r){return jr(_r(t,r,W),t+"")}var Ar=Fa;function La(t,r,e){if(!s(e))return!1;var o=typeof r;return(o=="number"?I(e)&&X(r,e.length):o=="string"&&r in e)?y(e[r],t):!1}var Cr=La;function Da(t){return Ar(function(r,e){var o=-1,a=e.length,i=a>1?e[a-1]:void 0,f=a>2?e[2]:void 0;for(i=t.length>3&&typeof i=="function"?(a--,i):void 0,f&&Cr(e[0],e[1],f)&&(i=a<3?void 0:i,a=1),r=Object(r);++o!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function cn(e){if(ts)throw new Error("");if(De===null)return;De.consumerOnSignalRead(e);let t=De.producersTail;if(t!==void 0&&t.producer===e)return;let n,r=De.recomputing;if(r&&(n=t!==void 0?t.nextProducer:De.producers,n!==void 0&&n.producer===e)){De.producersTail=n,n.lastReadVersion=e.version;return}let o=e.consumersTail;if(o!==void 0&&o.consumer===De&&(!r||eE(o,De)))return;let i=Sr(De),s={producer:e,consumer:De,nextProducer:n,prevConsumer:o,lastReadVersion:e.version,nextConsumer:void 0};De.producersTail=s,t!==void 0?t.nextProducer=s:De.producers=s,i&&c0(e,s)}function s0(){lc++}function Ln(e){if(!(Sr(e)&&!e.dirty)&&!(!e.dirty&&e.lastCleanEpoch===lc)){if(!e.producerMustRecompute(e)&&!Tr(e)){Ir(e);return}e.producerRecomputeValue(e),Ir(e)}}function dc(e){if(e.consumers===void 0)return;let t=ts;ts=!0;try{for(let n=e.consumers;n!==void 0;n=n.nextConsumer){let r=n.consumer;r.dirty||XD(r)}}finally{ts=t}}function fc(){return De?.consumerAllowSignalWrites!==!1}function XD(e){e.dirty=!0,dc(e),e.consumerMarkedDirty?.(e)}function Ir(e){e.dirty=!1,e.lastCleanEpoch=lc}function Lt(e){return e&&u0(e),I(e)}function u0(e){e.producersTail=void 0,e.recomputing=!0}function ln(e,t){I(t),e&&a0(e)}function a0(e){e.recomputing=!1;let t=e.producersTail,n=t!==void 0?t.nextProducer:e.producers;if(n!==void 0){if(Sr(e))do n=pc(n);while(n!==void 0);t!==void 0?t.nextProducer=void 0:e.producers=void 0}}function Tr(e){for(let t=e.producers;t!==void 0;t=t.nextProducer){let n=t.producer,r=t.lastReadVersion;if(r!==n.version||(Ln(n),r!==n.version))return!0}return!1}function dn(e){if(Sr(e)){let t=e.producers;for(;t!==void 0;)t=pc(t)}e.producers=void 0,e.producersTail=void 0,e.consumers=void 0,e.consumersTail=void 0}function c0(e,t){let n=e.consumersTail,r=Sr(e);if(n!==void 0?(t.nextConsumer=n.nextConsumer,n.nextConsumer=t):(t.nextConsumer=void 0,e.consumers=t),t.prevConsumer=n,e.consumersTail=t,!r)for(let o=e.producers;o!==void 0;o=o.nextProducer)c0(o.producer,o)}function pc(e){let t=e.producer,n=e.nextProducer,r=e.nextConsumer,o=e.prevConsumer;if(e.nextConsumer=void 0,e.prevConsumer=void 0,r!==void 0?r.prevConsumer=o:t.consumersTail=o,o!==void 0)o.nextConsumer=r;else if(t.consumers=r,!Sr(t)){let i=t.producers;for(;i!==void 0;)i=pc(i)}return n}function Sr(e){return e.consumerIsAlwaysLive||e.consumers!==void 0}function ko(e){JD?.(e)}function eE(e,t){let n=t.producersTail;if(n!==void 0){let r=t.producers;do{if(r===e)return!0;if(r===n)break;r=r.nextProducer}while(r!==void 0)}return!1}function Ro(e,t){return Object.is(e,t)}function Fo(e,t){let n=Object.create(tE);n.computation=e,t!==void 0&&(n.equal=t);let r=()=>{if(Ln(n),cn(n),n.value===Dt)throw n.error;return n.value};return r[se]=n,ko(n),r}var un=Symbol("UNSET"),Pn=Symbol("COMPUTING"),Dt=Symbol("ERRORED"),tE=P(M({},an),{value:un,dirty:!0,error:null,equal:Ro,kind:"computed",producerMustRecompute(e){return e.value===un||e.value===Pn},producerRecomputeValue(e){if(e.value===Pn)throw new Error("");let t=e.value;e.value=Pn;let n=Lt(e),r,o=!1;try{r=e.computation(),I(null),o=t!==un&&t!==Dt&&r!==Dt&&e.equal(t,r)}catch(i){r=Dt,e.error=i}finally{ln(e,n)}if(o){e.value=t;return}e.value=r,e.version++}});function nE(){throw new Error}var l0=nE;function d0(e){l0(e)}function hc(e){l0=e}var rE=null;function gc(e,t){let n=Object.create(Oo);n.value=e,t!==void 0&&(n.equal=t);let r=()=>f0(n);return r[se]=n,ko(n),[r,s=>jn(n,s),s=>rs(n,s)]}function f0(e){return cn(e),e.value}function jn(e,t){fc()||d0(e),e.equal(e.value,t)||(e.value=t,oE(e))}function rs(e,t){fc()||d0(e),jn(e,t(e.value))}var Oo=P(M({},an),{equal:Ro,value:void 0,kind:"signal"});function oE(e){e.version++,s0(),dc(e),rE?.(e)}var mc=P(M({},an),{consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,dirty:!0,kind:"effect"});function yc(e){if(e.dirty=!1,e.version>0&&!Tr(e))return;e.version++;let t=Lt(e);try{e.cleanup(),e.fn()}finally{ln(e,t)}}function R(e){return typeof e=="function"}function Mr(e){let n=e(r=>{Error.call(r),r.stack=new Error().stack});return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n}var os=Mr(e=>function(n){e(this),this.message=n?`${n.length} errors occurred during unsubscription: +import{a as M,b as P,e as xr,g as vt}from"./chunk-W7GRJBO5.js";var De=null,ts=!1,lc=1,JD=null,se=Symbol("SIGNAL");function I(e){let t=De;return De=e,t}function ns(){return De}var an={version:0,lastCleanEpoch:0,dirty:!1,producers:void 0,producersTail:void 0,consumers:void 0,consumersTail:void 0,recomputing:!1,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,kind:"unknown",producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function cn(e){if(ts)throw new Error("");if(De===null)return;De.consumerOnSignalRead(e);let t=De.producersTail;if(t!==void 0&&t.producer===e)return;let n,r=De.recomputing;if(r&&(n=t!==void 0?t.nextProducer:De.producers,n!==void 0&&n.producer===e)){De.producersTail=n,n.lastReadVersion=e.version;return}let o=e.consumersTail;if(o!==void 0&&o.consumer===De&&(!r||eE(o,De)))return;let i=Sr(De),s={producer:e,consumer:De,nextProducer:n,prevConsumer:o,lastReadVersion:e.version,nextConsumer:void 0};De.producersTail=s,t!==void 0?t.nextProducer=s:De.producers=s,i&&c0(e,s)}function s0(){lc++}function Ln(e){if(!(Sr(e)&&!e.dirty)&&!(!e.dirty&&e.lastCleanEpoch===lc)){if(!e.producerMustRecompute(e)&&!Tr(e)){Ir(e);return}e.producerRecomputeValue(e),Ir(e)}}function dc(e){if(e.consumers===void 0)return;let t=ts;ts=!0;try{for(let n=e.consumers;n!==void 0;n=n.nextConsumer){let r=n.consumer;r.dirty||XD(r)}}finally{ts=t}}function fc(){return De?.consumerAllowSignalWrites!==!1}function XD(e){e.dirty=!0,dc(e),e.consumerMarkedDirty?.(e)}function Ir(e){e.dirty=!1,e.lastCleanEpoch=lc}function Lt(e){return e&&u0(e),I(e)}function u0(e){e.producersTail=void 0,e.recomputing=!0}function ln(e,t){I(t),e&&a0(e)}function a0(e){e.recomputing=!1;let t=e.producersTail,n=t!==void 0?t.nextProducer:e.producers;if(n!==void 0){if(Sr(e))do n=pc(n);while(n!==void 0);t!==void 0?t.nextProducer=void 0:e.producers=void 0}}function Tr(e){for(let t=e.producers;t!==void 0;t=t.nextProducer){let n=t.producer,r=t.lastReadVersion;if(r!==n.version||(Ln(n),r!==n.version))return!0}return!1}function dn(e){if(Sr(e)){let t=e.producers;for(;t!==void 0;)t=pc(t)}e.producers=void 0,e.producersTail=void 0,e.consumers=void 0,e.consumersTail=void 0}function c0(e,t){let n=e.consumersTail,r=Sr(e);if(n!==void 0?(t.nextConsumer=n.nextConsumer,n.nextConsumer=t):(t.nextConsumer=void 0,e.consumers=t),t.prevConsumer=n,e.consumersTail=t,!r)for(let o=e.producers;o!==void 0;o=o.nextProducer)c0(o.producer,o)}function pc(e){let t=e.producer,n=e.nextProducer,r=e.nextConsumer,o=e.prevConsumer;if(e.nextConsumer=void 0,e.prevConsumer=void 0,r!==void 0?r.prevConsumer=o:t.consumersTail=o,o!==void 0)o.nextConsumer=r;else if(t.consumers=r,!Sr(t)){let i=t.producers;for(;i!==void 0;)i=pc(i)}return n}function Sr(e){return e.consumerIsAlwaysLive||e.consumers!==void 0}function ko(e){JD?.(e)}function eE(e,t){let n=t.producersTail;if(n!==void 0){let r=t.producers;do{if(r===e)return!0;if(r===n)break;r=r.nextProducer}while(r!==void 0)}return!1}function Ro(e,t){return Object.is(e,t)}function Fo(e,t){let n=Object.create(tE);n.computation=e,t!==void 0&&(n.equal=t);let r=()=>{if(Ln(n),cn(n),n.value===Dt)throw n.error;return n.value};return r[se]=n,ko(n),r}var un=Symbol("UNSET"),Pn=Symbol("COMPUTING"),Dt=Symbol("ERRORED"),tE=P(M({},an),{value:un,dirty:!0,error:null,equal:Ro,kind:"computed",producerMustRecompute(e){return e.value===un||e.value===Pn},producerRecomputeValue(e){if(e.value===Pn)throw new Error("");let t=e.value;e.value=Pn;let n=Lt(e),r,o=!1;try{r=e.computation(),I(null),o=t!==un&&t!==Dt&&r!==Dt&&e.equal(t,r)}catch(i){r=Dt,e.error=i}finally{ln(e,n)}if(o){e.value=t;return}e.value=r,e.version++}});function nE(){throw new Error}var l0=nE;function d0(e){l0(e)}function hc(e){l0=e}var rE=null;function gc(e,t){let n=Object.create(Oo);n.value=e,t!==void 0&&(n.equal=t);let r=()=>f0(n);return r[se]=n,ko(n),[r,s=>jn(n,s),s=>rs(n,s)]}function f0(e){return cn(e),e.value}function jn(e,t){fc()||d0(e),e.equal(e.value,t)||(e.value=t,oE(e))}function rs(e,t){fc()||d0(e),jn(e,t(e.value))}var Oo=P(M({},an),{equal:Ro,value:void 0,kind:"signal"});function oE(e){e.version++,s0(),dc(e),rE?.(e)}var mc=P(M({},an),{consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,dirty:!0,kind:"effect"});function yc(e){if(e.dirty=!1,e.version>0&&!Tr(e))return;e.version++;let t=Lt(e);try{e.cleanup(),e.fn()}finally{ln(e,t)}}function R(e){return typeof e=="function"}function Mr(e){let n=e(r=>{Error.call(r),r.stack=new Error().stack});return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n}var os=Mr(e=>function(n){e(this),this.message=n?`${n.length} errors occurred during unsubscription: ${n.map((r,o)=>`${o+1}) ${r.toString()}`).join(` `)}`:"",this.name="UnsubscriptionError",this.errors=n});function Bn(e,t){if(e){let n=e.indexOf(t);0<=n&&e.splice(n,1)}}var ne=class e{constructor(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}unsubscribe(){let t;if(!this.closed){this.closed=!0;let{_parentage:n}=this;if(n)if(this._parentage=null,Array.isArray(n))for(let i of n)i.remove(this);else n.remove(this);let{initialTeardown:r}=this;if(R(r))try{r()}catch(i){t=i instanceof os?i.errors:[i]}let{_finalizers:o}=this;if(o){this._finalizers=null;for(let i of o)try{p0(i)}catch(s){t=t??[],s instanceof os?t=[...t,...s.errors]:t.push(s)}}if(t)throw new os(t)}}add(t){var n;if(t&&t!==this)if(this.closed)p0(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(n=this._finalizers)!==null&&n!==void 0?n:[]).push(t)}}_hasParent(t){let{_parentage:n}=this;return n===t||Array.isArray(n)&&n.includes(t)}_addParent(t){let{_parentage:n}=this;this._parentage=Array.isArray(n)?(n.push(t),n):n?[n,t]:t}_removeParent(t){let{_parentage:n}=this;n===t?this._parentage=null:Array.isArray(n)&&Bn(n,t)}remove(t){let{_finalizers:n}=this;n&&Bn(n,t),t instanceof e&&t._removeParent(this)}};ne.EMPTY=(()=>{let e=new ne;return e.closed=!0,e})();var bc=ne.EMPTY;function is(e){return e instanceof ne||e&&"closed"in e&&R(e.remove)&&R(e.add)&&R(e.unsubscribe)}function p0(e){R(e)?e():e.unsubscribe()}var et={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var Ar={setTimeout(e,t,...n){let{delegate:r}=Ar;return r?.setTimeout?r.setTimeout(e,t,...n):setTimeout(e,t,...n)},clearTimeout(e){let{delegate:t}=Ar;return(t?.clearTimeout||clearTimeout)(e)},delegate:void 0};function ss(e){Ar.setTimeout(()=>{let{onUnhandledError:t}=et;if(t)t(e);else throw e})}function jt(){}var h0=vc("C",void 0,void 0);function g0(e){return vc("E",void 0,e)}function m0(e){return vc("N",e,void 0)}function vc(e,t,n){return{kind:e,value:t,error:n}}var Vn=null;function Nr(e){if(et.useDeprecatedSynchronousErrorHandling){let t=!Vn;if(t&&(Vn={errorThrown:!1,error:null}),e(),t){let{errorThrown:n,error:r}=Vn;if(Vn=null,n)throw r}}else e()}function y0(e){et.useDeprecatedSynchronousErrorHandling&&Vn&&(Vn.errorThrown=!0,Vn.error=e)}var Hn=class extends ne{constructor(t){super(),this.isStopped=!1,t?(this.destination=t,is(t)&&t.add(this)):this.destination=uE}static create(t,n,r){return new tt(t,n,r)}next(t){this.isStopped?Ec(m0(t),this):this._next(t)}error(t){this.isStopped?Ec(g0(t),this):(this.isStopped=!0,this._error(t))}complete(){this.isStopped?Ec(h0,this):(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe(),this.destination=null)}_next(t){this.destination.next(t)}_error(t){try{this.destination.error(t)}finally{this.unsubscribe()}}_complete(){try{this.destination.complete()}finally{this.unsubscribe()}}},iE=Function.prototype.bind;function Dc(e,t){return iE.call(e,t)}var Cc=class{constructor(t){this.partialObserver=t}next(t){let{partialObserver:n}=this;if(n.next)try{n.next(t)}catch(r){us(r)}}error(t){let{partialObserver:n}=this;if(n.error)try{n.error(t)}catch(r){us(r)}else us(t)}complete(){let{partialObserver:t}=this;if(t.complete)try{t.complete()}catch(n){us(n)}}},tt=class extends Hn{constructor(t,n,r){super();let o;if(R(t)||!t)o={next:t??void 0,error:n??void 0,complete:r??void 0};else{let i;this&&et.useDeprecatedNextContext?(i=Object.create(t),i.unsubscribe=()=>this.unsubscribe(),o={next:t.next&&Dc(t.next,i),error:t.error&&Dc(t.error,i),complete:t.complete&&Dc(t.complete,i)}):o=t}this.destination=new Cc(o)}};function us(e){et.useDeprecatedSynchronousErrorHandling?y0(e):ss(e)}function sE(e){throw e}function Ec(e,t){let{onStoppedNotification:n}=et;n&&Ar.setTimeout(()=>n(e,t))}var uE={closed:!0,next:jt,error:sE,complete:jt};var kr=typeof Symbol=="function"&&Symbol.observable||"@@observable";function Te(e){return e}function aE(...e){return _c(e)}function _c(e){return e.length===0?Te:e.length===1?e[0]:function(n){return e.reduce((r,o)=>o(r),n)}}var B=(()=>{class e{constructor(n){n&&(this._subscribe=n)}lift(n){let r=new e;return r.source=this,r.operator=n,r}subscribe(n,r,o){let i=lE(n)?n:new tt(n,r,o);return Nr(()=>{let{operator:s,source:u}=this;i.add(s?s.call(i,u):u?this._subscribe(i):this._trySubscribe(i))}),i}_trySubscribe(n){try{return this._subscribe(n)}catch(r){n.error(r)}}forEach(n,r){return r=b0(r),new r((o,i)=>{let s=new tt({next:u=>{try{n(u)}catch(a){i(a),s.unsubscribe()}},error:i,complete:o});this.subscribe(s)})}_subscribe(n){var r;return(r=this.source)===null||r===void 0?void 0:r.subscribe(n)}[kr](){return this}pipe(...n){return _c(n)(this)}toPromise(n){return n=b0(n),new n((r,o)=>{let i;this.subscribe(s=>i=s,s=>o(s),()=>r(i))})}}return e.create=t=>new e(t),e})();function b0(e){var t;return(t=e??et.Promise)!==null&&t!==void 0?t:Promise}function cE(e){return e&&R(e.next)&&R(e.error)&&R(e.complete)}function lE(e){return e&&e instanceof Hn||cE(e)&&is(e)}function wc(e){return R(e?.lift)}function j(e){return t=>{if(wc(t))return t.lift(function(n){try{return e(n,this)}catch(r){this.error(r)}});throw new TypeError("Unable to lift unknown Observable type")}}function F(e,t,n,r,o){return new xc(e,t,n,r,o)}var xc=class extends Hn{constructor(t,n,r,o,i,s){super(t),this.onFinalize=i,this.shouldUnsubscribe=s,this._next=n?function(u){try{n(u)}catch(a){t.error(a)}}:super._next,this._error=o?function(u){try{o(u)}catch(a){t.error(a)}finally{this.unsubscribe()}}:super._error,this._complete=r?function(){try{r()}catch(u){t.error(u)}finally{this.unsubscribe()}}:super._complete}unsubscribe(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){let{closed:n}=this;super.unsubscribe(),!n&&((t=this.onFinalize)===null||t===void 0||t.call(this))}}};function v0(){return j((e,t)=>{let n=null;e._refCount++;let r=F(t,void 0,void 0,void 0,()=>{if(!e||e._refCount<=0||0<--e._refCount){n=null;return}let o=e._connection,i=n;n=null,o&&(!i||o===i)&&o.unsubscribe(),t.unsubscribe()});e.subscribe(r),r.closed||(n=e.connect())})}var Ic=class extends B{constructor(t,n){super(),this.source=t,this.subjectFactory=n,this._subject=null,this._refCount=0,this._connection=null,wc(t)&&(this.lift=t.lift)}_subscribe(t){return this.getSubject().subscribe(t)}getSubject(){let t=this._subject;return(!t||t.isStopped)&&(this._subject=this.subjectFactory()),this._subject}_teardown(){this._refCount=0;let{_connection:t}=this;this._subject=this._connection=null,t?.unsubscribe()}connect(){let t=this._connection;if(!t){t=this._connection=new ne;let n=this.getSubject();t.add(this.source.subscribe(F(n,void 0,()=>{this._teardown(),n.complete()},r=>{this._teardown(),n.error(r)},()=>this._teardown()))),t.closed&&(this._connection=null,t=ne.EMPTY)}return t}refCount(){return v0()(this)}};var Rr={schedule(e){let t=requestAnimationFrame,n=cancelAnimationFrame,{delegate:r}=Rr;r&&(t=r.requestAnimationFrame,n=r.cancelAnimationFrame);let o=t(i=>{n=void 0,e(i)});return new ne(()=>n?.(o))},requestAnimationFrame(...e){let{delegate:t}=Rr;return(t?.requestAnimationFrame||requestAnimationFrame)(...e)},cancelAnimationFrame(...e){let{delegate:t}=Rr;return(t?.cancelAnimationFrame||cancelAnimationFrame)(...e)},delegate:void 0};var D0=Mr(e=>function(){e(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"});var he=(()=>{class e extends B{constructor(){super(),this.closed=!1,this.currentObservers=null,this.observers=[],this.isStopped=!1,this.hasError=!1,this.thrownError=null}lift(n){let r=new as(this,this);return r.operator=n,r}_throwIfClosed(){if(this.closed)throw new D0}next(n){Nr(()=>{if(this._throwIfClosed(),!this.isStopped){this.currentObservers||(this.currentObservers=Array.from(this.observers));for(let r of this.currentObservers)r.next(n)}})}error(n){Nr(()=>{if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=n;let{observers:r}=this;for(;r.length;)r.shift().error(n)}})}complete(){Nr(()=>{if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;let{observers:n}=this;for(;n.length;)n.shift().complete()}})}unsubscribe(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null}get observed(){var n;return((n=this.observers)===null||n===void 0?void 0:n.length)>0}_trySubscribe(n){return this._throwIfClosed(),super._trySubscribe(n)}_subscribe(n){return this._throwIfClosed(),this._checkFinalizedStatuses(n),this._innerSubscribe(n)}_innerSubscribe(n){let{hasError:r,isStopped:o,observers:i}=this;return r||o?bc:(this.currentObservers=null,i.push(n),new ne(()=>{this.currentObservers=null,Bn(i,n)}))}_checkFinalizedStatuses(n){let{hasError:r,thrownError:o,isStopped:i}=this;r?n.error(o):i&&n.complete()}asObservable(){let n=new B;return n.source=this,n}}return e.create=(t,n)=>new as(t,n),e})(),as=class extends he{constructor(t,n){super(),this.destination=t,this.source=n}next(t){var n,r;(r=(n=this.destination)===null||n===void 0?void 0:n.next)===null||r===void 0||r.call(n,t)}error(t){var n,r;(r=(n=this.destination)===null||n===void 0?void 0:n.error)===null||r===void 0||r.call(n,t)}complete(){var t,n;(n=(t=this.destination)===null||t===void 0?void 0:t.complete)===null||n===void 0||n.call(t)}_subscribe(t){var n,r;return(r=(n=this.source)===null||n===void 0?void 0:n.subscribe(t))!==null&&r!==void 0?r:bc}};var Po=class extends he{constructor(t){super(),this._value=t}get value(){return this.getValue()}_subscribe(t){let n=super._subscribe(t);return!n.closed&&t.next(this._value),n}getValue(){let{hasError:t,thrownError:n,_value:r}=this;if(t)throw n;return this._throwIfClosed(),r}next(t){super.next(this._value=t)}};var Lo={now(){return(Lo.delegate||Date).now()},delegate:void 0};var jo=class extends he{constructor(t=1/0,n=1/0,r=Lo){super(),this._bufferSize=t,this._windowTime=n,this._timestampProvider=r,this._buffer=[],this._infiniteTimeWindow=!0,this._infiniteTimeWindow=n===1/0,this._bufferSize=Math.max(1,t),this._windowTime=Math.max(1,n)}next(t){let{isStopped:n,_buffer:r,_infiniteTimeWindow:o,_timestampProvider:i,_windowTime:s}=this;n||(r.push(t),!o&&r.push(i.now()+s)),this._trimBuffer(),super.next(t)}_subscribe(t){this._throwIfClosed(),this._trimBuffer();let n=this._innerSubscribe(t),{_infiniteTimeWindow:r,_buffer:o}=this,i=o.slice();for(let s=0;sE0(t)&&e()),t},clearImmediate(e){E0(e)}};var{setImmediate:fE,clearImmediate:pE}=C0,Vo={setImmediate(...e){let{delegate:t}=Vo;return(t?.setImmediate||fE)(...e)},clearImmediate(e){let{delegate:t}=Vo;return(t?.clearImmediate||pE)(e)},delegate:void 0};var ls=class extends fn{constructor(t,n){super(t,n),this.scheduler=t,this.work=n}requestAsyncId(t,n,r=0){return r!==null&&r>0?super.requestAsyncId(t,n,r):(t.actions.push(this),t._scheduled||(t._scheduled=Vo.setImmediate(t.flush.bind(t,void 0))))}recycleAsyncId(t,n,r=0){var o;if(r!=null?r>0:this.delay>0)return super.recycleAsyncId(t,n,r);let{actions:i}=t;n!=null&&((o=i[i.length-1])===null||o===void 0?void 0:o.id)!==n&&(Vo.clearImmediate(n),t._scheduled===n&&(t._scheduled=void 0))}};var Fr=class e{constructor(t,n=e.now){this.schedulerActionCtor=t,this.now=n}schedule(t,n=0,r){return new this.schedulerActionCtor(this,t).schedule(r,n)}};Fr.now=Lo.now;var pn=class extends Fr{constructor(t,n=Fr.now){super(t,n),this.actions=[],this._active=!1}flush(t){let{actions:n}=this;if(this._active){n.push(t);return}let r;this._active=!0;do if(r=t.execute(t.state,t.delay))break;while(t=n.shift());if(this._active=!1,r){for(;t=n.shift();)t.unsubscribe();throw r}}};var ds=class extends pn{flush(t){this._active=!0;let n=this._scheduled;this._scheduled=void 0;let{actions:r}=this,o;t=t||r.shift();do if(o=t.execute(t.state,t.delay))break;while((t=r[0])&&t.id===n&&r.shift());if(this._active=!1,o){for(;(t=r[0])&&t.id===n&&r.shift();)t.unsubscribe();throw o}}};var hE=new ds(ls);var Or=new pn(fn),Mc=Or;var fs=class extends fn{constructor(t,n){super(t,n),this.scheduler=t,this.work=n}requestAsyncId(t,n,r=0){return r!==null&&r>0?super.requestAsyncId(t,n,r):(t.actions.push(this),t._scheduled||(t._scheduled=Rr.requestAnimationFrame(()=>t.flush(void 0))))}recycleAsyncId(t,n,r=0){var o;if(r!=null?r>0:this.delay>0)return super.recycleAsyncId(t,n,r);let{actions:i}=t;n!=null&&n===t._scheduled&&((o=i[i.length-1])===null||o===void 0?void 0:o.id)!==n&&(Rr.cancelAnimationFrame(n),t._scheduled=void 0)}};var ps=class extends pn{flush(t){this._active=!0;let n;t?n=t.id:(n=this._scheduled,this._scheduled=void 0);let{actions:r}=this,o;t=t||r.shift();do if(o=t.execute(t.state,t.delay))break;while((t=r[0])&&t.id===n&&r.shift());if(this._active=!1,o){for(;(t=r[0])&&t.id===n&&r.shift();)t.unsubscribe();throw o}}};var gE=new ps(fs);var Bt=new B(e=>e.complete());function hs(e){return e&&R(e.schedule)}function Ac(e){return e[e.length-1]}function hn(e){return R(Ac(e))?e.pop():void 0}function Et(e){return hs(Ac(e))?e.pop():void 0}function _0(e,t){return typeof Ac(e)=="number"?e.pop():t}function E3(e,t,n,r){var o=arguments.length,i=o<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(e,t,n,r);else for(var u=e.length-1;u>=0;u--)(s=e[u])&&(i=(o<3?s(i):o>3?s(t,n,i):s(t,n))||i);return o>3&&i&&Object.defineProperty(t,n,i),i}function x0(e,t,n,r){function o(i){return i instanceof n?i:new n(function(s){s(i)})}return new(n||(n=Promise))(function(i,s){function u(l){try{c(r.next(l))}catch(d){s(d)}}function a(l){try{c(r.throw(l))}catch(d){s(d)}}function c(l){l.done?i(l.value):o(l.value).then(u,a)}c((r=r.apply(e,t||[])).next())})}function w0(e){var t=typeof Symbol=="function"&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&typeof e.length=="number")return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function $n(e){return this instanceof $n?(this.v=e,this):new $n(e)}function I0(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r=n.apply(e,t||[]),o,i=[];return o=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),u("next"),u("throw"),u("return",s),o[Symbol.asyncIterator]=function(){return this},o;function s(f){return function(p){return Promise.resolve(p).then(f,d)}}function u(f,p){r[f]&&(o[f]=function(m){return new Promise(function(g,y){i.push([f,m,g,y])>1||a(f,m)})},p&&(o[f]=p(o[f])))}function a(f,p){try{c(r[f](p))}catch(m){h(i[0][3],m)}}function c(f){f.value instanceof $n?Promise.resolve(f.value.v).then(l,d):h(i[0][2],f)}function l(f){a("next",f)}function d(f){a("throw",f)}function h(f,p){f(p),i.shift(),i.length&&a(i[0][0],i[0][1])}}function T0(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],n;return t?t.call(e):(e=typeof w0=="function"?w0(e):e[Symbol.iterator](),n={},r("next"),r("throw"),r("return"),n[Symbol.asyncIterator]=function(){return this},n);function r(i){n[i]=e[i]&&function(s){return new Promise(function(u,a){s=e[i](s),o(u,a,s.done,s.value)})}}function o(i,s,u,a){Promise.resolve(a).then(function(c){i({value:c,done:u})},s)}}var Pr=e=>e&&typeof e.length=="number"&&typeof e!="function";function gs(e){return R(e?.then)}function ms(e){return R(e[kr])}function ys(e){return Symbol.asyncIterator&&R(e?.[Symbol.asyncIterator])}function bs(e){return new TypeError(`You provided ${e!==null&&typeof e=="object"?"an invalid object":`'${e}'`} where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`)}function mE(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var vs=mE();function Ds(e){return R(e?.[vs])}function Es(e){return I0(this,arguments,function*(){let n=e.getReader();try{for(;;){let{value:r,done:o}=yield $n(n.read());if(o)return yield $n(void 0);yield yield $n(r)}}finally{n.releaseLock()}})}function Cs(e){return R(e?.getReader)}function z(e){if(e instanceof B)return e;if(e!=null){if(ms(e))return yE(e);if(Pr(e))return bE(e);if(gs(e))return vE(e);if(ys(e))return S0(e);if(Ds(e))return DE(e);if(Cs(e))return EE(e)}throw bs(e)}function yE(e){return new B(t=>{let n=e[kr]();if(R(n.subscribe))return n.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function bE(e){return new B(t=>{for(let n=0;n{e.then(n=>{t.closed||(t.next(n),t.complete())},n=>t.error(n)).then(null,ss)})}function DE(e){return new B(t=>{for(let n of e)if(t.next(n),t.closed)return;t.complete()})}function S0(e){return new B(t=>{CE(e,t).catch(n=>t.error(n))})}function EE(e){return S0(Es(e))}function CE(e,t){var n,r,o,i;return x0(this,void 0,void 0,function*(){try{for(n=T0(e);r=yield n.next(),!r.done;){let s=r.value;if(t.next(s),t.closed)return}}catch(s){o={error:s}}finally{try{r&&!r.done&&(i=n.return)&&(yield i.call(n))}finally{if(o)throw o.error}}t.complete()})}function Fe(e,t,n,r=0,o=!1){let i=t.schedule(function(){n(),o?e.add(this.schedule(null,r)):this.unsubscribe()},r);if(e.add(i),!o)return i}function Ho(e,t=0){return j((n,r)=>{n.subscribe(F(r,o=>Fe(r,e,()=>r.next(o),t),()=>Fe(r,e,()=>r.complete(),t),o=>Fe(r,e,()=>r.error(o),t)))})}function _s(e,t=0){return j((n,r)=>{r.add(e.schedule(()=>n.subscribe(r),t))})}function M0(e,t){return z(e).pipe(_s(t),Ho(t))}function A0(e,t){return z(e).pipe(_s(t),Ho(t))}function N0(e,t){return new B(n=>{let r=0;return t.schedule(function(){r===e.length?n.complete():(n.next(e[r++]),n.closed||this.schedule())})})}function k0(e,t){return new B(n=>{let r;return Fe(n,t,()=>{r=e[vs](),Fe(n,t,()=>{let o,i;try{({value:o,done:i}=r.next())}catch(s){n.error(s);return}i?n.complete():n.next(o)},0,!0)}),()=>R(r?.return)&&r.return()})}function ws(e,t){if(!e)throw new Error("Iterable cannot be null");return new B(n=>{Fe(n,t,()=>{let r=e[Symbol.asyncIterator]();Fe(n,t,()=>{r.next().then(o=>{o.done?n.complete():n.next(o.value)})},0,!0)})})}function R0(e,t){return ws(Es(e),t)}function F0(e,t){if(e!=null){if(ms(e))return M0(e,t);if(Pr(e))return N0(e,t);if(gs(e))return A0(e,t);if(ys(e))return ws(e,t);if(Ds(e))return k0(e,t);if(Cs(e))return R0(e,t)}throw bs(e)}function Ct(e,t){return t?F0(e,t):z(e)}function xs(...e){let t=Et(e);return Ct(e,t)}function _E(e,t){let n=R(e)?e:()=>e,r=o=>o.error(n());return new B(t?o=>t.schedule(r,0,o):r)}function wE(e){return!!e&&(e instanceof B||R(e.lift)&&R(e.subscribe))}var Un=Mr(e=>function(){e(this),this.name="EmptyError",this.message="no elements in sequence"});function Nc(e,t){let n=typeof t=="object";return new Promise((r,o)=>{let i=new tt({next:s=>{r(s),i.unsubscribe()},error:o,complete:()=>{n?r(t.defaultValue):o(new Un)}});e.subscribe(i)})}function O0(e){return e instanceof Date&&!isNaN(e)}function Se(e,t){return j((n,r)=>{let o=0;n.subscribe(F(r,i=>{r.next(e.call(t,i,o++))}))})}var{isArray:xE}=Array;function IE(e,t){return xE(t)?e(...t):e(t)}function Lr(e){return Se(t=>IE(e,t))}var{isArray:TE}=Array,{getPrototypeOf:SE,prototype:ME,keys:AE}=Object;function Is(e){if(e.length===1){let t=e[0];if(TE(t))return{args:t,keys:null};if(NE(t)){let n=AE(t);return{args:n.map(r=>t[r]),keys:n}}}return{args:e,keys:null}}function NE(e){return e&&typeof e=="object"&&SE(e)===ME}function Ts(e,t){return e.reduce((n,r,o)=>(n[r]=t[o],n),{})}function kE(...e){let t=Et(e),n=hn(e),{args:r,keys:o}=Is(e);if(r.length===0)return Ct([],t);let i=new B(RE(r,t,o?s=>Ts(o,s):Te));return n?i.pipe(Lr(n)):i}function RE(e,t,n=Te){return r=>{P0(t,()=>{let{length:o}=e,i=new Array(o),s=o,u=o;for(let a=0;a{let c=Ct(e[a],t),l=!1;c.subscribe(F(r,d=>{i[a]=d,l||(l=!0,u--),u||r.next(n(i.slice()))},()=>{--s||r.complete()}))},r)},r)}}function P0(e,t,n){e?Fe(n,e,t):t()}function L0(e,t,n,r,o,i,s,u){let a=[],c=0,l=0,d=!1,h=()=>{d&&!a.length&&!c&&t.complete()},f=m=>c{i&&t.next(m),c++;let g=!1;z(n(m,l++)).subscribe(F(t,y=>{o?.(y),i?f(y):t.next(y)},()=>{g=!0},void 0,()=>{if(g)try{for(c--;a.length&&cp(y)):p(y)}h()}catch(y){t.error(y)}}))};return e.subscribe(F(t,f,()=>{d=!0,h()})),()=>{u?.()}}function Vt(e,t,n=1/0){return R(t)?Vt((r,o)=>Se((i,s)=>t(r,i,o,s))(z(e(r,o))),n):(typeof t=="number"&&(n=t),j((r,o)=>L0(r,o,e,n)))}function $o(e=1/0){return Vt(Te,e)}function j0(){return $o(1)}function Ss(...e){return j0()(Ct(e,Et(e)))}function FE(e){return new B(t=>{z(e()).subscribe(t)})}function OE(...e){let t=hn(e),{args:n,keys:r}=Is(e),o=new B(i=>{let{length:s}=n;if(!s){i.complete();return}let u=new Array(s),a=s,c=s;for(let l=0;l{d||(d=!0,c--),u[l]=h},()=>a--,void 0,()=>{(!a||!d)&&(c||i.next(r?Ts(r,u):u),i.complete())}))}});return t?o.pipe(Lr(t)):o}var PE=["addListener","removeListener"],LE=["addEventListener","removeEventListener"],jE=["on","off"];function kc(e,t,n,r){if(R(n)&&(r=n,n=void 0),r)return kc(e,t,n).pipe(Lr(r));let[o,i]=HE(e)?LE.map(s=>u=>e[s](t,u,n)):BE(e)?PE.map(B0(e,t)):VE(e)?jE.map(B0(e,t)):[];if(!o&&Pr(e))return Vt(s=>kc(s,t,n))(z(e));if(!o)throw new TypeError("Invalid event target");return new B(s=>{let u=(...a)=>s.next(1i(u)})}function B0(e,t){return n=>r=>e[n](t,r)}function BE(e){return R(e.addListener)&&R(e.removeListener)}function VE(e){return R(e.on)&&R(e.off)}function HE(e){return R(e.addEventListener)&&R(e.removeEventListener)}function Rc(e=0,t,n=Mc){let r=-1;return t!=null&&(hs(t)?n=t:r=t),new B(o=>{let i=O0(e)?+e-n.now():e;i<0&&(i=0);let s=0;return n.schedule(function(){o.closed||(o.next(s++),0<=r?this.schedule(void 0,r):o.complete())},i)})}function $E(...e){let t=Et(e),n=_0(e,1/0),r=e;return r.length?r.length===1?z(r[0]):$o(n)(Ct(r,t)):Bt}var UE=new B(jt);var{isArray:zE}=Array;function V0(e){return e.length===1&&zE(e[0])?e[0]:e}function gn(e,t){return j((n,r)=>{let o=0;n.subscribe(F(r,i=>e.call(t,i,o++)&&r.next(i)))})}function qE(...e){let t=hn(e),n=V0(e);return n.length?new B(r=>{let o=n.map(()=>[]),i=n.map(()=>!1);r.add(()=>{o=i=null});for(let s=0;!r.closed&&s{if(o[s].push(u),o.every(a=>a.length)){let a=o.map(c=>c.shift());r.next(t?t(...a):a),o.some((c,l)=>!c.length&&i[l])&&r.complete()}},()=>{i[s]=!0,!o[s].length&&r.complete()}));return()=>{o=i=null}}):Bt}function H0(e){return j((t,n)=>{let r=!1,o=null,i=null,s=!1,u=()=>{if(i?.unsubscribe(),i=null,r){r=!1;let c=o;o=null,n.next(c)}s&&n.complete()},a=()=>{i=null,s&&n.complete()};t.subscribe(F(n,c=>{r=!0,o=c,i||z(e(c)).subscribe(i=F(n,u,a))},()=>{s=!0,(!r||!i||i.closed)&&n.complete()}))})}function GE(e,t=Or){return H0(()=>Rc(e,t))}function Fc(e){return j((t,n)=>{let r=null,o=!1,i;r=t.subscribe(F(n,void 0,void 0,s=>{i=z(e(s,Fc(e)(t))),r?(r.unsubscribe(),r=null,i.subscribe(n)):o=!0})),o&&(r.unsubscribe(),r=null,i.subscribe(n))})}function Oc(e,t){return R(t)?Vt(e,t,1):Vt(e,1)}function $0(e,t=Or){return j((n,r)=>{let o=null,i=null,s=null,u=()=>{if(o){o.unsubscribe(),o=null;let c=i;i=null,r.next(c)}};function a(){let c=s+e,l=t.now();if(l{i=c,s=t.now(),o||(o=t.schedule(a,e),r.add(o))},()=>{u(),r.complete()},void 0,()=>{i=o=null}))})}function U0(e){return j((t,n)=>{let r=!1;t.subscribe(F(n,o=>{r=!0,n.next(o)},()=>{r||n.next(e),n.complete()}))})}function Pc(e){return e<=0?()=>Bt:j((t,n)=>{let r=0;t.subscribe(F(n,o=>{++r<=e&&(n.next(o),e<=r&&n.complete())}))})}function WE(e){return Se(()=>e)}function z0(e,t=Te){return e=e??ZE,j((n,r)=>{let o,i=!0;n.subscribe(F(r,s=>{let u=t(s);(i||!e(o,u))&&(i=!1,o=u,r.next(s))}))})}function ZE(e,t){return e===t}function q0(e=YE){return j((t,n)=>{let r=!1;t.subscribe(F(n,o=>{r=!0,n.next(o)},()=>r?n.complete():n.error(e())))})}function YE(){return new Un}function Ms(e){return j((t,n)=>{try{t.subscribe(n)}finally{n.add(e)}})}function QE(e,t){let n=arguments.length>=2;return r=>r.pipe(e?gn((o,i)=>e(o,i,r)):Te,Pc(1),n?U0(t):q0(()=>new Un))}function KE(e){return e<=0?()=>Bt:j((t,n)=>{let r=[];t.subscribe(F(n,o=>{r.push(o),e{for(let o of r)n.next(o);n.complete()},void 0,()=>{r=null}))})}function G0(){return j((e,t)=>{let n,r=!1;e.subscribe(F(t,o=>{let i=n;n=o,r&&t.next([i,o]),r=!0}))})}function As(e={}){let{connector:t=()=>new he,resetOnError:n=!0,resetOnComplete:r=!0,resetOnRefCountZero:o=!0}=e;return i=>{let s,u,a,c=0,l=!1,d=!1,h=()=>{u?.unsubscribe(),u=void 0},f=()=>{h(),s=a=void 0,l=d=!1},p=()=>{let m=s;f(),m?.unsubscribe()};return j((m,g)=>{c++,!d&&!l&&h();let y=a=a??t();g.add(()=>{c--,c===0&&!d&&!l&&(u=Lc(p,o))}),y.subscribe(g),!s&&c>0&&(s=new tt({next:v=>y.next(v),error:v=>{d=!0,h(),u=Lc(f,n,v),y.error(v)},complete:()=>{l=!0,h(),u=Lc(f,r),y.complete()}}),z(m).subscribe(s))})(i)}}function Lc(e,t,...n){if(t===!0){e();return}if(t===!1)return;let r=new tt({next:()=>{r.unsubscribe(),e()}});return z(t(...n)).subscribe(r)}function W0(e,t,n){let r,o=!1;return e&&typeof e=="object"?{bufferSize:r=1/0,windowTime:t=1/0,refCount:o=!1,scheduler:n}=e:r=e??1/0,As({connector:()=>new jo(r,t,n),resetOnError:!0,resetOnComplete:!1,resetOnRefCountZero:o})}function Z0(e){return gn((t,n)=>e<=n)}function Y0(...e){let t=Et(e);return j((n,r)=>{(t?Ss(e,n,t):Ss(e,n)).subscribe(r)})}function Ns(e,t){return j((n,r)=>{let o=null,i=0,s=!1,u=()=>s&&!o&&r.complete();n.subscribe(F(r,a=>{o?.unsubscribe();let c=0,l=i++;z(e(a,l)).subscribe(o=F(r,d=>r.next(t?t(a,d,l,c++):d),()=>{o=null,u()}))},()=>{s=!0,u()}))})}function JE(e){return j((t,n)=>{z(e).subscribe(F(n,()=>n.complete(),jt)),!n.closed&&t.subscribe(n)})}function XE(e,t=!1){return j((n,r)=>{let o=0;n.subscribe(F(r,i=>{let s=e(i,o++);(s||t)&&r.next(i),!s&&r.complete()}))})}function Q0(e,t,n){let r=R(e)||t||n?{next:e,error:t,complete:n}:e;return r?j((o,i)=>{var s;(s=r.subscribe)===null||s===void 0||s.call(r);let u=!0;o.subscribe(F(i,a=>{var c;(c=r.next)===null||c===void 0||c.call(r,a),i.next(a)},()=>{var a;u=!1,(a=r.complete)===null||a===void 0||a.call(r),i.complete()},a=>{var c;u=!1,(c=r.error)===null||c===void 0||c.call(r,a),i.error(a)},()=>{var a,c;u&&((a=r.unsubscribe)===null||a===void 0||a.call(r)),(c=r.finalize)===null||c===void 0||c.call(r)}))}):Te}function eC(...e){let t=hn(e);return j((n,r)=>{let o=e.length,i=new Array(o),s=e.map(()=>!1),u=!1;for(let a=0;a{i[a]=c,!u&&!s[a]&&(s[a]=!0,(u=s.every(Te))&&(s=null))},jt));n.subscribe(F(r,a=>{if(u){let c=[a,...i];r.next(t?t(...c):c)}}))})}var jc;function ks(){return jc}function _t(e){let t=jc;return jc=e,t}var K0=Symbol("NotFound");function jr(e){return e===K0||e?.name==="\u0275NotFound"}function Bc(e,t,n){let r=Object.create(tC);r.source=e,r.computation=t,n!=null&&(r.equal=n);let i=()=>{if(Ln(r),cn(r),r.value===Dt)throw r.error;return r.value};return i[se]=r,ko(r),i}function J0(e,t){Ln(e),jn(e,t),Ir(e)}function X0(e,t){if(Ln(e),e.value===Dt)throw e.error;rs(e,t),Ir(e)}var tC=P(M({},an),{value:un,dirty:!0,error:null,equal:Ro,kind:"linkedSignal",producerMustRecompute(e){return e.value===un||e.value===Pn},producerRecomputeValue(e){if(e.value===Pn)throw new Error("");let t=e.value;e.value=Pn;let n=Lt(e),r;try{let o=e.source(),i=t===un||t===Dt?void 0:{source:e.sourceValue,value:t};r=e.computation(o,i),e.sourceValue=o}catch(o){r=Dt,e.error=o}finally{ln(e,n)}if(t!==un&&r!==Dt&&e.equal(t,r)){e.value=t;return}e.value=r,e.version++}});function eg(e){let t=I(null);try{return e()}finally{I(t)}}var Bs="https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss",D=class extends Error{code;constructor(t,n){super(xt(t,n)),this.code=t}};function nC(e){return`NG0${Math.abs(e)}`}function xt(e,t){return`${nC(e)}${t?": "+t:""}`}var fe=globalThis;function W(e){for(let t in e)if(e[t]===W)return t;throw Error("")}function ig(e,t){for(let n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n])}function Yo(e){if(typeof e=="string")return e;if(Array.isArray(e))return`[${e.map(Yo).join(", ")}]`;if(e==null)return""+e;let t=e.overriddenName||e.name;if(t)return`${t}`;let n=e.toString();if(n==null)return""+n;let r=n.indexOf(` `);return r>=0?n.slice(0,r):n}function Vs(e,t){return e?t?`${e} ${t}`:e:t||""}var rC=W({__forward_ref__:W});function Hs(e){return e.__forward_ref__=Hs,e}function le(e){return Jc(e)?e():e}function Jc(e){return typeof e=="function"&&e.hasOwnProperty(rC)&&e.__forward_ref__===Hs}function T(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function It(e){return{providers:e.providers||[],imports:e.imports||[]}}function Qo(e){return iC(e,$s)}function oC(e){return Qo(e)!==null}function iC(e,t){return e.hasOwnProperty(t)&&e[t]||null}function sC(e){let t=e?.[$s]??null;return t||null}function Hc(e){return e&&e.hasOwnProperty(Fs)?e[Fs]:null}var $s=W({\u0275prov:W}),Fs=W({\u0275inj:W}),x=class{_desc;ngMetadataName="InjectionToken";\u0275prov;constructor(t,n){this._desc=t,this.\u0275prov=void 0,typeof n=="number"?this.__NG_ELEMENT_ID__=n:n!==void 0&&(this.\u0275prov=T({token:this,providedIn:n.providedIn||"root",factory:n.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function Xc(e){return e&&!!e.\u0275providers}var el=W({\u0275cmp:W}),tl=W({\u0275dir:W}),nl=W({\u0275pipe:W}),rl=W({\u0275mod:W}),zo=W({\u0275fac:W}),Zn=W({__NG_ELEMENT_ID__:W}),tg=W({__NG_ENV_ID__:W});function ol(e){return zs(e,"@NgModule"),e[rl]||null}function Tt(e){return zs(e,"@Component"),e[el]||null}function Us(e){return zs(e,"@Directive"),e[tl]||null}function sg(e){return zs(e,"@Pipe"),e[nl]||null}function zs(e,t){if(e==null)throw new D(-919,!1)}function vn(e){return typeof e=="string"?e:e==null?"":String(e)}var ug=W({ngErrorCode:W}),uC=W({ngErrorMessage:W}),aC=W({ngTokenPath:W});function il(e,t){return ag("",-200,t)}function qs(e,t){throw new D(-201,!1)}function ag(e,t,n){let r=new D(t,e);return r[ug]=t,r[uC]=e,n&&(r[aC]=n),r}function cC(e){return e[ug]}var $c;function cg(){return $c}function Me(e){let t=$c;return $c=e,t}function sl(e,t,n){let r=Qo(e);if(r&&r.providedIn=="root")return r.value===void 0?r.value=r.factory():r.value;if(n&8)return null;if(t!==void 0)return t;qs(e,"")}var lC={},zn=lC,dC="__NG_DI_FLAG__",Uc=class{injector;constructor(t){this.injector=t}retrieve(t,n){let r=qn(n)||0;try{return this.injector.get(t,r&8?null:zn,r)}catch(o){if(jr(o))return o;throw o}}};function fC(e,t=0){let n=ks();if(n===void 0)throw new D(-203,!1);if(n===null)return sl(e,void 0,t);{let r=pC(t),o=n.retrieve(e,r);if(jr(o)){if(r.optional)return null;throw o}return o}}function A(e,t=0){return(cg()||fC)(le(e),t)}function b(e,t){return A(e,qn(t))}function qn(e){return typeof e>"u"||typeof e=="number"?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function pC(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function zc(e){let t=[];for(let n=0;nArray.isArray(n)?Gs(n,t):t(n))}function ul(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function Ko(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function fg(e,t){let n=[];for(let r=0;rt;){let i=o-2;e[o]=e[i],o--}e[t]=n,e[t+1]=r}}function Jo(e,t,n){let r=Vr(e,t);return r>=0?e[r|1]=n:(r=~r,pg(e,r,t,n)),r}function Ws(e,t){let n=Vr(e,t);if(n>=0)return e[n|1]}function Vr(e,t){return gC(e,t,1)}function gC(e,t,n){let r=0,o=e.length>>n;for(;o!==r;){let i=r+(o-r>>1),s=e[i<t?o=i:r=i+1}return~(o<{n.push(s)};return Gs(t,s=>{let u=s;Os(u,i,[],r)&&(o||=[],o.push(u))}),o!==void 0&&gg(o,i),n}function gg(e,t){for(let n=0;n{t(i,r)})}}function Os(e,t,n,r){if(e=le(e),!e)return!1;let o=null,i=Hc(e),s=!i&&Tt(e);if(!i&&!s){let a=e.ngModule;if(i=Hc(a),i)o=a;else return!1}else{if(s&&!s.standalone)return!1;o=e}let u=r.has(o);if(s){if(u)return!1;if(r.add(o),s.dependencies){let a=typeof s.dependencies=="function"?s.dependencies():s.dependencies;for(let c of a)Os(c,t,n,r)}}else if(i){if(i.imports!=null&&!u){r.add(o);let c;Gs(i.imports,l=>{Os(l,t,n,r)&&(c||=[],c.push(l))}),c!==void 0&&gg(c,t)}if(!u){let c=mn(o)||(()=>new o);t({provide:o,useFactory:c,deps:Ee},o),t({provide:cl,useValue:o,multi:!0},o),t({provide:Hr,useValue:()=>A(o),multi:!0},o)}let a=i.providers;if(a!=null&&!u){let c=e;dl(a,l=>{t(l,c)})}}else return!1;return o!==e&&e.providers!==void 0}function dl(e,t){for(let n of e)Xc(n)&&(n=n.\u0275providers),Array.isArray(n)?dl(n,t):t(n)}var mC=W({provide:String,useValue:W});function mg(e){return e!==null&&typeof e=="object"&&mC in e}function yC(e){return!!(e&&e.useExisting)}function bC(e){return!!(e&&e.useFactory)}function Gn(e){return typeof e=="function"}function yg(e){return!!e.useClass}var Xo=new x(""),Rs={},ng={},Vc;function $r(){return Vc===void 0&&(Vc=new qo),Vc}var Ae=class{},Wn=class extends Ae{parent;source;scopes;records=new Map;_ngOnDestroyHooks=new Set;_onDestroyHooks=[];get destroyed(){return this._destroyed}_destroyed=!1;injectorDefTypes;constructor(t,n,r,o){super(),this.parent=n,this.source=r,this.scopes=o,Gc(t,s=>this.processProvider(s)),this.records.set(al,Br(void 0,this)),o.has("environment")&&this.records.set(Ae,Br(void 0,this));let i=this.records.get(Xo);i!=null&&typeof i.value=="string"&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(cl,Ee,{self:!0}))}retrieve(t,n){let r=qn(n)||0;try{return this.get(t,zn,r)}catch(o){if(jr(o))return o;throw o}}destroy(){Uo(this),this._destroyed=!0;let t=I(null);try{for(let r of this._ngOnDestroyHooks)r.ngOnDestroy();let n=this._onDestroyHooks;this._onDestroyHooks=[];for(let r of n)r()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),I(t)}}onDestroy(t){return Uo(this),this._onDestroyHooks.push(t),()=>this.removeOnDestroy(t)}runInContext(t){Uo(this);let n=_t(this),r=Me(void 0),o;try{return t()}finally{_t(n),Me(r)}}get(t,n=zn,r){if(Uo(this),t.hasOwnProperty(tg))return t[tg](this);let o=qn(r),i,s=_t(this),u=Me(void 0);try{if(!(o&4)){let c=this.records.get(t);if(c===void 0){let l=_C(t)&&Qo(t);l&&this.injectableDefInScope(l)?c=Br(qc(t),Rs):c=null,this.records.set(t,c)}if(c!=null)return this.hydrate(t,c,o)}let a=o&2?$r():this.parent;return n=o&8&&n===zn?null:n,a.get(t,n)}catch(a){let c=cC(a);throw c===-200||c===-201?new D(c,null):a}finally{Me(u),_t(s)}}resolveInjectorInitializers(){let t=I(null),n=_t(this),r=Me(void 0),o;try{let i=this.get(Hr,Ee,{self:!0});for(let s of i)s()}finally{_t(n),Me(r),I(t)}}toString(){return"R3Injector[...]"}processProvider(t){t=le(t);let n=Gn(t)?t:le(t&&t.provide),r=DC(t);if(!Gn(t)&&t.multi===!0){let o=this.records.get(n);o||(o=Br(void 0,Rs,!0),o.factory=()=>zc(o.multi),this.records.set(n,o)),n=t,o.multi.push(t)}this.records.set(n,r)}hydrate(t,n,r){let o=I(null);try{if(n.value===ng)throw il("");return n.value===Rs&&(n.value=ng,n.value=n.factory(void 0,r)),typeof n.value=="object"&&n.value&&CC(n.value)&&this._ngOnDestroyHooks.add(n.value),n.value}finally{I(o)}}injectableDefInScope(t){if(!t.providedIn)return!1;let n=le(t.providedIn);return typeof n=="string"?n==="any"||this.scopes.has(n):this.injectorDefTypes.has(n)}removeOnDestroy(t){let n=this._onDestroyHooks.indexOf(t);n!==-1&&this._onDestroyHooks.splice(n,1)}};function qc(e){let t=Qo(e),n=t!==null?t.factory:mn(e);if(n!==null)return n;if(e instanceof x)throw new D(-204,!1);if(e instanceof Function)return vC(e);throw new D(-204,!1)}function vC(e){if(e.length>0)throw new D(-204,!1);let n=sC(e);return n!==null?()=>n.factory(e):()=>new e}function DC(e){if(mg(e))return Br(void 0,e.useValue);{let t=fl(e);return Br(t,Rs)}}function fl(e,t,n){let r;if(Gn(e)){let o=le(e);return mn(o)||qc(o)}else if(mg(e))r=()=>le(e.useValue);else if(bC(e))r=()=>e.useFactory(...zc(e.deps||[]));else if(yC(e))r=(o,i)=>A(le(e.useExisting),i!==void 0&&i&8?8:void 0);else{let o=le(e&&(e.useClass||e.provide));if(EC(e))r=()=>new o(...zc(e.deps));else return mn(o)||qc(o)}return r}function Uo(e){if(e.destroyed)throw new D(-205,!1)}function Br(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function EC(e){return!!e.deps}function CC(e){return e!==null&&typeof e=="object"&&typeof e.ngOnDestroy=="function"}function _C(e){return typeof e=="function"||typeof e=="object"&&e.ngMetadataName==="InjectionToken"}function Gc(e,t){for(let n of e)Array.isArray(n)?Gc(n,t):n&&Xc(n)?Gc(n.\u0275providers,t):t(n)}function Ur(e,t){let n;e instanceof Wn?(Uo(e),n=e):n=new Uc(e);let r,o=_t(n),i=Me(void 0);try{return t()}finally{_t(o),Me(i)}}function Zs(){return cg()!==void 0||ks()!=null}function wC(e){if(!Zs())throw new D(-203,!1)}var rt=0,S=1,L=2,de=3,Ze=4,Ne=5,Qn=6,zr=7,re=8,Ut=9,ot=10,Z=11,qr=12,pl=13,Kn=14,_e=15,Dn=16,Jn=17,St=18,zt=19,hl=20,$t=21,Ys=22,yn=23,Be=24,Xn=25,En=26,K=27,bg=1,gl=6,Cn=7,ei=8,er=9,oe=10;function qt(e){return Array.isArray(e)&&typeof e[bg]=="object"}function it(e){return Array.isArray(e)&&e[bg]===!0}function ml(e){return(e.flags&4)!==0}function Mt(e){return e.componentOffset>-1}function Gr(e){return(e.flags&1)===1}function st(e){return!!e.template}function Wr(e){return(e[L]&512)!==0}function tr(e){return(e[L]&256)===256}var yl="svg",vg="math";function Ye(e){for(;Array.isArray(e);)e=e[rt];return e}function bl(e,t){return Ye(t[e])}function Qe(e,t){return Ye(t[e.index])}function Qs(e,t){return e.data[t]}function ti(e,t){return e[t]}function ni(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function Ve(e,t){let n=t[e];return qt(n)?n:n[rt]}function Dg(e){return(e[L]&4)===4}function Ks(e){return(e[L]&128)===128}function Eg(e){return it(e[de])}function He(e,t){return t==null?null:e[t]}function vl(e){e[Jn]=0}function Dl(e){e[L]&1024||(e[L]|=1024,Ks(e)&&nr(e))}function Cg(e,t){for(;e>0;)t=t[Kn],e--;return t}function ri(e){return!!(e[L]&9216||e[Be]?.dirty)}function Js(e){e[ot].changeDetectionScheduler?.notify(8),e[L]&64&&(e[L]|=1024),ri(e)&&nr(e)}function nr(e){e[ot].changeDetectionScheduler?.notify(0);let t=bn(e);for(;t!==null&&!(t[L]&8192||(t[L]|=8192,!Ks(t)));)t=bn(t)}function El(e,t){if(tr(e))throw new D(911,!1);e[$t]===null&&(e[$t]=[]),e[$t].push(t)}function _g(e,t){if(e[$t]===null)return;let n=e[$t].indexOf(t);n!==-1&&e[$t].splice(n,1)}function bn(e){let t=e[de];return it(t)?t[de]:t}function Cl(e){return e[zr]??=[]}function _l(e){return e.cleanup??=[]}function wg(e,t,n,r){let o=Cl(t);o.push(n),e.firstCreatePass&&_l(e).push(r,o.length-1)}var V={lFrame:Lg(null),bindingsEnabled:!0,skipHydrationRootTNode:null};var Wc=!1;function xg(){return V.lFrame.elementDepthCount}function Ig(){V.lFrame.elementDepthCount++}function wl(){V.lFrame.elementDepthCount--}function Xs(){return V.bindingsEnabled}function xl(){return V.skipHydrationRootTNode!==null}function Il(e){return V.skipHydrationRootTNode===e}function Tl(){V.skipHydrationRootTNode=null}function w(){return V.lFrame.lView}function G(){return V.lFrame.tView}function Tg(e){return V.lFrame.contextLView=e,e[re]}function Sg(e){return V.lFrame.contextLView=null,e}function ue(){let e=Sl();for(;e!==null&&e.type===64;)e=e.parent;return e}function Sl(){return V.lFrame.currentTNode}function Mg(){let e=V.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function rr(e,t){let n=V.lFrame;n.currentTNode=e,n.isParent=t}function Ml(){return V.lFrame.isParent}function Al(){V.lFrame.isParent=!1}function Nl(){return V.lFrame.contextLView}function kl(){return Wc}function Go(e){let t=Wc;return Wc=e,t}function Zr(){let e=V.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function Ag(){return V.lFrame.bindingIndex}function Ng(e){return V.lFrame.bindingIndex=e}function ut(){return V.lFrame.bindingIndex++}function eu(e){let t=V.lFrame,n=t.bindingIndex;return t.bindingIndex=t.bindingIndex+e,n}function kg(){return V.lFrame.inI18n}function Rg(e,t){let n=V.lFrame;n.bindingIndex=n.bindingRootIndex=e,tu(t)}function Fg(){return V.lFrame.currentDirectiveIndex}function tu(e){V.lFrame.currentDirectiveIndex=e}function Og(e){let t=V.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function nu(){return V.lFrame.currentQueryIndex}function oi(e){V.lFrame.currentQueryIndex=e}function xC(e){let t=e[S];return t.type===2?t.declTNode:t.type===1?e[Ne]:null}function Rl(e,t,n){if(n&4){let o=t,i=e;for(;o=o.parent,o===null&&!(n&1);)if(o=xC(i),o===null||(i=i[Kn],o.type&10))break;if(o===null)return!1;t=o,e=i}let r=V.lFrame=Pg();return r.currentTNode=t,r.lView=e,!0}function ru(e){let t=Pg(),n=e[S];V.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function Pg(){let e=V.lFrame,t=e===null?null:e.child;return t===null?Lg(e):t}function Lg(e){let t={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return e!==null&&(e.child=t),t}function jg(){let e=V.lFrame;return V.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var Fl=jg;function ou(){let e=jg();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function Bg(e){return(V.lFrame.contextLView=Cg(e,V.lFrame.contextLView))[re]}function at(){return V.lFrame.selectedIndex}function _n(e){V.lFrame.selectedIndex=e}function wn(){let e=V.lFrame;return Qs(e.tView,e.selectedIndex)}function Vg(){V.lFrame.currentNamespace=yl}function Hg(){IC()}function IC(){V.lFrame.currentNamespace=null}function $g(){return V.lFrame.currentNamespace}var Ug=!0;function iu(){return Ug}function ii(e){Ug=e}function Zc(e,t=null,n=null,r){let o=Ol(e,t,n,r);return o.resolveInjectorInitializers(),o}function Ol(e,t=null,n=null,r,o=new Set){let i=[n||Ee,hg(e)],s;return new Wn(i,t||$r(),s||null,o)}var me=class e{static THROW_IF_NOT_FOUND=zn;static NULL=new qo;static create(t,n){if(Array.isArray(t))return Zc({name:""},n,t,"");{let r=t.name??"";return Zc({name:r},t.parent,t.providers,r)}}static \u0275prov=T({token:e,providedIn:"any",factory:()=>A(al)});static __NG_ELEMENT_ID__=-1},X=new x(""),$e=(()=>{class e{static __NG_ELEMENT_ID__=TC;static __NG_ENV_ID__=n=>n}return e})(),Ps=class extends $e{_lView;constructor(t){super(),this._lView=t}get destroyed(){return tr(this._lView)}onDestroy(t){let n=this._lView;return El(n,t),()=>_g(n,t)}};function TC(){return new Ps(w())}var zg=!1,qg=new x(""),or=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new Po(!1);debugTaskTracker=b(qg,{optional:!0});get hasPendingTasks(){return this.destroyed?!1:this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new B(n=>{n.next(!1),n.complete()}):this.pendingTask}add(){!this.hasPendingTasks&&!this.destroyed&&this.pendingTask.next(!0);let n=this.taskId++;return this.pendingTasks.add(n),this.debugTaskTracker?.add(n),n}has(n){return this.pendingTasks.has(n)}remove(n){this.pendingTasks.delete(n),this.debugTaskTracker?.remove(n),this.pendingTasks.size===0&&this.hasPendingTasks&&this.pendingTask.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this.hasPendingTasks&&this.pendingTask.next(!1),this.destroyed=!0,this.pendingTask.unsubscribe()}static \u0275prov=T({token:e,providedIn:"root",factory:()=>new e})}return e})(),Yc=class extends he{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(t=!1){super(),this.__isAsync=t,Zs()&&(this.destroyRef=b($e,{optional:!0})??void 0,this.pendingTasks=b(or,{optional:!0})??void 0)}emit(t){let n=I(null);try{super.next(t)}finally{I(n)}}subscribe(t,n,r){let o=t,i=n||(()=>null),s=r;if(t&&typeof t=="object"){let a=t;o=a.next?.bind(a),i=a.error?.bind(a),s=a.complete?.bind(a)}this.__isAsync&&(i=this.wrapInTimeout(i),o&&(o=this.wrapInTimeout(o)),s&&(s=this.wrapInTimeout(s)));let u=super.subscribe({next:o,error:i,complete:s});return t instanceof ne&&t.add(u),u}wrapInTimeout(t){return n=>{let r=this.pendingTasks?.add();setTimeout(()=>{try{t(n)}finally{r!==void 0&&this.pendingTasks?.remove(r)}})}}},Ht=Yc;function Ls(...e){}function Pl(e){let t,n;function r(){e=Ls;try{n!==void 0&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(n),t!==void 0&&clearTimeout(t)}catch(o){}}return t=setTimeout(()=>{e(),r()}),typeof requestAnimationFrame=="function"&&(n=requestAnimationFrame(()=>{e(),r()})),()=>r()}function Gg(e){return queueMicrotask(()=>e()),()=>{e=Ls}}var Ll="isAngularZone",Wo=Ll+"_ID",SC=0,Ce=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Ht(!1);onMicrotaskEmpty=new Ht(!1);onStable=new Ht(!1);onError=new Ht(!1);constructor(t){let{enableLongStackTrace:n=!1,shouldCoalesceEventChangeDetection:r=!1,shouldCoalesceRunChangeDetection:o=!1,scheduleInRootZone:i=zg}=t;if(typeof Zone>"u")throw new D(908,!1);Zone.assertZonePatched();let s=this;s._nesting=0,s._outer=s._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(s._inner=s._inner.fork(new Zone.TaskTrackingZoneSpec)),n&&Zone.longStackTraceZoneSpec&&(s._inner=s._inner.fork(Zone.longStackTraceZoneSpec)),s.shouldCoalesceEventChangeDetection=!o&&r,s.shouldCoalesceRunChangeDetection=o,s.callbackScheduled=!1,s.scheduleInRootZone=i,NC(s)}static isInAngularZone(){return typeof Zone<"u"&&Zone.current.get(Ll)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new D(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new D(909,!1)}run(t,n,r){return this._inner.run(t,n,r)}runTask(t,n,r,o){let i=this._inner,s=i.scheduleEventTask("NgZoneEvent: "+o,t,MC,Ls,Ls);try{return i.runTask(s,n,r)}finally{i.cancelTask(s)}}runGuarded(t,n,r){return this._inner.runGuarded(t,n,r)}runOutsideAngular(t){return this._outer.run(t)}},MC={};function jl(e){if(e._nesting==0&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function AC(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){Pl(()=>{e.callbackScheduled=!1,Qc(e),e.isCheckStableRunning=!0,jl(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),Qc(e)}function NC(e){let t=()=>{AC(e)},n=SC++;e._inner=e._inner.fork({name:"angular",properties:{[Ll]:!0,[Wo]:n,[Wo+n]:!0},onInvokeTask:(r,o,i,s,u,a)=>{if(kC(a))return r.invokeTask(i,s,u,a);try{return rg(e),r.invokeTask(i,s,u,a)}finally{(e.shouldCoalesceEventChangeDetection&&s.type==="eventTask"||e.shouldCoalesceRunChangeDetection)&&t(),og(e)}},onInvoke:(r,o,i,s,u,a,c)=>{try{return rg(e),r.invoke(i,s,u,a,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!RC(a)&&t(),og(e)}},onHasTask:(r,o,i,s)=>{r.hasTask(i,s),o===i&&(s.change=="microTask"?(e._hasPendingMicrotasks=s.microTask,Qc(e),jl(e)):s.change=="macroTask"&&(e.hasPendingMacrotasks=s.macroTask))},onHandleError:(r,o,i,s)=>(r.handleError(i,s),e.runOutsideAngular(()=>e.onError.emit(s)),!1)})}function Qc(e){e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0?e.hasPendingMicrotasks=!0:e.hasPendingMicrotasks=!1}function rg(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function og(e){e._nesting--,jl(e)}var Zo=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Ht;onMicrotaskEmpty=new Ht;onStable=new Ht;onError=new Ht;run(t,n,r){return t.apply(n,r)}runGuarded(t,n,r){return t.apply(n,r)}runOutsideAngular(t){return t()}runTask(t,n,r,o){return t.apply(n,r)}};function kC(e){return Wg(e,"__ignore_ng_zone__")}function RC(e){return Wg(e,"__scheduler_tick__")}function Wg(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var We=class{_console=console;handleError(t){this._console.error("ERROR",t)}},Gt=new x("",{factory:()=>{let e=b(Ce),t=b(Ae),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(We),n.handleError(r))})}}}),Zg={provide:Hr,useValue:()=>{let e=b(We,{optional:!0})},multi:!0};function xn(e,t){let[n,r,o]=gc(e,t?.equal),i=n,s=i[se];return i.set=r,i.update=o,i.asReadonly=si.bind(i),i}function si(){let e=this[se];if(e.readonlyFn===void 0){let t=()=>this();t[se]=e,e.readonlyFn=t}return e.readonlyFn}var Yr=(()=>{class e{view;node;constructor(n,r){this.view=n,this.node=r}static __NG_ELEMENT_ID__=FC}return e})();function FC(){return new Yr(w(),ue())}var wt=class{},ui=new x("",{factory:()=>!0});var Bl=new x(""),ir=(()=>{class e{internalPendingTasks=b(or);scheduler=b(wt);errorHandler=b(Gt);add(){let n=this.internalPendingTasks.add();return()=>{this.internalPendingTasks.has(n)&&(this.scheduler.notify(11),this.internalPendingTasks.remove(n))}}run(n){let r=this.add();n().catch(this.errorHandler).finally(r)}static \u0275prov=T({token:e,providedIn:"root",factory:()=>new e})}return e})(),su=(()=>{class e{static \u0275prov=T({token:e,providedIn:"root",factory:()=>new Kc})}return e})(),Kc=class{dirtyEffectCount=0;queues=new Map;add(t){this.enqueue(t),this.schedule(t)}schedule(t){t.dirty&&this.dirtyEffectCount++}remove(t){let n=t.zone,r=this.queues.get(n);r.has(t)&&(r.delete(t),t.dirty&&this.dirtyEffectCount--)}enqueue(t){let n=t.zone;this.queues.has(n)||this.queues.set(n,new Set);let r=this.queues.get(n);r.has(t)||r.add(t)}flush(){for(;this.dirtyEffectCount>0;){let t=!1;for(let[n,r]of this.queues)n===null?t||=this.flushQueue(r):t||=n.run(()=>this.flushQueue(r));t||(this.dirtyEffectCount=0)}}flushQueue(t){let n=!1;for(let r of t)r.dirty&&(this.dirtyEffectCount--,n=!0,r.run());return n}},js=class{[se];constructor(t){this[se]=t}destroy(){this[se].destroy()}};function ai(e,t){let n=t?.injector??b(me),r=t?.manualCleanup!==!0?n.get($e):null,o,i=n.get(Yr,null,{optional:!0}),s=n.get(wt);return i!==null?(o=LC(i.view,s,e),r instanceof Ps&&r._lView===i.view&&(r=null)):o=jC(e,n.get(su),s),o.injector=n,r!==null&&(o.onDestroyFns=[r.onDestroy(()=>o.destroy())]),new js(o)}var Yg=P(M({},mc),{cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=Go(!1);try{yc(this)}finally{Go(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=I(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],I(e)}}}),OC=P(M({},Yg),{consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(dn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}}),PC=P(M({},Yg),{consumerMarkedDirty(){this.view[L]|=8192,nr(this.view),this.notifier.notify(13)},destroy(){if(dn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[yn]?.delete(this)}});function LC(e,t,n){let r=Object.create(PC);return r.view=e,r.zone=typeof Zone<"u"?Zone.current:null,r.notifier=t,r.fn=Qg(r,n),e[yn]??=new Set,e[yn].add(r),r.consumerMarkedDirty(r),r}function jC(e,t,n){let r=Object.create(OC);return r.fn=Qg(r,e),r.scheduler=t,r.notifier=n,r.zone=typeof Zone<"u"?Zone.current:null,r.scheduler.add(r),r.notifier.notify(12),r}function Qg(e,t){return()=>{t(n=>(e.cleanupFns??=[]).push(n))}}function Di(e){return{toString:e}.toString()}function qC(e){return typeof e=="function"}function Om(e,t,n,r){t!==null?t.applyValueToInputSignal(t,r):e[n]=r}var gu=class{previousValue;currentValue;firstChange;constructor(t,n,r){this.previousValue=t,this.currentValue=n,this.firstChange=r}isFirstChange(){return this.firstChange}},Fu=(()=>{let e=()=>Pm;return e.ngInherit=!0,e})();function Pm(e){return e.type.prototype.ngOnChanges&&(e.setInput=WC),GC}function GC(){let e=jm(this),t=e?.current;if(t){let n=e.previous;if(n===nt)e.previous=t;else for(let r in t)n[r]=t[r];e.current=null,this.ngOnChanges(t)}}function WC(e,t,n,r,o){let i=this.declaredInputs[r],s=jm(e)||ZC(e,{previous:nt,current:null}),u=s.current||(s.current={}),a=s.previous,c=a[i];u[i]=new gu(c&&c.currentValue,n,a===nt),Om(e,t,o,n)}var Lm="__ngSimpleChanges__";function jm(e){return e[Lm]||null}function ZC(e,t){return e[Lm]=t}var Kg=[];var Y=function(e,t=null,n){for(let r=0;r=r)break}else t[a]<0&&(e[Jn]+=65536),(u>14>16&&(e[L]&3)===t&&(e[L]+=16384,Jg(u,i)):Jg(u,i)}var Kr=-1,ar=class{factory;name;injectImpl;resolving=!1;canSeeViewProviders;multi;componentProviders;index;providerFactory;constructor(t,n,r,o){this.factory=t,this.name=o,this.canSeeViewProviders=n,this.injectImpl=r}};function KC(e){return(e.flags&8)!==0}function JC(e){return(e.flags&16)!==0}function XC(e,t,n){let r=0;for(;rt){s=i-1;break}}}for(;i>16}function yu(e,t){let n=t_(e),r=t;for(;n>0;)r=r[Kn],n--;return r}var Kl=!0;function bu(e){let t=Kl;return Kl=e,t}var n_=256,Um=n_-1,zm=5,r_=0,At={};function o_(e,t,n){let r;typeof n=="string"?r=n.charCodeAt(0)||0:n.hasOwnProperty(Zn)&&(r=n[Zn]),r==null&&(r=n[Zn]=r_++);let o=r&Um,i=1<>zm)]|=i}function vu(e,t){let n=qm(e,t);if(n!==-1)return n;let r=t[S];r.firstCreatePass&&(e.injectorIndex=t.length,Hl(r.data,e),Hl(t,null),Hl(r.blueprint,null));let o=Fd(e,t),i=e.injectorIndex;if($m(o)){let s=mu(o),u=yu(o,t),a=u[S].data;for(let c=0;c<8;c++)t[i+c]=u[s+c]|a[s+c]}return t[i+8]=o,i}function Hl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function qm(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function Fd(e,t){if(e.parent&&e.parent.injectorIndex!==-1)return e.parent.injectorIndex;let n=0,r=null,o=t;for(;o!==null;){if(r=Qm(o),r===null)return Kr;if(n++,o=o[Kn],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Kr}function Jl(e,t,n){o_(e,t,n)}function i_(e,t){if(t==="class")return e.classes;if(t==="style")return e.styles;let n=e.attrs;if(n){let r=n.length,o=0;for(;o>20,d=r?u:u+l,h=o?u+l:c;for(let f=d;f=a&&p.type===n)return f}if(o){let f=s[a];if(f&&st(f)&&f.type===n)return a}return null}function fi(e,t,n,r,o){let i=e[n],s=t.data;if(i instanceof ar){let u=i;if(u.resolving)throw il("");let a=bu(u.canSeeViewProviders);u.resolving=!0;let c=s[n].type||s[n],l,d=u.injectImpl?Me(u.injectImpl):null,h=Rl(e,r,0);try{i=e[n]=u.factory(void 0,o,s,e,r),t.firstCreatePass&&n>=r.directiveStart&&YC(n,s[n],t)}finally{d!==null&&Me(d),bu(a),u.resolving=!1,Fl()}}return i}function u_(e){if(typeof e=="string")return e.charCodeAt(0)||0;let t=e.hasOwnProperty(Zn)?e[Zn]:void 0;return typeof t=="number"?t>=0?t&Um:a_:t}function em(e,t,n){let r=1<>zm)]&r)}function tm(e,t){return!(e&2)&&!(e&1&&t)}var sr=class{_tNode;_lView;constructor(t,n){this._tNode=t,this._lView=n}get(t,n,r){return Zm(this._tNode,this._lView,t,qn(r),n)}};function a_(){return new sr(ue(),w())}function pr(e){return Di(()=>{let t=e.prototype.constructor,n=t[zo]||Xl(t),r=Object.prototype,o=Object.getPrototypeOf(e.prototype).constructor;for(;o&&o!==r;){let i=o[zo]||Xl(o);if(i&&i!==n)return i;o=Object.getPrototypeOf(o)}return i=>new i})}function Xl(e){return Jc(e)?()=>{let t=Xl(le(e));return t&&t()}:mn(e)}function c_(e,t,n,r,o){let i=e,s=t;for(;i!==null&&s!==null&&s[L]&2048&&!Wr(s);){let u=Ym(i,s,n,r|2,At);if(u!==At)return u;let a=i.parent;if(!a){let c=s[hl];if(c){let l=c.get(n,At,r&-5);if(l!==At)return l}a=Qm(s),s=s[Kn]}i=a}return o}function Qm(e){let t=e[S],n=t.type;return n===2?t.declTNode:n===1?e[Ne]:null}function Od(e){return i_(ue(),e)}function l_(){return oo(ue(),w())}function oo(e,t){return new Zt(Qe(e,t))}var Zt=(()=>{class e{nativeElement;constructor(n){this.nativeElement=n}static __NG_ELEMENT_ID__=l_}return e})();function Km(e){return e instanceof Zt?e.nativeElement:e}function d_(){return this._results[Symbol.iterator]()}var Du=class{_emitDistinctChangesOnly;dirty=!0;_onDirty=void 0;_results=[];_changesDetected=!1;_changes=void 0;length=0;first=void 0;last=void 0;get changes(){return this._changes??=new he}constructor(t=!1){this._emitDistinctChangesOnly=t}get(t){return this._results[t]}map(t){return this._results.map(t)}filter(t){return this._results.filter(t)}find(t){return this._results.find(t)}reduce(t,n){return this._results.reduce(t,n)}forEach(t){this._results.forEach(t)}some(t){return this._results.some(t)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(t,n){this.dirty=!1;let r=dg(t);(this._changesDetected=!lg(this._results,r,n))&&(this._results=r,this.length=r.length,this.last=r[this.length-1],this.first=r[0])}notifyOnChanges(){this._changes!==void 0&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.next(this)}onDirty(t){this._onDirty=t}setDirty(){this.dirty=!0,this._onDirty?.()}destroy(){this._changes!==void 0&&(this._changes.complete(),this._changes.unsubscribe())}[Symbol.iterator]=d_};function Jm(e){return(e.flags&128)===128}var Pd=(function(e){return e[e.OnPush=0]="OnPush",e[e.Eager=1]="Eager",e[e.Default=1]="Default",e})(Pd||{}),Xm=new Map,f_=0;function p_(){return f_++}function h_(e){Xm.set(e[zt],e)}function ed(e){Xm.delete(e[zt])}var nm="__ngContext__";function Xr(e,t){qt(t)?(e[nm]=t[zt],h_(t)):e[nm]=t}function ey(e){return ny(e[qr])}function ty(e){return ny(e[Ze])}function ny(e){for(;e!==null&&!it(e);)e=e[Ze];return e}var td;function Ld(e){td=e}function ry(){if(td!==void 0)return td;if(typeof document<"u")return document;throw new D(210,!1)}var Ou=new x("",{factory:()=>g_}),g_="ng";var Pu=new x(""),hr=new x("",{providedIn:"platform",factory:()=>"unknown"}),m_=new x(""),Lu=new x("",{factory:()=>b(X).body?.querySelector("[ngCspNonce]")?.getAttribute("ngCspNonce")||null});var oy="r";var iy="di";var sy=!1,uy=new x("",{factory:()=>sy});var ay=new x("");var y_=(e,t,n,r)=>{};function b_(e,t,n,r){y_(e,t,n,r)}function ju(e){return(e.flags&32)===32}var v_=()=>null;function cy(e,t,n=!1){return v_(e,t,n)}function ly(e,t){let n=e.contentQueries;if(n!==null){let r=I(null);try{for(let o=0;oe,createScript:e=>e,createScriptURL:e=>e})}catch(e){}return uu}function Bu(e){return D_()?.createHTML(e)||e}var au;function E_(){if(au===void 0&&(au=null,fe.trustedTypes))try{au=fe.trustedTypes.createPolicy("angular#unsafe-bypass",{createHTML:e=>e,createScript:e=>e,createScriptURL:e=>e})}catch(e){}return au}function rm(e){return E_()?.createHTML(e)||e}var Wt=class{changingThisBreaksApplicationSecurity;constructor(t){this.changingThisBreaksApplicationSecurity=t}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see ${Bs})`}},rd=class extends Wt{getTypeName(){return"HTML"}},od=class extends Wt{getTypeName(){return"Style"}},id=class extends Wt{getTypeName(){return"Script"}},sd=class extends Wt{getTypeName(){return"URL"}},ud=class extends Wt{getTypeName(){return"ResourceURL"}};function Ue(e){return e instanceof Wt?e.changingThisBreaksApplicationSecurity:e}function Yt(e,t){let n=dy(e);if(n!=null&&n!==t){if(n==="ResourceURL"&&t==="URL")return!0;throw new Error(`Required a safe ${t}, got a ${n} (see ${Bs})`)}return n===t}function dy(e){return e instanceof Wt&&e.getTypeName()||null}function Bd(e){return new rd(e)}function Vd(e){return new od(e)}function Hd(e){return new id(e)}function $d(e){return new sd(e)}function Ud(e){return new ud(e)}function C_(e){let t=new cd(e);return __()?new ad(t):t}var ad=class{inertDocumentHelper;constructor(t){this.inertDocumentHelper=t}getInertBodyElement(t){t=""+t;try{let n=new window.DOMParser().parseFromString(Bu(t),"text/html").body;return n===null?this.inertDocumentHelper.getInertBodyElement(t):(n.firstChild?.remove(),n)}catch(n){return null}}},cd=class{defaultDoc;inertDocument;constructor(t){this.defaultDoc=t,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert")}getInertBodyElement(t){let n=this.inertDocument.createElement("template");return n.innerHTML=Bu(t),n}};function __(){try{return!!new window.DOMParser().parseFromString(Bu(""),"text/html")}catch(e){return!1}}var w_=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:\/?#]*(?:[\/?#]|$))/i;function Ei(e){return e=String(e),e.match(w_)?e:"unsafe:"+e}function Qt(e){let t={};for(let n of e.split(","))t[n]=!0;return t}function Ci(...e){let t={};for(let n of e)for(let r in n)n.hasOwnProperty(r)&&(t[r]=!0);return t}var fy=Qt("area,br,col,hr,img,wbr"),py=Qt("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),hy=Qt("rp,rt"),x_=Ci(hy,py),I_=Ci(py,Qt("address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul")),T_=Ci(hy,Qt("a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video")),om=Ci(fy,I_,T_,x_),gy=Qt("background,cite,href,itemtype,longdesc,poster,src,xlink:href"),S_=Qt("abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,srcset,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width"),M_=Qt("aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext"),A_=Ci(gy,S_,M_),N_=Qt("script,style,template");var ld=class{sanitizedSomething=!1;buf=[];sanitizeChildren(t){let n=t.firstChild,r=!0,o=[];for(;n;){if(n.nodeType===Node.ELEMENT_NODE?r=this.startElement(n):n.nodeType===Node.TEXT_NODE?this.chars(n.nodeValue):this.sanitizedSomething=!0,r&&n.firstChild){o.push(n),n=F_(n);continue}for(;n;){n.nodeType===Node.ELEMENT_NODE&&this.endElement(n);let i=R_(n);if(i){n=i;break}n=o.pop()}}return this.buf.join("")}startElement(t){let n=im(t).toLowerCase();if(!om.hasOwnProperty(n))return this.sanitizedSomething=!0,!N_.hasOwnProperty(n);this.buf.push("<"),this.buf.push(n);let r=t.attributes;for(let o=0;o"),!0}endElement(t){let n=im(t).toLowerCase();om.hasOwnProperty(n)&&!fy.hasOwnProperty(n)&&(this.buf.push(""))}chars(t){this.buf.push(sm(t))}};function k_(e,t){return(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)!==Node.DOCUMENT_POSITION_CONTAINED_BY}function R_(e){let t=e.nextSibling;if(t&&e!==t.previousSibling)throw my(t);return t}function F_(e){let t=e.firstChild;if(t&&k_(e,t))throw my(t);return t}function im(e){let t=e.nodeName;return typeof t=="string"?t:"FORM"}function my(e){return new Error(`Failed to sanitize html because the element is clobbered: ${e.outerHTML}`)}var O_=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,P_=/([^\#-~ |!])/g;function sm(e){return e.replace(/&/g,"&").replace(O_,function(t){let n=t.charCodeAt(0),r=t.charCodeAt(1);return"&#"+((n-55296)*1024+(r-56320)+65536)+";"}).replace(P_,function(t){return"&#"+t.charCodeAt(0)+";"}).replace(//g,">")}var cu;function Vu(e,t){let n=null;try{cu=cu||C_(e);let r=t?String(t):"";n=cu.getInertBodyElement(r);let o=5,i=r;do{if(o===0)throw new Error("Failed to sanitize html because the input is unstable");o--,r=i,i=n.innerHTML,n=cu.getInertBodyElement(r)}while(r!==i);let u=new ld().sanitizeChildren(um(n)||n);return Bu(u)}finally{if(n){let r=um(n)||n;for(;r.firstChild;)r.firstChild.remove()}}}function um(e){return"content"in e&&L_(e)?e.content:null}function L_(e){return e.nodeType===Node.ELEMENT_NODE&&e.nodeName==="TEMPLATE"}var j_=/^>|^->||--!>|)/g,V_="\u200B$1\u200B";function H_(e){return e.replace(j_,t=>t.replace(B_,V_))}function $_(e,t){return e.createText(t)}function U_(e,t,n){e.setValue(t,n)}function z_(e,t){return e.createComment(H_(t))}function yy(e,t,n){return e.createElement(t,n)}function Eu(e,t,n,r,o){e.insertBefore(t,n,r,o)}function by(e,t,n){e.appendChild(t,n)}function am(e,t,n,r,o){r!==null?Eu(e,t,n,r,o):by(e,t,n)}function vy(e,t,n,r){e.removeChild(null,t,n,r)}function q_(e,t,n){e.setAttribute(t,"style",n)}function G_(e,t,n){n===""?e.removeAttribute(t,"class"):e.setAttribute(t,"class",n)}function Dy(e,t,n){let{mergedAttrs:r,classes:o,styles:i}=n;r!==null&&XC(e,t,r),o!==null&&G_(e,t,o),i!==null&&q_(e,t,i)}var ze=(function(e){return e[e.NONE=0]="NONE",e[e.HTML=1]="HTML",e[e.STYLE=2]="STYLE",e[e.SCRIPT=3]="SCRIPT",e[e.URL=4]="URL",e[e.RESOURCE_URL=5]="RESOURCE_URL",e})(ze||{});function zd(e){let t=Ey();return t?rm(t.sanitize(ze.HTML,e)||""):Yt(e,"HTML")?rm(Ue(e)):Vu(ry(),vn(e))}function W_(e){let t=Ey();return t?t.sanitize(ze.URL,e)||"":Yt(e,"URL")?Ue(e):Ei(vn(e))}function Ey(){let e=w();return e&&e[ot].sanitizer}function Z_(e){return e.ownerDocument.defaultView}function Y_(e){return e.ownerDocument}function Cy(e){return e instanceof Function?e():e}function Q_(e,t,n){let r=e.length;for(;;){let o=e.indexOf(t,n);if(o===-1)return o;if(o===0||e.charCodeAt(o-1)<=32){let i=t.length;if(o+i===r||e.charCodeAt(o+i)<=32)return o}n=o+1}}var _y="ng-template";function K_(e,t,n,r){let o=0;if(r){for(;o-1){let i;for(;++oi?d="":d=o[l+1].toLowerCase(),r&2&&c!==d){if(ct(r))return!1;s=!0}}}}return ct(r)||s}function ct(e){return(e&1)===0}function ew(e,t,n,r){if(t===null)return-1;let o=0;if(r||!n){let i=!1;for(;o-1)for(n++;n0?'="'+u+'"':"")+"]"}else r&8?o+="."+s:r&4&&(o+=" "+s);else o!==""&&!ct(s)&&(t+=cm(i,o),o=""),r=s,i=i||!ct(r);n++}return o!==""&&(t+=cm(i,o)),t}function sw(e){return e.map(iw).join(",")}function uw(e){let t=[],n=[],r=1,o=2;for(;r=0;i--){let s=n[i],u=s.parentNode;s===t?(n.splice(i,1),fd.add(s),s.dispatchEvent(new CustomEvent("animationend",{detail:{cancel:!0}}))):(o&&s===o||u&&r&&u!==r)&&(n.splice(i,1),s.dispatchEvent(new CustomEvent("animationend",{detail:{cancel:!0}})),s.parentNode?.removeChild(s))}}function pw(e,t){let n=dd.get(e);n?n.includes(t)||n.push(t):dd.set(e,[t])}var cr=new Set,$u=(function(e){return e[e.CHANGE_DETECTION=0]="CHANGE_DETECTION",e[e.AFTER_NEXT_RENDER=1]="AFTER_NEXT_RENDER",e})($u||{}),ft=new x(""),lm=new Set;function Nt(e){lm.has(e)||(lm.add(e),performance?.mark?.("mark_feature_usage",{detail:{feature:e}}))}var Uu=(()=>{class e{impl=null;execute(){this.impl?.execute()}static \u0275prov=T({token:e,providedIn:"root",factory:()=>new e})}return e})(),Qd=[0,1,2,3],Kd=(()=>{class e{ngZone=b(Ce);scheduler=b(wt);errorHandler=b(We,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){b(ft,{optional:!0})}execute(){let n=this.sequences.size>0;n&&Y(q.AfterRenderHooksStart),this.executing=!0;for(let r of Qd)for(let o of this.sequences)if(!(o.erroredOrDestroyed||!o.hooks[r]))try{o.pipelinedValue=this.ngZone.runOutsideAngular(()=>this.maybeTrace(()=>{let i=o.hooks[r];return i(o.pipelinedValue)},o.snapshot))}catch(i){o.erroredOrDestroyed=!0,this.errorHandler?.handleError(i)}this.executing=!1;for(let r of this.sequences)r.afterRun(),r.once&&(this.sequences.delete(r),r.destroy());for(let r of this.deferredRegistrations)this.sequences.add(r);this.deferredRegistrations.size>0&&this.scheduler.notify(7),this.deferredRegistrations.clear(),n&&Y(q.AfterRenderHooksEnd)}register(n){let{view:r}=n;r!==void 0?((r[Xn]??=[]).push(n),nr(r),r[L]|=8192):this.executing?this.deferredRegistrations.add(n):this.addSequence(n)}addSequence(n){this.sequences.add(n),this.scheduler.notify(7)}unregister(n){this.executing&&this.sequences.has(n)?(n.erroredOrDestroyed=!0,n.pipelinedValue=void 0,n.once=!0):(this.sequences.delete(n),this.deferredRegistrations.delete(n))}maybeTrace(n,r){return r?r.run($u.AFTER_NEXT_RENDER,n):n()}static \u0275prov=T({token:e,providedIn:"root",factory:()=>new e})}return e})(),pi=class{impl;hooks;view;once;snapshot;erroredOrDestroyed=!1;pipelinedValue=void 0;unregisterOnDestroy;constructor(t,n,r,o,i,s=null){this.impl=t,this.hooks=n,this.view=r,this.once=o,this.snapshot=s,this.unregisterOnDestroy=i?.onDestroy(()=>this.destroy())}afterRun(){this.erroredOrDestroyed=!1,this.pipelinedValue=void 0,this.snapshot?.dispose(),this.snapshot=null}destroy(){this.impl.unregister(this),this.unregisterOnDestroy?.();let t=this.view?.[Xn];t&&(this.view[Xn]=t.filter(n=>n!==this))}};function hw(e,t){let n=t?.injector??b(me);return Nt("NgAfterNextRender"),mw(e,n,t,!0)}function gw(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function mw(e,t,n,r){let o=t.get(Uu);o.impl??=t.get(Kd);let i=t.get(ft,null,{optional:!0}),s=n?.manualCleanup!==!0?t.get($e):null,u=t.get(Yr,null,{optional:!0}),a=new pi(o.impl,gw(e),u?.view,r,s,i?.snapshot(null));return o.impl.register(a),a}var Sy=new x("",{factory:()=>({queue:new Set,isScheduled:!1,scheduler:null,injector:b(Ae)})});function My(e,t,n){let r=e.get(Sy);if(Array.isArray(t))for(let o of t)r.queue.add(o),n?.detachedLeaveAnimationFns?.push(o);else r.queue.add(t),n?.detachedLeaveAnimationFns?.push(t);r.scheduler&&r.scheduler(e)}function yw(e,t){let n=e.get(Sy);if(t.detachedLeaveAnimationFns){for(let r of t.detachedLeaveAnimationFns)n.queue.delete(r);t.detachedLeaveAnimationFns=void 0}}function bw(e,t){for(let[n,r]of t)My(e,r.animateFns)}function dm(e,t,n,r){let o=e?.[En]?.enter;t!==null&&o&&o.has(n.index)&&bw(r,o)}function Qr(e,t,n,r,o,i,s,u){if(o!=null){let a,c=!1;it(o)?a=o:qt(o)&&(c=!0,o=o[rt]);let l=Ye(o);e===0&&r!==null?(dm(u,r,i,n),s==null?by(t,r,l):Eu(t,r,l,s||null,!0)):e===1&&r!==null?(dm(u,r,i,n),Eu(t,r,l,s||null,!0),fw(i,l)):e===2?(u?.[En]?.leave?.has(i.index)&&pw(i,l),fm(u,i,n,d=>{if(fd.has(l)){fd.delete(l);return}vy(t,l,c,d)})):e===3&&fm(u,i,n,()=>{t.destroyNode(l)}),a!=null&&Mw(t,e,n,a,i,r,s)}}function vw(e,t){Ay(e,t),t[rt]=null,t[Ne]=null}function Dw(e,t,n,r,o,i){r[rt]=o,r[Ne]=t,qu(e,r,n,1,o,i)}function Ay(e,t){t[ot].changeDetectionScheduler?.notify(9),qu(e,t,t[Z],2,null,null)}function Ew(e){let t=e[qr];if(!t)return $l(e[S],e);for(;t;){let n=null;if(qt(t))n=t[qr];else{let r=t[oe];r&&(n=r)}if(!n){for(;t&&!t[Ze]&&t!==e;)qt(t)&&$l(t[S],t),t=t[de];t===null&&(t=e),qt(t)&&$l(t[S],t),n=t&&t[Ze]}t=n}}function Jd(e,t){let n=e[er],r=n.indexOf(t);n.splice(r,1)}function zu(e,t){if(tr(t))return;let n=t[Z];n.destroyNode&&qu(e,t,n,3,null,null),Ew(t)}function $l(e,t){if(tr(t))return;let n=I(null);try{t[L]&=-129,t[L]|=256,t[Be]&&dn(t[Be]),ww(e,t),_w(e,t),t[S].type===1&&t[Z].destroy();let r=t[Dn];if(r!==null&&it(t[de])){r!==t[de]&&Jd(r,t);let o=t[St];o!==null&&o.detachView(e)}ed(t)}finally{I(n)}}function fm(e,t,n,r){let o=e?.[En];if(o==null||o.leave==null||!o.leave.has(t.index))return r(!1);e&&cr.add(e[zt]),My(n,()=>{if(o.leave&&o.leave.has(t.index)){let s=o.leave.get(t.index),u=[];if(s){for(let a=0;a{e[En].running=void 0,cr.delete(e[zt]),t(!0)});return}t(!1)}function _w(e,t){let n=e.cleanup,r=t[zr];if(n!==null)for(let s=0;s=0?r[u]():r[-u].unsubscribe(),s+=2}else{let u=r[n[s+1]];n[s].call(u)}r!==null&&(t[zr]=null);let o=t[$t];if(o!==null){t[$t]=null;for(let s=0;sK&&Ty(e,t,K,!1);let u=s?q.TemplateUpdateStart:q.TemplateCreateStart;Y(u,o,n),n(r,o)}finally{_n(i);let u=s?q.TemplateUpdateEnd:q.TemplateCreateEnd;Y(u,o,n)}}function Gu(e,t,n){Ow(e,t,n),(n.flags&64)===64&&Pw(e,t,n)}function _i(e,t,n=Qe){let r=t.localNames;if(r!==null){let o=t.index+1;for(let i=0;inull;function Fw(e){return e==="class"?"className":e==="for"?"htmlFor":e==="formaction"?"formAction":e==="innerHtml"?"innerHTML":e==="readonly"?"readOnly":e==="tabindex"?"tabIndex":e}function Py(e,t,n,r,o,i){let s=t[S];if(Wu(e,s,t,n,r)){Mt(e)&&jy(t,e.index);return}e.type&3&&(n=Fw(n)),Ly(e,t,n,r,o,i)}function Ly(e,t,n,r,o,i){if(e.type&3){let s=Qe(e,t);r=i!=null?i(r,e.value||"",n):r,o.setProperty(s,n,r)}else e.type&12}function jy(e,t){let n=Ve(t,e);n[L]&16||(n[L]|=64)}function Ow(e,t,n){let r=n.directiveStart,o=n.directiveEnd;Mt(n)&&lw(t,n,e.data[r+n.componentOffset]),e.firstCreatePass||vu(n,t);let i=n.initialInputs;for(let s=r;s=u&&f<=a){let p=t.data[f],m=d[h+1];In(p,n[f],m,i),c=!0}else if(f>a)break}}return s!==null&&r.inputs.hasOwnProperty(o)&&(In(r,n[s],o,i),c=!0),c}function $w(e,t){let n=Ve(t,e),r=n[S];Uw(r,n);let o=n[rt];o!==null&&n[Qn]===null&&(n[Qn]=cy(o,n[Ut])),Y(q.ComponentStart);try{of(r,n,n[re])}finally{Y(q.ComponentEnd,n[re])}}function Uw(e,t){for(let n=t.length;n{nr(e.lView)},consumerOnSignalRead(){this.lView[Be]=this}});function Yw(e){let t=e[Be]??Object.create(Qw);return t.lView=e,t}var Qw=P(M({},an),{consumerIsAlwaysLive:!0,kind:"template",consumerMarkedDirty:e=>{let t=bn(e.lView);for(;t&&!Uy(t[S]);)t=bn(t);t&&Dl(t)},consumerOnSignalRead(){this.lView[Be]=this}});function Uy(e){return e.type!==2}function zy(e){if(e[yn]===null)return;let t=!0;for(;t;){let n=!1;for(let r of e[yn])r.dirty&&(n=!0,r.zone===null||Zone.current===r.zone?r.run():r.zone.run(()=>r.run()));t=n&&!!(e[L]&8192)}}var Kw=100;function qy(e,t=0){let r=e[ot].rendererFactory,o=!1;o||r.begin?.();try{Jw(e,t)}finally{o||r.end?.()}}function Jw(e,t){let n=kl();try{Go(!0),hd(e,t);let r=0;for(;ri(e);){if(r===Kw)throw new D(103,!1);r++,hd(e,1)}}finally{Go(n)}}function Xw(e,t,n,r){if(tr(t))return;let o=t[L],i=!1,s=!1;ru(t);let u=!0,a=null,c=null;i||(Uy(e)?(c=qw(t),a=Lt(c)):ns()===null?(u=!1,c=Yw(t),a=Lt(c)):t[Be]&&(dn(t[Be]),t[Be]=null));try{vl(t),Ng(e.bindingStartIndex),n!==null&&Oy(e,t,n,2,r);let l=(o&3)===3;if(!i)if(l){let f=e.preOrderCheckHooks;f!==null&&du(t,f,null)}else{let f=e.preOrderHooks;f!==null&&fu(t,f,0,null),Vl(t,0)}if(s||ex(t),zy(t),Gy(t,0),e.contentQueries!==null&&ly(e,t),!i)if(l){let f=e.contentCheckHooks;f!==null&&du(t,f)}else{let f=e.contentHooks;f!==null&&fu(t,f,1),Vl(t,1)}nx(e,t);let d=e.components;d!==null&&Zy(t,d,0);let h=e.viewQuery;if(h!==null&&nd(2,h,r),!i)if(l){let f=e.viewCheckHooks;f!==null&&du(t,f)}else{let f=e.viewHooks;f!==null&&fu(t,f,2),Vl(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[Ys]){for(let f of t[Ys])f();t[Ys]=null}i||(Hy(t),t[L]&=-73)}catch(l){throw i||nr(t),l}finally{c!==null&&(ln(c,a),u&&Ww(c)),ou()}}function Gy(e,t){for(let n=ey(e);n!==null;n=ty(n))for(let r=oe;r0&&(e[n-1][Ze]=r[Ze]);let i=Ko(e,oe+t);vw(r[S],r);let s=i[St];s!==null&&s.detachView(i[S]),r[de]=null,r[Ze]=null,r[L]&=-129}return r}function rx(e,t,n,r){let o=oe+r,i=n.length;r>0&&(n[o-1][Ze]=t),r-1&&(gi(t,r),Ko(n,r))}this._attachedToViewContainer=!1}zu(this._lView[S],this._lView)}onDestroy(t){El(this._lView,t)}markForCheck(){Zu(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[L]&=-129}reattach(){Js(this._lView),this._lView[L]|=128}detectChanges(){this._lView[L]|=1024,qy(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new D(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let t=Wr(this._lView),n=this._lView[Dn];n!==null&&!t&&Jd(n,this._lView),Ay(this._lView[S],this._lView)}attachToAppRef(t){if(this._attachedToViewContainer)throw new D(902,!1);this._appRef=t;let n=Wr(this._lView),r=this._lView[Dn];r!==null&&!n&&Jy(r,this._lView),Js(this._lView)}};var Sn=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=ox;constructor(n,r,o){this._declarationLView=n,this._declarationTContainer=r,this.elementRef=o}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(n,r){return this.createEmbeddedViewImpl(n,r)}createEmbeddedViewImpl(n,r,o){let i=wi(this._declarationLView,this._declarationTContainer,n,{embeddedViewInjector:r,dehydratedView:o});return new Tn(i)}}return e})();function ox(){return Yu(ue(),w())}function Yu(e,t){return e.type&4?new Sn(t,e,oo(e,t)):null}function gr(e,t,n,r,o){let i=e.data[t];if(i===null)i=ix(e,t,n,r,o),kg()&&(i.flags|=32);else if(i.type&64){i.type=n,i.value=r,i.attrs=o;let s=Mg();i.injectorIndex=s===null?-1:s.injectorIndex}return rr(i,!0),i}function ix(e,t,n,r,o){let i=Sl(),s=Ml(),u=s?i:i&&i.parent,a=e.data[t]=ux(e,u,n,t,r,o);return sx(e,a,i,s),a}function sx(e,t,n,r){e.firstChild===null&&(e.firstChild=t),n!==null&&(r?n.child==null&&t.parent!==null&&(n.child=t):n.next===null&&(n.next=t,t.prev=n))}function ux(e,t,n,r,o,i){let s=t?t.injectorIndex:-1,u=0;return xl()&&(u|=128),{type:n,index:r,insertBeforeIndex:null,injectorIndex:s,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,componentOffset:-1,controlDirectiveIndex:-1,customControlIndex:-1,propertyBindings:null,flags:u,providerIndexes:0,value:o,attrs:i,mergedAttrs:null,localNames:null,initialInputs:null,inputs:null,hostDirectiveInputs:null,outputs:null,hostDirectiveOutputs:null,directiveToIndex:null,tView:null,next:null,prev:null,projectionNext:null,child:null,parent:t,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}function ax(e){let t=e[gl]??[],r=e[de][Z],o=[];for(let i of t)i.data[iy]!==void 0?o.push(i):cx(i,r);e[gl]=o}function cx(e,t){let n=0,r=e.firstChild;if(r){let o=e.data[oy];for(;nnull,dx=()=>null;function Cu(e,t){return lx(e,t)}function Xy(e,t,n){return dx(e,t,n)}var eb=class{},Qu=class{},gd=class{resolveComponentFactory(t){throw new D(917,!1)}},Ii=class{static NULL=new gd},lr=class{},Ti=(()=>{class e{destroyNode=null;static __NG_ELEMENT_ID__=()=>fx()}return e})();function fx(){let e=w(),t=ue(),n=Ve(t.index,e);return(qt(n)?n:e)[Z]}var tb=(()=>{class e{static \u0275prov=T({token:e,providedIn:"root",factory:()=>null})}return e})();var hu={},md=class{injector;parentInjector;constructor(t,n){this.injector=t,this.parentInjector=n}get(t,n,r){let o=this.injector.get(t,hu,r);return o!==hu||n===hu?o:this.parentInjector.get(t,n,r)}};function _u(e,t,n){let r=n?e.styles:null,o=n?e.classes:null,i=0;if(t!==null)for(let s=0;s0&&(n.directiveToIndex=new Map);for(let h=0;h0;){let n=e[--t];if(typeof n=="number"&&n<0)return n}return 0}function Ex(e,t,n){if(n){if(t.exportAs)for(let r=0;rr(Ye(m[e.index])):e.index;sb(p,t,n,i,u,f,!1)}}return c}function xx(e){return e.startsWith("animation")||e.startsWith("transition")}function Ix(e,t,n,r){let o=e.cleanup;if(o!=null)for(let i=0;ia?u[a]:null}typeof s=="string"&&(i+=2)}return null}function sb(e,t,n,r,o,i,s){let u=t.firstCreatePass?_l(t):null,a=Cl(n),c=a.length;a.push(o,i),u&&u.push(r,e,c,(c+1)*(s?-1:1))}function wu(e,t,n,r,o,i){let s=t[n],u=t[S],c=u.data[n].outputs[r],d=s[c].subscribe(i);sb(e.index,u,t,o,i,d,!0)}function Tx(){let e=w(),t=G(),n=ue();if(t.firstCreatePass&&Mx(t,n),n.controlDirectiveIndex===-1)return;Nt("NgSignalForms");let r=e[n.controlDirectiveIndex];t.data[n.controlDirectiveIndex].controlDef.create(r,new xu(e,t,n))}function Sx(){let e=w(),t=G(),n=wn();if(n.controlDirectiveIndex===-1)return;let r=t.data[n.controlDirectiveIndex].controlDef,o=e[n.controlDirectiveIndex];r.update(o,new xu(e,t,n))}var xu=class{lView;tView;tNode;hasPassThrough;constructor(t,n,r){this.lView=t,this.tView=n,this.tNode=r,this.hasPassThrough=!!(r.flags&4096)}get customControl(){return this.tNode.customControlIndex!==-1?this.lView[this.tNode.customControlIndex]:void 0}get descriptor(){return`<${this.tNode.value}>`}listenToCustomControlOutput(t,n){ub(this.tView.data[this.tNode.customControlIndex],t)&&wu(this.tNode,this.lView,this.tNode.customControlIndex,t,t,ur(this.tNode,this.lView,n))}listenToCustomControlModel(t){let n=this.tNode.flags&1024?"valueChange":"checkedChange";wu(this.tNode,this.lView,this.tNode.customControlIndex,n,n,ur(this.tNode,this.lView,t))}listenToDom(t,n){lf(this.tNode,this.tView,this.lView,void 0,this.lView[Z],t,n,ur(this.tNode,this.lView,n))}setInputOnDirectives(t,n){let r=this.tNode.inputs?.[t],o=this.tNode.hostDirectiveInputs?.[t];if(!r&&!o)return!1;if(r)for(let i of r){let s=this.tView.data[i],u=this.lView[i];In(s,u,t,n)}if(o)for(let i=0;i1){t.flags|=4096;return}Ax(e,t)}function Ax(e,t){for(let n=t.directiveStart;n{Tx()},update:()=>{Dm(r.targetIdx,e,t()),Sx()}};return r}let n={[mi]:vm,update:()=>Dm(n.targetIdx,e,t())};return n}function ab(e){return e.debugInfo?.className||e.type.name||null}var Iu=class extends Ii{ngModule;constructor(t){super(),this.ngModule=t}resolveComponentFactory(t){let n=Tt(t);return new Mn(n,this.ngModule)}};function kx(e){return Object.keys(e).map(t=>{let[n,r,o]=e[t],i={propName:n,templateName:t,isSignal:(r&Hu.SignalBased)!==0};return o&&(i.transform=o),i})}function Rx(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function Fx(e,t,n){let r=t instanceof Ae?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new md(n,r):n}function Ox(e){let t=e.get(lr,null);if(t===null)throw new D(407,!1);let n=e.get(tb,null),r=e.get(wt,null),o=e.get(ft,null,{optional:!0});return{rendererFactory:t,sanitizer:n,changeDetectionScheduler:r,ngReflect:!1,tracingService:o}}function Px(e,t){let n=cb(e);return yy(t,n,n==="svg"?yl:n==="math"?vg:null)}function cb(e){return(e.selectors[0][0]||"div").toLowerCase()}var Mn=class extends Qu{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=kx(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=Rx(this.componentDef.outputs),this.cachedOutputs}constructor(t,n){super(),this.componentDef=t,this.ngModule=n,this.componentType=t.type,this.selector=sw(t.selectors),this.ngContentSelectors=t.ngContentSelectors??[],this.isBoundToModule=!!n}create(t,n,r,o,i,s){Y(q.DynamicComponentStart);let u=I(null);try{let a=this.componentDef,c=Fx(a,o||this.ngModule,t),l=Ox(c),d=l.tracingService;return d&&d.componentCreate?d.componentCreate(ab(a),()=>this.createComponentRef(l,c,n,r,i,s)):this.createComponentRef(l,c,n,r,i,s)}finally{I(u)}}createComponentRef(t,n,r,o,i,s){let u=this.componentDef,a=Lx(o,u,s,i),c=t.rendererFactory.createRenderer(null,u),l=o?Nw(c,o,u.encapsulation,n):Px(u,c),d=s?.some(Em)||i?.some(p=>typeof p!="function"&&p.bindings.some(Em)),h=Wd(null,a,null,512|xy(u),null,null,t,c,n,null,cy(l,n,!0));h[K]=l,ru(h);let f=null;try{let p=sf(K,h,2,"#host",()=>a.directiveRegistry,!0,0);Dy(c,l,p),Xr(l,h),Gu(a,h,p),jd(a,p,h),uf(a,p),r!==void 0&&Bx(p,this.ngContentSelectors,r),f=Ve(p.index,h),h[re]=f[re],of(a,h,null)}catch(p){throw f!==null&&ed(f),ed(h),p}finally{Y(q.DynamicComponentEnd),ou()}return new Tu(this.componentType,h,!!d)}};function Lx(e,t,n,r){let o=e?["ng-version","21.2.4"]:uw(t.selectors[0]),i=null,s=null,u=0;if(n)for(let l of n)u+=l[mi].requiredVars,l.create&&(l.targetIdx=0,(i??=[]).push(l)),l.update&&(l.targetIdx=0,(s??=[]).push(l));if(r)for(let l=0;l{if(n&1&&e)for(let r of e)r.create();if(n&2&&t)for(let r of t)r.update()}}function Em(e){let t=e[mi].kind;return t==="input"||t==="twoWay"}var Tu=class extends eb{_rootLView;_hasInputBindings;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(t,n,r){super(),this._rootLView=n,this._hasInputBindings=r,this._tNode=Qs(n[S],K),this.location=oo(this._tNode,n),this.instance=Ve(this._tNode.index,n)[re],this.hostView=this.changeDetectorRef=new Tn(n,void 0),this.componentType=t}setInput(t,n){this._hasInputBindings;let r=this._tNode;if(this.previousInputValues??=new Map,this.previousInputValues.has(t)&&Object.is(this.previousInputValues.get(t),n))return;let o=this._rootLView,i=Wu(r,o[S],o,t,n);this.previousInputValues.set(t,n);let s=Ve(r.index,o);Zu(s,1)}get injector(){return new sr(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(t){this.hostView.onDestroy(t)}};function Bx(e,t,n){let r=e.projection=[];for(let o=0;o{class e{static __NG_ELEMENT_ID__=Vx}return e})();function Vx(){let e=ue();return lb(e,w())}var yd=class e extends pt{_lContainer;_hostTNode;_hostLView;constructor(t,n,r){super(),this._lContainer=t,this._hostTNode=n,this._hostLView=r}get element(){return oo(this._hostTNode,this._hostLView)}get injector(){return new sr(this._hostTNode,this._hostLView)}get parentInjector(){let t=Fd(this._hostTNode,this._hostLView);if($m(t)){let n=yu(t,this._hostLView),r=mu(t),o=n[S].data[r+8];return new sr(o,n)}else return new sr(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(t){let n=Cm(this._lContainer);return n!==null&&n[t]||null}get length(){return this._lContainer.length-oe}createEmbeddedView(t,n,r){let o,i;typeof r=="number"?o=r:r!=null&&(o=r.index,i=r.injector);let s=Cu(this._lContainer,t.ssrId),u=t.createEmbeddedViewImpl(n||{},i,s);return this.insertImpl(u,o,eo(this._hostTNode,s)),u}createComponent(t,n,r,o,i,s,u){let a=t&&!qC(t),c;if(a)c=n;else{let g=n||{};c=g.index,r=g.injector,o=g.projectableNodes,i=g.environmentInjector||g.ngModuleRef,s=g.directives,u=g.bindings}let l=a?t:new Mn(Tt(t)),d=r||this.parentInjector;if(!i&&l.ngModule==null){let y=(a?d:this.parentInjector).get(Ae,null);y&&(i=y)}let h=Tt(l.componentType??{}),f=Cu(this._lContainer,h?.id??null),p=f?.firstChild??null,m=l.create(d,o,p,i,s,u);return this.insertImpl(m.hostView,c,eo(this._hostTNode,f)),m}insert(t,n){return this.insertImpl(t,n,!0)}insertImpl(t,n,r){let o=t._lView;if(Eg(o)){let u=this.indexOf(t);if(u!==-1)this.detach(u);else{let a=o[de],c=new e(a,a[Ne],a[de]);c.detach(c.indexOf(t))}}let i=this._adjustIndex(n),s=this._lContainer;return xi(s,o,i,r),t.attachToViewContainerRef(),ul(Ul(s),i,t),t}move(t,n){return this.insert(t,n)}indexOf(t){let n=Cm(this._lContainer);return n!==null?n.indexOf(t):-1}remove(t){let n=this._adjustIndex(t,-1),r=gi(this._lContainer,n);r&&(Ko(Ul(this._lContainer),n),zu(r[S],r))}detach(t){let n=this._adjustIndex(t,-1),r=gi(this._lContainer,n);return r&&Ko(Ul(this._lContainer),n)!=null?new Tn(r):null}_adjustIndex(t,n=0){return t??this.length+n}};function Cm(e){return e[ei]}function Ul(e){return e[ei]||(e[ei]=[])}function lb(e,t){let n,r=t[e.index];return it(r)?n=r:(n=Yy(r,t,null,e),t[e.index]=n,Zd(t,n)),$x(n,t,e,r),new yd(n,e,t)}function Hx(e,t){let n=e[Z],r=n.createComment(""),o=Qe(t,e),i=n.parentNode(o);return Eu(n,i,r,n.nextSibling(o),!1),r}var $x=qx,Ux=()=>!1;function zx(e,t,n){return Ux(e,t,n)}function qx(e,t,n,r){if(e[Cn])return;let o;n.type&8?o=Ye(r):o=Hx(t,n),e[Cn]=o}var bd=class e{queryList;matches=null;constructor(t){this.queryList=t}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},vd=class e{queries;constructor(t=[]){this.queries=t}createEmbeddedView(t){let n=t.queries;if(n!==null){let r=t.contentQueries!==null?t.contentQueries[0]:n.length,o=[];for(let i=0;i0)r.push(s[u/2]);else{let c=i[u+1],l=t[-a];for(let d=oe;dt.trim())}function gb(e,t,n){e.queries===null&&(e.queries=new Dd),e.queries.track(new Ed(t,n))}function Kx(e,t){let n=e.contentQueries||(e.contentQueries=[]),r=n.length?n[n.length-1]:-1;t!==r&&n.push(e.queries.length-1,t)}function ff(e,t){return e.queries.getByIndex(t)}function mb(e,t){let n=e[S],r=ff(n,t);return r.crossesNgTemplate?Cd(n,e,t,[]):db(n,e,r,t)}function pf(e,t,n){let r,o=Fo(()=>{r._dirtyCounter();let i=Jx(r,e);if(t&&i===void 0)throw new D(-951,!1);return i});return r=o[se],r._dirtyCounter=xn(0),r._flatValue=void 0,o}function hf(e){return pf(!0,!1,e)}function gf(e){return pf(!0,!0,e)}function yb(e){return pf(!1,!1,e)}function bb(e,t){let n=e[se];n._lView=w(),n._queryIndex=t,n._queryList=df(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(r=>r+1))}function Jx(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[L]&4)return t?void 0:Ee;let o=df(n,r),i=mb(n,r);return o.reset(i,Km),t?o.first:o._changesDetected||e._flatValue===void 0?e._flatValue=o.toArray():e._flatValue}var An=class{},vb=class{};function mf(e,t){return new yi(e,t??null,[])}var yi=class extends An{ngModuleType;_parent;_bootstrapComponents=[];_r3Injector;instance;destroyCbs=[];componentFactoryResolver=new Iu(this);constructor(t,n,r,o=!0){super(),this.ngModuleType=t,this._parent=n;let i=ol(t);this._bootstrapComponents=Cy(i.bootstrap),this._r3Injector=Ol(t,n,[{provide:An,useValue:this},{provide:Ii,useValue:this.componentFactoryResolver},...r],Yo(t),new Set(["environment"])),o&&this.resolveInjectorInitializers()}resolveInjectorInitializers(){this._r3Injector.resolveInjectorInitializers(),this.instance=this._r3Injector.get(this.ngModuleType)}get injector(){return this._r3Injector}destroy(){let t=this._r3Injector;!t.destroyed&&t.destroy(),this.destroyCbs.forEach(n=>n()),this.destroyCbs=null}onDestroy(t){this.destroyCbs.push(t)}},Mu=class extends vb{moduleType;constructor(t){super(),this.moduleType=t}create(t){return new yi(this.moduleType,t,[])}};var bi=class extends An{injector;componentFactoryResolver=new Iu(this);instance=null;constructor(t){super();let n=new Wn([...t.providers,{provide:An,useValue:this},{provide:Ii,useValue:this.componentFactoryResolver}],t.parent||$r(),t.debugName,new Set(["environment"]));this.injector=n,t.runEnvironmentInitializers&&n.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(t){this.injector.onDestroy(t)}};function Db(e,t,n=null){return new bi({providers:e,parent:t,debugName:n,runEnvironmentInitializers:!0}).injector}var Xx=(()=>{class e{_injector;cachedInjectors=new Map;constructor(n){this._injector=n}getOrCreateStandaloneInjector(n){if(!n.standalone)return null;if(!this.cachedInjectors.has(n)){let r=ll(!1,n.type),o=r.length>0?Db([r],this._injector,""):null;this.cachedInjectors.set(n,o)}return this.cachedInjectors.get(n)}ngOnDestroy(){try{for(let n of this.cachedInjectors.values())n!==null&&n.destroy()}finally{this.cachedInjectors.clear()}}static \u0275prov=T({token:e,providedIn:"environment",factory:()=>new e(A(Ae))})}return e})();function so(e){return Di(()=>{let t=Eb(e),n=P(M({},t),{decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection===Pd.OnPush,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?o=>o.get(Xx).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||lt.Emulated,styles:e.styles||Ee,_:null,schemas:e.schemas||null,tView:null,id:""});t.standalone&&Nt("NgStandalone"),Cb(n);let r=e.dependencies;return n.directiveDefs=_m(r,eI),n.pipeDefs=_m(r,sg),n.id=rI(n),n})}function eI(e){return Tt(e)||Us(e)}function Kt(e){return Di(()=>({type:e.type,bootstrap:e.bootstrap||Ee,declarations:e.declarations||Ee,imports:e.imports||Ee,exports:e.exports||Ee,transitiveCompileScopes:null,schemas:e.schemas||null,id:e.id||null}))}function tI(e,t){if(e==null)return nt;let n={};for(let r in e)if(e.hasOwnProperty(r)){let o=e[r],i,s,u,a;Array.isArray(o)?(u=o[0],i=o[1],s=o[2]??i,a=o[3]||null):(i=o,s=o,u=Hu.None,a=null),n[i]=[r,u,a],t[i]=s}return n}function nI(e){if(e==null)return nt;let t={};for(let n in e)e.hasOwnProperty(n)&&(t[e[n]]=n);return t}function ht(e){return Di(()=>{let t=Eb(e);return Cb(t),t})}function uo(e){return{type:e.type,name:e.name,factory:null,pure:e.pure!==!1,standalone:e.standalone??!0,onDestroy:e.type.prototype.ngOnDestroy||null}}function Eb(e){let t={};return{type:e.type,providersResolver:null,viewProvidersResolver:null,factory:null,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:t,inputConfig:e.inputs||nt,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||Ee,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,inputs:tI(e.inputs,t),outputs:nI(e.outputs),debugInfo:null}}function Cb(e){e.features?.forEach(t=>t(e))}function _m(e,t){return e?()=>{let n=typeof e=="function"?e():e,r=[];for(let o of n){let i=t(o);i!==null&&r.push(i)}return r}:null}function rI(e){let t=0,n=typeof e.consts=="function"?"":e.consts,r=[e.selectors,e.ngContentSelectors,e.hostVars,e.hostAttrs,n,e.vars,e.decls,e.encapsulation,e.standalone,e.signals,e.exportAs,JSON.stringify(e.inputs),JSON.stringify(e.outputs),Object.getOwnPropertyNames(e.type.prototype),!!e.contentQueries,!!e.viewQuery];for(let i of r.join("|"))t=Math.imul(31,t)+i.charCodeAt(0)<<0;return t+=2147483648,"c"+t}function oI(e){let t=n=>{let r=Array.isArray(e);n.hostDirectives===null?(n.resolveHostDirectives=iI,n.hostDirectives=r?e.map(_d):[e]):r?n.hostDirectives.unshift(...e.map(_d)):n.hostDirectives.unshift(e)};return t.ngInherit=!0,t}function iI(e){let t=[],n=!1,r=null,o=null;for(let i=0;i=0;r--){let o=e[r];o.hostVars=t+=o.hostVars,o.hostAttrs=Jr(o.hostAttrs,n=Jr(n,o.hostAttrs))}}function zl(e){return e===nt?{}:e===Ee?[]:e}function lI(e,t){let n=e.viewQuery;n?e.viewQuery=(r,o)=>{t(r,o),n(r,o)}:e.viewQuery=t}function dI(e,t){let n=e.contentQueries;n?e.contentQueries=(r,o,i)=>{t(r,o,i),n(r,o,i)}:e.contentQueries=t}function fI(e,t){let n=e.hostBindings;n?e.hostBindings=(r,o)=>{t(r,o),n(r,o)}:e.hostBindings=t}function wb(e,t,n,r,o,i,s,u){if(n.firstCreatePass){e.mergedAttrs=Jr(e.mergedAttrs,e.attrs);let l=e.tView=Gd(2,e,o,i,s,n.directiveRegistry,n.pipeRegistry,null,n.schemas,n.consts,null);n.queries!==null&&(n.queries.template(n,e),l.queries=n.queries.embeddedTView(e))}u&&(e.flags|=u),rr(e,!1);let a=hI(n,t,e,r);iu()&&Xd(n,t,a,e),Xr(a,t);let c=Yy(a,t,a,e);t[r+K]=c,Zd(t,c),zx(c,e,t)}function pI(e,t,n,r,o,i,s,u,a,c,l){let d=n+K,h;return t.firstCreatePass?(h=gr(t,d,4,s||null,u||null),Xs()&&nb(t,e,h,He(t.consts,c),tf),Bm(t,h)):h=t.data[d],wb(h,e,t,n,r,o,i,a),Gr(h)&&Gu(t,e,h),c!=null&&_i(e,h,l),h}function to(e,t,n,r,o,i,s,u,a,c,l){let d=n+K,h;if(t.firstCreatePass){if(h=gr(t,d,4,s||null,u||null),c!=null){let f=He(t.consts,c);h.localNames=[];for(let p=0;p{class e{log(n){console.log(n)}warn(n){console.warn(n)}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"platform"})}return e})();function yf(e){return typeof e=="function"&&e[se]!==void 0}function bf(e){return yf(e)&&typeof e.set=="function"}var Ju=new x(""),Xu=new x(""),Si=(()=>{class e{_ngZone;registry;_isZoneStable=!0;_callbacks=[];_taskTrackingZone=null;_destroyRef;constructor(n,r,o){this._ngZone=n,this.registry=r,Zs()&&(this._destroyRef=b($e,{optional:!0})??void 0),vf||(Mb(o),o.addToWindow(r)),this._watchAngularEvents(),n.run(()=>{this._taskTrackingZone=typeof Zone>"u"?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){let n=this._ngZone.onUnstable.subscribe({next:()=>{this._isZoneStable=!1}}),r=this._ngZone.runOutsideAngular(()=>this._ngZone.onStable.subscribe({next:()=>{Ce.assertNotInAngularZone(),queueMicrotask(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}}));this._destroyRef?.onDestroy(()=>{n.unsubscribe(),r.unsubscribe()})}isStable(){return this._isZoneStable&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())queueMicrotask(()=>{for(;this._callbacks.length!==0;){let n=this._callbacks.pop();clearTimeout(n.timeoutId),n.doneCb()}});else{let n=this.getPendingTasks();this._callbacks=this._callbacks.filter(r=>r.updateCb&&r.updateCb(n)?(clearTimeout(r.timeoutId),!1):!0)}}getPendingTasks(){return this._taskTrackingZone?this._taskTrackingZone.macroTasks.map(n=>({source:n.source,creationLocation:n.creationLocation,data:n.data})):[]}addCallback(n,r,o){let i=-1;r&&r>0&&(i=setTimeout(()=>{this._callbacks=this._callbacks.filter(s=>s.timeoutId!==i),n()},r)),this._callbacks.push({doneCb:n,timeoutId:i,updateCb:o})}whenStable(n,r,o){if(o&&!this._taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(n,r,o),this._runCallbacksIfReady()}registerApplication(n){this.registry.registerApplication(n,this)}unregisterApplication(n){this.registry.unregisterApplication(n)}findProviders(n,r,o){return[]}static \u0275fac=function(r){return new(r||e)(A(Ce),A(Sb),A(Xu))};static \u0275prov=T({token:e,factory:e.\u0275fac})}return e})(),Sb=(()=>{class e{_applications=new Map;registerApplication(n,r){this._applications.set(n,r)}unregisterApplication(n){this._applications.delete(n)}unregisterAllApplications(){this._applications.clear()}getTestability(n){return this._applications.get(n)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(n,r=!0){return vf?.findTestabilityInTree(this,n,r)??null}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"platform"})}return e})();function Mb(e){vf=e}var vf;function Mi(e){return!!e&&typeof e.then=="function"}function ea(e){return!!e&&typeof e.subscribe=="function"}var Df=new x("");function mI(e){return Yn([{provide:Df,multi:!0,useValue:e}])}var Ef=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((n,r)=>{this.resolve=n,this.reject=r});appInits=b(Df,{optional:!0})??[];injector=b(me);constructor(){}runInitializers(){if(this.initialized)return;let n=[];for(let o of this.appInits){let i=Ur(this.injector,o);if(Mi(i))n.push(i);else if(ea(i)){let s=new Promise((u,a)=>{i.subscribe({complete:u,error:a})});n.push(s)}}let r=()=>{this.done=!0,this.resolve()};Promise.all(n).then(()=>{r()}).catch(o=>{this.reject(o)}),n.length===0&&r(),this.initialized=!0}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),Ab=new x("");function Nb(){hc(()=>{let e="";throw new D(600,e)})}function kb(e){return e.isBoundToModule}var yI=10;var co=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=b(Gt);afterRenderManager=b(Uu);zonelessEnabled=b(ui);rootEffectScheduler=b(su);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new he;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=b(or);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(Se(n=>!n))}constructor(){b(ft,{optional:!0})}whenStable(){let n;return new Promise(r=>{n=this.isStable.subscribe({next:o=>{o&&r()}})}).finally(()=>{n.unsubscribe()})}_injector=b(Ae);_rendererFactory=null;get injector(){return this._injector}bootstrap(n,r){return this.bootstrapImpl(n,r)}bootstrapImpl(n,r,o=me.NULL){return this._injector.get(Ce).run(()=>{Y(q.BootstrapComponentStart);let s=n instanceof Qu;if(!this._injector.get(Ef).done){let p="";throw new D(405,p)}let a;s?a=n:a=this._injector.get(Ii).resolveComponentFactory(n),this.componentTypes.push(a.componentType);let c=kb(a)?void 0:this._injector.get(An),l=r||a.selector,d=a.create(o,[],l,c),h=d.location.nativeElement,f=d.injector.get(Ju,null);return f?.registerApplication(h),d.onDestroy(()=>{this.detachView(d.hostView),di(this.components,d),f?.unregisterApplication(h)}),this._loadComponent(d),Y(q.BootstrapComponentEnd,d),d})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Y(q.ChangeDetectionStart),this.tracingSnapshot!==null?this.tracingSnapshot.run($u.CHANGE_DETECTION,this.tickImpl):this.tickImpl()}tickImpl=()=>{if(this._runningTick)throw Y(q.ChangeDetectionEnd),new D(101,!1);let n=I(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,I(n),this.afterTick.next(),Y(q.ChangeDetectionEnd)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get(lr,null,{optional:!0}));let n=0;for(;this.dirtyFlags!==0&&n++ri(n))){this.dirtyFlags|=2;return}else this.dirtyFlags&=-8}attachView(n){let r=n;this._views.push(r),r.attachToAppRef(this)}detachView(n){let r=n;di(this._views,r),r.detachFromAppRef()}_loadComponent(n){this.attachView(n.hostView);try{this.tick()}catch(o){this.internalErrorHandler(o)}this.components.push(n),this._injector.get(Ab,[]).forEach(o=>o(n))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(n=>n()),this._views.slice().forEach(n=>n.destroy())}finally{this._destroyed=!0,this._views=[],this._destroyListeners=[]}}onDestroy(n){return this._destroyListeners.push(n),()=>di(this._destroyListeners,n)}destroy(){if(this._destroyed)throw new D(406,!1);let n=this._injector;n.destroy&&!n.destroyed&&n.destroy()}get viewCount(){return this._views.length}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function di(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function Rb(e,t){let n=w(),r=ut();if(ke(n,r,t)){let o=G(),i=wn();if(Wu(i,o,n,e,t))Mt(i)&&jy(n,i.index);else{let u=Qe(i,n);By(n[Z],u,null,i.value,e,t,null)}}return Rb}function ta(e,t,n,r){let o=w(),i=ut();if(ke(o,i,t)){let s=G(),u=wn();jw(u,o,e,t,n,r)}return ta}function bI(){return w()[_e][re]}var wd=class{destroy(t){}updateValue(t,n){}swap(t,n){let r=Math.min(t,n),o=Math.max(t,n),i=this.detach(o);if(o-r>1){let s=this.detach(r);this.attach(r,i),this.attach(o,s)}else this.attach(r,i)}move(t,n){this.attach(n,this.detach(t))}};function ql(e,t,n,r,o){return e===n&&Object.is(t,r)?1:Object.is(o(e,t),o(n,r))?-1:0}function vI(e,t,n,r){let o,i,s=0,u=e.length-1,a=void 0;if(Array.isArray(t)){I(r);let c=t.length-1;for(I(null);s<=u&&s<=c;){let l=e.at(s),d=t[s],h=ql(s,l,s,d,n);if(h!==0){h<0&&e.updateValue(s,d),s++;continue}let f=e.at(u),p=t[c],m=ql(u,f,c,p,n);if(m!==0){m<0&&e.updateValue(u,p),u--,c--;continue}let g=n(s,l),y=n(u,f),v=n(s,d);if(Object.is(v,y)){let _=n(c,p);Object.is(_,g)?(e.swap(s,u),e.updateValue(u,p),c--,u--):e.move(u,s),e.updateValue(s,d),s++;continue}if(o??=new Au,i??=Tm(e,s,u,n),xd(e,o,s,v))e.updateValue(s,d),s++,u++;else if(i.has(v))o.set(g,e.detach(s)),u--;else{let _=e.create(s,t[s]);e.attach(s,_),s++,u++}}for(;s<=c;)Im(e,o,n,s,t[s]),s++}else if(t!=null){I(r);let c=t[Symbol.iterator]();I(null);let l=c.next();for(;!l.done&&s<=u;){let d=e.at(s),h=l.value,f=ql(s,d,s,h,n);if(f!==0)f<0&&e.updateValue(s,h),s++,l=c.next();else{o??=new Au,i??=Tm(e,s,u,n);let p=n(s,h);if(xd(e,o,s,p))e.updateValue(s,h),s++,u++,l=c.next();else if(!i.has(p))e.attach(s,e.create(s,h)),s++,u++,l=c.next();else{let m=n(s,d);o.set(m,e.detach(s)),u--}}}for(;!l.done;)Im(e,o,n,e.length,l.value),l=c.next()}for(;s<=u;)e.destroy(e.detach(u--));o?.forEach(c=>{e.destroy(c)})}function xd(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function Im(e,t,n,r,o){if(xd(e,t,r,n(r,o)))e.updateValue(r,o);else{let i=e.create(r,o);e.attach(r,i)}}function Tm(e,t,n,r){let o=new Set;for(let i=t;i<=n;i++)o.add(r(i,e.at(i)));return o}var Au=class{kvMap=new Map;_vMap=void 0;has(t){return this.kvMap.has(t)}delete(t){if(!this.has(t))return!1;let n=this.kvMap.get(t);return this._vMap!==void 0&&this._vMap.has(n)?(this.kvMap.set(t,this._vMap.get(n)),this._vMap.delete(n)):this.kvMap.delete(t),!0}get(t){return this.kvMap.get(t)}set(t,n){if(this.kvMap.has(t)){let r=this.kvMap.get(t);this._vMap===void 0&&(this._vMap=new Map);let o=this._vMap;for(;o.has(r);)r=o.get(r);o.set(r,n)}else this.kvMap.set(t,n)}forEach(t){for(let[n,r]of this.kvMap)if(t(r,n),this._vMap!==void 0){let o=this._vMap;for(;o.has(r);)r=o.get(r),t(r,n)}}};function Cf(e,t,n,r,o,i,s,u){Nt("NgControlFlow");let a=w(),c=G(),l=He(c.consts,i);return to(a,c,e,t,n,r,o,l,256,s,u),_f}function _f(e,t,n,r,o,i,s,u){Nt("NgControlFlow");let a=w(),c=G(),l=He(c.consts,i);return to(a,c,e,t,n,r,o,l,512,s,u),_f}function wf(e,t){Nt("NgControlFlow");let n=w(),r=ut(),o=n[r]!==we?n[r]:-1,i=o!==-1?Nu(n,K+o):void 0,s=0;if(ke(n,r,e)){let u=I(null);try{if(i!==void 0&&Ky(i,s),e!==-1){let a=K+e,c=Nu(n,a),l=Md(n[S],a),d=Xy(c,l,n),h=wi(n,l,t,{dehydratedView:d});xi(c,h,s,eo(l,d))}}finally{I(u)}}else if(i!==void 0){let u=Qy(i,s);u!==void 0&&(u[re]=t)}}var Id=class{lContainer;$implicit;$index;constructor(t,n,r){this.lContainer=t,this.$implicit=n,this.$index=r}get $count(){return this.lContainer.length-oe}};function DI(e){return e}function na(e,t){return t}var Td=class{hasEmptyBlock;trackByFn;liveCollection;constructor(t,n,r){this.hasEmptyBlock=t,this.trackByFn=n,this.liveCollection=r}};function ra(e,t,n,r,o,i,s,u,a,c,l,d,h){Nt("NgControlFlow");let f=w(),p=G(),m=a!==void 0,g=w(),y=u?s.bind(g[_e][re]):s,v=new Td(m,y);g[K+e]=v,to(f,p,e+1,t,n,r,o,He(p.consts,i),256),m&&to(f,p,e+2,a,c,l,d,He(p.consts,h),512)}var Sd=class extends wd{lContainer;hostLView;templateTNode;operationsCounter=void 0;needsIndexUpdate=!1;constructor(t,n,r){super(),this.lContainer=t,this.hostLView=n,this.templateTNode=r}get length(){return this.lContainer.length-oe}at(t){return this.getLView(t)[re].$implicit}attach(t,n){let r=n[Qn];this.needsIndexUpdate||=t!==this.length,xi(this.lContainer,n,t,eo(this.templateTNode,r)),EI(this.lContainer,t)}detach(t){return this.needsIndexUpdate||=t!==this.length-1,CI(this.lContainer,t),_I(this.lContainer,t)}create(t,n){let r=Cu(this.lContainer,this.templateTNode.tView.ssrId);return wi(this.hostLView,this.templateTNode,new Id(this.lContainer,n,t),{dehydratedView:r})}destroy(t){zu(t[S],t)}updateValue(t,n){this.getLView(t)[re].$implicit=n}reset(){this.needsIndexUpdate=!1}updateIndexes(){if(this.needsIndexUpdate)for(let t=0;t0){let i=r[Ut];yw(i,o),cr.delete(r[zt]),o.detachedLeaveAnimationFns=void 0}}function CI(e,t){if(e.length<=oe)return;let n=oe+t,r=e[n],o=r?r[En]:void 0;o&&o.leave&&o.leave.size>0&&(o.detachedLeaveAnimationFns=[])}function _I(e,t){return gi(e,t)}function wI(e,t){return Qy(e,t)}function Md(e,t){return Qs(e,t)}function lo(e,t,n){let r=w(),o=ut();if(ke(r,o,t)){let i=G(),s=wn();Py(s,r,e,t,r[Z],n)}return lo}function Ad(e,t,n,r,o){Wu(t,e,n,o?"class":"style",r)}function dr(e,t,n,r){let o=w(),i=o[S],s=e+K,u=i.firstCreatePass?sf(s,o,2,t,tf,Xs(),n,r):i.data[s];if(Mt(u)){let a=o[ot].tracingService;if(a&&a.componentCreate){let c=i.data[u.directiveStart+u.componentOffset];return a.componentCreate(ab(c),()=>(Sm(e,t,o,u,r),dr))}}return Sm(e,t,o,u,r),dr}function Sm(e,t,n,r,o){if(nf(r,n,e,t,Ob),Gr(r)){let i=n[S];Gu(i,n,r),jd(i,r,n)}o!=null&&_i(n,r)}function fo(){let e=G(),t=ue(),n=rf(t);return e.firstCreatePass&&uf(e,n),Il(n)&&Tl(),wl(),n.classesWithoutHost!=null&&KC(n)&&Ad(e,n,w(),n.classesWithoutHost,!0),n.stylesWithoutHost!=null&&JC(n)&&Ad(e,n,w(),n.stylesWithoutHost,!1),fo}function Fb(e,t,n,r){return dr(e,t,n,r),fo(),Fb}function xf(e,t,n,r){let o=w(),i=o[S],s=e+K,u=i.firstCreatePass?_x(s,i,2,t,n,r):i.data[s];return nf(u,o,e,t,Ob),r!=null&&_i(o,u),xf}function If(){let e=ue(),t=rf(e);return Il(t)&&Tl(),wl(),If}function ia(e,t,n,r){return xf(e,t,n,r),If(),ia}var Ob=(e,t,n,r,o)=>(ii(!0),yy(t[Z],r,$g()));function Tf(e,t,n){let r=w(),o=r[S],i=e+K,s=o.firstCreatePass?sf(i,r,8,"ng-container",tf,Xs(),t,n):o.data[i];if(nf(s,r,e,"ng-container",xI),Gr(s)){let u=r[S];Gu(u,r,s),jd(u,s,r)}return n!=null&&_i(r,s),Tf}function Sf(){let e=G(),t=ue(),n=rf(t);return e.firstCreatePass&&uf(e,n),Sf}function po(e,t,n){return Tf(e,t,n),Sf(),po}var xI=(e,t,n,r,o)=>(ii(!0),z_(t[Z],""));function II(){return w()}function sa(e,t,n){let r=w(),o=ut();if(ke(r,o,t)){let i=G(),s=wn();Ly(s,r,e,t,r[Z],n)}return sa}var ci=void 0;function TI(e){let t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,"").length;return t===1&&n===0?1:5}var SI=["en",[["a","p"],["AM","PM"]],[["AM","PM"]],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],ci,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],ci,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm\u202Fa","h:mm:ss\u202Fa","h:mm:ss\u202Fa z","h:mm:ss\u202Fa zzzz"],["{1}, {0}",ci,ci,ci],[".",",",";","%","+","-","E","\xD7","\u2030","\u221E","NaN",":"],["#,##0.###","#,##0%","\xA4#,##0.00","#E0"],"USD","$","US Dollar",{},"ltr",TI],Gl={};function Oe(e){let t=MI(e),n=Mm(t);if(n)return n;let r=t.split("-")[0];if(n=Mm(r),n)return n;if(r==="en")return SI;throw new D(701,!1)}function Mm(e){return e in Gl||(Gl[e]=fe.ng&&fe.ng.common&&fe.ng.common.locales&&fe.ng.common.locales[e]),Gl[e]}var ie=(function(e){return e[e.LocaleId=0]="LocaleId",e[e.DayPeriodsFormat=1]="DayPeriodsFormat",e[e.DayPeriodsStandalone=2]="DayPeriodsStandalone",e[e.DaysFormat=3]="DaysFormat",e[e.DaysStandalone=4]="DaysStandalone",e[e.MonthsFormat=5]="MonthsFormat",e[e.MonthsStandalone=6]="MonthsStandalone",e[e.Eras=7]="Eras",e[e.FirstDayOfWeek=8]="FirstDayOfWeek",e[e.WeekendRange=9]="WeekendRange",e[e.DateFormat=10]="DateFormat",e[e.TimeFormat=11]="TimeFormat",e[e.DateTimeFormat=12]="DateTimeFormat",e[e.NumberSymbols=13]="NumberSymbols",e[e.NumberFormats=14]="NumberFormats",e[e.CurrencyCode=15]="CurrencyCode",e[e.CurrencySymbol=16]="CurrencySymbol",e[e.CurrencyName=17]="CurrencyName",e[e.Currencies=18]="Currencies",e[e.Directionality=19]="Directionality",e[e.PluralCase=20]="PluralCase",e[e.ExtraData=21]="ExtraData",e})(ie||{});function MI(e){return e.toLowerCase().replace(/_/g,"-")}var Ai="en-US";var AI=Ai;function Pb(e){typeof e=="string"&&(AI=e.toLowerCase().replace(/_/g,"-"))}function Lb(e,t,n){let r=w(),o=G(),i=ue();return Bb(o,r,r[Z],i,e,t,n),Lb}function jb(e,t,n){let r=w(),o=G(),i=ue();return(i.type&3||n)&&lf(i,o,r,n,r[Z],e,t,ur(i,r,t)),jb}function Bb(e,t,n,r,o,i,s){let u=!0,a=null;if((r.type&3||s)&&(a??=ur(r,t,i),lf(r,e,t,s,n,o,i,a)&&(u=!1)),u){let c=r.outputs?.[o],l=r.hostDirectiveOutputs?.[o];if(l&&l.length)for(let d=0;d>17&32767}function BI(e){return(e&2)==2}function VI(e,t){return e&131071|t<<17}function Nd(e){return e|2}function no(e){return(e&131068)>>2}function Wl(e,t){return e&-131069|t<<2}function HI(e){return(e&1)===1}function kd(e){return e|1}function $I(e,t,n,r,o,i){let s=i?t.classBindings:t.styleBindings,u=fr(s),a=no(s);e[r]=n;let c=!1,l;if(Array.isArray(n)){let d=n;l=d[1],(l===null||Vr(d,l)>0)&&(c=!0)}else l=n;if(o)if(a!==0){let h=fr(e[u+1]);e[r+1]=lu(h,u),h!==0&&(e[h+1]=Wl(e[h+1],r)),e[u+1]=VI(e[u+1],r)}else e[r+1]=lu(u,0),u!==0&&(e[u+1]=Wl(e[u+1],r)),u=r;else e[r+1]=lu(a,0),u===0?u=r:e[a+1]=Wl(e[a+1],r),a=r;c&&(e[r+1]=Nd(e[r+1])),Am(e,l,r,!0),Am(e,l,r,!1),UI(t,l,e,r,i),s=lu(u,a),i?t.classBindings=s:t.styleBindings=s}function UI(e,t,n,r,o){let i=o?e.residualClasses:e.residualStyles;i!=null&&typeof t=="string"&&Vr(i,t)>=0&&(n[r+1]=kd(n[r+1]))}function Am(e,t,n,r){let o=e[n+1],i=t===null,s=r?fr(o):no(o),u=!1;for(;s!==0&&(u===!1||i);){let a=e[s],c=e[s+1];zI(a,t)&&(u=!0,e[s+1]=r?kd(c):Nd(c)),s=r?fr(c):no(c)}u&&(e[n+1]=r?Nd(o):kd(o))}function zI(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t=="string"?Vr(e,t)>=0:!1}var pe={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function zb(e){return e.substring(pe.key,pe.keyEnd)}function qI(e){return e.substring(pe.value,pe.valueEnd)}function GI(e){return Wb(e),qb(e,ro(e,0,pe.textEnd))}function qb(e,t){let n=pe.textEnd;return n===t?-1:(t=pe.keyEnd=ZI(e,pe.key=t,n),ro(e,t,n))}function WI(e){return Wb(e),Gb(e,ro(e,0,pe.textEnd))}function Gb(e,t){let n=pe.textEnd,r=pe.key=ro(e,t,n);return n===r?-1:(r=pe.keyEnd=YI(e,r,n),r=Nm(e,r,n,58),r=pe.value=ro(e,r,n),r=pe.valueEnd=QI(e,r,n),Nm(e,r,n,59))}function Wb(e){pe.key=0,pe.keyEnd=0,pe.value=0,pe.valueEnd=0,pe.textEnd=e.length}function ro(e,t,n){for(;t32;)t++;return t}function YI(e,t,n){let r;for(;t=65&&(r&-33)<=90||r>=48&&r<=57);)t++;return t}function Nm(e,t,n,r){return t=ro(e,t,n),t32&&(u=s),i=o,o=r,r=a&-33}return u}function km(e,t,n,r){let o=-1,i=n;for(;i=0;n=Gb(t,n))Xb(e,zb(t),qI(t))}function ki(e){Qb(o2,JI,e,!0)}function JI(e,t){for(let n=GI(t);n>=0;n=qb(t,n))Jo(e,zb(t),!0)}function Yb(e,t,n,r){let o=w(),i=G(),s=eu(2);if(i.firstUpdatePass&&Jb(i,e,s,r),t!==we&&ke(o,s,t)){let u=i.data[at()];e1(i,u,o,o[Z],e,o[s+1]=s2(t,n),r,s)}}function Qb(e,t,n,r){let o=G(),i=eu(2);o.firstUpdatePass&&Jb(o,null,i,r);let s=w();if(n!==we&&ke(s,i,n)){let u=o.data[at()];if(t1(u,r)&&!Kb(o,i)){let a=r?u.classesWithoutHost:u.stylesWithoutHost;a!==null&&(n=Vs(a,n||"")),Ad(o,u,s,n,r)}else i2(o,u,s,s[Z],s[i+1],s[i+1]=r2(e,t,n),r,i)}}function Kb(e,t){return t>=e.expandoStartIndex}function Jb(e,t,n,r){let o=e.data;if(o[n+1]===null){let i=o[at()],s=Kb(e,n);t1(i,r)&&t===null&&!s&&(t=!1),t=XI(o,i,t,r),$I(o,i,t,n,s,r)}}function XI(e,t,n,r){let o=Og(e),i=r?t.residualClasses:t.residualStyles;if(o===null)(r?t.classBindings:t.styleBindings)===0&&(n=Zl(null,e,t,n,r),n=vi(n,t.attrs,r),i=null);else{let s=t.directiveStylingLast;if(s===-1||e[s]!==o)if(n=Zl(o,e,t,n,r),i===null){let a=e2(e,t,r);a!==void 0&&Array.isArray(a)&&(a=Zl(null,e,t,a[1],r),a=vi(a,t.attrs,r),t2(e,t,r,a))}else i=n2(e,t,r)}return i!==void 0&&(r?t.residualClasses=i:t.residualStyles=i),n}function e2(e,t,n){let r=n?t.classBindings:t.styleBindings;if(no(r)!==0)return e[fr(r)]}function t2(e,t,n,r){let o=n?t.classBindings:t.styleBindings;e[fr(o)]=r}function n2(e,t,n){let r,o=t.directiveEnd;for(let i=1+t.directiveStylingLast;i0;){let a=e[o],c=Array.isArray(a),l=c?a[1]:a,d=l===null,h=n[o+1];h===we&&(h=d?Ee:void 0);let f=d?Ws(h,r):l===r?h:void 0;if(c&&!ku(f)&&(f=Ws(a,r)),ku(f)&&(u=f,s))return u;let p=e[o+1];o=s?fr(p):no(p)}if(t!==null){let a=i?t.residualClasses:t.residualStyles;a!=null&&(u=Ws(a,r))}return u}function ku(e){return e!==void 0}function s2(e,t){return e==null||e===""||(typeof t=="string"?e=e+t:typeof e=="object"&&(e=Yo(Ue(e)))),e}function t1(e,t){return(e.flags&(t?8:16))!==0}function u2(e,t=""){let n=w(),r=G(),o=e+K,i=r.firstCreatePass?gr(r,o,1,t,null):r.data[o],s=a2(r,n,i,t);n[o]=s,iu()&&Xd(r,n,s,i),rr(i,!1)}var a2=(e,t,n,r)=>(ii(!0),$_(t[Z],r));function n1(e,t,n,r=""){return ke(e,ut(),n)?t+vn(n)+r:we}function r1(e,t,n,r,o,i=""){let s=Ag(),u=ib(e,s,n,o);return eu(2),u?t+vn(n)+r+vn(o)+i:we}function o1(e){return Mf("",e),o1}function Mf(e,t,n){let r=w(),o=n1(r,e,t,n);return o!==we&&s1(r,at(),o),Mf}function i1(e,t,n,r,o){let i=w(),s=r1(i,e,t,n,r,o);return s!==we&&s1(i,at(),s),i1}function s1(e,t,n){let r=bl(t,e);U_(e[Z],r,n)}function u1(e,t,n){bf(t)&&(t=t());let r=w(),o=ut();if(ke(r,o,t)){let i=G(),s=wn();Py(s,r,e,t,r[Z],n)}return u1}function c2(e,t){let n=bf(e);return n&&e.set(t),n}function a1(e,t){let n=w(),r=G(),o=ue();return Bb(r,n,n[Z],o,e,t),a1}var c1={};function aa(e){Nt("NgLet");let t=G(),n=w(),r=e+K,o=gr(t,r,128,null,null);return rr(o,!1),ni(t,n,r,c1),aa}function ca(e){let t=G(),n=w(),r=at();return ni(t,n,r,e),e}function la(e){let t=Nl(),n=ti(t,K+e);if(n===c1)throw new D(314,!1);return n}function l2(e){return ke(w(),ut(),e)?vn(e):we}function d2(e,t,n=""){return n1(w(),e,t,n)}function f2(e,t,n,r,o=""){return r1(w(),e,t,n,r,o)}function Fm(e,t,n){let r=G();r.firstCreatePass&&l1(t,r.data,r.blueprint,st(e),n)}function l1(e,t,n,r,o){if(e=le(e),Array.isArray(e))for(let i=0;i>20;if(Gn(e)||!e.multi){let f=new ar(c,o,ee,null),p=Ql(a,t,o?l:l+h,d);p===-1?(Jl(vu(u,s),i,a),Yl(i,e,t.length),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(f),s.push(f)):(n[p]=f,s[p]=f)}else{let f=Ql(a,t,l+h,d),p=Ql(a,t,l,l+h),m=f>=0&&n[f],g=p>=0&&n[p];if(o&&!g||!o&&!m){Jl(vu(u,s),i,a);let y=g2(o?h2:p2,n.length,o,r,c,e);!o&&g&&(n[p].providerFactory=y),Yl(i,e,t.length,0),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(y),s.push(y)}else{let y=d1(n[o?p:f],c,!o&&r);Yl(i,e,f>-1?f:p,y)}!o&&r&&g&&n[p].componentProviders++}}}function Yl(e,t,n,r){let o=Gn(t),i=yg(t);if(o||i){let a=(i?le(t.useClass):t).prototype.ngOnDestroy;if(a){let c=e.destroyHooks||(e.destroyHooks=[]);if(!o&&t.multi){let l=c.indexOf(n);l===-1?c.push(n,[r,a]):c[l+1].push(r,a)}else c.push(n,a)}}}function d1(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function Ql(e,t,n,r){for(let o=n;o{n.providersResolver=(r,o)=>Fm(r,o?o(e):e,!1),t&&(n.viewProvidersResolver=(r,o)=>Fm(r,o?o(t):t,!0))}}function y2(e,t){let n=Zr()+e,r=w();return r[n]===we?cf(r,n,t()):wx(r,n)}function b2(e,t,n){return p1(w(),Zr(),e,t,n)}function v2(e,t,n,r){return h1(w(),Zr(),e,t,n,r)}function f1(e,t){let n=e[t];return n===we?void 0:n}function p1(e,t,n,r,o,i){let s=t+n;return ke(e,s,o)?cf(e,s+1,i?r.call(i,o):r(o)):f1(e,s+1)}function h1(e,t,n,r,o,i,s){let u=t+n;return ib(e,u,o,i)?cf(e,u+2,s?r.call(s,o,i):r(o,i)):f1(e,u+2)}function D2(e,t){let n=G(),r,o=e+K;n.firstCreatePass?(r=E2(t,n.pipeRegistry),n.data[o]=r,r.onDestroy&&(n.destroyHooks??=[]).push(o,r.onDestroy)):r=n.data[o];let i=r.factory||(r.factory=mn(r.type,!0)),s,u=Me(ee);try{let a=bu(!1),c=i();return bu(a),ni(n,w(),o,c),c}finally{Me(u)}}function E2(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function C2(e,t,n){let r=e+K,o=w(),i=ti(o,r);return g1(o,r)?p1(o,Zr(),t,i.transform,n,i):i.transform(n)}function _2(e,t,n,r){let o=e+K,i=w(),s=ti(i,o);return g1(i,o)?h1(i,Zr(),t,s.transform,n,r,s):s.transform(n,r)}function g1(e,t){return e[S].data[t].pure}function w2(e,t){return Yu(e,t)}var Ru=class{ngModuleFactory;componentFactories;constructor(t,n){this.ngModuleFactory=t,this.componentFactories=n}},x2=(()=>{class e{compileModuleSync(n){return new Mu(n)}compileModuleAsync(n){return Promise.resolve(this.compileModuleSync(n))}compileModuleAndAllComponentsSync(n){let r=this.compileModuleSync(n),o=ol(n),i=Cy(o.declarations).reduce((s,u)=>{let a=Tt(u);return a&&s.push(new Mn(a)),s},[]);return new Ru(r,i)}compileModuleAndAllComponentsAsync(n){return Promise.resolve(this.compileModuleAndAllComponentsSync(n))}clearCache(){}clearCacheFor(n){}getModuleId(n){}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();var m1=(()=>{class e{applicationErrorHandler=b(Gt);appRef=b(co);taskService=b(or);ngZone=b(Ce);zonelessEnabled=b(ui);tracing=b(ft,{optional:!0});zoneIsDefined=typeof Zone<"u"&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new ne;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Wo):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(b(Bl,{optional:!0})??!1);cancelScheduledCallback=null;useMicrotaskScheduler=!1;runningTick=!1;pendingRenderTaskId=null;constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe(()=>{let n=this.taskService.add();if(!this.runningTick&&(this.cleanup(),!this.zonelessEnabled||this.appRef.includeAllTestViews)){this.taskService.remove(n);return}this.switchToMicrotaskScheduler(),this.taskService.remove(n)})),this.subscriptions.add(this.ngZone.onUnstable.subscribe(()=>{this.runningTick||this.cleanup()}))}switchToMicrotaskScheduler(){this.ngZone.runOutsideAngular(()=>{let n=this.taskService.add();this.useMicrotaskScheduler=!0,queueMicrotask(()=>{this.useMicrotaskScheduler=!1,this.taskService.remove(n)})})}notify(n){if(!this.zonelessEnabled&&n===5)return;switch(n){case 0:{this.appRef.dirtyFlags|=2;break}case 3:case 2:case 4:case 5:case 1:{this.appRef.dirtyFlags|=4;break}case 6:{this.appRef.dirtyFlags|=2;break}case 12:{this.appRef.dirtyFlags|=16;break}case 13:{this.appRef.dirtyFlags|=2;break}case 11:break;default:this.appRef.dirtyFlags|=8}if(this.appRef.tracingSnapshot=this.tracing?.snapshot(this.appRef.tracingSnapshot)??null,!this.shouldScheduleTick())return;let r=this.useMicrotaskScheduler?Gg:Pl;this.pendingRenderTaskId=this.taskService.add(),this.scheduleInRootZone?this.cancelScheduledCallback=Zone.root.run(()=>r(()=>this.tick())):this.cancelScheduledCallback=this.ngZone.runOutsideAngular(()=>r(()=>this.tick()))}shouldScheduleTick(){return!(this.appRef.destroyed||this.pendingRenderTaskId!==null||this.runningTick||this.appRef._runningTick||!this.zonelessEnabled&&this.zoneIsDefined&&Zone.current.get(Wo+this.angularZoneId))}tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRef.dirtyFlags===0){this.cleanup();return}!this.zonelessEnabled&&this.appRef.dirtyFlags&7&&(this.appRef.dirtyFlags|=1);let n=this.taskService.add();try{this.ngZone.run(()=>{this.runningTick=!0,this.appRef._tick()},void 0,this.schedulerTickApplyArgs)}catch(r){this.applicationErrorHandler(r)}finally{this.taskService.remove(n),this.cleanup()}}ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this.cancelScheduledCallback=null,this.pendingRenderTaskId!==null){let n=this.pendingRenderTaskId;this.pendingRenderTaskId=null,this.taskService.remove(n)}}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function y1(){return[{provide:wt,useExisting:m1},{provide:Ce,useClass:Zo},{provide:ui,useValue:!0}]}function I2(){return typeof $localize<"u"&&$localize.locale||Ai}var go=new x("",{factory:()=>b(go,{optional:!0,skipSelf:!0})||I2()});var da=class{destroyed=!1;listeners=null;errorHandler=b(We,{optional:!0});destroyRef=b($e);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(t){if(this.destroyed)throw new D(953,!1);return(this.listeners??=[]).push(t),{unsubscribe:()=>{let n=this.listeners?.indexOf(t);n!==void 0&&n!==-1&&this.listeners?.splice(n,1)}}}emit(t){if(this.destroyed){console.warn(xt(953,!1));return}if(this.listeners===null)return;let n=I(null);try{for(let r of this.listeners)try{r(t)}catch(o){this.errorHandler?.handleError(o)}}finally{I(n)}}};function xe(e){return eg(e)}function Re(e,t){return Fo(e,t?.equal)}var T2=e=>e;function Af(e,t){if(typeof e=="function"){let n=Bc(e,T2,t?.equal);return b1(n,t?.debugName)}else{let n=Bc(e.source,e.computation,e.equal);return b1(n,e.debugName)}}function b1(e,t){let n=e[se],r=e;return r.set=o=>J0(n,o),r.update=o=>X0(n,o),r.asReadonly=si.bind(e),r}function S2(e){let t=e.request,n=e.params??t??(()=>null);return new fa(n,A2(e),e.defaultValue,e.equal?M2(e.equal):void 0,e.debugName,e.injector??b(me))}var Nf=class{value;isLoading;constructor(t,n){this.value=t,this.value.set=this.set.bind(this),this.value.update=this.update.bind(this),this.value.asReadonly=si,this.isLoading=Re(()=>this.status()==="loading"||this.status()==="reloading",void 0)}isError=Re(()=>this.status()==="error");update(t){this.set(t(xe(this.value)))}isValueDefined=Re(()=>this.isError()?!1:this.value()!==void 0);_snapshot;get snapshot(){return this._snapshot??=Re(()=>{let t=this.status();return t==="error"?{status:"error",error:this.error()}:{status:t,value:this.value()}})}hasValue(){return this.isValueDefined()}asReadonly(){return this}},fa=class extends Nf{loaderFn;equal;debugName;pendingTasks;state;extRequest;effectRef;pendingController;resolvePendingTask=void 0;destroyed=!1;unregisterOnDestroy;status;error;constructor(t,n,r,o,i,s,u){super(Re(()=>{let a=this.state().stream?.();if(!a||this.state().status==="loading"&&this.error())return r;if(!kf(a))throw new pa(this.error());return a.value},{equal:o}),i),this.loaderFn=n,this.equal=o,this.debugName=i,this.extRequest=Af({source:t,computation:a=>({request:a,reload:0})}),this.state=Af({source:this.extRequest,computation:(a,c)=>{if(c){let l=a.request===void 0?"idle":"loading";return{extRequest:a,status:l,previousStatus:v1(c.value),stream:c.value.extRequest.request===a.request?c.value.stream:void 0}}else{let l=u?.(a.request);u=void 0;let d=a.request===void 0?"idle":l?"resolved":"loading";return{extRequest:a,status:d,previousStatus:"idle",stream:l}}}}),this.effectRef=ai(this.loadEffect.bind(this),{injector:s,manualCleanup:!0}),this.pendingTasks=s.get(ir),this.unregisterOnDestroy=s.get($e).onDestroy(()=>this.destroy()),this.status=Re(()=>v1(this.state()),void 0),this.error=Re(()=>{let a=this.state().stream?.();return a&&!kf(a)?a.error:void 0},void 0)}set(t){if(this.destroyed)return;let n=xe(this.error),r=xe(this.state);if(!n){let o=xe(this.value);if(r.status==="local"&&(this.equal?this.equal(o,t):o===t))return}this.state.set({extRequest:r.extRequest,status:"local",previousStatus:"local",stream:xn({value:t},void 0)}),this.abortInProgressLoad()}reload(){let{status:t}=xe(this.state);return t==="idle"||t==="loading"?!1:(this.extRequest.update(({request:n,reload:r})=>({request:n,reload:r+1})),!0)}destroy(){this.destroyed=!0,this.unregisterOnDestroy(),this.effectRef.destroy(),this.abortInProgressLoad(),this.state.set({extRequest:{request:void 0,reload:0},status:"idle",previousStatus:"idle",stream:void 0})}loadEffect(){return vt(this,null,function*(){let t=this.extRequest(),{status:n,previousStatus:r}=xe(this.state);if(t.request===void 0)return;if(n!=="loading")return;this.abortInProgressLoad();let o=this.resolvePendingTask=this.pendingTasks.add(),{signal:i}=this.pendingController=new AbortController;try{let s=yield xe(()=>this.loaderFn({params:t.request,abortSignal:i,previous:{status:r}}));if(i.aborted||xe(this.extRequest)!==t)return;this.state.set({extRequest:t,status:"resolved",previousStatus:"resolved",stream:s})}catch(s){if(i.aborted||xe(this.extRequest)!==t)return;this.state.set({extRequest:t,status:"resolved",previousStatus:"error",stream:xn({error:Ff(s)},void 0)})}finally{o?.(),o=void 0}})}abortInProgressLoad(){xe(()=>this.pendingController?.abort()),this.pendingController=void 0,this.resolvePendingTask?.(),this.resolvePendingTask=void 0}};function M2(e){return(t,n)=>t===void 0||n===void 0?t===n:e(t,n)}function A2(e){return N2(e)?e.stream:t=>vt(null,null,function*(){try{return xn({value:yield e.loader(t)},void 0)}catch(n){return xn({error:Ff(n)},void 0)}})}function N2(e){return!!e.stream}function v1(e){switch(e.status){case"loading":return e.extRequest.reload===0?"loading":"reloading";case"resolved":return kf(e.stream())?"resolved":"error";default:return e.status}}function kf(e){return e.error===void 0}function Ff(e){return k2(e)?e:new Rf(e)}function k2(e){return e instanceof Error||typeof e=="object"&&typeof e.name=="string"&&typeof e.message=="string"}var pa=class extends Error{constructor(t){super(t.message,{cause:t})}},Rf=class extends Error{constructor(t){super(String(t),{cause:t})}};var M1=Symbol("InputSignalNode#UNSET"),V2=P(M({},Oo),{transformFn:void 0,applyValueToInputSignal(e,t){jn(e,t)}});function A1(e,t){let n=Object.create(V2);n.value=e,n.transformFn=t?.transform;function r(){if(cn(n),n.value===M1){let o=null;throw new D(-950,o)}return n.value}return r[se]=n,r}var D1=class{attributeName;constructor(t){this.attributeName=t}__NG_ELEMENT_ID__=()=>Od(this.attributeName);toString(){return`HostAttributeToken ${this.attributeName}`}},F7=(()=>{let e=new x("");return e.__NG_ELEMENT_ID__=t=>{let n=ue();if(n===null)throw new D(-204,!1);if(n.type&2)return n.value;if(t&8)return null;throw new D(-204,!1)},e})();function O7(e){return new da}function E1(e,t){return A1(e,t)}function H2(e){return A1(M1,e)}var Pe=(E1.required=H2,E1);function C1(e,t){return hf(t)}function $2(e,t){return gf(t)}var P7=(C1.required=$2,C1);function L7(e,t){return yb(t)}function _1(e,t){return hf(t)}function U2(e,t){return gf(t)}var j7=(_1.required=U2,_1);var Pf=new x(""),z2=new x("");function Ri(e){return!e.moduleRef}function q2(e){let t=Ri(e)?e.r3Injector:e.moduleRef.injector,n=t.get(Ce);return n.run(()=>{Ri(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(Gt),o;if(n.runOutsideAngular(()=>{o=n.onError.subscribe({next:r})}),Ri(e)){let i=()=>t.destroy(),s=e.platformInjector.get(Pf);s.add(i),t.onDestroy(()=>{o.unsubscribe(),s.delete(i)})}else{let i=()=>e.moduleRef.destroy(),s=e.platformInjector.get(Pf);s.add(i),e.moduleRef.onDestroy(()=>{di(e.allPlatformModules,e.moduleRef),o.unsubscribe(),s.delete(i)})}return W2(r,n,()=>{let i=t.get(or),s=i.add(),u=t.get(Ef);return u.runInitializers(),u.donePromise.then(()=>{let a=t.get(go,Ai);if(Pb(a||Ai),!t.get(z2,!0))return Ri(e)?t.get(co):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(Ri(e)){let l=t.get(co);return e.rootComponent!==void 0&&l.bootstrap(e.rootComponent),l}else return G2?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>{i.remove(s)})})})}var G2;function W2(e,t,n){try{let r=n();return Mi(r)?r.catch(o=>{throw t.runOutsideAngular(()=>e(o)),o}):r}catch(r){throw t.runOutsideAngular(()=>e(r)),r}}var ha=null;function Z2(e=[],t){return me.create({name:t,providers:[{provide:Xo,useValue:"platform"},{provide:Pf,useValue:new Set([()=>ha=null])},...e]})}function Y2(e=[]){if(ha)return ha;let t=Z2(e);return ha=t,Nb(),Q2(t),t}function Q2(e){let t=e.get(Pu,null);Ur(e,()=>{t?.forEach(n=>n())})}var K2=1e4;var B7=K2-1e3;var qf=(()=>{class e{static __NG_ELEMENT_ID__=J2}return e})();function J2(e){return X2(ue(),w(),(e&16)===16)}function X2(e,t,n){if(Mt(e)&&!n){let r=Ve(e.index,t);return new Tn(r,r)}else if(e.type&175){let r=t[_e];return new Tn(r,t)}return null}var Lf=class{supports(t){return af(t)}create(t){return new jf(t)}},eT=(e,t)=>t,jf=class{length=0;collection;_linkedRecords=null;_unlinkedRecords=null;_previousItHead=null;_itHead=null;_itTail=null;_additionsHead=null;_additionsTail=null;_movesHead=null;_movesTail=null;_removalsHead=null;_removalsTail=null;_identityChangesHead=null;_identityChangesTail=null;_trackByFn;constructor(t){this._trackByFn=t||eT}forEachItem(t){let n;for(n=this._itHead;n!==null;n=n._next)t(n)}forEachOperation(t){let n=this._itHead,r=this._removalsHead,o=0,i=null;for(;n||r;){let s=!r||n&&n.currentIndex{s=this._trackByFn(o,u),n===null||!Object.is(n.trackById,s)?(n=this._mismatch(n,u,s,o),r=!0):(r&&(n=this._verifyReinsertion(n,u,s,o)),Object.is(n.item,u)||this._addIdentityChange(n,u)),n=n._next,o++}),this.length=o;return this._truncate(n),this.collection=t,this.isDirty}get isDirty(){return this._additionsHead!==null||this._movesHead!==null||this._removalsHead!==null||this._identityChangesHead!==null}_reset(){if(this.isDirty){let t;for(t=this._previousItHead=this._itHead;t!==null;t=t._next)t._nextPrevious=t._next;for(t=this._additionsHead;t!==null;t=t._nextAdded)t.previousIndex=t.currentIndex;for(this._additionsHead=this._additionsTail=null,t=this._movesHead;t!==null;t=t._nextMoved)t.previousIndex=t.currentIndex;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(t,n,r,o){let i;return t===null?i=this._itTail:(i=t._prev,this._remove(t)),t=this._unlinkedRecords===null?null:this._unlinkedRecords.get(r,null),t!==null?(Object.is(t.item,n)||this._addIdentityChange(t,n),this._reinsertAfter(t,i,o)):(t=this._linkedRecords===null?null:this._linkedRecords.get(r,o),t!==null?(Object.is(t.item,n)||this._addIdentityChange(t,n),this._moveAfter(t,i,o)):t=this._addAfter(new Bf(n,r),i,o)),t}_verifyReinsertion(t,n,r,o){let i=this._unlinkedRecords===null?null:this._unlinkedRecords.get(r,null);return i!==null?t=this._reinsertAfter(i,t._prev,o):t.currentIndex!=o&&(t.currentIndex=o,this._addToMoves(t,o)),t}_truncate(t){for(;t!==null;){let n=t._next;this._addToRemovals(this._unlink(t)),t=n}this._unlinkedRecords!==null&&this._unlinkedRecords.clear(),this._additionsTail!==null&&(this._additionsTail._nextAdded=null),this._movesTail!==null&&(this._movesTail._nextMoved=null),this._itTail!==null&&(this._itTail._next=null),this._removalsTail!==null&&(this._removalsTail._nextRemoved=null),this._identityChangesTail!==null&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(t,n,r){this._unlinkedRecords!==null&&this._unlinkedRecords.remove(t);let o=t._prevRemoved,i=t._nextRemoved;return o===null?this._removalsHead=i:o._nextRemoved=i,i===null?this._removalsTail=o:i._prevRemoved=o,this._insertAfter(t,n,r),this._addToMoves(t,r),t}_moveAfter(t,n,r){return this._unlink(t),this._insertAfter(t,n,r),this._addToMoves(t,r),t}_addAfter(t,n,r){return this._insertAfter(t,n,r),this._additionsTail===null?this._additionsTail=this._additionsHead=t:this._additionsTail=this._additionsTail._nextAdded=t,t}_insertAfter(t,n,r){let o=n===null?this._itHead:n._next;return t._next=o,t._prev=n,o===null?this._itTail=t:o._prev=t,n===null?this._itHead=t:n._next=t,this._linkedRecords===null&&(this._linkedRecords=new ga),this._linkedRecords.put(t),t.currentIndex=r,t}_remove(t){return this._addToRemovals(this._unlink(t))}_unlink(t){this._linkedRecords!==null&&this._linkedRecords.remove(t);let n=t._prev,r=t._next;return n===null?this._itHead=r:n._next=r,r===null?this._itTail=n:r._prev=n,t}_addToMoves(t,n){return t.previousIndex===n||(this._movesTail===null?this._movesTail=this._movesHead=t:this._movesTail=this._movesTail._nextMoved=t),t}_addToRemovals(t){return this._unlinkedRecords===null&&(this._unlinkedRecords=new ga),this._unlinkedRecords.put(t),t.currentIndex=null,t._nextRemoved=null,this._removalsTail===null?(this._removalsTail=this._removalsHead=t,t._prevRemoved=null):(t._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=t),t}_addIdentityChange(t,n){return t.item=n,this._identityChangesTail===null?this._identityChangesTail=this._identityChangesHead=t:this._identityChangesTail=this._identityChangesTail._nextIdentityChange=t,t}},Bf=class{item;trackById;currentIndex=null;previousIndex=null;_nextPrevious=null;_prev=null;_next=null;_prevDup=null;_nextDup=null;_prevRemoved=null;_nextRemoved=null;_nextAdded=null;_nextMoved=null;_nextIdentityChange=null;constructor(t,n){this.item=t,this.trackById=n}},Vf=class{_head=null;_tail=null;add(t){this._head===null?(this._head=this._tail=t,t._nextDup=null,t._prevDup=null):(this._tail._nextDup=t,t._prevDup=this._tail,t._nextDup=null,this._tail=t)}get(t,n){let r;for(r=this._head;r!==null;r=r._nextDup)if((n===null||n<=r.currentIndex)&&Object.is(r.trackById,t))return r;return null}remove(t){let n=t._prevDup,r=t._nextDup;return n===null?this._head=r:n._nextDup=r,r===null?this._tail=n:r._prevDup=n,this._head===null}},ga=class{map=new Map;put(t){let n=t.trackById,r=this.map.get(n);r||(r=new Vf,this.map.set(n,r)),r.add(t)}get(t,n){let r=t,o=this.map.get(r);return o?o.get(t,n):null}remove(t){let n=t.trackById;return this.map.get(n).remove(t)&&this.map.delete(n),t}get isEmpty(){return this.map.size===0}clear(){this.map.clear()}};function w1(e,t,n){let r=e.previousIndex;if(r===null)return r;let o=0;return n&&r{if(n&&n.key===o)this._maybeAddToChanges(n,r),this._appendAfter=n,n=n._next;else{let i=this._getOrCreateRecordForKey(o,r);n=this._insertBeforeOrAppend(n,i)}}),n){n._prev&&(n._prev._next=null),this._removalsHead=n;for(let r=n;r!==null;r=r._nextRemoved)r===this._mapHead&&(this._mapHead=null),this._records.delete(r.key),r._nextRemoved=r._next,r.previousValue=r.currentValue,r.currentValue=null,r._prev=null,r._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(t,n){if(t){let r=t._prev;return n._next=t,n._prev=r,t._prev=n,r&&(r._next=n),t===this._mapHead&&(this._mapHead=n),this._appendAfter=t,t}return this._appendAfter?(this._appendAfter._next=n,n._prev=this._appendAfter):this._mapHead=n,this._appendAfter=n,null}_getOrCreateRecordForKey(t,n){if(this._records.has(t)){let o=this._records.get(t);this._maybeAddToChanges(o,n);let i=o._prev,s=o._next;return i&&(i._next=s),s&&(s._prev=i),o._next=null,o._prev=null,o}let r=new Uf(t);return this._records.set(t,r),r.currentValue=n,this._addToAdditions(r),r}_reset(){if(this.isDirty){let t;for(this._previousMapHead=this._mapHead,t=this._previousMapHead;t!==null;t=t._next)t._nextPrevious=t._next;for(t=this._changesHead;t!==null;t=t._nextChanged)t.previousValue=t.currentValue;for(t=this._additionsHead;t!=null;t=t._nextAdded)t.previousValue=t.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(t,n){Object.is(n,t.currentValue)||(t.previousValue=t.currentValue,t.currentValue=n,this._addToChanges(t))}_addToAdditions(t){this._additionsHead===null?this._additionsHead=this._additionsTail=t:(this._additionsTail._nextAdded=t,this._additionsTail=t)}_addToChanges(t){this._changesHead===null?this._changesHead=this._changesTail=t:(this._changesTail._nextChanged=t,this._changesTail=t)}_forEach(t,n){t instanceof Map?t.forEach(n):Object.keys(t).forEach(r=>n(t[r],r))}},Uf=class{key;previousValue=null;currentValue=null;_nextPrevious=null;_next=null;_prev=null;_nextAdded=null;_nextRemoved=null;_nextChanged=null;constructor(t){this.key=t}};function x1(){return new Gf([new Lf])}var Gf=(()=>{class e{factories;static \u0275prov=T({token:e,providedIn:"root",factory:x1});constructor(n){this.factories=n}static create(n,r){if(r!=null){let o=r.factories.slice();n=n.concat(o)}return new e(n)}static extend(n){return{provide:e,useFactory:()=>{let r=b(e,{optional:!0,skipSelf:!0});return e.create(n,r||x1())}}}find(n){let r=this.factories.find(o=>o.supports(n));if(r!=null)return r;throw new D(901,!1)}}return e})();function I1(){return new ma([new Hf])}var ma=(()=>{class e{static \u0275prov=T({token:e,providedIn:"root",factory:I1});factories;constructor(n){this.factories=n}static create(n,r){if(r){let o=r.factories.slice();n=n.concat(o)}return new e(n)}static extend(n){return{provide:e,useFactory:()=>{let r=b(e,{optional:!0,skipSelf:!0});return e.create(n,r||I1())}}}find(n){let r=this.factories.find(o=>o.supports(n));if(r)return r;throw new D(901,!1)}}return e})();var N1=(()=>{class e{constructor(n){}static \u0275fac=function(r){return new(r||e)(A(co))};static \u0275mod=Kt({type:e});static \u0275inj=It({})}return e})();function k1(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:o}=e;Y(q.BootstrapApplicationStart);try{let i=o?.injector??Y2(r),s=[y1(),Zg,...n||[]],u=new bi({providers:s,parent:i,debugName:"",runEnvironmentInitializers:!1});return q2({r3Injector:u.injector,platformInjector:i,rootComponent:t})}catch(i){return Promise.reject(i)}finally{Y(q.BootstrapApplicationEnd)}}function tT(e){return typeof e=="boolean"?e:e!=null&&e!=="false"}function nT(e,t=NaN){return!isNaN(parseFloat(e))&&!isNaN(Number(e))?Number(e):t}var Of=Symbol("NOT_SET"),R1=new Set,rT=P(M({},Oo),{kind:"afterRenderEffectPhase",consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:Of,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase(cn(c),c.value),c.signal[se]=c,c.registerCleanupFn=l=>(c.cleanup??=new Set).add(l),this.nodes[u]=c,this.hooks[u]=l=>c.phaseFn(l)}}afterRun(){super.afterRun(),this.lastPhase=null}destroy(){if(this.onDestroyFns!==null)for(let t of this.onDestroyFns)t();super.destroy();for(let t of this.nodes)if(t)try{for(let n of t.cleanup??R1)n()}finally{dn(t)}}};function V7(e,t){let n=t?.injector??b(me),r=n.get(wt),o=n.get(Uu),i=n.get(ft,null,{optional:!0});o.impl??=n.get(Kd);let s=e;typeof s=="function"&&(s={mixedReadWrite:e});let u=n.get(Yr,null,{optional:!0}),a=new zf(o.impl,[s.earlyRead,s.write,s.mixedReadWrite,s.read],u?.view,r,n,i?.snapshot(null));return o.impl.register(a),a}function H7(e,t){let n=Tt(e),r=t.elementInjector||$r();return new Mn(n).create(r,t.projectableNodes,t.hostElement,t.environmentInjector,t.directives,t.bindings)}function $7(e){let t=Tt(e);if(!t)return null;let n=new Mn(t);return{get selector(){return n.selector},get type(){return n.componentType},get inputs(){return n.inputs},get outputs(){return n.outputs},get ngContentSelectors(){return n.ngContentSelectors},get isStandalone(){return t.standalone},get isSignal(){return t.signals}}}var bo={};xr(bo,{appendToAll:()=>sT,createThemeStyles:()=>uT,merge:()=>iT,structuralStyles:()=>aT,toProp:()=>qe});var oT=` @@ -436,4 +436,4 @@ ${n.map((r,o)=>`${o+1}) ${r.toString()}`).join(` `;break;default:}return r};So.prototype.render=function(e,t,n){let r="",o=this.rules;for(let i=0,s=e.length;i=0&&(r=this.attrs[n][1]),r};Mo.prototype.attrJoin=function(t,n){let r=this.attrIndex(t);r<0?this.attrPush([t,n]):this.attrs[r][1]=this.attrs[r][1]+" "+n};var sn=Mo;function hD(e,t,n){this.src=e,this.env=n,this.tokens=[],this.inlineMode=!1,this.md=t}hD.prototype.Token=sn;var gD=hD;var JM=/\r\n?|\n/g,XM=/\0/g;function ph(e){let t;t=e.src.replace(JM,` `),t=t.replace(XM,"\uFFFD"),e.src=t}function hh(e){let t;e.inlineMode?(t=new e.Token("inline","",0),t.content=e.src,t.map=[0,1],t.children=[],e.tokens.push(t)):e.md.block.parse(e.src,e.md,e.env,e.tokens)}function gh(e){let t=e.tokens;for(let n=0,r=t.length;n\s]/i.test(e)}function tA(e){return/^<\/a\s*>/i.test(e)}function mh(e){let t=e.tokens;if(e.md.options.linkify)for(let n=0,r=t.length;n=0;s--){let u=o[s];if(u.type==="link_close"){for(s--;o[s].level!==u.level&&o[s].type!=="link_open";)s--;continue}if(u.type==="html_inline"&&(eA(u.content)&&i>0&&i--,tA(u.content)&&i++),!(i>0)&&u.type==="text"&&e.md.linkify.test(u.content)){let a=u.content,c=e.md.linkify.match(a),l=[],d=u.level,h=0;c.length>0&&c[0].index===0&&s>0&&o[s-1].type==="text_special"&&(c=c.slice(1));for(let f=0;fh){let N=new e.Token("text","",0);N.content=a.slice(h,y),N.level=d,l.push(N)}let v=new e.Token("link_open","a",1);v.attrs=[["href",m]],v.level=d++,v.markup="linkify",v.info="auto",l.push(v);let _=new e.Token("text","",0);_.content=g,_.level=d,l.push(_);let E=new e.Token("link_close","a",-1);E.level=--d,E.markup="linkify",E.info="auto",l.push(E),h=c[f].lastIndex}if(h=0;n--){let r=e[n];r.type==="text"&&!t&&(r.content=r.content.replace(rA,iA)),r.type==="link_open"&&r.info==="auto"&&t--,r.type==="link_close"&&r.info==="auto"&&t++}}function uA(e){let t=0;for(let n=e.length-1;n>=0;n--){let r=e[n];r.type==="text"&&!t&&mD.test(r.content)&&(r.content=r.content.replace(/\+-/g,"\xB1").replace(/\.{2,}/g,"\u2026").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---(?=[^-]|$)/mg,"$1\u2014").replace(/(^|\s)--(?=\s|$)/mg,"$1\u2013").replace(/(^|[^-\s])--(?=[^-\s]|$)/mg,"$1\u2013")),r.type==="link_open"&&r.info==="auto"&&t--,r.type==="link_close"&&r.info==="auto"&&t++}}function yh(e){let t;if(e.md.options.typographer)for(t=e.tokens.length-1;t>=0;t--)e.tokens[t].type==="inline"&&(nA.test(e.tokens[t].content)&&sA(e.tokens[t].children),mD.test(e.tokens[t].content)&&uA(e.tokens[t].children))}var aA=/['"]/,yD=/['"]/g,bD="\u2019";function ic(e,t,n){return e.slice(0,t)+n+e.slice(t+1)}function cA(e,t){let n,r=[];for(let o=0;o=0&&!(r[n].level<=s);n--);if(r.length=n+1,i.type!=="text")continue;let u=i.content,a=0,c=u.length;e:for(;a=0)p=u.charCodeAt(l.index-1);else for(n=o-1;n>=0&&!(e[n].type==="softbreak"||e[n].type==="hardbreak");n--)if(e[n].content){p=e[n].content.charCodeAt(e[n].content.length-1);break}let m=32;if(a=48&&p<=57&&(h=d=!1),d&&h&&(d=g,h=y),!d&&!h){f&&(i.content=ic(i.content,l.index,bD));continue}if(h)for(n=r.length-1;n>=0;n--){let E=r[n];if(r[n].level=0;t--)e.tokens[t].type!=="inline"||!aA.test(e.tokens[t].content)||cA(e.tokens[t].children,e)}function vh(e){let t,n,r=e.tokens,o=r.length;for(let i=0;i0&&this.level++,this.tokens.push(r),r};Ot.prototype.isEmpty=function(t){return this.bMarks[t]+this.tShift[t]>=this.eMarks[t]};Ot.prototype.skipEmptyLines=function(t){for(let n=this.lineMax;tn;)if(!H(this.src.charCodeAt(--t)))return t+1;return t};Ot.prototype.skipChars=function(t,n){for(let r=this.src.length;tr;)if(n!==this.src.charCodeAt(--t))return t+1;return t};Ot.prototype.getLines=function(t,n,r,o){if(t>=n)return"";let i=new Array(n-t);for(let s=0,u=t;ur?i[s]=new Array(a-r+1).join(" ")+this.src.slice(l,d):i[s]=this.src.slice(l,d)}return i.join("")};Ot.prototype.Token=sn;var DD=Ot;var lA=65536;function Ch(e,t){let n=e.bMarks[t]+e.tShift[t],r=e.eMarks[t];return e.src.slice(n,r)}function ED(e){let t=[],n=e.length,r=0,o=e.charCodeAt(r),i=!1,s=0,u="";for(;rn)return!1;let o=t+1;if(e.sCount[o]=4)return!1;let i=e.bMarks[o]+e.tShift[o];if(i>=e.eMarks[o])return!1;let s=e.src.charCodeAt(i++);if(s!==124&&s!==45&&s!==58||i>=e.eMarks[o])return!1;let u=e.src.charCodeAt(i++);if(u!==124&&u!==45&&u!==58&&!H(u)||s===45&&H(u))return!1;for(;i=4)return!1;c=ED(a),c.length&&c[0]===""&&c.shift(),c.length&&c[c.length-1]===""&&c.pop();let d=c.length;if(d===0||d!==l.length)return!1;if(r)return!0;let h=e.parentType;e.parentType="table";let f=e.md.block.ruler.getRules("blockquote"),p=e.push("table_open","table",1),m=[t,0];p.map=m;let g=e.push("thead_open","thead",1);g.map=[t,t+1];let y=e.push("tr_open","tr",1);y.map=[t,t+1];for(let E=0;E=4||(c=ED(a),c.length&&c[0]===""&&c.shift(),c.length&&c[c.length-1]===""&&c.pop(),_+=d-c.length,_>lA))break;if(o===t+2){let C=e.push("tbody_open","tbody",1);C.map=v=[t+2,0]}let N=e.push("tr_open","tr",1);N.map=[o,o+1];for(let C=0;C=4){r++,o=r;continue}break}e.line=o;let i=e.push("code_block","code",0);return i.content=e.getLines(t,o,4+e.blkIndent,!1)+` `,i.map=[t,e.line],!0}function xh(e,t,n,r){let o=e.bMarks[t]+e.tShift[t],i=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4||o+3>i)return!1;let s=e.src.charCodeAt(o);if(s!==126&&s!==96)return!1;let u=o;o=e.skipChars(o,s);let a=o-u;if(a<3)return!1;let c=e.src.slice(u,o),l=e.src.slice(o,i);if(s===96&&l.indexOf(String.fromCharCode(s))>=0)return!1;if(r)return!0;let d=t,h=!1;for(;d++,!(d>=n||(o=u=e.bMarks[d]+e.tShift[d],i=e.eMarks[d],o=4)&&(o=e.skipChars(o,s),!(o-u=4||e.src.charCodeAt(o)!==62)return!1;if(r)return!0;let u=[],a=[],c=[],l=[],d=e.md.block.ruler.getRules("blockquote"),h=e.parentType;e.parentType="blockquote";let f=!1,p;for(p=t;p=i)break;if(e.src.charCodeAt(o++)===62&&!_){let N=e.sCount[p]+1,C,k;e.src.charCodeAt(o)===32?(o++,N++,k=!1,C=!0):e.src.charCodeAt(o)===9?(C=!0,(e.bsCount[p]+N)%4===3?(o++,N++,k=!1):k=!0):C=!1;let O=N;for(u.push(e.bMarks[p]),e.bMarks[p]=o;o=i,a.push(e.bsCount[p]),e.bsCount[p]=e.sCount[p]+1+(C?1:0),c.push(e.sCount[p]),e.sCount[p]=O-N,l.push(e.tShift[p]),e.tShift[p]=o-e.bMarks[p];continue}if(f)break;let E=!1;for(let N=0,C=d.length;N";let y=[t,0];g.map=y,e.md.block.tokenize(e,t,p);let v=e.push("blockquote_close","blockquote",-1);v.markup=">",e.lineMax=s,e.parentType=h,y[1]=e.line;for(let _=0;_=4)return!1;let i=e.bMarks[t]+e.tShift[t],s=e.src.charCodeAt(i++);if(s!==42&&s!==45&&s!==95)return!1;let u=1;for(;i=r)return-1;let i=e.src.charCodeAt(o++);if(i<48||i>57)return-1;for(;;){if(o>=r)return-1;if(i=e.src.charCodeAt(o++),i>=48&&i<=57){if(o-n>=10)return-1;continue}if(i===41||i===46)break;return-1}return o=4||e.listIndent>=0&&e.sCount[a]-e.listIndent>=4&&e.sCount[a]=e.blkIndent&&(l=!0);let d,h,f;if((f=_D(e,a))>=0){if(d=!0,s=e.bMarks[a]+e.tShift[a],h=Number(e.src.slice(s,f-1)),l&&h!==1)return!1}else if((f=CD(e,a))>=0)d=!1;else return!1;if(l&&e.skipSpaces(f)>=e.eMarks[a])return!1;if(r)return!0;let p=e.src.charCodeAt(f-1),m=e.tokens.length;d?(u=e.push("ordered_list_open","ol",1),h!==1&&(u.attrs=[["start",h]])):u=e.push("bullet_list_open","ul",1);let g=[a,0];u.map=g,u.markup=String.fromCharCode(p);let y=!1,v=e.md.block.ruler.getRules("list"),_=e.parentType;for(e.parentType="list";a=o?k=1:k=N-E,k>4&&(k=1);let O=E+k;u=e.push("list_item_open","li",1),u.markup=String.fromCharCode(p);let te=[a,0];u.map=te,d&&(u.info=e.src.slice(s,f-1));let bt=e.tight,No=e.tShift[a],es=e.sCount[a],QD=e.listIndent;if(e.listIndent=e.blkIndent,e.blkIndent=O,e.tight=!0,e.tShift[a]=C-e.bMarks[a],e.sCount[a]=N,C>=o&&e.isEmpty(a+1)?e.line=Math.min(e.line+2,n):e.md.block.tokenize(e,a,n,!0),(!e.tight||y)&&(c=!1),y=e.line-a>1&&e.isEmpty(e.line-1),e.blkIndent=e.listIndent,e.listIndent=QD,e.tShift[a]=No,e.sCount[a]=es,e.tight=bt,u=e.push("list_item_close","li",-1),u.markup=String.fromCharCode(p),a=e.line,te[1]=a,a>=n||e.sCount[a]=4)break;let i0=!1;for(let wr=0,KD=v.length;wr=4||e.src.charCodeAt(o)!==91)return!1;function u(v){let _=e.lineMax;if(v>=_||e.isEmpty(v))return null;let E=!1;if(e.sCount[v]-e.blkIndent>3&&(E=!0),e.sCount[v]<0&&(E=!0),!E){let k=e.md.block.ruler.getRules("reference"),O=e.parentType;e.parentType="reference";let te=!1;for(let bt=0,No=k.length;bt"u"&&(e.env.references={}),typeof e.env.references[y]>"u"&&(e.env.references[y]={title:g,href:d}),e.line=s),!0):!1}var wD=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"];var fA="[a-zA-Z_:][a-zA-Z0-9:._-]*",pA="[^\"'=<>`\\x00-\\x20]+",hA="'[^']*'",gA='"[^"]*"',mA="(?:"+pA+"|"+hA+"|"+gA+")",yA="(?:\\s+"+fA+"(?:\\s*=\\s*"+mA+")?)",xD="<[A-Za-z][A-Za-z0-9\\-]*"+yA+"*\\s*\\/?>",ID="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",bA="",vA="<[?][\\s\\S]*?[?]>",DA="]*>",EA="",TD=new RegExp("^(?:"+xD+"|"+ID+"|"+bA+"|"+vA+"|"+DA+"|"+EA+")"),SD=new RegExp("^(?:"+xD+"|"+ID+")");var Ao=[[/^<(script|pre|style|textarea)(?=(\s|>|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(SD.source+"\\s*$"),/^$/,!1]];function Ah(e,t,n,r){let o=e.bMarks[t]+e.tShift[t],i=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4||!e.md.options.html||e.src.charCodeAt(o)!==60)return!1;let s=e.src.slice(o,i),u=0;for(;u=4)return!1;let s=e.src.charCodeAt(o);if(s!==35||o>=i)return!1;let u=1;for(s=e.src.charCodeAt(++o);s===35&&o6||oo&&H(e.src.charCodeAt(a-1))&&(i=a),e.line=t+1;let c=e.push("heading_open","h"+String(u),1);c.markup="########".slice(0,u),c.map=[t,e.line];let l=e.push("inline","",0);l.content=e.src.slice(o,i).trim(),l.map=[t,e.line],l.children=[];let d=e.push("heading_close","h"+String(u),-1);return d.markup="########".slice(0,u),!0}function kh(e,t,n){let r=e.md.block.ruler.getRules("paragraph");if(e.sCount[t]-e.blkIndent>=4)return!1;let o=e.parentType;e.parentType="paragraph";let i=0,s,u=t+1;for(;u3)continue;if(e.sCount[u]>=e.blkIndent){let f=e.bMarks[u]+e.tShift[u],p=e.eMarks[u];if(f=p))){i=s===61?1:2;break}}if(e.sCount[u]<0)continue;let h=!1;for(let f=0,p=r.length;f3||e.sCount[i]<0)continue;let c=!1;for(let l=0,d=r.length;l=n||e.sCount[s]=i){e.line=n;break}let a=e.line,c=!1;for(let l=0;l=e.line)throw new Error("block rule didn't increment state.line");break}if(!c)throw new Error("none of the block rules matched");e.tight=!u,e.isEmpty(e.line-1)&&(u=!0),s=e.line,s0&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],o={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(r),this.tokens_meta.push(o),r};Ji.prototype.scanDelims=function(e,t){let n=this.posMax,r=this.src.charCodeAt(e),o=e>0?this.src.charCodeAt(e-1):32,i=e;for(;i0)return!1;let n=e.pos,r=e.posMax;if(n+3>r||e.src.charCodeAt(n)!==58||e.src.charCodeAt(n+1)!==47||e.src.charCodeAt(n+2)!==47)return!1;let o=e.pending.match(_A);if(!o)return!1;let i=o[1],s=e.md.linkify.matchAtStart(e.src.slice(n-i.length));if(!s)return!1;let u=s.url;if(u.length<=i.length)return!1;let a=u.length;for(;a>0&&u.charCodeAt(a-1)===42;)a--;a!==u.length&&(u=u.slice(0,a));let c=e.md.normalizeLink(u);if(!e.md.validateLink(c))return!1;if(!t){e.pending=e.pending.slice(0,-i.length);let l=e.push("link_open","a",1);l.attrs=[["href",c]],l.markup="linkify",l.info="auto";let d=e.push("text","",0);d.content=e.md.normalizeLinkText(u);let h=e.push("link_close","a",-1);h.markup="linkify",h.info="auto"}return e.pos+=u.length-i.length,!0}function Ph(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==10)return!1;let r=e.pending.length-1,o=e.posMax;if(!t)if(r>=0&&e.pending.charCodeAt(r)===32)if(r>=1&&e.pending.charCodeAt(r-1)===32){let i=r-1;for(;i>=1&&e.pending.charCodeAt(i-1)===32;)i--;e.pending=e.pending.slice(0,i),e.push("hardbreak","br",0)}else e.pending=e.pending.slice(0,-1),e.push("softbreak","br",0);else e.push("softbreak","br",0);for(n++;n?@[]^_`{|}~-".split("").forEach(function(e){Lh[e.charCodeAt(0)]=1});function jh(e,t){let n=e.pos,r=e.posMax;if(e.src.charCodeAt(n)!==92||(n++,n>=r))return!1;let o=e.src.charCodeAt(n);if(o===10){for(t||e.push("hardbreak","br",0),n++;n=55296&&o<=56319&&n+1=56320&&u<=57343&&(i+=e.src[n+1],n++)}let s="\\"+i;if(!t){let u=e.push("text_special","",0);o<256&&Lh[o]!==0?u.content=i:u.content=s,u.markup=s,u.info="escape"}return e.pos=n+1,!0}function Bh(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==96)return!1;let o=n;n++;let i=e.posMax;for(;n=0;r--){let o=t[r];if(o.marker!==95&&o.marker!==42||o.end===-1)continue;let i=t[o.end],s=r>0&&t[r-1].end===o.end+1&&t[r-1].marker===o.marker&&t[r-1].token===o.token-1&&t[o.end+1].token===i.token+1,u=String.fromCharCode(o.marker),a=e.tokens[o.token];a.type=s?"strong_open":"em_open",a.tag=s?"strong":"em",a.nesting=1,a.markup=s?u+u:u,a.content="";let c=e.tokens[i.token];c.type=s?"strong_close":"em_close",c.tag=s?"strong":"em",c.nesting=-1,c.markup=s?u+u:u,c.content="",s&&(e.tokens[t[r-1].token].content="",e.tokens[t[o.end+1].token].content="",r--)}}function TA(e){let t=e.tokens_meta,n=e.tokens_meta.length;kD(e,e.delimiters);for(let r=0;r=d)return!1;if(a=p,o=e.md.helpers.parseLinkDestination(e.src,p,e.posMax),o.ok){for(s=e.md.normalizeLink(o.str),e.md.validateLink(s)?p=o.pos:s="",a=p;p=d||e.src.charCodeAt(p)!==41)&&(c=!0),p++}if(c){if(typeof e.env.references>"u")return!1;if(p=0?r=e.src.slice(a,p++):p=f+1):p=f+1,r||(r=e.src.slice(h,f)),i=e.env.references[Cr(r)],!i)return e.pos=l,!1;s=i.href,u=i.title}if(!t){e.pos=h,e.posMax=f;let m=e.push("link_open","a",1),g=[["href",s]];m.attrs=g,u&&g.push(["title",u]),e.linkLevel++,e.md.inline.tokenize(e),e.linkLevel--,e.push("link_close","a",-1)}return e.pos=p,e.posMax=d,!0}function Uh(e,t){let n,r,o,i,s,u,a,c,l="",d=e.pos,h=e.posMax;if(e.src.charCodeAt(e.pos)!==33||e.src.charCodeAt(e.pos+1)!==91)return!1;let f=e.pos+2,p=e.md.helpers.parseLinkLabel(e,e.pos+1,!1);if(p<0)return!1;if(i=p+1,i=h)return!1;for(c=i,u=e.md.helpers.parseLinkDestination(e.src,i,e.posMax),u.ok&&(l=e.md.normalizeLink(u.str),e.md.validateLink(l)?i=u.pos:l=""),c=i;i=h||e.src.charCodeAt(i)!==41)return e.pos=d,!1;i++}else{if(typeof e.env.references>"u")return!1;if(i=0?o=e.src.slice(c,i++):i=p+1):i=p+1,o||(o=e.src.slice(f,p)),s=e.env.references[Cr(o)],!s)return e.pos=d,!1;l=s.href,a=s.title}if(!t){r=e.src.slice(f,p);let m=[];e.md.inline.parse(r,e.md,e.env,m);let g=e.push("image","img",0),y=[["src",l],["alt",""]];g.attrs=y,g.children=m,g.content=r,a&&y.push(["title",a])}return e.pos=i,e.posMax=h,!0}var SA=/^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/,MA=/^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\x00-\x20]*)$/;function zh(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==60)return!1;let r=e.pos,o=e.posMax;for(;;){if(++n>=o)return!1;let s=e.src.charCodeAt(n);if(s===60)return!1;if(s===62)break}let i=e.src.slice(r+1,n);if(MA.test(i)){let s=e.md.normalizeLink(i);if(!e.md.validateLink(s))return!1;if(!t){let u=e.push("link_open","a",1);u.attrs=[["href",s]],u.markup="autolink",u.info="auto";let a=e.push("text","",0);a.content=e.md.normalizeLinkText(i);let c=e.push("link_close","a",-1);c.markup="autolink",c.info="auto"}return e.pos+=i.length+2,!0}if(SA.test(i)){let s=e.md.normalizeLink("mailto:"+i);if(!e.md.validateLink(s))return!1;if(!t){let u=e.push("link_open","a",1);u.attrs=[["href",s]],u.markup="autolink",u.info="auto";let a=e.push("text","",0);a.content=e.md.normalizeLinkText(i);let c=e.push("link_close","a",-1);c.markup="autolink",c.info="auto"}return e.pos+=i.length+2,!0}return!1}function AA(e){return/^\s]/i.test(e)}function NA(e){return/^<\/a\s*>/i.test(e)}function kA(e){let t=e|32;return t>=97&&t<=122}function qh(e,t){if(!e.md.options.html)return!1;let n=e.posMax,r=e.pos;if(e.src.charCodeAt(r)!==60||r+2>=n)return!1;let o=e.src.charCodeAt(r+1);if(o!==33&&o!==63&&o!==47&&!kA(o))return!1;let i=e.src.slice(r).match(TD);if(!i)return!1;if(!t){let s=e.push("html_inline","",0);s.content=i[0],AA(s.content)&&e.linkLevel++,NA(s.content)&&e.linkLevel--}return e.pos+=i[0].length,!0}var RA=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,FA=/^&([a-z][a-z0-9]{1,31});/i;function Gh(e,t){let n=e.pos,r=e.posMax;if(e.src.charCodeAt(n)!==38||n+1>=r)return!1;if(e.src.charCodeAt(n+1)===35){let i=e.src.slice(n).match(RA);if(i){if(!t){let s=i[1][0].toLowerCase()==="x"?parseInt(i[1].slice(1),16):parseInt(i[1],10),u=e.push("text_special","",0);u.content=oc(s)?Ki(s):Ki(65533),u.markup=i[0],u.info="entity"}return e.pos+=i[0].length,!0}}else{let i=e.src.slice(n).match(FA);if(i){let s=Fn(i[0]);if(s!==i[0]){if(!t){let u=e.push("text_special","",0);u.content=s,u.markup=i[0],u.info="entity"}return e.pos+=i[0].length,!0}}}return!1}function RD(e){let t={},n=e.length;if(!n)return;let r=0,o=-2,i=[];for(let s=0;sa;c-=i[c]+1){let d=e[c];if(d.marker===u.marker&&d.open&&d.end<0){let h=!1;if((d.close||u.open)&&(d.length+u.length)%3===0&&(d.length%3!==0||u.length%3!==0)&&(h=!0),!h){let f=c>0&&!e[c-1].open?i[c-1]+1:0;i[s]=s-c+f,i[c]=f,u.open=!1,d.end=s,d.close=!1,l=-1,o=-2;break}}}l!==-1&&(t[u.marker][(u.open?3:0)+(u.length||0)%3]=l)}}function Wh(e){let t=e.tokens_meta,n=e.tokens_meta.length;RD(e.delimiters);for(let r=0;r0&&r++,o[t].type==="text"&&t+1=e.pos)throw new Error("inline rule didn't increment state.pos");break}}else e.pos=e.posMax;s||e.pos++,i[t]=e.pos};Xi.prototype.tokenize=function(e){let t=this.ruler.getRules(""),n=t.length,r=e.posMax,o=e.md.options.maxNesting;for(;e.pos=e.pos)throw new Error("inline rule didn't increment state.pos");break}}if(s){if(e.pos>=r)break;continue}e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()};Xi.prototype.parse=function(e,t,n,r){let o=new this.State(e,t,n,r);this.tokenize(o);let i=this.ruler2.getRules(""),s=i.length;for(let u=0;u|$))",t.tpl_email_fuzzy="(^|"+n+'|"|\\(|'+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+t.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+t.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t}function Kh(e){return Array.prototype.slice.call(arguments,1).forEach(function(n){n&&Object.keys(n).forEach(function(r){e[r]=n[r]})}),e}function cc(e){return Object.prototype.toString.call(e)}function OA(e){return cc(e)==="[object String]"}function PA(e){return cc(e)==="[object Object]"}function LA(e){return cc(e)==="[object RegExp]"}function PD(e){return cc(e)==="[object Function]"}function jA(e){return e.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}var jD={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1};function BA(e){return Object.keys(e||{}).reduce(function(t,n){return t||jD.hasOwnProperty(n)},!1)}var VA={"http:":{validate:function(e,t,n){let r=e.slice(t);return n.re.http||(n.re.http=new RegExp("^\\/\\/"+n.re.src_auth+n.re.src_host_port_strict+n.re.src_path,"i")),n.re.http.test(r)?r.match(n.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(e,t,n){let r=e.slice(t);return n.re.no_http||(n.re.no_http=new RegExp("^"+n.re.src_auth+"(?:localhost|(?:(?:"+n.re.src_domain+")\\.)+"+n.re.src_domain_root+")"+n.re.src_port+n.re.src_host_terminator+n.re.src_path,"i")),n.re.no_http.test(r)?t>=3&&e[t-3]===":"||t>=3&&e[t-3]==="/"?0:r.match(n.re.no_http)[0].length:0}},"mailto:":{validate:function(e,t,n){let r=e.slice(t);return n.re.mailto||(n.re.mailto=new RegExp("^"+n.re.src_email_name+"@"+n.re.src_host_strict,"i")),n.re.mailto.test(r)?r.match(n.re.mailto)[0].length:0}}},HA="a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]",$A="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444".split("|");function UA(e){e.__index__=-1,e.__text_cache__=""}function zA(e){return function(t,n){let r=t.slice(n);return e.test(r)?r.match(e)[0].length:0}}function LD(){return function(e,t){t.normalize(e)}}function ac(e){let t=e.re=OD(e.__opts__),n=e.__tlds__.slice();e.onCompile(),e.__tlds_replaced__||n.push(HA),n.push(t.src_xn),t.src_tlds=n.join("|");function r(u){return u.replace("%TLDS%",t.src_tlds)}t.email_fuzzy=RegExp(r(t.tpl_email_fuzzy),"i"),t.link_fuzzy=RegExp(r(t.tpl_link_fuzzy),"i"),t.link_no_ip_fuzzy=RegExp(r(t.tpl_link_no_ip_fuzzy),"i"),t.host_fuzzy_test=RegExp(r(t.tpl_host_fuzzy_test),"i");let o=[];e.__compiled__={};function i(u,a){throw new Error('(LinkifyIt) Invalid schema "'+u+'": '+a)}Object.keys(e.__schemas__).forEach(function(u){let a=e.__schemas__[u];if(a===null)return;let c={validate:null,link:null};if(e.__compiled__[u]=c,PA(a)){LA(a.validate)?c.validate=zA(a.validate):PD(a.validate)?c.validate=a.validate:i(u,a),PD(a.normalize)?c.normalize=a.normalize:a.normalize?i(u,a):c.normalize=LD();return}if(OA(a)){o.push(u);return}i(u,a)}),o.forEach(function(u){e.__compiled__[e.__schemas__[u]]&&(e.__compiled__[u].validate=e.__compiled__[e.__schemas__[u]].validate,e.__compiled__[u].normalize=e.__compiled__[e.__schemas__[u]].normalize)}),e.__compiled__[""]={validate:null,normalize:LD()};let s=Object.keys(e.__compiled__).filter(function(u){return u.length>0&&e.__compiled__[u]}).map(jA).join("|");e.re.schema_test=RegExp("(^|(?!_)(?:[><\uFF5C]|"+t.src_ZPCc+"))("+s+")","i"),e.re.schema_search=RegExp("(^|(?!_)(?:[><\uFF5C]|"+t.src_ZPCc+"))("+s+")","ig"),e.re.schema_at_start=RegExp("^"+e.re.schema_search.source,"i"),e.re.pretest=RegExp("("+e.re.schema_test.source+")|("+e.re.host_fuzzy_test.source+")|@","i"),UA(e)}function qA(e,t){let n=e.__index__,r=e.__last_index__,o=e.__text_cache__.slice(n,r);this.schema=e.__schema__.toLowerCase(),this.index=n+t,this.lastIndex=r+t,this.raw=o,this.text=o,this.url=o}function Jh(e,t){let n=new qA(e,t);return e.__compiled__[n.schema].normalize(n,e),n}function Ge(e,t){if(!(this instanceof Ge))return new Ge(e,t);t||BA(e)&&(t=e,e={}),this.__opts__=Kh({},jD,t),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=Kh({},VA,e),this.__compiled__={},this.__tlds__=$A,this.__tlds_replaced__=!1,this.re={},ac(this)}Ge.prototype.add=function(t,n){return this.__schemas__[t]=n,ac(this),this};Ge.prototype.set=function(t){return this.__opts__=Kh(this.__opts__,t),this};Ge.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;let n,r,o,i,s,u,a,c,l;if(this.re.schema_test.test(t)){for(a=this.re.schema_search,a.lastIndex=0;(n=a.exec(t))!==null;)if(i=this.testSchemaAt(t,n[2],a.lastIndex),i){this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+i;break}}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(c=t.search(this.re.host_fuzzy_test),c>=0&&(this.__index__<0||c=0&&(o=t.match(this.re.email_fuzzy))!==null&&(s=o.index+o[1].length,u=o.index+o[0].length,(this.__index__<0||sthis.__last_index__)&&(this.__schema__="mailto:",this.__index__=s,this.__last_index__=u))),this.__index__>=0};Ge.prototype.pretest=function(t){return this.re.pretest.test(t)};Ge.prototype.testSchemaAt=function(t,n,r){return this.__compiled__[n.toLowerCase()]?this.__compiled__[n.toLowerCase()].validate(t,r,this):0};Ge.prototype.match=function(t){let n=[],r=0;this.__index__>=0&&this.__text_cache__===t&&(n.push(Jh(this,r)),r=this.__last_index__);let o=r?t.slice(r):t;for(;this.test(o);)n.push(Jh(this,r)),o=o.slice(this.__last_index__),r+=this.__last_index__;return n.length?n:null};Ge.prototype.matchAtStart=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return null;let n=this.re.schema_at_start.exec(t);if(!n)return null;let r=this.testSchemaAt(t,n[2],n[0].length);return r?(this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+r,Jh(this,0)):null};Ge.prototype.tlds=function(t,n){return t=Array.isArray(t)?t:[t],n?(this.__tlds__=this.__tlds__.concat(t).sort().filter(function(r,o,i){return r!==i[o-1]}).reverse(),ac(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,ac(this),this)};Ge.prototype.normalize=function(t){t.schema||(t.url="http://"+t.url),t.schema==="mailto:"&&!/^mailto:/i.test(t.url)&&(t.url="mailto:"+t.url)};Ge.prototype.onCompile=function(){};var BD=Ge;var GA=/^xn--/,WA=/[^\0-\x7F]/,ZA=/[\x2E\u3002\uFF0E\uFF61]/g,YA={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},Xh=35,Pt=Math.floor,e0=String.fromCharCode;function On(e){throw new RangeError(YA[e])}function QA(e,t){let n=[],r=e.length;for(;r--;)n[r]=t(e[r]);return n}function HD(e,t){let n=e.split("@"),r="";n.length>1&&(r=n[0]+"@",e=n[1]),e=e.replace(ZA,".");let o=e.split("."),i=QA(o,t).join(".");return r+i}function $D(e){let t=[],n=0,r=e.length;for(;n=55296&&o<=56319&&nString.fromCodePoint(...e),JA=function(e){return e>=48&&e<58?26+(e-48):e>=65&&e<91?e-65:e>=97&&e<123?e-97:36},VD=function(e,t){return e+22+75*(e<26)-((t!=0)<<5)},UD=function(e,t,n){let r=0;for(e=n?Pt(e/700):e>>1,e+=Pt(e/t);e>Xh*26>>1;r+=36)e=Pt(e/Xh);return Pt(r+(Xh+1)*e/(e+38))},zD=function(e){let t=[],n=e.length,r=0,o=128,i=72,s=e.lastIndexOf("-");s<0&&(s=0);for(let u=0;u=128&&On("not-basic"),t.push(e.charCodeAt(u));for(let u=s>0?s+1:0;u=n&&On("invalid-input");let h=JA(e.charCodeAt(u++));h>=36&&On("invalid-input"),h>Pt((2147483647-r)/l)&&On("overflow"),r+=h*l;let f=d<=i?1:d>=i+26?26:d-i;if(hPt(2147483647/p)&&On("overflow"),l*=p}let c=t.length+1;i=UD(r-a,c,a==0),Pt(r/c)>2147483647-o&&On("overflow"),o+=Pt(r/c),r%=c,t.splice(r++,0,o)}return String.fromCodePoint(...t)},qD=function(e){let t=[];e=$D(e);let n=e.length,r=128,o=0,i=72;for(let a of e)a<128&&t.push(e0(a));let s=t.length,u=s;for(s&&t.push("-");u=r&&lPt((2147483647-o)/c)&&On("overflow"),o+=(a-r)*c,r=a;for(let l of e)if(l2147483647&&On("overflow"),l===r){let d=o;for(let h=36;;h+=36){let f=h<=i?1:h>=i+26?26:h-i;if(d=0))try{t.hostname=t0.toASCII(t.hostname)}catch(n){}return Za(xo(t))}function uN(e){let t=Qi(e,!0);if(t.hostname&&(!t.protocol||YD.indexOf(t.protocol)>=0))try{t.hostname=t0.toUnicode(t.hostname)}catch(n){}return Yi(xo(t),Yi.defaultChars+"%")}function Xe(e,t){if(!(this instanceof Xe))return new Xe(e,t);t||rc(e)||(t=e||{},e="default"),this.inline=new FD,this.block=new MD,this.core=new vD,this.renderer=new pD,this.linkify=new BD,this.validateLink=iN,this.normalizeLink=sN,this.normalizeLinkText=uN,this.utils=ah,this.helpers=To({},fh),this.options={},this.configure(e),t&&this.set(t)}Xe.prototype.set=function(e){return To(this.options,e),this};Xe.prototype.configure=function(e){let t=this;if(rc(e)){let n=e;if(e=nN[n],!e)throw new Error('Wrong `markdown-it` preset "'+n+'", check name')}if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(n){e.components[n].rules&&t[n].ruler.enableOnly(e.components[n].rules),e.components[n].rules2&&t[n].ruler2.enableOnly(e.components[n].rules2)}),this};Xe.prototype.enable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(o){n=n.concat(this[o].ruler.enable(e,!0))},this),n=n.concat(this.inline.ruler2.enable(e,!0));let r=e.filter(function(o){return n.indexOf(o)<0});if(r.length&&!t)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+r);return this};Xe.prototype.disable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(o){n=n.concat(this[o].ruler.disable(e,!0))},this),n=n.concat(this.inline.ruler2.disable(e,!0));let r=e.filter(function(o){return n.indexOf(o)<0});if(r.length&&!t)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+r);return this};Xe.prototype.use=function(e){let t=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,t),this};Xe.prototype.parse=function(e,t){if(typeof e!="string")throw new Error("Input data should be a String");let n=new this.core.State(e,this,t);return this.core.process(n),n.tokens};Xe.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)};Xe.prototype.parseInline=function(e,t){let n=new this.core.State(e,this,t);return n.inlineMode=!0,this.core.process(n),n.tokens};Xe.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};var n0=Xe;function aN(e,t){if(e&1&&po(0,0),e&2){let n=t.$implicit,r=Ni();lo("surfaceId",r.surfaceId())("component",n)}}function cN(e,t){if(e&1&&po(0,0),e&2){let n=t.$implicit,r=Ni();lo("surfaceId",r.surfaceId())("component",n)}}function lN(e,t){if(e&1&&po(0,0),e&2){Ni();let n=la(0),r=la(1);lo("surfaceId",n)("component",r.componentTree)}}var dN=new x("Catalog"),fN=(()=>{class e extends Q1.A2uiMessageProcessor{events=new he;setData(n,r,o,i){return super.setData(n,r,o,i??void 0)}dispatch(n){let r=new he;return this.events.next({message:n,completion:r}),Nc(r)}static \u0275fac=(()=>{let n;return function(o){return(n||(n=pr(e)))(o||e)}})();static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),pN=new x("Theme"),hN=0,r0=(()=>{class e{processor=b(fN);theme=b(pN);surfaceId=Pe.required();component=Pe.required();weight=Pe.required();sendAction(n){let r=this.component(),o=this.surfaceId()??void 0,i={};if(n.context){for(let u of n.context)if(u.value.literalBoolean)i[u.key]=u.value.literalBoolean;else if(u.value.literalNumber)i[u.key]=u.value.literalNumber;else if(u.value.literalString)i[u.key]=u.value.literalString;else if(u.value.path){let a=this.processor.resolvePath(u.value.path,r.dataContextPath),c=this.processor.getData(r,a,o);i[u.key]=c}}let s={userAction:{name:n.name,sourceComponentId:r.id,surfaceId:o,timestamp:new Date().toISOString(),context:i}};return this.processor.dispatch(s)}resolvePrimitive(n){let r=this.component(),o=this.surfaceId();return!n||typeof n!="object"?null:n.literal!=null?n.literal:n.path?this.processor.getData(r,n.path,o??void 0):"literalString"in n?n.literalString:"literalNumber"in n?n.literalNumber:"literalBoolean"in n?n.literalBoolean:null}getUniqueId(n){return`${n}-${hN++}`}static \u0275fac=function(r){return new(r||e)};static \u0275dir=ht({type:e,hostVars:2,hostBindings:function(r,o){r&2&&ua("--weight",o.weight())},inputs:{surfaceId:[1,"surfaceId"],component:[1,"component"],weight:[1,"weight"]}})}return e})(),o0=(()=>{class e{viewContainerRef=b(pt);catalog=b(dN);static hasInsertedStyles=!1;currentRef=null;isDestroyed=!1;surfaceId=Pe.required();component=Pe.required();constructor(){ai(()=>{let o=this.surfaceId(),i=this.component();xe(()=>this.render(o,i))});let n=b(hr),r=b(X);if(!e.hasInsertedStyles&&xv(n)){let o=r.createElement("style");o.textContent=bo.structuralStyles,r.head.appendChild(o),e.hasInsertedStyles=!0}}ngOnDestroy(){this.isDestroyed=!0,this.clear()}render(n,r){return vt(this,null,function*(){let o=this.catalog[r.type],i=null,s=null;if(typeof o=="function"?i=yield o():typeof o=="object"&&(i=yield o.type(),s=o.bindings(r)),this.clear(),i&&!this.isDestroyed){let u=[U("surfaceId",()=>n),U("component",()=>r),U("weight",()=>r.weight??"initial")];s&&u.push(...s),this.currentRef=this.viewContainerRef.createComponent(i,{bindings:u,injector:this.viewContainerRef.injector})}})}clear(){this.currentRef?.destroy(),this.currentRef=null}static \u0275fac=function(r){return new(r||e)};static \u0275dir=ht({type:e,selectors:[["ng-container","a2ui-renderer",""]],inputs:{surfaceId:[1,"surfaceId"],component:[1,"component"]}})}return e})();var gN=(()=>{class e extends r0{alignment=Pe("stretch");distribution=Pe("start");classes=Re(()=>P(M({},this.theme.components.Row),{[`align-${this.alignment()}`]:!0,[`distribute-${this.distribution()}`]:!0}));static \u0275fac=(()=>{let n;return function(o){return(n||(n=pr(e)))(o||e)}})();static \u0275cmp=so({type:e,selectors:[["a2ui-row"]],hostVars:2,hostBindings:function(r,o){r&2&&ta("alignment",o.alignment())("distribution",o.distribution())},inputs:{alignment:[1,"alignment"],distribution:[1,"distribution"]},features:[ao],decls:3,vars:4,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(r,o){r&1&&(dr(0,"section"),ra(1,aN,1,2,"ng-container",0,na),fo()),r&2&&(ho(o.theme.additionalStyles==null?null:o.theme.additionalStyles.Row),ki(o.classes()),io(),oa(o.component().properties.children))},dependencies:[o0],styles:["[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%]{display:flex;flex-direction:row;width:100%;min-height:100%;box-sizing:border-box}.align-start[_ngcontent-%COMP%]{align-items:start}.align-center[_ngcontent-%COMP%]{align-items:center}.align-end[_ngcontent-%COMP%]{align-items:end}.align-stretch[_ngcontent-%COMP%]{align-items:stretch}.distribute-start[_ngcontent-%COMP%]{justify-content:start}.distribute-center[_ngcontent-%COMP%]{justify-content:center}.distribute-end[_ngcontent-%COMP%]{justify-content:end}.distribute-spaceBetween[_ngcontent-%COMP%]{justify-content:space-between}.distribute-spaceAround[_ngcontent-%COMP%]{justify-content:space-around}.distribute-spaceEvenly[_ngcontent-%COMP%]{justify-content:space-evenly}"]})}return e})(),mN=(()=>{class e extends r0{alignment=Pe("stretch");distribution=Pe("start");classes=Re(()=>P(M({},this.theme.components.Column),{[`align-${this.alignment()}`]:!0,[`distribute-${this.distribution()}`]:!0}));static \u0275fac=(()=>{let n;return function(o){return(n||(n=pr(e)))(o||e)}})();static \u0275cmp=so({type:e,selectors:[["a2ui-column"]],inputs:{alignment:[1,"alignment"],distribution:[1,"distribution"]},features:[ao],decls:3,vars:4,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(r,o){r&1&&(dr(0,"section"),ra(1,cN,1,2,"ng-container",0,na),fo()),r&2&&(ho(o.theme.additionalStyles==null?null:o.theme.additionalStyles.Column),ki(o.classes()),io(),oa(o.component().properties.children))},dependencies:[o0],styles:["[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-width:100%;height:100%;box-sizing:border-box}.align-start[_ngcontent-%COMP%]{align-items:start}.align-center[_ngcontent-%COMP%]{align-items:center}.align-end[_ngcontent-%COMP%]{align-items:end}.align-stretch[_ngcontent-%COMP%]{align-items:stretch}.distribute-start[_ngcontent-%COMP%]{justify-content:start}.distribute-center[_ngcontent-%COMP%]{justify-content:center}.distribute-end[_ngcontent-%COMP%]{justify-content:end}.distribute-spaceBetween[_ngcontent-%COMP%]{justify-content:space-between}.distribute-spaceAround[_ngcontent-%COMP%]{justify-content:space-around}.distribute-spaceEvenly[_ngcontent-%COMP%]{justify-content:space-evenly}"]})}return e})(),yN=(()=>{class e{originalClassMap=new Map;sanitizer=b(Xp);markdownIt=n0({highlight:(n,r)=>{if(r==="html"){let o=document.createElement("iframe");return o.classList.add("html-view"),o.srcdoc=n,o.sandbox="",o.innerHTML}return n}});render(n,r){r&&this.applyTagClassMap(r);let o=this.markdownIt.render(n);return this.unapplyTagClassMap(),this.sanitizer.sanitize(ze.HTML,o)}applyTagClassMap(n){Object.entries(n).forEach(([r,o])=>{let i;switch(r){case"p":i="paragraph";break;case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":i="heading";break;case"ul":i="bullet_list";break;case"ol":i="ordered_list";break;case"li":i="list_item";break;case"a":i="link";break;case"strong":i="strong";break;case"em":i="em";break}if(!i)return;let s=`${i}_open`,u=this.markdownIt.renderer.rules[s];this.originalClassMap.set(s,u),this.markdownIt.renderer.rules[s]=(a,c,l,d,h)=>{let f=a[c];for(let p of o)f.attrJoin("class",p);return u?u.call(this,a,c,l,d,h):h.renderToken(a,c,l)}})}unapplyTagClassMap(){for(let[n,r]of this.originalClassMap)this.markdownIt.renderer.rules[n]=r;this.originalClassMap.clear()}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),bN=(()=>{class e extends r0{markdownRenderer=b(yN);text=Pe.required();usageHint=Pe.required();resolvedText=Re(()=>{let n=this.usageHint(),r=super.resolvePrimitive(this.text());if(r==null)return"(empty)";switch(n){case"h1":r=`# ${r}`;break;case"h2":r=`## ${r}`;break;case"h3":r=`### ${r}`;break;case"h4":r=`#### ${r}`;break;case"h5":r=`##### ${r}`;break;case"caption":r=`*${r}*`;break;default:r=String(r);break}return this.markdownRenderer.render(r,bo.appendToAll(this.theme.markdown,["ol","ul","li"],{}))});classes=Re(()=>{let n=this.usageHint();return bo.merge(this.theme.components.Text.all,n?this.theme.components.Text[n]:{})});additionalStyles=Re(()=>{let n=this.usageHint(),r=this.theme.additionalStyles?.Text;if(!r)return null;let o={};return this.areHintedStyles(r)?o=r[n??"body"]:o=r,o});areHintedStyles(n){return typeof n!="object"||!n||Array.isArray(n)?!1:["h1","h2","h3","h4","h5","h6","caption","body"].every(o=>o in n)}static \u0275fac=(()=>{let n;return function(o){return(n||(n=pr(e)))(o||e)}})();static \u0275cmp=so({type:e,selectors:[["a2ui-text"]],inputs:{text:[1,"text"],usageHint:[1,"usageHint"]},features:[ao],decls:1,vars:5,consts:[[3,"innerHTML"]],template:function(r,o){r&1&&ia(0,"section",0),r&2&&(ho(o.additionalStyles()),ki(o.classes()),sa("innerHTML",o.resolvedText(),zd))},styles:[`a2ui-text{display:block;flex:var(--weight)}a2ui-text h1,a2ui-text h2,a2ui-text h3,a2ui-text h4,a2ui-text h5{line-height:inherit;font:inherit} -`],encapsulation:2})}return e})(),jG={Row:{type:()=>gN,bindings:e=>{let t=e.properties;return[U("alignment",()=>t.alignment??"stretch"),U("distribution",()=>t.distribution??"start")]}},Column:{type:()=>mN,bindings:e=>{let t=e.properties;return[U("alignment",()=>t.alignment??"stretch"),U("distribution",()=>t.distribution??"start")]}},List:{type:()=>import("./chunk-Y7O3NHKW.js").then(e=>e.List),bindings:e=>{let t=e.properties;return[U("direction",()=>t.direction??"vertical")]}},Card:()=>import("./chunk-IT263FCL.js").then(e=>e.Card),Image:{type:()=>import("./chunk-URGIGLGR.js").then(e=>e.Image),bindings:e=>{let t=e.properties;return[U("url",()=>t.url),U("usageHint",()=>t.usageHint)]}},Icon:{type:()=>import("./chunk-4LH47YYI.js").then(e=>e.Icon),bindings:e=>{let t=e.properties;return[U("name",()=>t.name)]}},Video:{type:()=>import("./chunk-R6ZR5LUR.js").then(e=>e.Video),bindings:e=>{let t=e.properties;return[U("url",()=>t.url)]}},AudioPlayer:{type:()=>import("./chunk-3BJ4SYVH.js").then(e=>e.Audio),bindings:e=>{let t=e.properties;return[U("url",()=>t.url)]}},Text:{type:()=>bN,bindings:e=>{let t=e.properties;return[U("text",()=>t.text),U("usageHint",()=>t.usageHint||null)]}},Button:{type:()=>import("./chunk-Q6H4XMU7.js").then(e=>e.Button),bindings:e=>{let t=e.properties;return[U("action",()=>t.action)]}},Divider:()=>import("./chunk-DM36II44.js").then(e=>e.Divider),MultipleChoice:{type:()=>import("./chunk-BPUQWVAT.js").then(e=>e.MultipleChoice),bindings:e=>{let t=e.properties;return[U("options",()=>t.options||[]),U("value",()=>t.selections),U("description",()=>"Select an item")]}},TextField:{type:()=>import("./chunk-P4MFJI72.js").then(e=>e.TextField),bindings:e=>{let t=e.properties;return[U("text",()=>t.text??null),U("label",()=>t.label),U("inputType",()=>t.type)]}},DateTimeInput:{type:()=>import("./chunk-6CJBO2JX.js").then(e=>e.DatetimeInput),bindings:e=>{let t=e.properties;return[U("enableDate",()=>t.enableDate),U("enableTime",()=>t.enableTime),U("value",()=>t.value)]}},CheckBox:{type:()=>import("./chunk-SXB5AC5V.js").then(e=>e.Checkbox),bindings:e=>{let t=e.properties;return[U("label",()=>t.label),U("value",()=>t.value)]}},Slider:{type:()=>import("./chunk-ET35KXUM.js").then(e=>e.Slider),bindings:e=>{let t=e.properties;return[U("value",()=>t.value),U("minValue",()=>t.minValue),U("maxValue",()=>t.maxValue),U("label",()=>"")]}},Tabs:{type:()=>import("./chunk-4VDZU6IO.js").then(e=>e.Tabs),bindings:e=>{let t=e.properties;return[U("tabs",()=>t.tabItems)]}},Modal:{type:()=>import("./chunk-AQDQIDAM.js").then(e=>e.Modal),bindings:()=>[]}},BG=(()=>{class e{surfaceId=Pe.required();surface=Pe.required();styles=Re(()=>{let n=this.surface(),r={};if(n?.styles)for(let[o,i]of Object.entries(n.styles))switch(o){case"primaryColor":{r["--p-100"]="#ffffff",r["--p-99"]=`color-mix(in srgb, ${i} 2%, white 98%)`,r["--p-98"]=`color-mix(in srgb, ${i} 4%, white 96%)`,r["--p-95"]=`color-mix(in srgb, ${i} 10%, white 90%)`,r["--p-90"]=`color-mix(in srgb, ${i} 20%, white 80%)`,r["--p-80"]=`color-mix(in srgb, ${i} 40%, white 60%)`,r["--p-70"]=`color-mix(in srgb, ${i} 60%, white 40%)`,r["--p-60"]=`color-mix(in srgb, ${i} 80%, white 20%)`,r["--p-50"]=i,r["--p-40"]=`color-mix(in srgb, ${i} 80%, black 20%)`,r["--p-35"]=`color-mix(in srgb, ${i} 70%, black 30%)`,r["--p-30"]=`color-mix(in srgb, ${i} 60%, black 40%)`,r["--p-25"]=`color-mix(in srgb, ${i} 50%, black 50%)`,r["--p-20"]=`color-mix(in srgb, ${i} 40%, black 60%)`,r["--p-15"]=`color-mix(in srgb, ${i} 30%, black 70%)`,r["--p-10"]=`color-mix(in srgb, ${i} 20%, black 80%)`,r["--p-5"]=`color-mix(in srgb, ${i} 10%, black 90%)`,r["--0"]="#00000";break}case"font":{r["--font-family"]=i,r["--font-family-flex"]=i;break}}return r});static \u0275fac=function(r){return new(r||e)};static \u0275cmp=so({type:e,selectors:[["a2ui-surface"]],hostVars:2,hostBindings:function(r,o){r&2&&ho(o.styles())},inputs:{surfaceId:[1,"surfaceId"],surface:[1,"surface"]},decls:3,vars:3,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(r,o){if(r&1&&(aa(0)(1),Cf(2,lN,1,2,"ng-container",0)),r&2){let i=ca(o.surfaceId());io();let s=ca(o.surface());io(),wf(i&&s?2:-1)}},dependencies:[o0],styles:["[_nghost-%COMP%]{display:flex;min-height:0;max-height:100%;flex-direction:column;gap:16px}"]})}return e})();export{ne as a,Hn as b,aE as c,B as d,Ic as e,he as f,as as g,Po as h,jo as i,hE as j,Or as k,gE as l,Bt as m,E3 as n,Ho as o,Ct as p,xs as q,_E as r,wE as s,Un as t,Nc as u,Se as v,kE as w,Vt as x,$o as y,Ss as z,FE as A,OE as B,kc as C,Rc as D,$E as E,UE as F,gn as G,qE as H,GE as I,Fc as J,Oc as K,$0 as L,Pc as M,WE as N,z0 as O,Ms as P,QE as Q,KE as R,G0 as S,As as T,W0 as U,Z0 as V,Y0 as W,Ns as X,JE as Y,XE as Z,Q0 as _,eC as $,D as aa,xt as ba,Hs as ca,T as da,It as ea,oC as fa,x as ga,A as ha,b as ia,hg as ja,Ae as ka,Ur as la,wC as ma,Tg as na,Sg as oa,Vg as pa,Hg as qa,me as ra,X as sa,$e as ta,or as ua,Ht as va,Ce as wa,We as xa,Gt as ya,xn as za,ai as Aa,Fu as Ba,pr as Ca,Zt as Da,Du as Ea,Ou as Fa,hr as Ga,m_ as Ha,Lu as Ia,ay as Ja,ze as Ka,zd as La,W_ as Ma,Z_ as Na,Y_ as Oa,io as Pa,Nt as Qa,hw as Ra,Sn as Sa,lr as Ta,Ti as Ua,ee as Va,px as Wa,pt as Xa,An as Ya,vb as Za,Db as _a,so as $a,Kt as ab,ht as bb,uo as cb,oI as db,ao as eb,xb as fb,Ib as gb,Tb as hb,yf as ib,Mi as jb,mI as kb,Ab as lb,co as mb,Rb as nb,ta as ob,bI as pb,Cf as qb,_f as rb,wf as sb,DI as tb,na as ub,ra as vb,oa as wb,lo as xb,dr as yb,fo as zb,Fb as Ab,xf as Bb,If as Cb,ia as Db,Tf as Eb,Sf as Fb,po as Gb,II as Hb,sa as Ib,Lb as Jb,jb as Kb,Ni as Lb,kI as Mb,RI as Nb,Vb as Ob,Hb as Pb,OI as Qb,PI as Rb,$b as Sb,Ub as Tb,LI as Ub,jI as Vb,ua as Wb,Zb as Xb,ho as Yb,ki as Zb,u2 as _b,o1 as $b,Mf as ac,i1 as bc,u1 as cc,c2 as dc,a1 as ec,aa as fc,ca as gc,la as hc,l2 as ic,d2 as jc,f2 as kc,m2 as lc,y2 as mc,b2 as nc,v2 as oc,D2 as pc,C2 as qc,_2 as rc,w2 as sc,x2 as tc,da as uc,xe as vc,Re as wc,S2 as xc,Ff as yc,D1 as zc,F7 as Ac,O7 as Bc,Pe as Cc,P7 as Dc,L7 as Ec,j7 as Fc,qf as Gc,Gf as Hc,tT as Ic,nT as Jc,V7 as Kc,H7 as Lc,$7 as Mc,bo as Nc,kt as Oc,LT as Pc,Eo as Qc,tv as Rc,nv as Sc,HT as Tc,aS as Uc,cS as Vc,Cv as Wc,dS as Xc,fS as Yc,pS as Zc,mS as _c,bS as $c,DS as ad,ES as bd,Pp as cd,xv as dd,GH as ed,qp as fd,LS as gd,zS as hd,Gv as id,fM as jd,cU as kd,Xp as ld,dN as md,fN as nd,pN as od,r0 as pd,o0 as qd,jG as rd,BG as sd}; +`],encapsulation:2})}return e})(),jG={Row:{type:()=>gN,bindings:e=>{let t=e.properties;return[U("alignment",()=>t.alignment??"stretch"),U("distribution",()=>t.distribution??"start")]}},Column:{type:()=>mN,bindings:e=>{let t=e.properties;return[U("alignment",()=>t.alignment??"stretch"),U("distribution",()=>t.distribution??"start")]}},List:{type:()=>import("./chunk-4S2CIXCW.js").then(e=>e.List),bindings:e=>{let t=e.properties;return[U("direction",()=>t.direction??"vertical")]}},Card:()=>import("./chunk-CD6LWQYN.js").then(e=>e.Card),Image:{type:()=>import("./chunk-7P7JIWGK.js").then(e=>e.Image),bindings:e=>{let t=e.properties;return[U("url",()=>t.url),U("usageHint",()=>t.usageHint)]}},Icon:{type:()=>import("./chunk-VUI6RO2X.js").then(e=>e.Icon),bindings:e=>{let t=e.properties;return[U("name",()=>t.name)]}},Video:{type:()=>import("./chunk-5VJ6OSLK.js").then(e=>e.Video),bindings:e=>{let t=e.properties;return[U("url",()=>t.url)]}},AudioPlayer:{type:()=>import("./chunk-NK4C5UIR.js").then(e=>e.Audio),bindings:e=>{let t=e.properties;return[U("url",()=>t.url)]}},Text:{type:()=>bN,bindings:e=>{let t=e.properties;return[U("text",()=>t.text),U("usageHint",()=>t.usageHint||null)]}},Button:{type:()=>import("./chunk-2VKC3BHH.js").then(e=>e.Button),bindings:e=>{let t=e.properties;return[U("action",()=>t.action)]}},Divider:()=>import("./chunk-2MVVEOIQ.js").then(e=>e.Divider),MultipleChoice:{type:()=>import("./chunk-DTNGXRUJ.js").then(e=>e.MultipleChoice),bindings:e=>{let t=e.properties;return[U("options",()=>t.options||[]),U("value",()=>t.selections),U("description",()=>"Select an item")]}},TextField:{type:()=>import("./chunk-HCQ2TSHS.js").then(e=>e.TextField),bindings:e=>{let t=e.properties;return[U("text",()=>t.text??null),U("label",()=>t.label),U("inputType",()=>t.type)]}},DateTimeInput:{type:()=>import("./chunk-PR5T53UC.js").then(e=>e.DatetimeInput),bindings:e=>{let t=e.properties;return[U("enableDate",()=>t.enableDate),U("enableTime",()=>t.enableTime),U("value",()=>t.value)]}},CheckBox:{type:()=>import("./chunk-A2SOFJNC.js").then(e=>e.Checkbox),bindings:e=>{let t=e.properties;return[U("label",()=>t.label),U("value",()=>t.value)]}},Slider:{type:()=>import("./chunk-GGOEHXD2.js").then(e=>e.Slider),bindings:e=>{let t=e.properties;return[U("value",()=>t.value),U("minValue",()=>t.minValue),U("maxValue",()=>t.maxValue),U("label",()=>"")]}},Tabs:{type:()=>import("./chunk-JUJUP2UX.js").then(e=>e.Tabs),bindings:e=>{let t=e.properties;return[U("tabs",()=>t.tabItems)]}},Modal:{type:()=>import("./chunk-WXV43367.js").then(e=>e.Modal),bindings:()=>[]}},BG=(()=>{class e{surfaceId=Pe.required();surface=Pe.required();styles=Re(()=>{let n=this.surface(),r={};if(n?.styles)for(let[o,i]of Object.entries(n.styles))switch(o){case"primaryColor":{r["--p-100"]="#ffffff",r["--p-99"]=`color-mix(in srgb, ${i} 2%, white 98%)`,r["--p-98"]=`color-mix(in srgb, ${i} 4%, white 96%)`,r["--p-95"]=`color-mix(in srgb, ${i} 10%, white 90%)`,r["--p-90"]=`color-mix(in srgb, ${i} 20%, white 80%)`,r["--p-80"]=`color-mix(in srgb, ${i} 40%, white 60%)`,r["--p-70"]=`color-mix(in srgb, ${i} 60%, white 40%)`,r["--p-60"]=`color-mix(in srgb, ${i} 80%, white 20%)`,r["--p-50"]=i,r["--p-40"]=`color-mix(in srgb, ${i} 80%, black 20%)`,r["--p-35"]=`color-mix(in srgb, ${i} 70%, black 30%)`,r["--p-30"]=`color-mix(in srgb, ${i} 60%, black 40%)`,r["--p-25"]=`color-mix(in srgb, ${i} 50%, black 50%)`,r["--p-20"]=`color-mix(in srgb, ${i} 40%, black 60%)`,r["--p-15"]=`color-mix(in srgb, ${i} 30%, black 70%)`,r["--p-10"]=`color-mix(in srgb, ${i} 20%, black 80%)`,r["--p-5"]=`color-mix(in srgb, ${i} 10%, black 90%)`,r["--0"]="#00000";break}case"font":{r["--font-family"]=i,r["--font-family-flex"]=i;break}}return r});static \u0275fac=function(r){return new(r||e)};static \u0275cmp=so({type:e,selectors:[["a2ui-surface"]],hostVars:2,hostBindings:function(r,o){r&2&&ho(o.styles())},inputs:{surfaceId:[1,"surfaceId"],surface:[1,"surface"]},decls:3,vars:3,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(r,o){if(r&1&&(aa(0)(1),Cf(2,lN,1,2,"ng-container",0)),r&2){let i=ca(o.surfaceId());io();let s=ca(o.surface());io(),wf(i&&s?2:-1)}},dependencies:[o0],styles:["[_nghost-%COMP%]{display:flex;min-height:0;max-height:100%;flex-direction:column;gap:16px}"]})}return e})();export{ne as a,Hn as b,aE as c,B as d,Ic as e,he as f,as as g,Po as h,jo as i,hE as j,Or as k,gE as l,Bt as m,E3 as n,Ho as o,Ct as p,xs as q,_E as r,wE as s,Un as t,Nc as u,Se as v,kE as w,Vt as x,$o as y,Ss as z,FE as A,OE as B,kc as C,Rc as D,$E as E,UE as F,gn as G,qE as H,GE as I,Fc as J,Oc as K,$0 as L,Pc as M,WE as N,z0 as O,Ms as P,QE as Q,KE as R,G0 as S,As as T,W0 as U,Z0 as V,Y0 as W,Ns as X,JE as Y,XE as Z,Q0 as _,eC as $,D as aa,xt as ba,Hs as ca,T as da,It as ea,oC as fa,x as ga,A as ha,b as ia,hg as ja,Ae as ka,Ur as la,wC as ma,Tg as na,Sg as oa,Vg as pa,Hg as qa,me as ra,X as sa,$e as ta,or as ua,Ht as va,Ce as wa,We as xa,Gt as ya,xn as za,ai as Aa,Fu as Ba,pr as Ca,Zt as Da,Du as Ea,Ou as Fa,hr as Ga,m_ as Ha,Lu as Ia,ay as Ja,ze as Ka,zd as La,W_ as Ma,Z_ as Na,Y_ as Oa,io as Pa,Nt as Qa,hw as Ra,Sn as Sa,lr as Ta,Ti as Ua,ee as Va,px as Wa,pt as Xa,An as Ya,vb as Za,Db as _a,so as $a,Kt as ab,ht as bb,uo as cb,oI as db,ao as eb,xb as fb,Ib as gb,Tb as hb,yf as ib,Mi as jb,mI as kb,Ab as lb,co as mb,Rb as nb,ta as ob,bI as pb,Cf as qb,_f as rb,wf as sb,DI as tb,na as ub,ra as vb,oa as wb,lo as xb,dr as yb,fo as zb,Fb as Ab,xf as Bb,If as Cb,ia as Db,Tf as Eb,Sf as Fb,po as Gb,II as Hb,sa as Ib,Lb as Jb,jb as Kb,Ni as Lb,kI as Mb,RI as Nb,Vb as Ob,Hb as Pb,OI as Qb,PI as Rb,$b as Sb,Ub as Tb,LI as Ub,jI as Vb,ua as Wb,Zb as Xb,ho as Yb,ki as Zb,u2 as _b,o1 as $b,Mf as ac,i1 as bc,u1 as cc,c2 as dc,a1 as ec,aa as fc,ca as gc,la as hc,l2 as ic,d2 as jc,f2 as kc,m2 as lc,y2 as mc,b2 as nc,v2 as oc,D2 as pc,C2 as qc,_2 as rc,w2 as sc,x2 as tc,da as uc,xe as vc,Re as wc,S2 as xc,Ff as yc,D1 as zc,F7 as Ac,O7 as Bc,Pe as Cc,P7 as Dc,L7 as Ec,j7 as Fc,qf as Gc,Gf as Hc,tT as Ic,nT as Jc,V7 as Kc,H7 as Lc,$7 as Mc,bo as Nc,kt as Oc,LT as Pc,Eo as Qc,tv as Rc,nv as Sc,HT as Tc,aS as Uc,cS as Vc,Cv as Wc,dS as Xc,fS as Yc,pS as Zc,mS as _c,bS as $c,DS as ad,ES as bd,Pp as cd,xv as dd,GH as ed,qp as fd,LS as gd,zS as hd,Gv as id,fM as jd,cU as kd,Xp as ld,dN as md,fN as nd,pN as od,r0 as pd,o0 as qd,jG as rd,BG as sd}; diff --git a/src/google/adk/cli/browser/chunk-F57TI45K.js b/src/google/adk/cli/browser/chunk-F57TI45K.js deleted file mode 100644 index 7fbe35e94f..0000000000 --- a/src/google/adk/cli/browser/chunk-F57TI45K.js +++ /dev/null @@ -1 +0,0 @@ -import{b as y,c as f,d as p,e as h}from"./chunk-TNJPXCAB.js";import{a as g,d,g as u}from"./chunk-W7PRDKNL.js";import{c as m}from"./chunk-WBLSVR3V.js";import{A as l,M as s}from"./chunk-QFMJV7VH.js";import{g as o,i}from"./chunk-JRNAXTJ7.js";import{j as a}from"./chunk-RMXJBC7V.js";var L={common:s,getConfig:l,insertCluster:d,insertEdge:p,insertEdgeLabel:y,insertMarkers:h,insertNode:u,interpolateToCurve:m,labelHelper:g,log:i,positionEdgeLabel:f},t={},w=o(r=>{for(let e of r)t[e.name]=e},"registerLayoutLoaders"),c=o(()=>{w([{name:"dagre",loader:o(()=>a(null,null,function*(){return yield import("./chunk-TNYN2TVW.js")}),"loader")},{name:"cose-bilkent",loader:o(()=>a(null,null,function*(){return yield import("./chunk-HD4LLD2O.js")}),"loader")}])},"registerDefaultLayoutLoaders");c();var C=o((r,e)=>a(null,null,function*(){if(!(r.layoutAlgorithm in t))throw new Error(`Unknown layout algorithm: ${r.layoutAlgorithm}`);let n=t[r.layoutAlgorithm];return(yield n.loader()).render(r,e,L,{algorithm:n.algorithm})}),"render"),D=o((r="",{fallback:e="dagre"}={})=>{if(r in t)return r;if(e in t)return i.warn(`Layout algorithm ${r} is not registered. Using ${e} as fallback.`),e;throw new Error(`Both layout algorithms ${r} and ${e} are not registered.`)},"getRegisteredLayoutAlgorithm");export{w as a,C as b,D as c}; diff --git a/src/google/adk/cli/browser/chunk-FDH623K7.js b/src/google/adk/cli/browser/chunk-FDH623K7.js deleted file mode 100644 index 1b0ae81555..0000000000 --- a/src/google/adk/cli/browser/chunk-FDH623K7.js +++ /dev/null @@ -1 +0,0 @@ -import{a as r,b as e}from"./chunk-JNY2YWG7.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{r as RadarModule,e as createRadarServices}; diff --git a/src/google/adk/cli/browser/chunk-ET35KXUM.js b/src/google/adk/cli/browser/chunk-GGOEHXD2.js similarity index 95% rename from src/google/adk/cli/browser/chunk-ET35KXUM.js rename to src/google/adk/cli/browser/chunk-GGOEHXD2.js index e116a526fb..3ea6428185 100644 --- a/src/google/adk/cli/browser/chunk-ET35KXUM.js +++ b/src/google/adk/cli/browser/chunk-GGOEHXD2.js @@ -1 +1 @@ -import{$a as s,Bb as r,Ca as m,Cb as u,Cc as n,Ib as d,Kb as c,Pa as l,Yb as v,Zb as o,_b as g,ac as f,eb as p,pd as b,wc as h}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var M=["a2ui-slider",""],E=(()=>{class a extends b{value=n.required();label=n("");minValue=n.required();maxValue=n.required();inputId=super.getUniqueId("a2ui-slider");resolvedValue=h(()=>super.resolvePrimitive(this.value())??0);handleInput(t){let i=this.value()?.path;!(t.target instanceof HTMLInputElement)||!i||this.processor.setData(this.component(),i,t.target.valueAsNumber,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(a)))(e||a)}})();static \u0275cmp=s({type:a,selectors:[["","a2ui-slider",""]],inputs:{value:[1,"value"],label:[1,"label"],minValue:[1,"minValue"],maxValue:[1,"maxValue"]},features:[p],attrs:M,decls:4,vars:14,consts:[[3,"for"],["autocomplete","off","type","range",3,"input","value","min","max","id"]],template:function(i,e){i&1&&(r(0,"section")(1,"label",0),g(2),u(),r(3,"input",1),c("input",function(y){return e.handleInput(y)}),u()()),i&2&&(o(e.theme.components.Slider.container),l(),o(e.theme.components.Slider.label),d("htmlFor",e.inputId),l(),f(" ",e.label()," "),l(),v(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Slider),o(e.theme.components.Slider.element),d("value",e.resolvedValue())("min",e.minValue())("max",e.maxValue())("id",e.inputId))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight)}input[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return a})();export{E as Slider}; +import{$a as s,Bb as r,Ca as m,Cb as u,Cc as n,Ib as d,Kb as c,Pa as l,Yb as v,Zb as o,_b as g,ac as f,eb as p,pd as b,wc as h}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var M=["a2ui-slider",""],E=(()=>{class a extends b{value=n.required();label=n("");minValue=n.required();maxValue=n.required();inputId=super.getUniqueId("a2ui-slider");resolvedValue=h(()=>super.resolvePrimitive(this.value())??0);handleInput(t){let i=this.value()?.path;!(t.target instanceof HTMLInputElement)||!i||this.processor.setData(this.component(),i,t.target.valueAsNumber,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(a)))(e||a)}})();static \u0275cmp=s({type:a,selectors:[["","a2ui-slider",""]],inputs:{value:[1,"value"],label:[1,"label"],minValue:[1,"minValue"],maxValue:[1,"maxValue"]},features:[p],attrs:M,decls:4,vars:14,consts:[[3,"for"],["autocomplete","off","type","range",3,"input","value","min","max","id"]],template:function(i,e){i&1&&(r(0,"section")(1,"label",0),g(2),u(),r(3,"input",1),c("input",function(y){return e.handleInput(y)}),u()()),i&2&&(o(e.theme.components.Slider.container),l(),o(e.theme.components.Slider.label),d("htmlFor",e.inputId),l(),f(" ",e.label()," "),l(),v(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Slider),o(e.theme.components.Slider.element),d("value",e.resolvedValue())("min",e.minValue())("max",e.maxValue())("id",e.inputId))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight)}input[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return a})();export{E as Slider}; diff --git a/src/google/adk/cli/browser/chunk-HTWWQBR6.js b/src/google/adk/cli/browser/chunk-GLGRLUIJ.js similarity index 99% rename from src/google/adk/cli/browser/chunk-HTWWQBR6.js rename to src/google/adk/cli/browser/chunk-GLGRLUIJ.js index 3761e7ee90..e61575bf49 100644 --- a/src/google/adk/cli/browser/chunk-HTWWQBR6.js +++ b/src/google/adk/cli/browser/chunk-GLGRLUIJ.js @@ -1,2 +1,2 @@ -import"./chunk-RMXJBC7V.js";var O=function(l,i){if(!(l instanceof i))throw new TypeError("Cannot call a class as a function")},R=(function(){function l(i,e){for(var t=0;t1&&arguments[1]!==void 0?arguments[1]:1,e=i>0?l.toFixed(i).replace(/0+$/,"").replace(/\.$/,""):l.toString();return e||"0"}var z=(function(){function l(i,e,t,r){O(this,l);var n=this;function o(a){if(a.startsWith("hsl")){var s=a.match(/([\-\d\.e]+)/g).map(Number),p=y(s,4),u=p[0],f=p[1],d=p[2],b=p[3];b===void 0&&(b=1),u/=360,f/=100,d/=100,n.hsla=[u,f,d,b]}else if(a.startsWith("rgb")){var m=a.match(/([\-\d\.e]+)/g).map(Number),h=y(m,4),v=h[0],g=h[1],S=h[2],k=h[3];k===void 0&&(k=1),n.rgba=[v,g,S,k]}else a.startsWith("#")?n.rgba=l.hexToRgb(a):n.rgba=l.nameToRgb(a)||l.hexToRgb(a)}if(i!==void 0)if(Array.isArray(i))this.rgba=i;else if(t===void 0){var c=i&&""+i;c&&o(c.toLowerCase())}else this.rgba=[i,e,t,r===void 0?1:r]}return R(l,[{key:"printRGB",value:function(e){var t=e?this.rgba:this.rgba.slice(0,3),r=t.map(function(n,o){return A(n,o===3?3:0)});return e?"rgba("+r+")":"rgb("+r+")"}},{key:"printHSL",value:function(e){var t=[360,100,100,1],r=["","%","%",""],n=e?this.hsla:this.hsla.slice(0,3),o=n.map(function(c,a){return A(c*t[a],a===3?3:1)+r[a]});return e?"hsla("+o+")":"hsl("+o+")"}},{key:"printHex",value:function(e){var t=this.hex;return e?t:t.substring(0,7)}},{key:"rgba",get:function(){if(this._rgba)return this._rgba;if(!this._hsla)throw new Error("No color is set");return this._rgba=l.hslToRgb(this._hsla)},set:function(e){e.length===3&&(e[3]=1),this._rgba=e,this._hsla=null}},{key:"rgbString",get:function(){return this.printRGB()}},{key:"rgbaString",get:function(){return this.printRGB(!0)}},{key:"hsla",get:function(){if(this._hsla)return this._hsla;if(!this._rgba)throw new Error("No color is set");return this._hsla=l.rgbToHsl(this._rgba)},set:function(e){e.length===3&&(e[3]=1),this._hsla=e,this._rgba=null}},{key:"hslString",get:function(){return this.printHSL()}},{key:"hslaString",get:function(){return this.printHSL(!0)}},{key:"hex",get:function(){var e=this.rgba,t=e.map(function(r,n){return n<3?r.toString(16):Math.round(r*255).toString(16)});return"#"+t.map(function(r){return r.padStart(2,"0")}).join("")},set:function(e){this.rgba=l.hexToRgb(e)}}],[{key:"hexToRgb",value:function(e){var t=(e.startsWith("#")?e.slice(1):e).replace(/^(\w{3})$/,"$1F").replace(/^(\w)(\w)(\w)(\w)$/,"$1$1$2$2$3$3$4$4").replace(/^(\w{6})$/,"$1FF");if(!t.match(/^([0-9a-fA-F]{8})$/))throw new Error("Unknown hex color; "+e);var r=t.match(/^(\w\w)(\w\w)(\w\w)(\w\w)$/).slice(1).map(function(n){return parseInt(n,16)});return r[3]=r[3]/255,r}},{key:"nameToRgb",value:function(e){var t=e.toLowerCase().replace("at","T").replace(/[aeiouyldf]/g,"").replace("ght","L").replace("rk","D").slice(-5,4),r=N[t];return r===void 0?r:l.hexToRgb(r.replace(/\-/g,"00").padStart(6,"f"))}},{key:"rgbToHsl",value:function(e){var t=y(e,4),r=t[0],n=t[1],o=t[2],c=t[3];r/=255,n/=255,o/=255;var a=Math.max(r,n,o),s=Math.min(r,n,o),p=void 0,u=void 0,f=(a+s)/2;if(a===s)p=u=0;else{var d=a-s;switch(u=f>.5?d/(2-a-s):d/(a+s),a){case r:p=(n-o)/d+(n1&&(g-=1),g<.16666666666666666?h+(v-h)*6*g:g<.5?v:g<.6666666666666666?h+(v-h)*(.6666666666666666-g)*6:h},f=o<.5?o*(1+n):o+n-o*n,d=2*o-f;a=u(d,f,r+1/3),s=u(d,f,r),p=u(d,f,r-1/3)}var b=[a*255,s*255,p*255].map(Math.round);return b[3]=c,b}}]),l})(),F=(function(){function l(){O(this,l),this._events=[]}return R(l,[{key:"add",value:function(e,t,r){e.addEventListener(t,r,!1),this._events.push({target:e,type:t,handler:r})}},{key:"remove",value:function(e,t,r){this._events=this._events.filter(function(n){var o=!0;return e&&e!==n.target&&(o=!1),t&&t!==n.type&&(o=!1),r&&r!==n.handler&&(o=!1),o&&l._doRemove(n.target,n.type,n.handler),!o})}},{key:"destroy",value:function(){this._events.forEach(function(e){return l._doRemove(e.target,e.type,e.handler)}),this._events=[]}}],[{key:"_doRemove",value:function(e,t,r){e.removeEventListener(t,r,!1)}}]),l})();function U(l){var i=document.createElement("div");return i.innerHTML=l,i.firstElementChild}function T(l,i,e){var t=!1;function r(a,s,p){return Math.max(s,Math.min(a,p))}function n(a,s,p){if(p&&(t=!0),!!t){a.preventDefault();var u=i.getBoundingClientRect(),f=u.width,d=u.height,b=s.clientX,m=s.clientY,h=r(b-u.left,0,f),v=r(m-u.top,0,d);e(h/f,v/d)}}function o(a,s){var p=a.buttons===void 0?a.which:a.buttons;p===1?n(a,a,s):t=!1}function c(a,s){a.touches.length===1?n(a,a.touches[0],s):t=!1}l.add(i,"mousedown",function(a){o(a,!0)}),l.add(i,"touchstart",function(a){c(a,!0)}),l.add(window,"mousemove",o),l.add(i,"touchmove",c),l.add(window,"mouseup",function(a){t=!1}),l.add(i,"touchend",function(a){t=!1}),l.add(i,"touchcancel",function(a){t=!1})}var B=`linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0 / 2em 2em, +import"./chunk-W7GRJBO5.js";var O=function(l,i){if(!(l instanceof i))throw new TypeError("Cannot call a class as a function")},R=(function(){function l(i,e){for(var t=0;t1&&arguments[1]!==void 0?arguments[1]:1,e=i>0?l.toFixed(i).replace(/0+$/,"").replace(/\.$/,""):l.toString();return e||"0"}var z=(function(){function l(i,e,t,r){O(this,l);var n=this;function o(a){if(a.startsWith("hsl")){var s=a.match(/([\-\d\.e]+)/g).map(Number),p=y(s,4),u=p[0],f=p[1],d=p[2],b=p[3];b===void 0&&(b=1),u/=360,f/=100,d/=100,n.hsla=[u,f,d,b]}else if(a.startsWith("rgb")){var m=a.match(/([\-\d\.e]+)/g).map(Number),h=y(m,4),v=h[0],g=h[1],S=h[2],k=h[3];k===void 0&&(k=1),n.rgba=[v,g,S,k]}else a.startsWith("#")?n.rgba=l.hexToRgb(a):n.rgba=l.nameToRgb(a)||l.hexToRgb(a)}if(i!==void 0)if(Array.isArray(i))this.rgba=i;else if(t===void 0){var c=i&&""+i;c&&o(c.toLowerCase())}else this.rgba=[i,e,t,r===void 0?1:r]}return R(l,[{key:"printRGB",value:function(e){var t=e?this.rgba:this.rgba.slice(0,3),r=t.map(function(n,o){return A(n,o===3?3:0)});return e?"rgba("+r+")":"rgb("+r+")"}},{key:"printHSL",value:function(e){var t=[360,100,100,1],r=["","%","%",""],n=e?this.hsla:this.hsla.slice(0,3),o=n.map(function(c,a){return A(c*t[a],a===3?3:1)+r[a]});return e?"hsla("+o+")":"hsl("+o+")"}},{key:"printHex",value:function(e){var t=this.hex;return e?t:t.substring(0,7)}},{key:"rgba",get:function(){if(this._rgba)return this._rgba;if(!this._hsla)throw new Error("No color is set");return this._rgba=l.hslToRgb(this._hsla)},set:function(e){e.length===3&&(e[3]=1),this._rgba=e,this._hsla=null}},{key:"rgbString",get:function(){return this.printRGB()}},{key:"rgbaString",get:function(){return this.printRGB(!0)}},{key:"hsla",get:function(){if(this._hsla)return this._hsla;if(!this._rgba)throw new Error("No color is set");return this._hsla=l.rgbToHsl(this._rgba)},set:function(e){e.length===3&&(e[3]=1),this._hsla=e,this._rgba=null}},{key:"hslString",get:function(){return this.printHSL()}},{key:"hslaString",get:function(){return this.printHSL(!0)}},{key:"hex",get:function(){var e=this.rgba,t=e.map(function(r,n){return n<3?r.toString(16):Math.round(r*255).toString(16)});return"#"+t.map(function(r){return r.padStart(2,"0")}).join("")},set:function(e){this.rgba=l.hexToRgb(e)}}],[{key:"hexToRgb",value:function(e){var t=(e.startsWith("#")?e.slice(1):e).replace(/^(\w{3})$/,"$1F").replace(/^(\w)(\w)(\w)(\w)$/,"$1$1$2$2$3$3$4$4").replace(/^(\w{6})$/,"$1FF");if(!t.match(/^([0-9a-fA-F]{8})$/))throw new Error("Unknown hex color; "+e);var r=t.match(/^(\w\w)(\w\w)(\w\w)(\w\w)$/).slice(1).map(function(n){return parseInt(n,16)});return r[3]=r[3]/255,r}},{key:"nameToRgb",value:function(e){var t=e.toLowerCase().replace("at","T").replace(/[aeiouyldf]/g,"").replace("ght","L").replace("rk","D").slice(-5,4),r=N[t];return r===void 0?r:l.hexToRgb(r.replace(/\-/g,"00").padStart(6,"f"))}},{key:"rgbToHsl",value:function(e){var t=y(e,4),r=t[0],n=t[1],o=t[2],c=t[3];r/=255,n/=255,o/=255;var a=Math.max(r,n,o),s=Math.min(r,n,o),p=void 0,u=void 0,f=(a+s)/2;if(a===s)p=u=0;else{var d=a-s;switch(u=f>.5?d/(2-a-s):d/(a+s),a){case r:p=(n-o)/d+(n1&&(g-=1),g<.16666666666666666?h+(v-h)*6*g:g<.5?v:g<.6666666666666666?h+(v-h)*(.6666666666666666-g)*6:h},f=o<.5?o*(1+n):o+n-o*n,d=2*o-f;a=u(d,f,r+1/3),s=u(d,f,r),p=u(d,f,r-1/3)}var b=[a*255,s*255,p*255].map(Math.round);return b[3]=c,b}}]),l})(),F=(function(){function l(){O(this,l),this._events=[]}return R(l,[{key:"add",value:function(e,t,r){e.addEventListener(t,r,!1),this._events.push({target:e,type:t,handler:r})}},{key:"remove",value:function(e,t,r){this._events=this._events.filter(function(n){var o=!0;return e&&e!==n.target&&(o=!1),t&&t!==n.type&&(o=!1),r&&r!==n.handler&&(o=!1),o&&l._doRemove(n.target,n.type,n.handler),!o})}},{key:"destroy",value:function(){this._events.forEach(function(e){return l._doRemove(e.target,e.type,e.handler)}),this._events=[]}}],[{key:"_doRemove",value:function(e,t,r){e.removeEventListener(t,r,!1)}}]),l})();function U(l){var i=document.createElement("div");return i.innerHTML=l,i.firstElementChild}function T(l,i,e){var t=!1;function r(a,s,p){return Math.max(s,Math.min(a,p))}function n(a,s,p){if(p&&(t=!0),!!t){a.preventDefault();var u=i.getBoundingClientRect(),f=u.width,d=u.height,b=s.clientX,m=s.clientY,h=r(b-u.left,0,f),v=r(m-u.top,0,d);e(h/f,v/d)}}function o(a,s){var p=a.buttons===void 0?a.which:a.buttons;p===1?n(a,a,s):t=!1}function c(a,s){a.touches.length===1?n(a,a.touches[0],s):t=!1}l.add(i,"mousedown",function(a){o(a,!0)}),l.add(i,"touchstart",function(a){c(a,!0)}),l.add(window,"mousemove",o),l.add(i,"touchmove",c),l.add(window,"mouseup",function(a){t=!1}),l.add(i,"touchend",function(a){t=!1}),l.add(i,"touchcancel",function(a){t=!1})}var B=`linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0 / 2em 2em, linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em / 2em 2em`,G=360,P="keydown",x="mousedown",H="focusin";function _(l,i){return(i||document).querySelector(l)}function M(l){l.preventDefault(),l.stopPropagation()}function D(l,i,e,t,r){l.add(i,P,function(n){e.indexOf(n.key)>=0&&(r&&M(n),t(n))})}var W=(function(){function l(i){O(this,l),this.settings={popup:"right",layout:"default",alpha:!0,editor:!0,editorFormat:"hex",cancelButton:!1,defaultColor:"#0cf"},this._events=new F,this.onChange=null,this.onDone=null,this.onOpen=null,this.onClose=null,this.setOptions(i)}return R(l,[{key:"setOptions",value:function(e){var t=this;if(!e)return;var r=this.settings;function n(s,p,u){for(var f in s)u&&u.indexOf(f)>=0||(p[f]=s[f])}if(e instanceof HTMLElement)r.parent=e;else{r.parent&&e.parent&&r.parent!==e.parent&&(this._events.remove(r.parent),this._popupInited=!1),n(e,r),e.onChange&&(this.onChange=e.onChange),e.onDone&&(this.onDone=e.onDone),e.onOpen&&(this.onOpen=e.onOpen),e.onClose&&(this.onClose=e.onClose);var o=e.color||e.colour;o&&this._setColor(o)}var c=r.parent;if(c&&r.popup&&!this._popupInited){var a=function(p){return t.openHandler(p)};this._events.add(c,"click",a),D(this._events,c,[" ","Spacebar","Enter"],a),this._popupInited=!0}else e.parent&&!r.popup&&this.show()}},{key:"openHandler",value:function(e){if(this.show()){e&&e.preventDefault(),this.settings.parent.style.pointerEvents="none";var t=e&&e.type===P?this._domEdit:this.domElement;setTimeout(function(){return t.focus()},100),this.onOpen&&this.onOpen(this.colour)}}},{key:"closeHandler",value:function(e){var t=e&&e.type,r=!1;if(!e)r=!0;else if(t===x||t===H){var n=(this.__containedEvent||0)+100;e.timeStamp>n&&(r=!0)}else M(e),r=!0;r&&this.hide()&&(this.settings.parent.style.pointerEvents="",t!==x&&this.settings.parent.focus(),this.onClose&&this.onClose(this.colour))}},{key:"movePopup",value:function(e,t){this.closeHandler(),this.setOptions(e),t&&this.openHandler()}},{key:"setColor",value:function(e,t){this._setColor(e,{silent:t})}},{key:"_setColor",value:function(e,t){if(typeof e=="string"&&(e=e.trim()),!!e){t=t||{};var r=void 0;try{r=new z(e)}catch(o){if(t.failSilently)return;throw o}if(!this.settings.alpha){var n=r.hsla;n[3]=1,r.hsla=n}this.colour=this.color=r,this._setHSLA(null,null,null,null,t)}}},{key:"setColour",value:function(e,t){this.setColor(e,t)}},{key:"show",value:function(){var e=this.settings.parent;if(!e)return!1;if(this.domElement){var t=this._toggleDOM(!0);return this._setPosition(),t}var r=this.settings.template||'

',n=U(r);return this.domElement=n,this._domH=_(".picker_hue",n),this._domSL=_(".picker_sl",n),this._domA=_(".picker_alpha",n),this._domEdit=_(".picker_editor input",n),this._domSample=_(".picker_sample",n),this._domOkay=_(".picker_done button",n),this._domCancel=_(".picker_cancel button",n),n.classList.add("layout_"+this.settings.layout),this.settings.alpha||n.classList.add("no_alpha"),this.settings.editor||n.classList.add("no_editor"),this.settings.cancelButton||n.classList.add("no_cancel"),this._ifPopup(function(){return n.classList.add("popup")}),this._setPosition(),this.colour?this._updateUI():this._setColor(this.settings.defaultColor),this._bindEvents(),!0}},{key:"hide",value:function(){return this._toggleDOM(!1)}},{key:"destroy",value:function(){this._events.destroy(),this.domElement&&this.settings.parent.removeChild(this.domElement)}},{key:"_bindEvents",value:function(){var e=this,t=this,r=this.domElement,n=this._events;function o(s,p,u){n.add(s,p,u)}o(r,"click",function(s){return s.preventDefault()}),T(n,this._domH,function(s,p){return t._setHSLA(s)}),T(n,this._domSL,function(s,p){return t._setHSLA(null,s,1-p)}),this.settings.alpha&&T(n,this._domA,function(s,p){return t._setHSLA(null,null,null,1-p)});var c=this._domEdit;o(c,"input",function(s){t._setColor(this.value,{fromEditor:!0,failSilently:!0})}),o(c,"focus",function(s){var p=this;p.selectionStart===p.selectionEnd&&p.select()}),this._ifPopup(function(){var s=function(f){return e.closeHandler(f)};o(window,x,s),o(window,H,s),D(n,r,["Esc","Escape"],s);var p=function(f){e.__containedEvent=f.timeStamp};o(r,x,p),o(r,H,p),o(e._domCancel,"click",s)});var a=function(p){e._ifPopup(function(){return e.closeHandler(p)}),e.onDone&&e.onDone(e.colour)};o(this._domOkay,"click",a),D(n,r,["Enter"],a)}},{key:"_setPosition",value:function(){var e=this.settings.parent,t=this.domElement;e!==t.parentNode&&e.appendChild(t),this._ifPopup(function(r){getComputedStyle(e).position==="static"&&(e.style.position="relative");var n=r===!0?"popup_right":"popup_"+r;["popup_top","popup_bottom","popup_left","popup_right"].forEach(function(o){o===n?t.classList.add(o):t.classList.remove(o)}),t.classList.add(n)})}},{key:"_setHSLA",value:function(e,t,r,n,o){o=o||{};var c=this.colour,a=c.hsla;[e,t,r,n].forEach(function(s,p){(s||s===0)&&(a[p]=s)}),c.hsla=a,this._updateUI(o),this.onChange&&!o.silent&&this.onChange(c)}},{key:"_updateUI",value:function(e){if(!this.domElement)return;e=e||{};var t=this.colour,r=t.hsla,n="hsl("+r[0]*G+", 100%, 50%)",o=t.hslString,c=t.hslaString,a=this._domH,s=this._domSL,p=this._domA,u=_(".picker_selector",a),f=_(".picker_selector",s),d=_(".picker_selector",p);function b(I,C,L){C.style.left=L*100+"%"}function m(I,C,L){C.style.top=L*100+"%"}b(a,u,r[0]),this._domSL.style.backgroundColor=this._domH.style.color=n,b(s,f,r[1]),m(s,f,1-r[2]),s.style.color=o,m(p,d,1-r[3]);var h=o,v=h.replace("hsl","hsla").replace(")",", 0)"),g="linear-gradient("+[h,v]+")";if(this._domA.style.background=g+", "+B,!e.fromEditor){var S=this.settings.editorFormat,k=this.settings.alpha,w=void 0;switch(S){case"rgb":w=t.printRGB(k);break;case"hsl":w=t.printHSL(k);break;default:w=t.printHex(k)}this._domEdit.value=w}this._domSample.style.color=c}},{key:"_ifPopup",value:function(e,t){this.settings.parent&&this.settings.popup?e&&e(this.settings.popup):t&&t()}},{key:"_toggleDOM",value:function(e){var t=this.domElement;if(!t)return!1;var r=e?"":"none",n=t.style.display!==r;return n&&(t.style.display=r),n}}]),l})();E=document.createElement("style"),E.textContent='.picker_wrapper.no_alpha .picker_alpha{display:none}.picker_wrapper.no_editor .picker_editor{position:absolute;z-index:-1;opacity:0}.picker_wrapper.no_cancel .picker_cancel{display:none}.layout_default.picker_wrapper{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:stretch;font-size:10px;width:25em;padding:.5em}.layout_default.picker_wrapper input,.layout_default.picker_wrapper button{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper::before{content:"";display:block;width:100%;height:0;order:1}.layout_default .picker_slider,.layout_default .picker_selector{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{flex:1 1 auto}.layout_default .picker_sl::before{content:"";display:block;padding-bottom:100%}.layout_default .picker_editor{order:1;width:6.5rem}.layout_default .picker_editor input{width:100%;height:100%}.layout_default .picker_sample{order:1;flex:1 1 auto}.layout_default .picker_done,.layout_default .picker_cancel{order:1}.picker_wrapper{box-sizing:border-box;background:#f2f2f2;box-shadow:0 0 0 1px silver;cursor:default;font-family:sans-serif;color:#444;pointer-events:auto}.picker_wrapper:focus{outline:none}.picker_wrapper button,.picker_wrapper input{box-sizing:border-box;border:none;box-shadow:0 0 0 1px silver;outline:none}.picker_wrapper button:focus,.picker_wrapper button:active,.picker_wrapper input:focus,.picker_wrapper input:active{box-shadow:0 0 2px 1px #1e90ff}.picker_wrapper button{padding:.4em .6em;cursor:pointer;background-color:#f5f5f5;background-image:linear-gradient(0deg, gainsboro, transparent)}.picker_wrapper button:active{background-image:linear-gradient(0deg, transparent, gainsboro)}.picker_wrapper button:hover{background-color:#fff}.picker_selector{position:absolute;z-index:1;display:block;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);border:2px solid #fff;border-radius:100%;box-shadow:0 0 3px 1px #67b9ff;background:currentColor;cursor:pointer}.picker_slider .picker_selector{border-radius:2px}.picker_hue{position:relative;background-image:linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red);box-shadow:0 0 0 1px silver}.picker_sl{position:relative;box-shadow:0 0 0 1px silver;background-image:linear-gradient(180deg, white, rgba(255, 255, 255, 0) 50%),linear-gradient(0deg, black, rgba(0, 0, 0, 0) 50%),linear-gradient(90deg, #808080, rgba(128, 128, 128, 0))}.picker_alpha,.picker_sample{position:relative;background:linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0/2em 2em,linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em/2em 2em;box-shadow:0 0 0 1px silver}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{font-family:monospace;padding:.2em .4em}.picker_sample::before{content:"";position:absolute;display:block;width:100%;height:100%;background:currentColor}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{position:absolute;z-index:2;margin:1.5em}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{background:#f2f2f2;box-shadow:0 0 10px 1px rgba(0,0,0,.4)}.picker_wrapper.popup .picker_arrow{width:3em;height:3em;margin:0}.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{content:"";display:block;position:absolute;top:0;left:0;z-index:-99}.picker_wrapper.popup .picker_arrow::before{width:100%;height:100%;-webkit-transform:skew(45deg);transform:skew(45deg);-webkit-transform-origin:0 100%;transform-origin:0 100%}.picker_wrapper.popup .picker_arrow::after{width:150%;height:150%;box-shadow:none}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.popup.popup_bottom{top:100%;left:0}.popup.popup_bottom .picker_arrow{top:0;left:0;-webkit-transform:rotate(90deg) scale(1, -1);transform:rotate(90deg) scale(1, -1)}.popup.popup_left{top:0;right:100%}.popup.popup_left .picker_arrow{top:0;right:0;-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.popup.popup_right{top:0;left:100%}.popup.popup_right .picker_arrow{top:0;left:0}',document.documentElement.firstElementChild.appendChild(E),W.StyleElement=E;var E;export{W as default}; diff --git a/src/google/adk/cli/browser/chunk-GP6TCC26.js b/src/google/adk/cli/browser/chunk-GP6TCC26.js deleted file mode 100644 index 48526d49ed..0000000000 --- a/src/google/adk/cli/browser/chunk-GP6TCC26.js +++ /dev/null @@ -1 +0,0 @@ -import{e as m}from"./chunk-RMXJBC7V.js";var R=m(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.BLANK_URL=e.relativeFirstCharacters=e.whitespaceEscapeCharsRegex=e.urlSchemeRegex=e.ctrlCharactersRegex=e.htmlCtrlEntityRegex=e.htmlEntitiesRegex=e.invalidProtocolRegex=void 0;e.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im;e.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g;e.htmlCtrlEntityRegex=/&(newline|tab);/gi;e.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim;e.urlSchemeRegex=/^.+(:|:)/gim;e.whitespaceEscapeCharsRegex=/(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g;e.relativeFirstCharacters=[".","/"];e.BLANK_URL="about:blank"});var v=m(s=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});s.sanitizeUrl=p;var t=R();function d(r){return t.relativeFirstCharacters.indexOf(r[0])>-1}function x(r){var c=r.replace(t.ctrlCharactersRegex,"");return c.replace(t.htmlEntitiesRegex,function(a,i){return String.fromCharCode(i)})}function C(r){return URL.canParse(r)}function g(r){try{return decodeURIComponent(r)}catch(c){return r}}function p(r){if(!r)return t.BLANK_URL;var c,a=g(r.trim());do a=x(a).replace(t.htmlCtrlEntityRegex,"").replace(t.ctrlCharactersRegex,"").replace(t.whitespaceEscapeCharsRegex,"").trim(),a=g(a),c=a.match(t.ctrlCharactersRegex)||a.match(t.htmlEntitiesRegex)||a.match(t.htmlCtrlEntityRegex)||a.match(t.whitespaceEscapeCharsRegex);while(c&&c.length>0);var i=a;if(!i)return t.BLANK_URL;if(d(i))return i;var h=i.trimStart(),u=h.match(t.urlSchemeRegex);if(!u)return i;var n=u[0].toLowerCase().trim();if(t.invalidProtocolRegex.test(n))return t.BLANK_URL;var o=h.replace(/\\/g,"/");if(n==="mailto:"||n.includes("://"))return o;if(n==="http:"||n==="https:"){if(!C(o))return t.BLANK_URL;var l=new URL(o);return l.protocol=l.protocol.toLowerCase(),l.hostname=l.hostname.toLowerCase(),l.toString()}return o}});export{v as a}; diff --git a/src/google/adk/cli/browser/chunk-P4MFJI72.js b/src/google/adk/cli/browser/chunk-HCQ2TSHS.js similarity index 93% rename from src/google/adk/cli/browser/chunk-P4MFJI72.js rename to src/google/adk/cli/browser/chunk-HCQ2TSHS.js index a857aef411..35318987da 100644 --- a/src/google/adk/cli/browser/chunk-P4MFJI72.js +++ b/src/google/adk/cli/browser/chunk-HCQ2TSHS.js @@ -1 +1 @@ -import{$a as c,$b as M,Bb as l,Ca as m,Cb as d,Cc as r,Ib as p,Kb as g,Lb as h,Pa as o,Yb as x,Zb as a,_b as y,eb as b,fc as T,gc as _,hc as C,pd as F,qb as v,sb as f,wc as s}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function P(n,D){if(n&1&&(l(0,"label",2),y(1),d()),n&2){let t=h(),i=C(0);a(t.theme.components.TextField.label),p("htmlFor",t.inputId),o(),M(i)}}var S=(()=>{class n extends F{text=r.required();label=r.required();inputType=r.required();inputValue=s(()=>super.resolvePrimitive(this.text())||"");resolvedLabel=s(()=>super.resolvePrimitive(this.label()));inputId=super.getUniqueId("a2ui-input");handleInput(t){let i=this.text()?.path;!(t.target instanceof HTMLInputElement)||!i||this.processor.setData(this.component(),i,t.target.value,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(n)))(e||n)}})();static \u0275cmp=c({type:n,selectors:[["a2ui-text-field"]],inputs:{text:[1,"text"],label:[1,"label"],inputType:[1,"inputType"]},features:[b],decls:4,vars:11,consts:[[3,"for","class"],["autocomplete","off","placeholder","Please enter a value",3,"input","id","value","type"],[3,"for"]],template:function(i,e){if(i&1&&(T(0),l(1,"section"),v(2,P,2,4,"label",0),l(3,"input",1),g("input",function(I){return e.handleInput(I)}),d()()),i&2){let u=_(e.resolvedLabel());o(),a(e.theme.components.TextField.container),o(),f(u?2:-1),o(),x(e.theme.additionalStyles==null?null:e.theme.additionalStyles.TextField),a(e.theme.components.TextField.element),p("id",e.inputId)("value",e.inputValue())("type",e.inputType()==="number"?"number":"text")}},styles:["[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%], input[_ngcontent-%COMP%], label[_ngcontent-%COMP%]{box-sizing:border-box}input[_ngcontent-%COMP%]{display:block;width:100%}label[_ngcontent-%COMP%]{display:block;margin-bottom:4px}"]})}return n})();export{S as TextField}; +import{$a as c,$b as M,Bb as l,Ca as m,Cb as d,Cc as r,Ib as p,Kb as g,Lb as h,Pa as o,Yb as x,Zb as a,_b as y,eb as b,fc as T,gc as _,hc as C,pd as F,qb as v,sb as f,wc as s}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function P(n,D){if(n&1&&(l(0,"label",2),y(1),d()),n&2){let t=h(),i=C(0);a(t.theme.components.TextField.label),p("htmlFor",t.inputId),o(),M(i)}}var S=(()=>{class n extends F{text=r.required();label=r.required();inputType=r.required();inputValue=s(()=>super.resolvePrimitive(this.text())||"");resolvedLabel=s(()=>super.resolvePrimitive(this.label()));inputId=super.getUniqueId("a2ui-input");handleInput(t){let i=this.text()?.path;!(t.target instanceof HTMLInputElement)||!i||this.processor.setData(this.component(),i,t.target.value,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(n)))(e||n)}})();static \u0275cmp=c({type:n,selectors:[["a2ui-text-field"]],inputs:{text:[1,"text"],label:[1,"label"],inputType:[1,"inputType"]},features:[b],decls:4,vars:11,consts:[[3,"for","class"],["autocomplete","off","placeholder","Please enter a value",3,"input","id","value","type"],[3,"for"]],template:function(i,e){if(i&1&&(T(0),l(1,"section"),v(2,P,2,4,"label",0),l(3,"input",1),g("input",function(I){return e.handleInput(I)}),d()()),i&2){let u=_(e.resolvedLabel());o(),a(e.theme.components.TextField.container),o(),f(u?2:-1),o(),x(e.theme.additionalStyles==null?null:e.theme.additionalStyles.TextField),a(e.theme.components.TextField.element),p("id",e.inputId)("value",e.inputValue())("type",e.inputType()==="number"?"number":"text")}},styles:["[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%], input[_ngcontent-%COMP%], label[_ngcontent-%COMP%]{box-sizing:border-box}input[_ngcontent-%COMP%]{display:block;width:100%}label[_ngcontent-%COMP%]{display:block;margin-bottom:4px}"]})}return n})();export{S as TextField}; diff --git a/src/google/adk/cli/browser/chunk-HD4LLD2O.js b/src/google/adk/cli/browser/chunk-HD4LLD2O.js deleted file mode 100644 index f2bef5be3b..0000000000 --- a/src/google/adk/cli/browser/chunk-HD4LLD2O.js +++ /dev/null @@ -1 +0,0 @@ -import{a as z}from"./chunk-YVVLWU7S.js";import{a as ot,g as W,i as Z}from"./chunk-JRNAXTJ7.js";import{a as B,b as K,e as q,h as yt,j as k}from"./chunk-RMXJBC7V.js";var tt=q((Q,J)=>{"use strict";(function(R,y){typeof Q=="object"&&typeof J=="object"?J.exports=y():typeof define=="function"&&define.amd?define([],y):typeof Q=="object"?Q.layoutBase=y():R.layoutBase=y()})(Q,function(){return(function(N){var R={};function y(n){if(R[n])return R[n].exports;var e=R[n]={i:n,l:!1,exports:{}};return N[n].call(e.exports,e,e.exports,y),e.l=!0,e.exports}return y.m=N,y.c=R,y.i=function(n){return n},y.d=function(n,e,t){y.o(n,e)||Object.defineProperty(n,e,{configurable:!1,enumerable:!0,get:t})},y.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return y.d(e,"a",e),e},y.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},y.p="",y(y.s=26)})([(function(N,R,y){"use strict";function n(){}n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,N.exports=n}),(function(N,R,y){"use strict";var n=y(2),e=y(8),t=y(9);function r(g,s,d){n.call(this,d),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=d,this.bendpoints=[],this.source=g,this.target=s}r.prototype=Object.create(n.prototype);for(var a in n)r[a]=n[a];r.prototype.getSource=function(){return this.source},r.prototype.getTarget=function(){return this.target},r.prototype.isInterGraph=function(){return this.isInterGraph},r.prototype.getLength=function(){return this.length},r.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},r.prototype.getBendpoints=function(){return this.bendpoints},r.prototype.getLca=function(){return this.lca},r.prototype.getSourceInLca=function(){return this.sourceInLca},r.prototype.getTargetInLca=function(){return this.targetInLca},r.prototype.getOtherEnd=function(g){if(this.source===g)return this.target;if(this.target===g)return this.source;throw"Node is not incident with this edge"},r.prototype.getOtherEndInGraph=function(g,s){for(var d=this.getOtherEnd(g),i=s.getGraphManager().getRoot();;){if(d.getOwner()==s)return d;if(d.getOwner()==i)break;d=d.getOwner().getParent()}return null},r.prototype.updateLength=function(){var g=new Array(4);this.isOverlapingSourceAndTarget=e.getIntersection(this.target.getRect(),this.source.getRect(),g),this.isOverlapingSourceAndTarget||(this.lengthX=g[0]-g[2],this.lengthY=g[1]-g[3],Math.abs(this.lengthX)<1&&(this.lengthX=t.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=t.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},r.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=t.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=t.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},N.exports=r}),(function(N,R,y){"use strict";function n(e){this.vGraphObject=e}N.exports=n}),(function(N,R,y){"use strict";var n=y(2),e=y(10),t=y(13),r=y(0),a=y(16),g=y(4);function s(i,h,l,p){l==null&&p==null&&(p=h),n.call(this,p),i.graphManager!=null&&(i=i.graphManager),this.estimatedSize=e.MIN_VALUE,this.inclusionTreeDepth=e.MAX_VALUE,this.vGraphObject=p,this.edges=[],this.graphManager=i,l!=null&&h!=null?this.rect=new t(h.x,h.y,l.width,l.height):this.rect=new t}s.prototype=Object.create(n.prototype);for(var d in n)s[d]=n[d];s.prototype.getEdges=function(){return this.edges},s.prototype.getChild=function(){return this.child},s.prototype.getOwner=function(){return this.owner},s.prototype.getWidth=function(){return this.rect.width},s.prototype.setWidth=function(i){this.rect.width=i},s.prototype.getHeight=function(){return this.rect.height},s.prototype.setHeight=function(i){this.rect.height=i},s.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},s.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},s.prototype.getCenter=function(){return new g(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},s.prototype.getLocation=function(){return new g(this.rect.x,this.rect.y)},s.prototype.getRect=function(){return this.rect},s.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},s.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},s.prototype.setRect=function(i,h){this.rect.x=i.x,this.rect.y=i.y,this.rect.width=h.width,this.rect.height=h.height},s.prototype.setCenter=function(i,h){this.rect.x=i-this.rect.width/2,this.rect.y=h-this.rect.height/2},s.prototype.setLocation=function(i,h){this.rect.x=i,this.rect.y=h},s.prototype.moveBy=function(i,h){this.rect.x+=i,this.rect.y+=h},s.prototype.getEdgeListToNode=function(i){var h=[],l,p=this;return p.edges.forEach(function(v){if(v.target==i){if(v.source!=p)throw"Incorrect edge source!";h.push(v)}}),h},s.prototype.getEdgesBetween=function(i){var h=[],l,p=this;return p.edges.forEach(function(v){if(!(v.source==p||v.target==p))throw"Incorrect edge source and/or target";(v.target==i||v.source==i)&&h.push(v)}),h},s.prototype.getNeighborsList=function(){var i=new Set,h=this;return h.edges.forEach(function(l){if(l.source==h)i.add(l.target);else{if(l.target!=h)throw"Incorrect incidency!";i.add(l.source)}}),i},s.prototype.withChildren=function(){var i=new Set,h,l;if(i.add(this),this.child!=null)for(var p=this.child.getNodes(),v=0;vh&&(this.rect.x-=(this.labelWidth-h)/2,this.setWidth(this.labelWidth)),this.labelHeight>l&&(this.labelPos=="center"?this.rect.y-=(this.labelHeight-l)/2:this.labelPos=="top"&&(this.rect.y-=this.labelHeight-l),this.setHeight(this.labelHeight))}}},s.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==e.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},s.prototype.transform=function(i){var h=this.rect.x;h>r.WORLD_BOUNDARY?h=r.WORLD_BOUNDARY:h<-r.WORLD_BOUNDARY&&(h=-r.WORLD_BOUNDARY);var l=this.rect.y;l>r.WORLD_BOUNDARY?l=r.WORLD_BOUNDARY:l<-r.WORLD_BOUNDARY&&(l=-r.WORLD_BOUNDARY);var p=new g(h,l),v=i.inverseTransformPoint(p);this.setLocation(v.x,v.y)},s.prototype.getLeft=function(){return this.rect.x},s.prototype.getRight=function(){return this.rect.x+this.rect.width},s.prototype.getTop=function(){return this.rect.y},s.prototype.getBottom=function(){return this.rect.y+this.rect.height},s.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},N.exports=s}),(function(N,R,y){"use strict";function n(e,t){e==null&&t==null?(this.x=0,this.y=0):(this.x=e,this.y=t)}n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(e){this.x=e},n.prototype.setY=function(e){this.y=e},n.prototype.getDifference=function(e){return new DimensionD(this.x-e.x,this.y-e.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(e){return this.x+=e.width,this.y+=e.height,this},N.exports=n}),(function(N,R,y){"use strict";var n=y(2),e=y(10),t=y(0),r=y(6),a=y(3),g=y(1),s=y(13),d=y(12),i=y(11);function h(p,v,L){n.call(this,L),this.estimatedSize=e.MIN_VALUE,this.margin=t.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=p,v!=null&&v instanceof r?this.graphManager=v:v!=null&&v instanceof Layout&&(this.graphManager=v.graphManager)}h.prototype=Object.create(n.prototype);for(var l in n)h[l]=n[l];h.prototype.getNodes=function(){return this.nodes},h.prototype.getEdges=function(){return this.edges},h.prototype.getGraphManager=function(){return this.graphManager},h.prototype.getParent=function(){return this.parent},h.prototype.getLeft=function(){return this.left},h.prototype.getRight=function(){return this.right},h.prototype.getTop=function(){return this.top},h.prototype.getBottom=function(){return this.bottom},h.prototype.isConnected=function(){return this.isConnected},h.prototype.add=function(p,v,L){if(v==null&&L==null){var c=p;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(c)>-1)throw"Node already in graph!";return c.owner=this,this.getNodes().push(c),c}else{var A=p;if(!(this.getNodes().indexOf(v)>-1&&this.getNodes().indexOf(L)>-1))throw"Source or target not in graph!";if(!(v.owner==L.owner&&v.owner==this))throw"Both owners must be this graph!";return v.owner!=L.owner?null:(A.source=v,A.target=L,A.isInterGraph=!1,this.getEdges().push(A),v.edges.push(A),L!=v&&L.edges.push(A),A)}},h.prototype.remove=function(p){var v=p;if(p instanceof a){if(v==null)throw"Node is null!";if(!(v.owner!=null&&v.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var L=v.edges.slice(),c,A=L.length,T=0;T-1&&f>-1))throw"Source and/or target doesn't know this edge!";c.source.edges.splice(o,1),c.target!=c.source&&c.target.edges.splice(f,1);var C=c.source.owner.getEdges().indexOf(c);if(C==-1)throw"Not in owner's edge list!";c.source.owner.getEdges().splice(C,1)}},h.prototype.updateLeftTop=function(){for(var p=e.MAX_VALUE,v=e.MAX_VALUE,L,c,A,T=this.getNodes(),C=T.length,o=0;oL&&(p=L),v>c&&(v=c)}return p==e.MAX_VALUE?null:(T[0].getParent().paddingLeft!=null?A=T[0].getParent().paddingLeft:A=this.margin,this.left=v-A,this.top=p-A,new d(this.left,this.top))},h.prototype.updateBounds=function(p){for(var v=e.MAX_VALUE,L=-e.MAX_VALUE,c=e.MAX_VALUE,A=-e.MAX_VALUE,T,C,o,f,u,E=this.nodes,D=E.length,O=0;OT&&(v=T),Lo&&(c=o),AT&&(v=T),Lo&&(c=o),A=this.nodes.length){var D=0;L.forEach(function(O){O.owner==p&&D++}),D==this.nodes.length&&(this.isConnected=!0)}},N.exports=h}),(function(N,R,y){"use strict";var n,e=y(1);function t(r){n=y(5),this.layout=r,this.graphs=[],this.edges=[]}t.prototype.addRoot=function(){var r=this.layout.newGraph(),a=this.layout.newNode(null),g=this.add(r,a);return this.setRootGraph(g),this.rootGraph},t.prototype.add=function(r,a,g,s,d){if(g==null&&s==null&&d==null){if(r==null)throw"Graph is null!";if(a==null)throw"Parent node is null!";if(this.graphs.indexOf(r)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(r),r.parent!=null)throw"Already has a parent!";if(a.child!=null)throw"Already has a child!";return r.parent=a,a.child=r,r}else{d=g,s=a,g=r;var i=s.getOwner(),h=d.getOwner();if(!(i!=null&&i.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(h!=null&&h.getGraphManager()==this))throw"Target not in this graph mgr!";if(i==h)return g.isInterGraph=!1,i.add(g,s,d);if(g.isInterGraph=!0,g.source=s,g.target=d,this.edges.indexOf(g)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(g),!(g.source!=null&&g.target!=null))throw"Edge source and/or target is null!";if(!(g.source.edges.indexOf(g)==-1&&g.target.edges.indexOf(g)==-1))throw"Edge already in source and/or target incidency list!";return g.source.edges.push(g),g.target.edges.push(g),g}},t.prototype.remove=function(r){if(r instanceof n){var a=r;if(a.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(a==this.rootGraph||a.parent!=null&&a.parent.graphManager==this))throw"Invalid parent node!";var g=[];g=g.concat(a.getEdges());for(var s,d=g.length,i=0;i=r.getRight()?a[0]+=Math.min(r.getX()-t.getX(),t.getRight()-r.getRight()):r.getX()<=t.getX()&&r.getRight()>=t.getRight()&&(a[0]+=Math.min(t.getX()-r.getX(),r.getRight()-t.getRight())),t.getY()<=r.getY()&&t.getBottom()>=r.getBottom()?a[1]+=Math.min(r.getY()-t.getY(),t.getBottom()-r.getBottom()):r.getY()<=t.getY()&&r.getBottom()>=t.getBottom()&&(a[1]+=Math.min(t.getY()-r.getY(),r.getBottom()-t.getBottom()));var d=Math.abs((r.getCenterY()-t.getCenterY())/(r.getCenterX()-t.getCenterX()));r.getCenterY()===t.getCenterY()&&r.getCenterX()===t.getCenterX()&&(d=1);var i=d*a[0],h=a[1]/d;a[0]i)return a[0]=g,a[1]=l,a[2]=d,a[3]=E,!1;if(sd)return a[0]=h,a[1]=s,a[2]=f,a[3]=i,!1;if(gd?(a[0]=v,a[1]=L,I=!0):(a[0]=p,a[1]=l,I=!0):F===x&&(g>d?(a[0]=h,a[1]=l,I=!0):(a[0]=c,a[1]=L,I=!0)),-Y===x?d>g?(a[2]=u,a[3]=E,w=!0):(a[2]=f,a[3]=o,w=!0):Y===x&&(d>g?(a[2]=C,a[3]=o,w=!0):(a[2]=D,a[3]=E,w=!0)),I&&w)return!1;if(g>d?s>i?(M=this.getCardinalDirection(F,x,4),G=this.getCardinalDirection(Y,x,2)):(M=this.getCardinalDirection(-F,x,3),G=this.getCardinalDirection(-Y,x,1)):s>i?(M=this.getCardinalDirection(-F,x,1),G=this.getCardinalDirection(-Y,x,3)):(M=this.getCardinalDirection(F,x,2),G=this.getCardinalDirection(Y,x,4)),!I)switch(M){case 1:P=l,S=g+-T/x,a[0]=S,a[1]=P;break;case 2:S=c,P=s+A*x,a[0]=S,a[1]=P;break;case 3:P=L,S=g+T/x,a[0]=S,a[1]=P;break;case 4:S=v,P=s+-A*x,a[0]=S,a[1]=P;break}if(!w)switch(G){case 1:U=o,_=d+-m/x,a[2]=_,a[3]=U;break;case 2:_=D,U=i+O*x,a[2]=_,a[3]=U;break;case 3:U=E,_=d+m/x,a[2]=_,a[3]=U;break;case 4:_=u,U=i+-O*x,a[2]=_,a[3]=U;break}}return!1},e.getCardinalDirection=function(t,r,a){return t>r?a:1+a%4},e.getIntersection=function(t,r,a,g){if(g==null)return this.getIntersection2(t,r,a);var s=t.x,d=t.y,i=r.x,h=r.y,l=a.x,p=a.y,v=g.x,L=g.y,c=void 0,A=void 0,T=void 0,C=void 0,o=void 0,f=void 0,u=void 0,E=void 0,D=void 0;return T=h-d,o=s-i,u=i*d-s*h,C=L-p,f=l-v,E=v*p-l*L,D=T*f-C*o,D===0?null:(c=(o*E-f*u)/D,A=(C*u-T*E)/D,new n(c,A))},e.angleOfVector=function(t,r,a,g){var s=void 0;return t!==a?(s=Math.atan((g-r)/(a-t)),a0?1:e<0?-1:0},n.floor=function(e){return e<0?Math.ceil(e):Math.floor(e)},n.ceil=function(e){return e<0?Math.floor(e):Math.ceil(e)},N.exports=n}),(function(N,R,y){"use strict";function n(){}n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,N.exports=n}),(function(N,R,y){"use strict";var n=(function(){function s(d,i){for(var h=0;h"u"?"undefined":n(t);return t==null||r!="object"&&r!="function"},N.exports=e}),(function(N,R,y){"use strict";function n(l){if(Array.isArray(l)){for(var p=0,v=Array(l.length);p0&&p;){for(T.push(o[0]);T.length>0&&p;){var f=T[0];T.splice(0,1),A.add(f);for(var u=f.getEdges(),c=0;c-1&&o.splice(m,1)}A=new Set,C=new Map}}return l},h.prototype.createDummyNodesForBendpoints=function(l){for(var p=[],v=l.source,L=this.graphManager.calcLowestCommonAncestor(l.source,l.target),c=0;c0){for(var L=this.edgeToDummyNodes.get(v),c=0;c=0&&p.splice(E,1);var D=C.getNeighborsList();D.forEach(function(I){if(v.indexOf(I)<0){var w=L.get(I),F=w-1;F==1&&f.push(I),L.set(I,F)}})}v=v.concat(f),(p.length==1||p.length==2)&&(c=!0,A=p[0])}return A},h.prototype.setGraphManager=function(l){this.graphManager=l},N.exports=h}),(function(N,R,y){"use strict";function n(){}n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},N.exports=n}),(function(N,R,y){"use strict";var n=y(4);function e(t,r){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}e.prototype.getWorldOrgX=function(){return this.lworldOrgX},e.prototype.setWorldOrgX=function(t){this.lworldOrgX=t},e.prototype.getWorldOrgY=function(){return this.lworldOrgY},e.prototype.setWorldOrgY=function(t){this.lworldOrgY=t},e.prototype.getWorldExtX=function(){return this.lworldExtX},e.prototype.setWorldExtX=function(t){this.lworldExtX=t},e.prototype.getWorldExtY=function(){return this.lworldExtY},e.prototype.setWorldExtY=function(t){this.lworldExtY=t},e.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},e.prototype.setDeviceOrgX=function(t){this.ldeviceOrgX=t},e.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},e.prototype.setDeviceOrgY=function(t){this.ldeviceOrgY=t},e.prototype.getDeviceExtX=function(){return this.ldeviceExtX},e.prototype.setDeviceExtX=function(t){this.ldeviceExtX=t},e.prototype.getDeviceExtY=function(){return this.ldeviceExtY},e.prototype.setDeviceExtY=function(t){this.ldeviceExtY=t},e.prototype.transformX=function(t){var r=0,a=this.lworldExtX;return a!=0&&(r=this.ldeviceOrgX+(t-this.lworldOrgX)*this.ldeviceExtX/a),r},e.prototype.transformY=function(t){var r=0,a=this.lworldExtY;return a!=0&&(r=this.ldeviceOrgY+(t-this.lworldOrgY)*this.ldeviceExtY/a),r},e.prototype.inverseTransformX=function(t){var r=0,a=this.ldeviceExtX;return a!=0&&(r=this.lworldOrgX+(t-this.ldeviceOrgX)*this.lworldExtX/a),r},e.prototype.inverseTransformY=function(t){var r=0,a=this.ldeviceExtY;return a!=0&&(r=this.lworldOrgY+(t-this.ldeviceOrgY)*this.lworldExtY/a),r},e.prototype.inverseTransformPoint=function(t){var r=new n(this.inverseTransformX(t.x),this.inverseTransformY(t.y));return r},N.exports=e}),(function(N,R,y){"use strict";function n(i){if(Array.isArray(i)){for(var h=0,l=Array(i.length);ht.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*t.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(i-t.ADAPTATION_LOWER_NODE_LIMIT)/(t.ADAPTATION_UPPER_NODE_LIMIT-t.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-t.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=t.MAX_NODE_DISPLACEMENT_INCREMENTAL):(i>t.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(t.COOLING_ADAPTATION_FACTOR,1-(i-t.ADAPTATION_LOWER_NODE_LIMIT)/(t.ADAPTATION_UPPER_NODE_LIMIT-t.ADAPTATION_LOWER_NODE_LIMIT)*(1-t.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=t.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},s.prototype.calcSpringForces=function(){for(var i=this.getAllEdges(),h,l=0;l0&&arguments[0]!==void 0?arguments[0]:!0,h=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,l,p,v,L,c=this.getAllNodes(),A;if(this.useFRGridVariant)for(this.totalIterations%t.GRID_CALCULATION_CHECK_PERIOD==1&&i&&this.updateGrid(),A=new Set,l=0;lT||A>T)&&(i.gravitationForceX=-this.gravityConstant*v,i.gravitationForceY=-this.gravityConstant*L)):(T=h.getEstimatedSize()*this.compoundGravityRangeFactor,(c>T||A>T)&&(i.gravitationForceX=-this.gravityConstant*v*this.compoundGravityConstant,i.gravitationForceY=-this.gravityConstant*L*this.compoundGravityConstant))},s.prototype.isConverged=function(){var i,h=!1;return this.totalIterations>this.maxIterations/3&&(h=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),i=this.totalDisplacement=c.length||T>=c[0].length)){for(var C=0;Cs}}]),a})();N.exports=r}),(function(N,R,y){"use strict";var n=(function(){function r(a,g){for(var s=0;s2&&arguments[2]!==void 0?arguments[2]:1,d=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;e(this,r),this.sequence1=a,this.sequence2=g,this.match_score=s,this.mismatch_penalty=d,this.gap_penalty=i,this.iMax=a.length+1,this.jMax=g.length+1,this.grid=new Array(this.iMax);for(var h=0;h=0;a--){var g=this.listeners[a];g.event===t&&g.callback===r&&this.listeners.splice(a,1)}},e.emit=function(t,r){for(var a=0;a{"use strict";(function(R,y){typeof $=="object"&&typeof et=="object"?et.exports=y(tt()):typeof define=="function"&&define.amd?define(["layout-base"],y):typeof $=="object"?$.coseBase=y(tt()):R.coseBase=y(R.layoutBase)})($,function(N){return(function(R){var y={};function n(e){if(y[e])return y[e].exports;var t=y[e]={i:e,l:!1,exports:{}};return R[e].call(t.exports,t,t.exports,n),t.l=!0,t.exports}return n.m=R,n.c=y,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)})([(function(R,y){R.exports=N}),(function(R,y,n){"use strict";var e=n(0).FDLayoutConstants;function t(){}for(var r in e)t[r]=e[r];t.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,t.DEFAULT_RADIAL_SEPARATION=e.DEFAULT_EDGE_LENGTH,t.DEFAULT_COMPONENT_SEPERATION=60,t.TILE=!0,t.TILING_PADDING_VERTICAL=10,t.TILING_PADDING_HORIZONTAL=10,t.TREE_REDUCTION_ON_INCREMENTAL=!1,R.exports=t}),(function(R,y,n){"use strict";var e=n(0).FDLayoutEdge;function t(a,g,s){e.call(this,a,g,s)}t.prototype=Object.create(e.prototype);for(var r in e)t[r]=e[r];R.exports=t}),(function(R,y,n){"use strict";var e=n(0).LGraph;function t(a,g,s){e.call(this,a,g,s)}t.prototype=Object.create(e.prototype);for(var r in e)t[r]=e[r];R.exports=t}),(function(R,y,n){"use strict";var e=n(0).LGraphManager;function t(a){e.call(this,a)}t.prototype=Object.create(e.prototype);for(var r in e)t[r]=e[r];R.exports=t}),(function(R,y,n){"use strict";var e=n(0).FDLayoutNode,t=n(0).IMath;function r(g,s,d,i){e.call(this,g,s,d,i)}r.prototype=Object.create(e.prototype);for(var a in e)r[a]=e[a];r.prototype.move=function(){var g=this.graphManager.getLayout();this.displacementX=g.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=g.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>g.coolingFactor*g.maxNodeDisplacement&&(this.displacementX=g.coolingFactor*g.maxNodeDisplacement*t.sign(this.displacementX)),Math.abs(this.displacementY)>g.coolingFactor*g.maxNodeDisplacement&&(this.displacementY=g.coolingFactor*g.maxNodeDisplacement*t.sign(this.displacementY)),this.child==null?this.moveBy(this.displacementX,this.displacementY):this.child.getNodes().length==0?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),g.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},r.prototype.propogateDisplacementToChildren=function(g,s){for(var d=this.getChild().getNodes(),i,h=0;h0)this.positionNodesRadially(o);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var f=new Set(this.getAllNodes()),u=this.nodesWithGravity.filter(function(E){return f.has(E)});this.graphManager.setAllNodesToApplyGravitation(u),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},T.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%d.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var o=new Set(this.getAllNodes()),f=this.nodesWithGravity.filter(function(D){return o.has(D)});this.graphManager.setAllNodesToApplyGravitation(f),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=d.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=d.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var u=!this.isTreeGrowing&&!this.isGrowthFinished,E=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(u,E),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},T.prototype.getPositionsData=function(){for(var o=this.graphManager.getAllNodes(),f={},u=0;u1){var I;for(I=0;IE&&(E=Math.floor(m.y)),O=Math.floor(m.x+s.DEFAULT_COMPONENT_SEPERATION)}this.transform(new l(i.WORLD_CENTER_X-m.x/2,i.WORLD_CENTER_Y-m.y/2))},T.radialLayout=function(o,f,u){var E=Math.max(this.maxDiagonalInTree(o),s.DEFAULT_RADIAL_SEPARATION);T.branchRadialLayout(f,null,0,359,0,E);var D=c.calculateBounds(o),O=new A;O.setDeviceOrgX(D.getMinX()),O.setDeviceOrgY(D.getMinY()),O.setWorldOrgX(u.x),O.setWorldOrgY(u.y);for(var m=0;m1;){var X=U[0];U.splice(0,1);var V=M.indexOf(X);V>=0&&M.splice(V,1),P--,G--}f!=null?_=(M.indexOf(U[0])+1)%P:_=0;for(var b=Math.abs(E-u)/G,H=_;S!=G;H=++H%P){var nt=M[H].getOtherEnd(o);if(nt!=f){var st=(u+S*b)%360,vt=(st+b)%360;T.branchRadialLayout(nt,o,st,vt,D+O,O),S++}}},T.maxDiagonalInTree=function(o){for(var f=v.MIN_VALUE,u=0;uf&&(f=D)}return f},T.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},T.prototype.groupZeroDegreeMembers=function(){var o=this,f={};this.memberGroups={},this.idToDummyNode={};for(var u=[],E=this.graphManager.getAllNodes(),D=0;D"u"&&(f[I]=[]),f[I]=f[I].concat(O)}Object.keys(f).forEach(function(w){if(f[w].length>1){var F="DummyCompound_"+w;o.memberGroups[F]=f[w];var Y=f[w][0].getParent(),x=new a(o.graphManager);x.id=F,x.paddingLeft=Y.paddingLeft||0,x.paddingRight=Y.paddingRight||0,x.paddingBottom=Y.paddingBottom||0,x.paddingTop=Y.paddingTop||0,o.idToDummyNode[F]=x;var M=o.getGraphManager().add(o.newGraph(),x),G=Y.getChild();G.add(x);for(var S=0;S=0;o--){var f=this.compoundOrder[o],u=f.id,E=f.paddingLeft,D=f.paddingTop;this.adjustLocations(this.tiledMemberPack[u],f.rect.x,f.rect.y,E,D)}},T.prototype.repopulateZeroDegreeMembers=function(){var o=this,f=this.tiledZeroDegreePack;Object.keys(f).forEach(function(u){var E=o.idToDummyNode[u],D=E.paddingLeft,O=E.paddingTop;o.adjustLocations(f[u],E.rect.x,E.rect.y,D,O)})},T.prototype.getToBeTiled=function(o){var f=o.id;if(this.toBeTiled[f]!=null)return this.toBeTiled[f];var u=o.getChild();if(u==null)return this.toBeTiled[f]=!1,!1;for(var E=u.getNodes(),D=0;D0)return this.toBeTiled[f]=!1,!1;if(O.getChild()==null){this.toBeTiled[O.id]=!1;continue}if(!this.getToBeTiled(O))return this.toBeTiled[f]=!1,!1}return this.toBeTiled[f]=!0,!0},T.prototype.getNodeDegree=function(o){for(var f=o.id,u=o.getEdges(),E=0,D=0;Dw&&(w=Y.rect.height)}u+=w+o.verticalPadding}},T.prototype.tileCompoundMembers=function(o,f){var u=this;this.tiledMemberPack=[],Object.keys(o).forEach(function(E){var D=f[E];u.tiledMemberPack[E]=u.tileNodes(o[E],D.paddingLeft+D.paddingRight),D.rect.width=u.tiledMemberPack[E].width,D.rect.height=u.tiledMemberPack[E].height})},T.prototype.tileNodes=function(o,f){var u=s.TILING_PADDING_VERTICAL,E=s.TILING_PADDING_HORIZONTAL,D={rows:[],rowWidth:[],rowHeight:[],width:0,height:f,verticalPadding:u,horizontalPadding:E};o.sort(function(I,w){return I.rect.width*I.rect.height>w.rect.width*w.rect.height?-1:I.rect.width*I.rect.height0&&(m+=o.horizontalPadding),o.rowWidth[u]=m,o.width0&&(I+=o.verticalPadding);var w=0;I>o.rowHeight[u]&&(w=o.rowHeight[u],o.rowHeight[u]=I,w=o.rowHeight[u]-w),o.height+=w,o.rows[u].push(f)},T.prototype.getShortestRowIndex=function(o){for(var f=-1,u=Number.MAX_VALUE,E=0;Eu&&(f=E,u=o.rowWidth[E]);return f},T.prototype.canAddHorizontal=function(o,f,u){var E=this.getShortestRowIndex(o);if(E<0)return!0;var D=o.rowWidth[E];if(D+o.horizontalPadding+f<=o.width)return!0;var O=0;o.rowHeight[E]0&&(O=u+o.verticalPadding-o.rowHeight[E]);var m;o.width-D>=f+o.horizontalPadding?m=(o.height+O)/(D+f+o.horizontalPadding):m=(o.height+O)/o.width,O=u+o.verticalPadding;var I;return o.widthO&&f!=u){E.splice(-1,1),o.rows[u].push(D),o.rowWidth[f]=o.rowWidth[f]-O,o.rowWidth[u]=o.rowWidth[u]+O,o.width=o.rowWidth[instance.getLongestRowIndex(o)];for(var m=Number.MIN_VALUE,I=0;Im&&(m=E[I].height);f>0&&(m+=o.verticalPadding);var w=o.rowHeight[f]+o.rowHeight[u];o.rowHeight[f]=m,o.rowHeight[u]0)for(var G=D;G<=O;G++)M[0]+=this.grid[G][m-1].length+this.grid[G][m].length-1;if(O0)for(var G=m;G<=I;G++)M[3]+=this.grid[D-1][G].length+this.grid[D][G].length-1;for(var S=v.MAX_VALUE,P,_,U=0;U{"use strict";(function(R,y){typeof j=="object"&&typeof it=="object"?it.exports=y(rt()):typeof define=="function"&&define.amd?define(["cose-base"],y):typeof j=="object"?j.cytoscapeCoseBilkent=y(rt()):R.cytoscapeCoseBilkent=y(R.coseBase)})(j,function(N){return(function(R){var y={};function n(e){if(y[e])return y[e].exports;var t=y[e]={i:e,l:!1,exports:{}};return R[e].call(t.exports,t,t.exports,n),t.l=!0,t.exports}return n.m=R,n.c=y,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)})([(function(R,y){R.exports=N}),(function(R,y,n){"use strict";var e=n(0).layoutBase.LayoutConstants,t=n(0).layoutBase.FDLayoutConstants,r=n(0).CoSEConstants,a=n(0).CoSELayout,g=n(0).CoSENode,s=n(0).layoutBase.PointD,d=n(0).layoutBase.DimensionD,i={ready:function(){},stop:function(){},quality:"default",nodeDimensionsIncludeLabels:!1,refresh:30,fit:!0,padding:10,randomize:!0,nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:"end",animationDuration:500,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.5};function h(L,c){var A={};for(var T in L)A[T]=L[T];for(var T in c)A[T]=c[T];return A}function l(L){this.options=h(i,L),p(this.options)}var p=function(c){c.nodeRepulsion!=null&&(r.DEFAULT_REPULSION_STRENGTH=t.DEFAULT_REPULSION_STRENGTH=c.nodeRepulsion),c.idealEdgeLength!=null&&(r.DEFAULT_EDGE_LENGTH=t.DEFAULT_EDGE_LENGTH=c.idealEdgeLength),c.edgeElasticity!=null&&(r.DEFAULT_SPRING_STRENGTH=t.DEFAULT_SPRING_STRENGTH=c.edgeElasticity),c.nestingFactor!=null&&(r.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=t.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=c.nestingFactor),c.gravity!=null&&(r.DEFAULT_GRAVITY_STRENGTH=t.DEFAULT_GRAVITY_STRENGTH=c.gravity),c.numIter!=null&&(r.MAX_ITERATIONS=t.MAX_ITERATIONS=c.numIter),c.gravityRange!=null&&(r.DEFAULT_GRAVITY_RANGE_FACTOR=t.DEFAULT_GRAVITY_RANGE_FACTOR=c.gravityRange),c.gravityCompound!=null&&(r.DEFAULT_COMPOUND_GRAVITY_STRENGTH=t.DEFAULT_COMPOUND_GRAVITY_STRENGTH=c.gravityCompound),c.gravityRangeCompound!=null&&(r.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=t.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=c.gravityRangeCompound),c.initialEnergyOnIncremental!=null&&(r.DEFAULT_COOLING_FACTOR_INCREMENTAL=t.DEFAULT_COOLING_FACTOR_INCREMENTAL=c.initialEnergyOnIncremental),c.quality=="draft"?e.QUALITY=0:c.quality=="proof"?e.QUALITY=2:e.QUALITY=1,r.NODE_DIMENSIONS_INCLUDE_LABELS=t.NODE_DIMENSIONS_INCLUDE_LABELS=e.NODE_DIMENSIONS_INCLUDE_LABELS=c.nodeDimensionsIncludeLabels,r.DEFAULT_INCREMENTAL=t.DEFAULT_INCREMENTAL=e.DEFAULT_INCREMENTAL=!c.randomize,r.ANIMATE=t.ANIMATE=e.ANIMATE=c.animate,r.TILE=c.tile,r.TILING_PADDING_VERTICAL=typeof c.tilingPaddingVertical=="function"?c.tilingPaddingVertical.call():c.tilingPaddingVertical,r.TILING_PADDING_HORIZONTAL=typeof c.tilingPaddingHorizontal=="function"?c.tilingPaddingHorizontal.call():c.tilingPaddingHorizontal};l.prototype.run=function(){var L,c,A=this.options,T=this.idToLNode={},C=this.layout=new a,o=this;o.stopped=!1,this.cy=this.options.cy,this.cy.trigger({type:"layoutstart",layout:this});var f=C.newGraphManager();this.gm=f;var u=this.options.eles.nodes(),E=this.options.eles.edges();this.root=f.addRoot(),this.processChildrenList(this.root,this.getTopMostNodes(u),C);for(var D=0;D0){var I;I=A.getGraphManager().add(A.newGraph(),u),this.processChildrenList(I,f,A)}}},l.prototype.stop=function(){return this.stopped=!0,this};var v=function(c){c("layout","cose-bilkent",l)};typeof cytoscape<"u"&&v(cytoscape),R.exports=v})])})});var ht=yt(at(),1);z.use(ht.default);function lt(N,R){N.forEach(y=>{let n={id:y.id,labelText:y.label,height:y.height,width:y.width,padding:y.padding??0};Object.keys(y).forEach(e=>{["id","label","height","width","padding","x","y"].includes(e)||(n[e]=y[e])}),R.add({group:"nodes",data:n,position:{x:y.x??0,y:y.y??0}})})}W(lt,"addNodes");function ut(N,R){N.forEach(y=>{let n={id:y.id,source:y.start,target:y.end};Object.keys(y).forEach(e=>{["id","start","end"].includes(e)||(n[e]=y[e])}),R.add({group:"edges",data:n})})}W(ut,"addEdges");function gt(N){return new Promise(R=>{let y=ot("body").append("div").attr("id","cy").attr("style","display:none"),n=z({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});y.remove(),lt(N.nodes,n),ut(N.edges,n),n.nodes().forEach(function(t){t.layoutDimensions=()=>{let r=t.data();return{w:r.width,h:r.height}}});let e={name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1};n.layout(e).run(),n.ready(t=>{Z.info("Cytoscape ready",t),R(n)})})}W(gt,"createCytoscapeInstance");function ft(N){return N.nodes().map(R=>{let y=R.data(),n=R.position(),e={id:y.id,x:n.x,y:n.y};return Object.keys(y).forEach(t=>{t!=="id"&&(e[t]=y[t])}),e})}W(ft,"extractPositionedNodes");function ct(N){return N.edges().map(R=>{let y=R.data(),n=R._private.rscratch,e={id:y.id,source:y.source,target:y.target,startX:n.startX,startY:n.startY,midX:n.midX,midY:n.midY,endX:n.endX,endY:n.endY};return Object.keys(y).forEach(t=>{["id","source","target"].includes(t)||(e[t]=y[t])}),e})}W(ct,"extractPositionedEdges");function pt(N,R){return k(this,null,function*(){Z.debug("Starting cose-bilkent layout algorithm");try{dt(N);let y=yield gt(N),n=ft(y),e=ct(y);return Z.debug(`Layout completed: ${n.length} nodes, ${e.length} edges`),{nodes:n,edges:e}}catch(y){throw Z.error("Error in cose-bilkent layout algorithm:",y),y}})}W(pt,"executeCoseBilkentLayout");function dt(N){if(!N)throw new Error("Layout data is required");if(!N.config)throw new Error("Configuration is required in layout data");if(!N.rootNode)throw new Error("Root node is required");if(!N.nodes||!Array.isArray(N.nodes))throw new Error("No nodes found in layout data");if(!Array.isArray(N.edges))throw new Error("Edges array is required in layout data");return!0}W(dt,"validateLayoutData");var Et=W((d,i,h,l)=>k(null,[d,i,h,l],function*(N,R,{insertCluster:y,insertEdge:n,insertEdgeLabel:e,insertMarkers:t,insertNode:r,log:a,positionEdgeLabel:g},{algorithm:s}){let p={},v={},L=R.select("g");t(L,N.markers,N.type,N.diagramId);let c=L.insert("g").attr("class","subgraphs"),A=L.insert("g").attr("class","edgePaths"),T=L.insert("g").attr("class","edgeLabels"),C=L.insert("g").attr("class","nodes");a.debug("Inserting nodes into DOM for dimension calculation"),yield Promise.all(N.nodes.map(u=>k(null,null,function*(){if(u.isGroup){let E=B({},u);v[u.id]=E,p[u.id]=E,yield y(c,u)}else{let E=B({},u);p[u.id]=E;let D=yield r(C,u,{config:N.config,dir:N.direction||"TB"}),O=D.node().getBBox();E.width=O.width,E.height=O.height,E.domId=D,a.debug(`Node ${u.id} dimensions: ${O.width}x${O.height}`)}}))),a.debug("Running cose-bilkent layout algorithm");let o=K(B({},N),{nodes:N.nodes.map(u=>{let E=p[u.id];return K(B({},u),{width:E.width,height:E.height})})}),f=yield pt(o,N.config);a.debug("Positioning nodes based on layout results"),f.nodes.forEach(u=>{let E=p[u.id];E?.domId&&(E.domId.attr("transform",`translate(${u.x}, ${u.y})`),E.x=u.x,E.y=u.y,a.debug(`Positioned node ${E.id} at center (${u.x}, ${u.y})`))}),f.edges.forEach(u=>{let E=N.edges.find(D=>D.id===u.id);E&&(E.points=[{x:u.startX,y:u.startY},{x:u.midX,y:u.midY},{x:u.endX,y:u.endY}])}),a.debug("Inserting and positioning edges"),yield Promise.all(N.edges.map(u=>k(null,null,function*(){let E=yield e(T,u),D=p[u.start??""],O=p[u.end??""];if(D&&O){let m=f.edges.find(I=>I.id===u.id);if(m){a.debug("APA01 positionedEdge",m);let I=B({},u),w=n(A,I,v,N.type,D,O,N.diagramId);g(I,w)}else{let I=K(B({},u),{points:[{x:D.x||0,y:D.y||0},{x:O.x||0,y:O.y||0}]}),w=n(A,I,v,N.type,D,O,N.diagramId);g(I,w)}}}))),a.debug("Cose-bilkent rendering completed")}),"render"),At=Et;export{At as render}; diff --git a/src/google/adk/cli/browser/chunk-HDC4PFPG.js b/src/google/adk/cli/browser/chunk-HDC4PFPG.js deleted file mode 100644 index 072b0cc4ff..0000000000 --- a/src/google/adk/cli/browser/chunk-HDC4PFPG.js +++ /dev/null @@ -1 +0,0 @@ -import{a as e,b as r}from"./chunk-WR6HISGZ.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{e as PieModule,r as createPieServices}; diff --git a/src/google/adk/cli/browser/chunk-I4UDKKN5.js b/src/google/adk/cli/browser/chunk-I4UDKKN5.js deleted file mode 100644 index 0e6afd3cb4..0000000000 --- a/src/google/adk/cli/browser/chunk-I4UDKKN5.js +++ /dev/null @@ -1 +0,0 @@ -import{a as s,b as u,c as i,d as n,e as m,f as t,g as o,h as l,o as d,q as h}from"./chunk-NALL4A3P.js";var A=class extends h{static{t(this,"ArchitectureTokenBuilder")}constructor(){super(["architecture"])}},C=class extends d{static{t(this,"ArchitectureValueConverter")}runCustomConverter(c,r,a){if(c.name==="ARCH_ICON")return r.replace(/[()]/g,"").trim();if(c.name==="ARCH_TEXT_ICON")return r.replace(/["()]/g,"");if(c.name==="ARCH_TITLE"){let e=r.replace(/^\[|]$/g,"").trim();return(e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))&&(e=e.slice(1,-1),e=e.replace(/\\"/g,'"').replace(/\\'/g,"'")),e.trim()}}},v={parser:{TokenBuilder:t(()=>new A,"TokenBuilder"),ValueConverter:t(()=>new C,"ValueConverter")}};function f(c=n){let r=i(u(c),o),a=i(s({shared:r}),l,v);return r.ServiceRegistry.register(a),{shared:r,Architecture:a}}t(f,"createArchitectureServices");export{v as a,f as b}; diff --git a/src/google/adk/cli/browser/chunk-ICVZGLGO.js b/src/google/adk/cli/browser/chunk-ICVZGLGO.js deleted file mode 100644 index 030253ee3b..0000000000 --- a/src/google/adk/cli/browser/chunk-ICVZGLGO.js +++ /dev/null @@ -1,68 +0,0 @@ -import{a as pe}from"./chunk-APNCZOFE.js";import{a as fe}from"./chunk-ST54LLJ3.js";import{b as ge,c as ue}from"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{D as de,G as w,Y as V,c as ce,d as le,e as he,r as R}from"./chunk-QFMJV7VH.js";import{g as c,i as T}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{j as ae}from"./chunk-RMXJBC7V.js";var y=[];for(let e=0;e<256;++e)y.push((e+256).toString(16).slice(1));function me(e,n=0){return(y[e[n+0]]+y[e[n+1]]+y[e[n+2]]+y[e[n+3]]+"-"+y[e[n+4]]+y[e[n+5]]+"-"+y[e[n+6]]+y[e[n+7]]+"-"+y[e[n+8]]+y[e[n+9]]+"-"+y[e[n+10]]+y[e[n+11]]+y[e[n+12]]+y[e[n+13]]+y[e[n+14]]+y[e[n+15]]).toLowerCase()}var X,Se=new Uint8Array(16);function z(){if(!X){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");X=crypto.getRandomValues.bind(crypto)}return X(Se)}var xe=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),W={randomUUID:xe};function De(e,n,i){if(W.randomUUID&&!n&&!e)return W.randomUUID();e=e||{};let l=e.random??e.rng?.()??z();if(l.length<16)throw new Error("Random bytes length must be >= 16");if(l[6]=l[6]&15|64,l[8]=l[8]&63|128,n){if(i=i||0,i<0||i+16>n.length)throw new RangeError(`UUID byte range ${i}:${i+15} is out of buffer bounds`);for(let g=0;g<16;++g)n[i+g]=l[g];return n}return me(l)}var Y=De;var q=(function(){var e=c(function(N,r,t,o){for(t=t||{},o=N.length;o--;t[N[o]]=r);return t},"o"),n=[1,4],i=[1,13],l=[1,12],g=[1,15],h=[1,16],f=[1,20],E=[1,19],p=[6,7,8],J=[1,26],K=[1,24],Q=[1,25],_=[6,7,11],Z=[1,6,13,15,16,19,22],ee=[1,33],te=[1,34],I=[1,6,7,11,13,15,16,19,22],B={trace:c(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:c(function(r,t,o,a,u,s,C){var d=s.length-1;switch(u){case 6:case 7:return a;case 8:a.getLogger().trace("Stop NL ");break;case 9:a.getLogger().trace("Stop EOF ");break;case 11:a.getLogger().trace("Stop NL2 ");break;case 12:a.getLogger().trace("Stop EOF2 ");break;case 15:a.getLogger().info("Node: ",s[d].id),a.addNode(s[d-1].length,s[d].id,s[d].descr,s[d].type);break;case 16:a.getLogger().trace("Icon: ",s[d]),a.decorateNode({icon:s[d]});break;case 17:case 21:a.decorateNode({class:s[d]});break;case 18:a.getLogger().trace("SPACELIST");break;case 19:a.getLogger().trace("Node: ",s[d].id),a.addNode(0,s[d].id,s[d].descr,s[d].type);break;case 20:a.decorateNode({icon:s[d]});break;case 25:a.getLogger().trace("node found ..",s[d-2]),this.$={id:s[d-1],descr:s[d-1],type:a.getType(s[d-2],s[d])};break;case 26:this.$={id:s[d],descr:s[d],type:a.nodeType.DEFAULT};break;case 27:a.getLogger().trace("node found ..",s[d-3]),this.$={id:s[d-3],descr:s[d-1],type:a.getType(s[d-2],s[d])};break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:n},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:n},{6:i,7:[1,10],9:9,12:11,13:l,14:14,15:g,16:h,17:17,18:18,19:f,22:E},e(p,[2,3]),{1:[2,2]},e(p,[2,4]),e(p,[2,5]),{1:[2,6],6:i,12:21,13:l,14:14,15:g,16:h,17:17,18:18,19:f,22:E},{6:i,9:22,12:11,13:l,14:14,15:g,16:h,17:17,18:18,19:f,22:E},{6:J,7:K,10:23,11:Q},e(_,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:f,22:E}),e(_,[2,18]),e(_,[2,19]),e(_,[2,20]),e(_,[2,21]),e(_,[2,23]),e(_,[2,24]),e(_,[2,26],{19:[1,30]}),{20:[1,31]},{6:J,7:K,10:32,11:Q},{1:[2,7],6:i,12:21,13:l,14:14,15:g,16:h,17:17,18:18,19:f,22:E},e(Z,[2,14],{7:ee,11:te}),e(I,[2,8]),e(I,[2,9]),e(I,[2,10]),e(_,[2,15]),e(_,[2,16]),e(_,[2,17]),{20:[1,35]},{21:[1,36]},e(Z,[2,13],{7:ee,11:te}),e(I,[2,11]),e(I,[2,12]),{21:[1,37]},e(_,[2,25]),e(_,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:c(function(r,t){if(t.recoverable)this.trace(r);else{var o=new Error(r);throw o.hash=t,o}},"parseError"),parse:c(function(r){var t=this,o=[0],a=[],u=[null],s=[],C=this.table,d="",U=0,ie=0,ne=0,be=2,se=1,Ee=s.slice.call(arguments,1),m=Object.create(this.lexer),v={yy:{}};for(var F in this.yy)Object.prototype.hasOwnProperty.call(this.yy,F)&&(v.yy[F]=this.yy[F]);m.setInput(r,v.yy),v.yy.lexer=m,v.yy.parser=this,typeof m.yylloc>"u"&&(m.yylloc={});var j=m.yylloc;s.push(j);var _e=m.options&&m.options.ranges;typeof v.yy.parseError=="function"?this.parseError=v.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ke(k){o.length=o.length-2*k,u.length=u.length-k,s.length=s.length-k}c(ke,"popStack");function re(){var k;return k=a.pop()||m.lex()||se,typeof k!="number"&&(k instanceof Array&&(a=k,k=a.pop()),k=t.symbols_[k]||k),k}c(re,"lex");for(var b,G,L,S,we,$,O={},P,x,oe,M;;){if(L=o[o.length-1],this.defaultActions[L]?S=this.defaultActions[L]:((b===null||typeof b>"u")&&(b=re()),S=C[L]&&C[L][b]),typeof S>"u"||!S.length||!S[0]){var H="";M=[];for(P in C[L])this.terminals_[P]&&P>be&&M.push("'"+this.terminals_[P]+"'");m.showPosition?H="Parse error on line "+(U+1)+`: -`+m.showPosition()+` -Expecting `+M.join(", ")+", got '"+(this.terminals_[b]||b)+"'":H="Parse error on line "+(U+1)+": Unexpected "+(b==se?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(H,{text:m.match,token:this.terminals_[b]||b,line:m.yylineno,loc:j,expected:M})}if(S[0]instanceof Array&&S.length>1)throw new Error("Parse Error: multiple actions possible at state: "+L+", token: "+b);switch(S[0]){case 1:o.push(b),u.push(m.yytext),s.push(m.yylloc),o.push(S[1]),b=null,G?(b=G,G=null):(ie=m.yyleng,d=m.yytext,U=m.yylineno,j=m.yylloc,ne>0&&ne--);break;case 2:if(x=this.productions_[S[1]][1],O.$=u[u.length-x],O._$={first_line:s[s.length-(x||1)].first_line,last_line:s[s.length-1].last_line,first_column:s[s.length-(x||1)].first_column,last_column:s[s.length-1].last_column},_e&&(O._$.range=[s[s.length-(x||1)].range[0],s[s.length-1].range[1]]),$=this.performAction.apply(O,[d,ie,U,v.yy,S[1],u,s].concat(Ee)),typeof $<"u")return $;x&&(o=o.slice(0,-1*x*2),u=u.slice(0,-1*x),s=s.slice(0,-1*x)),o.push(this.productions_[S[1]][0]),u.push(O.$),s.push(O._$),oe=C[o[o.length-2]][o[o.length-1]],o.push(oe);break;case 3:return!0}}return!0},"parse")},ye=(function(){var N={EOF:1,parseError:c(function(t,o){if(this.yy.parser)this.yy.parser.parseError(t,o);else throw new Error(t)},"parseError"),setInput:c(function(r,t){return this.yy=t||this.yy||{},this._input=r,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:c(function(){var r=this._input[0];this.yytext+=r,this.yyleng++,this.offset++,this.match+=r,this.matched+=r;var t=r.match(/(?:\r\n?|\n).*/g);return t?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),r},"input"),unput:c(function(r){var t=r.length,o=r.split(/(?:\r\n?|\n)/g);this._input=r+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t),this.offset-=t;var a=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),o.length-1&&(this.yylineno-=o.length-1);var u=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:o?(o.length===a.length?this.yylloc.first_column:0)+a[a.length-o.length].length-o[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[u[0],u[0]+this.yyleng-t]),this.yyleng=this.yytext.length,this},"unput"),more:c(function(){return this._more=!0,this},"more"),reject:c(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:c(function(r){this.unput(this.match.slice(r))},"less"),pastInput:c(function(){var r=this.matched.substr(0,this.matched.length-this.match.length);return(r.length>20?"...":"")+r.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:c(function(){var r=this.match;return r.length<20&&(r+=this._input.substr(0,20-r.length)),(r.substr(0,20)+(r.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:c(function(){var r=this.pastInput(),t=new Array(r.length+1).join("-");return r+this.upcomingInput()+` -`+t+"^"},"showPosition"),test_match:c(function(r,t){var o,a,u;if(this.options.backtrack_lexer&&(u={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(u.yylloc.range=this.yylloc.range.slice(0))),a=r[0].match(/(?:\r\n?|\n).*/g),a&&(this.yylineno+=a.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:a?a[a.length-1].length-a[a.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+r[0].length},this.yytext+=r[0],this.match+=r[0],this.matches=r,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(r[0].length),this.matched+=r[0],o=this.performAction.call(this,this.yy,this,t,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),o)return o;if(this._backtrack){for(var s in u)this[s]=u[s];return!1}return!1},"test_match"),next:c(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var r,t,o,a;this._more||(this.yytext="",this.match="");for(var u=this._currentRules(),s=0;st[0].length)){if(t=o,a=s,this.options.backtrack_lexer){if(r=this.test_match(o,u[s]),r!==!1)return r;if(this._backtrack){t=!1;continue}else return!1}else if(!this.options.flex)break}return t?(r=this.test_match(t,u[a]),r!==!1?r:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:c(function(){var t=this.next();return t||this.lex()},"lex"),begin:c(function(t){this.conditionStack.push(t)},"begin"),popState:c(function(){var t=this.conditionStack.length-1;return t>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:c(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:c(function(t){return t=this.conditionStack.length-1-Math.abs(t||0),t>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:c(function(t){this.begin(t)},"pushState"),stateStackSize:c(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:c(function(t,o,a,u){var s=u;switch(a){case 0:return t.getLogger().trace("Found comment",o.yytext),6;break;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;break;case 4:this.popState();break;case 5:t.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return t.getLogger().trace("SPACELINE"),6;break;case 7:return 7;case 8:return 15;case 9:t.getLogger().trace("end icon"),this.popState();break;case 10:return t.getLogger().trace("Exploding node"),this.begin("NODE"),19;break;case 11:return t.getLogger().trace("Cloud"),this.begin("NODE"),19;break;case 12:return t.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;break;case 13:return t.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;break;case 14:return this.begin("NODE"),19;break;case 15:return this.begin("NODE"),19;break;case 16:return this.begin("NODE"),19;break;case 17:return this.begin("NODE"),19;break;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 23:this.popState();break;case 24:t.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return t.getLogger().trace("description:",o.yytext),"NODE_DESCR";break;case 26:this.popState();break;case 27:return this.popState(),t.getLogger().trace("node end ))"),"NODE_DEND";break;case 28:return this.popState(),t.getLogger().trace("node end )"),"NODE_DEND";break;case 29:return this.popState(),t.getLogger().trace("node end ...",o.yytext),"NODE_DEND";break;case 30:return this.popState(),t.getLogger().trace("node end (("),"NODE_DEND";break;case 31:return this.popState(),t.getLogger().trace("node end (-"),"NODE_DEND";break;case 32:return this.popState(),t.getLogger().trace("node end (-"),"NODE_DEND";break;case 33:return this.popState(),t.getLogger().trace("node end (("),"NODE_DEND";break;case 34:return this.popState(),t.getLogger().trace("node end (("),"NODE_DEND";break;case 35:return t.getLogger().trace("Long description:",o.yytext),20;break;case 36:return t.getLogger().trace("Long description:",o.yytext),20;break}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}};return N})();B.lexer=ye;function A(){this.yy={}}return c(A,"Parser"),A.prototype=B,B.Parser=A,new A})();q.parser=q;var Ne=q,ve=12,D={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},Le=class{constructor(){this.nodes=[],this.count=0,this.elements={},this.getLogger=this.getLogger.bind(this),this.nodeType=D,this.clear(),this.getType=this.getType.bind(this),this.getElementById=this.getElementById.bind(this),this.getParent=this.getParent.bind(this),this.getMindmap=this.getMindmap.bind(this),this.addNode=this.addNode.bind(this),this.decorateNode=this.decorateNode.bind(this)}static{c(this,"MindmapDB")}clear(){this.nodes=[],this.count=0,this.elements={},this.baseLevel=void 0}getParent(e){for(let n=this.nodes.length-1;n>=0;n--)if(this.nodes[n].level0?this.nodes[0]:null}addNode(e,n,i,l){T.info("addNode",e,n,i,l);let g=!1;this.nodes.length===0?(this.baseLevel=e,e=0,g=!0):this.baseLevel!==void 0&&(e=e-this.baseLevel,g=!1);let h=V(),f=h.mindmap?.padding??R.mindmap.padding;switch(l){case this.nodeType.ROUNDED_RECT:case this.nodeType.RECT:case this.nodeType.HEXAGON:f*=2;break}let E={id:this.count++,nodeId:w(n,h),level:e,descr:w(i,h),type:l,children:[],width:h.mindmap?.maxNodeWidth??R.mindmap.maxNodeWidth,padding:f,isRoot:g},p=this.getParent(e);if(p)p.children.push(E),this.nodes.push(E);else if(g)this.nodes.push(E);else throw new Error(`There can be only one root. No parent could be found for ("${E.descr}")`)}getType(e,n){switch(T.debug("In get type",e,n),e){case"[":return this.nodeType.RECT;case"(":return n===")"?this.nodeType.ROUNDED_RECT:this.nodeType.CLOUD;case"((":return this.nodeType.CIRCLE;case")":return this.nodeType.CLOUD;case"))":return this.nodeType.BANG;case"{{":return this.nodeType.HEXAGON;default:return this.nodeType.DEFAULT}}setElementForId(e,n){this.elements[e]=n}getElementById(e){return this.elements[e]}decorateNode(e){if(!e)return;let n=V(),i=this.nodes[this.nodes.length-1];e.icon&&(i.icon=w(e.icon,n)),e.class&&(i.class=w(e.class,n))}type2Str(e){switch(e){case this.nodeType.DEFAULT:return"no-border";case this.nodeType.RECT:return"rect";case this.nodeType.ROUNDED_RECT:return"rounded-rect";case this.nodeType.CIRCLE:return"circle";case this.nodeType.CLOUD:return"cloud";case this.nodeType.BANG:return"bang";case this.nodeType.HEXAGON:return"hexgon";default:return"no-border"}}assignSections(e,n){if(e.level===0?e.section=void 0:e.section=n,e.children)for(let[i,l]of e.children.entries()){let g=e.level===0?i%(ve-1):n;this.assignSections(l,g)}}flattenNodes(e,n){let i=["mindmap-node"];e.isRoot===!0?i.push("section-root","section--1"):e.section!==void 0&&i.push(`section-${e.section}`),e.class&&i.push(e.class);let l=i.join(" "),g=c(f=>{switch(f){case D.CIRCLE:return"mindmapCircle";case D.RECT:return"rect";case D.ROUNDED_RECT:return"rounded";case D.CLOUD:return"cloud";case D.BANG:return"bang";case D.HEXAGON:return"hexagon";case D.DEFAULT:return"defaultMindmapNode";case D.NO_BORDER:default:return"rect"}},"getShapeFromType"),h={id:e.id.toString(),domId:"node_"+e.id.toString(),label:e.descr,labelType:"markdown",isGroup:!1,shape:g(e.type),width:e.width,height:e.height??0,padding:e.padding,cssClasses:l,cssStyles:[],look:"default",icon:e.icon,x:e.x,y:e.y,level:e.level,nodeId:e.nodeId,type:e.type,section:e.section};if(n.push(h),e.children)for(let f of e.children)this.flattenNodes(f,n)}generateEdges(e,n){if(e.children)for(let i of e.children){let l="edge";i.section!==void 0&&(l+=` section-edge-${i.section}`);let g=e.level+1;l+=` edge-depth-${g}`;let h={id:`edge_${e.id}_${i.id}`,start:e.id.toString(),end:i.id.toString(),type:"normal",curve:"basis",thickness:"normal",look:"default",classes:l,depth:e.level,section:i.section};n.push(h),this.generateEdges(i,n)}}getData(){let e=this.getMindmap(),n=V(),l=de().layout!==void 0,g=n;if(l||(g.layout="cose-bilkent"),!e)return{nodes:[],edges:[],config:g};T.debug("getData: mindmapRoot",e,n),this.assignSections(e);let h=[],f=[];this.flattenNodes(e,h),this.generateEdges(e,f),T.debug(`getData: processed ${h.length} nodes and ${f.length} edges`);let E=new Map;for(let p of h)E.set(p.id,{shape:p.shape,width:p.width,height:p.height,padding:p.padding});return{nodes:h,edges:f,config:g,rootNode:e,markers:["point"],direction:"TB",nodeSpacing:50,rankSpacing:50,shapes:Object.fromEntries(E),type:"mindmap",diagramId:"mindmap-"+Y()}}getLogger(){return T}},Te=c((e,n,i,l)=>ae(null,null,function*(){T.debug(`Rendering mindmap diagram -`+e);let g=l.db,h=g.getData(),f=pe(n,h.config.securityLevel);h.type=l.type,h.layoutAlgorithm=ue(h.config.layout,{fallback:"cose-bilkent"}),h.diagramId=n,g.getMindmap()&&(h.nodes.forEach(p=>{p.shape==="rounded"?(p.radius=15,p.taper=15,p.stroke="none",p.width=0,p.padding=15):p.shape==="circle"?p.padding=10:p.shape==="rect"&&(p.width=0,p.padding=10)}),yield ge(h,f),fe(f,h.config.mindmap?.padding??R.mindmap.padding,"mindmapDiagram",h.config.mindmap?.useMaxWidth??R.mindmap.useMaxWidth))}),"draw"),Oe={draw:Te},Ie=c(e=>{let n="";for(let i=0;i` - .edge { - stroke-width: 3; - } - ${Ie(e)} - .section-root rect, .section-root path, .section-root circle, .section-root polygon { - fill: ${e.git0}; - } - .section-root text { - fill: ${e.gitBranchLabel0}; - } - .section-root span { - color: ${e.gitBranchLabel0}; - } - .section-2 span { - color: ${e.gitBranchLabel0}; - } - .icon-container { - height:100%; - display: flex; - justify-content: center; - align-items: center; - } - .edge { - fill: none; - } - .mindmap-node-label { - dy: 1em; - alignment-baseline: middle; - text-anchor: middle; - dominant-baseline: middle; - text-align: center; - } -`,"getStyles"),Re=Ce,nt={get db(){return new Le},renderer:Oe,parser:Ne,styles:Re};export{nt as diagram}; diff --git a/src/google/adk/cli/browser/chunk-IHY23QJP.js b/src/google/adk/cli/browser/chunk-IHY23QJP.js deleted file mode 100644 index 6d72da771b..0000000000 --- a/src/google/adk/cli/browser/chunk-IHY23QJP.js +++ /dev/null @@ -1 +0,0 @@ -import{a as e,b as r}from"./chunk-I4UDKKN5.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{e as ArchitectureModule,r as createArchitectureServices}; diff --git a/src/google/adk/cli/browser/chunk-J4R5U4YL.js b/src/google/adk/cli/browser/chunk-J4R5U4YL.js deleted file mode 100644 index b153718475..0000000000 --- a/src/google/adk/cli/browser/chunk-J4R5U4YL.js +++ /dev/null @@ -1,7 +0,0 @@ -import{a as Ht}from"./chunk-TPDTRWWV.js";import{e as Ut}from"./chunk-WXI2IBAH.js";import{l as pt}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as st,G as Bt,N as Wt,R as zt,S as Ft,T as Ot,U as Xt,V as Nt,W as Yt,X as gt,p as Vt,r as Mt}from"./chunk-QFMJV7VH.js";import{M as ft,g as a,i as ut,s as xt,t as dt}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";var mt=(function(){var t=a(function(N,o,l,u){for(l=l||{},u=N.length;u--;l[N[u]]=o);return l},"o"),i=[1,10,12,14,16,18,19,21,23],e=[2,6],s=[1,3],r=[1,5],p=[1,6],x=[1,7],A=[1,5,10,12,14,16,18,19,21,23,34,35,36],L=[1,25],W=[1,26],V=[1,28],T=[1,29],E=[1,30],z=[1,31],F=[1,32],R=[1,33],M=[1,34],O=[1,35],X=[1,36],f=[1,37],D=[1,43],h=[1,42],B=[1,47],v=[1,50],b=[1,10,12,14,16,18,19,21,23,34,35,36],H=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],c=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],C=[1,64],_={trace:a(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:a(function(o,l,u,g,y,n,Q){var d=n.length-1;switch(y){case 5:g.setOrientation(n[d]);break;case 9:g.setDiagramTitle(n[d].text.trim());break;case 12:g.setLineData({text:"",type:"text"},n[d]);break;case 13:g.setLineData(n[d-1],n[d]);break;case 14:g.setBarData({text:"",type:"text"},n[d]);break;case 15:g.setBarData(n[d-1],n[d]);break;case 16:this.$=n[d].trim(),g.setAccTitle(this.$);break;case 17:case 18:this.$=n[d].trim(),g.setAccDescription(this.$);break;case 19:this.$=n[d-1];break;case 20:this.$=[Number(n[d-2]),...n[d]];break;case 21:this.$=[Number(n[d])];break;case 22:g.setXAxisTitle(n[d]);break;case 23:g.setXAxisTitle(n[d-1]);break;case 24:g.setXAxisTitle({type:"text",text:""});break;case 25:g.setXAxisBand(n[d]);break;case 26:g.setXAxisRangeData(Number(n[d-2]),Number(n[d]));break;case 27:this.$=n[d-1];break;case 28:this.$=[n[d-2],...n[d]];break;case 29:this.$=[n[d]];break;case 30:g.setYAxisTitle(n[d]);break;case 31:g.setYAxisTitle(n[d-1]);break;case 32:g.setYAxisTitle({type:"text",text:""});break;case 33:g.setYAxisRangeData(Number(n[d-2]),Number(n[d]));break;case 37:this.$={text:n[d],type:"text"};break;case 38:this.$={text:n[d],type:"text"};break;case 39:this.$={text:n[d],type:"markdown"};break;case 40:this.$=n[d];break;case 41:this.$=n[d-1]+""+n[d];break}},"anonymous"),table:[t(i,e,{3:1,4:2,7:4,5:s,34:r,35:p,36:x}),{1:[3]},t(i,e,{4:2,7:4,3:8,5:s,34:r,35:p,36:x}),t(i,e,{4:2,7:4,6:9,3:10,5:s,8:[1,11],34:r,35:p,36:x}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(A,[2,34]),t(A,[2,35]),t(A,[2,36]),{1:[2,1]},t(i,e,{4:2,7:4,3:21,5:s,34:r,35:p,36:x}),{1:[2,3]},t(A,[2,5]),t(i,[2,7],{4:22,34:r,35:p,36:x}),{11:23,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},{11:39,13:38,24:D,27:h,29:40,30:41,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},{11:45,15:44,27:B,33:46,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},{11:49,17:48,24:v,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},{11:52,17:51,24:v,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},{20:[1,53]},{22:[1,54]},t(b,[2,18]),{1:[2,2]},t(b,[2,8]),t(b,[2,9]),t(H,[2,37],{40:55,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f}),t(H,[2,38]),t(H,[2,39]),t(c,[2,40]),t(c,[2,42]),t(c,[2,43]),t(c,[2,44]),t(c,[2,45]),t(c,[2,46]),t(c,[2,47]),t(c,[2,48]),t(c,[2,49]),t(c,[2,50]),t(c,[2,51]),t(b,[2,10]),t(b,[2,22],{30:41,29:56,24:D,27:h}),t(b,[2,24]),t(b,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},t(b,[2,11]),t(b,[2,30],{33:60,27:B}),t(b,[2,32]),{31:[1,61]},t(b,[2,12]),{17:62,24:v},{25:63,27:C},t(b,[2,14]),{17:65,24:v},t(b,[2,16]),t(b,[2,17]),t(c,[2,41]),t(b,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(b,[2,31]),{27:[1,69]},t(b,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(b,[2,15]),t(b,[2,26]),t(b,[2,27]),{11:59,32:72,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},t(b,[2,33]),t(b,[2,19]),{25:73,27:C},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:a(function(o,l){if(l.recoverable)this.trace(o);else{var u=new Error(o);throw u.hash=l,u}},"parseError"),parse:a(function(o){var l=this,u=[0],g=[],y=[null],n=[],Q=this.table,d="",tt=0,vt=0,Pt=0,gi=2,Lt=1,xi=n.slice.call(arguments,1),k=Object.create(this.lexer),$={yy:{}};for(var rt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,rt)&&($.yy[rt]=this.yy[rt]);k.setInput(o,$.yy),$.yy.lexer=k,$.yy.parser=this,typeof k.yylloc>"u"&&(k.yylloc={});var ot=k.yylloc;n.push(ot);var di=k.options&&k.options.ranges;typeof $.yy.parseError=="function"?this.parseError=$.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function fi(P){u.length=u.length-2*P,y.length=y.length-P,n.length=n.length-P}a(fi,"popStack");function Et(){var P;return P=g.pop()||k.lex()||Lt,typeof P!="number"&&(P instanceof Array&&(g=P,P=g.pop()),P=l.symbols_[P]||P),P}a(Et,"lex");for(var S,ht,q,I,vi,lt,G={},it,Y,It,et;;){if(q=u[u.length-1],this.defaultActions[q]?I=this.defaultActions[q]:((S===null||typeof S>"u")&&(S=Et()),I=Q[q]&&Q[q][S]),typeof I>"u"||!I.length||!I[0]){var ct="";et=[];for(it in Q[q])this.terminals_[it]&&it>gi&&et.push("'"+this.terminals_[it]+"'");k.showPosition?ct="Parse error on line "+(tt+1)+`: -`+k.showPosition()+` -Expecting `+et.join(", ")+", got '"+(this.terminals_[S]||S)+"'":ct="Parse error on line "+(tt+1)+": Unexpected "+(S==Lt?"end of input":"'"+(this.terminals_[S]||S)+"'"),this.parseError(ct,{text:k.match,token:this.terminals_[S]||S,line:k.yylineno,loc:ot,expected:et})}if(I[0]instanceof Array&&I.length>1)throw new Error("Parse Error: multiple actions possible at state: "+q+", token: "+S);switch(I[0]){case 1:u.push(S),y.push(k.yytext),n.push(k.yylloc),u.push(I[1]),S=null,ht?(S=ht,ht=null):(vt=k.yyleng,d=k.yytext,tt=k.yylineno,ot=k.yylloc,Pt>0&&Pt--);break;case 2:if(Y=this.productions_[I[1]][1],G.$=y[y.length-Y],G._$={first_line:n[n.length-(Y||1)].first_line,last_line:n[n.length-1].last_line,first_column:n[n.length-(Y||1)].first_column,last_column:n[n.length-1].last_column},di&&(G._$.range=[n[n.length-(Y||1)].range[0],n[n.length-1].range[1]]),lt=this.performAction.apply(G,[d,vt,tt,$.yy,I[1],y,n].concat(xi)),typeof lt<"u")return lt;Y&&(u=u.slice(0,-1*Y*2),y=y.slice(0,-1*Y),n=n.slice(0,-1*Y)),u.push(this.productions_[I[1]][0]),y.push(G.$),n.push(G._$),It=Q[u[u.length-2]][u[u.length-1]],u.push(It);break;case 3:return!0}}return!0},"parse")},w=(function(){var N={EOF:1,parseError:a(function(l,u){if(this.yy.parser)this.yy.parser.parseError(l,u);else throw new Error(l)},"parseError"),setInput:a(function(o,l){return this.yy=l||this.yy||{},this._input=o,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:a(function(){var o=this._input[0];this.yytext+=o,this.yyleng++,this.offset++,this.match+=o,this.matched+=o;var l=o.match(/(?:\r\n?|\n).*/g);return l?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),o},"input"),unput:a(function(o){var l=o.length,u=o.split(/(?:\r\n?|\n)/g);this._input=o+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-l),this.offset-=l;var g=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),u.length-1&&(this.yylineno-=u.length-1);var y=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:u?(u.length===g.length?this.yylloc.first_column:0)+g[g.length-u.length].length-u[0].length:this.yylloc.first_column-l},this.options.ranges&&(this.yylloc.range=[y[0],y[0]+this.yyleng-l]),this.yyleng=this.yytext.length,this},"unput"),more:a(function(){return this._more=!0,this},"more"),reject:a(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:a(function(o){this.unput(this.match.slice(o))},"less"),pastInput:a(function(){var o=this.matched.substr(0,this.matched.length-this.match.length);return(o.length>20?"...":"")+o.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:a(function(){var o=this.match;return o.length<20&&(o+=this._input.substr(0,20-o.length)),(o.substr(0,20)+(o.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:a(function(){var o=this.pastInput(),l=new Array(o.length+1).join("-");return o+this.upcomingInput()+` -`+l+"^"},"showPosition"),test_match:a(function(o,l){var u,g,y;if(this.options.backtrack_lexer&&(y={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(y.yylloc.range=this.yylloc.range.slice(0))),g=o[0].match(/(?:\r\n?|\n).*/g),g&&(this.yylineno+=g.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:g?g[g.length-1].length-g[g.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+o[0].length},this.yytext+=o[0],this.match+=o[0],this.matches=o,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(o[0].length),this.matched+=o[0],u=this.performAction.call(this,this.yy,this,l,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),u)return u;if(this._backtrack){for(var n in y)this[n]=y[n];return!1}return!1},"test_match"),next:a(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var o,l,u,g;this._more||(this.yytext="",this.match="");for(var y=this._currentRules(),n=0;nl[0].length)){if(l=u,g=n,this.options.backtrack_lexer){if(o=this.test_match(u,y[n]),o!==!1)return o;if(this._backtrack){l=!1;continue}else return!1}else if(!this.options.flex)break}return l?(o=this.test_match(l,y[g]),o!==!1?o:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:a(function(){var l=this.next();return l||this.lex()},"lex"),begin:a(function(l){this.conditionStack.push(l)},"begin"),popState:a(function(){var l=this.conditionStack.length-1;return l>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:a(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:a(function(l){return l=this.conditionStack.length-1-Math.abs(l||0),l>=0?this.conditionStack[l]:"INITIAL"},"topState"),pushState:a(function(l){this.begin(l)},"pushState"),stateStackSize:a(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:a(function(l,u,g,y){var n=y;switch(g){case 0:break;case 1:break;case 2:return this.popState(),34;break;case 3:return this.popState(),34;break;case 4:return 34;case 5:break;case 6:return 10;case 7:return this.pushState("acc_title"),19;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.pushState("acc_descr"),21;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.pushState("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 5;case 15:return 5;case 16:return 8;case 17:return this.pushState("axis_data"),"X_AXIS";break;case 18:return this.pushState("axis_data"),"Y_AXIS";break;case 19:return this.pushState("axis_band_data"),24;break;case 20:return 31;case 21:return this.pushState("data"),16;break;case 22:return this.pushState("data"),18;break;case 23:return this.pushState("data_inner"),24;break;case 24:return 27;case 25:return this.popState(),26;break;case 26:this.popState();break;case 27:this.pushState("string");break;case 28:this.popState();break;case 29:return"STR";case 30:return 24;case 31:return 26;case 32:return 43;case 33:return"COLON";case 34:return 44;case 35:return 28;case 36:return 45;case 37:return 46;case 38:return 48;case 39:return 50;case 40:return 47;case 41:return 41;case 42:return 49;case 43:return 42;case 44:break;case 45:return 35;case 46:return 36}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:(\r?\n))/i,/^(?:(\r?\n))/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:\})/i,/^(?:[^\}]*)/i,/^(?:xychart-beta\b)/i,/^(?:xychart\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\b)/i,/^(?:y-axis\b)/i,/^(?:\[)/i,/^(?:-->)/i,/^(?:line\b)/i,/^(?:bar\b)/i,/^(?:\[)/i,/^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i,/^(?:\])/i,/^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n\(\?:`))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s+)/i,/^(?:;)/i,/^(?:$)/i],conditions:{data_inner:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,24,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,18,21,22,23,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,22,24,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[28,29],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0}}};return N})();_.lexer=w;function U(){this.yy={}}return a(U,"Parser"),U.prototype=_,_.Parser=U,new U})();mt.parser=mt;var pi=mt;function yt(t){return t.type==="bar"}a(yt,"isBarPlot");function kt(t){return t.type==="band"}a(kt,"isBandAxisData");function j(t){return t.type==="linear"}a(j,"isLinearAxisData");var Gt=class{constructor(t){this.parentGroup=t}static{a(this,"TextDimensionCalculatorWithFont")}getMaxDimension(t,i){if(!this.parentGroup)return{width:t.reduce((r,p)=>Math.max(p.length,r),0)*i,height:i};let e={width:0,height:0},s=this.parentGroup.append("g").attr("visibility","hidden").attr("font-size",i);for(let r of t){let p=Ut(s,1,r),x=p?p.width:r.length*i,A=p?p.height:i;e.width=Math.max(e.width,x),e.height=Math.max(e.height,A)}return s.remove(),e}},$t=.7,qt=.2,jt=class{constructor(t,i,e,s){this.axisConfig=t,this.title=i,this.textDimensionCalculator=e,this.axisThemeConfig=s,this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left",this.showTitle=!1,this.showLabel=!1,this.showTick=!1,this.showAxisLine=!1,this.outerPadding=0,this.titleTextHeight=0,this.labelTextHeight=0,this.range=[0,10],this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left"}static{a(this,"BaseAxis")}setRange(t){this.range=t,this.axisPosition==="left"||this.axisPosition==="right"?this.boundingRect.height=t[1]-t[0]:this.boundingRect.width=t[1]-t[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(t){this.axisPosition=t,this.setRange(this.range)}getTickDistance(){let t=this.getRange();return Math.abs(t[0]-t[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map(t=>t.toString()),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){$t*this.getTickDistance()>this.outerPadding*2&&(this.outerPadding=Math.floor($t*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(t){let i=t.height;if(this.axisConfig.showAxisLine&&i>this.axisConfig.axisLineWidth&&(i-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let e=this.getLabelDimension(),s=qt*t.width;this.outerPadding=Math.min(e.width/2,s);let r=e.height+this.axisConfig.labelPadding*2;this.labelTextHeight=e.height,r<=i&&(i-=r,this.showLabel=!0)}if(this.axisConfig.showTick&&i>=this.axisConfig.tickLength&&(this.showTick=!0,i-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let e=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),s=e.height+this.axisConfig.titlePadding*2;this.titleTextHeight=e.height,s<=i&&(i-=s,this.showTitle=!0)}this.boundingRect.width=t.width,this.boundingRect.height=t.height-i}calculateSpaceIfDrawnVertical(t){let i=t.width;if(this.axisConfig.showAxisLine&&i>this.axisConfig.axisLineWidth&&(i-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let e=this.getLabelDimension(),s=qt*t.height;this.outerPadding=Math.min(e.height/2,s);let r=e.width+this.axisConfig.labelPadding*2;r<=i&&(i-=r,this.showLabel=!0)}if(this.axisConfig.showTick&&i>=this.axisConfig.tickLength&&(this.showTick=!0,i-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let e=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),s=e.height+this.axisConfig.titlePadding*2;this.titleTextHeight=e.height,s<=i&&(i-=s,this.showTitle=!0)}this.boundingRect.width=t.width-i,this.boundingRect.height=t.height}calculateSpace(t){return this.axisPosition==="left"||this.axisPosition==="right"?this.calculateSpaceIfDrawnVertical(t):this.calculateSpaceIfDrawnHorizontally(t),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}getDrawableElementsForLeftAxis(){let t=[];if(this.showAxisLine){let i=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["left-axis","axisl-line"],data:[{path:`M ${i},${this.boundingRect.y} L ${i},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["left-axis","label"],data:this.getTickValues().map(i=>({text:i.toString(),x:this.boundingRect.x+this.boundingRect.width-(this.showLabel?this.axisConfig.labelPadding:0)-(this.showTick?this.axisConfig.tickLength:0)-(this.showAxisLine?this.axisConfig.axisLineWidth:0),y:this.getScaleValue(i),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"middle",horizontalPos:"right"}))}),this.showTick){let i=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);t.push({type:"path",groupTexts:["left-axis","ticks"],data:this.getTickValues().map(e=>({path:`M ${i},${this.getScaleValue(e)} L ${i-this.axisConfig.tickLength},${this.getScaleValue(e)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&t.push({type:"text",groupTexts:["left-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.axisConfig.titlePadding,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:270,verticalPos:"top",horizontalPos:"center"}]}),t}getDrawableElementsForBottomAxis(){let t=[];if(this.showAxisLine){let i=this.boundingRect.y+this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["bottom-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${i} L ${this.boundingRect.x+this.boundingRect.width},${i}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["bottom-axis","label"],data:this.getTickValues().map(i=>({text:i.toString(),x:this.getScaleValue(i),y:this.boundingRect.y+this.axisConfig.labelPadding+(this.showTick?this.axisConfig.tickLength:0)+(this.showAxisLine?this.axisConfig.axisLineWidth:0),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let i=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);t.push({type:"path",groupTexts:["bottom-axis","ticks"],data:this.getTickValues().map(e=>({path:`M ${this.getScaleValue(e)},${i} L ${this.getScaleValue(e)},${i+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&t.push({type:"text",groupTexts:["bottom-axis","title"],data:[{text:this.title,x:this.range[0]+(this.range[1]-this.range[0])/2,y:this.boundingRect.y+this.boundingRect.height-this.axisConfig.titlePadding-this.titleTextHeight,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),t}getDrawableElementsForTopAxis(){let t=[];if(this.showAxisLine){let i=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["top-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${i} L ${this.boundingRect.x+this.boundingRect.width},${i}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["top-axis","label"],data:this.getTickValues().map(i=>({text:i.toString(),x:this.getScaleValue(i),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+this.axisConfig.titlePadding*2:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let i=this.boundingRect.y;t.push({type:"path",groupTexts:["top-axis","ticks"],data:this.getTickValues().map(e=>({path:`M ${this.getScaleValue(e)},${i+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(e)},${i+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&t.push({type:"text",groupTexts:["top-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.axisConfig.titlePadding,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),t}getDrawableElements(){if(this.axisPosition==="left")return this.getDrawableElementsForLeftAxis();if(this.axisPosition==="right")throw Error("Drawing of right axis is not implemented");return this.axisPosition==="bottom"?this.getDrawableElementsForBottomAxis():this.axisPosition==="top"?this.getDrawableElementsForTopAxis():[]}},mi=class extends jt{static{a(this,"BandAxis")}constructor(t,i,e,s,r){super(t,s,r,i),this.categories=e,this.scale=xt().domain(this.categories).range(this.getRange())}setRange(t){super.setRange(t)}recalculateScale(){this.scale=xt().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),ut.trace("BandAxis axis final categories, range: ",this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(t){return this.scale(t)??this.getRange()[0]}},yi=class extends jt{static{a(this,"LinearAxis")}constructor(t,i,e,s,r){super(t,s,r,i),this.domain=e,this.scale=dt().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){let t=[...this.domain];this.axisPosition==="left"&&t.reverse(),this.scale=dt().domain(t).range(this.getRange())}getScaleValue(t){return this.scale(t)}};function bt(t,i,e,s){let r=new Gt(s);return kt(t)?new mi(i,e,t.categories,t.title,r):new yi(i,e,[t.min,t.max],t.title,r)}a(bt,"getAxis");var bi=class{constructor(t,i,e,s){this.textDimensionCalculator=t,this.chartConfig=i,this.chartData=e,this.chartThemeConfig=s,this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}static{a(this,"ChartTitle")}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}calculateSpace(t){let i=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),e=Math.max(i.width,t.width),s=i.height+2*this.chartConfig.titlePadding;return i.width<=e&&i.height<=s&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=e,this.boundingRect.height=s,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){let t=[];return this.showChartTitle&&t.push({groupTexts:["chart-title"],type:"text",data:[{fontSize:this.chartConfig.titleFontSize,text:this.chartData.title,verticalPos:"middle",horizontalPos:"center",x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.chartThemeConfig.titleColor,rotation:0}]}),t}};function Qt(t,i,e,s){let r=new Gt(s);return new bi(r,t,i,e)}a(Qt,"getChartTitleComponent");var Ai=class{constructor(t,i,e,s,r){this.plotData=t,this.xAxis=i,this.yAxis=e,this.orientation=s,this.plotIndex=r}static{a(this,"LinePlot")}getDrawableElement(){let t=this.plotData.data.map(e=>[this.xAxis.getScaleValue(e[0]),this.yAxis.getScaleValue(e[1])]),i;return this.orientation==="horizontal"?i=ft().y(e=>e[0]).x(e=>e[1])(t):i=ft().x(e=>e[0]).y(e=>e[1])(t),i?[{groupTexts:["plot",`line-plot-${this.plotIndex}`],type:"path",data:[{path:i,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}]:[]}},ki=class{constructor(t,i,e,s,r,p){this.barData=t,this.boundingRect=i,this.xAxis=e,this.yAxis=s,this.orientation=r,this.plotIndex=p}static{a(this,"BarPlot")}getDrawableElement(){let t=this.barData.data.map(r=>[this.xAxis.getScaleValue(r[0]),this.yAxis.getScaleValue(r[1])]),e=Math.min(this.xAxis.getAxisOuterPadding()*2,this.xAxis.getTickDistance())*(1-.05),s=e/2;return this.orientation==="horizontal"?[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:t.map(r=>({x:this.boundingRect.x,y:r[0]-s,height:e,width:r[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]:[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:t.map(r=>({x:r[0]-s,y:r[1],width:e,height:this.boundingRect.y+this.boundingRect.height-r[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]}},wi=class{constructor(t,i,e){this.chartConfig=t,this.chartData=i,this.chartThemeConfig=e,this.boundingRect={x:0,y:0,width:0,height:0}}static{a(this,"BasePlot")}setAxes(t,i){this.xAxis=t,this.yAxis=i}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}calculateSpace(t){return this.boundingRect.width=t.width,this.boundingRect.height=t.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!(this.xAxis&&this.yAxis))throw Error("Axes must be passed to render Plots");let t=[];for(let[i,e]of this.chartData.plots.entries())switch(e.type){case"line":{let s=new Ai(e,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,i);t.push(...s.getDrawableElement())}break;case"bar":{let s=new ki(e,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,i);t.push(...s.getDrawableElement())}break}return t}};function Kt(t,i,e){return new wi(t,i,e)}a(Kt,"getPlotComponent");var Ci=class{constructor(t,i,e,s){this.chartConfig=t,this.chartData=i,this.componentStore={title:Qt(t,i,e,s),plot:Kt(t,i,e),xAxis:bt(i.xAxis,t.xAxis,{titleColor:e.xAxisTitleColor,labelColor:e.xAxisLabelColor,tickColor:e.xAxisTickColor,axisLineColor:e.xAxisLineColor},s),yAxis:bt(i.yAxis,t.yAxis,{titleColor:e.yAxisTitleColor,labelColor:e.yAxisLabelColor,tickColor:e.yAxisTickColor,axisLineColor:e.yAxisLineColor},s)}}static{a(this,"Orchestrator")}calculateVerticalSpace(){let t=this.chartConfig.width,i=this.chartConfig.height,e=0,s=0,r=Math.floor(t*this.chartConfig.plotReservedSpacePercent/100),p=Math.floor(i*this.chartConfig.plotReservedSpacePercent/100),x=this.componentStore.plot.calculateSpace({width:r,height:p});t-=x.width,i-=x.height,x=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:i}),s=x.height,i-=x.height,this.componentStore.xAxis.setAxisPosition("bottom"),x=this.componentStore.xAxis.calculateSpace({width:t,height:i}),i-=x.height,this.componentStore.yAxis.setAxisPosition("left"),x=this.componentStore.yAxis.calculateSpace({width:t,height:i}),e=x.width,t-=x.width,t>0&&(r+=t,t=0),i>0&&(p+=i,i=0),this.componentStore.plot.calculateSpace({width:r,height:p}),this.componentStore.plot.setBoundingBoxXY({x:e,y:s}),this.componentStore.xAxis.setRange([e,e+r]),this.componentStore.xAxis.setBoundingBoxXY({x:e,y:s+p}),this.componentStore.yAxis.setRange([s,s+p]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:s}),this.chartData.plots.some(A=>yt(A))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizontalSpace(){let t=this.chartConfig.width,i=this.chartConfig.height,e=0,s=0,r=0,p=Math.floor(t*this.chartConfig.plotReservedSpacePercent/100),x=Math.floor(i*this.chartConfig.plotReservedSpacePercent/100),A=this.componentStore.plot.calculateSpace({width:p,height:x});t-=A.width,i-=A.height,A=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:i}),e=A.height,i-=A.height,this.componentStore.xAxis.setAxisPosition("left"),A=this.componentStore.xAxis.calculateSpace({width:t,height:i}),t-=A.width,s=A.width,this.componentStore.yAxis.setAxisPosition("top"),A=this.componentStore.yAxis.calculateSpace({width:t,height:i}),i-=A.height,r=e+A.height,t>0&&(p+=t,t=0),i>0&&(x+=i,i=0),this.componentStore.plot.calculateSpace({width:p,height:x}),this.componentStore.plot.setBoundingBoxXY({x:s,y:r}),this.componentStore.yAxis.setRange([s,s+p]),this.componentStore.yAxis.setBoundingBoxXY({x:s,y:e}),this.componentStore.xAxis.setRange([r,r+x]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:r}),this.chartData.plots.some(L=>yt(L))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){this.chartConfig.chartOrientation==="horizontal"?this.calculateHorizontalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();let t=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(let i of Object.values(this.componentStore))t.push(...i.getDrawableElements());return t}},Si=class{static{a(this,"XYChartBuilder")}static build(t,i,e,s){return new Ci(t,i,e,s).getDrawableElement()}},K=0,Zt,Z=St(),J=Ct(),m=_t(),At=J.plotColorPalette.split(",").map(t=>t.trim()),at=!1,wt=!1;function Ct(){let t=Vt(),i=st();return pt(t.xyChart,i.themeVariables.xyChart)}a(Ct,"getChartDefaultThemeConfig");function St(){let t=st();return pt(Mt.xyChart,t.xyChart)}a(St,"getChartDefaultConfig");function _t(){return{yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]}}a(_t,"getChartDefaultData");function nt(t){let i=st();return Bt(t.trim(),i)}a(nt,"textSanitizer");function Jt(t){Zt=t}a(Jt,"setTmpSVGG");function ti(t){t==="horizontal"?Z.chartOrientation="horizontal":Z.chartOrientation="vertical"}a(ti,"setOrientation");function ii(t){m.xAxis.title=nt(t.text)}a(ii,"setXAxisTitle");function Tt(t,i){m.xAxis={type:"linear",title:m.xAxis.title,min:t,max:i},at=!0}a(Tt,"setXAxisRangeData");function ei(t){m.xAxis={type:"band",title:m.xAxis.title,categories:t.map(i=>nt(i.text))},at=!0}a(ei,"setXAxisBand");function si(t){m.yAxis.title=nt(t.text)}a(si,"setYAxisTitle");function ai(t,i){m.yAxis={type:"linear",title:m.yAxis.title,min:t,max:i},wt=!0}a(ai,"setYAxisRangeData");function ni(t){let i=Math.min(...t),e=Math.max(...t),s=j(m.yAxis)?m.yAxis.min:1/0,r=j(m.yAxis)?m.yAxis.max:-1/0;m.yAxis={type:"linear",title:m.yAxis.title,min:Math.min(s,i),max:Math.max(r,e)}}a(ni,"setYAxisRangeFromPlotData");function Rt(t){let i=[];if(t.length===0)return i;if(!at){let e=j(m.xAxis)?m.xAxis.min:1/0,s=j(m.xAxis)?m.xAxis.max:-1/0;Tt(Math.min(e,1),Math.max(s,t.length))}if(wt||ni(t),kt(m.xAxis)&&(i=m.xAxis.categories.map((e,s)=>[e,t[s]])),j(m.xAxis)){let e=m.xAxis.min,s=m.xAxis.max,r=(s-e)/(t.length-1),p=[];for(let x=e;x<=s;x+=r)p.push(`${x}`);i=p.map((x,A)=>[x,t[A]])}return i}a(Rt,"transformDataWithoutCategory");function Dt(t){return At[t===0?0:t%At.length]}a(Dt,"getPlotColorFromPalette");function ri(t,i){let e=Rt(i);m.plots.push({type:"line",strokeFill:Dt(K),strokeWidth:2,data:e}),K++}a(ri,"setLineData");function oi(t,i){let e=Rt(i);m.plots.push({type:"bar",fill:Dt(K),data:e}),K++}a(oi,"setBarData");function hi(){if(m.plots.length===0)throw Error("No Plot to render, please provide a plot with some data");return m.title=gt(),Si.build(Z,m,J,Zt)}a(hi,"getDrawableElem");function li(){return J}a(li,"getChartThemeConfig");function ci(){return Z}a(ci,"getChartConfig");function ui(){return m}a(ui,"getXYChartData");var _i=a(function(){zt(),K=0,Z=St(),m=_t(),J=Ct(),At=J.plotColorPalette.split(",").map(t=>t.trim()),at=!1,wt=!1},"clear"),Ti={getDrawableElem:hi,clear:_i,setAccTitle:Ft,getAccTitle:Ot,setDiagramTitle:Yt,getDiagramTitle:gt,getAccDescription:Nt,setAccDescription:Xt,setOrientation:ti,setXAxisTitle:ii,setXAxisRangeData:Tt,setXAxisBand:ei,setYAxisTitle:si,setYAxisRangeData:ai,setLineData:ri,setBarData:oi,setTmpSVGG:Jt,getChartThemeConfig:li,getChartConfig:ci,getXYChartData:ui},Ri=a((t,i,e,s)=>{let r=s.db,p=r.getChartThemeConfig(),x=r.getChartConfig(),A=r.getXYChartData().plots[0].data.map(f=>f[1]);function L(f){return f==="top"?"text-before-edge":"middle"}a(L,"getDominantBaseLine");function W(f){return f==="left"?"start":f==="right"?"end":"middle"}a(W,"getTextAnchor");function V(f){return`translate(${f.x}, ${f.y}) rotate(${f.rotation||0})`}a(V,"getTextTransformation"),ut.debug(`Rendering xychart chart -`+t);let T=Ht(i),E=T.append("g").attr("class","main"),z=E.append("rect").attr("width",x.width).attr("height",x.height).attr("class","background");Wt(T,x.height,x.width,!0),T.attr("viewBox",`0 0 ${x.width} ${x.height}`),z.attr("fill",p.backgroundColor),r.setTmpSVGG(T.append("g").attr("class","mermaid-tmp-group"));let F=r.getDrawableElem(),R={};function M(f){let D=E,h="";for(let[B]of f.entries()){let v=E;B>0&&R[h]&&(v=R[h]),h+=f[B],D=R[h],D||(D=R[h]=v.append("g").attr("class",f[B]))}return D}a(M,"getGroup");for(let f of F){if(f.data.length===0)continue;let D=M(f.groupTexts);switch(f.type){case"rect":if(D.selectAll("rect").data(f.data).enter().append("rect").attr("x",h=>h.x).attr("y",h=>h.y).attr("width",h=>h.width).attr("height",h=>h.height).attr("fill",h=>h.fill).attr("stroke",h=>h.strokeFill).attr("stroke-width",h=>h.strokeWidth),x.showDataLabel)if(x.chartOrientation==="horizontal"){let h=function(c,C){let{data:_,label:w}=c;return C*w.length*B<=_.width-10};var O=h;a(h,"fitsHorizontally");let B=.7,v=f.data.map((c,C)=>({data:c,label:A[C].toString()})).filter(c=>c.data.width>0&&c.data.height>0),b=v.map(c=>{let{data:C}=c,_=C.height*.7;for(;!h(c,_)&&_>0;)_-=1;return _}),H=Math.floor(Math.min(...b));D.selectAll("text").data(v).enter().append("text").attr("x",c=>c.data.x+c.data.width-10).attr("y",c=>c.data.y+c.data.height/2).attr("text-anchor","end").attr("dominant-baseline","middle").attr("fill","black").attr("font-size",`${H}px`).text(c=>c.label)}else{let h=function(c,C,_){let{data:w,label:U}=c,o=C*U.length*.7,l=w.x+w.width/2,u=l-o/2,g=l+o/2,y=u>=w.x&&g<=w.x+w.width,n=w.y+_+C<=w.y+w.height;return y&&n};var X=h;a(h,"fitsInBar");let B=10,v=f.data.map((c,C)=>({data:c,label:A[C].toString()})).filter(c=>c.data.width>0&&c.data.height>0),b=v.map(c=>{let{data:C,label:_}=c,w=C.width/(_.length*.7);for(;!h(c,w,B)&&w>0;)w-=1;return w}),H=Math.floor(Math.min(...b));D.selectAll("text").data(v).enter().append("text").attr("x",c=>c.data.x+c.data.width/2).attr("y",c=>c.data.y+B).attr("text-anchor","middle").attr("dominant-baseline","hanging").attr("fill","black").attr("font-size",`${H}px`).text(c=>c.label)}break;case"text":D.selectAll("text").data(f.data).enter().append("text").attr("x",0).attr("y",0).attr("fill",h=>h.fill).attr("font-size",h=>h.fontSize).attr("dominant-baseline",h=>L(h.verticalPos)).attr("text-anchor",h=>W(h.horizontalPos)).attr("transform",h=>V(h)).text(h=>h.text);break;case"path":D.selectAll("path").data(f.data).enter().append("path").attr("d",h=>h.path).attr("fill",h=>h.fill?h.fill:"none").attr("stroke",h=>h.strokeFill).attr("stroke-width",h=>h.strokeWidth);break}}},"draw"),Di={draw:Ri},zi={parser:pi,db:Ti,renderer:Di};export{zi as diagram}; diff --git a/src/google/adk/cli/browser/chunk-JDPVSVO4.js b/src/google/adk/cli/browser/chunk-JDPVSVO4.js deleted file mode 100644 index ecf7c3c02e..0000000000 --- a/src/google/adk/cli/browser/chunk-JDPVSVO4.js +++ /dev/null @@ -1 +0,0 @@ -import{a as b}from"./chunk-XMBKBASC.js";import{$ as B,A as W,C as I,J as E,K as F,L as y,M as P,N as G,Q as V,R as x,S as R,U as Er,W as O,aa as Q,d as g,f as vr,i as K,k as _r,m as T,p as f,s as N,t as D,v,x as wr,y as br}from"./chunk-ASJUXEUE.js";import{V as Y,e as mr,l as M}from"./chunk-EGBSMT36.js";function k(r,e,n,t){var o;do o=B(t);while(r.hasNode(o));return n.dummy=e,r.setNode(o,n),o}function yr(r){var e=new b().setGraph(r.graph());return f(r.nodes(),function(n){e.setNode(n,r.node(n))}),f(r.edges(),function(n){var t=e.edge(n.v,n.w)||{weight:0,minlen:1},o=r.edge(n);e.setEdge(n.v,n.w,{weight:t.weight+o.weight,minlen:Math.max(t.minlen,o.minlen)})}),e}function q(r){var e=new b({multigraph:r.isMultigraph()}).setGraph(r.graph());return f(r.nodes(),function(n){r.children(n).length||e.setNode(n,r.node(n))}),f(r.edges(),function(n){e.setEdge(n,r.edge(n))}),e}function Z(r,e){var n=r.x,t=r.y,o=e.x-n,a=e.y-t,i=r.width/2,s=r.height/2;if(!o&&!a)throw new Error("Not possible to find intersection inside of the rectangle");var u,d;return Math.abs(a)*i>Math.abs(o)*s?(a<0&&(s=-s),u=s*o/a,d=s):(o<0&&(i=-i),u=i,d=i*a/o),{x:n+u,y:t+d}}function L(r){var e=v(x(rr(r)+1),function(){return[]});return f(r.nodes(),function(n){var t=r.node(n),o=t.rank;E(o)||(e[o][t.order]=n)}),e}function xr(r){var e=P(v(r.nodes(),function(n){return r.node(n).rank}));f(r.nodes(),function(n){var t=r.node(n);W(t,"rank")&&(t.rank-=e)})}function kr(r){var e=P(v(r.nodes(),function(a){return r.node(a).rank})),n=[];f(r.nodes(),function(a){var i=r.node(a).rank-e;n[i]||(n[i]=[]),n[i].push(a)});var t=0,o=r.graph().nodeRankFactor;f(n,function(a,i){E(a)&&i%o!==0?--t:t&&f(a,function(s){r.node(s).rank+=t})})}function $(r,e,n,t){var o={width:0,height:0};return arguments.length>=4&&(o.rank=n,o.order=t),k(r,"border",o,e)}function rr(r){return y(v(r.nodes(),function(e){var n=r.node(e).rank;if(!E(n))return n}))}function gr(r,e){var n={lhs:[],rhs:[]};return f(r,function(t){e(t)?n.lhs.push(t):n.rhs.push(t)}),n}function Nr(r,e){var n=K();try{return e()}finally{console.log(r+" time: "+(K()-n)+"ms")}}function Or(r,e){return e()}function Pr(r){function e(n){var t=r.children(n),o=r.node(n);if(t.length&&f(t,e),Object.prototype.hasOwnProperty.call(o,"minRank")){o.borderLeft=[],o.borderRight=[];for(var a=o.minRank,i=o.maxRank+1;a0;--s)if(i=e[s].dequeue(),i){t=t.concat(tr(r,e,n,i,!0));break}}}return t}function tr(r,e,n,t,o){var a=o?[]:void 0;return f(r.inEdges(t.v),function(i){var s=r.edge(i),u=r.node(i.v);o&&a.push({v:i.v,w:i.w}),u.out-=s,or(e,n,u)}),f(r.outEdges(t.v),function(i){var s=r.edge(i),u=i.w,d=r.node(u);d.in-=s,or(e,n,d)}),r.removeNode(t.v),a}function be(r,e){var n=new b,t=0,o=0;f(r.nodes(),function(s){n.setNode(s,{v:s,in:0,out:0})}),f(r.edges(),function(s){var u=n.edge(s.v,s.w)||0,d=e(s),c=u+d;n.setEdge(s.v,s.w,c),o=Math.max(o,n.node(s.v).out+=d),t=Math.max(t,n.node(s.w).in+=d)});var a=x(o+t+3).map(function(){return new X}),i=t+1;return f(n.nodes(),function(s){or(a,i,n.node(s))}),{graph:n,buckets:a,zeroIdx:i}}function or(r,e,n){n.out?n.in?r[n.out-n.in+e].enqueue(n):r[r.length-1].enqueue(n):r[0].enqueue(n)}function Mr(r){var e=r.graph().acyclicer==="greedy"?Sr(r,n(r)):Ee(r);f(e,function(t){var o=r.edge(t);r.removeEdge(t),o.forwardName=t.name,o.reversed=!0,r.setEdge(t.w,t.v,o,B("rev"))});function n(t){return function(o){return t.edge(o).weight}}}function Ee(r){var e=[],n={},t={};function o(a){Object.prototype.hasOwnProperty.call(t,a)||(t[a]=!0,n[a]=!0,f(r.outEdges(a),function(i){Object.prototype.hasOwnProperty.call(n,i.w)?e.push(i):o(i.w)}),delete n[a])}return f(r.nodes(),o),e}function Fr(r){f(r.edges(),function(e){var n=r.edge(e);if(n.reversed){r.removeEdge(e);var t=n.forwardName;delete n.reversed,delete n.forwardName,r.setEdge(e.w,e.v,n,t)}})}function Vr(r){r.graph().dummyChains=[],f(r.edges(),function(e){ye(r,e)})}function ye(r,e){var n=e.v,t=r.node(n).rank,o=e.w,a=r.node(o).rank,i=e.name,s=r.edge(e),u=s.labelRank;if(a!==t+1){r.removeEdge(e);var d=void 0,c,h;for(h=0,++t;ti.lim&&(s=i,u=!0);var d=N(e.edges(),function(c){return u===Yr(r,r.node(c.v),s)&&u!==Yr(r,r.node(c.w),s)});return G(d,function(c){return S(e,c)})}function Xr(r,e,n,t){var o=n.v,a=n.w;r.removeEdge(o,a),r.setEdge(t.v,t.w,{}),ur(r),fr(r,e),Ce(r,e)}function Ce(r,e){var n=D(r.nodes(),function(o){return!e.node(o).parent}),t=sr(r,n);t=t.slice(1),f(t,function(o){var a=r.node(o).parent,i=e.edge(o,a),s=!1;i||(i=e.edge(a,o),s=!0),e.node(o).rank=e.node(a).rank+(s?i.minlen:-i.minlen)})}function je(r,e,n){return r.hasEdge(e,n)}function Yr(r,e,n){return n.low<=e.lim&&e.lim<=n.lim}function dr(r){switch(r.graph().ranker){case"network-simplex":Hr(r);break;case"tight-tree":Re(r);break;case"longest-path":Te(r);break;default:Hr(r)}}var Te=z;function Re(r){z(r),H(r)}function Hr(r){j(r)}function Jr(r){var e=k(r,"root",{},"_root"),n=Se(r),t=y(I(n))-1,o=2*t+1;r.graph().nestingRoot=e,f(r.edges(),function(i){r.edge(i).minlen*=o});var a=Me(r)+1;f(r.children(),function(i){Kr(r,e,o,a,t,n,i)}),r.graph().nodeRankFactor=o}function Kr(r,e,n,t,o,a,i){var s=r.children(i);if(!s.length){i!==e&&r.setEdge(e,i,{weight:0,minlen:n});return}var u=$(r,"_bt"),d=$(r,"_bb"),c=r.node(i);r.setParent(u,i),c.borderTop=u,r.setParent(d,i),c.borderBottom=d,f(s,function(h){Kr(r,e,n,t,o,a,h);var l=r.node(h),p=l.borderTop?l.borderTop:h,m=l.borderBottom?l.borderBottom:h,w=l.borderTop?t:2*t,A=p!==m?1:o-a[i]+1;r.setEdge(u,p,{weight:w,minlen:A,nestingEdge:!0}),r.setEdge(m,d,{weight:w,minlen:A,nestingEdge:!0})}),r.parent(i)||r.setEdge(e,u,{weight:0,minlen:o+a[i]})}function Se(r){var e={};function n(t,o){var a=r.children(t);a&&a.length&&f(a,function(i){n(i,o+1)}),e[t]=o}return f(r.children(),function(t){n(t,1)}),e}function Me(r){return R(r.edges(),function(e,n){return e+r.edge(n).weight},0)}function Qr(r){var e=r.graph();r.removeNode(e.nestingRoot),delete e.nestingRoot,f(r.edges(),function(n){var t=r.edge(n);t.nestingEdge&&r.removeEdge(n)})}function Zr(r,e,n){var t={},o;f(n,function(a){for(var i=r.parent(a),s,u;i;){if(s=r.parent(i),s?(u=t[s],t[s]=i):(u=o,o=i),u&&u!==i){e.setEdge(u,i);return}i=s}})}function $r(r,e,n){var t=Ge(r),o=new b({compound:!0}).setGraph({root:t}).setDefaultNodeLabel(function(a){return r.node(a)});return f(r.nodes(),function(a){var i=r.node(a),s=r.parent(a);(i.rank===e||i.minRank<=e&&e<=i.maxRank)&&(o.setNode(a),o.setParent(a,s||t),f(r[n](a),function(u){var d=u.v===a?u.w:u.v,c=o.edge(d,a),h=E(c)?0:c.weight;o.setEdge(d,a,{weight:r.edge(u).weight+h})}),Object.prototype.hasOwnProperty.call(i,"minRank")&&o.setNode(a,{borderLeft:i.borderLeft[e],borderRight:i.borderRight[e]}))}),o}function Ge(r){for(var e;r.hasNode(e=B("_root")););return e}function re(r,e){for(var n=0,t=1;t0;)c%2&&(h+=s[c+1]),c=c-1>>1,s[c]+=d.weight;u+=d.weight*h})),u}function ee(r){var e={},n=N(r.nodes(),function(s){return!r.children(s).length}),t=y(v(n,function(s){return r.node(s).rank})),o=v(x(t+1),function(){return[]});function a(s){if(!W(e,s)){e[s]=!0;var u=r.node(s);o[u.rank].push(s),f(r.successors(s),a)}}var i=O(n,function(s){return r.node(s).rank});return f(i,a),o}function ne(r,e){return v(e,function(n){var t=r.inEdges(n);if(t.length){var o=R(t,function(a,i){var s=r.edge(i),u=r.node(i.v);return{sum:a.sum+s.weight*u.order,weight:a.weight+s.weight}},{sum:0,weight:0});return{v:n,barycenter:o.sum/o.weight,weight:o.weight}}else return{v:n}})}function te(r,e){var n={};f(r,function(o,a){var i=n[o.v]={indegree:0,in:[],out:[],vs:[o.v],i:a};E(o.barycenter)||(i.barycenter=o.barycenter,i.weight=o.weight)}),f(e.edges(),function(o){var a=n[o.v],i=n[o.w];!E(a)&&!E(i)&&(i.indegree++,a.out.push(n[o.w]))});var t=N(n,function(o){return!o.indegree});return Be(t)}function Be(r){var e=[];function n(a){return function(i){i.merged||(E(i.barycenter)||E(a.barycenter)||i.barycenter>=a.barycenter)&&Ae(a,i)}}function t(a){return function(i){i.in.push(a),--i.indegree===0&&r.push(i)}}for(;r.length;){var o=r.pop();e.push(o),f(o.in.reverse(),n(o)),f(o.out,t(o))}return v(N(e,function(a){return!a.merged}),function(a){return V(a,["vs","i","barycenter","weight"])})}function Ae(r,e){var n=0,t=0;r.weight&&(n+=r.barycenter*r.weight,t+=r.weight),e.weight&&(n+=e.barycenter*e.weight,t+=e.weight),r.vs=e.vs.concat(r.vs),r.barycenter=n/t,r.weight=t,r.i=Math.min(e.i,r.i),e.merged=!0}function ae(r,e){var n=gr(r,function(c){return Object.prototype.hasOwnProperty.call(c,"barycenter")}),t=n.lhs,o=O(n.rhs,function(c){return-c.i}),a=[],i=0,s=0,u=0;t.sort(De(!!e)),u=oe(a,o,u),f(t,function(c){u+=c.vs.length,a.push(c.vs),i+=c.barycenter*c.weight,s+=c.weight,u=oe(a,o,u)});var d={vs:g(a)};return s&&(d.barycenter=i/s,d.weight=s),d}function oe(r,e,n){for(var t;e.length&&(t=T(e)).i<=n;)e.pop(),r.push(t.vs),n++;return n}function De(r){return function(e,n){return e.barycentern.barycenter?1:r?n.i-e.i:e.i-n.i}}function cr(r,e,n,t){var o=r.children(e),a=r.node(e),i=a?a.borderLeft:void 0,s=a?a.borderRight:void 0,u={};i&&(o=N(o,function(m){return m!==i&&m!==s}));var d=ne(r,o);f(d,function(m){if(r.children(m.v).length){var w=cr(r,m.v,n,t);u[m.v]=w,Object.prototype.hasOwnProperty.call(w,"barycenter")&&ze(m,w)}});var c=te(d,n);Ye(c,u);var h=ae(c,t);if(i&&(h.vs=g([i,h.vs,s]),r.predecessors(i).length)){var l=r.node(r.predecessors(i)[0]),p=r.node(r.predecessors(s)[0]);Object.prototype.hasOwnProperty.call(h,"barycenter")||(h.barycenter=0,h.weight=0),h.barycenter=(h.barycenter*h.weight+l.order+p.order)/(h.weight+2),h.weight+=2}return h}function Ye(r,e){f(r,function(n){n.vs=g(n.vs.map(function(t){return e[t]?e[t].vs:t}))})}function ze(r,e){E(r.barycenter)?(r.barycenter=e.barycenter,r.weight=e.weight):(r.barycenter=(r.barycenter*r.weight+e.barycenter*e.weight)/(r.weight+e.weight),r.weight+=e.weight)}function fe(r){var e=rr(r),n=ie(r,x(1,e+1),"inEdges"),t=ie(r,x(e-1,-1,-1),"outEdges"),o=ee(r);se(r,o);for(var a=Number.POSITIVE_INFINITY,i,s=0,u=0;u<4;++s,++u){Ue(s%2?n:t,s%4>=2),o=L(r);var d=re(r,o);di||s>e[u].lim));for(d=u,u=t;(u=r.parent(u))!==d;)a.push(u);return{path:o.concat(a.reverse()),lca:d}}function qe(r){var e={},n=0;function t(o){var a=n;f(r.children(o),t),e[o]={low:a,lim:n++}}return f(r.children(),t),e}function Xe(r,e){var n={};function t(o,a){var i=0,s=0,u=o.length,d=T(a);return f(a,function(c,h){var l=Je(r,c),p=l?r.node(l).order:u;(l||c===d)&&(f(a.slice(s,h+1),function(m){f(r.predecessors(m),function(w){var A=r.node(w),pr=A.order;(prd)&&de(n,l,c)})})}function o(a,i){var s=-1,u,d=0;return f(i,function(c,h){if(r.node(c).dummy==="border"){var l=r.predecessors(c);l.length&&(u=r.node(l[0]).order,t(i,d,h,s,u),d=h,s=u)}t(i,d,i.length,u,a.length)}),i}return R(e,o),n}function Je(r,e){if(r.node(e).dummy)return D(r.predecessors(e),function(n){return r.node(n).dummy})}function de(r,e,n){if(e>n){var t=e;e=n,n=t}Object.prototype.hasOwnProperty.call(r,e)||Object.defineProperty(r,e,{enumerable:!0,configurable:!0,value:{},writable:!0});var o=r[e];Object.defineProperty(o,n,{enumerable:!0,configurable:!0,value:!0,writable:!0})}function Ke(r,e,n){if(e>n){var t=e;e=n,n=t}return!!r[e]&&Object.prototype.hasOwnProperty.call(r[e],n)}function Qe(r,e,n,t){var o={},a={},i={};return f(e,function(s){f(s,function(u,d){o[u]=u,a[u]=u,i[u]=d})}),f(e,function(s){var u=-1;f(s,function(d){var c=t(d);if(c.length){c=O(c,function(w){return i[w]});for(var h=(c.length-1)/2,l=Math.floor(h),p=Math.ceil(h);l<=p;++l){var m=c[l];a[d]===d&&u{var t=n(" buildLayoutGraph",()=>wn(r));n(" runLayout",()=>fn(t,n)),n(" updateInputGraph",()=>un(r,t))})}function fn(r,e){e(" makeSpaceForEdgeLabels",()=>bn(r)),e(" removeSelfEdges",()=>Pn(r)),e(" acyclic",()=>Mr(r)),e(" nestingGraph.run",()=>Jr(r)),e(" rank",()=>dr(q(r))),e(" injectEdgeLabelProxies",()=>En(r)),e(" removeEmptyRanks",()=>kr(r)),e(" nestingGraph.cleanup",()=>Qr(r)),e(" normalizeRanks",()=>xr(r)),e(" assignRankMinMax",()=>yn(r)),e(" removeEdgeLabelProxies",()=>xn(r)),e(" normalize.run",()=>Vr(r)),e(" parentDummyChains",()=>ue(r)),e(" addBorderSegments",()=>Pr(r)),e(" order",()=>fe(r)),e(" insertSelfEdges",()=>Ln(r)),e(" adjustCoordinateSystem",()=>Cr(r)),e(" position",()=>he(r)),e(" positionSelfEdges",()=>Cn(r)),e(" removeBorderNodes",()=>In(r)),e(" normalize.undo",()=>Br(r)),e(" fixupEdgeLabelCoords",()=>Nn(r)),e(" undoCoordinateSystem",()=>jr(r)),e(" translateGraph",()=>kn(r)),e(" assignNodeIntersects",()=>gn(r)),e(" reversePoints",()=>On(r)),e(" acyclic.undo",()=>Fr(r))}function un(r,e){f(r.nodes(),function(n){var t=r.node(n),o=e.node(n);t&&(t.x=o.x,t.y=o.y,e.children(n).length&&(t.width=o.width,t.height=o.height))}),f(r.edges(),function(n){var t=r.edge(n),o=e.edge(n);t.points=o.points,Object.prototype.hasOwnProperty.call(o,"x")&&(t.x=o.x,t.y=o.y)}),r.graph().width=e.graph().width,r.graph().height=e.graph().height}var dn=["nodesep","edgesep","ranksep","marginx","marginy"],cn={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},hn=["acyclicer","ranker","rankdir","align"],ln=["width","height"],pn={width:0,height:0},mn=["minlen","weight","width","height","labeloffset"],vn={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},_n=["labelpos"];function wn(r){var e=new b({multigraph:!0,compound:!0}),n=lr(r.graph());return e.setGraph(Y({},cn,hr(n,dn),V(n,hn))),f(r.nodes(),function(t){var o=lr(r.node(t));e.setNode(t,_r(hr(o,ln),pn)),e.setParent(t,r.parent(t))}),f(r.edges(),function(t){var o=lr(r.edge(t));e.setEdge(t,Y({},vn,hr(o,mn),V(o,_n)))}),e}function bn(r){var e=r.graph();e.ranksep/=2,f(r.edges(),function(n){var t=r.edge(n);t.minlen*=2,t.labelpos.toLowerCase()!=="c"&&(e.rankdir==="TB"||e.rankdir==="BT"?t.width+=t.labeloffset:t.height+=t.labeloffset)})}function En(r){f(r.edges(),function(e){var n=r.edge(e);if(n.width&&n.height){var t=r.node(e.v),o=r.node(e.w),a={rank:(o.rank-t.rank)/2+t.rank,e};k(r,"edge-proxy",a,"_ep")}})}function yn(r){var e=0;f(r.nodes(),function(n){var t=r.node(n);t.borderTop&&(t.minRank=r.node(t.borderTop).rank,t.maxRank=r.node(t.borderBottom).rank,e=y(e,t.maxRank))}),r.graph().maxRank=e}function xn(r){f(r.nodes(),function(e){var n=r.node(e);n.dummy==="edge-proxy"&&(r.edge(n.e).labelRank=n.rank,r.removeNode(e))})}function kn(r){var e=Number.POSITIVE_INFINITY,n=0,t=Number.POSITIVE_INFINITY,o=0,a=r.graph(),i=a.marginx||0,s=a.marginy||0;function u(d){var c=d.x,h=d.y,l=d.width,p=d.height;e=Math.min(e,c-l/2),n=Math.max(n,c+l/2),t=Math.min(t,h-p/2),o=Math.max(o,h+p/2)}f(r.nodes(),function(d){u(r.node(d))}),f(r.edges(),function(d){var c=r.edge(d);Object.prototype.hasOwnProperty.call(c,"x")&&u(c)}),e-=i,t-=s,f(r.nodes(),function(d){var c=r.node(d);c.x-=e,c.y-=t}),f(r.edges(),function(d){var c=r.edge(d);f(c.points,function(h){h.x-=e,h.y-=t}),Object.prototype.hasOwnProperty.call(c,"x")&&(c.x-=e),Object.prototype.hasOwnProperty.call(c,"y")&&(c.y-=t)}),a.width=n-e+i,a.height=o-t+s}function gn(r){f(r.edges(),function(e){var n=r.edge(e),t=r.node(e.v),o=r.node(e.w),a,i;n.points?(a=n.points[0],i=n.points[n.points.length-1]):(n.points=[],a=o,i=t),n.points.unshift(Z(t,a)),n.points.push(Z(o,i))})}function Nn(r){f(r.edges(),function(e){var n=r.edge(e);if(Object.prototype.hasOwnProperty.call(n,"x"))switch((n.labelpos==="l"||n.labelpos==="r")&&(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset;break}})}function On(r){f(r.edges(),function(e){var n=r.edge(e);n.reversed&&n.points.reverse()})}function In(r){f(r.nodes(),function(e){if(r.children(e).length){var n=r.node(e),t=r.node(n.borderTop),o=r.node(n.borderBottom),a=r.node(T(n.borderLeft)),i=r.node(T(n.borderRight));n.width=Math.abs(i.x-a.x),n.height=Math.abs(o.y-t.y),n.x=a.x+n.width/2,n.y=t.y+n.height/2}}),f(r.nodes(),function(e){r.node(e).dummy==="border"&&r.removeNode(e)})}function Pn(r){f(r.edges(),function(e){if(e.v===e.w){var n=r.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e,label:r.edge(e)}),r.removeEdge(e)}})}function Ln(r){var e=L(r);f(e,function(n){var t=0;f(n,function(o,a){var i=r.node(o);i.order=a+t,f(i.selfEdges,function(s){k(r,"selfedge",{width:s.label.width,height:s.label.height,rank:i.rank,order:a+ ++t,e:s.e,label:s.label},"_se")}),delete i.selfEdges})})}function Cn(r){f(r.nodes(),function(e){var n=r.node(e);if(n.dummy==="selfedge"){var t=r.node(n.e.v),o=t.x+t.width/2,a=t.y,i=n.x-o,s=t.height/2;r.setEdge(n.e,n.label),r.removeNode(e),n.label.points=[{x:o+2*i/3,y:a-s},{x:o+5*i/6,y:a-s},{x:o+i,y:a},{x:o+5*i/6,y:a+s},{x:o+2*i/3,y:a+s}],n.label.x=n.x,n.label.y=n.y}})}function hr(r,e){return F(V(r,e),Number)}function lr(r){var e={};return f(r,function(n,t){e[t.toLowerCase()]=n}),e}export{sn as a}; diff --git a/src/google/adk/cli/browser/chunk-JHZIBEJC.js b/src/google/adk/cli/browser/chunk-JHZIBEJC.js deleted file mode 100644 index eb52947847..0000000000 --- a/src/google/adk/cli/browser/chunk-JHZIBEJC.js +++ /dev/null @@ -1 +0,0 @@ -import{g as y}from"./chunk-JRNAXTJ7.js";var A=y((t,r)=>{if(r)return"translate("+-t.width/2+", "+-t.height/2+")";let s=t.x??0,e=t.y??0;return"translate("+-(s+t.width/2)+", "+-(e+t.height/2)+")"},"computeLabelTransform"),c={aggregation:17.25,extension:17.25,composition:17.25,dependency:6,lollipop:13.5,arrow_point:4},M={arrow_point:9,arrow_cross:12.5,arrow_circle:12.5};function w(t,r){if(t===void 0||r===void 0)return{angle:0,deltaX:0,deltaY:0};t=n(t),r=n(r);let[s,e]=[t.x,t.y],[a,i]=[r.x,r.y],o=a-s,x=i-e;return{angle:Math.atan(x/o),deltaX:o,deltaY:x}}y(w,"calculateDeltaAndAngle");var n=y(t=>Array.isArray(t)?{x:t[0],y:t[1]}:t,"pointTransformer"),m=y(t=>({x:y(function(r,s,e){let a=0,i=n(e[0]).x=0?1:-1)}else if(s===e.length-1&&Object.hasOwn(c,t.arrowTypeEnd)){let{angle:l,deltaX:g}=w(e[e.length-1],e[e.length-2]);a=c[t.arrowTypeEnd]*Math.cos(l)*(g>=0?1:-1)}let o=Math.abs(n(r).x-n(e[e.length-1]).x),x=Math.abs(n(r).y-n(e[e.length-1]).y),f=Math.abs(n(r).x-n(e[0]).x),d=Math.abs(n(r).y-n(e[0]).y),h=c[t.arrowTypeStart],u=c[t.arrowTypeEnd],p=1;if(o0&&x0&&d=0?1:-1)}else if(s===e.length-1&&Object.hasOwn(c,t.arrowTypeEnd)){let{angle:l,deltaY:g}=w(e[e.length-1],e[e.length-2]);a=c[t.arrowTypeEnd]*Math.abs(Math.sin(l))*(g>=0?1:-1)}let o=Math.abs(n(r).y-n(e[e.length-1]).y),x=Math.abs(n(r).x-n(e[e.length-1]).x),f=Math.abs(n(r).y-n(e[0]).y),d=Math.abs(n(r).x-n(e[0]).x),h=c[t.arrowTypeStart],u=c[t.arrowTypeEnd],p=1;if(o0&&x0&&dnew v,"TokenBuilder"),ValueConverter:e(()=>new l,"ValueConverter")}};function M(c=n){let r=a(d(c),i),t=a(o({shared:r}),u,R);return r.ServiceRegistry.register(t),{shared:r,Radar:t}}e(M,"createRadarServices");export{R as a,M as b}; diff --git a/src/google/adk/cli/browser/chunk-JRNAXTJ7.js b/src/google/adk/cli/browser/chunk-JRNAXTJ7.js deleted file mode 100644 index 876bde5cc7..0000000000 --- a/src/google/adk/cli/browser/chunk-JRNAXTJ7.js +++ /dev/null @@ -1 +0,0 @@ -import{e as gu,h as _u}from"./chunk-RMXJBC7V.js";var Xo=gu((Rr,Pr)=>{"use strict";(function(t,e){typeof Rr=="object"&&typeof Pr<"u"?Pr.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs=e()})(Rr,function(){"use strict";var t=1e3,e=6e4,n=36e5,r="millisecond",i="second",o="minute",a="hour",s="day",f="week",u="month",c="quarter",p="year",l="date",m="Invalid Date",T=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,S=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,A={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(b){var _=["th","st","nd","rd"],h=b%100;return"["+b+(_[(h-20)%10]||_[h]||_[0])+"]"}},w=function(b,_,h){var g=String(b);return!g||g.length>=_?b:""+Array(_+1-g.length).join(h)+b},R={s:w,z:function(b){var _=-b.utcOffset(),h=Math.abs(_),g=Math.floor(h/60),d=h%60;return(_<=0?"+":"-")+w(g,2,"0")+":"+w(d,2,"0")},m:function b(_,h){if(_.date()1)return b(M[0])}else{var N=_.name;x[N]=_,d=N}return!g&&d&&(E=d),d||!g&&E},P=function(b,_){if(y(b))return b.clone();var h=typeof _=="object"?_:{};return h.date=b,h.args=arguments,new B(h)},I=R;I.l=O,I.i=y,I.w=function(b,_){return P(b,{locale:_.$L,utc:_.$u,x:_.$x,$offset:_.$offset})};var B=(function(){function b(h){this.$L=O(h.locale,null,!0),this.parse(h),this.$x=this.$x||h.x||{},this[$]=!0}var _=b.prototype;return _.parse=function(h){this.$d=(function(g){var d=g.date,v=g.utc;if(d===null)return new Date(NaN);if(I.u(d))return new Date;if(d instanceof Date)return new Date(d);if(typeof d=="string"&&!/Z$/i.test(d)){var M=d.match(T);if(M){var N=M[2]-1||0,D=(M[7]||"0").substring(0,3);return v?new Date(Date.UTC(M[1],N,M[3]||1,M[4]||0,M[5]||0,M[6]||0,D)):new Date(M[1],N,M[3]||1,M[4]||0,M[5]||0,M[6]||0,D)}}return new Date(d)})(h),this.init()},_.init=function(){var h=this.$d;this.$y=h.getFullYear(),this.$M=h.getMonth(),this.$D=h.getDate(),this.$W=h.getDay(),this.$H=h.getHours(),this.$m=h.getMinutes(),this.$s=h.getSeconds(),this.$ms=h.getMilliseconds()},_.$utils=function(){return I},_.isValid=function(){return this.$d.toString()!==m},_.isSame=function(h,g){var d=P(h);return this.startOf(g)<=d&&d<=this.endOf(g)},_.isAfter=function(h,g){return P(h)=E&&(E=R+1);!($=A[E])&&++E=0;)(a=r[i])&&(o&&a.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(a,o),o=a);return this}function Ii(t){t||(t=Eu);function e(p,l){return p&&l?t(p.__data__,l.__data__):!p-!l}for(var n=this._groups,r=n.length,i=new Array(r),o=0;oe?1:t>=e?0:NaN}function Ri(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function Pi(){return Array.from(this)}function Yi(){for(var t=this._groups,e=0,n=t.length;e=0&&(e=t.slice(0,n))!=="xmlns"&&(t=t.slice(n+1)),gr.hasOwnProperty(e)?{space:gr[e],local:t}:t}function Ou(t){return function(){this.removeAttribute(t)}}function Iu(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Ru(t,e){return function(){this.setAttribute(t,e)}}function Pu(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function Yu(t,e){return function(){var n=e.apply(this,arguments);n==null?this.removeAttribute(t):this.setAttribute(t,n)}}function Fu(t,e){return function(){var n=e.apply(this,arguments);n==null?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function Li(t,e){var n=Ct(t);if(arguments.length<2){var r=this.node();return n.local?r.getAttributeNS(n.space,n.local):r.getAttribute(n)}return this.each((e==null?n.local?Iu:Ou:typeof e=="function"?n.local?Fu:Yu:n.local?Pu:Ru)(n,e))}function wn(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function Uu(t){return function(){this.style.removeProperty(t)}}function zu(t,e,n){return function(){this.style.setProperty(t,e,n)}}function Lu(t,e,n){return function(){var r=e.apply(this,arguments);r==null?this.style.removeProperty(t):this.style.setProperty(t,r,n)}}function Bi(t,e,n){return arguments.length>1?this.each((e==null?Uu:typeof e=="function"?Lu:zu)(t,e,n??"")):Rt(this.node(),t)}function Rt(t,e){return t.style.getPropertyValue(e)||wn(t).getComputedStyle(t,null).getPropertyValue(e)}function Bu(t){return function(){delete this[t]}}function Hu(t,e){return function(){this[t]=e}}function qu(t,e){return function(){var n=e.apply(this,arguments);n==null?delete this[t]:this[t]=n}}function Hi(t,e){return arguments.length>1?this.each((e==null?Bu:typeof e=="function"?qu:Hu)(t,e)):this.node()[t]}function qi(t){return t.trim().split(/^|\s+/)}function _r(t){return t.classList||new Wi(t)}function Wi(t){this._node=t,this._names=qi(t.getAttribute("class")||"")}Wi.prototype={add:function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function Vi(t,e){for(var n=_r(t),r=-1,i=e.length;++r=0&&(n=e.slice(r+1),e=e.slice(0,r)),{type:e,name:n}})}function cf(t){return function(){var e=this.__on;if(e){for(var n=0,r=-1,i=e.length,o;n>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?Mn(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?Mn(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=gf.exec(t))?new rt(e[1],e[2],e[3],1):(e=_f.exec(t))?new rt(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=yf.exec(t))?Mn(e[1],e[2],e[3],e[4]):(e=vf.exec(t))?Mn(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=wf.exec(t))?go(e[1],e[2]/100,e[3]/100,1):(e=bf.exec(t))?go(e[1],e[2]/100,e[3]/100,e[4]):lo.hasOwnProperty(t)?po(lo[t]):t==="transparent"?new rt(NaN,NaN,NaN,0):null}function po(t){return new rt(t>>16&255,t>>8&255,t&255,1)}function Mn(t,e,n,r){return r<=0&&(t=e=n=NaN),new rt(t,e,n,r)}function wr(t){return t instanceof Pt||(t=_t(t)),t?(t=t.rgb(),new rt(t.r,t.g,t.b,t.opacity)):new rt}function xe(t,e,n,r){return arguments.length===1?wr(t):new rt(t,e,n,r??1)}function rt(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}Gt(rt,xe,me(Pt,{brighter(t){return t=t==null?kn:Math.pow(kn,t),new rt(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?ze:Math.pow(ze,t),new rt(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new rt(Qt(this.r),Qt(this.g),Qt(this.b),Sn(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:mo,formatHex:mo,formatHex8:kf,formatRgb:xo,toString:xo}));function mo(){return`#${Zt(this.r)}${Zt(this.g)}${Zt(this.b)}`}function kf(){return`#${Zt(this.r)}${Zt(this.g)}${Zt(this.b)}${Zt((isNaN(this.opacity)?1:this.opacity)*255)}`}function xo(){let t=Sn(this.opacity);return`${t===1?"rgb(":"rgba("}${Qt(this.r)}, ${Qt(this.g)}, ${Qt(this.b)}${t===1?")":`, ${t})`}`}function Sn(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Qt(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Zt(t){return t=Qt(t),(t<16?"0":"")+t.toString(16)}function go(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new gt(t,e,n,r)}function yo(t){if(t instanceof gt)return new gt(t.h,t.s,t.l,t.opacity);if(t instanceof Pt||(t=_t(t)),!t)return new gt;if(t instanceof gt)return t;t=t.rgb();var e=t.r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),o=Math.max(e,n,r),a=NaN,s=o-i,f=(o+i)/2;return s?(e===o?a=(n-r)/s+(n0&&f<1?0:a,new gt(a,s,f,t.opacity)}function vo(t,e,n,r){return arguments.length===1?yo(t):new gt(t,e,n,r??1)}function gt(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}Gt(gt,vo,me(Pt,{brighter(t){return t=t==null?kn:Math.pow(kn,t),new gt(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?ze:Math.pow(ze,t),new gt(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new rt(vr(t>=240?t-240:t+120,i,r),vr(t,i,r),vr(t<120?t+240:t-120,i,r),this.opacity)},clamp(){return new gt(_o(this.h),Tn(this.s),Tn(this.l),Sn(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=Sn(this.opacity);return`${t===1?"hsl(":"hsla("}${_o(this.h)}, ${Tn(this.s)*100}%, ${Tn(this.l)*100}%${t===1?")":`, ${t})`}`}}));function _o(t){return t=(t||0)%360,t<0?t+360:t}function Tn(t){return Math.max(0,Math.min(1,t||0))}function vr(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}var wo=Math.PI/180,bo=180/Math.PI;var Cn=18,Mo=.96422,To=1,ko=.82521,So=4/29,ge=6/29,Co=3*ge*ge,Sf=ge*ge*ge;function No(t){if(t instanceof Mt)return new Mt(t.l,t.a,t.b,t.opacity);if(t instanceof Dt)return Do(t);t instanceof rt||(t=wr(t));var e=kr(t.r),n=kr(t.g),r=kr(t.b),i=br((.2225045*e+.7168786*n+.0606169*r)/To),o,a;return e===n&&n===r?o=a=i:(o=br((.4360747*e+.3850649*n+.1430804*r)/Mo),a=br((.0139322*e+.0971045*n+.7141733*r)/ko)),new Mt(116*i-16,500*(o-i),200*(i-a),t.opacity)}function Sr(t,e,n,r){return arguments.length===1?No(t):new Mt(t,e,n,r??1)}function Mt(t,e,n,r){this.l=+t,this.a=+e,this.b=+n,this.opacity=+r}Gt(Mt,Sr,me(Pt,{brighter(t){return new Mt(this.l+Cn*(t??1),this.a,this.b,this.opacity)},darker(t){return new Mt(this.l-Cn*(t??1),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;return e=Mo*Mr(e),t=To*Mr(t),n=ko*Mr(n),new rt(Tr(3.1338561*e-1.6168667*t-.4906146*n),Tr(-.9787684*e+1.9161415*t+.033454*n),Tr(.0719453*e-.2289914*t+1.4052427*n),this.opacity)}}));function br(t){return t>Sf?Math.pow(t,1/3):t/Co+So}function Mr(t){return t>ge?t*t*t:Co*(t-So)}function Tr(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function kr(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Cf(t){if(t instanceof Dt)return new Dt(t.h,t.c,t.l,t.opacity);if(t instanceof Mt||(t=No(t)),t.a===0&&t.b===0)return new Dt(NaN,0()=>t;function Ao(t,e){return function(n){return t+n*e}}function Nf(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}function $o(t,e){var n=e-t;return n?Ao(t,n>180||n<-180?n-360*Math.round(n/360):n):_e(isNaN(t)?e:t)}function Eo(t){return(t=+t)==1?At:function(e,n){return n-e?Nf(e,n,t):_e(isNaN(e)?n:e)}}function At(t,e){var n=e-t;return n?Ao(t,n):_e(isNaN(t)?e:t)}function Oo(t){return function(e,n){var r=t((e=Be(e)).h,(n=Be(n)).h),i=At(e.c,n.c),o=At(e.l,n.l),a=At(e.opacity,n.opacity);return function(s){return e.h=r(s),e.c=i(s),e.l=o(s),e.opacity=a(s),e+""}}}var Df=Oo($o),Af=Oo(At);function Cr(t,e,n,r,i){var o=t*t,a=o*t;return((1-3*t+3*o-a)*e+(4-6*o+3*a)*n+(1+3*t+3*o-3*a)*r+a*i)/6}function Io(t){var e=t.length-1;return function(n){var r=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),i=t[r],o=t[r+1],a=r>0?t[r-1]:2*i-o,s=rn&&(o=e.slice(n,o),s[a]?s[a]+=o:s[++a]=o),(r=r[0])===(i=i[0])?s[a]?s[a]+=i:s[++a]=i:(s[++a]=null,f.push({i:a,x:it(r,i)})),n=Nr.lastIndex;return n180?c+=360:c-u>180&&(u+=360),l.push({i:p.push(i(p)+"rotate(",null,r)-2,x:it(u,c)})):c&&p.push(i(p)+"rotate("+c+r)}function s(u,c,p,l){u!==c?l.push({i:p.push(i(p)+"skewX(",null,r)-2,x:it(u,c)}):c&&p.push(i(p)+"skewX("+c+r)}function f(u,c,p,l,m,T){if(u!==p||c!==l){var S=m.push(i(m)+"scale(",null,",",null,")");T.push({i:S-4,x:it(u,p)},{i:S-2,x:it(c,l)})}else(p!==1||l!==1)&&m.push(i(m)+"scale("+p+","+l+")")}return function(u,c){var p=[],l=[];return u=t(u),c=t(c),o(u.translateX,u.translateY,c.translateX,c.translateY,p,l),a(u.rotate,c.rotate,p,l),s(u.skewX,c.skewX,p,l),f(u.scaleX,u.scaleY,c.scaleX,c.scaleY,p,l),u=c=null,function(m){for(var T=-1,S=l.length,A;++TGo(t,"name",{value:e,configurable:!0}),H0=(t,e)=>{for(var n in e)Go(t,n,{get:e[n],enumerable:!0})},$t={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},mt={trace:Yt((...t)=>{},"trace"),debug:Yt((...t)=>{},"debug"),info:Yt((...t)=>{},"info"),warn:Yt((...t)=>{},"warn"),error:Yt((...t)=>{},"error"),fatal:Yt((...t)=>{},"fatal")},q0=Yt(function(t="fatal"){let e=$t.fatal;typeof t=="string"?t.toLowerCase()in $t&&(e=$t[t]):typeof t=="number"&&(e=t),mt.trace=()=>{},mt.debug=()=>{},mt.info=()=>{},mt.warn=()=>{},mt.error=()=>{},mt.fatal=()=>{},e<=$t.fatal&&(mt.fatal=console.error?console.error.bind(console,dt("FATAL"),"color: orange"):console.log.bind(console,"\x1B[35m",dt("FATAL"))),e<=$t.error&&(mt.error=console.error?console.error.bind(console,dt("ERROR"),"color: orange"):console.log.bind(console,"\x1B[31m",dt("ERROR"))),e<=$t.warn&&(mt.warn=console.warn?console.warn.bind(console,dt("WARN"),"color: orange"):console.log.bind(console,"\x1B[33m",dt("WARN"))),e<=$t.info&&(mt.info=console.info?console.info.bind(console,dt("INFO"),"color: lightblue"):console.log.bind(console,"\x1B[34m",dt("INFO"))),e<=$t.debug&&(mt.debug=console.debug?console.debug.bind(console,dt("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",dt("DEBUG"))),e<=$t.trace&&(mt.trace=console.debug?console.debug.bind(console,dt("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",dt("TRACE")))},"setLogLevel"),dt=Yt(t=>`%c${(0,Zo.default)().format("ss.SSS")} : ${t} : `,"format");function Qo(t,e){let n;if(e===void 0)for(let r of t)r!=null&&(n=r)&&(n=r);else{let r=-1;for(let i of t)(i=e(i,++r,t))!=null&&(n=i)&&(n=i)}return n}function Ko(t,e){let n;if(e===void 0)for(let r of t)r!=null&&(n>r||n===void 0&&r>=r)&&(n=r);else{let r=-1;for(let i of t)(i=e(i,++r,t))!=null&&(n>i||n===void 0&&i>=i)&&(n=i)}return n}function jt(t,e){return t==null||e==null?NaN:te?1:t>=e?0:NaN}function Yr(t,e){return t==null||e==null?NaN:et?1:e>=t?0:NaN}function te(t){let e,n,r;t.length!==2?(e=jt,n=(s,f)=>jt(t(s),f),r=(s,f)=>t(s)-f):(e=t===jt||t===Yr?t:Ff,n=t,r=t);function i(s,f,u=0,c=s.length){if(u>>1;n(s[p],f)<0?u=p+1:c=p}while(u>>1;n(s[p],f)<=0?u=p+1:c=p}while(uu&&r(s[p-1],f)>-r(s[p],f)?p-1:p}return{left:i,center:a,right:o}}function Ff(){return 0}function Fr(t){return t===null?NaN:+t}var Jo=te(jt),jo=Jo.right,Uf=Jo.left,zf=te(Fr).center,Ur=jo;var ye=class extends Map{constructor(e,n=Hf){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:n}}),e!=null)for(let[r,i]of e)this.set(r,i)}get(e){return super.get(ta(this,e))}has(e){return super.has(ta(this,e))}set(e,n){return super.set(Lf(this,e),n)}delete(e){return super.delete(Bf(this,e))}};function ta({_intern:t,_key:e},n){let r=e(n);return t.has(r)?t.get(r):n}function Lf({_intern:t,_key:e},n){let r=e(n);return t.has(r)?t.get(r):(t.set(r,n),n)}function Bf({_intern:t,_key:e},n){let r=e(n);return t.has(r)&&(n=t.get(r),t.delete(r)),n}function Hf(t){return t!==null&&typeof t=="object"?t.valueOf():t}var qf=Math.sqrt(50),Wf=Math.sqrt(10),Vf=Math.sqrt(2);function An(t,e,n){let r=(e-t)/Math.max(0,n),i=Math.floor(Math.log10(r)),o=r/Math.pow(10,i),a=o>=qf?10:o>=Wf?5:o>=Vf?2:1,s,f,u;return i<0?(u=Math.pow(10,-i)/a,s=Math.round(t*u),f=Math.round(e*u),s/ue&&--f,u=-u):(u=Math.pow(10,i)*a,s=Math.round(t/u),f=Math.round(e/u),s*ue&&--f),f0))return[];if(t===e)return[t];let r=e=i))return[];let s=o-i+1,f=new Array(s);if(r)if(a<0)for(let u=0;u+t(e)}function Qf(t,e){return e=Math.max(0,t.bandwidth()-e*2)/2,t.round()&&(e=Math.round(e)),n=>+t(n)+e}function Kf(){return!this.__axis}function ra(t,e){var n=[],r=null,i=null,o=6,a=6,s=3,f=typeof window<"u"&&window.devicePixelRatio>1?0:.5,u=t===In||t===On?-1:1,c=t===On||t===zr?"x":"y",p=t===In||t===Lr?Xf:Gf;function l(m){var T=r??(e.ticks?e.ticks.apply(e,n):e.domain()),S=i??(e.tickFormat?e.tickFormat.apply(e,n):ea),A=Math.max(o,0)+s,w=e.range(),R=+w[0]+f,E=+w[w.length-1]+f,x=(e.bandwidth?Qf:Zf)(e.copy(),f),$=m.selection?m.selection():m,y=$.selectAll(".domain").data([null]),O=$.selectAll(".tick").data(T,e).order(),P=O.exit(),I=O.enter().append("g").attr("class","tick"),B=O.select("line"),L=O.select("text");y=y.merge(y.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),O=O.merge(I),B=B.merge(I.append("line").attr("stroke","currentColor").attr(c+"2",u*o)),L=L.merge(I.append("text").attr("fill","currentColor").attr(c,u*A).attr("dy",t===In?"0em":t===Lr?"0.71em":"0.32em")),m!==$&&(y=y.transition(m),O=O.transition(m),B=B.transition(m),L=L.transition(m),P=P.transition(m).attr("opacity",na).attr("transform",function(b){return isFinite(b=x(b))?p(b+f):this.getAttribute("transform")}),I.attr("opacity",na).attr("transform",function(b){var _=this.parentNode.__axis;return p((_&&isFinite(_=_(b))?_:x(b))+f)})),P.remove(),y.attr("d",t===On||t===zr?a?"M"+u*a+","+R+"H"+f+"V"+E+"H"+u*a:"M"+f+","+R+"V"+E:a?"M"+R+","+u*a+"V"+f+"H"+E+"V"+u*a:"M"+R+","+f+"H"+E),O.attr("opacity",1).attr("transform",function(b){return p(x(b)+f)}),B.attr(c+"2",u*o),L.attr(c,u*A).text(S),$.filter(Kf).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===zr?"start":t===On?"end":"middle"),$.each(function(){this.__axis=x})}return l.scale=function(m){return arguments.length?(e=m,l):e},l.ticks=function(){return n=Array.from(arguments),l},l.tickArguments=function(m){return arguments.length?(n=m==null?[]:Array.from(m),l):n.slice()},l.tickValues=function(m){return arguments.length?(r=m==null?null:Array.from(m),l):r&&r.slice()},l.tickFormat=function(m){return arguments.length?(i=m,l):i},l.tickSize=function(m){return arguments.length?(o=a=+m,l):o},l.tickSizeInner=function(m){return arguments.length?(o=+m,l):o},l.tickSizeOuter=function(m){return arguments.length?(a=+m,l):a},l.tickPadding=function(m){return arguments.length?(s=+m,l):s},l.offset=function(m){return arguments.length?(f=+m,l):f},l}function Jf(t){return ra(In,t)}function jf(t){return ra(Lr,t)}function ia(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}function ee(t,e){if(!isFinite(t)||t===0)return null;var n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"),r=t.slice(0,n);return[r.length>1?r[0]+r.slice(2):r,+t.slice(n+1)]}function Tt(t){return t=ee(Math.abs(t)),t?t[1]:NaN}function oa(t,e){return function(n,r){for(var i=n.length,o=[],a=0,s=t[0],f=0;i>0&&s>0&&(f+s+1>r&&(s=Math.max(1,r-f)),o.push(n.substring(i-=s,i+s)),!((f+=s+1)>r));)s=t[a=(a+1)%t.length];return o.reverse().join(e)}}function aa(t){return function(e){return e.replace(/[0-9]/g,function(n){return t[+n]})}}var tl=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Ft(t){if(!(e=tl.exec(t)))throw new Error("invalid format: "+t);var e;return new Rn({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}Ft.prototype=Rn.prototype;function Rn(t){this.fill=t.fill===void 0?" ":t.fill+"",this.align=t.align===void 0?">":t.align+"",this.sign=t.sign===void 0?"-":t.sign+"",this.symbol=t.symbol===void 0?"":t.symbol+"",this.zero=!!t.zero,this.width=t.width===void 0?void 0:+t.width,this.comma=!!t.comma,this.precision=t.precision===void 0?void 0:+t.precision,this.trim=!!t.trim,this.type=t.type===void 0?"":t.type+""}Rn.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function sa(t){t:for(var e=t.length,n=1,r=-1,i;n0&&(r=0);break}return r>0?t.slice(0,r)+t.slice(i+1):t}var We;function ua(t,e){var n=ee(t,e);if(!n)return We=void 0,t.toPrecision(e);var r=n[0],i=n[1],o=i-(We=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,a=r.length;return o===a?r:o>a?r+new Array(o-a+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+ee(t,Math.max(0,e+o-1))[0]}function Br(t,e){var n=ee(t,e);if(!n)return t+"";var r=n[0],i=n[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}var Hr={"%":(t,e)=>(t*100).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:ia,e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>Br(t*100,e),r:Br,s:ua,X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function qr(t){return t}var fa=Array.prototype.map,la=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];function ca(t){var e=t.grouping===void 0||t.thousands===void 0?qr:oa(fa.call(t.grouping,Number),t.thousands+""),n=t.currency===void 0?"":t.currency[0]+"",r=t.currency===void 0?"":t.currency[1]+"",i=t.decimal===void 0?".":t.decimal+"",o=t.numerals===void 0?qr:aa(fa.call(t.numerals,String)),a=t.percent===void 0?"%":t.percent+"",s=t.minus===void 0?"\u2212":t.minus+"",f=t.nan===void 0?"NaN":t.nan+"";function u(p,l){p=Ft(p);var m=p.fill,T=p.align,S=p.sign,A=p.symbol,w=p.zero,R=p.width,E=p.comma,x=p.precision,$=p.trim,y=p.type;y==="n"?(E=!0,y="g"):Hr[y]||(x===void 0&&(x=12),$=!0,y="g"),(w||m==="0"&&T==="=")&&(w=!0,m="0",T="=");var O=(l&&l.prefix!==void 0?l.prefix:"")+(A==="$"?n:A==="#"&&/[boxX]/.test(y)?"0"+y.toLowerCase():""),P=(A==="$"?r:/[%p]/.test(y)?a:"")+(l&&l.suffix!==void 0?l.suffix:""),I=Hr[y],B=/[defgprs%]/.test(y);x=x===void 0?6:/[gprs]/.test(y)?Math.max(1,Math.min(21,x)):Math.max(0,Math.min(20,x));function L(b){var _=O,h=P,g,d,v;if(y==="c")h=I(b)+h,b="";else{b=+b;var M=b<0||1/b<0;if(b=isNaN(b)?f:I(Math.abs(b),x),$&&(b=sa(b)),M&&+b==0&&S!=="+"&&(M=!1),_=(M?S==="("?S:s:S==="-"||S==="("?"":S)+_,h=(y==="s"&&!isNaN(b)&&We!==void 0?la[8+We/3]:"")+h+(M&&S==="("?")":""),B){for(g=-1,d=b.length;++gv||v>57){h=(v===46?i+b.slice(g+1):b.slice(g))+h,b=b.slice(0,g);break}}}E&&!w&&(b=e(b,1/0));var N=_.length+b.length+h.length,D=N>1)+_+b+h+D.slice(N);break;default:b=D+_+b+h;break}return o(b)}return L.toString=function(){return p+""},L}function c(p,l){var m=Math.max(-8,Math.min(8,Math.floor(Tt(l)/3)))*3,T=Math.pow(10,-m),S=u((p=Ft(p),p.type="f",p),{suffix:la[8+m/3]});return function(A){return S(T*A)}}return{format:u,formatPrefix:c}}var Pn,Yn,Fn;Wr({thousands:",",grouping:[3],currency:["$",""]});function Wr(t){return Pn=ca(t),Yn=Pn.format,Fn=Pn.formatPrefix,Pn}function Vr(t){return Math.max(0,-Tt(Math.abs(t)))}function Xr(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(Tt(e)/3)))*3-Tt(Math.abs(t)))}function Gr(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,Tt(e)-Tt(t))+1}function el(t){var e=0,n=t.children,r=n&&n.length;if(!r)e=1;else for(;--r>=0;)e+=n[r].value;t.value=e}function ha(){return this.eachAfter(el)}function pa(t,e){let n=-1;for(let r of this)t.call(e,r,++n,this);return this}function ma(t,e){for(var n=this,r=[n],i,o,a=-1;n=r.pop();)if(t.call(e,n,++a,this),i=n.children)for(o=i.length-1;o>=0;--o)r.push(i[o]);return this}function da(t,e){for(var n=this,r=[n],i=[],o,a,s,f=-1;n=r.pop();)if(i.push(n),o=n.children)for(a=0,s=o.length;a=0;)n+=r[i].value;e.value=n})}function _a(t){return this.eachBefore(function(e){e.children&&e.children.sort(t)})}function ya(t){for(var e=this,n=nl(e,t),r=[e];e!==n;)e=e.parent,r.push(e);for(var i=r.length;t!==n;)r.splice(i,0,t),t=t.parent;return r}function nl(t,e){if(t===e)return t;var n=t.ancestors(),r=e.ancestors(),i=null;for(t=n.pop(),e=r.pop();t===e;)i=t,t=n.pop(),e=r.pop();return i}function va(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e}function wa(){return Array.from(this)}function ba(){var t=[];return this.eachBefore(function(e){e.children||t.push(e)}),t}function Ma(){var t=this,e=[];return t.each(function(n){n!==t&&e.push({source:n.parent,target:n})}),e}function*Ta(){var t=this,e,n=[t],r,i,o;do for(e=n.reverse(),n=[];t=e.pop();)if(yield t,r=t.children)for(i=0,o=r.length;i=0;--s)i.push(o=a[s]=new Ve(a[s])),o.parent=r,o.depth=r.depth+1;return n.eachBefore(sl)}function rl(){return Un(this).eachBefore(al)}function il(t){return t.children}function ol(t){return Array.isArray(t)?t[1]:null}function al(t){t.data.value!==void 0&&(t.value=t.data.value),t.data=t.data.data}function sl(t){var e=0;do t.height=e;while((t=t.parent)&&t.height<++e)}function Ve(t){this.data=t,this.depth=this.height=0,this.parent=null}Ve.prototype=Un.prototype={constructor:Ve,count:ha,each:pa,eachAfter:da,eachBefore:ma,find:xa,sum:ga,sort:_a,path:ya,ancestors:va,descendants:wa,leaves:ba,links:Ma,copy:rl,[Symbol.iterator]:Ta};function ka(t){t.x0=Math.round(t.x0),t.y0=Math.round(t.y0),t.x1=Math.round(t.x1),t.y1=Math.round(t.y1)}function Sa(t,e,n,r,i){for(var o=t.children,a,s=-1,f=o.length,u=t.value&&(r-e)/t.value;++sR&&(R=u),y=A*A*$,E=Math.max(R/y,y/w),E>x){A-=u;break}x=E}a.push(f={value:A,dice:m1?r:1)},n})(ul);function Da(t){if(typeof t!="function")throw new Error;return t}function we(){return 0}function be(t){return function(){return t}}function ll(){var t=Na,e=!1,n=1,r=1,i=[0],o=we,a=we,s=we,f=we,u=we;function c(l){return l.x0=l.y0=0,l.x1=n,l.y1=r,l.eachBefore(p),i=[0],e&&l.eachBefore(ka),l}function p(l){var m=i[l.depth],T=l.x0+m,S=l.y0+m,A=l.x1-m,w=l.y1-m;Ae&&(n=t,t=e,e=n),function(r){return Math.max(t,Math.min(e,r))}}function hl(t,e,n){var r=t[0],i=t[1],o=e[0],a=e[1];return i2?pl:hl,f=u=null,p}function p(l){return l==null||isNaN(l=+l)?o:(f||(f=s(t.map(r),e,n)))(r(a(l)))}return p.invert=function(l){return a(i((u||(u=s(e,t.map(r),it)))(l)))},p.domain=function(l){return arguments.length?(t=Array.from(l,Jr),c()):t.slice()},p.range=function(l){return arguments.length?(e=Array.from(l),c()):e.slice()},p.rangeRound=function(l){return e=Array.from(l),n=Ar,c()},p.clamp=function(l){return arguments.length?(a=l?!0:Me,c()):a!==Me},p.interpolate=function(l){return arguments.length?(n=l,c()):n},p.unknown=function(l){return arguments.length?(o=l,p):o},function(l,m){return r=l,i=m,c()}}function Ge(){return ml()(Me,Me)}function ti(t,e,n,r){var i=ve(t,e,n),o;switch(r=Ft(r??",f"),r.type){case"s":{var a=Math.max(Math.abs(t),Math.abs(e));return r.precision==null&&!isNaN(o=Xr(i,a))&&(r.precision=o),Fn(r,a)}case"":case"e":case"g":case"p":case"r":{r.precision==null&&!isNaN(o=Gr(i,Math.max(Math.abs(t),Math.abs(e))))&&(r.precision=o-(r.type==="e"));break}case"f":case"%":{r.precision==null&&!isNaN(o=Vr(i))&&(r.precision=o-(r.type==="%")*2);break}}return Yn(r)}function dl(t){var e=t.domain;return t.ticks=function(n){var r=e();return $n(r[0],r[r.length-1],n??10)},t.tickFormat=function(n,r){var i=e();return ti(i[0],i[i.length-1],n??10,r)},t.nice=function(n){n==null&&(n=10);var r=e(),i=0,o=r.length-1,a=r[i],s=r[o],f,u,c=10;for(s0;){if(u=qe(a,s,n),u===f)return r[i]=a,r[o]=s,e(r);if(u>0)a=Math.floor(a/u)*u,s=Math.ceil(s/u)*u;else if(u<0)a=Math.ceil(a*u)/u,s=Math.floor(s*u)/u;else break;f=u}return t},t}function ei(){var t=Ge();return t.copy=function(){return zn(t,ei())},Ut.apply(t,arguments),dl(t)}var ni=new Date,ri=new Date;function G(t,e,n,r){function i(o){return t(o=arguments.length===0?new Date:new Date(+o)),o}return i.floor=o=>(t(o=new Date(+o)),o),i.ceil=o=>(t(o=new Date(o-1)),e(o,1),t(o),o),i.round=o=>{let a=i(o),s=i.ceil(o);return o-a(e(o=new Date(+o),a==null?1:Math.floor(a)),o),i.range=(o,a,s)=>{let f=[];if(o=i.ceil(o),s=s==null?1:Math.floor(s),!(o0))return f;let u;do f.push(u=new Date(+o)),e(o,s),t(o);while(uG(a=>{if(a>=a)for(;t(a),!o(a);)a.setTime(a-1)},(a,s)=>{if(a>=a)if(s<0)for(;++s<=0;)for(;e(a,-1),!o(a););else for(;--s>=0;)for(;e(a,1),!o(a););}),n&&(i.count=(o,a)=>(ni.setTime(+o),ri.setTime(+a),t(ni),t(ri),Math.floor(n(ni,ri))),i.every=o=>(o=Math.floor(o),!isFinite(o)||!(o>0)?null:o>1?i.filter(r?a=>r(a)%o===0:a=>i.count(0,a)%o===0):i)),i}var ne=G(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);ne.every=t=>(t=Math.floor(t),!isFinite(t)||!(t>0)?null:t>1?G(e=>{e.setTime(Math.floor(e/t)*t)},(e,n)=>{e.setTime(+e+n*t)},(e,n)=>(n-e)/t):ne);var $a=ne.range;var kt=G(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*1e3)},(t,e)=>(e-t)/1e3,t=>t.getUTCSeconds()),Ea=kt.range;var Te=G(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getMinutes()),xl=Te.range,Ln=G(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getUTCMinutes()),gl=Ln.range;var ke=G(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3-t.getMinutes()*6e4)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getHours()),_l=ke.range,Bn=G(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getUTCHours()),yl=Bn.range;var Et=G(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5,t=>t.getDate()-1),vl=Et.range,Qe=G(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>t.getUTCDate()-1),wl=Qe.range,Hn=G(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>Math.floor(t/864e5)),bl=Hn.range;function oe(t){return G(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(e,n)=>{e.setDate(e.getDate()+n*7)},(e,n)=>(n-e-(n.getTimezoneOffset()-e.getTimezoneOffset())*6e4)/6048e5)}var Ot=oe(0),Se=oe(1),Ia=oe(2),Ra=oe(3),zt=oe(4),Pa=oe(5),Ya=oe(6),Fa=Ot.range,Ml=Se.range,Tl=Ia.range,kl=Ra.range,Sl=zt.range,Cl=Pa.range,Nl=Ya.range;function ae(t){return G(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(e,n)=>{e.setUTCDate(e.getUTCDate()+n*7)},(e,n)=>(n-e)/6048e5)}var se=ae(0),Ce=ae(1),Ua=ae(2),za=ae(3),Lt=ae(4),La=ae(5),Ba=ae(6),Ha=se.range,Dl=Ce.range,Al=Ua.range,$l=za.range,El=Lt.range,Ol=La.range,Il=Ba.range;var Ne=G(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12,t=>t.getMonth()),Rl=Ne.range,qn=G(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12,t=>t.getUTCMonth()),Pl=qn.range;var ht=G(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear());ht.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:G(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,n)=>{e.setFullYear(e.getFullYear()+n*t)});var Yl=ht.range,yt=G(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());yt.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:G(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,n)=>{e.setUTCFullYear(e.getUTCFullYear()+n*t)});var Fl=yt.range;function Wa(t,e,n,r,i,o){let a=[[kt,1,1e3],[kt,5,5*1e3],[kt,15,15*1e3],[kt,30,30*1e3],[o,1,6e4],[o,5,5*6e4],[o,15,15*6e4],[o,30,30*6e4],[i,1,36e5],[i,3,3*36e5],[i,6,6*36e5],[i,12,12*36e5],[r,1,864e5],[r,2,2*864e5],[n,1,6048e5],[e,1,2592e6],[e,3,3*2592e6],[t,1,31536e6]];function s(u,c,p){let l=cA).right(a,l);if(m===a.length)return t.every(ve(u/31536e6,c/31536e6,p));if(m===0)return ne.every(Math.max(ve(u,c,p),1));let[T,S]=a[l/a[m-1][2]53)return null;"w"in k||(k.w=1),"Z"in k?(Z=si(Ke(k.y,0,1)),ft=Z.getUTCDay(),Z=ft>4||ft===0?Ce.ceil(Z):Ce(Z),Z=Qe.offset(Z,(k.V-1)*7),k.y=Z.getUTCFullYear(),k.m=Z.getUTCMonth(),k.d=Z.getUTCDate()+(k.w+6)%7):(Z=ai(Ke(k.y,0,1)),ft=Z.getDay(),Z=ft>4||ft===0?Se.ceil(Z):Se(Z),Z=Et.offset(Z,(k.V-1)*7),k.y=Z.getFullYear(),k.m=Z.getMonth(),k.d=Z.getDate()+(k.w+6)%7)}else("W"in k||"U"in k)&&("w"in k||(k.w="u"in k?k.u%7:"W"in k?1:0),ft="Z"in k?si(Ke(k.y,0,1)).getUTCDay():ai(Ke(k.y,0,1)).getDay(),k.m=0,k.d="W"in k?(k.w+6)%7+k.W*7-(ft+5)%7:k.w+k.U*7-(ft+6)%7);return"Z"in k?(k.H+=k.Z/100|0,k.M+=k.Z%100,si(k)):ai(k)}}function P(C,U,z,k){for(var ut=0,Z=U.length,ft=z.length,lt,Vt;ut=ft)return-1;if(lt=U.charCodeAt(ut++),lt===37){if(lt=U.charAt(ut++),Vt=$[lt in Va?U.charAt(ut++):lt],!Vt||(k=Vt(C,z,k))<0)return-1}else if(lt!=z.charCodeAt(k++))return-1}return k}function I(C,U,z){var k=u.exec(U.slice(z));return k?(C.p=c.get(k[0].toLowerCase()),z+k[0].length):-1}function B(C,U,z){var k=m.exec(U.slice(z));return k?(C.w=T.get(k[0].toLowerCase()),z+k[0].length):-1}function L(C,U,z){var k=p.exec(U.slice(z));return k?(C.w=l.get(k[0].toLowerCase()),z+k[0].length):-1}function b(C,U,z){var k=w.exec(U.slice(z));return k?(C.m=R.get(k[0].toLowerCase()),z+k[0].length):-1}function _(C,U,z){var k=S.exec(U.slice(z));return k?(C.m=A.get(k[0].toLowerCase()),z+k[0].length):-1}function h(C,U,z){return P(C,e,U,z)}function g(C,U,z){return P(C,n,U,z)}function d(C,U,z){return P(C,r,U,z)}function v(C){return a[C.getDay()]}function M(C){return o[C.getDay()]}function N(C){return f[C.getMonth()]}function D(C){return s[C.getMonth()]}function Y(C){return i[+(C.getHours()>=12)]}function F(C){return 1+~~(C.getMonth()/3)}function X(C){return a[C.getUTCDay()]}function W(C){return o[C.getUTCDay()]}function q(C){return f[C.getUTCMonth()]}function j(C){return s[C.getUTCMonth()]}function Q(C){return i[+(C.getUTCHours()>=12)]}function V(C){return 1+~~(C.getUTCMonth()/3)}return{format:function(C){var U=y(C+="",E);return U.toString=function(){return C},U},parse:function(C){var U=O(C+="",!1);return U.toString=function(){return C},U},utcFormat:function(C){var U=y(C+="",x);return U.toString=function(){return C},U},utcParse:function(C){var U=O(C+="",!0);return U.toString=function(){return C},U}}}var Va={"-":"",_:" ",0:"0"},et=/^\s*\d+/,Bl=/^%/,Hl=/[\\^$*+?|[\]().{}]/g;function H(t,e,n){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o[e.toLowerCase(),n]))}function Wl(t,e,n){var r=et.exec(e.slice(n,n+1));return r?(t.w=+r[0],n+r[0].length):-1}function Vl(t,e,n){var r=et.exec(e.slice(n,n+1));return r?(t.u=+r[0],n+r[0].length):-1}function Xl(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.U=+r[0],n+r[0].length):-1}function Gl(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.V=+r[0],n+r[0].length):-1}function Zl(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.W=+r[0],n+r[0].length):-1}function Xa(t,e,n){var r=et.exec(e.slice(n,n+4));return r?(t.y=+r[0],n+r[0].length):-1}function Ga(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.y=+r[0]+(+r[0]>68?1900:2e3),n+r[0].length):-1}function Ql(t,e,n){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),n+r[0].length):-1}function Kl(t,e,n){var r=et.exec(e.slice(n,n+1));return r?(t.q=r[0]*3-3,n+r[0].length):-1}function Jl(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.m=r[0]-1,n+r[0].length):-1}function Za(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.d=+r[0],n+r[0].length):-1}function jl(t,e,n){var r=et.exec(e.slice(n,n+3));return r?(t.m=0,t.d=+r[0],n+r[0].length):-1}function Qa(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.H=+r[0],n+r[0].length):-1}function tc(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.M=+r[0],n+r[0].length):-1}function ec(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.S=+r[0],n+r[0].length):-1}function nc(t,e,n){var r=et.exec(e.slice(n,n+3));return r?(t.L=+r[0],n+r[0].length):-1}function rc(t,e,n){var r=et.exec(e.slice(n,n+6));return r?(t.L=Math.floor(r[0]/1e3),n+r[0].length):-1}function ic(t,e,n){var r=Bl.exec(e.slice(n,n+1));return r?n+r[0].length:-1}function oc(t,e,n){var r=et.exec(e.slice(n));return r?(t.Q=+r[0],n+r[0].length):-1}function ac(t,e,n){var r=et.exec(e.slice(n));return r?(t.s=+r[0],n+r[0].length):-1}function Ka(t,e){return H(t.getDate(),e,2)}function sc(t,e){return H(t.getHours(),e,2)}function uc(t,e){return H(t.getHours()%12||12,e,2)}function fc(t,e){return H(1+Et.count(ht(t),t),e,3)}function ns(t,e){return H(t.getMilliseconds(),e,3)}function lc(t,e){return ns(t,e)+"000"}function cc(t,e){return H(t.getMonth()+1,e,2)}function hc(t,e){return H(t.getMinutes(),e,2)}function pc(t,e){return H(t.getSeconds(),e,2)}function mc(t){var e=t.getDay();return e===0?7:e}function dc(t,e){return H(Ot.count(ht(t)-1,t),e,2)}function rs(t){var e=t.getDay();return e>=4||e===0?zt(t):zt.ceil(t)}function xc(t,e){return t=rs(t),H(zt.count(ht(t),t)+(ht(t).getDay()===4),e,2)}function gc(t){return t.getDay()}function _c(t,e){return H(Se.count(ht(t)-1,t),e,2)}function yc(t,e){return H(t.getFullYear()%100,e,2)}function vc(t,e){return t=rs(t),H(t.getFullYear()%100,e,2)}function wc(t,e){return H(t.getFullYear()%1e4,e,4)}function bc(t,e){var n=t.getDay();return t=n>=4||n===0?zt(t):zt.ceil(t),H(t.getFullYear()%1e4,e,4)}function Mc(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+H(e/60|0,"0",2)+H(e%60,"0",2)}function Ja(t,e){return H(t.getUTCDate(),e,2)}function Tc(t,e){return H(t.getUTCHours(),e,2)}function kc(t,e){return H(t.getUTCHours()%12||12,e,2)}function Sc(t,e){return H(1+Qe.count(yt(t),t),e,3)}function is(t,e){return H(t.getUTCMilliseconds(),e,3)}function Cc(t,e){return is(t,e)+"000"}function Nc(t,e){return H(t.getUTCMonth()+1,e,2)}function Dc(t,e){return H(t.getUTCMinutes(),e,2)}function Ac(t,e){return H(t.getUTCSeconds(),e,2)}function $c(t){var e=t.getUTCDay();return e===0?7:e}function Ec(t,e){return H(se.count(yt(t)-1,t),e,2)}function os(t){var e=t.getUTCDay();return e>=4||e===0?Lt(t):Lt.ceil(t)}function Oc(t,e){return t=os(t),H(Lt.count(yt(t),t)+(yt(t).getUTCDay()===4),e,2)}function Ic(t){return t.getUTCDay()}function Rc(t,e){return H(Ce.count(yt(t)-1,t),e,2)}function Pc(t,e){return H(t.getUTCFullYear()%100,e,2)}function Yc(t,e){return t=os(t),H(t.getUTCFullYear()%100,e,2)}function Fc(t,e){return H(t.getUTCFullYear()%1e4,e,4)}function Uc(t,e){var n=t.getUTCDay();return t=n>=4||n===0?Lt(t):Lt.ceil(t),H(t.getUTCFullYear()%1e4,e,4)}function zc(){return"+0000"}function ja(){return"%"}function ts(t){return+t}function es(t){return Math.floor(+t/1e3)}var De,Wn,as,ss,us;fi({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function fi(t){return De=ui(t),Wn=De.format,as=De.parse,ss=De.utcFormat,us=De.utcParse,De}function li(t,e){t=t.slice();var n=0,r=t.length-1,i=t[n],o=t[r],a;return o1?0:t<-1?Ae:Math.acos(t)}function hi(t){return t>=1?tn:t<=-1?-tn:Math.asin(t)}var pi=Math.PI,mi=2*pi,fe=1e-6,qc=mi-fe;function ms(t){this._+=t[0];for(let e=1,n=t.length;e=0))throw new Error(`invalid digits: ${t}`);if(e>15)return ms;let n=10**e;return function(r){this._+=r[0];for(let i=1,o=r.length;ife)if(!(Math.abs(p*f-u*c)>fe)||!o)this._append`L${this._x1=e},${this._y1=n}`;else{let m=r-a,T=i-s,S=f*f+u*u,A=m*m+T*T,w=Math.sqrt(S),R=Math.sqrt(l),E=o*Math.tan((pi-Math.acos((S+l-A)/(2*w*R)))/2),x=E/R,$=E/w;Math.abs(x-1)>fe&&this._append`L${e+x*c},${n+x*p}`,this._append`A${o},${o},0,0,${+(p*m>c*T)},${this._x1=e+$*f},${this._y1=n+$*u}`}}arc(e,n,r,i,o,a){if(e=+e,n=+n,r=+r,a=!!a,r<0)throw new Error(`negative radius: ${r}`);let s=r*Math.cos(i),f=r*Math.sin(i),u=e+s,c=n+f,p=1^a,l=a?i-o:o-i;this._x1===null?this._append`M${u},${c}`:(Math.abs(this._x1-u)>fe||Math.abs(this._y1-c)>fe)&&this._append`L${u},${c}`,r&&(l<0&&(l=l%mi+mi),l>qc?this._append`A${r},${r},0,1,${p},${e-s},${n-f}A${r},${r},0,1,${p},${this._x1=u},${this._y1=c}`:l>fe&&this._append`A${r},${r},0,${+(l>=pi)},${p},${this._x1=e+r*Math.cos(o)},${this._y1=n+r*Math.sin(o)}`)}rect(e,n,r,i){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+n}h${r=+r}v${+i}h${-r}Z`}toString(){return this._}};function ds(){return new le}ds.prototype=le.prototype;function Xn(t){let e=3;return t.digits=function(n){if(!arguments.length)return e;if(n==null)e=null;else{let r=Math.floor(n);if(!(r>=0))throw new RangeError(`invalid digits: ${n}`);e=r}return t},()=>new le(e)}function Vc(t){return t.innerRadius}function Xc(t){return t.outerRadius}function Gc(t){return t.startAngle}function Zc(t){return t.endAngle}function Qc(t){return t&&t.padAngle}function Kc(t,e,n,r,i,o,a,s){var f=n-t,u=r-e,c=a-i,p=s-o,l=p*f-c*u;if(!(l*lh*h+g*g&&(P=B,I=L),{cx:P,cy:I,x01:-c,y01:-p,x11:P*(i/$-1),y11:I*(i/$-1)}}function Jc(){var t=Vc,e=Xc,n=K(0),r=null,i=Gc,o=Zc,a=Qc,s=null,f=Xn(u);function u(){var c,p,l=+t.apply(this,arguments),m=+e.apply(this,arguments),T=i.apply(this,arguments)-tn,S=o.apply(this,arguments)-tn,A=ci(S-T),w=S>T;if(s||(s=c=f()),mnt))s.moveTo(0,0);else if(A>$e-nt)s.moveTo(m*Bt(T),m*vt(T)),s.arc(0,0,m,T,S,!w),l>nt&&(s.moveTo(l*Bt(S),l*vt(S)),s.arc(0,0,l,S,T,w));else{var R=T,E=S,x=T,$=S,y=A,O=A,P=a.apply(this,arguments)/2,I=P>nt&&(r?+r.apply(this,arguments):ue(l*l+m*m)),B=Vn(ci(m-l)/2,+n.apply(this,arguments)),L=B,b=B,_,h;if(I>nt){var g=hi(I/l*vt(P)),d=hi(I/m*vt(P));(y-=g*2)>nt?(g*=w?1:-1,x+=g,$-=g):(y=0,x=$=(T+S)/2),(O-=d*2)>nt?(d*=w?1:-1,R+=d,E-=d):(O=0,R=E=(T+S)/2)}var v=m*Bt(R),M=m*vt(R),N=l*Bt($),D=l*vt($);if(B>nt){var Y=m*Bt(E),F=m*vt(E),X=l*Bt(x),W=l*vt(x),q;if(Ant?b>nt?(_=Gn(X,W,v,M,m,b,w),h=Gn(Y,F,N,D,m,b,w),s.moveTo(_.cx+_.x01,_.cy+_.y01),bnt)||!(y>nt)?s.lineTo(N,D):L>nt?(_=Gn(N,D,Y,F,l,-L,w),h=Gn(v,M,X,W,l,-L,w),s.lineTo(_.cx+_.x01,_.cy+_.y01),Lt?1:e>=t?0:NaN}function vs(t){return t}function th(){var t=vs,e=ys,n=null,r=K(0),i=K($e),o=K(0);function a(s){var f,u=(s=Zn(s)).length,c,p,l=0,m=new Array(u),T=new Array(u),S=+r.apply(this,arguments),A=Math.min($e,Math.max(-$e,i.apply(this,arguments)-S)),w,R=Math.min(Math.abs(A)/u,o.apply(this,arguments)),E=R*(A<0?-1:1),x;for(f=0;f0&&(l+=x);for(e!=null?m.sort(function($,y){return e(T[$],T[y])}):n!=null&&m.sort(function($,y){return n(s[$],s[y])}),f=0,p=l?(A-u*E)/l:0;f0?x*p:0)+E,T[c]={data:s[c],index:f,value:x,startAngle:S,endAngle:w,padAngle:R};return T}return a.value=function(s){return arguments.length?(t=typeof s=="function"?s:K(+s),a):t},a.sortValues=function(s){return arguments.length?(e=s,n=null,a):e},a.sort=function(s){return arguments.length?(n=s,e=null,a):n},a.startAngle=function(s){return arguments.length?(r=typeof s=="function"?s:K(+s),a):r},a.endAngle=function(s){return arguments.length?(i=typeof s=="function"?s:K(+s),a):i},a.padAngle=function(s){return arguments.length?(o=typeof s=="function"?s:K(+s),a):o},a}function Ee(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function en(t){this._context=t}en.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Ee(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Ee(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};function eh(t){return new en(t)}var Qn=class{constructor(e,n){this._context=e,this._x=n}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,n){switch(e=+e,n=+n,this._point){case 0:{this._point=1,this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,n,e,n):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+n)/2,e,this._y0,e,n);break}}this._x0=e,this._y0=n}};function nh(t){return new Qn(t,!0)}function rh(t){return new Qn(t,!1)}function xt(){}function ws(t){this._context=t}ws.prototype={areaStart:xt,areaEnd:xt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:Ee(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};function ih(t){return new ws(t)}function bs(t){this._context=t}bs.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,r):this._context.moveTo(n,r);break;case 3:this._point=4;default:Ee(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};function oh(t){return new bs(t)}function Ms(t,e){this._basis=new en(t),this._beta=e}Ms.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,n=t.length-1;if(n>0)for(var r=t[0],i=e[0],o=t[n]-r,a=e[n]-i,s=-1,f;++s<=n;)f=s/n,this._basis.point(this._beta*t[s]+(1-this._beta)*(r+f*o),this._beta*e[s]+(1-this._beta)*(i+f*a));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};var ah=(function t(e){function n(r){return e===1?new en(r):new Ms(r,e)}return n.beta=function(r){return t(+r)},n})(.85);function Oe(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function Kn(t,e){this._context=t,this._k=(1-e)/6}Kn.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Oe(this,this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Oe(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var sh=(function t(e){function n(r){return new Kn(r,e)}return n.tension=function(r){return t(+r)},n})(0);function Jn(t,e){this._context=t,this._k=(1-e)/6}Jn.prototype={areaStart:xt,areaEnd:xt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Oe(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var uh=(function t(e){function n(r){return new Jn(r,e)}return n.tension=function(r){return t(+r)},n})(0);function jn(t,e){this._context=t,this._k=(1-e)/6}jn.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Oe(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var fh=(function t(e){function n(r){return new jn(r,e)}return n.tension=function(r){return t(+r)},n})(0);function nn(t,e,n){var r=t._x1,i=t._y1,o=t._x2,a=t._y2;if(t._l01_a>nt){var s=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,f=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*s-t._x0*t._l12_2a+t._x2*t._l01_2a)/f,i=(i*s-t._y0*t._l12_2a+t._y2*t._l01_2a)/f}if(t._l23_a>nt){var u=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,c=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*u+t._x1*t._l23_2a-e*t._l12_2a)/c,a=(a*u+t._y1*t._l23_2a-n*t._l12_2a)/c}t._context.bezierCurveTo(r,i,o,a,t._x2,t._y2)}function Ts(t,e){this._context=t,this._alpha=e}Ts.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:nn(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var lh=(function t(e){function n(r){return e?new Ts(r,e):new Kn(r,0)}return n.alpha=function(r){return t(+r)},n})(.5);function ks(t,e){this._context=t,this._alpha=e}ks.prototype={areaStart:xt,areaEnd:xt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:nn(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var ch=(function t(e){function n(r){return e?new ks(r,e):new Jn(r,0)}return n.alpha=function(r){return t(+r)},n})(.5);function Ss(t,e){this._context=t,this._alpha=e}Ss.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:nn(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var hh=(function t(e){function n(r){return e?new Ss(r,e):new jn(r,0)}return n.alpha=function(r){return t(+r)},n})(.5);function Cs(t){this._context=t}Cs.prototype={areaStart:xt,areaEnd:xt,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}};function ph(t){return new Cs(t)}function Ns(t){return t<0?-1:1}function Ds(t,e,n){var r=t._x1-t._x0,i=e-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),a=(n-t._y1)/(i||r<0&&-0),s=(o*i+a*r)/(r+i);return(Ns(o)+Ns(a))*Math.min(Math.abs(o),Math.abs(a),.5*Math.abs(s))||0}function As(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function xi(t,e,n){var r=t._x0,i=t._y0,o=t._x1,a=t._y1,s=(o-r)/3;t._context.bezierCurveTo(r+s,i+s*e,o-s,a-s*n,o,a)}function tr(t){this._context=t}tr.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:xi(this,this._t0,As(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){var n=NaN;if(t=+t,e=+e,!(t===this._x1&&e===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,xi(this,As(this,n=Ds(this,t,e)),n);break;default:xi(this,this._t0,n=Ds(this,t,e));break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=n}}};function $s(t){this._context=new Es(t)}($s.prototype=Object.create(tr.prototype)).point=function(t,e){tr.prototype.point.call(this,e,t)};function Es(t){this._context=t}Es.prototype={moveTo:function(t,e){this._context.moveTo(e,t)},closePath:function(){this._context.closePath()},lineTo:function(t,e){this._context.lineTo(e,t)},bezierCurveTo:function(t,e,n,r,i,o){this._context.bezierCurveTo(e,t,r,n,o,i)}};function mh(t){return new tr(t)}function dh(t){return new $s(t)}function Is(t){this._context=t}Is.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var t=this._x,e=this._y,n=t.length;if(n)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),n===2)this._context.lineTo(t[1],e[1]);else for(var r=Os(t),i=Os(e),o=0,a=1;a=0;--e)i[e]=(a[e]-i[e+1])/o[e];for(o[n-1]=(t[n]+i[n-1])/2,e=0;e=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}break}}this._x=t,this._y=e}};function gh(t){return new er(t,.5)}function _h(t){return new er(t,0)}function yh(t){return new er(t,1)}var vh={value:()=>{}};function Ps(){for(var t=0,e=arguments.length,n={},r;t=0&&(r=n.slice(i+1),n=n.slice(0,i)),n&&!e.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:r}})}nr.prototype=Ps.prototype={constructor:nr,on:function(t,e){var n=this._,r=wh(t+"",n),i,o=-1,a=r.length;if(arguments.length<2){for(;++o0)for(var n=new Array(i),r=0,i,o;r()=>t;function sn(t,{sourceEvent:e,subject:n,target:r,identifier:i,active:o,x:a,y:s,dx:f,dy:u,dispatch:c}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},identifier:{value:i,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:s,enumerable:!0,configurable:!0},dx:{value:f,enumerable:!0,configurable:!0},dy:{value:u,enumerable:!0,configurable:!0},_:{value:c}})}sn.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function Mh(t){return!t.ctrlKey&&!t.button}function Th(){return this.parentNode}function kh(t,e){return e??{x:t.x,y:t.y}}function Sh(){return navigator.maxTouchPoints||"ontouchstart"in this}function Ch(){var t=Mh,e=Th,n=kh,r=Sh,i={},o=ce("start","drag","end"),a=0,s,f,u,c,p=0;function l(x){x.on("mousedown.drag",m).filter(r).on("touchstart.drag",A).on("touchmove.drag",w,Ys).on("touchend.drag touchcancel.drag",R).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function m(x,$){if(!(c||!t.call(this,x,$))){var y=E(this,e.call(this,x,$),x,$,"mouse");y&&(ct(x.view).on("mousemove.drag",T,he).on("mouseup.drag",S,he),rn(x.view),rr(x),u=!1,s=x.clientX,f=x.clientY,y("start",x))}}function T(x){if(Ht(x),!u){var $=x.clientX-s,y=x.clientY-f;u=$*$+y*y>p}i.mouse("drag",x)}function S(x){ct(x.view).on("mousemove.drag mouseup.drag",null),on(x.view,u),Ht(x),i.mouse("end",x)}function A(x,$){if(t.call(this,x,$)){var y=x.changedTouches,O=e.call(this,x,$),P=y.length,I,B;for(I=0;I=0&&t._call.call(void 0,e),t=t._next;--Ie}function Fs(){pe=(or=cn.now())+ar,Ie=fn=0;try{Ls()}finally{Ie=0,Ah(),pe=0}}function Dh(){var t=cn.now(),e=t-or;e>Us&&(ar-=e,or=t)}function Ah(){for(var t,e=ir,n,r=1/0;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:ir=n);ln=t,gi(r)}function gi(t){if(!Ie){fn&&(fn=clearTimeout(fn));var e=t-pe;e>24?(t<1/0&&(fn=setTimeout(Fs,t-cn.now()-ar)),un&&(un=clearInterval(un))):(un||(or=cn.now(),un=setInterval(Dh,Us)),Ie=1,zs(Fs))}}function ur(t,e,n){var r=new hn;return e=e==null?0:+e,r.restart(i=>{r.stop(),t(i+e)},e,n),r}var $h=ce("start","end","cancel","interrupt"),Eh=[],qs=0,Bs=1,lr=2,fr=3,Hs=4,cr=5,mn=6;function qt(t,e,n,r,i,o){var a=t.__transition;if(!a)t.__transition={};else if(n in a)return;Oh(t,n,{name:e,index:r,group:i,on:$h,tween:Eh,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:qs})}function dn(t,e){var n=tt(t,e);if(n.state>qs)throw new Error("too late; already scheduled");return n}function at(t,e){var n=tt(t,e);if(n.state>fr)throw new Error("too late; already running");return n}function tt(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function Oh(t,e,n){var r=t.__transition,i;r[e]=n,n.timer=sr(o,0,n.time);function o(u){n.state=Bs,n.timer.restart(a,n.delay,n.time),n.delay<=u&&a(u-n.delay)}function a(u){var c,p,l,m;if(n.state!==Bs)return f();for(c in r)if(m=r[c],m.name===n.name){if(m.state===fr)return ur(a);m.state===Hs?(m.state=mn,m.timer.stop(),m.on.call("interrupt",t,t.__data__,m.index,m.group),delete r[c]):+clr&&r.state=0&&(e=e.slice(0,n)),!e||e==="start"})}function jh(t,e,n){var r,i,o=Jh(e)?dn:at;return function(){var a=o(this,t),s=a.on;s!==r&&(i=(r=s).copy()).on(e,n),a.on=i}}function eu(t,e){var n=this._id;return arguments.length<2?tt(this.node(),n).on.on(t):this.each(jh(n,t,e))}function tp(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}function nu(){return this.on("end.remove",tp(this._id))}function ru(t){var e=this._name,n=this._id;typeof t!="function"&&(t=Xt(t));for(var r=this._groups,i=r.length,o=new Array(i),a=0;a()=>t;function yi(t,{sourceEvent:e,target:n,transform:r,dispatch:i}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:i}})}function wt(t,e,n){this.k=t,this.x=e,this.y=n}wt.prototype={constructor:wt,scale:function(t){return t===1?this:new wt(this.k*t,this.x,this.y)},translate:function(t,e){return t===0&e===0?this:new wt(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var gn=new wt(1,0,0);vi.prototype=wt.prototype;function vi(t){for(;!t.__zoom;)if(!(t=t.parentNode))return gn;return t.__zoom}function dr(t){t.stopImmediatePropagation()}function Pe(t){t.preventDefault(),t.stopImmediatePropagation()}function xp(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function gp(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function xu(){return this.__zoom||gn}function _p(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function yp(){return navigator.maxTouchPoints||"ontouchstart"in this}function vp(t,e,n){var r=t.invertX(e[0][0])-n[0][0],i=t.invertX(e[1][0])-n[1][0],o=t.invertY(e[0][1])-n[0][1],a=t.invertY(e[1][1])-n[1][1];return t.translate(i>r?(r+i)/2:Math.min(0,r)||Math.max(0,i),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}function wp(){var t=xp,e=gp,n=vp,r=_p,i=yp,o=[0,1/0],a=[[-1/0,-1/0],[1/0,1/0]],s=250,f=Ir,u=ce("start","zoom","end"),c,p,l,m=500,T=150,S=0,A=10;function w(h){h.property("__zoom",xu).on("wheel.zoom",P,{passive:!1}).on("mousedown.zoom",I).on("dblclick.zoom",B).filter(i).on("touchstart.zoom",L).on("touchmove.zoom",b).on("touchend.zoom touchcancel.zoom",_).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}w.transform=function(h,g,d,v){var M=h.selection?h.selection():h;M.property("__zoom",xu),h!==M?$(h,g,d,v):M.interrupt().each(function(){y(this,arguments).event(v).start().zoom(null,typeof g=="function"?g.apply(this,arguments):g).end()})},w.scaleBy=function(h,g,d,v){w.scaleTo(h,function(){var M=this.__zoom.k,N=typeof g=="function"?g.apply(this,arguments):g;return M*N},d,v)},w.scaleTo=function(h,g,d,v){w.transform(h,function(){var M=e.apply(this,arguments),N=this.__zoom,D=d==null?x(M):typeof d=="function"?d.apply(this,arguments):d,Y=N.invert(D),F=typeof g=="function"?g.apply(this,arguments):g;return n(E(R(N,F),D,Y),M,a)},d,v)},w.translateBy=function(h,g,d,v){w.transform(h,function(){return n(this.__zoom.translate(typeof g=="function"?g.apply(this,arguments):g,typeof d=="function"?d.apply(this,arguments):d),e.apply(this,arguments),a)},null,v)},w.translateTo=function(h,g,d,v,M){w.transform(h,function(){var N=e.apply(this,arguments),D=this.__zoom,Y=v==null?x(N):typeof v=="function"?v.apply(this,arguments):v;return n(gn.translate(Y[0],Y[1]).scale(D.k).translate(typeof g=="function"?-g.apply(this,arguments):-g,typeof d=="function"?-d.apply(this,arguments):-d),N,a)},v,M)};function R(h,g){return g=Math.max(o[0],Math.min(o[1],g)),g===h.k?h:new wt(g,h.x,h.y)}function E(h,g,d){var v=g[0]-d[0]*h.k,M=g[1]-d[1]*h.k;return v===h.x&&M===h.y?h:new wt(h.k,v,M)}function x(h){return[(+h[0][0]+ +h[1][0])/2,(+h[0][1]+ +h[1][1])/2]}function $(h,g,d,v){h.on("start.zoom",function(){y(this,arguments).event(v).start()}).on("interrupt.zoom end.zoom",function(){y(this,arguments).event(v).end()}).tween("zoom",function(){var M=this,N=arguments,D=y(M,N).event(v),Y=e.apply(M,N),F=d==null?x(Y):typeof d=="function"?d.apply(M,N):d,X=Math.max(Y[1][0]-Y[0][0],Y[1][1]-Y[0][1]),W=M.__zoom,q=typeof g=="function"?g.apply(M,N):g,j=f(W.invert(F).concat(X/W.k),q.invert(F).concat(X/q.k));return function(Q){if(Q===1)Q=q;else{var V=j(Q),C=X/V[2];Q=new wt(C,F[0]-V[0]*C,F[1]-V[1]*C)}D.zoom(null,Q)}})}function y(h,g,d){return!d&&h.__zooming||new O(h,g)}function O(h,g){this.that=h,this.args=g,this.active=0,this.sourceEvent=null,this.extent=e.apply(h,g),this.taps=0}O.prototype={event:function(h){return h&&(this.sourceEvent=h),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(h,g){return this.mouse&&h!=="mouse"&&(this.mouse[1]=g.invert(this.mouse[0])),this.touch0&&h!=="touch"&&(this.touch0[1]=g.invert(this.touch0[0])),this.touch1&&h!=="touch"&&(this.touch1[1]=g.invert(this.touch1[0])),this.that.__zoom=g,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(h){var g=ct(this.that).datum();u.call(h,this.that,new yi(h,{sourceEvent:this.sourceEvent,target:w,type:h,transform:this.that.__zoom,dispatch:u}),g)}};function P(h,...g){if(!t.apply(this,arguments))return;var d=y(this,g).event(h),v=this.__zoom,M=Math.max(o[0],Math.min(o[1],v.k*Math.pow(2,r.apply(this,arguments)))),N=pt(h);if(d.wheel)(d.mouse[0][0]!==N[0]||d.mouse[0][1]!==N[1])&&(d.mouse[1]=v.invert(d.mouse[0]=N)),clearTimeout(d.wheel);else{if(v.k===M)return;d.mouse=[N,v.invert(N)],Wt(this),d.start()}Pe(h),d.wheel=setTimeout(D,T),d.zoom("mouse",n(E(R(v,M),d.mouse[0],d.mouse[1]),d.extent,a));function D(){d.wheel=null,d.end()}}function I(h,...g){if(l||!t.apply(this,arguments))return;var d=h.currentTarget,v=y(this,g,!0).event(h),M=ct(h.view).on("mousemove.zoom",F,!0).on("mouseup.zoom",X,!0),N=pt(h,d),D=h.clientX,Y=h.clientY;rn(h.view),dr(h),v.mouse=[N,this.__zoom.invert(N)],Wt(this),v.start();function F(W){if(Pe(W),!v.moved){var q=W.clientX-D,j=W.clientY-Y;v.moved=q*q+j*j>S}v.event(W).zoom("mouse",n(E(v.that.__zoom,v.mouse[0]=pt(W,d),v.mouse[1]),v.extent,a))}function X(W){M.on("mousemove.zoom mouseup.zoom",null),on(W.view,v.moved),Pe(W),v.event(W).end()}}function B(h,...g){if(t.apply(this,arguments)){var d=this.__zoom,v=pt(h.changedTouches?h.changedTouches[0]:h,this),M=d.invert(v),N=d.k*(h.shiftKey?.5:2),D=n(E(R(d,N),v,M),e.apply(this,g),a);Pe(h),s>0?ct(this).transition().duration(s).call($,D,v,h):ct(this).call(w.transform,D,v,h)}}function L(h,...g){if(t.apply(this,arguments)){var d=h.touches,v=d.length,M=y(this,g,h.changedTouches.length===v).event(h),N,D,Y,F;for(dr(h),D=0;D{class n extends L{selectedIndex=b(0);tabs=w.required();buttonClasses=$(()=>{let t=this.selectedIndex();return this.tabs().map((s,e)=>e===t?E.merge(this.theme.components.Tabs.controls.all,this.theme.components.Tabs.controls.selected):this.theme.components.Tabs.controls.all)});static \u0275fac=(()=>{let t;return function(e){return(t||(t=_(n)))(e||n)}})();static \u0275cmp=f({type:n,selectors:[["a2ui-tabs"]],inputs:{tabs:[1,"tabs"]},features:[h],decls:6,vars:9,consts:[[3,"disabled","class"],["a2ui-renderer","",3,"surfaceId","component"],[3,"click","disabled"]],template:function(s,e){if(s&1&&(F(0),l(1,"section")(2,"div"),v(3,B,2,4,"button",0,x),o(),I(5,1),o()),s&2){let i=e.tabs(),V=k(e.selectedIndex());a(),C(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Tabs),r(e.theme.components.Tabs.container),a(),r(e.theme.components.Tabs.element),a(),y(i),a(2),d("surfaceId",e.surfaceId())("component",i[V].child)}},dependencies:[N],styles:["[_nghost-%COMP%]{display:block;flex:var(--weight)}"]})}return n})();export{z as Tabs}; +import{$a as f,Ca as _,Cc as w,Gb as I,Hb as g,Jb as T,Lb as c,Nc as E,Pa as a,Yb as C,Zb as r,_b as M,ac as D,eb as h,fc as F,gc as k,hc as S,na as p,oa as u,pd as L,qd as N,ub as x,vb as v,wb as y,wc as $,xb as d,yb as l,za as b,zb as o}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function B(n,m){if(n&1){let t=g();l(0,"button",2),T("click",function(){let e=p(t).$index,i=c();return u(i.selectedIndex.set(e))}),M(1),o()}if(n&2){let t=m.$implicit,s=m.$index,e=c(),i=S(0);r(e.buttonClasses()[i]),d("disabled",i===s),a(),D(" ",e.resolvePrimitive(t.title)," ")}}var z=(()=>{class n extends L{selectedIndex=b(0);tabs=w.required();buttonClasses=$(()=>{let t=this.selectedIndex();return this.tabs().map((s,e)=>e===t?E.merge(this.theme.components.Tabs.controls.all,this.theme.components.Tabs.controls.selected):this.theme.components.Tabs.controls.all)});static \u0275fac=(()=>{let t;return function(e){return(t||(t=_(n)))(e||n)}})();static \u0275cmp=f({type:n,selectors:[["a2ui-tabs"]],inputs:{tabs:[1,"tabs"]},features:[h],decls:6,vars:9,consts:[[3,"disabled","class"],["a2ui-renderer","",3,"surfaceId","component"],[3,"click","disabled"]],template:function(s,e){if(s&1&&(F(0),l(1,"section")(2,"div"),v(3,B,2,4,"button",0,x),o(),I(5,1),o()),s&2){let i=e.tabs(),V=k(e.selectedIndex());a(),C(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Tabs),r(e.theme.components.Tabs.container),a(),r(e.theme.components.Tabs.element),a(),y(i),a(2),d("surfaceId",e.surfaceId())("component",i[V].child)}},dependencies:[N],styles:["[_nghost-%COMP%]{display:block;flex:var(--weight)}"]})}return n})();export{z as Tabs}; diff --git a/src/google/adk/cli/browser/chunk-JW2YJHYO.js b/src/google/adk/cli/browser/chunk-JW2YJHYO.js deleted file mode 100644 index d8538722d6..0000000000 --- a/src/google/adk/cli/browser/chunk-JW2YJHYO.js +++ /dev/null @@ -1,34 +0,0 @@ -import{a as Vt}from"./chunk-TPDTRWWV.js";import{a as qt}from"./chunk-PRKFGJVH.js";import{l as Bt}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as ct,N as Rt,R as Ct,S as Nt,T as Ot,U as Lt,V as Ft,W as jt,X as Pt,c as Tt,d as zt,e as At,f as lt,r as Dt}from"./chunk-QFMJV7VH.js";import{a as it,g as w}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{a as Et}from"./chunk-RMXJBC7V.js";function rt(t,n){let s=fe(t),e=s.filter(c=>ue(c,t)),i=0,r=0,a=[];if(e.length>1){let c=Kt(e);for(let u=0;uo.angle-u.angle);let h=e[e.length-1];for(let u=0;ux.radius*2&&(g=x.radius*2),(d==null||d.width>g)&&(d={circle:x,width:g,p1:o,p2:h,large:g>x.radius,sweep:!0})}d!=null&&(a.push(d),i+=ht(d.circle.radius,d.width),h=o)}}else{let c=t[0];for(let u=1;uMath.abs(c.radius-t[u].radius)){h=!0;break}h?i=r=0:(i=c.radius*c.radius*Math.PI,a.push({circle:c,p1:{x:c.x,y:c.y+c.radius},p2:{x:c.x-1e-10,y:c.y+c.radius},width:c.radius*2,large:!0,sweep:!0}))}return r/=2,n&&(n.area=i+r,n.arcArea=i,n.polygonArea=r,n.arcs=a,n.innerPoints=e,n.intersectionPoints=s),i+r}function ue(t,n){return n.every(s=>q(t,s)=t+n)return 0;if(s<=Math.abs(t-n))return Math.PI*Math.min(t,n)*Math.min(t,n);let e=t-(s*s-n*n+t*t)/(2*s),i=n-(s*s-t*t+n*n)/(2*s);return ht(t,e)+ht(n,i)}function Wt(t,n){let s=q(t,n),e=t.radius,i=n.radius;if(s>=e+i||s<=Math.abs(e-i))return[];let r=(e*e-i*i+s*s)/(2*s),a=Math.sqrt(e*e-r*r),c=t.x+r*(n.x-t.x)/s,h=t.y+r*(n.y-t.y)/s,u=-(n.y-t.y)*(a/s),o=-(n.x-t.x)*(a/s);return[{x:c+u,y:h-o},{x:c-u,y:h+o}]}function Kt(t){let n={x:0,y:0};for(let s of t)n.x+=s.x,n.y+=s.y;return n.x/=t.length,n.y/=t.length,n}function he(t,n,s,e){e=e||{};let i=e.maxIterations||100,r=e.tolerance||1e-10,a=t(n),c=t(s),h=s-n;if(a*c>0)throw"Initial bisect points must have opposite signs";if(a===0)return n;if(c===0)return s;for(let u=0;u=0&&(n=o),Math.abs(h)dt(n))}function $(t,n){let s=0;for(let e=0;ev.fx-l.fx,_=n.slice(),S=n.slice(),g=n.slice(),m=n.slice();for(let v=0;v{let O=f.slice();return O.fx=f.fx,O.id=f.id,O});p.sort((f,O)=>f.id-O.id),s.history.push({x:x[0].slice(),fx:x[0].fx,simplex:p})}d=0;for(let p=0;p=x[b-1].fx){let p=!1;if(S.fx>l.fx?(J(g,1+o,_,-o,l),g.fx=t(g),g.fx=1)break;for(let f=1;fc+r*i*h||u>=T)M=i;else{if(Math.abs(y)<=-a*h)return i;y*(M-x)>=0&&(M=x),x=i,T=u}return 0}for(let x=0;x<10;++x){if(J(e.x,1,s.x,i,n),u=e.fx=t(e.x,e.fxprime),y=$(e.fxprime,n),u>c+r*i*h||x&&u>=o)return b(d,i,o);if(Math.abs(y)<=-a*h)return i;if(y>=0)return b(i,d,u);o=u,d=i,i*=2}return i}function ge(t,n,s){let e={x:n.slice(),fx:0,fxprime:n.slice()},i={x:n.slice(),fx:0,fxprime:n.slice()},r=n.slice(),a,c,h=1,u;s=s||{},u=s.maxIterations||n.length*20,e.fx=t(e.x,e.fxprime),a=e.fxprime.slice(),xt(a,e.fxprime,-1);for(let o=0;o{let y={};for(let d=0;dmt(t,n,e)-s,0,t+n)}function xe(t,n={}){let s=n.distinct,e=t.map(c=>Object.assign({},c));function i(c){return c.join(";")}if(s){let c=new Map;for(let h of e)for(let u=0;uc===h?0:cr.sets.length===2).forEach(r=>{let a=s[r.sets[0]],c=s[r.sets[1]],h=Math.sqrt(n[a].size/Math.PI),u=Math.sqrt(n[c].size/Math.PI),o=yt(h,u,r.size);e[a][c]=e[c][a]=o;let y=0;r.size+1e-10>=Math.min(n[a].size,n[c].size)?y=1:r.size<=1e-10&&(y=-1),i[a][c]=i[c][a]=y}),{distances:e,constraints:i}}function pe(t,n,s,e){for(let r=0;r0&&x<=y||d<0&&x>=y||(i+=2*M*M,n[2*r]+=4*M*(a-u),n[2*r+1]+=4*M*(c-o),n[2*h]+=4*M*(u-a),n[2*h+1]+=4*M*(o-c))}}return i}function me(t,n={}){let s=ve(t,n),e=n.lossFunction||tt;if(t.length>=8){let i=be(t,n),r=e(i,t),a=e(s,t);r+1e-8d.map(b=>b/c));let h=(d,b)=>pe(d,b,r,a),u=null;for(let d=0;dy.sets.length===2);for(let y of t){let d=y.weight!=null?y.weight:1,b=y.sets[0],x=y.sets[1];y.size+Xt>=Math.min(e[b].size,e[x].size)&&(d=0),i[b].push({set:x,size:y.size,weight:d}),i[x].push({set:b,size:y.size,weight:d})}let r=[];Object.keys(i).forEach(y=>{let d=0;for(let b=0;bt[a]));let r=e.weight!=null?e.weight:1;s+=r*(i-e.size)*(i-e.size)}return s}function Zt(t,n){let s=0;for(let e of n){if(e.sets.length===1)continue;let i;if(e.sets.length===2){let c=t[e.sets[0]],h=t[e.sets[1]];i=mt(c.radius,h.radius,q(c,h))}else i=rt(e.sets.map(c=>t[c]));let r=e.weight!=null?e.weight:1,a=Math.log((i+1)/(e.size+1));s+=r*a*a}return s}function ke(t,n,s){if(s==null?t.sort((i,r)=>r.radius-i.radius):t.sort(s),t.length>0){let i=t[0].x,r=t[0].y;for(let a of t)a.x-=i,a.y-=r}if(t.length===2&&q(t[0],t[1])1){let i=Math.atan2(t[1].x,t[1].y)-n,r=Math.cos(i),a=Math.sin(i);for(let c of t){let h=c.x,u=c.y;c.x=r*h-a*u,c.y=a*h+r*u}}if(t.length>2){let i=Math.atan2(t[2].x,t[2].y)-n;for(;i<0;)i+=2*Math.PI;for(;i>2*Math.PI;)i-=2*Math.PI;if(i>Math.PI){let r=t[1].y/(1e-10+t[1].x);for(let a of t){var e=(a.x+r*a.y)/(1+r*r);a.x=2*e-a.x,a.y=2*e*r-a.y}}}}function Ie(t){t.forEach(i=>{i.parent=i});function n(i){return i.parent!==i&&(i.parent=n(i.parent)),i.parent}function s(i,r){let a=n(i),c=n(r);a.parent=c}for(let i=0;i{delete i.parent}),Array.from(e.values())}function pt(t){let n=s=>{let e=t.reduce((r,a)=>Math.max(r,a[s]+a.radius),Number.NEGATIVE_INFINITY),i=t.reduce((r,a)=>Math.min(r,a[s]-a.radius),Number.POSITIVE_INFINITY);return{max:e,min:i}};return{xRange:n("x"),yRange:n("y")}}function Jt(t,n,s){n==null&&(n=Math.PI/2);let e=te(t).map(u=>Object.assign({},u)),i=Ie(e);for(let u of i){ke(u,n,s);let o=pt(u);u.size=(o.xRange.max-o.xRange.min)*(o.yRange.max-o.yRange.min),u.bounds=o}i.sort((u,o)=>o.size-u.size),e=i[0];let r=e.bounds,a=(r.xRange.max-r.xRange.min)/50;function c(u,o,y){if(!u)return;let d=u.bounds,b,x;if(o)b=r.xRange.max-d.xRange.min+a;else{b=r.xRange.max-d.xRange.max;let M=(d.xRange.max-d.xRange.min)/2-(r.xRange.max-r.xRange.min)/2;M<0&&(b+=M)}if(y)x=r.yRange.max-d.yRange.min+a;else{x=r.yRange.max-d.yRange.max;let M=(d.yRange.max-d.yRange.min)/2-(r.yRange.max-r.yRange.min)/2;M<0&&(x+=M)}for(let M of u)M.x+=b,M.y+=x,e.push(M)}let h=1;for(;h({radius:o*b.radius,x:e+y+(b.x-a.min)*o,y:e+d+(b.y-c.min)*o,setid:b.setid})))}function $t(t){let n={};for(let s of t)n[s.setid]=s;return n}function te(t){return Object.keys(t).map(s=>Object.assign(t[s],{setid:s}))}function ee(t={}){let n=!1,s=600,e=350,i=15,r=1e3,a=Math.PI/2,c=!0,h=null,u=!0,o=!0,y=null,d=null,b=!1,x=null,M=t&&t.symmetricalTextCentre?t.symmetricalTextCentre:!1,T={},_=t&&t.colourScheme?t.colourScheme:t&&t.colorScheme?t.colorScheme:["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],S=0,g=function(p){if(p in T)return T[p];var f=T[p]=_[S];return S+=1,S>=_.length&&(S=0),f},m=Yt,v=tt;function l(p){let f=p.datum(),O=new Set;f.forEach(k=>{k.size==0&&k.sets.length==1&&O.add(k.sets[0])}),f=f.filter(k=>!k.sets.some(B=>O.has(B)));let I={},C={};if(f.length>0){let k=m(f,{lossFunction:v,distinct:b});c&&(k=Jt(k,a,d)),I=Qt(k,s,e,i,h),C=se(I,f,M)}let U={};f.forEach(k=>{k.label&&(U[k.sets]=k.label)});function P(k){if(k.sets in U)return U[k.sets];if(k.sets.length==1)return""+k.sets[0]}p.selectAll("svg").data([I]).enter().append("svg");let E=p.select("svg");n?E.attr("viewBox",`0 0 ${s} ${e}`):E.attr("width",s).attr("height",e);let D={},R=!1;E.selectAll(".venn-area path").each(function(k){let B=this.getAttribute("d");k.sets.length==1&&B&&!b&&(R=!0,D[k.sets[0]]=we(B))});function z(k){return B=>{let et=k.sets.map(Z=>{let X=D[Z],V=I[Z];return X||(X={x:s/2,y:e/2,radius:1}),V||(V={x:s/2,y:e/2,radius:1}),{x:X.x*(1-B)+V.x*B,y:X.y*(1-B)+V.y*B,radius:X.radius*(1-B)+V.radius*B}});return Gt(et,x)}}let N=E.selectAll(".venn-area").data(f,k=>k.sets),L=N.enter().append("g").attr("class",k=>`venn-area venn-${k.sets.length==1?"circle":"intersection"}${k.colour||k.color?" venn-coloured":""}`).attr("data-venn-sets",k=>k.sets.join("_")),F=L.append("path"),K=L.append("text").attr("class","label").text(k=>P(k)).attr("text-anchor","middle").attr("dy",".35em").attr("x",s/2).attr("y",e/2);o&&(F.style("fill-opacity","0").filter(k=>k.sets.length==1).style("fill",k=>k.colour?k.colour:k.color?k.color:g(k.sets)).style("fill-opacity",".25"),K.style("fill",k=>k.colour||k.color?"#FFF":t.textFill?t.textFill:k.sets.length==1?g(k.sets):"#444"));function H(k){return typeof k.transition=="function"?k.transition("venn").duration(r):k}let j=p;R&&typeof j.transition=="function"?(j=H(p),j.selectAll("path").attrTween("d",z)):j.selectAll("path").attr("d",k=>Gt(k.sets.map(B=>I[B])),x);let A=j.selectAll("text").filter(k=>k.sets in C).text(k=>P(k)).attr("x",k=>Math.floor(C[k.sets].x)).attr("y",k=>Math.floor(C[k.sets].y));u&&(R?"on"in A?A.on("end",ut(I,P)):A.each("end",ut(I,P)):A.each(ut(I,P)));let Y=H(N.exit()).remove();typeof N.transition=="function"&&Y.selectAll("path").attrTween("d",z);let G=Y.selectAll("text").attr("x",s/2).attr("y",e/2);return y!==null&&(K.style("font-size","0px"),A.style("font-size",y),G.style("font-size","0px")),{circles:I,textCentres:C,nodes:N,enter:L,update:j,exit:Y}}return l.wrap=function(p){return arguments.length?(u=p,l):u},l.useViewBox=function(){return n=!0,l},l.width=function(p){return arguments.length?(s=p,l):s},l.height=function(p){return arguments.length?(e=p,l):e},l.padding=function(p){return arguments.length?(i=p,l):i},l.distinct=function(p){return arguments.length?(b=p,l):b},l.colours=function(p){return arguments.length?(g=p,l):g},l.colors=function(p){return arguments.length?(g=p,l):g},l.fontSize=function(p){return arguments.length?(y=p,l):y},l.round=function(p){return arguments.length?(x=p,l):x},l.duration=function(p){return arguments.length?(r=p,l):r},l.layoutFunction=function(p){return arguments.length?(m=p,l):m},l.normalize=function(p){return arguments.length?(c=p,l):c},l.scaleToFit=function(p){return arguments.length?(h=p,l):h},l.styled=function(p){return arguments.length?(o=p,l):o},l.orientation=function(p){return arguments.length?(a=p,l):a},l.orientationOrder=function(p){return arguments.length?(d=p,l):d},l.lossFunction=function(p){return arguments.length?(v=p==="default"?tt:p==="logRatio"?Zt:p,l):v},l}function ut(t,n){return function(s){let e=this,i=t[s.sets[0]].radius||50,r=n(s)||"",a=r.split(/\s+/).reverse(),h=(r.length+a.length)/3,u=a.pop(),o=[u],y=0,d=1.1;e.textContent=null;let b=[];function x(g){let m=e.ownerDocument.createElementNS(e.namespaceURI,"tspan");return m.textContent=g,b.push(m),e.append(m),m}let M=x(u);for(;u=a.pop(),!!u;){o.push(u);let g=o.join(" ");M.textContent=g,g.length>h&&M.getComputedTextLength()>i&&(o.pop(),M.textContent=o.join(" "),o=[u],M=x(u),y++)}let T=.35-y*d/2,_=e.getAttribute("x"),S=e.getAttribute("y");b.forEach((g,m)=>{g.setAttribute("x",_),g.setAttribute("y",S),g.setAttribute("dy",`${T+m*d}em`)})}}function ft(t,n,s){let e=n[0].radius-q(n[0],t);for(let i=1;i=r&&(i=e[o],r=y)}let a=Ht(o=>-1*ft({x:o[0],y:o[1]},t,n),[i.x,i.y],{maxIterations:500,minErrorDelta:1e-10}).x,c={x:s?0:a[0],y:a[1]},h=!0;for(let o of t)if(q(c,o)>o.radius){h=!1;break}for(let o of n)if(q(c,o)o.p1))}function Me(t){let n={},s=Object.keys(t);for(let e of s)n[e]=[];for(let e=0;e0&&console.log("WARNING: area "+a+" not represented on screen")}return e}function Se(t,n,s){let e=[];return e.push(` -M`,t,n),e.push(` -m`,-s,0),e.push(` -a`,s,s,0,1,0,s*2,0),e.push(` -a`,s,s,0,1,0,-s*2,0),e.join(" ")}function we(t){let n=t.split(" ");return{x:Number.parseFloat(n[1]),y:Number.parseFloat(n[2]),radius:-Number.parseFloat(n[4])}}function ie(t){if(t.length===0)return[];let n={};return rt(t,n),n.arcs}function re(t,n){if(t.length===0)return"M 0 0";let s=Math.pow(10,n||0),e=n!=null?r=>Math.round(r*s)/s:r=>r;if(t.length==1){let r=t[0].circle;return Se(e(r.x),e(r.y),e(r.radius))}let i=[` -M`,e(t[0].p2.x),e(t[0].p2.y)];for(let r of t){let a=e(r.circle.radius);i.push(` -A`,a,a,0,r.large?1:0,r.sweep?1:0,e(r.p1.x),e(r.p1.y))}return i.join(" ")}function Gt(t,n){return re(ie(t),n)}function oe(t,n={}){let{lossFunction:s,layoutFunction:e=Yt,normalize:i=!0,orientation:r=Math.PI/2,orientationOrder:a,width:c=600,height:h=350,padding:u=15,scaleToFit:o=!1,symmetricalTextCentre:y=!1,distinct:d,round:b=2}=n,x=e(t,{lossFunction:s==="default"||!s?tt:s==="logRatio"?Zt:s,distinct:d});i&&(x=Jt(x,r,a));let M=Qt(x,c,h,u,o),T=se(M,t,y),_=new Map(Object.keys(M).map(m=>[m,{set:m,x:M[m].x,y:M[m].y,radius:M[m].radius}])),S=t.map(m=>{let v=m.sets.map(f=>_.get(f)),l=ie(v),p=re(l,b);return{circles:v,arcs:l,path:p,area:m,has:new Set(m.sets)}});function g(m){let v="";for(let l of S)l.has.size>m.length&&m.every(p=>l.has.has(p))&&(v+=" "+l.path);return v}return S.map(({circles:m,arcs:v,path:l,area:p})=>({data:p,text:T[p.sets],circles:m,arcs:v,path:l,distinctPath:l+g(p.sets)}))}var bt=(function(){var t=w(function(S,g,m,v){for(m=m||{},v=S.length;v--;m[S[v]]=g);return m},"o"),n=[5,8],s=[7,8,11,12,17,19,22,24],e=[1,17],i=[1,18],r=[7,8,11,12,14,15,16,17,19,20,21,22,24,27],a=[1,31],c=[1,39],h=[7,8,11,12,17,19,22,24,27],u=[1,57],o=[1,56],y=[1,58],d=[1,59],b=[1,60],x=[7,8,11,12,16,17,19,20,22,24,27,31,32,33],M={trace:w(function(){},"trace"),yy:{},symbols_:{error:2,start:3,optNewlines:4,VENN:5,document:6,EOF:7,NEWLINE:8,line:9,statement:10,TITLE:11,SET:12,identifier:13,BRACKET_LABEL:14,COLON:15,NUMERIC:16,UNION:17,identifierList:18,TEXT:19,IDENTIFIER:20,STRING:21,INDENT_TEXT:22,indentedTextTail:23,STYLE:24,stylesOpt:25,styleField:26,COMMA:27,styleValue:28,valueTokens:29,valueToken:30,HEXCOLOR:31,RGBCOLOR:32,RGBACOLOR:33,$accept:0,$end:1},terminals_:{2:"error",5:"VENN",7:"EOF",8:"NEWLINE",11:"TITLE",12:"SET",14:"BRACKET_LABEL",15:"COLON",16:"NUMERIC",17:"UNION",19:"TEXT",20:"IDENTIFIER",21:"STRING",22:"INDENT_TEXT",24:"STYLE",27:"COMMA",31:"HEXCOLOR",32:"RGBCOLOR",33:"RGBACOLOR"},productions_:[0,[3,4],[4,0],[4,2],[6,0],[6,2],[9,1],[9,1],[10,1],[10,2],[10,3],[10,4],[10,5],[10,2],[10,3],[10,4],[10,5],[10,3],[10,3],[10,3],[10,4],[10,4],[10,2],[10,3],[23,1],[23,1],[23,1],[23,2],[23,2],[25,1],[25,3],[26,3],[28,1],[28,1],[29,1],[29,2],[30,1],[30,1],[30,1],[30,1],[30,1],[18,1],[18,3],[13,1],[13,1]],performAction:w(function(g,m,v,l,p,f,O){var I=f.length-1;switch(p){case 1:return f[I-1];case 2:case 3:case 4:this.$=[];break;case 5:f[I-1].push(f[I]),this.$=f[I-1];break;case 6:this.$=[];break;case 7:case 22:case 32:case 36:case 37:case 38:case 39:case 40:this.$=f[I];break;case 8:l.setDiagramTitle(f[I].substr(6)),this.$=f[I].substr(6);break;case 9:l.addSubsetData([f[I]],void 0,void 0),l.setIndentMode&&l.setIndentMode(!0);break;case 10:l.addSubsetData([f[I-1]],f[I],void 0),l.setIndentMode&&l.setIndentMode(!0);break;case 11:l.addSubsetData([f[I-2]],void 0,parseFloat(f[I])),l.setIndentMode&&l.setIndentMode(!0);break;case 12:l.addSubsetData([f[I-3]],f[I-2],parseFloat(f[I])),l.setIndentMode&&l.setIndentMode(!0);break;case 13:if(f[I].length<2)throw new Error("union requires multiple identifiers");l.validateUnionIdentifiers&&l.validateUnionIdentifiers(f[I]),l.addSubsetData(f[I],void 0,void 0),l.setIndentMode&&l.setIndentMode(!0);break;case 14:if(f[I-1].length<2)throw new Error("union requires multiple identifiers");l.validateUnionIdentifiers&&l.validateUnionIdentifiers(f[I-1]),l.addSubsetData(f[I-1],f[I],void 0),l.setIndentMode&&l.setIndentMode(!0);break;case 15:if(f[I-2].length<2)throw new Error("union requires multiple identifiers");l.validateUnionIdentifiers&&l.validateUnionIdentifiers(f[I-2]),l.addSubsetData(f[I-2],void 0,parseFloat(f[I])),l.setIndentMode&&l.setIndentMode(!0);break;case 16:if(f[I-3].length<2)throw new Error("union requires multiple identifiers");l.validateUnionIdentifiers&&l.validateUnionIdentifiers(f[I-3]),l.addSubsetData(f[I-3],f[I-2],parseFloat(f[I])),l.setIndentMode&&l.setIndentMode(!0);break;case 17:case 18:case 19:l.addTextData(f[I-1],f[I],void 0);break;case 20:case 21:l.addTextData(f[I-2],f[I-1],f[I]);break;case 23:l.addStyleData(f[I-1],f[I]);break;case 24:case 25:case 26:var C=l.getCurrentSets();if(!C)throw new Error("text requires set");l.addTextData(C,f[I],void 0);break;case 27:case 28:var C=l.getCurrentSets();if(!C)throw new Error("text requires set");l.addTextData(C,f[I-1],f[I]);break;case 29:case 41:this.$=[f[I]];break;case 30:case 42:this.$=[...f[I-2],f[I]];break;case 31:this.$=[f[I-2],f[I]];break;case 33:this.$=f[I].join(" ");break;case 34:this.$=[f[I]];break;case 35:f[I-1].push(f[I]),this.$=f[I-1];break;case 43:case 44:this.$=f[I];break}},"anonymous"),table:[t(n,[2,2],{3:1,4:2}),{1:[3]},{5:[1,3],8:[1,4]},t(s,[2,4],{6:5}),t(n,[2,3]),{7:[1,6],8:[1,8],9:7,10:9,11:[1,10],12:[1,11],17:[1,12],19:[1,13],22:[1,14],24:[1,15]},{1:[2,1]},t(s,[2,5]),t(s,[2,6]),t(s,[2,7]),t(s,[2,8]),{13:16,20:e,21:i},{13:20,18:19,20:e,21:i},{13:20,18:21,20:e,21:i},{16:[1,25],20:[1,23],21:[1,24],23:22},{13:20,18:26,20:e,21:i},t(s,[2,9],{14:[1,27],15:[1,28]}),t(r,[2,43]),t(r,[2,44]),t(s,[2,13],{14:[1,29],15:[1,30],27:a}),t(r,[2,41]),{16:[1,34],20:[1,32],21:[1,33],27:a},t(s,[2,22]),t(s,[2,24],{14:[1,35]}),t(s,[2,25],{14:[1,36]}),t(s,[2,26]),{20:c,25:37,26:38,27:a},t(s,[2,10],{15:[1,40]}),{16:[1,41]},t(s,[2,14],{15:[1,42]}),{16:[1,43]},{13:44,20:e,21:i},t(s,[2,17],{14:[1,45]}),t(s,[2,18],{14:[1,46]}),t(s,[2,19]),t(s,[2,27]),t(s,[2,28]),t(s,[2,23],{27:[1,47]}),t(h,[2,29]),{15:[1,48]},{16:[1,49]},t(s,[2,11]),{16:[1,50]},t(s,[2,15]),t(r,[2,42]),t(s,[2,20]),t(s,[2,21]),{20:c,26:51},{16:u,20:o,21:[1,53],28:52,29:54,30:55,31:y,32:d,33:b},t(s,[2,12]),t(s,[2,16]),t(h,[2,30]),t(h,[2,31]),t(h,[2,32]),t(h,[2,33],{30:61,16:u,20:o,31:y,32:d,33:b}),t(x,[2,34]),t(x,[2,36]),t(x,[2,37]),t(x,[2,38]),t(x,[2,39]),t(x,[2,40]),t(x,[2,35])],defaultActions:{6:[2,1]},parseError:w(function(g,m){if(m.recoverable)this.trace(g);else{var v=new Error(g);throw v.hash=m,v}},"parseError"),parse:w(function(g){var m=this,v=[0],l=[],p=[null],f=[],O=this.table,I="",C=0,U=0,P=0,E=2,D=1,R=f.slice.call(arguments,1),z=Object.create(this.lexer),N={yy:{}};for(var L in this.yy)Object.prototype.hasOwnProperty.call(this.yy,L)&&(N.yy[L]=this.yy[L]);z.setInput(g,N.yy),N.yy.lexer=z,N.yy.parser=this,typeof z.yylloc>"u"&&(z.yylloc={});var F=z.yylloc;f.push(F);var K=z.options&&z.options.ranges;typeof N.yy.parseError=="function"?this.parseError=N.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function H(W){v.length=v.length-2*W,p.length=p.length-W,f.length=f.length-W}w(H,"popStack");function j(){var W;return W=l.pop()||z.lex()||D,typeof W!="number"&&(W instanceof Array&&(l=W,W=l.pop()),W=m.symbols_[W]||W),W}w(j,"lex");for(var A,Y,G,k,B,et,Z={},X,V,_t,st;;){if(G=v[v.length-1],this.defaultActions[G]?k=this.defaultActions[G]:((A===null||typeof A>"u")&&(A=j()),k=O[G]&&O[G][A]),typeof k>"u"||!k.length||!k[0]){var at="";st=[];for(X in O[G])this.terminals_[X]&&X>E&&st.push("'"+this.terminals_[X]+"'");z.showPosition?at="Parse error on line "+(C+1)+`: -`+z.showPosition()+` -Expecting `+st.join(", ")+", got '"+(this.terminals_[A]||A)+"'":at="Parse error on line "+(C+1)+": Unexpected "+(A==D?"end of input":"'"+(this.terminals_[A]||A)+"'"),this.parseError(at,{text:z.match,token:this.terminals_[A]||A,line:z.yylineno,loc:F,expected:st})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+G+", token: "+A);switch(k[0]){case 1:v.push(A),p.push(z.yytext),f.push(z.yylloc),v.push(k[1]),A=null,Y?(A=Y,Y=null):(U=z.yyleng,I=z.yytext,C=z.yylineno,F=z.yylloc,P>0&&P--);break;case 2:if(V=this.productions_[k[1]][1],Z.$=p[p.length-V],Z._$={first_line:f[f.length-(V||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(V||1)].first_column,last_column:f[f.length-1].last_column},K&&(Z._$.range=[f[f.length-(V||1)].range[0],f[f.length-1].range[1]]),et=this.performAction.apply(Z,[I,U,C,N.yy,k[1],p,f].concat(R)),typeof et<"u")return et;V&&(v=v.slice(0,-1*V*2),p=p.slice(0,-1*V),f=f.slice(0,-1*V)),v.push(this.productions_[k[1]][0]),p.push(Z.$),f.push(Z._$),_t=O[v[v.length-2]][v[v.length-1]],v.push(_t);break;case 3:return!0}}return!0},"parse")},T=(function(){var S={EOF:1,parseError:w(function(m,v){if(this.yy.parser)this.yy.parser.parseError(m,v);else throw new Error(m)},"parseError"),setInput:w(function(g,m){return this.yy=m||this.yy||{},this._input=g,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:w(function(){var g=this._input[0];this.yytext+=g,this.yyleng++,this.offset++,this.match+=g,this.matched+=g;var m=g.match(/(?:\r\n?|\n).*/g);return m?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),g},"input"),unput:w(function(g){var m=g.length,v=g.split(/(?:\r\n?|\n)/g);this._input=g+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-m),this.offset-=m;var l=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),v.length-1&&(this.yylineno-=v.length-1);var p=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:v?(v.length===l.length?this.yylloc.first_column:0)+l[l.length-v.length].length-v[0].length:this.yylloc.first_column-m},this.options.ranges&&(this.yylloc.range=[p[0],p[0]+this.yyleng-m]),this.yyleng=this.yytext.length,this},"unput"),more:w(function(){return this._more=!0,this},"more"),reject:w(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:w(function(g){this.unput(this.match.slice(g))},"less"),pastInput:w(function(){var g=this.matched.substr(0,this.matched.length-this.match.length);return(g.length>20?"...":"")+g.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:w(function(){var g=this.match;return g.length<20&&(g+=this._input.substr(0,20-g.length)),(g.substr(0,20)+(g.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:w(function(){var g=this.pastInput(),m=new Array(g.length+1).join("-");return g+this.upcomingInput()+` -`+m+"^"},"showPosition"),test_match:w(function(g,m){var v,l,p;if(this.options.backtrack_lexer&&(p={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(p.yylloc.range=this.yylloc.range.slice(0))),l=g[0].match(/(?:\r\n?|\n).*/g),l&&(this.yylineno+=l.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:l?l[l.length-1].length-l[l.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+g[0].length},this.yytext+=g[0],this.match+=g[0],this.matches=g,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(g[0].length),this.matched+=g[0],v=this.performAction.call(this,this.yy,this,m,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),v)return v;if(this._backtrack){for(var f in p)this[f]=p[f];return!1}return!1},"test_match"),next:w(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var g,m,v,l;this._more||(this.yytext="",this.match="");for(var p=this._currentRules(),f=0;fm[0].length)){if(m=v,l=f,this.options.backtrack_lexer){if(g=this.test_match(v,p[f]),g!==!1)return g;if(this._backtrack){m=!1;continue}else return!1}else if(!this.options.flex)break}return m?(g=this.test_match(m,p[l]),g!==!1?g:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:w(function(){var m=this.next();return m||this.lex()},"lex"),begin:w(function(m){this.conditionStack.push(m)},"begin"),popState:w(function(){var m=this.conditionStack.length-1;return m>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:w(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:w(function(m){return m=this.conditionStack.length-1-Math.abs(m||0),m>=0?this.conditionStack[m]:"INITIAL"},"topState"),pushState:w(function(m){this.begin(m)},"pushState"),stateStackSize:w(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:w(function(m,v,l,p){var f=p;switch(l){case 0:break;case 1:break;case 2:break;case 3:if(m.getIndentMode&&m.getIndentMode())return m.consumeIndentText=!0,this.begin("INITIAL"),22;break;case 4:break;case 5:m.setIndentMode&&m.setIndentMode(!1),this.begin("INITIAL"),this.unput(v.yytext);break;case 6:return this.begin("bol"),8;break;case 7:break;case 8:break;case 9:return 7;case 10:return 11;case 11:return 5;case 12:return 12;case 13:return 17;case 14:if(m.consumeIndentText)m.consumeIndentText=!1;else return 19;break;case 15:return 24;case 16:return v.yytext=v.yytext.slice(2,-2),14;break;case 17:return v.yytext=v.yytext.slice(1,-1).trim(),14;break;case 18:return 16;case 19:return 31;case 20:return 33;case 21:return 32;case 22:return 20;case 23:return 21;case 24:return 27;case 25:return 15}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[ \t]+(?=[\n\r]))/i,/^(?:[ \t]+(?=text\b))/i,/^(?:[ \t]+)/i,/^(?:[^ \t\n\r])/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[ \t]+)/i,/^(?:$)/i,/^(?:title\s[^#\n;]+)/i,/^(?:venn-beta\b)/i,/^(?:set\b)/i,/^(?:union\b)/i,/^(?:text\b)/i,/^(?:style\b)/i,/^(?:\["[^\"]*"\])/i,/^(?:\[[^\]\"]+\])/i,/^(?:[+-]?(\d+(\.\d+)?|\.\d+))/i,/^(?:#[0-9a-fA-F]{3,8})/i,/^(?:rgba\(\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*\))/i,/^(?:rgb\(\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*\))/i,/^(?:[A-Za-z_][A-Za-z0-9\-_]*)/i,/^(?:"[^\"]*")/i,/^(?:,)/i,/^(?::)/i],conditions:{bol:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],inclusive:!0},INITIAL:{rules:[0,1,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],inclusive:!0}}};return S})();M.lexer=T;function _(){this.yy={}}return w(_,"Parser"),_.prototype=M,M.Parser=_,new _})();bt.parser=bt;var Ee=bt,vt=[],kt=[],It=[],Mt=new Set,St,wt=!1,Te=w((t,n,s)=>{let e=ot(t).sort(),i=s??10/Math.pow(t.length,2);St=e,e.length===1&&Mt.add(e[0]),vt.push({sets:e,size:i,label:n?nt(n):void 0})},"addSubsetData"),ze=w(()=>vt,"getSubsetData"),nt=w(t=>{let n=t.trim();return n.length>=2&&n.startsWith('"')&&n.endsWith('"')?n.slice(1,-1):n},"normalizeText"),Ae=w(t=>t&&nt(t),"normalizeStyleValue"),De=w((t,n,s)=>{let e=nt(n);kt.push({sets:ot(t).sort(),id:e,label:s?nt(s):void 0})},"addTextData"),Re=w((t,n)=>{let s=ot(t).sort(),e={};for(let[i,r]of n)e[i]=Ae(r)??r;It.push({targets:s,styles:e})},"addStyleData"),Ce=w(()=>It,"getStyleData"),ot=w(t=>t.map(n=>nt(n)),"normalizeIdentifierList"),Ne=w(t=>{let s=ot(t).filter(e=>!Mt.has(e));if(s.length>0)throw new Error(`unknown set identifier: ${s.join(", ")}`)},"validateUnionIdentifiers"),Oe=w(()=>kt,"getTextData"),Le=w(()=>St,"getCurrentSets"),Fe=w(()=>wt,"getIndentMode"),je=w(t=>{wt=t},"setIndentMode"),Pe=Dt.venn;function ae(){return Bt(Pe,ct().venn)}w(ae,"getConfig");var Ve=w(()=>{Ct(),vt.length=0,kt.length=0,It.length=0,Mt.clear(),St=void 0,wt=!1},"customClear"),Be={getConfig:ae,clear:Ve,setAccTitle:Nt,getAccTitle:Ot,setDiagramTitle:jt,getDiagramTitle:Pt,getAccDescription:Ft,setAccDescription:Lt,addSubsetData:Te,getSubsetData:ze,addTextData:De,addStyleData:Re,validateUnionIdentifiers:Ne,getTextData:Oe,getStyleData:Ce,getCurrentSets:Le,getIndentMode:Fe,setIndentMode:je},qe=w(t=>` - .venn-title { - font-size: 32px; - fill: ${t.vennTitleTextColor}; - font-family: ${t.fontFamily}; - } - - .venn-circle text { - font-size: 48px; - font-family: ${t.fontFamily}; - } - - .venn-intersection text { - font-size: 48px; - fill: ${t.vennSetTextColor}; - font-family: ${t.fontFamily}; - } - - .venn-text-node { - font-family: ${t.fontFamily}; - color: ${t.vennSetTextColor}; - } -`,"getStyles"),Ue=qe;function le(t){let n=new Map;for(let s of t){let e=s.targets.join("|"),i=n.get(e);i?Object.assign(i,s.styles):n.set(e,Et({},s.styles))}return n}w(le,"buildStyleByKey");var Ge=w((t,n,s,e)=>{let i=e.db,r=i.getConfig?.(),{themeVariables:a,look:c,handDrawnSeed:h}=ct(),u=c==="handDrawn",o=[a.venn1,a.venn2,a.venn3,a.venn4,a.venn5,a.venn6,a.venn7,a.venn8].filter(Boolean),y=i.getDiagramTitle?.(),d=i.getSubsetData(),b=i.getTextData(),x=le(i.getStyleData()),M=r?.width??800,T=r?.height??450,S=M/1600,g=y?48*S:0,m=a.primaryTextColor??a.textColor,v=Vt(n);v.attr("viewBox",`0 0 ${M} ${T}`),y&&v.append("text").text(y).attr("class","venn-title").attr("font-size",`${32*S}px`).attr("text-anchor","middle").attr("dominant-baseline","middle").attr("x","50%").attr("y",32*S).style("fill",a.vennTitleTextColor||a.titleColor);let l=it(document.createElement("div")),p=ee().width(M).height(T-g);l.datum(d).call(p);let f=u?qt.svg(l.select("svg").node()):void 0,O=oe(d,{width:M,height:T-g,padding:r?.padding??15}),I=new Map;for(let E of O){let D=Q([...E.data.sets].sort());I.set(D,E)}b.length>0&&ce(r,I,l,b,S,x);let C=Tt(a.background||"#f4f4f4");l.selectAll(".venn-circle").each(function(E,D){let R=it(this),N=Q([...E.sets].sort()),L=x.get(N),F=L?.fill||o[D%o.length]||a.primaryColor;R.classed(`venn-set-${D%8}`,!0);let K=L?.["fill-opacity"]??.1,H=L?.stroke||F,j=L?.["stroke-width"]||`${5*S}`;if(u&&f){let Y=I.get(N);if(Y&&Y.circles.length>0){let G=Y.circles[0],k=f.circle(G.x,G.y,G.radius*2,{roughness:.7,seed:h,fill:lt(F,.7),fillStyle:"hachure",fillWeight:2,hachureGap:8,hachureAngle:-41+D*60,stroke:H,strokeWidth:parseFloat(String(j))});R.select("path").remove(),R.node()?.insertBefore(k,R.select("text").node())}}else R.select("path").style("fill",F).style("fill-opacity",K).style("stroke",H).style("stroke-width",j).style("stroke-opacity",.95);let A=L?.color||(C?zt(F,30):At(F,30));R.select("text").style("font-size",`${48*S}px`).style("fill",A)}),u&&f?l.selectAll(".venn-intersection").each(function(E){let D=it(this),z=Q([...E.sets].sort()),N=x.get(z),L=N?.fill;if(L){let F=D.select("path"),K=F.attr("d");if(K){let H=f.path(K,{roughness:.7,seed:h,fill:lt(L,.3),fillStyle:"cross-hatch",fillWeight:2,hachureGap:6,hachureAngle:60,stroke:"none"}),j=F.node();j?.parentNode?.insertBefore(H,j),F.remove()}}else D.select("path").style("fill-opacity",0);D.select("text").style("font-size",`${48*S}px`).style("fill",N?.color??a.vennSetTextColor??m)}):(l.selectAll(".venn-intersection text").style("font-size",`${48*S}px`).style("fill",E=>{let R=Q([...E.sets].sort());return x.get(R)?.color??a.vennSetTextColor??m}),l.selectAll(".venn-intersection path").style("fill-opacity",E=>{let R=Q([...E.sets].sort());return x.get(R)?.fill?1:0}).style("fill",E=>{let R=Q([...E.sets].sort());return x.get(R)?.fill??"transparent"}));let U=v.append("g").attr("transform",`translate(0, ${g})`),P=l.select("svg").node();if(P&&"childNodes"in P)for(let E of[...P.childNodes])U.node()?.appendChild(E);Rt(v,T,M,r?.useMaxWidth??!0)},"draw");function Q(t){return t.join("|")}w(Q,"stableSetsKey");function ce(t,n,s,e,i,r){let a=t?.useDebugLayout??!1,h=s.select("svg").append("g").attr("class","venn-text-nodes"),u=new Map;for(let o of e){let y=Q(o.sets),d=u.get(y);d?d.push(o):u.set(y,[o])}for(let[o,y]of u.entries()){let d=n.get(o);if(!d?.text)continue;let b=d.text.x,x=d.text.y,M=Math.min(...d.circles.map(E=>E.radius)),T=Math.min(...d.circles.map(E=>E.radius-Math.hypot(b-E.x,x-E.y))),_=Number.isFinite(T)?Math.max(0,T):0;_===0&&Number.isFinite(M)&&(_=M*.6);let S=h.append("g").attr("class","venn-text-area").attr("font-size",`${40*i}px`);a&&S.append("circle").attr("class","venn-text-debug-circle").attr("cx",b).attr("cy",x).attr("r",_).attr("fill","none").attr("stroke","purple").attr("stroke-width",1.5*i).attr("stroke-dasharray",`${6*i} ${4*i}`);let g=Math.max(80*i,_*2*.95),m=Math.max(60*i,_*2*.95),p=(d.data.label&&d.data.label.length>0?Math.min(32*i,_*.25):0)+(y.length<=2?30*i:0),f=b-g/2,O=x-m/2+p,I=Math.max(1,Math.ceil(Math.sqrt(y.length))),C=Math.max(1,Math.ceil(y.length/I)),U=g/I,P=m/C;for(let[E,D]of y.entries()){let R=E%I,z=Math.floor(E/I),N=f+U*(R+.5),L=O+P*(z+.5);a&&S.append("rect").attr("class","venn-text-debug-cell").attr("x",f+U*R).attr("y",O+P*z).attr("width",U).attr("height",P).attr("fill","none").attr("stroke","teal").attr("stroke-width",1*i).attr("stroke-dasharray",`${4*i} ${3*i}`);let F=U*.9,K=P*.9,H=S.append("foreignObject").attr("class","venn-text-node-fo").attr("width",F).attr("height",K).attr("x",N-F/2).attr("y",L-K/2).attr("overflow","visible"),j=r.get(D.id)?.color,A=H.append("xhtml:span").attr("class","venn-text-node").style("display","flex").style("width","100%").style("height","100%").style("white-space","normal").style("align-items","center").style("justify-content","center").style("text-align","center").style("overflow-wrap","normal").style("word-break","normal").text(D.label??D.id);j&&A.style("color",j)}}}w(ce,"renderTextNodes");var We={draw:Ge},$e={parser:Ee,db:Be,renderer:We,styles:Ue};export{$e as diagram}; diff --git a/src/google/adk/cli/browser/chunk-LA76DWZL.js b/src/google/adk/cli/browser/chunk-LA76DWZL.js deleted file mode 100644 index d2277db602..0000000000 --- a/src/google/adk/cli/browser/chunk-LA76DWZL.js +++ /dev/null @@ -1,70 +0,0 @@ -import{a as dt}from"./chunk-TPDTRWWV.js";import{a as ft}from"./chunk-PRKFGJVH.js";import{k as yt}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{M as nt,N as at,R as rt,S as lt,T as ot,U as ht,V as ct,W as Q,X as ut,Y as J}from"./chunk-QFMJV7VH.js";import{g as l}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";var et=(function(){var t=l(function(M,e,s,i){for(s=s||{},i=M.length;i--;s[M[i]]=e);return s},"o"),d=[1,4],a=[1,14],r=[1,12],o=[1,13],y=[6,7,8],p=[1,20],u=[1,18],w=[1,19],c=[6,7,11],m=[1,6,13,14],k=[1,23],_=[1,24],x=[1,6,7,11,13,14],N={trace:l(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ishikawa:4,spaceLines:5,SPACELINE:6,NL:7,ISHIKAWA:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,TEXT:14,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"ISHIKAWA",11:"EOF",13:"SPACELIST",14:"TEXT"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,1],[12,1],[12,1]],performAction:l(function(e,s,i,h,f,n,v){var b=n.length-1;switch(f){case 6:case 7:return h;case 15:h.addNode(n[b-1].length,n[b].trim());break;case 16:h.addNode(0,n[b].trim());break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:d},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:d},{6:a,7:[1,10],9:9,12:11,13:r,14:o},t(y,[2,3]),{1:[2,2]},t(y,[2,4]),t(y,[2,5]),{1:[2,6],6:a,12:15,13:r,14:o},{6:a,9:16,12:11,13:r,14:o},{6:p,7:u,10:17,11:w},t(c,[2,18],{14:[1,21]}),t(c,[2,16]),t(c,[2,17]),{6:p,7:u,10:22,11:w},{1:[2,7],6:a,12:15,13:r,14:o},t(m,[2,14],{7:k,11:_}),t(x,[2,8]),t(x,[2,9]),t(x,[2,10]),t(c,[2,15]),t(m,[2,13],{7:k,11:_}),t(x,[2,11]),t(x,[2,12])],defaultActions:{2:[2,1],6:[2,2]},parseError:l(function(e,s){if(s.recoverable)this.trace(e);else{var i=new Error(e);throw i.hash=s,i}},"parseError"),parse:l(function(e){var s=this,i=[0],h=[],f=[null],n=[],v=this.table,b="",I=0,S=0,A=0,L=2,O=1,Z=n.slice.call(arguments,1),g=Object.create(this.lexer),E={yy:{}};for(var V in this.yy)Object.prototype.hasOwnProperty.call(this.yy,V)&&(E.yy[V]=this.yy[V]);g.setInput(e,E.yy),E.yy.lexer=g,E.yy.parser=this,typeof g.yylloc>"u"&&(g.yylloc={});var R=g.yylloc;n.push(R);var X=g.options&&g.options.ranges;typeof E.yy.parseError=="function"?this.parseError=E.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function xt(P){i.length=i.length-2*P,f.length=f.length-P,n.length=n.length-P}l(xt,"popStack");function it(){var P;return P=h.pop()||g.lex()||O,typeof P!="number"&&(P instanceof Array&&(h=P,P=h.pop()),P=s.symbols_[P]||P),P}l(it,"lex");for(var T,Y,W,B,Vt,K,F={},H,C,st,G;;){if(W=i[i.length-1],this.defaultActions[W]?B=this.defaultActions[W]:((T===null||typeof T>"u")&&(T=it()),B=v[W]&&v[W][T]),typeof B>"u"||!B.length||!B[0]){var q="";G=[];for(H in v[W])this.terminals_[H]&&H>L&&G.push("'"+this.terminals_[H]+"'");g.showPosition?q="Parse error on line "+(I+1)+`: -`+g.showPosition()+` -Expecting `+G.join(", ")+", got '"+(this.terminals_[T]||T)+"'":q="Parse error on line "+(I+1)+": Unexpected "+(T==O?"end of input":"'"+(this.terminals_[T]||T)+"'"),this.parseError(q,{text:g.match,token:this.terminals_[T]||T,line:g.yylineno,loc:R,expected:G})}if(B[0]instanceof Array&&B.length>1)throw new Error("Parse Error: multiple actions possible at state: "+W+", token: "+T);switch(B[0]){case 1:i.push(T),f.push(g.yytext),n.push(g.yylloc),i.push(B[1]),T=null,Y?(T=Y,Y=null):(S=g.yyleng,b=g.yytext,I=g.yylineno,R=g.yylloc,A>0&&A--);break;case 2:if(C=this.productions_[B[1]][1],F.$=f[f.length-C],F._$={first_line:n[n.length-(C||1)].first_line,last_line:n[n.length-1].last_line,first_column:n[n.length-(C||1)].first_column,last_column:n[n.length-1].last_column},X&&(F._$.range=[n[n.length-(C||1)].range[0],n[n.length-1].range[1]]),K=this.performAction.apply(F,[b,S,I,E.yy,B[1],f,n].concat(Z)),typeof K<"u")return K;C&&(i=i.slice(0,-1*C*2),f=f.slice(0,-1*C),n=n.slice(0,-1*C)),i.push(this.productions_[B[1]][0]),f.push(F.$),n.push(F._$),st=v[i[i.length-2]][i[i.length-1]],i.push(st);break;case 3:return!0}}return!0},"parse")},D=(function(){var M={EOF:1,parseError:l(function(s,i){if(this.yy.parser)this.yy.parser.parseError(s,i);else throw new Error(s)},"parseError"),setInput:l(function(e,s){return this.yy=s||this.yy||{},this._input=e,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:l(function(){var e=this._input[0];this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e;var s=e.match(/(?:\r\n?|\n).*/g);return s?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e},"input"),unput:l(function(e){var s=e.length,i=e.split(/(?:\r\n?|\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-s),this.offset-=s;var h=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),i.length-1&&(this.yylineno-=i.length-1);var f=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:i?(i.length===h.length?this.yylloc.first_column:0)+h[h.length-i.length].length-i[0].length:this.yylloc.first_column-s},this.options.ranges&&(this.yylloc.range=[f[0],f[0]+this.yyleng-s]),this.yyleng=this.yytext.length,this},"unput"),more:l(function(){return this._more=!0,this},"more"),reject:l(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:l(function(e){this.unput(this.match.slice(e))},"less"),pastInput:l(function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:l(function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:l(function(){var e=this.pastInput(),s=new Array(e.length+1).join("-");return e+this.upcomingInput()+` -`+s+"^"},"showPosition"),test_match:l(function(e,s){var i,h,f;if(this.options.backtrack_lexer&&(f={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(f.yylloc.range=this.yylloc.range.slice(0))),h=e[0].match(/(?:\r\n?|\n).*/g),h&&(this.yylineno+=h.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:h?h[h.length-1].length-h[h.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],i=this.performAction.call(this,this.yy,this,s,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),i)return i;if(this._backtrack){for(var n in f)this[n]=f[n];return!1}return!1},"test_match"),next:l(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var e,s,i,h;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),n=0;ns[0].length)){if(s=i,h=n,this.options.backtrack_lexer){if(e=this.test_match(i,f[n]),e!==!1)return e;if(this._backtrack){s=!1;continue}else return!1}else if(!this.options.flex)break}return s?(e=this.test_match(s,f[h]),e!==!1?e:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:l(function(){var s=this.next();return s||this.lex()},"lex"),begin:l(function(s){this.conditionStack.push(s)},"begin"),popState:l(function(){var s=this.conditionStack.length-1;return s>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:l(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:l(function(s){return s=this.conditionStack.length-1-Math.abs(s||0),s>=0?this.conditionStack[s]:"INITIAL"},"topState"),pushState:l(function(s){this.begin(s)},"pushState"),stateStackSize:l(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:l(function(s,i,h,f){var n=f;switch(h){case 0:return 6;case 1:return 8;case 2:return 8;case 3:return 6;case 4:return 7;case 5:return 13;case 6:return 14;case 7:return 11}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:ishikawa-beta\b)/i,/^(?:ishikawa\b)/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:[^\n]+)/i,/^(?:$)/i],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7],inclusive:!0}}};return M})();N.lexer=D;function $(){this.yy={}}return l($,"Parser"),$.prototype=N,N.Parser=$,new $})();et.parser=et;var vt=et,St=class{constructor(){this.stack=[],this.clear=this.clear.bind(this),this.addNode=this.addNode.bind(this),this.getRoot=this.getRoot.bind(this)}static{l(this,"IshikawaDB")}clear(){this.root=void 0,this.stack=[],this.baseLevel=void 0,rt()}getRoot(){return this.root}addNode(t,d){let a=nt.sanitizeText(d,J());if(!this.root){this.baseLevel=t,this.root={text:a,children:[]},this.stack=[{level:0,node:this.root}],Q(a);return}let r=t-(this.baseLevel??0);for(r<=0&&(r=1);this.stack.length>1&&this.stack[this.stack.length-1].level>=r;)this.stack.pop();let o=this.stack[this.stack.length-1].node,y={text:a,children:[]};o.children.push(y),this.stack.push({level:r,node:y})}getAccTitle(){return ot()}setAccTitle(t){lt(t)}getAccDescription(){return ct()}setAccDescription(t){ht(t)}getDiagramTitle(){return ut()}setDiagramTitle(t){Q(t)}},Et=14,j=250,$t=30,At=60,It=5,bt=82*Math.PI/180,pt=Math.cos(bt),gt=Math.sin(bt),kt=l((t,d,a)=>{let r=t.node().getBBox(),o=r.width+d*2,y=r.height+d*2;at(t,y,o,a),t.attr("viewBox",`${r.x-d} ${r.y-d} ${o} ${y}`)},"applyPaddedViewBox"),Lt=l((t,d,a,r)=>{let y=r.db.getRoot();if(!y)return;let p=J(),{look:u,handDrawnSeed:w,themeVariables:c}=p,m=yt(p.fontSize)[0]??Et,k=u==="handDrawn",_=y.children??[],x=p.ishikawa?.diagramPadding??20,N=p.ishikawa?.useMaxWidth??!1,D=dt(d),$=D.append("g").attr("class","ishikawa"),M=k?ft.svg(D.node()):void 0,e=M?{roughSvg:M,seed:w??0,lineColor:c?.lineColor??"#333",fillColor:c?.mainBkg??"#fff"}:void 0,s=`ishikawa-arrow-${d}`;k||$.append("defs").append("marker").attr("id",s).attr("viewBox","0 0 10 10").attr("refX",0).attr("refY",5).attr("markerWidth",6).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 Z").attr("class","ishikawa-arrow");let i=0,h=j,f=k?void 0:z($,i,h,i,h,"ishikawa-spine");if(Tt($,i,h,y.text,m,e),!_.length){k&&z($,i,h,i,h,"ishikawa-spine",e),kt(D,x,N);return}i-=20;let n=_.filter((g,E)=>E%2===0),v=_.filter((g,E)=>E%2===1),b=mt(n),I=mt(v),S=b.total+I.total,A=j,L=j;if(S>0){let g=j*2,E=j*.3;A=Math.max(E,g*(b.total/S)),L=Math.max(E,g*(I.total/S))}let O=m*2;A=Math.max(A,b.max*O),L=Math.max(L,I.max*O),h=Math.max(A,j),f&&f.attr("y1",h).attr("y2",h),$.select(".ishikawa-head-group").attr("transform",`translate(0,${h})`);let Z=Math.ceil(_.length/2);for(let g=0;gMath.min(V,R.getBBox().x),1/0)}if(k)z($,i,h,0,h,"ishikawa-spine",e);else{f.attr("x1",i);let g=`url(#${s})`;$.selectAll("line.ishikawa-branch, line.ishikawa-sub-branch").attr("marker-start",g)}kt(D,x,N)},"draw"),mt=l(t=>{let d=l(a=>a.children.reduce((r,o)=>r+1+d(o),0),"countDescendants");return t.reduce((a,r)=>{let o=d(r);return a.total+=o,a.max=Math.max(a.max,o),a},{total:0,max:0})},"sideStats"),Tt=l((t,d,a,r,o,y)=>{let p=Math.max(6,Math.floor(110/(o*.6))),u=t.append("g").attr("class","ishikawa-head-group").attr("transform",`translate(${d},${a})`),w=U(u,_t(r,p),0,0,"ishikawa-head-label","start",o),c=w.node().getBBox(),m=Math.max(60,c.width+6),k=Math.max(40,c.height*2+40),_=`M 0 ${-k/2} L 0 ${k/2} Q ${m*2.4} 0 0 ${-k/2} Z`;if(y){let x=y.roughSvg.path(_,{roughness:1.5,seed:y.seed,fill:y.fillColor,fillStyle:"hachure",fillWeight:2.5,hachureGap:5,stroke:y.lineColor,strokeWidth:2});u.insert(()=>x,":first-child").attr("class","ishikawa-head")}else u.insert("path",":first-child").attr("class","ishikawa-head").attr("d",_);w.attr("transform",`translate(${(m-c.width)/2-c.x+3},${-c.y-c.height/2})`)},"drawHead"),Mt=l((t,d)=>{let a=[],r=[],o=l((y,p,u)=>{let w=d===-1?[...y].reverse():y;for(let c of w){let m=a.length,k=c.children??[];a.push({depth:u,text:_t(c.text,15),parentIndex:p,childCount:k.length}),u%2===0?(r.push(m),k.length&&o(k,m,u+1)):(k.length&&o(k,m,u+1),r.push(m))}},"walk");return o(t,-1,2),{entries:a,yOrder:r}},"flattenTree"),Pt=l((t,d,a,r,o,y,p)=>{let u=t.append("g").attr("class","ishikawa-label-group"),c=U(u,d,a,r+11*o,"ishikawa-label cause","middle",y).node().getBBox();if(p){let m=p.roughSvg.rectangle(c.x-20,c.y-2,c.width+40,c.height+4,{roughness:1.5,seed:p.seed,fill:p.fillColor,fillStyle:"hachure",fillWeight:2.5,hachureGap:5,stroke:p.lineColor,strokeWidth:2});u.insert(()=>m,":first-child").attr("class","ishikawa-label-box")}else u.insert("rect",":first-child").attr("class","ishikawa-label-box").attr("x",c.x-20).attr("y",c.y-2).attr("width",c.width+40).attr("height",c.height+4)},"drawCauseLabel"),tt=l((t,d,a,r,o,y)=>{let p=Math.sqrt(r*r+o*o);if(p===0)return;let u=r/p,w=o/p,c=6,m=-w*c,k=u*c,_=d,x=a,N=`M ${_} ${x} L ${_-u*c*2+m} ${x-w*c*2+k} L ${_-u*c*2-m} ${x-w*c*2-k} Z`,D=y.roughSvg.path(N,{roughness:1,seed:y.seed,fill:y.lineColor,fillStyle:"solid",stroke:y.lineColor,strokeWidth:1});t.append(()=>D)},"drawArrowMarker"),Bt=l((t,d,a,r,o,y,p,u)=>{let w=d.children??[],c=y*(w.length?1:.2),m=-pt*c,k=gt*c*o,_=a+m,x=r+k;if(z(t,a,r,_,x,"ishikawa-branch",u),u&&tt(t,a,r,a-_,r-x,u),Pt(t,d.text,_,x,o,p,u),!w.length)return;let{entries:N,yOrder:D}=Mt(w,o),$=N.length,M=new Array($);for(let[f,n]of D.entries())M[n]=r+k*((f+1)/($+1));let e=new Map;e.set(-1,{x0:a,y0:r,x1:_,y1:x,childCount:w.length,childrenDrawn:0});let s=-pt,i=gt*o,h=o<0?"ishikawa-label up":"ishikawa-label down";for(let[f,n]of N.entries()){let v=M[f],b=e.get(n.parentIndex),I=t.append("g").attr("class","ishikawa-sub-group"),S=0,A=0,L=0;if(n.depth%2===0){let O=b.y1-b.y0;S=wt(b.x0,b.x1,O?(v-b.y0)/O:.5),A=v,L=S-(n.childCount>0?At+n.childCount*It:$t),z(I,S,v,L,v,"ishikawa-sub-branch",u),u&&tt(I,S,v,1,0,u),U(I,n.text,L,v,"ishikawa-label align","end",p)}else{let O=b.childrenDrawn++;S=wt(b.x0,b.x1,(b.childCount-O)/(b.childCount+1)),A=b.y0,L=S+s*((v-A)/i),z(I,S,A,L,v,"ishikawa-sub-branch",u),u&&tt(I,S,A,S-L,A-v,u),U(I,n.text,L,v,h,"end",p)}n.childCount>0&&e.set(f,{x0:S,y0:A,x1:L,y1:v,childCount:n.childCount,childrenDrawn:0})}},"drawBranch"),Nt=l(t=>t.split(/|\n/),"splitLines"),_t=l((t,d)=>{if(t.length<=d)return t;let a=[];for(let r of t.split(/\s+/)){let o=a.length-1;o>=0&&a[o].length+1+r.length<=d?a[o]+=" "+r:a.push(r)}return a.join(` -`)},"wrapText"),U=l((t,d,a,r,o,y,p)=>{let u=Nt(d),w=p*1.05,c=t.append("text").attr("class",o).attr("text-anchor",y).attr("x",a).attr("y",r-(u.length-1)*w/2);for(let[m,k]of u.entries())c.append("tspan").attr("x",a).attr("dy",m===0?0:w).text(k);return c},"drawMultilineText"),wt=l((t,d,a)=>t+(d-t)*a,"lerp"),z=l((t,d,a,r,o,y,p)=>{if(p){let u=p.roughSvg.line(d,a,r,o,{roughness:1.5,seed:p.seed,stroke:p.lineColor,strokeWidth:2});t.append(()=>u).attr("class",y);return}return t.append("line").attr("class",y).attr("x1",d).attr("y1",a).attr("x2",r).attr("y2",o)},"drawLine"),Dt={draw:Lt},Ot=l(t=>` -.ishikawa .ishikawa-spine, -.ishikawa .ishikawa-branch, -.ishikawa .ishikawa-sub-branch { - stroke: ${t.lineColor}; - stroke-width: 2; - fill: none; -} - -.ishikawa .ishikawa-sub-branch { - stroke-width: 1; -} - -.ishikawa .ishikawa-arrow { - fill: ${t.lineColor}; -} - -.ishikawa .ishikawa-head { - fill: ${t.mainBkg}; - stroke: ${t.lineColor}; - stroke-width: 2; -} - -.ishikawa .ishikawa-label-box { - fill: ${t.mainBkg}; - stroke: ${t.lineColor}; - stroke-width: 2; -} - -.ishikawa text { - font-family: ${t.fontFamily}; - font-size: ${t.fontSize}; - fill: ${t.textColor}; -} - -.ishikawa .ishikawa-head-label { - font-weight: 600; - text-anchor: middle; - dominant-baseline: middle; - font-size: 14px; -} - -.ishikawa .ishikawa-label { - text-anchor: end; -} - -.ishikawa .ishikawa-label.cause { - text-anchor: middle; - dominant-baseline: middle; -} - -.ishikawa .ishikawa-label.align { - text-anchor: end; - dominant-baseline: middle; -} - -.ishikawa .ishikawa-label.up { - dominant-baseline: baseline; -} - -.ishikawa .ishikawa-label.down { - dominant-baseline: hanging; -} -`,"getStyles"),Ct=Ot,Ht={parser:vt,get db(){return new St},renderer:Dt,styles:Ct};export{Ht as diagram}; diff --git a/src/google/adk/cli/browser/chunk-LI24J5PW.js b/src/google/adk/cli/browser/chunk-LI24J5PW.js deleted file mode 100644 index 1290de323d..0000000000 --- a/src/google/adk/cli/browser/chunk-LI24J5PW.js +++ /dev/null @@ -1,220 +0,0 @@ -import{a as Mt}from"./chunk-APNCZOFE.js";import{a as Ut}from"./chunk-ST54LLJ3.js";import{b as Vt}from"./chunk-F57TI45K.js";import{e as Bt,m as Gt}from"./chunk-WBLSVR3V.js";import{M as B,R as Rt,S as Nt,T as wt,U as $t,V as Pt,W as Ft,X as Yt,Y as w}from"./chunk-QFMJV7VH.js";import{g as h,i as k}from"./chunk-JRNAXTJ7.js";import{j as Ot}from"./chunk-RMXJBC7V.js";var vt=(function(){var t=h(function(Y,o,c,n){for(c=c||{},n=Y.length;n--;c[Y[n]]=o);return c},"o"),e=[1,2],s=[1,3],a=[1,4],r=[2,4],u=[1,9],d=[1,11],S=[1,16],f=[1,17],T=[1,18],E=[1,19],_=[1,33],x=[1,20],v=[1,21],p=[1,22],D=[1,23],R=[1,24],L=[1,26],$=[1,27],I=[1,28],P=[1,29],et=[1,30],st=[1,31],it=[1,32],rt=[1,35],at=[1,36],nt=[1,37],ot=[1,38],j=[1,34],y=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],lt=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,39,40,41,45,48,51,52,53,54,57],xt=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],gt={trace:h(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,SD:6,document:7,line:8,statement:9,classDefStatement:10,styleStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"-->":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,CLICK:38,STRING:39,HREF:40,classDef:41,CLASSDEF_ID:42,CLASSDEF_STYLEOPTS:43,DEFAULT:44,style:45,STYLE_IDS:46,STYLEDEF_STYLEOPTS:47,class:48,CLASSENTITY_IDS:49,STYLECLASS:50,direction_tb:51,direction_bt:52,direction_rl:53,direction_lr:54,eol:55,";":56,EDGE_STATE:57,STYLE_SEPARATOR:58,left_of:59,right_of:60,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",6:"SD",14:"DESCR",15:"-->",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"CLICK",39:"STRING",40:"HREF",41:"classDef",42:"CLASSDEF_ID",43:"CLASSDEF_STYLEOPTS",44:"DEFAULT",45:"style",46:"STYLE_IDS",47:"STYLEDEF_STYLEOPTS",48:"class",49:"CLASSENTITY_IDS",50:"STYLECLASS",51:"direction_tb",52:"direction_bt",53:"direction_rl",54:"direction_lr",56:";",57:"EDGE_STATE",58:"STYLE_SEPARATOR",59:"left_of",60:"right_of"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[9,5],[9,5],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[55,1],[55,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]],performAction:h(function(o,c,n,g,b,i,X){var l=i.length-1;switch(b){case 3:return g.setRootDoc(i[l]),i[l];break;case 4:this.$=[];break;case 5:i[l]!="nl"&&(i[l-1].push(i[l]),this.$=i[l-1]);break;case 6:case 7:this.$=i[l];break;case 8:this.$="nl";break;case 12:this.$=i[l];break;case 13:let ht=i[l-1];ht.description=g.trimColon(i[l]),this.$=ht;break;case 14:this.$={stmt:"relation",state1:i[l-2],state2:i[l]};break;case 15:let ut=g.trimColon(i[l]);this.$={stmt:"relation",state1:i[l-3],state2:i[l-1],description:ut};break;case 19:this.$={stmt:"state",id:i[l-3],type:"default",description:"",doc:i[l-1]};break;case 20:var V=i[l],H=i[l-2].trim();if(i[l].match(":")){var J=i[l].split(":");V=J[0],H=[H,J[1]]}this.$={stmt:"state",id:V,type:"default",description:H};break;case 21:this.$={stmt:"state",id:i[l-3],type:"default",description:i[l-5],doc:i[l-1]};break;case 22:this.$={stmt:"state",id:i[l],type:"fork"};break;case 23:this.$={stmt:"state",id:i[l],type:"join"};break;case 24:this.$={stmt:"state",id:i[l],type:"choice"};break;case 25:this.$={stmt:"state",id:g.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:i[l-1].trim(),note:{position:i[l-2].trim(),text:i[l].trim()}};break;case 29:this.$=i[l].trim(),g.setAccTitle(this.$);break;case 30:case 31:this.$=i[l].trim(),g.setAccDescription(this.$);break;case 32:this.$={stmt:"click",id:i[l-3],url:i[l-2],tooltip:i[l-1]};break;case 33:this.$={stmt:"click",id:i[l-3],url:i[l-1],tooltip:""};break;case 34:case 35:this.$={stmt:"classDef",id:i[l-1].trim(),classes:i[l].trim()};break;case 36:this.$={stmt:"style",id:i[l-1].trim(),styleClass:i[l].trim()};break;case 37:this.$={stmt:"applyClass",id:i[l-1].trim(),styleClass:i[l].trim()};break;case 38:g.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 39:g.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 40:g.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 41:g.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 44:case 45:this.$={stmt:"state",id:i[l].trim(),type:"default",description:""};break;case 46:this.$={stmt:"state",id:i[l-2].trim(),classes:[i[l].trim()],type:"default",description:""};break;case 47:this.$={stmt:"state",id:i[l-2].trim(),classes:[i[l].trim()],type:"default",description:""};break}},"anonymous"),table:[{3:1,4:e,5:s,6:a},{1:[3]},{3:5,4:e,5:s,6:a},{3:6,4:e,5:s,6:a},t([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],r,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:u,5:d,8:8,9:10,10:12,11:13,12:14,13:15,16:S,17:f,19:T,22:E,24:_,25:x,26:v,27:p,28:D,29:R,32:25,33:L,35:$,37:I,38:P,41:et,45:st,48:it,51:rt,52:at,53:nt,54:ot,57:j},t(y,[2,5]),{9:39,10:12,11:13,12:14,13:15,16:S,17:f,19:T,22:E,24:_,25:x,26:v,27:p,28:D,29:R,32:25,33:L,35:$,37:I,38:P,41:et,45:st,48:it,51:rt,52:at,53:nt,54:ot,57:j},t(y,[2,7]),t(y,[2,8]),t(y,[2,9]),t(y,[2,10]),t(y,[2,11]),t(y,[2,12],{14:[1,40],15:[1,41]}),t(y,[2,16]),{18:[1,42]},t(y,[2,18],{20:[1,43]}),{23:[1,44]},t(y,[2,22]),t(y,[2,23]),t(y,[2,24]),t(y,[2,25]),{30:45,31:[1,46],59:[1,47],60:[1,48]},t(y,[2,28]),{34:[1,49]},{36:[1,50]},t(y,[2,31]),{13:51,24:_,57:j},{42:[1,52],44:[1,53]},{46:[1,54]},{49:[1,55]},t(lt,[2,44],{58:[1,56]}),t(lt,[2,45],{58:[1,57]}),t(y,[2,38]),t(y,[2,39]),t(y,[2,40]),t(y,[2,41]),t(y,[2,6]),t(y,[2,13]),{13:58,24:_,57:j},t(y,[2,17]),t(xt,r,{7:59}),{24:[1,60]},{24:[1,61]},{23:[1,62]},{24:[2,48]},{24:[2,49]},t(y,[2,29]),t(y,[2,30]),{39:[1,63],40:[1,64]},{43:[1,65]},{43:[1,66]},{47:[1,67]},{50:[1,68]},{24:[1,69]},{24:[1,70]},t(y,[2,14],{14:[1,71]}),{4:u,5:d,8:8,9:10,10:12,11:13,12:14,13:15,16:S,17:f,19:T,21:[1,72],22:E,24:_,25:x,26:v,27:p,28:D,29:R,32:25,33:L,35:$,37:I,38:P,41:et,45:st,48:it,51:rt,52:at,53:nt,54:ot,57:j},t(y,[2,20],{20:[1,73]}),{31:[1,74]},{24:[1,75]},{39:[1,76]},{39:[1,77]},t(y,[2,34]),t(y,[2,35]),t(y,[2,36]),t(y,[2,37]),t(lt,[2,46]),t(lt,[2,47]),t(y,[2,15]),t(y,[2,19]),t(xt,r,{7:78}),t(y,[2,26]),t(y,[2,27]),{5:[1,79]},{5:[1,80]},{4:u,5:d,8:8,9:10,10:12,11:13,12:14,13:15,16:S,17:f,19:T,21:[1,81],22:E,24:_,25:x,26:v,27:p,28:D,29:R,32:25,33:L,35:$,37:I,38:P,41:et,45:st,48:it,51:rt,52:at,53:nt,54:ot,57:j},t(y,[2,32]),t(y,[2,33]),t(y,[2,21])],defaultActions:{5:[2,1],6:[2,2],47:[2,48],48:[2,49]},parseError:h(function(o,c){if(c.recoverable)this.trace(o);else{var n=new Error(o);throw n.hash=c,n}},"parseError"),parse:h(function(o){var c=this,n=[0],g=[],b=[null],i=[],X=this.table,l="",V=0,H=0,J=0,ht=2,ut=1,ue=i.slice.call(arguments,1),m=Object.create(this.lexer),M={yy:{}};for(var Tt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Tt)&&(M.yy[Tt]=this.yy[Tt]);m.setInput(o,M.yy),M.yy.lexer=m,M.yy.parser=this,typeof m.yylloc>"u"&&(m.yylloc={});var bt=m.yylloc;i.push(bt);var de=m.options&&m.options.ranges;typeof M.yy.parseError=="function"?this.parseError=M.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function fe(O){n.length=n.length-2*O,b.length=b.length-O,i.length=i.length-O}h(fe,"popStack");function Lt(){var O;return O=g.pop()||m.lex()||ut,typeof O!="number"&&(O instanceof Array&&(g=O,O=g.pop()),O=c.symbols_[O]||O),O}h(Lt,"lex");for(var C,Et,U,N,Be,_t,W={},dt,F,It,ft;;){if(U=n[n.length-1],this.defaultActions[U]?N=this.defaultActions[U]:((C===null||typeof C>"u")&&(C=Lt()),N=X[U]&&X[U][C]),typeof N>"u"||!N.length||!N[0]){var kt="";ft=[];for(dt in X[U])this.terminals_[dt]&&dt>ht&&ft.push("'"+this.terminals_[dt]+"'");m.showPosition?kt="Parse error on line "+(V+1)+`: -`+m.showPosition()+` -Expecting `+ft.join(", ")+", got '"+(this.terminals_[C]||C)+"'":kt="Parse error on line "+(V+1)+": Unexpected "+(C==ut?"end of input":"'"+(this.terminals_[C]||C)+"'"),this.parseError(kt,{text:m.match,token:this.terminals_[C]||C,line:m.yylineno,loc:bt,expected:ft})}if(N[0]instanceof Array&&N.length>1)throw new Error("Parse Error: multiple actions possible at state: "+U+", token: "+C);switch(N[0]){case 1:n.push(C),b.push(m.yytext),i.push(m.yylloc),n.push(N[1]),C=null,Et?(C=Et,Et=null):(H=m.yyleng,l=m.yytext,V=m.yylineno,bt=m.yylloc,J>0&&J--);break;case 2:if(F=this.productions_[N[1]][1],W.$=b[b.length-F],W._$={first_line:i[i.length-(F||1)].first_line,last_line:i[i.length-1].last_line,first_column:i[i.length-(F||1)].first_column,last_column:i[i.length-1].last_column},de&&(W._$.range=[i[i.length-(F||1)].range[0],i[i.length-1].range[1]]),_t=this.performAction.apply(W,[l,H,V,M.yy,N[1],b,i].concat(ue)),typeof _t<"u")return _t;F&&(n=n.slice(0,-1*F*2),b=b.slice(0,-1*F),i=i.slice(0,-1*F)),n.push(this.productions_[N[1]][0]),b.push(W.$),i.push(W._$),It=X[n[n.length-2]][n[n.length-1]],n.push(It);break;case 3:return!0}}return!0},"parse")},he=(function(){var Y={EOF:1,parseError:h(function(c,n){if(this.yy.parser)this.yy.parser.parseError(c,n);else throw new Error(c)},"parseError"),setInput:h(function(o,c){return this.yy=c||this.yy||{},this._input=o,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:h(function(){var o=this._input[0];this.yytext+=o,this.yyleng++,this.offset++,this.match+=o,this.matched+=o;var c=o.match(/(?:\r\n?|\n).*/g);return c?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),o},"input"),unput:h(function(o){var c=o.length,n=o.split(/(?:\r\n?|\n)/g);this._input=o+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-c),this.offset-=c;var g=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var b=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===g.length?this.yylloc.first_column:0)+g[g.length-n.length].length-n[0].length:this.yylloc.first_column-c},this.options.ranges&&(this.yylloc.range=[b[0],b[0]+this.yyleng-c]),this.yyleng=this.yytext.length,this},"unput"),more:h(function(){return this._more=!0,this},"more"),reject:h(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:h(function(o){this.unput(this.match.slice(o))},"less"),pastInput:h(function(){var o=this.matched.substr(0,this.matched.length-this.match.length);return(o.length>20?"...":"")+o.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:h(function(){var o=this.match;return o.length<20&&(o+=this._input.substr(0,20-o.length)),(o.substr(0,20)+(o.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:h(function(){var o=this.pastInput(),c=new Array(o.length+1).join("-");return o+this.upcomingInput()+` -`+c+"^"},"showPosition"),test_match:h(function(o,c){var n,g,b;if(this.options.backtrack_lexer&&(b={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(b.yylloc.range=this.yylloc.range.slice(0))),g=o[0].match(/(?:\r\n?|\n).*/g),g&&(this.yylineno+=g.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:g?g[g.length-1].length-g[g.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+o[0].length},this.yytext+=o[0],this.match+=o[0],this.matches=o,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(o[0].length),this.matched+=o[0],n=this.performAction.call(this,this.yy,this,c,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var i in b)this[i]=b[i];return!1}return!1},"test_match"),next:h(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var o,c,n,g;this._more||(this.yytext="",this.match="");for(var b=this._currentRules(),i=0;ic[0].length)){if(c=n,g=i,this.options.backtrack_lexer){if(o=this.test_match(n,b[i]),o!==!1)return o;if(this._backtrack){c=!1;continue}else return!1}else if(!this.options.flex)break}return c?(o=this.test_match(c,b[g]),o!==!1?o:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:h(function(){var c=this.next();return c||this.lex()},"lex"),begin:h(function(c){this.conditionStack.push(c)},"begin"),popState:h(function(){var c=this.conditionStack.length-1;return c>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:h(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:h(function(c){return c=this.conditionStack.length-1-Math.abs(c||0),c>=0?this.conditionStack[c]:"INITIAL"},"topState"),pushState:h(function(c){this.begin(c)},"pushState"),stateStackSize:h(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:h(function(c,n,g,b){var i=b;switch(g){case 0:return 38;case 1:return 40;case 2:return 39;case 3:return 44;case 4:return 51;case 5:return 52;case 6:return 53;case 7:return 54;case 8:break;case 9:break;case 10:return 5;case 11:break;case 12:break;case 13:break;case 14:break;case 15:return this.pushState("SCALE"),17;break;case 16:return 18;case 17:this.popState();break;case 18:return this.begin("acc_title"),33;break;case 19:return this.popState(),"acc_title_value";break;case 20:return this.begin("acc_descr"),35;break;case 21:return this.popState(),"acc_descr_value";break;case 22:this.begin("acc_descr_multiline");break;case 23:this.popState();break;case 24:return"acc_descr_multiline_value";case 25:return this.pushState("CLASSDEF"),41;break;case 26:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 27:return this.popState(),this.pushState("CLASSDEFID"),42;break;case 28:return this.popState(),43;break;case 29:return this.pushState("CLASS"),48;break;case 30:return this.popState(),this.pushState("CLASS_STYLE"),49;break;case 31:return this.popState(),50;break;case 32:return this.pushState("STYLE"),45;break;case 33:return this.popState(),this.pushState("STYLEDEF_STYLES"),46;break;case 34:return this.popState(),47;break;case 35:return this.pushState("SCALE"),17;break;case 36:return 18;case 37:this.popState();break;case 38:this.pushState("STATE");break;case 39:return this.popState(),n.yytext=n.yytext.slice(0,-8).trim(),25;break;case 40:return this.popState(),n.yytext=n.yytext.slice(0,-8).trim(),26;break;case 41:return this.popState(),n.yytext=n.yytext.slice(0,-10).trim(),27;break;case 42:return this.popState(),n.yytext=n.yytext.slice(0,-8).trim(),25;break;case 43:return this.popState(),n.yytext=n.yytext.slice(0,-8).trim(),26;break;case 44:return this.popState(),n.yytext=n.yytext.slice(0,-10).trim(),27;break;case 45:return 51;case 46:return 52;case 47:return 53;case 48:return 54;case 49:this.pushState("STATE_STRING");break;case 50:return this.pushState("STATE_ID"),"AS";break;case 51:return this.popState(),"ID";break;case 52:this.popState();break;case 53:return"STATE_DESCR";case 54:return 19;case 55:this.popState();break;case 56:return this.popState(),this.pushState("struct"),20;break;case 57:break;case 58:return this.popState(),21;break;case 59:break;case 60:return this.begin("NOTE"),29;break;case 61:return this.popState(),this.pushState("NOTE_ID"),59;break;case 62:return this.popState(),this.pushState("NOTE_ID"),60;break;case 63:this.popState(),this.pushState("FLOATING_NOTE");break;case 64:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";break;case 65:break;case 66:return"NOTE_TEXT";case 67:return this.popState(),"ID";break;case 68:return this.popState(),this.pushState("NOTE_TEXT"),24;break;case 69:return this.popState(),n.yytext=n.yytext.substr(2).trim(),31;break;case 70:return this.popState(),n.yytext=n.yytext.slice(0,-8).trim(),31;break;case 71:return 6;case 72:return 6;case 73:return 16;case 74:return 57;case 75:return 24;case 76:return n.yytext=n.yytext.trim(),14;break;case 77:return 15;case 78:return 28;case 79:return 58;case 80:return 5;case 81:return"INVALID"}},"anonymous"),rules:[/^(?:click\b)/i,/^(?:href\b)/i,/^(?:"[^"]*")/i,/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:style\s+)/i,/^(?:[\w,]+\s+)/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:(?:[^:\n;]|:[^:\n;])+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[12,13],inclusive:!1},struct:{rules:[12,13,25,29,32,38,45,46,47,48,57,58,59,60,74,75,76,77,78],inclusive:!1},FLOATING_NOTE_ID:{rules:[67],inclusive:!1},FLOATING_NOTE:{rules:[64,65,66],inclusive:!1},NOTE_TEXT:{rules:[69,70],inclusive:!1},NOTE_ID:{rules:[68],inclusive:!1},NOTE:{rules:[61,62,63],inclusive:!1},STYLEDEF_STYLEOPTS:{rules:[],inclusive:!1},STYLEDEF_STYLES:{rules:[34],inclusive:!1},STYLE_IDS:{rules:[],inclusive:!1},STYLE:{rules:[33],inclusive:!1},CLASS_STYLE:{rules:[31],inclusive:!1},CLASS:{rules:[30],inclusive:!1},CLASSDEFID:{rules:[28],inclusive:!1},CLASSDEF:{rules:[26,27],inclusive:!1},acc_descr_multiline:{rules:[23,24],inclusive:!1},acc_descr:{rules:[21],inclusive:!1},acc_title:{rules:[19],inclusive:!1},SCALE:{rules:[16,17,36,37],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[51],inclusive:!1},STATE_STRING:{rules:[52,53],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[12,13,39,40,41,42,43,44,49,50,54,55,56],inclusive:!1},ID:{rules:[12,13],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,18,20,22,25,29,32,35,38,56,60,71,72,73,74,75,76,77,79,80,81],inclusive:!0}}};return Y})();gt.lexer=he;function ct(){this.yy={}}return h(ct,"Parser"),ct.prototype=gt,gt.Parser=ct,new ct})();vt.parser=vt;var We=vt,pe="TB",qt="TB",jt="dir",K="state",z="root",Ct="relation",Se="classDef",ye="style",ge="applyClass",Z="default",Qt="divider",Zt="fill:none",te="fill: #333",ee="c",se="markdown",ie="normal",mt="rect",Dt="rectWithTitle",Te="stateStart",be="stateEnd",Ht="divider",Wt="roundedWithTitle",Ee="note",_e="noteGroup",tt="statediagram",ke="state",me=`${tt}-${ke}`,re="transition",De="note",ve="note-edge",Ce=`${re} ${ve}`,Ae=`${tt}-${De}`,xe="cluster",Le=`${tt}-${xe}`,Ie="cluster-alt",Oe=`${tt}-${Ie}`,ae="parent",ne="note",Re="state",At="----",Ne=`${At}${ne}`,zt=`${At}${ae}`,oe=h((t,e=qt)=>{if(!t.doc)return e;let s=e;for(let a of t.doc)a.stmt==="dir"&&(s=a.value);return s},"getDir"),we=h(function(t,e){return e.db.getClasses()},"getClasses"),$e=h(function(t,e,s,a){return Ot(this,null,function*(){k.info("REF0:"),k.info("Drawing state diagram (v2)",e);let{securityLevel:r,state:u,layout:d}=w();a.db.extract(a.db.getRootDocV2());let S=a.db.getData(),f=Mt(e,r);S.type=a.type,S.layoutAlgorithm=d,S.nodeSpacing=u?.nodeSpacing||50,S.rankSpacing=u?.rankSpacing||50,S.markers=["barb"],S.diagramId=e,yield Vt(S,f);let T=8;try{(typeof a.db.getLinks=="function"?a.db.getLinks():new Map).forEach((_,x)=>{let v=typeof x=="string"?x:typeof x?.id=="string"?x.id:"";if(!v){k.warn("\u26A0\uFE0F Invalid or missing stateId from key:",JSON.stringify(x));return}let p=f.node()?.querySelectorAll("g"),D;if(p?.forEach(I=>{I.textContent?.trim()===v&&(D=I)}),!D){k.warn("\u26A0\uFE0F Could not find node matching text:",v);return}let R=D.parentNode;if(!R){k.warn("\u26A0\uFE0F Node has no parent, cannot wrap:",v);return}let L=document.createElementNS("http://www.w3.org/2000/svg","a"),$=_.url.replace(/^"+|"+$/g,"");if(L.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",$),L.setAttribute("target","_blank"),_.tooltip){let I=_.tooltip.replace(/^"+|"+$/g,"");L.setAttribute("title",I)}R.replaceChild(L,D),L.appendChild(D),k.info("\u{1F517} Wrapped node in tag for:",v,_.url)})}catch(E){k.error("\u274C Error injecting clickable links:",E)}Gt.insertTitle(f,"statediagramTitleText",u?.titleTopMargin??25,a.db.getDiagramTitle()),Ut(f,T,tt,u?.useMaxWidth??!0)})},"draw"),ze={getClasses:we,draw:$e,getDir:oe},St=new Map,G=0;function yt(t="",e=0,s="",a=At){let r=s!==null&&s.length>0?`${a}${s}`:"";return`${Re}-${t}${r}-${e}`}h(yt,"stateDomId");var Pe=h((t,e,s,a,r,u,d,S)=>{k.trace("items",e),e.forEach(f=>{switch(f.stmt){case K:Q(t,f,s,a,r,u,d,S);break;case Z:Q(t,f,s,a,r,u,d,S);break;case Ct:{Q(t,f.state1,s,a,r,u,d,S),Q(t,f.state2,s,a,r,u,d,S);let T={id:"edge"+G,start:f.state1.id,end:f.state2.id,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:Zt,labelStyle:"",label:B.sanitizeText(f.description??"",w()),arrowheadStyle:te,labelpos:ee,labelType:se,thickness:ie,classes:re,look:d};r.push(T),G++}break}})},"setupDoc"),Kt=h((t,e=qt)=>{let s=e;if(t.doc)for(let a of t.doc)a.stmt==="dir"&&(s=a.value);return s},"getDir");function q(t,e,s){if(!e.id||e.id===""||e.id==="")return;e.cssClasses&&(Array.isArray(e.cssCompiledStyles)||(e.cssCompiledStyles=[]),e.cssClasses.split(" ").forEach(r=>{let u=s.get(r);u&&(e.cssCompiledStyles=[...e.cssCompiledStyles??[],...u.styles])}));let a=t.find(r=>r.id===e.id);a?Object.assign(a,e):t.push(e)}h(q,"insertOrUpdateNode");function le(t){return t?.classes?.join(" ")??""}h(le,"getClassesFromDbInfo");function ce(t){return t?.styles??[]}h(ce,"getStylesFromDbInfo");var Q=h((t,e,s,a,r,u,d,S)=>{let f=e.id,T=s.get(f),E=le(T),_=ce(T),x=w();if(k.info("dataFetcher parsedItem",e,T,_),f!=="root"){let v=mt;e.start===!0?v=Te:e.start===!1&&(v=be),e.type!==Z&&(v=e.type),St.get(f)||St.set(f,{id:f,shape:v,description:B.sanitizeText(f,x),cssClasses:`${E} ${me}`,cssStyles:_});let p=St.get(f);e.description&&(Array.isArray(p.description)?(p.shape=Dt,p.description.push(e.description)):p.description?.length&&p.description.length>0?(p.shape=Dt,p.description===f?p.description=[e.description]:p.description=[p.description,e.description]):(p.shape=mt,p.description=e.description),p.description=B.sanitizeTextOrArray(p.description,x)),p.description?.length===1&&p.shape===Dt&&(p.type==="group"?p.shape=Wt:p.shape=mt),!p.type&&e.doc&&(k.info("Setting cluster for XCX",f,Kt(e)),p.type="group",p.isGroup=!0,p.dir=Kt(e),p.shape=e.type===Qt?Ht:Wt,p.cssClasses=`${p.cssClasses} ${Le} ${u?Oe:""}`);let D={labelStyle:"",shape:p.shape,label:p.description,cssClasses:p.cssClasses,cssCompiledStyles:[],cssStyles:p.cssStyles,id:f,dir:p.dir,domId:yt(f,G),type:p.type,isGroup:p.type==="group",padding:8,rx:10,ry:10,look:d,labelType:"markdown"};if(D.shape===Ht&&(D.label=""),t&&t.id!=="root"&&(k.trace("Setting node ",f," to be child of its parent ",t.id),D.parentId=t.id),D.centerLabel=!0,e.note){let R={labelStyle:"",shape:Ee,label:e.note.text,labelType:"markdown",cssClasses:Ae,cssStyles:[],cssCompiledStyles:[],id:f+Ne+"-"+G,domId:yt(f,G,ne),type:p.type,isGroup:p.type==="group",padding:x.flowchart?.padding,look:d,position:e.note.position},L=f+zt,$={labelStyle:"",shape:_e,label:e.note.text,cssClasses:p.cssClasses,cssStyles:[],id:f+zt,domId:yt(f,G,ae),type:"group",isGroup:!0,padding:16,look:d,position:e.note.position};G++,$.id=L,R.parentId=L,q(a,$,S),q(a,R,S),q(a,D,S);let I=f,P=R.id;e.note.position==="left of"&&(I=R.id,P=f),r.push({id:I+"-"+P,start:I,end:P,arrowhead:"none",arrowTypeEnd:"",style:Zt,labelStyle:"",classes:Ce,arrowheadStyle:te,labelpos:ee,labelType:se,thickness:ie,look:d})}else q(a,D,S)}e.doc&&(k.trace("Adding nodes children "),Pe(e,e.doc,s,a,r,!u,d,S))},"dataFetcher"),Fe=h(()=>{St.clear(),G=0},"reset"),A={START_NODE:"[*]",START_TYPE:"start",END_NODE:"[*]",END_TYPE:"end",COLOR_KEYWORD:"color",FILL_KEYWORD:"fill",BG_FILL:"bgFill",STYLECLASS_SEP:","},Xt=h(()=>new Map,"newClassesList"),Jt=h(()=>({relations:[],states:new Map,documents:{}}),"newDoc"),pt=h(t=>JSON.parse(JSON.stringify(t)),"clone"),Ke=class{constructor(e){this.version=e,this.nodes=[],this.edges=[],this.rootDoc=[],this.classes=Xt(),this.documents={root:Jt()},this.currentDocument=this.documents.root,this.startEndCount=0,this.dividerCnt=0,this.links=new Map,this.getAccTitle=wt,this.setAccTitle=Nt,this.getAccDescription=Pt,this.setAccDescription=$t,this.setDiagramTitle=Ft,this.getDiagramTitle=Yt,this.clear(),this.setRootDoc=this.setRootDoc.bind(this),this.getDividerId=this.getDividerId.bind(this),this.setDirection=this.setDirection.bind(this),this.trimColon=this.trimColon.bind(this)}static{h(this,"StateDB")}static{this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3}}extract(e){this.clear(!0);for(let r of Array.isArray(e)?e:e.doc)switch(r.stmt){case K:this.addState(r.id.trim(),r.type,r.doc,r.description,r.note);break;case Ct:this.addRelation(r.state1,r.state2,r.description);break;case Se:this.addStyleClass(r.id.trim(),r.classes);break;case ye:this.handleStyleDef(r);break;case ge:this.setCssClass(r.id.trim(),r.styleClass);break;case"click":this.addLink(r.id,r.url,r.tooltip);break}let s=this.getStates(),a=w();Fe(),Q(void 0,this.getRootDocV2(),s,this.nodes,this.edges,!0,a.look,this.classes);for(let r of this.nodes)if(Array.isArray(r.label)){if(r.description=r.label.slice(1),r.isGroup&&r.description.length>0)throw new Error(`Group nodes can only have label. Remove the additional description for node [${r.id}]`);r.label=r.label[0]}}handleStyleDef(e){let s=e.id.trim().split(","),a=e.styleClass.split(",");for(let r of s){let u=this.getState(r);if(!u){let d=r.trim();this.addState(d),u=this.getState(d)}u&&(u.styles=a.map(d=>d.replace(/;/g,"")?.trim()))}}setRootDoc(e){k.info("Setting root doc",e),this.rootDoc=e,this.version===1?this.extract(e):this.extract(this.getRootDocV2())}docTranslator(e,s,a){if(s.stmt===Ct){this.docTranslator(e,s.state1,!0),this.docTranslator(e,s.state2,!1);return}if(s.stmt===K&&(s.id===A.START_NODE?(s.id=e.id+(a?"_start":"_end"),s.start=a):s.id=s.id.trim()),s.stmt!==z&&s.stmt!==K||!s.doc)return;let r=[],u=[];for(let d of s.doc)if(d.type===Qt){let S=pt(d);S.doc=pt(u),r.push(S),u=[]}else u.push(d);if(r.length>0&&u.length>0){let d={stmt:K,id:Bt(),type:"divider",doc:pt(u)};r.push(pt(d)),s.doc=r}s.doc.forEach(d=>this.docTranslator(s,d,!0))}getRootDocV2(){return this.docTranslator({id:z,stmt:z},{id:z,stmt:z,doc:this.rootDoc},!0),{id:z,doc:this.rootDoc}}addState(e,s=Z,a=void 0,r=void 0,u=void 0,d=void 0,S=void 0,f=void 0){let T=e?.trim();if(!this.currentDocument.states.has(T))k.info("Adding state ",T,r),this.currentDocument.states.set(T,{stmt:K,id:T,descriptions:[],type:s,doc:a,note:u,classes:[],styles:[],textStyles:[]});else{let E=this.currentDocument.states.get(T);if(!E)throw new Error(`State not found: ${T}`);E.doc||(E.doc=a),E.type||(E.type=s)}if(r&&(k.info("Setting state description",T,r),(Array.isArray(r)?r:[r]).forEach(_=>this.addDescription(T,_.trim()))),u){let E=this.currentDocument.states.get(T);if(!E)throw new Error(`State not found: ${T}`);E.note=u,E.note.text=B.sanitizeText(E.note.text,w())}d&&(k.info("Setting state classes",T,d),(Array.isArray(d)?d:[d]).forEach(_=>this.setCssClass(T,_.trim()))),S&&(k.info("Setting state styles",T,S),(Array.isArray(S)?S:[S]).forEach(_=>this.setStyle(T,_.trim()))),f&&(k.info("Setting state styles",T,S),(Array.isArray(f)?f:[f]).forEach(_=>this.setTextStyle(T,_.trim())))}clear(e){this.nodes=[],this.edges=[],this.documents={root:Jt()},this.currentDocument=this.documents.root,this.startEndCount=0,this.classes=Xt(),e||(this.links=new Map,Rt())}getState(e){return this.currentDocument.states.get(e)}getStates(){return this.currentDocument.states}logDocuments(){k.info("Documents = ",this.documents)}getRelations(){return this.currentDocument.relations}addLink(e,s,a){this.links.set(e,{url:s,tooltip:a}),k.warn("Adding link",e,s,a)}getLinks(){return this.links}startIdIfNeeded(e=""){return e===A.START_NODE?(this.startEndCount++,`${A.START_TYPE}${this.startEndCount}`):e}startTypeIfNeeded(e="",s=Z){return e===A.START_NODE?A.START_TYPE:s}endIdIfNeeded(e=""){return e===A.END_NODE?(this.startEndCount++,`${A.END_TYPE}${this.startEndCount}`):e}endTypeIfNeeded(e="",s=Z){return e===A.END_NODE?A.END_TYPE:s}addRelationObjs(e,s,a=""){let r=this.startIdIfNeeded(e.id.trim()),u=this.startTypeIfNeeded(e.id.trim(),e.type),d=this.startIdIfNeeded(s.id.trim()),S=this.startTypeIfNeeded(s.id.trim(),s.type);this.addState(r,u,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),this.addState(d,S,s.doc,s.description,s.note,s.classes,s.styles,s.textStyles),this.currentDocument.relations.push({id1:r,id2:d,relationTitle:B.sanitizeText(a,w())})}addRelation(e,s,a){if(typeof e=="object"&&typeof s=="object")this.addRelationObjs(e,s,a);else if(typeof e=="string"&&typeof s=="string"){let r=this.startIdIfNeeded(e.trim()),u=this.startTypeIfNeeded(e),d=this.endIdIfNeeded(s.trim()),S=this.endTypeIfNeeded(s);this.addState(r,u),this.addState(d,S),this.currentDocument.relations.push({id1:r,id2:d,relationTitle:a?B.sanitizeText(a,w()):void 0})}}addDescription(e,s){let a=this.currentDocument.states.get(e),r=s.startsWith(":")?s.replace(":","").trim():s;a?.descriptions?.push(B.sanitizeText(r,w()))}cleanupLabel(e){return e.startsWith(":")?e.slice(2).trim():e.trim()}getDividerId(){return this.dividerCnt++,`divider-id-${this.dividerCnt}`}addStyleClass(e,s=""){this.classes.has(e)||this.classes.set(e,{id:e,styles:[],textStyles:[]});let a=this.classes.get(e);s&&a&&s.split(A.STYLECLASS_SEP).forEach(r=>{let u=r.replace(/([^;]*);/,"$1").trim();if(RegExp(A.COLOR_KEYWORD).exec(r)){let S=u.replace(A.FILL_KEYWORD,A.BG_FILL).replace(A.COLOR_KEYWORD,A.FILL_KEYWORD);a.textStyles.push(S)}a.styles.push(u)})}getClasses(){return this.classes}setCssClass(e,s){e.split(",").forEach(a=>{let r=this.getState(a);if(!r){let u=a.trim();this.addState(u),r=this.getState(u)}r?.classes?.push(s)})}setStyle(e,s){this.getState(e)?.styles?.push(s)}setTextStyle(e,s){this.getState(e)?.textStyles?.push(s)}getDirectionStatement(){return this.rootDoc.find(e=>e.stmt===jt)}getDirection(){return this.getDirectionStatement()?.value??pe}setDirection(e){let s=this.getDirectionStatement();s?s.value=e:this.rootDoc.unshift({stmt:jt,value:e})}trimColon(e){return e.startsWith(":")?e.slice(1).trim():e.trim()}getData(){let e=w();return{nodes:this.nodes,edges:this.edges,other:{},config:e,direction:oe(this.getRootDocV2())}}getConfig(){return w().state}},Ye=h(t=>` -defs #statediagram-barbEnd { - fill: ${t.transitionColor}; - stroke: ${t.transitionColor}; - } -g.stateGroup text { - fill: ${t.nodeBorder}; - stroke: none; - font-size: 10px; -} -g.stateGroup text { - fill: ${t.textColor}; - stroke: none; - font-size: 10px; - -} -g.stateGroup .state-title { - font-weight: bolder; - fill: ${t.stateLabelColor}; -} - -g.stateGroup rect { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; -} - -g.stateGroup line { - stroke: ${t.lineColor}; - stroke-width: 1; -} - -.transition { - stroke: ${t.transitionColor}; - stroke-width: 1; - fill: none; -} - -.stateGroup .composit { - fill: ${t.background}; - border-bottom: 1px -} - -.stateGroup .alt-composit { - fill: #e0e0e0; - border-bottom: 1px -} - -.state-note { - stroke: ${t.noteBorderColor}; - fill: ${t.noteBkgColor}; - - text { - fill: ${t.noteTextColor}; - stroke: none; - font-size: 10px; - } -} - -.stateLabel .box { - stroke: none; - stroke-width: 0; - fill: ${t.mainBkg}; - opacity: 0.5; -} - -.edgeLabel .label rect { - fill: ${t.labelBackgroundColor}; - opacity: 0.5; -} -.edgeLabel { - background-color: ${t.edgeLabelBackground}; - p { - background-color: ${t.edgeLabelBackground}; - } - rect { - opacity: 0.5; - background-color: ${t.edgeLabelBackground}; - fill: ${t.edgeLabelBackground}; - } - text-align: center; -} -.edgeLabel .label text { - fill: ${t.transitionLabelColor||t.tertiaryTextColor}; -} -.label div .edgeLabel { - color: ${t.transitionLabelColor||t.tertiaryTextColor}; -} - -.stateLabel text { - fill: ${t.stateLabelColor}; - font-size: 10px; - font-weight: bold; -} - -.node circle.state-start { - fill: ${t.specialStateColor}; - stroke: ${t.specialStateColor}; -} - -.node .fork-join { - fill: ${t.specialStateColor}; - stroke: ${t.specialStateColor}; -} - -.node circle.state-end { - fill: ${t.innerEndBackground}; - stroke: ${t.background}; - stroke-width: 1.5 -} -.end-state-inner { - fill: ${t.compositeBackground||t.background}; - // stroke: ${t.background}; - stroke-width: 1.5 -} - -.node rect { - fill: ${t.stateBkg||t.mainBkg}; - stroke: ${t.stateBorder||t.nodeBorder}; - stroke-width: 1px; -} -.node polygon { - fill: ${t.mainBkg}; - stroke: ${t.stateBorder||t.nodeBorder};; - stroke-width: 1px; -} -#statediagram-barbEnd { - fill: ${t.lineColor}; -} - -.statediagram-cluster rect { - fill: ${t.compositeTitleBackground}; - stroke: ${t.stateBorder||t.nodeBorder}; - stroke-width: 1px; -} - -.cluster-label, .nodeLabel { - color: ${t.stateLabelColor}; - // line-height: 1; -} - -.statediagram-cluster rect.outer { - rx: 5px; - ry: 5px; -} -.statediagram-state .divider { - stroke: ${t.stateBorder||t.nodeBorder}; -} - -.statediagram-state .title-state { - rx: 5px; - ry: 5px; -} -.statediagram-cluster.statediagram-cluster .inner { - fill: ${t.compositeBackground||t.background}; -} -.statediagram-cluster.statediagram-cluster-alt .inner { - fill: ${t.altBackground?t.altBackground:"#efefef"}; -} - -.statediagram-cluster .inner { - rx:0; - ry:0; -} - -.statediagram-state rect.basic { - rx: 5px; - ry: 5px; -} -.statediagram-state rect.divider { - stroke-dasharray: 10,10; - fill: ${t.altBackground?t.altBackground:"#efefef"}; -} - -.note-edge { - stroke-dasharray: 5; -} - -.statediagram-note rect { - fill: ${t.noteBkgColor}; - stroke: ${t.noteBorderColor}; - stroke-width: 1px; - rx: 0; - ry: 0; -} -.statediagram-note rect { - fill: ${t.noteBkgColor}; - stroke: ${t.noteBorderColor}; - stroke-width: 1px; - rx: 0; - ry: 0; -} - -.statediagram-note text { - fill: ${t.noteTextColor}; -} - -.statediagram-note .nodeLabel { - color: ${t.noteTextColor}; -} -.statediagram .edgeLabel { - color: red; // ${t.noteTextColor}; -} - -#dependencyStart, #dependencyEnd { - fill: ${t.lineColor}; - stroke: ${t.lineColor}; - stroke-width: 1; -} - -.statediagramTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.textColor}; -} -`,"getStyles"),Xe=Ye;export{We as a,ze as b,Ke as c,Xe as d}; diff --git a/src/google/adk/cli/browser/chunk-N5S45BK4.js b/src/google/adk/cli/browser/chunk-N5S45BK4.js deleted file mode 100644 index 4f22e6ea24..0000000000 --- a/src/google/adk/cli/browser/chunk-N5S45BK4.js +++ /dev/null @@ -1 +0,0 @@ -import{a as e,b as i,c as a,d as o}from"./chunk-LI24J5PW.js";import"./chunk-APNCZOFE.js";import"./chunk-ST54LLJ3.js";import"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import"./chunk-QFMJV7VH.js";import{g as r}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";var v={parser:e,get db(){return new a(2)},renderer:i,styles:o,init:r(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{v as diagram}; diff --git a/src/google/adk/cli/browser/chunk-NALL4A3P.js b/src/google/adk/cli/browser/chunk-NALL4A3P.js deleted file mode 100644 index 8970e67502..0000000000 --- a/src/google/adk/cli/browser/chunk-NALL4A3P.js +++ /dev/null @@ -1,161 +0,0 @@ -import{A as q,B as mt,C as Ce,D as Pe,E as hu,G as Z,I as tr,J as $t,M as qh,O as Gt,S as Ue,T as In,V as Mo,Z as Hs,_ as zh,a as et,b as Pr,c as dt,d as Ve,e as Ne,h as Or,k as Ks,l as wn,m as gr,n as Ke,o as tn,p as D,r as At,s as ct,t as Lr,u as pt,v as I,w as ht,z as Uh}from"./chunk-ASJUXEUE.js";import{e as Ze,f as Fh,g as Gh,h as mr}from"./chunk-EGBSMT36.js";import{a as ge,b as er,d as nv,e as X,f as en,g as ae,h as du,i as pu,j as P}from"./chunk-RMXJBC7V.js";var il={};en(il,{AnnotatedTextEdit:()=>Xr,ChangeAnnotation:()=>ri,ChangeAnnotationIdentifier:()=>lt,CodeAction:()=>ad,CodeActionContext:()=>sd,CodeActionKind:()=>Gg,CodeActionTriggerKind:()=>tl,CodeDescription:()=>jf,CodeLens:()=>od,Color:()=>Xc,ColorInformation:()=>Uf,ColorPresentation:()=>qf,Command:()=>ni,CompletionItem:()=>Xf,CompletionItemKind:()=>bg,CompletionItemLabelDetails:()=>Yf,CompletionItemTag:()=>Og,CompletionList:()=>Jf,CreateFile:()=>rs,DeleteFile:()=>is,Diagnostic:()=>Ma,DiagnosticRelatedInformation:()=>Jc,DiagnosticSeverity:()=>Ig,DiagnosticTag:()=>_g,DocumentHighlight:()=>td,DocumentHighlightKind:()=>Dg,DocumentLink:()=>ld,DocumentSymbol:()=>id,DocumentUri:()=>Mf,EOL:()=>IA,FoldingRange:()=>zf,FoldingRangeKind:()=>wg,FormattingOptions:()=>cd,Hover:()=>Qf,InlayHint:()=>gd,InlayHintKind:()=>rl,InlayHintLabelPart:()=>nl,InlineCompletionContext:()=>vd,InlineCompletionItem:()=>Td,InlineCompletionList:()=>Rd,InlineCompletionTriggerKind:()=>zg,InlineValueContext:()=>md,InlineValueEvaluatableExpression:()=>hd,InlineValueText:()=>dd,InlineValueVariableLookup:()=>pd,InsertReplaceEdit:()=>Hf,InsertTextFormat:()=>Pg,InsertTextMode:()=>Lg,Location:()=>Da,LocationLink:()=>Gf,MarkedString:()=>Ua,MarkupContent:()=>ss,MarkupKind:()=>el,OptionalVersionedTextDocumentIdentifier:()=>Ga,ParameterInformation:()=>Zf,Position:()=>ce,Range:()=>ie,RenameFile:()=>ns,SelectedCompletionInfo:()=>xd,SelectionRange:()=>ud,SemanticTokenModifiers:()=>qg,SemanticTokenTypes:()=>Ug,SemanticTokens:()=>fd,SignatureInformation:()=>ed,StringValue:()=>yd,SymbolInformation:()=>rd,SymbolKind:()=>Mg,SymbolTag:()=>Fg,TextDocument:()=>Ad,TextDocumentEdit:()=>Fa,TextDocumentIdentifier:()=>Wf,TextDocumentItem:()=>Kf,TextEdit:()=>Er,URI:()=>Yc,VersionedTextDocumentIdentifier:()=>Vf,WorkspaceChange:()=>Bf,WorkspaceEdit:()=>Qc,WorkspaceFolder:()=>Ed,WorkspaceSymbol:()=>nd,integer:()=>Ff,uinteger:()=>La});var Mf,Yc,Ff,La,ce,ie,Da,Gf,Xc,Uf,qf,wg,zf,Jc,Ig,_g,jf,Ma,ni,Er,ri,lt,Xr,Fa,rs,ns,is,Qc,ts,Zc,Bf,Wf,Vf,Ga,Kf,el,ss,bg,Pg,Og,Hf,Lg,Yf,Xf,Jf,Ua,Qf,Zf,ed,Dg,td,Mg,Fg,rd,nd,id,Gg,tl,sd,ad,od,cd,ld,ud,Ug,qg,fd,dd,pd,hd,md,rl,nl,gd,yd,Td,Rd,zg,xd,vd,Ed,IA,Ad,$d,m,as=nv(()=>{"use strict";(function(t){function e(r){return typeof r=="string"}t.is=e})(Mf||(Mf={}));(function(t){function e(r){return typeof r=="string"}t.is=e})(Yc||(Yc={}));(function(t){t.MIN_VALUE=-2147483648,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}t.is=e})(Ff||(Ff={}));(function(t){t.MIN_VALUE=0,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}t.is=e})(La||(La={}));(function(t){function e(n,i){return n===Number.MAX_VALUE&&(n=La.MAX_VALUE),i===Number.MAX_VALUE&&(i=La.MAX_VALUE),{line:n,character:i}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&m.uinteger(i.line)&&m.uinteger(i.character)}t.is=r})(ce||(ce={}));(function(t){function e(n,i,s,a){if(m.uinteger(n)&&m.uinteger(i)&&m.uinteger(s)&&m.uinteger(a))return{start:ce.create(n,i),end:ce.create(s,a)};if(ce.is(n)&&ce.is(i))return{start:n,end:i};throw new Error(`Range#create called with invalid arguments[${n}, ${i}, ${s}, ${a}]`)}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&ce.is(i.start)&&ce.is(i.end)}t.is=r})(ie||(ie={}));(function(t){function e(n,i){return{uri:n,range:i}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&ie.is(i.range)&&(m.string(i.uri)||m.undefined(i.uri))}t.is=r})(Da||(Da={}));(function(t){function e(n,i,s,a){return{targetUri:n,targetRange:i,targetSelectionRange:s,originSelectionRange:a}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&ie.is(i.targetRange)&&m.string(i.targetUri)&&ie.is(i.targetSelectionRange)&&(ie.is(i.originSelectionRange)||m.undefined(i.originSelectionRange))}t.is=r})(Gf||(Gf={}));(function(t){function e(n,i,s,a){return{red:n,green:i,blue:s,alpha:a}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&m.numberRange(i.red,0,1)&&m.numberRange(i.green,0,1)&&m.numberRange(i.blue,0,1)&&m.numberRange(i.alpha,0,1)}t.is=r})(Xc||(Xc={}));(function(t){function e(n,i){return{range:n,color:i}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&ie.is(i.range)&&Xc.is(i.color)}t.is=r})(Uf||(Uf={}));(function(t){function e(n,i,s){return{label:n,textEdit:i,additionalTextEdits:s}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&m.string(i.label)&&(m.undefined(i.textEdit)||Er.is(i))&&(m.undefined(i.additionalTextEdits)||m.typedArray(i.additionalTextEdits,Er.is))}t.is=r})(qf||(qf={}));wg=(function(t){return t.Comment="comment",t.Imports="imports",t.Region="region",t})(wg||{});(function(t){function e(n,i,s,a,o,c){let l={startLine:n,endLine:i};return m.defined(s)&&(l.startCharacter=s),m.defined(a)&&(l.endCharacter=a),m.defined(o)&&(l.kind=o),m.defined(c)&&(l.collapsedText=c),l}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&m.uinteger(i.startLine)&&m.uinteger(i.startLine)&&(m.undefined(i.startCharacter)||m.uinteger(i.startCharacter))&&(m.undefined(i.endCharacter)||m.uinteger(i.endCharacter))&&(m.undefined(i.kind)||m.string(i.kind))}t.is=r})(zf||(zf={}));(function(t){function e(n,i){return{location:n,message:i}}t.create=e;function r(n){let i=n;return m.defined(i)&&Da.is(i.location)&&m.string(i.message)}t.is=r})(Jc||(Jc={}));Ig=(function(t){return t.Error=1,t.Warning=2,t.Information=3,t.Hint=4,t})(Ig||{}),_g=(function(t){return t.Unnecessary=1,t.Deprecated=2,t})(_g||{});(function(t){function e(r){let n=r;return m.objectLiteral(n)&&m.string(n.href)}t.is=e})(jf||(jf={}));(function(t){function e(n,i,s,a,o,c){let l={range:n,message:i};return m.defined(s)&&(l.severity=s),m.defined(a)&&(l.code=a),m.defined(o)&&(l.source=o),m.defined(c)&&(l.relatedInformation=c),l}t.create=e;function r(n){var i;let s=n;return m.defined(s)&&ie.is(s.range)&&m.string(s.message)&&(m.number(s.severity)||m.undefined(s.severity))&&(m.integer(s.code)||m.string(s.code)||m.undefined(s.code))&&(m.undefined(s.codeDescription)||m.string((i=s.codeDescription)===null||i===void 0?void 0:i.href))&&(m.string(s.source)||m.undefined(s.source))&&(m.undefined(s.relatedInformation)||m.typedArray(s.relatedInformation,Jc.is))}t.is=r})(Ma||(Ma={}));(function(t){function e(n,i,...s){let a={title:n,command:i};return m.defined(s)&&s.length>0&&(a.arguments=s),a}t.create=e;function r(n){let i=n;return m.defined(i)&&m.string(i.title)&&m.string(i.command)}t.is=r})(ni||(ni={}));(function(t){function e(s,a){return{range:s,newText:a}}t.replace=e;function r(s,a){return{range:{start:s,end:s},newText:a}}t.insert=r;function n(s){return{range:s,newText:""}}t.del=n;function i(s){let a=s;return m.objectLiteral(a)&&m.string(a.newText)&&ie.is(a.range)}t.is=i})(Er||(Er={}));(function(t){function e(n,i,s){let a={label:n};return i!==void 0&&(a.needsConfirmation=i),s!==void 0&&(a.description=s),a}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&m.string(i.label)&&(m.boolean(i.needsConfirmation)||i.needsConfirmation===void 0)&&(m.string(i.description)||i.description===void 0)}t.is=r})(ri||(ri={}));(function(t){function e(r){let n=r;return m.string(n)}t.is=e})(lt||(lt={}));(function(t){function e(s,a,o){return{range:s,newText:a,annotationId:o}}t.replace=e;function r(s,a,o){return{range:{start:s,end:s},newText:a,annotationId:o}}t.insert=r;function n(s,a){return{range:s,newText:"",annotationId:a}}t.del=n;function i(s){let a=s;return Er.is(a)&&(ri.is(a.annotationId)||lt.is(a.annotationId))}t.is=i})(Xr||(Xr={}));(function(t){function e(n,i){return{textDocument:n,edits:i}}t.create=e;function r(n){let i=n;return m.defined(i)&&Ga.is(i.textDocument)&&Array.isArray(i.edits)}t.is=r})(Fa||(Fa={}));(function(t){function e(n,i,s){let a={kind:"create",uri:n};return i!==void 0&&(i.overwrite!==void 0||i.ignoreIfExists!==void 0)&&(a.options=i),s!==void 0&&(a.annotationId=s),a}t.create=e;function r(n){let i=n;return i&&i.kind==="create"&&m.string(i.uri)&&(i.options===void 0||(i.options.overwrite===void 0||m.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||m.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||lt.is(i.annotationId))}t.is=r})(rs||(rs={}));(function(t){function e(n,i,s,a){let o={kind:"rename",oldUri:n,newUri:i};return s!==void 0&&(s.overwrite!==void 0||s.ignoreIfExists!==void 0)&&(o.options=s),a!==void 0&&(o.annotationId=a),o}t.create=e;function r(n){let i=n;return i&&i.kind==="rename"&&m.string(i.oldUri)&&m.string(i.newUri)&&(i.options===void 0||(i.options.overwrite===void 0||m.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||m.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||lt.is(i.annotationId))}t.is=r})(ns||(ns={}));(function(t){function e(n,i,s){let a={kind:"delete",uri:n};return i!==void 0&&(i.recursive!==void 0||i.ignoreIfNotExists!==void 0)&&(a.options=i),s!==void 0&&(a.annotationId=s),a}t.create=e;function r(n){let i=n;return i&&i.kind==="delete"&&m.string(i.uri)&&(i.options===void 0||(i.options.recursive===void 0||m.boolean(i.options.recursive))&&(i.options.ignoreIfNotExists===void 0||m.boolean(i.options.ignoreIfNotExists)))&&(i.annotationId===void 0||lt.is(i.annotationId))}t.is=r})(is||(is={}));(function(t){function e(r){let n=r;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(i=>m.string(i.kind)?rs.is(i)||ns.is(i)||is.is(i):Fa.is(i)))}t.is=e})(Qc||(Qc={}));ts=class{constructor(e,r){this.edits=e,this.changeAnnotations=r}insert(e,r,n){let i,s;if(n===void 0?i=Er.insert(e,r):lt.is(n)?(s=n,i=Xr.insert(e,r,n)):(this.assertChangeAnnotations(this.changeAnnotations),s=this.changeAnnotations.manage(n),i=Xr.insert(e,r,s)),this.edits.push(i),s!==void 0)return s}replace(e,r,n){let i,s;if(n===void 0?i=Er.replace(e,r):lt.is(n)?(s=n,i=Xr.replace(e,r,n)):(this.assertChangeAnnotations(this.changeAnnotations),s=this.changeAnnotations.manage(n),i=Xr.replace(e,r,s)),this.edits.push(i),s!==void 0)return s}delete(e,r){let n,i;if(r===void 0?n=Er.del(e):lt.is(r)?(i=r,n=Xr.del(e,r)):(this.assertChangeAnnotations(this.changeAnnotations),i=this.changeAnnotations.manage(r),n=Xr.del(e,i)),this.edits.push(n),i!==void 0)return i}add(e){this.edits.push(e)}all(){return this.edits}clear(){this.edits.splice(0,this.edits.length)}assertChangeAnnotations(e){if(e===void 0)throw new Error("Text edit change is not configured to manage change annotations.")}},Zc=class{constructor(e){this._annotations=e===void 0?Object.create(null):e,this._counter=0,this._size=0}all(){return this._annotations}get size(){return this._size}manage(e,r){let n;if(lt.is(e)?n=e:(n=this.nextId(),r=e),this._annotations[n]!==void 0)throw new Error(`Id ${n} is already in use.`);if(r===void 0)throw new Error(`No annotation provided for id ${n}`);return this._annotations[n]=r,this._size++,n}nextId(){return this._counter++,this._counter.toString()}},Bf=class{constructor(e){this._textEditChanges=Object.create(null),e!==void 0?(this._workspaceEdit=e,e.documentChanges?(this._changeAnnotations=new Zc(e.changeAnnotations),e.changeAnnotations=this._changeAnnotations.all(),e.documentChanges.forEach(r=>{if(Fa.is(r)){let n=new ts(r.edits,this._changeAnnotations);this._textEditChanges[r.textDocument.uri]=n}})):e.changes&&Object.keys(e.changes).forEach(r=>{let n=new ts(e.changes[r]);this._textEditChanges[r]=n})):this._workspaceEdit={}}get edit(){return this.initDocumentChanges(),this._changeAnnotations!==void 0&&(this._changeAnnotations.size===0?this._workspaceEdit.changeAnnotations=void 0:this._workspaceEdit.changeAnnotations=this._changeAnnotations.all()),this._workspaceEdit}getTextEditChange(e){if(Ga.is(e)){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");let r={uri:e.uri,version:e.version},n=this._textEditChanges[r.uri];if(!n){let i=[],s={textDocument:r,edits:i};this._workspaceEdit.documentChanges.push(s),n=new ts(i,this._changeAnnotations),this._textEditChanges[r.uri]=n}return n}else{if(this.initChanges(),this._workspaceEdit.changes===void 0)throw new Error("Workspace edit is not configured for normal text edit changes.");let r=this._textEditChanges[e];if(!r){let n=[];this._workspaceEdit.changes[e]=n,r=new ts(n),this._textEditChanges[e]=r}return r}}initDocumentChanges(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._changeAnnotations=new Zc,this._workspaceEdit.documentChanges=[],this._workspaceEdit.changeAnnotations=this._changeAnnotations.all())}initChanges(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._workspaceEdit.changes=Object.create(null))}createFile(e,r,n){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");let i;ri.is(r)||lt.is(r)?i=r:n=r;let s,a;if(i===void 0?s=rs.create(e,n):(a=lt.is(i)?i:this._changeAnnotations.manage(i),s=rs.create(e,n,a)),this._workspaceEdit.documentChanges.push(s),a!==void 0)return a}renameFile(e,r,n,i){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");let s;ri.is(n)||lt.is(n)?s=n:i=n;let a,o;if(s===void 0?a=ns.create(e,r,i):(o=lt.is(s)?s:this._changeAnnotations.manage(s),a=ns.create(e,r,i,o)),this._workspaceEdit.documentChanges.push(a),o!==void 0)return o}deleteFile(e,r,n){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");let i;ri.is(r)||lt.is(r)?i=r:n=r;let s,a;if(i===void 0?s=is.create(e,n):(a=lt.is(i)?i:this._changeAnnotations.manage(i),s=is.create(e,n,a)),this._workspaceEdit.documentChanges.push(s),a!==void 0)return a}};(function(t){function e(n){return{uri:n}}t.create=e;function r(n){let i=n;return m.defined(i)&&m.string(i.uri)}t.is=r})(Wf||(Wf={}));(function(t){function e(n,i){return{uri:n,version:i}}t.create=e;function r(n){let i=n;return m.defined(i)&&m.string(i.uri)&&m.integer(i.version)}t.is=r})(Vf||(Vf={}));(function(t){function e(n,i){return{uri:n,version:i}}t.create=e;function r(n){let i=n;return m.defined(i)&&m.string(i.uri)&&(i.version===null||m.integer(i.version))}t.is=r})(Ga||(Ga={}));(function(t){function e(n,i,s,a){return{uri:n,languageId:i,version:s,text:a}}t.create=e;function r(n){let i=n;return m.defined(i)&&m.string(i.uri)&&m.string(i.languageId)&&m.integer(i.version)&&m.string(i.text)}t.is=r})(Kf||(Kf={}));(function(t){t.PlainText="plaintext",t.Markdown="markdown";function e(r){let n=r;return n===t.PlainText||n===t.Markdown}t.is=e})(el||(el={}));(function(t){function e(r){let n=r;return m.objectLiteral(r)&&el.is(n.kind)&&m.string(n.value)}t.is=e})(ss||(ss={}));bg=(function(t){return t.Text=1,t.Method=2,t.Function=3,t.Constructor=4,t.Field=5,t.Variable=6,t.Class=7,t.Interface=8,t.Module=9,t.Property=10,t.Unit=11,t.Value=12,t.Enum=13,t.Keyword=14,t.Snippet=15,t.Color=16,t.File=17,t.Reference=18,t.Folder=19,t.EnumMember=20,t.Constant=21,t.Struct=22,t.Event=23,t.Operator=24,t.TypeParameter=25,t})(bg||{}),Pg=(function(t){return t.PlainText=1,t.Snippet=2,t})(Pg||{}),Og=(function(t){return t.Deprecated=1,t})(Og||{});(function(t){function e(n,i,s){return{newText:n,insert:i,replace:s}}t.create=e;function r(n){let i=n;return i&&m.string(i.newText)&&ie.is(i.insert)&&ie.is(i.replace)}t.is=r})(Hf||(Hf={}));Lg=(function(t){return t.asIs=1,t.adjustIndentation=2,t})(Lg||{});(function(t){function e(r){let n=r;return n&&(m.string(n.detail)||n.detail===void 0)&&(m.string(n.description)||n.description===void 0)}t.is=e})(Yf||(Yf={}));(function(t){function e(r){return{label:r}}t.create=e})(Xf||(Xf={}));(function(t){function e(r,n){return{items:r||[],isIncomplete:!!n}}t.create=e})(Jf||(Jf={}));(function(t){function e(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}t.fromPlainText=e;function r(n){let i=n;return m.string(i)||m.objectLiteral(i)&&m.string(i.language)&&m.string(i.value)}t.is=r})(Ua||(Ua={}));(function(t){function e(r){let n=r;return!!n&&m.objectLiteral(n)&&(ss.is(n.contents)||Ua.is(n.contents)||m.typedArray(n.contents,Ua.is))&&(r.range===void 0||ie.is(r.range))}t.is=e})(Qf||(Qf={}));(function(t){function e(r,n){return n?{label:r,documentation:n}:{label:r}}t.create=e})(Zf||(Zf={}));(function(t){function e(r,n,...i){let s={label:r};return m.defined(n)&&(s.documentation=n),m.defined(i)?s.parameters=i:s.parameters=[],s}t.create=e})(ed||(ed={}));Dg=(function(t){return t.Text=1,t.Read=2,t.Write=3,t})(Dg||{});(function(t){function e(r,n){let i={range:r};return m.number(n)&&(i.kind=n),i}t.create=e})(td||(td={}));Mg=(function(t){return t.File=1,t.Module=2,t.Namespace=3,t.Package=4,t.Class=5,t.Method=6,t.Property=7,t.Field=8,t.Constructor=9,t.Enum=10,t.Interface=11,t.Function=12,t.Variable=13,t.Constant=14,t.String=15,t.Number=16,t.Boolean=17,t.Array=18,t.Object=19,t.Key=20,t.Null=21,t.EnumMember=22,t.Struct=23,t.Event=24,t.Operator=25,t.TypeParameter=26,t})(Mg||{}),Fg=(function(t){return t.Deprecated=1,t})(Fg||{});(function(t){function e(r,n,i,s,a){let o={name:r,kind:n,location:{uri:s,range:i}};return a&&(o.containerName=a),o}t.create=e})(rd||(rd={}));(function(t){function e(r,n,i,s){return s!==void 0?{name:r,kind:n,location:{uri:i,range:s}}:{name:r,kind:n,location:{uri:i}}}t.create=e})(nd||(nd={}));(function(t){function e(n,i,s,a,o,c){let l={name:n,detail:i,kind:s,range:a,selectionRange:o};return c!==void 0&&(l.children=c),l}t.create=e;function r(n){let i=n;return i&&m.string(i.name)&&m.number(i.kind)&&ie.is(i.range)&&ie.is(i.selectionRange)&&(i.detail===void 0||m.string(i.detail))&&(i.deprecated===void 0||m.boolean(i.deprecated))&&(i.children===void 0||Array.isArray(i.children))&&(i.tags===void 0||Array.isArray(i.tags))}t.is=r})(id||(id={}));Gg=(function(t){return t.Empty="",t.QuickFix="quickfix",t.Refactor="refactor",t.RefactorExtract="refactor.extract",t.RefactorInline="refactor.inline",t.RefactorRewrite="refactor.rewrite",t.Source="source",t.SourceOrganizeImports="source.organizeImports",t.SourceFixAll="source.fixAll",t})(Gg||{}),tl=(function(t){return t.Invoked=1,t.Automatic=2,t})(tl||{});(function(t){function e(n,i,s){let a={diagnostics:n};return i!=null&&(a.only=i),s!=null&&(a.triggerKind=s),a}t.create=e;function r(n){let i=n;return m.defined(i)&&m.typedArray(i.diagnostics,Ma.is)&&(i.only===void 0||m.typedArray(i.only,m.string))&&(i.triggerKind===void 0||i.triggerKind===tl.Invoked||i.triggerKind===tl.Automatic)}t.is=r})(sd||(sd={}));(function(t){function e(n,i,s){let a={title:n},o=!0;return typeof i=="string"?(o=!1,a.kind=i):ni.is(i)?a.command=i:a.edit=i,o&&s!==void 0&&(a.kind=s),a}t.create=e;function r(n){let i=n;return i&&m.string(i.title)&&(i.diagnostics===void 0||m.typedArray(i.diagnostics,Ma.is))&&(i.kind===void 0||m.string(i.kind))&&(i.edit!==void 0||i.command!==void 0)&&(i.command===void 0||ni.is(i.command))&&(i.isPreferred===void 0||m.boolean(i.isPreferred))&&(i.edit===void 0||Qc.is(i.edit))}t.is=r})(ad||(ad={}));(function(t){function e(n,i){let s={range:n};return m.defined(i)&&(s.data=i),s}t.create=e;function r(n){let i=n;return m.defined(i)&&ie.is(i.range)&&(m.undefined(i.command)||ni.is(i.command))}t.is=r})(od||(od={}));(function(t){function e(n,i){return{tabSize:n,insertSpaces:i}}t.create=e;function r(n){let i=n;return m.defined(i)&&m.uinteger(i.tabSize)&&m.boolean(i.insertSpaces)}t.is=r})(cd||(cd={}));(function(t){function e(n,i,s){return{range:n,target:i,data:s}}t.create=e;function r(n){let i=n;return m.defined(i)&&ie.is(i.range)&&(m.undefined(i.target)||m.string(i.target))}t.is=r})(ld||(ld={}));(function(t){function e(n,i){return{range:n,parent:i}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&ie.is(i.range)&&(i.parent===void 0||t.is(i.parent))}t.is=r})(ud||(ud={}));Ug=(function(t){return t.namespace="namespace",t.type="type",t.class="class",t.enum="enum",t.interface="interface",t.struct="struct",t.typeParameter="typeParameter",t.parameter="parameter",t.variable="variable",t.property="property",t.enumMember="enumMember",t.event="event",t.function="function",t.method="method",t.macro="macro",t.keyword="keyword",t.modifier="modifier",t.comment="comment",t.string="string",t.number="number",t.regexp="regexp",t.operator="operator",t.decorator="decorator",t})(Ug||{}),qg=(function(t){return t.declaration="declaration",t.definition="definition",t.readonly="readonly",t.static="static",t.deprecated="deprecated",t.abstract="abstract",t.async="async",t.modification="modification",t.documentation="documentation",t.defaultLibrary="defaultLibrary",t})(qg||{});(function(t){function e(r){let n=r;return m.objectLiteral(n)&&(n.resultId===void 0||typeof n.resultId=="string")&&Array.isArray(n.data)&&(n.data.length===0||typeof n.data[0]=="number")}t.is=e})(fd||(fd={}));(function(t){function e(n,i){return{range:n,text:i}}t.create=e;function r(n){let i=n;return i!=null&&ie.is(i.range)&&m.string(i.text)}t.is=r})(dd||(dd={}));(function(t){function e(n,i,s){return{range:n,variableName:i,caseSensitiveLookup:s}}t.create=e;function r(n){let i=n;return i!=null&&ie.is(i.range)&&m.boolean(i.caseSensitiveLookup)&&(m.string(i.variableName)||i.variableName===void 0)}t.is=r})(pd||(pd={}));(function(t){function e(n,i){return{range:n,expression:i}}t.create=e;function r(n){let i=n;return i!=null&&ie.is(i.range)&&(m.string(i.expression)||i.expression===void 0)}t.is=r})(hd||(hd={}));(function(t){function e(n,i){return{frameId:n,stoppedLocation:i}}t.create=e;function r(n){let i=n;return m.defined(i)&&ie.is(n.stoppedLocation)}t.is=r})(md||(md={}));(function(t){t.Type=1,t.Parameter=2;function e(r){return r===1||r===2}t.is=e})(rl||(rl={}));(function(t){function e(n){return{value:n}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&(i.tooltip===void 0||m.string(i.tooltip)||ss.is(i.tooltip))&&(i.location===void 0||Da.is(i.location))&&(i.command===void 0||ni.is(i.command))}t.is=r})(nl||(nl={}));(function(t){function e(n,i,s){let a={position:n,label:i};return s!==void 0&&(a.kind=s),a}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&ce.is(i.position)&&(m.string(i.label)||m.typedArray(i.label,nl.is))&&(i.kind===void 0||rl.is(i.kind))&&i.textEdits===void 0||m.typedArray(i.textEdits,Er.is)&&(i.tooltip===void 0||m.string(i.tooltip)||ss.is(i.tooltip))&&(i.paddingLeft===void 0||m.boolean(i.paddingLeft))&&(i.paddingRight===void 0||m.boolean(i.paddingRight))}t.is=r})(gd||(gd={}));(function(t){function e(r){return{kind:"snippet",value:r}}t.createSnippet=e})(yd||(yd={}));(function(t){function e(r,n,i,s){return{insertText:r,filterText:n,range:i,command:s}}t.create=e})(Td||(Td={}));(function(t){function e(r){return{items:r}}t.create=e})(Rd||(Rd={}));zg=(function(t){return t.Invoked=0,t.Automatic=1,t})(zg||{});(function(t){function e(r,n){return{range:r,text:n}}t.create=e})(xd||(xd={}));(function(t){function e(r,n){return{triggerKind:r,selectedCompletionInfo:n}}t.create=e})(vd||(vd={}));(function(t){function e(r){let n=r;return m.objectLiteral(n)&&Yc.is(n.uri)&&m.string(n.name)}t.is=e})(Ed||(Ed={}));IA=[` -`,`\r -`,"\r"];(function(t){function e(s,a,o,c){return new $d(s,a,o,c)}t.create=e;function r(s){let a=s;return!!(m.defined(a)&&m.string(a.uri)&&(m.undefined(a.languageId)||m.string(a.languageId))&&m.uinteger(a.lineCount)&&m.func(a.getText)&&m.func(a.positionAt)&&m.func(a.offsetAt))}t.is=r;function n(s,a){let o=s.getText(),c=i(a,(u,p)=>{let h=u.range.start.line-p.range.start.line;return h===0?u.range.start.character-p.range.start.character:h}),l=o.length;for(let u=c.length-1;u>=0;u--){let p=c[u],h=s.offsetAt(p.range.start),g=s.offsetAt(p.range.end);if(g<=l)o=o.substring(0,h)+p.newText+o.substring(g,o.length);else throw new Error("Overlapping edit");l=h}return o}t.applyEdits=n;function i(s,a){if(s.length<=1)return s;let o=s.length/2|0,c=s.slice(0,o),l=s.slice(o);i(c,a),i(l,a);let u=0,p=0,h=0;for(;u0&&e.push(r.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let r=this.getLineOffsets(),n=0,i=r.length;if(i===0)return ce.create(0,e);for(;ne?i=a:n=a+1}let s=n-1;return ce.create(s,e-r[s])}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line],i=e.line+1"u"}t.undefined=n;function i(g){return g===!0||g===!1}t.boolean=i;function s(g){return e.call(g)==="[object String]"}t.string=s;function a(g){return e.call(g)==="[object Number]"}t.number=a;function o(g,C,k){return e.call(g)==="[object Number]"&&C<=g&&g<=k}t.numberRange=o;function c(g){return e.call(g)==="[object Number]"&&-2147483648<=g&&g<=2147483647}t.integer=c;function l(g){return e.call(g)==="[object Number]"&&0<=g&&g<=2147483647}t.uinteger=l;function u(g){return e.call(g)==="[object Function]"}t.func=u;function p(g){return g!==null&&typeof g=="object"}t.objectLiteral=p;function h(g,C){return Array.isArray(g)&&g.every(C)}t.typedArray=h})(m||(m={}))});var Rn=X(Od=>{"use strict";Object.defineProperty(Od,"__esModule",{value:!0});var bd;function Pd(){if(bd===void 0)throw new Error("No runtime abstraction layer installed");return bd}(function(t){function e(r){if(r===void 0)throw new Error("No runtime abstraction layer provided");bd=r}t.install=e})(Pd||(Pd={}));Od.default=Pd});var ls=X(Tt=>{"use strict";Object.defineProperty(Tt,"__esModule",{value:!0});Tt.stringArray=Tt.array=Tt.func=Tt.error=Tt.number=Tt.string=Tt.boolean=void 0;function zA(t){return t===!0||t===!1}Tt.boolean=zA;function Hg(t){return typeof t=="string"||t instanceof String}Tt.string=Hg;function jA(t){return typeof t=="number"||t instanceof Number}Tt.number=jA;function BA(t){return t instanceof Error}Tt.error=BA;function WA(t){return typeof t=="function"}Tt.func=WA;function Yg(t){return Array.isArray(t)}Tt.array=Yg;function VA(t){return Yg(t)&&t.every(e=>Hg(e))}Tt.stringArray=VA});var ci=X(us=>{"use strict";Object.defineProperty(us,"__esModule",{value:!0});us.Emitter=us.Event=void 0;var KA=Rn(),Xg;(function(t){let e={dispose(){}};t.None=function(){return e}})(Xg||(us.Event=Xg={}));var Ld=class{add(e,r=null,n){this._callbacks||(this._callbacks=[],this._contexts=[]),this._callbacks.push(e),this._contexts.push(r),Array.isArray(n)&&n.push({dispose:()=>this.remove(e,r)})}remove(e,r=null){if(!this._callbacks)return;let n=!1;for(let i=0,s=this._callbacks.length;i{this._callbacks||(this._callbacks=new Ld),this._options&&this._options.onFirstListenerAdd&&this._callbacks.isEmpty()&&this._options.onFirstListenerAdd(this),this._callbacks.add(e,r);let i={dispose:()=>{this._callbacks&&(this._callbacks.remove(e,r),i.dispose=t._noop,this._options&&this._options.onLastListenerRemove&&this._callbacks.isEmpty()&&this._options.onLastListenerRemove(this))}};return Array.isArray(n)&&n.push(i),i}),this._event}fire(e){this._callbacks&&this._callbacks.invoke.call(this._callbacks,e)}dispose(){this._callbacks&&(this._callbacks.dispose(),this._callbacks=void 0)}};us.Emitter=ll;ll._noop=function(){}});var Ka=X(fs=>{"use strict";Object.defineProperty(fs,"__esModule",{value:!0});fs.CancellationTokenSource=fs.CancellationToken=void 0;var HA=Rn(),YA=ls(),Dd=ci(),ul;(function(t){t.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:Dd.Event.None}),t.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:Dd.Event.None});function e(r){let n=r;return n&&(n===t.None||n===t.Cancelled||YA.boolean(n.isCancellationRequested)&&!!n.onCancellationRequested)}t.is=e})(ul||(fs.CancellationToken=ul={}));var XA=Object.freeze(function(t,e){let r=(0,HA.default)().timer.setTimeout(t.bind(e),0);return{dispose(){r.dispose()}}}),fl=class{constructor(){this._isCancelled=!1}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?XA:(this._emitter||(this._emitter=new Dd.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=void 0)}},Md=class{get token(){return this._token||(this._token=new fl),this._token}cancel(){this._token?this._token.cancel():this._token=ul.Cancelled}dispose(){this._token?this._token instanceof fl&&this._token.dispose():this._token=ul.None}};fs.CancellationTokenSource=Md});var dp=X(j=>{"use strict";Object.defineProperty(j,"__esModule",{value:!0});j.Message=j.NotificationType9=j.NotificationType8=j.NotificationType7=j.NotificationType6=j.NotificationType5=j.NotificationType4=j.NotificationType3=j.NotificationType2=j.NotificationType1=j.NotificationType0=j.NotificationType=j.RequestType9=j.RequestType8=j.RequestType7=j.RequestType6=j.RequestType5=j.RequestType4=j.RequestType3=j.RequestType2=j.RequestType1=j.RequestType=j.RequestType0=j.AbstractMessageSignature=j.ParameterStructures=j.ResponseError=j.ErrorCodes=void 0;var pi=ls(),zd=(function(t){return t.ParseError=-32700,t.InvalidRequest=-32600,t.MethodNotFound=-32601,t.InvalidParams=-32602,t.InternalError=-32603,t.jsonrpcReservedErrorRangeStart=-32099,t.serverErrorStart=-32099,t.MessageWriteError=-32099,t.MessageReadError=-32098,t.PendingResponseRejected=-32097,t.ConnectionInactive=-32096,t.ServerNotInitialized=-32002,t.UnknownErrorCode=-32001,t.jsonrpcReservedErrorRangeEnd=-32e3,t.serverErrorEnd=-32e3,t})(zd||(j.ErrorCodes=zd={})),jd=class t extends Error{constructor(e,r,n){super(r),this.code=pi.number(e)?e:zd.UnknownErrorCode,this.data=n,Object.setPrototypeOf(this,t.prototype)}toJson(){let e={code:this.code,message:this.message};return this.data!==void 0&&(e.data=this.data),e}};j.ResponseError=jd;var Lt=class t{constructor(e){this.kind=e}static is(e){return e===t.auto||e===t.byName||e===t.byPosition}toString(){return this.kind}};j.ParameterStructures=Lt;Lt.auto=new Lt("auto");Lt.byPosition=new Lt("byPosition");Lt.byName=new Lt("byName");var Ie=class{constructor(e,r){this.method=e,this.numberOfParams=r}get parameterStructures(){return Lt.auto}};j.AbstractMessageSignature=Ie;var Bd=class extends Ie{constructor(e){super(e,0)}};j.RequestType0=Bd;var Wd=class extends Ie{constructor(e,r=Lt.auto){super(e,1),this._parameterStructures=r}get parameterStructures(){return this._parameterStructures}};j.RequestType=Wd;var Vd=class extends Ie{constructor(e,r=Lt.auto){super(e,1),this._parameterStructures=r}get parameterStructures(){return this._parameterStructures}};j.RequestType1=Vd;var Kd=class extends Ie{constructor(e){super(e,2)}};j.RequestType2=Kd;var Hd=class extends Ie{constructor(e){super(e,3)}};j.RequestType3=Hd;var Yd=class extends Ie{constructor(e){super(e,4)}};j.RequestType4=Yd;var Xd=class extends Ie{constructor(e){super(e,5)}};j.RequestType5=Xd;var Jd=class extends Ie{constructor(e){super(e,6)}};j.RequestType6=Jd;var Qd=class extends Ie{constructor(e){super(e,7)}};j.RequestType7=Qd;var Zd=class extends Ie{constructor(e){super(e,8)}};j.RequestType8=Zd;var ep=class extends Ie{constructor(e){super(e,9)}};j.RequestType9=ep;var tp=class extends Ie{constructor(e,r=Lt.auto){super(e,1),this._parameterStructures=r}get parameterStructures(){return this._parameterStructures}};j.NotificationType=tp;var rp=class extends Ie{constructor(e){super(e,0)}};j.NotificationType0=rp;var np=class extends Ie{constructor(e,r=Lt.auto){super(e,1),this._parameterStructures=r}get parameterStructures(){return this._parameterStructures}};j.NotificationType1=np;var ip=class extends Ie{constructor(e){super(e,2)}};j.NotificationType2=ip;var sp=class extends Ie{constructor(e){super(e,3)}};j.NotificationType3=sp;var ap=class extends Ie{constructor(e){super(e,4)}};j.NotificationType4=ap;var op=class extends Ie{constructor(e){super(e,5)}};j.NotificationType5=op;var cp=class extends Ie{constructor(e){super(e,6)}};j.NotificationType6=cp;var lp=class extends Ie{constructor(e){super(e,7)}};j.NotificationType7=lp;var up=class extends Ie{constructor(e){super(e,8)}};j.NotificationType8=up;var fp=class extends Ie{constructor(e){super(e,9)}};j.NotificationType9=fp;var cy;(function(t){function e(i){let s=i;return s&&pi.string(s.method)&&(pi.string(s.id)||pi.number(s.id))}t.isRequest=e;function r(i){let s=i;return s&&pi.string(s.method)&&i.id===void 0}t.isNotification=r;function n(i){let s=i;return s&&(s.result!==void 0||!!s.error)&&(pi.string(s.id)||pi.number(s.id)||s.id===null)}t.isResponse=n})(cy||(j.Message=cy={}))});var hp=X(xn=>{"use strict";var ly;Object.defineProperty(xn,"__esModule",{value:!0});xn.LRUCache=xn.LinkedMap=xn.Touch=void 0;var xt;(function(t){t.None=0,t.First=1,t.AsOld=t.First,t.Last=2,t.AsNew=t.Last})(xt||(xn.Touch=xt={}));var Tl=class{constructor(){this[ly]="LinkedMap",this._map=new Map,this._head=void 0,this._tail=void 0,this._size=0,this._state=0}clear(){this._map.clear(),this._head=void 0,this._tail=void 0,this._size=0,this._state++}isEmpty(){return!this._head&&!this._tail}get size(){return this._size}get first(){return this._head?.value}get last(){return this._tail?.value}has(e){return this._map.has(e)}get(e,r=xt.None){let n=this._map.get(e);if(n)return r!==xt.None&&this.touch(n,r),n.value}set(e,r,n=xt.None){let i=this._map.get(e);if(i)i.value=r,n!==xt.None&&this.touch(i,n);else{switch(i={key:e,value:r,next:void 0,previous:void 0},n){case xt.None:this.addItemLast(i);break;case xt.First:this.addItemFirst(i);break;case xt.Last:this.addItemLast(i);break;default:this.addItemLast(i);break}this._map.set(e,i),this._size++}return this}delete(e){return!!this.remove(e)}remove(e){let r=this._map.get(e);if(r)return this._map.delete(e),this.removeItem(r),this._size--,r.value}shift(){if(!this._head&&!this._tail)return;if(!this._head||!this._tail)throw new Error("Invalid list");let e=this._head;return this._map.delete(e.key),this.removeItem(e),this._size--,e.value}forEach(e,r){let n=this._state,i=this._head;for(;i;){if(r?e.bind(r)(i.value,i.key,this):e(i.value,i.key,this),this._state!==n)throw new Error("LinkedMap got modified during iteration.");i=i.next}}keys(){let e=this._state,r=this._head,n={[Symbol.iterator]:()=>n,next:()=>{if(this._state!==e)throw new Error("LinkedMap got modified during iteration.");if(r){let i={value:r.key,done:!1};return r=r.next,i}else return{value:void 0,done:!0}}};return n}values(){let e=this._state,r=this._head,n={[Symbol.iterator]:()=>n,next:()=>{if(this._state!==e)throw new Error("LinkedMap got modified during iteration.");if(r){let i={value:r.value,done:!1};return r=r.next,i}else return{value:void 0,done:!0}}};return n}entries(){let e=this._state,r=this._head,n={[Symbol.iterator]:()=>n,next:()=>{if(this._state!==e)throw new Error("LinkedMap got modified during iteration.");if(r){let i={value:[r.key,r.value],done:!1};return r=r.next,i}else return{value:void 0,done:!0}}};return n}[(ly=Symbol.toStringTag,Symbol.iterator)](){return this.entries()}trimOld(e){if(e>=this.size)return;if(e===0){this.clear();return}let r=this._head,n=this.size;for(;r&&n>e;)this._map.delete(r.key),r=r.next,n--;this._head=r,this._size=n,r&&(r.previous=void 0),this._state++}addItemFirst(e){if(!this._head&&!this._tail)this._tail=e;else if(this._head)e.next=this._head,this._head.previous=e;else throw new Error("Invalid list");this._head=e,this._state++}addItemLast(e){if(!this._head&&!this._tail)this._head=e;else if(this._tail)e.previous=this._tail,this._tail.next=e;else throw new Error("Invalid list");this._tail=e,this._state++}removeItem(e){if(e===this._head&&e===this._tail)this._head=void 0,this._tail=void 0;else if(e===this._head){if(!e.next)throw new Error("Invalid list");e.next.previous=void 0,this._head=e.next}else if(e===this._tail){if(!e.previous)throw new Error("Invalid list");e.previous.next=void 0,this._tail=e.previous}else{let r=e.next,n=e.previous;if(!r||!n)throw new Error("Invalid list");r.previous=n,n.next=r}e.next=void 0,e.previous=void 0,this._state++}touch(e,r){if(!this._head||!this._tail)throw new Error("Invalid list");if(!(r!==xt.First&&r!==xt.Last)){if(r===xt.First){if(e===this._head)return;let n=e.next,i=e.previous;e===this._tail?(i.next=void 0,this._tail=i):(n.previous=i,i.next=n),e.previous=void 0,e.next=this._head,this._head.previous=e,this._head=e,this._state++}else if(r===xt.Last){if(e===this._tail)return;let n=e.next,i=e.previous;e===this._head?(n.previous=void 0,this._head=n):(n.previous=i,i.next=n),e.next=void 0,e.previous=this._tail,this._tail.next=e,this._tail=e,this._state++}}}toJSON(){let e=[];return this.forEach((r,n)=>{e.push([n,r])}),e}fromJSON(e){this.clear();for(let[r,n]of e)this.set(r,n)}};xn.LinkedMap=Tl;var pp=class extends Tl{constructor(e,r=1){super(),this._limit=e,this._ratio=Math.min(Math.max(0,r),1)}get limit(){return this._limit}set limit(e){this._limit=e,this.checkTrim()}get ratio(){return this._ratio}set ratio(e){this._ratio=Math.min(Math.max(0,e),1),this.checkTrim()}get(e,r=xt.AsNew){return super.get(e,r)}peek(e){return super.get(e,xt.None)}set(e,r){return super.set(e,r,xt.Last),this.checkTrim(),this}checkTrim(){this.size>this._limit&&this.trimOld(Math.round(this._limit*this._ratio))}};xn.LRUCache=pp});var fy=X(Rl=>{"use strict";Object.defineProperty(Rl,"__esModule",{value:!0});Rl.Disposable=void 0;var uy;(function(t){function e(r){return{dispose:r}}t.create=e})(uy||(Rl.Disposable=uy={}))});var dy=X(Ts=>{"use strict";Object.defineProperty(Ts,"__esModule",{value:!0});Ts.SharedArrayReceiverStrategy=Ts.SharedArraySenderStrategy=void 0;var ZA=Ka(),xl=(function(t){return t.Continue=0,t.Cancelled=1,t})(xl||{}),mp=class{constructor(){this.buffers=new Map}enableCancellation(e){if(e.id===null)return;let r=new SharedArrayBuffer(4),n=new Int32Array(r,0,1);n[0]=xl.Continue,this.buffers.set(e.id,r),e.$cancellationData=r}sendCancellation(e,r){return P(this,null,function*(){let n=this.buffers.get(r);if(n===void 0)return;let i=new Int32Array(n,0,1);Atomics.store(i,0,xl.Cancelled)})}cleanup(e){this.buffers.delete(e)}dispose(){this.buffers.clear()}};Ts.SharedArraySenderStrategy=mp;var gp=class{constructor(e){this.data=new Int32Array(e,0,1)}get isCancellationRequested(){return Atomics.load(this.data,0)===xl.Cancelled}get onCancellationRequested(){throw new Error("Cancellation over SharedArrayBuffer doesn't support cancellation events")}},yp=class{constructor(e){this.token=new gp(e)}cancel(){}dispose(){}},Tp=class{constructor(){this.kind="request"}createCancellationTokenSource(e){let r=e.$cancellationData;return r===void 0?new ZA.CancellationTokenSource:new yp(r)}};Ts.SharedArrayReceiverStrategy=Tp});var xp=X(vl=>{"use strict";Object.defineProperty(vl,"__esModule",{value:!0});vl.Semaphore=void 0;var e$=Rn(),Rp=class{constructor(e=1){if(e<=0)throw new Error("Capacity must be greater than 0");this._capacity=e,this._active=0,this._waiting=[]}lock(e){return new Promise((r,n)=>{this._waiting.push({thunk:e,resolve:r,reject:n}),this.runNext()})}get active(){return this._active}runNext(){this._waiting.length===0||this._active===this._capacity||(0,e$.default)().timer.setImmediate(()=>this.doRunNext())}doRunNext(){if(this._waiting.length===0||this._active===this._capacity)return;let e=this._waiting.shift();if(this._active++,this._active>this._capacity)throw new Error("To many thunks active");try{let r=e.thunk();r instanceof Promise?r.then(n=>{this._active--,e.resolve(n),this.runNext()},n=>{this._active--,e.reject(n),this.runNext()}):(this._active--,e.resolve(r),this.runNext())}catch(r){this._active--,e.reject(r),this.runNext()}}};vl.Semaphore=Rp});var hy=X(vn=>{"use strict";Object.defineProperty(vn,"__esModule",{value:!0});vn.ReadableStreamMessageReader=vn.AbstractMessageReader=vn.MessageReader=void 0;var Ep=Rn(),Rs=ls(),vp=ci(),t$=xp(),py;(function(t){function e(r){let n=r;return n&&Rs.func(n.listen)&&Rs.func(n.dispose)&&Rs.func(n.onError)&&Rs.func(n.onClose)&&Rs.func(n.onPartialMessage)}t.is=e})(py||(vn.MessageReader=py={}));var El=class{constructor(){this.errorEmitter=new vp.Emitter,this.closeEmitter=new vp.Emitter,this.partialMessageEmitter=new vp.Emitter}dispose(){this.errorEmitter.dispose(),this.closeEmitter.dispose()}get onError(){return this.errorEmitter.event}fireError(e){this.errorEmitter.fire(this.asError(e))}get onClose(){return this.closeEmitter.event}fireClose(){this.closeEmitter.fire(void 0)}get onPartialMessage(){return this.partialMessageEmitter.event}firePartialMessage(e){this.partialMessageEmitter.fire(e)}asError(e){return e instanceof Error?e:new Error(`Reader received error. Reason: ${Rs.string(e.message)?e.message:"unknown"}`)}};vn.AbstractMessageReader=El;var Ap;(function(t){function e(r){let n,i,s,a=new Map,o,c=new Map;if(r===void 0||typeof r=="string")n=r??"utf-8";else{if(n=r.charset??"utf-8",r.contentDecoder!==void 0&&(s=r.contentDecoder,a.set(s.name,s)),r.contentDecoders!==void 0)for(let l of r.contentDecoders)a.set(l.name,l);if(r.contentTypeDecoder!==void 0&&(o=r.contentTypeDecoder,c.set(o.name,o)),r.contentTypeDecoders!==void 0)for(let l of r.contentTypeDecoders)c.set(l.name,l)}return o===void 0&&(o=(0,Ep.default)().applicationJson.decoder,c.set(o.name,o)),{charset:n,contentDecoder:s,contentDecoders:a,contentTypeDecoder:o,contentTypeDecoders:c}}t.fromOptions=e})(Ap||(Ap={}));var $p=class extends El{constructor(e,r){super(),this.readable=e,this.options=Ap.fromOptions(r),this.buffer=(0,Ep.default)().messageBuffer.create(this.options.charset),this._partialMessageTimeout=1e4,this.nextMessageLength=-1,this.messageToken=0,this.readSemaphore=new t$.Semaphore(1)}set partialMessageTimeout(e){this._partialMessageTimeout=e}get partialMessageTimeout(){return this._partialMessageTimeout}listen(e){this.nextMessageLength=-1,this.messageToken=0,this.partialMessageTimer=void 0,this.callback=e;let r=this.readable.onData(n=>{this.onData(n)});return this.readable.onError(n=>this.fireError(n)),this.readable.onClose(()=>this.fireClose()),r}onData(e){try{for(this.buffer.append(e);;){if(this.nextMessageLength===-1){let n=this.buffer.tryReadHeaders(!0);if(!n)return;let i=n.get("content-length");if(!i){this.fireError(new Error(`Header must provide a Content-Length property. -${JSON.stringify(Object.fromEntries(n))}`));return}let s=parseInt(i);if(isNaN(s)){this.fireError(new Error(`Content-Length value must be a number. Got ${i}`));return}this.nextMessageLength=s}let r=this.buffer.tryReadBody(this.nextMessageLength);if(r===void 0){this.setPartialMessageTimer();return}this.clearPartialMessageTimer(),this.nextMessageLength=-1,this.readSemaphore.lock(()=>P(this,null,function*(){let n=this.options.contentDecoder!==void 0?yield this.options.contentDecoder.decode(r):r,i=yield this.options.contentTypeDecoder.decode(n,this.options);this.callback(i)})).catch(n=>{this.fireError(n)})}}catch(r){this.fireError(r)}}clearPartialMessageTimer(){this.partialMessageTimer&&(this.partialMessageTimer.dispose(),this.partialMessageTimer=void 0)}setPartialMessageTimer(){this.clearPartialMessageTimer(),!(this._partialMessageTimeout<=0)&&(this.partialMessageTimer=(0,Ep.default)().timer.setTimeout((e,r)=>{this.partialMessageTimer=void 0,e===this.messageToken&&(this.firePartialMessage({messageToken:e,waitingTime:r}),this.setPartialMessageTimer())},this._partialMessageTimeout,this.messageToken,this._partialMessageTimeout))}};vn.ReadableStreamMessageReader=$p});var Ry=X(En=>{"use strict";Object.defineProperty(En,"__esModule",{value:!0});En.WriteableStreamMessageWriter=En.AbstractMessageWriter=En.MessageWriter=void 0;var my=Rn(),fo=ls(),r$=xp(),gy=ci(),n$="Content-Length: ",yy=`\r -`,Ty;(function(t){function e(r){let n=r;return n&&fo.func(n.dispose)&&fo.func(n.onClose)&&fo.func(n.onError)&&fo.func(n.write)}t.is=e})(Ty||(En.MessageWriter=Ty={}));var Al=class{constructor(){this.errorEmitter=new gy.Emitter,this.closeEmitter=new gy.Emitter}dispose(){this.errorEmitter.dispose(),this.closeEmitter.dispose()}get onError(){return this.errorEmitter.event}fireError(e,r,n){this.errorEmitter.fire([this.asError(e),r,n])}get onClose(){return this.closeEmitter.event}fireClose(){this.closeEmitter.fire(void 0)}asError(e){return e instanceof Error?e:new Error(`Writer received error. Reason: ${fo.string(e.message)?e.message:"unknown"}`)}};En.AbstractMessageWriter=Al;var Sp;(function(t){function e(r){return r===void 0||typeof r=="string"?{charset:r??"utf-8",contentTypeEncoder:(0,my.default)().applicationJson.encoder}:{charset:r.charset??"utf-8",contentEncoder:r.contentEncoder,contentTypeEncoder:r.contentTypeEncoder??(0,my.default)().applicationJson.encoder}}t.fromOptions=e})(Sp||(Sp={}));var kp=class extends Al{constructor(e,r){super(),this.writable=e,this.options=Sp.fromOptions(r),this.errorCount=0,this.writeSemaphore=new r$.Semaphore(1),this.writable.onError(n=>this.fireError(n)),this.writable.onClose(()=>this.fireClose())}write(e){return P(this,null,function*(){return this.writeSemaphore.lock(()=>P(this,null,function*(){return this.options.contentTypeEncoder.encode(e,this.options).then(n=>this.options.contentEncoder!==void 0?this.options.contentEncoder.encode(n):n).then(n=>{let i=[];return i.push(n$,n.byteLength.toString(),yy),i.push(yy),this.doWrite(e,i,n)},n=>{throw this.fireError(n),n})}))})}doWrite(e,r,n){return P(this,null,function*(){try{return yield this.writable.write(r.join(""),"ascii"),this.writable.write(n)}catch(i){return this.handleError(i,e),Promise.reject(i)}})}handleError(e,r){this.errorCount++,this.fireError(e,r,this.errorCount)}end(){this.writable.end()}};En.WriteableStreamMessageWriter=kp});var xy=X($l=>{"use strict";Object.defineProperty($l,"__esModule",{value:!0});$l.AbstractMessageBuffer=void 0;var i$=13,s$=10,a$=`\r -`,Np=class{constructor(e="utf-8"){this._encoding=e,this._chunks=[],this._totalLength=0}get encoding(){return this._encoding}append(e){let r=typeof e=="string"?this.fromString(e,this._encoding):e;this._chunks.push(r),this._totalLength+=r.byteLength}tryReadHeaders(e=!1){if(this._chunks.length===0)return;let r=0,n=0,i=0,s=0;e:for(;nthis._totalLength)throw new Error("Cannot read so many bytes!");if(this._chunks[0].byteLength===e){let s=this._chunks[0];return this._chunks.shift(),this._totalLength-=e,this.asNative(s)}if(this._chunks[0].byteLength>e){let s=this._chunks[0],a=this.asNative(s,e);return this._chunks[0]=s.slice(e),this._totalLength-=e,a}let r=this.allocNative(e),n=0,i=0;for(;e>0;){let s=this._chunks[i];if(s.byteLength>e){let a=s.slice(0,e);r.set(a,n),n+=e,this._chunks[i]=s.slice(e),this._totalLength-=e,e-=e}else r.set(s,n),n+=s.byteLength,this._chunks.shift(),this._totalLength-=s.byteLength,e-=s.byteLength}return r}};$l.AbstractMessageBuffer=Np});var Sy=X(J=>{"use strict";Object.defineProperty(J,"__esModule",{value:!0});J.createMessageConnection=J.ConnectionOptions=J.MessageStrategy=J.CancellationStrategy=J.CancellationSenderStrategy=J.CancellationReceiverStrategy=J.RequestCancellationReceiverStrategy=J.IdCancellationReceiverStrategy=J.ConnectionStrategy=J.ConnectionError=J.ConnectionErrors=J.LogTraceNotification=J.SetTraceNotification=J.TraceFormat=J.TraceValues=J.Trace=J.NullLogger=J.ProgressType=J.ProgressToken=void 0;var vy=Rn(),Fe=ls(),K=dp(),Ey=hp(),po=ci(),Cp=Ka(),go;(function(t){t.type=new K.NotificationType("$/cancelRequest")})(go||(go={}));var wp;(function(t){function e(r){return typeof r=="string"||typeof r=="number"}t.is=e})(wp||(J.ProgressToken=wp={}));var ho;(function(t){t.type=new K.NotificationType("$/progress")})(ho||(ho={}));var Ip=class{constructor(){}};J.ProgressType=Ip;var _p;(function(t){function e(r){return Fe.func(r)}t.is=e})(_p||(_p={}));J.NullLogger=Object.freeze({error:()=>{},warn:()=>{},info:()=>{},log:()=>{}});var fe=(function(t){return t[t.Off=0]="Off",t[t.Messages=1]="Messages",t[t.Compact=2]="Compact",t[t.Verbose=3]="Verbose",t})(fe||(J.Trace=fe={})),Ay=(function(t){return t.Off="off",t.Messages="messages",t.Compact="compact",t.Verbose="verbose",t})(Ay||(J.TraceValues=Ay={}));(function(t){function e(n){if(!Fe.string(n))return t.Off;switch(n=n.toLowerCase(),n){case"off":return t.Off;case"messages":return t.Messages;case"compact":return t.Compact;case"verbose":return t.Verbose;default:return t.Off}}t.fromString=e;function r(n){switch(n){case t.Off:return"off";case t.Messages:return"messages";case t.Compact:return"compact";case t.Verbose:return"verbose";default:return"off"}}t.toString=r})(fe||(J.Trace=fe={}));var Wt=(function(t){return t.Text="text",t.JSON="json",t})(Wt||(J.TraceFormat=Wt={}));(function(t){function e(r){return Fe.string(r)?(r=r.toLowerCase(),r==="json"?t.JSON:t.Text):t.Text}t.fromString=e})(Wt||(J.TraceFormat=Wt={}));var bp;(function(t){t.type=new K.NotificationType("$/setTrace")})(bp||(J.SetTraceNotification=bp={}));var Sl;(function(t){t.type=new K.NotificationType("$/logTrace")})(Sl||(J.LogTraceNotification=Sl={}));var mo=(function(t){return t[t.Closed=1]="Closed",t[t.Disposed=2]="Disposed",t[t.AlreadyListening=3]="AlreadyListening",t})(mo||(J.ConnectionErrors=mo={})),xs=class t extends Error{constructor(e,r){super(r),this.code=e,Object.setPrototypeOf(this,t.prototype)}};J.ConnectionError=xs;var Pp;(function(t){function e(r){let n=r;return n&&Fe.func(n.cancelUndispatched)}t.is=e})(Pp||(J.ConnectionStrategy=Pp={}));var kl;(function(t){function e(r){let n=r;return n&&(n.kind===void 0||n.kind==="id")&&Fe.func(n.createCancellationTokenSource)&&(n.dispose===void 0||Fe.func(n.dispose))}t.is=e})(kl||(J.IdCancellationReceiverStrategy=kl={}));var Op;(function(t){function e(r){let n=r;return n&&n.kind==="request"&&Fe.func(n.createCancellationTokenSource)&&(n.dispose===void 0||Fe.func(n.dispose))}t.is=e})(Op||(J.RequestCancellationReceiverStrategy=Op={}));var Nl;(function(t){t.Message=Object.freeze({createCancellationTokenSource(r){return new Cp.CancellationTokenSource}});function e(r){return kl.is(r)||Op.is(r)}t.is=e})(Nl||(J.CancellationReceiverStrategy=Nl={}));var Cl;(function(t){t.Message=Object.freeze({sendCancellation(r,n){return r.sendNotification(go.type,{id:n})},cleanup(r){}});function e(r){let n=r;return n&&Fe.func(n.sendCancellation)&&Fe.func(n.cleanup)}t.is=e})(Cl||(J.CancellationSenderStrategy=Cl={}));var wl;(function(t){t.Message=Object.freeze({receiver:Nl.Message,sender:Cl.Message});function e(r){let n=r;return n&&Nl.is(n.receiver)&&Cl.is(n.sender)}t.is=e})(wl||(J.CancellationStrategy=wl={}));var Il;(function(t){function e(r){let n=r;return n&&Fe.func(n.handleMessage)}t.is=e})(Il||(J.MessageStrategy=Il={}));var $y;(function(t){function e(r){let n=r;return n&&(wl.is(n.cancellationStrategy)||Pp.is(n.connectionStrategy)||Il.is(n.messageStrategy))}t.is=e})($y||(J.ConnectionOptions=$y={}));var kr=(function(t){return t[t.New=1]="New",t[t.Listening=2]="Listening",t[t.Closed=3]="Closed",t[t.Disposed=4]="Disposed",t})(kr||{});function o$(t,e,r,n){let i=r!==void 0?r:J.NullLogger,s=0,a=0,o=0,c="2.0",l,u=new Map,p,h=new Map,g=new Map,C,k=new Ey.LinkedMap,G=new Map,M=new Set,b=new Map,E=fe.Off,H=Wt.Text,F,ye=kr.New,dr=new po.Emitter,Je=new po.Emitter,Qt=new po.Emitter,Kt=new po.Emitter,$=new po.Emitter,y=n&&n.cancellationStrategy?n.cancellationStrategy:wl.Message;function L(d){if(d===null)throw new Error("Can't send requests with id null since the response can't be correlated.");return"req-"+d.toString()}function O(d){return d===null?"res-unknown-"+(++o).toString():"res-"+d.toString()}function T(){return"not-"+(++a).toString()}function x(d,v){K.Message.isRequest(v)?d.set(L(v.id),v):K.Message.isResponse(v)?d.set(O(v.id),v):d.set(T(),v)}function A(d){}function _(){return ye===kr.Listening}function U(){return ye===kr.Closed}function N(){return ye===kr.Disposed}function Y(){(ye===kr.New||ye===kr.Listening)&&(ye=kr.Closed,Je.fire(void 0))}function Q(d){dr.fire([d,void 0,void 0])}function de(d){dr.fire(d)}t.onClose(Y),t.onError(Q),e.onClose(Y),e.onError(de);function ue(){C||k.size===0||(C=(0,vy.default)().timer.setImmediate(()=>{C=void 0,We()}))}function ve(d){K.Message.isRequest(d)?ot(d):K.Message.isNotification(d)?pr(d):K.Message.isResponse(d)?_t(d):Zt(d)}function We(){if(k.size===0)return;let d=k.shift();try{let v=n?.messageStrategy;Il.is(v)?v.handleMessage(d,ve):ve(d)}finally{ue()}}let js=d=>{try{if(K.Message.isNotification(d)&&d.method===go.type.method){let v=d.params.id,w=L(v),z=k.get(w);if(K.Message.isRequest(z)){let Te=n?.connectionStrategy,Ge=Te&&Te.cancelUndispatched?Te.cancelUndispatched(z,A):void 0;if(Ge&&(Ge.error!==void 0||Ge.result!==void 0)){k.delete(w),b.delete(v),Ge.id=z.id,Do(Ge,d.method,Date.now()),e.write(Ge).catch(()=>i.error("Sending response for canceled message failed."));return}}let ke=b.get(v);if(ke!==void 0){ke.cancel(),uu(d);return}else M.add(v)}x(k,d)}finally{ue()}};function ot(d){if(N())return;function v(oe,be,me){let Qe={jsonrpc:c,id:d.id};oe instanceof K.ResponseError?Qe.error=oe.toJson():Qe.result=oe===void 0?null:oe,Do(Qe,be,me),e.write(Qe).catch(()=>i.error("Sending response failed."))}function w(oe,be,me){let Qe={jsonrpc:c,id:d.id,error:oe.toJson()};Do(Qe,be,me),e.write(Qe).catch(()=>i.error("Sending response failed."))}function z(oe,be,me){oe===void 0&&(oe=null);let Qe={jsonrpc:c,id:d.id,result:oe};Do(Qe,be,me),e.write(Qe).catch(()=>i.error("Sending response failed."))}Qx(d);let ke=u.get(d.method),Te,Ge;ke&&(Te=ke.type,Ge=ke.handler);let je=Date.now();if(Ge||l){let oe=d.id??String(Date.now()),be=kl.is(y.receiver)?y.receiver.createCancellationTokenSource(oe):y.receiver.createCancellationTokenSource(d);d.id!==null&&M.has(d.id)&&be.cancel(),d.id!==null&&b.set(oe,be);try{let me;if(Ge)if(d.params===void 0){if(Te!==void 0&&Te.numberOfParams!==0){w(new K.ResponseError(K.ErrorCodes.InvalidParams,`Request ${d.method} defines ${Te.numberOfParams} params but received none.`),d.method,je);return}me=Ge(be.token)}else if(Array.isArray(d.params)){if(Te!==void 0&&Te.parameterStructures===K.ParameterStructures.byName){w(new K.ResponseError(K.ErrorCodes.InvalidParams,`Request ${d.method} defines parameters by name but received parameters by position`),d.method,je);return}me=Ge(...d.params,be.token)}else{if(Te!==void 0&&Te.parameterStructures===K.ParameterStructures.byPosition){w(new K.ResponseError(K.ErrorCodes.InvalidParams,`Request ${d.method} defines parameters by position but received parameters by name`),d.method,je);return}me=Ge(d.params,be.token)}else l&&(me=l(d.method,d.params,be.token));let Qe=me;me?Qe.then?Qe.then(Et=>{b.delete(oe),v(Et,d.method,je)},Et=>{b.delete(oe),Et instanceof K.ResponseError?w(Et,d.method,je):Et&&Fe.string(Et.message)?w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed with message: ${Et.message}`),d.method,je):w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed unexpectedly without providing any details.`),d.method,je)}):(b.delete(oe),v(me,d.method,je)):(b.delete(oe),z(me,d.method,je))}catch(me){b.delete(oe),me instanceof K.ResponseError?v(me,d.method,je):me&&Fe.string(me.message)?w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed with message: ${me.message}`),d.method,je):w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed unexpectedly without providing any details.`),d.method,je)}}else w(new K.ResponseError(K.ErrorCodes.MethodNotFound,`Unhandled method ${d.method}`),d.method,je)}function _t(d){if(!N())if(d.id===null)d.error?i.error(`Received response message without id: Error is: -${JSON.stringify(d.error,void 0,4)}`):i.error("Received response message without id. No further error information provided.");else{let v=d.id,w=G.get(v);if(Zx(d,w),w!==void 0){G.delete(v);try{if(d.error){let z=d.error;w.reject(new K.ResponseError(z.code,z.message,z.data))}else if(d.result!==void 0)w.resolve(d.result);else throw new Error("Should never happen.")}catch(z){z.message?i.error(`Response handler '${w.method}' failed with message: ${z.message}`):i.error(`Response handler '${w.method}' failed unexpectedly.`)}}}}function pr(d){if(N())return;let v,w;if(d.method===go.type.method){let z=d.params.id;M.delete(z),uu(d);return}else{let z=h.get(d.method);z&&(w=z.handler,v=z.type)}if(w||p)try{if(uu(d),w)if(d.params===void 0)v!==void 0&&v.numberOfParams!==0&&v.parameterStructures!==K.ParameterStructures.byName&&i.error(`Notification ${d.method} defines ${v.numberOfParams} params but received none.`),w();else if(Array.isArray(d.params)){let z=d.params;d.method===ho.type.method&&z.length===2&&wp.is(z[0])?w({token:z[0],value:z[1]}):(v!==void 0&&(v.parameterStructures===K.ParameterStructures.byName&&i.error(`Notification ${d.method} defines parameters by name but received parameters by position`),v.numberOfParams!==d.params.length&&i.error(`Notification ${d.method} defines ${v.numberOfParams} params but received ${z.length} arguments`)),w(...z))}else v!==void 0&&v.parameterStructures===K.ParameterStructures.byPosition&&i.error(`Notification ${d.method} defines parameters by position but received parameters by name`),w(d.params);else p&&p(d.method,d.params)}catch(z){z.message?i.error(`Notification handler '${d.method}' failed with message: ${z.message}`):i.error(`Notification handler '${d.method}' failed unexpectedly.`)}else Qt.fire(d)}function Zt(d){if(!d){i.error("Received empty message.");return}i.error(`Received message which is neither a response nor a notification message: -${JSON.stringify(d,null,4)}`);let v=d;if(Fe.string(v.id)||Fe.number(v.id)){let w=v.id,z=G.get(w);z&&z.reject(new Error("The received response has neither a result nor an error property."))}}function ft(d){if(d!=null)switch(E){case fe.Verbose:return JSON.stringify(d,null,4);case fe.Compact:return JSON.stringify(d);default:return}}function Bs(d){if(!(E===fe.Off||!F))if(H===Wt.Text){let v;(E===fe.Verbose||E===fe.Compact)&&d.params&&(v=`Params: ${ft(d.params)} - -`),F.log(`Sending request '${d.method} - (${d.id})'.`,v)}else xi("send-request",d)}function Lo(d){if(!(E===fe.Off||!F))if(H===Wt.Text){let v;(E===fe.Verbose||E===fe.Compact)&&(d.params?v=`Params: ${ft(d.params)} - -`:v=`No parameters provided. - -`),F.log(`Sending notification '${d.method}'.`,v)}else xi("send-notification",d)}function Do(d,v,w){if(!(E===fe.Off||!F))if(H===Wt.Text){let z;(E===fe.Verbose||E===fe.Compact)&&(d.error&&d.error.data?z=`Error data: ${ft(d.error.data)} - -`:d.result?z=`Result: ${ft(d.result)} - -`:d.error===void 0&&(z=`No result returned. - -`)),F.log(`Sending response '${v} - (${d.id})'. Processing request took ${Date.now()-w}ms`,z)}else xi("send-response",d)}function Qx(d){if(!(E===fe.Off||!F))if(H===Wt.Text){let v;(E===fe.Verbose||E===fe.Compact)&&d.params&&(v=`Params: ${ft(d.params)} - -`),F.log(`Received request '${d.method} - (${d.id})'.`,v)}else xi("receive-request",d)}function uu(d){if(!(E===fe.Off||!F||d.method===Sl.type.method))if(H===Wt.Text){let v;(E===fe.Verbose||E===fe.Compact)&&(d.params?v=`Params: ${ft(d.params)} - -`:v=`No parameters provided. - -`),F.log(`Received notification '${d.method}'.`,v)}else xi("receive-notification",d)}function Zx(d,v){if(!(E===fe.Off||!F))if(H===Wt.Text){let w;if((E===fe.Verbose||E===fe.Compact)&&(d.error&&d.error.data?w=`Error data: ${ft(d.error.data)} - -`:d.result?w=`Result: ${ft(d.result)} - -`:d.error===void 0&&(w=`No result returned. - -`)),v){let z=d.error?` Request failed: ${d.error.message} (${d.error.code}).`:"";F.log(`Received response '${v.method} - (${d.id})' in ${Date.now()-v.timerStart}ms.${z}`,w)}else F.log(`Received response ${d.id} without active response promise.`,w)}else xi("receive-response",d)}function xi(d,v){if(!F||E===fe.Off)return;let w={isLSPMessage:!0,type:d,message:v,timestamp:Date.now()};F.log(w)}function Ws(){if(U())throw new xs(mo.Closed,"Connection is closed.");if(N())throw new xs(mo.Disposed,"Connection is disposed.")}function ev(){if(_())throw new xs(mo.AlreadyListening,"Connection is already listening")}function tv(){if(!_())throw new Error("Call listen() first.")}function Vs(d){return d===void 0?null:d}function Lh(d){if(d!==null)return d}function Dh(d){return d!=null&&!Array.isArray(d)&&typeof d=="object"}function fu(d,v){switch(d){case K.ParameterStructures.auto:return Dh(v)?Lh(v):[Vs(v)];case K.ParameterStructures.byName:if(!Dh(v))throw new Error("Received parameters by name but param is not an object literal.");return Lh(v);case K.ParameterStructures.byPosition:return[Vs(v)];default:throw new Error(`Unknown parameter structure ${d.toString()}`)}}function Mh(d,v){let w,z=d.numberOfParams;switch(z){case 0:w=void 0;break;case 1:w=fu(d.parameterStructures,v[0]);break;default:w=[];for(let ke=0;ke{Ws();let w,z;if(Fe.string(d)){w=d;let Te=v[0],Ge=0,je=K.ParameterStructures.auto;K.ParameterStructures.is(Te)&&(Ge=1,je=Te);let oe=v.length,be=oe-Ge;switch(be){case 0:z=void 0;break;case 1:z=fu(je,v[Ge]);break;default:if(je===K.ParameterStructures.byName)throw new Error(`Received ${be} parameters for 'by Name' notification parameter structure.`);z=v.slice(Ge,oe).map(me=>Vs(me));break}}else{let Te=v;w=d.method,z=Mh(d,Te)}let ke={jsonrpc:c,method:w,params:z};return Lo(ke),e.write(ke).catch(Te=>{throw i.error("Sending notification failed."),Te})},onNotification:(d,v)=>{Ws();let w;return Fe.func(d)?p=d:v&&(Fe.string(d)?(w=d,h.set(d,{type:void 0,handler:v})):(w=d.method,h.set(d.method,{type:d,handler:v}))),{dispose:()=>{w!==void 0?h.delete(w):p=void 0}}},onProgress:(d,v,w)=>{if(g.has(v))throw new Error(`Progress handler for token ${v} already registered`);return g.set(v,w),{dispose:()=>{g.delete(v)}}},sendProgress:(d,v,w)=>vi.sendNotification(ho.type,{token:v,value:w}),onUnhandledProgress:Kt.event,sendRequest:(d,...v)=>{Ws(),tv();let w,z,ke;if(Fe.string(d)){w=d;let oe=v[0],be=v[v.length-1],me=0,Qe=K.ParameterStructures.auto;K.ParameterStructures.is(oe)&&(me=1,Qe=oe);let Et=v.length;Cp.CancellationToken.is(be)&&(Et=Et-1,ke=be);let hr=Et-me;switch(hr){case 0:z=void 0;break;case 1:z=fu(Qe,v[me]);break;default:if(Qe===K.ParameterStructures.byName)throw new Error(`Received ${hr} parameters for 'by Name' request parameter structure.`);z=v.slice(me,Et).map(rv=>Vs(rv));break}}else{let oe=v;w=d.method,z=Mh(d,oe);let be=d.numberOfParams;ke=Cp.CancellationToken.is(oe[be])?oe[be]:void 0}let Te=s++,Ge;ke&&(Ge=ke.onCancellationRequested(()=>{let oe=y.sender.sendCancellation(vi,Te);return oe===void 0?(i.log(`Received no promise from cancellation strategy when cancelling id ${Te}`),Promise.resolve()):oe.catch(()=>{i.log(`Sending cancellation messages for id ${Te} failed`)})}));let je={jsonrpc:c,id:Te,method:w,params:z};return Bs(je),typeof y.sender.enableCancellation=="function"&&y.sender.enableCancellation(je),new Promise((oe,be)=>P(null,null,function*(){let me=hr=>{oe(hr),y.sender.cleanup(Te),Ge?.dispose()},Qe=hr=>{be(hr),y.sender.cleanup(Te),Ge?.dispose()},Et={method:w,timerStart:Date.now(),resolve:me,reject:Qe};try{yield e.write(je),G.set(Te,Et)}catch(hr){throw i.error("Sending request failed."),Et.reject(new K.ResponseError(K.ErrorCodes.MessageWriteError,hr.message?hr.message:"Unknown reason")),hr}}))},onRequest:(d,v)=>{Ws();let w=null;return _p.is(d)?(w=void 0,l=d):Fe.string(d)?(w=null,v!==void 0&&(w=d,u.set(d,{handler:v,type:void 0}))):v!==void 0&&(w=d.method,u.set(d.method,{type:d,handler:v})),{dispose:()=>{w!==null&&(w!==void 0?u.delete(w):l=void 0)}}},hasPendingResponse:()=>G.size>0,trace:(d,v,w)=>P(null,null,function*(){let z=!1,ke=Wt.Text;w!==void 0&&(Fe.boolean(w)?z=w:(z=w.sendNotification||!1,ke=w.traceFormat||Wt.Text)),E=d,H=ke,E===fe.Off?F=void 0:F=v,z&&!U()&&!N()&&(yield vi.sendNotification(bp.type,{value:fe.toString(d)}))}),onError:dr.event,onClose:Je.event,onUnhandledNotification:Qt.event,onDispose:$.event,end:()=>{e.end()},dispose:()=>{if(N())return;ye=kr.Disposed,$.fire(void 0);let d=new K.ResponseError(K.ErrorCodes.PendingResponseRejected,"Pending response rejected since connection got disposed");for(let v of G.values())v.reject(d);G=new Map,b=new Map,M=new Set,k=new Ey.LinkedMap,Fe.func(e.dispose)&&e.dispose(),Fe.func(t.dispose)&&t.dispose()},listen:()=>{Ws(),ev(),ye=kr.Listening,t.listen(js)},inspect:()=>{(0,vy.default)().console.log("inspect")}};return vi.onNotification(Sl.type,d=>{if(E===fe.Off||!F)return;let v=E===fe.Verbose||E===fe.Compact;F.log(d.message,v?d.verbose:void 0)}),vi.onNotification(ho.type,d=>{let v=g.get(d.token);v?v(d.value):Kt.fire(d)}),vi}J.createMessageConnection=o$});var _l=X(R=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});R.ProgressType=R.ProgressToken=R.createMessageConnection=R.NullLogger=R.ConnectionOptions=R.ConnectionStrategy=R.AbstractMessageBuffer=R.WriteableStreamMessageWriter=R.AbstractMessageWriter=R.MessageWriter=R.ReadableStreamMessageReader=R.AbstractMessageReader=R.MessageReader=R.SharedArrayReceiverStrategy=R.SharedArraySenderStrategy=R.CancellationToken=R.CancellationTokenSource=R.Emitter=R.Event=R.Disposable=R.LRUCache=R.Touch=R.LinkedMap=R.ParameterStructures=R.NotificationType9=R.NotificationType8=R.NotificationType7=R.NotificationType6=R.NotificationType5=R.NotificationType4=R.NotificationType3=R.NotificationType2=R.NotificationType1=R.NotificationType0=R.NotificationType=R.ErrorCodes=R.ResponseError=R.RequestType9=R.RequestType8=R.RequestType7=R.RequestType6=R.RequestType5=R.RequestType4=R.RequestType3=R.RequestType2=R.RequestType1=R.RequestType0=R.RequestType=R.Message=R.RAL=void 0;R.MessageStrategy=R.CancellationStrategy=R.CancellationSenderStrategy=R.CancellationReceiverStrategy=R.ConnectionError=R.ConnectionErrors=R.LogTraceNotification=R.SetTraceNotification=R.TraceFormat=R.TraceValues=R.Trace=void 0;var Se=dp();Object.defineProperty(R,"Message",{enumerable:!0,get:function(){return Se.Message}});Object.defineProperty(R,"RequestType",{enumerable:!0,get:function(){return Se.RequestType}});Object.defineProperty(R,"RequestType0",{enumerable:!0,get:function(){return Se.RequestType0}});Object.defineProperty(R,"RequestType1",{enumerable:!0,get:function(){return Se.RequestType1}});Object.defineProperty(R,"RequestType2",{enumerable:!0,get:function(){return Se.RequestType2}});Object.defineProperty(R,"RequestType3",{enumerable:!0,get:function(){return Se.RequestType3}});Object.defineProperty(R,"RequestType4",{enumerable:!0,get:function(){return Se.RequestType4}});Object.defineProperty(R,"RequestType5",{enumerable:!0,get:function(){return Se.RequestType5}});Object.defineProperty(R,"RequestType6",{enumerable:!0,get:function(){return Se.RequestType6}});Object.defineProperty(R,"RequestType7",{enumerable:!0,get:function(){return Se.RequestType7}});Object.defineProperty(R,"RequestType8",{enumerable:!0,get:function(){return Se.RequestType8}});Object.defineProperty(R,"RequestType9",{enumerable:!0,get:function(){return Se.RequestType9}});Object.defineProperty(R,"ResponseError",{enumerable:!0,get:function(){return Se.ResponseError}});Object.defineProperty(R,"ErrorCodes",{enumerable:!0,get:function(){return Se.ErrorCodes}});Object.defineProperty(R,"NotificationType",{enumerable:!0,get:function(){return Se.NotificationType}});Object.defineProperty(R,"NotificationType0",{enumerable:!0,get:function(){return Se.NotificationType0}});Object.defineProperty(R,"NotificationType1",{enumerable:!0,get:function(){return Se.NotificationType1}});Object.defineProperty(R,"NotificationType2",{enumerable:!0,get:function(){return Se.NotificationType2}});Object.defineProperty(R,"NotificationType3",{enumerable:!0,get:function(){return Se.NotificationType3}});Object.defineProperty(R,"NotificationType4",{enumerable:!0,get:function(){return Se.NotificationType4}});Object.defineProperty(R,"NotificationType5",{enumerable:!0,get:function(){return Se.NotificationType5}});Object.defineProperty(R,"NotificationType6",{enumerable:!0,get:function(){return Se.NotificationType6}});Object.defineProperty(R,"NotificationType7",{enumerable:!0,get:function(){return Se.NotificationType7}});Object.defineProperty(R,"NotificationType8",{enumerable:!0,get:function(){return Se.NotificationType8}});Object.defineProperty(R,"NotificationType9",{enumerable:!0,get:function(){return Se.NotificationType9}});Object.defineProperty(R,"ParameterStructures",{enumerable:!0,get:function(){return Se.ParameterStructures}});var Lp=hp();Object.defineProperty(R,"LinkedMap",{enumerable:!0,get:function(){return Lp.LinkedMap}});Object.defineProperty(R,"LRUCache",{enumerable:!0,get:function(){return Lp.LRUCache}});Object.defineProperty(R,"Touch",{enumerable:!0,get:function(){return Lp.Touch}});var c$=fy();Object.defineProperty(R,"Disposable",{enumerable:!0,get:function(){return c$.Disposable}});var ky=ci();Object.defineProperty(R,"Event",{enumerable:!0,get:function(){return ky.Event}});Object.defineProperty(R,"Emitter",{enumerable:!0,get:function(){return ky.Emitter}});var Ny=Ka();Object.defineProperty(R,"CancellationTokenSource",{enumerable:!0,get:function(){return Ny.CancellationTokenSource}});Object.defineProperty(R,"CancellationToken",{enumerable:!0,get:function(){return Ny.CancellationToken}});var Cy=dy();Object.defineProperty(R,"SharedArraySenderStrategy",{enumerable:!0,get:function(){return Cy.SharedArraySenderStrategy}});Object.defineProperty(R,"SharedArrayReceiverStrategy",{enumerable:!0,get:function(){return Cy.SharedArrayReceiverStrategy}});var Dp=hy();Object.defineProperty(R,"MessageReader",{enumerable:!0,get:function(){return Dp.MessageReader}});Object.defineProperty(R,"AbstractMessageReader",{enumerable:!0,get:function(){return Dp.AbstractMessageReader}});Object.defineProperty(R,"ReadableStreamMessageReader",{enumerable:!0,get:function(){return Dp.ReadableStreamMessageReader}});var Mp=Ry();Object.defineProperty(R,"MessageWriter",{enumerable:!0,get:function(){return Mp.MessageWriter}});Object.defineProperty(R,"AbstractMessageWriter",{enumerable:!0,get:function(){return Mp.AbstractMessageWriter}});Object.defineProperty(R,"WriteableStreamMessageWriter",{enumerable:!0,get:function(){return Mp.WriteableStreamMessageWriter}});var l$=xy();Object.defineProperty(R,"AbstractMessageBuffer",{enumerable:!0,get:function(){return l$.AbstractMessageBuffer}});var ut=Sy();Object.defineProperty(R,"ConnectionStrategy",{enumerable:!0,get:function(){return ut.ConnectionStrategy}});Object.defineProperty(R,"ConnectionOptions",{enumerable:!0,get:function(){return ut.ConnectionOptions}});Object.defineProperty(R,"NullLogger",{enumerable:!0,get:function(){return ut.NullLogger}});Object.defineProperty(R,"createMessageConnection",{enumerable:!0,get:function(){return ut.createMessageConnection}});Object.defineProperty(R,"ProgressToken",{enumerable:!0,get:function(){return ut.ProgressToken}});Object.defineProperty(R,"ProgressType",{enumerable:!0,get:function(){return ut.ProgressType}});Object.defineProperty(R,"Trace",{enumerable:!0,get:function(){return ut.Trace}});Object.defineProperty(R,"TraceValues",{enumerable:!0,get:function(){return ut.TraceValues}});Object.defineProperty(R,"TraceFormat",{enumerable:!0,get:function(){return ut.TraceFormat}});Object.defineProperty(R,"SetTraceNotification",{enumerable:!0,get:function(){return ut.SetTraceNotification}});Object.defineProperty(R,"LogTraceNotification",{enumerable:!0,get:function(){return ut.LogTraceNotification}});Object.defineProperty(R,"ConnectionErrors",{enumerable:!0,get:function(){return ut.ConnectionErrors}});Object.defineProperty(R,"ConnectionError",{enumerable:!0,get:function(){return ut.ConnectionError}});Object.defineProperty(R,"CancellationReceiverStrategy",{enumerable:!0,get:function(){return ut.CancellationReceiverStrategy}});Object.defineProperty(R,"CancellationSenderStrategy",{enumerable:!0,get:function(){return ut.CancellationSenderStrategy}});Object.defineProperty(R,"CancellationStrategy",{enumerable:!0,get:function(){return ut.CancellationStrategy}});Object.defineProperty(R,"MessageStrategy",{enumerable:!0,get:function(){return ut.MessageStrategy}});var u$=Rn();R.RAL=u$.default});var Iy=X(qp=>{"use strict";Object.defineProperty(qp,"__esModule",{value:!0});var Nr=_l(),bl=class t extends Nr.AbstractMessageBuffer{constructor(e="utf-8"){super(e),this.asciiDecoder=new TextDecoder("ascii")}emptyBuffer(){return t.emptyBuffer}fromString(e,r){return new TextEncoder().encode(e)}toString(e,r){return r==="ascii"?this.asciiDecoder.decode(e):new TextDecoder(r).decode(e)}asNative(e,r){return r===void 0?e:e.slice(0,r)}allocNative(e){return new Uint8Array(e)}};bl.emptyBuffer=new Uint8Array(0);var Fp=class{constructor(e){this.socket=e,this._onData=new Nr.Emitter,this._messageListener=r=>{r.data.arrayBuffer().then(i=>{this._onData.fire(new Uint8Array(i))},()=>{(0,Nr.RAL)().console.error("Converting blob to array buffer failed.")})},this.socket.addEventListener("message",this._messageListener)}onClose(e){return this.socket.addEventListener("close",e),Nr.Disposable.create(()=>this.socket.removeEventListener("close",e))}onError(e){return this.socket.addEventListener("error",e),Nr.Disposable.create(()=>this.socket.removeEventListener("error",e))}onEnd(e){return this.socket.addEventListener("end",e),Nr.Disposable.create(()=>this.socket.removeEventListener("end",e))}onData(e){return this._onData.event(e)}},Gp=class{constructor(e){this.socket=e}onClose(e){return this.socket.addEventListener("close",e),Nr.Disposable.create(()=>this.socket.removeEventListener("close",e))}onError(e){return this.socket.addEventListener("error",e),Nr.Disposable.create(()=>this.socket.removeEventListener("error",e))}onEnd(e){return this.socket.addEventListener("end",e),Nr.Disposable.create(()=>this.socket.removeEventListener("end",e))}write(e,r){if(typeof e=="string"){if(r!==void 0&&r!=="utf-8")throw new Error(`In a Browser environments only utf-8 text encoding is supported. But got encoding: ${r}`);this.socket.send(e)}else this.socket.send(e);return Promise.resolve()}end(){this.socket.close()}},f$=new TextEncoder,wy=Object.freeze({messageBuffer:Object.freeze({create:t=>new bl(t)}),applicationJson:Object.freeze({encoder:Object.freeze({name:"application/json",encode:(t,e)=>{if(e.charset!=="utf-8")throw new Error(`In a Browser environments only utf-8 text encoding is supported. But got encoding: ${e.charset}`);return Promise.resolve(f$.encode(JSON.stringify(t,void 0,0)))}}),decoder:Object.freeze({name:"application/json",decode:(t,e)=>{if(!(t instanceof Uint8Array))throw new Error("In a Browser environments only Uint8Arrays are supported.");return Promise.resolve(JSON.parse(new TextDecoder(e.charset).decode(t)))}})}),stream:Object.freeze({asReadableStream:t=>new Fp(t),asWritableStream:t=>new Gp(t)}),console,timer:Object.freeze({setTimeout(t,e,...r){let n=setTimeout(t,e,...r);return{dispose:()=>clearTimeout(n)}},setImmediate(t,...e){let r=setTimeout(t,0,...e);return{dispose:()=>clearTimeout(r)}},setInterval(t,e,...r){let n=setInterval(t,e,...r);return{dispose:()=>clearInterval(n)}}})});function Up(){return wy}(function(t){function e(){Nr.RAL.install(wy)}t.install=e})(Up||(Up={}));qp.default=Up});var hi=X(Vt=>{"use strict";var d$=Vt&&Vt.__createBinding||(Object.create?function(t,e,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,i)}:function(t,e,r,n){n===void 0&&(n=r),t[n]=e[r]}),p$=Vt&&Vt.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&d$(e,t,r)};Object.defineProperty(Vt,"__esModule",{value:!0});Vt.createMessageConnection=Vt.BrowserMessageWriter=Vt.BrowserMessageReader=void 0;var h$=Iy();h$.default.install();var vs=_l();p$(_l(),Vt);var zp=class extends vs.AbstractMessageReader{constructor(e){super(),this._onData=new vs.Emitter,this._messageListener=r=>{this._onData.fire(r.data)},e.addEventListener("error",r=>this.fireError(r)),e.onmessage=this._messageListener}listen(e){return this._onData.event(e)}};Vt.BrowserMessageReader=zp;var jp=class extends vs.AbstractMessageWriter{constructor(e){super(),this.port=e,this.errorCount=0,e.addEventListener("error",r=>this.fireError(r))}write(e){try{return this.port.postMessage(e),Promise.resolve()}catch(r){return this.handleError(r,e),Promise.reject(r)}}handleError(e,r){this.errorCount++,this.fireError(e,r,this.errorCount)}end(){}};Vt.BrowserMessageWriter=jp;function m$(t,e,r,n){return r===void 0&&(r=vs.NullLogger),vs.ConnectionStrategy.is(n)&&(n={connectionStrategy:n}),(0,vs.createMessageConnection)(t,e,r,n)}Vt.createMessageConnection=m$});var Bp=X((eP,_y)=>{"use strict";_y.exports=hi()});var _e=X(Dt=>{"use strict";Object.defineProperty(Dt,"__esModule",{value:!0});Dt.ProtocolNotificationType=Dt.ProtocolNotificationType0=Dt.ProtocolRequestType=Dt.ProtocolRequestType0=Dt.RegistrationType=Dt.MessageDirection=void 0;var Es=hi(),by=(function(t){return t.clientToServer="clientToServer",t.serverToClient="serverToClient",t.both="both",t})(by||(Dt.MessageDirection=by={})),Wp=class{constructor(e){this.method=e}};Dt.RegistrationType=Wp;var Vp=class extends Es.RequestType0{constructor(e){super(e)}};Dt.ProtocolRequestType0=Vp;var Kp=class extends Es.RequestType{constructor(e){super(e,Es.ParameterStructures.byName)}};Dt.ProtocolRequestType=Kp;var Hp=class extends Es.NotificationType0{constructor(e){super(e)}};Dt.ProtocolNotificationType0=Hp;var Yp=class extends Es.NotificationType{constructor(e){super(e,Es.ParameterStructures.byName)}};Dt.ProtocolNotificationType=Yp});var Pl=X(Xe=>{"use strict";Object.defineProperty(Xe,"__esModule",{value:!0});Xe.objectLiteral=Xe.typedArray=Xe.stringArray=Xe.array=Xe.func=Xe.error=Xe.number=Xe.string=Xe.boolean=void 0;function g$(t){return t===!0||t===!1}Xe.boolean=g$;function Py(t){return typeof t=="string"||t instanceof String}Xe.string=Py;function y$(t){return typeof t=="number"||t instanceof Number}Xe.number=y$;function T$(t){return t instanceof Error}Xe.error=T$;function R$(t){return typeof t=="function"}Xe.func=R$;function Oy(t){return Array.isArray(t)}Xe.array=Oy;function x$(t){return Oy(t)&&t.every(e=>Py(e))}Xe.stringArray=x$;function v$(t,e){return Array.isArray(t)&&t.every(e)}Xe.typedArray=v$;function E$(t){return t!==null&&typeof t=="object"}Xe.objectLiteral=E$});var My=X(Ol=>{"use strict";Object.defineProperty(Ol,"__esModule",{value:!0});Ol.ImplementationRequest=void 0;var Ly=_e(),Dy;(function(t){t.method="textDocument/implementation",t.messageDirection=Ly.MessageDirection.clientToServer,t.type=new Ly.ProtocolRequestType(t.method)})(Dy||(Ol.ImplementationRequest=Dy={}))});var Uy=X(Ll=>{"use strict";Object.defineProperty(Ll,"__esModule",{value:!0});Ll.TypeDefinitionRequest=void 0;var Fy=_e(),Gy;(function(t){t.method="textDocument/typeDefinition",t.messageDirection=Fy.MessageDirection.clientToServer,t.type=new Fy.ProtocolRequestType(t.method)})(Gy||(Ll.TypeDefinitionRequest=Gy={}))});var jy=X(As=>{"use strict";Object.defineProperty(As,"__esModule",{value:!0});As.DidChangeWorkspaceFoldersNotification=As.WorkspaceFoldersRequest=void 0;var Dl=_e(),qy;(function(t){t.method="workspace/workspaceFolders",t.messageDirection=Dl.MessageDirection.serverToClient,t.type=new Dl.ProtocolRequestType0(t.method)})(qy||(As.WorkspaceFoldersRequest=qy={}));var zy;(function(t){t.method="workspace/didChangeWorkspaceFolders",t.messageDirection=Dl.MessageDirection.clientToServer,t.type=new Dl.ProtocolNotificationType(t.method)})(zy||(As.DidChangeWorkspaceFoldersNotification=zy={}))});var Vy=X(Ml=>{"use strict";Object.defineProperty(Ml,"__esModule",{value:!0});Ml.ConfigurationRequest=void 0;var By=_e(),Wy;(function(t){t.method="workspace/configuration",t.messageDirection=By.MessageDirection.serverToClient,t.type=new By.ProtocolRequestType(t.method)})(Wy||(Ml.ConfigurationRequest=Wy={}))});var Yy=X($s=>{"use strict";Object.defineProperty($s,"__esModule",{value:!0});$s.ColorPresentationRequest=$s.DocumentColorRequest=void 0;var Fl=_e(),Ky;(function(t){t.method="textDocument/documentColor",t.messageDirection=Fl.MessageDirection.clientToServer,t.type=new Fl.ProtocolRequestType(t.method)})(Ky||($s.DocumentColorRequest=Ky={}));var Hy;(function(t){t.method="textDocument/colorPresentation",t.messageDirection=Fl.MessageDirection.clientToServer,t.type=new Fl.ProtocolRequestType(t.method)})(Hy||($s.ColorPresentationRequest=Hy={}))});var Qy=X(Ss=>{"use strict";Object.defineProperty(Ss,"__esModule",{value:!0});Ss.FoldingRangeRefreshRequest=Ss.FoldingRangeRequest=void 0;var Gl=_e(),Xy;(function(t){t.method="textDocument/foldingRange",t.messageDirection=Gl.MessageDirection.clientToServer,t.type=new Gl.ProtocolRequestType(t.method)})(Xy||(Ss.FoldingRangeRequest=Xy={}));var Jy;(function(t){t.method="workspace/foldingRange/refresh",t.messageDirection=Gl.MessageDirection.serverToClient,t.type=new Gl.ProtocolRequestType0(t.method)})(Jy||(Ss.FoldingRangeRefreshRequest=Jy={}))});var tT=X(Ul=>{"use strict";Object.defineProperty(Ul,"__esModule",{value:!0});Ul.DeclarationRequest=void 0;var Zy=_e(),eT;(function(t){t.method="textDocument/declaration",t.messageDirection=Zy.MessageDirection.clientToServer,t.type=new Zy.ProtocolRequestType(t.method)})(eT||(Ul.DeclarationRequest=eT={}))});var iT=X(ql=>{"use strict";Object.defineProperty(ql,"__esModule",{value:!0});ql.SelectionRangeRequest=void 0;var rT=_e(),nT;(function(t){t.method="textDocument/selectionRange",t.messageDirection=rT.MessageDirection.clientToServer,t.type=new rT.ProtocolRequestType(t.method)})(nT||(ql.SelectionRangeRequest=nT={}))});var cT=X(An=>{"use strict";Object.defineProperty(An,"__esModule",{value:!0});An.WorkDoneProgressCancelNotification=An.WorkDoneProgressCreateRequest=An.WorkDoneProgress=void 0;var A$=hi(),zl=_e(),sT;(function(t){t.type=new A$.ProgressType;function e(r){return r===t.type}t.is=e})(sT||(An.WorkDoneProgress=sT={}));var aT;(function(t){t.method="window/workDoneProgress/create",t.messageDirection=zl.MessageDirection.serverToClient,t.type=new zl.ProtocolRequestType(t.method)})(aT||(An.WorkDoneProgressCreateRequest=aT={}));var oT;(function(t){t.method="window/workDoneProgress/cancel",t.messageDirection=zl.MessageDirection.clientToServer,t.type=new zl.ProtocolNotificationType(t.method)})(oT||(An.WorkDoneProgressCancelNotification=oT={}))});var dT=X($n=>{"use strict";Object.defineProperty($n,"__esModule",{value:!0});$n.CallHierarchyOutgoingCallsRequest=$n.CallHierarchyIncomingCallsRequest=$n.CallHierarchyPrepareRequest=void 0;var ks=_e(),lT;(function(t){t.method="textDocument/prepareCallHierarchy",t.messageDirection=ks.MessageDirection.clientToServer,t.type=new ks.ProtocolRequestType(t.method)})(lT||($n.CallHierarchyPrepareRequest=lT={}));var uT;(function(t){t.method="callHierarchy/incomingCalls",t.messageDirection=ks.MessageDirection.clientToServer,t.type=new ks.ProtocolRequestType(t.method)})(uT||($n.CallHierarchyIncomingCallsRequest=uT={}));var fT;(function(t){t.method="callHierarchy/outgoingCalls",t.messageDirection=ks.MessageDirection.clientToServer,t.type=new ks.ProtocolRequestType(t.method)})(fT||($n.CallHierarchyOutgoingCallsRequest=fT={}))});var TT=X(Mt=>{"use strict";Object.defineProperty(Mt,"__esModule",{value:!0});Mt.SemanticTokensRefreshRequest=Mt.SemanticTokensRangeRequest=Mt.SemanticTokensDeltaRequest=Mt.SemanticTokensRequest=Mt.SemanticTokensRegistrationType=Mt.TokenFormat=void 0;var Qr=_e(),pT=(function(t){return t.Relative="relative",t})(pT||(Mt.TokenFormat=pT={})),yo;(function(t){t.method="textDocument/semanticTokens",t.type=new Qr.RegistrationType(t.method)})(yo||(Mt.SemanticTokensRegistrationType=yo={}));var hT;(function(t){t.method="textDocument/semanticTokens/full",t.messageDirection=Qr.MessageDirection.clientToServer,t.type=new Qr.ProtocolRequestType(t.method),t.registrationMethod=yo.method})(hT||(Mt.SemanticTokensRequest=hT={}));var mT;(function(t){t.method="textDocument/semanticTokens/full/delta",t.messageDirection=Qr.MessageDirection.clientToServer,t.type=new Qr.ProtocolRequestType(t.method),t.registrationMethod=yo.method})(mT||(Mt.SemanticTokensDeltaRequest=mT={}));var gT;(function(t){t.method="textDocument/semanticTokens/range",t.messageDirection=Qr.MessageDirection.clientToServer,t.type=new Qr.ProtocolRequestType(t.method),t.registrationMethod=yo.method})(gT||(Mt.SemanticTokensRangeRequest=gT={}));var yT;(function(t){t.method="workspace/semanticTokens/refresh",t.messageDirection=Qr.MessageDirection.serverToClient,t.type=new Qr.ProtocolRequestType0(t.method)})(yT||(Mt.SemanticTokensRefreshRequest=yT={}))});var vT=X(jl=>{"use strict";Object.defineProperty(jl,"__esModule",{value:!0});jl.ShowDocumentRequest=void 0;var RT=_e(),xT;(function(t){t.method="window/showDocument",t.messageDirection=RT.MessageDirection.serverToClient,t.type=new RT.ProtocolRequestType(t.method)})(xT||(jl.ShowDocumentRequest=xT={}))});var $T=X(Bl=>{"use strict";Object.defineProperty(Bl,"__esModule",{value:!0});Bl.LinkedEditingRangeRequest=void 0;var ET=_e(),AT;(function(t){t.method="textDocument/linkedEditingRange",t.messageDirection=ET.MessageDirection.clientToServer,t.type=new ET.ProtocolRequestType(t.method)})(AT||(Bl.LinkedEditingRangeRequest=AT={}))});var bT=X(vt=>{"use strict";Object.defineProperty(vt,"__esModule",{value:!0});vt.WillDeleteFilesRequest=vt.DidDeleteFilesNotification=vt.DidRenameFilesNotification=vt.WillRenameFilesRequest=vt.DidCreateFilesNotification=vt.WillCreateFilesRequest=vt.FileOperationPatternKind=void 0;var Xt=_e(),ST=(function(t){return t.file="file",t.folder="folder",t})(ST||(vt.FileOperationPatternKind=ST={})),kT;(function(t){t.method="workspace/willCreateFiles",t.messageDirection=Xt.MessageDirection.clientToServer,t.type=new Xt.ProtocolRequestType(t.method)})(kT||(vt.WillCreateFilesRequest=kT={}));var NT;(function(t){t.method="workspace/didCreateFiles",t.messageDirection=Xt.MessageDirection.clientToServer,t.type=new Xt.ProtocolNotificationType(t.method)})(NT||(vt.DidCreateFilesNotification=NT={}));var CT;(function(t){t.method="workspace/willRenameFiles",t.messageDirection=Xt.MessageDirection.clientToServer,t.type=new Xt.ProtocolRequestType(t.method)})(CT||(vt.WillRenameFilesRequest=CT={}));var wT;(function(t){t.method="workspace/didRenameFiles",t.messageDirection=Xt.MessageDirection.clientToServer,t.type=new Xt.ProtocolNotificationType(t.method)})(wT||(vt.DidRenameFilesNotification=wT={}));var IT;(function(t){t.method="workspace/didDeleteFiles",t.messageDirection=Xt.MessageDirection.clientToServer,t.type=new Xt.ProtocolNotificationType(t.method)})(IT||(vt.DidDeleteFilesNotification=IT={}));var _T;(function(t){t.method="workspace/willDeleteFiles",t.messageDirection=Xt.MessageDirection.clientToServer,t.type=new Xt.ProtocolRequestType(t.method)})(_T||(vt.WillDeleteFilesRequest=_T={}))});var MT=X(Sn=>{"use strict";Object.defineProperty(Sn,"__esModule",{value:!0});Sn.MonikerRequest=Sn.MonikerKind=Sn.UniquenessLevel=void 0;var PT=_e(),OT=(function(t){return t.document="document",t.project="project",t.group="group",t.scheme="scheme",t.global="global",t})(OT||(Sn.UniquenessLevel=OT={})),LT=(function(t){return t.$import="import",t.$export="export",t.local="local",t})(LT||(Sn.MonikerKind=LT={})),DT;(function(t){t.method="textDocument/moniker",t.messageDirection=PT.MessageDirection.clientToServer,t.type=new PT.ProtocolRequestType(t.method)})(DT||(Sn.MonikerRequest=DT={}))});var qT=X(kn=>{"use strict";Object.defineProperty(kn,"__esModule",{value:!0});kn.TypeHierarchySubtypesRequest=kn.TypeHierarchySupertypesRequest=kn.TypeHierarchyPrepareRequest=void 0;var Ns=_e(),FT;(function(t){t.method="textDocument/prepareTypeHierarchy",t.messageDirection=Ns.MessageDirection.clientToServer,t.type=new Ns.ProtocolRequestType(t.method)})(FT||(kn.TypeHierarchyPrepareRequest=FT={}));var GT;(function(t){t.method="typeHierarchy/supertypes",t.messageDirection=Ns.MessageDirection.clientToServer,t.type=new Ns.ProtocolRequestType(t.method)})(GT||(kn.TypeHierarchySupertypesRequest=GT={}));var UT;(function(t){t.method="typeHierarchy/subtypes",t.messageDirection=Ns.MessageDirection.clientToServer,t.type=new Ns.ProtocolRequestType(t.method)})(UT||(kn.TypeHierarchySubtypesRequest=UT={}))});var BT=X(Cs=>{"use strict";Object.defineProperty(Cs,"__esModule",{value:!0});Cs.InlineValueRefreshRequest=Cs.InlineValueRequest=void 0;var Wl=_e(),zT;(function(t){t.method="textDocument/inlineValue",t.messageDirection=Wl.MessageDirection.clientToServer,t.type=new Wl.ProtocolRequestType(t.method)})(zT||(Cs.InlineValueRequest=zT={}));var jT;(function(t){t.method="workspace/inlineValue/refresh",t.messageDirection=Wl.MessageDirection.serverToClient,t.type=new Wl.ProtocolRequestType0(t.method)})(jT||(Cs.InlineValueRefreshRequest=jT={}))});var HT=X(Nn=>{"use strict";Object.defineProperty(Nn,"__esModule",{value:!0});Nn.InlayHintRefreshRequest=Nn.InlayHintResolveRequest=Nn.InlayHintRequest=void 0;var ws=_e(),WT;(function(t){t.method="textDocument/inlayHint",t.messageDirection=ws.MessageDirection.clientToServer,t.type=new ws.ProtocolRequestType(t.method)})(WT||(Nn.InlayHintRequest=WT={}));var VT;(function(t){t.method="inlayHint/resolve",t.messageDirection=ws.MessageDirection.clientToServer,t.type=new ws.ProtocolRequestType(t.method)})(VT||(Nn.InlayHintResolveRequest=VT={}));var KT;(function(t){t.method="workspace/inlayHint/refresh",t.messageDirection=ws.MessageDirection.serverToClient,t.type=new ws.ProtocolRequestType0(t.method)})(KT||(Nn.InlayHintRefreshRequest=KT={}))});var tR=X(Jt=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});Jt.DiagnosticRefreshRequest=Jt.WorkspaceDiagnosticRequest=Jt.DocumentDiagnosticRequest=Jt.DocumentDiagnosticReportKind=Jt.DiagnosticServerCancellationData=void 0;var eR=hi(),$$=Pl(),Is=_e(),YT;(function(t){function e(r){let n=r;return n&&$$.boolean(n.retriggerRequest)}t.is=e})(YT||(Jt.DiagnosticServerCancellationData=YT={}));var XT=(function(t){return t.Full="full",t.Unchanged="unchanged",t})(XT||(Jt.DocumentDiagnosticReportKind=XT={})),JT;(function(t){t.method="textDocument/diagnostic",t.messageDirection=Is.MessageDirection.clientToServer,t.type=new Is.ProtocolRequestType(t.method),t.partialResult=new eR.ProgressType})(JT||(Jt.DocumentDiagnosticRequest=JT={}));var QT;(function(t){t.method="workspace/diagnostic",t.messageDirection=Is.MessageDirection.clientToServer,t.type=new Is.ProtocolRequestType(t.method),t.partialResult=new eR.ProgressType})(QT||(Jt.WorkspaceDiagnosticRequest=QT={}));var ZT;(function(t){t.method="workspace/diagnostic/refresh",t.messageDirection=Is.MessageDirection.serverToClient,t.type=new Is.ProtocolRequestType0(t.method)})(ZT||(Jt.DiagnosticRefreshRequest=ZT={}))});var cR=X(ze=>{"use strict";Object.defineProperty(ze,"__esModule",{value:!0});ze.DidCloseNotebookDocumentNotification=ze.DidSaveNotebookDocumentNotification=ze.DidChangeNotebookDocumentNotification=ze.NotebookCellArrayChange=ze.DidOpenNotebookDocumentNotification=ze.NotebookDocumentSyncRegistrationType=ze.NotebookDocument=ze.NotebookCell=ze.ExecutionSummary=ze.NotebookCellKind=void 0;var To=(as(),pu(il)),ur=Pl(),Cr=_e(),Xp;(function(t){t.Markup=1,t.Code=2;function e(r){return r===1||r===2}t.is=e})(Xp||(ze.NotebookCellKind=Xp={}));var Jp;(function(t){function e(i,s){let a={executionOrder:i};return(s===!0||s===!1)&&(a.success=s),a}t.create=e;function r(i){let s=i;return ur.objectLiteral(s)&&To.uinteger.is(s.executionOrder)&&(s.success===void 0||ur.boolean(s.success))}t.is=r;function n(i,s){return i===s?!0:i==null||s===null||s===void 0?!1:i.executionOrder===s.executionOrder&&i.success===s.success}t.equals=n})(Jp||(ze.ExecutionSummary=Jp={}));var Vl;(function(t){function e(s,a){return{kind:s,document:a}}t.create=e;function r(s){let a=s;return ur.objectLiteral(a)&&Xp.is(a.kind)&&To.DocumentUri.is(a.document)&&(a.metadata===void 0||ur.objectLiteral(a.metadata))}t.is=r;function n(s,a){let o=new Set;return s.document!==a.document&&o.add("document"),s.kind!==a.kind&&o.add("kind"),s.executionSummary!==a.executionSummary&&o.add("executionSummary"),(s.metadata!==void 0||a.metadata!==void 0)&&!i(s.metadata,a.metadata)&&o.add("metadata"),(s.executionSummary!==void 0||a.executionSummary!==void 0)&&!Jp.equals(s.executionSummary,a.executionSummary)&&o.add("executionSummary"),o}t.diff=n;function i(s,a){if(s===a)return!0;if(s==null||a===null||a===void 0||typeof s!=typeof a||typeof s!="object")return!1;let o=Array.isArray(s),c=Array.isArray(a);if(o!==c)return!1;if(o&&c){if(s.length!==a.length)return!1;for(let l=0;l{"use strict";Object.defineProperty(Kl,"__esModule",{value:!0});Kl.InlineCompletionRequest=void 0;var lR=_e(),uR;(function(t){t.method="textDocument/inlineCompletion",t.messageDirection=lR.MessageDirection.clientToServer,t.type=new lR.ProtocolRequestType(t.method)})(uR||(Kl.InlineCompletionRequest=uR={}))});var $x=X(f=>{"use strict";Object.defineProperty(f,"__esModule",{value:!0});f.WorkspaceSymbolRequest=f.CodeActionResolveRequest=f.CodeActionRequest=f.DocumentSymbolRequest=f.DocumentHighlightRequest=f.ReferencesRequest=f.DefinitionRequest=f.SignatureHelpRequest=f.SignatureHelpTriggerKind=f.HoverRequest=f.CompletionResolveRequest=f.CompletionRequest=f.CompletionTriggerKind=f.PublishDiagnosticsNotification=f.WatchKind=f.RelativePattern=f.FileChangeType=f.DidChangeWatchedFilesNotification=f.WillSaveTextDocumentWaitUntilRequest=f.WillSaveTextDocumentNotification=f.TextDocumentSaveReason=f.DidSaveTextDocumentNotification=f.DidCloseTextDocumentNotification=f.DidChangeTextDocumentNotification=f.TextDocumentContentChangeEvent=f.DidOpenTextDocumentNotification=f.TextDocumentSyncKind=f.TelemetryEventNotification=f.LogMessageNotification=f.ShowMessageRequest=f.ShowMessageNotification=f.MessageType=f.DidChangeConfigurationNotification=f.ExitNotification=f.ShutdownRequest=f.InitializedNotification=f.InitializeErrorCodes=f.InitializeRequest=f.WorkDoneProgressOptions=f.TextDocumentRegistrationOptions=f.StaticRegistrationOptions=f.PositionEncodingKind=f.FailureHandlingKind=f.ResourceOperationKind=f.UnregistrationRequest=f.RegistrationRequest=f.DocumentSelector=f.NotebookCellTextDocumentFilter=f.NotebookDocumentFilter=f.TextDocumentFilter=void 0;f.MonikerRequest=f.MonikerKind=f.UniquenessLevel=f.WillDeleteFilesRequest=f.DidDeleteFilesNotification=f.WillRenameFilesRequest=f.DidRenameFilesNotification=f.WillCreateFilesRequest=f.DidCreateFilesNotification=f.FileOperationPatternKind=f.LinkedEditingRangeRequest=f.ShowDocumentRequest=f.SemanticTokensRegistrationType=f.SemanticTokensRefreshRequest=f.SemanticTokensRangeRequest=f.SemanticTokensDeltaRequest=f.SemanticTokensRequest=f.TokenFormat=f.CallHierarchyPrepareRequest=f.CallHierarchyOutgoingCallsRequest=f.CallHierarchyIncomingCallsRequest=f.WorkDoneProgressCancelNotification=f.WorkDoneProgressCreateRequest=f.WorkDoneProgress=f.SelectionRangeRequest=f.DeclarationRequest=f.FoldingRangeRefreshRequest=f.FoldingRangeRequest=f.ColorPresentationRequest=f.DocumentColorRequest=f.ConfigurationRequest=f.DidChangeWorkspaceFoldersNotification=f.WorkspaceFoldersRequest=f.TypeDefinitionRequest=f.ImplementationRequest=f.ApplyWorkspaceEditRequest=f.ExecuteCommandRequest=f.PrepareRenameRequest=f.RenameRequest=f.PrepareSupportDefaultBehavior=f.DocumentOnTypeFormattingRequest=f.DocumentRangesFormattingRequest=f.DocumentRangeFormattingRequest=f.DocumentFormattingRequest=f.DocumentLinkResolveRequest=f.DocumentLinkRequest=f.CodeLensRefreshRequest=f.CodeLensResolveRequest=f.CodeLensRequest=f.WorkspaceSymbolResolveRequest=void 0;f.InlineCompletionRequest=f.DidCloseNotebookDocumentNotification=f.DidSaveNotebookDocumentNotification=f.DidChangeNotebookDocumentNotification=f.NotebookCellArrayChange=f.DidOpenNotebookDocumentNotification=f.NotebookDocumentSyncRegistrationType=f.NotebookDocument=f.NotebookCell=f.ExecutionSummary=f.NotebookCellKind=f.DiagnosticRefreshRequest=f.WorkspaceDiagnosticRequest=f.DocumentDiagnosticRequest=f.DocumentDiagnosticReportKind=f.DiagnosticServerCancellationData=f.InlayHintRefreshRequest=f.InlayHintResolveRequest=f.InlayHintRequest=f.InlineValueRefreshRequest=f.InlineValueRequest=f.TypeHierarchySupertypesRequest=f.TypeHierarchySubtypesRequest=f.TypeHierarchyPrepareRequest=void 0;var S=_e(),dR=(as(),pu(il)),at=Pl(),S$=My();Object.defineProperty(f,"ImplementationRequest",{enumerable:!0,get:function(){return S$.ImplementationRequest}});var k$=Uy();Object.defineProperty(f,"TypeDefinitionRequest",{enumerable:!0,get:function(){return k$.TypeDefinitionRequest}});var xx=jy();Object.defineProperty(f,"WorkspaceFoldersRequest",{enumerable:!0,get:function(){return xx.WorkspaceFoldersRequest}});Object.defineProperty(f,"DidChangeWorkspaceFoldersNotification",{enumerable:!0,get:function(){return xx.DidChangeWorkspaceFoldersNotification}});var N$=Vy();Object.defineProperty(f,"ConfigurationRequest",{enumerable:!0,get:function(){return N$.ConfigurationRequest}});var vx=Yy();Object.defineProperty(f,"DocumentColorRequest",{enumerable:!0,get:function(){return vx.DocumentColorRequest}});Object.defineProperty(f,"ColorPresentationRequest",{enumerable:!0,get:function(){return vx.ColorPresentationRequest}});var Ex=Qy();Object.defineProperty(f,"FoldingRangeRequest",{enumerable:!0,get:function(){return Ex.FoldingRangeRequest}});Object.defineProperty(f,"FoldingRangeRefreshRequest",{enumerable:!0,get:function(){return Ex.FoldingRangeRefreshRequest}});var C$=tT();Object.defineProperty(f,"DeclarationRequest",{enumerable:!0,get:function(){return C$.DeclarationRequest}});var w$=iT();Object.defineProperty(f,"SelectionRangeRequest",{enumerable:!0,get:function(){return w$.SelectionRangeRequest}});var rh=cT();Object.defineProperty(f,"WorkDoneProgress",{enumerable:!0,get:function(){return rh.WorkDoneProgress}});Object.defineProperty(f,"WorkDoneProgressCreateRequest",{enumerable:!0,get:function(){return rh.WorkDoneProgressCreateRequest}});Object.defineProperty(f,"WorkDoneProgressCancelNotification",{enumerable:!0,get:function(){return rh.WorkDoneProgressCancelNotification}});var nh=dT();Object.defineProperty(f,"CallHierarchyIncomingCallsRequest",{enumerable:!0,get:function(){return nh.CallHierarchyIncomingCallsRequest}});Object.defineProperty(f,"CallHierarchyOutgoingCallsRequest",{enumerable:!0,get:function(){return nh.CallHierarchyOutgoingCallsRequest}});Object.defineProperty(f,"CallHierarchyPrepareRequest",{enumerable:!0,get:function(){return nh.CallHierarchyPrepareRequest}});var bs=TT();Object.defineProperty(f,"TokenFormat",{enumerable:!0,get:function(){return bs.TokenFormat}});Object.defineProperty(f,"SemanticTokensRequest",{enumerable:!0,get:function(){return bs.SemanticTokensRequest}});Object.defineProperty(f,"SemanticTokensDeltaRequest",{enumerable:!0,get:function(){return bs.SemanticTokensDeltaRequest}});Object.defineProperty(f,"SemanticTokensRangeRequest",{enumerable:!0,get:function(){return bs.SemanticTokensRangeRequest}});Object.defineProperty(f,"SemanticTokensRefreshRequest",{enumerable:!0,get:function(){return bs.SemanticTokensRefreshRequest}});Object.defineProperty(f,"SemanticTokensRegistrationType",{enumerable:!0,get:function(){return bs.SemanticTokensRegistrationType}});var I$=vT();Object.defineProperty(f,"ShowDocumentRequest",{enumerable:!0,get:function(){return I$.ShowDocumentRequest}});var _$=$T();Object.defineProperty(f,"LinkedEditingRangeRequest",{enumerable:!0,get:function(){return _$.LinkedEditingRangeRequest}});var mi=bT();Object.defineProperty(f,"FileOperationPatternKind",{enumerable:!0,get:function(){return mi.FileOperationPatternKind}});Object.defineProperty(f,"DidCreateFilesNotification",{enumerable:!0,get:function(){return mi.DidCreateFilesNotification}});Object.defineProperty(f,"WillCreateFilesRequest",{enumerable:!0,get:function(){return mi.WillCreateFilesRequest}});Object.defineProperty(f,"DidRenameFilesNotification",{enumerable:!0,get:function(){return mi.DidRenameFilesNotification}});Object.defineProperty(f,"WillRenameFilesRequest",{enumerable:!0,get:function(){return mi.WillRenameFilesRequest}});Object.defineProperty(f,"DidDeleteFilesNotification",{enumerable:!0,get:function(){return mi.DidDeleteFilesNotification}});Object.defineProperty(f,"WillDeleteFilesRequest",{enumerable:!0,get:function(){return mi.WillDeleteFilesRequest}});var ih=MT();Object.defineProperty(f,"UniquenessLevel",{enumerable:!0,get:function(){return ih.UniquenessLevel}});Object.defineProperty(f,"MonikerKind",{enumerable:!0,get:function(){return ih.MonikerKind}});Object.defineProperty(f,"MonikerRequest",{enumerable:!0,get:function(){return ih.MonikerRequest}});var sh=qT();Object.defineProperty(f,"TypeHierarchyPrepareRequest",{enumerable:!0,get:function(){return sh.TypeHierarchyPrepareRequest}});Object.defineProperty(f,"TypeHierarchySubtypesRequest",{enumerable:!0,get:function(){return sh.TypeHierarchySubtypesRequest}});Object.defineProperty(f,"TypeHierarchySupertypesRequest",{enumerable:!0,get:function(){return sh.TypeHierarchySupertypesRequest}});var Ax=BT();Object.defineProperty(f,"InlineValueRequest",{enumerable:!0,get:function(){return Ax.InlineValueRequest}});Object.defineProperty(f,"InlineValueRefreshRequest",{enumerable:!0,get:function(){return Ax.InlineValueRefreshRequest}});var ah=HT();Object.defineProperty(f,"InlayHintRequest",{enumerable:!0,get:function(){return ah.InlayHintRequest}});Object.defineProperty(f,"InlayHintResolveRequest",{enumerable:!0,get:function(){return ah.InlayHintResolveRequest}});Object.defineProperty(f,"InlayHintRefreshRequest",{enumerable:!0,get:function(){return ah.InlayHintRefreshRequest}});var Ro=tR();Object.defineProperty(f,"DiagnosticServerCancellationData",{enumerable:!0,get:function(){return Ro.DiagnosticServerCancellationData}});Object.defineProperty(f,"DocumentDiagnosticReportKind",{enumerable:!0,get:function(){return Ro.DocumentDiagnosticReportKind}});Object.defineProperty(f,"DocumentDiagnosticRequest",{enumerable:!0,get:function(){return Ro.DocumentDiagnosticRequest}});Object.defineProperty(f,"WorkspaceDiagnosticRequest",{enumerable:!0,get:function(){return Ro.WorkspaceDiagnosticRequest}});Object.defineProperty(f,"DiagnosticRefreshRequest",{enumerable:!0,get:function(){return Ro.DiagnosticRefreshRequest}});var wr=cR();Object.defineProperty(f,"NotebookCellKind",{enumerable:!0,get:function(){return wr.NotebookCellKind}});Object.defineProperty(f,"ExecutionSummary",{enumerable:!0,get:function(){return wr.ExecutionSummary}});Object.defineProperty(f,"NotebookCell",{enumerable:!0,get:function(){return wr.NotebookCell}});Object.defineProperty(f,"NotebookDocument",{enumerable:!0,get:function(){return wr.NotebookDocument}});Object.defineProperty(f,"NotebookDocumentSyncRegistrationType",{enumerable:!0,get:function(){return wr.NotebookDocumentSyncRegistrationType}});Object.defineProperty(f,"DidOpenNotebookDocumentNotification",{enumerable:!0,get:function(){return wr.DidOpenNotebookDocumentNotification}});Object.defineProperty(f,"NotebookCellArrayChange",{enumerable:!0,get:function(){return wr.NotebookCellArrayChange}});Object.defineProperty(f,"DidChangeNotebookDocumentNotification",{enumerable:!0,get:function(){return wr.DidChangeNotebookDocumentNotification}});Object.defineProperty(f,"DidSaveNotebookDocumentNotification",{enumerable:!0,get:function(){return wr.DidSaveNotebookDocumentNotification}});Object.defineProperty(f,"DidCloseNotebookDocumentNotification",{enumerable:!0,get:function(){return wr.DidCloseNotebookDocumentNotification}});var b$=fR();Object.defineProperty(f,"InlineCompletionRequest",{enumerable:!0,get:function(){return b$.InlineCompletionRequest}});var Qp;(function(t){function e(r){let n=r;return at.string(n)||at.string(n.language)||at.string(n.scheme)||at.string(n.pattern)}t.is=e})(Qp||(f.TextDocumentFilter=Qp={}));var Zp;(function(t){function e(r){let n=r;return at.objectLiteral(n)&&(at.string(n.notebookType)||at.string(n.scheme)||at.string(n.pattern))}t.is=e})(Zp||(f.NotebookDocumentFilter=Zp={}));var eh;(function(t){function e(r){let n=r;return at.objectLiteral(n)&&(at.string(n.notebook)||Zp.is(n.notebook))&&(n.language===void 0||at.string(n.language))}t.is=e})(eh||(f.NotebookCellTextDocumentFilter=eh={}));var th;(function(t){function e(r){if(!Array.isArray(r))return!1;for(let n of r)if(!at.string(n)&&!Qp.is(n)&&!eh.is(n))return!1;return!0}t.is=e})(th||(f.DocumentSelector=th={}));var pR;(function(t){t.method="client/registerCapability",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolRequestType(t.method)})(pR||(f.RegistrationRequest=pR={}));var hR;(function(t){t.method="client/unregisterCapability",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolRequestType(t.method)})(hR||(f.UnregistrationRequest=hR={}));var mR=(function(t){return t.Create="create",t.Rename="rename",t.Delete="delete",t})(mR||(f.ResourceOperationKind=mR={})),gR=(function(t){return t.Abort="abort",t.Transactional="transactional",t.TextOnlyTransactional="textOnlyTransactional",t.Undo="undo",t})(gR||(f.FailureHandlingKind=gR={})),yR=(function(t){return t.UTF8="utf-8",t.UTF16="utf-16",t.UTF32="utf-32",t})(yR||(f.PositionEncodingKind=yR={})),TR;(function(t){function e(r){let n=r;return n&&at.string(n.id)&&n.id.length>0}t.hasId=e})(TR||(f.StaticRegistrationOptions=TR={}));var RR;(function(t){function e(r){let n=r;return n&&(n.documentSelector===null||th.is(n.documentSelector))}t.is=e})(RR||(f.TextDocumentRegistrationOptions=RR={}));var xR;(function(t){function e(n){let i=n;return at.objectLiteral(i)&&(i.workDoneProgress===void 0||at.boolean(i.workDoneProgress))}t.is=e;function r(n){let i=n;return i&&at.boolean(i.workDoneProgress)}t.hasWorkDoneProgress=r})(xR||(f.WorkDoneProgressOptions=xR={}));var vR;(function(t){t.method="initialize",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(vR||(f.InitializeRequest=vR={}));var ER=(function(t){return t.unknownProtocolVersion=1,t})(ER||(f.InitializeErrorCodes=ER={})),AR;(function(t){t.method="initialized",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(AR||(f.InitializedNotification=AR={}));var $R;(function(t){t.method="shutdown",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType0(t.method)})($R||(f.ShutdownRequest=$R={}));var SR;(function(t){t.method="exit",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType0(t.method)})(SR||(f.ExitNotification=SR={}));var kR;(function(t){t.method="workspace/didChangeConfiguration",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(kR||(f.DidChangeConfigurationNotification=kR={}));var NR=(function(t){return t.Error=1,t.Warning=2,t.Info=3,t.Log=4,t.Debug=5,t})(NR||(f.MessageType=NR={})),CR;(function(t){t.method="window/showMessage",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolNotificationType(t.method)})(CR||(f.ShowMessageNotification=CR={}));var wR;(function(t){t.method="window/showMessageRequest",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolRequestType(t.method)})(wR||(f.ShowMessageRequest=wR={}));var IR;(function(t){t.method="window/logMessage",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolNotificationType(t.method)})(IR||(f.LogMessageNotification=IR={}));var _R;(function(t){t.method="telemetry/event",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolNotificationType(t.method)})(_R||(f.TelemetryEventNotification=_R={}));var bR=(function(t){return t.None=0,t.Full=1,t.Incremental=2,t})(bR||(f.TextDocumentSyncKind=bR={})),PR;(function(t){t.method="textDocument/didOpen",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(PR||(f.DidOpenTextDocumentNotification=PR={}));var OR;(function(t){function e(n){let i=n;return i!=null&&typeof i.text=="string"&&i.range!==void 0&&(i.rangeLength===void 0||typeof i.rangeLength=="number")}t.isIncremental=e;function r(n){let i=n;return i!=null&&typeof i.text=="string"&&i.range===void 0&&i.rangeLength===void 0}t.isFull=r})(OR||(f.TextDocumentContentChangeEvent=OR={}));var LR;(function(t){t.method="textDocument/didChange",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(LR||(f.DidChangeTextDocumentNotification=LR={}));var DR;(function(t){t.method="textDocument/didClose",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(DR||(f.DidCloseTextDocumentNotification=DR={}));var MR;(function(t){t.method="textDocument/didSave",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(MR||(f.DidSaveTextDocumentNotification=MR={}));var FR=(function(t){return t.Manual=1,t.AfterDelay=2,t.FocusOut=3,t})(FR||(f.TextDocumentSaveReason=FR={})),GR;(function(t){t.method="textDocument/willSave",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(GR||(f.WillSaveTextDocumentNotification=GR={}));var UR;(function(t){t.method="textDocument/willSaveWaitUntil",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(UR||(f.WillSaveTextDocumentWaitUntilRequest=UR={}));var qR;(function(t){t.method="workspace/didChangeWatchedFiles",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(qR||(f.DidChangeWatchedFilesNotification=qR={}));var zR=(function(t){return t.Created=1,t.Changed=2,t.Deleted=3,t})(zR||(f.FileChangeType=zR={})),jR;(function(t){function e(r){let n=r;return at.objectLiteral(n)&&(dR.URI.is(n.baseUri)||dR.WorkspaceFolder.is(n.baseUri))&&at.string(n.pattern)}t.is=e})(jR||(f.RelativePattern=jR={}));var BR=(function(t){return t.Create=1,t.Change=2,t.Delete=4,t})(BR||(f.WatchKind=BR={})),WR;(function(t){t.method="textDocument/publishDiagnostics",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolNotificationType(t.method)})(WR||(f.PublishDiagnosticsNotification=WR={}));var VR=(function(t){return t.Invoked=1,t.TriggerCharacter=2,t.TriggerForIncompleteCompletions=3,t})(VR||(f.CompletionTriggerKind=VR={})),KR;(function(t){t.method="textDocument/completion",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(KR||(f.CompletionRequest=KR={}));var HR;(function(t){t.method="completionItem/resolve",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(HR||(f.CompletionResolveRequest=HR={}));var YR;(function(t){t.method="textDocument/hover",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(YR||(f.HoverRequest=YR={}));var XR=(function(t){return t.Invoked=1,t.TriggerCharacter=2,t.ContentChange=3,t})(XR||(f.SignatureHelpTriggerKind=XR={})),JR;(function(t){t.method="textDocument/signatureHelp",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(JR||(f.SignatureHelpRequest=JR={}));var QR;(function(t){t.method="textDocument/definition",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(QR||(f.DefinitionRequest=QR={}));var ZR;(function(t){t.method="textDocument/references",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(ZR||(f.ReferencesRequest=ZR={}));var ex;(function(t){t.method="textDocument/documentHighlight",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(ex||(f.DocumentHighlightRequest=ex={}));var tx;(function(t){t.method="textDocument/documentSymbol",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(tx||(f.DocumentSymbolRequest=tx={}));var rx;(function(t){t.method="textDocument/codeAction",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(rx||(f.CodeActionRequest=rx={}));var nx;(function(t){t.method="codeAction/resolve",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(nx||(f.CodeActionResolveRequest=nx={}));var ix;(function(t){t.method="workspace/symbol",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(ix||(f.WorkspaceSymbolRequest=ix={}));var sx;(function(t){t.method="workspaceSymbol/resolve",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(sx||(f.WorkspaceSymbolResolveRequest=sx={}));var ax;(function(t){t.method="textDocument/codeLens",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(ax||(f.CodeLensRequest=ax={}));var ox;(function(t){t.method="codeLens/resolve",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(ox||(f.CodeLensResolveRequest=ox={}));var cx;(function(t){t.method="workspace/codeLens/refresh",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolRequestType0(t.method)})(cx||(f.CodeLensRefreshRequest=cx={}));var lx;(function(t){t.method="textDocument/documentLink",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(lx||(f.DocumentLinkRequest=lx={}));var ux;(function(t){t.method="documentLink/resolve",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(ux||(f.DocumentLinkResolveRequest=ux={}));var fx;(function(t){t.method="textDocument/formatting",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(fx||(f.DocumentFormattingRequest=fx={}));var dx;(function(t){t.method="textDocument/rangeFormatting",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(dx||(f.DocumentRangeFormattingRequest=dx={}));var px;(function(t){t.method="textDocument/rangesFormatting",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(px||(f.DocumentRangesFormattingRequest=px={}));var hx;(function(t){t.method="textDocument/onTypeFormatting",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(hx||(f.DocumentOnTypeFormattingRequest=hx={}));var mx=(function(t){return t.Identifier=1,t})(mx||(f.PrepareSupportDefaultBehavior=mx={})),gx;(function(t){t.method="textDocument/rename",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(gx||(f.RenameRequest=gx={}));var yx;(function(t){t.method="textDocument/prepareRename",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(yx||(f.PrepareRenameRequest=yx={}));var Tx;(function(t){t.method="workspace/executeCommand",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(Tx||(f.ExecuteCommandRequest=Tx={}));var Rx;(function(t){t.method="workspace/applyEdit",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolRequestType("workspace/applyEdit")})(Rx||(f.ApplyWorkspaceEditRequest=Rx={}))});var kx=X(Hl=>{"use strict";Object.defineProperty(Hl,"__esModule",{value:!0});Hl.createProtocolConnection=void 0;var Sx=hi();function P$(t,e,r,n){return Sx.ConnectionStrategy.is(n)&&(n={connectionStrategy:n}),(0,Sx.createMessageConnection)(t,e,r,n)}Hl.createProtocolConnection=P$});var Cx=X(Ft=>{"use strict";var O$=Ft&&Ft.__createBinding||(Object.create?function(t,e,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,i)}:function(t,e,r,n){n===void 0&&(n=r),t[n]=e[r]}),Yl=Ft&&Ft.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&O$(e,t,r)};Object.defineProperty(Ft,"__esModule",{value:!0});Ft.LSPErrorCodes=Ft.createProtocolConnection=void 0;Yl(hi(),Ft);Yl((as(),pu(il)),Ft);Yl(_e(),Ft);Yl($x(),Ft);var L$=kx();Object.defineProperty(Ft,"createProtocolConnection",{enumerable:!0,get:function(){return L$.createProtocolConnection}});var Nx=(function(t){return t.lspReservedErrorRangeStart=-32899,t.RequestFailed=-32803,t.ServerCancelled=-32802,t.ContentModified=-32801,t.RequestCancelled=-32800,t.lspReservedErrorRangeEnd=-32800,t})(Nx||(Ft.LSPErrorCodes=Nx={}))});var Ix=X(Ir=>{"use strict";var D$=Ir&&Ir.__createBinding||(Object.create?function(t,e,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,i)}:function(t,e,r,n){n===void 0&&(n=r),t[n]=e[r]}),wx=Ir&&Ir.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&D$(e,t,r)};Object.defineProperty(Ir,"__esModule",{value:!0});Ir.createProtocolConnection=void 0;var M$=Bp();wx(Bp(),Ir);wx(Cx(),Ir);function F$(t,e,r,n){return(0,M$.createMessageConnection)(t,e,r,n)}Ir.createProtocolConnection=F$});var qe={};en(qe,{AbstractAstReflection:()=>_n,AbstractCstNode:()=>za,AbstractLangiumParser:()=>ja,AbstractParserErrorMessageProvider:()=>al,AbstractThreadedAsyncParser:()=>hh,AstUtils:()=>Uo,BiMap:()=>ui,Cancellation:()=>W,CompositeCstNodeImpl:()=>si,ContextCache:()=>fi,CstNodeBuilder:()=>qa,CstUtils:()=>ac,DEFAULT_TOKENIZE_OPTIONS:()=>Xl,DONE_RESULT:()=>gt,DatatypeSymbol:()=>sl,DefaultAstNodeDescriptionProvider:()=>oo,DefaultAstNodeLocator:()=>lo,DefaultAsyncParser:()=>Co,DefaultCommentProvider:()=>No,DefaultConfigurationProvider:()=>uo,DefaultDocumentBuilder:()=>xo,DefaultDocumentValidator:()=>ao,DefaultHydrator:()=>Io,DefaultIndexManager:()=>vo,DefaultJsonSerializer:()=>no,DefaultLangiumDocumentFactory:()=>Ha,DefaultLangiumDocuments:()=>Ya,DefaultLangiumProfiler:()=>vh,DefaultLexer:()=>gi,DefaultLexerErrorMessageProvider:()=>Ao,DefaultLinker:()=>Xa,DefaultNameProvider:()=>Ja,DefaultReferenceDescriptionProvider:()=>co,DefaultReferences:()=>Qa,DefaultScopeComputation:()=>Za,DefaultScopeProvider:()=>ro,DefaultServiceRegistry:()=>io,DefaultTokenBuilder:()=>Jr,DefaultValueConverter:()=>oi,DefaultWorkspaceLock:()=>wo,DefaultWorkspaceManager:()=>Eo,Deferred:()=>It,Disposable:()=>Cn,DisposableCache:()=>gs,DocumentCache:()=>ml,DocumentState:()=>re,DocumentValidator:()=>lr,EMPTY_SCOPE:()=>QA,EMPTY_STREAM:()=>nn,EmptyFileSystem:()=>xh,EmptyFileSystemProvider:()=>ru,ErrorWithLocation:()=>Vn,GrammarAST:()=>oa,GrammarUtils:()=>dc,IndentationAwareLexer:()=>Rh,IndentationAwareTokenBuilder:()=>tu,JSDocDocumentationProvider:()=>ko,LangiumCompletionParser:()=>Wa,LangiumParser:()=>Ba,LangiumParserErrorMessageProvider:()=>cs,LeafCstNodeImpl:()=>ii,LexingMode:()=>Os,MapScope:()=>Ud,Module:()=>Gx,MultiMap:()=>Rt,MultiMapScope:()=>eo,OperationCancelled:()=>Yt,ParserWorker:()=>mh,ProfilingTask:()=>nu,Reduction:()=>Ei,RefResolving:()=>li,RegExpUtils:()=>lc,RootCstNodeImpl:()=>os,SimpleCache:()=>to,StreamImpl:()=>qt,StreamScope:()=>ms,TextDocument:()=>ds,TreeStreamImpl:()=>yr,URI:()=>rt,UriTrie:()=>hs,UriUtils:()=>Be,VALIDATE_EACH_NODE:()=>sy,ValidationCategory:()=>gl,ValidationRegistry:()=>so,ValueConverter:()=>$r,WorkspaceCache:()=>ys,assertCondition:()=>Yh,assertUnreachable:()=>Rr,createCompletionParser:()=>Id,createDefaultCoreModule:()=>gh,createDefaultSharedCoreModule:()=>yh,createGrammarConfig:()=>af,createLangiumParser:()=>_d,createParser:()=>Va,delayNextTick:()=>Fd,diagnosticData:()=>di,eagerLoad:()=>qx,getDiagnosticRange:()=>ay,indentationBuilderDefaultOptions:()=>Th,inject:()=>eu,interruptAndCheck:()=>Me,isAstNode:()=>Oe,isAstNodeDescription:()=>mu,isAstNodeWithComment:()=>qd,isCompositeCstNode:()=>rr,isIMultiModeLexerDefinition:()=>ch,isJSDoc:()=>dh,isLeafCstNode:()=>rn,isLinkingError:()=>bn,isMultiReference:()=>Ut,isNamed:()=>ny,isOperationCancelled:()=>Sr,isReference:()=>tt,isRootCstNode:()=>Ys,isTokenTypeArray:()=>Jl,isTokenTypeDictionary:()=>oh,loadGrammarFromJson:()=>_r,parseJSDoc:()=>fh,prepareLangiumParser:()=>Kg,setInterruptionPeriod:()=>Qg,startCancelableOperation:()=>pl,stream:()=>ee,toDiagnosticData:()=>oy,toDiagnosticSeverity:()=>yl});var ac={};en(ac,{DefaultNameRegexp:()=>sc,RangeComparison:()=>qr,compareRange:()=>Wh,findCommentNode:()=>Uu,findDeclarationNodeAtOffset:()=>kv,findLeafNodeAtOffset:()=>qu,findLeafNodeBeforeOffset:()=>Vh,flattenCst:()=>Sv,getDatatypeNode:()=>$v,getInteriorNodes:()=>wv,getNextNode:()=>Nv,getPreviousNode:()=>Hh,getStartlineNode:()=>Cv,inRange:()=>Ru,isChildNode:()=>Gu,isCommentNode:()=>Fu,streamCst:()=>Bn,toDocumentSegment:()=>Wn,tokenToRange:()=>Pi});function Oe(t){return typeof t=="object"&&t!==null&&typeof t.$type=="string"}function tt(t){return typeof t=="object"&&t!==null&&typeof t.$refText=="string"&&"ref"in t}function Ut(t){return typeof t=="object"&&t!==null&&typeof t.$refText=="string"&&"items"in t}function mu(t){return typeof t=="object"&&t!==null&&typeof t.name=="string"&&typeof t.type=="string"&&typeof t.path=="string"}function bn(t){return typeof t=="object"&&t!==null&&typeof t.info=="object"&&typeof t.message=="string"}var _n=class{constructor(){this.subtypes={},this.allSubtypes={}}getAllTypes(){return Object.keys(this.types)}getReferenceType(e){let r=this.types[e.container.$type];if(!r)throw new Error(`Type ${e.container.$type||"undefined"} not found.`);let n=r.properties[e.property]?.referenceType;if(!n)throw new Error(`Property ${e.property||"undefined"} of type ${e.container.$type} is not a reference.`);return n}getTypeMetaData(e){let r=this.types[e];return r||{name:e,properties:{},superTypes:[]}}isInstance(e,r){return Oe(e)&&this.isSubtype(e.$type,r)}isSubtype(e,r){if(e===r)return!0;let n=this.subtypes[e];n||(n=this.subtypes[e]={});let i=n[r];if(i!==void 0)return i;{let s=this.types[e],a=s?s.superTypes.some(o=>this.isSubtype(o,r)):!1;return n[r]=a,a}}getAllSubTypes(e){let r=this.allSubtypes[e];if(r)return r;{let n=this.getAllTypes(),i=[];for(let s of n)this.isSubtype(s,e)&&i.push(s);return this.allSubtypes[e]=i,i}}};function rr(t){return typeof t=="object"&&t!==null&&Array.isArray(t.content)}function rn(t){return typeof t=="object"&&t!==null&&typeof t.tokenType=="object"}function Ys(t){return rr(t)&&typeof t.fullText=="string"}var qt=class t{constructor(e,r){this.startFn=e,this.nextFn=r}iterator(){let e={state:this.startFn(),next:()=>this.nextFn(e.state),[Symbol.iterator]:()=>e};return e}[Symbol.iterator](){return this.iterator()}isEmpty(){return!!this.iterator().next().done}count(){let e=this.iterator(),r=0,n=e.next();for(;!n.done;)r++,n=e.next();return r}toArray(){let e=[],r=this.iterator(),n;do n=r.next(),n.value!==void 0&&e.push(n.value);while(!n.done);return e}toSet(){return new Set(this)}toMap(e,r){let n=this.map(i=>[e?e(i):i,r?r(i):i]);return new Map(n)}toString(){return this.join()}concat(e){return new t(()=>({first:this.startFn(),firstDone:!1,iterator:e[Symbol.iterator]()}),r=>{let n;if(!r.firstDone){do if(n=this.nextFn(r.first),!n.done)return n;while(!n.done);r.firstDone=!0}do if(n=r.iterator.next(),!n.done)return n;while(!n.done);return gt})}join(e=","){let r=this.iterator(),n="",i,s=!1;do i=r.next(),i.done||(s&&(n+=e),n+=sv(i.value)),s=!0;while(!i.done);return n}indexOf(e,r=0){let n=this.iterator(),i=0,s=n.next();for(;!s.done;){if(i>=r&&s.value===e)return i;s=n.next(),i++}return-1}every(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(!e(n.value))return!1;n=r.next()}return!0}some(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return!0;n=r.next()}return!1}forEach(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;)e(i.value,n),i=r.next(),n++}map(e){return new t(this.startFn,r=>{let{done:n,value:i}=this.nextFn(r);return n?gt:{done:!1,value:e(i)}})}filter(e){return new t(this.startFn,r=>{let n;do if(n=this.nextFn(r),!n.done&&e(n.value))return n;while(!n.done);return gt})}nonNullable(){return this.filter(e=>e!=null)}reduce(e,r){let n=this.iterator(),i=r,s=n.next();for(;!s.done;)i===void 0?i=s.value:i=e(i,s.value),s=n.next();return i}reduceRight(e,r){return this.recursiveReduce(this.iterator(),e,r)}recursiveReduce(e,r,n){let i=e.next();if(i.done)return n;let s=this.recursiveReduce(e,r,n);return s===void 0?i.value:r(s,i.value)}find(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return n.value;n=r.next()}}findIndex(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;){if(e(i.value))return n;i=r.next(),n++}return-1}includes(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(n.value===e)return!0;n=r.next()}return!1}flatMap(e){return new t(()=>({this:this.startFn()}),r=>{do{if(r.iterator){let s=r.iterator.next();if(s.done)r.iterator=void 0;else return s}let{done:n,value:i}=this.nextFn(r.this);if(!n){let s=e(i);if(Fo(s))r.iterator=s[Symbol.iterator]();else return{done:!1,value:s}}}while(r.iterator);return gt})}flat(e){if(e===void 0&&(e=1),e<=0)return this;let r=e>1?this.flat(e-1):this;return new t(()=>({this:r.startFn()}),n=>{do{if(n.iterator){let a=n.iterator.next();if(a.done)n.iterator=void 0;else return a}let{done:i,value:s}=r.nextFn(n.this);if(!i)if(Fo(s))n.iterator=s[Symbol.iterator]();else return{done:!1,value:s}}while(n.iterator);return gt})}head(){let r=this.iterator().next();if(!r.done)return r.value}tail(e=1){return new t(()=>{let r=this.startFn();for(let n=0;n({size:0,state:this.startFn()}),r=>(r.size++,r.size>e?gt:this.nextFn(r.state)))}distinct(e){return new t(()=>({set:new Set,internalState:this.startFn()}),r=>{let n;do if(n=this.nextFn(r.internalState),!n.done){let i=e?e(n.value):n.value;if(!r.set.has(i))return r.set.add(i),n}while(!n.done);return gt})}exclude(e,r){let n=new Set;for(let i of e){let s=r?r(i):i;n.add(s)}return this.filter(i=>{let s=r?r(i):i;return!n.has(s)})}};function sv(t){return typeof t=="string"?t:typeof t>"u"?"undefined":typeof t.toString=="function"?t.toString():Object.prototype.toString.call(t)}function Fo(t){return!!t&&typeof t[Symbol.iterator]=="function"}var nn=new qt(()=>{},()=>gt),gt=Object.freeze({done:!0,value:void 0});function ee(...t){if(t.length===1){let e=t[0];if(e instanceof qt)return e;if(Fo(e))return new qt(()=>e[Symbol.iterator](),r=>r.next());if(typeof e.length=="number")return new qt(()=>({index:0}),r=>r.index1?new qt(()=>({collIndex:0,arrIndex:0}),e=>{do{if(e.iterator){let r=e.iterator.next();if(!r.done)return r;e.iterator=void 0}if(e.array){if(e.arrIndex({iterators:n?.includeRoot?[[e][Symbol.iterator]()]:[r(e)[Symbol.iterator]()],pruned:!1}),i=>{for(i.pruned&&(i.iterators.pop(),i.pruned=!1);i.iterators.length>0;){let a=i.iterators[i.iterators.length-1].next();if(a.done)i.iterators.pop();else return i.iterators.push(r(a.value)[Symbol.iterator]()),a}return gt})}iterator(){let e={state:this.startFn(),next:()=>this.nextFn(e.state),prune:()=>{e.state.pruned=!0},[Symbol.iterator]:()=>e};return e}},Ei;(function(t){function e(s){return s.reduce((a,o)=>a+o,0)}t.sum=e;function r(s){return s.reduce((a,o)=>a*o,0)}t.product=r;function n(s){return s.reduce((a,o)=>Math.min(a,o))}t.min=n;function i(s){return s.reduce((a,o)=>Math.max(a,o))}t.max=i})(Ei||(Ei={}));var Uo={};en(Uo,{assignMandatoryProperties:()=>Tu,copyAstNode:()=>yu,findRootNode:()=>$i,getContainerOfType:()=>Dr,getDocument:()=>yt,getReferenceNodes:()=>Go,hasContainerOfType:()=>av,linkContentToContainer:()=>Ai,streamAllContents:()=>nr,streamAst:()=>St,streamContents:()=>Xs,streamReferences:()=>sn});function Ai(t,e={}){for(let[r,n]of Object.entries(t))r.startsWith("$")||(Array.isArray(n)?n.forEach((i,s)=>{Oe(i)&&(i.$container=t,i.$containerProperty=r,i.$containerIndex=s,e.deep&&Ai(i,e))}):Oe(n)&&(n.$container=t,n.$containerProperty=r,e.deep&&Ai(n,e)))}function Dr(t,e){let r=t;for(;r;){if(e(r))return r;r=r.$container}}function av(t,e){let r=t;for(;r;){if(e(r))return!0;r=r.$container}return!1}function yt(t){let r=$i(t).$document;if(!r)throw new Error("AST node has no document.");return r}function $i(t){for(;t.$container;)t=t.$container;return t}function Go(t){return tt(t)?t.ref?[t.ref]:[]:Ut(t)?t.items.map(e=>e.ref):[]}function Xs(t,e){if(!t)throw new Error("Node must be an AstNode.");let r=e?.range;return new qt(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),n=>{for(;n.keyIndexXs(r,e))}function St(t,e){if(t){if(e?.range&&!gu(t,e.range))return new yr(t,()=>[])}else throw new Error("Root node must be an AstNode.");return new yr(t,r=>Xs(r,e),{includeRoot:!0})}function gu(t,e){if(!e)return!0;let r=t.$cstNode?.range;return r?Ru(r,e):!1}function sn(t){return new qt(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),e=>{for(;e.keyIndexbt,AbstractParserRule:()=>Js,AbstractRule:()=>Si,AbstractType:()=>zt,Action:()=>an,Alternatives:()=>Qs,ArrayLiteral:()=>qo,ArrayType:()=>zo,Assignment:()=>on,BooleanLiteral:()=>jo,CharacterRange:()=>cn,Condition:()=>ln,Conjunction:()=>Zs,CrossReference:()=>un,Disjunction:()=>ea,EndOfFile:()=>Bo,Grammar:()=>Mr,GrammarImport:()=>Wo,Group:()=>Pn,InferredType:()=>Vo,InfixRule:()=>Tr,InfixRuleOperatorList:()=>ta,InfixRuleOperators:()=>Ko,Interface:()=>ki,Keyword:()=>Ni,LangiumGrammarAstReflection:()=>bi,LangiumGrammarTerminals:()=>ov,NamedArgument:()=>Ci,NegatedToken:()=>On,Negation:()=>Ho,NumberLiteral:()=>Yo,Parameter:()=>wi,ParameterReference:()=>Xo,ParserRule:()=>ir,ReferenceType:()=>ra,RegexToken:()=>Ln,ReturnType:()=>Jo,RuleCall:()=>Dn,SimpleType:()=>Ii,StringLiteral:()=>Qo,TerminalAlternatives:()=>Mn,TerminalElement:()=>Pt,TerminalGroup:()=>Fn,TerminalRule:()=>Fr,TerminalRuleCall:()=>Gn,Type:()=>na,TypeAttribute:()=>Un,TypeDefinition:()=>qn,UnionType:()=>Zo,UnorderedGroup:()=>ia,UntilToken:()=>zn,ValueLiteral:()=>jn,Wildcard:()=>_i,isAbstractElement:()=>sa,isAbstractParserRule:()=>Gr,isAbstractRule:()=>cv,isAbstractType:()=>lv,isAction:()=>Ur,isAlternatives:()=>ec,isArrayLiteral:()=>uv,isArrayType:()=>xu,isAssignment:()=>sr,isBooleanLiteral:()=>vu,isCharacterRange:()=>Eu,isCondition:()=>fv,isConjunction:()=>Au,isCrossReference:()=>ar,isDisjunction:()=>$u,isEndOfFile:()=>Su,isGrammar:()=>dv,isGrammarImport:()=>pv,isGroup:()=>fn,isInferredType:()=>aa,isInfixRule:()=>dn,isInfixRuleOperatorList:()=>hv,isInfixRuleOperators:()=>mv,isInterface:()=>ku,isKeyword:()=>Ht,isNamedArgument:()=>gv,isNegatedToken:()=>Nu,isNegation:()=>Cu,isNumberLiteral:()=>yv,isParameter:()=>Tv,isParameterReference:()=>wu,isParserRule:()=>nt,isReferenceType:()=>Iu,isRegexToken:()=>_u,isReturnType:()=>bu,isRuleCall:()=>or,isSimpleType:()=>tc,isStringLiteral:()=>Rv,isTerminalAlternatives:()=>Pu,isTerminalElement:()=>xv,isTerminalGroup:()=>Ou,isTerminalRule:()=>kt,isTerminalRuleCall:()=>rc,isType:()=>nc,isTypeAttribute:()=>vv,isTypeDefinition:()=>Ev,isUnionType:()=>Lu,isUnorderedGroup:()=>ic,isUntilToken:()=>Du,isValueLiteral:()=>Av,isWildcard:()=>Mu,reflection:()=>B});var ov={ID:/\^?[_a-zA-Z][\w_]*/,STRING:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,NUMBER:/NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity)/,RegexLiteral:/\/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+\/[a-z]*/,WS:/\s+/,ML_COMMENT:/\/\*[\s\S]*?\*\//,SL_COMMENT:/\/\/[^\n\r]*/},bt={$type:"AbstractElement",cardinality:"cardinality"};function sa(t){return B.isInstance(t,bt.$type)}var Js={$type:"AbstractParserRule"};function Gr(t){return B.isInstance(t,Js.$type)}var Si={$type:"AbstractRule"};function cv(t){return B.isInstance(t,Si.$type)}var zt={$type:"AbstractType"};function lv(t){return B.isInstance(t,zt.$type)}var an={$type:"Action",cardinality:"cardinality",feature:"feature",inferredType:"inferredType",operator:"operator",type:"type"};function Ur(t){return B.isInstance(t,an.$type)}var Qs={$type:"Alternatives",cardinality:"cardinality",elements:"elements"};function ec(t){return B.isInstance(t,Qs.$type)}var qo={$type:"ArrayLiteral",elements:"elements"};function uv(t){return B.isInstance(t,qo.$type)}var zo={$type:"ArrayType",elementType:"elementType"};function xu(t){return B.isInstance(t,zo.$type)}var on={$type:"Assignment",cardinality:"cardinality",feature:"feature",operator:"operator",predicate:"predicate",terminal:"terminal"};function sr(t){return B.isInstance(t,on.$type)}var jo={$type:"BooleanLiteral",true:"true"};function vu(t){return B.isInstance(t,jo.$type)}var cn={$type:"CharacterRange",cardinality:"cardinality",left:"left",lookahead:"lookahead",parenthesized:"parenthesized",right:"right"};function Eu(t){return B.isInstance(t,cn.$type)}var ln={$type:"Condition"};function fv(t){return B.isInstance(t,ln.$type)}var Zs={$type:"Conjunction",left:"left",right:"right"};function Au(t){return B.isInstance(t,Zs.$type)}var un={$type:"CrossReference",cardinality:"cardinality",deprecatedSyntax:"deprecatedSyntax",isMulti:"isMulti",terminal:"terminal",type:"type"};function ar(t){return B.isInstance(t,un.$type)}var ea={$type:"Disjunction",left:"left",right:"right"};function $u(t){return B.isInstance(t,ea.$type)}var Bo={$type:"EndOfFile",cardinality:"cardinality"};function Su(t){return B.isInstance(t,Bo.$type)}var Mr={$type:"Grammar",imports:"imports",interfaces:"interfaces",isDeclared:"isDeclared",name:"name",rules:"rules",types:"types"};function dv(t){return B.isInstance(t,Mr.$type)}var Wo={$type:"GrammarImport",path:"path"};function pv(t){return B.isInstance(t,Wo.$type)}var Pn={$type:"Group",cardinality:"cardinality",elements:"elements",guardCondition:"guardCondition",predicate:"predicate"};function fn(t){return B.isInstance(t,Pn.$type)}var Vo={$type:"InferredType",name:"name"};function aa(t){return B.isInstance(t,Vo.$type)}var Tr={$type:"InfixRule",call:"call",dataType:"dataType",inferredType:"inferredType",name:"name",operators:"operators",parameters:"parameters",returnType:"returnType"};function dn(t){return B.isInstance(t,Tr.$type)}var ta={$type:"InfixRuleOperatorList",associativity:"associativity",operators:"operators"};function hv(t){return B.isInstance(t,ta.$type)}var Ko={$type:"InfixRuleOperators",precedences:"precedences"};function mv(t){return B.isInstance(t,Ko.$type)}var ki={$type:"Interface",attributes:"attributes",name:"name",superTypes:"superTypes"};function ku(t){return B.isInstance(t,ki.$type)}var Ni={$type:"Keyword",cardinality:"cardinality",predicate:"predicate",value:"value"};function Ht(t){return B.isInstance(t,Ni.$type)}var Ci={$type:"NamedArgument",calledByName:"calledByName",parameter:"parameter",value:"value"};function gv(t){return B.isInstance(t,Ci.$type)}var On={$type:"NegatedToken",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized",terminal:"terminal"};function Nu(t){return B.isInstance(t,On.$type)}var Ho={$type:"Negation",value:"value"};function Cu(t){return B.isInstance(t,Ho.$type)}var Yo={$type:"NumberLiteral",value:"value"};function yv(t){return B.isInstance(t,Yo.$type)}var wi={$type:"Parameter",name:"name"};function Tv(t){return B.isInstance(t,wi.$type)}var Xo={$type:"ParameterReference",parameter:"parameter"};function wu(t){return B.isInstance(t,Xo.$type)}var ir={$type:"ParserRule",dataType:"dataType",definition:"definition",entry:"entry",fragment:"fragment",inferredType:"inferredType",name:"name",parameters:"parameters",returnType:"returnType"};function nt(t){return B.isInstance(t,ir.$type)}var ra={$type:"ReferenceType",isMulti:"isMulti",referenceType:"referenceType"};function Iu(t){return B.isInstance(t,ra.$type)}var Ln={$type:"RegexToken",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized",regex:"regex"};function _u(t){return B.isInstance(t,Ln.$type)}var Jo={$type:"ReturnType",name:"name"};function bu(t){return B.isInstance(t,Jo.$type)}var Dn={$type:"RuleCall",arguments:"arguments",cardinality:"cardinality",predicate:"predicate",rule:"rule"};function or(t){return B.isInstance(t,Dn.$type)}var Ii={$type:"SimpleType",primitiveType:"primitiveType",stringType:"stringType",typeRef:"typeRef"};function tc(t){return B.isInstance(t,Ii.$type)}var Qo={$type:"StringLiteral",value:"value"};function Rv(t){return B.isInstance(t,Qo.$type)}var Mn={$type:"TerminalAlternatives",cardinality:"cardinality",elements:"elements",lookahead:"lookahead",parenthesized:"parenthesized"};function Pu(t){return B.isInstance(t,Mn.$type)}var Pt={$type:"TerminalElement",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized"};function xv(t){return B.isInstance(t,Pt.$type)}var Fn={$type:"TerminalGroup",cardinality:"cardinality",elements:"elements",lookahead:"lookahead",parenthesized:"parenthesized"};function Ou(t){return B.isInstance(t,Fn.$type)}var Fr={$type:"TerminalRule",definition:"definition",fragment:"fragment",hidden:"hidden",name:"name",type:"type"};function kt(t){return B.isInstance(t,Fr.$type)}var Gn={$type:"TerminalRuleCall",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized",rule:"rule"};function rc(t){return B.isInstance(t,Gn.$type)}var na={$type:"Type",name:"name",type:"type"};function nc(t){return B.isInstance(t,na.$type)}var Un={$type:"TypeAttribute",defaultValue:"defaultValue",isOptional:"isOptional",name:"name",type:"type"};function vv(t){return B.isInstance(t,Un.$type)}var qn={$type:"TypeDefinition"};function Ev(t){return B.isInstance(t,qn.$type)}var Zo={$type:"UnionType",types:"types"};function Lu(t){return B.isInstance(t,Zo.$type)}var ia={$type:"UnorderedGroup",cardinality:"cardinality",elements:"elements"};function ic(t){return B.isInstance(t,ia.$type)}var zn={$type:"UntilToken",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized",terminal:"terminal"};function Du(t){return B.isInstance(t,zn.$type)}var jn={$type:"ValueLiteral"};function Av(t){return B.isInstance(t,jn.$type)}var _i={$type:"Wildcard",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized"};function Mu(t){return B.isInstance(t,_i.$type)}var bi=class extends _n{constructor(){super(...arguments),this.types={AbstractElement:{name:bt.$type,properties:{cardinality:{name:bt.cardinality}},superTypes:[]},AbstractParserRule:{name:Js.$type,properties:{},superTypes:[Si.$type,zt.$type]},AbstractRule:{name:Si.$type,properties:{},superTypes:[]},AbstractType:{name:zt.$type,properties:{},superTypes:[]},Action:{name:an.$type,properties:{cardinality:{name:an.cardinality},feature:{name:an.feature},inferredType:{name:an.inferredType},operator:{name:an.operator},type:{name:an.type,referenceType:zt.$type}},superTypes:[bt.$type]},Alternatives:{name:Qs.$type,properties:{cardinality:{name:Qs.cardinality},elements:{name:Qs.elements,defaultValue:[]}},superTypes:[bt.$type]},ArrayLiteral:{name:qo.$type,properties:{elements:{name:qo.elements,defaultValue:[]}},superTypes:[jn.$type]},ArrayType:{name:zo.$type,properties:{elementType:{name:zo.elementType}},superTypes:[qn.$type]},Assignment:{name:on.$type,properties:{cardinality:{name:on.cardinality},feature:{name:on.feature},operator:{name:on.operator},predicate:{name:on.predicate},terminal:{name:on.terminal}},superTypes:[bt.$type]},BooleanLiteral:{name:jo.$type,properties:{true:{name:jo.true,defaultValue:!1}},superTypes:[ln.$type,jn.$type]},CharacterRange:{name:cn.$type,properties:{cardinality:{name:cn.cardinality},left:{name:cn.left},lookahead:{name:cn.lookahead},parenthesized:{name:cn.parenthesized,defaultValue:!1},right:{name:cn.right}},superTypes:[Pt.$type]},Condition:{name:ln.$type,properties:{},superTypes:[]},Conjunction:{name:Zs.$type,properties:{left:{name:Zs.left},right:{name:Zs.right}},superTypes:[ln.$type]},CrossReference:{name:un.$type,properties:{cardinality:{name:un.cardinality},deprecatedSyntax:{name:un.deprecatedSyntax,defaultValue:!1},isMulti:{name:un.isMulti,defaultValue:!1},terminal:{name:un.terminal},type:{name:un.type,referenceType:zt.$type}},superTypes:[bt.$type]},Disjunction:{name:ea.$type,properties:{left:{name:ea.left},right:{name:ea.right}},superTypes:[ln.$type]},EndOfFile:{name:Bo.$type,properties:{cardinality:{name:Bo.cardinality}},superTypes:[bt.$type]},Grammar:{name:Mr.$type,properties:{imports:{name:Mr.imports,defaultValue:[]},interfaces:{name:Mr.interfaces,defaultValue:[]},isDeclared:{name:Mr.isDeclared,defaultValue:!1},name:{name:Mr.name},rules:{name:Mr.rules,defaultValue:[]},types:{name:Mr.types,defaultValue:[]}},superTypes:[]},GrammarImport:{name:Wo.$type,properties:{path:{name:Wo.path}},superTypes:[]},Group:{name:Pn.$type,properties:{cardinality:{name:Pn.cardinality},elements:{name:Pn.elements,defaultValue:[]},guardCondition:{name:Pn.guardCondition},predicate:{name:Pn.predicate}},superTypes:[bt.$type]},InferredType:{name:Vo.$type,properties:{name:{name:Vo.name}},superTypes:[zt.$type]},InfixRule:{name:Tr.$type,properties:{call:{name:Tr.call},dataType:{name:Tr.dataType},inferredType:{name:Tr.inferredType},name:{name:Tr.name},operators:{name:Tr.operators},parameters:{name:Tr.parameters,defaultValue:[]},returnType:{name:Tr.returnType,referenceType:zt.$type}},superTypes:[Js.$type]},InfixRuleOperatorList:{name:ta.$type,properties:{associativity:{name:ta.associativity},operators:{name:ta.operators,defaultValue:[]}},superTypes:[]},InfixRuleOperators:{name:Ko.$type,properties:{precedences:{name:Ko.precedences,defaultValue:[]}},superTypes:[]},Interface:{name:ki.$type,properties:{attributes:{name:ki.attributes,defaultValue:[]},name:{name:ki.name},superTypes:{name:ki.superTypes,defaultValue:[],referenceType:zt.$type}},superTypes:[zt.$type]},Keyword:{name:Ni.$type,properties:{cardinality:{name:Ni.cardinality},predicate:{name:Ni.predicate},value:{name:Ni.value}},superTypes:[bt.$type]},NamedArgument:{name:Ci.$type,properties:{calledByName:{name:Ci.calledByName,defaultValue:!1},parameter:{name:Ci.parameter,referenceType:wi.$type},value:{name:Ci.value}},superTypes:[]},NegatedToken:{name:On.$type,properties:{cardinality:{name:On.cardinality},lookahead:{name:On.lookahead},parenthesized:{name:On.parenthesized,defaultValue:!1},terminal:{name:On.terminal}},superTypes:[Pt.$type]},Negation:{name:Ho.$type,properties:{value:{name:Ho.value}},superTypes:[ln.$type]},NumberLiteral:{name:Yo.$type,properties:{value:{name:Yo.value}},superTypes:[jn.$type]},Parameter:{name:wi.$type,properties:{name:{name:wi.name}},superTypes:[]},ParameterReference:{name:Xo.$type,properties:{parameter:{name:Xo.parameter,referenceType:wi.$type}},superTypes:[ln.$type]},ParserRule:{name:ir.$type,properties:{dataType:{name:ir.dataType},definition:{name:ir.definition},entry:{name:ir.entry,defaultValue:!1},fragment:{name:ir.fragment,defaultValue:!1},inferredType:{name:ir.inferredType},name:{name:ir.name},parameters:{name:ir.parameters,defaultValue:[]},returnType:{name:ir.returnType,referenceType:zt.$type}},superTypes:[Js.$type]},ReferenceType:{name:ra.$type,properties:{isMulti:{name:ra.isMulti,defaultValue:!1},referenceType:{name:ra.referenceType}},superTypes:[qn.$type]},RegexToken:{name:Ln.$type,properties:{cardinality:{name:Ln.cardinality},lookahead:{name:Ln.lookahead},parenthesized:{name:Ln.parenthesized,defaultValue:!1},regex:{name:Ln.regex}},superTypes:[Pt.$type]},ReturnType:{name:Jo.$type,properties:{name:{name:Jo.name}},superTypes:[]},RuleCall:{name:Dn.$type,properties:{arguments:{name:Dn.arguments,defaultValue:[]},cardinality:{name:Dn.cardinality},predicate:{name:Dn.predicate},rule:{name:Dn.rule,referenceType:Si.$type}},superTypes:[bt.$type]},SimpleType:{name:Ii.$type,properties:{primitiveType:{name:Ii.primitiveType},stringType:{name:Ii.stringType},typeRef:{name:Ii.typeRef,referenceType:zt.$type}},superTypes:[qn.$type]},StringLiteral:{name:Qo.$type,properties:{value:{name:Qo.value}},superTypes:[jn.$type]},TerminalAlternatives:{name:Mn.$type,properties:{cardinality:{name:Mn.cardinality},elements:{name:Mn.elements,defaultValue:[]},lookahead:{name:Mn.lookahead},parenthesized:{name:Mn.parenthesized,defaultValue:!1}},superTypes:[Pt.$type]},TerminalElement:{name:Pt.$type,properties:{cardinality:{name:Pt.cardinality},lookahead:{name:Pt.lookahead},parenthesized:{name:Pt.parenthesized,defaultValue:!1}},superTypes:[bt.$type]},TerminalGroup:{name:Fn.$type,properties:{cardinality:{name:Fn.cardinality},elements:{name:Fn.elements,defaultValue:[]},lookahead:{name:Fn.lookahead},parenthesized:{name:Fn.parenthesized,defaultValue:!1}},superTypes:[Pt.$type]},TerminalRule:{name:Fr.$type,properties:{definition:{name:Fr.definition},fragment:{name:Fr.fragment,defaultValue:!1},hidden:{name:Fr.hidden,defaultValue:!1},name:{name:Fr.name},type:{name:Fr.type}},superTypes:[Si.$type]},TerminalRuleCall:{name:Gn.$type,properties:{cardinality:{name:Gn.cardinality},lookahead:{name:Gn.lookahead},parenthesized:{name:Gn.parenthesized,defaultValue:!1},rule:{name:Gn.rule,referenceType:Fr.$type}},superTypes:[Pt.$type]},Type:{name:na.$type,properties:{name:{name:na.name},type:{name:na.type}},superTypes:[zt.$type]},TypeAttribute:{name:Un.$type,properties:{defaultValue:{name:Un.defaultValue},isOptional:{name:Un.isOptional,defaultValue:!1},name:{name:Un.name},type:{name:Un.type}},superTypes:[]},TypeDefinition:{name:qn.$type,properties:{},superTypes:[]},UnionType:{name:Zo.$type,properties:{types:{name:Zo.types,defaultValue:[]}},superTypes:[qn.$type]},UnorderedGroup:{name:ia.$type,properties:{cardinality:{name:ia.cardinality},elements:{name:ia.elements,defaultValue:[]}},superTypes:[bt.$type]},UntilToken:{name:zn.$type,properties:{cardinality:{name:zn.cardinality},lookahead:{name:zn.lookahead},parenthesized:{name:zn.parenthesized,defaultValue:!1},terminal:{name:zn.terminal}},superTypes:[Pt.$type]},ValueLiteral:{name:jn.$type,properties:{},superTypes:[]},Wildcard:{name:_i.$type,properties:{cardinality:{name:_i.cardinality},lookahead:{name:_i.lookahead},parenthesized:{name:_i.parenthesized,defaultValue:!1}},superTypes:[Pt.$type]}}}},B=new bi;function $v(t){let e=t,r=!1;for(;e;){let n=Dr(e.grammarSource,nt);if(n&&n.dataType)e=e.container,r=!0;else return r?e:void 0}}function Bn(t){return new yr(t,e=>rr(e)?e.content:[],{includeRoot:!0})}function Sv(t){return Bn(t).filter(rn)}function Gu(t,e){for(;t.container;)if(t=t.container,t===e)return!0;return!1}function Pi(t){return{start:{character:t.startColumn-1,line:t.startLine-1},end:{character:t.endColumn,line:t.endLine-1}}}function Wn(t){if(!t)return;let{offset:e,end:r,range:n}=t;return{range:n,offset:e,end:r,length:r-e}}var qr=(function(t){return t[t.Before=0]="Before",t[t.After=1]="After",t[t.OverlapFront=2]="OverlapFront",t[t.OverlapBack=3]="OverlapBack",t[t.Inside=4]="Inside",t[t.Outside=5]="Outside",t})(qr||{});function Wh(t,e){if(t.end.linee.end.line||t.start.line===e.end.line&&t.start.character>=e.end.character)return qr.After;let r=t.start.line>e.start.line||t.start.line===e.start.line&&t.start.character>=e.start.character,n=t.end.lineqr.After}var sc=/^[\w\p{L}]$/u;function kv(t,e,r=sc){if(t){if(e>0){let n=e-t.offset,i=t.text.charAt(n);r.test(i)||e--}return qu(t,e)}}function Uu(t,e){if(t){let r=Hh(t,!0);if(r&&Fu(r,e))return r;if(Ys(t)){let n=t.content.findIndex(i=>!i.hidden);for(let i=n-1;i>=0;i--){let s=t.content[i];if(Fu(s,e))return s}}}}function Fu(t,e){return rn(t)&&e.includes(t.tokenType.name)}function qu(t,e){if(rn(t))return t;if(rr(t)){let r=Kh(t,e,!1);if(r)return qu(r,e)}}function Vh(t,e){if(rn(t))return t;if(rr(t)){let r=Kh(t,e,!0);if(r)return Vh(r,e)}}function Kh(t,e,r){let n=0,i=t.content.length-1,s;for(;n<=i;){let a=Math.floor((n+i)/2),o=t.content[a];if(o.offset<=e&&o.end>e)return o;o.end<=e?(s=r?o:void 0,n=a+1):i=a-1}return s}function Hh(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t);for(;n>0;){n--;let i=r.content[n];if(e||!i.hidden)return i}t=r}}function Nv(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t),i=r.content.length-1;for(;nrf,findNameAssignment:()=>uc,findNodeForKeyword:()=>ef,findNodeForProperty:()=>pa,findNodesForKeyword:()=>Lv,findNodesForKeywordInternal:()=>tf,findNodesForProperty:()=>Qu,getActionAtElement:()=>nm,getActionType:()=>sm,getAllReachableRules:()=>da,getAllRulesUsedForCrossReferences:()=>Ov,getCrossReferenceTerminal:()=>Xu,getEntryRule:()=>Zh,getExplicitRuleType:()=>fc,getHiddenRules:()=>em,getRuleType:()=>nf,getRuleTypeName:()=>Uv,getTypeName:()=>hn,isArrayCardinality:()=>Mv,isArrayOperator:()=>Fv,isCommentTerminal:()=>Ju,isDataType:()=>Gv,isDataTypeRule:()=>ha,isOptionalCardinality:()=>Dv,terminalRegex:()=>Li});var Vn=class extends Error{constructor(e,r){super(e?`${r} at ${e.range.start.line}:${e.range.start.character}`:r)}};function Rr(t,e="Error: Got unexpected value."){throw new Error(e)}function Yh(t,e="Error: Condition is violated."){if(!t)throw new Error(e)}var lc={};en(lc,{NEWLINE_REGEXP:()=>Wu,escapeRegExp:()=>pn,getTerminalParts:()=>Pv,isMultilineComment:()=>Vu,isWhitespace:()=>fa,partialMatches:()=>Ku,partialRegExp:()=>Qh,whitespaceCharacters:()=>Jh});function V(t){return t.charCodeAt(0)}function oc(t,e){Array.isArray(t)?t.forEach(function(r){e.push(r)}):e.push(t)}function Oi(t,e){if(t[e]===!0)throw"duplicate flag "+e;let r=t[e];t[e]=!0}function Kn(t){if(t===void 0)throw Error("Internal Error - Should never get here!");return!0}function ca(){throw Error("Internal Error - Should never get here!")}function zu(t){return t.type==="Character"}var la=[];for(let t=V("0");t<=V("9");t++)la.push(t);var ua=[V("_")].concat(la);for(let t=V("a");t<=V("z");t++)ua.push(t);for(let t=V("A");t<=V("Z");t++)ua.push(t);var ju=[V(" "),V("\f"),V(` -`),V("\r"),V(" "),V("\v"),V(" "),V("\xA0"),V("\u1680"),V("\u2000"),V("\u2001"),V("\u2002"),V("\u2003"),V("\u2004"),V("\u2005"),V("\u2006"),V("\u2007"),V("\u2008"),V("\u2009"),V("\u200A"),V("\u2028"),V("\u2029"),V("\u202F"),V("\u205F"),V("\u3000"),V("\uFEFF")];var _v=/[0-9a-fA-F]/,cc=/[0-9]/,bv=/[1-9]/,Hn=class{constructor(){this.idx=0,this.input="",this.groupIdx=0}saveState(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}}restoreState(e){this.idx=e.idx,this.input=e.input,this.groupIdx=e.groupIdx}pattern(e){this.idx=0,this.input=e,this.groupIdx=0,this.consumeChar("/");let r=this.disjunction();this.consumeChar("/");let n={type:"Flags",loc:{begin:this.idx,end:e.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};for(;this.isRegExpFlag();)switch(this.popChar()){case"g":Oi(n,"global");break;case"i":Oi(n,"ignoreCase");break;case"m":Oi(n,"multiLine");break;case"u":Oi(n,"unicode");break;case"y":Oi(n,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:r,loc:this.loc(0)}}disjunction(){let e=[],r=this.idx;for(e.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),e.push(this.alternative());return{type:"Disjunction",value:e,loc:this.loc(r)}}alternative(){let e=[],r=this.idx;for(;this.isTerm();)e.push(this.term());return{type:"Alternative",value:e,loc:this.loc(r)}}term(){return this.isAssertion()?this.assertion():this.atom()}assertion(){let e=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(e)};case"$":return{type:"EndAnchor",loc:this.loc(e)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(e)};case"B":return{type:"NonWordBoundary",loc:this.loc(e)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");let r;switch(this.popChar()){case"=":r="Lookahead";break;case"!":r="NegativeLookahead";break;case"<":{switch(this.popChar()){case"=":r="Lookbehind";break;case"!":r="NegativeLookbehind"}break}}Kn(r);let n=this.disjunction();return this.consumeChar(")"),{type:r,value:n,loc:this.loc(e)}}return ca()}quantifier(e=!1){let r,n=this.idx;switch(this.popChar()){case"*":r={atLeast:0,atMost:1/0};break;case"+":r={atLeast:1,atMost:1/0};break;case"?":r={atLeast:0,atMost:1};break;case"{":let i=this.integerIncludingZero();switch(this.popChar()){case"}":r={atLeast:i,atMost:i};break;case",":let s;this.isDigit()?(s=this.integerIncludingZero(),r={atLeast:i,atMost:s}):r={atLeast:i,atMost:1/0},this.consumeChar("}");break}if(e===!0&&r===void 0)return;Kn(r);break}if(!(e===!0&&r===void 0)&&Kn(r))return this.peekChar(0)==="?"?(this.consumeChar("?"),r.greedy=!1):r.greedy=!0,r.type="Quantifier",r.loc=this.loc(n),r}atom(){let e,r=this.idx;switch(this.peekChar()){case".":e=this.dotAll();break;case"\\":e=this.atomEscape();break;case"[":e=this.characterClass();break;case"(":e=this.group();break}return e===void 0&&this.isPatternCharacter()&&(e=this.patternCharacter()),Kn(e)?(e.loc=this.loc(r),this.isQuantifier()&&(e.quantifier=this.quantifier()),e):ca()}dotAll(){return this.consumeChar("."),{type:"Set",complement:!0,value:[V(` -`),V("\r"),V("\u2028"),V("\u2029")]}}atomEscape(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}}decimalEscapeAtom(){return{type:"GroupBackReference",value:this.positiveInteger()}}characterClassEscape(){let e,r=!1;switch(this.popChar()){case"d":e=la;break;case"D":e=la,r=!0;break;case"s":e=ju;break;case"S":e=ju,r=!0;break;case"w":e=ua;break;case"W":e=ua,r=!0;break}return Kn(e)?{type:"Set",value:e,complement:r}:ca()}controlEscapeAtom(){let e;switch(this.popChar()){case"f":e=V("\f");break;case"n":e=V(` -`);break;case"r":e=V("\r");break;case"t":e=V(" ");break;case"v":e=V("\v");break}return Kn(e)?{type:"Character",value:e}:ca()}controlLetterEscapeAtom(){this.consumeChar("c");let e=this.popChar();if(/[a-zA-Z]/.test(e)===!1)throw Error("Invalid ");return{type:"Character",value:e.toUpperCase().charCodeAt(0)-64}}nulCharacterAtom(){return this.consumeChar("0"),{type:"Character",value:V("\0")}}hexEscapeSequenceAtom(){return this.consumeChar("x"),this.parseHexDigits(2)}regExpUnicodeEscapeSequenceAtom(){return this.consumeChar("u"),this.parseHexDigits(4)}identityEscapeAtom(){let e=this.popChar();return{type:"Character",value:V(e)}}classPatternCharacterAtom(){switch(this.peekChar()){case` -`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:let e=this.popChar();return{type:"Character",value:V(e)}}}characterClass(){let e=[],r=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),r=!0);this.isClassAtom();){let n=this.classAtom(),i=n.type==="Character";if(zu(n)&&this.isRangeDash()){this.consumeChar("-");let s=this.classAtom(),a=s.type==="Character";if(zu(s)){if(s.value=this.input.length)throw Error("Unexpected end of input");this.idx++}loc(e){return{begin:e,end:this.idx}}};var xr=class{visitChildren(e){for(let r in e){let n=e[r];e.hasOwnProperty(r)&&(n.type!==void 0?this.visit(n):Array.isArray(n)&&n.forEach(i=>{this.visit(i)},this))}}visit(e){switch(e.type){case"Pattern":this.visitPattern(e);break;case"Flags":this.visitFlags(e);break;case"Disjunction":this.visitDisjunction(e);break;case"Alternative":this.visitAlternative(e);break;case"StartAnchor":this.visitStartAnchor(e);break;case"EndAnchor":this.visitEndAnchor(e);break;case"WordBoundary":this.visitWordBoundary(e);break;case"NonWordBoundary":this.visitNonWordBoundary(e);break;case"Lookahead":this.visitLookahead(e);break;case"NegativeLookahead":this.visitNegativeLookahead(e);break;case"Lookbehind":this.visitLookbehind(e);break;case"NegativeLookbehind":this.visitNegativeLookbehind(e);break;case"Character":this.visitCharacter(e);break;case"Set":this.visitSet(e);break;case"Group":this.visitGroup(e);break;case"GroupBackReference":this.visitGroupBackReference(e);break;case"Quantifier":this.visitQuantifier(e);break}this.visitChildren(e)}visitPattern(e){}visitFlags(e){}visitDisjunction(e){}visitAlternative(e){}visitStartAnchor(e){}visitEndAnchor(e){}visitWordBoundary(e){}visitNonWordBoundary(e){}visitLookahead(e){}visitNegativeLookahead(e){}visitLookbehind(e){}visitNegativeLookbehind(e){}visitCharacter(e){}visitSet(e){}visitGroup(e){}visitGroupBackReference(e){}visitQuantifier(e){}};var Wu=/\r?\n/gm,Xh=new Hn,Bu=class extends xr{constructor(){super(...arguments),this.isStarting=!0,this.endRegexpStack=[],this.multiline=!1}get endRegex(){return this.endRegexpStack.join("")}reset(e){this.multiline=!1,this.regex=e,this.startRegexp="",this.isStarting=!0,this.endRegexpStack=[]}visitGroup(e){e.quantifier&&(this.isStarting=!1,this.endRegexpStack=[])}visitCharacter(e){let r=String.fromCharCode(e.value);if(!this.multiline&&r===` -`&&(this.multiline=!0),e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let n=pn(r);this.endRegexpStack.push(n),this.isStarting&&(this.startRegexp+=n)}}visitSet(e){if(!this.multiline){let r=this.regex.substring(e.loc.begin,e.loc.end),n=new RegExp(r);this.multiline=!!` -`.match(n)}if(e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let r=this.regex.substring(e.loc.begin,e.loc.end);this.endRegexpStack.push(r),this.isStarting&&(this.startRegexp+=r)}}visitChildren(e){e.type==="Group"&&e.quantifier||super.visitChildren(e)}},Yn=new Bu;function Pv(t){try{typeof t!="string"&&(t=t.source),t=`/${t}/`;let e=Xh.pattern(t),r=[];for(let n of e.value.value)Yn.reset(t),Yn.visit(n),r.push({start:Yn.startRegexp,end:Yn.endRegex});return r}catch(e){return[]}}function Vu(t){try{return typeof t=="string"&&(t=new RegExp(t)),t=t.toString(),Yn.reset(t),Yn.visit(Xh.pattern(t)),Yn.multiline}catch(e){return!1}}var Jh=`\f -\r \v \xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF`.split("");function fa(t){let e=typeof t=="string"?new RegExp(t):t;return Jh.some(r=>e.test(r))}function pn(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ku(t,e){let r=Qh(t),n=e.match(r);return!!n&&n[0].length>0}function Qh(t){typeof t=="string"&&(t=new RegExp(t));let e=t,r=t.source,n=0;function i(){let s="",a;function o(l){s+=r.substr(n,l),n+=l}function c(l){s+="(?:"+r.substr(n,l)+"|$)",n+=l}for(;n",n)-n+1);break;default:c(2);break}break;case"[":a=/\[(?:\\.|.)*?\]/g,a.lastIndex=n,a=a.exec(r)||[],c(a[0].length);break;case"|":case"^":case"$":case"*":case"+":case"?":o(1);break;case"{":a=/\{\d+,?\d*\}/g,a.lastIndex=n,a=a.exec(r),a?o(a[0].length):c(1);break;case"(":if(r[n+1]==="?")switch(r[n+2]){case":":s+="(?:",n+=3,s+=i()+"|$)";break;case"=":s+="(?=",n+=3,s+=i()+")";break;case"!":a=n,n+=3,i(),s+=r.substr(a,n-a);break;case"<":switch(r[n+3]){case"=":case"!":a=n,n+=4,i(),s+=r.substr(a,n-a);break;default:o(r.indexOf(">",n)-n+1),s+=i()+"|$)";break}break}else o(1),s+=i()+"|$)";break;case")":return++n,s;default:c(1);break}return s}return new RegExp(i(),t.flags)}function Zh(t){return t.rules.find(e=>nt(e)&&e.entry)}function em(t){return t.rules.filter(e=>kt(e)&&e.hidden)}function da(t,e){let r=new Set,n=Zh(t);if(!n)return new Set(t.rules);let i=[n].concat(em(t));for(let a of i)tm(a,r,e);let s=new Set;for(let a of t.rules)(r.has(a.name)||kt(a)&&a.hidden)&&s.add(a);return s}function tm(t,e,r){e.add(t.name),nr(t).forEach(n=>{if(or(n)||r&&rc(n)){let i=n.rule.ref;i&&!e.has(i.name)&&tm(i,e,r)}})}function Ov(t){let e=new Set;return nr(t).forEach(r=>{ar(r)&&(nt(r.type.ref)&&e.add(r.type.ref),aa(r.type.ref)&&nt(r.type.ref.$container)&&e.add(r.type.ref.$container))}),e}function Xu(t){if(t.terminal)return t.terminal;if(t.type.ref)return uc(t.type.ref)?.terminal}function Ju(t){return t.hidden&&!fa(Li(t))}function Qu(t,e){return!t||!e?[]:Zu(t,e,t.astNode,!0)}function pa(t,e,r){if(!t||!e)return;let n=Zu(t,e,t.astNode,!0);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function Zu(t,e,r,n){if(!n){let i=Dr(t.grammarSource,sr);if(i&&i.feature===e)return[t]}return rr(t)&&t.astNode===r?t.content.flatMap(i=>Zu(i,e,r,!1)):[]}function Lv(t,e){return t?tf(t,e,t?.astNode):[]}function ef(t,e,r){if(!t)return;let n=tf(t,e,t?.astNode);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function tf(t,e,r){if(t.astNode!==r)return[];if(Ht(t.grammarSource)&&t.grammarSource.value===e)return[t];let n=Bn(t).iterator(),i,s=[];do if(i=n.next(),!i.done){let a=i.value;a.astNode===r?Ht(a.grammarSource)&&a.grammarSource.value===e&&s.push(a):n.prune()}while(!i.done);return s}function rf(t){let e=t.astNode;for(;e===t.container?.astNode;){let r=Dr(t.grammarSource,sr);if(r)return r;t=t.container}}function uc(t){let e=t;return aa(e)&&(Ur(e.$container)?e=e.$container.$container:Gr(e.$container)?e=e.$container:Rr(e.$container)),rm(t,e,new Map)}function rm(t,e,r){function n(i,s){let a;return Dr(i,sr)||(a=rm(s,s,r)),r.set(t,a),a}if(r.has(t))return r.get(t);r.set(t,void 0);for(let i of nr(e)){if(sr(i)&&i.feature.toLowerCase()==="name")return r.set(t,i),i;if(or(i)&&nt(i.rule.ref))return n(i,i.rule.ref);if(tc(i)&&i.typeRef?.ref)return n(i,i.typeRef.ref)}}function nm(t){let e=t.$container;if(fn(e)){let r=e.elements,n=r.indexOf(t);for(let i=n-1;i>=0;i--){let s=r[i];if(Ur(s))return s;{let a=nr(r[i]).find(Ur);if(a)return a}}}if(sa(e))return nm(e)}function Dv(t,e){return t==="?"||t==="*"||fn(e)&&!!e.guardCondition}function Mv(t){return t==="*"||t==="+"}function Fv(t){return t==="+="}function ha(t){return im(t,new Set)}function im(t,e){if(e.has(t))return!0;e.add(t);for(let r of nr(t))if(or(r)){if(!r.rule.ref||nt(r.rule.ref)&&!im(r.rule.ref,e)||dn(r.rule.ref))return!1}else{if(sr(r))return!1;if(Ur(r))return!1}return!!t.definition}function Gv(t){return Yu(t.type,new Set)}function Yu(t,e){if(e.has(t))return!0;if(e.add(t),xu(t))return!1;if(Iu(t))return!1;if(Lu(t))return t.types.every(r=>Yu(r,e));if(tc(t)){if(t.primitiveType!==void 0)return!0;if(t.stringType!==void 0)return!0;if(t.typeRef!==void 0){let r=t.typeRef.ref;return nc(r)?Yu(r.type,e):!1}else return!1}else return!1}function fc(t){if(!kt(t)){if(t.inferredType)return t.inferredType.name;if(t.dataType)return t.dataType;if(t.returnType){let e=t.returnType.ref;if(e)return e.name}}}function hn(t){if(Gr(t))return nt(t)&&ha(t)?t.name:fc(t)??t.name;if(ku(t)||nc(t)||bu(t))return t.name;if(Ur(t)){let e=sm(t);if(e)return e}else if(aa(t))return t.name;throw new Error("Cannot get name of Unknown Type")}function sm(t){if(t.inferredType)return t.inferredType.name;if(t.type?.ref)return hn(t.type.ref)}function Uv(t){return kt(t)?t.type?.name??"string":nt(t)&&ha(t)?t.name:fc(t)??t.name}function nf(t){return kt(t)?t.type?.name??"string":fc(t)??t.name}function Li(t){let e={s:!1,i:!1,u:!1},r=Di(t.definition,e),n=Object.entries(e).filter(([,i])=>i).map(([i])=>i).join("");return new RegExp(r,n)}var sf=/[\s\S]/.source;function Di(t,e){if(Pu(t))return qv(t);if(Ou(t))return zv(t);if(Eu(t))return Wv(t);if(rc(t)){let r=t.rule.ref;if(!r)throw new Error("Missing rule reference.");return zr(Di(r.definition),{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized})}else{if(Nu(t))return Bv(t);if(Du(t))return jv(t);if(_u(t)){let r=t.regex.lastIndexOf("/"),n=t.regex.substring(1,r),i=t.regex.substring(r+1);return e&&(e.i=i.includes("i"),e.s=i.includes("s"),e.u=i.includes("u")),zr(n,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1})}else{if(Mu(t))return zr(sf,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized});throw new Error(`Invalid terminal element: ${t?.$type}, ${t?.$cstNode?.text}`)}}}function qv(t){return zr(t.elements.map(e=>Di(e)).join("|"),{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1})}function zv(t){return zr(t.elements.map(e=>Di(e)).join(""),{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1})}function jv(t){return zr(`${sf}*?${Di(t.terminal)}`,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized})}function Bv(t){return zr(`(?!${Di(t.terminal)})${sf}*?`,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized})}function Wv(t){return t.right?zr(`[${Hu(t.left)}-${Hu(t.right)}]`,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1}):zr(Hu(t.left),{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1})}function Hu(t){return pn(t.value)}function zr(t,e){return(e.parenthesized||e.lookahead||e.wrap!==!1)&&(t=`(${e.lookahead??(e.parenthesized?"":"?:")}${t})`),e.cardinality?`${t}${e.cardinality}`:t}function af(t){let e=[],r=t.Grammar;for(let n of r.rules)kt(n)&&Ju(n)&&Vu(Li(n))&&e.push(n.name);return{multilineCommentRules:e,nameRegexp:sc}}function Mi(t){console&&console.error&&console.error(`Error: ${t}`)}function ma(t){console&&console.warn&&console.warn(`Warning: ${t}`)}function ga(t){let e=new Date().getTime(),r=t();return{time:new Date().getTime()-e,value:r}}function ya(t){function e(){}e.prototype=t;let r=new e;function n(){return typeof r.bar}return n(),n(),t;(0,eval)(t)}function Vv(t){return Kv(t)?t.LABEL:t.name}function Kv(t){return mt(t.LABEL)&&t.LABEL!==""}var jt=class{get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){this._definition=e}accept(e){e.visit(this),D(this.definition,r=>{r.accept(e)})}},pe=class extends jt{constructor(e){super([]),this.idx=1,dt(this,Gt(e,r=>r!==void 0))}set definition(e){}get definition(){return this.referencedRule!==void 0?this.referencedRule.definition:[]}accept(e){e.visit(this)}},Nt=class extends jt{constructor(e){super(e.definition),this.orgText="",dt(this,Gt(e,r=>r!==void 0))}},Ee=class extends jt{constructor(e){super(e.definition),this.ignoreAmbiguities=!1,dt(this,Gt(e,r=>r!==void 0))}},he=class extends jt{constructor(e){super(e.definition),this.idx=1,dt(this,Gt(e,r=>r!==void 0))}},Ae=class extends jt{constructor(e){super(e.definition),this.idx=1,dt(this,Gt(e,r=>r!==void 0))}},$e=class extends jt{constructor(e){super(e.definition),this.idx=1,dt(this,Gt(e,r=>r!==void 0))}},se=class extends jt{constructor(e){super(e.definition),this.idx=1,dt(this,Gt(e,r=>r!==void 0))}},Re=class extends jt{constructor(e){super(e.definition),this.idx=1,dt(this,Gt(e,r=>r!==void 0))}},xe=class extends jt{get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){super(e.definition),this.idx=1,this.ignoreAmbiguities=!1,this.hasPredicates=!1,dt(this,Gt(e,r=>r!==void 0))}},te=class{constructor(e){this.idx=1,dt(this,Gt(e,r=>r!==void 0))}accept(e){e.visit(this)}};function pc(t){return I(t,Fi)}function Fi(t){function e(r){return I(r,Fi)}if(t instanceof pe){let r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return mt(t.label)&&(r.label=t.label),r}else{if(t instanceof Ee)return{type:"Alternative",definition:e(t.definition)};if(t instanceof he)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof Ae)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof $e)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:Fi(new te({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof Re)return{type:"RepetitionWithSeparator",idx:t.idx,separator:Fi(new te({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof se)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof xe)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof te){let r={type:"Terminal",name:t.terminalType.name,label:Vv(t.terminalType),idx:t.idx};mt(t.label)&&(r.terminalLabel=t.label);let n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(r.pattern=tr(n)?n.source:n),r}else{if(t instanceof Nt)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}var Ct=class{visit(e){let r=e;switch(r.constructor){case pe:return this.visitNonTerminal(r);case Ee:return this.visitAlternative(r);case he:return this.visitOption(r);case Ae:return this.visitRepetitionMandatory(r);case $e:return this.visitRepetitionMandatoryWithSeparator(r);case Re:return this.visitRepetitionWithSeparator(r);case se:return this.visitRepetition(r);case xe:return this.visitAlternation(r);case te:return this.visitTerminal(r);case Nt:return this.visitRule(r);default:throw Error("non exhaustive match")}}visitNonTerminal(e){}visitAlternative(e){}visitOption(e){}visitRepetition(e){}visitRepetitionMandatory(e){}visitRepetitionMandatoryWithSeparator(e){}visitRepetitionWithSeparator(e){}visitAlternation(e){}visitTerminal(e){}visitRule(e){}};function of(t){return t instanceof Ee||t instanceof he||t instanceof se||t instanceof Ae||t instanceof $e||t instanceof Re||t instanceof te||t instanceof Nt}function Xn(t,e=[]){return t instanceof he||t instanceof se||t instanceof Re?!0:t instanceof xe?Mo(t.definition,n=>Xn(n,e)):t instanceof pe&&Pe(e,t)?!1:t instanceof jt?(t instanceof pe&&e.push(t),At(t.definition,n=>Xn(n,e))):!1}function cf(t){return t instanceof xe}function Ot(t){if(t instanceof pe)return"SUBRULE";if(t instanceof he)return"OPTION";if(t instanceof xe)return"OR";if(t instanceof Ae)return"AT_LEAST_ONE";if(t instanceof $e)return"AT_LEAST_ONE_SEP";if(t instanceof Re)return"MANY_SEP";if(t instanceof se)return"MANY";if(t instanceof te)return"CONSUME";throw Error("non exhaustive match")}var jr=class{walk(e,r=[]){D(e.definition,(n,i)=>{let s=Ke(e.definition,i+1);if(n instanceof pe)this.walkProdRef(n,s,r);else if(n instanceof te)this.walkTerminal(n,s,r);else if(n instanceof Ee)this.walkFlat(n,s,r);else if(n instanceof he)this.walkOption(n,s,r);else if(n instanceof Ae)this.walkAtLeastOne(n,s,r);else if(n instanceof $e)this.walkAtLeastOneSep(n,s,r);else if(n instanceof Re)this.walkManySep(n,s,r);else if(n instanceof se)this.walkMany(n,s,r);else if(n instanceof xe)this.walkOr(n,s,r);else throw Error("non exhaustive match")})}walkTerminal(e,r,n){}walkProdRef(e,r,n){}walkFlat(e,r,n){let i=r.concat(n);this.walk(e,i)}walkOption(e,r,n){let i=r.concat(n);this.walk(e,i)}walkAtLeastOne(e,r,n){let i=[new he({definition:e.definition})].concat(r,n);this.walk(e,i)}walkAtLeastOneSep(e,r,n){let i=am(e,r,n);this.walk(e,i)}walkMany(e,r,n){let i=[new he({definition:e.definition})].concat(r,n);this.walk(e,i)}walkManySep(e,r,n){let i=am(e,r,n);this.walk(e,i)}walkOr(e,r,n){let i=r.concat(n);D(e.definition,s=>{let a=new Ee({definition:[s]});this.walk(a,i)})}};function am(t,e,r){return[new he({definition:[new te({terminalType:t.separator})].concat(t.definition)})].concat(e,r)}function Jn(t){if(t instanceof pe)return Jn(t.referencedRule);if(t instanceof te)return Xv(t);if(of(t))return Hv(t);if(cf(t))return Yv(t);throw Error("non exhaustive match")}function Hv(t){let e=[],r=t.definition,n=0,i=r.length>n,s,a=!0;for(;i&&a;)s=r[n],a=Xn(s),e=e.concat(Jn(s)),n=n+1,i=r.length>n;return Hs(e)}function Yv(t){let e=I(t.definition,r=>Jn(r));return Hs(Ve(e))}function Xv(t){return[t.terminalType]}var hc="_~IN~_";var lf=class extends jr{constructor(e){super(),this.topProd=e,this.follows={}}startWalking(){return this.walk(this.topProd),this.follows}walkTerminal(e,r,n){}walkProdRef(e,r,n){let i=Jv(e.referencedRule,e.idx)+this.topProd.name,s=r.concat(n),a=new Ee({definition:s}),o=Jn(a);this.follows[i]=o}};function om(t){let e={};return D(t,r=>{let n=new lf(r).startWalking();dt(e,n)}),e}function Jv(t,e){return t.name+e+hc}var mc={},Qv=new Hn;function Gi(t){let e=t.toString();if(mc.hasOwnProperty(e))return mc[e];{let r=Qv.pattern(e);return mc[e]=r,r}}function cm(){mc={}}var um="Complement Sets are not supported for first char optimization",Ta=`Unable to use "first char" lexer optimizations: -`;function fm(t,e=!1){try{let r=Gi(t);return uf(r.value,{},r.flags.ignoreCase)}catch(r){if(r.message===um)e&&ma(`${Ta} Unable to optimize: < ${t.toString()} > - Complement Sets cannot be automatically optimized. - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{let n="";e&&(n=` - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),Mi(`${Ta} - Failed parsing: < ${t.toString()} > - Using the @chevrotain/regexp-to-ast library - Please open an issue at: https://github.com/chevrotain/chevrotain/issues`+n)}}return[]}function uf(t,e,r){switch(t.type){case"Disjunction":for(let i=0;i{if(typeof c=="number")gc(c,e,r);else{let l=c;if(r===!0)for(let u=l.from;u<=l.to;u++)gc(u,e,r);else{for(let u=l.from;u<=l.to&&u=Ui){let u=l.from>=Ui?l.from:Ui,p=l.to,h=vr(u),g=vr(p);for(let C=h;C<=g;C++)e[C]=C}}}});break;case"Group":uf(a.value,e,r);break;default:throw Error("Non Exhaustive Match")}let o=a.quantifier!==void 0&&a.quantifier.atLeast===0;if(a.type==="Group"&&ff(a)===!1||a.type!=="Group"&&o===!1)break}break;default:throw Error("non exhaustive match!")}return Ce(e)}function gc(t,e,r){let n=vr(t);e[n]=n,r===!0&&Zv(t,e)}function Zv(t,e){let r=String.fromCharCode(t),n=r.toUpperCase();if(n!==r){let i=vr(n.charCodeAt(0));e[i]=i}else{let i=r.toLowerCase();if(i!==r){let s=vr(i.charCodeAt(0));e[s]=s}}}function lm(t,e){return Lr(t.value,r=>{if(typeof r=="number")return Pe(e,r);{let n=r;return Lr(e,i=>n.from<=i&&i<=n.to)!==void 0}})}function ff(t){let e=t.quantifier;return e&&e.atLeast===0?!0:t.value?Ze(t.value)?At(t.value,ff):ff(t.value):!1}var df=class extends xr{constructor(e){super(),this.targetCharCodes=e,this.found=!1}visitChildren(e){if(this.found!==!0){switch(e.type){case"Lookahead":this.visitLookahead(e);return;case"NegativeLookahead":this.visitNegativeLookahead(e);return;case"Lookbehind":this.visitLookbehind(e);return;case"NegativeLookbehind":this.visitNegativeLookbehind(e);return}super.visitChildren(e)}}visitCharacter(e){Pe(this.targetCharCodes,e.value)&&(this.found=!0)}visitSet(e){e.complement?lm(e,this.targetCharCodes)===void 0&&(this.found=!0):lm(e,this.targetCharCodes)!==void 0&&(this.found=!0)}};function yc(t,e){if(e instanceof RegExp){let r=Gi(e),n=new df(t);return n.visit(r),n.found}else return Lr(e,r=>Pe(t,r.charCodeAt(0)))!==void 0}var Qn="PATTERN",qi="defaultMode",Tc="modes";function pm(t,e){e=Ks(e,{debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` -`],tracer:(b,E)=>E()});let r=e.tracer;r("initCharCodeToOptimizedIndexMap",()=>{TE()});let n;r("Reject Lexer.NA",()=>{n=In(t,b=>b[Qn]===He.NA)});let i=!1,s;r("Transform Patterns",()=>{i=!1,s=I(n,b=>{let E=b[Qn];if(tr(E)){let H=E.source;return H.length===1&&H!=="^"&&H!=="$"&&H!=="."&&!E.ignoreCase?H:H.length===2&&H[0]==="\\"&&!Pe(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],H[1])?H[1]:dm(E)}else{if(mr(E))return i=!0,{exec:E};if(typeof E=="object")return i=!0,E;if(typeof E=="string"){if(E.length===1)return E;{let H=E.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),F=new RegExp(H);return dm(F)}}else throw Error("non exhaustive match")}})});let a,o,c,l,u;r("misc mapping",()=>{a=I(n,b=>b.tokenTypeIdx),o=I(n,b=>{let E=b.GROUP;if(E!==He.SKIPPED){if(mt(E))return E;if($t(E))return!1;throw Error("non exhaustive match")}}),c=I(n,b=>{let E=b.LONGER_ALT;if(E)return Ze(E)?I(E,F=>hu(n,F)):[hu(n,E)]}),l=I(n,b=>b.PUSH_MODE),u=I(n,b=>q(b,"POP_MODE"))});let p;r("Line Terminator Handling",()=>{let b=vm(e.lineTerminatorCharacters);p=I(n,E=>!1),e.positionTracking!=="onlyOffset"&&(p=I(n,E=>q(E,"LINE_BREAKS")?!!E.LINE_BREAKS:xm(E,b)===!1&&yc(b,E.PATTERN)))});let h,g,C,k;r("Misc Mapping #2",()=>{h=I(n,Tm),g=I(s,gE),C=Ue(n,(b,E)=>{let H=E.GROUP;return mt(H)&&H!==He.SKIPPED&&(b[H]=[]),b},{}),k=I(s,(b,E)=>({pattern:s[E],longerAlt:c[E],canLineTerminator:p[E],isCustom:h[E],short:g[E],group:o[E],push:l[E],pop:u[E],tokenTypeIdx:a[E],tokenType:n[E]}))});let G=!0,M=[];return e.safeMode||r("First Char Optimization",()=>{M=Ue(n,(b,E,H)=>{if(typeof E.PATTERN=="string"){let F=E.PATTERN.charCodeAt(0),ye=vr(F);pf(b,ye,k[H])}else if(Ze(E.START_CHARS_HINT)){let F;D(E.START_CHARS_HINT,ye=>{let dr=typeof ye=="string"?ye.charCodeAt(0):ye,Je=vr(dr);F!==Je&&(F=Je,pf(b,Je,k[H]))})}else if(tr(E.PATTERN))if(E.PATTERN.unicode)G=!1,e.ensureOptimizations&&Mi(`${Ta} Unable to analyze < ${E.PATTERN.toString()} > pattern. - The regexp unicode flag is not currently supported by the regexp-to-ast library. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{let F=fm(E.PATTERN,e.ensureOptimizations);Z(F)&&(G=!1),D(F,ye=>{pf(b,ye,k[H])})}else e.ensureOptimizations&&Mi(`${Ta} TokenType: <${E.name}> is using a custom token pattern without providing parameter. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),G=!1;return b},[])}),{emptyGroups:C,patternIdxToConfig:k,charCodeToPatternIdxToConfig:M,hasCustom:i,canBeOptimized:G}}function hm(t,e){let r=[],n=tE(t);r=r.concat(n.errors);let i=rE(n.valid),s=i.valid;return r=r.concat(i.errors),r=r.concat(eE(s)),r=r.concat(uE(s)),r=r.concat(fE(s,e)),r=r.concat(dE(s)),r}function eE(t){let e=[],r=ct(t,n=>tr(n[Qn]));return e=e.concat(iE(r)),e=e.concat(oE(r)),e=e.concat(cE(r)),e=e.concat(lE(r)),e=e.concat(sE(r)),e}function tE(t){let e=ct(t,i=>!q(i,Qn)),r=I(e,i=>({message:"Token Type: ->"+i.name+"<- missing static 'PATTERN' property",type:Le.MISSING_PATTERN,tokenTypes:[i]})),n=wn(t,e);return{errors:r,valid:n}}function rE(t){let e=ct(t,i=>{let s=i[Qn];return!tr(s)&&!mr(s)&&!q(s,"exec")&&!mt(s)}),r=I(e,i=>({message:"Token Type: ->"+i.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:Le.INVALID_PATTERN,tokenTypes:[i]})),n=wn(t,e);return{errors:r,valid:n}}var nE=/[^\\][$]/;function iE(t){class e extends xr{constructor(){super(...arguments),this.found=!1}visitEndAnchor(s){this.found=!0}}let r=ct(t,i=>{let s=i.PATTERN;try{let a=Gi(s),o=new e;return o.visit(a),o.found}catch(a){return nE.test(s.source)}});return I(r,i=>({message:`Unexpected RegExp Anchor Error: - Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain end of input anchor '$' - See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Le.EOI_ANCHOR_FOUND,tokenTypes:[i]}))}function sE(t){let e=ct(t,n=>n.PATTERN.test(""));return I(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' must not match an empty string",type:Le.EMPTY_MATCH_PATTERN,tokenTypes:[n]}))}var aE=/[^\\[][\^]|^\^/;function oE(t){class e extends xr{constructor(){super(...arguments),this.found=!1}visitStartAnchor(s){this.found=!0}}let r=ct(t,i=>{let s=i.PATTERN;try{let a=Gi(s),o=new e;return o.visit(a),o.found}catch(a){return aE.test(s.source)}});return I(r,i=>({message:`Unexpected RegExp Anchor Error: - Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain start of input anchor '^' - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Le.SOI_ANCHOR_FOUND,tokenTypes:[i]}))}function cE(t){let e=ct(t,n=>{let i=n[Qn];return i instanceof RegExp&&(i.multiline||i.global)});return I(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:Le.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[n]}))}function lE(t){let e=[],r=I(t,s=>Ue(t,(a,o)=>(s.PATTERN.source===o.PATTERN.source&&!Pe(e,o)&&o.PATTERN!==He.NA&&(e.push(o),a.push(o)),a),[]));r=Or(r);let n=ct(r,s=>s.length>1);return I(n,s=>{let a=I(s,c=>c.name);return{message:`The same RegExp pattern ->${pt(s).PATTERN}<-has been used in all of the following Token Types: ${a.join(", ")} <-`,type:Le.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}})}function uE(t){let e=ct(t,n=>{if(!q(n,"GROUP"))return!1;let i=n.GROUP;return i!==He.SKIPPED&&i!==He.NA&&!mt(i)});return I(e,n=>({message:"Token Type: ->"+n.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:Le.INVALID_GROUP_TYPE_FOUND,tokenTypes:[n]}))}function fE(t,e){let r=ct(t,i=>i.PUSH_MODE!==void 0&&!Pe(e,i.PUSH_MODE));return I(r,i=>({message:`Token Type: ->${i.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${i.PUSH_MODE}<-which does not exist`,type:Le.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[i]}))}function dE(t){let e=[],r=Ue(t,(n,i,s)=>{let a=i.PATTERN;return a===He.NA||(mt(a)?n.push({str:a,idx:s,tokenType:i}):tr(a)&&hE(a)&&n.push({str:a.source,idx:s,tokenType:i})),n},[]);return D(t,(n,i)=>{D(r,({str:s,idx:a,tokenType:o})=>{if(i${o.name}<- can never be matched. -Because it appears AFTER the Token Type ->${n.name}<-in the lexer's definition. -See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:Le.UNREACHABLE_PATTERN,tokenTypes:[n,o]})}})}),e}function pE(t,e){if(tr(e)){if(mE(e))return!1;let r=e.exec(t);return r!==null&&r.index===0}else{if(mr(e))return e(t,0,[],{});if(q(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function hE(t){return Lr([".","\\","[","]","|","^","$","(",")","?","*","+","{"],r=>t.source.indexOf(r)!==-1)===void 0}function mE(t){return/(\(\?=)|(\(\?!)|(\(\?<=)|(\(\? property in its definition -`,type:Le.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),q(t,Tc)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+Tc+`> property in its definition -`,type:Le.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),q(t,Tc)&&q(t,qi)&&!q(t.modes,t.defaultMode)&&n.push({message:`A MultiMode Lexer cannot be initialized with a ${qi}: <${t.defaultMode}>which does not exist -`,type:Le.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),q(t,Tc)&&D(t.modes,(i,s)=>{D(i,(a,o)=>{if($t(a))n.push({message:`A Lexer cannot be initialized using an undefined Token Type. Mode:<${s}> at index: <${o}> -`,type:Le.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if(q(a,"LONGER_ALT")){let c=Ze(a.LONGER_ALT)?a.LONGER_ALT:[a.LONGER_ALT];D(c,l=>{!$t(l)&&!Pe(i,l)&&n.push({message:`A MultiMode Lexer cannot be initialized with a longer_alt <${l.name}> on token <${a.name}> outside of mode <${s}> -`,type:Le.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),n}function gm(t,e,r){let n=[],i=!1,s=Or(Ve(Ce(t.modes))),a=In(s,c=>c[Qn]===He.NA),o=vm(r);return e&&D(a,c=>{let l=xm(c,o);if(l!==!1){let p={message:yE(c,l),type:l.issue,tokenType:c};n.push(p)}else q(c,"LINE_BREAKS")?c.LINE_BREAKS===!0&&(i=!0):yc(o,c.PATTERN)&&(i=!0)}),e&&!i&&n.push({message:`Warning: No LINE_BREAKS Found. - This Lexer has been defined to track line and column information, - But none of the Token Types can be identified as matching a line terminator. - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS - for details.`,type:Le.NO_LINE_BREAKS_FLAGS}),n}function ym(t){let e={},r=Pr(t);return D(r,n=>{let i=t[n];if(Ze(i))e[n]=[];else throw Error("non exhaustive match")}),e}function Tm(t){let e=t.PATTERN;if(tr(e))return!1;if(mr(e))return!0;if(q(e,"exec"))return!0;if(mt(e))return!1;throw Error("non exhaustive match")}function gE(t){return mt(t)&&t.length===1?t.charCodeAt(0):!1}var Rm={test:function(t){let e=t.length;for(let r=this.lastIndex;r Token Type - Root cause: ${e.errMsg}. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR`;if(e.issue===Le.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. - The problem is in the <${t.name}> Token Type - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK`;throw Error("non exhaustive match")}function vm(t){return I(t,r=>mt(r)?r.charCodeAt(0):r)}function pf(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}var Ui=256,Rc=[];function vr(t){return t255?255+~~(t/255):t}}function Br(t,e){let r=t.tokenTypeIdx;return r===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[r]===!0}function zi(t,e){return t.tokenTypeIdx===e.tokenTypeIdx}var Em=1,$m={};function Wr(t){let e=RE(t);xE(e),EE(e),vE(e),D(e,r=>{r.isParent=r.categoryMatches.length>0})}function RE(t){let e=Ne(t),r=t,n=!0;for(;n;){r=Or(Ve(I(r,s=>s.CATEGORIES)));let i=wn(r,e);e=e.concat(i),Z(i)?n=!1:r=i}return e}function xE(t){D(t,e=>{hf(e)||($m[Em]=e,e.tokenTypeIdx=Em++),Am(e)&&!Ze(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Am(e)||(e.CATEGORIES=[]),AE(e)||(e.categoryMatches=[]),$E(e)||(e.categoryMatchesMap={})})}function vE(t){D(t,e=>{e.categoryMatches=[],D(e.categoryMatchesMap,(r,n)=>{e.categoryMatches.push($m[n].tokenTypeIdx)})})}function EE(t){D(t,e=>{Sm([],e)})}function Sm(t,e){D(t,r=>{e.categoryMatchesMap[r.tokenTypeIdx]=!0}),D(e.CATEGORIES,r=>{let n=t.concat(e);Pe(n,r)||Sm(n,r)})}function hf(t){return q(t,"tokenTypeIdx")}function Am(t){return q(t,"CATEGORIES")}function AE(t){return q(t,"categoryMatches")}function $E(t){return q(t,"categoryMatchesMap")}function km(t){return q(t,"tokenTypeIdx")}var ji={buildUnableToPopLexerModeMessage(t){return`Unable to pop Lexer Mode after encountering Token ->${t.image}<- The Mode Stack is empty`},buildUnexpectedCharactersMessage(t,e,r,n,i,s){return`unexpected character: ->${t.charAt(e)}<- at offset: ${e}, skipped ${r} characters.`}};var Le=(function(t){return t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",t[t.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE",t})(Le||{}),Ra={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` -`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:ji,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(Ra);var He=(()=>{class t{constructor(r,n=Ra){if(this.lexerDefinition=r,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=(s,a)=>{if(this.traceInitPerf===!0){this.traceInitIndent++;let o=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${s}>`);let{time:c,value:l}=ga(a),u=c>10?console.warn:console.log;return this.traceInitIndent time: ${c}ms`),this.traceInitIndent--,l}else return a()},typeof n=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. -a boolean 2nd argument is no longer supported`);this.config=dt({},Ra,n);let i=this.config.traceInitPerf;i===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof i=="number"&&(this.traceInitMaxIdent=i,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",()=>{let s,a=!0;this.TRACE_INIT("Lexer Config handling",()=>{if(this.config.lineTerminatorsPattern===Ra.lineTerminatorsPattern)this.config.lineTerminatorsPattern=Rm;else if(this.config.lineTerminatorCharacters===Ra.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(n.safeMode&&n.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');this.trackStartLines=/full|onlyStart/i.test(this.config.positionTracking),this.trackEndLines=/full/i.test(this.config.positionTracking),Ze(r)?s={modes:{defaultMode:Ne(r)},defaultMode:qi}:(a=!1,s=Ne(r))}),this.config.skipValidations===!1&&(this.TRACE_INIT("performRuntimeChecks",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(mm(s,this.trackStartLines,this.config.lineTerminatorCharacters))}),this.TRACE_INIT("performWarningRuntimeChecks",()=>{this.lexerDefinitionWarning=this.lexerDefinitionWarning.concat(gm(s,this.trackStartLines,this.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},D(s.modes,(c,l)=>{s.modes[l]=In(c,u=>$t(u))});let o=Pr(s.modes);if(D(s.modes,(c,l)=>{this.TRACE_INIT(`Mode: <${l}> processing`,()=>{if(this.modes.push(l),this.config.skipValidations===!1&&this.TRACE_INIT("validatePatterns",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(hm(c,o))}),Z(this.lexerDefinitionErrors)){Wr(c);let u;this.TRACE_INIT("analyzeTokenTypes",()=>{u=pm(c,{lineTerminatorCharacters:this.config.lineTerminatorCharacters,positionTracking:n.positionTracking,ensureOptimizations:n.ensureOptimizations,safeMode:n.safeMode,tracer:this.TRACE_INIT})}),this.patternIdxToConfig[l]=u.patternIdxToConfig,this.charCodeToPatternIdxToConfig[l]=u.charCodeToPatternIdxToConfig,this.emptyGroups=dt({},this.emptyGroups,u.emptyGroups),this.hasCustom=u.hasCustom||this.hasCustom,this.canModeBeOptimized[l]=u.canBeOptimized}})}),this.defaultMode=s.defaultMode,!Z(this.lexerDefinitionErrors)&&!this.config.deferDefinitionErrorsHandling){let l=I(this.lexerDefinitionErrors,u=>u.message).join(`----------------------- -`);throw new Error(`Errors detected in definition of Lexer: -`+l)}D(this.lexerDefinitionWarning,c=>{ma(c.message)}),this.TRACE_INIT("Choosing sub-methods implementations",()=>{if(a&&(this.handleModes=et),this.trackStartLines===!1&&(this.computeNewColumn=Gh),this.trackEndLines===!1&&(this.updateTokenEndLineColumnLocation=et),/full/i.test(this.config.positionTracking))this.createTokenInstance=this.createFullToken;else if(/onlyStart/i.test(this.config.positionTracking))this.createTokenInstance=this.createStartOnlyToken;else if(/onlyOffset/i.test(this.config.positionTracking))this.createTokenInstance=this.createOffsetOnlyToken;else throw Error(`Invalid config option: "${this.config.positionTracking}"`);this.hasCustom?(this.addToken=this.addTokenUsingPush,this.handlePayload=this.handlePayloadWithCustom):(this.addToken=this.addTokenUsingMemberAccess,this.handlePayload=this.handlePayloadNoCustom)}),this.TRACE_INIT("Failed Optimization Warnings",()=>{let c=Ue(this.canModeBeOptimized,(l,u,p)=>(u===!1&&l.push(p),l),[]);if(n.ensureOptimizations&&!Z(c))throw Error(`Lexer Modes: < ${c.join(", ")} > cannot be optimized. - Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. - Or inspect the console log for details on how to resolve these issues.`)}),this.TRACE_INIT("clearRegExpParserCache",()=>{cm()}),this.TRACE_INIT("toFastProperties",()=>{ya(this)})})}tokenize(r,n=this.defaultMode){if(!Z(this.lexerDefinitionErrors)){let s=I(this.lexerDefinitionErrors,a=>a.message).join(`----------------------- -`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: -`+s)}return this.tokenizeInternal(r,n)}tokenizeInternal(r,n){let i,s,a,o,c,l,u,p,h,g,C,k,G,M,b,E=r,H=E.length,F=0,ye=0,dr=this.hasCustom?0:Math.floor(r.length/10),Je=new Array(dr),Qt=[],Kt=this.trackStartLines?1:void 0,$=this.trackStartLines?1:void 0,y=ym(this.emptyGroups),L=this.trackStartLines,O=this.config.lineTerminatorsPattern,T=0,x=[],A=[],_=[],U=[];Object.freeze(U);let N=!1,Y=ve=>{if(_.length===1&&ve.tokenType.PUSH_MODE===void 0){let We=this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(ve);Qt.push({offset:ve.startOffset,line:ve.startLine,column:ve.startColumn,length:ve.image.length,message:We})}else{_.pop();let We=gr(_);x=this.patternIdxToConfig[We],A=this.charCodeToPatternIdxToConfig[We],T=x.length;let js=this.canModeBeOptimized[We]&&this.config.safeMode===!1;A&&js?N=!0:N=!1}};function Q(ve){_.push(ve),A=this.charCodeToPatternIdxToConfig[ve],x=this.patternIdxToConfig[ve],T=x.length,T=x.length;let We=this.canModeBeOptimized[ve]&&this.config.safeMode===!1;A&&We?N=!0:N=!1}Q.call(this,n);let de,ue=this.config.recoveryEnabled;for(;Fl.length){l=o,h=o.length,u=p,de=Zt;break}}}break}}if(h!==-1){if(g=de.group,g!==void 0&&(l=l!==null?l:r.substring(F,F+h),C=de.tokenTypeIdx,k=this.createTokenInstance(l,F,C,de.tokenType,Kt,$,h),this.handlePayload(k,u),g===!1?ye=this.addToken(Je,ye,k):y[g].push(k)),L===!0&&de.canLineTerminator===!0){let ot=0,_t,pr;O.lastIndex=0;do l=l!==null?l:r.substring(F,F+h),_t=O.test(l),_t===!0&&(pr=O.lastIndex-1,ot++);while(_t===!0);ot!==0?(Kt=Kt+ot,$=h-pr,this.updateTokenEndLineColumnLocation(k,g,pr,ot,Kt,$,h)):$=this.computeNewColumn($,h)}else $=this.computeNewColumn($,h);F=F+h,this.handleModes(de,Y,Q,k)}else{let ot=F,_t=Kt,pr=$,Zt=ue===!1;for(;Zt===!1&&F ${Vr(t)} <--`:`token of type --> ${t.name} <--`} but found --> '${e.image}' <--`},buildNotAllInputParsedMessage({firstRedundant:t,ruleName:e}){return"Redundant input, expecting EOF but found: "+t.image},buildNoViableAltMessage({expectedPathsPerAlt:t,actual:e,previous:r,customUserDescription:n,ruleName:i}){let s="Expecting: ",o=` -but found: '`+pt(e).image+"'";if(n)return s+n+o;{let c=Ue(t,(h,g)=>h.concat(g),[]),l=I(c,h=>`[${I(h,g=>Vr(g)).join(", ")}]`),p=`one of these possible Token sequences: -${I(l,(h,g)=>` ${g+1}. ${h}`).join(` -`)}`;return s+p+o}},buildEarlyExitMessage({expectedIterationPaths:t,actual:e,customUserDescription:r,ruleName:n}){let i="Expecting: ",a=` -but found: '`+pt(e).image+"'";if(r)return i+r+a;{let c=`expecting at least one iteration which starts with one of these possible Token sequences:: - <${I(t,l=>`[${I(l,u=>Vr(u)).join(",")}]`).join(" ,")}>`;return i+c+a}}};Object.freeze(Hr);var Lm={buildRuleNotFoundError(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- -inside top level rule: ->`+t.name+"<-"}},cr={buildDuplicateFoundError(t,e){function r(u){return u instanceof te?u.terminalType.name:u instanceof pe?u.nonTerminalName:""}let n=t.name,i=pt(e),s=i.idx,a=Ot(i),o=r(i),c=s>0,l=`->${a}${c?s:""}<- ${o?`with argument: ->${o}<-`:""} - appears more than once (${e.length} times) in the top level rule: ->${n}<-. - For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES - `;return l=l.replace(/[ \t]+/g," "),l=l.replace(/\s\s+/g,` -`),l},buildNamespaceConflictError(t){return`Namespace conflict found in grammar. -The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${t.name}>. -To resolve this make sure each Terminal and Non-Terminal names are unique -This is easy to accomplish by using the convention that Terminal names start with an uppercase letter -and Non-Terminal names start with a lower case letter.`},buildAlternationPrefixAmbiguityError(t){let e=I(t.prefixPath,i=>Vr(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx;return`Ambiguous alternatives: <${t.ambiguityIndices.join(" ,")}> due to common lookahead prefix -in inside <${t.topLevelRule.name}> Rule, -<${e}> may appears as a prefix path in all these alternatives. -See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX -For Further details.`},buildAlternationAmbiguityError(t){let e=t.alternation.idx===0?"":t.alternation.idx,r=t.prefixPath.length===0,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(" ,")}> in inside <${t.topLevelRule.name}> Rule, -`;if(r)n+=`These alternatives are all empty (match no tokens), making them indistinguishable. -Only the last alternative may be empty. -`;else{let i=I(t.prefixPath,s=>Vr(s)).join(", ");n+=`<${i}> may appears as a prefix path in all these alternatives. -`}return n+=`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,n},buildEmptyRepetitionError(t){let e=Ot(t.repetition);return t.repetition.idx!==0&&(e+=t.repetition.idx),`The repetition <${e}> within Rule <${t.topLevelRule.name}> can never consume any tokens. -This could lead to an infinite loop.`},buildTokenNameError(t){return"deprecated"},buildEmptyAlternationError(t){return`Ambiguous empty alternative: <${t.emptyChoiceIdx+1}> in inside <${t.topLevelRule.name}> Rule. -Only the last alternative may be an empty alternative.`},buildTooManyAlternativesError(t){return`An Alternation cannot have more than 256 alternatives: - inside <${t.topLevelRule.name}> Rule. - has ${t.alternation.definition.length+1} alternatives.`},buildLeftRecursionError(t){let e=t.topLevelRule.name,r=I(t.leftRecursionPath,s=>s.name),n=`${e} --> ${r.concat([e]).join(" --> ")}`;return`Left Recursion found in grammar. -rule: <${e}> can be invoked from itself (directly or indirectly) -without consuming any Tokens. The grammar path that causes this is: - ${n} - To fix this refactor your grammar to remove the left recursion. -see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError(t){return"deprecated"},buildDuplicateRuleNameError(t){let e;return t.topLevelRule instanceof Nt?e=t.topLevelRule.name:e=t.topLevelRule,`Duplicate definition, rule: ->${e}<- is already defined in the grammar: ->${t.grammarName}<-`}};function Dm(t,e){let r=new gf(t,e);return r.resolveRefs(),r.errors}var gf=class extends Ct{constructor(e,r){super(),this.nameToTopRule=e,this.errMsgProvider=r,this.errors=[]}resolveRefs(){D(Ce(this.nameToTopRule),e=>{this.currTopLevel=e,e.accept(this)})}visitNonTerminal(e){let r=this.nameToTopRule[e.nonTerminalName];if(r)e.referencedRule=r;else{let n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:n,type:it.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}};var yf=class extends jr{constructor(e,r){super(),this.topProd=e,this.path=r,this.possibleTokTypes=[],this.nextProductionName="",this.nextProductionOccurrence=0,this.found=!1,this.isAtEndOfPath=!1}startWalking(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=Ne(this.path.ruleStack).reverse(),this.occurrenceStack=Ne(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes}walk(e,r=[]){this.found||super.walk(e,r)}walkProdRef(e,r,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){let i=r.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,i)}}updateExpectedNext(){Z(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}},xc=class extends yf{constructor(e,r){super(e,r),this.path=r,this.nextTerminalName="",this.nextTerminalOccurrence=0,this.nextTerminalName=this.path.lastTok.name,this.nextTerminalOccurrence=this.path.lastTokOccurrence}walkTerminal(e,r,n){if(this.isAtEndOfPath&&e.terminalType.name===this.nextTerminalName&&e.idx===this.nextTerminalOccurrence&&!this.found){let i=r.concat(n),s=new Ee({definition:i});this.possibleTokTypes=Jn(s),this.found=!0}}},Bi=class extends jr{constructor(e,r){super(),this.topRule=e,this.occurrence=r,this.result={token:void 0,occurrence:void 0,isEndOfRule:void 0}}startWalking(){return this.walk(this.topRule),this.result}},vc=class extends Bi{walkMany(e,r,n){if(e.idx===this.occurrence){let i=pt(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof te&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkMany(e,r,n)}},va=class extends Bi{walkManySep(e,r,n){if(e.idx===this.occurrence){let i=pt(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof te&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkManySep(e,r,n)}},Ec=class extends Bi{walkAtLeastOne(e,r,n){if(e.idx===this.occurrence){let i=pt(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof te&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOne(e,r,n)}},Ea=class extends Bi{walkAtLeastOneSep(e,r,n){if(e.idx===this.occurrence){let i=pt(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof te&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOneSep(e,r,n)}};function Ac(t,e,r=[]){r=Ne(r);let n=[],i=0;function s(o){return o.concat(Ke(t,i+1))}function a(o){let c=Ac(s(o),e,r);return n.concat(c)}for(;r.length{Z(c.definition)===!1&&(n=a(c.definition))}),n;if(o instanceof te)r.push(o.terminalType);else throw Error("non exhaustive match")}i++}return n.push({partialPath:r,suffixDef:Ke(t,i)}),n}function $c(t,e,r,n){let i="EXIT_NONE_TERMINAL",s=[i],a="EXIT_ALTERNATIVE",o=!1,c=e.length,l=c-n-1,u=[],p=[];for(p.push({idx:-1,def:t,ruleStack:[],occurrenceStack:[]});!Z(p);){let h=p.pop();if(h===a){o&&gr(p).idx<=l&&p.pop();continue}let g=h.def,C=h.idx,k=h.ruleStack,G=h.occurrenceStack;if(Z(g))continue;let M=g[0];if(M===i){let b={idx:C,def:Ke(g),ruleStack:tn(k),occurrenceStack:tn(G)};p.push(b)}else if(M instanceof te)if(C=0;b--){let E=M.definition[b],H={idx:C,def:E.definition.concat(Ke(g)),ruleStack:k,occurrenceStack:G};p.push(H),p.push(a)}else if(M instanceof Ee)p.push({idx:C,def:M.definition.concat(Ke(g)),ruleStack:k,occurrenceStack:G});else if(M instanceof Nt)p.push(NE(M,C,k,G));else throw Error("non exhaustive match")}return u}function NE(t,e,r,n){let i=Ne(r);i.push(t.name);let s=Ne(n);return s.push(1),{idx:e,def:t.definition,ruleStack:i,occurrenceStack:s}}var De=(function(t){return t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION",t})(De||{});function Aa(t){if(t instanceof he||t==="Option")return De.OPTION;if(t instanceof se||t==="Repetition")return De.REPETITION;if(t instanceof Ae||t==="RepetitionMandatory")return De.REPETITION_MANDATORY;if(t instanceof $e||t==="RepetitionMandatoryWithSeparator")return De.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof Re||t==="RepetitionWithSeparator")return De.REPETITION_WITH_SEPARATOR;if(t instanceof xe||t==="Alternation")return De.ALTERNATION;throw Error("non exhaustive match")}function kc(t){let{occurrence:e,rule:r,prodType:n,maxLookahead:i}=t,s=Aa(n);return s===De.ALTERNATION?Wi(e,r,i):Vi(e,r,s,i)}function Fm(t,e,r,n,i,s){let a=Wi(t,e,r),o=Bm(a)?zi:Br;return s(a,n,o,i)}function Gm(t,e,r,n,i,s){let a=Vi(t,e,i,r),o=Bm(a)?zi:Br;return s(a[0],o,n)}function Um(t,e,r,n){let i=t.length,s=At(t,a=>At(a,o=>o.length===1));if(e)return function(a){let o=I(a,c=>c.GATE);for(let c=0;cVe(c)),o=Ue(a,(c,l,u)=>(D(l,p=>{q(c,p.tokenTypeIdx)||(c[p.tokenTypeIdx]=u),D(p.categoryMatches,h=>{q(c,h)||(c[h]=u)})}),c),{});return function(){let c=this.LA(1);return o[c.tokenTypeIdx]}}else return function(){for(let a=0;as.length===1),i=t.length;if(n&&!r){let s=Ve(t);if(s.length===1&&Z(s[0].categoryMatches)){let o=s[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===o}}else{let a=Ue(s,(o,c,l)=>(o[c.tokenTypeIdx]=!0,D(c.categoryMatches,u=>{o[u]=!0}),o),[]);return function(){let o=this.LA(1);return a[o.tokenTypeIdx]===!0}}}else return function(){e:for(let s=0;sAc([a],1)),n=Mm(r.length),i=I(r,a=>{let o={};return D(a,c=>{let l=Tf(c.partialPath);D(l,u=>{o[u]=!0})}),o}),s=r;for(let a=1;a<=e;a++){let o=s;s=Mm(o.length);for(let c=0;c{let M=Tf(G.partialPath);D(M,b=>{i[c][b]=!0})})}}}}return n}function Wi(t,e,r,n){let i=new Sc(t,De.ALTERNATION,n);return e.accept(i),zm(i.result,r)}function Vi(t,e,r,n){let i=new Sc(t,r);e.accept(i);let s=i.result,o=new Rf(e,t,r).startWalking(),c=new Ee({definition:s}),l=new Ee({definition:o});return zm([c,l],n)}function Nc(t,e){e:for(let r=0;r{let i=e[n];return r===i||i.categoryMatchesMap[r.tokenTypeIdx]})}function Bm(t){return At(t,e=>At(e,r=>At(r,n=>Z(n.categoryMatches))))}function Wm(t){let e=t.lookaheadStrategy.validate({rules:t.rules,tokenTypes:t.tokenTypes,grammarName:t.grammarName});return I(e,r=>Object.assign({type:it.CUSTOM_LOOKAHEAD_VALIDATION},r))}function Vm(t,e,r,n){let i=ht(t,c=>wE(c,r)),s=LE(t,e,r),a=ht(t,c=>bE(c,r)),o=ht(t,c=>_E(c,t,n,r));return i.concat(s,a,o)}function wE(t,e){let r=new xf;t.accept(r);let n=r.allProductions,i=Uh(n,IE),s=Gt(i,o=>o.length>1);return I(Ce(s),o=>{let c=pt(o),l=e.buildDuplicateFoundError(t,o),u=Ot(c),p={message:l,type:it.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:u,occurrence:c.idx},h=Km(c);return h&&(p.parameter=h),p})}function IE(t){return`${Ot(t)}_#_${t.idx}_#_${Km(t)}`}function Km(t){return t instanceof te?t.terminalType.name:t instanceof pe?t.nonTerminalName:""}var xf=class extends Ct{constructor(){super(...arguments),this.allProductions=[]}visitNonTerminal(e){this.allProductions.push(e)}visitOption(e){this.allProductions.push(e)}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}visitAlternation(e){this.allProductions.push(e)}visitTerminal(e){this.allProductions.push(e)}};function _E(t,e,r,n){let i=[];if(Ue(e,(a,o)=>o.name===t.name?a+1:a,0)>1){let a=n.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});i.push({message:a,type:it.DUPLICATE_RULE_NAME,ruleName:t.name})}return i}function Hm(t,e,r){let n=[],i;return Pe(e,t)||(i=`Invalid rule override, rule: ->${t}<- cannot be overridden in the grammar: ->${r}<-as it is not defined in any of the super grammars `,n.push({message:i,type:it.INVALID_RULE_OVERRIDE,ruleName:t})),n}function Ef(t,e,r,n=[]){let i=[],s=Cc(e.definition);if(Z(s))return[];{let a=t.name;Pe(s,t)&&i.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:n}),type:it.LEFT_RECURSION,ruleName:a});let c=wn(s,n.concat([t])),l=ht(c,u=>{let p=Ne(n);return p.push(u),Ef(t,u,r,p)});return i.concat(l)}}function Cc(t){let e=[];if(Z(t))return e;let r=pt(t);if(r instanceof pe)e.push(r.referencedRule);else if(r instanceof Ee||r instanceof he||r instanceof Ae||r instanceof $e||r instanceof Re||r instanceof se)e=e.concat(Cc(r.definition));else if(r instanceof xe)e=Ve(I(r.definition,s=>Cc(s.definition)));else if(!(r instanceof te))throw Error("non exhaustive match");let n=Xn(r),i=t.length>1;if(n&&i){let s=Ke(t);return e.concat(Cc(s))}else return e}var $a=class extends Ct{constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}};function Ym(t,e){let r=new $a;t.accept(r);let n=r.alternations;return ht(n,s=>{let a=tn(s.definition);return ht(a,(o,c)=>{let l=$c([o],[],Br,1);return Z(l)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:s,emptyChoiceIdx:c}),type:it.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:s.idx,alternative:c+1}]:[]})})}function Xm(t,e,r){let n=new $a;t.accept(n);let i=n.alternations;return i=In(i,a=>a.ignoreAmbiguities===!0),ht(i,a=>{let o=a.idx,c=a.maxLookahead||e,l=Wi(o,t,c,a),u=PE(l,a,t,r),p=OE(l,a,t,r);return u.concat(p)})}var vf=class extends Ct{constructor(){super(...arguments),this.allProductions=[]}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}};function bE(t,e){let r=new $a;t.accept(r);let n=r.alternations;return ht(n,s=>s.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:s}),type:it.TOO_MANY_ALTS,ruleName:t.name,occurrence:s.idx}]:[])}function Jm(t,e,r){let n=[];return D(t,i=>{let s=new vf;i.accept(s);let a=s.allProductions;D(a,o=>{let c=Aa(o),l=o.maxLookahead||e,u=o.idx,h=Vi(u,i,c,l)[0];if(Z(Ve(h))){let g=r.buildEmptyRepetitionError({topLevelRule:i,repetition:o});n.push({message:g,type:it.NO_NON_EMPTY_LOOKAHEAD,ruleName:i.name})}})}),n}function PE(t,e,r,n){let i=[],s=Ue(t,(o,c,l)=>(e.definition[l].ignoreAmbiguities===!0||D(c,u=>{let p=[l];D(t,(h,g)=>{l!==g&&Nc(h,u)&&e.definition[g].ignoreAmbiguities!==!0&&p.push(g)}),p.length>1&&!Nc(i,u)&&(i.push(u),o.push({alts:p,path:u}))}),o),[]);return I(s,o=>{let c=I(o.alts,u=>u+1);return{message:n.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:c,prefixPath:o.path}),type:it.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:o.alts}})}function OE(t,e,r,n){let i=Ue(t,(a,o,c)=>{let l=I(o,u=>({idx:c,path:u}));return a.concat(l)},[]);return Or(ht(i,a=>{if(e.definition[a.idx].ignoreAmbiguities===!0)return[];let c=a.idx,l=a.path,u=ct(i,h=>e.definition[h.idx].ignoreAmbiguities!==!0&&h.idx{let g=[h.idx+1,c+1],C=e.idx===0?"":e.idx;return{message:n.buildAlternationPrefixAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:g,prefixPath:h.path}),type:it.AMBIGUOUS_PREFIX_ALTS,ruleName:r.name,occurrence:C,alternatives:g}})}))}function LE(t,e,r){let n=[],i=I(e,s=>s.name);return D(t,s=>{let a=s.name;if(Pe(i,a)){let o=r.buildNamespaceConflictError(s);n.push({message:o,type:it.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:a})}}),n}function Qm(t){let e=Ks(t,{errMsgProvider:Lm}),r={};return D(t.rules,n=>{r[n.name]=n}),Dm(r,e.errMsgProvider)}function Zm(t){return t=Ks(t,{errMsgProvider:cr}),Vm(t.rules,t.tokenTypes,t.errMsgProvider,t.grammarName)}var eg="MismatchedTokenException",tg="NoViableAltException",rg="EarlyExitException",ng="NotAllInputParsedException",ig=[eg,tg,rg,ng];Object.freeze(ig);function gn(t){return Pe(ig,t.name)}var Ki=class extends Error{constructor(e,r){super(e),this.token=r,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},Zn=class extends Ki{constructor(e,r,n){super(e,r),this.previousToken=n,this.name=eg}},Sa=class extends Ki{constructor(e,r,n){super(e,r),this.previousToken=n,this.name=tg}},ka=class extends Ki{constructor(e,r){super(e,r),this.name=ng}},Na=class extends Ki{constructor(e,r,n){super(e,r),this.previousToken=n,this.name=rg}};var Af={},Sf="InRuleRecoveryException",$f=class extends Error{constructor(e){super(e),this.name=Sf}},wc=class{initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=q(e,"recoveryEnabled")?e.recoveryEnabled:wt.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=DE)}getTokenToInsert(e){let r=Kr(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,r,n,i){let s=this.findReSyncTokenType(),a=this.exportLexerState(),o=[],c=!1,l=this.LA(1),u=this.LA(1),p=()=>{let h=this.LA(0),g=this.errorMessageProvider.buildMismatchTokenMessage({expected:i,actual:l,previous:h,ruleName:this.getCurrRuleFullName()}),C=new Zn(g,l,this.LA(0));C.resyncedTokens=tn(o),this.SAVE_ERROR(C)};for(;!c;)if(this.tokenMatcher(u,i)){p();return}else if(n.call(this)){p(),e.apply(this,r);return}else this.tokenMatcher(u,s)?c=!0:(u=this.SKIP_TOKEN(),this.addToResyncTokens(u,o));this.importLexerState(a)}shouldInRepetitionRecoveryBeTried(e,r,n){return!(n===!1||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))}getFollowsForInRuleRecovery(e,r){let n=this.getCurrentGrammarPath(e,r);return this.getNextPossibleTokenTypes(n)}tryInRuleRecovery(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r))return this.getTokenToInsert(e);if(this.canRecoverWithSingleTokenDeletion(e)){let n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new $f("sad sad panda")}canPerformInRuleRecovery(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,r){if(!this.canTokenTypeBeInsertedInRecovery(e)||Z(r))return!1;let n=this.LA(1);return Lr(r,s=>this.tokenMatcher(n,s))!==void 0}canRecoverWithSingleTokenDeletion(e){return this.canTokenTypeBeDeletedInRecovery(e)?this.tokenMatcher(this.LA(2),e):!1}isInCurrentRuleReSyncSet(e){let r=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(r);return Pe(n,e)}findReSyncTokenType(){let e=this.flattenFollowSet(),r=this.LA(1),n=2;for(;;){let i=Lr(e,s=>xa(r,s));if(i!==void 0)return i;r=this.LA(n),n++}}getCurrFollowKey(){if(this.RULE_STACK.length===1)return Af;let e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){let e=this.RULE_STACK,r=this.RULE_OCCURRENCE_STACK;return I(e,(n,i)=>i===0?Af:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:r[i],inRule:this.shortRuleNameToFullName(e[i-1])})}flattenFollowSet(){let e=I(this.buildFullFollowKeyStack(),r=>this.getFollowSetFromFollowKey(r));return Ve(e)}getFollowSetFromFollowKey(e){if(e===Af)return[Bt];let r=e.ruleName+e.idxInCallingRule+hc+e.inRule;return this.resyncFollows[r]}addToResyncTokens(e,r){return this.tokenMatcher(e,Bt)||r.push(e),r}reSyncTo(e){let r=[],n=this.LA(1);for(;this.tokenMatcher(n,e)===!1;)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,r);return tn(r)}attemptInRepetitionRecovery(e,r,n,i,s,a,o){}getCurrentGrammarPath(e,r){let n=this.getHumanReadableRuleStack(),i=Ne(this.RULE_OCCURRENCE_STACK);return{ruleStack:n,occurrenceStack:i,lastTok:e,lastTokOccurrence:r}}getHumanReadableRuleStack(){return I(this.RULE_STACK,e=>this.shortRuleNameToFullName(e))}};function DE(t,e,r,n,i,s,a){let o=this.getKeyForAutomaticLookahead(n,i),c=this.firstAfterRepMap[o];if(c===void 0){let h=this.getCurrRuleFullName(),g=this.getGAstProductions()[h];c=new s(g,i).startWalking(),this.firstAfterRepMap[o]=c}let l=c.token,u=c.occurrence,p=c.isEndOfRule;this.RULE_STACK.length===1&&p&&l===void 0&&(l=Bt,u=1),!(l===void 0||u===void 0)&&this.shouldInRepetitionRecoveryBeTried(l,u,a)&&this.tryInRepetitionRecovery(t,e,r,l)}function Ic(t,e,r){return r|e|t}var Yr=class{constructor(e){var r;this.maxLookahead=(r=e?.maxLookahead)!==null&&r!==void 0?r:wt.maxLookahead}validate(e){let r=this.validateNoLeftRecursion(e.rules);if(Z(r)){let n=this.validateEmptyOrAlternatives(e.rules),i=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),s=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...r,...n,...i,...s]}return r}validateNoLeftRecursion(e){return ht(e,r=>Ef(r,r,cr))}validateEmptyOrAlternatives(e){return ht(e,r=>Ym(r,cr))}validateAmbiguousAlternationAlternatives(e,r){return ht(e,n=>Xm(n,r,cr))}validateSomeNonEmptyLookaheadPath(e,r){return Jm(e,r,cr)}buildLookaheadForAlternation(e){return Fm(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,Um)}buildLookaheadForOptional(e){return Gm(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,Aa(e.prodType),qm)}};var bc=class{initLooksAhead(e){this.dynamicTokensEnabled=q(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:wt.dynamicTokensEnabled,this.maxLookahead=q(e,"maxLookahead")?e.maxLookahead:wt.maxLookahead,this.lookaheadStrategy=q(e,"lookaheadStrategy")?e.lookaheadStrategy:new Yr({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){D(e,r=>{this.TRACE_INIT(`${r.name} Rule Lookahead`,()=>{let{alternation:n,repetition:i,option:s,repetitionMandatory:a,repetitionMandatoryWithSeparator:o,repetitionWithSeparator:c}=ME(r);D(n,l=>{let u=l.idx===0?"":l.idx;this.TRACE_INIT(`${Ot(l)}${u}`,()=>{let p=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:l.idx,rule:r,maxLookahead:l.maxLookahead||this.maxLookahead,hasPredicates:l.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),h=Ic(this.fullRuleNameToShort[r.name],256,l.idx);this.setLaFuncCache(h,p)})}),D(i,l=>{this.computeLookaheadFunc(r,l.idx,768,"Repetition",l.maxLookahead,Ot(l))}),D(s,l=>{this.computeLookaheadFunc(r,l.idx,512,"Option",l.maxLookahead,Ot(l))}),D(a,l=>{this.computeLookaheadFunc(r,l.idx,1024,"RepetitionMandatory",l.maxLookahead,Ot(l))}),D(o,l=>{this.computeLookaheadFunc(r,l.idx,1536,"RepetitionMandatoryWithSeparator",l.maxLookahead,Ot(l))}),D(c,l=>{this.computeLookaheadFunc(r,l.idx,1280,"RepetitionWithSeparator",l.maxLookahead,Ot(l))})})})}computeLookaheadFunc(e,r,n,i,s,a){this.TRACE_INIT(`${a}${r===0?"":r}`,()=>{let o=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:r,rule:e,maxLookahead:s||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:i}),c=Ic(this.fullRuleNameToShort[e.name],n,r);this.setLaFuncCache(c,o)})}getKeyForAutomaticLookahead(e,r){let n=this.getLastExplicitRuleShortName();return Ic(n,e,r)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,r){this.lookAheadFuncsCache.set(e,r)}},kf=class extends Ct{constructor(){super(...arguments),this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}reset(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}visitOption(e){this.dslMethods.option.push(e)}visitRepetitionWithSeparator(e){this.dslMethods.repetitionWithSeparator.push(e)}visitRepetitionMandatory(e){this.dslMethods.repetitionMandatory.push(e)}visitRepetitionMandatoryWithSeparator(e){this.dslMethods.repetitionMandatoryWithSeparator.push(e)}visitRepetition(e){this.dslMethods.repetition.push(e)}visitAlternation(e){this.dslMethods.alternation.push(e)}},_c=new kf;function ME(t){_c.reset(),t.accept(_c);let e=_c.dslMethods;return _c.reset(),e}function wf(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffseta.msg);throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>: - ${s.join(` - -`).replace(/\n/g,` - `)}`)}}};return r.prototype=n,r.prototype.constructor=r,r._RULE_NAMES=e,r}function cg(t,e,r){let n=function(){};_f(n,t+"BaseSemanticsWithDefaults");let i=Object.create(r.prototype);return D(e,s=>{i[s]=GE}),n.prototype=i,n.prototype.constructor=n,n}var lg=(function(t){return t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD",t})(lg||{});function UE(t,e){return qE(t,e)}function qE(t,e){let r=ct(e,i=>mr(t[i])===!1),n=I(r,i=>({msg:`Missing visitor method: <${i}> on ${t.constructor.name} CST Visitor.`,type:lg.MISSING_METHOD,methodName:i}));return Or(n)}var Dc=class{initTreeBuilder(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=q(e,"nodeLocationTracking")?e.nodeLocationTracking:wt.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=et,this.cstFinallyStateUpdate=et,this.cstPostTerminal=et,this.cstPostNonTerminal=et,this.cstPostRule=et;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=If,this.setNodeLocationFromNode=If,this.cstPostRule=et,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=et,this.setNodeLocationFromNode=et,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=wf,this.setNodeLocationFromNode=wf,this.cstPostRule=et,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=et,this.setNodeLocationFromNode=et,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=et,this.setNodeLocationFromNode=et,this.cstPostRule=et,this.setInitialNodeLocation=et;else throw Error(`Invalid config option: "${e.nodeLocationTracking}"`)}setInitialNodeLocationOnlyOffsetRecovery(e){e.location={startOffset:NaN,endOffset:NaN}}setInitialNodeLocationOnlyOffsetRegular(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}}setInitialNodeLocationFullRecovery(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}}setInitialNodeLocationFullRegular(e){let r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}}cstInvocationStateUpdate(e){let r={name:e,children:Object.create(null)};this.setInitialNodeLocation(r),this.CST_STACK.push(r)}cstFinallyStateUpdate(){this.CST_STACK.pop()}cstPostRuleFull(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?(n.endOffset=r.endOffset,n.endLine=r.endLine,n.endColumn=r.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)}cstPostRuleOnlyOffset(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?n.endOffset=r.endOffset:n.startOffset=NaN}cstPostTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];sg(n,r,e),this.setNodeLocationFromToken(n.location,r)}cstPostNonTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];ag(n,r,e),this.setNodeLocationFromNode(n.location,e.location)}getBaseCstVisitorConstructor(){if($t(this.baseCstVisitorConstructor)){let e=og(this.className,Pr(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor}getBaseCstVisitorConstructorWithDefaults(){if($t(this.baseCstVisitorWithDefaultsConstructor)){let e=cg(this.className,Pr(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor}getLastExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-1]}getPreviousExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-2]}getLastExplicitRuleOccurrenceIndex(){let e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]}};var Mc=class{initLexerAdapter(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1}set input(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length}get input(){return this.tokVector}SKIP_TOKEN(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):Hi}LA(e){let r=this.currIdx+e;return r<0||this.tokVectorLength<=r?Hi:this.tokVector[r]}consumeToken(){this.currIdx++}exportLexerState(){return this.currIdx}importLexerState(e){this.currIdx=e}resetLexerState(){this.currIdx=-1}moveToTerminatedState(){this.currIdx=this.tokVector.length-1}getLexerPosition(){return this.exportLexerState()}};var Fc=class{ACTION(e){return e.call(this)}consume(e,r,n){return this.consumeInternal(r,e,n)}subrule(e,r,n){return this.subruleInternal(r,e,n)}option(e,r){return this.optionInternal(r,e)}or(e,r){return this.orInternal(r,e)}many(e,r){return this.manyInternal(e,r)}atLeastOne(e,r){return this.atLeastOneInternal(e,r)}CONSUME(e,r){return this.consumeInternal(e,0,r)}CONSUME1(e,r){return this.consumeInternal(e,1,r)}CONSUME2(e,r){return this.consumeInternal(e,2,r)}CONSUME3(e,r){return this.consumeInternal(e,3,r)}CONSUME4(e,r){return this.consumeInternal(e,4,r)}CONSUME5(e,r){return this.consumeInternal(e,5,r)}CONSUME6(e,r){return this.consumeInternal(e,6,r)}CONSUME7(e,r){return this.consumeInternal(e,7,r)}CONSUME8(e,r){return this.consumeInternal(e,8,r)}CONSUME9(e,r){return this.consumeInternal(e,9,r)}SUBRULE(e,r){return this.subruleInternal(e,0,r)}SUBRULE1(e,r){return this.subruleInternal(e,1,r)}SUBRULE2(e,r){return this.subruleInternal(e,2,r)}SUBRULE3(e,r){return this.subruleInternal(e,3,r)}SUBRULE4(e,r){return this.subruleInternal(e,4,r)}SUBRULE5(e,r){return this.subruleInternal(e,5,r)}SUBRULE6(e,r){return this.subruleInternal(e,6,r)}SUBRULE7(e,r){return this.subruleInternal(e,7,r)}SUBRULE8(e,r){return this.subruleInternal(e,8,r)}SUBRULE9(e,r){return this.subruleInternal(e,9,r)}OPTION(e){return this.optionInternal(e,0)}OPTION1(e){return this.optionInternal(e,1)}OPTION2(e){return this.optionInternal(e,2)}OPTION3(e){return this.optionInternal(e,3)}OPTION4(e){return this.optionInternal(e,4)}OPTION5(e){return this.optionInternal(e,5)}OPTION6(e){return this.optionInternal(e,6)}OPTION7(e){return this.optionInternal(e,7)}OPTION8(e){return this.optionInternal(e,8)}OPTION9(e){return this.optionInternal(e,9)}OR(e){return this.orInternal(e,0)}OR1(e){return this.orInternal(e,1)}OR2(e){return this.orInternal(e,2)}OR3(e){return this.orInternal(e,3)}OR4(e){return this.orInternal(e,4)}OR5(e){return this.orInternal(e,5)}OR6(e){return this.orInternal(e,6)}OR7(e){return this.orInternal(e,7)}OR8(e){return this.orInternal(e,8)}OR9(e){return this.orInternal(e,9)}MANY(e){this.manyInternal(0,e)}MANY1(e){this.manyInternal(1,e)}MANY2(e){this.manyInternal(2,e)}MANY3(e){this.manyInternal(3,e)}MANY4(e){this.manyInternal(4,e)}MANY5(e){this.manyInternal(5,e)}MANY6(e){this.manyInternal(6,e)}MANY7(e){this.manyInternal(7,e)}MANY8(e){this.manyInternal(8,e)}MANY9(e){this.manyInternal(9,e)}MANY_SEP(e){this.manySepFirstInternal(0,e)}MANY_SEP1(e){this.manySepFirstInternal(1,e)}MANY_SEP2(e){this.manySepFirstInternal(2,e)}MANY_SEP3(e){this.manySepFirstInternal(3,e)}MANY_SEP4(e){this.manySepFirstInternal(4,e)}MANY_SEP5(e){this.manySepFirstInternal(5,e)}MANY_SEP6(e){this.manySepFirstInternal(6,e)}MANY_SEP7(e){this.manySepFirstInternal(7,e)}MANY_SEP8(e){this.manySepFirstInternal(8,e)}MANY_SEP9(e){this.manySepFirstInternal(9,e)}AT_LEAST_ONE(e){this.atLeastOneInternal(0,e)}AT_LEAST_ONE1(e){return this.atLeastOneInternal(1,e)}AT_LEAST_ONE2(e){this.atLeastOneInternal(2,e)}AT_LEAST_ONE3(e){this.atLeastOneInternal(3,e)}AT_LEAST_ONE4(e){this.atLeastOneInternal(4,e)}AT_LEAST_ONE5(e){this.atLeastOneInternal(5,e)}AT_LEAST_ONE6(e){this.atLeastOneInternal(6,e)}AT_LEAST_ONE7(e){this.atLeastOneInternal(7,e)}AT_LEAST_ONE8(e){this.atLeastOneInternal(8,e)}AT_LEAST_ONE9(e){this.atLeastOneInternal(9,e)}AT_LEAST_ONE_SEP(e){this.atLeastOneSepFirstInternal(0,e)}AT_LEAST_ONE_SEP1(e){this.atLeastOneSepFirstInternal(1,e)}AT_LEAST_ONE_SEP2(e){this.atLeastOneSepFirstInternal(2,e)}AT_LEAST_ONE_SEP3(e){this.atLeastOneSepFirstInternal(3,e)}AT_LEAST_ONE_SEP4(e){this.atLeastOneSepFirstInternal(4,e)}AT_LEAST_ONE_SEP5(e){this.atLeastOneSepFirstInternal(5,e)}AT_LEAST_ONE_SEP6(e){this.atLeastOneSepFirstInternal(6,e)}AT_LEAST_ONE_SEP7(e){this.atLeastOneSepFirstInternal(7,e)}AT_LEAST_ONE_SEP8(e){this.atLeastOneSepFirstInternal(8,e)}AT_LEAST_ONE_SEP9(e){this.atLeastOneSepFirstInternal(9,e)}RULE(e,r,n=Yi){if(Pe(this.definedRulesNames,e)){let a={message:cr.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),type:it.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(a)}this.definedRulesNames.push(e);let i=this.defineRule(e,r,n);return this[e]=i,i}OVERRIDE_RULE(e,r,n=Yi){let i=Hm(e,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(i);let s=this.defineRule(e,r,n);return this[e]=s,s}BACKTRACK(e,r){return function(){this.isBackTrackingStack.push(1);let n=this.saveRecogState();try{return e.apply(this,r),!0}catch(i){if(gn(i))return!1;throw i}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}}getGAstProductions(){return this.gastProductionsCache}getSerializedGastProductions(){return pc(Ce(this.gastProductionsCache))}};var Gc=class{initRecognizerEngine(e,r){if(this.className=this.constructor.name,this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=zi,this.subruleIdx=0,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},q(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 - For Further details.`);if(Ze(e)){if(Z(e))throw Error(`A Token Vocabulary cannot be empty. - Note that the first argument for the parser constructor - is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 - For Further details.`)}if(Ze(e))this.tokensMap=Ue(e,(s,a)=>(s[a.name]=a,s),{});else if(q(e,"modes")&&At(Ve(Ce(e.modes)),km)){let s=Ve(Ce(e.modes)),a=Hs(s);this.tokensMap=Ue(a,(o,c)=>(o[c.name]=c,o),{})}else if(Fh(e))this.tokensMap=Ne(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=Bt;let n=q(e,"modes")?Ve(Ce(e.modes)):Ce(e),i=At(n,s=>Z(s.categoryMatches));this.tokenMatcher=i?zi:Br,Wr(Ce(this.tokensMap))}defineRule(e,r,n){if(this.selfAnalysisDone)throw Error(`Grammar rule <${e}> may not be defined after the 'performSelfAnalysis' method has been called' -Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);let i=q(n,"resyncEnabled")?n.resyncEnabled:Yi.resyncEnabled,s=q(n,"recoveryValueFunc")?n.recoveryValueFunc:Yi.recoveryValueFunc,a=this.ruleShortNameIdx<<12;this.ruleShortNameIdx++,this.shortRuleNameToFull[a]=e,this.fullRuleNameToShort[e]=a;let o;return this.outputCst===!0?o=function(...u){try{this.ruleInvocationStateUpdate(a,e,this.subruleIdx),r.apply(this,u);let p=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(p),p}catch(p){return this.invokeRuleCatch(p,i,s)}finally{this.ruleFinallyStateUpdate()}}:o=function(...u){try{return this.ruleInvocationStateUpdate(a,e,this.subruleIdx),r.apply(this,u)}catch(p){return this.invokeRuleCatch(p,i,s)}finally{this.ruleFinallyStateUpdate()}},Object.assign(o,{ruleName:e,originalGrammarAction:r})}invokeRuleCatch(e,r,n){let i=this.RULE_STACK.length===1,s=r&&!this.isBackTracking()&&this.recoveryEnabled;if(gn(e)){let a=e;if(s){let o=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(o))if(a.resyncedTokens=this.reSyncTo(o),this.outputCst){let c=this.CST_STACK[this.CST_STACK.length-1];return c.recoveredNode=!0,c}else return n(e);else{if(this.outputCst){let c=this.CST_STACK[this.CST_STACK.length-1];c.recoveredNode=!0,a.partialCstResult=c}throw a}}else{if(i)return this.moveToTerminatedState(),n(e);throw a}}else throw e}optionInternal(e,r){let n=this.getKeyForAutomaticLookahead(512,r);return this.optionInternalLogic(e,r,n)}optionInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),s;if(typeof e!="function"){s=e.DEF;let a=e.GATE;if(a!==void 0){let o=i;i=()=>a.call(this)&&o.call(this)}}else s=e;if(i.call(this)===!0)return s.call(this)}atLeastOneInternal(e,r){let n=this.getKeyForAutomaticLookahead(1024,e);return this.atLeastOneInternalLogic(e,r,n)}atLeastOneInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),s;if(typeof r!="function"){s=r.DEF;let a=r.GATE;if(a!==void 0){let o=i;i=()=>a.call(this)&&o.call(this)}}else s=r;if(i.call(this)===!0){let a=this.doSingleRepetition(s);for(;i.call(this)===!0&&a===!0;)a=this.doSingleRepetition(s)}else throw this.raiseEarlyExitException(e,De.REPETITION_MANDATORY,r.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,r],i,1024,e,Ec)}atLeastOneSepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1536,e);this.atLeastOneSepFirstInternalLogic(e,r,n)}atLeastOneSepFirstInternalLogic(e,r,n){let i=r.DEF,s=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let o=()=>this.tokenMatcher(this.LA(1),s);for(;this.tokenMatcher(this.LA(1),s)===!0;)this.CONSUME(s),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,s,o,i,Ea],o,1536,e,Ea)}else throw this.raiseEarlyExitException(e,De.REPETITION_MANDATORY_WITH_SEPARATOR,r.ERR_MSG)}manyInternal(e,r){let n=this.getKeyForAutomaticLookahead(768,e);return this.manyInternalLogic(e,r,n)}manyInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),s;if(typeof r!="function"){s=r.DEF;let o=r.GATE;if(o!==void 0){let c=i;i=()=>o.call(this)&&c.call(this)}}else s=r;let a=!0;for(;i.call(this)===!0&&a===!0;)a=this.doSingleRepetition(s);this.attemptInRepetitionRecovery(this.manyInternal,[e,r],i,768,e,vc,a)}manySepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1280,e);this.manySepFirstInternalLogic(e,r,n)}manySepFirstInternalLogic(e,r,n){let i=r.DEF,s=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let o=()=>this.tokenMatcher(this.LA(1),s);for(;this.tokenMatcher(this.LA(1),s)===!0;)this.CONSUME(s),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,s,o,i,va],o,1280,e,va)}}repetitionSepSecondInternal(e,r,n,i,s){for(;n();)this.CONSUME(r),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,r,n,i,s],n,1536,e,s)}doSingleRepetition(e){let r=this.getLexerPosition();return e.call(this),this.getLexerPosition()>r}orInternal(e,r){let n=this.getKeyForAutomaticLookahead(256,r),i=Ze(e)?e:e.DEF,a=this.getLaFuncFromCache(n).call(this,i);if(a!==void 0)return i[a].ALT.call(this);this.raiseNoAltException(r,e.ERR_MSG)}ruleFinallyStateUpdate(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){let e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new ka(r,e))}}subruleInternal(e,r,n){let i;try{let s=n!==void 0?n.ARGS:void 0;return this.subruleIdx=r,i=e.apply(this,s),this.cstPostNonTerminal(i,n!==void 0&&n.LABEL!==void 0?n.LABEL:e.ruleName),i}catch(s){throw this.subruleInternalError(s,n,e.ruleName)}}subruleInternalError(e,r,n){throw gn(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:n),delete e.partialCstResult),e}consumeInternal(e,r,n){let i;try{let s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),i=s):this.consumeInternalError(e,s,n)}catch(s){i=this.consumeInternalRecovery(e,r,s)}return this.cstPostTerminal(n!==void 0&&n.LABEL!==void 0?n.LABEL:e.name,i),i}consumeInternalError(e,r,n){let i,s=this.LA(0);throw n!==void 0&&n.ERR_MSG?i=n.ERR_MSG:i=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new Zn(i,r,s))}consumeInternalRecovery(e,r,n){if(this.recoveryEnabled&&n.name==="MismatchedTokenException"&&!this.isBackTracking()){let i=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,i)}catch(s){throw s.name===Sf?n:s}}else throw n}saveRecogState(){let e=this.errors,r=Ne(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}}reloadRecogState(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK}ruleInvocationStateUpdate(e,r,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r)}isBackTracking(){return this.isBackTrackingStack.length!==0}getCurrRuleFullName(){let e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]}shortRuleNameToFullName(e){return this.shortRuleNameToFull[e]}isAtEndOfInput(){return this.tokenMatcher(this.LA(1),Bt)}reset(){this.resetLexerState(),this.subruleIdx=0,this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]}};var Uc=class{initErrorHandler(e){this._errors=[],this.errorMessageProvider=q(e,"errorMessageProvider")?e.errorMessageProvider:wt.errorMessageProvider}SAVE_ERROR(e){if(gn(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:Ne(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")}get errors(){return Ne(this._errors)}set errors(e){this._errors=e}raiseEarlyExitException(e,r,n){let i=this.getCurrRuleFullName(),s=this.getGAstProductions()[i],o=Vi(e,s,r,this.maxLookahead)[0],c=[];for(let u=1;u<=this.maxLookahead;u++)c.push(this.LA(u));let l=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:o,actual:c,previous:this.LA(0),customUserDescription:n,ruleName:i});throw this.SAVE_ERROR(new Na(l,this.LA(1),this.LA(0)))}raiseNoAltException(e,r){let n=this.getCurrRuleFullName(),i=this.getGAstProductions()[n],s=Wi(e,i,this.maxLookahead),a=[];for(let l=1;l<=this.maxLookahead;l++)a.push(this.LA(l));let o=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:a,previous:o,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new Sa(c,this.LA(1),o))}};var qc=class{initContentAssist(){}computeContentAssist(e,r){let n=this.gastProductionsCache[e];if($t(n))throw Error(`Rule ->${e}<- does not exist in this grammar.`);return $c([n],r,this.tokenMatcher,this.maxLookahead)}getNextPossibleTokenTypes(e){let r=pt(e.ruleStack),i=this.getGAstProductions()[r];return new xc(i,e).startWalking()}};var Bc={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(Bc);var ug=!0,fg=Math.pow(2,8)-1,pg=mn({name:"RECORDING_PHASE_TOKEN",pattern:He.NA});Wr([pg]);var hg=Kr(pg,`This IToken indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(hg);var jE={name:`This CSTNode indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},zc=class{initGastRecorder(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1}enableRecording(){this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",()=>{for(let e=0;e<10;e++){let r=e>0?e:"";this[`CONSUME${r}`]=function(n,i){return this.consumeInternalRecord(n,e,i)},this[`SUBRULE${r}`]=function(n,i){return this.subruleInternalRecord(n,e,i)},this[`OPTION${r}`]=function(n){return this.optionInternalRecord(n,e)},this[`OR${r}`]=function(n){return this.orInternalRecord(n,e)},this[`MANY${r}`]=function(n){this.manyInternalRecord(e,n)},this[`MANY_SEP${r}`]=function(n){this.manySepFirstInternalRecord(e,n)},this[`AT_LEAST_ONE${r}`]=function(n){this.atLeastOneInternalRecord(e,n)},this[`AT_LEAST_ONE_SEP${r}`]=function(n){this.atLeastOneSepFirstInternalRecord(e,n)}}this.consume=function(e,r,n){return this.consumeInternalRecord(r,e,n)},this.subrule=function(e,r,n){return this.subruleInternalRecord(r,e,n)},this.option=function(e,r){return this.optionInternalRecord(r,e)},this.or=function(e,r){return this.orInternalRecord(r,e)},this.many=function(e,r){this.manyInternalRecord(e,r)},this.atLeastOne=function(e,r){this.atLeastOneInternalRecord(e,r)},this.ACTION=this.ACTION_RECORD,this.BACKTRACK=this.BACKTRACK_RECORD,this.LA=this.LA_RECORD})}disableRecording(){this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",()=>{let e=this;for(let r=0;r<10;r++){let n=r>0?r:"";delete e[`CONSUME${n}`],delete e[`SUBRULE${n}`],delete e[`OPTION${n}`],delete e[`OR${n}`],delete e[`MANY${n}`],delete e[`MANY_SEP${n}`],delete e[`AT_LEAST_ONE${n}`],delete e[`AT_LEAST_ONE_SEP${n}`]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})}ACTION_RECORD(e){}BACKTRACK_RECORD(e,r){return()=>!0}LA_RECORD(e){return Hi}topLevelRuleRecord(e,r){try{let n=new Nt({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),r.call(this),this.recordingProdStack.pop(),n}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` - This error was thrown during the "grammar recording phase" For more info see: - https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch(i){throw n}throw n}}optionInternalRecord(e,r){return wa.call(this,he,e,r)}atLeastOneInternalRecord(e,r){wa.call(this,Ae,r,e)}atLeastOneSepFirstInternalRecord(e,r){wa.call(this,$e,r,e,ug)}manyInternalRecord(e,r){wa.call(this,se,r,e)}manySepFirstInternalRecord(e,r){wa.call(this,Re,r,e,ug)}orInternalRecord(e,r){return BE.call(this,e,r)}subruleInternalRecord(e,r,n){if(jc(r),!e||q(e,"ruleName")===!1){let o=new Error(` argument is invalid expecting a Parser method reference but got: <${JSON.stringify(e)}> - inside top level rule: <${this.recordingProdStack[0].name}>`);throw o.KNOWN_RECORDER_ERROR=!0,o}let i=gr(this.recordingProdStack),s=e.ruleName,a=new pe({idx:r,nonTerminalName:s,label:n?.LABEL,referencedRule:void 0});return i.definition.push(a),this.outputCst?jE:Bc}consumeInternalRecord(e,r,n){if(jc(r),!hf(e)){let a=new Error(` argument is invalid expecting a TokenType reference but got: <${JSON.stringify(e)}> - inside top level rule: <${this.recordingProdStack[0].name}>`);throw a.KNOWN_RECORDER_ERROR=!0,a}let i=gr(this.recordingProdStack),s=new te({idx:r,terminalType:e,label:n?.LABEL});return i.definition.push(s),hg}};function wa(t,e,r,n=!1){jc(r);let i=gr(this.recordingProdStack),s=mr(e)?e:e.DEF,a=new t({definition:[],idx:r});return n&&(a.separator=e.SEP),q(e,"MAX_LOOKAHEAD")&&(a.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(a),s.call(this),i.definition.push(a),this.recordingProdStack.pop(),Bc}function BE(t,e){jc(e);let r=gr(this.recordingProdStack),n=Ze(t)===!1,i=n===!1?t:t.DEF,s=new xe({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});q(t,"MAX_LOOKAHEAD")&&(s.maxLookahead=t.MAX_LOOKAHEAD);let a=Mo(i,o=>mr(o.GATE));return s.hasPredicates=a,r.definition.push(s),D(i,o=>{let c=new Ee({definition:[]});s.definition.push(c),q(o,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=o.IGNORE_AMBIGUITIES:q(o,"GATE")&&(c.ignoreAmbiguities=!0),this.recordingProdStack.push(c),o.ALT.call(this),this.recordingProdStack.pop()}),Bc}function dg(t){return t===0?"":`${t}`}function jc(t){if(t<0||t>fg){let e=new Error(`Invalid DSL Method idx value: <${t}> - Idx value must be a none negative value smaller than ${fg+1}`);throw e.KNOWN_RECORDER_ERROR=!0,e}}var Wc=class{initPerformanceTracer(e){if(q(e,"traceInitPerf")){let r=e.traceInitPerf,n=typeof r=="number";this.traceInitMaxIdent=n?r:1/0,this.traceInitPerf=n?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=wt.traceInitPerf;this.traceInitIndent=-1}TRACE_INIT(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;let n=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${e}>`);let{time:i,value:s}=ga(r),a=i>10?console.warn:console.log;return this.traceInitIndent time: ${i}ms`),this.traceInitIndent--,s}else return r()}};function mg(t,e){e.forEach(r=>{let n=r.prototype;Object.getOwnPropertyNames(n).forEach(i=>{if(i==="constructor")return;let s=Object.getOwnPropertyDescriptor(n,i);s&&(s.get||s.set)?Object.defineProperty(t.prototype,i,s):t.prototype[i]=r.prototype[i]})})}var Hi=Kr(Bt,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(Hi);var wt=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:Hr,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1}),Yi=Object.freeze({recoveryValueFunc:()=>{},resyncEnabled:!0}),it=(function(t){return t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS",t[t.CUSTOM_LOOKAHEAD_VALIDATION=13]="CUSTOM_LOOKAHEAD_VALIDATION",t})(it||{});function Vc(t=void 0){return function(){return t}}var gg=(()=>{class t{static performSelfAnalysis(r){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")}performSelfAnalysis(){this.TRACE_INIT("performSelfAnalysis",()=>{let r;this.selfAnalysisDone=!0;let n=this.className;this.TRACE_INIT("toFastProps",()=>{ya(this)}),this.TRACE_INIT("Grammar Recording",()=>{try{this.enableRecording(),D(this.definedRulesNames,s=>{let o=this[s].originalGrammarAction,c;this.TRACE_INIT(`${s} Rule`,()=>{c=this.topLevelRuleRecord(s,o)}),this.gastProductionsCache[s]=c})}finally{this.disableRecording()}});let i=[];if(this.TRACE_INIT("Grammar Resolving",()=>{i=Qm({rules:Ce(this.gastProductionsCache)}),this.definitionErrors=this.definitionErrors.concat(i)}),this.TRACE_INIT("Grammar Validations",()=>{if(Z(i)&&this.skipValidations===!1){let s=Zm({rules:Ce(this.gastProductionsCache),tokenTypes:Ce(this.tokensMap),errMsgProvider:cr,grammarName:n}),a=Wm({lookaheadStrategy:this.lookaheadStrategy,rules:Ce(this.gastProductionsCache),tokenTypes:Ce(this.tokensMap),grammarName:n});this.definitionErrors=this.definitionErrors.concat(s,a)}}),Z(this.definitionErrors)&&(this.recoveryEnabled&&this.TRACE_INIT("computeAllProdsFollows",()=>{let s=om(Ce(this.gastProductionsCache));this.resyncFollows=s}),this.TRACE_INIT("ComputeLookaheadFunctions",()=>{var s,a;(a=(s=this.lookaheadStrategy).initialize)===null||a===void 0||a.call(s,{rules:Ce(this.gastProductionsCache)}),this.preComputeLookaheadFunctions(Ce(this.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!Z(this.definitionErrors))throw r=I(this.definitionErrors,s=>s.message),new Error(`Parser Definition Errors detected: - ${r.join(` -------------------------------- -`)}`)})}constructor(r,n){this.definitionErrors=[],this.selfAnalysisDone=!1;let i=this;if(i.initErrorHandler(n),i.initLexerAdapter(),i.initLooksAhead(n),i.initRecognizerEngine(r,n),i.initRecoverable(n),i.initTreeBuilder(n),i.initContentAssist(),i.initGastRecorder(n),i.initPerformanceTracer(n),q(n,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. - Please use the flag on the relevant DSL method instead. - See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES - For further details.`);this.skipValidations=q(n,"skipValidations")?n.skipValidations:wt.skipValidations}}return t.DEFER_DEFINITION_ERRORS_HANDLING=!1,t})();mg(gg,[wc,bc,Dc,Mc,Gc,Fc,Uc,qc,zc,Wc]);var Ia=class extends gg{constructor(e,r=wt){let n=Ne(r);n.outputCst=!1,super(e,n)}};function ei(t,e,r){return`${t.name}_${e}_${r}`}var yn=1,VE=2,yg=4,Tg=5;var Qi=7,KE=8,HE=9,YE=10,XE=11,Rg=12,_a=class{constructor(e){this.target=e}isEpsilon(){return!1}},Xi=class extends _a{constructor(e,r){super(e),this.tokenType=r}},ba=class extends _a{constructor(e){super(e)}isEpsilon(){return!0}},Ji=class extends _a{constructor(e,r,n){super(e),this.rule=r,this.followState=n}isEpsilon(){return!0}};function xg(t){let e={decisionMap:{},decisionStates:[],ruleToStartState:new Map,ruleToStopState:new Map,states:[]};JE(e,t);let r=t.length;for(let n=0;nvg(t,e,a));return Zi(t,e,n,r,...i)}function nA(t,e,r){let n=st(t,e,r,{type:yn});Tn(t,n);let i=Zi(t,e,n,r,ti(t,e,r));return iA(t,e,r,i)}function ti(t,e,r){let n=ct(I(r.definition,i=>vg(t,e,i)),i=>i!==void 0);return n.length===1?n[0]:n.length===0?void 0:aA(t,n)}function Eg(t,e,r,n,i){let s=n.left,a=n.right,o=st(t,e,r,{type:XE});Tn(t,o);let c=st(t,e,r,{type:Rg});return s.loopback=o,c.loopback=o,t.decisionMap[ei(e,i?"RepetitionMandatoryWithSeparator":"RepetitionMandatory",r.idx)]=o,Ye(a,o),i===void 0?(Ye(o,s),Ye(o,c)):(Ye(o,c),Ye(o,i.left),Ye(i.right,s)),{left:s,right:c}}function Ag(t,e,r,n,i){let s=n.left,a=n.right,o=st(t,e,r,{type:YE});Tn(t,o);let c=st(t,e,r,{type:Rg}),l=st(t,e,r,{type:HE});return o.loopback=l,c.loopback=l,Ye(o,s),Ye(o,c),Ye(a,l),i!==void 0?(Ye(l,c),Ye(l,i.left),Ye(i.right,s)):Ye(l,o),t.decisionMap[ei(e,i?"RepetitionWithSeparator":"Repetition",r.idx)]=o,{left:o,right:c}}function iA(t,e,r,n){let i=n.left,s=n.right;return Ye(i,s),t.decisionMap[ei(e,"Option",r.idx)]=i,n}function Tn(t,e){return t.decisionStates.push(e),e.decision=t.decisionStates.length-1,e.decision}function Zi(t,e,r,n,...i){let s=st(t,e,n,{type:KE,start:r});r.end=s;for(let o of i)o!==void 0?(Ye(r,o.left),Ye(o.right,s)):Ye(r,s);let a={left:r,right:s};return t.decisionMap[ei(e,sA(n),n.idx)]=r,a}function sA(t){if(t instanceof xe)return"Alternation";if(t instanceof he)return"Option";if(t instanceof se)return"Repetition";if(t instanceof Re)return"RepetitionWithSeparator";if(t instanceof Ae)return"RepetitionMandatory";if(t instanceof $e)return"RepetitionMandatoryWithSeparator";throw new Error("Invalid production type encountered")}function aA(t,e){let r=e.length;for(let s=0;se.alt)}get key(){let e="";for(let r in this.map)e+=r+":";return e}};function Lf(t,e=!0){return`${e?`a${t.alt}`:""}s${t.state.stateNumber}:${t.stack.map(r=>r.stateNumber.toString()).join("_")}`}function uA(t,e){let r={};return n=>{let i=n.toString(),s=r[i];return s!==void 0||(s={atnStartState:t,decision:e,states:{}},r[i]=s),s}}var Kc=class{constructor(){this.predicates=[]}is(e){return e>=this.predicates.length||this.predicates[e]}set(e,r){this.predicates[e]=r}toString(){let e="",r=this.predicates.length;for(let n=0;nconsole.log(n)}initialize(e){this.atn=xg(e.rules),this.dfas=fA(this.atn)}validateAmbiguousAlternationAlternatives(){return[]}validateEmptyOrAlternatives(){return[]}buildLookaheadForAlternation(e){let{prodOccurrence:r,rule:n,hasPredicates:i,dynamicTokensEnabled:s}=e,a=this.dfas,o=this.logging,c=ei(n,"Alternation",r),u=this.atn.decisionMap[c].decision,p=I(kc({maxLookahead:1,occurrence:r,prodType:"Alternation",rule:n}),h=>I(h,g=>g[0]));if(Sg(p,!1)&&!s){let h=Ue(p,(g,C,k)=>(D(C,G=>{G&&(g[G.tokenTypeIdx]=k,D(G.categoryMatches,M=>{g[M]=k}))}),g),{});return i?function(g){var C;let k=this.LA(1),G=h[k.tokenTypeIdx];if(g!==void 0&&G!==void 0){let M=(C=g[G])===null||C===void 0?void 0:C.GATE;if(M!==void 0&&M.call(this)===!1)return}return G}:function(){let g=this.LA(1);return h[g.tokenTypeIdx]}}else return i?function(h){let g=new Kc,C=h===void 0?0:h.length;for(let G=0;GI(h,g=>g[0]));if(Sg(p)&&p[0][0]&&!s){let h=p[0],g=Ve(h);if(g.length===1&&Z(g[0].categoryMatches)){let k=g[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===k}}else{let C=Ue(g,(k,G)=>(G!==void 0&&(k[G.tokenTypeIdx]=!0,D(G.categoryMatches,M=>{k[M]=!0})),k),{});return function(){let k=this.LA(1);return C[k.tokenTypeIdx]===!0}}}return function(){let h=Df.call(this,a,u,$g,o);return typeof h=="object"?!1:h===0}}};function Sg(t,e=!0){let r=new Set;for(let n of t){let i=new Set;for(let s of n){if(s===void 0){if(e)break;return!1}let a=[s.tokenTypeIdx].concat(s.categoryMatches);for(let o of a)if(r.has(o)){if(!i.has(o))return!1}else r.add(o),i.add(o)}}return!0}function fA(t){let e=t.decisionStates.length,r=Array(e);for(let n=0;nVr(i)).join(", "),r=t.production.idx===0?"":t.production.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(", ")}> in <${gA(t.production)}${r}> inside <${t.topLevelRule.name}> Rule, -<${e}> may appears as a prefix path in all these alternatives. -`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,n}function gA(t){if(t instanceof pe)return"SUBRULE";if(t instanceof he)return"OPTION";if(t instanceof xe)return"OR";if(t instanceof Ae)return"AT_LEAST_ONE";if(t instanceof $e)return"AT_LEAST_ONE_SEP";if(t instanceof Re)return"MANY_SEP";if(t instanceof se)return"MANY";if(t instanceof te)return"CONSUME";throw Error("non exhaustive match")}function yA(t,e,r){let n=ht(e.configs.elements,s=>s.state.transitions),i=zh(n.filter(s=>s instanceof Xi).map(s=>s.tokenType),s=>s.tokenTypeIdx);return{actualToken:r,possibleTokenTypes:i,tokenPath:t}}function TA(t,e){return t.edges[e.tokenTypeIdx]}function RA(t,e,r){let n=new es,i=[];for(let a of t.elements){if(r.is(a.alt)===!1)continue;if(a.state.type===Qi){i.push(a);continue}let o=a.state.transitions.length;for(let c=0;c0&&!$A(s))for(let a of i)s.add(a);return s}function xA(t,e){if(t instanceof Xi&&xa(e,t.tokenType))return t.target}function vA(t,e){let r;for(let n of t.elements)if(e.is(n.alt)===!0){if(r===void 0)r=n.alt;else if(r!==n.alt)return}return r}function Ng(t){return{configs:t,edges:{},isAcceptState:!1,prediction:-1}}function kg(t,e,r,n){return n=Cg(t,n),e.edges[r.tokenTypeIdx]=n,n}function Cg(t,e){if(e===Pa)return e;let r=e.configs.key,n=t.states[r];return n!==void 0?n:(e.configs.finalize(),t.states[r]=e,e)}function EA(t){let e=new es,r=t.transitions.length;for(let n=0;n0){let i=[...t.stack],a={state:i.pop(),alt:t.alt,stack:i};Hc(a,e)}else e.add(t);return}r.epsilonOnlyTransitions||e.add(t);let n=r.transitions.length;for(let i=0;i1)return!0;return!1}function wA(t){for(let e of Array.from(t.values()))if(Object.keys(e).length===1)return!0;return!1}as();var qa=class{constructor(){this.nodeStack=[]}get current(){return this.nodeStack[this.nodeStack.length-1]??this.rootNode}buildRootNode(e){return this.rootNode=new os(e),this.rootNode.root=this.rootNode,this.nodeStack=[this.rootNode],this.rootNode}buildCompositeNode(e){let r=new si;return r.grammarSource=e,r.root=this.rootNode,this.current.content.push(r),this.nodeStack.push(r),r}buildLeafNode(e,r){let n=new ii(e.startOffset,e.image.length,Pi(e),e.tokenType,!r);return n.grammarSource=r,n.root=this.rootNode,this.current.content.push(n),n}removeNode(e){let r=e.container;if(r){let n=r.content.indexOf(e);n>=0&&r.content.splice(n,1)}}addHiddenNodes(e){let r=[];for(let s of e){let a=new ii(s.startOffset,s.image.length,Pi(s),s.tokenType,!0);a.root=this.rootNode,r.push(a)}let n=this.current,i=!1;if(n.content.length>0){n.content.push(...r);return}for(;n.container;){let s=n.container.content.indexOf(n);if(s>0){n.container.content.splice(s,0,...r),i=!0;break}n=n.container}i||this.rootNode.content.unshift(...r)}construct(e){let r=this.current;typeof e.$type=="string"&&!e.$infixName&&(this.current.astNode=e),e.$cstNode=r;let n=this.nodeStack.pop();n?.content.length===0&&this.removeNode(n)}},za=class{get hidden(){return!1}get astNode(){let e=typeof this._astNode?.$type=="string"?this._astNode:this.container?.astNode;if(!e)throw new Error("This node has no associated AST element");return e}set astNode(e){this._astNode=e}get text(){return this.root.fullText.substring(this.offset,this.end)}},ii=class extends za{get offset(){return this._offset}get length(){return this._length}get end(){return this._offset+this._length}get hidden(){return this._hidden}get tokenType(){return this._tokenType}get range(){return this._range}constructor(e,r,n,i,s=!1){super(),this._hidden=s,this._offset=e,this._tokenType=i,this._length=r,this._range=n}},si=class extends za{constructor(){super(...arguments),this.content=new Sd(this)}get offset(){return this.firstNonHiddenNode?.offset??0}get length(){return this.end-this.offset}get end(){return this.lastNonHiddenNode?.end??0}get range(){let e=this.firstNonHiddenNode,r=this.lastNonHiddenNode;if(e&&r){if(this._rangeCache===void 0){let{range:n}=e,{range:i}=r;this._rangeCache={start:n.start,end:i.end.line=0;e--){let r=this.content[e];if(!r.hidden)return r}return this.content[this.content.length-1]}},Sd=class t extends Array{constructor(e){super(),this.parent=e,Object.setPrototypeOf(this,t.prototype)}push(...e){return this.addParents(e),super.push(...e)}unshift(...e){return this.addParents(e),super.unshift(...e)}splice(e,r,...n){return this.addParents(n),super.splice(e,r,...n)}addParents(e){for(let r of e)r.container=this.parent}},os=class extends si{get text(){return this._text.substring(this.offset,this.end)}get fullText(){return this._text}constructor(e){super(),this._text="",this._text=e??""}};var sl=Symbol("Datatype");function kd(t){return t.$type===sl}var jg="\u200B",Bg=t=>t.endsWith(jg)?t:t+jg,ja=class{constructor(e){this._unorderedGroups=new Map,this.allRules=new Map,this.lexer=e.parser.Lexer;let r=this.lexer.definition,n=e.LanguageMetaData.mode==="production";e.shared.profilers.LangiumProfiler?.isActive("parsing")?this.wrapper=new Nd(r,er(ge({},e.parser.ParserConfig),{skipValidations:n,errorMessageProvider:e.parser.ParserErrorMessageProvider}),e.shared.profilers.LangiumProfiler.createTask("parsing",e.LanguageMetaData.languageId)):this.wrapper=new ol(r,er(ge({},e.parser.ParserConfig),{skipValidations:n,errorMessageProvider:e.parser.ParserErrorMessageProvider}))}alternatives(e,r){this.wrapper.wrapOr(e,r)}optional(e,r){this.wrapper.wrapOption(e,r)}many(e,r){this.wrapper.wrapMany(e,r)}atLeastOne(e,r){this.wrapper.wrapAtLeastOne(e,r)}getRule(e){return this.allRules.get(e)}isRecording(){return this.wrapper.IS_RECORDING}get unorderedGroups(){return this._unorderedGroups}getRuleStack(){return this.wrapper.RULE_STACK}finalize(){this.wrapper.wrapSelfAnalysis()}},Ba=class extends ja{get current(){return this.stack[this.stack.length-1]}constructor(e){super(e),this.nodeBuilder=new qa,this.stack=[],this.assignmentMap=new Map,this.operatorPrecedence=new Map,this.linker=e.references.Linker,this.converter=e.parser.ValueConverter,this.astReflection=e.shared.AstReflection}rule(e,r){let n=this.computeRuleType(e),i;dn(e)&&(i=e.name,this.registerPrecedenceMap(e));let s=this.wrapper.DEFINE_RULE(Bg(e.name),this.startImplementation(n,i,r).bind(this));return this.allRules.set(e.name,s),nt(e)&&e.entry&&(this.mainRule=s),s}registerPrecedenceMap(e){let r=e.name,n=new Map;for(let i=0;i0&&(r=this.construct()),r===void 0)throw new Error("No result from parser");if(this.stack.length>0)throw new Error("Parser stack is not empty after parsing");return r}startImplementation(e,r,n){return i=>{let s=!this.isRecording()&&e!==void 0;if(s){let a={$type:e};this.stack.push(a),e===sl?a.value="":r!==void 0&&(a.$infixName=r)}return n(i),s?this.construct():void 0}}extractHiddenTokens(e){let r=this.lexerResult.hidden;if(!r.length)return[];let n=e.startOffset;for(let i=0;in)return r.splice(0,i);return r.splice(0,r.length)}consume(e,r,n){let i=this.wrapper.wrapConsume(e,r);if(!this.isRecording()&&this.isValidToken(i)){let s=this.extractHiddenTokens(i);this.nodeBuilder.addHiddenNodes(s);let a=this.nodeBuilder.buildLeafNode(i,n),{assignment:o,crossRef:c}=this.getAssignment(n),l=this.current;if(o){let u=Ht(n)?i.image:this.converter.convert(i.image,a);this.assign(o.operator,o.feature,u,a,c)}else if(kd(l)){let u=i.image;Ht(n)||(u=this.converter.convert(u,a).toString()),l.value+=u}}}isValidToken(e){return!e.isInsertedInRecovery&&!isNaN(e.startOffset)&&typeof e.endOffset=="number"&&!isNaN(e.endOffset)}subrule(e,r,n,i,s){let a;!this.isRecording()&&!n&&(a=this.nodeBuilder.buildCompositeNode(i));let o;try{o=this.wrapper.wrapSubrule(e,r,s)}finally{this.isRecording()||(o===void 0&&!n&&(o=this.construct()),o!==void 0&&a&&a.length>0&&this.performSubruleAssignment(o,i,a))}}performSubruleAssignment(e,r,n){let{assignment:i,crossRef:s}=this.getAssignment(r);if(i)this.assign(i.operator,i.feature,e,n,s);else if(!i){let a=this.current;if(kd(a))a.value+=e.toString();else if(typeof e=="object"&&e){let c=this.assignWithoutOverride(e,a);this.stack.pop(),this.stack.push(c)}}}action(e,r){if(!this.isRecording()){let n=this.current;if(r.feature&&r.operator){n=this.construct(),this.nodeBuilder.removeNode(n.$cstNode),this.nodeBuilder.buildCompositeNode(r).content.push(n.$cstNode);let s={$type:e};this.stack.push(s),this.assign(r.operator,r.feature,n,n.$cstNode)}else n.$type=e}}construct(){if(this.isRecording())return;let e=this.stack.pop();return this.nodeBuilder.construct(e),"$infixName"in e?this.constructInfix(e,this.operatorPrecedence.get(e.$infixName)):kd(e)?this.converter.convert(e.value,e.$cstNode):(Tu(this.astReflection,e),e)}constructInfix(e,r){let n=e.parts;if(!Array.isArray(n)||n.length===0)return;let i=e.operators;if(!Array.isArray(i)||n.length<2)return n[0];let s=0,a=-1;for(let k=0;ka?(a=M.precedence,s=k):M.precedence===a&&(M.rightAssoc||(s=k))}let o=i.slice(0,s),c=i.slice(s+1),l=n.slice(0,s+1),u=n.slice(s+1),p={$infixName:e.$infixName,$type:e.$type,$cstNode:e.$cstNode,parts:l,operators:o},h={$infixName:e.$infixName,$type:e.$type,$cstNode:e.$cstNode,parts:u,operators:c},g=this.constructInfix(p,r),C=this.constructInfix(h,r);return{$type:e.$type,$cstNode:e.$cstNode,left:g,operator:i[s],right:C}}getAssignment(e){if(!this.assignmentMap.has(e)){let r=Dr(e,sr);this.assignmentMap.set(e,{assignment:r,crossRef:r&&ar(r.terminal)?r.terminal.isMulti?"multi":"single":void 0})}return this.assignmentMap.get(e)}assign(e,r,n,i,s){let a=this.current,o;switch(s==="single"&&typeof n=="string"?o=this.linker.buildReference(a,r,i,n):s==="multi"&&typeof n=="string"?o=this.linker.buildMultiReference(a,r,i,n):o=n,e){case"=":{a[r]=o;break}case"?=":{a[r]=!0;break}case"+=":Array.isArray(a[r])||(a[r]=[]),a[r].push(o)}}assignWithoutOverride(e,r){for(let[i,s]of Object.entries(r)){let a=e[i];a===void 0?e[i]=s:Array.isArray(a)&&Array.isArray(s)&&(s.push(...a),e[i]=s)}let n=e.$cstNode;return n&&(n.astNode=void 0,e.$cstNode=void 0),e}get definitionErrors(){return this.wrapper.definitionErrors}},al=class{buildMismatchTokenMessage(e){return Hr.buildMismatchTokenMessage(e)}buildNotAllInputParsedMessage(e){return Hr.buildNotAllInputParsedMessage(e)}buildNoViableAltMessage(e){return Hr.buildNoViableAltMessage(e)}buildEarlyExitMessage(e){return Hr.buildEarlyExitMessage(e)}},cs=class extends al{buildMismatchTokenMessage({expected:e,actual:r}){return`Expecting ${e.LABEL?"`"+e.LABEL+"`":e.name.endsWith(":KW")?`keyword '${e.name.substring(0,e.name.length-3)}'`:`token of type '${e.name}'`} but found \`${r.image}\`.`}buildNotAllInputParsedMessage({firstRedundant:e}){return`Expecting end of file but found \`${e.image}\`.`}},Wa=class extends ja{constructor(){super(...arguments),this.tokens=[],this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}action(){}construct(){}parse(e){this.resetState();let r=this.lexer.tokenize(e,{mode:"partial"});return this.tokens=r.tokens,this.wrapper.input=[...this.tokens],this.mainRule.call(this.wrapper,{}),this.unorderedGroups.clear(),{tokens:this.tokens,elementStack:[...this.lastElementStack],tokenIndex:this.nextTokenIndex}}rule(e,r){let n=this.wrapper.DEFINE_RULE(Bg(e.name),this.startImplementation(r).bind(this));return this.allRules.set(e.name,n),e.entry&&(this.mainRule=n),n}resetState(){this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}startImplementation(e){return r=>{let n=this.keepStackSize();try{e(r)}finally{this.resetStackSize(n)}}}removeUnexpectedElements(){this.elementStack.splice(this.stackSize)}keepStackSize(){let e=this.elementStack.length;return this.stackSize=e,e}resetStackSize(e){this.removeUnexpectedElements(),this.stackSize=e}consume(e,r,n){this.wrapper.wrapConsume(e,r),this.isRecording()||(this.lastElementStack=[...this.elementStack,n],this.nextTokenIndex=this.currIdx+1)}subrule(e,r,n,i,s){this.before(i),this.wrapper.wrapSubrule(e,r,s),this.after(i)}before(e){this.isRecording()||this.elementStack.push(e)}after(e){if(!this.isRecording()){let r=this.elementStack.lastIndexOf(e);r>=0&&this.elementStack.splice(r)}}get currIdx(){return this.wrapper.currIdx}},_A={recoveryEnabled:!0,nodeLocationTracking:"full",skipValidations:!0,errorMessageProvider:new cs},ol=class extends Ia{constructor(e,r){let n=r&&"maxLookahead"in r;super(e,ge(er(ge({},_A),{lookaheadStrategy:n?new Yr({maxLookahead:r.maxLookahead}):new Oa({logging:r.skipValidations?()=>{}:void 0})}),r))}get IS_RECORDING(){return this.RECORDING_PHASE}DEFINE_RULE(e,r,n){return this.RULE(e,r,n)}wrapSelfAnalysis(){this.performSelfAnalysis()}wrapConsume(e,r){return this.consume(e,r,void 0)}wrapSubrule(e,r,n){return this.subrule(e,r,{ARGS:[n]})}wrapOr(e,r){this.or(e,r)}wrapOption(e,r){this.option(e,r)}wrapMany(e,r){this.many(e,r)}wrapAtLeastOne(e,r){this.atLeastOne(e,r)}rule(e){return e.call(this,{})}},Nd=class extends ol{constructor(e,r,n){super(e,r),this.task=n}rule(e){this.task.start(),this.task.startSubTask(this.ruleName(e));try{return super.rule(e)}finally{this.task.stopSubTask(this.ruleName(e)),this.task.stop()}}ruleName(e){return e.ruleName}subrule(e,r,n){this.task.startSubTask(this.ruleName(r));try{return super.subrule(e,r,n)}finally{this.task.stopSubTask(this.ruleName(r))}}};function Va(t,e,r){return bA({parser:e,tokens:r,ruleNames:new Map},t),e}function bA(t,e){let r=da(e,!1),n=ee(e.rules).filter(nt).filter(s=>r.has(s));for(let s of n){let a=er(ge({},t),{consume:1,optional:1,subrule:1,many:1,or:1});t.parser.rule(s,ai(a,s.definition))}let i=ee(e.rules).filter(dn).filter(s=>r.has(s));for(let s of i)t.parser.rule(s,PA(t,s))}function PA(t,e){let r=e.call.rule.ref;if(!r)throw new Error("Could not resolve reference to infix operator rule: "+e.call.rule.$refText);if(kt(r))throw new Error("Cannot use terminal rule in infix expression");let n=e.operators.precedences.flatMap(g=>g.operators),i={$type:"Group",elements:[]},s={$container:i,$type:"Assignment",feature:"parts",operator:"+=",terminal:e.call},a={$container:i,$type:"Group",elements:[],cardinality:"*"};i.elements.push(s,a);let c={$container:a,$type:"Assignment",feature:"operators",operator:"+=",terminal:{$type:"Alternatives",elements:n}},l=er(ge({},s),{$container:a});a.elements.push(c,l);let p=n.map(g=>t.tokens[g.value]).map((g,C)=>({ALT:()=>t.parser.consume(C,g,c)})),h;return g=>{h??(h=wd(t,r)),t.parser.subrule(0,h,!1,s,g),t.parser.many(0,{DEF:()=>{t.parser.alternatives(0,p),t.parser.subrule(1,h,!1,l,g)}})}}function ai(t,e,r=!1){let n;if(Ht(e))n=UA(t,e);else if(Ur(e))n=OA(t,e);else if(sr(e))n=ai(t,e.terminal);else if(ar(e))n=Wg(t,e);else if(or(e))n=LA(t,e);else if(ec(e))n=MA(t,e);else if(ic(e))n=FA(t,e);else if(fn(e))n=GA(t,e);else if(Su(e)){let i=t.consume++;n=()=>t.parser.consume(i,Bt,e)}else throw new Vn(e.$cstNode,`Unexpected element type: ${e.$type}`);return Vg(t,r?void 0:cl(e),n,e.cardinality)}function OA(t,e){let r=hn(e);return()=>t.parser.action(r,e)}function LA(t,e){let r=e.rule.ref;if(Gr(r)){let n=t.subrule++,i=nt(r)&&r.fragment,s=e.arguments.length>0?DA(r,e.arguments):()=>({}),a;return o=>{a??(a=wd(t,r)),t.parser.subrule(n,a,i,e,s(o))}}else if(kt(r)){let n=t.consume++,i=Cd(t,r.name);return()=>t.parser.consume(n,i,e)}else if(r)Rr(r);else throw new Vn(e.$cstNode,`Undefined rule: ${e.rule.$refText}`)}function DA(t,e){if(e.some(n=>n.calledByName)){let n=e.map(i=>({parameterName:i.parameter?.ref?.name,predicate:Ar(i.value)}));return i=>{let s={};for(let{parameterName:a,predicate:o}of n)a&&(s[a]=o(i));return s}}else{let n=e.map(i=>Ar(i.value));return i=>{let s={};for(let a=0;ae(n)||r(n)}else if(Au(t)){let e=Ar(t.left),r=Ar(t.right);return n=>e(n)&&r(n)}else if(Cu(t)){let e=Ar(t.value);return r=>!e(r)}else if(wu(t)){let e=t.parameter.ref.name;return r=>r!==void 0&&r[e]===!0}else if(vu(t)){let e=!!t.true;return()=>e}Rr(t)}function MA(t,e){if(e.elements.length===1)return ai(t,e.elements[0]);{let r=[];for(let i of e.elements){let s={ALT:ai(t,i,!0)},a=cl(i);a&&(s.GATE=Ar(a)),r.push(s)}let n=t.or++;return i=>t.parser.alternatives(n,r.map(s=>{let a={ALT:()=>s.ALT(i)},o=s.GATE;return o&&(a.GATE=()=>o(i)),a}))}}function FA(t,e){if(e.elements.length===1)return ai(t,e.elements[0]);let r=[];for(let o of e.elements){let c={ALT:ai(t,o,!0)},l=cl(o);l&&(c.GATE=Ar(l)),r.push(c)}let n=t.or++,i=(o,c)=>{let l=c.getRuleStack().join("-");return`uGroup_${o}_${l}`},s=o=>t.parser.alternatives(n,r.map((c,l)=>{let u={ALT:()=>!0},p=t.parser;u.ALT=()=>{if(c.ALT(o),!p.isRecording()){let g=i(n,p);p.unorderedGroups.get(g)||p.unorderedGroups.set(g,[]);let C=p.unorderedGroups.get(g);typeof C?.[l]>"u"&&(C[l]=!0)}};let h=c.GATE;return h?u.GATE=()=>h(o):u.GATE=()=>!p.unorderedGroups.get(i(n,p))?.[l],u})),a=Vg(t,cl(e),s,"*");return o=>{a(o),t.parser.isRecording()||t.parser.unorderedGroups.delete(i(n,t.parser))}}function GA(t,e){let r=e.elements.map(n=>ai(t,n));return n=>r.forEach(i=>i(n))}function cl(t){if(fn(t))return t.guardCondition}function Wg(t,e,r=e.terminal){if(r)if(or(r)&&nt(r.rule.ref)){let n=r.rule.ref,i=t.subrule++,s;return a=>{s??(s=wd(t,n)),t.parser.subrule(i,s,!1,e,a)}}else if(or(r)&&kt(r.rule.ref)){let n=t.consume++,i=Cd(t,r.rule.ref.name);return()=>t.parser.consume(n,i,e)}else if(Ht(r)){let n=t.consume++,i=Cd(t,r.value);return()=>t.parser.consume(n,i,e)}else throw new Error("Could not build cross reference parser");else{if(!e.type.ref)throw new Error("Could not resolve reference to type: "+e.type.$refText);let i=uc(e.type.ref)?.terminal;if(!i)throw new Error("Could not find name assignment for type: "+hn(e.type.ref));return Wg(t,e,i)}}function UA(t,e){let r=t.consume++,n=t.tokens[e.value];if(!n)throw new Error("Could not find token for keyword: "+e.value);return()=>t.parser.consume(r,n,e)}function Vg(t,e,r,n){let i=e&&Ar(e);if(!n)if(i){let s=t.or++;return a=>t.parser.alternatives(s,[{ALT:()=>r(a),GATE:()=>i(a)},{ALT:Vc(),GATE:()=>!i(a)}])}else return r;if(n==="*"){let s=t.many++;return a=>t.parser.many(s,{DEF:()=>r(a),GATE:i?()=>i(a):void 0})}else if(n==="+"){let s=t.many++;if(i){let a=t.or++;return o=>t.parser.alternatives(a,[{ALT:()=>t.parser.atLeastOne(s,{DEF:()=>r(o)}),GATE:()=>i(o)},{ALT:Vc(),GATE:()=>!i(o)}])}else return a=>t.parser.atLeastOne(s,{DEF:()=>r(a)})}else if(n==="?"){let s=t.optional++;return a=>t.parser.optional(s,{DEF:()=>r(a),GATE:i?()=>i(a):void 0})}else Rr(n)}function wd(t,e){let r=qA(t,e),n=t.parser.getRule(r);if(!n)throw new Error(`Rule "${r}" not found."`);return n}function qA(t,e){if(Gr(e))return e.name;if(t.ruleNames.has(e))return t.ruleNames.get(e);{let r=e,n=r.$container,i=e.$type;for(;!nt(n);)(fn(n)||ec(n)||ic(n))&&(i=n.elements.indexOf(r).toString()+":"+i),r=n,n=n.$container;return i=n.name+":"+i,t.ruleNames.set(e,i),i}}function Cd(t,e){let r=t.tokens[e];if(!r)throw new Error(`Token "${e}" not found."`);return r}function Id(t){let e=t.Grammar,r=t.parser.Lexer,n=new Wa(t);return Va(e,n,r.definition),n.finalize(),n}function _d(t){let e=Kg(t);return e.finalize(),e}function Kg(t){let e=t.Grammar,r=t.parser.Lexer,n=new Ba(t);return Va(e,n,r.definition)}var Jr=class{constructor(){this.diagnostics=[]}buildTokens(e,r){let n=ee(da(e,!1)),i=this.buildTerminalTokens(n),s=this.buildKeywordTokens(n,i,r);return s.push(...i),s}flushLexingReport(e){return{diagnostics:this.popDiagnostics()}}popDiagnostics(){let e=[...this.diagnostics];return this.diagnostics=[],e}buildTerminalTokens(e){return e.filter(kt).filter(r=>!r.fragment).map(r=>this.buildTerminalToken(r)).toArray()}buildTerminalToken(e){let r=Li(e),n=this.requiresCustomPattern(r)?this.regexPatternFunction(r):r,i={name:e.name,PATTERN:n};return typeof n=="function"&&(i.LINE_BREAKS=!0),e.hidden&&(i.GROUP=fa(r)?He.SKIPPED:"hidden"),i}requiresCustomPattern(e){return!!(e.flags.includes("u")||e.flags.includes("s"))}regexPatternFunction(e){let r=new RegExp(e,e.flags+"y");return(n,i)=>(r.lastIndex=i,r.exec(n))}buildKeywordTokens(e,r,n){return e.filter(Gr).flatMap(i=>nr(i).filter(Ht)).distinct(i=>i.value).toArray().sort((i,s)=>s.value.length-i.value.length).map(i=>this.buildKeywordToken(i,r,!!n?.caseInsensitive))}buildKeywordToken(e,r,n){let i=this.buildKeywordPattern(e,n),s={name:e.value,PATTERN:i,LONGER_ALT:this.findLongerAlt(e,r)};return typeof i=="function"&&(s.LINE_BREAKS=!0),s}buildKeywordPattern(e,r){return r?new RegExp(pn(e.value),"i"):e.value}findLongerAlt(e,r){return r.reduce((n,i)=>{let s=i?.PATTERN;return s?.source&&Ku("^"+s.source+"$",e.value)&&n.push(i),n},[])}};var oi=class{convert(e,r){let n=r.grammarSource;if(ar(n)&&(n=Xu(n)),or(n)){let i=n.rule.ref;if(!i)throw new Error("This cst node was not parsed by a rule.");return this.runConverter(i,e,r)}return e}runConverter(e,r,n){switch(e.name.toUpperCase()){case"INT":return $r.convertInt(r);case"STRING":return $r.convertString(r);case"ID":return $r.convertID(r)}switch(nf(e)?.toLowerCase()){case"number":return $r.convertNumber(r);case"boolean":return $r.convertBoolean(r);case"bigint":return $r.convertBigint(r);case"date":return $r.convertDate(r);default:return r}}},$r;(function(t){function e(l){let u="";for(let p=1;p{typeof setImmediate>"u"?setTimeout(t,0):setImmediate(t)})}var dl=0,Jg=10;function pl(){return dl=performance.now(),new W.CancellationTokenSource}function Qg(t){Jg=t}var Yt=Symbol("OperationCancelled");function Sr(t){return t===Yt}function Me(t){return P(this,null,function*(){if(t===W.CancellationToken.None)return;let e=performance.now();if(e-dl>=Jg&&(dl=e,yield Fd(),dl=performance.now()),t.isCancellationRequested)throw Yt})}var It=class{constructor(){this.promise=new Promise((e,r)=>{this.resolve=n=>(e(n),this),this.reject=n=>(r(n),this)})}};var hl=class t{constructor(e,r,n,i){this._uri=e,this._languageId=r,this._version=n,this._content=i,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let r=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(r,n)}return this._content}update(e,r){for(let n of e)if(t.isIncremental(n)){let i=ty(n.range),s=this.offsetAt(i.start),a=this.offsetAt(i.end);this._content=this._content.substring(0,s)+n.text+this._content.substring(a,this._content.length);let o=Math.max(i.start.line,0),c=Math.max(i.end.line,0),l=this._lineOffsets,u=Zg(n.text,!1,s);if(c-o===u.length)for(let h=0,g=u.length;he?i=a:n=a+1}let s=n-1;return e=this.ensureBeforeEOL(e,r[s]),{line:s,character:e-r[s]}}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line];if(e.character<=0)return n;let i=e.line+1r&&ey(this._content.charCodeAt(e-1));)e--;return e}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range!==void 0&&(r.rangeLength===void 0||typeof r.rangeLength=="number")}static isFull(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range===void 0&&r.rangeLength===void 0}},ds;(function(t){function e(i,s,a,o){return new hl(i,s,a,o)}t.create=e;function r(i,s,a){if(i instanceof hl)return i.update(s,a),i;throw new Error("TextDocument.update: document must be created by TextDocument.create")}t.update=r;function n(i,s){let a=i.getText(),o=Gd(s.map(JA),(u,p)=>{let h=u.range.start.line-p.range.start.line;return h===0?u.range.start.character-p.range.start.character:h}),c=0,l=[];for(let u of o){let p=i.offsetAt(u.range.start);if(pc&&l.push(a.substring(c,p)),u.newText.length&&l.push(u.newText),c=i.offsetAt(u.range.end)}return l.push(a.substr(c)),l.join("")}t.applyEdits=n})(ds||(ds={}));function Gd(t,e){if(t.length<=1)return t;let r=t.length/2|0,n=t.slice(0,r),i=t.slice(r);Gd(n,e),Gd(i,e);let s=0,a=0,o=0;for(;sr.line||e.line===r.line&&e.character>r.character?{start:r,end:e}:t}function JA(t){let e=ty(t.range);return e!==t.range?{newText:t.newText,range:e}:t}var ry;(()=>{"use strict";var t={975:$=>{function y(T){if(typeof T!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(T))}function L(T,x){for(var A,_="",U=0,N=-1,Y=0,Q=0;Q<=T.length;++Q){if(Q2){var de=_.lastIndexOf("/");if(de!==_.length-1){de===-1?(_="",U=0):U=(_=_.slice(0,de)).length-1-_.lastIndexOf("/"),N=Q,Y=0;continue}}else if(_.length===2||_.length===1){_="",U=0,N=Q,Y=0;continue}}x&&(_.length>0?_+="/..":_="..",U=2)}else _.length>0?_+="/"+T.slice(N+1,Q):_=T.slice(N+1,Q),U=Q-N-1;N=Q,Y=0}else A===46&&Y!==-1?++Y:Y=-1}return _}var O={resolve:function(){for(var T,x="",A=!1,_=arguments.length-1;_>=-1&&!A;_--){var U;_>=0?U=arguments[_]:(T===void 0&&(T=process.cwd()),U=T),y(U),U.length!==0&&(x=U+"/"+x,A=U.charCodeAt(0)===47)}return x=L(x,!A),A?x.length>0?"/"+x:"/":x.length>0?x:"."},normalize:function(T){if(y(T),T.length===0)return".";var x=T.charCodeAt(0)===47,A=T.charCodeAt(T.length-1)===47;return(T=L(T,!x)).length!==0||x||(T="."),T.length>0&&A&&(T+="/"),x?"/"+T:T},isAbsolute:function(T){return y(T),T.length>0&&T.charCodeAt(0)===47},join:function(){if(arguments.length===0)return".";for(var T,x=0;x0&&(T===void 0?T=A:T+="/"+A)}return T===void 0?".":O.normalize(T)},relative:function(T,x){if(y(T),y(x),T===x||(T=O.resolve(T))===(x=O.resolve(x)))return"";for(var A=1;AQ){if(x.charCodeAt(N+ue)===47)return x.slice(N+ue+1);if(ue===0)return x.slice(N+ue)}else U>Q&&(T.charCodeAt(A+ue)===47?de=ue:ue===0&&(de=0));break}var ve=T.charCodeAt(A+ue);if(ve!==x.charCodeAt(N+ue))break;ve===47&&(de=ue)}var We="";for(ue=A+de+1;ue<=_;++ue)ue!==_&&T.charCodeAt(ue)!==47||(We.length===0?We+="..":We+="/..");return We.length>0?We+x.slice(N+de):(N+=de,x.charCodeAt(N)===47&&++N,x.slice(N))},_makeLong:function(T){return T},dirname:function(T){if(y(T),T.length===0)return".";for(var x=T.charCodeAt(0),A=x===47,_=-1,U=!0,N=T.length-1;N>=1;--N)if((x=T.charCodeAt(N))===47){if(!U){_=N;break}}else U=!1;return _===-1?A?"/":".":A&&_===1?"//":T.slice(0,_)},basename:function(T,x){if(x!==void 0&&typeof x!="string")throw new TypeError('"ext" argument must be a string');y(T);var A,_=0,U=-1,N=!0;if(x!==void 0&&x.length>0&&x.length<=T.length){if(x.length===T.length&&x===T)return"";var Y=x.length-1,Q=-1;for(A=T.length-1;A>=0;--A){var de=T.charCodeAt(A);if(de===47){if(!N){_=A+1;break}}else Q===-1&&(N=!1,Q=A+1),Y>=0&&(de===x.charCodeAt(Y)?--Y==-1&&(U=A):(Y=-1,U=Q))}return _===U?U=Q:U===-1&&(U=T.length),T.slice(_,U)}for(A=T.length-1;A>=0;--A)if(T.charCodeAt(A)===47){if(!N){_=A+1;break}}else U===-1&&(N=!1,U=A+1);return U===-1?"":T.slice(_,U)},extname:function(T){y(T);for(var x=-1,A=0,_=-1,U=!0,N=0,Y=T.length-1;Y>=0;--Y){var Q=T.charCodeAt(Y);if(Q!==47)_===-1&&(U=!1,_=Y+1),Q===46?x===-1?x=Y:N!==1&&(N=1):x!==-1&&(N=-1);else if(!U){A=Y+1;break}}return x===-1||_===-1||N===0||N===1&&x===_-1&&x===A+1?"":T.slice(x,_)},format:function(T){if(T===null||typeof T!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof T);return(function(x,A){var _=A.dir||A.root,U=A.base||(A.name||"")+(A.ext||"");return _?_===A.root?_+U:_+"/"+U:U})(0,T)},parse:function(T){y(T);var x={root:"",dir:"",base:"",ext:"",name:""};if(T.length===0)return x;var A,_=T.charCodeAt(0),U=_===47;U?(x.root="/",A=1):A=0;for(var N=-1,Y=0,Q=-1,de=!0,ue=T.length-1,ve=0;ue>=A;--ue)if((_=T.charCodeAt(ue))!==47)Q===-1&&(de=!1,Q=ue+1),_===46?N===-1?N=ue:ve!==1&&(ve=1):N!==-1&&(ve=-1);else if(!de){Y=ue+1;break}return N===-1||Q===-1||ve===0||ve===1&&N===Q-1&&N===Y+1?Q!==-1&&(x.base=x.name=Y===0&&U?T.slice(1,Q):T.slice(Y,Q)):(Y===0&&U?(x.name=T.slice(1,N),x.base=T.slice(1,Q)):(x.name=T.slice(Y,N),x.base=T.slice(Y,Q)),x.ext=T.slice(N,Q)),Y>0?x.dir=T.slice(0,Y-1):U&&(x.dir="/"),x},sep:"/",delimiter:":",win32:null,posix:null};O.posix=O,$.exports=O}},e={};function r($){var y=e[$];if(y!==void 0)return y.exports;var L=e[$]={exports:{}};return t[$](L,L.exports,r),L.exports}r.d=($,y)=>{for(var L in y)r.o(y,L)&&!r.o($,L)&&Object.defineProperty($,L,{enumerable:!0,get:y[L]})},r.o=($,y)=>Object.prototype.hasOwnProperty.call($,y),r.r=$=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty($,Symbol.toStringTag,{value:"Module"}),Object.defineProperty($,"__esModule",{value:!0})};var n={};let i;r.r(n),r.d(n,{URI:()=>h,Utils:()=>Kt}),typeof process=="object"?i=process.platform==="win32":typeof navigator=="object"&&(i=navigator.userAgent.indexOf("Windows")>=0);let s=/^\w[\w\d+.-]*$/,a=/^\//,o=/^\/\//;function c($,y){if(!$.scheme&&y)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${$.authority}", path: "${$.path}", query: "${$.query}", fragment: "${$.fragment}"}`);if($.scheme&&!s.test($.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if($.path){if($.authority){if(!a.test($.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(o.test($.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}let l="",u="/",p=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class h{static isUri(y){return y instanceof h||!!y&&typeof y.authority=="string"&&typeof y.fragment=="string"&&typeof y.path=="string"&&typeof y.query=="string"&&typeof y.scheme=="string"&&typeof y.fsPath=="string"&&typeof y.with=="function"&&typeof y.toString=="function"}scheme;authority;path;query;fragment;constructor(y,L,O,T,x,A=!1){typeof y=="object"?(this.scheme=y.scheme||l,this.authority=y.authority||l,this.path=y.path||l,this.query=y.query||l,this.fragment=y.fragment||l):(this.scheme=(function(_,U){return _||U?_:"file"})(y,A),this.authority=L||l,this.path=(function(_,U){switch(_){case"https":case"http":case"file":U?U[0]!==u&&(U=u+U):U=u}return U})(this.scheme,O||l),this.query=T||l,this.fragment=x||l,c(this,A))}get fsPath(){return b(this,!1)}with(y){if(!y)return this;let{scheme:L,authority:O,path:T,query:x,fragment:A}=y;return L===void 0?L=this.scheme:L===null&&(L=l),O===void 0?O=this.authority:O===null&&(O=l),T===void 0?T=this.path:T===null&&(T=l),x===void 0?x=this.query:x===null&&(x=l),A===void 0?A=this.fragment:A===null&&(A=l),L===this.scheme&&O===this.authority&&T===this.path&&x===this.query&&A===this.fragment?this:new C(L,O,T,x,A)}static parse(y,L=!1){let O=p.exec(y);return O?new C(O[2]||l,ye(O[4]||l),ye(O[5]||l),ye(O[7]||l),ye(O[9]||l),L):new C(l,l,l,l,l)}static file(y){let L=l;if(i&&(y=y.replace(/\\/g,u)),y[0]===u&&y[1]===u){let O=y.indexOf(u,2);O===-1?(L=y.substring(2),y=u):(L=y.substring(2,O),y=y.substring(O)||u)}return new C("file",L,y,l,l)}static from(y){let L=new C(y.scheme,y.authority,y.path,y.query,y.fragment);return c(L,!0),L}toString(y=!1){return E(this,y)}toJSON(){return this}static revive(y){if(y){if(y instanceof h)return y;{let L=new C(y);return L._formatted=y.external,L._fsPath=y._sep===g?y.fsPath:null,L}}return y}}let g=i?1:void 0;class C extends h{_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=b(this,!1)),this._fsPath}toString(y=!1){return y?E(this,!0):(this._formatted||(this._formatted=E(this,!1)),this._formatted)}toJSON(){let y={$mid:1};return this._fsPath&&(y.fsPath=this._fsPath,y._sep=g),this._formatted&&(y.external=this._formatted),this.path&&(y.path=this.path),this.scheme&&(y.scheme=this.scheme),this.authority&&(y.authority=this.authority),this.query&&(y.query=this.query),this.fragment&&(y.fragment=this.fragment),y}}let k={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function G($,y,L){let O,T=-1;for(let x=0;x<$.length;x++){let A=$.charCodeAt(x);if(A>=97&&A<=122||A>=65&&A<=90||A>=48&&A<=57||A===45||A===46||A===95||A===126||y&&A===47||L&&A===91||L&&A===93||L&&A===58)T!==-1&&(O+=encodeURIComponent($.substring(T,x)),T=-1),O!==void 0&&(O+=$.charAt(x));else{O===void 0&&(O=$.substr(0,x));let _=k[A];_!==void 0?(T!==-1&&(O+=encodeURIComponent($.substring(T,x)),T=-1),O+=_):T===-1&&(T=x)}}return T!==-1&&(O+=encodeURIComponent($.substring(T))),O!==void 0?O:$}function M($){let y;for(let L=0;L<$.length;L++){let O=$.charCodeAt(L);O===35||O===63?(y===void 0&&(y=$.substr(0,L)),y+=k[O]):y!==void 0&&(y+=$[L])}return y!==void 0?y:$}function b($,y){let L;return L=$.authority&&$.path.length>1&&$.scheme==="file"?`//${$.authority}${$.path}`:$.path.charCodeAt(0)===47&&($.path.charCodeAt(1)>=65&&$.path.charCodeAt(1)<=90||$.path.charCodeAt(1)>=97&&$.path.charCodeAt(1)<=122)&&$.path.charCodeAt(2)===58?y?$.path.substr(1):$.path[1].toLowerCase()+$.path.substr(2):$.path,i&&(L=L.replace(/\//g,"\\")),L}function E($,y){let L=y?M:G,O="",{scheme:T,authority:x,path:A,query:_,fragment:U}=$;if(T&&(O+=T,O+=":"),(x||T==="file")&&(O+=u,O+=u),x){let N=x.indexOf("@");if(N!==-1){let Y=x.substr(0,N);x=x.substr(N+1),N=Y.lastIndexOf(":"),N===-1?O+=L(Y,!1,!1):(O+=L(Y.substr(0,N),!1,!1),O+=":",O+=L(Y.substr(N+1),!1,!0)),O+="@"}x=x.toLowerCase(),N=x.lastIndexOf(":"),N===-1?O+=L(x,!1,!0):(O+=L(x.substr(0,N),!1,!0),O+=x.substr(N))}if(A){if(A.length>=3&&A.charCodeAt(0)===47&&A.charCodeAt(2)===58){let N=A.charCodeAt(1);N>=65&&N<=90&&(A=`/${String.fromCharCode(N+32)}:${A.substr(3)}`)}else if(A.length>=2&&A.charCodeAt(1)===58){let N=A.charCodeAt(0);N>=65&&N<=90&&(A=`${String.fromCharCode(N+32)}:${A.substr(2)}`)}O+=L(A,!0,!1)}return _&&(O+="?",O+=L(_,!1,!1)),U&&(O+="#",O+=y?U:G(U,!1,!1)),O}function H($){try{return decodeURIComponent($)}catch(y){return $.length>3?$.substr(0,3)+H($.substr(3)):$}}let F=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function ye($){return $.match(F)?$.replace(F,y=>H(y)):$}var dr=r(975);let Je=dr.posix||dr,Qt="/";var Kt;(function($){$.joinPath=function(y,...L){return y.with({path:Je.join(y.path,...L)})},$.resolvePath=function(y,...L){let O=y.path,T=!1;O[0]!==Qt&&(O=Qt+O,T=!0);let x=Je.resolve(O,...L);return T&&x[0]===Qt&&!y.authority&&(x=x.substring(1)),y.with({path:x})},$.dirname=function(y){if(y.path.length===0||y.path===Qt)return y;let L=Je.dirname(y.path);return L.length===1&&L.charCodeAt(0)===46&&(L=""),y.with({path:L})},$.basename=function(y){return Je.basename(y.path)},$.extname=function(y){return Je.extname(y.path)}})(Kt||(Kt={})),ry=n})();var{URI:rt,Utils:ps}=ry;var Be;(function(t){t.basename=ps.basename,t.dirname=ps.dirname,t.extname=ps.extname,t.joinPath=ps.joinPath,t.resolvePath=ps.resolvePath;let e=typeof process=="object"&&process?.platform==="win32";function r(a,o){return a?.toString()===o?.toString()}t.equals=r;function n(a,o){let c=typeof a=="string"?rt.parse(a).path:a.path,l=typeof o=="string"?rt.parse(o).path:o.path,u=c.split("/").filter(k=>k.length>0),p=l.split("/").filter(k=>k.length>0);if(e){let k=/^[A-Z]:$/;if(u[0]&&k.test(u[0])&&(u[0]=u[0].toLowerCase()),p[0]&&k.test(p[0])&&(p[0]=p[0].toLowerCase()),u[0]!==p[0])return l.substring(1)}let h=0;for(;h({name:i.name,uri:Be.joinPath(rt.parse(r),i.name).toString(),element:i.element})):[]}all(){return this.collectValues(this.root)}findAll(e){let r=this.getNode(Be.normalize(e),!1);return r?this.collectValues(r):[]}getNode(e,r){let n=e.split("/");e.charAt(e.length-1)==="/"&&n.pop();let i=this.root;for(let s of n){let a=i.children.get(s);if(!a)if(r)a={name:s,children:new Map,parent:i},i.children.set(s,a);else return;i=a}return i}collectValues(e){let r=[];e.element&&r.push(e.element);for(let n of e.children.values())r.push(...this.collectValues(n));return r}};var re=(function(t){return t[t.Changed=0]="Changed",t[t.Parsed=1]="Parsed",t[t.IndexedContent=2]="IndexedContent",t[t.ComputedScopes=3]="ComputedScopes",t[t.Linked=4]="Linked",t[t.IndexedReferences=5]="IndexedReferences",t[t.Validated=6]="Validated",t})(re||{}),Ha=class{constructor(e){this.serviceRegistry=e.ServiceRegistry,this.textDocuments=e.workspace.TextDocuments,this.fileSystemProvider=e.workspace.FileSystemProvider}fromUri(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){let i=yield this.fileSystemProvider.readFile(e);return this.createAsync(e,i,r)})}fromTextDocument(e,r,n){return r=r??rt.parse(e.uri),W.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromString(e,r,n){return W.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromModel(e,r){return this.create(r,{$model:e})}create(e,r,n){if(typeof r=="string"){let i=this.parse(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else if("$model"in r){let i={value:r.$model,parserErrors:[],lexerErrors:[]};return this.createLangiumDocument(i,e)}else{let i=this.parse(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}createAsync(e,r,n){return P(this,null,function*(){if(typeof r=="string"){let i=yield this.parseAsync(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else{let i=yield this.parseAsync(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}})}createLangiumDocument(e,r,n,i){let s;if(n)s={parseResult:e,uri:r,state:re.Parsed,references:[],textDocument:n};else{let a=this.createTextDocumentGetter(r,i);s={parseResult:e,uri:r,state:re.Parsed,references:[],get textDocument(){return a()}}}return e.value.$document=s,s}update(e,r){return P(this,null,function*(){let n=e.parseResult.value.$cstNode?.root.fullText,i=this.textDocuments?.get(e.uri.toString()),s=i?i.getText():yield this.fileSystemProvider.readFile(e.uri);if(i)Object.defineProperty(e,"textDocument",{value:i});else{let a=this.createTextDocumentGetter(e.uri,s);Object.defineProperty(e,"textDocument",{get:a})}return n!==s&&(e.parseResult=yield this.parseAsync(e.uri,s,r),e.parseResult.value.$document=e),e.state=re.Parsed,e})}parse(e,r,n){return this.serviceRegistry.getServices(e).parser.LangiumParser.parse(r,n)}parseAsync(e,r,n){return this.serviceRegistry.getServices(e).parser.AsyncParser.parse(r,n)}createTextDocumentGetter(e,r){let n=this.serviceRegistry,i;return()=>i??(i=ds.create(e.toString(),n.getServices(e).LanguageMetaData.languageId,0,r??""))}},Ya=class{constructor(e){this.documentTrie=new hs,this.services=e,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.documentBuilder=()=>e.workspace.DocumentBuilder}get all(){return ee(this.documentTrie.all())}addDocument(e){let r=e.uri.toString();if(this.documentTrie.has(r))throw new Error(`A document with the URI '${r}' is already present.`);this.documentTrie.insert(r,e)}getDocument(e){let r=e.toString();return this.documentTrie.find(r)}getDocuments(e){let r=e.toString();return this.documentTrie.findAll(r)}getOrCreateDocument(e,r){return P(this,null,function*(){let n=this.getDocument(e);return n||(n=yield this.langiumDocumentFactory.fromUri(e,r),this.addDocument(n),n)})}createDocument(e,r,n){if(n)return this.langiumDocumentFactory.fromString(r,e,n).then(i=>(this.addDocument(i),i));{let i=this.langiumDocumentFactory.fromString(r,e);return this.addDocument(i),i}}hasDocument(e){return this.documentTrie.has(e.toString())}invalidateDocument(e){let r=e.toString(),n=this.documentTrie.find(r);return n&&this.documentBuilder().resetToState(n,re.Changed),n}deleteDocument(e){let r=e.toString(),n=this.documentTrie.find(r);return n&&(n.state=re.Changed,this.documentTrie.delete(r)),n}deleteDocuments(e){let r=e.toString(),n=this.documentTrie.findAll(r);for(let i of n)i.state=re.Changed;return this.documentTrie.delete(r),n}};var li=Symbol("RefResolving"),Xa=class{constructor(e){this.reflection=e.shared.AstReflection,this.langiumDocuments=()=>e.shared.workspace.LangiumDocuments,this.scopeProvider=e.references.ScopeProvider,this.astNodeLocator=e.workspace.AstNodeLocator,this.profiler=e.shared.profilers.LangiumProfiler,this.languageId=e.LanguageMetaData.languageId}link(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){if(this.profiler?.isActive("linking")){let i=this.profiler.createTask("linking",this.languageId);i.start();try{for(let s of St(e.parseResult.value))yield Me(r),sn(s).forEach(a=>{let o=`${s.$type}:${a.property}`;i.startSubTask(o);try{this.doLink(a,e)}finally{i.stopSubTask(o)}})}finally{i.stop()}}else for(let i of St(e.parseResult.value))yield Me(r),sn(i).forEach(s=>this.doLink(s,e))})}doLink(e,r){let n=e.reference;if("_ref"in n&&n._ref===void 0){n._ref=li;try{let i=this.getCandidate(e);if(bn(i))n._ref=i;else{n._nodeDescription=i;let s=this.loadAstNode(i);n._ref=s??this.createLinkingError(e,i)}}catch(i){console.error(`An error occurred while resolving reference to '${n.$refText}':`,i);let s=i.message??String(i);n._ref={info:e,message:`An error occurred while resolving reference to '${n.$refText}': ${s}`}}r.references.push(n)}else if("_items"in n&&n._items===void 0){n._items=li;try{let i=this.getCandidates(e),s=[];if(bn(i))n._linkingError=i;else for(let a of i){let o=this.loadAstNode(a);o&&s.push({ref:o,$nodeDescription:a})}n._items=s}catch(i){n._linkingError={info:e,message:`An error occurred while resolving reference to '${n.$refText}': ${i}`},n._items=[]}r.references.push(n)}}unlink(e){for(let r of e.references)"_ref"in r?(r._ref=void 0,delete r._nodeDescription):"_items"in r&&(r._items=void 0,delete r._linkingError);e.references=[]}getCandidate(e){return this.scopeProvider.getScope(e).getElement(e.reference.$refText)??this.createLinkingError(e)}getCandidates(e){let n=this.scopeProvider.getScope(e).getElements(e.reference.$refText).distinct(i=>`${i.documentUri}#${i.path}`).toArray();return n.length>0?n:this.createLinkingError(e)}buildReference(e,r,n,i){let s=this,a={$refNode:n,$refText:i,_ref:void 0,get ref(){if(Oe(this._ref))return this._ref;if(mu(this._nodeDescription)){let o=s.loadAstNode(this._nodeDescription);this._ref=o??s.createLinkingError({reference:a,container:e,property:r},this._nodeDescription)}else if(this._ref===void 0){this._ref=li;let o=$i(e).$document,c=s.getLinkedNode({reference:a,container:e,property:r});if(c.error&&o&&o.state0))return this._linkingError=s.createLinkingError({reference:a,container:e,property:r})}};return a}throwCyclicReferenceError(e,r,n){throw new Error(`Cyclic reference resolution detected: ${this.astNodeLocator.getAstNodePath(e)}/${r} (symbol '${n}')`)}getLinkedNode(e){try{let r=this.getCandidate(e);if(bn(r))return{error:r};let n=this.loadAstNode(r);return n?{node:n,descr:r}:{descr:r,error:this.createLinkingError(e,r)}}catch(r){console.error(`An error occurred while resolving reference to '${e.reference.$refText}':`,r);let n=r.message??String(r);return{error:{info:e,message:`An error occurred while resolving reference to '${e.reference.$refText}': ${n}`}}}}loadAstNode(e){if(e.node)return e.node;let r=this.langiumDocuments().getDocument(e.documentUri);if(r)return this.astNodeLocator.getAstNode(r.parseResult.value,e.path)}createLinkingError(e,r){let n=$i(e.container).$document;n&&n.statear(r)&&r.isMulti)}findDeclarations(e){if(e){let r=rf(e),n=e.astNode;if(r&&n){let i=n[r.feature];if(tt(i)||Ut(i))return Go(i);if(Array.isArray(i)){for(let s of i)if((tt(s)||Ut(s))&&s.$refNode&&s.$refNode.offset<=e.offset&&s.$refNode.end>=e.end)return Go(s)}}if(n){let i=this.nameProvider.getNameNode(n);if(i&&(i===e||Gu(e,i)))return this.getSelfNodes(n)}}return[]}getSelfNodes(e){if(this.hasMultiReference){let r=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e)),n=this.getNodeFromReferenceDescription(r.head());if(n){for(let i of sn(n))if(Ut(i.reference)&&i.reference.items.some(s=>s.ref===e))return i.reference.items.map(s=>s.ref)}return[e]}else return[e]}getNodeFromReferenceDescription(e){if(!e)return;let r=this.documents.getDocument(e.sourceUri);if(r)return this.nodeLocator.getAstNode(r.parseResult.value,e.sourcePath)}findDeclarationNodes(e){let r=this.findDeclarations(e),n=[];for(let i of r){let s=this.nameProvider.getNameNode(i)??i.$cstNode;s&&n.push(s)}return n}findReferences(e,r){let n=[];r.includeDeclaration&&n.push(...this.getSelfReferences(e));let i=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e));return r.documentUri&&(i=i.filter(s=>Be.equals(s.sourceUri,r.documentUri))),n.push(...i),ee(n)}getSelfReferences(e){let r=this.getSelfNodes(e),n=[];for(let i of r){let s=this.nameProvider.getNameNode(i);if(s){let a=yt(i),o=this.nodeLocator.getAstNodePath(i);n.push({sourceUri:a.uri,sourcePath:o,targetUri:a.uri,targetPath:o,segment:Wn(s),local:!0})}}return n}};var Rt=class{constructor(e){if(this.map=new Map,e)for(let[r,n]of e)this.add(r,n)}get size(){return Ei.sum(ee(this.map.values()).map(e=>e.length))}clear(){this.map.clear()}delete(e,r){if(r===void 0)return this.map.delete(e);{let n=this.map.get(e);if(n){let i=n.indexOf(r);if(i>=0)return n.length===1?this.map.delete(e):n.splice(i,1),!0}return!1}}get(e){return this.map.get(e)??[]}getStream(e){let r=this.map.get(e);return r?ee(r):nn}has(e,r){if(r===void 0)return this.map.has(e);{let n=this.map.get(e);return n?n.indexOf(r)>=0:!1}}add(e,r){return this.map.has(e)?this.map.get(e).push(r):this.map.set(e,[r]),this}addAll(e,r){return this.map.has(e)?this.map.get(e).push(...r):this.map.set(e,Array.from(r)),this}forEach(e){this.map.forEach((r,n)=>r.forEach(i=>e(i,n,this)))}[Symbol.iterator](){return this.entries().iterator()}entries(){return ee(this.map.entries()).flatMap(([e,r])=>r.map(n=>[e,n]))}keys(){return ee(this.map.keys())}values(){return ee(this.map.values()).flat()}entriesGroupedByKey(){return ee(this.map.entries())}},ui=class{get size(){return this.map.size}constructor(e){if(this.map=new Map,this.inverse=new Map,e)for(let[r,n]of e)this.set(r,n)}clear(){this.map.clear(),this.inverse.clear()}set(e,r){return this.map.set(e,r),this.inverse.set(r,e),this}get(e){return this.map.get(e)}getKey(e){return this.inverse.get(e)}delete(e){let r=this.map.get(e);return r!==void 0?(this.map.delete(e),this.inverse.delete(r),!0):!1}};var Za=class{constructor(e){this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider}collectExportedSymbols(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){return this.collectExportedSymbolsForNode(e.parseResult.value,e,void 0,r)})}collectExportedSymbolsForNode(s,a){return P(this,arguments,function*(e,r,n=Xs,i=W.CancellationToken.None){let o=[];this.addExportedSymbol(e,o,r);for(let c of n(e))yield Me(i),this.addExportedSymbol(c,o,r);return o})}addExportedSymbol(e,r,n){let i=this.nameProvider.getName(e);i&&r.push(this.descriptions.createDescription(e,i,n))}collectLocalSymbols(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){let i=e.parseResult.value,s=new Rt;for(let a of nr(i))yield Me(r),this.addLocalSymbol(a,e,s);return s})}addLocalSymbol(e,r,n){let i=e.$container;if(i){let s=this.nameProvider.getName(e);s&&n.add(i,this.descriptions.createDescription(e,s,r))}}};var ms=class{constructor(e,r,n){this.elements=e,this.outerScope=r,this.caseInsensitive=n?.caseInsensitive??!1,this.concatOuterScope=n?.concatOuterScope??!0}getAllElements(){return this.outerScope?this.elements.concat(this.outerScope.getAllElements()):this.elements}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.caseInsensitive?this.elements.find(i=>i.name.toLowerCase()===r):this.elements.find(i=>i.name===e);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getElements(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.caseInsensitive?this.elements.filter(i=>i.name.toLowerCase()===r):this.elements.filter(i=>i.name===e);return(this.concatOuterScope||n.isEmpty())&&this.outerScope?n.concat(this.outerScope.getElements(e)):n}},Ud=class{constructor(e,r,n){this.elements=new Map,this.caseInsensitive=n?.caseInsensitive??!1,this.concatOuterScope=n?.concatOuterScope??!0;for(let i of e){let s=this.caseInsensitive?i.name.toLowerCase():i.name;this.elements.set(s,i)}this.outerScope=r}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getElements(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r),i=n?[n]:[];return(this.concatOuterScope||i.length>0)&&this.outerScope?ee(i).concat(this.outerScope.getElements(e)):ee(i)}getAllElements(){let e=ee(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},eo=class{constructor(e,r,n){this.elements=new Rt,this.caseInsensitive=n?.caseInsensitive??!1,this.concatOuterScope=n?.concatOuterScope??!0;for(let i of e){let s=this.caseInsensitive?i.name.toLowerCase():i.name;this.elements.add(s,i)}this.outerScope=r}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r)[0];if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getElements(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r);return(this.concatOuterScope||n.length===0)&&this.outerScope?ee(n).concat(this.outerScope.getElements(e)):ee(n)}getAllElements(){let e=ee(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},QA={getElement(){},getElements(){return nn},getAllElements(){return nn}};var gs=class{constructor(){this.toDispose=[],this.isDisposed=!1}onDispose(e){this.toDispose.push(e)}dispose(){this.throwIfDisposed(),this.clear(),this.isDisposed=!0,this.toDispose.forEach(e=>e.dispose())}throwIfDisposed(){if(this.isDisposed)throw new Error("This cache has already been disposed")}},to=class extends gs{constructor(){super(...arguments),this.cache=new Map}has(e){return this.throwIfDisposed(),this.cache.has(e)}set(e,r){this.throwIfDisposed(),this.cache.set(e,r)}get(e,r){if(this.throwIfDisposed(),this.cache.has(e))return this.cache.get(e);if(r){let n=r();return this.cache.set(e,n),n}else return}delete(e){return this.throwIfDisposed(),this.cache.delete(e)}clear(){this.throwIfDisposed(),this.cache.clear()}},fi=class extends gs{constructor(e){super(),this.cache=new Map,this.converter=e??(r=>r)}has(e,r){return this.throwIfDisposed(),this.cacheForContext(e).has(r)}set(e,r,n){this.throwIfDisposed(),this.cacheForContext(e).set(r,n)}get(e,r,n){this.throwIfDisposed();let i=this.cacheForContext(e);if(i.has(r))return i.get(r);if(n){let s=n();return i.set(r,s),s}else return}delete(e,r){return this.throwIfDisposed(),this.cacheForContext(e).delete(r)}clear(e){if(this.throwIfDisposed(),e){let r=this.converter(e);this.cache.delete(r)}else this.cache.clear()}cacheForContext(e){let r=this.converter(e),n=this.cache.get(r);return n||(n=new Map,this.cache.set(r,n)),n}},ml=class extends fi{constructor(e,r){super(n=>n.toString()),r?(this.toDispose.push(e.workspace.DocumentBuilder.onDocumentPhase(r,n=>{this.clear(n.uri.toString())})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{for(let s of i)this.clear(s)}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{let s=n.concat(i);for(let a of s)this.clear(a)}))}},ys=class extends to{constructor(e,r){super(),r?(this.toDispose.push(e.workspace.DocumentBuilder.onBuildPhase(r,()=>{this.clear()})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{i.length>0&&this.clear()}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate(()=>{this.clear()}))}};var ro=class{constructor(e){this.reflection=e.shared.AstReflection,this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider,this.indexManager=e.shared.workspace.IndexManager,this.globalScopeCache=new ys(e.shared)}getScope(e){let r=[],n=this.reflection.getReferenceType(e),i=yt(e.container).localSymbols;if(i){let a=e.container;do i.has(a)&&r.push(i.getStream(a).filter(o=>this.reflection.isSubtype(o.type,n))),a=a.$container;while(a)}let s=this.getGlobalScope(n,e);for(let a=r.length-1;a>=0;a--)s=this.createScope(r[a],s);return s}createScope(e,r,n){return new ms(ee(e),r,n)}createScopeForNodes(e,r,n){let i=ee(e).map(s=>{let a=this.nameProvider.getName(s);if(a)return this.descriptions.createDescription(s,a)}).nonNullable();return new ms(i,r,n)}getGlobalScope(e,r){return this.globalScopeCache.get(e,()=>new eo(this.indexManager.allElements(e)))}};function qd(t){return typeof t.$comment=="string"}function iy(t){return typeof t=="object"&&!!t&&("$ref"in t||"$error"in t)}var no=class{constructor(e){this.ignoreProperties=new Set(["$container","$containerProperty","$containerIndex","$document","$cstNode"]),this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider,this.commentProvider=e.documentation.CommentProvider}serialize(e,r){let n=r??{},i=r?.replacer,s=(o,c)=>this.replacer(o,c,n),a=i?(o,c)=>i(o,c,s):s;try{return this.currentDocument=yt(e),JSON.stringify(e,a,r?.space)}finally{this.currentDocument=void 0}}deserialize(e,r){let n=r??{},i=JSON.parse(e);return this.linkNode(i,i,n),i}replacer(e,r,{refText:n,sourceText:i,textRegions:s,comments:a,uriConverter:o}){if(!this.ignoreProperties.has(e))if(tt(r)){let c=r.ref,l=n?r.$refText:void 0;if(c){let u=yt(c),p="";this.currentDocument&&this.currentDocument!==u&&(o?p=o(u.uri,c):p=u.uri.toString());let h=this.astNodeLocator.getAstNodePath(c);return{$ref:`${p}#${h}`,$refText:l}}else return{$error:r.error?.message??"Could not resolve reference",$refText:l}}else if(Ut(r)){let c=n?r.$refText:void 0,l=[];for(let u of r.items){let p=u.ref,h=yt(u.ref),g="";this.currentDocument&&this.currentDocument!==h&&(o?g=o(h.uri,p):g=h.uri.toString());let C=this.astNodeLocator.getAstNodePath(p);l.push(`${g}#${C}`)}return{$refs:l,$refText:c}}else if(Oe(r)){let c;if(s&&(c=this.addAstNodeRegionWithAssignmentsTo(ge({},r)),(!e||r.$document)&&c?.$textRegion&&(c.$textRegion.documentURI=this.currentDocument?.uri.toString())),i&&!e&&(c??(c=ge({},r)),c.$sourceText=r.$cstNode?.text),a){c??(c=ge({},r));let l=this.commentProvider.getComment(r);l&&(c.$comment=l.replace(/\r/g,""))}return c??r}else return r}addAstNodeRegionWithAssignmentsTo(e){let r=n=>({offset:n.offset,end:n.end,length:n.length,range:n.range});if(e.$cstNode){let n=e.$textRegion=r(e.$cstNode),i=n.assignments={};return Object.keys(e).filter(s=>!s.startsWith("$")).forEach(s=>{let a=Qu(e.$cstNode,s).map(r);a.length!==0&&(i[s]=a)}),e}}linkNode(e,r,n,i,s,a){for(let[c,l]of Object.entries(e))if(Array.isArray(l))for(let u=0;uP(this,null,function*(){yield this.handleException(()=>e.call(r,n,i,s),"An error occurred during validation",i,n)})}handleException(e,r,n,i){return P(this,null,function*(){try{yield e()}catch(s){if(Sr(s))throw s;console.error(`${r}:`,s),s instanceof Error&&s.stack&&console.error(s.stack);let a=s instanceof Error?s.message:String(s);n("error",`${r}: ${a}`,{node:i})}})}addEntry(e,r){if(e==="AstNode"){this.entries.add("AstNode",r);return}for(let n of this.reflection.getAllSubTypes(e))this.entries.add(n,r)}getChecks(e,r){let n=ee(this.entries.get(e)).concat(this.entries.get("AstNode"));return r&&(n=n.filter(i=>r.includes(i.category))),n.map(i=>i.check)}registerBeforeDocument(e,r=this){this.entriesBefore.push(this.wrapPreparationException(e,"An error occurred during set-up of the validation",r))}registerAfterDocument(e,r=this){this.entriesAfter.push(this.wrapPreparationException(e,"An error occurred during tear-down of the validation",r))}wrapPreparationException(e,r,n){return(i,s,a,o)=>P(this,null,function*(){yield this.handleException(()=>e.call(n,i,s,a,o),r,s,i)})}get checksBefore(){return this.entriesBefore}get checksAfter(){return this.entriesAfter}getAllValidationCategories(e){return this.knownCategories}};var sy=Object.freeze({validateNode:!0,validateChildren:!0}),ao=class{constructor(e){this.validationRegistry=e.validation.ValidationRegistry,this.metadata=e.LanguageMetaData,this.profiler=e.shared.profilers.LangiumProfiler,this.languageId=e.LanguageMetaData.languageId}validateDocument(i){return P(this,arguments,function*(e,r={},n=W.CancellationToken.None){let s=e.parseResult,a=[];if(yield Me(n),(!r.categories||r.categories.includes("built-in"))&&(this.processLexingErrors(s,a,r),r.stopAfterLexingErrors&&a.some(o=>o.data?.code===lr.LexingError)||(this.processParsingErrors(s,a,r),r.stopAfterParsingErrors&&a.some(o=>o.data?.code===lr.ParsingError))||(this.processLinkingErrors(e,a,r),r.stopAfterLinkingErrors&&a.some(o=>o.data?.code===lr.LinkingError))))return a;try{a.push(...yield this.validateAst(s.value,r,n))}catch(o){if(Sr(o))throw o;console.error("An error occurred during validation:",o)}return yield Me(n),a})}processLexingErrors(e,r,n){let i=[...e.lexerErrors,...e.lexerReport?.diagnostics??[]];for(let s of i){let a=s.severity??"error",o={severity:yl(a),range:{start:{line:s.line-1,character:s.column-1},end:{line:s.line-1,character:s.column+s.length-1}},message:s.message,data:oy(a),source:this.getSource()};r.push(o)}}processParsingErrors(e,r,n){for(let i of e.parserErrors){let s;if(isNaN(i.token.startOffset)){if("previousToken"in i){let a=i.previousToken;if(isNaN(a.startOffset)){let o={line:0,character:0};s={start:o,end:o}}else{let o={line:a.endLine-1,character:a.endColumn};s={start:o,end:o}}}}else s=Pi(i.token);if(s){let a={severity:yl("error"),range:s,message:i.message,data:di(lr.ParsingError),source:this.getSource()};r.push(a)}}}processLinkingErrors(e,r,n){for(let i of e.references){let s=i.error;if(s){let a={node:s.info.container,range:i.$refNode?.range,property:s.info.property,index:s.info.index,data:{code:lr.LinkingError,containerType:s.info.container.$type,property:s.info.property,refText:s.info.reference.$refText}};r.push(this.toDiagnostic("error",s.message,a))}}}validateAst(i,s){return P(this,arguments,function*(e,r,n=W.CancellationToken.None){let a=[],o=(c,l,u)=>{a.push(this.toDiagnostic(c,l,u))};return yield this.validateAstBefore(e,r,o,n),yield this.validateAstNodes(e,r,o,n),yield this.validateAstAfter(e,r,o,n),a})}validateAstBefore(s,a,o){return P(this,arguments,function*(e,r,n,i=W.CancellationToken.None){let c=this.validationRegistry.checksBefore;for(let l of c)yield Me(i),yield l(e,n,r.categories??[],i)})}validateAstNodes(s,a,o){return P(this,arguments,function*(e,r,n,i=W.CancellationToken.None){if(this.profiler?.isActive("validating")){let c=this.profiler.createTask("validating",this.languageId);c.start();try{let l=St(e).iterator();for(let u of l){c.startSubTask(u.$type);let p=this.validateSingleNodeOptions(u,r);if(p.validateNode)try{let h=this.validationRegistry.getChecks(u.$type,r.categories);for(let g of h)yield g(u,n,i)}finally{c.stopSubTask(u.$type)}p.validateChildren||l.prune()}}finally{c.stop()}}else{let c=St(e).iterator();for(let l of c){yield Me(i);let u=this.validateSingleNodeOptions(l,r);if(u.validateNode){let p=this.validationRegistry.getChecks(l.$type,r.categories);for(let h of p)yield h(l,n,i)}u.validateChildren||c.prune()}}})}validateSingleNodeOptions(e,r){return sy}validateAstAfter(s,a,o){return P(this,arguments,function*(e,r,n,i=W.CancellationToken.None){let c=this.validationRegistry.checksAfter;for(let l of c)yield Me(i),yield l(e,n,r.categories??[],i)})}toDiagnostic(e,r,n){return{message:r,range:ay(n),severity:yl(e),code:n.code,codeDescription:n.codeDescription,tags:n.tags,relatedInformation:n.relatedInformation,data:n.data,source:this.getSource()}}getSource(){return this.metadata.languageId}};function ay(t){if(t.range)return t.range;let e;return typeof t.property=="string"?e=pa(t.node.$cstNode,t.property,t.index):typeof t.keyword=="string"&&(e=ef(t.node.$cstNode,t.keyword,t.index)),e??(e=t.node.$cstNode),e?e.range:{start:{line:0,character:0},end:{line:0,character:0}}}function yl(t){switch(t){case"error":return 1;case"warning":return 2;case"info":return 3;case"hint":return 4;default:throw new Error("Invalid diagnostic severity: "+t)}}function oy(t){switch(t){case"error":return di(lr.LexingError);case"warning":return di(lr.LexingWarning);case"info":return di(lr.LexingInfo);case"hint":return di(lr.LexingHint);default:throw new Error("Invalid diagnostic severity: "+t)}}var lr=(function(t){return t.LexingError="lexing-error",t.LexingWarning="lexing-warning",t.LexingInfo="lexing-info",t.LexingHint="lexing-hint",t.ParsingError="parsing-error",t.LinkingError="linking-error",t})(lr||{});var oo=class{constructor(e){this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider}createDescription(e,r,n){let i=n??yt(e);r??(r=this.nameProvider.getName(e));let s=this.astNodeLocator.getAstNodePath(e);if(!r)throw new Error(`Node at path ${s} has no name.`);let a,o=()=>a??(a=Wn(this.nameProvider.getNameNode(e)??e.$cstNode));return{node:e,name:r,get nameSegment(){return o()},selectionSegment:Wn(e.$cstNode),type:e.$type,documentUri:i.uri,path:s}}},co=class{constructor(e){this.nodeLocator=e.workspace.AstNodeLocator}createDescriptions(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){let i=[],s=e.parseResult.value;for(let a of St(s))yield Me(r),sn(a).forEach(o=>{o.reference.error||i.push(...this.createInfoDescriptions(o))});return i})}createInfoDescriptions(e){let r=e.reference;if(r.error||!r.$refNode)return[];let n=[];tt(r)&&r.$nodeDescription?n=[r.$nodeDescription]:Ut(r)&&(n=r.items.map(c=>c.$nodeDescription).filter(c=>c!==void 0));let i=yt(e.container).uri,s=this.nodeLocator.getAstNodePath(e.container),a=[],o=Wn(r.$refNode);for(let c of n)a.push({sourceUri:i,sourcePath:s,targetUri:c.documentUri,targetPath:c.path,segment:o,local:Be.equals(c.documentUri,i)});return a}};var lo=class{constructor(){this.segmentSeparator="/",this.indexSeparator="@"}getAstNodePath(e){if(e.$container){let r=this.getAstNodePath(e.$container),n=this.getPathSegment(e);return r+this.segmentSeparator+n}return""}getPathSegment({$containerProperty:e,$containerIndex:r}){if(!e)throw new Error("Missing '$containerProperty' in AST node.");return r!==void 0?e+this.indexSeparator+r:e}getAstNode(e,r){return r.split(this.segmentSeparator).reduce((i,s)=>{if(!i||s.length===0)return i;let a=s.indexOf(this.indexSeparator);if(a>0){let o=s.substring(0,a),c=parseInt(s.substring(a+1));return i[o]?.[c]}return i[s]},e)}};var we={};ae(we,du(ci(),1));var uo=class{constructor(e){this._ready=new It,this.onConfigurationSectionUpdateEmitter=new we.Emitter,this.settings={},this.workspaceConfig=!1,this.serviceRegistry=e.ServiceRegistry}get ready(){return this._ready.promise}initialize(e){this.workspaceConfig=e.capabilities.workspace?.configuration??!1}initialized(e){return P(this,null,function*(){if(this.workspaceConfig){if(e.register){let r=this.serviceRegistry.all;e.register({section:r.map(n=>this.toSectionName(n.LanguageMetaData.languageId))})}if(e.fetchConfiguration){let r=this.serviceRegistry.all.map(i=>({section:this.toSectionName(i.LanguageMetaData.languageId)})),n=yield e.fetchConfiguration(r);r.forEach((i,s)=>{this.updateSectionConfiguration(i.section,n[s])})}}this._ready.resolve()})}updateConfiguration(e){typeof e.settings!="object"||e.settings===null||Object.entries(e.settings).forEach(([r,n])=>{this.updateSectionConfiguration(r,n),this.onConfigurationSectionUpdateEmitter.fire({section:r,configuration:n})})}updateSectionConfiguration(e,r){this.settings[e]=r}getConfiguration(e,r){return P(this,null,function*(){yield this.ready;let n=this.toSectionName(e);if(this.settings[n])return this.settings[n][r]})}toSectionName(e){return`${e}`}get onConfigurationSectionUpdate(){return this.onConfigurationSectionUpdateEmitter.event}};var Ps=du(Ix(),1);var Cn;(function(t){function e(r){return{dispose:()=>P(null,null,function*(){return yield r()})}}t.create=e})(Cn||(Cn={}));var xo=class{constructor(e){this.updateBuildOptions={validation:{categories:["built-in","fast"]}},this.updateListeners=[],this.buildPhaseListeners=new Rt,this.documentPhaseListeners=new Rt,this.buildState=new Map,this.documentBuildWaiters=new Map,this.currentState=re.Changed,this.langiumDocuments=e.workspace.LangiumDocuments,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.textDocuments=e.workspace.TextDocuments,this.indexManager=e.workspace.IndexManager,this.fileSystemProvider=e.workspace.FileSystemProvider,this.workspaceManager=()=>e.workspace.WorkspaceManager,this.serviceRegistry=e.ServiceRegistry}build(i){return P(this,arguments,function*(e,r={},n=W.CancellationToken.None){for(let s of e){let a=s.uri.toString();if(s.state===re.Validated){if(typeof r.validation=="boolean"&&r.validation)this.resetToState(s,re.IndexedReferences);else if(typeof r.validation=="object"){let o=this.findMissingValidationCategories(s,r);o.length>0&&(this.buildState.set(a,{completed:!1,options:{validation:{categories:o}},result:this.buildState.get(a)?.result}),s.state=re.IndexedReferences)}}else this.buildState.delete(a)}this.currentState=re.Changed,yield this.emitUpdate(e.map(s=>s.uri),[]),yield this.buildDocuments(e,r,n)})}update(i,s){return P(this,arguments,function*(e,r,n=W.CancellationToken.None){this.currentState=re.Changed;let a=[];for(let u of r){let p=this.langiumDocuments.deleteDocuments(u);for(let h of p)a.push(h.uri),this.cleanUpDeleted(h)}let o=(yield Promise.all(e.map(u=>this.findChangedUris(u)))).flat();for(let u of o){let p=this.langiumDocuments.getDocument(u);p===void 0&&(p=this.langiumDocumentFactory.fromModel({$type:"INVALID"},u),p.state=re.Changed,this.langiumDocuments.addDocument(p)),this.resetToState(p,re.Changed)}let c=ee(o).concat(a).map(u=>u.toString()).toSet();this.langiumDocuments.all.filter(u=>!c.has(u.uri.toString())&&this.shouldRelink(u,c)).forEach(u=>this.resetToState(u,re.ComputedScopes)),yield this.emitUpdate(o,a),yield Me(n);let l=this.sortDocuments(this.langiumDocuments.all.filter(u=>u.state=1}findMissingValidationCategories(e,r){let n=this.buildState.get(e.uri.toString()),i=this.serviceRegistry.getServices(e.uri).validation.ValidationRegistry.getAllValidationCategories(e),s=n?.result?.validationChecks?new Set(n?.result?.validationChecks):n?.completed?i:new Set,a=r===void 0||r.validation===!0?i:typeof r.validation=="object"?r.validation.categories??i:[];return ee(a).filter(o=>!s.has(o)).toArray()}findChangedUris(e){return P(this,null,function*(){if(this.langiumDocuments.getDocument(e)??this.textDocuments?.get(e))return[e];try{let n=yield this.fileSystemProvider.stat(e);if(n.isDirectory)return yield this.workspaceManager().searchFolder(e);if(this.workspaceManager().shouldIncludeEntry(n))return[e]}catch(n){}return[]})}emitUpdate(e,r){return P(this,null,function*(){yield Promise.all(this.updateListeners.map(n=>n(e,r)))})}sortDocuments(e){let r=0,n=e.length-1;for(;r=0&&!this.hasTextDocument(e[n]);)n--;rn.error!==void 0)?!0:this.indexManager.isAffected(e,r)}onUpdate(e){return this.updateListeners.push(e),Cn.create(()=>{let r=this.updateListeners.indexOf(e);r>=0&&this.updateListeners.splice(r,1)})}resetToState(e,r){switch(r){case re.Changed:case re.Parsed:this.indexManager.removeContent(e.uri);case re.IndexedContent:e.localSymbols=void 0;case re.ComputedScopes:this.serviceRegistry.getServices(e.uri).references.Linker.unlink(e);case re.Linked:this.indexManager.removeReferences(e.uri);case re.IndexedReferences:e.diagnostics=void 0,this.buildState.delete(e.uri.toString());case re.Validated:}e.state>r&&(e.state=r)}cleanUpDeleted(e){this.buildState.delete(e.uri.toString()),this.indexManager.remove(e.uri),e.state=re.Changed}buildDocuments(e,r,n){return P(this,null,function*(){this.prepareBuild(e,r),yield this.runCancelable(e,re.Parsed,n,a=>this.langiumDocumentFactory.update(a,n)),yield this.runCancelable(e,re.IndexedContent,n,a=>this.indexManager.updateContent(a,n)),yield this.runCancelable(e,re.ComputedScopes,n,a=>P(this,null,function*(){let o=this.serviceRegistry.getServices(a.uri).references.ScopeComputation;a.localSymbols=yield o.collectLocalSymbols(a,n)}));let i=e.filter(a=>this.shouldLink(a));yield this.runCancelable(i,re.Linked,n,a=>this.serviceRegistry.getServices(a.uri).references.Linker.link(a,n)),yield this.runCancelable(i,re.IndexedReferences,n,a=>this.indexManager.updateReferences(a,n));let s=e.filter(a=>this.shouldValidate(a)?!0:(this.markAsCompleted(a),!1));yield this.runCancelable(s,re.Validated,n,a=>P(this,null,function*(){yield this.validate(a,n),this.markAsCompleted(a)}))})}markAsCompleted(e){let r=this.buildState.get(e.uri.toString());r&&(r.completed=!0)}prepareBuild(e,r){for(let n of e){let i=n.uri.toString(),s=this.buildState.get(i);(!s||s.completed)&&this.buildState.set(i,{completed:!1,options:r,result:s?.result})}}runCancelable(e,r,n,i){return P(this,null,function*(){for(let a of e)a.statea.state===r);yield this.notifyBuildPhase(s,r,n),this.currentState=r})}onBuildPhase(e,r){return this.buildPhaseListeners.add(e,r),Cn.create(()=>{this.buildPhaseListeners.delete(e,r)})}onDocumentPhase(e,r){return this.documentPhaseListeners.add(e,r),Cn.create(()=>{this.documentPhaseListeners.delete(e,r)})}waitUntil(e,r,n){let i;return r&&"path"in r?i=r:n=r,n??(n=W.CancellationToken.None),i?this.awaitDocumentState(e,i,n):this.awaitBuilderState(e,n)}awaitDocumentState(e,r,n){let i=this.langiumDocuments.getDocument(r);if(i){if(i.state>=e)return Promise.resolve(r);if(n.isCancellationRequested)return Promise.reject(Yt);if(this.currentState>=e&&e>i.state)return Promise.reject(new Ps.ResponseError(Ps.LSPErrorCodes.RequestFailed,`Document state of ${r.toString()} is ${re[i.state]}, requiring ${re[e]}, but workspace state is already ${re[this.currentState]}. Returning undefined.`))}else return Promise.reject(new Ps.ResponseError(Ps.LSPErrorCodes.ServerCancelled,`No document found for URI: ${r.toString()}`));return new Promise((s,a)=>{let o=this.onDocumentPhase(e,l=>{Be.equals(l.uri,r)&&(o.dispose(),c.dispose(),s(l.uri))}),c=n.onCancellationRequested(()=>{o.dispose(),c.dispose(),a(Yt)})})}awaitBuilderState(e,r){return this.currentState>=e?Promise.resolve():r.isCancellationRequested?Promise.reject(Yt):new Promise((n,i)=>{let s=this.onBuildPhase(e,()=>{s.dispose(),a.dispose(),n()}),a=r.onCancellationRequested(()=>{s.dispose(),a.dispose(),i(Yt)})})}notifyDocumentPhase(e,r,n){return P(this,null,function*(){let s=this.documentPhaseListeners.get(r).slice();for(let a of s)try{yield Me(n),yield a(e,n)}catch(o){if(!Sr(o))throw o}})}notifyBuildPhase(e,r,n){return P(this,null,function*(){if(e.length===0)return;let s=this.buildPhaseListeners.get(r).slice();for(let a of s)yield Me(n),yield a(e,n)})}shouldLink(e){return this.getBuildOptions(e).eagerLinking??!0}shouldValidate(e){return!!this.getBuildOptions(e).validation}validate(e,r){return P(this,null,function*(){let n=this.serviceRegistry.getServices(e.uri).validation.DocumentValidator,i=this.getBuildOptions(e),s=typeof i.validation=="object"?ge({},i.validation):{};s.categories=this.findMissingValidationCategories(e,i);let a=yield n.validateDocument(e,s,r);e.diagnostics?e.diagnostics.push(...a):e.diagnostics=a;let o=this.buildState.get(e.uri.toString());o&&(o.result??(o.result={}),o.result.validationChecks?o.result.validationChecks=ee(o.result.validationChecks).concat(s.categories).distinct().toArray():o.result.validationChecks=[...s.categories])})}getBuildOptions(e){return this.buildState.get(e.uri.toString())?.options??{}}};var vo=class{constructor(e){this.symbolIndex=new Map,this.symbolByTypeIndex=new fi,this.referenceIndex=new Map,this.documents=e.workspace.LangiumDocuments,this.serviceRegistry=e.ServiceRegistry,this.astReflection=e.AstReflection}findAllReferences(e,r){let n=yt(e).uri,i=[];return this.referenceIndex.forEach(s=>{s.forEach(a=>{Be.equals(a.targetUri,n)&&a.targetPath===r&&i.push(a)})}),ee(i)}allElements(e,r){let n=ee(this.symbolIndex.keys());return r&&(n=n.filter(i=>!r||r.has(i))),n.map(i=>this.getFileDescriptions(i,e)).flat()}getFileDescriptions(e,r){return r?this.symbolByTypeIndex.get(e,r,()=>(this.symbolIndex.get(e)??[]).filter(s=>this.astReflection.isSubtype(s.type,r))):this.symbolIndex.get(e)??[]}remove(e){this.removeContent(e),this.removeReferences(e)}removeContent(e){let r=e.toString();this.symbolIndex.delete(r),this.symbolByTypeIndex.clear(r)}removeReferences(e){let r=e.toString();this.referenceIndex.delete(r)}updateContent(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){let s=yield this.serviceRegistry.getServices(e.uri).references.ScopeComputation.collectExportedSymbols(e,r),a=e.uri.toString();this.symbolIndex.set(a,s),this.symbolByTypeIndex.clear(a)})}updateReferences(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){let s=yield this.serviceRegistry.getServices(e.uri).workspace.ReferenceDescriptionProvider.createDescriptions(e,r);this.referenceIndex.set(e.uri.toString(),s)})}isAffected(e,r){let n=this.referenceIndex.get(e.uri.toString());return n?n.some(i=>!i.local&&r.has(i.targetUri.toString())):!1}};var Eo=class{constructor(e){this.initialBuildOptions={},this._ready=new It,this.serviceRegistry=e.ServiceRegistry,this.langiumDocuments=e.workspace.LangiumDocuments,this.documentBuilder=e.workspace.DocumentBuilder,this.fileSystemProvider=e.workspace.FileSystemProvider,this.mutex=e.workspace.WorkspaceLock}get ready(){return this._ready.promise}get workspaceFolders(){return this.folders}initialize(e){this.folders=e.workspaceFolders??void 0}initialized(e){return this.mutex.write(r=>this.initializeWorkspace(this.folders??[],r))}initializeWorkspace(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){let i=yield this.performStartup(e);yield Me(r),yield this.documentBuilder.build(i,this.initialBuildOptions,r)})}performStartup(e){return P(this,null,function*(){let r=[],n=a=>{r.push(a),this.langiumDocuments.hasDocument(a.uri)||this.langiumDocuments.addDocument(a)};yield this.loadAdditionalDocuments(e,n);let i=[];yield Promise.all(e.map(a=>this.getRootFolder(a)).map(a=>P(this,null,function*(){return this.traverseFolder(a,i)})));let s=ee(i).distinct(a=>a.toString()).filter(a=>!this.langiumDocuments.hasDocument(a));return yield this.loadWorkspaceDocuments(s,n),this._ready.resolve(),r})}loadWorkspaceDocuments(e,r){return P(this,null,function*(){yield Promise.all(e.map(n=>P(this,null,function*(){let i=yield this.langiumDocuments.getOrCreateDocument(n);r(i)})))})}loadAdditionalDocuments(e,r){return Promise.resolve()}getRootFolder(e){return rt.parse(e.uri)}traverseFolder(e,r){return P(this,null,function*(){try{let n=yield this.fileSystemProvider.readDirectory(e);yield Promise.all(n.map(i=>P(this,null,function*(){this.shouldIncludeEntry(i)&&(i.isDirectory?yield this.traverseFolder(i.uri,r):i.isFile&&r.push(i.uri))})))}catch(n){console.error("Failure to read directory content of "+e.toString(!0),n)}})}searchFolder(e){return P(this,null,function*(){let r=[];return yield this.traverseFolder(e,r),r})}shouldIncludeEntry(e){let r=Be.basename(e.uri);return r.startsWith(".")?!1:e.isDirectory?r!=="node_modules"&&r!=="out":e.isFile?this.serviceRegistry.hasServices(e.uri):!1}};var Ao=class{buildUnexpectedCharactersMessage(e,r,n,i,s){return ji.buildUnexpectedCharactersMessage(e,r,n,i,s)}buildUnableToPopLexerModeMessage(e){return ji.buildUnableToPopLexerModeMessage(e)}},Xl={mode:"full"},gi=class{constructor(e){this.errorMessageProvider=e.parser.LexerErrorMessageProvider,this.tokenBuilder=e.parser.TokenBuilder;let r=this.tokenBuilder.buildTokens(e.Grammar,{caseInsensitive:e.LanguageMetaData.caseInsensitive});this.tokenTypes=this.toTokenTypeDictionary(r);let n=oh(r)?Object.values(r):r,i=e.LanguageMetaData.mode==="production";this.chevrotainLexer=new He(n,{positionTracking:"full",skipValidations:i,errorMessageProvider:this.errorMessageProvider})}get definition(){return this.tokenTypes}tokenize(e,r=Xl){let n=this.chevrotainLexer.tokenize(e);return{tokens:n.tokens,errors:n.errors,hidden:n.groups.hidden??[],report:this.tokenBuilder.flushLexingReport?.(e)}}toTokenTypeDictionary(e){if(oh(e))return e;let r=ch(e)?Object.values(e.modes).flat():e,n={};return r.forEach(i=>n[i.name]=i),n}};function Jl(t){return Array.isArray(t)&&(t.length===0||"name"in t[0])}function ch(t){return t&&"modes"in t&&"defaultMode"in t}function oh(t){return!Jl(t)&&!ch(t)}as();function fh(t,e,r){let n,i;typeof t=="string"?(i=e,n=r):(i=t.range.start,n=e),i||(i=ce.create(0,0));let s=Px(t),a=ph(n),o=U$({lines:s,position:i,options:a});return W$({index:0,tokens:o,position:i})}function dh(t,e){let r=ph(e),n=Px(t);if(n.length===0)return!1;let i=n[0],s=n[n.length-1],a=r.start,o=r.end;return!!a?.exec(i)&&!!o?.exec(s)}function Px(t){let e="";return typeof t=="string"?e=t:e=t.text,e.split(Wu)}var _x=/\s*(@([\p{L}][\p{L}\p{N}]*)?)/uy,G$=/\{(@[\p{L}][\p{L}\p{N}]*)(\s*)([^\r\n}]+)?\}/gu;function U$(t){let e=[],r=t.position.line,n=t.position.character;for(let i=0;i=o.length){if(e.length>0){let u=ce.create(r,n);e.push({type:"break",content:"",range:ie.create(u,u)})}}else{_x.lastIndex=c;let u=_x.exec(o);if(u){let p=u[0],h=u[1],g=ce.create(r,n+c),C=ce.create(r,n+c+p.length);e.push({type:"tag",content:h,range:ie.create(g,C)}),c+=p.length,c=uh(o,c)}if(c0&&e[e.length-1].type==="break"?e.slice(0,-1):e}function q$(t,e,r,n){let i=[];if(t.length===0){let s=ce.create(r,n),a=ce.create(r,n+e.length);i.push({type:"text",content:e,range:ie.create(s,a)})}else{let s=0;for(let o of t){let c=o.index,l=e.substring(s,c);l.length>0&&i.push({type:"text",content:e.substring(s,c),range:ie.create(ce.create(r,s+n),ce.create(r,c+n))});let u=l.length+1,p=o[1];if(i.push({type:"inline-tag",content:p,range:ie.create(ce.create(r,s+u+n),ce.create(r,s+u+p.length+n))}),u+=p.length,o.length===4){u+=o[2].length;let h=o[3];i.push({type:"text",content:h,range:ie.create(ce.create(r,s+u+n),ce.create(r,s+u+h.length+n))})}else i.push({type:"text",content:"",range:ie.create(ce.create(r,s+u+n),ce.create(r,s+u+n))});s=c+o[0].length}let a=e.substring(s);a.length>0&&i.push({type:"text",content:a,range:ie.create(ce.create(r,s+n),ce.create(r,s+n+a.length))})}return i}var z$=/\S/,j$=/\s*$/;function uh(t,e){let r=t.substring(e).match(z$);return r?e+r.index:t.length}function B$(t){let e=t.match(j$);if(e&&typeof e.index=="number")return e.index}function W$(t){let e=ce.create(t.position.line,t.position.character);if(t.tokens.length===0)return new Ql([],ie.create(e,e));let r=[];for(;t.indexr.name===e)}getTags(e){return this.getAllTags().filter(r=>r.name===e)}getAllTags(){return this.elements.filter(e=>"name"in e)}toString(){let e="";for(let r of this.elements)if(e.length===0)e=r.toString();else{let n=r.toString();e+=bx(e)+n}return e.trim()}toMarkdown(e){let r="";for(let n of this.elements)if(r.length===0)r=n.toMarkdown(e);else{let i=n.toMarkdown(e);r+=bx(r)+i}return r.trim()}},$o=class{constructor(e,r,n,i){this.name=e,this.content=r,this.inline=n,this.range=i}toString(){let e=`@${this.name}`,r=this.content.toString();return this.content.inlines.length===1?e=`${e} ${r}`:this.content.inlines.length>1&&(e=`${e} -${r}`),this.inline?`{${e}}`:e}toMarkdown(e){return e?.renderTag?.(this)??this.toMarkdownDefault(e)}toMarkdownDefault(e){let r=this.content.toMarkdown(e);if(this.inline){let s=Y$(this.name,r,e??{});if(typeof s=="string")return s}let n="";e?.tag==="italic"||e?.tag===void 0?n="*":e?.tag==="bold"?n="**":e?.tag==="bold-italic"&&(n="***");let i=`${n}@${this.name}${n}`;return this.content.inlines.length===1?i=`${i} \u2014 ${r}`:this.content.inlines.length>1&&(i=`${i} -${r}`),this.inline?`{${i}}`:i}};function Y$(t,e,r){if(t==="linkplain"||t==="linkcode"||t==="link"){let n=e.indexOf(" "),i=e;if(n>0){let a=uh(e,n);i=e.substring(a),e=e.substring(0,n)}return(t==="linkcode"||t==="link"&&r.link==="code")&&(i=`\`${i}\``),r.renderLink?.(e,i)??X$(e,i)}}function X$(t,e){try{return rt.parse(t,!0),`[${e}](${t})`}catch(r){return t}}var So=class{constructor(e,r){this.inlines=e,this.range=r}toString(){let e="";for(let r=0;rn.range.start.line&&(e+=` -`)}return e}toMarkdown(e){let r="";for(let n=0;ni.range.start.line&&(r+=` -`)}return r}},Zl=class{constructor(e,r){this.text=e,this.range=r}toString(){return this.text}toMarkdown(){return this.text}};function bx(t){return t.endsWith(` -`)?` -`:` - -`}var ko=class{constructor(e){this.indexManager=e.shared.workspace.IndexManager,this.commentProvider=e.documentation.CommentProvider}getDocumentation(e){let r=this.commentProvider.getComment(e);if(r&&dh(r))return fh(r).toMarkdown({renderLink:(i,s)=>this.documentationLinkRenderer(e,i,s),renderTag:i=>this.documentationTagRenderer(e,i)})}documentationLinkRenderer(e,r,n){let i=this.findNameInLocalSymbols(e,r)??this.findNameInGlobalScope(e,r);if(i&&i.nameSegment){let s=i.nameSegment.range.start.line+1,a=i.nameSegment.range.start.character+1,o=i.documentUri.with({fragment:`L${s},${a}`});return`[${n}](${o.toString()})`}else return}documentationTagRenderer(e,r){}findNameInLocalSymbols(e,r){let i=yt(e).localSymbols;if(!i)return;let s=e;do{let o=i.getStream(s).find(c=>c.name===r);if(o)return o;s=s.$container}while(s)}findNameInGlobalScope(e,r){return this.indexManager.allElements().find(i=>i.name===r)}};var No=class{constructor(e){this.grammarConfig=()=>e.parser.GrammarConfig}getComment(e){return qd(e)?e.$comment:Uu(e.$cstNode,this.grammarConfig().multilineCommentRules)?.text}};var Co=class{constructor(e){this.syncParser=e.parser.LangiumParser}parse(e,r){return Promise.resolve(this.syncParser.parse(e))}},hh=class{constructor(e){this.threadCount=8,this.terminationDelay=200,this.workerPool=[],this.queue=[],this.hydrator=e.serializer.Hydrator}initializeWorkers(){for(;this.workerPool.length{if(this.queue.length>0){let r=this.queue.shift();r&&(e.lock(),r.resolve(e))}}),this.workerPool.push(e)}}parse(e,r){return P(this,null,function*(){let n=yield this.acquireParserWorker(r),i=new It,s,a=r.onCancellationRequested(()=>{s=setTimeout(()=>{this.terminateWorker(n)},this.terminationDelay)});return n.parse(e).then(o=>{let c=this.hydrator.hydrate(o);i.resolve(c)}).catch(o=>{i.reject(o)}).finally(()=>{a.dispose(),clearTimeout(s)}),i.promise})}terminateWorker(e){e.terminate();let r=this.workerPool.indexOf(e);r>=0&&this.workerPool.splice(r,1)}acquireParserWorker(e){return P(this,null,function*(){this.initializeWorkers();for(let n of this.workerPool)if(n.ready)return n.lock(),n;let r=new It;return e.onCancellationRequested(()=>{let n=this.queue.indexOf(r);n>=0&&this.queue.splice(n,1),r.reject(Yt)}),this.queue.push(r),r.promise})}},mh=class{get ready(){return this._ready}get onReady(){return this.onReadyEmitter.event}constructor(e,r,n,i){this.onReadyEmitter=new we.Emitter,this.deferred=new It,this._ready=!0,this._parsing=!1,this.sendMessage=e,this._terminate=i,r(s=>{let a=s;this.deferred.resolve(a),this.unlock()}),n(s=>{this.deferred.reject(s),this.unlock()})}terminate(){this.deferred.reject(Yt),this._terminate()}lock(){this._ready=!1}unlock(){this._parsing=!1,this._ready=!0,this.onReadyEmitter.fire()}parse(e){if(this._parsing)throw new Error("Parser worker is busy");return this._parsing=!0,this.deferred=new It,this.sendMessage(e),this.deferred.promise}};var wo=class{constructor(){this.previousTokenSource=new W.CancellationTokenSource,this.writeQueue=[],this.readQueue=[],this.done=!0}write(e){this.cancelWrite();let r=pl();return this.previousTokenSource=r,this.enqueue(this.writeQueue,e,r.token)}read(e){return this.enqueue(this.readQueue,e)}enqueue(e,r,n=W.CancellationToken.None){let i=new It,s={action:r,deferred:i,cancellationToken:n};return e.push(s),this.performNextOperation(),i.promise}performNextOperation(){return P(this,null,function*(){if(!this.done)return;let e=[];if(this.writeQueue.length>0)e.push(this.writeQueue.shift());else if(this.readQueue.length>0)e.push(...this.readQueue.splice(0,this.readQueue.length));else return;this.done=!1,yield Promise.all(e.map(s=>P(this,[s],function*({action:r,deferred:n,cancellationToken:i}){try{let a=yield Promise.resolve().then(()=>r(i));n.resolve(a)}catch(a){Sr(a)?n.resolve(void 0):n.reject(a)}}))),this.done=!0,this.performNextOperation()})}cancelWrite(){this.previousTokenSource.cancel()}};var Io=class{constructor(e){this.grammarElementIdMap=new ui,this.tokenTypeIdMap=new ui,this.grammar=e.Grammar,this.lexer=e.parser.Lexer,this.linker=e.references.Linker}dehydrate(e){return{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport?this.dehydrateLexerReport(e.lexerReport):void 0,parserErrors:e.parserErrors.map(r=>er(ge({},r),{message:r.message})),value:this.dehydrateAstNode(e.value,this.createDehyrationContext(e.value))}}dehydrateLexerReport(e){return e}createDehyrationContext(e){let r=new Map,n=new Map;for(let i of St(e))r.set(i,{});if(e.$cstNode)for(let i of Bn(e.$cstNode))n.set(i,{});return{astNodes:r,cstNodes:n}}dehydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode!==void 0&&(n.$cstNode=this.dehydrateCstNode(e.$cstNode,r));for(let[i,s]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(s)){let a=[];n[i]=a;for(let o of s)Oe(o)?a.push(this.dehydrateAstNode(o,r)):tt(o)?a.push(this.dehydrateReference(o,r)):a.push(o)}else Oe(s)?n[i]=this.dehydrateAstNode(s,r):tt(s)?n[i]=this.dehydrateReference(s,r):s!==void 0&&(n[i]=s);return n}dehydrateReference(e,r){let n={};return n.$refText=e.$refText,e.$refNode&&(n.$refNode=r.cstNodes.get(e.$refNode)),n}dehydrateCstNode(e,r){let n=r.cstNodes.get(e);return Ys(e)?n.fullText=e.fullText:n.grammarSource=this.getGrammarElementId(e.grammarSource),n.hidden=e.hidden,n.astNode=r.astNodes.get(e.astNode),rr(e)?n.content=e.content.map(i=>this.dehydrateCstNode(i,r)):rn(e)&&(n.tokenType=e.tokenType.name,n.offset=e.offset,n.length=e.length,n.startLine=e.range.start.line,n.startColumn=e.range.start.character,n.endLine=e.range.end.line,n.endColumn=e.range.end.character),n}hydrate(e){let r=e.value,n=this.createHydrationContext(r);return"$cstNode"in r&&this.hydrateCstNode(r.$cstNode,n),{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport,parserErrors:e.parserErrors,value:this.hydrateAstNode(r,n)}}createHydrationContext(e){let r=new Map,n=new Map;for(let s of St(e))r.set(s,{});let i;if(e.$cstNode)for(let s of Bn(e.$cstNode)){let a;"fullText"in s?(a=new os(s.fullText),i=a):"content"in s?a=new si:"tokenType"in s&&(a=this.hydrateCstLeafNode(s)),a&&(n.set(s,a),a.root=i)}return{astNodes:r,cstNodes:n}}hydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode&&(n.$cstNode=r.cstNodes.get(e.$cstNode));for(let[i,s]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(s)){let a=[];n[i]=a;for(let o of s)Oe(o)?a.push(this.setParent(this.hydrateAstNode(o,r),n)):tt(o)?a.push(this.hydrateReference(o,n,i,r)):a.push(o)}else Oe(s)?n[i]=this.setParent(this.hydrateAstNode(s,r),n):tt(s)?n[i]=this.hydrateReference(s,n,i,r):s!==void 0&&(n[i]=s);return n}setParent(e,r){return e.$container=r,e}hydrateReference(e,r,n,i){return this.linker.buildReference(r,n,i.cstNodes.get(e.$refNode),e.$refText)}hydrateCstNode(e,r,n=0){let i=r.cstNodes.get(e);if(typeof e.grammarSource=="number"&&(i.grammarSource=this.getGrammarElement(e.grammarSource)),i.astNode=r.astNodes.get(e.astNode),rr(i))for(let s of e.content){let a=this.hydrateCstNode(s,r,n++);i.content.push(a)}return i}hydrateCstLeafNode(e){let r=this.getTokenType(e.tokenType),n=e.offset,i=e.length,s=e.startLine,a=e.startColumn,o=e.endLine,c=e.endColumn,l=e.hidden;return new ii(n,i,{start:{line:s,character:a},end:{line:o,character:c}},r,l)}getTokenType(e){return this.lexer.definition[e]}getGrammarElementId(e){if(e)return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.get(e)}getGrammarElement(e){return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.getKey(e)}createGrammarElementIdMap(){let e=0;for(let r of St(this.grammar))sa(r)&&this.grammarElementIdMap.set(r,e++)}};function gh(t){return{documentation:{CommentProvider:e=>new No(e),DocumentationProvider:e=>new ko(e)},parser:{AsyncParser:e=>new Co(e),GrammarConfig:e=>af(e),LangiumParser:e=>_d(e),CompletionParser:e=>Id(e),ValueConverter:()=>new oi,TokenBuilder:()=>new Jr,Lexer:e=>new gi(e),ParserErrorMessageProvider:()=>new cs,LexerErrorMessageProvider:()=>new Ao},workspace:{AstNodeLocator:()=>new lo,AstNodeDescriptionProvider:e=>new oo(e),ReferenceDescriptionProvider:e=>new co(e)},references:{Linker:e=>new Xa(e),NameProvider:()=>new Ja,ScopeProvider:e=>new ro(e),ScopeComputation:e=>new Za(e),References:e=>new Qa(e)},serializer:{Hydrator:e=>new Io(e),JsonSerializer:e=>new no(e)},validation:{DocumentValidator:e=>new ao(e),ValidationRegistry:e=>new so(e)},shared:()=>t.shared}}function yh(t){return{ServiceRegistry:e=>new io(e),workspace:{LangiumDocuments:e=>new Ya(e),LangiumDocumentFactory:e=>new Ha(e),DocumentBuilder:e=>new xo(e),IndexManager:e=>new vo(e),WorkspaceManager:e=>new Eo(e),FileSystemProvider:e=>t.fileSystemProvider(e),WorkspaceLock:()=>new wo,ConfigurationProvider:e=>new uo(e)},profilers:{}}}var Gx=(function(t){return t.merge=(e,r)=>_o(_o({},e),r),t})(Gx||{});function eu(t,e,r,n,i,s,a,o,c){let l=[t,e,r,n,i,s,a,o,c].reduce(_o,{});return zx(l)}var Ux=Symbol("isProxy");function qx(t){if(t&&t[Ux])for(let e of Object.values(t))qx(e);return t}function zx(t,e){let r=new Proxy({},{deleteProperty:()=>!1,set:()=>{throw new Error("Cannot set property on injected service container")},get:(n,i)=>i===Ux?!0:Fx(n,i,t,e||r),getOwnPropertyDescriptor:(n,i)=>(Fx(n,i,t,e||r),Object.getOwnPropertyDescriptor(n,i)),has:(n,i)=>i in t,ownKeys:()=>[...Object.getOwnPropertyNames(t)]});return r}var Mx=Symbol();function Fx(t,e,r,n){if(e in t){if(t[e]instanceof Error)throw new Error("Construction failure. Please make sure that your dependencies are constructable. Cause: "+t[e]);if(t[e]===Mx)throw new Error('Cycle detected. Please make "'+String(e)+'" lazy. Visit https://langium.org/docs/reference/configuration-services/#resolving-cyclic-dependencies');return t[e]}else if(e in r){let i=r[e];t[e]=Mx;try{t[e]=typeof i=="function"?i(n):zx(i,n)}catch(s){throw t[e]=s instanceof Error?s:void 0,s}return t[e]}else return}function _o(t,e){if(e){for(let[r,n]of Object.entries(e))if(n!=null)if(typeof n=="object"){let i=t[r];typeof i=="object"&&i!==null?t[r]=_o(i,n):t[r]=_o({},n)}else t[r]=n}return t}var Th={indentTokenName:"INDENT",dedentTokenName:"DEDENT",whitespaceTokenName:"WS",ignoreIndentationDelimiters:[]},Os=(function(t){return t.REGULAR="indentation-sensitive",t.IGNORE_INDENTATION="ignore-indentation",t})(Os||{}),tu=class extends Jr{constructor(e=Th){super(),this.indentationStack=[0],this.whitespaceRegExp=/[ \t]+/y,this.options=ge(ge({},Th),e),this.indentTokenType=mn({name:this.options.indentTokenName,pattern:this.indentMatcher.bind(this),line_breaks:!1}),this.dedentTokenType=mn({name:this.options.dedentTokenName,pattern:this.dedentMatcher.bind(this),line_breaks:!1})}buildTokens(e,r){let n=super.buildTokens(e,r);if(!Jl(n))throw new Error("Invalid tokens built by default builder");let{indentTokenName:i,dedentTokenName:s,whitespaceTokenName:a,ignoreIndentationDelimiters:o}=this.options,c,l,u,p=[];for(let h of n){for(let[g,C]of o)h.name===g?h.PUSH_MODE=Os.IGNORE_INDENTATION:h.name===C&&(h.POP_MODE=!0);h.name===s?c=h:h.name===i?l=h:h.name===a?u=h:p.push(h)}if(!c||!l||!u)throw new Error("Some indentation/whitespace tokens not found!");return o.length>0?{modes:{[Os.REGULAR]:[c,l,...p,u],[Os.IGNORE_INDENTATION]:[...p,u]},defaultMode:Os.REGULAR}:[c,l,u,...p]}flushLexingReport(e){let r=super.flushLexingReport(e);return er(ge({},r),{remainingDedents:this.flushRemainingDedents(e)})}isStartOfLine(e,r){return r===0||`\r -`.includes(e[r-1])}matchWhitespace(e,r,n,i){this.whitespaceRegExp.lastIndex=r;let s=this.whitespaceRegExp.exec(e);return{currIndentLevel:s?.[0].length??0,prevIndentLevel:this.indentationStack.at(-1),match:s}}createIndentationTokenInstance(e,r,n,i){let s=this.getLineNumber(r,i);return Kr(e,n,i,i+n.length,s,s,1,n.length)}getLineNumber(e,r){return e.substring(0,r).split(/\r\n|\r|\n/).length}indentMatcher(e,r,n,i){if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:s,prevIndentLevel:a,match:o}=this.matchWhitespace(e,r,n,i);return s<=a?null:(this.indentationStack.push(s),o)}dedentMatcher(e,r,n,i){if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:s,prevIndentLevel:a,match:o}=this.matchWhitespace(e,r,n,i);if(s>=a)return null;let c=this.indentationStack.lastIndexOf(s);if(c===-1)return this.diagnostics.push({severity:"error",message:`Invalid dedent level ${s} at offset: ${r}. Current indentation stack: ${this.indentationStack}`,offset:r,length:o?.[0]?.length??0,line:this.getLineNumber(e,r),column:1}),null;let l=this.indentationStack.length-c-1,u=e.substring(0,r).match(/[\r\n]+$/)?.[0].length??1;for(let p=0;p1;)r.push(this.createIndentationTokenInstance(this.dedentTokenType,e,"",e.length)),this.indentationStack.pop();return this.indentationStack=[0],r}},Rh=class extends gi{constructor(e){if(super(e),e.parser.TokenBuilder instanceof tu)this.indentationTokenBuilder=e.parser.TokenBuilder;else throw new Error("IndentationAwareLexer requires an accompanying IndentationAwareTokenBuilder")}tokenize(e,r=Xl){let n=super.tokenize(e),i=n.report;r?.mode==="full"&&n.tokens.push(...i.remainingDedents),i.remainingDedents=[];let{indentTokenType:s,dedentTokenType:a}=this.indentationTokenBuilder,o=s.tokenTypeIdx,c=a.tokenTypeIdx,l=[],u=n.tokens.length-1;for(let p=0;p=0&&l.push(n.tokens[u]),n.tokens=l,n}};var le={};en(le,{AstUtils:()=>Uo,BiMap:()=>ui,Cancellation:()=>W,ContextCache:()=>fi,CstUtils:()=>ac,DONE_RESULT:()=>gt,Deferred:()=>It,Disposable:()=>Cn,DisposableCache:()=>gs,DocumentCache:()=>ml,EMPTY_STREAM:()=>nn,ErrorWithLocation:()=>Vn,GrammarUtils:()=>dc,MultiMap:()=>Rt,OperationCancelled:()=>Yt,Reduction:()=>Ei,RegExpUtils:()=>lc,SimpleCache:()=>to,StreamImpl:()=>qt,TreeStreamImpl:()=>yr,URI:()=>rt,UriTrie:()=>hs,UriUtils:()=>Be,WorkspaceCache:()=>ys,assertCondition:()=>Yh,assertUnreachable:()=>Rr,delayNextTick:()=>Fd,interruptAndCheck:()=>Me,isOperationCancelled:()=>Sr,loadGrammarFromJson:()=>_r,setInterruptionPeriod:()=>Qg,startCancelableOperation:()=>pl,stream:()=>ee});ae(le,we);var ru=class{stat(e){throw new Error("No file system is available.")}statSync(e){throw new Error("No file system is available.")}exists(){return P(this,null,function*(){return!1})}existsSync(){return!1}readBinary(){throw new Error("No file system is available.")}readBinarySync(){throw new Error("No file system is available.")}readFile(){throw new Error("No file system is available.")}readFileSync(){throw new Error("No file system is available.")}readDirectory(){return P(this,null,function*(){return[]})}readDirectorySync(){return[]}},xh={fileSystemProvider:()=>new ru};var J$={Grammar:()=>{},LanguageMetaData:()=>({caseInsensitive:!1,fileExtensions:[".langium"],languageId:"langium"})},Q$={AstReflection:()=>new bi};function Z$(){let t=eu(yh(xh),Q$),e=eu(gh({shared:t}),J$);return t.ServiceRegistry.register(e),e}function _r(t){let e=Z$(),r=e.serializer.JsonSerializer.deserialize(t);return e.shared.workspace.LangiumDocumentFactory.fromModel(r,rt.parse(`memory:/${r.name??"grammar"}.langium`)),r}ae(qe,le);var vh=class{constructor(e){this.activeCategories=new Set,this.allCategories=new Set(["validating","parsing","linking"]),this.activeCategories=e??new Set(this.allCategories),this.records=new Rt}isActive(e){return this.activeCategories.has(e)}start(...e){e?e.forEach(r=>this.activeCategories.add(r)):this.activeCategories=new Set(this.allCategories)}stop(...e){e?e.forEach(r=>this.activeCategories.delete(r)):this.activeCategories.clear()}createTask(e,r){if(!this.isActive(e))throw new Error(`Category "${e}" is not active.`);return console.log(`Creating profiling task for '${e}.${r}'.`),new nu(n=>this.records.add(e,this.dumpRecord(e,n)),r)}dumpRecord(e,r){console.info(`Task ${e}.${r.identifier} executed in ${r.duration.toFixed(2)}ms and ended at ${r.date.toISOString()}`);let n=[];for(let a of r.entries.keys()){let o=r.entries.get(a),c=o.reduce((l,u)=>l+u);n.push({name:`${r.identifier}.${a}`,count:o.length,duration:c})}let i=r.duration-n.map(a=>a.duration).reduce((a,o)=>a+o,0);n.push({name:r.identifier,count:1,duration:i}),n.sort((a,o)=>o.duration-a.duration);function s(a){return Math.round(100*a)/100}return console.table(n.map(a=>({Element:a.name,Count:a.count,"Self %":s(100*a.duration/r.duration),"Time (ms)":s(a.duration)}))),r}getRecords(...e){return e.length===0?this.records.values():this.records.entries().filter(r=>e.some(n=>n===r[0])).flatMap(r=>r[1])}},nu=class{constructor(e,r){this.stack=[],this.entries=new Rt,this.addRecord=e,this.identifier=r}start(){if(this.startTime!==void 0)throw new Error(`Task "${this.identifier}" is already started.`);this.startTime=performance.now()}stop(){if(this.startTime===void 0)throw new Error(`Task "${this.identifier}" was not started.`);if(this.stack.length!==0)throw new Error(`Task "${this.identifier}" cannot be stopped before sub-task(s): ${this.stack.map(r=>r.id).join(", ")}.`);let e={identifier:this.identifier,date:new Date,duration:performance.now()-this.startTime,entries:this.entries};this.addRecord(e),this.startTime=void 0,this.entries.clear()}startSubTask(e){this.stack.push({id:e,start:performance.now(),content:0})}stopSubTask(e){let r=this.stack.pop();if(!r)throw new Error(`Task "${this.identifier}.${e}" was not started.`);if(r.id!==e)throw new Error(`Sub-Task "${r.id}" is not already stopped.`);let n=performance.now()-r.start;this.stack.at(-1)!==void 0&&(this.stack[this.stack.length-1].content+=n);let i=n-r.content;this.entries.add(e,i)}};var eS=Object.defineProperty,ne=(t,e)=>eS(t,"name",{value:e,configurable:!0}),Ch;(t=>{t.Terminals={ARROW_DIRECTION:/L|R|T|B/,ARROW_GROUP:/\{group\}/,ARROW_INTO:/<|>/,ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,ID:/[\w]([-\w]*\w)?/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/,ARCH_ICON:/\([\w-:]+\)/,ARCH_TITLE:/\[(?:"([^"\\]|\\.)*"|'([^'\\]|\\.)*'|[\w ]+)\]/}})(Ch||(Ch={}));var wh;(t=>{t.Terminals={ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,INT:/0|[1-9][0-9]*(?!\.)/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/,REFERENCE:/\w([-\./\w]*[-\w])?/}})(wh||(wh={}));var Ih;(t=>{t.Terminals={ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/}})(Ih||(Ih={}));var _h;(t=>{t.Terminals={ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,INT:/0|[1-9][0-9]*(?!\.)/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/}})(_h||(_h={}));var bh;(t=>{t.Terminals={NUMBER_PIE:/(?:-?[0-9]+\.[0-9]+(?!\.))|(?:-?(0|[1-9][0-9]*)(?!\.))/,ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/}})(bh||(bh={}));var Ph;(t=>{t.Terminals={GRATICULE:/circle|polygon/,BOOLEAN:/true|false/,ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,NUMBER:/(?:[0-9]+\.[0-9]+(?!\.))|(?:0|[1-9][0-9]*(?!\.))/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,ID:/[\w]([-\w]*\w)?/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/}})(Ph||(Ph={}));var Oh;(t=>{t.Terminals={ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,TREEMAP_KEYWORD:/treemap-beta|treemap/,CLASS_DEF:/classDef\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\s+([^;\r\n]*))?(?:;)?/,STYLE_SEPARATOR:/:::/,SEPARATOR:/:/,COMMA:/,/,INDENTATION:/[ \t]{1,}/,WS:/[ \t]+/,ML_COMMENT:/\%\%[^\n]*/,NL:/\r?\n/,ID2:/[a-zA-Z_][a-zA-Z0-9_]*/,NUMBER2:/[0-9_\.\,]+/,STRING2:/"[^"]*"|'[^']*'/}})(Oh||(Oh={}));var FL=ge(ge(ge(ge(ge(ge(ge({},Ch.Terminals),wh.Terminals),Ih.Terminals),_h.Terminals),bh.Terminals),Ph.Terminals),Oh.Terminals),Zr={$type:"Architecture",accDescr:"accDescr",accTitle:"accTitle",edges:"edges",groups:"groups",junctions:"junctions",services:"services",title:"title"};function tS(t){return fr.isInstance(t,Zr.$type)}ne(tS,"isArchitecture");var iu={$type:"Axis",label:"label",name:"name"},cu={$type:"Branch",name:"name",order:"order"};function rS(t){return fr.isInstance(t,cu.$type)}ne(rS,"isBranch");var jx={$type:"Checkout",branch:"branch"},su={$type:"CherryPicking",id:"id",parent:"parent",tags:"tags"},Eh={$type:"ClassDefStatement",className:"className",styleText:"styleText"},Fs={$type:"Commit",id:"id",message:"message",tags:"tags",type:"type"};function nS(t){return fr.isInstance(t,Fs.$type)}ne(nS,"isCommit");var au={$type:"Curve",entries:"entries",label:"label",name:"name"},Ls={$type:"Direction",accDescr:"accDescr",accTitle:"accTitle",dir:"dir",statements:"statements",title:"title"},br={$type:"Edge",lhsDir:"lhsDir",lhsGroup:"lhsGroup",lhsId:"lhsId",lhsInto:"lhsInto",rhsDir:"rhsDir",rhsGroup:"rhsGroup",rhsId:"rhsId",rhsInto:"rhsInto",title:"title"},Ah={$type:"Entry",axis:"axis",value:"value"},Ti={$type:"GitGraph",accDescr:"accDescr",accTitle:"accTitle",statements:"statements",title:"title"};function iS(t){return fr.isInstance(t,Ti.$type)}ne(iS,"isGitGraph");var bo={$type:"Group",icon:"icon",id:"id",in:"in",title:"title"},Oo={$type:"Info",accDescr:"accDescr",accTitle:"accTitle",title:"title"};function sS(t){return fr.isInstance(t,Oo.$type)}ne(sS,"isInfo");var Po={$type:"Item",classSelector:"classSelector",name:"name"},$h={$type:"Junction",id:"id",in:"in"},ou={$type:"Leaf",classSelector:"classSelector",name:"name",value:"value"},Gs={$type:"Merge",branch:"branch",id:"id",tags:"tags",type:"type"};function aS(t){return fr.isInstance(t,Gs.$type)}ne(aS,"isMerge");var Sh={$type:"Option",name:"name",value:"value"},Us={$type:"Packet",accDescr:"accDescr",accTitle:"accTitle",blocks:"blocks",title:"title"};function oS(t){return fr.isInstance(t,Us.$type)}ne(oS,"isPacket");var qs={$type:"PacketBlock",bits:"bits",end:"end",label:"label",start:"start"};function cS(t){return fr.isInstance(t,qs.$type)}ne(cS,"isPacketBlock");var Ri={$type:"Pie",accDescr:"accDescr",accTitle:"accTitle",sections:"sections",showData:"showData",title:"title"};function lS(t){return fr.isInstance(t,Ri.$type)}ne(lS,"isPie");var lu={$type:"PieSection",label:"label",value:"value"};function uS(t){return fr.isInstance(t,lu.$type)}ne(uS,"isPieSection");var yi={$type:"Radar",accDescr:"accDescr",accTitle:"accTitle",axes:"axes",curves:"curves",options:"options",title:"title"},kh={$type:"Section",classSelector:"classSelector",name:"name"},Ds={$type:"Service",icon:"icon",iconText:"iconText",id:"id",in:"in",title:"title"},Ms={$type:"Statement"},zs={$type:"Treemap",accDescr:"accDescr",accTitle:"accTitle",title:"title",TreemapRows:"TreemapRows"};function fS(t){return fr.isInstance(t,zs.$type)}ne(fS,"isTreemap");var Nh={$type:"TreemapRow",indent:"indent",item:"item"},Jx=class extends _n{constructor(){super(...arguments),this.types={Architecture:{name:Zr.$type,properties:{accDescr:{name:Zr.accDescr},accTitle:{name:Zr.accTitle},edges:{name:Zr.edges,defaultValue:[]},groups:{name:Zr.groups,defaultValue:[]},junctions:{name:Zr.junctions,defaultValue:[]},services:{name:Zr.services,defaultValue:[]},title:{name:Zr.title}},superTypes:[]},Axis:{name:iu.$type,properties:{label:{name:iu.label},name:{name:iu.name}},superTypes:[]},Branch:{name:cu.$type,properties:{name:{name:cu.name},order:{name:cu.order}},superTypes:[Ms.$type]},Checkout:{name:jx.$type,properties:{branch:{name:jx.branch}},superTypes:[Ms.$type]},CherryPicking:{name:su.$type,properties:{id:{name:su.id},parent:{name:su.parent},tags:{name:su.tags,defaultValue:[]}},superTypes:[Ms.$type]},ClassDefStatement:{name:Eh.$type,properties:{className:{name:Eh.className},styleText:{name:Eh.styleText}},superTypes:[]},Commit:{name:Fs.$type,properties:{id:{name:Fs.id},message:{name:Fs.message},tags:{name:Fs.tags,defaultValue:[]},type:{name:Fs.type}},superTypes:[Ms.$type]},Curve:{name:au.$type,properties:{entries:{name:au.entries,defaultValue:[]},label:{name:au.label},name:{name:au.name}},superTypes:[]},Direction:{name:Ls.$type,properties:{accDescr:{name:Ls.accDescr},accTitle:{name:Ls.accTitle},dir:{name:Ls.dir},statements:{name:Ls.statements,defaultValue:[]},title:{name:Ls.title}},superTypes:[Ti.$type]},Edge:{name:br.$type,properties:{lhsDir:{name:br.lhsDir},lhsGroup:{name:br.lhsGroup,defaultValue:!1},lhsId:{name:br.lhsId},lhsInto:{name:br.lhsInto,defaultValue:!1},rhsDir:{name:br.rhsDir},rhsGroup:{name:br.rhsGroup,defaultValue:!1},rhsId:{name:br.rhsId},rhsInto:{name:br.rhsInto,defaultValue:!1},title:{name:br.title}},superTypes:[]},Entry:{name:Ah.$type,properties:{axis:{name:Ah.axis,referenceType:iu.$type},value:{name:Ah.value}},superTypes:[]},GitGraph:{name:Ti.$type,properties:{accDescr:{name:Ti.accDescr},accTitle:{name:Ti.accTitle},statements:{name:Ti.statements,defaultValue:[]},title:{name:Ti.title}},superTypes:[]},Group:{name:bo.$type,properties:{icon:{name:bo.icon},id:{name:bo.id},in:{name:bo.in},title:{name:bo.title}},superTypes:[]},Info:{name:Oo.$type,properties:{accDescr:{name:Oo.accDescr},accTitle:{name:Oo.accTitle},title:{name:Oo.title}},superTypes:[]},Item:{name:Po.$type,properties:{classSelector:{name:Po.classSelector},name:{name:Po.name}},superTypes:[]},Junction:{name:$h.$type,properties:{id:{name:$h.id},in:{name:$h.in}},superTypes:[]},Leaf:{name:ou.$type,properties:{classSelector:{name:ou.classSelector},name:{name:ou.name},value:{name:ou.value}},superTypes:[Po.$type]},Merge:{name:Gs.$type,properties:{branch:{name:Gs.branch},id:{name:Gs.id},tags:{name:Gs.tags,defaultValue:[]},type:{name:Gs.type}},superTypes:[Ms.$type]},Option:{name:Sh.$type,properties:{name:{name:Sh.name},value:{name:Sh.value,defaultValue:!1}},superTypes:[]},Packet:{name:Us.$type,properties:{accDescr:{name:Us.accDescr},accTitle:{name:Us.accTitle},blocks:{name:Us.blocks,defaultValue:[]},title:{name:Us.title}},superTypes:[]},PacketBlock:{name:qs.$type,properties:{bits:{name:qs.bits},end:{name:qs.end},label:{name:qs.label},start:{name:qs.start}},superTypes:[]},Pie:{name:Ri.$type,properties:{accDescr:{name:Ri.accDescr},accTitle:{name:Ri.accTitle},sections:{name:Ri.sections,defaultValue:[]},showData:{name:Ri.showData,defaultValue:!1},title:{name:Ri.title}},superTypes:[]},PieSection:{name:lu.$type,properties:{label:{name:lu.label},value:{name:lu.value}},superTypes:[]},Radar:{name:yi.$type,properties:{accDescr:{name:yi.accDescr},accTitle:{name:yi.accTitle},axes:{name:yi.axes,defaultValue:[]},curves:{name:yi.curves,defaultValue:[]},options:{name:yi.options,defaultValue:[]},title:{name:yi.title}},superTypes:[]},Section:{name:kh.$type,properties:{classSelector:{name:kh.classSelector},name:{name:kh.name}},superTypes:[Po.$type]},Service:{name:Ds.$type,properties:{icon:{name:Ds.icon},iconText:{name:Ds.iconText},id:{name:Ds.id},in:{name:Ds.in},title:{name:Ds.title}},superTypes:[]},Statement:{name:Ms.$type,properties:{},superTypes:[]},Treemap:{name:zs.$type,properties:{accDescr:{name:zs.accDescr},accTitle:{name:zs.accTitle},title:{name:zs.title},TreemapRows:{name:zs.TreemapRows,defaultValue:[]}},superTypes:[]},TreemapRow:{name:Nh.$type,properties:{indent:{name:Nh.indent},item:{name:Nh.item}},superTypes:[]}}}static{ne(this,"MermaidAstReflection")}},fr=new Jx,Bx,dS=ne(()=>Bx??(Bx=_r(`{"$type":"Grammar","isDeclared":true,"name":"ArchitectureGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Architecture","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"architecture-beta"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"groups","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"services","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"junctions","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"edges","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]},"entry":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"LeftPort","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"lhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},"entry":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"RightPort","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"rhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Keyword","value":":"}]},"entry":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"Arrow","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Assignment","feature":"lhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"--"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]}},{"$type":"Keyword","value":"-"}]}]},{"$type":"Assignment","feature":"rhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"Group","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Service","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"service"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"iconText","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}],"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Junction","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"junction"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Edge","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"lhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"lhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"rhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"rhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"ARROW_DIRECTION","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"L"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"R"},"parenthesized":false}],"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"T"},"parenthesized":false}],"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"B"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_GROUP","definition":{"$type":"RegexToken","regex":"/\\\\{group\\\\}/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_INTO","definition":{"$type":"RegexToken","regex":"/<|>/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@18"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@19"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","name":"ARCH_ICON","definition":{"$type":"RegexToken","regex":"/\\\\([\\\\w-:]+\\\\)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TITLE","definition":{"$type":"RegexToken","regex":"/\\\\[(?:\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'|[\\\\w ]+)\\\\]/","parenthesized":false},"fragment":false,"hidden":false}],"interfaces":[],"types":[]}`)),"ArchitectureGrammarGrammar"),Wx,pS=ne(()=>Wx??(Wx=_r(`{"$type":"Grammar","isDeclared":true,"name":"GitGraphGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"GitGraph","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Keyword","value":":"}]},{"$type":"Keyword","value":"gitGraph:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Keyword","value":":"}]}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"Assignment","feature":"statements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Direction","definition":{"$type":"Assignment","feature":"dir","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"LR"},{"$type":"Keyword","value":"TB"},{"$type":"Keyword","value":"BT"}]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Commit","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"commit"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"msg:","cardinality":"?"},{"$type":"Assignment","feature":"message","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Branch","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"branch"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"order:"},{"$type":"Assignment","feature":"order","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Merge","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"merge"},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Checkout","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"checkout"},{"$type":"Keyword","value":"switch"}]},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"CherryPicking","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"cherry-pick"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"parent:"},{"$type":"Assignment","feature":"parent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@14"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","name":"REFERENCE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\\\w([-\\\\./\\\\w]*[-\\\\w])?/","parenthesized":false},"fragment":false,"hidden":false}],"interfaces":[],"types":[]}`)),"GitGraphGrammarGrammar"),Vx,hS=ne(()=>Vx??(Vx=_r(`{"$type":"Grammar","isDeclared":true,"name":"InfoGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Info","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"info"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"Keyword","value":"showInfo"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"?"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@7"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false}],"interfaces":[],"types":[]}`)),"InfoGrammarGrammar"),Kx,mS=ne(()=>Kx??(Kx=_r(`{"$type":"Grammar","isDeclared":true,"name":"PacketGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Packet","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"packet"},{"$type":"Keyword","value":"packet-beta"}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"PacketBlock","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"start","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"end","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"+"},{"$type":"Assignment","feature":"bits","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]}]},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@9"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false}],"interfaces":[],"types":[]}`)),"PacketGrammarGrammar"),Hx,gS=ne(()=>Hx??(Hx=_r(`{"$type":"Grammar","isDeclared":true,"name":"PieGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Pie","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"pie"},{"$type":"Assignment","feature":"showData","operator":"?=","terminal":{"$type":"Keyword","value":"showData"},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"PieSection","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"FLOAT_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/-?[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/-?(0|[1-9][0-9]*)(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@2"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@3"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@11"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@12"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false}],"interfaces":[],"types":[]}`)),"PieGrammarGrammar"),Yx,yS=ne(()=>Yx??(Yx=_r(`{"$type":"Grammar","isDeclared":true,"name":"RadarGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Radar","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":"radar-beta:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Keyword","value":"axis"},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"curve"},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"Label","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}},{"$type":"Keyword","value":"]"}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"Axis","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Curve","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"Entries","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"DetailedEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"axis","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"NumberEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Option","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"showLegend"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"ticks"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"max"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"min"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"graticule"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"GRATICULE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"circle"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"polygon"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@16"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false}],"interfaces":[{"$type":"Interface","name":"Entry","attributes":[{"$type":"TypeAttribute","name":"axis","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@2"}},"isMulti":false}},{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}],"superTypes":[]}],"types":[]}`)),"RadarGrammarGrammar"),Xx,TS=ne(()=>Xx??(Xx=_r(`{"$type":"Grammar","isDeclared":true,"name":"TreemapGrammar","rules":[{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","entry":true,"name":"Treemap","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Assignment","feature":"TreemapRows","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"TREEMAP_KEYWORD","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap-beta"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"CLASS_DEF","definition":{"$type":"RegexToken","regex":"/classDef\\\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\\\s+([^;\\\\r\\\\n]*))?(?:;)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STYLE_SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":::"},"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":"},"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"COMMA","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":","},"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INDENTATION","definition":{"$type":"RegexToken","regex":"/[ \\\\t]{1,}/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[ \\\\t]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"ML_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\%\\\\%[^\\\\n]*/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false},{"$type":"ParserRule","name":"TreemapRow","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"indent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"item","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ClassDef","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Item","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Section","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Leaf","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[],"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[],"cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"ID2","definition":{"$type":"RegexToken","regex":"/[a-zA-Z_][a-zA-Z0-9_]*/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER2","definition":{"$type":"RegexToken","regex":"/[0-9_\\\\.\\\\,]+/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"MyNumber","dataType":"number","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"STRING2","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/","parenthesized":false},"fragment":false,"hidden":false}],"interfaces":[{"$type":"Interface","name":"Item","attributes":[{"$type":"TypeAttribute","name":"name","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"classSelector","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]},{"$type":"Interface","name":"Section","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[]},{"$type":"Interface","name":"Leaf","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}]},{"$type":"Interface","name":"ClassDefStatement","attributes":[{"$type":"TypeAttribute","name":"className","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"styleText","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"Treemap","attributes":[{"$type":"TypeAttribute","name":"TreemapRows","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"imports":[],"types":[],"$comment":"/**\\n * Treemap grammar for Langium\\n * Converted from mindmap grammar\\n *\\n * The ML_COMMENT and NL hidden terminals handle whitespace, comments, and newlines\\n * before the treemap keyword, allowing for empty lines and comments before the\\n * treemap declaration.\\n */"}`)),"TreemapGrammarGrammar"),RS={languageId:"architecture",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},xS={languageId:"gitGraph",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},vS={languageId:"info",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},ES={languageId:"packet",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},AS={languageId:"pie",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},$S={languageId:"radar",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},SS={languageId:"treemap",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},UL={AstReflection:ne(()=>new Jx,"AstReflection")},qL={Grammar:ne(()=>dS(),"Grammar"),LanguageMetaData:ne(()=>RS,"LanguageMetaData"),parser:{}},zL={Grammar:ne(()=>pS(),"Grammar"),LanguageMetaData:ne(()=>xS,"LanguageMetaData"),parser:{}},jL={Grammar:ne(()=>hS(),"Grammar"),LanguageMetaData:ne(()=>vS,"LanguageMetaData"),parser:{}},BL={Grammar:ne(()=>mS(),"Grammar"),LanguageMetaData:ne(()=>ES,"LanguageMetaData"),parser:{}},WL={Grammar:ne(()=>gS(),"Grammar"),LanguageMetaData:ne(()=>AS,"LanguageMetaData"),parser:{}},VL={Grammar:ne(()=>yS(),"Grammar"),LanguageMetaData:ne(()=>$S,"LanguageMetaData"),parser:{}},KL={Grammar:ne(()=>TS(),"Grammar"),LanguageMetaData:ne(()=>SS,"LanguageMetaData"),parser:{}},kS=/accDescr(?:[\t ]*:([^\n\r]*)|\s*{([^}]*)})/,NS=/accTitle[\t ]*:([^\n\r]*)/,CS=/title([\t ][^\n\r]*|)/,wS={ACC_DESCR:kS,ACC_TITLE:NS,TITLE:CS},IS=class extends oi{static{ne(this,"AbstractMermaidValueConverter")}runConverter(t,e,r){let n=this.runCommonConverter(t,e,r);return n===void 0&&(n=this.runCustomConverter(t,e,r)),n===void 0?super.runConverter(t,e,r):n}runCommonConverter(t,e,r){let n=wS[t.name];if(n===void 0)return;let i=n.exec(e);if(i!==null){if(i[1]!==void 0)return i[1].trim().replace(/[\t ]{2,}/gm," ");if(i[2]!==void 0)return i[2].replace(/^\s*/gm,"").replace(/\s+$/gm,"").replace(/[\t ]{2,}/gm," ").replace(/[\n\r]{2,}/gm,` -`)}}},YL=class extends IS{static{ne(this,"CommonValueConverter")}runCustomConverter(t,e,r){}},_S=class extends Jr{static{ne(this,"AbstractMermaidTokenBuilder")}constructor(t){super(),this.keywords=new Set(t)}buildKeywordTokens(t,e,r){let n=super.buildKeywordTokens(t,e,r);return n.forEach(i=>{this.keywords.has(i.name)&&i.PATTERN!==void 0&&(i.PATTERN=new RegExp(i.PATTERN.toString()+"(?:(?=%%)|(?!\\S))"))}),n}},JL=class extends _S{static{ne(this,"CommonTokenBuilder")}};export{gh as a,yh as b,eu as c,xh as d,qe as e,ne as f,UL as g,qL as h,zL as i,jL as j,BL as k,WL as l,VL as m,KL as n,IS as o,YL as p,_S as q}; diff --git a/src/google/adk/cli/browser/chunk-3BJ4SYVH.js b/src/google/adk/cli/browser/chunk-NK4C5UIR.js similarity index 87% rename from src/google/adk/cli/browser/chunk-3BJ4SYVH.js rename to src/google/adk/cli/browser/chunk-NK4C5UIR.js index 64560a5914..c9900496b7 100644 --- a/src/google/adk/cli/browser/chunk-3BJ4SYVH.js +++ b/src/google/adk/cli/browser/chunk-NK4C5UIR.js @@ -1 +1 @@ -import{$a as l,Bb as c,Ca as r,Cb as u,Cc as M,Db as m,Ib as p,Lb as v,Pa as n,Yb as f,Zb as y,eb as d,fc as g,gc as h,hc as x,pd as _,qb as a,sb as s,wc as C}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function D(e,P){if(e&1&&(c(0,"section"),m(1,"audio",1),u()),e&2){let t=v(),o=x(0);f(t.theme.additionalStyles==null?null:t.theme.additionalStyles.AudioPlayer),y(t.theme.components.AudioPlayer),n(),p("src",o)}}var w=(()=>{class e extends _{url=M.required();resolvedUrl=C(()=>this.resolvePrimitive(this.url()));static \u0275fac=(()=>{let t;return function(i){return(t||(t=r(e)))(i||e)}})();static \u0275cmp=l({type:e,selectors:[["a2ui-audio"]],inputs:{url:[1,"url"]},features:[d],decls:2,vars:2,consts:[[3,"class","style"],["controls","",3,"src"]],template:function(o,i){if(o&1&&(g(0),a(1,D,2,5,"section",0)),o&2){let b=h(i.resolvedUrl());n(),s(b?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}audio[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return e})();export{w as Audio}; +import{$a as l,Bb as c,Ca as r,Cb as u,Cc as M,Db as m,Ib as p,Lb as v,Pa as n,Yb as f,Zb as y,eb as d,fc as g,gc as h,hc as x,pd as _,qb as a,sb as s,wc as C}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function D(e,P){if(e&1&&(c(0,"section"),m(1,"audio",1),u()),e&2){let t=v(),o=x(0);f(t.theme.additionalStyles==null?null:t.theme.additionalStyles.AudioPlayer),y(t.theme.components.AudioPlayer),n(),p("src",o)}}var w=(()=>{class e extends _{url=M.required();resolvedUrl=C(()=>this.resolvePrimitive(this.url()));static \u0275fac=(()=>{let t;return function(i){return(t||(t=r(e)))(i||e)}})();static \u0275cmp=l({type:e,selectors:[["a2ui-audio"]],inputs:{url:[1,"url"]},features:[d],decls:2,vars:2,consts:[[3,"class","style"],["controls","",3,"src"]],template:function(o,i){if(o&1&&(g(0),a(1,D,2,5,"section",0)),o&2){let b=h(i.resolvedUrl());n(),s(b?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}audio[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return e})();export{w as Audio}; diff --git a/src/google/adk/cli/browser/chunk-NMKTPNXE.js b/src/google/adk/cli/browser/chunk-NMKTPNXE.js deleted file mode 100644 index 7bf7241223..0000000000 --- a/src/google/adk/cli/browser/chunk-NMKTPNXE.js +++ /dev/null @@ -1 +0,0 @@ -import{a as x}from"./chunk-GP6TCC26.js";import{F as d}from"./chunk-QFMJV7VH.js";import{a as o,g as i}from"./chunk-JRNAXTJ7.js";import{h as p}from"./chunk-RMXJBC7V.js";var l=p(x(),1);var c=i((r,t)=>{let e=r.append("rect");if(e.attr("x",t.x),e.attr("y",t.y),e.attr("fill",t.fill),e.attr("stroke",t.stroke),e.attr("width",t.width),e.attr("height",t.height),t.name&&e.attr("name",t.name),t.rx&&e.attr("rx",t.rx),t.ry&&e.attr("ry",t.ry),t.attrs!==void 0)for(let s in t.attrs)e.attr(s,t.attrs[s]);return t.class&&e.attr("class",t.class),e},"drawRect"),f=i((r,t)=>{let e={x:t.startx,y:t.starty,width:t.stopx-t.startx,height:t.stopy-t.starty,fill:t.fill,stroke:t.stroke,class:"rect"};c(r,e).lower()},"drawBackgroundRect"),h=i((r,t)=>{let e=t.text.replace(d," "),s=r.append("text");s.attr("x",t.x),s.attr("y",t.y),s.attr("class","legend"),s.style("text-anchor",t.anchor),t.class&&s.attr("class",t.class);let a=s.append("tspan");return a.attr("x",t.x+t.textMargin*2),a.text(e),s},"drawText"),w=i((r,t,e,s)=>{let a=r.append("image");a.attr("x",t),a.attr("y",e);let n=(0,l.sanitizeUrl)(s);a.attr("xlink:href",n)},"drawImage"),k=i((r,t,e,s)=>{let a=r.append("use");a.attr("x",t),a.attr("y",e);let n=(0,l.sanitizeUrl)(s);a.attr("xlink:href",`#${n}`)},"drawEmbeddedImage"),v=i(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),E=i(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj"),R=i(()=>{let r=o(".mermaidTooltip");return r.empty()&&(r=o("body").append("div").attr("class","mermaidTooltip").style("opacity",0).style("position","absolute").style("text-align","center").style("max-width","200px").style("padding","2px").style("font-size","12px").style("background","#ffffde").style("border","1px solid #333").style("border-radius","2px").style("pointer-events","none").style("z-index","100")),r},"createTooltip");export{c as a,f as b,h as c,w as d,k as e,v as f,E as g,R as h}; diff --git a/src/google/adk/cli/browser/chunk-NQKWI5EB.js b/src/google/adk/cli/browser/chunk-NQKWI5EB.js deleted file mode 100644 index b6ea2fa5ce..0000000000 --- a/src/google/adk/cli/browser/chunk-NQKWI5EB.js +++ /dev/null @@ -1 +0,0 @@ -import{a as o,b as c,c as t,d as n,e as k,f as e,g as i,k as u,p as d,q as l}from"./chunk-NALL4A3P.js";var m=class extends l{static{e(this,"PacketTokenBuilder")}constructor(){super(["packet"])}},v={parser:{TokenBuilder:e(()=>new m,"TokenBuilder"),ValueConverter:e(()=>new d,"ValueConverter")}};function p(s=n){let r=t(c(s),i),a=t(o({shared:r}),u,v);return r.ServiceRegistry.register(a),{shared:r,Packet:a}}e(p,"createPacketServices");export{v as a,p as b}; diff --git a/src/google/adk/cli/browser/chunk-PM3FQFTD.js b/src/google/adk/cli/browser/chunk-PM3FQFTD.js deleted file mode 100644 index 86263463ff..0000000000 --- a/src/google/adk/cli/browser/chunk-PM3FQFTD.js +++ /dev/null @@ -1,30 +0,0 @@ -import{a as K}from"./chunk-DMWOYWYQ.js";import{a as Q}from"./chunk-T3Q3QCCV.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{a as q}from"./chunk-TPDTRWWV.js";import{k as H,l as J}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{N as M,R as P,S as R,T as I,U as L,V as N,W as B,X as U,Y as V,r as W}from"./chunk-QFMJV7VH.js";import{K as C,N as j,g as o,i as g,r as Z}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{j as O}from"./chunk-RMXJBC7V.js";var X=W.pie,D={sections:new Map,showData:!1,config:X},f=D.sections,y=D.showData,se=structuredClone(X),ce=o(()=>structuredClone(se),"getConfig"),de=o(()=>{f=new Map,y=D.showData,P()},"clear"),pe=o(({label:e,value:a})=>{if(a<0)throw new Error(`"${e}" has invalid value: ${a}. Negative values are not allowed in pie charts. All slice values must be >= 0.`);f.has(e)||(f.set(e,a),g.debug(`added new section: ${e}, with value: ${a}`))},"addSection"),ge=o(()=>f,"getSections"),fe=o(e=>{y=e},"setShowData"),ue=o(()=>y,"getShowData"),Y={getConfig:ce,clear:de,setDiagramTitle:B,getDiagramTitle:U,setAccTitle:R,getAccTitle:I,setAccDescription:L,getAccDescription:N,addSection:pe,getSections:ge,setShowData:fe,getShowData:ue},me=o((e,a)=>{K(e,a),a.setShowData(e.showData),e.sections.map(a.addSection)},"populateDb"),he={parse:o(e=>O(null,null,function*(){let a=yield Q("pie",e);g.debug(a),me(a,Y)}),"parse")},ve=o(e=>` - .pieCircle{ - stroke: ${e.pieStrokeColor}; - stroke-width : ${e.pieStrokeWidth}; - opacity : ${e.pieOpacity}; - } - .pieOuterCircle{ - stroke: ${e.pieOuterStrokeColor}; - stroke-width: ${e.pieOuterStrokeWidth}; - fill: none; - } - .pieTitleText { - text-anchor: middle; - font-size: ${e.pieTitleTextSize}; - fill: ${e.pieTitleTextColor}; - font-family: ${e.fontFamily}; - } - .slice { - font-family: ${e.fontFamily}; - fill: ${e.pieSectionTextColor}; - font-size:${e.pieSectionTextSize}; - // fill: white; - } - .legend text { - fill: ${e.pieLegendTextColor}; - font-family: ${e.fontFamily}; - font-size: ${e.pieLegendTextSize}; - } -`,"getStyles"),Se=ve,xe=o(e=>{let a=[...e.values()].reduce((r,l)=>r+l,0),$=[...e.entries()].map(([r,l])=>({label:r,value:l})).filter(r=>r.value/a*100>=1).sort((r,l)=>l.value-r.value);return j().value(r=>r.value)($)},"createPieArcs"),we=o((e,a,$,T)=>{g.debug(`rendering pie chart -`+e);let r=T.db,l=V(),A=J(r.getConfig(),l.pie),b=40,n=18,d=4,s=450,u=s,m=q(a),c=m.append("g");c.attr("transform","translate("+u/2+","+s/2+")");let{themeVariables:i}=l,[E]=H(i.pieOuterStrokeWidth);E??=2;let _=A.textPosition,p=Math.min(u,s)/2-b,ee=C().innerRadius(0).outerRadius(p),te=C().innerRadius(p*_).outerRadius(p*_);c.append("circle").attr("cx",0).attr("cy",0).attr("r",p+E/2).attr("class","pieOuterCircle");let h=r.getSections(),ae=xe(h),re=[i.pie1,i.pie2,i.pie3,i.pie4,i.pie5,i.pie6,i.pie7,i.pie8,i.pie9,i.pie10,i.pie11,i.pie12],v=0;h.forEach(t=>{v+=t});let k=ae.filter(t=>(t.data.value/v*100).toFixed(0)!=="0"),S=Z(re);c.selectAll("mySlices").data(k).enter().append("path").attr("d",ee).attr("fill",t=>S(t.data.label)).attr("class","pieCircle"),c.selectAll("mySlices").data(k).enter().append("text").text(t=>(t.data.value/v*100).toFixed(0)+"%").attr("transform",t=>"translate("+te.centroid(t)+")").style("text-anchor","middle").attr("class","slice"),c.append("text").text(r.getDiagramTitle()).attr("x",0).attr("y",-(s-50)/2).attr("class","pieTitleText");let z=[...h.entries()].map(([t,w])=>({label:t,value:w})),x=c.selectAll(".legend").data(z).enter().append("g").attr("class","legend").attr("transform",(t,w)=>{let G=n+d,oe=G*z.length/2,le=12*n,ne=w*G-oe;return"translate("+le+","+ne+")"});x.append("rect").attr("width",n).attr("height",n).style("fill",t=>S(t.label)).style("stroke",t=>S(t.label)),x.append("text").attr("x",n+d).attr("y",n-d).text(t=>r.getShowData()?`${t.label} [${t.value}]`:t.label);let ie=Math.max(...x.selectAll("text").nodes().map(t=>t?.getBoundingClientRect().width??0)),F=u+b+n+d+ie;m.attr("viewBox",`0 0 ${F} ${s}`),M(m,s,F,A.useMaxWidth)},"draw"),Ce={draw:we},_e={parser:he,db:Y,renderer:Ce,styles:Se};export{_e as diagram}; diff --git a/src/google/adk/cli/browser/chunk-6CJBO2JX.js b/src/google/adk/cli/browser/chunk-PR5T53UC.js similarity index 97% rename from src/google/adk/cli/browser/chunk-6CJBO2JX.js rename to src/google/adk/cli/browser/chunk-PR5T53UC.js index d57ba36891..de6da3695c 100644 --- a/src/google/adk/cli/browser/chunk-6CJBO2JX.js +++ b/src/google/adk/cli/browser/chunk-PR5T53UC.js @@ -1 +1 @@ -import{$a as f,$b as M,Bb as s,Ca as g,Cb as m,Cc as l,Ib as d,Kb as y,Pa as u,Yb as T,Zb as r,_b as I,eb as D,ob as v,pd as N,wc as o}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var S=(()=>{class i extends N{value=l.required();enableDate=l.required();enableTime=l.required();inputId=super.getUniqueId("a2ui-datetime-input");inputType=o(()=>{let t=this.enableDate(),n=this.enableTime();return t&&n?"datetime-local":t?"date":n?"time":"datetime-local"});label=o(()=>{let t=this.inputType();return t==="date"?"Date":t==="time"?"Time":"Date & Time"});inputValue=o(()=>{let t=this.inputType(),n=super.resolvePrimitive(this.value())||"",e=n?new Date(n):null;if(!e||isNaN(e.getTime()))return"";let p=this.padNumber(e.getFullYear()),a=this.padNumber(e.getMonth()),c=this.padNumber(e.getDate()),b=this.padNumber(e.getHours()),h=this.padNumber(e.getMinutes());return t==="date"?`${p}-${a}-${c}`:t==="time"?`${b}:${h}`:`${p}-${a}-${c}T${b}:${h}`});handleInput(t){let n=this.value()?.path;!(t.target instanceof HTMLInputElement)||!n||this.processor.setData(this.component(),n,t.target.value,this.surfaceId())}padNumber(t){return t.toString().padStart(2,"0")}static \u0275fac=(()=>{let t;return function(e){return(t||(t=g(i)))(e||i)}})();static \u0275cmp=f({type:i,selectors:[["a2ui-datetime-input"]],inputs:{value:[1,"value"],enableDate:[1,"enableDate"],enableTime:[1,"enableTime"]},features:[D],decls:4,vars:13,consts:[[3,"for"],["autocomplete","off",3,"input","id","value"]],template:function(n,e){n&1&&(s(0,"section")(1,"label",0),I(2),m(),s(3,"input",1),y("input",function(a){return e.handleInput(a)}),m()()),n&2&&(r(e.theme.components.DateTimeInput.container),u(),r(e.theme.components.DateTimeInput.label),d("htmlFor",e.inputId),u(),M(e.label()),u(),T(e.theme.additionalStyles==null?null:e.theme.additionalStyles.DateTimeInput),r(e.theme.components.DateTimeInput.element),d("id",e.inputId)("value",e.inputValue()),v("type",e.inputType()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}input[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return i})();export{S as DatetimeInput}; +import{$a as f,$b as M,Bb as s,Ca as g,Cb as m,Cc as l,Ib as d,Kb as y,Pa as u,Yb as T,Zb as r,_b as I,eb as D,ob as v,pd as N,wc as o}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var S=(()=>{class i extends N{value=l.required();enableDate=l.required();enableTime=l.required();inputId=super.getUniqueId("a2ui-datetime-input");inputType=o(()=>{let t=this.enableDate(),n=this.enableTime();return t&&n?"datetime-local":t?"date":n?"time":"datetime-local"});label=o(()=>{let t=this.inputType();return t==="date"?"Date":t==="time"?"Time":"Date & Time"});inputValue=o(()=>{let t=this.inputType(),n=super.resolvePrimitive(this.value())||"",e=n?new Date(n):null;if(!e||isNaN(e.getTime()))return"";let p=this.padNumber(e.getFullYear()),a=this.padNumber(e.getMonth()),c=this.padNumber(e.getDate()),b=this.padNumber(e.getHours()),h=this.padNumber(e.getMinutes());return t==="date"?`${p}-${a}-${c}`:t==="time"?`${b}:${h}`:`${p}-${a}-${c}T${b}:${h}`});handleInput(t){let n=this.value()?.path;!(t.target instanceof HTMLInputElement)||!n||this.processor.setData(this.component(),n,t.target.value,this.surfaceId())}padNumber(t){return t.toString().padStart(2,"0")}static \u0275fac=(()=>{let t;return function(e){return(t||(t=g(i)))(e||i)}})();static \u0275cmp=f({type:i,selectors:[["a2ui-datetime-input"]],inputs:{value:[1,"value"],enableDate:[1,"enableDate"],enableTime:[1,"enableTime"]},features:[D],decls:4,vars:13,consts:[[3,"for"],["autocomplete","off",3,"input","id","value"]],template:function(n,e){n&1&&(s(0,"section")(1,"label",0),I(2),m(),s(3,"input",1),y("input",function(a){return e.handleInput(a)}),m()()),n&2&&(r(e.theme.components.DateTimeInput.container),u(),r(e.theme.components.DateTimeInput.label),d("htmlFor",e.inputId),u(),M(e.label()),u(),T(e.theme.additionalStyles==null?null:e.theme.additionalStyles.DateTimeInput),r(e.theme.components.DateTimeInput.element),d("id",e.inputId)("value",e.inputValue()),v("type",e.inputType()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}input[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return i})();export{S as DatetimeInput}; diff --git a/src/google/adk/cli/browser/chunk-PRKFGJVH.js b/src/google/adk/cli/browser/chunk-PRKFGJVH.js deleted file mode 100644 index 84a9cfab56..0000000000 --- a/src/google/adk/cli/browser/chunk-PRKFGJVH.js +++ /dev/null @@ -1 +0,0 @@ -function Y(a,t,s){if(a&&a.length){let[e,n]=t,o=Math.PI/180*s,r=Math.cos(o),h=Math.sin(o);for(let i of a){let[l,c]=i;i[0]=(l-e)*r-(c-n)*h+e,i[1]=(l-e)*h+(c-n)*r+n}}}function zt(a,t){return a[0]===t[0]&&a[1]===t[1]}function Wt(a,t,s,e=1){let n=s,o=Math.max(t,.1),r=a[0]&&a[0][0]&&typeof a[0][0]=="number"?[a]:a,h=[0,0];if(n)for(let l of r)Y(l,h,n);let i=(function(l,c,d){let p=[];for(let M of l){let m=[...M];zt(m[0],m[m.length-1])||m.push([m[0][0],m[0][1]]),m.length>2&&p.push(m)}let u=[];c=Math.max(c,.1);let f=[];for(let M of p)for(let m=0;mM.yminm.ymin?1:M.xm.x?1:M.ymax===m.ymax?0:(M.ymax-m.ymax)/Math.abs(M.ymax-m.ymax)),!f.length)return u;let g=[],k=f[0].ymin,b=0;for(;g.length||f.length;){if(f.length){let M=-1;for(let m=0;mk);m++)M=m;f.splice(0,M+1).forEach(m=>{g.push({s:k,edge:m})})}if(g=g.filter(M=>!(M.edge.ymax<=k)),g.sort((M,m)=>M.edge.x===m.edge.x?0:(M.edge.x-m.edge.x)/Math.abs(M.edge.x-m.edge.x)),(d!==1||b%c==0)&&g.length>1)for(let M=0;M=g.length)break;let P=g[M].edge,x=g[m].edge;u.push([[Math.round(P.x),k],[Math.round(x.x),k]])}k+=d,g.forEach(M=>{M.edge.x=M.edge.x+d*M.edge.islope}),b++}return u})(r,o,e);if(n){for(let l of r)Y(l,h,-n);(function(l,c,d){let p=[];l.forEach(u=>p.push(...u)),Y(p,c,d)})(i,h,-n)}return i}function F(a,t){var s;let e=t.hachureAngle+90,n=t.hachureGap;n<0&&(n=4*t.strokeWidth),n=Math.round(Math.max(n,.1));let o=1;return t.roughness>=1&&(((s=t.randomizer)===null||s===void 0?void 0:s.next())||Math.random())>.7&&(o=n),Wt(a,n,e,o||1)}var q=class{constructor(t){this.helper=t}fillPolygons(t,s){return this._fillPolygons(t,s)}_fillPolygons(t,s){let e=F(t,s);return{type:"fillSketch",ops:this.renderLines(e,s)}}renderLines(t,s){let e=[];for(let n of t)e.push(...this.helper.doubleLineOps(n[0][0],n[0][1],n[1][0],n[1][1],s));return e}};function X(a){let t=a[0],s=a[1];return Math.sqrt(Math.pow(t[0]-s[0],2)+Math.pow(t[1]-s[1],2))}var at=class extends q{fillPolygons(t,s){let e=s.hachureGap;e<0&&(e=4*s.strokeWidth),e=Math.max(e,.1);let n=F(t,Object.assign({},s,{hachureGap:e})),o=Math.PI/180*s.hachureAngle,r=[],h=.5*e*Math.cos(o),i=.5*e*Math.sin(o);for(let[l,c]of n)X([l,c])&&r.push([[l[0]-h,l[1]+i],[...c]],[[l[0]+h,l[1]-i],[...c]]);return{type:"fillSketch",ops:this.renderLines(r,s)}}},ot=class extends q{fillPolygons(t,s){let e=this._fillPolygons(t,s),n=Object.assign({},s,{hachureAngle:s.hachureAngle+90}),o=this._fillPolygons(t,n);return e.ops=e.ops.concat(o.ops),e}},ht=class{constructor(t){this.helper=t}fillPolygons(t,s){let e=F(t,s=Object.assign({},s,{hachureAngle:0}));return this.dotsOnLines(e,s)}dotsOnLines(t,s){let e=[],n=s.hachureGap;n<0&&(n=4*s.strokeWidth),n=Math.max(n,.1);let o=s.fillWeight;o<0&&(o=s.strokeWidth/2);let r=n/4;for(let h of t){let i=X(h),l=i/n,c=Math.ceil(l)-1,d=i-c*n,p=(h[0][0]+h[1][0])/2-n/4,u=Math.min(h[0][1],h[1][1]);for(let f=0;f{let h=X(r),i=Math.floor(h/(e+n)),l=(h+n-i*(e+n))/2,c=r[0],d=r[1];c[0]>d[0]&&(c=r[1],d=r[0]);let p=Math.atan((d[1]-c[1])/(d[0]-c[0]));for(let u=0;u{let r=X(o),h=Math.round(r/(2*s)),i=o[0],l=o[1];i[0]>l[0]&&(i=o[1],l=o[0]);let c=Math.atan((l[1]-i[1])/(l[0]-i[0]));for(let d=0;dc%2?l+s:l+t);o.push({key:"C",data:i}),t=i[4],s=i[5];break}case"Q":o.push({key:"Q",data:[...h]}),t=h[2],s=h[3];break;case"q":{let i=h.map((l,c)=>c%2?l+s:l+t);o.push({key:"Q",data:i}),t=i[2],s=i[3];break}case"A":o.push({key:"A",data:[...h]}),t=h[5],s=h[6];break;case"a":t+=h[5],s+=h[6],o.push({key:"A",data:[h[0],h[1],h[2],h[3],h[4],t,s]});break;case"H":o.push({key:"H",data:[...h]}),t=h[0];break;case"h":t+=h[0],o.push({key:"H",data:[t]});break;case"V":o.push({key:"V",data:[...h]}),s=h[0];break;case"v":s+=h[0],o.push({key:"V",data:[s]});break;case"S":o.push({key:"S",data:[...h]}),t=h[2],s=h[3];break;case"s":{let i=h.map((l,c)=>c%2?l+s:l+t);o.push({key:"S",data:i}),t=i[2],s=i[3];break}case"T":o.push({key:"T",data:[...h]}),t=h[0],s=h[1];break;case"t":t+=h[0],s+=h[1],o.push({key:"T",data:[t,s]});break;case"Z":case"z":o.push({key:"Z",data:[]}),t=e,s=n}return o}function Lt(a){let t=[],s="",e=0,n=0,o=0,r=0,h=0,i=0;for(let{key:l,data:c}of a){switch(l){case"M":t.push({key:"M",data:[...c]}),[e,n]=c,[o,r]=c;break;case"C":t.push({key:"C",data:[...c]}),e=c[4],n=c[5],h=c[2],i=c[3];break;case"L":t.push({key:"L",data:[...c]}),[e,n]=c;break;case"H":e=c[0],t.push({key:"L",data:[e,n]});break;case"V":n=c[0],t.push({key:"L",data:[e,n]});break;case"S":{let d=0,p=0;s==="C"||s==="S"?(d=e+(e-h),p=n+(n-i)):(d=e,p=n),t.push({key:"C",data:[d,p,...c]}),h=c[0],i=c[1],e=c[2],n=c[3];break}case"T":{let[d,p]=c,u=0,f=0;s==="Q"||s==="T"?(u=e+(e-h),f=n+(n-i)):(u=e,f=n);let g=e+2*(u-e)/3,k=n+2*(f-n)/3,b=d+2*(u-d)/3,M=p+2*(f-p)/3;t.push({key:"C",data:[g,k,b,M,d,p]}),h=u,i=f,e=d,n=p;break}case"Q":{let[d,p,u,f]=c,g=e+2*(d-e)/3,k=n+2*(p-n)/3,b=u+2*(d-u)/3,M=f+2*(p-f)/3;t.push({key:"C",data:[g,k,b,M,u,f]}),h=d,i=p,e=u,n=f;break}case"A":{let d=Math.abs(c[0]),p=Math.abs(c[1]),u=c[2],f=c[3],g=c[4],k=c[5],b=c[6];d===0||p===0?(t.push({key:"C",data:[e,n,k,b,k,b]}),e=k,n=b):(e!==k||n!==b)&&(Tt(e,n,k,b,d,p,u,f,g).forEach(function(M){t.push({key:"C",data:M})}),e=k,n=b);break}case"Z":t.push({key:"Z",data:[]}),e=o,n=r}s=l}return t}function R(a,t,s){return[a*Math.cos(s)-t*Math.sin(s),a*Math.sin(s)+t*Math.cos(s)]}function Tt(a,t,s,e,n,o,r,h,i,l){let c=(d=r,Math.PI*d/180);var d;let p=[],u=0,f=0,g=0,k=0;if(l)[u,f,g,k]=l;else{[a,t]=R(a,t,-c),[s,e]=R(s,e,-c);let T=(a-s)/2,v=(t-e)/2,_=T*T/(n*n)+v*v/(o*o);_>1&&(_=Math.sqrt(_),n*=_,o*=_);let W=n*n,E=o*o,It=W*E-W*v*v-E*T*T,Ct=W*v*v+E*T*T,kt=(h===i?-1:1)*Math.sqrt(Math.abs(It/Ct));g=kt*n*v/o+(a+s)/2,k=kt*-o*T/n+(t+e)/2,u=Math.asin(parseFloat(((t-k)/o).toFixed(9))),f=Math.asin(parseFloat(((e-k)/o).toFixed(9))),af&&(u-=2*Math.PI),!i&&f>u&&(f-=2*Math.PI)}let b=f-u;if(Math.abs(b)>120*Math.PI/180){let T=f,v=s,_=e;f=i&&f>u?u+120*Math.PI/180*1:u+120*Math.PI/180*-1,p=Tt(s=g+n*Math.cos(f),e=k+o*Math.sin(f),v,_,n,o,r,0,i,[f,T,g,k])}b=f-u;let M=Math.cos(u),m=Math.sin(u),P=Math.cos(f),x=Math.sin(f),w=Math.tan(b/4),L=4/3*n*w,A=4/3*o*w,V=[a,t],D=[a+L*m,t-A*M],C=[s+L*x,e-A*P],Mt=[s,e];if(D[0]=2*V[0]-D[0],D[1]=2*V[1]-D[1],l)return[D,C,Mt].concat(p);{p=[D,C,Mt].concat(p);let T=[];for(let v=0;v2){let n=[];for(let o=0;o2*Math.PI&&(u=0,f=2*Math.PI);let g=2*Math.PI/i.curveStepCount,k=Math.min(g/2,(f-u)/2),b=vt(k,l,c,d,p,u,f,1,i);if(!i.disableMultiStroke){let M=vt(k,l,c,d,p,u,f,1.5,i);b.push(...M)}return r&&(h?b.push(...I(l,c,l+d*Math.cos(u),c+p*Math.sin(u),i),...I(l,c,l+d*Math.cos(f),c+p*Math.sin(f),i)):b.push({op:"lineTo",data:[l,c]},{op:"lineTo",data:[l+d*Math.cos(u),c+p*Math.sin(u)]})),{type:"path",ops:b}}function wt(a,t){let s=Lt(Ot(gt(a))),e=[],n=[0,0],o=[0,0];for(let{key:r,data:h}of s)switch(r){case"M":o=[h[0],h[1]],n=[h[0],h[1]];break;case"L":e.push(...I(o[0],o[1],h[0],h[1],t)),o=[h[0],h[1]];break;case"C":{let[i,l,c,d,p,u]=h;e.push(...Rt(i,l,c,d,p,u,o,t)),o=[p,u];break}case"Z":e.push(...I(o[0],o[1],n[0],n[1],t)),o=[n[0],n[1]]}return{type:"path",ops:e}}function st(a,t){let s=[];for(let e of a)if(e.length){let n=t.maxRandomnessOffset||0,o=e.length;if(o>2){s.push({op:"move",data:[e[0][0]+y(n,t),e[0][1]+y(n,t)]});for(let r=1;r500?.4:-.0016668*i+1.233334;let c=n.maxRandomnessOffset||0;c*c*100>h&&(c=i/10);let d=c/2,p=.2+.2*_t(n),u=n.bowing*n.maxRandomnessOffset*(e-t)/200,f=n.bowing*n.maxRandomnessOffset*(a-s)/200;u=y(u,n,l),f=y(f,n,l);let g=[],k=()=>y(d,n,l),b=()=>y(c,n,l),M=n.preserveVertices;return o&&(r?g.push({op:"move",data:[a+(M?0:k()),t+(M?0:k())]}):g.push({op:"move",data:[a+(M?0:y(c,n,l)),t+(M?0:y(c,n,l))]})),r?g.push({op:"bcurveTo",data:[u+a+(s-a)*p+k(),f+t+(e-t)*p+k(),u+a+2*(s-a)*p+k(),f+t+2*(e-t)*p+k(),s+(M?0:k()),e+(M?0:k())]}):g.push({op:"bcurveTo",data:[u+a+(s-a)*p+b(),f+t+(e-t)*p+b(),u+a+2*(s-a)*p+b(),f+t+2*(e-t)*p+b(),s+(M?0:b()),e+(M?0:b())]}),g}function Q(a,t,s){if(!a.length)return[];let e=[];e.push([a[0][0]+y(t,s),a[0][1]+y(t,s)]),e.push([a[0][0]+y(t,s),a[0][1]+y(t,s)]);for(let n=1;n3){let o=[],r=1-s.curveTightness;n.push({op:"move",data:[a[1][0],a[1][1]]});for(let h=1;h+21&&n.push(h)):n.push(h),n.push(a[t+3])}else{let i=a[t+0],l=a[t+1],c=a[t+2],d=a[t+3],p=z(i,l,.5),u=z(l,c,.5),f=z(c,d,.5),g=z(p,u,.5),k=z(u,f,.5),b=z(g,k,.5);pt([i,p,g,b],0,s,n),pt([b,k,f,d],0,s,n)}var o,r;return n}function qt(a,t){return U(a,0,a.length,t)}function U(a,t,s,e,n){let o=n||[],r=a[t],h=a[s-1],i=0,l=1;for(let c=t+1;ci&&(i=d,l=c)}return Math.sqrt(i)>e?(U(a,t,l+1,e,o),U(a,l,s,e,o)):(o.length||o.push(r),o.push(h)),o}function nt(a,t=.15,s){let e=[],n=(a.length-1)/3;for(let o=0;o0?U(e,0,e.length,s):e}var O="none",$=class{constructor(t){this.defaultOptions={maxRandomnessOffset:2,roughness:1,bowing:1,stroke:"#000",strokeWidth:1,curveTightness:0,curveFitting:.95,curveStepCount:9,fillStyle:"hachure",fillWeight:-1,hachureAngle:-41,hachureGap:-1,dashOffset:-1,dashGap:-1,zigzagOffset:-1,seed:0,disableMultiStroke:!1,disableMultiStrokeFill:!1,preserveVertices:!1,fillShapeRoughnessGain:.8},this.config=t||{},this.config.options&&(this.defaultOptions=this._o(this.config.options))}static newSeed(){return Math.floor(Math.random()*2**31)}_o(t){return t?Object.assign({},this.defaultOptions,t):this.defaultOptions}_d(t,s,e){return{shape:t,sets:s||[],options:e||this.defaultOptions}}line(t,s,e,n,o){let r=this._o(o);return this._d("line",[Dt(t,s,e,n,r)],r)}rectangle(t,s,e,n,o){let r=this._o(o),h=[],i=$t(t,s,e,n,r);if(r.fill){let l=[[t,s],[t+e,s],[t+e,s+n],[t,s+n]];r.fillStyle==="solid"?h.push(st([l],r)):h.push(G([l],r))}return r.stroke!==O&&h.push(i),this._d("rectangle",h,r)}ellipse(t,s,e,n,o){let r=this._o(o),h=[],i=At(e,n,r),l=lt(t,s,r,i);if(r.fill)if(r.fillStyle==="solid"){let c=lt(t,s,r,i).opset;c.type="fillPath",h.push(c)}else h.push(G([l.estimatedPoints],r));return r.stroke!==O&&h.push(l.opset),this._d("ellipse",h,r)}circle(t,s,e,n){let o=this.ellipse(t,s,e,e,n);return o.shape="circle",o}linearPath(t,s){let e=this._o(s);return this._d("linearPath",[N(t,!1,e)],e)}arc(t,s,e,n,o,r,h=!1,i){let l=this._o(i),c=[],d=mt(t,s,e,n,o,r,h,!0,l);if(h&&l.fill)if(l.fillStyle==="solid"){let p=Object.assign({},l);p.disableMultiStroke=!0;let u=mt(t,s,e,n,o,r,!0,!1,p);u.type="fillPath",c.push(u)}else c.push((function(p,u,f,g,k,b,M){let m=p,P=u,x=Math.abs(f/2),w=Math.abs(g/2);x+=y(.01*x,M),w+=y(.01*w,M);let L=k,A=b;for(;L<0;)L+=2*Math.PI,A+=2*Math.PI;A-L>2*Math.PI&&(L=0,A=2*Math.PI);let V=(A-L)/M.curveStepCount,D=[];for(let C=L;C<=A;C+=V)D.push([m+x*Math.cos(C),P+w*Math.sin(C)]);return D.push([m+x*Math.cos(A),P+w*Math.sin(A)]),D.push([m,P]),G([D],M)})(t,s,e,n,o,r,l));return l.stroke!==O&&c.push(d),this._d("arc",c,l)}curve(t,s){let e=this._o(s),n=[],o=yt(t,e);if(e.fill&&e.fill!==O)if(e.fillStyle==="solid"){let r=yt(t,Object.assign(Object.assign({},e),{disableMultiStroke:!0,roughness:e.roughness?e.roughness+e.fillShapeRoughnessGain:0}));n.push({type:"fillPath",ops:this._mergedShape(r.ops)})}else{let r=[],h=t;if(h.length){let i=typeof h[0][0]=="number"?[h]:h;for(let l of i)l.length<3?r.push(...l):l.length===3?r.push(...nt(St([l[0],l[0],l[1],l[2]]),10,(1+e.roughness)/2)):r.push(...nt(St(l),10,(1+e.roughness)/2))}r.length&&n.push(G([r],e))}return e.stroke!==O&&n.push(o),this._d("curve",n,e)}polygon(t,s){let e=this._o(s),n=[],o=N(t,!0,e);return e.fill&&(e.fillStyle==="solid"?n.push(st([t],e)):n.push(G([t],e))),e.stroke!==O&&n.push(o),this._d("polygon",n,e)}path(t,s){let e=this._o(s),n=[];if(!t)return this._d("path",n,e);t=(t||"").replace(/\n/g," ").replace(/(-\s)/g,"-").replace("/(ss)/g"," ");let o=e.fill&&e.fill!=="transparent"&&e.fill!==O,r=e.stroke!==O,h=!!(e.simplification&&e.simplification<1),i=(function(c,d,p){let u=Lt(Ot(gt(c))),f=[],g=[],k=[0,0],b=[],M=()=>{b.length>=4&&g.push(...nt(b,d)),b=[]},m=()=>{M(),g.length&&(f.push(g),g=[])};for(let{key:x,data:w}of u)switch(x){case"M":m(),k=[w[0],w[1]],g.push(k);break;case"L":M(),g.push([w[0],w[1]]);break;case"C":if(!b.length){let L=g.length?g[g.length-1]:k;b.push([L[0],L[1]])}b.push([w[0],w[1]]),b.push([w[2],w[3]]),b.push([w[4],w[5]]);break;case"Z":M(),g.push([k[0],k[1]])}if(m(),!p)return f;let P=[];for(let x of f){let w=qt(x,p);w.length&&P.push(w)}return P})(t,1,h?4-4*(e.simplification||1):(1+e.roughness)/2),l=wt(t,e);if(o)if(e.fillStyle==="solid")if(i.length===1){let c=wt(t,Object.assign(Object.assign({},e),{disableMultiStroke:!0,roughness:e.roughness?e.roughness+e.fillShapeRoughnessGain:0}));n.push({type:"fillPath",ops:this._mergedShape(c.ops)})}else n.push(st(i,e));else n.push(G(i,e));return r&&(h?i.forEach(c=>{n.push(N(c,!1,e))}):n.push(l)),this._d("path",n,e)}opsToPath(t,s){let e="";for(let n of t.ops){let o=typeof s=="number"&&s>=0?n.data.map(r=>+r.toFixed(s)):n.data;switch(n.op){case"move":e+=`M${o[0]} ${o[1]} `;break;case"bcurveTo":e+=`C${o[0]} ${o[1]}, ${o[2]} ${o[3]}, ${o[4]} ${o[5]} `;break;case"lineTo":e+=`L${o[0]} ${o[1]} `}}return e.trim()}toPaths(t){let s=t.sets||[],e=t.options||this.defaultOptions,n=[];for(let o of s){let r=null;switch(o.type){case"path":r={d:this.opsToPath(o),stroke:e.stroke,strokeWidth:e.strokeWidth,fill:O};break;case"fillPath":r={d:this.opsToPath(o),stroke:O,strokeWidth:0,fill:e.fill||O};break;case"fillSketch":r=this.fillSketch(o,e)}r&&n.push(r)}return n}fillSketch(t,s){let e=s.fillWeight;return e<0&&(e=s.strokeWidth/2),{d:this.opsToPath(t),stroke:s.fill||O,strokeWidth:e,fill:O}}_mergedShape(t){return t.filter((s,e)=>e===0||s.op!=="move")}},ft=class{constructor(t,s){this.canvas=t,this.ctx=this.canvas.getContext("2d"),this.gen=new $(s)}draw(t){let s=t.sets||[],e=t.options||this.getDefaultOptions(),n=this.ctx,o=t.options.fixedDecimalPlaceDigits;for(let r of s)switch(r.type){case"path":n.save(),n.strokeStyle=e.stroke==="none"?"transparent":e.stroke,n.lineWidth=e.strokeWidth,e.strokeLineDash&&n.setLineDash(e.strokeLineDash),e.strokeLineDashOffset&&(n.lineDashOffset=e.strokeLineDashOffset),this._drawToContext(n,r,o),n.restore();break;case"fillPath":{n.save(),n.fillStyle=e.fill||"";let h=t.shape==="curve"||t.shape==="polygon"||t.shape==="path"?"evenodd":"nonzero";this._drawToContext(n,r,o,h),n.restore();break}case"fillSketch":this.fillSketch(n,r,e)}}fillSketch(t,s,e){let n=e.fillWeight;n<0&&(n=e.strokeWidth/2),t.save(),e.fillLineDash&&t.setLineDash(e.fillLineDash),e.fillLineDashOffset&&(t.lineDashOffset=e.fillLineDashOffset),t.strokeStyle=e.fill||"",t.lineWidth=n,this._drawToContext(t,s,e.fixedDecimalPlaceDigits),t.restore()}_drawToContext(t,s,e,n="nonzero"){t.beginPath();for(let o of s.ops){let r=typeof e=="number"&&e>=0?o.data.map(h=>+h.toFixed(e)):o.data;switch(o.op){case"move":t.moveTo(r[0],r[1]);break;case"bcurveTo":t.bezierCurveTo(r[0],r[1],r[2],r[3],r[4],r[5]);break;case"lineTo":t.lineTo(r[0],r[1])}}s.type==="fillPath"?t.fill(n):t.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(t,s,e,n,o){let r=this.gen.line(t,s,e,n,o);return this.draw(r),r}rectangle(t,s,e,n,o){let r=this.gen.rectangle(t,s,e,n,o);return this.draw(r),r}ellipse(t,s,e,n,o){let r=this.gen.ellipse(t,s,e,n,o);return this.draw(r),r}circle(t,s,e,n){let o=this.gen.circle(t,s,e,n);return this.draw(o),o}linearPath(t,s){let e=this.gen.linearPath(t,s);return this.draw(e),e}polygon(t,s){let e=this.gen.polygon(t,s);return this.draw(e),e}arc(t,s,e,n,o,r,h=!1,i){let l=this.gen.arc(t,s,e,n,o,r,h,i);return this.draw(l),l}curve(t,s){let e=this.gen.curve(t,s);return this.draw(e),e}path(t,s){let e=this.gen.path(t,s);return this.draw(e),e}},H="http://www.w3.org/2000/svg",dt=class{constructor(t,s){this.svg=t,this.gen=new $(s)}draw(t){let s=t.sets||[],e=t.options||this.getDefaultOptions(),n=this.svg.ownerDocument||window.document,o=n.createElementNS(H,"g"),r=t.options.fixedDecimalPlaceDigits;for(let h of s){let i=null;switch(h.type){case"path":i=n.createElementNS(H,"path"),i.setAttribute("d",this.opsToPath(h,r)),i.setAttribute("stroke",e.stroke),i.setAttribute("stroke-width",e.strokeWidth+""),i.setAttribute("fill","none"),e.strokeLineDash&&i.setAttribute("stroke-dasharray",e.strokeLineDash.join(" ").trim()),e.strokeLineDashOffset&&i.setAttribute("stroke-dashoffset",`${e.strokeLineDashOffset}`);break;case"fillPath":i=n.createElementNS(H,"path"),i.setAttribute("d",this.opsToPath(h,r)),i.setAttribute("stroke","none"),i.setAttribute("stroke-width","0"),i.setAttribute("fill",e.fill||""),t.shape!=="curve"&&t.shape!=="polygon"||i.setAttribute("fill-rule","evenodd");break;case"fillSketch":i=this.fillSketch(n,h,e)}i&&o.appendChild(i)}return o}fillSketch(t,s,e){let n=e.fillWeight;n<0&&(n=e.strokeWidth/2);let o=t.createElementNS(H,"path");return o.setAttribute("d",this.opsToPath(s,e.fixedDecimalPlaceDigits)),o.setAttribute("stroke",e.fill||""),o.setAttribute("stroke-width",n+""),o.setAttribute("fill","none"),e.fillLineDash&&o.setAttribute("stroke-dasharray",e.fillLineDash.join(" ").trim()),e.fillLineDashOffset&&o.setAttribute("stroke-dashoffset",`${e.fillLineDashOffset}`),o}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(t,s){return this.gen.opsToPath(t,s)}line(t,s,e,n,o){let r=this.gen.line(t,s,e,n,o);return this.draw(r)}rectangle(t,s,e,n,o){let r=this.gen.rectangle(t,s,e,n,o);return this.draw(r)}ellipse(t,s,e,n,o){let r=this.gen.ellipse(t,s,e,n,o);return this.draw(r)}circle(t,s,e,n){let o=this.gen.circle(t,s,e,n);return this.draw(o)}linearPath(t,s){let e=this.gen.linearPath(t,s);return this.draw(e)}polygon(t,s){let e=this.gen.polygon(t,s);return this.draw(e)}arc(t,s,e,n,o,r,h=!1,i){let l=this.gen.arc(t,s,e,n,o,r,h,i);return this.draw(l)}curve(t,s){let e=this.gen.curve(t,s);return this.draw(e)}path(t,s){let e=this.gen.path(t,s);return this.draw(e)}},Ft={canvas:(a,t)=>new ft(a,t),svg:(a,t)=>new dt(a,t),generator:a=>new $(a),newSeed:()=>$.newSeed()};export{Ft as a}; diff --git a/src/google/adk/cli/browser/chunk-QFMJV7VH.js b/src/google/adk/cli/browser/chunk-QFMJV7VH.js deleted file mode 100644 index b7cb38a78b..0000000000 --- a/src/google/adk/cli/browser/chunk-QFMJV7VH.js +++ /dev/null @@ -1,80 +0,0 @@ -import{g as l,h as pi,i as M,j as fi}from"./chunk-JRNAXTJ7.js";import{a as P,b as X,j as jt}from"./chunk-RMXJBC7V.js";var Vt={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:t=>t>=255?255:t<0?0:t,g:t=>t>=255?255:t<0?0:t,b:t=>t>=255?255:t<0?0:t,h:t=>t%360,s:t=>t>=100?100:t<0?0:t,l:t=>t>=100?100:t<0?0:t,a:t=>t>=1?1:t<0?0:t},toLinear:t=>{let e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},hue2rgb:(t,e,i)=>(i<0&&(i+=1),i>1&&(i-=1),i<.16666666666666666?t+(e-t)*6*i:i<.5?e:i<.6666666666666666?t+(e-t)*(.6666666666666666-i)*6:t),hsl2rgb:({h:t,s:e,l:i},a)=>{if(!e)return i*2.55;t/=360,e/=100,i/=100;let s=i<.5?i*(1+e):i+e-i*e,c=2*i-s;switch(a){case"r":return Vt.hue2rgb(c,s,t+.3333333333333333)*255;case"g":return Vt.hue2rgb(c,s,t)*255;case"b":return Vt.hue2rgb(c,s,t-.3333333333333333)*255}},rgb2hsl:({r:t,g:e,b:i},a)=>{t/=255,e/=255,i/=255;let s=Math.max(t,e,i),c=Math.min(t,e,i),f=(s+c)/2;if(a==="l")return f*100;if(s===c)return 0;let x=s-c,_=f>.5?x/(2-s-c):x/(s+c);if(a==="s")return _*100;switch(s){case t:return((e-i)/x+(ee>i?Math.min(e,Math.max(i,t)):Math.min(i,Math.max(e,t)),round:t=>Math.round(t*1e10)/1e10},yi=yr;var br={dec2hex:t=>{let e=Math.round(t).toString(16);return e.length>1?e:`0${e}`}},bi=br;var Tr={channel:xi,lang:yi,unit:bi},C=Tr;var tt={};for(let t=0;t<=255;t++)tt[t]=C.unit.dec2hex(t);var S={ALL:0,RGB:1,HSL:2};var Le=class{constructor(){this.type=S.ALL}get(){return this.type}set(e){if(this.type&&this.type!==e)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=e}reset(){this.type=S.ALL}is(e){return this.type===e}},Ti=Le;var ve=class{constructor(e,i){this.color=i,this.changed=!1,this.data=e,this.type=new Ti}set(e,i){return this.color=i,this.changed=!1,this.data=e,this.type.type=S.ALL,this}_ensureHSL(){let e=this.data,{h:i,s:a,l:s}=e;i===void 0&&(e.h=C.channel.rgb2hsl(e,"h")),a===void 0&&(e.s=C.channel.rgb2hsl(e,"s")),s===void 0&&(e.l=C.channel.rgb2hsl(e,"l"))}_ensureRGB(){let e=this.data,{r:i,g:a,b:s}=e;i===void 0&&(e.r=C.channel.hsl2rgb(e,"r")),a===void 0&&(e.g=C.channel.hsl2rgb(e,"g")),s===void 0&&(e.b=C.channel.hsl2rgb(e,"b"))}get r(){let e=this.data,i=e.r;return!this.type.is(S.HSL)&&i!==void 0?i:(this._ensureHSL(),C.channel.hsl2rgb(e,"r"))}get g(){let e=this.data,i=e.g;return!this.type.is(S.HSL)&&i!==void 0?i:(this._ensureHSL(),C.channel.hsl2rgb(e,"g"))}get b(){let e=this.data,i=e.b;return!this.type.is(S.HSL)&&i!==void 0?i:(this._ensureHSL(),C.channel.hsl2rgb(e,"b"))}get h(){let e=this.data,i=e.h;return!this.type.is(S.RGB)&&i!==void 0?i:(this._ensureRGB(),C.channel.rgb2hsl(e,"h"))}get s(){let e=this.data,i=e.s;return!this.type.is(S.RGB)&&i!==void 0?i:(this._ensureRGB(),C.channel.rgb2hsl(e,"s"))}get l(){let e=this.data,i=e.l;return!this.type.is(S.RGB)&&i!==void 0?i:(this._ensureRGB(),C.channel.rgb2hsl(e,"l"))}get a(){return this.data.a}set r(e){this.type.set(S.RGB),this.changed=!0,this.data.r=e}set g(e){this.type.set(S.RGB),this.changed=!0,this.data.g=e}set b(e){this.type.set(S.RGB),this.changed=!0,this.data.b=e}set h(e){this.type.set(S.HSL),this.changed=!0,this.data.h=e}set s(e){this.type.set(S.HSL),this.changed=!0,this.data.s=e}set l(e){this.type.set(S.HSL),this.changed=!0,this.data.l=e}set a(e){this.changed=!0,this.data.a=e}},ki=ve;var kr=new ki({r:0,g:0,b:0,a:0},"transparent"),ot=kr;var Si={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:t=>{if(t.charCodeAt(0)!==35)return;let e=t.match(Si.re);if(!e)return;let i=e[1],a=parseInt(i,16),s=i.length,c=s%4===0,f=s>4,x=f?1:17,_=f?8:4,L=c?0:-1,$=f?255:15;return ot.set({r:(a>>_*(L+3)&$)*x,g:(a>>_*(L+2)&$)*x,b:(a>>_*(L+1)&$)*x,a:c?(a&$)*x/255:1},t)},stringify:t=>{let{r:e,g:i,b:a,a:s}=t;return s<1?`#${tt[Math.round(e)]}${tt[Math.round(i)]}${tt[Math.round(a)]}${tt[Math.round(s*255)]}`:`#${tt[Math.round(e)]}${tt[Math.round(i)]}${tt[Math.round(a)]}`}},lt=Si;var Yt={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:t=>{let e=t.match(Yt.hueRe);if(e){let[,i,a]=e;switch(a){case"grad":return C.channel.clamp.h(parseFloat(i)*.9);case"rad":return C.channel.clamp.h(parseFloat(i)*180/Math.PI);case"turn":return C.channel.clamp.h(parseFloat(i)*360)}}return C.channel.clamp.h(parseFloat(t))},parse:t=>{let e=t.charCodeAt(0);if(e!==104&&e!==72)return;let i=t.match(Yt.re);if(!i)return;let[,a,s,c,f,x]=i;return ot.set({h:Yt._hue2deg(a),s:C.channel.clamp.s(parseFloat(s)),l:C.channel.clamp.l(parseFloat(c)),a:f?C.channel.clamp.a(x?parseFloat(f)/100:parseFloat(f)):1},t)},stringify:t=>{let{h:e,s:i,l:a,a:s}=t;return s<1?`hsla(${C.lang.round(e)}, ${C.lang.round(i)}%, ${C.lang.round(a)}%, ${s})`:`hsl(${C.lang.round(e)}, ${C.lang.round(i)}%, ${C.lang.round(a)}%)`}},At=Yt;var Xt={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:t=>{t=t.toLowerCase();let e=Xt.colors[t];if(e)return lt.parse(e)},stringify:t=>{let e=lt.stringify(t);for(let i in Xt.colors)if(Xt.colors[i]===e)return i}},Ae=Xt;var Bi={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:t=>{let e=t.charCodeAt(0);if(e!==114&&e!==82)return;let i=t.match(Bi.re);if(!i)return;let[,a,s,c,f,x,_,L,$]=i;return ot.set({r:C.channel.clamp.r(s?parseFloat(a)*2.55:parseFloat(a)),g:C.channel.clamp.g(f?parseFloat(c)*2.55:parseFloat(c)),b:C.channel.clamp.b(_?parseFloat(x)*2.55:parseFloat(x)),a:L?C.channel.clamp.a($?parseFloat(L)/100:parseFloat(L)):1},t)},stringify:t=>{let{r:e,g:i,b:a,a:s}=t;return s<1?`rgba(${C.lang.round(e)}, ${C.lang.round(i)}, ${C.lang.round(a)}, ${C.lang.round(s)})`:`rgb(${C.lang.round(e)}, ${C.lang.round(i)}, ${C.lang.round(a)})`}},Et=Bi;var Sr={format:{keyword:Ae,hex:lt,rgb:Et,rgba:Et,hsl:At,hsla:At},parse:t=>{if(typeof t!="string")return t;let e=lt.parse(t)||Et.parse(t)||At.parse(t)||Ae.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},stringify:t=>!t.changed&&t.color?t.color:t.type.is(S.HSL)||t.data.r===void 0?At.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?Et.stringify(t):lt.stringify(t)},B=Sr;var Br=(t,e)=>{let i=B.parse(t);for(let a in e)i[a]=C.channel.clamp[a](e[a]);return B.stringify(i)},Kt=Br;var Fr=(t,e,i=0,a=1)=>{if(typeof t!="number")return Kt(t,{a:e});let s=ot.set({r:C.channel.clamp.r(t),g:C.channel.clamp.g(e),b:C.channel.clamp.b(i),a:C.channel.clamp.a(a)});return B.stringify(s)},et=Fr;var _r=(t,e)=>C.lang.round(B.parse(t)[e]),Lr=_r;var vr=t=>{let{r:e,g:i,b:a}=B.parse(t),s=.2126*C.channel.toLinear(e)+.7152*C.channel.toLinear(i)+.0722*C.channel.toLinear(a);return C.lang.round(s)},Fi=vr;var Ar=t=>Fi(t)>=.5,_i=Ar;var Er=t=>!_i(t),j=Er;var Or=(t,e,i)=>{let a=B.parse(t),s=a[e],c=C.channel.clamp[e](s+i);return s!==c&&(a[e]=c),B.stringify(a)},yt=Or;var Mr=(t,e)=>yt(t,"l",e),d=Mr;var Dr=(t,e)=>yt(t,"l",-e),g=Dr;var wr=(t,e)=>yt(t,"a",-e),Ir=wr;var zr=(t,e)=>{let i=B.parse(t),a={};for(let s in e)e[s]&&(a[s]=i[s]+e[s]);return Kt(t,a)},o=zr;var qr=(t,e,i=50)=>{let{r:a,g:s,b:c,a:f}=B.parse(t),{r:x,g:_,b:L,a:$}=B.parse(e),St=i/100,ht=St*2-1,it=f-$,dt=((ht*it===-1?ht:(ht+it)/(1+ht*it))+1)/2,Bt=1-dt,ce=a*dt+x*Bt,de=s*dt+_*Bt,ut=c*dt+L*Bt,v=f*St+$*(1-St);return et(ce,de,ut,v)},Li=qr;var Rr=(t,e=100)=>{let i=B.parse(t);return i.r=255-i.r,i.g=255-i.g,i.b=255-i.b,Li(i,t,e)},h=Rr;var{entries:zi,setPrototypeOf:vi,isFrozen:Wr,getPrototypeOf:Pr,getOwnPropertyDescriptor:Nr}=Object,{freeze:z,seal:U,create:Qt}=Object,{apply:ze,construct:qe}=typeof Reflect<"u"&&Reflect;z||(z=function(e){return e});U||(U=function(e){return e});ze||(ze=function(e,i){for(var a=arguments.length,s=new Array(a>2?a-2:0),c=2;c1?i-1:0),s=1;s1?i-1:0),s=1;s2&&arguments[2]!==void 0?arguments[2]:te;vi&&vi(t,null);let a=e.length;for(;a--;){let s=e[a];if(typeof s=="string"){let c=i(s);c!==s&&(Wr(e)||(e[a]=c),s=c)}t[s]=!0}return t}function Vr(t){for(let e=0;e/gm),Jr=U(/\$\{[\w\W]*/gm),Qr=U(/^data-[\-\w.\u00B7-\uFFFF]+$/),to=U(/^aria-[\-\w]+$/),qi=U(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),eo=U(/^(?:\w+script|data):/i),io=U(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Ri=U(/^html$/i),ro=U(/^[a-z][.\w]*(-[.\w]+)+$/i),wi=Object.freeze({__proto__:null,ARIA_ATTR:to,ATTR_WHITESPACE:io,CUSTOM_ELEMENT:ro,DATA_ATTR:Qr,DOCTYPE_NAME:Ri,ERB_EXPR:Zr,IS_ALLOWED_URI:qi,IS_SCRIPT_OR_DATA:eo,MUSTACHE_EXPR:Kr,TMPLIT_EXPR:Jr}),It={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},oo=function(){return typeof window>"u"?null:window},ao=function(e,i){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let a=null,s="data-tt-policy-suffix";i&&i.hasAttribute(s)&&(a=i.getAttribute(s));let c="dompurify"+(a?"#"+a:"");try{return e.createPolicy(c,{createHTML(f){return f},createScriptURL(f){return f}})}catch(f){return console.warn("TrustedTypes policy "+c+" could not be created."),null}},Ii=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function Wi(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:oo(),e=m=>Wi(m);if(e.version="3.3.3",e.removed=[],!t||!t.document||t.document.nodeType!==It.document||!t.Element)return e.isSupported=!1,e;let{document:i}=t,a=i,s=a.currentScript,{DocumentFragment:c,HTMLTemplateElement:f,Node:x,Element:_,NodeFilter:L,NamedNodeMap:$=t.NamedNodeMap||t.MozNamedAttrMap,HTMLFormElement:St,DOMParser:ht,trustedTypes:it}=t,ct=_.prototype,dt=wt(ct,"cloneNode"),Bt=wt(ct,"remove"),ce=wt(ct,"nextSibling"),de=wt(ct,"childNodes"),ut=wt(ct,"parentNode");if(typeof f=="function"){let m=i.createElement("template");m.content&&m.content.ownerDocument&&(i=m.content.ownerDocument)}let v,Ft="",{implementation:ue,createNodeIterator:rr,createDocumentFragment:or,getElementsByTagName:ar}=i,{importNode:sr}=a,w=Ii();e.isSupported=typeof zi=="function"&&typeof ut=="function"&&ue&&ue.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:ge,ERB_EXPR:Ce,TMPLIT_EXPR:me,DATA_ATTR:lr,ARIA_ATTR:nr,IS_SCRIPT_OR_DATA:hr,ATTR_WHITESPACE:je,CUSTOM_ELEMENT:cr}=wi,{IS_ALLOWED_URI:Ve}=wi,F=null,Ye=p({},[...Ei,...Me,...De,...we,...Oi]),A=null,Xe=p({},[...Mi,...Ie,...Di,...Jt]),b=Object.seal(Qt(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),_t=null,Rt=null,rt=Object.seal(Qt(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),Ke=!0,pe=!0,Ze=!1,Je=!0,gt=!1,Wt=!0,at=!1,fe=!1,xe=!1,Ct=!1,Pt=!1,Nt=!1,Qe=!0,ti=!1,dr="user-content-",ye=!0,Lt=!1,mt={},V=null,be=p({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),ei=null,ii=p({},["audio","video","img","source","image","track"]),Te=null,ri=p({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Ht="http://www.w3.org/1998/Math/MathML",Ut="http://www.w3.org/2000/svg",Z="http://www.w3.org/1999/xhtml",pt=Z,ke=!1,Se=null,ur=p({},[Ht,Ut,Z],Ee),Gt=p({},["mi","mo","mn","ms","mtext"]),$t=p({},["annotation-xml"]),gr=p({},["title","style","font","a","script"]),vt=null,Cr=["application/xhtml+xml","text/html"],mr="text/html",k=null,ft=null,pr=i.createElement("form"),oi=function(r){return r instanceof RegExp||r instanceof Function},Be=function(){let r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(ft&&ft===r)){if((!r||typeof r!="object")&&(r={}),r=K(r),vt=Cr.indexOf(r.PARSER_MEDIA_TYPE)===-1?mr:r.PARSER_MEDIA_TYPE,k=vt==="application/xhtml+xml"?Ee:te,F=H(r,"ALLOWED_TAGS")?p({},r.ALLOWED_TAGS,k):Ye,A=H(r,"ALLOWED_ATTR")?p({},r.ALLOWED_ATTR,k):Xe,Se=H(r,"ALLOWED_NAMESPACES")?p({},r.ALLOWED_NAMESPACES,Ee):ur,Te=H(r,"ADD_URI_SAFE_ATTR")?p(K(ri),r.ADD_URI_SAFE_ATTR,k):ri,ei=H(r,"ADD_DATA_URI_TAGS")?p(K(ii),r.ADD_DATA_URI_TAGS,k):ii,V=H(r,"FORBID_CONTENTS")?p({},r.FORBID_CONTENTS,k):be,_t=H(r,"FORBID_TAGS")?p({},r.FORBID_TAGS,k):K({}),Rt=H(r,"FORBID_ATTR")?p({},r.FORBID_ATTR,k):K({}),mt=H(r,"USE_PROFILES")?r.USE_PROFILES:!1,Ke=r.ALLOW_ARIA_ATTR!==!1,pe=r.ALLOW_DATA_ATTR!==!1,Ze=r.ALLOW_UNKNOWN_PROTOCOLS||!1,Je=r.ALLOW_SELF_CLOSE_IN_ATTR!==!1,gt=r.SAFE_FOR_TEMPLATES||!1,Wt=r.SAFE_FOR_XML!==!1,at=r.WHOLE_DOCUMENT||!1,Ct=r.RETURN_DOM||!1,Pt=r.RETURN_DOM_FRAGMENT||!1,Nt=r.RETURN_TRUSTED_TYPE||!1,xe=r.FORCE_BODY||!1,Qe=r.SANITIZE_DOM!==!1,ti=r.SANITIZE_NAMED_PROPS||!1,ye=r.KEEP_CONTENT!==!1,Lt=r.IN_PLACE||!1,Ve=r.ALLOWED_URI_REGEXP||qi,pt=r.NAMESPACE||Z,Gt=r.MATHML_TEXT_INTEGRATION_POINTS||Gt,$t=r.HTML_INTEGRATION_POINTS||$t,b=r.CUSTOM_ELEMENT_HANDLING||{},r.CUSTOM_ELEMENT_HANDLING&&oi(r.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(b.tagNameCheck=r.CUSTOM_ELEMENT_HANDLING.tagNameCheck),r.CUSTOM_ELEMENT_HANDLING&&oi(r.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(b.attributeNameCheck=r.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),r.CUSTOM_ELEMENT_HANDLING&&typeof r.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(b.allowCustomizedBuiltInElements=r.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),gt&&(pe=!1),Pt&&(Ct=!0),mt&&(F=p({},Oi),A=Qt(null),mt.html===!0&&(p(F,Ei),p(A,Mi)),mt.svg===!0&&(p(F,Me),p(A,Ie),p(A,Jt)),mt.svgFilters===!0&&(p(F,De),p(A,Ie),p(A,Jt)),mt.mathMl===!0&&(p(F,we),p(A,Di),p(A,Jt))),H(r,"ADD_TAGS")||(rt.tagCheck=null),H(r,"ADD_ATTR")||(rt.attributeCheck=null),r.ADD_TAGS&&(typeof r.ADD_TAGS=="function"?rt.tagCheck=r.ADD_TAGS:(F===Ye&&(F=K(F)),p(F,r.ADD_TAGS,k))),r.ADD_ATTR&&(typeof r.ADD_ATTR=="function"?rt.attributeCheck=r.ADD_ATTR:(A===Xe&&(A=K(A)),p(A,r.ADD_ATTR,k))),r.ADD_URI_SAFE_ATTR&&p(Te,r.ADD_URI_SAFE_ATTR,k),r.FORBID_CONTENTS&&(V===be&&(V=K(V)),p(V,r.FORBID_CONTENTS,k)),r.ADD_FORBID_CONTENTS&&(V===be&&(V=K(V)),p(V,r.ADD_FORBID_CONTENTS,k)),ye&&(F["#text"]=!0),at&&p(F,["html","head","body"]),F.table&&(p(F,["tbody"]),delete _t.tbody),r.TRUSTED_TYPES_POLICY){if(typeof r.TRUSTED_TYPES_POLICY.createHTML!="function")throw Dt('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof r.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw Dt('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');v=r.TRUSTED_TYPES_POLICY,Ft=v.createHTML("")}else v===void 0&&(v=ao(it,s)),v!==null&&typeof Ft=="string"&&(Ft=v.createHTML(""));z&&z(r),ft=r}},ai=p({},[...Me,...De,...Yr]),si=p({},[...we,...Xr]),fr=function(r){let n=ut(r);(!n||!n.tagName)&&(n={namespaceURI:pt,tagName:"template"});let u=te(r.tagName),y=te(n.tagName);return Se[r.namespaceURI]?r.namespaceURI===Ut?n.namespaceURI===Z?u==="svg":n.namespaceURI===Ht?u==="svg"&&(y==="annotation-xml"||Gt[y]):!!ai[u]:r.namespaceURI===Ht?n.namespaceURI===Z?u==="math":n.namespaceURI===Ut?u==="math"&&$t[y]:!!si[u]:r.namespaceURI===Z?n.namespaceURI===Ut&&!$t[y]||n.namespaceURI===Ht&&!Gt[y]?!1:!si[u]&&(gr[u]||!ai[u]):!!(vt==="application/xhtml+xml"&&Se[r.namespaceURI]):!1},Y=function(r){Ot(e.removed,{element:r});try{ut(r).removeChild(r)}catch(n){Bt(r)}},st=function(r,n){try{Ot(e.removed,{attribute:n.getAttributeNode(r),from:n})}catch(u){Ot(e.removed,{attribute:null,from:n})}if(n.removeAttribute(r),r==="is")if(Ct||Pt)try{Y(n)}catch(u){}else try{n.setAttribute(r,"")}catch(u){}},li=function(r){let n=null,u=null;if(xe)r=""+r;else{let T=Oe(r,/^[\r\n\t ]+/);u=T&&T[0]}vt==="application/xhtml+xml"&&pt===Z&&(r=''+r+"");let y=v?v.createHTML(r):r;if(pt===Z)try{n=new ht().parseFromString(y,vt)}catch(T){}if(!n||!n.documentElement){n=ue.createDocument(pt,"template",null);try{n.documentElement.innerHTML=ke?Ft:y}catch(T){}}let O=n.body||n.documentElement;return r&&u&&O.insertBefore(i.createTextNode(u),O.childNodes[0]||null),pt===Z?ar.call(n,at?"html":"body")[0]:at?n.documentElement:O},ni=function(r){return rr.call(r.ownerDocument||r,r,L.SHOW_ELEMENT|L.SHOW_COMMENT|L.SHOW_TEXT|L.SHOW_PROCESSING_INSTRUCTION|L.SHOW_CDATA_SECTION,null)},Fe=function(r){return r instanceof St&&(typeof r.nodeName!="string"||typeof r.textContent!="string"||typeof r.removeChild!="function"||!(r.attributes instanceof $)||typeof r.removeAttribute!="function"||typeof r.setAttribute!="function"||typeof r.namespaceURI!="string"||typeof r.insertBefore!="function"||typeof r.hasChildNodes!="function")},hi=function(r){return typeof x=="function"&&r instanceof x};function J(m,r,n){Zt(m,u=>{u.call(e,r,n,ft)})}let ci=function(r){let n=null;if(J(w.beforeSanitizeElements,r,null),Fe(r))return Y(r),!0;let u=k(r.nodeName);if(J(w.uponSanitizeElement,r,{tagName:u,allowedTags:F}),Wt&&r.hasChildNodes()&&!hi(r.firstElementChild)&&I(/<[/\w!]/g,r.innerHTML)&&I(/<[/\w!]/g,r.textContent)||r.nodeType===It.progressingInstruction||Wt&&r.nodeType===It.comment&&I(/<[/\w]/g,r.data))return Y(r),!0;if(!(rt.tagCheck instanceof Function&&rt.tagCheck(u))&&(!F[u]||_t[u])){if(!_t[u]&&ui(u)&&(b.tagNameCheck instanceof RegExp&&I(b.tagNameCheck,u)||b.tagNameCheck instanceof Function&&b.tagNameCheck(u)))return!1;if(ye&&!V[u]){let y=ut(r)||r.parentNode,O=de(r)||r.childNodes;if(O&&y){let T=O.length;for(let W=T-1;W>=0;--W){let Q=dt(O[W],!0);Q.__removalCount=(r.__removalCount||0)+1,y.insertBefore(Q,ce(r))}}}return Y(r),!0}return r instanceof _&&!fr(r)||(u==="noscript"||u==="noembed"||u==="noframes")&&I(/<\/no(script|embed|frames)/i,r.innerHTML)?(Y(r),!0):(gt&&r.nodeType===It.text&&(n=r.textContent,Zt([ge,Ce,me],y=>{n=Mt(n,y," ")}),r.textContent!==n&&(Ot(e.removed,{element:r.cloneNode()}),r.textContent=n)),J(w.afterSanitizeElements,r,null),!1)},di=function(r,n,u){if(Rt[n]||Qe&&(n==="id"||n==="name")&&(u in i||u in pr))return!1;if(!(pe&&!Rt[n]&&I(lr,n))){if(!(Ke&&I(nr,n))){if(!(rt.attributeCheck instanceof Function&&rt.attributeCheck(n,r))){if(!A[n]||Rt[n]){if(!(ui(r)&&(b.tagNameCheck instanceof RegExp&&I(b.tagNameCheck,r)||b.tagNameCheck instanceof Function&&b.tagNameCheck(r))&&(b.attributeNameCheck instanceof RegExp&&I(b.attributeNameCheck,n)||b.attributeNameCheck instanceof Function&&b.attributeNameCheck(n,r))||n==="is"&&b.allowCustomizedBuiltInElements&&(b.tagNameCheck instanceof RegExp&&I(b.tagNameCheck,u)||b.tagNameCheck instanceof Function&&b.tagNameCheck(u))))return!1}else if(!Te[n]){if(!I(Ve,Mt(u,je,""))){if(!((n==="src"||n==="xlink:href"||n==="href")&&r!=="script"&&Gr(u,"data:")===0&&ei[r])){if(!(Ze&&!I(hr,Mt(u,je,"")))){if(u)return!1}}}}}}}return!0},ui=function(r){return r!=="annotation-xml"&&Oe(r,cr)},gi=function(r){J(w.beforeSanitizeAttributes,r,null);let{attributes:n}=r;if(!n||Fe(r))return;let u={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:A,forceKeepAttr:void 0},y=n.length;for(;y--;){let O=n[y],{name:T,namespaceURI:W,value:Q}=O,xt=k(T),_e=Q,E=T==="value"?_e:$r(_e);if(u.attrName=xt,u.attrValue=E,u.keepAttr=!0,u.forceKeepAttr=void 0,J(w.uponSanitizeAttribute,r,u),E=u.attrValue,ti&&(xt==="id"||xt==="name")&&(st(T,r),E=dr+E),Wt&&I(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,E)){st(T,r);continue}if(xt==="attributename"&&Oe(E,"href")){st(T,r);continue}if(u.forceKeepAttr)continue;if(!u.keepAttr){st(T,r);continue}if(!Je&&I(/\/>/i,E)){st(T,r);continue}gt&&Zt([ge,Ce,me],mi=>{E=Mt(E,mi," ")});let Ci=k(r.nodeName);if(!di(Ci,xt,E)){st(T,r);continue}if(v&&typeof it=="object"&&typeof it.getAttributeType=="function"&&!W)switch(it.getAttributeType(Ci,xt)){case"TrustedHTML":{E=v.createHTML(E);break}case"TrustedScriptURL":{E=v.createScriptURL(E);break}}if(E!==_e)try{W?r.setAttributeNS(W,T,E):r.setAttribute(T,E),Fe(r)?Y(r):Ai(e.removed)}catch(mi){st(T,r)}}J(w.afterSanitizeAttributes,r,null)},xr=function m(r){let n=null,u=ni(r);for(J(w.beforeSanitizeShadowDOM,r,null);n=u.nextNode();)J(w.uponSanitizeShadowNode,n,null),ci(n),gi(n),n.content instanceof c&&m(n.content);J(w.afterSanitizeShadowDOM,r,null)};return e.sanitize=function(m){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=null,u=null,y=null,O=null;if(ke=!m,ke&&(m=""),typeof m!="string"&&!hi(m))if(typeof m.toString=="function"){if(m=m.toString(),typeof m!="string")throw Dt("dirty is not a string, aborting")}else throw Dt("toString is not a function");if(!e.isSupported)return m;if(fe||Be(r),e.removed=[],typeof m=="string"&&(Lt=!1),Lt){if(m.nodeName){let Q=k(m.nodeName);if(!F[Q]||_t[Q])throw Dt("root node is forbidden and cannot be sanitized in-place")}}else if(m instanceof x)n=li(""),u=n.ownerDocument.importNode(m,!0),u.nodeType===It.element&&u.nodeName==="BODY"||u.nodeName==="HTML"?n=u:n.appendChild(u);else{if(!Ct&&!gt&&!at&&m.indexOf("<")===-1)return v&&Nt?v.createHTML(m):m;if(n=li(m),!n)return Ct?null:Nt?Ft:""}n&&xe&&Y(n.firstChild);let T=ni(Lt?m:n);for(;y=T.nextNode();)ci(y),gi(y),y.content instanceof c&&xr(y.content);if(Lt)return m;if(Ct){if(Pt)for(O=or.call(n.ownerDocument);n.firstChild;)O.appendChild(n.firstChild);else O=n;return(A.shadowroot||A.shadowrootmode)&&(O=sr.call(a,O,!0)),O}let W=at?n.outerHTML:n.innerHTML;return at&&F["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&I(Ri,n.ownerDocument.doctype.name)&&(W=" -`+W),gt&&Zt([ge,Ce,me],Q=>{W=Mt(W,Q," ")}),v&&Nt?v.createHTML(W):W},e.setConfig=function(){let m=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Be(m),fe=!0},e.clearConfig=function(){ft=null,fe=!1},e.isValidAttribute=function(m,r,n){ft||Be({});let u=k(m),y=k(r);return di(u,y,n)},e.addHook=function(m,r){typeof r=="function"&&Ot(w[m],r)},e.removeHook=function(m,r){if(r!==void 0){let n=Hr(w[m],r);return n===-1?void 0:Ur(w[m],n,1)[0]}return Ai(w[m])},e.removeHooks=function(m){w[m]=[]},e.removeAllHooks=function(){w=Ii()},e}var bt=Wi();var so=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s,lo=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,no=/\s*%%.*\n/gm,ho=class extends Error{static{l(this,"UnknownDiagramError")}constructor(t){super(t),this.name="UnknownDiagramError"}},re={},Os=l(function(t,e){t=t.replace(so,"").replace(lo,"").replace(no,` -`);for(let[i,{detector:a}]of Object.entries(re))if(a(t,e))return i;throw new ho(`No diagram type detected matching given configuration for text: ${t}`)},"detectType"),Ms=l((...t)=>{for(let{id:e,detector:i,loader:a}of t)$i(e,i,a)},"registerLazyLoadedDiagrams"),$i=l((t,e,i)=>{re[t]&&M.warn(`Detector with key ${t} already exists. Overwriting.`),re[t]={detector:e,loader:i},M.debug(`Detector with key ${t} added${i?" with loader":""}`)},"addDetector"),Ds=l(t=>re[t].loader,"getDiagramLoader"),Re=l((t,e,{depth:i=2,clobber:a=!1}={})=>{let s={depth:i,clobber:a};return Array.isArray(e)&&!Array.isArray(t)?(e.forEach(c=>Re(t,c,s)),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach(c=>{t.includes(c)||t.push(c)}),t):t===void 0||i<=0?t!=null&&typeof t=="object"&&typeof e=="object"?Object.assign(t,e):e:(e!==void 0&&typeof t=="object"&&typeof e=="object"&&Object.keys(e).forEach(c=>{typeof e[c]=="object"&&e[c]!==null&&(t[c]===void 0||typeof t[c]=="object")?(t[c]===void 0&&(t[c]=Array.isArray(e[c])?[]:{}),t[c]=Re(t[c],e[c],{depth:i-1,clobber:a})):(a||typeof t[c]!="object"&&typeof e[c]!="object")&&(t[c]=e[c])}),t)},"assignWithDepth"),D=Re,se="#ffffff",le="#f2f2f2",R=l((t,e)=>e?o(t,{s:-40,l:10}):o(t,{s:-40,l:-10}),"mkBorder"),co=class{static{l(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||o(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||o(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||R(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||R(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||R(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||R(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||h(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||h(this.tertiaryColor),this.lineColor=this.lineColor||h(this.background),this.arrowheadColor=this.arrowheadColor||h(this.background),this.textColor=this.textColor||this.primaryTextColor,this.border2=this.border2||this.tertiaryBorderColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?g(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||this.actorBorder,this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||g(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||h(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||d(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.vertLineColor=this.vertLineColor||"navy",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.darkMode?(this.rowOdd=this.rowOdd||g(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||g(this.mainBkg,10)):(this.rowOdd=this.rowOdd||d(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||d(this.mainBkg,5)),this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||o(this.primaryColor,{h:30}),this.cScale4=this.cScale4||o(this.primaryColor,{h:60}),this.cScale5=this.cScale5||o(this.primaryColor,{h:90}),this.cScale6=this.cScale6||o(this.primaryColor,{h:120}),this.cScale7=this.cScale7||o(this.primaryColor,{h:150}),this.cScale8=this.cScale8||o(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||o(this.primaryColor,{h:270}),this.cScale10=this.cScale10||o(this.primaryColor,{h:300}),this.cScale11=this.cScale11||o(this.primaryColor,{h:330}),this.darkMode)for(let e=0;e{this[i]=t[i]}),this.updateColors(),e.forEach(i=>{this[i]=t[i]})}},uo=l(t=>{let e=new co;return e.calculate(t),e},"getThemeVariables"),go=class{static{l(this,"Theme")}constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=d(this.primaryColor,16),this.tertiaryColor=o(this.primaryColor,{h:-160}),this.primaryBorderColor=h(this.background),this.secondaryBorderColor=R(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=R(this.tertiaryColor,this.darkMode),this.primaryTextColor=h(this.primaryColor),this.secondaryTextColor=h(this.secondaryColor),this.tertiaryTextColor=h(this.tertiaryColor),this.lineColor=h(this.background),this.textColor=h(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=d(h("#323D47"),10),this.lineColor="calculated",this.border1="#ccc",this.border2=et(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=g("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.excludeBkgColor=g(this.sectionBkgColor,10),this.taskBorderColor=et(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=et(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||d(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||g(this.mainBkg,10),this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=d(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=d(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.actorBorder,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=d(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=h(this.doneTaskBkgColor),this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=o(this.primaryColor,{h:64}),this.fillType3=o(this.secondaryColor,{h:64}),this.fillType4=o(this.primaryColor,{h:-64}),this.fillType5=o(this.secondaryColor,{h:-64}),this.fillType6=o(this.primaryColor,{h:128}),this.fillType7=o(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||o(this.primaryColor,{h:30}),this.cScale4=this.cScale4||o(this.primaryColor,{h:60}),this.cScale5=this.cScale5||o(this.primaryColor,{h:90}),this.cScale6=this.cScale6||o(this.primaryColor,{h:120}),this.cScale7=this.cScale7||o(this.primaryColor,{h:150}),this.cScale8=this.cScale8||o(this.primaryColor,{h:210}),this.cScale9=this.cScale9||o(this.primaryColor,{h:270}),this.cScale10=this.cScale10||o(this.primaryColor,{h:300}),this.cScale11=this.cScale11||o(this.primaryColor,{h:330});for(let t=0;t{this[i]=t[i]}),this.updateColors(),e.forEach(i=>{this[i]=t[i]})}},Co=l(t=>{let e=new go;return e.calculate(t),e},"getThemeVariables"),mo=class{static{l(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=o(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=o(this.primaryColor,{h:-160}),this.primaryBorderColor=R(this.primaryColor,this.darkMode),this.secondaryBorderColor=R(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=R(this.tertiaryColor,this.darkMode),this.primaryTextColor=h(this.primaryColor),this.secondaryTextColor=h(this.secondaryColor),this.tertiaryTextColor=h(this.tertiaryColor),this.lineColor=h(this.background),this.textColor=h(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="rgba(232,232,232, 0.8)",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.sectionBkgColor=et(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="navy",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd="calculated",this.rowEven="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||o(this.primaryColor,{h:30}),this.cScale4=this.cScale4||o(this.primaryColor,{h:60}),this.cScale5=this.cScale5||o(this.primaryColor,{h:90}),this.cScale6=this.cScale6||o(this.primaryColor,{h:120}),this.cScale7=this.cScale7||o(this.primaryColor,{h:150}),this.cScale8=this.cScale8||o(this.primaryColor,{h:210}),this.cScale9=this.cScale9||o(this.primaryColor,{h:270}),this.cScale10=this.cScale10||o(this.primaryColor,{h:300}),this.cScale11=this.cScale11||o(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||g(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||g(this.tertiaryColor,40);for(let t=0;t{this[i]==="calculated"&&(this[i]=void 0)}),typeof t!="object"){this.updateColors();return}let e=Object.keys(t);e.forEach(i=>{this[i]=t[i]}),this.updateColors(),e.forEach(i=>{this[i]=t[i]})}},po=l(t=>{let e=new mo;return e.calculate(t),e},"getThemeVariables"),fo=class{static{l(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=d("#cde498",10),this.primaryBorderColor=R(this.primaryColor,this.darkMode),this.secondaryBorderColor=R(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=R(this.tertiaryColor,this.darkMode),this.primaryTextColor=h(this.primaryColor),this.secondaryTextColor=h(this.secondaryColor),this.tertiaryTextColor=h(this.primaryColor),this.lineColor=h(this.background),this.textColor=h(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.actorBorder=g(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.actorLineColor=this.actorBorder,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||o(this.primaryColor,{h:30}),this.cScale4=this.cScale4||o(this.primaryColor,{h:60}),this.cScale5=this.cScale5||o(this.primaryColor,{h:90}),this.cScale6=this.cScale6||o(this.primaryColor,{h:120}),this.cScale7=this.cScale7||o(this.primaryColor,{h:150}),this.cScale8=this.cScale8||o(this.primaryColor,{h:210}),this.cScale9=this.cScale9||o(this.primaryColor,{h:270}),this.cScale10=this.cScale10||o(this.primaryColor,{h:300}),this.cScale11=this.cScale11||o(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||g(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||g(this.tertiaryColor,40);for(let t=0;t{this[i]=t[i]}),this.updateColors(),e.forEach(i=>{this[i]=t[i]})}},xo=l(t=>{let e=new fo;return e.calculate(t),e},"getThemeVariables"),yo=class{static{l(this,"Theme")}constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=d(this.contrast,55),this.background="#ffffff",this.tertiaryColor=o(this.primaryColor,{h:-160}),this.primaryBorderColor=R(this.primaryColor,this.darkMode),this.secondaryBorderColor=R(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=R(this.tertiaryColor,this.darkMode),this.primaryTextColor=h(this.primaryColor),this.secondaryTextColor=h(this.secondaryColor),this.tertiaryTextColor=h(this.tertiaryColor),this.lineColor=h(this.background),this.textColor=h(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor=this.actorBorder,this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||d(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||"#f4f4f4",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=d(this.contrast,55),this.border2=this.contrast,this.actorBorder=d(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.actorBorder,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let t=0;t{this[i]=t[i]}),this.updateColors(),e.forEach(i=>{this[i]=t[i]})}},bo=l(t=>{let e=new yo;return e.calculate(t),e},"getThemeVariables"),Tt={base:{getThemeVariables:uo},dark:{getThemeVariables:Co},default:{getThemeVariables:po},forest:{getThemeVariables:xo},neutral:{getThemeVariables:bo}},G={flowchart:{useMaxWidth:!0,titleTopMargin:25,subGraphTitleMargin:{top:0,bottom:0},diagramPadding:8,htmlLabels:null,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,defaultRenderer:"dagre-wrapper",wrappingWidth:200,inheritDir:!1},sequence:{useMaxWidth:!0,hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20},gantt:{useMaxWidth:!0,titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",topAxis:!1,displayMode:"",weekday:"sunday"},journey:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,maxLabelWidth:360,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],titleColor:"",titleFontFamily:'"trebuchet ms", verdana, arial, sans-serif',titleFontSize:"4ex"},class:{useMaxWidth:!0,titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,defaultRenderer:"dagre-wrapper",htmlLabels:!1,hideEmptyMembersBox:!1},state:{useMaxWidth:!0,titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,defaultRenderer:"dagre-wrapper"},er:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,nodeSpacing:140,rankSpacing:80,stroke:"gray",fill:"honeydew",fontSize:12},pie:{useMaxWidth:!0,textPosition:.75},quadrantChart:{useMaxWidth:!0,chartWidth:500,chartHeight:500,titleFontSize:20,titlePadding:10,quadrantPadding:5,xAxisLabelPadding:5,yAxisLabelPadding:5,xAxisLabelFontSize:16,yAxisLabelFontSize:16,quadrantLabelFontSize:16,quadrantTextTopPadding:5,pointTextPadding:5,pointLabelFontSize:12,pointRadius:5,xAxisPosition:"top",yAxisPosition:"left",quadrantInternalBorderStrokeWidth:1,quadrantExternalBorderStrokeWidth:2},xyChart:{useMaxWidth:!0,width:700,height:500,titleFontSize:20,titlePadding:10,showDataLabel:!1,showTitle:!0,xAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},yAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},chartOrientation:"vertical",plotReservedSpacePercent:50},requirement:{useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200,layoutAlgorithm:"cose-bilkent"},ishikawa:{useMaxWidth:!0,diagramPadding:20},kanban:{useMaxWidth:!0,padding:8,sectionWidth:200,ticketBaseUrl:""},timeline:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},gitGraph:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0,parallelCommits:!1,arrowMarkerAbsolute:!1},c4:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},sankey:{useMaxWidth:!0,width:600,height:400,linkColor:"gradient",nodeAlignment:"justify",showValues:!0,prefix:"",suffix:""},block:{useMaxWidth:!0,padding:8},packet:{useMaxWidth:!0,rowHeight:32,bitWidth:32,bitsPerRow:32,showBits:!0,paddingX:5,paddingY:5},architecture:{useMaxWidth:!0,padding:40,iconSize:80,fontSize:16},radar:{useMaxWidth:!0,width:600,height:600,marginTop:50,marginRight:50,marginBottom:50,marginLeft:50,axisScaleFactor:1,axisLabelFactor:1.05,curveTension:.17},venn:{useMaxWidth:!0,width:800,height:450,padding:8,useDebugLayout:!1},theme:"default",look:"classic",handDrawnSeed:0,layout:"dagre",maxTextSize:5e4,maxEdges:500,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize","suppressErrorRendering","maxEdges"],legacyMathML:!1,forceLegacyMathML:!1,deterministicIds:!1,fontSize:16,markdownAutoWrap:!0,suppressErrorRendering:!1},ji=X(P({},G),{deterministicIDSeed:void 0,elk:{mergeEdges:!1,nodePlacementStrategy:"BRANDES_KOEPF",forceNodeModelOrder:!1,considerModelOrder:"NODES_AND_EDGES"},themeCSS:void 0,themeVariables:Tt.default.getThemeVariables(),sequence:X(P({},G.sequence),{messageFont:l(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont"),noteFont:l(function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},"noteFont"),actorFont:l(function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}},"actorFont")}),class:{hideEmptyMembersBox:!1},gantt:X(P({},G.gantt),{tickInterval:void 0,useWidth:void 0}),c4:X(P({},G.c4),{useWidth:void 0,personFont:l(function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},"personFont"),flowchart:X(P({},G.flowchart),{inheritDir:!1}),external_personFont:l(function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},"external_personFont"),systemFont:l(function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},"systemFont"),external_systemFont:l(function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},"external_systemFont"),system_dbFont:l(function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},"system_dbFont"),external_system_dbFont:l(function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},"external_system_dbFont"),system_queueFont:l(function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},"system_queueFont"),external_system_queueFont:l(function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},"external_system_queueFont"),containerFont:l(function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},"containerFont"),external_containerFont:l(function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},"external_containerFont"),container_dbFont:l(function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},"container_dbFont"),external_container_dbFont:l(function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},"external_container_dbFont"),container_queueFont:l(function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},"container_queueFont"),external_container_queueFont:l(function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},"external_container_queueFont"),componentFont:l(function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},"componentFont"),external_componentFont:l(function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},"external_componentFont"),component_dbFont:l(function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},"component_dbFont"),external_component_dbFont:l(function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},"external_component_dbFont"),component_queueFont:l(function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},"component_queueFont"),external_component_queueFont:l(function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},"external_component_queueFont"),boundaryFont:l(function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},"boundaryFont"),messageFont:l(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont")}),pie:X(P({},G.pie),{useWidth:984}),xyChart:X(P({},G.xyChart),{useWidth:void 0}),requirement:X(P({},G.requirement),{useWidth:void 0}),packet:P({},G.packet),radar:P({},G.radar),ishikawa:P({},G.ishikawa),treemap:{useMaxWidth:!0,padding:10,diagramPadding:8,showValues:!0,nodeWidth:100,nodeHeight:40,borderWidth:1,valueFontSize:12,labelFontSize:14,valueFormat:","},venn:P({},G.venn)}),Vi=l((t,e="")=>Object.keys(t).reduce((i,a)=>Array.isArray(t[a])?i:typeof t[a]=="object"&&t[a]!==null?[...i,e+a,...Vi(t[a],"")]:[...i,e+a],[]),"keyify"),To=new Set(Vi(ji,"")),ko=ji,We=l(t=>{if(M.debug("sanitizeDirective called with",t),!(typeof t!="object"||t==null)){if(Array.isArray(t)){t.forEach(e=>We(e));return}for(let e of Object.keys(t)){if(M.debug("Checking key",e),e.startsWith("__")||e.includes("proto")||e.includes("constr")||!To.has(e)||t[e]==null){M.debug("sanitize deleting key: ",e),delete t[e];continue}if(typeof t[e]=="object"){M.debug("sanitizing object",e),We(t[e]);continue}let i=["themeCSS","fontFamily","altFontFamily"];for(let a of i)e.includes(a)&&(M.debug("sanitizing css option",e),t[e]=So(t[e]))}if(t.themeVariables)for(let e of Object.keys(t.themeVariables)){let i=t.themeVariables[e];i?.match&&!i.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[e]="")}M.debug("After sanitization",t)}},"sanitizeDirective"),So=l(t=>{let e=0,i=0;for(let a of t){if(e!(t===!1||["false","null","0"].includes(String(t).trim().toLowerCase())),"evaluate"),N=D({},ne),oe,nt=[],zt=D({},ne),he=l((t,e)=>{let i=D({},t),a={};for(let s of e)Xi(s),a=D(a,s);if(i=D(i,a),a.theme&&a.theme in Tt){let s=D({},oe),c=D(s.themeVariables||{},a.themeVariables);i.theme&&i.theme in Tt&&(i.themeVariables=Tt[i.theme].getThemeVariables(c))}return zt=i,Zi(zt),zt},"updateCurrentConfig"),Ps=l(t=>(N=D({},ne),N=D(N,t),t.theme&&Tt[t.theme]&&(N.themeVariables=Tt[t.theme].getThemeVariables(t.themeVariables)),he(N,nt),N),"setSiteConfig"),Ns=l(t=>{oe=D({},t)},"saveConfigFromInitialize"),Hs=l(t=>(N=D(N,t),he(N,nt),N),"updateSiteConfig"),Us=l(()=>D({},N),"getSiteConfig"),Bo=l(t=>(Zi(t),D(zt,t),Ne()),"setConfig"),Ne=l(()=>D({},zt),"getConfig"),Xi=l(t=>{t&&(["secure",...N.secure??[]].forEach(e=>{Object.hasOwn(t,e)&&(M.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])}),Object.keys(t).forEach(e=>{e.startsWith("__")&&delete t[e]}),Object.keys(t).forEach(e=>{typeof t[e]=="string"&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],typeof t[e]=="object"&&Xi(t[e])}))},"sanitize"),Gs=l(t=>{We(t),t.fontFamily&&!t.themeVariables?.fontFamily&&(t.themeVariables=X(P({},t.themeVariables),{fontFamily:t.fontFamily})),nt.push(t),he(N,nt)},"addDirective"),$s=l((t=N)=>{nt=[],he(t,nt)},"reset"),Fo={LAZY_LOAD_DEPRECATED:"The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead.",FLOWCHART_HTML_LABELS_DEPRECATED:"flowchart.htmlLabels is deprecated. Please use global htmlLabels instead."},Pi={},Ki=l(t=>{Pi[t]||(M.warn(Fo[t]),Pi[t]=!0)},"issueWarning"),Zi=l(t=>{t&&(t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&Ki("LAZY_LOAD_DEPRECATED")},"checkConfig"),js=l(()=>{let t={};oe&&(t=D(t,oe));for(let e of nt)t=D(t,e);return t},"getUserDefinedConfig"),_o=l(t=>(t.flowchart?.htmlLabels!=null&&Ki("FLOWCHART_HTML_LABELS_DEPRECATED"),Yi(t.htmlLabels??t.flowchart?.htmlLabels??!0)),"getEffectiveHtmlLabels"),qt=//gi,Lo=l(t=>t?tr(t).replace(/\\n/g,"#br#").split("#br#"):[""],"getRows"),vo=(()=>{let t=!1;return()=>{t||(Ji(),t=!0)}})();function Ji(){let t="data-temp-href-target";bt.addHook("beforeSanitizeAttributes",e=>{e.tagName==="A"&&e.hasAttribute("target")&&e.setAttribute(t,e.getAttribute("target")??"")}),bt.addHook("afterSanitizeAttributes",e=>{e.tagName==="A"&&e.hasAttribute(t)&&(e.setAttribute("target",e.getAttribute(t)??""),e.removeAttribute(t),e.getAttribute("target")==="_blank"&&e.setAttribute("rel","noopener"))})}l(Ji,"setupDompurifyHooks");var Qi=l(t=>(vo(),bt.sanitize(t)),"removeScript"),Ni=l((t,e)=>{if(_o(e)){let i=e.securityLevel;i==="antiscript"||i==="strict"||i==="sandbox"?t=Qi(t):i!=="loose"&&(t=tr(t),t=t.replace(//g,">"),t=t.replace(/=/g,"="),t=Mo(t))}return t},"sanitizeMore"),kt=l((t,e)=>t&&(e.dompurifyConfig?t=bt.sanitize(Ni(t,e),e.dompurifyConfig).toString():t=bt.sanitize(Ni(t,e),{FORBID_TAGS:["style"]}).toString(),t),"sanitizeText"),Ao=l((t,e)=>typeof t=="string"?kt(t,e):t.flat().map(i=>kt(i,e)),"sanitizeTextOrArray"),Eo=l(t=>qt.test(t),"hasBreaks"),Oo=l(t=>t.split(qt),"splitBreaks"),Mo=l(t=>t.replace(/#br#/g,"
"),"placeholderToBreak"),tr=l(t=>t.replace(qt,"#br#"),"breakToPlaceholder"),Do=l(t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=CSS.escape(e)),e},"getUrl"),wo=l(function(...t){let e=t.filter(i=>!isNaN(i));return Math.max(...e)},"getMax"),Io=l(function(...t){let e=t.filter(i=>!isNaN(i));return Math.min(...e)},"getMin"),Ys=l(function(t){let e=t.split(/(,)/),i=[];for(let a=0;a0&&a+1Math.max(0,t.split(e).length-1),"countOccurrence"),zo=l((t,e)=>{let i=Pe(t,"~"),a=Pe(e,"~");return i===1&&a===1},"shouldCombineSets"),qo=l(t=>{let e=Pe(t,"~"),i=!1;if(e<=1)return t;e%2!==0&&t.startsWith("~")&&(t=t.substring(1),i=!0);let a=[...t],s=a.indexOf("~"),c=a.lastIndexOf("~");for(;s!==-1&&c!==-1&&s!==c;)a[s]="<",a[c]=">",s=a.indexOf("~"),c=a.lastIndexOf("~");return i&&a.unshift("~"),a.join("")},"processSet"),Hi=l(()=>window.MathMLElement!==void 0,"isMathMLSupported"),ee=/\$\$(.*)\$\$/g,Ui=l(t=>(t.match(ee)?.length??0)>0,"hasKatex"),Xs=l((t,e)=>jt(null,null,function*(){let i=document.createElement("div");i.innerHTML=yield Wo(t,e),i.id="katex-temp",i.style.visibility="hidden",i.style.position="absolute",i.style.top="0",document.querySelector("body")?.insertAdjacentElement("beforeend",i);let s={width:i.clientWidth,height:i.clientHeight};return i.remove(),s}),"calculateMathMLDimensions"),Ro=l((t,e)=>jt(null,null,function*(){if(!Ui(t))return t;if(!(Hi()||e.legacyMathML||e.forceLegacyMathML))return t.replace(ee,"MathML is unsupported in this environment.");{let{default:i}=yield import("./chunk-27SWUPRL.js"),a=e.forceLegacyMathML||!Hi()&&e.legacyMathML?"htmlAndMathml":"mathml";return t.split(qt).map(s=>Ui(s)?`
${s}
`:`
${s}
`).join("").replace(ee,(s,c)=>i.renderToString(c,{throwOnError:!0,displayMode:!0,output:a}).replace(/\n/g," ").replace(//g,""))}return t.replace(ee,"Katex is not supported in @mermaid-js/tiny. Please use the full mermaid library.")}),"renderKatexUnsanitized"),Wo=l((t,e)=>jt(null,null,function*(){return kt(yield Ro(t,e),e)}),"renderKatexSanitized"),Ks={getRows:Lo,sanitizeText:kt,sanitizeTextOrArray:Ao,hasBreaks:Eo,splitBreaks:Oo,lineBreakRegex:qt,removeScript:Qi,getUrl:Do,evaluate:Yi,getMax:wo,getMin:Io},Po=l(function(t,e){for(let i of e)t.attr(i[0],i[1])},"d3Attrs"),No=l(function(t,e,i){let a=new Map;return i?(a.set("width","100%"),a.set("style",`max-width: ${e}px;`)):(a.set("height",t),a.set("width",e)),a},"calculateSvgSizeAttrs"),Ho=l(function(t,e,i,a){let s=No(e,i,a);Po(t,s)},"configureSvgSize"),Uo=l(function(t,e,i,a){let s=e.node().getBBox(),c=s.width,f=s.height;M.info(`SVG bounds: ${c}x${f}`,s);let x=0,_=0;M.info(`Graph bounds: ${x}x${_}`,t),x=c+i*2,_=f+i*2,M.info(`Calculated bounds: ${x}x${_}`),Ho(e,_,x,a);let L=`${s.x-i} ${s.y-i} ${s.width+2*i} ${s.height+2*i}`;e.attr("viewBox",L)},"setupGraphViewbox"),ie={},Go=l((t,e,i)=>{let a="";return t in ie&&ie[t]?a=ie[t](i):M.warn(`No theme found for ${t}`),` & { - font-family: ${i.fontFamily}; - font-size: ${i.fontSize}; - fill: ${i.textColor} - } - @keyframes edge-animation-frame { - from { - stroke-dashoffset: 0; - } - } - @keyframes dash { - to { - stroke-dashoffset: 0; - } - } - & .edge-animation-slow { - stroke-dasharray: 9,5 !important; - stroke-dashoffset: 900; - animation: dash 50s linear infinite; - stroke-linecap: round; - } - & .edge-animation-fast { - stroke-dasharray: 9,5 !important; - stroke-dashoffset: 900; - animation: dash 20s linear infinite; - stroke-linecap: round; - } - /* Classes common for multiple diagrams */ - - & .error-icon { - fill: ${i.errorBkgColor}; - } - & .error-text { - fill: ${i.errorTextColor}; - stroke: ${i.errorTextColor}; - } - - & .edge-thickness-normal { - stroke-width: 1px; - } - & .edge-thickness-thick { - stroke-width: 3.5px - } - & .edge-pattern-solid { - stroke-dasharray: 0; - } - & .edge-thickness-invisible { - stroke-width: 0; - fill: none; - } - & .edge-pattern-dashed{ - stroke-dasharray: 3; - } - .edge-pattern-dotted { - stroke-dasharray: 2; - } - - & .marker { - fill: ${i.lineColor}; - stroke: ${i.lineColor}; - } - & .marker.cross { - stroke: ${i.lineColor}; - } - - & svg { - font-family: ${i.fontFamily}; - font-size: ${i.fontSize}; - } - & p { - margin: 0 - } - - ${a} - - ${e} -`},"getStyles"),$o=l((t,e)=>{e!==void 0&&(ie[t]=e)},"addStylesForDiagram"),Zs=Go,er={};pi(er,{clear:()=>jo,getAccDescription:()=>Ko,getAccTitle:()=>Yo,getDiagramTitle:()=>Jo,setAccDescription:()=>Xo,setAccTitle:()=>Vo,setDiagramTitle:()=>Zo});var He="",Ue="",Ge="",$e=l(t=>kt(t,Ne()),"sanitizeText"),jo=l(()=>{He="",Ge="",Ue=""},"clear"),Vo=l(t=>{He=$e(t).replace(/^\s+/g,"")},"setAccTitle"),Yo=l(()=>He,"getAccTitle"),Xo=l(t=>{Ge=$e(t).replace(/\n\s+/g,` -`)},"setAccDescription"),Ko=l(()=>Ge,"getAccDescription"),Zo=l(t=>{Ue=$e(t)},"setDiagramTitle"),Jo=l(()=>Ue,"getDiagramTitle"),Gi=M,Qo=fi,ir=Ne,Js=Bo,Qs=ne,ta=l(t=>kt(t,ir()),"sanitizeText"),ea=Uo,ia=l(()=>er,"getCommonDb"),ae={},tl=l((t,e,i)=>{ae[t]&&Gi.warn(`Diagram with id ${t} already registered. Overwriting.`),ae[t]=e,i&&$i(t,i),$o(t,e.styles),e.injectUtils?.(Gi,Qo,ir,ta,ea,ia(),()=>{})},"registerDiagram"),el=l(t=>{if(t in ae)return ae[t];throw new ra(t)},"getDiagram"),ra=class extends Error{static{l(this,"DiagramNotFoundError")}constructor(t){super(`Diagram ${t} not found.`)}};export{et as a,Lr as b,j as c,d,g as e,Ir as f,bt as g,so as h,lo as i,ho as j,re as k,Os as l,Ms as m,Ds as n,D as o,po as p,Tt as q,ko as r,We as s,ne as t,Yi as u,Ps as v,Ns as w,Hs as x,Us as y,Bo as z,Ne as A,Gs as B,$s as C,js as D,_o as E,qt as F,kt as G,Do as H,Ys as I,Ui as J,Xs as K,Wo as L,Ks as M,Ho as N,Uo as O,Zs as P,er as Q,jo as R,Vo as S,Yo as T,Xo as U,Ko as V,Zo as W,Jo as X,ir as Y,Js as Z,Qs as _,ta as $,ea as aa,tl as ba,el as ca}; diff --git a/src/google/adk/cli/browser/chunk-QGHEW6NO.js b/src/google/adk/cli/browser/chunk-QGHEW6NO.js deleted file mode 100644 index 82b5b010fa..0000000000 --- a/src/google/adk/cli/browser/chunk-QGHEW6NO.js +++ /dev/null @@ -1,70 +0,0 @@ -import{a as je}from"./chunk-APNCZOFE.js";import{a as We}from"./chunk-ST54LLJ3.js";import{b as Ue,c as Ze}from"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import{m as Ge,p as Ke}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{R as Ve,S as Me,T as Be,U as Fe,V as Ye,W as Pe,X as ze,Y as j,a as Le,b as we}from"./chunk-QFMJV7VH.js";import{a as ve,g as l,h as De,i as v}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{j as Ce}from"./chunk-RMXJBC7V.js";var ye=(function(){var t=l(function(A,a,n,c){for(n=n||{},c=A.length;c--;n[A[c]]=a);return n},"o"),i=[6,8,10,22,24,26,28,33,34,35,36,37,40,43,44,48,50,51,52],d=[1,10],o=[1,11],h=[1,12],b=[1,13],R=[1,23],k=[1,24],_=[1,25],w=[1,26],W=[1,27],E=[1,19],ie=[1,28],Q=[1,29],S=[1,20],I=[1,18],V=[1,21],M=[1,22],re=[1,36],ae=[1,37],ne=[1,38],ce=[1,39],oe=[1,40],B=[6,8,10,13,15,17,20,21,22,24,26,28,33,34,35,36,37,40,43,44,48,50,51,52,65,66,67,68,69],T=[1,45],O=[1,46],F=[1,55],Y=[40,48,50,51,52,70,71],P=[1,66],z=[1,64],N=[1,61],G=[1,65],K=[1,67],X=[6,8,10,13,17,22,24,26,28,33,34,35,36,37,40,41,42,43,44,48,49,50,51,52,65,66,67,68,69],ke=[65,66,67,68,69],ge=[1,84],_e=[1,83],me=[1,81],Ee=[1,82],Se=[6,10,42,47],D=[6,10,13,41,42,47,48,49],q=[1,92],H=[1,91],J=[1,90],U=[19,58],Te=[1,101],Oe=[1,100],le=[19,58,60,62],he={trace:l(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,entityName:11,relSpec:12,COLON:13,role:14,STYLE_SEPARATOR:15,idList:16,BLOCK_START:17,attributes:18,BLOCK_STOP:19,SQS:20,SQE:21,title:22,title_value:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,direction:29,classDefStatement:30,classStatement:31,styleStatement:32,direction_tb:33,direction_bt:34,direction_rl:35,direction_lr:36,CLASSDEF:37,stylesOpt:38,separator:39,UNICODE_TEXT:40,STYLE_TEXT:41,COMMA:42,CLASS:43,STYLE:44,style:45,styleComponent:46,SEMI:47,NUM:48,BRKT:49,ENTITY_NAME:50,DECIMAL_NUM:51,ENTITY_ONE:52,attribute:53,attributeType:54,attributeName:55,attributeKeyTypeList:56,attributeComment:57,ATTRIBUTE_WORD:58,attributeKeyType:59,",":60,ATTRIBUTE_KEY:61,COMMENT:62,cardinality:63,relType:64,ZERO_OR_ONE:65,ZERO_OR_MORE:66,ONE_OR_MORE:67,ONLY_ONE:68,MD_PARENT:69,NON_IDENTIFYING:70,IDENTIFYING:71,WORD:72,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",8:"SPACE",10:"NEWLINE",13:"COLON",15:"STYLE_SEPARATOR",17:"BLOCK_START",19:"BLOCK_STOP",20:"SQS",21:"SQE",22:"title",23:"title_value",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"direction_tb",34:"direction_bt",35:"direction_rl",36:"direction_lr",37:"CLASSDEF",40:"UNICODE_TEXT",41:"STYLE_TEXT",42:"COMMA",43:"CLASS",44:"STYLE",47:"SEMI",48:"NUM",49:"BRKT",50:"ENTITY_NAME",51:"DECIMAL_NUM",52:"ENTITY_ONE",58:"ATTRIBUTE_WORD",60:",",61:"ATTRIBUTE_KEY",62:"COMMENT",65:"ZERO_OR_ONE",66:"ZERO_OR_MORE",67:"ONE_OR_MORE",68:"ONLY_ONE",69:"MD_PARENT",70:"NON_IDENTIFYING",71:"IDENTIFYING",72:"WORD"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,9],[9,7],[9,7],[9,4],[9,6],[9,3],[9,5],[9,1],[9,3],[9,7],[9,9],[9,6],[9,8],[9,4],[9,6],[9,2],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[9,1],[29,1],[29,1],[29,1],[29,1],[30,4],[16,1],[16,1],[16,3],[16,3],[31,3],[32,4],[38,1],[38,3],[45,1],[45,2],[39,1],[39,1],[39,1],[46,1],[46,1],[46,1],[46,1],[11,1],[11,1],[11,1],[11,1],[11,1],[18,1],[18,2],[53,2],[53,3],[53,3],[53,4],[54,1],[55,1],[56,1],[56,3],[59,1],[57,1],[12,3],[63,1],[63,1],[63,1],[63,1],[63,1],[64,1],[64,1],[14,1],[14,1],[14,1]],performAction:l(function(a,n,c,r,u,e,Z){var s=e.length-1;switch(u){case 1:break;case 2:this.$=[];break;case 3:e[s-1].push(e[s]),this.$=e[s-1];break;case 4:case 5:this.$=e[s];break;case 6:case 7:this.$=[];break;case 8:r.addEntity(e[s-4]),r.addEntity(e[s-2]),r.addRelationship(e[s-4],e[s],e[s-2],e[s-3]);break;case 9:r.addEntity(e[s-8]),r.addEntity(e[s-4]),r.addRelationship(e[s-8],e[s],e[s-4],e[s-5]),r.setClass([e[s-8]],e[s-6]),r.setClass([e[s-4]],e[s-2]);break;case 10:r.addEntity(e[s-6]),r.addEntity(e[s-2]),r.addRelationship(e[s-6],e[s],e[s-2],e[s-3]),r.setClass([e[s-6]],e[s-4]);break;case 11:r.addEntity(e[s-6]),r.addEntity(e[s-4]),r.addRelationship(e[s-6],e[s],e[s-4],e[s-5]),r.setClass([e[s-4]],e[s-2]);break;case 12:r.addEntity(e[s-3]),r.addAttributes(e[s-3],e[s-1]);break;case 13:r.addEntity(e[s-5]),r.addAttributes(e[s-5],e[s-1]),r.setClass([e[s-5]],e[s-3]);break;case 14:r.addEntity(e[s-2]);break;case 15:r.addEntity(e[s-4]),r.setClass([e[s-4]],e[s-2]);break;case 16:r.addEntity(e[s]);break;case 17:r.addEntity(e[s-2]),r.setClass([e[s-2]],e[s]);break;case 18:r.addEntity(e[s-6],e[s-4]),r.addAttributes(e[s-6],e[s-1]);break;case 19:r.addEntity(e[s-8],e[s-6]),r.addAttributes(e[s-8],e[s-1]),r.setClass([e[s-8]],e[s-3]);break;case 20:r.addEntity(e[s-5],e[s-3]);break;case 21:r.addEntity(e[s-7],e[s-5]),r.setClass([e[s-7]],e[s-2]);break;case 22:r.addEntity(e[s-3],e[s-1]);break;case 23:r.addEntity(e[s-5],e[s-3]),r.setClass([e[s-5]],e[s]);break;case 24:case 25:this.$=e[s].trim(),r.setAccTitle(this.$);break;case 26:case 27:this.$=e[s].trim(),r.setAccDescription(this.$);break;case 32:r.setDirection("TB");break;case 33:r.setDirection("BT");break;case 34:r.setDirection("RL");break;case 35:r.setDirection("LR");break;case 36:this.$=e[s-3],r.addClass(e[s-2],e[s-1]);break;case 37:case 38:case 59:case 67:this.$=[e[s]];break;case 39:case 40:this.$=e[s-2].concat([e[s]]);break;case 41:this.$=e[s-2],r.setClass(e[s-1],e[s]);break;case 42:this.$=e[s-3],r.addCssStyles(e[s-2],e[s-1]);break;case 43:this.$=[e[s]];break;case 44:e[s-2].push(e[s]),this.$=e[s-2];break;case 46:this.$=e[s-1]+e[s];break;case 54:case 79:case 80:this.$=e[s].replace(/"/g,"");break;case 55:case 56:case 57:case 58:case 81:this.$=e[s];break;case 60:e[s].push(e[s-1]),this.$=e[s];break;case 61:this.$={type:e[s-1],name:e[s]};break;case 62:this.$={type:e[s-2],name:e[s-1],keys:e[s]};break;case 63:this.$={type:e[s-2],name:e[s-1],comment:e[s]};break;case 64:this.$={type:e[s-3],name:e[s-2],keys:e[s-1],comment:e[s]};break;case 65:case 66:case 69:this.$=e[s];break;case 68:e[s-2].push(e[s]),this.$=e[s-2];break;case 70:this.$=e[s].replace(/"/g,"");break;case 71:this.$={cardA:e[s],relType:e[s-1],cardB:e[s-2]};break;case 72:this.$=r.Cardinality.ZERO_OR_ONE;break;case 73:this.$=r.Cardinality.ZERO_OR_MORE;break;case 74:this.$=r.Cardinality.ONE_OR_MORE;break;case 75:this.$=r.Cardinality.ONLY_ONE;break;case 76:this.$=r.Cardinality.MD_PARENT;break;case 77:this.$=r.Identification.NON_IDENTIFYING;break;case 78:this.$=r.Identification.IDENTIFYING;break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(i,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,22:d,24:o,26:h,28:b,29:14,30:15,31:16,32:17,33:R,34:k,35:_,36:w,37:W,40:E,43:ie,44:Q,48:S,50:I,51:V,52:M},t(i,[2,7],{1:[2,1]}),t(i,[2,3]),{9:30,11:9,22:d,24:o,26:h,28:b,29:14,30:15,31:16,32:17,33:R,34:k,35:_,36:w,37:W,40:E,43:ie,44:Q,48:S,50:I,51:V,52:M},t(i,[2,5]),t(i,[2,6]),t(i,[2,16],{12:31,63:35,15:[1,32],17:[1,33],20:[1,34],65:re,66:ae,67:ne,68:ce,69:oe}),{23:[1,41]},{25:[1,42]},{27:[1,43]},t(i,[2,27]),t(i,[2,28]),t(i,[2,29]),t(i,[2,30]),t(i,[2,31]),t(B,[2,54]),t(B,[2,55]),t(B,[2,56]),t(B,[2,57]),t(B,[2,58]),t(i,[2,32]),t(i,[2,33]),t(i,[2,34]),t(i,[2,35]),{16:44,40:T,41:O},{16:47,40:T,41:O},{16:48,40:T,41:O},t(i,[2,4]),{11:49,40:E,48:S,50:I,51:V,52:M},{16:50,40:T,41:O},{18:51,19:[1,52],53:53,54:54,58:F},{11:56,40:E,48:S,50:I,51:V,52:M},{64:57,70:[1,58],71:[1,59]},t(Y,[2,72]),t(Y,[2,73]),t(Y,[2,74]),t(Y,[2,75]),t(Y,[2,76]),t(i,[2,24]),t(i,[2,25]),t(i,[2,26]),{13:P,38:60,41:z,42:N,45:62,46:63,48:G,49:K},t(X,[2,37]),t(X,[2,38]),{16:68,40:T,41:O,42:N},{13:P,38:69,41:z,42:N,45:62,46:63,48:G,49:K},{13:[1,70],15:[1,71]},t(i,[2,17],{63:35,12:72,17:[1,73],42:N,65:re,66:ae,67:ne,68:ce,69:oe}),{19:[1,74]},t(i,[2,14]),{18:75,19:[2,59],53:53,54:54,58:F},{55:76,58:[1,77]},{58:[2,65]},{21:[1,78]},{63:79,65:re,66:ae,67:ne,68:ce,69:oe},t(ke,[2,77]),t(ke,[2,78]),{6:ge,10:_e,39:80,42:me,47:Ee},{40:[1,85],41:[1,86]},t(Se,[2,43],{46:87,13:P,41:z,48:G,49:K}),t(D,[2,45]),t(D,[2,50]),t(D,[2,51]),t(D,[2,52]),t(D,[2,53]),t(i,[2,41],{42:N}),{6:ge,10:_e,39:88,42:me,47:Ee},{14:89,40:q,50:H,72:J},{16:93,40:T,41:O},{11:94,40:E,48:S,50:I,51:V,52:M},{18:95,19:[1,96],53:53,54:54,58:F},t(i,[2,12]),{19:[2,60]},t(U,[2,61],{56:97,57:98,59:99,61:Te,62:Oe}),t([19,58,61,62],[2,66]),t(i,[2,22],{15:[1,103],17:[1,102]}),t([40,48,50,51,52],[2,71]),t(i,[2,36]),{13:P,41:z,45:104,46:63,48:G,49:K},t(i,[2,47]),t(i,[2,48]),t(i,[2,49]),t(X,[2,39]),t(X,[2,40]),t(D,[2,46]),t(i,[2,42]),t(i,[2,8]),t(i,[2,79]),t(i,[2,80]),t(i,[2,81]),{13:[1,105],42:N},{13:[1,107],15:[1,106]},{19:[1,108]},t(i,[2,15]),t(U,[2,62],{57:109,60:[1,110],62:Oe}),t(U,[2,63]),t(le,[2,67]),t(U,[2,70]),t(le,[2,69]),{18:111,19:[1,112],53:53,54:54,58:F},{16:113,40:T,41:O},t(Se,[2,44],{46:87,13:P,41:z,48:G,49:K}),{14:114,40:q,50:H,72:J},{16:115,40:T,41:O},{14:116,40:q,50:H,72:J},t(i,[2,13]),t(U,[2,64]),{59:117,61:Te},{19:[1,118]},t(i,[2,20]),t(i,[2,23],{17:[1,119],42:N}),t(i,[2,11]),{13:[1,120],42:N},t(i,[2,10]),t(le,[2,68]),t(i,[2,18]),{18:121,19:[1,122],53:53,54:54,58:F},{14:123,40:q,50:H,72:J},{19:[1,124]},t(i,[2,21]),t(i,[2,9]),t(i,[2,19])],defaultActions:{55:[2,65],75:[2,60]},parseError:l(function(a,n){if(n.recoverable)this.trace(a);else{var c=new Error(a);throw c.hash=n,c}},"parseError"),parse:l(function(a){var n=this,c=[0],r=[],u=[null],e=[],Z=this.table,s="",ee=0,Ne=0,Ae=0,qe=2,Re=1,He=e.slice.call(arguments,1),p=Object.create(this.lexer),x={yy:{}};for(var ue in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ue)&&(x.yy[ue]=this.yy[ue]);p.setInput(a,x.yy),x.yy.lexer=p,x.yy.parser=this,typeof p.yylloc>"u"&&(p.yylloc={});var de=p.yylloc;e.push(de);var Je=p.options&&p.options.ranges;typeof x.yy.parseError=="function"?this.parseError=x.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function $e(y){c.length=c.length-2*y,u.length=u.length-y,e.length=e.length-y}l($e,"popStack");function Ie(){var y;return y=r.pop()||p.lex()||Re,typeof y!="number"&&(y instanceof Array&&(r=y,y=r.pop()),y=n.symbols_[y]||y),y}l(Ie,"lex");for(var f,be,C,g,nt,pe,L={},te,m,xe,se;;){if(C=c[c.length-1],this.defaultActions[C]?g=this.defaultActions[C]:((f===null||typeof f>"u")&&(f=Ie()),g=Z[C]&&Z[C][f]),typeof g>"u"||!g.length||!g[0]){var fe="";se=[];for(te in Z[C])this.terminals_[te]&&te>qe&&se.push("'"+this.terminals_[te]+"'");p.showPosition?fe="Parse error on line "+(ee+1)+`: -`+p.showPosition()+` -Expecting `+se.join(", ")+", got '"+(this.terminals_[f]||f)+"'":fe="Parse error on line "+(ee+1)+": Unexpected "+(f==Re?"end of input":"'"+(this.terminals_[f]||f)+"'"),this.parseError(fe,{text:p.match,token:this.terminals_[f]||f,line:p.yylineno,loc:de,expected:se})}if(g[0]instanceof Array&&g.length>1)throw new Error("Parse Error: multiple actions possible at state: "+C+", token: "+f);switch(g[0]){case 1:c.push(f),u.push(p.yytext),e.push(p.yylloc),c.push(g[1]),f=null,be?(f=be,be=null):(Ne=p.yyleng,s=p.yytext,ee=p.yylineno,de=p.yylloc,Ae>0&&Ae--);break;case 2:if(m=this.productions_[g[1]][1],L.$=u[u.length-m],L._$={first_line:e[e.length-(m||1)].first_line,last_line:e[e.length-1].last_line,first_column:e[e.length-(m||1)].first_column,last_column:e[e.length-1].last_column},Je&&(L._$.range=[e[e.length-(m||1)].range[0],e[e.length-1].range[1]]),pe=this.performAction.apply(L,[s,Ne,ee,x.yy,g[1],u,e].concat(He)),typeof pe<"u")return pe;m&&(c=c.slice(0,-1*m*2),u=u.slice(0,-1*m),e=e.slice(0,-1*m)),c.push(this.productions_[g[1]][0]),u.push(L.$),e.push(L._$),xe=Z[c[c.length-2]][c[c.length-1]],c.push(xe);break;case 3:return!0}}return!0},"parse")},Xe=(function(){var A={EOF:1,parseError:l(function(n,c){if(this.yy.parser)this.yy.parser.parseError(n,c);else throw new Error(n)},"parseError"),setInput:l(function(a,n){return this.yy=n||this.yy||{},this._input=a,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:l(function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var n=a.match(/(?:\r\n?|\n).*/g);return n?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},"input"),unput:l(function(a){var n=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-n),this.offset-=n;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var u=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===r.length?this.yylloc.first_column:0)+r[r.length-c.length].length-c[0].length:this.yylloc.first_column-n},this.options.ranges&&(this.yylloc.range=[u[0],u[0]+this.yyleng-n]),this.yyleng=this.yytext.length,this},"unput"),more:l(function(){return this._more=!0,this},"more"),reject:l(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:l(function(a){this.unput(this.match.slice(a))},"less"),pastInput:l(function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:l(function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:l(function(){var a=this.pastInput(),n=new Array(a.length+1).join("-");return a+this.upcomingInput()+` -`+n+"^"},"showPosition"),test_match:l(function(a,n){var c,r,u;if(this.options.backtrack_lexer&&(u={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(u.yylloc.range=this.yylloc.range.slice(0))),r=a[0].match(/(?:\r\n?|\n).*/g),r&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+a[0].length},this.yytext+=a[0],this.match+=a[0],this.matches=a,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(a[0].length),this.matched+=a[0],c=this.performAction.call(this,this.yy,this,n,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),c)return c;if(this._backtrack){for(var e in u)this[e]=u[e];return!1}return!1},"test_match"),next:l(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,n,c,r;this._more||(this.yytext="",this.match="");for(var u=this._currentRules(),e=0;en[0].length)){if(n=c,r=e,this.options.backtrack_lexer){if(a=this.test_match(c,u[e]),a!==!1)return a;if(this._backtrack){n=!1;continue}else return!1}else if(!this.options.flex)break}return n?(a=this.test_match(n,u[r]),a!==!1?a:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:l(function(){var n=this.next();return n||this.lex()},"lex"),begin:l(function(n){this.conditionStack.push(n)},"begin"),popState:l(function(){var n=this.conditionStack.length-1;return n>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:l(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:l(function(n){return n=this.conditionStack.length-1-Math.abs(n||0),n>=0?this.conditionStack[n]:"INITIAL"},"topState"),pushState:l(function(n){this.begin(n)},"pushState"),stateStackSize:l(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:l(function(n,c,r,u){var e=u;switch(r){case 0:return this.begin("acc_title"),24;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),26;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 33;case 8:return 34;case 9:return 35;case 10:return 36;case 11:return 10;case 12:break;case 13:return 8;case 14:return 50;case 15:return 72;case 16:return 4;case 17:return this.begin("block"),17;break;case 18:return 49;case 19:return 49;case 20:return 42;case 21:return 15;case 22:return 13;case 23:break;case 24:return 61;case 25:return 58;case 26:return 58;case 27:return 62;case 28:break;case 29:return this.popState(),19;break;case 30:return c.yytext[0];case 31:return 20;case 32:return 21;case 33:return this.begin("style"),44;break;case 34:return this.popState(),10;break;case 35:break;case 36:return 13;case 37:return 42;case 38:return 49;case 39:return this.begin("style"),37;break;case 40:return 43;case 41:return 65;case 42:return 67;case 43:return 67;case 44:return 67;case 45:return 65;case 46:return 65;case 47:return 66;case 48:return 66;case 49:return 66;case 50:return 66;case 51:return 66;case 52:return 67;case 53:return 66;case 54:return 67;case 55:return 68;case 56:return 68;case 57:return 51;case 58:return 68;case 59:return 68;case 60:return 52;case 61:return 48;case 62:return 68;case 63:return 65;case 64:return 66;case 65:return 67;case 66:return 69;case 67:return 70;case 68:return 71;case 69:return 71;case 70:return 70;case 71:return 70;case 72:return 70;case 73:return 41;case 74:return 47;case 75:return 40;case 76:return c.yytext[0];case 77:return 6}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:#)/i,/^(?:#)/i,/^(?:,)/i,/^(?::::)/i,/^(?::)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:([^\s]*)[~].*[~]([^\s]*))/i,/^(?:([\*A-Za-z_\u00C0-\uFFFF][A-Za-z0-9\-\_\[\]\(\)\u00C0-\uFFFF\*]*))/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:style\b)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?::)/i,/^(?:,)/i,/^(?:#)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:[0-9]+\.[0-9]+)/i,/^(?:1(?=\s+[A-Za-z_"']))/i,/^(?:1(?=(--|\.\.|\.-|-\.)))/i,/^(?:1\b)/i,/^(?:[0-9]+)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:u(?=[\.\-\|]))/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:;)/i,/^(?:([^\x00-\x7F]|\w|-|\*|\.)+)/i,/^(?:.)/i,/^(?:$)/i],conditions:{style:{rules:[34,35,36,37,38,73,74],inclusive:!1},acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},block:{rules:[23,24,25,26,27,28,29,30],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,31,32,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,75,76,77],inclusive:!0}}};return A})();he.lexer=Xe;function $(){this.yy={}}return l($,"Parser"),$.prototype=he,he.Parser=$,new $})();ye.parser=ye;var et=ye,tt=class{constructor(){this.entities=new Map,this.relationships=[],this.classes=new Map,this.direction="TB",this.Cardinality={ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE",MD_PARENT:"MD_PARENT"},this.Identification={NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"},this.setAccTitle=Me,this.getAccTitle=Be,this.setAccDescription=Fe,this.getAccDescription=Ye,this.setDiagramTitle=Pe,this.getDiagramTitle=ze,this.getConfig=l(()=>j().er,"getConfig"),this.clear(),this.addEntity=this.addEntity.bind(this),this.addAttributes=this.addAttributes.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setDirection=this.setDirection.bind(this),this.addCssStyles=this.addCssStyles.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{l(this,"ErDB")}addEntity(t,i=""){return this.entities.has(t)?!this.entities.get(t)?.alias&&i&&(this.entities.get(t).alias=i,v.info(`Add alias '${i}' to entity '${t}'`)):(this.entities.set(t,{id:`entity-${t}-${this.entities.size}`,label:t,attributes:[],alias:i,shape:"erBox",look:j().look??"default",cssClasses:"default",cssStyles:[],labelType:"markdown"}),v.info("Added new entity :",t)),this.entities.get(t)}getEntity(t){return this.entities.get(t)}getEntities(){return this.entities}getClasses(){return this.classes}addAttributes(t,i){let d=this.addEntity(t),o;for(o=i.length-1;o>=0;o--)i[o].keys||(i[o].keys=[]),i[o].comment||(i[o].comment=""),d.attributes.push(i[o]),v.debug("Added attribute ",i[o].name)}addRelationship(t,i,d,o){let h=this.entities.get(t),b=this.entities.get(d);if(!h||!b)return;let R={entityA:h.id,roleA:i,entityB:b.id,relSpec:o};this.relationships.push(R),v.debug("Added new relationship :",R)}getRelationships(){return this.relationships}getDirection(){return this.direction}setDirection(t){this.direction=t}getCompiledStyles(t){let i=[];for(let d of t){let o=this.classes.get(d);o?.styles&&(i=[...i,...o.styles??[]].map(h=>h.trim())),o?.textStyles&&(i=[...i,...o.textStyles??[]].map(h=>h.trim()))}return i}addCssStyles(t,i){for(let d of t){let o=this.entities.get(d);if(!i||!o)return;for(let h of i)o.cssStyles.push(h)}}addClass(t,i){t.forEach(d=>{let o=this.classes.get(d);o===void 0&&(o={id:d,styles:[],textStyles:[]},this.classes.set(d,o)),i&&i.forEach(function(h){if(/color/.exec(h)){let b=h.replace("fill","bgFill");o.textStyles.push(b)}o.styles.push(h)})})}setClass(t,i){for(let d of t){let o=this.entities.get(d);if(o)for(let h of i)o.cssClasses+=" "+h}}clear(){this.entities=new Map,this.classes=new Map,this.relationships=[],Ve()}getData(){let t=[],i=[],d=j();for(let h of this.entities.keys()){let b=this.entities.get(h);b&&(b.cssCompiledStyles=this.getCompiledStyles(b.cssClasses.split(" ")),t.push(b))}let o=0;for(let h of this.relationships){let b={id:Ke(h.entityA,h.entityB,{prefix:"id",counter:o++}),type:"normal",curve:"basis",start:h.entityA,end:h.entityB,label:h.roleA,labelpos:"c",thickness:"normal",classes:"relationshipLine",arrowTypeStart:h.relSpec.cardB.toLowerCase(),arrowTypeEnd:h.relSpec.cardA.toLowerCase(),pattern:h.relSpec.relType=="IDENTIFYING"?"solid":"dashed",look:d.look,labelType:"markdown"};i.push(b)}return{nodes:t,edges:i,other:{},config:d,direction:"TB"}}},Qe={};De(Qe,{draw:()=>st});var st=l(function(t,i,d,o){return Ce(this,null,function*(){v.info("REF0:"),v.info("Drawing er diagram (unified)",i);let{securityLevel:h,er:b,layout:R}=j(),k=o.db.getData(),_=je(i,h);k.type=o.type,k.layoutAlgorithm=Ze(R),k.config.flowchart.nodeSpacing=b?.nodeSpacing||140,k.config.flowchart.rankSpacing=b?.rankSpacing||80,k.direction=o.db.getDirection(),k.markers=["only_one","zero_or_one","one_or_more","zero_or_more"],k.diagramId=i,yield Ue(k,_),k.layoutAlgorithm==="elk"&&_.select(".edges").lower();let w=_.selectAll('[id*="-background"]');Array.from(w).length>0&&w.each(function(){let E=ve(this),Q=E.attr("id").replace("-background",""),S=_.select(`#${CSS.escape(Q)}`);if(!S.empty()){let I=S.attr("transform");E.attr("transform",I)}});let W=8;Ge.insertTitle(_,"erDiagramTitleText",b?.titleTopMargin??25,o.db.getDiagramTitle()),We(_,W,"erDiagram",b?.useMaxWidth??!0)})},"draw"),it=l((t,i)=>{let d=we,o=d(t,"r"),h=d(t,"g"),b=d(t,"b");return Le(o,h,b,i)},"fade"),rt=l(t=>` - .entityBox { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - } - - .relationshipLabelBox { - fill: ${t.tertiaryColor}; - opacity: 0.7; - background-color: ${t.tertiaryColor}; - rect { - opacity: 0.5; - } - } - - .labelBkg { - background-color: ${it(t.tertiaryColor,.5)}; - } - - .edgeLabel .label { - fill: ${t.nodeBorder}; - font-size: 14px; - } - - .label { - font-family: ${t.fontFamily}; - color: ${t.nodeTextColor||t.textColor}; - } - - .edge-pattern-dashed { - stroke-dasharray: 8,8; - } - - .node rect, - .node circle, - .node ellipse, - .node polygon - { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - stroke-width: 1px; - } - - .relationshipLine { - stroke: ${t.lineColor}; - stroke-width: 1; - fill: none; - } - - .marker { - fill: none !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; - } - - .edgeLabel { - background-color: ${t.edgeLabelBackground}; - } - .edgeLabel .label rect { - fill: ${t.edgeLabelBackground}; - } - .edgeLabel .label text { - fill: ${t.textColor}; - } -`,"getStyles"),at=rt,Et={parser:et,get db(){return new tt},renderer:Qe,styles:at};export{Et as diagram}; diff --git a/src/google/adk/cli/browser/chunk-QMDHABEH.js b/src/google/adk/cli/browser/chunk-QMDHABEH.js deleted file mode 100644 index 7dbba58b45..0000000000 --- a/src/google/adk/cli/browser/chunk-QMDHABEH.js +++ /dev/null @@ -1,139 +0,0 @@ -import{a as gt}from"./chunk-B2DSW4QB.js";import{a as dt,b as ft,c as pt,f as Z}from"./chunk-NMKTPNXE.js";import"./chunk-GP6TCC26.js";import{N as st,R as at,S as lt,T as ot,U as ct,V as ht,W as ut,X as yt,Y as F}from"./chunk-QFMJV7VH.js";import{K as U,a as W,g as n}from"./chunk-JRNAXTJ7.js";import"./chunk-RMXJBC7V.js";var K=(function(){var t=n(function(h,r,a,l){for(a=a||{},l=h.length;l--;a[h[l]]=r);return a},"o"),e=[6,8,10,11,12,14,16,17,18],s=[1,9],c=[1,10],i=[1,11],f=[1,12],u=[1,13],d=[1,14],g={trace:n(function(){},"trace"),yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,taskName:18,taskData:19,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",18:"taskName",19:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],performAction:n(function(r,a,l,y,p,o,v){var k=o.length-1;switch(p){case 1:return o[k-1];case 2:this.$=[];break;case 3:o[k-1].push(o[k]),this.$=o[k-1];break;case 4:case 5:this.$=o[k];break;case 6:case 7:this.$=[];break;case 8:y.setDiagramTitle(o[k].substr(6)),this.$=o[k].substr(6);break;case 9:this.$=o[k].trim(),y.setAccTitle(this.$);break;case 10:case 11:this.$=o[k].trim(),y.setAccDescription(this.$);break;case 12:y.addSection(o[k].substr(8)),this.$=o[k].substr(8);break;case 13:y.addTask(o[k-1],o[k]),this.$="task";break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:s,12:c,14:i,16:f,17:u,18:d},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:15,11:s,12:c,14:i,16:f,17:u,18:d},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,16]},{15:[1,17]},t(e,[2,11]),t(e,[2,12]),{19:[1,18]},t(e,[2,4]),t(e,[2,9]),t(e,[2,10]),t(e,[2,13])],defaultActions:{},parseError:n(function(r,a){if(a.recoverable)this.trace(r);else{var l=new Error(r);throw l.hash=a,l}},"parseError"),parse:n(function(r){var a=this,l=[0],y=[],p=[null],o=[],v=this.table,k="",C=0,tt=0,et=0,$t=2,rt=1,Mt=o.slice.call(arguments,1),b=Object.create(this.lexer),I={yy:{}};for(var Y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Y)&&(I.yy[Y]=this.yy[Y]);b.setInput(r,I.yy),I.yy.lexer=b,I.yy.parser=this,typeof b.yylloc>"u"&&(b.yylloc={});var q=b.yylloc;o.push(q);var Et=b.options&&b.options.ranges;typeof I.yy.parseError=="function"?this.parseError=I.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Ct(w){l.length=l.length-2*w,p.length=p.length-w,o.length=o.length-w}n(Ct,"popStack");function it(){var w;return w=y.pop()||b.lex()||rt,typeof w!="number"&&(w instanceof Array&&(y=w,w=y.pop()),w=a.symbols_[w]||w),w}n(it,"lex");for(var _,H,A,T,Jt,X,V={},N,M,nt,z;;){if(A=l[l.length-1],this.defaultActions[A]?T=this.defaultActions[A]:((_===null||typeof _>"u")&&(_=it()),T=v[A]&&v[A][_]),typeof T>"u"||!T.length||!T[0]){var G="";z=[];for(N in v[A])this.terminals_[N]&&N>$t&&z.push("'"+this.terminals_[N]+"'");b.showPosition?G="Parse error on line "+(C+1)+`: -`+b.showPosition()+` -Expecting `+z.join(", ")+", got '"+(this.terminals_[_]||_)+"'":G="Parse error on line "+(C+1)+": Unexpected "+(_==rt?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(G,{text:b.match,token:this.terminals_[_]||_,line:b.yylineno,loc:q,expected:z})}if(T[0]instanceof Array&&T.length>1)throw new Error("Parse Error: multiple actions possible at state: "+A+", token: "+_);switch(T[0]){case 1:l.push(_),p.push(b.yytext),o.push(b.yylloc),l.push(T[1]),_=null,H?(_=H,H=null):(tt=b.yyleng,k=b.yytext,C=b.yylineno,q=b.yylloc,et>0&&et--);break;case 2:if(M=this.productions_[T[1]][1],V.$=p[p.length-M],V._$={first_line:o[o.length-(M||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(M||1)].first_column,last_column:o[o.length-1].last_column},Et&&(V._$.range=[o[o.length-(M||1)].range[0],o[o.length-1].range[1]]),X=this.performAction.apply(V,[k,tt,C,I.yy,T[1],p,o].concat(Mt)),typeof X<"u")return X;M&&(l=l.slice(0,-1*M*2),p=p.slice(0,-1*M),o=o.slice(0,-1*M)),l.push(this.productions_[T[1]][0]),p.push(V.$),o.push(V._$),nt=v[l[l.length-2]][l[l.length-1]],l.push(nt);break;case 3:return!0}}return!0},"parse")},m=(function(){var h={EOF:1,parseError:n(function(a,l){if(this.yy.parser)this.yy.parser.parseError(a,l);else throw new Error(a)},"parseError"),setInput:n(function(r,a){return this.yy=a||this.yy||{},this._input=r,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:n(function(){var r=this._input[0];this.yytext+=r,this.yyleng++,this.offset++,this.match+=r,this.matched+=r;var a=r.match(/(?:\r\n?|\n).*/g);return a?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),r},"input"),unput:n(function(r){var a=r.length,l=r.split(/(?:\r\n?|\n)/g);this._input=r+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-a),this.offset-=a;var y=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),l.length-1&&(this.yylineno-=l.length-1);var p=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:l?(l.length===y.length?this.yylloc.first_column:0)+y[y.length-l.length].length-l[0].length:this.yylloc.first_column-a},this.options.ranges&&(this.yylloc.range=[p[0],p[0]+this.yyleng-a]),this.yyleng=this.yytext.length,this},"unput"),more:n(function(){return this._more=!0,this},"more"),reject:n(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:n(function(r){this.unput(this.match.slice(r))},"less"),pastInput:n(function(){var r=this.matched.substr(0,this.matched.length-this.match.length);return(r.length>20?"...":"")+r.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:n(function(){var r=this.match;return r.length<20&&(r+=this._input.substr(0,20-r.length)),(r.substr(0,20)+(r.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:n(function(){var r=this.pastInput(),a=new Array(r.length+1).join("-");return r+this.upcomingInput()+` -`+a+"^"},"showPosition"),test_match:n(function(r,a){var l,y,p;if(this.options.backtrack_lexer&&(p={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(p.yylloc.range=this.yylloc.range.slice(0))),y=r[0].match(/(?:\r\n?|\n).*/g),y&&(this.yylineno+=y.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:y?y[y.length-1].length-y[y.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+r[0].length},this.yytext+=r[0],this.match+=r[0],this.matches=r,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(r[0].length),this.matched+=r[0],l=this.performAction.call(this,this.yy,this,a,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),l)return l;if(this._backtrack){for(var o in p)this[o]=p[o];return!1}return!1},"test_match"),next:n(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var r,a,l,y;this._more||(this.yytext="",this.match="");for(var p=this._currentRules(),o=0;oa[0].length)){if(a=l,y=o,this.options.backtrack_lexer){if(r=this.test_match(l,p[o]),r!==!1)return r;if(this._backtrack){a=!1;continue}else return!1}else if(!this.options.flex)break}return a?(r=this.test_match(a,p[y]),r!==!1?r:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:n(function(){var a=this.next();return a||this.lex()},"lex"),begin:n(function(a){this.conditionStack.push(a)},"begin"),popState:n(function(){var a=this.conditionStack.length-1;return a>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:n(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:n(function(a){return a=this.conditionStack.length-1-Math.abs(a||0),a>=0?this.conditionStack[a]:"INITIAL"},"topState"),pushState:n(function(a){this.begin(a)},"pushState"),stateStackSize:n(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:n(function(a,l,y,p){var o=p;switch(y){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 18;case 16:return 19;case 17:return":";case 18:return 6;case 19:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18,19],inclusive:!0}}};return h})();g.lexer=m;function x(){this.yy={}}return n(x,"Parser"),x.prototype=g,g.Parser=x,new x})();K.parser=K;var Pt=K,R="",Q=[],L=[],B=[],It=n(function(){Q.length=0,L.length=0,R="",B.length=0,at()},"clear"),At=n(function(t){R=t,Q.push(t)},"addSection"),Ft=n(function(){return Q},"getSections"),Vt=n(function(){let t=mt(),e=100,s=0;for(;!t&&s{s.people&&t.push(...s.people)}),[...new Set(t)].sort()},"updateActors"),Lt=n(function(t,e){let s=e.substr(1).split(":"),c=0,i=[];s.length===1?(c=Number(s[0]),i=[]):(c=Number(s[0]),i=s[1].split(","));let f=i.map(d=>d.trim()),u={section:R,type:R,people:f,task:t,score:c};B.push(u)},"addTask"),Bt=n(function(t){let e={section:R,type:R,description:t,task:t,classes:[]};L.push(e)},"addTaskOrg"),mt=n(function(){let t=n(function(s){return B[s].processed},"compileTask"),e=!0;for(let[s,c]of B.entries())t(s),e=e&&c.processed;return e},"compileTasks"),jt=n(function(){return Rt()},"getActors"),xt={getConfig:n(()=>F().journey,"getConfig"),clear:It,setDiagramTitle:ut,getDiagramTitle:yt,setAccTitle:lt,getAccTitle:ot,setAccDescription:ct,getAccDescription:ht,addSection:At,getSections:Ft,getTasks:Vt,addTask:Lt,addTaskOrg:Bt,getActors:jt},Nt=n(t=>`.label { - font-family: ${t.fontFamily}; - color: ${t.textColor}; - } - .mouth { - stroke: #666; - } - - line { - stroke: ${t.textColor} - } - - .legend { - fill: ${t.textColor}; - font-family: ${t.fontFamily}; - } - - .label text { - fill: #333; - } - .label { - color: ${t.textColor} - } - - .face { - ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"}; - stroke: #999; - } - - .node rect, - .node circle, - .node ellipse, - .node polygon, - .node path { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - stroke-width: 1px; - } - - .node .label { - text-align: center; - } - .node.clickable { - cursor: pointer; - } - - .arrowheadPath { - fill: ${t.arrowheadColor}; - } - - .edgePath .path { - stroke: ${t.lineColor}; - stroke-width: 1.5px; - } - - .flowchart-link { - stroke: ${t.lineColor}; - fill: none; - } - - .edgeLabel { - background-color: ${t.edgeLabelBackground}; - rect { - opacity: 0.5; - } - text-align: center; - } - - .cluster rect { - } - - .cluster text { - fill: ${t.titleColor}; - } - - div.mermaidTooltip { - position: absolute; - text-align: center; - max-width: 200px; - padding: 2px; - font-family: ${t.fontFamily}; - font-size: 12px; - background: ${t.tertiaryColor}; - border: 1px solid ${t.border2}; - border-radius: 2px; - pointer-events: none; - z-index: 100; - } - - .task-type-0, .section-type-0 { - ${t.fillType0?`fill: ${t.fillType0}`:""}; - } - .task-type-1, .section-type-1 { - ${t.fillType0?`fill: ${t.fillType1}`:""}; - } - .task-type-2, .section-type-2 { - ${t.fillType0?`fill: ${t.fillType2}`:""}; - } - .task-type-3, .section-type-3 { - ${t.fillType0?`fill: ${t.fillType3}`:""}; - } - .task-type-4, .section-type-4 { - ${t.fillType0?`fill: ${t.fillType4}`:""}; - } - .task-type-5, .section-type-5 { - ${t.fillType0?`fill: ${t.fillType5}`:""}; - } - .task-type-6, .section-type-6 { - ${t.fillType0?`fill: ${t.fillType6}`:""}; - } - .task-type-7, .section-type-7 { - ${t.fillType0?`fill: ${t.fillType7}`:""}; - } - - .actor-0 { - ${t.actor0?`fill: ${t.actor0}`:""}; - } - .actor-1 { - ${t.actor1?`fill: ${t.actor1}`:""}; - } - .actor-2 { - ${t.actor2?`fill: ${t.actor2}`:""}; - } - .actor-3 { - ${t.actor3?`fill: ${t.actor3}`:""}; - } - .actor-4 { - ${t.actor4?`fill: ${t.actor4}`:""}; - } - .actor-5 { - ${t.actor5?`fill: ${t.actor5}`:""}; - } - ${gt()} -`,"getStyles"),zt=Nt,D=n(function(t,e){return dt(t,e)},"drawRect"),Wt=n(function(t,e){let c=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function f(g){let m=U().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);g.append("path").attr("class","mouth").attr("d",m).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}n(f,"smile");function u(g){let m=U().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);g.append("path").attr("class","mouth").attr("d",m).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}n(u,"sad");function d(g){g.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return n(d,"ambivalent"),e.score>3?f(i):e.score<3?u(i):d(i),c},"drawFace"),vt=n(function(t,e){let s=t.append("circle");return s.attr("cx",e.cx),s.attr("cy",e.cy),s.attr("class","actor-"+e.pos),s.attr("fill",e.fill),s.attr("stroke",e.stroke),s.attr("r",e.r),s.class!==void 0&&s.attr("class",s.class),e.title!==void 0&&s.append("title").text(e.title),s},"drawCircle"),wt=n(function(t,e){return pt(t,e)},"drawText"),Ot=n(function(t,e){function s(i,f,u,d,g){return i+","+f+" "+(i+u)+","+f+" "+(i+u)+","+(f+d-g)+" "+(i+u-g*1.2)+","+(f+d)+" "+i+","+(f+d)}n(s,"genPoints");let c=t.append("polygon");c.attr("points",s(e.x,e.y,50,20,7)),c.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,wt(t,e)},"drawLabel"),Yt=n(function(t,e,s){let c=t.append("g"),i=Z();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=s.width*e.taskCount+s.diagramMarginX*(e.taskCount-1),i.height=s.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,D(c,i),Tt(s)(e.text,c,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},s,e.colour)},"drawSection"),kt=-1,qt=n(function(t,e,s){let c=e.x+s.width/2,i=t.append("g");kt++,i.append("line").attr("id","task"+kt).attr("x1",c).attr("y1",e.y).attr("x2",c).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),Wt(i,{cx:c,cy:300+(5-e.score)*30,score:e.score});let u=Z();u.x=e.x,u.y=e.y,u.fill=e.fill,u.width=s.width,u.height=s.height,u.class="task task-type-"+e.num,u.rx=3,u.ry=3,D(i,u);let d=e.x+14;e.people.forEach(g=>{let m=e.actors[g].color,x={cx:d,cy:e.y,r:7,fill:m,stroke:"#000",title:g,pos:e.actors[g].position};vt(i,x),d+=10}),Tt(s)(e.task,i,u.x,u.y,u.width,u.height,{class:"task"},s,e.colour)},"drawTask"),Ht=n(function(t,e){ft(t,e)},"drawBackgroundRect"),Tt=(function(){function t(i,f,u,d,g,m,x,h){let r=f.append("text").attr("x",u+g/2).attr("y",d+m/2+5).style("font-color",h).style("text-anchor","middle").text(i);c(r,x)}n(t,"byText");function e(i,f,u,d,g,m,x,h,r){let{taskFontSize:a,taskFontFamily:l}=h,y=i.split(//gi);for(let p=0;p{let f=E[i].color,u={cx:20,cy:c,r:7,fill:f,stroke:"#000",pos:E[i].position};j.drawCircle(t,u);let d=t.append("text").attr("visibility","hidden").text(i),g=d.node().getBoundingClientRect().width;d.remove();let m=[];if(g<=s)m=[i];else{let x=i.split(" "),h="";d=t.append("text").attr("visibility","hidden"),x.forEach(r=>{let a=h?`${h} ${r}`:r;if(d.text(a),d.node().getBoundingClientRect().width>s){if(h&&m.push(h),h=r,d.text(r),d.node().getBoundingClientRect().width>s){let y="";for(let p of r)y+=p,d.text(y+"-"),d.node().getBoundingClientRect().width>s&&(m.push(y.slice(0,-1)+"-"),y=p);h=y}}else h=a}),h&&m.push(h),d.remove()}m.forEach((x,h)=>{let r={x:40,y:c+7+h*20,fill:"#666",text:x,textMargin:e.boxTextMargin??5},l=j.drawText(t,r).node().getBoundingClientRect().width;l>O&&l>e.leftMargin-l&&(O=l)}),c+=Math.max(20,m.length*20)})}n(St,"drawActorLegend");var $=F().journey,P=0,Ut=n(function(t,e,s,c){let i=F(),f=i.journey.titleColor,u=i.journey.titleFontSize,d=i.journey.titleFontFamily,g=i.securityLevel,m;g==="sandbox"&&(m=W("#i"+e));let x=g==="sandbox"?W(m.nodes()[0].contentDocument.body):W("body");S.init();let h=x.select("#"+e);j.initGraphics(h);let r=c.db.getTasks(),a=c.db.getDiagramTitle(),l=c.db.getActors();for(let C in E)delete E[C];let y=0;l.forEach(C=>{E[C]={color:$.actorColours[y%$.actorColours.length],position:y},y++}),St(h),P=$.leftMargin+O,S.insert(0,0,P,Object.keys(E).length*50),Zt(h,r,0);let p=S.getBounds();a&&h.append("text").text(a).attr("x",P).attr("font-size",u).attr("font-weight","bold").attr("y",25).attr("fill",f).attr("font-family",d);let o=p.stopy-p.starty+2*$.diagramMarginY,v=P+p.stopx+2*$.diagramMarginX;st(h,o,v,$.useMaxWidth),h.append("line").attr("x1",P).attr("y1",$.height*4).attr("x2",v-P-4).attr("y2",$.height*4).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");let k=a?70:0;h.attr("viewBox",`${p.startx} -25 ${v} ${o+k}`),h.attr("preserveAspectRatio","xMinYMin meet"),h.attr("height",o+k+25)},"draw"),S={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:n(function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},"init"),updateVal:n(function(t,e,s,c){t[e]===void 0?t[e]=s:t[e]=c(s,t[e])},"updateVal"),updateBounds:n(function(t,e,s,c){let i=F().journey,f=this,u=0;function d(g){return n(function(x){u++;let h=f.sequenceItems.length-u+1;f.updateVal(x,"starty",e-h*i.boxMargin,Math.min),f.updateVal(x,"stopy",c+h*i.boxMargin,Math.max),f.updateVal(S.data,"startx",t-h*i.boxMargin,Math.min),f.updateVal(S.data,"stopx",s+h*i.boxMargin,Math.max),g!=="activation"&&(f.updateVal(x,"startx",t-h*i.boxMargin,Math.min),f.updateVal(x,"stopx",s+h*i.boxMargin,Math.max),f.updateVal(S.data,"starty",e-h*i.boxMargin,Math.min),f.updateVal(S.data,"stopy",c+h*i.boxMargin,Math.max))},"updateItemBounds")}n(d,"updateFn"),this.sequenceItems.forEach(d())},"updateBounds"),insert:n(function(t,e,s,c){let i=Math.min(t,s),f=Math.max(t,s),u=Math.min(e,c),d=Math.max(e,c);this.updateVal(S.data,"startx",i,Math.min),this.updateVal(S.data,"starty",u,Math.min),this.updateVal(S.data,"stopx",f,Math.max),this.updateVal(S.data,"stopy",d,Math.max),this.updateBounds(i,u,f,d)},"insert"),bumpVerticalPos:n(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},"bumpVerticalPos"),getVerticalPos:n(function(){return this.verticalPos},"getVerticalPos"),getBounds:n(function(){return this.data},"getBounds")},J=$.sectionFills,bt=$.sectionColours,Zt=n(function(t,e,s){let c=F().journey,i="",f=c.height*2+c.diagramMarginY,u=s+f,d=0,g="#CCC",m="black",x=0;for(let[h,r]of e.entries()){if(i!==r.section){g=J[d%J.length],x=d%J.length,m=bt[d%bt.length];let l=0,y=r.section;for(let o=h;o(E[y]&&(l[y]=E[y]),l),{});r.x=h*c.taskMargin+h*c.width+P,r.y=u,r.width=c.diagramMarginX,r.height=c.diagramMarginY,r.colour=m,r.fill=g,r.num=x,r.actors=a,j.drawTask(t,r,c),S.insert(r.x,r.y,r.x+r.width+c.taskMargin,450)}},"drawTasks"),_t={setConf:Gt,draw:Ut},ie={parser:Pt,db:xt,renderer:_t,styles:zt,init:n(t=>{_t.setConf(t.journey),xt.clear()},"init")};export{ie as diagram}; diff --git a/src/google/adk/cli/browser/chunk-RCKFX6QR.js b/src/google/adk/cli/browser/chunk-RCKFX6QR.js deleted file mode 100644 index 8ca9f21d72..0000000000 --- a/src/google/adk/cli/browser/chunk-RCKFX6QR.js +++ /dev/null @@ -1,162 +0,0 @@ -import{a as lt}from"./chunk-B2DSW4QB.js";import{h as ot}from"./chunk-NMKTPNXE.js";import{a as ct}from"./chunk-APNCZOFE.js";import{a as ht}from"./chunk-ST54LLJ3.js";import{a as it,b as rt}from"./chunk-ZMOC4H7T.js";import{b as nt,c as ut}from"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import{f as at}from"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import{m as Qe,p as Je}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{M as q1,R as X1,S as Q1,T as J1,U as Z1,V as $1,W as et,X as tt,Y as de,Z as u1,_ as st,a as K1,b as Y1,g as H1}from"./chunk-QFMJV7VH.js";import{a as Ee,g,i as Z}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{a as a1,b as n1,j as j1}from"./chunk-RMXJBC7V.js";var mt="flowchart-",Ct=class{constructor(){this.vertexCounter=0,this.config=de(),this.vertices=new Map,this.edges=[],this.classes=new Map,this.subGraphs=[],this.subGraphLookup=new Map,this.tooltips=new Map,this.subCount=0,this.firstGraphFlag=!0,this.secCount=-1,this.posCrossRef=[],this.funs=[],this.setAccTitle=Q1,this.setAccDescription=Z1,this.setDiagramTitle=et,this.getAccTitle=J1,this.getAccDescription=$1,this.getDiagramTitle=tt,this.funs.push(this.setupToolTips.bind(this)),this.addVertex=this.addVertex.bind(this),this.firstGraph=this.firstGraph.bind(this),this.setDirection=this.setDirection.bind(this),this.addSubGraph=this.addSubGraph.bind(this),this.addLink=this.addLink.bind(this),this.setLink=this.setLink.bind(this),this.updateLink=this.updateLink.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.destructLink=this.destructLink.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setTooltip=this.setTooltip.bind(this),this.updateLinkInterpolate=this.updateLinkInterpolate.bind(this),this.setClickFun=this.setClickFun.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.lex={firstGraph:this.firstGraph.bind(this)},this.clear(),this.setGen("gen-2")}static{g(this,"FlowDB")}sanitizeText(e){return q1.sanitizeText(e,this.config)}sanitizeNodeLabelType(e){switch(e){case"markdown":case"string":case"text":return e;default:return"markdown"}}lookUpDomId(e){for(let i of this.vertices.values())if(i.id===e)return i.domId;return e}addVertex(e,i,r,a,o,d,l={},k){if(!e||e.trim().length===0)return;let n;if(k!==void 0){let D;k.includes(` -`)?D=k+` -`:D=`{ -`+k+` -}`,n=rt(D,{schema:it})}let p=this.edges.find(D=>D.id===e);if(p){let D=n;D?.animate!==void 0&&(p.animate=D.animate),D?.animation!==void 0&&(p.animation=D.animation),D?.curve!==void 0&&(p.interpolate=D.curve);return}let S,b=this.vertices.get(e);if(b===void 0&&(b={id:e,labelType:"text",domId:mt+e+"-"+this.vertexCounter,styles:[],classes:[]},this.vertices.set(e,b)),this.vertexCounter++,i!==void 0?(this.config=de(),S=this.sanitizeText(i.text.trim()),b.labelType=i.type,S.startsWith('"')&&S.endsWith('"')&&(S=S.substring(1,S.length-1)),b.text=S):b.text===void 0&&(b.text=e),r!==void 0&&(b.type=r),a?.forEach(D=>{b.styles.push(D)}),o?.forEach(D=>{b.classes.push(D)}),d!==void 0&&(b.dir=d),b.props===void 0?b.props=l:l!==void 0&&Object.assign(b.props,l),n!==void 0){if(n.shape){if(n.shape!==n.shape.toLowerCase()||n.shape.includes("_"))throw new Error(`No such shape: ${n.shape}. Shape names should be lowercase.`);if(!at(n.shape))throw new Error(`No such shape: ${n.shape}.`);b.type=n?.shape}n?.label&&(b.text=n?.label,b.labelType=this.sanitizeNodeLabelType(n?.labelType)),n?.icon&&(b.icon=n?.icon,!n.label?.trim()&&b.text===e&&(b.text="")),n?.form&&(b.form=n?.form),n?.pos&&(b.pos=n?.pos),n?.img&&(b.img=n?.img,!n.label?.trim()&&b.text===e&&(b.text="")),n?.constraint&&(b.constraint=n.constraint),n.w&&(b.assetWidth=Number(n.w)),n.h&&(b.assetHeight=Number(n.h))}}addSingleLink(e,i,r,a){let l={start:e,end:i,type:void 0,text:"",labelType:"text",classes:[],isUserDefinedId:!1,interpolate:this.edges.defaultInterpolate};Z.info("abc78 Got edge...",l);let k=r.text;if(k!==void 0&&(l.text=this.sanitizeText(k.text.trim()),l.text.startsWith('"')&&l.text.endsWith('"')&&(l.text=l.text.substring(1,l.text.length-1)),l.labelType=this.sanitizeNodeLabelType(k.type)),r!==void 0&&(l.type=r.type,l.stroke=r.stroke,l.length=r.length>10?10:r.length),a&&!this.edges.some(n=>n.id===a))l.id=a,l.isUserDefinedId=!0;else{let n=this.edges.filter(p=>p.start===l.start&&p.end===l.end);n.length===0?l.id=Je(l.start,l.end,{counter:0,prefix:"L"}):l.id=Je(l.start,l.end,{counter:n.length+1,prefix:"L"})}if(this.edges.length<(this.config.maxEdges??500))Z.info("Pushing edge..."),this.edges.push(l);else throw new Error(`Edge limit exceeded. ${this.edges.length} edges found, but the limit is ${this.config.maxEdges}. - -Initialize mermaid with maxEdges set to a higher number to allow more edges. -You cannot set this config via configuration inside the diagram as it is a secure config. -You have to call mermaid.initialize.`)}isLinkData(e){return e!==null&&typeof e=="object"&&"id"in e&&typeof e.id=="string"}addLink(e,i,r){let a=this.isLinkData(r)?r.id.replace("@",""):void 0;Z.info("addLink",e,i,a);for(let o of e)for(let d of i){let l=o===e[e.length-1],k=d===i[0];l&&k?this.addSingleLink(o,d,r,a):this.addSingleLink(o,d,r,void 0)}}updateLinkInterpolate(e,i){e.forEach(r=>{r==="default"?this.edges.defaultInterpolate=i:this.edges[r].interpolate=i})}updateLink(e,i){e.forEach(r=>{if(typeof r=="number"&&r>=this.edges.length)throw new Error(`The index ${r} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${this.edges.length-1}. (Help: Ensure that the index is within the range of existing edges.)`);r==="default"?this.edges.defaultStyle=i:(this.edges[r].style=i,(this.edges[r]?.style?.length??0)>0&&!this.edges[r]?.style?.some(a=>a?.startsWith("fill"))&&this.edges[r]?.style?.push("fill:none"))})}addClass(e,i){let r=i.join().replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");e.split(",").forEach(a=>{let o=this.classes.get(a);o===void 0&&(o={id:a,styles:[],textStyles:[]},this.classes.set(a,o)),r?.forEach(d=>{if(/color/.exec(d)){let l=d.replace("fill","bgFill");o.textStyles.push(l)}o.styles.push(d)})})}setDirection(e){this.direction=e.trim(),/.*/.exec(this.direction)&&(this.direction="LR"),/.*v/.exec(this.direction)&&(this.direction="TB"),this.direction==="TD"&&(this.direction="TB")}setClass(e,i){for(let r of e.split(",")){let a=this.vertices.get(r);a&&a.classes.push(i);let o=this.edges.find(l=>l.id===r);o&&o.classes.push(i);let d=this.subGraphLookup.get(r);d&&d.classes.push(i)}}setTooltip(e,i){if(i!==void 0){i=this.sanitizeText(i);for(let r of e.split(","))this.tooltips.set(this.version==="gen-1"?this.lookUpDomId(r):r,i)}}setClickFun(e,i,r){let a=this.lookUpDomId(e);if(de().securityLevel!=="loose"||i===void 0)return;let o=[];if(typeof r=="string"){o=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let l=0;l{let l=document.querySelector(`[id="${a}"]`);l!==null&&l.addEventListener("click",()=>{Qe.runFunc(i,...o)},!1)}))}setLink(e,i,r){e.split(",").forEach(a=>{let o=this.vertices.get(a);o!==void 0&&(o.link=Qe.formatUrl(i,this.config),o.linkTarget=r)}),this.setClass(e,"clickable")}getTooltip(e){return this.tooltips.get(e)}setClickEvent(e,i,r){e.split(",").forEach(a=>{this.setClickFun(a,i,r)}),this.setClass(e,"clickable")}bindFunctions(e){this.funs.forEach(i=>{i(e)})}getDirection(){return this.direction?.trim()}getVertices(){return this.vertices}getEdges(){return this.edges}getClasses(){return this.classes}setupToolTips(e){let i=ot();Ee(e).select("svg").selectAll("g.node").on("mouseover",o=>{let d=Ee(o.currentTarget),l=d.attr("title");if(l===null)return;let k=o.currentTarget?.getBoundingClientRect();i.transition().duration(200).style("opacity",".9"),i.text(d.attr("title")).style("left",window.scrollX+k.left+(k.right-k.left)/2+"px").style("top",window.scrollY+k.bottom+"px"),i.html(H1.sanitize(l)),d.classed("hover",!0)}).on("mouseout",o=>{i.transition().duration(500).style("opacity",0),Ee(o.currentTarget).classed("hover",!1)})}clear(e="gen-2"){this.vertices=new Map,this.classes=new Map,this.edges=[],this.funs=[this.setupToolTips.bind(this)],this.subGraphs=[],this.subGraphLookup=new Map,this.subCount=0,this.tooltips=new Map,this.firstGraphFlag=!0,this.version=e,this.config=de(),X1()}setGen(e){this.version=e||"gen-2"}defaultStyle(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"}addSubGraph(e,i,r){let a=e.text.trim(),o=r.text;e===r&&/\s/.exec(r.text)&&(a=void 0);let l=g(b=>{let D={boolean:{},number:{},string:{}},K=[],x;return{nodeList:b.filter(function(U){let J=typeof U;return U.stmt&&U.stmt==="dir"?(x=U.value,!1):U.trim()===""?!1:J in D?D[J].hasOwnProperty(U)?!1:D[J][U]=!0:K.includes(U)?!1:K.push(U)}),dir:x}},"uniq")(i.flat()),k=l.nodeList,n=l.dir,p=de().flowchart??{};if(n=n??(p.inheritDir?this.getDirection()??de().direction??void 0:void 0),this.version==="gen-1")for(let b=0;b2e3)return{result:!1,count:0};if(this.posCrossRef[this.secCount]=i,this.subGraphs[i].id===e)return{result:!0,count:0};let a=0,o=1;for(;a=0){let l=this.indexNodes2(e,d);if(l.result)return{result:!0,count:o+l.count};o=o+l.count}a=a+1}return{result:!1,count:o}}getDepthFirstPos(e){return this.posCrossRef[e]}indexNodes(){this.secCount=-1,this.subGraphs.length>0&&this.indexNodes2("none",this.subGraphs.length-1)}getSubGraphs(){return this.subGraphs}firstGraph(){return this.firstGraphFlag?(this.firstGraphFlag=!1,!0):!1}destructStartLink(e){let i=e.trim(),r="arrow_open";switch(i[0]){case"<":r="arrow_point",i=i.slice(1);break;case"x":r="arrow_cross",i=i.slice(1);break;case"o":r="arrow_circle",i=i.slice(1);break}let a="normal";return i.includes("=")&&(a="thick"),i.includes(".")&&(a="dotted"),{type:r,stroke:a}}countChar(e,i){let r=i.length,a=0;for(let o=0;o":a="arrow_point",i.startsWith("<")&&(a="double_"+a,r=r.slice(1));break;case"o":a="arrow_circle",i.startsWith("o")&&(a="double_"+a,r=r.slice(1));break}let o="normal",d=r.length-1;r.startsWith("=")&&(o="thick"),r.startsWith("~")&&(o="invisible");let l=this.countChar(".",r);return l&&(o="dotted",d=l),{type:a,stroke:o,length:d}}destructLink(e,i){let r=this.destructEndLink(e),a;if(i){if(a=this.destructStartLink(i),a.stroke!==r.stroke)return{type:"INVALID",stroke:"INVALID"};if(a.type==="arrow_open")a.type=r.type;else{if(a.type!==r.type)return{type:"INVALID",stroke:"INVALID"};a.type="double_"+a.type}return a.type==="double_arrow"&&(a.type="double_arrow_point"),a.length=r.length,a}return r}exists(e,i){for(let r of e)if(r.nodes.includes(i))return!0;return!1}makeUniq(e,i){let r=[];return e.nodes.forEach((a,o)=>{this.exists(i,a)||r.push(e.nodes[o])}),{nodes:r}}getTypeFromVertex(e){if(e.img)return"imageSquare";if(e.icon)return e.form==="circle"?"iconCircle":e.form==="square"?"iconSquare":e.form==="rounded"?"iconRounded":"icon";switch(e.type){case"square":case void 0:return"squareRect";case"round":return"roundedRect";case"ellipse":return"ellipse";default:return e.type}}findNode(e,i){return e.find(r=>r.id===i)}destructEdgeType(e){let i="none",r="arrow_point";switch(e){case"arrow_point":case"arrow_circle":case"arrow_cross":r=e;break;case"double_arrow_point":case"double_arrow_circle":case"double_arrow_cross":i=e.replace("double_",""),r=i;break}return{arrowTypeStart:i,arrowTypeEnd:r}}addNodeFromVertex(e,i,r,a,o,d){let l=r.get(e.id),k=a.get(e.id)??!1,n=this.findNode(i,e.id);if(n)n.cssStyles=e.styles,n.cssCompiledStyles=this.getCompiledStyles(e.classes),n.cssClasses=e.classes.join(" ");else{let p={id:e.id,label:e.text,labelType:e.labelType,labelStyle:"",parentId:l,padding:o.flowchart?.padding||8,cssStyles:e.styles,cssCompiledStyles:this.getCompiledStyles(["default","node",...e.classes]),cssClasses:"default "+e.classes.join(" "),dir:e.dir,domId:e.domId,look:d,link:e.link,linkTarget:e.linkTarget,tooltip:this.getTooltip(e.id),icon:e.icon,pos:e.pos,img:e.img,assetWidth:e.assetWidth,assetHeight:e.assetHeight,constraint:e.constraint};k?i.push(n1(a1({},p),{isGroup:!0,shape:"rect"})):i.push(n1(a1({},p),{isGroup:!1,shape:this.getTypeFromVertex(e)}))}}getCompiledStyles(e){let i=[];for(let r of e){let a=this.classes.get(r);a?.styles&&(i=[...i,...a.styles??[]].map(o=>o.trim())),a?.textStyles&&(i=[...i,...a.textStyles??[]].map(o=>o.trim()))}return i}getData(){let e=de(),i=[],r=[],a=this.getSubGraphs(),o=new Map,d=new Map;for(let n=a.length-1;n>=0;n--){let p=a[n];p.nodes.length>0&&d.set(p.id,!0);for(let S of p.nodes)o.set(S,p.id)}for(let n=a.length-1;n>=0;n--){let p=a[n];i.push({id:p.id,label:p.title,labelStyle:"",labelType:p.labelType,parentId:o.get(p.id),padding:8,cssCompiledStyles:this.getCompiledStyles(p.classes),cssClasses:p.classes.join(" "),shape:"rect",dir:p.dir,isGroup:!0,look:e.look})}this.getVertices().forEach(n=>{this.addNodeFromVertex(n,i,o,d,e,e.look||"classic")});let k=this.getEdges();return k.forEach((n,p)=>{let{arrowTypeStart:S,arrowTypeEnd:b}=this.destructEdgeType(n.type),D=[...k.defaultStyle??[]];n.style&&D.push(...n.style);let K={id:Je(n.start,n.end,{counter:p,prefix:"L"},n.id),isUserDefinedId:n.isUserDefinedId,start:n.start,end:n.end,type:n.type??"normal",label:n.text,labelType:n.labelType,labelpos:"c",thickness:n.stroke,minlen:n.length,classes:n?.stroke==="invisible"?"":"edge-thickness-normal edge-pattern-solid flowchart-link",arrowTypeStart:n?.stroke==="invisible"||n?.type==="arrow_open"?"none":S,arrowTypeEnd:n?.stroke==="invisible"||n?.type==="arrow_open"?"none":b,arrowheadStyle:"fill: #333",cssCompiledStyles:this.getCompiledStyles(n.classes),labelStyle:D,style:D,pattern:n.stroke,look:e.look,animate:n.animate,animation:n.animation,curve:n.interpolate||this.edges.defaultInterpolate||e.flowchart?.curve};r.push(K)}),{nodes:i,edges:r,other:{},config:e}}defaultConfig(){return st.flowchart}},Et=g(function(e,i){return i.db.getClasses()},"getClasses"),Dt=g(function(e,i,r,a){return j1(this,null,function*(){Z.info("REF0:"),Z.info("Drawing state diagram (v2)",i);let{securityLevel:o,flowchart:d,layout:l}=de(),k;o==="sandbox"&&(k=Ee("#i"+i));let n=o==="sandbox"?k.nodes()[0].contentDocument:document;Z.debug("Before getData: ");let p=a.db.getData();Z.debug("Data: ",p);let S=ct(i,o),b=a.db.getDirection();p.type=a.type,p.layoutAlgorithm=ut(l),p.layoutAlgorithm==="dagre"&&l==="elk"&&Z.warn("flowchart-elk was moved to an external package in Mermaid v11. Please refer [release notes](https://github.com/mermaid-js/mermaid/releases/tag/v11.0.0) for more details. This diagram will be rendered using `dagre` layout as a fallback."),p.direction=b,p.nodeSpacing=d?.nodeSpacing||50,p.rankSpacing=d?.rankSpacing||50,p.markers=["point","circle","cross"],p.diagramId=i,Z.debug("REF1:",p),yield nt(p,S);let D=p.config.flowchart?.diagramPadding??8;Qe.insertTitle(S,"flowchartTitleText",d?.titleTopMargin||0,a.db.getDiagramTitle()),ht(S,D,"flowchart",d?.useMaxWidth||!1);for(let K of p.nodes){let x=Ee(`#${i} [id="${K.id}"]`);if(!x||!K.link)continue;let _=n.createElementNS("http://www.w3.org/2000/svg","a");_.setAttributeNS("http://www.w3.org/2000/svg","class",K.cssClasses),_.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),o==="sandbox"?_.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):K.linkTarget&&_.setAttributeNS("http://www.w3.org/2000/svg","target",K.linkTarget);let U=x.insert(function(){return _},":first-child"),J=x.select(".label-container");J&&U.append(function(){return J.node()});let ke=x.select(".label");ke&&U.append(function(){return ke.node()})}})},"draw"),St={getClasses:Et,draw:Dt},o1=(function(){var e=g(function(be,c,h,f){for(h=h||{},f=be.length;f--;h[be[f]]=c);return h},"o"),i=[1,4],r=[1,3],a=[1,5],o=[1,8,9,10,11,27,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124,125],d=[2,2],l=[1,13],k=[1,14],n=[1,15],p=[1,16],S=[1,23],b=[1,25],D=[1,26],K=[1,27],x=[1,50],_=[1,49],U=[1,29],J=[1,30],ke=[1,31],Pe=[1,32],Oe=[1,33],L=[1,45],V=[1,47],w=[1,43],I=[1,48],R=[1,44],N=[1,51],G=[1,46],P=[1,52],O=[1,53],Me=[1,34],Ue=[1,35],ze=[1,36],We=[1,37],je=[1,38],pe=[1,58],T=[1,8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124,125],ee=[1,62],te=[1,61],se=[1,63],De=[8,9,11,75,77,78],l1=[1,79],Se=[1,92],Te=[1,97],xe=[1,96],ye=[1,93],Fe=[1,89],_e=[1,95],Be=[1,91],ve=[1,98],Le=[1,94],Ve=[1,99],we=[1,90],ge=[8,9,10,11,40,75,77,78],z=[8,9,10,11,40,46,75,77,78],H=[8,9,10,11,29,40,44,46,48,50,52,54,56,58,60,63,65,67,68,70,75,77,78,89,102,105,106,109,111,114,115,116],c1=[8,9,11,44,60,75,77,78,89,102,105,106,109,111,114,115,116],Ie=[44,60,89,102,105,106,109,111,114,115,116],h1=[1,122],d1=[1,123],Ke=[1,125],Ye=[1,124],p1=[44,60,62,74,89,102,105,106,109,111,114,115,116],f1=[1,134],b1=[1,148],k1=[1,149],g1=[1,150],A1=[1,151],m1=[1,136],C1=[1,138],E1=[1,142],D1=[1,143],S1=[1,144],T1=[1,145],x1=[1,146],y1=[1,147],F1=[1,152],_1=[1,153],B1=[1,132],v1=[1,133],L1=[1,140],V1=[1,135],w1=[1,139],I1=[1,137],Ze=[8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124,125],R1=[1,155],N1=[1,157],B=[8,9,11],q=[8,9,10,11,14,44,60,89,105,106,109,111,114,115,116],A=[1,177],W=[1,173],j=[1,174],m=[1,178],C=[1,175],E=[1,176],Re=[77,116,119],y=[8,9,10,11,12,14,27,29,32,44,60,75,84,85,86,87,88,89,90,105,109,111,114,115,116],G1=[10,106],fe=[31,49,51,53,55,57,62,64,66,67,69,71,116,117,118],ie=[1,248],re=[1,246],ae=[1,250],ne=[1,244],ue=[1,245],oe=[1,247],le=[1,249],ce=[1,251],Ne=[1,269],P1=[8,9,11,106],$=[8,9,10,11,60,84,105,106,109,110,111,112],$e={trace:g(function(){},"trace"),yy:{},symbols_:{error:2,start:3,graphConfig:4,document:5,line:6,statement:7,SEMI:8,NEWLINE:9,SPACE:10,EOF:11,GRAPH:12,NODIR:13,DIR:14,FirstStmtSeparator:15,ending:16,endToken:17,spaceList:18,spaceListNewline:19,vertexStatement:20,separator:21,styleStatement:22,linkStyleStatement:23,classDefStatement:24,classStatement:25,clickStatement:26,subgraph:27,textNoTags:28,SQS:29,text:30,SQE:31,end:32,direction:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,shapeData:39,SHAPE_DATA:40,link:41,node:42,styledVertex:43,AMP:44,vertex:45,STYLE_SEPARATOR:46,idString:47,DOUBLECIRCLESTART:48,DOUBLECIRCLEEND:49,PS:50,PE:51,"(-":52,"-)":53,STADIUMSTART:54,STADIUMEND:55,SUBROUTINESTART:56,SUBROUTINEEND:57,VERTEX_WITH_PROPS_START:58,"NODE_STRING[field]":59,COLON:60,"NODE_STRING[value]":61,PIPE:62,CYLINDERSTART:63,CYLINDEREND:64,DIAMOND_START:65,DIAMOND_STOP:66,TAGEND:67,TRAPSTART:68,TRAPEND:69,INVTRAPSTART:70,INVTRAPEND:71,linkStatement:72,arrowText:73,TESTSTR:74,START_LINK:75,edgeText:76,LINK:77,LINK_ID:78,edgeTextToken:79,STR:80,MD_STR:81,textToken:82,keywords:83,STYLE:84,LINKSTYLE:85,CLASSDEF:86,CLASS:87,CLICK:88,DOWN:89,UP:90,textNoTagsToken:91,stylesOpt:92,"idString[vertex]":93,"idString[class]":94,CALLBACKNAME:95,CALLBACKARGS:96,HREF:97,LINK_TARGET:98,"STR[link]":99,"STR[tooltip]":100,alphaNum:101,DEFAULT:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,NODE_STRING:109,UNIT:110,BRKT:111,PCT:112,idStringToken:113,MINUS:114,MULT:115,UNICODE_TEXT:116,TEXT:117,TAGSTART:118,EDGE_TEXT:119,alphaNumToken:120,direction_tb:121,direction_bt:122,direction_rl:123,direction_lr:124,direction_td:125,$accept:0,$end:1},terminals_:{2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"NODIR",14:"DIR",27:"subgraph",29:"SQS",31:"SQE",32:"end",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",40:"SHAPE_DATA",44:"AMP",46:"STYLE_SEPARATOR",48:"DOUBLECIRCLESTART",49:"DOUBLECIRCLEEND",50:"PS",51:"PE",52:"(-",53:"-)",54:"STADIUMSTART",55:"STADIUMEND",56:"SUBROUTINESTART",57:"SUBROUTINEEND",58:"VERTEX_WITH_PROPS_START",59:"NODE_STRING[field]",60:"COLON",61:"NODE_STRING[value]",62:"PIPE",63:"CYLINDERSTART",64:"CYLINDEREND",65:"DIAMOND_START",66:"DIAMOND_STOP",67:"TAGEND",68:"TRAPSTART",69:"TRAPEND",70:"INVTRAPSTART",71:"INVTRAPEND",74:"TESTSTR",75:"START_LINK",77:"LINK",78:"LINK_ID",80:"STR",81:"MD_STR",84:"STYLE",85:"LINKSTYLE",86:"CLASSDEF",87:"CLASS",88:"CLICK",89:"DOWN",90:"UP",93:"idString[vertex]",94:"idString[class]",95:"CALLBACKNAME",96:"CALLBACKARGS",97:"HREF",98:"LINK_TARGET",99:"STR[link]",100:"STR[tooltip]",102:"DEFAULT",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"NODE_STRING",110:"UNIT",111:"BRKT",112:"PCT",114:"MINUS",115:"MULT",116:"UNICODE_TEXT",117:"TEXT",118:"TAGSTART",119:"EDGE_TEXT",121:"direction_tb",122:"direction_bt",123:"direction_rl",124:"direction_lr",125:"direction_td"},productions_:[0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,2],[4,3],[16,2],[16,1],[17,1],[17,1],[17,1],[15,1],[15,1],[15,2],[19,2],[19,2],[19,1],[19,1],[18,2],[18,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[7,1],[7,2],[7,2],[7,1],[21,1],[21,1],[21,1],[39,2],[39,1],[20,4],[20,3],[20,4],[20,2],[20,2],[20,1],[42,1],[42,6],[42,5],[43,1],[43,3],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,8],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[41,2],[41,3],[41,3],[41,1],[41,3],[41,4],[76,1],[76,2],[76,1],[76,1],[72,1],[72,2],[73,3],[30,1],[30,2],[30,1],[30,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[28,1],[28,2],[28,1],[28,1],[24,5],[25,5],[26,2],[26,4],[26,3],[26,5],[26,3],[26,5],[26,5],[26,7],[26,2],[26,4],[26,2],[26,4],[26,4],[26,6],[22,5],[23,5],[23,5],[23,9],[23,9],[23,7],[23,7],[103,1],[103,3],[92,1],[92,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[82,1],[82,1],[82,1],[82,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[79,1],[79,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[47,1],[47,2],[101,1],[101,2],[33,1],[33,1],[33,1],[33,1],[33,1]],performAction:g(function(c,h,f,u,F,t,Ae){var s=t.length-1;switch(F){case 2:this.$=[];break;case 3:(!Array.isArray(t[s])||t[s].length>0)&&t[s-1].push(t[s]),this.$=t[s-1];break;case 4:case 183:this.$=t[s];break;case 11:u.setDirection("TB"),this.$="TB";break;case 12:u.setDirection(t[s-1]),this.$=t[s-1];break;case 27:this.$=t[s-1].nodes;break;case 28:case 29:case 30:case 31:case 32:this.$=[];break;case 33:this.$=u.addSubGraph(t[s-6],t[s-1],t[s-4]);break;case 34:this.$=u.addSubGraph(t[s-3],t[s-1],t[s-3]);break;case 35:this.$=u.addSubGraph(void 0,t[s-1],void 0);break;case 37:this.$=t[s].trim(),u.setAccTitle(this.$);break;case 38:case 39:this.$=t[s].trim(),u.setAccDescription(this.$);break;case 43:this.$=t[s-1]+t[s];break;case 44:this.$=t[s];break;case 45:u.addVertex(t[s-1][t[s-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,t[s]),u.addLink(t[s-3].stmt,t[s-1],t[s-2]),this.$={stmt:t[s-1],nodes:t[s-1].concat(t[s-3].nodes)};break;case 46:u.addLink(t[s-2].stmt,t[s],t[s-1]),this.$={stmt:t[s],nodes:t[s].concat(t[s-2].nodes)};break;case 47:u.addLink(t[s-3].stmt,t[s-1],t[s-2]),this.$={stmt:t[s-1],nodes:t[s-1].concat(t[s-3].nodes)};break;case 48:this.$={stmt:t[s-1],nodes:t[s-1]};break;case 49:u.addVertex(t[s-1][t[s-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,t[s]),this.$={stmt:t[s-1],nodes:t[s-1],shapeData:t[s]};break;case 50:this.$={stmt:t[s],nodes:t[s]};break;case 51:this.$=[t[s]];break;case 52:u.addVertex(t[s-5][t[s-5].length-1],void 0,void 0,void 0,void 0,void 0,void 0,t[s-4]),this.$=t[s-5].concat(t[s]);break;case 53:this.$=t[s-4].concat(t[s]);break;case 54:this.$=t[s];break;case 55:this.$=t[s-2],u.setClass(t[s-2],t[s]);break;case 56:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"square");break;case 57:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"doublecircle");break;case 58:this.$=t[s-5],u.addVertex(t[s-5],t[s-2],"circle");break;case 59:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"ellipse");break;case 60:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"stadium");break;case 61:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"subroutine");break;case 62:this.$=t[s-7],u.addVertex(t[s-7],t[s-1],"rect",void 0,void 0,void 0,Object.fromEntries([[t[s-5],t[s-3]]]));break;case 63:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"cylinder");break;case 64:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"round");break;case 65:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"diamond");break;case 66:this.$=t[s-5],u.addVertex(t[s-5],t[s-2],"hexagon");break;case 67:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"odd");break;case 68:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"trapezoid");break;case 69:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"inv_trapezoid");break;case 70:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"lean_right");break;case 71:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"lean_left");break;case 72:this.$=t[s],u.addVertex(t[s]);break;case 73:t[s-1].text=t[s],this.$=t[s-1];break;case 74:case 75:t[s-2].text=t[s-1],this.$=t[s-2];break;case 76:this.$=t[s];break;case 77:var v=u.destructLink(t[s],t[s-2]);this.$={type:v.type,stroke:v.stroke,length:v.length,text:t[s-1]};break;case 78:var v=u.destructLink(t[s],t[s-2]);this.$={type:v.type,stroke:v.stroke,length:v.length,text:t[s-1],id:t[s-3]};break;case 79:this.$={text:t[s],type:"text"};break;case 80:this.$={text:t[s-1].text+""+t[s],type:t[s-1].type};break;case 81:this.$={text:t[s],type:"string"};break;case 82:this.$={text:t[s],type:"markdown"};break;case 83:var v=u.destructLink(t[s]);this.$={type:v.type,stroke:v.stroke,length:v.length};break;case 84:var v=u.destructLink(t[s]);this.$={type:v.type,stroke:v.stroke,length:v.length,id:t[s-1]};break;case 85:this.$=t[s-1];break;case 86:this.$={text:t[s],type:"text"};break;case 87:this.$={text:t[s-1].text+""+t[s],type:t[s-1].type};break;case 88:this.$={text:t[s],type:"string"};break;case 89:case 104:this.$={text:t[s],type:"markdown"};break;case 101:this.$={text:t[s],type:"text"};break;case 102:this.$={text:t[s-1].text+""+t[s],type:t[s-1].type};break;case 103:this.$={text:t[s],type:"text"};break;case 105:this.$=t[s-4],u.addClass(t[s-2],t[s]);break;case 106:this.$=t[s-4],u.setClass(t[s-2],t[s]);break;case 107:case 115:this.$=t[s-1],u.setClickEvent(t[s-1],t[s]);break;case 108:case 116:this.$=t[s-3],u.setClickEvent(t[s-3],t[s-2]),u.setTooltip(t[s-3],t[s]);break;case 109:this.$=t[s-2],u.setClickEvent(t[s-2],t[s-1],t[s]);break;case 110:this.$=t[s-4],u.setClickEvent(t[s-4],t[s-3],t[s-2]),u.setTooltip(t[s-4],t[s]);break;case 111:this.$=t[s-2],u.setLink(t[s-2],t[s]);break;case 112:this.$=t[s-4],u.setLink(t[s-4],t[s-2]),u.setTooltip(t[s-4],t[s]);break;case 113:this.$=t[s-4],u.setLink(t[s-4],t[s-2],t[s]);break;case 114:this.$=t[s-6],u.setLink(t[s-6],t[s-4],t[s]),u.setTooltip(t[s-6],t[s-2]);break;case 117:this.$=t[s-1],u.setLink(t[s-1],t[s]);break;case 118:this.$=t[s-3],u.setLink(t[s-3],t[s-2]),u.setTooltip(t[s-3],t[s]);break;case 119:this.$=t[s-3],u.setLink(t[s-3],t[s-2],t[s]);break;case 120:this.$=t[s-5],u.setLink(t[s-5],t[s-4],t[s]),u.setTooltip(t[s-5],t[s-2]);break;case 121:this.$=t[s-4],u.addVertex(t[s-2],void 0,void 0,t[s]);break;case 122:this.$=t[s-4],u.updateLink([t[s-2]],t[s]);break;case 123:this.$=t[s-4],u.updateLink(t[s-2],t[s]);break;case 124:this.$=t[s-8],u.updateLinkInterpolate([t[s-6]],t[s-2]),u.updateLink([t[s-6]],t[s]);break;case 125:this.$=t[s-8],u.updateLinkInterpolate(t[s-6],t[s-2]),u.updateLink(t[s-6],t[s]);break;case 126:this.$=t[s-6],u.updateLinkInterpolate([t[s-4]],t[s]);break;case 127:this.$=t[s-6],u.updateLinkInterpolate(t[s-4],t[s]);break;case 128:case 130:this.$=[t[s]];break;case 129:case 131:t[s-2].push(t[s]),this.$=t[s-2];break;case 133:this.$=t[s-1]+t[s];break;case 181:this.$=t[s];break;case 182:this.$=t[s-1]+""+t[s];break;case 184:this.$=t[s-1]+""+t[s];break;case 185:this.$={stmt:"dir",value:"TB"};break;case 186:this.$={stmt:"dir",value:"BT"};break;case 187:this.$={stmt:"dir",value:"RL"};break;case 188:this.$={stmt:"dir",value:"LR"};break;case 189:this.$={stmt:"dir",value:"TD"};break}},"anonymous"),table:[{3:1,4:2,9:i,10:r,12:a},{1:[3]},e(o,d,{5:6}),{4:7,9:i,10:r,12:a},{4:8,9:i,10:r,12:a},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:l,9:k,10:n,11:p,20:17,22:18,23:19,24:20,25:21,26:22,27:S,33:24,34:b,36:D,38:K,42:28,43:39,44:x,45:40,47:41,60:_,84:U,85:J,86:ke,87:Pe,88:Oe,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O,121:Me,122:Ue,123:ze,124:We,125:je},e(o,[2,9]),e(o,[2,10]),e(o,[2,11]),{8:[1,55],9:[1,56],10:pe,15:54,18:57},e(T,[2,3]),e(T,[2,4]),e(T,[2,5]),e(T,[2,6]),e(T,[2,7]),e(T,[2,8]),{8:ee,9:te,11:se,21:59,41:60,72:64,75:[1,65],77:[1,67],78:[1,66]},{8:ee,9:te,11:se,21:68},{8:ee,9:te,11:se,21:69},{8:ee,9:te,11:se,21:70},{8:ee,9:te,11:se,21:71},{8:ee,9:te,11:se,21:72},{8:ee,9:te,10:[1,73],11:se,21:74},e(T,[2,36]),{35:[1,75]},{37:[1,76]},e(T,[2,39]),e(De,[2,50],{18:77,39:78,10:pe,40:l1}),{10:[1,80]},{10:[1,81]},{10:[1,82]},{10:[1,83]},{14:Se,44:Te,60:xe,80:[1,87],89:ye,95:[1,84],97:[1,85],101:86,105:Fe,106:_e,109:Be,111:ve,114:Le,115:Ve,116:we,120:88},e(T,[2,185]),e(T,[2,186]),e(T,[2,187]),e(T,[2,188]),e(T,[2,189]),e(ge,[2,51]),e(ge,[2,54],{46:[1,100]}),e(z,[2,72],{113:113,29:[1,101],44:x,48:[1,102],50:[1,103],52:[1,104],54:[1,105],56:[1,106],58:[1,107],60:_,63:[1,108],65:[1,109],67:[1,110],68:[1,111],70:[1,112],89:L,102:V,105:w,106:I,109:R,111:N,114:G,115:P,116:O}),e(H,[2,181]),e(H,[2,142]),e(H,[2,143]),e(H,[2,144]),e(H,[2,145]),e(H,[2,146]),e(H,[2,147]),e(H,[2,148]),e(H,[2,149]),e(H,[2,150]),e(H,[2,151]),e(H,[2,152]),e(o,[2,12]),e(o,[2,18]),e(o,[2,19]),{9:[1,114]},e(c1,[2,26],{18:115,10:pe}),e(T,[2,27]),{42:116,43:39,44:x,45:40,47:41,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},e(T,[2,40]),e(T,[2,41]),e(T,[2,42]),e(Ie,[2,76],{73:117,62:[1,119],74:[1,118]}),{76:120,79:121,80:h1,81:d1,116:Ke,119:Ye},{75:[1,126],77:[1,127]},e(p1,[2,83]),e(T,[2,28]),e(T,[2,29]),e(T,[2,30]),e(T,[2,31]),e(T,[2,32]),{10:f1,12:b1,14:k1,27:g1,28:128,32:A1,44:m1,60:C1,75:E1,80:[1,130],81:[1,131],83:141,84:D1,85:S1,86:T1,87:x1,88:y1,89:F1,90:_1,91:129,105:B1,109:v1,111:L1,114:V1,115:w1,116:I1},e(Ze,d,{5:154}),e(T,[2,37]),e(T,[2,38]),e(De,[2,48],{44:R1}),e(De,[2,49],{18:156,10:pe,40:N1}),e(ge,[2,44]),{44:x,47:158,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},{102:[1,159],103:160,105:[1,161]},{44:x,47:162,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},{44:x,47:163,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},e(B,[2,107],{10:[1,164],96:[1,165]}),{80:[1,166]},e(B,[2,115],{120:168,10:[1,167],14:Se,44:Te,60:xe,89:ye,105:Fe,106:_e,109:Be,111:ve,114:Le,115:Ve,116:we}),e(B,[2,117],{10:[1,169]}),e(q,[2,183]),e(q,[2,170]),e(q,[2,171]),e(q,[2,172]),e(q,[2,173]),e(q,[2,174]),e(q,[2,175]),e(q,[2,176]),e(q,[2,177]),e(q,[2,178]),e(q,[2,179]),e(q,[2,180]),{44:x,47:170,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},{30:171,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:179,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:181,50:[1,180],67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:182,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:183,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:184,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{109:[1,185]},{30:186,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:187,65:[1,188],67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:189,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:190,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:191,67:A,80:W,81:j,82:172,116:m,117:C,118:E},e(H,[2,182]),e(o,[2,20]),e(c1,[2,25]),e(De,[2,46],{39:192,18:193,10:pe,40:l1}),e(Ie,[2,73],{10:[1,194]}),{10:[1,195]},{30:196,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{77:[1,197],79:198,116:Ke,119:Ye},e(Re,[2,79]),e(Re,[2,81]),e(Re,[2,82]),e(Re,[2,168]),e(Re,[2,169]),{76:199,79:121,80:h1,81:d1,116:Ke,119:Ye},e(p1,[2,84]),{8:ee,9:te,10:f1,11:se,12:b1,14:k1,21:201,27:g1,29:[1,200],32:A1,44:m1,60:C1,75:E1,83:141,84:D1,85:S1,86:T1,87:x1,88:y1,89:F1,90:_1,91:202,105:B1,109:v1,111:L1,114:V1,115:w1,116:I1},e(y,[2,101]),e(y,[2,103]),e(y,[2,104]),e(y,[2,157]),e(y,[2,158]),e(y,[2,159]),e(y,[2,160]),e(y,[2,161]),e(y,[2,162]),e(y,[2,163]),e(y,[2,164]),e(y,[2,165]),e(y,[2,166]),e(y,[2,167]),e(y,[2,90]),e(y,[2,91]),e(y,[2,92]),e(y,[2,93]),e(y,[2,94]),e(y,[2,95]),e(y,[2,96]),e(y,[2,97]),e(y,[2,98]),e(y,[2,99]),e(y,[2,100]),{6:11,7:12,8:l,9:k,10:n,11:p,20:17,22:18,23:19,24:20,25:21,26:22,27:S,32:[1,203],33:24,34:b,36:D,38:K,42:28,43:39,44:x,45:40,47:41,60:_,84:U,85:J,86:ke,87:Pe,88:Oe,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O,121:Me,122:Ue,123:ze,124:We,125:je},{10:pe,18:204},{44:[1,205]},e(ge,[2,43]),{10:[1,206],44:x,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:113,114:G,115:P,116:O},{10:[1,207]},{10:[1,208],106:[1,209]},e(G1,[2,128]),{10:[1,210],44:x,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:113,114:G,115:P,116:O},{10:[1,211],44:x,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:113,114:G,115:P,116:O},{80:[1,212]},e(B,[2,109],{10:[1,213]}),e(B,[2,111],{10:[1,214]}),{80:[1,215]},e(q,[2,184]),{80:[1,216],98:[1,217]},e(ge,[2,55],{113:113,44:x,60:_,89:L,102:V,105:w,106:I,109:R,111:N,114:G,115:P,116:O}),{31:[1,218],67:A,82:219,116:m,117:C,118:E},e(fe,[2,86]),e(fe,[2,88]),e(fe,[2,89]),e(fe,[2,153]),e(fe,[2,154]),e(fe,[2,155]),e(fe,[2,156]),{49:[1,220],67:A,82:219,116:m,117:C,118:E},{30:221,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{51:[1,222],67:A,82:219,116:m,117:C,118:E},{53:[1,223],67:A,82:219,116:m,117:C,118:E},{55:[1,224],67:A,82:219,116:m,117:C,118:E},{57:[1,225],67:A,82:219,116:m,117:C,118:E},{60:[1,226]},{64:[1,227],67:A,82:219,116:m,117:C,118:E},{66:[1,228],67:A,82:219,116:m,117:C,118:E},{30:229,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{31:[1,230],67:A,82:219,116:m,117:C,118:E},{67:A,69:[1,231],71:[1,232],82:219,116:m,117:C,118:E},{67:A,69:[1,234],71:[1,233],82:219,116:m,117:C,118:E},e(De,[2,45],{18:156,10:pe,40:N1}),e(De,[2,47],{44:R1}),e(Ie,[2,75]),e(Ie,[2,74]),{62:[1,235],67:A,82:219,116:m,117:C,118:E},e(Ie,[2,77]),e(Re,[2,80]),{77:[1,236],79:198,116:Ke,119:Ye},{30:237,67:A,80:W,81:j,82:172,116:m,117:C,118:E},e(Ze,d,{5:238}),e(y,[2,102]),e(T,[2,35]),{43:239,44:x,45:40,47:41,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},{10:pe,18:240},{10:ie,60:re,84:ae,92:241,105:ne,107:242,108:243,109:ue,110:oe,111:le,112:ce},{10:ie,60:re,84:ae,92:252,104:[1,253],105:ne,107:242,108:243,109:ue,110:oe,111:le,112:ce},{10:ie,60:re,84:ae,92:254,104:[1,255],105:ne,107:242,108:243,109:ue,110:oe,111:le,112:ce},{105:[1,256]},{10:ie,60:re,84:ae,92:257,105:ne,107:242,108:243,109:ue,110:oe,111:le,112:ce},{44:x,47:258,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},e(B,[2,108]),{80:[1,259]},{80:[1,260],98:[1,261]},e(B,[2,116]),e(B,[2,118],{10:[1,262]}),e(B,[2,119]),e(z,[2,56]),e(fe,[2,87]),e(z,[2,57]),{51:[1,263],67:A,82:219,116:m,117:C,118:E},e(z,[2,64]),e(z,[2,59]),e(z,[2,60]),e(z,[2,61]),{109:[1,264]},e(z,[2,63]),e(z,[2,65]),{66:[1,265],67:A,82:219,116:m,117:C,118:E},e(z,[2,67]),e(z,[2,68]),e(z,[2,70]),e(z,[2,69]),e(z,[2,71]),e([10,44,60,89,102,105,106,109,111,114,115,116],[2,85]),e(Ie,[2,78]),{31:[1,266],67:A,82:219,116:m,117:C,118:E},{6:11,7:12,8:l,9:k,10:n,11:p,20:17,22:18,23:19,24:20,25:21,26:22,27:S,32:[1,267],33:24,34:b,36:D,38:K,42:28,43:39,44:x,45:40,47:41,60:_,84:U,85:J,86:ke,87:Pe,88:Oe,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O,121:Me,122:Ue,123:ze,124:We,125:je},e(ge,[2,53]),{43:268,44:x,45:40,47:41,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},e(B,[2,121],{106:Ne}),e(P1,[2,130],{108:270,10:ie,60:re,84:ae,105:ne,109:ue,110:oe,111:le,112:ce}),e($,[2,132]),e($,[2,134]),e($,[2,135]),e($,[2,136]),e($,[2,137]),e($,[2,138]),e($,[2,139]),e($,[2,140]),e($,[2,141]),e(B,[2,122],{106:Ne}),{10:[1,271]},e(B,[2,123],{106:Ne}),{10:[1,272]},e(G1,[2,129]),e(B,[2,105],{106:Ne}),e(B,[2,106],{113:113,44:x,60:_,89:L,102:V,105:w,106:I,109:R,111:N,114:G,115:P,116:O}),e(B,[2,110]),e(B,[2,112],{10:[1,273]}),e(B,[2,113]),{98:[1,274]},{51:[1,275]},{62:[1,276]},{66:[1,277]},{8:ee,9:te,11:se,21:278},e(T,[2,34]),e(ge,[2,52]),{10:ie,60:re,84:ae,105:ne,107:279,108:243,109:ue,110:oe,111:le,112:ce},e($,[2,133]),{14:Se,44:Te,60:xe,89:ye,101:280,105:Fe,106:_e,109:Be,111:ve,114:Le,115:Ve,116:we,120:88},{14:Se,44:Te,60:xe,89:ye,101:281,105:Fe,106:_e,109:Be,111:ve,114:Le,115:Ve,116:we,120:88},{98:[1,282]},e(B,[2,120]),e(z,[2,58]),{30:283,67:A,80:W,81:j,82:172,116:m,117:C,118:E},e(z,[2,66]),e(Ze,d,{5:284}),e(P1,[2,131],{108:270,10:ie,60:re,84:ae,105:ne,109:ue,110:oe,111:le,112:ce}),e(B,[2,126],{120:168,10:[1,285],14:Se,44:Te,60:xe,89:ye,105:Fe,106:_e,109:Be,111:ve,114:Le,115:Ve,116:we}),e(B,[2,127],{120:168,10:[1,286],14:Se,44:Te,60:xe,89:ye,105:Fe,106:_e,109:Be,111:ve,114:Le,115:Ve,116:we}),e(B,[2,114]),{31:[1,287],67:A,82:219,116:m,117:C,118:E},{6:11,7:12,8:l,9:k,10:n,11:p,20:17,22:18,23:19,24:20,25:21,26:22,27:S,32:[1,288],33:24,34:b,36:D,38:K,42:28,43:39,44:x,45:40,47:41,60:_,84:U,85:J,86:ke,87:Pe,88:Oe,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O,121:Me,122:Ue,123:ze,124:We,125:je},{10:ie,60:re,84:ae,92:289,105:ne,107:242,108:243,109:ue,110:oe,111:le,112:ce},{10:ie,60:re,84:ae,92:290,105:ne,107:242,108:243,109:ue,110:oe,111:le,112:ce},e(z,[2,62]),e(T,[2,33]),e(B,[2,124],{106:Ne}),e(B,[2,125],{106:Ne})],defaultActions:{},parseError:g(function(c,h){if(h.recoverable)this.trace(c);else{var f=new Error(c);throw f.hash=h,f}},"parseError"),parse:g(function(c){var h=this,f=[0],u=[],F=[null],t=[],Ae=this.table,s="",v=0,O1=0,M1=0,bt=2,U1=1,kt=t.slice.call(arguments,1),M=Object.create(this.lexer),me={yy:{}};for(var e1 in this.yy)Object.prototype.hasOwnProperty.call(this.yy,e1)&&(me.yy[e1]=this.yy[e1]);M.setInput(c,me.yy),me.yy.lexer=M,me.yy.parser=this,typeof M.yylloc>"u"&&(M.yylloc={});var t1=M.yylloc;t.push(t1);var gt=M.options&&M.options.ranges;typeof me.yy.parseError=="function"?this.parseError=me.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function At(X){f.length=f.length-2*X,F.length=F.length-X,t.length=t.length-X}g(At,"popStack");function z1(){var X;return X=u.pop()||M.lex()||U1,typeof X!="number"&&(X instanceof Array&&(u=X,X=u.pop()),X=h.symbols_[X]||X),X}g(z1,"lex");for(var Y,s1,Ce,Q,_t,i1,Ge={},qe,he,W1,Xe;;){if(Ce=f[f.length-1],this.defaultActions[Ce]?Q=this.defaultActions[Ce]:((Y===null||typeof Y>"u")&&(Y=z1()),Q=Ae[Ce]&&Ae[Ce][Y]),typeof Q>"u"||!Q.length||!Q[0]){var r1="";Xe=[];for(qe in Ae[Ce])this.terminals_[qe]&&qe>bt&&Xe.push("'"+this.terminals_[qe]+"'");M.showPosition?r1="Parse error on line "+(v+1)+`: -`+M.showPosition()+` -Expecting `+Xe.join(", ")+", got '"+(this.terminals_[Y]||Y)+"'":r1="Parse error on line "+(v+1)+": Unexpected "+(Y==U1?"end of input":"'"+(this.terminals_[Y]||Y)+"'"),this.parseError(r1,{text:M.match,token:this.terminals_[Y]||Y,line:M.yylineno,loc:t1,expected:Xe})}if(Q[0]instanceof Array&&Q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Ce+", token: "+Y);switch(Q[0]){case 1:f.push(Y),F.push(M.yytext),t.push(M.yylloc),f.push(Q[1]),Y=null,s1?(Y=s1,s1=null):(O1=M.yyleng,s=M.yytext,v=M.yylineno,t1=M.yylloc,M1>0&&M1--);break;case 2:if(he=this.productions_[Q[1]][1],Ge.$=F[F.length-he],Ge._$={first_line:t[t.length-(he||1)].first_line,last_line:t[t.length-1].last_line,first_column:t[t.length-(he||1)].first_column,last_column:t[t.length-1].last_column},gt&&(Ge._$.range=[t[t.length-(he||1)].range[0],t[t.length-1].range[1]]),i1=this.performAction.apply(Ge,[s,O1,v,me.yy,Q[1],F,t].concat(kt)),typeof i1<"u")return i1;he&&(f=f.slice(0,-1*he*2),F=F.slice(0,-1*he),t=t.slice(0,-1*he)),f.push(this.productions_[Q[1]][0]),F.push(Ge.$),t.push(Ge._$),W1=Ae[f[f.length-2]][f[f.length-1]],f.push(W1);break;case 3:return!0}}return!0},"parse")},ft=(function(){var be={EOF:1,parseError:g(function(h,f){if(this.yy.parser)this.yy.parser.parseError(h,f);else throw new Error(h)},"parseError"),setInput:g(function(c,h){return this.yy=h||this.yy||{},this._input=c,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:g(function(){var c=this._input[0];this.yytext+=c,this.yyleng++,this.offset++,this.match+=c,this.matched+=c;var h=c.match(/(?:\r\n?|\n).*/g);return h?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),c},"input"),unput:g(function(c){var h=c.length,f=c.split(/(?:\r\n?|\n)/g);this._input=c+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-h),this.offset-=h;var u=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),f.length-1&&(this.yylineno-=f.length-1);var F=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:f?(f.length===u.length?this.yylloc.first_column:0)+u[u.length-f.length].length-f[0].length:this.yylloc.first_column-h},this.options.ranges&&(this.yylloc.range=[F[0],F[0]+this.yyleng-h]),this.yyleng=this.yytext.length,this},"unput"),more:g(function(){return this._more=!0,this},"more"),reject:g(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:g(function(c){this.unput(this.match.slice(c))},"less"),pastInput:g(function(){var c=this.matched.substr(0,this.matched.length-this.match.length);return(c.length>20?"...":"")+c.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:g(function(){var c=this.match;return c.length<20&&(c+=this._input.substr(0,20-c.length)),(c.substr(0,20)+(c.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:g(function(){var c=this.pastInput(),h=new Array(c.length+1).join("-");return c+this.upcomingInput()+` -`+h+"^"},"showPosition"),test_match:g(function(c,h){var f,u,F;if(this.options.backtrack_lexer&&(F={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(F.yylloc.range=this.yylloc.range.slice(0))),u=c[0].match(/(?:\r\n?|\n).*/g),u&&(this.yylineno+=u.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:u?u[u.length-1].length-u[u.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+c[0].length},this.yytext+=c[0],this.match+=c[0],this.matches=c,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(c[0].length),this.matched+=c[0],f=this.performAction.call(this,this.yy,this,h,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),f)return f;if(this._backtrack){for(var t in F)this[t]=F[t];return!1}return!1},"test_match"),next:g(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var c,h,f,u;this._more||(this.yytext="",this.match="");for(var F=this._currentRules(),t=0;th[0].length)){if(h=f,u=t,this.options.backtrack_lexer){if(c=this.test_match(f,F[t]),c!==!1)return c;if(this._backtrack){h=!1;continue}else return!1}else if(!this.options.flex)break}return h?(c=this.test_match(h,F[u]),c!==!1?c:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:g(function(){var h=this.next();return h||this.lex()},"lex"),begin:g(function(h){this.conditionStack.push(h)},"begin"),popState:g(function(){var h=this.conditionStack.length-1;return h>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:g(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:g(function(h){return h=this.conditionStack.length-1-Math.abs(h||0),h>=0?this.conditionStack[h]:"INITIAL"},"topState"),pushState:g(function(h){this.begin(h)},"pushState"),stateStackSize:g(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:g(function(h,f,u,F){var t=F;switch(u){case 0:return this.begin("acc_title"),34;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),36;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.pushState("shapeData"),f.yytext="",40;break;case 8:return this.pushState("shapeDataStr"),40;break;case 9:return this.popState(),40;break;case 10:let Ae=/\n\s*/g;return f.yytext=f.yytext.replace(Ae,"
"),40;break;case 11:return 40;case 12:this.popState();break;case 13:this.begin("callbackname");break;case 14:this.popState();break;case 15:this.popState(),this.begin("callbackargs");break;case 16:return 95;case 17:this.popState();break;case 18:return 96;case 19:return"MD_STR";case 20:this.popState();break;case 21:this.begin("md_string");break;case 22:return"STR";case 23:this.popState();break;case 24:this.pushState("string");break;case 25:return 84;case 26:return 102;case 27:return 85;case 28:return 104;case 29:return 86;case 30:return 87;case 31:return 97;case 32:this.begin("click");break;case 33:this.popState();break;case 34:return 88;case 35:return h.lex.firstGraph()&&this.begin("dir"),12;break;case 36:return h.lex.firstGraph()&&this.begin("dir"),12;break;case 37:return h.lex.firstGraph()&&this.begin("dir"),12;break;case 38:return 27;case 39:return 32;case 40:return 98;case 41:return 98;case 42:return 98;case 43:return 98;case 44:return this.popState(),13;break;case 45:return this.popState(),14;break;case 46:return this.popState(),14;break;case 47:return this.popState(),14;break;case 48:return this.popState(),14;break;case 49:return this.popState(),14;break;case 50:return this.popState(),14;break;case 51:return this.popState(),14;break;case 52:return this.popState(),14;break;case 53:return this.popState(),14;break;case 54:return this.popState(),14;break;case 55:return 121;case 56:return 122;case 57:return 123;case 58:return 124;case 59:return 125;case 60:return 78;case 61:return 105;case 62:return 111;case 63:return 46;case 64:return 60;case 65:return 44;case 66:return 8;case 67:return 106;case 68:return 115;case 69:return this.popState(),77;break;case 70:return this.pushState("edgeText"),75;break;case 71:return 119;case 72:return this.popState(),77;break;case 73:return this.pushState("thickEdgeText"),75;break;case 74:return 119;case 75:return this.popState(),77;break;case 76:return this.pushState("dottedEdgeText"),75;break;case 77:return 119;case 78:return 77;case 79:return this.popState(),53;break;case 80:return"TEXT";case 81:return this.pushState("ellipseText"),52;break;case 82:return this.popState(),55;break;case 83:return this.pushState("text"),54;break;case 84:return this.popState(),57;break;case 85:return this.pushState("text"),56;break;case 86:return 58;case 87:return this.pushState("text"),67;break;case 88:return this.popState(),64;break;case 89:return this.pushState("text"),63;break;case 90:return this.popState(),49;break;case 91:return this.pushState("text"),48;break;case 92:return this.popState(),69;break;case 93:return this.popState(),71;break;case 94:return 117;case 95:return this.pushState("trapText"),68;break;case 96:return this.pushState("trapText"),70;break;case 97:return 118;case 98:return 67;case 99:return 90;case 100:return"SEP";case 101:return 89;case 102:return 115;case 103:return 111;case 104:return 44;case 105:return 109;case 106:return 114;case 107:return 116;case 108:return this.popState(),62;break;case 109:return this.pushState("text"),62;break;case 110:return this.popState(),51;break;case 111:return this.pushState("text"),50;break;case 112:return this.popState(),31;break;case 113:return this.pushState("text"),29;break;case 114:return this.popState(),66;break;case 115:return this.pushState("text"),65;break;case 116:return"TEXT";case 117:return"QUOTE";case 118:return 9;case 119:return 10;case 120:return 11}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:@\{)/,/^(?:["])/,/^(?:["])/,/^(?:[^\"]+)/,/^(?:[^}^"]+)/,/^(?:\})/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["][`])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:["])/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s])/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:.*direction\s+TD[^\n]*)/,/^(?:[^\s\"]+@(?=[^\{\"]))/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:[^-]|-(?!-)+)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:[^=]|=(?!))/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:[^\.]|\.(?!))/,/^(?:\s*~~[\~]+\s*)/,/^(?:[-/\)][\)])/,/^(?:[^\(\)\[\]\{\}]|!\)+)/,/^(?:\(-)/,/^(?:\]\))/,/^(?:\(\[)/,/^(?:\]\])/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:>)/,/^(?:\)\])/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\(\(\()/,/^(?:[\\(?=\])][\]])/,/^(?:\/(?=\])\])/,/^(?:\/(?!\])|\\(?!\])|[^\\\[\]\(\)\{\}\/]+)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:\*)/,/^(?:#)/,/^(?:&)/,/^(?:([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|-(?=[^\>\-\.])|(?!))+)/,/^(?:-)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\|)/,/^(?:\))/,/^(?:\()/,/^(?:\])/,/^(?:\[)/,/^(?:(\}))/,/^(?:\{)/,/^(?:[^\[\]\(\)\{\}\|\"]+)/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{shapeDataEndBracket:{rules:[21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},shapeDataStr:{rules:[9,10,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},shapeData:{rules:[8,11,12,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},callbackargs:{rules:[17,18,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},callbackname:{rules:[14,15,16,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},href:{rules:[21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},click:{rules:[21,24,33,34,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},dottedEdgeText:{rules:[21,24,75,77,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},thickEdgeText:{rules:[21,24,72,74,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},edgeText:{rules:[21,24,69,71,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},trapText:{rules:[21,24,78,81,83,85,89,91,92,93,94,95,96,109,111,113,115],inclusive:!1},ellipseText:{rules:[21,24,78,79,80,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},text:{rules:[21,24,78,81,82,83,84,85,88,89,90,91,95,96,108,109,110,111,112,113,114,115,116],inclusive:!1},vertex:{rules:[21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},dir:{rules:[21,24,44,45,46,47,48,49,50,51,52,53,54,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},acc_descr_multiline:{rules:[5,6,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},acc_descr:{rules:[3,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},acc_title:{rules:[1,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},md_string:{rules:[19,20,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},string:{rules:[21,22,23,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},INITIAL:{rules:[0,2,4,7,13,21,24,25,26,27,28,29,30,31,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,72,73,75,76,78,81,83,85,86,87,89,91,95,96,97,98,99,100,101,102,103,104,105,106,107,109,111,113,115,117,118,119,120],inclusive:!0}}};return be})();$e.lexer=ft;function He(){this.yy={}}return g(He,"Parser"),He.prototype=$e,$e.Parser=He,new He})();o1.parser=o1;var dt=o1,pt=Object.assign({},dt);pt.parse=e=>{let i=e.replace(/}\s*\n/g,`} -`);return dt.parse(i)};var Tt=pt,xt=g((e,i)=>{let r=Y1,a=r(e,"r"),o=r(e,"g"),d=r(e,"b");return K1(a,o,d,i)},"fade"),yt=g(e=>`.label { - font-family: ${e.fontFamily}; - color: ${e.nodeTextColor||e.textColor}; - } - .cluster-label text { - fill: ${e.titleColor}; - } - .cluster-label span { - color: ${e.titleColor}; - } - .cluster-label span p { - background-color: transparent; - } - - .label text,span { - fill: ${e.nodeTextColor||e.textColor}; - color: ${e.nodeTextColor||e.textColor}; - } - - .node rect, - .node circle, - .node ellipse, - .node polygon, - .node path { - fill: ${e.mainBkg}; - stroke: ${e.nodeBorder}; - stroke-width: 1px; - } - .rough-node .label text , .node .label text, .image-shape .label, .icon-shape .label { - text-anchor: middle; - } - // .flowchart-label .text-outer-tspan { - // text-anchor: middle; - // } - // .flowchart-label .text-inner-tspan { - // text-anchor: start; - // } - - .node .katex path { - fill: #000; - stroke: #000; - stroke-width: 1px; - } - - .rough-node .label,.node .label, .image-shape .label, .icon-shape .label { - text-align: center; - } - .node.clickable { - cursor: pointer; - } - - - .root .anchor path { - fill: ${e.lineColor} !important; - stroke-width: 0; - stroke: ${e.lineColor}; - } - - .arrowheadPath { - fill: ${e.arrowheadColor}; - } - - .edgePath .path { - stroke: ${e.lineColor}; - stroke-width: 2.0px; - } - - .flowchart-link { - stroke: ${e.lineColor}; - fill: none; - } - - .edgeLabel { - background-color: ${e.edgeLabelBackground}; - p { - background-color: ${e.edgeLabelBackground}; - } - rect { - opacity: 0.5; - background-color: ${e.edgeLabelBackground}; - fill: ${e.edgeLabelBackground}; - } - text-align: center; - } - - /* For html labels only */ - .labelBkg { - background-color: ${xt(e.edgeLabelBackground,.5)}; - // background-color: - } - - .cluster rect { - fill: ${e.clusterBkg}; - stroke: ${e.clusterBorder}; - stroke-width: 1px; - } - - .cluster text { - fill: ${e.titleColor}; - } - - .cluster span { - color: ${e.titleColor}; - } - /* .cluster div { - color: ${e.titleColor}; - } */ - - div.mermaidTooltip { - position: absolute; - text-align: center; - max-width: 200px; - padding: 2px; - font-family: ${e.fontFamily}; - font-size: 12px; - background: ${e.tertiaryColor}; - border: 1px solid ${e.border2}; - border-radius: 2px; - pointer-events: none; - z-index: 100; - } - - .flowchartTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${e.textColor}; - } - - rect.text { - fill: none; - stroke-width: 0; - } - - .icon-shape, .image-shape { - background-color: ${e.edgeLabelBackground}; - p { - background-color: ${e.edgeLabelBackground}; - padding: 2px; - } - .label rect { - opacity: 0.5; - background-color: ${e.edgeLabelBackground}; - fill: ${e.edgeLabelBackground}; - } - text-align: center; - } - ${lt()} -`,"getStyles"),Ft=yt,qt={parser:Tt,get db(){return new Ct},renderer:St,styles:Ft,init:g(e=>{e.flowchart||(e.flowchart={}),e.layout&&u1({layout:e.layout}),e.flowchart.arrowMarkerAbsolute=e.arrowMarkerAbsolute,u1({flowchart:{arrowMarkerAbsolute:e.arrowMarkerAbsolute}})},"init")};export{qt as diagram}; diff --git a/src/google/adk/cli/browser/chunk-RMXJBC7V.js b/src/google/adk/cli/browser/chunk-RMXJBC7V.js deleted file mode 100644 index ae85e2370c..0000000000 --- a/src/google/adk/cli/browser/chunk-RMXJBC7V.js +++ /dev/null @@ -1 +0,0 @@ -var r=Object.create;var j=Object.defineProperty,s=Object.defineProperties,t=Object.getOwnPropertyDescriptor,u=Object.getOwnPropertyDescriptors,v=Object.getOwnPropertyNames,k=Object.getOwnPropertySymbols,w=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,q=Object.prototype.propertyIsEnumerable;var n=(b,a)=>(a=Symbol[b])?a:Symbol.for("Symbol."+b),x=b=>{throw TypeError(b)};var p=(b,a,c)=>a in b?j(b,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):b[a]=c,z=(b,a)=>{for(var c in a||={})o.call(a,c)&&p(b,c,a[c]);if(k)for(var c of k(a))q.call(a,c)&&p(b,c,a[c]);return b},A=(b,a)=>s(b,u(a));var B=(b,a)=>{var c={};for(var d in b)o.call(b,d)&&a.indexOf(d)<0&&(c[d]=b[d]);if(b!=null&&k)for(var d of k(b))a.indexOf(d)<0&&q.call(b,d)&&(c[d]=b[d]);return c};var C=(b,a)=>()=>(b&&(a=b(b=0)),a);var D=(b,a)=>()=>(a||b((a={exports:{}}).exports,a),a.exports),E=(b,a)=>{for(var c in a)j(b,c,{get:a[c],enumerable:!0})},l=(b,a,c,d)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of v(a))!o.call(b,e)&&e!==c&&j(b,e,{get:()=>a[e],enumerable:!(d=t(a,e))||d.enumerable});return b},F=(b,a,c)=>(l(b,a,"default"),c&&l(c,a,"default")),G=(b,a,c)=>(c=b!=null?r(w(b)):{},l(a||!b||!b.__esModule?j(c,"default",{value:b,enumerable:!0}):c,b)),H=b=>l(j({},"__esModule",{value:!0}),b);var I=(b,a,c)=>new Promise((d,e)=>{var f=g=>{try{i(c.next(g))}catch(m){e(m)}},h=g=>{try{i(c.throw(g))}catch(m){e(m)}},i=g=>g.done?d(g.value):Promise.resolve(g.value).then(f,h);i((c=c.apply(b,a)).next())}),y=function(b,a){this[0]=b,this[1]=a};var J=b=>{var a=b[n("asyncIterator")],c=!1,d,e={};return a==null?(a=b[n("iterator")](),d=f=>e[f]=h=>a[f](h)):(a=a.call(b),d=f=>e[f]=h=>{if(c){if(c=!1,f==="throw")throw h;return h}return c=!0,{done:!1,value:new y(new Promise(i=>{var g=a[f](h);g instanceof Object||x("Object expected"),i(g)}),1)}}),e[n("iterator")]=()=>e,d("next"),"throw"in a?d("throw"):e.throw=f=>{throw f},"return"in a&&d("return"),e};export{z as a,A as b,B as c,C as d,D as e,E as f,F as g,G as h,H as i,I as j,J as k}; diff --git a/src/google/adk/cli/browser/chunk-S22PTQH2.js b/src/google/adk/cli/browser/chunk-S22PTQH2.js deleted file mode 100644 index 3bea5f3ccf..0000000000 --- a/src/google/adk/cli/browser/chunk-S22PTQH2.js +++ /dev/null @@ -1,73 +0,0 @@ -import{a as st}from"./chunk-APNCZOFE.js";import{a as it}from"./chunk-ST54LLJ3.js";import{b as et,c as tt}from"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import{m as Ze}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{R as Ke,S as We,T as je,U as Ge,V as ze,W as Xe,X as Je,Y as ge}from"./chunk-QFMJV7VH.js";import{g as o,h as He,i as ke}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{j as Qe}from"./chunk-RMXJBC7V.js";var Ae=(function(){var e=o(function(P,i,a,c){for(a=a||{},c=P.length;c--;a[P[c]]=i);return a},"o"),f=[1,3],h=[1,4],r=[1,5],n=[1,6],d=[5,6,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],k=[1,22],b=[2,7],g=[1,26],S=[1,27],N=[1,28],q=[1,29],A=[1,33],C=[1,34],V=[1,35],v=[1,36],x=[1,37],L=[1,38],w=[1,24],D=[1,31],O=[1,32],M=[1,30],E=[1,39],p=[1,40],m=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],$=[1,61],X=[89,90],Ce=[5,8,9,11,13,21,22,23,24,27,29,41,42,43,44,45,46,54,61,63,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],de=[27,29],Ve=[1,70],ve=[1,71],xe=[1,72],Le=[1,73],we=[1,74],De=[1,75],Oe=[1,76],Z=[1,83],U=[1,80],ee=[1,84],te=[1,85],se=[1,86],ie=[1,87],re=[1,88],ne=[1,89],ae=[1,90],le=[1,91],ce=[1,92],Ee=[5,8,9,11,13,21,22,23,24,27,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],Y=[63,64],Me=[1,101],Fe=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,76,77,89,90],I=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],B=[1,110],Q=[1,106],H=[1,107],K=[1,108],W=[1,109],j=[1,111],oe=[1,116],he=[1,117],ue=[1,114],fe=[1,115],_e={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,acc_title:9,acc_title_value:10,acc_descr:11,acc_descr_value:12,acc_descr_multiline_value:13,requirementDef:14,elementDef:15,relationshipDef:16,direction:17,styleStatement:18,classDefStatement:19,classStatement:20,direction_tb:21,direction_bt:22,direction_rl:23,direction_lr:24,requirementType:25,requirementName:26,STRUCT_START:27,requirementBody:28,STYLE_SEPARATOR:29,idList:30,ID:31,COLONSEP:32,id:33,TEXT:34,text:35,RISK:36,riskLevel:37,VERIFYMTHD:38,verifyType:39,STRUCT_STOP:40,REQUIREMENT:41,FUNCTIONAL_REQUIREMENT:42,INTERFACE_REQUIREMENT:43,PERFORMANCE_REQUIREMENT:44,PHYSICAL_REQUIREMENT:45,DESIGN_CONSTRAINT:46,LOW_RISK:47,MED_RISK:48,HIGH_RISK:49,VERIFY_ANALYSIS:50,VERIFY_DEMONSTRATION:51,VERIFY_INSPECTION:52,VERIFY_TEST:53,ELEMENT:54,elementName:55,elementBody:56,TYPE:57,type:58,DOCREF:59,ref:60,END_ARROW_L:61,relationship:62,LINE:63,END_ARROW_R:64,CONTAINS:65,COPIES:66,DERIVES:67,SATISFIES:68,VERIFIES:69,REFINES:70,TRACES:71,CLASSDEF:72,stylesOpt:73,CLASS:74,ALPHA:75,COMMA:76,STYLE:77,style:78,styleComponent:79,NUM:80,COLON:81,UNIT:82,SPACE:83,BRKT:84,PCT:85,MINUS:86,LABEL:87,SEMICOLON:88,unqString:89,qString:90,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",9:"acc_title",10:"acc_title_value",11:"acc_descr",12:"acc_descr_value",13:"acc_descr_multiline_value",21:"direction_tb",22:"direction_bt",23:"direction_rl",24:"direction_lr",27:"STRUCT_START",29:"STYLE_SEPARATOR",31:"ID",32:"COLONSEP",34:"TEXT",36:"RISK",38:"VERIFYMTHD",40:"STRUCT_STOP",41:"REQUIREMENT",42:"FUNCTIONAL_REQUIREMENT",43:"INTERFACE_REQUIREMENT",44:"PERFORMANCE_REQUIREMENT",45:"PHYSICAL_REQUIREMENT",46:"DESIGN_CONSTRAINT",47:"LOW_RISK",48:"MED_RISK",49:"HIGH_RISK",50:"VERIFY_ANALYSIS",51:"VERIFY_DEMONSTRATION",52:"VERIFY_INSPECTION",53:"VERIFY_TEST",54:"ELEMENT",57:"TYPE",59:"DOCREF",61:"END_ARROW_L",63:"LINE",64:"END_ARROW_R",65:"CONTAINS",66:"COPIES",67:"DERIVES",68:"SATISFIES",69:"VERIFIES",70:"REFINES",71:"TRACES",72:"CLASSDEF",74:"CLASS",75:"ALPHA",76:"COMMA",77:"STYLE",80:"NUM",81:"COLON",82:"UNIT",83:"SPACE",84:"BRKT",85:"PCT",86:"MINUS",87:"LABEL",88:"SEMICOLON",89:"unqString",90:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,2],[4,2],[4,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[17,1],[17,1],[17,1],[17,1],[14,5],[14,7],[28,5],[28,5],[28,5],[28,5],[28,2],[28,1],[25,1],[25,1],[25,1],[25,1],[25,1],[25,1],[37,1],[37,1],[37,1],[39,1],[39,1],[39,1],[39,1],[15,5],[15,7],[56,5],[56,5],[56,2],[56,1],[16,5],[16,5],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[19,3],[20,3],[20,3],[30,1],[30,3],[30,1],[30,3],[18,3],[73,1],[73,3],[78,1],[78,2],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[26,1],[26,1],[33,1],[33,1],[35,1],[35,1],[55,1],[55,1],[58,1],[58,1],[60,1],[60,1]],performAction:o(function(i,a,c,s,u,t,me){var l=t.length-1;switch(u){case 4:this.$=t[l].trim(),s.setAccTitle(this.$);break;case 5:case 6:this.$=t[l].trim(),s.setAccDescription(this.$);break;case 7:this.$=[];break;case 17:s.setDirection("TB");break;case 18:s.setDirection("BT");break;case 19:s.setDirection("RL");break;case 20:s.setDirection("LR");break;case 21:s.addRequirement(t[l-3],t[l-4]);break;case 22:s.addRequirement(t[l-5],t[l-6]),s.setClass([t[l-5]],t[l-3]);break;case 23:s.setNewReqId(t[l-2]);break;case 24:s.setNewReqText(t[l-2]);break;case 25:s.setNewReqRisk(t[l-2]);break;case 26:s.setNewReqVerifyMethod(t[l-2]);break;case 29:this.$=s.RequirementType.REQUIREMENT;break;case 30:this.$=s.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 31:this.$=s.RequirementType.INTERFACE_REQUIREMENT;break;case 32:this.$=s.RequirementType.PERFORMANCE_REQUIREMENT;break;case 33:this.$=s.RequirementType.PHYSICAL_REQUIREMENT;break;case 34:this.$=s.RequirementType.DESIGN_CONSTRAINT;break;case 35:this.$=s.RiskLevel.LOW_RISK;break;case 36:this.$=s.RiskLevel.MED_RISK;break;case 37:this.$=s.RiskLevel.HIGH_RISK;break;case 38:this.$=s.VerifyType.VERIFY_ANALYSIS;break;case 39:this.$=s.VerifyType.VERIFY_DEMONSTRATION;break;case 40:this.$=s.VerifyType.VERIFY_INSPECTION;break;case 41:this.$=s.VerifyType.VERIFY_TEST;break;case 42:s.addElement(t[l-3]);break;case 43:s.addElement(t[l-5]),s.setClass([t[l-5]],t[l-3]);break;case 44:s.setNewElementType(t[l-2]);break;case 45:s.setNewElementDocRef(t[l-2]);break;case 48:s.addRelationship(t[l-2],t[l],t[l-4]);break;case 49:s.addRelationship(t[l-2],t[l-4],t[l]);break;case 50:this.$=s.Relationships.CONTAINS;break;case 51:this.$=s.Relationships.COPIES;break;case 52:this.$=s.Relationships.DERIVES;break;case 53:this.$=s.Relationships.SATISFIES;break;case 54:this.$=s.Relationships.VERIFIES;break;case 55:this.$=s.Relationships.REFINES;break;case 56:this.$=s.Relationships.TRACES;break;case 57:this.$=t[l-2],s.defineClass(t[l-1],t[l]);break;case 58:s.setClass(t[l-1],t[l]);break;case 59:s.setClass([t[l-2]],t[l]);break;case 60:case 62:this.$=[t[l]];break;case 61:case 63:this.$=t[l-2].concat([t[l]]);break;case 64:this.$=t[l-2],s.setCssStyle(t[l-1],t[l]);break;case 65:this.$=[t[l]];break;case 66:t[l-2].push(t[l]),this.$=t[l-2];break;case 68:this.$=t[l-1]+t[l];break}},"anonymous"),table:[{3:1,4:2,6:f,9:h,11:r,13:n},{1:[3]},{3:8,4:2,5:[1,7],6:f,9:h,11:r,13:n},{5:[1,9]},{10:[1,10]},{12:[1,11]},e(d,[2,6]),{3:12,4:2,6:f,9:h,11:r,13:n},{1:[2,2]},{4:17,5:k,7:13,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},e(d,[2,4]),e(d,[2,5]),{1:[2,1]},{8:[1,41]},{4:17,5:k,7:42,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:43,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:44,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:45,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:46,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:47,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:48,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:49,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:50,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{26:51,89:[1,52],90:[1,53]},{55:54,89:[1,55],90:[1,56]},{29:[1,59],61:[1,57],63:[1,58]},e(m,[2,17]),e(m,[2,18]),e(m,[2,19]),e(m,[2,20]),{30:60,33:62,75:$,89:E,90:p},{30:63,33:62,75:$,89:E,90:p},{30:64,33:62,75:$,89:E,90:p},e(X,[2,29]),e(X,[2,30]),e(X,[2,31]),e(X,[2,32]),e(X,[2,33]),e(X,[2,34]),e(Ce,[2,81]),e(Ce,[2,82]),{1:[2,3]},{8:[2,8]},{8:[2,9]},{8:[2,10]},{8:[2,11]},{8:[2,12]},{8:[2,13]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{27:[1,65],29:[1,66]},e(de,[2,79]),e(de,[2,80]),{27:[1,67],29:[1,68]},e(de,[2,85]),e(de,[2,86]),{62:69,65:Ve,66:ve,67:xe,68:Le,69:we,70:De,71:Oe},{62:77,65:Ve,66:ve,67:xe,68:Le,69:we,70:De,71:Oe},{30:78,33:62,75:$,89:E,90:p},{73:79,75:Z,76:U,78:81,79:82,80:ee,81:te,82:se,83:ie,84:re,85:ne,86:ae,87:le,88:ce},e(Ee,[2,60]),e(Ee,[2,62]),{73:93,75:Z,76:U,78:81,79:82,80:ee,81:te,82:se,83:ie,84:re,85:ne,86:ae,87:le,88:ce},{30:94,33:62,75:$,76:U,89:E,90:p},{5:[1,95]},{30:96,33:62,75:$,89:E,90:p},{5:[1,97]},{30:98,33:62,75:$,89:E,90:p},{63:[1,99]},e(Y,[2,50]),e(Y,[2,51]),e(Y,[2,52]),e(Y,[2,53]),e(Y,[2,54]),e(Y,[2,55]),e(Y,[2,56]),{64:[1,100]},e(m,[2,59],{76:U}),e(m,[2,64],{76:Me}),{33:103,75:[1,102],89:E,90:p},e(Fe,[2,65],{79:104,75:Z,80:ee,81:te,82:se,83:ie,84:re,85:ne,86:ae,87:le,88:ce}),e(I,[2,67]),e(I,[2,69]),e(I,[2,70]),e(I,[2,71]),e(I,[2,72]),e(I,[2,73]),e(I,[2,74]),e(I,[2,75]),e(I,[2,76]),e(I,[2,77]),e(I,[2,78]),e(m,[2,57],{76:Me}),e(m,[2,58],{76:U}),{5:B,28:105,31:Q,34:H,36:K,38:W,40:j},{27:[1,112],76:U},{5:oe,40:he,56:113,57:ue,59:fe},{27:[1,118],76:U},{33:119,89:E,90:p},{33:120,89:E,90:p},{75:Z,78:121,79:82,80:ee,81:te,82:se,83:ie,84:re,85:ne,86:ae,87:le,88:ce},e(Ee,[2,61]),e(Ee,[2,63]),e(I,[2,68]),e(m,[2,21]),{32:[1,122]},{32:[1,123]},{32:[1,124]},{32:[1,125]},{5:B,28:126,31:Q,34:H,36:K,38:W,40:j},e(m,[2,28]),{5:[1,127]},e(m,[2,42]),{32:[1,128]},{32:[1,129]},{5:oe,40:he,56:130,57:ue,59:fe},e(m,[2,47]),{5:[1,131]},e(m,[2,48]),e(m,[2,49]),e(Fe,[2,66],{79:104,75:Z,80:ee,81:te,82:se,83:ie,84:re,85:ne,86:ae,87:le,88:ce}),{33:132,89:E,90:p},{35:133,89:[1,134],90:[1,135]},{37:136,47:[1,137],48:[1,138],49:[1,139]},{39:140,50:[1,141],51:[1,142],52:[1,143],53:[1,144]},e(m,[2,27]),{5:B,28:145,31:Q,34:H,36:K,38:W,40:j},{58:146,89:[1,147],90:[1,148]},{60:149,89:[1,150],90:[1,151]},e(m,[2,46]),{5:oe,40:he,56:152,57:ue,59:fe},{5:[1,153]},{5:[1,154]},{5:[2,83]},{5:[2,84]},{5:[1,155]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[1,156]},{5:[2,38]},{5:[2,39]},{5:[2,40]},{5:[2,41]},e(m,[2,22]),{5:[1,157]},{5:[2,87]},{5:[2,88]},{5:[1,158]},{5:[2,89]},{5:[2,90]},e(m,[2,43]),{5:B,28:159,31:Q,34:H,36:K,38:W,40:j},{5:B,28:160,31:Q,34:H,36:K,38:W,40:j},{5:B,28:161,31:Q,34:H,36:K,38:W,40:j},{5:B,28:162,31:Q,34:H,36:K,38:W,40:j},{5:oe,40:he,56:163,57:ue,59:fe},{5:oe,40:he,56:164,57:ue,59:fe},e(m,[2,23]),e(m,[2,24]),e(m,[2,25]),e(m,[2,26]),e(m,[2,44]),e(m,[2,45])],defaultActions:{8:[2,2],12:[2,1],41:[2,3],42:[2,8],43:[2,9],44:[2,10],45:[2,11],46:[2,12],47:[2,13],48:[2,14],49:[2,15],50:[2,16],134:[2,83],135:[2,84],137:[2,35],138:[2,36],139:[2,37],141:[2,38],142:[2,39],143:[2,40],144:[2,41],147:[2,87],148:[2,88],150:[2,89],151:[2,90]},parseError:o(function(i,a){if(a.recoverable)this.trace(i);else{var c=new Error(i);throw c.hash=a,c}},"parseError"),parse:o(function(i){var a=this,c=[0],s=[],u=[null],t=[],me=this.table,l="",be=0,Pe=0,$e=0,at=2,Ue=1,lt=t.slice.call(arguments,1),R=Object.create(this.lexer),G={yy:{}};for(var Se in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Se)&&(G.yy[Se]=this.yy[Se]);R.setInput(i,G.yy),G.yy.lexer=R,G.yy.parser=this,typeof R.yylloc>"u"&&(R.yylloc={});var Ie=R.yylloc;t.push(Ie);var ct=R.options&&R.options.ranges;typeof G.yy.parseError=="function"?this.parseError=G.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ot(_){c.length=c.length-2*_,u.length=u.length-_,t.length=t.length-_}o(ot,"popStack");function Ye(){var _;return _=s.pop()||R.lex()||Ue,typeof _!="number"&&(_ instanceof Array&&(s=_,_=s.pop()),_=a.symbols_[_]||_),_}o(Ye,"lex");for(var y,Te,z,T,Et,Ne,J={},Re,F,Be,ye;;){if(z=c[c.length-1],this.defaultActions[z]?T=this.defaultActions[z]:((y===null||typeof y>"u")&&(y=Ye()),T=me[z]&&me[z][y]),typeof T>"u"||!T.length||!T[0]){var qe="";ye=[];for(Re in me[z])this.terminals_[Re]&&Re>at&&ye.push("'"+this.terminals_[Re]+"'");R.showPosition?qe="Parse error on line "+(be+1)+`: -`+R.showPosition()+` -Expecting `+ye.join(", ")+", got '"+(this.terminals_[y]||y)+"'":qe="Parse error on line "+(be+1)+": Unexpected "+(y==Ue?"end of input":"'"+(this.terminals_[y]||y)+"'"),this.parseError(qe,{text:R.match,token:this.terminals_[y]||y,line:R.yylineno,loc:Ie,expected:ye})}if(T[0]instanceof Array&&T.length>1)throw new Error("Parse Error: multiple actions possible at state: "+z+", token: "+y);switch(T[0]){case 1:c.push(y),u.push(R.yytext),t.push(R.yylloc),c.push(T[1]),y=null,Te?(y=Te,Te=null):(Pe=R.yyleng,l=R.yytext,be=R.yylineno,Ie=R.yylloc,$e>0&&$e--);break;case 2:if(F=this.productions_[T[1]][1],J.$=u[u.length-F],J._$={first_line:t[t.length-(F||1)].first_line,last_line:t[t.length-1].last_line,first_column:t[t.length-(F||1)].first_column,last_column:t[t.length-1].last_column},ct&&(J._$.range=[t[t.length-(F||1)].range[0],t[t.length-1].range[1]]),Ne=this.performAction.apply(J,[l,Pe,be,G.yy,T[1],u,t].concat(lt)),typeof Ne<"u")return Ne;F&&(c=c.slice(0,-1*F*2),u=u.slice(0,-1*F),t=t.slice(0,-1*F)),c.push(this.productions_[T[1]][0]),u.push(J.$),t.push(J._$),Be=me[c[c.length-2]][c[c.length-1]],c.push(Be);break;case 3:return!0}}return!0},"parse")},nt=(function(){var P={EOF:1,parseError:o(function(a,c){if(this.yy.parser)this.yy.parser.parseError(a,c);else throw new Error(a)},"parseError"),setInput:o(function(i,a){return this.yy=a||this.yy||{},this._input=i,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var i=this._input[0];this.yytext+=i,this.yyleng++,this.offset++,this.match+=i,this.matched+=i;var a=i.match(/(?:\r\n?|\n).*/g);return a?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),i},"input"),unput:o(function(i){var a=i.length,c=i.split(/(?:\r\n?|\n)/g);this._input=i+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-a),this.offset-=a;var s=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var u=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===s.length?this.yylloc.first_column:0)+s[s.length-c.length].length-c[0].length:this.yylloc.first_column-a},this.options.ranges&&(this.yylloc.range=[u[0],u[0]+this.yyleng-a]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(i){this.unput(this.match.slice(i))},"less"),pastInput:o(function(){var i=this.matched.substr(0,this.matched.length-this.match.length);return(i.length>20?"...":"")+i.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var i=this.match;return i.length<20&&(i+=this._input.substr(0,20-i.length)),(i.substr(0,20)+(i.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var i=this.pastInput(),a=new Array(i.length+1).join("-");return i+this.upcomingInput()+` -`+a+"^"},"showPosition"),test_match:o(function(i,a){var c,s,u;if(this.options.backtrack_lexer&&(u={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(u.yylloc.range=this.yylloc.range.slice(0))),s=i[0].match(/(?:\r\n?|\n).*/g),s&&(this.yylineno+=s.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:s?s[s.length-1].length-s[s.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+i[0].length},this.yytext+=i[0],this.match+=i[0],this.matches=i,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(i[0].length),this.matched+=i[0],c=this.performAction.call(this,this.yy,this,a,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),c)return c;if(this._backtrack){for(var t in u)this[t]=u[t];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var i,a,c,s;this._more||(this.yytext="",this.match="");for(var u=this._currentRules(),t=0;ta[0].length)){if(a=c,s=t,this.options.backtrack_lexer){if(i=this.test_match(c,u[t]),i!==!1)return i;if(this._backtrack){a=!1;continue}else return!1}else if(!this.options.flex)break}return a?(i=this.test_match(a,u[s]),i!==!1?i:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var a=this.next();return a||this.lex()},"lex"),begin:o(function(a){this.conditionStack.push(a)},"begin"),popState:o(function(){var a=this.conditionStack.length-1;return a>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(a){return a=this.conditionStack.length-1-Math.abs(a||0),a>=0?this.conditionStack[a]:"INITIAL"},"topState"),pushState:o(function(a){this.begin(a)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(a,c,s,u){var t=u;switch(s){case 0:return"title";case 1:return this.begin("acc_title"),9;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),11;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:return 21;case 9:return 22;case 10:return 23;case 11:return 24;case 12:return 5;case 13:break;case 14:break;case 15:break;case 16:return 8;case 17:return 6;case 18:return 27;case 19:return 40;case 20:return 29;case 21:return 32;case 22:return 31;case 23:return 34;case 24:return 36;case 25:return 38;case 26:return 41;case 27:return 42;case 28:return 43;case 29:return 44;case 30:return 45;case 31:return 46;case 32:return 47;case 33:return 48;case 34:return 49;case 35:return 50;case 36:return 51;case 37:return 52;case 38:return 53;case 39:return 54;case 40:return 65;case 41:return 66;case 42:return 67;case 43:return 68;case 44:return 69;case 45:return 70;case 46:return 71;case 47:return 57;case 48:return 59;case 49:return this.begin("style"),77;break;case 50:return 75;case 51:return 81;case 52:return 88;case 53:return"PERCENT";case 54:return 86;case 55:return 84;case 56:break;case 57:this.begin("string");break;case 58:this.popState();break;case 59:return this.begin("style"),72;break;case 60:return this.begin("style"),74;break;case 61:return 61;case 62:return 64;case 63:return 63;case 64:this.begin("string");break;case 65:this.popState();break;case 66:return"qString";case 67:return c.yytext=c.yytext.trim(),89;break;case 68:return 75;case 69:return 80;case 70:return 76}},"anonymous"),rules:[/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::{3})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:style\b)/i,/^(?:\w+)/i,/^(?::)/i,/^(?:;)/i,/^(?:%)/i,/^(?:-)/i,/^(?:#)/i,/^(?: )/i,/^(?:["])/i,/^(?:\n)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^:,\r\n\{\<\>\-\=]*)/i,/^(?:\w+)/i,/^(?:[0-9]+)/i,/^(?:,)/i],conditions:{acc_descr_multiline:{rules:[6,7,68,69,70],inclusive:!1},acc_descr:{rules:[4,68,69,70],inclusive:!1},acc_title:{rules:[2,68,69,70],inclusive:!1},style:{rules:[50,51,52,53,54,55,56,57,58,68,69,70],inclusive:!1},unqString:{rules:[68,69,70],inclusive:!1},token:{rules:[68,69,70],inclusive:!1},string:{rules:[65,66,68,69,70],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,59,60,61,62,63,64,67,68,69,70],inclusive:!0}}};return P})();_e.lexer=nt;function pe(){this.yy={}}return o(pe,"Parser"),pe.prototype=_e,_e.Parser=pe,new pe})();Ae.parser=Ae;var ht=Ae,ut=class{constructor(){this.relations=[],this.latestRequirement=this.getInitialRequirement(),this.requirements=new Map,this.latestElement=this.getInitialElement(),this.elements=new Map,this.classes=new Map,this.direction="TB",this.RequirementType={REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"},this.RiskLevel={LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"},this.VerifyType={VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"},this.Relationships={CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"},this.setAccTitle=We,this.getAccTitle=je,this.setAccDescription=Ge,this.getAccDescription=ze,this.setDiagramTitle=Xe,this.getDiagramTitle=Je,this.getConfig=o(()=>ge().requirement,"getConfig"),this.clear(),this.setDirection=this.setDirection.bind(this),this.addRequirement=this.addRequirement.bind(this),this.setNewReqId=this.setNewReqId.bind(this),this.setNewReqRisk=this.setNewReqRisk.bind(this),this.setNewReqText=this.setNewReqText.bind(this),this.setNewReqVerifyMethod=this.setNewReqVerifyMethod.bind(this),this.addElement=this.addElement.bind(this),this.setNewElementType=this.setNewElementType.bind(this),this.setNewElementDocRef=this.setNewElementDocRef.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setCssStyle=this.setCssStyle.bind(this),this.setClass=this.setClass.bind(this),this.defineClass=this.defineClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{o(this,"RequirementDB")}getDirection(){return this.direction}setDirection(e){this.direction=e}resetLatestRequirement(){this.latestRequirement=this.getInitialRequirement()}resetLatestElement(){this.latestElement=this.getInitialElement()}getInitialRequirement(){return{requirementId:"",text:"",risk:"",verifyMethod:"",name:"",type:"",cssStyles:[],classes:["default"]}}getInitialElement(){return{name:"",type:"",docRef:"",cssStyles:[],classes:["default"]}}addRequirement(e,f){return this.requirements.has(e)||this.requirements.set(e,{name:e,type:f,requirementId:this.latestRequirement.requirementId,text:this.latestRequirement.text,risk:this.latestRequirement.risk,verifyMethod:this.latestRequirement.verifyMethod,cssStyles:[],classes:["default"]}),this.resetLatestRequirement(),this.requirements.get(e)}getRequirements(){return this.requirements}setNewReqId(e){this.latestRequirement!==void 0&&(this.latestRequirement.requirementId=e)}setNewReqText(e){this.latestRequirement!==void 0&&(this.latestRequirement.text=e)}setNewReqRisk(e){this.latestRequirement!==void 0&&(this.latestRequirement.risk=e)}setNewReqVerifyMethod(e){this.latestRequirement!==void 0&&(this.latestRequirement.verifyMethod=e)}addElement(e){return this.elements.has(e)||(this.elements.set(e,{name:e,type:this.latestElement.type,docRef:this.latestElement.docRef,cssStyles:[],classes:["default"]}),ke.info("Added new element: ",e)),this.resetLatestElement(),this.elements.get(e)}getElements(){return this.elements}setNewElementType(e){this.latestElement!==void 0&&(this.latestElement.type=e)}setNewElementDocRef(e){this.latestElement!==void 0&&(this.latestElement.docRef=e)}addRelationship(e,f,h){this.relations.push({type:e,src:f,dst:h})}getRelationships(){return this.relations}clear(){this.relations=[],this.resetLatestRequirement(),this.requirements=new Map,this.resetLatestElement(),this.elements=new Map,this.classes=new Map,Ke()}setCssStyle(e,f){for(let h of e){let r=this.requirements.get(h)??this.elements.get(h);if(!f||!r)return;for(let n of f)n.includes(",")?r.cssStyles.push(...n.split(",")):r.cssStyles.push(n)}}setClass(e,f){for(let h of e){let r=this.requirements.get(h)??this.elements.get(h);if(r)for(let n of f){r.classes.push(n);let d=this.classes.get(n)?.styles;d&&r.cssStyles.push(...d)}}}defineClass(e,f){for(let h of e){let r=this.classes.get(h);r===void 0&&(r={id:h,styles:[],textStyles:[]},this.classes.set(h,r)),f&&f.forEach(function(n){if(/color/.exec(n)){let d=n.replace("fill","bgFill");r.textStyles.push(d)}r.styles.push(n)}),this.requirements.forEach(n=>{n.classes.includes(h)&&n.cssStyles.push(...f.flatMap(d=>d.split(",")))}),this.elements.forEach(n=>{n.classes.includes(h)&&n.cssStyles.push(...f.flatMap(d=>d.split(",")))})}}getClasses(){return this.classes}getData(){let e=ge(),f=[],h=[];for(let r of this.requirements.values()){let n=r;n.id=r.name,n.cssStyles=r.cssStyles,n.cssClasses=r.classes.join(" "),n.shape="requirementBox",n.look=e.look,f.push(n)}for(let r of this.elements.values()){let n=r;n.shape="requirementBox",n.look=e.look,n.id=r.name,n.cssStyles=r.cssStyles,n.cssClasses=r.classes.join(" "),f.push(n)}for(let r of this.relations){let n=0,d=r.type===this.Relationships.CONTAINS,k={id:`${r.src}-${r.dst}-${n}`,start:this.requirements.get(r.src)?.name??this.elements.get(r.src)?.name,end:this.requirements.get(r.dst)?.name??this.elements.get(r.dst)?.name,label:`\xAB${r.type}\xBB`,classes:"relationshipLine",style:["fill:none",d?"":"stroke-dasharray: 10,7"],labelpos:"c",thickness:"normal",type:"normal",pattern:d?"normal":"dashed",arrowTypeStart:d?"requirement_contains":"",arrowTypeEnd:d?"":"requirement_arrow",look:e.look,labelType:"markdown"};h.push(k),n++}return{nodes:f,edges:h,other:{},config:e,direction:this.getDirection()}}},ft=o(e=>` - - marker { - fill: ${e.relationColor}; - stroke: ${e.relationColor}; - } - - marker.cross { - stroke: ${e.lineColor}; - } - - svg { - font-family: ${e.fontFamily}; - font-size: ${e.fontSize}; - } - - .reqBox { - fill: ${e.requirementBackground}; - fill-opacity: 1.0; - stroke: ${e.requirementBorderColor}; - stroke-width: ${e.requirementBorderSize}; - } - - .reqTitle, .reqLabel{ - fill: ${e.requirementTextColor}; - } - .reqLabelBox { - fill: ${e.relationLabelBackground}; - fill-opacity: 1.0; - } - - .req-title-line { - stroke: ${e.requirementBorderColor}; - stroke-width: ${e.requirementBorderSize}; - } - .relationshipLine { - stroke: ${e.relationColor}; - stroke-width: 1; - } - .relationshipLabel { - fill: ${e.relationLabelColor}; - } - .edgeLabel { - background-color: ${e.edgeLabelBackground}; - } - .edgeLabel .label rect { - fill: ${e.edgeLabelBackground}; - } - .edgeLabel .label text { - fill: ${e.relationLabelColor}; - } - .divider { - stroke: ${e.nodeBorder}; - stroke-width: 1; - } - .label { - font-family: ${e.fontFamily}; - color: ${e.nodeTextColor||e.textColor}; - } - .label text,span { - fill: ${e.nodeTextColor||e.textColor}; - color: ${e.nodeTextColor||e.textColor}; - } - .labelBkg { - background-color: ${e.edgeLabelBackground}; - } - -`,"getStyles"),mt=ft,rt={};He(rt,{draw:()=>dt});var dt=o(function(e,f,h,r){return Qe(this,null,function*(){ke.info("REF0:"),ke.info("Drawing requirement diagram (unified)",f);let{securityLevel:n,state:d,layout:k}=ge(),b=r.db.getData(),g=st(f,n);b.type=r.type,b.layoutAlgorithm=tt(k),b.nodeSpacing=d?.nodeSpacing??50,b.rankSpacing=d?.rankSpacing??50,b.markers=["requirement_contains","requirement_arrow"],b.diagramId=f,yield et(b,g);let S=8;Ze.insertTitle(g,"requirementDiagramTitleText",d?.titleTopMargin??25,r.db.getDiagramTitle()),it(g,S,"requirementDiagram",d?.useMaxWidth??!0)})},"draw"),At={parser:ht,get db(){return new ut},renderer:rt,styles:mt};export{At as diagram}; diff --git a/src/google/adk/cli/browser/chunk-SMT27N2F.js b/src/google/adk/cli/browser/chunk-SMT27N2F.js deleted file mode 100644 index 8fcc01c426..0000000000 --- a/src/google/adk/cli/browser/chunk-SMT27N2F.js +++ /dev/null @@ -1 +0,0 @@ -import{a as e,b as r}from"./chunk-NQKWI5EB.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{e as PacketModule,r as createPacketServices}; diff --git a/src/google/adk/cli/browser/chunk-ST54LLJ3.js b/src/google/adk/cli/browser/chunk-ST54LLJ3.js deleted file mode 100644 index 2a0315718b..0000000000 --- a/src/google/adk/cli/browser/chunk-ST54LLJ3.js +++ /dev/null @@ -1 +0,0 @@ -import{N as w}from"./chunk-QFMJV7VH.js";import{g as r,i as c}from"./chunk-JRNAXTJ7.js";var g=r((t,e,i,h)=>{t.attr("class",i);let{width:o,height:n,x,y:u}=s(t,e);w(t,n,o,h);let a=m(x,u,o,n,e);t.attr("viewBox",a),c.debug(`viewBox configured: ${a} with padding: ${e}`)},"setupViewPortForSVG"),s=r((t,e)=>{let i=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:i.width+e*2,height:i.height+e*2,x:i.x,y:i.y}},"calculateDimensionsWithPadding"),m=r((t,e,i,h,o)=>`${t-o} ${e-o} ${i} ${h}`,"createViewBox");export{g as a}; diff --git a/src/google/adk/cli/browser/chunk-T2UY75BD.js b/src/google/adk/cli/browser/chunk-T2UY75BD.js deleted file mode 100644 index 63a477b5e3..0000000000 --- a/src/google/adk/cli/browser/chunk-T2UY75BD.js +++ /dev/null @@ -1,145 +0,0 @@ -import{a as tr}from"./chunk-4R6SYGKS.js";import{a as $e,b as je,d as Mt,e as Bt,f as lt,g as Vt}from"./chunk-NMKTPNXE.js";import{a as Je,b as Qe}from"./chunk-ZMOC4H7T.js";import{a as Ze,k as te,m as F}from"./chunk-WBLSVR3V.js";import{a as Ir}from"./chunk-GP6TCC26.js";import{A as Ct,G as Nt,H as We,J as U,K as Rt,L as $t,M as S,N as Ke,R as Fe,S as jt,T as qe,U as He,V as ze,W as Ue,X as Ge,Y as j,Z as Xe,o as Ye}from"./chunk-QFMJV7VH.js";import{a as mt,g as _,i as Q}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{a as Be,b as Ve,h as xr,j as $}from"./chunk-RMXJBC7V.js";var ae=xr(Ir(),1);var ee=(function(){var e=_(function(Et,y,N,m){for(N=N||{},m=Et.length;m--;N[Et[m]]=y);return N},"o"),t=[1,2],a=[1,3],r=[1,4],i=[2,4],n=[1,9],c=[1,11],l=[1,12],h=[1,14],s=[1,15],E=[1,17],p=[1,18],f=[1,19],u=[1,25],O=[1,26],b=[1,27],L=[1,28],w=[1,29],A=[1,30],k=[1,31],D=[1,32],M=[1,33],W=[1,34],K=[1,35],H=[1,36],G=[1,37],X=[1,38],z=[1,39],v=[1,40],tt=[1,42],Z=[1,43],et=[1,44],st=[1,45],at=[1,46],R=[1,47],I=[1,4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,48,49,50,51,53,54,56,61,62,63,64,73],ot=[1,74],ct=[1,80],C=[1,81],ie=[1,82],ne=[1,83],oe=[1,84],ce=[1,85],le=[1,86],he=[1,87],de=[1,88],Te=[1,89],Ee=[1,90],pe=[1,91],ue=[1,92],_e=[1,93],fe=[1,94],ge=[1,95],xe=[1,96],Ie=[1,97],be=[1,98],Re=[1,99],Oe=[1,100],ye=[1,101],Le=[1,102],Se=[1,103],me=[1,104],Ne=[1,105],Ae=[2,78],Lt=[4,5,17,51,53,54],wt=[4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,51,53,54,56,61,62,63,64,73],we=[4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,50,51,53,54,56,61,62,63,64,73],Ht=[4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,49,51,53,54,56,61,62,63,64,73],Pe=[4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,48,51,53,54,56,61,62,63,64,73],zt=[5,52],B=[70,71,72,73],it=[1,151],Ut={trace:_(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,SD:6,document:7,line:8,statement:9,INVALID:10,box_section:11,box_line:12,participant_statement:13,create:14,box:15,restOfLine:16,end:17,signal:18,autonumber:19,NUM:20,off:21,activate:22,actor:23,deactivate:24,note_statement:25,links_statement:26,link_statement:27,properties_statement:28,details_statement:29,title:30,legacy_title:31,acc_title:32,acc_title_value:33,acc_descr:34,acc_descr_value:35,acc_descr_multiline_value:36,loop:37,rect:38,opt:39,alt:40,else_sections:41,par:42,par_sections:43,par_over:44,critical:45,option_sections:46,break:47,option:48,and:49,else:50,participant:51,AS:52,participant_actor:53,destroy:54,actor_with_config:55,note:56,placement:57,text2:58,over:59,actor_pair:60,links:61,link:62,properties:63,details:64,spaceList:65,",":66,left_of:67,right_of:68,signaltype:69,"+":70,"-":71,"()":72,ACTOR:73,config_object:74,CONFIG_START:75,CONFIG_CONTENT:76,CONFIG_END:77,SOLID_OPEN_ARROW:78,DOTTED_OPEN_ARROW:79,SOLID_ARROW:80,SOLID_ARROW_TOP:81,SOLID_ARROW_BOTTOM:82,STICK_ARROW_TOP:83,STICK_ARROW_BOTTOM:84,SOLID_ARROW_TOP_DOTTED:85,SOLID_ARROW_BOTTOM_DOTTED:86,STICK_ARROW_TOP_DOTTED:87,STICK_ARROW_BOTTOM_DOTTED:88,SOLID_ARROW_TOP_REVERSE:89,SOLID_ARROW_BOTTOM_REVERSE:90,STICK_ARROW_TOP_REVERSE:91,STICK_ARROW_BOTTOM_REVERSE:92,SOLID_ARROW_TOP_REVERSE_DOTTED:93,SOLID_ARROW_BOTTOM_REVERSE_DOTTED:94,STICK_ARROW_TOP_REVERSE_DOTTED:95,STICK_ARROW_BOTTOM_REVERSE_DOTTED:96,BIDIRECTIONAL_SOLID_ARROW:97,DOTTED_ARROW:98,BIDIRECTIONAL_DOTTED_ARROW:99,SOLID_CROSS:100,DOTTED_CROSS:101,SOLID_POINT:102,DOTTED_POINT:103,TXT:104,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",6:"SD",10:"INVALID",14:"create",15:"box",16:"restOfLine",17:"end",19:"autonumber",20:"NUM",21:"off",22:"activate",24:"deactivate",30:"title",31:"legacy_title",32:"acc_title",33:"acc_title_value",34:"acc_descr",35:"acc_descr_value",36:"acc_descr_multiline_value",37:"loop",38:"rect",39:"opt",40:"alt",42:"par",44:"par_over",45:"critical",47:"break",48:"option",49:"and",50:"else",51:"participant",52:"AS",53:"participant_actor",54:"destroy",56:"note",59:"over",61:"links",62:"link",63:"properties",64:"details",66:",",67:"left_of",68:"right_of",70:"+",71:"-",72:"()",73:"ACTOR",75:"CONFIG_START",76:"CONFIG_CONTENT",77:"CONFIG_END",78:"SOLID_OPEN_ARROW",79:"DOTTED_OPEN_ARROW",80:"SOLID_ARROW",81:"SOLID_ARROW_TOP",82:"SOLID_ARROW_BOTTOM",83:"STICK_ARROW_TOP",84:"STICK_ARROW_BOTTOM",85:"SOLID_ARROW_TOP_DOTTED",86:"SOLID_ARROW_BOTTOM_DOTTED",87:"STICK_ARROW_TOP_DOTTED",88:"STICK_ARROW_BOTTOM_DOTTED",89:"SOLID_ARROW_TOP_REVERSE",90:"SOLID_ARROW_BOTTOM_REVERSE",91:"STICK_ARROW_TOP_REVERSE",92:"STICK_ARROW_BOTTOM_REVERSE",93:"SOLID_ARROW_TOP_REVERSE_DOTTED",94:"SOLID_ARROW_BOTTOM_REVERSE_DOTTED",95:"STICK_ARROW_TOP_REVERSE_DOTTED",96:"STICK_ARROW_BOTTOM_REVERSE_DOTTED",97:"BIDIRECTIONAL_SOLID_ARROW",98:"DOTTED_ARROW",99:"BIDIRECTIONAL_DOTTED_ARROW",100:"SOLID_CROSS",101:"DOTTED_CROSS",102:"SOLID_POINT",103:"DOTTED_POINT",104:"TXT"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[8,1],[11,0],[11,2],[12,2],[12,1],[12,1],[9,1],[9,2],[9,4],[9,2],[9,4],[9,3],[9,3],[9,2],[9,3],[9,3],[9,2],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[9,2],[9,2],[9,1],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[46,1],[46,4],[43,1],[43,4],[41,1],[41,4],[13,5],[13,3],[13,5],[13,3],[13,3],[13,5],[13,3],[13,5],[13,3],[25,4],[25,4],[26,3],[27,3],[28,3],[29,3],[65,2],[65,1],[60,3],[60,1],[57,1],[57,1],[18,5],[18,5],[18,5],[18,5],[18,6],[18,4],[55,2],[74,3],[23,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[58,1]],performAction:_(function(y,N,m,g,V,o,St){var T=o.length-1;switch(V){case 3:return g.apply(o[T]),o[T];break;case 4:case 10:this.$=[];break;case 5:case 11:o[T-1].push(o[T]),this.$=o[T-1];break;case 6:case 7:case 12:case 13:this.$=o[T];break;case 8:case 9:case 14:this.$=[];break;case 16:o[T].type="createParticipant",this.$=o[T];break;case 17:o[T-1].unshift({type:"boxStart",boxData:g.parseBoxData(o[T-2])}),o[T-1].push({type:"boxEnd",boxText:o[T-2]}),this.$=o[T-1];break;case 19:this.$={type:"sequenceIndex",sequenceIndex:Number(o[T-2]),sequenceIndexStep:Number(o[T-1]),sequenceVisible:!0,signalType:g.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceIndex:Number(o[T-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:g.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:g.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:g.LINETYPE.AUTONUMBER};break;case 23:this.$={type:"activeStart",signalType:g.LINETYPE.ACTIVE_START,actor:o[T-1].actor};break;case 24:this.$={type:"activeEnd",signalType:g.LINETYPE.ACTIVE_END,actor:o[T-1].actor};break;case 30:g.setDiagramTitle(o[T].substring(6)),this.$=o[T].substring(6);break;case 31:g.setDiagramTitle(o[T].substring(7)),this.$=o[T].substring(7);break;case 32:this.$=o[T].trim(),g.setAccTitle(this.$);break;case 33:case 34:this.$=o[T].trim(),g.setAccDescription(this.$);break;case 35:o[T-1].unshift({type:"loopStart",loopText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.LOOP_START}),o[T-1].push({type:"loopEnd",loopText:o[T-2],signalType:g.LINETYPE.LOOP_END}),this.$=o[T-1];break;case 36:o[T-1].unshift({type:"rectStart",color:g.parseMessage(o[T-2]),signalType:g.LINETYPE.RECT_START}),o[T-1].push({type:"rectEnd",color:g.parseMessage(o[T-2]),signalType:g.LINETYPE.RECT_END}),this.$=o[T-1];break;case 37:o[T-1].unshift({type:"optStart",optText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.OPT_START}),o[T-1].push({type:"optEnd",optText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.OPT_END}),this.$=o[T-1];break;case 38:o[T-1].unshift({type:"altStart",altText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.ALT_START}),o[T-1].push({type:"altEnd",signalType:g.LINETYPE.ALT_END}),this.$=o[T-1];break;case 39:o[T-1].unshift({type:"parStart",parText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.PAR_START}),o[T-1].push({type:"parEnd",signalType:g.LINETYPE.PAR_END}),this.$=o[T-1];break;case 40:o[T-1].unshift({type:"parStart",parText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.PAR_OVER_START}),o[T-1].push({type:"parEnd",signalType:g.LINETYPE.PAR_END}),this.$=o[T-1];break;case 41:o[T-1].unshift({type:"criticalStart",criticalText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.CRITICAL_START}),o[T-1].push({type:"criticalEnd",signalType:g.LINETYPE.CRITICAL_END}),this.$=o[T-1];break;case 42:o[T-1].unshift({type:"breakStart",breakText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.BREAK_START}),o[T-1].push({type:"breakEnd",optText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.BREAK_END}),this.$=o[T-1];break;case 44:this.$=o[T-3].concat([{type:"option",optionText:g.parseMessage(o[T-1]),signalType:g.LINETYPE.CRITICAL_OPTION},o[T]]);break;case 46:this.$=o[T-3].concat([{type:"and",parText:g.parseMessage(o[T-1]),signalType:g.LINETYPE.PAR_AND},o[T]]);break;case 48:this.$=o[T-3].concat([{type:"else",altText:g.parseMessage(o[T-1]),signalType:g.LINETYPE.ALT_ELSE},o[T]]);break;case 49:o[T-3].draw="participant",o[T-3].type="addParticipant",o[T-3].description=g.parseMessage(o[T-1]),this.$=o[T-3];break;case 50:o[T-1].draw="participant",o[T-1].type="addParticipant",this.$=o[T-1];break;case 51:o[T-3].draw="actor",o[T-3].type="addParticipant",o[T-3].description=g.parseMessage(o[T-1]),this.$=o[T-3];break;case 52:case 57:o[T-1].draw="actor",o[T-1].type="addParticipant",this.$=o[T-1];break;case 53:o[T-1].type="destroyParticipant",this.$=o[T-1];break;case 54:o[T-3].draw="participant",o[T-3].type="addParticipant",o[T-3].description=g.parseMessage(o[T-1]),this.$=o[T-3];break;case 55:o[T-1].draw="participant",o[T-1].type="addParticipant",this.$=o[T-1];break;case 56:o[T-3].draw="actor",o[T-3].type="addParticipant",o[T-3].description=g.parseMessage(o[T-1]),this.$=o[T-3];break;case 58:this.$=[o[T-1],{type:"addNote",placement:o[T-2],actor:o[T-1].actor,text:o[T]}];break;case 59:o[T-2]=[].concat(o[T-1],o[T-1]).slice(0,2),o[T-2][0]=o[T-2][0].actor,o[T-2][1]=o[T-2][1].actor,this.$=[o[T-1],{type:"addNote",placement:g.PLACEMENT.OVER,actor:o[T-2].slice(0,2),text:o[T]}];break;case 60:this.$=[o[T-1],{type:"addLinks",actor:o[T-1].actor,text:o[T]}];break;case 61:this.$=[o[T-1],{type:"addALink",actor:o[T-1].actor,text:o[T]}];break;case 62:this.$=[o[T-1],{type:"addProperties",actor:o[T-1].actor,text:o[T]}];break;case 63:this.$=[o[T-1],{type:"addDetails",actor:o[T-1].actor,text:o[T]}];break;case 66:this.$=[o[T-2],o[T]];break;case 67:this.$=o[T];break;case 68:this.$=g.PLACEMENT.LEFTOF;break;case 69:this.$=g.PLACEMENT.RIGHTOF;break;case 70:this.$=[o[T-4],o[T-1],{type:"addMessage",from:o[T-4].actor,to:o[T-1].actor,signalType:o[T-3],msg:o[T],activate:!0},{type:"activeStart",signalType:g.LINETYPE.ACTIVE_START,actor:o[T-1].actor}];break;case 71:this.$=[o[T-4],o[T-1],{type:"addMessage",from:o[T-4].actor,to:o[T-1].actor,signalType:o[T-3],msg:o[T]},{type:"activeEnd",signalType:g.LINETYPE.ACTIVE_END,actor:o[T-4].actor}];break;case 72:this.$=[o[T-4],o[T-1],{type:"addMessage",from:o[T-4].actor,to:o[T-1].actor,signalType:o[T-3],msg:o[T],activate:!0,centralConnection:g.LINETYPE.CENTRAL_CONNECTION},{type:"centralConnection",signalType:g.LINETYPE.CENTRAL_CONNECTION,actor:o[T-1].actor}];break;case 73:this.$=[o[T-4],o[T-1],{type:"addMessage",from:o[T-4].actor,to:o[T-1].actor,signalType:o[T-2],msg:o[T],activate:!1,centralConnection:g.LINETYPE.CENTRAL_CONNECTION_REVERSE},{type:"centralConnectionReverse",signalType:g.LINETYPE.CENTRAL_CONNECTION_REVERSE,actor:o[T-4].actor}];break;case 74:this.$=[o[T-5],o[T-1],{type:"addMessage",from:o[T-5].actor,to:o[T-1].actor,signalType:o[T-3],msg:o[T],activate:!0,centralConnection:g.LINETYPE.CENTRAL_CONNECTION_DUAL},{type:"centralConnection",signalType:g.LINETYPE.CENTRAL_CONNECTION,actor:o[T-1].actor},{type:"centralConnectionReverse",signalType:g.LINETYPE.CENTRAL_CONNECTION_REVERSE,actor:o[T-5].actor}];break;case 75:this.$=[o[T-3],o[T-1],{type:"addMessage",from:o[T-3].actor,to:o[T-1].actor,signalType:o[T-2],msg:o[T]}];break;case 76:this.$={type:"addParticipant",actor:o[T-1],config:o[T]};break;case 77:this.$=o[T-1].trim();break;case 78:this.$={type:"addParticipant",actor:o[T]};break;case 79:this.$=g.LINETYPE.SOLID_OPEN;break;case 80:this.$=g.LINETYPE.DOTTED_OPEN;break;case 81:this.$=g.LINETYPE.SOLID;break;case 82:this.$=g.LINETYPE.SOLID_TOP;break;case 83:this.$=g.LINETYPE.SOLID_BOTTOM;break;case 84:this.$=g.LINETYPE.STICK_TOP;break;case 85:this.$=g.LINETYPE.STICK_BOTTOM;break;case 86:this.$=g.LINETYPE.SOLID_TOP_DOTTED;break;case 87:this.$=g.LINETYPE.SOLID_BOTTOM_DOTTED;break;case 88:this.$=g.LINETYPE.STICK_TOP_DOTTED;break;case 89:this.$=g.LINETYPE.STICK_BOTTOM_DOTTED;break;case 90:this.$=g.LINETYPE.SOLID_ARROW_TOP_REVERSE;break;case 91:this.$=g.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE;break;case 92:this.$=g.LINETYPE.STICK_ARROW_TOP_REVERSE;break;case 93:this.$=g.LINETYPE.STICK_ARROW_BOTTOM_REVERSE;break;case 94:this.$=g.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED;break;case 95:this.$=g.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED;break;case 96:this.$=g.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED;break;case 97:this.$=g.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED;break;case 98:this.$=g.LINETYPE.BIDIRECTIONAL_SOLID;break;case 99:this.$=g.LINETYPE.DOTTED;break;case 100:this.$=g.LINETYPE.BIDIRECTIONAL_DOTTED;break;case 101:this.$=g.LINETYPE.SOLID_CROSS;break;case 102:this.$=g.LINETYPE.DOTTED_CROSS;break;case 103:this.$=g.LINETYPE.SOLID_POINT;break;case 104:this.$=g.LINETYPE.DOTTED_POINT;break;case 105:this.$=g.parseMessage(o[T].trim().substring(1));break}},"anonymous"),table:[{3:1,4:t,5:a,6:r},{1:[3]},{3:5,4:t,5:a,6:r},{3:6,4:t,5:a,6:r},e([1,4,5,10,14,15,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,51,53,54,56,61,62,63,64,73],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},e(I,[2,5]),{9:48,13:13,14:h,15:s,18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},e(I,[2,7]),e(I,[2,8]),e(I,[2,9]),e(I,[2,15]),{13:49,51:X,53:z,54:v},{16:[1,50]},{5:[1,51]},{5:[1,54],20:[1,52],21:[1,53]},{23:55,73:R},{23:56,73:R},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},{5:[1,61]},e(I,[2,30]),e(I,[2,31]),{33:[1,62]},{35:[1,63]},e(I,[2,34]),{16:[1,64]},{16:[1,65]},{16:[1,66]},{16:[1,67]},{16:[1,68]},{16:[1,69]},{16:[1,70]},{16:[1,71]},{23:72,55:73,73:ot},{23:75,55:76,73:ot},{23:77,73:R},{69:78,72:[1,79],78:ct,79:C,80:ie,81:ne,82:oe,83:ce,84:le,85:he,86:de,87:Te,88:Ee,89:pe,90:ue,91:_e,92:fe,93:ge,94:xe,95:Ie,96:be,97:Re,98:Oe,99:ye,100:Le,101:Se,102:me,103:Ne},{57:106,59:[1,107],67:[1,108],68:[1,109]},{23:110,73:R},{23:111,73:R},{23:112,73:R},{23:113,73:R},e([5,66,72,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104],Ae),e(I,[2,6]),e(I,[2,16]),e(Lt,[2,10],{11:114}),e(I,[2,18]),{5:[1,116],20:[1,115]},{5:[1,117]},e(I,[2,22]),{5:[1,118]},{5:[1,119]},e(I,[2,25]),e(I,[2,26]),e(I,[2,27]),e(I,[2,28]),e(I,[2,29]),e(I,[2,32]),e(I,[2,33]),e(wt,i,{7:120}),e(wt,i,{7:121}),e(wt,i,{7:122}),e(we,i,{41:123,7:124}),e(Ht,i,{43:125,7:126}),e(Ht,i,{7:126,43:127}),e(Pe,i,{46:128,7:129}),e(wt,i,{7:130}),{5:[1,132],52:[1,131]},{5:[1,134],52:[1,133]},e(zt,Ae,{74:135,75:[1,136]}),{5:[1,138],52:[1,137]},{5:[1,140],52:[1,139]},{5:[1,141]},{23:145,70:[1,142],71:[1,143],72:[1,144],73:R},{69:146,78:ct,79:C,80:ie,81:ne,82:oe,83:ce,84:le,85:he,86:de,87:Te,88:Ee,89:pe,90:ue,91:_e,92:fe,93:ge,94:xe,95:Ie,96:be,97:Re,98:Oe,99:ye,100:Le,101:Se,102:me,103:Ne},e(B,[2,79]),e(B,[2,80]),e(B,[2,81]),e(B,[2,82]),e(B,[2,83]),e(B,[2,84]),e(B,[2,85]),e(B,[2,86]),e(B,[2,87]),e(B,[2,88]),e(B,[2,89]),e(B,[2,90]),e(B,[2,91]),e(B,[2,92]),e(B,[2,93]),e(B,[2,94]),e(B,[2,95]),e(B,[2,96]),e(B,[2,97]),e(B,[2,98]),e(B,[2,99]),e(B,[2,100]),e(B,[2,101]),e(B,[2,102]),e(B,[2,103]),e(B,[2,104]),{23:147,73:R},{23:149,60:148,73:R},{73:[2,68]},{73:[2,69]},{58:150,104:it},{58:152,104:it},{58:153,104:it},{58:154,104:it},{4:[1,157],5:[1,159],12:156,13:158,17:[1,155],51:X,53:z,54:v},{5:[1,160]},e(I,[2,20]),e(I,[2,21]),e(I,[2,23]),e(I,[2,24]),{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[1,161],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[1,162],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[1,163],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{17:[1,164]},{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[2,47],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,50:[1,165],51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{17:[1,166]},{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[2,45],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,49:[1,167],51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{17:[1,168]},{17:[1,169]},{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[2,43],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,48:[1,170],51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[1,171],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{16:[1,172]},e(I,[2,50]),{16:[1,173]},e(I,[2,55]),e(zt,[2,76]),{76:[1,174]},{16:[1,175]},e(I,[2,52]),{16:[1,176]},e(I,[2,57]),e(I,[2,53]),{23:177,73:R},{23:178,73:R},{23:179,73:R},{58:180,104:it},{23:181,72:[1,182],73:R},{58:183,104:it},{58:184,104:it},{66:[1,185],104:[2,67]},{5:[2,60]},{5:[2,105]},{5:[2,61]},{5:[2,62]},{5:[2,63]},e(I,[2,17]),e(Lt,[2,11]),{13:186,51:X,53:z,54:v},e(Lt,[2,13]),e(Lt,[2,14]),e(I,[2,19]),e(I,[2,35]),e(I,[2,36]),e(I,[2,37]),e(I,[2,38]),{16:[1,187]},e(I,[2,39]),{16:[1,188]},e(I,[2,40]),e(I,[2,41]),{16:[1,189]},e(I,[2,42]),{5:[1,190]},{5:[1,191]},{77:[1,192]},{5:[1,193]},{5:[1,194]},{58:195,104:it},{58:196,104:it},{58:197,104:it},{5:[2,75]},{58:198,104:it},{23:199,73:R},{5:[2,58]},{5:[2,59]},{23:200,73:R},e(Lt,[2,12]),e(we,i,{7:124,41:201}),e(Ht,i,{7:126,43:202}),e(Pe,i,{7:129,46:203}),e(I,[2,49]),e(I,[2,54]),e(zt,[2,77]),e(I,[2,51]),e(I,[2,56]),{5:[2,70]},{5:[2,71]},{5:[2,72]},{5:[2,73]},{58:204,104:it},{104:[2,66]},{17:[2,48]},{17:[2,46]},{17:[2,44]},{5:[2,74]}],defaultActions:{5:[2,1],6:[2,2],108:[2,68],109:[2,69],150:[2,60],151:[2,105],152:[2,61],153:[2,62],154:[2,63],180:[2,75],183:[2,58],184:[2,59],195:[2,70],196:[2,71],197:[2,72],198:[2,73],200:[2,66],201:[2,48],202:[2,46],203:[2,44],204:[2,74]},parseError:_(function(y,N){if(N.recoverable)this.trace(y);else{var m=new Error(y);throw m.hash=N,m}},"parseError"),parse:_(function(y){var N=this,m=[0],g=[],V=[null],o=[],St=this.table,T="",kt=0,ke=0,De=0,ur=2,ve=1,_r=o.slice.call(arguments,1),q=Object.create(this.lexer),_t={yy:{}};for(var Gt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Gt)&&(_t.yy[Gt]=this.yy[Gt]);q.setInput(y,_t.yy),_t.yy.lexer=q,_t.yy.parser=this,typeof q.yylloc>"u"&&(q.yylloc={});var Xt=q.yylloc;o.push(Xt);var fr=q.options&&q.options.ranges;typeof _t.yy.parseError=="function"?this.parseError=_t.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function gr(rt){m.length=m.length-2*rt,V.length=V.length-rt,o.length=o.length-rt}_(gr,"popStack");function Ce(){var rt;return rt=g.pop()||q.lex()||ve,typeof rt!="number"&&(rt instanceof Array&&(g=rt,rt=g.pop()),rt=N.symbols_[rt]||rt),rt}_(Ce,"lex");for(var J,Jt,ft,nt,us,Qt,bt={},Dt,dt,Me,vt;;){if(ft=m[m.length-1],this.defaultActions[ft]?nt=this.defaultActions[ft]:((J===null||typeof J>"u")&&(J=Ce()),nt=St[ft]&&St[ft][J]),typeof nt>"u"||!nt.length||!nt[0]){var Zt="";vt=[];for(Dt in St[ft])this.terminals_[Dt]&&Dt>ur&&vt.push("'"+this.terminals_[Dt]+"'");q.showPosition?Zt="Parse error on line "+(kt+1)+`: -`+q.showPosition()+` -Expecting `+vt.join(", ")+", got '"+(this.terminals_[J]||J)+"'":Zt="Parse error on line "+(kt+1)+": Unexpected "+(J==ve?"end of input":"'"+(this.terminals_[J]||J)+"'"),this.parseError(Zt,{text:q.match,token:this.terminals_[J]||J,line:q.yylineno,loc:Xt,expected:vt})}if(nt[0]instanceof Array&&nt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ft+", token: "+J);switch(nt[0]){case 1:m.push(J),V.push(q.yytext),o.push(q.yylloc),m.push(nt[1]),J=null,Jt?(J=Jt,Jt=null):(ke=q.yyleng,T=q.yytext,kt=q.yylineno,Xt=q.yylloc,De>0&&De--);break;case 2:if(dt=this.productions_[nt[1]][1],bt.$=V[V.length-dt],bt._$={first_line:o[o.length-(dt||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(dt||1)].first_column,last_column:o[o.length-1].last_column},fr&&(bt._$.range=[o[o.length-(dt||1)].range[0],o[o.length-1].range[1]]),Qt=this.performAction.apply(bt,[T,ke,kt,_t.yy,nt[1],V,o].concat(_r)),typeof Qt<"u")return Qt;dt&&(m=m.slice(0,-1*dt*2),V=V.slice(0,-1*dt),o=o.slice(0,-1*dt)),m.push(this.productions_[nt[1]][0]),V.push(bt.$),o.push(bt._$),Me=St[m[m.length-2]][m[m.length-1]],m.push(Me);break;case 3:return!0}}return!0},"parse")},pr=(function(){var Et={EOF:1,parseError:_(function(N,m){if(this.yy.parser)this.yy.parser.parseError(N,m);else throw new Error(N)},"parseError"),setInput:_(function(y,N){return this.yy=N||this.yy||{},this._input=y,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:_(function(){var y=this._input[0];this.yytext+=y,this.yyleng++,this.offset++,this.match+=y,this.matched+=y;var N=y.match(/(?:\r\n?|\n).*/g);return N?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),y},"input"),unput:_(function(y){var N=y.length,m=y.split(/(?:\r\n?|\n)/g);this._input=y+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-N),this.offset-=N;var g=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),m.length-1&&(this.yylineno-=m.length-1);var V=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:m?(m.length===g.length?this.yylloc.first_column:0)+g[g.length-m.length].length-m[0].length:this.yylloc.first_column-N},this.options.ranges&&(this.yylloc.range=[V[0],V[0]+this.yyleng-N]),this.yyleng=this.yytext.length,this},"unput"),more:_(function(){return this._more=!0,this},"more"),reject:_(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:_(function(y){this.unput(this.match.slice(y))},"less"),pastInput:_(function(){var y=this.matched.substr(0,this.matched.length-this.match.length);return(y.length>20?"...":"")+y.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:_(function(){var y=this.match;return y.length<20&&(y+=this._input.substr(0,20-y.length)),(y.substr(0,20)+(y.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:_(function(){var y=this.pastInput(),N=new Array(y.length+1).join("-");return y+this.upcomingInput()+` -`+N+"^"},"showPosition"),test_match:_(function(y,N){var m,g,V;if(this.options.backtrack_lexer&&(V={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(V.yylloc.range=this.yylloc.range.slice(0))),g=y[0].match(/(?:\r\n?|\n).*/g),g&&(this.yylineno+=g.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:g?g[g.length-1].length-g[g.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+y[0].length},this.yytext+=y[0],this.match+=y[0],this.matches=y,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(y[0].length),this.matched+=y[0],m=this.performAction.call(this,this.yy,this,N,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),m)return m;if(this._backtrack){for(var o in V)this[o]=V[o];return!1}return!1},"test_match"),next:_(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var y,N,m,g;this._more||(this.yytext="",this.match="");for(var V=this._currentRules(),o=0;oN[0].length)){if(N=m,g=o,this.options.backtrack_lexer){if(y=this.test_match(m,V[o]),y!==!1)return y;if(this._backtrack){N=!1;continue}else return!1}else if(!this.options.flex)break}return N?(y=this.test_match(N,V[g]),y!==!1?y:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:_(function(){var N=this.next();return N||this.lex()},"lex"),begin:_(function(N){this.conditionStack.push(N)},"begin"),popState:_(function(){var N=this.conditionStack.length-1;return N>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:_(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:_(function(N){return N=this.conditionStack.length-1-Math.abs(N||0),N>=0?this.conditionStack[N]:"INITIAL"},"topState"),pushState:_(function(N){this.begin(N)},"pushState"),stateStackSize:_(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:_(function(N,m,g,V){var o=V;switch(g){case 0:return 5;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:return 20;case 7:return this.begin("CONFIG"),75;break;case 8:return 76;case 9:return this.popState(),this.begin("ALIAS"),77;break;case 10:return this.popState(),this.popState(),77;break;case 11:return m.yytext=m.yytext.trim(),73;break;case 12:return m.yytext=m.yytext.trim(),this.begin("ALIAS"),73;break;case 13:return m.yytext=m.yytext.trim(),this.popState(),73;break;case 14:return this.popState(),10;break;case 15:return this.begin("LINE"),15;break;case 16:return this.begin("ID"),51;break;case 17:return this.begin("ID"),53;break;case 18:return 14;case 19:return this.begin("ID"),54;break;case 20:return this.popState(),this.popState(),this.begin("LINE"),52;break;case 21:return this.popState(),this.popState(),5;break;case 22:return this.begin("LINE"),37;break;case 23:return this.begin("LINE"),38;break;case 24:return this.begin("LINE"),39;break;case 25:return this.begin("LINE"),40;break;case 26:return this.begin("LINE"),50;break;case 27:return this.begin("LINE"),42;break;case 28:return this.begin("LINE"),44;break;case 29:return this.begin("LINE"),49;break;case 30:return this.begin("LINE"),45;break;case 31:return this.begin("LINE"),48;break;case 32:return this.begin("LINE"),47;break;case 33:return this.popState(),16;break;case 34:return 17;case 35:return 67;case 36:return 68;case 37:return 61;case 38:return 62;case 39:return 63;case 40:return 64;case 41:return 59;case 42:return 56;case 43:return this.begin("ID"),22;break;case 44:return this.begin("ID"),24;break;case 45:return 30;case 46:return 31;case 47:return this.begin("acc_title"),32;break;case 48:return this.popState(),"acc_title_value";break;case 49:return this.begin("acc_descr"),34;break;case 50:return this.popState(),"acc_descr_value";break;case 51:this.begin("acc_descr_multiline");break;case 52:this.popState();break;case 53:return"acc_descr_multiline_value";case 54:return 6;case 55:return 19;case 56:return 21;case 57:return 66;case 58:return 5;case 59:return m.yytext=m.yytext.trim(),73;break;case 60:return 80;case 61:return 97;case 62:return 98;case 63:return 99;case 64:return 78;case 65:return 79;case 66:return 100;case 67:return 101;case 68:return 102;case 69:return 103;case 70:return 85;case 71:return 86;case 72:return 87;case 73:return 88;case 74:return 93;case 75:return 94;case 76:return 95;case 77:return 96;case 78:return 81;case 79:return 82;case 80:return 83;case 81:return 84;case 82:return 89;case 83:return 90;case 84:return 91;case 85:return 92;case 86:return 104;case 87:return 104;case 88:return 70;case 89:return 71;case 90:return 72;case 91:return 5;case 92:return 10}},"anonymous"),rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:@\{)/i,/^(?:[^\}]+)/i,/^(?:\}(?=\s+as\s))/i,/^(?:\})/i,/^(?:[^\<->\->:\n,;@\s]+(?=@\{))/i,/^(?:[^<>:\n,;@\s]+(?=\s+as\s))/i,/^(?:[^<>:\n,;@]+(?=\s*[\n;#]|$))/i,/^(?:[^<>:\n,;@]*<[^\n]*)/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:create\b)/i,/^(?:destroy\b)/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:par_over\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\/\\\+\()\+<\->\->:\n,;]+((?!(-x|--x|-\)|--\)|-\|\\|-\\|-\/|-\/\/|-\|\/|\/\|-|\\\|-|\/\/-|\\\\-|\/\|-|--\|\\|--|\(\)))[\-]*[^\+<\->\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:<<->>)/i,/^(?:-->>)/i,/^(?:<<-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?:--\|\\)/i,/^(?:--\|\/)/i,/^(?:--\\\\)/i,/^(?:--\/\/)/i,/^(?:\/\|--)/i,/^(?:\\\|--)/i,/^(?:\/\/--)/i,/^(?:\\\\--)/i,/^(?:-\|\\)/i,/^(?:-\|\/)/i,/^(?:-\\\\)/i,/^(?:-\/\/)/i,/^(?:\/\|-)/i,/^(?:\\\|-)/i,/^(?:\/\/-)/i,/^(?:\\\\-)/i,/^(?::(?:(?:no)?wrap)?[^#\n;]*)/i,/^(?::)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:\(\))/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[52,53],inclusive:!1},acc_descr:{rules:[50],inclusive:!1},acc_title:{rules:[48],inclusive:!1},ID:{rules:[2,3,7,11,12,13,14],inclusive:!1},ALIAS:{rules:[2,3,20,21],inclusive:!1},LINE:{rules:[2,3,33],inclusive:!1},CONFIG:{rules:[8,9,10],inclusive:!1},CONFIG_DATA:{rules:[],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,6,15,16,17,18,19,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,49,51,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92],inclusive:!0}}};return Et})();Ut.lexer=pr;function Pt(){this.yy={}}return _(Pt,"Parser"),Pt.prototype=Ut,Ut.Parser=Pt,new Pt})();ee.parser=ee;var br=ee,Rr={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31,PAR_OVER_START:32,BIDIRECTIONAL_SOLID:33,BIDIRECTIONAL_DOTTED:34,SOLID_TOP:41,SOLID_BOTTOM:42,STICK_TOP:43,STICK_BOTTOM:44,SOLID_ARROW_TOP_REVERSE:45,SOLID_ARROW_BOTTOM_REVERSE:46,STICK_ARROW_TOP_REVERSE:47,STICK_ARROW_BOTTOM_REVERSE:48,SOLID_TOP_DOTTED:51,SOLID_BOTTOM_DOTTED:52,STICK_TOP_DOTTED:53,STICK_BOTTOM_DOTTED:54,SOLID_ARROW_TOP_REVERSE_DOTTED:55,SOLID_ARROW_BOTTOM_REVERSE_DOTTED:56,STICK_ARROW_TOP_REVERSE_DOTTED:57,STICK_ARROW_BOTTOM_REVERSE_DOTTED:58,CENTRAL_CONNECTION:59,CENTRAL_CONNECTION_REVERSE:60,CENTRAL_CONNECTION_DUAL:61},Or={FILLED:0,OPEN:1},yr={LEFTOF:0,RIGHTOF:1,OVER:2},Yt={ACTOR:"actor",BOUNDARY:"boundary",COLLECTIONS:"collections",CONTROL:"control",DATABASE:"database",ENTITY:"entity",PARTICIPANT:"participant",QUEUE:"queue"},Lr=class{constructor(){this.state=new tr(()=>({prevActor:void 0,actors:new Map,createdActors:new Map,destroyedActors:new Map,boxes:[],messages:[],notes:[],sequenceNumbersEnabled:!1,wrapEnabled:void 0,currentBox:void 0,lastCreated:void 0,lastDestroyed:void 0})),this.setAccTitle=jt,this.setAccDescription=He,this.setDiagramTitle=Ue,this.getAccTitle=qe,this.getAccDescription=ze,this.getDiagramTitle=Ge,this.apply=this.apply.bind(this),this.parseBoxData=this.parseBoxData.bind(this),this.parseMessage=this.parseMessage.bind(this),this.clear(),this.setWrap(j().wrap),this.LINETYPE=Rr,this.ARROWTYPE=Or,this.PLACEMENT=yr}static{_(this,"SequenceDB")}addBox(e){this.state.records.boxes.push({name:e.text,wrap:e.wrap??this.autoWrap(),fill:e.color,actorKeys:[]}),this.state.records.currentBox=this.state.records.boxes.slice(-1)[0]}addActor(e,t,a,r,i){let n=this.state.records.currentBox,c;if(i!==void 0){let h;i.includes(` -`)?h=i+` -`:h=`{ -`+i+` -}`,c=Qe(h,{schema:Je})}r=c?.type??r,c?.alias&&(!a||a.text===t)&&(a={text:c.alias,wrap:a?.wrap,type:r});let l=this.state.records.actors.get(e);if(l){if(this.state.records.currentBox&&l.box&&this.state.records.currentBox!==l.box)throw new Error(`A same participant should only be defined in one Box: ${l.name} can't be in '${l.box.name}' and in '${this.state.records.currentBox.name}' at the same time.`);if(n=l.box?l.box:this.state.records.currentBox,l.box=n,l&&t===l.name&&a==null)return}if(a?.text==null&&(a={text:t,type:r}),(r==null||a.text==null)&&(a={text:t,type:r}),this.state.records.actors.set(e,{box:n,name:t,description:a.text,wrap:a.wrap??this.autoWrap(),prevActor:this.state.records.prevActor,links:{},properties:{},actorCnt:null,rectData:null,type:r??"participant"}),this.state.records.prevActor){let h=this.state.records.actors.get(this.state.records.prevActor);h&&(h.nextActor=e)}this.state.records.currentBox&&this.state.records.currentBox.actorKeys.push(e),this.state.records.prevActor=e}activationCount(e){let t,a=0;if(!e)return 0;for(t=0;t>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},l}return this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:e,to:t,message:a?.text??"",wrap:a?.wrap??this.autoWrap(),type:r,activate:i,centralConnection:n??0}),!0}hasAtLeastOneBox(){return this.state.records.boxes.length>0}hasAtLeastOneBoxWithTitle(){return this.state.records.boxes.some(e=>e.name)}getMessages(){return this.state.records.messages}getBoxes(){return this.state.records.boxes}getActors(){return this.state.records.actors}getCreatedActors(){return this.state.records.createdActors}getDestroyedActors(){return this.state.records.destroyedActors}getActor(e){return this.state.records.actors.get(e)}getActorKeys(){return[...this.state.records.actors.keys()]}enableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!0}disableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!1}showSequenceNumbers(){return this.state.records.sequenceNumbersEnabled}setWrap(e){this.state.records.wrapEnabled=e}extractWrap(e){if(e===void 0)return{};e=e.trim();let t=/^:?wrap:/.exec(e)!==null?!0:/^:?nowrap:/.exec(e)!==null?!1:void 0;return{cleanedText:(t===void 0?e:e.replace(/^:?(?:no)?wrap:/,"")).trim(),wrap:t}}autoWrap(){return this.state.records.wrapEnabled!==void 0?this.state.records.wrapEnabled:j().sequence?.wrap??!1}clear(){this.state.reset(),Fe()}parseMessage(e){let t=e.trim(),{wrap:a,cleanedText:r}=this.extractWrap(t),i={text:r,wrap:a};return Q.debug(`parseMessage: ${JSON.stringify(i)}`),i}parseBoxData(e){let t=/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/.exec(e),a=t?.[1]?t[1].trim():"transparent",r=t?.[2]?t[2].trim():void 0;if(window?.CSS)window.CSS.supports("color",a)||(a="transparent",r=e.trim());else{let c=new Option().style;c.color=a,c.color!==a&&(a="transparent",r=e.trim())}let{wrap:i,cleanedText:n}=this.extractWrap(r);return{text:n?Nt(n,j()):void 0,color:a,wrap:i}}addNote(e,t,a){let r={actor:e,placement:t,message:a.text,wrap:a.wrap??this.autoWrap()},i=[].concat(e,e);this.state.records.notes.push(r),this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:i[0],to:i[1],message:a.text,wrap:a.wrap??this.autoWrap(),type:this.LINETYPE.NOTE,placement:t})}addLinks(e,t){let a=this.getActor(e);try{let r=Nt(t.text,j());r=r.replace(/=/g,"="),r=r.replace(/&/g,"&");let i=JSON.parse(r);this.insertLinks(a,i)}catch(r){Q.error("error while parsing actor link text",r)}}addALink(e,t){let a=this.getActor(e);try{let r={},i=Nt(t.text,j()),n=i.indexOf("@");i=i.replace(/=/g,"="),i=i.replace(/&/g,"&");let c=i.slice(0,n-1).trim(),l=i.slice(n+1).trim();r[c]=l,this.insertLinks(a,r)}catch(r){Q.error("error while parsing actor link text",r)}}insertLinks(e,t){if(e.links==null)e.links=t;else for(let a in t)e.links[a]=t[a]}addProperties(e,t){let a=this.getActor(e);try{let r=Nt(t.text,j()),i=JSON.parse(r);this.insertProperties(a,i)}catch(r){Q.error("error while parsing actor properties text",r)}}insertProperties(e,t){if(e.properties==null)e.properties=t;else for(let a in t)e.properties[a]=t[a]}boxEnd(){this.state.records.currentBox=void 0}addDetails(e,t){let a=this.getActor(e),r=document.getElementById(t.text);try{let i=r.innerHTML,n=JSON.parse(i);n.properties&&this.insertProperties(a,n.properties),n.links&&this.insertLinks(a,n.links)}catch(i){Q.error("error while parsing actor details text",i)}}getActorProperty(e,t){if(e?.properties!==void 0)return e.properties[t]}apply(e){if(Array.isArray(e))e.forEach(t=>{this.apply(t)});else switch(e.type){case"sequenceIndex":this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:void 0,to:void 0,message:{start:e.sequenceIndex,step:e.sequenceIndexStep,visible:e.sequenceVisible},wrap:!1,type:e.signalType});break;case"addParticipant":this.addActor(e.actor,e.actor,e.description,e.draw,e.config);break;case"createParticipant":if(this.state.records.actors.has(e.actor))throw new Error("It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior");this.state.records.lastCreated=e.actor,this.addActor(e.actor,e.actor,e.description,e.draw,e.config),this.state.records.createdActors.set(e.actor,this.state.records.messages.length);break;case"destroyParticipant":this.state.records.lastDestroyed=e.actor,this.state.records.destroyedActors.set(e.actor,this.state.records.messages.length);break;case"activeStart":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"centralConnection":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"centralConnectionReverse":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"activeEnd":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"addNote":this.addNote(e.actor,e.placement,e.text);break;case"addLinks":this.addLinks(e.actor,e.text);break;case"addALink":this.addALink(e.actor,e.text);break;case"addProperties":this.addProperties(e.actor,e.text);break;case"addDetails":this.addDetails(e.actor,e.text);break;case"addMessage":if(this.state.records.lastCreated){if(e.to!==this.state.records.lastCreated)throw new Error("The created participant "+this.state.records.lastCreated.name+" does not have an associated creating message after its declaration. Please check the sequence diagram.");this.state.records.lastCreated=void 0}else if(this.state.records.lastDestroyed){if(e.to!==this.state.records.lastDestroyed&&e.from!==this.state.records.lastDestroyed)throw new Error("The destroyed participant "+this.state.records.lastDestroyed.name+" does not have an associated destroying message after its declaration. Please check the sequence diagram.");this.state.records.lastDestroyed=void 0}this.addSignal(e.from,e.to,e.msg,e.signalType,e.activate,e.centralConnection);break;case"boxStart":this.addBox(e.boxData);break;case"boxEnd":this.boxEnd();break;case"loopStart":this.addSignal(void 0,void 0,e.loopText,e.signalType);break;case"loopEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"rectStart":this.addSignal(void 0,void 0,e.color,e.signalType);break;case"rectEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"optStart":this.addSignal(void 0,void 0,e.optText,e.signalType);break;case"optEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"altStart":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"else":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"altEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"setAccTitle":jt(e.text);break;case"parStart":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"and":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"parEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"criticalStart":this.addSignal(void 0,void 0,e.criticalText,e.signalType);break;case"option":this.addSignal(void 0,void 0,e.optionText,e.signalType);break;case"criticalEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"breakStart":this.addSignal(void 0,void 0,e.breakText,e.signalType);break;case"breakEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break}}getConfig(){return j().sequence}},Sr=_(e=>`.actor { - stroke: ${e.actorBorder}; - fill: ${e.actorBkg}; - } - - text.actor > tspan { - fill: ${e.actorTextColor}; - stroke: none; - } - - .actor-line { - stroke: ${e.actorLineColor}; - } - - .innerArc { - stroke-width: 1.5; - stroke-dasharray: none; - } - - .messageLine0 { - stroke-width: 1.5; - stroke-dasharray: none; - stroke: ${e.signalColor}; - } - - .messageLine1 { - stroke-width: 1.5; - stroke-dasharray: 2, 2; - stroke: ${e.signalColor}; - } - - #arrowhead path { - fill: ${e.signalColor}; - stroke: ${e.signalColor}; - } - - .sequenceNumber { - fill: ${e.sequenceNumberColor}; - } - - #sequencenumber { - fill: ${e.signalColor}; - } - - #crosshead path { - fill: ${e.signalColor}; - stroke: ${e.signalColor}; - } - - .messageText { - fill: ${e.signalTextColor}; - stroke: none; - } - - .labelBox { - stroke: ${e.labelBoxBorderColor}; - fill: ${e.labelBoxBkgColor}; - } - - .labelText, .labelText > tspan { - fill: ${e.labelTextColor}; - stroke: none; - } - - .loopText, .loopText > tspan { - fill: ${e.loopTextColor}; - stroke: none; - } - - .loopLine { - stroke-width: 2px; - stroke-dasharray: 2, 2; - stroke: ${e.labelBoxBorderColor}; - fill: ${e.labelBoxBorderColor}; - } - - .note { - //stroke: #decc93; - stroke: ${e.noteBorderColor}; - fill: ${e.noteBkgColor}; - } - - .noteText, .noteText > tspan { - fill: ${e.noteTextColor}; - stroke: none; - } - - .activation0 { - fill: ${e.activationBkgColor}; - stroke: ${e.activationBorderColor}; - } - - .activation1 { - fill: ${e.activationBkgColor}; - stroke: ${e.activationBorderColor}; - } - - .activation2 { - fill: ${e.activationBkgColor}; - stroke: ${e.activationBorderColor}; - } - - .actorPopupMenu { - position: absolute; - } - - .actorPopupMenuPanel { - position: absolute; - fill: ${e.actorBkg}; - box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); - filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4)); -} - .actor-man line { - stroke: ${e.actorBorder}; - fill: ${e.actorBkg}; - } - .actor-man circle, line { - stroke: ${e.actorBorder}; - fill: ${e.actorBkg}; - stroke-width: 2px; - } - -`,"getStyles"),mr=Sr,gt=36,pt="actor-top",ut="actor-bottom",Kt="actor-box",xt="actor-man",At=_(function(e,t){return $e(e,t)},"drawRect"),Nr=_(function(e,t,a,r,i){if(t.links===void 0||t.links===null||Object.keys(t.links).length===0)return{height:0,width:0};let n=t.links,c=t.actorCnt,l=t.rectData;var h="none";i&&(h="block !important");let s=e.append("g");s.attr("id","actor"+c+"_popup"),s.attr("class","actorPopupMenu"),s.attr("display",h);var E="";l.class!==void 0&&(E=" "+l.class);let p=l.width>a?l.width:a,f=s.append("rect");if(f.attr("class","actorPopupMenuPanel"+E),f.attr("x",l.x),f.attr("y",l.height),f.attr("fill",l.fill),f.attr("stroke",l.stroke),f.attr("width",p),f.attr("height",l.height),f.attr("rx",l.rx),f.attr("ry",l.ry),n!=null){var u=20;for(let L in n){var O=s.append("a"),b=(0,ae.sanitizeUrl)(n[L]);O.attr("xlink:href",b),O.attr("target","_blank"),Qr(r)(L,O,l.x+10,l.height+u,p,20,{class:"actor"},r),u+=30}}return f.attr("height",u),{height:l.height+u,width:p}},"drawPopup"),Ft=_(function(e){return"var pu = document.getElementById('"+e+"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"},"popupMenuToggle"),Wt=_(function(e,t,a=null){return $(this,null,function*(){let r=e.append("foreignObject"),i=yield $t(t.text,Ct()),c=r.append("xhtml:div").attr("style","width: fit-content;").attr("xmlns","http://www.w3.org/1999/xhtml").html(i).node().getBoundingClientRect();if(r.attr("height",Math.round(c.height)).attr("width",Math.round(c.width)),t.class==="noteText"){let l=e.node().firstChild;l.setAttribute("height",c.height+2*t.textMargin);let h=l.getBBox();r.attr("x",Math.round(h.x+h.width/2-c.width/2)).attr("y",Math.round(h.y+h.height/2-c.height/2))}else if(a){let{startx:l,stopx:h,starty:s}=a;if(l>h){let E=l;l=h,h=E}r.attr("x",Math.round(l+Math.abs(l-h)/2-c.width/2)),t.class==="loopText"?r.attr("y",Math.round(s)):r.attr("y",Math.round(s-c.height))}return[r]})},"drawKatex"),yt=_(function(e,t){let a=0,r=0,i=t.text.split(S.lineBreakRegex),[n,c]=te(t.fontSize),l=[],h=0,s=_(()=>t.y,"yfunc");if(t.valign!==void 0&&t.textMargin!==void 0&&t.textMargin>0)switch(t.valign){case"top":case"start":s=_(()=>Math.round(t.y+t.textMargin),"yfunc");break;case"middle":case"center":s=_(()=>Math.round(t.y+(a+r+t.textMargin)/2),"yfunc");break;case"bottom":case"end":s=_(()=>Math.round(t.y+(a+r+2*t.textMargin)-t.textMargin),"yfunc");break}if(t.anchor!==void 0&&t.textMargin!==void 0&&t.width!==void 0)switch(t.anchor){case"left":case"start":t.x=Math.round(t.x+t.textMargin),t.anchor="start",t.dominantBaseline="middle",t.alignmentBaseline="middle";break;case"middle":case"center":t.x=Math.round(t.x+t.width/2),t.anchor="middle",t.dominantBaseline="middle",t.alignmentBaseline="middle";break;case"right":case"end":t.x=Math.round(t.x+t.width-t.textMargin),t.anchor="end",t.dominantBaseline="middle",t.alignmentBaseline="middle";break}for(let[E,p]of i.entries()){t.textMargin!==void 0&&t.textMargin===0&&n!==void 0&&(h=E*n);let f=e.append("text");f.attr("x",t.x),f.attr("y",s()),t.anchor!==void 0&&f.attr("text-anchor",t.anchor).attr("dominant-baseline",t.dominantBaseline).attr("alignment-baseline",t.alignmentBaseline),t.fontFamily!==void 0&&f.style("font-family",t.fontFamily),c!==void 0&&f.style("font-size",c),t.fontWeight!==void 0&&f.style("font-weight",t.fontWeight),t.fill!==void 0&&f.attr("fill",t.fill),t.class!==void 0&&f.attr("class",t.class),t.dy!==void 0?f.attr("dy",t.dy):h!==0&&f.attr("dy",h);let u=p||Ze;if(t.tspan){let O=f.append("tspan");O.attr("x",t.x),t.fill!==void 0&&O.attr("fill",t.fill),O.text(u)}else f.text(u);t.valign!==void 0&&t.textMargin!==void 0&&t.textMargin>0&&(r+=(f._groups||f)[0][0].getBBox().height,a=r),l.push(f)}return l},"drawText"),sr=_(function(e,t){function a(i,n,c,l,h){return i+","+n+" "+(i+c)+","+n+" "+(i+c)+","+(n+l-h)+" "+(i+c-h*1.2)+","+(n+l)+" "+i+","+(n+l)}_(a,"genPoints");let r=e.append("polygon");return r.attr("points",a(t.x,t.y,t.width,t.height,7)),r.attr("class","labelBox"),t.y=t.y+t.height/2,yt(e,t),r},"drawLabel"),P=-1,ar=_((e,t,a,r)=>{e.select&&a.forEach(i=>{let n=t.get(i),c=e.select("#actor"+n.actorCnt);!r.mirrorActors&&n.stopy?c.attr("y2",n.stopy+n.height/2):r.mirrorActors&&c.attr("y2",n.stopy)})},"fixLifeLineHeights"),Ar=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+t.height,l=e.append("g").lower();var h=l;r||(P++,Object.keys(t.links||{}).length&&!a.forceMenus&&h.attr("onclick",Ft(`actor${P}_popup`)).attr("cursor","pointer"),h.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),h=l.append("g"),t.actorCnt=P,t.links!=null&&h.attr("id","root-"+P));let s=lt();var E="actor";t.properties?.class?E=t.properties.class:s.fill="#eaeaea",r?E+=` ${ut}`:E+=` ${pt}`,s.x=t.x,s.y=i,s.width=t.width,s.height=t.height,s.class=E,s.rx=3,s.ry=3,s.name=t.name;let p=At(h,s);if(t.rectData=s,t.properties?.icon){let u=t.properties.icon.trim();u.charAt(0)==="@"?Bt(h,s.x+s.width-20,s.y+10,u.substr(1)):Mt(h,s.x+s.width-20,s.y+10,u)}Tt(a,U(t.description))(t.description,h,s.x,s.y,s.width,s.height,{class:`actor ${Kt}`},a);let f=t.height;if(p.node){let u=p.node().getBBox();t.height=u.height,f=u.height}return f},"drawActorTypeParticipant"),wr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+t.height,l=e.append("g").lower();var h=l;r||(P++,Object.keys(t.links||{}).length&&!a.forceMenus&&h.attr("onclick",Ft(`actor${P}_popup`)).attr("cursor","pointer"),h.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),h=l.append("g"),t.actorCnt=P,t.links!=null&&h.attr("id","root-"+P));let s=lt();var E="actor";t.properties?.class?E=t.properties.class:s.fill="#eaeaea",r?E+=` ${ut}`:E+=` ${pt}`,s.x=t.x,s.y=i,s.width=t.width,s.height=t.height,s.class=E,s.name=t.name;let p=6,f=Ve(Be({},s),{x:s.x+-p,y:s.y+ +p,class:"actor"}),u=At(h,s);if(At(h,f),t.rectData=s,t.properties?.icon){let b=t.properties.icon.trim();b.charAt(0)==="@"?Bt(h,s.x+s.width-20,s.y+10,b.substr(1)):Mt(h,s.x+s.width-20,s.y+10,b)}Tt(a,U(t.description))(t.description,h,s.x-p,s.y+p,s.width,s.height,{class:`actor ${Kt}`},a);let O=t.height;if(u.node){let b=u.node().getBBox();t.height=b.height,O=b.height}return O},"drawActorTypeCollections"),Pr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+t.height,l=e.append("g").lower(),h=l;r||(P++,Object.keys(t.links||{}).length&&!a.forceMenus&&h.attr("onclick",Ft(`actor${P}_popup`)).attr("cursor","pointer"),h.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),h=l.append("g"),t.actorCnt=P,t.links!=null&&h.attr("id","root-"+P));let s=lt(),E="actor";t.properties?.class?E=t.properties.class:s.fill="#eaeaea",r?E+=` ${ut}`:E+=` ${pt}`,s.x=t.x,s.y=i,s.width=t.width,s.height=t.height,s.class=E,s.name=t.name;let p=s.height/2,f=p/(2.5+s.height/50),u=h.append("g"),O=h.append("g");if(u.append("path").attr("d",`M ${s.x},${s.y+p} - a ${f},${p} 0 0 0 0,${s.height} - h ${s.width-2*f} - a ${f},${p} 0 0 0 0,-${s.height} - Z - `).attr("class",E),O.append("path").attr("d",`M ${s.x},${s.y+p} - a ${f},${p} 0 0 0 0,${s.height}`).attr("stroke","#666").attr("stroke-width","1px").attr("class",E),u.attr("transform",`translate(${f}, ${-(s.height/2)})`),O.attr("transform",`translate(${s.width-f}, ${-s.height/2})`),t.rectData=s,t.properties?.icon){let w=t.properties.icon.trim(),A=s.x+s.width-20,k=s.y+10;w.charAt(0)==="@"?Bt(h,A,k,w.substr(1)):Mt(h,A,k,w)}Tt(a,U(t.description))(t.description,h,s.x,s.y,s.width,s.height,{class:`actor ${Kt}`},a);let b=t.height,L=u.select("path:last-child");if(L.node()){let w=L.node().getBBox();t.height=w.height,b=w.height}return b},"drawActorTypeQueue"),kr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+75,l=e.append("g").lower();r||(P++,l.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),t.actorCnt=P);let h=e.append("g"),s=xt;r?s+=` ${ut}`:s+=` ${pt}`,h.attr("class",s),h.attr("name",t.name);let E=lt();E.x=t.x,E.y=i,E.fill="#eaeaea",E.width=t.width,E.height=t.height,E.class="actor";let p=t.x+t.width/2,f=i+32,u=22;h.append("defs").append("marker").attr("id","filled-head-control").attr("refX",11).attr("refY",5.8).attr("markerWidth",20).attr("markerHeight",28).attr("orient","172.5").append("path").attr("d","M 14.4 5.6 L 7.2 10.4 L 8.8 5.6 L 7.2 0.8 Z"),h.append("circle").attr("cx",p).attr("cy",f).attr("r",u).attr("fill","#eaeaf7").attr("stroke","#666").attr("stroke-width",1.2),h.append("line").attr("marker-end","url(#filled-head-control)").attr("transform",`translate(${p}, ${f-u})`);let O=h.node().getBBox();return t.height=O.height+2*(a?.sequence?.labelBoxHeight??0),Tt(a,U(t.description))(t.description,h,E.x,E.y+u+(r?5:12),E.width,E.height,{class:`actor ${xt}`},a),t.height},"drawActorTypeControl"),Dr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+75,l=e.append("g").lower(),h=e.append("g"),s="actor";r?s+=` ${ut}`:s+=` ${pt}`,h.attr("class",s),h.attr("name",t.name);let E=lt();E.x=t.x,E.y=i,E.fill="#eaeaea",E.width=t.width,E.height=t.height,E.class="actor";let p=t.x+t.width/2,f=i+(r?10:25),u=22;h.append("circle").attr("cx",p).attr("cy",f).attr("r",u).attr("width",t.width).attr("height",t.height),h.append("line").attr("x1",p-u).attr("x2",p+u).attr("y1",f+u).attr("y2",f+u).attr("stroke-width",2);let O=h.node().getBBox();return t.height=O.height+(a?.sequence?.labelBoxHeight??0),r||(P++,l.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),t.actorCnt=P),Tt(a,U(t.description))(t.description,h,E.x,E.y+(r?15:30),E.width,E.height,{class:`actor ${xt}`},a),r?h.attr("transform",`translate(0, ${u})`):h.attr("transform",`translate(0, ${u/2-5})`),t.height},"drawActorTypeEntity"),vr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+t.height+2*a.boxTextMargin,l=e.append("g").lower(),h=l;r||(P++,Object.keys(t.links||{}).length&&!a.forceMenus&&h.attr("onclick",Ft(`actor${P}_popup`)).attr("cursor","pointer"),h.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),h=l.append("g"),t.actorCnt=P,t.links!=null&&h.attr("id","root-"+P));let s=lt(),E="actor";t.properties?.class?E=t.properties.class:s.fill="#eaeaea",r?E+=` ${ut}`:E+=` ${pt}`,s.x=t.x,s.y=i,s.width=t.width,s.height=t.height,s.class=E,s.name=t.name,s.x=t.x,s.y=i;let p=s.width/3,f=s.width/3,u=p/2,O=u/(2.5+p/50),b=h.append("g"),L=` - M ${s.x},${s.y+O} - a ${u},${O} 0 0 0 ${p},0 - a ${u},${O} 0 0 0 -${p},0 - l 0,${f-2*O} - a ${u},${O} 0 0 0 ${p},0 - l 0,-${f-2*O} -`;b.append("path").attr("d",L).attr("fill","#eaeaea").attr("stroke","#000").attr("stroke-width",1).attr("class",E),b.attr("transform",`translate(${p}, ${O})`),t.rectData=s,Tt(a,U(t.description))(t.description,h,s.x,s.y+35,s.width,s.height,{class:`actor ${Kt}`},a);let w=b.select("path:last-child");if(w.node()){let A=w.node().getBBox();t.height=A.height+(a.sequence.labelBoxHeight??0)}return t.height},"drawActorTypeDatabase"),Cr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+80,l=22,h=e.append("g").lower();r||(P++,h.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),t.actorCnt=P);let s=e.append("g"),E=xt;r?E+=` ${ut}`:E+=` ${pt}`,s.attr("class",E),s.attr("name",t.name);let p=lt();p.x=t.x,p.y=i,p.fill="#eaeaea",p.width=t.width,p.height=t.height,p.class="actor",s.append("line").attr("id","actor-man-torso"+P).attr("x1",t.x+t.width/2-l*2.5).attr("y1",i+12).attr("x2",t.x+t.width/2-15).attr("y2",i+12),s.append("line").attr("id","actor-man-arms"+P).attr("x1",t.x+t.width/2-l*2.5).attr("y1",i+2).attr("x2",t.x+t.width/2-l*2.5).attr("y2",i+22),s.append("circle").attr("cx",t.x+t.width/2).attr("cy",i+12).attr("r",l);let f=s.node().getBBox();return t.height=f.height+(a.sequence.labelBoxHeight??0),Tt(a,U(t.description))(t.description,s,p.x,p.y+15,p.width,p.height,{class:`actor ${xt}`},a),r?s.attr("transform",`translate(0,${l/2+10})`):s.attr("transform",`translate(0,${l/2+10})`),t.height},"drawActorTypeBoundary"),Mr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+80,l=e.append("g").lower();r||(P++,l.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),t.actorCnt=P);let h=e.append("g"),s=xt;r?s+=` ${ut}`:s+=` ${pt}`,h.attr("class",s),h.attr("name",t.name);let E=lt();E.x=t.x,E.y=i,E.fill="#eaeaea",E.width=t.width,E.height=t.height,E.class="actor",E.rx=3,E.ry=3,h.append("line").attr("id","actor-man-torso"+P).attr("x1",n).attr("y1",i+25).attr("x2",n).attr("y2",i+45),h.append("line").attr("id","actor-man-arms"+P).attr("x1",n-gt/2).attr("y1",i+33).attr("x2",n+gt/2).attr("y2",i+33),h.append("line").attr("x1",n-gt/2).attr("y1",i+60).attr("x2",n).attr("y2",i+45),h.append("line").attr("x1",n).attr("y1",i+45).attr("x2",n+gt/2-2).attr("y2",i+60);let p=h.append("circle");p.attr("cx",t.x+t.width/2),p.attr("cy",i+10),p.attr("r",15),p.attr("width",t.width),p.attr("height",t.height);let f=h.node().getBBox();return t.height=f.height,Tt(a,U(t.description))(t.description,h,E.x,E.y+35,E.width,E.height,{class:`actor ${xt}`},a),t.height},"drawActorTypeActor"),Br=_(function(e,t,a,r){return $(this,null,function*(){switch(t.type){case"actor":return yield Mr(e,t,a,r);case"participant":return yield Ar(e,t,a,r);case"boundary":return yield Cr(e,t,a,r);case"control":return yield kr(e,t,a,r);case"entity":return yield Dr(e,t,a,r);case"database":return yield vr(e,t,a,r);case"collections":return yield wr(e,t,a,r);case"queue":return yield Pr(e,t,a,r)}})},"drawActor"),Vr=_(function(e,t,a){let i=e.append("g");ir(i,t),t.name&&Tt(a)(t.name,i,t.x,t.y+a.boxTextMargin+(t.textMaxHeight||0)/2,t.width,0,{class:"text"},a),i.lower()},"drawBox"),Yr=_(function(e){return e.append("g")},"anchorElement"),Wr=_(function(e,t,a,r,i){let n=lt(),c=t.anchored;n.x=t.startx,n.y=t.starty,n.class="activation"+i%3,n.width=t.stopx-t.startx,n.height=a-t.starty,At(c,n)},"drawActivation"),Kr=_(function(e,t,a,r){return $(this,null,function*(){let{boxMargin:i,boxTextMargin:n,labelBoxHeight:c,labelBoxWidth:l,messageFontFamily:h,messageFontSize:s,messageFontWeight:E}=r,p=e.append("g"),f=_(function(b,L,w,A){return p.append("line").attr("x1",b).attr("y1",L).attr("x2",w).attr("y2",A).attr("class","loopLine")},"drawLoopLine");f(t.startx,t.starty,t.stopx,t.starty),f(t.stopx,t.starty,t.stopx,t.stopy),f(t.startx,t.stopy,t.stopx,t.stopy),f(t.startx,t.starty,t.startx,t.stopy),t.sections!==void 0&&t.sections.forEach(function(b){f(t.startx,b.y,t.stopx,b.y).style("stroke-dasharray","3, 3")});let u=Vt();u.text=a,u.x=t.startx,u.y=t.starty,u.fontFamily=h,u.fontSize=s,u.fontWeight=E,u.anchor="middle",u.valign="middle",u.tspan=!1,u.width=l||50,u.height=c||20,u.textMargin=n,u.class="labelText",sr(p,u),u=nr(),u.text=t.title,u.x=t.startx+l/2+(t.stopx-t.startx)/2,u.y=t.starty+i+n,u.anchor="middle",u.valign="middle",u.textMargin=n,u.class="loopText",u.fontFamily=h,u.fontSize=s,u.fontWeight=E,u.wrap=!0;let O=U(u.text)?yield Wt(p,u,t):yt(p,u);if(t.sectionTitles!==void 0){for(let[b,L]of Object.entries(t.sectionTitles))if(L.message){u.text=L.message,u.x=t.startx+(t.stopx-t.startx)/2,u.y=t.sections[b].y+i+n,u.class="loopText",u.anchor="middle",u.valign="middle",u.tspan=!1,u.fontFamily=h,u.fontSize=s,u.fontWeight=E,u.wrap=t.wrap,U(u.text)?(t.starty=t.sections[b].y,yield Wt(p,u,t)):yt(p,u);let w=Math.round(O.map(A=>(A._groups||A)[0][0].getBBox().height).reduce((A,k)=>A+k));t.sections[b].height+=w-(i+n)}}return t.height=Math.round(t.stopy-t.starty),p})},"drawLoop"),ir=_(function(e,t){je(e,t)},"drawBackgroundRect"),Fr=_(function(e){e.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),qr=_(function(e){e.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),Hr=_(function(e){e.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),zr=_(function(e){e.append("defs").append("marker").attr("id","arrowhead").attr("refX",7.9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto-start-reverse").append("path").attr("d","M -1 0 L 10 5 L 0 10 z")},"insertArrowHead"),Ur=_(function(e){e.append("defs").append("marker").attr("id","filled-head").attr("refX",15.5).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),Gr=_(function(e){e.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertSequenceNumber"),Xr=_(function(e){e.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",4.5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},"insertArrowCrossHead"),nr=_(function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},"getTextObj"),Jr=_(function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),Tt=(function(){function e(n,c,l,h,s,E,p){let f=c.append("text").attr("x",l+s/2).attr("y",h+E/2+5).style("text-anchor","middle").text(n);i(f,p)}_(e,"byText");function t(n,c,l,h,s,E,p,f){let{actorFontSize:u,actorFontFamily:O,actorFontWeight:b}=f,[L,w]=te(u),A=n.split(S.lineBreakRegex);for(let k=0;ke.height||0))+(this.loops.length===0?0:this.loops.map(e=>e.height||0).reduce((e,t)=>e+t))+(this.messages.length===0?0:this.messages.map(e=>e.height||0).reduce((e,t)=>e+t))+(this.notes.length===0?0:this.notes.map(e=>e.height||0).reduce((e,t)=>e+t))},"getHeight"),clear:_(function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},"clear"),addBox:_(function(e){this.boxes.push(e)},"addBox"),addActor:_(function(e){this.actors.push(e)},"addActor"),addLoop:_(function(e){this.loops.push(e)},"addLoop"),addMessage:_(function(e){this.messages.push(e)},"addMessage"),addNote:_(function(e){this.notes.push(e)},"addNote"),lastActor:_(function(){return this.actors[this.actors.length-1]},"lastActor"),lastLoop:_(function(){return this.loops[this.loops.length-1]},"lastLoop"),lastMessage:_(function(){return this.messages[this.messages.length-1]},"lastMessage"),lastNote:_(function(){return this.notes[this.notes.length-1]},"lastNote"),actors:[],boxes:[],loops:[],messages:[],notes:[]},init:_(function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,lr(j())},"init"),updateVal:_(function(e,t,a,r){e[t]===void 0?e[t]=a:e[t]=r(a,e[t])},"updateVal"),updateBounds:_(function(e,t,a,r){let i=this,n=0;function c(l){return _(function(s){n++;let E=i.sequenceItems.length-n+1;i.updateVal(s,"starty",t-E*d.boxMargin,Math.min),i.updateVal(s,"stopy",r+E*d.boxMargin,Math.max),i.updateVal(x.data,"startx",e-E*d.boxMargin,Math.min),i.updateVal(x.data,"stopx",a+E*d.boxMargin,Math.max),l!=="activation"&&(i.updateVal(s,"startx",e-E*d.boxMargin,Math.min),i.updateVal(s,"stopx",a+E*d.boxMargin,Math.max),i.updateVal(x.data,"starty",t-E*d.boxMargin,Math.min),i.updateVal(x.data,"stopy",r+E*d.boxMargin,Math.max))},"updateItemBounds")}_(c,"updateFn"),this.sequenceItems.forEach(c()),this.activations.forEach(c("activation"))},"updateBounds"),insert:_(function(e,t,a,r){let i=S.getMin(e,a),n=S.getMax(e,a),c=S.getMin(t,r),l=S.getMax(t,r);this.updateVal(x.data,"startx",i,Math.min),this.updateVal(x.data,"starty",c,Math.min),this.updateVal(x.data,"stopx",n,Math.max),this.updateVal(x.data,"stopy",l,Math.max),this.updateBounds(i,c,n,l)},"insert"),newActivation:_(function(e,t,a){let r=a.get(e.from),i=qt(e.from).length||0,n=r.x+r.width/2+(i-1)*d.activationWidth/2;this.activations.push({startx:n,starty:this.verticalPos+2,stopx:n+d.activationWidth,stopy:void 0,actor:e.from,anchored:Y.anchorElement(t)})},"newActivation"),endActivation:_(function(e){let t=this.activations.map(function(a){return a.actor}).lastIndexOf(e.from);return this.activations.splice(t,1)[0]},"endActivation"),createLoop:_(function(e={message:void 0,wrap:!1,width:void 0},t){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:e.message,wrap:e.wrap,width:e.width,height:0,fill:t}},"createLoop"),newLoop:_(function(e={message:void 0,wrap:!1,width:void 0},t){this.sequenceItems.push(this.createLoop(e,t))},"newLoop"),endLoop:_(function(){return this.sequenceItems.pop()},"endLoop"),isLoopOverlap:_(function(){return this.sequenceItems.length?this.sequenceItems[this.sequenceItems.length-1].overlap:!1},"isLoopOverlap"),addSectionToLoop:_(function(e){let t=this.sequenceItems.pop();t.sections=t.sections||[],t.sectionTitles=t.sectionTitles||[],t.sections.push({y:x.getVerticalPos(),height:0}),t.sectionTitles.push(e),this.sequenceItems.push(t)},"addSectionToLoop"),saveVerticalPos:_(function(){this.isLoopOverlap()&&(this.savedVerticalPos=this.verticalPos)},"saveVerticalPos"),resetVerticalPos:_(function(){this.isLoopOverlap()&&(this.verticalPos=this.savedVerticalPos)},"resetVerticalPos"),bumpVerticalPos:_(function(e){this.verticalPos=this.verticalPos+e,this.data.stopy=S.getMax(this.data.stopy,this.verticalPos)},"bumpVerticalPos"),getVerticalPos:_(function(){return this.verticalPos},"getVerticalPos"),getBounds:_(function(){return{bounds:this.data,models:this.models}},"getBounds")},es=_(function(e,t){return $(this,null,function*(){x.bumpVerticalPos(d.boxMargin),t.height=d.boxMargin,t.starty=x.getVerticalPos();let a=lt();a.x=t.startx,a.y=t.starty,a.width=t.width||d.width,a.class="note";let r=e.append("g"),i=Y.drawRect(r,a),n=Vt();n.x=t.startx,n.y=t.starty,n.width=a.width,n.dy="1em",n.text=t.message,n.class="noteText",n.fontFamily=d.noteFontFamily,n.fontSize=d.noteFontSize,n.fontWeight=d.noteFontWeight,n.anchor=d.noteAlign,n.textMargin=d.noteMargin,n.valign="center";let c=U(n.text)?yield Wt(r,n):yt(r,n),l=Math.round(c.map(h=>(h._groups||h)[0][0].getBBox().height).reduce((h,s)=>h+s));i.attr("height",l+2*d.noteMargin),t.height+=l+2*d.noteMargin,x.bumpVerticalPos(l+2*d.noteMargin),t.stopy=t.starty+l+2*d.noteMargin,t.stopx=t.startx+a.width,x.insert(t.startx,t.starty,t.stopx,t.stopy),x.models.addNote(t)})},"drawNote"),rs=_(function(e,t,a,r,i,n,c){let l=r.db.getActors(),h=l.get(t.from),s=l.get(t.to),E=a.sequenceVisible,p=h.x+h.width/2,f=s.x+s.width/2,u=p<=f,O=Er(t,r),b=e.append("g"),L=16.5,w=_((W,K)=>{let H=W?L:-L;return K?-H:H},"getCircleOffset"),A=_(W=>{b.append("circle").attr("cx",W).attr("cy",c).attr("r",5).attr("width",10).attr("height",10)},"drawCircle"),{CENTRAL_CONNECTION:k,CENTRAL_CONNECTION_REVERSE:D,CENTRAL_CONNECTION_DUAL:M}=r.db.LINETYPE;if(E)switch(t.centralConnection){case k:O&&(f+=w(u,!0));break;case D:O||(p+=w(u,!1));break;case M:O?f+=w(u,!0):p+=w(u,!1);break}switch(t.centralConnection){case k:A(f);break;case D:A(p);break;case M:A(p),A(f);break}},"drawCentralConnection"),It=_(e=>({fontFamily:e.messageFontFamily,fontSize:e.messageFontSize,fontWeight:e.messageFontWeight}),"messageFont"),Ot=_(e=>({fontFamily:e.noteFontFamily,fontSize:e.noteFontSize,fontWeight:e.noteFontWeight}),"noteFont"),re=_(e=>({fontFamily:e.actorFontFamily,fontSize:e.actorFontSize,fontWeight:e.actorFontWeight}),"actorFont");function or(e,t){return $(this,null,function*(){x.bumpVerticalPos(10);let{startx:a,stopx:r,message:i}=t,n=S.splitBreaks(i).length,c=U(i),l=c?yield Rt(i,j()):F.calculateTextDimensions(i,It(d));if(!c){let p=l.height/n;t.height+=p,x.bumpVerticalPos(p)}let h,s=l.height-10,E=l.width;if(a===r){h=x.getVerticalPos()+s,d.rightAngles||(s+=d.boxMargin,h=x.getVerticalPos()+s),s+=30;let p=S.getMax(E/2,d.width/2);x.insert(a-p,x.getVerticalPos()-10+s,r+p,x.getVerticalPos()+30+s)}else s+=d.boxMargin,h=x.getVerticalPos()+s,x.insert(a,h-10,r,h);return x.bumpVerticalPos(s),t.height+=s,t.stopy=t.starty+t.height,x.insert(t.fromBounds,t.starty,t.toBounds,t.stopy),h})}_(or,"boundMessage");var ss=_(function(e,t,a,r,i){return $(this,null,function*(){let{startx:n,stopx:c,starty:l,message:h,type:s,sequenceIndex:E,sequenceVisible:p}=t,f=F.calculateTextDimensions(h,It(d)),u=Vt();u.x=n,u.y=l+10,u.width=c-n,u.class="messageText",u.dy="1em",u.text=h,u.fontFamily=d.messageFontFamily,u.fontSize=d.messageFontSize,u.fontWeight=d.messageFontWeight,u.anchor=d.messageAlign,u.valign="center",u.textMargin=d.wrapPadding,u.tspan=!1,U(u.text)?yield Wt(e,u,{startx:n,stopx:c,starty:a}):yt(e,u);let O=f.width,b;if(n===c){let w=p||d.showSequenceNumbers,A=Er(i,r),k=ds(i,r),D=n+(w&&(A||k)?10:0);d.rightAngles?b=e.append("path").attr("d",`M ${D},${a} H ${n+S.getMax(d.width/2,O/2)} V ${a+25} H ${n}`):b=e.append("path").attr("d","M "+D+","+a+" C "+(D+60)+","+(a-10)+" "+(n+60)+","+(a+30)+" "+n+","+(a+20))}else b=e.append("line"),b.attr("x1",n),b.attr("y1",a),b.attr("x2",c),b.attr("y2",a),rr(i,r)&&rs(e,i,t,r,n,c,a);s===r.db.LINETYPE.DOTTED||s===r.db.LINETYPE.DOTTED_CROSS||s===r.db.LINETYPE.DOTTED_POINT||s===r.db.LINETYPE.DOTTED_OPEN||s===r.db.LINETYPE.BIDIRECTIONAL_DOTTED||s===r.db.LINETYPE.SOLID_TOP_DOTTED||s===r.db.LINETYPE.SOLID_BOTTOM_DOTTED||s===r.db.LINETYPE.STICK_TOP_DOTTED||s===r.db.LINETYPE.STICK_BOTTOM_DOTTED||s===r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED||s===r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED||s===r.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED||s===r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED?(b.style("stroke-dasharray","3, 3"),b.attr("class","messageLine1")):b.attr("class","messageLine0");let L="";if(d.arrowMarkerAbsolute&&(L=We(!0)),b.attr("stroke-width",2),b.attr("stroke","none"),b.style("fill","none"),(s===r.db.LINETYPE.SOLID_TOP||s===r.db.LINETYPE.SOLID_TOP_DOTTED)&&b.attr("marker-end","url("+L+"#solidTopArrowHead)"),(s===r.db.LINETYPE.SOLID_BOTTOM||s===r.db.LINETYPE.SOLID_BOTTOM_DOTTED)&&b.attr("marker-end","url("+L+"#solidBottomArrowHead)"),(s===r.db.LINETYPE.STICK_TOP||s===r.db.LINETYPE.STICK_TOP_DOTTED)&&b.attr("marker-end","url("+L+"#stickTopArrowHead)"),(s===r.db.LINETYPE.STICK_BOTTOM||s===r.db.LINETYPE.STICK_BOTTOM_DOTTED)&&b.attr("marker-end","url("+L+"#stickBottomArrowHead)"),(s===r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE||s===r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED)&&b.attr("marker-start","url("+L+"#solidBottomArrowHead)"),(s===r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE||s===r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED)&&b.attr("marker-start","url("+L+"#solidTopArrowHead)"),(s===r.db.LINETYPE.STICK_ARROW_TOP_REVERSE||s===r.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED)&&b.attr("marker-start","url("+L+"#stickBottomArrowHead)"),(s===r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE||s===r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED)&&b.attr("marker-start","url("+L+"#stickTopArrowHead)"),(s===r.db.LINETYPE.SOLID||s===r.db.LINETYPE.DOTTED)&&b.attr("marker-end","url("+L+"#arrowhead)"),(s===r.db.LINETYPE.BIDIRECTIONAL_SOLID||s===r.db.LINETYPE.BIDIRECTIONAL_DOTTED)&&(b.attr("marker-start","url("+L+"#arrowhead)"),b.attr("marker-end","url("+L+"#arrowhead)")),(s===r.db.LINETYPE.SOLID_POINT||s===r.db.LINETYPE.DOTTED_POINT)&&b.attr("marker-end","url("+L+"#filled-head)"),(s===r.db.LINETYPE.SOLID_CROSS||s===r.db.LINETYPE.DOTTED_CROSS)&&b.attr("marker-end","url("+L+"#crosshead)"),p||d.showSequenceNumbers){let w=s===r.db.LINETYPE.BIDIRECTIONAL_SOLID||s===r.db.LINETYPE.BIDIRECTIONAL_DOTTED,A=s===r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE||s===r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED||s===r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE||s===r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED||s===r.db.LINETYPE.STICK_ARROW_TOP_REVERSE||s===r.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED||s===r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE||s===r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED,k=6,D=rr(i,r),M=n,W=c;w?(nn?W=c-2*k:(W=c-k,M+=i?.centralConnection===r.db.LINETYPE.CENTRAL_CONNECTION_DUAL||i?.centralConnection===r.db.LINETYPE.CENTRAL_CONNECTION_REVERSE?-7.5:0),W+=D?15:0,b.attr("x2",W),b.attr("x1",M)):b.attr("x1",n+k);let K=0,H=n===c,G=n<=c;H?K=t.fromBounds+1:A?K=G?t.toBounds-1:t.fromBounds+1:K=G?t.fromBounds+1:t.toBounds-1,e.append("line").attr("x1",K).attr("y1",a).attr("x2",K).attr("y2",a).attr("stroke-width",0).attr("marker-start","url("+L+"#sequencenumber)"),e.append("text").attr("x",K).attr("y",a+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(E)}})},"drawMessage"),as=_(function(e,t,a,r,i,n,c){let l=0,h=0,s,E=0;for(let p of r){let f=t.get(p),u=f.box;s&&s!=u&&(c||x.models.addBox(s),h+=d.boxMargin+s.margin),u&&u!=s&&(c||(u.x=l+h,u.y=i),h+=u.margin),f.width=f.width||d.width,f.height=S.getMax(f.height||d.height,d.height),f.margin=f.margin||d.actorMargin,E=S.getMax(E,f.height),a.get(f.name)&&(h+=f.width/2),f.x=l+h,f.starty=x.getVerticalPos(),x.insert(f.x,i,f.x+f.width,f.height),l+=f.width+h,f.box&&(f.box.width=l+u.margin-f.box.x),h=f.margin,s=f.box,x.models.addActor(f)}s&&!c&&x.models.addBox(s),x.bumpVerticalPos(E)},"addActorRenderingData"),se=_(function(e,t,a,r){return $(this,null,function*(){if(r){let i=0;x.bumpVerticalPos(d.boxMargin*2);for(let n of a){let c=t.get(n);c.stopy||(c.stopy=x.getVerticalPos());let l=yield Y.drawActor(e,c,d,!0);i=S.getMax(i,l)}x.bumpVerticalPos(i+d.boxMargin)}else for(let i of a){let n=t.get(i);yield Y.drawActor(e,n,d,!1)}})},"drawActors"),cr=_(function(e,t,a,r){let i=0,n=0;for(let c of a){let l=t.get(c),h=ns(l),s=Y.drawPopup(e,l,h,d,d.forceMenus,r);s.height>i&&(i=s.height),s.width+l.x>n&&(n=s.width+l.x)}return{maxHeight:i,maxWidth:n}},"drawActorsPopup"),lr=_(function(e){Ye(d,e),e.fontFamily&&(d.actorFontFamily=d.noteFontFamily=d.messageFontFamily=e.fontFamily),e.fontSize&&(d.actorFontSize=d.noteFontSize=d.messageFontSize=e.fontSize),e.fontWeight&&(d.actorFontWeight=d.noteFontWeight=d.messageFontWeight=e.fontWeight)},"setConf"),qt=_(function(e){return x.activations.filter(function(t){return t.actor===e})},"actorActivations"),er=_(function(e,t){let a=t.get(e),r=qt(e),i=r.reduce(function(c,l){return S.getMin(c,l.startx)},a.x+a.width/2-1),n=r.reduce(function(c,l){return S.getMax(c,l.stopx)},a.x+a.width/2+1);return[i,n]},"activationBounds");function ht(e,t,a,r,i){x.bumpVerticalPos(a);let n=r;if(t.id&&t.message&&e[t.id]){let c=e[t.id].width,l=It(d);t.message=F.wrapLabel(`[${t.message}]`,c-2*d.wrapPadding,l),t.width=c,t.wrap=!0;let h=F.calculateTextDimensions(t.message,l),s=S.getMax(h.height,d.labelBoxHeight);n=r+s,Q.debug(`${s} - ${t.message}`)}i(t),x.bumpVerticalPos(n)}_(ht,"adjustLoopHeightForWrap");function hr(e,t,a,r,i,n,c){function l(E,p){E.x{R.add(I.from),R.add(I.to)}),O=O.filter(I=>R.has(I))}as(s,E,p,O,0,b,!1);let D=yield Es(b,E,k,r);Y.insertArrowHead(s),Y.insertArrowCrossHead(s),Y.insertArrowFilledHead(s),Y.insertSequenceNumber(s),Y.insertSolidTopArrowHead(s),Y.insertSolidBottomArrowHead(s),Y.insertStickTopArrowHead(s),Y.insertStickBottomArrowHead(s);function M(R,I){let ot=x.endActivation(R);ot.starty+18>I&&(ot.starty=I-6,I+=12),Y.drawActivation(s,ot,I,d,qt(R.from).length),x.insert(ot.startx,I-10,ot.stopx,I)}_(M,"activeEnd");let W=1,K=1,H=[],G=[],X=0;for(let R of b){let I,ot,ct;switch(R.type){case r.db.LINETYPE.NOTE:x.resetVerticalPos(),ot=R.noteModel,yield es(s,ot);break;case r.db.LINETYPE.ACTIVE_START:x.newActivation(R,s,E);break;case r.db.LINETYPE.CENTRAL_CONNECTION:x.newActivation(R,s,E);break;case r.db.LINETYPE.CENTRAL_CONNECTION_REVERSE:x.newActivation(R,s,E);break;case r.db.LINETYPE.ACTIVE_END:M(R,x.getVerticalPos());break;case r.db.LINETYPE.LOOP_START:ht(D,R,d.boxMargin,d.boxMargin+d.boxTextMargin,C=>x.newLoop(C));break;case r.db.LINETYPE.LOOP_END:I=x.endLoop(),yield Y.drawLoop(s,I,"loop",d),x.bumpVerticalPos(I.stopy-x.getVerticalPos()),x.models.addLoop(I);break;case r.db.LINETYPE.RECT_START:ht(D,R,d.boxMargin,d.boxMargin,C=>x.newLoop(void 0,C.message));break;case r.db.LINETYPE.RECT_END:I=x.endLoop(),G.push(I),x.models.addLoop(I),x.bumpVerticalPos(I.stopy-x.getVerticalPos());break;case r.db.LINETYPE.OPT_START:ht(D,R,d.boxMargin,d.boxMargin+d.boxTextMargin,C=>x.newLoop(C));break;case r.db.LINETYPE.OPT_END:I=x.endLoop(),yield Y.drawLoop(s,I,"opt",d),x.bumpVerticalPos(I.stopy-x.getVerticalPos()),x.models.addLoop(I);break;case r.db.LINETYPE.ALT_START:ht(D,R,d.boxMargin,d.boxMargin+d.boxTextMargin,C=>x.newLoop(C));break;case r.db.LINETYPE.ALT_ELSE:ht(D,R,d.boxMargin+d.boxTextMargin,d.boxMargin,C=>x.addSectionToLoop(C));break;case r.db.LINETYPE.ALT_END:I=x.endLoop(),yield Y.drawLoop(s,I,"alt",d),x.bumpVerticalPos(I.stopy-x.getVerticalPos()),x.models.addLoop(I);break;case r.db.LINETYPE.PAR_START:case r.db.LINETYPE.PAR_OVER_START:ht(D,R,d.boxMargin,d.boxMargin+d.boxTextMargin,C=>x.newLoop(C)),x.saveVerticalPos();break;case r.db.LINETYPE.PAR_AND:ht(D,R,d.boxMargin+d.boxTextMargin,d.boxMargin,C=>x.addSectionToLoop(C));break;case r.db.LINETYPE.PAR_END:I=x.endLoop(),yield Y.drawLoop(s,I,"par",d),x.bumpVerticalPos(I.stopy-x.getVerticalPos()),x.models.addLoop(I);break;case r.db.LINETYPE.AUTONUMBER:W=R.message.start||W,K=R.message.step||K,R.message.visible?r.db.enableSequenceNumbers():r.db.disableSequenceNumbers();break;case r.db.LINETYPE.CRITICAL_START:ht(D,R,d.boxMargin,d.boxMargin+d.boxTextMargin,C=>x.newLoop(C));break;case r.db.LINETYPE.CRITICAL_OPTION:ht(D,R,d.boxMargin+d.boxTextMargin,d.boxMargin,C=>x.addSectionToLoop(C));break;case r.db.LINETYPE.CRITICAL_END:I=x.endLoop(),yield Y.drawLoop(s,I,"critical",d),x.bumpVerticalPos(I.stopy-x.getVerticalPos()),x.models.addLoop(I);break;case r.db.LINETYPE.BREAK_START:ht(D,R,d.boxMargin,d.boxMargin+d.boxTextMargin,C=>x.newLoop(C));break;case r.db.LINETYPE.BREAK_END:I=x.endLoop(),yield Y.drawLoop(s,I,"break",d),x.bumpVerticalPos(I.stopy-x.getVerticalPos()),x.models.addLoop(I);break;default:try{ct=R.msgModel,ct.starty=x.getVerticalPos(),ct.sequenceIndex=W,ct.sequenceVisible=r.db.showSequenceNumbers();let C=yield or(s,ct);hr(R,ct,C,X,E,p,f),H.push({messageModel:ct,lineStartY:C,msg:R}),x.models.addMessage(ct)}catch(C){Q.error("error while drawing message",C)}}[r.db.LINETYPE.SOLID_OPEN,r.db.LINETYPE.DOTTED_OPEN,r.db.LINETYPE.SOLID,r.db.LINETYPE.SOLID_TOP,r.db.LINETYPE.SOLID_BOTTOM,r.db.LINETYPE.STICK_TOP,r.db.LINETYPE.STICK_BOTTOM,r.db.LINETYPE.SOLID_TOP_DOTTED,r.db.LINETYPE.SOLID_BOTTOM_DOTTED,r.db.LINETYPE.STICK_TOP_DOTTED,r.db.LINETYPE.STICK_BOTTOM_DOTTED,r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE,r.db.LINETYPE.STICK_ARROW_TOP_REVERSE,r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE,r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,r.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED,r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED,r.db.LINETYPE.DOTTED,r.db.LINETYPE.SOLID_CROSS,r.db.LINETYPE.DOTTED_CROSS,r.db.LINETYPE.SOLID_POINT,r.db.LINETYPE.DOTTED_POINT,r.db.LINETYPE.BIDIRECTIONAL_SOLID,r.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(R.type)&&(W=W+K),X++}Q.debug("createdActors",p),Q.debug("destroyedActors",f),yield se(s,E,O,!1);for(let R of H)yield ss(s,R.messageModel,R.lineStartY,r,R.msg);d.mirrorActors&&(yield se(s,E,O,!0)),G.forEach(R=>Y.drawBackgroundRect(s,R)),ar(s,E,O,d);for(let R of x.models.boxes){R.height=x.getVerticalPos()-R.y,x.insert(R.x,R.y,R.x+R.width,R.height);let I=d.boxMargin*2;R.startx=R.x-I,R.starty=R.y-I*.25,R.stopx=R.startx+R.width+2*I,R.stopy=R.starty+R.height+I*.75,R.stroke="rgb(0,0,0, 0.5)",Y.drawBox(s,R,d)}w&&x.bumpVerticalPos(d.boxMargin);let z=cr(s,E,O,h),{bounds:v}=x.getBounds();v.startx===void 0&&(v.startx=0),v.starty===void 0&&(v.starty=0),v.stopx===void 0&&(v.stopx=0),v.stopy===void 0&&(v.stopy=0);let tt=v.stopy-v.starty;tt{let c=It(d),l=n.actorKeys.reduce((p,f)=>p+=e.get(f).width+(e.get(f).margin||0),0),h=d.boxMargin*8;l+=h,l-=2*d.boxTextMargin,n.wrap&&(n.name=F.wrapLabel(n.name,l-2*d.wrapPadding,c));let s=F.calculateTextDimensions(n.name,c);i=S.getMax(s.height,i);let E=S.getMax(l,s.width+2*d.wrapPadding);if(n.margin=d.boxTextMargin,ln.textMaxHeight=i),S.getMax(r,d.height)})}_(Tr,"calculateActorMargins");var os=_(function(e,t,a){return $(this,null,function*(){let r=t.get(e.from),i=t.get(e.to),n=r.x,c=i.x,l=e.wrap&&e.message,h=U(e.message)?yield Rt(e.message,j()):F.calculateTextDimensions(l?F.wrapLabel(e.message,d.width,Ot(d)):e.message,Ot(d)),s={width:l?d.width:S.getMax(d.width,h.width+2*d.noteMargin),height:0,startx:r.x,stopx:0,starty:0,stopy:0,message:e.message};return e.placement===a.db.PLACEMENT.RIGHTOF?(s.width=l?S.getMax(d.width,h.width):S.getMax(r.width/2+i.width/2,h.width+2*d.noteMargin),s.startx=n+(r.width+d.actorMargin)/2):e.placement===a.db.PLACEMENT.LEFTOF?(s.width=l?S.getMax(d.width,h.width+2*d.noteMargin):S.getMax(r.width/2+i.width/2,h.width+2*d.noteMargin),s.startx=n-s.width+(r.width-d.actorMargin)/2):e.to===e.from?(h=F.calculateTextDimensions(l?F.wrapLabel(e.message,S.getMax(d.width,r.width),Ot(d)):e.message,Ot(d)),s.width=l?S.getMax(d.width,r.width):S.getMax(r.width,d.width,h.width+2*d.noteMargin),s.startx=n+(r.width-s.width)/2):(s.width=Math.abs(n+r.width/2-(c+i.width/2))+d.actorMargin,s.startx=n2,p=_(b=>l?-b:b,"adjustValue");e.from===e.to?s=h:(e.activate&&!E&&(s+=p(d.activationWidth/2-1)),[a.db.LINETYPE.SOLID_OPEN,a.db.LINETYPE.DOTTED_OPEN,a.db.LINETYPE.STICK_TOP,a.db.LINETYPE.STICK_BOTTOM,a.db.LINETYPE.STICK_TOP_DOTTED,a.db.LINETYPE.STICK_BOTTOM_DOTTED,a.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,a.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,a.db.LINETYPE.STICK_ARROW_TOP_REVERSE,a.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE,a.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED,a.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED,a.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,a.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE].includes(e.type)||(s+=p(3)),[a.db.LINETYPE.BIDIRECTIONAL_SOLID,a.db.LINETYPE.BIDIRECTIONAL_DOTTED,a.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,a.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,a.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,a.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE].includes(e.type)&&(h-=p(3)));let f=[r,i,n,c],u=Math.abs(h-s);e.wrap&&e.message&&(e.message=F.wrapLabel(e.message,S.getMax(u+2*d.wrapPadding,d.width),It(d)));let O=F.calculateTextDimensions(e.message,It(d));return{width:S.getMax(e.wrap?0:O.width+2*d.wrapPadding,u+2*d.wrapPadding,d.width),height:0,startx:h,stopx:s,starty:0,stopy:0,message:e.message,type:e.type,wrap:e.wrap,fromBounds:Math.min.apply(null,f),toBounds:Math.max.apply(null,f)}},"buildMessageModel"),Es=_(function(e,t,a,r){return $(this,null,function*(){let i={},n=[],c,l,h;for(let s of e){switch(s.type){case r.db.LINETYPE.LOOP_START:case r.db.LINETYPE.ALT_START:case r.db.LINETYPE.OPT_START:case r.db.LINETYPE.PAR_START:case r.db.LINETYPE.PAR_OVER_START:case r.db.LINETYPE.CRITICAL_START:case r.db.LINETYPE.BREAK_START:n.push({id:s.id,msg:s.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case r.db.LINETYPE.ALT_ELSE:case r.db.LINETYPE.PAR_AND:case r.db.LINETYPE.CRITICAL_OPTION:s.message&&(c=n.pop(),i[c.id]=c,i[s.id]=c,n.push(c));break;case r.db.LINETYPE.LOOP_END:case r.db.LINETYPE.ALT_END:case r.db.LINETYPE.OPT_END:case r.db.LINETYPE.PAR_END:case r.db.LINETYPE.CRITICAL_END:case r.db.LINETYPE.BREAK_END:c=n.pop(),i[c.id]=c;break;case r.db.LINETYPE.ACTIVE_START:{let p=t.get(s.from?s.from:s.to.actor),f=qt(s.from?s.from:s.to.actor).length,u=p.x+p.width/2+(f-1)*d.activationWidth/2,O={startx:u,stopx:u+d.activationWidth,actor:s.from,enabled:!0};x.activations.push(O)}break;case r.db.LINETYPE.ACTIVE_END:{let p=x.activations.map(f=>f.actor).lastIndexOf(s.from);x.activations.splice(p,1).splice(0,1)}break}s.placement!==void 0?(l=yield os(s,t,r),s.noteModel=l,n.forEach(p=>{c=p,c.from=S.getMin(c.from,l.startx),c.to=S.getMax(c.to,l.startx+l.width),c.width=S.getMax(c.width,Math.abs(c.from-c.to))-d.labelBoxWidth})):(h=Ts(s,t,r),s.msgModel=h,h.startx&&h.stopx&&n.length>0&&n.forEach(p=>{if(c=p,h.startx===h.stopx){let f=t.get(s.from),u=t.get(s.to);c.from=S.getMin(f.x-h.width/2,f.x-f.width/2,c.from),c.to=S.getMax(u.x+h.width/2,u.x+f.width/2,c.to),c.width=S.getMax(c.width,Math.abs(c.to-c.from))-d.labelBoxWidth}else c.from=S.getMin(h.startx,c.from),c.to=S.getMax(h.stopx,c.to),c.width=S.getMax(c.width,h.width)-d.labelBoxWidth}))}return x.activations=[],Q.debug("Loop type widths:",i),i})},"calculateLoopBounds"),ps={bounds:x,drawActors:se,drawActorsPopup:cr,setConf:lr,draw:is},Os={parser:br,get db(){return new Lr},renderer:ps,styles:mr,init:_(e=>{e.sequence||(e.sequence={}),e.wrap&&(e.sequence.wrap=e.wrap,Xe({sequence:{wrap:e.wrap}}))},"init")};export{Os as diagram}; diff --git a/src/google/adk/cli/browser/chunk-T3Q3QCCV.js b/src/google/adk/cli/browser/chunk-T3Q3QCCV.js deleted file mode 100644 index 3b26d9edf3..0000000000 --- a/src/google/adk/cli/browser/chunk-T3Q3QCCV.js +++ /dev/null @@ -1,3 +0,0 @@ -import{f as t}from"./chunk-NALL4A3P.js";import{j as i}from"./chunk-RMXJBC7V.js";var o={},m={info:t(()=>i(null,null,function*(){let{createInfoServices:e}=yield import("./chunk-DIR2LWLP.js"),r=e().Info.parser.LangiumParser;o.info=r}),"info"),packet:t(()=>i(null,null,function*(){let{createPacketServices:e}=yield import("./chunk-SMT27N2F.js"),r=e().Packet.parser.LangiumParser;o.packet=r}),"packet"),pie:t(()=>i(null,null,function*(){let{createPieServices:e}=yield import("./chunk-HDC4PFPG.js"),r=e().Pie.parser.LangiumParser;o.pie=r}),"pie"),architecture:t(()=>i(null,null,function*(){let{createArchitectureServices:e}=yield import("./chunk-IHY23QJP.js"),r=e().Architecture.parser.LangiumParser;o.architecture=r}),"architecture"),gitGraph:t(()=>i(null,null,function*(){let{createGitGraphServices:e}=yield import("./chunk-XE4A3JWW.js"),r=e().GitGraph.parser.LangiumParser;o.gitGraph=r}),"gitGraph"),radar:t(()=>i(null,null,function*(){let{createRadarServices:e}=yield import("./chunk-FDH623K7.js"),r=e().Radar.parser.LangiumParser;o.radar=r}),"radar"),treemap:t(()=>i(null,null,function*(){let{createTreemapServices:e}=yield import("./chunk-7UW26RYS.js"),r=e().Treemap.parser.LangiumParser;o.treemap=r}),"treemap")};function p(e,r){return i(this,null,function*(){let c=m[e];if(!c)throw new Error(`Unknown diagram type: ${e}`);o[e]||(yield c());let s=o[e].parse(r);if(s.lexerErrors.length>0||s.parserErrors.length>0)throw new u(s);return s.value})}t(p,"parse");var u=class extends Error{constructor(e){let r=e.lexerErrors.map(a=>{let s=a.line!==void 0&&!isNaN(a.line)?a.line:"?",n=a.column!==void 0&&!isNaN(a.column)?a.column:"?";return`Lexer error on line ${s}, column ${n}: ${a.message}`}).join(` -`),c=e.parserErrors.map(a=>{let s=a.token.startLine!==void 0&&!isNaN(a.token.startLine)?a.token.startLine:"?",n=a.token.startColumn!==void 0&&!isNaN(a.token.startColumn)?a.token.startColumn:"?";return`Parse error on line ${s}, column ${n}: ${a.message}`}).join(` -`);super(`Parsing failed: ${r} ${c}`),this.result=e}static{t(this,"MermaidParseError")}};export{p as a}; diff --git a/src/google/adk/cli/browser/chunk-TIJO3EOA.js b/src/google/adk/cli/browser/chunk-TIJO3EOA.js deleted file mode 100644 index 3e13a70239..0000000000 --- a/src/google/adk/cli/browser/chunk-TIJO3EOA.js +++ /dev/null @@ -1,189 +0,0 @@ -import{a as lt}from"./chunk-B2DSW4QB.js";import{h as ut}from"./chunk-NMKTPNXE.js";import{a as ot}from"./chunk-APNCZOFE.js";import{a as ct}from"./chunk-ST54LLJ3.js";import{b as rt,c as nt}from"./chunk-F57TI45K.js";import{m as pe,p as at}from"./chunk-WBLSVR3V.js";import{G as qe,I as M,M as L,R as Je,S as Ze,T as $e,U as et,V as tt,W as st,X as it,Y as D,g as He}from"./chunk-QFMJV7VH.js";import{a as Z,g as d,i as he}from"./chunk-JRNAXTJ7.js";import{a as We,b as je,j as Xe}from"./chunk-RMXJBC7V.js";var we=(function(){var e=d(function(I,l,o,p){for(o=o||{},p=I.length;p--;o[I[p]]=l);return o},"o"),i=[1,18],n=[1,19],u=[1,20],a=[1,41],c=[1,42],f=[1,26],b=[1,24],F=[1,25],T=[1,32],O=[1,33],Ae=[1,34],k=[1,45],be=[1,35],fe=[1,36],ke=[1,37],ge=[1,38],me=[1,27],Ce=[1,28],Ee=[1,29],ye=[1,30],Te=[1,31],g=[1,44],m=[1,46],C=[1,43],E=[1,47],De=[1,9],h=[1,8,9],$=[1,58],ee=[1,59],te=[1,60],se=[1,61],ie=[1,62],Fe=[1,63],Be=[1,64],v=[1,8,9,41],Ve=[1,76],R=[1,8,9,12,13,22,39,41,44,68,69,70,71,72,73,74,79,81],ae=[1,8,9,12,13,18,20,22,39,41,44,50,60,68,69,70,71,72,73,74,79,81,86,100,102,103],re=[13,60,86,100,102,103],U=[13,60,73,74,86,100,102,103],Me=[13,60,68,69,70,71,72,86,100,102,103],_e=[1,101],z=[1,118],Y=[1,114],K=[1,110],Q=[1,116],W=[1,111],j=[1,112],X=[1,113],H=[1,115],q=[1,117],Pe=[22,48,60,61,82,86,87,88,89,90],Se=[1,8,9,39,41,44],ne=[1,8,9,22],Re=[1,147],Ge=[1,8,9,61],N=[1,8,9,22,48,60,61,82,86,87,88,89,90],Ne={trace:d(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statements:5,graphConfig:6,CLASS_DIAGRAM:7,NEWLINE:8,EOF:9,statement:10,classLabel:11,SQS:12,STR:13,SQE:14,namespaceName:15,alphaNumToken:16,classLiteralName:17,DOT:18,className:19,GENERICTYPE:20,relationStatement:21,LABEL:22,namespaceStatement:23,classStatement:24,memberStatement:25,annotationStatement:26,clickStatement:27,styleStatement:28,cssClassStatement:29,noteStatement:30,classDefStatement:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,namespaceIdentifier:38,STRUCT_START:39,classStatements:40,STRUCT_STOP:41,NAMESPACE:42,classIdentifier:43,STYLE_SEPARATOR:44,members:45,CLASS:46,emptyBody:47,SPACE:48,ANNOTATION_START:49,ANNOTATION_END:50,MEMBER:51,SEPARATOR:52,relation:53,NOTE_FOR:54,noteText:55,NOTE:56,CLASSDEF:57,classList:58,stylesOpt:59,ALPHA:60,COMMA:61,direction_tb:62,direction_bt:63,direction_rl:64,direction_lr:65,relationType:66,lineType:67,AGGREGATION:68,EXTENSION:69,COMPOSITION:70,DEPENDENCY:71,LOLLIPOP:72,LINE:73,DOTTED_LINE:74,CALLBACK:75,LINK:76,LINK_TARGET:77,CLICK:78,CALLBACK_NAME:79,CALLBACK_ARGS:80,HREF:81,STYLE:82,CSSCLASS:83,style:84,styleComponent:85,NUM:86,COLON:87,UNIT:88,BRKT:89,PCT:90,commentToken:91,textToken:92,graphCodeTokens:93,textNoTagsToken:94,TAGSTART:95,TAGEND:96,"==":97,"--":98,DEFAULT:99,MINUS:100,keywords:101,UNICODE_TEXT:102,BQUOTE_STR:103,$accept:0,$end:1},terminals_:{2:"error",7:"CLASS_DIAGRAM",8:"NEWLINE",9:"EOF",12:"SQS",13:"STR",14:"SQE",18:"DOT",20:"GENERICTYPE",22:"LABEL",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",39:"STRUCT_START",41:"STRUCT_STOP",42:"NAMESPACE",44:"STYLE_SEPARATOR",46:"CLASS",48:"SPACE",49:"ANNOTATION_START",50:"ANNOTATION_END",51:"MEMBER",52:"SEPARATOR",54:"NOTE_FOR",56:"NOTE",57:"CLASSDEF",60:"ALPHA",61:"COMMA",62:"direction_tb",63:"direction_bt",64:"direction_rl",65:"direction_lr",68:"AGGREGATION",69:"EXTENSION",70:"COMPOSITION",71:"DEPENDENCY",72:"LOLLIPOP",73:"LINE",74:"DOTTED_LINE",75:"CALLBACK",76:"LINK",77:"LINK_TARGET",78:"CLICK",79:"CALLBACK_NAME",80:"CALLBACK_ARGS",81:"HREF",82:"STYLE",83:"CSSCLASS",86:"NUM",87:"COLON",88:"UNIT",89:"BRKT",90:"PCT",93:"graphCodeTokens",95:"TAGSTART",96:"TAGEND",97:"==",98:"--",99:"DEFAULT",100:"MINUS",101:"keywords",102:"UNICODE_TEXT",103:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,1],[15,3],[15,2],[19,1],[19,3],[19,1],[19,2],[19,2],[19,2],[10,1],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[23,4],[23,5],[38,2],[40,1],[40,2],[40,3],[40,1],[40,2],[40,3],[24,1],[24,3],[24,4],[24,3],[24,6],[43,2],[43,3],[47,0],[47,2],[47,2],[26,4],[45,1],[45,2],[25,1],[25,2],[25,1],[25,1],[21,3],[21,4],[21,4],[21,5],[30,3],[30,2],[31,3],[58,1],[58,3],[32,1],[32,1],[32,1],[32,1],[53,3],[53,2],[53,2],[53,1],[66,1],[66,1],[66,1],[66,1],[66,1],[67,1],[67,1],[27,3],[27,4],[27,3],[27,4],[27,4],[27,5],[27,3],[27,4],[27,4],[27,5],[27,4],[27,5],[27,5],[27,6],[28,3],[29,3],[59,1],[59,3],[84,1],[84,2],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[91,1],[91,1],[92,1],[92,1],[92,1],[92,1],[92,1],[92,1],[92,1],[94,1],[94,1],[94,1],[94,1],[16,1],[16,1],[16,1],[16,1],[17,1],[55,1]],performAction:d(function(l,o,p,r,A,t,J){var s=t.length-1;switch(A){case 8:this.$=t[s-1];break;case 9:case 10:case 13:case 15:this.$=t[s];break;case 11:case 14:this.$=t[s-2]+"."+t[s];break;case 12:case 16:this.$=t[s-1]+t[s];break;case 17:case 18:this.$=t[s-1]+"~"+t[s]+"~";break;case 19:r.addRelation(t[s]);break;case 20:t[s-1].title=r.cleanupLabel(t[s]),r.addRelation(t[s-1]);break;case 31:this.$=t[s].trim(),r.setAccTitle(this.$);break;case 32:case 33:this.$=t[s].trim(),r.setAccDescription(this.$);break;case 34:r.addClassesToNamespace(t[s-3],t[s-1][0],t[s-1][1]);break;case 35:r.addClassesToNamespace(t[s-4],t[s-1][0],t[s-1][1]);break;case 36:this.$=t[s],r.addNamespace(t[s]);break;case 37:this.$=[[t[s]],[]];break;case 38:this.$=[[t[s-1]],[]];break;case 39:t[s][0].unshift(t[s-2]),this.$=t[s];break;case 40:this.$=[[],[t[s]]];break;case 41:this.$=[[],[t[s-1]]];break;case 42:t[s][1].unshift(t[s-2]),this.$=t[s];break;case 44:r.setCssClass(t[s-2],t[s]);break;case 45:r.addMembers(t[s-3],t[s-1]);break;case 47:r.setCssClass(t[s-5],t[s-3]),r.addMembers(t[s-5],t[s-1]);break;case 48:this.$=t[s],r.addClass(t[s]);break;case 49:this.$=t[s-1],r.addClass(t[s-1]),r.setClassLabel(t[s-1],t[s]);break;case 53:r.addAnnotation(t[s],t[s-2]);break;case 54:case 67:this.$=[t[s]];break;case 55:t[s].push(t[s-1]),this.$=t[s];break;case 56:break;case 57:r.addMember(t[s-1],r.cleanupLabel(t[s]));break;case 58:break;case 59:break;case 60:this.$={id1:t[s-2],id2:t[s],relation:t[s-1],relationTitle1:"none",relationTitle2:"none"};break;case 61:this.$={id1:t[s-3],id2:t[s],relation:t[s-1],relationTitle1:t[s-2],relationTitle2:"none"};break;case 62:this.$={id1:t[s-3],id2:t[s],relation:t[s-2],relationTitle1:"none",relationTitle2:t[s-1]};break;case 63:this.$={id1:t[s-4],id2:t[s],relation:t[s-2],relationTitle1:t[s-3],relationTitle2:t[s-1]};break;case 64:this.$=r.addNote(t[s],t[s-1]);break;case 65:this.$=r.addNote(t[s]);break;case 66:this.$=t[s-2],r.defineClass(t[s-1],t[s]);break;case 68:this.$=t[s-2].concat([t[s]]);break;case 69:r.setDirection("TB");break;case 70:r.setDirection("BT");break;case 71:r.setDirection("RL");break;case 72:r.setDirection("LR");break;case 73:this.$={type1:t[s-2],type2:t[s],lineType:t[s-1]};break;case 74:this.$={type1:"none",type2:t[s],lineType:t[s-1]};break;case 75:this.$={type1:t[s-1],type2:"none",lineType:t[s]};break;case 76:this.$={type1:"none",type2:"none",lineType:t[s]};break;case 77:this.$=r.relationType.AGGREGATION;break;case 78:this.$=r.relationType.EXTENSION;break;case 79:this.$=r.relationType.COMPOSITION;break;case 80:this.$=r.relationType.DEPENDENCY;break;case 81:this.$=r.relationType.LOLLIPOP;break;case 82:this.$=r.lineType.LINE;break;case 83:this.$=r.lineType.DOTTED_LINE;break;case 84:case 90:this.$=t[s-2],r.setClickEvent(t[s-1],t[s]);break;case 85:case 91:this.$=t[s-3],r.setClickEvent(t[s-2],t[s-1]),r.setTooltip(t[s-2],t[s]);break;case 86:this.$=t[s-2],r.setLink(t[s-1],t[s]);break;case 87:this.$=t[s-3],r.setLink(t[s-2],t[s-1],t[s]);break;case 88:this.$=t[s-3],r.setLink(t[s-2],t[s-1]),r.setTooltip(t[s-2],t[s]);break;case 89:this.$=t[s-4],r.setLink(t[s-3],t[s-2],t[s]),r.setTooltip(t[s-3],t[s-1]);break;case 92:this.$=t[s-3],r.setClickEvent(t[s-2],t[s-1],t[s]);break;case 93:this.$=t[s-4],r.setClickEvent(t[s-3],t[s-2],t[s-1]),r.setTooltip(t[s-3],t[s]);break;case 94:this.$=t[s-3],r.setLink(t[s-2],t[s]);break;case 95:this.$=t[s-4],r.setLink(t[s-3],t[s-1],t[s]);break;case 96:this.$=t[s-4],r.setLink(t[s-3],t[s-1]),r.setTooltip(t[s-3],t[s]);break;case 97:this.$=t[s-5],r.setLink(t[s-4],t[s-2],t[s]),r.setTooltip(t[s-4],t[s-1]);break;case 98:this.$=t[s-2],r.setCssStyle(t[s-1],t[s]);break;case 99:r.setCssClass(t[s-1],t[s]);break;case 100:this.$=[t[s]];break;case 101:t[s-2].push(t[s]),this.$=t[s-2];break;case 103:this.$=t[s-1]+t[s];break}},"anonymous"),table:[{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:39,17:40,19:21,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:i,35:n,37:u,38:22,42:a,43:23,46:c,49:f,51:b,52:F,54:T,56:O,57:Ae,60:k,62:be,63:fe,64:ke,65:ge,75:me,76:Ce,78:Ee,82:ye,83:Te,86:g,100:m,102:C,103:E},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},e(De,[2,5],{8:[1,48]}),{8:[1,49]},e(h,[2,19],{22:[1,50]}),e(h,[2,21]),e(h,[2,22]),e(h,[2,23]),e(h,[2,24]),e(h,[2,25]),e(h,[2,26]),e(h,[2,27]),e(h,[2,28]),e(h,[2,29]),e(h,[2,30]),{34:[1,51]},{36:[1,52]},e(h,[2,33]),e(h,[2,56],{53:53,66:56,67:57,13:[1,54],22:[1,55],68:$,69:ee,70:te,71:se,72:ie,73:Fe,74:Be}),{39:[1,65]},e(v,[2,43],{39:[1,67],44:[1,66]}),e(h,[2,58]),e(h,[2,59]),{16:68,60:k,86:g,100:m,102:C},{16:39,17:40,19:69,60:k,86:g,100:m,102:C,103:E},{16:39,17:40,19:70,60:k,86:g,100:m,102:C,103:E},{16:39,17:40,19:71,60:k,86:g,100:m,102:C,103:E},{60:[1,72]},{13:[1,73]},{16:39,17:40,19:74,60:k,86:g,100:m,102:C,103:E},{13:Ve,55:75},{58:77,60:[1,78]},e(h,[2,69]),e(h,[2,70]),e(h,[2,71]),e(h,[2,72]),e(R,[2,13],{16:39,17:40,19:80,18:[1,79],20:[1,81],60:k,86:g,100:m,102:C,103:E}),e(R,[2,15],{20:[1,82]}),{15:83,16:84,17:85,60:k,86:g,100:m,102:C,103:E},{16:39,17:40,19:86,60:k,86:g,100:m,102:C,103:E},e(ae,[2,126]),e(ae,[2,127]),e(ae,[2,128]),e(ae,[2,129]),e([1,8,9,12,13,20,22,39,41,44,68,69,70,71,72,73,74,79,81],[2,130]),e(De,[2,6],{10:5,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,19:21,38:22,43:23,16:39,17:40,5:87,33:i,35:n,37:u,42:a,46:c,49:f,51:b,52:F,54:T,56:O,57:Ae,60:k,62:be,63:fe,64:ke,65:ge,75:me,76:Ce,78:Ee,82:ye,83:Te,86:g,100:m,102:C,103:E}),{5:88,10:5,16:39,17:40,19:21,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:i,35:n,37:u,38:22,42:a,43:23,46:c,49:f,51:b,52:F,54:T,56:O,57:Ae,60:k,62:be,63:fe,64:ke,65:ge,75:me,76:Ce,78:Ee,82:ye,83:Te,86:g,100:m,102:C,103:E},e(h,[2,20]),e(h,[2,31]),e(h,[2,32]),{13:[1,90],16:39,17:40,19:89,60:k,86:g,100:m,102:C,103:E},{53:91,66:56,67:57,68:$,69:ee,70:te,71:se,72:ie,73:Fe,74:Be},e(h,[2,57]),{67:92,73:Fe,74:Be},e(re,[2,76],{66:93,68:$,69:ee,70:te,71:se,72:ie}),e(U,[2,77]),e(U,[2,78]),e(U,[2,79]),e(U,[2,80]),e(U,[2,81]),e(Me,[2,82]),e(Me,[2,83]),{8:[1,95],24:96,30:97,40:94,43:23,46:c,54:T,56:O},{16:98,60:k,86:g,100:m,102:C},{41:[1,100],45:99,51:_e},{50:[1,102]},{13:[1,103]},{13:[1,104]},{79:[1,105],81:[1,106]},{22:z,48:Y,59:107,60:K,82:Q,84:108,85:109,86:W,87:j,88:X,89:H,90:q},{60:[1,119]},{13:Ve,55:120},e(v,[2,65]),e(v,[2,131]),{22:z,48:Y,59:121,60:K,61:[1,122],82:Q,84:108,85:109,86:W,87:j,88:X,89:H,90:q},e(Pe,[2,67]),{16:39,17:40,19:123,60:k,86:g,100:m,102:C,103:E},e(R,[2,16]),e(R,[2,17]),e(R,[2,18]),{39:[2,36]},{15:125,16:84,17:85,18:[1,124],39:[2,9],60:k,86:g,100:m,102:C,103:E},{39:[2,10]},e(Se,[2,48],{11:126,12:[1,127]}),e(De,[2,7]),{9:[1,128]},e(ne,[2,60]),{16:39,17:40,19:129,60:k,86:g,100:m,102:C,103:E},{13:[1,131],16:39,17:40,19:130,60:k,86:g,100:m,102:C,103:E},e(re,[2,75],{66:132,68:$,69:ee,70:te,71:se,72:ie}),e(re,[2,74]),{41:[1,133]},{24:96,30:97,40:134,43:23,46:c,54:T,56:O},{8:[1,135],41:[2,37]},{8:[1,136],41:[2,40]},e(v,[2,44],{39:[1,137]}),{41:[1,138]},e(v,[2,46]),{41:[2,54],45:139,51:_e},{16:39,17:40,19:140,60:k,86:g,100:m,102:C,103:E},e(h,[2,84],{13:[1,141]}),e(h,[2,86],{13:[1,143],77:[1,142]}),e(h,[2,90],{13:[1,144],80:[1,145]}),{13:[1,146]},e(h,[2,98],{61:Re}),e(Ge,[2,100],{85:148,22:z,48:Y,60:K,82:Q,86:W,87:j,88:X,89:H,90:q}),e(N,[2,102]),e(N,[2,104]),e(N,[2,105]),e(N,[2,106]),e(N,[2,107]),e(N,[2,108]),e(N,[2,109]),e(N,[2,110]),e(N,[2,111]),e(N,[2,112]),e(h,[2,99]),e(v,[2,64]),e(h,[2,66],{61:Re}),{60:[1,149]},e(R,[2,14]),{15:150,16:84,17:85,60:k,86:g,100:m,102:C,103:E},{39:[2,12]},e(Se,[2,49]),{13:[1,151]},{1:[2,4]},e(ne,[2,62]),e(ne,[2,61]),{16:39,17:40,19:152,60:k,86:g,100:m,102:C,103:E},e(re,[2,73]),e(h,[2,34]),{41:[1,153]},{24:96,30:97,40:154,41:[2,38],43:23,46:c,54:T,56:O},{24:96,30:97,40:155,41:[2,41],43:23,46:c,54:T,56:O},{45:156,51:_e},e(v,[2,45]),{41:[2,55]},e(h,[2,53]),e(h,[2,85]),e(h,[2,87]),e(h,[2,88],{77:[1,157]}),e(h,[2,91]),e(h,[2,92],{13:[1,158]}),e(h,[2,94],{13:[1,160],77:[1,159]}),{22:z,48:Y,60:K,82:Q,84:161,85:109,86:W,87:j,88:X,89:H,90:q},e(N,[2,103]),e(Pe,[2,68]),{39:[2,11]},{14:[1,162]},e(ne,[2,63]),e(h,[2,35]),{41:[2,39]},{41:[2,42]},{41:[1,163]},e(h,[2,89]),e(h,[2,93]),e(h,[2,95]),e(h,[2,96],{77:[1,164]}),e(Ge,[2,101],{85:148,22:z,48:Y,60:K,82:Q,86:W,87:j,88:X,89:H,90:q}),e(Se,[2,8]),e(v,[2,47]),e(h,[2,97])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],83:[2,36],85:[2,10],125:[2,12],128:[2,4],139:[2,55],150:[2,11],154:[2,39],155:[2,42]},parseError:d(function(l,o){if(o.recoverable)this.trace(l);else{var p=new Error(l);throw p.hash=o,p}},"parseError"),parse:d(function(l){var o=this,p=[0],r=[],A=[null],t=[],J=this.table,s="",le=0,Ue=0,ze=0,bt=2,Ye=1,ft=t.slice.call(arguments,1),y=Object.create(this.lexer),w={yy:{}};for(var Le in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Le)&&(w.yy[Le]=this.yy[Le]);y.setInput(l,w.yy),w.yy.lexer=y,w.yy.parser=this,typeof y.yylloc>"u"&&(y.yylloc={});var xe=y.yylloc;t.push(xe);var kt=y.options&&y.options.ranges;typeof w.yy.parseError=="function"?this.parseError=w.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function gt(_){p.length=p.length-2*_,A.length=A.length-_,t.length=t.length-_}d(gt,"popStack");function Ke(){var _;return _=r.pop()||y.lex()||Ye,typeof _!="number"&&(_ instanceof Array&&(r=_,_=r.pop()),_=o.symbols_[_]||_),_}d(Ke,"lex");for(var B,ve,V,S,Tt,Ie,G={},oe,x,Qe,ce;;){if(V=p[p.length-1],this.defaultActions[V]?S=this.defaultActions[V]:((B===null||typeof B>"u")&&(B=Ke()),S=J[V]&&J[V][B]),typeof S>"u"||!S.length||!S[0]){var Oe="";ce=[];for(oe in J[V])this.terminals_[oe]&&oe>bt&&ce.push("'"+this.terminals_[oe]+"'");y.showPosition?Oe="Parse error on line "+(le+1)+`: -`+y.showPosition()+` -Expecting `+ce.join(", ")+", got '"+(this.terminals_[B]||B)+"'":Oe="Parse error on line "+(le+1)+": Unexpected "+(B==Ye?"end of input":"'"+(this.terminals_[B]||B)+"'"),this.parseError(Oe,{text:y.match,token:this.terminals_[B]||B,line:y.yylineno,loc:xe,expected:ce})}if(S[0]instanceof Array&&S.length>1)throw new Error("Parse Error: multiple actions possible at state: "+V+", token: "+B);switch(S[0]){case 1:p.push(B),A.push(y.yytext),t.push(y.yylloc),p.push(S[1]),B=null,ve?(B=ve,ve=null):(Ue=y.yyleng,s=y.yytext,le=y.yylineno,xe=y.yylloc,ze>0&&ze--);break;case 2:if(x=this.productions_[S[1]][1],G.$=A[A.length-x],G._$={first_line:t[t.length-(x||1)].first_line,last_line:t[t.length-1].last_line,first_column:t[t.length-(x||1)].first_column,last_column:t[t.length-1].last_column},kt&&(G._$.range=[t[t.length-(x||1)].range[0],t[t.length-1].range[1]]),Ie=this.performAction.apply(G,[s,Ue,le,w.yy,S[1],A,t].concat(ft)),typeof Ie<"u")return Ie;x&&(p=p.slice(0,-1*x*2),A=A.slice(0,-1*x),t=t.slice(0,-1*x)),p.push(this.productions_[S[1]][0]),A.push(G.$),t.push(G._$),Qe=J[p[p.length-2]][p[p.length-1]],p.push(Qe);break;case 3:return!0}}return!0},"parse")},At=(function(){var I={EOF:1,parseError:d(function(o,p){if(this.yy.parser)this.yy.parser.parseError(o,p);else throw new Error(o)},"parseError"),setInput:d(function(l,o){return this.yy=o||this.yy||{},this._input=l,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:d(function(){var l=this._input[0];this.yytext+=l,this.yyleng++,this.offset++,this.match+=l,this.matched+=l;var o=l.match(/(?:\r\n?|\n).*/g);return o?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),l},"input"),unput:d(function(l){var o=l.length,p=l.split(/(?:\r\n?|\n)/g);this._input=l+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-o),this.offset-=o;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),p.length-1&&(this.yylineno-=p.length-1);var A=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:p?(p.length===r.length?this.yylloc.first_column:0)+r[r.length-p.length].length-p[0].length:this.yylloc.first_column-o},this.options.ranges&&(this.yylloc.range=[A[0],A[0]+this.yyleng-o]),this.yyleng=this.yytext.length,this},"unput"),more:d(function(){return this._more=!0,this},"more"),reject:d(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:d(function(l){this.unput(this.match.slice(l))},"less"),pastInput:d(function(){var l=this.matched.substr(0,this.matched.length-this.match.length);return(l.length>20?"...":"")+l.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:d(function(){var l=this.match;return l.length<20&&(l+=this._input.substr(0,20-l.length)),(l.substr(0,20)+(l.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:d(function(){var l=this.pastInput(),o=new Array(l.length+1).join("-");return l+this.upcomingInput()+` -`+o+"^"},"showPosition"),test_match:d(function(l,o){var p,r,A;if(this.options.backtrack_lexer&&(A={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(A.yylloc.range=this.yylloc.range.slice(0))),r=l[0].match(/(?:\r\n?|\n).*/g),r&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+l[0].length},this.yytext+=l[0],this.match+=l[0],this.matches=l,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(l[0].length),this.matched+=l[0],p=this.performAction.call(this,this.yy,this,o,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),p)return p;if(this._backtrack){for(var t in A)this[t]=A[t];return!1}return!1},"test_match"),next:d(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var l,o,p,r;this._more||(this.yytext="",this.match="");for(var A=this._currentRules(),t=0;to[0].length)){if(o=p,r=t,this.options.backtrack_lexer){if(l=this.test_match(p,A[t]),l!==!1)return l;if(this._backtrack){o=!1;continue}else return!1}else if(!this.options.flex)break}return o?(l=this.test_match(o,A[r]),l!==!1?l:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:d(function(){var o=this.next();return o||this.lex()},"lex"),begin:d(function(o){this.conditionStack.push(o)},"begin"),popState:d(function(){var o=this.conditionStack.length-1;return o>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:d(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:d(function(o){return o=this.conditionStack.length-1-Math.abs(o||0),o>=0?this.conditionStack[o]:"INITIAL"},"topState"),pushState:d(function(o){this.begin(o)},"pushState"),stateStackSize:d(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:d(function(o,p,r,A){var t=A;switch(r){case 0:return 62;case 1:return 63;case 2:return 64;case 3:return 65;case 4:break;case 5:break;case 6:return this.begin("acc_title"),33;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),35;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 8;case 14:break;case 15:return 7;case 16:return 7;case 17:return"EDGE_STATE";case 18:this.begin("callback_name");break;case 19:this.popState();break;case 20:this.popState(),this.begin("callback_args");break;case 21:return 79;case 22:this.popState();break;case 23:return 80;case 24:this.popState();break;case 25:return"STR";case 26:this.begin("string");break;case 27:return 82;case 28:return 57;case 29:return this.begin("namespace"),42;break;case 30:return this.popState(),8;break;case 31:break;case 32:return this.begin("namespace-body"),39;break;case 33:return this.popState(),41;break;case 34:return"EOF_IN_STRUCT";case 35:return 8;case 36:break;case 37:return"EDGE_STATE";case 38:return this.begin("class"),46;break;case 39:return this.popState(),8;break;case 40:break;case 41:return this.popState(),this.popState(),41;break;case 42:return this.begin("class-body"),39;break;case 43:return this.popState(),41;break;case 44:return"EOF_IN_STRUCT";case 45:return"EDGE_STATE";case 46:return"OPEN_IN_STRUCT";case 47:break;case 48:return"MEMBER";case 49:return 83;case 50:return 75;case 51:return 76;case 52:return 78;case 53:return 54;case 54:return 56;case 55:return 49;case 56:return 50;case 57:return 81;case 58:this.popState();break;case 59:return"GENERICTYPE";case 60:this.begin("generic");break;case 61:this.popState();break;case 62:return"BQUOTE_STR";case 63:this.begin("bqstring");break;case 64:return 77;case 65:return 77;case 66:return 77;case 67:return 77;case 68:return 69;case 69:return 69;case 70:return 71;case 71:return 71;case 72:return 70;case 73:return 68;case 74:return 72;case 75:return 73;case 76:return 74;case 77:return 22;case 78:return 44;case 79:return 100;case 80:return 18;case 81:return"PLUS";case 82:return 87;case 83:return 61;case 84:return 89;case 85:return 89;case 86:return 90;case 87:return"EQUALS";case 88:return"EQUALS";case 89:return 60;case 90:return 12;case 91:return 14;case 92:return"PUNCTUATION";case 93:return 86;case 94:return 102;case 95:return 48;case 96:return 48;case 97:return 9}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:\[\*\])/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:["])/,/^(?:[^"]*)/,/^(?:["])/,/^(?:style\b)/,/^(?:classDef\b)/,/^(?:namespace\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:\[\*\])/,/^(?:class\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[}])/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\[\*\])/,/^(?:[{])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:href\b)/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:~)/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:[`])/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?::)/,/^(?:,)/,/^(?:#)/,/^(?:#)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:\[)/,/^(?:\])/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:\s)/,/^(?:$)/],conditions:{"namespace-body":{rules:[26,33,34,35,36,37,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},namespace:{rules:[26,29,30,31,32,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},"class-body":{rules:[26,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},class:{rules:[26,39,40,41,42,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr_multiline:{rules:[11,12,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr:{rules:[9,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_title:{rules:[7,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_args:{rules:[22,23,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_name:{rules:[19,20,21,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},href:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},struct:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},generic:{rules:[26,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},bqstring:{rules:[26,49,50,51,52,53,54,55,56,57,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},string:{rules:[24,25,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,26,27,28,29,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],inclusive:!0}}};return I})();Ne.lexer=At;function ue(){this.yy={}}return d(ue,"Parser"),ue.prototype=Ne,Ne.Parser=ue,new ue})();we.parser=we;var vt=we,ht=["#","+","~","-",""],pt=class{static{d(this,"ClassMember")}constructor(e,i){this.memberType=i,this.visibility="",this.classifier="",this.text="";let n=qe(e,D());this.parseMember(n)}getDisplayDetails(){let e=this.visibility+M(this.id);this.memberType==="method"&&(e+=`(${M(this.parameters.trim())})`,this.returnType&&(e+=" : "+M(this.returnType))),e=e.trim();let i=this.parseClassifier();return{displayText:e,cssStyle:i}}parseMember(e){let i="";if(this.memberType==="method"){let a=/([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/.exec(e);if(a){let c=a[1]?a[1].trim():"";if(ht.includes(c)&&(this.visibility=c),this.id=a[2],this.parameters=a[3]?a[3].trim():"",i=a[4]?a[4].trim():"",this.returnType=a[5]?a[5].trim():"",i===""){let f=this.returnType.substring(this.returnType.length-1);/[$*]/.exec(f)&&(i=f,this.returnType=this.returnType.substring(0,this.returnType.length-1))}}}else{let u=e.length,a=e.substring(0,1),c=e.substring(u-1);ht.includes(a)&&(this.visibility=a),/[$*]/.exec(c)&&(i=c),this.id=e.substring(this.visibility===""?0:1,i===""?u:u-1)}this.classifier=i,this.id=this.id.startsWith(" ")?" "+this.id.trim():this.id.trim();let n=`${this.visibility?"\\"+this.visibility:""}${M(this.id)}${this.memberType==="method"?`(${M(this.parameters)})${this.returnType?" : "+M(this.returnType):""}`:""}`;this.text=n.replaceAll("<","<").replaceAll(">",">"),this.text.startsWith("\\<")&&(this.text=this.text.replace("\\<","~"))}parseClassifier(){switch(this.classifier){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}}},de="classId-",dt=0,P=d(e=>L.sanitizeText(e,D()),"sanitizeText"),wt=class{constructor(){this.relations=[],this.classes=new Map,this.styleClasses=new Map,this.notes=new Map,this.interfaces=[],this.namespaces=new Map,this.namespaceCounter=0,this.functions=[],this.lineType={LINE:0,DOTTED_LINE:1},this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3,LOLLIPOP:4},this.setupToolTips=d(e=>{let i=ut();Z(e).select("svg").selectAll("g").filter(function(){return Z(this).attr("title")!==null}).on("mouseover",a=>{let c=Z(a.currentTarget),f=c.attr("title");if(!f)return;let b=a.currentTarget.getBoundingClientRect();i.transition().duration(200).style("opacity",".9"),i.html(He.sanitize(f)).style("left",`${window.scrollX+b.left+b.width/2}px`).style("top",`${window.scrollY+b.bottom+4}px`),c.classed("hover",!0)}).on("mouseout",a=>{i.transition().duration(500).style("opacity",0),Z(a.currentTarget).classed("hover",!1)})},"setupToolTips"),this.direction="TB",this.setAccTitle=Ze,this.getAccTitle=$e,this.setAccDescription=et,this.getAccDescription=tt,this.setDiagramTitle=st,this.getDiagramTitle=it,this.getConfig=d(()=>D().class,"getConfig"),this.functions.push(this.setupToolTips.bind(this)),this.clear(),this.addRelation=this.addRelation.bind(this),this.addClassesToNamespace=this.addClassesToNamespace.bind(this),this.addNamespace=this.addNamespace.bind(this),this.setCssClass=this.setCssClass.bind(this),this.addMembers=this.addMembers.bind(this),this.addClass=this.addClass.bind(this),this.setClassLabel=this.setClassLabel.bind(this),this.addAnnotation=this.addAnnotation.bind(this),this.addMember=this.addMember.bind(this),this.cleanupLabel=this.cleanupLabel.bind(this),this.addNote=this.addNote.bind(this),this.defineClass=this.defineClass.bind(this),this.setDirection=this.setDirection.bind(this),this.setLink=this.setLink.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.clear=this.clear.bind(this),this.setTooltip=this.setTooltip.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setCssStyle=this.setCssStyle.bind(this)}static{d(this,"ClassDB")}splitClassNameAndType(e){let i=L.sanitizeText(e,D()),n="",u=i;if(i.indexOf("~")>0){let a=i.split("~");u=P(a[0]),n=P(a[1])}return{className:u,type:n}}setClassLabel(e,i){let n=L.sanitizeText(e,D());i&&(i=P(i));let{className:u}=this.splitClassNameAndType(n);this.classes.get(u).label=i,this.classes.get(u).text=`${i}${this.classes.get(u).type?`<${this.classes.get(u).type}>`:""}`}addClass(e){let i=L.sanitizeText(e,D()),{className:n,type:u}=this.splitClassNameAndType(i);if(this.classes.has(n))return;let a=L.sanitizeText(n,D());this.classes.set(a,{id:a,type:u,label:a,text:`${a}${u?`<${u}>`:""}`,shape:"classBox",cssClasses:"default",methods:[],members:[],annotations:[],styles:[],domId:de+a+"-"+dt}),dt++}addInterface(e,i){let n={id:`interface${this.interfaces.length}`,label:e,classId:i};this.interfaces.push(n)}lookUpDomId(e){let i=L.sanitizeText(e,D());if(this.classes.has(i))return this.classes.get(i).domId;throw new Error("Class not found: "+i)}clear(){this.relations=[],this.classes=new Map,this.notes=new Map,this.interfaces=[],this.functions=[],this.functions.push(this.setupToolTips.bind(this)),this.namespaces=new Map,this.namespaceCounter=0,this.direction="TB",Je()}getClass(e){return this.classes.get(e)}getClasses(){return this.classes}getRelations(){return this.relations}getNote(e){let i=typeof e=="number"?`note${e}`:e;return this.notes.get(i)}getNotes(){return this.notes}addRelation(e){he.debug("Adding relation: "+JSON.stringify(e));let i=[this.relationType.LOLLIPOP,this.relationType.AGGREGATION,this.relationType.COMPOSITION,this.relationType.DEPENDENCY,this.relationType.EXTENSION];e.relation.type1===this.relationType.LOLLIPOP&&!i.includes(e.relation.type2)?(this.addClass(e.id2),this.addInterface(e.id1,e.id2),e.id1=`interface${this.interfaces.length-1}`):e.relation.type2===this.relationType.LOLLIPOP&&!i.includes(e.relation.type1)?(this.addClass(e.id1),this.addInterface(e.id2,e.id1),e.id2=`interface${this.interfaces.length-1}`):(this.addClass(e.id1),this.addClass(e.id2)),e.id1=this.splitClassNameAndType(e.id1).className,e.id2=this.splitClassNameAndType(e.id2).className,e.relationTitle1=L.sanitizeText(e.relationTitle1.trim(),D()),e.relationTitle2=L.sanitizeText(e.relationTitle2.trim(),D()),this.relations.push(e)}addAnnotation(e,i){let n=this.splitClassNameAndType(e).className;this.classes.get(n).annotations.push(i)}addMember(e,i){this.addClass(e);let n=this.splitClassNameAndType(e).className,u=this.classes.get(n);if(typeof i=="string"){let a=i.trim();a.startsWith("<<")&&a.endsWith(">>")?u.annotations.push(P(a.substring(2,a.length-2))):a.indexOf(")")>0?u.methods.push(new pt(a,"method")):a&&u.members.push(new pt(a,"attribute"))}}addMembers(e,i){Array.isArray(i)&&(i.reverse(),i.forEach(n=>this.addMember(e,n)))}addNote(e,i){let n=this.notes.size,u={id:`note${n}`,class:i,text:e,index:n};return this.notes.set(u.id,u),u.id}cleanupLabel(e){return e.startsWith(":")&&(e=e.substring(1)),P(e.trim())}setCssClass(e,i){e.split(",").forEach(n=>{let u=n;/\d/.exec(n[0])&&(u=de+u);let a=this.classes.get(u);a&&(a.cssClasses+=" "+i)})}defineClass(e,i){for(let n of e){let u=this.styleClasses.get(n);u===void 0&&(u={id:n,styles:[],textStyles:[]},this.styleClasses.set(n,u)),i&&i.forEach(a=>{if(/color/.exec(a)){let c=a.replace("fill","bgFill");u.textStyles.push(c)}u.styles.push(a)}),this.classes.forEach(a=>{a.cssClasses.includes(n)&&a.styles.push(...i.flatMap(c=>c.split(",")))})}}setTooltip(e,i){e.split(",").forEach(n=>{i!==void 0&&(this.classes.get(n).tooltip=P(i))})}getTooltip(e,i){return i&&this.namespaces.has(i)?this.namespaces.get(i).classes.get(e).tooltip:this.classes.get(e).tooltip}setLink(e,i,n){let u=D();e.split(",").forEach(a=>{let c=a;/\d/.exec(a[0])&&(c=de+c);let f=this.classes.get(c);f&&(f.link=pe.formatUrl(i,u),u.securityLevel==="sandbox"?f.linkTarget="_top":typeof n=="string"?f.linkTarget=P(n):f.linkTarget="_blank")}),this.setCssClass(e,"clickable")}setClickEvent(e,i,n){e.split(",").forEach(u=>{this.setClickFunc(u,i,n),this.classes.get(u).haveCallback=!0}),this.setCssClass(e,"clickable")}setClickFunc(e,i,n){let u=L.sanitizeText(e,D());if(D().securityLevel!=="loose"||i===void 0)return;let c=u;if(this.classes.has(c)){let f=this.lookUpDomId(c),b=[];if(typeof n=="string"){b=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let F=0;F{let F=document.querySelector(`[id="${f}"]`);F!==null&&F.addEventListener("click",()=>{pe.runFunc(i,...b)},!1)})}}bindFunctions(e){this.functions.forEach(i=>{i(e)})}escapeHtml(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}getDirection(){return this.direction}setDirection(e){this.direction=e}addNamespace(e){this.namespaces.has(e)||(this.namespaces.set(e,{id:e,classes:new Map,notes:new Map,children:new Map,domId:de+e+"-"+this.namespaceCounter}),this.namespaceCounter++)}getNamespace(e){return this.namespaces.get(e)}getNamespaces(){return this.namespaces}addClassesToNamespace(e,i,n){if(this.namespaces.has(e)){for(let u of i){let{className:a}=this.splitClassNameAndType(u),c=this.getClass(a);c.parent=e,this.namespaces.get(e).classes.set(a,c)}for(let u of n){let a=this.getNote(u);a.parent=e,this.namespaces.get(e).notes.set(u,a)}}}setCssStyle(e,i){let n=this.classes.get(e);if(!(!i||!n))for(let u of i)u.includes(",")?n.styles.push(...u.split(",")):n.styles.push(u)}getArrowMarker(e){let i;switch(e){case 0:i="aggregation";break;case 1:i="extension";break;case 2:i="composition";break;case 3:i="dependency";break;case 4:i="lollipop";break;default:i="none"}return i}getData(){let e=[],i=[],n=D();for(let a of this.namespaces.values()){let c={id:a.id,label:a.id,isGroup:!0,padding:n.class.padding??16,shape:"rect",cssStyles:[],look:n.look};e.push(c)}for(let a of this.classes.values()){let c=je(We({},a),{type:void 0,isGroup:!1,parentId:a.parent,look:n.look});e.push(c)}for(let a of this.notes.values()){let c={id:a.id,label:a.text,isGroup:!1,shape:"note",padding:n.class.padding??6,cssStyles:["text-align: left","white-space: nowrap",`fill: ${n.themeVariables.noteBkgColor}`,`stroke: ${n.themeVariables.noteBorderColor}`],look:n.look,parentId:a.parent,labelType:"markdown"};e.push(c);let f=this.classes.get(a.class)?.id;if(f){let b={id:`edgeNote${a.index}`,start:a.id,end:f,type:"normal",thickness:"normal",classes:"relation",arrowTypeStart:"none",arrowTypeEnd:"none",arrowheadStyle:"",labelStyle:[""],style:["fill: none"],pattern:"dotted",look:n.look};i.push(b)}}for(let a of this.interfaces){let c={id:a.id,label:a.label,isGroup:!1,shape:"rect",cssStyles:["opacity: 0;"],look:n.look};e.push(c)}let u=0;for(let a of this.relations){u++;let c={id:at(a.id1,a.id2,{prefix:"id",counter:u}),start:a.id1,end:a.id2,type:"normal",label:a.title,labelpos:"c",thickness:"normal",classes:"relation",arrowTypeStart:this.getArrowMarker(a.relation.type1),arrowTypeEnd:this.getArrowMarker(a.relation.type2),startLabelRight:a.relationTitle1==="none"?"":a.relationTitle1,endLabelLeft:a.relationTitle2==="none"?"":a.relationTitle2,arrowheadStyle:"",labelStyle:["display: inline-block"],style:a.style||"",pattern:a.relation.lineType==1?"dashed":"solid",look:n.look,labelType:"markdown"};i.push(c)}return{nodes:e,edges:i,other:{},config:n,direction:this.getDirection()}}},mt=d(e=>`g.classGroup text { - fill: ${e.nodeBorder||e.classText}; - stroke: none; - font-family: ${e.fontFamily}; - font-size: 10px; - - .title { - font-weight: bolder; - } - -} - - .cluster-label text { - fill: ${e.titleColor}; - } - .cluster-label span { - color: ${e.titleColor}; - } - .cluster-label span p { - background-color: transparent; - } - - .cluster rect { - fill: ${e.clusterBkg}; - stroke: ${e.clusterBorder}; - stroke-width: 1px; - } - - .cluster text { - fill: ${e.titleColor}; - } - - .cluster span { - color: ${e.titleColor}; - } - -.nodeLabel, .edgeLabel { - color: ${e.classText}; -} -.edgeLabel .label rect { - fill: ${e.mainBkg}; -} -.label text { - fill: ${e.classText}; -} - -.labelBkg { - background: ${e.mainBkg}; -} -.edgeLabel .label span { - background: ${e.mainBkg}; -} - -.classTitle { - font-weight: bolder; -} -.node rect, - .node circle, - .node ellipse, - .node polygon, - .node path { - fill: ${e.mainBkg}; - stroke: ${e.nodeBorder}; - stroke-width: 1px; - } - - -.divider { - stroke: ${e.nodeBorder}; - stroke-width: 1; -} - -g.clickable { - cursor: pointer; -} - -g.classGroup rect { - fill: ${e.mainBkg}; - stroke: ${e.nodeBorder}; -} - -g.classGroup line { - stroke: ${e.nodeBorder}; - stroke-width: 1; -} - -.classLabel .box { - stroke: none; - stroke-width: 0; - fill: ${e.mainBkg}; - opacity: 0.5; -} - -.classLabel .label { - fill: ${e.nodeBorder}; - font-size: 10px; -} - -.relation { - stroke: ${e.lineColor}; - stroke-width: 1; - fill: none; -} - -.dashed-line{ - stroke-dasharray: 3; -} - -.dotted-line{ - stroke-dasharray: 1 2; -} - -#compositionStart, .composition { - fill: ${e.lineColor} !important; - stroke: ${e.lineColor} !important; - stroke-width: 1; -} - -#compositionEnd, .composition { - fill: ${e.lineColor} !important; - stroke: ${e.lineColor} !important; - stroke-width: 1; -} - -#dependencyStart, .dependency { - fill: ${e.lineColor} !important; - stroke: ${e.lineColor} !important; - stroke-width: 1; -} - -#dependencyStart, .dependency { - fill: ${e.lineColor} !important; - stroke: ${e.lineColor} !important; - stroke-width: 1; -} - -#extensionStart, .extension { - fill: transparent !important; - stroke: ${e.lineColor} !important; - stroke-width: 1; -} - -#extensionEnd, .extension { - fill: transparent !important; - stroke: ${e.lineColor} !important; - stroke-width: 1; -} - -#aggregationStart, .aggregation { - fill: transparent !important; - stroke: ${e.lineColor} !important; - stroke-width: 1; -} - -#aggregationEnd, .aggregation { - fill: transparent !important; - stroke: ${e.lineColor} !important; - stroke-width: 1; -} - -#lollipopStart, .lollipop { - fill: ${e.mainBkg} !important; - stroke: ${e.lineColor} !important; - stroke-width: 1; -} - -#lollipopEnd, .lollipop { - fill: ${e.mainBkg} !important; - stroke: ${e.lineColor} !important; - stroke-width: 1; -} - -.edgeTerminals { - font-size: 11px; - line-height: initial; -} - -.classTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${e.textColor}; -} - ${lt()} -`,"getStyles"),Vt=mt,Ct=d((e,i="TB")=>{if(!e.doc)return i;let n=i;for(let u of e.doc)u.stmt==="dir"&&(n=u.value);return n},"getDir"),Et=d(function(e,i){return i.db.getClasses()},"getClasses"),yt=d(function(e,i,n,u){return Xe(this,null,function*(){he.info("REF0:"),he.info("Drawing class diagram (v3)",i);let{securityLevel:a,state:c,layout:f}=D(),b=u.db.getData(),F=ot(i,a);b.type=u.type,b.layoutAlgorithm=nt(f),b.nodeSpacing=c?.nodeSpacing||50,b.rankSpacing=c?.rankSpacing||50,b.markers=["aggregation","extension","composition","dependency","lollipop"],b.diagramId=i,yield rt(b,F);let T=8;pe.insertTitle(F,"classDiagramTitleText",c?.titleTopMargin??25,u.db.getDiagramTitle()),ct(F,T,"classDiagram",c?.useMaxWidth??!0)})},"draw"),Mt={getClasses:Et,draw:yt,getDir:Ct};export{vt as a,wt as b,Vt as c,Mt as d}; diff --git a/src/google/adk/cli/browser/chunk-TNJPXCAB.js b/src/google/adk/cli/browser/chunk-TNJPXCAB.js deleted file mode 100644 index 1dde258711..0000000000 --- a/src/google/adk/cli/browser/chunk-TNJPXCAB.js +++ /dev/null @@ -1,7 +0,0 @@ -import{a as T,b as Y,c as K,d as yt}from"./chunk-JHZIBEJC.js";import{c as B}from"./chunk-W7PRDKNL.js";import{a as kt}from"./chunk-DRBE27N3.js";import{a as gt}from"./chunk-PRKFGJVH.js";import{c as ut,d as xt}from"./chunk-VDPKVNDJ.js";import{f as bt}from"./chunk-WXI2IBAH.js";import{m as O}from"./chunk-WBLSVR3V.js";import{E as F,Y as E}from"./chunk-QFMJV7VH.js";import{$ as ct,L as N,M as nt,O as st,P as ot,Q as G,U as it,X as lt,a as S,aa as dt,ba as ft,ca as pt,da as ht,ea as mt,g as p,i as b}from"./chunk-JRNAXTJ7.js";import{a as at,j as et}from"./chunk-RMXJBC7V.js";var Ot=p((r,t,a,n,i,s)=>{t.arrowTypeStart&&wt(r,"start",t.arrowTypeStart,a,n,i,s),t.arrowTypeEnd&&wt(r,"end",t.arrowTypeEnd,a,n,i,s)},"addEdgeMarkers"),Tt={arrow_cross:{type:"cross",fill:!1},arrow_point:{type:"point",fill:!0},arrow_barb:{type:"barb",fill:!0},arrow_circle:{type:"circle",fill:!1},aggregation:{type:"aggregation",fill:!1},extension:{type:"extension",fill:!1},composition:{type:"composition",fill:!0},dependency:{type:"dependency",fill:!0},lollipop:{type:"lollipop",fill:!1},only_one:{type:"onlyOne",fill:!1},zero_or_one:{type:"zeroOrOne",fill:!1},one_or_more:{type:"oneOrMore",fill:!1},zero_or_more:{type:"zeroOrMore",fill:!1},requirement_arrow:{type:"requirement_arrow",fill:!1},requirement_contains:{type:"requirement_contains",fill:!1}},wt=p((r,t,a,n,i,s,e)=>{let o=Tt[a];if(!o){b.warn(`Unknown arrow type: ${a}`);return}let c=o.type,m=`${i}_${s}-${c}${t==="start"?"Start":"End"}`;if(e&&e.trim()!==""){let y=e.replace(/[^\dA-Za-z]/g,"_"),f=`${m}_${y}`;if(!document.getElementById(f)){let d=document.getElementById(m);if(d){let u=d.cloneNode(!0);u.id=f,u.querySelectorAll("path, circle, line").forEach(k=>{k.setAttribute("stroke",e),o.fill&&k.setAttribute("fill",e)}),d.parentNode?.appendChild(u)}}r.attr(`marker-${t}`,`url(${n}#${f})`)}else r.attr(`marker-${t}`,`url(${n}#${m})`)},"addEdgeMarker"),Xt=p(r=>typeof r=="string"?r:E()?.flowchart?.curve,"resolveEdgeCurveType"),Q=new Map,w=new Map,cr=p(()=>{Q.clear(),w.clear()},"clear"),C=p(r=>r?typeof r=="string"?r:r.reduce((t,a)=>t+";"+a,""):"","getLabelStyles"),dr=p((r,t)=>et(null,null,function*(){let a=E(),n=F(a),{labelStyles:i}=xt(t);t.labelStyle=i;let s=r.insert("g").attr("class","edgeLabel"),e=s.insert("g").attr("class","label").attr("data-id",t.id),o=t.labelType==="markdown",l=yield bt(r,t.label,{style:C(t.labelStyle),useHtmlLabels:n,addSvgBackground:!0,isNode:!1,markdown:o,width:o?void 0:void 0},a);e.node().appendChild(l),b.info("abc82",t,t.labelType);let m=l.getBBox(),y=m;if(n){let d=l.children[0],u=S(l);m=d.getBoundingClientRect(),y=m,u.attr("width",m.width),u.attr("height",m.height)}else{let d=S(l).select("text").node();d&&typeof d.getBBox=="function"&&(y=d.getBBox())}e.attr("transform",T(y,n)),Q.set(t.id,s),t.width=m.width,t.height=m.height;let f;if(t.startLabelLeft){let d=r.insert("g").attr("class","edgeTerminals"),u=d.insert("g").attr("class","inner"),h=yield B(u,t.startLabelLeft,C(t.labelStyle)||"",!1,!1);f=h;let k=h.getBBox();if(n){let x=h.children[0],L=S(h);k=x.getBoundingClientRect(),L.attr("width",k.width),L.attr("height",k.height)}u.attr("transform",T(k,n)),w.get(t.id)||w.set(t.id,{}),w.get(t.id).startLeft=d,W(f,t.startLabelLeft)}if(t.startLabelRight){let d=r.insert("g").attr("class","edgeTerminals"),u=d.insert("g").attr("class","inner"),h=yield B(u,t.startLabelRight,C(t.labelStyle)||"",!1,!1);f=h,u.node().appendChild(h);let k=h.getBBox();if(n){let x=h.children[0],L=S(h);k=x.getBoundingClientRect(),L.attr("width",k.width),L.attr("height",k.height)}u.attr("transform",T(k,n)),w.get(t.id)||w.set(t.id,{}),w.get(t.id).startRight=d,W(f,t.startLabelRight)}if(t.endLabelLeft){let d=r.insert("g").attr("class","edgeTerminals"),u=d.insert("g").attr("class","inner"),h=yield B(u,t.endLabelLeft,C(t.labelStyle)||"",!1,!1);f=h;let k=h.getBBox();if(n){let x=h.children[0],L=S(h);k=x.getBoundingClientRect(),L.attr("width",k.width),L.attr("height",k.height)}u.attr("transform",T(k,n)),d.node().appendChild(h),w.get(t.id)||w.set(t.id,{}),w.get(t.id).endLeft=d,W(f,t.endLabelLeft)}if(t.endLabelRight){let d=r.insert("g").attr("class","edgeTerminals"),u=d.insert("g").attr("class","inner"),h=yield B(u,t.endLabelRight,C(t.labelStyle)||"",!1,!1);f=h;let k=h.getBBox();if(n){let x=h.children[0],L=S(h);k=x.getBoundingClientRect(),L.attr("width",k.width),L.attr("height",k.height)}u.attr("transform",T(k,n)),d.node().appendChild(h),w.get(t.id)||w.set(t.id,{}),w.get(t.id).endRight=d,W(f,t.endLabelRight)}return l}),"insertEdgeLabel");function W(r,t){F(E())&&r&&(r.style.width=t.length*9+"px",r.style.height="12px")}p(W,"setTerminalWidth");var fr=p((r,t)=>{b.debug("Moving label abc88 ",r.id,r.label,Q.get(r.id),t);let a=t.updatedPath?t.updatedPath:t.originalPath,n=E(),{subGraphTitleTotalMargin:i}=kt(n);if(r.label){let s=Q.get(r.id),e=r.x,o=r.y;if(a){let c=O.calcLabelPosition(a);b.debug("Moving label "+r.label+" from (",e,",",o,") to (",c.x,",",c.y,") abc88"),t.updatedPath&&(e=c.x,o=c.y)}s.attr("transform",`translate(${e}, ${o+i/2})`)}if(r.startLabelLeft){let s=w.get(r.id).startLeft,e=r.x,o=r.y;if(a){let c=O.calcTerminalLabelPosition(r.arrowTypeStart?10:0,"start_left",a);e=c.x,o=c.y}s.attr("transform",`translate(${e}, ${o})`)}if(r.startLabelRight){let s=w.get(r.id).startRight,e=r.x,o=r.y;if(a){let c=O.calcTerminalLabelPosition(r.arrowTypeStart?10:0,"start_right",a);e=c.x,o=c.y}s.attr("transform",`translate(${e}, ${o})`)}if(r.endLabelLeft){let s=w.get(r.id).endLeft,e=r.x,o=r.y;if(a){let c=O.calcTerminalLabelPosition(r.arrowTypeEnd?10:0,"end_left",a);e=c.x,o=c.y}s.attr("transform",`translate(${e}, ${o})`)}if(r.endLabelRight){let s=w.get(r.id).endRight,e=r.x,o=r.y;if(a){let c=O.calcTerminalLabelPosition(r.arrowTypeEnd?10:0,"end_right",a);e=c.x,o=c.y}s.attr("transform",`translate(${e}, ${o})`)}},"positionEdgeLabel"),Yt=p((r,t)=>{let a=r.x,n=r.y,i=Math.abs(t.x-a),s=Math.abs(t.y-n),e=r.width/2,o=r.height/2;return i>=e||s>=o},"outsideNode"),Bt=p((r,t,a)=>{b.debug(`intersection calc abc89: - outsidePoint: ${JSON.stringify(t)} - insidePoint : ${JSON.stringify(a)} - node : x:${r.x} y:${r.y} w:${r.width} h:${r.height}`);let n=r.x,i=r.y,s=Math.abs(n-a.x),e=r.width/2,o=a.xMath.abs(n-t.x)*c){let y=a.y{b.warn("abc88 cutPathAtIntersect",r,t);let a=[],n=r[0],i=!1;return r.forEach(s=>{if(b.info("abc88 checking point",s,t),!Yt(t,s)&&!i){let e=Bt(t,n,s);b.debug("abc88 inside",s,n,e),b.debug("abc88 intersection",e,t);let o=!1;a.forEach(c=>{o=o||c.x===e.x&&c.y===e.y}),a.some(c=>c.x===e.x&&c.y===e.y)?b.warn("abc88 no intersect",e,a):a.push(e),i=!0}else b.warn("abc88 outside",s,n),n=s,i||a.push(s)}),b.debug("returning points",a),a},"cutPathAtIntersect");function vt(r){let t=[],a=[];for(let n=1;n5&&Math.abs(s.y-i.y)>5||i.y===s.y&&s.x===e.x&&Math.abs(s.x-i.x)>5&&Math.abs(s.y-e.y)>5)&&(t.push(s),a.push(n))}return{cornerPoints:t,cornerPointPositions:a}}p(vt,"extractCornerPoints");var Mt=p(function(r,t,a){let n=t.x-r.x,i=t.y-r.y,s=Math.sqrt(n*n+i*i),e=a/s;return{x:t.x-e*n,y:t.y-e*i}},"findAdjacentPoint"),Ct=p(function(r){let{cornerPointPositions:t}=vt(r),a=[];for(let n=0;n10&&Math.abs(s.y-i.y)>=10){b.debug("Corner point fixing",Math.abs(s.x-i.x),Math.abs(s.y-i.y));let d=5;e.x===o.x?f={x:l<0?o.x-d+y:o.x+d-y,y:m<0?o.y-y:o.y+y}:f={x:l<0?o.x-y:o.x+y,y:m<0?o.y-d+y:o.y+d-y}}else b.debug("Corner point skipping fixing",Math.abs(s.x-i.x),Math.abs(s.y-i.y));a.push(f,c)}else a.push(r[n]);return a},"fixCorners"),Wt=p((r,t,a)=>{let n=r-t-a,i=2,s=2,e=i+s,o=Math.floor(n/e),c=Array(o).fill(`${i} ${s}`).join(" ");return`0 ${t} ${c} ${a}`},"generateDashArray"),pr=p(function(r,t,a,n,i,s,e,o=!1){let{handDrawnSeed:c}=E(),l=t.points,m=!1,y=i;var f=s;let d=[];for(let v in t.cssCompiledStyles)ut(v)||d.push(t.cssCompiledStyles[v]);b.debug("UIO intersect check",t.points,f.x,y.x),f.intersect&&y.intersect&&!o&&(l=l.slice(1,t.points.length-1),l.unshift(y.intersect(l[0])),b.debug("Last point UIO",t.start,"-->",t.end,l[l.length-1],f,f.intersect(l[l.length-1])),l.push(f.intersect(l[l.length-1])));let u=btoa(JSON.stringify(l));t.toCluster&&(b.info("to cluster abc88",a.get(t.toCluster)),l=Lt(t.points,a.get(t.toCluster).node),m=!0),t.fromCluster&&(b.debug("from cluster abc88",a.get(t.fromCluster),JSON.stringify(l,null,2)),l=Lt(l.reverse(),a.get(t.fromCluster).node).reverse(),m=!0);let h=l.filter(v=>!Number.isNaN(v.y)),k=Xt(t.curve);k!=="rounded"&&(h=Ct(h));let x=N;switch(k){case"linear":x=N;break;case"basis":x=G;break;case"cardinal":x=it;break;case"bumpX":x=st;break;case"bumpY":x=ot;break;case"catmullRom":x=lt;break;case"monotoneX":x=ct;break;case"monotoneY":x=dt;break;case"natural":x=ft;break;case"step":x=pt;break;case"stepAfter":x=mt;break;case"stepBefore":x=ht;break;case"rounded":x=N;break;default:x=G}let{x:L,y:Z}=yt(t),j=nt().x(L).y(Z).curve(x),M;switch(t.thickness){case"normal":M="edge-thickness-normal";break;case"thick":M="edge-thickness-thick";break;case"invisible":M="edge-thickness-invisible";break;default:M="edge-thickness-normal"}switch(t.pattern){case"solid":M+=" edge-pattern-solid";break;case"dotted":M+=" edge-pattern-dotted";break;case"dashed":M+=" edge-pattern-dashed";break;default:M+=" edge-pattern-solid"}let g,H=k==="rounded"?_t($t(h,t),5):j(h),_=Array.isArray(t.style)?t.style:[t.style],R=_.find(v=>v?.startsWith("stroke:")),$="";t.animate&&($="edge-animation-fast"),t.animation&&($="edge-animation-"+t.animation);let rt=!1;if(t.look==="handDrawn"){let v=gt.svg(r);Object.assign([],h);let z=v.path(H,{roughness:.3,seed:c});M+=" transition",g=S(z).select("path").attr("id",t.id).attr("class"," "+M+(t.classes?" "+t.classes:"")+($?" "+$:"")).attr("style",_?_.reduce((U,I)=>U+";"+I,""):"");let q=g.attr("d");g.attr("d",q),r.node().appendChild(g.node())}else{let v=d.join(";"),z=_?_.reduce((P,X)=>P+X+";",""):"",q=(v?v+";"+z+";":z)+";"+(_?_.reduce((P,X)=>P+";"+X,""):"");g=r.append("path").attr("d",H).attr("id",t.id).attr("class"," "+M+(t.classes?" "+t.classes:"")+($?" "+$:"")).attr("style",q),R=q.match(/stroke:([^;]+)/)?.[1],rt=t.animate===!0||!!t.animation||v.includes("animation");let U=g.node(),I=typeof U.getTotalLength=="function"?U.getTotalLength():0,J=K[t.arrowTypeStart]||0,V=K[t.arrowTypeEnd]||0;if(t.look==="neo"&&!rt){let X=`stroke-dasharray: ${t.pattern==="dotted"||t.pattern==="dashed"?Wt(I,J,V):`0 ${J} ${I-J-V} ${V}`}; stroke-dashoffset: 0;`;g.attr("style",X+g.attr("style"))}}g.attr("data-edge",!0),g.attr("data-et","edge"),g.attr("data-id",t.id),g.attr("data-points",u),t.showPoints&&h.forEach(v=>{r.append("circle").style("stroke","red").style("fill","red").attr("r",1).attr("cx",v.x).attr("cy",v.y)});let A="";(E().flowchart.arrowMarkerAbsolute||E().state.arrowMarkerAbsolute)&&(A=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,A=A.replace(/\(/g,"\\(").replace(/\)/g,"\\)")),b.info("arrowTypeStart",t.arrowTypeStart),b.info("arrowTypeEnd",t.arrowTypeEnd),Ot(g,t,A,e,n,R);let St=Math.floor(l.length/2),Et=l[St];O.isLabelCoordinateInPath(Et,g.attr("d"))||(m=!0);let D={};return m&&(D.updatedPath=l),D.originalPath=t.points,D},"insertEdge");function _t(r,t){if(r.length<2)return"";let a="",n=r.length,i=1e-5;for(let s=0;sat({},i));if(r.length>=2&&Y[t.arrowTypeStart]){let i=Y[t.arrowTypeStart],s=r[0],e=r[1],{angle:o}=tt(s,e),c=i*Math.cos(o),l=i*Math.sin(o);a[0].x=s.x+c,a[0].y=s.y+l}let n=r.length;if(n>=2&&Y[t.arrowTypeEnd]){let i=Y[t.arrowTypeEnd],s=r[n-1],e=r[n-2],{angle:o}=tt(e,s),c=i*Math.cos(o),l=i*Math.sin(o);a[n-1].x=s.x-c,a[n-1].y=s.y-l}return a}p($t,"applyMarkerOffsetsToPoints");var Ht=p((r,t,a,n)=>{t.forEach(i=>{Gt[i](r,a,n)})},"insertMarkers"),Rt=p((r,t,a)=>{b.trace("Making markers for ",a),r.append("defs").append("marker").attr("id",a+"_"+t+"-extensionStart").attr("class","marker extension "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),r.append("defs").append("marker").attr("id",a+"_"+t+"-extensionEnd").attr("class","marker extension "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),At=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-compositionStart").attr("class","marker composition "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),r.append("defs").append("marker").attr("id",a+"_"+t+"-compositionEnd").attr("class","marker composition "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),zt=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-aggregationStart").attr("class","marker aggregation "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),r.append("defs").append("marker").attr("id",a+"_"+t+"-aggregationEnd").attr("class","marker aggregation "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),qt=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-dependencyStart").attr("class","marker dependency "+t).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),r.append("defs").append("marker").attr("id",a+"_"+t+"-dependencyEnd").attr("class","marker dependency "+t).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),Ut=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-lollipopStart").attr("class","marker lollipop "+t).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),r.append("defs").append("marker").attr("id",a+"_"+t+"-lollipopEnd").attr("class","marker lollipop "+t).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),It=p((r,t,a)=>{r.append("marker").attr("id",a+"_"+t+"-pointEnd").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),r.append("marker").attr("id",a+"_"+t+"-pointStart").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),Pt=p((r,t,a)=>{r.append("marker").attr("id",a+"_"+t+"-circleEnd").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),r.append("marker").attr("id",a+"_"+t+"-circleStart").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),Nt=p((r,t,a)=>{r.append("marker").attr("id",a+"_"+t+"-crossEnd").attr("class","marker cross "+t).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),r.append("marker").attr("id",a+"_"+t+"-crossStart").attr("class","marker cross "+t).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),Qt=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","userSpaceOnUse").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),Zt=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-onlyOneStart").attr("class","marker onlyOne "+t).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M9,0 L9,18 M15,0 L15,18"),r.append("defs").append("marker").attr("id",a+"_"+t+"-onlyOneEnd").attr("class","marker onlyOne "+t).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M3,0 L3,18 M9,0 L9,18")},"only_one"),jt=p((r,t,a)=>{let n=r.append("defs").append("marker").attr("id",a+"_"+t+"-zeroOrOneStart").attr("class","marker zeroOrOne "+t).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("d","M9,0 L9,18");let i=r.append("defs").append("marker").attr("id",a+"_"+t+"-zeroOrOneEnd").attr("class","marker zeroOrOne "+t).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),i.append("path").attr("d","M21,0 L21,18")},"zero_or_one"),Dt=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-oneOrMoreStart").attr("class","marker oneOrMore "+t).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),r.append("defs").append("marker").attr("id",a+"_"+t+"-oneOrMoreEnd").attr("class","marker oneOrMore "+t).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18")},"one_or_more"),Jt=p((r,t,a)=>{let n=r.append("defs").append("marker").attr("id",a+"_"+t+"-zeroOrMoreStart").attr("class","marker zeroOrMore "+t).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18");let i=r.append("defs").append("marker").attr("id",a+"_"+t+"-zeroOrMoreEnd").attr("class","marker zeroOrMore "+t).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),i.append("path").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},"zero_or_more"),Vt=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-requirement_arrowEnd").attr("refX",20).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("path").attr("d",`M0,0 - L20,10 - M20,10 - L0,20`)},"requirement_arrow"),Ft=p((r,t,a)=>{let n=r.append("defs").append("marker").attr("id",a+"_"+t+"-requirement_containsStart").attr("refX",0).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("g");n.append("circle").attr("cx",10).attr("cy",10).attr("r",9).attr("fill","none"),n.append("line").attr("x1",1).attr("x2",19).attr("y1",10).attr("y2",10),n.append("line").attr("y1",1).attr("y2",19).attr("x1",10).attr("x2",10)},"requirement_contains"),Gt={extension:Rt,composition:At,aggregation:zt,dependency:qt,lollipop:Ut,point:It,circle:Pt,cross:Nt,barb:Qt,only_one:Zt,zero_or_one:jt,one_or_more:Dt,zero_or_more:Jt,requirement_arrow:Vt,requirement_contains:Ft},hr=Ht;export{cr as a,dr as b,fr as c,pr as d,hr as e}; diff --git a/src/google/adk/cli/browser/chunk-TNYN2TVW.js b/src/google/adk/cli/browser/chunk-TNYN2TVW.js deleted file mode 100644 index f79ed23625..0000000000 --- a/src/google/adk/cli/browser/chunk-TNYN2TVW.js +++ /dev/null @@ -1,4 +0,0 @@ -import{a as W}from"./chunk-JDPVSVO4.js";import{a as S}from"./chunk-XMBKBASC.js";import{a as V,b as q,c as z,d as K,e as Q}from"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import{b as M,d as F,e as U,g as Y,h as H,i as j,j as B}from"./chunk-W7PRDKNL.js";import{a as T}from"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{Y as R}from"./chunk-QFMJV7VH.js";import{g,i}from"./chunk-JRNAXTJ7.js";import{J as C,e as G,v as _}from"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as P,b as A,j as b}from"./chunk-RMXJBC7V.js";function p(e){var t={options:{directed:e.isDirected(),multigraph:e.isMultigraph(),compound:e.isCompound()},nodes:re(e),edges:se(e)};return C(e.graph())||(t.value=G(e.graph())),t}function re(e){return _(e.nodes(),function(t){var n=e.node(t),a=e.parent(t),s={v:t};return C(n)||(s.value=n),C(a)||(s.parent=a),s})}function se(e){return _(e.edges(),function(t){var n=e.edge(t),a={v:t.v,w:t.w};return C(t.name)||(a.name=t.name),C(n)||(a.value=n),a})}var d=new Map,X=new Map,L=new Map,ae=g(()=>{X.clear(),L.clear(),d.clear()},"clear"),O=g((e,t)=>{let n=X.get(t)||[];return i.trace("In isDescendant",t," ",e," = ",n.includes(e)),n.includes(e)},"isDescendant"),ce=g((e,t)=>{let n=X.get(t)||[];return i.info("Descendants of ",t," is ",n),i.info("Edge is ",e),e.v===t||e.w===t?!1:n?n.includes(e.v)||O(e.v,t)||O(e.w,t)||n.includes(e.w):(i.debug("Tilt, ",t,",not in descendants"),!1)},"edgeInCluster"),I=g((e,t,n,a)=>{i.warn("Copying children of ",e,"root",a,"data",t.node(e),a);let s=t.children(e)||[];e!==a&&s.push(e),i.warn("Copying (nodes) clusterId",e,"nodes",s),s.forEach(o=>{if(t.children(o).length>0)I(o,t,n,a);else{let l=t.node(o);i.info("cp ",o," to ",a," with parent ",e),n.setNode(o,l),a!==t.parent(o)&&(i.warn("Setting parent",o,t.parent(o)),n.setParent(o,t.parent(o))),e!==a&&o!==e?(i.debug("Setting parent",o,e),n.setParent(o,e)):(i.info("In copy ",e,"root",a,"data",t.node(e),a),i.debug("Not Setting parent for node=",o,"cluster!==rootId",e!==a,"node!==clusterId",o!==e));let u=t.edges(o);i.debug("Copying Edges",u),u.forEach(c=>{i.info("Edge",c);let m=t.edge(c.v,c.w,c.name);i.info("Edge data",m,a);try{ce(c,a)?(i.info("Copying as ",c.v,c.w,m,c.name),n.setEdge(c.v,c.w,m,c.name),i.info("newGraph edges ",n.edges(),n.edge(n.edges()[0]))):i.info("Skipping copy of edge ",c.v,"-->",c.w," rootId: ",a," clusterId:",e)}catch(h){i.error(h)}})}i.debug("Removing node",o),t.removeNode(o)})},"copy"),ee=g((e,t)=>{let n=t.children(e),a=[...n];for(let s of n)L.set(s,e),a=[...a,...ee(s,t)];return a},"extractDescendants"),de=g((e,t,n)=>{let a=e.edges().filter(c=>c.v===t||c.w===t),s=e.edges().filter(c=>c.v===n||c.w===n),o=a.map(c=>({v:c.v===t?n:c.v,w:c.w===t?t:c.w})),l=s.map(c=>({v:c.v,w:c.w}));return o.filter(c=>l.some(m=>c.v===m.v&&c.w===m.w))},"findCommonEdges"),x=g((e,t,n)=>{let a=t.children(e);if(i.trace("Searching children of id ",e,a),a.length<1)return e;let s;for(let o of a){let l=x(o,t,n),u=de(t,n,l);if(l)if(u.length>0)s=l;else return l}return s},"findNonClusterChild"),$=g(e=>!d.has(e)||!d.get(e).externalConnections?e:d.has(e)?d.get(e).id:e,"getAnchorId"),le=g((e,t)=>{if(!e||t>10){i.debug("Opting out, no graph ");return}else i.debug("Opting in, graph ");e.nodes().forEach(function(n){e.children(n).length>0&&(i.warn("Cluster identified",n," Replacement id in edges: ",x(n,e,n)),X.set(n,ee(n,e)),d.set(n,{id:x(n,e,n),clusterData:e.node(n)}))}),e.nodes().forEach(function(n){let a=e.children(n),s=e.edges();a.length>0?(i.debug("Cluster identified",n,X),s.forEach(o=>{let l=O(o.v,n),u=O(o.w,n);l^u&&(i.warn("Edge: ",o," leaves cluster ",n),i.warn("Descendants of XXX ",n,": ",X.get(n)),d.get(n).externalConnections=!0)})):i.debug("Not a cluster ",n,X)});for(let n of d.keys()){let a=d.get(n).id,s=e.parent(a);s!==n&&d.has(s)&&!d.get(s).externalConnections&&(d.get(n).id=s)}e.edges().forEach(function(n){let a=e.edge(n);i.warn("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(n)),i.warn("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(e.edge(n)));let s=n.v,o=n.w;if(i.warn("Fix XXX",d,"ids:",n.v,n.w,"Translating: ",d.get(n.v)," --- ",d.get(n.w)),d.get(n.v)||d.get(n.w)){if(i.warn("Fixing and trying - removing XXX",n.v,n.w,n.name),s=$(n.v),o=$(n.w),e.removeEdge(n.v,n.w,n.name),s!==n.v){let l=e.parent(s);d.get(l).externalConnections=!0,a.fromCluster=n.v}if(o!==n.w){let l=e.parent(o);d.get(l).externalConnections=!0,a.toCluster=n.w}i.warn("Fix Replacing with XXX",s,o,n.name),e.setEdge(s,o,a,n.name)}}),i.warn("Adjusted Graph",p(e)),ne(e,0),i.trace(d)},"adjustClustersAndEdges"),ne=g((e,t)=>{if(i.warn("extractor - ",t,p(e),e.children("D")),t>10){i.error("Bailing out");return}let n=e.nodes(),a=!1;for(let s of n){let o=e.children(s);a=a||o.length>0}if(!a){i.debug("Done, no node has children",e.nodes());return}i.debug("Nodes = ",n,t);for(let s of n)if(i.debug("Extracting node",s,d,d.has(s)&&!d.get(s).externalConnections,!e.parent(s),e.node(s),e.children("D")," Depth ",t),!d.has(s))i.debug("Not a cluster",s,t);else if(!d.get(s).externalConnections&&e.children(s)&&e.children(s).length>0){i.warn("Cluster without external connections, without a parent and with children",s,t);let l=e.graph().rankdir==="TB"?"LR":"TB";d.get(s)?.clusterData?.dir&&(l=d.get(s).clusterData.dir,i.warn("Fixing dir",d.get(s).clusterData.dir,l));let u=new S({multigraph:!0,compound:!0}).setGraph({rankdir:l,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});i.warn("Old graph before copy",p(e)),I(s,e,u,s),e.setNode(s,{clusterNode:!0,id:s,clusterData:d.get(s).clusterData,label:d.get(s).label,graph:u}),i.warn("New graph after copy node: (",s,")",p(u)),i.debug("Old graph after copy",p(e))}else i.warn("Cluster ** ",s," **not meeting the criteria !externalConnections:",!d.get(s).externalConnections," no parent: ",!e.parent(s)," children ",e.children(s)&&e.children(s).length>0,e.children("D"),t),i.debug(d);n=e.nodes(),i.warn("New list of nodes",n);for(let s of n){let o=e.node(s);i.warn(" Now next level",s,o),o?.clusterNode&&ne(o.graph,t+1)}},"extractor"),te=g((e,t)=>{if(t.length===0)return[];let n=Object.assign([],t);return t.forEach(a=>{let s=e.children(a),o=te(e,s);n=[...n,...o]}),n},"sorter"),fe=g(e=>te(e,e.children()),"sortNodesByHierarchy"),ie=g((e,t,n,a,s,o)=>b(null,null,function*(){i.warn("Graph in recursive render:XAX",p(t),s);let l=t.graph().rankdir;i.trace("Dir in recursive render - dir:",l);let u=e.insert("g").attr("class","root");t.nodes()?i.info("Recursive render XXX",t.nodes()):i.info("No nodes found for",t),t.edges().length>0&&i.info("Recursive edges",t.edge(t.edges()[0]));let c=u.insert("g").attr("class","clusters"),m=u.insert("g").attr("class","edgePaths"),h=u.insert("g").attr("class","edgeLabels"),v=u.insert("g").attr("class","nodes");yield Promise.all(t.nodes().map(function(f){return b(this,null,function*(){let r=t.node(f);if(s!==void 0){let w=JSON.parse(JSON.stringify(s.clusterData));i.trace(`Setting data for parent cluster XXX - Node.id = `,f,` - data=`,w.height,` -Parent cluster`,s.height),t.setNode(s.id,w),t.parent(f)||(i.trace("Setting parent",f,s.id),t.setParent(f,s.id,w))}if(i.info("(Insert) Node XXX"+f+": "+JSON.stringify(t.node(f))),r?.clusterNode){i.info("Cluster identified XBX",f,r.width,t.node(f));let{ranksep:w,nodesep:N}=t.graph();r.graph.setGraph(A(P({},r.graph.graph()),{ranksep:w+25,nodesep:N}));let y=yield ie(v,r.graph,n,a,t.node(f),o),J=y.elem;M(r,J),r.diff=y.diff||0,i.info("New compound node after recursive render XAX",f,"width",r.width,"height",r.height),H(J,r)}else t.children(f).length>0?(i.trace("Cluster - the non recursive path XBX",f,r.id,r,r.width,"Graph:",t),i.trace(x(r.id,t)),d.set(r.id,{id:x(r.id,t),node:r})):(i.trace("Node - the non recursive path XAX",f,v,t.node(f),l),yield Y(v,t.node(f),{config:o,dir:l}))})})),yield g(()=>b(null,null,function*(){let f=t.edges().map(function(r){return b(this,null,function*(){let w=t.edge(r.v,r.w,r.name);i.info("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(r)),i.info("Edge "+r.v+" -> "+r.w+": ",r," ",JSON.stringify(t.edge(r))),i.info("Fix",d,"ids:",r.v,r.w,"Translating: ",d.get(r.v),d.get(r.w)),yield q(h,w)})});yield Promise.all(f)}),"processEdges")(),i.info("Graph before layout:",JSON.stringify(p(t))),i.info("############################################# XXX"),i.info("### Layout ### XXX"),i.info("############################################# XXX"),W(t),i.info("Graph after layout:",JSON.stringify(p(t)));let k=0,{subGraphTitleTotalMargin:D}=T(o);return yield Promise.all(fe(t).map(function(f){return b(this,null,function*(){let r=t.node(f);if(i.info("Position XBX => "+f+": ("+r.x,","+r.y,") width: ",r.width," height: ",r.height),r?.clusterNode)r.y+=D,i.info("A tainted cluster node XBX1",f,r.id,r.width,r.height,r.x,r.y,t.parent(f)),d.get(r.id).node=r,B(r);else if(t.children(f).length>0){i.info("A pure cluster node XBX1",f,r.id,r.x,r.y,r.width,r.height,t.parent(f)),r.height+=D,t.node(r.parentId);let w=r?.padding/2||0,N=r?.labelBBox?.height||0,y=N-w||0;i.debug("OffsetY",y,"labelHeight",N,"halfPadding",w),yield F(c,r),d.get(r.id).node=r}else{let w=t.node(r.parentId);r.y+=D/2,i.info("A regular node XBX1 - using the padding",r.id,"parent",r.parentId,r.width,r.height,r.x,r.y,"offsetY",r.offsetY,"parent",w,w?.offsetY,r),B(r)}})})),t.edges().forEach(function(f){let r=t.edge(f);i.info("Edge "+f.v+" -> "+f.w+": "+JSON.stringify(r),r),r.points.forEach(J=>J.y+=D/2);let w=t.node(f.v);var N=t.node(f.w);let y=K(m,r,d,n,w,N,a);z(r,y)}),t.nodes().forEach(function(f){let r=t.node(f);i.info(f,r.type,r.diff),r.isGroup&&(k=r.diff)}),i.warn("Returning from recursive render XAX",u,k),{elem:u,diff:k}}),"recursiveRender"),Se=g((e,t)=>b(null,null,function*(){let n=new S({multigraph:!0,compound:!0}).setGraph({rankdir:e.direction,nodesep:e.config?.nodeSpacing||e.config?.flowchart?.nodeSpacing||e.nodeSpacing,ranksep:e.config?.rankSpacing||e.config?.flowchart?.rankSpacing||e.rankSpacing,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}}),a=t.select("g");Q(a,e.markers,e.type,e.diagramId),j(),V(),U(),ae(),e.nodes.forEach(o=>{n.setNode(o.id,P({},o)),o.parentId&&n.setParent(o.id,o.parentId)}),i.debug("Edges:",e.edges),e.edges.forEach(o=>{if(o.start===o.end){let l=o.start,u=l+"---"+l+"---1",c=l+"---"+l+"---2",m=n.node(l);n.setNode(u,{domId:u,id:u,parentId:m.parentId,labelStyle:"",label:"",padding:0,shape:"labelRect",style:"",width:10,height:10}),n.setParent(u,m.parentId),n.setNode(c,{domId:c,id:c,parentId:m.parentId,labelStyle:"",padding:0,shape:"labelRect",label:"",style:"",width:10,height:10}),n.setParent(c,m.parentId);let h=structuredClone(o),v=structuredClone(o),E=structuredClone(o);h.label="",h.arrowTypeEnd="none",h.id=l+"-cyclic-special-1",v.arrowTypeStart="none",v.arrowTypeEnd="none",v.id=l+"-cyclic-special-mid",E.label="",m.isGroup&&(h.fromCluster=l,E.toCluster=l),E.id=l+"-cyclic-special-2",E.arrowTypeStart="none",n.setEdge(l,u,h,l+"-cyclic-special-0"),n.setEdge(u,c,v,l+"-cyclic-special-1"),n.setEdge(c,l,E,l+"-cyc{let{securityLevel:c}=s(),o=e("body");if(c==="sandbox"){let m=e(`#i${t}`).node()?.contentDocument??document;o=e(m.body)}return o.select(`#${t}`)},"selectSvgElement");export{a}; diff --git a/src/google/adk/cli/browser/chunk-UWBTGTN5.js b/src/google/adk/cli/browser/chunk-UWBTGTN5.js deleted file mode 100644 index 700eef53ac..0000000000 --- a/src/google/adk/cli/browser/chunk-UWBTGTN5.js +++ /dev/null @@ -1,24 +0,0 @@ -import{a as de}from"./chunk-DMWOYWYQ.js";import{a as he}from"./chunk-T3Q3QCCV.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import{a as pe}from"./chunk-ST54LLJ3.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{a as ie}from"./chunk-TPDTRWWV.js";import{c as ce,d as T}from"./chunk-VDPKVNDJ.js";import{l as G}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as O,N as Q,R as Z,S as ee,T as te,U as ae,V as le,W as se,X as re,r as K}from"./chunk-QFMJV7VH.js";import{a as D,g as d,i as H,o as F,p as ne,q as oe,r as R}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as I,j as J}from"./chunk-RMXJBC7V.js";var me=class{constructor(){this.nodes=[],this.levels=new Map,this.outerNodes=[],this.classes=new Map,this.setAccTitle=ee,this.getAccTitle=te,this.setDiagramTitle=se,this.getDiagramTitle=re,this.getAccDescription=le,this.setAccDescription=ae}static{d(this,"TreeMapDB")}getNodes(){return this.nodes}getConfig(){let s=K,a=O();return G(I(I({},s.treemap),a.treemap??{}))}addNode(s,a){this.nodes.push(s),this.levels.set(s,a),a===0&&(this.outerNodes.push(s),this.root??=s)}getRoot(){return{name:"",children:this.outerNodes}}addClass(s,a){let o=this.classes.get(s)??{id:s,styles:[],textStyles:[]},i=a.replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");i&&i.forEach(p=>{ce(p)&&(o?.textStyles?o.textStyles.push(p):o.textStyles=[p]),o?.styles?o.styles.push(p):o.styles=[p]}),this.classes.set(s,o)}getClasses(){return this.classes}getStylesForClass(s){return this.classes.get(s)?.styles??[]}clear(){Z(),this.nodes=[],this.levels=new Map,this.outerNodes=[],this.classes=new Map,this.root=void 0}};function ue(s){if(!s.length)return[];let a=[],o=[];return s.forEach(i=>{let p={name:i.name,children:i.type==="Leaf"?void 0:[]};for(p.classSelector=i?.classSelector,i?.cssCompiledStyles&&(p.cssCompiledStyles=i.cssCompiledStyles),i.type==="Leaf"&&i.value!==void 0&&(p.value=i.value);o.length>0&&o[o.length-1].level>=i.level;)o.pop();if(o.length===0)a.push(p);else{let n=o[o.length-1].node;n.children?n.children.push(p):n.children=[p]}i.type!=="Leaf"&&o.push({node:p,level:i.level})}),a}d(ue,"buildHierarchy");var we=d((s,a)=>{de(s,a);let o=[];for(let n of s.TreemapRows??[])n.$type==="ClassDefStatement"&&a.addClass(n.className??"",n.styleText??"");for(let n of s.TreemapRows??[]){let h=n.item;if(!h)continue;let u=n.indent?parseInt(n.indent):0,V=Te(h),l=h.classSelector?a.getStylesForClass(h.classSelector):[],N=l.length>0?l:void 0,v={level:u,name:V,type:h.$type,value:h.value,classSelector:h.classSelector,cssCompiledStyles:N};o.push(v)}let i=ue(o),p=d((n,h)=>{for(let u of n)a.addNode(u,h),u.children&&u.children.length>0&&p(u.children,h+1)},"addNodesRecursively");p(i,0)},"populate"),Te=d(s=>s.name?String(s.name):"","getItemName"),fe={parser:{yy:void 0},parse:d(s=>J(null,null,function*(){try{let o=yield he("treemap",s);H.debug("Treemap AST:",o);let i=fe.parser?.yy;if(!(i instanceof me))throw new Error("parser.parser?.yy was not a TreemapDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");we(o,i)}catch(a){throw H.error("Error parsing treemap:",a),a}}),"parse")},Le=10,z=10,M=25,$e=d((s,a,o,i)=>{let p=i.db,n=p.getConfig(),h=n.padding??Le,u=p.getDiagramTitle(),V=p.getRoot(),{themeVariables:l}=O();if(!V)return;let N=u?30:0,v=ie(a),X=n.nodeWidth?n.nodeWidth*z:960,Y=n.nodeHeight?n.nodeHeight*z:500,B=X,j=Y+N;v.attr("viewBox",`0 0 ${B} ${j}`),Q(v,j,B,n.useMaxWidth);let C;try{let e=n.valueFormat||",";if(e==="$0,0")C=d(t=>"$"+F(",")(t),"valueFormat");else if(e.startsWith("$")&&e.includes(",")){let t=/\.\d+/.exec(e),r=t?t[0]:"";C=d(m=>"$"+F(","+r)(m),"valueFormat")}else if(e.startsWith("$")){let t=e.substring(1);C=d(r=>"$"+F(t||"")(r),"valueFormat")}else C=F(e)}catch(e){H.error("Error creating format function:",e),C=F(",")}let A=R().range(["transparent",l.cScale0,l.cScale1,l.cScale2,l.cScale3,l.cScale4,l.cScale5,l.cScale6,l.cScale7,l.cScale8,l.cScale9,l.cScale10,l.cScale11]),ye=R().range(["transparent",l.cScalePeer0,l.cScalePeer1,l.cScalePeer2,l.cScalePeer3,l.cScalePeer4,l.cScalePeer5,l.cScalePeer6,l.cScalePeer7,l.cScalePeer8,l.cScalePeer9,l.cScalePeer10,l.cScalePeer11]),W=R().range([l.cScaleLabel0,l.cScaleLabel1,l.cScaleLabel2,l.cScaleLabel3,l.cScaleLabel4,l.cScaleLabel5,l.cScaleLabel6,l.cScaleLabel7,l.cScaleLabel8,l.cScaleLabel9,l.cScaleLabel10,l.cScaleLabel11]);u&&v.append("text").attr("x",B/2).attr("y",N/2).attr("class","treemapTitle").attr("text-anchor","middle").attr("dominant-baseline","middle").text(u);let U=v.append("g").attr("transform",`translate(0, ${N})`).attr("class","treemapContainer"),ge=ne(V).sum(e=>e.value??0).sort((e,t)=>(t.value??0)-(e.value??0)),q=oe().size([X,Y]).paddingTop(e=>e.children&&e.children.length>0?M+z:0).paddingInner(h).paddingLeft(e=>e.children&&e.children.length>0?z:0).paddingRight(e=>e.children&&e.children.length>0?z:0).paddingBottom(e=>e.children&&e.children.length>0?z:0).round(!0)(ge),Se=q.descendants().filter(e=>e.children&&e.children.length>0),k=U.selectAll(".treemapSection").data(Se).enter().append("g").attr("class","treemapSection").attr("transform",e=>`translate(${e.x0},${e.y0})`);k.append("rect").attr("width",e=>e.x1-e.x0).attr("height",M).attr("class","treemapSectionHeader").attr("fill","none").attr("fill-opacity",.6).attr("stroke-width",.6).attr("style",e=>e.depth===0?"display: none;":""),k.append("clipPath").attr("id",(e,t)=>`clip-section-${a}-${t}`).append("rect").attr("width",e=>Math.max(0,e.x1-e.x0-12)).attr("height",M),k.append("rect").attr("width",e=>e.x1-e.x0).attr("height",e=>e.y1-e.y0).attr("class",(e,t)=>`treemapSection section${t}`).attr("fill",e=>A(e.data.name)).attr("fill-opacity",.6).attr("stroke",e=>ye(e.data.name)).attr("stroke-width",2).attr("stroke-opacity",.4).attr("style",e=>{if(e.depth===0)return"display: none;";let t=T({cssCompiledStyles:e.data.cssCompiledStyles});return t.nodeStyles+";"+t.borderStyles.join(";")}),k.append("text").attr("class","treemapSectionLabel").attr("x",6).attr("y",M/2).attr("dominant-baseline","middle").text(e=>e.depth===0?"":e.data.name).attr("font-weight","bold").attr("style",e=>{if(e.depth===0)return"display: none;";let t="dominant-baseline: middle; font-size: 12px; fill:"+W(e.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;",r=T({cssCompiledStyles:e.data.cssCompiledStyles});return t+r.labelStyles.replace("color:","fill:")}).each(function(e){if(e.depth===0)return;let t=D(this),r=e.data.name;t.text(r);let m=e.x1-e.x0,g=6,S;n.showValues!==!1&&e.value?S=m-10-30-10-g:S=m-g-6;let f=Math.max(15,S),c=t.node();if(c.getComputedTextLength()>f){let y=r;for(;y.length>0;){if(y=r.substring(0,y.length-1),y.length===0){t.text("..."),c.getComputedTextLength()>f&&t.text("");break}if(t.text(y+"..."),c.getComputedTextLength()<=f)break}}}),n.showValues!==!1&&k.append("text").attr("class","treemapSectionValue").attr("x",e=>e.x1-e.x0-10).attr("y",M/2).attr("text-anchor","end").attr("dominant-baseline","middle").text(e=>e.value?C(e.value):"").attr("font-style","italic").attr("style",e=>{if(e.depth===0)return"display: none;";let t="text-anchor: end; dominant-baseline: middle; font-size: 10px; fill:"+W(e.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;",r=T({cssCompiledStyles:e.data.cssCompiledStyles});return t+r.labelStyles.replace("color:","fill:")});let xe=q.leaves(),E=U.selectAll(".treemapLeafGroup").data(xe).enter().append("g").attr("class",(e,t)=>`treemapNode treemapLeafGroup leaf${t}${e.data.classSelector?` ${e.data.classSelector}`:""}x`).attr("transform",e=>`translate(${e.x0},${e.y0})`);E.append("rect").attr("width",e=>e.x1-e.x0).attr("height",e=>e.y1-e.y0).attr("class","treemapLeaf").attr("fill",e=>e.parent?A(e.parent.data.name):A(e.data.name)).attr("style",e=>T({cssCompiledStyles:e.data.cssCompiledStyles}).nodeStyles).attr("fill-opacity",.3).attr("stroke",e=>e.parent?A(e.parent.data.name):A(e.data.name)).attr("stroke-width",3),E.append("clipPath").attr("id",(e,t)=>`clip-${a}-${t}`).append("rect").attr("width",e=>Math.max(0,e.x1-e.x0-4)).attr("height",e=>Math.max(0,e.y1-e.y0-4)),E.append("text").attr("class","treemapLabel").attr("x",e=>(e.x1-e.x0)/2).attr("y",e=>(e.y1-e.y0)/2).attr("style",e=>{let t="text-anchor: middle; dominant-baseline: middle; font-size: 38px;fill:"+W(e.data.name)+";",r=T({cssCompiledStyles:e.data.cssCompiledStyles});return t+r.labelStyles.replace("color:","fill:")}).attr("clip-path",(e,t)=>`url(#clip-${a}-${t})`).text(e=>e.data.name).each(function(e){let t=D(this),r=e.x1-e.x0,m=e.y1-e.y0,g=t.node(),S=4,L=r-2*S,f=m-2*S;if(L<10||f<10){t.style("display","none");return}let c=parseInt(t.style("font-size"),10),w=8,x=28,y=.6,b=6,P=2;for(;g.getComputedTextLength()>L&&c>w;)c--,t.style("font-size",`${c}px`);let $=Math.max(b,Math.min(x,Math.round(c*y))),_=c+P+$;for(;_>f&&c>w&&(c--,$=Math.max(b,Math.min(x,Math.round(c*y))),!($f;t.style("font-size",`${c}px`),(g.getComputedTextLength()>L||c(t.x1-t.x0)/2).attr("y",function(t){return(t.y1-t.y0)/2}).attr("style",t=>{let r="text-anchor: middle; dominant-baseline: hanging; font-size: 28px;fill:"+W(t.data.name)+";",m=T({cssCompiledStyles:t.data.cssCompiledStyles});return r+m.labelStyles.replace("color:","fill:")}).attr("clip-path",(t,r)=>`url(#clip-${a}-${r})`).text(t=>t.value?C(t.value):"").each(function(t){let r=D(this),m=this.parentNode;if(!m){r.style("display","none");return}let g=D(m).select(".treemapLabel");if(g.empty()||g.style("display")==="none"){r.style("display","none");return}let S=parseFloat(g.style("font-size")),L=28,f=.6,c=6,w=2,x=Math.max(c,Math.min(L,Math.round(S*f)));r.style("font-size",`${x}px`);let b=(t.y1-t.y0)/2+S/2+w;r.attr("y",b);let P=t.x1-t.x0,ve=t.y1-t.y0-4,Ce=P-8;r.node().getComputedTextLength()>Ce||b+x>ve||x{let a=G(Ne,s);return` - .treemapNode.section { - stroke: ${a.sectionStrokeColor}; - stroke-width: ${a.sectionStrokeWidth}; - fill: ${a.sectionFillColor}; - } - .treemapNode.leaf { - stroke: ${a.leafStrokeColor}; - stroke-width: ${a.leafStrokeWidth}; - fill: ${a.leafFillColor}; - } - .treemapLabel { - fill: ${a.labelColor}; - font-size: ${a.labelFontSize}; - } - .treemapValue { - fill: ${a.valueColor}; - font-size: ${a.valueFontSize}; - } - .treemapTitle { - fill: ${a.titleColor}; - font-size: ${a.titleFontSize}; - } - `},"getStyles"),ke=Ae,Oe={parser:fe,get db(){return new me},renderer:ze,styles:ke};export{Oe as diagram}; diff --git a/src/google/adk/cli/browser/chunk-V2DCVTQX.js b/src/google/adk/cli/browser/chunk-V2DCVTQX.js deleted file mode 100644 index 0b2c747212..0000000000 --- a/src/google/adk/cli/browser/chunk-V2DCVTQX.js +++ /dev/null @@ -1,7 +0,0 @@ -import{G as re,N as se,R as oe,S as le,T as he,U as ce,V as de,W as ue,X as Dt,Y as qt,p as ne,r as L}from"./chunk-QFMJV7VH.js";import{a as mt,g as s,i as dt,t as zt}from"./chunk-JRNAXTJ7.js";import{a as Q}from"./chunk-RMXJBC7V.js";var Vt=(function(){var t=s(function(Y,r,l,u){for(l=l||{},u=Y.length;u--;l[Y[u]]=r);return l},"o"),a=[1,3],p=[1,4],f=[1,5],o=[1,6],x=[1,7],_=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],h=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],c=[55,56,57],k=[2,36],m=[1,37],q=[1,36],y=[1,38],b=[1,35],T=[1,43],g=[1,41],ot=[1,14],ut=[1,23],xt=[1,18],ft=[1,19],gt=[1,20],lt=[1,21],_t=[1,22],ht=[1,24],i=[1,25],wt=[1,26],Bt=[1,27],Rt=[1,28],Nt=[1,29],W=[1,32],U=[1,33],A=[1,34],F=[1,39],P=[1,40],v=[1,42],C=[1,44],H=[1,62],X=[1,61],E=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],Wt=[1,65],Ut=[1,66],Qt=[1,67],Ot=[1,68],Ht=[1,69],Xt=[1,70],Mt=[1,71],Yt=[1,72],jt=[1,73],Gt=[1,74],Kt=[1,75],Zt=[1,76],w=[4,5,6,7,8,9,10,11,12,13,14,15,18],K=[1,90],Z=[1,91],J=[1,92],$=[1,99],tt=[1,93],et=[1,96],it=[1,94],at=[1,95],nt=[1,97],rt=[1,98],At=[1,102],Jt=[10,55,56,57],R=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],Ft={trace:s(function(){},"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:s(function(r,l,u,d,S,e,ct){var n=e.length-1;switch(S){case 23:this.$=e[n];break;case 24:this.$=e[n-1]+""+e[n];break;case 26:this.$=e[n-1]+e[n];break;case 27:this.$=[e[n].trim()];break;case 28:e[n-2].push(e[n].trim()),this.$=e[n-2];break;case 29:this.$=e[n-4],d.addClass(e[n-2],e[n]);break;case 37:this.$=[];break;case 42:this.$=e[n].trim(),d.setDiagramTitle(this.$);break;case 43:this.$=e[n].trim(),d.setAccTitle(this.$);break;case 44:case 45:this.$=e[n].trim(),d.setAccDescription(this.$);break;case 46:d.addSection(e[n].substr(8)),this.$=e[n].substr(8);break;case 47:d.addPoint(e[n-3],"",e[n-1],e[n],[]);break;case 48:d.addPoint(e[n-4],e[n-3],e[n-1],e[n],[]);break;case 49:d.addPoint(e[n-4],"",e[n-2],e[n-1],e[n]);break;case 50:d.addPoint(e[n-5],e[n-4],e[n-2],e[n-1],e[n]);break;case 51:d.setXAxisLeftText(e[n-2]),d.setXAxisRightText(e[n]);break;case 52:e[n-1].text+=" \u27F6 ",d.setXAxisLeftText(e[n-1]);break;case 53:d.setXAxisLeftText(e[n]);break;case 54:d.setYAxisBottomText(e[n-2]),d.setYAxisTopText(e[n]);break;case 55:e[n-1].text+=" \u27F6 ",d.setYAxisBottomText(e[n-1]);break;case 56:d.setYAxisBottomText(e[n]);break;case 57:d.setQuadrant1Text(e[n]);break;case 58:d.setQuadrant2Text(e[n]);break;case 59:d.setQuadrant3Text(e[n]);break;case 60:d.setQuadrant4Text(e[n]);break;case 64:this.$={text:e[n],type:"text"};break;case 65:this.$={text:e[n-1].text+""+e[n],type:e[n-1].type};break;case 66:this.$={text:e[n],type:"text"};break;case 67:this.$={text:e[n],type:"markdown"};break;case 68:this.$=e[n];break;case 69:this.$=e[n-1]+""+e[n];break}},"anonymous"),table:[{18:a,26:1,27:2,28:p,55:f,56:o,57:x},{1:[3]},{18:a,26:8,27:2,28:p,55:f,56:o,57:x},{18:a,26:9,27:2,28:p,55:f,56:o,57:x},t(_,[2,33],{29:10}),t(h,[2,61]),t(h,[2,62]),t(h,[2,63]),{1:[2,30]},{1:[2,31]},t(c,k,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:m,5:q,10:y,12:b,13:T,14:g,18:ot,25:ut,35:xt,37:ft,39:gt,41:lt,42:_t,48:ht,50:i,51:wt,52:Bt,53:Rt,54:Nt,60:W,61:U,63:A,64:F,65:P,66:v,67:C}),t(_,[2,34]),{27:45,55:f,56:o,57:x},t(c,[2,37]),t(c,k,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:m,5:q,10:y,12:b,13:T,14:g,18:ot,25:ut,35:xt,37:ft,39:gt,41:lt,42:_t,48:ht,50:i,51:wt,52:Bt,53:Rt,54:Nt,60:W,61:U,63:A,64:F,65:P,66:v,67:C}),t(c,[2,39]),t(c,[2,40]),t(c,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(c,[2,45]),t(c,[2,46]),{18:[1,50]},{4:m,5:q,10:y,12:b,13:T,14:g,43:51,58:31,60:W,61:U,63:A,64:F,65:P,66:v,67:C},{4:m,5:q,10:y,12:b,13:T,14:g,43:52,58:31,60:W,61:U,63:A,64:F,65:P,66:v,67:C},{4:m,5:q,10:y,12:b,13:T,14:g,43:53,58:31,60:W,61:U,63:A,64:F,65:P,66:v,67:C},{4:m,5:q,10:y,12:b,13:T,14:g,43:54,58:31,60:W,61:U,63:A,64:F,65:P,66:v,67:C},{4:m,5:q,10:y,12:b,13:T,14:g,43:55,58:31,60:W,61:U,63:A,64:F,65:P,66:v,67:C},{4:m,5:q,10:y,12:b,13:T,14:g,43:56,58:31,60:W,61:U,63:A,64:F,65:P,66:v,67:C},{4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,44:[1,57],47:[1,58],58:60,59:59,63:A,64:F,65:P,66:v,67:C},t(E,[2,64]),t(E,[2,66]),t(E,[2,67]),t(E,[2,70]),t(E,[2,71]),t(E,[2,72]),t(E,[2,73]),t(E,[2,74]),t(E,[2,75]),t(E,[2,76]),t(E,[2,77]),t(E,[2,78]),t(E,[2,79]),t(E,[2,80]),t(_,[2,35]),t(c,[2,38]),t(c,[2,42]),t(c,[2,43]),t(c,[2,44]),{3:64,4:Wt,5:Ut,6:Qt,7:Ot,8:Ht,9:Xt,10:Mt,11:Yt,12:jt,13:Gt,14:Kt,15:Zt,21:63},t(c,[2,53],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,49:[1,77],63:A,64:F,65:P,66:v,67:C}),t(c,[2,56],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,49:[1,78],63:A,64:F,65:P,66:v,67:C}),t(c,[2,57],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,63:A,64:F,65:P,66:v,67:C}),t(c,[2,58],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,63:A,64:F,65:P,66:v,67:C}),t(c,[2,59],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,63:A,64:F,65:P,66:v,67:C}),t(c,[2,60],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,63:A,64:F,65:P,66:v,67:C}),{45:[1,79]},{44:[1,80]},t(E,[2,65]),t(E,[2,81]),t(E,[2,82]),t(E,[2,83]),{3:82,4:Wt,5:Ut,6:Qt,7:Ot,8:Ht,9:Xt,10:Mt,11:Yt,12:jt,13:Gt,14:Kt,15:Zt,18:[1,81]},t(w,[2,23]),t(w,[2,1]),t(w,[2,2]),t(w,[2,3]),t(w,[2,4]),t(w,[2,5]),t(w,[2,6]),t(w,[2,7]),t(w,[2,8]),t(w,[2,9]),t(w,[2,10]),t(w,[2,11]),t(w,[2,12]),t(c,[2,52],{58:31,43:83,4:m,5:q,10:y,12:b,13:T,14:g,60:W,61:U,63:A,64:F,65:P,66:v,67:C}),t(c,[2,55],{58:31,43:84,4:m,5:q,10:y,12:b,13:T,14:g,60:W,61:U,63:A,64:F,65:P,66:v,67:C}),{46:[1,85]},{45:[1,86]},{4:K,5:Z,6:J,8:$,11:tt,13:et,16:89,17:it,18:at,19:nt,20:rt,22:88,23:87},t(w,[2,24]),t(c,[2,51],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,63:A,64:F,65:P,66:v,67:C}),t(c,[2,54],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,63:A,64:F,65:P,66:v,67:C}),t(c,[2,47],{22:88,16:89,23:100,4:K,5:Z,6:J,8:$,11:tt,13:et,17:it,18:at,19:nt,20:rt}),{46:[1,101]},t(c,[2,29],{10:At}),t(Jt,[2,27],{16:103,4:K,5:Z,6:J,8:$,11:tt,13:et,17:it,18:at,19:nt,20:rt}),t(R,[2,25]),t(R,[2,13]),t(R,[2,14]),t(R,[2,15]),t(R,[2,16]),t(R,[2,17]),t(R,[2,18]),t(R,[2,19]),t(R,[2,20]),t(R,[2,21]),t(R,[2,22]),t(c,[2,49],{10:At}),t(c,[2,48],{22:88,16:89,23:104,4:K,5:Z,6:J,8:$,11:tt,13:et,17:it,18:at,19:nt,20:rt}),{4:K,5:Z,6:J,8:$,11:tt,13:et,16:89,17:it,18:at,19:nt,20:rt,22:105},t(R,[2,26]),t(c,[2,50],{10:At}),t(Jt,[2,28],{16:103,4:K,5:Z,6:J,8:$,11:tt,13:et,17:it,18:at,19:nt,20:rt})],defaultActions:{8:[2,30],9:[2,31]},parseError:s(function(r,l){if(l.recoverable)this.trace(r);else{var u=new Error(r);throw u.hash=l,u}},"parseError"),parse:s(function(r){var l=this,u=[0],d=[],S=[null],e=[],ct=this.table,n="",yt=0,$t=0,te=0,Ce=2,ee=1,Le=e.slice.call(arguments,1),D=Object.create(this.lexer),j={yy:{}};for(var Pt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Pt)&&(j.yy[Pt]=this.yy[Pt]);D.setInput(r,j.yy),j.yy.lexer=D,j.yy.parser=this,typeof D.yylloc>"u"&&(D.yylloc={});var vt=D.yylloc;e.push(vt);var Ee=D.options&&D.options.ranges;typeof j.yy.parseError=="function"?this.parseError=j.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function De(B){u.length=u.length-2*B,S.length=S.length-B,e.length=e.length-B}s(De,"popStack");function ie(){var B;return B=d.pop()||D.lex()||ee,typeof B!="number"&&(B instanceof Array&&(d=B,B=d.pop()),B=l.symbols_[B]||B),B}s(ie,"lex");for(var V,Ct,G,N,We,Lt,st={},bt,M,ae,Tt;;){if(G=u[u.length-1],this.defaultActions[G]?N=this.defaultActions[G]:((V===null||typeof V>"u")&&(V=ie()),N=ct[G]&&ct[G][V]),typeof N>"u"||!N.length||!N[0]){var Et="";Tt=[];for(bt in ct[G])this.terminals_[bt]&&bt>Ce&&Tt.push("'"+this.terminals_[bt]+"'");D.showPosition?Et="Parse error on line "+(yt+1)+`: -`+D.showPosition()+` -Expecting `+Tt.join(", ")+", got '"+(this.terminals_[V]||V)+"'":Et="Parse error on line "+(yt+1)+": Unexpected "+(V==ee?"end of input":"'"+(this.terminals_[V]||V)+"'"),this.parseError(Et,{text:D.match,token:this.terminals_[V]||V,line:D.yylineno,loc:vt,expected:Tt})}if(N[0]instanceof Array&&N.length>1)throw new Error("Parse Error: multiple actions possible at state: "+G+", token: "+V);switch(N[0]){case 1:u.push(V),S.push(D.yytext),e.push(D.yylloc),u.push(N[1]),V=null,Ct?(V=Ct,Ct=null):($t=D.yyleng,n=D.yytext,yt=D.yylineno,vt=D.yylloc,te>0&&te--);break;case 2:if(M=this.productions_[N[1]][1],st.$=S[S.length-M],st._$={first_line:e[e.length-(M||1)].first_line,last_line:e[e.length-1].last_line,first_column:e[e.length-(M||1)].first_column,last_column:e[e.length-1].last_column},Ee&&(st._$.range=[e[e.length-(M||1)].range[0],e[e.length-1].range[1]]),Lt=this.performAction.apply(st,[n,$t,yt,j.yy,N[1],S,e].concat(Le)),typeof Lt<"u")return Lt;M&&(u=u.slice(0,-1*M*2),S=S.slice(0,-1*M),e=e.slice(0,-1*M)),u.push(this.productions_[N[1]][0]),S.push(st.$),e.push(st._$),ae=ct[u[u.length-2]][u[u.length-1]],u.push(ae);break;case 3:return!0}}return!0},"parse")},ve=(function(){var Y={EOF:1,parseError:s(function(l,u){if(this.yy.parser)this.yy.parser.parseError(l,u);else throw new Error(l)},"parseError"),setInput:s(function(r,l){return this.yy=l||this.yy||{},this._input=r,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:s(function(){var r=this._input[0];this.yytext+=r,this.yyleng++,this.offset++,this.match+=r,this.matched+=r;var l=r.match(/(?:\r\n?|\n).*/g);return l?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),r},"input"),unput:s(function(r){var l=r.length,u=r.split(/(?:\r\n?|\n)/g);this._input=r+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-l),this.offset-=l;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),u.length-1&&(this.yylineno-=u.length-1);var S=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:u?(u.length===d.length?this.yylloc.first_column:0)+d[d.length-u.length].length-u[0].length:this.yylloc.first_column-l},this.options.ranges&&(this.yylloc.range=[S[0],S[0]+this.yyleng-l]),this.yyleng=this.yytext.length,this},"unput"),more:s(function(){return this._more=!0,this},"more"),reject:s(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:s(function(r){this.unput(this.match.slice(r))},"less"),pastInput:s(function(){var r=this.matched.substr(0,this.matched.length-this.match.length);return(r.length>20?"...":"")+r.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:s(function(){var r=this.match;return r.length<20&&(r+=this._input.substr(0,20-r.length)),(r.substr(0,20)+(r.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:s(function(){var r=this.pastInput(),l=new Array(r.length+1).join("-");return r+this.upcomingInput()+` -`+l+"^"},"showPosition"),test_match:s(function(r,l){var u,d,S;if(this.options.backtrack_lexer&&(S={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(S.yylloc.range=this.yylloc.range.slice(0))),d=r[0].match(/(?:\r\n?|\n).*/g),d&&(this.yylineno+=d.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:d?d[d.length-1].length-d[d.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+r[0].length},this.yytext+=r[0],this.match+=r[0],this.matches=r,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(r[0].length),this.matched+=r[0],u=this.performAction.call(this,this.yy,this,l,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),u)return u;if(this._backtrack){for(var e in S)this[e]=S[e];return!1}return!1},"test_match"),next:s(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var r,l,u,d;this._more||(this.yytext="",this.match="");for(var S=this._currentRules(),e=0;el[0].length)){if(l=u,d=e,this.options.backtrack_lexer){if(r=this.test_match(u,S[e]),r!==!1)return r;if(this._backtrack){l=!1;continue}else return!1}else if(!this.options.flex)break}return l?(r=this.test_match(l,S[d]),r!==!1?r:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:s(function(){var l=this.next();return l||this.lex()},"lex"),begin:s(function(l){this.conditionStack.push(l)},"begin"),popState:s(function(){var l=this.conditionStack.length-1;return l>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:s(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:s(function(l){return l=this.conditionStack.length-1-Math.abs(l||0),l>=0?this.conditionStack[l]:"INITIAL"},"topState"),pushState:s(function(l){this.begin(l)},"pushState"),stateStackSize:s(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:s(function(l,u,d,S){var e=S;switch(d){case 0:break;case 1:break;case 2:return 55;case 3:break;case 4:return this.begin("title"),35;break;case 5:return this.popState(),"title_value";break;case 6:return this.begin("acc_title"),37;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),39;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 23:this.popState();break;case 24:this.begin("string");break;case 25:this.popState();break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;break;case 29:return this.begin("point_start"),44;break;case 30:return this.begin("point_x"),45;break;case 31:this.popState();break;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;break;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:return 65;case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\b)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::::)/i,/^(?:^\w+)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{class_name:{rules:[28],inclusive:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}};return Y})();Ft.lexer=ve;function pt(){this.yy={}}return s(pt,"Parser"),pt.prototype=Ft,Ft.Parser=pt,new pt})();Vt.parser=Vt;var ze=Vt,I=ne(),Ve=class{constructor(){this.classes=new Map,this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}static{s(this,"QuadrantBuilder")}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:L.quadrantChart?.chartWidth||500,chartWidth:L.quadrantChart?.chartHeight||500,titlePadding:L.quadrantChart?.titlePadding||10,titleFontSize:L.quadrantChart?.titleFontSize||20,quadrantPadding:L.quadrantChart?.quadrantPadding||5,xAxisLabelPadding:L.quadrantChart?.xAxisLabelPadding||5,yAxisLabelPadding:L.quadrantChart?.yAxisLabelPadding||5,xAxisLabelFontSize:L.quadrantChart?.xAxisLabelFontSize||16,yAxisLabelFontSize:L.quadrantChart?.yAxisLabelFontSize||16,quadrantLabelFontSize:L.quadrantChart?.quadrantLabelFontSize||16,quadrantTextTopPadding:L.quadrantChart?.quadrantTextTopPadding||5,pointTextPadding:L.quadrantChart?.pointTextPadding||5,pointLabelFontSize:L.quadrantChart?.pointLabelFontSize||12,pointRadius:L.quadrantChart?.pointRadius||5,xAxisPosition:L.quadrantChart?.xAxisPosition||"top",yAxisPosition:L.quadrantChart?.yAxisPosition||"left",quadrantInternalBorderStrokeWidth:L.quadrantChart?.quadrantInternalBorderStrokeWidth||1,quadrantExternalBorderStrokeWidth:L.quadrantChart?.quadrantExternalBorderStrokeWidth||2}}getDefaultThemeConfig(){return{quadrant1Fill:I.quadrant1Fill,quadrant2Fill:I.quadrant2Fill,quadrant3Fill:I.quadrant3Fill,quadrant4Fill:I.quadrant4Fill,quadrant1TextFill:I.quadrant1TextFill,quadrant2TextFill:I.quadrant2TextFill,quadrant3TextFill:I.quadrant3TextFill,quadrant4TextFill:I.quadrant4TextFill,quadrantPointFill:I.quadrantPointFill,quadrantPointTextFill:I.quadrantPointTextFill,quadrantXAxisTextFill:I.quadrantXAxisTextFill,quadrantYAxisTextFill:I.quadrantYAxisTextFill,quadrantTitleFill:I.quadrantTitleFill,quadrantInternalBorderStrokeFill:I.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:I.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,dt.info("clear called")}setData(t){this.data=Q(Q({},this.data),t)}addPoints(t){this.data.points=[...t,...this.data.points]}addClass(t,a){this.classes.set(t,a)}setConfig(t){dt.trace("setConfig called with: ",t),this.config=Q(Q({},this.config),t)}setThemeConfig(t){dt.trace("setThemeConfig called with: ",t),this.themeConfig=Q(Q({},this.themeConfig),t)}calculateSpace(t,a,p,f){let o=this.config.xAxisLabelPadding*2+this.config.xAxisLabelFontSize,x={top:t==="top"&&a?o:0,bottom:t==="bottom"&&a?o:0},_=this.config.yAxisLabelPadding*2+this.config.yAxisLabelFontSize,h={left:this.config.yAxisPosition==="left"&&p?_:0,right:this.config.yAxisPosition==="right"&&p?_:0},c=this.config.titleFontSize+this.config.titlePadding*2,k={top:f?c:0},m=this.config.quadrantPadding+h.left,q=this.config.quadrantPadding+x.top+k.top,y=this.config.chartWidth-this.config.quadrantPadding*2-h.left-h.right,b=this.config.chartHeight-this.config.quadrantPadding*2-x.top-x.bottom-k.top,T=y/2,g=b/2;return{xAxisSpace:x,yAxisSpace:h,titleSpace:k,quadrantSpace:{quadrantLeft:m,quadrantTop:q,quadrantWidth:y,quadrantHalfWidth:T,quadrantHeight:b,quadrantHalfHeight:g}}}getAxisLabels(t,a,p,f){let{quadrantSpace:o,titleSpace:x}=f,{quadrantHalfHeight:_,quadrantHeight:h,quadrantLeft:c,quadrantHalfWidth:k,quadrantTop:m,quadrantWidth:q}=o,y=!!this.data.xAxisRightText,b=!!this.data.yAxisTopText,T=[];return this.data.xAxisLeftText&&a&&T.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:c+(y?k/2:0),y:t==="top"?this.config.xAxisLabelPadding+x.top:this.config.xAxisLabelPadding+m+h+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:y?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&a&&T.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:c+k+(y?k/2:0),y:t==="top"?this.config.xAxisLabelPadding+x.top:this.config.xAxisLabelPadding+m+h+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:y?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&p&&T.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+c+q+this.config.quadrantPadding,y:m+h-(b?_/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:b?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&p&&T.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+c+q+this.config.quadrantPadding,y:m+_-(b?_/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:b?"center":"left",horizontalPos:"top",rotation:-90}),T}getQuadrants(t){let{quadrantSpace:a}=t,{quadrantHalfHeight:p,quadrantLeft:f,quadrantHalfWidth:o,quadrantTop:x}=a,_=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:f+o,y:x,width:o,height:p,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:f,y:x,width:o,height:p,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:f,y:x+p,width:o,height:p,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:f+o,y:x+p,width:o,height:p,fill:this.themeConfig.quadrant4Fill}];for(let h of _)h.text.x=h.x+h.width/2,this.data.points.length===0?(h.text.y=h.y+h.height/2,h.text.horizontalPos="middle"):(h.text.y=h.y+this.config.quadrantTextTopPadding,h.text.horizontalPos="top");return _}getQuadrantPoints(t){let{quadrantSpace:a}=t,{quadrantHeight:p,quadrantLeft:f,quadrantTop:o,quadrantWidth:x}=a,_=zt().domain([0,1]).range([f,x+f]),h=zt().domain([0,1]).range([p+o,o]);return this.data.points.map(k=>{let m=this.classes.get(k.className);return m&&(k=Q(Q({},m),k)),{x:_(k.x),y:h(k.y),fill:k.color??this.themeConfig.quadrantPointFill,radius:k.radius??this.config.pointRadius,text:{text:k.text,fill:this.themeConfig.quadrantPointTextFill,x:_(k.x),y:h(k.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:k.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:k.strokeWidth??"0px"}})}getBorders(t){let a=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:p}=t,{quadrantHalfHeight:f,quadrantHeight:o,quadrantLeft:x,quadrantHalfWidth:_,quadrantTop:h,quadrantWidth:c}=p;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:x-a,y1:h,x2:x+c+a,y2:h},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:x+c,y1:h+a,x2:x+c,y2:h+o-a},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:x-a,y1:h+o,x2:x+c+a,y2:h+o},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:x,y1:h+a,x2:x,y2:h+o-a},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:x+_,y1:h+a,x2:x+_,y2:h+o-a},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:x+a,y1:h+f,x2:x+c-a,y2:h+f}]}getTitle(t){if(t)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){let t=this.config.showXAxis&&!!(this.data.xAxisLeftText||this.data.xAxisRightText),a=this.config.showYAxis&&!!(this.data.yAxisTopText||this.data.yAxisBottomText),p=this.config.showTitle&&!!this.data.titleText,f=this.data.points.length>0?"bottom":this.config.xAxisPosition,o=this.calculateSpace(f,t,a,p);return{points:this.getQuadrantPoints(o),quadrants:this.getQuadrants(o),axisLabels:this.getAxisLabels(f,t,a,o),borderLines:this.getBorders(o),title:this.getTitle(p)}}},kt=class extends Error{static{s(this,"InvalidStyleError")}constructor(t,a,p){super(`value for ${t} ${a} is invalid, please use a valid ${p}`),this.name="InvalidStyleError"}};function It(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}s(It,"validateHexCode");function xe(t){return!/^\d+$/.test(t)}s(xe,"validateNumber");function fe(t){return!/^\d+px$/.test(t)}s(fe,"validateSizeInPixels");var Ie=qt();function O(t){return re(t.trim(),Ie)}s(O,"textSanitizer");var z=new Ve;function ge(t){z.setData({quadrant1Text:O(t.text)})}s(ge,"setQuadrant1Text");function pe(t){z.setData({quadrant2Text:O(t.text)})}s(pe,"setQuadrant2Text");function ye(t){z.setData({quadrant3Text:O(t.text)})}s(ye,"setQuadrant3Text");function be(t){z.setData({quadrant4Text:O(t.text)})}s(be,"setQuadrant4Text");function Te(t){z.setData({xAxisLeftText:O(t.text)})}s(Te,"setXAxisLeftText");function me(t){z.setData({xAxisRightText:O(t.text)})}s(me,"setXAxisRightText");function qe(t){z.setData({yAxisTopText:O(t.text)})}s(qe,"setYAxisTopText");function ke(t){z.setData({yAxisBottomText:O(t.text)})}s(ke,"setYAxisBottomText");function St(t){let a={};for(let p of t){let[f,o]=p.trim().split(/\s*:\s*/);if(f==="radius"){if(xe(o))throw new kt(f,o,"number");a.radius=parseInt(o)}else if(f==="color"){if(It(o))throw new kt(f,o,"hex code");a.color=o}else if(f==="stroke-color"){if(It(o))throw new kt(f,o,"hex code");a.strokeColor=o}else if(f==="stroke-width"){if(fe(o))throw new kt(f,o,"number of pixels (eg. 10px)");a.strokeWidth=o}else throw new Error(`style named ${f} is not supported.`)}return a}s(St,"parseStyles");function Se(t,a,p,f,o){let x=St(o);z.addPoints([Q({x:p,y:f,text:O(t.text),className:a},x)])}s(Se,"addPoint");function _e(t,a){z.addClass(t,St(a))}s(_e,"addClass");function Ae(t){z.setConfig({chartWidth:t})}s(Ae,"setWidth");function Fe(t){z.setConfig({chartHeight:t})}s(Fe,"setHeight");function Pe(){let t=qt(),{themeVariables:a,quadrantChart:p}=t;return p&&z.setConfig(p),z.setThemeConfig({quadrant1Fill:a.quadrant1Fill,quadrant2Fill:a.quadrant2Fill,quadrant3Fill:a.quadrant3Fill,quadrant4Fill:a.quadrant4Fill,quadrant1TextFill:a.quadrant1TextFill,quadrant2TextFill:a.quadrant2TextFill,quadrant3TextFill:a.quadrant3TextFill,quadrant4TextFill:a.quadrant4TextFill,quadrantPointFill:a.quadrantPointFill,quadrantPointTextFill:a.quadrantPointTextFill,quadrantXAxisTextFill:a.quadrantXAxisTextFill,quadrantYAxisTextFill:a.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:a.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:a.quadrantInternalBorderStrokeFill,quadrantTitleFill:a.quadrantTitleFill}),z.setData({titleText:Dt()}),z.build()}s(Pe,"getQuadrantData");var we=s(function(){z.clear(),oe()},"clear"),Be={setWidth:Ae,setHeight:Fe,setQuadrant1Text:ge,setQuadrant2Text:pe,setQuadrant3Text:ye,setQuadrant4Text:be,setXAxisLeftText:Te,setXAxisRightText:me,setYAxisTopText:qe,setYAxisBottomText:ke,parseStyles:St,addPoint:Se,addClass:_e,getQuadrantData:Pe,clear:we,setAccTitle:le,getAccTitle:he,setDiagramTitle:ue,getDiagramTitle:Dt,getAccDescription:de,setAccDescription:ce},Re=s((t,a,p,f)=>{function o(i){return i==="top"?"hanging":"middle"}s(o,"getDominantBaseLine");function x(i){return i==="left"?"start":"middle"}s(x,"getTextAnchor");function _(i){return`translate(${i.x}, ${i.y}) rotate(${i.rotation||0})`}s(_,"getTransformation");let h=qt();dt.debug(`Rendering quadrant chart -`+t);let c=h.securityLevel,k;c==="sandbox"&&(k=mt("#i"+a));let q=(c==="sandbox"?mt(k.nodes()[0].contentDocument.body):mt("body")).select(`[id="${a}"]`),y=q.append("g").attr("class","main"),b=h.quadrantChart?.chartWidth??500,T=h.quadrantChart?.chartHeight??500;se(q,T,b,h.quadrantChart?.useMaxWidth??!0),q.attr("viewBox","0 0 "+b+" "+T),f.db.setHeight(T),f.db.setWidth(b);let g=f.db.getQuadrantData(),ot=y.append("g").attr("class","quadrants"),ut=y.append("g").attr("class","border"),xt=y.append("g").attr("class","data-points"),ft=y.append("g").attr("class","labels"),gt=y.append("g").attr("class","title");g.title&>.append("text").attr("x",0).attr("y",0).attr("fill",g.title.fill).attr("font-size",g.title.fontSize).attr("dominant-baseline",o(g.title.horizontalPos)).attr("text-anchor",x(g.title.verticalPos)).attr("transform",_(g.title)).text(g.title.text),g.borderLines&&ut.selectAll("line").data(g.borderLines).enter().append("line").attr("x1",i=>i.x1).attr("y1",i=>i.y1).attr("x2",i=>i.x2).attr("y2",i=>i.y2).style("stroke",i=>i.strokeFill).style("stroke-width",i=>i.strokeWidth);let lt=ot.selectAll("g.quadrant").data(g.quadrants).enter().append("g").attr("class","quadrant");lt.append("rect").attr("x",i=>i.x).attr("y",i=>i.y).attr("width",i=>i.width).attr("height",i=>i.height).attr("fill",i=>i.fill),lt.append("text").attr("x",0).attr("y",0).attr("fill",i=>i.text.fill).attr("font-size",i=>i.text.fontSize).attr("dominant-baseline",i=>o(i.text.horizontalPos)).attr("text-anchor",i=>x(i.text.verticalPos)).attr("transform",i=>_(i.text)).text(i=>i.text.text),ft.selectAll("g.label").data(g.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text(i=>i.text).attr("fill",i=>i.fill).attr("font-size",i=>i.fontSize).attr("dominant-baseline",i=>o(i.horizontalPos)).attr("text-anchor",i=>x(i.verticalPos)).attr("transform",i=>_(i));let ht=xt.selectAll("g.data-point").data(g.points).enter().append("g").attr("class","data-point");ht.append("circle").attr("cx",i=>i.x).attr("cy",i=>i.y).attr("r",i=>i.radius).attr("fill",i=>i.fill).attr("stroke",i=>i.strokeColor).attr("stroke-width",i=>i.strokeWidth),ht.append("text").attr("x",0).attr("y",0).text(i=>i.text.text).attr("fill",i=>i.text.fill).attr("font-size",i=>i.text.fontSize).attr("dominant-baseline",i=>o(i.text.horizontalPos)).attr("text-anchor",i=>x(i.text.verticalPos)).attr("transform",i=>_(i.text))},"draw"),Ne={draw:Re},Xe={parser:ze,db:Be,renderer:Ne,styles:s(()=>"","styles")};export{Xe as diagram}; diff --git a/src/google/adk/cli/browser/chunk-VDPKVNDJ.js b/src/google/adk/cli/browser/chunk-VDPKVNDJ.js deleted file mode 100644 index 9a47ca2ba8..0000000000 --- a/src/google/adk/cli/browser/chunk-VDPKVNDJ.js +++ /dev/null @@ -1 +0,0 @@ -import{Y as c}from"./chunk-QFMJV7VH.js";import{g as l}from"./chunk-JRNAXTJ7.js";var m=l(t=>{let{handDrawnSeed:e}=c();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:e}},"solidStateFill"),h=l(t=>{let e=p([...t.cssCompiledStyles||[],...t.cssStyles||[],...t.labelStyle||[]]);return{stylesMap:e,stylesArray:[...e]}},"compileStyles"),p=l(t=>{let e=new Map;return t.forEach(o=>{let[a,r]=o.split(":");e.set(a.trim(),r?.trim())}),e},"styles2Map"),d=l(t=>t==="color"||t==="font-size"||t==="font-family"||t==="font-weight"||t==="font-style"||t==="text-decoration"||t==="text-align"||t==="text-transform"||t==="line-height"||t==="letter-spacing"||t==="word-spacing"||t==="text-shadow"||t==="text-overflow"||t==="white-space"||t==="word-wrap"||t==="word-break"||t==="overflow-wrap"||t==="hyphens","isLabelStyle"),S=l(t=>{let{stylesArray:e}=h(t),o=[],a=[],r=[],n=[];return e.forEach(s=>{let i=s[0];d(i)?o.push(s.join(":")+" !important"):(a.push(s.join(":")+" !important"),i.includes("stroke")&&r.push(s.join(":")+" !important"),i==="fill"&&n.push(s.join(":")+" !important"))}),{labelStyles:o.join(";"),nodeStyles:a.join(";"),stylesArray:e,borderStyles:r,backgroundStyles:n}},"styles2String"),w=l((t,e)=>{let{themeVariables:o,handDrawnSeed:a}=c(),{nodeBorder:r,mainBkg:n}=o,{stylesMap:s}=h(t);return Object.assign({roughness:.7,fill:s.get("fill")||n,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:s.get("stroke")||r,seed:a,strokeWidth:s.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0],strokeLineDash:f(s.get("stroke-dasharray"))},e)},"userNodeOverrides"),f=l(t=>{if(!t)return[0,0];let e=t.trim().split(/\s+/).map(Number);if(e.length===1){let r=isNaN(e[0])?0:e[0];return[r,r]}let o=isNaN(e[0])?0:e[0],a=isNaN(e[1])?0:e[1];return[o,a]},"getStrokeDashArray");export{m as a,h as b,d as c,S as d,w as e}; diff --git a/src/google/adk/cli/browser/chunk-4LH47YYI.js b/src/google/adk/cli/browser/chunk-VUI6RO2X.js similarity index 86% rename from src/google/adk/cli/browser/chunk-4LH47YYI.js rename to src/google/adk/cli/browser/chunk-VUI6RO2X.js index 9f39a1e542..de3dd9600a 100644 --- a/src/google/adk/cli/browser/chunk-4LH47YYI.js +++ b/src/google/adk/cli/browser/chunk-VUI6RO2X.js @@ -1 +1 @@ -import{$a as s,$b as y,Bb as m,Ca as a,Cb as d,Cc as I,Lb as p,Pa as i,Yb as u,Zb as v,_b as f,eb as r,fc as g,gc as h,hc as x,pd as M,qb as c,sb as l,wc as C}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function _(e,D){if(e&1&&(m(0,"section")(1,"span",1),f(2),d()()),e&2){let t=p(),n=x(0);u(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Icon),v(t.theme.components.Icon),i(2),y(n)}}var S=(()=>{class e extends M{name=I.required();resolvedName=C(()=>this.resolvePrimitive(this.name()));static \u0275fac=(()=>{let t;return function(o){return(t||(t=a(e)))(o||e)}})();static \u0275cmp=s({type:e,selectors:[["a2ui-icon"]],inputs:{name:[1,"name"]},features:[r],decls:2,vars:2,consts:[[3,"class","style"],[1,"g-icon"]],template:function(n,o){if(n&1&&(g(0),c(1,_,3,5,"section",0)),n&2){let N=h(o.resolvedName());i(),l(N?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}"]})}return e})();export{S as Icon}; +import{$a as s,$b as y,Bb as m,Ca as a,Cb as d,Cc as I,Lb as p,Pa as i,Yb as u,Zb as v,_b as f,eb as r,fc as g,gc as h,hc as x,pd as M,qb as c,sb as l,wc as C}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function _(e,D){if(e&1&&(m(0,"section")(1,"span",1),f(2),d()()),e&2){let t=p(),n=x(0);u(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Icon),v(t.theme.components.Icon),i(2),y(n)}}var S=(()=>{class e extends M{name=I.required();resolvedName=C(()=>this.resolvePrimitive(this.name()));static \u0275fac=(()=>{let t;return function(o){return(t||(t=a(e)))(o||e)}})();static \u0275cmp=s({type:e,selectors:[["a2ui-icon"]],inputs:{name:[1,"name"]},features:[r],decls:2,vars:2,consts:[[3,"class","style"],[1,"g-icon"]],template:function(n,o){if(n&1&&(g(0),c(1,_,3,5,"section",0)),n&2){let N=h(o.resolvedName());i(),l(N?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}"]})}return e})();export{S as Icon}; diff --git a/src/google/adk/cli/browser/chunk-W67OU2Q2.js b/src/google/adk/cli/browser/chunk-W67OU2Q2.js deleted file mode 100644 index 7f141bceba..0000000000 --- a/src/google/adk/cli/browser/chunk-W67OU2Q2.js +++ /dev/null @@ -1,10 +0,0 @@ -import{M as xt,O as kt,R as _t,S as vt,T as bt,U as St,V as wt,W as Lt,X as Et,Y as Q,_ as At}from"./chunk-QFMJV7VH.js";import{J as Ct,a as q,g as y,r as Tt}from"./chunk-JRNAXTJ7.js";import"./chunk-RMXJBC7V.js";function X(t,n){let r;if(n===void 0)for(let l of t)l!=null&&(r=l)&&(r=l);else{let l=-1;for(let f of t)(f=n(f,++l,t))!=null&&(r=f)&&(r=f)}return r}function F(t,n){let r;if(n===void 0)for(let l of t)l!=null&&(r>l||r===void 0&&l>=l)&&(r=l);else{let l=-1;for(let f of t)(f=n(f,++l,t))!=null&&(r>f||r===void 0&&f>=f)&&(r=f)}return r}function U(t,n){let r=0;if(n===void 0)for(let l of t)(l=+l)&&(r+=l);else{let l=-1;for(let f of t)(f=+n(f,++l,t))&&(r+=f)}return r}function Bt(t){return t.target.depth}function st(t){return t.depth}function it(t,n){return n-1-t.height}function G(t,n){return t.sourceLinks.length?t.depth:n-1}function at(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?F(t.sourceLinks,Bt)-1:0}function W(t){return function(){return t}}function Mt(t,n){return K(t.source,n.source)||t.index-n.index}function Ot(t,n){return K(t.target,n.target)||t.index-n.index}function K(t,n){return t.y0-n.y0}function lt(t){return t.value}function $t(t){return t.index}function Vt(t){return t.nodes}function Ft(t){return t.links}function It(t,n){let r=t.get(n);if(!r)throw new Error("missing: "+n);return r}function Nt({nodes:t}){for(let n of t){let r=n.y0,l=r;for(let f of n.sourceLinks)f.y0=r+f.width/2,r+=f.width;for(let f of n.targetLinks)f.y1=l+f.width/2,l+=f.width}}function Z(){let t=0,n=0,r=1,l=1,f=24,S=8,m,x=$t,o=G,i,a,k=Vt,_=Ft,d=6;function v(){let e={nodes:k.apply(null,arguments),links:_.apply(null,arguments)};return C(e),T(e),M(e),P(e),z(e),Nt(e),e}v.update=function(e){return Nt(e),e},v.nodeId=function(e){return arguments.length?(x=typeof e=="function"?e:W(e),v):x},v.nodeAlign=function(e){return arguments.length?(o=typeof e=="function"?e:W(e),v):o},v.nodeSort=function(e){return arguments.length?(i=e,v):i},v.nodeWidth=function(e){return arguments.length?(f=+e,v):f},v.nodePadding=function(e){return arguments.length?(S=m=+e,v):S},v.nodes=function(e){return arguments.length?(k=typeof e=="function"?e:W(e),v):k},v.links=function(e){return arguments.length?(_=typeof e=="function"?e:W(e),v):_},v.linkSort=function(e){return arguments.length?(a=e,v):a},v.size=function(e){return arguments.length?(t=n=0,r=+e[0],l=+e[1],v):[r-t,l-n]},v.extent=function(e){return arguments.length?(t=+e[0][0],r=+e[1][0],n=+e[0][1],l=+e[1][1],v):[[t,n],[r,l]]},v.iterations=function(e){return arguments.length?(d=+e,v):d};function C({nodes:e,links:u}){for(let[h,s]of e.entries())s.index=h,s.sourceLinks=[],s.targetLinks=[];let c=new Map(e.map((h,s)=>[x(h,s,e),h]));for(let[h,s]of u.entries()){s.index=h;let{source:g,target:b}=s;typeof g!="object"&&(g=s.source=It(c,g)),typeof b!="object"&&(b=s.target=It(c,b)),g.sourceLinks.push(s),b.targetLinks.push(s)}if(a!=null)for(let{sourceLinks:h,targetLinks:s}of e)h.sort(a),s.sort(a)}function T({nodes:e}){for(let u of e)u.value=u.fixedValue===void 0?Math.max(U(u.sourceLinks,lt),U(u.targetLinks,lt)):u.fixedValue}function M({nodes:e}){let u=e.length,c=new Set(e),h=new Set,s=0;for(;c.size;){for(let g of c){g.depth=s;for(let{target:b}of g.sourceLinks)h.add(b)}if(++s>u)throw new Error("circular link");c=h,h=new Set}}function P({nodes:e}){let u=e.length,c=new Set(e),h=new Set,s=0;for(;c.size;){for(let g of c){g.height=s;for(let{source:b}of g.targetLinks)h.add(b)}if(++s>u)throw new Error("circular link");c=h,h=new Set}}function j({nodes:e}){let u=X(e,s=>s.depth)+1,c=(r-t-f)/(u-1),h=new Array(u);for(let s of e){let g=Math.max(0,Math.min(u-1,Math.floor(o.call(null,s,u))));s.layer=g,s.x0=t+g*c,s.x1=s.x0+f,h[g]?h[g].push(s):h[g]=[s]}if(i)for(let s of h)s.sort(i);return h}function B(e){let u=F(e,c=>(l-n-(c.length-1)*m)/U(c,lt));for(let c of e){let h=n;for(let s of c){s.y0=h,s.y1=h+s.value*u,h=s.y1+m;for(let g of s.sourceLinks)g.width=g.value*u}h=(l-h+m)/(c.length+1);for(let s=0;sc.length)-1)),B(u);for(let c=0;c0))continue;let D=($/N-b.y0)*u;b.y0+=D,b.y1+=D,A(b)}i===void 0&&g.sort(K),R(g,c)}}function O(e,u,c){for(let h=e.length,s=h-2;s>=0;--s){let g=e[s];for(let b of g){let $=0,N=0;for(let{target:L,value:ot}of b.sourceLinks){let Y=ot*(L.layer-b.layer);$+=H(b,L)*Y,N+=Y}if(!(N>0))continue;let D=($/N-b.y0)*u;b.y0+=D,b.y1+=D,A(b)}i===void 0&&g.sort(K),R(g,c)}}function R(e,u){let c=e.length>>1,h=e[c];p(e,h.y0-m,c-1,u),I(e,h.y1+m,c+1,u),p(e,l,e.length-1,u),I(e,n,0,u)}function I(e,u,c,h){for(;c1e-6&&(s.y0+=g,s.y1+=g),u=s.y1+m}}function p(e,u,c,h){for(;c>=0;--c){let s=e[c],g=(s.y1-u)*h;g>1e-6&&(s.y0-=g,s.y1-=g),u=s.y0-m}}function A({sourceLinks:e,targetLinks:u}){if(a===void 0){for(let{source:{sourceLinks:c}}of u)c.sort(Ot);for(let{target:{targetLinks:c}}of e)c.sort(Mt)}}function J(e){if(a===void 0)for(let{sourceLinks:u,targetLinks:c}of e)u.sort(Ot),c.sort(Mt)}function E(e,u){let c=e.y0-(e.sourceLinks.length-1)*m/2;for(let{target:h,width:s}of e.sourceLinks){if(h===u)break;c+=s+m}for(let{source:h,width:s}of u.targetLinks){if(h===e)break;c-=s}return c}function H(e,u){let c=u.y0-(u.targetLinks.length-1)*m/2;for(let{source:h,width:s}of u.targetLinks){if(h===e)break;c+=s+m}for(let{target:h,width:s}of e.sourceLinks){if(h===u)break;c-=s}return c}return v}var ut=Math.PI,ft=2*ut,V=1e-6,Ut=ft-V;function ct(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function Pt(){return new ct}ct.prototype=Pt.prototype={constructor:ct,moveTo:function(t,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)},closePath:function(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,n){this._+="L"+(this._x1=+t)+","+(this._y1=+n)},quadraticCurveTo:function(t,n,r,l){this._+="Q"+ +t+","+ +n+","+(this._x1=+r)+","+(this._y1=+l)},bezierCurveTo:function(t,n,r,l,f,S){this._+="C"+ +t+","+ +n+","+ +r+","+ +l+","+(this._x1=+f)+","+(this._y1=+S)},arcTo:function(t,n,r,l,f){t=+t,n=+n,r=+r,l=+l,f=+f;var S=this._x1,m=this._y1,x=r-t,o=l-n,i=S-t,a=m-n,k=i*i+a*a;if(f<0)throw new Error("negative radius: "+f);if(this._x1===null)this._+="M"+(this._x1=t)+","+(this._y1=n);else if(k>V)if(!(Math.abs(a*x-o*i)>V)||!f)this._+="L"+(this._x1=t)+","+(this._y1=n);else{var _=r-S,d=l-m,v=x*x+o*o,C=_*_+d*d,T=Math.sqrt(v),M=Math.sqrt(k),P=f*Math.tan((ut-Math.acos((v+k-C)/(2*T*M)))/2),j=P/M,B=P/T;Math.abs(j-1)>V&&(this._+="L"+(t+j*i)+","+(n+j*a)),this._+="A"+f+","+f+",0,0,"+ +(a*_>i*d)+","+(this._x1=t+B*x)+","+(this._y1=n+B*o)}},arc:function(t,n,r,l,f,S){t=+t,n=+n,r=+r,S=!!S;var m=r*Math.cos(l),x=r*Math.sin(l),o=t+m,i=n+x,a=1^S,k=S?l-f:f-l;if(r<0)throw new Error("negative radius: "+r);this._x1===null?this._+="M"+o+","+i:(Math.abs(this._x1-o)>V||Math.abs(this._y1-i)>V)&&(this._+="L"+o+","+i),r&&(k<0&&(k=k%ft+ft),k>Ut?this._+="A"+r+","+r+",0,1,"+a+","+(t-m)+","+(n-x)+"A"+r+","+r+",0,1,"+a+","+(this._x1=o)+","+(this._y1=i):k>V&&(this._+="A"+r+","+r+",0,"+ +(k>=ut)+","+a+","+(this._x1=t+r*Math.cos(f))+","+(this._y1=n+r*Math.sin(f))))},rect:function(t,n,r,l){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +r+"v"+ +l+"h"+-r+"Z"},toString:function(){return this._}};var ht=Pt;function dt(t){return function(){return t}}function Rt(t){return t[0]}function zt(t){return t[1]}var Dt=Array.prototype.slice;function Wt(t){return t.source}function Ht(t){return t.target}function Yt(t){var n=Wt,r=Ht,l=Rt,f=zt,S=null;function m(){var x,o=Dt.call(arguments),i=n.apply(this,o),a=r.apply(this,o);if(S||(S=x=ht()),t(S,+l.apply(this,(o[0]=i,o)),+f.apply(this,o),+l.apply(this,(o[0]=a,o)),+f.apply(this,o)),x)return S=null,x+""||null}return m.source=function(x){return arguments.length?(n=x,m):n},m.target=function(x){return arguments.length?(r=x,m):r},m.x=function(x){return arguments.length?(l=typeof x=="function"?x:dt(+x),m):l},m.y=function(x){return arguments.length?(f=typeof x=="function"?x:dt(+x),m):f},m.context=function(x){return arguments.length?(S=x??null,m):S},m}function qt(t,n,r,l,f){t.moveTo(n,r),t.bezierCurveTo(n=(n+l)/2,r,n,f,l,f)}function pt(){return Yt(qt)}function Xt(t){return[t.source.x1,t.y0]}function Gt(t){return[t.target.x0,t.y1]}function yt(){return pt().source(Xt).target(Gt)}var mt=(function(){var t=y(function(x,o,i,a){for(i=i||{},a=x.length;a--;i[x[a]]=o);return i},"o"),n=[1,9],r=[1,10],l=[1,5,10,12],f={trace:y(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SANKEY:4,NEWLINE:5,csv:6,opt_eof:7,record:8,csv_tail:9,EOF:10,"field[source]":11,COMMA:12,"field[target]":13,"field[value]":14,field:15,escaped:16,non_escaped:17,DQUOTE:18,ESCAPED_TEXT:19,NON_ESCAPED_TEXT:20,$accept:0,$end:1},terminals_:{2:"error",4:"SANKEY",5:"NEWLINE",10:"EOF",11:"field[source]",12:"COMMA",13:"field[target]",14:"field[value]",18:"DQUOTE",19:"ESCAPED_TEXT",20:"NON_ESCAPED_TEXT"},productions_:[0,[3,4],[6,2],[9,2],[9,0],[7,1],[7,0],[8,5],[15,1],[15,1],[16,3],[17,1]],performAction:y(function(o,i,a,k,_,d,v){var C=d.length-1;switch(_){case 7:let T=k.findOrCreateNode(d[C-4].trim().replaceAll('""','"')),M=k.findOrCreateNode(d[C-2].trim().replaceAll('""','"')),P=parseFloat(d[C].trim());k.addLink(T,M,P);break;case 8:case 9:case 11:this.$=d[C];break;case 10:this.$=d[C-1];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:n,20:r},{1:[2,6],7:11,10:[1,12]},t(r,[2,4],{9:13,5:[1,14]}),{12:[1,15]},t(l,[2,8]),t(l,[2,9]),{19:[1,16]},t(l,[2,11]),{1:[2,1]},{1:[2,5]},t(r,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:n,20:r},{15:18,16:7,17:8,18:n,20:r},{18:[1,19]},t(r,[2,3]),{12:[1,20]},t(l,[2,10]),{15:21,16:7,17:8,18:n,20:r},t([1,5,10],[2,7])],defaultActions:{11:[2,1],12:[2,5]},parseError:y(function(o,i){if(i.recoverable)this.trace(o);else{var a=new Error(o);throw a.hash=i,a}},"parseError"),parse:y(function(o){var i=this,a=[0],k=[],_=[null],d=[],v=this.table,C="",T=0,M=0,P=0,j=2,B=1,z=d.slice.call(arguments,1),w=Object.create(this.lexer),O={yy:{}};for(var R in this.yy)Object.prototype.hasOwnProperty.call(this.yy,R)&&(O.yy[R]=this.yy[R]);w.setInput(o,O.yy),O.yy.lexer=w,O.yy.parser=this,typeof w.yylloc>"u"&&(w.yylloc={});var I=w.yylloc;d.push(I);var p=w.options&&w.options.ranges;typeof O.yy.parseError=="function"?this.parseError=O.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function A(L){a.length=a.length-2*L,_.length=_.length-L,d.length=d.length-L}y(A,"popStack");function J(){var L;return L=k.pop()||w.lex()||B,typeof L!="number"&&(L instanceof Array&&(k=L,L=k.pop()),L=i.symbols_[L]||L),L}y(J,"lex");for(var E,H,e,u,c,h,s={},g,b,$,N;;){if(e=a[a.length-1],this.defaultActions[e]?u=this.defaultActions[e]:((E===null||typeof E>"u")&&(E=J()),u=v[e]&&v[e][E]),typeof u>"u"||!u.length||!u[0]){var D="";N=[];for(g in v[e])this.terminals_[g]&&g>j&&N.push("'"+this.terminals_[g]+"'");w.showPosition?D="Parse error on line "+(T+1)+`: -`+w.showPosition()+` -Expecting `+N.join(", ")+", got '"+(this.terminals_[E]||E)+"'":D="Parse error on line "+(T+1)+": Unexpected "+(E==B?"end of input":"'"+(this.terminals_[E]||E)+"'"),this.parseError(D,{text:w.match,token:this.terminals_[E]||E,line:w.yylineno,loc:I,expected:N})}if(u[0]instanceof Array&&u.length>1)throw new Error("Parse Error: multiple actions possible at state: "+e+", token: "+E);switch(u[0]){case 1:a.push(E),_.push(w.yytext),d.push(w.yylloc),a.push(u[1]),E=null,H?(E=H,H=null):(M=w.yyleng,C=w.yytext,T=w.yylineno,I=w.yylloc,P>0&&P--);break;case 2:if(b=this.productions_[u[1]][1],s.$=_[_.length-b],s._$={first_line:d[d.length-(b||1)].first_line,last_line:d[d.length-1].last_line,first_column:d[d.length-(b||1)].first_column,last_column:d[d.length-1].last_column},p&&(s._$.range=[d[d.length-(b||1)].range[0],d[d.length-1].range[1]]),h=this.performAction.apply(s,[C,M,T,O.yy,u[1],_,d].concat(z)),typeof h<"u")return h;b&&(a=a.slice(0,-1*b*2),_=_.slice(0,-1*b),d=d.slice(0,-1*b)),a.push(this.productions_[u[1]][0]),_.push(s.$),d.push(s._$),$=v[a[a.length-2]][a[a.length-1]],a.push($);break;case 3:return!0}}return!0},"parse")},S=(function(){var x={EOF:1,parseError:y(function(i,a){if(this.yy.parser)this.yy.parser.parseError(i,a);else throw new Error(i)},"parseError"),setInput:y(function(o,i){return this.yy=i||this.yy||{},this._input=o,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:y(function(){var o=this._input[0];this.yytext+=o,this.yyleng++,this.offset++,this.match+=o,this.matched+=o;var i=o.match(/(?:\r\n?|\n).*/g);return i?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),o},"input"),unput:y(function(o){var i=o.length,a=o.split(/(?:\r\n?|\n)/g);this._input=o+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-i),this.offset-=i;var k=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),a.length-1&&(this.yylineno-=a.length-1);var _=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:a?(a.length===k.length?this.yylloc.first_column:0)+k[k.length-a.length].length-a[0].length:this.yylloc.first_column-i},this.options.ranges&&(this.yylloc.range=[_[0],_[0]+this.yyleng-i]),this.yyleng=this.yytext.length,this},"unput"),more:y(function(){return this._more=!0,this},"more"),reject:y(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:y(function(o){this.unput(this.match.slice(o))},"less"),pastInput:y(function(){var o=this.matched.substr(0,this.matched.length-this.match.length);return(o.length>20?"...":"")+o.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:y(function(){var o=this.match;return o.length<20&&(o+=this._input.substr(0,20-o.length)),(o.substr(0,20)+(o.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:y(function(){var o=this.pastInput(),i=new Array(o.length+1).join("-");return o+this.upcomingInput()+` -`+i+"^"},"showPosition"),test_match:y(function(o,i){var a,k,_;if(this.options.backtrack_lexer&&(_={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(_.yylloc.range=this.yylloc.range.slice(0))),k=o[0].match(/(?:\r\n?|\n).*/g),k&&(this.yylineno+=k.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:k?k[k.length-1].length-k[k.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+o[0].length},this.yytext+=o[0],this.match+=o[0],this.matches=o,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(o[0].length),this.matched+=o[0],a=this.performAction.call(this,this.yy,this,i,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a)return a;if(this._backtrack){for(var d in _)this[d]=_[d];return!1}return!1},"test_match"),next:y(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var o,i,a,k;this._more||(this.yytext="",this.match="");for(var _=this._currentRules(),d=0;d<_.length;d++)if(a=this._input.match(this.rules[_[d]]),a&&(!i||a[0].length>i[0].length)){if(i=a,k=d,this.options.backtrack_lexer){if(o=this.test_match(a,_[d]),o!==!1)return o;if(this._backtrack){i=!1;continue}else return!1}else if(!this.options.flex)break}return i?(o=this.test_match(i,_[k]),o!==!1?o:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:y(function(){var i=this.next();return i||this.lex()},"lex"),begin:y(function(i){this.conditionStack.push(i)},"begin"),popState:y(function(){var i=this.conditionStack.length-1;return i>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:y(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:y(function(i){return i=this.conditionStack.length-1-Math.abs(i||0),i>=0?this.conditionStack[i]:"INITIAL"},"topState"),pushState:y(function(i){this.begin(i)},"pushState"),stateStackSize:y(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:y(function(i,a,k,_){var d=_;switch(k){case 0:return this.pushState("csv"),4;break;case 1:return this.pushState("csv"),4;break;case 2:return 10;case 3:return 5;case 4:return 12;case 5:return this.pushState("escaped_text"),18;break;case 6:return 20;case 7:return this.popState("escaped_text"),18;break;case 8:return 19}},"anonymous"),rules:[/^(?:sankey-beta\b)/i,/^(?:sankey\b)/i,/^(?:$)/i,/^(?:((\u000D\u000A)|(\u000A)))/i,/^(?:(\u002C))/i,/^(?:(\u0022))/i,/^(?:([\u0020-\u0021\u0023-\u002B\u002D-\u007E])*)/i,/^(?:(\u0022)(?!(\u0022)))/i,/^(?:(([\u0020-\u0021\u0023-\u002B\u002D-\u007E])|(\u002C)|(\u000D)|(\u000A)|(\u0022)(\u0022))*)/i],conditions:{csv:{rules:[2,3,4,5,6,7,8],inclusive:!1},escaped_text:{rules:[7,8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8],inclusive:!0}}};return x})();f.lexer=S;function m(){this.yy={}}return y(m,"Parser"),m.prototype=f,f.Parser=m,new m})();mt.parser=mt;var tt=mt,nt=[],rt=[],et=new Map,Jt=y(()=>{nt=[],rt=[],et=new Map,_t()},"clear"),Qt=class{constructor(t,n,r=0){this.source=t,this.target=n,this.value=r}static{y(this,"SankeyLink")}},Kt=y((t,n,r)=>{nt.push(new Qt(t,n,r))},"addLink"),Zt=class{constructor(t){this.ID=t}static{y(this,"SankeyNode")}},te=y(t=>{t=xt.sanitizeText(t,Q());let n=et.get(t);return n===void 0&&(n=new Zt(t),et.set(t,n),rt.push(n)),n},"findOrCreateNode"),ee=y(()=>rt,"getNodes"),ne=y(()=>nt,"getLinks"),re=y(()=>({nodes:rt.map(t=>({id:t.ID})),links:nt.map(t=>({source:t.source.ID,target:t.target.ID,value:t.value}))}),"getGraph"),oe={nodesMap:et,getConfig:y(()=>Q().sankey,"getConfig"),getNodes:ee,getLinks:ne,getGraph:re,addLink:Kt,findOrCreateNode:te,getAccTitle:bt,setAccTitle:vt,getAccDescription:wt,setAccDescription:St,getDiagramTitle:Et,setDiagramTitle:Lt,clear:Jt},jt=class gt{static{y(this,"Uid")}static{this.count=0}static next(r){return new gt(r+ ++gt.count)}constructor(r){this.id=r,this.href=`#${r}`}toString(){return"url("+this.href+")"}},se={left:st,right:it,center:at,justify:G},ie=y(function(t,n,r,l){let{securityLevel:f,sankey:S}=Q(),m=At.sankey,x;f==="sandbox"&&(x=q("#i"+n));let o=f==="sandbox"?q(x.nodes()[0].contentDocument.body):q("body"),i=f==="sandbox"?o.select(`[id="${n}"]`):q(`[id="${n}"]`),a=S?.width??m.width,k=S?.height??m.width,_=S?.useMaxWidth??m.useMaxWidth,d=S?.nodeAlignment??m.nodeAlignment,v=S?.prefix??m.prefix,C=S?.suffix??m.suffix,T=S?.showValues??m.showValues,M=l.db.getGraph(),P=se[d];Z().nodeId(p=>p.id).nodeWidth(10).nodePadding(10+(T?15:0)).nodeAlign(P).extent([[0,0],[a,k]])(M);let z=Tt(Ct);i.append("g").attr("class","nodes").selectAll(".node").data(M.nodes).join("g").attr("class","node").attr("id",p=>(p.uid=jt.next("node-")).id).attr("transform",function(p){return"translate("+p.x0+","+p.y0+")"}).attr("x",p=>p.x0).attr("y",p=>p.y0).append("rect").attr("height",p=>p.y1-p.y0).attr("width",p=>p.x1-p.x0).attr("fill",p=>z(p.id));let w=y(({id:p,value:A})=>T?`${p} -${v}${Math.round(A*100)/100}${C}`:p,"getText");i.append("g").attr("class","node-labels").attr("font-size",14).selectAll("text").data(M.nodes).join("text").attr("x",p=>p.x0
(p.y1+p.y0)/2).attr("dy",`${T?"0":"0.35"}em`).attr("text-anchor",p=>p.x0(A.uid=jt.next("linearGradient-")).id).attr("gradientUnits","userSpaceOnUse").attr("x1",A=>A.source.x1).attr("x2",A=>A.target.x0);p.append("stop").attr("offset","0%").attr("stop-color",A=>z(A.source.id)),p.append("stop").attr("offset","100%").attr("stop-color",A=>z(A.target.id))}let I;switch(R){case"gradient":I=y(p=>p.uid,"coloring");break;case"source":I=y(p=>z(p.source.id),"coloring");break;case"target":I=y(p=>z(p.target.id),"coloring");break;default:I=R}O.append("path").attr("d",yt()).attr("stroke",I).attr("stroke-width",p=>Math.max(1,p.width)),kt(void 0,i,0,_)},"draw"),ae={draw:ie},le=y(t=>t.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g,"").replaceAll(/([\n\r])+/g,` -`).trim(),"prepareTextForParsing"),ue=y(t=>`.label { - font-family: ${t.fontFamily}; - }`,"getStyles"),fe=ue,ce=tt.parse.bind(tt);tt.parse=t=>ce(le(t));var Qe={styles:fe,parser:tt,db:oe,renderer:ae};export{Qe as diagram}; diff --git a/src/google/adk/cli/browser/chunk-W7GRJBO5.js b/src/google/adk/cli/browser/chunk-W7GRJBO5.js new file mode 100644 index 0000000000..88ea626604 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-W7GRJBO5.js @@ -0,0 +1 @@ +var q=Object.create;var k=Object.defineProperty,r=Object.defineProperties,s=Object.getOwnPropertyDescriptor,t=Object.getOwnPropertyDescriptors,u=Object.getOwnPropertyNames,j=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,n=Object.prototype.hasOwnProperty,p=Object.prototype.propertyIsEnumerable;var m=(b,a)=>(a=Symbol[b])?a:Symbol.for("Symbol."+b),w=b=>{throw TypeError(b)};var o=(b,a,c)=>a in b?k(b,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):b[a]=c,z=(b,a)=>{for(var c in a||={})n.call(a,c)&&o(b,c,a[c]);if(j)for(var c of j(a))p.call(a,c)&&o(b,c,a[c]);return b},A=(b,a)=>r(b,t(a));var B=(b,a)=>{var c={};for(var d in b)n.call(b,d)&&a.indexOf(d)<0&&(c[d]=b[d]);if(b!=null&&j)for(var d of j(b))a.indexOf(d)<0&&p.call(b,d)&&(c[d]=b[d]);return c};var C=(b,a)=>()=>(a||b((a={exports:{}}).exports,a),a.exports),D=(b,a)=>{for(var c in a)k(b,c,{get:a[c],enumerable:!0})},x=(b,a,c,d)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of u(a))!n.call(b,e)&&e!==c&&k(b,e,{get:()=>a[e],enumerable:!(d=s(a,e))||d.enumerable});return b};var E=(b,a,c)=>(c=b!=null?q(v(b)):{},x(a||!b||!b.__esModule?k(c,"default",{value:b,enumerable:!0}):c,b));var F=(b,a,c)=>new Promise((d,e)=>{var f=g=>{try{i(c.next(g))}catch(l){e(l)}},h=g=>{try{i(c.throw(g))}catch(l){e(l)}},i=g=>g.done?d(g.value):Promise.resolve(g.value).then(f,h);i((c=c.apply(b,a)).next())}),y=function(b,a){this[0]=b,this[1]=a};var G=b=>{var a=b[m("asyncIterator")],c=!1,d,e={};return a==null?(a=b[m("iterator")](),d=f=>e[f]=h=>a[f](h)):(a=a.call(b),d=f=>e[f]=h=>{if(c){if(c=!1,f==="throw")throw h;return h}return c=!0,{done:!1,value:new y(new Promise(i=>{var g=a[f](h);g instanceof Object||w("Object expected"),i(g)}),1)}}),e[m("iterator")]=()=>e,d("next"),"throw"in a?d("throw"):e.throw=f=>{throw f},"return"in a&&d("return"),e};export{z as a,A as b,B as c,C as d,D as e,E as f,F as g,G as h}; diff --git a/src/google/adk/cli/browser/chunk-W7PRDKNL.js b/src/google/adk/cli/browser/chunk-W7PRDKNL.js deleted file mode 100644 index 6db8bd616f..0000000000 --- a/src/google/adk/cli/browser/chunk-W7PRDKNL.js +++ /dev/null @@ -1,53 +0,0 @@ -import{a as At,b as Ot}from"./chunk-DRBE27N3.js";import{a as w}from"./chunk-PRKFGJVH.js";import{a as jt,b as St,d as R,e as N}from"./chunk-VDPKVNDJ.js";import{d as $t,f as nt}from"./chunk-WXI2IBAH.js";import{i as wt,o as bt,q as st}from"./chunk-WBLSVR3V.js";import{$ as Rt,A as dt,E as it,G as Pt,I as Nt,J as _t,Y as U,u as ut}from"./chunk-QFMJV7VH.js";import{a as Q,g as b,i as Z}from"./chunk-JRNAXTJ7.js";import{a as tt,b as rt,j as C}from"./chunk-RMXJBC7V.js";var O=b((y,t,g)=>C(null,null,function*(){let o,l=t.useHtmlLabels||ut(U()?.htmlLabels);g?o=g:o="node default";let r=y.insert("g").attr("class",o).attr("id",t.domId||t.id),f=r.insert("g").attr("class","label").attr("style",st(t.labelStyle)),a;t.label===void 0?a="":a=typeof t.label=="string"?t.label:t.label[0];let c=!!t.icon||!!t.img,s=t.labelType==="markdown",e=yield nt(f,Pt(bt(a),U()),{useHtmlLabels:l,width:t.width||U().flowchart?.wrappingWidth,cssClasses:s?"markdown-node-label":void 0,style:t.labelStyle,addSvgBackground:c,markdown:s},U()),i=e.getBBox(),h=(t?.padding??0)/2;if(l){let n=e.children[0],p=Q(e);yield Ot(n,a),i=n.getBoundingClientRect(),p.attr("width",i.width),p.attr("height",i.height)}return l?f.attr("transform","translate("+-i.width/2+", "+-i.height/2+")"):f.attr("transform","translate(0, "+-i.height/2+")"),t.centerLabel&&f.attr("transform","translate("+-i.width/2+", "+-i.height/2+")"),f.insert("rect",":first-child"),{shapeSvg:r,bbox:i,halfPadding:h,label:f}}),"labelHelper"),Lt=b((y,t,g)=>C(null,null,function*(){let o=g.useHtmlLabels??it(U()),l=y.insert("g").attr("class","label").attr("style",g.labelStyle||""),r=yield nt(l,Pt(bt(t),U()),{useHtmlLabels:o,width:g.width||U()?.flowchart?.wrappingWidth,style:g.labelStyle,addSvgBackground:!!g.icon||!!g.img}),f=r.getBBox(),a=g.padding/2;if(it(U())){let c=r.children[0],s=Q(r);f=c.getBoundingClientRect(),s.attr("width",f.width),s.attr("height",f.height)}return o?l.attr("transform","translate("+-f.width/2+", "+-f.height/2+")"):l.attr("transform","translate(0, "+-f.height/2+")"),g.centerLabel&&l.attr("transform","translate("+-f.width/2+", "+-f.height/2+")"),l.insert("rect",":first-child"),{shapeSvg:y,bbox:f,halfPadding:a,label:l}}),"insertLabel"),A=b((y,t)=>{let g=t.node().getBBox();y.width=g.width,y.height=g.height},"updateNodeBounds"),T=b((y,t)=>(y.look==="handDrawn"?"rough-node":"node")+" "+y.cssClasses+" "+(t||""),"getNodeClasses");function z(y){let t=y.map((g,o)=>`${o===0?"M":"L"}${g.x},${g.y}`);return t.push("Z"),t.join(" ")}b(z,"createPathFromPoints");function ft(y,t,g,o,l,r){let f=[],c=g-y,s=o-t,e=c/r,i=2*Math.PI/e,h=t+s/2;for(let n=0;n<=50;n++){let p=n/50,u=y+p*c,m=h+l*Math.sin(i*(u-y));f.push({x:u,y:m})}return f}b(ft,"generateFullSineWavePoints");function kt(y,t,g,o,l,r){let f=[],a=l*Math.PI/180,e=(r*Math.PI/180-a)/(o-1);for(let i=0;i{var g=y.x,o=y.y,l=t.x-g,r=t.y-o,f=y.width/2,a=y.height/2,c,s;return Math.abs(r)*f>Math.abs(l)*a?(r<0&&(a=-a),c=r===0?0:a*l/r,s=a):(l<0&&(f=-f),c=f,s=l===0?0:f*r/l),{x:g+c,y:o+s}},"intersectRect"),xt=ne,ce=b((y,t,g,o=!1,l=!1)=>C(null,null,function*(){let r=t||"";typeof r=="object"&&(r=r[0]);let f=U(),a=it(f);return yield nt(y,r,{style:g,isTitle:o,useHtmlLabels:a,markdown:!1,isNode:l,width:Number.POSITIVE_INFINITY},f)}),"createLabel"),Bt=ce,yt=b((y,t,g,o,l)=>["M",y+l,t,"H",y+g-l,"A",l,l,0,0,1,y+g,t+l,"V",t+o-l,"A",l,l,0,0,1,y+g-l,t+o,"H",y+l,"A",l,l,0,0,1,y,t+o-l,"V",t+l,"A",l,l,0,0,1,y+l,t,"Z"].join(" "),"createRoundedRectPathD"),Xt=b((y,t)=>C(null,null,function*(){Z.info("Creating subgraph rect for ",t.id,t);let g=U(),{themeVariables:o,handDrawnSeed:l}=g,{clusterBkg:r,clusterBorder:f}=o,{labelStyles:a,nodeStyles:c,borderStyles:s,backgroundStyles:e}=R(t),i=y.insert("g").attr("class","cluster "+t.cssClasses).attr("id",t.id).attr("data-look",t.look),h=it(g),n=i.insert("g").attr("class","cluster-label "),p;t.labelType==="markdown"?p=yield nt(n,t.label,{style:t.labelStyle,useHtmlLabels:h,isNode:!0,width:t.width}):p=yield Bt(n,t.label,t.labelStyle||"",!1,!0);let u=p.getBBox();if(it(g)){let B=p.children[0],k=Q(p);u=B.getBoundingClientRect(),k.attr("width",u.width),k.attr("height",u.height)}let m=t.width<=u.width+t.padding?u.width+t.padding:t.width;t.width<=u.width+t.padding?t.diff=(m-t.width)/2-t.padding:t.diff=-t.padding;let d=t.height,x=t.x-m/2,D=t.y-d/2;Z.trace("Data ",t,JSON.stringify(t));let S;if(t.look==="handDrawn"){let B=w.svg(i),k=N(t,{roughness:.7,fill:r,stroke:f,fillWeight:3,seed:l}),M=B.path(yt(x,D,m,d,0),k);S=i.insert(()=>(Z.debug("Rough node insert CXC",M),M),":first-child"),S.select("path:nth-child(2)").attr("style",s.join(";")),S.select("path").attr("style",e.join(";").replace("fill","stroke"))}else S=i.insert("rect",":first-child"),S.attr("style",c).attr("rx",t.rx).attr("ry",t.ry).attr("x",x).attr("y",D).attr("width",m).attr("height",d);let{subGraphTitleTopMargin:$}=At(g);if(n.attr("transform",`translate(${t.x-u.width/2}, ${t.y-t.height/2+$})`),a){let B=n.select("span");B&&B.attr("style",a)}let v=S.node().getBBox();return t.offsetX=0,t.width=v.width,t.height=v.height,t.offsetY=u.height-t.padding/2,t.intersect=function(B){return xt(t,B)},{cluster:i,labelBBox:u}}),"rect"),oe=b((y,t)=>{let g=y.insert("g").attr("class","note-cluster").attr("id",t.id),o=g.insert("rect",":first-child"),l=0*t.padding,r=l/2;o.attr("rx",t.rx).attr("ry",t.ry).attr("x",t.x-t.width/2-r).attr("y",t.y-t.height/2-r).attr("width",t.width+l).attr("height",t.height+l).attr("fill","none");let f=o.node().getBBox();return t.width=f.width,t.height=f.height,t.intersect=function(a){return xt(t,a)},{cluster:g,labelBBox:{width:0,height:0}}},"noteGroup"),he=b((y,t)=>C(null,null,function*(){let g=U(),{themeVariables:o,handDrawnSeed:l}=g,{altBackground:r,compositeBackground:f,compositeTitleBackground:a,nodeBorder:c}=o,s=y.insert("g").attr("class",t.cssClasses).attr("id",t.id).attr("data-id",t.id).attr("data-look",t.look),e=s.insert("g",":first-child"),i=s.insert("g").attr("class","cluster-label"),h=s.append("rect"),n=yield Bt(i,t.label,t.labelStyle,void 0,!0),p=n.getBBox();if(it(g)){let M=n.children[0],I=Q(n);p=M.getBoundingClientRect(),I.attr("width",p.width),I.attr("height",p.height)}let u=0*t.padding,m=u/2,d=(t.width<=p.width+t.padding?p.width+t.padding:t.width)+u;t.width<=p.width+t.padding?t.diff=(d-t.width)/2-t.padding:t.diff=-t.padding;let x=t.height+u,D=t.height+u-p.height-6,S=t.x-d/2,$=t.y-x/2;t.width=d;let v=t.y-t.height/2-m+p.height+2,B;if(t.look==="handDrawn"){let M=t.cssClasses.includes("statediagram-cluster-alt"),I=w.svg(s),Y=t.rx||t.ry?I.path(yt(S,$,d,x,10),{roughness:.7,fill:a,fillStyle:"solid",stroke:c,seed:l}):I.rectangle(S,$,d,x,{seed:l});B=s.insert(()=>Y,":first-child");let V=I.rectangle(S,v,d,D,{fill:M?r:f,fillStyle:M?"hachure":"solid",stroke:c,seed:l});B=s.insert(()=>Y,":first-child"),h=s.insert(()=>V)}else B=e.insert("rect",":first-child"),B.attr("class","outer").attr("x",S).attr("y",$).attr("width",d).attr("height",x).attr("data-look",t.look),h.attr("class","inner").attr("x",S).attr("y",v).attr("width",d).attr("height",D);i.attr("transform",`translate(${t.x-p.width/2}, ${$+1-(it(g)?0:3)})`);let k=B.node().getBBox();return t.height=k.height,t.offsetX=0,t.offsetY=p.height-t.padding/2,t.labelBBox=p,t.intersect=function(M){return xt(t,M)},{cluster:s,labelBBox:p}}),"roundedWithTitle"),ge=b((y,t)=>C(null,null,function*(){Z.info("Creating subgraph rect for ",t.id,t);let g=U(),{themeVariables:o,handDrawnSeed:l}=g,{clusterBkg:r,clusterBorder:f}=o,{labelStyles:a,nodeStyles:c,borderStyles:s,backgroundStyles:e}=R(t),i=y.insert("g").attr("class","cluster "+t.cssClasses).attr("id",t.id).attr("data-look",t.look),h=it(g),n=i.insert("g").attr("class","cluster-label "),p=yield nt(n,t.label,{style:t.labelStyle,useHtmlLabels:h,isNode:!0,width:t.width}),u=p.getBBox();if(it(g)){let B=p.children[0],k=Q(p);u=B.getBoundingClientRect(),k.attr("width",u.width),k.attr("height",u.height)}let m=t.width<=u.width+t.padding?u.width+t.padding:t.width;t.width<=u.width+t.padding?t.diff=(m-t.width)/2-t.padding:t.diff=-t.padding;let d=t.height,x=t.x-m/2,D=t.y-d/2;Z.trace("Data ",t,JSON.stringify(t));let S;if(t.look==="handDrawn"){let B=w.svg(i),k=N(t,{roughness:.7,fill:r,stroke:f,fillWeight:4,seed:l}),M=B.path(yt(x,D,m,d,t.rx),k);S=i.insert(()=>(Z.debug("Rough node insert CXC",M),M),":first-child"),S.select("path:nth-child(2)").attr("style",s.join(";")),S.select("path").attr("style",e.join(";").replace("fill","stroke"))}else S=i.insert("rect",":first-child"),S.attr("style",c).attr("rx",t.rx).attr("ry",t.ry).attr("x",x).attr("y",D).attr("width",m).attr("height",d);let{subGraphTitleTopMargin:$}=At(g);if(n.attr("transform",`translate(${t.x-u.width/2}, ${t.y-t.height/2+$})`),a){let B=n.select("span");B&&B.attr("style",a)}let v=S.node().getBBox();return t.offsetX=0,t.width=v.width,t.height=v.height,t.offsetY=u.height-t.padding/2,t.intersect=function(B){return xt(t,B)},{cluster:i,labelBBox:u}}),"kanbanSection"),fe=b((y,t)=>{let g=U(),{themeVariables:o,handDrawnSeed:l}=g,{nodeBorder:r}=o,f=y.insert("g").attr("class",t.cssClasses).attr("id",t.id).attr("data-look",t.look),a=f.insert("g",":first-child"),c=0*t.padding,s=t.width+c;t.diff=-t.padding;let e=t.height+c,i=t.x-s/2,h=t.y-e/2;t.width=s;let n;if(t.look==="handDrawn"){let m=w.svg(f).rectangle(i,h,s,e,{fill:"lightgrey",roughness:.5,strokeLineDash:[5],stroke:r,seed:l});n=f.insert(()=>m,":first-child")}else n=a.insert("rect",":first-child"),n.attr("class","divider").attr("x",i).attr("y",h).attr("width",s).attr("height",e).attr("data-look",t.look);let p=n.node().getBBox();return t.height=p.height,t.offsetX=0,t.offsetY=0,t.intersect=function(u){return xt(t,u)},{cluster:f,labelBBox:{}}},"divider"),ye=Xt,pe={rect:Xt,squareRect:ye,roundedWithTitle:he,noteGroup:oe,divider:fe,kanbanSection:ge},Yt=new Map,Fe=b((y,t)=>C(null,null,function*(){let g=t.shape||"rect",o=yield pe[g](y,t);return Yt.set(t.id,o),o}),"insertCluster"),Ge=b(()=>{Yt=new Map},"clear");function qt(y,t){return y.intersect(t)}b(qt,"intersectNode");var ue=qt;function Ft(y,t,g,o){var l=y.x,r=y.y,f=l-o.x,a=r-o.y,c=Math.sqrt(t*t*a*a+g*g*f*f),s=Math.abs(t*g*f/c);o.x0}b(Ht,"sameSign");var me=Vt;function Zt(y,t,g){let o=y.x,l=y.y,r=[],f=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY;typeof t.forEach=="function"?t.forEach(function(e){f=Math.min(f,e.x),a=Math.min(a,e.y)}):(f=Math.min(f,t.x),a=Math.min(a,t.y));let c=o-y.width/2-f,s=l-y.height/2-a;for(let e=0;e1&&r.sort(function(e,i){let h=e.x-g.x,n=e.y-g.y,p=Math.sqrt(h*h+n*n),u=i.x-g.x,m=i.y-g.y,d=Math.sqrt(u*u+m*m);return pe,":first-child");return i.attr("class","anchor").attr("style",st(a)),A(t,i),t.intersect=function(h){return Z.info("Circle intersect",t,f,h),P.circle(t,f,h)},r}b(Jt,"anchor");function Wt(y,t,g,o,l,r,f){let c=(y+g)/2,s=(t+o)/2,e=Math.atan2(o-t,g-y),i=(g-y)/2,h=(o-t)/2,n=i/l,p=h/r,u=Math.sqrt(n**2+p**2);if(u>1)throw new Error("The given radii are too small to create an arc between the points.");let m=Math.sqrt(1-u**2),d=c+m*r*Math.sin(e)*(f?-1:1),x=s-m*l*Math.cos(e)*(f?-1:1),D=Math.atan2((t-x)/r,(y-d)/l),$=Math.atan2((o-x)/r,(g-d)/l)-D;f&&$<0&&($+=2*Math.PI),!f&&$>0&&($-=2*Math.PI);let v=[];for(let B=0;B<20;B++){let k=B/19,M=D+k*$,I=d+l*Math.cos(M),Y=x+r*Math.sin(M);v.push({x:I,y:Y})}return v}b(Wt,"generateArcPoints");function Qt(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=r.width+t.padding+20,a=r.height+t.padding,c=a/2,s=c/(2.5+a/50),{cssStyles:e}=t,i=[{x:f/2,y:-a/2},{x:-f/2,y:-a/2},...Wt(-f/2,-a/2,-f/2,a/2,s,c,!1),{x:f/2,y:a/2},...Wt(f/2,a/2,f/2,-a/2,s,c,!0)],h=w.svg(l),n=N(t,{});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=z(i),u=h.path(p,n),m=l.insert(()=>u,":first-child");return m.attr("class","basic label-container"),e&&t.look!=="handDrawn"&&m.selectAll("path").attr("style",e),o&&t.look!=="handDrawn"&&m.selectAll("path").attr("style",o),m.attr("transform",`translate(${s/2}, 0)`),A(t,m),t.intersect=function(d){return P.polygon(t,i,d)},l})}b(Qt,"bowTieRect");function ht(y,t,g,o){return y.insert("polygon",":first-child").attr("points",o.map(function(l){return l.x+","+l.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-t/2+","+g/2+")")}b(ht,"insertPolygonShape");function Ut(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=r.height+t.padding,a=12,c=r.width+t.padding+a,s=0,e=c,i=-f,h=0,n=[{x:s+a,y:i},{x:e,y:i},{x:e,y:h},{x:s,y:h},{x:s,y:i+a},{x:s+a,y:i}],p,{cssStyles:u}=t;if(t.look==="handDrawn"){let m=w.svg(l),d=N(t,{}),x=z(n),D=m.path(x,d);p=l.insert(()=>D,":first-child").attr("transform",`translate(${-c/2}, ${f/2})`),u&&p.attr("style",u)}else p=ht(l,c,f,n);return o&&p.attr("style",o),A(t,p),t.intersect=function(m){return P.polygon(t,n,m)},l})}b(Ut,"card");function Kt(y,t){let{nodeStyles:g}=R(t);t.label="";let o=y.insert("g").attr("class",T(t)).attr("id",t.domId??t.id),{cssStyles:l}=t,r=Math.max(28,t.width??0),f=[{x:0,y:r/2},{x:r/2,y:0},{x:0,y:-r/2},{x:-r/2,y:0}],a=w.svg(o),c=N(t,{});t.look!=="handDrawn"&&(c.roughness=0,c.fillStyle="solid");let s=z(f),e=a.path(s,c),i=o.insert(()=>e,":first-child");return l&&t.look!=="handDrawn"&&i.selectAll("path").attr("style",l),g&&t.look!=="handDrawn"&&i.selectAll("path").attr("style",g),t.width=28,t.height=28,t.intersect=function(h){return P.polygon(t,f,h)},o}b(Kt,"choice");function It(y,t,g){return C(this,null,function*(){let{labelStyles:o,nodeStyles:l}=R(t);t.labelStyle=o;let{shapeSvg:r,bbox:f,halfPadding:a}=yield O(y,t,T(t)),c=g?.padding??a,s=f.width/2+c,e,{cssStyles:i}=t;if(t.look==="handDrawn"){let h=w.svg(r),n=N(t,{}),p=h.circle(0,0,s*2,n);e=r.insert(()=>p,":first-child"),e.attr("class","basic label-container").attr("style",st(i))}else e=r.insert("circle",":first-child").attr("class","basic label-container").attr("style",l).attr("r",s).attr("cx",0).attr("cy",0);return A(t,e),t.calcIntersect=function(h,n){let p=h.width/2;return P.circle(h,p,n)},t.intersect=function(h){return Z.info("Circle intersect",t,s,h),P.circle(t,s,h)},r})}b(It,"circle");function ts(y){let t=Math.cos(Math.PI/4),g=Math.sin(Math.PI/4),o=y*2,l={x:o/2*t,y:o/2*g},r={x:-(o/2)*t,y:o/2*g},f={x:-(o/2)*t,y:-(o/2)*g},a={x:o/2*t,y:-(o/2)*g};return`M ${r.x},${r.y} L ${a.x},${a.y} - M ${l.x},${l.y} L ${f.x},${f.y}`}b(ts,"createLine");function ss(y,t){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g,t.label="";let l=y.insert("g").attr("class",T(t)).attr("id",t.domId??t.id),r=Math.max(30,t?.width??0),{cssStyles:f}=t,a=w.svg(l),c=N(t,{});t.look!=="handDrawn"&&(c.roughness=0,c.fillStyle="solid");let s=a.circle(0,0,r*2,c),e=ts(r),i=a.path(e,c),h=l.insert(()=>s,":first-child");return h.insert(()=>i),f&&t.look!=="handDrawn"&&h.selectAll("path").attr("style",f),o&&t.look!=="handDrawn"&&h.selectAll("path").attr("style",o),A(t,h),t.intersect=function(n){return Z.info("crossedCircle intersect",t,{radius:r,point:n}),P.circle(t,r,n)},l}b(ss,"crossedCircle");function ct(y,t,g,o=100,l=0,r=180){let f=[],a=l*Math.PI/180,e=(r*Math.PI/180-a)/(o-1);for(let i=0;iD,":first-child").attr("stroke-opacity",0),S.insert(()=>d,":first-child"),S.attr("class","text"),e&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",e),o&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",o),S.attr("transform",`translate(${s}, 0)`),f.attr("transform",`translate(${-a/2+s-(r.x-(r.left??0))},${-c/2+(t.padding??0)/2-(r.y-(r.top??0))})`),A(t,S),t.intersect=function($){return P.polygon(t,h,$)},l})}b(es,"curlyBraceLeft");function ot(y,t,g,o=100,l=0,r=180){let f=[],a=l*Math.PI/180,e=(r*Math.PI/180-a)/(o-1);for(let i=0;iD,":first-child").attr("stroke-opacity",0),S.insert(()=>d,":first-child"),S.attr("class","text"),e&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",e),o&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",o),S.attr("transform",`translate(${-s}, 0)`),f.attr("transform",`translate(${-a/2+(t.padding??0)/2-(r.x-(r.left??0))},${-c/2+(t.padding??0)/2-(r.y-(r.top??0))})`),A(t,S),t.intersect=function($){return P.polygon(t,h,$)},l})}b(as,"curlyBraceRight");function K(y,t,g,o=100,l=0,r=180){let f=[],a=l*Math.PI/180,e=(r*Math.PI/180-a)/(o-1);for(let i=0;iB,":first-child").attr("stroke-opacity",0),k.insert(()=>x,":first-child"),k.insert(()=>$,":first-child"),k.attr("class","text"),e&&t.look!=="handDrawn"&&k.selectAll("path").attr("style",e),o&&t.look!=="handDrawn"&&k.selectAll("path").attr("style",o),k.attr("transform",`translate(${s-s/4}, 0)`),f.attr("transform",`translate(${-a/2+(t.padding??0)/2-(r.x-(r.left??0))},${-c/2+(t.padding??0)/2-(r.y-(r.top??0))})`),A(t,k),t.intersect=function(M){return P.polygon(t,n,M)},l})}b(rs,"curlyBraces");function is(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=80,a=20,c=Math.max(f,(r.width+(t.padding??0)*2)*1.25,t?.width??0),s=Math.max(a,r.height+(t.padding??0)*2,t?.height??0),e=s/2,{cssStyles:i}=t,h=w.svg(l),n=N(t,{});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=c,u=s,m=p-e,d=u/4,x=[{x:m,y:0},{x:d,y:0},{x:0,y:u/2},{x:d,y:u},{x:m,y:u},...kt(-m,-u/2,e,50,270,90)],D=z(x),S=h.path(D,n),$=l.insert(()=>S,":first-child");return $.attr("class","basic label-container"),i&&t.look!=="handDrawn"&&$.selectChildren("path").attr("style",i),o&&t.look!=="handDrawn"&&$.selectChildren("path").attr("style",o),$.attr("transform",`translate(${-c/2}, ${-s/2})`),A(t,$),t.intersect=function(v){return P.polygon(t,x,v)},l})}b(is,"curvedTrapezoid");var we=b((y,t,g,o,l,r)=>[`M${y},${t+r}`,`a${l},${r} 0,0,0 ${g},0`,`a${l},${r} 0,0,0 ${-g},0`,`l0,${o}`,`a${l},${r} 0,0,0 ${g},0`,`l0,${-o}`].join(" "),"createCylinderPathD"),be=b((y,t,g,o,l,r)=>[`M${y},${t+r}`,`M${y+g},${t+r}`,`a${l},${r} 0,0,0 ${-g},0`,`l0,${o}`,`a${l},${r} 0,0,0 ${g},0`,`l0,${-o}`].join(" "),"createOuterCylinderPathD"),Se=b((y,t,g,o,l,r)=>[`M${y-g/2},${-o/2}`,`a${l},${r} 0,0,0 ${g},0`].join(" "),"createInnerCylinderPathD");function ls(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+t.padding,t.width??0),c=a/2,s=c/(2.5+a/50),e=Math.max(r.height+s+t.padding,t.height??0),i,{cssStyles:h}=t;if(t.look==="handDrawn"){let n=w.svg(l),p=be(0,0,a,e,c,s),u=Se(0,s,a,e,c,s),m=n.path(p,N(t,{})),d=n.path(u,N(t,{fill:"none"}));i=l.insert(()=>d,":first-child"),i=l.insert(()=>m,":first-child"),i.attr("class","basic label-container"),h&&i.attr("style",h)}else{let n=we(0,0,a,e,c,s);i=l.insert("path",":first-child").attr("d",n).attr("class","basic label-container").attr("style",st(h)).attr("style",o)}return i.attr("label-offset-y",s),i.attr("transform",`translate(${-a/2}, ${-(e/2+s)})`),A(t,i),f.attr("transform",`translate(${-(r.width/2)-(r.x-(r.left??0))}, ${-(r.height/2)+(t.padding??0)/1.5-(r.y-(r.top??0))})`),t.intersect=function(n){let p=P.rect(t,n),u=p.x-(t.x??0);if(c!=0&&(Math.abs(u)<(t.width??0)/2||Math.abs(u)==(t.width??0)/2&&Math.abs(p.y-(t.y??0))>(t.height??0)/2-s)){let m=s*s*(1-u*u/(c*c));m>0&&(m=Math.sqrt(m)),m=s-m,n.y-(t.y??0)>0&&(m=-m),p.y+=m}return p},l})}b(ls,"cylinder");function ns(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=r.width+t.padding,c=r.height+t.padding,s=c*.2,e=-a/2,i=-c/2-s/2,{cssStyles:h}=t,n=w.svg(l),p=N(t,{});t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let u=[{x:e,y:i+s},{x:-e,y:i+s},{x:-e,y:-i},{x:e,y:-i},{x:e,y:i},{x:-e,y:i},{x:-e,y:i+s}],m=n.polygon(u.map(x=>[x.x,x.y]),p),d=l.insert(()=>m,":first-child");return d.attr("class","basic label-container"),h&&t.look!=="handDrawn"&&d.selectAll("path").attr("style",h),o&&t.look!=="handDrawn"&&d.selectAll("path").attr("style",o),f.attr("transform",`translate(${e+(t.padding??0)/2-(r.x-(r.left??0))}, ${i+s+(t.padding??0)/2-(r.y-(r.top??0))})`),A(t,d),t.intersect=function(x){return P.rect(t,x)},l})}b(ns,"dividedRectangle");function cs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,halfPadding:f}=yield O(y,t,T(t)),c=r.width/2+f+5,s=r.width/2+f,e,{cssStyles:i}=t;if(t.look==="handDrawn"){let h=w.svg(l),n=N(t,{roughness:.2,strokeWidth:2.5}),p=N(t,{roughness:.2,strokeWidth:1.5}),u=h.circle(0,0,c*2,n),m=h.circle(0,0,s*2,p);e=l.insert("g",":first-child"),e.attr("class",st(t.cssClasses)).attr("style",st(i)),e.node()?.appendChild(u),e.node()?.appendChild(m)}else{e=l.insert("g",":first-child");let h=e.insert("circle",":first-child"),n=e.insert("circle");e.attr("class","basic label-container").attr("style",o),h.attr("class","outer-circle").attr("style",o).attr("r",c).attr("cx",0).attr("cy",0),n.attr("class","inner-circle").attr("style",o).attr("r",s).attr("cx",0).attr("cy",0)}return A(t,e),t.intersect=function(h){return Z.info("DoubleCircle intersect",t,c,h),P.circle(t,c,h)},l})}b(cs,"doublecircle");function os(y,t,{config:{themeVariables:g}}){let{labelStyles:o,nodeStyles:l}=R(t);t.label="",t.labelStyle=o;let r=y.insert("g").attr("class",T(t)).attr("id",t.domId??t.id),f=7,{cssStyles:a}=t,c=w.svg(r),{nodeBorder:s}=g,e=N(t,{fillStyle:"solid"});t.look!=="handDrawn"&&(e.roughness=0);let i=c.circle(0,0,f*2,e),h=r.insert(()=>i,":first-child");return h.selectAll("path").attr("style",`fill: ${s} !important;`),a&&a.length>0&&t.look!=="handDrawn"&&h.selectAll("path").attr("style",a),l&&t.look!=="handDrawn"&&h.selectAll("path").attr("style",l),A(t,h),t.intersect=function(n){return Z.info("filledCircle intersect",t,{radius:f,point:n}),P.circle(t,f,n)},r}b(os,"filledCircle");function hs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=r.width+(t.padding??0),c=a+r.height,s=a+r.height,e=[{x:0,y:-c},{x:s,y:-c},{x:s/2,y:0}],{cssStyles:i}=t,h=w.svg(l),n=N(t,{});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=z(e),u=h.path(p,n),m=l.insert(()=>u,":first-child").attr("transform",`translate(${-c/2}, ${c/2})`);return i&&t.look!=="handDrawn"&&m.selectChildren("path").attr("style",i),o&&t.look!=="handDrawn"&&m.selectChildren("path").attr("style",o),t.width=a,t.height=c,A(t,m),f.attr("transform",`translate(${-r.width/2-(r.x-(r.left??0))}, ${-c/2+(t.padding??0)/2+(r.y-(r.top??0))})`),t.intersect=function(d){return Z.info("Triangle intersect",t,e,d),P.polygon(t,e,d)},l})}b(hs,"flippedTriangle");function gs(y,t,{dir:g,config:{state:o,themeVariables:l}}){let{nodeStyles:r}=R(t);t.label="";let f=y.insert("g").attr("class",T(t)).attr("id",t.domId??t.id),{cssStyles:a}=t,c=Math.max(70,t?.width??0),s=Math.max(10,t?.height??0);g==="LR"&&(c=Math.max(10,t?.width??0),s=Math.max(70,t?.height??0));let e=-1*c/2,i=-1*s/2,h=w.svg(f),n=N(t,{stroke:l.lineColor,fill:l.lineColor});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=h.rectangle(e,i,c,s,n),u=f.insert(()=>p,":first-child");a&&t.look!=="handDrawn"&&u.selectAll("path").attr("style",a),r&&t.look!=="handDrawn"&&u.selectAll("path").attr("style",r),A(t,u);let m=o?.padding??0;return t.width&&t.height&&(t.width+=m/2||0,t.height+=m/2||0),t.intersect=function(d){return P.rect(t,d)},f}b(gs,"forkJoin");function fs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let l=80,r=50,{shapeSvg:f,bbox:a}=yield O(y,t,T(t)),c=Math.max(l,a.width+(t.padding??0)*2,t?.width??0),s=Math.max(r,a.height+(t.padding??0)*2,t?.height??0),e=s/2,{cssStyles:i}=t,h=w.svg(f),n=N(t,{});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=[{x:-c/2,y:-s/2},{x:c/2-e,y:-s/2},...kt(-c/2+e,0,e,50,90,270),{x:c/2-e,y:s/2},{x:-c/2,y:s/2}],u=z(p),m=h.path(u,n),d=f.insert(()=>m,":first-child");return d.attr("class","basic label-container"),i&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",i),o&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",o),A(t,d),t.intersect=function(x){return Z.info("Pill intersect",t,{radius:e,point:x}),P.polygon(t,p,x)},f})}b(fs,"halfRoundedRectangle");var $e=b((y,t,g,o,l)=>[`M${y+l},${t}`,`L${y+g-l},${t}`,`L${y+g},${t-o/2}`,`L${y+g-l},${t-o}`,`L${y+l},${t-o}`,`L${y},${t-o/2}`,"Z"].join(" "),"createHexagonPathD");function ys(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=4,a=r.height+t.padding,c=a/f,s=r.width+2*c+t.padding,e=[{x:c,y:0},{x:s-c,y:0},{x:s,y:-a/2},{x:s-c,y:-a},{x:c,y:-a},{x:0,y:-a/2}],i,{cssStyles:h}=t;if(t.look==="handDrawn"){let n=w.svg(l),p=N(t,{}),u=$e(0,0,s,a,c),m=n.path(u,p);i=l.insert(()=>m,":first-child").attr("transform",`translate(${-s/2}, ${a/2})`),h&&i.attr("style",h)}else i=ht(l,s,a,e);return o&&i.attr("style",o),t.width=s,t.height=a,A(t,i),t.intersect=function(n){return P.polygon(t,e,n)},l})}b(ys,"hexagon");function ps(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.label="",t.labelStyle=g;let{shapeSvg:l}=yield O(y,t,T(t)),r=Math.max(30,t?.width??0),f=Math.max(30,t?.height??0),{cssStyles:a}=t,c=w.svg(l),s=N(t,{});t.look!=="handDrawn"&&(s.roughness=0,s.fillStyle="solid");let e=[{x:0,y:0},{x:r,y:0},{x:0,y:f},{x:r,y:f}],i=z(e),h=c.path(i,s),n=l.insert(()=>h,":first-child");return n.attr("class","basic label-container"),a&&t.look!=="handDrawn"&&n.selectChildren("path").attr("style",a),o&&t.look!=="handDrawn"&&n.selectChildren("path").attr("style",o),n.attr("transform",`translate(${-r/2}, ${-f/2})`),A(t,n),t.intersect=function(p){return Z.info("Pill intersect",t,{points:e}),P.polygon(t,e,p)},l})}b(ps,"hourglass");function us(l,r,f){return C(this,arguments,function*(y,t,{config:{themeVariables:g,flowchart:o}}){let{labelStyles:a}=R(t);t.labelStyle=a;let c=t.assetHeight??48,s=t.assetWidth??48,e=Math.max(c,s),i=o?.wrappingWidth;t.width=Math.max(e,i??0);let{shapeSvg:h,bbox:n,label:p}=yield O(y,t,"icon-shape default"),u=t.pos==="t",m=e,d=e,{nodeBorder:x}=g,{stylesMap:D}=St(t),S=-d/2,$=-m/2,v=t.label?8:0,B=w.svg(h),k=N(t,{stroke:"none",fill:"none"});t.look!=="handDrawn"&&(k.roughness=0,k.fillStyle="solid");let M=B.rectangle(S,$,d,m,k),I=Math.max(d,n.width),Y=m+n.height+v,V=B.rectangle(-I/2,-Y/2,I,Y,rt(tt({},k),{fill:"transparent",stroke:"none"})),q=h.insert(()=>M,":first-child"),W=h.insert(()=>V);if(t.icon){let j=h.append("g");j.html(`${yield $t(t.icon,{height:e,width:e,fallbackPrefix:""})}`);let L=j.node().getBBox(),F=L.width,_=L.height,H=L.x,X=L.y;j.attr("transform",`translate(${-F/2-H},${u?n.height/2+v/2-_/2-X:-n.height/2-v/2-_/2-X})`),j.attr("style",`color: ${D.get("stroke")??x};`)}return p.attr("transform",`translate(${-n.width/2-(n.x-(n.left??0))},${u?-Y/2:Y/2-n.height})`),q.attr("transform",`translate(0,${u?n.height/2+v/2:-n.height/2-v/2})`),A(t,W),t.intersect=function(j){if(Z.info("iconSquare intersect",t,j),!t.label)return P.rect(t,j);let L=t.x??0,F=t.y??0,_=t.height??0,H=[];return u?H=[{x:L-n.width/2,y:F-_/2},{x:L+n.width/2,y:F-_/2},{x:L+n.width/2,y:F-_/2+n.height+v},{x:L+d/2,y:F-_/2+n.height+v},{x:L+d/2,y:F+_/2},{x:L-d/2,y:F+_/2},{x:L-d/2,y:F-_/2+n.height+v},{x:L-n.width/2,y:F-_/2+n.height+v}]:H=[{x:L-d/2,y:F-_/2},{x:L+d/2,y:F-_/2},{x:L+d/2,y:F-_/2+m},{x:L+n.width/2,y:F-_/2+m},{x:L+n.width/2/2,y:F+_/2},{x:L-n.width/2,y:F+_/2},{x:L-n.width/2,y:F-_/2+m},{x:L-d/2,y:F-_/2+m}],P.polygon(t,H,j)},h})}b(us,"icon");function ds(l,r,f){return C(this,arguments,function*(y,t,{config:{themeVariables:g,flowchart:o}}){let{labelStyles:a}=R(t);t.labelStyle=a;let c=t.assetHeight??48,s=t.assetWidth??48,e=Math.max(c,s),i=o?.wrappingWidth;t.width=Math.max(e,i??0);let{shapeSvg:h,bbox:n,label:p}=yield O(y,t,"icon-shape default"),u=20,m=t.label?8:0,d=t.pos==="t",{nodeBorder:x,mainBkg:D}=g,{stylesMap:S}=St(t),$=w.svg(h),v=N(t,{});t.look!=="handDrawn"&&(v.roughness=0,v.fillStyle="solid");let B=S.get("fill");v.stroke=B??D;let k=h.append("g");t.icon&&k.html(`${yield $t(t.icon,{height:e,width:e,fallbackPrefix:""})}`);let M=k.node().getBBox(),I=M.width,Y=M.height,V=M.x,q=M.y,W=Math.max(I,Y)*Math.SQRT2+u*2,j=$.circle(0,0,W,v),L=Math.max(W,n.width),F=W+n.height+m,_=$.rectangle(-L/2,-F/2,L,F,rt(tt({},v),{fill:"transparent",stroke:"none"})),H=h.insert(()=>j,":first-child"),X=h.insert(()=>_);return k.attr("transform",`translate(${-I/2-V},${d?n.height/2+m/2-Y/2-q:-n.height/2-m/2-Y/2-q})`),k.attr("style",`color: ${S.get("stroke")??x};`),p.attr("transform",`translate(${-n.width/2-(n.x-(n.left??0))},${d?-F/2:F/2-n.height})`),H.attr("transform",`translate(0,${d?n.height/2+m/2:-n.height/2-m/2})`),A(t,X),t.intersect=function(E){return Z.info("iconSquare intersect",t,E),P.rect(t,E)},h})}b(ds,"iconCircle");function ms(l,r,f){return C(this,arguments,function*(y,t,{config:{themeVariables:g,flowchart:o}}){let{labelStyles:a}=R(t);t.labelStyle=a;let c=t.assetHeight??48,s=t.assetWidth??48,e=Math.max(c,s),i=o?.wrappingWidth;t.width=Math.max(e,i??0);let{shapeSvg:h,bbox:n,halfPadding:p,label:u}=yield O(y,t,"icon-shape default"),m=t.pos==="t",d=e+p*2,x=e+p*2,{nodeBorder:D,mainBkg:S}=g,{stylesMap:$}=St(t),v=-x/2,B=-d/2,k=t.label?8:0,M=w.svg(h),I=N(t,{});t.look!=="handDrawn"&&(I.roughness=0,I.fillStyle="solid");let Y=$.get("fill");I.stroke=Y??S;let V=M.path(yt(v,B,x,d,5),I),q=Math.max(x,n.width),W=d+n.height+k,j=M.rectangle(-q/2,-W/2,q,W,rt(tt({},I),{fill:"transparent",stroke:"none"})),L=h.insert(()=>V,":first-child").attr("class","icon-shape2"),F=h.insert(()=>j);if(t.icon){let _=h.append("g");_.html(`${yield $t(t.icon,{height:e,width:e,fallbackPrefix:""})}`);let H=_.node().getBBox(),X=H.width,E=H.height,G=H.x,J=H.y;_.attr("transform",`translate(${-X/2-G},${m?n.height/2+k/2-E/2-J:-n.height/2-k/2-E/2-J})`),_.attr("style",`color: ${$.get("stroke")??D};`)}return u.attr("transform",`translate(${-n.width/2-(n.x-(n.left??0))},${m?-W/2:W/2-n.height})`),L.attr("transform",`translate(0,${m?n.height/2+k/2:-n.height/2-k/2})`),A(t,F),t.intersect=function(_){if(Z.info("iconSquare intersect",t,_),!t.label)return P.rect(t,_);let H=t.x??0,X=t.y??0,E=t.height??0,G=[];return m?G=[{x:H-n.width/2,y:X-E/2},{x:H+n.width/2,y:X-E/2},{x:H+n.width/2,y:X-E/2+n.height+k},{x:H+x/2,y:X-E/2+n.height+k},{x:H+x/2,y:X+E/2},{x:H-x/2,y:X+E/2},{x:H-x/2,y:X-E/2+n.height+k},{x:H-n.width/2,y:X-E/2+n.height+k}]:G=[{x:H-x/2,y:X-E/2},{x:H+x/2,y:X-E/2},{x:H+x/2,y:X-E/2+d},{x:H+n.width/2,y:X-E/2+d},{x:H+n.width/2/2,y:X+E/2},{x:H-n.width/2,y:X+E/2},{x:H-n.width/2,y:X-E/2+d},{x:H-x/2,y:X-E/2+d}],P.polygon(t,G,_)},h})}b(ms,"iconRounded");function xs(l,r,f){return C(this,arguments,function*(y,t,{config:{themeVariables:g,flowchart:o}}){let{labelStyles:a}=R(t);t.labelStyle=a;let c=t.assetHeight??48,s=t.assetWidth??48,e=Math.max(c,s),i=o?.wrappingWidth;t.width=Math.max(e,i??0);let{shapeSvg:h,bbox:n,halfPadding:p,label:u}=yield O(y,t,"icon-shape default"),m=t.pos==="t",d=e+p*2,x=e+p*2,{nodeBorder:D,mainBkg:S}=g,{stylesMap:$}=St(t),v=-x/2,B=-d/2,k=t.label?8:0,M=w.svg(h),I=N(t,{});t.look!=="handDrawn"&&(I.roughness=0,I.fillStyle="solid");let Y=$.get("fill");I.stroke=Y??S;let V=M.path(yt(v,B,x,d,.1),I),q=Math.max(x,n.width),W=d+n.height+k,j=M.rectangle(-q/2,-W/2,q,W,rt(tt({},I),{fill:"transparent",stroke:"none"})),L=h.insert(()=>V,":first-child"),F=h.insert(()=>j);if(t.icon){let _=h.append("g");_.html(`${yield $t(t.icon,{height:e,width:e,fallbackPrefix:""})}`);let H=_.node().getBBox(),X=H.width,E=H.height,G=H.x,J=H.y;_.attr("transform",`translate(${-X/2-G},${m?n.height/2+k/2-E/2-J:-n.height/2-k/2-E/2-J})`),_.attr("style",`color: ${$.get("stroke")??D};`)}return u.attr("transform",`translate(${-n.width/2-(n.x-(n.left??0))},${m?-W/2:W/2-n.height})`),L.attr("transform",`translate(0,${m?n.height/2+k/2:-n.height/2-k/2})`),A(t,F),t.intersect=function(_){if(Z.info("iconSquare intersect",t,_),!t.label)return P.rect(t,_);let H=t.x??0,X=t.y??0,E=t.height??0,G=[];return m?G=[{x:H-n.width/2,y:X-E/2},{x:H+n.width/2,y:X-E/2},{x:H+n.width/2,y:X-E/2+n.height+k},{x:H+x/2,y:X-E/2+n.height+k},{x:H+x/2,y:X+E/2},{x:H-x/2,y:X+E/2},{x:H-x/2,y:X-E/2+n.height+k},{x:H-n.width/2,y:X-E/2+n.height+k}]:G=[{x:H-x/2,y:X-E/2},{x:H+x/2,y:X-E/2},{x:H+x/2,y:X-E/2+d},{x:H+n.width/2,y:X-E/2+d},{x:H+n.width/2/2,y:X+E/2},{x:H-n.width/2,y:X+E/2},{x:H-n.width/2,y:X-E/2+d},{x:H-x/2,y:X-E/2+d}],P.polygon(t,G,_)},h})}b(xs,"iconSquare");function ws(o,l,r){return C(this,arguments,function*(y,t,{config:{flowchart:g}}){let f=new Image;f.src=t?.img??"",yield f.decode();let a=Number(f.naturalWidth.toString().replace("px","")),c=Number(f.naturalHeight.toString().replace("px",""));t.imageAspectRatio=a/c;let{labelStyles:s}=R(t);t.labelStyle=s;let e=g?.wrappingWidth;t.defaultWidth=g?.wrappingWidth;let i=Math.max(t.label?e??0:0,t?.assetWidth??a),h=t.constraint==="on"&&t?.assetHeight?t.assetHeight*t.imageAspectRatio:i,n=t.constraint==="on"?h/t.imageAspectRatio:t?.assetHeight??c;t.width=Math.max(h,e??0);let{shapeSvg:p,bbox:u,label:m}=yield O(y,t,"image-shape default"),d=t.pos==="t",x=-h/2,D=-n/2,S=t.label?8:0,$=w.svg(p),v=N(t,{});t.look!=="handDrawn"&&(v.roughness=0,v.fillStyle="solid");let B=$.rectangle(x,D,h,n,v),k=Math.max(h,u.width),M=n+u.height+S,I=$.rectangle(-k/2,-M/2,k,M,rt(tt({},v),{fill:"none",stroke:"none"})),Y=p.insert(()=>B,":first-child"),V=p.insert(()=>I);if(t.img){let q=p.append("image");q.attr("href",t.img),q.attr("width",h),q.attr("height",n),q.attr("preserveAspectRatio","none"),q.attr("transform",`translate(${-h/2},${d?M/2-n:-M/2})`)}return m.attr("transform",`translate(${-u.width/2-(u.x-(u.left??0))},${d?-n/2-u.height/2-S/2:n/2-u.height/2+S/2})`),Y.attr("transform",`translate(0,${d?u.height/2+S/2:-u.height/2-S/2})`),A(t,V),t.intersect=function(q){if(Z.info("iconSquare intersect",t,q),!t.label)return P.rect(t,q);let W=t.x??0,j=t.y??0,L=t.height??0,F=[];return d?F=[{x:W-u.width/2,y:j-L/2},{x:W+u.width/2,y:j-L/2},{x:W+u.width/2,y:j-L/2+u.height+S},{x:W+h/2,y:j-L/2+u.height+S},{x:W+h/2,y:j+L/2},{x:W-h/2,y:j+L/2},{x:W-h/2,y:j-L/2+u.height+S},{x:W-u.width/2,y:j-L/2+u.height+S}]:F=[{x:W-h/2,y:j-L/2},{x:W+h/2,y:j-L/2},{x:W+h/2,y:j-L/2+n},{x:W+u.width/2,y:j-L/2+n},{x:W+u.width/2/2,y:j+L/2},{x:W-u.width/2,y:j+L/2},{x:W-u.width/2,y:j-L/2+n},{x:W-h/2,y:j-L/2+n}],P.polygon(t,F,q)},p})}b(ws,"imageSquare");function bs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=Math.max(r.width+(t.padding??0)*2,t?.width??0),a=Math.max(r.height+(t.padding??0)*2,t?.height??0),c=[{x:0,y:0},{x:f,y:0},{x:f+3*a/6,y:-a},{x:-3*a/6,y:-a}],s,{cssStyles:e}=t;if(t.look==="handDrawn"){let i=w.svg(l),h=N(t,{}),n=z(c),p=i.path(n,h);s=l.insert(()=>p,":first-child").attr("transform",`translate(${-f/2}, ${a/2})`),e&&s.attr("style",e)}else s=ht(l,f,a,c);return o&&s.attr("style",o),t.width=f,t.height=a,A(t,s),t.intersect=function(i){return P.polygon(t,c,i)},l})}b(bs,"inv_trapezoid");function Dt(y,t,g){return C(this,null,function*(){let{labelStyles:o,nodeStyles:l}=R(t);t.labelStyle=o;let{shapeSvg:r,bbox:f}=yield O(y,t,T(t)),a=Math.max(f.width+g.labelPaddingX*2,t?.width||0),c=Math.max(f.height+g.labelPaddingY*2,t?.height||0),s=-a/2,e=-c/2,i,{rx:h,ry:n}=t,{cssStyles:p}=t;if(g?.rx&&g.ry&&(h=g.rx,n=g.ry),t.look==="handDrawn"){let u=w.svg(r),m=N(t,{}),d=h||n?u.path(yt(s,e,a,c,h||0),m):u.rectangle(s,e,a,c,m);i=r.insert(()=>d,":first-child"),i.attr("class","basic label-container").attr("style",st(p))}else i=r.insert("rect",":first-child"),i.attr("class","basic label-container").attr("style",l).attr("rx",st(h)).attr("ry",st(n)).attr("x",s).attr("y",e).attr("width",a).attr("height",c);return A(t,i),t.calcIntersect=function(u,m){return P.rect(u,m)},t.intersect=function(u){return P.rect(t,u)},r})}b(Dt,"drawRect");function Ss(y,t){return C(this,null,function*(){let{shapeSvg:g,bbox:o,label:l}=yield O(y,t,"label"),r=g.insert("rect",":first-child");return r.attr("width",.1).attr("height",.1),g.attr("class","label edgeLabel"),l.attr("transform",`translate(${-(o.width/2)-(o.x-(o.left??0))}, ${-(o.height/2)-(o.y-(o.top??0))})`),A(t,r),t.intersect=function(c){return P.rect(t,c)},g})}b(Ss,"labelRect");function $s(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=Math.max(r.width+(t.padding??0),t?.width??0),a=Math.max(r.height+(t.padding??0),t?.height??0),c=[{x:0,y:0},{x:f+3*a/6,y:0},{x:f,y:-a},{x:-(3*a)/6,y:-a}],s,{cssStyles:e}=t;if(t.look==="handDrawn"){let i=w.svg(l),h=N(t,{}),n=z(c),p=i.path(n,h);s=l.insert(()=>p,":first-child").attr("transform",`translate(${-f/2}, ${a/2})`),e&&s.attr("style",e)}else s=ht(l,f,a,c);return o&&s.attr("style",o),t.width=f,t.height=a,A(t,s),t.intersect=function(i){return P.polygon(t,c,i)},l})}b($s,"lean_left");function vs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=Math.max(r.width+(t.padding??0),t?.width??0),a=Math.max(r.height+(t.padding??0),t?.height??0),c=[{x:-3*a/6,y:0},{x:f,y:0},{x:f+3*a/6,y:-a},{x:0,y:-a}],s,{cssStyles:e}=t;if(t.look==="handDrawn"){let i=w.svg(l),h=N(t,{}),n=z(c),p=i.path(n,h);s=l.insert(()=>p,":first-child").attr("transform",`translate(${-f/2}, ${a/2})`),e&&s.attr("style",e)}else s=ht(l,f,a,c);return o&&s.attr("style",o),t.width=f,t.height=a,A(t,s),t.intersect=function(i){return P.polygon(t,c,i)},l})}b(vs,"lean_right");function ks(y,t){let{labelStyles:g,nodeStyles:o}=R(t);t.label="",t.labelStyle=g;let l=y.insert("g").attr("class",T(t)).attr("id",t.domId??t.id),{cssStyles:r}=t,f=Math.max(35,t?.width??0),a=Math.max(35,t?.height??0),c=7,s=[{x:f,y:0},{x:0,y:a+c/2},{x:f-2*c,y:a+c/2},{x:0,y:2*a},{x:f,y:a-c/2},{x:2*c,y:a-c/2}],e=w.svg(l),i=N(t,{});t.look!=="handDrawn"&&(i.roughness=0,i.fillStyle="solid");let h=z(s),n=e.path(h,i),p=l.insert(()=>n,":first-child");return r&&t.look!=="handDrawn"&&p.selectAll("path").attr("style",r),o&&t.look!=="handDrawn"&&p.selectAll("path").attr("style",o),p.attr("transform",`translate(-${f/2},${-a})`),A(t,p),t.intersect=function(u){return Z.info("lightningBolt intersect",t,u),P.polygon(t,s,u)},l}b(ks,"lightningBolt");var ve=b((y,t,g,o,l,r,f)=>[`M${y},${t+r}`,`a${l},${r} 0,0,0 ${g},0`,`a${l},${r} 0,0,0 ${-g},0`,`l0,${o}`,`a${l},${r} 0,0,0 ${g},0`,`l0,${-o}`,`M${y},${t+r+f}`,`a${l},${r} 0,0,0 ${g},0`].join(" "),"createCylinderPathD"),ke=b((y,t,g,o,l,r,f)=>[`M${y},${t+r}`,`M${y+g},${t+r}`,`a${l},${r} 0,0,0 ${-g},0`,`l0,${o}`,`a${l},${r} 0,0,0 ${g},0`,`l0,${-o}`,`M${y},${t+r+f}`,`a${l},${r} 0,0,0 ${g},0`].join(" "),"createOuterCylinderPathD"),De=b((y,t,g,o,l,r)=>[`M${y-g/2},${-o/2}`,`a${l},${r} 0,0,0 ${g},0`].join(" "),"createInnerCylinderPathD");function Ds(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0),t.width??0),c=a/2,s=c/(2.5+a/50),e=Math.max(r.height+s+(t.padding??0),t.height??0),i=e*.1,h,{cssStyles:n}=t;if(t.look==="handDrawn"){let p=w.svg(l),u=ke(0,0,a,e,c,s,i),m=De(0,s,a,e,c,s),d=N(t,{}),x=p.path(u,d),D=p.path(m,d);l.insert(()=>D,":first-child").attr("class","line"),h=l.insert(()=>x,":first-child"),h.attr("class","basic label-container"),n&&h.attr("style",n)}else{let p=ve(0,0,a,e,c,s,i);h=l.insert("path",":first-child").attr("d",p).attr("class","basic label-container").attr("style",st(n)).attr("style",o)}return h.attr("label-offset-y",s),h.attr("transform",`translate(${-a/2}, ${-(e/2+s)})`),A(t,h),f.attr("transform",`translate(${-(r.width/2)-(r.x-(r.left??0))}, ${-(r.height/2)+s-(r.y-(r.top??0))})`),t.intersect=function(p){let u=P.rect(t,p),m=u.x-(t.x??0);if(c!=0&&(Math.abs(m)<(t.width??0)/2||Math.abs(m)==(t.width??0)/2&&Math.abs(u.y-(t.y??0))>(t.height??0)/2-s)){let d=s*s*(1-m*m/(c*c));d>0&&(d=Math.sqrt(d)),d=s-d,p.y-(t.y??0)>0&&(d=-d),u.y+=d}return u},l})}b(Ds,"linedCylinder");function Bs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=c/4,e=c+s,{cssStyles:i}=t,h=w.svg(l),n=N(t,{});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=[{x:-a/2-a/2*.1,y:-e/2},{x:-a/2-a/2*.1,y:e/2},...ft(-a/2-a/2*.1,e/2,a/2+a/2*.1,e/2,s,.8),{x:a/2+a/2*.1,y:-e/2},{x:-a/2-a/2*.1,y:-e/2},{x:-a/2,y:-e/2},{x:-a/2,y:e/2*1.1},{x:-a/2,y:-e/2}],u=h.polygon(p.map(d=>[d.x,d.y]),n),m=l.insert(()=>u,":first-child");return m.attr("class","basic label-container"),i&&t.look!=="handDrawn"&&m.selectAll("path").attr("style",i),o&&t.look!=="handDrawn"&&m.selectAll("path").attr("style",o),m.attr("transform",`translate(0,${-s/2})`),f.attr("transform",`translate(${-a/2+(t.padding??0)+a/2*.1/2-(r.x-(r.left??0))},${-c/2+(t.padding??0)-s/2-(r.y-(r.top??0))})`),A(t,m),t.intersect=function(d){return P.polygon(t,p,d)},l})}b(Bs,"linedWaveEdgedRect");function Ms(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=5,e=-a/2,i=-c/2,{cssStyles:h}=t,n=w.svg(l),p=N(t,{}),u=[{x:e-s,y:i+s},{x:e-s,y:i+c+s},{x:e+a-s,y:i+c+s},{x:e+a-s,y:i+c},{x:e+a,y:i+c},{x:e+a,y:i+c-s},{x:e+a+s,y:i+c-s},{x:e+a+s,y:i-s},{x:e+s,y:i-s},{x:e+s,y:i},{x:e,y:i},{x:e,y:i+s}],m=[{x:e,y:i+s},{x:e+a-s,y:i+s},{x:e+a-s,y:i+c},{x:e+a,y:i+c},{x:e+a,y:i},{x:e,y:i}];t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let d=z(u),x=n.path(d,p),D=z(m),S=n.path(D,rt(tt({},p),{fill:"none"})),$=l.insert(()=>S,":first-child");return $.insert(()=>x,":first-child"),$.attr("class","basic label-container"),h&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",h),o&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",o),f.attr("transform",`translate(${-(r.width/2)-s-(r.x-(r.left??0))}, ${-(r.height/2)+s-(r.y-(r.top??0))})`),A(t,$),t.intersect=function(v){return P.polygon(t,u,v)},l})}b(Ms,"multiRect");function Cs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=c/4,e=c+s,i=-a/2,h=-e/2,n=5,{cssStyles:p}=t,u=ft(i-n,h+e+n,i+a-n,h+e+n,s,.8),m=u?.[u.length-1],d=[{x:i-n,y:h+n},{x:i-n,y:h+e+n},...u,{x:i+a-n,y:m.y-n},{x:i+a,y:m.y-n},{x:i+a,y:m.y-2*n},{x:i+a+n,y:m.y-2*n},{x:i+a+n,y:h-n},{x:i+n,y:h-n},{x:i+n,y:h},{x:i,y:h},{x:i,y:h+n}],x=[{x:i,y:h+n},{x:i+a-n,y:h+n},{x:i+a-n,y:m.y-n},{x:i+a,y:m.y-n},{x:i+a,y:h},{x:i,y:h}],D=w.svg(l),S=N(t,{});t.look!=="handDrawn"&&(S.roughness=0,S.fillStyle="solid");let $=z(d),v=D.path($,S),B=z(x),k=D.path(B,S),M=l.insert(()=>v,":first-child");return M.insert(()=>k),M.attr("class","basic label-container"),p&&t.look!=="handDrawn"&&M.selectAll("path").attr("style",p),o&&t.look!=="handDrawn"&&M.selectAll("path").attr("style",o),M.attr("transform",`translate(0,${-s/2})`),f.attr("transform",`translate(${-(r.width/2)-n-(r.x-(r.left??0))}, ${-(r.height/2)+n-s/2-(r.y-(r.top??0))})`),A(t,M),t.intersect=function(I){return P.polygon(t,d,I)},l})}b(Cs,"multiWaveEdgedRectangle");function Ps(o,l,r){return C(this,arguments,function*(y,t,{config:{themeVariables:g}}){let{labelStyles:f,nodeStyles:a}=R(t);t.labelStyle=f,t.useHtmlLabels||it(dt())||(t.centerLabel=!0);let{shapeSvg:s,bbox:e,label:i}=yield O(y,t,T(t)),h=Math.max(e.width+(t.padding??0)*2,t?.width??0),n=Math.max(e.height+(t.padding??0)*2,t?.height??0),p=-h/2,u=-n/2,{cssStyles:m}=t,d=w.svg(s),x=N(t,{fill:g.noteBkgColor,stroke:g.noteBorderColor});t.look!=="handDrawn"&&(x.roughness=0,x.fillStyle="solid");let D=d.rectangle(p,u,h,n,x),S=s.insert(()=>D,":first-child");return S.attr("class","basic label-container"),m&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",m),a&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",a),i.attr("transform",`translate(${-e.width/2-(e.x-(e.left??0))}, ${-(e.height/2)-(e.y-(e.top??0))})`),A(t,S),t.intersect=function($){return P.rect(t,$)},s})}b(Ps,"note");var Be=b((y,t,g)=>[`M${y+g/2},${t}`,`L${y+g},${t-g/2}`,`L${y+g/2},${t-g}`,`L${y},${t-g/2}`,"Z"].join(" "),"createDecisionBoxPathD");function Ns(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=r.width+t.padding,a=r.height+t.padding,c=f+a,s=.5,e=[{x:c/2,y:0},{x:c,y:-c/2},{x:c/2,y:-c},{x:0,y:-c/2}],i,{cssStyles:h}=t;if(t.look==="handDrawn"){let n=w.svg(l),p=N(t,{}),u=Be(0,0,c),m=n.path(u,p);i=l.insert(()=>m,":first-child").attr("transform",`translate(${-c/2+s}, ${c/2})`),h&&i.attr("style",h)}else i=ht(l,c,c,e),i.attr("transform",`translate(${-c/2+s}, ${c/2})`);return o&&i.attr("style",o),A(t,i),t.calcIntersect=function(n,p){let u=n.width,m=[{x:u/2,y:0},{x:u,y:-u/2},{x:u/2,y:-u},{x:0,y:-u/2}],d=P.polygon(n,m,p);return{x:d.x-.5,y:d.y-.5}},t.intersect=function(n){return this.calcIntersect(t,n)},l})}b(Ns,"question");function Rs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0),t?.width??0),c=Math.max(r.height+(t.padding??0),t?.height??0),s=-a/2,e=-c/2,i=e/2,h=[{x:s+i,y:e},{x:s,y:0},{x:s+i,y:-e},{x:-s,y:-e},{x:-s,y:e}],{cssStyles:n}=t,p=w.svg(l),u=N(t,{});t.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let m=z(h),d=p.path(m,u),x=l.insert(()=>d,":first-child");return x.attr("class","basic label-container"),n&&t.look!=="handDrawn"&&x.selectAll("path").attr("style",n),o&&t.look!=="handDrawn"&&x.selectAll("path").attr("style",o),x.attr("transform",`translate(${-i/2},0)`),f.attr("transform",`translate(${-i/2-r.width/2-(r.x-(r.left??0))}, ${-(r.height/2)-(r.y-(r.top??0))})`),A(t,x),t.intersect=function(D){return P.polygon(t,h,D)},l})}b(Rs,"rect_left_inv_arrow");function As(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let l;t.cssClasses?l="node "+t.cssClasses:l="node default";let r=y.insert("g").attr("class",l).attr("id",t.domId||t.id),f=r.insert("g"),a=r.insert("g").attr("class","label").attr("style",o),c=t.description,s=t.label,e=yield Bt(a,s,t.labelStyle,!0,!0),i={width:0,height:0};if(it(U())){let k=e.children[0],M=Q(e);i=k.getBoundingClientRect(),M.attr("width",i.width),M.attr("height",i.height)}Z.info("Text 2",c);let h=c||[],n=e.getBBox(),p=yield Bt(a,Array.isArray(h)?h.join("
"):h,t.labelStyle,!0,!0),u=p.children[0],m=Q(p);i=u.getBoundingClientRect(),m.attr("width",i.width),m.attr("height",i.height);let d=(t.padding||0)/2;Q(p).attr("transform","translate( "+(i.width>n.width?0:(n.width-i.width)/2)+", "+(n.height+d+5)+")"),Q(e).attr("transform","translate( "+(i.width(Z.debug("Rough node insert CXC",I),Y),":first-child"),v=r.insert(()=>(Z.debug("Rough node insert CXC",I),I),":first-child")}else v=f.insert("rect",":first-child"),B=f.insert("line"),v.attr("class","outer title-state").attr("style",o).attr("x",-i.width/2-d).attr("y",-i.height/2-d).attr("width",i.width+(t.padding||0)).attr("height",i.height+(t.padding||0)),B.attr("class","divider").attr("x1",-i.width/2-d).attr("x2",i.width/2+d).attr("y1",-i.height/2-d+n.height+d).attr("y2",-i.height/2-d+n.height+d);return A(t,v),t.intersect=function(k){return P.rect(t,k)},r})}b(As,"rectWithTitle");function Ls(y,t){return C(this,null,function*(){let g={rx:5,ry:5,classes:"",labelPaddingX:(t?.padding||0)*1,labelPaddingY:(t?.padding||0)*1};return Dt(y,t,g)})}b(Ls,"roundedRect");function Hs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=t?.padding??0,c=Math.max(r.width+(t.padding??0)*2,t?.width??0),s=Math.max(r.height+(t.padding??0)*2,t?.height??0),e=-r.width/2-a,i=-r.height/2-a,{cssStyles:h}=t,n=w.svg(l),p=N(t,{});t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let u=[{x:e,y:i},{x:e+c+8,y:i},{x:e+c+8,y:i+s},{x:e-8,y:i+s},{x:e-8,y:i},{x:e,y:i},{x:e,y:i+s}],m=n.polygon(u.map(x=>[x.x,x.y]),p),d=l.insert(()=>m,":first-child");return d.attr("class","basic label-container").attr("style",st(h)),o&&t.look!=="handDrawn"&&d.selectAll("path").attr("style",o),h&&t.look!=="handDrawn"&&d.selectAll("path").attr("style",o),f.attr("transform",`translate(${-c/2+4+(t.padding??0)-(r.x-(r.left??0))},${-s/2+(t.padding??0)-(r.y-(r.top??0))})`),A(t,d),t.intersect=function(x){return P.rect(t,x)},l})}b(Hs,"shadedProcess");function Ws(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=-a/2,e=-c/2,{cssStyles:i}=t,h=w.svg(l),n=N(t,{});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=[{x:s,y:e},{x:s,y:e+c},{x:s+a,y:e+c},{x:s+a,y:e-c/2}],u=z(p),m=h.path(u,n),d=l.insert(()=>m,":first-child");return d.attr("class","basic label-container"),i&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",i),o&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",o),d.attr("transform",`translate(0, ${c/4})`),f.attr("transform",`translate(${-a/2+(t.padding??0)-(r.x-(r.left??0))}, ${-c/4+(t.padding??0)-(r.y-(r.top??0))})`),A(t,d),t.intersect=function(x){return P.polygon(t,p,x)},l})}b(Ws,"slopedRect");function Is(y,t){return C(this,null,function*(){let g={rx:0,ry:0,classes:"",labelPaddingX:t.labelPaddingX??(t?.padding||0)*2,labelPaddingY:(t?.padding||0)*1};return Dt(y,t,g)})}b(Is,"squareRect");function Es(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=r.height+t.padding,a=r.width+f/4+t.padding,c=f/2,{cssStyles:s}=t,e=w.svg(l),i=N(t,{});t.look!=="handDrawn"&&(i.roughness=0,i.fillStyle="solid");let h=[{x:-a/2+c,y:-f/2},{x:a/2-c,y:-f/2},...kt(-a/2+c,0,c,50,90,270),{x:a/2-c,y:f/2},...kt(a/2-c,0,c,50,270,450)],n=z(h),p=e.path(n,i),u=l.insert(()=>p,":first-child");return u.attr("class","basic label-container outer-path"),s&&t.look!=="handDrawn"&&u.selectChildren("path").attr("style",s),o&&t.look!=="handDrawn"&&u.selectChildren("path").attr("style",o),A(t,u),t.intersect=function(m){return P.polygon(t,h,m)},l})}b(Es,"stadium");function Ts(y,t){return C(this,null,function*(){return Dt(y,t,{rx:5,ry:5,classes:"flowchart-node"})})}b(Ts,"state");function _s(y,t,{config:{themeVariables:g}}){let{labelStyles:o,nodeStyles:l}=R(t);t.labelStyle=o;let{cssStyles:r}=t,{lineColor:f,stateBorder:a,nodeBorder:c}=g,s=y.insert("g").attr("class","node default").attr("id",t.domId||t.id),e=w.svg(s),i=N(t,{});t.look!=="handDrawn"&&(i.roughness=0,i.fillStyle="solid");let h=e.circle(0,0,14,rt(tt({},i),{stroke:f,strokeWidth:2})),n=a??c,p=e.circle(0,0,5,rt(tt({},i),{fill:n,stroke:n,strokeWidth:2,fillStyle:"solid"})),u=s.insert(()=>h,":first-child");return u.insert(()=>p),r&&u.selectAll("path").attr("style",r),l&&u.selectAll("path").attr("style",l),A(t,u),t.intersect=function(m){return P.circle(t,7,m)},s}b(_s,"stateEnd");function Os(y,t,{config:{themeVariables:g}}){let{lineColor:o}=g,l=y.insert("g").attr("class","node default").attr("id",t.domId||t.id),r;if(t.look==="handDrawn"){let a=w.svg(l).circle(0,0,14,jt(o));r=l.insert(()=>a),r.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14)}else r=l.insert("circle",":first-child"),r.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14);return A(t,r),t.intersect=function(f){return P.circle(t,7,f)},l}b(Os,"stateStart");function js(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=(t?.padding||0)/2,a=r.width+t.padding,c=r.height+t.padding,s=-r.width/2-f,e=-r.height/2-f,i=[{x:0,y:0},{x:a,y:0},{x:a,y:-c},{x:0,y:-c},{x:0,y:0},{x:-8,y:0},{x:a+8,y:0},{x:a+8,y:-c},{x:-8,y:-c},{x:-8,y:0}];if(t.look==="handDrawn"){let h=w.svg(l),n=N(t,{}),p=h.rectangle(s-8,e,a+16,c,n),u=h.line(s,e,s,e+c,n),m=h.line(s+a,e,s+a,e+c,n);l.insert(()=>u,":first-child"),l.insert(()=>m,":first-child");let d=l.insert(()=>p,":first-child"),{cssStyles:x}=t;d.attr("class","basic label-container").attr("style",st(x)),A(t,d)}else{let h=ht(l,a,c,i);o&&h.attr("style",o),A(t,h)}return t.intersect=function(h){return P.polygon(t,i,h)},l})}b(js,"subroutine");function Xs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=Math.max(r.width+(t.padding??0)*2,t?.width??0),a=Math.max(r.height+(t.padding??0)*2,t?.height??0),c=-f/2,s=-a/2,e=.2*a,i=.2*a,{cssStyles:h}=t,n=w.svg(l),p=N(t,{}),u=[{x:c-e/2,y:s},{x:c+f+e/2,y:s},{x:c+f+e/2,y:s+a},{x:c-e/2,y:s+a}],m=[{x:c+f-e/2,y:s+a},{x:c+f+e/2,y:s+a},{x:c+f+e/2,y:s+a-i}];t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let d=z(u),x=n.path(d,p),D=z(m),S=n.path(D,rt(tt({},p),{fillStyle:"solid"})),$=l.insert(()=>S,":first-child");return $.insert(()=>x,":first-child"),$.attr("class","basic label-container"),h&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",h),o&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",o),A(t,$),t.intersect=function(v){return P.polygon(t,u,v)},l})}b(Xs,"taggedRect");function Ys(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=c/4,e=.2*a,i=.2*c,h=c+s,{cssStyles:n}=t,p=w.svg(l),u=N(t,{});t.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let m=[{x:-a/2-a/2*.1,y:h/2},...ft(-a/2-a/2*.1,h/2,a/2+a/2*.1,h/2,s,.8),{x:a/2+a/2*.1,y:-h/2},{x:-a/2-a/2*.1,y:-h/2}],d=-a/2+a/2*.1,x=-h/2-i*.4,D=[{x:d+a-e,y:(x+c)*1.4},{x:d+a,y:x+c-i},{x:d+a,y:(x+c)*.9},...ft(d+a,(x+c)*1.3,d+a-e,(x+c)*1.5,-c*.03,.5)],S=z(m),$=p.path(S,u),v=z(D),B=p.path(v,rt(tt({},u),{fillStyle:"solid"})),k=l.insert(()=>B,":first-child");return k.insert(()=>$,":first-child"),k.attr("class","basic label-container"),n&&t.look!=="handDrawn"&&k.selectAll("path").attr("style",n),o&&t.look!=="handDrawn"&&k.selectAll("path").attr("style",o),k.attr("transform",`translate(0,${-s/2})`),f.attr("transform",`translate(${-a/2+(t.padding??0)-(r.x-(r.left??0))},${-c/2+(t.padding??0)-s/2-(r.y-(r.top??0))})`),A(t,k),t.intersect=function(M){return P.polygon(t,m,M)},l})}b(Ys,"taggedWaveEdgedRectangle");function qs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=Math.max(r.width+t.padding,t?.width||0),a=Math.max(r.height+t.padding,t?.height||0),c=-f/2,s=-a/2,e=l.insert("rect",":first-child");return e.attr("class","text").attr("style",o).attr("rx",0).attr("ry",0).attr("x",c).attr("y",s).attr("width",f).attr("height",a),A(t,e),t.intersect=function(i){return P.rect(t,i)},l})}b(qs,"text");var Me=b((y,t,g,o,l,r)=>`M${y},${t} - a${l},${r} 0,0,1 0,${-o} - l${g},0 - a${l},${r} 0,0,1 0,${o} - M${g},${-o} - a${l},${r} 0,0,0 0,${o} - l${-g},0`,"createCylinderPathD"),Ce=b((y,t,g,o,l,r)=>[`M${y},${t}`,`M${y+g},${t}`,`a${l},${r} 0,0,0 0,${-o}`,`l${-g},0`,`a${l},${r} 0,0,0 0,${o}`,`l${g},0`].join(" "),"createOuterCylinderPathD"),Pe=b((y,t,g,o,l,r)=>[`M${y+g/2},${-o/2}`,`a${l},${r} 0,0,0 0,${o}`].join(" "),"createInnerCylinderPathD");function Fs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f,halfPadding:a}=yield O(y,t,T(t)),c=t.look==="neo"?a*2:a,s=r.height+c,e=s/2,i=e/(2.5+s/50),h=r.width+i+c,{cssStyles:n}=t,p;if(t.look==="handDrawn"){let u=w.svg(l),m=Ce(0,0,h,s,i,e),d=Pe(0,0,h,s,i,e),x=u.path(m,N(t,{})),D=u.path(d,N(t,{fill:"none"}));p=l.insert(()=>D,":first-child"),p=l.insert(()=>x,":first-child"),p.attr("class","basic label-container"),n&&p.attr("style",n)}else{let u=Me(0,0,h,s,i,e);p=l.insert("path",":first-child").attr("d",u).attr("class","basic label-container").attr("style",st(n)).attr("style",o),p.attr("class","basic label-container"),n&&p.selectAll("path").attr("style",n),o&&p.selectAll("path").attr("style",o)}return p.attr("label-offset-x",i),p.attr("transform",`translate(${-h/2}, ${s/2} )`),f.attr("transform",`translate(${-(r.width/2)-i-(r.x-(r.left??0))}, ${-(r.height/2)-(r.y-(r.top??0))})`),A(t,p),t.intersect=function(u){let m=P.rect(t,u),d=m.y-(t.y??0);if(e!=0&&(Math.abs(d)<(t.height??0)/2||Math.abs(d)==(t.height??0)/2&&Math.abs(m.x-(t.x??0))>(t.width??0)/2-i)){let x=i*i*(1-d*d/(e*e));x!=0&&(x=Math.sqrt(Math.abs(x))),x=i-x,u.x-(t.x??0)>0&&(x=-x),m.x+=x}return m},l})}b(Fs,"tiltedCylinder");function Gs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=r.width+t.padding,a=r.height+t.padding,c=[{x:-3*a/6,y:0},{x:f+3*a/6,y:0},{x:f,y:-a},{x:0,y:-a}],s,{cssStyles:e}=t;if(t.look==="handDrawn"){let i=w.svg(l),h=N(t,{}),n=z(c),p=i.path(n,h);s=l.insert(()=>p,":first-child").attr("transform",`translate(${-f/2}, ${a/2})`),e&&s.attr("style",e)}else s=ht(l,f,a,c);return o&&s.attr("style",o),t.width=f,t.height=a,A(t,s),t.intersect=function(i){return P.polygon(t,c,i)},l})}b(Gs,"trapezoid");function zs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=60,a=20,c=Math.max(f,r.width+(t.padding??0)*2,t?.width??0),s=Math.max(a,r.height+(t.padding??0)*2,t?.height??0),{cssStyles:e}=t,i=w.svg(l),h=N(t,{});t.look!=="handDrawn"&&(h.roughness=0,h.fillStyle="solid");let n=[{x:-c/2*.8,y:-s/2},{x:c/2*.8,y:-s/2},{x:c/2,y:-s/2*.6},{x:c/2,y:s/2},{x:-c/2,y:s/2},{x:-c/2,y:-s/2*.6}],p=z(n),u=i.path(p,h),m=l.insert(()=>u,":first-child");return m.attr("class","basic label-container"),e&&t.look!=="handDrawn"&&m.selectChildren("path").attr("style",e),o&&t.look!=="handDrawn"&&m.selectChildren("path").attr("style",o),A(t,m),t.intersect=function(d){return P.polygon(t,n,d)},l})}b(zs,"trapezoidalPentagon");function Vs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=t.useHtmlLabels||it(U()),c=r.width+(t.padding??0),s=c+r.height,e=c+r.height,i=[{x:0,y:0},{x:e,y:0},{x:e/2,y:-s}],{cssStyles:h}=t,n=w.svg(l),p=N(t,{});t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let u=z(i),m=n.path(u,p),d=l.insert(()=>m,":first-child").attr("transform",`translate(${-s/2}, ${s/2})`);return h&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",h),o&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",o),t.width=c,t.height=s,A(t,d),f.attr("transform",`translate(${-r.width/2-(r.x-(r.left??0))}, ${s/2-(r.height+(t.padding??0)/(a?2:1)-(r.y-(r.top??0)))})`),t.intersect=function(x){return Z.info("Triangle intersect",t,i,x),P.polygon(t,i,x)},l})}b(Vs,"triangle");function Zs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=c/8,e=c+s,{cssStyles:i}=t,n=70-a,p=n>0?n/2:0,u=w.svg(l),m=N(t,{});t.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let d=[{x:-a/2-p,y:e/2},...ft(-a/2-p,e/2,a/2+p,e/2,s,.8),{x:a/2+p,y:-e/2},{x:-a/2-p,y:-e/2}],x=z(d),D=u.path(x,m),S=l.insert(()=>D,":first-child");return S.attr("class","basic label-container"),i&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",i),o&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",o),S.attr("transform",`translate(0,${-s/2})`),f.attr("transform",`translate(${-a/2+(t.padding??0)-(r.x-(r.left??0))},${-c/2+(t.padding??0)-s-(r.y-(r.top??0))})`),A(t,S),t.intersect=function($){return P.polygon(t,d,$)},l})}b(Zs,"waveEdgedRectangle");function Js(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=100,a=50,c=Math.max(r.width+(t.padding??0)*2,t?.width??0),s=Math.max(r.height+(t.padding??0)*2,t?.height??0),e=c/s,i=c,h=s;i>h*e?h=i/e:i=h*e,i=Math.max(i,f),h=Math.max(h,a);let n=Math.min(h*.2,h/4),p=h+n*2,{cssStyles:u}=t,m=w.svg(l),d=N(t,{});t.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let x=[{x:-i/2,y:p/2},...ft(-i/2,p/2,i/2,p/2,n,1),{x:i/2,y:-p/2},...ft(i/2,-p/2,-i/2,-p/2,n,-1)],D=z(x),S=m.path(D,d),$=l.insert(()=>S,":first-child");return $.attr("class","basic label-container"),u&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",u),o&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",o),A(t,$),t.intersect=function(v){return P.polygon(t,x,v)},l})}b(Js,"waveRectangle");function Qs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=5,e=-a/2,i=-c/2,{cssStyles:h}=t,n=w.svg(l),p=N(t,{}),u=[{x:e-s,y:i-s},{x:e-s,y:i+c},{x:e+a,y:i+c},{x:e+a,y:i-s}],m=`M${e-s},${i-s} L${e+a},${i-s} L${e+a},${i+c} L${e-s},${i+c} L${e-s},${i-s} - M${e-s},${i} L${e+a},${i} - M${e},${i-s} L${e},${i+c}`;t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let d=n.path(m,p),x=l.insert(()=>d,":first-child");return x.attr("transform",`translate(${s/2}, ${s/2})`),x.attr("class","basic label-container"),h&&t.look!=="handDrawn"&&x.selectAll("path").attr("style",h),o&&t.look!=="handDrawn"&&x.selectAll("path").attr("style",o),f.attr("transform",`translate(${-(r.width/2)+s/2-(r.x-(r.left??0))}, ${-(r.height/2)+s/2-(r.y-(r.top??0))})`),A(t,x),t.intersect=function(D){return P.polygon(t,u,D)},l})}b(Qs,"windowPane");function Et(y,t){return C(this,null,function*(){let g=t;if(g.alias&&(t.label=g.alias),t.look==="handDrawn"){let{themeVariables:G}=dt(),{background:J}=G,et=rt(tt({},t),{id:t.id+"-background",look:"default",cssStyles:["stroke: none",`fill: ${J}`]});yield Et(y,et)}let o=dt();t.useHtmlLabels=o.htmlLabels;let l=o.er?.diagramPadding??10,r=o.er?.entityPadding??6,{cssStyles:f}=t,{labelStyles:a,nodeStyles:c}=R(t);if(g.attributes.length===0&&t.label){let G={rx:0,ry:0,labelPaddingX:l,labelPaddingY:l*1.5,classes:""};wt(t.label,o)+G.labelPaddingX*20){let G=i.width+l*2-(u+m+d+x);u+=G/$,m+=G/$,d>0&&(d+=G/$),x>0&&(x+=G/$)}let B=u+m+d+x,k=w.svg(e),M=N(t,{});t.look!=="handDrawn"&&(M.roughness=0,M.fillStyle="solid");let I=0;p.length>0&&(I=p.reduce((G,J)=>G+(J?.rowHeight??0),0));let Y=Math.max(v.width+l*2,t?.width||0,B),V=Math.max((I??0)+i.height,t?.height||0),q=-Y/2,W=-V/2;e.selectAll("g:not(:first-child)").each((G,J,et)=>{let at=Q(et[J]),pt=at.attr("transform"),gt=0,Tt=0;if(pt){let Ct=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(pt);Ct&&(gt=parseFloat(Ct[1]),Tt=parseFloat(Ct[2]),at.attr("class").includes("attribute-name")?gt+=u:at.attr("class").includes("attribute-keys")?gt+=u+m:at.attr("class").includes("attribute-comment")&&(gt+=u+m+d))}at.attr("transform",`translate(${q+l/2+gt}, ${Tt+W+i.height+r/2})`)}),e.select(".name").attr("transform","translate("+-i.width/2+", "+(W+r/2)+")");let j=k.rectangle(q,W,Y,V,M),L=e.insert(()=>j,":first-child").attr("style",f.join("")),{themeVariables:F}=dt(),{rowEven:_,rowOdd:H,nodeBorder:X}=F;n.push(0);for(let[G,J]of p.entries()){let at=(G+1)%2===0&&J.yOffset!==0,pt=k.rectangle(q,i.height+W+J?.yOffset,Y,J?.rowHeight,rt(tt({},M),{fill:at?_:H,stroke:X}));e.insert(()=>pt,"g.label").attr("style",f.join("")).attr("class",`row-rect-${at?"even":"odd"}`)}let E=k.line(q,i.height+W,Y+q,i.height+W,M);e.insert(()=>E).attr("class","divider"),E=k.line(u+q,i.height+W,u+q,V+W,M),e.insert(()=>E).attr("class","divider"),D&&(E=k.line(u+m+q,i.height+W,u+m+q,V+W,M),e.insert(()=>E).attr("class","divider")),S&&(E=k.line(u+m+d+q,i.height+W,u+m+d+q,V+W,M),e.insert(()=>E).attr("class","divider"));for(let G of n)E=k.line(q,i.height+W+G,Y+q,i.height+W+G,M),e.insert(()=>E).attr("class","divider");if(A(t,L),c&&t.look!=="handDrawn"){let J=c.split(";")?.filter(et=>et.includes("stroke"))?.map(et=>`${et}`).join("; ");e.selectAll("path").attr("style",J??""),e.selectAll(".row-rect-even path").attr("style",c)}return t.intersect=function(G){return P.rect(t,G)},e})}b(Et,"erBox");function mt(a,c,s){return C(this,arguments,function*(y,t,g,o=0,l=0,r=[],f=""){let e=y.insert("g").attr("class",`label ${r.join(" ")}`).attr("transform",`translate(${o}, ${l})`).attr("style",f);t!==Nt(t)&&(t=Nt(t),t=t.replaceAll("<","<").replaceAll(">",">"));let i=e.node().appendChild(yield nt(e,t,{width:wt(t,g)+100,style:f,useHtmlLabels:g.htmlLabels},g));if(t.includes("<")||t.includes(">")){let n=i.children[0];for(n.textContent=n.textContent.replaceAll("<","<").replaceAll(">",">");n.childNodes[0];)n=n.childNodes[0],n.textContent=n.textContent.replaceAll("<","<").replaceAll(">",">")}let h=i.getBBox();if(ut(g.htmlLabels)){let n=i.children[0];n.style.textAlign="start";let p=Q(i);h=n.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}return h})}b(mt,"addText");function Us(r,f,a,c){return C(this,arguments,function*(y,t,g,o,l=g.class.padding??12){let s=o?0:3,e=y.insert("g").attr("class",T(t)).attr("id",t.domId||t.id),i=null,h=null,n=null,p=null,u=0,m=0,d=0;if(i=e.insert("g").attr("class","annotation-group text"),t.annotations.length>0){let v=t.annotations[0];yield vt(i,{text:`\xAB${v}\xBB`},0),u=i.node().getBBox().height}h=e.insert("g").attr("class","label-group text"),yield vt(h,t,0,["font-weight: bolder"]);let x=h.node().getBBox();m=x.height,n=e.insert("g").attr("class","members-group text");let D=0;for(let v of t.members){let B=yield vt(n,v,D,[v.parseClassifier()]);D+=B+s}d=n.node().getBBox().height,d<=0&&(d=l/2),p=e.insert("g").attr("class","methods-group text");let S=0;for(let v of t.methods){let B=yield vt(p,v,S,[v.parseClassifier()]);S+=B+s}let $=e.node().getBBox();if(i!==null){let v=i.node().getBBox();i.attr("transform",`translate(${-v.width/2})`)}return h.attr("transform",`translate(${-x.width/2}, ${u})`),$=e.node().getBBox(),n.attr("transform",`translate(0, ${u+m+l*2})`),$=e.node().getBBox(),p.attr("transform",`translate(0, ${u+m+(d?d+l*4:l*2)})`),$=e.node().getBBox(),{shapeSvg:e,bbox:$}})}b(Us,"textHelper");function vt(l,r,f){return C(this,arguments,function*(y,t,g,o=[]){let a=y.insert("g").attr("class","label").attr("style",o.join("; ")),c=dt(),s="useHtmlLabels"in t?t.useHtmlLabels:ut(c.htmlLabels)??!0,e="";"text"in t?e=t.text:e=t.label,!s&&e.startsWith("\\")&&(e=e.substring(1)),_t(e)&&(s=!0);let i=yield nt(a,Rt(bt(e)),{width:wt(e,c)+50,classes:"markdown-node-label",useHtmlLabels:s},c),h,n=1;if(s){let p=i.children[0],u=Q(i);n=p.innerHTML.split("
").length,p.innerHTML.includes("")&&(n+=p.innerHTML.split("").length-1);let m=p.getElementsByTagName("img");if(m){let d=e.replace(/]*>/g,"").trim()==="";yield Promise.all([...m].map(x=>new Promise(D=>{function S(){if(x.style.display="flex",x.style.flexDirection="column",d){let $=c.fontSize?.toString()??window.getComputedStyle(document.body).fontSize,B=parseInt($,10)*5+"px";x.style.minWidth=B,x.style.maxWidth=B}else x.style.width="100%";D(x)}b(S,"setupImage"),setTimeout(()=>{x.complete&&S()}),x.addEventListener("error",S),x.addEventListener("load",S)})))}h=p.getBoundingClientRect(),u.attr("width",h.width),u.attr("height",h.height)}else{o.includes("font-weight: bolder")&&Q(i).selectAll("tspan").attr("font-weight",""),n=i.children.length;let p=i.children[0];(i.textContent===""||i.textContent.includes(">"))&&(p.textContent=e[0]+e.substring(1).replaceAll(">",">").replaceAll("<","<").trim(),e[1]===" "&&(p.textContent=p.textContent[0]+" "+p.textContent.substring(1))),p.textContent==="undefined"&&(p.textContent=""),h=i.getBBox()}return a.attr("transform","translate(0,"+(-h.height/(2*n)+g)+")"),h.height})}b(vt,"addText");function Ks(y,t){return C(this,null,function*(){let g=U(),o=g.class.padding??12,l=o,r=t.useHtmlLabels??ut(g.htmlLabels)??!0,f=t;f.annotations=f.annotations??[],f.members=f.members??[],f.methods=f.methods??[];let{shapeSvg:a,bbox:c}=yield Us(y,t,g,r,l),{labelStyles:s,nodeStyles:e}=R(t);t.labelStyle=s,t.cssStyles=f.styles||"";let i=f.styles?.join(";")||e||"";t.cssStyles||(t.cssStyles=i.replaceAll("!important","").split(";"));let h=f.members.length===0&&f.methods.length===0&&!g.class?.hideEmptyMembersBox,n=w.svg(a),p=N(t,{});t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let u=c.width,m=c.height;f.members.length===0&&f.methods.length===0?m+=l:f.members.length>0&&f.methods.length===0&&(m+=l*2);let d=-u/2,x=-m/2,D=n.rectangle(d-o,x-o-(h?o:f.members.length===0&&f.methods.length===0?-o/2:0),u+2*o,m+2*o+(h?o*2:f.members.length===0&&f.methods.length===0?-o:0),p),S=a.insert(()=>D,":first-child");S.attr("class","basic label-container");let $=S.node().getBBox();a.selectAll(".text").each((M,I,Y)=>{let V=Q(Y[I]),q=V.attr("transform"),W=0;if(q){let _=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(q);_&&(W=parseFloat(_[2]))}let j=W+x+o-(h?o:f.members.length===0&&f.methods.length===0?-o/2:0);r||(j-=4);let L=d;(V.attr("class").includes("label-group")||V.attr("class").includes("annotation-group"))&&(L=-V.node()?.getBBox().width/2||0,a.selectAll("text").each(function(F,_,H){window.getComputedStyle(H[_]).textAnchor==="middle"&&(L=0)})),V.attr("transform",`translate(${L}, ${j})`)});let v=a.select(".annotation-group").node().getBBox().height-(h?o/2:0)||0,B=a.select(".label-group").node().getBBox().height-(h?o/2:0)||0,k=a.select(".members-group").node().getBBox().height-(h?o/2:0)||0;if(f.members.length>0||f.methods.length>0||h){let M=n.line($.x,v+B+x+o,$.x+$.width,v+B+x+o,p);a.insert(()=>M).attr("class","divider").attr("style",i)}if(h||f.members.length>0||f.methods.length>0){let M=n.line($.x,v+B+k+x+l*2+o,$.x+$.width,v+B+k+x+o+l*2,p);a.insert(()=>M).attr("class","divider").attr("style",i)}if(f.look!=="handDrawn"&&a.selectAll("path").attr("style",i),S.select(":nth-child(2)").attr("style",i),a.selectAll(".divider").select("path").attr("style",i),t.labelStyle?a.selectAll("span").attr("style",t.labelStyle):a.selectAll("span").attr("style",i),!r){let M=RegExp(/color\s*:\s*([^;]*)/),I=M.exec(i);if(I){let Y=I[0].replace("color","fill");a.selectAll("tspan").attr("style",Y)}else if(s){let Y=M.exec(s);if(Y){let V=Y[0].replace("color","fill");a.selectAll("tspan").attr("style",V)}}}return A(t,S),t.intersect=function(M){return P.rect(t,M)},a})}b(Ks,"classBox");function te(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let l=t,r=t,f=20,a=20,c="verifyMethod"in t,s=T(t),e=y.insert("g").attr("class",s).attr("id",t.domId??t.id),i;c?i=yield lt(e,`<<${l.type}>>`,0,t.labelStyle):i=yield lt(e,"<<Element>>",0,t.labelStyle);let h=i,n=yield lt(e,l.name,h,t.labelStyle+"; font-weight: bold;");if(h+=n+a,c){let v=yield lt(e,`${l.requirementId?`ID: ${l.requirementId}`:""}`,h,t.labelStyle);h+=v;let B=yield lt(e,`${l.text?`Text: ${l.text}`:""}`,h,t.labelStyle);h+=B;let k=yield lt(e,`${l.risk?`Risk: ${l.risk}`:""}`,h,t.labelStyle);h+=k,yield lt(e,`${l.verifyMethod?`Verification: ${l.verifyMethod}`:""}`,h,t.labelStyle)}else{let v=yield lt(e,`${r.type?`Type: ${r.type}`:""}`,h,t.labelStyle);h+=v,yield lt(e,`${r.docRef?`Doc Ref: ${r.docRef}`:""}`,h,t.labelStyle)}let p=(e.node()?.getBBox().width??200)+f,u=(e.node()?.getBBox().height??200)+f,m=-p/2,d=-u/2,x=w.svg(e),D=N(t,{});t.look!=="handDrawn"&&(D.roughness=0,D.fillStyle="solid");let S=x.rectangle(m,d,p,u,D),$=e.insert(()=>S,":first-child");if($.attr("class","basic label-container").attr("style",o),e.selectAll(".label").each((v,B,k)=>{let M=Q(k[B]),I=M.attr("transform"),Y=0,V=0;if(I){let L=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(I);L&&(Y=parseFloat(L[1]),V=parseFloat(L[2]))}let q=V-u/2,W=m+f/2;(B===0||B===1)&&(W=Y),M.attr("transform",`translate(${W}, ${q+f})`)}),h>i+n+a){let v=x.line(m,d+i+n+a,m+p,d+i+n+a,D);e.insert(()=>v).attr("style",o)}return A(t,$),t.intersect=function(v){return P.rect(t,v)},e})}b(te,"requirementBox");function lt(y,t,g,o=""){return C(this,null,function*(){if(t==="")return 0;let l=y.insert("g").attr("class","label").attr("style",o),r=U(),f=r.htmlLabels??!0,a=yield nt(l,Rt(bt(t)),{width:wt(t,r)+50,classes:"markdown-node-label",useHtmlLabels:f,style:o},r),c;if(f){let s=a.children[0],e=Q(a);c=s.getBoundingClientRect(),e.attr("width",c.width),e.attr("height",c.height)}else{let s=a.children[0];for(let e of s.children)e.textContent=e.textContent.replaceAll(">",">").replaceAll("<","<"),o&&e.setAttribute("style",o);c=a.getBBox(),c.height+=6}return l.attr("transform",`translate(${-c.width/2},${-c.height/2+g})`),c.height})}b(lt,"addText");var Ne=b(y=>{switch(y){case"Very High":return"red";case"High":return"orange";case"Medium":return null;case"Low":return"blue";case"Very Low":return"lightblue"}},"colorFromPriority");function se(o,l,r){return C(this,arguments,function*(y,t,{config:g}){let{labelStyles:f,nodeStyles:a}=R(t);t.labelStyle=f||"";let c=10,s=t.width;t.width=(t.width??200)-10;let{shapeSvg:e,bbox:i,label:h}=yield O(y,t,T(t)),n=t.padding||10,p="",u;"ticket"in t&&t.ticket&&g?.kanban?.ticketBaseUrl&&(p=g?.kanban?.ticketBaseUrl.replace("#TICKET#",t.ticket),u=e.insert("svg:a",":first-child").attr("class","kanban-ticket-link").attr("xlink:href",p).attr("target","_blank"));let m={useHtmlLabels:t.useHtmlLabels,labelStyle:t.labelStyle||"",width:t.width,img:t.img,padding:t.padding||8,centerLabel:!1},d,x;u?{label:d,bbox:x}=yield Lt(u,"ticket"in t&&t.ticket||"",m):{label:d,bbox:x}=yield Lt(e,"ticket"in t&&t.ticket||"",m);let{label:D,bbox:S}=yield Lt(e,"assigned"in t&&t.assigned||"",m);t.width=s;let $=10,v=t?.width||0,B=Math.max(x.height,S.height)/2,k=Math.max(i.height+$*2,t?.height||0)+B,M=-v/2,I=-k/2;h.attr("transform","translate("+(n-v/2)+", "+(-B-i.height/2)+")"),d.attr("transform","translate("+(n-v/2)+", "+(-B+i.height/2)+")"),D.attr("transform","translate("+(n+v/2-S.width-2*c)+", "+(-B+i.height/2)+")");let Y,{rx:V,ry:q}=t,{cssStyles:W}=t;if(t.look==="handDrawn"){let j=w.svg(e),L=N(t,{}),F=V||q?j.path(yt(M,I,v,k,V||0),L):j.rectangle(M,I,v,k,L);Y=e.insert(()=>F,":first-child"),Y.attr("class","basic label-container").attr("style",W||null)}else{Y=e.insert("rect",":first-child"),Y.attr("class","basic label-container __APA__").attr("style",a).attr("rx",V??5).attr("ry",q??5).attr("x",M).attr("y",I).attr("width",v).attr("height",k);let j="priority"in t&&t.priority;if(j){let L=e.append("line"),F=M+2,_=I+Math.floor((V??0)/2),H=I+k-Math.floor((V??0)/2);L.attr("x1",F).attr("y1",_).attr("x2",F).attr("y2",H).attr("stroke-width","4").attr("stroke",Ne(j))}}return A(t,Y),t.height=k,t.intersect=function(j){return P.rect(t,j)},e})}b(se,"kanbanItem");function ee(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,halfPadding:f,label:a}=yield O(y,t,T(t)),c=r.width+10*f,s=r.height+8*f,e=.15*c,{cssStyles:i}=t,h=r.width+20,n=r.height+20,p=Math.max(c,h),u=Math.max(s,n);a.attr("transform",`translate(${-r.width/2}, ${-r.height/2})`);let m,d=`M0 0 - a${e},${e} 1 0,0 ${p*.25},${-1*u*.1} - a${e},${e} 1 0,0 ${p*.25},0 - a${e},${e} 1 0,0 ${p*.25},0 - a${e},${e} 1 0,0 ${p*.25},${u*.1} - - a${e},${e} 1 0,0 ${p*.15},${u*.33} - a${e*.8},${e*.8} 1 0,0 0,${u*.34} - a${e},${e} 1 0,0 ${-1*p*.15},${u*.33} - - a${e},${e} 1 0,0 ${-1*p*.25},${u*.15} - a${e},${e} 1 0,0 ${-1*p*.25},0 - a${e},${e} 1 0,0 ${-1*p*.25},0 - a${e},${e} 1 0,0 ${-1*p*.25},${-1*u*.15} - - a${e},${e} 1 0,0 ${-1*p*.1},${-1*u*.33} - a${e*.8},${e*.8} 1 0,0 0,${-1*u*.34} - a${e},${e} 1 0,0 ${p*.1},${-1*u*.33} - H0 V0 Z`;if(t.look==="handDrawn"){let x=w.svg(l),D=N(t,{}),S=x.path(d,D);m=l.insert(()=>S,":first-child"),m.attr("class","basic label-container").attr("style",st(i))}else m=l.insert("path",":first-child").attr("class","basic label-container").attr("style",o).attr("d",d);return m.attr("transform",`translate(${-p/2}, ${-u/2})`),A(t,m),t.calcIntersect=function(x,D){return P.rect(x,D)},t.intersect=function(x){return Z.info("Bang intersect",t,x),P.rect(t,x)},l})}b(ee,"bang");function ae(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,halfPadding:f,label:a}=yield O(y,t,T(t)),c=r.width+2*f,s=r.height+2*f,e=.15*c,i=.25*c,h=.35*c,n=.2*c,{cssStyles:p}=t,u,m=`M0 0 - a${e},${e} 0 0,1 ${c*.25},${-1*c*.1} - a${h},${h} 1 0,1 ${c*.4},${-1*c*.1} - a${i},${i} 1 0,1 ${c*.35},${c*.2} - - a${e},${e} 1 0,1 ${c*.15},${s*.35} - a${n},${n} 1 0,1 ${-1*c*.15},${s*.65} - - a${i},${e} 1 0,1 ${-1*c*.25},${c*.15} - a${h},${h} 1 0,1 ${-1*c*.5},0 - a${e},${e} 1 0,1 ${-1*c*.25},${-1*c*.15} - - a${e},${e} 1 0,1 ${-1*c*.1},${-1*s*.35} - a${n},${n} 1 0,1 ${c*.1},${-1*s*.65} - H0 V0 Z`;if(t.look==="handDrawn"){let d=w.svg(l),x=N(t,{}),D=d.path(m,x);u=l.insert(()=>D,":first-child"),u.attr("class","basic label-container").attr("style",st(p))}else u=l.insert("path",":first-child").attr("class","basic label-container").attr("style",o).attr("d",m);return a.attr("transform",`translate(${-r.width/2}, ${-r.height/2})`),u.attr("transform",`translate(${-c/2}, ${-s/2})`),A(t,u),t.calcIntersect=function(d,x){return P.rect(d,x)},t.intersect=function(d){return Z.info("Cloud intersect",t,d),P.rect(t,d)},l})}b(ae,"cloud");function re(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,halfPadding:f,label:a}=yield O(y,t,T(t)),c=r.width+8*f,s=r.height+2*f,e=5,i=` - M${-c/2} ${s/2-e} - v${-s+2*e} - q0,-${e} ${e},-${e} - h${c-2*e} - q${e},0 ${e},${e} - v${s-2*e} - q0,${e} -${e},${e} - h${-c+2*e} - q-${e},0 -${e},-${e} - Z - `,h=l.append("path").attr("id","node-"+t.id).attr("class","node-bkg node-"+t.type).attr("style",o).attr("d",i);return l.append("line").attr("class","node-line-").attr("x1",-c/2).attr("y1",s/2).attr("x2",c/2).attr("y2",s/2),a.attr("transform",`translate(${-r.width/2}, ${-r.height/2})`),l.append(()=>a.node()),A(t,h),t.calcIntersect=function(n,p){return P.rect(n,p)},t.intersect=function(n){return P.rect(t,n)},l})}b(re,"defaultMindmapNode");function ie(y,t){return C(this,null,function*(){let g={padding:t.padding??0};return It(y,t,g)})}b(ie,"mindmapCircle");var Re=[{semanticName:"Process",name:"Rectangle",shortName:"rect",description:"Standard process shape",aliases:["proc","process","rectangle"],internalAliases:["squareRect"],handler:Is},{semanticName:"Event",name:"Rounded Rectangle",shortName:"rounded",description:"Represents an event",aliases:["event"],internalAliases:["roundedRect"],handler:Ls},{semanticName:"Terminal Point",name:"Stadium",shortName:"stadium",description:"Terminal point",aliases:["terminal","pill"],handler:Es},{semanticName:"Subprocess",name:"Framed Rectangle",shortName:"fr-rect",description:"Subprocess",aliases:["subprocess","subproc","framed-rectangle","subroutine"],handler:js},{semanticName:"Database",name:"Cylinder",shortName:"cyl",description:"Database storage",aliases:["db","database","cylinder"],handler:ls},{semanticName:"Start",name:"Circle",shortName:"circle",description:"Starting point",aliases:["circ"],handler:It},{semanticName:"Bang",name:"Bang",shortName:"bang",description:"Bang",aliases:["bang"],handler:ee},{semanticName:"Cloud",name:"Cloud",shortName:"cloud",description:"cloud",aliases:["cloud"],handler:ae},{semanticName:"Decision",name:"Diamond",shortName:"diam",description:"Decision-making step",aliases:["decision","diamond","question"],handler:Ns},{semanticName:"Prepare Conditional",name:"Hexagon",shortName:"hex",description:"Preparation or condition step",aliases:["hexagon","prepare"],handler:ys},{semanticName:"Data Input/Output",name:"Lean Right",shortName:"lean-r",description:"Represents input or output",aliases:["lean-right","in-out"],internalAliases:["lean_right"],handler:vs},{semanticName:"Data Input/Output",name:"Lean Left",shortName:"lean-l",description:"Represents output or input",aliases:["lean-left","out-in"],internalAliases:["lean_left"],handler:$s},{semanticName:"Priority Action",name:"Trapezoid Base Bottom",shortName:"trap-b",description:"Priority action",aliases:["priority","trapezoid-bottom","trapezoid"],handler:Gs},{semanticName:"Manual Operation",name:"Trapezoid Base Top",shortName:"trap-t",description:"Represents a manual task",aliases:["manual","trapezoid-top","inv-trapezoid"],internalAliases:["inv_trapezoid"],handler:bs},{semanticName:"Stop",name:"Double Circle",shortName:"dbl-circ",description:"Represents a stop point",aliases:["double-circle"],internalAliases:["doublecircle"],handler:cs},{semanticName:"Text Block",name:"Text Block",shortName:"text",description:"Text block",handler:qs},{semanticName:"Card",name:"Notched Rectangle",shortName:"notch-rect",description:"Represents a card",aliases:["card","notched-rectangle"],handler:Ut},{semanticName:"Lined/Shaded Process",name:"Lined Rectangle",shortName:"lin-rect",description:"Lined process shape",aliases:["lined-rectangle","lined-process","lin-proc","shaded-process"],handler:Hs},{semanticName:"Start",name:"Small Circle",shortName:"sm-circ",description:"Small starting point",aliases:["start","small-circle"],internalAliases:["stateStart"],handler:Os},{semanticName:"Stop",name:"Framed Circle",shortName:"fr-circ",description:"Stop point",aliases:["stop","framed-circle"],internalAliases:["stateEnd"],handler:_s},{semanticName:"Fork/Join",name:"Filled Rectangle",shortName:"fork",description:"Fork or join in process flow",aliases:["join"],internalAliases:["forkJoin"],handler:gs},{semanticName:"Collate",name:"Hourglass",shortName:"hourglass",description:"Represents a collate operation",aliases:["hourglass","collate"],handler:ps},{semanticName:"Comment",name:"Curly Brace",shortName:"brace",description:"Adds a comment",aliases:["comment","brace-l"],handler:es},{semanticName:"Comment Right",name:"Curly Brace",shortName:"brace-r",description:"Adds a comment",handler:as},{semanticName:"Comment with braces on both sides",name:"Curly Braces",shortName:"braces",description:"Adds a comment",handler:rs},{semanticName:"Com Link",name:"Lightning Bolt",shortName:"bolt",description:"Communication link",aliases:["com-link","lightning-bolt"],handler:ks},{semanticName:"Document",name:"Document",shortName:"doc",description:"Represents a document",aliases:["doc","document"],handler:Zs},{semanticName:"Delay",name:"Half-Rounded Rectangle",shortName:"delay",description:"Represents a delay",aliases:["half-rounded-rectangle"],handler:fs},{semanticName:"Direct Access Storage",name:"Horizontal Cylinder",shortName:"h-cyl",description:"Direct access storage",aliases:["das","horizontal-cylinder"],handler:Fs},{semanticName:"Disk Storage",name:"Lined Cylinder",shortName:"lin-cyl",description:"Disk storage",aliases:["disk","lined-cylinder"],handler:Ds},{semanticName:"Display",name:"Curved Trapezoid",shortName:"curv-trap",description:"Represents a display",aliases:["curved-trapezoid","display"],handler:is},{semanticName:"Divided Process",name:"Divided Rectangle",shortName:"div-rect",description:"Divided process shape",aliases:["div-proc","divided-rectangle","divided-process"],handler:ns},{semanticName:"Extract",name:"Triangle",shortName:"tri",description:"Extraction process",aliases:["extract","triangle"],handler:Vs},{semanticName:"Internal Storage",name:"Window Pane",shortName:"win-pane",description:"Internal storage",aliases:["internal-storage","window-pane"],handler:Qs},{semanticName:"Junction",name:"Filled Circle",shortName:"f-circ",description:"Junction point",aliases:["junction","filled-circle"],handler:os},{semanticName:"Loop Limit",name:"Trapezoidal Pentagon",shortName:"notch-pent",description:"Loop limit step",aliases:["loop-limit","notched-pentagon"],handler:zs},{semanticName:"Manual File",name:"Flipped Triangle",shortName:"flip-tri",description:"Manual file operation",aliases:["manual-file","flipped-triangle"],handler:hs},{semanticName:"Manual Input",name:"Sloped Rectangle",shortName:"sl-rect",description:"Manual input step",aliases:["manual-input","sloped-rectangle"],handler:Ws},{semanticName:"Multi-Document",name:"Stacked Document",shortName:"docs",description:"Multiple documents",aliases:["documents","st-doc","stacked-document"],handler:Cs},{semanticName:"Multi-Process",name:"Stacked Rectangle",shortName:"st-rect",description:"Multiple processes",aliases:["procs","processes","stacked-rectangle"],handler:Ms},{semanticName:"Stored Data",name:"Bow Tie Rectangle",shortName:"bow-rect",description:"Stored data",aliases:["stored-data","bow-tie-rectangle"],handler:Qt},{semanticName:"Summary",name:"Crossed Circle",shortName:"cross-circ",description:"Summary",aliases:["summary","crossed-circle"],handler:ss},{semanticName:"Tagged Document",name:"Tagged Document",shortName:"tag-doc",description:"Tagged document",aliases:["tag-doc","tagged-document"],handler:Ys},{semanticName:"Tagged Process",name:"Tagged Rectangle",shortName:"tag-rect",description:"Tagged process",aliases:["tagged-rectangle","tag-proc","tagged-process"],handler:Xs},{semanticName:"Paper Tape",name:"Flag",shortName:"flag",description:"Paper tape",aliases:["paper-tape"],handler:Js},{semanticName:"Odd",name:"Odd",shortName:"odd",description:"Odd shape",internalAliases:["rect_left_inv_arrow"],handler:Rs},{semanticName:"Lined Document",name:"Lined Document",shortName:"lin-doc",description:"Lined document",aliases:["lined-document"],handler:Bs}],Ae=b(()=>{let t=[...Object.entries({state:Ts,choice:Kt,note:Ps,rectWithTitle:As,labelRect:Ss,iconSquare:xs,iconCircle:ds,icon:us,iconRounded:ms,imageSquare:ws,anchor:Jt,kanbanItem:se,mindmapCircle:ie,defaultMindmapNode:re,classBox:Ks,erBox:Et,requirementBox:te}),...Re.flatMap(g=>[g.shortName,..."aliases"in g?g.aliases:[],..."internalAliases"in g?g.internalAliases:[]].map(l=>[l,g.handler]))];return Object.fromEntries(t)},"generateShapeMap"),le=Ae();function Le(y){return y in le}b(Le,"isValidShape");var Mt=new Map;function He(y,t,g){return C(this,null,function*(){let o,l;t.shape==="rect"&&(t.rx&&t.ry?t.shape="roundedRect":t.shape="squareRect");let r=t.shape?le[t.shape]:void 0;if(!r)throw new Error(`No such shape: ${t.shape}. Please check your syntax.`);if(t.link){let f;g.config.securityLevel==="sandbox"?f="_top":t.linkTarget&&(f=t.linkTarget||"_blank"),o=y.insert("svg:a").attr("xlink:href",t.link).attr("target",f??null),l=yield r(o,t,g)}else l=yield r(y,t,g),o=l;return t.tooltip&&l.attr("title",t.tooltip),Mt.set(t.id,o),t.haveCallback&&o.attr("class",o.attr("class")+" clickable"),o})}b(He,"insertNode");var er=b((y,t)=>{Mt.set(t.id,y)},"setNodeElem"),ar=b(()=>{Mt.clear()},"clear"),rr=b(y=>{let t=Mt.get(y.id);Z.trace("Transforming node",y.diff,y,"translate("+(y.x-y.width/2-5)+", "+y.width/2+")");let g=8,o=y.diff||0;return y.clusterNode?t.attr("transform","translate("+(y.x+o-y.width/2)+", "+(y.y-y.height/2-g)+")"):t.attr("transform","translate("+y.x+", "+y.y+")"),o},"positionNode");export{O as a,A as b,Bt as c,Fe as d,Ge as e,Le as f,He as g,er as h,ar as i,rr as j}; diff --git a/src/google/adk/cli/browser/chunk-WAKWL6X3.js b/src/google/adk/cli/browser/chunk-WAKWL6X3.js deleted file mode 100644 index 94e5a71b6c..0000000000 --- a/src/google/adk/cli/browser/chunk-WAKWL6X3.js +++ /dev/null @@ -1,24 +0,0 @@ -import{a as F}from"./chunk-DMWOYWYQ.js";import{a as A}from"./chunk-T3Q3QCCV.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{a as E}from"./chunk-TPDTRWWV.js";import{l as w}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as y,N as $,R as B,S as C,T as S,U as D,V as T,W as P,X as z,r as x}from"./chunk-QFMJV7VH.js";import{g as h,i as u}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as m,j as v}from"./chunk-RMXJBC7V.js";var M=x.packet,W=class{constructor(){this.packet=[],this.setAccTitle=C,this.getAccTitle=S,this.setDiagramTitle=P,this.getDiagramTitle=z,this.getAccDescription=T,this.setAccDescription=D}static{h(this,"PacketDB")}getConfig(){let t=w(m(m({},M),y().packet));return t.showBits&&(t.paddingY+=10),t}getPacket(){return this.packet}pushWord(t){t.length>0&&this.packet.push(t)}clear(){B(),this.packet=[]}},Y=1e4,I=h((t,e)=>{F(t,e);let a=-1,o=[],n=1,{bitsPerRow:l}=e.getConfig();for(let{start:r,end:s,bits:d,label:c}of t.blocks){if(r!==void 0&&s!==void 0&&s{if(t.start===void 0)throw new Error("start should have been set during first phase");if(t.end===void 0)throw new Error("end should have been set during first phase");if(t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);if(t.end+1<=e*a)return[t,void 0];let o=e*a-1,n=e*a;return[{start:t.start,end:o,label:t.label,bits:o-t.start},{start:n,end:t.end,label:t.label,bits:t.end-n}]},"getNextFittingBlock"),_={parser:{yy:void 0},parse:h(t=>v(null,null,function*(){let e=yield A("packet",t),a=_.parser?.yy;if(!(a instanceof W))throw new Error("parser.parser?.yy was not a PacketDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");u.debug(e),I(e,a)}),"parse")},j=h((t,e,a,o)=>{let n=o.db,l=n.getConfig(),{rowHeight:r,paddingY:s,bitWidth:d,bitsPerRow:c}=l,p=n.getPacket(),i=n.getDiagramTitle(),f=r+s,g=f*(p.length+1)-(i?0:r),k=d*c+2,b=E(e);b.attr("viewBox",`0 0 ${k} ${g}`),$(b,g,k,l.useMaxWidth);for(let[N,L]of p.entries())G(b,L,N,l);b.append("text").text(i).attr("x",k/2).attr("y",g-f/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),G=h((t,e,a,{rowHeight:o,paddingX:n,paddingY:l,bitWidth:r,bitsPerRow:s,showBits:d})=>{let c=t.append("g"),p=a*(o+l)+l;for(let i of e){let f=i.start%s*r+1,g=(i.end-i.start+1)*r-n;if(c.append("rect").attr("x",f).attr("y",p).attr("width",g).attr("height",o).attr("class","packetBlock"),c.append("text").attr("x",f+g/2).attr("y",p+o/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(i.label),!d)continue;let k=i.end===i.start,b=p-2;c.append("text").attr("x",f+(k?g/2:0)).attr("y",b).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",k?"middle":"start").text(i.start),k||c.append("text").attr("x",f+g).attr("y",b).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(i.end)}},"drawWord"),H={draw:j},K={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},R=h(({packet:t}={})=>{let e=w(K,t);return` - .packetByte { - font-size: ${e.byteFontSize}; - } - .packetByte.start { - fill: ${e.startByteColor}; - } - .packetByte.end { - fill: ${e.endByteColor}; - } - .packetLabel { - fill: ${e.labelColor}; - font-size: ${e.labelFontSize}; - } - .packetTitle { - fill: ${e.titleColor}; - font-size: ${e.titleFontSize}; - } - .packetBlock { - stroke: ${e.blockStrokeColor}; - stroke-width: ${e.blockStrokeWidth}; - fill: ${e.blockFillColor}; - } - `},"styles"),Z={parser:_,get db(){return new W},renderer:H,styles:R};export{Z as diagram}; diff --git a/src/google/adk/cli/browser/chunk-WBLSVR3V.js b/src/google/adk/cli/browser/chunk-WBLSVR3V.js deleted file mode 100644 index 98bd99d4f6..0000000000 --- a/src/google/adk/cli/browser/chunk-WBLSVR3V.js +++ /dev/null @@ -1,2 +0,0 @@ -import{a as vt}from"./chunk-GP6TCC26.js";import{M as $,i as m,l as E,o as b,s as F}from"./chunk-QFMJV7VH.js";import{$ as J,L as _,O as A,P as N,Q as R,R as D,S as H,T as O,U as z,V as j,W as U,X as k,Y as X,Z as Y,_ as G,a as T,aa as q,ba as Z,ca as K,da as Q,ea as V,g as s,i as f}from"./chunk-JRNAXTJ7.js";import{K as M,V as L}from"./chunk-EGBSMT36.js";import{h as mt}from"./chunk-RMXJBC7V.js";var nt=mt(vt(),1);var yt="\u200B",xt={curveBasis:R,curveBasisClosed:D,curveBasisOpen:H,curveBumpX:A,curveBumpY:N,curveBundle:O,curveCardinalClosed:j,curveCardinalOpen:U,curveCardinal:z,curveCatmullRomClosed:X,curveCatmullRomOpen:Y,curveCatmullRom:k,curveLinear:_,curveLinearClosed:G,curveMonotoneX:J,curveMonotoneY:q,curveNatural:Z,curveStep:K,curveStepAfter:V,curveStepBefore:Q},pt=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Mt=s(function(e,t){let r=rt(e,/(?:init\b)|(?:initialize\b)/),n={};if(Array.isArray(r)){let a=r.map(l=>l.args);F(a),n=b(n,[...a])}else n=r.args;if(!n)return;let i=E(e,t),o="config";return n[o]!==void 0&&(i==="flowchart-v2"&&(i="flowchart"),n[i]=n[o],delete n[o]),n},"detectInit"),rt=s(function(e,t=null){try{let r=new RegExp(`[%]{2}(?![{]${pt.source})(?=[}][%]{2}).* -`,"ig");e=e.trim().replace(r,"").replace(/'/gm,'"'),f.debug(`Detecting diagram directive${t!==null?" type:"+t:""} based on the text:${e}`);let n,i=[];for(;(n=m.exec(e))!==null;)if(n.index===m.lastIndex&&m.lastIndex++,n&&!t||t&&n[1]?.match(t)||t&&n[2]?.match(t)){let o=n[1]?n[1]:n[2],a=n[3]?n[3].trim():n[4]?JSON.parse(n[4].trim()):null;i.push({type:o,args:a})}return i.length===0?{type:e,args:null}:i.length===1?i[0]:i}catch(r){return f.error(`ERROR: ${r.message} - Unable to parse directive type: '${t}' based on the text: '${e}'`),{type:void 0,args:null}}},"detectDirective"),Ot=s(function(e){return e.replace(m,"")},"removeDirectives"),$t=s(function(e,t){for(let[r,n]of t.entries())if(n.match(e))return r;return-1},"isSubstringInArray");function it(e,t){if(!e)return t;let r=`curve${e.charAt(0).toUpperCase()+e.slice(1)}`;return xt[r]??t}s(it,"interpolateToCurve");function ot(e,t){let r=e.trim();if(r)return t.securityLevel!=="loose"?(0,nt.sanitizeUrl)(r):r}s(ot,"formatUrl");var wt=s((e,...t)=>{let r=e.split("."),n=r.length-1,i=r[n],o=window;for(let a=0;a{r+=S(i,t),t=i});let n=r/2;return B(e,n)}s(at,"traverseEdge");function st(e){return e.length===1?e[0]:at(e)}s(st,"calcLabelPosition");var tt=s((e,t=2)=>{let r=Math.pow(10,t);return Math.round(e*r)/r},"roundNumber"),B=s((e,t)=>{let r,n=t;for(let i of e){if(r){let o=S(i,r);if(o===0)return r;if(o=1)return{x:i.x,y:i.y};if(a>0&&a<1)return{x:tt((1-a)*r.x+a*i.x,5),y:tt((1-a)*r.y+a*i.y,5)}}}r=i}throw new Error("Could not find a suitable point for the given distance")},"calculatePoint"),bt=s((e,t,r)=>{f.info(`our points ${JSON.stringify(t)}`),t[0]!==r&&(t=t.reverse());let i=B(t,25),o=e?10:5,a=Math.atan2(t[0].y-i.y,t[0].x-i.x),l={x:0,y:0};return l.x=Math.sin(a)*o+(t[0].x+i.x)/2,l.y=-Math.cos(a)*o+(t[0].y+i.y)/2,l},"calcCardinalityPosition");function ct(e,t,r){let n=structuredClone(r);f.info("our points",n),t!=="start_left"&&t!=="start_right"&&n.reverse();let i=25+e,o=B(n,i),a=10+e*.5,l=Math.atan2(n[0].y-o.y,n[0].x-o.x),c={x:0,y:0};return t==="start_left"?(c.x=Math.sin(l+Math.PI)*a+(n[0].x+o.x)/2,c.y=-Math.cos(l+Math.PI)*a+(n[0].y+o.y)/2):t==="end_right"?(c.x=Math.sin(l-Math.PI)*a+(n[0].x+o.x)/2-5,c.y=-Math.cos(l-Math.PI)*a+(n[0].y+o.y)/2-5):t==="end_left"?(c.x=Math.sin(l)*a+(n[0].x+o.x)/2-5,c.y=-Math.cos(l)*a+(n[0].y+o.y)/2-5):(c.x=Math.sin(l)*a+(n[0].x+o.x)/2,c.y=-Math.cos(l)*a+(n[0].y+o.y)/2),c}s(ct,"calcTerminalLabelPosition");function lt(e){let t="",r="";for(let n of e)n!==void 0&&(n.startsWith("color:")||n.startsWith("text-align:")?r=r+n+";":t=t+n+";");return{style:t,labelStyle:r}}s(lt,"getStylesFromArray");var et=0,St=s(()=>(et++,"id-"+Math.random().toString(36).substr(2,12)+"-"+et),"generateId");function ut(e){let t="",r="0123456789abcdef",n=r.length;for(let i=0;iut(e.length),"random"),Ct=s(function(){return{x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0,text:""}},"getTextObj"),Pt=s(function(e,t){let r=t.text.replace($.lineBreakRegex," "),[,n]=P(t.fontSize),i=e.append("text");i.attr("x",t.x),i.attr("y",t.y),i.style("text-anchor",t.anchor),i.style("font-family",t.fontFamily),i.style("font-size",n),i.style("font-weight",t.fontWeight),i.attr("fill",t.fill),t.class!==void 0&&i.attr("class",t.class);let o=i.append("tspan");return o.attr("x",t.x+t.textMargin*2),o.attr("fill",t.fill),o.text(r),i},"drawSimpleText"),Wt=M((e,t,r)=>{if(!e||(r=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"
"},r),$.lineBreakRegex.test(e)))return e;let n=e.split(" ").filter(Boolean),i=[],o="";return n.forEach((a,l)=>{let c=v(`${a} `,r),u=v(o,r);if(c>t){let{hyphenatedStrings:g,remainingWord:h}=It(a,t,"-",r);i.push(o,...g),o=h}else u+c>=t?(i.push(o),o=a):o=[o,a].filter(Boolean).join(" ");l+1===n.length&&i.push(o)}),i.filter(a=>a!=="").join(r.joinWith)},(e,t,r)=>`${e}${t}${r.fontSize}${r.fontWeight}${r.fontFamily}${r.joinWith}`),It=M((e,t,r="-",n)=>{n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},n);let i=[...e],o=[],a="";return i.forEach((l,c)=>{let u=`${a}${l}`;if(v(u,n)>=t){let x=c+1,g=i.length===x,h=`${u}${r}`;o.push(g?u:h),a=""}else a=u}),{hyphenatedStrings:o,remainingWord:a}},(e,t,r="-",n)=>`${e}${t}${r}${n.fontSize}${n.fontWeight}${n.fontFamily}`);function ht(e,t){return C(e,t).height}s(ht,"calculateTextHeight");function v(e,t){return C(e,t).width}s(v,"calculateTextWidth");var C=M((e,t)=>{let{fontSize:r=12,fontFamily:n="Arial",fontWeight:i=400}=t;if(!e)return{width:0,height:0};let[,o]=P(r),a=["sans-serif",n],l=e.split($.lineBreakRegex),c=[],u=T("body");if(!u.remove)return{width:0,height:0,lineHeight:0};let y=u.append("svg");for(let g of a){let h=0,d={width:0,height:0,lineHeight:0};for(let gt of l){let W=Ct();W.text=gt||yt;let I=Pt(y,W).style("font-size",o).style("font-weight",i).style("font-family",g),p=(I._groups||I)[0][0].getBBox();if(p.width===0&&p.height===0)throw new Error("svg element not in render tree");d.width=Math.round(Math.max(d.width,p.width)),h=Math.round(p.height),d.height+=h,d.lineHeight=Math.round(Math.max(d.lineHeight,h))}c.push(d)}y.remove();let x=isNaN(c[1].height)||isNaN(c[1].width)||isNaN(c[1].lineHeight)||c[0].height>c[1].height&&c[0].width>c[1].width&&c[0].lineHeight>c[1].lineHeight?0:1;return c[x]},(e,t)=>`${e}${t.fontSize}${t.fontWeight}${t.fontFamily}`),Lt=class{constructor(e=!1,t){this.count=0,this.count=t?t.length:0,this.next=e?()=>this.count++:()=>Date.now()}static{s(this,"InitIDGenerator")}},w,Tt=s(function(e){return w=w||document.createElement("div"),e=escape(e).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),w.innerHTML=e,unescape(w.textContent)},"entityDecode");function Et(e){return"str"in e}s(Et,"isDetailedError");var Ft=s((e,t,r,n)=>{if(!n)return;let i=e.node()?.getBBox();i&&e.append("text").text(n).attr("text-anchor","middle").attr("x",i.x+i.width/2).attr("y",-r).attr("class",t)},"insertTitle"),P=s(e=>{if(typeof e=="number")return[e,e+"px"];let t=parseInt(e??"",10);return Number.isNaN(t)?[void 0,void 0]:e===String(t)?[t,e+"px"]:[t,e]},"parseFontSize");function dt(e,t){return L({},e,t)}s(dt,"cleanAndMerge");var zt={assignWithDepth:b,wrapLabel:Wt,calculateTextHeight:ht,calculateTextWidth:v,calculateTextDimensions:C,cleanAndMerge:dt,detectInit:Mt,detectDirective:rt,isSubstringInArray:$t,interpolateToCurve:it,calcLabelPosition:st,calcCardinalityPosition:bt,calcTerminalLabelPosition:ct,formatUrl:ot,getStylesFromArray:lt,generateId:St,random:Bt,runFunc:wt,entityDecode:Tt,insertTitle:Ft,isLabelCoordinateInPath:ft,parseFontSize:P,InitIDGenerator:Lt},jt=s(function(e){let t=e;return t=t.replace(/style.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),t=t.replace(/classDef.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),t=t.replace(/#\w+;/g,function(r){let n=r.substring(1,r.length-1);return/^\+?\d+$/.test(n)?"\uFB02\xB0\xB0"+n+"\xB6\xDF":"\uFB02\xB0"+n+"\xB6\xDF"}),t},"encodeEntities"),Ut=s(function(e){return e.replace(/fl°°/g,"&#").replace(/fl°/g,"&").replace(/¶ß/g,";")},"decodeEntities"),kt=s((e,t,{counter:r=0,prefix:n,suffix:i},o)=>o||`${n?`${n}_`:""}${e}_${t}_${r}${i?`_${i}`:""}`,"getEdgeId");function _t(e){return e??null}s(_t,"handleUndefinedAttr");function ft(e,t){let r=Math.round(e.x),n=Math.round(e.y),i=t.replace(/(\d+\.\d+)/g,o=>Math.round(parseFloat(o)).toString());return i.includes(r.toString())||i.includes(n.toString())}s(ft,"isLabelCoordinateInPath");export{yt as a,Ot as b,it as c,lt as d,St as e,Bt as f,Wt as g,ht as h,v as i,Et as j,P as k,dt as l,zt as m,jt as n,Ut as o,kt as p,_t as q}; diff --git a/src/google/adk/cli/browser/chunk-WLB2FJ7K.js b/src/google/adk/cli/browser/chunk-WLB2FJ7K.js deleted file mode 100644 index 06877cfaca..0000000000 --- a/src/google/adk/cli/browser/chunk-WLB2FJ7K.js +++ /dev/null @@ -1,10 +0,0 @@ -import{a as ke,f as Ee}from"./chunk-NMKTPNXE.js";import{g as ve,h as ee,i as Ct}from"./chunk-WBLSVR3V.js";import{a as Fe}from"./chunk-GP6TCC26.js";import{G as te,M as Yt,N as be,S as ge,T as _e,U as xe,V as me,Y as Ot,o as ye}from"./chunk-QFMJV7VH.js";import{a as Dt,g as b,i as $t}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{h as Ue}from"./chunk-RMXJBC7V.js";var Re=Ue(Fe(),1),Ut=(function(){var e=b(function(_t,x,m,v){for(m=m||{},v=_t.length;v--;m[_t[v]]=x);return m},"o"),t=[1,24],s=[1,25],o=[1,26],l=[1,27],a=[1,28],n=[1,63],r=[1,64],i=[1,65],u=[1,66],d=[1,67],y=[1,68],p=[1,69],k=[1,29],O=[1,30],S=[1,31],P=[1,32],M=[1,33],U=[1,34],H=[1,35],q=[1,36],G=[1,37],K=[1,38],J=[1,39],Z=[1,40],$=[1,41],tt=[1,42],et=[1,43],at=[1,44],it=[1,45],rt=[1,46],nt=[1,47],st=[1,48],lt=[1,50],ot=[1,51],ct=[1,52],ht=[1,53],ut=[1,54],dt=[1,55],ft=[1,56],pt=[1,57],yt=[1,58],bt=[1,59],gt=[1,60],wt=[14,42],Wt=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Rt=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],E=[1,82],A=[1,83],C=[1,84],w=[1,85],T=[12,14,42],ce=[12,14,33,42],It=[12,14,33,42,76,77,79,80],vt=[12,33],Qt=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Ht={trace:b(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:b(function(x,m,v,g,R,h,St){var f=h.length-1;switch(R){case 3:g.setDirection("TB");break;case 4:g.setDirection("BT");break;case 5:g.setDirection("RL");break;case 6:g.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:g.setC4Type(h[f-3]);break;case 19:g.setTitle(h[f].substring(6)),this.$=h[f].substring(6);break;case 20:g.setAccDescription(h[f].substring(15)),this.$=h[f].substring(15);break;case 21:this.$=h[f].trim(),g.setTitle(this.$);break;case 22:case 23:this.$=h[f].trim(),g.setAccDescription(this.$);break;case 28:h[f].splice(2,0,"ENTERPRISE"),g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 29:h[f].splice(2,0,"SYSTEM"),g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 30:g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 31:h[f].splice(2,0,"CONTAINER"),g.addContainerBoundary(...h[f]),this.$=h[f];break;case 32:g.addDeploymentNode("node",...h[f]),this.$=h[f];break;case 33:g.addDeploymentNode("nodeL",...h[f]),this.$=h[f];break;case 34:g.addDeploymentNode("nodeR",...h[f]),this.$=h[f];break;case 35:g.popBoundaryParseStack();break;case 39:g.addPersonOrSystem("person",...h[f]),this.$=h[f];break;case 40:g.addPersonOrSystem("external_person",...h[f]),this.$=h[f];break;case 41:g.addPersonOrSystem("system",...h[f]),this.$=h[f];break;case 42:g.addPersonOrSystem("system_db",...h[f]),this.$=h[f];break;case 43:g.addPersonOrSystem("system_queue",...h[f]),this.$=h[f];break;case 44:g.addPersonOrSystem("external_system",...h[f]),this.$=h[f];break;case 45:g.addPersonOrSystem("external_system_db",...h[f]),this.$=h[f];break;case 46:g.addPersonOrSystem("external_system_queue",...h[f]),this.$=h[f];break;case 47:g.addContainer("container",...h[f]),this.$=h[f];break;case 48:g.addContainer("container_db",...h[f]),this.$=h[f];break;case 49:g.addContainer("container_queue",...h[f]),this.$=h[f];break;case 50:g.addContainer("external_container",...h[f]),this.$=h[f];break;case 51:g.addContainer("external_container_db",...h[f]),this.$=h[f];break;case 52:g.addContainer("external_container_queue",...h[f]),this.$=h[f];break;case 53:g.addComponent("component",...h[f]),this.$=h[f];break;case 54:g.addComponent("component_db",...h[f]),this.$=h[f];break;case 55:g.addComponent("component_queue",...h[f]),this.$=h[f];break;case 56:g.addComponent("external_component",...h[f]),this.$=h[f];break;case 57:g.addComponent("external_component_db",...h[f]),this.$=h[f];break;case 58:g.addComponent("external_component_queue",...h[f]),this.$=h[f];break;case 60:g.addRel("rel",...h[f]),this.$=h[f];break;case 61:g.addRel("birel",...h[f]),this.$=h[f];break;case 62:g.addRel("rel_u",...h[f]),this.$=h[f];break;case 63:g.addRel("rel_d",...h[f]),this.$=h[f];break;case 64:g.addRel("rel_l",...h[f]),this.$=h[f];break;case 65:g.addRel("rel_r",...h[f]),this.$=h[f];break;case 66:g.addRel("rel_b",...h[f]),this.$=h[f];break;case 67:h[f].splice(0,1),g.addRel("rel",...h[f]),this.$=h[f];break;case 68:g.updateElStyle("update_el_style",...h[f]),this.$=h[f];break;case 69:g.updateRelStyle("update_rel_style",...h[f]),this.$=h[f];break;case 70:g.updateLayoutConfig("update_layout_config",...h[f]),this.$=h[f];break;case 71:this.$=[h[f]];break;case 72:h[f].unshift(h[f-1]),this.$=h[f];break;case 73:case 75:this.$=h[f].trim();break;case 74:let kt={};kt[h[f-1].trim()]=h[f].trim(),this.$=kt;break;case 76:this.$="";break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:a,29:49,30:61,32:62,34:n,36:r,37:i,38:u,39:d,40:y,41:p,43:23,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:70,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:a,29:49,30:61,32:62,34:n,36:r,37:i,38:u,39:d,40:y,41:p,43:23,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:71,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:a,29:49,30:61,32:62,34:n,36:r,37:i,38:u,39:d,40:y,41:p,43:23,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:72,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:a,29:49,30:61,32:62,34:n,36:r,37:i,38:u,39:d,40:y,41:p,43:23,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:73,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:a,29:49,30:61,32:62,34:n,36:r,37:i,38:u,39:d,40:y,41:p,43:23,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{14:[1,74]},e(wt,[2,13],{43:23,29:49,30:61,32:62,20:75,34:n,36:r,37:i,38:u,39:d,40:y,41:p,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt}),e(wt,[2,14]),e(Wt,[2,16],{12:[1,76]}),e(wt,[2,36],{12:[1,77]}),e(Rt,[2,19]),e(Rt,[2,20]),{25:[1,78]},{27:[1,79]},e(Rt,[2,23]),{35:80,75:81,76:E,77:A,79:C,80:w},{35:86,75:81,76:E,77:A,79:C,80:w},{35:87,75:81,76:E,77:A,79:C,80:w},{35:88,75:81,76:E,77:A,79:C,80:w},{35:89,75:81,76:E,77:A,79:C,80:w},{35:90,75:81,76:E,77:A,79:C,80:w},{35:91,75:81,76:E,77:A,79:C,80:w},{35:92,75:81,76:E,77:A,79:C,80:w},{35:93,75:81,76:E,77:A,79:C,80:w},{35:94,75:81,76:E,77:A,79:C,80:w},{35:95,75:81,76:E,77:A,79:C,80:w},{35:96,75:81,76:E,77:A,79:C,80:w},{35:97,75:81,76:E,77:A,79:C,80:w},{35:98,75:81,76:E,77:A,79:C,80:w},{35:99,75:81,76:E,77:A,79:C,80:w},{35:100,75:81,76:E,77:A,79:C,80:w},{35:101,75:81,76:E,77:A,79:C,80:w},{35:102,75:81,76:E,77:A,79:C,80:w},{35:103,75:81,76:E,77:A,79:C,80:w},{35:104,75:81,76:E,77:A,79:C,80:w},e(T,[2,59]),{35:105,75:81,76:E,77:A,79:C,80:w},{35:106,75:81,76:E,77:A,79:C,80:w},{35:107,75:81,76:E,77:A,79:C,80:w},{35:108,75:81,76:E,77:A,79:C,80:w},{35:109,75:81,76:E,77:A,79:C,80:w},{35:110,75:81,76:E,77:A,79:C,80:w},{35:111,75:81,76:E,77:A,79:C,80:w},{35:112,75:81,76:E,77:A,79:C,80:w},{35:113,75:81,76:E,77:A,79:C,80:w},{35:114,75:81,76:E,77:A,79:C,80:w},{35:115,75:81,76:E,77:A,79:C,80:w},{20:116,29:49,30:61,32:62,34:n,36:r,37:i,38:u,39:d,40:y,41:p,43:23,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{12:[1,118],33:[1,117]},{35:119,75:81,76:E,77:A,79:C,80:w},{35:120,75:81,76:E,77:A,79:C,80:w},{35:121,75:81,76:E,77:A,79:C,80:w},{35:122,75:81,76:E,77:A,79:C,80:w},{35:123,75:81,76:E,77:A,79:C,80:w},{35:124,75:81,76:E,77:A,79:C,80:w},{35:125,75:81,76:E,77:A,79:C,80:w},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},e(wt,[2,15]),e(Wt,[2,17],{21:22,19:130,22:t,23:s,24:o,26:l,28:a}),e(wt,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:t,23:s,24:o,26:l,28:a,34:n,36:r,37:i,38:u,39:d,40:y,41:p,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt}),e(Rt,[2,21]),e(Rt,[2,22]),e(T,[2,39]),e(ce,[2,71],{75:81,35:132,76:E,77:A,79:C,80:w}),e(It,[2,73]),{78:[1,133]},e(It,[2,75]),e(It,[2,76]),e(T,[2,40]),e(T,[2,41]),e(T,[2,42]),e(T,[2,43]),e(T,[2,44]),e(T,[2,45]),e(T,[2,46]),e(T,[2,47]),e(T,[2,48]),e(T,[2,49]),e(T,[2,50]),e(T,[2,51]),e(T,[2,52]),e(T,[2,53]),e(T,[2,54]),e(T,[2,55]),e(T,[2,56]),e(T,[2,57]),e(T,[2,58]),e(T,[2,60]),e(T,[2,61]),e(T,[2,62]),e(T,[2,63]),e(T,[2,64]),e(T,[2,65]),e(T,[2,66]),e(T,[2,67]),e(T,[2,68]),e(T,[2,69]),e(T,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},e(vt,[2,28]),e(vt,[2,29]),e(vt,[2,30]),e(vt,[2,31]),e(vt,[2,32]),e(vt,[2,33]),e(vt,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},e(Wt,[2,18]),e(wt,[2,38]),e(ce,[2,72]),e(It,[2,74]),e(T,[2,24]),e(T,[2,35]),e(Qt,[2,25]),e(Qt,[2,26],{12:[1,138]}),e(Qt,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:b(function(x,m){if(m.recoverable)this.trace(x);else{var v=new Error(x);throw v.hash=m,v}},"parseError"),parse:b(function(x){var m=this,v=[0],g=[],R=[null],h=[],St=this.table,f="",kt=0,he=0,ue=0,Le=2,de=1,Ne=h.slice.call(arguments,1),D=Object.create(this.lexer),Et={yy:{}};for(var qt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,qt)&&(Et.yy[qt]=this.yy[qt]);D.setInput(x,Et.yy),Et.yy.lexer=D,Et.yy.parser=this,typeof D.yylloc>"u"&&(D.yylloc={});var Gt=D.yylloc;h.push(Gt);var Ye=D.options&&D.options.ranges;typeof Et.yy.parseError=="function"?this.parseError=Et.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function je(L){v.length=v.length-2*L,R.length=R.length-L,h.length=h.length-L}b(je,"popStack");function fe(){var L;return L=g.pop()||D.lex()||de,typeof L!="number"&&(L instanceof Array&&(g=L,L=g.pop()),L=m.symbols_[L]||L),L}b(fe,"lex");for(var B,Kt,At,N,M0,Jt,Tt={},Lt,W,pe,Nt;;){if(At=v[v.length-1],this.defaultActions[At]?N=this.defaultActions[At]:((B===null||typeof B>"u")&&(B=fe()),N=St[At]&&St[At][B]),typeof N>"u"||!N.length||!N[0]){var Zt="";Nt=[];for(Lt in St[At])this.terminals_[Lt]&&Lt>Le&&Nt.push("'"+this.terminals_[Lt]+"'");D.showPosition?Zt="Parse error on line "+(kt+1)+`: -`+D.showPosition()+` -Expecting `+Nt.join(", ")+", got '"+(this.terminals_[B]||B)+"'":Zt="Parse error on line "+(kt+1)+": Unexpected "+(B==de?"end of input":"'"+(this.terminals_[B]||B)+"'"),this.parseError(Zt,{text:D.match,token:this.terminals_[B]||B,line:D.yylineno,loc:Gt,expected:Nt})}if(N[0]instanceof Array&&N.length>1)throw new Error("Parse Error: multiple actions possible at state: "+At+", token: "+B);switch(N[0]){case 1:v.push(B),R.push(D.yytext),h.push(D.yylloc),v.push(N[1]),B=null,Kt?(B=Kt,Kt=null):(he=D.yyleng,f=D.yytext,kt=D.yylineno,Gt=D.yylloc,ue>0&&ue--);break;case 2:if(W=this.productions_[N[1]][1],Tt.$=R[R.length-W],Tt._$={first_line:h[h.length-(W||1)].first_line,last_line:h[h.length-1].last_line,first_column:h[h.length-(W||1)].first_column,last_column:h[h.length-1].last_column},Ye&&(Tt._$.range=[h[h.length-(W||1)].range[0],h[h.length-1].range[1]]),Jt=this.performAction.apply(Tt,[f,he,kt,Et.yy,N[1],R,h].concat(Ne)),typeof Jt<"u")return Jt;W&&(v=v.slice(0,-1*W*2),R=R.slice(0,-1*W),h=h.slice(0,-1*W)),v.push(this.productions_[N[1]][0]),R.push(Tt.$),h.push(Tt._$),pe=St[v[v.length-2]][v[v.length-1]],v.push(pe);break;case 3:return!0}}return!0},"parse")},Me=(function(){var _t={EOF:1,parseError:b(function(m,v){if(this.yy.parser)this.yy.parser.parseError(m,v);else throw new Error(m)},"parseError"),setInput:b(function(x,m){return this.yy=m||this.yy||{},this._input=x,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:b(function(){var x=this._input[0];this.yytext+=x,this.yyleng++,this.offset++,this.match+=x,this.matched+=x;var m=x.match(/(?:\r\n?|\n).*/g);return m?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),x},"input"),unput:b(function(x){var m=x.length,v=x.split(/(?:\r\n?|\n)/g);this._input=x+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-m),this.offset-=m;var g=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),v.length-1&&(this.yylineno-=v.length-1);var R=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:v?(v.length===g.length?this.yylloc.first_column:0)+g[g.length-v.length].length-v[0].length:this.yylloc.first_column-m},this.options.ranges&&(this.yylloc.range=[R[0],R[0]+this.yyleng-m]),this.yyleng=this.yytext.length,this},"unput"),more:b(function(){return this._more=!0,this},"more"),reject:b(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:b(function(x){this.unput(this.match.slice(x))},"less"),pastInput:b(function(){var x=this.matched.substr(0,this.matched.length-this.match.length);return(x.length>20?"...":"")+x.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:b(function(){var x=this.match;return x.length<20&&(x+=this._input.substr(0,20-x.length)),(x.substr(0,20)+(x.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:b(function(){var x=this.pastInput(),m=new Array(x.length+1).join("-");return x+this.upcomingInput()+` -`+m+"^"},"showPosition"),test_match:b(function(x,m){var v,g,R;if(this.options.backtrack_lexer&&(R={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(R.yylloc.range=this.yylloc.range.slice(0))),g=x[0].match(/(?:\r\n?|\n).*/g),g&&(this.yylineno+=g.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:g?g[g.length-1].length-g[g.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+x[0].length},this.yytext+=x[0],this.match+=x[0],this.matches=x,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(x[0].length),this.matched+=x[0],v=this.performAction.call(this,this.yy,this,m,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),v)return v;if(this._backtrack){for(var h in R)this[h]=R[h];return!1}return!1},"test_match"),next:b(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var x,m,v,g;this._more||(this.yytext="",this.match="");for(var R=this._currentRules(),h=0;hm[0].length)){if(m=v,g=h,this.options.backtrack_lexer){if(x=this.test_match(v,R[h]),x!==!1)return x;if(this._backtrack){m=!1;continue}else return!1}else if(!this.options.flex)break}return m?(x=this.test_match(m,R[g]),x!==!1?x:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:b(function(){var m=this.next();return m||this.lex()},"lex"),begin:b(function(m){this.conditionStack.push(m)},"begin"),popState:b(function(){var m=this.conditionStack.length-1;return m>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:b(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:b(function(m){return m=this.conditionStack.length-1-Math.abs(m||0),m>=0?this.conditionStack[m]:"INITIAL"},"topState"),pushState:b(function(m){this.begin(m)},"pushState"),stateStackSize:b(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:b(function(m,v,g,R){var h=R;switch(g){case 0:return 6;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 22;case 5:return 23;case 6:return this.begin("acc_title"),24;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),26;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:break;case 14:c;break;case 15:return 12;case 16:break;case 17:return 11;case 18:return 15;case 19:return 16;case 20:return 17;case 21:return 18;case 22:return this.begin("person_ext"),45;break;case 23:return this.begin("person"),44;break;case 24:return this.begin("system_ext_queue"),51;break;case 25:return this.begin("system_ext_db"),50;break;case 26:return this.begin("system_ext"),49;break;case 27:return this.begin("system_queue"),48;break;case 28:return this.begin("system_db"),47;break;case 29:return this.begin("system"),46;break;case 30:return this.begin("boundary"),37;break;case 31:return this.begin("enterprise_boundary"),34;break;case 32:return this.begin("system_boundary"),36;break;case 33:return this.begin("container_ext_queue"),57;break;case 34:return this.begin("container_ext_db"),56;break;case 35:return this.begin("container_ext"),55;break;case 36:return this.begin("container_queue"),54;break;case 37:return this.begin("container_db"),53;break;case 38:return this.begin("container"),52;break;case 39:return this.begin("container_boundary"),38;break;case 40:return this.begin("component_ext_queue"),63;break;case 41:return this.begin("component_ext_db"),62;break;case 42:return this.begin("component_ext"),61;break;case 43:return this.begin("component_queue"),60;break;case 44:return this.begin("component_db"),59;break;case 45:return this.begin("component"),58;break;case 46:return this.begin("node"),39;break;case 47:return this.begin("node"),39;break;case 48:return this.begin("node_l"),40;break;case 49:return this.begin("node_r"),41;break;case 50:return this.begin("rel"),64;break;case 51:return this.begin("birel"),65;break;case 52:return this.begin("rel_u"),66;break;case 53:return this.begin("rel_u"),66;break;case 54:return this.begin("rel_d"),67;break;case 55:return this.begin("rel_d"),67;break;case 56:return this.begin("rel_l"),68;break;case 57:return this.begin("rel_l"),68;break;case 58:return this.begin("rel_r"),69;break;case 59:return this.begin("rel_r"),69;break;case 60:return this.begin("rel_b"),70;break;case 61:return this.begin("rel_index"),71;break;case 62:return this.begin("update_el_style"),72;break;case 63:return this.begin("update_rel_style"),73;break;case 64:return this.begin("update_layout_config"),74;break;case 65:return"EOF_IN_STRUCT";case 66:return this.begin("attribute"),"ATTRIBUTE_EMPTY";break;case 67:this.begin("attribute");break;case 68:this.popState(),this.popState();break;case 69:return 80;case 70:break;case 71:return 80;case 72:this.begin("string");break;case 73:this.popState();break;case 74:return"STR";case 75:this.begin("string_kv");break;case 76:return this.begin("string_kv_key"),"STR_KEY";break;case 77:this.popState(),this.begin("string_kv_value");break;case 78:return"STR_VALUE";case 79:this.popState(),this.popState();break;case 80:return"STR";case 81:return"LBRACE";case 82:return"RBRACE";case 83:return"SPACE";case 84:return"EOL";case 85:return 14}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},string_kv_value:{rules:[78,79],inclusive:!1},string_kv_key:{rules:[77],inclusive:!1},string_kv:{rules:[76],inclusive:!1},string:{rules:[73,74],inclusive:!1},attribute:{rules:[68,69,70,71,72,75,80],inclusive:!1},update_layout_config:{rules:[65,66,67,68],inclusive:!1},update_rel_style:{rules:[65,66,67,68],inclusive:!1},update_el_style:{rules:[65,66,67,68],inclusive:!1},rel_b:{rules:[65,66,67,68],inclusive:!1},rel_r:{rules:[65,66,67,68],inclusive:!1},rel_l:{rules:[65,66,67,68],inclusive:!1},rel_d:{rules:[65,66,67,68],inclusive:!1},rel_u:{rules:[65,66,67,68],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[65,66,67,68],inclusive:!1},node_r:{rules:[65,66,67,68],inclusive:!1},node_l:{rules:[65,66,67,68],inclusive:!1},node:{rules:[65,66,67,68],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[65,66,67,68],inclusive:!1},component_ext_queue:{rules:[65,66,67,68],inclusive:!1},component_ext_db:{rules:[65,66,67,68],inclusive:!1},component_ext:{rules:[65,66,67,68],inclusive:!1},component_queue:{rules:[65,66,67,68],inclusive:!1},component_db:{rules:[65,66,67,68],inclusive:!1},component:{rules:[65,66,67,68],inclusive:!1},container_boundary:{rules:[65,66,67,68],inclusive:!1},container_ext_queue:{rules:[65,66,67,68],inclusive:!1},container_ext_db:{rules:[65,66,67,68],inclusive:!1},container_ext:{rules:[65,66,67,68],inclusive:!1},container_queue:{rules:[65,66,67,68],inclusive:!1},container_db:{rules:[65,66,67,68],inclusive:!1},container:{rules:[65,66,67,68],inclusive:!1},birel:{rules:[65,66,67,68],inclusive:!1},system_boundary:{rules:[65,66,67,68],inclusive:!1},enterprise_boundary:{rules:[65,66,67,68],inclusive:!1},boundary:{rules:[65,66,67,68],inclusive:!1},system_ext_queue:{rules:[65,66,67,68],inclusive:!1},system_ext_db:{rules:[65,66,67,68],inclusive:!1},system_ext:{rules:[65,66,67,68],inclusive:!1},system_queue:{rules:[65,66,67,68],inclusive:!1},system_db:{rules:[65,66,67,68],inclusive:!1},system:{rules:[65,66,67,68],inclusive:!1},person_ext:{rules:[65,66,67,68],inclusive:!1},person:{rules:[65,66,67,68],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],inclusive:!0}}};return _t})();Ht.lexer=Me;function Mt(){this.yy={}}return b(Mt,"Parser"),Mt.prototype=Ht,Ht.Parser=Mt,new Mt})();Ut.parser=Ut;var Ve=Ut,V=[],xt=[""],I="global",F="",X=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],Bt=[],ne="",se=!1,Ft=4,Vt=2,we,ze=b(function(){return we},"getC4Type"),Xe=b(function(e){we=te(e,Ot())},"setC4Type"),We=b(function(e,t,s,o,l,a,n,r,i){if(e==null||t===void 0||t===null||s===void 0||s===null||o===void 0||o===null)return;let u={},d=Bt.find(y=>y.from===t&&y.to===s);if(d?u=d:Bt.push(u),u.type=e,u.from=t,u.to=s,u.label={text:o},l==null)u.techn={text:""};else if(typeof l=="object"){let[y,p]=Object.entries(l)[0];u[y]={text:p}}else u.techn={text:l};if(a==null)u.descr={text:""};else if(typeof a=="object"){let[y,p]=Object.entries(a)[0];u[y]={text:p}}else u.descr={text:a};if(typeof n=="object"){let[y,p]=Object.entries(n)[0];u[y]=p}else u.sprite=n;if(typeof r=="object"){let[y,p]=Object.entries(r)[0];u[y]=p}else u.tags=r;if(typeof i=="object"){let[y,p]=Object.entries(i)[0];u[y]=p}else u.link=i;u.wrap=mt()},"addRel"),Qe=b(function(e,t,s,o,l,a,n){if(t===null||s===null)return;let r={},i=V.find(u=>u.alias===t);if(i&&t===i.alias?r=i:(r.alias=t,V.push(r)),s==null?r.label={text:""}:r.label={text:s},o==null)r.descr={text:""};else if(typeof o=="object"){let[u,d]=Object.entries(o)[0];r[u]={text:d}}else r.descr={text:o};if(typeof l=="object"){let[u,d]=Object.entries(l)[0];r[u]=d}else r.sprite=l;if(typeof a=="object"){let[u,d]=Object.entries(a)[0];r[u]=d}else r.tags=a;if(typeof n=="object"){let[u,d]=Object.entries(n)[0];r[u]=d}else r.link=n;r.typeC4Shape={text:e},r.parentBoundary=I,r.wrap=mt()},"addPersonOrSystem"),He=b(function(e,t,s,o,l,a,n,r){if(t===null||s===null)return;let i={},u=V.find(d=>d.alias===t);if(u&&t===u.alias?i=u:(i.alias=t,V.push(i)),s==null?i.label={text:""}:i.label={text:s},o==null)i.techn={text:""};else if(typeof o=="object"){let[d,y]=Object.entries(o)[0];i[d]={text:y}}else i.techn={text:o};if(l==null)i.descr={text:""};else if(typeof l=="object"){let[d,y]=Object.entries(l)[0];i[d]={text:y}}else i.descr={text:l};if(typeof a=="object"){let[d,y]=Object.entries(a)[0];i[d]=y}else i.sprite=a;if(typeof n=="object"){let[d,y]=Object.entries(n)[0];i[d]=y}else i.tags=n;if(typeof r=="object"){let[d,y]=Object.entries(r)[0];i[d]=y}else i.link=r;i.wrap=mt(),i.typeC4Shape={text:e},i.parentBoundary=I},"addContainer"),qe=b(function(e,t,s,o,l,a,n,r){if(t===null||s===null)return;let i={},u=V.find(d=>d.alias===t);if(u&&t===u.alias?i=u:(i.alias=t,V.push(i)),s==null?i.label={text:""}:i.label={text:s},o==null)i.techn={text:""};else if(typeof o=="object"){let[d,y]=Object.entries(o)[0];i[d]={text:y}}else i.techn={text:o};if(l==null)i.descr={text:""};else if(typeof l=="object"){let[d,y]=Object.entries(l)[0];i[d]={text:y}}else i.descr={text:l};if(typeof a=="object"){let[d,y]=Object.entries(a)[0];i[d]=y}else i.sprite=a;if(typeof n=="object"){let[d,y]=Object.entries(n)[0];i[d]=y}else i.tags=n;if(typeof r=="object"){let[d,y]=Object.entries(r)[0];i[d]=y}else i.link=r;i.wrap=mt(),i.typeC4Shape={text:e},i.parentBoundary=I},"addComponent"),Ge=b(function(e,t,s,o,l){if(e===null||t===null)return;let a={},n=X.find(r=>r.alias===e);if(n&&e===n.alias?a=n:(a.alias=e,X.push(a)),t==null?a.label={text:""}:a.label={text:t},s==null)a.type={text:"system"};else if(typeof s=="object"){let[r,i]=Object.entries(s)[0];a[r]={text:i}}else a.type={text:s};if(typeof o=="object"){let[r,i]=Object.entries(o)[0];a[r]=i}else a.tags=o;if(typeof l=="object"){let[r,i]=Object.entries(l)[0];a[r]=i}else a.link=l;a.parentBoundary=I,a.wrap=mt(),F=I,I=e,xt.push(F)},"addPersonOrSystemBoundary"),Ke=b(function(e,t,s,o,l){if(e===null||t===null)return;let a={},n=X.find(r=>r.alias===e);if(n&&e===n.alias?a=n:(a.alias=e,X.push(a)),t==null?a.label={text:""}:a.label={text:t},s==null)a.type={text:"container"};else if(typeof s=="object"){let[r,i]=Object.entries(s)[0];a[r]={text:i}}else a.type={text:s};if(typeof o=="object"){let[r,i]=Object.entries(o)[0];a[r]=i}else a.tags=o;if(typeof l=="object"){let[r,i]=Object.entries(l)[0];a[r]=i}else a.link=l;a.parentBoundary=I,a.wrap=mt(),F=I,I=e,xt.push(F)},"addContainerBoundary"),Je=b(function(e,t,s,o,l,a,n,r){if(t===null||s===null)return;let i={},u=X.find(d=>d.alias===t);if(u&&t===u.alias?i=u:(i.alias=t,X.push(i)),s==null?i.label={text:""}:i.label={text:s},o==null)i.type={text:"node"};else if(typeof o=="object"){let[d,y]=Object.entries(o)[0];i[d]={text:y}}else i.type={text:o};if(l==null)i.descr={text:""};else if(typeof l=="object"){let[d,y]=Object.entries(l)[0];i[d]={text:y}}else i.descr={text:l};if(typeof n=="object"){let[d,y]=Object.entries(n)[0];i[d]=y}else i.tags=n;if(typeof r=="object"){let[d,y]=Object.entries(r)[0];i[d]=y}else i.link=r;i.nodeType=e,i.parentBoundary=I,i.wrap=mt(),F=I,I=t,xt.push(F)},"addDeploymentNode"),Ze=b(function(){I=F,xt.pop(),F=xt.pop(),xt.push(F)},"popBoundaryParseStack"),$e=b(function(e,t,s,o,l,a,n,r,i,u,d){let y=V.find(p=>p.alias===t);if(!(y===void 0&&(y=X.find(p=>p.alias===t),y===void 0))){if(s!=null)if(typeof s=="object"){let[p,k]=Object.entries(s)[0];y[p]=k}else y.bgColor=s;if(o!=null)if(typeof o=="object"){let[p,k]=Object.entries(o)[0];y[p]=k}else y.fontColor=o;if(l!=null)if(typeof l=="object"){let[p,k]=Object.entries(l)[0];y[p]=k}else y.borderColor=l;if(a!=null)if(typeof a=="object"){let[p,k]=Object.entries(a)[0];y[p]=k}else y.shadowing=a;if(n!=null)if(typeof n=="object"){let[p,k]=Object.entries(n)[0];y[p]=k}else y.shape=n;if(r!=null)if(typeof r=="object"){let[p,k]=Object.entries(r)[0];y[p]=k}else y.sprite=r;if(i!=null)if(typeof i=="object"){let[p,k]=Object.entries(i)[0];y[p]=k}else y.techn=i;if(u!=null)if(typeof u=="object"){let[p,k]=Object.entries(u)[0];y[p]=k}else y.legendText=u;if(d!=null)if(typeof d=="object"){let[p,k]=Object.entries(d)[0];y[p]=k}else y.legendSprite=d}},"updateElStyle"),t0=b(function(e,t,s,o,l,a,n){let r=Bt.find(i=>i.from===t&&i.to===s);if(r!==void 0){if(o!=null)if(typeof o=="object"){let[i,u]=Object.entries(o)[0];r[i]=u}else r.textColor=o;if(l!=null)if(typeof l=="object"){let[i,u]=Object.entries(l)[0];r[i]=u}else r.lineColor=l;if(a!=null)if(typeof a=="object"){let[i,u]=Object.entries(a)[0];r[i]=parseInt(u)}else r.offsetX=parseInt(a);if(n!=null)if(typeof n=="object"){let[i,u]=Object.entries(n)[0];r[i]=parseInt(u)}else r.offsetY=parseInt(n)}},"updateRelStyle"),e0=b(function(e,t,s){let o=Ft,l=Vt;if(typeof t=="object"){let a=Object.values(t)[0];o=parseInt(a)}else o=parseInt(t);if(typeof s=="object"){let a=Object.values(s)[0];l=parseInt(a)}else l=parseInt(s);o>=1&&(Ft=o),l>=1&&(Vt=l)},"updateLayoutConfig"),a0=b(function(){return Ft},"getC4ShapeInRow"),i0=b(function(){return Vt},"getC4BoundaryInRow"),r0=b(function(){return I},"getCurrentBoundaryParse"),n0=b(function(){return F},"getParentBoundaryParse"),Te=b(function(e){return e==null?V:V.filter(t=>t.parentBoundary===e)},"getC4ShapeArray"),s0=b(function(e){return V.find(t=>t.alias===e)},"getC4Shape"),l0=b(function(e){return Object.keys(Te(e))},"getC4ShapeKeys"),Oe=b(function(e){return e==null?X:X.filter(t=>t.parentBoundary===e)},"getBoundaries"),o0=Oe,c0=b(function(){return Bt},"getRels"),h0=b(function(){return ne},"getTitle"),u0=b(function(e){se=e},"setWrap"),mt=b(function(){return se},"autoWrap"),d0=b(function(){V=[],X=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],F="",I="global",xt=[""],Bt=[],xt=[""],ne="",se=!1,Ft=4,Vt=2},"clear"),f0={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},p0={FILLED:0,OPEN:1},y0={LEFTOF:0,RIGHTOF:1,OVER:2},b0=b(function(e){ne=te(e,Ot())},"setTitle"),ae={addPersonOrSystem:Qe,addPersonOrSystemBoundary:Ge,addContainer:He,addContainerBoundary:Ke,addComponent:qe,addDeploymentNode:Je,popBoundaryParseStack:Ze,addRel:We,updateElStyle:$e,updateRelStyle:t0,updateLayoutConfig:e0,autoWrap:mt,setWrap:u0,getC4ShapeArray:Te,getC4Shape:s0,getC4ShapeKeys:l0,getBoundaries:Oe,getBoundarys:o0,getCurrentBoundaryParse:r0,getParentBoundaryParse:n0,getRels:c0,getTitle:h0,getC4Type:ze,getC4ShapeInRow:a0,getC4BoundaryInRow:i0,setAccTitle:ge,getAccTitle:_e,getAccDescription:me,setAccDescription:xe,getConfig:b(()=>Ot().c4,"getConfig"),clear:d0,LINETYPE:f0,ARROWTYPE:p0,PLACEMENT:y0,setTitle:b0,setC4Type:Xe},le=b(function(e,t){return ke(e,t)},"drawRect"),Se=b(function(e,t,s,o,l,a){let n=e.append("image");n.attr("width",t),n.attr("height",s),n.attr("x",o),n.attr("y",l);let r=a.startsWith("data:image/png;base64")?a:(0,Re.sanitizeUrl)(a);n.attr("xlink:href",r)},"drawImage"),g0=b((e,t,s)=>{let o=e.append("g"),l=0;for(let a of t){let n=a.textColor?a.textColor:"#444444",r=a.lineColor?a.lineColor:"#444444",i=a.offsetX?parseInt(a.offsetX):0,u=a.offsetY?parseInt(a.offsetY):0,d="";if(l===0){let p=o.append("line");p.attr("x1",a.startPoint.x),p.attr("y1",a.startPoint.y),p.attr("x2",a.endPoint.x),p.attr("y2",a.endPoint.y),p.attr("stroke-width","1"),p.attr("stroke",r),p.style("fill","none"),a.type!=="rel_b"&&p.attr("marker-end","url("+d+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+d+"#arrowend)"),l=-1}else{let p=o.append("path");p.attr("fill","none").attr("stroke-width","1").attr("stroke",r).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),a.type!=="rel_b"&&p.attr("marker-end","url("+d+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+d+"#arrowend)")}let y=s.messageFont();Q(s)(a.label.text,o,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+i,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+u,a.label.width,a.label.height,{fill:n},y),a.techn&&a.techn.text!==""&&(y=s.messageFont(),Q(s)("["+a.techn.text+"]",o,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+i,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+s.messageFontSize+5+u,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:n,"font-style":"italic"},y))}},"drawRels"),_0=b(function(e,t,s){let o=e.append("g"),l=t.bgColor?t.bgColor:"none",a=t.borderColor?t.borderColor:"#444444",n=t.fontColor?t.fontColor:"black",r={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};t.nodeType&&(r={"stroke-width":1});let i={x:t.x,y:t.y,fill:l,stroke:a,width:t.width,height:t.height,rx:2.5,ry:2.5,attrs:r};le(o,i);let u=s.boundaryFont();u.fontWeight="bold",u.fontSize=u.fontSize+2,u.fontColor=n,Q(s)(t.label.text,o,t.x,t.y+t.label.Y,t.width,t.height,{fill:"#444444"},u),t.type&&t.type.text!==""&&(u=s.boundaryFont(),u.fontColor=n,Q(s)(t.type.text,o,t.x,t.y+t.type.Y,t.width,t.height,{fill:"#444444"},u)),t.descr&&t.descr.text!==""&&(u=s.boundaryFont(),u.fontSize=u.fontSize-2,u.fontColor=n,Q(s)(t.descr.text,o,t.x,t.y+t.descr.Y,t.width,t.height,{fill:"#444444"},u))},"drawBoundary"),x0=b(function(e,t,s){let o=t.bgColor?t.bgColor:s[t.typeC4Shape.text+"_bg_color"],l=t.borderColor?t.borderColor:s[t.typeC4Shape.text+"_border_color"],a=t.fontColor?t.fontColor:"#FFFFFF",n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(t.typeC4Shape.text){case"person":n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=";break}let r=e.append("g");r.attr("class","person-man");let i=Ee();switch(t.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":i.x=t.x,i.y=t.y,i.fill=o,i.width=t.width,i.height=t.height,i.stroke=l,i.rx=2.5,i.ry=2.5,i.attrs={"stroke-width":.5},le(r,i);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":r.append("path").attr("fill",o).attr("stroke-width","0.5").attr("stroke",l).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",t.x).replaceAll("starty",t.y).replaceAll("half",t.width/2).replaceAll("height",t.height)),r.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",l).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",t.x).replaceAll("starty",t.y).replaceAll("half",t.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":r.append("path").attr("fill",o).attr("stroke-width","0.5").attr("stroke",l).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",t.x).replaceAll("starty",t.y).replaceAll("width",t.width).replaceAll("half",t.height/2)),r.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",l).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",t.x+t.width).replaceAll("starty",t.y).replaceAll("half",t.height/2));break}let u=O0(s,t.typeC4Shape.text);switch(r.append("text").attr("fill",a).attr("font-family",u.fontFamily).attr("font-size",u.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",t.typeC4Shape.width).attr("x",t.x+t.width/2-t.typeC4Shape.width/2).attr("y",t.y+t.typeC4Shape.Y).text("<<"+t.typeC4Shape.text+">>"),t.typeC4Shape.text){case"person":case"external_person":Se(r,48,48,t.x+t.width/2-24,t.y+t.image.Y,n);break}let d=s[t.typeC4Shape.text+"Font"]();return d.fontWeight="bold",d.fontSize=d.fontSize+2,d.fontColor=a,Q(s)(t.label.text,r,t.x,t.y+t.label.Y,t.width,t.height,{fill:a},d),d=s[t.typeC4Shape.text+"Font"](),d.fontColor=a,t.techn&&t.techn?.text!==""?Q(s)(t.techn.text,r,t.x,t.y+t.techn.Y,t.width,t.height,{fill:a,"font-style":"italic"},d):t.type&&t.type.text!==""&&Q(s)(t.type.text,r,t.x,t.y+t.type.Y,t.width,t.height,{fill:a,"font-style":"italic"},d),t.descr&&t.descr.text!==""&&(d=s.personFont(),d.fontColor=a,Q(s)(t.descr.text,r,t.x,t.y+t.descr.Y,t.width,t.height,{fill:a},d)),t.height},"drawC4Shape"),m0=b(function(e){e.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),v0=b(function(e){e.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),k0=b(function(e){e.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),E0=b(function(e){e.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},"insertArrowHead"),A0=b(function(e){e.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},"insertArrowEnd"),C0=b(function(e){e.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),w0=b(function(e){e.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertDynamicNumber"),T0=b(function(e){let s=e.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);s.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),s.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},"insertArrowCrossHead"),O0=b((e,t)=>({fontFamily:e[t+"FontFamily"],fontSize:e[t+"FontSize"],fontWeight:e[t+"FontWeight"]}),"getC4ShapeFont"),Q=(function(){function e(l,a,n,r,i,u,d){let y=a.append("text").attr("x",n+i/2).attr("y",r+u/2+5).style("text-anchor","middle").text(l);o(y,d)}b(e,"byText");function t(l,a,n,r,i,u,d,y){let{fontSize:p,fontFamily:k,fontWeight:O}=y,S=l.split(Yt.lineBreakRegex);for(let P=0;P=this.data.widthLimit||s>=this.data.widthLimit||this.nextData.cnt>De)&&(t=this.nextData.startx+e.margin+_.nextLinePaddingX,o=this.nextData.stopy+e.margin*2,this.nextData.stopx=s=t+e.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=l=o+e.height,this.nextData.cnt=1),e.x=t,e.y=o,this.updateVal(this.data,"startx",t,Math.min),this.updateVal(this.data,"starty",o,Math.min),this.updateVal(this.data,"stopx",s,Math.max),this.updateVal(this.data,"stopy",l,Math.max),this.updateVal(this.nextData,"startx",t,Math.min),this.updateVal(this.nextData,"starty",o,Math.min),this.updateVal(this.nextData,"stopx",s,Math.max),this.updateVal(this.nextData,"stopy",l,Math.max)}init(e){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},re(e.db.getConfig())}bumpLastMargin(e){this.data.stopx+=e,this.data.stopy+=e}},re=b(function(e){ye(_,e),e.fontFamily&&(_.personFontFamily=_.systemFontFamily=_.messageFontFamily=e.fontFamily),e.fontSize&&(_.personFontSize=_.systemFontSize=_.messageFontSize=e.fontSize),e.fontWeight&&(_.personFontWeight=_.systemFontWeight=_.messageFontWeight=e.fontWeight)},"setConf"),Pt=b((e,t)=>({fontFamily:e[t+"FontFamily"],fontSize:e[t+"FontSize"],fontWeight:e[t+"FontWeight"]}),"c4ShapeFont"),jt=b(e=>({fontFamily:e.boundaryFontFamily,fontSize:e.boundaryFontSize,fontWeight:e.boundaryFontWeight}),"boundaryFont"),R0=b(e=>({fontFamily:e.messageFontFamily,fontSize:e.messageFontSize,fontWeight:e.messageFontWeight}),"messageFont");function j(e,t,s,o,l){if(!t[e].width)if(s)t[e].text=ve(t[e].text,l,o),t[e].textLines=t[e].text.split(Yt.lineBreakRegex).length,t[e].width=l,t[e].height=ee(t[e].text,o);else{let a=t[e].text.split(Yt.lineBreakRegex);t[e].textLines=a.length;let n=0;t[e].height=0,t[e].width=0;for(let r of a)t[e].width=Math.max(Ct(r,o),t[e].width),n=ee(r,o),t[e].height=t[e].height+n}}b(j,"calcC4ShapeTextWH");var Be=b(function(e,t,s){t.x=s.data.startx,t.y=s.data.starty,t.width=s.data.stopx-s.data.startx,t.height=s.data.stopy-s.data.starty,t.label.y=_.c4ShapeMargin-35;let o=t.wrap&&_.wrap,l=jt(_);l.fontSize=l.fontSize+2,l.fontWeight="bold";let a=Ct(t.label.text,l);j("label",t,o,l,a),z.drawBoundary(e,t,_)},"drawBoundary"),Ie=b(function(e,t,s,o){let l=0;for(let a of o){l=0;let n=s[a],r=Pt(_,n.typeC4Shape.text);switch(r.fontSize=r.fontSize-2,n.typeC4Shape.width=Ct("\xAB"+n.typeC4Shape.text+"\xBB",r),n.typeC4Shape.height=r.fontSize+2,n.typeC4Shape.Y=_.c4ShapePadding,l=n.typeC4Shape.Y+n.typeC4Shape.height-4,n.image={width:0,height:0,Y:0},n.typeC4Shape.text){case"person":case"external_person":n.image.width=48,n.image.height=48,n.image.Y=l,l=n.image.Y+n.image.height;break}n.sprite&&(n.image.width=48,n.image.height=48,n.image.Y=l,l=n.image.Y+n.image.height);let i=n.wrap&&_.wrap,u=_.width-_.c4ShapePadding*2,d=Pt(_,n.typeC4Shape.text);if(d.fontSize=d.fontSize+2,d.fontWeight="bold",j("label",n,i,d,u),n.label.Y=l+8,l=n.label.Y+n.label.height,n.type&&n.type.text!==""){n.type.text="["+n.type.text+"]";let k=Pt(_,n.typeC4Shape.text);j("type",n,i,k,u),n.type.Y=l+5,l=n.type.Y+n.type.height}else if(n.techn&&n.techn.text!==""){n.techn.text="["+n.techn.text+"]";let k=Pt(_,n.techn.text);j("techn",n,i,k,u),n.techn.Y=l+5,l=n.techn.Y+n.techn.height}let y=l,p=n.label.width;if(n.descr&&n.descr.text!==""){let k=Pt(_,n.typeC4Shape.text);j("descr",n,i,k,u),n.descr.Y=l+20,l=n.descr.Y+n.descr.height,p=Math.max(n.label.width,n.descr.width),y=l-n.descr.textLines*5}p=p+_.c4ShapePadding,n.width=Math.max(n.width||_.width,p,_.width),n.height=Math.max(n.height||_.height,y,_.height),n.margin=n.margin||_.c4ShapeMargin,e.insert(n),z.drawC4Shape(t,n,_)}e.bumpLastMargin(_.c4ShapeMargin)},"drawC4ShapeArray"),Y=class{static{b(this,"Point")}constructor(e,t){this.x=e,this.y=t}},Ae=b(function(e,t){let s=e.x,o=e.y,l=t.x,a=t.y,n=s+e.width/2,r=o+e.height/2,i=Math.abs(s-l),u=Math.abs(o-a),d=u/i,y=e.height/e.width,p=null;return o==a&&sl?p=new Y(s,r):s==l&&oa&&(p=new Y(n,o)),s>l&&o=d?p=new Y(s,r+d*e.width/2):p=new Y(n-i/u*e.height/2,o+e.height):s=d?p=new Y(s+e.width,r+d*e.width/2):p=new Y(n+i/u*e.height/2,o+e.height):sa?y>=d?p=new Y(s+e.width,r-d*e.width/2):p=new Y(n+e.height/2*i/u,o):s>l&&o>a&&(y>=d?p=new Y(s,r-e.width/2*d):p=new Y(n-e.height/2*i/u,o)),p},"getIntersectPoint"),S0=b(function(e,t){let s={x:0,y:0};s.x=t.x+t.width/2,s.y=t.y+t.height/2;let o=Ae(e,s);s.x=e.x+e.width/2,s.y=e.y+e.height/2;let l=Ae(t,s);return{startPoint:o,endPoint:l}},"getIntersectPoints"),D0=b(function(e,t,s,o){let l=0;for(let a of t){l=l+1;let n=a.wrap&&_.wrap,r=R0(_);o.db.getC4Type()==="C4Dynamic"&&(a.label.text=l+": "+a.label.text);let u=Ct(a.label.text,r);j("label",a,n,r,u),a.techn&&a.techn.text!==""&&(u=Ct(a.techn.text,r),j("techn",a,n,r,u)),a.descr&&a.descr.text!==""&&(u=Ct(a.descr.text,r),j("descr",a,n,r,u));let d=s(a.from),y=s(a.to),p=S0(d,y);a.startPoint=p.startPoint,a.endPoint=p.endPoint}z.drawRels(e,t,_)},"drawRels");function oe(e,t,s,o,l){let a=new Pe(l);a.data.widthLimit=s.data.widthLimit/Math.min(ie,o.length);for(let[n,r]of o.entries()){let i=0;r.image={width:0,height:0,Y:0},r.sprite&&(r.image.width=48,r.image.height=48,r.image.Y=i,i=r.image.Y+r.image.height);let u=r.wrap&&_.wrap,d=jt(_);if(d.fontSize=d.fontSize+2,d.fontWeight="bold",j("label",r,u,d,a.data.widthLimit),r.label.Y=i+8,i=r.label.Y+r.label.height,r.type&&r.type.text!==""){r.type.text="["+r.type.text+"]";let O=jt(_);j("type",r,u,O,a.data.widthLimit),r.type.Y=i+5,i=r.type.Y+r.type.height}if(r.descr&&r.descr.text!==""){let O=jt(_);O.fontSize=O.fontSize-2,j("descr",r,u,O,a.data.widthLimit),r.descr.Y=i+20,i=r.descr.Y+r.descr.height}if(n==0||n%ie===0){let O=s.data.startx+_.diagramMarginX,S=s.data.stopy+_.diagramMarginY+i;a.setData(O,O,S,S)}else{let O=a.data.stopx!==a.data.startx?a.data.stopx+_.diagramMarginX:a.data.startx,S=a.data.starty;a.setData(O,O,S,S)}a.name=r.alias;let y=l.db.getC4ShapeArray(r.alias),p=l.db.getC4ShapeKeys(r.alias);p.length>0&&Ie(a,e,y,p),t=r.alias;let k=l.db.getBoundaries(t);k.length>0&&oe(e,t,a,k,l),r.alias!=="global"&&Be(e,r,a),s.data.stopy=Math.max(a.data.stopy+_.c4ShapeMargin,s.data.stopy),s.data.stopx=Math.max(a.data.stopx+_.c4ShapeMargin,s.data.stopx),zt=Math.max(zt,s.data.stopx),Xt=Math.max(Xt,s.data.stopy)}}b(oe,"drawInsideBoundary");var P0=b(function(e,t,s,o){_=Ot().c4;let l=Ot().securityLevel,a;l==="sandbox"&&(a=Dt("#i"+t));let n=l==="sandbox"?Dt(a.nodes()[0].contentDocument.body):Dt("body"),r=o.db;o.db.setWrap(_.wrap),De=r.getC4ShapeInRow(),ie=r.getC4BoundaryInRow(),$t.debug(`C:${JSON.stringify(_,null,2)}`);let i=l==="sandbox"?n.select(`[id="${t}"]`):Dt(`[id="${t}"]`);z.insertComputerIcon(i),z.insertDatabaseIcon(i),z.insertClockIcon(i);let u=new Pe(o);u.setData(_.diagramMarginX,_.diagramMarginX,_.diagramMarginY,_.diagramMarginY),u.data.widthLimit=screen.availWidth,zt=_.diagramMarginX,Xt=_.diagramMarginY;let d=o.db.getTitle(),y=o.db.getBoundaries("");oe(i,"",u,y,o),z.insertArrowHead(i),z.insertArrowEnd(i),z.insertArrowCrossHead(i),z.insertArrowFilledHead(i),D0(i,o.db.getRels(),o.db.getC4Shape,o),u.data.stopx=zt,u.data.stopy=Xt;let p=u.data,O=p.stopy-p.starty+2*_.diagramMarginY,P=p.stopx-p.startx+2*_.diagramMarginX;d&&i.append("text").text(d).attr("x",(p.stopx-p.startx)/2-4*_.diagramMarginX).attr("y",p.starty+_.diagramMarginY),be(i,O,P,_.useMaxWidth);let M=d?60:0;i.attr("viewBox",p.startx-_.diagramMarginX+" -"+(_.diagramMarginY+M)+" "+P+" "+(O+M)),$t.debug("models:",p)},"draw"),Ce={drawPersonOrSystemArray:Ie,drawBoundary:Be,setConf:re,draw:P0},B0=b(e=>`.person { - stroke: ${e.personBorder}; - fill: ${e.personBkg}; - } -`,"getStyles"),I0=B0,F0={parser:Ve,db:ae,renderer:Ce,styles:I0,init:b(({c4:e,wrap:t})=>{Ce.setConf(e),ae.setWrap(t)},"init")};export{F0 as diagram}; diff --git a/src/google/adk/cli/browser/chunk-WR6HISGZ.js b/src/google/adk/cli/browser/chunk-WR6HISGZ.js deleted file mode 100644 index 7aae439561..0000000000 --- a/src/google/adk/cli/browser/chunk-WR6HISGZ.js +++ /dev/null @@ -1 +0,0 @@ -import{a as o,b as n,c as i,d as s,e as m,f as e,g as u,l as d,o as c,q as l}from"./chunk-NALL4A3P.js";var v=class extends l{static{e(this,"PieTokenBuilder")}constructor(){super(["pie","showData"])}},C=class extends c{static{e(this,"PieValueConverter")}runCustomConverter(t,r,a){if(t.name==="PIE_SECTION_LABEL")return r.replace(/"/g,"").trim()}},P={parser:{TokenBuilder:e(()=>new v,"TokenBuilder"),ValueConverter:e(()=>new C,"ValueConverter")}};function p(t=s){let r=i(n(t),u),a=i(o({shared:r}),d,P);return r.ServiceRegistry.register(a),{shared:r,Pie:a}}e(p,"createPieServices");export{P as a,p as b}; diff --git a/src/google/adk/cli/browser/chunk-WXI2IBAH.js b/src/google/adk/cli/browser/chunk-WXI2IBAH.js deleted file mode 100644 index 5a61e20bc3..0000000000 --- a/src/google/adk/cli/browser/chunk-WXI2IBAH.js +++ /dev/null @@ -1,70 +0,0 @@ -import{o as ze}from"./chunk-WBLSVR3V.js";import{A as ee,G as W,J as te,L as Ie,M as Re}from"./chunk-QFMJV7VH.js";import{a as P,g as b,i as E}from"./chunk-JRNAXTJ7.js";import{a as x,b as z,j as T}from"./chunk-RMXJBC7V.js";var dt=Object.freeze({left:0,top:0,width:16,height:16}),_=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),ne=Object.freeze(x(x({},dt),_)),ve=Object.freeze(z(x({},ne),{body:"",hidden:!1}));var mt=Object.freeze({width:null,height:null}),Ae=Object.freeze(x(x({},mt),_));var re=(n,e,r,s="")=>{let t=n.split(":");if(n.slice(0,1)==="@"){if(t.length<2||t.length>3)return null;s=t.shift().slice(1)}if(t.length>3||!t.length)return null;if(t.length>1){let l=t.pop(),a=t.pop(),p={provider:t.length>0?t[0]:s,prefix:a,name:l};return e&&!G(p)?null:p}let o=t[0],i=o.split("-");if(i.length>1){let l={provider:s,prefix:i.shift(),name:i.join("-")};return e&&!G(l)?null:l}if(r&&s===""){let l={provider:s,prefix:"",name:o};return e&&!G(l,r)?null:l}return null},G=(n,e)=>n?!!((e&&n.prefix===""||n.prefix)&&n.name):!1;function Ee(n,e){let r={};!n.hFlip!=!e.hFlip&&(r.hFlip=!0),!n.vFlip!=!e.vFlip&&(r.vFlip=!0);let s=((n.rotate||0)+(e.rotate||0))%4;return s&&(r.rotate=s),r}function se(n,e){let r=Ee(n,e);for(let s in ve)s in _?s in n&&!(s in r)&&(r[s]=_[s]):s in e?r[s]=e[s]:s in n&&(r[s]=n[s]);return r}function Le(n,e){let r=n.icons,s=n.aliases||Object.create(null),t=Object.create(null);function o(i){if(r[i])return t[i]=[];if(!(i in t)){t[i]=null;let l=s[i]&&s[i].parent,a=l&&o(l);a&&(t[i]=[l].concat(a))}return t[i]}return(e||Object.keys(r).concat(Object.keys(s))).forEach(o),t}function Ce(n,e,r){let s=n.icons,t=n.aliases||Object.create(null),o={};function i(l){o=se(s[l]||t[l],o)}return i(e),r.forEach(i),se(n,o)}function ie(n,e){if(n.icons[e])return Ce(n,e,[]);let r=Le(n,[e])[e];return r?Ce(n,e,r):null}var kt=/(-?[0-9.]*[0-9]+[0-9.]*)/g,xt=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function oe(n,e,r){if(e===1)return n;if(r=r||100,typeof n=="number")return Math.ceil(n*e*r)/r;if(typeof n!="string")return n;let s=n.split(kt);if(s===null||!s.length)return n;let t=[],o=s.shift(),i=xt.test(o);for(;;){if(i){let l=parseFloat(o);isNaN(l)?t.push(o):t.push(Math.ceil(l*e*r)/r)}else t.push(o);if(o=s.shift(),o===void 0)return t.join("");i=!i}}function bt(n,e="defs"){let r="",s=n.indexOf("<"+e);for(;s>=0;){let t=n.indexOf(">",s),o=n.indexOf("",o);if(i===-1)break;r+=n.slice(t+1,o).trim(),n=n.slice(0,s).trim()+n.slice(i+1)}return{defs:r,content:n}}function wt(n,e){return n?""+n+""+e:e}function Pe(n,e,r){let s=bt(n);return wt(s.defs,e+s.content+r)}var yt=n=>n==="unset"||n==="undefined"||n==="none";function le(n,e){let r=x(x({},ne),n),s=x(x({},Ae),e),t={left:r.left,top:r.top,width:r.width,height:r.height},o=r.body;[r,s].forEach(k=>{let w=[],A=k.hFlip,j=k.vFlip,$=k.rotate;A?j?$+=2:(w.push("translate("+(t.width+t.left).toString()+" "+(0-t.top).toString()+")"),w.push("scale(-1 1)"),t.top=t.left=0):j&&(w.push("translate("+(0-t.left).toString()+" "+(t.height+t.top).toString()+")"),w.push("scale(1 -1)"),t.top=t.left=0);let S;switch($<0&&($-=Math.floor($/4)*4),$=$%4,$){case 1:S=t.height/2+t.top,w.unshift("rotate(90 "+S.toString()+" "+S.toString()+")");break;case 2:w.unshift("rotate(180 "+(t.width/2+t.left).toString()+" "+(t.height/2+t.top).toString()+")");break;case 3:S=t.width/2+t.left,w.unshift("rotate(-90 "+S.toString()+" "+S.toString()+")");break}$%2===1&&(t.left!==t.top&&(S=t.left,t.left=t.top,t.top=S),t.width!==t.height&&(S=t.width,t.width=t.height,t.height=S)),w.length&&(o=Pe(o,'',""))});let i=s.width,l=s.height,a=t.width,p=t.height,c,h;i===null?(h=l===null?"1em":l==="auto"?p:l,c=oe(h,a/p)):(c=i==="auto"?a:i,h=l===null?oe(c,p/a):l==="auto"?p:l);let u={},g=(k,w)=>{yt(w)||(u[k]=w.toString())};g("width",c),g("height",h);let f=[t.left,t.top,a,p];return u.viewBox=f.join(" "),{attributes:u,viewBox:f,body:o}}var St=/\sid="(\S+)"/g,_e=new Map;function Tt(n){n=n.replace(/[0-9]+$/,"")||"a";let e=_e.get(n)||0;return _e.set(n,e+1),e?`${n}${e}`:n}function ae(n){let e=[],r;for(;r=St.exec(n);)e.push(r[1]);if(!e.length)return n;let s="suffix"+(Math.random()*16777216|Date.now()).toString(16);return e.forEach(t=>{let o=Tt(t),i=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");n=n.replace(new RegExp('([#;"])('+i+')([")]|\\.[a-z])',"g"),"$1"+o+s+"$3")}),n=n.replace(new RegExp(s,"g"),""),n}function ce(n,e){let r=n.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(let s in e)r+=" "+s+'="'+e[s]+'"';return'"+n+""}function fe(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var C=fe();function Oe(n){C=n}var F={exec:()=>null};function d(n,e=""){let r=typeof n=="string"?n:n.source,s={replace:(t,o)=>{let i=typeof o=="string"?o:o.source;return i=i.replace(y.caret,"$1"),r=r.replace(t,i),s},getRegex:()=>new RegExp(r,e)};return s}var $t=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^
/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:n=>new RegExp(`^( {0,3}${n})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}#`),htmlBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}<(?:[a-z].*>|!--)`,"i")},It=/^(?:[ \t]*(?:\n|$))+/,Rt=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,zt=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,O=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,vt=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,ge=/(?:[*+-]|\d{1,9}[.)])/,We=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Ge=d(We).replace(/bull/g,ge).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),At=d(We).replace(/bull/g,ge).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),de=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Et=/^[^\n]+/,me=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,Lt=d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",me).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Ct=d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,ge).getRegex(),U="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",ke=/|$))/,Pt=d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",ke).replace("tag",U).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),He=d(de).replace("hr",O).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",U).getRegex(),_t=d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",He).getRegex(),xe={blockquote:_t,code:Rt,def:Lt,fences:zt,heading:vt,hr:O,html:Pt,lheading:Ge,list:Ct,newline:It,paragraph:He,table:F,text:Et},je=d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",O).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",U).getRegex(),jt=z(x({},xe),{lheading:At,table:je,paragraph:d(de).replace("hr",O).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",je).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",U).getRegex()}),Bt=z(x({},xe),{html:d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",ke).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:F,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:d(de).replace("hr",O).replace("heading",` *#{1,6} *[^ -]`).replace("lheading",Ge).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()}),Dt=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Mt=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Ze=/^( {2,}|\\)\n(?!\s*$)/,qt=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",$t?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),Ue=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,Ht=d(Ue,"u").replace(/punct/g,Q).getRegex(),Zt=d(Ue,"u").replace(/punct/g,Ve).getRegex(),Qe="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Nt=d(Qe,"gu").replace(/notPunctSpace/g,Ne).replace(/punctSpace/g,be).replace(/punct/g,Q).getRegex(),Vt=d(Qe,"gu").replace(/notPunctSpace/g,Wt).replace(/punctSpace/g,Ot).replace(/punct/g,Ve).getRegex(),Ut=d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Ne).replace(/punctSpace/g,be).replace(/punct/g,Q).getRegex(),Qt=d(/\\(punct)/,"gu").replace(/punct/g,Q).getRegex(),Kt=d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Xt=d(ke).replace("(?:-->|$)","-->").getRegex(),Yt=d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",Xt).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Z=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,Jt=d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",Z).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Ke=d(/^!?\[(label)\]\[(ref)\]/).replace("label",Z).replace("ref",me).getRegex(),Xe=d(/^!?\[(ref)\](?:\[\])?/).replace("ref",me).getRegex(),en=d("reflink|nolink(?!\\()","g").replace("reflink",Ke).replace("nolink",Xe).getRegex(),Be=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,we={_backpedal:F,anyPunctuation:Qt,autolink:Kt,blockSkip:Gt,br:Ze,code:Mt,del:F,emStrongLDelim:Ht,emStrongRDelimAst:Nt,emStrongRDelimUnd:Ut,escape:Dt,link:Jt,nolink:Xe,punctuation:Ft,reflink:Ke,reflinkSearch:en,tag:Yt,text:qt,url:F},tn=z(x({},we),{link:d(/^!?\[(label)\]\((.*?)\)/).replace("label",Z).getRegex(),reflink:d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Z).getRegex()}),pe=z(x({},we),{emStrongRDelimAst:Vt,emStrongLDelim:Zt,url:d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",Be).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},De=n=>rn[n];function v(n,e){if(e){if(y.escapeTest.test(n))return n.replace(y.escapeReplace,De)}else if(y.escapeTestNoEncode.test(n))return n.replace(y.escapeReplaceNoEncode,De);return n}function Me(n){try{n=encodeURI(n).replace(y.percentDecode,"%")}catch(e){return null}return n}function qe(n,e){let r=n.replace(y.findPipe,(o,i,l)=>{let a=!1,p=i;for(;--p>=0&&l[p]==="\\";)a=!a;return a?"|":" |"}),s=r.split(y.splitPipe),t=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),e)if(s.length>e)s.splice(e);else for(;s.length0?-2:-1}function Fe(n,e,r,s,t){let o=e.href,i=e.title||null,l=n[1].replace(t.other.outputLinkReplace,"$1");s.state.inLink=!0;let a={type:n[0].charAt(0)==="!"?"image":"link",raw:r,href:o,title:i,text:l,tokens:s.inlineTokens(l)};return s.state.inLink=!1,a}function on(n,e,r){let s=n.match(r.other.indentCodeCompensation);if(s===null)return e;let t=s[1];return e.split(` -`).map(o=>{let i=o.match(r.other.beginningSpace);if(i===null)return o;let[l]=i;return l.length>=t.length?o.slice(t.length):o}).join(` -`)}var N=class{options;rules;lexer;constructor(n){this.options=n||C}space(n){let e=this.rules.block.newline.exec(n);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(n){let e=this.rules.block.code.exec(n);if(e){let r=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?r:M(r,` -`)}}}fences(n){let e=this.rules.block.fences.exec(n);if(e){let r=e[0],s=on(r,e[3]||"",this.rules);return{type:"code",raw:r,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:s}}}heading(n){let e=this.rules.block.heading.exec(n);if(e){let r=e[2].trim();if(this.rules.other.endingHash.test(r)){let s=M(r,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(r=s.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:r,tokens:this.lexer.inline(r)}}}hr(n){let e=this.rules.block.hr.exec(n);if(e)return{type:"hr",raw:M(e[0],` -`)}}blockquote(n){let e=this.rules.block.blockquote.exec(n);if(e){let r=M(e[0],` -`).split(` -`),s="",t="",o=[];for(;r.length>0;){let i=!1,l=[],a;for(a=0;a1,t={type:"list",raw:"",ordered:s,start:s?+r.slice(0,-1):"",loose:!1,items:[]};r=s?`\\d{1,9}\\${r.slice(-1)}`:`\\${r}`,this.options.pedantic&&(r=s?r:"[*+-]");let o=this.rules.other.listItemRegex(r),i=!1;for(;n;){let a=!1,p="",c="";if(!(e=o.exec(n))||this.rules.block.hr.test(n))break;p=e[0],n=n.substring(p.length);let h=e[2].split(` -`,1)[0].replace(this.rules.other.listReplaceTabs,A=>" ".repeat(3*A.length)),u=n.split(` -`,1)[0],g=!h.trim(),f=0;if(this.options.pedantic?(f=2,c=h.trimStart()):g?f=e[1].length+1:(f=e[2].search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=h.slice(f),f+=e[1].length),g&&this.rules.other.blankLine.test(u)&&(p+=u+` -`,n=n.substring(u.length+1),a=!0),!a){let A=this.rules.other.nextBulletRegex(f),j=this.rules.other.hrRegex(f),$=this.rules.other.fencesBeginRegex(f),S=this.rules.other.headingBeginRegex(f),gt=this.rules.other.htmlBeginRegex(f);for(;n;){let J=n.split(` -`,1)[0],B;if(u=J,this.options.pedantic?(u=u.replace(this.rules.other.listReplaceNesting," "),B=u):B=u.replace(this.rules.other.tabCharGlobal," "),$.test(u)||S.test(u)||gt.test(u)||A.test(u)||j.test(u))break;if(B.search(this.rules.other.nonSpaceChar)>=f||!u.trim())c+=` -`+B.slice(f);else{if(g||h.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||$.test(h)||S.test(h)||j.test(h))break;c+=` -`+u}!g&&!u.trim()&&(g=!0),p+=J+` -`,n=n.substring(J.length+1),h=B.slice(f)}}t.loose||(i?t.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(i=!0));let k=null,w;this.options.gfm&&(k=this.rules.other.listIsTask.exec(c),k&&(w=k[0]!=="[ ] ",c=c.replace(this.rules.other.listReplaceTask,""))),t.items.push({type:"list_item",raw:p,task:!!k,checked:w,loose:!1,text:c,tokens:[]}),t.raw+=p}let l=t.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;t.raw=t.raw.trimEnd();for(let a=0;ah.type==="space"),c=p.length>0&&p.some(h=>this.rules.other.anyLine.test(h.raw));t.loose=c}if(t.loose)for(let a=0;a({text:l,tokens:this.lexer.inline(l),header:!1,align:o.align[a]})));return o}}lheading(n){let e=this.rules.block.lheading.exec(n);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(n){let e=this.rules.block.paragraph.exec(n);if(e){let r=e[1].charAt(e[1].length-1)===` -`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:r,tokens:this.lexer.inline(r)}}}text(n){let e=this.rules.block.text.exec(n);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(n){let e=this.rules.inline.escape.exec(n);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(n){let e=this.rules.inline.tag.exec(n);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(n){let e=this.rules.inline.link.exec(n);if(e){let r=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(r)){if(!this.rules.other.endAngleBracket.test(r))return;let o=M(r.slice(0,-1),"\\");if((r.length-o.length)%2===0)return}else{let o=sn(e[2],"()");if(o===-2)return;if(o>-1){let i=(e[0].indexOf("!")===0?5:4)+e[1].length+o;e[2]=e[2].substring(0,o),e[0]=e[0].substring(0,i).trim(),e[3]=""}}let s=e[2],t="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(s);o&&(s=o[1],t=o[3])}else t=e[3]?e[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(r)?s=s.slice(1):s=s.slice(1,-1)),Fe(e,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:t&&t.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(n,e){let r;if((r=this.rules.inline.reflink.exec(n))||(r=this.rules.inline.nolink.exec(n))){let s=(r[2]||r[1]).replace(this.rules.other.multipleSpaceGlobal," "),t=e[s.toLowerCase()];if(!t){let o=r[0].charAt(0);return{type:"text",raw:o,text:o}}return Fe(r,t,r[0],this.lexer,this.rules)}}emStrong(n,e,r=""){let s=this.rules.inline.emStrongLDelim.exec(n);if(!(!s||s[3]&&r.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[2])||!r||this.rules.inline.punctuation.exec(r))){let t=[...s[0]].length-1,o,i,l=t,a=0,p=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(p.lastIndex=0,e=e.slice(-1*n.length+t);(s=p.exec(e))!=null;){if(o=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!o)continue;if(i=[...o].length,s[3]||s[4]){l+=i;continue}else if((s[5]||s[6])&&t%3&&!((t+i)%3)){a+=i;continue}if(l-=i,l>0)continue;i=Math.min(i,i+l+a);let c=[...s[0]][0].length,h=n.slice(0,t+s.index+c+i);if(Math.min(t,i)%2){let g=h.slice(1,-1);return{type:"em",raw:h,text:g,tokens:this.lexer.inlineTokens(g)}}let u=h.slice(2,-2);return{type:"strong",raw:h,text:u,tokens:this.lexer.inlineTokens(u)}}}}codespan(n){let e=this.rules.inline.code.exec(n);if(e){let r=e[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(r),t=this.rules.other.startingSpaceChar.test(r)&&this.rules.other.endingSpaceChar.test(r);return s&&t&&(r=r.substring(1,r.length-1)),{type:"codespan",raw:e[0],text:r}}}br(n){let e=this.rules.inline.br.exec(n);if(e)return{type:"br",raw:e[0]}}del(n){let e=this.rules.inline.del.exec(n);if(e)return{type:"del",raw:e[0],text:e[2],tokens:this.lexer.inlineTokens(e[2])}}autolink(n){let e=this.rules.inline.autolink.exec(n);if(e){let r,s;return e[2]==="@"?(r=e[1],s="mailto:"+r):(r=e[1],s=r),{type:"link",raw:e[0],text:r,href:s,tokens:[{type:"text",raw:r,text:r}]}}}url(n){let e;if(e=this.rules.inline.url.exec(n)){let r,s;if(e[2]==="@")r=e[0],s="mailto:"+r;else{let t;do t=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(t!==e[0]);r=e[0],e[1]==="www."?s="http://"+e[0]:s=e[0]}return{type:"link",raw:e[0],text:r,href:s,tokens:[{type:"text",raw:r,text:r}]}}}inlineText(n){let e=this.rules.inline.text.exec(n);if(e){let r=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:r}}}},I=class he{tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||C,this.options.tokenizer=this.options.tokenizer||new N,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let r={other:y,block:H.normal,inline:D.normal};this.options.pedantic?(r.block=H.pedantic,r.inline=D.pedantic):this.options.gfm&&(r.block=H.gfm,this.options.breaks?r.inline=D.breaks:r.inline=D.gfm),this.tokenizer.rules=r}static get rules(){return{block:H,inline:D}}static lex(e,r){return new he(r).lex(e)}static lexInline(e,r){return new he(r).inlineTokens(e)}lex(e){e=e.replace(y.carriageReturn,` -`),this.blockTokens(e,this.tokens);for(let r=0;r(t=i.call({lexer:this},e,r))?(e=e.substring(t.raw.length),r.push(t),!0):!1))continue;if(t=this.tokenizer.space(e)){e=e.substring(t.raw.length);let i=r.at(-1);t.raw.length===1&&i!==void 0?i.raw+=` -`:r.push(t);continue}if(t=this.tokenizer.code(e)){e=e.substring(t.raw.length);let i=r.at(-1);i?.type==="paragraph"||i?.type==="text"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+t.raw,i.text+=` -`+t.text,this.inlineQueue.at(-1).src=i.text):r.push(t);continue}if(t=this.tokenizer.fences(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.heading(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.hr(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.blockquote(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.list(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.html(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.def(e)){e=e.substring(t.raw.length);let i=r.at(-1);i?.type==="paragraph"||i?.type==="text"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+t.raw,i.text+=` -`+t.raw,this.inlineQueue.at(-1).src=i.text):this.tokens.links[t.tag]||(this.tokens.links[t.tag]={href:t.href,title:t.title},r.push(t));continue}if(t=this.tokenizer.table(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.lheading(e)){e=e.substring(t.raw.length),r.push(t);continue}let o=e;if(this.options.extensions?.startBlock){let i=1/0,l=e.slice(1),a;this.options.extensions.startBlock.forEach(p=>{a=p.call({lexer:this},l),typeof a=="number"&&a>=0&&(i=Math.min(i,a))}),i<1/0&&i>=0&&(o=e.substring(0,i+1))}if(this.state.top&&(t=this.tokenizer.paragraph(o))){let i=r.at(-1);s&&i?.type==="paragraph"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+t.raw,i.text+=` -`+t.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):r.push(t),s=o.length!==e.length,e=e.substring(t.raw.length);continue}if(t=this.tokenizer.text(e)){e=e.substring(t.raw.length);let i=r.at(-1);i?.type==="text"?(i.raw+=(i.raw.endsWith(` -`)?"":` -`)+t.raw,i.text+=` -`+t.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):r.push(t);continue}if(e){let i="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(i);break}else throw new Error(i)}}return this.state.top=!0,r}inline(e,r=[]){return this.inlineQueue.push({src:e,tokens:r}),r}inlineTokens(e,r=[]){let s=e,t=null;if(this.tokens.links){let a=Object.keys(this.tokens.links);if(a.length>0)for(;(t=this.tokenizer.rules.inline.reflinkSearch.exec(s))!=null;)a.includes(t[0].slice(t[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,t.index)+"["+"a".repeat(t[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(t=this.tokenizer.rules.inline.anyPunctuation.exec(s))!=null;)s=s.slice(0,t.index)+"++"+s.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let o;for(;(t=this.tokenizer.rules.inline.blockSkip.exec(s))!=null;)o=t[2]?t[2].length:0,s=s.slice(0,t.index+o)+"["+"a".repeat(t[0].length-o-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);s=this.options.hooks?.emStrongMask?.call({lexer:this},s)??s;let i=!1,l="";for(;e;){i||(l=""),i=!1;let a;if(this.options.extensions?.inline?.some(c=>(a=c.call({lexer:this},e,r))?(e=e.substring(a.raw.length),r.push(a),!0):!1))continue;if(a=this.tokenizer.escape(e)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.tag(e)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.link(e)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(a.raw.length);let c=r.at(-1);a.type==="text"&&c?.type==="text"?(c.raw+=a.raw,c.text+=a.text):r.push(a);continue}if(a=this.tokenizer.emStrong(e,s,l)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.codespan(e)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.br(e)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.del(e)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.autolink(e)){e=e.substring(a.raw.length),r.push(a);continue}if(!this.state.inLink&&(a=this.tokenizer.url(e))){e=e.substring(a.raw.length),r.push(a);continue}let p=e;if(this.options.extensions?.startInline){let c=1/0,h=e.slice(1),u;this.options.extensions.startInline.forEach(g=>{u=g.call({lexer:this},h),typeof u=="number"&&u>=0&&(c=Math.min(c,u))}),c<1/0&&c>=0&&(p=e.substring(0,c+1))}if(a=this.tokenizer.inlineText(p)){e=e.substring(a.raw.length),a.raw.slice(-1)!=="_"&&(l=a.raw.slice(-1)),i=!0;let c=r.at(-1);c?.type==="text"?(c.raw+=a.raw,c.text+=a.text):r.push(a);continue}if(e){let c="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(c);break}else throw new Error(c)}}return r}},V=class{options;parser;constructor(n){this.options=n||C}space(n){return""}code({text:n,lang:e,escaped:r}){let s=(e||"").match(y.notSpaceStart)?.[0],t=n.replace(y.endingNewline,"")+` -`;return s?'
'+(r?t:v(t,!0))+`
-`:"
"+(r?t:v(t,!0))+`
-`}blockquote({tokens:n}){return`
-${this.parser.parse(n)}
-`}html({text:n}){return n}def(n){return""}heading({tokens:n,depth:e}){return`${this.parser.parseInline(n)} -`}hr(n){return`
-`}list(n){let e=n.ordered,r=n.start,s="";for(let i=0;i -`+s+" -`}listitem(n){let e="";if(n.task){let r=this.checkbox({checked:!!n.checked});n.loose?n.tokens[0]?.type==="paragraph"?(n.tokens[0].text=r+" "+n.tokens[0].text,n.tokens[0].tokens&&n.tokens[0].tokens.length>0&&n.tokens[0].tokens[0].type==="text"&&(n.tokens[0].tokens[0].text=r+" "+v(n.tokens[0].tokens[0].text),n.tokens[0].tokens[0].escaped=!0)):n.tokens.unshift({type:"text",raw:r+" ",text:r+" ",escaped:!0}):e+=r+" "}return e+=this.parser.parse(n.tokens,!!n.loose),`
  • ${e}
  • -`}checkbox({checked:n}){return"'}paragraph({tokens:n}){return`

    ${this.parser.parseInline(n)}

    -`}table(n){let e="",r="";for(let t=0;t${s}`),` - -`+e+` -`+s+`
    -`}tablerow({text:n}){return` -${n} -`}tablecell(n){let e=this.parser.parseInline(n.tokens),r=n.header?"th":"td";return(n.align?`<${r} align="${n.align}">`:`<${r}>`)+e+` -`}strong({tokens:n}){return`${this.parser.parseInline(n)}`}em({tokens:n}){return`${this.parser.parseInline(n)}`}codespan({text:n}){return`${v(n,!0)}`}br(n){return"
    "}del({tokens:n}){return`${this.parser.parseInline(n)}`}link({href:n,title:e,tokens:r}){let s=this.parser.parseInline(r),t=Me(n);if(t===null)return s;n=t;let o='
    ",o}image({href:n,title:e,text:r,tokens:s}){s&&(r=this.parser.parseInline(s,this.parser.textRenderer));let t=Me(n);if(t===null)return v(r);n=t;let o=`${r}{let i=t[o].flat(1/0);r=r.concat(this.walkTokens(i,e))}):t.tokens&&(r=r.concat(this.walkTokens(t.tokens,e)))}}return r}use(...n){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return n.forEach(r=>{let s=x({},r);if(s.async=this.defaults.async||s.async||!1,r.extensions&&(r.extensions.forEach(t=>{if(!t.name)throw new Error("extension name required");if("renderer"in t){let o=e.renderers[t.name];o?e.renderers[t.name]=function(...i){let l=t.renderer.apply(this,i);return l===!1&&(l=o.apply(this,i)),l}:e.renderers[t.name]=t.renderer}if("tokenizer"in t){if(!t.level||t.level!=="block"&&t.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=e[t.level];o?o.unshift(t.tokenizer):e[t.level]=[t.tokenizer],t.start&&(t.level==="block"?e.startBlock?e.startBlock.push(t.start):e.startBlock=[t.start]:t.level==="inline"&&(e.startInline?e.startInline.push(t.start):e.startInline=[t.start]))}"childTokens"in t&&t.childTokens&&(e.childTokens[t.name]=t.childTokens)}),s.extensions=e),r.renderer){let t=this.defaults.renderer||new V(this.defaults);for(let o in r.renderer){if(!(o in t))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let i=o,l=r.renderer[i],a=t[i];t[i]=(...p)=>{let c=l.apply(t,p);return c===!1&&(c=a.apply(t,p)),c||""}}s.renderer=t}if(r.tokenizer){let t=this.defaults.tokenizer||new N(this.defaults);for(let o in r.tokenizer){if(!(o in t))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let i=o,l=r.tokenizer[i],a=t[i];t[i]=(...p)=>{let c=l.apply(t,p);return c===!1&&(c=a.apply(t,p)),c}}s.tokenizer=t}if(r.hooks){let t=this.defaults.hooks||new q;for(let o in r.hooks){if(!(o in t))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let i=o,l=r.hooks[i],a=t[i];q.passThroughHooks.has(o)?t[i]=p=>{if(this.defaults.async&&q.passThroughHooksRespectAsync.has(o))return T(this,null,function*(){let h=yield l.call(t,p);return a.call(t,h)});let c=l.call(t,p);return a.call(t,c)}:t[i]=(...p)=>{if(this.defaults.async)return T(this,null,function*(){let h=yield l.apply(t,p);return h===!1&&(h=yield a.apply(t,p)),h});let c=l.apply(t,p);return c===!1&&(c=a.apply(t,p)),c}}s.hooks=t}if(r.walkTokens){let t=this.defaults.walkTokens,o=r.walkTokens;s.walkTokens=function(i){let l=[];return l.push(o.call(this,i)),t&&(l=l.concat(t.call(this,i))),l}}this.defaults=x(x({},this.defaults),s)}),this}setOptions(n){return this.defaults=x(x({},this.defaults),n),this}lexer(n,e){return I.lex(n,e??this.defaults)}parser(n,e){return R.parse(n,e??this.defaults)}parseMarkdown(n){return(e,r)=>{let s=x({},r),t=x(x({},this.defaults),s),o=this.onError(!!t.silent,!!t.async);if(this.defaults.async===!0&&s.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(t.hooks&&(t.hooks.options=t,t.hooks.block=n),t.async)return T(this,null,function*(){let i=t.hooks?yield t.hooks.preprocess(e):e,l=yield(t.hooks?yield t.hooks.provideLexer():n?I.lex:I.lexInline)(i,t),a=t.hooks?yield t.hooks.processAllTokens(l):l;t.walkTokens&&(yield Promise.all(this.walkTokens(a,t.walkTokens)));let p=yield(t.hooks?yield t.hooks.provideParser():n?R.parse:R.parseInline)(a,t);return t.hooks?yield t.hooks.postprocess(p):p}).catch(o);try{t.hooks&&(e=t.hooks.preprocess(e));let i=(t.hooks?t.hooks.provideLexer():n?I.lex:I.lexInline)(e,t);t.hooks&&(i=t.hooks.processAllTokens(i)),t.walkTokens&&this.walkTokens(i,t.walkTokens);let l=(t.hooks?t.hooks.provideParser():n?R.parse:R.parseInline)(i,t);return t.hooks&&(l=t.hooks.postprocess(l)),l}catch(i){return o(i)}}}onError(n,e){return r=>{if(r.message+=` -Please report this to https://github.com/markedjs/marked.`,n){let s="

    An error occurred:

    "+v(r.message+"",!0)+"
    ";return e?Promise.resolve(s):s}if(e)return Promise.reject(r);throw r}}},L=new ln;function m(n,e){return L.parse(n,e)}m.options=m.setOptions=function(n){return L.setOptions(n),m.defaults=L.defaults,Oe(m.defaults),m};m.getDefaults=fe;m.defaults=C;m.use=function(...n){return L.use(...n),m.defaults=L.defaults,Oe(m.defaults),m};m.walkTokens=function(n,e){return L.walkTokens(n,e)};m.parseInline=L.parseInline;m.Parser=R;m.parser=R.parse;m.Renderer=V;m.TextRenderer=ye;m.Lexer=I;m.lexer=I.lex;m.Tokenizer=N;m.Hooks=q;m.parse=m;var Hn=m.options,Zn=m.setOptions,Nn=m.use,Vn=m.walkTokens,Un=m.parseInline;var Qn=R.parse,Kn=I.lex;function Ye(n){for(var e=[],r=1;r?',height:80,width:80},Se=new Map,et=new Map,cr=b(n=>{for(let e of n){if(!e.name)throw new Error('Invalid icon loader. Must have a "name" property with non-empty string value.');if(E.debug("Registering icon pack:",e.name),"loader"in e)et.set(e.name,e.loader);else if("icons"in e)Se.set(e.name,e.icons);else throw E.error("Invalid icon loader:",e),new Error('Invalid icon loader. Must have either "icons" or "loader" property.')}},"registerIconPacks"),tt=b((n,e)=>T(null,null,function*(){let r=re(n,!0,e!==void 0);if(!r)throw new Error(`Invalid icon name: ${n}`);let s=r.prefix||e;if(!s)throw new Error(`Icon name must contain a prefix: ${n}`);let t=Se.get(s);if(!t){let i=et.get(s);if(!i)throw new Error(`Icon set not found: ${r.prefix}`);try{let l=yield i();t=z(x({},l),{prefix:s}),Se.set(s,t)}catch(l){throw E.error(l),new Error(`Failed to load icon set: ${r.prefix}`)}}let o=ie(t,r.name);if(!o)throw new Error(`Icon not found: ${n}`);return o}),"getRegisteredIconData"),cn=b(n=>T(null,null,function*(){try{return yield tt(n),!0}catch(e){return!1}}),"isIconAvailable"),pn=b((n,e,r)=>T(null,null,function*(){let s;try{s=yield tt(n,e?.fallbackPrefix)}catch(i){E.error(i),s=an}let t=le(s,e),o=ce(ae(t.body),x(x({},t.attributes),r));return W(o,ee())}),"getIconSVG");function nt(n,{markdownAutoWrap:e}){let s=n.replace(//g,` -`).replace(/\n{2,}/g,` -`);return Ye(s)}b(nt,"preprocessMarkdown");function rt(n){return n.split(/\\n|\n|/gi).map(e=>e.trim().match(/<[^>]+>|[^\s<>]+/g)?.map(r=>({content:r,type:"normal"}))??[])}b(rt,"nonMarkdownToLines");function st(n,e={}){let r=nt(n,e),s=m.lexer(r),t=[[]],o=0;function i(l,a="normal"){l.type==="text"?l.text.split(` -`).forEach((c,h)=>{h!==0&&(o++,t.push([])),c.split(" ").forEach(u=>{u=u.replace(/'/g,"'"),u&&t[o].push({content:u,type:a})})}):l.type==="strong"||l.type==="em"?l.tokens.forEach(p=>{i(p,l.type)}):l.type==="html"&&t[o].push({content:l.text,type:"normal"})}return b(i,"processNode"),s.forEach(l=>{l.type==="paragraph"?l.tokens?.forEach(a=>{i(a)}):l.type==="html"?t[o].push({content:l.text,type:"normal"}):t[o].push({content:l.raw,type:"normal"})}),t}b(st,"markdownToLines");function it(n){return n?`

    ${n.replace(/\\n|\n/g,"
    ")}

    `:""}b(it,"nonMarkdownToHTML");function ot(n,{markdownAutoWrap:e}={}){let r=m.lexer(n);function s(t){return t.type==="text"?e===!1?t.text.replace(/\n */g,"
    ").replace(/ /g," "):t.text.replace(/\n */g,"
    "):t.type==="strong"?`${t.tokens?.map(s).join("")}`:t.type==="em"?`${t.tokens?.map(s).join("")}`:t.type==="paragraph"?`

    ${t.tokens?.map(s).join("")}

    `:t.type==="space"?"":t.type==="html"?`${t.text}`:t.type==="escape"?t.text:(E.warn(`Unsupported markdown: ${t.type}`),t.raw)}return b(s,"output"),r.map(s).join("")}b(ot,"markdownToHTML");function lt(n){return Intl.Segmenter?[...new Intl.Segmenter().segment(n)].map(e=>e.segment):[...n]}b(lt,"splitTextToChars");function at(n,e){let r=lt(e.content);return $e(n,[],r,e.type)}b(at,"splitWordToFitWidth");function $e(n,e,r,s){if(r.length===0)return[{content:e.join(""),type:s},{content:"",type:s}];let[t,...o]=r,i=[...e,t];return n([{content:i.join(""),type:s}])?$e(n,i,o,s):(e.length===0&&t&&(e.push(t),r.shift()),[{content:e.join(""),type:s},{content:r.join(""),type:s}])}b($e,"splitWordToFitWidthRecursion");function ct(n,e){if(n.some(({content:r})=>r.includes(` -`)))throw new Error("splitLineToFitWidth does not support newlines in the line");return K(n,e)}b(ct,"splitLineToFitWidth");function K(n,e,r=[],s=[]){if(n.length===0)return s.length>0&&r.push(s),r.length>0?r:[];let t="";n[0].content===" "&&(t=" ",n.shift());let o=n.shift()??{content:" ",type:"normal"},i=[...s];if(t!==""&&i.push({content:t,type:"normal"}),i.push(o),e(i))return K(n,e,r,i);if(s.length>0)r.push(s),n.unshift(o);else if(o.content){let[l,a]=at(e,o);r.push([l]),a.content&&n.unshift(a)}return K(n,e,r)}b(K,"splitLineToFitWidthRecursion");function Te(n,e){e&&n.attr("style",e)}b(Te,"applyStyle");var Je=16384;function pt(i,l,a,p){return T(this,arguments,function*(n,e,r,s,t=!1,o=ee()){let c=n.append("foreignObject");c.attr("width",`${Math.min(10*r,Je)}px`),c.attr("height",`${Math.min(10*r,Je)}px`);let h=c.append("xhtml:div"),u=te(e.label)?yield Ie(e.label.replace(Re.lineBreakRegex,` -`),o):W(e.label,o),g=e.isNode?"nodeLabel":"edgeLabel",f=h.append("span");f.html(u),Te(f,e.labelStyle),f.attr("class",`${g} ${s}`),Te(h,e.labelStyle),h.style("display","table-cell"),h.style("white-space","nowrap"),h.style("line-height","1.5"),r!==Number.POSITIVE_INFINITY&&(h.style("max-width",r+"px"),h.style("text-align","center")),h.attr("xmlns","http://www.w3.org/1999/xhtml"),t&&h.attr("class","labelBkg");let k=h.node().getBoundingClientRect();return k.width===r&&(h.style("display","table"),h.style("white-space","break-spaces"),h.style("width",r+"px"),k=h.node().getBoundingClientRect()),c.node()})}b(pt,"addHtmlSpan");function X(n,e,r,s=!1){let t=n.append("tspan").attr("class","text-outer-tspan").attr("x",0).attr("y",e*r-.1+"em").attr("dy",r+"em");return s&&t.attr("text-anchor","middle"),t}b(X,"createTspan");function ht(n,e,r){let s=n.append("text"),t=X(s,1,e);Y(t,r);let o=t.node().getComputedTextLength();return s.remove(),o}b(ht,"computeWidthOfText");function hn(n,e,r){let s=n.append("text"),t=X(s,1,e);Y(t,[{content:r,type:"normal"}]);let o=t.node()?.getBoundingClientRect();return o&&s.remove(),o}b(hn,"computeDimensionOfText");function ut(n,e,r,s=!1,t=!1){let i=e.append("g"),l=i.insert("rect").attr("class","background").attr("style","stroke: none"),a=i.append("text").attr("y","-10.1");t&&a.attr("text-anchor","middle");let p=0;for(let c of r){let h=b(g=>ht(i,1.1,g)<=n,"checkWidth"),u=h(c)?[c]:ct(c,h);for(let g of u){let f=X(a,p,1.1,t);Y(f,g),p++}}if(s){let c=a.node().getBBox(),h=2;return l.attr("x",c.x-h).attr("y",c.y-h).attr("width",c.width+2*h).attr("height",c.height+2*h),i.node()}else return a.node()}b(ut,"createFormattedText");function Y(n,e){n.text(""),e.forEach((r,s)=>{let t=n.append("tspan").attr("font-style",r.type==="em"?"italic":"normal").attr("class","text-inner-tspan").attr("font-weight",r.type==="strong"?"bold":"normal");s===0?t.text(r.content):t.text(" "+r.content)})}b(Y,"updateTextContentAndStyles");function ft(r){return T(this,arguments,function*(n,e={}){let s=[];n.replace(/(fa[bklrs]?):fa-([\w-]+)/g,(o,i,l)=>(s.push(T(null,null,function*(){let a=`${i}:${l}`;return(yield cn(a))?yield pn(a,void 0,{class:"label-icon"}):``})),o));let t=yield Promise.all(s);return n.replace(/(fa[bklrs]?):fa-([\w-]+)/g,()=>t.shift()??"")})}b(ft,"replaceIconSubstring");var fr=b((h,...u)=>T(null,[h,...u],function*(n,e="",{style:r="",isTitle:s=!1,classes:t="",useHtmlLabels:o=!0,markdown:i=!0,isNode:l=!0,width:a=200,addSvgBackground:p=!1}={},c){if(E.debug("XYZ createText",e,r,s,t,o,l,"addSvgBackground: ",p),o){let g=i?ot(e,c):it(e),f=yield ft(ze(g),c),k=e.replace(/\\\\/g,"\\"),w={isNode:l,label:te(e)?k:f,labelStyle:r.replace("fill:","color:")};return yield pt(n,w,a,t,p,c)}else{let g=e.replace(//g,"
    "),f=i?st(g.replace("
    ","
    "),c):rt(g),k=ut(a,n,f,e?p:!1,!l);if(l){/stroke:/.exec(r)&&(r=r.replace("stroke:","lineColor:"));let w=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");P(k).attr("style",w)}else{let w=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/background:/g,"fill:");P(k).select("rect").attr("style",w.replace(/background:/g,"fill:"));let A=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");P(k).select("text").attr("style",A)}return s?P(k).selectAll("tspan.text-outer-tspan").classed("title-row",!0):P(k).selectAll("tspan.text-outer-tspan").classed("row",!0),k}}),"createText");export{Ye as a,an as b,cr as c,pn as d,hn as e,fr as f}; diff --git a/src/google/adk/cli/browser/chunk-AQDQIDAM.js b/src/google/adk/cli/browser/chunk-WXV43367.js similarity index 97% rename from src/google/adk/cli/browser/chunk-AQDQIDAM.js rename to src/google/adk/cli/browser/chunk-WXV43367.js index 2a91ec3e30..7108b16993 100644 --- a/src/google/adk/cli/browser/chunk-AQDQIDAM.js +++ b/src/google/adk/cli/browser/chunk-WXV43367.js @@ -1 +1 @@ -import{$a as C,Aa as f,Dc as k,Gb as m,Hb as p,Jb as d,Lb as o,Pa as r,Tb as w,Ub as v,Yb as y,Zb as u,_b as D,eb as M,na as a,oa as c,pd as b,qb as x,qd as P,sb as h,xb as g,yb as l,za as _,zb as s}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var V=["dialog"];function S(t,E){if(t&1){let e=p();l(0,"dialog",2,0),d("click",function(i){a(e);let O=o();return c(O.handleDialogClick(i))}),l(2,"section")(3,"div",3)(4,"button",2),d("click",function(){a(e);let i=o();return c(i.closeDialog())}),l(5,"span",4),D(6,"close"),s()()(),m(7,5),s()()}if(t&2){let e=o();u(e.theme.components.Modal.backdrop),r(2),y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Modal),u(e.theme.components.Modal.element),r(5),g("surfaceId",e.surfaceId())("component",e.component().properties.contentChild)}}function T(t,E){if(t&1){let e=p();l(0,"section",2),d("click",function(){a(e);let i=o();return c(i.showDialog.set(!0))}),m(1,5),s()}if(t&2){let e=o();r(),g("surfaceId",e.surfaceId())("component",e.component().properties.entryPointChild)}}var j=(()=>{class t extends b{showDialog=_(!1);dialog=k("dialog");constructor(){super(),f(()=>{let e=this.dialog();e&&!e.nativeElement.open&&e.nativeElement.showModal()})}handleDialogClick(e){e.target instanceof HTMLDialogElement&&this.closeDialog()}closeDialog(){let e=this.dialog();e&&(e.nativeElement.open||e.nativeElement.close(),this.showDialog.set(!1))}static \u0275fac=function(n){return new(n||t)};static \u0275cmp=C({type:t,selectors:[["a2ui-modal"]],viewQuery:function(n,i){n&1&&w(i.dialog,V,5),n&2&&v()},features:[M],decls:2,vars:1,consts:[["dialog",""],[3,"class"],[3,"click"],[1,"controls"],[1,"g-icon"],["a2ui-renderer","",3,"surfaceId","component"]],template:function(n,i){n&1&&x(0,S,8,8,"dialog",1)(1,T,2,2,"section"),n&2&&h(i.showDialog()?0:1)},dependencies:[P],styles:["dialog[_ngcontent-%COMP%]{padding:0;border:none;background:none}dialog[_ngcontent-%COMP%] section[_ngcontent-%COMP%] .controls[_ngcontent-%COMP%]{display:flex;justify-content:end;margin-bottom:4px}dialog[_ngcontent-%COMP%] section[_ngcontent-%COMP%] .controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:0;background:none;width:20px;height:20px;pointer:cursor;border:none;cursor:pointer}"]})}return t})();export{j as Modal}; +import{$a as C,Aa as f,Dc as k,Gb as m,Hb as p,Jb as d,Lb as o,Pa as r,Tb as w,Ub as v,Yb as y,Zb as u,_b as D,eb as M,na as a,oa as c,pd as b,qb as x,qd as P,sb as h,xb as g,yb as l,za as _,zb as s}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var V=["dialog"];function S(t,E){if(t&1){let e=p();l(0,"dialog",2,0),d("click",function(i){a(e);let O=o();return c(O.handleDialogClick(i))}),l(2,"section")(3,"div",3)(4,"button",2),d("click",function(){a(e);let i=o();return c(i.closeDialog())}),l(5,"span",4),D(6,"close"),s()()(),m(7,5),s()()}if(t&2){let e=o();u(e.theme.components.Modal.backdrop),r(2),y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Modal),u(e.theme.components.Modal.element),r(5),g("surfaceId",e.surfaceId())("component",e.component().properties.contentChild)}}function T(t,E){if(t&1){let e=p();l(0,"section",2),d("click",function(){a(e);let i=o();return c(i.showDialog.set(!0))}),m(1,5),s()}if(t&2){let e=o();r(),g("surfaceId",e.surfaceId())("component",e.component().properties.entryPointChild)}}var j=(()=>{class t extends b{showDialog=_(!1);dialog=k("dialog");constructor(){super(),f(()=>{let e=this.dialog();e&&!e.nativeElement.open&&e.nativeElement.showModal()})}handleDialogClick(e){e.target instanceof HTMLDialogElement&&this.closeDialog()}closeDialog(){let e=this.dialog();e&&(e.nativeElement.open||e.nativeElement.close(),this.showDialog.set(!1))}static \u0275fac=function(n){return new(n||t)};static \u0275cmp=C({type:t,selectors:[["a2ui-modal"]],viewQuery:function(n,i){n&1&&w(i.dialog,V,5),n&2&&v()},features:[M],decls:2,vars:1,consts:[["dialog",""],[3,"class"],[3,"click"],[1,"controls"],[1,"g-icon"],["a2ui-renderer","",3,"surfaceId","component"]],template:function(n,i){n&1&&x(0,S,8,8,"dialog",1)(1,T,2,2,"section"),n&2&&h(i.showDialog()?0:1)},dependencies:[P],styles:["dialog[_ngcontent-%COMP%]{padding:0;border:none;background:none}dialog[_ngcontent-%COMP%] section[_ngcontent-%COMP%] .controls[_ngcontent-%COMP%]{display:flex;justify-content:end;margin-bottom:4px}dialog[_ngcontent-%COMP%] section[_ngcontent-%COMP%] .controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:0;background:none;width:20px;height:20px;pointer:cursor;border:none;cursor:pointer}"]})}return t})();export{j as Modal}; diff --git a/src/google/adk/cli/browser/chunk-WZIWL22C.js b/src/google/adk/cli/browser/chunk-WZIWL22C.js deleted file mode 100644 index 76245bb8f4..0000000000 --- a/src/google/adk/cli/browser/chunk-WZIWL22C.js +++ /dev/null @@ -1,292 +0,0 @@ -import{m as Ie}from"./chunk-WBLSVR3V.js";import{a as Qe}from"./chunk-GP6TCC26.js";import{M as ce,N as le,R as ue,S as de,T as fe,U as he,V as me,W as ke,X as ye,Y as ot}from"./chunk-QFMJV7VH.js";import{A as we,B as _e,C as De,D as Se,E as Ce,F as Me,G as At,H as Ft,I as Ee,a as yt,c as ae,f as oe,g as c,i as it,k as ge,l as pe,m as ve,n as Te,t as be,u as Et,v as It,w as Lt,x as Yt,y as $t,z as xe}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{e as xt,h as at}from"./chunk-RMXJBC7V.js";var Le=xt((Ot,Wt)=>{"use strict";(function(t,s){typeof Ot=="object"&&typeof Wt<"u"?Wt.exports=s():typeof define=="function"&&define.amd?define(s):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_isoWeek=s()})(Ot,function(){"use strict";var t="day";return function(s,n,a){var r=function(D){return D.add(4-D.isoWeekday(),t)},u=n.prototype;u.isoWeekYear=function(){return r(this).year()},u.isoWeek=function(D){if(!this.$utils().u(D))return this.add(7*(D-this.isoWeek()),t);var S,P,C,W,z=r(this),R=(S=this.isoWeekYear(),P=this.$u,C=(P?a.utc:a)().year(S).startOf("year"),W=4-C.isoWeekday(),C.isoWeekday()>4&&(W+=7),C.add(W,t));return z.diff(R,"week")+1},u.isoWeekday=function(D){return this.$utils().u(D)?this.day()||7:this.day(this.day()%7?D:D-7)};var b=u.startOf;u.startOf=function(D,S){var P=this.$utils(),C=!!P.u(S)||S;return P.p(D)==="isoweek"?C?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):b.bind(this)(D,S)}}})});var Ye=xt((Pt,Vt)=>{"use strict";(function(t,s){typeof Pt=="object"&&typeof Vt<"u"?Vt.exports=s():typeof define=="function"&&define.amd?define(s):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_customParseFormat=s()})(Pt,function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},s=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\d/,a=/\d\d/,r=/\d\d?/,u=/\d*[^-_:/,()\s\d]+/,b={},D=function(x){return(x=+x)+(x>68?1900:2e3)},S=function(x){return function(k){this[x]=+k}},P=[/[+-]\d\d:?(\d\d)?|Z/,function(x){(this.zone||(this.zone={})).offset=(function(k){if(!k||k==="Z")return 0;var F=k.match(/([+-]|\d\d)/g),Y=60*F[1]+(+F[2]||0);return Y===0?0:F[0]==="+"?-Y:Y})(x)}],C=function(x){var k=b[x];return k&&(k.indexOf?k:k.s.concat(k.f))},W=function(x,k){var F,Y=b.meridiem;if(Y){for(var G=1;G<=24;G+=1)if(x.indexOf(Y(G,0,k))>-1){F=G>12;break}}else F=x===(k?"pm":"PM");return F},z={A:[u,function(x){this.afternoon=W(x,!1)}],a:[u,function(x){this.afternoon=W(x,!0)}],Q:[n,function(x){this.month=3*(x-1)+1}],S:[n,function(x){this.milliseconds=100*+x}],SS:[a,function(x){this.milliseconds=10*+x}],SSS:[/\d{3}/,function(x){this.milliseconds=+x}],s:[r,S("seconds")],ss:[r,S("seconds")],m:[r,S("minutes")],mm:[r,S("minutes")],H:[r,S("hours")],h:[r,S("hours")],HH:[r,S("hours")],hh:[r,S("hours")],D:[r,S("day")],DD:[a,S("day")],Do:[u,function(x){var k=b.ordinal,F=x.match(/\d+/);if(this.day=F[0],k)for(var Y=1;Y<=31;Y+=1)k(Y).replace(/\[|\]/g,"")===x&&(this.day=Y)}],w:[r,S("week")],ww:[a,S("week")],M:[r,S("month")],MM:[a,S("month")],MMM:[u,function(x){var k=C("months"),F=(C("monthsShort")||k.map(function(Y){return Y.slice(0,3)})).indexOf(x)+1;if(F<1)throw new Error;this.month=F%12||F}],MMMM:[u,function(x){var k=C("months").indexOf(x)+1;if(k<1)throw new Error;this.month=k%12||k}],Y:[/[+-]?\d+/,S("year")],YY:[a,function(x){this.year=D(x)}],YYYY:[/\d{4}/,S("year")],Z:P,ZZ:P};function R(x){var k,F;k=x,F=b&&b.formats;for(var Y=(x=k.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function($,f,y){var g=y&&y.toUpperCase();return f||F[y]||t[y]||F[g].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(T,p,o){return p||o.slice(1)})})).match(s),G=Y.length,X=0;X-1)return new Date((h==="X"?1e3:1)*l);var i=R(h)(l),O=i.year,e=i.month,_=i.day,A=i.hours,I=i.minutes,L=i.seconds,H=i.milliseconds,V=i.zone,N=i.week,U=new Date,st=_||(O||e?1:U.getDate()),rt=O||U.getFullYear(),lt=0;O&&!e||(lt=e>0?e-1:U.getMonth());var ut,dt=A||0,j=I||0,nt=L||0,K=H||0;return V?new Date(Date.UTC(rt,lt,st,dt,j,nt,K+60*V.offset*1e3)):m?new Date(Date.UTC(rt,lt,st,dt,j,nt,K)):(ut=new Date(rt,lt,st,dt,j,nt,K),N&&(ut=w(ut).week(N).toDate()),ut)}catch(q){return new Date("")}})(E,M,v,F),this.init(),g&&g!==!0&&(this.$L=this.locale(g).$L),y&&E!=this.format(M)&&(this.$d=new Date("")),b={}}else if(M instanceof Array)for(var T=M.length,p=1;p<=T;p+=1){d[1]=M[p-1];var o=F.apply(this,d);if(o.isValid()){this.$d=o.$d,this.$L=o.$L,this.init();break}p===T&&(this.$d=new Date(""))}else G.call(this,X)}}})});var $e=xt((Nt,Rt)=>{"use strict";(function(t,s){typeof Nt=="object"&&typeof Rt<"u"?Rt.exports=s():typeof define=="function"&&define.amd?define(s):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_advancedFormat=s()})(Nt,function(){"use strict";return function(t,s){var n=s.prototype,a=n.format;n.format=function(r){var u=this,b=this.$locale();if(!this.isValid())return a.bind(this)(r);var D=this.$utils(),S=(r||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(P){switch(P){case"Q":return Math.ceil((u.$M+1)/3);case"Do":return b.ordinal(u.$D);case"gggg":return u.weekYear();case"GGGG":return u.isoWeekYear();case"wo":return b.ordinal(u.week(),"W");case"w":case"ww":return D.s(u.week(),P==="w"?1:2,"0");case"W":case"WW":return D.s(u.isoWeek(),P==="W"?1:2,"0");case"k":case"kk":return D.s(String(u.$H===0?24:u.$H),P==="k"?1:2,"0");case"X":return Math.floor(u.$d.getTime()/1e3);case"x":return u.$d.getTime();case"z":return"["+u.offsetName()+"]";case"zzz":return"["+u.offsetName("long")+"]";default:return P}});return a.bind(this)(S)}}})});var Ae=xt((zt,Ht)=>{"use strict";(function(t,s){typeof zt=="object"&&typeof Ht<"u"?Ht.exports=s():typeof define=="function"&&define.amd?define(s):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_duration=s()})(zt,function(){"use strict";var t,s,n=1e3,a=6e4,r=36e5,u=864e5,b=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,D=31536e6,S=2628e6,P=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/,C={years:D,months:S,days:u,hours:r,minutes:a,seconds:n,milliseconds:1,weeks:6048e5},W=function(E){return E instanceof G},z=function(E,v,d){return new G(E,d,v.$l)},R=function(E){return s.p(E)+"s"},x=function(E){return E<0},k=function(E){return x(E)?Math.ceil(E):Math.floor(E)},F=function(E){return Math.abs(E)},Y=function(E,v){return E?x(E)?{negative:!0,format:""+F(E)+v}:{negative:!1,format:""+E+v}:{negative:!1,format:""}},G=(function(){function E(d,M,$){var f=this;if(this.$d={},this.$l=$,d===void 0&&(this.$ms=0,this.parseFromMilliseconds()),M)return z(d*C[R(M)],this);if(typeof d=="number")return this.$ms=d,this.parseFromMilliseconds(),this;if(typeof d=="object")return Object.keys(d).forEach(function(T){f.$d[R(T)]=d[T]}),this.calMilliseconds(),this;if(typeof d=="string"){var y=d.match(P);if(y){var g=y.slice(2).map(function(T){return T!=null?Number(T):0});return this.$d.years=g[0],this.$d.months=g[1],this.$d.weeks=g[2],this.$d.days=g[3],this.$d.hours=g[4],this.$d.minutes=g[5],this.$d.seconds=g[6],this.calMilliseconds(),this}}return this}var v=E.prototype;return v.calMilliseconds=function(){var d=this;this.$ms=Object.keys(this.$d).reduce(function(M,$){return M+(d.$d[$]||0)*C[$]},0)},v.parseFromMilliseconds=function(){var d=this.$ms;this.$d.years=k(d/D),d%=D,this.$d.months=k(d/S),d%=S,this.$d.days=k(d/u),d%=u,this.$d.hours=k(d/r),d%=r,this.$d.minutes=k(d/a),d%=a,this.$d.seconds=k(d/n),d%=n,this.$d.milliseconds=d},v.toISOString=function(){var d=Y(this.$d.years,"Y"),M=Y(this.$d.months,"M"),$=+this.$d.days||0;this.$d.weeks&&($+=7*this.$d.weeks);var f=Y($,"D"),y=Y(this.$d.hours,"H"),g=Y(this.$d.minutes,"M"),T=this.$d.seconds||0;this.$d.milliseconds&&(T+=this.$d.milliseconds/1e3,T=Math.round(1e3*T)/1e3);var p=Y(T,"S"),o=d.negative||M.negative||f.negative||y.negative||g.negative||p.negative,l=y.format||g.format||p.format?"T":"",h=(o?"-":"")+"P"+d.format+M.format+f.format+l+y.format+g.format+p.format;return h==="P"||h==="-P"?"P0D":h},v.toJSON=function(){return this.toISOString()},v.format=function(d){var M=d||"YYYY-MM-DDTHH:mm:ss",$={Y:this.$d.years,YY:s.s(this.$d.years,2,"0"),YYYY:s.s(this.$d.years,4,"0"),M:this.$d.months,MM:s.s(this.$d.months,2,"0"),D:this.$d.days,DD:s.s(this.$d.days,2,"0"),H:this.$d.hours,HH:s.s(this.$d.hours,2,"0"),m:this.$d.minutes,mm:s.s(this.$d.minutes,2,"0"),s:this.$d.seconds,ss:s.s(this.$d.seconds,2,"0"),SSS:s.s(this.$d.milliseconds,3,"0")};return M.replace(b,function(f,y){return y||String($[f])})},v.as=function(d){return this.$ms/C[R(d)]},v.get=function(d){var M=this.$ms,$=R(d);return $==="milliseconds"?M%=1e3:M=$==="weeks"?k(M/C[$]):this.$d[$],M||0},v.add=function(d,M,$){var f;return f=M?d*C[R(M)]:W(d)?d.$ms:z(d,this).$ms,z(this.$ms+f*($?-1:1),this)},v.subtract=function(d,M){return this.add(d,M,!0)},v.locale=function(d){var M=this.clone();return M.$l=d,M},v.clone=function(){return z(this.$ms,this)},v.humanize=function(d){return t().add(this.$ms,"ms").locale(this.$l).fromNow(!d)},v.valueOf=function(){return this.asMilliseconds()},v.milliseconds=function(){return this.get("milliseconds")},v.asMilliseconds=function(){return this.as("milliseconds")},v.seconds=function(){return this.get("seconds")},v.asSeconds=function(){return this.as("seconds")},v.minutes=function(){return this.get("minutes")},v.asMinutes=function(){return this.as("minutes")},v.hours=function(){return this.get("hours")},v.asHours=function(){return this.as("hours")},v.days=function(){return this.get("days")},v.asDays=function(){return this.as("days")},v.weeks=function(){return this.get("weeks")},v.asWeeks=function(){return this.as("weeks")},v.months=function(){return this.get("months")},v.asMonths=function(){return this.as("months")},v.years=function(){return this.get("years")},v.asYears=function(){return this.as("years")},E})(),X=function(E,v,d){return E.add(v.years()*d,"y").add(v.months()*d,"M").add(v.days()*d,"d").add(v.hours()*d,"h").add(v.minutes()*d,"m").add(v.seconds()*d,"s").add(v.milliseconds()*d,"ms")};return function(E,v,d){t=d,s=d().$utils(),d.duration=function(f,y){var g=d.locale();return z(f,{$l:g},y)},d.isDuration=W;var M=v.prototype.add,$=v.prototype.subtract;v.prototype.add=function(f,y){return W(f)?X(this,f,1):M.bind(this)(f,y)},v.prototype.subtract=function(f,y){return W(f)?X(this,f,-1):$.bind(this)(f,y)}}})});var Pe=at(Qe(),1),Q=at(oe(),1),Ve=at(Le(),1),Ne=at(Ye(),1),Re=at($e(),1),ht=at(oe(),1),Ze=at(Ae(),1);var Bt=(function(){var t=c(function(p,o,l,h){for(l=l||{},h=p.length;h--;l[p[h]]=o);return l},"o"),s=[6,8,10,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,31,33,35,36,38,40],n=[1,26],a=[1,27],r=[1,28],u=[1,29],b=[1,30],D=[1,31],S=[1,32],P=[1,33],C=[1,34],W=[1,9],z=[1,10],R=[1,11],x=[1,12],k=[1,13],F=[1,14],Y=[1,15],G=[1,16],X=[1,19],E=[1,20],v=[1,21],d=[1,22],M=[1,23],$=[1,25],f=[1,35],y={trace:c(function(){},"trace"),yy:{},symbols_:{error:2,start:3,gantt:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NL:10,weekday:11,weekday_monday:12,weekday_tuesday:13,weekday_wednesday:14,weekday_thursday:15,weekday_friday:16,weekday_saturday:17,weekday_sunday:18,weekend:19,weekend_friday:20,weekend_saturday:21,dateFormat:22,inclusiveEndDates:23,topAxis:24,axisFormat:25,tickInterval:26,excludes:27,includes:28,todayMarker:29,title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,section:36,clickStatement:37,taskTxt:38,taskData:39,click:40,callbackname:41,callbackargs:42,href:43,clickStatementDebug:44,$accept:0,$end:1},terminals_:{2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",12:"weekday_monday",13:"weekday_tuesday",14:"weekday_wednesday",15:"weekday_thursday",16:"weekday_friday",17:"weekday_saturday",18:"weekday_sunday",20:"weekend_friday",21:"weekend_saturday",22:"dateFormat",23:"inclusiveEndDates",24:"topAxis",25:"axisFormat",26:"tickInterval",27:"excludes",28:"includes",29:"todayMarker",30:"title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"section",38:"taskTxt",39:"taskData",40:"click",41:"callbackname",42:"callbackargs",43:"href"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[19,1],[19,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,2],[37,2],[37,3],[37,3],[37,4],[37,3],[37,4],[37,2],[44,2],[44,3],[44,3],[44,4],[44,3],[44,4],[44,2]],performAction:c(function(o,l,h,m,w,i,O){var e=i.length-1;switch(w){case 1:return i[e-1];case 2:this.$=[];break;case 3:i[e-1].push(i[e]),this.$=i[e-1];break;case 4:case 5:this.$=i[e];break;case 6:case 7:this.$=[];break;case 8:m.setWeekday("monday");break;case 9:m.setWeekday("tuesday");break;case 10:m.setWeekday("wednesday");break;case 11:m.setWeekday("thursday");break;case 12:m.setWeekday("friday");break;case 13:m.setWeekday("saturday");break;case 14:m.setWeekday("sunday");break;case 15:m.setWeekend("friday");break;case 16:m.setWeekend("saturday");break;case 17:m.setDateFormat(i[e].substr(11)),this.$=i[e].substr(11);break;case 18:m.enableInclusiveEndDates(),this.$=i[e].substr(18);break;case 19:m.TopAxis(),this.$=i[e].substr(8);break;case 20:m.setAxisFormat(i[e].substr(11)),this.$=i[e].substr(11);break;case 21:m.setTickInterval(i[e].substr(13)),this.$=i[e].substr(13);break;case 22:m.setExcludes(i[e].substr(9)),this.$=i[e].substr(9);break;case 23:m.setIncludes(i[e].substr(9)),this.$=i[e].substr(9);break;case 24:m.setTodayMarker(i[e].substr(12)),this.$=i[e].substr(12);break;case 27:m.setDiagramTitle(i[e].substr(6)),this.$=i[e].substr(6);break;case 28:this.$=i[e].trim(),m.setAccTitle(this.$);break;case 29:case 30:this.$=i[e].trim(),m.setAccDescription(this.$);break;case 31:m.addSection(i[e].substr(8)),this.$=i[e].substr(8);break;case 33:m.addTask(i[e-1],i[e]),this.$="task";break;case 34:this.$=i[e-1],m.setClickEvent(i[e-1],i[e],null);break;case 35:this.$=i[e-2],m.setClickEvent(i[e-2],i[e-1],i[e]);break;case 36:this.$=i[e-2],m.setClickEvent(i[e-2],i[e-1],null),m.setLink(i[e-2],i[e]);break;case 37:this.$=i[e-3],m.setClickEvent(i[e-3],i[e-2],i[e-1]),m.setLink(i[e-3],i[e]);break;case 38:this.$=i[e-2],m.setClickEvent(i[e-2],i[e],null),m.setLink(i[e-2],i[e-1]);break;case 39:this.$=i[e-3],m.setClickEvent(i[e-3],i[e-1],i[e]),m.setLink(i[e-3],i[e-2]);break;case 40:this.$=i[e-1],m.setLink(i[e-1],i[e]);break;case 41:case 47:this.$=i[e-1]+" "+i[e];break;case 42:case 43:case 45:this.$=i[e-2]+" "+i[e-1]+" "+i[e];break;case 44:case 46:this.$=i[e-3]+" "+i[e-2]+" "+i[e-1]+" "+i[e];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(s,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:n,13:a,14:r,15:u,16:b,17:D,18:S,19:18,20:P,21:C,22:W,23:z,24:R,25:x,26:k,27:F,28:Y,29:G,30:X,31:E,33:v,35:d,36:M,37:24,38:$,40:f},t(s,[2,7],{1:[2,1]}),t(s,[2,3]),{9:36,11:17,12:n,13:a,14:r,15:u,16:b,17:D,18:S,19:18,20:P,21:C,22:W,23:z,24:R,25:x,26:k,27:F,28:Y,29:G,30:X,31:E,33:v,35:d,36:M,37:24,38:$,40:f},t(s,[2,5]),t(s,[2,6]),t(s,[2,17]),t(s,[2,18]),t(s,[2,19]),t(s,[2,20]),t(s,[2,21]),t(s,[2,22]),t(s,[2,23]),t(s,[2,24]),t(s,[2,25]),t(s,[2,26]),t(s,[2,27]),{32:[1,37]},{34:[1,38]},t(s,[2,30]),t(s,[2,31]),t(s,[2,32]),{39:[1,39]},t(s,[2,8]),t(s,[2,9]),t(s,[2,10]),t(s,[2,11]),t(s,[2,12]),t(s,[2,13]),t(s,[2,14]),t(s,[2,15]),t(s,[2,16]),{41:[1,40],43:[1,41]},t(s,[2,4]),t(s,[2,28]),t(s,[2,29]),t(s,[2,33]),t(s,[2,34],{42:[1,42],43:[1,43]}),t(s,[2,40],{41:[1,44]}),t(s,[2,35],{43:[1,45]}),t(s,[2,36]),t(s,[2,38],{42:[1,46]}),t(s,[2,37]),t(s,[2,39])],defaultActions:{},parseError:c(function(o,l){if(l.recoverable)this.trace(o);else{var h=new Error(o);throw h.hash=l,h}},"parseError"),parse:c(function(o){var l=this,h=[0],m=[],w=[null],i=[],O=this.table,e="",_=0,A=0,I=0,L=2,H=1,V=i.slice.call(arguments,1),N=Object.create(this.lexer),U={yy:{}};for(var st in this.yy)Object.prototype.hasOwnProperty.call(this.yy,st)&&(U.yy[st]=this.yy[st]);N.setInput(o,U.yy),U.yy.lexer=N,U.yy.parser=this,typeof N.yylloc>"u"&&(N.yylloc={});var rt=N.yylloc;i.push(rt);var lt=N.options&&N.options.ranges;typeof U.yy.parseError=="function"?this.parseError=U.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ut(Z){h.length=h.length-2*Z,w.length=w.length-Z,i.length=i.length-Z}c(ut,"popStack");function dt(){var Z;return Z=m.pop()||N.lex()||H,typeof Z!="number"&&(Z instanceof Array&&(m=Z,Z=m.pop()),Z=l.symbols_[Z]||Z),Z}c(dt,"lex");for(var j,nt,K,q,Ri,Ct,ft={},Tt,tt,ne,bt;;){if(K=h[h.length-1],this.defaultActions[K]?q=this.defaultActions[K]:((j===null||typeof j>"u")&&(j=dt()),q=O[K]&&O[K][j]),typeof q>"u"||!q.length||!q[0]){var Mt="";bt=[];for(Tt in O[K])this.terminals_[Tt]&&Tt>L&&bt.push("'"+this.terminals_[Tt]+"'");N.showPosition?Mt="Parse error on line "+(_+1)+`: -`+N.showPosition()+` -Expecting `+bt.join(", ")+", got '"+(this.terminals_[j]||j)+"'":Mt="Parse error on line "+(_+1)+": Unexpected "+(j==H?"end of input":"'"+(this.terminals_[j]||j)+"'"),this.parseError(Mt,{text:N.match,token:this.terminals_[j]||j,line:N.yylineno,loc:rt,expected:bt})}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+K+", token: "+j);switch(q[0]){case 1:h.push(j),w.push(N.yytext),i.push(N.yylloc),h.push(q[1]),j=null,nt?(j=nt,nt=null):(A=N.yyleng,e=N.yytext,_=N.yylineno,rt=N.yylloc,I>0&&I--);break;case 2:if(tt=this.productions_[q[1]][1],ft.$=w[w.length-tt],ft._$={first_line:i[i.length-(tt||1)].first_line,last_line:i[i.length-1].last_line,first_column:i[i.length-(tt||1)].first_column,last_column:i[i.length-1].last_column},lt&&(ft._$.range=[i[i.length-(tt||1)].range[0],i[i.length-1].range[1]]),Ct=this.performAction.apply(ft,[e,A,_,U.yy,q[1],w,i].concat(V)),typeof Ct<"u")return Ct;tt&&(h=h.slice(0,-1*tt*2),w=w.slice(0,-1*tt),i=i.slice(0,-1*tt)),h.push(this.productions_[q[1]][0]),w.push(ft.$),i.push(ft._$),ne=O[h[h.length-2]][h[h.length-1]],h.push(ne);break;case 3:return!0}}return!0},"parse")},g=(function(){var p={EOF:1,parseError:c(function(l,h){if(this.yy.parser)this.yy.parser.parseError(l,h);else throw new Error(l)},"parseError"),setInput:c(function(o,l){return this.yy=l||this.yy||{},this._input=o,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:c(function(){var o=this._input[0];this.yytext+=o,this.yyleng++,this.offset++,this.match+=o,this.matched+=o;var l=o.match(/(?:\r\n?|\n).*/g);return l?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),o},"input"),unput:c(function(o){var l=o.length,h=o.split(/(?:\r\n?|\n)/g);this._input=o+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-l),this.offset-=l;var m=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),h.length-1&&(this.yylineno-=h.length-1);var w=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:h?(h.length===m.length?this.yylloc.first_column:0)+m[m.length-h.length].length-h[0].length:this.yylloc.first_column-l},this.options.ranges&&(this.yylloc.range=[w[0],w[0]+this.yyleng-l]),this.yyleng=this.yytext.length,this},"unput"),more:c(function(){return this._more=!0,this},"more"),reject:c(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:c(function(o){this.unput(this.match.slice(o))},"less"),pastInput:c(function(){var o=this.matched.substr(0,this.matched.length-this.match.length);return(o.length>20?"...":"")+o.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:c(function(){var o=this.match;return o.length<20&&(o+=this._input.substr(0,20-o.length)),(o.substr(0,20)+(o.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:c(function(){var o=this.pastInput(),l=new Array(o.length+1).join("-");return o+this.upcomingInput()+` -`+l+"^"},"showPosition"),test_match:c(function(o,l){var h,m,w;if(this.options.backtrack_lexer&&(w={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(w.yylloc.range=this.yylloc.range.slice(0))),m=o[0].match(/(?:\r\n?|\n).*/g),m&&(this.yylineno+=m.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:m?m[m.length-1].length-m[m.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+o[0].length},this.yytext+=o[0],this.match+=o[0],this.matches=o,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(o[0].length),this.matched+=o[0],h=this.performAction.call(this,this.yy,this,l,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),h)return h;if(this._backtrack){for(var i in w)this[i]=w[i];return!1}return!1},"test_match"),next:c(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var o,l,h,m;this._more||(this.yytext="",this.match="");for(var w=this._currentRules(),i=0;il[0].length)){if(l=h,m=i,this.options.backtrack_lexer){if(o=this.test_match(h,w[i]),o!==!1)return o;if(this._backtrack){l=!1;continue}else return!1}else if(!this.options.flex)break}return l?(o=this.test_match(l,w[m]),o!==!1?o:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:c(function(){var l=this.next();return l||this.lex()},"lex"),begin:c(function(l){this.conditionStack.push(l)},"begin"),popState:c(function(){var l=this.conditionStack.length-1;return l>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:c(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:c(function(l){return l=this.conditionStack.length-1-Math.abs(l||0),l>=0?this.conditionStack[l]:"INITIAL"},"topState"),pushState:c(function(l){this.begin(l)},"pushState"),stateStackSize:c(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:c(function(l,h,m,w){var i=w;switch(m){case 0:return this.begin("open_directive"),"open_directive";break;case 1:return this.begin("acc_title"),31;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),33;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:break;case 9:break;case 10:break;case 11:return 10;case 12:break;case 13:break;case 14:this.begin("href");break;case 15:this.popState();break;case 16:return 43;case 17:this.begin("callbackname");break;case 18:this.popState();break;case 19:this.popState(),this.begin("callbackargs");break;case 20:return 41;case 21:this.popState();break;case 22:return 42;case 23:this.begin("click");break;case 24:this.popState();break;case 25:return 40;case 26:return 4;case 27:return 22;case 28:return 23;case 29:return 24;case 30:return 25;case 31:return 26;case 32:return 28;case 33:return 27;case 34:return 29;case 35:return 12;case 36:return 13;case 37:return 14;case 38:return 15;case 39:return 16;case 40:return 17;case 41:return 18;case 42:return 20;case 43:return 21;case 44:return"date";case 45:return 30;case 46:return"accDescription";case 47:return 36;case 48:return 38;case 49:return 39;case 50:return":";case 51:return 6;case 52:return"INVALID"}},"anonymous"),rules:[/^(?:%%\{)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:weekday\s+monday\b)/i,/^(?:weekday\s+tuesday\b)/i,/^(?:weekday\s+wednesday\b)/i,/^(?:weekday\s+thursday\b)/i,/^(?:weekday\s+friday\b)/i,/^(?:weekday\s+saturday\b)/i,/^(?:weekday\s+sunday\b)/i,/^(?:weekend\s+friday\b)/i,/^(?:weekend\s+saturday\b)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^\n]+)/i,/^(?:[^:\n]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},callbackargs:{rules:[21,22],inclusive:!1},callbackname:{rules:[18,19,20],inclusive:!1},href:{rules:[15,16],inclusive:!1},click:{rules:[24,25],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,17,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],inclusive:!0}}};return p})();y.lexer=g;function T(){this.yy={}}return c(T,"Parser"),T.prototype=y,y.Parser=T,new T})();Bt.parser=Bt;var Ke=Bt;Q.default.extend(Ve.default);Q.default.extend(Ne.default);Q.default.extend(Re.default);var Fe={friday:5,saturday:6},J="",qt="",Zt=void 0,Qt="",gt=[],pt=[],Kt=new Map,Jt=[],Dt=[],kt="",te="",ze=["active","done","crit","milestone","vert"],ee=[],vt=!1,ie=!1,se="sunday",St="saturday",Gt=0,Je=c(function(){Jt=[],Dt=[],kt="",ee=[],wt=0,Ut=void 0,_t=void 0,B=[],J="",qt="",te="",Zt=void 0,Qt="",gt=[],pt=[],vt=!1,ie=!1,Gt=0,Kt=new Map,ue(),se="sunday",St="saturday"},"clear"),ti=c(function(t){qt=t},"setAxisFormat"),ei=c(function(){return qt},"getAxisFormat"),ii=c(function(t){Zt=t},"setTickInterval"),si=c(function(){return Zt},"getTickInterval"),ri=c(function(t){Qt=t},"setTodayMarker"),ni=c(function(){return Qt},"getTodayMarker"),ai=c(function(t){J=t},"setDateFormat"),oi=c(function(){vt=!0},"enableInclusiveEndDates"),ci=c(function(){return vt},"endDatesAreInclusive"),li=c(function(){ie=!0},"enableTopAxis"),ui=c(function(){return ie},"topAxisEnabled"),di=c(function(t){te=t},"setDisplayMode"),fi=c(function(){return te},"getDisplayMode"),hi=c(function(){return J},"getDateFormat"),mi=c(function(t){gt=t.toLowerCase().split(/[\s,]+/)},"setIncludes"),ki=c(function(){return gt},"getIncludes"),yi=c(function(t){pt=t.toLowerCase().split(/[\s,]+/)},"setExcludes"),gi=c(function(){return pt},"getExcludes"),pi=c(function(){return Kt},"getLinks"),vi=c(function(t){kt=t,Jt.push(t)},"addSection"),Ti=c(function(){return Jt},"getSections"),bi=c(function(){let t=Oe(),s=10,n=0;for(;!t&&n{let S=D.trim();return S==="x"||S==="X"},"isTimestampFormat")(s)&&/^\d+$/.test(n))return new Date(Number(n));let u=/^after\s+(?[\d\w- ]+)/.exec(n);if(u!==null){let D=null;for(let P of u.groups.ids.split(" ")){let C=ct(P);C!==void 0&&(!D||C.endTime>D.endTime)&&(D=C)}if(D)return D.endTime;let S=new Date;return S.setHours(0,0,0,0),S}let b=(0,Q.default)(n,s.trim(),!0);if(b.isValid())return b.toDate();{it.debug("Invalid date:"+n),it.debug("With date format:"+s.trim());let D=new Date(n);if(D===void 0||isNaN(D.getTime())||D.getFullYear()<-1e4||D.getFullYear()>1e4)throw new Error("Invalid date:"+n);return D}},"getStartDate"),Be=c(function(t){let s=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return s!==null?[Number.parseFloat(s[1]),s[2]]:[NaN,"ms"]},"parseDuration"),Ge=c(function(t,s,n,a=!1){n=n.trim();let u=/^until\s+(?[\d\w- ]+)/.exec(n);if(u!==null){let C=null;for(let z of u.groups.ids.split(" ")){let R=ct(z);R!==void 0&&(!C||R.startTime{window.open(n,"_self")}),Kt.set(a,n))}),Ue(t,"clickable")},"setLink"),Ue=c(function(t,s){t.split(",").forEach(function(n){let a=ct(n);a!==void 0&&a.classes.push(s)})},"setClass"),Li=c(function(t,s,n){if(ot().securityLevel!=="loose"||s===void 0)return;let a=[];if(typeof n=="string"){a=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let u=0;u{Ie.runFunc(s,...a)})},"setClickFun"),qe=c(function(t,s){ee.push(function(){let n=document.querySelector(`[id="${t}"]`);n!==null&&n.addEventListener("click",function(){s()})},function(){let n=document.querySelector(`[id="${t}-text"]`);n!==null&&n.addEventListener("click",function(){s()})})},"pushFun"),Yi=c(function(t,s,n){t.split(",").forEach(function(a){Li(a,s,n)}),Ue(t,"clickable")},"setClickEvent"),$i=c(function(t){ee.forEach(function(s){s(t)})},"bindFunctions"),Ai={getConfig:c(()=>ot().gantt,"getConfig"),clear:Je,setDateFormat:ai,getDateFormat:hi,enableInclusiveEndDates:oi,endDatesAreInclusive:ci,enableTopAxis:li,topAxisEnabled:ui,setAxisFormat:ti,getAxisFormat:ei,setTickInterval:ii,getTickInterval:si,setTodayMarker:ri,getTodayMarker:ni,setAccTitle:de,getAccTitle:fe,setDiagramTitle:ke,getDiagramTitle:ye,setDisplayMode:di,getDisplayMode:fi,setAccDescription:he,getAccDescription:me,addSection:vi,getSections:Ti,getTasks:bi,addTask:Mi,findTaskById:ct,addTaskOrg:Ei,setIncludes:mi,getIncludes:ki,setExcludes:yi,getExcludes:gi,setClickEvent:Yi,setLink:Ii,getLinks:pi,bindFunctions:$i,parseDuration:Be,isInvalidDate:He,setWeekday:xi,getWeekday:wi,setWeekend:_i};function re(t,s,n){let a=!0;for(;a;)a=!1,n.forEach(function(r){let u="^\\s*"+r+"\\s*$",b=new RegExp(u);t[0].match(b)&&(s[r]=!0,t.shift(1),a=!0)})}c(re,"getTaskTags");ht.default.extend(Ze.default);var Fi=c(function(){it.debug("Something is calling, setConf, remove the call")},"setConf"),We={monday:we,tuesday:_e,wednesday:De,thursday:Se,friday:Ce,saturday:Me,sunday:xe},Oi=c((t,s)=>{let n=[...t].map(()=>-1/0),a=[...t].sort((u,b)=>u.startTime-b.startTime||u.order-b.order),r=0;for(let u of a)for(let b=0;b=n[b]){n[b]=u.endTime,u.order=b+s,b>r&&(r=b);break}return r},"getMaxIntersections"),et,jt=1e4,Wi=c(function(t,s,n,a){let r=ot().gantt,u=ot().securityLevel,b;u==="sandbox"&&(b=yt("#i"+s));let D=u==="sandbox"?yt(b.nodes()[0].contentDocument.body):yt("body"),S=u==="sandbox"?b.nodes()[0].contentDocument:document,P=S.getElementById(s);et=P.parentElement.offsetWidth,et===void 0&&(et=1200),r.useWidth!==void 0&&(et=r.useWidth);let C=a.db.getTasks(),W=[];for(let f of C)W.push(f.type);W=$(W);let z={},R=2*r.topPadding;if(a.db.getDisplayMode()==="compact"||r.displayMode==="compact"){let f={};for(let g of C)f[g.section]===void 0?f[g.section]=[g]:f[g.section].push(g);let y=0;for(let g of Object.keys(f)){let T=Oi(f[g],y)+1;y+=T,R+=T*(r.barHeight+r.barGap),z[g]=T}}else{R+=C.length*(r.barHeight+r.barGap);for(let f of W)z[f]=C.filter(y=>y.type===f).length}P.setAttribute("viewBox","0 0 "+et+" "+R);let x=D.select(`[id="${s}"]`),k=Ee().domain([pe(C,function(f){return f.startTime}),ge(C,function(f){return f.endTime})]).rangeRound([0,et-r.leftPadding-r.rightPadding]);function F(f,y){let g=f.startTime,T=y.startTime,p=0;return g>T?p=1:ge.vert===_.vert?0:e.vert?1:-1);let m=[...new Set(f.map(e=>e.order))].map(e=>f.find(_=>_.order===e));x.append("g").selectAll("rect").data(m).enter().append("rect").attr("x",0).attr("y",function(e,_){return _=e.order,_*y+g-2}).attr("width",function(){return l-r.rightPadding/2}).attr("height",y).attr("class",function(e){for(let[_,A]of W.entries())if(e.type===A)return"section section"+_%r.numberSectionStyles;return"section section0"}).enter();let w=x.append("g").selectAll("rect").data(f).enter(),i=a.db.getLinks();if(w.append("rect").attr("id",function(e){return e.id}).attr("rx",3).attr("ry",3).attr("x",function(e){return e.milestone?k(e.startTime)+T+.5*(k(e.endTime)-k(e.startTime))-.5*p:k(e.startTime)+T}).attr("y",function(e,_){return _=e.order,e.vert?r.gridLineStartPadding:_*y+g}).attr("width",function(e){return e.milestone?p:e.vert?.08*p:k(e.renderEndTime||e.endTime)-k(e.startTime)}).attr("height",function(e){return e.vert?C.length*(r.barHeight+r.barGap)+r.barHeight*2:p}).attr("transform-origin",function(e,_){return _=e.order,(k(e.startTime)+T+.5*(k(e.endTime)-k(e.startTime))).toString()+"px "+(_*y+g+.5*p).toString()+"px"}).attr("class",function(e){let _="task",A="";e.classes.length>0&&(A=e.classes.join(" "));let I=0;for(let[H,V]of W.entries())e.type===V&&(I=H%r.numberSectionStyles);let L="";return e.active?e.crit?L+=" activeCrit":L=" active":e.done?e.crit?L=" doneCrit":L=" done":e.crit&&(L+=" crit"),L.length===0&&(L=" task"),e.milestone&&(L=" milestone "+L),e.vert&&(L=" vert "+L),L+=I,L+=" "+A,_+L}),w.append("text").attr("id",function(e){return e.id+"-text"}).text(function(e){return e.task}).attr("font-size",r.fontSize).attr("x",function(e){let _=k(e.startTime),A=k(e.renderEndTime||e.endTime);if(e.milestone&&(_+=.5*(k(e.endTime)-k(e.startTime))-.5*p,A=_+p),e.vert)return k(e.startTime)+T;let I=this.getBBox().width;return I>A-_?A+I+1.5*r.leftPadding>l?_+T-5:A+T+5:(A-_)/2+_+T}).attr("y",function(e,_){return e.vert?r.gridLineStartPadding+C.length*(r.barHeight+r.barGap)+60:(_=e.order,_*y+r.barHeight/2+(r.fontSize/2-2)+g)}).attr("text-height",p).attr("class",function(e){let _=k(e.startTime),A=k(e.endTime);e.milestone&&(A=_+p);let I=this.getBBox().width,L="";e.classes.length>0&&(L=e.classes.join(" "));let H=0;for(let[N,U]of W.entries())e.type===U&&(H=N%r.numberSectionStyles);let V="";return e.active&&(e.crit?V="activeCritText"+H:V="activeText"+H),e.done?e.crit?V=V+" doneCritText"+H:V=V+" doneText"+H:e.crit&&(V=V+" critText"+H),e.milestone&&(V+=" milestoneText"),e.vert&&(V+=" vertText"),I>A-_?A+I+1.5*r.leftPadding>l?L+" taskTextOutsideLeft taskTextOutside"+H+" "+V:L+" taskTextOutsideRight taskTextOutside"+H+" "+V+" width-"+I:L+" taskText taskText"+H+" "+V+" width-"+I}),ot().securityLevel==="sandbox"){let e;e=yt("#i"+s);let _=e.nodes()[0].contentDocument;w.filter(function(A){return i.has(A.id)}).each(function(A){var I=_.querySelector("#"+A.id),L=_.querySelector("#"+A.id+"-text");let H=I.parentNode;var V=_.createElement("a");V.setAttribute("xlink:href",i.get(A.id)),V.setAttribute("target","_top"),H.appendChild(V),V.appendChild(I),V.appendChild(L)})}}c(G,"drawRects");function X(f,y,g,T,p,o,l,h){if(l.length===0&&h.length===0)return;let m,w;for(let{startTime:I,endTime:L}of o)(m===void 0||Iw)&&(w=L);if(!m||!w)return;if((0,ht.default)(w).diff((0,ht.default)(m),"year")>5){it.warn("The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.");return}let i=a.db.getDateFormat(),O=[],e=null,_=(0,ht.default)(m);for(;_.valueOf()<=w;)a.db.isInvalidDate(_,i,l,h)?e?e.end=_:e={start:_,end:_}:e&&(O.push(e),e=null),_=_.add(1,"d");x.append("g").selectAll("rect").data(O).enter().append("rect").attr("id",I=>"exclude-"+I.start.format("YYYY-MM-DD")).attr("x",I=>k(I.start.startOf("day"))+g).attr("y",r.gridLineStartPadding).attr("width",I=>k(I.end.endOf("day"))-k(I.start.startOf("day"))).attr("height",p-y-r.gridLineStartPadding).attr("transform-origin",function(I,L){return(k(I.start)+g+.5*(k(I.end)-k(I.start))).toString()+"px "+(L*f+.5*p).toString()+"px"}).attr("class","exclude-range")}c(X,"drawExcludeDays");function E(f,y,g,T){if(g<=0||f>y)return 1/0;let p=y-f,o=ht.default.duration({[T??"day"]:g}).asMilliseconds();return o<=0?1/0:Math.ceil(p/o)}c(E,"getEstimatedTickCount");function v(f,y,g,T){let p=a.db.getDateFormat(),o=a.db.getAxisFormat(),l;o?l=o:p==="D"?l="%d":l=r.axisFormat??"%Y-%m-%d";let h=Te(k).tickSize(-T+y+r.gridLineStartPadding).tickFormat(Ft(l)),w=/^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/.exec(a.db.getTickInterval()||r.tickInterval);if(w!==null){let i=parseInt(w[1],10);if(isNaN(i)||i<=0)it.warn(`Invalid tick interval value: "${w[1]}". Skipping custom tick interval.`);else{let O=w[2],e=a.db.getWeekday()||r.weekday,_=k.domain(),A=_[0],I=_[1],L=E(A,I,i,O);if(L>jt)it.warn(`The tick interval "${i}${O}" would generate ${L} ticks, which exceeds the maximum allowed (${jt}). This may indicate an invalid date or time range. Skipping custom tick interval.`);else switch(O){case"millisecond":h.ticks(Et.every(i));break;case"second":h.ticks(It.every(i));break;case"minute":h.ticks(Lt.every(i));break;case"hour":h.ticks(Yt.every(i));break;case"day":h.ticks($t.every(i));break;case"week":h.ticks(We[e].every(i));break;case"month":h.ticks(At.every(i));break}}}if(x.append("g").attr("class","grid").attr("transform","translate("+f+", "+(T-50)+")").call(h).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),a.db.topAxisEnabled()||r.topAxis){let i=ve(k).tickSize(-T+y+r.gridLineStartPadding).tickFormat(Ft(l));if(w!==null){let O=parseInt(w[1],10);if(isNaN(O)||O<=0)it.warn(`Invalid tick interval value: "${w[1]}". Skipping custom tick interval.`);else{let e=w[2],_=a.db.getWeekday()||r.weekday,A=k.domain(),I=A[0],L=A[1];if(E(I,L,O,e)<=jt)switch(e){case"millisecond":i.ticks(Et.every(O));break;case"second":i.ticks(It.every(O));break;case"minute":i.ticks(Lt.every(O));break;case"hour":i.ticks(Yt.every(O));break;case"day":i.ticks($t.every(O));break;case"week":i.ticks(We[_].every(O));break;case"month":i.ticks(At.every(O));break}}}x.append("g").attr("class","grid").attr("transform","translate("+f+", "+y+")").call(i).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}c(v,"makeGrid");function d(f,y){let g=0,T=Object.keys(z).map(p=>[p,z[p]]);x.append("g").selectAll("text").data(T).enter().append(function(p){let o=p[0].split(ce.lineBreakRegex),l=-(o.length-1)/2,h=S.createElementNS("http://www.w3.org/2000/svg","text");h.setAttribute("dy",l+"em");for(let[m,w]of o.entries()){let i=S.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttribute("alignment-baseline","central"),i.setAttribute("x","10"),m>0&&i.setAttribute("dy","1em"),i.textContent=w,h.appendChild(i)}return h}).attr("x",10).attr("y",function(p,o){if(o>0)for(let l=0;l` - .mermaid-main-font { - font-family: ${t.fontFamily}; - } - - .exclude-range { - fill: ${t.excludeBkgColor}; - } - - .section { - stroke: none; - opacity: 0.2; - } - - .section0 { - fill: ${t.sectionBkgColor}; - } - - .section2 { - fill: ${t.sectionBkgColor2}; - } - - .section1, - .section3 { - fill: ${t.altSectionBkgColor}; - opacity: 0.2; - } - - .sectionTitle0 { - fill: ${t.titleColor}; - } - - .sectionTitle1 { - fill: ${t.titleColor}; - } - - .sectionTitle2 { - fill: ${t.titleColor}; - } - - .sectionTitle3 { - fill: ${t.titleColor}; - } - - .sectionTitle { - text-anchor: start; - font-family: ${t.fontFamily}; - } - - - /* Grid and axis */ - - .grid .tick { - stroke: ${t.gridColor}; - opacity: 0.8; - shape-rendering: crispEdges; - } - - .grid .tick text { - font-family: ${t.fontFamily}; - fill: ${t.textColor}; - } - - .grid path { - stroke-width: 0; - } - - - /* Today line */ - - .today { - fill: none; - stroke: ${t.todayLineColor}; - stroke-width: 2px; - } - - - /* Task styling */ - - /* Default task */ - - .task { - stroke-width: 2; - } - - .taskText { - text-anchor: middle; - font-family: ${t.fontFamily}; - } - - .taskTextOutsideRight { - fill: ${t.taskTextDarkColor}; - text-anchor: start; - font-family: ${t.fontFamily}; - } - - .taskTextOutsideLeft { - fill: ${t.taskTextDarkColor}; - text-anchor: end; - } - - - /* Special case clickable */ - - .task.clickable { - cursor: pointer; - } - - .taskText.clickable { - cursor: pointer; - fill: ${t.taskTextClickableColor} !important; - font-weight: bold; - } - - .taskTextOutsideLeft.clickable { - cursor: pointer; - fill: ${t.taskTextClickableColor} !important; - font-weight: bold; - } - - .taskTextOutsideRight.clickable { - cursor: pointer; - fill: ${t.taskTextClickableColor} !important; - font-weight: bold; - } - - - /* Specific task settings for the sections*/ - - .taskText0, - .taskText1, - .taskText2, - .taskText3 { - fill: ${t.taskTextColor}; - } - - .task0, - .task1, - .task2, - .task3 { - fill: ${t.taskBkgColor}; - stroke: ${t.taskBorderColor}; - } - - .taskTextOutside0, - .taskTextOutside2 - { - fill: ${t.taskTextOutsideColor}; - } - - .taskTextOutside1, - .taskTextOutside3 { - fill: ${t.taskTextOutsideColor}; - } - - - /* Active task */ - - .active0, - .active1, - .active2, - .active3 { - fill: ${t.activeTaskBkgColor}; - stroke: ${t.activeTaskBorderColor}; - } - - .activeText0, - .activeText1, - .activeText2, - .activeText3 { - fill: ${t.taskTextDarkColor} !important; - } - - - /* Completed task */ - - .done0, - .done1, - .done2, - .done3 { - stroke: ${t.doneTaskBorderColor}; - fill: ${t.doneTaskBkgColor}; - stroke-width: 2; - } - - .doneText0, - .doneText1, - .doneText2, - .doneText3 { - fill: ${t.taskTextDarkColor} !important; - } - - /* Done task text displayed outside the bar sits against the diagram background, - not against the done-task bar, so it must use the outside/contrast color. */ - .doneText0.taskTextOutsideLeft, - .doneText0.taskTextOutsideRight, - .doneText1.taskTextOutsideLeft, - .doneText1.taskTextOutsideRight, - .doneText2.taskTextOutsideLeft, - .doneText2.taskTextOutsideRight, - .doneText3.taskTextOutsideLeft, - .doneText3.taskTextOutsideRight { - fill: ${t.taskTextOutsideColor} !important; - } - - - /* Tasks on the critical line */ - - .crit0, - .crit1, - .crit2, - .crit3 { - stroke: ${t.critBorderColor}; - fill: ${t.critBkgColor}; - stroke-width: 2; - } - - .activeCrit0, - .activeCrit1, - .activeCrit2, - .activeCrit3 { - stroke: ${t.critBorderColor}; - fill: ${t.activeTaskBkgColor}; - stroke-width: 2; - } - - .doneCrit0, - .doneCrit1, - .doneCrit2, - .doneCrit3 { - stroke: ${t.critBorderColor}; - fill: ${t.doneTaskBkgColor}; - stroke-width: 2; - cursor: pointer; - shape-rendering: crispEdges; - } - - .milestone { - transform: rotate(45deg) scale(0.8,0.8); - } - - .milestoneText { - font-style: italic; - } - .doneCritText0, - .doneCritText1, - .doneCritText2, - .doneCritText3 { - fill: ${t.taskTextDarkColor} !important; - } - - /* Done-crit task text outside the bar \u2014 same reasoning as doneText above. */ - .doneCritText0.taskTextOutsideLeft, - .doneCritText0.taskTextOutsideRight, - .doneCritText1.taskTextOutsideLeft, - .doneCritText1.taskTextOutsideRight, - .doneCritText2.taskTextOutsideLeft, - .doneCritText2.taskTextOutsideRight, - .doneCritText3.taskTextOutsideLeft, - .doneCritText3.taskTextOutsideRight { - fill: ${t.taskTextOutsideColor} !important; - } - - .vert { - stroke: ${t.vertLineColor}; - } - - .vertText { - font-size: 15px; - text-anchor: middle; - fill: ${t.vertLineColor} !important; - } - - .activeCritText0, - .activeCritText1, - .activeCritText2, - .activeCritText3 { - fill: ${t.taskTextDarkColor} !important; - } - - .titleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.titleColor||t.textColor}; - font-family: ${t.fontFamily}; - } -`,"getStyles"),Ni=Vi,Gi={parser:Ke,db:Ai,renderer:Pi,styles:Ni};export{Gi as diagram}; diff --git a/src/google/adk/cli/browser/chunk-XE4A3JWW.js b/src/google/adk/cli/browser/chunk-XE4A3JWW.js deleted file mode 100644 index 611e9d0cbd..0000000000 --- a/src/google/adk/cli/browser/chunk-XE4A3JWW.js +++ /dev/null @@ -1 +0,0 @@ -import{a as r,b as e}from"./chunk-2DLZXFEQ.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{r as GitGraphModule,e as createGitGraphServices}; diff --git a/src/google/adk/cli/browser/chunk-XMBKBASC.js b/src/google/adk/cli/browser/chunk-XMBKBASC.js deleted file mode 100644 index e7a4f921c7..0000000000 --- a/src/google/adk/cli/browser/chunk-XMBKBASC.js +++ /dev/null @@ -1 +0,0 @@ -import{C as m,G as E,J as a,S as O,Y as C,b as u,p as o,s as f}from"./chunk-ASJUXEUE.js";import{h as b,l as c}from"./chunk-EGBSMT36.js";var j="\0",_="\0",N="",p=class{constructor(e={}){this._isDirected=Object.prototype.hasOwnProperty.call(e,"directed")?e.directed:!0,this._isMultigraph=Object.prototype.hasOwnProperty.call(e,"multigraph")?e.multigraph:!1,this._isCompound=Object.prototype.hasOwnProperty.call(e,"compound")?e.compound:!1,this._label=void 0,this._defaultNodeLabelFn=c(void 0),this._defaultEdgeLabelFn=c(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[_]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return b(e)||(e=c(e)),this._defaultNodeLabelFn=e,this}nodeCount(){return this._nodeCount}nodes(){return u(this._nodes)}sources(){var e=this;return f(this.nodes(),function(t){return E(e._in[t])})}sinks(){var e=this;return f(this.nodes(),function(t){return E(e._out[t])})}setNodes(e,t){var s=arguments,i=this;return o(e,function(r){s.length>1?i.setNode(r,t):i.setNode(r)}),this}setNode(e,t){return Object.prototype.hasOwnProperty.call(this._nodes,e)?(arguments.length>1&&(this._nodes[e]=t),this):(this._nodes[e]=arguments.length>1?t:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=_,this._children[e]={},this._children[_][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return Object.prototype.hasOwnProperty.call(this._nodes,e)}removeNode(e){if(Object.prototype.hasOwnProperty.call(this._nodes,e)){var t=s=>this.removeEdge(this._edgeObjs[s]);delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],o(this.children(e),s=>{this.setParent(s)}),delete this._children[e]),o(u(this._in[e]),t),delete this._in[e],delete this._preds[e],o(u(this._out[e]),t),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,t){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(a(t))t=_;else{t+="";for(var s=t;!a(s);s=this.parent(s))if(s===e)throw new Error("Setting "+t+" as parent of "+e+" would create a cycle");this.setNode(t)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=t,this._children[t][e]=!0,this}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}parent(e){if(this._isCompound){var t=this._parent[e];if(t!==_)return t}}children(e){if(a(e)&&(e=_),this._isCompound){var t=this._children[e];if(t)return u(t)}else{if(e===_)return this.nodes();if(this.hasNode(e))return[]}}predecessors(e){var t=this._preds[e];if(t)return u(t)}successors(e){var t=this._sucs[e];if(t)return u(t)}neighbors(e){var t=this.predecessors(e);if(t)return C(t,this.successors(e))}isLeaf(e){var t;return this.isDirected()?t=this.successors(e):t=this.neighbors(e),t.length===0}filterNodes(e){var t=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});t.setGraph(this.graph());var s=this;o(this._nodes,function(n,h){e(h)&&t.setNode(h,n)}),o(this._edgeObjs,function(n){t.hasNode(n.v)&&t.hasNode(n.w)&&t.setEdge(n,s.edge(n))});var i={};function r(n){var h=s.parent(n);return h===void 0||t.hasNode(h)?(i[n]=h,h):h in i?i[h]:r(h)}return this._isCompound&&o(t.nodes(),function(n){t.setParent(n,r(n))}),t}setDefaultEdgeLabel(e){return b(e)||(e=c(e)),this._defaultEdgeLabelFn=e,this}edgeCount(){return this._edgeCount}edges(){return m(this._edgeObjs)}setPath(e,t){var s=this,i=arguments;return O(e,function(r,n){return i.length>1?s.setEdge(r,n,t):s.setEdge(r,n),n}),this}setEdge(){var e,t,s,i,r=!1,n=arguments[0];typeof n=="object"&&n!==null&&"v"in n?(e=n.v,t=n.w,s=n.name,arguments.length===2&&(i=arguments[1],r=!0)):(e=n,t=arguments[1],s=arguments[3],arguments.length>2&&(i=arguments[2],r=!0)),e=""+e,t=""+t,a(s)||(s=""+s);var h=g(this._isDirected,e,t,s);if(Object.prototype.hasOwnProperty.call(this._edgeLabels,h))return r&&(this._edgeLabels[h]=i),this;if(!a(s)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(e),this.setNode(t),this._edgeLabels[h]=r?i:this._defaultEdgeLabelFn(e,t,s);var l=P(this._isDirected,e,t,s);return e=l.v,t=l.w,Object.freeze(l),this._edgeObjs[h]=l,v(this._preds[t],e),v(this._sucs[e],t),this._in[t][h]=l,this._out[e][h]=l,this._edgeCount++,this}edge(e,t,s){var i=arguments.length===1?y(this._isDirected,arguments[0]):g(this._isDirected,e,t,s);return this._edgeLabels[i]}hasEdge(e,t,s){var i=arguments.length===1?y(this._isDirected,arguments[0]):g(this._isDirected,e,t,s);return Object.prototype.hasOwnProperty.call(this._edgeLabels,i)}removeEdge(e,t,s){var i=arguments.length===1?y(this._isDirected,arguments[0]):g(this._isDirected,e,t,s),r=this._edgeObjs[i];return r&&(e=r.v,t=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],L(this._preds[t],e),L(this._sucs[e],t),delete this._in[t][i],delete this._out[e][i],this._edgeCount--),this}inEdges(e,t){var s=this._in[e];if(s){var i=m(s);return t?f(i,function(r){return r.v===t}):i}}outEdges(e,t){var s=this._out[e];if(s){var i=m(s);return t?f(i,function(r){return r.w===t}):i}}nodeEdges(e,t){var s=this.inEdges(e,t);if(s)return s.concat(this.outEdges(e,t))}};p.prototype._nodeCount=0;p.prototype._edgeCount=0;function v(d,e){d[e]?d[e]++:d[e]=1}function L(d,e){--d[e]||delete d[e]}function g(d,e,t,s){var i=""+e,r=""+t;if(!d&&i>r){var n=i;i=r,r=n}return i+N+r+N+(a(s)?j:s)}function P(d,e,t,s){var i=""+e,r=""+t;if(!d&&i>r){var n=i;i=r,r=n}var h={v:i,w:r};return s&&(h.name=s),h}function y(d,e){return g(d,e.v,e.w,e.name)}export{p as a}; diff --git a/src/google/adk/cli/browser/chunk-XULIXUQL.js b/src/google/adk/cli/browser/chunk-XULIXUQL.js deleted file mode 100644 index bc72b77899..0000000000 --- a/src/google/adk/cli/browser/chunk-XULIXUQL.js +++ /dev/null @@ -1 +0,0 @@ -import{a as n,b as s,c as i,d as l,e as f,f as o,g as d,n as m,o as c,q as p}from"./chunk-NALL4A3P.js";var u=class extends p{static{o(this,"TreemapTokenBuilder")}constructor(){super(["treemap"])}},v=/classDef\s+([A-Z_a-z]\w+)(?:\s+([^\n\r;]*))?;?/,g=class extends c{static{o(this,"TreemapValueConverter")}runCustomConverter(r,e,t){if(r.name==="NUMBER2")return parseFloat(e.replace(/,/g,""));if(r.name==="SEPARATOR")return e.substring(1,e.length-1);if(r.name==="STRING2")return e.substring(1,e.length-1);if(r.name==="INDENTATION")return e.length;if(r.name==="ClassDef"){if(typeof e!="string")return e;let a=v.exec(e);if(a)return{$type:"ClassDefStatement",className:a[1],styleText:a[2]||void 0}}}};function T(r){let e=r.validation.TreemapValidator,t=r.validation.ValidationRegistry;if(t){let a={Treemap:e.checkSingleRoot.bind(e)};t.register(a,e)}}o(T,"registerValidationChecks");var h=class{static{o(this,"TreemapValidator")}checkSingleRoot(r,e){let t;for(let a of r.TreemapRows)a.item&&(t===void 0&&a.indent===void 0?t=0:a.indent===void 0?e("error","Multiple root nodes are not allowed in a treemap.",{node:a,property:"item"}):t!==void 0&&t>=parseInt(a.indent,10)&&e("error","Multiple root nodes are not allowed in a treemap.",{node:a,property:"item"}))}},C={parser:{TokenBuilder:o(()=>new u,"TokenBuilder"),ValueConverter:o(()=>new g,"ValueConverter")},validation:{TreemapValidator:o(()=>new h,"TreemapValidator")}};function V(r=l){let e=i(s(r),d),t=i(n({shared:e}),m,C);return e.ServiceRegistry.register(t),T(t),{shared:e,Treemap:t}}o(V,"createTreemapServices");export{C as a,V as b}; diff --git a/src/google/adk/cli/browser/chunk-YVVLWU7S.js b/src/google/adk/cli/browser/chunk-YVVLWU7S.js deleted file mode 100644 index cc35b07e1f..0000000000 --- a/src/google/adk/cli/browser/chunk-YVVLWU7S.js +++ /dev/null @@ -1,321 +0,0 @@ -function Bs(r,e){(e==null||e>r.length)&&(e=r.length);for(var t=0,a=Array(e);t=r.length?{done:!0}:{done:!1,value:r[a++]}},e:function(l){throw l},f:n}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var i,s=!0,o=!1;return{s:function(){t=t.call(r)},n:function(){var l=t.next();return s=l.done,l},e:function(l){o=!0,i=l},f:function(){try{s||t.return==null||t.return()}finally{if(o)throw i}}}}function Jl(r,e,t){return(e=jl(e))in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}function ac(r){if(typeof Symbol<"u"&&r[Symbol.iterator]!=null||r["@@iterator"]!=null)return Array.from(r)}function nc(r,e){var t=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(t!=null){var a,n,i,s,o=[],l=!0,u=!1;try{if(i=(t=t.call(r)).next,e===0){if(Object(t)!==t)return;l=!1}else for(;!(l=(a=i.call(t)).done)&&(o.push(a.value),o.length!==e);l=!0);}catch(v){u=!0,n=v}finally{try{if(!l&&t.return!=null&&(s=t.return(),Object(s)!==s))return}finally{if(u)throw n}}return o}}function ic(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function sc(){throw new TypeError(`Invalid attempt to spread non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Je(r,e){return ec(r)||nc(r,e)||Xs(r,e)||ic()}function mn(r){return rc(r)||ac(r)||Xs(r)||sc()}function oc(r,e){if(typeof r!="object"||!r)return r;var t=r[Symbol.toPrimitive];if(t!==void 0){var a=t.call(r,e);if(typeof a!="object")return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(r)}function jl(r){var e=oc(r,"string");return typeof e=="symbol"?e:e+""}function ar(r){"@babel/helpers - typeof";return ar=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ar(r)}function Xs(r,e){if(r){if(typeof r=="string")return Bs(r,e);var t={}.toString.call(r).slice(8,-1);return t==="Object"&&r.constructor&&(t=r.constructor.name),t==="Map"||t==="Set"?Array.from(r):t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?Bs(r,e):void 0}}var rr=typeof window>"u"?null:window,To=rr?rr.navigator:null;rr&&rr.document;var uc=ar(""),ev=ar({}),lc=ar(function(){}),vc=typeof HTMLElement>"u"?"undefined":ar(HTMLElement),La=function(e){return e&&e.instanceString&&Ue(e.instanceString)?e.instanceString():null},ge=function(e){return e!=null&&ar(e)==uc},Ue=function(e){return e!=null&&ar(e)===lc},_e=function(e){return!Dr(e)&&(Array.isArray?Array.isArray(e):e!=null&&e instanceof Array)},Le=function(e){return e!=null&&ar(e)===ev&&!_e(e)&&e.constructor===Object},fc=function(e){return e!=null&&ar(e)===ev},ae=function(e){return e!=null&&ar(e)===ar(1)&&!isNaN(e)},cc=function(e){return ae(e)&&Math.floor(e)===e},bn=function(e){if(vc!=="undefined")return e!=null&&e instanceof HTMLElement},Dr=function(e){return Ia(e)||rv(e)},Ia=function(e){return La(e)==="collection"&&e._private.single},rv=function(e){return La(e)==="collection"&&!e._private.single},Ys=function(e){return La(e)==="core"},tv=function(e){return La(e)==="stylesheet"},dc=function(e){return La(e)==="event"},ut=function(e){return e==null?!0:!!(e===""||e.match(/^\s+$/))},hc=function(e){return typeof HTMLElement>"u"?!1:e instanceof HTMLElement},gc=function(e){return Le(e)&&ae(e.x1)&&ae(e.x2)&&ae(e.y1)&&ae(e.y2)},pc=function(e){return fc(e)&&Ue(e.then)},yc=function(){return To&&To.userAgent.match(/msie|trident|edge/i)},Qt=function(e,t){t||(t=function(){if(arguments.length===1)return arguments[0];if(arguments.length===0)return"undefined";for(var i=[],s=0;st?1:0},Tc=function(e,t){return-1*nv(e,t)},be=Object.assign!=null?Object.assign.bind(Object):function(r){for(var e=arguments,t=1;t1&&(g-=1),g<1/6?d+(y-d)*6*g:g<1/2?y:g<2/3?d+(y-d)*(2/3-g)*6:d}var f=new RegExp("^"+wc+"$").exec(e);if(f){if(a=parseInt(f[1]),a<0?a=(360- -1*a%360)%360:a>360&&(a=a%360),a/=360,n=parseFloat(f[2]),n<0||n>100||(n=n/100,i=parseFloat(f[3]),i<0||i>100)||(i=i/100,s=f[4],s!==void 0&&(s=parseFloat(s),s<0||s>1)))return;if(n===0)o=l=u=Math.round(i*255);else{var c=i<.5?i*(1+n):i+n-i*n,h=2*i-c;o=Math.round(255*v(h,c,a+1/3)),l=Math.round(255*v(h,c,a)),u=Math.round(255*v(h,c,a-1/3))}t=[o,l,u,s]}return t},Dc=function(e){var t,a=new RegExp("^"+mc+"$").exec(e);if(a){t=[];for(var n=[],i=1;i<=3;i++){var s=a[i];if(s[s.length-1]==="%"&&(n[i]=!0),s=parseFloat(s),n[i]&&(s=s/100*255),s<0||s>255)return;t.push(Math.floor(s))}var o=n[1]||n[2]||n[3],l=n[1]&&n[2]&&n[3];if(o&&!l)return;var u=a[4];if(u!==void 0){if(u=parseFloat(u),u<0||u>1)return;t.push(u)}}return t},Bc=function(e){return Pc[e.toLowerCase()]},iv=function(e){return(_e(e)?e:null)||Bc(e)||Sc(e)||Dc(e)||kc(e)},Pc={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},sv=function(e){for(var t=e.map,a=e.keys,n=a.length,i=0;i=l||R<0||m&&L>=c}function T(){var A=e();if(x(A))return k(A);d=setTimeout(T,C(A))}function k(A){return d=void 0,b&&v?w(A):(v=f=void 0,h)}function D(){d!==void 0&&clearTimeout(d),g=0,v=y=f=d=void 0}function B(){return d===void 0?h:k(e())}function P(){var A=e(),R=x(A);if(v=arguments,f=this,y=A,R){if(d===void 0)return E(y);if(m)return clearTimeout(d),d=setTimeout(T,l),w(y)}return d===void 0&&(d=setTimeout(T,l)),h}return P.cancel=D,P.flush=B,P}return fi=s,fi}var Vc=Fc(),Fa=Oa(Vc),ci=rr?rr.performance:null,lv=ci&&ci.now?function(){return ci.now()}:function(){return Date.now()},qc=(function(){if(rr){if(rr.requestAnimationFrame)return function(r){rr.requestAnimationFrame(r)};if(rr.mozRequestAnimationFrame)return function(r){rr.mozRequestAnimationFrame(r)};if(rr.webkitRequestAnimationFrame)return function(r){rr.webkitRequestAnimationFrame(r)};if(rr.msRequestAnimationFrame)return function(r){rr.msRequestAnimationFrame(r)}}return function(r){r&&setTimeout(function(){r(lv())},1e3/60)}})(),wn=function(e){return qc(e)},Yr=lv,St=9261,vv=65599,Ht=5381,fv=function(e){for(var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:St,a=t,n;n=e.next(),!n.done;)a=a*vv+n.value|0;return a},Ca=function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:St;return t*vv+e|0},Ta=function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Ht;return(t<<5)+t+e|0},_c=function(e,t){return e*2097152+t},et=function(e){return e[0]*2097152+e[1]},Xa=function(e,t){return[Ca(e[0],t[0]),Ta(e[1],t[1])]},qo=function(e,t){var a={value:0,done:!1},n=0,i=e.length,s={next:function(){return n=0;n--)e[n]===t&&e.splice(n,1)},eo=function(e){e.splice(0,e.length)},Qc=function(e,t){for(var a=0;a"u"?"undefined":ar(Set))!==jc?Set:ed,In=function(e,t){var a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(e===void 0||t===void 0||!Ys(e)){$e("An element must have a core reference and parameters set");return}var n=t.group;if(n==null&&(t.data&&t.data.source!=null&&t.data.target!=null?n="edges":n="nodes"),n!=="nodes"&&n!=="edges"){$e("An element must be of type `nodes` or `edges`; you specified `"+n+"`");return}this.length=1,this[0]=this;var i=this._private={cy:e,single:!0,data:t.data||{},position:t.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:n,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!t.selected,selectable:t.selectable===void 0?!0:!!t.selectable,locked:!!t.locked,grabbed:!1,grabbable:t.grabbable===void 0?!0:!!t.grabbable,pannable:t.pannable===void 0?n==="edges":!!t.pannable,active:!1,classes:new ra,animation:{current:[],queue:[]},rscratch:{},scratch:t.scratch||{},edges:[],children:[],parent:t.parent&&t.parent.isNode()?t.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(i.position.x==null&&(i.position.x=0),i.position.y==null&&(i.position.y=0),t.renderedPosition){var s=t.renderedPosition,o=e.pan(),l=e.zoom();i.position={x:(s.x-o.x)/l,y:(s.y-o.y)/l}}var u=[];_e(t.classes)?u=t.classes:ge(t.classes)&&(u=t.classes.split(/\s+/));for(var v=0,f=u.length;vm?1:0},v=function(p,m,b,w,E){var C;if(b==null&&(b=0),E==null&&(E=a),b<0)throw new Error("lo must be non-negative");for(w==null&&(w=p.length);bD;0<=D?k++:k--)T.push(k);return T}.apply(this).reverse(),x=[],w=0,E=C.length;wB;0<=B?++T:--T)P.push(s(p,b));return P},y=function(p,m,b,w){var E,C,x;for(w==null&&(w=a),E=p[b];b>m;){if(x=b-1>>1,C=p[x],w(E,C)<0){p[b]=C,b=x;continue}break}return p[b]=E},g=function(p,m,b){var w,E,C,x,T;for(b==null&&(b=a),E=p.length,T=m,C=p[m],w=2*m+1;w0;){var C=m.pop(),x=g(C),T=C.id();if(c[T]=x,x!==1/0)for(var k=C.neighborhood().intersect(d),D=0;D0)for(O.unshift(M);f[G];){var N=f[G];O.unshift(N.edge),O.unshift(N.node),V=N.node,G=V.id()}return o.spawn(O)}}}},od={kruskal:function(e){e=e||function(b){return 1};for(var t=this.byGroup(),a=t.nodes,n=t.edges,i=a.length,s=new Array(i),o=a,l=function(w){for(var E=0;E0;){if(E(),x++,w===v){for(var T=[],k=i,D=v,B=p[D];T.unshift(k),B!=null&&T.unshift(B),k=g[D],k!=null;)D=k.id(),B=p[D];return{found:!0,distance:f[w],path:this.spawn(T),steps:x}}h[w]=!0;for(var P=b._private.edges,A=0;AB&&(d[D]=B,m[D]=k,b[D]=E),!i){var P=k*v+T;!i&&d[P]>B&&(d[P]=B,m[P]=T,b[P]=E)}}}for(var A=0;A1&&arguments[1]!==void 0?arguments[1]:s,ie=b(we),de=[],he=ie;;){if(he==null)return t.spawn();var Ee=m(he),pe=Ee.edge,Se=Ee.pred;if(de.unshift(he[0]),he.same(ye)&&de.length>0)break;pe!=null&&de.unshift(pe),he=Se}return l.spawn(de)},C=0;C=0;v--){var f=u[v],c=f[1],h=f[2];(t[c]===o&&t[h]===l||t[c]===l&&t[h]===o)&&u.splice(v,1)}for(var d=0;dn;){var i=Math.floor(Math.random()*t.length);t=gd(i,e,t),a--}return t},pd={kargerStein:function(){var e=this,t=this.byGroup(),a=t.nodes,n=t.edges;n.unmergeBy(function(O){return O.isLoop()});var i=a.length,s=n.length,o=Math.ceil(Math.pow(Math.log(i)/Math.LN2,2)),l=Math.floor(i/hd);if(i<2){$e("At least 2 nodes are required for Karger-Stein algorithm");return}for(var u=[],v=0;v1&&arguments[1]!==void 0?arguments[1]:0,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,n=1/0,i=t;i1&&arguments[1]!==void 0?arguments[1]:0,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,n=-1/0,i=t;i1&&arguments[1]!==void 0?arguments[1]:0,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,n=0,i=0,s=t;s1&&arguments[1]!==void 0?arguments[1]:0,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0;n?e=e.slice(t,a):(a0&&e.splice(0,t));for(var o=0,l=e.length-1;l>=0;l--){var u=e[l];s?isFinite(u)||(e[l]=-1/0,o++):e.splice(l,1)}i&&e.sort(function(c,h){return c-h});var v=e.length,f=Math.floor(v/2);return v%2!==0?e[f+1+o]:(e[f-1+o]+e[f+o])/2},Ed=function(e){return Math.PI*e/180},Ya=function(e,t){return Math.atan2(t,e)-Math.PI/2},ro=Math.log2||function(r){return Math.log(r)/Math.log(2)},to=function(e){return e>0?1:e<0?-1:0},Pt=function(e,t){return Math.sqrt(Ct(e,t))},Ct=function(e,t){var a=t.x-e.x,n=t.y-e.y;return a*a+n*n},Cd=function(e){for(var t=e.length,a=0,n=0;n=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(e.w!=null&&e.h!=null&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},Sd=function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}},kd=function(e){e.x1=1/0,e.y1=1/0,e.x2=-1/0,e.y2=-1/0,e.w=0,e.h=0},Dd=function(e,t){e.x1=Math.min(e.x1,t.x1),e.x2=Math.max(e.x2,t.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,t.y1),e.y2=Math.max(e.y2,t.y2),e.h=e.y2-e.y1},mv=function(e,t,a){e.x1=Math.min(e.x1,t),e.x2=Math.max(e.x2,t),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,a),e.y2=Math.max(e.y2,a),e.h=e.y2-e.y1},un=function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return e.x1-=t,e.x2+=t,e.y1-=t,e.y2+=t,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},ln=function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[0],a,n,i,s;if(t.length===1)a=n=i=s=t[0];else if(t.length===2)a=i=t[0],s=n=t[1];else if(t.length===4){var o=Je(t,4);a=o[0],n=o[1],i=o[2],s=o[3]}return e.x1-=s,e.x2+=n,e.y1-=a,e.y2+=i,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},Uo=function(e,t){e.x1=t.x1,e.y1=t.y1,e.x2=t.x2,e.y2=t.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},ao=function(e,t){return!(e.x1>t.x2||t.x1>e.x2||e.x2t.y2||t.y1>e.y2)},nt=function(e,t,a){return e.x1<=t&&t<=e.x2&&e.y1<=a&&a<=e.y2},Ko=function(e,t){return nt(e,t.x,t.y)},bv=function(e,t){return nt(e,t.x1,t.y1)&&nt(e,t.x2,t.y2)},Bd=(gi=Math.hypot)!==null&&gi!==void 0?gi:function(r,e){return Math.sqrt(r*r+e*e)};function Pd(r,e){if(r.length<3)throw new Error("Need at least 3 vertices");var t=function(T,k){return{x:T.x+k.x,y:T.y+k.y}},a=function(T,k){return{x:T.x-k.x,y:T.y-k.y}},n=function(T,k){return{x:T.x*k,y:T.y*k}},i=function(T,k){return T.x*k.y-T.y*k.x},s=function(T){var k=Bd(T.x,T.y);return k===0?{x:0,y:0}:{x:T.x/k,y:T.y/k}},o=function(T){for(var k=0,D=0;D7&&arguments[7]!==void 0?arguments[7]:"auto",u=l==="auto"?vt(i,s):l,v=i/2,f=s/2;u=Math.min(u,v,f);var c=u!==v,h=u!==f,d;if(c){var y=a-v+u-o,g=n-f-o,p=a+v-u+o,m=g;if(d=it(e,t,a,n,y,g,p,m,!1),d.length>0)return d}if(h){var b=a+v+o,w=n-f+u-o,E=b,C=n+f-u+o;if(d=it(e,t,a,n,b,w,E,C,!1),d.length>0)return d}if(c){var x=a-v+u-o,T=n+f+o,k=a+v-u+o,D=T;if(d=it(e,t,a,n,x,T,k,D,!1),d.length>0)return d}if(h){var B=a-v-o,P=n-f+u-o,A=B,R=n+f-u+o;if(d=it(e,t,a,n,B,P,A,R,!1),d.length>0)return d}var L;{var I=a-v+u,M=n-f+u;if(L=ya(e,t,a,n,I,M,u+o),L.length>0&&L[0]<=I&&L[1]<=M)return[L[0],L[1]]}{var O=a+v-u,V=n-f+u;if(L=ya(e,t,a,n,O,V,u+o),L.length>0&&L[0]>=O&&L[1]<=V)return[L[0],L[1]]}{var G=a+v-u,N=n+f-u;if(L=ya(e,t,a,n,G,N,u+o),L.length>0&&L[0]>=G&&L[1]>=N)return[L[0],L[1]]}{var F=a-v+u,U=n+f-u;if(L=ya(e,t,a,n,F,U,u+o),L.length>0&&L[0]<=F&&L[1]>=U)return[L[0],L[1]]}return[]},Rd=function(e,t,a,n,i,s,o){var l=o,u=Math.min(a,i),v=Math.max(a,i),f=Math.min(n,s),c=Math.max(n,s);return u-l<=e&&e<=v+l&&f-l<=t&&t<=c+l},Md=function(e,t,a,n,i,s,o,l,u){var v={x1:Math.min(a,o,i)-u,x2:Math.max(a,o,i)+u,y1:Math.min(n,l,s)-u,y2:Math.max(n,l,s)+u};return!(ev.x2||tv.y2)},Ld=function(e,t,a,n){a-=n;var i=t*t-4*e*a;if(i<0)return[];var s=Math.sqrt(i),o=2*e,l=(-t+s)/o,u=(-t-s)/o;return[l,u]},Id=function(e,t,a,n,i){var s=1e-5;e===0&&(e=s),t/=e,a/=e,n/=e;var o,l,u,v,f,c,h,d;if(l=(3*a-t*t)/9,u=-(27*n)+t*(9*a-2*(t*t)),u/=54,o=l*l*l+u*u,i[1]=0,h=t/3,o>0){f=u+Math.sqrt(o),f=f<0?-Math.pow(-f,1/3):Math.pow(f,1/3),c=u-Math.sqrt(o),c=c<0?-Math.pow(-c,1/3):Math.pow(c,1/3),i[0]=-h+f+c,h+=(f+c)/2,i[4]=i[2]=-h,h=Math.sqrt(3)*(-c+f)/2,i[3]=h,i[5]=-h;return}if(i[5]=i[3]=0,o===0){d=u<0?-Math.pow(-u,1/3):Math.pow(u,1/3),i[0]=-h+2*d,i[4]=i[2]=-(d+h);return}l=-l,v=l*l*l,v=Math.acos(u/Math.sqrt(v)),d=2*Math.sqrt(l),i[0]=-h+d*Math.cos(v/3),i[2]=-h+d*Math.cos((v+2*Math.PI)/3),i[4]=-h+d*Math.cos((v+4*Math.PI)/3)},Od=function(e,t,a,n,i,s,o,l){var u=1*a*a-4*a*i+2*a*o+4*i*i-4*i*o+o*o+n*n-4*n*s+2*n*l+4*s*s-4*s*l+l*l,v=9*a*i-3*a*a-3*a*o-6*i*i+3*i*o+9*n*s-3*n*n-3*n*l-6*s*s+3*s*l,f=3*a*a-6*a*i+a*o-a*e+2*i*i+2*i*e-o*e+3*n*n-6*n*s+n*l-n*t+2*s*s+2*s*t-l*t,c=1*a*i-a*a+a*e-i*e+n*s-n*n+n*t-s*t,h=[];Id(u,v,f,c,h);for(var d=1e-7,y=[],g=0;g<6;g+=2)Math.abs(h[g+1])=0&&h[g]<=1&&y.push(h[g]);y.push(1),y.push(0);for(var p=-1,m,b,w,E=0;E=0?wu?(e-i)*(e-i)+(t-s)*(t-s):v-c},Sr=function(e,t,a){for(var n,i,s,o,l,u=0,v=0;v=e&&e>=s||n<=e&&e<=s)l=(e-n)/(s-n)*(o-i)+i,l>t&&u++;else continue;return u%2!==0},Zr=function(e,t,a,n,i,s,o,l,u){var v=new Array(a.length),f;l[0]!=null?(f=Math.atan(l[1]/l[0]),l[0]<0?f=f+Math.PI/2:f=-f-Math.PI/2):f=l;for(var c=Math.cos(-f),h=Math.sin(-f),d=0;d0){var g=Cn(v,-u);y=En(g)}else y=v;return Sr(e,t,y)},zd=function(e,t,a,n,i,s,o,l){for(var u=new Array(a.length*2),v=0;v=0&&g<=1&&m.push(g),p>=0&&p<=1&&m.push(p),m.length===0)return[];var b=m[0]*l[0]+e,w=m[0]*l[1]+t;if(m.length>1){if(m[0]==m[1])return[b,w];var E=m[1]*l[0]+e,C=m[1]*l[1]+t;return[b,w,E,C]}else return[b,w]},pi=function(e,t,a){return t<=e&&e<=a||a<=e&&e<=t?e:e<=t&&t<=a||a<=t&&t<=e?t:a},it=function(e,t,a,n,i,s,o,l,u){var v=e-i,f=a-e,c=o-i,h=t-s,d=n-t,y=l-s,g=c*h-y*v,p=f*h-d*v,m=y*f-c*d;if(m!==0){var b=g/m,w=p/m,E=.001,C=0-E,x=1+E;return C<=b&&b<=x&&C<=w&&w<=x?[e+b*f,t+b*d]:u?[e+b*f,t+b*d]:[]}else return g===0||p===0?pi(e,a,o)===o?[o,l]:pi(e,a,i)===i?[i,s]:pi(i,o,a)===a?[a,n]:[]:[]},Vd=function(e,t,a,n,i){var s=[],o=n/2,l=i/2,u=t,v=a;s.push({x:u+o*e[0],y:v+l*e[1]});for(var f=1;f0){var y=Cn(f,-l);h=En(y)}else h=f}else h=a;for(var g,p,m,b,w=0;w2){for(var d=[v[0],v[1]],y=Math.pow(d[0]-e,2)+Math.pow(d[1]-t,2),g=1;gv&&(v=w)},get:function(b){return u[b]}},c=0;c0?L=R.edgesTo(A)[0]:L=A.edgesTo(R)[0];var I=n(L);A=A.id(),x[A]>x[B]+I&&(x[A]=x[B]+I,T.nodes.indexOf(A)<0?T.push(A):T.updateItem(A),C[A]=0,E[A]=[]),x[A]==x[B]+I&&(C[A]=C[A]+C[B],E[A].push(B))}else for(var M=0;M0;){for(var N=w.pop(),F=0;F0&&o.push(a[l]);o.length!==0&&i.push(n.collection(o))}return i},eh=function(e,t){for(var a=0;a5&&arguments[5]!==void 0?arguments[5]:ah,o=n,l,u,v=0;v=2?va(e,t,a,0,Jo,nh):va(e,t,a,0,Qo)},squaredEuclidean:function(e,t,a){return va(e,t,a,0,Jo)},manhattan:function(e,t,a){return va(e,t,a,0,Qo)},max:function(e,t,a){return va(e,t,a,-1/0,ih)}};Jt["squared-euclidean"]=Jt.squaredEuclidean;Jt.squaredeuclidean=Jt.squaredEuclidean;function Nn(r,e,t,a,n,i){var s;return Ue(r)?s=r:s=Jt[r]||Jt.euclidean,e===0&&Ue(r)?s(n,i):s(e,t,a,n,i)}var sh=cr({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),io=function(e){return sh(e)},Tn=function(e,t,a,n,i){var s=i!=="kMedoids",o=s?function(f){return a[f]}:function(f){return n[f](a)},l=function(c){return n[c](t)},u=a,v=t;return Nn(e,n.length,o,l,u,v)},mi=function(e,t,a){for(var n=a.length,i=new Array(n),s=new Array(n),o=new Array(t),l=null,u=0;ua)return!1}return!0},lh=function(e,t,a){for(var n=0;no&&(o=t[u][v],l=v);i[l].push(e[u])}for(var f=0;f=i.threshold||i.mode==="dendrogram"&&e.length===1)return!1;var d=t[s],y=t[n[s]],g;i.mode==="dendrogram"?g={left:d,right:y,key:d.key}:g={value:d.value.concat(y.value),key:d.key},e[d.index]=g,e.splice(y.index,1),t[d.key]=g;for(var p=0;pa[y.key][m.key]&&(l=a[y.key][m.key])):i.linkage==="max"?(l=a[d.key][m.key],a[d.key][m.key]0&&n.push(i);return n},nu=function(e,t,a){for(var n=[],i=0;io&&(s=u,o=t[i*e+u])}s>0&&n.push(s)}for(var v=0;vu&&(l=v,u=f)}a[i]=s[l]}return n=nu(e,t,a),n},iu=function(e){for(var t=this.cy(),a=this.nodes(),n=xh(e),i={},s=0;s=B?(P=B,B=R,A=L):R>P&&(P=R);for(var I=0;I0?1:0;x[k%n.minIterations*o+F]=U,N+=U}if(N>0&&(k>=n.minIterations-1||k==n.maxIterations-1)){for(var Q=0,K=0;K1||C>1)&&(o=!0),f[b]=[],m.outgoers().forEach(function(T){T.isEdge()&&f[b].push(T.id())})}else c[b]=[void 0,m.target().id()]}):s.forEach(function(m){var b=m.id();if(m.isNode()){var w=m.degree(!0);w%2&&(l?u?o=!0:u=b:l=b),f[b]=[],m.connectedEdges().forEach(function(E){return f[b].push(E.id())})}else c[b]=[m.source().id(),m.target().id()]});var h={found:!1,trail:void 0};if(o)return h;if(u&&l)if(i){if(v&&u!=v)return h;v=u}else{if(v&&u!=v&&l!=v)return h;v||(v=u)}else v||(v=s[0].id());var d=function(b){for(var w=b,E=[b],C,x,T;f[w].length;)C=f[w].shift(),x=c[C][0],T=c[C][1],w!=T?(f[T]=f[T].filter(function(k){return k!=C}),w=T):!i&&w!=x&&(f[x]=f[x].filter(function(k){return k!=C}),w=x),E.unshift(C),E.unshift(w);return E},y=[],g=[];for(g=d(v);g.length!=1;)f[g[0]].length==0?(y.unshift(s.getElementById(g.shift())),y.unshift(s.getElementById(g.shift()))):g=d(g.shift()).concat(g);y.unshift(s.getElementById(g.shift()));for(var p in f)if(f[p].length)return h;return h.found=!0,h.trail=this.spawn(y,!0),h}},Qa=function(){var e=this,t={},a=0,n=0,i=[],s=[],o={},l=function(c,h){for(var d=s.length-1,y=[],g=e.spawn();s[d].x!=c||s[d].y!=h;)y.push(s.pop().edge),d--;y.push(s.pop().edge),y.forEach(function(p){var m=p.connectedNodes().intersection(e);g.merge(p),m.forEach(function(b){var w=b.id(),E=b.connectedEdges().intersection(e);g.merge(b),t[w].cutVertex?g.merge(E.filter(function(C){return C.isLoop()})):g.merge(E)})}),i.push(g)},u=function(c,h,d){c===d&&(n+=1),t[h]={id:a,low:a++,cutVertex:!1};var y=e.getElementById(h).connectedEdges().intersection(e);if(y.size()===0)i.push(e.spawn(e.getElementById(h)));else{var g,p,m,b;y.forEach(function(w){g=w.source().id(),p=w.target().id(),m=g===h?p:g,m!==d&&(b=w.id(),o[b]||(o[b]=!0,s.push({x:h,y:m,edge:w})),m in t?t[h].low=Math.min(t[h].low,t[m].id):(u(c,m,h),t[h].low=Math.min(t[h].low,t[m].low),t[h].id<=t[m].low&&(t[h].cutVertex=!0,l(h,m))))})}};e.forEach(function(f){if(f.isNode()){var c=f.id();c in t||(n=0,u(c,c),t[c].cutVertex=n>1)}});var v=Object.keys(t).filter(function(f){return t[f].cutVertex}).map(function(f){return e.getElementById(f)});return{cut:e.spawn(v),components:i}},Ph={hopcroftTarjanBiconnected:Qa,htbc:Qa,htb:Qa,hopcroftTarjanBiconnectedComponents:Qa},Ja=function(){var e=this,t={},a=0,n=[],i=[],s=e.spawn(e),o=function(u){i.push(u),t[u]={index:a,low:a++,explored:!1};var v=e.getElementById(u).connectedEdges().intersection(e);if(v.forEach(function(y){var g=y.target().id();g!==u&&(g in t||o(g),t[g].explored||(t[u].low=Math.min(t[u].low,t[g].low)))}),t[u].index===t[u].low){for(var f=e.spawn();;){var c=i.pop();if(f.merge(e.getElementById(c)),t[c].low=t[u].index,t[c].explored=!0,c===u)break}var h=f.edgesWith(f),d=f.merge(h);n.push(d),s=s.difference(d)}};return e.forEach(function(l){if(l.isNode()){var u=l.id();u in t||o(u)}}),{cut:s,components:n}},Ah={tarjanStronglyConnected:Ja,tsc:Ja,tscc:Ja,tarjanStronglyConnectedComponents:Ja},Dv={};[Sa,sd,od,ld,fd,dd,pd,Hd,Xt,Yt,Rs,th,gh,bh,kh,Bh,Ph,Ah].forEach(function(r){be(Dv,r)});var Bv=0,Pv=1,Av=2,Nr=function(e){if(!(this instanceof Nr))return new Nr(e);this.id="Thenable/1.0.7",this.state=Bv,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},typeof e=="function"&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))};Nr.prototype={fulfill:function(e){return su(this,Pv,"fulfillValue",e)},reject:function(e){return su(this,Av,"rejectReason",e)},then:function(e,t){var a=this,n=new Nr;return a.onFulfilled.push(uu(e,n,"fulfill")),a.onRejected.push(uu(t,n,"reject")),Rv(a),n.proxy}};var su=function(e,t,a,n){return e.state===Bv&&(e.state=t,e[a]=n,Rv(e)),e},Rv=function(e){e.state===Pv?ou(e,"onFulfilled",e.fulfillValue):e.state===Av&&ou(e,"onRejected",e.rejectReason)},ou=function(e,t,a){if(e[t].length!==0){var n=e[t];e[t]=[];var i=function(){for(var o=0;o0}},clearQueue:function(){return function(){var t=this,a=t.length!==void 0,n=a?t:[t],i=this._private.cy||this;if(!i.styleEnabled())return this;for(var s=0;s-1}return qi=e,qi}var _i,Ru;function Yh(){if(Ru)return _i;Ru=1;var r=Vn();function e(t,a){var n=this.__data__,i=r(n,t);return i<0?(++this.size,n.push([t,a])):n[i][1]=a,this}return _i=e,_i}var Gi,Mu;function Zh(){if(Mu)return Gi;Mu=1;var r=$h(),e=Uh(),t=Kh(),a=Xh(),n=Yh();function i(s){var o=-1,l=s==null?0:s.length;for(this.clear();++o-1&&a%1==0&&a0&&this.spawn(n).updateStyle().emit("class"),t},addClass:function(e){return this.toggleClass(e,!0)},hasClass:function(e){var t=this[0];return t!=null&&t._private.classes.has(e)},toggleClass:function(e,t){_e(e)||(e=e.match(/\S+/g)||[]);for(var a=this,n=t===void 0,i=[],s=0,o=a.length;s0&&this.spawn(i).updateStyle().emit("class"),a},removeClass:function(e){return this.toggleClass(e,!1)},flashClass:function(e,t){var a=this;if(t==null)t=250;else if(t===0)return a;return a.addClass(e),setTimeout(function(){a.removeClass(e)},t),a}};vn.className=vn.classNames=vn.classes;var Me={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:`"(?:\\\\"|[^"])*"|'(?:\\\\'|[^'])*'`,number:tr,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};Me.variable="(?:[\\w-.]|(?:\\\\"+Me.metaChar+"))+";Me.className="(?:[\\w-]|(?:\\\\"+Me.metaChar+"))+";Me.value=Me.string+"|"+Me.number;Me.id=Me.variable;(function(){var r,e,t;for(r=Me.comparatorOp.split("|"),t=0;t=0)&&e!=="="&&(Me.comparatorOp+="|\\!"+e)})();var qe=function(){return{checks:[]}},se={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},Os=[{selector:":selected",matches:function(e){return e.selected()}},{selector:":unselected",matches:function(e){return!e.selected()}},{selector:":selectable",matches:function(e){return e.selectable()}},{selector:":unselectable",matches:function(e){return!e.selectable()}},{selector:":locked",matches:function(e){return e.locked()}},{selector:":unlocked",matches:function(e){return!e.locked()}},{selector:":visible",matches:function(e){return e.visible()}},{selector:":hidden",matches:function(e){return!e.visible()}},{selector:":transparent",matches:function(e){return e.transparent()}},{selector:":grabbed",matches:function(e){return e.grabbed()}},{selector:":free",matches:function(e){return!e.grabbed()}},{selector:":removed",matches:function(e){return e.removed()}},{selector:":inside",matches:function(e){return!e.removed()}},{selector:":grabbable",matches:function(e){return e.grabbable()}},{selector:":ungrabbable",matches:function(e){return!e.grabbable()}},{selector:":animated",matches:function(e){return e.animated()}},{selector:":unanimated",matches:function(e){return!e.animated()}},{selector:":parent",matches:function(e){return e.isParent()}},{selector:":childless",matches:function(e){return e.isChildless()}},{selector:":child",matches:function(e){return e.isChild()}},{selector:":orphan",matches:function(e){return e.isOrphan()}},{selector:":nonorphan",matches:function(e){return e.isChild()}},{selector:":compound",matches:function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()}},{selector:":loop",matches:function(e){return e.isLoop()}},{selector:":simple",matches:function(e){return e.isSimple()}},{selector:":active",matches:function(e){return e.active()}},{selector:":inactive",matches:function(e){return!e.active()}},{selector:":backgrounding",matches:function(e){return e.backgrounding()}},{selector:":nonbackgrounding",matches:function(e){return!e.backgrounding()}}].sort(function(r,e){return Tc(r.selector,e.selector)}),Dg=(function(){for(var r={},e,t=0;t0&&v.edgeCount>0)return Ve("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(v.edgeCount>1)return Ve("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;v.edgeCount===1&&Ve("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},Lg=function(){if(this.toStringCache!=null)return this.toStringCache;for(var e=function(v){return v??""},t=function(v){return ge(v)?'"'+v+'"':e(v)},a=function(v){return" "+v+" "},n=function(v,f){var c=v.type,h=v.value;switch(c){case se.GROUP:{var d=e(h);return d.substring(0,d.length-1)}case se.DATA_COMPARE:{var y=v.field,g=v.operator;return"["+y+a(e(g))+t(h)+"]"}case se.DATA_BOOL:{var p=v.operator,m=v.field;return"["+e(p)+m+"]"}case se.DATA_EXIST:{var b=v.field;return"["+b+"]"}case se.META_COMPARE:{var w=v.operator,E=v.field;return"[["+E+a(e(w))+t(h)+"]]"}case se.STATE:return h;case se.ID:return"#"+h;case se.CLASS:return"."+h;case se.PARENT:case se.CHILD:return i(v.parent,f)+a(">")+i(v.child,f);case se.ANCESTOR:case se.DESCENDANT:return i(v.ancestor,f)+" "+i(v.descendant,f);case se.COMPOUND_SPLIT:{var C=i(v.left,f),x=i(v.subject,f),T=i(v.right,f);return C+(C.length>0?" ":"")+x+T}case se.TRUE:return""}},i=function(v,f){return v.checks.reduce(function(c,h,d){return c+(f===v&&d===0?"$":"")+n(h,f)},"")},s="",o=0;o1&&o=0&&(t=t.replace("!",""),f=!0),t.indexOf("@")>=0&&(t=t.replace("@",""),v=!0),(i||o||v)&&(l=!i&&!s?"":""+e,u=""+a),v&&(e=l=l.toLowerCase(),a=u=u.toLowerCase()),t){case"*=":n=l.indexOf(u)>=0;break;case"$=":n=l.indexOf(u,l.length-u.length)>=0;break;case"^=":n=l.indexOf(u)===0;break;case"=":n=e===a;break;case">":c=!0,n=e>a;break;case">=":c=!0,n=e>=a;break;case"<":c=!0,n=e0;){var v=n.shift();e(v),i.add(v.id()),o&&a(n,i,v)}return r}function Vv(r,e,t){if(t.isParent())for(var a=t._private.children,n=0;n1&&arguments[1]!==void 0?arguments[1]:!0;return lo(this,r,e,Vv)};function qv(r,e,t){if(t.isChild()){var a=t._private.parent;e.has(a.id())||r.push(a)}}jt.forEachUp=function(r){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return lo(this,r,e,qv)};function _g(r,e,t){qv(r,e,t),Vv(r,e,t)}jt.forEachUpAndDown=function(r){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return lo(this,r,e,_g)};jt.ancestors=jt.parents;var Ba,_v;Ba=_v={data:Fe.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:Fe.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:Fe.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:Fe.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:Fe.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:Fe.removeData({field:"rscratch",triggerEvent:!1}),id:function(){var e=this[0];if(e)return e._private.data.id}};Ba.attr=Ba.data;Ba.removeAttr=Ba.removeData;var Gg=_v,_n={};function ps(r){return function(e){var t=this;if(e===void 0&&(e=!0),t.length!==0)if(t.isNode()&&!t.removed()){for(var a=0,n=t[0],i=n._private.edges,s=0;se}),minIndegree:zt("indegree",function(r,e){return re}),minOutdegree:zt("outdegree",function(r,e){return re})});be(_n,{totalDegree:function(e){for(var t=0,a=this.nodes(),n=0;n0,c=f;f&&(v=v[0]);var h=c?v.position():{x:0,y:0};t!==void 0?u.position(e,t+h[e]):i!==void 0&&u.position({x:i.x+h.x,y:i.y+h.y})}else{var d=a.position(),y=o?a.parent():null,g=y&&y.length>0,p=g;g&&(y=y[0]);var m=p?y.position():{x:0,y:0};return i={x:d.x-m.x,y:d.y-m.y},e===void 0?i:i[e]}else if(!s)return;return this}};Or.modelPosition=Or.point=Or.position;Or.modelPositions=Or.points=Or.positions;Or.renderedPoint=Or.renderedPosition;Or.relativePoint=Or.relativePosition;var Hg=Gv,Zt,pt;Zt=pt={};pt.renderedBoundingBox=function(r){var e=this.boundingBox(r),t=this.cy(),a=t.zoom(),n=t.pan(),i=e.x1*a+n.x,s=e.x2*a+n.x,o=e.y1*a+n.y,l=e.y2*a+n.y;return{x1:i,x2:s,y1:o,y2:l,w:s-i,h:l-o}};pt.dirtyCompoundBoundsCache=function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();return!e.styleEnabled()||!e.hasCompoundNodes()?this:(this.forEachUp(function(t){if(t.isParent()){var a=t._private;a.compoundBoundsClean=!1,a.bbCache=null,r||t.emitAndNotify("bounds")}}),this)};pt.updateCompoundBounds=function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();if(!e.styleEnabled()||!e.hasCompoundNodes())return this;if(!r&&e.batching())return this;function t(s){if(!s.isParent())return;var o=s._private,l=s.children(),u=s.pstyle("compound-sizing-wrt-labels").value==="include",v={width:{val:s.pstyle("min-width").pfValue,left:s.pstyle("min-width-bias-left"),right:s.pstyle("min-width-bias-right")},height:{val:s.pstyle("min-height").pfValue,top:s.pstyle("min-height-bias-top"),bottom:s.pstyle("min-height-bias-bottom")}},f=l.boundingBox({includeLabels:u,includeOverlays:!1,useCache:!1}),c=o.position;(f.w===0||f.h===0)&&(f={w:s.pstyle("width").pfValue,h:s.pstyle("height").pfValue},f.x1=c.x-f.w/2,f.x2=c.x+f.w/2,f.y1=c.y-f.h/2,f.y2=c.y+f.h/2);function h(k,D,B){var P=0,A=0,R=D+B;return k>0&&R>0&&(P=D/R*k,A=B/R*k),{biasDiff:P,biasComplementDiff:A}}function d(k,D,B,P){if(B.units==="%")switch(P){case"width":return k>0?B.pfValue*k:0;case"height":return D>0?B.pfValue*D:0;case"average":return k>0&&D>0?B.pfValue*(k+D)/2:0;case"min":return k>0&&D>0?k>D?B.pfValue*D:B.pfValue*k:0;case"max":return k>0&&D>0?k>D?B.pfValue*k:B.pfValue*D:0;default:return 0}else return B.units==="px"?B.pfValue:0}var y=v.width.left.value;v.width.left.units==="px"&&v.width.val>0&&(y=y*100/v.width.val);var g=v.width.right.value;v.width.right.units==="px"&&v.width.val>0&&(g=g*100/v.width.val);var p=v.height.top.value;v.height.top.units==="px"&&v.height.val>0&&(p=p*100/v.height.val);var m=v.height.bottom.value;v.height.bottom.units==="px"&&v.height.val>0&&(m=m*100/v.height.val);var b=h(v.width.val-f.w,y,g),w=b.biasDiff,E=b.biasComplementDiff,C=h(v.height.val-f.h,p,m),x=C.biasDiff,T=C.biasComplementDiff;o.autoPadding=d(f.w,f.h,s.pstyle("padding"),s.pstyle("padding-relative-to").value),o.autoWidth=Math.max(f.w,v.width.val),c.x=(-w+f.x1+f.x2+E)/2,o.autoHeight=Math.max(f.h,v.height.val),c.y=(-x+f.y1+f.y2+T)/2}for(var a=0;ae.x2?n:e.x2,e.y1=ae.y2?i:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},tt=function(e,t){return t==null?e:Ir(e,t.x1,t.y1,t.x2,t.y2)},fa=function(e,t,a){return Tr(e,t,a)},ja=function(e,t,a){if(!t.cy().headless()){var n=t._private,i=n.rstyle,s=i.arrowWidth/2,o=t.pstyle(a+"-arrow-shape").value,l,u;if(o!=="none"){a==="source"?(l=i.srcX,u=i.srcY):a==="target"?(l=i.tgtX,u=i.tgtY):(l=i.midX,u=i.midY);var v=n.arrowBounds=n.arrowBounds||{},f=v[a]=v[a]||{};f.x1=l-s,f.y1=u-s,f.x2=l+s,f.y2=u+s,f.w=f.x2-f.x1,f.h=f.y2-f.y1,un(f,1),Ir(e,f.x1,f.y1,f.x2,f.y2)}}},ys=function(e,t,a){if(!t.cy().headless()){var n;a?n=a+"-":n="";var i=t._private,s=i.rstyle,o=t.pstyle(n+"label").strValue;if(o){var l=t.pstyle("text-halign"),u=t.pstyle("text-valign"),v=fa(s,"labelWidth",a),f=fa(s,"labelHeight",a),c=fa(s,"labelX",a),h=fa(s,"labelY",a),d=t.pstyle(n+"text-margin-x").pfValue,y=t.pstyle(n+"text-margin-y").pfValue,g=t.isEdge(),p=t.pstyle(n+"text-rotation"),m=t.pstyle("text-outline-width").pfValue,b=t.pstyle("text-border-width").pfValue,w=b/2,E=t.pstyle("text-background-padding").pfValue,C=2,x=f,T=v,k=T/2,D=x/2,B,P,A,R;if(g)B=c-k,P=c+k,A=h-D,R=h+D;else{switch(l.value){case"left":B=c-T,P=c;break;case"center":B=c-k,P=c+k;break;case"right":B=c,P=c+T;break}switch(u.value){case"top":A=h-x,R=h;break;case"center":A=h-D,R=h+D;break;case"bottom":A=h,R=h+x;break}}var L=d-Math.max(m,w)-E-C,I=d+Math.max(m,w)+E+C,M=y-Math.max(m,w)-E-C,O=y+Math.max(m,w)+E+C;B+=L,P+=I,A+=M,R+=O;var V=a||"main",G=i.labelBounds,N=G[V]=G[V]||{};N.x1=B,N.y1=A,N.x2=P,N.y2=R,N.w=P-B,N.h=R-A,N.leftPad=L,N.rightPad=I,N.topPad=M,N.botPad=O;var F=g&&p.strValue==="autorotate",U=p.pfValue!=null&&p.pfValue!==0;if(F||U){var Q=F?fa(i.rstyle,"labelAngle",a):p.pfValue,K=Math.cos(Q),j=Math.sin(Q),re=(B+P)/2,ne=(A+R)/2;if(!g){switch(l.value){case"left":re=P;break;case"right":re=B;break}switch(u.value){case"top":ne=R;break;case"bottom":ne=A;break}}var J=function(Ce,we){return Ce=Ce-re,we=we-ne,{x:Ce*K-we*j+re,y:Ce*j+we*K+ne}},z=J(B,A),q=J(B,R),H=J(P,A),Y=J(P,R);B=Math.min(z.x,q.x,H.x,Y.x),P=Math.max(z.x,q.x,H.x,Y.x),A=Math.min(z.y,q.y,H.y,Y.y),R=Math.max(z.y,q.y,H.y,Y.y)}var te=V+"Rot",ce=G[te]=G[te]||{};ce.x1=B,ce.y1=A,ce.x2=P,ce.y2=R,ce.w=P-B,ce.h=R-A,Ir(e,B,A,P,R),Ir(i.labelBounds.all,B,A,P,R)}return e}},ol=function(e,t){if(!t.cy().headless()){var a=t.pstyle("outline-opacity").value,n=t.pstyle("outline-width").value,i=t.pstyle("outline-offset").value,s=n+i;Wv(e,t,a,s,"outside",s/2)}},Wv=function(e,t,a,n,i,s){if(!(a===0||n<=0||i==="inside")){var o=t.cy(),l=t.pstyle("shape").value,u=o.renderer().nodeShapes[l],v=t.position(),f=v.x,c=v.y,h=t.width(),d=t.height();if(u.hasMiterBounds){i==="center"&&(n/=2);var y=u.miterBounds(f,c,h,d,n);tt(e,y)}else s!=null&&s>0&&ln(e,[s,s,s,s])}},Wg=function(e,t){if(!t.cy().headless()){var a=t.pstyle("border-opacity").value,n=t.pstyle("border-width").pfValue,i=t.pstyle("border-position").value;Wv(e,t,a,n,i)}},$g=function(e,t){var a=e._private.cy,n=a.styleEnabled(),i=a.headless(),s=wr(),o=e._private,l=e.isNode(),u=e.isEdge(),v,f,c,h,d,y,g=o.rstyle,p=l&&n?e.pstyle("bounds-expansion").pfValue:[0],m=function(Ae){return Ae.pstyle("display").value!=="none"},b=!n||m(e)&&(!u||m(e.source())&&m(e.target()));if(b){var w=0,E=0;n&&t.includeOverlays&&(w=e.pstyle("overlay-opacity").value,w!==0&&(E=e.pstyle("overlay-padding").value));var C=0,x=0;n&&t.includeUnderlays&&(C=e.pstyle("underlay-opacity").value,C!==0&&(x=e.pstyle("underlay-padding").value));var T=Math.max(E,x),k=0,D=0;if(n&&(k=e.pstyle("width").pfValue,D=k/2),l&&t.includeNodes){var B=e.position();d=B.x,y=B.y;var P=e.outerWidth(),A=P/2,R=e.outerHeight(),L=R/2;v=d-A,f=d+A,c=y-L,h=y+L,Ir(s,v,c,f,h),n&&ol(s,e),n&&t.includeOutlines&&!i&&ol(s,e),n&&Wg(s,e)}else if(u&&t.includeEdges)if(n&&!i){var I=e.pstyle("curve-style").strValue;if(v=Math.min(g.srcX,g.midX,g.tgtX),f=Math.max(g.srcX,g.midX,g.tgtX),c=Math.min(g.srcY,g.midY,g.tgtY),h=Math.max(g.srcY,g.midY,g.tgtY),v-=D,f+=D,c-=D,h+=D,Ir(s,v,c,f,h),I==="haystack"){var M=g.haystackPts;if(M&&M.length===2){if(v=M[0].x,c=M[0].y,f=M[1].x,h=M[1].y,v>f){var O=v;v=f,f=O}if(c>h){var V=c;c=h,h=V}Ir(s,v-D,c-D,f+D,h+D)}}else if(I==="bezier"||I==="unbundled-bezier"||at(I,"segments")||at(I,"taxi")){var G;switch(I){case"bezier":case"unbundled-bezier":G=g.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":G=g.linePts;break}if(G!=null)for(var N=0;Nf){var re=v;v=f,f=re}if(c>h){var ne=c;c=h,h=ne}v-=D,f+=D,c-=D,h+=D,Ir(s,v,c,f,h)}if(n&&t.includeEdges&&u&&(ja(s,e,"mid-source"),ja(s,e,"mid-target"),ja(s,e,"source"),ja(s,e,"target")),n){var J=e.pstyle("ghost").value==="yes";if(J){var z=e.pstyle("ghost-offset-x").pfValue,q=e.pstyle("ghost-offset-y").pfValue;Ir(s,s.x1+z,s.y1+q,s.x2+z,s.y2+q)}}var H=o.bodyBounds=o.bodyBounds||{};Uo(H,s),ln(H,p),un(H,1),n&&(v=s.x1,f=s.x2,c=s.y1,h=s.y2,Ir(s,v-T,c-T,f+T,h+T));var Y=o.overlayBounds=o.overlayBounds||{};Uo(Y,s),ln(Y,p),un(Y,1);var te=o.labelBounds=o.labelBounds||{};te.all!=null?kd(te.all):te.all=wr(),n&&t.includeLabels&&(t.includeMainLabels&&ys(s,e,null),u&&(t.includeSourceLabels&&ys(s,e,"source"),t.includeTargetLabels&&ys(s,e,"target")))}return s.x1=Ar(s.x1),s.y1=Ar(s.y1),s.x2=Ar(s.x2),s.y2=Ar(s.y2),s.w=Ar(s.x2-s.x1),s.h=Ar(s.y2-s.y1),s.w>0&&s.h>0&&b&&(ln(s,p),un(s,1)),s},$v=function(e){var t=0,a=function(s){return(s?1:0)<0&&arguments[0]!==void 0?arguments[0]:sp,e=arguments.length>1?arguments[1]:void 0,t=0;t=0;o--)s(o);return this};dt.removeAllListeners=function(){return this.removeListener("*")};dt.emit=dt.trigger=function(r,e,t){var a=this.listeners,n=a.length;return this.emitting++,_e(e)||(e=[e]),op(this,function(i,s){t!=null&&(a=[{event:s.event,type:s.type,namespace:s.namespace,callback:t}],n=a.length);for(var o=function(){var v=a[l];if(v.type===s.type&&(!v.namespace||v.namespace===s.namespace||v.namespace===ip)&&i.eventMatches(i.context,v,s)){var f=[s];e!=null&&Qc(f,e),i.beforeEmit(i.context,v,s),v.conf&&v.conf.one&&(i.listeners=i.listeners.filter(function(d){return d!==v}));var c=i.callbackContext(i.context,v,s),h=v.callback.apply(c,f);i.afterEmit(i.context,v,s),h===!1&&(s.stopPropagation(),s.preventDefault())}},l=0;l1&&!s){var o=this.length-1,l=this[o],u=l._private.data.id;this[o]=void 0,this[e]=l,i.set(u,{ele:l,index:e})}return this.length--,this},unmergeOne:function(e){e=e[0];var t=this._private,a=e._private.data.id,n=t.map,i=n.get(a);if(!i)return this;var s=i.index;return this.unmergeAt(s),this},unmerge:function(e){var t=this._private.cy;if(!e)return this;if(e&&ge(e)){var a=e;e=t.mutableElements().filter(a)}for(var n=0;n=0;t--){var a=this[t];e(a)&&this.unmergeAt(t)}return this},map:function(e,t){for(var a=[],n=this,i=0;ia&&(a=l,n=o)}return{value:a,ele:n}},min:function(e,t){for(var a=1/0,n,i=this,s=0;s=0&&i"u"?"undefined":ar(Symbol))!=e&&ar(Symbol.iterator)!=e;t&&(Sn[Symbol.iterator]=function(){var a=this,n={value:void 0,done:!1},i=0,s=this.length;return Jl({next:function(){return i1&&arguments[1]!==void 0?arguments[1]:!0,a=this[0],n=a.cy();if(n.styleEnabled()&&a){a._private.styleDirty&&(a._private.styleDirty=!1,n.style().apply(a));var i=a._private.style[e];return i??(t?n.style().getDefaultProperty(e):null)}},numericStyle:function(e){var t=this[0];if(t.cy().styleEnabled()&&t){var a=t.pstyle(e);return a.pfValue!==void 0?a.pfValue:a.value}},numericStyleUnits:function(e){var t=this[0];if(t.cy().styleEnabled()&&t)return t.pstyle(e).units},renderedStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var a=this[0];if(a)return t.style().getRenderedStyle(a,e)},style:function(e,t){var a=this.cy();if(!a.styleEnabled())return this;var n=!1,i=a.style();if(Le(e)){var s=e;i.applyBypass(this,s,n),this.emitAndNotify("style")}else if(ge(e))if(t===void 0){var o=this[0];return o?i.getStylePropertyValue(o,e):void 0}else i.applyBypass(this,e,t,n),this.emitAndNotify("style");else if(e===void 0){var l=this[0];return l?i.getRawStyle(l):void 0}return this},removeStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var a=!1,n=t.style(),i=this;if(e===void 0)for(var s=0;s0&&e.push(v[0]),e.push(o[0])}return this.spawn(e,!0).filter(r)},"neighborhood"),closedNeighborhood:function(e){return this.neighborhood().add(this).filter(e)},openNeighborhood:function(e){return this.neighborhood(e)}});gr.neighbourhood=gr.neighborhood;gr.closedNeighbourhood=gr.closedNeighborhood;gr.openNeighbourhood=gr.openNeighborhood;be(gr,{source:Rr(function(e){var t=this[0],a;return t&&(a=t._private.source||t.cy().collection()),a&&e?a.filter(e):a},"source"),target:Rr(function(e){var t=this[0],a;return t&&(a=t._private.target||t.cy().collection()),a&&e?a.filter(e):a},"target"),sources:ml({attr:"source"}),targets:ml({attr:"target"})});function ml(r){return function(t){for(var a=[],n=0;n0);return s},component:function(){var e=this[0];return e.cy().mutableElements().components(e)[0]}});gr.componentsOf=gr.components;var fr=function(e,t){var a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(e===void 0){$e("A collection must have a reference to the core");return}var i=new Xr,s=!1;if(!t)t=[];else if(t.length>0&&Le(t[0])&&!Ia(t[0])){s=!0;for(var o=[],l=new ra,u=0,v=t.length;u0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,t=this,a=t.cy(),n=a._private,i=[],s=[],o,l=0,u=t.length;l0){for(var V=o.length===t.length?t:new fr(a,o),G=0;G0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,t=this,a=[],n={},i=t._private.cy;function s(R){for(var L=R._private.edges,I=0;I0&&(r?B.emitAndNotify("remove"):e&&B.emit("remove"));for(var P=0;P0?P=R:B=R;while(Math.abs(A)>s&&++L=i?m(D,L):I===0?L:w(D,B,B+u)}var C=!1;function x(){C=!0,(r!==e||t!==a)&&b()}var T=function(B){return C||x(),r===e&&t===a?B:B===0?0:B===1?1:g(E(B),e,a)};T.getControlPoints=function(){return[{x:r,y:e},{x:t,y:a}]};var k="generateBezier("+[r,e,t,a]+")";return T.toString=function(){return k},T}var mp=(function(){function r(a){return-a.tension*a.x-a.friction*a.v}function e(a,n,i){var s={x:a.x+i.dx*n,v:a.v+i.dv*n,tension:a.tension,friction:a.friction};return{dx:s.v,dv:r(s)}}function t(a,n){var i={dx:a.v,dv:r(a)},s=e(a,n*.5,i),o=e(a,n*.5,s),l=e(a,n,o),u=1/6*(i.dx+2*(s.dx+o.dx)+l.dx),v=1/6*(i.dv+2*(s.dv+o.dv)+l.dv);return a.x=a.x+u*n,a.v=a.v+v*n,a}return function a(n,i,s){var o={x:-1,v:0,tension:null,friction:null},l=[0],u=0,v=1/1e4,f=16/1e3,c,h,d;for(n=parseFloat(n)||500,i=parseFloat(i)||20,s=s||null,o.tension=n,o.friction=i,c=s!==null,c?(u=a(n,i),h=u/s*f):h=f;d=t(d||o,h),l.push(1+d.x),u+=16,Math.abs(d.x)>v&&Math.abs(d.v)>v;);return c?function(y){return l[y*(l.length-1)|0]}:u}})(),Ge=function(e,t,a,n){var i=yp(e,t,a,n);return function(s,o,l){return s+(o-s)*i(l)}},cn={linear:function(e,t,a){return e+(t-e)*a},ease:Ge(.25,.1,.25,1),"ease-in":Ge(.42,0,1,1),"ease-out":Ge(0,0,.58,1),"ease-in-out":Ge(.42,0,.58,1),"ease-in-sine":Ge(.47,0,.745,.715),"ease-out-sine":Ge(.39,.575,.565,1),"ease-in-out-sine":Ge(.445,.05,.55,.95),"ease-in-quad":Ge(.55,.085,.68,.53),"ease-out-quad":Ge(.25,.46,.45,.94),"ease-in-out-quad":Ge(.455,.03,.515,.955),"ease-in-cubic":Ge(.55,.055,.675,.19),"ease-out-cubic":Ge(.215,.61,.355,1),"ease-in-out-cubic":Ge(.645,.045,.355,1),"ease-in-quart":Ge(.895,.03,.685,.22),"ease-out-quart":Ge(.165,.84,.44,1),"ease-in-out-quart":Ge(.77,0,.175,1),"ease-in-quint":Ge(.755,.05,.855,.06),"ease-out-quint":Ge(.23,1,.32,1),"ease-in-out-quint":Ge(.86,0,.07,1),"ease-in-expo":Ge(.95,.05,.795,.035),"ease-out-expo":Ge(.19,1,.22,1),"ease-in-out-expo":Ge(1,0,0,1),"ease-in-circ":Ge(.6,.04,.98,.335),"ease-out-circ":Ge(.075,.82,.165,1),"ease-in-out-circ":Ge(.785,.135,.15,.86),spring:function(e,t,a){if(a===0)return cn.linear;var n=mp(e,t,a);return function(i,s,o){return i+(s-i)*n(o)}},"cubic-bezier":Ge};function xl(r,e,t,a,n){if(a===1||e===t)return t;var i=n(e,t,a);return r==null||((r.roundValue||r.color)&&(i=Math.round(i)),r.min!==void 0&&(i=Math.max(i,r.min)),r.max!==void 0&&(i=Math.min(i,r.max))),i}function El(r,e){return r.pfValue!=null||r.value!=null?r.pfValue!=null&&(e==null||e.type.units!=="%")?r.pfValue:r.value:r}function Ft(r,e,t,a,n){var i=n!=null?n.type:null;t<0?t=0:t>1&&(t=1);var s=El(r,n),o=El(e,n);if(ae(s)&&ae(o))return xl(i,s,o,t,a);if(_e(s)&&_e(o)){for(var l=[],u=0;u0?(h==="spring"&&d.push(s.duration),s.easingImpl=cn[h].apply(null,d)):s.easingImpl=cn[h]}var y=s.easingImpl,g;if(s.duration===0?g=1:g=(t-l)/s.duration,s.applying&&(g=s.progress),g<0?g=0:g>1&&(g=1),s.delay==null){var p=s.startPosition,m=s.position;if(m&&n&&!r.locked()){var b={};da(p.x,m.x)&&(b.x=Ft(p.x,m.x,g,y)),da(p.y,m.y)&&(b.y=Ft(p.y,m.y,g,y)),r.position(b)}var w=s.startPan,E=s.pan,C=i.pan,x=E!=null&&a;x&&(da(w.x,E.x)&&(C.x=Ft(w.x,E.x,g,y)),da(w.y,E.y)&&(C.y=Ft(w.y,E.y,g,y)),r.emit("pan"));var T=s.startZoom,k=s.zoom,D=k!=null&&a;D&&(da(T,k)&&(i.zoom=ka(i.minZoom,Ft(T,k,g,y),i.maxZoom)),r.emit("zoom")),(x||D)&&r.emit("viewport");var B=s.style;if(B&&B.length>0&&n){for(var P=0;P=0;x--){var T=C[x];T()}C.splice(0,C.length)},m=h.length-1;m>=0;m--){var b=h[m],w=b._private;if(w.stopped){h.splice(m,1),w.hooked=!1,w.playing=!1,w.started=!1,p(w.frames);continue}!w.playing&&!w.applying||(w.playing&&w.applying&&(w.applying=!1),w.started||wp(v,b,r),bp(v,b,r,f),w.applying&&(w.applying=!1),p(w.frames),w.step!=null&&w.step(r),b.completed()&&(h.splice(m,1),w.hooked=!1,w.playing=!1,w.started=!1,p(w.completes)),y=!0)}return!f&&h.length===0&&d.length===0&&a.push(v),y}for(var i=!1,s=0;s0?e.notify("draw",t):e.notify("draw")),t.unmerge(a),e.emit("step")}var xp={animate:Fe.animate(),animation:Fe.animation(),animated:Fe.animated(),clearQueue:Fe.clearQueue(),delay:Fe.delay(),delayAnimation:Fe.delayAnimation(),stop:Fe.stop(),addToAnimationPool:function(e){var t=this;t.styleEnabled()&&t._private.aniEles.merge(e)},stopAnimationLoop:function(){this._private.animationsRunning=!1},startAnimationLoop:function(){var e=this;if(e._private.animationsRunning=!0,!e.styleEnabled())return;function t(){e._private.animationsRunning&&wn(function(i){Cl(i,e),t()})}var a=e.renderer();a&&a.beforeRender?a.beforeRender(function(i,s){Cl(s,e)},a.beforeRenderPriorities.animations):t()}},Ep={qualifierCompare:function(e,t){return e==null||t==null?e==null&&t==null:e.sameText(t)},eventMatches:function(e,t,a){var n=t.qualifier;return n!=null?e!==a.target&&Ia(a.target)&&n.matches(a.target):!0},addEventFields:function(e,t){t.cy=e,t.target=e},callbackContext:function(e,t,a){return t.qualifier!=null?a.target:e}},tn=function(e){return ge(e)?new ft(e):e},tf={createEmitter:function(){var e=this._private;return e.emitter||(e.emitter=new Gn(Ep,this)),this},emitter:function(){return this._private.emitter},on:function(e,t,a){return this.emitter().on(e,tn(t),a),this},removeListener:function(e,t,a){return this.emitter().removeListener(e,tn(t),a),this},removeAllListeners:function(){return this.emitter().removeAllListeners(),this},one:function(e,t,a){return this.emitter().one(e,tn(t),a),this},once:function(e,t,a){return this.emitter().one(e,tn(t),a),this},emit:function(e,t){return this.emitter().emit(e,t),this},emitAndNotify:function(e,t){return this.emit(e),this.notify(e,t),this}};Fe.eventAliasesOn(tf);var zs={png:function(e){var t=this._private.renderer;return e=e||{},t.png(e)},jpg:function(e){var t=this._private.renderer;return e=e||{},e.bg=e.bg||"#fff",t.jpg(e)}};zs.jpeg=zs.jpg;var dn={layout:function(e){var t=this;if(e==null){$e("Layout options must be specified to make a layout");return}if(e.name==null){$e("A `name` must be specified to make a layout");return}var a=e.name,n=t.extension("layout",a);if(n==null){$e("No such layout `"+a+"` found. Did you forget to import it and `cytoscape.use()` it?");return}var i;ge(e.eles)?i=t.$(e.eles):i=e.eles!=null?e.eles:t.$();var s=new n(be({},e,{cy:t,eles:i}));return s}};dn.createLayout=dn.makeLayout=dn.layout;var Cp={notify:function(e,t){var a=this._private;if(this.batching()){a.batchNotifications=a.batchNotifications||{};var n=a.batchNotifications[e]=a.batchNotifications[e]||this.collection();t!=null&&n.merge(t);return}if(a.notificationsEnabled){var i=this.renderer();this.destroyed()||!i||i.notify(e,t)}},notifications:function(e){var t=this._private;return e===void 0?t.notificationsEnabled:(t.notificationsEnabled=!!e,this)},noNotifications:function(e){this.notifications(!1),e(),this.notifications(!0)},batching:function(){return this._private.batchCount>0},startBatch:function(){var e=this._private;return e.batchCount==null&&(e.batchCount=0),e.batchCount===0&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},endBatch:function(){var e=this._private;if(e.batchCount===0)return this;if(e.batchCount--,e.batchCount===0){e.batchStyleEles.updateStyle();var t=this.renderer();Object.keys(e.batchNotifications).forEach(function(a){var n=e.batchNotifications[a];n.empty()?t.notify(a):t.notify(a,n)})}return this},batch:function(e){return this.startBatch(),e(),this.endBatch(),this},batchData:function(e){var t=this;return this.batch(function(){for(var a=Object.keys(e),n=0;n0;)t.removeChild(t.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach(function(a){var n=a._private;n.rscratch={},n.rstyle={},n.animation.current=[],n.animation.queue=[]})},onRender:function(e){return this.on("render",e)},offRender:function(e){return this.off("render",e)}};Fs.invalidateDimensions=Fs.resize;var hn={collection:function(e,t){return ge(e)?this.$(e):Dr(e)?e.collection():_e(e)?(t||(t={}),new fr(this,e,t.unique,t.removed)):new fr(this)},nodes:function(e){var t=this.$(function(a){return a.isNode()});return e?t.filter(e):t},edges:function(e){var t=this.$(function(a){return a.isEdge()});return e?t.filter(e):t},$:function(e){var t=this._private.elements;return e?t.filter(e):t.spawnSelf()},mutableElements:function(){return this._private.elements}};hn.elements=hn.filter=hn.$;var ur={},wa="t",Sp="f";ur.apply=function(r){for(var e=this,t=e._private,a=t.cy,n=a.collection(),i=0;i0;if(c||f&&h){var d=void 0;c&&h||c?d=u.properties:h&&(d=u.mappedProperties);for(var y=0;y1&&(w=1),o.color){var C=a.valueMin[0],x=a.valueMax[0],T=a.valueMin[1],k=a.valueMax[1],D=a.valueMin[2],B=a.valueMax[2],P=a.valueMin[3]==null?1:a.valueMin[3],A=a.valueMax[3]==null?1:a.valueMax[3],R=[Math.round(C+(x-C)*w),Math.round(T+(k-T)*w),Math.round(D+(B-D)*w),Math.round(P+(A-P)*w)];i={bypass:a.bypass,name:a.name,value:R,strValue:"rgb("+R[0]+", "+R[1]+", "+R[2]+")"}}else if(o.number){var L=a.valueMin+(a.valueMax-a.valueMin)*w;i=this.parse(a.name,L,a.bypass,c)}else return!1;if(!i)return y(),!1;i.mapping=a,a=i;break}case s.data:{for(var I=a.field.split("."),M=f.data,O=0;O0&&i>0){for(var o={},l=!1,u=0;u0?r.delayAnimation(s).play().promise().then(b):b()}).then(function(){return r.animation({style:o,duration:i,easing:r.pstyle("transition-timing-function").value,queue:!1}).play().promise()}).then(function(){t.removeBypasses(r,n),r.emitAndNotify("style"),a.transitioning=!1})}else a.transitioning&&(this.removeBypasses(r,n),r.emitAndNotify("style"),a.transitioning=!1)};ur.checkTrigger=function(r,e,t,a,n,i){var s=this.properties[e],o=n(s);r.removed()||o!=null&&o(t,a,r)&&i(s)};ur.checkZOrderTrigger=function(r,e,t,a){var n=this;this.checkTrigger(r,e,t,a,function(i){return i.triggersZOrder},function(){n._private.cy.notify("zorder",r)})};ur.checkBoundsTrigger=function(r,e,t,a){this.checkTrigger(r,e,t,a,function(n){return n.triggersBounds},function(n){r.dirtyCompoundBoundsCache(),r.dirtyBoundingBoxCache()})};ur.checkConnectedEdgesBoundsTrigger=function(r,e,t,a){this.checkTrigger(r,e,t,a,function(n){return n.triggersBoundsOfConnectedEdges},function(n){r.connectedEdges().forEach(function(i){i.dirtyBoundingBoxCache()})})};ur.checkParallelEdgesBoundsTrigger=function(r,e,t,a){this.checkTrigger(r,e,t,a,function(n){return n.triggersBoundsOfParallelEdges},function(n){r.parallelEdges().forEach(function(i){i.dirtyBoundingBoxCache()})})};ur.checkTriggers=function(r,e,t,a){r.dirtyStyleCache(),this.checkZOrderTrigger(r,e,t,a),this.checkBoundsTrigger(r,e,t,a),this.checkConnectedEdgesBoundsTrigger(r,e,t,a),this.checkParallelEdgesBoundsTrigger(r,e,t,a)};var _a={};_a.applyBypass=function(r,e,t,a){var n=this,i=[],s=!0;if(e==="*"||e==="**"){if(t!==void 0)for(var o=0;on.length?a=a.substr(n.length):a=""}function l(){i.length>s.length?i=i.substr(s.length):i=""}for(;;){var u=a.match(/^\s*$/);if(u)break;var v=a.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!v){Ve("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+a);break}n=v[0];var f=v[1];if(f!=="core"){var c=new ft(f);if(c.invalid){Ve("Skipping parsing of block: Invalid selector found in string stylesheet: "+f),o();continue}}var h=v[2],d=!1;i=h;for(var y=[];;){var g=i.match(/^\s*$/);if(g)break;var p=i.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!p){Ve("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+h),d=!0;break}s=p[0];var m=p[1],b=p[2],w=e.properties[m];if(!w){Ve("Skipping property: Invalid property name in: "+s),l();continue}var E=t.parse(m,b);if(!E){Ve("Skipping property: Invalid property definition in: "+s),l();continue}y.push({name:m,val:b}),l()}if(d){o();break}t.selector(f);for(var C=0;C=7&&e[0]==="d"&&(v=new RegExp(o.data.regex).exec(e))){if(t)return!1;var c=o.data;return{name:r,value:v,strValue:""+e,mapped:c,field:v[1],bypass:t}}else if(e.length>=10&&e[0]==="m"&&(f=new RegExp(o.mapData.regex).exec(e))){if(t||u.multiple)return!1;var h=o.mapData;if(!(u.color||u.number))return!1;var d=this.parse(r,f[4]);if(!d||d.mapped)return!1;var y=this.parse(r,f[5]);if(!y||y.mapped)return!1;if(d.pfValue===y.pfValue||d.strValue===y.strValue)return Ve("`"+r+": "+e+"` is not a valid mapper because the output range is zero; converting to `"+r+": "+d.strValue+"`"),this.parse(r,d.strValue);if(u.color){var g=d.value,p=y.value,m=g[0]===p[0]&&g[1]===p[1]&&g[2]===p[2]&&(g[3]===p[3]||(g[3]==null||g[3]===1)&&(p[3]==null||p[3]===1));if(m)return!1}return{name:r,value:f,strValue:""+e,mapped:h,field:f[1],fieldMin:parseFloat(f[2]),fieldMax:parseFloat(f[3]),valueMin:d.value,valueMax:y.value,bypass:t}}}if(u.multiple&&a!=="multiple"){var b;if(l?b=e.split(/\s+/):_e(e)?b=e:b=[e],u.evenMultiple&&b.length%2!==0)return null;for(var w=[],E=[],C=[],x="",T=!1,k=0;k0?" ":"")+D.strValue}return u.validate&&!u.validate(w,E)?null:u.singleEnum&&T?w.length===1&&ge(w[0])?{name:r,value:w[0],strValue:w[0],bypass:t}:null:{name:r,value:w,pfValue:C,strValue:x,bypass:t,units:E}}var B=function(){for(var J=0;Ju.max||u.strictMax&&e===u.max))return null;var I={name:r,value:e,strValue:""+e+(P||""),units:P,bypass:t};return u.unitless||P!=="px"&&P!=="em"?I.pfValue=e:I.pfValue=P==="px"||!P?e:this.getEmSizeInPixels()*e,(P==="ms"||P==="s")&&(I.pfValue=P==="ms"?e:1e3*e),(P==="deg"||P==="rad")&&(I.pfValue=P==="rad"?e:Ed(e)),P==="%"&&(I.pfValue=e/100),I}else if(u.propList){var M=[],O=""+e;if(O!=="none"){for(var V=O.split(/\s*,\s*|\s+/),G=0;G0&&o>0&&!isNaN(a.w)&&!isNaN(a.h)&&a.w>0&&a.h>0){l=Math.min((s-2*t)/a.w,(o-2*t)/a.h),l=l>this._private.maxZoom?this._private.maxZoom:l,l=l=a.minZoom&&(a.maxZoom=t),this},minZoom:function(e){return e===void 0?this._private.minZoom:this.zoomRange({min:e})},maxZoom:function(e){return e===void 0?this._private.maxZoom:this.zoomRange({max:e})},getZoomedViewport:function(e){var t=this._private,a=t.pan,n=t.zoom,i,s,o=!1;if(t.zoomingEnabled||(o=!0),ae(e)?s=e:Le(e)&&(s=e.level,e.position!=null?i=On(e.position,n,a):e.renderedPosition!=null&&(i=e.renderedPosition),i!=null&&!t.panningEnabled&&(o=!0)),s=s>t.maxZoom?t.maxZoom:s,s=st.maxZoom||!t.zoomingEnabled?s=!0:(t.zoom=l,i.push("zoom"))}if(n&&(!s||!e.cancelOnFailedZoom)&&t.panningEnabled){var u=e.pan;ae(u.x)&&(t.pan.x=u.x,o=!1),ae(u.y)&&(t.pan.y=u.y,o=!1),o||i.push("pan")}return i.length>0&&(i.push("viewport"),this.emit(i.join(" ")),this.notify("viewport")),this},center:function(e){var t=this.getCenterPan(e);return t&&(this._private.pan=t,this.emit("pan viewport"),this.notify("viewport")),this},getCenterPan:function(e,t){if(this._private.panningEnabled){if(ge(e)){var a=e;e=this.mutableElements().filter(a)}else Dr(e)||(e=this.mutableElements());if(e.length!==0){var n=e.boundingBox(),i=this.width(),s=this.height();t=t===void 0?this._private.zoom:t;var o={x:(i-t*(n.x1+n.x2))/2,y:(s-t*(n.y1+n.y2))/2};return o}}},reset:function(){return!this._private.panningEnabled||!this._private.zoomingEnabled?this:(this.viewport({pan:{x:0,y:0},zoom:1}),this)},invalidateSize:function(){this._private.sizeCache=null},size:function(){var e=this._private,t=e.container,a=this;return e.sizeCache=e.sizeCache||(t?(function(){var n=a.window().getComputedStyle(t),i=function(o){return parseFloat(n.getPropertyValue(o))};return{width:t.clientWidth-i("padding-left")-i("padding-right"),height:t.clientHeight-i("padding-top")-i("padding-bottom")}})():{width:1,height:1})},width:function(){return this.size().width},height:function(){return this.size().height},extent:function(){var e=this._private.pan,t=this._private.zoom,a=this.renderedExtent(),n={x1:(a.x1-e.x)/t,x2:(a.x2-e.x)/t,y1:(a.y1-e.y)/t,y2:(a.y2-e.y)/t};return n.w=n.x2-n.x1,n.h=n.y2-n.y1,n},renderedExtent:function(){var e=this.width(),t=this.height();return{x1:0,y1:0,x2:e,y2:t,w:e,h:t}},multiClickDebounceTime:function(e){if(e)this._private.multiClickDebounceTime=e;else return this._private.multiClickDebounceTime;return this}};Rt.centre=Rt.center;Rt.autolockNodes=Rt.autolock;Rt.autoungrabifyNodes=Rt.autoungrabify;var Aa={data:Fe.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:Fe.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:Fe.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:Fe.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};Aa.attr=Aa.data;Aa.removeAttr=Aa.removeData;var Ra=function(e){var t=this;e=be({},e);var a=e.container;a&&!bn(a)&&bn(a[0])&&(a=a[0]);var n=a?a._cyreg:null;n=n||{},n&&n.cy&&(n.cy.destroy(),n={});var i=n.readies=n.readies||[];a&&(a._cyreg=n),n.cy=t;var s=rr!==void 0&&a!==void 0&&!e.headless,o=e;o.layout=be({name:s?"grid":"null"},o.layout),o.renderer=be({name:s?"canvas":"null"},o.renderer);var l=function(d,y,g){return y!==void 0?y:g!==void 0?g:d},u=this._private={container:a,ready:!1,options:o,elements:new fr(this),listeners:[],aniEles:new fr(this),data:o.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:l(!0,o.zoomingEnabled),userZoomingEnabled:l(!0,o.userZoomingEnabled),panningEnabled:l(!0,o.panningEnabled),userPanningEnabled:l(!0,o.userPanningEnabled),boxSelectionEnabled:l(!0,o.boxSelectionEnabled),autolock:l(!1,o.autolock,o.autolockNodes),autoungrabify:l(!1,o.autoungrabify,o.autoungrabifyNodes),autounselectify:l(!1,o.autounselectify),styleEnabled:o.styleEnabled===void 0?s:o.styleEnabled,zoom:ae(o.zoom)?o.zoom:1,pan:{x:Le(o.pan)&&ae(o.pan.x)?o.pan.x:0,y:Le(o.pan)&&ae(o.pan.y)?o.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:l(250,o.multiClickDebounceTime)};this.createEmitter(),this.selectionType(o.selectionType),this.zoomRange({min:o.minZoom,max:o.maxZoom});var v=function(d,y){var g=d.some(pc);if(g)return ta.all(d).then(y);y(d)};u.styleEnabled&&t.setStyle([]);var f=be({},o,o.renderer);t.initRenderer(f);var c=function(d,y,g){t.notifications(!1);var p=t.mutableElements();p.length>0&&p.remove(),d!=null&&(Le(d)||_e(d))&&t.add(d),t.one("layoutready",function(b){t.notifications(!0),t.emit(b),t.one("load",y),t.emitAndNotify("load")}).one("layoutstop",function(){t.one("done",g),t.emit("done")});var m=be({},t._private.options.layout);m.eles=t.elements(),t.layout(m).run()};v([o.style,o.elements],function(h){var d=h[0],y=h[1];u.styleEnabled&&t.style().append(d),c(y,function(){t.startAnimationLoop(),u.ready=!0,Ue(o.ready)&&t.on("ready",o.ready);for(var g=0;g0,o=!!r.boundingBox,l=wr(o?r.boundingBox:structuredClone(e.extent())),u;if(Dr(r.roots))u=r.roots;else if(_e(r.roots)){for(var v=[],f=0;f0;){var R=A(),L=k(R,B);if(L)R.outgoers().filter(function(ye){return ye.isNode()&&t.has(ye)}).forEach(P);else if(L===null){Ve("Detected double maximal shift for node `"+R.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}var I=0;if(r.avoidOverlap)for(var M=0;M0&&p[0].length<=3?pe/2:0),Re=2*Math.PI/p[he].length*Ee;return he===0&&p[0].length===1&&(Se=1),{x:H.x+Se*Math.cos(Re),y:H.y+Se*Math.sin(Re)}}else{var Oe=p[he].length,Ne=Math.max(Oe===1?0:o?(l.w-r.padding*2-Y.w)/((r.grid?ce:Oe)-1):(l.w-r.padding*2-Y.w)/((r.grid?ce:Oe)+1),I),ze={x:H.x+(Ee+1-(Oe+1)/2)*Ne,y:H.y+(he+1-(K+1)/2)*te};return ze}},Ce={downward:0,leftward:90,upward:180,rightward:-90};Object.keys(Ce).indexOf(r.direction)===-1&&$e("Invalid direction '".concat(r.direction,"' specified for breadthfirst layout. Valid values are: ").concat(Object.keys(Ce).join(", ")));var we=function(ie){return $c(Ae(ie),l,Ce[r.direction])};return t.nodes().layoutPositions(this,r,we),this};var Ap={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function nf(r){this.options=be({},Ap,r)}nf.prototype.run=function(){var r=this.options,e=r,t=r.cy,a=e.eles,n=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,i=a.nodes().not(":parent");e.sort&&(i=i.sort(e.sort));for(var s=wr(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:t.width(),h:t.height()}),o={x:s.x1+s.w/2,y:s.y1+s.h/2},l=e.sweep===void 0?2*Math.PI-2*Math.PI/i.length:e.sweep,u=l/Math.max(1,i.length-1),v,f=0,c=0;c1&&e.avoidOverlap){f*=1.75;var p=Math.cos(u)-Math.cos(0),m=Math.sin(u)-Math.sin(0),b=Math.sqrt(f*f/(p*p+m*m));v=Math.max(b,v)}var w=function(C,x){var T=e.startAngle+x*u*(n?1:-1),k=v*Math.cos(T),D=v*Math.sin(T),B={x:o.x+k,y:o.y+D};return B};return a.nodes().layoutPositions(this,e,w),this};var Rp={fit:!0,padding:30,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:function(e){return e.degree()},levelWidth:function(e){return e.maxDegree()/4},animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function sf(r){this.options=be({},Rp,r)}sf.prototype.run=function(){for(var r=this.options,e=r,t=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,a=r.cy,n=e.eles,i=n.nodes().not(":parent"),s=wr(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:a.width(),h:a.height()}),o={x:s.x1+s.w/2,y:s.y1+s.h/2},l=[],u=0,v=0;v0){var E=Math.abs(m[0].value-w.value);E>=g&&(m=[],p.push(m))}m.push(w)}var C=u+e.minNodeSpacing;if(!e.avoidOverlap){var x=p.length>0&&p[0].length>1,T=Math.min(s.w,s.h)/2-C,k=T/(p.length+x?1:0);C=Math.min(C,k)}for(var D=0,B=0;B1&&e.avoidOverlap){var L=Math.cos(R)-Math.cos(0),I=Math.sin(R)-Math.sin(0),M=Math.sqrt(C*C/(L*L+I*I));D=Math.max(M,D)}P.r=D,D+=C}if(e.equidistant){for(var O=0,V=0,G=0;G=r.numIter||(Fp(a,r),a.temperature=a.temperature*r.coolingFactor,a.temperature=r.animationThreshold&&i(),wn(v)}};v()}else{for(;u;)u=s(l),l++;kl(a,r),o()}return this};Kn.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this};Kn.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};var Lp=function(e,t,a){for(var n=a.eles.edges(),i=a.eles.nodes(),s=wr(a.boundingBox?a.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),o={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:i.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:n.size(),temperature:a.initialTemp,clientWidth:s.w,clientHeight:s.h,boundingBox:s},l=a.eles.components(),u={},v=0;v0){o.graphSet.push(T);for(var v=0;vn.count?0:n.graph},of=function(e,t,a,n){var i=n.graphSet[a];if(-10)var f=n.nodeOverlap*v,c=Math.sqrt(o*o+l*l),h=f*o/c,d=f*l/c;else var y=Dn(e,o,l),g=Dn(t,-1*o,-1*l),p=g.x-y.x,m=g.y-y.y,b=p*p+m*m,c=Math.sqrt(b),f=(e.nodeRepulsion+t.nodeRepulsion)/b,h=f*p/c,d=f*m/c;e.isLocked||(e.offsetX-=h,e.offsetY-=d),t.isLocked||(t.offsetX+=h,t.offsetY+=d)}},_p=function(e,t,a,n){if(a>0)var i=e.maxX-t.minX;else var i=t.maxX-e.minX;if(n>0)var s=e.maxY-t.minY;else var s=t.maxY-e.minY;return i>=0&&s>=0?Math.sqrt(i*i+s*s):0},Dn=function(e,t,a){var n=e.positionX,i=e.positionY,s=e.height||1,o=e.width||1,l=a/t,u=s/o,v={};return t===0&&0a?(v.x=n,v.y=i+s/2,v):0t&&-1*u<=l&&l<=u?(v.x=n-o/2,v.y=i-o*a/2/t,v):0=u)?(v.x=n+s*t/2/a,v.y=i+s/2,v):(0>a&&(l<=-1*u||l>=u)&&(v.x=n-s*t/2/a,v.y=i-s/2),v)},Gp=function(e,t){for(var a=0;aa){var g=t.gravity*h/y,p=t.gravity*d/y;c.offsetX+=g,c.offsetY+=p}}}}},Wp=function(e,t){var a=[],n=0,i=-1;for(a.push.apply(a,e.graphSet[0]),i+=e.graphSet[0].length;n<=i;){var s=a[n++],o=e.idToIndex[s],l=e.layoutNodes[o],u=l.children;if(0a)var i={x:a*e/n,y:a*t/n};else var i={x:e,y:t};return i},lf=function(e,t){var a=e.parentId;if(a!=null){var n=t.layoutNodes[t.idToIndex[a]],i=!1;if((n.maxX==null||e.maxX+n.padRight>n.maxX)&&(n.maxX=e.maxX+n.padRight,i=!0),(n.minX==null||e.minX-n.padLeftn.maxY)&&(n.maxY=e.maxY+n.padBottom,i=!0),(n.minY==null||e.minY-n.padTopp&&(d+=g+t.componentSpacing,h=0,y=0,g=0)}}},Kp={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:function(e){},sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function vf(r){this.options=be({},Kp,r)}vf.prototype.run=function(){var r=this.options,e=r,t=r.cy,a=e.eles,n=a.nodes().not(":parent");e.sort&&(n=n.sort(e.sort));var i=wr(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:t.width(),h:t.height()});if(i.h===0||i.w===0)a.nodes().layoutPositions(this,e,function(U){return{x:i.x1,y:i.y1}});else{var s=n.size(),o=Math.sqrt(s*i.h/i.w),l=Math.round(o),u=Math.round(i.w/i.h*o),v=function(Q){if(Q==null)return Math.min(l,u);var K=Math.min(l,u);K==l?l=Q:u=Q},f=function(Q){if(Q==null)return Math.max(l,u);var K=Math.max(l,u);K==l?l=Q:u=Q},c=e.rows,h=e.cols!=null?e.cols:e.columns;if(c!=null&&h!=null)l=c,u=h;else if(c!=null&&h==null)l=c,u=Math.ceil(s/l);else if(c==null&&h!=null)u=h,l=Math.ceil(s/u);else if(u*l>s){var d=v(),y=f();(d-1)*y>=s?v(d-1):(y-1)*d>=s&&f(y-1)}else for(;u*l=s?f(p+1):v(g+1)}var m=i.w/u,b=i.h/l;if(e.condense&&(m=0,b=0),e.avoidOverlap)for(var w=0;w=u&&(L=0,R++)},M={},O=0;O(L=Nd(r,e,I[M],I[M+1],I[M+2],I[M+3])))return g(x,L),!0}else if(k.edgeType==="bezier"||k.edgeType==="multibezier"||k.edgeType==="self"||k.edgeType==="compound"){for(var I=k.allpts,M=0;M+5(L=Od(r,e,I[M],I[M+1],I[M+2],I[M+3],I[M+4],I[M+5])))return g(x,L),!0}for(var O=O||T.source,V=V||T.target,G=n.getArrowWidth(D,B),N=[{name:"source",x:k.arrowStartX,y:k.arrowStartY,angle:k.srcArrowAngle},{name:"target",x:k.arrowEndX,y:k.arrowEndY,angle:k.tgtArrowAngle},{name:"mid-source",x:k.midX,y:k.midY,angle:k.midsrcArrowAngle},{name:"mid-target",x:k.midX,y:k.midY,angle:k.midtgtArrowAngle}],M=0;M0&&(p(O),p(V))}function b(x,T,k){return Tr(x,T,k)}function w(x,T){var k=x._private,D=c,B;T?B=T+"-":B="",x.boundingBox();var P=k.labelBounds[T||"main"],A=x.pstyle(B+"label").value,R=x.pstyle("text-events").strValue==="yes";if(!(!R||!A)){var L=b(k.rscratch,"labelX",T),I=b(k.rscratch,"labelY",T),M=b(k.rscratch,"labelAngle",T),O=x.pstyle(B+"text-margin-x").pfValue,V=x.pstyle(B+"text-margin-y").pfValue,G=P.x1-D-O,N=P.x2+D-O,F=P.y1-D-V,U=P.y2+D-V;if(M){var Q=Math.cos(M),K=Math.sin(M),j=function(Y,te){return Y=Y-L,te=te-I,{x:Y*Q-te*K+L,y:Y*K+te*Q+I}},re=j(G,F),ne=j(G,U),J=j(N,F),z=j(N,U),q=[re.x+O,re.y+V,J.x+O,J.y+V,z.x+O,z.y+V,ne.x+O,ne.y+V];if(Sr(r,e,q))return g(x),!0}else if(nt(P,r,e))return g(x),!0}}for(var E=s.length-1;E>=0;E--){var C=s[E];C.isNode()?p(C)||w(C):m(C)||w(C)||w(C,"source")||w(C,"target")}return o};Lt.getAllInBox=function(r,e,t,a){var n=this.getCachedZSortedEles().interactive,i=this.cy.zoom(),s=2/i,o=[],l=Math.min(r,t),u=Math.max(r,t),v=Math.min(e,a),f=Math.max(e,a);r=l,t=u,e=v,a=f;var c=wr({x1:r,y1:e,x2:t,y2:a}),h=[{x:c.x1,y:c.y1},{x:c.x2,y:c.y1},{x:c.x2,y:c.y2},{x:c.x1,y:c.y2}],d=[[h[0],h[1]],[h[1],h[2]],[h[2],h[3]],[h[3],h[0]]];function y(Y,te,ce){return Tr(Y,te,ce)}function g(Y,te){var ce=Y._private,Ae=s,Ce="";Y.boundingBox();var we=ce.labelBounds.main;if(!we)return null;var ye=y(ce.rscratch,"labelX",te),ie=y(ce.rscratch,"labelY",te),de=y(ce.rscratch,"labelAngle",te),he=Y.pstyle(Ce+"text-margin-x").pfValue,Ee=Y.pstyle(Ce+"text-margin-y").pfValue,pe=we.x1-Ae-he,Se=we.x2+Ae-he,Re=we.y1-Ae-Ee,Oe=we.y2+Ae-Ee;if(de){var Ne=Math.cos(de),ze=Math.sin(de),xe=function(X,S){return X=X-ye,S=S-ie,{x:X*Ne-S*ze+ye,y:X*ze+S*Ne+ie}};return[xe(pe,Re),xe(Se,Re),xe(Se,Oe),xe(pe,Oe)]}else return[{x:pe,y:Re},{x:Se,y:Re},{x:Se,y:Oe},{x:pe,y:Oe}]}function p(Y,te,ce,Ae){function Ce(we,ye,ie){return(ie.y-we.y)*(ye.x-we.x)>(ye.y-we.y)*(ie.x-we.x)}return Ce(Y,ce,Ae)!==Ce(te,ce,Ae)&&Ce(Y,te,ce)!==Ce(Y,te,Ae)}for(var m=0;m0?-(Math.PI-e.ang):Math.PI+e.ang},jp=function(e,t,a,n,i){if(e!==Rl?Ml(t,e,Vr):Jp(Pr,Vr),Ml(t,a,Pr),Pl=Vr.nx*Pr.ny-Vr.ny*Pr.nx,Al=Vr.nx*Pr.nx-Vr.ny*-Pr.ny,Ur=Math.asin(Math.max(-1,Math.min(1,Pl))),Math.abs(Ur)<1e-6){Vs=t.x,qs=t.y,Tt=qt=0;return}kt=1,gn=!1,Al<0?Ur<0?Ur=Math.PI+Ur:(Ur=Math.PI-Ur,kt=-1,gn=!0):Ur>0&&(kt=-1,gn=!0),t.radius!==void 0?qt=t.radius:qt=n,wt=Ur/2,an=Math.min(Vr.len/2,Pr.len/2),i?(zr=Math.abs(Math.cos(wt)*qt/Math.sin(wt)),zr>an?(zr=an,Tt=Math.abs(zr*Math.sin(wt)/Math.cos(wt))):Tt=qt):(zr=Math.min(an,qt),Tt=Math.abs(zr*Math.sin(wt)/Math.cos(wt))),_s=t.x+Pr.nx*zr,Gs=t.y+Pr.ny*zr,Vs=_s-Pr.ny*Tt*kt,qs=Gs+Pr.nx*Tt*kt,hf=t.x+Vr.nx*zr,gf=t.y+Vr.ny*zr,Rl=t};function pf(r,e){e.radius===0?r.lineTo(e.cx,e.cy):r.arc(e.cx,e.cy,e.radius,e.startAngle,e.endAngle,e.counterClockwise)}function po(r,e,t,a){var n=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0;return a===0||e.radius===0?{cx:e.x,cy:e.y,radius:0,startX:e.x,startY:e.y,stopX:e.x,stopY:e.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(jp(r,e,t,a,n),{cx:Vs,cy:qs,radius:Tt,startX:hf,startY:gf,stopX:_s,stopY:Gs,startAngle:Vr.ang+Math.PI/2*kt,endAngle:Pr.ang-Math.PI/2*kt,counterClockwise:gn})}var Ma=.01,ey=Math.sqrt(2*Ma),yr={};yr.findMidptPtsEtc=function(r,e){var t=e.posPts,a=e.intersectionPts,n=e.vectorNormInverse,i,s=r.pstyle("source-endpoint"),o=r.pstyle("target-endpoint"),l=s.units!=null&&o.units!=null,u=function(E,C,x,T){var k=T-C,D=x-E,B=Math.sqrt(D*D+k*k);return{x:-k/B,y:D/B}},v=r.pstyle("edge-distances").value;switch(v){case"node-position":i=t;break;case"intersection":i=a;break;case"endpoints":{if(l){var f=this.manualEndptToPx(r.source()[0],s),c=Je(f,2),h=c[0],d=c[1],y=this.manualEndptToPx(r.target()[0],o),g=Je(y,2),p=g[0],m=g[1],b={x1:h,y1:d,x2:p,y2:m};n=u(h,d,p,m),i=b}else Ve("Edge ".concat(r.id()," has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).")),i=a;break}}return{midptPts:i,vectorNormInverse:n}};yr.findHaystackPoints=function(r){for(var e=0;e0?Math.max(S-_,0):Math.min(S+_,0)},A=P(D,T),R=P(B,k),L=!1;m===u?p=Math.abs(A)>Math.abs(R)?n:a:m===l||m===o?(p=a,L=!0):(m===i||m===s)&&(p=n,L=!0);var I=p===a,M=I?R:A,O=I?B:D,V=to(O),G=!1;!(L&&(w||C))&&(m===o&&O<0||m===l&&O>0||m===i&&O>0||m===s&&O<0)&&(V*=-1,M=V*Math.abs(M),G=!0);var N;if(w){var F=E<0?1+E:E;N=F*M}else{var U=E<0?M:0;N=U+E*V}var Q=function(S){return Math.abs(S)=Math.abs(M)},K=Q(N),j=Q(Math.abs(M)-Math.abs(N)),re=K||j;if(re&&!G)if(I){var ne=Math.abs(O)<=c/2,J=Math.abs(D)<=h/2;if(ne){var z=(v.x1+v.x2)/2,q=v.y1,H=v.y2;t.segpts=[z,q,z,H]}else if(J){var Y=(v.y1+v.y2)/2,te=v.x1,ce=v.x2;t.segpts=[te,Y,ce,Y]}else t.segpts=[v.x1,v.y2]}else{var Ae=Math.abs(O)<=f/2,Ce=Math.abs(B)<=d/2;if(Ae){var we=(v.y1+v.y2)/2,ye=v.x1,ie=v.x2;t.segpts=[ye,we,ie,we]}else if(Ce){var de=(v.x1+v.x2)/2,he=v.y1,Ee=v.y2;t.segpts=[de,he,de,Ee]}else t.segpts=[v.x2,v.y1]}else if(I){var pe=v.y1+N+(g?c/2*V:0),Se=v.x1,Re=v.x2;t.segpts=[Se,pe,Re,pe]}else{var Oe=v.x1+N+(g?f/2*V:0),Ne=v.y1,ze=v.y2;t.segpts=[Oe,Ne,Oe,ze]}if(t.isRound){var xe=r.pstyle("taxi-radius").value,ue=r.pstyle("radius-type").value[0]==="arc-radius";t.radii=new Array(t.segpts.length/2).fill(xe),t.isArcRadius=new Array(t.segpts.length/2).fill(ue)}};yr.tryToCorrectInvalidPoints=function(r,e){var t=r._private.rscratch;if(t.edgeType==="bezier"){var a=e.srcPos,n=e.tgtPos,i=e.srcW,s=e.srcH,o=e.tgtW,l=e.tgtH,u=e.srcShape,v=e.tgtShape,f=e.srcCornerRadius,c=e.tgtCornerRadius,h=e.srcRs,d=e.tgtRs,y=!ae(t.startX)||!ae(t.startY),g=!ae(t.arrowStartX)||!ae(t.arrowStartY),p=!ae(t.endX)||!ae(t.endY),m=!ae(t.arrowEndX)||!ae(t.arrowEndY),b=3,w=this.getArrowWidth(r.pstyle("width").pfValue,r.pstyle("arrow-scale").value)*this.arrowShapeWidth,E=b*w,C=Pt({x:t.ctrlpts[0],y:t.ctrlpts[1]},{x:t.startX,y:t.startY}),x=CO.poolIndex()){var V=M;M=O,O=V}var G=A.srcPos=M.position(),N=A.tgtPos=O.position(),F=A.srcW=M.outerWidth(),U=A.srcH=M.outerHeight(),Q=A.tgtW=O.outerWidth(),K=A.tgtH=O.outerHeight(),j=A.srcShape=t.nodeShapes[e.getNodeShape(M)],re=A.tgtShape=t.nodeShapes[e.getNodeShape(O)],ne=A.srcCornerRadius=M.pstyle("corner-radius").value==="auto"?"auto":M.pstyle("corner-radius").pfValue,J=A.tgtCornerRadius=O.pstyle("corner-radius").value==="auto"?"auto":O.pstyle("corner-radius").pfValue,z=A.tgtRs=O._private.rscratch,q=A.srcRs=M._private.rscratch;A.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var H=0;H=ey||(Re=Math.sqrt(Math.max(Se*Se,Ma)+Math.max(pe*pe,Ma)));var Oe=A.vector={x:Se,y:pe},Ne=A.vectorNorm={x:Oe.x/Re,y:Oe.y/Re},ze={x:-Ne.y,y:Ne.x};A.nodesOverlap=!ae(Re)||re.checkPoint(we[0],we[1],0,Q,K,N.x,N.y,J,z)||j.checkPoint(ie[0],ie[1],0,F,U,G.x,G.y,ne,q),A.vectorNormInverse=ze,R={nodesOverlap:A.nodesOverlap,dirCounts:A.dirCounts,calculatedIntersection:!0,hasBezier:A.hasBezier,hasUnbundled:A.hasUnbundled,eles:A.eles,srcPos:N,srcRs:z,tgtPos:G,tgtRs:q,srcW:Q,srcH:K,tgtW:F,tgtH:U,srcIntn:de,tgtIntn:ye,srcShape:re,tgtShape:j,posPts:{x1:Ee.x2,y1:Ee.y2,x2:Ee.x1,y2:Ee.y1},intersectionPts:{x1:he.x2,y1:he.y2,x2:he.x1,y2:he.y1},vector:{x:-Oe.x,y:-Oe.y},vectorNorm:{x:-Ne.x,y:-Ne.y},vectorNormInverse:{x:-ze.x,y:-ze.y}}}var xe=Ce?R:A;te.nodesOverlap=xe.nodesOverlap,te.srcIntn=xe.srcIntn,te.tgtIntn=xe.tgtIntn,te.isRound=ce.startsWith("round"),n&&(M.isParent()||M.isChild()||O.isParent()||O.isChild())&&(M.parents().anySame(O)||O.parents().anySame(M)||M.same(O)&&M.isParent())?e.findCompoundLoopPoints(Y,xe,H,Ae):M===O?e.findLoopPoints(Y,xe,H,Ae):ce.endsWith("segments")?e.findSegmentsPoints(Y,xe):ce.endsWith("taxi")?e.findTaxiPoints(Y,xe):ce==="straight"||!Ae&&A.eles.length%2===1&&H===Math.floor(A.eles.length/2)?e.findStraightEdgePoints(Y):e.findBezierPoints(Y,xe,H,Ae,Ce),e.findEndpoints(Y),e.tryToCorrectInvalidPoints(Y,xe),e.checkForInvalidEdgeWarning(Y),e.storeAllpts(Y),e.storeEdgeProjections(Y),e.calculateArrowAngles(Y),e.recalculateEdgeLabelProjections(Y),e.calculateLabelAngles(Y)}},x=0;x0){var we=u,ye=Ct(we,Wt(s)),ie=Ct(we,Wt(Ce)),de=ye;if(ie2){var he=Ct(we,{x:Ce[2],y:Ce[3]});he0){var W=v,$=Ct(W,Wt(s)),Z=Ct(W,Wt(_)),oe=$;if(Z<$&&(s=[_[0],_[1]],oe=Z),_.length>2){var ee=Ct(W,{x:_[2],y:_[3]});ee=d||x){g={cp:w,segment:C};break}}if(g)break}var T=g.cp,k=g.segment,D=(d-p)/k.length,B=k.t1-k.t0,P=h?k.t0+B*D:k.t1-B*D;P=ka(0,P,1),e=Kt(T.p0,T.p1,T.p2,P),c=ty(T.p0,T.p1,T.p2,P);break}case"straight":case"segments":case"haystack":{for(var A=0,R,L,I,M,O=a.allpts.length,V=0;V+3=d));V+=2);var G=d-L,N=G/R;N=ka(0,N,1),e=Td(I,M,N),c=bf(I,M);break}}s("labelX",f,e.x),s("labelY",f,e.y),s("labelAutoAngle",f,c)}};u("source"),u("target"),this.applyLabelDimensions(r)}};Gr.applyLabelDimensions=function(r){this.applyPrefixedLabelDimensions(r),r.isEdge()&&(this.applyPrefixedLabelDimensions(r,"source"),this.applyPrefixedLabelDimensions(r,"target"))};Gr.applyPrefixedLabelDimensions=function(r,e){var t=r._private,a=this.getLabelText(r,e),n=Bt(a,r._private.labelDimsKey);if(Tr(t.rscratch,"prefixedLabelDimsKey",e)!==n){Kr(t.rscratch,"prefixedLabelDimsKey",e,n);var i=this.calculateLabelDimensions(r,a),s=r.pstyle("line-height").pfValue,o=r.pstyle("text-wrap").strValue,l=Tr(t.rscratch,"labelWrapCachedLines",e)||[],u=o!=="wrap"?1:Math.max(l.length,1),v=i.height/u,f=v*s,c=i.width,h=i.height+(u-1)*(s-1)*v;Kr(t.rstyle,"labelWidth",e,c),Kr(t.rscratch,"labelWidth",e,c),Kr(t.rstyle,"labelHeight",e,h),Kr(t.rscratch,"labelHeight",e,h),Kr(t.rscratch,"labelLineHeight",e,f)}};Gr.getLabelText=function(r,e){var t=r._private,a=e?e+"-":"",n=r.pstyle(a+"label").strValue,i=r.pstyle("text-transform").value,s=function(U,Q){return Q?(Kr(t.rscratch,U,e,Q),Q):Tr(t.rscratch,U,e)};if(!n)return"";i=="none"||(i=="uppercase"?n=n.toUpperCase():i=="lowercase"&&(n=n.toLowerCase()));var o=r.pstyle("text-wrap").value;if(o==="wrap"){var l=s("labelKey");if(l!=null&&s("labelWrapKey")===l)return s("labelWrapCachedText");for(var u="\u200B",v=n.split(` -`),f=r.pstyle("text-max-width").pfValue,c=r.pstyle("text-overflow-wrap").value,h=c==="anywhere",d=[],y=/[\s\u200b]+|$/g,g=0;gf){var E=p.matchAll(y),C="",x=0,T=kr(E),k;try{for(T.s();!(k=T.n()).done;){var D=k.value,B=D[0],P=p.substring(x,D.index);x=D.index+B.length;var A=C.length===0?P:C+P+B,R=this.calculateLabelDimensions(r,A),L=R.width;L<=f?C+=P+B:(C&&d.push(C),C=P+B)}}catch(F){T.e(F)}finally{T.f()}C.match(/^[\s\u200b]+$/)||d.push(C)}else d.push(p)}s("labelWrapCachedLines",d),n=s("labelWrapCachedText",d.join(` -`)),s("labelWrapKey",l)}else if(o==="ellipsis"){var I=r.pstyle("text-max-width").pfValue,M="",O="\u2026",V=!1;if(this.calculateLabelDimensions(r,n).widthI)break;M+=n[G],G===n.length-1&&(V=!0)}return V||(M+=O),M}return n};Gr.getLabelJustification=function(r){var e=r.pstyle("text-justification").strValue,t=r.pstyle("text-halign").strValue;if(e==="auto")if(r.isNode())switch(t){case"left":return"right";case"right":return"left";default:return"center"}else return"center";else return e};Gr.calculateLabelDimensions=function(r,e){var t=this,a=t.cy.window(),n=a.document,i=0,s=r.pstyle("font-style").strValue,o=r.pstyle("font-size").pfValue,l=r.pstyle("font-family").strValue,u=r.pstyle("font-weight").strValue,v=this.labelCalcCanvas,f=this.labelCalcCanvasContext;if(!v){v=this.labelCalcCanvas=n.createElement("canvas"),f=this.labelCalcCanvasContext=v.getContext("2d");var c=v.style;c.position="absolute",c.left="-9999px",c.top="-9999px",c.zIndex="-1",c.visibility="hidden",c.pointerEvents="none"}f.font="".concat(s," ").concat(u," ").concat(o,"px ").concat(l);for(var h=0,d=0,y=e.split(` -`),g=0;g1&&arguments[1]!==void 0?arguments[1]:!0;if(e.merge(s),o)for(var l=0;l=r.desktopTapThreshold2}var lr=i(S);je&&(r.hoverData.tapholdCancelled=!0);var jr=function(){var Br=r.hoverData.dragDelta=r.hoverData.dragDelta||[];Br.length===0?(Br.push(Pe[0]),Br.push(Pe[1])):(Br[0]+=Pe[0],Br[1]+=Pe[1])};W=!0,n(De,["mousemove","vmousemove","tapdrag"],S,{x:ee[0],y:ee[1]});var Ze=function(Br){return{originalEvent:S,type:Br,position:{x:ee[0],y:ee[1]}}},Wr=function(){r.data.bgActivePosistion=void 0,r.hoverData.selecting||$.emit(Ze("boxstart")),me[4]=1,r.hoverData.selecting=!0,r.redrawHint("select",!0),r.redraw()};if(r.hoverData.which===3){if(je){var $r=Ze("cxtdrag");fe?fe.emit($r):$.emit($r),r.hoverData.cxtDragged=!0,(!r.hoverData.cxtOver||De!==r.hoverData.cxtOver)&&(r.hoverData.cxtOver&&r.hoverData.cxtOver.emit(Ze("cxtdragout")),r.hoverData.cxtOver=De,De&&De.emit(Ze("cxtdragover")))}}else if(r.hoverData.dragging){if(W=!0,$.panningEnabled()&&$.userPanningEnabled()){var Ot;if(r.hoverData.justStartedPan){var $a=r.hoverData.mdownPos;Ot={x:(ee[0]-$a[0])*Z,y:(ee[1]-$a[1])*Z},r.hoverData.justStartedPan=!1}else Ot={x:Pe[0]*Z,y:Pe[1]*Z};$.panBy(Ot),$.emit(Ze("dragpan")),r.hoverData.dragged=!0}ee=r.projectIntoViewport(S.clientX,S.clientY)}else if(me[4]==1&&(fe==null||fe.pannable())){if(je){if(!r.hoverData.dragging&&$.boxSelectionEnabled()&&(lr||!$.panningEnabled()||!$.userPanningEnabled()))Wr();else if(!r.hoverData.selecting&&$.panningEnabled()&&$.userPanningEnabled()){var bt=s(fe,r.hoverData.downs);bt&&(r.hoverData.dragging=!0,r.hoverData.justStartedPan=!0,me[4]=0,r.data.bgActivePosistion=Wt(ve),r.redrawHint("select",!0),r.redraw())}fe&&fe.pannable()&&fe.active()&&fe.unactivate()}}else{if(fe&&fe.pannable()&&fe.active()&&fe.unactivate(),(!fe||!fe.grabbed())&&De!=Te&&(Te&&n(Te,["mouseout","tapdragout"],S,{x:ee[0],y:ee[1]}),De&&n(De,["mouseover","tapdragover"],S,{x:ee[0],y:ee[1]}),r.hoverData.last=De),fe)if(je){if($.boxSelectionEnabled()&&lr)fe&&fe.grabbed()&&(p(Be),fe.emit(Ze("freeon")),Be.emit(Ze("free")),r.dragData.didDrag&&(fe.emit(Ze("dragfreeon")),Be.emit(Ze("dragfree")))),Wr();else if(fe&&fe.grabbed()&&r.nodeIsDraggable(fe)){var Er=!r.dragData.didDrag;Er&&r.redrawHint("eles",!0),r.dragData.didDrag=!0,r.hoverData.draggingEles||y(Be,{inDragLayer:!0});var hr={x:0,y:0};if(ae(Pe[0])&&ae(Pe[1])&&(hr.x+=Pe[0],hr.y+=Pe[1],Er)){var Cr=r.hoverData.dragDelta;Cr&&ae(Cr[0])&&ae(Cr[1])&&(hr.x+=Cr[0],hr.y+=Cr[1])}r.hoverData.draggingEles=!0,Be.silentShift(hr).emit(Ze("position")).emit(Ze("drag")),r.redrawHint("drag",!0),r.redraw()}}else jr();W=!0}if(me[2]=ee[0],me[3]=ee[1],W)return S.stopPropagation&&S.stopPropagation(),S.preventDefault&&S.preventDefault(),!1}},!1);var P,A,R;r.registerBinding(e,"mouseup",function(S){if(!(r.hoverData.which===1&&S.which!==1&&r.hoverData.capture)){var _=r.hoverData.capture;if(_){r.hoverData.capture=!1;var W=r.cy,$=r.projectIntoViewport(S.clientX,S.clientY),Z=r.selection,oe=r.findNearestElement($[0],$[1],!0,!1),ee=r.dragData.possibleDragElements,ve=r.hoverData.down,le=i(S);r.data.bgActivePosistion&&(r.redrawHint("select",!0),r.redraw()),r.hoverData.tapholdCancelled=!0,r.data.bgActivePosistion=void 0,ve&&ve.unactivate();var me=function(Ke){return{originalEvent:S,type:Ke,position:{x:$[0],y:$[1]}}};if(r.hoverData.which===3){var De=me("cxttapend");if(ve?ve.emit(De):W.emit(De),!r.hoverData.cxtDragged){var Te=me("cxttap");ve?ve.emit(Te):W.emit(Te)}r.hoverData.cxtDragged=!1,r.hoverData.which=null}else if(r.hoverData.which===1){if(n(oe,["mouseup","tapend","vmouseup"],S,{x:$[0],y:$[1]}),!r.dragData.didDrag&&!r.hoverData.dragged&&!r.hoverData.selecting&&!r.hoverData.isOverThresholdDrag&&(n(ve,["click","tap","vclick"],S,{x:$[0],y:$[1]}),A=!1,S.timeStamp-R<=W.multiClickDebounceTime()?(P&&clearTimeout(P),A=!0,R=null,n(ve,["dblclick","dbltap","vdblclick"],S,{x:$[0],y:$[1]})):(P=setTimeout(function(){A||n(ve,["oneclick","onetap","voneclick"],S,{x:$[0],y:$[1]})},W.multiClickDebounceTime()),R=S.timeStamp)),ve==null&&!r.dragData.didDrag&&!r.hoverData.selecting&&!r.hoverData.dragged&&!i(S)&&(W.$(t).unselect(["tapunselect"]),ee.length>0&&r.redrawHint("eles",!0),r.dragData.possibleDragElements=ee=W.collection()),oe==ve&&!r.dragData.didDrag&&!r.hoverData.selecting&&oe!=null&&oe._private.selectable&&(r.hoverData.dragging||(W.selectionType()==="additive"||le?oe.selected()?oe.unselect(["tapunselect"]):oe.select(["tapselect"]):le||(W.$(t).unmerge(oe).unselect(["tapunselect"]),oe.select(["tapselect"]))),r.redrawHint("eles",!0)),r.hoverData.selecting){var fe=W.collection(r.getAllInBox(Z[0],Z[1],Z[2],Z[3]));r.redrawHint("select",!0),fe.length>0&&r.redrawHint("eles",!0),W.emit(me("boxend"));var Pe=function(Ke){return Ke.selectable()&&!Ke.selected()};W.selectionType()==="additive"||le||W.$(t).unmerge(fe).unselect(),fe.emit(me("box")).stdFilter(Pe).select().emit(me("boxselect")),r.redraw()}if(r.hoverData.dragging&&(r.hoverData.dragging=!1,r.redrawHint("select",!0),r.redrawHint("eles",!0),r.redraw()),!Z[4]){r.redrawHint("drag",!0),r.redrawHint("eles",!0);var Be=ve&&ve.grabbed();p(ee),Be&&(ve.emit(me("freeon")),ee.emit(me("free")),r.dragData.didDrag&&(ve.emit(me("dragfreeon")),ee.emit(me("dragfree"))))}}Z[4]=0,r.hoverData.down=null,r.hoverData.cxtStarted=!1,r.hoverData.draggingEles=!1,r.hoverData.selecting=!1,r.hoverData.isOverThresholdDrag=!1,r.dragData.didDrag=!1,r.hoverData.dragged=!1,r.hoverData.dragDelta=[],r.hoverData.mdownPos=null,r.hoverData.mdownGPos=null,r.hoverData.which=null}}},!1);var L=[],I=4,M,O=1e5,V=function(S,_){for(var W=0;W=I){var $=L;if(M=V($,5),!M){var Z=Math.abs($[0]);M=G($)&&Z>5}if(M)for(var oe=0;oe<$.length;oe++)O=Math.min(Math.abs($[oe]),O)}else L.push(W),_=!0;else M&&(O=Math.min(Math.abs(W),O));if(!r.scrollingPage){var ee=r.cy,ve=ee.zoom(),le=ee.pan(),me=r.projectIntoViewport(S.clientX,S.clientY),De=[me[0]*ve+le.x,me[1]*ve+le.y];if(r.hoverData.draggingEles||r.hoverData.dragging||r.hoverData.cxtStarted||k()){S.preventDefault();return}if(ee.panningEnabled()&&ee.userPanningEnabled()&&ee.zoomingEnabled()&&ee.userZoomingEnabled()){S.preventDefault(),r.data.wheelZooming=!0,clearTimeout(r.data.wheelTimeout),r.data.wheelTimeout=setTimeout(function(){r.data.wheelZooming=!1,r.redrawHint("eles",!0),r.redraw()},150);var Te;_&&Math.abs(W)>5&&(W=to(W)*5),Te=W/-250,M&&(Te/=O,Te*=3),Te=Te*r.wheelSensitivity;var fe=S.deltaMode===1;fe&&(Te*=33);var Pe=ee.zoom()*Math.pow(10,Te);S.type==="gesturechange"&&(Pe=r.gestureStartZoom*S.scale),ee.zoom({level:Pe,renderedPosition:{x:De[0],y:De[1]}}),ee.emit({type:S.type==="gesturechange"?"pinchzoom":"scrollzoom",originalEvent:S,position:{x:me[0],y:me[1]}})}}}};r.registerBinding(r.container,"wheel",N,!0),r.registerBinding(e,"scroll",function(S){r.scrollingPage=!0,clearTimeout(r.scrollingPageTimeout),r.scrollingPageTimeout=setTimeout(function(){r.scrollingPage=!1},250)},!0),r.registerBinding(r.container,"gesturestart",function(S){r.gestureStartZoom=r.cy.zoom(),r.hasTouchStarted||S.preventDefault()},!0),r.registerBinding(r.container,"gesturechange",function(X){r.hasTouchStarted||N(X)},!0),r.registerBinding(r.container,"mouseout",function(S){var _=r.projectIntoViewport(S.clientX,S.clientY);r.cy.emit({originalEvent:S,type:"mouseout",position:{x:_[0],y:_[1]}})},!1),r.registerBinding(r.container,"mouseover",function(S){var _=r.projectIntoViewport(S.clientX,S.clientY);r.cy.emit({originalEvent:S,type:"mouseover",position:{x:_[0],y:_[1]}})},!1);var F,U,Q,K,j,re,ne,J,z,q,H,Y,te,ce=function(S,_,W,$){return Math.sqrt((W-S)*(W-S)+($-_)*($-_))},Ae=function(S,_,W,$){return(W-S)*(W-S)+($-_)*($-_)},Ce;r.registerBinding(r.container,"touchstart",Ce=function(S){if(r.hasTouchStarted=!0,!!D(S)){b(),r.touchData.capture=!0,r.data.bgActivePosistion=void 0;var _=r.cy,W=r.touchData.now,$=r.touchData.earlier;if(S.touches[0]){var Z=r.projectIntoViewport(S.touches[0].clientX,S.touches[0].clientY);W[0]=Z[0],W[1]=Z[1]}if(S.touches[1]){var Z=r.projectIntoViewport(S.touches[1].clientX,S.touches[1].clientY);W[2]=Z[0],W[3]=Z[1]}if(S.touches[2]){var Z=r.projectIntoViewport(S.touches[2].clientX,S.touches[2].clientY);W[4]=Z[0],W[5]=Z[1]}var oe=function(lr){return{originalEvent:S,type:lr,position:{x:W[0],y:W[1]}}};if(S.touches[1]){r.touchData.singleTouchMoved=!0,p(r.dragData.touchDragEles);var ee=r.findContainerClientCoords();z=ee[0],q=ee[1],H=ee[2],Y=ee[3],F=S.touches[0].clientX-z,U=S.touches[0].clientY-q,Q=S.touches[1].clientX-z,K=S.touches[1].clientY-q,te=0<=F&&F<=H&&0<=Q&&Q<=H&&0<=U&&U<=Y&&0<=K&&K<=Y;var ve=_.pan(),le=_.zoom();j=ce(F,U,Q,K),re=Ae(F,U,Q,K),ne=[(F+Q)/2,(U+K)/2],J=[(ne[0]-ve.x)/le,(ne[1]-ve.y)/le];var me=200,De=me*me;if(re=1){for(var mr=r.touchData.startPosition=[null,null,null,null,null,null],Ye=0;Ye=r.touchTapThreshold2}if(_&&r.touchData.cxt){S.preventDefault();var Ye=S.touches[0].clientX-z,ir=S.touches[0].clientY-q,er=S.touches[1].clientX-z,lr=S.touches[1].clientY-q,jr=Ae(Ye,ir,er,lr),Ze=jr/re,Wr=150,$r=Wr*Wr,Ot=1.5,$a=Ot*Ot;if(Ze>=$a||jr>=$r){r.touchData.cxt=!1,r.data.bgActivePosistion=void 0,r.redrawHint("select",!0);var bt=le("cxttapend");r.touchData.start?(r.touchData.start.unactivate().emit(bt),r.touchData.start=null):$.emit(bt)}}if(_&&r.touchData.cxt){var bt=le("cxtdrag");r.data.bgActivePosistion=void 0,r.redrawHint("select",!0),r.touchData.start?r.touchData.start.emit(bt):$.emit(bt),r.touchData.start&&(r.touchData.start._private.grabbed=!1),r.touchData.cxtDragged=!0;var Er=r.findNearestElement(Z[0],Z[1],!0,!0);(!r.touchData.cxtOver||Er!==r.touchData.cxtOver)&&(r.touchData.cxtOver&&r.touchData.cxtOver.emit(le("cxtdragout")),r.touchData.cxtOver=Er,Er&&Er.emit(le("cxtdragover")))}else if(_&&S.touches[2]&&$.boxSelectionEnabled())S.preventDefault(),r.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,r.touchData.selecting||$.emit(le("boxstart")),r.touchData.selecting=!0,r.touchData.didSelect=!0,W[4]=1,!W||W.length===0||W[0]===void 0?(W[0]=(Z[0]+Z[2]+Z[4])/3,W[1]=(Z[1]+Z[3]+Z[5])/3,W[2]=(Z[0]+Z[2]+Z[4])/3+1,W[3]=(Z[1]+Z[3]+Z[5])/3+1):(W[2]=(Z[0]+Z[2]+Z[4])/3,W[3]=(Z[1]+Z[3]+Z[5])/3),r.redrawHint("select",!0),r.redraw();else if(_&&S.touches[1]&&!r.touchData.didSelect&&$.zoomingEnabled()&&$.panningEnabled()&&$.userZoomingEnabled()&&$.userPanningEnabled()){S.preventDefault(),r.data.bgActivePosistion=void 0,r.redrawHint("select",!0);var hr=r.dragData.touchDragEles;if(hr){r.redrawHint("drag",!0);for(var Cr=0;Cr0&&!r.hoverData.draggingEles&&!r.swipePanning&&r.data.bgActivePosistion!=null&&(r.data.bgActivePosistion=void 0,r.redrawHint("select",!0),r.redraw())}},!1);var ye;r.registerBinding(e,"touchcancel",ye=function(S){var _=r.touchData.start;r.touchData.capture=!1,_&&_.unactivate()});var ie,de,he,Ee;if(r.registerBinding(e,"touchend",ie=function(S){var _=r.touchData.start,W=r.touchData.capture;if(W)S.touches.length===0&&(r.touchData.capture=!1),S.preventDefault();else return;var $=r.selection;r.swipePanning=!1,r.hoverData.draggingEles=!1;var Z=r.cy,oe=Z.zoom(),ee=r.touchData.now,ve=r.touchData.earlier;if(S.touches[0]){var le=r.projectIntoViewport(S.touches[0].clientX,S.touches[0].clientY);ee[0]=le[0],ee[1]=le[1]}if(S.touches[1]){var le=r.projectIntoViewport(S.touches[1].clientX,S.touches[1].clientY);ee[2]=le[0],ee[3]=le[1]}if(S.touches[2]){var le=r.projectIntoViewport(S.touches[2].clientX,S.touches[2].clientY);ee[4]=le[0],ee[5]=le[1]}var me=function($r){return{originalEvent:S,type:$r,position:{x:ee[0],y:ee[1]}}};_&&_.unactivate();var De;if(r.touchData.cxt){if(De=me("cxttapend"),_?_.emit(De):Z.emit(De),!r.touchData.cxtDragged){var Te=me("cxttap");_?_.emit(Te):Z.emit(Te)}r.touchData.start&&(r.touchData.start._private.grabbed=!1),r.touchData.cxt=!1,r.touchData.start=null,r.redraw();return}if(!S.touches[2]&&Z.boxSelectionEnabled()&&r.touchData.selecting){r.touchData.selecting=!1;var fe=Z.collection(r.getAllInBox($[0],$[1],$[2],$[3]));$[0]=void 0,$[1]=void 0,$[2]=void 0,$[3]=void 0,$[4]=0,r.redrawHint("select",!0),Z.emit(me("boxend"));var Pe=function($r){return $r.selectable()&&!$r.selected()};fe.emit(me("box")).stdFilter(Pe).select().emit(me("boxselect")),fe.nonempty()&&r.redrawHint("eles",!0),r.redraw()}if(_?.unactivate(),S.touches[2])r.data.bgActivePosistion=void 0,r.redrawHint("select",!0);else if(!S.touches[1]){if(!S.touches[0]){if(!S.touches[0]){r.data.bgActivePosistion=void 0,r.redrawHint("select",!0);var Be=r.dragData.touchDragEles;if(_!=null){var je=_._private.grabbed;p(Be),r.redrawHint("drag",!0),r.redrawHint("eles",!0),je&&(_.emit(me("freeon")),Be.emit(me("free")),r.dragData.didDrag&&(_.emit(me("dragfreeon")),Be.emit(me("dragfree")))),n(_,["touchend","tapend","vmouseup","tapdragout"],S,{x:ee[0],y:ee[1]}),_.unactivate(),r.touchData.start=null}else{var Ke=r.findNearestElement(ee[0],ee[1],!0,!0);n(Ke,["touchend","tapend","vmouseup","tapdragout"],S,{x:ee[0],y:ee[1]})}var mr=r.touchData.startPosition[0]-ee[0],Ye=mr*mr,ir=r.touchData.startPosition[1]-ee[1],er=ir*ir,lr=Ye+er,jr=lr*oe*oe;r.touchData.singleTouchMoved||(_||Z.$(":selected").unselect(["tapunselect"]),n(_,["tap","vclick"],S,{x:ee[0],y:ee[1]}),de=!1,S.timeStamp-Ee<=Z.multiClickDebounceTime()?(he&&clearTimeout(he),de=!0,Ee=null,n(_,["dbltap","vdblclick"],S,{x:ee[0],y:ee[1]})):(he=setTimeout(function(){de||n(_,["onetap","voneclick"],S,{x:ee[0],y:ee[1]})},Z.multiClickDebounceTime()),Ee=S.timeStamp)),_!=null&&!r.dragData.didDrag&&_._private.selectable&&jr"u"){var pe=[],Se=function(S){return{clientX:S.clientX,clientY:S.clientY,force:1,identifier:S.pointerId,pageX:S.pageX,pageY:S.pageY,radiusX:S.width/2,radiusY:S.height/2,screenX:S.screenX,screenY:S.screenY,target:S.target}},Re=function(S){return{event:S,touch:Se(S)}},Oe=function(S){pe.push(Re(S))},Ne=function(S){for(var _=0;_0)return F[0]}return null},d=Object.keys(c),y=0;y0?h:wv(i,s,e,t,a,n,o,l)},checkPoint:function(e,t,a,n,i,s,o,l){l=l==="auto"?vt(n,i):l;var u=2*l;if(Zr(e,t,this.points,s,o,n,i-u,[0,-1],a)||Zr(e,t,this.points,s,o,n-u,i,[0,-1],a))return!0;var v=n/2+2*a,f=i/2+2*a,c=[s-v,o-f,s-v,o,s+v,o,s+v,o-f];return!!(Sr(e,t,c)||Dt(e,t,u,u,s+n/2-l,o+i/2-l,a)||Dt(e,t,u,u,s-n/2+l,o+i/2-l,a))}}};Qr.registerNodeShapes=function(){var r=this.nodeShapes={},e=this;this.generateEllipse(),this.generatePolygon("triangle",br(3,0)),this.generateRoundPolygon("round-triangle",br(3,0)),this.generatePolygon("rectangle",br(4,0)),r.square=r.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();{var t=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",t),this.generateRoundPolygon("round-diamond",t)}this.generatePolygon("pentagon",br(5,0)),this.generateRoundPolygon("round-pentagon",br(5,0)),this.generatePolygon("hexagon",br(6,0)),this.generateRoundPolygon("round-hexagon",br(6,0)),this.generatePolygon("heptagon",br(7,0)),this.generateRoundPolygon("round-heptagon",br(7,0)),this.generatePolygon("octagon",br(8,0)),this.generateRoundPolygon("round-octagon",br(8,0));var a=new Array(20);{var n=Ps(5,0),i=Ps(5,Math.PI/5),s=.5*(3-Math.sqrt(5));s*=1.57;for(var o=0;o=e.deqFastCost*w)break}else if(u){if(m>=e.deqCost*h||m>=e.deqAvgCost*c)break}else if(b>=e.deqNoDrawCost*ws)break;var E=e.deq(a,g,y);if(E.length>0)for(var C=0;C0&&(e.onDeqd(a,d),!u&&e.shouldRedraw(a,d,g,y)&&i())},o=e.priority||js;n.beforeRender(s,o(a))}}}},ny=(function(){function r(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:xn;ht(this,r),this.idsByKey=new Xr,this.keyForId=new Xr,this.cachesByLvl=new Xr,this.lvls=[],this.getKey=e,this.doesEleInvalidateKey=t}return gt(r,[{key:"getIdsFor",value:function(t){t==null&&$e("Can not get id list for null key");var a=this.idsByKey,n=this.idsByKey.get(t);return n||(n=new ra,a.set(t,n)),n}},{key:"addIdForKey",value:function(t,a){t!=null&&this.getIdsFor(t).add(a)}},{key:"deleteIdForKey",value:function(t,a){t!=null&&this.getIdsFor(t).delete(a)}},{key:"getNumberOfIdsForKey",value:function(t){return t==null?0:this.getIdsFor(t).size}},{key:"updateKeyMappingFor",value:function(t){var a=t.id(),n=this.keyForId.get(a),i=this.getKey(t);this.deleteIdForKey(n,a),this.addIdForKey(i,a),this.keyForId.set(a,i)}},{key:"deleteKeyMappingFor",value:function(t){var a=t.id(),n=this.keyForId.get(a);this.deleteIdForKey(n,a),this.keyForId.delete(a)}},{key:"keyHasChangedFor",value:function(t){var a=t.id(),n=this.keyForId.get(a),i=this.getKey(t);return n!==i}},{key:"isInvalid",value:function(t){return this.keyHasChangedFor(t)||this.doesEleInvalidateKey(t)}},{key:"getCachesAt",value:function(t){var a=this.cachesByLvl,n=this.lvls,i=a.get(t);return i||(i=new Xr,a.set(t,i),n.push(t)),i}},{key:"getCache",value:function(t,a){return this.getCachesAt(a).get(t)}},{key:"get",value:function(t,a){var n=this.getKey(t),i=this.getCache(n,a);return i!=null&&this.updateKeyMappingFor(t),i}},{key:"getForCachedKey",value:function(t,a){var n=this.keyForId.get(t.id()),i=this.getCache(n,a);return i}},{key:"hasCache",value:function(t,a){return this.getCachesAt(a).has(t)}},{key:"has",value:function(t,a){var n=this.getKey(t);return this.hasCache(n,a)}},{key:"setCache",value:function(t,a,n){n.key=t,this.getCachesAt(a).set(t,n)}},{key:"set",value:function(t,a,n){var i=this.getKey(t);this.setCache(i,a,n),this.updateKeyMappingFor(t)}},{key:"deleteCache",value:function(t,a){this.getCachesAt(a).delete(t)}},{key:"delete",value:function(t,a){var n=this.getKey(t);this.deleteCache(n,a)}},{key:"invalidateKey",value:function(t){var a=this;this.lvls.forEach(function(n){return a.deleteCache(t,n)})}},{key:"invalidate",value:function(t){var a=t.id(),n=this.keyForId.get(a);this.deleteKeyMappingFor(t);var i=this.doesEleInvalidateKey(t);return i&&this.invalidateKey(n),i||this.getNumberOfIdsForKey(n)===0}}])})(),Nl=25,nn=50,pn=-4,Hs=3,Sf=7.99,iy=8,sy=1024,oy=1024,uy=1024,ly=.2,vy=.8,fy=10,cy=.15,dy=.1,hy=.9,gy=.9,py=100,yy=1,Ut={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},my=cr({getKey:null,doesEleInvalidateKey:xn,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:dv,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),ba=function(e,t){var a=this;a.renderer=e,a.onDequeues=[];var n=my(t);be(a,n),a.lookup=new ny(n.getKey,n.doesEleInvalidateKey),a.setupDequeueing()},nr=ba.prototype;nr.reasons=Ut;nr.getTextureQueue=function(r){var e=this;return e.eleImgCaches=e.eleImgCaches||{},e.eleImgCaches[r]=e.eleImgCaches[r]||[]};nr.getRetiredTextureQueue=function(r){var e=this,t=e.eleImgCaches.retired=e.eleImgCaches.retired||{},a=t[r]=t[r]||[];return a};nr.getElementQueue=function(){var r=this,e=r.eleCacheQueue=r.eleCacheQueue||new Va(function(t,a){return a.reqs-t.reqs});return e};nr.getElementKeyToQueue=function(){var r=this,e=r.eleKeyToCacheQueue=r.eleKeyToCacheQueue||{};return e};nr.getElement=function(r,e,t,a,n){var i=this,s=this.renderer,o=s.cy.zoom(),l=this.lookup;if(!e||e.w===0||e.h===0||isNaN(e.w)||isNaN(e.h)||!r.visible()||r.removed()||!i.allowEdgeTxrCaching&&r.isEdge()||!i.allowParentTxrCaching&&r.isParent())return null;if(a==null&&(a=Math.ceil(ro(o*t))),a=Sf||a>Hs)return null;var u=Math.pow(2,a),v=e.h*u,f=e.w*u,c=s.eleTextBiggerThanMin(r,u);if(!this.isVisible(r,c))return null;var h=l.get(r,a);if(h&&h.invalidated&&(h.invalidated=!1,h.texture.invalidatedWidth-=h.width),h)return h;var d;if(v<=Nl?d=Nl:v<=nn?d=nn:d=Math.ceil(v/nn)*nn,v>uy||f>oy)return null;var y=i.getTextureQueue(d),g=y[y.length-2],p=function(){return i.recycleTexture(d,f)||i.addTexture(d,f)};g||(g=y[y.length-1]),g||(g=p()),g.width-g.usedWidtha;B--)k=i.getElement(r,e,t,B,Ut.downscale);D()}else return i.queueElement(r,C.level-1),C;else{var P;if(!b&&!w&&!E)for(var A=a-1;A>=pn;A--){var R=l.get(r,A);if(R){P=R;break}}if(m(P))return i.queueElement(r,a),P;g.context.translate(g.usedWidth,0),g.context.scale(u,u),this.drawElement(g.context,r,e,c,!1),g.context.scale(1/u,1/u),g.context.translate(-g.usedWidth,0)}return h={x:g.usedWidth,texture:g,level:a,scale:u,width:f,height:v,scaledLabelShown:c},g.usedWidth+=Math.ceil(f+iy),g.eleCaches.push(h),l.set(r,a,h),i.checkTextureFullness(g),h};nr.invalidateElements=function(r){for(var e=0;e=ly*r.width&&this.retireTexture(r)};nr.checkTextureFullness=function(r){var e=this,t=e.getTextureQueue(r.height);r.usedWidth/r.width>vy&&r.fullnessChecks>=fy?lt(t,r):r.fullnessChecks++};nr.retireTexture=function(r){var e=this,t=r.height,a=e.getTextureQueue(t),n=this.lookup;lt(a,r),r.retired=!0;for(var i=r.eleCaches,s=0;s=e)return s.retired=!1,s.usedWidth=0,s.invalidatedWidth=0,s.fullnessChecks=0,eo(s.eleCaches),s.context.setTransform(1,0,0,1,0,0),s.context.clearRect(0,0,s.width,s.height),lt(n,s),a.push(s),s}};nr.queueElement=function(r,e){var t=this,a=t.getElementQueue(),n=t.getElementKeyToQueue(),i=this.getKey(r),s=n[i];if(s)s.level=Math.max(s.level,e),s.eles.merge(r),s.reqs++,a.updateItem(s);else{var o={eles:r.spawn().merge(r),level:e,reqs:1,key:i};a.push(o),n[i]=o}};nr.dequeue=function(r){for(var e=this,t=e.getElementQueue(),a=e.getElementKeyToQueue(),n=[],i=e.lookup,s=0;s0;s++){var o=t.pop(),l=o.key,u=o.eles[0],v=i.hasCache(u,o.level);if(a[l]=null,v)continue;n.push(o);var f=e.getBoundingBox(u);e.getElement(u,f,r,o.level,Ut.dequeue)}return n};nr.removeFromQueue=function(r){var e=this,t=e.getElementQueue(),a=e.getElementKeyToQueue(),n=this.getKey(r),i=a[n];i!=null&&(i.eles.length===1?(i.reqs=Js,t.updateItem(i),t.pop(),a[n]=null):i.eles.unmerge(r))};nr.onDequeue=function(r){this.onDequeues.push(r)};nr.offDequeue=function(r){lt(this.onDequeues,r)};nr.setupDequeueing=Tf.setupDequeueing({deqRedrawThreshold:py,deqCost:cy,deqAvgCost:dy,deqNoDrawCost:hy,deqFastCost:gy,deq:function(e,t,a){return e.dequeue(t,a)},onDeqd:function(e,t){for(var a=0;a=wy||t>Pn)return null}a.validateLayersElesOrdering(t,r);var l=a.layersByLevel,u=Math.pow(2,t),v=l[t]=l[t]||[],f,c=a.levelIsComplete(t,r),h,d=function(){var D=function(L){if(a.validateLayersElesOrdering(L,r),a.levelIsComplete(L,r))return h=l[L],!0},B=function(L){if(!h)for(var I=t+L;xa<=I&&I<=Pn&&!D(I);I+=L);};B(1),B(-1);for(var P=v.length-1;P>=0;P--){var A=v[P];A.invalid&<(v,A)}};if(!c)d();else return v;var y=function(){if(!f){f=wr();for(var D=0;DFl||A>Fl)return null;var R=P*A;if(R>By)return null;var L=a.makeLayer(f,t);if(B!=null){var I=v.indexOf(B)+1;v.splice(I,0,L)}else(D.insert===void 0||D.insert)&&v.unshift(L);return L};if(a.skipping&&!o)return null;for(var p=null,m=r.length/by,b=!o,w=0;w=m||!bv(p.bb,E.boundingBox()))&&(p=g({insert:!0,after:p}),!p))return null;h||b?a.queueLayer(p,E):a.drawEleInLayer(p,E,t,e),p.eles.push(E),x[t]=p}return h||(b?null:v)};dr.getEleLevelForLayerLevel=function(r,e){return r};dr.drawEleInLayer=function(r,e,t,a){var n=this,i=this.renderer,s=r.context,o=e.boundingBox();o.w===0||o.h===0||!e.visible()||(t=n.getEleLevelForLayerLevel(t,a),i.setImgSmoothing(s,!1),i.drawCachedElement(s,e,null,null,t,Py),i.setImgSmoothing(s,!0))};dr.levelIsComplete=function(r,e){var t=this,a=t.layersByLevel[r];if(!a||a.length===0)return!1;for(var n=0,i=0;i0||s.invalid)return!1;n+=s.eles.length}return n===e.length};dr.validateLayersElesOrdering=function(r,e){var t=this.layersByLevel[r];if(t)for(var a=0;a0){e=!0;break}}return e};dr.invalidateElements=function(r){var e=this;r.length!==0&&(e.lastInvalidationTime=Yr(),!(r.length===0||!e.haveLayers())&&e.updateElementsInLayers(r,function(a,n,i){e.invalidateLayer(a)}))};dr.invalidateLayer=function(r){if(this.lastInvalidationTime=Yr(),!r.invalid){var e=r.level,t=r.eles,a=this.layersByLevel[e];lt(a,r),r.elesQueue=[],r.invalid=!0,r.replacement&&(r.replacement.invalid=!0);for(var n=0;n3&&arguments[3]!==void 0?arguments[3]:!0,n=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,i=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,o=e._private.rscratch;if(!(i&&!e.visible())&&!(o.badLine||o.allpts==null||isNaN(o.allpts[0]))){var l;t&&(l=t,r.translate(-l.x1,-l.y1));var u=i?e.pstyle("opacity").value:1,v=i?e.pstyle("line-opacity").value:1,f=e.pstyle("curve-style").value,c=e.pstyle("line-style").value,h=e.pstyle("width").pfValue,d=e.pstyle("line-cap").value,y=e.pstyle("line-outline-width").value,g=e.pstyle("line-outline-color").value,p=u*v,m=u*v,b=function(){var L=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p;f==="straight-triangle"?(s.eleStrokeStyle(r,e,L),s.drawEdgeTrianglePath(e,r,o.allpts)):(r.lineWidth=h,r.lineCap=d,s.eleStrokeStyle(r,e,L),s.drawEdgePath(e,r,o.allpts,c),r.lineCap="butt")},w=function(){var L=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p;if(r.lineWidth=h+y,r.lineCap=d,y>0)s.colorStrokeStyle(r,g[0],g[1],g[2],L);else{r.lineCap="butt";return}f==="straight-triangle"?s.drawEdgeTrianglePath(e,r,o.allpts):(s.drawEdgePath(e,r,o.allpts,c),r.lineCap="butt")},E=function(){n&&s.drawEdgeOverlay(r,e)},C=function(){n&&s.drawEdgeUnderlay(r,e)},x=function(){var L=arguments.length>0&&arguments[0]!==void 0?arguments[0]:m;s.drawArrowheads(r,e,L)},T=function(){s.drawElementText(r,e,null,a)};r.lineJoin="round";var k=e.pstyle("ghost").value==="yes";if(k){var D=e.pstyle("ghost-offset-x").pfValue,B=e.pstyle("ghost-offset-y").pfValue,P=e.pstyle("ghost-opacity").value,A=p*P;r.translate(D,B),b(A),x(A),r.translate(-D,-B)}else w();C(),b(),x(),E(),T(),t&&r.translate(l.x1,l.y1)}};var Bf=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,a){if(a.visible()){var n=a.pstyle("".concat(e,"-opacity")).value;if(n!==0){var i=this,s=i.usePaths(),o=a._private.rscratch,l=a.pstyle("".concat(e,"-padding")).pfValue,u=2*l,v=a.pstyle("".concat(e,"-color")).value;t.lineWidth=u,o.edgeType==="self"&&!s?t.lineCap="butt":t.lineCap="round",i.colorStrokeStyle(t,v[0],v[1],v[2],n),i.drawEdgePath(a,t,o.allpts,"solid")}}}};Jr.drawEdgeOverlay=Bf("overlay");Jr.drawEdgeUnderlay=Bf("underlay");Jr.drawEdgePath=function(r,e,t,a){var n=r._private.rscratch,i=e,s,o=!1,l=this.usePaths(),u=r.pstyle("line-dash-pattern").pfValue,v=r.pstyle("line-dash-offset").pfValue;if(l){var f=t.join("$"),c=n.pathCacheKey&&n.pathCacheKey===f;c?(s=e=n.pathCache,o=!0):(s=e=new Path2D,n.pathCacheKey=f,n.pathCache=s)}if(i.setLineDash)switch(a){case"dotted":i.setLineDash([1,1]);break;case"dashed":i.setLineDash(u),i.lineDashOffset=v;break;case"solid":i.setLineDash([]);break}if(!o&&!n.badLine)switch(e.beginPath&&e.beginPath(),e.moveTo(t[0],t[1]),n.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var h=2;h+35&&arguments[5]!==void 0?arguments[5]:!0,s=this;if(a==null){if(i&&!s.eleTextBiggerThanMin(e))return}else if(a===!1)return;if(e.isNode()){var o=e.pstyle("label");if(!o||!o.value)return;var l=s.getLabelJustification(e);r.textAlign=l,r.textBaseline="bottom"}else{var u=e.element()._private.rscratch.badLine,v=e.pstyle("label"),f=e.pstyle("source-label"),c=e.pstyle("target-label");if(u||(!v||!v.value)&&(!f||!f.value)&&(!c||!c.value))return;r.textAlign="center",r.textBaseline="bottom"}var h=!t,d;t&&(d=t,r.translate(-d.x1,-d.y1)),n==null?(s.drawText(r,e,null,h,i),e.isEdge()&&(s.drawText(r,e,"source",h,i),s.drawText(r,e,"target",h,i))):s.drawText(r,e,n,h,i),t&&r.translate(d.x1,d.y1)};It.getFontCache=function(r){var e;this.fontCaches=this.fontCaches||[];for(var t=0;t2&&arguments[2]!==void 0?arguments[2]:!0,a=e.pstyle("font-style").strValue,n=e.pstyle("font-size").pfValue+"px",i=e.pstyle("font-family").strValue,s=e.pstyle("font-weight").strValue,o=t?e.effectiveOpacity()*e.pstyle("text-opacity").value:1,l=e.pstyle("text-outline-opacity").value*o,u=e.pstyle("color").value,v=e.pstyle("text-outline-color").value;r.font=a+" "+s+" "+n+" "+i,r.lineJoin="round",this.colorFillStyle(r,u[0],u[1],u[2],o),this.colorStrokeStyle(r,v[0],v[1],v[2],l)};function qy(r,e,t,a,n){var i=Math.min(a,n),s=i/2,o=e+a/2,l=t+n/2;r.beginPath(),r.arc(o,l,s,0,Math.PI*2),r.closePath()}function Gl(r,e,t,a,n){var i=arguments.length>5&&arguments[5]!==void 0?arguments[5]:5,s=Math.min(i,a/2,n/2);r.beginPath(),r.moveTo(e+s,t),r.lineTo(e+a-s,t),r.quadraticCurveTo(e+a,t,e+a,t+s),r.lineTo(e+a,t+n-s),r.quadraticCurveTo(e+a,t+n,e+a-s,t+n),r.lineTo(e+s,t+n),r.quadraticCurveTo(e,t+n,e,t+n-s),r.lineTo(e,t+s),r.quadraticCurveTo(e,t,e+s,t),r.closePath()}It.getTextAngle=function(r,e){var t,a=r._private,n=a.rscratch,i=e?e+"-":"",s=r.pstyle(i+"text-rotation");if(s.strValue==="autorotate"){var o=Tr(n,"labelAngle",e);t=r.isEdge()?o:0}else s.strValue==="none"?t=0:t=s.pfValue;return t};It.drawText=function(r,e,t){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,n=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,i=e._private,s=i.rscratch,o=n?e.effectiveOpacity():1;if(!(n&&(o===0||e.pstyle("text-opacity").value===0))){t==="main"&&(t=null);var l=Tr(s,"labelX",t),u=Tr(s,"labelY",t),v,f,c=this.getLabelText(e,t);if(c!=null&&c!==""&&!isNaN(l)&&!isNaN(u)){this.setupTextStyle(r,e,n);var h=t?t+"-":"",d=Tr(s,"labelWidth",t),y=Tr(s,"labelHeight",t),g=e.pstyle(h+"text-margin-x").pfValue,p=e.pstyle(h+"text-margin-y").pfValue,m=e.isEdge(),b=e.pstyle("text-halign").value,w=e.pstyle("text-valign").value;m&&(b="center",w="center"),l+=g,u+=p;var E;switch(a?E=this.getTextAngle(e,t):E=0,E!==0&&(v=l,f=u,r.translate(v,f),r.rotate(E),l=0,u=0),w){case"top":break;case"center":u+=y/2;break;case"bottom":u+=y;break}var C=e.pstyle("text-background-opacity").value,x=e.pstyle("text-border-opacity").value,T=e.pstyle("text-border-width").pfValue,k=e.pstyle("text-background-padding").pfValue,D=e.pstyle("text-background-shape").strValue,B=D==="round-rectangle"||D==="roundrectangle",P=D==="circle",A=2;if(C>0||T>0&&x>0){var R=r.fillStyle,L=r.strokeStyle,I=r.lineWidth,M=e.pstyle("text-background-color").value,O=e.pstyle("text-border-color").value,V=e.pstyle("text-border-style").value,G=C>0,N=T>0&&x>0,F=l-k;switch(b){case"left":F-=d;break;case"center":F-=d/2;break}var U=u-y-k,Q=d+2*k,K=y+2*k;if(G&&(r.fillStyle="rgba(".concat(M[0],",").concat(M[1],",").concat(M[2],",").concat(C*o,")")),N&&(r.strokeStyle="rgba(".concat(O[0],",").concat(O[1],",").concat(O[2],",").concat(x*o,")"),r.lineWidth=T,r.setLineDash))switch(V){case"dotted":r.setLineDash([1,1]);break;case"dashed":r.setLineDash([4,2]);break;case"double":r.lineWidth=T/4,r.setLineDash([]);break;default:r.setLineDash([]);break}if(B?(r.beginPath(),Gl(r,F,U,Q,K,A)):P?(r.beginPath(),qy(r,F,U,Q,K)):(r.beginPath(),r.rect(F,U,Q,K)),G&&r.fill(),N&&r.stroke(),N&&V==="double"){var j=T/2;r.beginPath(),B?Gl(r,F+j,U+j,Q-2*j,K-2*j,A):r.rect(F+j,U+j,Q-2*j,K-2*j),r.stroke()}r.fillStyle=R,r.strokeStyle=L,r.lineWidth=I,r.setLineDash&&r.setLineDash([])}var re=2*e.pstyle("text-outline-width").pfValue;if(re>0&&(r.lineWidth=re),e.pstyle("text-wrap").value==="wrap"){var ne=Tr(s,"labelWrapCachedLines",t),J=Tr(s,"labelLineHeight",t),z=d/2,q=this.getLabelJustification(e);switch(q==="auto"||(b==="left"?q==="left"?l+=-d:q==="center"&&(l+=-z):b==="center"?q==="left"?l+=-z:q==="right"&&(l+=z):b==="right"&&(q==="center"?l+=z:q==="right"&&(l+=d))),w){case"top":u-=(ne.length-1)*J;break;case"center":case"bottom":u-=(ne.length-1)*J;break}for(var H=0;H0&&r.strokeText(ne[H],l,u),r.fillText(ne[H],l,u),u+=J}else re>0&&r.strokeText(c,l,u),r.fillText(c,l,u);E!==0&&(r.rotate(-E),r.translate(-v,-f))}}};var yt={};yt.drawNode=function(r,e,t){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,n=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,i=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,o,l,u=e._private,v=u.rscratch,f=e.position();if(!(!ae(f.x)||!ae(f.y))&&!(i&&!e.visible())){var c=i?e.effectiveOpacity():1,h=s.usePaths(),d,y=!1,g=e.padding();o=e.width()+2*g,l=e.height()+2*g;var p;t&&(p=t,r.translate(-p.x1,-p.y1));for(var m=e.pstyle("background-image"),b=m.value,w=new Array(b.length),E=new Array(b.length),C=0,x=0;x0&&arguments[0]!==void 0?arguments[0]:A;s.eleFillStyle(r,e,ue)},J=function(){var ue=arguments.length>0&&arguments[0]!==void 0?arguments[0]:N;s.colorStrokeStyle(r,R[0],R[1],R[2],ue)},z=function(){var ue=arguments.length>0&&arguments[0]!==void 0?arguments[0]:K;s.colorStrokeStyle(r,U[0],U[1],U[2],ue)},q=function(ue,X,S,_){var W=s.nodePathCache=s.nodePathCache||[],$=cv(S==="polygon"?S+","+_.join(","):S,""+X,""+ue,""+re),Z=W[$],oe,ee=!1;return Z!=null?(oe=Z,ee=!0,v.pathCache=oe):(oe=new Path2D,W[$]=v.pathCache=oe),{path:oe,cacheHit:ee}},H=e.pstyle("shape").strValue,Y=e.pstyle("shape-polygon-points").pfValue;if(h){r.translate(f.x,f.y);var te=q(o,l,H,Y);d=te.path,y=te.cacheHit}var ce=function(){if(!y){var ue=f;h&&(ue={x:0,y:0}),s.nodeShapes[s.getNodeShape(e)].draw(d||r,ue.x,ue.y,o,l,re,v)}h?r.fill(d):r.fill()},Ae=function(){for(var ue=arguments.length>0&&arguments[0]!==void 0?arguments[0]:c,X=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,S=u.backgrounding,_=0,W=0;W0&&arguments[0]!==void 0?arguments[0]:!1,X=arguments.length>1&&arguments[1]!==void 0?arguments[1]:c;s.hasPie(e)&&(s.drawPie(r,e,X),ue&&(h||s.nodeShapes[s.getNodeShape(e)].draw(r,f.x,f.y,o,l,re,v)))},we=function(){var ue=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,X=arguments.length>1&&arguments[1]!==void 0?arguments[1]:c;s.hasStripe(e)&&(r.save(),h?r.clip(v.pathCache):(s.nodeShapes[s.getNodeShape(e)].draw(r,f.x,f.y,o,l,re,v),r.clip()),s.drawStripe(r,e,X),r.restore(),ue&&(h||s.nodeShapes[s.getNodeShape(e)].draw(r,f.x,f.y,o,l,re,v)))},ye=function(){var ue=arguments.length>0&&arguments[0]!==void 0?arguments[0]:c,X=(B>0?B:-B)*ue,S=B>0?0:255;B!==0&&(s.colorFillStyle(r,S,S,S,X),h?r.fill(d):r.fill())},ie=function(){if(P>0){if(r.lineWidth=P,r.lineCap=M,r.lineJoin=I,r.setLineDash)switch(L){case"dotted":r.setLineDash([1,1]);break;case"dashed":r.setLineDash(V),r.lineDashOffset=G;break;case"solid":case"double":r.setLineDash([]);break}if(O!=="center"){if(r.save(),r.lineWidth*=2,O==="inside")h?r.clip(d):r.clip();else{var ue=new Path2D;ue.rect(-o/2-P,-l/2-P,o+2*P,l+2*P),ue.addPath(d),r.clip(ue,"evenodd")}h?r.stroke(d):r.stroke(),r.restore()}else h?r.stroke(d):r.stroke();if(L==="double"){r.lineWidth=P/3;var X=r.globalCompositeOperation;r.globalCompositeOperation="destination-out",h?r.stroke(d):r.stroke(),r.globalCompositeOperation=X}r.setLineDash&&r.setLineDash([])}},de=function(){if(F>0){if(r.lineWidth=F,r.lineCap="butt",r.setLineDash)switch(Q){case"dotted":r.setLineDash([1,1]);break;case"dashed":r.setLineDash([4,2]);break;case"solid":case"double":r.setLineDash([]);break}var ue=f;h&&(ue={x:0,y:0});var X=s.getNodeShape(e),S=P;O==="inside"&&(S=0),O==="outside"&&(S*=2);var _=(o+S+(F+j))/o,W=(l+S+(F+j))/l,$=o*_,Z=l*W,oe=s.nodeShapes[X].points,ee;if(h){var ve=q($,Z,X,oe);ee=ve.path}if(X==="ellipse")s.drawEllipsePath(ee||r,ue.x,ue.y,$,Z);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(X)){var le=0,me=0,De=0;X==="round-diamond"?le=(S+j+F)*1.4:X==="round-heptagon"?(le=(S+j+F)*1.075,De=-(S/2+j+F)/35):X==="round-hexagon"?le=(S+j+F)*1.12:X==="round-pentagon"?(le=(S+j+F)*1.13,De=-(S/2+j+F)/15):X==="round-tag"?(le=(S+j+F)*1.12,me=(S/2+F+j)*.07):X==="round-triangle"&&(le=(S+j+F)*(Math.PI/2),De=-(S+j/2+F)/Math.PI),le!==0&&(_=(o+le)/o,$=o*_,["round-hexagon","round-tag"].includes(X)||(W=(l+le)/l,Z=l*W)),re=re==="auto"?Ev($,Z):re;for(var Te=$/2,fe=Z/2,Pe=re+(S+F+j)/2,Be=new Array(oe.length/2),je=new Array(oe.length/2),Ke=0;Ke0){if(n=n||a.position(),i==null||s==null){var h=a.padding();i=a.width()+2*h,s=a.height()+2*h}o.colorFillStyle(t,v[0],v[1],v[2],u),o.nodeShapes[f].draw(t,n.x,n.y,i+l*2,s+l*2,c),t.fill()}}}};yt.drawNodeOverlay=Pf("overlay");yt.drawNodeUnderlay=Pf("underlay");yt.hasPie=function(r){return r=r[0],r._private.hasPie};yt.hasStripe=function(r){return r=r[0],r._private.hasStripe};yt.drawPie=function(r,e,t,a){e=e[0],a=a||e.position();var n=e.cy().style(),i=e.pstyle("pie-size"),s=e.pstyle("pie-hole"),o=e.pstyle("pie-start-angle").pfValue,l=a.x,u=a.y,v=e.width(),f=e.height(),c=Math.min(v,f)/2,h,d=0,y=this.usePaths();if(y&&(l=0,u=0),i.units==="%"?c=c*i.pfValue:i.pfValue!==void 0&&(c=i.pfValue/2),s.units==="%"?h=c*s.pfValue:s.pfValue!==void 0&&(h=s.pfValue/2),!(h>=c))for(var g=1;g<=n.pieBackgroundN;g++){var p=e.pstyle("pie-"+g+"-background-size").value,m=e.pstyle("pie-"+g+"-background-color").value,b=e.pstyle("pie-"+g+"-background-opacity").value*t,w=p/100;w+d>1&&(w=1-d);var E=1.5*Math.PI+2*Math.PI*d;E+=o;var C=2*Math.PI*w,x=E+C;p===0||d>=1||d+w>1||(h===0?(r.beginPath(),r.moveTo(l,u),r.arc(l,u,c,E,x),r.closePath()):(r.beginPath(),r.arc(l,u,c,E,x),r.arc(l,u,h,x,E,!0),r.closePath()),this.colorFillStyle(r,m[0],m[1],m[2],b),r.fill(),d+=w)}};yt.drawStripe=function(r,e,t,a){e=e[0],a=a||e.position();var n=e.cy().style(),i=a.x,s=a.y,o=e.width(),l=e.height(),u=0,v=this.usePaths();r.save();var f=e.pstyle("stripe-direction").value,c=e.pstyle("stripe-size");switch(f){case"vertical":break;case"righward":r.rotate(-Math.PI/2);break}var h=o,d=l;c.units==="%"?(h=h*c.pfValue,d=d*c.pfValue):c.pfValue!==void 0&&(h=c.pfValue,d=c.pfValue),v&&(i=0,s=0),s-=h/2,i-=d/2;for(var y=1;y<=n.stripeBackgroundN;y++){var g=e.pstyle("stripe-"+y+"-background-size").value,p=e.pstyle("stripe-"+y+"-background-color").value,m=e.pstyle("stripe-"+y+"-background-opacity").value*t,b=g/100;b+u>1&&(b=1-u),!(g===0||u>=1||u+b>1)&&(r.beginPath(),r.rect(i,s+d*u,h,d*b),r.closePath(),this.colorFillStyle(r,p[0],p[1],p[2],m),r.fill(),u+=b)}r.restore()};var xr={},_y=100;xr.getPixelRatio=function(){var r=this.data.contexts[0];if(this.forcedPixelRatio!=null)return this.forcedPixelRatio;var e=this.cy.window(),t=r.backingStorePixelRatio||r.webkitBackingStorePixelRatio||r.mozBackingStorePixelRatio||r.msBackingStorePixelRatio||r.oBackingStorePixelRatio||r.backingStorePixelRatio||1;return(e.devicePixelRatio||1)/t};xr.paintCache=function(r){for(var e=this.paintCaches=this.paintCaches||[],t=!0,a,n=0;ne.minMbLowQualFrames&&(e.motionBlurPxRatio=e.mbPxRBlurry)),e.clearingMotionBlur&&(e.motionBlurPxRatio=1),e.textureDrawLastFrame&&!f&&(v[e.NODE]=!0,v[e.SELECT_BOX]=!0);var m=t.style(),b=t.zoom(),w=s!==void 0?s:b,E=t.pan(),C={x:E.x,y:E.y},x={zoom:b,pan:{x:E.x,y:E.y}},T=e.prevViewport,k=T===void 0||x.zoom!==T.zoom||x.pan.x!==T.pan.x||x.pan.y!==T.pan.y;!k&&!(y&&!d)&&(e.motionBlurPxRatio=1),o&&(C=o),w*=l,C.x*=l,C.y*=l;var D=e.getCachedZSortedEles();function B(J,z,q,H,Y){var te=J.globalCompositeOperation;J.globalCompositeOperation="destination-out",e.colorFillStyle(J,255,255,255,e.motionBlurTransparency),J.fillRect(z,q,H,Y),J.globalCompositeOperation=te}function P(J,z){var q,H,Y,te;!e.clearingMotionBlur&&(J===u.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]||J===u.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG])?(q={x:E.x*h,y:E.y*h},H=b*h,Y=e.canvasWidth*h,te=e.canvasHeight*h):(q=C,H=w,Y=e.canvasWidth,te=e.canvasHeight),J.setTransform(1,0,0,1,0,0),z==="motionBlur"?B(J,0,0,Y,te):!a&&(z===void 0||z)&&J.clearRect(0,0,Y,te),n||(J.translate(q.x,q.y),J.scale(H,H)),o&&J.translate(o.x,o.y),s&&J.scale(s,s)}if(f||(e.textureDrawLastFrame=!1),f){if(e.textureDrawLastFrame=!0,!e.textureCache){e.textureCache={},e.textureCache.bb=t.mutableElements().boundingBox(),e.textureCache.texture=e.data.bufferCanvases[e.TEXTURE_BUFFER];var A=e.data.bufferContexts[e.TEXTURE_BUFFER];A.setTransform(1,0,0,1,0,0),A.clearRect(0,0,e.canvasWidth*e.textureMult,e.canvasHeight*e.textureMult),e.render({forcedContext:A,drawOnlyNodeLayer:!0,forcedPxRatio:l*e.textureMult});var x=e.textureCache.viewport={zoom:t.zoom(),pan:t.pan(),width:e.canvasWidth,height:e.canvasHeight};x.mpan={x:(0-x.pan.x)/x.zoom,y:(0-x.pan.y)/x.zoom}}v[e.DRAG]=!1,v[e.NODE]=!1;var R=u.contexts[e.NODE],L=e.textureCache.texture,x=e.textureCache.viewport;R.setTransform(1,0,0,1,0,0),c?B(R,0,0,x.width,x.height):R.clearRect(0,0,x.width,x.height);var I=m.core("outside-texture-bg-color").value,M=m.core("outside-texture-bg-opacity").value;e.colorFillStyle(R,I[0],I[1],I[2],M),R.fillRect(0,0,x.width,x.height);var b=t.zoom();P(R,!1),R.clearRect(x.mpan.x,x.mpan.y,x.width/x.zoom/l,x.height/x.zoom/l),R.drawImage(L,x.mpan.x,x.mpan.y,x.width/x.zoom/l,x.height/x.zoom/l)}else e.textureOnViewport&&!a&&(e.textureCache=null);var O=t.extent(),V=e.pinching||e.hoverData.dragging||e.swipePanning||e.data.wheelZooming||e.hoverData.draggingEles||e.cy.animated(),G=e.hideEdgesOnViewport&&V,N=[];if(N[e.NODE]=!v[e.NODE]&&c&&!e.clearedForMotionBlur[e.NODE]||e.clearingMotionBlur,N[e.NODE]&&(e.clearedForMotionBlur[e.NODE]=!0),N[e.DRAG]=!v[e.DRAG]&&c&&!e.clearedForMotionBlur[e.DRAG]||e.clearingMotionBlur,N[e.DRAG]&&(e.clearedForMotionBlur[e.DRAG]=!0),v[e.NODE]||n||i||N[e.NODE]){var F=c&&!N[e.NODE]&&h!==1,R=a||(F?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]:u.contexts[e.NODE]),U=c&&!F?"motionBlur":void 0;P(R,U),G?e.drawCachedNodes(R,D.nondrag,l,O):e.drawLayeredElements(R,D.nondrag,l,O),e.debug&&e.drawDebugPoints(R,D.nondrag),!n&&!c&&(v[e.NODE]=!1)}if(!i&&(v[e.DRAG]||n||N[e.DRAG])){var F=c&&!N[e.DRAG]&&h!==1,R=a||(F?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG]:u.contexts[e.DRAG]);P(R,c&&!F?"motionBlur":void 0),G?e.drawCachedNodes(R,D.drag,l,O):e.drawCachedElements(R,D.drag,l,O),e.debug&&e.drawDebugPoints(R,D.drag),!n&&!c&&(v[e.DRAG]=!1)}if(this.drawSelectionRectangle(r,P),c&&h!==1){var Q=u.contexts[e.NODE],K=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_NODE],j=u.contexts[e.DRAG],re=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_DRAG],ne=function(z,q,H){z.setTransform(1,0,0,1,0,0),H||!p?z.clearRect(0,0,e.canvasWidth,e.canvasHeight):B(z,0,0,e.canvasWidth,e.canvasHeight);var Y=h;z.drawImage(q,0,0,e.canvasWidth*Y,e.canvasHeight*Y,0,0,e.canvasWidth,e.canvasHeight)};(v[e.NODE]||N[e.NODE])&&(ne(Q,K,N[e.NODE]),v[e.NODE]=!1),(v[e.DRAG]||N[e.DRAG])&&(ne(j,re,N[e.DRAG]),v[e.DRAG]=!1)}e.prevViewport=x,e.clearingMotionBlur&&(e.clearingMotionBlur=!1,e.motionBlurCleared=!0,e.motionBlur=!0),c&&(e.motionBlurTimeout=setTimeout(function(){e.motionBlurTimeout=null,e.clearedForMotionBlur[e.NODE]=!1,e.clearedForMotionBlur[e.DRAG]=!1,e.motionBlur=!1,e.clearingMotionBlur=!f,e.mbFrames=0,v[e.NODE]=!0,v[e.DRAG]=!0,e.redraw()},_y)),a||t.emit("render")};var ha;xr.drawSelectionRectangle=function(r,e){var t=this,a=t.cy,n=t.data,i=a.style(),s=r.drawOnlyNodeLayer,o=r.drawAllLayers,l=n.canvasNeedsRedraw,u=r.forcedContext;if(t.showFps||!s&&l[t.SELECT_BOX]&&!o){var v=u||n.contexts[t.SELECT_BOX];if(e(v),t.selection[4]==1&&(t.hoverData.selecting||t.touchData.selecting)){var f=t.cy.zoom(),c=i.core("selection-box-border-width").value/f;v.lineWidth=c,v.fillStyle="rgba("+i.core("selection-box-color").value[0]+","+i.core("selection-box-color").value[1]+","+i.core("selection-box-color").value[2]+","+i.core("selection-box-opacity").value+")",v.fillRect(t.selection[0],t.selection[1],t.selection[2]-t.selection[0],t.selection[3]-t.selection[1]),c>0&&(v.strokeStyle="rgba("+i.core("selection-box-border-color").value[0]+","+i.core("selection-box-border-color").value[1]+","+i.core("selection-box-border-color").value[2]+","+i.core("selection-box-opacity").value+")",v.strokeRect(t.selection[0],t.selection[1],t.selection[2]-t.selection[0],t.selection[3]-t.selection[1]))}if(n.bgActivePosistion&&!t.hoverData.selecting){var f=t.cy.zoom(),h=n.bgActivePosistion;v.fillStyle="rgba("+i.core("active-bg-color").value[0]+","+i.core("active-bg-color").value[1]+","+i.core("active-bg-color").value[2]+","+i.core("active-bg-opacity").value+")",v.beginPath(),v.arc(h.x,h.y,i.core("active-bg-size").pfValue/f,0,2*Math.PI),v.fill()}var d=t.lastRedrawTime;if(t.showFps&&d){d=Math.round(d);var y=Math.round(1e3/d),g="1 frame = "+d+" ms = "+y+" fps";if(v.setTransform(1,0,0,1,0,0),v.fillStyle="rgba(255, 0, 0, 0.75)",v.strokeStyle="rgba(255, 0, 0, 0.75)",v.font="30px Arial",!ha){var p=v.measureText(g);ha=p.actualBoundingBoxAscent}v.fillText(g,0,ha);var m=60;v.strokeRect(0,ha+10,250,20),v.fillRect(0,ha+10,250*Math.min(y/m,1),20)}o||(l[t.SELECT_BOX]=!1)}};function Hl(r,e,t){var a=r.createShader(e);if(r.shaderSource(a,t),r.compileShader(a),!r.getShaderParameter(a,r.COMPILE_STATUS))throw new Error(r.getShaderInfoLog(a));return a}function Gy(r,e,t){var a=Hl(r,r.VERTEX_SHADER,e),n=Hl(r,r.FRAGMENT_SHADER,t),i=r.createProgram();if(r.attachShader(i,a),r.attachShader(i,n),r.linkProgram(i),!r.getProgramParameter(i,r.LINK_STATUS))throw new Error("Could not initialize shaders");return i}function Hy(r,e,t){t===void 0&&(t=e);var a=r.makeOffscreenCanvas(e,t),n=a.context=a.getContext("2d");return a.clear=function(){return n.clearRect(0,0,a.width,a.height)},a.clear(),a}function bo(r){var e=r.pixelRatio,t=r.cy.zoom(),a=r.cy.pan();return{zoom:t*e,pan:{x:a.x*e,y:a.y*e}}}function Wy(r){var e=r.pixelRatio,t=r.cy.zoom();return t*e}function $y(r,e,t,a,n){var i=a*t+e.x,s=n*t+e.y;return s=Math.round(r.canvasHeight-s),[i,s]}function Uy(r){return r.pstyle("background-fill").value!=="solid"||r.pstyle("background-image").strValue!=="none"?!1:r.pstyle("border-width").value===0||r.pstyle("border-opacity").value===0?!0:r.pstyle("border-style").value==="solid"}function Ky(r,e){if(r.length!==e.length)return!1;for(var t=0;t>0&255)/255,t[1]=(r>>8&255)/255,t[2]=(r>>16&255)/255,t[3]=(r>>24&255)/255,t}function Xy(r){return r[0]+(r[1]<<8)+(r[2]<<16)+(r[3]<<24)}function Yy(r,e){var t=r.createTexture();return t.buffer=function(a){r.bindTexture(r.TEXTURE_2D,t),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR_MIPMAP_NEAREST),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,a),r.generateMipmap(r.TEXTURE_2D),r.bindTexture(r.TEXTURE_2D,null)},t.deleteTexture=function(){r.deleteTexture(t)},t}function Af(r,e){switch(e){case"float":return[1,r.FLOAT,4];case"vec2":return[2,r.FLOAT,4];case"vec3":return[3,r.FLOAT,4];case"vec4":return[4,r.FLOAT,4];case"int":return[1,r.INT,4];case"ivec2":return[2,r.INT,4]}}function Rf(r,e,t){switch(e){case r.FLOAT:return new Float32Array(t);case r.INT:return new Int32Array(t)}}function Zy(r,e,t,a,n,i){switch(e){case r.FLOAT:return new Float32Array(t.buffer,i*a,n);case r.INT:return new Int32Array(t.buffer,i*a,n)}}function Qy(r,e,t,a){var n=Af(r,e),i=Je(n,2),s=i[0],o=i[1],l=Rf(r,o,a),u=r.createBuffer();return r.bindBuffer(r.ARRAY_BUFFER,u),r.bufferData(r.ARRAY_BUFFER,l,r.STATIC_DRAW),o===r.FLOAT?r.vertexAttribPointer(t,s,o,!1,0,0):o===r.INT&&r.vertexAttribIPointer(t,s,o,0,0),r.enableVertexAttribArray(t),r.bindBuffer(r.ARRAY_BUFFER,null),u}function Fr(r,e,t,a){var n=Af(r,t),i=Je(n,3),s=i[0],o=i[1],l=i[2],u=Rf(r,o,e*s),v=s*l,f=r.createBuffer();r.bindBuffer(r.ARRAY_BUFFER,f),r.bufferData(r.ARRAY_BUFFER,e*v,r.DYNAMIC_DRAW),r.enableVertexAttribArray(a),o===r.FLOAT?r.vertexAttribPointer(a,s,o,!1,v,0):o===r.INT&&r.vertexAttribIPointer(a,s,o,v,0),r.vertexAttribDivisor(a,1),r.bindBuffer(r.ARRAY_BUFFER,null);for(var c=new Array(e),h=0;hs&&(o=s/a,l=a*o,u=n*o),{scale:o,texW:l,texH:u}}},{key:"draw",value:function(t,a,n){var i=this;if(this.locked)throw new Error("can't draw, atlas is locked");var s=this.texSize,o=this.texRows,l=this.texHeight,u=this.getScale(a),v=u.scale,f=u.texW,c=u.texH,h=function(b,w){if(n&&w){var E=w.context,C=b.x,x=b.row,T=C,k=l*x;E.save(),E.translate(T,k),E.scale(v,v),n(E,a),E.restore()}},d=[null,null],y=function(){h(i.freePointer,i.canvas),d[0]={x:i.freePointer.x,y:i.freePointer.row*l,w:f,h:c},d[1]={x:i.freePointer.x+f,y:i.freePointer.row*l,w:0,h:c},i.freePointer.x+=f,i.freePointer.x==s&&(i.freePointer.x=0,i.freePointer.row++)},g=function(){var b=i.scratch,w=i.canvas;b.clear(),h({x:0,row:0},b);var E=s-i.freePointer.x,C=f-E,x=l;{var T=i.freePointer.x,k=i.freePointer.row*l,D=E;w.context.drawImage(b,0,0,D,x,T,k,D,x),d[0]={x:T,y:k,w:D,h:c}}{var B=E,P=(i.freePointer.row+1)*l,A=C;w&&w.context.drawImage(b,B,0,A,x,0,P,A,x),d[1]={x:0,y:P,w:A,h:c}}i.freePointer.x=C,i.freePointer.row++},p=function(){i.freePointer.x=0,i.freePointer.row++};if(this.freePointer.x+f<=s)y();else{if(this.freePointer.row>=o-1)return!1;this.freePointer.x===s?(p(),y()):this.enableWrapping?g():(p(),y())}return this.keyToLocation.set(t,d),this.needsBuffer=!0,d}},{key:"getOffsets",value:function(t){return this.keyToLocation.get(t)}},{key:"isEmpty",value:function(){return this.freePointer.x===0&&this.freePointer.row===0}},{key:"canFit",value:function(t){if(this.locked)return!1;var a=this.texSize,n=this.texRows,i=this.getScale(t),s=i.texW;return this.freePointer.x+s>a?this.freePointer.row1&&arguments[1]!==void 0?arguments[1]:{},i=n.forceRedraw,s=i===void 0?!1:i,o=n.filterEle,l=o===void 0?function(){return!0}:o,u=n.filterType,v=u===void 0?function(){return!0}:u,f=!1,c=!1,h=kr(t),d;try{for(h.s();!(d=h.n()).done;){var y=d.value;if(l(y)){var g=kr(this.renderTypes.values()),p;try{var m=function(){var w=p.value,E=w.type;if(v(E)){var C=a.collections.get(w.collection),x=w.getKey(y),T=Array.isArray(x)?x:[x];if(s)T.forEach(function(P){return C.markKeyForGC(P)}),c=!0;else{var k=w.getID?w.getID(y):y.id(),D=a._key(E,k),B=a.typeAndIdToKey.get(D);B!==void 0&&!Ky(T,B)&&(f=!0,a.typeAndIdToKey.delete(D),B.forEach(function(P){return C.markKeyForGC(P)}))}}};for(g.s();!(p=g.n()).done;)m()}catch(b){g.e(b)}finally{g.f()}}}}catch(b){h.e(b)}finally{h.f()}return c&&(this.gc(),f=!1),f}},{key:"gc",value:function(){var t=kr(this.collections.values()),a;try{for(t.s();!(a=t.n()).done;){var n=a.value;n.gc()}}catch(i){t.e(i)}finally{t.f()}}},{key:"getOrCreateAtlas",value:function(t,a,n,i){var s=this.renderTypes.get(a),o=this.collections.get(s.collection),l=!1,u=o.draw(i,n,function(c){s.drawClipped?(c.save(),c.beginPath(),c.rect(0,0,n.w,n.h),c.clip(),s.drawElement(c,t,n,!0,!0),c.restore()):s.drawElement(c,t,n,!0,!0),l=!0});if(l){var v=s.getID?s.getID(t):t.id(),f=this._key(a,v);this.typeAndIdToKey.has(f)?this.typeAndIdToKey.get(f).push(i):this.typeAndIdToKey.set(f,[i])}return u}},{key:"getAtlasInfo",value:function(t,a){var n=this,i=this.renderTypes.get(a),s=i.getKey(t),o=Array.isArray(s)?s:[s];return o.map(function(l){var u=i.getBoundingBox(t,l),v=n.getOrCreateAtlas(t,a,u,l),f=v.getOffsets(l),c=Je(f,2),h=c[0],d=c[1];return{atlas:v,tex:h,tex1:h,tex2:d,bb:u}})}},{key:"getDebugInfo",value:function(){var t=[],a=kr(this.collections),n;try{for(a.s();!(n=a.n()).done;){var i=Je(n.value,2),s=i[0],o=i[1],l=o.getCounts(),u=l.keyCount,v=l.atlasCount;t.push({type:s,keyCount:u,atlasCount:v})}}catch(f){a.e(f)}finally{a.f()}return t}}])})(),sm=(function(){function r(e){ht(this,r),this.globalOptions=e,this.atlasSize=e.webglTexSize,this.maxAtlasesPerBatch=e.webglTexPerBatch,this.batchAtlases=[]}return gt(r,[{key:"getMaxAtlasesPerBatch",value:function(){return this.maxAtlasesPerBatch}},{key:"getAtlasSize",value:function(){return this.atlasSize}},{key:"getIndexArray",value:function(){return Array.from({length:this.maxAtlasesPerBatch},function(t,a){return a})}},{key:"startBatch",value:function(){this.batchAtlases=[]}},{key:"getAtlasCount",value:function(){return this.batchAtlases.length}},{key:"getAtlases",value:function(){return this.batchAtlases}},{key:"canAddToCurrentBatch",value:function(t){return this.batchAtlases.length===this.maxAtlasesPerBatch?this.batchAtlases.includes(t):!0}},{key:"getAtlasIndexForBatch",value:function(t){var a=this.batchAtlases.indexOf(t);if(a<0){if(this.batchAtlases.length===this.maxAtlasesPerBatch)throw new Error("cannot add more atlases to batch");this.batchAtlases.push(t),a=this.batchAtlases.length-1}return a}}])})(),om=` - float circleSD(vec2 p, float r) { - return distance(vec2(0), p) - r; // signed distance - } -`,um=` - float rectangleSD(vec2 p, vec2 b) { - vec2 d = abs(p)-b; - return distance(vec2(0),max(d,0.0)) + min(max(d.x,d.y),0.0); - } -`,lm=` - float roundRectangleSD(vec2 p, vec2 b, vec4 cr) { - cr.xy = (p.x > 0.0) ? cr.xy : cr.zw; - cr.x = (p.y > 0.0) ? cr.x : cr.y; - vec2 q = abs(p) - b + cr.x; - return min(max(q.x, q.y), 0.0) + distance(vec2(0), max(q, 0.0)) - cr.x; - } -`,vm=` - float ellipseSD(vec2 p, vec2 ab) { - p = abs( p ); // symmetry - - // find root with Newton solver - vec2 q = ab*(p-ab); - float w = (q.x1.0) ? d : -d; - } -`,Ea={SCREEN:{name:"screen",screen:!0},PICKING:{name:"picking",picking:!0}},An={IGNORE:1,USE_BB:2},Cs=0,Kl=1,Xl=2,Ts=3,Gt=4,sn=5,ga=6,pa=7,fm=(function(){function r(e,t,a){ht(this,r),this.r=e,this.gl=t,this.maxInstances=a.webglBatchSize,this.atlasSize=a.webglTexSize,this.bgColor=a.bgColor,this.debug=a.webglDebug,this.batchDebugInfo=[],a.enableWrapping=!0,a.createTextureCanvas=Hy,this.atlasManager=new im(e,a),this.batchManager=new sm(a),this.simpleShapeOptions=new Map,this.program=this._createShaderProgram(Ea.SCREEN),this.pickingProgram=this._createShaderProgram(Ea.PICKING),this.vao=this._createVAO()}return gt(r,[{key:"addAtlasCollection",value:function(t,a){this.atlasManager.addAtlasCollection(t,a)}},{key:"addTextureAtlasRenderType",value:function(t,a){this.atlasManager.addRenderType(t,a)}},{key:"addSimpleShapeRenderType",value:function(t,a){this.simpleShapeOptions.set(t,a)}},{key:"invalidate",value:function(t){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=a.type,i=this.atlasManager;return n?i.invalidate(t,{filterType:function(o){return o===n},forceRedraw:!0}):i.invalidate(t)}},{key:"gc",value:function(){this.atlasManager.gc()}},{key:"_createShaderProgram",value:function(t){var a=this.gl,n=`#version 300 es - precision highp float; - - uniform mat3 uPanZoomMatrix; - uniform int uAtlasSize; - - // instanced - in vec2 aPosition; // a vertex from the unit square - - in mat3 aTransform; // used to transform verticies, eg into a bounding box - in int aVertType; // the type of thing we are rendering - - // the z-index that is output when using picking mode - in vec4 aIndex; - - // For textures - in int aAtlasId; // which shader unit/atlas to use - in vec4 aTex; // x/y/w/h of texture in atlas - - // for edges - in vec4 aPointAPointB; - in vec4 aPointCPointD; - in vec2 aLineWidth; // also used for node border width - - // simple shapes - in vec4 aCornerRadius; // for round-rectangle [top-right, bottom-right, top-left, bottom-left] - in vec4 aColor; // also used for edges - in vec4 aBorderColor; // aLineWidth is used for border width - - // output values passed to the fragment shader - out vec2 vTexCoord; - out vec4 vColor; - out vec2 vPosition; - // flat values are not interpolated - flat out int vAtlasId; - flat out int vVertType; - flat out vec2 vTopRight; - flat out vec2 vBotLeft; - flat out vec4 vCornerRadius; - flat out vec4 vBorderColor; - flat out vec2 vBorderWidth; - flat out vec4 vIndex; - - void main(void) { - int vid = gl_VertexID; - vec2 position = aPosition; // TODO make this a vec3, simplifies some code below - - if(aVertType == `.concat(Cs,`) { - float texX = aTex.x; // texture coordinates - float texY = aTex.y; - float texW = aTex.z; - float texH = aTex.w; - - if(vid == 1 || vid == 2 || vid == 4) { - texX += texW; - } - if(vid == 2 || vid == 4 || vid == 5) { - texY += texH; - } - - float d = float(uAtlasSize); - vTexCoord = vec2(texX / d, texY / d); // tex coords must be between 0 and 1 - - gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); - } - else if(aVertType == `).concat(Gt," || aVertType == ").concat(pa,` - || aVertType == `).concat(sn," || aVertType == ").concat(ga,`) { // simple shapes - - // the bounding box is needed by the fragment shader - vBotLeft = (aTransform * vec3(0, 0, 1)).xy; // flat - vTopRight = (aTransform * vec3(1, 1, 1)).xy; // flat - vPosition = (aTransform * vec3(position, 1)).xy; // will be interpolated - - // calculations are done in the fragment shader, just pass these along - vColor = aColor; - vCornerRadius = aCornerRadius; - vBorderColor = aBorderColor; - vBorderWidth = aLineWidth; - - gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); - } - else if(aVertType == `).concat(Kl,`) { - vec2 source = aPointAPointB.xy; - vec2 target = aPointAPointB.zw; - - // adjust the geometry so that the line is centered on the edge - position.y = position.y - 0.5; - - // stretch the unit square into a long skinny rectangle - vec2 xBasis = target - source; - vec2 yBasis = normalize(vec2(-xBasis.y, xBasis.x)); - vec2 point = source + xBasis * position.x + yBasis * aLineWidth[0] * position.y; - - gl_Position = vec4(uPanZoomMatrix * vec3(point, 1.0), 1.0); - vColor = aColor; - } - else if(aVertType == `).concat(Xl,`) { - vec2 pointA = aPointAPointB.xy; - vec2 pointB = aPointAPointB.zw; - vec2 pointC = aPointCPointD.xy; - vec2 pointD = aPointCPointD.zw; - - // adjust the geometry so that the line is centered on the edge - position.y = position.y - 0.5; - - vec2 p0, p1, p2, pos; - if(position.x == 0.0) { // The left side of the unit square - p0 = pointA; - p1 = pointB; - p2 = pointC; - pos = position; - } else { // The right side of the unit square, use same approach but flip the geometry upside down - p0 = pointD; - p1 = pointC; - p2 = pointB; - pos = vec2(0.0, -position.y); - } - - vec2 p01 = p1 - p0; - vec2 p12 = p2 - p1; - vec2 p21 = p1 - p2; - - // Find the normal vector. - vec2 tangent = normalize(normalize(p12) + normalize(p01)); - vec2 normal = vec2(-tangent.y, tangent.x); - - // Find the vector perpendicular to p0 -> p1. - vec2 p01Norm = normalize(vec2(-p01.y, p01.x)); - - // Determine the bend direction. - float sigma = sign(dot(p01 + p21, normal)); - float width = aLineWidth[0]; - - if(sign(pos.y) == -sigma) { - // This is an intersecting vertex. Adjust the position so that there's no overlap. - vec2 point = 0.5 * width * normal * -sigma / dot(normal, p01Norm); - gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); - } else { - // This is a non-intersecting vertex. Treat it like a mitre join. - vec2 point = 0.5 * width * normal * sigma * dot(normal, p01Norm); - gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); - } - - vColor = aColor; - } - else if(aVertType == `).concat(Ts,` && vid < 3) { - // massage the first triangle into an edge arrow - if(vid == 0) - position = vec2(-0.15, -0.3); - if(vid == 1) - position = vec2( 0.0, 0.0); - if(vid == 2) - position = vec2( 0.15, -0.3); - - gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); - vColor = aColor; - } - else { - gl_Position = vec4(2.0, 0.0, 0.0, 1.0); // discard vertex by putting it outside webgl clip space - } - - vAtlasId = aAtlasId; - vVertType = aVertType; - vIndex = aIndex; - } - `),i=this.batchManager.getIndexArray(),s=`#version 300 es - precision highp float; - - // declare texture unit for each texture atlas in the batch - `.concat(i.map(function(u){return"uniform sampler2D uTexture".concat(u,";")}).join(` - `),` - - uniform vec4 uBGColor; - uniform float uZoom; - - in vec2 vTexCoord; - in vec4 vColor; - in vec2 vPosition; // model coordinates - - flat in int vAtlasId; - flat in vec4 vIndex; - flat in int vVertType; - flat in vec2 vTopRight; - flat in vec2 vBotLeft; - flat in vec4 vCornerRadius; - flat in vec4 vBorderColor; - flat in vec2 vBorderWidth; - - out vec4 outColor; - - `).concat(om,` - `).concat(um,` - `).concat(lm,` - `).concat(vm,` - - vec4 blend(vec4 top, vec4 bot) { // blend colors with premultiplied alpha - return vec4( - top.rgb + (bot.rgb * (1.0 - top.a)), - top.a + (bot.a * (1.0 - top.a)) - ); - } - - vec4 distInterp(vec4 cA, vec4 cB, float d) { // interpolate color using Signed Distance - // scale to the zoom level so that borders don't look blurry when zoomed in - // note 1.5 is an aribitrary value chosen because it looks good - return mix(cA, cB, 1.0 - smoothstep(0.0, 1.5 / uZoom, abs(d))); - } - - void main(void) { - if(vVertType == `).concat(Cs,`) { - // look up the texel from the texture unit - `).concat(i.map(function(u){return"if(vAtlasId == ".concat(u,") outColor = texture(uTexture").concat(u,", vTexCoord);")}).join(` - else `),` - } - else if(vVertType == `).concat(Ts,`) { - // mimics how canvas renderer uses context.globalCompositeOperation = 'destination-out'; - outColor = blend(vColor, uBGColor); - outColor.a = 1.0; // make opaque, masks out line under arrow - } - else if(vVertType == `).concat(Gt,` && vBorderWidth == vec2(0.0)) { // simple rectangle with no border - outColor = vColor; // unit square is already transformed to the rectangle, nothing else needs to be done - } - else if(vVertType == `).concat(Gt," || vVertType == ").concat(pa,` - || vVertType == `).concat(sn," || vVertType == ").concat(ga,`) { // use SDF - - float outerBorder = vBorderWidth[0]; - float innerBorder = vBorderWidth[1]; - float borderPadding = outerBorder * 2.0; - float w = vTopRight.x - vBotLeft.x - borderPadding; - float h = vTopRight.y - vBotLeft.y - borderPadding; - vec2 b = vec2(w/2.0, h/2.0); // half width, half height - vec2 p = vPosition - vec2(vTopRight.x - b[0] - outerBorder, vTopRight.y - b[1] - outerBorder); // translate to center - - float d; // signed distance - if(vVertType == `).concat(Gt,`) { - d = rectangleSD(p, b); - } else if(vVertType == `).concat(pa,` && w == h) { - d = circleSD(p, b.x); // faster than ellipse - } else if(vVertType == `).concat(pa,`) { - d = ellipseSD(p, b); - } else { - d = roundRectangleSD(p, b, vCornerRadius.wzyx); - } - - // use the distance to interpolate a color to smooth the edges of the shape, doesn't need multisampling - // we must smooth colors inwards, because we can't change pixels outside the shape's bounding box - if(d > 0.0) { - if(d > outerBorder) { - discard; - } else { - outColor = distInterp(vBorderColor, vec4(0), d - outerBorder); - } - } else { - if(d > innerBorder) { - vec4 outerColor = outerBorder == 0.0 ? vec4(0) : vBorderColor; - vec4 innerBorderColor = blend(vBorderColor, vColor); - outColor = distInterp(innerBorderColor, outerColor, d); - } - else { - vec4 outerColor; - if(innerBorder == 0.0 && outerBorder == 0.0) { - outerColor = vec4(0); - } else if(innerBorder == 0.0) { - outerColor = vBorderColor; - } else { - outerColor = blend(vBorderColor, vColor); - } - outColor = distInterp(vColor, outerColor, d - innerBorder); - } - } - } - else { - outColor = vColor; - } - - `).concat(t.picking?`if(outColor.a == 0.0) discard; - else outColor = vIndex;`:"",` - } - `),o=Gy(a,n,s);o.aPosition=a.getAttribLocation(o,"aPosition"),o.aIndex=a.getAttribLocation(o,"aIndex"),o.aVertType=a.getAttribLocation(o,"aVertType"),o.aTransform=a.getAttribLocation(o,"aTransform"),o.aAtlasId=a.getAttribLocation(o,"aAtlasId"),o.aTex=a.getAttribLocation(o,"aTex"),o.aPointAPointB=a.getAttribLocation(o,"aPointAPointB"),o.aPointCPointD=a.getAttribLocation(o,"aPointCPointD"),o.aLineWidth=a.getAttribLocation(o,"aLineWidth"),o.aColor=a.getAttribLocation(o,"aColor"),o.aCornerRadius=a.getAttribLocation(o,"aCornerRadius"),o.aBorderColor=a.getAttribLocation(o,"aBorderColor"),o.uPanZoomMatrix=a.getUniformLocation(o,"uPanZoomMatrix"),o.uAtlasSize=a.getUniformLocation(o,"uAtlasSize"),o.uBGColor=a.getUniformLocation(o,"uBGColor"),o.uZoom=a.getUniformLocation(o,"uZoom"),o.uTextures=[];for(var l=0;l1&&arguments[1]!==void 0?arguments[1]:Ea.SCREEN;this.panZoomMatrix=t,this.renderTarget=a,this.batchDebugInfo=[],this.wrappedCount=0,this.simpleCount=0,this.startBatch()}},{key:"startBatch",value:function(){this.instanceCount=0,this.batchManager.startBatch()}},{key:"endFrame",value:function(){this.endBatch()}},{key:"_isVisible",value:function(t,a){return t.visible()?a&&a.isVisible?a.isVisible(t):!0:!1}},{key:"drawTexture",value:function(t,a,n){var i=this.atlasManager,s=this.batchManager,o=i.getRenderTypeOpts(n);if(this._isVisible(t,o)&&!(t.isEdge()&&!this._isValidEdge(t))){if(this.renderTarget.picking&&o.getTexPickingMode){var l=o.getTexPickingMode(t);if(l===An.IGNORE)return;if(l==An.USE_BB){this.drawPickingRectangle(t,a,n);return}}var u=i.getAtlasInfo(t,n),v=kr(u),f;try{for(v.s();!(f=v.n()).done;){var c=f.value,h=c.atlas,d=c.tex1,y=c.tex2;s.canAddToCurrentBatch(h)||this.endBatch();for(var g=s.getAtlasIndexForBatch(h),p=0,m=[[d,!0],[y,!1]];p=this.maxInstances&&this.endBatch()}}}}catch(B){v.e(B)}finally{v.f()}}}},{key:"setTransformMatrix",value:function(t,a,n,i){var s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,o=0;if(n.shapeProps&&n.shapeProps.padding&&(o=t.pstyle(n.shapeProps.padding).pfValue),i){var l=i.bb,u=i.tex1,v=i.tex2,f=u.w/(u.w+v.w);s||(f=1-f);var c=this._getAdjustedBB(l,o,s,f);this._applyTransformMatrix(a,c,n,t)}else{var h=n.getBoundingBox(t),d=this._getAdjustedBB(h,o,!0,1);this._applyTransformMatrix(a,d,n,t)}}},{key:"_applyTransformMatrix",value:function(t,a,n,i){var s,o;$l(t);var l=n.getRotation?n.getRotation(i):0;if(l!==0){var u=n.getRotationPoint(i),v=u.x,f=u.y;yn(t,t,[v,f]),Ul(t,t,l);var c=n.getRotationOffset(i);s=c.x+(a.xOffset||0),o=c.y+(a.yOffset||0)}else s=a.x1,o=a.y1;yn(t,t,[s,o]),Ws(t,t,[a.w,a.h])}},{key:"_getAdjustedBB",value:function(t,a,n,i){var s=t.x1,o=t.y1,l=t.w,u=t.h,v=t.yOffset;a&&(s-=a,o-=a,l+=2*a,u+=2*a);var f=0,c=l*i;return n&&i<1?l=c:!n&&i<1&&(f=l-c,s+=f,l=c),{x1:s,y1:o,w:l,h:u,xOffset:f,yOffset:v}}},{key:"drawPickingRectangle",value:function(t,a,n){var i=this.atlasManager.getRenderTypeOpts(n),s=this.instanceCount;this.vertTypeBuffer.getView(s)[0]=Gt;var o=this.indexBuffer.getView(s);_t(a,o);var l=this.colorBuffer.getView(s);xt([0,0,0],1,l);var u=this.transformBuffer.getMatrixView(s);this.setTransformMatrix(t,u,i),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}},{key:"drawNode",value:function(t,a,n){var i=this.simpleShapeOptions.get(n);if(this._isVisible(t,i)){var s=i.shapeProps,o=this._getVertTypeForShape(t,s.shape);if(o===void 0||i.isSimple&&!i.isSimple(t)){this.drawTexture(t,a,n);return}var l=this.instanceCount;if(this.vertTypeBuffer.getView(l)[0]=o,o===sn||o===ga){var u=i.getBoundingBox(t),v=this._getCornerRadius(t,s.radius,u),f=this.cornerRadiusBuffer.getView(l);f[0]=v,f[1]=v,f[2]=v,f[3]=v,o===ga&&(f[0]=0,f[2]=0)}var c=this.indexBuffer.getView(l);_t(a,c);var h=t.pstyle(s.color).value,d=t.pstyle(s.opacity).value,y=this.colorBuffer.getView(l);xt(h,d,y);var g=this.lineWidthBuffer.getView(l);if(g[0]=0,g[1]=0,s.border){var p=t.pstyle("border-width").value;if(p>0){var m=t.pstyle("border-color").value,b=t.pstyle("border-opacity").value,w=this.borderColorBuffer.getView(l);xt(m,b,w);var E=t.pstyle("border-position").value;if(E==="inside")g[0]=0,g[1]=-p;else if(E==="outside")g[0]=p,g[1]=0;else{var C=p/2;g[0]=C,g[1]=-C}}}var x=this.transformBuffer.getMatrixView(l);this.setTransformMatrix(t,x,i),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}},{key:"_getVertTypeForShape",value:function(t,a){var n=t.pstyle(a).value;switch(n){case"rectangle":return Gt;case"ellipse":return pa;case"roundrectangle":case"round-rectangle":return sn;case"bottom-round-rectangle":return ga;default:return}}},{key:"_getCornerRadius",value:function(t,a,n){var i=n.w,s=n.h;if(t.pstyle(a).value==="auto")return vt(i,s);var o=t.pstyle(a).pfValue,l=i/2,u=s/2;return Math.min(o,u,l)}},{key:"drawEdgeArrow",value:function(t,a,n){if(t.visible()){var i=t._private.rscratch,s,o,l;if(n==="source"?(s=i.arrowStartX,o=i.arrowStartY,l=i.srcArrowAngle):(s=i.arrowEndX,o=i.arrowEndY,l=i.tgtArrowAngle),!(isNaN(s)||s==null||isNaN(o)||o==null||isNaN(l)||l==null)){var u=t.pstyle(n+"-arrow-shape").value;if(u!=="none"){var v=t.pstyle(n+"-arrow-color").value,f=t.pstyle("opacity").value,c=t.pstyle("line-opacity").value,h=f*c,d=t.pstyle("width").pfValue,y=t.pstyle("arrow-scale").value,g=this.r.getArrowWidth(d,y),p=this.instanceCount,m=this.transformBuffer.getMatrixView(p);$l(m),yn(m,m,[s,o]),Ws(m,m,[g,g]),Ul(m,m,l),this.vertTypeBuffer.getView(p)[0]=Ts;var b=this.indexBuffer.getView(p);_t(a,b);var w=this.colorBuffer.getView(p);xt(v,h,w),this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}}},{key:"drawEdgeLine",value:function(t,a){if(t.visible()){var n=this._getEdgePoints(t);if(n){var i=t.pstyle("opacity").value,s=t.pstyle("line-opacity").value,o=t.pstyle("width").pfValue,l=t.pstyle("line-color").value,u=i*s;if(n.length/2+this.instanceCount>this.maxInstances&&this.endBatch(),n.length==4){var v=this.instanceCount;this.vertTypeBuffer.getView(v)[0]=Kl;var f=this.indexBuffer.getView(v);_t(a,f);var c=this.colorBuffer.getView(v);xt(l,u,c);var h=this.lineWidthBuffer.getView(v);h[0]=o;var d=this.pointAPointBBuffer.getView(v);d[0]=n[0],d[1]=n[1],d[2]=n[2],d[3]=n[3],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}else for(var y=0;y=this.maxInstances&&this.endBatch()}}}}},{key:"_isValidEdge",value:function(t){var a=t._private.rscratch;return!(a.badLine||a.allpts==null||isNaN(a.allpts[0]))}},{key:"_getEdgePoints",value:function(t){var a=t._private.rscratch;if(this._isValidEdge(t)){var n=a.allpts;if(n.length==4)return n;var i=this._getNumSegments(t);return this._getCurveSegmentPoints(n,i)}}},{key:"_getNumSegments",value:function(t){var a=15;return Math.min(Math.max(a,5),this.maxInstances)}},{key:"_getCurveSegmentPoints",value:function(t,a){if(t.length==4)return t;for(var n=Array((a+1)*2),i=0;i<=a;i++)if(i==0)n[0]=t[0],n[1]=t[1];else if(i==a)n[i*2]=t[t.length-2],n[i*2+1]=t[t.length-1];else{var s=i/a;this._setCurvePoint(t,s,n,i*2)}return n}},{key:"_setCurvePoint",value:function(t,a,n,i){if(t.length<=2)n[i]=t[0],n[i+1]=t[1];else{for(var s=Array(t.length-2),o=0;o0}},o=function(f){var c=f.pstyle("text-events").strValue==="yes";return c?An.USE_BB:An.IGNORE},l=function(f){var c=f.position(),h=c.x,d=c.y,y=f.outerWidth(),g=f.outerHeight();return{w:y,h:g,x1:h-y/2,y1:d-g/2}};t.drawing.addAtlasCollection("node",{texRows:r.webglTexRowsNodes}),t.drawing.addAtlasCollection("label",{texRows:r.webglTexRows}),t.drawing.addTextureAtlasRenderType("node-body",{collection:"node",getKey:e.getStyleKey,getBoundingBox:e.getElementBox,drawElement:e.drawElement}),t.drawing.addSimpleShapeRenderType("node-body",{getBoundingBox:l,isSimple:Uy,shapeProps:{shape:"shape",color:"background-color",opacity:"background-opacity",radius:"corner-radius",border:!0}}),t.drawing.addSimpleShapeRenderType("node-overlay",{getBoundingBox:l,isVisible:s("overlay"),shapeProps:{shape:"overlay-shape",color:"overlay-color",opacity:"overlay-opacity",padding:"overlay-padding",radius:"overlay-corner-radius"}}),t.drawing.addSimpleShapeRenderType("node-underlay",{getBoundingBox:l,isVisible:s("underlay"),shapeProps:{shape:"underlay-shape",color:"underlay-color",opacity:"underlay-opacity",padding:"underlay-padding",radius:"underlay-corner-radius"}}),t.drawing.addTextureAtlasRenderType("label",{collection:"label",getTexPickingMode:o,getKey:Ss(e.getLabelKey,null),getBoundingBox:ks(e.getLabelBox,null),drawClipped:!0,drawElement:e.drawLabel,getRotation:n(null),getRotationPoint:e.getLabelRotationPoint,getRotationOffset:e.getLabelRotationOffset,isVisible:i("label")}),t.drawing.addTextureAtlasRenderType("edge-source-label",{collection:"label",getTexPickingMode:o,getKey:Ss(e.getSourceLabelKey,"source"),getBoundingBox:ks(e.getSourceLabelBox,"source"),drawClipped:!0,drawElement:e.drawSourceLabel,getRotation:n("source"),getRotationPoint:e.getSourceLabelRotationPoint,getRotationOffset:e.getSourceLabelRotationOffset,isVisible:i("source-label")}),t.drawing.addTextureAtlasRenderType("edge-target-label",{collection:"label",getTexPickingMode:o,getKey:Ss(e.getTargetLabelKey,"target"),getBoundingBox:ks(e.getTargetLabelBox,"target"),drawClipped:!0,drawElement:e.drawTargetLabel,getRotation:n("target"),getRotationPoint:e.getTargetLabelRotationPoint,getRotationOffset:e.getTargetLabelRotationOffset,isVisible:i("target-label")});var u=Fa(function(){console.log("garbage collect flag set"),t.data.gc=!0},1e4);t.onUpdateEleCalcs(function(v,f){var c=!1;f&&f.length>0&&(c|=t.drawing.invalidate(f)),c&&u()}),dm(t)};function cm(r){var e=r.cy.container(),t=e&&e.style&&e.style.backgroundColor||"white";return iv(t)}function Lf(r,e){var t=r._private.rscratch;return Tr(t,"labelWrapCachedLines",e)||[]}var Ss=function(e,t){return function(a){var n=e(a),i=Lf(a,t);return i.length>1?i.map(function(s,o){return"".concat(n,"_").concat(o)}):n}},ks=function(e,t){return function(a,n){var i=e(a);if(typeof n=="string"){var s=n.indexOf("_");if(s>0){var o=Number(n.substring(s+1)),l=Lf(a,t),u=i.h/l.length,v=u*o,f=i.y1+v;return{x1:i.x1,w:i.w,y1:f,h:u,yOffset:v}}}return i}};function dm(r){{var e=r.render;r.render=function(i){i=i||{};var s=r.cy;r.webgl&&(s.zoom()>Sf?(hm(r),e.call(r,i)):(gm(r),Of(r,i,Ea.SCREEN)))}}{var t=r.matchCanvasSize;r.matchCanvasSize=function(i){t.call(r,i),r.pickingFrameBuffer.setFramebufferAttachmentSizes(r.canvasWidth,r.canvasHeight),r.pickingFrameBuffer.needsDraw=!0}}r.findNearestElements=function(i,s,o,l){return xm(r,i,s)};{var a=r.invalidateCachedZSortedEles;r.invalidateCachedZSortedEles=function(){a.call(r),r.pickingFrameBuffer.needsDraw=!0}}{var n=r.notify;r.notify=function(i,s){n.call(r,i,s),i==="viewport"||i==="bounds"?r.pickingFrameBuffer.needsDraw=!0:i==="background"&&r.drawing.invalidate(s,{type:"node-body"})}}}function hm(r){var e=r.data.contexts[r.WEBGL];e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}function gm(r){var e=function(a){a.save(),a.setTransform(1,0,0,1,0,0),a.clearRect(0,0,r.canvasWidth,r.canvasHeight),a.restore()};e(r.data.contexts[r.NODE]),e(r.data.contexts[r.DRAG])}function pm(r){var e=r.canvasWidth,t=r.canvasHeight,a=bo(r),n=a.pan,i=a.zoom,s=Es();yn(s,s,[n.x,n.y]),Ws(s,s,[i,i]);var o=Es();rm(o,e,t);var l=Es();return em(l,o,s),l}function If(r,e){var t=r.canvasWidth,a=r.canvasHeight,n=bo(r),i=n.pan,s=n.zoom;e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t,a),e.translate(i.x,i.y),e.scale(s,s)}function ym(r,e){r.drawSelectionRectangle(e,function(t){return If(r,t)})}function mm(r){var e=r.data.contexts[r.NODE];e.save(),If(r,e),e.strokeStyle="rgba(0, 0, 0, 0.3)",e.beginPath(),e.moveTo(-1e3,0),e.lineTo(1e3,0),e.stroke(),e.beginPath(),e.moveTo(0,-1e3),e.lineTo(0,1e3),e.stroke(),e.restore()}function bm(r){var e=function(n,i,s){for(var o=n.atlasManager.getAtlasCollection(i),l=r.data.contexts[r.NODE],u=o.atlases,v=0;v=0&&w.add(x)}return w}function xm(r,e,t){var a=wm(r,e,t),n=r.getCachedZSortedEles(),i,s,o=kr(a),l;try{for(o.s();!(l=o.n()).done;){var u=l.value,v=n[u];if(!i&&v.isNode()&&(i=v),!s&&v.isEdge()&&(s=v),i&&s)break}}catch(f){o.e(f)}finally{o.f()}return[i,s].filter(Boolean)}function Ds(r,e,t){var a=r.drawing;e+=1,t.isNode()?(a.drawNode(t,e,"node-underlay"),a.drawNode(t,e,"node-body"),a.drawTexture(t,e,"label"),a.drawNode(t,e,"node-overlay")):(a.drawEdgeLine(t,e),a.drawEdgeArrow(t,e,"source"),a.drawEdgeArrow(t,e,"target"),a.drawTexture(t,e,"label"),a.drawTexture(t,e,"edge-source-label"),a.drawTexture(t,e,"edge-target-label"))}function Of(r,e,t){var a;r.webglDebug&&(a=performance.now());var n=r.drawing,i=0;if(t.screen&&r.data.canvasNeedsRedraw[r.SELECT_BOX]&&ym(r,e),r.data.canvasNeedsRedraw[r.NODE]||t.picking){var s=r.data.contexts[r.WEBGL];t.screen?(s.clearColor(0,0,0,0),s.enable(s.BLEND),s.blendFunc(s.ONE,s.ONE_MINUS_SRC_ALPHA)):s.disable(s.BLEND),s.clear(s.COLOR_BUFFER_BIT|s.DEPTH_BUFFER_BIT),s.viewport(0,0,s.canvas.width,s.canvas.height);var o=pm(r),l=r.getCachedZSortedEles();if(i=l.length,n.startFrame(o,t),t.screen){for(var u=0;u0&&s>0){h.clearRect(0,0,i,s),h.globalCompositeOperation="source-over";var d=this.getCachedZSortedEles();if(r.full)h.translate(-a.x1*u,-a.y1*u),h.scale(u,u),this.drawElements(h,d),h.scale(1/u,1/u),h.translate(a.x1*u,a.y1*u);else{var y=e.pan(),g={x:y.x*u,y:y.y*u};u*=e.zoom(),h.translate(g.x,g.y),h.scale(u,u),this.drawElements(h,d),h.scale(1/u,1/u),h.translate(-g.x,-g.y)}r.bg&&(h.globalCompositeOperation="destination-over",h.fillStyle=r.bg,h.rect(0,0,i,s),h.fill())}return c};function Em(r,e){for(var t=atob(r),a=new ArrayBuffer(t.length),n=new Uint8Array(a),i=0;i"u"?"undefined":ar(OffscreenCanvas))!=="undefined")t=new OffscreenCanvas(r,e);else{var a=this.cy.window(),n=a.document;t=n.createElement("canvas"),t.width=r,t.height=e}return t};[Df,Hr,Jr,mo,It,yt,xr,Mf,mt,Wa,Ff].forEach(function(r){be(ke,r)});var Sm=[{name:"null",impl:df},{name:"base",impl:Cf},{name:"canvas",impl:Cm}],km=[{type:"layout",extensions:Qp},{type:"renderer",extensions:Sm}],qf={},_f={};function Gf(r,e,t){var a=t,n=function(T){Ve("Can not register `"+e+"` for `"+r+"` since `"+T+"` already exists in the prototype and can not be overridden")};if(r==="core"){if(Ra.prototype[e])return n(e);Ra.prototype[e]=t}else if(r==="collection"){if(fr.prototype[e])return n(e);fr.prototype[e]=t}else if(r==="layout"){for(var i=function(T){this.options=T,t.call(this,T),Le(this._private)||(this._private={}),this._private.cy=T.cy,this._private.listeners=[],this.createEmitter()},s=i.prototype=Object.create(t.prototype),o=[],l=0;l"u"&&(x.yylloc={});var A=x.yylloc;o.push(A);var U=x.options&&x.options.ranges;typeof T.yy.parseError=="function"?this.parseError=T.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function It(I){c.length=c.length-2*I,y.length=y.length-I,o.length=o.length-I}s(It,"popStack");function nt(){var I;return I=u.pop()||x.lex()||M,typeof I!="number"&&(I instanceof Array&&(u=I,I=u.pop()),I=a.symbols_[I]||I),I}s(nt,"lex");for(var w,Z,C,N,Jt,J,z={},O,H,rt,j;;){if(C=c[c.length-1],this.defaultActions[C]?N=this.defaultActions[C]:((w===null||typeof w>"u")&&(w=nt()),N=E[C]&&E[C][w]),typeof N>"u"||!N.length||!N[0]){var K="";j=[];for(O in E[C])this.terminals_[O]&&O>et&&j.push("'"+this.terminals_[O]+"'");x.showPosition?K="Parse error on line "+(L+1)+`: -`+x.showPosition()+` -Expecting `+j.join(", ")+", got '"+(this.terminals_[w]||w)+"'":K="Parse error on line "+(L+1)+": Unexpected "+(w==M?"end of input":"'"+(this.terminals_[w]||w)+"'"),this.parseError(K,{text:x.match,token:this.terminals_[w]||w,line:x.yylineno,loc:A,expected:j})}if(N[0]instanceof Array&&N.length>1)throw new Error("Parse Error: multiple actions possible at state: "+C+", token: "+w);switch(N[0]){case 1:c.push(w),y.push(x.yytext),o.push(x.yylloc),c.push(N[1]),w=null,Z?(w=Z,Z=null):(P=x.yyleng,b=x.yytext,L=x.yylineno,A=x.yylloc,F>0&&F--);break;case 2:if(H=this.productions_[N[1]][1],z.$=y[y.length-H],z._$={first_line:o[o.length-(H||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(H||1)].first_column,last_column:o[o.length-1].last_column},U&&(z._$.range=[o[o.length-(H||1)].range[0],o[o.length-1].range[1]]),J=this.performAction.apply(z,[b,P,L,T.yy,N[1],y,o].concat(_)),typeof J<"u")return J;H&&(c=c.slice(0,-1*H*2),y=y.slice(0,-1*H),o=o.slice(0,-1*H)),c.push(this.productions_[N[1]][0]),y.push(z.$),o.push(z._$),rt=E[c[c.length-2]][c[c.length-1]],c.push(rt);break;case 3:return!0}}return!0},"parse")},k=(function(){var m={EOF:1,parseError:s(function(a,c){if(this.yy.parser)this.yy.parser.parseError(a,c);else throw new Error(a)},"parseError"),setInput:s(function(i,a){return this.yy=a||this.yy||{},this._input=i,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:s(function(){var i=this._input[0];this.yytext+=i,this.yyleng++,this.offset++,this.match+=i,this.matched+=i;var a=i.match(/(?:\r\n?|\n).*/g);return a?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),i},"input"),unput:s(function(i){var a=i.length,c=i.split(/(?:\r\n?|\n)/g);this._input=i+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-a),this.offset-=a;var u=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var y=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===u.length?this.yylloc.first_column:0)+u[u.length-c.length].length-c[0].length:this.yylloc.first_column-a},this.options.ranges&&(this.yylloc.range=[y[0],y[0]+this.yyleng-a]),this.yyleng=this.yytext.length,this},"unput"),more:s(function(){return this._more=!0,this},"more"),reject:s(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:s(function(i){this.unput(this.match.slice(i))},"less"),pastInput:s(function(){var i=this.matched.substr(0,this.matched.length-this.match.length);return(i.length>20?"...":"")+i.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:s(function(){var i=this.match;return i.length<20&&(i+=this._input.substr(0,20-i.length)),(i.substr(0,20)+(i.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:s(function(){var i=this.pastInput(),a=new Array(i.length+1).join("-");return i+this.upcomingInput()+` -`+a+"^"},"showPosition"),test_match:s(function(i,a){var c,u,y;if(this.options.backtrack_lexer&&(y={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(y.yylloc.range=this.yylloc.range.slice(0))),u=i[0].match(/(?:\r\n?|\n).*/g),u&&(this.yylineno+=u.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:u?u[u.length-1].length-u[u.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+i[0].length},this.yytext+=i[0],this.match+=i[0],this.matches=i,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(i[0].length),this.matched+=i[0],c=this.performAction.call(this,this.yy,this,a,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),c)return c;if(this._backtrack){for(var o in y)this[o]=y[o];return!1}return!1},"test_match"),next:s(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var i,a,c,u;this._more||(this.yytext="",this.match="");for(var y=this._currentRules(),o=0;oa[0].length)){if(a=c,u=o,this.options.backtrack_lexer){if(i=this.test_match(c,y[o]),i!==!1)return i;if(this._backtrack){a=!1;continue}else return!1}else if(!this.options.flex)break}return a?(i=this.test_match(a,y[u]),i!==!1?i:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:s(function(){var a=this.next();return a||this.lex()},"lex"),begin:s(function(a){this.conditionStack.push(a)},"begin"),popState:s(function(){var a=this.conditionStack.length-1;return a>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:s(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:s(function(a){return a=this.conditionStack.length-1-Math.abs(a||0),a>=0?this.conditionStack[a]:"INITIAL"},"topState"),pushState:s(function(a){this.begin(a)},"pushState"),stateStackSize:s(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:s(function(a,c,u,y){var o=y;switch(u){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 21;case 16:return 20;case 17:return 6;case 18:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^:\n]+)/i,/^(?::\s(?:[^:\n]|:(?!\s))+)/i,/^(?:[^#:\n]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],inclusive:!0}}};return m})();p.lexer=k;function v(){this.yy={}}return s(v,"Parser"),v.prototype=p,p.Parser=v,new v})();X.parser=X;var Nt=X,gt={};it(gt,{addEvent:()=>wt,addSection:()=>kt,addTask:()=>_t,addTaskOrg:()=>St,clear:()=>xt,default:()=>Lt,getCommonDb:()=>mt,getSections:()=>bt,getTasks:()=>vt});var W="",ft=0,Y=[],G=[],B=[],mt=s(()=>ct,"getCommonDb"),xt=s(function(){Y.length=0,G.length=0,W="",B.length=0,ht()},"clear"),kt=s(function(n){W=n,Y.push(n)},"addSection"),bt=s(function(){return Y},"getSections"),vt=s(function(){let n=ut(),t=100,e=0;for(;!n&&ee.id===ft-1).events.push(n)},"addEvent"),St=s(function(n){let t={section:W,type:W,description:n,task:n,classes:[]};G.push(t)},"addTaskOrg"),ut=s(function(){let n=s(function(e){return B[e].processed},"compileTask"),t=!0;for(let[e,l]of B.entries())n(e),t=t&&l.processed;return t},"compileTasks"),Lt={clear:xt,getCommonDb:mt,addSection:kt,getSections:bt,getTasks:vt,addTask:_t,addTaskOrg:St,addEvent:wt},Mt=12,q=s(function(n,t){let e=n.append("rect");return e.attr("x",t.x),e.attr("y",t.y),e.attr("fill",t.fill),e.attr("stroke",t.stroke),e.attr("width",t.width),e.attr("height",t.height),e.attr("rx",t.rx),e.attr("ry",t.ry),t.class!==void 0&&e.attr("class",t.class),e},"drawRect"),$t=s(function(n,t){let l=n.append("circle").attr("cx",t.cx).attr("cy",t.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),r=n.append("g");r.append("circle").attr("cx",t.cx-15/3).attr("cy",t.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),r.append("circle").attr("cx",t.cx+15/3).attr("cy",t.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function d(f){let p=Q().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);f.append("path").attr("class","mouth").attr("d",p).attr("transform","translate("+t.cx+","+(t.cy+2)+")")}s(d,"smile");function h(f){let p=Q().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);f.append("path").attr("class","mouth").attr("d",p).attr("transform","translate("+t.cx+","+(t.cy+7)+")")}s(h,"sad");function g(f){f.append("line").attr("class","mouth").attr("stroke",2).attr("x1",t.cx-5).attr("y1",t.cy+7).attr("x2",t.cx+5).attr("y2",t.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return s(g,"ambivalent"),t.score>3?d(r):t.score<3?h(r):g(r),l},"drawFace"),Ht=s(function(n,t){let e=n.append("circle");return e.attr("cx",t.cx),e.attr("cy",t.cy),e.attr("class","actor-"+t.pos),e.attr("fill",t.fill),e.attr("stroke",t.stroke),e.attr("r",t.r),e.class!==void 0&&e.attr("class",e.class),t.title!==void 0&&e.append("title").text(t.title),e},"drawCircle"),Et=s(function(n,t){let e=t.text.replace(//gi," "),l=n.append("text");l.attr("x",t.x),l.attr("y",t.y),l.attr("class","legend"),l.style("text-anchor",t.anchor),t.class!==void 0&&l.attr("class",t.class);let r=l.append("tspan");return r.attr("x",t.x+t.textMargin*2),r.text(e),l},"drawText"),Pt=s(function(n,t){function e(r,d,h,g,f){return r+","+d+" "+(r+h)+","+d+" "+(r+h)+","+(d+g-f)+" "+(r+h-f*1.2)+","+(d+g)+" "+r+","+(d+g)}s(e,"genPoints");let l=n.append("polygon");l.attr("points",e(t.x,t.y,50,20,7)),l.attr("class","labelBox"),t.y=t.y+t.labelMargin,t.x=t.x+.5*t.labelMargin,Et(n,t)},"drawLabel"),At=s(function(n,t,e){let l=n.append("g"),r=D();r.x=t.x,r.y=t.y,r.fill=t.fill,r.width=e.width,r.height=e.height,r.class="journey-section section-type-"+t.num,r.rx=3,r.ry=3,q(l,r),Tt(e)(t.text,l,r.x,r.y,r.width,r.height,{class:"journey-section section-type-"+t.num},e,t.colour)},"drawSection"),pt=-1,Ct=s(function(n,t,e){let l=t.x+e.width/2,r=n.append("g");pt++,r.append("line").attr("id","task"+pt).attr("x1",l).attr("y1",t.y).attr("x2",l).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),$t(r,{cx:l,cy:300+(5-t.score)*30,score:t.score});let h=D();h.x=t.x,h.y=t.y,h.fill=t.fill,h.width=e.width,h.height=e.height,h.class="task task-type-"+t.num,h.rx=3,h.ry=3,q(r,h),Tt(e)(t.task,r,h.x,h.y,h.width,h.height,{class:"task"},e,t.colour)},"drawTask"),Rt=s(function(n,t){q(n,{x:t.startx,y:t.starty,width:t.stopx-t.startx,height:t.stopy-t.starty,fill:t.fill,class:"rect"}).lower()},"drawBackgroundRect"),Ft=s(function(){return{x:0,y:0,fill:void 0,"text-anchor":"start",width:100,height:100,textMargin:0,rx:0,ry:0}},"getTextObj"),D=s(function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),Tt=(function(){function n(r,d,h,g,f,p,k,v){let m=d.append("text").attr("x",h+f/2).attr("y",g+p/2+5).style("font-color",v).style("text-anchor","middle").text(r);l(m,k)}s(n,"byText");function t(r,d,h,g,f,p,k,v,m){let{taskFontSize:i,taskFontFamily:a}=v,c=r.split(//gi);for(let u=0;u)/).reverse(),r,d=[],h=1.1,g=e.attr("y"),f=parseFloat(e.attr("dy")),p=e.text(null).append("tspan").attr("x",0).attr("y",g).attr("dy",f+"em");for(let k=0;kt||r==="
    ")&&(d.pop(),p.text(d.join(" ").trim()),r==="
    "?d=[""]:d=[r],p=e.append("tspan").attr("x",0).attr("y",g).attr("dy",h+"em").text(r))})}s(tt,"wrap");var Vt=s(function(n,t,e,l){let r=e%Mt-1,d=n.append("g");t.section=r,d.attr("class",(t.class?t.class+" ":"")+"timeline-node "+("section-"+r));let h=d.append("g"),g=d.append("g"),p=g.append("text").text(t.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(tt,t.width).node().getBBox(),k=l.fontSize?.replace?l.fontSize.replace("px",""):l.fontSize;return t.height=p.height+k*1.1*.5+t.padding,t.height=Math.max(t.height,t.maxHeight),t.width=t.width+2*t.padding,g.attr("transform","translate("+t.width/2+", "+t.padding/2+")"),Bt(h,t,r,l),t},"drawNode"),Wt=s(function(n,t,e){let l=n.append("g"),d=l.append("text").text(t.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(tt,t.width).node().getBBox(),h=e.fontSize?.replace?e.fontSize.replace("px",""):e.fontSize;return l.remove(),d.height+h*1.1*.5+t.padding},"getVirtualNodeHeight"),Bt=s(function(n,t,e){n.append("path").attr("id","node-"+t.id).attr("class","node-bkg node-"+t.type).attr("d",`M0 ${t.height-5} v${-t.height+10} q0,-5 5,-5 h${t.width-10} q5,0 5,5 v${t.height-5} H0 Z`),n.append("line").attr("class","node-line-"+e).attr("x1",0).attr("y1",t.height).attr("x2",t.width).attr("y2",t.height)},"defaultBkg"),R={drawRect:q,drawCircle:Ht,drawSection:At,drawText:Et,drawLabel:Pt,drawTask:Ct,drawBackgroundRect:Rt,getTextObj:Ft,getNoteRect:D,initGraphics:zt,drawNode:Vt,getVirtualNodeHeight:Wt},Ot=s(function(n,t,e,l){let r=dt(),d=r.timeline?.leftMargin??50;S.debug("timeline",l.db);let h=r.securityLevel,g;h==="sandbox"&&(g=V("#i"+t));let p=(h==="sandbox"?V(g.nodes()[0].contentDocument.body):V("body")).select("#"+t);p.append("g");let k=l.db.getTasks(),v=l.db.getCommonDb().getDiagramTitle();S.debug("task",k),R.initGraphics(p);let m=l.db.getSections();S.debug("sections",m);let i=0,a=0,c=0,u=0,y=50+d,o=50;u=50;let E=0,b=!0;m.forEach(function(M){let _={number:E,descr:M,section:E,width:150,padding:20,maxHeight:i},x=R.getVirtualNodeHeight(p,_,r);S.debug("sectionHeight before draw",x),i=Math.max(i,x+20)});let L=0,P=0;S.debug("tasks.length",k.length);for(let[M,_]of k.entries()){let x={number:M,descr:_,section:_.section,width:150,padding:20,maxHeight:a},T=R.getVirtualNodeHeight(p,x,r);S.debug("taskHeight before draw",T),a=Math.max(a,T+20),L=Math.max(L,_.events.length);let $=0;for(let A of _.events){let U={descr:A,section:_.section,number:_.section,width:150,padding:20,maxHeight:50};$+=R.getVirtualNodeHeight(p,U,r)}_.events.length>0&&($+=(_.events.length-1)*10),P=Math.max(P,$)}S.debug("maxSectionHeight before draw",i),S.debug("maxTaskHeight before draw",a),m&&m.length>0?m.forEach(M=>{let _=k.filter(A=>A.section===M),x={number:E,descr:M,section:E,width:200*Math.max(_.length,1)-50,padding:20,maxHeight:i};S.debug("sectionNode",x);let T=p.append("g"),$=R.drawNode(T,x,E,r);S.debug("sectionNode output",$),T.attr("transform",`translate(${y}, ${u})`),o+=i+50,_.length>0&&yt(p,_,E,y,o,a,r,L,P,i,!1),y+=200*Math.max(_.length,1),o=u,E++}):(b=!1,yt(p,k,E,y,o,a,r,L,P,i,!0));let F=p.node().getBBox();S.debug("bounds",F),v&&p.append("text").text(v).attr("x",F.width/2-d).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),c=b?i+a+150:a+100,p.append("g").attr("class","lineWrapper").append("line").attr("x1",d).attr("y1",c).attr("x2",F.width+3*d).attr("y2",c).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),ot(void 0,p,r.timeline?.padding??50,r.timeline?.useMaxWidth??!1)},"draw"),yt=s(function(n,t,e,l,r,d,h,g,f,p,k){for(let v of t){let m={descr:v.task,section:e,number:e,width:150,padding:20,maxHeight:d};S.debug("taskNode",m);let i=n.append("g").attr("class","taskWrapper"),c=R.drawNode(i,m,e,h).height;if(S.debug("taskHeight after draw",c),i.attr("transform",`translate(${l}, ${r})`),d=Math.max(d,c),v.events){let u=n.append("g").attr("class","lineWrapper"),y=d;r+=100,y=y+jt(n,v.events,e,l,r,h),r-=100,u.append("line").attr("x1",l+190/2).attr("y1",r+d).attr("x2",l+190/2).attr("y2",r+d+100+f+100).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}l=l+200,k&&!h.timeline?.disableMulticolor&&e++}r=r-10},"drawTasks"),jt=s(function(n,t,e,l,r,d){let h=0,g=r;r=r+100;for(let f of t){let p={descr:f,section:e,number:e,width:150,padding:20,maxHeight:50};S.debug("eventNode",p);let k=n.append("g").attr("class","eventWrapper"),m=R.drawNode(k,p,e,d).height;h=h+m,k.attr("transform",`translate(${l}, ${r})`),r=r+10+m}return r=g,h},"drawEvents"),Gt={setConf:s(()=>{},"setConf"),draw:Ot},qt=s(n=>{let t="";for(let e=0;e` - .edge { - stroke-width: 3; - } - ${qt(n)} - .section-root rect, .section-root path, .section-root circle { - fill: ${n.git0}; - } - .section-root text { - fill: ${n.gitBranchLabel0}; - } - .icon-container { - height:100%; - display: flex; - justify-content: center; - align-items: center; - } - .edge { - fill: none; - } - .eventWrapper { - filter: brightness(120%); - } -`,"getStyles"),Zt=Ut,te={db:gt,renderer:Gt,parser:Nt,styles:Zt};export{te as diagram}; diff --git a/src/google/adk/cli/browser/chunk-ZMOC4H7T.js b/src/google/adk/cli/browser/chunk-ZMOC4H7T.js deleted file mode 100644 index 6d51ff52b9..0000000000 --- a/src/google/adk/cli/browser/chunk-ZMOC4H7T.js +++ /dev/null @@ -1,32 +0,0 @@ -import{g as f}from"./chunk-JRNAXTJ7.js";function Ae(e){return typeof e>"u"||e===null}f(Ae,"isNothing");function Oe(e){return typeof e=="object"&&e!==null}f(Oe,"isObject");function Ie(e){return Array.isArray(e)?e:Ae(e)?[]:[e]}f(Ie,"toArray");function ke(e,n){var i,l,r,u;if(n)for(u=Object.keys(n),i=0,l=u.length;ic&&(u=" ... ",n=l-c+u.length),i-l>c&&(o=" ...",i=l+c-o.length),{str:u+e.slice(n,i).replace(/\t/g,"\u2192")+o,pos:l-n+u.length}}f(W,"getLine");function G(e,n){return w.repeat(" ",n-e.length)+e}f(G,"padStart");function Re(e,n){if(n=Object.create(n||null),!e.buffer)return null;n.maxLength||(n.maxLength=79),typeof n.indent!="number"&&(n.indent=1),typeof n.linesBefore!="number"&&(n.linesBefore=3),typeof n.linesAfter!="number"&&(n.linesAfter=2);for(var i=/\r?\n|\r|\0/g,l=[0],r=[],u,o=-1;u=i.exec(e.buffer);)r.push(u.index),l.push(u.index+u[0].length),e.position<=u.index&&o<0&&(o=l.length-2);o<0&&(o=l.length-1);var c="",a,t,d=Math.min(e.line+n.linesAfter,r.length).toString().length,p=n.maxLength-(n.indent+d+3);for(a=1;a<=n.linesBefore&&!(o-a<0);a++)t=W(e.buffer,l[o-a],r[o-a],e.position-(l[o]-l[o-a]),p),c=w.repeat(" ",n.indent)+G((e.line-a+1).toString(),d)+" | "+t.str+` -`+c;for(t=W(e.buffer,l[o],r[o],e.position,p),c+=w.repeat(" ",n.indent)+G((e.line+1).toString(),d)+" | "+t.str+` -`,c+=w.repeat("-",n.indent+d+3+t.pos)+`^ -`,a=1;a<=n.linesAfter&&!(o+a>=r.length);a++)t=W(e.buffer,l[o+a],r[o+a],e.position-(l[o]-l[o+a]),p),c+=w.repeat(" ",n.indent)+G((e.line+a+1).toString(),d)+" | "+t.str+` -`;return c.replace(/\n$/,"")}f(Re,"makeSnippet");var yi=Re,_i=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],wi=["scalar","sequence","mapping"];function Me(e){var n={};return e!==null&&Object.keys(e).forEach(function(i){e[i].forEach(function(l){n[String(l)]=i})}),n}f(Me,"compileStyleAliases");function Ye(e,n){if(n=n||{},Object.keys(n).forEach(function(i){if(_i.indexOf(i)===-1)throw new x('Unknown option "'+i+'" is met in definition of "'+e+'" YAML type.')}),this.options=n,this.tag=e,this.kind=n.kind||null,this.resolve=n.resolve||function(){return!0},this.construct=n.construct||function(i){return i},this.instanceOf=n.instanceOf||null,this.predicate=n.predicate||null,this.represent=n.represent||null,this.representName=n.representName||null,this.defaultStyle=n.defaultStyle||null,this.multi=n.multi||!1,this.styleAliases=Me(n.styleAliases||null),wi.indexOf(this.kind)===-1)throw new x('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}f(Ye,"Type$1");var C=Ye;function re(e,n){var i=[];return e[n].forEach(function(l){var r=i.length;i.forEach(function(u,o){u.tag===l.tag&&u.kind===l.kind&&u.multi===l.multi&&(r=o)}),i[r]=l}),i}f(re,"compileList");function Fe(){var e={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},n,i;function l(r){r.multi?(e.multi[r.kind].push(r),e.multi.fallback.push(r)):e[r.kind][r.tag]=e.fallback[r.tag]=r}for(f(l,"collectType"),n=0,i=arguments.length;n=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},"binary"),octal:f(function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},"octal"),decimal:f(function(e){return e.toString(10)},"decimal"),hexadecimal:f(function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)},"hexadecimal")},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),ki=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Ve(e){return!(e===null||!ki.test(e)||e[e.length-1]==="_")}f(Ve,"resolveYamlFloat");function Xe(e){var n,i;return n=e.replace(/_/g,"").toLowerCase(),i=n[0]==="-"?-1:1,"+-".indexOf(n[0])>=0&&(n=n.slice(1)),n===".inf"?i===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:n===".nan"?NaN:i*parseFloat(n,10)}f(Xe,"constructYamlFloat");var Li=/^[-+]?[0-9]+e/;function Ze(e,n){var i;if(isNaN(e))switch(n){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(n){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(n){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(w.isNegativeZero(e))return"-0.0";return i=e.toString(10),Li.test(i)?i.replace("e",".e"):i}f(Ze,"representYamlFloat");function ze(e){return Object.prototype.toString.call(e)==="[object Number]"&&(e%1!==0||w.isNegativeZero(e))}f(ze,"isFloat");var Ni=new C("tag:yaml.org,2002:float",{kind:"scalar",resolve:Ve,construct:Xe,predicate:ze,represent:Ze,defaultStyle:"lowercase"}),Je=Ti.extend({implicit:[Ei,Oi,Ii,Ni]}),Ri=Je,en=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),nn=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function rn(e){return e===null?!1:en.exec(e)!==null||nn.exec(e)!==null}f(rn,"resolveYamlTimestamp");function ln(e){var n,i,l,r,u,o,c,a=0,t=null,d,p,s;if(n=en.exec(e),n===null&&(n=nn.exec(e)),n===null)throw new Error("Date resolve error");if(i=+n[1],l=+n[2]-1,r=+n[3],!n[4])return new Date(Date.UTC(i,l,r));if(u=+n[4],o=+n[5],c=+n[6],n[7]){for(a=n[7].slice(0,3);a.length<3;)a+="0";a=+a}return n[9]&&(d=+n[10],p=+(n[11]||0),t=(d*60+p)*6e4,n[9]==="-"&&(t=-t)),s=new Date(Date.UTC(i,l,r,u,o,c,a)),t&&s.setTime(s.getTime()-t),s}f(ln,"constructYamlTimestamp");function on(e){return e.toISOString()}f(on,"representYamlTimestamp");var Mi=new C("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:rn,construct:ln,instanceOf:Date,represent:on});function un(e){return e==="<<"||e===null}f(un,"resolveYamlMerge");var Yi=new C("tag:yaml.org,2002:merge",{kind:"scalar",resolve:un}),_e=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function cn(e){if(e===null)return!1;var n,i,l=0,r=e.length,u=_e;for(i=0;i64)){if(n<0)return!1;l+=6}return l%8===0}f(cn,"resolveYamlBinary");function fn(e){var n,i,l=e.replace(/[\r\n=]/g,""),r=l.length,u=_e,o=0,c=[];for(n=0;n>16&255),c.push(o>>8&255),c.push(o&255)),o=o<<6|u.indexOf(l.charAt(n));return i=r%4*6,i===0?(c.push(o>>16&255),c.push(o>>8&255),c.push(o&255)):i===18?(c.push(o>>10&255),c.push(o>>2&255)):i===12&&c.push(o>>4&255),new Uint8Array(c)}f(fn,"constructYamlBinary");function an(e){var n="",i=0,l,r,u=e.length,o=_e;for(l=0;l>18&63],n+=o[i>>12&63],n+=o[i>>6&63],n+=o[i&63]),i=(i<<8)+e[l];return r=u%3,r===0?(n+=o[i>>18&63],n+=o[i>>12&63],n+=o[i>>6&63],n+=o[i&63]):r===2?(n+=o[i>>10&63],n+=o[i>>4&63],n+=o[i<<2&63],n+=o[64]):r===1&&(n+=o[i>>2&63],n+=o[i<<4&63],n+=o[64],n+=o[64]),n}f(an,"representYamlBinary");function tn(e){return Object.prototype.toString.call(e)==="[object Uint8Array]"}f(tn,"isBinary");var Fi=new C("tag:yaml.org,2002:binary",{kind:"scalar",resolve:cn,construct:fn,predicate:tn,represent:an}),Pi=Object.prototype.hasOwnProperty,Bi=Object.prototype.toString;function pn(e){if(e===null)return!0;var n=[],i,l,r,u,o,c=e;for(i=0,l=c.length;i>10)+55296,(e-65536&1023)+56320)}f(xn,"charFromCodepoint");function we(e,n,i){n==="__proto__"?Object.defineProperty(e,n,{configurable:!0,enumerable:!0,writable:!0,value:i}):e[n]=i}f(we,"setProperty");var Tn=new Array(256),En=new Array(256);for(N=0;N<256;N++)Tn[N]=oe(N)?1:0,En[N]=oe(N);var N;function On(e,n){this.input=e,this.filename=n.filename||null,this.schema=n.schema||vn,this.onWarning=n.onWarning||null,this.legacy=n.legacy||!1,this.json=n.json||!1,this.listener=n.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}f(On,"State$1");function Ce(e,n){var i={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return i.snippet=yi(i),new x(n,i)}f(Ce,"generateError");function h(e,n){throw Ce(e,n)}f(h,"throwError");function H(e,n){e.onWarning&&e.onWarning.call(null,Ce(e,n))}f(H,"throwWarning");var Ee={YAML:f(function(n,i,l){var r,u,o;n.version!==null&&h(n,"duplication of %YAML directive"),l.length!==1&&h(n,"YAML directive accepts exactly one argument"),r=/^([0-9]+)\.([0-9]+)$/.exec(l[0]),r===null&&h(n,"ill-formed argument of the YAML directive"),u=parseInt(r[1],10),o=parseInt(r[2],10),u!==1&&h(n,"unacceptable YAML version of the document"),n.version=l[0],n.checkLineBreaks=o<2,o!==1&&o!==2&&H(n,"unsupported YAML version of the document")},"handleYamlDirective"),TAG:f(function(n,i,l){var r,u;l.length!==2&&h(n,"TAG directive accepts exactly two arguments"),r=l[0],u=l[1],_n.test(r)||h(n,"ill-formed tag handle (first argument) of the TAG directive"),L.call(n.tagMap,r)&&h(n,'there is a previously declared suffix for "'+r+'" tag handle'),wn.test(u)||h(n,"ill-formed tag prefix (second argument) of the TAG directive");try{u=decodeURIComponent(u)}catch(o){h(n,"tag prefix is malformed: "+u)}n.tagMap[r]=u},"handleTagDirective")};function I(e,n,i,l){var r,u,o,c;if(n1&&(e.result+=w.repeat(` -`,n-1))}f(ee,"writeFoldedLines");function In(e,n,i){var l,r,u,o,c,a,t,d,p=e.kind,s=e.result,m;if(m=e.input.charCodeAt(e.position),b(m)||R(m)||m===35||m===38||m===42||m===33||m===124||m===62||m===39||m===34||m===37||m===64||m===96||(m===63||m===45)&&(r=e.input.charCodeAt(e.position+1),b(r)||i&&R(r)))return!1;for(e.kind="scalar",e.result="",u=o=e.position,c=!1;m!==0;){if(m===58){if(r=e.input.charCodeAt(e.position+1),b(r)||i&&R(r))break}else if(m===35){if(l=e.input.charCodeAt(e.position-1),b(l))break}else{if(e.position===e.lineStart&&q(e)||i&&R(m))break;if(E(m))if(a=e.line,t=e.lineStart,d=e.lineIndent,_(e,!1,-1),e.lineIndent>=n){c=!0,m=e.input.charCodeAt(e.position);continue}else{e.position=o,e.line=a,e.lineStart=t,e.lineIndent=d;break}}c&&(I(e,u,o,!1),ee(e,e.line-a),u=o=e.position,c=!1),k(m)||(o=e.position+1),m=e.input.charCodeAt(++e.position)}return I(e,u,o,!1),e.result?!0:(e.kind=p,e.result=s,!1)}f(In,"readPlainScalar");function kn(e,n){var i,l,r;if(i=e.input.charCodeAt(e.position),i!==39)return!1;for(e.kind="scalar",e.result="",e.position++,l=r=e.position;(i=e.input.charCodeAt(e.position))!==0;)if(i===39)if(I(e,l,e.position,!0),i=e.input.charCodeAt(++e.position),i===39)l=e.position,e.position++,r=e.position;else return!0;else E(i)?(I(e,l,r,!0),ee(e,_(e,!1,n)),l=r=e.position):e.position===e.lineStart&&q(e)?h(e,"unexpected end of the document within a single quoted scalar"):(e.position++,r=e.position);h(e,"unexpected end of the stream within a single quoted scalar")}f(kn,"readSingleQuotedScalar");function Ln(e,n){var i,l,r,u,o,c;if(c=e.input.charCodeAt(e.position),c!==34)return!1;for(e.kind="scalar",e.result="",e.position++,i=l=e.position;(c=e.input.charCodeAt(e.position))!==0;){if(c===34)return I(e,i,e.position,!0),e.position++,!0;if(c===92){if(I(e,i,e.position,!0),c=e.input.charCodeAt(++e.position),E(c))_(e,!1,n);else if(c<256&&Tn[c])e.result+=En[c],e.position++;else if((o=Sn(c))>0){for(r=o,u=0;r>0;r--)c=e.input.charCodeAt(++e.position),(o=Cn(c))>=0?u=(u<<4)+o:h(e,"expected hexadecimal character");e.result+=xn(u),e.position++}else h(e,"unknown escape sequence");i=l=e.position}else E(c)?(I(e,i,l,!0),ee(e,_(e,!1,n)),i=l=e.position):e.position===e.lineStart&&q(e)?h(e,"unexpected end of the document within a double quoted scalar"):(e.position++,l=e.position)}h(e,"unexpected end of the stream within a double quoted scalar")}f(Ln,"readDoubleQuotedScalar");function Nn(e,n){var i=!0,l,r,u,o=e.tag,c,a=e.anchor,t,d,p,s,m,g=Object.create(null),A,y,T,v;if(v=e.input.charCodeAt(e.position),v===91)d=93,m=!1,c=[];else if(v===123)d=125,m=!0,c={};else return!1;for(e.anchor!==null&&(e.anchorMap[e.anchor]=c),v=e.input.charCodeAt(++e.position);v!==0;){if(_(e,!0,n),v=e.input.charCodeAt(e.position),v===d)return e.position++,e.tag=o,e.anchor=a,e.kind=m?"mapping":"sequence",e.result=c,!0;i?v===44&&h(e,"expected the node content, but found ','"):h(e,"missed comma between flow collection entries"),y=A=T=null,p=s=!1,v===63&&(t=e.input.charCodeAt(e.position+1),b(t)&&(p=s=!0,e.position++,_(e,!0,n))),l=e.line,r=e.lineStart,u=e.position,Y(e,n,Q,!1,!0),y=e.tag,A=e.result,_(e,!0,n),v=e.input.charCodeAt(e.position),(s||e.line===l)&&v===58&&(p=!0,v=e.input.charCodeAt(++e.position),_(e,!0,n),Y(e,n,Q,!1,!0),T=e.result),m?M(e,c,g,y,A,T,l,r,u):p?c.push(M(e,null,g,y,A,T,l,r,u)):c.push(A),_(e,!0,n),v=e.input.charCodeAt(e.position),v===44?(i=!0,v=e.input.charCodeAt(++e.position)):i=!1}h(e,"unexpected end of the stream within a flow collection")}f(Nn,"readFlowCollection");function Rn(e,n){var i,l,r=ie,u=!1,o=!1,c=n,a=0,t=!1,d,p;if(p=e.input.charCodeAt(e.position),p===124)l=!1;else if(p===62)l=!0;else return!1;for(e.kind="scalar",e.result="";p!==0;)if(p=e.input.charCodeAt(++e.position),p===43||p===45)ie===r?r=p===43?Te:qi:h(e,"repeat of a chomping mode identifier");else if((d=bn(p))>=0)d===0?h(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?h(e,"repeat of an indentation width identifier"):(c=n+d-1,o=!0);else break;if(k(p)){do p=e.input.charCodeAt(++e.position);while(k(p));if(p===35)do p=e.input.charCodeAt(++e.position);while(!E(p)&&p!==0)}for(;p!==0;){for(J(e),e.lineIndent=0,p=e.input.charCodeAt(e.position);(!o||e.lineIndentc&&(c=e.lineIndent),E(p)){a++;continue}if(e.lineIndentn)&&a!==0)h(e,"bad indentation of a sequence entry");else if(e.lineIndentn)&&(y&&(o=e.line,c=e.lineStart,a=e.position),Y(e,n,V,!0,r)&&(y?g=e.result:A=e.result),y||(M(e,p,s,m,g,A,o,c,a),m=g=A=null),_(e,!0,-1),v=e.input.charCodeAt(e.position)),(e.line===u||e.lineIndent>n)&&v!==0)h(e,"bad indentation of a mapping entry");else if(e.lineIndentn?a=1:e.lineIndent===n?a=0:e.lineIndentn?a=1:e.lineIndent===n?a=0:e.lineIndent tag; it should be "scalar", not "'+e.kind+'"'),p=0,s=e.implicitTypes.length;p"),e.result!==null&&g.kind!==e.kind&&h(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+g.kind+'", not "'+e.kind+'"'),g.resolve(e.result,e.tag)?(e.result=g.construct(e.result,e.tag),e.anchor!==null&&(e.anchorMap[e.anchor]=e.result)):h(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return e.listener!==null&&e.listener("close",e),e.tag!==null||e.anchor!==null||d}f(Y,"composeNode");function Bn(e){var n=e.position,i,l,r,u=!1,o;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);(o=e.input.charCodeAt(e.position))!==0&&(_(e,!0,-1),o=e.input.charCodeAt(e.position),!(e.lineIndent>0||o!==37));){for(u=!0,o=e.input.charCodeAt(++e.position),i=e.position;o!==0&&!b(o);)o=e.input.charCodeAt(++e.position);for(l=e.input.slice(i,e.position),r=[],l.length<1&&h(e,"directive name must not be less than one character in length");o!==0;){for(;k(o);)o=e.input.charCodeAt(++e.position);if(o===35){do o=e.input.charCodeAt(++e.position);while(o!==0&&!E(o));break}if(E(o))break;for(i=e.position;o!==0&&!b(o);)o=e.input.charCodeAt(++e.position);r.push(e.input.slice(i,e.position))}o!==0&&J(e),L.call(Ee,l)?Ee[l](e,l,r):H(e,'unknown document directive "'+l+'"')}if(_(e,!0,-1),e.lineIndent===0&&e.input.charCodeAt(e.position)===45&&e.input.charCodeAt(e.position+1)===45&&e.input.charCodeAt(e.position+2)===45?(e.position+=3,_(e,!0,-1)):u&&h(e,"directives end mark is expected"),Y(e,e.lineIndent-1,V,!1,!0),_(e,!0,-1),e.checkLineBreaks&&Gi.test(e.input.slice(n,e.position))&&H(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&q(e)){e.input.charCodeAt(e.position)===46&&(e.position+=3,_(e,!0,-1));return}if(e.position"u"&&(i=n,n=null);var l=Se(e,i);if(typeof n!="function")return l;for(var r=0,u=l.length;r=55296&&i<=56319&&n+1=56320&&l<=57343)?(i-55296)*1024+l-56320+65536:i}f(P,"codePointAt");function xe(e){var n=/^\n* /;return n.test(e)}f(xe,"needIndentIndicator");var ni=1,he=2,ii=3,ri=4,F=5;function li(e,n,i,l,r,u,o,c){var a,t=0,d=null,p=!1,s=!1,m=l!==-1,g=-1,A=Jn(P(e,0))&&ei(P(e,e.length-1));if(n||o)for(a=0;a=65536?a+=2:a++){if(t=P(e,a),!D(t))return F;A=A&&pe(t,d,c),d=t}else{for(a=0;a=65536?a+=2:a++){if(t=P(e,a),t===j)p=!0,m&&(s=s||a-g-1>l&&e[g+1]!==" ",g=a);else if(!D(t))return F;A=A&&pe(t,d,c),d=t}s=s||m&&a-g-1>l&&e[g+1]!==" "}return!p&&!s?A&&!o&&!r(e)?ni:u===U?F:he:i>9&&xe(e)?F:o?u===U?F:he:s?ri:ii}f(li,"chooseScalarStyle");function oi(e,n,i,l,r){e.dump=(function(){if(n.length===0)return e.quotingType===U?'""':"''";if(!e.noCompatMode&&(hr.indexOf(n)!==-1||dr.test(n)))return e.quotingType===U?'"'+n+'"':"'"+n+"'";var u=e.indent*Math.max(1,i),o=e.lineWidth===-1?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-u),c=l||e.flowLevel>-1&&i>=e.flowLevel;function a(t){return zn(e,t)}switch(f(a,"testAmbiguity"),li(n,c,e.indent,o,a,e.quotingType,e.forceQuotes&&!l,r)){case ni:return n;case he:return"'"+n.replace(/'/g,"''")+"'";case ii:return"|"+de(n,e.indent)+se(ae(n,u));case ri:return">"+de(n,e.indent)+se(ae(ui(n,o),u));case F:return'"'+ci(n)+'"';default:throw new x("impossible error: invalid scalar style")}})()}f(oi,"writeScalar");function de(e,n){var i=xe(e)?String(n):"",l=e[e.length-1]===` -`,r=l&&(e[e.length-2]===` -`||e===` -`),u=r?"+":l?"":"-";return i+u+` -`}f(de,"blockHeader");function se(e){return e[e.length-1]===` -`?e.slice(0,-1):e}f(se,"dropEndingNewline");function ui(e,n){for(var i=/(\n+)([^\n]*)/g,l=(function(){var t=e.indexOf(` -`);return t=t!==-1?t:e.length,i.lastIndex=t,me(e.slice(0,t),n)})(),r=e[0]===` -`||e[0]===" ",u,o;o=i.exec(e);){var c=o[1],a=o[2];u=a[0]===" ",l+=c+(!r&&!u&&a!==""?` -`:"")+me(a,n),r=u}return l}f(ui,"foldString");function me(e,n){if(e===""||e[0]===" ")return e;for(var i=/ [^ ]/g,l,r=0,u,o=0,c=0,a="";l=i.exec(e);)c=l.index,c-r>n&&(u=o>r?o:c,a+=` -`+e.slice(r,u),r=u+1),o=c;return a+=` -`,e.length-r>n&&o>r?a+=e.slice(r,o)+` -`+e.slice(o+1):a+=e.slice(r),a.slice(1)}f(me,"foldLine");function ci(e){for(var n="",i=0,l,r=0;r=65536?r+=2:r++)i=P(e,r),l=S[i],!l&&D(i)?(n+=e[r],i>=65536&&(n+=e[r+1])):n+=l||Xn(i);return n}f(ci,"escapeString");function fi(e,n,i){var l="",r=e.tag,u,o,c;for(u=0,o=i.length;u"u"&&O(e,n,null,!1,!1))&&(l!==""&&(l+=","+(e.condenseFlow?"":" ")),l+=e.dump);e.tag=r,e.dump="["+l+"]"}f(fi,"writeFlowSequence");function ge(e,n,i,l){var r="",u=e.tag,o,c,a;for(o=0,c=i.length;o"u"&&O(e,n+1,null,!0,!0,!1,!0))&&((!l||r!=="")&&(r+=Z(e,n)),e.dump&&j===e.dump.charCodeAt(0)?r+="-":r+="- ",r+=e.dump);e.tag=u,e.dump=r||"[]"}f(ge,"writeBlockSequence");function ai(e,n,i){var l="",r=e.tag,u=Object.keys(i),o,c,a,t,d;for(o=0,c=u.length;o1024&&(d+="? "),d+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),O(e,n,t,!1,!1)&&(d+=e.dump,l+=d));e.tag=r,e.dump="{"+l+"}"}f(ai,"writeFlowMapping");function ti(e,n,i,l){var r="",u=e.tag,o=Object.keys(i),c,a,t,d,p,s;if(e.sortKeys===!0)o.sort();else if(typeof e.sortKeys=="function")o.sort(e.sortKeys);else if(e.sortKeys)throw new x("sortKeys must be a boolean or a function");for(c=0,a=o.length;c1024,p&&(e.dump&&j===e.dump.charCodeAt(0)?s+="?":s+="? "),s+=e.dump,p&&(s+=Z(e,n)),O(e,n+1,d,!0,p)&&(e.dump&&j===e.dump.charCodeAt(0)?s+=":":s+=": ",s+=e.dump,r+=s));e.tag=u,e.dump=r||"{}"}f(ti,"writeBlockMapping");function ve(e,n,i){var l,r,u,o,c,a;for(r=i?e.explicitTypes:e.implicitTypes,u=0,o=r.length;u tag resolver accepts not "'+a+'" style');e.dump=l}return!0}return!1}f(ve,"detectType");function O(e,n,i,l,r,u,o){e.tag=null,e.dump=i,ve(e,i,!1)||ve(e,i,!0);var c=Un.call(e.dump),a=l,t;l&&(l=e.flowLevel<0||e.flowLevel>n);var d=c==="[object Object]"||c==="[object Array]",p,s;if(d&&(p=e.duplicates.indexOf(i),s=p!==-1),(e.tag!==null&&e.tag!=="?"||s||e.indent!==2&&n>0)&&(r=!1),s&&e.usedDuplicates[p])e.dump="*ref_"+p;else{if(d&&s&&!e.usedDuplicates[p]&&(e.usedDuplicates[p]=!0),c==="[object Object]")l&&Object.keys(e.dump).length!==0?(ti(e,n,e.dump,r),s&&(e.dump="&ref_"+p+e.dump)):(ai(e,n,e.dump),s&&(e.dump="&ref_"+p+" "+e.dump));else if(c==="[object Array]")l&&e.dump.length!==0?(e.noArrayIndent&&!o&&n>0?ge(e,n-1,e.dump,r):ge(e,n,e.dump,r),s&&(e.dump="&ref_"+p+e.dump)):(fi(e,n,e.dump),s&&(e.dump="&ref_"+p+" "+e.dump));else if(c==="[object String]")e.tag!=="?"&&oi(e,e.dump,n,u,a);else{if(c==="[object Undefined]")return!1;if(e.skipInvalid)return!1;throw new x("unacceptable kind of an object to dump "+c)}e.tag!==null&&e.tag!=="?"&&(t=encodeURI(e.tag[0]==="!"?e.tag.slice(1):e.tag).replace(/!/g,"%21"),e.tag[0]==="!"?t="!"+t:t.slice(0,18)==="tag:yaml.org,2002:"?t="!!"+t.slice(18):t="!<"+t+">",e.dump=t+" "+e.dump)}return!0}f(O,"writeNode");function pi(e,n){var i=[],l=[],r,u;for(z(e,i,l),r=0,u=l.length;rn(null,null,function*(){let t=yield g("info",e);a.debug(t)}),"parse")},d={version:"11.13.0"},m=r(()=>d.version,"getVersion"),c={getVersion:m},f=r((e,t,p)=>{a.debug(`rendering info diagram -`+e);let o=s(t);i(o,100,400,!0),o.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${p}`)},"draw"),u={draw:f},w={parser:v,db:c,renderer:u};export{w as diagram}; diff --git a/src/google/adk/cli/browser/index.html b/src/google/adk/cli/browser/index.html index 059998a4c2..6ebcfa79d8 100644 --- a/src/google/adk/cli/browser/index.html +++ b/src/google/adk/cli/browser/index.html @@ -23,1194 +23,12 @@ - - + + - - - + + - - - - - - - - - - - - - + diff --git a/src/google/adk/cli/browser/main-3CUQG2IN.js b/src/google/adk/cli/browser/main-3CUQG2IN.js deleted file mode 100644 index 4be3757671..0000000000 --- a/src/google/adk/cli/browser/main-3CUQG2IN.js +++ /dev/null @@ -1,4196 +0,0 @@ -import{a as yF}from"./chunk-TPDTRWWV.js";import{a as DF,b as vF}from"./chunk-ZMOC4H7T.js";import{a as RF}from"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import{a as _F,c as xF}from"./chunk-WXI2IBAH.js";import{b as bF,j as WD,l as MF,m as SI,n as SF,o as kF}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as MI,B as pF,C as AQ,E as fF,N as mF,P as wF,ba as eQ,ca as E3,g as gF,h as cF,j as CF,k as I3,l as jD,m as B3,n as dF,o as IF,q as h3,t as VD,u as BF,v as hF,w as EF,x as QF,y as qD,z as uF}from"./chunk-QFMJV7VH.js";import{a as zs,b as HD,d as zD,e as lF,g as we,i as qa,j as PD}from"./chunk-JRNAXTJ7.js";import{$ as _1,F as an,G as An,H as Ui,K as oF,N as $E,P as aF,R as YD,W as rF,X as sF,a as Fa,f as d3,g as eF,j as XE,m as Ji,q as tF,u as Tc,v as iF,z as nF}from"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{$ as WE,$a as vA,$b as nA,$c as YN,A as Rc,Aa as Fn,Ab as lA,Ac as LN,B as JC,Ba as ii,Bb as Ln,Bc as Si,C as Nc,Ca as Li,Cb as Xn,Cc as ve,D as $p,Da as ce,Db as $n,Dc as Yo,E as Vi,Ea as Rg,Eb as vl,Ec as GN,F as EN,Fa as t3,Fb as bl,Fc as K0,G as Bt,Ga as i3,Gb as dn,Gc as Mt,H as QN,Ha as b1,Hb as aA,Hc as k1,I as v1,Ia as DN,Ib as Ma,Ic as Qe,J as aa,Ja as vN,Jb as U,Jc as yn,K as VE,Ka as Ng,Kb as yI,Kc as KN,L as Os,La as Fc,Lb as p,Lc as C3,M as Ro,Ma as mo,Mb as Ot,Mc as UN,N as qE,Na as Fg,Nb as Ze,Nc as Hs,O as xg,Oa as mI,Ob as ra,Oc as TD,P as A3,Pa as Q,Pb as Wt,Pc as TN,Q as oo,Qa as n3,Qb as se,Qc as OD,R as FD,Ra as ao,Rb as le,Rc as ON,S as YC,Sa as wo,Sb as c3,Sc as Gc,T as HC,Ta as zr,Tb as ls,Tc as JN,U as Js,Ua as on,Ub as br,Uc as Vl,V as Dl,Va as st,Vb as Bi,Vc as Kc,W as Yn,Wa as o3,Wb as ft,Wc as DI,X as Mi,Xa as Jo,Xb as _A,Xc as ql,Y as yt,Ya as GD,Yb as kN,Yc as vI,Z as uN,Za as bN,Zb as Ao,Zc as Uc,_ as mi,_a as a3,_b as D,_c as gs,a as Oo,aa as Nt,ab as et,ac as Ee,ad as HN,b as CN,ba as pN,bb as VA,bc as Ya,bd as bI,c as dN,ca as Va,cb as KD,cc as Ri,cd as li,d as Fi,da as jA,db as r3,dc as wi,dd as U0,e as IN,ea as At,eb as bt,ec as Ni,ed as JD,f as ne,fa as fN,fb as kt,fc as ro,fd as zN,g as BN,ga as MA,gb as s3,gc as so,gd as PN,h as gi,ha as Wo,hb as MN,hc as Ki,hd as jN,i as _g,ia as w,ib as M1,ic as zC,id as Mr,j as RD,ja as mN,jb as l3,jc as ZE,jd as VN,k as qp,ka as Hr,kb as UD,kc as _N,kd as qN,l as uI,la as vr,lb as SN,lc as pt,ld as jC,m as Br,ma as wN,mb as F0,mc as Lc,md as WN,n as jE,na as L,nb as g3,nc as jl,nd as ZN,o as pI,oa as G,ob as ie,oc as L0,od as XN,p as Yr,pa as Et,pb as wI,pc as mt,q as oe,qa as hr,qb as T,qc as Ft,r as Wp,ra as St,rb as S1,rc as G0,rd as $N,s as fI,sa as ci,sb as O,sc as PC,sd as AF,t as hN,ta as Er,tb as Ja,tc as xN,u as Zp,ua as yN,ub as ni,uc as RN,v as Se,va as FA,vb as ke,vc as wa,w as Dr,wa as We,wb as _e,wc as ye,x as xc,xa as e3,xb as H,xc as NN,y as ND,ya as LD,yb as I,yc as FN,z as Xp,za as mA,zb as h,zc as Ys}from"./chunk-2SRK2U7X.js";import{a as P,b as $A,c as Pp,e as jp,f as cAA,h as Vp,j as re,k as Ie}from"./chunk-RMXJBC7V.js";var kO=jp(CM=>{"use strict";var SO={b:"\b",f:"\f",n:` -`,r:"\r",t:" ",'"':'"',"/":"/","\\":"\\"},MlA=97;CM.parse=function(i,e,A){var t={},n=0,o=0,a=0,r=A&&A.bigint&&typeof BigInt<"u";return{data:s("",!0),pointers:t};function s(j,X){l();var eA;S(j,"value");var Z=E();switch(Z){case"t":u("rue"),eA=!0;break;case"f":u("alse"),eA=!1;break;case"n":u("ull"),eA=null;break;case'"':eA=g();break;case"[":eA=d(j);break;case"{":eA=B(j);break;default:f(),"-0123456789".indexOf(Z)>=0?eA=C():x()}return S(j,"valueEnd"),l(),X&&aNumber.MAX_SAFE_INTEGER||eA="a"&&eA<="f"?X+=eA.charCodeAt()-MlA+10:eA>="0"&&eA<="9"?X+=+eA:F()}return String.fromCharCode(X)}function v(){for(var j="";i[a]>="0"&&i[a]<="9";)j+=E();if(j.length)return j;z(),x()}function S(j,X){k(j,X,M())}function k(j,X,eA){t[j]=t[j]||{},t[j][X]=eA}function M(){return{line:n,column:o,pos:a}}function x(){throw new SyntaxError("Unexpected token "+i[a]+" in JSON at position "+a)}function F(){f(),x()}function z(){if(a>=i.length)throw new SyntaxError("Unexpected end of JSON input")}};CM.stringify=function(i,e,A){if(!Q6(i))return;var t=0,n,o,a=typeof A=="object"?A.space:A;switch(typeof a){case"number":var r=a>10?10:a<0?0:Math.floor(a);a=r&&k(r," "),n=r,o=r;break;case"string":a=a.slice(0,10),n=0,o=0;for(var s=0;s=0}var klA=/"|\\/g,_lA=/[\b]/g,xlA=/\f/g,RlA=/\n/g,NlA=/\r/g,FlA=/\t/g;function u6(i){return i=i.replace(klA,"\\$&").replace(xlA,"\\f").replace(_lA,"\\b").replace(RlA,"\\n").replace(NlA,"\\r").replace(FlA,"\\t"),'"'+i+'"'}var LlA=/~/g,GlA=/\//g;function cM(i){return i.replace(LlA,"~0").replace(GlA,"~1")}});var BJ=jp((fAe,IJ)=>{"use strict";var dJ=function(i,e){var A,t,n=1,o=0,a=0,r=String.alphabet;function s(l,g,C){if(C){for(A=g;C=s(l,A),C<76&&C>65;)++A;return+l.slice(g-1,A)}return C=r&&r.indexOf(l.charAt(g)),C>-1?C+76:(C=l.charCodeAt(g)||0,C<45||C>127?C:C<46?65:C<48?C-1:C<58?C+18:C<65?C-11:C<91?C+11:C<97?C-37:C<123?C+5:C-63)}if((i+="")!=(e+="")){for(;n;)if(t=s(i,o++),n=s(e,a++),t<76&&n<76&&t>66&&n>66&&(t=s(i,o,o),n=s(e,a,o=A),a=A),t!=n)return t{"use strict";(function(i){"use strict";function e(V){return V!==null?Object.prototype.toString.call(V)==="[object Array]":!1}function A(V){return V!==null?Object.prototype.toString.call(V)==="[object Object]":!1}function t(V,$){if(V===$)return!0;var iA=Object.prototype.toString.call(V);if(iA!==Object.prototype.toString.call($))return!1;if(e(V)===!0){if(V.length!==$.length)return!1;for(var oA=0;oA",9:"Array"},S="EOF",k="UnquotedIdentifier",M="QuotedIdentifier",x="Rbracket",F="Rparen",z="Comma",j="Colon",X="Rbrace",eA="Number",Z="Current",CA="Expref",wA="Pipe",BA="Or",QA="And",RA="EQ",dA="GT",IA="LT",xA="GTE",qA="LTE",ue="NE",HA="Flatten",bA="Star",PA="Filter",it="Dot",Xe="Not",YA="Lbrace",hA="Lbracket",Ae="Lparen",pA="Literal",te={".":it,"*":bA,",":z,":":j,"{":YA,"}":X,"]":x,"(":Ae,")":F,"@":Z},NA={"<":!0,">":!0,"=":!0,"!":!0},Ge={" ":!0," ":!0,"\n":!0};function JA(V){return V>="a"&&V<="z"||V>="A"&&V<="Z"||V==="_"}function yA(V){return V>="0"&&V<="9"||V==="-"}function Pt(V){return V>="a"&&V<="z"||V>="A"&&V<="Z"||V>="0"&&V<="9"||V==="_"}function Dt(){}Dt.prototype={tokenize:function(V){var $=[];this._current=0;for(var iA,oA,UA;this._current")return V[this._current]==="="?(this._current++,{type:xA,value:">=",start:$}):{type:dA,value:">",start:$};if(iA==="="&&V[this._current]==="=")return this._current++,{type:RA,value:"==",start:$}},_consumeLiteral:function(V){this._current++;for(var $=this._current,iA=V.length,oA;V[this._current]!=="`"&&this._current=0)return!0;if(iA.indexOf(V)>=0)return!0;if(oA.indexOf(V[0])>=0)try{return JSON.parse(V),!0}catch(UA){return!1}else return!1}};var fe={};fe[S]=0,fe[k]=0,fe[M]=0,fe[x]=0,fe[F]=0,fe[z]=0,fe[X]=0,fe[eA]=0,fe[Z]=0,fe[CA]=0,fe[wA]=1,fe[BA]=2,fe[QA]=3,fe[RA]=5,fe[dA]=5,fe[IA]=5,fe[xA]=5,fe[qA]=5,fe[ue]=5,fe[HA]=9,fe[bA]=20,fe[PA]=21,fe[it]=40,fe[Xe]=45,fe[YA]=50,fe[hA]=55,fe[Ae]=60;function Zt(){}Zt.prototype={parse:function(V){this._loadTokens(V),this.index=0;var $=this.expression(0);if(this._lookahead(0)!==S){var iA=this._lookaheadToken(0),oA=new Error("Unexpected token type: "+iA.type+", value: "+iA.value);throw oA.name="ParserError",oA}return $},_loadTokens:function(V){var $=new Dt,iA=$.tokenize(V);iA.push({type:S,value:"",start:V.length}),this.tokens=iA},expression:function(V){var $=this._lookaheadToken(0);this._advance();for(var iA=this.nud($),oA=this._lookahead(0);V=0)return this.expression(V);if($===hA)return this._match(hA),this._parseMultiselectList();if($===YA)return this._match(YA),this._parseMultiselectHash()},_parseProjectionRHS:function(V){var $;if(fe[this._lookahead(0)]<10)$={type:"Identity"};else if(this._lookahead(0)===hA)$=this.expression(V);else if(this._lookahead(0)===PA)$=this.expression(V);else if(this._lookahead(0)===it)this._match(it),$=this._parseDotRHS(V);else{var iA=this._lookaheadToken(0),oA=new Error("Sytanx error, unexpected token: "+iA.value+"("+iA.type+")");throw oA.name="ParserError",oA}return $},_parseMultiselectList:function(){for(var V=[];this._lookahead(0)!==x;){var $=this.expression(0);if(V.push($),this._lookahead(0)===z&&(this._match(z),this._lookahead(0)===x))throw new Error("Unexpected token Rbracket")}return this._match(x),{type:"MultiSelectList",children:V}},_parseMultiselectHash:function(){for(var V=[],$=[k,M],iA,oA,UA,he;;){if(iA=this._lookaheadToken(0),$.indexOf(iA.type)<0)throw new Error("Expecting an identifier token, got: "+iA.type);if(oA=iA.value,this._advance(),this._match(j),UA=this.expression(0),he={type:"KeyValuePair",name:oA,value:UA},V.push(he),this._lookahead(0)===z)this._match(z);else if(this._lookahead(0)===X){this._match(X);break}}return{type:"MultiSelectHash",children:V}}};function Pe(V){this.runtime=V}Pe.prototype={search:function(V,$){return this.visit(V,$)},visit:function(V,$){var iA,oA,UA,he,me,GA,OA,wt,rt,je;switch(V.type){case"Field":return $!==null&&A($)?(GA=$[V.name],GA===void 0?null:GA):null;case"Subexpression":for(UA=this.visit(V.children[0],$),je=1;je0)for(je=Sn;jeHe;je+=En)UA.push($[je]);return UA;case"Projection":var Gi=this.visit(V.children[0],$);if(!e(Gi))return null;for(rt=[],je=0;jeme;break;case xA:UA=he>=me;break;case IA:UA=he=V&&($=iA<0?V-1:V),$}};function qe(V){this._interpreter=V,this.functionTable={abs:{_func:this._functionAbs,_signature:[{types:[s]}]},avg:{_func:this._functionAvg,_signature:[{types:[f]}]},ceil:{_func:this._functionCeil,_signature:[{types:[s]}]},contains:{_func:this._functionContains,_signature:[{types:[g,C]},{types:[l]}]},ends_with:{_func:this._functionEndsWith,_signature:[{types:[g]},{types:[g]}]},floor:{_func:this._functionFloor,_signature:[{types:[s]}]},length:{_func:this._functionLength,_signature:[{types:[g,C,d]}]},map:{_func:this._functionMap,_signature:[{types:[u]},{types:[C]}]},max:{_func:this._functionMax,_signature:[{types:[f,m]}]},merge:{_func:this._functionMerge,_signature:[{types:[d],variadic:!0}]},max_by:{_func:this._functionMaxBy,_signature:[{types:[C]},{types:[u]}]},sum:{_func:this._functionSum,_signature:[{types:[f]}]},starts_with:{_func:this._functionStartsWith,_signature:[{types:[g]},{types:[g]}]},min:{_func:this._functionMin,_signature:[{types:[f,m]}]},min_by:{_func:this._functionMinBy,_signature:[{types:[C]},{types:[u]}]},type:{_func:this._functionType,_signature:[{types:[l]}]},keys:{_func:this._functionKeys,_signature:[{types:[d]}]},values:{_func:this._functionValues,_signature:[{types:[d]}]},sort:{_func:this._functionSort,_signature:[{types:[m,f]}]},sort_by:{_func:this._functionSortBy,_signature:[{types:[C]},{types:[u]}]},join:{_func:this._functionJoin,_signature:[{types:[g]},{types:[m]}]},reverse:{_func:this._functionReverse,_signature:[{types:[g,C]}]},to_array:{_func:this._functionToArray,_signature:[{types:[l]}]},to_string:{_func:this._functionToString,_signature:[{types:[l]}]},to_number:{_func:this._functionToNumber,_signature:[{types:[l]}]},not_null:{_func:this._functionNotNull,_signature:[{types:[l],variadic:!0}]}}}qe.prototype={callFunction:function(V,$){var iA=this.functionTable[V];if(iA===void 0)throw new Error("Unknown function: "+V+"()");return this._validateArgs(V,$,iA._signature),iA._func.call(this,$)},_validateArgs:function(V,$,iA){var oA;if(iA[iA.length-1].variadic){if($.length=0;UA--)oA+=iA[UA];return oA}else{var he=V[0].slice(0);return he.reverse(),he}},_functionAbs:function(V){return Math.abs(V[0])},_functionCeil:function(V){return Math.ceil(V[0])},_functionAvg:function(V){for(var $=0,iA=V[0],oA=0;oA=0},_functionFloor:function(V){return Math.floor(V[0])},_functionLength:function(V){return A(V[0])?Object.keys(V[0]).length:V[0].length},_functionMap:function(V){for(var $=[],iA=this._interpreter,oA=V[0],UA=V[1],he=0;he0){var $=this._getTypeName(V[0][0]);if($===s)return Math.max.apply(Math,V[0]);for(var iA=V[0],oA=iA[0],UA=1;UA0){var $=this._getTypeName(V[0][0]);if($===s)return Math.min.apply(Math,V[0]);for(var iA=V[0],oA=iA[0],UA=1;UAze?1:jeUA&&(UA=me,he=iA[GA]);return he},_functionMinBy:function(V){for(var $=V[1],iA=V[0],oA=this.createKeyFunction($,[s,g]),UA=1/0,he,me,GA=0;GA"u"?v6.jmespath={}:v6)});var YX=jp((gre,$5)=>{"use strict";var d8A=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};var Gt=(function(i){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,A=0,t={},n={manual:i.Prism&&i.Prism.manual,disableWorkerMessageHandler:i.Prism&&i.Prism.disableWorkerMessageHandler,util:{encode:function E(f){return f instanceof o?new o(f.type,E(f.content),f.alias):Array.isArray(f)?f.map(E):f.replace(/&/g,"&").replace(/"u")return null;if(document.currentScript&&document.currentScript.tagName==="SCRIPT")return document.currentScript;try{throw new Error}catch(v){var E=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(v.stack)||[])[1];if(E){var f=document.getElementsByTagName("script");for(var m in f)if(f[m].src==E)return f[m]}return null}},isActive:function(E,f,m){for(var v="no-"+f;E;){var S=E.classList;if(S.contains(f))return!0;if(S.contains(v))return!1;E=E.parentElement}return!!m}},languages:{plain:t,plaintext:t,text:t,txt:t,extend:function(E,f){var m=n.util.clone(n.languages[E]);for(var v in f)m[v]=f[v];return m},insertBefore:function(E,f,m,v){v=v||n.languages;var S=v[E],k={};for(var M in S)if(S.hasOwnProperty(M)){if(M==f)for(var x in m)m.hasOwnProperty(x)&&(k[x]=m[x]);m.hasOwnProperty(M)||(k[M]=S[M])}var F=v[E];return v[E]=k,n.languages.DFS(n.languages,function(z,j){j===F&&z!=E&&(this[z]=k)}),k},DFS:function E(f,m,v,S){S=S||{};var k=n.util.objId;for(var M in f)if(f.hasOwnProperty(M)){m.call(f,M,f[M],v||M);var x=f[M],F=n.util.type(x);F==="Object"&&!S[k(x)]?(S[k(x)]=!0,E(x,m,null,S)):F==="Array"&&!S[k(x)]&&(S[k(x)]=!0,E(x,m,M,S))}}},plugins:{},highlightAll:function(E,f){n.highlightAllUnder(document,E,f)},highlightAllUnder:function(E,f,m){var v={callback:m,container:E,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};n.hooks.run("before-highlightall",v),v.elements=Array.prototype.slice.apply(v.container.querySelectorAll(v.selector)),n.hooks.run("before-all-elements-highlight",v);for(var S=0,k;k=v.elements[S++];)n.highlightElement(k,f===!0,v.callback)},highlightElement:function(E,f,m){var v=n.util.getLanguage(E),S=n.languages[v];n.util.setLanguage(E,v);var k=E.parentElement;k&&k.nodeName.toLowerCase()==="pre"&&n.util.setLanguage(k,v);var M=E.textContent,x={element:E,language:v,grammar:S,code:M};function F(j){x.highlightedCode=j,n.hooks.run("before-insert",x),x.element.innerHTML=x.highlightedCode,n.hooks.run("after-highlight",x),n.hooks.run("complete",x),m&&m.call(x.element)}if(n.hooks.run("before-sanity-check",x),k=x.element.parentElement,k&&k.nodeName.toLowerCase()==="pre"&&!k.hasAttribute("tabindex")&&k.setAttribute("tabindex","0"),!x.code){n.hooks.run("complete",x),m&&m.call(x.element);return}if(n.hooks.run("before-highlight",x),!x.grammar){F(n.util.encode(x.code));return}if(f&&i.Worker){var z=new Worker(n.filename);z.onmessage=function(j){F(j.data)},z.postMessage(JSON.stringify({language:x.language,code:x.code,immediateClose:!0}))}else F(n.highlight(x.code,x.grammar,x.language))},highlight:function(E,f,m){var v={code:E,grammar:f,language:m};if(n.hooks.run("before-tokenize",v),!v.grammar)throw new Error('The language "'+v.language+'" has no grammar.');return v.tokens=n.tokenize(v.code,v.grammar),n.hooks.run("after-tokenize",v),o.stringify(n.util.encode(v.tokens),v.language)},tokenize:function(E,f){var m=f.rest;if(m){for(var v in m)f[v]=m[v];delete f.rest}var S=new s;return l(S,S.head,E),r(E,S,f,S.head,0),C(S)},hooks:{all:{},add:function(E,f){var m=n.hooks.all;m[E]=m[E]||[],m[E].push(f)},run:function(E,f){var m=n.hooks.all[E];if(!(!m||!m.length))for(var v=0,S;S=m[v++];)S(f)}},Token:o};i.Prism=n;function o(E,f,m,v){this.type=E,this.content=f,this.alias=m,this.length=(v||"").length|0}o.stringify=function E(f,m){if(typeof f=="string")return f;if(Array.isArray(f)){var v="";return f.forEach(function(F){v+=E(F,m)}),v}var S={type:f.type,content:E(f.content,m),tag:"span",classes:["token",f.type],attributes:{},language:m},k=f.alias;k&&(Array.isArray(k)?Array.prototype.push.apply(S.classes,k):S.classes.push(k)),n.hooks.run("wrap",S);var M="";for(var x in S.attributes)M+=" "+x+'="'+(S.attributes[x]||"").replace(/"/g,""")+'"';return"<"+S.tag+' class="'+S.classes.join(" ")+'"'+M+">"+S.content+""};function a(E,f,m,v){E.lastIndex=f;var S=E.exec(m);if(S&&v&&S[1]){var k=S[1].length;S.index+=k,S[0]=S[0].slice(k)}return S}function r(E,f,m,v,S,k){for(var M in m)if(!(!m.hasOwnProperty(M)||!m[M])){var x=m[M];x=Array.isArray(x)?x:[x];for(var F=0;F=k.reach);QA+=BA.value.length,BA=BA.next){var RA=BA.value;if(f.length>E.length)return;if(!(RA instanceof o)){var dA=1,IA;if(eA){if(IA=a(wA,QA,E,X),!IA||IA.index>=E.length)break;var HA=IA.index,xA=IA.index+IA[0].length,qA=QA;for(qA+=BA.value.length;HA>=qA;)BA=BA.next,qA+=BA.value.length;if(qA-=BA.value.length,QA=qA,BA.value instanceof o)continue;for(var ue=BA;ue!==f.tail&&(qAk.reach&&(k.reach=Xe);var YA=BA.prev;PA&&(YA=l(f,YA,PA),QA+=PA.length),g(f,YA,dA);var hA=new o(M,j?n.tokenize(bA,j):bA,Z,bA);if(BA=l(f,YA,hA),it&&l(f,BA,it),dA>1){var Ae={cause:M+","+F,reach:Xe};r(E,f,m,BA.prev,QA,Ae),k&&Ae.reach>k.reach&&(k.reach=Ae.reach)}}}}}}function s(){var E={value:null,prev:null,next:null},f={value:null,prev:E,next:null};E.next=f,this.head=E,this.tail=f,this.length=0}function l(E,f,m){var v=f.next,S={value:m,prev:f,next:v};return f.next=S,v.prev=S,E.length++,S}function g(E,f,m){for(var v=f.next,S=0;S/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]};Gt.languages.markup.tag.inside["attr-value"].inside.entity=Gt.languages.markup.entity;Gt.languages.markup.doctype.inside["internal-subset"].inside=Gt.languages.markup;Gt.hooks.add("wrap",function(i){i.type==="entity"&&(i.attributes.title=i.content.replace(/&/,"&"))});Object.defineProperty(Gt.languages.markup.tag,"addInlined",{value:function(e,A){var t={};t["language-"+A]={pattern:/(^$)/i,lookbehind:!0,inside:Gt.languages[A]},t.cdata=/^$/i;var n={"included-cdata":{pattern://i,inside:t}};n["language-"+A]={pattern:/[\s\S]+/,inside:Gt.languages[A]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:n},Gt.languages.insertBefore("markup","cdata",o)}});Object.defineProperty(Gt.languages.markup.tag,"addAttribute",{value:function(i,e){Gt.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+i+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Gt.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}});Gt.languages.html=Gt.languages.markup;Gt.languages.mathml=Gt.languages.markup;Gt.languages.svg=Gt.languages.markup;Gt.languages.xml=Gt.languages.extend("markup",{});Gt.languages.ssml=Gt.languages.xml;Gt.languages.atom=Gt.languages.xml;Gt.languages.rss=Gt.languages.xml;(function(i){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;i.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},i.languages.css.atrule.inside.rest=i.languages.css;var A=i.languages.markup;A&&(A.tag.addInlined("style","css"),A.tag.addAttribute("style","css"))})(Gt);Gt.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};Gt.languages.javascript=Gt.languages.extend("clike",{"class-name":[Gt.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});Gt.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;Gt.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Gt.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Gt.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Gt.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Gt.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Gt.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});Gt.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Gt.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});Gt.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});Gt.languages.markup&&(Gt.languages.markup.tag.addInlined("script","javascript"),Gt.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));Gt.languages.js=Gt.languages.javascript;(function(){if(typeof Gt>"u"||typeof document>"u")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var i="Loading\u2026",e=function(d,B){return"\u2716 Error "+d+" while fetching file: "+B},A="\u2716 Error: File does not exist or is empty",t={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},n="data-src-status",o="loading",a="loaded",r="failed",s="pre[data-src]:not(["+n+'="'+a+'"]):not(['+n+'="'+o+'"])';function l(d,B,u){var E=new XMLHttpRequest;E.open("GET",d,!0),E.onreadystatechange=function(){E.readyState==4&&(E.status<400&&E.responseText?B(E.responseText):E.status>=400?u(e(E.status,E.statusText)):u(A))},E.send(null)}function g(d){var B=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(d||"");if(B){var u=Number(B[1]),E=B[2],f=B[3];return E?f?[u,Number(f)]:[u,void 0]:[u,u]}}Gt.hooks.add("before-highlightall",function(d){d.selector+=", "+s}),Gt.hooks.add("before-sanity-check",function(d){var B=d.element;if(B.matches(s)){d.code="",B.setAttribute(n,o);var u=B.appendChild(document.createElement("CODE"));u.textContent=i;var E=B.getAttribute("data-src"),f=d.language;if(f==="none"){var m=(/\.(\w+)$/.exec(E)||[,"none"])[1];f=t[m]||m}Gt.util.setLanguage(u,f),Gt.util.setLanguage(B,f);var v=Gt.plugins.autoloader;v&&v.loadLanguages(f),l(E,function(S){B.setAttribute(n,a);var k=g(B.getAttribute("data-range"));if(k){var M=S.split(/\r\n?|\n/g),x=k[0],F=k[1]==null?M.length:k[1];x<0&&(x+=M.length),x=Math.max(0,Math.min(x-1,M.length)),F<0&&(F+=M.length),F=Math.max(0,Math.min(F,M.length)),S=M.slice(x,F).join(` -`),B.hasAttribute("data-start")||B.setAttribute("data-start",String(x+1))}u.textContent=S,Gt.highlightElement(u)},function(S){B.setAttribute(n,r),u.textContent=S})}}),Gt.plugins.fileHighlight={highlight:function(B){for(var u=(B||document).querySelectorAll(s),E=0,f;f=u[E++];)Gt.highlightElement(f)}};var C=!1;Gt.fileHighlight=function(){C||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),C=!0),Gt.plugins.fileHighlight.highlight.apply(this,arguments)}})()});var OF=(()=>{class i{_renderer;_elementRef;onChange=A=>{};onTouched=()=>{};constructor(A,t){this._renderer=A,this._elementRef=t}setProperty(A,t){this._renderer.setProperty(this._elementRef.nativeElement,A,t)}registerOnTouched(A){this.onTouched=A}registerOnChange(A){this.onChange=A}setDisabledState(A){this.setProperty("disabled",A)}static \u0275fac=function(t){return new(t||i)(st(on),st(ce))};static \u0275dir=VA({type:i})}return i})(),Av=(()=>{class i extends OF{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,features:[bt]})}return i})(),cs=new MA(""),CAA={provide:cs,useExisting:Va(()=>ev),multi:!0},ev=(()=>{class i extends Av{writeValue(A){this.setProperty("checked",A)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["input","type","checkbox","formControlName",""],["input","type","checkbox","formControl",""],["input","type","checkbox","ngModel",""]],hostBindings:function(t,n){t&1&&U("change",function(a){return n.onChange(a.target.checked)})("blur",function(){return n.onTouched()})},standalone:!1,features:[pt([CAA]),bt]})}return i})(),dAA={provide:cs,useExisting:Va(()=>Gn),multi:!0};function IAA(){let i=TD()?TD().getUserAgent():"";return/android (\d+)/.test(i.toLowerCase())}var BAA=new MA(""),Gn=(()=>{class i extends OF{_compositionMode;_composing=!1;constructor(A,t,n){super(A,t),this._compositionMode=n,this._compositionMode==null&&(this._compositionMode=!IAA())}writeValue(A){let t=A??"";this.setProperty("value",t)}_handleInput(A){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(A)}_compositionStart(){this._composing=!0}_compositionEnd(A){this._composing=!1,this._compositionMode&&this.onChange(A)}static \u0275fac=function(t){return new(t||i)(st(on),st(ce),st(BAA,8))};static \u0275dir=VA({type:i,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(t,n){t&1&&U("input",function(a){return n._handleInput(a.target.value)})("blur",function(){return n.onTouched()})("compositionstart",function(){return n._compositionStart()})("compositionend",function(a){return n._compositionEnd(a.target.value)})},standalone:!1,features:[pt([dAA]),bt]})}return i})();function tv(i){return i==null||iv(i)===0}function iv(i){return i==null?null:Array.isArray(i)||typeof i=="string"?i.length:i instanceof Set?i.size:null}var Oc=new MA(""),lQ=new MA(""),hAA=/^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,js=class{static min(e){return JF(e)}static max(e){return EAA(e)}static required(e){return QAA(e)}static requiredTrue(e){return uAA(e)}static email(e){return pAA(e)}static minLength(e){return fAA(e)}static maxLength(e){return mAA(e)}static pattern(e){return wAA(e)}static nullValidator(e){return u3()}static compose(e){return VF(e)}static composeAsync(e){return qF(e)}};function JF(i){return e=>{if(e.value==null||i==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A{if(e.value==null||i==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A>i?{max:{max:i,actual:e.value}}:null}}function QAA(i){return tv(i.value)?{required:!0}:null}function uAA(i){return i.value===!0?null:{required:!0}}function pAA(i){return tv(i.value)||hAA.test(i.value)?null:{email:!0}}function fAA(i){return e=>{let A=e.value?.length??iv(e.value);return A===null||A===0?null:A{let A=e.value?.length??iv(e.value);return A!==null&&A>i?{maxlength:{requiredLength:i,actualLength:A}}:null}}function wAA(i){if(!i)return u3;let e,A;return typeof i=="string"?(A="",i.charAt(0)!=="^"&&(A+="^"),A+=i,i.charAt(i.length-1)!=="$"&&(A+="$"),e=new RegExp(A)):(A=i.toString(),e=i),t=>{if(tv(t.value))return null;let n=t.value;return e.test(n)?null:{pattern:{requiredPattern:A,actualValue:n}}}}function u3(i){return null}function YF(i){return i!=null}function HF(i){return l3(i)?Yr(i):i}function zF(i){let e={};return i.forEach(A=>{e=A!=null?P(P({},e),A):e}),Object.keys(e).length===0?null:e}function PF(i,e){return e.map(A=>A(i))}function yAA(i){return!i.validate}function jF(i){return i.map(e=>yAA(e)?e:A=>e.validate(A))}function VF(i){if(!i)return null;let e=i.filter(YF);return e.length==0?null:function(A){return zF(PF(A,e))}}function nv(i){return i!=null?VF(jF(i)):null}function qF(i){if(!i)return null;let e=i.filter(YF);return e.length==0?null:function(A){let t=PF(A,e).map(HF);return JC(t).pipe(Se(zF))}}function ov(i){return i!=null?qF(jF(i)):null}function NF(i,e){return i===null?[e]:Array.isArray(i)?[...i,e]:[i,e]}function WF(i){return i._rawValidators}function ZF(i){return i._rawAsyncValidators}function ZD(i){return i?Array.isArray(i)?i:[i]:[]}function p3(i,e){return Array.isArray(i)?i.includes(e):i===e}function FF(i,e){let A=ZD(e);return ZD(i).forEach(n=>{p3(A,n)||A.push(n)}),A}function LF(i,e){return ZD(e).filter(A=>!p3(i,A))}var f3=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(e){this._rawValidators=e||[],this._composedValidatorFn=nv(this._rawValidators)}_setAsyncValidators(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=ov(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(e){this._onDestroyCallbacks.push(e)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(e=>e()),this._onDestroyCallbacks=[]}reset(e=void 0){this.control?.reset(e)}hasError(e,A){return this.control?this.control.hasError(e,A):!1}getError(e,A){return this.control?this.control.getError(e,A):null}},T0=class extends f3{name;get formDirective(){return null}get path(){return null}},Vs=class extends f3{_parent=null;name=null;valueAccessor=null},m3=class{_cd;constructor(e){this._cd=e}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}};var Kn=(()=>{class i extends m3{constructor(A){super(A)}static \u0275fac=function(t){return new(t||i)(st(Vs,2))};static \u0275dir=VA({type:i,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(t,n){t&2&&_A("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)},standalone:!1,features:[bt]})}return i})(),XF=(()=>{class i extends m3{constructor(A){super(A)}static \u0275fac=function(t){return new(t||i)(st(T0,10))};static \u0275dir=VA({type:i,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["","formArray",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(t,n){t&2&&_A("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)("ng-submitted",n.isSubmitted)},standalone:!1,features:[bt]})}return i})();var tQ="VALID",Q3="INVALID",kI="PENDING",iQ="DISABLED",VC=class{},w3=class extends VC{value;source;constructor(e,A){super(),this.value=e,this.source=A}},oQ=class extends VC{pristine;source;constructor(e,A){super(),this.pristine=e,this.source=A}},aQ=class extends VC{touched;source;constructor(e,A){super(),this.touched=e,this.source=A}},_I=class extends VC{status;source;constructor(e,A){super(),this.status=e,this.source=A}},y3=class extends VC{source;constructor(e){super(),this.source=e}},rQ=class extends VC{source;constructor(e){super(),this.source=e}};function av(i){return(M3(i)?i.validators:i)||null}function DAA(i){return Array.isArray(i)?nv(i):i||null}function rv(i,e){return(M3(e)?e.asyncValidators:i)||null}function vAA(i){return Array.isArray(i)?ov(i):i||null}function M3(i){return i!=null&&!Array.isArray(i)&&typeof i=="object"}function $F(i,e,A){let t=i.controls;if(!(e?Object.keys(t):t).length)throw new Nt(1e3,"");if(!t[A])throw new Nt(1001,"")}function AL(i,e,A){i._forEachChild((t,n)=>{if(A[n]===void 0)throw new Nt(1002,"")})}var xI=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(e,A){this._assignValidators(e),this._assignAsyncValidators(A)}get validator(){return this._composedValidatorFn}set validator(e){this._rawValidators=this._composedValidatorFn=e}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}get parent(){return this._parent}get status(){return wa(this.statusReactive)}set status(e){wa(()=>this.statusReactive.set(e))}_status=ye(()=>this.statusReactive());statusReactive=mA(void 0);get valid(){return this.status===tQ}get invalid(){return this.status===Q3}get pending(){return this.status==kI}get disabled(){return this.status===iQ}get enabled(){return this.status!==iQ}errors;get pristine(){return wa(this.pristineReactive)}set pristine(e){wa(()=>this.pristineReactive.set(e))}_pristine=ye(()=>this.pristineReactive());pristineReactive=mA(!0);get dirty(){return!this.pristine}get touched(){return wa(this.touchedReactive)}set touched(e){wa(()=>this.touchedReactive.set(e))}_touched=ye(()=>this.touchedReactive());touchedReactive=mA(!1);get untouched(){return!this.touched}_events=new ne;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(e){this._assignValidators(e)}setAsyncValidators(e){this._assignAsyncValidators(e)}addValidators(e){this.setValidators(FF(e,this._rawValidators))}addAsyncValidators(e){this.setAsyncValidators(FF(e,this._rawAsyncValidators))}removeValidators(e){this.setValidators(LF(e,this._rawValidators))}removeAsyncValidators(e){this.setAsyncValidators(LF(e,this._rawAsyncValidators))}hasValidator(e){return p3(this._rawValidators,e)}hasAsyncValidator(e){return p3(this._rawAsyncValidators,e)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(e={}){let A=this.touched===!1;this.touched=!0;let t=e.sourceControl??this;e.onlySelf||this._parent?.markAsTouched($A(P({},e),{sourceControl:t})),A&&e.emitEvent!==!1&&this._events.next(new aQ(!0,t))}markAllAsDirty(e={}){this.markAsDirty({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsDirty(e))}markAllAsTouched(e={}){this.markAsTouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsTouched(e))}markAsUntouched(e={}){let A=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let t=e.sourceControl??this;this._forEachChild(n=>{n.markAsUntouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:t})}),e.onlySelf||this._parent?._updateTouched(e,t),A&&e.emitEvent!==!1&&this._events.next(new aQ(!1,t))}markAsDirty(e={}){let A=this.pristine===!0;this.pristine=!1;let t=e.sourceControl??this;e.onlySelf||this._parent?.markAsDirty($A(P({},e),{sourceControl:t})),A&&e.emitEvent!==!1&&this._events.next(new oQ(!1,t))}markAsPristine(e={}){let A=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let t=e.sourceControl??this;this._forEachChild(n=>{n.markAsPristine({onlySelf:!0,emitEvent:e.emitEvent})}),e.onlySelf||this._parent?._updatePristine(e,t),A&&e.emitEvent!==!1&&this._events.next(new oQ(!0,t))}markAsPending(e={}){this.status=kI;let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new _I(this.status,A)),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.markAsPending($A(P({},e),{sourceControl:A}))}disable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=iQ,this.errors=null,this._forEachChild(n=>{n.disable($A(P({},e),{onlySelf:!0}))}),this._updateValue();let t=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new w3(this.value,t)),this._events.next(new _I(this.status,t)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors($A(P({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(n=>n(!0))}enable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=tQ,this._forEachChild(t=>{t.enable($A(P({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors($A(P({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(t=>t(!1))}_updateAncestors(e,A){e.onlySelf||(this._parent?.updateValueAndValidity(e),e.skipPristineCheck||this._parent?._updatePristine({},A),this._parent?._updateTouched({},A))}setParent(e){this._parent=e}getRawValue(){return this.value}updateValueAndValidity(e={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let t=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===tQ||this.status===kI)&&this._runAsyncValidator(t,e.emitEvent)}let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new w3(this.value,A)),this._events.next(new _I(this.status,A)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.updateValueAndValidity($A(P({},e),{sourceControl:A}))}_updateTreeValidity(e={emitEvent:!0}){this._forEachChild(A=>A._updateTreeValidity(e)),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?iQ:tQ}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(e,A){if(this.asyncValidator){this.status=kI,this._hasOwnPendingAsyncValidator={emitEvent:A!==!1,shouldHaveEmitted:e!==!1};let t=HF(this.asyncValidator(this));this._asyncValidationSubscription=t.subscribe(n=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(n,{emitEvent:A,shouldHaveEmitted:e})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let e=(this._hasOwnPendingAsyncValidator?.emitEvent||this._hasOwnPendingAsyncValidator?.shouldHaveEmitted)??!1;return this._hasOwnPendingAsyncValidator=null,e}return!1}setErrors(e,A={}){this.errors=e,this._updateControlsErrors(A.emitEvent!==!1,this,A.shouldHaveEmitted)}get(e){let A=e;return A==null||(Array.isArray(A)||(A=A.split(".")),A.length===0)?null:A.reduce((t,n)=>t&&t._find(n),this)}getError(e,A){let t=A?this.get(A):this;return t?.errors?t.errors[e]:null}hasError(e,A){return!!this.getError(e,A)}get root(){let e=this;for(;e._parent;)e=e._parent;return e}_updateControlsErrors(e,A,t){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),(e||t)&&this._events.next(new _I(this.status,A)),this._parent&&this._parent._updateControlsErrors(e,A,t)}_initObservables(){this.valueChanges=new FA,this.statusChanges=new FA}_calculateStatus(){return this._allControlsDisabled()?iQ:this.errors?Q3:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(kI)?kI:this._anyControlsHaveStatus(Q3)?Q3:tQ}_anyControlsHaveStatus(e){return this._anyControls(A=>A.status===e)}_anyControlsDirty(){return this._anyControls(e=>e.dirty)}_anyControlsTouched(){return this._anyControls(e=>e.touched)}_updatePristine(e,A){let t=!this._anyControlsDirty(),n=this.pristine!==t;this.pristine=t,e.onlySelf||this._parent?._updatePristine(e,A),n&&this._events.next(new oQ(this.pristine,A))}_updateTouched(e={},A){this.touched=this._anyControlsTouched(),this._events.next(new aQ(this.touched,A)),e.onlySelf||this._parent?._updateTouched(e,A)}_onDisabledChange=[];_registerOnCollectionChange(e){this._onCollectionChange=e}_setUpdateStrategy(e){M3(e)&&e.updateOn!=null&&(this._updateOn=e.updateOn)}_parentMarkedDirty(e){return!e&&!!this._parent?.dirty&&!this._parent._anyControlsDirty()}_find(e){return null}_assignValidators(e){this._rawValidators=Array.isArray(e)?e.slice():e,this._composedValidatorFn=DAA(this._rawValidators)}_assignAsyncValidators(e){this._rawAsyncValidators=Array.isArray(e)?e.slice():e,this._composedAsyncValidatorFn=vAA(this._rawAsyncValidators)}},RI=class extends xI{constructor(e,A,t){super(av(A),rv(t,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;registerControl(e,A){return this.controls[e]?this.controls[e]:(this.controls[e]=A,A.setParent(this),A._registerOnCollectionChange(this._onCollectionChange),A)}addControl(e,A,t={}){this.registerControl(e,A),this.updateValueAndValidity({emitEvent:t.emitEvent}),this._onCollectionChange()}removeControl(e,A={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}setControl(e,A,t={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],A&&this.registerControl(e,A),this.updateValueAndValidity({emitEvent:t.emitEvent}),this._onCollectionChange()}contains(e){return this.controls.hasOwnProperty(e)&&this.controls[e].enabled}setValue(e,A={}){AL(this,!0,e),Object.keys(e).forEach(t=>{$F(this,!0,t),this.controls[t].setValue(e[t],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(Object.keys(e).forEach(t=>{let n=this.controls[t];n&&n.patchValue(e[t],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e={},A={}){this._forEachChild((t,n)=>{t.reset(e?e[n]:null,$A(P({},A),{onlySelf:!0}))}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A),A?.emitEvent!==!1&&this._events.next(new rQ(this))}getRawValue(){return this._reduceChildren({},(e,A,t)=>(e[t]=A.getRawValue(),e))}_syncPendingControls(){let e=this._reduceChildren(!1,(A,t)=>t._syncPendingControls()?!0:A);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){Object.keys(this.controls).forEach(A=>{let t=this.controls[A];t&&e(t,A)})}_setUpControls(){this._forEachChild(e=>{e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(e){for(let[A,t]of Object.entries(this.controls))if(this.contains(A)&&e(t))return!0;return!1}_reduceValue(){let e={};return this._reduceChildren(e,(A,t,n)=>((t.enabled||this.disabled)&&(A[n]=t.value),A))}_reduceChildren(e,A){let t=e;return this._forEachChild((n,o)=>{t=A(t,n,o)}),t}_allControlsDisabled(){for(let e of Object.keys(this.controls))if(this.controls[e].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_find(e){return this.controls.hasOwnProperty(e)?this.controls[e]:null}};var XD=class extends RI{};var NI=new MA("",{factory:()=>S3}),S3="always";function eL(i,e){return[...e.path,i]}function sQ(i,e,A=S3){sv(i,e),e.valueAccessor.writeValue(i.value),(i.disabled||A==="always")&&e.valueAccessor.setDisabledState?.(i.disabled),MAA(i,e),kAA(i,e),SAA(i,e),bAA(i,e)}function D3(i,e,A=!0){let t=()=>{};e?.valueAccessor?.registerOnChange(t),e?.valueAccessor?.registerOnTouched(t),b3(i,e),i&&(e._invokeOnDestroyCallbacks(),i._registerOnCollectionChange(()=>{}))}function v3(i,e){i.forEach(A=>{A.registerOnValidatorChange&&A.registerOnValidatorChange(e)})}function bAA(i,e){if(e.valueAccessor.setDisabledState){let A=t=>{e.valueAccessor.setDisabledState(t)};i.registerOnDisabledChange(A),e._registerOnDestroy(()=>{i._unregisterOnDisabledChange(A)})}}function sv(i,e){let A=WF(i);e.validator!==null?i.setValidators(NF(A,e.validator)):typeof A=="function"&&i.setValidators([A]);let t=ZF(i);e.asyncValidator!==null?i.setAsyncValidators(NF(t,e.asyncValidator)):typeof t=="function"&&i.setAsyncValidators([t]);let n=()=>i.updateValueAndValidity();v3(e._rawValidators,n),v3(e._rawAsyncValidators,n)}function b3(i,e){let A=!1;if(i!==null){if(e.validator!==null){let n=WF(i);if(Array.isArray(n)&&n.length>0){let o=n.filter(a=>a!==e.validator);o.length!==n.length&&(A=!0,i.setValidators(o))}}if(e.asyncValidator!==null){let n=ZF(i);if(Array.isArray(n)&&n.length>0){let o=n.filter(a=>a!==e.asyncValidator);o.length!==n.length&&(A=!0,i.setAsyncValidators(o))}}}let t=()=>{};return v3(e._rawValidators,t),v3(e._rawAsyncValidators,t),A}function MAA(i,e){e.valueAccessor.registerOnChange(A=>{i._pendingValue=A,i._pendingChange=!0,i._pendingDirty=!0,i.updateOn==="change"&&tL(i,e)})}function SAA(i,e){e.valueAccessor.registerOnTouched(()=>{i._pendingTouched=!0,i.updateOn==="blur"&&i._pendingChange&&tL(i,e),i.updateOn!=="submit"&&i.markAsTouched()})}function tL(i,e){i._pendingDirty&&i.markAsDirty(),i.setValue(i._pendingValue,{emitModelToViewChange:!1}),e.viewToModelUpdate(i._pendingValue),i._pendingChange=!1}function kAA(i,e){let A=(t,n)=>{e.valueAccessor.writeValue(t),n&&e.viewToModelUpdate(t)};i.registerOnChange(A),e._registerOnDestroy(()=>{i._unregisterOnChange(A)})}function iL(i,e){i==null,sv(i,e)}function _AA(i,e){return b3(i,e)}function lv(i,e){if(!i.hasOwnProperty("model"))return!1;let A=i.model;return A.isFirstChange()?!0:!Object.is(e,A.currentValue)}function xAA(i){return Object.getPrototypeOf(i.constructor)===Av}function nL(i,e){i._syncPendingControls(),e.forEach(A=>{let t=A.control;t.updateOn==="submit"&&t._pendingChange&&(A.viewToModelUpdate(t._pendingValue),t._pendingChange=!1)})}function gv(i,e){if(!e)return null;Array.isArray(e);let A,t,n;return e.forEach(o=>{o.constructor===Gn?A=o:xAA(o)?t=o:n=o}),n||t||A||null}function RAA(i,e){let A=i.indexOf(e);A>-1&&i.splice(A,1)}var NAA={provide:T0,useExisting:Va(()=>FI)},nQ=Promise.resolve(),FI=(()=>{class i extends T0{callSetDisabledState;get submitted(){return wa(this.submittedReactive)}_submitted=ye(()=>this.submittedReactive());submittedReactive=mA(!1);_directives=new Set;form;ngSubmit=new FA;options;constructor(A,t,n){super(),this.callSetDisabledState=n,this.form=new RI({},nv(A),ov(t))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(A){nQ.then(()=>{let t=this._findContainer(A.path);A.control=t.registerControl(A.name,A.control),sQ(A.control,A,this.callSetDisabledState),A.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(A)})}getControl(A){return this.form.get(A.path)}removeControl(A){nQ.then(()=>{this._findContainer(A.path)?.removeControl(A.name),this._directives.delete(A)})}addFormGroup(A){nQ.then(()=>{let t=this._findContainer(A.path),n=new RI({});iL(n,A),t.registerControl(A.name,n),n.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(A){nQ.then(()=>{this._findContainer(A.path)?.removeControl?.(A.name)})}getFormGroup(A){return this.form.get(A.path)}updateModel(A,t){nQ.then(()=>{this.form.get(A.path).setValue(t)})}setValue(A){this.control.setValue(A)}onSubmit(A){return this.submittedReactive.set(!0),nL(this.form,this._directives),this.ngSubmit.emit(A),this.form._events.next(new y3(this.control)),A?.target?.method==="dialog"}onReset(){this.resetForm()}resetForm(A=void 0){this.form.reset(A),this.submittedReactive.set(!1)}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.form._updateOn=this.options.updateOn)}_findContainer(A){return A.pop(),A.length?this.form.get(A):this.form}static \u0275fac=function(t){return new(t||i)(st(Oc,10),st(lQ,10),st(NI,8))};static \u0275dir=VA({type:i,selectors:[["form",3,"ngNoForm","",3,"formGroup","",3,"formArray",""],["ng-form"],["","ngForm",""]],hostBindings:function(t,n){t&1&&U("submit",function(a){return n.onSubmit(a)})("reset",function(){return n.onReset()})},inputs:{options:[0,"ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[pt([NAA]),bt]})}return i})();function GF(i,e){let A=i.indexOf(e);A>-1&&i.splice(A,1)}function KF(i){return typeof i=="object"&&i!==null&&Object.keys(i).length===2&&"value"in i&&"disabled"in i}var Ps=class extends xI{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(e=null,A,t){super(av(A),rv(t,A)),this._applyFormState(e),this._setUpdateStrategy(A),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),M3(A)&&(A.nonNullable||A.initialValueIsDefault)&&(KF(e)?this.defaultValue=e.value:this.defaultValue=e)}setValue(e,A={}){this.value=this._pendingValue=e,this._onChange.length&&A.emitModelToViewChange!==!1&&this._onChange.forEach(t=>t(this.value,A.emitViewToModelChange!==!1)),this.updateValueAndValidity(A)}patchValue(e,A={}){this.setValue(e,A)}reset(e=this.defaultValue,A={}){this._applyFormState(e),this.markAsPristine(A),this.markAsUntouched(A),this.setValue(this.value,A),A.overwriteDefaultValue&&(this.defaultValue=this.value),this._pendingChange=!1,A?.emitEvent!==!1&&this._events.next(new rQ(this))}_updateValue(){}_anyControls(e){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(e){this._onChange.push(e)}_unregisterOnChange(e){GF(this._onChange,e)}registerOnDisabledChange(e){this._onDisabledChange.push(e)}_unregisterOnDisabledChange(e){GF(this._onDisabledChange,e)}_forEachChild(e){}_syncPendingControls(){return this.updateOn==="submit"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(e){KF(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}};var FAA=i=>i instanceof Ps;var LAA={provide:Vs,useExisting:Va(()=>Ho)},UF=Promise.resolve(),Ho=(()=>{class i extends Vs{_changeDetectorRef;callSetDisabledState;control=new Ps;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name="";isDisabled;model;options;update=new FA;constructor(A,t,n,o,a,r){super(),this._changeDetectorRef=a,this.callSetDisabledState=r,this._parent=A,this._setValidators(t),this._setAsyncValidators(n),this.valueAccessor=gv(this,o)}ngOnChanges(A){if(this._checkForErrors(),!this._registered||"name"in A){if(this._registered&&(this._checkName(),this.formDirective)){let t=A.name.previousValue;this.formDirective.removeControl({name:t,path:this._getPath(t)})}this._setUpControl()}"isDisabled"in A&&this._updateDisabled(A),lv(A,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective?.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){sQ(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(A){UF.then(()=>{this.control.setValue(A,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(A){let t=A.isDisabled.currentValue,n=t!==0&&Qe(t);UF.then(()=>{n&&!this.control.disabled?this.control.disable():!n&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(A){return this._parent?eL(A,this._parent):[A]}static \u0275fac=function(t){return new(t||i)(st(T0,9),st(Oc,10),st(lQ,10),st(cs,10),st(Mt,8),st(NI,8))};static \u0275dir=VA({type:i,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],standalone:!1,features:[pt([LAA]),bt,ii]})}return i})();var oL=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""],standalone:!1})}return i})(),GAA={provide:cs,useExisting:Va(()=>gQ),multi:!0},gQ=(()=>{class i extends Av{writeValue(A){let t=A??"";this.setProperty("value",t)}registerOnChange(A){this.onChange=t=>{A(t==""?null:parseFloat(t))}}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["input","type","number","formControlName",""],["input","type","number","formControl",""],["input","type","number","ngModel",""]],hostBindings:function(t,n){t&1&&U("input",function(a){return n.onChange(a.target.value)})("blur",function(){return n.onTouched()})},standalone:!1,features:[pt([GAA]),bt]})}return i})();var $D=class extends xI{constructor(e,A,t){super(av(A),rv(t,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;at(e){return this.controls[this._adjustIndex(e)]}push(e,A={}){Array.isArray(e)?e.forEach(t=>{this.controls.push(t),this._registerControl(t)}):(this.controls.push(e),this._registerControl(e)),this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}insert(e,A,t={}){this.controls.splice(e,0,A),this._registerControl(A),this.updateValueAndValidity({emitEvent:t.emitEvent})}removeAt(e,A={}){let t=this._adjustIndex(e);t<0&&(t=0),this.controls[t]&&this.controls[t]._registerOnCollectionChange(()=>{}),this.controls.splice(t,1),this.updateValueAndValidity({emitEvent:A.emitEvent})}setControl(e,A,t={}){let n=this._adjustIndex(e);n<0&&(n=0),this.controls[n]&&this.controls[n]._registerOnCollectionChange(()=>{}),this.controls.splice(n,1),A&&(this.controls.splice(n,0,A),this._registerControl(A)),this.updateValueAndValidity({emitEvent:t.emitEvent}),this._onCollectionChange()}get length(){return this.controls.length}setValue(e,A={}){AL(this,!1,e),e.forEach((t,n)=>{$F(this,!1,n),this.at(n).setValue(t,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(e.forEach((t,n)=>{this.at(n)&&this.at(n).patchValue(t,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e=[],A={}){this._forEachChild((t,n)=>{t.reset(e[n],$A(P({},A),{onlySelf:!0}))}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A),A?.emitEvent!==!1&&this._events.next(new rQ(this))}getRawValue(){return this.controls.map(e=>e.getRawValue())}clear(e={}){this.controls.length<1||(this._forEachChild(A=>A._registerOnCollectionChange(()=>{})),this.controls.splice(0),this.updateValueAndValidity({emitEvent:e.emitEvent}))}_adjustIndex(e){return e<0?e+this.length:e}_syncPendingControls(){let e=this.controls.reduce((A,t)=>t._syncPendingControls()?!0:A,!1);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){this.controls.forEach((A,t)=>{e(A,t)})}_updateValue(){this.value=this.controls.filter(e=>e.enabled||this.disabled).map(e=>e.value)}_anyControls(e){return this.controls.some(A=>A.enabled&&e(A))}_setUpControls(){this._forEachChild(e=>this._registerControl(e))}_allControlsDisabled(){for(let e of this.controls)if(e.enabled)return!1;return this.controls.length>0||this.disabled}_registerControl(e){e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)}_find(e){return this.at(e)??null}};var KAA=(()=>{class i extends T0{callSetDisabledState;get submitted(){return wa(this._submittedReactive)}set submitted(A){this._submittedReactive.set(A)}_submitted=ye(()=>this._submittedReactive());_submittedReactive=mA(!1);_oldForm;_onCollectionChange=()=>this._updateDomValue();directives=[];constructor(A,t,n){super(),this.callSetDisabledState=n,this._setValidators(A),this._setAsyncValidators(t)}ngOnChanges(A){this.onChanges(A)}ngOnDestroy(){this.onDestroy()}onChanges(A){this._checkFormPresent(),A.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations(),this._oldForm=this.form)}onDestroy(){this.form&&(b3(this.form,this),this.form._onCollectionChange===this._onCollectionChange&&this.form._registerOnCollectionChange(()=>{}))}get formDirective(){return this}get path(){return[]}addControl(A){let t=this.form.get(A.path);return sQ(t,A,this.callSetDisabledState),t.updateValueAndValidity({emitEvent:!1}),this.directives.push(A),t}getControl(A){return this.form.get(A.path)}removeControl(A){D3(A.control||null,A,!1),RAA(this.directives,A)}addFormGroup(A){this._setUpFormContainer(A)}removeFormGroup(A){this._cleanUpFormContainer(A)}getFormGroup(A){return this.form.get(A.path)}getFormArray(A){return this.form.get(A.path)}addFormArray(A){this._setUpFormContainer(A)}removeFormArray(A){this._cleanUpFormContainer(A)}updateModel(A,t){this.form.get(A.path).setValue(t)}onReset(){this.resetForm()}resetForm(A=void 0,t={}){this.form.reset(A,t),this._submittedReactive.set(!1)}onSubmit(A){return this.submitted=!0,nL(this.form,this.directives),this.ngSubmit.emit(A),this.form._events.next(new y3(this.control)),A?.target?.method==="dialog"}_updateDomValue(){this.directives.forEach(A=>{let t=A.control,n=this.form.get(A.path);t!==n&&(D3(t||null,A),FAA(n)&&(sQ(n,A,this.callSetDisabledState),A.control=n))}),this.form._updateTreeValidity({emitEvent:!1})}_setUpFormContainer(A){let t=this.form.get(A.path);iL(t,A),t.updateValueAndValidity({emitEvent:!1})}_cleanUpFormContainer(A){let t=this.form?.get(A.path);t&&_AA(t,A)&&t.updateValueAndValidity({emitEvent:!1})}_updateRegistrations(){this.form._registerOnCollectionChange(this._onCollectionChange),this._oldForm?._registerOnCollectionChange(()=>{})}_updateValidators(){sv(this.form,this),this._oldForm&&b3(this._oldForm,this)}_checkFormPresent(){this.form}static \u0275fac=function(t){return new(t||i)(st(Oc,10),st(lQ,10),st(NI,8))};static \u0275dir=VA({type:i,features:[bt,ii]})}return i})();var cv=new MA(""),UAA={provide:Vs,useExisting:Va(()=>x1)},x1=(()=>{class i extends Vs{_ngModelWarningConfig;callSetDisabledState;viewModel;form;set isDisabled(A){}model;update=new FA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,t,n,o,a){super(),this._ngModelWarningConfig=o,this.callSetDisabledState=a,this._setValidators(A),this._setAsyncValidators(t),this.valueAccessor=gv(this,n)}ngOnChanges(A){if(this._isControlChanged(A)){let t=A.form.previousValue;t&&D3(t,this,!1),sQ(this.form,this,this.callSetDisabledState),this.form.updateValueAndValidity({emitEvent:!1})}lv(A,this.viewModel)&&(this.form.setValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.form&&D3(this.form,this,!1)}get path(){return[]}get control(){return this.form}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_isControlChanged(A){return A.hasOwnProperty("form")}static \u0275fac=function(t){return new(t||i)(st(Oc,10),st(lQ,10),st(cs,10),st(cv,8),st(NI,8))};static \u0275dir=VA({type:i,selectors:[["","formControl",""]],inputs:{form:[0,"formControl","form"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},exportAs:["ngForm"],standalone:!1,features:[pt([UAA]),bt,ii]})}return i})();var TAA={provide:Vs,useExisting:Va(()=>Cv)},Cv=(()=>{class i extends Vs{_ngModelWarningConfig;_added=!1;viewModel;control;name=null;set isDisabled(A){}model;update=new FA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,t,n,o,a){super(),this._ngModelWarningConfig=a,this._parent=A,this._setValidators(t),this._setAsyncValidators(n),this.valueAccessor=gv(this,o)}ngOnChanges(A){this._added||this._setUpControl(),lv(A,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}ngOnDestroy(){this.formDirective?.removeControl(this)}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}get path(){return eL(this.name==null?this.name:this.name.toString(),this._parent)}get formDirective(){return this._parent?this._parent.formDirective:null}_setUpControl(){this.control=this.formDirective.addControl(this),this._added=!0}static \u0275fac=function(t){return new(t||i)(st(T0,13),st(Oc,10),st(lQ,10),st(cs,10),st(cv,8))};static \u0275dir=VA({type:i,selectors:[["","formControlName",""]],inputs:{name:[0,"formControlName","name"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},standalone:!1,features:[pt([TAA]),bt,ii]})}return i})();var OAA={provide:T0,useExisting:Va(()=>qC)},qC=(()=>{class i extends KAA{form=null;ngSubmit=new FA;get control(){return this.form}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["","formGroup",""]],hostBindings:function(t,n){t&1&&U("submit",function(a){return n.onSubmit(a)})("reset",function(){return n.onReset()})},inputs:{form:[0,"formGroup","form"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[pt([OAA]),bt]})}return i})();function JAA(i){return typeof i=="number"?i:parseFloat(i)}var YAA=(()=>{class i{_validator=u3;_onChange;_enabled;ngOnChanges(A){if(this.inputName in A){let t=this.normalizeInput(A[this.inputName].currentValue);this._enabled=this.enabled(t),this._validator=this._enabled?this.createValidator(t):u3,this._onChange?.()}}validate(A){return this._validator(A)}registerOnValidatorChange(A){this._onChange=A}enabled(A){return A!=null}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,features:[ii]})}return i})();var HAA={provide:Oc,useExisting:Va(()=>dv),multi:!0},dv=(()=>{class i extends YAA{min;inputName="min";normalizeInput=A=>JAA(A);createValidator=A=>JF(A);static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["input","type","number","min","","formControlName",""],["input","type","number","min","","formControl",""],["input","type","number","min","","ngModel",""]],hostVars:1,hostBindings:function(t,n){t&2&&ie("min",n._enabled?n.min:null)},inputs:{min:"min"},standalone:!1,features:[pt([HAA]),bt]})}return i})();var aL=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({})}return i})();function TF(i){return!!i&&(i.asyncValidators!==void 0||i.validators!==void 0||i.updateOn!==void 0)}var rL=(()=>{class i{useNonNullable=!1;get nonNullable(){let A=new i;return A.useNonNullable=!0,A}group(A,t=null){let n=this._reduceControls(A),o={};return TF(t)?o=t:t!==null&&(o.validators=t.validator,o.asyncValidators=t.asyncValidator),new RI(n,o)}record(A,t=null){let n=this._reduceControls(A);return new XD(n,t)}control(A,t,n){let o={};return this.useNonNullable?(TF(t)?o=t:(o.validators=t,o.asyncValidators=n),new Ps(A,$A(P({},o),{nonNullable:!0}))):new Ps(A,t,n)}array(A,t,n){let o=A.map(a=>this._createControl(a));return new $D(o,t,n)}_reduceControls(A){let t={};return Object.keys(A).forEach(n=>{t[n]=this._createControl(A[n])}),t}_createControl(A){if(A instanceof Ps)return A;if(A instanceof xI)return A;if(Array.isArray(A)){let t=A[0],n=A.length>1?A[1]:null,o=A.length>2?A[2]:null;return this.control(t,n,o)}else return this.control(A)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var fn=(()=>{class i{static withConfig(A){return{ngModule:i,providers:[{provide:NI,useValue:A.callSetDisabledState??S3}]}}static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[aL]})}return i})(),WC=(()=>{class i{static withConfig(A){return{ngModule:i,providers:[{provide:cv,useValue:A.warnOnNgModelWithFormControl??"always"},{provide:NI,useValue:A.callSetDisabledState??S3}]}}static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[aL]})}return i})();function R1(i){return i.buttons===0||i.detail===0}function N1(i){let e=i.touches&&i.touches[0]||i.changedTouches&&i.changedTouches[0];return!!e&&e.identifier===-1&&(e.radiusX==null||e.radiusX===1)&&(e.radiusY==null||e.radiusY===1)}var Iv;function sL(){if(Iv==null){let i=typeof document<"u"?document.head:null;Iv=!!(i&&(i.createShadowRoot||i.attachShadow))}return Iv}function Bv(i){if(sL()){let e=i.getRootNode?i.getRootNode():null;if(typeof ShadowRoot<"u"&&ShadowRoot&&e instanceof ShadowRoot)return e}return null}function cQ(){let i=typeof document<"u"&&document?document.activeElement:null;for(;i&&i.shadowRoot;){let e=i.shadowRoot.activeElement;if(e===i)break;i=e}return i}function Pr(i){return i.composedPath?i.composedPath()[0]:i.target}var hv;try{hv=typeof Intl<"u"&&Intl.v8BreakIterator}catch(i){hv=!1}var Qi=(()=>{class i{_platformId=w(i3);isBrowser=this._platformId?U0(this._platformId):typeof document=="object"&&!!document;EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent);TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent);BLINK=this.isBrowser&&!!(window.chrome||hv)&&typeof CSS<"u"&&!this.EDGE&&!this.TRIDENT;WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT;IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window);FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent);ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT;SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT;constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var CQ;function lL(){if(CQ==null&&typeof window<"u")try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:()=>CQ=!0}))}finally{CQ=CQ||!1}return CQ}function LI(i){return lL()?i:!!i.capture}function qs(i,e=0){return k3(i)?Number(i):arguments.length===2?e:0}function k3(i){return!isNaN(parseFloat(i))&&!isNaN(Number(i))}function ks(i){return i instanceof ce?i.nativeElement:i}var gL=new MA("cdk-input-modality-detector-options"),cL={ignoreKeys:[18,17,224,91,16]},CL=650,Ev={passive:!0,capture:!0},dL=(()=>{class i{_platform=w(Qi);_listenerCleanups;modalityDetected;modalityChanged;get mostRecentModality(){return this._modality.value}_mostRecentTarget=null;_modality=new gi(null);_options;_lastTouchMs=0;_onKeydown=A=>{this._options?.ignoreKeys?.some(t=>t===A.keyCode)||(this._modality.next("keyboard"),this._mostRecentTarget=Pr(A))};_onMousedown=A=>{Date.now()-this._lastTouchMs{if(N1(A)){this._modality.next("keyboard");return}this._lastTouchMs=Date.now(),this._modality.next("touch"),this._mostRecentTarget=Pr(A)};constructor(){let A=w(We),t=w(ci),n=w(gL,{optional:!0});if(this._options=P(P({},cL),n),this.modalityDetected=this._modality.pipe(Dl(1)),this.modalityChanged=this.modalityDetected.pipe(xg()),this._platform.isBrowser){let o=w(zr).createRenderer(null,null);this._listenerCleanups=A.runOutsideAngular(()=>[o.listen(t,"keydown",this._onKeydown,Ev),o.listen(t,"mousedown",this._onMousedown,Ev),o.listen(t,"touchstart",this._onTouchstart,Ev)])}}ngOnDestroy(){this._modality.complete(),this._listenerCleanups?.forEach(A=>A())}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),dQ=(function(i){return i[i.IMMEDIATE=0]="IMMEDIATE",i[i.EVENTUAL=1]="EVENTUAL",i})(dQ||{}),IL=new MA("cdk-focus-monitor-default-options"),_3=LI({passive:!0,capture:!0}),rr=(()=>{class i{_ngZone=w(We);_platform=w(Qi);_inputModalityDetector=w(dL);_origin=null;_lastFocusOrigin=null;_windowFocused=!1;_windowFocusTimeoutId;_originTimeoutId;_originFromTouchInteraction=!1;_elementInfo=new Map;_monitoredElementCount=0;_rootNodeFocusListenerCount=new Map;_detectionMode;_windowFocusListener=()=>{this._windowFocused=!0,this._windowFocusTimeoutId=setTimeout(()=>this._windowFocused=!1)};_document=w(ci);_stopInputModalityDetector=new ne;constructor(){let A=w(IL,{optional:!0});this._detectionMode=A?.detectionMode||dQ.IMMEDIATE}_rootNodeFocusAndBlurListener=A=>{let t=Pr(A);for(let n=t;n;n=n.parentElement)A.type==="focus"?this._onFocus(A,n):this._onBlur(A,n)};monitor(A,t=!1){let n=ks(A);if(!this._platform.isBrowser||n.nodeType!==1)return oe();let o=Bv(n)||this._document,a=this._elementInfo.get(n);if(a)return t&&(a.checkChildren=!0),a.subject;let r={checkChildren:t,subject:new ne,rootNode:o};return this._elementInfo.set(n,r),this._registerGlobalListeners(r),r.subject}stopMonitoring(A){let t=ks(A),n=this._elementInfo.get(t);n&&(n.subject.complete(),this._setClasses(t),this._elementInfo.delete(t),this._removeGlobalListeners(n))}focusVia(A,t,n){let o=ks(A),a=this._document.activeElement;o===a?this._getClosestElementsInfo(o).forEach(([r,s])=>this._originChanged(r,t,s)):(this._setOrigin(t),typeof o.focus=="function"&&o.focus(n))}ngOnDestroy(){this._elementInfo.forEach((A,t)=>this.stopMonitoring(t))}_getWindow(){return this._document.defaultView||window}_getFocusOrigin(A){return this._origin?this._originFromTouchInteraction?this._shouldBeAttributedToTouch(A)?"touch":"program":this._origin:this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:A&&this._isLastInteractionFromInputLabel(A)?"mouse":"program"}_shouldBeAttributedToTouch(A){return this._detectionMode===dQ.EVENTUAL||!!A?.contains(this._inputModalityDetector._mostRecentTarget)}_setClasses(A,t){A.classList.toggle("cdk-focused",!!t),A.classList.toggle("cdk-touch-focused",t==="touch"),A.classList.toggle("cdk-keyboard-focused",t==="keyboard"),A.classList.toggle("cdk-mouse-focused",t==="mouse"),A.classList.toggle("cdk-program-focused",t==="program")}_setOrigin(A,t=!1){this._ngZone.runOutsideAngular(()=>{if(this._origin=A,this._originFromTouchInteraction=A==="touch"&&t,this._detectionMode===dQ.IMMEDIATE){clearTimeout(this._originTimeoutId);let n=this._originFromTouchInteraction?CL:1;this._originTimeoutId=setTimeout(()=>this._origin=null,n)}})}_onFocus(A,t){let n=this._elementInfo.get(t),o=Pr(A);!n||!n.checkChildren&&t!==o||this._originChanged(t,this._getFocusOrigin(o),n)}_onBlur(A,t){let n=this._elementInfo.get(t);!n||n.checkChildren&&A.relatedTarget instanceof Node&&t.contains(A.relatedTarget)||(this._setClasses(t),this._emitOrigin(n,null))}_emitOrigin(A,t){A.subject.observers.length&&this._ngZone.run(()=>A.subject.next(t))}_registerGlobalListeners(A){if(!this._platform.isBrowser)return;let t=A.rootNode,n=this._rootNodeFocusListenerCount.get(t)||0;n||this._ngZone.runOutsideAngular(()=>{t.addEventListener("focus",this._rootNodeFocusAndBlurListener,_3),t.addEventListener("blur",this._rootNodeFocusAndBlurListener,_3)}),this._rootNodeFocusListenerCount.set(t,n+1),++this._monitoredElementCount===1&&(this._ngZone.runOutsideAngular(()=>{this._getWindow().addEventListener("focus",this._windowFocusListener)}),this._inputModalityDetector.modalityDetected.pipe(yt(this._stopInputModalityDetector)).subscribe(o=>{this._setOrigin(o,!0)}))}_removeGlobalListeners(A){let t=A.rootNode;if(this._rootNodeFocusListenerCount.has(t)){let n=this._rootNodeFocusListenerCount.get(t);n>1?this._rootNodeFocusListenerCount.set(t,n-1):(t.removeEventListener("focus",this._rootNodeFocusAndBlurListener,_3),t.removeEventListener("blur",this._rootNodeFocusAndBlurListener,_3),this._rootNodeFocusListenerCount.delete(t))}--this._monitoredElementCount||(this._getWindow().removeEventListener("focus",this._windowFocusListener),this._stopInputModalityDetector.next(),clearTimeout(this._windowFocusTimeoutId),clearTimeout(this._originTimeoutId))}_originChanged(A,t,n){this._setClasses(A,t),this._emitOrigin(n,t),this._lastFocusOrigin=t}_getClosestElementsInfo(A){let t=[];return this._elementInfo.forEach((n,o)=>{(o===A||n.checkChildren&&o.contains(A))&&t.push([o,n])}),t}_isLastInteractionFromInputLabel(A){let{_mostRecentTarget:t,mostRecentModality:n}=this._inputModalityDetector;if(n!=="mouse"||!t||t===A||A.nodeName!=="INPUT"&&A.nodeName!=="TEXTAREA"||A.disabled)return!1;let o=A.labels;if(o){for(let a=0;a{class i{_elementRef=w(ce);_focusMonitor=w(rr);_monitorSubscription;_focusOrigin=null;cdkFocusChange=new FA;constructor(){}get focusOrigin(){return this._focusOrigin}ngAfterViewInit(){let A=this._elementRef.nativeElement;this._monitorSubscription=this._focusMonitor.monitor(A,A.nodeType===1&&A.hasAttribute("cdkMonitorSubtreeFocus")).subscribe(t=>{this._focusOrigin=t,this.cdkFocusChange.emit(t)})}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._monitorSubscription?.unsubscribe()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdkMonitorElementFocus",""],["","cdkMonitorSubtreeFocus",""]],outputs:{cdkFocusChange:"cdkFocusChange"},exportAs:["cdkMonitorFocus"]})}return i})();var x3=new WeakMap,Eo=(()=>{class i{_appRef;_injector=w(St);_environmentInjector=w(Hr);load(A){let t=this._appRef=this._appRef||this._injector.get(F0),n=x3.get(t);n||(n={loaders:new Set,refs:[]},x3.set(t,n),t.onDestroy(()=>{x3.get(t)?.refs.forEach(o=>o.destroy()),x3.delete(t)})),n.loaders.has(A)||(n.loaders.add(A),n.refs.push(C3(A,{environmentInjector:this._environmentInjector})))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var ZC=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["ng-component"]],exportAs:["cdkVisuallyHidden"],decls:0,vars:0,template:function(t,n){},styles:[`.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0} -`],encapsulation:2,changeDetection:0})}return i})(),R3;function zAA(){if(R3===void 0&&(R3=null,typeof window<"u")){let i=window;i.trustedTypes!==void 0&&(R3=i.trustedTypes.createPolicy("angular#components",{createHTML:e=>e}))}return R3}function F1(i){return zAA()?.createHTML(i)||i}function BL(i,e,A){let t=A.sanitize(Ng.HTML,e);i.innerHTML=F1(t||"")}function GI(i){return Array.isArray(i)?i:[i]}var hL=new Set,L1,KI=(()=>{class i{_platform=w(Qi);_nonce=w(DN,{optional:!0});_matchMedia;constructor(){this._matchMedia=this._platform.isBrowser&&window.matchMedia?window.matchMedia.bind(window):jAA}matchMedia(A){return(this._platform.WEBKIT||this._platform.BLINK)&&PAA(A,this._nonce),this._matchMedia(A)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function PAA(i,e){if(!hL.has(i))try{L1||(L1=document.createElement("style"),e&&L1.setAttribute("nonce",e),L1.setAttribute("type","text/css"),document.head.appendChild(L1)),L1.sheet&&(L1.sheet.insertRule(`@media ${i} {body{ }}`,0),hL.add(i))}catch(A){console.error(A)}}function jAA(i){return{matches:i==="all"||i==="",media:i,addListener:()=>{},removeListener:()=>{}}}var IQ=(()=>{class i{_mediaMatcher=w(KI);_zone=w(We);_queries=new Map;_destroySubject=new ne;constructor(){}ngOnDestroy(){this._destroySubject.next(),this._destroySubject.complete()}isMatched(A){return EL(GI(A)).some(n=>this._registerQuery(n).mql.matches)}observe(A){let n=EL(GI(A)).map(a=>this._registerQuery(a).observable),o=Dr(n);return o=Xp(o.pipe(Ro(1)),o.pipe(Dl(1),Os(0))),o.pipe(Se(a=>{let r={matches:!1,breakpoints:{}};return a.forEach(({matches:s,query:l})=>{r.matches=r.matches||s,r.breakpoints[l]=s}),r}))}_registerQuery(A){if(this._queries.has(A))return this._queries.get(A);let t=this._mediaMatcher.matchMedia(A),o={observable:new Fi(a=>{let r=s=>this._zone.run(()=>a.next(s));return t.addListener(r),()=>{t.removeListener(r)}}).pipe(Yn(t),Se(({matches:a})=>({query:A,matches:a})),yt(this._destroySubject)),mql:t};return this._queries.set(A,o),o}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function EL(i){return i.map(e=>e.split(",")).reduce((e,A)=>e.concat(A)).map(e=>e.trim())}function VAA(i){if(i.type==="characterData"&&i.target instanceof Comment)return!0;if(i.type==="childList"){for(let e=0;e{class i{create(A){return typeof MutationObserver>"u"?null:new MutationObserver(A)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),uL=(()=>{class i{_mutationObserverFactory=w(QL);_observedElements=new Map;_ngZone=w(We);constructor(){}ngOnDestroy(){this._observedElements.forEach((A,t)=>this._cleanupObserver(t))}observe(A){let t=ks(A);return new Fi(n=>{let a=this._observeElement(t).pipe(Se(r=>r.filter(s=>!VAA(s))),Bt(r=>!!r.length)).subscribe(r=>{this._ngZone.run(()=>{n.next(r)})});return()=>{a.unsubscribe(),this._unobserveElement(t)}})}_observeElement(A){return this._ngZone.runOutsideAngular(()=>{if(this._observedElements.has(A))this._observedElements.get(A).count++;else{let t=new ne,n=this._mutationObserverFactory.create(o=>t.next(o));n&&n.observe(A,{characterData:!0,childList:!0,subtree:!0}),this._observedElements.set(A,{observer:n,stream:t,count:1})}return this._observedElements.get(A).stream})}_unobserveElement(A){this._observedElements.has(A)&&(this._observedElements.get(A).count--,this._observedElements.get(A).count||this._cleanupObserver(A))}_cleanupObserver(A){if(this._observedElements.has(A)){let{observer:t,stream:n}=this._observedElements.get(A);t&&t.disconnect(),n.complete(),this._observedElements.delete(A)}}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),pL=(()=>{class i{_contentObserver=w(uL);_elementRef=w(ce);event=new FA;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._disabled?this._unsubscribe():this._subscribe()}_disabled=!1;get debounce(){return this._debounce}set debounce(A){this._debounce=qs(A),this._subscribe()}_debounce;_currentSubscription=null;constructor(){}ngAfterContentInit(){!this._currentSubscription&&!this.disabled&&this._subscribe()}ngOnDestroy(){this._unsubscribe()}_subscribe(){this._unsubscribe();let A=this._contentObserver.observe(this._elementRef);this._currentSubscription=(this.debounce?A.pipe(Os(this.debounce)):A).subscribe(this.event)}_unsubscribe(){this._currentSubscription?.unsubscribe()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdkObserveContent",""]],inputs:{disabled:[2,"cdkObserveContentDisabled","disabled",Qe],debounce:"debounce"},outputs:{event:"cdkObserveContent"},exportAs:["cdkObserveContent"]})}return i})(),N3=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({providers:[QL]})}return i})();var UI=(()=>{class i{_platform=w(Qi);constructor(){}isDisabled(A){return A.hasAttribute("disabled")}isVisible(A){return WAA(A)&&getComputedStyle(A).visibility==="visible"}isTabbable(A){if(!this._platform.isBrowser)return!1;let t=qAA(neA(A));if(t&&(fL(t)===-1||!this.isVisible(t)))return!1;let n=A.nodeName.toLowerCase(),o=fL(A);return A.hasAttribute("contenteditable")?o!==-1:n==="iframe"||n==="object"||this._platform.WEBKIT&&this._platform.IOS&&!teA(A)?!1:n==="audio"?A.hasAttribute("controls")?o!==-1:!1:n==="video"?o===-1?!1:o!==null?!0:this._platform.FIREFOX||A.hasAttribute("controls"):A.tabIndex>=0}isFocusable(A,t){return ieA(A)&&!this.isDisabled(A)&&(t?.ignoreVisibility||this.isVisible(A))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function qAA(i){try{return i.frameElement}catch(e){return null}}function WAA(i){return!!(i.offsetWidth||i.offsetHeight||typeof i.getClientRects=="function"&&i.getClientRects().length)}function ZAA(i){let e=i.nodeName.toLowerCase();return e==="input"||e==="select"||e==="button"||e==="textarea"}function XAA(i){return AeA(i)&&i.type=="hidden"}function $AA(i){return eeA(i)&&i.hasAttribute("href")}function AeA(i){return i.nodeName.toLowerCase()=="input"}function eeA(i){return i.nodeName.toLowerCase()=="a"}function yL(i){if(!i.hasAttribute("tabindex")||i.tabIndex===void 0)return!1;let e=i.getAttribute("tabindex");return!!(e&&!isNaN(parseInt(e,10)))}function fL(i){if(!yL(i))return null;let e=parseInt(i.getAttribute("tabindex")||"",10);return isNaN(e)?-1:e}function teA(i){let e=i.nodeName.toLowerCase(),A=e==="input"&&i.type;return A==="text"||A==="password"||e==="select"||e==="textarea"}function ieA(i){return XAA(i)?!1:ZAA(i)||$AA(i)||i.hasAttribute("contenteditable")||yL(i)}function neA(i){return i.ownerDocument&&i.ownerDocument.defaultView||window}var F3=class{_element;_checker;_ngZone;_document;_injector;_startAnchor=null;_endAnchor=null;_hasAttached=!1;startAnchorListener=()=>this.focusLastTabbableElement();endAnchorListener=()=>this.focusFirstTabbableElement();get enabled(){return this._enabled}set enabled(e){this._enabled=e,this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_enabled=!0;constructor(e,A,t,n,o=!1,a){this._element=e,this._checker=A,this._ngZone=t,this._document=n,this._injector=a,o||this.attachAnchors()}destroy(){let e=this._startAnchor,A=this._endAnchor;e&&(e.removeEventListener("focus",this.startAnchorListener),e.remove()),A&&(A.removeEventListener("focus",this.endAnchorListener),A.remove()),this._startAnchor=this._endAnchor=null,this._hasAttached=!1}attachAnchors(){return this._hasAttached?!0:(this._ngZone.runOutsideAngular(()=>{this._startAnchor||(this._startAnchor=this._createAnchor(),this._startAnchor.addEventListener("focus",this.startAnchorListener)),this._endAnchor||(this._endAnchor=this._createAnchor(),this._endAnchor.addEventListener("focus",this.endAnchorListener))}),this._element.parentNode&&(this._element.parentNode.insertBefore(this._startAnchor,this._element),this._element.parentNode.insertBefore(this._endAnchor,this._element.nextSibling),this._hasAttached=!0),this._hasAttached)}focusInitialElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusInitialElement(e)))})}focusFirstTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusFirstTabbableElement(e)))})}focusLastTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusLastTabbableElement(e)))})}_getRegionBoundary(e){let A=this._element.querySelectorAll(`[cdk-focus-region-${e}], [cdkFocusRegion${e}], [cdk-focus-${e}]`);return e=="start"?A.length?A[0]:this._getFirstTabbableElement(this._element):A.length?A[A.length-1]:this._getLastTabbableElement(this._element)}focusInitialElement(e){let A=this._element.querySelector("[cdk-focus-initial], [cdkFocusInitial]");if(A){if(!this._checker.isFocusable(A)){let t=this._getFirstTabbableElement(A);return t?.focus(e),!!t}return A.focus(e),!0}return this.focusFirstTabbableElement(e)}focusFirstTabbableElement(e){let A=this._getRegionBoundary("start");return A&&A.focus(e),!!A}focusLastTabbableElement(e){let A=this._getRegionBoundary("end");return A&&A.focus(e),!!A}hasAttached(){return this._hasAttached}_getFirstTabbableElement(e){if(this._checker.isFocusable(e)&&this._checker.isTabbable(e))return e;let A=e.children;for(let t=0;t=0;t--){let n=A[t].nodeType===this._document.ELEMENT_NODE?this._getLastTabbableElement(A[t]):null;if(n)return n}return null}_createAnchor(){let e=this._document.createElement("div");return this._toggleAnchorTabIndex(this._enabled,e),e.classList.add("cdk-visually-hidden"),e.classList.add("cdk-focus-trap-anchor"),e.setAttribute("aria-hidden","true"),e}_toggleAnchorTabIndex(e,A){e?A.setAttribute("tabindex","0"):A.removeAttribute("tabindex")}toggleAnchors(e){this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_executeOnStable(e){this._injector?ao(e,{injector:this._injector}):setTimeout(e)}},BQ=(()=>{class i{_checker=w(UI);_ngZone=w(We);_document=w(ci);_injector=w(St);constructor(){w(Eo).load(ZC)}create(A,t=!1){return new F3(A,this._checker,this._ngZone,this._document,t,this._injector)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var DL=new MA("liveAnnouncerElement",{providedIn:"root",factory:()=>null}),vL=new MA("LIVE_ANNOUNCER_DEFAULT_OPTIONS"),oeA=0,hQ=(()=>{class i{_ngZone=w(We);_defaultOptions=w(vL,{optional:!0});_liveElement;_document=w(ci);_sanitizer=w(jC);_previousTimeout;_currentPromise;_currentResolve;constructor(){let A=w(DL,{optional:!0});this._liveElement=A||this._createLiveElement()}announce(A,...t){let n=this._defaultOptions,o,a;return t.length===1&&typeof t[0]=="number"?a=t[0]:[o,a]=t,this.clear(),clearTimeout(this._previousTimeout),o||(o=n&&n.politeness?n.politeness:"polite"),a==null&&n&&(a=n.duration),this._liveElement.setAttribute("aria-live",o),this._liveElement.id&&this._exposeAnnouncerToModals(this._liveElement.id),this._ngZone.runOutsideAngular(()=>(this._currentPromise||(this._currentPromise=new Promise(r=>this._currentResolve=r)),clearTimeout(this._previousTimeout),this._previousTimeout=setTimeout(()=>{!A||typeof A=="string"?this._liveElement.textContent=A:BL(this._liveElement,A,this._sanitizer),typeof a=="number"&&(this._previousTimeout=setTimeout(()=>this.clear(),a)),this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0},100),this._currentPromise))}clear(){this._liveElement&&(this._liveElement.textContent="")}ngOnDestroy(){clearTimeout(this._previousTimeout),this._liveElement?.remove(),this._liveElement=null,this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0}_createLiveElement(){let A="cdk-live-announcer-element",t=this._document.getElementsByClassName(A),n=this._document.createElement("div");for(let o=0;o .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{class i{_platform=w(Qi);_hasCheckedHighContrastMode=!1;_document=w(ci);_breakpointSubscription;constructor(){this._breakpointSubscription=w(IQ).observe("(forced-colors: active)").subscribe(()=>{this._hasCheckedHighContrastMode&&(this._hasCheckedHighContrastMode=!1,this._applyBodyHighContrastModeCssClasses())})}getHighContrastMode(){if(!this._platform.isBrowser)return XC.NONE;let A=this._document.createElement("div");A.style.backgroundColor="rgb(1,2,3)",A.style.position="absolute",this._document.body.appendChild(A);let t=this._document.defaultView||window,n=t&&t.getComputedStyle?t.getComputedStyle(A):null,o=(n&&n.backgroundColor||"").replace(/ /g,"");switch(A.remove(),o){case"rgb(0,0,0)":case"rgb(45,50,54)":case"rgb(32,32,32)":return XC.WHITE_ON_BLACK;case"rgb(255,255,255)":case"rgb(255,250,239)":return XC.BLACK_ON_WHITE}return XC.NONE}ngOnDestroy(){this._breakpointSubscription.unsubscribe()}_applyBodyHighContrastModeCssClasses(){if(!this._hasCheckedHighContrastMode&&this._platform.isBrowser&&this._document.body){let A=this._document.body.classList;A.remove(uv,mL,wL),this._hasCheckedHighContrastMode=!0;let t=this.getHighContrastMode();t===XC.BLACK_ON_WHITE?A.add(uv,mL):t===XC.WHITE_ON_BLACK&&A.add(uv,wL)}}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),EQ=(()=>{class i{constructor(){w(bL)._applyBodyHighContrastModeCssClasses()}static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[N3]})}return i})();var pv={},Dn=class i{_appId=w(t3);static _infix=`a${Math.floor(Math.random()*1e5).toString()}`;getId(e,A=!1){return this._appId!=="ng"&&(e+=this._appId),pv.hasOwnProperty(e)||(pv[e]=0),`${e}${A?i._infix+"-":""}${pv[e]++}`}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var aeA=200,L3=class{_letterKeyStream=new ne;_items=[];_selectedItemIndex=-1;_pressedLetters=[];_skipPredicateFn;_selectedItem=new ne;selectedItem=this._selectedItem;constructor(e,A){let t=typeof A?.debounceInterval=="number"?A.debounceInterval:aeA;A?.skipPredicate&&(this._skipPredicateFn=A.skipPredicate),this.setItems(e),this._setupKeyHandler(t)}destroy(){this._pressedLetters=[],this._letterKeyStream.complete(),this._selectedItem.complete()}setCurrentSelectedItemIndex(e){this._selectedItemIndex=e}setItems(e){this._items=e}handleKey(e){let A=e.keyCode;e.key&&e.key.length===1?this._letterKeyStream.next(e.key.toLocaleUpperCase()):(A>=65&&A<=90||A>=48&&A<=57)&&this._letterKeyStream.next(String.fromCharCode(A))}isTyping(){return this._pressedLetters.length>0}reset(){this._pressedLetters=[]}_setupKeyHandler(e){this._letterKeyStream.pipe(mi(A=>this._pressedLetters.push(A)),Os(e),Bt(()=>this._pressedLetters.length>0),Se(()=>this._pressedLetters.join("").toLocaleUpperCase())).subscribe(A=>{for(let t=1;ti[A]):i.altKey||i.shiftKey||i.ctrlKey||i.metaKey}var TI=class{_items;_activeItemIndex=mA(-1);_activeItem=mA(null);_wrap=!1;_typeaheadSubscription=Oo.EMPTY;_itemChangesSubscription;_vertical=!0;_horizontal=null;_allowedModifierKeys=[];_homeAndEnd=!1;_pageUpAndDown={enabled:!1,delta:10};_effectRef;_typeahead;_skipPredicateFn=e=>e.disabled;constructor(e,A){this._items=e,e instanceof Rg?this._itemChangesSubscription=e.changes.subscribe(t=>this._itemsChanged(t.toArray())):M1(e)&&(this._effectRef=Fn(()=>this._itemsChanged(e()),{injector:A}))}tabOut=new ne;change=new ne;skipPredicate(e){return this._skipPredicateFn=e,this}withWrap(e=!0){return this._wrap=e,this}withVerticalOrientation(e=!0){return this._vertical=e,this}withHorizontalOrientation(e){return this._horizontal=e,this}withAllowedModifierKeys(e){return this._allowedModifierKeys=e,this}withTypeAhead(e=200){this._typeaheadSubscription.unsubscribe();let A=this._getItemsArray();return this._typeahead=new L3(A,{debounceInterval:typeof e=="number"?e:void 0,skipPredicate:t=>this._skipPredicateFn(t)}),this._typeaheadSubscription=this._typeahead.selectedItem.subscribe(t=>{this.setActiveItem(t)}),this}cancelTypeahead(){return this._typeahead?.reset(),this}withHomeAndEnd(e=!0){return this._homeAndEnd=e,this}withPageUpDown(e=!0,A=10){return this._pageUpAndDown={enabled:e,delta:A},this}setActiveItem(e){let A=this._activeItem();this.updateActiveItem(e),this._activeItem()!==A&&this.change.next(this._activeItemIndex())}onKeydown(e){let A=e.keyCode,n=["altKey","ctrlKey","metaKey","shiftKey"].every(o=>!e[o]||this._allowedModifierKeys.indexOf(o)>-1);switch(A){case 9:this.tabOut.next();return;case 40:if(this._vertical&&n){this.setNextItemActive();break}else return;case 38:if(this._vertical&&n){this.setPreviousItemActive();break}else return;case 39:if(this._horizontal&&n){this._horizontal==="rtl"?this.setPreviousItemActive():this.setNextItemActive();break}else return;case 37:if(this._horizontal&&n){this._horizontal==="rtl"?this.setNextItemActive():this.setPreviousItemActive();break}else return;case 36:if(this._homeAndEnd&&n){this.setFirstItemActive();break}else return;case 35:if(this._homeAndEnd&&n){this.setLastItemActive();break}else return;case 33:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex()-this._pageUpAndDown.delta;this._setActiveItemByIndex(o>0?o:0,1);break}else return;case 34:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex()+this._pageUpAndDown.delta,a=this._getItemsArray().length;this._setActiveItemByIndex(o-1&&t!==this._activeItemIndex()&&(this._activeItemIndex.set(t),this._typeahead?.setCurrentSelectedItemIndex(t))}}};var QQ=class extends TI{setActiveItem(e){this.activeItem&&this.activeItem.setInactiveStyles(),super.setActiveItem(e),this.activeItem&&this.activeItem.setActiveStyles()}};var O0=class extends TI{_origin="program";setFocusOrigin(e){return this._origin=e,this}setActiveItem(e){super.setActiveItem(e),this.activeItem&&this.activeItem.focus(this._origin)}};var kL=" ";function wv(i,e,A){let t=K3(i,e);A=A.trim(),!t.some(n=>n.trim()===A)&&(t.push(A),i.setAttribute(e,t.join(kL)))}function U3(i,e,A){let t=K3(i,e);A=A.trim();let n=t.filter(o=>o!==A);n.length?i.setAttribute(e,n.join(kL)):i.removeAttribute(e)}function K3(i,e){return i.getAttribute(e)?.match(/\S+/g)??[]}var _L="cdk-describedby-message",G3="cdk-describedby-host",mv=0,xL=(()=>{class i{_platform=w(Qi);_document=w(ci);_messageRegistry=new Map;_messagesContainer=null;_id=`${mv++}`;constructor(){w(Eo).load(ZC),this._id=w(t3)+"-"+mv++}describe(A,t,n){if(!this._canBeDescribed(A,t))return;let o=fv(t,n);typeof t!="string"?(SL(t,this._id),this._messageRegistry.set(o,{messageElement:t,referenceCount:0})):this._messageRegistry.has(o)||this._createMessageElement(t,n),this._isElementDescribedByMessage(A,o)||this._addMessageReference(A,o)}removeDescription(A,t,n){if(!t||!this._isElementNode(A))return;let o=fv(t,n);if(this._isElementDescribedByMessage(A,o)&&this._removeMessageReference(A,o),typeof t=="string"){let a=this._messageRegistry.get(o);a&&a.referenceCount===0&&this._deleteMessageElement(o)}this._messagesContainer?.childNodes.length===0&&(this._messagesContainer.remove(),this._messagesContainer=null)}ngOnDestroy(){let A=this._document.querySelectorAll(`[${G3}="${this._id}"]`);for(let t=0;tn.indexOf(_L)!=0);A.setAttribute("aria-describedby",t.join(" "))}_addMessageReference(A,t){let n=this._messageRegistry.get(t);wv(A,"aria-describedby",n.messageElement.id),A.setAttribute(G3,this._id),n.referenceCount++}_removeMessageReference(A,t){let n=this._messageRegistry.get(t);n.referenceCount--,U3(A,"aria-describedby",n.messageElement.id),A.removeAttribute(G3)}_isElementDescribedByMessage(A,t){let n=K3(A,"aria-describedby"),o=this._messageRegistry.get(t),a=o&&o.messageElement.id;return!!a&&n.indexOf(a)!=-1}_canBeDescribed(A,t){if(!this._isElementNode(A))return!1;if(t&&typeof t=="object")return!0;let n=t==null?"":`${t}`.trim(),o=A.getAttribute("aria-label");return n?!o||o.trim()!==n:!1}_isElementNode(A){return A.nodeType===this._document.ELEMENT_NODE}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function fv(i,e){return typeof i=="string"?`${e||""}/${i}`:i}function SL(i,e){i.id||(i.id=`${_L}-${e}-${mv++}`)}var Lg=(function(i){return i[i.NORMAL=0]="NORMAL",i[i.NEGATED=1]="NEGATED",i[i.INVERTED=2]="INVERTED",i})(Lg||{}),T3,O1;function O3(){if(O1==null){if(typeof document!="object"||!document||typeof Element!="function"||!Element)return O1=!1,O1;if(document.documentElement?.style&&"scrollBehavior"in document.documentElement.style)O1=!0;else{let i=Element.prototype.scrollTo;i?O1=!/\{\s*\[native code\]\s*\}/.test(i.toString()):O1=!1}}return O1}function OI(){if(typeof document!="object"||!document)return Lg.NORMAL;if(T3==null){let i=document.createElement("div"),e=i.style;i.dir="rtl",e.width="1px",e.overflow="auto",e.visibility="hidden",e.pointerEvents="none",e.position="absolute";let A=document.createElement("div"),t=A.style;t.width="2px",t.height="1px",i.appendChild(A),document.body.appendChild(i),T3=Lg.NORMAL,i.scrollLeft===0&&(i.scrollLeft=1,T3=i.scrollLeft===0?Lg.NEGATED:Lg.INVERTED),i.remove()}return T3}function yv(){return typeof __karma__<"u"&&!!__karma__||typeof jasmine<"u"&&!!jasmine||typeof jest<"u"&&!!jest||typeof Mocha<"u"&&!!Mocha}var JI,RL=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function Dv(){if(JI)return JI;if(typeof document!="object"||!document)return JI=new Set(RL),JI;let i=document.createElement("input");return JI=new Set(RL.filter(e=>(i.setAttribute("type",e),i.type===e))),JI}var NL={XSmall:"(max-width: 599.98px)",Small:"(min-width: 600px) and (max-width: 959.98px)",Medium:"(min-width: 960px) and (max-width: 1279.98px)",Large:"(min-width: 1280px) and (max-width: 1919.98px)",XLarge:"(min-width: 1920px)",Handset:"(max-width: 599.98px) and (orientation: portrait), (max-width: 959.98px) and (orientation: landscape)",Tablet:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait), (min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",Web:"(min-width: 840px) and (orientation: portrait), (min-width: 1280px) and (orientation: landscape)",HandsetPortrait:"(max-width: 599.98px) and (orientation: portrait)",TabletPortrait:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait)",WebPortrait:"(min-width: 840px) and (orientation: portrait)",HandsetLandscape:"(max-width: 959.98px) and (orientation: landscape)",TabletLandscape:"(min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",WebLandscape:"(min-width: 1280px) and (orientation: landscape)"};var seA=new MA("MATERIAL_ANIMATIONS"),FL=null;function uQ(){return w(seA,{optional:!0})?.animationsDisabled||w(b1,{optional:!0})==="NoopAnimations"?"di-disabled":(FL??=w(KI).matchMedia("(prefers-reduced-motion)").matches,FL?"reduced-motion":"enabled")}function In(){return uQ()!=="enabled"}function Wa(i){return i==null?"":typeof i=="string"?i:`${i}px`}function kr(i){return i!=null&&`${i}`!="false"}var _s=(function(i){return i[i.FADING_IN=0]="FADING_IN",i[i.VISIBLE=1]="VISIBLE",i[i.FADING_OUT=2]="FADING_OUT",i[i.HIDDEN=3]="HIDDEN",i})(_s||{}),vv=class{_renderer;element;config;_animationForciblyDisabledThroughCss;state=_s.HIDDEN;constructor(e,A,t,n=!1){this._renderer=e,this.element=A,this.config=t,this._animationForciblyDisabledThroughCss=n}fadeOut(){this._renderer.fadeOutRipple(this)}},LL=LI({passive:!0,capture:!0}),bv=class{_events=new Map;addHandler(e,A,t,n){let o=this._events.get(A);if(o){let a=o.get(t);a?a.add(n):o.set(t,new Set([n]))}else this._events.set(A,new Map([[t,new Set([n])]])),e.runOutsideAngular(()=>{document.addEventListener(A,this._delegateEventHandler,LL)})}removeHandler(e,A,t){let n=this._events.get(e);if(!n)return;let o=n.get(A);o&&(o.delete(t),o.size===0&&n.delete(A),n.size===0&&(this._events.delete(e),document.removeEventListener(e,this._delegateEventHandler,LL)))}_delegateEventHandler=e=>{let A=Pr(e);A&&this._events.get(e.type)?.forEach((t,n)=>{(n===A||n.contains(A))&&t.forEach(o=>o.handleEvent(e))})}},pQ={enterDuration:225,exitDuration:150},leA=800,GL=LI({passive:!0,capture:!0}),KL=["mousedown","touchstart"],UL=["mouseup","mouseleave","touchend","touchcancel"],geA=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["ng-component"]],hostAttrs:["mat-ripple-style-loader",""],decls:0,vars:0,template:function(t,n){},styles:[`.mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale3d(0, 0, 0);background-color:var(--mat-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface) 10%, transparent))}@media(forced-colors: active){.mat-ripple-element{display:none}}.cdk-drag-preview .mat-ripple-element,.cdk-drag-placeholder .mat-ripple-element{display:none} -`],encapsulation:2,changeDetection:0})}return i})(),fQ=class i{_target;_ngZone;_platform;_containerElement;_triggerElement=null;_isPointerDown=!1;_activeRipples=new Map;_mostRecentTransientRipple=null;_lastTouchStartEvent;_pointerUpEventsRegistered=!1;_containerRect=null;static _eventManager=new bv;constructor(e,A,t,n,o){this._target=e,this._ngZone=A,this._platform=n,n.isBrowser&&(this._containerElement=ks(t)),o&&o.get(Eo).load(geA)}fadeInRipple(e,A,t={}){let n=this._containerRect=this._containerRect||this._containerElement.getBoundingClientRect(),o=P(P({},pQ),t.animation);t.centered&&(e=n.left+n.width/2,A=n.top+n.height/2);let a=t.radius||ceA(e,A,n),r=e-n.left,s=A-n.top,l=o.enterDuration,g=document.createElement("div");g.classList.add("mat-ripple-element"),g.style.left=`${r-a}px`,g.style.top=`${s-a}px`,g.style.height=`${a*2}px`,g.style.width=`${a*2}px`,t.color!=null&&(g.style.backgroundColor=t.color),g.style.transitionDuration=`${l}ms`,this._containerElement.appendChild(g);let C=window.getComputedStyle(g),d=C.transitionProperty,B=C.transitionDuration,u=d==="none"||B==="0s"||B==="0s, 0s"||n.width===0&&n.height===0,E=new vv(this,g,t,u);g.style.transform="scale3d(1, 1, 1)",E.state=_s.FADING_IN,t.persistent||(this._mostRecentTransientRipple=E);let f=null;return!u&&(l||o.exitDuration)&&this._ngZone.runOutsideAngular(()=>{let m=()=>{f&&(f.fallbackTimer=null),clearTimeout(S),this._finishRippleTransition(E)},v=()=>this._destroyRipple(E),S=setTimeout(v,l+100);g.addEventListener("transitionend",m),g.addEventListener("transitioncancel",v),f={onTransitionEnd:m,onTransitionCancel:v,fallbackTimer:S}}),this._activeRipples.set(E,f),(u||!l)&&this._finishRippleTransition(E),E}fadeOutRipple(e){if(e.state===_s.FADING_OUT||e.state===_s.HIDDEN)return;let A=e.element,t=P(P({},pQ),e.config.animation);A.style.transitionDuration=`${t.exitDuration}ms`,A.style.opacity="0",e.state=_s.FADING_OUT,(e._animationForciblyDisabledThroughCss||!t.exitDuration)&&this._finishRippleTransition(e)}fadeOutAll(){this._getActiveRipples().forEach(e=>e.fadeOut())}fadeOutAllNonPersistent(){this._getActiveRipples().forEach(e=>{e.config.persistent||e.fadeOut()})}setupTriggerEvents(e){let A=ks(e);!this._platform.isBrowser||!A||A===this._triggerElement||(this._removeTriggerEvents(),this._triggerElement=A,KL.forEach(t=>{i._eventManager.addHandler(this._ngZone,t,A,this)}))}handleEvent(e){e.type==="mousedown"?this._onMousedown(e):e.type==="touchstart"?this._onTouchStart(e):this._onPointerUp(),this._pointerUpEventsRegistered||(this._ngZone.runOutsideAngular(()=>{UL.forEach(A=>{this._triggerElement.addEventListener(A,this,GL)})}),this._pointerUpEventsRegistered=!0)}_finishRippleTransition(e){e.state===_s.FADING_IN?this._startFadeOutTransition(e):e.state===_s.FADING_OUT&&this._destroyRipple(e)}_startFadeOutTransition(e){let A=e===this._mostRecentTransientRipple,{persistent:t}=e.config;e.state=_s.VISIBLE,!t&&(!A||!this._isPointerDown)&&e.fadeOut()}_destroyRipple(e){let A=this._activeRipples.get(e)??null;this._activeRipples.delete(e),this._activeRipples.size||(this._containerRect=null),e===this._mostRecentTransientRipple&&(this._mostRecentTransientRipple=null),e.state=_s.HIDDEN,A!==null&&(e.element.removeEventListener("transitionend",A.onTransitionEnd),e.element.removeEventListener("transitioncancel",A.onTransitionCancel),A.fallbackTimer!==null&&clearTimeout(A.fallbackTimer)),e.element.remove()}_onMousedown(e){let A=R1(e),t=this._lastTouchStartEvent&&Date.now(){let A=e.state===_s.VISIBLE||e.config.terminateOnPointerUp&&e.state===_s.FADING_IN;!e.config.persistent&&A&&e.fadeOut()}))}_getActiveRipples(){return Array.from(this._activeRipples.keys())}_removeTriggerEvents(){let e=this._triggerElement;e&&(KL.forEach(A=>i._eventManager.removeHandler(A,e,this)),this._pointerUpEventsRegistered&&(UL.forEach(A=>e.removeEventListener(A,this,GL)),this._pointerUpEventsRegistered=!1))}};function ceA(i,e,A){let t=Math.max(Math.abs(i-A.left),Math.abs(i-A.right)),n=Math.max(Math.abs(e-A.top),Math.abs(e-A.bottom));return Math.sqrt(t*t+n*n)}var $C=new MA("mat-ripple-global-options"),Cs=(()=>{class i{_elementRef=w(ce);_animationsDisabled=In();color;unbounded=!1;centered=!1;radius=0;animation;get disabled(){return this._disabled}set disabled(A){A&&this.fadeOutAllNonPersistent(),this._disabled=A,this._setupTriggerEventsIfEnabled()}_disabled=!1;get trigger(){return this._trigger||this._elementRef.nativeElement}set trigger(A){this._trigger=A,this._setupTriggerEventsIfEnabled()}_trigger;_rippleRenderer;_globalOptions;_isInitialized=!1;constructor(){let A=w(We),t=w(Qi),n=w($C,{optional:!0}),o=w(St);this._globalOptions=n||{},this._rippleRenderer=new fQ(this,A,this._elementRef,t,o)}ngOnInit(){this._isInitialized=!0,this._setupTriggerEventsIfEnabled()}ngOnDestroy(){this._rippleRenderer._removeTriggerEvents()}fadeOutAll(){this._rippleRenderer.fadeOutAll()}fadeOutAllNonPersistent(){this._rippleRenderer.fadeOutAllNonPersistent()}get rippleConfig(){return{centered:this.centered,radius:this.radius,color:this.color,animation:P(P(P({},this._globalOptions.animation),this._animationsDisabled?{enterDuration:0,exitDuration:0}:{}),this.animation),terminateOnPointerUp:this._globalOptions.terminateOnPointerUp}}get rippleDisabled(){return this.disabled||!!this._globalOptions.disabled}_setupTriggerEventsIfEnabled(){!this.disabled&&this._isInitialized&&this._rippleRenderer.setupTriggerEvents(this.trigger)}launch(A,t=0,n){return typeof A=="number"?this._rippleRenderer.fadeInRipple(A,t,P(P({},this.rippleConfig),n)):this._rippleRenderer.fadeInRipple(0,0,P(P({},this.rippleConfig),A))}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","mat-ripple",""],["","matRipple",""]],hostAttrs:[1,"mat-ripple"],hostVars:2,hostBindings:function(t,n){t&2&&_A("mat-ripple-unbounded",n.unbounded)},inputs:{color:[0,"matRippleColor","color"],unbounded:[0,"matRippleUnbounded","unbounded"],centered:[0,"matRippleCentered","centered"],radius:[0,"matRippleRadius","radius"],animation:[0,"matRippleAnimation","animation"],disabled:[0,"matRippleDisabled","disabled"],trigger:[0,"matRippleTrigger","trigger"]},exportAs:["matRipple"]})}return i})();var CeA={capture:!0},deA=["focus","mousedown","mouseenter","touchstart"],Mv="mat-ripple-loader-uninitialized",Sv="mat-ripple-loader-class-name",TL="mat-ripple-loader-centered",J3="mat-ripple-loader-disabled",Y3=(()=>{class i{_document=w(ci);_animationsDisabled=In();_globalRippleOptions=w($C,{optional:!0});_platform=w(Qi);_ngZone=w(We);_injector=w(St);_eventCleanups;_hosts=new Map;constructor(){let A=w(zr).createRenderer(null,null);this._eventCleanups=this._ngZone.runOutsideAngular(()=>deA.map(t=>A.listen(this._document,t,this._onInteraction,CeA)))}ngOnDestroy(){let A=this._hosts.keys();for(let t of A)this.destroyRipple(t);this._eventCleanups.forEach(t=>t())}configureRipple(A,t){A.setAttribute(Mv,this._globalRippleOptions?.namespace??""),(t.className||!A.hasAttribute(Sv))&&A.setAttribute(Sv,t.className||""),t.centered&&A.setAttribute(TL,""),t.disabled&&A.setAttribute(J3,"")}setDisabled(A,t){let n=this._hosts.get(A);n?(n.target.rippleDisabled=t,!t&&!n.hasSetUpEvents&&(n.hasSetUpEvents=!0,n.renderer.setupTriggerEvents(A))):t?A.setAttribute(J3,""):A.removeAttribute(J3)}_onInteraction=A=>{let t=Pr(A);if(t instanceof HTMLElement){let n=t.closest(`[${Mv}="${this._globalRippleOptions?.namespace??""}"]`);n&&this._createRipple(n)}};_createRipple(A){if(!this._document||this._hosts.has(A))return;A.querySelector(".mat-ripple")?.remove();let t=this._document.createElement("span");t.classList.add("mat-ripple",A.getAttribute(Sv)),A.append(t);let n=this._globalRippleOptions,o=this._animationsDisabled?0:n?.animation?.enterDuration??pQ.enterDuration,a=this._animationsDisabled?0:n?.animation?.exitDuration??pQ.exitDuration,r={rippleDisabled:this._animationsDisabled||n?.disabled||A.hasAttribute(J3),rippleConfig:{centered:A.hasAttribute(TL),terminateOnPointerUp:n?.terminateOnPointerUp,animation:{enterDuration:o,exitDuration:a}}},s=new fQ(r,this._ngZone,t,this._platform,this._injector),l=!r.rippleDisabled;l&&s.setupTriggerEvents(A),this._hosts.set(A,{target:r,renderer:s,hasSetUpEvents:l}),A.removeAttribute(Mv)}destroyRipple(A){let t=this._hosts.get(A);t&&(t.renderer._removeTriggerEvents(),this._hosts.delete(A))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var Qr=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["structural-styles"]],decls:0,vars:0,template:function(t,n){},styles:[`.mat-focus-indicator{position:relative}.mat-focus-indicator::before{top:0;left:0;right:0;bottom:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border-width:var(--mat-focus-indicator-border-width, 3px);border-style:var(--mat-focus-indicator-border-style, solid);border-color:var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus-visible::before{content:""}@media(forced-colors: active){html{--mat-focus-indicator-display: block}} -`],encapsulation:2,changeDetection:0})}return i})();var IeA=["mat-icon-button",""],BeA=["*"],heA=new MA("MAT_BUTTON_CONFIG");function OL(i){return i==null?void 0:yn(i)}var kv=(()=>{class i{_elementRef=w(ce);_ngZone=w(We);_animationsDisabled=In();_config=w(heA,{optional:!0});_focusMonitor=w(rr);_cleanupClick;_renderer=w(on);_rippleLoader=w(Y3);_isAnchor;_isFab=!1;color;get disableRipple(){return this._disableRipple}set disableRipple(A){this._disableRipple=A,this._updateRippleDisabled()}_disableRipple=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._updateRippleDisabled()}_disabled=!1;ariaDisabled;disabledInteractive;tabIndex;set _tabindex(A){this.tabIndex=A}constructor(){w(Eo).load(Qr);let A=this._elementRef.nativeElement;this._isAnchor=A.tagName==="A",this.disabledInteractive=this._config?.disabledInteractive??!1,this.color=this._config?.color??null,this._rippleLoader?.configureRipple(A,{className:"mat-mdc-button-ripple"})}ngAfterViewInit(){this._focusMonitor.monitor(this._elementRef,!0),this._isAnchor&&this._setupAsAnchor()}ngOnDestroy(){this._cleanupClick?.(),this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement)}focus(A="program",t){A?this._focusMonitor.focusVia(this._elementRef.nativeElement,A,t):this._elementRef.nativeElement.focus(t)}_getAriaDisabled(){return this.ariaDisabled!=null?this.ariaDisabled:this._isAnchor?this.disabled||null:this.disabled&&this.disabledInteractive?!0:null}_getDisabledAttribute(){return this.disabledInteractive||!this.disabled?null:!0}_updateRippleDisabled(){this._rippleLoader?.setDisabled(this._elementRef.nativeElement,this.disableRipple||this.disabled)}_getTabIndex(){return this._isAnchor?this.disabled&&!this.disabledInteractive?-1:this.tabIndex:this.tabIndex}_setupAsAnchor(){this._cleanupClick=this._ngZone.runOutsideAngular(()=>this._renderer.listen(this._elementRef.nativeElement,"click",A=>{this.disabled&&(A.preventDefault(),A.stopImmediatePropagation())}))}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,hostAttrs:[1,"mat-mdc-button-base"],hostVars:13,hostBindings:function(t,n){t&2&&(ie("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled())("tabindex",n._getTabIndex()),Ao(n.color?"mat-"+n.color:""),_A("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("mat-unthemed",!n.color)("_mat-animation-noopable",n._animationsDisabled))},inputs:{color:"color",disableRipple:[2,"disableRipple","disableRipple",Qe],disabled:[2,"disabled","disabled",Qe],ariaDisabled:[2,"aria-disabled","ariaDisabled",Qe],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Qe],tabIndex:[2,"tabIndex","tabIndex",OL],_tabindex:[2,"tabindex","_tabindex",OL]}})}return i})(),yi=(()=>{class i extends kv{constructor(){super(),this._rippleLoader.configureRipple(this._elementRef.nativeElement,{centered:!0})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["button","mat-icon-button",""],["a","mat-icon-button",""],["button","matIconButton",""],["a","matIconButton",""]],hostAttrs:[1,"mdc-icon-button","mat-mdc-icon-button"],exportAs:["matButton","matAnchor"],features:[bt],attrs:IeA,ngContentSelectors:BeA,decls:4,vars:0,consts:[[1,"mat-mdc-button-persistent-ripple","mdc-icon-button__ripple"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(t,n){t&1&&(Ot(),$n(0,"span",0),Ze(1),$n(2,"span",1)(3,"span",2))},styles:[`.mat-mdc-icon-button{-webkit-user-select:none;user-select:none;display:inline-block;position:relative;box-sizing:border-box;border:none;outline:none;background-color:rgba(0,0,0,0);fill:currentColor;text-decoration:none;cursor:pointer;z-index:0;overflow:visible;border-radius:var(--mat-icon-button-container-shape, var(--mat-sys-corner-full, 50%));flex-shrink:0;text-align:center;width:var(--mat-icon-button-state-layer-size, 40px);height:var(--mat-icon-button-state-layer-size, 40px);padding:calc(calc(var(--mat-icon-button-state-layer-size, 40px) - var(--mat-icon-button-icon-size, 24px)) / 2);font-size:var(--mat-icon-button-icon-size, 24px);color:var(--mat-icon-button-icon-color, var(--mat-sys-on-surface-variant));-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-icon-button .mat-mdc-button-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-icon-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-icon-button .mdc-button__label,.mat-mdc-icon-button .mat-icon{z-index:1;position:relative}.mat-mdc-icon-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-icon-button:focus-visible>.mat-focus-indicator::before{content:"";border-radius:inherit}.mat-mdc-icon-button .mat-ripple-element{background-color:var(--mat-icon-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface-variant) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-icon-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-icon-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-icon-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-icon-button-touch-target-size, 48px);display:var(--mat-icon-button-touch-target-display, block);left:50%;width:var(--mat-icon-button-touch-target-size, 48px);transform:translate(-50%, -50%)}.mat-mdc-icon-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-icon-button[disabled],.mat-mdc-icon-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-icon-button-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-icon-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-icon-button img,.mat-mdc-icon-button svg{width:var(--mat-icon-button-icon-size, 24px);height:var(--mat-icon-button-icon-size, 24px);vertical-align:baseline}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple{border-radius:var(--mat-icon-button-container-shape, var(--mat-sys-corner-full, 50%))}.mat-mdc-icon-button[hidden]{display:none}.mat-mdc-icon-button.mat-unthemed:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-primary:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-accent:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-warn:not(.mdc-ripple-upgraded):focus::before{background:rgba(0,0,0,0);opacity:1} -`,`@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-button-base.mat-tonal-button,.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}} -`],encapsulation:2,changeDetection:0})}return i})();var EeA=new MA("cdk-dir-doc",{providedIn:"root",factory:()=>w(ci)}),QeA=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;function JL(i){let e=i?.toLowerCase()||"";return e==="auto"&&typeof navigator<"u"&&navigator?.language?QeA.test(navigator.language)?"rtl":"ltr":e==="rtl"?"rtl":"ltr"}var No=(()=>{class i{get value(){return this.valueSignal()}valueSignal=mA("ltr");change=new FA;constructor(){let A=w(EeA,{optional:!0});if(A){let t=A.body?A.body.dir:null,n=A.documentElement?A.documentElement.dir:null;this.valueSignal.set(JL(t||n||"ltr"))}}ngOnDestroy(){this.change.complete()}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var Di=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({})}return i})();var Jc=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Di]})}return i})();var ueA=["matButton",""],peA=[[["",8,"material-icons",3,"iconPositionEnd",""],["mat-icon",3,"iconPositionEnd",""],["","matButtonIcon","",3,"iconPositionEnd",""]],"*",[["","iconPositionEnd","",8,"material-icons"],["mat-icon","iconPositionEnd",""],["","matButtonIcon","","iconPositionEnd",""]]],feA=[".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])","*",".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"];var YL=new Map([["text",["mat-mdc-button"]],["filled",["mdc-button--unelevated","mat-mdc-unelevated-button"]],["elevated",["mdc-button--raised","mat-mdc-raised-button"]],["outlined",["mdc-button--outlined","mat-mdc-outlined-button"]],["tonal",["mat-tonal-button"]]]),ki=(()=>{class i extends kv{get appearance(){return this._appearance}set appearance(A){this.setAppearance(A||this._config?.defaultAppearance||"text")}_appearance=null;constructor(){super();let A=meA(this._elementRef.nativeElement);A&&this.setAppearance(A)}setAppearance(A){if(A===this._appearance)return;let t=this._elementRef.nativeElement.classList,n=this._appearance?YL.get(this._appearance):null,o=YL.get(A);n&&t.remove(...n),t.add(...o),this._appearance=A}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["button","matButton",""],["a","matButton",""],["button","mat-button",""],["button","mat-raised-button",""],["button","mat-flat-button",""],["button","mat-stroked-button",""],["a","mat-button",""],["a","mat-raised-button",""],["a","mat-flat-button",""],["a","mat-stroked-button",""]],hostAttrs:[1,"mdc-button"],inputs:{appearance:[0,"matButton","appearance"]},exportAs:["matButton","matAnchor"],features:[bt],attrs:ueA,ngContentSelectors:feA,decls:7,vars:4,consts:[[1,"mat-mdc-button-persistent-ripple"],[1,"mdc-button__label"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(t,n){t&1&&(Ot(peA),$n(0,"span",0),Ze(1),Ln(2,"span",1),Ze(3,1),Xn(),Ze(4,2),$n(5,"span",2)(6,"span",3)),t&2&&_A("mdc-button__ripple",!n._isFab)("mdc-fab__ripple",n._isFab)},styles:[`.mat-mdc-button-base{text-decoration:none}.mat-mdc-button-base .mat-icon{min-height:fit-content;flex-shrink:0}@media(hover: none){.mat-mdc-button-base:hover>span.mat-mdc-button-persistent-ripple::before{opacity:0}}.mdc-button{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:64px;border:none;outline:none;line-height:inherit;-webkit-appearance:none;overflow:visible;vertical-align:middle;background:rgba(0,0,0,0);padding:0 8px}.mdc-button::-moz-focus-inner{padding:0;border:0}.mdc-button:active{outline:none}.mdc-button:hover{cursor:pointer}.mdc-button:disabled{cursor:default;pointer-events:none}.mdc-button[hidden]{display:none}.mdc-button .mdc-button__label{position:relative}.mat-mdc-button{padding:0 var(--mat-button-text-horizontal-padding, 12px);height:var(--mat-button-text-container-height, 40px);font-family:var(--mat-button-text-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-text-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-text-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-text-label-text-transform);font-weight:var(--mat-button-text-label-text-weight, var(--mat-sys-label-large-weight))}.mat-mdc-button,.mat-mdc-button .mdc-button__ripple{border-radius:var(--mat-button-text-container-shape, var(--mat-sys-corner-full))}.mat-mdc-button:not(:disabled){color:var(--mat-button-text-label-text-color, var(--mat-sys-primary))}.mat-mdc-button[disabled],.mat-mdc-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-text-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-button:has(.material-icons,mat-icon,[matButtonIcon]){padding:0 var(--mat-button-text-with-icon-horizontal-padding, 16px)}.mat-mdc-button>.mat-icon{margin-right:var(--mat-button-text-icon-spacing, 8px);margin-left:var(--mat-button-text-icon-offset, -4px)}[dir=rtl] .mat-mdc-button>.mat-icon{margin-right:var(--mat-button-text-icon-offset, -4px);margin-left:var(--mat-button-text-icon-spacing, 8px)}.mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-text-icon-offset, -4px);margin-left:var(--mat-button-text-icon-spacing, 8px)}[dir=rtl] .mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-text-icon-spacing, 8px);margin-left:var(--mat-button-text-icon-offset, -4px)}.mat-mdc-button .mat-ripple-element{background-color:var(--mat-button-text-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-text-state-layer-color, var(--mat-sys-primary))}.mat-mdc-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-text-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-text-touch-target-size, 48px);display:var(--mat-button-text-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-unelevated-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-filled-container-height, 40px);font-family:var(--mat-button-filled-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-filled-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-filled-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-filled-label-text-transform);font-weight:var(--mat-button-filled-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-filled-horizontal-padding, 24px)}.mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-button-filled-icon-spacing, 8px);margin-left:var(--mat-button-filled-icon-offset, -8px)}[dir=rtl] .mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-button-filled-icon-offset, -8px);margin-left:var(--mat-button-filled-icon-spacing, 8px)}.mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-filled-icon-offset, -8px);margin-left:var(--mat-button-filled-icon-spacing, 8px)}[dir=rtl] .mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-filled-icon-spacing, 8px);margin-left:var(--mat-button-filled-icon-offset, -8px)}.mat-mdc-unelevated-button .mat-ripple-element{background-color:var(--mat-button-filled-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-filled-state-layer-color, var(--mat-sys-on-primary))}.mat-mdc-unelevated-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-filled-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-unelevated-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-unelevated-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-unelevated-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-unelevated-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-filled-touch-target-size, 48px);display:var(--mat-button-filled-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-unelevated-button:not(:disabled){color:var(--mat-button-filled-label-text-color, var(--mat-sys-on-primary));background-color:var(--mat-button-filled-container-color, var(--mat-sys-primary))}.mat-mdc-unelevated-button,.mat-mdc-unelevated-button .mdc-button__ripple{border-radius:var(--mat-button-filled-container-shape, var(--mat-sys-corner-full))}.mat-mdc-unelevated-button[disabled],.mat-mdc-unelevated-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-filled-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-filled-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-raised-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);box-shadow:var(--mat-button-protected-container-elevation-shadow, var(--mat-sys-level1));height:var(--mat-button-protected-container-height, 40px);font-family:var(--mat-button-protected-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-protected-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-protected-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-protected-label-text-transform);font-weight:var(--mat-button-protected-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-protected-horizontal-padding, 24px)}.mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-button-protected-icon-spacing, 8px);margin-left:var(--mat-button-protected-icon-offset, -8px)}[dir=rtl] .mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-button-protected-icon-offset, -8px);margin-left:var(--mat-button-protected-icon-spacing, 8px)}.mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-protected-icon-offset, -8px);margin-left:var(--mat-button-protected-icon-spacing, 8px)}[dir=rtl] .mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-protected-icon-spacing, 8px);margin-left:var(--mat-button-protected-icon-offset, -8px)}.mat-mdc-raised-button .mat-ripple-element{background-color:var(--mat-button-protected-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-protected-state-layer-color, var(--mat-sys-primary))}.mat-mdc-raised-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-protected-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-raised-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-raised-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-raised-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-raised-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-protected-touch-target-size, 48px);display:var(--mat-button-protected-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-raised-button:not(:disabled){color:var(--mat-button-protected-label-text-color, var(--mat-sys-primary));background-color:var(--mat-button-protected-container-color, var(--mat-sys-surface))}.mat-mdc-raised-button,.mat-mdc-raised-button .mdc-button__ripple{border-radius:var(--mat-button-protected-container-shape, var(--mat-sys-corner-full))}@media(hover: hover){.mat-mdc-raised-button:hover{box-shadow:var(--mat-button-protected-hover-container-elevation-shadow, var(--mat-sys-level2))}}.mat-mdc-raised-button:focus{box-shadow:var(--mat-button-protected-focus-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button:active,.mat-mdc-raised-button:focus:active{box-shadow:var(--mat-button-protected-pressed-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button[disabled],.mat-mdc-raised-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-protected-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-protected-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-raised-button[disabled].mat-mdc-button-disabled,.mat-mdc-raised-button.mat-mdc-button-disabled.mat-mdc-button-disabled{box-shadow:var(--mat-button-protected-disabled-container-elevation-shadow, var(--mat-sys-level0))}.mat-mdc-raised-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-outlined-button{border-style:solid;transition:border 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-outlined-container-height, 40px);font-family:var(--mat-button-outlined-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-outlined-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-outlined-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-outlined-label-text-transform);font-weight:var(--mat-button-outlined-label-text-weight, var(--mat-sys-label-large-weight));border-radius:var(--mat-button-outlined-container-shape, var(--mat-sys-corner-full));border-width:var(--mat-button-outlined-outline-width, 1px);padding:0 var(--mat-button-outlined-horizontal-padding, 24px)}.mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-button-outlined-icon-spacing, 8px);margin-left:var(--mat-button-outlined-icon-offset, -8px)}[dir=rtl] .mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-button-outlined-icon-offset, -8px);margin-left:var(--mat-button-outlined-icon-spacing, 8px)}.mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-outlined-icon-offset, -8px);margin-left:var(--mat-button-outlined-icon-spacing, 8px)}[dir=rtl] .mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-outlined-icon-spacing, 8px);margin-left:var(--mat-button-outlined-icon-offset, -8px)}.mat-mdc-outlined-button .mat-ripple-element{background-color:var(--mat-button-outlined-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-outlined-state-layer-color, var(--mat-sys-primary))}.mat-mdc-outlined-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-outlined-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-outlined-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-outlined-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-outlined-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-outlined-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-outlined-touch-target-size, 48px);display:var(--mat-button-outlined-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-outlined-button:not(:disabled){color:var(--mat-button-outlined-label-text-color, var(--mat-sys-primary));border-color:var(--mat-button-outlined-outline-color, var(--mat-sys-outline))}.mat-mdc-outlined-button[disabled],.mat-mdc-outlined-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-outlined-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:var(--mat-button-outlined-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-tonal-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-tonal-container-height, 40px);font-family:var(--mat-button-tonal-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-tonal-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-tonal-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-tonal-label-text-transform);font-weight:var(--mat-button-tonal-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-tonal-horizontal-padding, 24px)}.mat-tonal-button:not(:disabled){color:var(--mat-button-tonal-label-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-button-tonal-container-color, var(--mat-sys-secondary-container))}.mat-tonal-button,.mat-tonal-button .mdc-button__ripple{border-radius:var(--mat-button-tonal-container-shape, var(--mat-sys-corner-full))}.mat-tonal-button[disabled],.mat-tonal-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-tonal-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-tonal-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-tonal-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-tonal-button>.mat-icon{margin-right:var(--mat-button-tonal-icon-spacing, 8px);margin-left:var(--mat-button-tonal-icon-offset, -8px)}[dir=rtl] .mat-tonal-button>.mat-icon{margin-right:var(--mat-button-tonal-icon-offset, -8px);margin-left:var(--mat-button-tonal-icon-spacing, 8px)}.mat-tonal-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-tonal-icon-offset, -8px);margin-left:var(--mat-button-tonal-icon-spacing, 8px)}[dir=rtl] .mat-tonal-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-tonal-icon-spacing, 8px);margin-left:var(--mat-button-tonal-icon-offset, -8px)}.mat-tonal-button .mat-ripple-element{background-color:var(--mat-button-tonal-ripple-color, color-mix(in srgb, var(--mat-sys-on-secondary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-tonal-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-tonal-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-tonal-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-tonal-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-tonal-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-tonal-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-tonal-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-tonal-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-tonal-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-tonal-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-tonal-touch-target-size, 48px);display:var(--mat-button-tonal-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-button,.mat-mdc-unelevated-button,.mat-mdc-raised-button,.mat-mdc-outlined-button,.mat-tonal-button{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before,.mat-tonal-button .mat-mdc-button-ripple,.mat-tonal-button .mat-mdc-button-persistent-ripple,.mat-tonal-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-tonal-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before,.mat-tonal-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-button .mdc-button__label,.mat-mdc-button .mat-icon,.mat-mdc-unelevated-button .mdc-button__label,.mat-mdc-unelevated-button .mat-icon,.mat-mdc-raised-button .mdc-button__label,.mat-mdc-raised-button .mat-icon,.mat-mdc-outlined-button .mdc-button__label,.mat-mdc-outlined-button .mat-icon,.mat-tonal-button .mdc-button__label,.mat-tonal-button .mat-icon{z-index:1;position:relative}.mat-mdc-button .mat-focus-indicator,.mat-mdc-unelevated-button .mat-focus-indicator,.mat-mdc-raised-button .mat-focus-indicator,.mat-mdc-outlined-button .mat-focus-indicator,.mat-tonal-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-unelevated-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-raised-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-outlined-button:focus-visible>.mat-focus-indicator::before,.mat-tonal-button:focus-visible>.mat-focus-indicator::before{content:"";border-radius:inherit}.mat-mdc-button._mat-animation-noopable,.mat-mdc-unelevated-button._mat-animation-noopable,.mat-mdc-raised-button._mat-animation-noopable,.mat-mdc-outlined-button._mat-animation-noopable,.mat-tonal-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-button>.mat-icon,.mat-mdc-unelevated-button>.mat-icon,.mat-mdc-raised-button>.mat-icon,.mat-mdc-outlined-button>.mat-icon,.mat-tonal-button>.mat-icon{display:inline-block;position:relative;vertical-align:top;font-size:1.125rem;height:1.125rem;width:1.125rem}.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mdc-button__ripple{top:-1px;left:-1px;bottom:-1px;right:-1px}.mat-mdc-unelevated-button .mat-focus-indicator::before,.mat-tonal-button .mat-focus-indicator::before,.mat-mdc-raised-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-outlined-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 3px)*-1)} -`,`@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-button-base.mat-tonal-button,.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}} -`],encapsulation:2,changeDetection:0})}return i})();function meA(i){return i.hasAttribute("mat-raised-button")?"elevated":i.hasAttribute("mat-stroked-button")?"outlined":i.hasAttribute("mat-flat-button")?"filled":i.hasAttribute("mat-button")?"text":null}var qi=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Jc,Di]})}return i})();var _v=class{_box;_destroyed=new ne;_resizeSubject=new ne;_resizeObserver;_elementObservables=new Map;constructor(e){this._box=e,typeof ResizeObserver<"u"&&(this._resizeObserver=new ResizeObserver(A=>this._resizeSubject.next(A)))}observe(e){return this._elementObservables.has(e)||this._elementObservables.set(e,new Fi(A=>{let t=this._resizeSubject.subscribe(A);return this._resizeObserver?.observe(e,{box:this._box}),()=>{this._resizeObserver?.unobserve(e),t.unsubscribe(),this._elementObservables.delete(e)}}).pipe(Bt(A=>A.some(t=>t.target===e)),Js({bufferSize:1,refCount:!0}),yt(this._destroyed))),this._elementObservables.get(e)}destroy(){this._destroyed.next(),this._destroyed.complete(),this._resizeSubject.complete(),this._elementObservables.clear()}},H3=(()=>{class i{_cleanupErrorListener;_observers=new Map;_ngZone=w(We);constructor(){typeof ResizeObserver<"u"}ngOnDestroy(){for(let[,A]of this._observers)A.destroy();this._observers.clear(),this._cleanupErrorListener?.()}observe(A,t){let n=t?.box||"content-box";return this._observers.has(n)||this._observers.set(n,new _v(n)),this._observers.get(n).observe(A)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var weA=["notch"],yeA=["matFormFieldNotchedOutline",""],DeA=["*"],HL=["iconPrefixContainer"],zL=["textPrefixContainer"],PL=["iconSuffixContainer"],jL=["textSuffixContainer"],veA=["textField"],beA=["*",[["mat-label"]],[["","matPrefix",""],["","matIconPrefix",""]],[["","matTextPrefix",""]],[["","matTextSuffix",""]],[["","matSuffix",""],["","matIconSuffix",""]],[["mat-error"],["","matError",""]],[["mat-hint",3,"align","end"]],[["mat-hint","align","end"]]],MeA=["*","mat-label","[matPrefix], [matIconPrefix]","[matTextPrefix]","[matTextSuffix]","[matSuffix], [matIconSuffix]","mat-error, [matError]","mat-hint:not([align='end'])","mat-hint[align='end']"];function SeA(i,e){i&1&&lA(0,"span",21)}function keA(i,e){if(i&1&&(I(0,"label",20),Ze(1,1),T(2,SeA,1,0,"span",21),h()),i&2){let A=p(2);H("floating",A._shouldLabelFloat())("monitorResize",A._hasOutline())("id",A._labelId),ie("for",A._control.disableAutomaticLabeling?null:A._control.id),Q(2),O(!A.hideRequiredMarker&&A._control.required?2:-1)}}function _eA(i,e){if(i&1&&T(0,keA,3,5,"label",20),i&2){let A=p();O(A._hasFloatingLabel()?0:-1)}}function xeA(i,e){i&1&&lA(0,"div",7)}function ReA(i,e){}function NeA(i,e){if(i&1&&kt(0,ReA,0,0,"ng-template",13),i&2){p(2);let A=Bi(1);H("ngTemplateOutlet",A)}}function FeA(i,e){if(i&1&&(I(0,"div",9),T(1,NeA,1,1,null,13),h()),i&2){let A=p();H("matFormFieldNotchedOutlineOpen",A._shouldLabelFloat()),Q(),O(A._forceDisplayInfixLabel()?-1:1)}}function LeA(i,e){i&1&&(I(0,"div",10,2),Ze(2,2),h())}function GeA(i,e){i&1&&(I(0,"div",11,3),Ze(2,3),h())}function KeA(i,e){}function UeA(i,e){if(i&1&&kt(0,KeA,0,0,"ng-template",13),i&2){p();let A=Bi(1);H("ngTemplateOutlet",A)}}function TeA(i,e){i&1&&(I(0,"div",14,4),Ze(2,4),h())}function OeA(i,e){i&1&&(I(0,"div",15,5),Ze(2,5),h())}function JeA(i,e){i&1&&lA(0,"div",16)}function YeA(i,e){i&1&&(I(0,"div",18),Ze(1,6),h())}function HeA(i,e){if(i&1&&(I(0,"mat-hint",22),D(1),h()),i&2){let A=p(2);H("id",A._hintLabelId),Q(),nA(A.hintLabel)}}function zeA(i,e){if(i&1&&(I(0,"div",19),T(1,HeA,2,2,"mat-hint",22),Ze(2,7),lA(3,"div",23),Ze(4,8),h()),i&2){let A=p();Q(),O(A.hintLabel?1:-1)}}var xs=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["mat-label"]]})}return i})(),AG=new MA("MatError"),xv=(()=>{class i{id=w(Dn).getId("mat-mdc-error-");constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["mat-error"],["","matError",""]],hostAttrs:[1,"mat-mdc-form-field-error","mat-mdc-form-field-bottom-align"],hostVars:1,hostBindings:function(t,n){t&2&&Ma("id",n.id)},inputs:{id:"id"},features:[pt([{provide:AG,useExisting:i}])]})}return i})(),J1=(()=>{class i{align="start";id=w(Dn).getId("mat-mdc-hint-");static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["mat-hint"]],hostAttrs:[1,"mat-mdc-form-field-hint","mat-mdc-form-field-bottom-align"],hostVars:4,hostBindings:function(t,n){t&2&&(Ma("id",n.id),ie("align",null),_A("mat-mdc-form-field-hint-end",n.align==="end"))},inputs:{align:"align",id:"id"}})}return i})(),eG=new MA("MatPrefix"),mQ=(()=>{class i{set _isTextSelector(A){this._isText=!0}_isText=!1;static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","matPrefix",""],["","matIconPrefix",""],["","matTextPrefix",""]],inputs:{_isTextSelector:[0,"matTextPrefix","_isTextSelector"]},features:[pt([{provide:eG,useExisting:i}])]})}return i})(),tG=new MA("MatSuffix"),Rv=(()=>{class i{set _isTextSelector(A){this._isText=!0}_isText=!1;static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","matSuffix",""],["","matIconSuffix",""],["","matTextSuffix",""]],inputs:{_isTextSelector:[0,"matTextSuffix","_isTextSelector"]},features:[pt([{provide:tG,useExisting:i}])]})}return i})(),iG=new MA("FloatingLabelParent"),VL=(()=>{class i{_elementRef=w(ce);get floating(){return this._floating}set floating(A){this._floating=A,this.monitorResize&&this._handleResize()}_floating=!1;get monitorResize(){return this._monitorResize}set monitorResize(A){this._monitorResize=A,this._monitorResize?this._subscribeToResize():this._resizeSubscription.unsubscribe()}_monitorResize=!1;_resizeObserver=w(H3);_ngZone=w(We);_parent=w(iG);_resizeSubscription=new Oo;constructor(){}ngOnDestroy(){this._resizeSubscription.unsubscribe()}getWidth(){return PeA(this._elementRef.nativeElement)}get element(){return this._elementRef.nativeElement}_handleResize(){setTimeout(()=>this._parent._handleLabelResized())}_subscribeToResize(){this._resizeSubscription.unsubscribe(),this._ngZone.runOutsideAngular(()=>{this._resizeSubscription=this._resizeObserver.observe(this._elementRef.nativeElement,{box:"border-box"}).subscribe(()=>this._handleResize())})}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["label","matFormFieldFloatingLabel",""]],hostAttrs:[1,"mdc-floating-label","mat-mdc-floating-label"],hostVars:2,hostBindings:function(t,n){t&2&&_A("mdc-floating-label--float-above",n.floating)},inputs:{floating:"floating",monitorResize:"monitorResize"}})}return i})();function PeA(i){let e=i;if(e.offsetParent!==null)return e.scrollWidth;let A=e.cloneNode(!0);A.style.setProperty("position","absolute"),A.style.setProperty("transform","translate(-9999px, -9999px)"),document.documentElement.appendChild(A);let t=A.scrollWidth;return A.remove(),t}var qL="mdc-line-ripple--active",z3="mdc-line-ripple--deactivating",WL=(()=>{class i{_elementRef=w(ce);_cleanupTransitionEnd;constructor(){let A=w(We),t=w(on);A.runOutsideAngular(()=>{this._cleanupTransitionEnd=t.listen(this._elementRef.nativeElement,"transitionend",this._handleTransitionEnd)})}activate(){let A=this._elementRef.nativeElement.classList;A.remove(z3),A.add(qL)}deactivate(){this._elementRef.nativeElement.classList.add(z3)}_handleTransitionEnd=A=>{let t=this._elementRef.nativeElement.classList,n=t.contains(z3);A.propertyName==="opacity"&&n&&t.remove(qL,z3)};ngOnDestroy(){this._cleanupTransitionEnd()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["div","matFormFieldLineRipple",""]],hostAttrs:[1,"mdc-line-ripple"]})}return i})(),ZL=(()=>{class i{_elementRef=w(ce);_ngZone=w(We);open=!1;_notch;ngAfterViewInit(){let A=this._elementRef.nativeElement,t=A.querySelector(".mdc-floating-label");t?(A.classList.add("mdc-notched-outline--upgraded"),typeof requestAnimationFrame=="function"&&(t.style.transitionDuration="0s",this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>t.style.transitionDuration="")}))):A.classList.add("mdc-notched-outline--no-label")}_setNotchWidth(A){let t=this._notch.nativeElement;!this.open||!A?t.style.width="":t.style.width=`calc(${A}px * var(--mat-mdc-form-field-floating-label-scale, 0.75) + 9px)`}_setMaxWidth(A){this._notch.nativeElement.style.setProperty("--mat-form-field-notch-max-width",`calc(100% - ${A}px)`)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["div","matFormFieldNotchedOutline",""]],viewQuery:function(t,n){if(t&1&&Wt(weA,5),t&2){let o;se(o=le())&&(n._notch=o.first)}},hostAttrs:[1,"mdc-notched-outline"],hostVars:2,hostBindings:function(t,n){t&2&&_A("mdc-notched-outline--notched",n.open)},inputs:{open:[0,"matFormFieldNotchedOutlineOpen","open"]},attrs:yeA,ngContentSelectors:DeA,decls:5,vars:0,consts:[["notch",""],[1,"mat-mdc-notch-piece","mdc-notched-outline__leading"],[1,"mat-mdc-notch-piece","mdc-notched-outline__notch"],[1,"mat-mdc-notch-piece","mdc-notched-outline__trailing"]],template:function(t,n){t&1&&(Ot(),$n(0,"div",1),Ln(1,"div",2,0),Ze(3),Xn(),$n(4,"div",3))},encapsulation:2,changeDetection:0})}return i})(),wQ=(()=>{class i{value=null;stateChanges;id;placeholder;ngControl=null;focused=!1;empty=!1;shouldLabelFloat=!1;required=!1;disabled=!1;errorState=!1;controlType;autofilled;userAriaDescribedBy;disableAutomaticLabeling;describedByIds;static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i})}return i})();var yQ=new MA("MatFormField"),jeA=new MA("MAT_FORM_FIELD_DEFAULT_OPTIONS"),XL="fill",VeA="auto",$L="fixed",qeA="translateY(-50%)",Zo=(()=>{class i{_elementRef=w(ce);_changeDetectorRef=w(Mt);_platform=w(Qi);_idGenerator=w(Dn);_ngZone=w(We);_defaults=w(jeA,{optional:!0});_currentDirection;_textField;_iconPrefixContainer;_textPrefixContainer;_iconSuffixContainer;_textSuffixContainer;_floatingLabel;_notchedOutline;_lineRipple;_iconPrefixContainerSignal=Yo("iconPrefixContainer");_textPrefixContainerSignal=Yo("textPrefixContainer");_iconSuffixContainerSignal=Yo("iconSuffixContainer");_textSuffixContainerSignal=Yo("textSuffixContainer");_prefixSuffixContainers=ye(()=>[this._iconPrefixContainerSignal(),this._textPrefixContainerSignal(),this._iconSuffixContainerSignal(),this._textSuffixContainerSignal()].map(A=>A?.nativeElement).filter(A=>A!==void 0));_formFieldControl;_prefixChildren;_suffixChildren;_errorChildren;_hintChildren;_labelChild=K0(xs);get hideRequiredMarker(){return this._hideRequiredMarker}set hideRequiredMarker(A){this._hideRequiredMarker=kr(A)}_hideRequiredMarker=!1;color="primary";get floatLabel(){return this._floatLabel||this._defaults?.floatLabel||VeA}set floatLabel(A){A!==this._floatLabel&&(this._floatLabel=A,this._changeDetectorRef.markForCheck())}_floatLabel;get appearance(){return this._appearanceSignal()}set appearance(A){let t=A||this._defaults?.appearance||XL;this._appearanceSignal.set(t)}_appearanceSignal=mA(XL);get subscriptSizing(){return this._subscriptSizing||this._defaults?.subscriptSizing||$L}set subscriptSizing(A){this._subscriptSizing=A||this._defaults?.subscriptSizing||$L}_subscriptSizing=null;get hintLabel(){return this._hintLabel}set hintLabel(A){this._hintLabel=A,this._processHints()}_hintLabel="";_hasIconPrefix=!1;_hasTextPrefix=!1;_hasIconSuffix=!1;_hasTextSuffix=!1;_labelId=this._idGenerator.getId("mat-mdc-form-field-label-");_hintLabelId=this._idGenerator.getId("mat-mdc-hint-");_describedByIds;get _control(){return this._explicitFormFieldControl||this._formFieldControl}set _control(A){this._explicitFormFieldControl=A}_destroyed=new ne;_isFocused=null;_explicitFormFieldControl;_previousControl=null;_previousControlValidatorFn=null;_stateChanges;_valueChanges;_describedByChanges;_outlineLabelOffsetResizeObserver=null;_animationsDisabled=In();constructor(){let A=this._defaults,t=w(No);A&&(A.appearance&&(this.appearance=A.appearance),this._hideRequiredMarker=!!A?.hideRequiredMarker,A.color&&(this.color=A.color)),Fn(()=>this._currentDirection=t.valueSignal()),this._syncOutlineLabelOffset()}ngAfterViewInit(){this._updateFocusState(),this._animationsDisabled||this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._elementRef.nativeElement.classList.add("mat-form-field-animations-enabled")},300)}),this._changeDetectorRef.detectChanges()}ngAfterContentInit(){this._assertFormFieldControl(),this._initializeSubscript(),this._initializePrefixAndSuffix()}ngAfterContentChecked(){this._assertFormFieldControl(),this._control!==this._previousControl&&(this._initializeControl(this._previousControl),this._control.ngControl&&this._control.ngControl.control&&(this._previousControlValidatorFn=this._control.ngControl.control.validator),this._previousControl=this._control),this._control.ngControl&&this._control.ngControl.control&&this._control.ngControl.control.validator!==this._previousControlValidatorFn&&this._changeDetectorRef.markForCheck()}ngOnDestroy(){this._outlineLabelOffsetResizeObserver?.disconnect(),this._stateChanges?.unsubscribe(),this._valueChanges?.unsubscribe(),this._describedByChanges?.unsubscribe(),this._destroyed.next(),this._destroyed.complete()}getLabelId=ye(()=>this._hasFloatingLabel()?this._labelId:null);getConnectedOverlayOrigin(){return this._textField||this._elementRef}_animateAndLockLabel(){this._hasFloatingLabel()&&(this.floatLabel="always")}_initializeControl(A){let t=this._control,n="mat-mdc-form-field-type-";A&&this._elementRef.nativeElement.classList.remove(n+A.controlType),t.controlType&&this._elementRef.nativeElement.classList.add(n+t.controlType),this._stateChanges?.unsubscribe(),this._stateChanges=t.stateChanges.subscribe(()=>{this._updateFocusState(),this._changeDetectorRef.markForCheck()}),this._describedByChanges?.unsubscribe(),this._describedByChanges=t.stateChanges.pipe(Yn([void 0,void 0]),Se(()=>[t.errorState,t.userAriaDescribedBy]),YC(),Bt(([[o,a],[r,s]])=>o!==r||a!==s)).subscribe(()=>this._syncDescribedByIds()),this._valueChanges?.unsubscribe(),t.ngControl&&t.ngControl.valueChanges&&(this._valueChanges=t.ngControl.valueChanges.pipe(yt(this._destroyed)).subscribe(()=>this._changeDetectorRef.markForCheck()))}_checkPrefixAndSuffixTypes(){this._hasIconPrefix=!!this._prefixChildren.find(A=>!A._isText),this._hasTextPrefix=!!this._prefixChildren.find(A=>A._isText),this._hasIconSuffix=!!this._suffixChildren.find(A=>!A._isText),this._hasTextSuffix=!!this._suffixChildren.find(A=>A._isText)}_initializePrefixAndSuffix(){this._checkPrefixAndSuffixTypes(),Vi(this._prefixChildren.changes,this._suffixChildren.changes).subscribe(()=>{this._checkPrefixAndSuffixTypes(),this._changeDetectorRef.markForCheck()})}_initializeSubscript(){this._hintChildren.changes.subscribe(()=>{this._processHints(),this._changeDetectorRef.markForCheck()}),this._errorChildren.changes.subscribe(()=>{this._syncDescribedByIds(),this._changeDetectorRef.markForCheck()}),this._validateHints(),this._syncDescribedByIds()}_assertFormFieldControl(){this._control}_updateFocusState(){let A=this._control.focused;A&&!this._isFocused?(this._isFocused=!0,this._lineRipple?.activate()):!A&&(this._isFocused||this._isFocused===null)&&(this._isFocused=!1,this._lineRipple?.deactivate()),this._elementRef.nativeElement.classList.toggle("mat-focused",A),this._textField?.nativeElement.classList.toggle("mdc-text-field--focused",A)}_syncOutlineLabelOffset(){KN({earlyRead:()=>{if(this._appearanceSignal()!=="outline")return this._outlineLabelOffsetResizeObserver?.disconnect(),null;if(globalThis.ResizeObserver){this._outlineLabelOffsetResizeObserver||=new globalThis.ResizeObserver(()=>{this._writeOutlinedLabelStyles(this._getOutlinedLabelOffset())});for(let A of this._prefixSuffixContainers())this._outlineLabelOffsetResizeObserver.observe(A,{box:"border-box"})}return this._getOutlinedLabelOffset()},write:A=>this._writeOutlinedLabelStyles(A())})}_shouldAlwaysFloat(){return this.floatLabel==="always"}_hasOutline(){return this.appearance==="outline"}_forceDisplayInfixLabel(){return!this._platform.isBrowser&&this._prefixChildren.length&&!this._shouldLabelFloat()}_hasFloatingLabel=ye(()=>!!this._labelChild());_shouldLabelFloat(){return this._hasFloatingLabel()?this._control.shouldLabelFloat||this._shouldAlwaysFloat():!1}_shouldForward(A){let t=this._control?this._control.ngControl:null;return t&&t[A]}_getSubscriptMessageType(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"}_handleLabelResized(){this._refreshOutlineNotchWidth()}_refreshOutlineNotchWidth(){!this._hasOutline()||!this._floatingLabel||!this._shouldLabelFloat()?this._notchedOutline?._setNotchWidth(0):this._notchedOutline?._setNotchWidth(this._floatingLabel.getWidth())}_processHints(){this._validateHints(),this._syncDescribedByIds()}_validateHints(){this._hintChildren}_syncDescribedByIds(){if(this._control){let A=[];if(this._control.userAriaDescribedBy&&typeof this._control.userAriaDescribedBy=="string"&&A.push(...this._control.userAriaDescribedBy.split(" ")),this._getSubscriptMessageType()==="hint"){let o=this._hintChildren?this._hintChildren.find(r=>r.align==="start"):null,a=this._hintChildren?this._hintChildren.find(r=>r.align==="end"):null;o?A.push(o.id):this._hintLabel&&A.push(this._hintLabelId),a&&A.push(a.id)}else this._errorChildren&&A.push(...this._errorChildren.map(o=>o.id));let t=this._control.describedByIds,n;if(t){let o=this._describedByIds||A;n=A.concat(t.filter(a=>a&&!o.includes(a)))}else n=A;this._control.setDescribedByIds(n),this._describedByIds=A}}_getOutlinedLabelOffset(){if(!this._hasOutline()||!this._floatingLabel)return null;if(!this._iconPrefixContainer&&!this._textPrefixContainer)return["",null];if(!this._isAttachedToDom())return null;let A=this._iconPrefixContainer?.nativeElement,t=this._textPrefixContainer?.nativeElement,n=this._iconSuffixContainer?.nativeElement,o=this._textSuffixContainer?.nativeElement,a=A?.getBoundingClientRect().width??0,r=t?.getBoundingClientRect().width??0,s=n?.getBoundingClientRect().width??0,l=o?.getBoundingClientRect().width??0,g=this._currentDirection==="rtl"?"-1":"1",C=`${a+r}px`,B=`calc(${g} * (${C} + var(--mat-mdc-form-field-label-offset-x, 0px)))`,u=`var(--mat-mdc-form-field-label-transform, ${qeA} translateX(${B}))`,E=a+r+s+l;return[u,E]}_writeOutlinedLabelStyles(A){if(A!==null){let[t,n]=A;this._floatingLabel&&(this._floatingLabel.element.style.transform=t),n!==null&&this._notchedOutline?._setMaxWidth(n)}}_isAttachedToDom(){let A=this._elementRef.nativeElement;if(A.getRootNode){let t=A.getRootNode();return t&&t!==A}return document.documentElement.contains(A)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-form-field"]],contentQueries:function(t,n,o){if(t&1&&(c3(o,n._labelChild,xs,5),ra(o,wQ,5)(o,eG,5)(o,tG,5)(o,AG,5)(o,J1,5)),t&2){br();let a;se(a=le())&&(n._formFieldControl=a.first),se(a=le())&&(n._prefixChildren=a),se(a=le())&&(n._suffixChildren=a),se(a=le())&&(n._errorChildren=a),se(a=le())&&(n._hintChildren=a)}},viewQuery:function(t,n){if(t&1&&(ls(n._iconPrefixContainerSignal,HL,5)(n._textPrefixContainerSignal,zL,5)(n._iconSuffixContainerSignal,PL,5)(n._textSuffixContainerSignal,jL,5),Wt(veA,5)(HL,5)(zL,5)(PL,5)(jL,5)(VL,5)(ZL,5)(WL,5)),t&2){br(4);let o;se(o=le())&&(n._textField=o.first),se(o=le())&&(n._iconPrefixContainer=o.first),se(o=le())&&(n._textPrefixContainer=o.first),se(o=le())&&(n._iconSuffixContainer=o.first),se(o=le())&&(n._textSuffixContainer=o.first),se(o=le())&&(n._floatingLabel=o.first),se(o=le())&&(n._notchedOutline=o.first),se(o=le())&&(n._lineRipple=o.first)}},hostAttrs:[1,"mat-mdc-form-field"],hostVars:38,hostBindings:function(t,n){t&2&&_A("mat-mdc-form-field-label-always-float",n._shouldAlwaysFloat())("mat-mdc-form-field-has-icon-prefix",n._hasIconPrefix)("mat-mdc-form-field-has-icon-suffix",n._hasIconSuffix)("mat-form-field-invalid",n._control.errorState)("mat-form-field-disabled",n._control.disabled)("mat-form-field-autofilled",n._control.autofilled)("mat-form-field-appearance-fill",n.appearance=="fill")("mat-form-field-appearance-outline",n.appearance=="outline")("mat-form-field-hide-placeholder",n._hasFloatingLabel()&&!n._shouldLabelFloat())("mat-primary",n.color!=="accent"&&n.color!=="warn")("mat-accent",n.color==="accent")("mat-warn",n.color==="warn")("ng-untouched",n._shouldForward("untouched"))("ng-touched",n._shouldForward("touched"))("ng-pristine",n._shouldForward("pristine"))("ng-dirty",n._shouldForward("dirty"))("ng-valid",n._shouldForward("valid"))("ng-invalid",n._shouldForward("invalid"))("ng-pending",n._shouldForward("pending"))},inputs:{hideRequiredMarker:"hideRequiredMarker",color:"color",floatLabel:"floatLabel",appearance:"appearance",subscriptSizing:"subscriptSizing",hintLabel:"hintLabel"},exportAs:["matFormField"],features:[pt([{provide:yQ,useExisting:i},{provide:iG,useExisting:i}])],ngContentSelectors:MeA,decls:18,vars:21,consts:[["labelTemplate",""],["textField",""],["iconPrefixContainer",""],["textPrefixContainer",""],["textSuffixContainer",""],["iconSuffixContainer",""],[1,"mat-mdc-text-field-wrapper","mdc-text-field",3,"click"],[1,"mat-mdc-form-field-focus-overlay"],[1,"mat-mdc-form-field-flex"],["matFormFieldNotchedOutline","",3,"matFormFieldNotchedOutlineOpen"],[1,"mat-mdc-form-field-icon-prefix"],[1,"mat-mdc-form-field-text-prefix"],[1,"mat-mdc-form-field-infix"],[3,"ngTemplateOutlet"],[1,"mat-mdc-form-field-text-suffix"],[1,"mat-mdc-form-field-icon-suffix"],["matFormFieldLineRipple",""],["aria-atomic","true","aria-live","polite",1,"mat-mdc-form-field-subscript-wrapper","mat-mdc-form-field-bottom-align"],[1,"mat-mdc-form-field-error-wrapper"],[1,"mat-mdc-form-field-hint-wrapper"],["matFormFieldFloatingLabel","",3,"floating","monitorResize","id"],["aria-hidden","true",1,"mat-mdc-form-field-required-marker","mdc-floating-label--required"],[3,"id"],[1,"mat-mdc-form-field-hint-spacer"]],template:function(t,n){if(t&1&&(Ot(beA),kt(0,_eA,1,1,"ng-template",null,0,PC),I(2,"div",6,1),U("click",function(a){return n._control.onContainerClick(a)}),T(4,xeA,1,0,"div",7),I(5,"div",8),T(6,FeA,2,2,"div",9),T(7,LeA,3,0,"div",10),T(8,GeA,3,0,"div",11),I(9,"div",12),T(10,UeA,1,1,null,13),Ze(11),h(),T(12,TeA,3,0,"div",14),T(13,OeA,3,0,"div",15),h(),T(14,JeA,1,0,"div",16),h(),I(15,"div",17),T(16,YeA,2,0,"div",18)(17,zeA,5,1,"div",19),h()),t&2){let o;Q(2),_A("mdc-text-field--filled",!n._hasOutline())("mdc-text-field--outlined",n._hasOutline())("mdc-text-field--no-label",!n._hasFloatingLabel())("mdc-text-field--disabled",n._control.disabled)("mdc-text-field--invalid",n._control.errorState),Q(2),O(!n._hasOutline()&&!n._control.disabled?4:-1),Q(2),O(n._hasOutline()?6:-1),Q(),O(n._hasIconPrefix?7:-1),Q(),O(n._hasTextPrefix?8:-1),Q(2),O(!n._hasOutline()||n._forceDisplayInfixLabel()?10:-1),Q(2),O(n._hasTextSuffix?12:-1),Q(),O(n._hasIconSuffix?13:-1),Q(),O(n._hasOutline()?-1:14),Q(),_A("mat-mdc-form-field-subscript-dynamic-size",n.subscriptSizing==="dynamic");let a=n._getSubscriptMessageType();Q(),O((o=a)==="error"?16:o==="hint"?17:-1)}},dependencies:[VL,ZL,Uc,WL,J1],styles:[`.mdc-text-field{display:inline-flex;align-items:baseline;padding:0 16px;position:relative;box-sizing:border-box;overflow:hidden;will-change:opacity,transform,color;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.mdc-text-field__input{width:100%;min-width:0;border:none;border-radius:0;background:none;padding:0;-moz-appearance:none;-webkit-appearance:none;height:28px}.mdc-text-field__input::-webkit-calendar-picker-indicator,.mdc-text-field__input::-webkit-search-cancel-button{display:none}.mdc-text-field__input::-ms-clear{display:none}.mdc-text-field__input:focus{outline:none}.mdc-text-field__input:invalid{box-shadow:none}.mdc-text-field__input::placeholder{opacity:0}.mdc-text-field__input::-moz-placeholder{opacity:0}.mdc-text-field__input::-webkit-input-placeholder{opacity:0}.mdc-text-field__input:-ms-input-placeholder{opacity:0}.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mdc-text-field--focused .mdc-text-field__input::placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{opacity:1}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-moz-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-webkit-input-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive:-ms-input-placeholder{opacity:0}.mdc-text-field--outlined .mdc-text-field__input,.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input{height:100%}.mdc-text-field--outlined .mdc-text-field__input{display:flex;border:none !important;background-color:rgba(0,0,0,0)}.mdc-text-field--disabled .mdc-text-field__input{pointer-events:auto}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mat-form-field-filled-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mat-form-field-filled-caret-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mat-form-field-outlined-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mat-form-field-outlined-caret-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mat-form-field-filled-error-caret-color, var(--mat-sys-error))}.mdc-text-field--outlined.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mat-form-field-outlined-error-caret-color, var(--mat-sys-error))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-text-field__input{color:var(--mat-form-field-filled-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-text-field__input{color:var(--mat-form-field-outlined-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-text-field--disabled .mdc-text-field__input{background-color:Window}}.mdc-text-field--filled{height:56px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:var(--mat-form-field-filled-container-shape, var(--mat-sys-corner-extra-small));border-top-right-radius:var(--mat-form-field-filled-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--mat-form-field-filled-container-color, var(--mat-sys-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled{background-color:var(--mat-form-field-filled-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 4%, transparent))}.mdc-text-field--outlined{height:56px;overflow:visible;padding-right:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)));padding-left:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)) + 4px)}[dir=rtl] .mdc-text-field--outlined{padding-right:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)) + 4px);padding-left:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)))}.mdc-floating-label{position:absolute;left:0;transform-origin:left top;line-height:1.15rem;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text;overflow:hidden;will-change:transform}[dir=rtl] .mdc-floating-label{right:0;left:auto;transform-origin:right top;text-align:right}.mdc-text-field .mdc-floating-label{top:50%;transform:translateY(-50%);pointer-events:none}.mdc-notched-outline .mdc-floating-label{display:inline-block;position:relative;max-width:100%}.mdc-text-field--outlined .mdc-floating-label{left:4px;right:auto}[dir=rtl] .mdc-text-field--outlined .mdc-floating-label{left:auto;right:4px}.mdc-text-field--filled .mdc-floating-label{left:16px;right:auto}[dir=rtl] .mdc-text-field--filled .mdc-floating-label{left:auto;right:16px}.mdc-text-field--disabled .mdc-floating-label{cursor:default}@media(forced-colors: active){.mdc-text-field--disabled .mdc-floating-label{z-index:1}}.mdc-text-field--filled.mdc-text-field--no-label .mdc-floating-label{display:none}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mat-form-field-filled-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-filled-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mat-form-field-filled-hover-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-floating-label{color:var(--mat-form-field-filled-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mat-form-field-filled-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-filled-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mat-form-field-filled-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--filled .mdc-floating-label{font-family:var(--mat-form-field-filled-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-form-field-filled-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-form-field-filled-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-form-field-filled-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mat-form-field-outlined-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-outlined-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mat-form-field-outlined-hover-label-text-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-floating-label{color:var(--mat-form-field-outlined-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mat-form-field-outlined-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-outlined-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mat-form-field-outlined-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined .mdc-floating-label{font-family:var(--mat-form-field-outlined-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-form-field-outlined-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-form-field-outlined-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-form-field-outlined-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-floating-label--float-above{cursor:auto;transform:translateY(-106%) scale(0.75)}.mdc-text-field--filled .mdc-floating-label--float-above{transform:translateY(-106%) scale(0.75)}.mdc-text-field--outlined .mdc-floating-label--float-above{transform:translateY(-37.25px) scale(1);font-size:.75rem}.mdc-notched-outline .mdc-floating-label--float-above{text-overflow:clip}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:133.3333333333%}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{transform:translateY(-34.75px) scale(0.75)}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:1px;margin-right:0;content:"*"}[dir=rtl] .mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:0;margin-right:1px}.mdc-notched-outline{display:flex;position:absolute;top:0;right:0;left:0;box-sizing:border-box;width:100%;max-width:100%;height:100%;text-align:left;pointer-events:none}[dir=rtl] .mdc-notched-outline{text-align:right}.mdc-text-field--outlined .mdc-notched-outline{z-index:1}.mat-mdc-notch-piece{box-sizing:border-box;height:100%;pointer-events:none;border:none;border-top:1px solid;border-bottom:1px solid}.mdc-text-field--focused .mat-mdc-notch-piece{border-width:2px}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-outline-color, var(--mat-sys-outline));border-width:var(--mat-form-field-outlined-outline-width, 1px)}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-hover-outline-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-focus-outline-color, var(--mat-sys-primary))}.mdc-text-field--outlined.mdc-text-field--disabled .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-notched-outline .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-hover-outline-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-focus-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline .mat-mdc-notch-piece{border-width:var(--mat-form-field-outlined-focus-outline-width, 2px)}.mdc-notched-outline__leading{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading{width:max(12px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)))}[dir=rtl] .mdc-notched-outline__leading{border-left:none;border-right:1px solid;border-bottom-left-radius:0;border-top-left-radius:0;border-top-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__trailing{flex-grow:1;border-left:none;border-right:1px solid;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}[dir=rtl] .mdc-notched-outline__trailing{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__notch{flex:0 0 auto;width:auto}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__notch{max-width:min(var(--mat-form-field-notch-max-width, 100%),calc(100% - max(12px, var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))) * 2))}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{max-width:min(100%,calc(100% - max(12px, var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))) * 2))}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:1px}.mdc-text-field--focused.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:2px}.mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:0;padding-right:8px;border-top:none}[dir=rtl] .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:8px;padding-right:0}.mdc-notched-outline--no-label .mdc-notched-outline__notch{display:none}.mdc-line-ripple::before,.mdc-line-ripple::after{position:absolute;bottom:0;left:0;width:100%;border-bottom-style:solid;content:""}.mdc-line-ripple::before{z-index:1;border-bottom-width:var(--mat-form-field-filled-active-indicator-height, 1px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-active-indicator-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-hover-active-indicator-color, var(--mat-sys-on-surface))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-disabled-active-indicator-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-error-active-indicator-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-error-hover-active-indicator-color, var(--mat-sys-on-error-container))}.mdc-line-ripple::after{transform:scaleX(0);opacity:0;z-index:2}.mdc-text-field--filled .mdc-line-ripple::after{border-bottom-width:var(--mat-form-field-filled-focus-active-indicator-height, 2px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mat-form-field-filled-focus-active-indicator-color, var(--mat-sys-primary))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mat-form-field-filled-error-focus-active-indicator-color, var(--mat-sys-error))}.mdc-line-ripple--active::after{transform:scaleX(1);opacity:1}.mdc-line-ripple--deactivating::after{opacity:0}.mdc-text-field--disabled{pointer-events:none}.mat-mdc-form-field-textarea-control{vertical-align:middle;resize:vertical;box-sizing:border-box;height:auto;margin:0;padding:0;border:none;overflow:auto}.mat-mdc-form-field-input-control.mat-mdc-form-field-input-control{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font:inherit;letter-spacing:inherit;text-decoration:inherit;text-transform:inherit;border:none}.mat-mdc-form-field .mat-mdc-floating-label.mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;line-height:normal;pointer-events:all;will-change:auto}.mat-mdc-form-field:not(.mat-form-field-disabled) .mat-mdc-floating-label.mdc-floating-label{cursor:inherit}.mdc-text-field--no-label:not(.mdc-text-field--textarea) .mat-mdc-form-field-input-control.mdc-text-field__input,.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control{height:auto}.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control.mdc-text-field__input[type=color]{height:23px}.mat-mdc-text-field-wrapper{height:auto;flex:auto;will-change:auto}.mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-left:0;--mat-mdc-form-field-label-offset-x: -16px}.mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:0}[dir=rtl] .mat-mdc-text-field-wrapper{padding-left:16px;padding-right:16px}[dir=rtl] .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-left:0}[dir=rtl] .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-right:0}.mat-form-field-disabled .mdc-text-field__input::placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-label-always-float .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}.mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .mat-mdc-floating-label{left:auto;right:auto}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-text-field__input{display:inline-block}.mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field .mdc-notched-outline__notch{padding-top:0}.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:1px solid rgba(0,0,0,0)}[dir=rtl] .mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:none;border-right:1px solid rgba(0,0,0,0)}.mat-mdc-form-field-infix{min-height:var(--mat-form-field-container-height, 56px);padding-top:var(--mat-form-field-filled-with-label-container-padding-top, 24px);padding-bottom:var(--mat-form-field-filled-with-label-container-padding-bottom, 8px)}.mdc-text-field--outlined .mat-mdc-form-field-infix,.mdc-text-field--no-label .mat-mdc-form-field-infix{padding-top:var(--mat-form-field-container-vertical-padding, 16px);padding-bottom:var(--mat-form-field-container-vertical-padding, 16px)}.mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:calc(var(--mat-form-field-container-height, 56px)/2)}.mdc-text-field--filled .mat-mdc-floating-label{display:var(--mat-form-field-filled-label-display, block)}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY(calc(calc(6.75px + var(--mat-form-field-container-height, 56px) / 2) * -1)) scale(var(--mat-mdc-form-field-floating-label-scale, 0.75));transform:var(--mat-mdc-form-field-label-transform)}@keyframes _mat-form-field-subscript-animation{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.mat-mdc-form-field-subscript-wrapper{box-sizing:border-box;width:100%;position:relative}.mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-error-wrapper{position:absolute;top:0;left:0;right:0;padding:0 16px;opacity:1;transform:translateY(0);animation:_mat-form-field-subscript-animation 0ms cubic-bezier(0.55, 0, 0.55, 0.2)}.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-error-wrapper{position:static}.mat-mdc-form-field-bottom-align::before{content:"";display:inline-block;height:16px}.mat-mdc-form-field-bottom-align.mat-mdc-form-field-subscript-dynamic-size::before{content:unset}.mat-mdc-form-field-hint-end{order:1}.mat-mdc-form-field-hint-wrapper{display:flex}.mat-mdc-form-field-hint-spacer{flex:1 0 1em}.mat-mdc-form-field-error{display:block;color:var(--mat-form-field-error-text-color, var(--mat-sys-error))}.mat-mdc-form-field-subscript-wrapper,.mat-mdc-form-field-bottom-align::before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-subscript-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-form-field-subscript-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-form-field-subscript-text-size, var(--mat-sys-body-small-size));letter-spacing:var(--mat-form-field-subscript-text-tracking, var(--mat-sys-body-small-tracking));font-weight:var(--mat-form-field-subscript-text-weight, var(--mat-sys-body-small-weight))}.mat-mdc-form-field-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;opacity:0;pointer-events:none;background-color:var(--mat-form-field-state-layer-color, var(--mat-sys-on-surface))}.mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-focus-state-layer-opacity, 0)}select.mat-mdc-form-field-input-control{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(0,0,0,0);display:inline-flex;box-sizing:border-box}select.mat-mdc-form-field-input-control:not(:disabled){cursor:pointer}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option{color:var(--mat-form-field-select-option-text-color, var(--mat-sys-neutral10))}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option:disabled{color:var(--mat-form-field-select-disabled-option-text-color, color-mix(in srgb, var(--mat-sys-neutral10) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{content:"";width:0;height:0;border-left:5px solid rgba(0,0,0,0);border-right:5px solid rgba(0,0,0,0);border-top:5px solid;position:absolute;right:0;top:50%;margin-top:-2.5px;pointer-events:none;color:var(--mat-form-field-enabled-select-arrow-color, var(--mat-sys-on-surface-variant))}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{right:auto;left:0}.mat-mdc-form-field-type-mat-native-select.mat-focused .mat-mdc-form-field-infix::after{color:var(--mat-form-field-focus-select-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field-type-mat-native-select.mat-form-field-disabled .mat-mdc-form-field-infix::after{color:var(--mat-form-field-disabled-select-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:15px}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:0;padding-left:15px}@media(forced-colors: active){.mat-form-field-appearance-fill .mat-mdc-text-field-wrapper{outline:solid 1px}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-form-field-disabled .mat-mdc-text-field-wrapper{outline-color:GrayText}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-focused .mat-mdc-text-field-wrapper{outline:dashed 3px}}@media(forced-colors: active){.mat-mdc-form-field.mat-focused .mdc-notched-outline{border:dashed 3px}}.mat-mdc-form-field-input-control[type=date],.mat-mdc-form-field-input-control[type=datetime],.mat-mdc-form-field-input-control[type=datetime-local],.mat-mdc-form-field-input-control[type=month],.mat-mdc-form-field-input-control[type=week],.mat-mdc-form-field-input-control[type=time]{line-height:1}.mat-mdc-form-field-input-control::-webkit-datetime-edit{line-height:1;padding:0;margin-bottom:-2px}.mat-mdc-form-field{--mat-mdc-form-field-floating-label-scale: 0.75;display:inline-flex;flex-direction:column;min-width:0;text-align:left;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-container-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-form-field-container-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-form-field-container-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-form-field-container-text-tracking, var(--mat-sys-body-large-tracking));font-weight:var(--mat-form-field-container-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-floating-label--float-above{font-size:calc(var(--mat-form-field-outlined-label-text-populated-size)*var(--mat-mdc-form-field-floating-label-scale))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:var(--mat-form-field-outlined-label-text-populated-size)}[dir=rtl] .mat-mdc-form-field{text-align:right}.mat-mdc-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-mdc-text-field-wrapper{width:100%;z-index:0}.mat-mdc-form-field-icon-prefix,.mat-mdc-form-field-icon-suffix{align-self:center;line-height:0;pointer-events:auto;position:relative;z-index:1}.mat-mdc-form-field-icon-prefix>.mat-icon,.mat-mdc-form-field-icon-suffix>.mat-icon{padding:0 12px;box-sizing:content-box}.mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-leading-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-disabled-leading-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-disabled-trailing-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-invalid .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-trailing-icon-color, var(--mat-sys-error))}.mat-form-field-invalid:not(.mat-focused):not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-hover-trailing-icon-color, var(--mat-sys-on-error-container))}.mat-form-field-invalid.mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-focus-trailing-icon-color, var(--mat-sys-error))}.mat-mdc-form-field-icon-prefix,[dir=rtl] .mat-mdc-form-field-icon-suffix{padding:0 4px 0 0}.mat-mdc-form-field-icon-suffix,[dir=rtl] .mat-mdc-form-field-icon-prefix{padding:0 0 0 4px}.mat-mdc-form-field-subscript-wrapper .mat-icon,.mat-mdc-form-field label .mat-icon{width:1em;height:1em;font-size:inherit}.mat-mdc-form-field-infix{flex:auto;min-width:0;width:180px;position:relative;box-sizing:border-box}.mat-mdc-form-field-infix:has(textarea[cols]){width:auto}.mat-mdc-form-field .mdc-notched-outline__notch{margin-left:-1px;-webkit-clip-path:inset(-9em -999em -9em 1px);clip-path:inset(-9em -999em -9em 1px)}[dir=rtl] .mat-mdc-form-field .mdc-notched-outline__notch{margin-left:0;margin-right:-1px;-webkit-clip-path:inset(-9em 1px -9em -999em);clip-path:inset(-9em 1px -9em -999em)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-floating-label{transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1),color 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input{transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::-moz-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::-webkit-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input:-ms-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field--filled:not(.mdc-ripple-upgraded):focus .mdc-text-field__ripple::before{transition-duration:75ms}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-line-ripple::after{transition:transform 180ms cubic-bezier(0.4, 0, 0.2, 1),opacity 180ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field.mat-form-field-animations-enabled .mat-mdc-form-field-error-wrapper{animation-duration:300ms}.mdc-notched-outline .mdc-floating-label{max-width:calc(100% + 1px)}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:calc(133.3333333333% + 1px)} -`],encapsulation:2,changeDetection:0})}return i})();var Za=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[N3,Zo,Di]})}return i})();var nG=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["ng-component"]],hostAttrs:["cdk-text-field-style-loader",""],decls:0,vars:0,template:function(t,n){},styles:[`textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0 !important;box-sizing:content-box !important;height:auto !important;overflow:hidden !important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0 !important;box-sizing:content-box !important;height:0 !important}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms} -`],encapsulation:2,changeDetection:0})}return i})(),WeA={passive:!0},oG=(()=>{class i{_platform=w(Qi);_ngZone=w(We);_renderer=w(zr).createRenderer(null,null);_styleLoader=w(Eo);_monitoredElements=new Map;constructor(){}monitor(A){if(!this._platform.isBrowser)return Br;this._styleLoader.load(nG);let t=ks(A),n=this._monitoredElements.get(t);if(n)return n.subject;let o=new ne,a="cdk-text-field-autofilled",r=l=>{l.animationName==="cdk-text-field-autofill-start"&&!t.classList.contains(a)?(t.classList.add(a),this._ngZone.run(()=>o.next({target:l.target,isAutofilled:!0}))):l.animationName==="cdk-text-field-autofill-end"&&t.classList.contains(a)&&(t.classList.remove(a),this._ngZone.run(()=>o.next({target:l.target,isAutofilled:!1})))},s=this._ngZone.runOutsideAngular(()=>(t.classList.add("cdk-text-field-autofill-monitored"),this._renderer.listen(t,"animationstart",r,WeA)));return this._monitoredElements.set(t,{subject:o,unlisten:s}),o}stopMonitoring(A){let t=ks(A),n=this._monitoredElements.get(t);n&&(n.unlisten(),n.subject.complete(),t.classList.remove("cdk-text-field-autofill-monitored"),t.classList.remove("cdk-text-field-autofilled"),this._monitoredElements.delete(t))}ngOnDestroy(){this._monitoredElements.forEach((A,t)=>this.stopMonitoring(t))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var P3=(()=>{class i{_elementRef=w(ce);_platform=w(Qi);_ngZone=w(We);_renderer=w(on);_resizeEvents=new ne;_previousValue;_initialHeight;_destroyed=new ne;_listenerCleanups;_minRows;_maxRows;_enabled=!0;_previousMinRows=-1;_textareaElement;get minRows(){return this._minRows}set minRows(A){this._minRows=qs(A),this._setMinHeight()}get maxRows(){return this._maxRows}set maxRows(A){this._maxRows=qs(A),this._setMaxHeight()}get enabled(){return this._enabled}set enabled(A){this._enabled!==A&&((this._enabled=A)?this.resizeToFitContent(!0):this.reset())}get placeholder(){return this._textareaElement.placeholder}set placeholder(A){this._cachedPlaceholderHeight=void 0,A?this._textareaElement.setAttribute("placeholder",A):this._textareaElement.removeAttribute("placeholder"),this._cacheTextareaPlaceholderHeight()}_cachedLineHeight;_cachedPlaceholderHeight;_document=w(ci);_hasFocus=!1;_isViewInited=!1;constructor(){w(Eo).load(nG),this._textareaElement=this._elementRef.nativeElement}_setMinHeight(){let A=this.minRows&&this._cachedLineHeight?`${this.minRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.minHeight=A)}_setMaxHeight(){let A=this.maxRows&&this._cachedLineHeight?`${this.maxRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.maxHeight=A)}ngAfterViewInit(){this._platform.isBrowser&&(this._initialHeight=this._textareaElement.style.height,this.resizeToFitContent(),this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[this._renderer.listen("window","resize",()=>this._resizeEvents.next()),this._renderer.listen(this._textareaElement,"focus",this._handleFocusEvent),this._renderer.listen(this._textareaElement,"blur",this._handleFocusEvent)],this._resizeEvents.pipe(v1(16)).subscribe(()=>{this._cachedLineHeight=this._cachedPlaceholderHeight=void 0,this.resizeToFitContent(!0)})}),this._isViewInited=!0,this.resizeToFitContent(!0))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A()),this._resizeEvents.complete(),this._destroyed.next(),this._destroyed.complete()}_cacheTextareaLineHeight(){if(this._cachedLineHeight)return;let A=this._textareaElement.cloneNode(!1),t=A.style;A.rows=1,t.position="absolute",t.visibility="hidden",t.border="none",t.padding="0",t.height="",t.minHeight="",t.maxHeight="",t.top=t.bottom=t.left=t.right="auto",t.overflow="hidden",this._textareaElement.parentNode.appendChild(A),this._cachedLineHeight=A.clientHeight,A.remove(),this._setMinHeight(),this._setMaxHeight()}_measureScrollHeight(){let A=this._textareaElement,t=A.style.marginBottom||"",n=this._platform.FIREFOX,o=this._hasFocus,a=n?"cdk-textarea-autosize-measuring-firefox":"cdk-textarea-autosize-measuring";o&&(A.style.marginBottom=`${A.clientHeight}px`),A.classList.add(a);let r=A.scrollHeight-4;return A.classList.remove(a),o&&(A.style.marginBottom=t),r}_cacheTextareaPlaceholderHeight(){if(!this._isViewInited||this._cachedPlaceholderHeight!=null)return;if(!this.placeholder){this._cachedPlaceholderHeight=0;return}let A=this._textareaElement.value;this._textareaElement.value=this._textareaElement.placeholder,this._cachedPlaceholderHeight=this._measureScrollHeight(),this._textareaElement.value=A}_handleFocusEvent=A=>{this._hasFocus=A.type==="focus"};ngDoCheck(){this._platform.isBrowser&&this.resizeToFitContent()}resizeToFitContent(A=!1){if(!this._enabled||(this._cacheTextareaLineHeight(),this._cacheTextareaPlaceholderHeight(),!this._cachedLineHeight))return;let t=this._elementRef.nativeElement,n=t.value;if(!A&&this._minRows===this._previousMinRows&&n===this._previousValue)return;let o=this._measureScrollHeight(),a=Math.max(o,this._cachedPlaceholderHeight||0);t.style.height=`${a}px`,this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame<"u"?requestAnimationFrame(()=>this._scrollToCaretPosition(t)):setTimeout(()=>this._scrollToCaretPosition(t))}),this._previousValue=n,this._previousMinRows=this._minRows}reset(){this._initialHeight!==void 0&&(this._textareaElement.style.height=this._initialHeight)}_noopInputHandler(){}_scrollToCaretPosition(A){let{selectionStart:t,selectionEnd:n}=A;!this._destroyed.isStopped&&this._hasFocus&&A.setSelectionRange(t,n)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["textarea","cdkTextareaAutosize",""]],hostAttrs:["rows","1",1,"cdk-textarea-autosize"],hostBindings:function(t,n){t&1&&U("input",function(){return n._noopInputHandler()})},inputs:{minRows:[0,"cdkAutosizeMinRows","minRows"],maxRows:[0,"cdkAutosizeMaxRows","maxRows"],enabled:[2,"cdkTextareaAutosize","enabled",Qe],placeholder:"placeholder"},exportAs:["cdkTextareaAutosize"]})}return i})(),YI=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({})}return i})();var rG=new MA("MAT_INPUT_VALUE_ACCESSOR");var HI=(()=>{class i{isErrorState(A,t){return!!(A&&A.invalid&&(A.touched||t&&t.submitted))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var zI=class{_defaultMatcher;ngControl;_parentFormGroup;_parentForm;_stateChanges;errorState=!1;matcher;constructor(e,A,t,n,o){this._defaultMatcher=e,this.ngControl=A,this._parentFormGroup=t,this._parentForm=n,this._stateChanges=o}updateErrorState(){let e=this.errorState,A=this._parentFormGroup||this._parentForm,t=this.matcher||this._defaultMatcher,n=this.ngControl?this.ngControl.control:null,o=t?.isErrorState(n,A)??!1;o!==e&&(this.errorState=o,this._stateChanges.next())}};var ZeA=["button","checkbox","file","hidden","image","radio","range","reset","submit"],XeA=new MA("MAT_INPUT_CONFIG"),ka=(()=>{class i{_elementRef=w(ce);_platform=w(Qi);ngControl=w(Vs,{optional:!0,self:!0});_autofillMonitor=w(oG);_ngZone=w(We);_formField=w(yQ,{optional:!0});_renderer=w(on);_uid=w(Dn).getId("mat-input-");_previousNativeValue;_inputValueAccessor;_signalBasedValueAccessor;_previousPlaceholder=null;_errorStateTracker;_config=w(XeA,{optional:!0});_cleanupIosKeyup;_cleanupWebkitWheel;_isServer=!1;_isNativeSelect=!1;_isTextarea=!1;_isInFormField=!1;focused=!1;stateChanges=new ne;controlType="mat-input";autofilled=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=kr(A),this.focused&&(this.focused=!1,this.stateChanges.next())}_disabled=!1;get id(){return this._id}set id(A){this._id=A||this._uid}_id;placeholder;name;get required(){return this._required??this.ngControl?.control?.hasValidator(js.required)??!1}set required(A){this._required=kr(A)}_required;get type(){return this._type}set type(A){this._type=A||"text",this._validateType(),!this._isTextarea&&Dv().has(this._type)&&(this._elementRef.nativeElement.type=this._type)}_type="text";get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}userAriaDescribedBy;get value(){return this._signalBasedValueAccessor?this._signalBasedValueAccessor.value():this._inputValueAccessor.value}set value(A){A!==this.value&&(this._signalBasedValueAccessor?this._signalBasedValueAccessor.value.set(A):this._inputValueAccessor.value=A,this.stateChanges.next())}get readonly(){return this._readonly}set readonly(A){this._readonly=kr(A)}_readonly=!1;disabledInteractive;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}_neverEmptyInputTypes=["date","datetime","datetime-local","month","time","week"].filter(A=>Dv().has(A));constructor(){let A=w(FI,{optional:!0}),t=w(qC,{optional:!0}),n=w(HI),o=w(rG,{optional:!0,self:!0}),a=this._elementRef.nativeElement,r=a.nodeName.toLowerCase();o?M1(o.value)?this._signalBasedValueAccessor=o:this._inputValueAccessor=o:this._inputValueAccessor=a,this._previousNativeValue=this.value,this.id=this.id,this._platform.IOS&&this._ngZone.runOutsideAngular(()=>{this._cleanupIosKeyup=this._renderer.listen(a,"keyup",this._iOSKeyupListener)}),this._errorStateTracker=new zI(n,this.ngControl,t,A,this.stateChanges),this._isServer=!this._platform.isBrowser,this._isNativeSelect=r==="select",this._isTextarea=r==="textarea",this._isInFormField=!!this._formField,this.disabledInteractive=this._config?.disabledInteractive||!1,this._isNativeSelect&&(this.controlType=a.multiple?"mat-native-select-multiple":"mat-native-select"),this._signalBasedValueAccessor&&Fn(()=>{this._signalBasedValueAccessor.value(),this.stateChanges.next()})}ngAfterViewInit(){this._platform.isBrowser&&this._autofillMonitor.monitor(this._elementRef.nativeElement).subscribe(A=>{this.autofilled=A.isAutofilled,this.stateChanges.next()})}ngOnChanges(){this.stateChanges.next()}ngOnDestroy(){this.stateChanges.complete(),this._platform.isBrowser&&this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement),this._cleanupIosKeyup?.(),this._cleanupWebkitWheel?.()}ngDoCheck(){this.ngControl&&(this.updateErrorState(),this.ngControl.disabled!==null&&this.ngControl.disabled!==this.disabled&&(this.disabled=this.ngControl.disabled,this.stateChanges.next())),this._dirtyCheckNativeValue(),this._dirtyCheckPlaceholder()}focus(A){this._elementRef.nativeElement.focus(A)}updateErrorState(){this._errorStateTracker.updateErrorState()}_focusChanged(A){if(A!==this.focused){if(!this._isNativeSelect&&A&&this.disabled&&this.disabledInteractive){let t=this._elementRef.nativeElement;t.type==="number"?(t.type="text",t.setSelectionRange(0,0),t.type="number"):t.setSelectionRange(0,0)}this.focused=A,this.stateChanges.next()}}_onInput(){}_dirtyCheckNativeValue(){let A=this._elementRef.nativeElement.value;this._previousNativeValue!==A&&(this._previousNativeValue=A,this.stateChanges.next())}_dirtyCheckPlaceholder(){let A=this._getPlaceholder();if(A!==this._previousPlaceholder){let t=this._elementRef.nativeElement;this._previousPlaceholder=A,A?t.setAttribute("placeholder",A):t.removeAttribute("placeholder")}}_getPlaceholder(){return this.placeholder||null}_validateType(){ZeA.indexOf(this._type)>-1}_isNeverEmpty(){return this._neverEmptyInputTypes.indexOf(this._type)>-1}_isBadInput(){let A=this._elementRef.nativeElement.validity;return A&&A.badInput}get empty(){return!this._isNeverEmpty()&&!this._elementRef.nativeElement.value&&!this._isBadInput()&&!this.autofilled}get shouldLabelFloat(){if(this._isNativeSelect){let A=this._elementRef.nativeElement,t=A.options[0];return this.focused||A.multiple||!this.empty||!!(A.selectedIndex>-1&&t&&t.label)}else return this.focused&&!this.disabled||!this.empty}get describedByIds(){return this._elementRef.nativeElement.getAttribute("aria-describedby")?.split(" ")||[]}setDescribedByIds(A){let t=this._elementRef.nativeElement;A.length?t.setAttribute("aria-describedby",A.join(" ")):t.removeAttribute("aria-describedby")}onContainerClick(){this.focused||this.focus()}_isInlineSelect(){let A=this._elementRef.nativeElement;return this._isNativeSelect&&(A.multiple||A.size>1)}_iOSKeyupListener=A=>{let t=A.target;!t.value&&t.selectionStart===0&&t.selectionEnd===0&&(t.setSelectionRange(1,1),t.setSelectionRange(0,0))};_getReadonlyAttribute(){return this._isNativeSelect?null:this.readonly||this.disabled&&this.disabledInteractive?"true":null}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["input","matInput",""],["textarea","matInput",""],["select","matNativeControl",""],["input","matNativeControl",""],["textarea","matNativeControl",""]],hostAttrs:[1,"mat-mdc-input-element"],hostVars:21,hostBindings:function(t,n){t&1&&U("focus",function(){return n._focusChanged(!0)})("blur",function(){return n._focusChanged(!1)})("input",function(){return n._onInput()}),t&2&&(Ma("id",n.id)("disabled",n.disabled&&!n.disabledInteractive)("required",n.required),ie("name",n.name||null)("readonly",n._getReadonlyAttribute())("aria-disabled",n.disabled&&n.disabledInteractive?"true":null)("aria-invalid",n.empty&&n.required?null:n.errorState)("aria-required",n.required)("id",n.id),_A("mat-input-server",n._isServer)("mat-mdc-form-field-textarea-control",n._isInFormField&&n._isTextarea)("mat-mdc-form-field-input-control",n._isInFormField)("mat-mdc-input-disabled-interactive",n.disabledInteractive)("mdc-text-field__input",n._isInFormField)("mat-mdc-native-select-inline",n._isInlineSelect()))},inputs:{disabled:"disabled",id:"id",placeholder:"placeholder",name:"name",required:"required",type:"type",errorStateMatcher:"errorStateMatcher",userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],value:"value",readonly:"readonly",disabledInteractive:[2,"disabledInteractive","disabledInteractive",Qe]},exportAs:["matInput"],features:[pt([{provide:wQ,useExisting:i}]),ii]})}return i})(),Ws=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Za,Za,YI,Di]})}return i})();var pn=(function(i){return i[i.State=0]="State",i[i.Transition=1]="Transition",i[i.Sequence=2]="Sequence",i[i.Group=3]="Group",i[i.Animate=4]="Animate",i[i.Keyframes=5]="Keyframes",i[i.Style=6]="Style",i[i.Trigger=7]="Trigger",i[i.Reference=8]="Reference",i[i.AnimateChild=9]="AnimateChild",i[i.AnimateRef=10]="AnimateRef",i[i.Query=11]="Query",i[i.Stagger=12]="Stagger",i})(pn||{}),Gg="*";function sG(i,e=null){return{type:pn.Sequence,steps:i,options:e}}function Nv(i){return{type:pn.Style,styles:i,offset:null}}var J0=class{_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_originalOnDoneFns=[];_originalOnStartFns=[];_started=!1;_destroyed=!1;_finished=!1;_position=0;parentPlayer=null;totalTime;constructor(e=0,A=0){this.totalTime=e+A}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}init(){}play(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}triggerMicrotask(){queueMicrotask(()=>this._onFinish())}_onStart(){this._onStartFns.forEach(e=>e()),this._onStartFns=[]}pause(){}restart(){}finish(){this._onFinish()}destroy(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this._started=!1,this._finished=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}setPosition(e){this._position=this.totalTime?e*this.totalTime:1}getPosition(){return this.totalTime?this._position/this.totalTime:1}triggerCallback(e){let A=e=="start"?this._onStartFns:this._onDoneFns;A.forEach(t=>t()),A.length=0}},jI=class{_onDoneFns=[];_onStartFns=[];_finished=!1;_started=!1;_destroyed=!1;_onDestroyFns=[];parentPlayer=null;totalTime=0;players;constructor(e){this.players=e;let A=0,t=0,n=0,o=this.players.length;o==0?queueMicrotask(()=>this._onFinish()):this.players.forEach(a=>{a.onDone(()=>{++A==o&&this._onFinish()}),a.onDestroy(()=>{++t==o&&this._onDestroy()}),a.onStart(()=>{++n==o&&this._onStart()})}),this.totalTime=this.players.reduce((a,r)=>Math.max(a,r.totalTime),0)}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this.players.forEach(e=>e.init())}onStart(e){this._onStartFns.push(e)}_onStart(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(e=>e()),this._onStartFns=[])}onDone(e){this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}play(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(e=>e.play())}pause(){this.players.forEach(e=>e.pause())}restart(){this.players.forEach(e=>e.restart())}finish(){this._onFinish(),this.players.forEach(e=>e.finish())}destroy(){this._onDestroy()}_onDestroy(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(e=>e.destroy()),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this.players.forEach(e=>e.reset()),this._destroyed=!1,this._finished=!1,this._started=!1}setPosition(e){let A=e*this.totalTime;this.players.forEach(t=>{let n=t.totalTime?Math.min(1,A/t.totalTime):1;t.setPosition(n)})}getPosition(){let e=this.players.reduce((A,t)=>A===null||t.totalTime>A.totalTime?t:A,null);return e!=null?e.getPosition():0}beforeDestroy(){this.players.forEach(e=>{e.beforeDestroy&&e.beforeDestroy()})}triggerCallback(e){let A=e=="start"?this._onStartFns:this._onDoneFns;A.forEach(t=>t()),A.length=0}},DQ="!";function lG(i){return new Nt(3e3,!1)}function $eA(){return new Nt(3100,!1)}function AtA(){return new Nt(3101,!1)}function etA(i){return new Nt(3001,!1)}function ttA(i){return new Nt(3003,!1)}function itA(i){return new Nt(3004,!1)}function cG(i,e){return new Nt(3005,!1)}function CG(){return new Nt(3006,!1)}function dG(){return new Nt(3007,!1)}function IG(i,e){return new Nt(3008,!1)}function BG(i){return new Nt(3002,!1)}function hG(i,e,A,t,n){return new Nt(3010,!1)}function EG(){return new Nt(3011,!1)}function QG(){return new Nt(3012,!1)}function uG(){return new Nt(3200,!1)}function pG(){return new Nt(3202,!1)}function fG(){return new Nt(3013,!1)}function mG(i){return new Nt(3014,!1)}function wG(i){return new Nt(3015,!1)}function yG(i){return new Nt(3016,!1)}function DG(i,e){return new Nt(3404,!1)}function ntA(i){return new Nt(3502,!1)}function vG(i){return new Nt(3503,!1)}function bG(){return new Nt(3300,!1)}function MG(i){return new Nt(3504,!1)}function SG(i){return new Nt(3301,!1)}function kG(i,e){return new Nt(3302,!1)}function _G(i){return new Nt(3303,!1)}function xG(i,e){return new Nt(3400,!1)}function RG(i){return new Nt(3401,!1)}function NG(i){return new Nt(3402,!1)}function FG(i,e){return new Nt(3505,!1)}function Y0(i){switch(i.length){case 0:return new J0;case 1:return i[0];default:return new jI(i)}}function Kv(i,e,A=new Map,t=new Map){let n=[],o=[],a=-1,r=null;if(e.forEach(s=>{let l=s.get("offset"),g=l==a,C=g&&r||new Map;s.forEach((d,B)=>{let u=B,E=d;if(B!=="offset")switch(u=i.normalizePropertyName(u,n),E){case DQ:E=A.get(B);break;case Gg:E=t.get(B);break;default:E=i.normalizeStyleValue(B,u,E,n);break}C.set(u,E)}),g||o.push(C),r=C,a=l}),n.length)throw ntA(n);return o}function j3(i,e,A,t){switch(e){case"start":i.onStart(()=>t(A&&Fv(A,"start",i)));break;case"done":i.onDone(()=>t(A&&Fv(A,"done",i)));break;case"destroy":i.onDestroy(()=>t(A&&Fv(A,"destroy",i)));break}}function Fv(i,e,A){let t=A.totalTime,n=!!A.disabled,o=V3(i.element,i.triggerName,i.fromState,i.toState,e||i.phaseName,t??i.totalTime,n),a=i._data;return a!=null&&(o._data=a),o}function V3(i,e,A,t,n="",o=0,a){return{element:i,triggerName:e,fromState:A,toState:t,phaseName:n,totalTime:o,disabled:!!a}}function Zs(i,e,A){let t=i.get(e);return t||i.set(e,t=A),t}function Uv(i){let e=i.indexOf(":"),A=i.substring(1,e),t=i.slice(e+1);return[A,t]}var otA=typeof document>"u"?null:document.documentElement;function q3(i){let e=i.parentNode||i.host||null;return e===otA?null:e}function atA(i){return i.substring(1,6)=="ebkit"}var H1=null,gG=!1;function LG(i){H1||(H1=rtA()||{},gG=H1.style?"WebkitAppearance"in H1.style:!1);let e=!0;return H1.style&&!atA(i)&&(e=i in H1.style,!e&&gG&&(e="Webkit"+i.charAt(0).toUpperCase()+i.slice(1)in H1.style)),e}function rtA(){return typeof document<"u"?document.body:null}function Tv(i,e){for(;e;){if(e===i)return!0;e=q3(e)}return!1}function Ov(i,e,A){if(A)return Array.from(i.querySelectorAll(e));let t=i.querySelector(e);return t?[t]:[]}var stA=1e3,Jv="{{",ltA="}}",Yv="ng-enter",W3="ng-leave",vQ="ng-trigger",bQ=".ng-trigger",Hv="ng-animating",Z3=".ng-animating";function Yc(i){if(typeof i=="number")return i;let e=i.match(/^(-?[\.\d]+)(m?s)/);return!e||e.length<2?0:Lv(parseFloat(e[1]),e[2])}function Lv(i,e){return e==="s"?i*stA:i}function MQ(i,e,A){return i.hasOwnProperty("duration")?i:ctA(i,e,A)}var gtA=/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i;function ctA(i,e,A){let t,n=0,o="";if(typeof i=="string"){let a=i.match(gtA);if(a===null)return e.push(lG(i)),{duration:0,delay:0,easing:""};t=Lv(parseFloat(a[1]),a[2]);let r=a[3];r!=null&&(n=Lv(parseFloat(r),a[4]));let s=a[5];s&&(o=s)}else t=i;if(!A){let a=!1,r=e.length;t<0&&(e.push($eA()),a=!0),n<0&&(e.push(AtA()),a=!0),a&&e.splice(r,0,lG(i))}return{duration:t,delay:n,easing:o}}function GG(i){return i.length?i[0]instanceof Map?i:i.map(e=>new Map(Object.entries(e))):[]}function Kg(i,e,A){e.forEach((t,n)=>{let o=X3(n);A&&!A.has(n)&&A.set(n,i.style[o]),i.style[o]=t})}function A2(i,e){e.forEach((A,t)=>{let n=X3(t);i.style[n]=""})}function VI(i){return Array.isArray(i)?i.length==1?i[0]:sG(i):i}function KG(i,e,A){let t=e.params||{},n=zv(i);n.length&&n.forEach(o=>{t.hasOwnProperty(o)||A.push(etA(o))})}var Gv=new RegExp(`${Jv}\\s*(.+?)\\s*${ltA}`,"g");function zv(i){let e=[];if(typeof i=="string"){let A;for(;A=Gv.exec(i);)e.push(A[1]);Gv.lastIndex=0}return e}function qI(i,e,A){let t=`${i}`,n=t.replace(Gv,(o,a)=>{let r=e[a];return r==null&&(A.push(ttA(a)),r=""),r.toString()});return n==t?i:n}var CtA=/-+([a-z0-9])/g;function X3(i){return i.replace(CtA,(...e)=>e[1].toUpperCase())}function UG(i,e){return i===0||e===0}function TG(i,e,A){if(A.size&&e.length){let t=e[0],n=[];if(A.forEach((o,a)=>{t.has(a)||n.push(a),t.set(a,o)}),n.length)for(let o=1;oa.set(r,$3(i,r)))}}return e}function Xs(i,e,A){switch(e.type){case pn.Trigger:return i.visitTrigger(e,A);case pn.State:return i.visitState(e,A);case pn.Transition:return i.visitTransition(e,A);case pn.Sequence:return i.visitSequence(e,A);case pn.Group:return i.visitGroup(e,A);case pn.Animate:return i.visitAnimate(e,A);case pn.Keyframes:return i.visitKeyframes(e,A);case pn.Style:return i.visitStyle(e,A);case pn.Reference:return i.visitReference(e,A);case pn.AnimateChild:return i.visitAnimateChild(e,A);case pn.AnimateRef:return i.visitAnimateRef(e,A);case pn.Query:return i.visitQuery(e,A);case pn.Stagger:return i.visitStagger(e,A);default:throw itA(e.type)}}function $3(i,e){return window.getComputedStyle(i)[e]}var sb=(()=>{class i{validateStyleProperty(A){return LG(A)}containsElement(A,t){return Tv(A,t)}getParentElement(A){return q3(A)}query(A,t,n){return Ov(A,t,n)}computeStyle(A,t,n){return n||""}animate(A,t,n,o,a,r=[],s){return new J0(n,o)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac})}return i})(),P1=class{static NOOP=new sb},j1=class{};var dtA=new Set(["width","height","minWidth","minHeight","maxWidth","maxHeight","left","top","bottom","right","fontSize","outlineWidth","outlineOffset","paddingTop","paddingLeft","paddingBottom","paddingRight","marginTop","marginLeft","marginBottom","marginRight","borderRadius","borderWidth","borderTopWidth","borderLeftWidth","borderRightWidth","borderBottomWidth","textIndent","perspective"]),of=class extends j1{normalizePropertyName(e,A){return X3(e)}normalizeStyleValue(e,A,t,n){let o="",a=t.toString().trim();if(dtA.has(A)&&t!==0&&t!=="0")if(typeof t=="number")o="px";else{let r=t.match(/^[+-]?[\d\.]+([a-z]*)$/);r&&r[1].length==0&&n.push(cG(e,t))}return a+o}};var af="*";function ItA(i,e){let A=[];return typeof i=="string"?i.split(/\s*,\s*/).forEach(t=>BtA(t,A,e)):A.push(i),A}function BtA(i,e,A){if(i[0]==":"){let s=htA(i,A);if(typeof s=="function"){e.push(s);return}i=s}let t=i.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(t==null||t.length<4)return A.push(wG(i)),e;let n=t[1],o=t[2],a=t[3];e.push(OG(n,a));let r=n==af&&a==af;o[0]=="<"&&!r&&e.push(OG(a,n))}function htA(i,e){switch(i){case":enter":return"void => *";case":leave":return"* => void";case":increment":return(A,t)=>parseFloat(t)>parseFloat(A);case":decrement":return(A,t)=>parseFloat(t) *"}}var Af=new Set(["true","1"]),ef=new Set(["false","0"]);function OG(i,e){let A=Af.has(i)||ef.has(i),t=Af.has(e)||ef.has(e);return(n,o)=>{let a=i==af||i==n,r=e==af||e==o;return!a&&A&&typeof n=="boolean"&&(a=n?Af.has(i):ef.has(i)),!r&&t&&typeof o=="boolean"&&(r=o?Af.has(e):ef.has(e)),a&&r}}var ZG=":self",EtA=new RegExp(`s*${ZG}s*,?`,"g");function XG(i,e,A,t){return new Zv(i).build(e,A,t)}var JG="",Zv=class{_driver;constructor(e){this._driver=e}build(e,A,t){let n=new Xv(A);return this._resetContextStyleTimingState(n),Xs(this,VI(e),n)}_resetContextStyleTimingState(e){e.currentQuerySelector=JG,e.collectedStyles=new Map,e.collectedStyles.set(JG,new Map),e.currentTime=0}visitTrigger(e,A){let t=A.queryCount=0,n=A.depCount=0,o=[],a=[];return e.name.charAt(0)=="@"&&A.errors.push(CG()),e.definitions.forEach(r=>{if(this._resetContextStyleTimingState(A),r.type==pn.State){let s=r,l=s.name;l.toString().split(/\s*,\s*/).forEach(g=>{s.name=g,o.push(this.visitState(s,A))}),s.name=l}else if(r.type==pn.Transition){let s=this.visitTransition(r,A);t+=s.queryCount,n+=s.depCount,a.push(s)}else A.errors.push(dG())}),{type:pn.Trigger,name:e.name,states:o,transitions:a,queryCount:t,depCount:n,options:null}}visitState(e,A){let t=this.visitStyle(e.styles,A),n=e.options&&e.options.params||null;if(t.containsDynamicStyles){let o=new Set,a=n||{};t.styles.forEach(r=>{r instanceof Map&&r.forEach(s=>{zv(s).forEach(l=>{a.hasOwnProperty(l)||o.add(l)})})}),o.size&&A.errors.push(IG(e.name,[...o.values()]))}return{type:pn.State,name:e.name,style:t,options:n?{params:n}:null}}visitTransition(e,A){A.queryCount=0,A.depCount=0;let t=Xs(this,VI(e.animation),A),n=ItA(e.expr,A.errors);return{type:pn.Transition,matchers:n,animation:t,queryCount:A.queryCount,depCount:A.depCount,options:z1(e.options)}}visitSequence(e,A){return{type:pn.Sequence,steps:e.steps.map(t=>Xs(this,t,A)),options:z1(e.options)}}visitGroup(e,A){let t=A.currentTime,n=0,o=e.steps.map(a=>{A.currentTime=t;let r=Xs(this,a,A);return n=Math.max(n,A.currentTime),r});return A.currentTime=n,{type:pn.Group,steps:o,options:z1(e.options)}}visitAnimate(e,A){let t=ftA(e.timings,A.errors);A.currentAnimateTimings=t;let n,o=e.styles?e.styles:Nv({});if(o.type==pn.Keyframes)n=this.visitKeyframes(o,A);else{let a=e.styles,r=!1;if(!a){r=!0;let l={};t.easing&&(l.easing=t.easing),a=Nv(l)}A.currentTime+=t.duration+t.delay;let s=this.visitStyle(a,A);s.isEmptyStep=r,n=s}return A.currentAnimateTimings=null,{type:pn.Animate,timings:t,style:n,options:null}}visitStyle(e,A){let t=this._makeStyleAst(e,A);return this._validateStyleAst(t,A),t}_makeStyleAst(e,A){let t=[],n=Array.isArray(e.styles)?e.styles:[e.styles];for(let r of n)typeof r=="string"?r===Gg?t.push(r):A.errors.push(BG(r)):t.push(new Map(Object.entries(r)));let o=!1,a=null;return t.forEach(r=>{if(r instanceof Map&&(r.has("easing")&&(a=r.get("easing"),r.delete("easing")),!o)){for(let s of r.values())if(s.toString().indexOf(Jv)>=0){o=!0;break}}}),{type:pn.Style,styles:t,easing:a,offset:e.offset,containsDynamicStyles:o,options:null}}_validateStyleAst(e,A){let t=A.currentAnimateTimings,n=A.currentTime,o=A.currentTime;t&&o>0&&(o-=t.duration+t.delay),e.styles.forEach(a=>{typeof a!="string"&&a.forEach((r,s)=>{let l=A.collectedStyles.get(A.currentQuerySelector),g=l.get(s),C=!0;g&&(o!=n&&o>=g.startTime&&n<=g.endTime&&(A.errors.push(hG(s,g.startTime,g.endTime,o,n)),C=!1),o=g.startTime),C&&l.set(s,{startTime:o,endTime:n}),A.options&&KG(r,A.options,A.errors)})})}visitKeyframes(e,A){let t={type:pn.Keyframes,styles:[],options:null};if(!A.currentAnimateTimings)return A.errors.push(EG()),t;let n=1,o=0,a=[],r=!1,s=!1,l=0,g=e.steps.map(m=>{let v=this._makeStyleAst(m,A),S=v.offset!=null?v.offset:ptA(v.styles),k=0;return S!=null&&(o++,k=v.offset=S),s=s||k<0||k>1,r=r||k0&&o{let S=d>0?v==B?1:d*v:a[v],k=S*f;A.currentTime=u+E.delay+k,E.duration=k,this._validateStyleAst(m,A),m.offset=S,t.styles.push(m)}),t}visitReference(e,A){return{type:pn.Reference,animation:Xs(this,VI(e.animation),A),options:z1(e.options)}}visitAnimateChild(e,A){return A.depCount++,{type:pn.AnimateChild,options:z1(e.options)}}visitAnimateRef(e,A){return{type:pn.AnimateRef,animation:this.visitReference(e.animation,A),options:z1(e.options)}}visitQuery(e,A){let t=A.currentQuerySelector,n=e.options||{};A.queryCount++,A.currentQuery=e;let[o,a]=QtA(e.selector);A.currentQuerySelector=t.length?t+" "+o:o,Zs(A.collectedStyles,A.currentQuerySelector,new Map);let r=Xs(this,VI(e.animation),A);return A.currentQuery=null,A.currentQuerySelector=t,{type:pn.Query,selector:o,limit:n.limit||0,optional:!!n.optional,includeSelf:a,animation:r,originalSelector:e.selector,options:z1(e.options)}}visitStagger(e,A){A.currentQuery||A.errors.push(fG());let t=e.timings==="full"?{duration:0,delay:0,easing:"full"}:MQ(e.timings,A.errors,!0);return{type:pn.Stagger,animation:Xs(this,VI(e.animation),A),timings:t,options:null}}};function QtA(i){let e=!!i.split(/\s*,\s*/).find(A=>A==ZG);return e&&(i=i.replace(EtA,"")),i=i.replace(/@\*/g,bQ).replace(/@\w+/g,A=>bQ+"-"+A.slice(1)).replace(/:animating/g,Z3),[i,e]}function utA(i){return i?P({},i):null}var Xv=class{errors;queryCount=0;depCount=0;currentTransition=null;currentQuery=null;currentQuerySelector=null;currentAnimateTimings=null;currentTime=0;collectedStyles=new Map;options=null;unsupportedCSSPropertiesFound=new Set;constructor(e){this.errors=e}};function ptA(i){if(typeof i=="string")return null;let e=null;if(Array.isArray(i))i.forEach(A=>{if(A instanceof Map&&A.has("offset")){let t=A;e=parseFloat(t.get("offset")),t.delete("offset")}});else if(i instanceof Map&&i.has("offset")){let A=i;e=parseFloat(A.get("offset")),A.delete("offset")}return e}function ftA(i,e){if(i.hasOwnProperty("duration"))return i;if(typeof i=="number"){let o=MQ(i,e).duration;return Pv(o,0,"")}let A=i;if(A.split(/\s+/).some(o=>o.charAt(0)=="{"&&o.charAt(1)=="{")){let o=Pv(0,0,"");return o.dynamic=!0,o.strValue=A,o}let n=MQ(A,e);return Pv(n.duration,n.delay,n.easing)}function z1(i){return i?(i=P({},i),i.params&&(i.params=utA(i.params))):i={},i}function Pv(i,e,A){return{duration:i,delay:e,easing:A}}function lb(i,e,A,t,n,o,a=null,r=!1){return{type:1,element:i,keyframes:e,preStyleProps:A,postStyleProps:t,duration:n,delay:o,totalTime:n+o,easing:a,subTimeline:r}}var kQ=class{_map=new Map;get(e){return this._map.get(e)||[]}append(e,A){let t=this._map.get(e);t||this._map.set(e,t=[]),t.push(...A)}has(e){return this._map.has(e)}clear(){this._map.clear()}},mtA=1,wtA=":enter",ytA=new RegExp(wtA,"g"),DtA=":leave",vtA=new RegExp(DtA,"g");function $G(i,e,A,t,n,o=new Map,a=new Map,r,s,l=[]){return new $v().buildKeyframes(i,e,A,t,n,o,a,r,s,l)}var $v=class{buildKeyframes(e,A,t,n,o,a,r,s,l,g=[]){l=l||new kQ;let C=new Ab(e,A,l,n,o,g,[]);C.options=s;let d=s.delay?Yc(s.delay):0;C.currentTimeline.delayNextStep(d),C.currentTimeline.setStyles([a],null,C.errors,s),Xs(this,t,C);let B=C.timelines.filter(u=>u.containsAnimation());if(B.length&&r.size){let u;for(let E=B.length-1;E>=0;E--){let f=B[E];if(f.element===A){u=f;break}}u&&!u.allowOnlyTimelineStyles()&&u.setStyles([r],null,C.errors,s)}return B.length?B.map(u=>u.buildKeyframes()):[lb(A,[],[],[],0,d,"",!1)]}visitTrigger(e,A){}visitState(e,A){}visitTransition(e,A){}visitAnimateChild(e,A){let t=A.subInstructions.get(A.element);if(t){let n=A.createSubContext(e.options),o=A.currentTimeline.currentTime,a=this._visitSubInstructions(t,n,n.options);o!=a&&A.transformIntoNewTimeline(a)}A.previousNode=e}visitAnimateRef(e,A){let t=A.createSubContext(e.options);t.transformIntoNewTimeline(),this._applyAnimationRefDelays([e.options,e.animation.options],A,t),this.visitReference(e.animation,t),A.transformIntoNewTimeline(t.currentTimeline.currentTime),A.previousNode=e}_applyAnimationRefDelays(e,A,t){for(let n of e){let o=n?.delay;if(o){let a=typeof o=="number"?o:Yc(qI(o,n?.params??{},A.errors));t.delayNextStep(a)}}}_visitSubInstructions(e,A,t){let o=A.currentTimeline.currentTime,a=t.duration!=null?Yc(t.duration):null,r=t.delay!=null?Yc(t.delay):null;return a!==0&&e.forEach(s=>{let l=A.appendInstructionToTimeline(s,a,r);o=Math.max(o,l.duration+l.delay)}),o}visitReference(e,A){A.updateOptions(e.options,!0),Xs(this,e.animation,A),A.previousNode=e}visitSequence(e,A){let t=A.subContextCount,n=A,o=e.options;if(o&&(o.params||o.delay)&&(n=A.createSubContext(o),n.transformIntoNewTimeline(),o.delay!=null)){n.previousNode.type==pn.Style&&(n.currentTimeline.snapshotCurrentStyles(),n.previousNode=rf);let a=Yc(o.delay);n.delayNextStep(a)}e.steps.length&&(e.steps.forEach(a=>Xs(this,a,n)),n.currentTimeline.applyStylesToKeyframe(),n.subContextCount>t&&n.transformIntoNewTimeline()),A.previousNode=e}visitGroup(e,A){let t=[],n=A.currentTimeline.currentTime,o=e.options&&e.options.delay?Yc(e.options.delay):0;e.steps.forEach(a=>{let r=A.createSubContext(e.options);o&&r.delayNextStep(o),Xs(this,a,r),n=Math.max(n,r.currentTimeline.currentTime),t.push(r.currentTimeline)}),t.forEach(a=>A.currentTimeline.mergeTimelineCollectedStyles(a)),A.transformIntoNewTimeline(n),A.previousNode=e}_visitTiming(e,A){if(e.dynamic){let t=e.strValue,n=A.params?qI(t,A.params,A.errors):t;return MQ(n,A.errors)}else return{duration:e.duration,delay:e.delay,easing:e.easing}}visitAnimate(e,A){let t=A.currentAnimateTimings=this._visitTiming(e.timings,A),n=A.currentTimeline;t.delay&&(A.incrementTime(t.delay),n.snapshotCurrentStyles());let o=e.style;o.type==pn.Keyframes?this.visitKeyframes(o,A):(A.incrementTime(t.duration),this.visitStyle(o,A),n.applyStylesToKeyframe()),A.currentAnimateTimings=null,A.previousNode=e}visitStyle(e,A){let t=A.currentTimeline,n=A.currentAnimateTimings;!n&&t.hasCurrentStyleProperties()&&t.forwardFrame();let o=n&&n.easing||e.easing;e.isEmptyStep?t.applyEmptyStep(o):t.setStyles(e.styles,o,A.errors,A.options),A.previousNode=e}visitKeyframes(e,A){let t=A.currentAnimateTimings,n=A.currentTimeline.duration,o=t.duration,r=A.createSubContext().currentTimeline;r.easing=t.easing,e.styles.forEach(s=>{let l=s.offset||0;r.forwardTime(l*o),r.setStyles(s.styles,s.easing,A.errors,A.options),r.applyStylesToKeyframe()}),A.currentTimeline.mergeTimelineCollectedStyles(r),A.transformIntoNewTimeline(n+o),A.previousNode=e}visitQuery(e,A){let t=A.currentTimeline.currentTime,n=e.options||{},o=n.delay?Yc(n.delay):0;o&&(A.previousNode.type===pn.Style||t==0&&A.currentTimeline.hasCurrentStyleProperties())&&(A.currentTimeline.snapshotCurrentStyles(),A.previousNode=rf);let a=t,r=A.invokeQuery(e.selector,e.originalSelector,e.limit,e.includeSelf,!!n.optional,A.errors);A.currentQueryTotal=r.length;let s=null;r.forEach((l,g)=>{A.currentQueryIndex=g;let C=A.createSubContext(e.options,l);o&&C.delayNextStep(o),l===A.element&&(s=C.currentTimeline),Xs(this,e.animation,C),C.currentTimeline.applyStylesToKeyframe();let d=C.currentTimeline.currentTime;a=Math.max(a,d)}),A.currentQueryIndex=0,A.currentQueryTotal=0,A.transformIntoNewTimeline(a),s&&(A.currentTimeline.mergeTimelineCollectedStyles(s),A.currentTimeline.snapshotCurrentStyles()),A.previousNode=e}visitStagger(e,A){let t=A.parentContext,n=A.currentTimeline,o=e.timings,a=Math.abs(o.duration),r=a*(A.currentQueryTotal-1),s=a*A.currentQueryIndex;switch(o.duration<0?"reverse":o.easing){case"reverse":s=r-s;break;case"full":s=t.currentStaggerTime;break}let g=A.currentTimeline;s&&g.delayNextStep(s);let C=g.currentTime;Xs(this,e.animation,A),A.previousNode=e,t.currentStaggerTime=n.currentTime-C+(n.startTime-t.currentTimeline.startTime)}},rf={},Ab=class i{_driver;element;subInstructions;_enterClassName;_leaveClassName;errors;timelines;parentContext=null;currentTimeline;currentAnimateTimings=null;previousNode=rf;subContextCount=0;options={};currentQueryIndex=0;currentQueryTotal=0;currentStaggerTime=0;constructor(e,A,t,n,o,a,r,s){this._driver=e,this.element=A,this.subInstructions=t,this._enterClassName=n,this._leaveClassName=o,this.errors=a,this.timelines=r,this.currentTimeline=s||new sf(this._driver,A,0),r.push(this.currentTimeline)}get params(){return this.options.params}updateOptions(e,A){if(!e)return;let t=e,n=this.options;t.duration!=null&&(n.duration=Yc(t.duration)),t.delay!=null&&(n.delay=Yc(t.delay));let o=t.params;if(o){let a=n.params;a||(a=this.options.params={}),Object.keys(o).forEach(r=>{(!A||!a.hasOwnProperty(r))&&(a[r]=qI(o[r],a,this.errors))})}}_copyOptions(){let e={};if(this.options){let A=this.options.params;if(A){let t=e.params={};Object.keys(A).forEach(n=>{t[n]=A[n]})}}return e}createSubContext(e=null,A,t){let n=A||this.element,o=new i(this._driver,n,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(n,t||0));return o.previousNode=this.previousNode,o.currentAnimateTimings=this.currentAnimateTimings,o.options=this._copyOptions(),o.updateOptions(e),o.currentQueryIndex=this.currentQueryIndex,o.currentQueryTotal=this.currentQueryTotal,o.parentContext=this,this.subContextCount++,o}transformIntoNewTimeline(e){return this.previousNode=rf,this.currentTimeline=this.currentTimeline.fork(this.element,e),this.timelines.push(this.currentTimeline),this.currentTimeline}appendInstructionToTimeline(e,A,t){let n={duration:A??e.duration,delay:this.currentTimeline.currentTime+(t??0)+e.delay,easing:""},o=new eb(this._driver,e.element,e.keyframes,e.preStyleProps,e.postStyleProps,n,e.stretchStartingKeyframe);return this.timelines.push(o),n}incrementTime(e){this.currentTimeline.forwardTime(this.currentTimeline.duration+e)}delayNextStep(e){e>0&&this.currentTimeline.delayNextStep(e)}invokeQuery(e,A,t,n,o,a){let r=[];if(n&&r.push(this.element),e.length>0){e=e.replace(ytA,"."+this._enterClassName),e=e.replace(vtA,"."+this._leaveClassName);let s=t!=1,l=this._driver.query(this.element,e,s);t!==0&&(l=t<0?l.slice(l.length+t,l.length):l.slice(0,t)),r.push(...l)}return!o&&r.length==0&&a.push(mG(A)),r}},sf=class i{_driver;element;startTime;_elementTimelineStylesLookup;duration=0;easing=null;_previousKeyframe=new Map;_currentKeyframe=new Map;_keyframes=new Map;_styleSummary=new Map;_localTimelineStyles=new Map;_globalTimelineStyles;_pendingStyles=new Map;_backFill=new Map;_currentEmptyStepKeyframe=null;constructor(e,A,t,n){this._driver=e,this.element=A,this.startTime=t,this._elementTimelineStylesLookup=n,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(A),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(A,this._localTimelineStyles)),this._loadKeyframe()}containsAnimation(){switch(this._keyframes.size){case 0:return!1;case 1:return this.hasCurrentStyleProperties();default:return!0}}hasCurrentStyleProperties(){return this._currentKeyframe.size>0}get currentTime(){return this.startTime+this.duration}delayNextStep(e){let A=this._keyframes.size===1&&this._pendingStyles.size;this.duration||A?(this.forwardTime(this.currentTime+e),A&&this.snapshotCurrentStyles()):this.startTime+=e}fork(e,A){return this.applyStylesToKeyframe(),new i(this._driver,e,A||this.currentTime,this._elementTimelineStylesLookup)}_loadKeyframe(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=new Map,this._keyframes.set(this.duration,this._currentKeyframe))}forwardFrame(){this.duration+=mtA,this._loadKeyframe()}forwardTime(e){this.applyStylesToKeyframe(),this.duration=e,this._loadKeyframe()}_updateStyle(e,A){this._localTimelineStyles.set(e,A),this._globalTimelineStyles.set(e,A),this._styleSummary.set(e,{time:this.currentTime,value:A})}allowOnlyTimelineStyles(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}applyEmptyStep(e){e&&this._previousKeyframe.set("easing",e);for(let[A,t]of this._globalTimelineStyles)this._backFill.set(A,t||Gg),this._currentKeyframe.set(A,Gg);this._currentEmptyStepKeyframe=this._currentKeyframe}setStyles(e,A,t,n){A&&this._previousKeyframe.set("easing",A);let o=n&&n.params||{},a=btA(e,this._globalTimelineStyles);for(let[r,s]of a){let l=qI(s,o,t);this._pendingStyles.set(r,l),this._localTimelineStyles.has(r)||this._backFill.set(r,this._globalTimelineStyles.get(r)??Gg),this._updateStyle(r,l)}}applyStylesToKeyframe(){this._pendingStyles.size!=0&&(this._pendingStyles.forEach((e,A)=>{this._currentKeyframe.set(A,e)}),this._pendingStyles.clear(),this._localTimelineStyles.forEach((e,A)=>{this._currentKeyframe.has(A)||this._currentKeyframe.set(A,e)}))}snapshotCurrentStyles(){for(let[e,A]of this._localTimelineStyles)this._pendingStyles.set(e,A),this._updateStyle(e,A)}getFinalKeyframe(){return this._keyframes.get(this.duration)}get properties(){let e=[];for(let A in this._currentKeyframe)e.push(A);return e}mergeTimelineCollectedStyles(e){e._styleSummary.forEach((A,t)=>{let n=this._styleSummary.get(t);(!n||A.time>n.time)&&this._updateStyle(t,A.value)})}buildKeyframes(){this.applyStylesToKeyframe();let e=new Set,A=new Set,t=this._keyframes.size===1&&this.duration===0,n=[];this._keyframes.forEach((r,s)=>{let l=new Map([...this._backFill,...r]);l.forEach((g,C)=>{g===DQ?e.add(C):g===Gg&&A.add(C)}),t||l.set("offset",s/this.duration),n.push(l)});let o=[...e.values()],a=[...A.values()];if(t){let r=n[0],s=new Map(r);r.set("offset",0),s.set("offset",1),n=[r,s]}return lb(this.element,n,o,a,this.duration,this.startTime,this.easing,!1)}},eb=class extends sf{keyframes;preStyleProps;postStyleProps;_stretchStartingKeyframe;timings;constructor(e,A,t,n,o,a,r=!1){super(e,A,a.delay),this.keyframes=t,this.preStyleProps=n,this.postStyleProps=o,this._stretchStartingKeyframe=r,this.timings={duration:a.duration,delay:a.delay,easing:a.easing}}containsAnimation(){return this.keyframes.length>1}buildKeyframes(){let e=this.keyframes,{delay:A,duration:t,easing:n}=this.timings;if(this._stretchStartingKeyframe&&A){let o=[],a=t+A,r=A/a,s=new Map(e[0]);s.set("offset",0),o.push(s);let l=new Map(e[0]);l.set("offset",YG(r)),o.push(l);let g=e.length-1;for(let C=1;C<=g;C++){let d=new Map(e[C]),B=d.get("offset"),u=A+B*t;d.set("offset",YG(u/a)),o.push(d)}t=a,A=0,n="",e=o}return lb(this.element,e,this.preStyleProps,this.postStyleProps,t,A,n,!0)}};function YG(i,e=3){let A=Math.pow(10,e-1);return Math.round(i*A)/A}function btA(i,e){let A=new Map,t;return i.forEach(n=>{if(n==="*"){t??=e.keys();for(let o of t)A.set(o,Gg)}else for(let[o,a]of n)A.set(o,a)}),A}function HG(i,e,A,t,n,o,a,r,s,l,g,C,d){return{type:0,element:i,triggerName:e,isRemovalTransition:n,fromState:A,fromStyles:o,toState:t,toStyles:a,timelines:r,queriedElements:s,preStyleProps:l,postStyleProps:g,totalTime:C,errors:d}}var jv={},lf=class{_triggerName;ast;_stateStyles;constructor(e,A,t){this._triggerName=e,this.ast=A,this._stateStyles=t}match(e,A,t,n){return MtA(this.ast.matchers,e,A,t,n)}buildStyles(e,A,t){let n=this._stateStyles.get("*");return e!==void 0&&(n=this._stateStyles.get(e?.toString())||n),n?n.buildStyles(A,t):new Map}build(e,A,t,n,o,a,r,s,l,g){let C=[],d=this.ast.options&&this.ast.options.params||jv,B=r&&r.params||jv,u=this.buildStyles(t,B,C),E=s&&s.params||jv,f=this.buildStyles(n,E,C),m=new Set,v=new Map,S=new Map,k=n==="void",M={params:AK(E,d),delay:this.ast.options?.delay},x=g?[]:$G(e,A,this.ast.animation,o,a,u,f,M,l,C),F=0;return x.forEach(z=>{F=Math.max(z.duration+z.delay,F)}),C.length?HG(A,this._triggerName,t,n,k,u,f,[],[],v,S,F,C):(x.forEach(z=>{let j=z.element,X=Zs(v,j,new Set);z.preStyleProps.forEach(Z=>X.add(Z));let eA=Zs(S,j,new Set);z.postStyleProps.forEach(Z=>eA.add(Z)),j!==A&&m.add(j)}),HG(A,this._triggerName,t,n,k,u,f,x,[...m.values()],v,S,F))}};function MtA(i,e,A,t,n){return i.some(o=>o(e,A,t,n))}function AK(i,e){let A=P({},e);return Object.entries(i).forEach(([t,n])=>{n!=null&&(A[t]=n)}),A}var tb=class{styles;defaultParams;normalizer;constructor(e,A,t){this.styles=e,this.defaultParams=A,this.normalizer=t}buildStyles(e,A){let t=new Map,n=AK(e,this.defaultParams);return this.styles.styles.forEach(o=>{typeof o!="string"&&o.forEach((a,r)=>{a&&(a=qI(a,n,A));let s=this.normalizer.normalizePropertyName(r,A);a=this.normalizer.normalizeStyleValue(r,s,a,A),t.set(r,a)})}),t}};function StA(i,e,A){return new ib(i,e,A)}var ib=class{name;ast;_normalizer;transitionFactories=[];fallbackTransition;states=new Map;constructor(e,A,t){this.name=e,this.ast=A,this._normalizer=t,A.states.forEach(n=>{let o=n.options&&n.options.params||{};this.states.set(n.name,new tb(n.style,o,t))}),zG(this.states,"true","1"),zG(this.states,"false","0"),A.transitions.forEach(n=>{this.transitionFactories.push(new lf(e,n,this.states))}),this.fallbackTransition=ktA(e,this.states)}get containsQueries(){return this.ast.queryCount>0}matchTransition(e,A,t,n){return this.transitionFactories.find(a=>a.match(e,A,t,n))||null}matchStyles(e,A,t){return this.fallbackTransition.buildStyles(e,A,t)}};function ktA(i,e,A){let t=[(a,r)=>!0],n={type:pn.Sequence,steps:[],options:null},o={type:pn.Transition,animation:n,matchers:t,options:null,queryCount:0,depCount:0};return new lf(i,o,e)}function zG(i,e,A){i.has(e)?i.has(A)||i.set(A,i.get(e)):i.has(A)&&i.set(e,i.get(A))}var _tA=new kQ,nb=class{bodyNode;_driver;_normalizer;_animations=new Map;_playersById=new Map;players=[];constructor(e,A,t){this.bodyNode=e,this._driver=A,this._normalizer=t}register(e,A){let t=[],n=[],o=XG(this._driver,A,t,n);if(t.length)throw vG(t);this._animations.set(e,o)}_buildPlayer(e,A,t){let n=e.element,o=Kv(this._normalizer,e.keyframes,A,t);return this._driver.animate(n,o,e.duration,e.delay,e.easing,[],!0)}create(e,A,t={}){let n=[],o=this._animations.get(e),a,r=new Map;if(o?(a=$G(this._driver,A,o,Yv,W3,new Map,new Map,t,_tA,n),a.forEach(g=>{let C=Zs(r,g.element,new Map);g.postStyleProps.forEach(d=>C.set(d,null))})):(n.push(bG()),a=[]),n.length)throw MG(n);r.forEach((g,C)=>{g.forEach((d,B)=>{g.set(B,this._driver.computeStyle(C,B,Gg))})});let s=a.map(g=>{let C=r.get(g.element);return this._buildPlayer(g,new Map,C)}),l=Y0(s);return this._playersById.set(e,l),l.onDestroy(()=>this.destroy(e)),this.players.push(l),l}destroy(e){let A=this._getPlayer(e);A.destroy(),this._playersById.delete(e);let t=this.players.indexOf(A);t>=0&&this.players.splice(t,1)}_getPlayer(e){let A=this._playersById.get(e);if(!A)throw SG(e);return A}listen(e,A,t,n){let o=V3(A,"","","");return j3(this._getPlayer(e),t,o,n),()=>{}}command(e,A,t,n){if(t=="register"){this.register(e,n[0]);return}if(t=="create"){let a=n[0]||{};this.create(e,A,a);return}let o=this._getPlayer(e);switch(t){case"play":o.play();break;case"pause":o.pause();break;case"reset":o.reset();break;case"restart":o.restart();break;case"finish":o.finish();break;case"init":o.init();break;case"setPosition":o.setPosition(parseFloat(n[0]));break;case"destroy":this.destroy(e);break}}},PG="ng-animate-queued",xtA=".ng-animate-queued",Vv="ng-animate-disabled",RtA=".ng-animate-disabled",NtA="ng-star-inserted",FtA=".ng-star-inserted",LtA=[],eK={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},GtA={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},Ug="__ng_removed",_Q=class{namespaceId;value;options;get params(){return this.options.params}constructor(e,A=""){this.namespaceId=A;let t=e&&e.hasOwnProperty("value"),n=t?e.value:e;if(this.value=UtA(n),t){let o=e,{value:a}=o,r=Pp(o,["value"]);this.options=r}else this.options={};this.options.params||(this.options.params={})}absorbOptions(e){let A=e.params;if(A){let t=this.options.params;Object.keys(A).forEach(n=>{t[n]==null&&(t[n]=A[n])})}}},SQ="void",qv=new _Q(SQ),ob=class{id;hostElement;_engine;players=[];_triggers=new Map;_queue=[];_elementListeners=new Map;_hostClassName;constructor(e,A,t){this.id=e,this.hostElement=A,this._engine=t,this._hostClassName="ng-tns-"+e,Wl(A,this._hostClassName)}listen(e,A,t,n){if(!this._triggers.has(A))throw kG(t,A);if(t==null||t.length==0)throw _G(A);if(!TtA(t))throw xG(t,A);let o=Zs(this._elementListeners,e,[]),a={name:A,phase:t,callback:n};o.push(a);let r=Zs(this._engine.statesByElement,e,new Map);return r.has(A)||(Wl(e,vQ),Wl(e,vQ+"-"+A),r.set(A,qv)),()=>{this._engine.afterFlush(()=>{let s=o.indexOf(a);s>=0&&o.splice(s,1),this._triggers.has(A)||r.delete(A)})}}register(e,A){return this._triggers.has(e)?!1:(this._triggers.set(e,A),!0)}_getTrigger(e){let A=this._triggers.get(e);if(!A)throw RG(e);return A}trigger(e,A,t,n=!0){let o=this._getTrigger(A),a=new xQ(this.id,A,e),r=this._engine.statesByElement.get(e);r||(Wl(e,vQ),Wl(e,vQ+"-"+A),this._engine.statesByElement.set(e,r=new Map));let s=r.get(A),l=new _Q(t,this.id);if(!(t&&t.hasOwnProperty("value"))&&s&&l.absorbOptions(s.options),r.set(A,l),s||(s=qv),!(l.value===SQ)&&s.value===l.value){if(!YtA(s.params,l.params)){let E=[],f=o.matchStyles(s.value,s.params,E),m=o.matchStyles(l.value,l.params,E);E.length?this._engine.reportError(E):this._engine.afterFlush(()=>{A2(e,f),Kg(e,m)})}return}let d=Zs(this._engine.playersByElement,e,[]);d.forEach(E=>{E.namespaceId==this.id&&E.triggerName==A&&E.queued&&E.destroy()});let B=o.matchTransition(s.value,l.value,e,l.params),u=!1;if(!B){if(!n)return;B=o.fallbackTransition,u=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:A,transition:B,fromState:s,toState:l,player:a,isFallbackTransition:u}),u||(Wl(e,PG),a.onStart(()=>{WI(e,PG)})),a.onDone(()=>{let E=this.players.indexOf(a);E>=0&&this.players.splice(E,1);let f=this._engine.playersByElement.get(e);if(f){let m=f.indexOf(a);m>=0&&f.splice(m,1)}}),this.players.push(a),d.push(a),a}deregister(e){this._triggers.delete(e),this._engine.statesByElement.forEach(A=>A.delete(e)),this._elementListeners.forEach((A,t)=>{this._elementListeners.set(t,A.filter(n=>n.name!=e))})}clearElementCache(e){this._engine.statesByElement.delete(e),this._elementListeners.delete(e);let A=this._engine.playersByElement.get(e);A&&(A.forEach(t=>t.destroy()),this._engine.playersByElement.delete(e))}_signalRemovalForInnerTriggers(e,A){let t=this._engine.driver.query(e,bQ,!0);t.forEach(n=>{if(n[Ug])return;let o=this._engine.fetchNamespacesByElement(n);o.size?o.forEach(a=>a.triggerLeaveAnimation(n,A,!1,!0)):this.clearElementCache(n)}),this._engine.afterFlushAnimationsDone(()=>t.forEach(n=>this.clearElementCache(n)))}triggerLeaveAnimation(e,A,t,n){let o=this._engine.statesByElement.get(e),a=new Map;if(o){let r=[];if(o.forEach((s,l)=>{if(a.set(l,s.value),this._triggers.has(l)){let g=this.trigger(e,l,SQ,n);g&&r.push(g)}}),r.length)return this._engine.markElementAsRemoved(this.id,e,!0,A,a),t&&Y0(r).onDone(()=>this._engine.processLeaveNode(e)),!0}return!1}prepareLeaveAnimationListeners(e){let A=this._elementListeners.get(e),t=this._engine.statesByElement.get(e);if(A&&t){let n=new Set;A.forEach(o=>{let a=o.name;if(n.has(a))return;n.add(a);let s=this._triggers.get(a).fallbackTransition,l=t.get(a)||qv,g=new _Q(SQ),C=new xQ(this.id,a,e);this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:a,transition:s,fromState:l,toState:g,player:C,isFallbackTransition:!0})})}}removeNode(e,A){let t=this._engine;if(e.childElementCount&&this._signalRemovalForInnerTriggers(e,A),this.triggerLeaveAnimation(e,A,!0))return;let n=!1;if(t.totalAnimations){let o=t.players.length?t.playersByQueriedElement.get(e):[];if(o&&o.length)n=!0;else{let a=e;for(;a=a.parentNode;)if(t.statesByElement.get(a)){n=!0;break}}}if(this.prepareLeaveAnimationListeners(e),n)t.markElementAsRemoved(this.id,e,!1,A);else{let o=e[Ug];(!o||o===eK)&&(t.afterFlush(()=>this.clearElementCache(e)),t.destroyInnerAnimations(e),t._onRemovalComplete(e,A))}}insertNode(e,A){Wl(e,this._hostClassName)}drainQueuedTransitions(e){let A=[];return this._queue.forEach(t=>{let n=t.player;if(n.destroyed)return;let o=t.element,a=this._elementListeners.get(o);a&&a.forEach(r=>{if(r.name==t.triggerName){let s=V3(o,t.triggerName,t.fromState.value,t.toState.value);s._data=e,j3(t.player,r.phase,s,r.callback)}}),n.markedForDestroy?this._engine.afterFlush(()=>{n.destroy()}):A.push(t)}),this._queue=[],A.sort((t,n)=>{let o=t.transition.ast.depCount,a=n.transition.ast.depCount;return o==0||a==0?o-a:this._engine.driver.containsElement(t.element,n.element)?1:-1})}destroy(e){this.players.forEach(A=>A.destroy()),this._signalRemovalForInnerTriggers(this.hostElement,e)}},ab=class{bodyNode;driver;_normalizer;players=[];newHostElements=new Map;playersByElement=new Map;playersByQueriedElement=new Map;statesByElement=new Map;disabledNodes=new Set;totalAnimations=0;totalQueuedPlayers=0;_namespaceLookup={};_namespaceList=[];_flushFns=[];_whenQuietFns=[];namespacesByHostElement=new Map;collectedEnterElements=[];collectedLeaveElements=[];onRemovalComplete=(e,A)=>{};_onRemovalComplete(e,A){this.onRemovalComplete(e,A)}constructor(e,A,t){this.bodyNode=e,this.driver=A,this._normalizer=t}get queuedPlayers(){let e=[];return this._namespaceList.forEach(A=>{A.players.forEach(t=>{t.queued&&e.push(t)})}),e}createNamespace(e,A){let t=new ob(e,A,this);return this.bodyNode&&this.driver.containsElement(this.bodyNode,A)?this._balanceNamespaceList(t,A):(this.newHostElements.set(A,t),this.collectEnterElement(A)),this._namespaceLookup[e]=t}_balanceNamespaceList(e,A){let t=this._namespaceList,n=this.namespacesByHostElement;if(t.length-1>=0){let a=!1,r=this.driver.getParentElement(A);for(;r;){let s=n.get(r);if(s){let l=t.indexOf(s);t.splice(l+1,0,e),a=!0;break}r=this.driver.getParentElement(r)}a||t.unshift(e)}else t.push(e);return n.set(A,e),e}register(e,A){let t=this._namespaceLookup[e];return t||(t=this.createNamespace(e,A)),t}registerTrigger(e,A,t){let n=this._namespaceLookup[e];n&&n.register(A,t)&&this.totalAnimations++}destroy(e,A){e&&(this.afterFlush(()=>{}),this.afterFlushAnimationsDone(()=>{let t=this._fetchNamespace(e);this.namespacesByHostElement.delete(t.hostElement);let n=this._namespaceList.indexOf(t);n>=0&&this._namespaceList.splice(n,1),t.destroy(A),delete this._namespaceLookup[e]}))}_fetchNamespace(e){return this._namespaceLookup[e]}fetchNamespacesByElement(e){let A=new Set,t=this.statesByElement.get(e);if(t){for(let n of t.values())if(n.namespaceId){let o=this._fetchNamespace(n.namespaceId);o&&A.add(o)}}return A}trigger(e,A,t,n){if(tf(A)){let o=this._fetchNamespace(e);if(o)return o.trigger(A,t,n),!0}return!1}insertNode(e,A,t,n){if(!tf(A))return;let o=A[Ug];if(o&&o.setForRemoval){o.setForRemoval=!1,o.setForMove=!0;let a=this.collectedLeaveElements.indexOf(A);a>=0&&this.collectedLeaveElements.splice(a,1)}if(e){let a=this._fetchNamespace(e);a&&a.insertNode(A,t)}n&&this.collectEnterElement(A)}collectEnterElement(e){this.collectedEnterElements.push(e)}markElementAsDisabled(e,A){A?this.disabledNodes.has(e)||(this.disabledNodes.add(e),Wl(e,Vv)):this.disabledNodes.has(e)&&(this.disabledNodes.delete(e),WI(e,Vv))}removeNode(e,A,t){if(tf(A)){let n=e?this._fetchNamespace(e):null;n?n.removeNode(A,t):this.markElementAsRemoved(e,A,!1,t);let o=this.namespacesByHostElement.get(A);o&&o.id!==e&&o.removeNode(A,t)}else this._onRemovalComplete(A,t)}markElementAsRemoved(e,A,t,n,o){this.collectedLeaveElements.push(A),A[Ug]={namespaceId:e,setForRemoval:n,hasAnimation:t,removedBeforeQueried:!1,previousTriggersValues:o}}listen(e,A,t,n,o){return tf(A)?this._fetchNamespace(e).listen(A,t,n,o):()=>{}}_buildInstruction(e,A,t,n,o){return e.transition.build(this.driver,e.element,e.fromState.value,e.toState.value,t,n,e.fromState.options,e.toState.options,A,o)}destroyInnerAnimations(e){let A=this.driver.query(e,bQ,!0);A.forEach(t=>this.destroyActiveAnimationsForElement(t)),this.playersByQueriedElement.size!=0&&(A=this.driver.query(e,Z3,!0),A.forEach(t=>this.finishActiveQueriedAnimationOnElement(t)))}destroyActiveAnimationsForElement(e){let A=this.playersByElement.get(e);A&&A.forEach(t=>{t.queued?t.markedForDestroy=!0:t.destroy()})}finishActiveQueriedAnimationOnElement(e){let A=this.playersByQueriedElement.get(e);A&&A.forEach(t=>t.finish())}whenRenderingDone(){return new Promise(e=>{if(this.players.length)return Y0(this.players).onDone(()=>e());e()})}processLeaveNode(e){let A=e[Ug];if(A&&A.setForRemoval){if(e[Ug]=eK,A.namespaceId){this.destroyInnerAnimations(e);let t=this._fetchNamespace(A.namespaceId);t&&t.clearElementCache(e)}this._onRemovalComplete(e,A.setForRemoval)}e.classList?.contains(Vv)&&this.markElementAsDisabled(e,!1),this.driver.query(e,RtA,!0).forEach(t=>{this.markElementAsDisabled(t,!1)})}flush(e=-1){let A=[];if(this.newHostElements.size&&(this.newHostElements.forEach((t,n)=>this._balanceNamespaceList(t,n)),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(let t=0;tt()),this._flushFns=[],this._whenQuietFns.length){let t=this._whenQuietFns;this._whenQuietFns=[],A.length?Y0(A).onDone(()=>{t.forEach(n=>n())}):t.forEach(n=>n())}}reportError(e){throw NG(e)}_flushAnimations(e,A){let t=new kQ,n=[],o=new Map,a=[],r=new Map,s=new Map,l=new Map,g=new Set;this.disabledNodes.forEach(QA=>{g.add(QA);let RA=this.driver.query(QA,xtA,!0);for(let dA=0;dA{let dA=Yv+E++;u.set(RA,dA),QA.forEach(IA=>Wl(IA,dA))});let f=[],m=new Set,v=new Set;for(let QA=0;QAm.add(IA)):v.add(RA))}let S=new Map,k=qG(d,Array.from(m));k.forEach((QA,RA)=>{let dA=W3+E++;S.set(RA,dA),QA.forEach(IA=>Wl(IA,dA))}),e.push(()=>{B.forEach((QA,RA)=>{let dA=u.get(RA);QA.forEach(IA=>WI(IA,dA))}),k.forEach((QA,RA)=>{let dA=S.get(RA);QA.forEach(IA=>WI(IA,dA))}),f.forEach(QA=>{this.processLeaveNode(QA)})});let M=[],x=[];for(let QA=this._namespaceList.length-1;QA>=0;QA--)this._namespaceList[QA].drainQueuedTransitions(A).forEach(dA=>{let IA=dA.player,xA=dA.element;if(M.push(IA),this.collectedEnterElements.length){let Xe=xA[Ug];if(Xe&&Xe.setForMove){if(Xe.previousTriggersValues&&Xe.previousTriggersValues.has(dA.triggerName)){let YA=Xe.previousTriggersValues.get(dA.triggerName),hA=this.statesByElement.get(dA.element);if(hA&&hA.has(dA.triggerName)){let Ae=hA.get(dA.triggerName);Ae.value=YA,hA.set(dA.triggerName,Ae)}}IA.destroy();return}}let qA=!C||!this.driver.containsElement(C,xA),ue=S.get(xA),HA=u.get(xA),bA=this._buildInstruction(dA,t,HA,ue,qA);if(bA.errors&&bA.errors.length){x.push(bA);return}if(qA){IA.onStart(()=>A2(xA,bA.fromStyles)),IA.onDestroy(()=>Kg(xA,bA.toStyles)),n.push(IA);return}if(dA.isFallbackTransition){IA.onStart(()=>A2(xA,bA.fromStyles)),IA.onDestroy(()=>Kg(xA,bA.toStyles)),n.push(IA);return}let PA=[];bA.timelines.forEach(Xe=>{Xe.stretchStartingKeyframe=!0,this.disabledNodes.has(Xe.element)||PA.push(Xe)}),bA.timelines=PA,t.append(xA,bA.timelines);let it={instruction:bA,player:IA,element:xA};a.push(it),bA.queriedElements.forEach(Xe=>Zs(r,Xe,[]).push(IA)),bA.preStyleProps.forEach((Xe,YA)=>{if(Xe.size){let hA=s.get(YA);hA||s.set(YA,hA=new Set),Xe.forEach((Ae,pA)=>hA.add(pA))}}),bA.postStyleProps.forEach((Xe,YA)=>{let hA=l.get(YA);hA||l.set(YA,hA=new Set),Xe.forEach((Ae,pA)=>hA.add(pA))})});if(x.length){let QA=[];x.forEach(RA=>{QA.push(FG(RA.triggerName,RA.errors))}),M.forEach(RA=>RA.destroy()),this.reportError(QA)}let F=new Map,z=new Map;a.forEach(QA=>{let RA=QA.element;t.has(RA)&&(z.set(RA,RA),this._beforeAnimationBuild(QA.player.namespaceId,QA.instruction,F))}),n.forEach(QA=>{let RA=QA.element;this._getPreviousPlayers(RA,!1,QA.namespaceId,QA.triggerName,null).forEach(IA=>{Zs(F,RA,[]).push(IA),IA.destroy()})});let j=f.filter(QA=>WG(QA,s,l)),X=new Map;VG(X,this.driver,v,l,Gg).forEach(QA=>{WG(QA,s,l)&&j.push(QA)});let Z=new Map;B.forEach((QA,RA)=>{VG(Z,this.driver,new Set(QA),s,DQ)}),j.forEach(QA=>{let RA=X.get(QA),dA=Z.get(QA);X.set(QA,new Map([...RA?.entries()??[],...dA?.entries()??[]]))});let CA=[],wA=[],BA={};a.forEach(QA=>{let{element:RA,player:dA,instruction:IA}=QA;if(t.has(RA)){if(g.has(RA)){dA.onDestroy(()=>Kg(RA,IA.toStyles)),dA.disabled=!0,dA.overrideTotalTime(IA.totalTime),n.push(dA);return}let xA=BA;if(z.size>1){let ue=RA,HA=[];for(;ue=ue.parentNode;){let bA=z.get(ue);if(bA){xA=bA;break}HA.push(ue)}HA.forEach(bA=>z.set(bA,xA))}let qA=this._buildAnimation(dA.namespaceId,IA,F,o,Z,X);if(dA.setRealPlayer(qA),xA===BA)CA.push(dA);else{let ue=this.playersByElement.get(xA);ue&&ue.length&&(dA.parentPlayer=Y0(ue)),n.push(dA)}}else A2(RA,IA.fromStyles),dA.onDestroy(()=>Kg(RA,IA.toStyles)),wA.push(dA),g.has(RA)&&n.push(dA)}),wA.forEach(QA=>{let RA=o.get(QA.element);if(RA&&RA.length){let dA=Y0(RA);QA.setRealPlayer(dA)}}),n.forEach(QA=>{QA.parentPlayer?QA.syncPlayerEvents(QA.parentPlayer):QA.destroy()});for(let QA=0;QA!qA.destroyed);xA.length?OtA(this,RA,xA):this.processLeaveNode(RA)}return f.length=0,CA.forEach(QA=>{this.players.push(QA),QA.onDone(()=>{QA.destroy();let RA=this.players.indexOf(QA);this.players.splice(RA,1)}),QA.play()}),CA}afterFlush(e){this._flushFns.push(e)}afterFlushAnimationsDone(e){this._whenQuietFns.push(e)}_getPreviousPlayers(e,A,t,n,o){let a=[];if(A){let r=this.playersByQueriedElement.get(e);r&&(a=r)}else{let r=this.playersByElement.get(e);if(r){let s=!o||o==SQ;r.forEach(l=>{l.queued||!s&&l.triggerName!=n||a.push(l)})}}return(t||n)&&(a=a.filter(r=>!(t&&t!=r.namespaceId||n&&n!=r.triggerName))),a}_beforeAnimationBuild(e,A,t){let n=A.triggerName,o=A.element,a=A.isRemovalTransition?void 0:e,r=A.isRemovalTransition?void 0:n;for(let s of A.timelines){let l=s.element,g=l!==o,C=Zs(t,l,[]);this._getPreviousPlayers(l,g,a,r,A.toState).forEach(B=>{let u=B.getRealPlayer();u.beforeDestroy&&u.beforeDestroy(),B.destroy(),C.push(B)})}A2(o,A.fromStyles)}_buildAnimation(e,A,t,n,o,a){let r=A.triggerName,s=A.element,l=[],g=new Set,C=new Set,d=A.timelines.map(u=>{let E=u.element;g.add(E);let f=E[Ug];if(f&&f.removedBeforeQueried)return new J0(u.duration,u.delay);let m=E!==s,v=JtA((t.get(E)||LtA).map(F=>F.getRealPlayer())).filter(F=>{let z=F;return z.element?z.element===E:!1}),S=o.get(E),k=a.get(E),M=Kv(this._normalizer,u.keyframes,S,k),x=this._buildPlayer(u,M,v);if(u.subTimeline&&n&&C.add(E),m){let F=new xQ(e,r,E);F.setRealPlayer(x),l.push(F)}return x});l.forEach(u=>{Zs(this.playersByQueriedElement,u.element,[]).push(u),u.onDone(()=>KtA(this.playersByQueriedElement,u.element,u))}),g.forEach(u=>Wl(u,Hv));let B=Y0(d);return B.onDestroy(()=>{g.forEach(u=>WI(u,Hv)),Kg(s,A.toStyles)}),C.forEach(u=>{Zs(n,u,[]).push(B)}),B}_buildPlayer(e,A,t){return A.length>0?this.driver.animate(e.element,A,e.duration,e.delay,e.easing,t):new J0(e.duration,e.delay)}},xQ=class{namespaceId;triggerName;element;_player=new J0;_containsRealPlayer=!1;_queuedCallbacks=new Map;destroyed=!1;parentPlayer=null;markedForDestroy=!1;disabled=!1;queued=!0;totalTime=0;constructor(e,A,t){this.namespaceId=e,this.triggerName=A,this.element=t}setRealPlayer(e){this._containsRealPlayer||(this._player=e,this._queuedCallbacks.forEach((A,t)=>{A.forEach(n=>j3(e,t,void 0,n))}),this._queuedCallbacks.clear(),this._containsRealPlayer=!0,this.overrideTotalTime(e.totalTime),this.queued=!1)}getRealPlayer(){return this._player}overrideTotalTime(e){this.totalTime=e}syncPlayerEvents(e){let A=this._player;A.triggerCallback&&e.onStart(()=>A.triggerCallback("start")),e.onDone(()=>this.finish()),e.onDestroy(()=>this.destroy())}_queueEvent(e,A){Zs(this._queuedCallbacks,e,[]).push(A)}onDone(e){this.queued&&this._queueEvent("done",e),this._player.onDone(e)}onStart(e){this.queued&&this._queueEvent("start",e),this._player.onStart(e)}onDestroy(e){this.queued&&this._queueEvent("destroy",e),this._player.onDestroy(e)}init(){this._player.init()}hasStarted(){return this.queued?!1:this._player.hasStarted()}play(){!this.queued&&this._player.play()}pause(){!this.queued&&this._player.pause()}restart(){!this.queued&&this._player.restart()}finish(){this._player.finish()}destroy(){this.destroyed=!0,this._player.destroy()}reset(){!this.queued&&this._player.reset()}setPosition(e){this.queued||this._player.setPosition(e)}getPosition(){return this.queued?0:this._player.getPosition()}triggerCallback(e){let A=this._player;A.triggerCallback&&A.triggerCallback(e)}};function KtA(i,e,A){let t=i.get(e);if(t){if(t.length){let n=t.indexOf(A);t.splice(n,1)}t.length==0&&i.delete(e)}return t}function UtA(i){return i??null}function tf(i){return i&&i.nodeType===1}function TtA(i){return i=="start"||i=="done"}function jG(i,e){let A=i.style.display;return i.style.display=e??"none",A}function VG(i,e,A,t,n){let o=[];A.forEach(s=>o.push(jG(s)));let a=[];t.forEach((s,l)=>{let g=new Map;s.forEach(C=>{let d=e.computeStyle(l,C,n);g.set(C,d),(!d||d.length==0)&&(l[Ug]=GtA,a.push(l))}),i.set(l,g)});let r=0;return A.forEach(s=>jG(s,o[r++])),a}function qG(i,e){let A=new Map;if(i.forEach(r=>A.set(r,[])),e.length==0)return A;let t=1,n=new Set(e),o=new Map;function a(r){if(!r)return t;let s=o.get(r);if(s)return s;let l=r.parentNode;return A.has(l)?s=l:n.has(l)?s=t:s=a(l),o.set(r,s),s}return e.forEach(r=>{let s=a(r);s!==t&&A.get(s).push(r)}),A}function Wl(i,e){i.classList?.add(e)}function WI(i,e){i.classList?.remove(e)}function OtA(i,e,A){Y0(A).onDone(()=>i.processLeaveNode(e))}function JtA(i){let e=[];return tK(i,e),e}function tK(i,e){for(let A=0;An.add(o)):e.set(i,t),A.delete(i),!0}var ZI=class{_driver;_normalizer;_transitionEngine;_timelineEngine;_triggerCache={};onRemovalComplete=(e,A)=>{};constructor(e,A,t){this._driver=A,this._normalizer=t,this._transitionEngine=new ab(e.body,A,t),this._timelineEngine=new nb(e.body,A,t),this._transitionEngine.onRemovalComplete=(n,o)=>this.onRemovalComplete(n,o)}registerTrigger(e,A,t,n,o){let a=e+"-"+n,r=this._triggerCache[a];if(!r){let s=[],l=[],g=XG(this._driver,o,s,l);if(s.length)throw DG(n,s);r=StA(n,g,this._normalizer),this._triggerCache[a]=r}this._transitionEngine.registerTrigger(A,n,r)}register(e,A){this._transitionEngine.register(e,A)}destroy(e,A){this._transitionEngine.destroy(e,A)}onInsert(e,A,t,n){this._transitionEngine.insertNode(e,A,t,n)}onRemove(e,A,t){this._transitionEngine.removeNode(e,A,t)}disableAnimations(e,A){this._transitionEngine.markElementAsDisabled(e,A)}process(e,A,t,n){if(t.charAt(0)=="@"){let[o,a]=Uv(t),r=n;this._timelineEngine.command(o,A,a,r)}else this._transitionEngine.trigger(e,A,t,n)}listen(e,A,t,n,o){if(t.charAt(0)=="@"){let[a,r]=Uv(t);return this._timelineEngine.listen(a,A,r,o)}return this._transitionEngine.listen(e,A,t,n,o)}flush(e=-1){this._transitionEngine.flush(e)}get players(){return[...this._transitionEngine.players,...this._timelineEngine.players]}whenRenderingDone(){return this._transitionEngine.whenRenderingDone()}afterFlushAnimationsDone(e){this._transitionEngine.afterFlushAnimationsDone(e)}};function HtA(i,e){let A=null,t=null;return Array.isArray(e)&&e.length?(A=Wv(e[0]),e.length>1&&(t=Wv(e[e.length-1]))):e instanceof Map&&(A=Wv(e)),A||t?new ztA(i,A,t):null}var ztA=(()=>{class i{_element;_startStyles;_endStyles;static initialStylesByElement=new WeakMap;_state=0;_initialStyles;constructor(A,t,n){this._element=A,this._startStyles=t,this._endStyles=n;let o=i.initialStylesByElement.get(A);o||i.initialStylesByElement.set(A,o=new Map),this._initialStyles=o}start(){this._state<1&&(this._startStyles&&Kg(this._element,this._startStyles,this._initialStyles),this._state=1)}finish(){this.start(),this._state<2&&(Kg(this._element,this._initialStyles),this._endStyles&&(Kg(this._element,this._endStyles),this._endStyles=null),this._state=1)}destroy(){this.finish(),this._state<3&&(i.initialStylesByElement.delete(this._element),this._startStyles&&(A2(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(A2(this._element,this._endStyles),this._endStyles=null),Kg(this._element,this._initialStyles),this._state=3)}}return i})();function Wv(i){let e=null;return i.forEach((A,t)=>{PtA(t)&&(e=e||new Map,e.set(t,A))}),e}function PtA(i){return i==="display"||i==="position"}var gf=class{element;keyframes;options;_specialStyles;_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_duration;_delay;_initialized=!1;_finished=!1;_started=!1;_destroyed=!1;_finalKeyframe;_originalOnDoneFns=[];_originalOnStartFns=[];domPlayer=null;time=0;parentPlayer=null;currentSnapshot=new Map;constructor(e,A,t,n){this.element=e,this.keyframes=A,this.options=t,this._specialStyles=n,this._duration=t.duration,this._delay=t.delay||0,this.time=this._duration+this._delay}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this._buildPlayer()&&this._preparePlayerBeforeStart()}_buildPlayer(){if(this._initialized)return this.domPlayer;this._initialized=!0;let e=this.keyframes,A=this._triggerWebAnimation(this.element,e,this.options);if(!A)return this._onFinish(),null;this.domPlayer=A,this._finalKeyframe=e.length?e[e.length-1]:new Map;let t=()=>this._onFinish();return A.addEventListener("finish",t),this.onDestroy(()=>{A.removeEventListener("finish",t)}),A}_preparePlayerBeforeStart(){this._delay?this._resetDomPlayerState():this.domPlayer?.pause()}_convertKeyframesToObject(e){let A=[];return e.forEach(t=>{A.push(Object.fromEntries(t))}),A}_triggerWebAnimation(e,A,t){let n=this._convertKeyframesToObject(A);try{return e.animate(n,t)}catch(o){return null}}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}play(){let e=this._buildPlayer();e&&(this.hasStarted()||(this._onStartFns.forEach(A=>A()),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),e.play())}pause(){this.init(),this.domPlayer?.pause()}finish(){this.init(),this.domPlayer&&(this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish())}reset(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}_resetDomPlayerState(){this.domPlayer?.cancel()}restart(){this.reset(),this.play()}hasStarted(){return this._started}destroy(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}setPosition(e){this.domPlayer||this.init(),this.domPlayer&&(this.domPlayer.currentTime=e*this.time)}getPosition(){return this.domPlayer?+(this.domPlayer.currentTime??0)/this.time:this._initialized?1:0}get totalTime(){return this._delay+this._duration}beforeDestroy(){let e=new Map;this.hasStarted()&&this._finalKeyframe.forEach((t,n)=>{n!=="offset"&&e.set(n,this._finished?t:$3(this.element,n))}),this.currentSnapshot=e}triggerCallback(e){let A=e==="start"?this._onStartFns:this._onDoneFns;A.forEach(t=>t()),A.length=0}},cf=class{validateStyleProperty(e){return!0}validateAnimatableStyleProperty(e){return!0}containsElement(e,A){return Tv(e,A)}getParentElement(e){return q3(e)}query(e,A,t){return Ov(e,A,t)}computeStyle(e,A,t){return $3(e,A)}animate(e,A,t,n,o,a=[]){let r=n==0?"both":"forwards",s={duration:t,delay:n,fill:r};o&&(s.easing=o);let l=new Map,g=a.filter(B=>B instanceof gf);UG(t,n)&&g.forEach(B=>{B.currentSnapshot.forEach((u,E)=>l.set(E,u))});let C=GG(A).map(B=>new Map(B));C=TG(e,C,l);let d=HtA(e,C);return new gf(e,C,s,d)}};var nf="@",iK="@.disabled",Cf=class{namespaceId;delegate;engine;_onDestroy;\u0275type=0;constructor(e,A,t,n){this.namespaceId=e,this.delegate=A,this.engine=t,this._onDestroy=n}get data(){return this.delegate.data}destroyNode(e){this.delegate.destroyNode?.(e)}destroy(){this.engine.destroy(this.namespaceId,this.delegate),this.engine.afterFlushAnimationsDone(()=>{queueMicrotask(()=>{this.delegate.destroy()})}),this._onDestroy?.()}createElement(e,A){return this.delegate.createElement(e,A)}createComment(e){return this.delegate.createComment(e)}createText(e){return this.delegate.createText(e)}appendChild(e,A){this.delegate.appendChild(e,A),this.engine.onInsert(this.namespaceId,A,e,!1)}insertBefore(e,A,t,n=!0){this.delegate.insertBefore(e,A,t),this.engine.onInsert(this.namespaceId,A,e,n)}removeChild(e,A,t,n){if(n){this.delegate.removeChild(e,A,t,n);return}this.parentNode(A)&&this.engine.onRemove(this.namespaceId,A,this.delegate)}selectRootElement(e,A){return this.delegate.selectRootElement(e,A)}parentNode(e){return this.delegate.parentNode(e)}nextSibling(e){return this.delegate.nextSibling(e)}setAttribute(e,A,t,n){this.delegate.setAttribute(e,A,t,n)}removeAttribute(e,A,t){this.delegate.removeAttribute(e,A,t)}addClass(e,A){this.delegate.addClass(e,A)}removeClass(e,A){this.delegate.removeClass(e,A)}setStyle(e,A,t,n){this.delegate.setStyle(e,A,t,n)}removeStyle(e,A,t){this.delegate.removeStyle(e,A,t)}setProperty(e,A,t){A.charAt(0)==nf&&A==iK?this.disableAnimations(e,!!t):this.delegate.setProperty(e,A,t)}setValue(e,A){this.delegate.setValue(e,A)}listen(e,A,t,n){return this.delegate.listen(e,A,t,n)}disableAnimations(e,A){this.engine.disableAnimations(e,A)}},rb=class extends Cf{factory;constructor(e,A,t,n,o){super(A,t,n,o),this.factory=e,this.namespaceId=A}setProperty(e,A,t){A.charAt(0)==nf?A.charAt(1)=="."&&A==iK?(t=t===void 0?!0:!!t,this.disableAnimations(e,t)):this.engine.process(this.namespaceId,e,A.slice(1),t):this.delegate.setProperty(e,A,t)}listen(e,A,t,n){if(A.charAt(0)==nf){let o=jtA(e),a=A.slice(1),r="";return a.charAt(0)!=nf&&([a,r]=VtA(a)),this.engine.listen(this.namespaceId,o,a,r,s=>{let l=s._data||-1;this.factory.scheduleListenerCallback(l,t,s)})}return this.delegate.listen(e,A,t,n)}};function jtA(i){switch(i){case"body":return document.body;case"document":return document;case"window":return window;default:return i}}function VtA(i){let e=i.indexOf("."),A=i.substring(0,e),t=i.slice(e+1);return[A,t]}var df=class{delegate;engine;_zone;_currentId=0;_microtaskId=1;_animationCallbacksBuffer=[];_rendererCache=new Map;_cdRecurDepth=0;constructor(e,A,t){this.delegate=e,this.engine=A,this._zone=t,A.onRemovalComplete=(n,o)=>{o?.removeChild(null,n)}}createRenderer(e,A){let n=this.delegate.createRenderer(e,A);if(!e||!A?.data?.animation){let l=this._rendererCache,g=l.get(n);if(!g){let C=()=>l.delete(n);g=new Cf("",n,this.engine,C),l.set(n,g)}return g}let o=A.id,a=A.id+"-"+this._currentId;this._currentId++,this.engine.register(a,e);let r=l=>{Array.isArray(l)?l.forEach(r):this.engine.registerTrigger(o,a,e,l.name,l)};return A.data.animation.forEach(r),new rb(this,a,n,this.engine)}begin(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()}_scheduleCountTask(){queueMicrotask(()=>{this._microtaskId++})}scheduleListenerCallback(e,A,t){if(e>=0&&eA(t));return}let n=this._animationCallbacksBuffer;n.length==0&&queueMicrotask(()=>{this._zone.run(()=>{n.forEach(o=>{let[a,r]=o;a(r)}),this._animationCallbacksBuffer=[]})}),n.push([A,t])}end(){this._cdRecurDepth--,this._cdRecurDepth==0&&this._zone.runOutsideAngular(()=>{this._scheduleCountTask(),this.engine.flush(this._microtaskId)}),this.delegate.end&&this.delegate.end()}whenRenderingDone(){return this.engine.whenRenderingDone()}componentReplaced(e){this.engine.flush(),this.delegate.componentReplaced?.(e)}};var WtA=(()=>{class i extends ZI{constructor(A,t,n){super(A,t,n)}ngOnDestroy(){this.flush()}static \u0275fac=function(t){return new(t||i)(Wo(ci),Wo(P1),Wo(j1))};static \u0275prov=jA({token:i,factory:i.\u0275fac})}return i})();function ZtA(){return new of}function XtA(){return new df(w(zN),w(ZI),w(We))}var nK=[{provide:j1,useFactory:ZtA},{provide:ZI,useClass:WtA},{provide:zr,useFactory:XtA}],aLA=[{provide:P1,useClass:sb},{provide:b1,useValue:"NoopAnimations"},...nK],$tA=[{provide:P1,useFactory:()=>new cf},{provide:b1,useFactory:()=>"BrowserAnimations"},...nK];function oK(){return n3("NgEagerAnimations"),[...$tA]}function xr(i){i||(i=w(Er));let e=new Fi(A=>{if(i.destroyed){A.next();return}return i.onDestroy(A.next.bind(A))});return A=>A.pipe(yt(e))}var gb=class{source;destroyed=!1;destroyRef=w(Er);constructor(e){this.source=e,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}subscribe(e){if(this.destroyed)throw new Nt(953,!1);let A=this.source.pipe(xr(this.destroyRef)).subscribe({next:t=>e(t)});return{unsubscribe:()=>A.unsubscribe()}}};function Hn(i,e){return new gb(i)}function Fo(i,e){let A=e?.injector??w(St),t=new _g(1),n=Fn(()=>{let o;try{o=i()}catch(a){wa(()=>t.error(a));return}wa(()=>t.next(o))},{injector:A,manualCleanup:!0});return A.get(Er).onDestroy(()=>{n.destroy(),t.complete()}),t.asObservable()}function sr(i,e){let t=!e?.manualCleanup?e?.injector?.get(Er)??w(Er):null,n=AiA(e?.equal),o;e?.requireSync?o=mA({kind:0},{equal:n}):o=mA({kind:1,value:e?.initialValue},{equal:n});let a,r=i.subscribe({next:s=>o.set({kind:1,value:s}),error:s=>{o.set({kind:2,error:s}),a?.()},complete:()=>{a?.()}});if(e?.requireSync&&o().kind===0)throw new Nt(601,!1);return a=t?.onDestroy(r.unsubscribe.bind(r)),ye(()=>{let s=o();switch(s.kind){case 1:return s.value;case 2:throw s.error;case 0:throw new Nt(601,!1)}},{equal:e?.equal})}function AiA(i=Object.is){return(e,A)=>e.kind===1&&A.kind===1&&i(e.value,A.value)}function If(i){return NN($A(P({},i),{loader:void 0,stream:e=>{let A,t=()=>A?.unsubscribe();e.abortSignal.addEventListener("abort",t);let n=mA({value:void 0}),o,a=new Promise(l=>o=l);function r(l){n.set(l),o?.(n),o=void 0}let s=i.stream;if(s===void 0)throw new Nt(990,!1);return A=s(e).subscribe({next:l=>r({value:l}),error:l=>{r({error:FN(l)}),e.abortSignal.removeEventListener("abort",t)},complete:()=>{o&&r({error:new Nt(991,!1)}),e.abortSignal.removeEventListener("abort",t)}}),a}}))}function Ib(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var W1=Ib();function CK(i){W1=i}var V1={exec:()=>null};function eo(i,e=""){let A=typeof i=="string"?i:i.source,t={replace:(n,o)=>{let a=typeof o=="string"?o:o.source;return a=a.replace(Rs.caret,"$1"),A=A.replace(n,a),t},getRegex:()=>new RegExp(A,e)};return t}var eiA=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^
    /i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:i=>new RegExp(`^( {0,3}${i})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:i=>new RegExp(`^ {0,${Math.min(3,i-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:i=>new RegExp(`^ {0,${Math.min(3,i-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:i=>new RegExp(`^ {0,${Math.min(3,i-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:i=>new RegExp(`^ {0,${Math.min(3,i-1)}}#`),htmlBeginRegex:i=>new RegExp(`^ {0,${Math.min(3,i-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:i=>new RegExp(`^ {0,${Math.min(3,i-1)}}>`)},tiA=/^(?:[ \t]*(?:\n|$))+/,iiA=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,niA=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,LQ=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,oiA=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Bb=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,dK=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,IK=eo(dK).replace(/bull/g,Bb).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),aiA=eo(dK).replace(/bull/g,Bb).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),hb=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,riA=/^[^\n]+/,Eb=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,siA=eo(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",Eb).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),liA=eo(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,Bb).getRegex(),Qf="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Qb=/|$))/,giA=eo("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",Qb).replace("tag",Qf).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),BK=eo(hb).replace("hr",LQ).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Qf).getRegex(),ciA=eo(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",BK).getRegex(),ub={blockquote:ciA,code:iiA,def:siA,fences:niA,heading:oiA,hr:LQ,html:giA,lheading:IK,list:liA,newline:tiA,paragraph:BK,table:V1,text:riA},aK=eo("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",LQ).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Qf).getRegex(),CiA=$A(P({},ub),{lheading:aiA,table:aK,paragraph:eo(hb).replace("hr",LQ).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",aK).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Qf).getRegex()}),diA=$A(P({},ub),{html:eo(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",Qb).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:V1,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:eo(hb).replace("hr",LQ).replace("heading",` *#{1,6} *[^ -]`).replace("lheading",IK).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()}),IiA=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,BiA=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,hK=/^( {2,}|\\)\n(?!\s*$)/,hiA=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",eiA?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),pK=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,wiA=eo(pK,"u").replace(/punct/g,uf).getRegex(),yiA=eo(pK,"u").replace(/punct/g,QK).getRegex(),fK="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",DiA=eo(fK,"gu").replace(/notPunctSpace/g,EK).replace(/punctSpace/g,pb).replace(/punct/g,uf).getRegex(),viA=eo(fK,"gu").replace(/notPunctSpace/g,uiA).replace(/punctSpace/g,QiA).replace(/punct/g,QK).getRegex(),biA=eo("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,EK).replace(/punctSpace/g,pb).replace(/punct/g,uf).getRegex(),MiA=eo(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,uK).getRegex(),SiA="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",kiA=eo(SiA,"gu").replace(/notPunctSpace/g,fiA).replace(/punctSpace/g,piA).replace(/punct/g,uK).getRegex(),_iA=eo(/\\(punct)/,"gu").replace(/punct/g,uf).getRegex(),xiA=eo(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),RiA=eo(Qb).replace("(?:-->|$)","-->").getRegex(),NiA=eo("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",RiA).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),hf=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,FiA=eo(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",hf).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),mK=eo(/^!?\[(label)\]\[(ref)\]/).replace("label",hf).replace("ref",Eb).getRegex(),wK=eo(/^!?\[(ref)\](?:\[\])?/).replace("ref",Eb).getRegex(),LiA=eo("reflink|nolink(?!\\()","g").replace("reflink",mK).replace("nolink",wK).getRegex(),rK=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,fb={_backpedal:V1,anyPunctuation:_iA,autolink:xiA,blockSkip:miA,br:hK,code:BiA,del:V1,delLDelim:V1,delRDelim:V1,emStrongLDelim:wiA,emStrongRDelimAst:DiA,emStrongRDelimUnd:biA,escape:IiA,link:FiA,nolink:wK,punctuation:EiA,reflink:mK,reflinkSearch:LiA,tag:NiA,text:hiA,url:V1},GiA=$A(P({},fb),{link:eo(/^!?\[(label)\]\((.*?)\)/).replace("label",hf).getRegex(),reflink:eo(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",hf).getRegex()}),cb=$A(P({},fb),{emStrongRDelimAst:viA,emStrongLDelim:yiA,delLDelim:MiA,delRDelim:kiA,url:eo(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",rK).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:eo(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},sK=i=>UiA[i];function Hc(i,e){if(e){if(Rs.escapeTest.test(i))return i.replace(Rs.escapeReplace,sK)}else if(Rs.escapeTestNoEncode.test(i))return i.replace(Rs.escapeReplaceNoEncode,sK);return i}function lK(i){try{i=encodeURI(i).replace(Rs.percentDecode,"%")}catch(e){return null}return i}function gK(i,e){let A=i.replace(Rs.findPipe,(o,a,r)=>{let s=!1,l=a;for(;--l>=0&&r[l]==="\\";)s=!s;return s?"|":" |"}),t=A.split(Rs.splitPipe),n=0;if(t[0].trim()||t.shift(),t.length>0&&!t.at(-1)?.trim()&&t.pop(),e)if(t.length>e)t.splice(e);else for(;t.length0?-2:-1}function OiA(i,e=0){let A=e,t="";for(let n of i)if(n===" "){let o=4-A%4;t+=" ".repeat(o),A+=o}else t+=n,A++;return t}function cK(i,e,A,t,n){let o=e.href,a=e.title||null,r=i[1].replace(n.other.outputLinkReplace,"$1");t.state.inLink=!0;let s={type:i[0].charAt(0)==="!"?"image":"link",raw:A,href:o,title:a,text:r,tokens:t.inlineTokens(r)};return t.state.inLink=!1,s}function JiA(i,e,A){let t=i.match(A.other.indentCodeCompensation);if(t===null)return e;let n=t[1];return e.split(` -`).map(o=>{let a=o.match(A.other.beginningSpace);if(a===null)return o;let[r]=a;return r.length>=n.length?o.slice(n.length):o}).join(` -`)}var Ef=class{options;rules;lexer;constructor(i){this.options=i||W1}space(i){let e=this.rules.block.newline.exec(i);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(i){let e=this.rules.block.code.exec(i);if(e){let A=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?A:NQ(A,` -`)}}}fences(i){let e=this.rules.block.fences.exec(i);if(e){let A=e[0],t=JiA(A,e[3]||"",this.rules);return{type:"code",raw:A,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:t}}}heading(i){let e=this.rules.block.heading.exec(i);if(e){let A=e[2].trim();if(this.rules.other.endingHash.test(A)){let t=NQ(A,"#");(this.options.pedantic||!t||this.rules.other.endingSpaceChar.test(t))&&(A=t.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:A,tokens:this.lexer.inline(A)}}}hr(i){let e=this.rules.block.hr.exec(i);if(e)return{type:"hr",raw:NQ(e[0],` -`)}}blockquote(i){let e=this.rules.block.blockquote.exec(i);if(e){let A=NQ(e[0],` -`).split(` -`),t="",n="",o=[];for(;A.length>0;){let a=!1,r=[],s;for(s=0;s1,n={type:"list",raw:"",ordered:t,start:t?+A.slice(0,-1):"",loose:!1,items:[]};A=t?`\\d{1,9}\\${A.slice(-1)}`:`\\${A}`,this.options.pedantic&&(A=t?A:"[*+-]");let o=this.rules.other.listItemRegex(A),a=!1;for(;i;){let s=!1,l="",g="";if(!(e=o.exec(i))||this.rules.block.hr.test(i))break;l=e[0],i=i.substring(l.length);let C=OiA(e[2].split(` -`,1)[0],e[1].length),d=i.split(` -`,1)[0],B=!C.trim(),u=0;if(this.options.pedantic?(u=2,g=C.trimStart()):B?u=e[1].length+1:(u=C.search(this.rules.other.nonSpaceChar),u=u>4?1:u,g=C.slice(u),u+=e[1].length),B&&this.rules.other.blankLine.test(d)&&(l+=d+` -`,i=i.substring(d.length+1),s=!0),!s){let E=this.rules.other.nextBulletRegex(u),f=this.rules.other.hrRegex(u),m=this.rules.other.fencesBeginRegex(u),v=this.rules.other.headingBeginRegex(u),S=this.rules.other.htmlBeginRegex(u),k=this.rules.other.blockquoteBeginRegex(u);for(;i;){let M=i.split(` -`,1)[0],x;if(d=M,this.options.pedantic?(d=d.replace(this.rules.other.listReplaceNesting," "),x=d):x=d.replace(this.rules.other.tabCharGlobal," "),m.test(d)||v.test(d)||S.test(d)||k.test(d)||E.test(d)||f.test(d))break;if(x.search(this.rules.other.nonSpaceChar)>=u||!d.trim())g+=` -`+x.slice(u);else{if(B||C.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||m.test(C)||v.test(C)||f.test(C))break;g+=` -`+d}B=!d.trim(),l+=M+` -`,i=i.substring(M.length+1),C=x.slice(u)}}n.loose||(a?n.loose=!0:this.rules.other.doubleBlankLine.test(l)&&(a=!0)),n.items.push({type:"list_item",raw:l,task:!!this.options.gfm&&this.rules.other.listIsTask.test(g),loose:!1,text:g,tokens:[]}),n.raw+=l}let r=n.items.at(-1);if(r)r.raw=r.raw.trimEnd(),r.text=r.text.trimEnd();else return;n.raw=n.raw.trimEnd();for(let s of n.items){if(this.lexer.state.top=!1,s.tokens=this.lexer.blockTokens(s.text,[]),s.task){if(s.text=s.text.replace(this.rules.other.listReplaceTask,""),s.tokens[0]?.type==="text"||s.tokens[0]?.type==="paragraph"){s.tokens[0].raw=s.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),s.tokens[0].text=s.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let g=this.lexer.inlineQueue.length-1;g>=0;g--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[g].src)){this.lexer.inlineQueue[g].src=this.lexer.inlineQueue[g].src.replace(this.rules.other.listReplaceTask,"");break}}let l=this.rules.other.listTaskCheckbox.exec(s.raw);if(l){let g={type:"checkbox",raw:l[0]+" ",checked:l[0]!=="[ ]"};s.checked=g.checked,n.loose?s.tokens[0]&&["paragraph","text"].includes(s.tokens[0].type)&&"tokens"in s.tokens[0]&&s.tokens[0].tokens?(s.tokens[0].raw=g.raw+s.tokens[0].raw,s.tokens[0].text=g.raw+s.tokens[0].text,s.tokens[0].tokens.unshift(g)):s.tokens.unshift({type:"paragraph",raw:g.raw,text:g.raw,tokens:[g]}):s.tokens.unshift(g)}}if(!n.loose){let l=s.tokens.filter(C=>C.type==="space"),g=l.length>0&&l.some(C=>this.rules.other.anyLine.test(C.raw));n.loose=g}}if(n.loose)for(let s of n.items){s.loose=!0;for(let l of s.tokens)l.type==="text"&&(l.type="paragraph")}return n}}html(i){let e=this.rules.block.html.exec(i);if(e)return{type:"html",block:!0,raw:e[0],pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:e[0]}}def(i){let e=this.rules.block.def.exec(i);if(e){let A=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),t=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",n=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:A,raw:e[0],href:t,title:n}}}table(i){let e=this.rules.block.table.exec(i);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let A=gK(e[1]),t=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),n=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(` -`):[],o={type:"table",raw:e[0],header:[],align:[],rows:[]};if(A.length===t.length){for(let a of t)this.rules.other.tableAlignRight.test(a)?o.align.push("right"):this.rules.other.tableAlignCenter.test(a)?o.align.push("center"):this.rules.other.tableAlignLeft.test(a)?o.align.push("left"):o.align.push(null);for(let a=0;a({text:r,tokens:this.lexer.inline(r),header:!1,align:o.align[s]})));return o}}lheading(i){let e=this.rules.block.lheading.exec(i);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(i){let e=this.rules.block.paragraph.exec(i);if(e){let A=e[1].charAt(e[1].length-1)===` -`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:A,tokens:this.lexer.inline(A)}}}text(i){let e=this.rules.block.text.exec(i);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(i){let e=this.rules.inline.escape.exec(i);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(i){let e=this.rules.inline.tag.exec(i);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(i){let e=this.rules.inline.link.exec(i);if(e){let A=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(A)){if(!this.rules.other.endAngleBracket.test(A))return;let o=NQ(A.slice(0,-1),"\\");if((A.length-o.length)%2===0)return}else{let o=TiA(e[2],"()");if(o===-2)return;if(o>-1){let a=(e[0].indexOf("!")===0?5:4)+e[1].length+o;e[2]=e[2].substring(0,o),e[0]=e[0].substring(0,a).trim(),e[3]=""}}let t=e[2],n="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(t);o&&(t=o[1],n=o[3])}else n=e[3]?e[3].slice(1,-1):"";return t=t.trim(),this.rules.other.startAngleBracket.test(t)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(A)?t=t.slice(1):t=t.slice(1,-1)),cK(e,{href:t&&t.replace(this.rules.inline.anyPunctuation,"$1"),title:n&&n.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(i,e){let A;if((A=this.rules.inline.reflink.exec(i))||(A=this.rules.inline.nolink.exec(i))){let t=(A[2]||A[1]).replace(this.rules.other.multipleSpaceGlobal," "),n=e[t.toLowerCase()];if(!n){let o=A[0].charAt(0);return{type:"text",raw:o,text:o}}return cK(A,n,A[0],this.lexer,this.rules)}}emStrong(i,e,A=""){let t=this.rules.inline.emStrongLDelim.exec(i);if(!(!t||t[3]&&A.match(this.rules.other.unicodeAlphaNumeric))&&(!(t[1]||t[2])||!A||this.rules.inline.punctuation.exec(A))){let n=[...t[0]].length-1,o,a,r=n,s=0,l=t[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(l.lastIndex=0,e=e.slice(-1*i.length+n);(t=l.exec(e))!=null;){if(o=t[1]||t[2]||t[3]||t[4]||t[5]||t[6],!o)continue;if(a=[...o].length,t[3]||t[4]){r+=a;continue}else if((t[5]||t[6])&&n%3&&!((n+a)%3)){s+=a;continue}if(r-=a,r>0)continue;a=Math.min(a,a+r+s);let g=[...t[0]][0].length,C=i.slice(0,n+t.index+g+a);if(Math.min(n,a)%2){let B=C.slice(1,-1);return{type:"em",raw:C,text:B,tokens:this.lexer.inlineTokens(B)}}let d=C.slice(2,-2);return{type:"strong",raw:C,text:d,tokens:this.lexer.inlineTokens(d)}}}}codespan(i){let e=this.rules.inline.code.exec(i);if(e){let A=e[2].replace(this.rules.other.newLineCharGlobal," "),t=this.rules.other.nonSpaceChar.test(A),n=this.rules.other.startingSpaceChar.test(A)&&this.rules.other.endingSpaceChar.test(A);return t&&n&&(A=A.substring(1,A.length-1)),{type:"codespan",raw:e[0],text:A}}}br(i){let e=this.rules.inline.br.exec(i);if(e)return{type:"br",raw:e[0]}}del(i,e,A=""){let t=this.rules.inline.delLDelim.exec(i);if(t&&(!t[1]||!A||this.rules.inline.punctuation.exec(A))){let n=[...t[0]].length-1,o,a,r=n,s=this.rules.inline.delRDelim;for(s.lastIndex=0,e=e.slice(-1*i.length+n);(t=s.exec(e))!=null;){if(o=t[1]||t[2]||t[3]||t[4]||t[5]||t[6],!o||(a=[...o].length,a!==n))continue;if(t[3]||t[4]){r+=a;continue}if(r-=a,r>0)continue;a=Math.min(a,a+r);let l=[...t[0]][0].length,g=i.slice(0,n+t.index+l+a),C=g.slice(n,-n);return{type:"del",raw:g,text:C,tokens:this.lexer.inlineTokens(C)}}}}autolink(i){let e=this.rules.inline.autolink.exec(i);if(e){let A,t;return e[2]==="@"?(A=e[1],t="mailto:"+A):(A=e[1],t=A),{type:"link",raw:e[0],text:A,href:t,tokens:[{type:"text",raw:A,text:A}]}}}url(i){let e;if(e=this.rules.inline.url.exec(i)){let A,t;if(e[2]==="@")A=e[0],t="mailto:"+A;else{let n;do n=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(n!==e[0]);A=e[0],e[1]==="www."?t="http://"+e[0]:t=e[0]}return{type:"link",raw:e[0],text:A,href:t,tokens:[{type:"text",raw:A,text:A}]}}}inlineText(i){let e=this.rules.inline.text.exec(i);if(e){let A=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:A}}}},Tg=class Cb{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||W1,this.options.tokenizer=this.options.tokenizer||new Ef,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let A={other:Rs,block:Bf.normal,inline:RQ.normal};this.options.pedantic?(A.block=Bf.pedantic,A.inline=RQ.pedantic):this.options.gfm&&(A.block=Bf.gfm,this.options.breaks?A.inline=RQ.breaks:A.inline=RQ.gfm),this.tokenizer.rules=A}static get rules(){return{block:Bf,inline:RQ}}static lex(e,A){return new Cb(A).lex(e)}static lexInline(e,A){return new Cb(A).inlineTokens(e)}lex(e){e=e.replace(Rs.carriageReturn,` -`),this.blockTokens(e,this.tokens);for(let A=0;A(n=a.call({lexer:this},e,A))?(e=e.substring(n.raw.length),A.push(n),!0):!1))continue;if(n=this.tokenizer.space(e)){e=e.substring(n.raw.length);let a=A.at(-1);n.raw.length===1&&a!==void 0?a.raw+=` -`:A.push(n);continue}if(n=this.tokenizer.code(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(` -`)?"":` -`)+n.raw,a.text+=` -`+n.text,this.inlineQueue.at(-1).src=a.text):A.push(n);continue}if(n=this.tokenizer.fences(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.heading(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.hr(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.blockquote(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.list(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.html(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.def(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(` -`)?"":` -`)+n.raw,a.text+=` -`+n.raw,this.inlineQueue.at(-1).src=a.text):this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title},A.push(n));continue}if(n=this.tokenizer.table(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.lheading(e)){e=e.substring(n.raw.length),A.push(n);continue}let o=e;if(this.options.extensions?.startBlock){let a=1/0,r=e.slice(1),s;this.options.extensions.startBlock.forEach(l=>{s=l.call({lexer:this},r),typeof s=="number"&&s>=0&&(a=Math.min(a,s))}),a<1/0&&a>=0&&(o=e.substring(0,a+1))}if(this.state.top&&(n=this.tokenizer.paragraph(o))){let a=A.at(-1);t&&a?.type==="paragraph"?(a.raw+=(a.raw.endsWith(` -`)?"":` -`)+n.raw,a.text+=` -`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):A.push(n),t=o.length!==e.length,e=e.substring(n.raw.length);continue}if(n=this.tokenizer.text(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="text"?(a.raw+=(a.raw.endsWith(` -`)?"":` -`)+n.raw,a.text+=` -`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):A.push(n);continue}if(e){let a="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(a);break}else throw new Error(a)}}return this.state.top=!0,A}inline(e,A=[]){return this.inlineQueue.push({src:e,tokens:A}),A}inlineTokens(e,A=[]){let t=e,n=null;if(this.tokens.links){let s=Object.keys(this.tokens.links);if(s.length>0)for(;(n=this.tokenizer.rules.inline.reflinkSearch.exec(t))!=null;)s.includes(n[0].slice(n[0].lastIndexOf("[")+1,-1))&&(t=t.slice(0,n.index)+"["+"a".repeat(n[0].length-2)+"]"+t.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(n=this.tokenizer.rules.inline.anyPunctuation.exec(t))!=null;)t=t.slice(0,n.index)+"++"+t.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let o;for(;(n=this.tokenizer.rules.inline.blockSkip.exec(t))!=null;)o=n[2]?n[2].length:0,t=t.slice(0,n.index+o)+"["+"a".repeat(n[0].length-o-2)+"]"+t.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);t=this.options.hooks?.emStrongMask?.call({lexer:this},t)??t;let a=!1,r="";for(;e;){a||(r=""),a=!1;let s;if(this.options.extensions?.inline?.some(g=>(s=g.call({lexer:this},e,A))?(e=e.substring(s.raw.length),A.push(s),!0):!1))continue;if(s=this.tokenizer.escape(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.tag(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.link(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(s.raw.length);let g=A.at(-1);s.type==="text"&&g?.type==="text"?(g.raw+=s.raw,g.text+=s.text):A.push(s);continue}if(s=this.tokenizer.emStrong(e,t,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.codespan(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.br(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.del(e,t,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.autolink(e)){e=e.substring(s.raw.length),A.push(s);continue}if(!this.state.inLink&&(s=this.tokenizer.url(e))){e=e.substring(s.raw.length),A.push(s);continue}let l=e;if(this.options.extensions?.startInline){let g=1/0,C=e.slice(1),d;this.options.extensions.startInline.forEach(B=>{d=B.call({lexer:this},C),typeof d=="number"&&d>=0&&(g=Math.min(g,d))}),g<1/0&&g>=0&&(l=e.substring(0,g+1))}if(s=this.tokenizer.inlineText(l)){e=e.substring(s.raw.length),s.raw.slice(-1)!=="_"&&(r=s.raw.slice(-1)),a=!0;let g=A.at(-1);g?.type==="text"?(g.raw+=s.raw,g.text+=s.text):A.push(s);continue}if(e){let g="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(g);break}else throw new Error(g)}}return A}},e2=class{options;parser;constructor(i){this.options=i||W1}space(i){return""}code({text:i,lang:e,escaped:A}){let t=(e||"").match(Rs.notSpaceStart)?.[0],n=i.replace(Rs.endingNewline,"")+` -`;return t?'
    '+(A?n:Hc(n,!0))+`
    -`:"
    "+(A?n:Hc(n,!0))+`
    -`}blockquote({tokens:i}){return`
    -${this.parser.parse(i)}
    -`}html({text:i}){return i}def(i){return""}heading({tokens:i,depth:e}){return`${this.parser.parseInline(i)} -`}hr(i){return`
    -`}list(i){let e=i.ordered,A=i.start,t="";for(let a=0;a -`+t+" -`}listitem(i){return`
  • ${this.parser.parse(i.tokens)}
  • -`}checkbox({checked:i}){return" '}paragraph({tokens:i}){return`

    ${this.parser.parseInline(i)}

    -`}table(i){let e="",A="";for(let n=0;n${t}`),` - -`+e+` -`+t+`
    -`}tablerow({text:i}){return` -${i} -`}tablecell(i){let e=this.parser.parseInline(i.tokens),A=i.header?"th":"td";return(i.align?`<${A} align="${i.align}">`:`<${A}>`)+e+` -`}strong({tokens:i}){return`${this.parser.parseInline(i)}`}em({tokens:i}){return`${this.parser.parseInline(i)}`}codespan({text:i}){return`${Hc(i,!0)}`}br(i){return"
    "}del({tokens:i}){return`${this.parser.parseInline(i)}`}link({href:i,title:e,tokens:A}){let t=this.parser.parseInline(A),n=lK(i);if(n===null)return t;i=n;let o='
    ",o}image({href:i,title:e,text:A,tokens:t}){t&&(A=this.parser.parseInline(t,this.parser.textRenderer));let n=lK(i);if(n===null)return Hc(A);i=n;let o=`${Hc(A)}{let a=n[o].flat(1/0);A=A.concat(this.walkTokens(a,e))}):n.tokens&&(A=A.concat(this.walkTokens(n.tokens,e)))}}return A}use(...i){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return i.forEach(A=>{let t=P({},A);if(t.async=this.defaults.async||t.async||!1,A.extensions&&(A.extensions.forEach(n=>{if(!n.name)throw new Error("extension name required");if("renderer"in n){let o=e.renderers[n.name];o?e.renderers[n.name]=function(...a){let r=n.renderer.apply(this,a);return r===!1&&(r=o.apply(this,a)),r}:e.renderers[n.name]=n.renderer}if("tokenizer"in n){if(!n.level||n.level!=="block"&&n.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=e[n.level];o?o.unshift(n.tokenizer):e[n.level]=[n.tokenizer],n.start&&(n.level==="block"?e.startBlock?e.startBlock.push(n.start):e.startBlock=[n.start]:n.level==="inline"&&(e.startInline?e.startInline.push(n.start):e.startInline=[n.start]))}"childTokens"in n&&n.childTokens&&(e.childTokens[n.name]=n.childTokens)}),t.extensions=e),A.renderer){let n=this.defaults.renderer||new e2(this.defaults);for(let o in A.renderer){if(!(o in n))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let a=o,r=A.renderer[a],s=n[a];n[a]=(...l)=>{let g=r.apply(n,l);return g===!1&&(g=s.apply(n,l)),g||""}}t.renderer=n}if(A.tokenizer){let n=this.defaults.tokenizer||new Ef(this.defaults);for(let o in A.tokenizer){if(!(o in n))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let a=o,r=A.tokenizer[a],s=n[a];n[a]=(...l)=>{let g=r.apply(n,l);return g===!1&&(g=s.apply(n,l)),g}}t.tokenizer=n}if(A.hooks){let n=this.defaults.hooks||new FQ;for(let o in A.hooks){if(!(o in n))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let a=o,r=A.hooks[a],s=n[a];FQ.passThroughHooks.has(o)?n[a]=l=>{if(this.defaults.async&&FQ.passThroughHooksRespectAsync.has(o))return re(this,null,function*(){let C=yield r.call(n,l);return s.call(n,C)});let g=r.call(n,l);return s.call(n,g)}:n[a]=(...l)=>{if(this.defaults.async)return re(this,null,function*(){let C=yield r.apply(n,l);return C===!1&&(C=yield s.apply(n,l)),C});let g=r.apply(n,l);return g===!1&&(g=s.apply(n,l)),g}}t.hooks=n}if(A.walkTokens){let n=this.defaults.walkTokens,o=A.walkTokens;t.walkTokens=function(a){let r=[];return r.push(o.call(this,a)),n&&(r=r.concat(n.call(this,a))),r}}this.defaults=P(P({},this.defaults),t)}),this}setOptions(i){return this.defaults=P(P({},this.defaults),i),this}lexer(i,e){return Tg.lex(i,e??this.defaults)}parser(i,e){return Og.parse(i,e??this.defaults)}parseMarkdown(i){return(e,A)=>{let t=P({},A),n=P(P({},this.defaults),t),o=this.onError(!!n.silent,!!n.async);if(this.defaults.async===!0&&t.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(n.hooks&&(n.hooks.options=n,n.hooks.block=i),n.async)return re(this,null,function*(){let a=n.hooks?yield n.hooks.preprocess(e):e,r=yield(n.hooks?yield n.hooks.provideLexer():i?Tg.lex:Tg.lexInline)(a,n),s=n.hooks?yield n.hooks.processAllTokens(r):r;n.walkTokens&&(yield Promise.all(this.walkTokens(s,n.walkTokens)));let l=yield(n.hooks?yield n.hooks.provideParser():i?Og.parse:Og.parseInline)(s,n);return n.hooks?yield n.hooks.postprocess(l):l}).catch(o);try{n.hooks&&(e=n.hooks.preprocess(e));let a=(n.hooks?n.hooks.provideLexer():i?Tg.lex:Tg.lexInline)(e,n);n.hooks&&(a=n.hooks.processAllTokens(a)),n.walkTokens&&this.walkTokens(a,n.walkTokens);let r=(n.hooks?n.hooks.provideParser():i?Og.parse:Og.parseInline)(a,n);return n.hooks&&(r=n.hooks.postprocess(r)),r}catch(a){return o(a)}}}onError(i,e){return A=>{if(A.message+=` -Please report this to https://github.com/markedjs/marked.`,i){let t="

    An error occurred:

    "+Hc(A.message+"",!0)+"
    ";return e?Promise.resolve(t):t}if(e)return Promise.reject(A);throw A}}},q1=new YiA;function lo(i,e){return q1.parse(i,e)}lo.options=lo.setOptions=function(i){return q1.setOptions(i),lo.defaults=q1.defaults,CK(lo.defaults),lo};lo.getDefaults=Ib;lo.defaults=W1;lo.use=function(...i){return q1.use(...i),lo.defaults=q1.defaults,CK(lo.defaults),lo};lo.walkTokens=function(i,e){return q1.walkTokens(i,e)};lo.parseInline=q1.parseInline;lo.Parser=Og;lo.parser=Og.parse;lo.Renderer=e2;lo.TextRenderer=mb;lo.Lexer=Tg;lo.lexer=Tg.lex;lo.Tokenizer=Ef;lo.Hooks=FQ;lo.parse=lo;var QLA=lo.options,uLA=lo.setOptions,pLA=lo.use,fLA=lo.walkTokens,mLA=lo.parseInline;var wLA=Og.parse,yLA=Tg.lex;var HiA=["*"],ziA="Copy",PiA="Copied",jiA=(()=>{class i{constructor(){this._buttonClick$=new ne,this.copied=sr(this._buttonClick$.pipe(Mi(()=>Vi(oe(!0),$p(3e3).pipe(qE(!1)))),xg(),Js(1))),this.copiedText=ye(()=>this.copied()?PiA:ziA)}onCopyToClipboardClick(){this._buttonClick$.next()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["markdown-clipboard"]],decls:2,vars:3,consts:[[1,"markdown-clipboard-button",3,"click"]],template:function(t,n){t&1&&(Ln(0,"button",0),yI("click",function(){return n.onCopyToClipboardClick()}),D(1),Xn()),t&2&&(_A("copied",n.copied()),Q(),nA(n.copiedText()))},encapsulation:2,changeDetection:0})}}return i})(),ViA=new MA("CLIPBOARD_OPTIONS");var qiA=new MA("MARKED_EXTENSIONS"),WiA=new MA("MARKED_OPTIONS"),ZiA=new MA("MERMAID_OPTIONS"),XiA=new MA("SANITIZE");function $iA(i){return typeof i=="function"}var AnA="[ngx-markdown] When using the `emoji` attribute you *have to* include Emoji-Toolkit files to `angular.json` or use imports. See README for more information",enA="[ngx-markdown] When using the `katex` attribute you *have to* include KaTeX files to `angular.json` or use imports. See README for more information",tnA="[ngx-markdown] When using the `mermaid` attribute you *have to* include Mermaid files to `angular.json` or use imports. See README for more information",inA="[ngx-markdown] When using the `clipboard` attribute you *have to* include Clipboard files to `angular.json` or use imports. See README for more information",nnA="[ngx-markdown] When using the `clipboard` attribute you *have to* provide the `viewContainerRef` parameter to `MarkdownService.render()` function",onA="[ngx-markdown] When using the `src` attribute you *have to* pass the `HttpClient` as a parameter of the `forRoot` method. See README for more information";var yK=(()=>{class i{get options(){return this._options}set options(A){this._options=P(P({},this.DEFAULT_MARKED_OPTIONS),A)}get renderer(){return this.options.renderer}set renderer(A){this.options.renderer=A}constructor(){this.clipboardOptions=w(ViA,{optional:!0}),this.extensions=w(qiA,{optional:!0}),this.http=w(Mr,{optional:!0}),this.mermaidOptions=w(ZiA,{optional:!0}),this.platform=w(i3),this.sanitize=w(XiA,{optional:!0}),this.sanitizer=w(jC),this.DEFAULT_MARKED_OPTIONS={renderer:new e2},this.DEFAULT_KATEX_OPTIONS={delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}]},this.DEFAULT_MERMAID_OPTIONS={startOnLoad:!1},this.DEFAULT_CLIPBOARD_OPTIONS={buttonComponent:void 0},this.DEFAULT_PARSE_OPTIONS={decodeHtml:!1,inline:!1,emoji:!1,mermaid:!1,markedOptions:void 0,disableSanitizer:!1},this.DEFAULT_RENDER_OPTIONS={clipboard:!1,clipboardOptions:void 0,katex:!1,katexOptions:void 0,mermaid:!1,mermaidOptions:void 0},this.DEFAULT_SECURITY_CONTEXT=Ng.HTML,this._options=null,this._reload$=new ne,this.reload$=this._reload$.asObservable(),this.options=w(WiA,{optional:!0})}parse(A,t=this.DEFAULT_PARSE_OPTIONS){let{decodeHtml:n,inline:o,emoji:a,mermaid:r,disableSanitizer:s}=t,l=P(P({},this.options),t.markedOptions),g=l.renderer||this.renderer||new e2;this.extensions&&(this.renderer=this.extendsRendererForExtensions(g)),r&&(this.renderer=this.extendsRendererForMermaid(g));let C=this.trimIndentation(A),d=n?this.decodeHtml(C):C,B=a?this.parseEmoji(d):d,u=this.parseMarked(B,l,o);return s?u:this.sanitizeHtml(u)}render(A,t=this.DEFAULT_RENDER_OPTIONS,n){let{clipboard:o,clipboardOptions:a,katex:r,katexOptions:s,mermaid:l,mermaidOptions:g}=t;r&&this.renderKatex(A,P(P({},this.DEFAULT_KATEX_OPTIONS),s)),l&&this.renderMermaid(A,P(P(P({},this.DEFAULT_MERMAID_OPTIONS),this.mermaidOptions),g)),o&&this.renderClipboard(A,n,P(P(P({},this.DEFAULT_CLIPBOARD_OPTIONS),this.clipboardOptions),a)),this.highlight(A)}reload(){this._reload$.next()}getSource(A){if(!this.http)throw new Error(onA);return this.http.get(A,{responseType:"text"}).pipe(Se(t=>this.handleExtension(A,t)))}highlight(A){if(!U0(this.platform)||typeof Prism>"u"||typeof Prism.highlightAllUnder>"u")return;A||(A=document);let t=A.querySelectorAll('pre code:not([class*="language-"])');Array.prototype.forEach.call(t,n=>n.classList.add("language-none")),Prism.highlightAllUnder(A)}decodeHtml(A){if(!U0(this.platform))return A;let t=document.createElement("textarea");return t.innerHTML=A,t.value}extendsRendererForExtensions(A){let t=A;return t.\u0275NgxMarkdownRendererExtendedForExtensions===!0||(this.extensions&&this.extensions.length>0&&lo.use(...this.extensions),t.\u0275NgxMarkdownRendererExtendedForExtensions=!0),A}extendsRendererForMermaid(A){let t=A;if(t.\u0275NgxMarkdownRendererExtendedForMermaid===!0)return A;let n=A.code;return A.code=o=>o.lang==="mermaid"?`
    ${o.text}
    `:n(o),t.\u0275NgxMarkdownRendererExtendedForMermaid=!0,A}handleExtension(A,t){let n=A.lastIndexOf("://"),o=n>-1?A.substring(n+4):A,a=o.lastIndexOf("/"),r=a>-1?o.substring(a+1).split("?")[0]:"",s=r.lastIndexOf("."),l=s>-1?r.substring(s+1):"";return l&&l!=="md"?"```"+l+` -`+t+"\n```":t}parseMarked(A,t,n=!1){if(t.renderer){let o=P({},t.renderer);delete o.\u0275NgxMarkdownRendererExtendedForExtensions,delete o.\u0275NgxMarkdownRendererExtendedForMermaid,delete t.renderer,lo.use({renderer:o})}return n?lo.parseInline(A,t):lo.parse(A,t)}parseEmoji(A){if(!U0(this.platform))return A;if(typeof joypixels>"u"||typeof joypixels.shortnameToUnicode>"u")throw new Error(AnA);return joypixels.shortnameToUnicode(A)}renderKatex(A,t){if(U0(this.platform)){if(typeof katex>"u"||typeof renderMathInElement>"u")throw new Error(enA);renderMathInElement(A,t)}}renderClipboard(A,t,n){if(!U0(this.platform))return;if(typeof ClipboardJS>"u")throw new Error(inA);if(!t)throw new Error(nnA);let{buttonComponent:o,buttonTemplate:a}=n,r=A.querySelectorAll("pre");for(let s=0;sC.classList.add("hover"),g.onmouseleave=()=>C.classList.remove("hover");let d;if(o){let u=t.createComponent(o);d=u.hostView,u.changeDetectorRef.markForCheck()}else if(a)d=t.createEmbeddedView(a);else{let u=t.createComponent(jiA);d=u.hostView,u.changeDetectorRef.markForCheck()}let B;d.rootNodes.forEach(u=>{C.appendChild(u),B=new ClipboardJS(u,{text:()=>l.innerText})}),d.onDestroy(()=>B.destroy())}}renderMermaid(A,t=this.DEFAULT_MERMAID_OPTIONS){if(!U0(this.platform))return;if(typeof mermaid>"u"||typeof mermaid.initialize>"u")throw new Error(tnA);let n=A.querySelectorAll(".mermaid");n.length!==0&&(mermaid.initialize(t),mermaid.run({nodes:n}))}trimIndentation(A){if(!A)return"";let t;return A.split(` -`).map(n=>{let o=t;return n.length>0&&(o=isNaN(o)?n.search(/\S|$/):Math.min(n.search(/\S|$/),o)),isNaN(t)&&(t=o),o?n.substring(o):n}).join(` -`)}sanitizeHtml(A){return re(this,null,function*(){return $iA(this.sanitize)?this.sanitize(yield A):this.sanitize!==Ng.NONE?this.sanitizer.sanitize(this.sanitize??this.DEFAULT_SECURITY_CONTEXT,A)??"":A})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),wb=(function(i){return i.CommandLine="command-line",i.LineHighlight="line-highlight",i.LineNumbers="line-numbers",i})(wb||{}),DK=(()=>{class i{constructor(){this.element=w(ce),this.markdownService=w(yK),this.viewContainerRef=w(Jo),this.error=new FA,this.load=new FA,this.ready=new FA,this._clipboard=!1,this._commandLine=!1,this._disableSanitizer=!1,this._emoji=!1,this._inline=!1,this._katex=!1,this._lineHighlight=!1,this._lineNumbers=!1,this._mermaid=!1,this.destroyed$=new ne}get disableSanitizer(){return this._disableSanitizer}set disableSanitizer(A){this._disableSanitizer=this.coerceBooleanProperty(A)}get inline(){return this._inline}set inline(A){this._inline=this.coerceBooleanProperty(A)}get clipboard(){return this._clipboard}set clipboard(A){this._clipboard=this.coerceBooleanProperty(A)}get emoji(){return this._emoji}set emoji(A){this._emoji=this.coerceBooleanProperty(A)}get katex(){return this._katex}set katex(A){this._katex=this.coerceBooleanProperty(A)}get mermaid(){return this._mermaid}set mermaid(A){this._mermaid=this.coerceBooleanProperty(A)}get lineHighlight(){return this._lineHighlight}set lineHighlight(A){this._lineHighlight=this.coerceBooleanProperty(A)}get lineNumbers(){return this._lineNumbers}set lineNumbers(A){this._lineNumbers=this.coerceBooleanProperty(A)}get commandLine(){return this._commandLine}set commandLine(A){this._commandLine=this.coerceBooleanProperty(A)}ngOnChanges(){this.loadContent()}loadContent(){if(this.data!=null){this.handleData();return}if(this.src!=null){this.handleSrc();return}}ngAfterViewInit(){!this.data&&!this.src&&this.handleTransclusion(),this.markdownService.reload$.pipe(yt(this.destroyed$)).subscribe(()=>this.loadContent())}ngOnDestroy(){this.destroyed$.next(),this.destroyed$.complete()}render(A,t=!1){return re(this,null,function*(){let n={decodeHtml:t,inline:this.inline,emoji:this.emoji,mermaid:this.mermaid,disableSanitizer:this.disableSanitizer},o={clipboard:this.clipboard,clipboardOptions:this.getClipboardOptions(),katex:this.katex,katexOptions:this.katexOptions,mermaid:this.mermaid,mermaidOptions:this.mermaidOptions},a=yield this.markdownService.parse(A,n);this.element.nativeElement.innerHTML=a,this.handlePlugins(),this.markdownService.render(this.element.nativeElement,o,this.viewContainerRef),this.ready.emit()})}coerceBooleanProperty(A){return A!=null&&`${String(A)}`!="false"}getClipboardOptions(){if(this.clipboardButtonComponent||this.clipboardButtonTemplate)return{buttonComponent:this.clipboardButtonComponent,buttonTemplate:this.clipboardButtonTemplate}}handleData(){this.render(this.data)}handleSrc(){this.markdownService.getSource(this.src).subscribe({next:A=>{this.render(A).then(()=>{this.load.emit(A)})},error:A=>this.error.emit(A)})}handleTransclusion(){this.render(this.element.nativeElement.innerHTML,!0)}handlePlugins(){this.commandLine&&(this.setPluginClass(this.element.nativeElement,wb.CommandLine),this.setPluginOptions(this.element.nativeElement,{dataFilterOutput:this.filterOutput,dataHost:this.host,dataPrompt:this.prompt,dataOutput:this.output,dataUser:this.user})),this.lineHighlight&&this.setPluginOptions(this.element.nativeElement,{dataLine:this.line,dataLineOffset:this.lineOffset}),this.lineNumbers&&(this.setPluginClass(this.element.nativeElement,wb.LineNumbers),this.setPluginOptions(this.element.nativeElement,{dataStart:this.start}))}setPluginClass(A,t){let n=A.querySelectorAll("pre");for(let o=0;o{let r=t[a];if(r){let s=this.toLispCase(a);n.item(o).setAttribute(s,r.toString())}})}toLispCase(A){let t=A.match(/([A-Z])/g);if(!t)return A;let n=A.toString();for(let o=0,a=t.length;o{class i{static forRoot(A){return{ngModule:i,providers:[GQ(A)]}}static forChild(){return{ngModule:i}}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275mod=et({type:i})}static{this.\u0275inj=At({})}}return i})();var Yi="primary",qQ=Symbol("RouteTitle"),Mb=class{params;constructor(e){this.params=e||{}}has(e){return Object.prototype.hasOwnProperty.call(this.params,e)}get(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A[0]:A}return null}getAll(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A:[A]}return[]}get keys(){return Object.keys(this.params)}};function X1(i){return new Mb(i)}function yb(i,e,A){for(let t=0;ti.length||A.pathMatch==="full"&&(e.hasChildren()||t.lengthi.length||A.pathMatch==="full"&&e.hasChildren()&&A.path!=="**")return null;let r={};return!yb(o,i.slice(0,o.length),r)||!yb(a,i.slice(i.length-a.length),r)?null:{consumed:i,posParams:r}}function Df(i){return new Promise((e,A)=>{i.pipe(oo()).subscribe({next:t=>e(t),error:t=>A(t)})})}function snA(i,e){if(i.length!==e.length)return!1;for(let A=0;At[o]===n)}else return i===e}function lnA(i){return i.length>0?i[i.length-1]:null}function Ad(i){return fI(i)?i:l3(i)?Yr(Promise.resolve(i)):oe(i)}function LK(i){return fI(i)?Df(i):Promise.resolve(i)}var gnA={exact:UK,subset:TK},GK={exact:cnA,subset:CnA,ignored:()=>!0},KK={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},kb={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"};function bK(i,e,A){return gnA[A.paths](i.root,e.root,A.matrixParams)&&GK[A.queryParams](i.queryParams,e.queryParams)&&!(A.fragment==="exact"&&i.fragment!==e.fragment)}function cnA(i,e){return zc(i,e)}function UK(i,e,A){if(!Z1(i.segments,e.segments)||!mf(i.segments,e.segments,A)||i.numberOfChildren!==e.numberOfChildren)return!1;for(let t in e.children)if(!i.children[t]||!UK(i.children[t],e.children[t],A))return!1;return!0}function CnA(i,e){return Object.keys(e).length<=Object.keys(i).length&&Object.keys(e).every(A=>FK(i[A],e[A]))}function TK(i,e,A){return OK(i,e,e.segments,A)}function OK(i,e,A,t){if(i.segments.length>A.length){let n=i.segments.slice(0,A.length);return!(!Z1(n,A)||e.hasChildren()||!mf(n,A,t))}else if(i.segments.length===A.length){if(!Z1(i.segments,A)||!mf(i.segments,A,t))return!1;for(let n in e.children)if(!i.children[n]||!TK(i.children[n],e.children[n],t))return!1;return!0}else{let n=A.slice(0,i.segments.length),o=A.slice(i.segments.length);return!Z1(i.segments,n)||!mf(i.segments,n,t)||!i.children[Yi]?!1:OK(i.children[Yi],e,o,t)}}function mf(i,e,A){return e.every((t,n)=>GK[A](i[n].parameters,t.parameters))}var Xl=class{root;queryParams;fragment;_queryParamMap;constructor(e=new yo([],{}),A={},t=null){this.root=e,this.queryParams=A,this.fragment=t}get queryParamMap(){return this._queryParamMap??=X1(this.queryParams),this._queryParamMap}toString(){return BnA.serialize(this)}},yo=class{segments;children;parent=null;constructor(e,A){this.segments=e,this.children=A,Object.values(A).forEach(t=>t.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return wf(this)}},t2=class{path;parameters;_parameterMap;constructor(e,A){this.path=e,this.parameters=A}get parameterMap(){return this._parameterMap??=X1(this.parameters),this._parameterMap}toString(){return YK(this)}};function dnA(i,e){return Z1(i,e)&&i.every((A,t)=>zc(A.parameters,e[t].parameters))}function Z1(i,e){return i.length!==e.length?!1:i.every((A,t)=>A.path===e[t].path)}function InA(i,e){let A=[];return Object.entries(i.children).forEach(([t,n])=>{t===Yi&&(A=A.concat(e(n,t)))}),Object.entries(i.children).forEach(([t,n])=>{t!==Yi&&(A=A.concat(e(n,t)))}),A}var ed=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:()=>new z0,providedIn:"root"})}return i})(),z0=class{parse(e){let A=new xb(e);return new Xl(A.parseRootSegment(),A.parseQueryParams(),A.parseFragment())}serialize(e){let A=`/${KQ(e.root,!0)}`,t=QnA(e.queryParams),n=typeof e.fragment=="string"?`#${hnA(e.fragment)}`:"";return`${A}${t}${n}`}},BnA=new z0;function wf(i){return i.segments.map(e=>YK(e)).join("/")}function KQ(i,e){if(!i.hasChildren())return wf(i);if(e){let A=i.children[Yi]?KQ(i.children[Yi],!1):"",t=[];return Object.entries(i.children).forEach(([n,o])=>{n!==Yi&&t.push(`${n}:${KQ(o,!1)}`)}),t.length>0?`${A}(${t.join("//")})`:A}else{let A=InA(i,(t,n)=>n===Yi?[KQ(i.children[Yi],!1)]:[`${n}:${KQ(t,!1)}`]);return Object.keys(i.children).length===1&&i.children[Yi]!=null?`${wf(i)}/${A[0]}`:`${wf(i)}/(${A.join("//")})`}}function JK(i){return encodeURIComponent(i).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function pf(i){return JK(i).replace(/%3B/gi,";")}function hnA(i){return encodeURI(i)}function _b(i){return JK(i).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function yf(i){return decodeURIComponent(i)}function MK(i){return yf(i.replace(/\+/g,"%20"))}function YK(i){return`${_b(i.path)}${EnA(i.parameters)}`}function EnA(i){return Object.entries(i).map(([e,A])=>`;${_b(e)}=${_b(A)}`).join("")}function QnA(i){let e=Object.entries(i).map(([A,t])=>Array.isArray(t)?t.map(n=>`${pf(A)}=${pf(n)}`).join("&"):`${pf(A)}=${pf(t)}`).filter(A=>A);return e.length?`?${e.join("&")}`:""}var unA=/^[^\/()?;#]+/;function Db(i){let e=i.match(unA);return e?e[0]:""}var pnA=/^[^\/()?;=#]+/;function fnA(i){let e=i.match(pnA);return e?e[0]:""}var mnA=/^[^=?&#]+/;function wnA(i){let e=i.match(mnA);return e?e[0]:""}var ynA=/^[^&#]+/;function DnA(i){let e=i.match(ynA);return e?e[0]:""}var xb=class{url;remaining;constructor(e){this.url=e,this.remaining=e}parseRootSegment(){return this.consumeOptional("/"),this.remaining===""||this.peekStartsWith("?")||this.peekStartsWith("#")?new yo([],{}):new yo([],this.parseChildren())}parseQueryParams(){let e={};if(this.consumeOptional("?"))do this.parseQueryParam(e);while(this.consumeOptional("&"));return e}parseFragment(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}parseChildren(e=0){if(e>50)throw new Nt(4010,!1);if(this.remaining==="")return{};this.consumeOptional("/");let A=[];for(this.peekStartsWith("(")||A.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),A.push(this.parseSegment());let t={};this.peekStartsWith("/(")&&(this.capture("/"),t=this.parseParens(!0,e));let n={};return this.peekStartsWith("(")&&(n=this.parseParens(!1,e)),(A.length>0||Object.keys(t).length>0)&&(n[Yi]=new yo(A,t)),n}parseSegment(){let e=Db(this.remaining);if(e===""&&this.peekStartsWith(";"))throw new Nt(4009,!1);return this.capture(e),new t2(yf(e),this.parseMatrixParams())}parseMatrixParams(){let e={};for(;this.consumeOptional(";");)this.parseParam(e);return e}parseParam(e){let A=fnA(this.remaining);if(!A)return;this.capture(A);let t="";if(this.consumeOptional("=")){let n=Db(this.remaining);n&&(t=n,this.capture(t))}e[yf(A)]=yf(t)}parseQueryParam(e){let A=wnA(this.remaining);if(!A)return;this.capture(A);let t="";if(this.consumeOptional("=")){let a=DnA(this.remaining);a&&(t=a,this.capture(t))}let n=MK(A),o=MK(t);if(e.hasOwnProperty(n)){let a=e[n];Array.isArray(a)||(a=[a],e[n]=a),a.push(o)}else e[n]=o}parseParens(e,A){let t={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){let n=Db(this.remaining),o=this.remaining[n.length];if(o!=="/"&&o!==")"&&o!==";")throw new Nt(4010,!1);let a;n.indexOf(":")>-1?(a=n.slice(0,n.indexOf(":")),this.capture(a),this.capture(":")):e&&(a=Yi);let r=this.parseChildren(A+1);t[a??Yi]=Object.keys(r).length===1&&r[Yi]?r[Yi]:new yo([],r),this.consumeOptional("//")}return t}peekStartsWith(e){return this.remaining.startsWith(e)}consumeOptional(e){return this.peekStartsWith(e)?(this.remaining=this.remaining.substring(e.length),!0):!1}capture(e){if(!this.consumeOptional(e))throw new Nt(4011,!1)}};function HK(i){return i.segments.length>0?new yo([],{[Yi]:i}):i}function zK(i){let e={};for(let[t,n]of Object.entries(i.children)){let o=zK(n);if(t===Yi&&o.segments.length===0&&o.hasChildren())for(let[a,r]of Object.entries(o.children))e[a]=r;else(o.segments.length>0||o.hasChildren())&&(e[t]=o)}let A=new yo(i.segments,e);return vnA(A)}function vnA(i){if(i.numberOfChildren===1&&i.children[Yi]){let e=i.children[Yi];return new yo(i.segments.concat(e.segments),e.children)}return i}function tB(i){return i instanceof Xl}function PK(i,e,A=null,t=null,n=new z0){let o=jK(i);return VK(o,e,A,t,n)}function jK(i){let e;function A(o){let a={};for(let s of o.children){let l=A(s);a[s.outlet]=l}let r=new yo(o.url,a);return o===i&&(e=r),r}let t=A(i.root),n=HK(t);return e??n}function VK(i,e,A,t,n){let o=i;for(;o.parent;)o=o.parent;if(e.length===0)return vb(o,o,o,A,t,n);let a=bnA(e);if(a.toRoot())return vb(o,o,new yo([],{}),A,t,n);let r=MnA(a,o,i),s=r.processChildren?TQ(r.segmentGroup,r.index,a.commands):WK(r.segmentGroup,r.index,a.commands);return vb(o,r.segmentGroup,s,A,t,n)}function vf(i){return typeof i=="object"&&i!=null&&!i.outlets&&!i.segmentPath}function JQ(i){return typeof i=="object"&&i!=null&&i.outlets}function SK(i,e,A){i||="\u0275";let t=new Xl;return t.queryParams={[i]:e},A.parse(A.serialize(t)).queryParams[i]}function vb(i,e,A,t,n,o){let a={};for(let[l,g]of Object.entries(t??{}))a[l]=Array.isArray(g)?g.map(C=>SK(l,C,o)):SK(l,g,o);let r;i===e?r=A:r=qK(i,e,A);let s=HK(zK(r));return new Xl(s,a,n)}function qK(i,e,A){let t={};return Object.entries(i.children).forEach(([n,o])=>{o===e?t[n]=A:t[n]=qK(o,e,A)}),new yo(i.segments,t)}var bf=class{isAbsolute;numberOfDoubleDots;commands;constructor(e,A,t){if(this.isAbsolute=e,this.numberOfDoubleDots=A,this.commands=t,e&&t.length>0&&vf(t[0]))throw new Nt(4003,!1);let n=t.find(JQ);if(n&&n!==lnA(t))throw new Nt(4004,!1)}toRoot(){return this.isAbsolute&&this.commands.length===1&&this.commands[0]=="/"}};function bnA(i){if(typeof i[0]=="string"&&i.length===1&&i[0]==="/")return new bf(!0,0,i);let e=0,A=!1,t=i.reduce((n,o,a)=>{if(typeof o=="object"&&o!=null){if(o.outlets){let r={};return Object.entries(o.outlets).forEach(([s,l])=>{r[s]=typeof l=="string"?l.split("/"):l}),[...n,{outlets:r}]}if(o.segmentPath)return[...n,o.segmentPath]}return typeof o!="string"?[...n,o]:a===0?(o.split("/").forEach((r,s)=>{s==0&&r==="."||(s==0&&r===""?A=!0:r===".."?e++:r!=""&&n.push(r))}),n):[...n,o]},[]);return new bf(A,e,t)}var $I=class{segmentGroup;processChildren;index;constructor(e,A,t){this.segmentGroup=e,this.processChildren=A,this.index=t}};function MnA(i,e,A){if(i.isAbsolute)return new $I(e,!0,0);if(!A)return new $I(e,!1,NaN);if(A.parent===null)return new $I(A,!0,0);let t=vf(i.commands[0])?0:1,n=A.segments.length-1+t;return SnA(A,n,i.numberOfDoubleDots)}function SnA(i,e,A){let t=i,n=e,o=A;for(;o>n;){if(o-=n,t=t.parent,!t)throw new Nt(4005,!1);n=t.segments.length}return new $I(t,!1,n-o)}function knA(i){return JQ(i[0])?i[0].outlets:{[Yi]:i}}function WK(i,e,A){if(i??=new yo([],{}),i.segments.length===0&&i.hasChildren())return TQ(i,e,A);let t=_nA(i,e,A),n=A.slice(t.commandIndex);if(t.match&&t.pathIndexo!==Yi)&&i.children[Yi]&&i.numberOfChildren===1&&i.children[Yi].segments.length===0){let o=TQ(i.children[Yi],e,A);return new yo(i.segments,o.children)}return Object.entries(t).forEach(([o,a])=>{typeof a=="string"&&(a=[a]),a!==null&&(n[o]=WK(i.children[o],e,a))}),Object.entries(i.children).forEach(([o,a])=>{t[o]===void 0&&(n[o]=a)}),new yo(i.segments,n)}}function _nA(i,e,A){let t=0,n=e,o={match:!1,pathIndex:0,commandIndex:0};for(;n=A.length)return o;let a=i.segments[n],r=A[t];if(JQ(r))break;let s=`${r}`,l=t0&&s===void 0)break;if(s&&l&&typeof l=="object"&&l.outlets===void 0){if(!_K(s,l,a))return o;t+=2}else{if(!_K(s,{},a))return o;t++}n++}return{match:!0,pathIndex:n,commandIndex:t}}function Rb(i,e,A){let t=i.segments.slice(0,e),n=0;for(;n{typeof t=="string"&&(t=[t]),t!==null&&(e[A]=Rb(new yo([],{}),0,t))}),e}function kK(i){let e={};return Object.entries(i).forEach(([A,t])=>e[A]=`${t}`),e}function _K(i,e,A){return i==A.path&&zc(e,A.parameters)}var AB="imperative",ur=(function(i){return i[i.NavigationStart=0]="NavigationStart",i[i.NavigationEnd=1]="NavigationEnd",i[i.NavigationCancel=2]="NavigationCancel",i[i.NavigationError=3]="NavigationError",i[i.RoutesRecognized=4]="RoutesRecognized",i[i.ResolveStart=5]="ResolveStart",i[i.ResolveEnd=6]="ResolveEnd",i[i.GuardsCheckStart=7]="GuardsCheckStart",i[i.GuardsCheckEnd=8]="GuardsCheckEnd",i[i.RouteConfigLoadStart=9]="RouteConfigLoadStart",i[i.RouteConfigLoadEnd=10]="RouteConfigLoadEnd",i[i.ChildActivationStart=11]="ChildActivationStart",i[i.ChildActivationEnd=12]="ChildActivationEnd",i[i.ActivationStart=13]="ActivationStart",i[i.ActivationEnd=14]="ActivationEnd",i[i.Scroll=15]="Scroll",i[i.NavigationSkipped=16]="NavigationSkipped",i})(ur||{}),Sl=class{id;url;constructor(e,A){this.id=e,this.url=A}},i2=class extends Sl{type=ur.NavigationStart;navigationTrigger;restoredState;constructor(e,A,t="imperative",n=null){super(e,A),this.navigationTrigger=t,this.restoredState=n}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}},Jg=class extends Sl{urlAfterRedirects;type=ur.NavigationEnd;constructor(e,A,t){super(e,A),this.urlAfterRedirects=t}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}},ds=(function(i){return i[i.Redirect=0]="Redirect",i[i.SupersededByNewNavigation=1]="SupersededByNewNavigation",i[i.NoDataFromResolver=2]="NoDataFromResolver",i[i.GuardRejected=3]="GuardRejected",i[i.Aborted=4]="Aborted",i})(ds||{}),iB=(function(i){return i[i.IgnoredSameUrlNavigation=0]="IgnoredSameUrlNavigation",i[i.IgnoredByUrlHandlingStrategy=1]="IgnoredByUrlHandlingStrategy",i})(iB||{}),Zl=class extends Sl{reason;code;type=ur.NavigationCancel;constructor(e,A,t,n){super(e,A),this.reason=t,this.code=n}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}};function ZK(i){return i instanceof Zl&&(i.code===ds.Redirect||i.code===ds.SupersededByNewNavigation)}var jc=class extends Sl{reason;code;type=ur.NavigationSkipped;constructor(e,A,t,n){super(e,A),this.reason=t,this.code=n}},$1=class extends Sl{error;target;type=ur.NavigationError;constructor(e,A,t,n){super(e,A),this.error=t,this.target=n}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}},YQ=class extends Sl{urlAfterRedirects;state;type=ur.RoutesRecognized;constructor(e,A,t,n){super(e,A),this.urlAfterRedirects=t,this.state=n}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Mf=class extends Sl{urlAfterRedirects;state;type=ur.GuardsCheckStart;constructor(e,A,t,n){super(e,A),this.urlAfterRedirects=t,this.state=n}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Sf=class extends Sl{urlAfterRedirects;state;shouldActivate;type=ur.GuardsCheckEnd;constructor(e,A,t,n,o){super(e,A),this.urlAfterRedirects=t,this.state=n,this.shouldActivate=o}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}},kf=class extends Sl{urlAfterRedirects;state;type=ur.ResolveStart;constructor(e,A,t,n){super(e,A),this.urlAfterRedirects=t,this.state=n}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},_f=class extends Sl{urlAfterRedirects;state;type=ur.ResolveEnd;constructor(e,A,t,n){super(e,A),this.urlAfterRedirects=t,this.state=n}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},xf=class{route;type=ur.RouteConfigLoadStart;constructor(e){this.route=e}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}},Rf=class{route;type=ur.RouteConfigLoadEnd;constructor(e){this.route=e}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}},Nf=class{snapshot;type=ur.ChildActivationStart;constructor(e){this.snapshot=e}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},Ff=class{snapshot;type=ur.ChildActivationEnd;constructor(e){this.snapshot=e}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},Lf=class{snapshot;type=ur.ActivationStart;constructor(e){this.snapshot=e}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},Gf=class{snapshot;type=ur.ActivationEnd;constructor(e){this.snapshot=e}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},nB=class{routerEvent;position;anchor;scrollBehavior;type=ur.Scroll;constructor(e,A,t,n){this.routerEvent=e,this.position=A,this.anchor=t,this.scrollBehavior=n}toString(){let e=this.position?`${this.position[0]}, ${this.position[1]}`:null;return`Scroll(anchor: '${this.anchor}', position: '${e}')`}},oB=class{},HQ=class{},aB=class{url;navigationBehaviorOptions;constructor(e,A){this.url=e,this.navigationBehaviorOptions=A}};function RnA(i){return!(i instanceof oB)&&!(i instanceof aB)&&!(i instanceof HQ)}var Kf=class{rootInjector;outlet=null;route=null;children;attachRef=null;get injector(){return this.route?.snapshot._environmentInjector??this.rootInjector}constructor(e){this.rootInjector=e,this.children=new td(this.rootInjector)}},td=(()=>{class i{rootInjector;contexts=new Map;constructor(A){this.rootInjector=A}onChildOutletCreated(A,t){let n=this.getOrCreateContext(A);n.outlet=t,this.contexts.set(A,n)}onChildOutletDestroyed(A){let t=this.getContext(A);t&&(t.outlet=null,t.attachRef=null)}onOutletDeactivated(){let A=this.contexts;return this.contexts=new Map,A}onOutletReAttached(A){this.contexts=A}getOrCreateContext(A){let t=this.getContext(A);return t||(t=new Kf(this.rootInjector),this.contexts.set(A,t)),t}getContext(A){return this.contexts.get(A)||null}static \u0275fac=function(t){return new(t||i)(Wo(Hr))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),Uf=class{_root;constructor(e){this._root=e}get root(){return this._root.value}parent(e){let A=this.pathFromRoot(e);return A.length>1?A[A.length-2]:null}children(e){let A=Nb(e,this._root);return A?A.children.map(t=>t.value):[]}firstChild(e){let A=Nb(e,this._root);return A&&A.children.length>0?A.children[0].value:null}siblings(e){let A=Fb(e,this._root);return A.length<2?[]:A[A.length-2].children.map(n=>n.value).filter(n=>n!==e)}pathFromRoot(e){return Fb(e,this._root).map(A=>A.value)}};function Nb(i,e){if(i===e.value)return e;for(let A of e.children){let t=Nb(i,A);if(t)return t}return null}function Fb(i,e){if(i===e.value)return[e];for(let A of e.children){let t=Fb(i,A);if(t.length)return t.unshift(e),t}return[]}var Ml=class{value;children;constructor(e,A){this.value=e,this.children=A}toString(){return`TreeNode(${this.value})`}};function XI(i){let e={};return i&&i.children.forEach(A=>e[A.value.outlet]=A),e}var zQ=class extends Uf{snapshot;constructor(e,A){super(e),this.snapshot=A,Hb(this,e)}toString(){return this.snapshot.toString()}};function XK(i,e){let A=NnA(i,e),t=new gi([new t2("",{})]),n=new gi({}),o=new gi({}),a=new gi({}),r=new gi(""),s=new $s(t,n,a,r,o,Yi,i,A.root);return s.snapshot=A.root,new zQ(new Ml(s,[]),A)}function NnA(i,e){let A={},t={},n={},a=new rB([],A,n,"",t,Yi,i,null,{},e);return new PQ("",new Ml(a,[]))}var $s=class{urlSubject;paramsSubject;queryParamsSubject;fragmentSubject;dataSubject;outlet;component;snapshot;_futureSnapshot;_routerState;_paramMap;_queryParamMap;title;url;params;queryParams;fragment;data;constructor(e,A,t,n,o,a,r,s){this.urlSubject=e,this.paramsSubject=A,this.queryParamsSubject=t,this.fragmentSubject=n,this.dataSubject=o,this.outlet=a,this.component=r,this._futureSnapshot=s,this.title=this.dataSubject?.pipe(Se(l=>l[qQ]))??oe(void 0),this.url=e,this.params=A,this.queryParams=t,this.fragment=n,this.data=o}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=this.params.pipe(Se(e=>X1(e))),this._paramMap}get queryParamMap(){return this._queryParamMap??=this.queryParams.pipe(Se(e=>X1(e))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}};function Yb(i,e,A="emptyOnly"){let t,{routeConfig:n}=i;return e!==null&&(A==="always"||n?.path===""||!e.component&&!e.routeConfig?.loadComponent)?t={params:P(P({},e.params),i.params),data:P(P({},e.data),i.data),resolve:P(P(P(P({},i.data),e.data),n?.data),i._resolvedData)}:t={params:P({},i.params),data:P({},i.data),resolve:P(P({},i.data),i._resolvedData??{})},n&&AU(n)&&(t.resolve[qQ]=n.title),t}var rB=class{url;params;queryParams;fragment;data;outlet;component;routeConfig;_resolve;_resolvedData;_routerState;_paramMap;_queryParamMap;_environmentInjector;get title(){return this.data?.[qQ]}constructor(e,A,t,n,o,a,r,s,l,g){this.url=e,this.params=A,this.queryParams=t,this.fragment=n,this.data=o,this.outlet=a,this.component=r,this.routeConfig=s,this._resolve=l,this._environmentInjector=g}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=X1(this.params),this._paramMap}get queryParamMap(){return this._queryParamMap??=X1(this.queryParams),this._queryParamMap}toString(){let e=this.url.map(t=>t.toString()).join("/"),A=this.routeConfig?this.routeConfig.path:"";return`Route(url:'${e}', path:'${A}')`}},PQ=class extends Uf{url;constructor(e,A){super(A),this.url=e,Hb(this,A)}toString(){return $K(this._root)}};function Hb(i,e){e.value._routerState=i,e.children.forEach(A=>Hb(i,A))}function $K(i){let e=i.children.length>0?` { ${i.children.map($K).join(", ")} } `:"";return`${i.value}${e}`}function bb(i){if(i.snapshot){let e=i.snapshot,A=i._futureSnapshot;i.snapshot=A,zc(e.queryParams,A.queryParams)||i.queryParamsSubject.next(A.queryParams),e.fragment!==A.fragment&&i.fragmentSubject.next(A.fragment),zc(e.params,A.params)||i.paramsSubject.next(A.params),snA(e.url,A.url)||i.urlSubject.next(A.url),zc(e.data,A.data)||i.dataSubject.next(A.data)}else i.snapshot=i._futureSnapshot,i.dataSubject.next(i._futureSnapshot.data)}function Lb(i,e){let A=zc(i.params,e.params)&&dnA(i.url,e.url),t=!i.parent!=!e.parent;return A&&!t&&(!i.parent||Lb(i.parent,e.parent))}function AU(i){return typeof i.title=="string"||i.title===null}var eU=new MA(""),zb=(()=>{class i{activated=null;get activatedComponentRef(){return this.activated}_activatedRoute=null;name=Yi;activateEvents=new FA;deactivateEvents=new FA;attachEvents=new FA;detachEvents=new FA;routerOutletData=ve();parentContexts=w(td);location=w(Jo);changeDetector=w(Mt);inputBinder=w(WQ,{optional:!0});supportsBindingToComponentInputs=!0;ngOnChanges(A){if(A.name){let{firstChange:t,previousValue:n}=A.name;if(t)return;this.isTrackedInParentContexts(n)&&(this.deactivate(),this.parentContexts.onChildOutletDestroyed(n)),this.initializeOutletWithName()}}ngOnDestroy(){this.isTrackedInParentContexts(this.name)&&this.parentContexts.onChildOutletDestroyed(this.name),this.inputBinder?.unsubscribeFromRouteData(this)}isTrackedInParentContexts(A){return this.parentContexts.getContext(A)?.outlet===this}ngOnInit(){this.initializeOutletWithName()}initializeOutletWithName(){if(this.parentContexts.onChildOutletCreated(this.name,this),this.activated)return;let A=this.parentContexts.getContext(this.name);A?.route&&(A.attachRef?this.attach(A.attachRef,A.route):this.activateWith(A.route,A.injector))}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new Nt(4012,!1);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new Nt(4012,!1);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new Nt(4012,!1);this.location.detach();let A=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(A.instance),A}attach(A,t){this.activated=A,this._activatedRoute=t,this.location.insert(A.hostView),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.attachEvents.emit(A.instance)}deactivate(){if(this.activated){let A=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(A)}}activateWith(A,t){if(this.isActivated)throw new Nt(4013,!1);this._activatedRoute=A;let n=this.location,a=A.snapshot.component,r=this.parentContexts.getOrCreateContext(this.name).children,s=new Gb(A,r,n.injector,this.routerOutletData);this.activated=n.createComponent(a,{index:n.length,injector:s,environmentInjector:t}),this.changeDetector.markForCheck(),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.activateEvents.emit(this.activated.instance)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["router-outlet"]],inputs:{name:"name",routerOutletData:[1,"routerOutletData"]},outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"],features:[ii]})}return i})(),Gb=class{route;childContexts;parent;outletData;constructor(e,A,t,n){this.route=e,this.childContexts=A,this.parent=t,this.outletData=n}get(e,A){return e===$s?this.route:e===td?this.childContexts:e===eU?this.outletData:this.parent.get(e,A)}},WQ=new MA(""),Pb=(()=>{class i{outletDataSubscriptions=new Map;bindActivatedRouteToOutletComponent(A){this.unsubscribeFromRouteData(A),this.subscribeToRouteData(A)}unsubscribeFromRouteData(A){this.outletDataSubscriptions.get(A)?.unsubscribe(),this.outletDataSubscriptions.delete(A)}subscribeToRouteData(A){let{activatedRoute:t}=A,n=Dr([t.queryParams,t.params,t.data]).pipe(Mi(([o,a,r],s)=>(r=P(P(P({},o),a),r),s===0?oe(r):Promise.resolve(r)))).subscribe(o=>{if(!A.isActivated||!A.activatedComponentRef||A.activatedRoute!==t||t.component===null){this.unsubscribeFromRouteData(A);return}let a=UN(t.component);if(!a){this.unsubscribeFromRouteData(A);return}for(let{templateName:r}of a.inputs)A.activatedComponentRef.setInput(r,o[r])});this.outletDataSubscriptions.set(A,n)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac})}return i})(),jb=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["ng-component"]],exportAs:["emptyRouterOutlet"],decls:1,vars:0,template:function(t,n){t&1&&lA(0,"router-outlet")},dependencies:[zb],encapsulation:2})}return i})();function Vb(i){let e=i.children&&i.children.map(Vb),A=e?$A(P({},i),{children:e}):P({},i);return!A.component&&!A.loadComponent&&(e||A.loadChildren)&&A.outlet&&A.outlet!==Yi&&(A.component=jb),A}function FnA(i,e,A){let t=jQ(i,e._root,A?A._root:void 0);return new zQ(t,e)}function jQ(i,e,A){if(A&&i.shouldReuseRoute(e.value,A.value.snapshot)){let t=A.value;t._futureSnapshot=e.value;let n=LnA(i,e,A);return new Ml(t,n)}else{if(i.shouldAttach(e.value)){let o=i.retrieve(e.value);if(o!==null){let a=o.route;return a.value._futureSnapshot=e.value,a.children=e.children.map(r=>jQ(i,r)),a}}let t=GnA(e.value),n=e.children.map(o=>jQ(i,o));return new Ml(t,n)}}function LnA(i,e,A){return e.children.map(t=>{for(let n of A.children)if(i.shouldReuseRoute(t.value,n.value.snapshot))return jQ(i,t,n);return jQ(i,t)})}function GnA(i){return new $s(new gi(i.url),new gi(i.params),new gi(i.queryParams),new gi(i.fragment),new gi(i.data),i.outlet,i.component,i)}var sB=class{redirectTo;navigationBehaviorOptions;constructor(e,A){this.redirectTo=e,this.navigationBehaviorOptions=A}},tU="ngNavigationCancelingError";function Tf(i,e){let{redirectTo:A,navigationBehaviorOptions:t}=tB(e)?{redirectTo:e,navigationBehaviorOptions:void 0}:e,n=iU(!1,ds.Redirect);return n.url=A,n.navigationBehaviorOptions=t,n}function iU(i,e){let A=new Error(`NavigationCancelingError: ${i||""}`);return A[tU]=!0,A.cancellationCode=e,A}function KnA(i){return nU(i)&&tB(i.url)}function nU(i){return!!i&&i[tU]}var Kb=class{routeReuseStrategy;futureState;currState;forwardEvent;inputBindingEnabled;constructor(e,A,t,n,o){this.routeReuseStrategy=e,this.futureState=A,this.currState=t,this.forwardEvent=n,this.inputBindingEnabled=o}activate(e){let A=this.futureState._root,t=this.currState?this.currState._root:null;this.deactivateChildRoutes(A,t,e),bb(this.futureState.root),this.activateChildRoutes(A,t,e)}deactivateChildRoutes(e,A,t){let n=XI(A);e.children.forEach(o=>{let a=o.value.outlet;this.deactivateRoutes(o,n[a],t),delete n[a]}),Object.values(n).forEach(o=>{this.deactivateRouteAndItsChildren(o,t)})}deactivateRoutes(e,A,t){let n=e.value,o=A?A.value:null;if(n===o)if(n.component){let a=t.getContext(n.outlet);a&&this.deactivateChildRoutes(e,A,a.children)}else this.deactivateChildRoutes(e,A,t);else o&&this.deactivateRouteAndItsChildren(A,t)}deactivateRouteAndItsChildren(e,A){e.value.component&&this.routeReuseStrategy.shouldDetach(e.value.snapshot)?this.detachAndStoreRouteSubtree(e,A):this.deactivateRouteAndOutlet(e,A)}detachAndStoreRouteSubtree(e,A){let t=A.getContext(e.value.outlet),n=t&&e.value.component?t.children:A,o=XI(e);for(let a of Object.values(o))this.deactivateRouteAndItsChildren(a,n);if(t&&t.outlet){let a=t.outlet.detach(),r=t.children.onOutletDeactivated();this.routeReuseStrategy.store(e.value.snapshot,{componentRef:a,route:e,contexts:r})}}deactivateRouteAndOutlet(e,A){let t=A.getContext(e.value.outlet),n=t&&e.value.component?t.children:A,o=XI(e);for(let a of Object.values(o))this.deactivateRouteAndItsChildren(a,n);t&&(t.outlet&&(t.outlet.deactivate(),t.children.onOutletDeactivated()),t.attachRef=null,t.route=null)}activateChildRoutes(e,A,t){let n=XI(A);e.children.forEach(o=>{this.activateRoutes(o,n[o.value.outlet],t),this.forwardEvent(new Gf(o.value.snapshot))}),e.children.length&&this.forwardEvent(new Ff(e.value.snapshot))}activateRoutes(e,A,t){let n=e.value,o=A?A.value:null;if(bb(n),n===o)if(n.component){let a=t.getOrCreateContext(n.outlet);this.activateChildRoutes(e,A,a.children)}else this.activateChildRoutes(e,A,t);else if(n.component){let a=t.getOrCreateContext(n.outlet);if(this.routeReuseStrategy.shouldAttach(n.snapshot)){let r=this.routeReuseStrategy.retrieve(n.snapshot);this.routeReuseStrategy.store(n.snapshot,null),a.children.onOutletReAttached(r.contexts),a.attachRef=r.componentRef,a.route=r.route.value,a.outlet&&a.outlet.attach(r.componentRef,r.route.value),bb(r.route.value),this.activateChildRoutes(e,null,a.children)}else a.attachRef=null,a.route=n,a.outlet&&a.outlet.activateWith(n,a.injector),this.activateChildRoutes(e,null,a.children)}else this.activateChildRoutes(e,null,t)}},Of=class{path;route;constructor(e){this.path=e,this.route=this.path[this.path.length-1]}},eB=class{component;route;constructor(e,A){this.component=e,this.route=A}};function UnA(i,e,A){let t=i._root,n=e?e._root:null;return UQ(t,n,A,[t.value])}function TnA(i){let e=i.routeConfig?i.routeConfig.canActivateChild:null;return!e||e.length===0?null:{node:i,guards:e}}function gB(i,e){let A=Symbol(),t=e.get(i,A);return t===A?typeof i=="function"&&!fN(i)?i:e.get(i):t}function UQ(i,e,A,t,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=XI(e);return i.children.forEach(a=>{OnA(a,o[a.value.outlet],A,t.concat([a.value]),n),delete o[a.value.outlet]}),Object.entries(o).forEach(([a,r])=>OQ(r,A.getContext(a),n)),n}function OnA(i,e,A,t,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=i.value,a=e?e.value:null,r=A?A.getContext(i.value.outlet):null;if(a&&o.routeConfig===a.routeConfig){let s=JnA(a,o,o.routeConfig.runGuardsAndResolvers);s?n.canActivateChecks.push(new Of(t)):(o.data=a.data,o._resolvedData=a._resolvedData),o.component?UQ(i,e,r?r.children:null,t,n):UQ(i,e,A,t,n),s&&r&&r.outlet&&r.outlet.isActivated&&n.canDeactivateChecks.push(new eB(r.outlet.component,a))}else a&&OQ(e,r,n),n.canActivateChecks.push(new Of(t)),o.component?UQ(i,null,r?r.children:null,t,n):UQ(i,null,A,t,n);return n}function JnA(i,e,A){if(typeof A=="function")return vr(e._environmentInjector,()=>A(i,e));switch(A){case"pathParamsChange":return!Z1(i.url,e.url);case"pathParamsOrQueryParamsChange":return!Z1(i.url,e.url)||!zc(i.queryParams,e.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!Lb(i,e)||!zc(i.queryParams,e.queryParams);default:return!Lb(i,e)}}function OQ(i,e,A){let t=XI(i),n=i.value;Object.entries(t).forEach(([o,a])=>{n.component?e?OQ(a,e.children.getContext(o),A):OQ(a,null,A):OQ(a,e,A)}),n.component?e&&e.outlet&&e.outlet.isActivated?A.canDeactivateChecks.push(new eB(e.outlet.component,n)):A.canDeactivateChecks.push(new eB(null,n)):A.canDeactivateChecks.push(new eB(null,n))}function ZQ(i){return typeof i=="function"}function YnA(i){return typeof i=="boolean"}function HnA(i){return i&&ZQ(i.canLoad)}function znA(i){return i&&ZQ(i.canActivate)}function PnA(i){return i&&ZQ(i.canActivateChild)}function jnA(i){return i&&ZQ(i.canDeactivate)}function VnA(i){return i&&ZQ(i.canMatch)}function oU(i){return i instanceof hN||i?.name==="EmptyError"}var ff=Symbol("INITIAL_VALUE");function lB(){return Mi(i=>Dr(i.map(e=>e.pipe(Ro(1),Yn(ff)))).pipe(Se(e=>{for(let A of e)if(A!==!0){if(A===ff)return ff;if(A===!1||qnA(A))return A}return!0}),Bt(e=>e!==ff),Ro(1)))}function qnA(i){return tB(i)||i instanceof sB}function aU(i){return i.aborted?oe(void 0).pipe(Ro(1)):new Fi(e=>{let A=()=>{e.next(),e.complete()};return i.addEventListener("abort",A),()=>i.removeEventListener("abort",A)})}function rU(i){return yt(aU(i))}function WnA(i){return xc(e=>{let{targetSnapshot:A,currentSnapshot:t,guards:{canActivateChecks:n,canDeactivateChecks:o}}=e;return o.length===0&&n.length===0?oe($A(P({},e),{guardsResult:!0})):ZnA(o,A,t).pipe(xc(a=>a&&YnA(a)?XnA(A,n,i):oe(a)),Se(a=>$A(P({},e),{guardsResult:a})))})}function ZnA(i,e,A){return Yr(i).pipe(xc(t=>ioA(t.component,t.route,A,e)),oo(t=>t!==!0,!0))}function XnA(i,e,A){return Yr(e).pipe(VE(t=>Xp(AoA(t.route.parent,A),$nA(t.route,A),toA(i,t.path),eoA(i,t.route))),oo(t=>t!==!0,!0))}function $nA(i,e){return i!==null&&e&&e(new Lf(i)),oe(!0)}function AoA(i,e){return i!==null&&e&&e(new Nf(i)),oe(!0)}function eoA(i,e){let A=e.routeConfig?e.routeConfig.canActivate:null;if(!A||A.length===0)return oe(!0);let t=A.map(n=>Rc(()=>{let o=e._environmentInjector,a=gB(n,o),r=znA(a)?a.canActivate(e,i):vr(o,()=>a(e,i));return Ad(r).pipe(oo())}));return oe(t).pipe(lB())}function toA(i,e){let A=e[e.length-1],n=e.slice(0,e.length-1).reverse().map(o=>TnA(o)).filter(o=>o!==null).map(o=>Rc(()=>{let a=o.guards.map(r=>{let s=o.node._environmentInjector,l=gB(r,s),g=PnA(l)?l.canActivateChild(A,i):vr(s,()=>l(A,i));return Ad(g).pipe(oo())});return oe(a).pipe(lB())}));return oe(n).pipe(lB())}function ioA(i,e,A,t){let n=e&&e.routeConfig?e.routeConfig.canDeactivate:null;if(!n||n.length===0)return oe(!0);let o=n.map(a=>{let r=e._environmentInjector,s=gB(a,r),l=jnA(s)?s.canDeactivate(i,e,A,t):vr(r,()=>s(i,e,A,t));return Ad(l).pipe(oo())});return oe(o).pipe(lB())}function noA(i,e,A,t,n){let o=e.canLoad;if(o===void 0||o.length===0)return oe(!0);let a=o.map(r=>{let s=gB(r,i),l=HnA(s)?s.canLoad(e,A):vr(i,()=>s(e,A)),g=Ad(l);return n?g.pipe(rU(n)):g});return oe(a).pipe(lB(),sU(t))}function sU(i){return dN(mi(e=>{if(typeof e!="boolean")throw Tf(i,e)}),Se(e=>e===!0))}function ooA(i,e,A,t,n,o){let a=e.canMatch;if(!a||a.length===0)return oe(!0);let r=a.map(s=>{let l=gB(s,i),g=VnA(l)?l.canMatch(e,A,n):vr(i,()=>l(e,A,n));return Ad(g).pipe(rU(o))});return oe(r).pipe(lB(),sU(t))}var H0=class i extends Error{segmentGroup;constructor(e){super(),this.segmentGroup=e||null,Object.setPrototypeOf(this,i.prototype)}},VQ=class i extends Error{urlTree;constructor(e){super(),this.urlTree=e,Object.setPrototypeOf(this,i.prototype)}};function aoA(i){throw new Nt(4e3,!1)}function roA(i){throw iU(!1,ds.GuardRejected)}var Ub=class{urlSerializer;urlTree;constructor(e,A){this.urlSerializer=e,this.urlTree=A}lineralizeSegments(e,A){return re(this,null,function*(){let t=[],n=A.root;for(;;){if(t=t.concat(n.segments),n.numberOfChildren===0)return t;if(n.numberOfChildren>1||!n.children[Yi])throw aoA(`${e.redirectTo}`);n=n.children[Yi]}})}applyRedirectCommands(e,A,t,n,o){return re(this,null,function*(){let a=yield soA(A,n,o);if(a instanceof Xl)throw new VQ(a);let r=this.applyRedirectCreateUrlTree(a,this.urlSerializer.parse(a),e,t);if(a[0]==="/")throw new VQ(r);return r})}applyRedirectCreateUrlTree(e,A,t,n){let o=this.createSegmentGroup(e,A.root,t,n);return new Xl(o,this.createQueryParams(A.queryParams,this.urlTree.queryParams),A.fragment)}createQueryParams(e,A){let t={};return Object.entries(e).forEach(([n,o])=>{if(typeof o=="string"&&o[0]===":"){let r=o.substring(1);t[n]=A[r]}else t[n]=o}),t}createSegmentGroup(e,A,t,n){let o=this.createSegments(e,A.segments,t,n),a={};return Object.entries(A.children).forEach(([r,s])=>{a[r]=this.createSegmentGroup(e,s,t,n)}),new yo(o,a)}createSegments(e,A,t,n){return A.map(o=>o.path[0]===":"?this.findPosParam(e,o,n):this.findOrReturn(o,t))}findPosParam(e,A,t){let n=t[A.path.substring(1)];if(!n)throw new Nt(4001,!1);return n}findOrReturn(e,A){let t=0;for(let n of A){if(n.path===e.path)return A.splice(t),n;t++}return e}};function soA(i,e,A){if(typeof i=="string")return Promise.resolve(i);let t=i;return Df(Ad(vr(A,()=>t(e))))}function loA(i,e){return i.providers&&!i._injector&&(i._injector=a3(i.providers,e,`Route: ${i.path}`)),i._injector??e}function Pc(i){return i.outlet||Yi}function goA(i,e){let A=i.filter(t=>Pc(t)===e);return A.push(...i.filter(t=>Pc(t)!==e)),A}var Tb={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function lU(i){return{routeConfig:i.routeConfig,url:i.url,params:i.params,queryParams:i.queryParams,fragment:i.fragment,data:i.data,outlet:i.outlet,title:i.title,paramMap:i.paramMap,queryParamMap:i.queryParamMap}}function coA(i,e,A,t,n,o,a){let r=gU(i,e,A);if(!r.matched)return oe(r);let s=lU(o(r));return t=loA(e,t),ooA(t,e,A,n,s,a).pipe(Se(l=>l===!0?r:P({},Tb)))}function gU(i,e,A){if(e.path==="")return e.pathMatch==="full"&&(i.hasChildren()||A.length>0)?P({},Tb):{matched:!0,consumedSegments:[],remainingSegments:A,parameters:{},positionalParamSegments:{}};let n=(e.matcher||NK)(A,i,e);if(!n)return P({},Tb);let o={};Object.entries(n.posParams??{}).forEach(([r,s])=>{o[r]=s.path});let a=n.consumed.length>0?P(P({},o),n.consumed[n.consumed.length-1].parameters):o;return{matched:!0,consumedSegments:n.consumed,remainingSegments:A.slice(n.consumed.length),parameters:a,positionalParamSegments:n.posParams??{}}}function xK(i,e,A,t){return A.length>0&&IoA(i,A,t)?{segmentGroup:new yo(e,doA(t,new yo(A,i.children))),slicedSegments:[]}:A.length===0&&BoA(i,A,t)?{segmentGroup:new yo(i.segments,CoA(i,A,t,i.children)),slicedSegments:A}:{segmentGroup:new yo(i.segments,i.children),slicedSegments:A}}function CoA(i,e,A,t){let n={};for(let o of A)if(Yf(i,e,o)&&!t[Pc(o)]){let a=new yo([],{});n[Pc(o)]=a}return P(P({},t),n)}function doA(i,e){let A={};A[Yi]=e;for(let t of i)if(t.path===""&&Pc(t)!==Yi){let n=new yo([],{});A[Pc(t)]=n}return A}function IoA(i,e,A){return A.some(t=>Yf(i,e,t)&&Pc(t)!==Yi)}function BoA(i,e,A){return A.some(t=>Yf(i,e,t))}function Yf(i,e,A){return(i.hasChildren()||e.length>0)&&A.pathMatch==="full"?!1:A.path===""}function hoA(i,e,A){return e.length===0&&!i.children[A]}var Ob=class{};function EoA(i,e,A,t,n,o,a="emptyOnly",r){return re(this,null,function*(){return new Jb(i,e,A,t,n,a,o,r).recognize()})}var QoA=31,Jb=class{injector;configLoader;rootComponentType;config;urlTree;paramsInheritanceStrategy;urlSerializer;abortSignal;applyRedirects;absoluteRedirectCount=0;allowRedirects=!0;constructor(e,A,t,n,o,a,r,s){this.injector=e,this.configLoader=A,this.rootComponentType=t,this.config=n,this.urlTree=o,this.paramsInheritanceStrategy=a,this.urlSerializer=r,this.abortSignal=s,this.applyRedirects=new Ub(this.urlSerializer,this.urlTree)}noMatchError(e){return new Nt(4002,`'${e.segmentGroup}'`)}recognize(){return re(this,null,function*(){let e=xK(this.urlTree.root,[],[],this.config).segmentGroup,{children:A,rootSnapshot:t}=yield this.match(e),n=new Ml(t,A),o=new PQ("",n),a=PK(t,[],this.urlTree.queryParams,this.urlTree.fragment);return a.queryParams=this.urlTree.queryParams,o.url=this.urlSerializer.serialize(a),{state:o,tree:a}})}match(e){return re(this,null,function*(){let A=new rB([],Object.freeze({}),Object.freeze(P({},this.urlTree.queryParams)),this.urlTree.fragment,Object.freeze({}),Yi,this.rootComponentType,null,{},this.injector);try{return{children:yield this.processSegmentGroup(this.injector,this.config,e,Yi,A),rootSnapshot:A}}catch(t){if(t instanceof VQ)return this.urlTree=t.urlTree,this.match(t.urlTree.root);throw t instanceof H0?this.noMatchError(t):t}})}processSegmentGroup(e,A,t,n,o){return re(this,null,function*(){if(t.segments.length===0&&t.hasChildren())return this.processChildren(e,A,t,o);let a=yield this.processSegment(e,A,t,t.segments,n,!0,o);return a instanceof Ml?[a]:[]})}processChildren(e,A,t,n){return re(this,null,function*(){let o=[];for(let s of Object.keys(t.children))s==="primary"?o.unshift(s):o.push(s);let a=[];for(let s of o){let l=t.children[s],g=goA(A,s),C=yield this.processSegmentGroup(e,g,l,s,n);a.push(...C)}let r=cU(a);return uoA(r),r})}processSegment(e,A,t,n,o,a,r){return re(this,null,function*(){for(let s of A)try{return yield this.processSegmentAgainstRoute(s._injector??e,A,s,t,n,o,a,r)}catch(l){if(l instanceof H0||oU(l))continue;throw l}if(hoA(t,n,o))return new Ob;throw new H0(t)})}processSegmentAgainstRoute(e,A,t,n,o,a,r,s){return re(this,null,function*(){if(Pc(t)!==a&&(a===Yi||!Yf(n,o,t)))throw new H0(n);if(t.redirectTo===void 0)return this.matchSegmentAgainstRoute(e,n,t,o,a,s);if(this.allowRedirects&&r)return this.expandSegmentAgainstRouteUsingRedirect(e,n,A,t,o,a,s);throw new H0(n)})}expandSegmentAgainstRouteUsingRedirect(e,A,t,n,o,a,r){return re(this,null,function*(){let{matched:s,parameters:l,consumedSegments:g,positionalParamSegments:C,remainingSegments:d}=gU(A,n,o);if(!s)throw new H0(A);typeof n.redirectTo=="string"&&n.redirectTo[0]==="/"&&(this.absoluteRedirectCount++,this.absoluteRedirectCount>QoA&&(this.allowRedirects=!1));let B=this.createSnapshot(e,n,o,l,r);if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let u=yield this.applyRedirects.applyRedirectCommands(g,n.redirectTo,C,lU(B),e),E=yield this.applyRedirects.lineralizeSegments(n,u);return this.processSegment(e,t,A,E.concat(d),a,!1,r)})}createSnapshot(e,A,t,n,o){let a=new rB(t,n,Object.freeze(P({},this.urlTree.queryParams)),this.urlTree.fragment,foA(A),Pc(A),A.component??A._loadedComponent??null,A,moA(A),e),r=Yb(a,o,this.paramsInheritanceStrategy);return a.params=Object.freeze(r.params),a.data=Object.freeze(r.data),a}matchSegmentAgainstRoute(e,A,t,n,o,a){return re(this,null,function*(){if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let r=S=>this.createSnapshot(e,t,S.consumedSegments,S.parameters,a),s=yield Df(coA(A,t,n,e,this.urlSerializer,r,this.abortSignal));if(t.path==="**"&&(A.children={}),!s?.matched)throw new H0(A);e=t._injector??e;let{routes:l}=yield this.getChildConfig(e,t,n),g=t._loadedInjector??e,{parameters:C,consumedSegments:d,remainingSegments:B}=s,u=this.createSnapshot(e,t,d,C,a),{segmentGroup:E,slicedSegments:f}=xK(A,d,B,l);if(f.length===0&&E.hasChildren()){let S=yield this.processChildren(g,l,E,u);return new Ml(u,S)}if(l.length===0&&f.length===0)return new Ml(u,[]);let m=Pc(t)===o,v=yield this.processSegment(g,l,E,f,m?Yi:o,!0,u);return new Ml(u,v instanceof Ml?[v]:[])})}getChildConfig(e,A,t){return re(this,null,function*(){if(A.children)return{routes:A.children,injector:e};if(A.loadChildren){if(A._loadedRoutes!==void 0){let o=A._loadedNgModuleFactory;return o&&!A._loadedInjector&&(A._loadedInjector=o.create(e).injector),{routes:A._loadedRoutes,injector:A._loadedInjector}}if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);if(yield Df(noA(e,A,t,this.urlSerializer,this.abortSignal))){let o=yield this.configLoader.loadChildren(e,A);return A._loadedRoutes=o.routes,A._loadedInjector=o.injector,A._loadedNgModuleFactory=o.factory,o}throw roA(A)}return{routes:[],injector:e}})}};function uoA(i){i.sort((e,A)=>e.value.outlet===Yi?-1:A.value.outlet===Yi?1:e.value.outlet.localeCompare(A.value.outlet))}function poA(i){let e=i.value.routeConfig;return e&&e.path===""}function cU(i){let e=[],A=new Set;for(let t of i){if(!poA(t)){e.push(t);continue}let n=e.find(o=>t.value.routeConfig===o.value.routeConfig);n!==void 0?(n.children.push(...t.children),A.add(n)):e.push(t)}for(let t of A){let n=cU(t.children);e.push(new Ml(t.value,n))}return e.filter(t=>!A.has(t))}function foA(i){return i.data||{}}function moA(i){return i.resolve||{}}function woA(i,e,A,t,n,o,a){return xc(r=>re(null,null,function*(){let{state:s,tree:l}=yield EoA(i,e,A,t,r.extractedUrl,n,o,a);return $A(P({},r),{targetSnapshot:s,urlAfterRedirects:l})}))}function yoA(i){return xc(e=>{let{targetSnapshot:A,guards:{canActivateChecks:t}}=e;if(!t.length)return oe(e);let n=new Set(t.map(r=>r.route)),o=new Set;for(let r of n)if(!o.has(r))for(let s of CU(r))o.add(s);let a=0;return Yr(o).pipe(VE(r=>n.has(r)?DoA(r,A,i):(r.data=Yb(r,r.parent,i).resolve,oe(void 0))),mi(()=>a++),FD(1),xc(r=>a===o.size?oe(e):Br))})}function CU(i){let e=i.children.map(A=>CU(A)).flat();return[i,...e]}function DoA(i,e,A){let t=i.routeConfig,n=i._resolve;return t?.title!==void 0&&!AU(t)&&(n[qQ]=t.title),Rc(()=>(i.data=Yb(i,i.parent,A).resolve,voA(n,i,e).pipe(Se(o=>(i._resolvedData=o,i.data=P(P({},i.data),o),null)))))}function voA(i,e,A){let t=Sb(i);if(t.length===0)return oe({});let n={};return Yr(t).pipe(xc(o=>boA(i[o],e,A).pipe(oo(),mi(a=>{if(a instanceof sB)throw Tf(new z0,a);n[o]=a}))),FD(1),Se(()=>n),aa(o=>oU(o)?Br:Wp(o)))}function boA(i,e,A){let t=e._environmentInjector,n=gB(i,t),o=n.resolve?n.resolve(e,A):vr(t,()=>n(e,A));return Ad(o)}function RK(i){return Mi(e=>{let A=i(e);return A?Yr(A).pipe(Se(()=>e)):oe(e)})}var qb=(()=>{class i{buildTitle(A){let t,n=A.root;for(;n!==void 0;)t=this.getResolvedTitleForRoute(n)??t,n=n.children.find(o=>o.outlet===Yi);return t}getResolvedTitleForRoute(A){return A.data[qQ]}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:()=>w(dU),providedIn:"root"})}return i})(),dU=(()=>{class i extends qb{title;constructor(A){super(),this.title=A}updateTitle(A){let t=this.buildTitle(A);t!==void 0&&this.title.setTitle(t)}static \u0275fac=function(t){return new(t||i)(Wo(qN))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),id=new MA("",{factory:()=>({})}),cB=new MA(""),Hf=(()=>{class i{componentLoaders=new WeakMap;childrenLoaders=new WeakMap;onLoadStartListener;onLoadEndListener;compiler=w(xN);loadComponent(A,t){return re(this,null,function*(){if(this.componentLoaders.get(t))return this.componentLoaders.get(t);if(t._loadedComponent)return Promise.resolve(t._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(t);let n=re(this,null,function*(){try{let o=yield LK(vr(A,()=>t.loadComponent())),a=yield hU(BU(o));return this.onLoadEndListener&&this.onLoadEndListener(t),t._loadedComponent=a,a}finally{this.componentLoaders.delete(t)}});return this.componentLoaders.set(t,n),n})}loadChildren(A,t){if(this.childrenLoaders.get(t))return this.childrenLoaders.get(t);if(t._loadedRoutes)return Promise.resolve({routes:t._loadedRoutes,injector:t._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(t);let n=re(this,null,function*(){try{let o=yield IU(t,this.compiler,A,this.onLoadEndListener);return t._loadedRoutes=o.routes,t._loadedInjector=o.injector,t._loadedNgModuleFactory=o.factory,o}finally{this.childrenLoaders.delete(t)}});return this.childrenLoaders.set(t,n),n}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function IU(i,e,A,t){return re(this,null,function*(){let n=yield LK(vr(A,()=>i.loadChildren())),o=yield hU(BU(n)),a;o instanceof bN||Array.isArray(o)?a=o:a=yield e.compileModuleAsync(o),t&&t(i);let r,s,l=!1,g;return Array.isArray(a)?(s=a,l=!0):(r=a.create(A).injector,g=a,s=r.get(cB,[],{optional:!0,self:!0}).flat()),{routes:s.map(Vb),injector:r,factory:g}})}function MoA(i){return i&&typeof i=="object"&&"default"in i}function BU(i){return MoA(i)?i.default:i}function hU(i){return re(this,null,function*(){return i})}var zf=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:()=>w(SoA),providedIn:"root"})}return i})(),SoA=(()=>{class i{shouldProcessUrl(A){return!0}extract(A){return A}merge(A,t){return A}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),Wb=new MA(""),Zb=new MA("");function EU(i,e,A){let t=i.get(Zb),n=i.get(ci);if(!n.startViewTransition||t.skipNextTransition)return t.skipNextTransition=!1,new Promise(l=>setTimeout(l));let o,a=new Promise(l=>{o=l}),r=n.startViewTransition(()=>(o(),koA(i)));r.updateCallbackDone.catch(l=>{}),r.ready.catch(l=>{}),r.finished.catch(l=>{});let{onViewTransitionCreated:s}=t;return s&&vr(i,()=>s({transition:r,from:e,to:A})),a}function koA(i){return new Promise(e=>{ao({read:()=>setTimeout(e)},{injector:i})})}var _oA=()=>{},Xb=new MA(""),Pf=(()=>{class i{currentNavigation=mA(null,{equal:()=>!1});currentTransition=null;lastSuccessfulNavigation=mA(null);events=new ne;transitionAbortWithErrorSubject=new ne;configLoader=w(Hf);environmentInjector=w(Hr);destroyRef=w(Er);urlSerializer=w(ed);rootContexts=w(td);location=w(Gc);inputBindingEnabled=w(WQ,{optional:!0})!==null;titleStrategy=w(qb);options=w(id,{optional:!0})||{};paramsInheritanceStrategy=this.options.paramsInheritanceStrategy||"emptyOnly";urlHandlingStrategy=w(zf);createViewTransition=w(Wb,{optional:!0});navigationErrorHandler=w(Xb,{optional:!0});navigationId=0;get hasRequestedNavigation(){return this.navigationId!==0}transitions;afterPreactivation=()=>oe(void 0);rootComponentType=null;destroyed=!1;constructor(){let A=n=>this.events.next(new xf(n)),t=n=>this.events.next(new Rf(n));this.configLoader.onLoadEndListener=t,this.configLoader.onLoadStartListener=A,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}complete(){this.transitions?.complete()}handleNavigationRequest(A){let t=++this.navigationId;wa(()=>{this.transitions?.next($A(P({},A),{extractedUrl:this.urlHandlingStrategy.extract(A.rawUrl),targetSnapshot:null,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null,id:t,routesRecognizeHandler:{},beforeActivateHandler:{}}))})}setupNavigations(A){return this.transitions=new gi(null),this.transitions.pipe(Bt(t=>t!==null),Mi(t=>{let n=!1,o=new AbortController,a=()=>!n&&this.currentTransition?.id===t.id;return oe(t).pipe(Mi(r=>{if(this.navigationId>t.id)return this.cancelNavigationTransition(t,"",ds.SupersededByNewNavigation),Br;this.currentTransition=t;let s=this.lastSuccessfulNavigation();this.currentNavigation.set({id:r.id,initialUrl:r.rawUrl,extractedUrl:r.extractedUrl,targetBrowserUrl:typeof r.extras.browserUrl=="string"?this.urlSerializer.parse(r.extras.browserUrl):r.extras.browserUrl,trigger:r.source,extras:r.extras,previousNavigation:s?$A(P({},s),{previousNavigation:null}):null,abort:()=>o.abort(),routesRecognizeHandler:r.routesRecognizeHandler,beforeActivateHandler:r.beforeActivateHandler});let l=!A.navigated||this.isUpdatingInternalState()||this.isUpdatedBrowserUrl(),g=r.extras.onSameUrlNavigation??A.onSameUrlNavigation;if(!l&&g!=="reload")return this.events.next(new jc(r.id,this.urlSerializer.serialize(r.rawUrl),"",iB.IgnoredSameUrlNavigation)),r.resolve(!1),Br;if(this.urlHandlingStrategy.shouldProcessUrl(r.rawUrl))return oe(r).pipe(Mi(C=>(this.events.next(new i2(C.id,this.urlSerializer.serialize(C.extractedUrl),C.source,C.restoredState)),C.id!==this.navigationId?Br:Promise.resolve(C))),woA(this.environmentInjector,this.configLoader,this.rootComponentType,A.config,this.urlSerializer,this.paramsInheritanceStrategy,o.signal),mi(C=>{t.targetSnapshot=C.targetSnapshot,t.urlAfterRedirects=C.urlAfterRedirects,this.currentNavigation.update(d=>(d.finalUrl=C.urlAfterRedirects,d)),this.events.next(new HQ)}),Mi(C=>Yr(t.routesRecognizeHandler.deferredHandle??oe(void 0)).pipe(Se(()=>C))),mi(()=>{let C=new YQ(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(C)}));if(l&&this.urlHandlingStrategy.shouldProcessUrl(r.currentRawUrl)){let{id:C,extractedUrl:d,source:B,restoredState:u,extras:E}=r,f=new i2(C,this.urlSerializer.serialize(d),B,u);this.events.next(f);let m=XK(this.rootComponentType,this.environmentInjector).snapshot;return this.currentTransition=t=$A(P({},r),{targetSnapshot:m,urlAfterRedirects:d,extras:$A(P({},E),{skipLocationChange:!1,replaceUrl:!1})}),this.currentNavigation.update(v=>(v.finalUrl=d,v)),oe(t)}else return this.events.next(new jc(r.id,this.urlSerializer.serialize(r.extractedUrl),"",iB.IgnoredByUrlHandlingStrategy)),r.resolve(!1),Br}),Se(r=>{let s=new Mf(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);return this.events.next(s),this.currentTransition=t=$A(P({},r),{guards:UnA(r.targetSnapshot,r.currentSnapshot,this.rootContexts)}),t}),WnA(r=>this.events.next(r)),Mi(r=>{if(t.guardsResult=r.guardsResult,r.guardsResult&&typeof r.guardsResult!="boolean")throw Tf(this.urlSerializer,r.guardsResult);let s=new Sf(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot,!!r.guardsResult);if(this.events.next(s),!a())return Br;if(!r.guardsResult)return this.cancelNavigationTransition(r,"",ds.GuardRejected),Br;if(r.guards.canActivateChecks.length===0)return oe(r);let l=new kf(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);if(this.events.next(l),!a())return Br;let g=!1;return oe(r).pipe(yoA(this.paramsInheritanceStrategy),mi({next:()=>{g=!0;let C=new _f(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(C)},complete:()=>{g||this.cancelNavigationTransition(r,"",ds.NoDataFromResolver)}}))}),RK(r=>{let s=g=>{let C=[];if(g.routeConfig?._loadedComponent)g.component=g.routeConfig?._loadedComponent;else if(g.routeConfig?.loadComponent){let d=g._environmentInjector;C.push(this.configLoader.loadComponent(d,g.routeConfig).then(B=>{g.component=B}))}for(let d of g.children)C.push(...s(d));return C},l=s(r.targetSnapshot.root);return l.length===0?oe(r):Yr(Promise.all(l).then(()=>r))}),RK(()=>this.afterPreactivation()),Mi(()=>{let{currentSnapshot:r,targetSnapshot:s}=t,l=this.createViewTransition?.(this.environmentInjector,r.root,s.root);return l?Yr(l).pipe(Se(()=>t)):oe(t)}),Ro(1),Mi(r=>{let s=FnA(A.routeReuseStrategy,r.targetSnapshot,r.currentRouterState);this.currentTransition=t=r=$A(P({},r),{targetRouterState:s}),this.currentNavigation.update(g=>(g.targetRouterState=s,g)),this.events.next(new oB);let l=t.beforeActivateHandler.deferredHandle;return l?Yr(l.then(()=>r)):oe(r)}),mi(r=>{new Kb(A.routeReuseStrategy,t.targetRouterState,t.currentRouterState,s=>this.events.next(s),this.inputBindingEnabled).activate(this.rootContexts),a()&&(n=!0,this.currentNavigation.update(s=>(s.abort=_oA,s)),this.lastSuccessfulNavigation.set(wa(this.currentNavigation)),this.events.next(new Jg(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects))),this.titleStrategy?.updateTitle(r.targetRouterState.snapshot),r.resolve(!0))}),yt(aU(o.signal).pipe(Bt(()=>!n&&!t.targetRouterState),mi(()=>{this.cancelNavigationTransition(t,o.signal.reason+"",ds.Aborted)}))),mi({complete:()=>{n=!0}}),yt(this.transitionAbortWithErrorSubject.pipe(mi(r=>{throw r}))),A3(()=>{o.abort(),n||this.cancelNavigationTransition(t,"",ds.SupersededByNewNavigation),this.currentTransition?.id===t.id&&(this.currentNavigation.set(null),this.currentTransition=null)}),aa(r=>{if(n=!0,this.destroyed)return t.resolve(!1),Br;if(nU(r))this.events.next(new Zl(t.id,this.urlSerializer.serialize(t.extractedUrl),r.message,r.cancellationCode)),KnA(r)?this.events.next(new aB(r.url,r.navigationBehaviorOptions)):t.resolve(!1);else{let s=new $1(t.id,this.urlSerializer.serialize(t.extractedUrl),r,t.targetSnapshot??void 0);try{let l=vr(this.environmentInjector,()=>this.navigationErrorHandler?.(s));if(l instanceof sB){let{message:g,cancellationCode:C}=Tf(this.urlSerializer,l);this.events.next(new Zl(t.id,this.urlSerializer.serialize(t.extractedUrl),g,C)),this.events.next(new aB(l.redirectTo,l.navigationBehaviorOptions))}else throw this.events.next(s),r}catch(l){this.options.resolveNavigationPromiseOnError?t.resolve(!1):t.reject(l)}}return Br}))}))}cancelNavigationTransition(A,t,n){let o=new Zl(A.id,this.urlSerializer.serialize(A.extractedUrl),t,n);this.events.next(o),A.resolve(!1)}isUpdatingInternalState(){return this.currentTransition?.extractedUrl.toString()!==this.currentTransition?.currentUrlTree.toString()}isUpdatedBrowserUrl(){let A=this.urlHandlingStrategy.extract(this.urlSerializer.parse(this.location.path(!0))),t=wa(this.currentNavigation),n=t?.targetBrowserUrl??t?.extractedUrl;return A.toString()!==n?.toString()&&!t?.extras.skipLocationChange}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function xoA(i){return i!==AB}var QU=new MA("");var uU=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:()=>w(RoA),providedIn:"root"})}return i})(),Jf=class{shouldDetach(e){return!1}store(e,A){}shouldAttach(e){return!1}retrieve(e){return null}shouldReuseRoute(e,A){return e.routeConfig===A.routeConfig}shouldDestroyInjector(e){return!0}},RoA=(()=>{class i extends Jf{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),$b=(()=>{class i{urlSerializer=w(ed);options=w(id,{optional:!0})||{};canceledNavigationResolution=this.options.canceledNavigationResolution||"replace";location=w(Gc);urlHandlingStrategy=w(zf);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";currentUrlTree=new Xl;getCurrentUrlTree(){return this.currentUrlTree}rawUrlTree=this.currentUrlTree;getRawUrlTree(){return this.rawUrlTree}createBrowserPath({finalUrl:A,initialUrl:t,targetBrowserUrl:n}){let o=A!==void 0?this.urlHandlingStrategy.merge(A,t):t,a=n??o;return a instanceof Xl?this.urlSerializer.serialize(a):a}commitTransition({targetRouterState:A,finalUrl:t,initialUrl:n}){t&&A?(this.currentUrlTree=t,this.rawUrlTree=this.urlHandlingStrategy.merge(t,n),this.routerState=A):this.rawUrlTree=n}routerState=XK(null,w(Hr));getRouterState(){return this.routerState}_stateMemento=this.createStateMemento();get stateMemento(){return this._stateMemento}updateStateMemento(){this._stateMemento=this.createStateMemento()}createStateMemento(){return{rawUrlTree:this.rawUrlTree,currentUrlTree:this.currentUrlTree,routerState:this.routerState}}restoredState(){return this.location.getState()}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:()=>w(NoA),providedIn:"root"})}return i})(),NoA=(()=>{class i extends $b{currentPageId=0;lastSuccessfulId=-1;get browserPageId(){return this.canceledNavigationResolution!=="computed"?this.currentPageId:this.restoredState()?.\u0275routerPageId??this.currentPageId}registerNonRouterCurrentEntryChangeListener(A){return this.location.subscribe(t=>{t.type==="popstate"&&setTimeout(()=>{A(t.url,t.state,"popstate",{replaceUrl:!0})})})}handleRouterEvent(A,t){A instanceof i2?this.updateStateMemento():A instanceof jc?this.commitTransition(t):A instanceof YQ?this.urlUpdateStrategy==="eager"&&(t.extras.skipLocationChange||this.setBrowserUrl(this.createBrowserPath(t),t)):A instanceof oB?(this.commitTransition(t),this.urlUpdateStrategy==="deferred"&&!t.extras.skipLocationChange&&this.setBrowserUrl(this.createBrowserPath(t),t)):A instanceof Zl&&!ZK(A)?this.restoreHistory(t):A instanceof $1?this.restoreHistory(t,!0):A instanceof Jg&&(this.lastSuccessfulId=A.id,this.currentPageId=this.browserPageId)}setBrowserUrl(A,{extras:t,id:n}){let{replaceUrl:o,state:a}=t;if(this.location.isCurrentPathEqualTo(A)||o){let r=this.browserPageId,s=P(P({},a),this.generateNgRouterState(n,r));this.location.replaceState(A,"",s)}else{let r=P(P({},a),this.generateNgRouterState(n,this.browserPageId+1));this.location.go(A,"",r)}}restoreHistory(A,t=!1){if(this.canceledNavigationResolution==="computed"){let n=this.browserPageId,o=this.currentPageId-n;o!==0?this.location.historyGo(o):this.getCurrentUrlTree()===A.finalUrl&&o===0&&(this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}else this.canceledNavigationResolution==="replace"&&(t&&this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}resetInternalState({finalUrl:A}){this.routerState=this.stateMemento.routerState,this.currentUrlTree=this.stateMemento.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,A??this.rawUrlTree)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.getRawUrlTree()),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}generateNgRouterState(A,t){return this.canceledNavigationResolution==="computed"?{navigationId:A,\u0275routerPageId:t}:{navigationId:A}}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function jf(i,e){i.events.pipe(Bt(A=>A instanceof Jg||A instanceof Zl||A instanceof $1||A instanceof jc),Se(A=>A instanceof Jg||A instanceof jc?0:(A instanceof Zl?A.code===ds.Redirect||A.code===ds.SupersededByNewNavigation:!1)?2:1),Bt(A=>A!==2),Ro(1)).subscribe(()=>{e()})}var Is=(()=>{class i{get currentUrlTree(){return this.stateManager.getCurrentUrlTree()}get rawUrlTree(){return this.stateManager.getRawUrlTree()}disposed=!1;nonRouterCurrentEntryChangeSubscription;console=w(MN);stateManager=w($b);options=w(id,{optional:!0})||{};pendingTasks=w(yN);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";navigationTransitions=w(Pf);urlSerializer=w(ed);location=w(Gc);urlHandlingStrategy=w(zf);injector=w(Hr);_events=new ne;get events(){return this._events}get routerState(){return this.stateManager.getRouterState()}navigated=!1;routeReuseStrategy=w(uU);injectorCleanup=w(QU,{optional:!0});onSameUrlNavigation=this.options.onSameUrlNavigation||"ignore";config=w(cB,{optional:!0})?.flat()??[];componentInputBindingEnabled=!!w(WQ,{optional:!0});currentNavigation=this.navigationTransitions.currentNavigation.asReadonly();constructor(){this.resetConfig(this.config),this.navigationTransitions.setupNavigations(this).subscribe({error:A=>{}}),this.subscribeToNavigationEvents()}eventsSubscription=new Oo;subscribeToNavigationEvents(){let A=this.navigationTransitions.events.subscribe(t=>{try{let n=this.navigationTransitions.currentTransition,o=wa(this.navigationTransitions.currentNavigation);if(n!==null&&o!==null){if(this.stateManager.handleRouterEvent(t,o),t instanceof Zl&&t.code!==ds.Redirect&&t.code!==ds.SupersededByNewNavigation)this.navigated=!0;else if(t instanceof Jg)this.navigated=!0,this.injectorCleanup?.(this.routeReuseStrategy,this.routerState,this.config);else if(t instanceof aB){let a=t.navigationBehaviorOptions,r=this.urlHandlingStrategy.merge(t.url,n.currentRawUrl),s=P({scroll:n.extras.scroll,browserUrl:n.extras.browserUrl,info:n.extras.info,skipLocationChange:n.extras.skipLocationChange,replaceUrl:n.extras.replaceUrl||this.urlUpdateStrategy==="eager"||xoA(n.source)},a);this.scheduleNavigation(r,AB,null,s,{resolve:n.resolve,reject:n.reject,promise:n.promise})}}RnA(t)&&this._events.next(t)}catch(n){this.navigationTransitions.transitionAbortWithErrorSubject.next(n)}});this.eventsSubscription.add(A)}resetRootComponentType(A){this.routerState.root.component=A,this.navigationTransitions.rootComponentType=A}initialNavigation(){this.setUpLocationChangeListener(),this.navigationTransitions.hasRequestedNavigation||this.navigateToSyncWithBrowser(this.location.path(!0),AB,this.stateManager.restoredState(),{replaceUrl:!0})}setUpLocationChangeListener(){this.nonRouterCurrentEntryChangeSubscription??=this.stateManager.registerNonRouterCurrentEntryChangeListener((A,t,n,o)=>{this.navigateToSyncWithBrowser(A,n,t,o)})}navigateToSyncWithBrowser(A,t,n,o){let a=n?.navigationId?n:null;if(n){let s=P({},n);delete s.navigationId,delete s.\u0275routerPageId,Object.keys(s).length!==0&&(o.state=s)}let r=this.parseUrl(A);this.scheduleNavigation(r,t,a,o).catch(s=>{this.disposed||this.injector.get(LD)(s)})}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return wa(this.navigationTransitions.currentNavigation)}get lastSuccessfulNavigation(){return this.navigationTransitions.lastSuccessfulNavigation}resetConfig(A){this.config=A.map(Vb),this.navigated=!1}ngOnDestroy(){this.dispose()}dispose(){this._events.unsubscribe(),this.navigationTransitions.complete(),this.nonRouterCurrentEntryChangeSubscription?.unsubscribe(),this.nonRouterCurrentEntryChangeSubscription=void 0,this.disposed=!0,this.eventsSubscription.unsubscribe()}createUrlTree(A,t={}){let{relativeTo:n,queryParams:o,fragment:a,queryParamsHandling:r,preserveFragment:s}=t,l=s?this.currentUrlTree.fragment:a,g=null;switch(r??this.options.defaultQueryParamsHandling){case"merge":g=P(P({},this.currentUrlTree.queryParams),o);break;case"preserve":g=this.currentUrlTree.queryParams;break;default:g=o||null}g!==null&&(g=this.removeEmptyProps(g));let C;try{let d=n?n.snapshot:this.routerState.snapshot.root;C=jK(d)}catch(d){(typeof A[0]!="string"||A[0][0]!=="/")&&(A=[]),C=this.currentUrlTree.root}return VK(C,A,g,l??null,this.urlSerializer)}navigateByUrl(A,t={skipLocationChange:!1}){let n=tB(A)?A:this.parseUrl(A),o=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(o,AB,null,t)}navigate(A,t={skipLocationChange:!1}){return FoA(A),this.navigateByUrl(this.createUrlTree(A,t),t)}serializeUrl(A){return this.urlSerializer.serialize(A)}parseUrl(A){try{return this.urlSerializer.parse(A)}catch(t){return this.console.warn(pN(4018,!1)),this.urlSerializer.parse("/")}}isActive(A,t){let n;if(t===!0?n=P({},KK):t===!1?n=P({},kb):n=P(P({},kb),t),tB(A))return bK(this.currentUrlTree,A,n);let o=this.parseUrl(A);return bK(this.currentUrlTree,o,n)}removeEmptyProps(A){return Object.entries(A).reduce((t,[n,o])=>(o!=null&&(t[n]=o),t),{})}scheduleNavigation(A,t,n,o,a){if(this.disposed)return Promise.resolve(!1);let r,s,l;a?(r=a.resolve,s=a.reject,l=a.promise):l=new Promise((C,d)=>{r=C,s=d});let g=this.pendingTasks.add();return jf(this,()=>{queueMicrotask(()=>this.pendingTasks.remove(g))}),this.navigationTransitions.handleNavigationRequest({source:t,restoredState:n,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,rawUrl:A,extras:o,resolve:r,reject:s,promise:l,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),l.catch(Promise.reject.bind(Promise))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function FoA(i){for(let e=0;e{class i{router;injector;preloadingStrategy;loader;subscription;constructor(A,t,n,o){this.router=A,this.injector=t,this.preloadingStrategy=n,this.loader=o}setUpPreloading(){this.subscription=this.router.events.pipe(Bt(A=>A instanceof Jg),VE(()=>this.preload())).subscribe(()=>{})}preload(){return this.processRoutes(this.injector,this.router.config)}ngOnDestroy(){this.subscription?.unsubscribe()}processRoutes(A,t){let n=[];for(let o of t){o.providers&&!o._injector&&(o._injector=a3(o.providers,A,""));let a=o._injector??A;o._loadedNgModuleFactory&&!o._loadedInjector&&(o._loadedInjector=o._loadedNgModuleFactory.create(a).injector);let r=o._loadedInjector??a;(o.loadChildren&&!o._loadedRoutes&&o.canLoad===void 0||o.loadComponent&&!o._loadedComponent)&&n.push(this.preloadConfig(a,o)),(o.children||o._loadedRoutes)&&n.push(this.processRoutes(r,o.children??o._loadedRoutes))}return Yr(n).pipe(ND())}preloadConfig(A,t){return this.preloadingStrategy.preload(t,()=>{if(A.destroyed)return oe(null);let n;t.loadChildren&&t.canLoad===void 0?n=Yr(this.loader.loadChildren(A,t)):n=oe(null);let o=n.pipe(xc(a=>a===null?oe(void 0):(t._loadedRoutes=a.routes,t._loadedInjector=a.injector,t._loadedNgModuleFactory=a.factory,this.processRoutes(a.injector??A,a.routes))));if(t.loadComponent&&!t._loadedComponent){let a=this.loader.loadComponent(A,t);return Yr([o,a]).pipe(ND())}else return o})}static \u0275fac=function(t){return new(t||i)(Wo(Is),Wo(Hr),Wo(XQ),Wo(Hf))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),fU=new MA(""),GoA=(()=>{class i{options;routerEventsSubscription;scrollEventsSubscription;lastId=0;lastSource=AB;restoredId=0;store={};urlSerializer=w(ed);zone=w(We);viewportScroller=w(JD);transitions=w(Pf);constructor(A){this.options=A,this.options.scrollPositionRestoration||="disabled",this.options.anchorScrolling||="disabled"}init(){this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.transitions.events.subscribe(A=>{A instanceof i2?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=A.navigationTrigger,this.restoredId=A.restoredState?A.restoredState.navigationId:0):A instanceof Jg?(this.lastId=A.id,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.urlAfterRedirects).fragment)):A instanceof jc&&A.code===iB.IgnoredSameUrlNavigation&&(this.lastSource=void 0,this.restoredId=0,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.url).fragment))})}consumeScrollEvents(){return this.transitions.events.subscribe(A=>{if(!(A instanceof nB)||A.scrollBehavior==="manual")return;let t={behavior:"instant"};A.position?this.options.scrollPositionRestoration==="top"?this.viewportScroller.scrollToPosition([0,0],t):this.options.scrollPositionRestoration==="enabled"&&this.viewportScroller.scrollToPosition(A.position,t):A.anchor&&this.options.anchorScrolling==="enabled"?this.viewportScroller.scrollToAnchor(A.anchor):this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.scrollToPosition([0,0])})}scheduleScrollEvent(A,t){let n=wa(this.transitions.currentNavigation)?.extras.scroll;this.zone.runOutsideAngular(()=>re(this,null,function*(){yield new Promise(o=>{setTimeout(o),typeof requestAnimationFrame<"u"&&requestAnimationFrame(o)}),this.zone.run(()=>{this.transitions.events.next(new nB(A,this.lastSource==="popstate"?this.store[this.restoredId]:null,t,n))})}))}ngOnDestroy(){this.routerEventsSubscription?.unsubscribe(),this.scrollEventsSubscription?.unsubscribe()}static \u0275fac=function(t){o3()};static \u0275prov=jA({token:i,factory:i.\u0275fac})}return i})();function KoA(){return w(Is).routerState.root}function $Q(i,e){return{\u0275kind:i,\u0275providers:e}}function UoA(){let i=w(St);return e=>{let A=i.get(F0);if(e!==A.components[0])return;let t=i.get(Is),n=i.get(mU);i.get(e7)===1&&t.initialNavigation(),i.get(DU,null,{optional:!0})?.setUpPreloading(),i.get(fU,null,{optional:!0})?.init(),t.resetRootComponentType(A.componentTypes[0]),n.closed||(n.next(),n.complete(),n.unsubscribe())}}var mU=new MA("",{factory:()=>new ne}),e7=new MA("",{factory:()=>1});function wU(){let i=[{provide:vN,useValue:!0},{provide:e7,useValue:0},UD(()=>{let e=w(St);return e.get(TN,Promise.resolve()).then(()=>new Promise(t=>{let n=e.get(Is),o=e.get(mU);jf(n,()=>{t(!0)}),e.get(Pf).afterPreactivation=()=>(t(!0),o.closed?oe(void 0):o),n.initialNavigation()}))})];return $Q(2,i)}function yU(){let i=[UD(()=>{w(Is).setUpLocationChangeListener()}),{provide:e7,useValue:2}];return $Q(3,i)}var DU=new MA("");function vU(i){return $Q(0,[{provide:DU,useExisting:pU},{provide:XQ,useExisting:i}])}function bU(){return $Q(8,[Pb,{provide:WQ,useExisting:Pb}])}function MU(i){n3("NgRouterViewTransitions");let e=[{provide:Wb,useValue:EU},{provide:Zb,useValue:P({skipNextTransition:!!i?.skipInitialTransition},i)}];return $Q(9,e)}var SU=[Gc,{provide:ed,useClass:z0},Is,td,{provide:$s,useFactory:KoA},Hf,[]],Vf=(()=>{class i{constructor(){}static forRoot(A,t){return{ngModule:i,providers:[SU,[],{provide:cB,multi:!0,useValue:A},[],t?.errorHandler?{provide:Xb,useValue:t.errorHandler}:[],{provide:id,useValue:t||{}},t?.useHash?OoA():JoA(),ToA(),t?.preloadingStrategy?vU(t.preloadingStrategy).\u0275providers:[],t?.initialNavigation?YoA(t):[],t?.bindToComponentInputs?bU().\u0275providers:[],t?.enableViewTransitions?MU().\u0275providers:[],HoA()]}}static forChild(A){return{ngModule:i,providers:[{provide:cB,multi:!0,useValue:A}]}}static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({})}return i})();function ToA(){return{provide:fU,useFactory:()=>{let i=w(JD),e=w(id);return e.scrollOffset&&i.setOffset(e.scrollOffset),new GoA(e)}}}function OoA(){return{provide:OD,useClass:JN}}function JoA(){return{provide:OD,useClass:ON}}function YoA(i){return[i.initialNavigation==="disabled"?yU().\u0275providers:[],i.initialNavigation==="enabledBlocking"?wU().\u0275providers:[]]}var A7=new MA("");function HoA(){return[{provide:A7,useFactory:UoA},{provide:SN,multi:!0,useExisting:A7}]}var joA=["*"];var VoA=new MA("MAT_CARD_CONFIG"),qf=(()=>{class i{appearance;constructor(){let A=w(VoA,{optional:!0});this.appearance=A?.appearance||"raised"}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-card"]],hostAttrs:[1,"mat-mdc-card","mdc-card"],hostVars:8,hostBindings:function(t,n){t&2&&_A("mat-mdc-card-outlined",n.appearance==="outlined")("mdc-card--outlined",n.appearance==="outlined")("mat-mdc-card-filled",n.appearance==="filled")("mdc-card--filled",n.appearance==="filled")},inputs:{appearance:"appearance"},exportAs:["matCard"],ngContentSelectors:joA,decls:1,vars:0,template:function(t,n){t&1&&(Ot(),Ze(0))},styles:[`.mat-mdc-card{display:flex;flex-direction:column;box-sizing:border-box;position:relative;border-style:solid;border-width:0;background-color:var(--mat-card-elevated-container-color, var(--mat-sys-surface-container-low));border-color:var(--mat-card-elevated-container-color, var(--mat-sys-surface-container-low));border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mat-card-elevated-container-elevation, var(--mat-sys-level1))}.mat-mdc-card::after{position:absolute;top:0;left:0;width:100%;height:100%;border:solid 1px rgba(0,0,0,0);content:"";display:block;pointer-events:none;box-sizing:border-box;border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium))}.mat-mdc-card-outlined{background-color:var(--mat-card-outlined-container-color, var(--mat-sys-surface));border-radius:var(--mat-card-outlined-container-shape, var(--mat-sys-corner-medium));border-width:var(--mat-card-outlined-outline-width, 1px);border-color:var(--mat-card-outlined-outline-color, var(--mat-sys-outline-variant));box-shadow:var(--mat-card-outlined-container-elevation, var(--mat-sys-level0))}.mat-mdc-card-outlined::after{border:none}.mat-mdc-card-filled{background-color:var(--mat-card-filled-container-color, var(--mat-sys-surface-container-highest));border-radius:var(--mat-card-filled-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mat-card-filled-container-elevation, var(--mat-sys-level0))}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media::before{display:block;content:""}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mat-mdc-card-actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px;padding:8px}.mat-mdc-card-title{font-family:var(--mat-card-title-text-font, var(--mat-sys-title-large-font));line-height:var(--mat-card-title-text-line-height, var(--mat-sys-title-large-line-height));font-size:var(--mat-card-title-text-size, var(--mat-sys-title-large-size));letter-spacing:var(--mat-card-title-text-tracking, var(--mat-sys-title-large-tracking));font-weight:var(--mat-card-title-text-weight, var(--mat-sys-title-large-weight))}.mat-mdc-card-subtitle{color:var(--mat-card-subtitle-text-color, var(--mat-sys-on-surface));font-family:var(--mat-card-subtitle-text-font, var(--mat-sys-title-medium-font));line-height:var(--mat-card-subtitle-text-line-height, var(--mat-sys-title-medium-line-height));font-size:var(--mat-card-subtitle-text-size, var(--mat-sys-title-medium-size));letter-spacing:var(--mat-card-subtitle-text-tracking, var(--mat-sys-title-medium-tracking));font-weight:var(--mat-card-subtitle-text-weight, var(--mat-sys-title-medium-weight))}.mat-mdc-card-title,.mat-mdc-card-subtitle{display:block;margin:0}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle{padding:16px 16px 0}.mat-mdc-card-header{display:flex;padding:16px 16px 0}.mat-mdc-card-content{display:block;padding:0 16px}.mat-mdc-card-content:first-child{padding-top:16px}.mat-mdc-card-content:last-child{padding-bottom:16px}.mat-mdc-card-title-group{display:flex;justify-content:space-between;width:100%}.mat-mdc-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;margin-bottom:16px;object-fit:cover}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title{line-height:normal}.mat-mdc-card-sm-image{width:80px;height:80px}.mat-mdc-card-md-image{width:112px;height:112px}.mat-mdc-card-lg-image{width:152px;height:152px}.mat-mdc-card-xl-image{width:240px;height:240px}.mat-mdc-card-subtitle~.mat-mdc-card-title,.mat-mdc-card-title~.mat-mdc-card-subtitle,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-title-group .mat-mdc-card-title,.mat-mdc-card-title-group .mat-mdc-card-subtitle{padding-top:0}.mat-mdc-card-content>:last-child:not(.mat-mdc-card-footer){margin-bottom:0}.mat-mdc-card-actions-align-end{justify-content:flex-end} -`],encapsulation:2,changeDetection:0})}return i})();var kU=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Di]})}return i})();var Au=class{};function eu(i){return i&&typeof i.connect=="function"&&!(i instanceof IN)}var Yg=(function(i){return i[i.REPLACED=0]="REPLACED",i[i.INSERTED=1]="INSERTED",i[i.MOVED=2]="MOVED",i[i.REMOVED=3]="REMOVED",i})(Yg||{}),Wf=class{viewCacheSize=20;_viewCache=[];applyChanges(e,A,t,n,o){e.forEachOperation((a,r,s)=>{let l,g;if(a.previousIndex==null){let C=()=>t(a,r,s);l=this._insertView(C,s,A,n(a)),g=l?Yg.INSERTED:Yg.REPLACED}else s==null?(this._detachAndCacheView(r,A),g=Yg.REMOVED):(l=this._moveView(r,s,A,n(a)),g=Yg.MOVED);o&&o({context:l?.context,operation:g,record:a})})}detach(){for(let e of this._viewCache)e.destroy();this._viewCache=[]}_insertView(e,A,t,n){let o=this._insertViewFromCache(A,t);if(o){o.context.$implicit=n;return}let a=e();return t.createEmbeddedView(a.templateRef,a.context,a.index)}_detachAndCacheView(e,A){let t=A.detach(e);this._maybeCacheView(t,A)}_moveView(e,A,t,n){let o=t.get(e);return t.move(o,A),o.context.$implicit=n,o}_maybeCacheView(e,A){if(this._viewCache.length{let l,g;if(a.previousIndex==null){let C=t(a,r,s);l=A.createEmbeddedView(C.templateRef,C.context,C.index),g=Yg.INSERTED}else s==null?(A.remove(r),g=Yg.REMOVED):(l=A.get(r),A.move(l,s),g=Yg.MOVED);o&&o({context:l?.context,operation:g,record:a})})}detach(){}};var P0=class{_multiple;_emitChanges;compareWith;_selection=new Set;_deselectedToEmit=[];_selectedToEmit=[];_selected=null;get selected(){return this._selected||(this._selected=Array.from(this._selection.values())),this._selected}changed=new ne;constructor(e=!1,A,t=!0,n){this._multiple=e,this._emitChanges=t,this.compareWith=n,A&&A.length&&(e?A.forEach(o=>this._markSelected(o)):this._markSelected(A[0]),this._selectedToEmit.length=0)}select(...e){this._verifyValueAssignment(e),e.forEach(t=>this._markSelected(t));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}deselect(...e){this._verifyValueAssignment(e),e.forEach(t=>this._unmarkSelected(t));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}setSelection(...e){this._verifyValueAssignment(e);let A=this.selected,t=new Set(e.map(o=>this._getConcreteValue(o)));e.forEach(o=>this._markSelected(o)),A.filter(o=>!t.has(this._getConcreteValue(o,t))).forEach(o=>this._unmarkSelected(o));let n=this._hasQueuedChanges();return this._emitChangeEvent(),n}toggle(e){return this.isSelected(e)?this.deselect(e):this.select(e)}clear(e=!0){this._unmarkAll();let A=this._hasQueuedChanges();return e&&this._emitChangeEvent(),A}isSelected(e){return this._selection.has(this._getConcreteValue(e))}isEmpty(){return this._selection.size===0}hasValue(){return!this.isEmpty()}sort(e){this._multiple&&this.selected&&this._selected.sort(e)}isMultipleSelection(){return this._multiple}_emitChangeEvent(){this._selected=null,(this._selectedToEmit.length||this._deselectedToEmit.length)&&(this.changed.next({source:this,added:this._selectedToEmit,removed:this._deselectedToEmit}),this._deselectedToEmit=[],this._selectedToEmit=[])}_markSelected(e){e=this._getConcreteValue(e),this.isSelected(e)||(this._multiple||this._unmarkAll(),this.isSelected(e)||this._selection.add(e),this._emitChanges&&this._selectedToEmit.push(e))}_unmarkSelected(e){e=this._getConcreteValue(e),this.isSelected(e)&&(this._selection.delete(e),this._emitChanges&&this._deselectedToEmit.push(e))}_unmarkAll(){this.isEmpty()||this._selection.forEach(e=>this._unmarkSelected(e))}_verifyValueAssignment(e){e.length>1&&this._multiple}_hasQueuedChanges(){return!!(this._deselectedToEmit.length||this._selectedToEmit.length)}_getConcreteValue(e,A){if(this.compareWith){A=A??this._selection;for(let t of A)if(this.compareWith(e,t))return t;return e}else return e}};var Xf=(()=>{class i{_animationsDisabled=In();state="unchecked";disabled=!1;appearance="full";constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-pseudo-checkbox"]],hostAttrs:[1,"mat-pseudo-checkbox"],hostVars:12,hostBindings:function(t,n){t&2&&_A("mat-pseudo-checkbox-indeterminate",n.state==="indeterminate")("mat-pseudo-checkbox-checked",n.state==="checked")("mat-pseudo-checkbox-disabled",n.disabled)("mat-pseudo-checkbox-minimal",n.appearance==="minimal")("mat-pseudo-checkbox-full",n.appearance==="full")("_mat-animation-noopable",n._animationsDisabled)},inputs:{state:"state",disabled:"disabled",appearance:"appearance"},decls:0,vars:0,template:function(t,n){},styles:[`.mat-pseudo-checkbox{border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox._mat-animation-noopable{transition:none !important;animation:none !important}.mat-pseudo-checkbox._mat-animation-noopable::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{left:1px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{left:1px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-minimal-selected-checkmark-color, var(--mat-sys-primary))}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full{border-color:var(--mat-pseudo-checkbox-full-unselected-icon-color, var(--mat-sys-on-surface-variant));border-width:2px;border-style:solid}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-disabled{border-color:var(--mat-pseudo-checkbox-full-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate{background-color:var(--mat-pseudo-checkbox-full-selected-icon-color, var(--mat-sys-primary));border-color:rgba(0,0,0,0)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-full-selected-checkmark-color, var(--mat-sys-on-primary))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background-color:var(--mat-pseudo-checkbox-full-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-full-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mat-pseudo-checkbox{width:18px;height:18px}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after{width:14px;height:6px;transform-origin:center;top:-4.2426406871px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{top:8px;width:16px}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after{width:10px;height:4px;transform-origin:center;top:-2.8284271247px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{top:6px;width:12px} -`],encapsulation:2,changeDetection:0})}return i})();var qoA=["button"],WoA=["*"];function ZoA(i,e){if(i&1&&(I(0,"div",2),lA(1,"mat-pseudo-checkbox",6),h()),i&2){let A=p();Q(),H("disabled",A.disabled)}}var _U=new MA("MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS",{providedIn:"root",factory:()=>({hideSingleSelectionIndicator:!1,hideMultipleSelectionIndicator:!1,disabledInteractive:!1})}),xU=new MA("MatButtonToggleGroup"),XoA={provide:cs,useExisting:Va(()=>t7),multi:!0},$f=class{source;value;constructor(e,A){this.source=e,this.value=A}},t7=(()=>{class i{_changeDetector=w(Mt);_dir=w(No,{optional:!0});_multiple=!1;_disabled=!1;_disabledInteractive=!1;_selectionModel;_rawValue;_controlValueAccessorChangeFn=()=>{};_onTouched=()=>{};_buttonToggles;appearance;get name(){return this._name}set name(A){this._name=A,this._markButtonsForCheck()}_name=w(Dn).getId("mat-button-toggle-group-");vertical=!1;get value(){let A=this._selectionModel?this._selectionModel.selected:[];return this.multiple?A.map(t=>t.value):A[0]?A[0].value:void 0}set value(A){this._setSelectionByValue(A),this.valueChange.emit(this.value)}valueChange=new FA;get selected(){let A=this._selectionModel?this._selectionModel.selected:[];return this.multiple?A:A[0]||null}get multiple(){return this._multiple}set multiple(A){this._multiple=A,this._markButtonsForCheck()}get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._markButtonsForCheck()}get disabledInteractive(){return this._disabledInteractive}set disabledInteractive(A){this._disabledInteractive=A,this._markButtonsForCheck()}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}change=new FA;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._markButtonsForCheck()}_hideSingleSelectionIndicator;get hideMultipleSelectionIndicator(){return this._hideMultipleSelectionIndicator}set hideMultipleSelectionIndicator(A){this._hideMultipleSelectionIndicator=A,this._markButtonsForCheck()}_hideMultipleSelectionIndicator;constructor(){let A=w(_U,{optional:!0});this.appearance=A&&A.appearance?A.appearance:"standard",this._hideSingleSelectionIndicator=A?.hideSingleSelectionIndicator??!1,this._hideMultipleSelectionIndicator=A?.hideMultipleSelectionIndicator??!1}ngOnInit(){this._selectionModel=new P0(this.multiple,void 0,!1)}ngAfterContentInit(){this._selectionModel.select(...this._buttonToggles.filter(A=>A.checked)),this.multiple||this._initializeTabIndex()}writeValue(A){this.value=A,this._changeDetector.markForCheck()}registerOnChange(A){this._controlValueAccessorChangeFn=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}_keydown(A){if(this.multiple||this.disabled||Sa(A))return;let n=A.target.id,o=this._buttonToggles.toArray().findIndex(r=>r.buttonId===n),a=null;switch(A.keyCode){case 32:case 13:a=this._buttonToggles.get(o)||null;break;case 38:a=this._getNextButton(o,-1);break;case 37:a=this._getNextButton(o,this.dir==="ltr"?-1:1);break;case 40:a=this._getNextButton(o,1);break;case 39:a=this._getNextButton(o,this.dir==="ltr"?1:-1);break;default:return}a&&(A.preventDefault(),a._onButtonClick(),a.focus())}_emitChangeEvent(A){let t=new $f(A,this.value);this._rawValue=t.value,this._controlValueAccessorChangeFn(t.value),this.change.emit(t)}_syncButtonToggle(A,t,n=!1,o=!1){!this.multiple&&this.selected&&!A.checked&&(this.selected.checked=!1),this._selectionModel?t?this._selectionModel.select(A):this._selectionModel.deselect(A):o=!0,o?Promise.resolve().then(()=>this._updateModelValue(A,n)):this._updateModelValue(A,n)}_isSelected(A){return this._selectionModel&&this._selectionModel.isSelected(A)}_isPrechecked(A){return typeof this._rawValue>"u"?!1:this.multiple&&Array.isArray(this._rawValue)?this._rawValue.some(t=>A.value!=null&&t===A.value):A.value===this._rawValue}_initializeTabIndex(){if(this._buttonToggles.forEach(A=>{A.tabIndex=-1}),this.selected)this.selected.tabIndex=0;else for(let A=0;Athis._selectValue(n,t))):(this._clearSelection(),this._selectValue(A,t)),!this.multiple&&t.every(n=>n.tabIndex===-1)){for(let n of t)if(!n.disabled){n.tabIndex=0;break}}}_clearSelection(){this._selectionModel.clear(),this._buttonToggles.forEach(A=>{A.checked=!1,this.multiple||(A.tabIndex=-1)})}_selectValue(A,t){for(let n of t)if(n.value===A){n.checked=!0,this._selectionModel.select(n),this.multiple||(n.tabIndex=0);break}}_updateModelValue(A,t){t&&this._emitChangeEvent(A),this.valueChange.emit(this.value)}_markButtonsForCheck(){this._buttonToggles?.forEach(A=>A._markForCheck())}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["mat-button-toggle-group"]],contentQueries:function(t,n,o){if(t&1&&ra(o,Am,5),t&2){let a;se(a=le())&&(n._buttonToggles=a)}},hostAttrs:[1,"mat-button-toggle-group"],hostVars:6,hostBindings:function(t,n){t&1&&U("keydown",function(a){return n._keydown(a)}),t&2&&(ie("role",n.multiple?"group":"radiogroup")("aria-disabled",n.disabled),_A("mat-button-toggle-vertical",n.vertical)("mat-button-toggle-group-appearance-standard",n.appearance==="standard"))},inputs:{appearance:"appearance",name:"name",vertical:[2,"vertical","vertical",Qe],value:"value",multiple:[2,"multiple","multiple",Qe],disabled:[2,"disabled","disabled",Qe],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Qe],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",Qe],hideMultipleSelectionIndicator:[2,"hideMultipleSelectionIndicator","hideMultipleSelectionIndicator",Qe]},outputs:{valueChange:"valueChange",change:"change"},exportAs:["matButtonToggleGroup"],features:[pt([XoA,{provide:xU,useExisting:i}])]})}return i})(),Am=(()=>{class i{_changeDetectorRef=w(Mt);_elementRef=w(ce);_focusMonitor=w(rr);_idGenerator=w(Dn);_animationDisabled=In();_checked=!1;ariaLabel;ariaLabelledby=null;_buttonElement;buttonToggleGroup;get buttonId(){return`${this.id}-button`}id;name;value;get tabIndex(){return this._tabIndex()}set tabIndex(A){this._tabIndex.set(A)}_tabIndex;disableRipple=!1;get appearance(){return this.buttonToggleGroup?this.buttonToggleGroup.appearance:this._appearance}set appearance(A){this._appearance=A}_appearance;get checked(){return this.buttonToggleGroup?this.buttonToggleGroup._isSelected(this):this._checked}set checked(A){A!==this._checked&&(this._checked=A,this.buttonToggleGroup&&this.buttonToggleGroup._syncButtonToggle(this,this._checked),this._changeDetectorRef.markForCheck())}get disabled(){return this._disabled||this.buttonToggleGroup&&this.buttonToggleGroup.disabled}set disabled(A){this._disabled=A}_disabled=!1;get disabledInteractive(){return this._disabledInteractive||this.buttonToggleGroup!==null&&this.buttonToggleGroup.disabledInteractive}set disabledInteractive(A){this._disabledInteractive=A}_disabledInteractive;change=new FA;constructor(){w(Eo).load(Qr);let A=w(xU,{optional:!0}),t=w(new Ys("tabindex"),{optional:!0})||"",n=w(_U,{optional:!0});this._tabIndex=mA(parseInt(t)||0),this.buttonToggleGroup=A,this._appearance=n&&n.appearance?n.appearance:"standard",this._disabledInteractive=n?.disabledInteractive??!1}ngOnInit(){let A=this.buttonToggleGroup;this.id=this.id||this._idGenerator.getId("mat-button-toggle-"),A&&(A._isPrechecked(this)?this.checked=!0:A._isSelected(this)!==this._checked&&A._syncButtonToggle(this,this._checked))}ngAfterViewInit(){this._animationDisabled||this._elementRef.nativeElement.classList.add("mat-button-toggle-animations-enabled"),this._focusMonitor.monitor(this._elementRef,!0)}ngOnDestroy(){let A=this.buttonToggleGroup;this._focusMonitor.stopMonitoring(this._elementRef),A&&A._isSelected(this)&&A._syncButtonToggle(this,!1,!1,!0)}focus(A){this._buttonElement.nativeElement.focus(A)}_onButtonClick(){if(this.disabled)return;let A=this.isSingleSelector()?!0:!this._checked;if(A!==this._checked&&(this._checked=A,this.buttonToggleGroup&&(this.buttonToggleGroup._syncButtonToggle(this,this._checked,!0),this.buttonToggleGroup._onTouched())),this.isSingleSelector()){let t=this.buttonToggleGroup._buttonToggles.find(n=>n.tabIndex===0);t&&(t.tabIndex=-1),this.tabIndex=0}this.change.emit(new $f(this,this.value))}_markForCheck(){this._changeDetectorRef.markForCheck()}_getButtonName(){return this.isSingleSelector()?this.buttonToggleGroup.name:this.name||null}isSingleSelector(){return this.buttonToggleGroup&&!this.buttonToggleGroup.multiple}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-button-toggle"]],viewQuery:function(t,n){if(t&1&&Wt(qoA,5),t&2){let o;se(o=le())&&(n._buttonElement=o.first)}},hostAttrs:["role","presentation",1,"mat-button-toggle"],hostVars:14,hostBindings:function(t,n){t&1&&U("focus",function(){return n.focus()}),t&2&&(ie("aria-label",null)("aria-labelledby",null)("id",n.id)("name",null),_A("mat-button-toggle-standalone",!n.buttonToggleGroup)("mat-button-toggle-checked",n.checked)("mat-button-toggle-disabled",n.disabled)("mat-button-toggle-disabled-interactive",n.disabledInteractive)("mat-button-toggle-appearance-standard",n.appearance==="standard"))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],id:"id",name:"name",value:"value",tabIndex:"tabIndex",disableRipple:[2,"disableRipple","disableRipple",Qe],appearance:"appearance",checked:[2,"checked","checked",Qe],disabled:[2,"disabled","disabled",Qe],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Qe]},outputs:{change:"change"},exportAs:["matButtonToggle"],ngContentSelectors:WoA,decls:7,vars:13,consts:[["button",""],["type","button",1,"mat-button-toggle-button","mat-focus-indicator",3,"click","id","disabled"],[1,"mat-button-toggle-checkbox-wrapper"],[1,"mat-button-toggle-label-content"],[1,"mat-button-toggle-focus-overlay"],["matRipple","",1,"mat-button-toggle-ripple",3,"matRippleTrigger","matRippleDisabled"],["state","checked","aria-hidden","true","appearance","minimal",3,"disabled"]],template:function(t,n){if(t&1&&(Ot(),I(0,"button",1,0),U("click",function(){return n._onButtonClick()}),T(2,ZoA,2,1,"div",2),I(3,"span",3),Ze(4),h()(),lA(5,"span",4)(6,"span",5)),t&2){let o=Bi(1);H("id",n.buttonId)("disabled",n.disabled&&!n.disabledInteractive||null),ie("role",n.isSingleSelector()?"radio":"button")("tabindex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("aria-pressed",n.isSingleSelector()?null:n.checked)("aria-checked",n.isSingleSelector()?n.checked:null)("name",n._getButtonName())("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),Q(2),O(n.buttonToggleGroup&&(!n.buttonToggleGroup.multiple&&!n.buttonToggleGroup.hideSingleSelectionIndicator||n.buttonToggleGroup.multiple&&!n.buttonToggleGroup.hideMultipleSelectionIndicator)?2:-1),Q(4),H("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)}},dependencies:[Cs,Xf],styles:[`.mat-button-toggle-standalone,.mat-button-toggle-group{position:relative;display:inline-flex;flex-direction:row;white-space:nowrap;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0);border-radius:var(--mat-button-toggle-legacy-shape);transform:translateZ(0)}.mat-button-toggle-standalone:not([class*=mat-elevation-z]),.mat-button-toggle-group:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)}@media(forced-colors: active){.mat-button-toggle-standalone,.mat-button-toggle-group{outline:solid 1px}}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard .mat-pseudo-checkbox,.mat-button-toggle-group-appearance-standard .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard:not([class*=mat-elevation-z]),.mat-button-toggle-group-appearance-standard:not([class*=mat-elevation-z]){box-shadow:none}@media(forced-colors: active){.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{outline:0}}.mat-button-toggle-vertical{flex-direction:column}.mat-button-toggle-vertical .mat-button-toggle-label-content{display:block}.mat-button-toggle{white-space:nowrap;position:relative;color:var(--mat-button-toggle-legacy-text-color);font-family:var(--mat-button-toggle-legacy-label-text-font);font-size:var(--mat-button-toggle-legacy-label-text-size);line-height:var(--mat-button-toggle-legacy-label-text-line-height);font-weight:var(--mat-button-toggle-legacy-label-text-weight);letter-spacing:var(--mat-button-toggle-legacy-label-text-tracking);--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-button-toggle-legacy-selected-state-text-color)}.mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-button-toggle-legacy-focus-state-layer-opacity)}.mat-button-toggle .mat-icon svg{vertical-align:top}.mat-button-toggle-checkbox-wrapper{display:inline-block;justify-content:flex-start;align-items:center;width:0;height:18px;line-height:18px;overflow:hidden;box-sizing:border-box;position:absolute;top:50%;left:16px;transform:translate3d(0, -50%, 0)}[dir=rtl] .mat-button-toggle-checkbox-wrapper{left:auto;right:16px}.mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:12px}[dir=rtl] .mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:auto;right:12px}.mat-button-toggle-checked .mat-button-toggle-checkbox-wrapper{width:18px}.mat-button-toggle-animations-enabled .mat-button-toggle-checkbox-wrapper{transition:width 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-checkbox-wrapper{transition:none}.mat-button-toggle-checked{color:var(--mat-button-toggle-legacy-selected-state-text-color);background-color:var(--mat-button-toggle-legacy-selected-state-background-color)}.mat-button-toggle-disabled{pointer-events:none;color:var(--mat-button-toggle-legacy-disabled-state-text-color);background-color:var(--mat-button-toggle-legacy-disabled-state-background-color);--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color: var(--mat-button-toggle-legacy-disabled-state-text-color)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:var(--mat-button-toggle-legacy-disabled-selected-state-background-color)}.mat-button-toggle-disabled-interactive{pointer-events:auto}.mat-button-toggle-appearance-standard{color:var(--mat-button-toggle-text-color, var(--mat-sys-on-surface));background-color:var(--mat-button-toggle-background-color, transparent);font-family:var(--mat-button-toggle-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-toggle-label-text-size, var(--mat-sys-label-large-size));line-height:var(--mat-button-toggle-label-text-line-height, var(--mat-sys-label-large-line-height));font-weight:var(--mat-button-toggle-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-button-toggle-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:none;border-top:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:var(--mat-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-button-toggle-selected-state-background-color, var(--mat-sys-secondary-container))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled{color:var(--mat-button-toggle-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-toggle-disabled-state-background-color, transparent)}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color: var(--mat-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled.mat-button-toggle-checked{color:var(--mat-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-toggle-disabled-selected-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:var(--mat-button-toggle-state-layer-color, var(--mat-sys-on-surface))}.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{opacity:var(--mat-button-toggle-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-button-toggle-appearance-standard.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-button-toggle-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}@media(hover: none){.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{display:none}}.mat-button-toggle-label-content{-webkit-user-select:none;user-select:none;display:inline-block;padding:0 16px;line-height:var(--mat-button-toggle-legacy-height);position:relative}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{padding:0 12px;line-height:var(--mat-button-toggle-height, 40px)}.mat-button-toggle-label-content>*{vertical-align:middle}.mat-button-toggle-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit;pointer-events:none;opacity:0;background-color:var(--mat-button-toggle-legacy-state-layer-color)}@media(forced-colors: active){.mat-button-toggle-checked .mat-button-toggle-focus-overlay{border-bottom:solid 500px;opacity:.5;height:0}.mat-button-toggle-checked:hover .mat-button-toggle-focus-overlay{opacity:.6}.mat-button-toggle-checked.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{border-bottom:solid 500px}}.mat-button-toggle .mat-button-toggle-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-toggle-button{border:0;background:none;color:inherit;padding:0;margin:0;font:inherit;outline:none;width:100%;cursor:pointer}.mat-button-toggle-animations-enabled .mat-button-toggle-button{transition:padding 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-button{transition:none}.mat-button-toggle-disabled .mat-button-toggle-button{cursor:default}.mat-button-toggle-button::-moz-focus-inner{border:0}.mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:30px}[dir=rtl] .mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:0;padding-right:30px}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{--mat-focus-indicator-border-radius: var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-bottom-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-bottom-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-bottom-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-bottom-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-top-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))} -`],encapsulation:2,changeDetection:0})}return i})(),RU=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Jc,Am,Di]})}return i})();var $oA=20,qc=(()=>{class i{_ngZone=w(We);_platform=w(Qi);_renderer=w(zr).createRenderer(null,null);_cleanupGlobalListener;constructor(){}_scrolled=new ne;_scrolledCount=0;scrollContainers=new Map;register(A){this.scrollContainers.has(A)||this.scrollContainers.set(A,A.elementScrolled().subscribe(()=>this._scrolled.next(A)))}deregister(A){let t=this.scrollContainers.get(A);t&&(t.unsubscribe(),this.scrollContainers.delete(A))}scrolled(A=$oA){return this._platform.isBrowser?new Fi(t=>{this._cleanupGlobalListener||(this._cleanupGlobalListener=this._ngZone.runOutsideAngular(()=>this._renderer.listen("document","scroll",()=>this._scrolled.next())));let n=A>0?this._scrolled.pipe(v1(A)).subscribe(t):this._scrolled.subscribe(t);return this._scrolledCount++,()=>{n.unsubscribe(),this._scrolledCount--,this._scrolledCount||(this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0)}}):oe()}ngOnDestroy(){this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0,this.scrollContainers.forEach((A,t)=>this.deregister(t)),this._scrolled.complete()}ancestorScrolled(A,t){let n=this.getAncestorScrollContainers(A);return this.scrolled(t).pipe(Bt(o=>!o||n.indexOf(o)>-1))}getAncestorScrollContainers(A){let t=[];return this.scrollContainers.forEach((n,o)=>{this._scrollableContainsElement(o,A)&&t.push(o)}),t}_scrollableContainsElement(A,t){let n=ks(t),o=A.getElementRef().nativeElement;do if(n==o)return!0;while(n=n.parentElement);return!1}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),j0=(()=>{class i{elementRef=w(ce);scrollDispatcher=w(qc);ngZone=w(We);dir=w(No,{optional:!0});_scrollElement=this.elementRef.nativeElement;_destroyed=new ne;_renderer=w(on);_cleanupScroll;_elementScrolled=new ne;constructor(){}ngOnInit(){this._cleanupScroll=this.ngZone.runOutsideAngular(()=>this._renderer.listen(this._scrollElement,"scroll",A=>this._elementScrolled.next(A))),this.scrollDispatcher.register(this)}ngOnDestroy(){this._cleanupScroll?.(),this._elementScrolled.complete(),this.scrollDispatcher.deregister(this),this._destroyed.next(),this._destroyed.complete()}elementScrolled(){return this._elementScrolled}getElementRef(){return this.elementRef}scrollTo(A){let t=this.elementRef.nativeElement,n=this.dir&&this.dir.value=="rtl";A.left==null&&(A.left=n?A.end:A.start),A.right==null&&(A.right=n?A.start:A.end),A.bottom!=null&&(A.top=t.scrollHeight-t.clientHeight-A.bottom),n&&OI()!=Lg.NORMAL?(A.left!=null&&(A.right=t.scrollWidth-t.clientWidth-A.left),OI()==Lg.INVERTED?A.left=A.right:OI()==Lg.NEGATED&&(A.left=A.right?-A.right:A.right)):A.right!=null&&(A.left=t.scrollWidth-t.clientWidth-A.right),this._applyScrollToOptions(A)}_applyScrollToOptions(A){let t=this.elementRef.nativeElement;O3()?t.scrollTo(A):(A.top!=null&&(t.scrollTop=A.top),A.left!=null&&(t.scrollLeft=A.left))}measureScrollOffset(A){let t="left",n="right",o=this.elementRef.nativeElement;if(A=="top")return o.scrollTop;if(A=="bottom")return o.scrollHeight-o.clientHeight-o.scrollTop;let a=this.dir&&this.dir.value=="rtl";return A=="start"?A=a?n:t:A=="end"&&(A=a?t:n),a&&OI()==Lg.INVERTED?A==t?o.scrollWidth-o.clientWidth-o.scrollLeft:o.scrollLeft:a&&OI()==Lg.NEGATED?A==t?o.scrollLeft+o.scrollWidth-o.clientWidth:-o.scrollLeft:A==t?o.scrollLeft:o.scrollWidth-o.clientWidth-o.scrollLeft}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdk-scrollable",""],["","cdkScrollable",""]]})}return i})(),AaA=20,Ns=(()=>{class i{_platform=w(Qi);_listeners;_viewportSize=null;_change=new ne;_document=w(ci);constructor(){let A=w(We),t=w(zr).createRenderer(null,null);A.runOutsideAngular(()=>{if(this._platform.isBrowser){let n=o=>this._change.next(o);this._listeners=[t.listen("window","resize",n),t.listen("window","orientationchange",n)]}this.change().subscribe(()=>this._viewportSize=null)})}ngOnDestroy(){this._listeners?.forEach(A=>A()),this._change.complete()}getViewportSize(){this._viewportSize||this._updateViewportSize();let A={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),A}getViewportRect(){let A=this.getViewportScrollPosition(),{width:t,height:n}=this.getViewportSize();return{top:A.top,left:A.left,bottom:A.top+n,right:A.left+t,height:n,width:t}}getViewportScrollPosition(){if(!this._platform.isBrowser)return{top:0,left:0};let A=this._document,t=this._getWindow(),n=A.documentElement,o=n.getBoundingClientRect(),a=-o.top||A.body?.scrollTop||t.scrollY||n.scrollTop||0,r=-o.left||A.body?.scrollLeft||t.scrollX||n.scrollLeft||0;return{top:a,left:r}}change(A=AaA){return A>0?this._change.pipe(v1(A)):this._change}_getWindow(){return this._document.defaultView||window}_updateViewportSize(){let A=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:A.innerWidth,height:A.innerHeight}:{width:0,height:0}}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var NU=new MA("CDK_VIRTUAL_SCROLL_VIEWPORT");var Vc=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({})}return i})(),em=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Di,Vc,Di,Vc]})}return i})();var tu=class{_attachedHost=null;attach(e){return this._attachedHost=e,e.attach(this)}detach(){let e=this._attachedHost;e!=null&&(this._attachedHost=null,e.detach())}get isAttached(){return this._attachedHost!=null}setAttachedHost(e){this._attachedHost=e}},Fs=class extends tu{component;viewContainerRef;injector;projectableNodes;bindings;constructor(e,A,t,n,o){super(),this.component=e,this.viewContainerRef=A,this.injector=t,this.projectableNodes=n,this.bindings=o||null}},jr=class extends tu{templateRef;viewContainerRef;context;injector;constructor(e,A,t,n){super(),this.templateRef=e,this.viewContainerRef=A,this.context=t,this.injector=n}get origin(){return this.templateRef.elementRef}attach(e,A=this.context){return this.context=A,super.attach(e)}detach(){return this.context=void 0,super.detach()}},i7=class extends tu{element;constructor(e){super(),this.element=e instanceof ce?e.nativeElement:e}},n2=class{_attachedPortal=null;_disposeFn=null;_isDisposed=!1;hasAttached(){return!!this._attachedPortal}attach(e){if(e instanceof Fs)return this._attachedPortal=e,this.attachComponentPortal(e);if(e instanceof jr)return this._attachedPortal=e,this.attachTemplatePortal(e);if(this.attachDomPortal&&e instanceof i7)return this._attachedPortal=e,this.attachDomPortal(e)}attachDomPortal=null;detach(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()}dispose(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0}setDisposeFn(e){this._disposeFn=e}_invokeDisposeFn(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)}},iu=class extends n2{outletElement;_appRef;_defaultInjector;constructor(e,A,t){super(),this.outletElement=e,this._appRef=A,this._defaultInjector=t}attachComponentPortal(e){let A;if(e.viewContainerRef){let t=e.injector||e.viewContainerRef.injector,n=t.get(GD,null,{optional:!0})||void 0;A=e.viewContainerRef.createComponent(e.component,{index:e.viewContainerRef.length,injector:t,ngModuleRef:n,projectableNodes:e.projectableNodes||void 0,bindings:e.bindings||void 0}),this.setDisposeFn(()=>A.destroy())}else{let t=this._appRef,n=e.injector||this._defaultInjector||St.NULL,o=n.get(Hr,t.injector);A=C3(e.component,{elementInjector:n,environmentInjector:o,projectableNodes:e.projectableNodes||void 0,bindings:e.bindings||void 0}),t.attachView(A.hostView),this.setDisposeFn(()=>{t.viewCount>0&&t.detachView(A.hostView),A.destroy()})}return this.outletElement.appendChild(this._getComponentRootNode(A)),this._attachedPortal=e,A}attachTemplatePortal(e){let A=e.viewContainerRef,t=A.createEmbeddedView(e.templateRef,e.context,{injector:e.injector});return t.rootNodes.forEach(n=>this.outletElement.appendChild(n)),t.detectChanges(),this.setDisposeFn(()=>{let n=A.indexOf(t);n!==-1&&A.remove(n)}),this._attachedPortal=e,t}attachDomPortal=e=>{let A=e.element;A.parentNode;let t=this.outletElement.ownerDocument.createComment("dom-portal");A.parentNode.insertBefore(t,A),this.outletElement.appendChild(A),this._attachedPortal=e,super.setDisposeFn(()=>{t.parentNode&&t.parentNode.replaceChild(A,t)})};dispose(){super.dispose(),this.outletElement.remove()}_getComponentRootNode(e){return e.hostView.rootNodes[0]}},FU=(()=>{class i extends jr{constructor(){let A=w(wo),t=w(Jo);super(A,t)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdkPortal",""]],exportAs:["cdkPortal"],features:[bt]})}return i})(),Ag=(()=>{class i extends n2{_moduleRef=w(GD,{optional:!0});_document=w(ci);_viewContainerRef=w(Jo);_isInitialized=!1;_attachedRef=null;constructor(){super()}get portal(){return this._attachedPortal}set portal(A){this.hasAttached()&&!A&&!this._isInitialized||(this.hasAttached()&&super.detach(),A&&super.attach(A),this._attachedPortal=A||null)}attached=new FA;get attachedRef(){return this._attachedRef}ngOnInit(){this._isInitialized=!0}ngOnDestroy(){super.dispose(),this._attachedRef=this._attachedPortal=null}attachComponentPortal(A){A.setAttachedHost(this);let t=A.viewContainerRef!=null?A.viewContainerRef:this._viewContainerRef,n=t.createComponent(A.component,{index:t.length,injector:A.injector||t.injector,projectableNodes:A.projectableNodes||void 0,ngModuleRef:this._moduleRef||void 0,bindings:A.bindings||void 0});return t!==this._viewContainerRef&&this._getRootNode().appendChild(n.hostView.rootNodes[0]),super.setDisposeFn(()=>n.destroy()),this._attachedPortal=A,this._attachedRef=n,this.attached.emit(n),n}attachTemplatePortal(A){A.setAttachedHost(this);let t=this._viewContainerRef.createEmbeddedView(A.templateRef,A.context,{injector:A.injector});return super.setDisposeFn(()=>this._viewContainerRef.clear()),this._attachedPortal=A,this._attachedRef=t,this.attached.emit(t),t}attachDomPortal=A=>{let t=A.element;t.parentNode;let n=this._document.createComment("dom-portal");A.setAttachedHost(this),t.parentNode.insertBefore(n,t),this._getRootNode().appendChild(t),this._attachedPortal=A,super.setDisposeFn(()=>{n.parentNode&&n.parentNode.replaceChild(t,n)})};_getRootNode(){let A=this._viewContainerRef.element.nativeElement;return A.nodeType===A.ELEMENT_NODE?A:A.parentNode}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdkPortalOutlet",""]],inputs:{portal:[0,"cdkPortalOutlet","portal"]},outputs:{attached:"attached"},exportAs:["cdkPortalOutlet"],features:[bt]})}return i})(),Wc=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({})}return i})();var LU=O3();function IB(i){return new tm(i.get(Ns),i.get(ci))}var tm=class{_viewportRuler;_previousHTMLStyles={top:"",left:""};_previousScrollPosition;_isEnabled=!1;_document;constructor(e,A){this._viewportRuler=e,this._document=A}attach(){}enable(){if(this._canBeEnabled()){let e=this._document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=e.style.left||"",this._previousHTMLStyles.top=e.style.top||"",e.style.left=Wa(-this._previousScrollPosition.left),e.style.top=Wa(-this._previousScrollPosition.top),e.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}}disable(){if(this._isEnabled){let e=this._document.documentElement,A=this._document.body,t=e.style,n=A.style,o=t.scrollBehavior||"",a=n.scrollBehavior||"";this._isEnabled=!1,t.left=this._previousHTMLStyles.left,t.top=this._previousHTMLStyles.top,e.classList.remove("cdk-global-scrollblock"),LU&&(t.scrollBehavior=n.scrollBehavior="auto"),window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),LU&&(t.scrollBehavior=o,n.scrollBehavior=a)}}_canBeEnabled(){if(this._document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;let A=this._document.documentElement,t=this._viewportRuler.getViewportSize();return A.scrollHeight>t.height||A.scrollWidth>t.width}};function YU(i,e){return new im(i.get(qc),i.get(We),i.get(Ns),e)}var im=class{_scrollDispatcher;_ngZone;_viewportRuler;_config;_scrollSubscription=null;_overlayRef;_initialScrollPosition;constructor(e,A,t,n){this._scrollDispatcher=e,this._ngZone=A,this._viewportRuler=t,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(this._scrollSubscription)return;let e=this._scrollDispatcher.scrolled(0).pipe(Bt(A=>!A||!this._overlayRef.overlayElement.contains(A.getElementRef().nativeElement)));this._config&&this._config.threshold&&this._config.threshold>1?(this._initialScrollPosition=this._viewportRuler.getViewportScrollPosition().top,this._scrollSubscription=e.subscribe(()=>{let A=this._viewportRuler.getViewportScrollPosition().top;Math.abs(A-this._initialScrollPosition)>this._config.threshold?this._detach():this._overlayRef.updatePosition()})):this._scrollSubscription=e.subscribe(this._detach)}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}_detach=()=>{this.disable(),this._overlayRef.hasAttached()&&this._ngZone.run(()=>this._overlayRef.detach())}};var nu=class{enable(){}disable(){}attach(){}};function n7(i,e){return e.some(A=>{let t=i.bottomA.bottom,o=i.rightA.right;return t||n||o||a})}function GU(i,e){return e.some(A=>{let t=i.topA.bottom,o=i.leftA.right;return t||n||o||a})}function V0(i,e){return new nm(i.get(qc),i.get(Ns),i.get(We),e)}var nm=class{_scrollDispatcher;_viewportRuler;_ngZone;_config;_scrollSubscription=null;_overlayRef;constructor(e,A,t,n){this._scrollDispatcher=e,this._viewportRuler=A,this._ngZone=t,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(!this._scrollSubscription){let e=this._config?this._config.scrollThrottle:0;this._scrollSubscription=this._scrollDispatcher.scrolled(e).subscribe(()=>{if(this._overlayRef.updatePosition(),this._config&&this._config.autoClose){let A=this._overlayRef.overlayElement.getBoundingClientRect(),{width:t,height:n}=this._viewportRuler.getViewportSize();n7(A,[{width:t,height:n,bottom:n,right:t,top:0,left:0}])&&(this.disable(),this._ngZone.run(()=>this._overlayRef.detach()))}})}}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}},HU=(()=>{class i{_injector=w(St);constructor(){}noop=()=>new nu;close=A=>YU(this._injector,A);block=()=>IB(this._injector);reposition=A=>V0(this._injector,A);static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),Hg=class{positionStrategy;scrollStrategy=new nu;panelClass="";hasBackdrop=!1;backdropClass="cdk-overlay-dark-backdrop";disableAnimations;width;height;minWidth;minHeight;maxWidth;maxHeight;direction;disposeOnNavigation=!1;usePopover;eventPredicate;constructor(e){if(e){let A=Object.keys(e);for(let t of A)e[t]!==void 0&&(this[t]=e[t])}}};var om=class{connectionPair;scrollableViewProperties;constructor(e,A){this.connectionPair=e,this.scrollableViewProperties=A}};var zU=(()=>{class i{_attachedOverlays=[];_document=w(ci);_isAttached=!1;constructor(){}ngOnDestroy(){this.detach()}add(A){this.remove(A),this._attachedOverlays.push(A)}remove(A){let t=this._attachedOverlays.indexOf(A);t>-1&&this._attachedOverlays.splice(t,1),this._attachedOverlays.length===0&&this.detach()}canReceiveEvent(A,t,n){return n.observers.length<1?!1:A.eventPredicate?A.eventPredicate(t):!0}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),PU=(()=>{class i extends zU{_ngZone=w(We);_renderer=w(zr).createRenderer(null,null);_cleanupKeydown;add(A){super.add(A),this._isAttached||(this._ngZone.runOutsideAngular(()=>{this._cleanupKeydown=this._renderer.listen("body","keydown",this._keydownListener)}),this._isAttached=!0)}detach(){this._isAttached&&(this._cleanupKeydown?.(),this._isAttached=!1)}_keydownListener=A=>{let t=this._attachedOverlays;for(let n=t.length-1;n>-1;n--){let o=t[n];if(this.canReceiveEvent(o,A,o._keydownEvents)){this._ngZone.run(()=>o._keydownEvents.next(A));break}}};static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),jU=(()=>{class i extends zU{_platform=w(Qi);_ngZone=w(We);_renderer=w(zr).createRenderer(null,null);_cursorOriginalValue;_cursorStyleIsSet=!1;_pointerDownEventTarget=null;_cleanups;add(A){if(super.add(A),!this._isAttached){let t=this._document.body,n={capture:!0},o=this._renderer;this._cleanups=this._ngZone.runOutsideAngular(()=>[o.listen(t,"pointerdown",this._pointerDownListener,n),o.listen(t,"click",this._clickListener,n),o.listen(t,"auxclick",this._clickListener,n),o.listen(t,"contextmenu",this._clickListener,n)]),this._platform.IOS&&!this._cursorStyleIsSet&&(this._cursorOriginalValue=t.style.cursor,t.style.cursor="pointer",this._cursorStyleIsSet=!0),this._isAttached=!0}}detach(){this._isAttached&&(this._cleanups?.forEach(A=>A()),this._cleanups=void 0,this._platform.IOS&&this._cursorStyleIsSet&&(this._document.body.style.cursor=this._cursorOriginalValue,this._cursorStyleIsSet=!1),this._isAttached=!1)}_pointerDownListener=A=>{this._pointerDownEventTarget=Pr(A)};_clickListener=A=>{let t=Pr(A),n=A.type==="click"&&this._pointerDownEventTarget?this._pointerDownEventTarget:t;this._pointerDownEventTarget=null;let o=this._attachedOverlays.slice();for(let a=o.length-1;a>-1;a--){let r=o[a],s=r._outsidePointerEvents;if(!(!r.hasAttached()||!this.canReceiveEvent(r,A,s))){if(KU(r.overlayElement,t)||KU(r.overlayElement,n))break;this._ngZone?this._ngZone.run(()=>s.next(A)):s.next(A)}}};static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function KU(i,e){let A=typeof ShadowRoot<"u"&&ShadowRoot,t=e;for(;t;){if(t===i)return!0;t=A&&t instanceof ShadowRoot?t.host:t.parentNode}return!1}var VU=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["ng-component"]],hostAttrs:["cdk-overlay-style-loader",""],decls:0,vars:0,template:function(t,n){},styles:[`.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed}@layer cdk-overlay{.cdk-overlay-container{z-index:1000}}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute}@layer cdk-overlay{.cdk-global-overlay-wrapper{z-index:1000}}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;display:flex;max-width:100%;max-height:100%}@layer cdk-overlay{.cdk-overlay-pane{z-index:1000}}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);opacity:0;touch-action:manipulation}@layer cdk-overlay{.cdk-overlay-backdrop{z-index:1000;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}}@media(prefers-reduced-motion){.cdk-overlay-backdrop{transition-duration:1ms}}.cdk-overlay-backdrop-showing{opacity:1}@media(forced-colors: active){.cdk-overlay-backdrop-showing{opacity:.6}}@layer cdk-overlay{.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing,.cdk-high-contrast-active .cdk-overlay-transparent-backdrop{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;display:flex;flex-direction:column;min-width:1px;min-height:1px}@layer cdk-overlay{.cdk-overlay-connected-position-bounding-box{z-index:1000}}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.cdk-overlay-popover{background:none;border:none;padding:0;outline:0;overflow:visible;position:fixed;pointer-events:none;white-space:normal;color:inherit;text-decoration:none;width:100%;height:100%;inset:auto;top:0;left:0}.cdk-overlay-popover::backdrop{display:none}.cdk-overlay-popover .cdk-overlay-backdrop{position:fixed;z-index:auto} -`],encapsulation:2,changeDetection:0})}return i})(),sm=(()=>{class i{_platform=w(Qi);_containerElement;_document=w(ci);_styleLoader=w(Eo);constructor(){}ngOnDestroy(){this._containerElement?.remove()}getContainerElement(){return this._loadStyles(),this._containerElement||this._createContainer(),this._containerElement}_createContainer(){let A="cdk-overlay-container";if(this._platform.isBrowser||yv()){let n=this._document.querySelectorAll(`.${A}[platform="server"], .${A}[platform="test"]`);for(let o=0;o{let e=this.element;clearTimeout(this._fallbackTimeout),this._cleanupTransitionEnd?.(),this._cleanupTransitionEnd=this._renderer.listen(e,"transitionend",this.dispose),this._fallbackTimeout=setTimeout(this.dispose,500),e.style.pointerEvents="none",e.classList.remove("cdk-overlay-backdrop-showing")})}dispose=()=>{clearTimeout(this._fallbackTimeout),this._cleanupClick?.(),this._cleanupTransitionEnd?.(),this._cleanupClick=this._cleanupTransitionEnd=this._fallbackTimeout=void 0,this.element.remove()}};function a7(i){return i&&i.nodeType===1}var CB=class{_portalOutlet;_host;_pane;_config;_ngZone;_keyboardDispatcher;_document;_location;_outsideClickDispatcher;_animationsDisabled;_injector;_renderer;_backdropClick=new ne;_attachments=new ne;_detachments=new ne;_positionStrategy;_scrollStrategy;_locationChanges=Oo.EMPTY;_backdropRef=null;_detachContentMutationObserver;_detachContentAfterRenderRef;_disposed=!1;_previousHostParent;_keydownEvents=new ne;_outsidePointerEvents=new ne;_afterNextRenderRef;constructor(e,A,t,n,o,a,r,s,l,g=!1,C,d){this._portalOutlet=e,this._host=A,this._pane=t,this._config=n,this._ngZone=o,this._keyboardDispatcher=a,this._document=r,this._location=s,this._outsideClickDispatcher=l,this._animationsDisabled=g,this._injector=C,this._renderer=d,n.scrollStrategy&&(this._scrollStrategy=n.scrollStrategy,this._scrollStrategy.attach(this)),this._positionStrategy=n.positionStrategy}get overlayElement(){return this._pane}get backdropElement(){return this._backdropRef?.element||null}get hostElement(){return this._host}get eventPredicate(){return this._config?.eventPredicate||null}attach(e){if(this._disposed)return null;this._attachHost();let A=this._portalOutlet.attach(e);return this._positionStrategy?.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._scrollStrategy&&this._scrollStrategy.enable(),this._afterNextRenderRef?.destroy(),this._afterNextRenderRef=ao(()=>{this.hasAttached()&&this.updatePosition()},{injector:this._injector}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!0),this._attachments.next(),this._completeDetachContent(),this._keyboardDispatcher.add(this),this._config.disposeOnNavigation&&(this._locationChanges=this._location.subscribe(()=>this.dispose())),this._outsideClickDispatcher.add(this),typeof A?.onDestroy=="function"&&A.onDestroy(()=>{this.hasAttached()&&this._ngZone.runOutsideAngular(()=>Promise.resolve().then(()=>this.detach()))}),A}detach(){if(!this.hasAttached())return;this.detachBackdrop(),this._togglePointerEvents(!1),this._positionStrategy&&this._positionStrategy.detach&&this._positionStrategy.detach(),this._scrollStrategy&&this._scrollStrategy.disable();let e=this._portalOutlet.detach();return this._detachments.next(),this._completeDetachContent(),this._keyboardDispatcher.remove(this),this._detachContentWhenEmpty(),this._locationChanges.unsubscribe(),this._outsideClickDispatcher.remove(this),e}dispose(){if(this._disposed)return;let e=this.hasAttached();this._positionStrategy&&this._positionStrategy.dispose(),this._disposeScrollStrategy(),this._backdropRef?.dispose(),this._locationChanges.unsubscribe(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),this._outsidePointerEvents.complete(),this._outsideClickDispatcher.remove(this),this._host?.remove(),this._afterNextRenderRef?.destroy(),this._previousHostParent=this._pane=this._host=this._backdropRef=null,e&&this._detachments.next(),this._detachments.complete(),this._completeDetachContent(),this._disposed=!0}hasAttached(){return this._portalOutlet.hasAttached()}backdropClick(){return this._backdropClick}attachments(){return this._attachments}detachments(){return this._detachments}keydownEvents(){return this._keydownEvents}outsidePointerEvents(){return this._outsidePointerEvents}getConfig(){return this._config}updatePosition(){this._positionStrategy&&this._positionStrategy.apply()}updatePositionStrategy(e){e!==this._positionStrategy&&(this._positionStrategy&&this._positionStrategy.dispose(),this._positionStrategy=e,this.hasAttached()&&(e.attach(this),this.updatePosition()))}updateSize(e){this._config=P(P({},this._config),e),this._updateElementSize()}setDirection(e){this._config=$A(P({},this._config),{direction:e}),this._updateElementDirection()}addPanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!0)}removePanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!1)}getDirection(){let e=this._config.direction;return e?typeof e=="string"?e:e.value:"ltr"}updateScrollStrategy(e){e!==this._scrollStrategy&&(this._disposeScrollStrategy(),this._scrollStrategy=e,this.hasAttached()&&(e.attach(this),e.enable()))}_updateElementDirection(){this._host.setAttribute("dir",this.getDirection())}_updateElementSize(){if(!this._pane)return;let e=this._pane.style;e.width=Wa(this._config.width),e.height=Wa(this._config.height),e.minWidth=Wa(this._config.minWidth),e.minHeight=Wa(this._config.minHeight),e.maxWidth=Wa(this._config.maxWidth),e.maxHeight=Wa(this._config.maxHeight)}_togglePointerEvents(e){this._pane.style.pointerEvents=e?"":"none"}_attachHost(){if(!this._host.parentElement){let e=this._config.usePopover?this._positionStrategy?.getPopoverInsertionPoint?.():null;a7(e)?e.after(this._host):e?.type==="parent"?e.element.appendChild(this._host):this._previousHostParent?.appendChild(this._host)}if(this._config.usePopover)try{this._host.showPopover()}catch(e){}}_attachBackdrop(){let e="cdk-overlay-backdrop-showing";this._backdropRef?.dispose(),this._backdropRef=new o7(this._document,this._renderer,this._ngZone,A=>{this._backdropClick.next(A)}),this._animationsDisabled&&this._backdropRef.element.classList.add("cdk-overlay-backdrop-noop-animation"),this._config.backdropClass&&this._toggleClasses(this._backdropRef.element,this._config.backdropClass,!0),this._config.usePopover?this._host.prepend(this._backdropRef.element):this._host.parentElement.insertBefore(this._backdropRef.element,this._host),!this._animationsDisabled&&typeof requestAnimationFrame<"u"?this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>this._backdropRef?.element.classList.add(e))}):this._backdropRef.element.classList.add(e)}_updateStackingOrder(){!this._config.usePopover&&this._host.nextSibling&&this._host.parentNode.appendChild(this._host)}detachBackdrop(){this._animationsDisabled?(this._backdropRef?.dispose(),this._backdropRef=null):this._backdropRef?.detach()}_toggleClasses(e,A,t){let n=GI(A||[]).filter(o=>!!o);n.length&&(t?e.classList.add(...n):e.classList.remove(...n))}_detachContentWhenEmpty(){let e=!1;try{this._detachContentAfterRenderRef=ao(()=>{e=!0,this._detachContent()},{injector:this._injector})}catch(A){if(e)throw A;this._detachContent()}globalThis.MutationObserver&&this._pane&&(this._detachContentMutationObserver||=new globalThis.MutationObserver(()=>{this._detachContent()}),this._detachContentMutationObserver.observe(this._pane,{childList:!0}))}_detachContent(){(!this._pane||!this._host||this._pane.children.length===0)&&(this._pane&&this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!1),this._host&&this._host.parentElement&&(this._previousHostParent=this._host.parentElement,this._host.remove()),this._completeDetachContent())}_completeDetachContent(){this._detachContentAfterRenderRef?.destroy(),this._detachContentAfterRenderRef=void 0,this._detachContentMutationObserver?.disconnect()}_disposeScrollStrategy(){let e=this._scrollStrategy;e?.disable(),e?.detach?.()}},UU="cdk-overlay-connected-position-bounding-box",taA=/([A-Za-z%]+)$/;function od(i,e){return new am(e,i.get(Ns),i.get(ci),i.get(Qi),i.get(sm))}var am=class{_viewportRuler;_document;_platform;_overlayContainer;_overlayRef;_isInitialRender=!1;_lastBoundingBoxSize={width:0,height:0};_isPushed=!1;_canPush=!0;_growAfterOpen=!1;_hasFlexibleDimensions=!0;_positionLocked=!1;_originRect;_overlayRect;_viewportRect;_containerRect;_viewportMargin=0;_scrollables=[];_preferredPositions=[];_origin;_pane;_isDisposed=!1;_boundingBox=null;_lastPosition=null;_lastScrollVisibility=null;_positionChanges=new ne;_resizeSubscription=Oo.EMPTY;_offsetX=0;_offsetY=0;_transformOriginSelector;_appliedPanelClasses=[];_previousPushAmount=null;_popoverLocation="global";positionChanges=this._positionChanges;get positions(){return this._preferredPositions}constructor(e,A,t,n,o){this._viewportRuler=A,this._document=t,this._platform=n,this._overlayContainer=o,this.setOrigin(e)}attach(e){this._overlayRef&&this._overlayRef,this._validatePositions(),e.hostElement.classList.add(UU),this._overlayRef=e,this._boundingBox=e.hostElement,this._pane=e.overlayElement,this._isDisposed=!1,this._isInitialRender=!0,this._lastPosition=null,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(()=>{this._isInitialRender=!0,this.apply()})}apply(){if(this._isDisposed||!this._platform.isBrowser)return;if(!this._isInitialRender&&this._positionLocked&&this._lastPosition){this.reapplyLastPosition();return}this._clearPanelClasses(),this._resetOverlayElementStyles(),this._resetBoundingBoxStyles(),this._viewportRect=this._getNarrowedViewportRect(),this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._containerRect=this._getContainerRect();let e=this._originRect,A=this._overlayRect,t=this._viewportRect,n=this._containerRect,o=[],a;for(let r of this._preferredPositions){let s=this._getOriginPoint(e,n,r),l=this._getOverlayPoint(s,A,r),g=this._getOverlayFit(l,A,t,r);if(g.isCompletelyWithinViewport){this._isPushed=!1,this._applyPosition(r,s);return}if(this._canFitWithFlexibleDimensions(g,l,t)){o.push({position:r,origin:s,overlayRect:A,boundingBoxRect:this._calculateBoundingBoxRect(s,r)});continue}(!a||a.overlayFit.visibleAreas&&(s=g,r=l)}this._isPushed=!1,this._applyPosition(r.position,r.origin);return}if(this._canPush){this._isPushed=!0,this._applyPosition(a.position,a.originPoint);return}this._applyPosition(a.position,a.originPoint)}detach(){this._clearPanelClasses(),this._lastPosition=null,this._previousPushAmount=null,this._resizeSubscription.unsubscribe()}dispose(){this._isDisposed||(this._boundingBox&&nd(this._boundingBox.style,{top:"",left:"",right:"",bottom:"",height:"",width:"",alignItems:"",justifyContent:""}),this._pane&&this._resetOverlayElementStyles(),this._overlayRef&&this._overlayRef.hostElement.classList.remove(UU),this.detach(),this._positionChanges.complete(),this._overlayRef=this._boundingBox=null,this._isDisposed=!0)}reapplyLastPosition(){if(this._isDisposed||!this._platform.isBrowser)return;let e=this._lastPosition;e?(this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._viewportRect=this._getNarrowedViewportRect(),this._containerRect=this._getContainerRect(),this._applyPosition(e,this._getOriginPoint(this._originRect,this._containerRect,e))):this.apply()}withScrollableContainers(e){return this._scrollables=e,this}withPositions(e){return this._preferredPositions=e,e.indexOf(this._lastPosition)===-1&&(this._lastPosition=null),this._validatePositions(),this}withViewportMargin(e){return this._viewportMargin=e,this}withFlexibleDimensions(e=!0){return this._hasFlexibleDimensions=e,this}withGrowAfterOpen(e=!0){return this._growAfterOpen=e,this}withPush(e=!0){return this._canPush=e,this}withLockedPosition(e=!0){return this._positionLocked=e,this}setOrigin(e){return this._origin=e,this}withDefaultOffsetX(e){return this._offsetX=e,this}withDefaultOffsetY(e){return this._offsetY=e,this}withTransformOriginOn(e){return this._transformOriginSelector=e,this}withPopoverLocation(e){return this._popoverLocation=e,this}getPopoverInsertionPoint(){return this._popoverLocation==="global"?null:this._popoverLocation!=="inline"?this._popoverLocation:this._origin instanceof ce?this._origin.nativeElement:a7(this._origin)?this._origin:null}_getOriginPoint(e,A,t){let n;if(t.originX=="center")n=e.left+e.width/2;else{let a=this._isRtl()?e.right:e.left,r=this._isRtl()?e.left:e.right;n=t.originX=="start"?a:r}A.left<0&&(n-=A.left);let o;return t.originY=="center"?o=e.top+e.height/2:o=t.originY=="top"?e.top:e.bottom,A.top<0&&(o-=A.top),{x:n,y:o}}_getOverlayPoint(e,A,t){let n;t.overlayX=="center"?n=-A.width/2:t.overlayX==="start"?n=this._isRtl()?-A.width:0:n=this._isRtl()?0:-A.width;let o;return t.overlayY=="center"?o=-A.height/2:o=t.overlayY=="top"?0:-A.height,{x:e.x+n,y:e.y+o}}_getOverlayFit(e,A,t,n){let o=OU(A),{x:a,y:r}=e,s=this._getOffset(n,"x"),l=this._getOffset(n,"y");s&&(a+=s),l&&(r+=l);let g=0-a,C=a+o.width-t.width,d=0-r,B=r+o.height-t.height,u=this._subtractOverflows(o.width,g,C),E=this._subtractOverflows(o.height,d,B),f=u*E;return{visibleArea:f,isCompletelyWithinViewport:o.width*o.height===f,fitsInViewportVertically:E===o.height,fitsInViewportHorizontally:u==o.width}}_canFitWithFlexibleDimensions(e,A,t){if(this._hasFlexibleDimensions){let n=t.bottom-A.y,o=t.right-A.x,a=TU(this._overlayRef.getConfig().minHeight),r=TU(this._overlayRef.getConfig().minWidth),s=e.fitsInViewportVertically||a!=null&&a<=n,l=e.fitsInViewportHorizontally||r!=null&&r<=o;return s&&l}return!1}_pushOverlayOnScreen(e,A,t){if(this._previousPushAmount&&this._positionLocked)return{x:e.x+this._previousPushAmount.x,y:e.y+this._previousPushAmount.y};let n=OU(A),o=this._viewportRect,a=Math.max(e.x+n.width-o.width,0),r=Math.max(e.y+n.height-o.height,0),s=Math.max(o.top-t.top-e.y,0),l=Math.max(o.left-t.left-e.x,0),g=0,C=0;return n.width<=o.width?g=l||-a:g=e.xu&&!this._isInitialRender&&!this._growAfterOpen&&(a=e.y-u/2)}let s=A.overlayX==="start"&&!n||A.overlayX==="end"&&n,l=A.overlayX==="end"&&!n||A.overlayX==="start"&&n,g,C,d;if(l)d=t.width-e.x+this._getViewportMarginStart()+this._getViewportMarginEnd(),g=e.x-this._getViewportMarginStart();else if(s)C=e.x,g=t.right-e.x-this._getViewportMarginEnd();else{let B=Math.min(t.right-e.x+t.left,e.x),u=this._lastBoundingBoxSize.width;g=B*2,C=e.x-B,g>u&&!this._isInitialRender&&!this._growAfterOpen&&(C=e.x-u/2)}return{top:a,left:C,bottom:r,right:d,width:g,height:o}}_setBoundingBoxStyles(e,A){let t=this._calculateBoundingBoxRect(e,A);!this._isInitialRender&&!this._growAfterOpen&&(t.height=Math.min(t.height,this._lastBoundingBoxSize.height),t.width=Math.min(t.width,this._lastBoundingBoxSize.width));let n={};if(this._hasExactPosition())n.top=n.left="0",n.bottom=n.right="auto",n.maxHeight=n.maxWidth="",n.width=n.height="100%";else{let o=this._overlayRef.getConfig().maxHeight,a=this._overlayRef.getConfig().maxWidth;n.width=Wa(t.width),n.height=Wa(t.height),n.top=Wa(t.top)||"auto",n.bottom=Wa(t.bottom)||"auto",n.left=Wa(t.left)||"auto",n.right=Wa(t.right)||"auto",A.overlayX==="center"?n.alignItems="center":n.alignItems=A.overlayX==="end"?"flex-end":"flex-start",A.overlayY==="center"?n.justifyContent="center":n.justifyContent=A.overlayY==="bottom"?"flex-end":"flex-start",o&&(n.maxHeight=Wa(o)),a&&(n.maxWidth=Wa(a))}this._lastBoundingBoxSize=t,nd(this._boundingBox.style,n)}_resetBoundingBoxStyles(){nd(this._boundingBox.style,{top:"0",left:"0",right:"0",bottom:"0",height:"",width:"",alignItems:"",justifyContent:""})}_resetOverlayElementStyles(){nd(this._pane.style,{top:"",left:"",bottom:"",right:"",position:"",transform:""})}_setOverlayElementStyles(e,A){let t={},n=this._hasExactPosition(),o=this._hasFlexibleDimensions,a=this._overlayRef.getConfig();if(n){let g=this._viewportRuler.getViewportScrollPosition();nd(t,this._getExactOverlayY(A,e,g)),nd(t,this._getExactOverlayX(A,e,g))}else t.position="static";let r="",s=this._getOffset(A,"x"),l=this._getOffset(A,"y");s&&(r+=`translateX(${s}px) `),l&&(r+=`translateY(${l}px)`),t.transform=r.trim(),a.maxHeight&&(n?t.maxHeight=Wa(a.maxHeight):o&&(t.maxHeight="")),a.maxWidth&&(n?t.maxWidth=Wa(a.maxWidth):o&&(t.maxWidth="")),nd(this._pane.style,t)}_getExactOverlayY(e,A,t){let n={top:"",bottom:""},o=this._getOverlayPoint(A,this._overlayRect,e);if(this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,t)),e.overlayY==="bottom"){let a=this._document.documentElement.clientHeight;n.bottom=`${a-(o.y+this._overlayRect.height)}px`}else n.top=Wa(o.y);return n}_getExactOverlayX(e,A,t){let n={left:"",right:""},o=this._getOverlayPoint(A,this._overlayRect,e);this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,t));let a;if(this._isRtl()?a=e.overlayX==="end"?"left":"right":a=e.overlayX==="end"?"right":"left",a==="right"){let r=this._document.documentElement.clientWidth;n.right=`${r-(o.x+this._overlayRect.width)}px`}else n.left=Wa(o.x);return n}_getScrollVisibility(){let e=this._getOriginRect(),A=this._pane.getBoundingClientRect(),t=this._scrollables.map(n=>n.getElementRef().nativeElement.getBoundingClientRect());return{isOriginClipped:GU(e,t),isOriginOutsideView:n7(e,t),isOverlayClipped:GU(A,t),isOverlayOutsideView:n7(A,t)}}_subtractOverflows(e,...A){return A.reduce((t,n)=>t-Math.max(n,0),e)}_getNarrowedViewportRect(){let e=this._document.documentElement.clientWidth,A=this._document.documentElement.clientHeight,t=this._viewportRuler.getViewportScrollPosition();return{top:t.top+this._getViewportMarginTop(),left:t.left+this._getViewportMarginStart(),right:t.left+e-this._getViewportMarginEnd(),bottom:t.top+A-this._getViewportMarginBottom(),width:e-this._getViewportMarginStart()-this._getViewportMarginEnd(),height:A-this._getViewportMarginTop()-this._getViewportMarginBottom()}}_isRtl(){return this._overlayRef.getDirection()==="rtl"}_hasExactPosition(){return!this._hasFlexibleDimensions||this._isPushed}_getOffset(e,A){return A==="x"?e.offsetX==null?this._offsetX:e.offsetX:e.offsetY==null?this._offsetY:e.offsetY}_validatePositions(){}_addPanelClasses(e){this._pane&&GI(e).forEach(A=>{A!==""&&this._appliedPanelClasses.indexOf(A)===-1&&(this._appliedPanelClasses.push(A),this._pane.classList.add(A))})}_clearPanelClasses(){this._pane&&(this._appliedPanelClasses.forEach(e=>{this._pane.classList.remove(e)}),this._appliedPanelClasses=[])}_getViewportMarginStart(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.start??0}_getViewportMarginEnd(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.end??0}_getViewportMarginTop(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.top??0}_getViewportMarginBottom(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.bottom??0}_getOriginRect(){let e=this._origin;if(e instanceof ce)return e.nativeElement.getBoundingClientRect();if(e instanceof Element)return e.getBoundingClientRect();let A=e.width||0,t=e.height||0;return{top:e.y,bottom:e.y+t,left:e.x,right:e.x+A,height:t,width:A}}_getContainerRect(){let e=this._overlayRef.getConfig().usePopover&&this._popoverLocation!=="global",A=this._overlayContainer.getContainerElement();e&&(A.style.display="block");let t=A.getBoundingClientRect();return e&&(A.style.display=""),t}};function nd(i,e){for(let A in e)e.hasOwnProperty(A)&&(i[A]=e[A]);return i}function TU(i){if(typeof i!="number"&&i!=null){let[e,A]=i.split(taA);return!A||A==="px"?parseFloat(e):null}return i||null}function OU(i){return{top:Math.floor(i.top),right:Math.floor(i.right),bottom:Math.floor(i.bottom),left:Math.floor(i.left),width:Math.floor(i.width),height:Math.floor(i.height)}}function iaA(i,e){return i===e?!0:i.isOriginClipped===e.isOriginClipped&&i.isOriginOutsideView===e.isOriginOutsideView&&i.isOverlayClipped===e.isOverlayClipped&&i.isOverlayOutsideView===e.isOverlayOutsideView}var JU="cdk-global-overlay-wrapper";function o2(i){return new rm}var rm=class{_overlayRef;_cssPosition="static";_topOffset="";_bottomOffset="";_alignItems="";_xPosition="";_xOffset="";_width="";_height="";_isDisposed=!1;attach(e){let A=e.getConfig();this._overlayRef=e,this._width&&!A.width&&e.updateSize({width:this._width}),this._height&&!A.height&&e.updateSize({height:this._height}),e.hostElement.classList.add(JU),this._isDisposed=!1}top(e=""){return this._bottomOffset="",this._topOffset=e,this._alignItems="flex-start",this}left(e=""){return this._xOffset=e,this._xPosition="left",this}bottom(e=""){return this._topOffset="",this._bottomOffset=e,this._alignItems="flex-end",this}right(e=""){return this._xOffset=e,this._xPosition="right",this}start(e=""){return this._xOffset=e,this._xPosition="start",this}end(e=""){return this._xOffset=e,this._xPosition="end",this}width(e=""){return this._overlayRef?this._overlayRef.updateSize({width:e}):this._width=e,this}height(e=""){return this._overlayRef?this._overlayRef.updateSize({height:e}):this._height=e,this}centerHorizontally(e=""){return this.left(e),this._xPosition="center",this}centerVertically(e=""){return this.top(e),this._alignItems="center",this}apply(){if(!this._overlayRef||!this._overlayRef.hasAttached())return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement.style,t=this._overlayRef.getConfig(),{width:n,height:o,maxWidth:a,maxHeight:r}=t,s=(n==="100%"||n==="100vw")&&(!a||a==="100%"||a==="100vw"),l=(o==="100%"||o==="100vh")&&(!r||r==="100%"||r==="100vh"),g=this._xPosition,C=this._xOffset,d=this._overlayRef.getConfig().direction==="rtl",B="",u="",E="";s?E="flex-start":g==="center"?(E="center",d?u=C:B=C):d?g==="left"||g==="end"?(E="flex-end",B=C):(g==="right"||g==="start")&&(E="flex-start",u=C):g==="left"||g==="start"?(E="flex-start",B=C):(g==="right"||g==="end")&&(E="flex-end",u=C),e.position=this._cssPosition,e.marginLeft=s?"0":B,e.marginTop=l?"0":this._topOffset,e.marginBottom=this._bottomOffset,e.marginRight=s?"0":u,A.justifyContent=E,A.alignItems=l?"flex-start":this._alignItems}dispose(){if(this._isDisposed||!this._overlayRef)return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement,t=A.style;A.classList.remove(JU),t.justifyContent=t.alignItems=e.marginTop=e.marginBottom=e.marginLeft=e.marginRight=e.position="",this._overlayRef=null,this._isDisposed=!0}},lm=(()=>{class i{_injector=w(St);constructor(){}global(){return o2()}flexibleConnectedTo(A){return od(this._injector,A)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),ou=new MA("OVERLAY_DEFAULT_CONFIG");function Pg(i,e){i.get(Eo).load(VU);let A=i.get(sm),t=i.get(ci),n=i.get(Dn),o=i.get(F0),a=i.get(No),r=i.get(on,null,{optional:!0})||i.get(zr).createRenderer(null,null),s=new Hg(e),l=i.get(ou,null,{optional:!0})?.usePopover??!0;s.direction=s.direction||a.value,"showPopover"in t.body?s.usePopover=e?.usePopover??l:s.usePopover=!1;let g=t.createElement("div"),C=t.createElement("div");g.id=n.getId("cdk-overlay-"),g.classList.add("cdk-overlay-pane"),C.appendChild(g),s.usePopover&&(C.setAttribute("popover","manual"),C.classList.add("cdk-overlay-popover"));let d=s.usePopover?s.positionStrategy?.getPopoverInsertionPoint?.():null;return a7(d)?d.after(C):d?.type==="parent"?d.element.appendChild(C):A.getContainerElement().appendChild(C),new CB(new iu(g,o,i),C,g,s,i.get(We),i.get(PU),t,i.get(Gc),i.get(jU),e?.disableAnimations??i.get(b1,null,{optional:!0})==="NoopAnimations",i.get(Hr),r)}var ad=(()=>{class i{scrollStrategies=w(HU);_positionBuilder=w(lm);_injector=w(St);constructor(){}create(A){return Pg(this._injector,A)}position(){return this._positionBuilder}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),naA=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],oaA=new MA("cdk-connected-overlay-scroll-strategy",{providedIn:"root",factory:()=>{let i=w(St);return()=>V0(i)}}),dB=(()=>{class i{elementRef=w(ce);constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdk-overlay-origin",""],["","overlay-origin",""],["","cdkOverlayOrigin",""]],exportAs:["cdkOverlayOrigin"]})}return i})(),qU=new MA("cdk-connected-overlay-default-config"),gm=(()=>{class i{_dir=w(No,{optional:!0});_injector=w(St);_overlayRef;_templatePortal;_backdropSubscription=Oo.EMPTY;_attachSubscription=Oo.EMPTY;_detachSubscription=Oo.EMPTY;_positionSubscription=Oo.EMPTY;_offsetX;_offsetY;_position;_scrollStrategyFactory=w(oaA);_ngZone=w(We);origin;positions;positionStrategy;get offsetX(){return this._offsetX}set offsetX(A){this._offsetX=A,this._position&&this._updatePositionStrategy(this._position)}get offsetY(){return this._offsetY}set offsetY(A){this._offsetY=A,this._position&&this._updatePositionStrategy(this._position)}width;height;minWidth;minHeight;backdropClass;panelClass;viewportMargin=0;scrollStrategy;open=!1;disableClose=!1;transformOriginSelector;hasBackdrop=!1;lockPosition=!1;flexibleDimensions=!1;growAfterOpen=!1;push=!1;disposeOnNavigation=!1;usePopover;matchWidth=!1;set _config(A){typeof A!="string"&&this._assignConfig(A)}backdropClick=new FA;positionChange=new FA;attach=new FA;detach=new FA;overlayKeydown=new FA;overlayOutsideClick=new FA;constructor(){let A=w(wo),t=w(Jo),n=w(qU,{optional:!0}),o=w(ou,{optional:!0});this.usePopover=o?.usePopover===!1?null:"global",this._templatePortal=new jr(A,t),this.scrollStrategy=this._scrollStrategyFactory(),n&&this._assignConfig(n)}get overlayRef(){return this._overlayRef}get dir(){return this._dir?this._dir.value:"ltr"}ngOnDestroy(){this._attachSubscription.unsubscribe(),this._detachSubscription.unsubscribe(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._overlayRef?.dispose()}ngOnChanges(A){this._position&&(this._updatePositionStrategy(this._position),this._overlayRef?.updateSize({width:this._getWidth(),minWidth:this.minWidth,height:this.height,minHeight:this.minHeight}),A.origin&&this.open&&this._position.apply()),A.open&&(this.open?this.attachOverlay():this.detachOverlay())}_createOverlay(){(!this.positions||!this.positions.length)&&(this.positions=naA);let A=this._overlayRef=Pg(this._injector,this._buildConfig());this._attachSubscription=A.attachments().subscribe(()=>this.attach.emit()),this._detachSubscription=A.detachments().subscribe(()=>this.detach.emit()),A.keydownEvents().subscribe(t=>{this.overlayKeydown.next(t),t.keyCode===27&&!this.disableClose&&!Sa(t)&&(t.preventDefault(),this.detachOverlay())}),this._overlayRef.outsidePointerEvents().subscribe(t=>{let n=this._getOriginElement(),o=Pr(t);(!n||n!==o&&!n.contains(o))&&this.overlayOutsideClick.next(t)})}_buildConfig(){let A=this._position=this.positionStrategy||this._createPositionStrategy(),t=new Hg({direction:this._dir||"ltr",positionStrategy:A,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop,disposeOnNavigation:this.disposeOnNavigation,usePopover:!!this.usePopover});return(this.height||this.height===0)&&(t.height=this.height),(this.minWidth||this.minWidth===0)&&(t.minWidth=this.minWidth),(this.minHeight||this.minHeight===0)&&(t.minHeight=this.minHeight),this.backdropClass&&(t.backdropClass=this.backdropClass),this.panelClass&&(t.panelClass=this.panelClass),t}_updatePositionStrategy(A){let t=this.positions.map(n=>({originX:n.originX,originY:n.originY,overlayX:n.overlayX,overlayY:n.overlayY,offsetX:n.offsetX||this.offsetX,offsetY:n.offsetY||this.offsetY,panelClass:n.panelClass||void 0}));return A.setOrigin(this._getOrigin()).withPositions(t).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector).withPopoverLocation(this.usePopover===null?"global":this.usePopover)}_createPositionStrategy(){let A=od(this._injector,this._getOrigin());return this._updatePositionStrategy(A),A}_getOrigin(){return this.origin instanceof dB?this.origin.elementRef:this.origin}_getOriginElement(){return this.origin instanceof dB?this.origin.elementRef.nativeElement:this.origin instanceof ce?this.origin.nativeElement:typeof Element<"u"&&this.origin instanceof Element?this.origin:null}_getWidth(){return this.width?this.width:this.matchWidth?this._getOriginElement()?.getBoundingClientRect?.().width:void 0}attachOverlay(){this._overlayRef||this._createOverlay();let A=this._overlayRef;A.getConfig().hasBackdrop=this.hasBackdrop,A.updateSize({width:this._getWidth()}),A.hasAttached()||A.attach(this._templatePortal),this.hasBackdrop?this._backdropSubscription=A.backdropClick().subscribe(t=>this.backdropClick.emit(t)):this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.positionChange.observers.length>0&&(this._positionSubscription=this._position.positionChanges.pipe(uN(()=>this.positionChange.observers.length>0)).subscribe(t=>{this._ngZone.run(()=>this.positionChange.emit(t)),this.positionChange.observers.length===0&&this._positionSubscription.unsubscribe()})),this.open=!0}detachOverlay(){this._overlayRef?.detach(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.open=!1}_assignConfig(A){this.origin=A.origin??this.origin,this.positions=A.positions??this.positions,this.positionStrategy=A.positionStrategy??this.positionStrategy,this.offsetX=A.offsetX??this.offsetX,this.offsetY=A.offsetY??this.offsetY,this.width=A.width??this.width,this.height=A.height??this.height,this.minWidth=A.minWidth??this.minWidth,this.minHeight=A.minHeight??this.minHeight,this.backdropClass=A.backdropClass??this.backdropClass,this.panelClass=A.panelClass??this.panelClass,this.viewportMargin=A.viewportMargin??this.viewportMargin,this.scrollStrategy=A.scrollStrategy??this.scrollStrategy,this.disableClose=A.disableClose??this.disableClose,this.transformOriginSelector=A.transformOriginSelector??this.transformOriginSelector,this.hasBackdrop=A.hasBackdrop??this.hasBackdrop,this.lockPosition=A.lockPosition??this.lockPosition,this.flexibleDimensions=A.flexibleDimensions??this.flexibleDimensions,this.growAfterOpen=A.growAfterOpen??this.growAfterOpen,this.push=A.push??this.push,this.disposeOnNavigation=A.disposeOnNavigation??this.disposeOnNavigation,this.usePopover=A.usePopover??this.usePopover,this.matchWidth=A.matchWidth??this.matchWidth}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdk-connected-overlay",""],["","connected-overlay",""],["","cdkConnectedOverlay",""]],inputs:{origin:[0,"cdkConnectedOverlayOrigin","origin"],positions:[0,"cdkConnectedOverlayPositions","positions"],positionStrategy:[0,"cdkConnectedOverlayPositionStrategy","positionStrategy"],offsetX:[0,"cdkConnectedOverlayOffsetX","offsetX"],offsetY:[0,"cdkConnectedOverlayOffsetY","offsetY"],width:[0,"cdkConnectedOverlayWidth","width"],height:[0,"cdkConnectedOverlayHeight","height"],minWidth:[0,"cdkConnectedOverlayMinWidth","minWidth"],minHeight:[0,"cdkConnectedOverlayMinHeight","minHeight"],backdropClass:[0,"cdkConnectedOverlayBackdropClass","backdropClass"],panelClass:[0,"cdkConnectedOverlayPanelClass","panelClass"],viewportMargin:[0,"cdkConnectedOverlayViewportMargin","viewportMargin"],scrollStrategy:[0,"cdkConnectedOverlayScrollStrategy","scrollStrategy"],open:[0,"cdkConnectedOverlayOpen","open"],disableClose:[0,"cdkConnectedOverlayDisableClose","disableClose"],transformOriginSelector:[0,"cdkConnectedOverlayTransformOriginOn","transformOriginSelector"],hasBackdrop:[2,"cdkConnectedOverlayHasBackdrop","hasBackdrop",Qe],lockPosition:[2,"cdkConnectedOverlayLockPosition","lockPosition",Qe],flexibleDimensions:[2,"cdkConnectedOverlayFlexibleDimensions","flexibleDimensions",Qe],growAfterOpen:[2,"cdkConnectedOverlayGrowAfterOpen","growAfterOpen",Qe],push:[2,"cdkConnectedOverlayPush","push",Qe],disposeOnNavigation:[2,"cdkConnectedOverlayDisposeOnNavigation","disposeOnNavigation",Qe],usePopover:[0,"cdkConnectedOverlayUsePopover","usePopover"],matchWidth:[2,"cdkConnectedOverlayMatchWidth","matchWidth",Qe],_config:[0,"cdkConnectedOverlay","_config"]},outputs:{backdropClick:"backdropClick",positionChange:"positionChange",attach:"attach",detach:"detach",overlayKeydown:"overlayKeydown",overlayOutsideClick:"overlayOutsideClick"},exportAs:["cdkConnectedOverlay"],features:[ii]})}return i})(),eg=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({providers:[ad],imports:[Di,Wc,em,em]})}return i})();function aaA(i,e){}var a2=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;closePredicate;width="";height="";minWidth;minHeight;maxWidth;maxHeight;positionStrategy;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;scrollStrategy;closeOnNavigation=!0;closeOnDestroy=!0;closeOnOverlayDetachments=!0;disableAnimations=!1;providers;container;templateContext};var s7=(()=>{class i extends n2{_elementRef=w(ce);_focusTrapFactory=w(BQ);_config;_interactivityChecker=w(UI);_ngZone=w(We);_focusMonitor=w(rr);_renderer=w(on);_changeDetectorRef=w(Mt);_injector=w(St);_platform=w(Qi);_document=w(ci);_portalOutlet;_focusTrapped=new ne;_focusTrap=null;_elementFocusedBeforeDialogWasOpened=null;_closeInteractionType=null;_ariaLabelledByQueue=[];_isDestroyed=!1;constructor(){super(),this._config=w(a2,{optional:!0})||new a2,this._config.ariaLabelledBy&&this._ariaLabelledByQueue.push(this._config.ariaLabelledBy)}_addAriaLabelledBy(A){this._ariaLabelledByQueue.push(A),this._changeDetectorRef.markForCheck()}_removeAriaLabelledBy(A){let t=this._ariaLabelledByQueue.indexOf(A);t>-1&&(this._ariaLabelledByQueue.splice(t,1),this._changeDetectorRef.markForCheck())}_contentAttached(){this._initializeFocusTrap(),this._captureInitialFocus()}_captureInitialFocus(){this._trapFocus()}ngOnDestroy(){this._focusTrapped.complete(),this._isDestroyed=!0,this._restoreFocus()}attachComponentPortal(A){this._portalOutlet.hasAttached();let t=this._portalOutlet.attachComponentPortal(A);return this._contentAttached(),t}attachTemplatePortal(A){this._portalOutlet.hasAttached();let t=this._portalOutlet.attachTemplatePortal(A);return this._contentAttached(),t}attachDomPortal=A=>{this._portalOutlet.hasAttached();let t=this._portalOutlet.attachDomPortal(A);return this._contentAttached(),t};_recaptureFocus(){this._containsFocus()||this._trapFocus()}_forceFocus(A,t){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),a(),A.removeAttribute("tabindex")},o=this._renderer.listen(A,"blur",n),a=this._renderer.listen(A,"mousedown",n)})),A.focus(t)}_focusByCssSelector(A,t){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,t)}_trapFocus(A){this._isDestroyed||ao(()=>{let t=this._elementRef.nativeElement;switch(this._config.autoFocus){case!1:case"dialog":this._containsFocus()||t.focus(A);break;case!0:case"first-tabbable":this._focusTrap?.focusInitialElement(A)||this._focusDialogContainer(A);break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]',A);break;default:this._focusByCssSelector(this._config.autoFocus,A);break}this._focusTrapped.next()},{injector:this._injector})}_restoreFocus(){let A=this._config.restoreFocus,t=null;if(typeof A=="string"?t=this._document.querySelector(A):typeof A=="boolean"?t=A?this._elementFocusedBeforeDialogWasOpened:null:A&&(t=A),this._config.restoreFocus&&t&&typeof t.focus=="function"){let n=cQ(),o=this._elementRef.nativeElement;(!n||n===this._document.body||n===o||o.contains(n))&&(this._focusMonitor?(this._focusMonitor.focusVia(t,this._closeInteractionType),this._closeInteractionType=null):t.focus())}this._focusTrap&&this._focusTrap.destroy()}_focusDialogContainer(A){this._elementRef.nativeElement.focus?.(A)}_containsFocus(){let A=this._elementRef.nativeElement,t=cQ();return A===t||A.contains(t)}_initializeFocusTrap(){this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._document&&(this._elementFocusedBeforeDialogWasOpened=cQ()))}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["cdk-dialog-container"]],viewQuery:function(t,n){if(t&1&&Wt(Ag,7),t&2){let o;se(o=le())&&(n._portalOutlet=o.first)}},hostAttrs:["tabindex","-1",1,"cdk-dialog-container"],hostVars:6,hostBindings:function(t,n){t&2&&ie("id",n._config.id||null)("role",n._config.role)("aria-modal",n._config.ariaModal)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null)},features:[bt],decls:1,vars:0,consts:[["cdkPortalOutlet",""]],template:function(t,n){t&1&&kt(0,aaA,0,0,"ng-template",0)},dependencies:[Ag],styles:[`.cdk-dialog-container{display:block;width:100%;height:100%;min-height:inherit;max-height:inherit} -`],encapsulation:2})}return i})(),au=class{overlayRef;config;componentInstance=null;componentRef=null;containerInstance;disableClose;closed=new ne;backdropClick;keydownEvents;outsidePointerEvents;id;_detachSubscription;constructor(e,A){this.overlayRef=e,this.config=A,this.disableClose=A.disableClose,this.backdropClick=e.backdropClick(),this.keydownEvents=e.keydownEvents(),this.outsidePointerEvents=e.outsidePointerEvents(),this.id=A.id,this.keydownEvents.subscribe(t=>{t.keyCode===27&&!this.disableClose&&!Sa(t)&&(t.preventDefault(),this.close(void 0,{focusOrigin:"keyboard"}))}),this.backdropClick.subscribe(()=>{!this.disableClose&&this._canClose()?this.close(void 0,{focusOrigin:"mouse"}):this.containerInstance._recaptureFocus?.()}),this._detachSubscription=e.detachments().subscribe(()=>{A.closeOnOverlayDetachments!==!1&&this.close()})}close(e,A){if(this._canClose(e)){let t=this.closed;this.containerInstance._closeInteractionType=A?.focusOrigin||"program",this._detachSubscription.unsubscribe(),this.overlayRef.dispose(),t.next(e),t.complete(),this.componentInstance=this.containerInstance=null}}updatePosition(){return this.overlayRef.updatePosition(),this}updateSize(e="",A=""){return this.overlayRef.updateSize({width:e,height:A}),this}addPanelClass(e){return this.overlayRef.addPanelClass(e),this}removePanelClass(e){return this.overlayRef.removePanelClass(e),this}_canClose(e){let A=this.config;return!!this.containerInstance&&(!A.closePredicate||A.closePredicate(e,A,this.componentInstance))}},raA=new MA("DialogScrollStrategy",{providedIn:"root",factory:()=>{let i=w(St);return()=>IB(i)}}),saA=new MA("DialogData"),laA=new MA("DefaultDialogConfig");function gaA(i){let e=mA(i),A=new FA;return{valueSignal:e,get value(){return e()},change:A,ngOnDestroy(){A.complete()}}}var l7=(()=>{class i{_injector=w(St);_defaultOptions=w(laA,{optional:!0});_parentDialog=w(i,{optional:!0,skipSelf:!0});_overlayContainer=w(sm);_idGenerator=w(Dn);_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new ne;_afterOpenedAtThisLevel=new ne;_ariaHiddenElements=new Map;_scrollStrategy=w(raA);get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}afterAllClosed=Rc(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(Yn(void 0)));constructor(){}open(A,t){let n=this._defaultOptions||new a2;t=P(P({},n),t),t.id=t.id||this._idGenerator.getId("cdk-dialog-"),t.id&&this.getDialogById(t.id);let o=this._getOverlayConfig(t),a=Pg(this._injector,o),r=new au(a,t),s=this._attachContainer(a,r,t);if(r.containerInstance=s,!this.openDialogs.length){let l=this._overlayContainer.getContainerElement();s._focusTrapped?s._focusTrapped.pipe(Ro(1)).subscribe(()=>{this._hideNonDialogContentFromAssistiveTechnology(l)}):this._hideNonDialogContentFromAssistiveTechnology(l)}return this._attachDialogContent(A,r,s,t),this.openDialogs.push(r),r.closed.subscribe(()=>this._removeOpenDialog(r,!0)),this.afterOpened.next(r),r}closeAll(){r7(this.openDialogs,A=>A.close())}getDialogById(A){return this.openDialogs.find(t=>t.id===A)}ngOnDestroy(){r7(this._openDialogsAtThisLevel,A=>{A.config.closeOnDestroy===!1&&this._removeOpenDialog(A,!1)}),r7(this._openDialogsAtThisLevel,A=>A.close()),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete(),this._openDialogsAtThisLevel=[]}_getOverlayConfig(A){let t=new Hg({positionStrategy:A.positionStrategy||o2().centerHorizontally().centerVertically(),scrollStrategy:A.scrollStrategy||this._scrollStrategy(),panelClass:A.panelClass,hasBackdrop:A.hasBackdrop,direction:A.direction,minWidth:A.minWidth,minHeight:A.minHeight,maxWidth:A.maxWidth,maxHeight:A.maxHeight,width:A.width,height:A.height,disposeOnNavigation:A.closeOnNavigation,disableAnimations:A.disableAnimations});return A.backdropClass&&(t.backdropClass=A.backdropClass),t}_attachContainer(A,t,n){let o=n.injector||n.viewContainerRef?.injector,a=[{provide:a2,useValue:n},{provide:au,useValue:t},{provide:CB,useValue:A}],r;n.container?typeof n.container=="function"?r=n.container:(r=n.container.type,a.push(...n.container.providers(n))):r=s7;let s=new Fs(r,n.viewContainerRef,St.create({parent:o||this._injector,providers:a}));return A.attach(s).instance}_attachDialogContent(A,t,n,o){if(A instanceof wo){let a=this._createInjector(o,t,n,void 0),r={$implicit:o.data,dialogRef:t};o.templateContext&&(r=P(P({},r),typeof o.templateContext=="function"?o.templateContext():o.templateContext)),n.attachTemplatePortal(new jr(A,null,r,a))}else{let a=this._createInjector(o,t,n,this._injector),r=n.attachComponentPortal(new Fs(A,o.viewContainerRef,a));t.componentRef=r,t.componentInstance=r.instance}}_createInjector(A,t,n,o){let a=A.injector||A.viewContainerRef?.injector,r=[{provide:saA,useValue:A.data},{provide:au,useValue:t}];return A.providers&&(typeof A.providers=="function"?r.push(...A.providers(t,A,n)):r.push(...A.providers)),A.direction&&(!a||!a.get(No,null,{optional:!0}))&&r.push({provide:No,useValue:gaA(A.direction)}),St.create({parent:a||o,providers:r})}_removeOpenDialog(A,t){let n=this.openDialogs.indexOf(A);n>-1&&(this.openDialogs.splice(n,1),this.openDialogs.length||(this._ariaHiddenElements.forEach((o,a)=>{o?a.setAttribute("aria-hidden",o):a.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),t&&this._getAfterAllClosed().next()))}_hideNonDialogContentFromAssistiveTechnology(A){if(A.parentElement){let t=A.parentElement.children;for(let n=t.length-1;n>-1;n--){let o=t[n];o!==A&&o.nodeName!=="SCRIPT"&&o.nodeName!=="STYLE"&&!o.hasAttribute("aria-live")&&!o.hasAttribute("popover")&&(this._ariaHiddenElements.set(o,o.getAttribute("aria-hidden")),o.setAttribute("aria-hidden","true"))}}}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function r7(i,e){let A=i.length;for(;A--;)e(i[A])}var WU=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({providers:[l7],imports:[eg,Wc,EQ,Wc]})}return i})();function caA(i,e){}var Cm=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;closePredicate;width="";height="";minWidth;minHeight;maxWidth;maxHeight;position;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;delayFocusTrap=!0;scrollStrategy;closeOnNavigation=!0;enterAnimationDuration;exitAnimationDuration},g7="mdc-dialog--open",ZU="mdc-dialog--opening",XU="mdc-dialog--closing",CaA=150,daA=75,IaA=(()=>{class i extends s7{_animationStateChanged=new FA;_animationsEnabled=!In();_actionSectionCount=0;_hostElement=this._elementRef.nativeElement;_enterAnimationDuration=this._animationsEnabled?AT(this._config.enterAnimationDuration)??CaA:0;_exitAnimationDuration=this._animationsEnabled?AT(this._config.exitAnimationDuration)??daA:0;_animationTimer=null;_contentAttached(){super._contentAttached(),this._startOpenAnimation()}_startOpenAnimation(){this._animationStateChanged.emit({state:"opening",totalTime:this._enterAnimationDuration}),this._animationsEnabled?(this._hostElement.style.setProperty($U,`${this._enterAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(ZU,g7)),this._waitForAnimationToComplete(this._enterAnimationDuration,this._finishDialogOpen)):(this._hostElement.classList.add(g7),Promise.resolve().then(()=>this._finishDialogOpen()))}_startExitAnimation(){this._animationStateChanged.emit({state:"closing",totalTime:this._exitAnimationDuration}),this._hostElement.classList.remove(g7),this._animationsEnabled?(this._hostElement.style.setProperty($U,`${this._exitAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(XU)),this._waitForAnimationToComplete(this._exitAnimationDuration,this._finishDialogClose)):Promise.resolve().then(()=>this._finishDialogClose())}_updateActionSectionCount(A){this._actionSectionCount+=A,this._changeDetectorRef.markForCheck()}_finishDialogOpen=()=>{this._clearAnimationClasses(),this._openAnimationDone(this._enterAnimationDuration)};_finishDialogClose=()=>{this._clearAnimationClasses(),this._animationStateChanged.emit({state:"closed",totalTime:this._exitAnimationDuration})};_clearAnimationClasses(){this._hostElement.classList.remove(ZU,XU)}_waitForAnimationToComplete(A,t){this._animationTimer!==null&&clearTimeout(this._animationTimer),this._animationTimer=setTimeout(t,A)}_requestAnimationFrame(A){this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(A):A()})}_captureInitialFocus(){this._config.delayFocusTrap||this._trapFocus()}_openAnimationDone(A){this._config.delayFocusTrap&&this._trapFocus(),this._animationStateChanged.next({state:"opened",totalTime:A})}ngOnDestroy(){super.ngOnDestroy(),this._animationTimer!==null&&clearTimeout(this._animationTimer)}attachComponentPortal(A){let t=super.attachComponentPortal(A);return t.location.nativeElement.classList.add("mat-mdc-dialog-component-host"),t}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275cmp=vA({type:i,selectors:[["mat-dialog-container"]],hostAttrs:["tabindex","-1",1,"mat-mdc-dialog-container","mdc-dialog"],hostVars:10,hostBindings:function(t,n){t&2&&(Ma("id",n._config.id),ie("aria-modal",n._config.ariaModal)("role",n._config.role)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null),_A("_mat-animation-noopable",!n._animationsEnabled)("mat-mdc-dialog-container-with-actions",n._actionSectionCount>0))},features:[bt],decls:3,vars:0,consts:[[1,"mat-mdc-dialog-inner-container","mdc-dialog__container"],[1,"mat-mdc-dialog-surface","mdc-dialog__surface"],["cdkPortalOutlet",""]],template:function(t,n){t&1&&(I(0,"div",0)(1,"div",1),kt(2,caA,0,0,"ng-template",2),h()())},dependencies:[Ag],styles:[`.mat-mdc-dialog-container{width:100%;height:100%;display:block;box-sizing:border-box;max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;outline:0}.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-max-width, 560px);min-width:var(--mat-dialog-container-min-width, 280px)}@media(max-width: 599px){.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-small-max-width, calc(100vw - 32px))}}.mat-mdc-dialog-inner-container{display:flex;flex-direction:row;align-items:center;justify-content:space-around;box-sizing:border-box;height:100%;opacity:0;transition:opacity linear var(--mat-dialog-transition-duration, 0ms);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit}.mdc-dialog--closing .mat-mdc-dialog-inner-container{transition:opacity 75ms linear;transform:none}.mdc-dialog--open .mat-mdc-dialog-inner-container{opacity:1}._mat-animation-noopable .mat-mdc-dialog-inner-container{transition:none}.mat-mdc-dialog-surface{display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;box-sizing:border-box;width:100%;height:100%;position:relative;overflow-y:auto;outline:0;transform:scale(0.8);transition:transform var(--mat-dialog-transition-duration, 0ms) cubic-bezier(0, 0, 0.2, 1);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;box-shadow:var(--mat-dialog-container-elevation-shadow, none);border-radius:var(--mat-dialog-container-shape, var(--mat-sys-corner-extra-large, 4px));background-color:var(--mat-dialog-container-color, var(--mat-sys-surface, white))}[dir=rtl] .mat-mdc-dialog-surface{text-align:right}.mdc-dialog--open .mat-mdc-dialog-surface,.mdc-dialog--closing .mat-mdc-dialog-surface{transform:none}._mat-animation-noopable .mat-mdc-dialog-surface{transition:none}.mat-mdc-dialog-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:2px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mat-mdc-dialog-title{display:block;position:relative;flex-shrink:0;box-sizing:border-box;margin:0 0 1px;padding:var(--mat-dialog-headline-padding, 6px 24px 13px)}.mat-mdc-dialog-title::before{display:inline-block;width:0;height:40px;content:"";vertical-align:0}[dir=rtl] .mat-mdc-dialog-title{text-align:right}.mat-mdc-dialog-container .mat-mdc-dialog-title{color:var(--mat-dialog-subhead-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-dialog-subhead-font, var(--mat-sys-headline-small-font, inherit));line-height:var(--mat-dialog-subhead-line-height, var(--mat-sys-headline-small-line-height, 1.5rem));font-size:var(--mat-dialog-subhead-size, var(--mat-sys-headline-small-size, 1rem));font-weight:var(--mat-dialog-subhead-weight, var(--mat-sys-headline-small-weight, 400));letter-spacing:var(--mat-dialog-subhead-tracking, var(--mat-sys-headline-small-tracking, 0.03125em))}.mat-mdc-dialog-content{display:block;flex-grow:1;box-sizing:border-box;margin:0;overflow:auto;max-height:65vh}.mat-mdc-dialog-content>:first-child{margin-top:0}.mat-mdc-dialog-content>:last-child{margin-bottom:0}.mat-mdc-dialog-container .mat-mdc-dialog-content{color:var(--mat-dialog-supporting-text-color, var(--mat-sys-on-surface-variant, rgba(0, 0, 0, 0.6)));font-family:var(--mat-dialog-supporting-text-font, var(--mat-sys-body-medium-font, inherit));line-height:var(--mat-dialog-supporting-text-line-height, var(--mat-sys-body-medium-line-height, 1.5rem));font-size:var(--mat-dialog-supporting-text-size, var(--mat-sys-body-medium-size, 1rem));font-weight:var(--mat-dialog-supporting-text-weight, var(--mat-sys-body-medium-weight, 400));letter-spacing:var(--mat-dialog-supporting-text-tracking, var(--mat-sys-body-medium-tracking, 0.03125em))}.mat-mdc-dialog-container .mat-mdc-dialog-content{padding:var(--mat-dialog-content-padding, 20px 24px)}.mat-mdc-dialog-container-with-actions .mat-mdc-dialog-content{padding:var(--mat-dialog-with-actions-content-padding, 20px 24px 0)}.mat-mdc-dialog-container .mat-mdc-dialog-title+.mat-mdc-dialog-content{padding-top:0}.mat-mdc-dialog-actions{display:flex;position:relative;flex-shrink:0;flex-wrap:wrap;align-items:center;box-sizing:border-box;min-height:52px;margin:0;border-top:1px solid rgba(0,0,0,0);padding:var(--mat-dialog-actions-padding, 16px 24px);justify-content:var(--mat-dialog-actions-alignment, flex-end)}@media(forced-colors: active){.mat-mdc-dialog-actions{border-top-color:CanvasText}}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-start,.mat-mdc-dialog-actions[align=start]{justify-content:start}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-center,.mat-mdc-dialog-actions[align=center]{justify-content:center}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-end,.mat-mdc-dialog-actions[align=end]{justify-content:flex-end}.mat-mdc-dialog-actions .mat-button-base+.mat-button-base,.mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-mdc-dialog-actions .mat-button-base+.mat-button-base,[dir=rtl] .mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}.mat-mdc-dialog-component-host{display:contents} -`],encapsulation:2})}return i})(),$U="--mat-dialog-transition-duration";function AT(i){return i==null?null:typeof i=="number"?i:i.endsWith("ms")?qs(i.substring(0,i.length-2)):i.endsWith("s")?qs(i.substring(0,i.length-1))*1e3:i==="0"?0:null}var cm=(function(i){return i[i.OPEN=0]="OPEN",i[i.CLOSING=1]="CLOSING",i[i.CLOSED=2]="CLOSED",i})(cm||{}),zn=class{_ref;_config;_containerInstance;componentInstance;componentRef=null;disableClose;id;_afterOpened=new _g(1);_beforeClosed=new _g(1);_result;_closeFallbackTimeout;_state=cm.OPEN;_closeInteractionType;constructor(e,A,t){this._ref=e,this._config=A,this._containerInstance=t,this.disableClose=A.disableClose,this.id=e.id,e.addPanelClass("mat-mdc-dialog-panel"),t._animationStateChanged.pipe(Bt(n=>n.state==="opened"),Ro(1)).subscribe(()=>{this._afterOpened.next(),this._afterOpened.complete()}),t._animationStateChanged.pipe(Bt(n=>n.state==="closed"),Ro(1)).subscribe(()=>{clearTimeout(this._closeFallbackTimeout),this._finishDialogClose()}),e.overlayRef.detachments().subscribe(()=>{this._beforeClosed.next(this._result),this._beforeClosed.complete(),this._finishDialogClose()}),Vi(this.backdropClick(),this.keydownEvents().pipe(Bt(n=>n.keyCode===27&&!this.disableClose&&!Sa(n)))).subscribe(n=>{this.disableClose||(n.preventDefault(),eT(this,n.type==="keydown"?"keyboard":"mouse"))})}close(e){let A=this._config.closePredicate;A&&!A(e,this._config,this.componentInstance)||(this._result=e,this._containerInstance._animationStateChanged.pipe(Bt(t=>t.state==="closing"),Ro(1)).subscribe(t=>{this._beforeClosed.next(e),this._beforeClosed.complete(),this._ref.overlayRef.detachBackdrop(),this._closeFallbackTimeout=setTimeout(()=>this._finishDialogClose(),t.totalTime+100)}),this._state=cm.CLOSING,this._containerInstance._startExitAnimation())}afterOpened(){return this._afterOpened}afterClosed(){return this._ref.closed}beforeClosed(){return this._beforeClosed}backdropClick(){return this._ref.backdropClick}keydownEvents(){return this._ref.keydownEvents}updatePosition(e){let A=this._ref.config.positionStrategy;return e&&(e.left||e.right)?e.left?A.left(e.left):A.right(e.right):A.centerHorizontally(),e&&(e.top||e.bottom)?e.top?A.top(e.top):A.bottom(e.bottom):A.centerVertically(),this._ref.updatePosition(),this}updateSize(e="",A=""){return this._ref.updateSize(e,A),this}addPanelClass(e){return this._ref.addPanelClass(e),this}removePanelClass(e){return this._ref.removePanelClass(e),this}getState(){return this._state}_finishDialogClose(){this._state=cm.CLOSED,this._ref.close(this._result,{focusOrigin:this._closeInteractionType}),this.componentInstance=null}};function eT(i,e,A){return i._closeInteractionType=e,i.close(A)}var Do=new MA("MatMdcDialogData"),BaA=new MA("mat-mdc-dialog-default-options"),haA=new MA("mat-mdc-dialog-scroll-strategy",{providedIn:"root",factory:()=>{let i=w(St);return()=>IB(i)}}),Xa=(()=>{class i{_defaultOptions=w(BaA,{optional:!0});_scrollStrategy=w(haA);_parentDialog=w(i,{optional:!0,skipSelf:!0});_idGenerator=w(Dn);_injector=w(St);_dialog=w(l7);_animationsDisabled=In();_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new ne;_afterOpenedAtThisLevel=new ne;dialogConfigClass=Cm;_dialogRefConstructor;_dialogContainerType;_dialogDataToken;get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}afterAllClosed=Rc(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(Yn(void 0)));constructor(){this._dialogRefConstructor=zn,this._dialogContainerType=IaA,this._dialogDataToken=Do}open(A,t){let n;t=P(P({},this._defaultOptions||new Cm),t),t.id=t.id||this._idGenerator.getId("mat-mdc-dialog-"),t.scrollStrategy=t.scrollStrategy||this._scrollStrategy();let o=this._dialog.open(A,$A(P({},t),{positionStrategy:o2(this._injector).centerHorizontally().centerVertically(),disableClose:!0,closePredicate:void 0,closeOnDestroy:!1,closeOnOverlayDetachments:!1,disableAnimations:this._animationsDisabled||t.enterAnimationDuration?.toLocaleString()==="0"||t.exitAnimationDuration?.toString()==="0",container:{type:this._dialogContainerType,providers:()=>[{provide:this.dialogConfigClass,useValue:t},{provide:a2,useValue:t}]},templateContext:()=>({dialogRef:n}),providers:(a,r,s)=>(n=new this._dialogRefConstructor(a,t,s),n.updatePosition(t?.position),[{provide:this._dialogContainerType,useValue:s},{provide:this._dialogDataToken,useValue:r.data},{provide:this._dialogRefConstructor,useValue:n}])}));return n.componentRef=o.componentRef,n.componentInstance=o.componentInstance,this.openDialogs.push(n),this.afterOpened.next(n),n.afterClosed().subscribe(()=>{let a=this.openDialogs.indexOf(n);a>-1&&(this.openDialogs.splice(a,1),this.openDialogs.length||this._getAfterAllClosed().next())}),n}closeAll(){this._closeDialogs(this.openDialogs)}getDialogById(A){return this.openDialogs.find(t=>t.id===A)}ngOnDestroy(){this._closeDialogs(this._openDialogsAtThisLevel),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete()}_closeDialogs(A){let t=A.length;for(;t--;)A[t].close()}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),r2=(()=>{class i{dialogRef=w(zn,{optional:!0});_elementRef=w(ce);_dialog=w(Xa);ariaLabel;type="button";dialogResult;_matDialogClose;constructor(){}ngOnInit(){this.dialogRef||(this.dialogRef=iT(this._elementRef,this._dialog.openDialogs))}ngOnChanges(A){let t=A._matDialogClose||A._matDialogCloseResult;t&&(this.dialogResult=t.currentValue)}_onButtonClick(A){eT(this.dialogRef,A.screenX===0&&A.screenY===0?"keyboard":"mouse",this.dialogResult)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","mat-dialog-close",""],["","matDialogClose",""]],hostVars:2,hostBindings:function(t,n){t&1&&U("click",function(a){return n._onButtonClick(a)}),t&2&&ie("aria-label",n.ariaLabel||null)("type",n.type)},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],type:"type",dialogResult:[0,"mat-dialog-close","dialogResult"],_matDialogClose:[0,"matDialogClose","_matDialogClose"]},exportAs:["matDialogClose"],features:[ii]})}return i})(),tT=(()=>{class i{_dialogRef=w(zn,{optional:!0});_elementRef=w(ce);_dialog=w(Xa);constructor(){}ngOnInit(){this._dialogRef||(this._dialogRef=iT(this._elementRef,this._dialog.openDialogs)),this._dialogRef&&Promise.resolve().then(()=>{this._onAdd()})}ngOnDestroy(){this._dialogRef?._containerInstance&&Promise.resolve().then(()=>{this._onRemove()})}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i})}return i})(),Xo=(()=>{class i extends tT{id=w(Dn).getId("mat-mdc-dialog-title-");_onAdd(){this._dialogRef._containerInstance?._addAriaLabelledBy?.(this.id)}_onRemove(){this._dialogRef?._containerInstance?._removeAriaLabelledBy?.(this.id)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["","mat-dialog-title",""],["","matDialogTitle",""]],hostAttrs:[1,"mat-mdc-dialog-title","mdc-dialog__title"],hostVars:1,hostBindings:function(t,n){t&2&&Ma("id",n.id)},inputs:{id:"id"},exportAs:["matDialogTitle"],features:[bt]})}return i})(),Ba=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","mat-dialog-content",""],["mat-dialog-content"],["","matDialogContent",""]],hostAttrs:[1,"mat-mdc-dialog-content","mdc-dialog__content"],features:[r3([j0])]})}return i})(),ha=(()=>{class i extends tT{align;_onAdd(){this._dialogRef._containerInstance?._updateActionSectionCount?.(1)}_onRemove(){this._dialogRef._containerInstance?._updateActionSectionCount?.(-1)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["","mat-dialog-actions",""],["mat-dialog-actions"],["","matDialogActions",""]],hostAttrs:[1,"mat-mdc-dialog-actions","mdc-dialog__actions"],hostVars:6,hostBindings:function(t,n){t&2&&_A("mat-mdc-dialog-actions-align-start",n.align==="start")("mat-mdc-dialog-actions-align-center",n.align==="center")("mat-mdc-dialog-actions-align-end",n.align==="end")},inputs:{align:"align"},features:[bt]})}return i})();function iT(i,e){let A=i.nativeElement.parentElement;for(;A&&!A.classList.contains("mat-mdc-dialog-container");)A=A.parentElement;return A?e.find(t=>t.id===A.id):null}var Ls=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({providers:[Xa],imports:[WU,eg,Wc,Di]})}return i})();function nT(i){return Error(`Unable to find icon with the name "${i}"`)}function EaA(){return Error("Could not find HttpClient for use with Angular Material icons. Please add provideHttpClient() to your providers.")}function oT(i){return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was "${i}".`)}function aT(i){return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by Angular's DomSanitizer. Attempted literal was "${i}".`)}var q0=class{url;svgText;options;svgElement=null;constructor(e,A,t){this.url=e,this.svgText=A,this.options=t}},sT=(()=>{class i{_httpClient;_sanitizer;_errorHandler;_document;_svgIconConfigs=new Map;_iconSetConfigs=new Map;_cachedIconsByUrl=new Map;_inProgressUrlFetches=new Map;_fontCssClassesByAlias=new Map;_resolvers=[];_defaultFontSetClass=["material-icons","mat-ligature-font"];constructor(A,t,n,o){this._httpClient=A,this._sanitizer=t,this._errorHandler=o,this._document=n}addSvgIcon(A,t,n){return this.addSvgIconInNamespace("",A,t,n)}addSvgIconLiteral(A,t,n){return this.addSvgIconLiteralInNamespace("",A,t,n)}addSvgIconInNamespace(A,t,n,o){return this._addSvgIconConfig(A,t,new q0(n,null,o))}addSvgIconResolver(A){return this._resolvers.push(A),this}addSvgIconLiteralInNamespace(A,t,n,o){let a=this._sanitizer.sanitize(Ng.HTML,n);if(!a)throw aT(n);let r=F1(a);return this._addSvgIconConfig(A,t,new q0("",r,o))}addSvgIconSet(A,t){return this.addSvgIconSetInNamespace("",A,t)}addSvgIconSetLiteral(A,t){return this.addSvgIconSetLiteralInNamespace("",A,t)}addSvgIconSetInNamespace(A,t,n){return this._addSvgIconSetConfig(A,new q0(t,null,n))}addSvgIconSetLiteralInNamespace(A,t,n){let o=this._sanitizer.sanitize(Ng.HTML,t);if(!o)throw aT(t);let a=F1(o);return this._addSvgIconSetConfig(A,new q0("",a,n))}registerFontClassAlias(A,t=A){return this._fontCssClassesByAlias.set(A,t),this}classNameForFontAlias(A){return this._fontCssClassesByAlias.get(A)||A}setDefaultFontSetClass(...A){return this._defaultFontSetClass=A,this}getDefaultFontSetClass(){return this._defaultFontSetClass}getSvgIconFromUrl(A){let t=this._sanitizer.sanitize(Ng.RESOURCE_URL,A);if(!t)throw oT(A);let n=this._cachedIconsByUrl.get(t);return n?oe(dm(n)):this._loadSvgIconFromConfig(new q0(A,null)).pipe(mi(o=>this._cachedIconsByUrl.set(t,o)),Se(o=>dm(o)))}getNamedSvgIcon(A,t=""){let n=rT(t,A),o=this._svgIconConfigs.get(n);if(o)return this._getSvgFromConfig(o);if(o=this._getIconConfigFromResolvers(t,A),o)return this._svgIconConfigs.set(n,o),this._getSvgFromConfig(o);let a=this._iconSetConfigs.get(t);return a?this._getSvgFromIconSetConfigs(A,a):Wp(nT(n))}ngOnDestroy(){this._resolvers=[],this._svgIconConfigs.clear(),this._iconSetConfigs.clear(),this._cachedIconsByUrl.clear()}_getSvgFromConfig(A){return A.svgText?oe(dm(this._svgElementFromConfig(A))):this._loadSvgIconFromConfig(A).pipe(Se(t=>dm(t)))}_getSvgFromIconSetConfigs(A,t){let n=this._extractIconWithNameFromAnySet(A,t);if(n)return oe(n);let o=t.filter(a=>!a.svgText).map(a=>this._loadSvgIconSetFromConfig(a).pipe(aa(r=>{let l=`Loading icon set URL: ${this._sanitizer.sanitize(Ng.RESOURCE_URL,a.url)} failed: ${r.message}`;return this._errorHandler.handleError(new Error(l)),oe(null)})));return JC(o).pipe(Se(()=>{let a=this._extractIconWithNameFromAnySet(A,t);if(!a)throw nT(A);return a}))}_extractIconWithNameFromAnySet(A,t){for(let n=t.length-1;n>=0;n--){let o=t[n];if(o.svgText&&o.svgText.toString().indexOf(A)>-1){let a=this._svgElementFromConfig(o),r=this._extractSvgIconFromSet(a,A,o.options);if(r)return r}}return null}_loadSvgIconFromConfig(A){return this._fetchIcon(A).pipe(mi(t=>A.svgText=t),Se(()=>this._svgElementFromConfig(A)))}_loadSvgIconSetFromConfig(A){return A.svgText?oe(null):this._fetchIcon(A).pipe(mi(t=>A.svgText=t))}_extractSvgIconFromSet(A,t,n){let o=A.querySelector(`[id="${t}"]`);if(!o)return null;let a=o.cloneNode(!0);if(a.removeAttribute("id"),a.nodeName.toLowerCase()==="svg")return this._setSvgAttributes(a,n);if(a.nodeName.toLowerCase()==="symbol")return this._setSvgAttributes(this._toSvgElement(a),n);let r=this._svgElementFromString(F1(""));return r.appendChild(a),this._setSvgAttributes(r,n)}_svgElementFromString(A){let t=this._document.createElement("DIV");t.innerHTML=A;let n=t.querySelector("svg");if(!n)throw Error(" tag not found");return n}_toSvgElement(A){let t=this._svgElementFromString(F1("")),n=A.attributes;for(let o=0;oF1(l)),A3(()=>this._inProgressUrlFetches.delete(a)),HC());return this._inProgressUrlFetches.set(a,s),s}_addSvgIconConfig(A,t,n){return this._svgIconConfigs.set(rT(A,t),n),this}_addSvgIconSetConfig(A,t){let n=this._iconSetConfigs.get(A);return n?n.push(t):this._iconSetConfigs.set(A,[t]),this}_svgElementFromConfig(A){if(!A.svgElement){let t=this._svgElementFromString(A.svgText);this._setSvgAttributes(t,A.options),A.svgElement=t}return A.svgElement}_getIconConfigFromResolvers(A,t){for(let n=0;n{let i=w(ci),e=i?i.location:null;return{getPathname:()=>e?e.pathname+e.search:""}}}),lT=["clip-path","color-profile","src","cursor","fill","filter","marker","marker-start","marker-mid","marker-end","mask","stroke"],maA=lT.map(i=>`[${i}]`).join(", "),waA=/^url\(['"]?#(.*?)['"]?\)$/,zt=(()=>{class i{_elementRef=w(ce);_iconRegistry=w(sT);_location=w(faA);_errorHandler=w(e3);_defaultColor;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;inline=!1;get svgIcon(){return this._svgIcon}set svgIcon(A){A!==this._svgIcon&&(A?this._updateSvgIcon(A):this._svgIcon&&this._clearSvgElement(),this._svgIcon=A)}_svgIcon;get fontSet(){return this._fontSet}set fontSet(A){let t=this._cleanupFontValue(A);t!==this._fontSet&&(this._fontSet=t,this._updateFontIconClasses())}_fontSet;get fontIcon(){return this._fontIcon}set fontIcon(A){let t=this._cleanupFontValue(A);t!==this._fontIcon&&(this._fontIcon=t,this._updateFontIconClasses())}_fontIcon;_previousFontSetClass=[];_previousFontIconClass;_svgName=null;_svgNamespace=null;_previousPath;_elementsWithExternalReferences;_currentIconFetch=Oo.EMPTY;constructor(){let A=w(new Ys("aria-hidden"),{optional:!0}),t=w(paA,{optional:!0});t&&(t.color&&(this.color=this._defaultColor=t.color),t.fontSet&&(this.fontSet=t.fontSet)),A||this._elementRef.nativeElement.setAttribute("aria-hidden","true")}_splitIconName(A){if(!A)return["",""];let t=A.split(":");switch(t.length){case 1:return["",t[0]];case 2:return t;default:throw Error(`Invalid icon name: "${A}"`)}}ngOnInit(){this._updateFontIconClasses()}ngAfterViewChecked(){let A=this._elementsWithExternalReferences;if(A&&A.size){let t=this._location.getPathname();t!==this._previousPath&&(this._previousPath=t,this._prependPathToReferences(t))}}ngOnDestroy(){this._currentIconFetch.unsubscribe(),this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear()}_usingFontIcon(){return!this.svgIcon}_setSvgElement(A){this._clearSvgElement();let t=this._location.getPathname();this._previousPath=t,this._cacheChildrenWithExternalReferences(A),this._prependPathToReferences(t),this._elementRef.nativeElement.appendChild(A)}_clearSvgElement(){let A=this._elementRef.nativeElement,t=A.childNodes.length;for(this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear();t--;){let n=A.childNodes[t];(n.nodeType!==1||n.nodeName.toLowerCase()==="svg")&&n.remove()}}_updateFontIconClasses(){if(!this._usingFontIcon())return;let A=this._elementRef.nativeElement,t=(this.fontSet?this._iconRegistry.classNameForFontAlias(this.fontSet).split(/ +/):this._iconRegistry.getDefaultFontSetClass()).filter(n=>n.length>0);this._previousFontSetClass.forEach(n=>A.classList.remove(n)),t.forEach(n=>A.classList.add(n)),this._previousFontSetClass=t,this.fontIcon!==this._previousFontIconClass&&!t.includes("mat-ligature-font")&&(this._previousFontIconClass&&A.classList.remove(this._previousFontIconClass),this.fontIcon&&A.classList.add(this.fontIcon),this._previousFontIconClass=this.fontIcon)}_cleanupFontValue(A){return typeof A=="string"?A.trim().split(" ")[0]:A}_prependPathToReferences(A){let t=this._elementsWithExternalReferences;t&&t.forEach((n,o)=>{n.forEach(a=>{o.setAttribute(a.name,`url('${A}#${a.value}')`)})})}_cacheChildrenWithExternalReferences(A){let t=A.querySelectorAll(maA),n=this._elementsWithExternalReferences=this._elementsWithExternalReferences||new Map;for(let o=0;o{let r=t[o],s=r.getAttribute(a),l=s?s.match(waA):null;if(l){let g=n.get(r);g||(g=[],n.set(r,g)),g.push({name:a,value:l[1]})}})}_updateSvgIcon(A){if(this._svgNamespace=null,this._svgName=null,this._currentIconFetch.unsubscribe(),A){let[t,n]=this._splitIconName(A);t&&(this._svgNamespace=t),n&&(this._svgName=n),this._currentIconFetch=this._iconRegistry.getNamedSvgIcon(n,t).pipe(Ro(1)).subscribe(o=>this._setSvgElement(o),o=>{let a=`Error retrieving icon ${t}:${n}! ${o.message}`;this._errorHandler.handleError(new Error(a))})}}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-icon"]],hostAttrs:["role","img",1,"mat-icon","notranslate"],hostVars:10,hostBindings:function(t,n){t&2&&(ie("data-mat-icon-type",n._usingFontIcon()?"font":"svg")("data-mat-icon-name",n._svgName||n.fontIcon)("data-mat-icon-namespace",n._svgNamespace||n.fontSet)("fontIcon",n._usingFontIcon()?n.fontIcon:null),Ao(n.color?"mat-"+n.color:""),_A("mat-icon-inline",n.inline)("mat-icon-no-color",n.color!=="primary"&&n.color!=="accent"&&n.color!=="warn"))},inputs:{color:"color",inline:[2,"inline","inline",Qe],svgIcon:"svgIcon",fontSet:"fontSet",fontIcon:"fontIcon"},exportAs:["matIcon"],ngContentSelectors:uaA,decls:1,vars:0,template:function(t,n){t&1&&(Ot(),Ze(0))},styles:[`mat-icon,mat-icon.mat-primary,mat-icon.mat-accent,mat-icon.mat-warn{color:var(--mat-icon-color, inherit)}.mat-icon{-webkit-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px;overflow:hidden}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}.mat-icon.mat-ligature-font[fontIcon]::before{content:attr(fontIcon)}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto} -`],encapsulation:2,changeDetection:0})}return i})(),Un=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Di]})}return i})();var yaA=["mat-menu-item",""],DaA=[[["mat-icon"],["","matMenuItemIcon",""]],"*"],vaA=["mat-icon, [matMenuItemIcon]","*"];function baA(i,e){i&1&&(Et(),I(0,"svg",2),lA(1,"polygon",3),h())}var MaA=["*"];function SaA(i,e){if(i&1){let A=aA();Ln(0,"div",0),yI("click",function(){L(A);let n=p();return G(n.closed.emit("click"))})("animationstart",function(n){L(A);let o=p();return G(o._onAnimationStart(n.animationName))})("animationend",function(n){L(A);let o=p();return G(o._onAnimationDone(n.animationName))})("animationcancel",function(n){L(A);let o=p();return G(o._onAnimationDone(n.animationName))}),Ln(1,"div",1),Ze(2),Xn()()}if(i&2){let A=p();Ao(A._classList),_A("mat-menu-panel-animations-disabled",A._animationsDisabled)("mat-menu-panel-exit-animation",A._panelAnimationState==="void")("mat-menu-panel-animating",A._isAnimating()),Ma("id",A.panelId),ie("aria-label",A.ariaLabel||null)("aria-labelledby",A.ariaLabelledby||null)("aria-describedby",A.ariaDescribedby||null)}}var C7=new MA("MAT_MENU_PANEL"),Gs=(()=>{class i{_elementRef=w(ce);_document=w(ci);_focusMonitor=w(rr);_parentMenu=w(C7,{optional:!0});_changeDetectorRef=w(Mt);role="menuitem";disabled=!1;disableRipple=!1;_hovered=new ne;_focused=new ne;_highlighted=!1;_triggersSubmenu=!1;constructor(){w(Eo).load(Qr),this._parentMenu?.addItem?.(this)}focus(A,t){this._focusMonitor&&A?this._focusMonitor.focusVia(this._getHostElement(),A,t):this._getHostElement().focus(t),this._focused.next(this)}ngAfterViewInit(){this._focusMonitor&&this._focusMonitor.monitor(this._elementRef,!1)}ngOnDestroy(){this._focusMonitor&&this._focusMonitor.stopMonitoring(this._elementRef),this._parentMenu&&this._parentMenu.removeItem&&this._parentMenu.removeItem(this),this._hovered.complete(),this._focused.complete()}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._elementRef.nativeElement}_checkDisabled(A){this.disabled&&(A.preventDefault(),A.stopPropagation())}_handleMouseEnter(){this._hovered.next(this)}getLabel(){let A=this._elementRef.nativeElement.cloneNode(!0),t=A.querySelectorAll("mat-icon, .material-icons");for(let n=0;n({overlapTrigger:!1,xPosition:"after",yPosition:"below",backdropClass:"cdk-overlay-transparent-backdrop"})}),c7="_mat-menu-enter",Bm="_mat-menu-exit",hs=(()=>{class i{_elementRef=w(ce);_changeDetectorRef=w(Mt);_injector=w(St);_keyManager;_xPosition;_yPosition;_firstItemFocusRef;_exitFallbackTimeout;_animationsDisabled=In();_allItems;_directDescendantItems=new Rg;_classList={};_panelAnimationState="void";_animationDone=new ne;_isAnimating=mA(!1);parentMenu;direction;overlayPanelClass;backdropClass;ariaLabel;ariaLabelledby;ariaDescribedby;get xPosition(){return this._xPosition}set xPosition(A){this._xPosition=A,this.setPositionClasses()}get yPosition(){return this._yPosition}set yPosition(A){this._yPosition=A,this.setPositionClasses()}templateRef;items;lazyContent;overlapTrigger=!1;hasBackdrop;set panelClass(A){let t=this._previousPanelClass,n=P({},this._classList);t&&t.length&&t.split(" ").forEach(o=>{n[o]=!1}),this._previousPanelClass=A,A&&A.length&&(A.split(" ").forEach(o=>{n[o]=!0}),this._elementRef.nativeElement.className=""),this._classList=n}_previousPanelClass;get classList(){return this.panelClass}set classList(A){this.panelClass=A}closed=new FA;close=this.closed;panelId=w(Dn).getId("mat-menu-panel-");constructor(){let A=w(_aA);this.overlayPanelClass=A.overlayPanelClass||"",this._xPosition=A.xPosition,this._yPosition=A.yPosition,this.backdropClass=A.backdropClass,this.overlapTrigger=A.overlapTrigger,this.hasBackdrop=A.hasBackdrop}ngOnInit(){this.setPositionClasses()}ngAfterContentInit(){this._updateDirectDescendants(),this._keyManager=new O0(this._directDescendantItems).withWrap().withTypeAhead().withHomeAndEnd(),this._keyManager.tabOut.subscribe(()=>this.closed.emit("tab")),this._directDescendantItems.changes.pipe(Yn(this._directDescendantItems),Mi(A=>Vi(...A.map(t=>t._focused)))).subscribe(A=>this._keyManager.updateActiveItem(A)),this._directDescendantItems.changes.subscribe(A=>{let t=this._keyManager;if(this._panelAnimationState==="enter"&&t.activeItem?._hasFocus()){let n=A.toArray(),o=Math.max(0,Math.min(n.length-1,t.activeItemIndex||0));n[o]&&!n[o].disabled?t.setActiveItem(o):t.setNextItemActive()}})}ngOnDestroy(){this._keyManager?.destroy(),this._directDescendantItems.destroy(),this.closed.complete(),this._firstItemFocusRef?.destroy(),clearTimeout(this._exitFallbackTimeout)}_hovered(){return this._directDescendantItems.changes.pipe(Yn(this._directDescendantItems),Mi(t=>Vi(...t.map(n=>n._hovered))))}addItem(A){}removeItem(A){}_handleKeydown(A){let t=A.keyCode,n=this._keyManager;switch(t){case 27:Sa(A)||(A.preventDefault(),this.closed.emit("keydown"));break;case 37:this.parentMenu&&this.direction==="ltr"&&this.closed.emit("keydown");break;case 39:this.parentMenu&&this.direction==="rtl"&&this.closed.emit("keydown");break;default:(t===38||t===40)&&n.setFocusOrigin("keyboard"),n.onKeydown(A);return}}focusFirstItem(A="program"){this._firstItemFocusRef?.destroy(),this._firstItemFocusRef=ao(()=>{let t=this._resolvePanel();if(!t||!t.contains(document.activeElement)){let n=this._keyManager;n.setFocusOrigin(A).setFirstItemActive(),!n.activeItem&&t&&t.focus()}},{injector:this._injector})}resetActiveItem(){this._keyManager.setActiveItem(-1)}setElevation(A){}setPositionClasses(A=this.xPosition,t=this.yPosition){this._classList=$A(P({},this._classList),{"mat-menu-before":A==="before","mat-menu-after":A==="after","mat-menu-above":t==="above","mat-menu-below":t==="below"}),this._changeDetectorRef.markForCheck()}_onAnimationDone(A){let t=A===Bm;(t||A===c7)&&(t&&(clearTimeout(this._exitFallbackTimeout),this._exitFallbackTimeout=void 0),this._animationDone.next(t?"void":"enter"),this._isAnimating.set(!1))}_onAnimationStart(A){(A===c7||A===Bm)&&this._isAnimating.set(!0)}_setIsOpen(A){if(this._panelAnimationState=A?"enter":"void",A){if(this._keyManager.activeItemIndex===0){let t=this._resolvePanel();t&&(t.scrollTop=0)}}else this._animationsDisabled||(this._exitFallbackTimeout=setTimeout(()=>this._onAnimationDone(Bm),200));this._animationsDisabled&&setTimeout(()=>{this._onAnimationDone(A?c7:Bm)}),this._changeDetectorRef.markForCheck()}_updateDirectDescendants(){this._allItems.changes.pipe(Yn(this._allItems)).subscribe(A=>{this._directDescendantItems.reset(A.filter(t=>t._parentMenu===this)),this._directDescendantItems.notifyOnChanges()})}_resolvePanel(){let A=null;return this._directDescendantItems.length&&(A=this._directDescendantItems.first._getHostElement().closest('[role="menu"]')),A}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-menu"]],contentQueries:function(t,n,o){if(t&1&&ra(o,kaA,5)(o,Gs,5)(o,Gs,4),t&2){let a;se(a=le())&&(n.lazyContent=a.first),se(a=le())&&(n._allItems=a),se(a=le())&&(n.items=a)}},viewQuery:function(t,n){if(t&1&&Wt(wo,5),t&2){let o;se(o=le())&&(n.templateRef=o.first)}},hostVars:3,hostBindings:function(t,n){t&2&&ie("aria-label",null)("aria-labelledby",null)("aria-describedby",null)},inputs:{backdropClass:"backdropClass",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],xPosition:"xPosition",yPosition:"yPosition",overlapTrigger:[2,"overlapTrigger","overlapTrigger",Qe],hasBackdrop:[2,"hasBackdrop","hasBackdrop",A=>A==null?null:Qe(A)],panelClass:[0,"class","panelClass"],classList:"classList"},outputs:{closed:"closed",close:"close"},exportAs:["matMenu"],features:[pt([{provide:C7,useExisting:i}])],ngContentSelectors:MaA,decls:1,vars:0,consts:[["tabindex","-1","role","menu",1,"mat-mdc-menu-panel",3,"click","animationstart","animationend","animationcancel","id"],[1,"mat-mdc-menu-content"]],template:function(t,n){t&1&&(Ot(),s3(0,SaA,3,12,"ng-template"))},styles:[`mat-menu{display:none}.mat-mdc-menu-content{margin:0;padding:8px 0;outline:0}.mat-mdc-menu-content,.mat-mdc-menu-content .mat-mdc-menu-item .mat-mdc-menu-item-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;flex:1;white-space:normal;font-family:var(--mat-menu-item-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-menu-item-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-menu-item-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-menu-item-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-menu-item-label-text-weight, var(--mat-sys-label-large-weight))}@keyframes _mat-menu-enter{from{opacity:0;transform:scale(0.8)}to{opacity:1;transform:none}}@keyframes _mat-menu-exit{from{opacity:1}to{opacity:0}}.mat-mdc-menu-panel{min-width:112px;max-width:280px;overflow:auto;box-sizing:border-box;outline:0;animation:_mat-menu-enter 120ms cubic-bezier(0, 0, 0.2, 1);border-radius:var(--mat-menu-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-menu-container-color, var(--mat-sys-surface-container));box-shadow:var(--mat-menu-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));will-change:transform,opacity}.mat-mdc-menu-panel.mat-menu-panel-exit-animation{animation:_mat-menu-exit 100ms 25ms linear forwards}.mat-mdc-menu-panel.mat-menu-panel-animations-disabled{animation:none}.mat-mdc-menu-panel.mat-menu-panel-animating{pointer-events:none}.mat-mdc-menu-panel.mat-menu-panel-animating:has(.mat-mdc-menu-content:empty){display:none}@media(forced-colors: active){.mat-mdc-menu-panel{outline:solid 1px}}.mat-mdc-menu-panel .mat-divider{border-top-color:var(--mat-menu-divider-color, var(--mat-sys-surface-variant));margin-bottom:var(--mat-menu-divider-bottom-spacing, 8px);margin-top:var(--mat-menu-divider-top-spacing, 8px)}.mat-mdc-menu-item{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;cursor:pointer;width:100%;text-align:left;box-sizing:border-box;color:inherit;font-size:inherit;background:none;text-decoration:none;margin:0;min-height:48px;padding-left:var(--mat-menu-item-leading-spacing, 12px);padding-right:var(--mat-menu-item-trailing-spacing, 12px);-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-menu-item::-moz-focus-inner{border:0}[dir=rtl] .mat-mdc-menu-item{padding-left:var(--mat-menu-item-trailing-spacing, 12px);padding-right:var(--mat-menu-item-leading-spacing, 12px)}.mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-leading-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-trailing-spacing, 12px)}[dir=rtl] .mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-trailing-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-leading-spacing, 12px)}.mat-mdc-menu-item,.mat-mdc-menu-item:visited,.mat-mdc-menu-item:link{color:var(--mat-menu-item-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-menu-item .mat-icon-no-color,.mat-mdc-menu-item .mat-mdc-menu-submenu-icon{color:var(--mat-menu-item-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-menu-item[disabled]{cursor:default;opacity:.38}.mat-mdc-menu-item[disabled]::after{display:block;position:absolute;content:"";top:0;left:0;bottom:0;right:0}.mat-mdc-menu-item:focus{outline:0}.mat-mdc-menu-item .mat-icon{flex-shrink:0;margin-right:var(--mat-menu-item-spacing, 12px);height:var(--mat-menu-item-icon-size, 24px);width:var(--mat-menu-item-icon-size, 24px)}[dir=rtl] .mat-mdc-menu-item{text-align:right}[dir=rtl] .mat-mdc-menu-item .mat-icon{margin-right:0;margin-left:var(--mat-menu-item-spacing, 12px)}.mat-mdc-menu-item:not([disabled]):hover{background-color:var(--mat-menu-item-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-menu-item:not([disabled]).cdk-program-focused,.mat-mdc-menu-item:not([disabled]).cdk-keyboard-focused,.mat-mdc-menu-item:not([disabled]).mat-mdc-menu-item-highlighted{background-color:var(--mat-menu-item-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}@media(forced-colors: active){.mat-mdc-menu-item{margin-top:1px}}.mat-mdc-menu-submenu-icon{width:var(--mat-menu-item-icon-size, 24px);height:10px;fill:currentColor;padding-left:var(--mat-menu-item-spacing, 12px)}[dir=rtl] .mat-mdc-menu-submenu-icon{padding-right:var(--mat-menu-item-spacing, 12px);padding-left:0}[dir=rtl] .mat-mdc-menu-submenu-icon polygon{transform:scaleX(-1);transform-origin:center}@media(forced-colors: active){.mat-mdc-menu-submenu-icon{fill:CanvasText}}.mat-mdc-menu-item .mat-mdc-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none} -`],encapsulation:2,changeDetection:0})}return i})(),xaA=new MA("mat-menu-scroll-strategy",{providedIn:"root",factory:()=>{let i=w(St);return()=>V0(i)}});var BB=new WeakMap,RaA=(()=>{class i{_canHaveBackdrop;_element=w(ce);_viewContainerRef=w(Jo);_menuItemInstance=w(Gs,{optional:!0,self:!0});_dir=w(No,{optional:!0});_focusMonitor=w(rr);_ngZone=w(We);_injector=w(St);_scrollStrategy=w(xaA);_changeDetectorRef=w(Mt);_animationsDisabled=In();_portal;_overlayRef=null;_menuOpen=!1;_closingActionsSubscription=Oo.EMPTY;_menuCloseSubscription=Oo.EMPTY;_pendingRemoval;_parentMaterialMenu;_parentInnerPadding;_openedBy=void 0;get _menu(){return this._menuInternal}set _menu(A){A!==this._menuInternal&&(this._menuInternal=A,this._menuCloseSubscription.unsubscribe(),A&&(this._parentMaterialMenu,this._menuCloseSubscription=A.close.subscribe(t=>{this._destroyMenu(t),(t==="click"||t==="tab")&&this._parentMaterialMenu&&this._parentMaterialMenu.closed.emit(t)})),this._menuItemInstance?._setTriggersSubmenu(this._triggersSubmenu()))}_menuInternal=null;constructor(A){this._canHaveBackdrop=A;let t=w(C7,{optional:!0});this._parentMaterialMenu=t instanceof hs?t:void 0}ngOnDestroy(){this._menu&&this._ownsMenu(this._menu)&&BB.delete(this._menu),this._pendingRemoval?.unsubscribe(),this._menuCloseSubscription.unsubscribe(),this._closingActionsSubscription.unsubscribe(),this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null)}get menuOpen(){return this._menuOpen}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_triggersSubmenu(){return!!(this._menuItemInstance&&this._parentMaterialMenu&&this._menu)}_closeMenu(){this._menu?.close.emit()}_openMenu(A){if(this._triggerIsAriaDisabled())return;let t=this._menu;if(this._menuOpen||!t)return;this._pendingRemoval?.unsubscribe();let n=BB.get(t);BB.set(t,this),n&&n!==this&&n._closeMenu();let o=this._createOverlay(t),a=o.getConfig(),r=a.positionStrategy;this._setPosition(t,r),this._canHaveBackdrop?a.hasBackdrop=t.hasBackdrop==null?!this._triggersSubmenu():t.hasBackdrop:a.hasBackdrop=t.hasBackdrop??!1,o.hasAttached()||(o.attach(this._getPortal(t)),t.lazyContent?.attach(this.menuData)),this._closingActionsSubscription=this._menuClosingActions().subscribe(()=>this._closeMenu()),t.parentMenu=this._triggersSubmenu()?this._parentMaterialMenu:void 0,t.direction=this.dir,A&&t.focusFirstItem(this._openedBy||"program"),this._setIsMenuOpen(!0),t instanceof hs&&(t._setIsOpen(!0),t._directDescendantItems.changes.pipe(yt(t.close)).subscribe(()=>{r.withLockedPosition(!1).reapplyLastPosition(),r.withLockedPosition(!0)}))}focus(A,t){this._focusMonitor&&A?this._focusMonitor.focusVia(this._element,A,t):this._element.nativeElement.focus(t)}_destroyMenu(A){let t=this._overlayRef,n=this._menu;!t||!this.menuOpen||(this._closingActionsSubscription.unsubscribe(),this._pendingRemoval?.unsubscribe(),n instanceof hs&&this._ownsMenu(n)?(this._pendingRemoval=n._animationDone.pipe(Ro(1)).subscribe(()=>{t.detach(),BB.has(n)||n.lazyContent?.detach()}),n._setIsOpen(!1)):(t.detach(),n?.lazyContent?.detach()),n&&this._ownsMenu(n)&&BB.delete(n),this.restoreFocus&&(A==="keydown"||!this._openedBy||!this._triggersSubmenu())&&this.focus(this._openedBy),this._openedBy=void 0,this._setIsMenuOpen(!1))}_setIsMenuOpen(A){A!==this._menuOpen&&(this._menuOpen=A,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this._triggersSubmenu()&&this._menuItemInstance._setHighlighted(A),this._changeDetectorRef.markForCheck())}_createOverlay(A){if(!this._overlayRef){let t=this._getOverlayConfig(A);this._subscribeToPositions(A,t.positionStrategy),this._overlayRef=Pg(this._injector,t),this._overlayRef.keydownEvents().subscribe(n=>{this._menu instanceof hs&&this._menu._handleKeydown(n)})}return this._overlayRef}_getOverlayConfig(A){return new Hg({positionStrategy:od(this._injector,this._getOverlayOrigin()).withLockedPosition().withGrowAfterOpen().withTransformOriginOn(".mat-menu-panel, .mat-mdc-menu-panel"),backdropClass:A.backdropClass||"cdk-overlay-transparent-backdrop",panelClass:A.overlayPanelClass,scrollStrategy:this._scrollStrategy(),direction:this._dir||"ltr",disableAnimations:this._animationsDisabled})}_subscribeToPositions(A,t){A.setPositionClasses&&t.positionChanges.subscribe(n=>{this._ngZone.run(()=>{let o=n.connectionPair.overlayX==="start"?"after":"before",a=n.connectionPair.overlayY==="top"?"below":"above";A.setPositionClasses(o,a)})})}_setPosition(A,t){let[n,o]=A.xPosition==="before"?["end","start"]:["start","end"],[a,r]=A.yPosition==="above"?["bottom","top"]:["top","bottom"],[s,l]=[a,r],[g,C]=[n,o],d=0;if(this._triggersSubmenu()){if(C=n=A.xPosition==="before"?"start":"end",o=g=n==="end"?"start":"end",this._parentMaterialMenu){if(this._parentInnerPadding==null){let B=this._parentMaterialMenu.items.first;this._parentInnerPadding=B?B._getHostElement().offsetTop:0}d=a==="bottom"?this._parentInnerPadding:-this._parentInnerPadding}}else A.overlapTrigger||(s=a==="top"?"bottom":"top",l=r==="top"?"bottom":"top");t.withPositions([{originX:n,originY:s,overlayX:g,overlayY:a,offsetY:d},{originX:o,originY:s,overlayX:C,overlayY:a,offsetY:d},{originX:n,originY:l,overlayX:g,overlayY:r,offsetY:-d},{originX:o,originY:l,overlayX:C,overlayY:r,offsetY:-d}])}_menuClosingActions(){let A=this._getOutsideClickStream(this._overlayRef),t=this._overlayRef.detachments(),n=this._parentMaterialMenu?this._parentMaterialMenu.closed:oe(),o=this._parentMaterialMenu?this._parentMaterialMenu._hovered().pipe(Bt(a=>this._menuOpen&&a!==this._menuItemInstance)):oe();return Vi(A,n,o,t)}_getPortal(A){return(!this._portal||this._portal.templateRef!==A.templateRef)&&(this._portal=new jr(A.templateRef,this._viewContainerRef)),this._portal}_ownsMenu(A){return BB.get(A)===this}_triggerIsAriaDisabled(){return Qe(this._element.nativeElement.getAttribute("aria-disabled"))}static \u0275fac=function(t){o3()};static \u0275dir=VA({type:i})}return i})(),tg=(()=>{class i extends RaA{_cleanupTouchstart;_hoverSubscription=Oo.EMPTY;get _deprecatedMatMenuTriggerFor(){return this.menu}set _deprecatedMatMenuTriggerFor(A){this.menu=A}get menu(){return this._menu}set menu(A){this._menu=A}menuData;restoreFocus=!0;menuOpened=new FA;onMenuOpen=this.menuOpened;menuClosed=new FA;onMenuClose=this.menuClosed;constructor(){super(!0);let A=w(on);this._cleanupTouchstart=A.listen(this._element.nativeElement,"touchstart",t=>{N1(t)||(this._openedBy="touch")},{passive:!0})}triggersSubmenu(){return super._triggersSubmenu()}toggleMenu(){return this.menuOpen?this.closeMenu():this.openMenu()}openMenu(){this._openMenu(!0)}closeMenu(){this._closeMenu()}updatePosition(){this._overlayRef?.updatePosition()}ngAfterContentInit(){this._handleHover()}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTouchstart(),this._hoverSubscription.unsubscribe()}_getOverlayOrigin(){return this._element}_getOutsideClickStream(A){return A.backdropClick()}_handleMousedown(A){R1(A)||(this._openedBy=A.button===0?"mouse":void 0,this.triggersSubmenu()&&A.preventDefault())}_handleKeydown(A){let t=A.keyCode;(t===13||t===32)&&(this._openedBy="keyboard"),this.triggersSubmenu()&&(t===39&&this.dir==="ltr"||t===37&&this.dir==="rtl")&&(this._openedBy="keyboard",this.openMenu())}_handleClick(A){this.triggersSubmenu()?(A.stopPropagation(),this.openMenu()):this.toggleMenu()}_handleHover(){this.triggersSubmenu()&&this._parentMaterialMenu&&(this._hoverSubscription=this._parentMaterialMenu._hovered().subscribe(A=>{A===this._menuItemInstance&&!A.disabled&&this._parentMaterialMenu?._panelAnimationState!=="void"&&(this._openedBy="mouse",this._openMenu(!1))}))}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","mat-menu-trigger-for",""],["","matMenuTriggerFor",""]],hostAttrs:[1,"mat-mdc-menu-trigger"],hostVars:3,hostBindings:function(t,n){t&1&&U("click",function(a){return n._handleClick(a)})("mousedown",function(a){return n._handleMousedown(a)})("keydown",function(a){return n._handleKeydown(a)}),t&2&&ie("aria-haspopup",n.menu?"menu":null)("aria-expanded",n.menuOpen)("aria-controls",n.menuOpen?n.menu==null?null:n.menu.panelId:null)},inputs:{_deprecatedMatMenuTriggerFor:[0,"mat-menu-trigger-for","_deprecatedMatMenuTriggerFor"],menu:[0,"matMenuTriggerFor","menu"],menuData:[0,"matMenuTriggerData","menuData"],restoreFocus:[0,"matMenuTriggerRestoreFocus","restoreFocus"]},outputs:{menuOpened:"menuOpened",onMenuOpen:"onMenuOpen",menuClosed:"menuClosed",onMenuClose:"onMenuClose"},exportAs:["matMenuTrigger"],features:[bt]})}return i})();var s2=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Jc,eg,Di,Vc]})}return i})();var NaA=["text"],FaA=[[["mat-icon"]],"*"],LaA=["mat-icon","*"];function GaA(i,e){if(i&1&&lA(0,"mat-pseudo-checkbox",1),i&2){let A=p();H("disabled",A.disabled)("state",A.selected?"checked":"unchecked")}}function KaA(i,e){if(i&1&&lA(0,"mat-pseudo-checkbox",3),i&2){let A=p();H("disabled",A.disabled)}}function UaA(i,e){if(i&1&&(I(0,"span",4),D(1),h()),i&2){let A=p();Q(),Ee("(",A.group.label,")")}}var Qm=new MA("MAT_OPTION_PARENT_COMPONENT"),um=new MA("MatOptgroup");var Em=class{source;isUserInput;constructor(e,A=!1){this.source=e,this.isUserInput=A}},Vr=(()=>{class i{_element=w(ce);_changeDetectorRef=w(Mt);_parent=w(Qm,{optional:!0});group=w(um,{optional:!0});_signalDisableRipple=!1;_selected=!1;_active=!1;_mostRecentViewValue="";get multiple(){return this._parent&&this._parent.multiple}get selected(){return this._selected}value;id=w(Dn).getId("mat-option-");get disabled(){return this.group&&this.group.disabled||this._disabled()}set disabled(A){this._disabled.set(A)}_disabled=mA(!1);get disableRipple(){return this._signalDisableRipple?this._parent.disableRipple():!!this._parent?.disableRipple}get hideSingleSelectionIndicator(){return!!(this._parent&&this._parent.hideSingleSelectionIndicator)}onSelectionChange=new FA;_text;_stateChanges=new ne;constructor(){let A=w(Eo);A.load(Qr),A.load(ZC),this._signalDisableRipple=!!this._parent&&M1(this._parent.disableRipple)}get active(){return this._active}get viewValue(){return(this._text?.nativeElement.textContent||"").trim()}select(A=!0){this._selected||(this._selected=!0,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}deselect(A=!0){this._selected&&(this._selected=!1,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}focus(A,t){let n=this._getHostElement();typeof n.focus=="function"&&n.focus(t)}setActiveStyles(){this._active||(this._active=!0,this._changeDetectorRef.markForCheck())}setInactiveStyles(){this._active&&(this._active=!1,this._changeDetectorRef.markForCheck())}getLabel(){return this.viewValue}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!Sa(A)&&(this._selectViaInteraction(),A.preventDefault())}_selectViaInteraction(){this.disabled||(this._selected=this.multiple?!this._selected:!0,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent(!0))}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._element.nativeElement}ngAfterViewChecked(){if(this._selected){let A=this.viewValue;A!==this._mostRecentViewValue&&(this._mostRecentViewValue&&this._stateChanges.next(),this._mostRecentViewValue=A)}}ngOnDestroy(){this._stateChanges.complete()}_emitSelectionChangeEvent(A=!1){this.onSelectionChange.emit(new Em(this,A))}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-option"]],viewQuery:function(t,n){if(t&1&&Wt(NaA,7),t&2){let o;se(o=le())&&(n._text=o.first)}},hostAttrs:["role","option",1,"mat-mdc-option","mdc-list-item"],hostVars:11,hostBindings:function(t,n){t&1&&U("click",function(){return n._selectViaInteraction()})("keydown",function(a){return n._handleKeydown(a)}),t&2&&(Ma("id",n.id),ie("aria-selected",n.selected)("aria-disabled",n.disabled.toString()),_A("mdc-list-item--selected",n.selected)("mat-mdc-option-multiple",n.multiple)("mat-mdc-option-active",n.active)("mdc-list-item--disabled",n.disabled))},inputs:{value:"value",id:"id",disabled:[2,"disabled","disabled",Qe]},outputs:{onSelectionChange:"onSelectionChange"},exportAs:["matOption"],ngContentSelectors:LaA,decls:8,vars:5,consts:[["text",""],["aria-hidden","true",1,"mat-mdc-option-pseudo-checkbox",3,"disabled","state"],[1,"mdc-list-item__primary-text"],["state","checked","aria-hidden","true","appearance","minimal",1,"mat-mdc-option-pseudo-checkbox",3,"disabled"],[1,"cdk-visually-hidden"],["aria-hidden","true","mat-ripple","",1,"mat-mdc-option-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled"]],template:function(t,n){t&1&&(Ot(FaA),T(0,GaA,1,2,"mat-pseudo-checkbox",1),Ze(1),I(2,"span",2,0),Ze(4,1),h(),T(5,KaA,1,1,"mat-pseudo-checkbox",3),T(6,UaA,2,1,"span",4),lA(7,"div",5)),t&2&&(O(n.multiple?0:-1),Q(5),O(!n.multiple&&n.selected&&!n.hideSingleSelectionIndicator?5:-1),Q(),O(n.group&&n.group._inert?6:-1),Q(),H("matRippleTrigger",n._getHostElement())("matRippleDisabled",n.disabled||n.disableRipple))},dependencies:[Xf,Cs],styles:[`.mat-mdc-option{-webkit-user-select:none;user-select:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;min-height:48px;padding:0 16px;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0);color:var(--mat-option-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-option-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-option-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-option-label-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-option-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-option-label-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-option:hover:not(.mdc-list-item--disabled){background-color:var(--mat-option-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:var(--mat-option-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent));outline:0}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-active,.mat-mdc-option-multiple,:focus,:hover){background-color:var(--mat-option-selected-state-layer-color, var(--mat-sys-secondary-container))}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-active,.mat-mdc-option-multiple,:focus,:hover) .mdc-list-item__primary-text{color:var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option.mdc-list-item{align-items:center;background:rgba(0,0,0,0)}.mat-mdc-option.mdc-list-item--disabled{cursor:default;pointer-events:none}.mat-mdc-option.mdc-list-item--disabled .mat-mdc-option-pseudo-checkbox,.mat-mdc-option.mdc-list-item--disabled .mdc-list-item__primary-text,.mat-mdc-option.mdc-list-item--disabled>mat-icon{opacity:.38}.mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:32px}[dir=rtl] .mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:16px;padding-right:32px}.mat-mdc-option .mat-icon,.mat-mdc-option .mat-pseudo-checkbox-full{margin-right:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-icon,[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:0;margin-left:16px}.mat-mdc-option .mat-pseudo-checkbox-minimal{margin-left:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-minimal{margin-right:16px;margin-left:0}.mat-mdc-option .mat-mdc-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-option .mdc-list-item__primary-text{white-space:normal;font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;margin-right:auto}[dir=rtl] .mat-mdc-option .mdc-list-item__primary-text{margin-right:0;margin-left:auto}@media(forced-colors: active){.mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{content:"";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}[dir=rtl] .mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{right:auto;left:16px}}.mat-mdc-option-multiple{--mat-list-list-item-selected-container-color: var(--mat-list-list-item-container-color, transparent)}.mat-mdc-option-active .mat-focus-indicator::before{content:""} -`],encapsulation:2,changeDetection:0})}return i})();function d7(i,e,A){if(A.length){let t=e.toArray(),n=A.toArray(),o=0;for(let a=0;aA+t?Math.max(0,i-t+e):A}var gT=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Di]})}return i})();var B7=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Jc,gT,Vr,Di]})}return i})();var TaA=["trigger"],OaA=["panel"],JaA=[[["mat-select-trigger"]],"*"],YaA=["mat-select-trigger","*"];function HaA(i,e){if(i&1&&(I(0,"span",4),D(1),h()),i&2){let A=p();Q(),nA(A.placeholder)}}function zaA(i,e){i&1&&Ze(0)}function PaA(i,e){if(i&1&&(I(0,"span",11),D(1),h()),i&2){let A=p(2);Q(),nA(A.triggerValue)}}function jaA(i,e){if(i&1&&(I(0,"span",5),T(1,zaA,1,0)(2,PaA,2,1,"span",11),h()),i&2){let A=p();Q(),O(A.customTrigger?1:2)}}function VaA(i,e){if(i&1){let A=aA();I(0,"div",12,1),U("keydown",function(n){L(A);let o=p();return G(o._handleKeydown(n))}),Ze(2,1),h()}if(i&2){let A=p();Ao(A.panelClass),_A("mat-select-panel-animations-enabled",!A._animationsDisabled)("mat-primary",(A._parentFormField==null?null:A._parentFormField.color)==="primary")("mat-accent",(A._parentFormField==null?null:A._parentFormField.color)==="accent")("mat-warn",(A._parentFormField==null?null:A._parentFormField.color)==="warn")("mat-undefined",!(A._parentFormField!=null&&A._parentFormField.color)),ie("id",A.id+"-panel")("aria-multiselectable",A.multiple)("aria-label",A.ariaLabel||null)("aria-labelledby",A._getPanelAriaLabelledby())}}var qaA=new MA("mat-select-scroll-strategy",{providedIn:"root",factory:()=>{let i=w(St);return()=>V0(i)}}),WaA=new MA("MAT_SELECT_CONFIG"),ZaA=new MA("MatSelectTrigger"),h7=class{source;value;constructor(e,A){this.source=e,this.value=A}},ig=(()=>{class i{_viewportRuler=w(Ns);_changeDetectorRef=w(Mt);_elementRef=w(ce);_dir=w(No,{optional:!0});_idGenerator=w(Dn);_renderer=w(on);_parentFormField=w(yQ,{optional:!0});ngControl=w(Vs,{self:!0,optional:!0});_liveAnnouncer=w(hQ);_defaultOptions=w(WaA,{optional:!0});_animationsDisabled=In();_popoverLocation;_initialized=new ne;_cleanupDetach;options;optionGroups;customTrigger;_positions=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"}];_scrollOptionIntoView(A){let t=this.options.toArray()[A];if(t){let n=this.panel.nativeElement,o=d7(A,this.options,this.optionGroups),a=t._getHostElement();A===0&&o===1?n.scrollTop=0:n.scrollTop=I7(a.offsetTop,a.offsetHeight,n.scrollTop,n.offsetHeight)}}_positioningSettled(){this._scrollOptionIntoView(this._keyManager.activeItemIndex||0)}_getChangeEvent(A){return new h7(this,A)}_scrollStrategyFactory=w(qaA);_panelOpen=!1;_compareWith=(A,t)=>A===t;_uid=this._idGenerator.getId("mat-select-");_triggerAriaLabelledBy=null;_previousControl;_destroy=new ne;_errorStateTracker;stateChanges=new ne;disableAutomaticLabeling=!0;userAriaDescribedBy;_selectionModel;_keyManager;_preferredOverlayOrigin;_overlayWidth;_onChange=()=>{};_onTouched=()=>{};_valueId=this._idGenerator.getId("mat-select-value-");_scrollStrategy;_overlayPanelClass=this._defaultOptions?.overlayPanelClass||"";get focused(){return this._focused||this._panelOpen}_focused=!1;controlType="mat-select";trigger;panel;_overlayDir;panelClass;disabled=!1;get disableRipple(){return this._disableRipple()}set disableRipple(A){this._disableRipple.set(A)}_disableRipple=mA(!1);tabIndex=0;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncParentProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get placeholder(){return this._placeholder}set placeholder(A){this._placeholder=A,this.stateChanges.next()}_placeholder;get required(){return this._required??this.ngControl?.control?.hasValidator(js.required)??!1}set required(A){this._required=A,this.stateChanges.next()}_required;get multiple(){return this._multiple}set multiple(A){this._selectionModel,this._multiple=A}_multiple=!1;disableOptionCentering=this._defaultOptions?.disableOptionCentering??!1;get compareWith(){return this._compareWith}set compareWith(A){this._compareWith=A,this._selectionModel&&this._initializeSelection()}get value(){return this._value}set value(A){this._assignValue(A)&&this._onChange(A)}_value;ariaLabel="";ariaLabelledby;get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}typeaheadDebounceInterval;sortComparator;get id(){return this._id}set id(A){this._id=A||this._uid,this.stateChanges.next()}_id;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}panelWidth=this._defaultOptions&&typeof this._defaultOptions.panelWidth<"u"?this._defaultOptions.panelWidth:"auto";canSelectNullableOptions=this._defaultOptions?.canSelectNullableOptions??!1;optionSelectionChanges=Rc(()=>{let A=this.options;return A?A.changes.pipe(Yn(A),Mi(()=>Vi(...A.map(t=>t.onSelectionChange)))):this._initialized.pipe(Mi(()=>this.optionSelectionChanges))});openedChange=new FA;_openedStream=this.openedChange.pipe(Bt(A=>A),Se(()=>{}));_closedStream=this.openedChange.pipe(Bt(A=>!A),Se(()=>{}));selectionChange=new FA;valueChange=new FA;constructor(){let A=w(HI),t=w(FI,{optional:!0}),n=w(qC,{optional:!0}),o=w(new Ys("tabindex"),{optional:!0}),a=w(ou,{optional:!0});this.ngControl&&(this.ngControl.valueAccessor=this),this._defaultOptions?.typeaheadDebounceInterval!=null&&(this.typeaheadDebounceInterval=this._defaultOptions.typeaheadDebounceInterval),this._errorStateTracker=new zI(A,this.ngControl,n,t,this.stateChanges),this._scrollStrategy=this._scrollStrategyFactory(),this.tabIndex=o==null?0:parseInt(o)||0,this._popoverLocation=a?.usePopover===!1?null:"inline",this.id=this.id}ngOnInit(){this._selectionModel=new P0(this.multiple),this.stateChanges.next(),this._viewportRuler.change().pipe(yt(this._destroy)).subscribe(()=>{this.panelOpen&&(this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._changeDetectorRef.detectChanges())})}ngAfterContentInit(){this._initialized.next(),this._initialized.complete(),this._initKeyManager(),this._selectionModel.changed.pipe(yt(this._destroy)).subscribe(A=>{A.added.forEach(t=>t.select()),A.removed.forEach(t=>t.deselect())}),this.options.changes.pipe(Yn(null),yt(this._destroy)).subscribe(()=>{this._resetOptions(),this._initializeSelection()})}ngDoCheck(){let A=this._getTriggerAriaLabelledby(),t=this.ngControl;if(A!==this._triggerAriaLabelledBy){let n=this._elementRef.nativeElement;this._triggerAriaLabelledBy=A,A?n.setAttribute("aria-labelledby",A):n.removeAttribute("aria-labelledby")}t&&(this._previousControl!==t.control&&(this._previousControl!==void 0&&t.disabled!==null&&t.disabled!==this.disabled&&(this.disabled=t.disabled),this._previousControl=t.control),this.updateErrorState())}ngOnChanges(A){(A.disabled||A.userAriaDescribedBy)&&this.stateChanges.next(),A.typeaheadDebounceInterval&&this._keyManager&&this._keyManager.withTypeAhead(this.typeaheadDebounceInterval),A.panelClass&&this.panelClass instanceof Set&&(this.panelClass=Array.from(this.panelClass))}ngOnDestroy(){this._cleanupDetach?.(),this._keyManager?.destroy(),this._destroy.next(),this._destroy.complete(),this.stateChanges.complete(),this._clearFromModal()}toggle(){this.panelOpen?this.close():this.open()}open(){this._canOpen()&&(this._parentFormField&&(this._preferredOverlayOrigin=this._parentFormField.getConnectedOverlayOrigin()),this._cleanupDetach?.(),this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._applyModalPanelOwnership(),this._panelOpen=!0,this._overlayDir.positionChange.pipe(Ro(1)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this._positioningSettled()}),this._overlayDir.attachOverlay(),this._keyManager.withHorizontalOrientation(null),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this.stateChanges.next(),Promise.resolve().then(()=>this.openedChange.emit(!0)))}_trackedModal=null;_applyModalPanelOwnership(){let A=this._elementRef.nativeElement.closest('body > .cdk-overlay-container [aria-modal="true"]');if(!A)return;let t=`${this.id}-panel`;this._trackedModal&&U3(this._trackedModal,"aria-owns",t),wv(A,"aria-owns",t),this._trackedModal=A}_clearFromModal(){if(!this._trackedModal)return;let A=`${this.id}-panel`;U3(this._trackedModal,"aria-owns",A),this._trackedModal=null}close(){this._panelOpen&&(this._panelOpen=!1,this._exitAndDetach(),this._keyManager.withHorizontalOrientation(this._isRtl()?"rtl":"ltr"),this._changeDetectorRef.markForCheck(),this._onTouched(),this.stateChanges.next(),Promise.resolve().then(()=>this.openedChange.emit(!1)))}_exitAndDetach(){if(this._animationsDisabled||!this.panel){this._detachOverlay();return}this._cleanupDetach?.(),this._cleanupDetach=()=>{t(),clearTimeout(n),this._cleanupDetach=void 0};let A=this.panel.nativeElement,t=this._renderer.listen(A,"animationend",o=>{o.animationName==="_mat-select-exit"&&(this._cleanupDetach?.(),this._detachOverlay())}),n=setTimeout(()=>{this._cleanupDetach?.(),this._detachOverlay()},200);A.classList.add("mat-select-panel-exit")}_detachOverlay(){this._overlayDir.detachOverlay(),this._changeDetectorRef.markForCheck()}writeValue(A){this._assignValue(A)}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck(),this.stateChanges.next()}get panelOpen(){return this._panelOpen}get selected(){return this.multiple?this._selectionModel?.selected||[]:this._selectionModel?.selected[0]}get triggerValue(){if(this.empty)return"";if(this._multiple){let A=this._selectionModel.selected.map(t=>t.viewValue);return this._isRtl()&&A.reverse(),A.join(", ")}return this._selectionModel.selected[0].viewValue}updateErrorState(){this._errorStateTracker.updateErrorState()}_isRtl(){return this._dir?this._dir.value==="rtl":!1}_handleKeydown(A){this.disabled||(this.panelOpen?this._handleOpenKeydown(A):this._handleClosedKeydown(A))}_handleClosedKeydown(A){let t=A.keyCode,n=t===40||t===38||t===37||t===39,o=t===13||t===32,a=this._keyManager;if(!a.isTyping()&&o&&!Sa(A)||(this.multiple||A.altKey)&&n)A.preventDefault(),this.open();else if(!this.multiple){let r=this.selected;a.onKeydown(A);let s=this.selected;s&&r!==s&&this._liveAnnouncer.announce(s.viewValue,1e4)}}_handleOpenKeydown(A){let t=this._keyManager,n=A.keyCode,o=n===40||n===38,a=t.isTyping();if(o&&A.altKey)A.preventDefault(),this.close();else if(!a&&(n===13||n===32)&&t.activeItem&&!Sa(A))A.preventDefault(),t.activeItem._selectViaInteraction();else if(!a&&this._multiple&&n===65&&A.ctrlKey){A.preventDefault();let r=this.options.some(s=>!s.disabled&&!s.selected);this.options.forEach(s=>{s.disabled||(r?s.select():s.deselect())})}else{let r=t.activeItemIndex;t.onKeydown(A),this._multiple&&o&&A.shiftKey&&t.activeItem&&t.activeItemIndex!==r&&t.activeItem._selectViaInteraction()}}_handleOverlayKeydown(A){A.keyCode===27&&!Sa(A)&&(A.preventDefault(),this.close())}_onFocus(){this.disabled||(this._focused=!0,this.stateChanges.next())}_onBlur(){this._focused=!1,this._keyManager?.cancelTypeahead(),!this.disabled&&!this.panelOpen&&(this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}get empty(){return!this._selectionModel||this._selectionModel.isEmpty()}_initializeSelection(){Promise.resolve().then(()=>{this.ngControl&&(this._value=this.ngControl.value),this._setSelectionByValue(this._value),this.stateChanges.next()})}_setSelectionByValue(A){if(this.options.forEach(t=>t.setInactiveStyles()),this._selectionModel.clear(),this.multiple&&A)Array.isArray(A),A.forEach(t=>this._selectOptionByValue(t)),this._sortValues();else{let t=this._selectOptionByValue(A);t?this._keyManager.updateActiveItem(t):this.panelOpen||this._keyManager.updateActiveItem(-1)}this._changeDetectorRef.markForCheck()}_selectOptionByValue(A){let t=this.options.find(n=>{if(this._selectionModel.isSelected(n))return!1;try{return(n.value!=null||this.canSelectNullableOptions)&&this._compareWith(n.value,A)}catch(o){return!1}});return t&&this._selectionModel.select(t),t}_assignValue(A){return A!==this._value||this._multiple&&Array.isArray(A)?(this.options&&this._setSelectionByValue(A),this._value=A,!0):!1}_skipPredicate=A=>this.panelOpen?!1:A.disabled;_getOverlayWidth(A){return this.panelWidth==="auto"?(A instanceof dB?A.elementRef:A||this._elementRef).nativeElement.getBoundingClientRect().width:this.panelWidth===null?"":this.panelWidth}_syncParentProperties(){if(this.options)for(let A of this.options)A._changeDetectorRef.markForCheck()}_initKeyManager(){this._keyManager=new QQ(this.options).withTypeAhead(this.typeaheadDebounceInterval).withVerticalOrientation().withHorizontalOrientation(this._isRtl()?"rtl":"ltr").withHomeAndEnd().withPageUpDown().withAllowedModifierKeys(["shiftKey"]).skipPredicate(this._skipPredicate),this._keyManager.tabOut.subscribe(()=>{this.panelOpen&&(!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction(),this.focus(),this.close())}),this._keyManager.change.subscribe(()=>{this._panelOpen&&this.panel?this._scrollOptionIntoView(this._keyManager.activeItemIndex||0):!this._panelOpen&&!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction()})}_resetOptions(){let A=Vi(this.options.changes,this._destroy);this.optionSelectionChanges.pipe(yt(A)).subscribe(t=>{this._onSelect(t.source,t.isUserInput),t.isUserInput&&!this.multiple&&this._panelOpen&&(this.close(),this.focus())}),Vi(...this.options.map(t=>t._stateChanges)).pipe(yt(A)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this.stateChanges.next()})}_onSelect(A,t){let n=this._selectionModel.isSelected(A);!this.canSelectNullableOptions&&A.value==null&&!this._multiple?(A.deselect(),this._selectionModel.clear(),this.value!=null&&this._propagateChanges(A.value)):(n!==A.selected&&(A.selected?this._selectionModel.select(A):this._selectionModel.deselect(A)),t&&this._keyManager.setActiveItem(A),this.multiple&&(this._sortValues(),t&&this.focus())),n!==this._selectionModel.isSelected(A)&&this._propagateChanges(),this.stateChanges.next()}_sortValues(){if(this.multiple){let A=this.options.toArray();this._selectionModel.sort((t,n)=>this.sortComparator?this.sortComparator(t,n,A):A.indexOf(t)-A.indexOf(n)),this.stateChanges.next()}}_propagateChanges(A){let t;this.multiple?t=this.selected.map(n=>n.value):t=this.selected?this.selected.value:A,this._value=t,this.valueChange.emit(t),this._onChange(t),this.selectionChange.emit(this._getChangeEvent(t)),this._changeDetectorRef.markForCheck()}_highlightCorrectOption(){if(this._keyManager)if(this.empty){let A=-1;for(let t=0;t0&&!!this._overlayDir}focus(A){this._elementRef.nativeElement.focus(A)}_getPanelAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||null,t=A?A+" ":"";return this.ariaLabelledby?t+this.ariaLabelledby:A}_getAriaActiveDescendant(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null}_getTriggerAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||"";return this.ariaLabelledby&&(A+=" "+this.ariaLabelledby),A||(A=this._valueId),A}get describedByIds(){return this._elementRef.nativeElement.getAttribute("aria-describedby")?.split(" ")||[]}setDescribedByIds(A){let t=this._elementRef.nativeElement;A.length?t.setAttribute("aria-describedby",A.join(" ")):t.removeAttribute("aria-describedby")}onContainerClick(A){let t=Pr(A);t&&(t.tagName==="MAT-OPTION"||t.classList.contains("cdk-overlay-backdrop")||t.closest(".mat-mdc-select-panel"))||(this.focus(),this.open())}get shouldLabelFloat(){return this.panelOpen||!this.empty||this.focused&&!!this.placeholder}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-select"]],contentQueries:function(t,n,o){if(t&1&&ra(o,ZaA,5)(o,Vr,5)(o,um,5),t&2){let a;se(a=le())&&(n.customTrigger=a.first),se(a=le())&&(n.options=a),se(a=le())&&(n.optionGroups=a)}},viewQuery:function(t,n){if(t&1&&Wt(TaA,5)(OaA,5)(gm,5),t&2){let o;se(o=le())&&(n.trigger=o.first),se(o=le())&&(n.panel=o.first),se(o=le())&&(n._overlayDir=o.first)}},hostAttrs:["role","combobox","aria-haspopup","listbox",1,"mat-mdc-select"],hostVars:21,hostBindings:function(t,n){t&1&&U("keydown",function(a){return n._handleKeydown(a)})("focus",function(){return n._onFocus()})("blur",function(){return n._onBlur()}),t&2&&(ie("id",n.id)("tabindex",n.disabled?-1:n.tabIndex)("aria-controls",n.panelOpen?n.id+"-panel":null)("aria-expanded",n.panelOpen)("aria-label",n.ariaLabel||null)("aria-required",n.required.toString())("aria-disabled",n.disabled.toString())("aria-invalid",n.errorState)("aria-activedescendant",n._getAriaActiveDescendant()),_A("mat-mdc-select-disabled",n.disabled)("mat-mdc-select-invalid",n.errorState)("mat-mdc-select-required",n.required)("mat-mdc-select-empty",n.empty)("mat-mdc-select-multiple",n.multiple)("mat-select-open",n.panelOpen))},inputs:{userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],panelClass:"panelClass",disabled:[2,"disabled","disabled",Qe],disableRipple:[2,"disableRipple","disableRipple",Qe],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:yn(A)],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",Qe],placeholder:"placeholder",required:[2,"required","required",Qe],multiple:[2,"multiple","multiple",Qe],disableOptionCentering:[2,"disableOptionCentering","disableOptionCentering",Qe],compareWith:"compareWith",value:"value",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],errorStateMatcher:"errorStateMatcher",typeaheadDebounceInterval:[2,"typeaheadDebounceInterval","typeaheadDebounceInterval",yn],sortComparator:"sortComparator",id:"id",panelWidth:"panelWidth",canSelectNullableOptions:[2,"canSelectNullableOptions","canSelectNullableOptions",Qe]},outputs:{openedChange:"openedChange",_openedStream:"opened",_closedStream:"closed",selectionChange:"selectionChange",valueChange:"valueChange"},exportAs:["matSelect"],features:[pt([{provide:wQ,useExisting:i},{provide:Qm,useExisting:i}]),ii],ngContentSelectors:YaA,decls:11,vars:10,consts:[["fallbackOverlayOrigin","cdkOverlayOrigin","trigger",""],["panel",""],["cdk-overlay-origin","",1,"mat-mdc-select-trigger",3,"click"],[1,"mat-mdc-select-value"],[1,"mat-mdc-select-placeholder","mat-mdc-select-min-line"],[1,"mat-mdc-select-value-text"],[1,"mat-mdc-select-arrow-wrapper"],[1,"mat-mdc-select-arrow"],["viewBox","0 0 24 24","width","24px","height","24px","focusable","false","aria-hidden","true"],["d","M7 10l5 5 5-5z"],["cdk-connected-overlay","","cdkConnectedOverlayHasBackdrop","","cdkConnectedOverlayBackdropClass","cdk-overlay-transparent-backdrop",3,"detach","backdropClick","overlayKeydown","cdkConnectedOverlayDisableClose","cdkConnectedOverlayPanelClass","cdkConnectedOverlayScrollStrategy","cdkConnectedOverlayOrigin","cdkConnectedOverlayPositions","cdkConnectedOverlayWidth","cdkConnectedOverlayFlexibleDimensions","cdkConnectedOverlayUsePopover"],[1,"mat-mdc-select-min-line"],["role","listbox","tabindex","-1",1,"mat-mdc-select-panel","mdc-menu-surface","mdc-menu-surface--open",3,"keydown"]],template:function(t,n){if(t&1&&(Ot(JaA),I(0,"div",2,0),U("click",function(){return n.open()}),I(3,"div",3),T(4,HaA,2,1,"span",4)(5,jaA,3,1,"span",5),h(),I(6,"div",6)(7,"div",7),Et(),I(8,"svg",8),lA(9,"path",9),h()()()(),kt(10,VaA,3,16,"ng-template",10),U("detach",function(){return n.close()})("backdropClick",function(){return n.close()})("overlayKeydown",function(a){return n._handleOverlayKeydown(a)})),t&2){let o=Bi(1);Q(3),ie("id",n._valueId),Q(),O(n.empty?4:5),Q(6),H("cdkConnectedOverlayDisableClose",!0)("cdkConnectedOverlayPanelClass",n._overlayPanelClass)("cdkConnectedOverlayScrollStrategy",n._scrollStrategy)("cdkConnectedOverlayOrigin",n._preferredOverlayOrigin||o)("cdkConnectedOverlayPositions",n._positions)("cdkConnectedOverlayWidth",n._overlayWidth)("cdkConnectedOverlayFlexibleDimensions",!0)("cdkConnectedOverlayUsePopover",n._popoverLocation)}},dependencies:[dB,gm],styles:[`@keyframes _mat-select-enter{from{opacity:0;transform:scaleY(0.8)}to{opacity:1;transform:none}}@keyframes _mat-select-exit{from{opacity:1}to{opacity:0}}.mat-mdc-select{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-sys-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-sys-body-large-tracking))}div.mat-mdc-select-panel{box-shadow:var(--mat-select-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12))}.mat-mdc-select-disabled{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-disabled .mat-mdc-select-placeholder{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-trigger{display:inline-flex;align-items:center;cursor:pointer;position:relative;box-sizing:border-box;width:100%}.mat-mdc-select-disabled .mat-mdc-select-trigger{-webkit-user-select:none;user-select:none;cursor:default}.mat-mdc-select-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-mdc-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-mdc-select-arrow-wrapper{height:24px;flex-shrink:0;display:inline-flex;align-items:center}.mat-form-field-appearance-fill .mdc-text-field--no-label .mat-mdc-select-arrow-wrapper{transform:none}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-invalid .mat-mdc-select-arrow,.mat-form-field-invalid:not(.mat-form-field-disabled) .mat-mdc-form-field-infix::after{color:var(--mat-select-invalid-arrow-color, var(--mat-sys-error))}.mat-mdc-select-arrow{width:10px;height:5px;position:relative;color:var(--mat-select-enabled-arrow-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field.mat-focused .mat-mdc-select-arrow{color:var(--mat-select-focused-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-disabled .mat-mdc-select-arrow{color:var(--mat-select-disabled-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-select-open .mat-mdc-select-arrow{transform:rotate(180deg)}.mat-form-field-animations-enabled .mat-mdc-select-arrow{transition:transform 80ms linear}.mat-mdc-select-arrow svg{fill:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}@media(forced-colors: active){.mat-mdc-select-arrow svg{fill:CanvasText}.mat-mdc-select-disabled .mat-mdc-select-arrow svg{fill:GrayText}}div.mat-mdc-select-panel{width:100%;max-height:275px;outline:0;overflow:auto;padding:8px 0;border-radius:4px;box-sizing:border-box;position:relative;background-color:var(--mat-select-panel-background-color, var(--mat-sys-surface-container))}@media(forced-colors: active){div.mat-mdc-select-panel{outline:solid 1px}}.cdk-overlay-pane:not(.mat-mdc-select-panel-above) div.mat-mdc-select-panel{border-top-left-radius:0;border-top-right-radius:0;transform-origin:top center}.mat-mdc-select-panel-above div.mat-mdc-select-panel{border-bottom-left-radius:0;border-bottom-right-radius:0;transform-origin:bottom center}.mat-select-panel-animations-enabled{animation:_mat-select-enter 120ms cubic-bezier(0, 0, 0.2, 1)}.mat-select-panel-animations-enabled.mat-select-panel-exit{animation:_mat-select-exit 100ms linear}.mat-mdc-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1);color:var(--mat-select-placeholder-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field:not(.mat-form-field-animations-enabled) .mat-mdc-select-placeholder,._mat-animation-noopable .mat-mdc-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-mdc-select-placeholder{color:rgba(0,0,0,0);-webkit-text-fill-color:rgba(0,0,0,0);transition:none;display:block}.mat-mdc-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mat-mdc-floating-label{max-width:calc(100% - 18px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mdc-floating-label--float-above{max-width:calc(100%/0.75 - 24px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-text-field--label-floating .mdc-notched-outline__notch{max-width:calc(100% - 24px)}.mat-mdc-select-min-line:empty::before{content:" ";white-space:pre;width:1px;display:inline-block;visibility:hidden}.mat-form-field-appearance-fill .mat-mdc-select-arrow-wrapper{transform:var(--mat-select-arrow-transform, translateY(-8px))} -`],encapsulation:2,changeDetection:0})}return i})();var W0=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[eg,B7,Di,Vc,Za,B7]})}return i})();var XaA=["tooltip"],$aA=20;var ArA=new MA("mat-tooltip-scroll-strategy",{providedIn:"root",factory:()=>{let i=w(St);return()=>V0(i,{scrollThrottle:$aA})}}),erA=new MA("mat-tooltip-default-options",{providedIn:"root",factory:()=>({showDelay:0,hideDelay:0,touchendHideDelay:1500})});var CT="tooltip-panel",trA={passive:!0},irA=8,nrA=8,orA=24,arA=200,rn=(()=>{class i{_elementRef=w(ce);_ngZone=w(We);_platform=w(Qi);_ariaDescriber=w(xL);_focusMonitor=w(rr);_dir=w(No);_injector=w(St);_viewContainerRef=w(Jo);_mediaMatcher=w(KI);_document=w(ci);_renderer=w(on);_animationsDisabled=In();_defaultOptions=w(erA,{optional:!0});_overlayRef=null;_tooltipInstance=null;_overlayPanelClass;_portal;_position="below";_positionAtOrigin=!1;_disabled=!1;_tooltipClass;_viewInitialized=!1;_pointerExitEventsInitialized=!1;_tooltipComponent=dT;_viewportMargin=8;_currentPosition;_cssClassPrefix="mat-mdc";_ariaDescriptionPending=!1;_dirSubscribed=!1;get position(){return this._position}set position(A){A!==this._position&&(this._position=A,this._overlayRef&&(this._updatePosition(this._overlayRef),this._tooltipInstance?.show(0),this._overlayRef.updatePosition()))}get positionAtOrigin(){return this._positionAtOrigin}set positionAtOrigin(A){this._positionAtOrigin=kr(A),this._detach(),this._overlayRef=null}get disabled(){return this._disabled}set disabled(A){let t=kr(A);this._disabled!==t&&(this._disabled=t,t?this.hide(0):this._setupPointerEnterEventsIfNeeded(),this._syncAriaDescription(this.message))}get showDelay(){return this._showDelay}set showDelay(A){this._showDelay=qs(A)}_showDelay;get hideDelay(){return this._hideDelay}set hideDelay(A){this._hideDelay=qs(A),this._tooltipInstance&&(this._tooltipInstance._mouseLeaveHideDelay=this._hideDelay)}_hideDelay;touchGestures="auto";get message(){return this._message}set message(A){let t=this._message;this._message=A!=null?String(A).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._setupPointerEnterEventsIfNeeded(),this._updateTooltipMessage()),this._syncAriaDescription(t)}_message="";get tooltipClass(){return this._tooltipClass}set tooltipClass(A){this._tooltipClass=A,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)}_eventCleanups=[];_touchstartTimeout=null;_destroyed=new ne;_isDestroyed=!1;constructor(){let A=this._defaultOptions;A&&(this._showDelay=A.showDelay,this._hideDelay=A.hideDelay,A.position&&(this.position=A.position),A.positionAtOrigin&&(this.positionAtOrigin=A.positionAtOrigin),A.touchGestures&&(this.touchGestures=A.touchGestures),A.tooltipClass&&(this.tooltipClass=A.tooltipClass)),this._viewportMargin=irA}ngAfterViewInit(){this._viewInitialized=!0,this._setupPointerEnterEventsIfNeeded(),this._focusMonitor.monitor(this._elementRef).pipe(yt(this._destroyed)).subscribe(A=>{A?A==="keyboard"&&this._ngZone.run(()=>this.show()):this._ngZone.run(()=>this.hide(0))})}ngOnDestroy(){let A=this._elementRef.nativeElement;this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this._overlayRef&&(this._overlayRef.dispose(),this._tooltipInstance=null),this._eventCleanups.forEach(t=>t()),this._eventCleanups.length=0,this._destroyed.next(),this._destroyed.complete(),this._isDestroyed=!0,this._ariaDescriber.removeDescription(A,this.message,"tooltip"),this._focusMonitor.stopMonitoring(A)}show(A=this.showDelay,t){if(this.disabled||!this.message||this._isTooltipVisible()){this._tooltipInstance?._cancelPendingAnimations();return}let n=this._createOverlay(t);this._detach(),this._portal=this._portal||new Fs(this._tooltipComponent,this._viewContainerRef);let o=this._tooltipInstance=n.attach(this._portal).instance;o._triggerElement=this._elementRef.nativeElement,o._mouseLeaveHideDelay=this._hideDelay,o.afterHidden().pipe(yt(this._destroyed)).subscribe(()=>this._detach()),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),o.show(A)}hide(A=this.hideDelay){let t=this._tooltipInstance;t&&(t.isVisible()?t.hide(A):(t._cancelPendingAnimations(),this._detach()))}toggle(A){this._isTooltipVisible()?this.hide():this.show(void 0,A)}_isTooltipVisible(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()}_createOverlay(A){if(this._overlayRef){let a=this._overlayRef.getConfig().positionStrategy;if((!this.positionAtOrigin||!A)&&a._origin instanceof ce)return this._overlayRef;this._detach()}let t=this._injector.get(qc).getAncestorScrollContainers(this._elementRef),n=`${this._cssClassPrefix}-${CT}`,o=od(this._injector,this.positionAtOrigin?A||this._elementRef:this._elementRef).withTransformOriginOn(`.${this._cssClassPrefix}-tooltip`).withFlexibleDimensions(!1).withViewportMargin(this._viewportMargin).withScrollableContainers(t).withPopoverLocation("global");return o.positionChanges.pipe(yt(this._destroyed)).subscribe(a=>{this._updateCurrentPositionClass(a.connectionPair),this._tooltipInstance&&a.scrollableViewProperties.isOverlayClipped&&this._tooltipInstance.isVisible()&&this._ngZone.run(()=>this.hide(0))}),this._overlayRef=Pg(this._injector,{direction:this._dir,positionStrategy:o,panelClass:this._overlayPanelClass?[...this._overlayPanelClass,n]:n,scrollStrategy:this._injector.get(ArA)(),disableAnimations:this._animationsDisabled,eventPredicate:this._overlayEventPredicate}),this._updatePosition(this._overlayRef),this._overlayRef.detachments().pipe(yt(this._destroyed)).subscribe(()=>this._detach()),this._overlayRef.outsidePointerEvents().pipe(yt(this._destroyed)).subscribe(()=>this._tooltipInstance?._handleBodyInteraction()),this._overlayRef.keydownEvents().pipe(yt(this._destroyed)).subscribe(a=>{a.preventDefault(),a.stopPropagation(),this._ngZone.run(()=>this.hide(0))}),this._defaultOptions?.disableTooltipInteractivity&&this._overlayRef.addPanelClass(`${this._cssClassPrefix}-tooltip-panel-non-interactive`),this._dirSubscribed||(this._dirSubscribed=!0,this._dir.change.pipe(yt(this._destroyed)).subscribe(()=>{this._overlayRef&&this._updatePosition(this._overlayRef)})),this._overlayRef}_detach(){this._overlayRef&&this._overlayRef.hasAttached()&&this._overlayRef.detach(),this._tooltipInstance=null}_updatePosition(A){let t=A.getConfig().positionStrategy,n=this._getOrigin(),o=this._getOverlayPosition();t.withPositions([this._addOffset(P(P({},n.main),o.main)),this._addOffset(P(P({},n.fallback),o.fallback))])}_addOffset(A){let t=nrA,n=!this._dir||this._dir.value=="ltr";return A.originY==="top"?A.offsetY=-t:A.originY==="bottom"?A.offsetY=t:A.originX==="start"?A.offsetX=n?-t:t:A.originX==="end"&&(A.offsetX=n?t:-t),A}_getOrigin(){let A=!this._dir||this._dir.value=="ltr",t=this.position,n;t=="above"||t=="below"?n={originX:"center",originY:t=="above"?"top":"bottom"}:t=="before"||t=="left"&&A||t=="right"&&!A?n={originX:"start",originY:"center"}:(t=="after"||t=="right"&&A||t=="left"&&!A)&&(n={originX:"end",originY:"center"});let{x:o,y:a}=this._invertPosition(n.originX,n.originY);return{main:n,fallback:{originX:o,originY:a}}}_getOverlayPosition(){let A=!this._dir||this._dir.value=="ltr",t=this.position,n;t=="above"?n={overlayX:"center",overlayY:"bottom"}:t=="below"?n={overlayX:"center",overlayY:"top"}:t=="before"||t=="left"&&A||t=="right"&&!A?n={overlayX:"end",overlayY:"center"}:(t=="after"||t=="right"&&A||t=="left"&&!A)&&(n={overlayX:"start",overlayY:"center"});let{x:o,y:a}=this._invertPosition(n.overlayX,n.overlayY);return{main:n,fallback:{overlayX:o,overlayY:a}}}_updateTooltipMessage(){this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),ao(()=>{this._tooltipInstance&&this._overlayRef.updatePosition()},{injector:this._injector}))}_setTooltipClass(A){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=A instanceof Set?Array.from(A):A,this._tooltipInstance._markForCheck())}_invertPosition(A,t){return this.position==="above"||this.position==="below"?t==="top"?t="bottom":t==="bottom"&&(t="top"):A==="end"?A="start":A==="start"&&(A="end"),{x:A,y:t}}_updateCurrentPositionClass(A){let{overlayY:t,originX:n,originY:o}=A,a;if(t==="center"?this._dir&&this._dir.value==="rtl"?a=n==="end"?"left":"right":a=n==="start"?"left":"right":a=t==="bottom"&&o==="top"?"above":"below",a!==this._currentPosition){let r=this._overlayRef;if(r){let s=`${this._cssClassPrefix}-${CT}-`;r.removePanelClass(s+this._currentPosition),r.addPanelClass(s+a)}this._currentPosition=a}}_setupPointerEnterEventsIfNeeded(){this._disabled||!this.message||!this._viewInitialized||this._eventCleanups.length||(this._isTouchPlatform()?this.touchGestures!=="off"&&(this._disableNativeGesturesIfNecessary(),this._addListener("touchstart",A=>{let t=A.targetTouches?.[0],n=t?{x:t.clientX,y:t.clientY}:void 0;this._setupPointerExitEventsIfNeeded(),this._touchstartTimeout&&clearTimeout(this._touchstartTimeout);let o=500;this._touchstartTimeout=setTimeout(()=>{this._touchstartTimeout=null,this.show(void 0,n)},this._defaultOptions?.touchLongPressShowDelay??o)})):this._addListener("mouseenter",A=>{this._setupPointerExitEventsIfNeeded();let t;A.x!==void 0&&A.y!==void 0&&(t=A),this.show(void 0,t)}))}_setupPointerExitEventsIfNeeded(){if(!this._pointerExitEventsInitialized){if(this._pointerExitEventsInitialized=!0,!this._isTouchPlatform())this._addListener("mouseleave",A=>{let t=A.relatedTarget;(!t||!this._overlayRef?.overlayElement.contains(t))&&this.hide()}),this._addListener("wheel",A=>{if(this._isTooltipVisible()){let t=this._document.elementFromPoint(A.clientX,A.clientY),n=this._elementRef.nativeElement;t!==n&&!n.contains(t)&&this.hide()}});else if(this.touchGestures!=="off"){this._disableNativeGesturesIfNecessary();let A=()=>{this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this.hide(this._defaultOptions?.touchendHideDelay)};this._addListener("touchend",A),this._addListener("touchcancel",A)}}}_addListener(A,t){this._eventCleanups.push(this._renderer.listen(this._elementRef.nativeElement,A,t,trA))}_isTouchPlatform(){return this._platform.IOS||this._platform.ANDROID?!0:this._platform.isBrowser?!!this._defaultOptions?.detectHoverCapability&&this._mediaMatcher.matchMedia("(any-hover: none)").matches:!1}_disableNativeGesturesIfNecessary(){let A=this.touchGestures;if(A!=="off"){let t=this._elementRef.nativeElement,n=t.style;(A==="on"||t.nodeName!=="INPUT"&&t.nodeName!=="TEXTAREA")&&(n.userSelect=n.msUserSelect=n.webkitUserSelect=n.MozUserSelect="none"),(A==="on"||!t.draggable)&&(n.webkitUserDrag="none"),n.touchAction="none",n.webkitTapHighlightColor="transparent"}}_syncAriaDescription(A){this._ariaDescriptionPending||(this._ariaDescriptionPending=!0,this._ariaDescriber.removeDescription(this._elementRef.nativeElement,A,"tooltip"),this._isDestroyed||ao({write:()=>{this._ariaDescriptionPending=!1,this.message&&!this.disabled&&this._ariaDescriber.describe(this._elementRef.nativeElement,this.message,"tooltip")}},{injector:this._injector}))}_overlayEventPredicate=A=>A.type==="keydown"?this._isTooltipVisible()&&A.keyCode===27&&!Sa(A):!0;static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","matTooltip",""]],hostAttrs:[1,"mat-mdc-tooltip-trigger"],hostVars:2,hostBindings:function(t,n){t&2&&_A("mat-mdc-tooltip-disabled",n.disabled)},inputs:{position:[0,"matTooltipPosition","position"],positionAtOrigin:[0,"matTooltipPositionAtOrigin","positionAtOrigin"],disabled:[0,"matTooltipDisabled","disabled"],showDelay:[0,"matTooltipShowDelay","showDelay"],hideDelay:[0,"matTooltipHideDelay","hideDelay"],touchGestures:[0,"matTooltipTouchGestures","touchGestures"],message:[0,"matTooltip","message"],tooltipClass:[0,"matTooltipClass","tooltipClass"]},exportAs:["matTooltip"]})}return i})(),dT=(()=>{class i{_changeDetectorRef=w(Mt);_elementRef=w(ce);_isMultiline=!1;message;tooltipClass;_showTimeoutId;_hideTimeoutId;_triggerElement;_mouseLeaveHideDelay;_animationsDisabled=In();_tooltip;_closeOnInteraction=!1;_isVisible=!1;_onHide=new ne;_showAnimation="mat-mdc-tooltip-show";_hideAnimation="mat-mdc-tooltip-hide";constructor(){}show(A){this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=setTimeout(()=>{this._toggleVisibility(!0),this._showTimeoutId=void 0},A)}hide(A){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(()=>{this._toggleVisibility(!1),this._hideTimeoutId=void 0},A)}afterHidden(){return this._onHide}isVisible(){return this._isVisible}ngOnDestroy(){this._cancelPendingAnimations(),this._onHide.complete(),this._triggerElement=null}_handleBodyInteraction(){this._closeOnInteraction&&this.hide(0)}_markForCheck(){this._changeDetectorRef.markForCheck()}_handleMouseLeave({relatedTarget:A}){(!A||!this._triggerElement.contains(A))&&(this.isVisible()?this.hide(this._mouseLeaveHideDelay):this._finalizeAnimation(!1))}_onShow(){this._isMultiline=this._isTooltipMultiline(),this._markForCheck()}_isTooltipMultiline(){let A=this._elementRef.nativeElement.getBoundingClientRect();return A.height>orA&&A.width>=arA}_handleAnimationEnd({animationName:A}){(A===this._showAnimation||A===this._hideAnimation)&&this._finalizeAnimation(A===this._showAnimation)}_cancelPendingAnimations(){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=this._hideTimeoutId=void 0}_finalizeAnimation(A){A?this._closeOnInteraction=!0:this.isVisible()||this._onHide.next()}_toggleVisibility(A){let t=this._tooltip.nativeElement,n=this._showAnimation,o=this._hideAnimation;if(t.classList.remove(A?o:n),t.classList.add(A?n:o),this._isVisible!==A&&(this._isVisible=A,this._changeDetectorRef.markForCheck()),A&&!this._animationsDisabled&&typeof getComputedStyle=="function"){let a=getComputedStyle(t);(a.getPropertyValue("animation-duration")==="0s"||a.getPropertyValue("animation-name")==="none")&&(this._animationsDisabled=!0)}A&&this._onShow(),this._animationsDisabled&&(t.classList.add("_mat-animation-noopable"),this._finalizeAnimation(A))}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-tooltip-component"]],viewQuery:function(t,n){if(t&1&&Wt(XaA,7),t&2){let o;se(o=le())&&(n._tooltip=o.first)}},hostAttrs:["aria-hidden","true"],hostBindings:function(t,n){t&1&&U("mouseleave",function(a){return n._handleMouseLeave(a)})},decls:4,vars:5,consts:[["tooltip",""],[1,"mdc-tooltip","mat-mdc-tooltip",3,"animationend"],[1,"mat-mdc-tooltip-surface","mdc-tooltip__surface"]],template:function(t,n){t&1&&(Ln(0,"div",1,0),yI("animationend",function(a){return n._handleAnimationEnd(a)}),Ln(2,"div",2),D(3),Xn()()),t&2&&(Ao(n.tooltipClass),_A("mdc-tooltip--multiline",n._isMultiline),Q(3),nA(n.message))},styles:[`.mat-mdc-tooltip{position:relative;transform:scale(0);display:inline-flex}.mat-mdc-tooltip::before{content:"";top:0;right:0;bottom:0;left:0;z-index:-1;position:absolute}.mat-mdc-tooltip-panel-below .mat-mdc-tooltip::before{top:-8px}.mat-mdc-tooltip-panel-above .mat-mdc-tooltip::before{bottom:-8px}.mat-mdc-tooltip-panel-right .mat-mdc-tooltip::before{left:-8px}.mat-mdc-tooltip-panel-left .mat-mdc-tooltip::before{right:-8px}.mat-mdc-tooltip._mat-animation-noopable{animation:none;transform:scale(1)}.mat-mdc-tooltip-surface{word-break:normal;overflow-wrap:anywhere;padding:4px 8px;min-width:40px;max-width:200px;min-height:24px;max-height:40vh;box-sizing:border-box;overflow:hidden;text-align:center;will-change:transform,opacity;background-color:var(--mat-tooltip-container-color, var(--mat-sys-inverse-surface));color:var(--mat-tooltip-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mat-tooltip-container-shape, var(--mat-sys-corner-extra-small));font-family:var(--mat-tooltip-supporting-text-font, var(--mat-sys-body-small-font));font-size:var(--mat-tooltip-supporting-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-tooltip-supporting-text-weight, var(--mat-sys-body-small-weight));line-height:var(--mat-tooltip-supporting-text-line-height, var(--mat-sys-body-small-line-height));letter-spacing:var(--mat-tooltip-supporting-text-tracking, var(--mat-sys-body-small-tracking))}.mat-mdc-tooltip-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:left}[dir=rtl] .mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:right}.mat-mdc-tooltip-panel{line-height:normal}.mat-mdc-tooltip-panel.mat-mdc-tooltip-panel-non-interactive{pointer-events:none}@keyframes mat-mdc-tooltip-show{0%{opacity:0;transform:scale(0.8)}100%{opacity:1;transform:scale(1)}}@keyframes mat-mdc-tooltip-hide{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(0.8)}}.mat-mdc-tooltip-show{animation:mat-mdc-tooltip-show 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-mdc-tooltip-hide{animation:mat-mdc-tooltip-hide 75ms cubic-bezier(0.4, 0, 1, 1) forwards} -`],encapsulation:2,changeDetection:0})}return i})();var Ha=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[EQ,eg,Di,Vc]})}return i})();function rrA(i,e){if(i&1&&(I(0,"mat-option",17),D(1),h()),i&2){let A=e.$implicit;H("value",A),Q(),Ee(" ",A," ")}}function srA(i,e){if(i&1){let A=aA();I(0,"mat-form-field",14)(1,"mat-select",16,0),U("selectionChange",function(n){L(A);let o=p(2);return G(o._changePageSize(n.value))}),ke(3,rrA,2,2,"mat-option",17,ni),h(),I(5,"div",18),U("click",function(){L(A);let n=Bi(2);return G(n.open())}),h()()}if(i&2){let A=p(2);H("appearance",A._formFieldAppearance)("color",A.color),Q(),H("value",A.pageSize)("disabled",A.disabled),g3("aria-labelledby",A._pageSizeLabelId),H("panelClass",A.selectConfig.panelClass||"")("disableOptionCentering",A.selectConfig.disableOptionCentering),Q(2),_e(A._displayedPageSizeOptions)}}function lrA(i,e){if(i&1&&(I(0,"div",15),D(1),h()),i&2){let A=p(2);Q(),nA(A.pageSize)}}function grA(i,e){if(i&1&&(I(0,"div",3)(1,"div",13),D(2),h(),T(3,srA,6,7,"mat-form-field",14),T(4,lrA,2,1,"div",15),h()),i&2){let A=p();Q(),ie("id",A._pageSizeLabelId),Q(),Ee(" ",A._intl.itemsPerPageLabel," "),Q(),O(A._displayedPageSizeOptions.length>1?3:-1),Q(),O(A._displayedPageSizeOptions.length<=1?4:-1)}}function crA(i,e){if(i&1){let A=aA();I(0,"button",19),U("click",function(){L(A);let n=p();return G(n._buttonClicked(0,n._previousButtonsDisabled()))}),Et(),I(1,"svg",8),lA(2,"path",20),h()()}if(i&2){let A=p();H("matTooltip",A._intl.firstPageLabel)("matTooltipDisabled",A._previousButtonsDisabled())("disabled",A._previousButtonsDisabled())("tabindex",A._previousButtonsDisabled()?-1:null),ie("aria-label",A._intl.firstPageLabel)}}function CrA(i,e){if(i&1){let A=aA();I(0,"button",21),U("click",function(){L(A);let n=p();return G(n._buttonClicked(n.getNumberOfPages()-1,n._nextButtonsDisabled()))}),Et(),I(1,"svg",8),lA(2,"path",22),h()()}if(i&2){let A=p();H("matTooltip",A._intl.lastPageLabel)("matTooltipDisabled",A._nextButtonsDisabled())("disabled",A._nextButtonsDisabled())("tabindex",A._nextButtonsDisabled()?-1:null),ie("aria-label",A._intl.lastPageLabel)}}var rd=(()=>{class i{changes=new ne;itemsPerPageLabel="Items per page:";nextPageLabel="Next page";previousPageLabel="Previous page";firstPageLabel="First page";lastPageLabel="Last page";getRangeLabel=(A,t,n)=>{if(n==0||t==0)return`0 of ${n}`;n=Math.max(n,0);let o=A*t,a=o{class i{_intl=w(rd);_changeDetectorRef=w(Mt);_formFieldAppearance;_pageSizeLabelId=w(Dn).getId("mat-paginator-page-size-label-");_intlChanges;_isInitialized=!1;_initializedStream=new _g(1);color;get pageIndex(){return this._pageIndex}set pageIndex(A){this._pageIndex=Math.max(A||0,0),this._changeDetectorRef.markForCheck()}_pageIndex=0;get length(){return this._length}set length(A){this._length=A||0,this._changeDetectorRef.markForCheck()}_length=0;get pageSize(){return this._pageSize}set pageSize(A){this._pageSize=Math.max(A||0,0),this._updateDisplayedPageSizeOptions()}_pageSize;get pageSizeOptions(){return this._pageSizeOptions}set pageSizeOptions(A){this._pageSizeOptions=(A||[]).map(t=>yn(t,0)),this._updateDisplayedPageSizeOptions()}_pageSizeOptions=[];hidePageSize=!1;showFirstLastButtons=!1;selectConfig={};disabled=!1;page=new FA;_displayedPageSizeOptions;initialized=this._initializedStream;constructor(){let A=this._intl,t=w(IrA,{optional:!0});if(this._intlChanges=A.changes.subscribe(()=>this._changeDetectorRef.markForCheck()),t){let{pageSize:n,pageSizeOptions:o,hidePageSize:a,showFirstLastButtons:r}=t;n!=null&&(this._pageSize=n),o!=null&&(this._pageSizeOptions=o),a!=null&&(this.hidePageSize=a),r!=null&&(this.showFirstLastButtons=r)}this._formFieldAppearance=t?.formFieldAppearance||"outline"}ngOnInit(){this._isInitialized=!0,this._updateDisplayedPageSizeOptions(),this._initializedStream.next()}ngOnDestroy(){this._initializedStream.complete(),this._intlChanges.unsubscribe()}nextPage(){this.hasNextPage()&&this._navigate(this.pageIndex+1)}previousPage(){this.hasPreviousPage()&&this._navigate(this.pageIndex-1)}firstPage(){this.hasPreviousPage()&&this._navigate(0)}lastPage(){this.hasNextPage()&&this._navigate(this.getNumberOfPages()-1)}hasPreviousPage(){return this.pageIndex>=1&&this.pageSize!=0}hasNextPage(){let A=this.getNumberOfPages()-1;return this.pageIndexA-t),this._changeDetectorRef.markForCheck())}_emitPageEvent(A){this.page.emit({previousPageIndex:A,pageIndex:this.pageIndex,pageSize:this.pageSize,length:this.length})}_navigate(A){let t=this.pageIndex;A!==t&&(this.pageIndex=A,this._emitPageEvent(t))}_buttonClicked(A,t){t||this._navigate(A)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-paginator"]],hostAttrs:["role","group",1,"mat-mdc-paginator"],inputs:{color:"color",pageIndex:[2,"pageIndex","pageIndex",yn],length:[2,"length","length",yn],pageSize:[2,"pageSize","pageSize",yn],pageSizeOptions:"pageSizeOptions",hidePageSize:[2,"hidePageSize","hidePageSize",Qe],showFirstLastButtons:[2,"showFirstLastButtons","showFirstLastButtons",Qe],selectConfig:"selectConfig",disabled:[2,"disabled","disabled",Qe]},outputs:{page:"page"},exportAs:["matPaginator"],decls:14,vars:14,consts:[["selectRef",""],[1,"mat-mdc-paginator-outer-container"],[1,"mat-mdc-paginator-container"],[1,"mat-mdc-paginator-page-size"],[1,"mat-mdc-paginator-range-actions"],["aria-atomic","true","aria-live","polite","role","status",1,"mat-mdc-paginator-range-label"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"matTooltip","matTooltipDisabled","disabled","tabindex"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-previous",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["viewBox","0 0 24 24","focusable","false","aria-hidden","true",1,"mat-mdc-paginator-icon"],["d","M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-next",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"matTooltip","matTooltipDisabled","disabled","tabindex"],["aria-hidden","true",1,"mat-mdc-paginator-page-size-label"],[1,"mat-mdc-paginator-page-size-select",3,"appearance","color"],[1,"mat-mdc-paginator-page-size-value"],["hideSingleSelectionIndicator","",3,"selectionChange","value","disabled","aria-labelledby","panelClass","disableOptionCentering"],[3,"value"],[1,"mat-mdc-paginator-touch-target",3,"click"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"]],template:function(t,n){t&1&&(I(0,"div",1)(1,"div",2),T(2,grA,5,4,"div",3),I(3,"div",4)(4,"div",5),D(5),h(),T(6,crA,3,5,"button",6),I(7,"button",7),U("click",function(){return n._buttonClicked(n.pageIndex-1,n._previousButtonsDisabled())}),Et(),I(8,"svg",8),lA(9,"path",9),h()(),hr(),I(10,"button",10),U("click",function(){return n._buttonClicked(n.pageIndex+1,n._nextButtonsDisabled())}),Et(),I(11,"svg",8),lA(12,"path",11),h()(),T(13,CrA,3,5,"button",12),h()()()),t&2&&(Q(2),O(n.hidePageSize?-1:2),Q(3),Ee(" ",n._intl.getRangeLabel(n.pageIndex,n.pageSize,n.length)," "),Q(),O(n.showFirstLastButtons?6:-1),Q(),H("matTooltip",n._intl.previousPageLabel)("matTooltipDisabled",n._previousButtonsDisabled())("disabled",n._previousButtonsDisabled())("tabindex",n._previousButtonsDisabled()?-1:null),ie("aria-label",n._intl.previousPageLabel),Q(3),H("matTooltip",n._intl.nextPageLabel)("matTooltipDisabled",n._nextButtonsDisabled())("disabled",n._nextButtonsDisabled())("tabindex",n._nextButtonsDisabled()?-1:null),ie("aria-label",n._intl.nextPageLabel),Q(3),O(n.showFirstLastButtons?13:-1))},dependencies:[Zo,ig,Vr,yi,rn],styles:[`.mat-mdc-paginator{display:block;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-paginator-container-text-color, var(--mat-sys-on-surface));background-color:var(--mat-paginator-container-background-color, var(--mat-sys-surface));font-family:var(--mat-paginator-container-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-paginator-container-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-paginator-container-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-paginator-container-text-weight, var(--mat-sys-body-small-weight));letter-spacing:var(--mat-paginator-container-text-tracking, var(--mat-sys-body-small-tracking));--mat-form-field-container-height: var(--mat-paginator-form-field-container-height, 40px);--mat-form-field-container-vertical-padding: var(--mat-paginator-form-field-container-vertical-padding, 8px)}.mat-mdc-paginator .mat-mdc-select-value{font-size:var(--mat-paginator-select-trigger-text-size, var(--mat-sys-body-small-size))}.mat-mdc-paginator .mat-mdc-form-field-subscript-wrapper{display:none}.mat-mdc-paginator .mat-mdc-select{line-height:1.5}.mat-mdc-paginator-outer-container{display:flex}.mat-mdc-paginator-container{display:flex;align-items:center;justify-content:flex-end;padding:0 8px;flex-wrap:wrap;width:100%;min-height:var(--mat-paginator-container-size, 56px)}.mat-mdc-paginator-page-size{display:flex;align-items:baseline;margin-right:8px}[dir=rtl] .mat-mdc-paginator-page-size{margin-right:0;margin-left:8px}.mat-mdc-paginator-page-size-label{margin:0 4px}.mat-mdc-paginator-page-size-select{margin:0 4px;width:var(--mat-paginator-page-size-select-width, 84px)}.mat-mdc-paginator-range-label{margin:0 32px 0 24px}.mat-mdc-paginator-range-actions{display:flex;align-items:center}.mat-mdc-paginator-icon{display:inline-block;width:28px;fill:var(--mat-paginator-enabled-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon{fill:var(--mat-paginator-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}[dir=rtl] .mat-mdc-paginator-icon{transform:rotate(180deg)}@media(forced-colors: active){.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon,.mat-mdc-paginator-icon{fill:currentColor}.mat-mdc-paginator-range-actions .mat-mdc-icon-button{outline:solid 1px}.mat-mdc-paginator-range-actions .mat-mdc-icon-button[aria-disabled]{color:GrayText}}.mat-mdc-paginator-touch-target{display:var(--mat-paginator-touch-target-display, block);position:absolute;top:50%;left:50%;width:var(--mat-paginator-page-size-select-width, 84px);height:var(--mat-paginator-page-size-select-touch-target-height, 48px);background-color:rgba(0,0,0,0);transform:translate(-50%, -50%);cursor:pointer} -`],encapsulation:2,changeDetection:0})}return i})();var IT=["*"],BrA=["content"],hrA=[[["mat-drawer"]],[["mat-drawer-content"]],"*"],ErA=["mat-drawer","mat-drawer-content","*"];function QrA(i,e){if(i&1){let A=aA();I(0,"div",1),U("click",function(){L(A);let n=p();return G(n._onBackdropClicked())}),h()}if(i&2){let A=p();_A("mat-drawer-shown",A._isShowingBackdrop())}}function urA(i,e){i&1&&(I(0,"mat-drawer-content"),Ze(1,2),h())}var prA=new MA("MAT_DRAWER_DEFAULT_AUTOSIZE",{providedIn:"root",factory:()=>!1}),BT=new MA("MAT_DRAWER_CONTAINER"),E7=(()=>{class i extends j0{_platform=w(Qi);_changeDetectorRef=w(Mt);_container=w(u7);constructor(){let A=w(ce),t=w(qc),n=w(We);super(A,t,n)}ngAfterContentInit(){this._container._contentMarginChanges.subscribe(()=>{this._changeDetectorRef.markForCheck()})}_shouldBeHidden(){if(this._platform.isBrowser)return!1;let{start:A,end:t}=this._container;return A!=null&&A.mode!=="over"&&A.opened||t!=null&&t.mode!=="over"&&t.opened}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-drawer-content"]],hostAttrs:[1,"mat-drawer-content"],hostVars:6,hostBindings:function(t,n){t&2&&(ft("margin-left",n._container._contentMargins.left,"px")("margin-right",n._container._contentMargins.right,"px"),_A("mat-drawer-content-hidden",n._shouldBeHidden()))},features:[pt([{provide:j0,useExisting:i}]),bt],ngContentSelectors:IT,decls:1,vars:0,template:function(t,n){t&1&&(Ot(),Ze(0))},encapsulation:2,changeDetection:0})}return i})(),Q7=(()=>{class i{_elementRef=w(ce);_focusTrapFactory=w(BQ);_focusMonitor=w(rr);_platform=w(Qi);_ngZone=w(We);_renderer=w(on);_interactivityChecker=w(UI);_doc=w(ci);_container=w(BT,{optional:!0});_focusTrap=null;_elementFocusedBeforeDrawerWasOpened=null;_eventCleanups;_isAttached=!1;_anchor=null;get position(){return this._position}set position(A){A=A==="end"?"end":"start",A!==this._position&&(this._isAttached&&this._updatePositionInParent(A),this._position=A,this.onPositionChanged.emit())}_position="start";get mode(){return this._mode}set mode(A){this._mode=A,this._updateFocusTrapState(),this._modeChanged.next()}_mode="over";get disableClose(){return this._disableClose}set disableClose(A){this._disableClose=kr(A)}_disableClose=!1;get autoFocus(){let A=this._autoFocus;return A??(this.mode==="side"?"dialog":"first-tabbable")}set autoFocus(A){(A==="true"||A==="false"||A==null)&&(A=kr(A)),this._autoFocus=A}_autoFocus;get opened(){return this._opened()}set opened(A){this.toggle(kr(A))}_opened=mA(!1);_openedVia=null;_animationStarted=new ne;_animationEnd=new ne;openedChange=new FA(!0);_openedStream=this.openedChange.pipe(Bt(A=>A),Se(()=>{}));openedStart=this._animationStarted.pipe(Bt(()=>this.opened),qE(void 0));_closedStream=this.openedChange.pipe(Bt(A=>!A),Se(()=>{}));closedStart=this._animationStarted.pipe(Bt(()=>!this.opened),qE(void 0));_destroyed=new ne;onPositionChanged=new FA;_content;_modeChanged=new ne;_injector=w(St);_changeDetectorRef=w(Mt);constructor(){this.openedChange.pipe(yt(this._destroyed)).subscribe(A=>{A?(this._elementFocusedBeforeDrawerWasOpened=this._doc.activeElement,this._takeFocus()):this._isFocusWithinDrawer()&&this._restoreFocus(this._openedVia||"program")}),this._eventCleanups=this._ngZone.runOutsideAngular(()=>{let A=this._renderer,t=this._elementRef.nativeElement;return[A.listen(t,"keydown",n=>{n.keyCode===27&&!this.disableClose&&!Sa(n)&&this._ngZone.run(()=>{this.close(),n.stopPropagation(),n.preventDefault()})}),A.listen(t,"transitionrun",this._handleTransitionEvent),A.listen(t,"transitionend",this._handleTransitionEvent),A.listen(t,"transitioncancel",this._handleTransitionEvent)]}),this._animationEnd.subscribe(()=>{this.openedChange.emit(this.opened)})}_forceFocus(A,t){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),a(),A.removeAttribute("tabindex")},o=this._renderer.listen(A,"blur",n),a=this._renderer.listen(A,"mousedown",n)})),A.focus(t)}_focusByCssSelector(A,t){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,t)}_takeFocus(){if(!this._focusTrap)return;let A=this._elementRef.nativeElement;switch(this.autoFocus){case!1:case"dialog":return;case!0:case"first-tabbable":ao(()=>{!this._focusTrap.focusInitialElement()&&typeof A.focus=="function"&&A.focus()},{injector:this._injector});break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]');break;default:this._focusByCssSelector(this.autoFocus);break}}_restoreFocus(A){this.autoFocus!=="dialog"&&(this._elementFocusedBeforeDrawerWasOpened?this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened,A):this._elementRef.nativeElement.blur(),this._elementFocusedBeforeDrawerWasOpened=null)}_isFocusWithinDrawer(){let A=this._doc.activeElement;return!!A&&this._elementRef.nativeElement.contains(A)}ngAfterViewInit(){this._isAttached=!0,this._position==="end"&&this._updatePositionInParent("end"),this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._updateFocusTrapState())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._focusTrap?.destroy(),this._anchor?.remove(),this._anchor=null,this._animationStarted.complete(),this._animationEnd.complete(),this._modeChanged.complete(),this._destroyed.next(),this._destroyed.complete()}open(A){return this.toggle(!0,A)}close(){return this.toggle(!1)}_closeViaBackdropClick(){return this._setOpen(!1,!0,"mouse")}toggle(A=!this.opened,t){A&&t&&(this._openedVia=t);let n=this._setOpen(A,!A&&this._isFocusWithinDrawer(),this._openedVia||"program");return A||(this._openedVia=null),n}_setOpen(A,t,n){return A===this.opened?Promise.resolve(A?"open":"close"):(this._opened.set(A),this._container?._transitionsEnabled?this._setIsAnimating(!0):setTimeout(()=>{this._animationStarted.next(),this._animationEnd.next()}),this._elementRef.nativeElement.classList.toggle("mat-drawer-opened",A),!A&&t&&this._restoreFocus(n),this._changeDetectorRef.markForCheck(),this._updateFocusTrapState(),new Promise(o=>{this.openedChange.pipe(Ro(1)).subscribe(a=>o(a?"open":"close"))}))}_setIsAnimating(A){this._elementRef.nativeElement.classList.toggle("mat-drawer-animating",A)}_getWidth(){return this._elementRef.nativeElement.offsetWidth||0}_updateFocusTrapState(){this._focusTrap&&(this._focusTrap.enabled=this.opened&&!!this._container?._isShowingBackdrop())}_updatePositionInParent(A){if(!this._platform.isBrowser)return;let t=this._elementRef.nativeElement,n=t.parentNode;A==="end"?(this._anchor||(this._anchor=this._doc.createComment("mat-drawer-anchor"),n.insertBefore(this._anchor,t)),n.appendChild(t)):this._anchor&&this._anchor.parentNode.insertBefore(t,this._anchor)}_handleTransitionEvent=A=>{let t=this._elementRef.nativeElement;A.target===t&&this._ngZone.run(()=>{A.type==="transitionrun"?this._animationStarted.next(A):(A.type==="transitionend"&&this._setIsAnimating(!1),this._animationEnd.next(A))})};static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-drawer"]],viewQuery:function(t,n){if(t&1&&Wt(BrA,5),t&2){let o;se(o=le())&&(n._content=o.first)}},hostAttrs:[1,"mat-drawer"],hostVars:12,hostBindings:function(t,n){t&2&&(ie("align",null)("tabIndex",n.mode!=="side"?"-1":null),ft("visibility",!n._container&&!n.opened?"hidden":null),_A("mat-drawer-end",n.position==="end")("mat-drawer-over",n.mode==="over")("mat-drawer-push",n.mode==="push")("mat-drawer-side",n.mode==="side"))},inputs:{position:"position",mode:"mode",disableClose:"disableClose",autoFocus:"autoFocus",opened:"opened"},outputs:{openedChange:"openedChange",_openedStream:"opened",openedStart:"openedStart",_closedStream:"closed",closedStart:"closedStart",onPositionChanged:"positionChanged"},exportAs:["matDrawer"],ngContentSelectors:IT,decls:3,vars:0,consts:[["content",""],["cdkScrollable","",1,"mat-drawer-inner-container"]],template:function(t,n){t&1&&(Ot(),I(0,"div",1,0),Ze(2),h())},dependencies:[j0],encapsulation:2,changeDetection:0})}return i})(),u7=(()=>{class i{_dir=w(No,{optional:!0});_element=w(ce);_ngZone=w(We);_changeDetectorRef=w(Mt);_animationDisabled=In();_transitionsEnabled=!1;_allDrawers;_drawers=new Rg;_content;_userContent;get start(){return this._start}get end(){return this._end}get autosize(){return this._autosize}set autosize(A){this._autosize=kr(A)}_autosize=w(prA);get hasBackdrop(){return this._drawerHasBackdrop(this._start)||this._drawerHasBackdrop(this._end)}set hasBackdrop(A){this._backdropOverride=A==null?null:kr(A)}_backdropOverride=null;backdropClick=new FA;_start=null;_end=null;_left=null;_right=null;_destroyed=new ne;_doCheckSubject=new ne;_contentMargins={left:null,right:null};_contentMarginChanges=new ne;get scrollable(){return this._userContent||this._content}_injector=w(St);constructor(){let A=w(Qi),t=w(Ns);this._dir?.change.pipe(yt(this._destroyed)).subscribe(()=>{this._validateDrawers(),this.updateContentMargins()}),t.change().pipe(yt(this._destroyed)).subscribe(()=>this.updateContentMargins()),!this._animationDisabled&&A.isBrowser&&this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._element.nativeElement.classList.add("mat-drawer-transition"),this._transitionsEnabled=!0},200)})}ngAfterContentInit(){this._allDrawers.changes.pipe(Yn(this._allDrawers),yt(this._destroyed)).subscribe(A=>{this._drawers.reset(A.filter(t=>!t._container||t._container===this)),this._drawers.notifyOnChanges()}),this._drawers.changes.pipe(Yn(null)).subscribe(()=>{this._validateDrawers(),this._drawers.forEach(A=>{this._watchDrawerToggle(A),this._watchDrawerPosition(A),this._watchDrawerMode(A)}),(!this._drawers.length||this._isDrawerOpen(this._start)||this._isDrawerOpen(this._end))&&this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),this._ngZone.runOutsideAngular(()=>{this._doCheckSubject.pipe(Os(10),yt(this._destroyed)).subscribe(()=>this.updateContentMargins())})}ngOnDestroy(){this._contentMarginChanges.complete(),this._doCheckSubject.complete(),this._drawers.destroy(),this._destroyed.next(),this._destroyed.complete()}open(){this._drawers.forEach(A=>A.open())}close(){this._drawers.forEach(A=>A.close())}updateContentMargins(){let A=0,t=0;if(this._left&&this._left.opened){if(this._left.mode=="side")A+=this._left._getWidth();else if(this._left.mode=="push"){let n=this._left._getWidth();A+=n,t-=n}}if(this._right&&this._right.opened){if(this._right.mode=="side")t+=this._right._getWidth();else if(this._right.mode=="push"){let n=this._right._getWidth();t+=n,A-=n}}A=A||null,t=t||null,(A!==this._contentMargins.left||t!==this._contentMargins.right)&&(this._contentMargins={left:A,right:t},this._ngZone.run(()=>this._contentMarginChanges.next(this._contentMargins)))}ngDoCheck(){this._autosize&&this._isPushed()&&this._ngZone.runOutsideAngular(()=>this._doCheckSubject.next())}_watchDrawerToggle(A){A._animationStarted.pipe(yt(this._drawers.changes)).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),A.mode!=="side"&&A.openedChange.pipe(yt(this._drawers.changes)).subscribe(()=>this._setContainerClass(A.opened))}_watchDrawerPosition(A){A.onPositionChanged.pipe(yt(this._drawers.changes)).subscribe(()=>{ao({read:()=>this._validateDrawers()},{injector:this._injector})})}_watchDrawerMode(A){A._modeChanged.pipe(yt(Vi(this._drawers.changes,this._destroyed))).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()})}_setContainerClass(A){let t=this._element.nativeElement.classList,n="mat-drawer-container-has-open";A?t.add(n):t.remove(n)}_validateDrawers(){this._start=this._end=null,this._drawers.forEach(A=>{A.position=="end"?(this._end!=null,this._end=A):(this._start!=null,this._start=A)}),this._right=this._left=null,this._dir&&this._dir.value==="rtl"?(this._left=this._end,this._right=this._start):(this._left=this._start,this._right=this._end)}_isPushed(){return this._isDrawerOpen(this._start)&&this._start.mode!="over"||this._isDrawerOpen(this._end)&&this._end.mode!="over"}_onBackdropClicked(){this.backdropClick.emit(),this._closeModalDrawersViaBackdrop()}_closeModalDrawersViaBackdrop(){[this._start,this._end].filter(A=>A&&!A.disableClose&&this._drawerHasBackdrop(A)).forEach(A=>A._closeViaBackdropClick())}_isShowingBackdrop(){return this._isDrawerOpen(this._start)&&this._drawerHasBackdrop(this._start)||this._isDrawerOpen(this._end)&&this._drawerHasBackdrop(this._end)}_isDrawerOpen(A){return A!=null&&A.opened}_drawerHasBackdrop(A){return this._backdropOverride==null?!!A&&A.mode!=="side":this._backdropOverride}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-drawer-container"]],contentQueries:function(t,n,o){if(t&1&&ra(o,E7,5)(o,Q7,5),t&2){let a;se(a=le())&&(n._content=a.first),se(a=le())&&(n._allDrawers=a)}},viewQuery:function(t,n){if(t&1&&Wt(E7,5),t&2){let o;se(o=le())&&(n._userContent=o.first)}},hostAttrs:[1,"mat-drawer-container"],hostVars:2,hostBindings:function(t,n){t&2&&_A("mat-drawer-container-explicit-backdrop",n._backdropOverride)},inputs:{autosize:"autosize",hasBackdrop:"hasBackdrop"},outputs:{backdropClick:"backdropClick"},exportAs:["matDrawerContainer"],features:[pt([{provide:BT,useExisting:i}])],ngContentSelectors:ErA,decls:4,vars:2,consts:[[1,"mat-drawer-backdrop",3,"mat-drawer-shown"],[1,"mat-drawer-backdrop",3,"click"]],template:function(t,n){t&1&&(Ot(hrA),T(0,QrA,1,2,"div",0),Ze(1),Ze(2,1),T(3,urA,2,0,"mat-drawer-content")),t&2&&(O(n.hasBackdrop?0:-1),Q(3),O(n._content?-1:3))},dependencies:[E7],styles:[`.mat-drawer-container{position:relative;z-index:1;color:var(--mat-sidenav-content-text-color, var(--mat-sys-on-background));background-color:var(--mat-sidenav-content-background-color, var(--mat-sys-background));box-sizing:border-box;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible;background-color:var(--mat-sidenav-scrim-color, color-mix(in srgb, var(--mat-sys-neutral-variant20) 40%, transparent))}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}@media(forced-colors: active){.mat-drawer-backdrop{opacity:.5}}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-content.mat-drawer-content-hidden{opacity:0}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;color:var(--mat-sidenav-container-text-color, var(--mat-sys-on-surface-variant));box-shadow:var(--mat-sidenav-container-elevation-shadow, none);background-color:var(--mat-sidenav-container-background-color, var(--mat-sys-surface));border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));width:var(--mat-sidenav-container-width, 360px);display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}@media(forced-colors: active){.mat-drawer,[dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}}@media(forced-colors: active){[dir=rtl] .mat-drawer,.mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0);border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .mat-drawer{border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-left-radius:0;border-bottom-left-radius:0;left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-transition .mat-drawer{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating){visibility:hidden;box-shadow:none}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container{display:none}.mat-drawer.mat-drawer-opened.mat-drawer-opened{transform:none}.mat-drawer-side{box-shadow:none;border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid}.mat-drawer-side.mat-drawer-end{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid;border-left:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto}.mat-sidenav-fixed{position:fixed} -`],encapsulation:2,changeDetection:0})}return i})();var frA=["determinateSpinner"];function mrA(i,e){if(i&1&&(Et(),I(0,"svg",11),lA(1,"circle",12),h()),i&2){let A=p();ie("viewBox",A._viewBox()),Q(),ft("stroke-dasharray",A._strokeCircumference(),"px")("stroke-dashoffset",A._strokeCircumference()/2,"px")("stroke-width",A._circleStrokeWidth(),"%"),ie("r",A._circleRadius())}}var wrA=new MA("mat-progress-spinner-default-options",{providedIn:"root",factory:()=>({diameter:hT})}),hT=100,yrA=10,Es=(()=>{class i{_elementRef=w(ce);_noopAnimations;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor="primary";_determinateCircle;constructor(){let A=w(wrA),t=uQ(),n=this._elementRef.nativeElement;this._noopAnimations=t==="di-disabled"&&!!A&&!A._forceAnimations,this.mode=n.nodeName.toLowerCase()==="mat-spinner"?"indeterminate":"determinate",!this._noopAnimations&&t==="reduced-motion"&&n.classList.add("mat-progress-spinner-reduced-motion"),A&&(A.color&&(this.color=this._defaultColor=A.color),A.diameter&&(this.diameter=A.diameter),A.strokeWidth&&(this.strokeWidth=A.strokeWidth))}mode;get value(){return this.mode==="determinate"?this._value:0}set value(A){this._value=Math.max(0,Math.min(100,A||0))}_value=0;get diameter(){return this._diameter}set diameter(A){this._diameter=A||0}_diameter=hT;get strokeWidth(){return this._strokeWidth??this.diameter/10}set strokeWidth(A){this._strokeWidth=A||0}_strokeWidth;_circleRadius(){return(this.diameter-yrA)/2}_viewBox(){let A=this._circleRadius()*2+this.strokeWidth;return`0 0 ${A} ${A}`}_strokeCircumference(){return 2*Math.PI*this._circleRadius()}_strokeDashOffset(){return this.mode==="determinate"?this._strokeCircumference()*(100-this._value)/100:null}_circleStrokeWidth(){return this.strokeWidth/this.diameter*100}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-progress-spinner"],["mat-spinner"]],viewQuery:function(t,n){if(t&1&&Wt(frA,5),t&2){let o;se(o=le())&&(n._determinateCircle=o.first)}},hostAttrs:["role","progressbar","tabindex","-1",1,"mat-mdc-progress-spinner","mdc-circular-progress"],hostVars:18,hostBindings:function(t,n){t&2&&(ie("aria-valuemin",0)("aria-valuemax",100)("aria-valuenow",n.mode==="determinate"?n.value:null)("mode",n.mode),Ao("mat-"+n.color),ft("width",n.diameter,"px")("height",n.diameter,"px")("--mat-progress-spinner-size",n.diameter+"px")("--mat-progress-spinner-active-indicator-width",n.diameter+"px"),_A("_mat-animation-noopable",n._noopAnimations)("mdc-circular-progress--indeterminate",n.mode==="indeterminate"))},inputs:{color:"color",mode:"mode",value:[2,"value","value",yn],diameter:[2,"diameter","diameter",yn],strokeWidth:[2,"strokeWidth","strokeWidth",yn]},exportAs:["matProgressSpinner"],decls:14,vars:11,consts:[["circle",""],["determinateSpinner",""],["aria-hidden","true",1,"mdc-circular-progress__determinate-container"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__determinate-circle-graphic"],["cx","50%","cy","50%",1,"mdc-circular-progress__determinate-circle"],["aria-hidden","true",1,"mdc-circular-progress__indeterminate-container"],[1,"mdc-circular-progress__spinner-layer"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-left"],[3,"ngTemplateOutlet"],[1,"mdc-circular-progress__gap-patch"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-right"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__indeterminate-circle-graphic"],["cx","50%","cy","50%"]],template:function(t,n){if(t&1&&(kt(0,mrA,2,8,"ng-template",null,0,PC),I(2,"div",2,1),Et(),I(4,"svg",3),lA(5,"circle",4),h()(),hr(),I(6,"div",5)(7,"div",6)(8,"div",7),dn(9,8),h(),I(10,"div",9),dn(11,8),h(),I(12,"div",10),dn(13,8),h()()()),t&2){let o=Bi(1);Q(4),ie("viewBox",n._viewBox()),Q(),ft("stroke-dasharray",n._strokeCircumference(),"px")("stroke-dashoffset",n._strokeDashOffset(),"px")("stroke-width",n._circleStrokeWidth(),"%"),ie("r",n._circleRadius()),Q(4),H("ngTemplateOutlet",o),Q(2),H("ngTemplateOutlet",o),Q(2),H("ngTemplateOutlet",o)}},dependencies:[Uc],styles:[`.mat-mdc-progress-spinner{--mat-progress-spinner-animation-multiplier: 1;display:block;overflow:hidden;line-height:0;position:relative;direction:ltr;transition:opacity 250ms cubic-bezier(0.4, 0, 0.6, 1)}.mat-mdc-progress-spinner circle{stroke-width:var(--mat-progress-spinner-active-indicator-width, 4px)}.mat-mdc-progress-spinner._mat-animation-noopable,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__determinate-circle{transition:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__spinner-layer,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container{animation:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container circle{stroke-dasharray:0 !important}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle{stroke:currentColor;stroke:CanvasText}}.mat-progress-spinner-reduced-motion{--mat-progress-spinner-animation-multiplier: 1.25}.mdc-circular-progress__determinate-container,.mdc-circular-progress__indeterminate-circle-graphic,.mdc-circular-progress__indeterminate-container,.mdc-circular-progress__spinner-layer{position:absolute;width:100%;height:100%}.mdc-circular-progress__determinate-container{transform:rotate(-90deg)}.mdc-circular-progress--indeterminate .mdc-circular-progress__determinate-container{opacity:0}.mdc-circular-progress__indeterminate-container{font-size:0;letter-spacing:0;white-space:nowrap;opacity:0}.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container{opacity:1;animation:mdc-circular-progress-container-rotate calc(1568.2352941176ms*var(--mat-progress-spinner-animation-multiplier)) linear infinite}.mdc-circular-progress__determinate-circle-graphic,.mdc-circular-progress__indeterminate-circle-graphic{fill:rgba(0,0,0,0)}.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:var(--mat-progress-spinner-active-indicator-color, var(--mat-sys-primary))}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:CanvasText}}.mdc-circular-progress__determinate-circle{transition:stroke-dashoffset 500ms cubic-bezier(0, 0, 0.2, 1)}.mdc-circular-progress__gap-patch{position:absolute;top:0;left:47.5%;box-sizing:border-box;width:5%;height:100%;overflow:hidden}.mdc-circular-progress__gap-patch .mdc-circular-progress__indeterminate-circle-graphic{left:-900%;width:2000%;transform:rotate(180deg)}.mdc-circular-progress__circle-clipper .mdc-circular-progress__indeterminate-circle-graphic{width:200%}.mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{left:-100%}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-left .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-left-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-right-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress__circle-clipper{display:inline-flex;position:relative;width:50%;height:100%;overflow:hidden}.mdc-circular-progress--indeterminate .mdc-circular-progress__spinner-layer{animation:mdc-circular-progress-spinner-layer-rotate calc(5332ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}@keyframes mdc-circular-progress-container-rotate{to{transform:rotate(360deg)}}@keyframes mdc-circular-progress-spinner-layer-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}100%{transform:rotate(1080deg)}}@keyframes mdc-circular-progress-left-spin{from{transform:rotate(265deg)}50%{transform:rotate(130deg)}to{transform:rotate(265deg)}}@keyframes mdc-circular-progress-right-spin{from{transform:rotate(-265deg)}50%{transform:rotate(-130deg)}to{transform:rotate(-265deg)}} -`],encapsulation:2,changeDetection:0})}return i})();var l2=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Di]})}return i})();function DrA(i,e){if(i&1){let A=aA();I(0,"div",1)(1,"button",2),U("click",function(){L(A);let n=p();return G(n.action())}),D(2),h()()}if(i&2){let A=p();Q(2),Ee(" ",A.data.action," ")}}var vrA=["label"];function brA(i,e){}var MrA=Math.pow(2,31)-1,ru=class{_overlayRef;instance;containerInstance;_afterDismissed=new ne;_afterOpened=new ne;_onAction=new ne;_durationTimeoutId;_dismissedByAction=!1;constructor(e,A){this._overlayRef=A,this.containerInstance=e,e._onExit.subscribe(()=>this._finishDismiss())}dismiss(){this._afterDismissed.closed||this.containerInstance.exit(),clearTimeout(this._durationTimeoutId)}dismissWithAction(){this._onAction.closed||(this._dismissedByAction=!0,this._onAction.next(),this._onAction.complete(),this.dismiss()),clearTimeout(this._durationTimeoutId)}closeWithAction(){this.dismissWithAction()}_dismissAfter(e){this._durationTimeoutId=setTimeout(()=>this.dismiss(),Math.min(e,MrA))}_open(){this._afterOpened.closed||(this._afterOpened.next(),this._afterOpened.complete())}_finishDismiss(){this._overlayRef.dispose(),this._onAction.closed||this._onAction.complete(),this._afterDismissed.next({dismissedByAction:this._dismissedByAction}),this._afterDismissed.complete(),this._dismissedByAction=!1}afterDismissed(){return this._afterDismissed}afterOpened(){return this.containerInstance._onEnter}onAction(){return this._onAction}},ET=new MA("MatSnackBarData"),hB=class{politeness="polite";announcementMessage="";viewContainerRef;duration=0;panelClass;direction;data=null;horizontalPosition="center";verticalPosition="bottom"},SrA=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","matSnackBarLabel",""]],hostAttrs:[1,"mat-mdc-snack-bar-label","mdc-snackbar__label"]})}return i})(),krA=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","matSnackBarActions",""]],hostAttrs:[1,"mat-mdc-snack-bar-actions","mdc-snackbar__actions"]})}return i})(),_rA=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","matSnackBarAction",""]],hostAttrs:[1,"mat-mdc-snack-bar-action","mdc-snackbar__action"]})}return i})(),xrA=(()=>{class i{snackBarRef=w(ru);data=w(ET);constructor(){}action(){this.snackBarRef.dismissWithAction()}get hasAction(){return!!this.data.action}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["simple-snack-bar"]],hostAttrs:[1,"mat-mdc-simple-snack-bar"],exportAs:["matSnackBar"],decls:3,vars:2,consts:[["matSnackBarLabel",""],["matSnackBarActions",""],["matButton","","matSnackBarAction","",3,"click"]],template:function(t,n){t&1&&(I(0,"div",0),D(1),h(),T(2,DrA,3,1,"div",1)),t&2&&(Q(),Ee(" ",n.data.message,` -`),Q(),O(n.hasAction?2:-1))},dependencies:[ki,SrA,krA,_rA],styles:[`.mat-mdc-simple-snack-bar{display:flex}.mat-mdc-simple-snack-bar .mat-mdc-snack-bar-label{max-height:50vh;overflow:auto} -`],encapsulation:2,changeDetection:0})}return i})(),f7="_mat-snack-bar-enter",m7="_mat-snack-bar-exit",RrA=(()=>{class i extends n2{_ngZone=w(We);_elementRef=w(ce);_changeDetectorRef=w(Mt);_platform=w(Qi);_animationsDisabled=In();snackBarConfig=w(hB);_document=w(ci);_trackedModals=new Set;_enterFallback;_exitFallback;_injector=w(St);_announceDelay=150;_announceTimeoutId;_destroyed=!1;_portalOutlet;_onAnnounce=new ne;_onExit=new ne;_onEnter=new ne;_animationState="void";_live;_label;_role;_liveElementId=w(Dn).getId("mat-snack-bar-container-live-");constructor(){super();let A=this.snackBarConfig;A.politeness==="assertive"&&!A.announcementMessage?this._live="assertive":A.politeness==="off"?this._live="off":this._live="polite",this._platform.FIREFOX&&(this._live==="polite"&&(this._role="status"),this._live==="assertive"&&(this._role="alert"))}attachComponentPortal(A){this._assertNotAttached();let t=this._portalOutlet.attachComponentPortal(A);return this._afterPortalAttached(),t}attachTemplatePortal(A){this._assertNotAttached();let t=this._portalOutlet.attachTemplatePortal(A);return this._afterPortalAttached(),t}attachDomPortal=A=>{this._assertNotAttached();let t=this._portalOutlet.attachDomPortal(A);return this._afterPortalAttached(),t};onAnimationEnd(A){A===m7?this._completeExit():A===f7&&(clearTimeout(this._enterFallback),this._ngZone.run(()=>{this._onEnter.next(),this._onEnter.complete()}))}enter(){this._destroyed||(this._animationState="visible",this._changeDetectorRef.markForCheck(),this._changeDetectorRef.detectChanges(),this._screenReaderAnnounce(),this._animationsDisabled?ao(()=>{this._ngZone.run(()=>queueMicrotask(()=>this.onAnimationEnd(f7)))},{injector:this._injector}):(clearTimeout(this._enterFallback),this._enterFallback=setTimeout(()=>{this._elementRef.nativeElement.classList.add("mat-snack-bar-fallback-visible"),this.onAnimationEnd(f7)},200)))}exit(){return this._destroyed?oe(void 0):(this._ngZone.run(()=>{this._animationState="hidden",this._changeDetectorRef.markForCheck(),this._elementRef.nativeElement.setAttribute("mat-exit",""),clearTimeout(this._announceTimeoutId),this._animationsDisabled?ao(()=>{this._ngZone.run(()=>queueMicrotask(()=>this.onAnimationEnd(m7)))},{injector:this._injector}):(clearTimeout(this._exitFallback),this._exitFallback=setTimeout(()=>this.onAnimationEnd(m7),200))}),this._onExit)}ngOnDestroy(){this._destroyed=!0,this._clearFromModals(),this._completeExit()}_completeExit(){clearTimeout(this._exitFallback),queueMicrotask(()=>{this._onExit.next(),this._onExit.complete()})}_afterPortalAttached(){let A=this._elementRef.nativeElement,t=this.snackBarConfig.panelClass;t&&(Array.isArray(t)?t.forEach(a=>A.classList.add(a)):A.classList.add(t)),this._exposeToModals();let n=this._label.nativeElement,o="mdc-snackbar__label";n.classList.toggle(o,!n.querySelector(`.${o}`))}_exposeToModals(){let A=this._liveElementId,t=this._document.querySelectorAll('body > .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{let t=A.getAttribute("aria-owns");if(t){let n=t.replace(this._liveElementId,"").trim();n.length>0?A.setAttribute("aria-owns",n):A.removeAttribute("aria-owns")}}),this._trackedModals.clear()}_assertNotAttached(){this._portalOutlet.hasAttached()}_screenReaderAnnounce(){this._announceTimeoutId||this._ngZone.runOutsideAngular(()=>{this._announceTimeoutId=setTimeout(()=>{if(this._destroyed)return;let A=this._elementRef.nativeElement,t=A.querySelector("[aria-hidden]"),n=A.querySelector("[aria-live]");if(t&&n){let o=null;this._platform.isBrowser&&document.activeElement instanceof HTMLElement&&t.contains(document.activeElement)&&(o=document.activeElement),t.removeAttribute("aria-hidden"),n.appendChild(t),o?.focus(),this._onAnnounce.next(),this._onAnnounce.complete()}},this._announceDelay)})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-snack-bar-container"]],viewQuery:function(t,n){if(t&1&&Wt(Ag,7)(vrA,7),t&2){let o;se(o=le())&&(n._portalOutlet=o.first),se(o=le())&&(n._label=o.first)}},hostAttrs:[1,"mdc-snackbar","mat-mdc-snack-bar-container"],hostVars:6,hostBindings:function(t,n){t&1&&U("animationend",function(a){return n.onAnimationEnd(a.animationName)})("animationcancel",function(a){return n.onAnimationEnd(a.animationName)}),t&2&&_A("mat-snack-bar-container-enter",n._animationState==="visible")("mat-snack-bar-container-exit",n._animationState==="hidden")("mat-snack-bar-container-animations-enabled",!n._animationsDisabled)},features:[bt],decls:6,vars:3,consts:[["label",""],[1,"mdc-snackbar__surface","mat-mdc-snackbar-surface"],[1,"mat-mdc-snack-bar-label"],["aria-hidden","true"],["cdkPortalOutlet",""]],template:function(t,n){t&1&&(I(0,"div",1)(1,"div",2,0)(3,"div",3),kt(4,brA,0,0,"ng-template",4),h(),lA(5,"div"),h()()),t&2&&(Q(5),ie("aria-live",n._live)("role",n._role)("id",n._liveElementId))},dependencies:[Ag],styles:[`@keyframes _mat-snack-bar-enter{from{transform:scale(0.8);opacity:0}to{transform:scale(1);opacity:1}}@keyframes _mat-snack-bar-exit{from{opacity:1}to{opacity:0}}.mat-mdc-snack-bar-container{display:flex;align-items:center;justify-content:center;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);margin:8px}.mat-mdc-snack-bar-handset .mat-mdc-snack-bar-container{width:100vw}.mat-snack-bar-container-animations-enabled{opacity:0}.mat-snack-bar-container-animations-enabled.mat-snack-bar-fallback-visible{opacity:1}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-enter{animation:_mat-snack-bar-enter 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-exit{animation:_mat-snack-bar-exit 75ms cubic-bezier(0.4, 0, 1, 1) forwards}.mat-mdc-snackbar-surface{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);display:flex;align-items:center;justify-content:flex-start;box-sizing:border-box;padding-left:0;padding-right:8px}[dir=rtl] .mat-mdc-snackbar-surface{padding-right:0;padding-left:8px}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{min-width:344px;max-width:672px}.mat-mdc-snack-bar-handset .mat-mdc-snackbar-surface{width:100%;min-width:0}@media(forced-colors: active){.mat-mdc-snackbar-surface{outline:solid 1px}}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{color:var(--mat-snack-bar-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mat-snack-bar-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-snack-bar-container-color, var(--mat-sys-inverse-surface))}.mdc-snackbar__label{width:100%;flex-grow:1;box-sizing:border-box;margin:0;padding:14px 8px 14px 16px}[dir=rtl] .mdc-snackbar__label{padding-left:8px;padding-right:16px}.mat-mdc-snack-bar-container .mdc-snackbar__label{font-family:var(--mat-snack-bar-supporting-text-font, var(--mat-sys-body-medium-font));font-size:var(--mat-snack-bar-supporting-text-size, var(--mat-sys-body-medium-size));font-weight:var(--mat-snack-bar-supporting-text-weight, var(--mat-sys-body-medium-weight));line-height:var(--mat-snack-bar-supporting-text-line-height, var(--mat-sys-body-medium-line-height))}.mat-mdc-snack-bar-actions{display:flex;flex-shrink:0;align-items:center;box-sizing:border-box}.mat-mdc-snack-bar-handset,.mat-mdc-snack-bar-container,.mat-mdc-snack-bar-label{flex:1 1 auto}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled).mat-unthemed{color:var(--mat-snack-bar-button-color, var(--mat-sys-inverse-primary))}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled){--mat-button-text-state-layer-color: currentColor;--mat-button-text-ripple-color: currentColor}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled) .mat-ripple-element{opacity:.1} -`],encapsulation:2})}return i})(),NrA=new MA("mat-snack-bar-default-options",{providedIn:"root",factory:()=>new hB}),QT=(()=>{class i{_live=w(hQ);_injector=w(St);_breakpointObserver=w(IQ);_parentSnackBar=w(i,{optional:!0,skipSelf:!0});_defaultConfig=w(NrA);_animationsDisabled=In();_snackBarRefAtThisLevel=null;simpleSnackBarComponent=xrA;snackBarContainerComponent=RrA;handsetCssClass="mat-mdc-snack-bar-handset";get _openedSnackBarRef(){let A=this._parentSnackBar;return A?A._openedSnackBarRef:this._snackBarRefAtThisLevel}set _openedSnackBarRef(A){this._parentSnackBar?this._parentSnackBar._openedSnackBarRef=A:this._snackBarRefAtThisLevel=A}constructor(){}openFromComponent(A,t){return this._attach(A,t)}openFromTemplate(A,t){return this._attach(A,t)}open(A,t="",n){let o=P(P({},this._defaultConfig),n);return o.data={message:A,action:t},o.announcementMessage===A&&(o.announcementMessage=void 0),this.openFromComponent(this.simpleSnackBarComponent,o)}dismiss(){this._openedSnackBarRef&&this._openedSnackBarRef.dismiss()}ngOnDestroy(){this._snackBarRefAtThisLevel&&this._snackBarRefAtThisLevel.dismiss()}_attachSnackBarContainer(A,t){let n=t&&t.viewContainerRef&&t.viewContainerRef.injector,o=St.create({parent:n||this._injector,providers:[{provide:hB,useValue:t}]}),a=new Fs(this.snackBarContainerComponent,t.viewContainerRef,o),r=A.attach(a);return r.instance.snackBarConfig=t,r.instance}_attach(A,t){let n=P(P(P({},new hB),this._defaultConfig),t),o=this._createOverlay(n),a=this._attachSnackBarContainer(o,n),r=new ru(a,o);if(A instanceof wo){let s=new jr(A,null,{$implicit:n.data,snackBarRef:r});r.instance=a.attachTemplatePortal(s)}else{let s=this._createInjector(n,r),l=new Fs(A,void 0,s),g=a.attachComponentPortal(l);r.instance=g.instance}return this._breakpointObserver.observe(NL.HandsetPortrait).pipe(yt(o.detachments())).subscribe(s=>{o.overlayElement.classList.toggle(this.handsetCssClass,s.matches)}),n.announcementMessage&&a._onAnnounce.subscribe(()=>{this._live.announce(n.announcementMessage,n.politeness)}),this._animateSnackBar(r,n),this._openedSnackBarRef=r,this._openedSnackBarRef}_animateSnackBar(A,t){A.afterDismissed().subscribe(()=>{this._openedSnackBarRef==A&&(this._openedSnackBarRef=null),t.announcementMessage&&this._live.clear()}),t.duration&&t.duration>0&&A.afterOpened().subscribe(()=>A._dismissAfter(t.duration)),this._openedSnackBarRef?(this._openedSnackBarRef.afterDismissed().subscribe(()=>{A.containerInstance.enter()}),this._openedSnackBarRef.dismiss()):A.containerInstance.enter()}_createOverlay(A){let t=new Hg;t.direction=A.direction;let n=o2(this._injector),o=A.direction==="rtl",a=A.horizontalPosition==="left"||A.horizontalPosition==="start"&&!o||A.horizontalPosition==="end"&&o,r=!a&&A.horizontalPosition!=="center";return a?n.left("0"):r?n.right("0"):n.centerHorizontally(),A.verticalPosition==="top"?n.top("0"):n.bottom("0"),t.positionStrategy=n,t.disableAnimations=this._animationsDisabled,Pg(this._injector,t)}_createInjector(A,t){let n=A&&A.viewContainerRef&&A.viewContainerRef.injector;return St.create({parent:n||this._injector,providers:[{provide:ru,useValue:t},{provide:ET,useValue:A.data}]})}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var Xc=class i{snackBar=w(QT);MAX_LENGTH=250;open(e,A,t){let n=this.truncate(e,this.MAX_LENGTH);return this.snackBar.open(n,A,t)}truncate(e,A){return e?e.length>A?e.substring(0,A)+"...":e:""}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var FrA=["*",[["mat-toolbar-row"]]],LrA=["*","mat-toolbar-row"],GrA=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["mat-toolbar-row"]],hostAttrs:[1,"mat-toolbar-row"],exportAs:["matToolbarRow"]})}return i})(),uT=(()=>{class i{_elementRef=w(ce);_platform=w(Qi);_document=w(ci);color;_toolbarRows;constructor(){}ngAfterViewInit(){this._platform.isBrowser&&(this._checkToolbarMixedModes(),this._toolbarRows.changes.subscribe(()=>this._checkToolbarMixedModes()))}_checkToolbarMixedModes(){this._toolbarRows.length}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-toolbar"]],contentQueries:function(t,n,o){if(t&1&&ra(o,GrA,5),t&2){let a;se(a=le())&&(n._toolbarRows=a)}},hostAttrs:[1,"mat-toolbar"],hostVars:6,hostBindings:function(t,n){t&2&&(Ao(n.color?"mat-"+n.color:""),_A("mat-toolbar-multiple-rows",n._toolbarRows.length>0)("mat-toolbar-single-row",n._toolbarRows.length===0))},inputs:{color:"color"},exportAs:["matToolbar"],ngContentSelectors:LrA,decls:2,vars:0,template:function(t,n){t&1&&(Ot(FrA),Ze(0),Ze(1,1))},styles:[`.mat-toolbar{background:var(--mat-toolbar-container-background-color, var(--mat-sys-surface));color:var(--mat-toolbar-container-text-color, var(--mat-sys-on-surface))}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font-family:var(--mat-toolbar-title-text-font, var(--mat-sys-title-large-font));font-size:var(--mat-toolbar-title-text-size, var(--mat-sys-title-large-size));line-height:var(--mat-toolbar-title-text-line-height, var(--mat-sys-title-large-line-height));font-weight:var(--mat-toolbar-title-text-weight, var(--mat-sys-title-large-weight));letter-spacing:var(--mat-toolbar-title-text-tracking, var(--mat-sys-title-large-tracking));margin:0}@media(forced-colors: active){.mat-toolbar{outline:solid 1px}}.mat-toolbar .mat-form-field-underline,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-focused .mat-form-field-ripple{background-color:currentColor}.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-select-value,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow{color:inherit}.mat-toolbar .mat-input-element{caret-color:currentColor}.mat-toolbar .mat-mdc-button-base.mat-mdc-button-base.mat-unthemed{--mat-button-text-label-text-color: var(--mat-toolbar-container-text-color, var(--mat-sys-on-surface));--mat-button-outlined-label-text-color: var(--mat-toolbar-container-text-color, var(--mat-sys-on-surface))}.mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap;height:var(--mat-toolbar-standard-height, 64px)}@media(max-width: 599px){.mat-toolbar-row,.mat-toolbar-single-row{height:var(--mat-toolbar-mobile-height, 56px)}}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%;min-height:var(--mat-toolbar-standard-height, 64px)}@media(max-width: 599px){.mat-toolbar-multiple-rows{min-height:var(--mat-toolbar-mobile-height, 56px)}} -`],encapsulation:2,changeDetection:0})}return i})();var Rr=class i{static getBaseUrlWithoutPath(){let e=window.location.href;return new URL(e).origin+"/dev-ui/"}static getApiServerBaseUrl(){return window.runtimeConfig?.backendUrl||""}static getWSServerUrl(){let e=i.getApiServerBaseUrl();return!e||e==""?window.location.host:e.startsWith("http://")?e.slice(7):e.startsWith("https://")?e.slice(8):e}};var su=class{role;text;thought;isLoading;isEditing;evalStatus;failedMetric;attachments;renderedContent;a2uiData;textParts;executableCode;codeExecutionResult;event;inlineData;functionCalls;functionResponses;actualInvocationToolUses;expectedInvocationToolUses;actualFinalResponse;expectedFinalResponse;evalScore;evalThreshold;invocationIndex;finalResponsePartIndex;toolUseIndex;error;constructor(e){if(Object.assign(this,e),this.event?.actions)for(let[A,t]of Object.entries(this.event.actions))t!==null&&typeof t=="object"&&Object.keys(t).length===0&&delete this.event.actions[A]}get stateDelta(){return this.event?.actions?.stateDelta}get artifactDelta(){return this.event?.actions?.artifactDelta}get route(){return this.event?.actions?.route}get transferToAgent(){return this.event?.actions?.transferToAgent}get nodePath(){return this.event?.nodeInfo?.path||null}get bareNodePath(){let e=this.nodePath;return e?e.split("/").map(A=>A.split("@")[0]).join("/"):null}get author(){return this.event?.author??"root_agent"}};var el=new MA("AgentService");var $c=new MA("AgentBuilderService");var EB=new MA("ArtifactService");var QB=new MA("DownloadService");var A0=new MA("EvalService");var fm=new MA("EventService");var pT="edit_function_args";var fT="a2a_card",mT="tests",wT="eval_v2",Nr=new MA("FeatureFlagService");var uB=new MA("GraphService");var mm=new MA("LocalFileService");var Qs=new MA("SafeValuesService"),wm=class{openBase64InNewTab(e,A){try{if(!e)return;let t=e;if(e.startsWith("data:")&&e.includes(";base64,")&&(t=t.substring(t.indexOf(";base64,")+8)),!A||!t)return;let n=atob(t),o=new Array(n.length);for(let l=0;l{fetch(t,{method:"POST"}).then(o=>{if(!o.body){n.error("No response body");return}let a=o.body.getReader(),r=new TextDecoder("utf-8"),s=()=>{a.read().then(({done:l,value:g})=>{if(l){this.zone.run(()=>n.complete());return}let C=r.decode(g,{stream:!0});this.zone.run(()=>n.next(C)),s()}).catch(l=>{this.zone.run(()=>n.error(l))})};s()}).catch(o=>{this.zone.run(()=>n.error(o))})})}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var bm=class i{constructor(e,A){this.el=e;this.renderer=A}sideDrawerMinWidth=360;sideDrawerMaxWidth=window.innerWidth/2;resizeHandle=null;resizingEvent={isResizing:!1,startingCursorX:0,startingWidth:0};ngAfterViewInit(){this.sideDrawerMaxWidth=window.innerWidth/2,this.resizeHandle=document.getElementsByClassName("resize-handler")[0],this.resizeHandle&&this.renderer.listen(this.resizeHandle,"mousedown",e=>this.onResizeHandleMouseDown(e)),document.documentElement.style.setProperty("--side-drawer-width","480px"),this.renderer.setStyle(this.el.nativeElement,"width","var(--side-drawer-width)")}onResizeHandleMouseDown(e){this.resizingEvent={isResizing:!0,startingCursorX:e.clientX,startingWidth:this.sideDrawerWidth},e.preventDefault()}onMouseMove(e){if(!this.resizingEvent.isResizing)return;let A=e.clientX-this.resizingEvent.startingCursorX,t=this.resizingEvent.startingWidth+A;this.sideDrawerWidth=t,this.renderer.addClass(document.body,"resizing")}onMouseUp(){this.resizingEvent.isResizing=!1,this.renderer.removeClass(document.body,"resizing")}onResize(){this.sideDrawerMaxWidth=window.innerWidth/2,this.sideDrawerWidth=this.sideDrawerWidth}set sideDrawerWidth(e){let A=Math.min(Math.max(e,this.sideDrawerMinWidth),this.sideDrawerMaxWidth);document.documentElement.style.setProperty("--side-drawer-width",`${A}px`)}get sideDrawerWidth(){let e=getComputedStyle(document.documentElement).getPropertyValue("--side-drawer-width"),A=parseFloat(e);return isNaN(A)?480:A}static \u0275fac=function(A){return new(A||i)(st(ce),st(on))};static \u0275dir=VA({type:i,selectors:[["","appResizableDrawer",""]],hostBindings:function(A,t){A&1&&U("mousemove",function(o){return t.onMouseMove(o)},mI)("mouseup",function(){return t.onMouseUp()},mI)("resize",function(){return t.onResize()},Fg)}})};var Mm=Symbol.for("yaml.alias"),Sm=Symbol.for("yaml.document"),jg=Symbol.for("yaml.map"),w7=Symbol.for("yaml.pair"),_l=Symbol.for("yaml.scalar"),Z0=Symbol.for("yaml.seq"),Ks=Symbol.for("yaml.node.type"),rg=i=>!!i&&typeof i=="object"&&i[Ks]===Mm,Vg=i=>!!i&&typeof i=="object"&&i[Ks]===Sm,qg=i=>!!i&&typeof i=="object"&&i[Ks]===jg,Tn=i=>!!i&&typeof i=="object"&&i[Ks]===w7,sn=i=>!!i&&typeof i=="object"&&i[Ks]===_l,Wg=i=>!!i&&typeof i=="object"&&i[Ks]===Z0;function vo(i){if(i&&typeof i=="object")switch(i[Ks]){case jg:case Z0:return!0}return!1}function Pn(i){if(i&&typeof i=="object")switch(i[Ks]){case Mm:case jg:case _l:case Z0:return!0}return!1}var km=i=>(sn(i)||vo(i))&&!!i.anchor;var il=Symbol("break visit"),yT=Symbol("skip children"),e0=Symbol("remove node");function t0(i,e){let A=DT(e);Vg(i)?yB(null,i.contents,A,Object.freeze([i]))===e0&&(i.contents=null):yB(null,i,A,Object.freeze([]))}t0.BREAK=il;t0.SKIP=yT;t0.REMOVE=e0;function yB(i,e,A,t){let n=vT(i,e,A,t);if(Pn(n)||Tn(n))return bT(i,t,n),yB(i,n,A,t);if(typeof n!="symbol"){if(vo(e)){t=Object.freeze(t.concat(e));for(let o=0;oi.replace(/[!,[\]{}]/g,e=>KrA[e]),vB=(()=>{class i{constructor(A,t){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},i.defaultYaml,A),this.tags=Object.assign({},i.defaultTags,t)}clone(){let A=new i(this.yaml,this.tags);return A.docStart=this.docStart,A}atDocument(){let A=new i(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:i.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},i.defaultTags);break}return A}add(A,t){this.atNextDocument&&(this.yaml={explicit:i.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},i.defaultTags),this.atNextDocument=!1);let n=A.trim().split(/[ \t]+/),o=n.shift();switch(o){case"%TAG":{if(n.length!==2&&(t(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;let[a,r]=n;return this.tags[a]=r,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return t(0,"%YAML directive should contain exactly one part"),!1;let[a]=n;if(a==="1.1"||a==="1.2")return this.yaml.version=a,!0;{let r=/^\d+\.\d+$/.test(a);return t(6,`Unsupported YAML version ${a}`,r),!1}}default:return t(0,`Unknown directive ${o}`,!0),!1}}tagName(A,t){if(A==="!")return"!";if(A[0]!=="!")return t(`Not a valid tag: ${A}`),null;if(A[1]==="<"){let r=A.slice(2,-1);return r==="!"||r==="!!"?(t(`Verbatim tags aren't resolved, so ${A} is invalid.`),null):(A[A.length-1]!==">"&&t("Verbatim tags must end with a >"),r)}let[,n,o]=A.match(/^(.*!)([^!]*)$/s);o||t(`The ${A} tag has no suffix`);let a=this.tags[n];if(a)try{return a+decodeURIComponent(o)}catch(r){return t(String(r)),null}return n==="!"?A:(t(`Could not resolve tag: ${A}`),null)}tagString(A){for(let[t,n]of Object.entries(this.tags))if(A.startsWith(n))return t+UrA(A.substring(n.length));return A[0]==="!"?A:`!<${A}>`}toString(A){let t=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],n=Object.entries(this.tags),o;if(A&&n.length>0&&Pn(A.contents)){let a={};t0(A.contents,(r,s)=>{Pn(s)&&s.tag&&(a[s.tag]=!0)}),o=Object.keys(a)}else o=[];for(let[a,r]of n)a==="!!"&&r==="tag:yaml.org,2002:"||(!A||o.some(s=>s.startsWith(r)))&&t.push(`%TAG ${a} ${r}`);return t.join(` -`)}}return i.defaultYaml={explicit:!1,version:"1.2"},i.defaultTags={"!!":"tag:yaml.org,2002:"},i})();function xm(i){if(/[\x00-\x19\s,[\]{}]/.test(i)){let A=`Anchor must not contain whitespace or control characters: ${JSON.stringify(i)}`;throw new Error(A)}return!0}function y7(i){let e=new Set;return t0(i,{Value(A,t){t.anchor&&e.add(t.anchor)}}),e}function D7(i,e){for(let A=1;;++A){let t=`${i}${A}`;if(!e.has(t))return t}}function MT(i,e){let A=[],t=new Map,n=null;return{onAnchor:o=>{A.push(o),n??(n=y7(i));let a=D7(e,n);return n.add(a),a},setAnchors:()=>{for(let o of A){let a=t.get(o);if(typeof a=="object"&&a.anchor&&(sn(a.node)||vo(a.node)))a.node.anchor=a.anchor;else{let r=new Error("Failed to resolve repeated object (this should not happen)");throw r.source=o,r}}},sourceObjects:t}}function C2(i,e,A,t){if(t&&typeof t=="object")if(Array.isArray(t))for(let n=0,o=t.length;npr(t,String(n),A));if(i&&typeof i.toJSON=="function"){if(!A||!km(i))return i.toJSON(e,A);let t={aliasCount:0,count:1,res:void 0};A.anchors.set(i,t),A.onCreate=o=>{t.res=o,delete A.onCreate};let n=i.toJSON(e,A);return A.onCreate&&A.onCreate(n),n}return typeof i=="bigint"&&!A?.keep?Number(i):i}var d2=class{constructor(e){Object.defineProperty(this,Ks,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:A,maxAliasCount:t,onAnchor:n,reviver:o}={}){if(!Vg(e))throw new TypeError("A document argument is required");let a={anchors:new Map,doc:e,keep:!0,mapAsMap:A===!0,mapKeyWarned:!1,maxAliasCount:typeof t=="number"?t:100},r=pr(this,"",a);if(typeof n=="function")for(let{count:s,res:l}of a.anchors.values())n(l,s);return typeof o=="function"?C2(o,{"":r},"",r):r}};var X0=class extends d2{constructor(e){super(Mm),this.source=e,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(e,A){let t;A?.aliasResolveCache?t=A.aliasResolveCache:(t=[],t0(e,{Node:(o,a)=>{(rg(a)||km(a))&&t.push(a)}}),A&&(A.aliasResolveCache=t));let n;for(let o of t){if(o===this)break;o.anchor===this.source&&(n=o)}return n}toJSON(e,A){if(!A)return{source:this.source};let{anchors:t,doc:n,maxAliasCount:o}=A,a=this.resolve(n,A);if(!a){let s=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(s)}let r=t.get(a);if(r||(pr(a,null,A),r=t.get(a)),r?.res===void 0){let s="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(s)}if(o>=0&&(r.count+=1,r.aliasCount===0&&(r.aliasCount=Rm(n,a,t)),r.count*r.aliasCount>o)){let s="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(s)}return r.res}toString(e,A,t){let n=`*${this.source}`;if(e){if(xm(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let o=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(o)}if(e.implicitKey)return`${n} `}return n}};function Rm(i,e,A){if(rg(e)){let t=e.resolve(i),n=A&&t&&A.get(t);return n?n.count*n.aliasCount:0}else if(vo(e)){let t=0;for(let n of e.items){let o=Rm(i,n,A);o>t&&(t=o)}return t}else if(Tn(e)){let t=Rm(i,e.key,A),n=Rm(i,e.value,A);return Math.max(t,n)}return 1}var Nm=i=>!i||typeof i!="function"&&typeof i!="object",$t=(()=>{class i extends d2{constructor(A){super(_l),this.value=A}toJSON(A,t){return t?.keep?this.value:pr(this.value,A,t)}toString(){return String(this.value)}}return i.BLOCK_FOLDED="BLOCK_FOLDED",i.BLOCK_LITERAL="BLOCK_LITERAL",i.PLAIN="PLAIN",i.QUOTE_DOUBLE="QUOTE_DOUBLE",i.QUOTE_SINGLE="QUOTE_SINGLE",i})();var TrA="tag:yaml.org,2002:";function OrA(i,e,A){if(e){let t=A.filter(o=>o.tag===e),n=t.find(o=>!o.format)??t[0];if(!n)throw new Error(`Tag ${e} not found`);return n}return A.find(t=>t.identify?.(i)&&!t.format)}function $0(i,e,A){if(Vg(i)&&(i=i.contents),Pn(i))return i;if(Tn(i)){let C=A.schema[jg].createNode?.(A.schema,null,A);return C.items.push(i),C}(i instanceof String||i instanceof Number||i instanceof Boolean||typeof BigInt<"u"&&i instanceof BigInt)&&(i=i.valueOf());let{aliasDuplicateObjects:t,onAnchor:n,onTagObj:o,schema:a,sourceObjects:r}=A,s;if(t&&i&&typeof i=="object"){if(s=r.get(i),s)return s.anchor??(s.anchor=n(i)),new X0(s.anchor);s={anchor:null,node:null},r.set(i,s)}e?.startsWith("!!")&&(e=TrA+e.slice(2));let l=OrA(i,e,a.tags);if(!l){if(i&&typeof i.toJSON=="function"&&(i=i.toJSON()),!i||typeof i!="object"){let C=new $t(i);return s&&(s.node=C),C}l=i instanceof Map?a[jg]:Symbol.iterator in Object(i)?a[Z0]:a[jg]}o&&(o(l),delete A.onTagObj);let g=l?.createNode?l.createNode(A.schema,i,A):typeof l?.nodeClass?.from=="function"?l.nodeClass.from(A.schema,i,A):new $t(i);return e?g.tag=e:l.default||(g.tag=l.tag),s&&(s.node=g),g}function lu(i,e,A){let t=A;for(let n=e.length-1;n>=0;--n){let o=e[n];if(typeof o=="number"&&Number.isInteger(o)&&o>=0){let a=[];a[o]=t,t=a}else t=new Map([[o,t]])}return $0(t,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:i,sourceObjects:new Map})}var MB=i=>i==null||typeof i=="object"&&!!i[Symbol.iterator]().next().done,bB=class extends d2{constructor(e,A){super(e),Object.defineProperty(this,"schema",{value:A,configurable:!0,enumerable:!1,writable:!0})}clone(e){let A=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(A.schema=e),A.items=A.items.map(t=>Pn(t)||Tn(t)?t.clone(e):t),this.range&&(A.range=this.range.slice()),A}addIn(e,A){if(MB(e))this.add(A);else{let[t,...n]=e,o=this.get(t,!0);if(vo(o))o.addIn(n,A);else if(o===void 0&&this.schema)this.set(t,lu(this.schema,n,A));else throw new Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}}deleteIn(e){let[A,...t]=e;if(t.length===0)return this.delete(A);let n=this.get(A,!0);if(vo(n))return n.deleteIn(t);throw new Error(`Expected YAML collection at ${A}. Remaining path: ${t}`)}getIn(e,A){let[t,...n]=e,o=this.get(t,!0);return n.length===0?!A&&sn(o)?o.value:o:vo(o)?o.getIn(n,A):void 0}hasAllNullValues(e){return this.items.every(A=>{if(!Tn(A))return!1;let t=A.value;return t==null||e&&sn(t)&&t.value==null&&!t.commentBefore&&!t.comment&&!t.tag})}hasIn(e){let[A,...t]=e;if(t.length===0)return this.has(A);let n=this.get(A,!0);return vo(n)?n.hasIn(t):!1}setIn(e,A){let[t,...n]=e;if(n.length===0)this.set(t,A);else{let o=this.get(t,!0);if(vo(o))o.setIn(n,A);else if(o===void 0&&this.schema)this.set(t,lu(this.schema,n,A));else throw new Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}}};var ST=i=>i.replace(/^(?!$)(?: $)?/gm,"#");function sg(i,e){return/^\n+$/.test(i)?i.substring(1):e?i.replace(/^(?! *$)/gm,e):i}var i0=(i,e,A)=>i.endsWith(` -`)?sg(A,e):A.includes(` -`)?` -`+sg(A,e):(i.endsWith(" ")?"":" ")+A;var v7="flow",Fm="block",gu="quoted";function cu(i,e,A="flow",{indentAtStart:t,lineWidth:n=80,minContentWidth:o=20,onFold:a,onOverflow:r}={}){if(!n||n<0)return i;nn-Math.max(2,o)?l.push(0):C=n-t);let d,B,u=!1,E=-1,f=-1,m=-1;A===Fm&&(E=kT(i,E,e.length),E!==-1&&(C=E+s));for(let S;S=i[E+=1];){if(A===gu&&S==="\\"){switch(f=E,i[E+1]){case"x":E+=3;break;case"u":E+=5;break;case"U":E+=9;break;default:E+=1}m=E}if(S===` -`)A===Fm&&(E=kT(i,E,e.length)),C=E+e.length+s,d=void 0;else{if(S===" "&&B&&B!==" "&&B!==` -`&&B!==" "){let k=i[E+1];k&&k!==" "&&k!==` -`&&k!==" "&&(d=E)}if(E>=C)if(d)l.push(d),C=d+s,d=void 0;else if(A===gu){for(;B===" "||B===" ";)B=S,S=i[E+=1],u=!0;let k=E>m+1?E-2:f-1;if(g[k])return i;l.push(k),g[k]=!0,C=k+s,d=void 0}else u=!0}B=S}if(u&&r&&r(),l.length===0)return i;a&&a();let v=i.slice(0,l[0]);for(let S=0;S({indentAtStart:e?i.indent.length:i.indentAtStart,lineWidth:i.options.lineWidth,minContentWidth:i.options.minContentWidth}),Km=i=>/^(%|---|\.\.\.)/m.test(i);function JrA(i,e,A){if(!e||e<0)return!1;let t=e-A,n=i.length;if(n<=t)return!1;for(let o=0,a=0;ot)return!0;if(a=o+1,n-a<=t)return!1}return!0}function Cu(i,e){let A=JSON.stringify(i);if(e.options.doubleQuotedAsJSON)return A;let{implicitKey:t}=e,n=e.options.doubleQuotedMinMultiLineLength,o=e.indent||(Km(i)?" ":""),a="",r=0;for(let s=0,l=A[s];l;l=A[++s])if(l===" "&&A[s+1]==="\\"&&A[s+2]==="n"&&(a+=A.slice(r,s)+"\\ ",s+=1,r=s,l="\\"),l==="\\")switch(A[s+1]){case"u":{a+=A.slice(r,s);let g=A.substr(s+2,4);switch(g){case"0000":a+="\\0";break;case"0007":a+="\\a";break;case"000b":a+="\\v";break;case"001b":a+="\\e";break;case"0085":a+="\\N";break;case"00a0":a+="\\_";break;case"2028":a+="\\L";break;case"2029":a+="\\P";break;default:g.substr(0,2)==="00"?a+="\\x"+g.substr(2):a+=A.substr(s,6)}s+=5,r=s+1}break;case"n":if(t||A[s+2]==='"'||A.length -`;let C,d;for(d=A.length;d>0;--d){let M=A[d-1];if(M!==` -`&&M!==" "&&M!==" ")break}let B=A.substring(d),u=B.indexOf(` -`);u===-1?C="-":A===B||u!==B.length-1?(C="+",o&&o()):C="",B&&(A=A.slice(0,-B.length),B[B.length-1]===` -`&&(B=B.slice(0,-1)),B=B.replace(M7,`$&${l}`));let E=!1,f,m=-1;for(f=0;f{x=!0});let z=cu(`${v}${M}${B}`,l,Fm,F);if(!x)return`>${k} -${l}${z}`}return A=A.replace(/\n+/g,`$&${l}`),`|${k} -${l}${v}${A}${B}`}function YrA(i,e,A,t){let{type:n,value:o}=i,{actualString:a,implicitKey:r,indent:s,indentStep:l,inFlow:g}=e;if(r&&o.includes(` -`)||g&&/[[\]{},]/.test(o))return SB(o,e);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(o))return r||g||!o.includes(` -`)?SB(o,e):Lm(i,e,A,t);if(!r&&!g&&n!==$t.PLAIN&&o.includes(` -`))return Lm(i,e,A,t);if(Km(o)){if(s==="")return e.forceBlockIndent=!0,Lm(i,e,A,t);if(r&&s===l)return SB(o,e)}let C=o.replace(/\n+/g,`$& -${s}`);if(a){let d=E=>E.default&&E.tag!=="tag:yaml.org,2002:str"&&E.test?.test(C),{compat:B,tags:u}=e.doc.schema;if(u.some(d)||B?.some(d))return SB(o,e)}return r?C:cu(C,s,v7,Gm(e,!1))}function sd(i,e,A,t){let{implicitKey:n,inFlow:o}=e,a=typeof i.value=="string"?i:Object.assign({},i,{value:String(i.value)}),{type:r}=i;r!==$t.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(a.value)&&(r=$t.QUOTE_DOUBLE);let s=g=>{switch(g){case $t.BLOCK_FOLDED:case $t.BLOCK_LITERAL:return n||o?SB(a.value,e):Lm(a,e,A,t);case $t.QUOTE_DOUBLE:return Cu(a.value,e);case $t.QUOTE_SINGLE:return b7(a.value,e);case $t.PLAIN:return YrA(a,e,A,t);default:return null}},l=s(r);if(l===null){let{defaultKeyType:g,defaultStringType:C}=e.options,d=n&&g||C;if(l=s(d),l===null)throw new Error(`Unsupported default string type ${d}`)}return l}function Um(i,e){let A=Object.assign({blockQuote:!0,commentString:ST,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trueStr:"true",verifyAliasOrder:!0},i.schema.toStringOptions,e),t;switch(A.collectionStyle){case"block":t=!1;break;case"flow":t=!0;break;default:t=null}return{anchors:new Set,doc:i,flowCollectionPadding:A.flowCollectionPadding?" ":"",indent:"",indentStep:typeof A.indent=="number"?" ".repeat(A.indent):" ",inFlow:t,options:A}}function HrA(i,e){if(e.tag){let n=i.filter(o=>o.tag===e.tag);if(n.length>0)return n.find(o=>o.format===e.format)??n[0]}let A,t;if(sn(e)){t=e.value;let n=i.filter(o=>o.identify?.(t));if(n.length>1){let o=n.filter(a=>a.test);o.length>0&&(n=o)}A=n.find(o=>o.format===e.format)??n.find(o=>!o.format)}else t=e,A=i.find(n=>n.nodeClass&&t instanceof n.nodeClass);if(!A){let n=t?.constructor?.name??(t===null?"null":typeof t);throw new Error(`Tag not resolved for ${n} value`)}return A}function zrA(i,e,{anchors:A,doc:t}){if(!t.directives)return"";let n=[],o=(sn(i)||vo(i))&&i.anchor;o&&xm(o)&&(A.add(o),n.push(`&${o}`));let a=i.tag??(e.default?null:e.tag);return a&&n.push(t.directives.tagString(a)),n.join(" ")}function AC(i,e,A,t){if(Tn(i))return i.toString(e,A,t);if(rg(i)){if(e.doc.directives)return i.toString(e);if(e.resolvedAliases?.has(i))throw new TypeError("Cannot stringify circular structure without alias nodes");e.resolvedAliases?e.resolvedAliases.add(i):e.resolvedAliases=new Set([i]),i=i.resolve(e.doc)}let n,o=Pn(i)?i:e.doc.createNode(i,{onTagObj:s=>n=s});n??(n=HrA(e.doc.schema.tags,o));let a=zrA(o,n,e);a.length>0&&(e.indentAtStart=(e.indentAtStart??0)+a.length+1);let r=typeof n.stringify=="function"?n.stringify(o,e,A,t):sn(o)?sd(o,e,A,t):o.toString(e,A,t);return a?sn(o)||r[0]==="{"||r[0]==="["?`${a} ${r}`:`${a} -${e.indent}${r}`:r}function _T({key:i,value:e},A,t,n){let{allNullValues:o,doc:a,indent:r,indentStep:s,options:{commentString:l,indentSeq:g,simpleKeys:C}}=A,d=Pn(i)&&i.comment||null;if(C){if(d)throw new Error("With simple keys, key nodes cannot have comments");if(vo(i)||!Pn(i)&&typeof i=="object"){let F="With simple keys, collection cannot be used as a key value";throw new Error(F)}}let B=!C&&(!i||d&&e==null&&!A.inFlow||vo(i)||(sn(i)?i.type===$t.BLOCK_FOLDED||i.type===$t.BLOCK_LITERAL:typeof i=="object"));A=Object.assign({},A,{allNullValues:!1,implicitKey:!B&&(C||!o),indent:r+s});let u=!1,E=!1,f=AC(i,A,()=>u=!0,()=>E=!0);if(!B&&!A.inFlow&&f.length>1024){if(C)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");B=!0}if(A.inFlow){if(o||e==null)return u&&t&&t(),f===""?"?":B?`? ${f}`:f}else if(o&&!C||e==null&&B)return f=`? ${f}`,d&&!u?f+=i0(f,A.indent,l(d)):E&&n&&n(),f;u&&(d=null),B?(d&&(f+=i0(f,A.indent,l(d))),f=`? ${f} -${r}:`):(f=`${f}:`,d&&(f+=i0(f,A.indent,l(d))));let m,v,S;Pn(e)?(m=!!e.spaceBefore,v=e.commentBefore,S=e.comment):(m=!1,v=null,S=null,e&&typeof e=="object"&&(e=a.createNode(e))),A.implicitKey=!1,!B&&!d&&sn(e)&&(A.indentAtStart=f.length+1),E=!1,!g&&s.length>=2&&!A.inFlow&&!B&&Wg(e)&&!e.flow&&!e.tag&&!e.anchor&&(A.indent=A.indent.substring(2));let k=!1,M=AC(e,A,()=>k=!0,()=>E=!0),x=" ";if(d||m||v){if(x=m?` -`:"",v){let F=l(v);x+=` -${sg(F,A.indent)}`}M===""&&!A.inFlow?x===` -`&&S&&(x=` - -`):x+=` -${A.indent}`}else if(!B&&vo(e)){let F=M[0],z=M.indexOf(` -`),j=z!==-1,X=A.inFlow??e.flow??e.items.length===0;if(j||!X){let eA=!1;if(j&&(F==="&"||F==="!")){let Z=M.indexOf(" ");F==="&"&&Z!==-1&&Zi===Om||typeof i=="symbol"&&i.description===Om,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new $t(Symbol(Om)),{addToJSMap:k7}),stringify:()=>Om},xT=(i,e)=>(Zg.identify(e)||sn(e)&&(!e.type||e.type===$t.PLAIN)&&Zg.identify(e.value))&&i?.doc.schema.tags.some(A=>A.tag===Zg.tag&&A.default);function k7(i,e,A){if(A=i&&rg(A)?A.resolve(i.doc):A,Wg(A))for(let t of A.items)S7(i,e,t);else if(Array.isArray(A))for(let t of A)S7(i,e,t);else S7(i,e,A)}function S7(i,e,A){let t=i&&rg(A)?A.resolve(i.doc):A;if(!qg(t))throw new Error("Merge sources must be maps or map aliases");let n=t.toJSON(null,i,Map);for(let[o,a]of n)e instanceof Map?e.has(o)||e.set(o,a):e instanceof Set?e.add(o):Object.prototype.hasOwnProperty.call(e,o)||Object.defineProperty(e,o,{value:a,writable:!0,enumerable:!0,configurable:!0});return e}function Jm(i,e,{key:A,value:t}){if(Pn(A)&&A.addToJSMap)A.addToJSMap(i,e,t);else if(xT(i,A))k7(i,e,t);else{let n=pr(A,"",i);if(e instanceof Map)e.set(n,pr(t,n,i));else if(e instanceof Set)e.add(n);else{let o=PrA(A,n,i),a=pr(t,o,i);o in e?Object.defineProperty(e,o,{value:a,writable:!0,enumerable:!0,configurable:!0}):e[o]=a}}return e}function PrA(i,e,A){if(e===null)return"";if(typeof e!="object")return String(e);if(Pn(i)&&A?.doc){let t=Um(A.doc,{});t.anchors=new Set;for(let o of A.anchors.keys())t.anchors.add(o.anchor);t.inFlow=!0,t.inStringifyKey=!0;let n=i.toString(t);if(!A.mapKeyWarned){let o=JSON.stringify(n);o.length>40&&(o=o.substring(0,36)+'..."'),Tm(A.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${o}. Set mapAsMap: true to use object keys.`),A.mapKeyWarned=!0}return n}return JSON.stringify(e)}function kB(i,e,A){let t=$0(i,void 0,A),n=$0(e,void 0,A);return new za(t,n)}var za=class i{constructor(e,A=null){Object.defineProperty(this,Ks,{value:w7}),this.key=e,this.value=A}clone(e){let{key:A,value:t}=this;return Pn(A)&&(A=A.clone(e)),Pn(t)&&(t=t.clone(e)),new i(A,t)}toJSON(e,A){let t=A?.mapAsMap?new Map:{};return Jm(A,t,this)}toString(e,A,t){return e?.doc?_T(this,e,A,t):JSON.stringify(this)}};function Hm(i,e,A){return(e.inFlow??i.flow?VrA:jrA)(i,e,A)}function jrA({comment:i,items:e},A,{blockItemPrefix:t,flowChars:n,itemIndent:o,onChompKeep:a,onComment:r}){let{indent:s,options:{commentString:l}}=A,g=Object.assign({},A,{indent:o,type:null}),C=!1,d=[];for(let u=0;uf=null,()=>C=!0);f&&(m+=i0(m,o,l(f))),C&&f&&(C=!1),d.push(t+m)}let B;if(d.length===0)B=n.start+n.end;else{B=d[0];for(let u=1;uf=null);ug||m.includes(` -`))&&(l=!0),C.push(m),g=C.length}let{start:d,end:B}=A;if(C.length===0)return d+B;if(!l){let u=C.reduce((E,f)=>E+f.length+2,2);l=e.options.lineWidth>0&&u>e.options.lineWidth}if(l){let u=d;for(let E of C)u+=E?` -${o}${n}${E}`:` -`;return`${u} -${n}${B}`}else return`${d}${a}${C.join(" ")}${a}${B}`}function Ym({indent:i,options:{commentString:e}},A,t,n){if(t&&n&&(t=t.replace(/^\n+/,"")),t){let o=sg(e(t),i);A.push(o.trimStart())}}function I2(i,e){let A=sn(e)?e.value:e;for(let t of i)if(Tn(t)&&(t.key===e||t.key===A||sn(t.key)&&t.key.value===A))return t}var $a=class extends bB{static get tagName(){return"tag:yaml.org,2002:map"}constructor(e){super(jg,e),this.items=[]}static from(e,A,t){let{keepUndefined:n,replacer:o}=t,a=new this(e),r=(s,l)=>{if(typeof o=="function")l=o.call(A,s,l);else if(Array.isArray(o)&&!o.includes(s))return;(l!==void 0||n)&&a.items.push(kB(s,l,t))};if(A instanceof Map)for(let[s,l]of A)r(s,l);else if(A&&typeof A=="object")for(let s of Object.keys(A))r(s,A[s]);return typeof e.sortMapEntries=="function"&&a.items.sort(e.sortMapEntries),a}add(e,A){let t;Tn(e)?t=e:!e||typeof e!="object"||!("key"in e)?t=new za(e,e?.value):t=new za(e.key,e.value);let n=I2(this.items,t.key),o=this.schema?.sortMapEntries;if(n){if(!A)throw new Error(`Key ${t.key} already set`);sn(n.value)&&Nm(t.value)?n.value.value=t.value:n.value=t.value}else if(o){let a=this.items.findIndex(r=>o(t,r)<0);a===-1?this.items.push(t):this.items.splice(a,0,t)}else this.items.push(t)}delete(e){let A=I2(this.items,e);return A?this.items.splice(this.items.indexOf(A),1).length>0:!1}get(e,A){let n=I2(this.items,e)?.value;return(!A&&sn(n)?n.value:n)??void 0}has(e){return!!I2(this.items,e)}set(e,A){this.add(new za(e,A),!0)}toJSON(e,A,t){let n=t?new t:A?.mapAsMap?new Map:{};A?.onCreate&&A.onCreate(n);for(let o of this.items)Jm(A,n,o);return n}toString(e,A,t){if(!e)return JSON.stringify(this);for(let n of this.items)if(!Tn(n))throw new Error(`Map items must all be pairs; found ${JSON.stringify(n)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),Hm(this,e,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:e.indent||"",onChompKeep:t,onComment:A})}};var Xg={collection:"map",default:!0,nodeClass:$a,tag:"tag:yaml.org,2002:map",resolve(i,e){return qg(i)||e("Expected a mapping for this tag"),i},createNode:(i,e,A)=>$a.from(i,e,A)};var us=class extends bB{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(e){super(Z0,e),this.items=[]}add(e){this.items.push(e)}delete(e){let A=zm(e);return typeof A!="number"?!1:this.items.splice(A,1).length>0}get(e,A){let t=zm(e);if(typeof t!="number")return;let n=this.items[t];return!A&&sn(n)?n.value:n}has(e){let A=zm(e);return typeof A=="number"&&A=0?e:null}var $g={collection:"seq",default:!0,nodeClass:us,tag:"tag:yaml.org,2002:seq",resolve(i,e){return Wg(i)||e("Expected a sequence for this tag"),i},createNode:(i,e,A)=>us.from(i,e,A)};var B2={identify:i=>typeof i=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:i=>i,stringify(i,e,A,t){return e=Object.assign({actualString:!0},e),sd(i,e,A,t)}};var ld={identify:i=>i==null,createNode:()=>new $t(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new $t(null),stringify:({source:i},e)=>typeof i=="string"&&ld.test.test(i)?i:e.options.nullStr};var du={identify:i=>typeof i=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:i=>new $t(i[0]==="t"||i[0]==="T"),stringify({source:i,value:e},A){if(i&&du.test.test(i)){let t=i[0]==="t"||i[0]==="T";if(e===t)return i}return e?A.options.trueStr:A.options.falseStr}};function ps({format:i,minFractionDigits:e,tag:A,value:t}){if(typeof t=="bigint")return String(t);let n=typeof t=="number"?t:Number(t);if(!isFinite(n))return isNaN(n)?".nan":n<0?"-.inf":".inf";let o=Object.is(t,-0)?"-0":JSON.stringify(t);if(!i&&e&&(!A||A==="tag:yaml.org,2002:float")&&/^\d/.test(o)){let a=o.indexOf(".");a<0&&(a=o.length,o+=".");let r=e-(o.length-a-1);for(;r-- >0;)o+="0"}return o}var Pm={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:i=>i.slice(-3).toLowerCase()==="nan"?NaN:i[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:ps},jm={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:i=>parseFloat(i),stringify(i){let e=Number(i.value);return isFinite(e)?e.toExponential():ps(i)}},Vm={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(i){let e=new $t(parseFloat(i)),A=i.indexOf(".");return A!==-1&&i[i.length-1]==="0"&&(e.minFractionDigits=i.length-A-1),e},stringify:ps};var qm=i=>typeof i=="bigint"||Number.isInteger(i),_7=(i,e,A,{intAsBigInt:t})=>t?BigInt(i):parseInt(i.substring(e),A);function RT(i,e,A){let{value:t}=i;return qm(t)&&t>=0?A+t.toString(e):ps(i)}var Wm={identify:i=>qm(i)&&i>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(i,e,A)=>_7(i,2,8,A),stringify:i=>RT(i,8,"0o")},Zm={identify:qm,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(i,e,A)=>_7(i,0,10,A),stringify:ps},Xm={identify:i=>qm(i)&&i>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(i,e,A)=>_7(i,2,16,A),stringify:i=>RT(i,16,"0x")};var NT=[Xg,$g,B2,ld,du,Wm,Zm,Xm,Pm,jm,Vm];function FT(i){return typeof i=="bigint"||Number.isInteger(i)}var $m=({value:i})=>JSON.stringify(i),qrA=[{identify:i=>typeof i=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:i=>i,stringify:$m},{identify:i=>i==null,createNode:()=>new $t(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:$m},{identify:i=>typeof i=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:i=>i==="true",stringify:$m},{identify:FT,default:!0,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(i,e,{intAsBigInt:A})=>A?BigInt(i):parseInt(i,10),stringify:({value:i})=>FT(i)?i.toString():JSON.stringify(i)},{identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:i=>parseFloat(i),stringify:$m}],WrA={default:!0,tag:"",test:/^/,resolve(i,e){return e(`Unresolved plain scalar ${JSON.stringify(i)}`),i}},LT=[Xg,$g].concat(qrA,WrA);var Iu={identify:i=>i instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(i,e){if(typeof atob=="function"){let A=atob(i.replace(/[\n\r]/g,"")),t=new Uint8Array(A.length);for(let n=0;n1&&e("Each pair must have its own sequence indicator");let n=t.items[0]||new za(new $t(null));if(t.commentBefore&&(n.key.commentBefore=n.key.commentBefore?`${t.commentBefore} -${n.key.commentBefore}`:t.commentBefore),t.comment){let o=n.value??n.key;o.comment=o.comment?`${t.comment} -${o.comment}`:t.comment}t=n}i.items[A]=Tn(t)?t:new za(t)}}else e("Expected a sequence for this tag");return i}function R7(i,e,A){let{replacer:t}=A,n=new us(i);n.tag="tag:yaml.org,2002:pairs";let o=0;if(e&&Symbol.iterator in Object(e))for(let a of e){typeof t=="function"&&(a=t.call(e,String(o++),a));let r,s;if(Array.isArray(a))if(a.length===2)r=a[0],s=a[1];else throw new TypeError(`Expected [key, value] tuple: ${a}`);else if(a&&a instanceof Object){let l=Object.keys(a);if(l.length===1)r=l[0],s=a[r];else throw new TypeError(`Expected tuple with one key, not ${l.length} keys`)}else r=a;n.items.push(kB(r,s,A))}return n}var Bu={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:x7,createNode:R7};var N7=(()=>{class i extends us{constructor(){super(),this.add=$a.prototype.add.bind(this),this.delete=$a.prototype.delete.bind(this),this.get=$a.prototype.get.bind(this),this.has=$a.prototype.has.bind(this),this.set=$a.prototype.set.bind(this),this.tag=i.tag}toJSON(A,t){if(!t)return super.toJSON(A);let n=new Map;t?.onCreate&&t.onCreate(n);for(let o of this.items){let a,r;if(Tn(o)?(a=pr(o.key,"",t),r=pr(o.value,a,t)):a=pr(o,"",t),n.has(a))throw new Error("Ordered maps must not include duplicate keys");n.set(a,r)}return n}static from(A,t,n){let o=R7(A,t,n),a=new this;return a.items=o.items,a}}return i.tag="tag:yaml.org,2002:omap",i})(),hu={collection:"seq",identify:i=>i instanceof Map,nodeClass:N7,default:!1,tag:"tag:yaml.org,2002:omap",resolve(i,e){let A=x7(i,e),t=[];for(let{key:n}of A.items)sn(n)&&(t.includes(n.value)?e(`Ordered maps must not include duplicate keys: ${n.value}`):t.push(n.value));return Object.assign(new N7,A)},createNode:(i,e,A)=>N7.from(i,e,A)};function GT({value:i,source:e},A){return e&&(i?F7:L7).test.test(e)?e:i?A.options.trueStr:A.options.falseStr}var F7={identify:i=>i===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new $t(!0),stringify:GT},L7={identify:i=>i===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new $t(!1),stringify:GT};var KT={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:i=>i.slice(-3).toLowerCase()==="nan"?NaN:i[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:ps},UT={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:i=>parseFloat(i.replace(/_/g,"")),stringify(i){let e=Number(i.value);return isFinite(e)?e.toExponential():ps(i)}},TT={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(i){let e=new $t(parseFloat(i.replace(/_/g,""))),A=i.indexOf(".");if(A!==-1){let t=i.substring(A+1).replace(/_/g,"");t[t.length-1]==="0"&&(e.minFractionDigits=t.length)}return e},stringify:ps};var Eu=i=>typeof i=="bigint"||Number.isInteger(i);function A6(i,e,A,{intAsBigInt:t}){let n=i[0];if((n==="-"||n==="+")&&(e+=1),i=i.substring(e).replace(/_/g,""),t){switch(A){case 2:i=`0b${i}`;break;case 8:i=`0o${i}`;break;case 16:i=`0x${i}`;break}let a=BigInt(i);return n==="-"?BigInt(-1)*a:a}let o=parseInt(i,A);return n==="-"?-1*o:o}function G7(i,e,A){let{value:t}=i;if(Eu(t)){let n=t.toString(e);return t<0?"-"+A+n.substr(1):A+n}return ps(i)}var OT={identify:Eu,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(i,e,A)=>A6(i,2,2,A),stringify:i=>G7(i,2,"0b")},JT={identify:Eu,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(i,e,A)=>A6(i,1,8,A),stringify:i=>G7(i,8,"0")},YT={identify:Eu,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(i,e,A)=>A6(i,0,10,A),stringify:ps},HT={identify:Eu,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(i,e,A)=>A6(i,2,16,A),stringify:i=>G7(i,16,"0x")};var K7=(()=>{class i extends $a{constructor(A){super(A),this.tag=i.tag}add(A){let t;Tn(A)?t=A:A&&typeof A=="object"&&"key"in A&&"value"in A&&A.value===null?t=new za(A.key,null):t=new za(A,null),I2(this.items,t.key)||this.items.push(t)}get(A,t){let n=I2(this.items,A);return!t&&Tn(n)?sn(n.key)?n.key.value:n.key:n}set(A,t){if(typeof t!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof t}`);let n=I2(this.items,A);n&&!t?this.items.splice(this.items.indexOf(n),1):!n&&t&&this.items.push(new za(A))}toJSON(A,t){return super.toJSON(A,t,Set)}toString(A,t,n){if(!A)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},A,{allNullValues:!0}),t,n);throw new Error("Set items must all have null values")}static from(A,t,n){let{replacer:o}=n,a=new this(A);if(t&&Symbol.iterator in Object(t))for(let r of t)typeof o=="function"&&(r=o.call(t,r,r)),a.items.push(kB(r,null,n));return a}}return i.tag="tag:yaml.org,2002:set",i})(),Qu={collection:"map",identify:i=>i instanceof Set,nodeClass:K7,default:!1,tag:"tag:yaml.org,2002:set",createNode:(i,e,A)=>K7.from(i,e,A),resolve(i,e){if(qg(i)){if(i.hasAllNullValues(!0))return Object.assign(new K7,i);e("Set items must all have null values")}else e("Expected a mapping for this tag");return i}};function U7(i,e){let A=i[0],t=A==="-"||A==="+"?i.substring(1):i,n=a=>e?BigInt(a):Number(a),o=t.replace(/_/g,"").split(":").reduce((a,r)=>a*n(60)+n(r),n(0));return A==="-"?n(-1)*o:o}function zT(i){let{value:e}=i,A=a=>a;if(typeof e=="bigint")A=a=>BigInt(a);else if(isNaN(e)||!isFinite(e))return ps(i);let t="";e<0&&(t="-",e*=A(-1));let n=A(60),o=[e%n];return e<60?o.unshift(0):(e=(e-o[0])/n,o.unshift(e%n),e>=60&&(e=(e-o[0])/n,o.unshift(e))),t+o.map(a=>String(a).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var e6={identify:i=>typeof i=="bigint"||Number.isInteger(i),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(i,e,{intAsBigInt:A})=>U7(i,A),stringify:zT},t6={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:i=>U7(i,!1),stringify:zT},_B={identify:i=>i instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(i){let e=i.match(_B.test);if(!e)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,A,t,n,o,a,r]=e.map(Number),s=e[7]?Number((e[7]+"00").substr(1,3)):0,l=Date.UTC(A,t-1,n,o||0,a||0,r||0,s),g=e[8];if(g&&g!=="Z"){let C=U7(g,!1);Math.abs(C)<30&&(C*=60),l-=6e4*C}return new Date(l)},stringify:({value:i})=>i?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};var T7=[Xg,$g,B2,ld,F7,L7,OT,JT,YT,HT,KT,UT,TT,Iu,Zg,hu,Bu,Qu,e6,t6,_B];var PT=new Map([["core",NT],["failsafe",[Xg,$g,B2]],["json",LT],["yaml11",T7],["yaml-1.1",T7]]),jT={binary:Iu,bool:du,float:Vm,floatExp:jm,floatNaN:Pm,floatTime:t6,int:Zm,intHex:Xm,intOct:Wm,intTime:e6,map:Xg,merge:Zg,null:ld,omap:hu,pairs:Bu,seq:$g,set:Qu,timestamp:_B},VT={"tag:yaml.org,2002:binary":Iu,"tag:yaml.org,2002:merge":Zg,"tag:yaml.org,2002:omap":hu,"tag:yaml.org,2002:pairs":Bu,"tag:yaml.org,2002:set":Qu,"tag:yaml.org,2002:timestamp":_B};function i6(i,e,A){let t=PT.get(e);if(t&&!i)return A&&!t.includes(Zg)?t.concat(Zg):t.slice();let n=t;if(!n)if(Array.isArray(i))n=[];else{let o=Array.from(PT.keys()).filter(a=>a!=="yaml11").map(a=>JSON.stringify(a)).join(", ");throw new Error(`Unknown schema "${e}"; use one of ${o} or define customTags array`)}if(Array.isArray(i))for(let o of i)n=n.concat(o);else typeof i=="function"&&(n=i(n.slice()));return A&&(n=n.concat(Zg)),n.reduce((o,a)=>{let r=typeof a=="string"?jT[a]:a;if(!r){let s=JSON.stringify(a),l=Object.keys(jT).map(g=>JSON.stringify(g)).join(", ");throw new Error(`Unknown custom tag ${s}; use one of ${l}`)}return o.includes(r)||o.push(r),o},[])}var ZrA=(i,e)=>i.keye.key?1:0,uu=class i{constructor({compat:e,customTags:A,merge:t,resolveKnownTags:n,schema:o,sortMapEntries:a,toStringDefaults:r}){this.compat=Array.isArray(e)?i6(e,"compat"):e?i6(null,e):null,this.name=typeof o=="string"&&o||"core",this.knownTags=n?VT:{},this.tags=i6(A,this.name,t),this.toStringOptions=r??null,Object.defineProperty(this,jg,{value:Xg}),Object.defineProperty(this,_l,{value:B2}),Object.defineProperty(this,Z0,{value:$g}),this.sortMapEntries=typeof a=="function"?a:a===!0?ZrA:null}clone(){let e=Object.create(i.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}};function qT(i,e){let A=[],t=e.directives===!0;if(e.directives!==!1&&i.directives){let s=i.directives.toString(i);s?(A.push(s),t=!0):i.directives.docStart&&(t=!0)}t&&A.push("---");let n=Um(i,e),{commentString:o}=n.options;if(i.commentBefore){A.length!==1&&A.unshift("");let s=o(i.commentBefore);A.unshift(sg(s,""))}let a=!1,r=null;if(i.contents){if(Pn(i.contents)){if(i.contents.spaceBefore&&t&&A.push(""),i.contents.commentBefore){let g=o(i.contents.commentBefore);A.push(sg(g,""))}n.forceBlockIndent=!!i.comment,r=i.contents.comment}let s=r?void 0:()=>a=!0,l=AC(i.contents,n,()=>r=null,s);r&&(l+=i0(l,"",o(r))),(l[0]==="|"||l[0]===">")&&A[A.length-1]==="---"?A[A.length-1]=`--- ${l}`:A.push(l)}else A.push(AC(i.contents,n));if(i.directives?.docEnd)if(i.comment){let s=o(i.comment);s.includes(` -`)?(A.push("..."),A.push(sg(s,""))):A.push(`... ${s}`)}else A.push("...");else{let s=i.comment;s&&a&&(s=s.replace(/^\n+/,"")),s&&((!a||r)&&A[A.length-1]!==""&&A.push(""),A.push(sg(o(s),"")))}return A.join(` -`)+` -`}var eC=class i{constructor(e,A,t){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Ks,{value:Sm});let n=null;typeof A=="function"||Array.isArray(A)?n=A:t===void 0&&A&&(t=A,A=void 0);let o=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:"1.2"},t);this.options=o;let{version:a}=o;t?._directives?(this.directives=t._directives.atDocument(),this.directives.yaml.explicit&&(a=this.directives.yaml.version)):this.directives=new vB({version:a}),this.setSchema(a,t),this.contents=e===void 0?null:this.createNode(e,n,t)}clone(){let e=Object.create(i.prototype,{[Ks]:{value:Sm}});return e.commentBefore=this.commentBefore,e.comment=this.comment,e.errors=this.errors.slice(),e.warnings=this.warnings.slice(),e.options=Object.assign({},this.options),this.directives&&(e.directives=this.directives.clone()),e.schema=this.schema.clone(),e.contents=Pn(this.contents)?this.contents.clone(e.schema):this.contents,this.range&&(e.range=this.range.slice()),e}add(e){xB(this.contents)&&this.contents.add(e)}addIn(e,A){xB(this.contents)&&this.contents.addIn(e,A)}createAlias(e,A){if(!e.anchor){let t=y7(this);e.anchor=!A||t.has(A)?D7(A||"a",t):A}return new X0(e.anchor)}createNode(e,A,t){let n;if(typeof A=="function")e=A.call({"":e},"",e),n=A;else if(Array.isArray(A)){let f=v=>typeof v=="number"||v instanceof String||v instanceof Number,m=A.filter(f).map(String);m.length>0&&(A=A.concat(m)),n=A}else t===void 0&&A&&(t=A,A=void 0);let{aliasDuplicateObjects:o,anchorPrefix:a,flow:r,keepUndefined:s,onTagObj:l,tag:g}=t??{},{onAnchor:C,setAnchors:d,sourceObjects:B}=MT(this,a||"a"),u={aliasDuplicateObjects:o??!0,keepUndefined:s??!1,onAnchor:C,onTagObj:l,replacer:n,schema:this.schema,sourceObjects:B},E=$0(e,g,u);return r&&vo(E)&&(E.flow=!0),d(),E}createPair(e,A,t={}){let n=this.createNode(e,null,t),o=this.createNode(A,null,t);return new za(n,o)}delete(e){return xB(this.contents)?this.contents.delete(e):!1}deleteIn(e){return MB(e)?this.contents==null?!1:(this.contents=null,!0):xB(this.contents)?this.contents.deleteIn(e):!1}get(e,A){return vo(this.contents)?this.contents.get(e,A):void 0}getIn(e,A){return MB(e)?!A&&sn(this.contents)?this.contents.value:this.contents:vo(this.contents)?this.contents.getIn(e,A):void 0}has(e){return vo(this.contents)?this.contents.has(e):!1}hasIn(e){return MB(e)?this.contents!==void 0:vo(this.contents)?this.contents.hasIn(e):!1}set(e,A){this.contents==null?this.contents=lu(this.schema,[e],A):xB(this.contents)&&this.contents.set(e,A)}setIn(e,A){MB(e)?this.contents=A:this.contents==null?this.contents=lu(this.schema,Array.from(e),A):xB(this.contents)&&this.contents.setIn(e,A)}setSchema(e,A={}){typeof e=="number"&&(e=String(e));let t;switch(e){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new vB({version:"1.1"}),t={resolveKnownTags:!1,schema:"yaml-1.1"};break;case"1.2":case"next":this.directives?this.directives.yaml.version=e:this.directives=new vB({version:e}),t={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,t=null;break;default:{let n=JSON.stringify(e);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${n}`)}}if(A.schema instanceof Object)this.schema=A.schema;else if(t)this.schema=new uu(Object.assign(t,A));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:e,jsonArg:A,mapAsMap:t,maxAliasCount:n,onAnchor:o,reviver:a}={}){let r={anchors:new Map,doc:this,keep:!e,mapAsMap:t===!0,mapKeyWarned:!1,maxAliasCount:typeof n=="number"?n:100},s=pr(this.contents,A??"",r);if(typeof o=="function")for(let{count:l,res:g}of r.anchors.values())o(g,l);return typeof a=="function"?C2(a,{"":s},"",s):s}toJSON(e,A){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:A})}toString(e={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){let A=JSON.stringify(e.indent);throw new Error(`"indent" option must be a positive integer, not ${A}`)}return qT(this,e)}};function xB(i){if(vo(i))return!0;throw new Error("Expected a YAML collection as document contents")}var pu=class extends Error{constructor(e,A,t,n){super(),this.name=e,this.code=t,this.message=n,this.pos=A}},Ac=class extends pu{constructor(e,A,t){super("YAMLParseError",e,A,t)}},fu=class extends pu{constructor(e,A,t){super("YAMLWarning",e,A,t)}},O7=(i,e)=>A=>{if(A.pos[0]===-1)return;A.linePos=A.pos.map(r=>e.linePos(r));let{line:t,col:n}=A.linePos[0];A.message+=` at line ${t}, column ${n}`;let o=n-1,a=i.substring(e.lineStarts[t-1],e.lineStarts[t]).replace(/[\n\r]+$/,"");if(o>=60&&a.length>80){let r=Math.min(o-39,a.length-79);a="\u2026"+a.substring(r),o-=r-1}if(a.length>80&&(a=a.substring(0,79)+"\u2026"),t>1&&/^ *$/.test(a.substring(0,o))){let r=i.substring(e.lineStarts[t-2],e.lineStarts[t-1]);r.length>80&&(r=r.substring(0,79)+`\u2026 -`),a=r+a}if(/[^ ]/.test(a)){let r=1,s=A.linePos[1];s?.line===t&&s.col>n&&(r=Math.max(1,Math.min(s.col-n,80-o)));let l=" ".repeat(o)+"^".repeat(r);A.message+=`: - -${a} -${l} -`}};function n0(i,{flow:e,indicator:A,next:t,offset:n,onError:o,parentIndent:a,startOnNewline:r}){let s=!1,l=r,g=r,C="",d="",B=!1,u=!1,E=null,f=null,m=null,v=null,S=null,k=null,M=null;for(let z of i)switch(u&&(z.type!=="space"&&z.type!=="newline"&&z.type!=="comma"&&o(z.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),u=!1),E&&(l&&z.type!=="comment"&&z.type!=="newline"&&o(E,"TAB_AS_INDENT","Tabs are not allowed as indentation"),E=null),z.type){case"space":!e&&(A!=="doc-start"||t?.type!=="flow-collection")&&z.source.includes(" ")&&(E=z),g=!0;break;case"comment":{g||o(z,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let j=z.source.substring(1)||" ";C?C+=d+j:C=j,d="",l=!1;break}case"newline":l?C?C+=z.source:(!k||A!=="seq-item-ind")&&(s=!0):d+=z.source,l=!0,B=!0,(f||m)&&(v=z),g=!0;break;case"anchor":f&&o(z,"MULTIPLE_ANCHORS","A node can have at most one anchor"),z.source.endsWith(":")&&o(z.offset+z.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),f=z,M??(M=z.offset),l=!1,g=!1,u=!0;break;case"tag":{m&&o(z,"MULTIPLE_TAGS","A node can have at most one tag"),m=z,M??(M=z.offset),l=!1,g=!1,u=!0;break}case A:(f||m)&&o(z,"BAD_PROP_ORDER",`Anchors and tags must be after the ${z.source} indicator`),k&&o(z,"UNEXPECTED_TOKEN",`Unexpected ${z.source} in ${e??"collection"}`),k=z,l=A==="seq-item-ind"||A==="explicit-key-ind",g=!1;break;case"comma":if(e){S&&o(z,"UNEXPECTED_TOKEN",`Unexpected , in ${e}`),S=z,l=!1,g=!1;break}default:o(z,"UNEXPECTED_TOKEN",`Unexpected ${z.type} token`),l=!1,g=!1}let x=i[i.length-1],F=x?x.offset+x.source.length:n;return u&&t&&t.type!=="space"&&t.type!=="newline"&&t.type!=="comma"&&(t.type!=="scalar"||t.source!=="")&&o(t.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),E&&(l&&E.indent<=a||t?.type==="block-map"||t?.type==="block-seq")&&o(E,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:S,found:k,spaceBefore:s,comment:C,hasNewline:B,anchor:f,tag:m,newlineAfterProp:v,end:F,start:M??F}}function h2(i){if(!i)return null;switch(i.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(i.source.includes(` -`))return!0;if(i.end){for(let e of i.end)if(e.type==="newline")return!0}return!1;case"flow-collection":for(let e of i.items){for(let A of e.start)if(A.type==="newline")return!0;if(e.sep){for(let A of e.sep)if(A.type==="newline")return!0}if(h2(e.key)||h2(e.value))return!0}return!1;default:return!0}}function mu(i,e,A){if(e?.type==="flow-collection"){let t=e.end[0];t.indent===i&&(t.source==="]"||t.source==="}")&&h2(e)&&A(t,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function n6(i,e,A){let{uniqueKeys:t}=i.options;if(t===!1)return!1;let n=typeof t=="function"?t:(o,a)=>o===a||sn(o)&&sn(a)&&o.value===a.value;return e.some(o=>n(o.key,A))}var WT="All mapping items must start at the same column";function ZT({composeNode:i,composeEmptyNode:e},A,t,n,o){let a=o?.nodeClass??$a,r=new a(A.schema);A.atRoot&&(A.atRoot=!1);let s=t.offset,l=null;for(let g of t.items){let{start:C,key:d,sep:B,value:u}=g,E=n0(C,{indicator:"explicit-key-ind",next:d??B?.[0],offset:s,onError:n,parentIndent:t.indent,startOnNewline:!0}),f=!E.found;if(f){if(d&&(d.type==="block-seq"?n(s,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in d&&d.indent!==t.indent&&n(s,"BAD_INDENT",WT)),!E.anchor&&!E.tag&&!B){l=E.end,E.comment&&(r.comment?r.comment+=` -`+E.comment:r.comment=E.comment);continue}(E.newlineAfterProp||h2(d))&&n(d??C[C.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else E.found?.indent!==t.indent&&n(s,"BAD_INDENT",WT);A.atKey=!0;let m=E.end,v=d?i(A,d,E,n):e(A,m,C,null,E,n);A.schema.compat&&mu(t.indent,d,n),A.atKey=!1,n6(A,r.items,v)&&n(m,"DUPLICATE_KEY","Map keys must be unique");let S=n0(B??[],{indicator:"map-value-ind",next:u,offset:v.range[2],onError:n,parentIndent:t.indent,startOnNewline:!d||d.type==="block-scalar"});if(s=S.end,S.found){f&&(u?.type==="block-map"&&!S.hasNewline&&n(s,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),A.options.strict&&E.starti&&(i.type==="block-map"||i.type==="block-seq");function $T({composeNode:i,composeEmptyNode:e},A,t,n,o){let a=t.start.source==="{",r=a?"flow map":"flow sequence",s=o?.nodeClass??(a?$a:us),l=new s(A.schema);l.flow=!0;let g=A.atRoot;g&&(A.atRoot=!1),A.atKey&&(A.atKey=!1);let C=t.offset+t.start.source.length;for(let f=0;f0){let f=o0(u,E,A.options.strict,n);f.comment&&(l.comment?l.comment+=` -`+f.comment:l.comment=f.comment),l.range=[t.offset,E,f.offset]}else l.range=[t.offset,E,E];return l}function H7(i,e,A,t,n,o){let a=A.type==="block-map"?ZT(i,e,A,t,o):A.type==="block-seq"?XT(i,e,A,t,o):$T(i,e,A,t,o),r=a.constructor;return n==="!"||n===r.tagName?(a.tag=r.tagName,a):(n&&(a.tag=n),a)}function AO(i,e,A,t,n){let o=t.tag,a=o?e.directives.tagName(o.source,d=>n(o,"TAG_RESOLVE_FAILED",d)):null;if(A.type==="block-seq"){let{anchor:d,newlineAfterProp:B}=t,u=d&&o?d.offset>o.offset?d:o:d??o;u&&(!B||B.offsetd.tag===a&&d.collection===r);if(!s){let d=e.schema.knownTags[a];if(d?.collection===r)e.schema.tags.push(Object.assign({},d,{default:!1})),s=d;else return d?n(o,"BAD_COLLECTION_TYPE",`${d.tag} used for ${r} collection, but expects ${d.collection??"scalar"}`,!0):n(o,"TAG_RESOLVE_FAILED",`Unresolved tag: ${a}`,!0),H7(i,e,A,n,a)}let l=H7(i,e,A,n,a,s),g=s.resolve?.(l,d=>n(o,"TAG_RESOLVE_FAILED",d),e.options)??l,C=Pn(g)?g:new $t(g);return C.range=l.range,C.tag=a,s?.format&&(C.format=s.format),C}function z7(i,e,A){let t=e.offset,n=XrA(e,i.options.strict,A);if(!n)return{value:"",type:null,comment:"",range:[t,t,t]};let o=n.mode===">"?$t.BLOCK_FOLDED:$t.BLOCK_LITERAL,a=e.source?$rA(e.source):[],r=a.length;for(let E=a.length-1;E>=0;--E){let f=a[E][1];if(f===""||f==="\r")r=E;else break}if(r===0){let E=n.chomp==="+"&&a.length>0?` -`.repeat(Math.max(1,a.length-1)):"",f=t+n.length;return e.source&&(f+=e.source.length),{value:E,type:o,comment:n.comment,range:[t,f,f]}}let s=e.indent+n.indent,l=e.offset+n.length,g=0;for(let E=0;Es&&(s=f.length);else{f.length=r;--E)a[E][0].length>s&&(r=E+1);let C="",d="",B=!1;for(let E=0;Es||m[0]===" "?(d===" "?d=` -`:!B&&d===` -`&&(d=` - -`),C+=d+f.slice(s)+m,d=` -`,B=!0):m===""?d===` -`?C+=` -`:d=` -`:(C+=d+m,d=" ",B=!1)}switch(n.chomp){case"-":break;case"+":for(let E=r;EA(t+d,B,u);switch(n){case"scalar":r=$t.PLAIN,s=AsA(o,l);break;case"single-quoted-scalar":r=$t.QUOTE_SINGLE,s=esA(o,l);break;case"double-quoted-scalar":r=$t.QUOTE_DOUBLE,s=tsA(o,l);break;default:return A(i,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${n}`),{value:"",type:null,comment:"",range:[t,t+o.length,t+o.length]}}let g=t+o.length,C=o0(a,g,e,A);return{value:s,type:r,comment:C.comment,range:[t,g,C.offset]}}function AsA(i,e){let A="";switch(i[0]){case" ":A="a tab character";break;case",":A="flow indicator character ,";break;case"%":A="directive indicator character %";break;case"|":case">":{A=`block scalar indicator ${i[0]}`;break}case"@":case"`":{A=`reserved character ${i[0]}`;break}}return A&&e(0,"BAD_SCALAR_START",`Plain value cannot start with ${A}`),eO(i)}function esA(i,e){return(i[i.length-1]!=="'"||i.length===1)&&e(i.length,"MISSING_CHAR","Missing closing 'quote"),eO(i.slice(1,-1)).replace(/''/g,"'")}function eO(i){let e,A;try{e=new RegExp(`(.*?)(?o?i.slice(o,t+1):n)}else A+=n}return(i[i.length-1]!=='"'||i.length===1)&&e(i.length,"MISSING_CHAR",'Missing closing "quote'),A}function isA(i,e){let A="",t=i[e+1];for(;(t===" "||t===" "||t===` -`||t==="\r")&&!(t==="\r"&&i[e+2]!==` -`);)t===` -`&&(A+=` -`),e+=1,t=i[e+1];return A||(A=" "),{fold:A,offset:e}}var nsA={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:` -`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function osA(i,e,A,t){let n=i.substr(e,A),a=n.length===A&&/^[0-9a-fA-F]+$/.test(n)?parseInt(n,16):NaN;if(isNaN(a)){let r=i.substr(e-2,A+2);return t(e-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${r}`),r}return String.fromCodePoint(a)}function j7(i,e,A,t){let{value:n,type:o,comment:a,range:r}=e.type==="block-scalar"?z7(i,e,t):P7(e,i.options.strict,t),s=A?i.directives.tagName(A.source,C=>t(A,"TAG_RESOLVE_FAILED",C)):null,l;i.options.stringKeys&&i.atKey?l=i.schema[_l]:s?l=asA(i.schema,n,s,A,t):e.type==="scalar"?l=rsA(i,n,e,t):l=i.schema[_l];let g;try{let C=l.resolve(n,d=>t(A??e,"TAG_RESOLVE_FAILED",d),i.options);g=sn(C)?C:new $t(C)}catch(C){let d=C instanceof Error?C.message:String(C);t(A??e,"TAG_RESOLVE_FAILED",d),g=new $t(n)}return g.range=r,g.source=n,o&&(g.type=o),s&&(g.tag=s),l.format&&(g.format=l.format),a&&(g.comment=a),g}function asA(i,e,A,t,n){if(A==="!")return i[_l];let o=[];for(let r of i.tags)if(!r.collection&&r.tag===A)if(r.default&&r.test)o.push(r);else return r;for(let r of o)if(r.test?.test(e))return r;let a=i.knownTags[A];return a&&!a.collection?(i.tags.push(Object.assign({},a,{default:!1,test:void 0})),a):(n(t,"TAG_RESOLVE_FAILED",`Unresolved tag: ${A}`,A!=="tag:yaml.org,2002:str"),i[_l])}function rsA({atKey:i,directives:e,schema:A},t,n,o){let a=A.tags.find(r=>(r.default===!0||i&&r.default==="key")&&r.test?.test(t))||A[_l];if(A.compat){let r=A.compat.find(s=>s.default&&s.test?.test(t))??A[_l];if(a.tag!==r.tag){let s=e.tagString(a.tag),l=e.tagString(r.tag),g=`Value may be parsed as either ${s} or ${l}`;o(n,"TAG_RESOLVE_FAILED",g,!0)}}return a}function tO(i,e,A){if(e){A??(A=e.length);for(let t=A-1;t>=0;--t){let n=e[t];switch(n.type){case"space":case"comment":case"newline":i-=n.source.length;continue}for(n=e[++t];n?.type==="space";)i+=n.source.length,n=e[++t];break}}return i}var ssA={composeNode:V7,composeEmptyNode:o6};function V7(i,e,A,t){let n=i.atKey,{spaceBefore:o,comment:a,anchor:r,tag:s}=A,l,g=!0;switch(e.type){case"alias":l=lsA(i,e,t),(r||s)&&t(e,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":l=j7(i,e,s,t),r&&(l.anchor=r.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":l=AO(ssA,i,e,A,t),r&&(l.anchor=r.source.substring(1));break;default:{let C=e.type==="error"?e.message:`Unsupported token (type: ${e.type})`;t(e,"UNEXPECTED_TOKEN",C),l=o6(i,e.offset,void 0,null,A,t),g=!1}}return r&&l.anchor===""&&t(r,"BAD_ALIAS","Anchor cannot be an empty string"),n&&i.options.stringKeys&&(!sn(l)||typeof l.value!="string"||l.tag&&l.tag!=="tag:yaml.org,2002:str")&&t(s??e,"NON_STRING_KEY","With stringKeys, all keys must be strings"),o&&(l.spaceBefore=!0),a&&(e.type==="scalar"&&e.source===""?l.comment=a:l.commentBefore=a),i.options.keepSourceTokens&&g&&(l.srcToken=e),l}function o6(i,e,A,t,{spaceBefore:n,comment:o,anchor:a,tag:r,end:s},l){let g={type:"scalar",offset:tO(e,A,t),indent:-1,source:""},C=j7(i,g,r,l);return a&&(C.anchor=a.source.substring(1),C.anchor===""&&l(a,"BAD_ALIAS","Anchor cannot be an empty string")),n&&(C.spaceBefore=!0),o&&(C.comment=o,C.range[2]=s),C}function lsA({options:i},{offset:e,source:A,end:t},n){let o=new X0(A.substring(1));o.source===""&&n(e,"BAD_ALIAS","Alias cannot be an empty string"),o.source.endsWith(":")&&n(e+A.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let a=e+A.length,r=o0(t,a,i.strict,n);return o.range=[e,a,r.offset],r.comment&&(o.comment=r.comment),o}function iO(i,e,{offset:A,start:t,value:n,end:o},a){let r=Object.assign({_directives:e},i),s=new eC(void 0,r),l={atKey:!1,atRoot:!0,directives:s.directives,options:s.options,schema:s.schema},g=n0(t,{indicator:"doc-start",next:n??o?.[0],offset:A,onError:a,parentIndent:0,startOnNewline:!0});g.found&&(s.directives.docStart=!0,n&&(n.type==="block-map"||n.type==="block-seq")&&!g.hasNewline&&a(g.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),s.contents=n?V7(l,n,g,a):o6(l,g.end,t,null,g,a);let C=s.contents.range[2],d=o0(o,C,!1,a);return d.comment&&(s.comment=d.comment),s.range=[A,C,d.offset],s}function wu(i){if(typeof i=="number")return[i,i+1];if(Array.isArray(i))return i.length===2?i:[i[0],i[1]];let{offset:e,source:A}=i;return[e,e+(typeof A=="string"?A.length:1)]}function nO(i){let e="",A=!1,t=!1;for(let n=0;n{let a=wu(A);o?this.warnings.push(new fu(a,t,n)):this.errors.push(new Ac(a,t,n))},this.directives=new vB({version:e.version||"1.2"}),this.options=e}decorate(e,A){let{comment:t,afterEmptyLine:n}=nO(this.prelude);if(t){let o=e.contents;if(A)e.comment=e.comment?`${e.comment} -${t}`:t;else if(n||e.directives.docStart||!o)e.commentBefore=t;else if(vo(o)&&!o.flow&&o.items.length>0){let a=o.items[0];Tn(a)&&(a=a.key);let r=a.commentBefore;a.commentBefore=r?`${t} -${r}`:t}else{let a=o.commentBefore;o.commentBefore=a?`${t} -${a}`:t}}A?(Array.prototype.push.apply(e.errors,this.errors),Array.prototype.push.apply(e.warnings,this.warnings)):(e.errors=this.errors,e.warnings=this.warnings),this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:nO(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,A=!1,t=-1){for(let n of e)yield*Ie(this.next(n));yield*Ie(this.end(A,t))}*next(e){switch(e.type){case"directive":this.directives.add(e.source,(A,t,n)=>{let o=wu(e);o[0]+=A,this.onError(o,"BAD_DIRECTIVE",t,n)}),this.prelude.push(e.source),this.atDirectives=!0;break;case"document":{let A=iO(this.options,this.directives,e,this.onError);this.atDirectives&&!A.directives.docStart&&this.onError(e,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(A,!1),this.doc&&(yield this.doc),this.doc=A,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(e.source);break;case"error":{let A=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,t=new Ac(wu(e),"UNEXPECTED_TOKEN",A);this.atDirectives||!this.doc?this.errors.push(t):this.doc.errors.push(t);break}case"doc-end":{if(!this.doc){let t="Unexpected doc-end without preceding document";this.errors.push(new Ac(wu(e),"UNEXPECTED_TOKEN",t));break}this.doc.directives.docEnd=!0;let A=o0(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),A.comment){let t=this.doc.comment;this.doc.comment=t?`${t} -${A.comment}`:A.comment}this.doc.range[2]=A.offset;break}default:this.errors.push(new Ac(wu(e),"UNEXPECTED_TOKEN",`Unsupported token ${e.type}`))}}*end(e=!1,A=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){let t=Object.assign({_directives:this.directives},this.options),n=new eC(void 0,t);this.atDirectives&&this.onError(A,"MISSING_CHAR","Missing directives-end indicator line"),n.range=[0,A,A],this.decorate(n,!1),yield n}}};var q7=Symbol("break visit"),gsA=Symbol("skip children"),oO=Symbol("remove item");function gd(i,e){"type"in i&&i.type==="document"&&(i={start:i.start,value:i.value}),aO(Object.freeze([]),i,e)}gd.BREAK=q7;gd.SKIP=gsA;gd.REMOVE=oO;gd.itemAtPath=(i,e)=>{let A=i;for(let[t,n]of e){let o=A?.[t];if(o&&"items"in o)A=o.items[n];else return}return A};gd.parentCollection=(i,e)=>{let A=gd.itemAtPath(i,e.slice(0,-1)),t=e[e.length-1][0],n=A?.[t];if(n&&"items"in n)return n;throw new Error("Parent collection not found")};function aO(i,e,A){let t=A(e,i);if(typeof t=="symbol")return t;for(let n of["key","value"]){let o=e[n];if(o&&"items"in o){for(let a=0;a":return"block-scalar-header"}return null}function ec(i){switch(i){case void 0:case" ":case` -`:case"\r":case" ":return!0;default:return!1}}var sO=new Set("0123456789ABCDEFabcdef"),CsA=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),r6=new Set(",[]{}"),dsA=new Set(` ,[]{} -\r `),$7=i=>!i||dsA.has(i),Du=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,A=!1){if(e){if(typeof e!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null}this.atEnd=!A;let t=this.next??"stream";for(;t&&(A||this.hasChars(1));)t=yield*Ie(this.parseNext(t))}atLineEnd(){let e=this.pos,A=this.buffer[e];for(;A===" "||A===" ";)A=this.buffer[++e];return!A||A==="#"||A===` -`?!0:A==="\r"?this.buffer[e+1]===` -`:!1}charAt(e){return this.buffer[this.pos+e]}continueScalar(e){let A=this.buffer[e];if(this.indentNext>0){let t=0;for(;A===" ";)A=this.buffer[++t+e];if(A==="\r"){let n=this.buffer[t+e+1];if(n===` -`||!n&&!this.atEnd)return e+t+1}return A===` -`||t>=this.indentNext||!A&&!this.atEnd?e+t:-1}if(A==="-"||A==="."){let t=this.buffer.substr(e,3);if((t==="---"||t==="...")&&ec(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!="number"||e!==-1&&ethis.indentValue&&!ec(this.charAt(1))&&(this.indentNext=this.indentValue),yield*Ie(this.parseBlockStart())}*parseBlockStart(){let[e,A]=this.peek(2);if(!A&&!this.atEnd)return this.setNext("block-start");if((e==="-"||e==="?"||e===":")&&ec(A)){let t=(yield*Ie(this.pushCount(1)))+(yield*Ie(this.pushSpaces(!0)));return this.indentNext=this.indentValue+1,this.indentValue+=t,yield*Ie(this.parseBlockStart())}return"doc"}*parseDocument(){yield*Ie(this.pushSpaces(!0));let e=this.getLine();if(e===null)return this.setNext("doc");let A=yield*Ie(this.pushIndicators());switch(e[A]){case"#":yield*Ie(this.pushCount(e.length-A));case void 0:return yield*Ie(this.pushNewline()),yield*Ie(this.parseLineStart());case"{":case"[":return yield*Ie(this.pushCount(1)),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*Ie(this.pushCount(1)),"doc";case"*":return yield*Ie(this.pushUntil($7)),"doc";case'"':case"'":return yield*Ie(this.parseQuotedScalar());case"|":case">":return A+=yield*Ie(this.parseBlockScalarHeader()),A+=yield*Ie(this.pushSpaces(!0)),yield*Ie(this.pushCount(e.length-A)),yield*Ie(this.pushNewline()),yield*Ie(this.parseBlockScalar());default:return yield*Ie(this.parsePlainScalar())}}*parseFlowCollection(){let e,A,t=-1;do e=yield*Ie(this.pushNewline()),e>0?(A=yield*Ie(this.pushSpaces(!1)),this.indentValue=t=A):A=0,A+=yield*Ie(this.pushSpaces(!0));while(e+A>0);let n=this.getLine();if(n===null)return this.setNext("flow");if((t!==-1&&t"0"&&A<="9")this.blockScalarIndent=Number(A)-1;else if(A!=="-")break}return yield*Ie(this.pushUntil(A=>ec(A)||A==="#"))}*parseBlockScalar(){let e=this.pos-1,A=0,t;A:for(let o=this.pos;t=this.buffer[o];++o)switch(t){case" ":A+=1;break;case` -`:e=o,A=0;break;case"\r":{let a=this.buffer[o+1];if(!a&&!this.atEnd)return this.setNext("block-scalar");if(a===` -`)break}default:break A}if(!t&&!this.atEnd)return this.setNext("block-scalar");if(A>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=A:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let o=this.continueScalar(e+1);if(o===-1)break;e=this.buffer.indexOf(` -`,o)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext("block-scalar");e=this.buffer.length}}let n=e+1;for(t=this.buffer[n];t===" ";)t=this.buffer[++n];if(t===" "){for(;t===" "||t===" "||t==="\r"||t===` -`;)t=this.buffer[++n];e=n-1}else if(!this.blockScalarKeep)do{let o=e-1,a=this.buffer[o];a==="\r"&&(a=this.buffer[--o]);let r=o;for(;a===" ";)a=this.buffer[--o];if(a===` -`&&o>=this.pos&&o+1+A>r)e=o;else break}while(!0);return yield a6,yield*Ie(this.pushToIndex(e+1,!0)),yield*Ie(this.parseLineStart())}*parsePlainScalar(){let e=this.flowLevel>0,A=this.pos-1,t=this.pos-1,n;for(;n=this.buffer[++t];)if(n===":"){let o=this.buffer[t+1];if(ec(o)||e&&r6.has(o))break;A=t}else if(ec(n)){let o=this.buffer[t+1];if(n==="\r"&&(o===` -`?(t+=1,n=` -`,o=this.buffer[t+1]):A=t),o==="#"||e&&r6.has(o))break;if(n===` -`){let a=this.continueScalar(t+1);if(a===-1)break;t=Math.max(t,a-2)}}else{if(e&&r6.has(n))break;A=t}return!n&&!this.atEnd?this.setNext("plain-scalar"):(yield a6,yield*Ie(this.pushToIndex(A+1,!0)),e?"flow":"doc")}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,A){let t=this.buffer.slice(this.pos,e);return t?(yield t,this.pos+=t.length,t.length):(A&&(yield""),0)}*pushIndicators(){switch(this.charAt(0)){case"!":return(yield*Ie(this.pushTag()))+(yield*Ie(this.pushSpaces(!0)))+(yield*Ie(this.pushIndicators()));case"&":return(yield*Ie(this.pushUntil($7)))+(yield*Ie(this.pushSpaces(!0)))+(yield*Ie(this.pushIndicators()));case"-":case"?":case":":{let e=this.flowLevel>0,A=this.charAt(1);if(ec(A)||e&&r6.has(A))return e?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,(yield*Ie(this.pushCount(1)))+(yield*Ie(this.pushSpaces(!0)))+(yield*Ie(this.pushIndicators()))}}return 0}*pushTag(){if(this.charAt(1)==="<"){let e=this.pos+2,A=this.buffer[e];for(;!ec(A)&&A!==">";)A=this.buffer[++e];return yield*Ie(this.pushToIndex(A===">"?e+1:e,!1))}else{let e=this.pos+1,A=this.buffer[e];for(;A;)if(CsA.has(A))A=this.buffer[++e];else if(A==="%"&&sO.has(this.buffer[e+1])&&sO.has(this.buffer[e+2]))A=this.buffer[e+=3];else break;return yield*Ie(this.pushToIndex(e,!1))}}*pushNewline(){let e=this.buffer[this.pos];return e===` -`?yield*Ie(this.pushCount(1)):e==="\r"&&this.charAt(1)===` -`?yield*Ie(this.pushCount(2)):0}*pushSpaces(e){let A=this.pos-1,t;do t=this.buffer[++A];while(t===" "||e&&t===" ");let n=A-this.pos;return n>0&&(yield this.buffer.substr(this.pos,n),this.pos=A),n}*pushUntil(e){let A=this.pos,t=this.buffer[A];for(;!e(t);)t=this.buffer[++A];return yield*Ie(this.pushToIndex(A,!1))}};var vu=class{constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let A=0,t=this.lineStarts.length;for(;A>1;this.lineStarts[o]=0;)switch(i[e].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break A}for(;i[++e]?.type==="space";);return i.splice(e,i.length)}function gO(i){if(i.start.type==="flow-seq-start")for(let e of i.items)e.sep&&!e.value&&!E2(e.start,"explicit-key-ind")&&!E2(e.sep,"map-value-ind")&&(e.key&&(e.value=e.key),delete e.key,cO(e.value)?e.value.end?Array.prototype.push.apply(e.value.end,e.sep):e.value.end=e.sep:Array.prototype.push.apply(e.start,e.sep),delete e.sep)}var bu=class{constructor(e){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new Du,this.onNewLine=e}*parse(e,A=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let t of this.lexer.lex(e,A))yield*Ie(this.next(t));A||(yield*Ie(this.end()))}*next(e){if(this.source=e,this.atScalar){this.atScalar=!1,yield*Ie(this.step()),this.offset+=e.length;return}let A=rO(e);if(A)if(A==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=A,yield*Ie(this.step()),A){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+e.length);break;case"space":this.atNewLine&&e[0]===" "&&(this.indent+=e.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=e.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=e.length}else{let t=`Not a YAML token: ${e}`;yield*Ie(this.pop({type:"error",offset:this.offset,message:t,source:e})),this.offset+=e.length}}*end(){for(;this.stack.length>0;)yield*Ie(this.pop())}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let e=this.peek(1);if(this.type==="doc-end"&&e?.type!=="doc-end"){for(;this.stack.length>0;)yield*Ie(this.pop());this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!e)return yield*Ie(this.stream());switch(e.type){case"document":return yield*Ie(this.document(e));case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*Ie(this.scalar(e));case"block-scalar":return yield*Ie(this.blockScalar(e));case"block-map":return yield*Ie(this.blockMap(e));case"block-seq":return yield*Ie(this.blockSequence(e));case"flow-collection":return yield*Ie(this.flowCollection(e));case"doc-end":return yield*Ie(this.documentEnd(e))}yield*Ie(this.pop())}peek(e){return this.stack[this.stack.length-e]}*pop(e){let A=e??this.stack.pop();if(!A)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield A;else{let t=this.peek(1);switch(A.type==="block-scalar"?A.indent="indent"in t?t.indent:0:A.type==="flow-collection"&&t.type==="document"&&(A.indent=0),A.type==="flow-collection"&&gO(A),t.type){case"document":t.value=A;break;case"block-scalar":t.props.push(A);break;case"block-map":{let n=t.items[t.items.length-1];if(n.value){t.items.push({start:[],key:A,sep:[]}),this.onKeyLine=!0;return}else if(n.sep)n.value=A;else{Object.assign(n,{key:A,sep:[]}),this.onKeyLine=!n.explicitKey;return}break}case"block-seq":{let n=t.items[t.items.length-1];n.value?t.items.push({start:[],value:A}):n.value=A;break}case"flow-collection":{let n=t.items[t.items.length-1];!n||n.value?t.items.push({start:[],key:A,sep:[]}):n.sep?n.value=A:Object.assign(n,{key:A,sep:[]});return}default:yield*Ie(this.pop()),yield*Ie(this.pop(A))}if((t.type==="document"||t.type==="block-map"||t.type==="block-seq")&&(A.type==="block-map"||A.type==="block-seq")){let n=A.items[A.items.length-1];n&&!n.sep&&!n.value&&n.start.length>0&&lO(n.start)===-1&&(A.indent===0||n.start.every(o=>o.type!=="comment"||o.indent=e.indent){let t=!this.onKeyLine&&this.indent===e.indent,n=t&&(A.sep||A.explicitKey)&&this.type!=="seq-item-ind",o=[];if(n&&A.sep&&!A.value){let a=[];for(let r=0;re.indent&&(a.length=0);break;default:a.length=0}}a.length>=2&&(o=A.sep.splice(a[1]))}switch(this.type){case"anchor":case"tag":n||A.value?(o.push(this.sourceToken),e.items.push({start:o}),this.onKeyLine=!0):A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case"explicit-key-ind":!A.sep&&!A.explicitKey?(A.start.push(this.sourceToken),A.explicitKey=!0):n||A.value?(o.push(this.sourceToken),e.items.push({start:o,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(A.explicitKey)if(A.sep)if(A.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(E2(A.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]});else if(cO(A.key)&&!E2(A.sep,"newline")){let a=RB(A.start),r=A.key,s=A.sep;s.push(this.sourceToken),delete A.key,delete A.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:a,key:r,sep:s}]})}else o.length>0?A.sep=A.sep.concat(o,this.sourceToken):A.sep.push(this.sourceToken);else if(E2(A.start,"newline"))Object.assign(A,{key:null,sep:[this.sourceToken]});else{let a=RB(A.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:a,key:null,sep:[this.sourceToken]}]})}else A.sep?A.value||n?e.items.push({start:o,key:null,sep:[this.sourceToken]}):E2(A.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):A.sep.push(this.sourceToken):Object.assign(A,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let a=this.flowScalar(this.type);n||A.value?(e.items.push({start:o,key:a,sep:[]}),this.onKeyLine=!0):A.sep?this.stack.push(a):(Object.assign(A,{key:a,sep:[]}),this.onKeyLine=!0);return}default:{let a=this.startBlockValue(e);if(a){if(a.type==="block-seq"){if(!A.explicitKey&&A.sep&&!E2(A.sep,"newline")){yield*Ie(this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source}));return}}else t&&e.items.push({start:o});this.stack.push(a);return}}}}yield*Ie(this.pop()),yield*Ie(this.step())}*blockSequence(e){let A=e.items[e.items.length-1];switch(this.type){case"newline":if(A.value){let t="end"in A.value?A.value.end:void 0;(Array.isArray(t)?t[t.length-1]:void 0)?.type==="comment"?t?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else A.start.push(this.sourceToken);return;case"space":case"comment":if(A.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(A.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){Array.prototype.push.apply(n,A.start),n.push(this.sourceToken),e.items.pop();return}}A.start.push(this.sourceToken)}return;case"anchor":case"tag":if(A.value||this.indent<=e.indent)break;A.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;A.value||E2(A.start,"seq-item-ind")?e.items.push({start:[this.sourceToken]}):A.start.push(this.sourceToken);return}if(this.indent>e.indent){let t=this.startBlockValue(e);if(t){this.stack.push(t);return}}yield*Ie(this.pop()),yield*Ie(this.step())}*flowCollection(e){let A=e.items[e.items.length-1];if(this.type==="flow-error-end"){let t;do yield*Ie(this.pop()),t=this.peek(1);while(t?.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!A||A.sep?e.items.push({start:[this.sourceToken]}):A.start.push(this.sourceToken);return;case"map-value-ind":!A||A.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):A.sep?A.sep.push(this.sourceToken):Object.assign(A,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!A||A.value?e.items.push({start:[this.sourceToken]}):A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let n=this.flowScalar(this.type);!A||A.value?e.items.push({start:[],key:n,sep:[]}):A.sep?this.stack.push(n):Object.assign(A,{key:n,sep:[]});return}case"flow-map-end":case"flow-seq-end":e.end.push(this.sourceToken);return}let t=this.startBlockValue(e);t?this.stack.push(t):(yield*Ie(this.pop()),yield*Ie(this.step()))}else{let t=this.peek(2);if(t.type==="block-map"&&(this.type==="map-value-ind"&&t.indent===e.indent||this.type==="newline"&&!t.items[t.items.length-1].sep))yield*Ie(this.pop()),yield*Ie(this.step());else if(this.type==="map-value-ind"&&t.type!=="flow-collection"){let n=s6(t),o=RB(n);gO(e);let a=e.end.splice(1,e.end.length);a.push(this.sourceToken);let r={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:o,key:e,sep:a}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=r}else yield*Ie(this.lineEnd(e))}}flowScalar(e){if(this.onNewLine){let A=this.source.indexOf(` -`)+1;for(;A!==0;)this.onNewLine(this.offset+A),A=this.source.indexOf(` -`,A)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let A=s6(e),t=RB(A);return t.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:t,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let A=s6(e),t=RB(A);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:t,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,A){return this.type!=="comment"||this.indent<=A?!1:e.every(t=>t.type==="newline"||t.type==="space")}*documentEnd(e){this.type!=="doc-mode"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*Ie(this.pop())))}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*Ie(this.pop()),yield*Ie(this.step());break;case"newline":this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*Ie(this.pop()))}}};function IsA(i){let e=i.prettyErrors!==!1;return{lineCounter:i.lineCounter||e&&new vu||null,prettyErrors:e}}function CO(i,e={}){let{lineCounter:A,prettyErrors:t}=IsA(e),n=new bu(A?.addNewLine),o=new yu(e),a=null;for(let r of o.compose(n.parse(i),!0,i.length))if(!a)a=r;else if(a.options.logLevel!=="silent"){a.errors.push(new Ac(r.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return t&&A&&(a.errors.forEach(O7(i,A)),a.warnings.forEach(O7(i,A))),a}function NB(i,e,A){let t;typeof e=="function"?t=e:A===void 0&&e&&typeof e=="object"&&(A=e);let n=CO(i,A);if(!n)return null;if(n.warnings.forEach(o=>Tm(n.options.logLevel,o)),n.errors.length>0){if(n.options.logLevel!=="silent")throw n.errors[0];n.errors=[]}return n.toJS(Object.assign({reviver:t},A))}function AM(i,e,A){let t=null;if(typeof e=="function"||Array.isArray(e)?t=e:A===void 0&&e&&(A=e),typeof A=="string"&&(A=A.length),typeof A=="number"){let n=Math.round(A);A=n<1?void 0:n>8?{indent:8}:{indent:n}}if(i===void 0){let{keepUndefined:n}=A??e??{};if(!n)return}return Vg(i)&&!t?i.toString(A):new eC(i,t,A).toString(A)}var a0=class i{static generateYamlFile(e,A,t,n,o=new Set){if(o.has(e.name))return;o.add(e.name);let a=e.isRoot?"root_agent.yaml":`${e.name}.yaml`,r=`${t}/${a}`,s=e.sub_agents?e.sub_agents.map(u=>({config_path:`./${u.name}.yaml`})):[],l={name:e.name,model:e.model,agent_class:e.agent_class,description:e.description||"",instruction:e.instruction,sub_agents:s,tools:i.buildToolsConfig(e.tools,n)};(!e.description||e.description.trim()==="")&&delete l.description,e.agent_class!="LlmAgent"&&(delete l.model,delete l.instruction,delete l.tools),e.agent_class==="LoopAgent"&&e.max_iterations&&(l.max_iterations=e.max_iterations);let g=i.buildCallbacksConfig(e.callbacks);Object.keys(g).length>0&&Object.assign(l,g);let C=AM(l),d=new Blob([C],{type:"application/x-yaml"}),B=new File([d],r,{type:"application/x-yaml"});A.append("files",B);for(let u of e.sub_agents??[])i.generateYamlFile(u,A,t,n,o);if(e.tools){for(let u of e.tools)if(u.toolType==="Agent Tool"){let E=u.toolAgentName||u.name;if(!E||E==="undefined"||E.trim()==="")continue;let f=n.get(E);f&&i.generateYamlFile(f,A,t,n,o)}}}static buildToolsConfig(e,A){return!e||e.length===0?[]:e.map(t=>{let n={name:t.name};if(t.toolType==="Agent Tool"){n.name="AgentTool";let o=t.toolAgentName||t.name;if(!o||o==="undefined"||o.trim()==="")return null;let a=A.get(o);return n.args={agent:{config_path:`./${o}.yaml`},skip_summarization:a?.skip_summarization||!1},n}return t.args&&Object.keys(t.args).some(a=>{let r=t.args[a];return r!=null&&r!==""})&&(n.args=t.args),n}).filter(t=>t!==null)}static buildCallbacksConfig(e){if(!e||e.length===0)return{};let A={};return e.forEach(t=>{let n=`${t.type}_callbacks`;A[n]||(A[n]=[]),A[n].push({name:t.name})}),A}};function hsA(i,e){i&1&&(I(0,"mat-hint",3),D(1," Start with a letter or underscore, and contain only letters, digits, and underscores. "),h())}var l6=class i{constructor(e,A){this.data=e;this.dialogRef=A}newAppName="";agentService=w(el);_snackbarService=w(Xc);router=w(Is);isNameValid(){let e=this.newAppName.trim();return!(!e||!/^[a-zA-Z_]/.test(e)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))}createNewApp(){let e=this.newAppName.trim();if(!this.isNameValid()){this._snackbarService.open("App name must start with a letter or underscore and can only contain letters, digits, and underscores.","OK");return}if(this.data.existingAppNames.includes(e)){this._snackbarService.open("App name already exists. Please choose a different name.","OK");return}let A={agent_class:"LlmAgent",instruction:"You are the root agent that coordinates other agents.",isRoot:!0,model:"gemini-2.5-flash",name:e,sub_agents:[],tools:[]},t=new FormData,n=new Map;a0.generateYamlFile(A,t,e,n),this.agentService.agentBuildTmp(e,t).subscribe(o=>{o?(this.router.navigate(["/"],{queryParams:{app:e,mode:"builder"}}).then(()=>{window.location.reload()}),this.dialogRef.close(!0)):this._snackbarService.open("Something went wrong, please try again","OK")})}static \u0275fac=function(A){return new(A||i)(st(Do),st(zn))};static \u0275cmp=vA({type:i,selectors:[["app-add-item-dialog"]],decls:10,vars:3,consts:[["mat-dialog-title","",1,"new-app-title"],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],[1,"validation-hint"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click","disabled"]],template:function(A,t){A&1&&(I(0,"h2",0),D(1,"Create a new app"),h(),I(2,"mat-form-field",1)(3,"input",2),Ni("ngModelChange",function(o){return wi(t.newAppName,o)||(t.newAppName=o),o}),U("keydown.enter",function(){return t.createNewApp()}),h(),T(4,hsA,2,0,"mat-hint",3),h(),I(5,"mat-dialog-actions",4)(6,"button",5),D(7,"Cancel"),h(),I(8,"button",6),U("click",function(){return t.createNewApp()}),D(9," Create "),h()()),A&2&&(Q(3),Ri("ngModel",t.newAppName),Q(),O(t.isNameValid()?-1:4),Q(4),H("disabled",!t.isNameValid()))},dependencies:[Xo,Zo,ka,fn,Gn,Kn,Ho,ha,ki,r2,J1],styles:[".new-app-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-subhead-color)!important;font-family:Google Sans;font-size:24px}.validation-hint[_ngcontent-%COMP%]{font-size:12px;color:var(--mdc-dialog-supporting-text-color)}"]})};function FB(i,e,A){let t=typeof i=="string"?document.querySelector(i):i;if(!t)return;t.querySelectorAll("g.node").forEach(o=>{let a=o,s=o.querySelector("title")?.textContent||"";s==="__LEGEND__"||s==="__START__"||s==="__END__"||a.classList.contains("unvisited-node")||A&&!A.has(s)||(a.style.cursor="pointer",a.addEventListener("mouseenter",()=>{let l=o.querySelector("ellipse, polygon, path, rect");l&&(l.style.stroke="#42A5F5",l.style.strokeWidth="3")}),a.addEventListener("mouseleave",()=>{let l=o.querySelector("ellipse, polygon, path, rect");l&&(l.style.stroke="",l.style.strokeWidth="")}),e&&a.addEventListener("click",l=>{let C=o.querySelector("title")?.textContent||"";C&&e(C,l)}))})}function IO(i,e,A={}){let{ySpacing:t=200,xSpacing:n=350,startX:o=400,startY:a=100}=A,r=i.map(m=>m.name||m.agent?.name||""),s=new Map,l=new Map;r.forEach(m=>{s.set(m,[]),l.set(m,0)}),e.forEach(m=>{let v=m.from_node?.name||m.from_node?.agent?.name,S=m.to_node?.name||m.to_node?.agent?.name;v&&S&&(s.get(v)?.push(S),l.set(S,(l.get(S)||0)+1))});let g=new Map,C=[],d=new Map(l),B=new Set;for(r.forEach(m=>{d.get(m)===0&&(C.push(m),g.set(m,0),B.add(m))});C.length>0;){let m=C.shift(),v=g.get(m)||0;s.get(m)?.forEach(S=>{let k=g.get(S);if(k!==void 0&&k<=v)return;let M=v+1;k===void 0&&g.set(S,M);let x=d.get(S)||0;d.set(S,x-1),d.get(S)===0&&!B.has(S)&&(C.push(S),B.add(S))})}let u=Math.max(...Array.from(g.values()),0);r.forEach(m=>{g.has(m)||(g.set(m,u+1),u++)});let E=new Map;g.forEach((m,v)=>{E.has(m)||E.set(m,[]),E.get(m)?.push(v)});let f=new Map;return i.forEach(m=>{let v=m.name||m.agent?.name||"",S=g.get(v)||0,k=E.get(S)||[],M=k.indexOf(v),x=k.length,F=(M-(x-1)/2)*n;f.set(v,{x:o+F,y:a+S*t})}),{levels:g,nodesByLevel:E,positions:f}}function tc(i,e=""){return i?.name||i?.agent?.name||e}function BO(i){switch(i){case"start":return"play_arrow";case"function":return"code";case"tool":return"build";case"join":return"merge";default:return"smart_toy"}}function hO(i){switch(i){case"start":return"Start";case"function":return"Function";case"tool":return"Tool";case"join":return"Join";default:return"Agent"}}var g6={ySpacing:200,xSpacing:350,startX:400,startY:100};function EO(i){return i.map(e=>e.name).join("/")}function tC(i){return!!(i.graph||i.nodes||i.sub_agents&&i.sub_agents.length>0)}function eM(i){return i.graph?.nodes?i.graph.nodes:i.nodes?i.nodes:[]}function LB(i,e){if(i.nodes){let A=i.nodes.find(t=>t.name===e);if(A)return A}if(i.graph?.nodes){let A=i.graph.nodes.find(t=>t.name===e);if(A)return A}if(i.sub_agents){let A=i.sub_agents.find(t=>t.name===e);if(A)return A}return null}function QO(i,e){let A=e.split("/"),t=[{name:i.name,data:i}],n=i;for(let o=1;otc(l)===a);if(s)t.push({name:a,data:s}),n=s;else{console.warn(`Could not find node '${a}' in path '${e}'`);break}}return t}function EsA(i,e){i&1&&(I(0,"mat-icon",20),D(1,"chevron_right"),h())}function QsA(i,e){if(i&1){let A=aA();T(0,EsA,2,0,"mat-icon",20),I(1,"button",21),U("click",function(){let n=L(A).$index,o=p(2);return G(o.navigateToLevel(n))}),D(2),h()}if(i&2){let A=e.$implicit,t=e.$index,n=p(2);O(t>0?0:-1),Q(),_A("active",t===n.breadcrumbs().length-1),H("disabled",t===n.breadcrumbs().length-1),Q(),Ee(" ",A," ")}}function usA(i,e){if(i&1&&(I(0,"div",3)(1,"span"),D(2,"Agent Structure:"),h(),I(3,"button",19),D(4),h(),I(5,"mat-icon",20),D(6,"chevron_right"),h(),ke(7,QsA,3,5,null,null,Ja),h()),i&2){let A=p();Q(4),nA(A.appName),Q(3),_e(A.breadcrumbs())}}function psA(i,e){i&1&&(I(0,"div",15),lA(1,"mat-spinner",22),I(2,"p"),D(3,"Loading agent structure..."),h()())}function fsA(i,e){if(i&1&&(I(0,"div",16)(1,"mat-icon",23),D(2,"error_outline"),h(),I(3,"p",24),D(4),h()()),i&2){let A=p();Q(4),nA(A.errorMessage())}}function msA(i,e){if(i&1){let A=aA();I(0,"div",25),U("wheel",function(n){L(A);let o=p();return G(o.onWheel(n))})("mousedown",function(n){L(A);let o=p();return G(o.onMouseDown(n))})("mousemove",function(n){L(A);let o=p();return G(o.onMouseMove(n))})("mouseup",function(){L(A);let n=p();return G(n.onMouseUp())})("mouseleave",function(){L(A);let n=p();return G(n.onMouseUp())}),h()}if(i&2){let A=p();H("innerHTML",A.renderedGraph(),Fc)}}function wsA(i,e){i&1&&(I(0,"div",18)(1,"mat-icon",26),D(2,"account_tree"),h(),I(3,"p"),D(4,"Agent structure graph not available."),h()())}var c6=class i{appName;preloadedAppData;preloadedLightGraphSvg;preloadedDarkGraphSvg;startPath;close=new FA;agentService=w(el);graphService=w(uB);sanitizer=w(Qs);themeService=w(og);renderedGraph=mA(null);isLoading=mA(!0);errorMessage=mA(null);fullAppData=null;navigationStack=[];breadcrumbs=mA([]);isPanning=!1;wasDragging=!1;dragStartX=0;dragStartY=0;startPanX=0;startPanY=0;scale=1;translateX=0;translateY=0;lastMousedownTarget=null;onOverlayMouseDown(e){this.lastMousedownTarget=e.target}onBackdropClick(e){if(this.wasDragging||this.lastMousedownTarget&&(this.lastMousedownTarget.closest("svg")||this.lastMousedownTarget.closest(".overlay-header")||this.lastMousedownTarget.closest(".loading-container")||this.lastMousedownTarget.closest(".error-container")||this.lastMousedownTarget.closest(".no-graph-container")))return;let A=e.target;!A.closest("svg")&&!A.closest(".overlay-header")&&!A.closest(".loading-container")&&!A.closest(".error-container")&&!A.closest(".no-graph-container")&&this.close.emit()}ngOnInit(){this.loadAgentGraph()}loadAgentGraph(){if(this.isLoading.set(!0),this.errorMessage.set(null),this.renderedGraph.set(null),this.preloadedAppData){if(this.fullAppData=this.preloadedAppData,this.navigationStack=[{name:this.fullAppData.root_agent?.name||this.appName,data:this.fullAppData.root_agent}],this.startPath){let e=this.fullAppData.root_agent,A=this.startPath.split("/");for(let t of A){if(!t)continue;let n=LB(e,t);if(n)this.navigationStack.push({name:t,data:n}),e=n;else break}}this.updateBreadcrumbs(),this.renderCurrentLevel();return}this.agentService.getAppInfo(this.appName).subscribe({next:e=>{if(this.fullAppData=e,this.navigationStack=[{name:e.root_agent?.name||this.appName,data:e.root_agent}],this.startPath){let A=this.fullAppData.root_agent,t=this.startPath.split("/");for(let n of t){if(!n)continue;let o=LB(A,n);if(o)this.navigationStack.push({name:n,data:o}),A=o;else break}}this.updateBreadcrumbs(),this.renderCurrentLevel()},error:e=>{console.error("Error loading app data:",e),this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1)}})}renderCurrentLevel(){let e=this.themeService.currentTheme()==="dark",A=this.getCurrentPath(),t=e?this.preloadedDarkGraphSvg:this.preloadedLightGraphSvg,n=t?t[A]:null;if(n){this.renderedGraph.set(this.sanitizer.bypassSecurityTrustHtml(n)),this.isLoading.set(!1),setTimeout(()=>{let o=this.getExpandableNodes();FB(".svg-container",a=>{this.wasDragging||this.onNodeClick(a)},o),this.initializeSvgTransform()},50);return}this.agentService.getAppGraphImage(this.appName,e,A).subscribe({next:o=>re(this,null,function*(){try{if(!o?.dotSrc){this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1);return}let a=yield this.graphService.render(o.dotSrc);this.renderedGraph.set(this.sanitizer.bypassSecurityTrustHtml(a)),this.isLoading.set(!1),setTimeout(()=>{let r=this.getExpandableNodes();FB(".svg-container",s=>{this.wasDragging||this.onNodeClick(s)},r),this.initializeSvgTransform()},50)}catch(a){console.error("Error rendering graph:",a),this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1)}}),error:o=>{console.error("Error loading agent graph:",o),this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1)}})}getCurrentPath(){return this.navigationStack.length<=1?"":this.navigationStack.slice(1).map(e=>e.name).join("/")}updateBreadcrumbs(){this.breadcrumbs.set(this.navigationStack.map(e=>e.name))}onNodeClick(e){let A=this.navigationStack[this.navigationStack.length-1].data,t=LB(A,e);t&&tC(t)&&this.navigateIntoNode(e,t)}navigateIntoNode(e,A){this.navigationStack.push({name:e,data:A}),this.updateBreadcrumbs(),this.isLoading.set(!0),this.renderCurrentLevel()}navigateToLevel(e){e>=0&&e{let a=tc(o);a!==t&&tC(o)&&e.add(a)}),e}getSvgElement(){return document.querySelector(".svg-container svg")}applyTransform(){let e=this.getSvgElement();e&&(e.style.transform=`translate(${this.translateX}px, ${this.translateY}px) scale(${this.scale})`)}initializeSvgTransform(){let e=this.getSvgElement(),A=document.querySelector(".svg-container");if(!e||!A)return;let t=e.getBoundingClientRect(),n=A.getBoundingClientRect(),o=48,a=(n.width-o)/t.width,r=(n.height-o)/t.height;this.scale=Math.min(1,a,r);let s=t.width*this.scale,l=t.height*this.scale;this.translateX=(n.width-s)/2,this.translateY=(n.height-l)/2,this.applyTransform(),requestAnimationFrame(()=>{e.classList.add("ready")})}onWheel(e){let A=document.querySelector(".svg-container"),t=this.getSvgElement();if(!A||!t)return;e.preventDefault();let n=Math.max(-100,Math.min(100,e.deltaY)),o=Math.pow(1.002,-n),a=this.scale*o,r=A.getBoundingClientRect(),s=e.clientX-r.left,l=e.clientY-r.top,g=(s-this.translateX)/this.scale,C=(l-this.translateY)/this.scale;this.translateX=s-g*a,this.translateY=l-C*a,this.scale=a,this.applyTransform()}onMouseDown(e){if(e.button!==0||!e.target.closest("svg"))return;this.isPanning=!0,this.wasDragging=!1,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.startPanX=e.clientX,this.startPanY=e.clientY;let t=this.getSvgElement();t&&(t.style.cursor="grabbing")}onMouseMove(e){if(this.isPanning){if(!this.wasDragging){let A=e.clientX-this.dragStartX,t=e.clientY-this.dragStartY;A*A+t*t>25&&(this.wasDragging=!0)}this.translateX+=e.clientX-this.startPanX,this.translateY+=e.clientY-this.startPanY,this.startPanX=e.clientX,this.startPanY=e.clientY,this.applyTransform()}}onMouseUp(){this.isPanning=!1;let e=this.getSvgElement();e&&(e.style.cursor=""),setTimeout(()=>{this.wasDragging=!1},50)}resetZoomPan(){this.initializeSvgTransform()}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-agent-structure-graph-dialog"]],inputs:{appName:"appName",preloadedAppData:"preloadedAppData",preloadedLightGraphSvg:"preloadedLightGraphSvg",preloadedDarkGraphSvg:"preloadedDarkGraphSvg",startPath:"startPath"},outputs:{close:"close"},decls:35,vars:2,consts:[[1,"overlay-backdrop"],[1,"overlay-panel",3,"mousedown","click"],[1,"overlay-header"],[1,"breadcrumb-container"],[2,"flex","1"],[1,"graph-legend"],[1,"legend-item"],[2,"color","#42a5f5","font-size","16px"],[2,"color","#9333ea","font-size","16px"],[2,"color","#10b981","font-size","16px"],[2,"color","#f59e0b","font-size","16px"],[2,"color","#6b7280","font-size","16px"],["mat-icon-button","","aria-label","Close",3,"click"],[1,"overlay-content"],[1,"graph-container"],[1,"loading-container"],[1,"error-container"],[1,"svg-container",3,"innerHTML"],[1,"no-graph-container"],["disabled","",1,"breadcrumb-item"],[1,"breadcrumb-separator"],[1,"breadcrumb-item",3,"click","disabled"],["diameter","50"],[1,"error-icon"],[1,"error-message"],[1,"svg-container",3,"wheel","mousedown","mousemove","mouseup","mouseleave","innerHTML"],[1,"large-icon"]],template:function(A,t){A&1&&(lA(0,"div",0),I(1,"div",1),U("mousedown",function(o){return t.onOverlayMouseDown(o)})("click",function(o){return t.onBackdropClick(o)}),I(2,"div",2),T(3,usA,9,1,"div",3),lA(4,"span",4),I(5,"div",5)(6,"span",6)(7,"span",7),D(8,"\u2726"),h(),D(9," Agent"),h(),I(10,"span",6)(11,"span",8),D(12,"\u22B7"),h(),D(13," Workflow"),h(),I(14,"span",6)(15,"span",9),D(16,"\u0192"),h(),D(17," Function"),h(),I(18,"span",6)(19,"span",10),D(20,"\u2335"),h(),D(21," Join"),h(),I(22,"span",6)(23,"span",11),D(24,"\u{1F527}"),h(),D(25," Tool"),h()(),I(26,"button",12),U("click",function(){return t.close.emit()}),I(27,"mat-icon"),D(28,"close"),h()()(),I(29,"div",13)(30,"div",14),T(31,psA,4,0,"div",15)(32,fsA,5,1,"div",16)(33,msA,1,1,"div",17)(34,wsA,5,0,"div",18),h()()()),A&2&&(Q(3),O(t.renderedGraph()&&t.breadcrumbs().length>0?3:-1),Q(28),O(t.isLoading()?31:t.errorMessage()?32:t.renderedGraph()?33:34))},dependencies:[li,qi,yi,Un,zt,l2,Es],styles:["[_nghost-%COMP%]{display:block;position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center}.overlay-backdrop[_ngcontent-%COMP%]{position:absolute;inset:0;background-color:#000000b3}.overlay-panel[_ngcontent-%COMP%]{position:relative;width:100vw;height:100vh;display:flex;flex-direction:column;background-color:transparent;color:var(--mat-sys-on-surface);border-radius:0;overflow:hidden;box-shadow:none}.overlay-header[_ngcontent-%COMP%]{display:flex;align-items:center;height:48px;padding:0 16px;box-sizing:border-box;border-bottom:1px solid var(--mat-sys-outline-variant);background-color:var(--mat-sys-surface-container)}.overlay-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden}.graph-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-height:0}.agent-info[_ngcontent-%COMP%]{margin:0 0 8px;font-size:14px;color:var(--mdc-dialog-supporting-text-color)}.agent-info[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{font-weight:600;color:var(--mdc-dialog-supporting-text-color)}.svg-container[_ngcontent-%COMP%]{flex:1;position:relative;overflow:hidden;background-color:transparent}.svg-container[_ngcontent-%COMP%] svg{position:absolute;top:0;left:0;transform-origin:0 0;cursor:grab;border-radius:16px;box-shadow:0 4px 12px #0000004d}.svg-container[_ngcontent-%COMP%] svg>g.graph>polygon:first-child{fill:transparent!important;stroke:transparent!important}.svg-container[_ngcontent-%COMP%] svg{opacity:0;transition:opacity .1s ease-in-out}.svg-container[_ngcontent-%COMP%] svg.ready{opacity:1}.svg-container[_ngcontent-%COMP%] svg:active{cursor:grabbing}.dark-theme[_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg, .dark-theme [_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg{background-color:#0e172a}.light-theme[_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg, .light-theme [_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg{background-color:#f9fafc}.loading-container[_ngcontent-%COMP%], .error-container[_ngcontent-%COMP%], .no-graph-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:400px;padding:40px}.loading-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .error-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .no-graph-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-top:16px;font-size:14px;color:var(--mdc-dialog-supporting-text-color)}.error-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;color:#f44336}.error-message[_ngcontent-%COMP%]{color:#f44336!important}.large-icon[_ngcontent-%COMP%]{font-size:64px;width:64px;height:64px;color:var(--mdc-dialog-supporting-text-color);opacity:.6}.breadcrumb-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;margin-left:8px;padding:0;background-color:transparent;flex-wrap:wrap}.breadcrumb-item[_ngcontent-%COMP%]{background:none;border:none;padding:4px 8px;cursor:pointer;color:var(--mat-sys-primary);font-size:13px;border-radius:4px;transition:background-color .2s}.breadcrumb-item[_ngcontent-%COMP%]:hover:not(:disabled){background-color:var(--mat-sys-surface-container-high)}.breadcrumb-item[_ngcontent-%COMP%]:disabled, .breadcrumb-item.active[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);cursor:default;font-weight:600}.breadcrumb-separator[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:var(--mat-sys-on-surface-variant)}.graph-legend[_ngcontent-%COMP%]{display:flex;align-items:center;gap:16px;margin-right:16px;font-size:13px;color:var(--mat-sys-on-surface-variant);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:6px 16px;background-color:var(--mat-sys-surface-container-lowest)}.graph-legend[_ngcontent-%COMP%] .legend-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;font-weight:500}"]})};var ysA=["mat-internal-form-field",""],DsA=["*"],C6=(()=>{class i{labelPosition="after";static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["div","mat-internal-form-field",""]],hostAttrs:[1,"mdc-form-field","mat-internal-form-field"],hostVars:2,hostBindings:function(t,n){t&2&&_A("mdc-form-field--align-end",n.labelPosition==="before")},inputs:{labelPosition:"labelPosition"},attrs:ysA,ngContentSelectors:DsA,decls:1,vars:0,template:function(t,n){t&1&&(Ot(),Ze(0))},styles:[`.mat-internal-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-flex;align-items:center;vertical-align:middle}.mat-internal-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mat-internal-form-field>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end .mdc-form-field--align-end label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0} -`],encapsulation:2,changeDetection:0})}return i})();var vsA=["audioPlayer"],GB=class i{base64data=ve("");audioPlayerRef=Yo("audioPlayer");audioSrc="";constructor(){}ngOnChanges(e){e.base64data&&this.base64data()&&this.setAudioSource(this.base64data())}setAudioSource(e){e.startsWith("data:")||e.startsWith("http")||e.startsWith("blob:")?this.audioSrc=e:this.audioSrc=`data:audio/mpeg;base64,${e}`,this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.load()}play(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.play()}pause(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.pause()}stop(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&(this.audioPlayerRef().nativeElement.pause(),this.audioPlayerRef().nativeElement.currentTime=0)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-audio-player"]],viewQuery:function(A,t){A&1&&ls(t.audioPlayerRef,vsA,5),A&2&&br()},inputs:{base64data:[1,"base64data"]},features:[ii],decls:3,vars:1,consts:[["audioPlayer",""],["controls","",3,"src"]],template:function(A,t){A&1&&(Ln(0,"div"),$n(1,"audio",1,0),Xn()),A&2&&(Q(),Ma("src",t.audioSrc))},styles:[".audio-player-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;padding:15px;border-radius:8px;box-shadow:0 2px 5px var(--audio-player-container-box-shadow-color);margin:20px auto;max-width:350px}audio[_ngcontent-%COMP%]{outline:none;border-radius:5px;width:350px}.custom-controls[_ngcontent-%COMP%]{margin-top:10px;display:flex;gap:10px}.custom-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:8px 15px;border:none;border-radius:5px;color:var(--audio-player-custom-controls-button-color);cursor:pointer;font-size:14px;transition:background-color .2s ease}"]})};function bsA(i,e){if(i&1){let A=aA();I(0,"div",0)(1,"div",4),D(2),h(),I(3,"button",5),U("click",function(){L(A);let n=p();return G(n.close())}),Et(),I(4,"svg",6),lA(5,"path",7),h()()()}if(i&2){let A=p();Q(),H("title",A.currentUrl),Q(),nA(A.currentUrl)}}function MsA(i,e){if(i&1){let A=aA();I(0,"button",5),U("click",function(){L(A);let n=p();return G(n.close())}),Et(),I(1,"svg",6),lA(2,"path",7),h()()}}function SsA(i,e){if(i&1){let A=aA();I(0,"button",8),U("click",function(){L(A);let n=p();return G(n.prevImage())}),Et(),I(1,"svg",6),lA(2,"path",9),h()(),hr(),I(3,"button",10),U("click",function(){L(A);let n=p();return G(n.nextImage())}),Et(),I(4,"svg",6),lA(5,"path",11),h()(),hr(),I(6,"div",12),D(7),h()}if(i&2){let A=p();H("disabled",A.currentIndex===0),Q(3),H("disabled",A.currentIndex===A.images.length-1),Q(4),Ya("",A.currentIndex+1," / ",A.images.length)}}function ksA(i,e){if(i&1&&lA(0,"div",18),i&2){let A=p(3);H("ngStyle",A.getHighlightStyle())}}function _sA(i,e){if(i&1){let A=aA();I(0,"div",16),U("click",function(n){return n.stopPropagation()})("wheel",function(n){L(A);let o=p(2);return G(o.onWheel(n))})("mousedown",function(n){L(A);let o=p(2);return G(o.onMouseDown(n))})("mousemove",function(n){L(A);let o=p(2);return G(o.onMouseMove(n))})("mouseup",function(){L(A);let n=p(2);return G(n.onMouseUp())})("mouseleave",function(){L(A);let n=p(2);return G(n.onMouseUp())}),lA(1,"img",17),T(2,ksA,1,1,"div",18),h()}if(i&2){let A=p(2);H("ngStyle",A.getTransformStyle()),Q(),H("src",A.displayContent,mo),Q(),O(A.shouldShowHighlight()?2:-1)}}function xsA(i,e){i&1&&(I(0,"div",15),D(1," No image data provided. "),h())}function RsA(i,e){if(i&1){let A=aA();I(0,"div",13),U("click",function(){L(A);let n=p();return G(n.close())}),T(1,_sA,3,3,"div",14),T(2,xsA,2,0,"div",15),h()}if(i&2){let A=p();Q(),O(A.displayContent?1:-1),Q(),O(A.displayContent?-1:2)}}function NsA(i,e){if(i&1&&lA(0,"div",3),i&2){let A=p();H("innerHTML",A.displayContent,Fc)}}var KB=class i{displayContent=null;isSvgContent=!1;images=[];currentIndex=0;currentUrl=null;urls=[];coordinates=[];scale=1;translateX=0;translateY=0;isDragging=!1;startX=0;startY=0;dialogRef=w(zn);data=w(Do);safeValuesService=w(Qs);ngOnInit(){this.images=this.data.images||[],this.currentIndex=this.data.currentIndex||0,this.urls=this.data.urls||[],this.coordinates=this.data.coordinates||[],this.updateImage()}updateImage(){this.scale=1,this.translateX=0,this.translateY=0;let e=this.data.imageData,A="";this.images.length>0&&(e=this.images[this.currentIndex],A=this.urls[this.currentIndex]||""),this.currentUrl=A,this.processImageData(e)}getHighlightStyle(){let e=this.coordinates[this.currentIndex];return e?{left:`${e.x/1e3*100}%`,top:`${e.y/1e3*100}%`}:{}}shouldShowHighlight(){return!!this.coordinates[this.currentIndex]}processImageData(e){if(!e){this.displayContent=null,this.isSvgContent=!1;return}if(e.trim().includes("0&&(this.currentIndex--,this.updateImage())}onWheel(e){e.preventDefault();let A=.1;e.deltaY<0?this.scale+=A:this.scale=Math.max(.5,this.scale-A)}onMouseDown(e){this.isDragging=!0,this.startX=e.clientX-this.translateX,this.startY=e.clientY-this.translateY,e.preventDefault()}onMouseMove(e){this.isDragging&&(this.translateX=e.clientX-this.startX,this.translateY=e.clientY-this.startY)}onMouseUp(){this.isDragging=!1}getTransformStyle(){return{transform:`translate(${this.translateX}px, ${this.translateY}px) scale(${this.scale})`,transformOrigin:"center",cursor:this.isDragging?"grabbing":"grab",transition:this.isDragging?"none":"transform 0.1s ease"}}handleKeyDown(e){e.key==="ArrowLeft"?this.prevImage():e.key==="ArrowRight"&&this.nextImage()}close(){this.dialogRef.close()}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-view-image-dialog"]],hostBindings:function(A,t){A&1&&U("keydown",function(o){return t.handleKeyDown(o)},Fg)},decls:6,vars:4,consts:[[1,"header-bar"],[1,"close-button"],[1,"image-wrapper"],[3,"innerHTML"],[1,"image-title",3,"title"],[1,"close-button",3,"click"],["xmlns","http://www.w3.org/2000/svg","viewBox","0 0 24 24","fill","currentColor","width","24px","height","24px"],["d","M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"],[1,"nav-button","prev-button",3,"click","disabled"],["d","M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"],[1,"nav-button","next-button",3,"click","disabled"],["d","M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"],[1,"image-counter"],[1,"image-wrapper",3,"click"],[1,"image-container",2,"position","relative","display","inline-block",3,"ngStyle"],[1,"no-image-placeholder"],[1,"image-container",2,"position","relative","display","inline-block",3,"click","wheel","mousedown","mousemove","mouseup","mouseleave","ngStyle"],["alt","Viewed Image",3,"src"],[1,"highlight-circle",3,"ngStyle"]],template:function(A,t){A&1&&(I(0,"div"),T(1,bsA,6,2,"div",0)(2,MsA,3,0,"button",1),T(3,SsA,8,4),T(4,RsA,3,2,"div",2),T(5,NsA,1,1,"div",3),h()),A&2&&(Q(),O(t.currentUrl?1:2),Q(2),O(t.images.length>1?3:-1),Q(),O(t.isSvgContent?-1:4),Q(),O(t.isSvgContent?5:-1))},dependencies:[vI],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;width:100vw;height:100vh;padding:0;overflow:hidden;background-color:#0009}.close-button[_ngcontent-%COMP%]{position:absolute;top:5px;right:10px;border:none;cursor:pointer;padding:8px;border-radius:50%;transition:background-color .2s ease;color:#fff;background:#00000080;display:flex;align-items:center;justify-content:center;margin-bottom:15px;z-index:30}.close-button[_ngcontent-%COMP%]:hover{background-color:#0000000d}.close-button[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{width:24px;height:24px;fill:currentColor}.image-wrapper[_ngcontent-%COMP%]{flex-grow:1;display:flex;justify-content:center;align-items:center;overflow:hidden}.image-wrapper[_ngcontent-%COMP%] img[_ngcontent-%COMP%], .image-wrapper[_ngcontent-%COMP%] .svg-container[_ngcontent-%COMP%]{max-width:100%;max-height:100%;object-fit:contain;border-radius:0}.no-image-placeholder[_ngcontent-%COMP%]{color:var(--trace-chart-trace-duration-color);font-style:italic;text-align:center;padding:20px}@media(max-width:1768px){.close-button[_ngcontent-%COMP%]{top:5px;right:5px;padding:5px}}.nav-button[_ngcontent-%COMP%]{position:absolute;top:50%;transform:translateY(-50%);background:#00000080;color:#fff;border:none;border-radius:50%;width:40px;height:40px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background-color .2s ease;z-index:10}.nav-button[_ngcontent-%COMP%]:hover:not(:disabled){background:#000000b3}.nav-button[_ngcontent-%COMP%]:disabled{opacity:.3;cursor:default}.nav-button[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{width:24px;height:24px;fill:currentColor}.prev-button[_ngcontent-%COMP%]{left:20px}.next-button[_ngcontent-%COMP%]{right:20px}.image-counter[_ngcontent-%COMP%]{position:absolute;bottom:20px;left:50%;transform:translate(-50%);background:#00000080;color:#fff;padding:4px 12px;border-radius:12px;font-size:14px;z-index:10}.header-bar[_ngcontent-%COMP%]{position:absolute;top:0;left:0;width:100%;background:#000000b3;color:#fff;z-index:20;display:flex;align-items:center;justify-content:center;padding:8px 40px;box-sizing:border-box}.image-title[_ngcontent-%COMP%]{font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:90%}.header-bar[_ngcontent-%COMP%] .close-button[_ngcontent-%COMP%]{position:absolute;top:50%;right:10px;transform:translateY(-50%);color:#fff;margin-bottom:0;background:transparent}.header-bar[_ngcontent-%COMP%] .close-button[_ngcontent-%COMP%]:hover{background-color:#ffffff1a}.highlight-circle[_ngcontent-%COMP%]{position:absolute;width:30px;height:30px;border-radius:50%;background-color:#ff000080;border:2px solid red;transform:translate(-50%,-50%);pointer-events:none;z-index:5}"]})};function FsA(i,e){i&1&&(I(0,"mat-icon",4),D(1,"image"),h())}function LsA(i,e){i&1&&(I(0,"mat-icon",4),D(1,"audiotrack"),h())}function GsA(i,e){i&1&&(I(0,"mat-icon",4),D(1,"movie"),h())}function KsA(i,e){i&1&&(I(0,"mat-icon",4),D(1,"description"),h())}function UsA(i,e){i&1&&(I(0,"mat-icon",4),D(1,"text_snippet"),h())}function TsA(i,e){if(i&1&&T(0,KsA,2,0,"mat-icon",4)(1,UsA,2,0,"mat-icon",4),i&2){let A=p().$index,t=p();O(t.selectedArtifacts[A].mimeType==="text/html"?0:1)}}function OsA(i,e){i&1&&(I(0,"mat-icon",4),D(1,"insert_drive_file"),h())}function JsA(i,e){if(i&1&&(I(0,"mat-option",12),D(1),h()),i&2){let A=e.$implicit;H("value",A),Q(),nA(A.versionId)}}function YsA(i,e){if(i&1){let A=aA();I(0,"div",15)(1,"img",18),U("click",function(){L(A);let n=p().$index,o=p();return G(o.openViewImageDialog(o.selectedArtifacts[n].data))}),h()()}if(i&2){let A=p().$index,t=p();Q(),H("src",t.selectedArtifacts[A].data??"",mo)}}function HsA(i,e){if(i&1&&(I(0,"div",16),lA(1,"app-audio-player",19),h()),i&2){let A=p().$index,t=p();Q(),H("base64data",t.selectedArtifacts[A].data)}}function zsA(i,e){if(i&1&&(I(0,"div",17),lA(1,"video",20),h()),i&2){let A=p().$index,t=p();Q(),H("src",t.selectedArtifacts[A].data,mo)}}function PsA(i,e){if(i&1){let A=aA();I(0,"div",21)(1,"mat-icon",23),D(2,"description"),h(),I(3,"a",24),U("click",function(){L(A);let n=p(2).$index,o=p();return G(o.openArtifact(o.selectedArtifacts[n].data,o.selectedArtifacts[n].mimeType))}),D(4," Preview in new tab "),h()()}}function jsA(i,e){if(i&1&&(I(0,"div",22)(1,"pre",25),D(2),h()()),i&2){let A=p(2).$index,t=p();Q(2),nA(t.getTextContent(t.selectedArtifacts[A].data))}}function VsA(i,e){if(i&1&&T(0,PsA,5,0,"div",21)(1,jsA,3,1,"div",22),i&2){let A=p().$index,t=p();O(t.selectedArtifacts[A].mimeType==="text/html"?0:1)}}function qsA(i,e){if(i&1){let A=aA();I(0,"div",1)(1,"div",2)(2,"div",3),T(3,FsA,2,0,"mat-icon",4)(4,LsA,2,0,"mat-icon",4)(5,GsA,2,0,"mat-icon",4)(6,TsA,2,1)(7,OsA,2,0,"mat-icon",4),I(8,"button",5),U("click",function(){let n=L(A).$index,o=p();return G(o.openArtifact(o.selectedArtifacts[n].data,o.selectedArtifacts[n].mimeType))}),I(9,"span",6),D(10),h(),I(11,"mat-icon",7),D(12,"open_in_new"),h()()(),I(13,"div",8)(14,"div",9)(15,"span",10),D(16,"Version:"),h(),I(17,"mat-select",11),Ni("ngModelChange",function(n){let o=L(A).$index,a=p();return wi(a.selectedArtifacts[o],n)||(a.selectedArtifacts[o]=n),G(n)}),U("selectionChange",function(n){let o=L(A).$index,a=p();return G(a.onArtifactVersionChange(n,o))}),ke(18,JsA,2,2,"mat-option",12,ni),h()(),I(20,"button",13),U("click",function(){let n=L(A).$index,o=p();return G(o.downloadArtifact(o.selectedArtifacts[n]))}),I(21,"mat-icon"),D(22,"file_download"),h()()()(),I(23,"div",14),T(24,YsA,2,1,"div",15)(25,HsA,2,1,"div",16)(26,zsA,2,1,"div",17)(27,VsA,2,1),h()()}if(i&2){let A,t,n=e.$implicit,o=e.$index,a=p();Q(3),O((A=a.selectedArtifacts[o].mediaType)===a.MediaType.IMAGE?3:A===a.MediaType.AUDIO?4:A===a.MediaType.VIDEO?5:A===a.MediaType.TEXT?6:7),Q(5),H("matTooltip","Open in new tab"),Q(2),nA(a.getArtifactName(n)),Q(7),Ri("ngModel",a.selectedArtifacts[o]),Q(),_e(a.getSortedArtifactsFromId(n)),Q(2),H("matTooltip","Download artifact"),Q(4),O((t=a.selectedArtifacts[o].mediaType)===a.MediaType.IMAGE?24:t===a.MediaType.AUDIO?25:t===a.MediaType.VIDEO?26:t===a.MediaType.TEXT?27:-1)}}var WsA="default_artifact_name",iC=(o=>(o.IMAGE="image",o.AUDIO="audio",o.VIDEO="video",o.TEXT="text",o.UNSPECIFIED="unspecified",o))(iC||{});function I6(i){let e=i.toLowerCase();for(let A of Object.values(iC))if(A!=="unspecified"&&e.startsWith(A+"/"))return A;return"unspecified"}function ZsA(i){return i?i.startsWith("image/"):!1}function XsA(i){return i?i.startsWith("audio/"):!1}var d6=class i{artifacts=ve([]);selectedArtifacts=[];isArtifactAudio=XsA;isArtifactImage=ZsA;MediaType=iC;downloadService=w(QB);dialog=w(Xa);safeValuesService=w(Qs);ngOnChanges(e){if(e.artifacts){this.selectedArtifacts=[];for(let A of this.getDistinctArtifactIds())this.selectedArtifacts.push(this.getSortedArtifactsFromId(A)[0])}}downloadArtifact(e){this.downloadService.downloadBase64Data(e.data,e.mimeType,e.id)}getArtifactName(e){return e??WsA}getDistinctArtifactIds(){return[...new Set(this.artifacts().map(e=>e.id))]}getSortedArtifactsFromId(e){return this.artifacts().filter(A=>A.id===e).sort((A,t)=>t.versionId-A.versionId)}getTextContent(e){if(!e)return"";let A=e.indexOf(",");if(A===-1)return"";let t=e.substring(A+1);try{return atob(t)}catch(n){return"Failed to decode text content"}}onArtifactVersionChange(e,A){this.selectedArtifacts[A]=e.value}openViewImageDialog(e){if(!e||!e.startsWith("data:")||e.indexOf(";base64,")===-1)return;let A=this.dialog.open(KB,{maxWidth:"90vw",maxHeight:"90vh",data:{imageData:e}})}openArtifact(e,A){this.openBase64InNewTab(e,A)}openBase64InNewTab(e,A){this.safeValuesService.openBase64InNewTab(e,A)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-artifact-tab"]],inputs:{artifacts:[1,"artifacts"]},features:[ii],decls:3,vars:0,consts:[[1,"artifact-container"],[1,"artifact-card"],[1,"artifact-card-header"],[1,"artifact-title-group"],[1,"artifact-icon"],[1,"artifact-title-link",3,"click","matTooltip"],[1,"title-text"],[1,"open-icon"],[1,"artifact-actions"],[1,"version-selector"],[1,"version-label"],["panelClass","compact-select-panel",1,"compact-select",3,"ngModelChange","selectionChange","ngModel"],[3,"value"],["mat-icon-button","",1,"compact-action-button",3,"click","matTooltip"],[1,"artifact-card-content"],[1,"preview-image-container"],[1,"preview-audio-container"],[1,"preview-video-container"],["alt","artifact.id",1,"preview-image",3,"click","src"],[3,"base64data"],["controls","",1,"preview-video",3,"src"],[1,"preview-html-container"],[1,"preview-text-container"],[1,"html-icon"],[1,"html-link",3,"click"],[1,"preview-text"]],template:function(A,t){A&1&&(I(0,"div",0),ke(1,qsA,28,6,"div",1,ni),h()),A&2&&(Q(),_e(t.getDistinctArtifactIds()))},dependencies:[ig,fn,Kn,Ho,Vr,yi,zt,GB,rn],styles:[".artifact-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;padding:8px}.artifact-card[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-low);border-radius:8px;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 2px 8px #0000001a}.artifact-card-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;padding:6px 12px;background-color:var(--mat-sys-surface-container);flex-wrap:wrap;gap:8px}.artifact-title-group[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;flex:1;min-width:200px}.artifact-icon[_ngcontent-%COMP%]{color:var(--mat-sys-primary);font-size:20px;width:20px;height:20px}.artifact-title-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;border:none;background:none;padding:0;font-family:inherit;color:var(--mat-sys-on-surface);cursor:pointer;max-width:250px}.artifact-title-link[_ngcontent-%COMP%]:hover{color:var(--mat-sys-primary);text-decoration:underline}.artifact-title-link[_ngcontent-%COMP%]:focus{outline:2px solid var(--mat-sys-primary);outline-offset:2px;border-radius:2px}.title-text[_ngcontent-%COMP%]{font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.open-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;flex-shrink:0}.artifact-actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.version-selector[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.version-label[_ngcontent-%COMP%]{font-size:12px;color:var(--mat-sys-on-surface-variant);font-weight:500}.compact-select[_ngcontent-%COMP%]{width:50px;font-size:10px}.compact-select[_ngcontent-%COMP%] .mat-mdc-select-trigger{padding:2px 4px}.compact-select[_ngcontent-%COMP%] .mat-mdc-select-value{font-size:10px} .compact-select-panel{font-size:10px!important} .compact-select-panel .mat-mdc-option{font-size:10px!important;min-height:28px!important;padding:0 8px!important} .compact-select-panel .mat-mdc-option-pseudo-checkbox{transform:scale(.7)!important}.compact-action-button[_ngcontent-%COMP%]{width:32px;height:32px;display:flex;justify-content:center;align-items:center}.compact-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.artifact-card-content[_ngcontent-%COMP%]{padding:8px 12px;background-color:var(--mat-sys-surface-container-lowest)}.preview-image-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center}.preview-image[_ngcontent-%COMP%]{max-width:100%;max-height:300px;border-radius:8px;cursor:pointer}.preview-audio-container[_ngcontent-%COMP%]{width:100%}.preview-video-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center}.preview-video[_ngcontent-%COMP%]{max-width:100%;border-radius:8px}.preview-html-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;justify-content:center;padding:20px}.html-icon[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.html-link[_ngcontent-%COMP%]{color:var(--mat-sys-primary);text-decoration:underline;cursor:pointer;font-weight:500;font-size:14px}.html-link[_ngcontent-%COMP%]:hover{color:var(--mat-sys-primary-dark)}.preview-text-container[_ngcontent-%COMP%]{max-height:200px;overflow-y:auto;background:var(--mat-sys-surface-container-highest);padding:12px;border-radius:8px}.preview-text[_ngcontent-%COMP%]{margin:0;white-space:pre-wrap;font-family:Roboto Mono,monospace;font-size:12px;color:var(--mat-sys-on-surface)}"]})};var $sA=["input"],AlA=["label"],elA=["*"],tM={color:"accent",clickAction:"check-indeterminate",disabledInteractive:!1},tlA=new MA("mat-checkbox-default-options",{providedIn:"root",factory:()=>tM}),fs=(function(i){return i[i.Init=0]="Init",i[i.Checked=1]="Checked",i[i.Unchecked=2]="Unchecked",i[i.Indeterminate=3]="Indeterminate",i})(fs||{}),iM=class{source;checked},ic=(()=>{class i{_elementRef=w(ce);_changeDetectorRef=w(Mt);_ngZone=w(We);_animationsDisabled=In();_options=w(tlA,{optional:!0});focus(){this._inputElement.nativeElement.focus()}_createChangeEvent(A){let t=new iM;return t.source=this,t.checked=A,t}_getAnimationTargetElement(){return this._inputElement?.nativeElement}_animationClasses={uncheckedToChecked:"mdc-checkbox--anim-unchecked-checked",uncheckedToIndeterminate:"mdc-checkbox--anim-unchecked-indeterminate",checkedToUnchecked:"mdc-checkbox--anim-checked-unchecked",checkedToIndeterminate:"mdc-checkbox--anim-checked-indeterminate",indeterminateToChecked:"mdc-checkbox--anim-indeterminate-checked",indeterminateToUnchecked:"mdc-checkbox--anim-indeterminate-unchecked"};ariaLabel="";ariaLabelledby=null;ariaDescribedby;ariaExpanded;ariaControls;ariaOwns;_uniqueId;id;get inputId(){return`${this.id||this._uniqueId}-input`}required=!1;labelPosition="after";name=null;change=new FA;indeterminateChange=new FA;value;disableRipple=!1;_inputElement;_labelElement;tabIndex;color;disabledInteractive;_onTouched=()=>{};_currentAnimationClass="";_currentCheckState=fs.Init;_controlValueAccessorChangeFn=()=>{};_validatorChangeFn=()=>{};constructor(){w(Eo).load(Qr);let A=w(new Ys("tabindex"),{optional:!0});this._options=this._options||tM,this.color=this._options.color||tM.color,this.tabIndex=A==null?0:parseInt(A)||0,this.id=this._uniqueId=w(Dn).getId("mat-mdc-checkbox-"),this.disabledInteractive=this._options?.disabledInteractive??!1}ngOnChanges(A){A.required&&this._validatorChangeFn()}ngAfterViewInit(){this._syncIndeterminate(this.indeterminate)}get checked(){return this._checked}set checked(A){A!=this.checked&&(this._checked=A,this._changeDetectorRef.markForCheck())}_checked=!1;get disabled(){return this._disabled}set disabled(A){A!==this.disabled&&(this._disabled=A,this._changeDetectorRef.markForCheck())}_disabled=!1;get indeterminate(){return this._indeterminate()}set indeterminate(A){let t=A!=this._indeterminate();this._indeterminate.set(A),t&&(A?this._transitionCheckState(fs.Indeterminate):this._transitionCheckState(this.checked?fs.Checked:fs.Unchecked),this.indeterminateChange.emit(A)),this._syncIndeterminate(A)}_indeterminate=mA(!1);_isRippleDisabled(){return this.disableRipple||this.disabled}_onLabelTextChange(){this._changeDetectorRef.detectChanges()}writeValue(A){this.checked=!!A}registerOnChange(A){this._controlValueAccessorChangeFn=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorChangeFn=A}_transitionCheckState(A){let t=this._currentCheckState,n=this._getAnimationTargetElement();if(!(t===A||!n)&&(this._currentAnimationClass&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(t,A),this._currentCheckState=A,this._currentAnimationClass.length>0)){n.classList.add(this._currentAnimationClass);let o=this._currentAnimationClass;this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{n.classList.remove(o)},1e3)})}}_emitChangeEvent(){this._controlValueAccessorChangeFn(this.checked),this.change.emit(this._createChangeEvent(this.checked)),this._inputElement&&(this._inputElement.nativeElement.checked=this.checked)}toggle(){this.checked=!this.checked,this._controlValueAccessorChangeFn(this.checked)}_handleInputClick(){let A=this._options?.clickAction;!this.disabled&&A!=="noop"?(this.indeterminate&&A!=="check"&&Promise.resolve().then(()=>{this._indeterminate.set(!1),this.indeterminateChange.emit(!1)}),this._checked=!this._checked,this._transitionCheckState(this._checked?fs.Checked:fs.Unchecked),this._emitChangeEvent()):(this.disabled&&this.disabledInteractive||!this.disabled&&A==="noop")&&(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate)}_onInteractionEvent(A){A.stopPropagation()}_onBlur(){Promise.resolve().then(()=>{this._onTouched(),this._changeDetectorRef.markForCheck()})}_getAnimationClassForCheckStateTransition(A,t){if(this._animationsDisabled)return"";switch(A){case fs.Init:if(t===fs.Checked)return this._animationClasses.uncheckedToChecked;if(t==fs.Indeterminate)return this._checked?this._animationClasses.checkedToIndeterminate:this._animationClasses.uncheckedToIndeterminate;break;case fs.Unchecked:return t===fs.Checked?this._animationClasses.uncheckedToChecked:this._animationClasses.uncheckedToIndeterminate;case fs.Checked:return t===fs.Unchecked?this._animationClasses.checkedToUnchecked:this._animationClasses.checkedToIndeterminate;case fs.Indeterminate:return t===fs.Checked?this._animationClasses.indeterminateToChecked:this._animationClasses.indeterminateToUnchecked}return""}_syncIndeterminate(A){let t=this._inputElement;t&&(t.nativeElement.indeterminate=A)}_onInputClick(){this._handleInputClick()}_onTouchTargetClick(){this._handleInputClick(),this.disabled||this._inputElement.nativeElement.focus()}_preventBubblingFromLabel(A){A.target&&this._labelElement.nativeElement.contains(A.target)&&A.stopPropagation()}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-checkbox"]],viewQuery:function(t,n){if(t&1&&Wt($sA,5)(AlA,5),t&2){let o;se(o=le())&&(n._inputElement=o.first),se(o=le())&&(n._labelElement=o.first)}},hostAttrs:[1,"mat-mdc-checkbox"],hostVars:16,hostBindings:function(t,n){t&2&&(Ma("id",n.id),ie("tabindex",null)("aria-label",null)("aria-labelledby",null),Ao(n.color?"mat-"+n.color:"mat-accent"),_A("_mat-animation-noopable",n._animationsDisabled)("mdc-checkbox--disabled",n.disabled)("mat-mdc-checkbox-disabled",n.disabled)("mat-mdc-checkbox-checked",n.checked)("mat-mdc-checkbox-disabled-interactive",n.disabledInteractive))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],ariaExpanded:[2,"aria-expanded","ariaExpanded",Qe],ariaControls:[0,"aria-controls","ariaControls"],ariaOwns:[0,"aria-owns","ariaOwns"],id:"id",required:[2,"required","required",Qe],labelPosition:"labelPosition",name:"name",value:"value",disableRipple:[2,"disableRipple","disableRipple",Qe],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?void 0:yn(A)],color:"color",disabledInteractive:[2,"disabledInteractive","disabledInteractive",Qe],checked:[2,"checked","checked",Qe],disabled:[2,"disabled","disabled",Qe],indeterminate:[2,"indeterminate","indeterminate",Qe]},outputs:{change:"change",indeterminateChange:"indeterminateChange"},exportAs:["matCheckbox"],features:[pt([{provide:cs,useExisting:Va(()=>i),multi:!0},{provide:Oc,useExisting:i,multi:!0}]),ii],ngContentSelectors:elA,decls:15,vars:23,consts:[["checkbox",""],["input",""],["label",""],["mat-internal-form-field","",3,"click","labelPosition"],[1,"mdc-checkbox"],["aria-hidden","true",1,"mat-mdc-checkbox-touch-target",3,"click"],["type","checkbox",1,"mdc-checkbox__native-control",3,"blur","click","change","checked","indeterminate","disabled","id","required","tabIndex"],["aria-hidden","true",1,"mdc-checkbox__ripple"],["aria-hidden","true",1,"mdc-checkbox__background"],["focusable","false","viewBox","0 0 24 24",1,"mdc-checkbox__checkmark"],["fill","none","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-checkbox__checkmark-path"],[1,"mdc-checkbox__mixedmark"],["mat-ripple","","aria-hidden","true",1,"mat-mdc-checkbox-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-label",3,"for"]],template:function(t,n){if(t&1&&(Ot(),I(0,"div",3),U("click",function(a){return n._preventBubblingFromLabel(a)}),I(1,"div",4,0)(3,"div",5),U("click",function(){return n._onTouchTargetClick()}),h(),I(4,"input",6,1),U("blur",function(){return n._onBlur()})("click",function(){return n._onInputClick()})("change",function(a){return n._onInteractionEvent(a)}),h(),lA(6,"div",7),I(7,"div",8),Et(),I(8,"svg",9),lA(9,"path",10),h(),hr(),lA(10,"div",11),h(),lA(11,"div",12),h(),I(12,"label",13,2),Ze(14),h()()),t&2){let o=Bi(2);H("labelPosition",n.labelPosition),Q(4),_A("mdc-checkbox--selected",n.checked),H("checked",n.checked)("indeterminate",n.indeterminate)("disabled",n.disabled&&!n.disabledInteractive)("id",n.inputId)("required",n.required)("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex),ie("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby)("aria-describedby",n.ariaDescribedby)("aria-checked",n.indeterminate?"mixed":null)("aria-controls",n.ariaControls)("aria-disabled",n.disabled&&n.disabledInteractive?!0:null)("aria-expanded",n.ariaExpanded)("aria-owns",n.ariaOwns)("name",n.name)("value",n.value),Q(7),H("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),Q(),H("for",n.inputId)}},dependencies:[Cs,C6],styles:[`.mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:18px;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2);margin:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox:hover>.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:hover>.mat-mdc-checkbox-ripple>.mat-ripple-element{background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mat-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mat-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mat-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mat-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mat-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control+.mdc-checkbox__ripple{background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control{position:absolute;margin:0;padding:0;opacity:0;cursor:inherit;z-index:1;width:var(--mat-checkbox-state-layer-size, 40px);height:var(--mat-checkbox-state-layer-size, 40px);top:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2);right:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2);left:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox--disabled{cursor:default;pointer-events:none}.mdc-checkbox__background{display:inline-flex;position:absolute;align-items:center;justify-content:center;box-sizing:border-box;width:18px;height:18px;border:2px solid currentColor;border-radius:2px;background-color:rgba(0,0,0,0);pointer-events:none;will-change:background-color,border-color;transition:background-color 90ms cubic-bezier(0.4, 0, 0.6, 1),border-color 90ms cubic-bezier(0.4, 0, 0.6, 1);-webkit-print-color-adjust:exact;color-adjust:exact;border-color:var(--mat-checkbox-unselected-icon-color, var(--mat-sys-on-surface-variant));top:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2);left:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2)}.mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled .mdc-checkbox__background{border-color:var(--mat-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{background-color:var(--mat-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}@media(forced-colors: active){.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:checked)~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mat-checkbox-unselected-hover-icon-color, var(--mat-sys-on-surface));background-color:rgba(0,0,0,0)}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-hover-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-hover-icon-color, var(--mat-sys-primary))}.mdc-checkbox__native-control:focus:focus:not(:checked)~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mat-checkbox-unselected-focus-icon-color, var(--mat-sys-on-surface))}.mdc-checkbox__native-control:focus:focus:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-focus-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-focus-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:var(--mat-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{background-color:var(--mat-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}.mdc-checkbox__checkmark{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;opacity:0;transition:opacity 180ms cubic-bezier(0.4, 0, 0.6, 1);color:var(--mat-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__checkmark{color:CanvasText}}.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:var(--mat-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:GrayText}}.mdc-checkbox__checkmark-path{transition:stroke-dashoffset 180ms cubic-bezier(0.4, 0, 0.6, 1);stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.7833385;stroke-dasharray:29.7833385}.mdc-checkbox__mixedmark{width:100%;height:0;transform:scaleX(0) rotate(0deg);border-width:1px;border-style:solid;opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1);border-color:var(--mat-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__mixedmark{margin:0 1px}}.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:var(--mat-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:GrayText}}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background,.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background,.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background,.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background{animation-duration:180ms;animation-timing-function:linear}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-unchecked-checked-checkmark-path 180ms linear;transition:none}.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-checked-unchecked-checkmark-path 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark{animation:mdc-checkbox-checked-indeterminate-checkmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-checked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark{animation:mdc-checkbox-indeterminate-checked-checkmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-checked-mixedmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear;transition:none}.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{transition:border-color 90ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path{stroke-dashoffset:0}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark{transition:opacity 180ms cubic-bezier(0, 0, 0.2, 1),transform 180ms cubic-bezier(0, 0, 0.2, 1);opacity:1}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(-45deg)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark{transform:rotate(45deg);opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(0deg);opacity:1}@keyframes mdc-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:29.7833385}50%{animation-timing-function:cubic-bezier(0, 0, 0.2, 1)}100%{stroke-dashoffset:0}}@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{transform:scaleX(1)}}@keyframes mdc-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(0.4, 0, 1, 1);opacity:1;stroke-dashoffset:0}to{opacity:0;stroke-dashoffset:-29.7833385}}@keyframes mdc-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(45deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(45deg);opacity:0}to{transform:rotate(360deg);opacity:1}}@keyframes mdc-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(-45deg);opacity:0}to{transform:rotate(0deg);opacity:1}}@keyframes mdc-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(315deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;transform:scaleX(1);opacity:1}32.8%,100%{transform:scaleX(0);opacity:0}}.mat-mdc-checkbox{display:inline-block;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-touch-target,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__native-control,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__ripple,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-ripple::before,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__mixedmark{transition:none !important;animation:none !important}.mat-mdc-checkbox label{cursor:pointer}.mat-mdc-checkbox .mat-internal-form-field{color:var(--mat-checkbox-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-checkbox-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-checkbox-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-checkbox-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-checkbox-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-checkbox-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive{pointer-events:auto}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive input{cursor:default}.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{cursor:default;color:var(--mat-checkbox-disabled-label-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{color:GrayText}}.mat-mdc-checkbox label:empty{display:none}.mat-mdc-checkbox .mdc-checkbox__ripple{opacity:0}.mat-mdc-checkbox .mat-mdc-checkbox-ripple,.mdc-checkbox__ripple{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-checkbox .mat-mdc-checkbox-ripple:not(:empty),.mdc-checkbox__ripple:not(:empty){transform:translateZ(0)}.mat-mdc-checkbox-ripple .mat-ripple-element{opacity:.1}.mat-mdc-checkbox-touch-target{position:absolute;top:50%;left:50%;height:var(--mat-checkbox-touch-target-size, 48px);width:var(--mat-checkbox-touch-target-size, 48px);transform:translate(-50%, -50%);display:var(--mat-checkbox-touch-target-display, block)}.mat-mdc-checkbox .mat-mdc-checkbox-ripple::before{border-radius:50%}.mdc-checkbox__native-control:focus-visible~.mat-focus-indicator::before{content:""} -`],encapsulation:2,changeDetection:0})}return i})(),uO=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[ic,Di]})}return i})();var pO=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({})}return i})();var fO=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[pO,Wc,Di]})}return i})();var nlA={google_search:"search",EnterpriseWebSearchTool:"web",VertexAiSearchTool:"search",FilesRetrieval:"find_in_page",load_memory:"memory",preload_memory:"memory",url_context:"link",VertexAiRagRetrieval:"find_in_page",exit_loop:"sync",get_user_choice:"how_to_reg",load_artifacts:"image",LongRunningFunctionTool:"data_object"};function UB(i,e){return e==="Agent Tool"?"smart_toy":e==="Built-in tool"?nlA[i]||"build":e==="Function tool"?"data_object":"build"}var nc=class i{static toolMenuTooltips=new Map([["Function tool","Build custom tools for your specific ADK agent needs."],["Built-in tool","Ready-to-use functionality such as Google Search or code executors that provide agents with common capabilities. "],["Agent tool","A sub-agent that can be invoked as a tool by another agent."]]);static toolDetailedInfo=new Map([["Function tool",{shortDescription:"Build custom tools for your specific ADK agent needs.",detailedDescription:"The ADK framework automatically inspects your Python function's signature\u2014including its name, docstring, parameters, type hints, and default values\u2014to generate a schema. This schema is what the LLM uses to understand the tool's purpose, when to use it, and what arguments it requires.",docLink:"https://google.github.io/adk-docs/tools/function-tools/"}],["Agent tool",{shortDescription:"Wraps a sub-agent as a callable tool, enabling modular and hierarchical agent architectures.",detailedDescription:"Agent tools allow you to use one agent as a tool within another agent, creating powerful multi-agent workflows.",docLink:"https://google.github.io/adk-docs/agents/multi-agents/#c-explicit-invocation-agenttool"}]]);static callbackMenuTooltips=new Map([["before_agent","Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed."],["after_agent","Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes."],["before_model","Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow."],["after_model","Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent."],["before_tool","Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it."],["after_tool","Called just after the tool's run_async method completes successfully."]]);static callbackDialogTooltips=new Map([["before_agent","Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed."],["after_agent","Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes."],["before_model","Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow."],["after_model","Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent."],["before_tool","Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it."],["after_tool","Called just after the tool's run_async method completes successfully."]]);static callbackDetailedInfo=new Map([["before_agent",{shortDescription:"Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed. It runs after the agent's InvocationContext is created but before its core logic begins.",detailedDescription:" Ideal for setting up resources or state needed only for this specific agent's run, performing validation checks on the session state (callback_context.state) before execution starts, logging the entry point of the agent's activity, or potentially modifying the invocation context before the core logic uses it.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-agent-callback"}],["after_agent",{shortDescription:"Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes.",detailedDescription:"Useful for cleanup tasks, post-execution validation, logging the completion of an agent's activity, modifying final state, or augmenting/replacing the agent's final output.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-agent-callback"}],["before_model",{shortDescription:"Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow.",detailedDescription:"Allows inspection and modification of the request going to the LLM. Use cases include adding dynamic instructions, injecting few-shot examples based on state, modifying model config, implementing guardrails (like profanity filters), or implementing request-level caching.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-model-callback"}],["after_model",{shortDescription:"Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent.",detailedDescription:"Allows inspection or modification of the raw LLM response.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-model-callback"}],["before_tool",{shortDescription:"Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it.",detailedDescription:"Allows inspection and modification of tool arguments, performing authorization checks before execution, logging tool usage attempts, or implementing tool-level caching.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-tool-callback"}],["after_tool",{shortDescription:"Called just after the tool's run_async method completes successfully.",detailedDescription:"Allows inspection and modification of the tool's result before it's sent back to the LLM (potentially after summarization). Useful for logging tool results, post-processing or formatting results, or saving specific parts of the result to the session state.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-tool-callback"}]]);static getToolMenuTooltips(e){return i.toolMenuTooltips.get(e)}static getToolDetailedInfo(e){return i.toolDetailedInfo.get(e)}static getCallbackMenuTooltips(e){return i.callbackMenuTooltips.get(e)}static getCallbackDialogTooltips(e){return i.callbackDialogTooltips.get(e)}static getCallbackDetailedInfo(e){return i.callbackDetailedInfo.get(e)}};var olA=["callbackNameInput"];function alA(i,e){if(i&1){let A=aA();vl(0),I(1,"div",8)(2,"div",9),U("click",function(){L(A);let n=p();return G(n.toggleCallbackInfo())}),I(3,"mat-icon",10),D(4,"info"),h(),I(5,"div",11)(6,"span"),D(7,"Callback Information"),h()(),I(8,"button",12)(9,"mat-icon"),D(10),h()()(),I(11,"div",13)(12,"div",14)(13,"div",15),D(14),h(),I(15,"div",16),D(16),h()(),I(17,"div",17)(18,"a",18)(19,"mat-icon"),D(20,"open_in_new"),h(),I(21,"span"),D(22,"View Official Documentation"),h()()()()(),bl()}if(i&2){let A,t,n,o=p();Q(10),nA(o.isCallbackInfoExpanded?"expand_less":"expand_more"),Q(),_A("expanded",o.isCallbackInfoExpanded),Q(3),nA((A=o.getCallbackInfo())==null?null:A.shortDescription),Q(2),nA((t=o.getCallbackInfo())==null?null:t.detailedDescription),Q(2),H("href",(n=o.getCallbackInfo())==null?null:n.docLink,mo)}}function rlA(i,e){if(i&1&&(I(0,"mat-option",21),D(1),h()),i&2){let A=e.$implicit;H("value",A),Q(),nA(A)}}function slA(i,e){if(i&1){let A=aA();vl(0),I(1,"mat-form-field",3)(2,"mat-label"),D(3,"Callback Type"),h(),I(4,"mat-select",19),Ni("ngModelChange",function(n){L(A);let o=p();return wi(o.callbackType,n)||(o.callbackType=n),G(n)}),kt(5,rlA,2,2,"mat-option",20),h()(),bl()}if(i&2){let A=p();Q(4),Ri("ngModel",A.callbackType),Q(),H("ngForOf",A.availableCallbackTypes)}}function llA(i,e){i&1&&(I(0,"mat-error"),D(1,"Same callback name has been used"),h())}function glA(i,e){i&1&&(I(0,"mat-error"),D(1,"Cannot have callback consist of two words"),h())}function clA(i,e){i&1&&(I(0,"mat-error"),D(1,"Callback function names cannot have spaces"),h())}var nM=class{isErrorState(e){return!!(e&&e.invalid)}},Mu=class i{constructor(e,A){this.dialogRef=e;this.data=A;this.callbackType=A?.callbackType??"",this.existingCallbackNames=A?.existingCallbackNames??[],this.isEditMode=!!A?.isEditMode,this.availableCallbackTypes=A?.availableCallbackTypes??[],this.isEditMode&&A?.callback&&(this.callbackName=A.callback.name,this.callbackType=A.callback.type,this.originalCallbackName=A.callback.name,this.existingCallbackNames=this.existingCallbackNames.filter(t=>t!==this.originalCallbackName))}callbackNameInput;callbackName="";callbackType="";existingCallbackNames=[];matcher=new nM;isEditMode=!1;availableCallbackTypes=[];originalCallbackName="";isCallbackInfoExpanded=!1;addCallback(){if(!this.callbackName.trim()||this.hasSpaces()||this.isDuplicateName())return;let e={name:this.callbackName.trim(),type:this.callbackType,isEditMode:this.isEditMode,originalName:this.originalCallbackName||this.callbackName.trim()};this.dialogRef.close(e)}cancel(){this.dialogRef.close()}isDuplicateName(){if(!Array.isArray(this.existingCallbackNames))return!1;let e=(this.callbackName||"").trim();return this.existingCallbackNames.includes(e)}hasSpaces(){return/\s/.test(this.callbackName||"")}createDisabled(){return!this.callbackName.trim()||this.isDuplicateName()||this.hasSpaces()}validate(){this.hasSpaces()?this.callbackNameInput.control.setErrors({hasSpaces:!0}):this.isDuplicateName()?this.callbackNameInput.control.setErrors({duplicateName:!0}):this.callbackNameInput.control.setErrors(null)}getCallbackInfo(){return nc.getCallbackDetailedInfo(this.callbackType)}toggleCallbackInfo(){this.isCallbackInfoExpanded=!this.isCallbackInfoExpanded}static \u0275fac=function(A){return new(A||i)(st(zn),st(Do))};static \u0275cmp=vA({type:i,selectors:[["app-add-callback-dialog"]],viewQuery:function(A,t){if(A&1&&Wt(olA,5),A&2){let n;se(n=le())&&(t.callbackNameInput=n.first)}},decls:18,vars:10,consts:[["callbackNameInput","ngModel"],["mat-dialog-title",""],[4,"ngIf"],[2,"width","100%"],["matInput","",3,"ngModelChange","keydown.enter","ngModel","errorStateMatcher"],["align","end"],["mat-button","",3,"click"],["mat-raised-button","","color","secondary",3,"click","disabled"],[1,"callback-info-container"],[1,"callback-info-header",3,"click"],[1,"callback-info-icon"],[1,"callback-info-title"],["mat-icon-button","","type","button","aria-label","Toggle callback information",1,"callback-info-toggle"],[1,"callback-info-body"],[1,"callback-info-content"],[1,"callback-info-short"],[1,"callback-info-detailed"],[1,"callback-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"callback-info-link",3,"href"],[3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]],template:function(A,t){if(A&1){let n=aA();I(0,"h2",1),D(1),h(),I(2,"mat-dialog-content"),kt(3,alA,23,6,"ng-container",2)(4,slA,6,2,"ng-container",2),I(5,"mat-form-field",3)(6,"mat-label"),D(7,"Callback Name"),h(),I(8,"input",4,0),Ni("ngModelChange",function(a){return L(n),wi(t.callbackName,a)||(t.callbackName=a),G(a)}),U("ngModelChange",function(){return t.validate()})("keydown.enter",function(){return t.addCallback()}),h(),kt(10,llA,2,0,"mat-error",2)(11,glA,2,0,"mat-error",2)(12,clA,2,0,"mat-error",2),h()(),I(13,"mat-dialog-actions",5)(14,"button",6),U("click",function(){return t.cancel()}),D(15,"Cancel"),h(),I(16,"button",7),U("click",function(){return t.addCallback()}),D(17),h()()}if(A&2){let n=Bi(9);Q(),nA(t.isEditMode?"Edit Callback":"Add "+t.callbackType+" Callback"),Q(2),H("ngIf",t.getCallbackInfo()),Q(),H("ngIf",t.isEditMode),Q(4),Ri("ngModel",t.callbackName),H("errorStateMatcher",t.matcher),Q(2),H("ngIf",n.hasError("duplicateName")),Q(),H("ngIf",n.hasError("hasSpaces")),Q(),H("ngIf",n.hasError("hasSpaces")),Q(4),H("disabled",t.createDisabled()),Q(),Ee(" ",t.isEditMode?"Save":"Add"," ")}},dependencies:[li,DI,ql,fn,Gn,Kn,Ho,Ls,Xo,ha,Ba,qi,ki,yi,Za,Zo,xs,xv,Ws,ka,W0,ig,Vr,Un,zt],styles:[".callback-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;min-width:400px;max-width:600px}.full-width[_ngcontent-%COMP%]{width:100%}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}mat-dialog-actions[_ngcontent-%COMP%]{padding:16px 24px;margin:0}mat-form-field[_ngcontent-%COMP%]{margin-top:8px!important}.callback-info-container[_ngcontent-%COMP%]{border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.callback-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.callback-info-header[_ngcontent-%COMP%]:hover .callback-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.callback-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.callback-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.callback-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.callback-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.callback-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.callback-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.callback-info-content[_ngcontent-%COMP%]{flex:1}.callback-info-short[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-dialog-content-text-color);margin-bottom:8px;line-height:1.4}.callback-info-detailed[_ngcontent-%COMP%]{color:var(--mat-dialog-content-text-color);font-size:14px;line-height:1.5;opacity:.8}.callback-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.callback-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.callback-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.callback-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};function ClA(i,e){if(i&1){let A=aA();vl(0),I(1,"div",6)(2,"div",7),U("click",function(){L(A);let n=p();return G(n.toggleToolInfo())}),I(3,"mat-icon",8),D(4,"info"),h(),I(5,"div",9)(6,"span"),D(7,"Tool Information"),h()(),I(8,"button",10)(9,"mat-icon"),D(10),h()()(),I(11,"div",11)(12,"div",12)(13,"div",13),D(14),h(),I(15,"div",14),D(16),h()(),I(17,"div",15)(18,"a",16)(19,"mat-icon"),D(20,"open_in_new"),h(),I(21,"span"),D(22,"View Official Documentation"),h()()()()(),bl()}if(i&2){let A,t,n,o=p();Q(10),nA(o.isToolInfoExpanded?"expand_less":"expand_more"),Q(),_A("expanded",o.isToolInfoExpanded),Q(3),nA((A=o.getToolInfo())==null?null:A.shortDescription),Q(2),nA((t=o.getToolInfo())==null?null:t.detailedDescription),Q(2),H("href",(n=o.getToolInfo())==null?null:n.docLink,mo)}}function dlA(i,e){if(i&1){let A=aA();I(0,"mat-form-field",2)(1,"input",17),Ni("ngModelChange",function(n){L(A);let o=p();return wi(o.toolName,n)||(o.toolName=n),G(n)}),U("keydown.enter",function(){L(A);let n=p();return G(n.addTool())}),h()()}if(i&2){let A=p();Q(),Ri("ngModel",A.toolName)}}function IlA(i,e){if(i&1&&(I(0,"mat-option",20),D(1),h()),i&2){let A=e.$implicit;H("value",A),Q(),Ee(" ",A," ")}}function BlA(i,e){if(i&1){let A=aA();I(0,"mat-form-field",2)(1,"mat-select",18),Ni("ngModelChange",function(n){L(A);let o=p();return wi(o.selectedBuiltInTool,n)||(o.selectedBuiltInTool=n),G(n)}),kt(2,IlA,2,2,"mat-option",19),h()()}if(i&2){let A=p();Q(),Ri("ngModel",A.selectedBuiltInTool),Q(),H("ngForOf",A.builtInTools)}}var Q2=class i{constructor(e,A){this.data=e;this.dialogRef=A}toolName="";toolType="Function tool";selectedBuiltInTool="google_search";builtInTools=["EnterpriseWebSearchTool","exit_loop","FilesRetrieval","get_user_choice","google_search","load_artifacts","load_memory","LongRunningFunctionTool","preload_memory","url_context","VertexAiRagRetrieval","VertexAiSearchTool"];isEditMode=!1;isToolInfoExpanded=!1;ngOnInit(){this.toolType=this.data.toolType,this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName&&(this.toolType==="Function tool"?this.toolName=this.data.toolName:this.toolType==="Built-in tool"&&(this.selectedBuiltInTool=this.data.toolName))}addTool(){if(this.toolType==="Function tool"&&!this.toolName.trim())return;let e={toolType:this.toolType,isEditMode:this.isEditMode};this.toolType==="Function tool"?e.name=this.toolName.trim():this.toolType==="Built-in tool"&&(e.name=this.selectedBuiltInTool),this.dialogRef.close(e)}cancel(){this.dialogRef.close()}createDisabled(){return this.toolType==="Function tool"&&!this.toolName.trim()}getToolInfo(){return nc.getToolDetailedInfo(this.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \u0275fac=function(A){return new(A||i)(st(Do),st(zn))};static \u0275cmp=vA({type:i,selectors:[["app-add-tool-dialog"]],decls:11,vars:6,consts:[["mat-dialog-title","",1,"dialog-title"],[4,"ngIf"],[2,"width","100%"],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click","disabled"],[1,"tool-info-container"],[1,"tool-info-header",3,"click"],[1,"tool-info-icon"],[1,"tool-info-title"],["mat-icon-button","","type","button","aria-label","Toggle tool information",1,"tool-info-toggle"],[1,"tool-info-body"],[1,"tool-info-content"],[1,"tool-info-short"],[1,"tool-info-detailed"],[1,"tool-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"tool-info-link",3,"href"],["matInput","","placeholder","Enter full function name",3,"ngModelChange","keydown.enter","ngModel"],["placeholder","Select built-in tool",3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]],template:function(A,t){A&1&&(I(0,"h2",0),D(1),h(),I(2,"mat-dialog-content"),kt(3,ClA,23,6,"ng-container",1),T(4,dlA,2,1,"mat-form-field",2),T(5,BlA,3,2,"mat-form-field",2),h(),I(6,"mat-dialog-actions",3)(7,"button",4),U("click",function(){return t.cancel()}),D(8,"Cancel"),h(),I(9,"button",5),U("click",function(){return t.addTool()}),D(10),h()()),A&2&&(Q(),nA(t.isEditMode?"Editing Tool":"Add New Tool"),Q(2),H("ngIf",t.getToolInfo()),Q(),O(t.toolType==="Function tool"?4:-1),Q(),O(t.toolType==="Built-in tool"?5:-1),Q(4),H("disabled",t.createDisabled()),Q(),Ee(" ",t.isEditMode?"Save":"Create"," "))},dependencies:[li,DI,ql,fn,Gn,Kn,Ho,Xo,Ba,Zo,ka,ig,Vr,ha,ki,yi,zt],styles:[".dialog-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;font-family:Google Sans;font-size:24px}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}.tool-info-container[_ngcontent-%COMP%]{border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:#e3e3e3;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:#c4c7ca;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};function sa(i){return Array.isArray(i)}function Ea(i){return i!==null&&typeof i=="object"&&(i.constructor===void 0||i.constructor.name==="Object")}function oM(i){return i&&typeof i=="object"?i.op==="add":!1}function aM(i){return i&&typeof i=="object"?i.op==="remove":!1}function B6(i){return i&&typeof i=="object"?i.op==="replace":!1}function h6(i){return i&&typeof i=="object"?i.op==="copy":!1}function u2(i){return i&&typeof i=="object"?i.op==="move":!1}function mO(i,e){return JSON.stringify(i)===JSON.stringify(e)}function hlA(i,e){return i===e}function rM(i){return i.slice(0,i.length-1)}function wO(i){return i[i.length-1]}function yO(i,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:hlA;if(i.length{e[A]=i[A]}),e}if(Ea(i)){let e=P({},i);return Object.getOwnPropertySymbols(i).forEach(A=>{e[A]=i[A]}),e}return i}function gM(i,e,A){if(i[e]===A)return i;let t=lM(i);return t[e]=A,t}function $e(i,e){let A=i,t=0;for(;t3&&arguments[3]!==void 0?arguments[3]:!1;if(e.length===0)return A;let n=e[0],o=qr(i?i[n]:void 0,e.slice(1),A,t);if(Ea(i)||sa(i))return gM(i,n,o);if(t){let a=ElA.test(n)?[]:{};return a[n]=o,a}throw new Error("Path does not exist")}var ElA=/^\d+$/;function Su(i,e,A){if(e.length===0)return A(i);if(!sM(i))throw new Error("Path doesn't exist");let t=e[0],n=Su(i[t],e.slice(1),A);return gM(i,t,n)}function cd(i,e){if(e.length===0)return i;if(!sM(i))throw new Error("Path does not exist");if(e.length===1){let n=e[0];if(!(n in i))return i;let o=lM(i);return sa(o)&&o.splice(Number.parseInt(n),1),Ea(o)&&delete o[n],o}let A=e[0],t=cd(i[A],e.slice(1));return gM(i,A,t)}function ku(i,e,A){let t=e.slice(0,e.length-1),n=e[e.length-1];return Su(i,t,o=>{if(!Array.isArray(o))throw new TypeError(`Array expected at path ${JSON.stringify(t)}`);let a=lM(o);return a.splice(Number.parseInt(n),0,A),a})}function Fr(i,e){return i===void 0?!1:e.length===0?!0:i===null?!1:Fr(i[e[0]],e.slice(1))}function ms(i){let e=i.split("/");return e.shift(),e.map(A=>A.replace(/~1/g,"/").replace(/~0/g,"~"))}function xt(i){return i.map(DO).join("")}function DO(i){return`/${String(i).replace(/~/g,"~0").replace(/\//g,"~1")}`}function _u(i,e){return i+DO(e)}function ol(i,e,A){let t=i;for(let n=0;n{let r,s=al(o,a.path);if(a.op==="add")r=MO(o,s);else if(a.op==="remove")r=bO(o,s);else if(a.op==="replace")r=vO(o,s);else if(a.op==="copy")r=vlA(o,s);else if(a.op==="move")r=blA(o,s,xu(a.from));else if(a.op==="test")r=[];else throw new Error(`Unknown JSONPatch operation ${JSON.stringify(a)}`);let l;if(A?.before){let g=A.before(o,a,r);if(g?.revertOperations&&(r=g.revertOperations),g?.document&&(l=g.document),g?.json)throw new Error('Deprecation warning: returned object property ".json" has been renamed to ".document"')}if(t=r.concat(t),l!==void 0)return{document:l}}}),t}function vO(i,e){return Fr(i,e)?[{op:"replace",path:xt(e),value:$e(i,e)}]:[]}function bO(i,e){return[{op:"add",path:xt(e),value:$e(i,e)}]}function MO(i,e){return TB(i,e)||!Fr(i,e)?[{op:"remove",path:xt(e)}]:vO(i,e)}function vlA(i,e){return MO(i,e)}function blA(i,e,A){if(e.length="0"&&i<="9"}function xO(i){return i>=" "}function Ru(i){return`,:[]/{}() -+`.includes(i)}function dM(i){return i>="a"&&i<="z"||i>="A"&&i<="Z"||i==="_"||i==="$"}function IM(i){return i>="a"&&i<="z"||i>="A"&&i<="Z"||i==="_"||i==="$"||i>="0"&&i<="9"}var BM=/^(http|https|ftp|mailto|file|data|irc):\/\/$/,hM=/^[A-Za-z0-9-._~:/?#@!$&'()*+;=]$/;function EM(i){return`,[]/{} -+`.includes(i)}function QM(i){return Nu(i)||KlA.test(i)}var KlA=/^[[{\w-]$/;function RO(i){return i===` -`||i==="\r"||i===" "||i==="\b"||i==="\f"}function p2(i,e){let A=i.charCodeAt(e);return A===32||A===10||A===9||A===13}function NO(i,e){let A=i.charCodeAt(e);return A===32||A===9||A===13}function FO(i,e){let A=i.charCodeAt(e);return A===160||A===6158||A>=8192&&A<=8203||A===8239||A===8287||A===12288||A===65279}function Nu(i){return uM(i)||p6(i)}function uM(i){return i==='"'||i==="\u201C"||i==="\u201D"}function pM(i){return i==='"'}function p6(i){return i==="'"||i==="\u2018"||i==="\u2019"||i==="`"||i==="\xB4"}function fM(i){return i==="'"}function OB(i,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,t=i.lastIndexOf(e);return t!==-1?i.substring(0,t)+(A?"":i.substring(t+1)):i}function lg(i,e){let A=i.length;if(!p2(i,A-1))return i+e;for(;p2(i,A-1);)A--;return i.substring(0,A)+e+i.substring(A)}function LO(i,e,A){return i.substring(0,e)+i.substring(e+A)}function GO(i){return/[,\n][ \t\r]*$/.test(i)}var UlA={"\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},TlA={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:` -`,r:"\r",t:" "};function gg(i){let e=0,A="";l(["```","[```","{```"]),o()||wA(),l(["```","```]","```}"]);let n=C(",");for(n&&a(),QM(i[e])&&GO(A)?(n||(A=lg(A,",")),m()):n&&(A=OB(A,","));i[e]==="}"||i[e]==="]";)e++,a();if(e>=i.length)return A;CA();function o(){a();let dA=E()||f()||v()||k()||M()||F(!1)||z();return a(),dA}function a(){let dA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,IA=e,xA=r(dA);do xA=s(),xA&&(xA=r(dA));while(xA);return e>IA}function r(dA){let IA=dA?p2:NO,xA="";for(;;)if(IA(i,e))xA+=i[e],e++;else if(FO(i,e))xA+=" ",e++;else break;return xA.length>0?(A+=xA,!0):!1}function s(){if(i[e]==="/"&&i[e+1]==="*"){for(;e=i.length;qA||(QM(i[e])||ue?A=lg(A,":"):QA()),o()||(qA||ue?A+="null":QA())}return i[e]==="}"?(A+="}",e++):A=lg(A,"}"),!0}return!1}function f(){if(i[e]==="["){A+="[",e++,a(),d(",")&&a();let dA=!0;for(;e0&&arguments[0]!==void 0?arguments[0]:!1,IA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:-1,xA=i[e]==="\\";if(xA&&(e++,xA=!0),Nu(i[e])){let qA=pM(i[e])?pM:fM(i[e])?fM:p6(i[e])?p6:uM,ue=e,HA=A.length,bA='"';for(e++;;){if(e>=i.length){let PA=j(e-1);return!dA&&Ru(i.charAt(PA))?(e=ue,A=A.substring(0,HA),v(!0)):(bA=lg(bA,'"'),A+=bA,!0)}if(e===IA)return bA=lg(bA,'"'),A+=bA,!0;if(qA(i[e])){let PA=e,it=bA.length;if(bA+='"',e++,A+=bA,a(!1),dA||e>=i.length||Ru(i[e])||Nu(i[e])||f2(i[e]))return S(),!0;let Xe=j(PA-1),YA=i.charAt(Xe);if(YA===",")return e=ue,A=A.substring(0,HA),v(!1,Xe);if(Ru(YA))return e=ue,A=A.substring(0,HA),v(!0);A=A.substring(0,HA),e=PA+1,bA=`${bA.substring(0,it)}\\${bA.substring(it)}`}else if(dA&&EM(i[e])){if(i[e-1]===":"&&BM.test(i.substring(ue+1,e+2)))for(;e=i.length?e=i.length:RA()}else bA+=PA,e+=2}else{let PA=i.charAt(e);PA==='"'&&i[e-1]!=="\\"?(bA+=`\\${PA}`,e++):RO(PA)?(bA+=UlA[PA],e++):(xO(PA)||Z(PA),bA+=PA,e++)}xA&&B()}}return!1}function S(){let dA=!1;for(a();i[e]==="+";){dA=!0,e++,a(),A=OB(A,'"',!0);let IA=A.length;v()?A=LO(A,IA,1):A=lg(A,'"')}return dA}function k(){let dA=e;if(i[e]==="-"){if(e++,X())return eA(dA),!0;if(!f2(i[e]))return e=dA,!1}for(;f2(i[e]);)e++;if(i[e]==="."){if(e++,X())return eA(dA),!0;if(!f2(i[e]))return e=dA,!1;for(;f2(i[e]);)e++}if(i[e]==="e"||i[e]==="E"){if(e++,(i[e]==="-"||i[e]==="+")&&e++,X())return eA(dA),!0;if(!f2(i[e]))return e=dA,!1;for(;f2(i[e]);)e++}if(!X())return e=dA,!1;if(e>dA){let IA=i.slice(dA,e),xA=/^0\d/.test(IA);return A+=xA?`"${IA}"`:IA,!0}return!1}function M(){return x("true","true")||x("false","false")||x("null","null")||x("True","true")||x("False","false")||x("None","null")}function x(dA,IA){return i.slice(e,e+dA.length)===dA?(A+=IA,e+=dA.length,!0):!1}function F(dA){let IA=e;if(dM(i[e])){for(;eIA){for(;p2(i,e-1)&&e>0;)e--;let xA=i.slice(IA,e);return A+=xA==="undefined"?"null":JSON.stringify(xA),i[e]==='"'&&e++,!0}}function z(){if(i[e]==="/"){let dA=e;for(e++;e0&&p2(i,IA);)IA--;return IA}function X(){return e>=i.length||Ru(i[e])||p2(i,e)}function eA(dA){A+=`${i.slice(dA,e)}0`}function Z(dA){throw new nC(`Invalid character ${JSON.stringify(dA)}`,e)}function CA(){throw new nC(`Unexpected character ${JSON.stringify(i[e])}`,e)}function wA(){throw new nC("Unexpected end of json string",i.length)}function BA(){throw new nC("Object key expected",e)}function QA(){throw new nC("Colon expected",e)}function RA(){let dA=i.slice(e,e+6);throw new nC(`Invalid unicode character "${dA}"`,e)}}function OlA(i,e){return i[e]==="*"&&i[e+1]==="/"}var m2=i=>Array.isArray(i),JlA=i=>i!==null&&typeof i=="object"&&!m2(i),YlA=i=>typeof i=="string",Cd=(i,e)=>i===e?!0:i!==null&&e!==null&&typeof i=="object"&&typeof e=="object"&&Object.keys(i).length===Object.keys(e).length&&Object.entries(i).every(([A,t])=>Cd(t,e[A])),KO=(i,e)=>{let A=i?.[e];if(A!==void 0){if(!Object.hasOwn(i,e)||Array.isArray(i)&&!/^\d+$/.test(e)||typeof i!="object")throw new TypeError(`Unsupported property "${e}"`);return A}};function Ar(i){return(...e)=>{let A=e.map(o=>er(o)),t=A[0],n=A[1];return A.length===1?o=>i(t(o)):A.length===2?o=>i(t(o),n(o)):o=>i(...A.map(a=>a(o)))}}var Gu={boolean:0,number:1,string:2},UO=3,JO=(i,e)=>typeof i==typeof e&&typeof i in Gu?i>e:!1,HlA=(i,e)=>Cd(i,e)||JO(i,e),YO=(i,e)=>typeof i==typeof e&&typeof i in Gu?iCd(i,e)||YO(i,e),Lu={pipe:(...i)=>{let e=i.map(A=>er(A));return A=>e.reduce((t,n)=>n(t),A)},object:i=>{let e=Object.keys(i).map(A=>[A,er(i[A])]);return A=>{let t={};for(let[n,o]of e)t[n]=o(A);return t}},array:(...i)=>{let e=i.map(A=>er(A));return A=>e.map(t=>t(A))},get:(...i)=>{if(i.length===0)return e=>e??null;if(i.length===1){let e=i[0];return A=>KO(A,e)??null}return e=>{let A=e;for(let t of i)A=KO(A,t);return A??null}},map:i=>{let e=er(i);return A=>A.map(e)},mapObject:i=>{let e=er(i);return A=>{let t={};for(let n of Object.keys(A)){let o=e({key:n,value:A[n]});t[o.key]=o.value}return t}},mapKeys:i=>{let e=er(i);return A=>{let t={};for(let n of Object.keys(A)){let o=e(n);t[o]=A[n]}return t}},mapValues:i=>{let e=er(i);return A=>{let t={};for(let n of Object.keys(A))t[n]=e(A[n]);return t}},filter:i=>{let e=er(i);return A=>A.filter(t=>TO(e(t)))},sort:(i=["get"],e)=>{let A=er(i),t=e==="desc"?-1:1;function n(o,a){let r=A(o),s=A(a);if(typeof r!=typeof s){let l=Gu[typeof r]??UO,g=Gu[typeof s]??UO;return l>g?t:ls?t:ro.slice().sort(n)},reverse:()=>i=>i.toReversed(),pick:(...i)=>{let e=i.map(([t,...n])=>[n[n.length-1],Lu.get(...n)]),A=(t,n)=>{let o={};for(let[a,r]of n)o[a]=r(t);return o};return t=>m2(t)?t.map(n=>A(n,e)):A(t,e)},groupBy:i=>{let e=er(i);return A=>{let t={};for(let n of A){let o=e(n);t[o]?t[o].push(n):t[o]=[n]}return t}},keyBy:i=>{let e=er(i);return A=>{let t={};for(let n of A){let o=e(n);o in t||(t[o]=n)}return t}},flatten:()=>i=>i.flat(),join:(i="")=>e=>e.join(i),split:Ar((i,e)=>e!==void 0?i.split(e):i.trim().split(/\s+/)),substring:Ar((i,e,A)=>i.slice(Math.max(e,0),A)),uniq:()=>i=>{let e=[];for(let A of i)e.findIndex(t=>Cd(t,A))===-1&&e.push(A);return e},uniqBy:i=>e=>Object.values(Lu.keyBy(i)(e)),limit:i=>e=>e.slice(0,Math.max(i,0)),size:()=>i=>i.length,keys:()=>Object.keys,values:()=>Object.values,prod:()=>i=>Fu(i,(e,A)=>e*A),sum:()=>i=>m2(i)?i.reduce((e,A)=>e+A,0):mM(),average:()=>i=>m2(i)?i.length>0?i.reduce((e,A)=>e+A)/i.length:null:mM(),min:()=>i=>Fu(i,(e,A)=>Math.min(e,A)),max:()=>i=>Fu(i,(e,A)=>Math.max(e,A)),and:Ar((...i)=>Fu(i,(e,A)=>!!(e&&A))),or:Ar((...i)=>Fu(i,(e,A)=>!!(e||A))),not:Ar(i=>!i),exists:i=>{let e=i.slice(1),A=e.pop(),t=Lu.get(...e);return n=>{let o=t(n);return!!o&&Object.hasOwnProperty.call(o,A)}},if:(i,e,A)=>{let t=er(i),n=er(e),o=er(A);return a=>TO(t(a))?n(a):o(a)},in:(i,e)=>{let A=er(i),t=er(e);return n=>{let o=A(n);return t(n).findIndex(a=>Cd(a,o))!==-1}},"not in":(i,e)=>{let A=Lu.in(i,e);return t=>!A(t)},regex:(i,e,A)=>{let t=new RegExp(e,A),n=er(i);return o=>t.test(n(o))},match:(i,e,A)=>{let t=new RegExp(e,A),n=er(i);return o=>{let a=n(o).match(t);return a?OO(a):null}},matchAll:(i,e,A)=>{let t=new RegExp(e,`${A??""}g`),n=er(i);return o=>Array.from(n(o).matchAll(t)).map(OO)},eq:Ar(Cd),gt:Ar(JO),gte:Ar(HlA),lt:Ar(YO),lte:Ar(zlA),ne:Ar((i,e)=>!Cd(i,e)),add:Ar((i,e)=>i+e),subtract:Ar((i,e)=>i-e),multiply:Ar((i,e)=>i*e),divide:Ar((i,e)=>i/e),mod:Ar((i,e)=>i%e),pow:Ar((i,e)=>i**e),abs:Ar(Math.abs),round:Ar((i,e=0)=>+`${Math.round(+`${i}e${e}`)}e${-e}`),number:Ar(i=>{let e=Number(i);return Number.isNaN(Number(i))?null:e}),string:Ar(String)},TO=i=>i!==null&&i!==0&&i!==!1,Fu=(i,e)=>(m2(i)||mM(),i.length===0?null:i.reduce(e)),OO=i=>{let[e,...A]=i,t=i.groups;return A.length?t?{value:e,groups:A,namedGroups:t}:{value:e,groups:A}:{value:e}},mM=()=>{wM("Array expected")},wM=i=>{throw new TypeError(i)},f6=[];function er(i,e){f6.unshift(P(P(P({},Lu),f6[0]),e?.functions));try{let A=m2(i)?PlA(i,f6[0]):JlA(i)?wM(`Function notation ["object", {...}] expected but got ${JSON.stringify(i)}`):()=>i;return t=>{try{return A(t)}catch(n){throw n.jsonquery=[{data:t,query:i},...n.jsonquery??[]],n}}}finally{f6.shift()}}function PlA(i,e){let[A,...t]=i,n=e[A];return n||wM(`Unknown function '${A}'`),n(...t)}var HO=[{pow:"^"},{multiply:"*",divide:"/",mod:"%"},{add:"+",subtract:"-"},{gt:">",gte:">=",lt:"<",lte:"<=",in:"in","not in":"not in"},{eq:"==",ne:"!="},{and:"and"},{or:"or"},{pipe:"|"}],jlA=["|","and","or"],zO=["|","and","or","*","/","%","+","-"];function PO(i,e){if(!m2(e))throw new Error("Invalid custom operators");return e.reduce(VlA,i)}function VlA(i,{name:e,op:A,at:t,after:n,before:o}){if(t)return i.map(s=>Object.values(s).includes(t)?$A(P({},s),{[e]:A}):s);let a=n??o,r=i.findIndex(s=>Object.values(s).includes(a));if(r!==-1)return i.toSpliced(r+(n?1:0),0,{[e]:A});throw new Error("Invalid custom operator")}var qlA=/^[a-zA-Z_$][a-zA-Z\d_$]*$/,WlA=/^[a-zA-Z_$][a-zA-Z\d_$]*/,ZlA=/^"(?:[^"\\]|\\.)*"/,XlA=/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/,$lA=/^(0|[1-9][0-9]*)/,AgA=/^(true|false|null)/,egA=/^[ \n\t\r]+/;function yM(i,e){let A=e?.operators??[],t=PO(HO,A),n=Object.assign({},...t),o=jlA.concat(A.filter(X=>X.vararg).map(X=>X.op)),a=zO.concat(A.filter(X=>X.leftAssociative).map(X=>X.op)),r=(X=t.length-1)=>{let eA=t[X];if(!eA)return l();let Z=i[z]==="(",CA=r(X-1);for(;;){if(M(),i[z]==="."&&"pipe"in eA){let IA=g();CA=CA[0]==="pipe"?[...CA,IA]:["pipe",CA,IA];continue}let wA=z,BA=s(eA);if(!BA)break;let QA=r(X-1),RA=CA[0],dA=BA===RA&&!Z;if(dA&&!a.includes(n[BA])){z=wA;break}CA=dA&&o.includes(n[BA])?[...CA,QA]:[BA,CA,QA]}return CA},s=X=>{let eA=Object.keys(X).sort((Z,CA)=>CA.length-Z.length);for(let Z of eA){let CA=X[Z];if(i.substring(z,z+CA.length)===CA)return z+=CA.length,M(),Z}},l=()=>{if(M(),i[z]==="("){z++;let X=r();return x(")"),X}return g()},g=()=>{if(i[z]==="."){let X=[];for(;i[z]===".";)z++,X.push(u()??E()??m()??F("Property expected")),M();return["get",...X]}return C()},C=()=>{let X=z,eA=E();if(M(),!eA||i[z]!=="(")return z=X,d();z++,M();let Z=i[z]!==")"?[r()]:[];for(;z{if(i[z]==="{"){z++,M();let X={},eA=!0;for(;z{if(i[z]==="["){z++,M();let X=[],eA=!0;for(;zk(ZlA,JSON.parse),E=()=>k(WlA,X=>X),f=()=>k(XlA,JSON.parse),m=()=>k($lA,JSON.parse),v=()=>{let X=k(AgA,JSON.parse);if(X!==void 0)return X;F("Value expected")},S=()=>{M(),z{let Z=i.substring(z).match(X);if(Z)return z+=Z[0].length,eA(Z[0])},M=()=>k(egA,X=>X),x=X=>{i[z]!==X&&F(`Character '${X}' expected`),z++},F=(X,eA=z)=>{throw new SyntaxError(`${X} (pos: ${eA})`)},z=0,j=r();return S(),j}var tgA=40,igA=" ",jO=(i,e)=>{let A=e?.indentation??igA,t=e?.operators??[],n=PO(HO,t),o=Object.assign({},...n),a=zO.concat(t.filter(B=>B.leftAssociative).map(B=>B.op)),r=(B,u,E=!1)=>m2(B)?s(B,u,E):JSON.stringify(B),s=(B,u,E)=>{let[f,...m]=B;if(f==="get"&&m.length>0)return g(m);if(f==="object")return l(m[0],u);if(f==="array"){let M=m.map(x=>r(x,u));return d(M,["[",", ","]"],[`[ -${u+A}`,`, -${u+A}`,` -${u}]`])}let v=o[f];if(v){let M=E?"(":"",x=E?")":"",F=m.map((z,j)=>{let X=z?.[0],eA=n.findIndex(wA=>f in wA),Z=n.findIndex(wA=>X in wA),CA=eA0||f===X&&!a.includes(v);return r(z,u+A,CA)});return d(F,[M,` ${v} `,x],[M,` -${u+A}${v} `,x])}let S=m.length===1?u:u+A,k=m.map(M=>r(M,S));return d(k,[`${f}(`,", ",")"],m.length===1?[`${f}(`,`, -${u}`,")"]:[`${f}( -${S}`,`, -${S}`,` -${u})`])},l=(B,u)=>{let E=u+A,f=Object.entries(B).map(([m,v])=>`${C(m)}: ${r(v,E)}`);return d(f,["{ ",", "," }"],[`{ -${E}`,`, -${E}`,` -${u}}`])},g=B=>B.map(u=>`.${C(u)}`).join(""),C=B=>qlA.test(B)?B:JSON.stringify(B),d=(B,[u,E,f],[m,v,S])=>u.length+B.reduce((k,M)=>k+M.length+E.length,0)-E.length+f.length<=(e?.maxLineLength??tgA)?u+B.join(E)+f:m+B.join(v)+S;return r(i,"")};function VO(i,e,A){return er(YlA(e)?yM(e,A):e,A)(i)}var qO={prefix:"far",iconName:"clock",icon:[512,512,[128339,"clock-four"],"f017","M464 256a208 208 0 1 1 -416 0 208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0 256 256 0 1 0 -512 0zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"]};var ngA={prefix:"far",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M384 32c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0zM64 80c-8.8 0-16 7.2-16 16l0 320c0 8.8 7.2 16 16 16l320 0c8.8 0 16-7.2 16-16l0-320c0-8.8-7.2-16-16-16L64 80zm230.7 89.9c7.8-10.7 22.8-13.1 33.5-5.3 10.7 7.8 13.1 22.8 5.3 33.5L211.4 366.1c-4.1 5.7-10.5 9.3-17.5 9.8-7 .5-13.9-2-18.8-6.9l-55.9-55.9c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l36 36 105.6-145.2z"]},DM=ngA;var WO={prefix:"far",iconName:"lightbulb",icon:[384,512,[128161],"f0eb","M296.5 291.1C321 265.2 336 230.4 336 192 336 112.5 271.5 48 192 48S48 112.5 48 192c0 38.4 15 73.2 39.5 99.1 21.3 22.4 44.9 54 53.3 92.9l102.4 0c8.4-39 32-70.5 53.3-92.9zm34.8 33C307.7 349 288 379.4 288 413.7l0 18.3c0 44.2-35.8 80-80 80l-32 0c-44.2 0-80-35.8-80-80l0-18.3C96 379.4 76.3 349 52.7 324.1 20 289.7 0 243.2 0 192 0 86 86 0 192 0S384 86 384 192c0 51.2-20 97.7-52.7 132.1zM144 184c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-48.6 39.4-88 88-88 13.3 0 24 10.7 24 24s-10.7 24-24 24c-22.1 0-40 17.9-40 40z"]};var vM={prefix:"far",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M384 80c8.8 0 16 7.2 16 16l0 320c0 8.8-7.2 16-16 16L64 432c-8.8 0-16-7.2-16-16L48 96c0-8.8 7.2-16 16-16l320 0zM64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32z"]};var ZO={prefix:"fas",iconName:"rotate",icon:[512,512,[128260,"sync-alt"],"f2f1","M480.1 192l7.9 0c13.3 0 24-10.7 24-24l0-144c0-9.7-5.8-18.5-14.8-22.2S477.9 .2 471 7L419.3 58.8C375 22.1 318 0 256 0 127 0 20.3 95.4 2.6 219.5 .1 237 12.2 253.2 29.7 255.7s33.7-9.7 36.2-27.1C79.2 135.5 159.3 64 256 64 300.4 64 341.2 79 373.7 104.3L327 151c-6.9 6.9-8.9 17.2-5.2 26.2S334.3 192 344 192l136.1 0zm29.4 100.5c2.5-17.5-9.7-33.7-27.1-36.2s-33.7 9.7-36.2 27.1c-13.3 93-93.4 164.5-190.1 164.5-44.4 0-85.2-15-117.7-40.3L185 361c6.9-6.9 8.9-17.2 5.2-26.2S177.7 320 168 320L24 320c-13.3 0-24 10.7-24 24L0 488c0 9.7 5.8 18.5 14.8 22.2S34.1 511.8 41 505l51.8-51.8C137 489.9 194 512 256 512 385 512 491.7 416.6 509.4 292.5z"]};var bM={prefix:"fas",iconName:"paste",icon:[512,512,["file-clipboard"],"f0ea","M64 0C28.7 0 0 28.7 0 64L0 384c0 35.3 28.7 64 64 64l112 0 0-224c0-61.9 50.1-112 112-112l64 0 0-48c0-35.3-28.7-64-64-64L64 0zM248 112l-144 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l144 0c13.3 0 24 10.7 24 24s-10.7 24-24 24zm40 48c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64l160 0c35.3 0 64-28.7 64-64l0-165.5c0-17-6.7-33.3-18.7-45.3l-58.5-58.5c-12-12-28.3-18.7-45.3-18.7L288 160z"]};var ogA={prefix:"fas",iconName:"crop-simple",icon:[512,512,["crop-alt"],"f565","M128 32c0-17.7-14.3-32-32-32S64 14.3 64 32l0 32-32 0C14.3 64 0 78.3 0 96s14.3 32 32 32l32 0 0 256c0 35.3 28.7 64 64 64l208 0 0-64-208 0 0-352zM384 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-32 32 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-32 0 0-256c0-35.3-28.7-64-64-64l-208 0 0 64 208 0 0 352z"]},XO=ogA;var Ku={prefix:"fas",iconName:"filter",icon:[512,512,[],"f0b0","M32 64C19.1 64 7.4 71.8 2.4 83.8S.2 109.5 9.4 118.6L192 301.3 192 416c0 8.5 3.4 16.6 9.4 22.6l64 64c9.2 9.2 22.9 11.9 34.9 6.9S320 492.9 320 480l0-178.7 182.6-182.6c9.2-9.2 11.9-22.9 6.9-34.9S492.9 64 480 64L32 64z"]};var agA={prefix:"fas",iconName:"square-caret-down",icon:[448,512,["caret-square-down"],"f150","M384 480c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0zM224 352c-6.7 0-13-2.8-17.6-7.7l-104-112c-6.5-7-8.2-17.2-4.4-25.9S110.5 192 120 192l208 0c9.5 0 18.2 5.7 22 14.4s2.1 18.9-4.4 25.9l-104 112c-4.5 4.9-10.9 7.7-17.6 7.7z"]},$O=agA;var JB={prefix:"fas",iconName:"caret-right",icon:[256,512,[],"f0da","M249.3 235.8c10.2 12.6 9.5 31.1-2.2 42.8l-128 128c-9.2 9.2-22.9 11.9-34.9 6.9S64.5 396.9 64.5 384l0-256c0-12.9 7.8-24.6 19.8-29.6s25.7-2.2 34.9 6.9l128 128 2.2 2.4z"]};var rgA={prefix:"fas",iconName:"magnifying-glass",icon:[512,512,[128269,"search"],"f002","M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376C296.3 401.1 253.9 416 208 416 93.1 416 0 322.9 0 208S93.1 0 208 0 416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"]},Uu=rgA;var AJ={prefix:"fas",iconName:"eye",icon:[576,512,[128065],"f06e","M288 32c-80.8 0-145.5 36.8-192.6 80.6-46.8 43.5-78.1 95.4-93 131.1-3.3 7.9-3.3 16.7 0 24.6 14.9 35.7 46.2 87.7 93 131.1 47.1 43.7 111.8 80.6 192.6 80.6s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1 3.3-7.9 3.3-16.7 0-24.6-14.9-35.7-46.2-87.7-93-131.1-47.1-43.7-111.8-80.6-192.6-80.6zM144 256a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-64c0 35.3-28.7 64-64 64-11.5 0-22.3-3-31.7-8.4-1 10.9-.1 22.1 2.9 33.2 13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-12.2-45.7-55.5-74.8-101.1-70.8 5.3 9.3 8.4 20.1 8.4 31.7z"]},eJ={prefix:"fas",iconName:"caret-left",icon:[256,512,[],"f0d9","M7.7 235.8c-10.3 12.6-9.5 31.1 2.2 42.8l128 128c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6l0-256c0-12.9-7.8-24.6-19.8-29.6s-25.7-2.2-34.9 6.9l-128 128-2.2 2.4z"]};var tJ={prefix:"fas",iconName:"chevron-up",icon:[448,512,[],"f077","M201.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L224 173.3 54.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z"]};var iJ={prefix:"fas",iconName:"circle-notch",icon:[512,512,[],"f1ce","M222.7 32.1c5 16.9-4.6 34.8-21.5 39.8-79.3 23.6-137.1 97.1-137.1 184.1 0 106 86 192 192 192s192-86 192-192c0-86.9-57.8-160.4-137.1-184.1-16.9-5-26.6-22.9-21.5-39.8s22.9-26.6 39.8-21.5C434.9 42.1 512 140 512 256 512 397.4 397.4 512 256 512S0 397.4 0 256c0-116 77.1-213.9 182.9-245.4 16.9-5 34.8 4.6 39.8 21.5z"]};var sgA={prefix:"fas",iconName:"ellipsis-vertical",icon:[128,512,["ellipsis-v"],"f142","M64 144a56 56 0 1 1 0-112 56 56 0 1 1 0 112zm0 224c30.9 0 56 25.1 56 56s-25.1 56-56 56-56-25.1-56-56 25.1-56 56-56zm56-112c0 30.9-25.1 56-56 56s-56-25.1-56-56 25.1-56 56-56 56 25.1 56 56z"]},MM=sgA;var lgA={prefix:"fas",iconName:"pen-to-square",icon:[512,512,["edit"],"f044","M471.6 21.7c-21.9-21.9-57.3-21.9-79.2 0L368 46.1 465.9 144 490.3 119.6c21.9-21.9 21.9-57.3 0-79.2L471.6 21.7zm-299.2 220c-6.1 6.1-10.8 13.6-13.5 21.9l-29.6 88.8c-2.9 8.6-.6 18.1 5.8 24.6s15.9 8.7 24.6 5.8l88.8-29.6c8.2-2.7 15.7-7.4 21.9-13.5L432 177.9 334.1 80 172.4 241.7zM96 64C43 64 0 107 0 160L0 416c0 53 43 96 96 96l256 0c53 0 96-43 96-96l0-96c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 96c0 17.7-14.3 32-32 32L96 448c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L96 64z"]},nJ=lgA;var SM={prefix:"fas",iconName:"clone",icon:[512,512,[],"f24d","M288 448l-224 0 0-224 48 0 0-64-48 0c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l224 0c35.3 0 64-28.7 64-64l0-48-64 0 0 48zm-64-96l224 0c35.3 0 64-28.7 64-64l0-224c0-35.3-28.7-64-64-64L224 0c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64z"]};var ggA={prefix:"fas",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M384 32c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0zM342 145.7c-10.7-7.8-25.7-5.4-33.5 5.3L189.1 315.2 137 263.1c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l72 72c5 5 11.9 7.5 18.8 7s13.4-4.1 17.5-9.8L347.3 179.2c7.8-10.7 5.4-25.7-5.3-33.5z"]},kM=ggA;var cgA={prefix:"fas",iconName:"square-caret-up",icon:[448,512,["caret-square-up"],"f151","M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zM224 160c6.7 0 13 2.8 17.6 7.7l104 112c6.5 7 8.2 17.2 4.4 25.9S337.5 320 328 320l-208 0c-9.5 0-18.2-5.7-22-14.4s-2.1-18.9 4.4-25.9l104-112c4.5-4.9 10.9-7.7 17.6-7.7z"]},oJ=cgA;var Tu={prefix:"fas",iconName:"code",icon:[576,512,[],"f121","M360.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6zm64.6 136.1c-12.5 12.5-12.5 32.8 0 45.3l73.4 73.4-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0zm-274.7 0c-12.5-12.5-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256 150.6 182.6c12.5-12.5 12.5-32.8 0-45.3z"]};var _M={prefix:"fas",iconName:"angle-right",icon:[256,512,[8250],"f105","M247.1 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L179.2 256 41.9 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"]};var CgA={prefix:"fas",iconName:"gear",icon:[512,512,[9881,"cog"],"f013","M195.1 9.5C198.1-5.3 211.2-16 226.4-16l59.8 0c15.2 0 28.3 10.7 31.3 25.5L332 79.5c14.1 6 27.3 13.7 39.3 22.8l67.8-22.5c14.4-4.8 30.2 1.2 37.8 14.4l29.9 51.8c7.6 13.2 4.9 29.8-6.5 39.9L447 233.3c.9 7.4 1.3 15 1.3 22.7s-.5 15.3-1.3 22.7l53.4 47.5c11.4 10.1 14 26.8 6.5 39.9l-29.9 51.8c-7.6 13.1-23.4 19.2-37.8 14.4l-67.8-22.5c-12.1 9.1-25.3 16.7-39.3 22.8l-14.4 69.9c-3.1 14.9-16.2 25.5-31.3 25.5l-59.8 0c-15.2 0-28.3-10.7-31.3-25.5l-14.4-69.9c-14.1-6-27.2-13.7-39.3-22.8L73.5 432.3c-14.4 4.8-30.2-1.2-37.8-14.4L5.8 366.1c-7.6-13.2-4.9-29.8 6.5-39.9l53.4-47.5c-.9-7.4-1.3-15-1.3-22.7s.5-15.3 1.3-22.7L12.3 185.8c-11.4-10.1-14-26.8-6.5-39.9L35.7 94.1c7.6-13.2 23.4-19.2 37.8-14.4l67.8 22.5c12.1-9.1 25.3-16.7 39.3-22.8L195.1 9.5zM256.3 336a80 80 0 1 0 -.6-160 80 80 0 1 0 .6 160z"]},aJ=CgA;var rJ={prefix:"fas",iconName:"up-right-and-down-left-from-center",icon:[512,512,["expand-alt"],"f424","M344 0L488 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S334.3 0 344 0zM168 512L24 512c-13.3 0-24-10.7-24-24L0 344c0-9.7 5.8-18.5 14.8-22.2S34.1 320.2 41 327l39 39 87-87c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S177.7 512 168 512z"]};var oC={prefix:"fas",iconName:"wrench",icon:[576,512,[128295],"f0ad","M509.4 98.6c7.6-7.6 20.3-5.7 24.1 4.3 6.8 17.7 10.5 37 10.5 57.1 0 88.4-71.6 160-160 160-17.5 0-34.4-2.8-50.2-8L146.9 498.9c-28.1 28.1-73.7 28.1-101.8 0s-28.1-73.7 0-101.8L232 210.2c-5.2-15.8-8-32.6-8-50.2 0-88.4 71.6-160 160-160 20.1 0 39.4 3.7 57.1 10.5 10 3.8 11.8 16.5 4.3 24.1l-88.7 88.7c-3 3-4.7 7.1-4.7 11.3l0 41.4c0 8.8 7.2 16 16 16l41.4 0c4.2 0 8.3-1.7 11.3-4.7l88.7-88.7z"]},m6={prefix:"fas",iconName:"trash-can",icon:[448,512,[61460,"trash-alt"],"f2ed","M136.7 5.9C141.1-7.2 153.3-16 167.1-16l113.9 0c13.8 0 26 8.8 30.4 21.9L320 32 416 32c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 96C14.3 96 0 81.7 0 64S14.3 32 32 32l96 0 8.7-26.1zM32 144l384 0 0 304c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-304zm88 64c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24z"]};var w6={prefix:"fas",iconName:"check",icon:[448,512,[10003,10004],"f00c","M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z"]};var sJ={prefix:"fas",iconName:"xmark",icon:[384,512,[128473,10005,10006,10060,215,"close","multiply","remove","times"],"f00d","M55.1 73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L147.2 256 9.9 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192.5 301.3 329.9 438.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.8 256 375.1 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192.5 210.7 55.1 73.4z"]},lJ=sJ;var Ou=sJ;var dd={prefix:"fas",iconName:"pen",icon:[512,512,[128394],"f304","M352.9 21.2L308 66.1 445.9 204 490.8 159.1C504.4 145.6 512 127.2 512 108s-7.6-37.6-21.2-51.1L455.1 21.2C441.6 7.6 423.2 0 404 0s-37.6 7.6-51.1 21.2zM274.1 100L58.9 315.1c-10.7 10.7-18.5 24.1-22.6 38.7L.9 481.6c-2.3 8.3 0 17.3 6.2 23.4s15.1 8.5 23.4 6.2l127.8-35.5c14.6-4.1 27.9-11.8 38.7-22.6L412 237.9 274.1 100z"]};var gJ={prefix:"fas",iconName:"chevron-down",icon:[448,512,[],"f078","M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"]};var cJ={prefix:"fas",iconName:"angle-down",icon:[384,512,[8964],"f107","M169.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 306.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var dgA={prefix:"fas",iconName:"arrow-down-short-wide",icon:[576,512,["sort-amount-desc","sort-amount-down-alt"],"f884","M246.6 374.6l-96 96c-12.5 12.5-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L96 370.7 96 64c0-17.7 14.3-32 32-32s32 14.3 32 32l0 306.7 41.4-41.4c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3zM320 32l32 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l96 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-96 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l224 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-224 0c-17.7 0-32-14.3-32-32s14.3-32 32-32z"]};var Ju=dgA;var IgA={prefix:"fas",iconName:"triangle-exclamation",icon:[512,512,[9888,"exclamation-triangle","warning"],"f071","M256 0c14.7 0 28.2 8.1 35.2 21l216 400c6.7 12.4 6.4 27.4-.8 39.5S486.1 480 472 480L40 480c-14.1 0-27.2-7.4-34.4-19.5s-7.5-27.1-.8-39.5l216-400c7-12.9 20.5-21 35.2-21zm0 352a32 32 0 1 0 0 64 32 32 0 1 0 0-64zm0-192c-18.2 0-32.7 15.5-31.4 33.7l7.4 104c.9 12.5 11.4 22.3 23.9 22.3 12.6 0 23-9.7 23.9-22.3l7.4-104c1.3-18.2-13.1-33.7-31.4-33.7z"]},w2=IgA;var BgA={prefix:"fas",iconName:"scissors",icon:[512,512,[9984,9986,9988,"cut"],"f0c4","M192 256l-39.5 39.5c-12.6-4.9-26.2-7.5-40.5-7.5-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112c0-14.3-2.7-27.9-7.5-40.5L499.2 76.8c7.1-7.1 7.1-18.5 0-25.6-28.3-28.3-74.1-28.3-102.4 0L256 192 216.5 152.5c4.9-12.6 7.5-26.2 7.5-40.5 0-61.9-50.1-112-112-112S0 50.1 0 112 50.1 224 112 224c14.3 0 27.9-2.7 40.5-7.5L192 256zm97.9 97.9L396.8 460.8c28.3 28.3 74.1 28.3 102.4 0 7.1-7.1 7.1-18.5 0-25.6l-145.3-145.3-64 64zM64 112a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm48 240a48 48 0 1 1 0 96 48 48 0 1 1 0-96z"]},Id=BgA;var Yu={prefix:"fas",iconName:"arrow-right-arrow-left",icon:[512,512,[8644,"exchange"],"f0ec","M502.6 150.6l-96 96c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L402.7 160 32 160c-17.7 0-32-14.3-32-32S14.3 96 32 96l370.7 0-41.4-41.4c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l96 96c12.5 12.5 12.5 32.8 0 45.3zm-397.3 352l-96-96c-12.5-12.5-12.5-32.8 0-45.3l96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3L109.3 352 480 352c17.7 0 32 14.3 32 32s-14.3 32-32 32l-370.7 0 41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0z"]};var xM={prefix:"fas",iconName:"caret-up",icon:[320,512,[],"f0d8","M140.3 135.2c12.6-10.3 31.1-9.5 42.8 2.2l128 128c9.2 9.2 11.9 22.9 6.9 34.9S301.4 320 288.5 320l-256 0c-12.9 0-24.6-7.8-29.6-19.8S.7 274.5 9.9 265.4l128-128 2.4-2.2z"]};var CJ={prefix:"fas",iconName:"down-left-and-up-right-to-center",icon:[512,512,["compress-alt"],"f422","M439.5 7c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S450.2 240 440.5 240l-144 0c-13.3 0-24-10.7-24-24l0-144c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39 87-87zM72.5 272l144 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S62.8 272 72.5 272z"]};var Bd={prefix:"fas",iconName:"plus",icon:[448,512,[10133,61543,"add"],"2b","M256 64c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 160-160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l160 0 0 160c0 17.7 14.3 32 32 32s32-14.3 32-32l0-160 160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-160 0 0-160z"]};var aC={prefix:"fas",iconName:"copy",icon:[448,512,[],"f0c5","M192 0c-35.3 0-64 28.7-64 64l0 256c0 35.3 28.7 64 64 64l192 0c35.3 0 64-28.7 64-64l0-200.6c0-17.4-7.1-34.1-19.7-46.2L370.6 17.8C358.7 6.4 342.8 0 326.3 0L192 0zM64 128c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l192 0c35.3 0 64-28.7 64-64l0-16-64 0 0 16-192 0 0-256 16 0 0-64-16 0z"]};var hgA={prefix:"fas",iconName:"arrow-rotate-right",icon:[512,512,[8635,"arrow-right-rotate","arrow-rotate-forward","redo"],"f01e","M436.7 74.7L448 85.4 448 32c0-17.7 14.3-32 32-32s32 14.3 32 32l0 128c0 17.7-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l47.9 0-7.6-7.2c-.2-.2-.4-.4-.6-.6-75-75-196.5-75-271.5 0s-75 196.5 0 271.5 196.5 75 271.5 0c8.2-8.2 15.5-16.9 21.9-26.1 10.1-14.5 30.1-18 44.6-7.9s18 30.1 7.9 44.6c-8.5 12.2-18.2 23.8-29.1 34.7-100 100-262.1 100-362 0S-25 175 75 75c99.9-99.9 261.7-100 361.7-.3z"]};var y6=hgA;var r0={prefix:"fas",iconName:"caret-down",icon:[320,512,[],"f0d7","M140.3 376.8c12.6 10.2 31.1 9.5 42.8-2.2l128-128c9.2-9.2 11.9-22.9 6.9-34.9S301.4 192 288.5 192l-256 0c-12.9 0-24.6 7.8-29.6 19.8S.7 237.5 9.9 246.6l128 128 2.4 2.2z"]};var EgA={prefix:"fas",iconName:"arrow-rotate-left",icon:[512,512,[8634,"arrow-left-rotate","arrow-rotate-back","arrow-rotate-backward","undo"],"f0e2","M256 64c-56.8 0-107.9 24.7-143.1 64l47.1 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 192c-17.7 0-32-14.3-32-32L0 32C0 14.3 14.3 0 32 0S64 14.3 64 32l0 54.7C110.9 33.6 179.5 0 256 0 397.4 0 512 114.6 512 256S397.4 512 256 512c-87 0-163.9-43.4-210.1-109.7-10.1-14.5-6.6-34.4 7.9-44.6s34.4-6.6 44.6 7.9c34.8 49.8 92.4 82.3 157.6 82.3 106 0 192-86 192-192S362 64 256 64z"]};var D6=EgA;var RM={prefix:"fas",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M64 32l320 0c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32z"]};var NM={prefix:"fas",iconName:"arrow-down",icon:[384,512,[8595],"f063","M169.4 502.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 402.7 224 32c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 370.7-105.4-105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var DV=Vp(BJ(),1);var hJ=Number.isNaN||function(e){return typeof e=="number"&&e!==e};function QgA(i,e){return!!(i===e||hJ(i)&&hJ(e))}function ugA(i,e){if(i.length!==e.length)return!1;for(var A=0;A{if(typeof n!="object"||!n.name||!n.init)throw new Error("Invalid JSEP plugin format");this.registered[n.name]||(n.init(this.jsep),this.registered[n.name]=n)})}},rl=class i{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+i.version}static addUnaryOp(e){return i.max_unop_len=Math.max(e.length,i.max_unop_len),i.unary_ops[e]=1,i}static addBinaryOp(e,A,t){return i.max_binop_len=Math.max(e.length,i.max_binop_len),i.binary_ops[e]=A,t?i.right_associative.add(e):i.right_associative.delete(e),i}static addIdentifierChar(e){return i.additional_identifier_chars.add(e),i}static addLiteral(e,A){return i.literals[e]=A,i}static removeUnaryOp(e){return delete i.unary_ops[e],e.length===i.max_unop_len&&(i.max_unop_len=i.getMaxKeyLen(i.unary_ops)),i}static removeAllUnaryOps(){return i.unary_ops={},i.max_unop_len=0,i}static removeIdentifierChar(e){return i.additional_identifier_chars.delete(e),i}static removeBinaryOp(e){return delete i.binary_ops[e],e.length===i.max_binop_len&&(i.max_binop_len=i.getMaxKeyLen(i.binary_ops)),i.right_associative.delete(e),i}static removeAllBinaryOps(){return i.binary_ops={},i.max_binop_len=0,i}static removeLiteral(e){return delete i.literals[e],i}static removeAllLiterals(){return i.literals={},i}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(e){this.expr=e,this.index=0}static parse(e){return new i(e).parse()}static getMaxKeyLen(e){return Math.max(0,...Object.keys(e).map(A=>A.length))}static isDecimalDigit(e){return e>=48&&e<=57}static binaryPrecedence(e){return i.binary_ops[e]||0}static isIdentifierStart(e){return e>=65&&e<=90||e>=97&&e<=122||e>=128&&!i.binary_ops[String.fromCharCode(e)]||i.additional_identifier_chars.has(String.fromCharCode(e))}static isIdentifierPart(e){return i.isIdentifierStart(e)||i.isDecimalDigit(e)}throwError(e){let A=new Error(e+" at character "+this.index);throw A.index=this.index,A.description=e,A}runHook(e,A){if(i.hooks[e]){let t={context:this,node:A};return i.hooks.run(e,t),t.node}return A}searchHook(e){if(i.hooks[e]){let A={context:this};return i.hooks[e].find(function(t){return t.call(A.context,A),A.node}),A.node}}gobbleSpaces(){let e=this.code;for(;e===i.SPACE_CODE||e===i.TAB_CODE||e===i.LF_CODE||e===i.CR_CODE;)e=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");let e=this.gobbleExpressions(),A=e.length===1?e[0]:{type:i.COMPOUND,body:e};return this.runHook("after-all",A)}gobbleExpressions(e){let A=[],t,n;for(;this.index0;){if(i.binary_ops.hasOwnProperty(e)&&(!i.isIdentifierStart(this.code)||this.index+e.lengtho.right_a&&C.right_a?t>C.prec:t<=C.prec;for(;n.length>2&&g(n[n.length-2]);)r=n.pop(),A=n.pop().value,a=n.pop(),e={type:i.BINARY_EXP,operator:A,left:a,right:r},n.push(e);e=this.gobbleToken(),e||this.throwError("Expected expression after "+l),n.push(o,e)}for(s=n.length-1,e=n[s];s>1;)e={type:i.BINARY_EXP,operator:n[s-1].value,left:n[s-2],right:e},s-=2;return e}gobbleToken(){let e,A,t,n;if(this.gobbleSpaces(),n=this.searchHook("gobble-token"),n)return this.runHook("after-token",n);if(e=this.code,i.isDecimalDigit(e)||e===i.PERIOD_CODE)return this.gobbleNumericLiteral();if(e===i.SQUOTE_CODE||e===i.DQUOTE_CODE)n=this.gobbleStringLiteral();else if(e===i.OBRACK_CODE)n=this.gobbleArray();else{for(A=this.expr.substr(this.index,i.max_unop_len),t=A.length;t>0;){if(i.unary_ops.hasOwnProperty(A)&&(!i.isIdentifierStart(this.code)||this.index+A.length=A.length&&this.throwError("Unexpected token "+String.fromCharCode(e));break}else if(o===i.COMMA_CODE){if(this.index++,n++,n!==A.length){if(e===i.CPAREN_CODE)this.throwError("Unexpected token ,");else if(e===i.CBRACK_CODE)for(let a=A.length;a":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"});rl.max_unop_len=rl.getMaxKeyLen(rl.unary_ops);rl.max_binop_len=rl.getMaxKeyLen(rl.binary_ops);var s0=i=>new rl(i).parse(),fgA=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(rl).filter(i=>!fgA.includes(i)&&s0[i]===void 0).forEach(i=>{s0[i]=rl[i]});s0.Jsep=rl;var mgA="ConditionalExpression",wgA={name:"ternary",init(i){i.hooks.add("after-expression",function(A){if(A.node&&this.code===i.QUMARK_CODE){this.index++;let t=A.node,n=this.gobbleExpression();if(n||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===i.COLON_CODE){this.index++;let o=this.gobbleExpression();if(o||this.throwError("Expected expression"),A.node={type:mgA,test:t,consequent:n,alternate:o},t.operator&&i.binary_ops[t.operator]<=.9){let a=t;for(;a.right.operator&&i.binary_ops[a.right.operator]<=.9;)a=a.right;A.node.test=a.right,a.right=A.node,A.node=t}}else this.throwError("Expected :")}})}};s0.plugins.register(wgA);var QJ=47,ygA=92,DgA={name:"regex",init(i){i.hooks.add("gobble-token",function(A){if(this.code===QJ){let t=++this.index,n=!1;for(;this.index=97&&s<=122||s>=65&&s<=90||s>=48&&s<=57)a+=this.char;else break}let r;try{r=new RegExp(o,a)}catch(s){this.throwError(s.message)}return A.node={type:i.LITERAL,value:r,raw:this.expr.slice(t-1,this.index)},A.node=this.gobbleTokenProperty(A.node),A.node}this.code===i.OBRACK_CODE?n=!0:n&&this.code===i.CBRACK_CODE&&(n=!1),this.index+=this.code===ygA?2:1}this.throwError("Unclosed Regex")}})}},FM=43,vgA=45,HB={name:"assignment",assignmentOperators:new Set(["=","*=","**=","/=","%=","+=","-=","<<=",">>=",">>>=","&=","^=","|=","||=","&&=","??="]),updateOperators:[FM,vgA],assignmentPrecedence:.9,init(i){let e=[i.IDENTIFIER,i.MEMBER_EXP];HB.assignmentOperators.forEach(t=>i.addBinaryOp(t,HB.assignmentPrecedence,!0)),i.hooks.add("gobble-token",function(n){let o=this.code;HB.updateOperators.some(a=>a===o&&a===this.expr.charCodeAt(this.index+1))&&(this.index+=2,n.node={type:"UpdateExpression",operator:o===FM?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},(!n.node.argument||!e.includes(n.node.argument.type))&&this.throwError(`Unexpected ${n.node.operator}`))}),i.hooks.add("after-token",function(n){if(n.node){let o=this.code;HB.updateOperators.some(a=>a===o&&a===this.expr.charCodeAt(this.index+1))&&(e.includes(n.node.type)||this.throwError(`Unexpected ${n.node.operator}`),this.index+=2,n.node={type:"UpdateExpression",operator:o===FM?"++":"--",argument:n.node,prefix:!1})}}),i.hooks.add("after-expression",function(n){n.node&&A(n.node)});function A(t){HB.assignmentOperators.has(t.operator)?(t.type="AssignmentExpression",A(t.left),A(t.right)):t.operator||Object.values(t).forEach(n=>{n&&typeof n=="object"&&A(n)})}}};s0.plugins.register(DgA,HB);s0.addUnaryOp("typeof");s0.addUnaryOp("void");s0.addLiteral("null",null);s0.addLiteral("undefined",void 0);var bgA=new Set(["constructor","__proto__","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"]),zo={evalAst(i,e){switch(i.type){case"BinaryExpression":case"LogicalExpression":return zo.evalBinaryExpression(i,e);case"Compound":return zo.evalCompound(i,e);case"ConditionalExpression":return zo.evalConditionalExpression(i,e);case"Identifier":return zo.evalIdentifier(i,e);case"Literal":return zo.evalLiteral(i,e);case"MemberExpression":return zo.evalMemberExpression(i,e);case"UnaryExpression":return zo.evalUnaryExpression(i,e);case"ArrayExpression":return zo.evalArrayExpression(i,e);case"CallExpression":return zo.evalCallExpression(i,e);case"AssignmentExpression":return zo.evalAssignmentExpression(i,e);default:throw SyntaxError("Unexpected expression",i)}},evalBinaryExpression(i,e){return{"||":(t,n)=>t||n(),"&&":(t,n)=>t&&n(),"|":(t,n)=>t|n(),"^":(t,n)=>t^n(),"&":(t,n)=>t&n(),"==":(t,n)=>t==n(),"!=":(t,n)=>t!=n(),"===":(t,n)=>t===n(),"!==":(t,n)=>t!==n(),"<":(t,n)=>t":(t,n)=>t>n(),"<=":(t,n)=>t<=n(),">=":(t,n)=>t>=n(),"<<":(t,n)=>t<>":(t,n)=>t>>n(),">>>":(t,n)=>t>>>n(),"+":(t,n)=>t+n(),"-":(t,n)=>t-n(),"*":(t,n)=>t*n(),"/":(t,n)=>t/n(),"%":(t,n)=>t%n()}[i.operator](zo.evalAst(i.left,e),()=>zo.evalAst(i.right,e))},evalCompound(i,e){let A;for(let t=0;t-zo.evalAst(t,e),"!":t=>!zo.evalAst(t,e),"~":t=>~zo.evalAst(t,e),"+":t=>+zo.evalAst(t,e),typeof:t=>typeof zo.evalAst(t,e),void:t=>{zo.evalAst(t,e)}}[i.operator](i.argument)},evalArrayExpression(i,e){return i.elements.map(A=>zo.evalAst(A,e))},evalCallExpression(i,e){let A=i.arguments.map(n=>zo.evalAst(n,e)),t=zo.evalAst(i.callee,e);if(t===Function)throw new Error("Function constructor is disabled");return t(...A)},evalAssignmentExpression(i,e){if(i.left.type!=="Identifier")throw SyntaxError("Invalid left-hand side in assignment");let A=i.left.name,t=zo.evalAst(i.right,e);return e[A]=t,e[A]}},KM=class{constructor(e){this.code=e,this.ast=s0(this.code)}runInNewContext(e){let A=Object.assign(Object.create(null),e);return zo.evalAst(this.ast,A)}};function y2(i,e){return i=i.slice(),i.push(e),i}function UM(i,e){return e=e.slice(),e.unshift(i),e}var TM=class extends Error{constructor(e){super('JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)'),this.avoidNew=!0,this.value=e,this.name="NewError"}};function Qo(i,e,A,t,n){if(!(this instanceof Qo))try{return new Qo(i,e,A,t,n)}catch(a){if(!a.avoidNew)throw a;return a.value}typeof i=="string"&&(n=t,t=A,A=e,e=i,i=null);let o=i&&typeof i=="object";if(i=i||{},this.json=i.json||A,this.path=i.path||e,this.resultType=i.resultType||"value",this.flatten=i.flatten||!1,this.wrap=Object.hasOwn(i,"wrap")?i.wrap:!0,this.sandbox=i.sandbox||{},this.eval=i.eval===void 0?"safe":i.eval,this.ignoreEvalErrors=typeof i.ignoreEvalErrors>"u"?!1:i.ignoreEvalErrors,this.parent=i.parent||null,this.parentProperty=i.parentProperty||null,this.callback=i.callback||t||null,this.otherTypeCallback=i.otherTypeCallback||n||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},i.autostart!==!1){let a={path:o?i.path:e};o?"json"in i&&(a.json=i.json):a.json=A;let r=this.evaluate(a);if(!r||typeof r!="object")throw new TM(r);return r}}Qo.prototype.evaluate=function(i,e,A,t){let n=this.parent,o=this.parentProperty,{flatten:a,wrap:r}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,A=A||this.callback,this.currOtherTypeCallback=t||this.otherTypeCallback,e=e||this.json,i=i||this.path,i&&typeof i=="object"&&!Array.isArray(i)){if(!i.path&&i.path!=="")throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(i,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');({json:e}=i),a=Object.hasOwn(i,"flatten")?i.flatten:a,this.currResultType=Object.hasOwn(i,"resultType")?i.resultType:this.currResultType,this.currSandbox=Object.hasOwn(i,"sandbox")?i.sandbox:this.currSandbox,r=Object.hasOwn(i,"wrap")?i.wrap:r,this.currEval=Object.hasOwn(i,"eval")?i.eval:this.currEval,A=Object.hasOwn(i,"callback")?i.callback:A,this.currOtherTypeCallback=Object.hasOwn(i,"otherTypeCallback")?i.otherTypeCallback:this.currOtherTypeCallback,n=Object.hasOwn(i,"parent")?i.parent:n,o=Object.hasOwn(i,"parentProperty")?i.parentProperty:o,i=i.path}if(n=n||null,o=o||null,Array.isArray(i)&&(i=Qo.toPathString(i)),!i&&i!==""||!e)return;let s=Qo.toPathArray(i);s[0]==="$"&&s.length>1&&s.shift(),this._hasParentSelector=null;let l=this._trace(s,e,["$"],n,o,A).filter(function(g){return g&&!g.isParentSelector});return l.length?!r&&l.length===1&&!l[0].hasArrExpr?this._getPreferredOutput(l[0]):l.reduce((g,C)=>{let d=this._getPreferredOutput(C);return a&&Array.isArray(d)?g=g.concat(d):g.push(d),g},[]):r?[]:void 0};Qo.prototype._getPreferredOutput=function(i){let e=this.currResultType;switch(e){case"all":{let A=Array.isArray(i.path)?i.path:Qo.toPathArray(i.path);return i.pointer=Qo.toPointer(A),i.path=typeof i.path=="string"?i.path:Qo.toPathString(i.path),i}case"value":case"parent":case"parentProperty":return i[e];case"path":return Qo.toPathString(i[e]);case"pointer":return Qo.toPointer(i.path);default:throw new TypeError("Unknown result type")}};Qo.prototype._handleCallback=function(i,e,A){if(e){let t=this._getPreferredOutput(i);i.path=typeof i.path=="string"?i.path:Qo.toPathString(i.path),e(t,A,i)}};Qo.prototype._trace=function(i,e,A,t,n,o,a,r){let s;if(!i.length)return s={path:A,value:e,parent:t,parentProperty:n,hasArrExpr:a},this._handleCallback(s,o,"value"),s;let l=i[0],g=i.slice(1),C=[];function d(B){Array.isArray(B)?B.forEach(u=>{C.push(u)}):C.push(B)}if((typeof l!="string"||r)&&e&&Object.hasOwn(e,l))d(this._trace(g,e[l],y2(A,l),e,l,o,a));else if(l==="*")this._walk(e,B=>{d(this._trace(g,e[B],y2(A,B),e,B,o,!0,!0))});else if(l==="..")d(this._trace(g,e,A,t,n,o,a)),this._walk(e,B=>{typeof e[B]=="object"&&d(this._trace(i.slice(),e[B],y2(A,B),e,B,o,!0))});else{if(l==="^")return this._hasParentSelector=!0,{path:A.slice(0,-1),expr:g,isParentSelector:!0};if(l==="~")return s={path:y2(A,l),value:n,parent:t,parentProperty:null},this._handleCallback(s,o,"property"),s;if(l==="$")d(this._trace(g,e,A,null,null,o,a));else if(/^(-?\d*):(-?\d*):?(\d*)$/u.test(l))d(this._slice(l,g,e,A,t,n,o));else if(l.indexOf("?(")===0){if(this.currEval===!1)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");let B=l.replace(/^\?\((.*?)\)$/u,"$1"),u=/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(B);u?this._walk(e,E=>{let f=[u[2]],m=u[1]?e[E][u[1]]:e[E];this._trace(f,m,A,t,n,o,!0).length>0&&d(this._trace(g,e[E],y2(A,E),e,E,o,!0))}):this._walk(e,E=>{this._eval(B,e[E],E,A,t,n)&&d(this._trace(g,e[E],y2(A,E),e,E,o,!0))})}else if(l[0]==="("){if(this.currEval===!1)throw new Error("Eval [(expr)] prevented in JSONPath expression.");d(this._trace(UM(this._eval(l,e,A.at(-1),A.slice(0,-1),t,n),g),e,A,t,n,o,a))}else if(l[0]==="@"){let B=!1,u=l.slice(1,-2);switch(u){case"scalar":(!e||!["object","function"].includes(typeof e))&&(B=!0);break;case"boolean":case"string":case"undefined":case"function":typeof e===u&&(B=!0);break;case"integer":Number.isFinite(e)&&!(e%1)&&(B=!0);break;case"number":Number.isFinite(e)&&(B=!0);break;case"nonFinite":typeof e=="number"&&!Number.isFinite(e)&&(B=!0);break;case"object":e&&typeof e===u&&(B=!0);break;case"array":Array.isArray(e)&&(B=!0);break;case"other":B=this.currOtherTypeCallback(e,A,t,n);break;case"null":e===null&&(B=!0);break;default:throw new TypeError("Unknown value type "+u)}if(B)return s={path:A,value:e,parent:t,parentProperty:n},this._handleCallback(s,o,"value"),s}else if(l[0]==="`"&&e&&Object.hasOwn(e,l.slice(1))){let B=l.slice(1);d(this._trace(g,e[B],y2(A,B),e,B,o,a,!0))}else if(l.includes(",")){let B=l.split(",");for(let u of B)d(this._trace(UM(u,g),e,A,t,n,o,!0))}else!r&&e&&Object.hasOwn(e,l)&&d(this._trace(g,e[l],y2(A,l),e,l,o,a,!0))}if(this._hasParentSelector)for(let B=0;B{e(A)})};Qo.prototype._slice=function(i,e,A,t,n,o,a){if(!Array.isArray(A))return;let r=A.length,s=i.split(":"),l=s[2]&&Number.parseInt(s[2])||1,g=s[0]&&Number.parseInt(s[0])||0,C=s[1]&&Number.parseInt(s[1])||r;g=g<0?Math.max(0,g+r):Math.min(r,g),C=C<0?Math.max(0,C+r):Math.min(r,C);let d=[];for(let B=g;B{d.push(E)});return d};Qo.prototype._eval=function(i,e,A,t,n,o){this.currSandbox._$_parentProperty=o,this.currSandbox._$_parent=n,this.currSandbox._$_property=A,this.currSandbox._$_root=this.json,this.currSandbox._$_v=e;let a=i.includes("@path");a&&(this.currSandbox._$_path=Qo.toPathString(t.concat([A])));let r=this.currEval+"Script:"+i;if(!Qo.cache[r]){let s=i.replaceAll("@parentProperty","_$_parentProperty").replaceAll("@parent","_$_parent").replaceAll("@property","_$_property").replaceAll("@root","_$_root").replaceAll(/@([.\s)[])/gu,"_$_v$1");if(a&&(s=s.replaceAll("@path","_$_path")),this.currEval==="safe"||this.currEval===!0||this.currEval===void 0)Qo.cache[r]=new this.safeVm.Script(s);else if(this.currEval==="native")Qo.cache[r]=new this.vm.Script(s);else if(typeof this.currEval=="function"&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,"runInNewContext")){let l=this.currEval;Qo.cache[r]=new l(s)}else if(typeof this.currEval=="function")Qo.cache[r]={runInNewContext:l=>this.currEval(s,l)};else throw new TypeError(`Unknown "eval" property "${this.currEval}"`)}try{return Qo.cache[r].runInNewContext(this.currSandbox)}catch(s){if(this.ignoreEvalErrors)return!1;throw new Error("jsonPath: "+s.message+": "+i)}};Qo.cache={};Qo.toPathString=function(i){let e=i,A=e.length,t="$";for(let n=1;ntypeof e[l]=="function");let o=t.map(l=>e[l]);A=n.reduce((l,g)=>{let C=e[g].toString();return/function/u.test(C)||(C="function "+C),"var "+g+"="+C+";"+l},"")+A,!/(['"])use strict\1/u.test(A)&&!t.includes("arguments")&&(A="var arguments = undefined;"+A),A=A.replace(/;\s*$/u,"");let r=A.lastIndexOf(";"),s=r!==-1?A.slice(0,r+1)+" return "+A.slice(r+1):" return "+A;return new Function(...t,s)(...o)}};Qo.prototype.vm={Script:OM};var YM=[],mJ=[];(()=>{let i="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,A=0;e>1;if(i=mJ[t])e=t+1;else return!0;if(e==A)return!1}}function uJ(i){return i>=127462&&i<=127487}var pJ=8205;function wJ(i,e,A=!0,t=!0){return(A?yJ:kgA)(i,e,t)}function yJ(i,e,A){if(e==i.length)return e;e&&DJ(i.charCodeAt(e))&&vJ(i.charCodeAt(e-1))&&e--;let t=JM(i,e);for(e+=fJ(t);e=0&&uJ(JM(i,a));)o++,a-=2;if(o%2==0)break;e+=2}else break}return e}function kgA(i,e,A){for(;e>0;){let t=yJ(i,e-2,A);if(t=56320&&i<57344}function vJ(i){return i>=55296&&i<56320}function fJ(i){return i<65536?1:2}var On=class i{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,A,t){[e,A]=qB(this,e,A);let n=[];return this.decompose(0,e,n,2),t.length&&t.decompose(0,t.length,n,3),this.decompose(A,this.length,n,1),PB.from(n,this.length-(A-e)+t.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,A=this.length){[e,A]=qB(this,e,A);let t=[];return this.decompose(e,A,t,0),PB.from(t,A-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let A=this.scanIdentical(e,1),t=this.length-this.scanIdentical(e,-1),n=new Qd(this),o=new Qd(e);for(let a=A,r=A;;){if(n.next(a),o.next(a),a=0,n.lineBreak!=o.lineBreak||n.done!=o.done||n.value!=o.value)return!1;if(r+=n.value.length,n.done||r>=t)return!0}}iter(e=1){return new Qd(this,e)}iterRange(e,A=this.length){return new _6(this,e,A)}iterLines(e,A){let t;if(e==null)t=this.iter();else{A==null&&(A=this.lines+1);let n=this.line(e).from;t=this.iterRange(n,Math.max(n,A==this.lines+1?this.length:A<=1?0:this.line(A-1).to))}return new x6(t)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?i.empty:e.length<=32?new xl(e):PB.from(xl.split(e,[]))}},xl=class i extends On{constructor(e,A=_gA(e)){super(),this.text=e,this.length=A}get lines(){return this.text.length}get children(){return null}lineInner(e,A,t,n){for(let o=0;;o++){let a=this.text[o],r=n+a.length;if((A?t:r)>=e)return new PM(n,r,t,a);n=r+1,t++}}decompose(e,A,t,n){let o=e<=0&&A>=this.length?this:new i(bJ(this.text,e,A),Math.min(A,this.length)-Math.max(0,e));if(n&1){let a=t.pop(),r=k6(o.text,a.text.slice(),0,o.length);if(r.length<=32)t.push(new i(r,a.length+o.length));else{let s=r.length>>1;t.push(new i(r.slice(0,s)),new i(r.slice(s)))}}else t.push(o)}replace(e,A,t){if(!(t instanceof i))return super.replace(e,A,t);[e,A]=qB(this,e,A);let n=k6(this.text,k6(t.text,bJ(this.text,0,e)),A),o=this.length+t.length-(A-e);return n.length<=32?new i(n,o):PB.from(i.split(n,[]),o)}sliceString(e,A=this.length,t=` -`){[e,A]=qB(this,e,A);let n="";for(let o=0,a=0;o<=A&&ae&&a&&(n+=t),eo&&(n+=r.slice(Math.max(0,e-o),A-o)),o=s+1}return n}flatten(e){for(let A of this.text)e.push(A)}scanIdentical(){return 0}static split(e,A){let t=[],n=-1;for(let o of e)t.push(o),n+=o.length+1,t.length==32&&(A.push(new i(t,n)),t=[],n=-1);return n>-1&&A.push(new i(t,n)),A}},PB=class i extends On{constructor(e,A){super(),this.children=e,this.length=A,this.lines=0;for(let t of e)this.lines+=t.lines}lineInner(e,A,t,n){for(let o=0;;o++){let a=this.children[o],r=n+a.length,s=t+a.lines-1;if((A?s:r)>=e)return a.lineInner(e,A,t,n);n=r+1,t=s+1}}decompose(e,A,t,n){for(let o=0,a=0;a<=A&&o=a){let l=n&((a<=e?1:0)|(s>=A?2:0));a>=e&&s<=A&&!l?t.push(r):r.decompose(e-a,A-a,t,l)}a=s+1}}replace(e,A,t){if([e,A]=qB(this,e,A),t.lines=o&&A<=r){let s=a.replace(e-o,A-o,t),l=this.lines-a.lines+s.lines;if(s.lines>4&&s.lines>l>>6){let g=this.children.slice();return g[n]=s,new i(g,this.length-(A-e)+t.length)}return super.replace(o,r,s)}o=r+1}return super.replace(e,A,t)}sliceString(e,A=this.length,t=` -`){[e,A]=qB(this,e,A);let n="";for(let o=0,a=0;oe&&o&&(n+=t),ea&&(n+=r.sliceString(e-a,A-a,t)),a=s+1}return n}flatten(e){for(let A of this.children)A.flatten(e)}scanIdentical(e,A){if(!(e instanceof i))return 0;let t=0,[n,o,a,r]=A>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;n+=A,o+=A){if(n==a||o==r)return t;let s=this.children[n],l=e.children[o];if(s!=l)return t+s.scanIdentical(l,A);t+=s.length+1}}static from(e,A=e.reduce((t,n)=>t+n.length+1,-1)){let t=0;for(let B of e)t+=B.lines;if(t<32){let B=[];for(let u of e)u.flatten(B);return new xl(B,A)}let n=Math.max(32,t>>5),o=n<<1,a=n>>1,r=[],s=0,l=-1,g=[];function C(B){let u;if(B.lines>o&&B instanceof i)for(let E of B.children)C(E);else B.lines>a&&(s>a||!s)?(d(),r.push(B)):B instanceof xl&&s&&(u=g[g.length-1])instanceof xl&&B.lines+u.lines<=32?(s+=B.lines,l+=B.length+1,g[g.length-1]=new xl(u.text.concat(B.text),u.length+1+B.length)):(s+B.lines>n&&d(),s+=B.lines,l+=B.length+1,g.push(B))}function d(){s!=0&&(r.push(g.length==1?g[0]:i.from(g,l)),l=-1,s=g.length=0)}for(let B of e)C(B);return d(),r.length==1?r[0]:new i(r,A)}};On.empty=new xl([""],0);function _gA(i){let e=-1;for(let A of i)e+=A.length+1;return e}function k6(i,e,A=0,t=1e9){for(let n=0,o=0,a=!0;o=A&&(s>t&&(r=r.slice(0,t-n)),n0?1:(e instanceof xl?e.text.length:e.children.length)<<1]}nextInner(e,A){for(this.done=this.lineBreak=!1;;){let t=this.nodes.length-1,n=this.nodes[t],o=this.offsets[t],a=o>>1,r=n instanceof xl?n.text.length:n.children.length;if(a==(A>0?r:0)){if(t==0)return this.done=!0,this.value="",this;A>0&&this.offsets[t-1]++,this.nodes.pop(),this.offsets.pop()}else if((o&1)==(A>0?0:1)){if(this.offsets[t]+=A,e==0)return this.lineBreak=!0,this.value=` -`,this;e--}else if(n instanceof xl){let s=n.text[a+(A<0?-1:0)];if(this.offsets[t]+=A,s.length>Math.max(0,e))return this.value=e==0?s:A>0?s.slice(e):s.slice(0,s.length-e),this;e-=s.length}else{let s=n.children[a+(A<0?-1:0)];e>s.length?(e-=s.length,this.offsets[t]+=A):(A<0&&this.offsets[t]--,this.nodes.push(s),this.offsets.push(A>0?1:(s instanceof xl?s.text.length:s.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},_6=class{constructor(e,A,t){this.value="",this.done=!1,this.cursor=new Qd(e,A>t?-1:1),this.pos=A>t?e.length:0,this.from=Math.min(A,t),this.to=Math.max(A,t)}nextInner(e,A){if(A<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,A<0?this.pos-this.to:this.from-this.pos);let t=A<0?this.pos-this.from:this.to-this.pos;e>t&&(e=t),t-=e;let{value:n}=this.cursor.next(e);return this.pos+=(n.length+e)*A,this.value=n.length<=t?n:A<0?n.slice(n.length-t):n.slice(0,t),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},x6=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:A,lineBreak:t,value:n}=this.inner.next(e);return A&&this.afterBreak?(this.value="",this.afterBreak=!1):A?(this.done=!0,this.value=""):t?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<"u"&&(On.prototype[Symbol.iterator]=function(){return this.iter()},Qd.prototype[Symbol.iterator]=_6.prototype[Symbol.iterator]=x6.prototype[Symbol.iterator]=function(){return this});var PM=class{constructor(e,A,t,n){this.from=e,this.to=A,this.number=t,this.text=n}get length(){return this.to-this.from}};function qB(i,e,A){return e=Math.max(0,Math.min(i.length,e)),[e,Math.max(e,Math.min(i.length,A))]}function tr(i,e,A=!0,t=!0){return wJ(i,e,A,t)}function xgA(i){return i>=56320&&i<57344}function RgA(i){return i>=55296&&i<56320}function $r(i,e){let A=i.charCodeAt(e);if(!RgA(A)||e+1==i.length)return A;let t=i.charCodeAt(e+1);return xgA(t)?(A-55296<<10)+(t-56320)+65536:A}function qu(i){return i<=65535?String.fromCharCode(i):(i-=65536,String.fromCharCode((i>>10)+55296,(i&1023)+56320))}function Rl(i){return i<65536?1:2}var jM=/\r\n?|\n/,Wr=(function(i){return i[i.Simple=0]="Simple",i[i.TrackDel=1]="TrackDel",i[i.TrackBefore=2]="TrackBefore",i[i.TrackAfter=3]="TrackAfter",i})(Wr||(Wr={})),v2=class i{constructor(e){this.sections=e}get length(){let e=0;for(let A=0;Ae)return o+(e-n);o+=r}else{if(t!=Wr.Simple&&l>=e&&(t==Wr.TrackDel&&ne||t==Wr.TrackBefore&&ne))return null;if(l>e||l==e&&A<0&&!r)return e==n||A<0?o:o+s;o+=s}n=l}if(e>n)throw new RangeError(`Position ${e} is out of range for changeset of length ${n}`);return o}touchesRange(e,A=e){for(let t=0,n=0;t=0&&n<=A&&r>=e)return nA?"cover":!0;n=r}return!1}toString(){let e="";for(let A=0;A=0?":"+n:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(A=>typeof A!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new i(e)}static create(e){return new i(e)}},Zr=class i extends v2{constructor(e,A){super(e),this.inserted=A}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return VM(this,(A,t,n,o,a)=>e=e.replace(n,n+(t-A),a),!1),e}mapDesc(e,A=!1){return qM(this,e,A,!0)}invert(e){let A=this.sections.slice(),t=[];for(let n=0,o=0;n=0){A[n]=r,A[n+1]=a;let s=n>>1;for(;t.length0&&D2(t,A,o.text),o.forward(g),r+=g}let l=e[a++];for(;r>1].toJSON()))}return e}static of(e,A,t){let n=[],o=[],a=0,r=null;function s(g=!1){if(!g&&!n.length)return;ad||C<0||d>A)throw new RangeError(`Invalid change range ${C} to ${d} (in doc of length ${A})`);let u=B?typeof B=="string"?On.of(B.split(t||jM)):B:On.empty,E=u.length;if(C==d&&E==0)return;Ca&&ws(n,C-a,-1),ws(n,d-C,E),D2(o,n,u),a=d}}return l(e),s(!r),r}static empty(e){return new i(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let A=[],t=[];for(let n=0;nr&&typeof a!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(o.length==1)A.push(o[0],0);else{for(;t.length=0&&A<=0&&A==i[n+1]?i[n]+=e:n>=0&&e==0&&i[n]==0?i[n+1]+=A:t?(i[n]+=e,i[n+1]+=A):i.push(e,A)}function D2(i,e,A){if(A.length==0)return;let t=e.length-2>>1;if(t>1])),!(A||a==i.sections.length||i.sections[a+1]<0);)r=i.sections[a++],s=i.sections[a++];e(n,l,o,g,C),n=l,o=g}}}function qM(i,e,A,t=!1){let n=[],o=t?[]:null,a=new ud(i),r=new ud(e);for(let s=-1;;){if(a.done&&r.len||r.done&&a.len)throw new Error("Mismatched change set lengths");if(a.ins==-1&&r.ins==-1){let l=Math.min(a.len,r.len);ws(n,l,-1),a.forward(l),r.forward(l)}else if(r.ins>=0&&(a.ins<0||s==a.i||a.off==0&&(r.len=0&&s=0){let l=0,g=a.len;for(;g;)if(r.ins==-1){let C=Math.min(g,r.len);l+=C,g-=C,r.forward(C)}else if(r.ins==0&&r.lens||a.ins>=0&&a.len>s)&&(r||t.length>l),o.forward2(s),a.forward(s)}}}}var ud=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return A>=e.length?On.empty:e[A]}textBit(e){let{inserted:A}=this.set,t=this.i-2>>1;return t>=A.length&&!e?On.empty:A[t].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},zB=class i{constructor(e,A,t){this.from=e,this.to=A,this.flags=t}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}get goalColumn(){let e=this.flags>>6;return e==16777215?void 0:e}map(e,A=-1){let t,n;return this.empty?t=n=e.mapPos(this.from,A):(t=e.mapPos(this.from,1),n=e.mapPos(this.to,-1)),t==this.from&&n==this.to?this:new i(t,n,this.flags)}extend(e,A=e,t=0){if(e<=this.anchor&&A>=this.anchor)return Be.range(e,A,void 0,void 0,t);let n=Math.abs(e-this.anchor)>Math.abs(A-this.anchor)?e:A;return Be.range(this.anchor,n,void 0,void 0,t)}eq(e,A=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!A||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return Be.range(e.anchor,e.head)}static create(e,A,t){return new i(e,A,t)}},Be=class i{constructor(e,A){this.ranges=e,this.mainIndex=A}map(e,A=-1){return e.empty?this:i.create(this.ranges.map(t=>t.map(e,A)),this.mainIndex)}eq(e,A=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let t=0;te.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new i(e.ranges.map(A=>zB.fromJSON(A)),e.main)}static single(e,A=e){return new i([i.range(e,A)],0)}static create(e,A=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let t=0,n=0;nn.from-o.from),A=e.indexOf(t);for(let n=1;no.head?i.range(s,r):i.range(r,s))}}return new i(e,A)}};function FJ(i,e){for(let A of i.ranges)if(A.to>e)throw new RangeError("Selection points outside of document")}var n9=0,nt=class i{constructor(e,A,t,n,o){this.combine=e,this.compareInput=A,this.compare=t,this.isStatic=n,this.id=n9++,this.default=e([]),this.extensions=typeof o=="function"?o(this):o}get reader(){return this}static define(e={}){return new i(e.combine||(A=>A),e.compareInput||((A,t)=>A===t),e.compare||(e.combine?(A,t)=>A===t:o9),!!e.static,e.enables)}of(e){return new jB([],this,0,e)}compute(e,A){if(this.isStatic)throw new Error("Can't compute a static facet");return new jB(e,this,1,A)}computeN(e,A){if(this.isStatic)throw new Error("Can't compute a static facet");return new jB(e,this,2,A)}from(e,A){return A||(A=t=>t),this.compute([e],t=>A(t.field(e)))}};function o9(i,e){return i==e||i.length==e.length&&i.every((A,t)=>A===e[t])}var jB=class{constructor(e,A,t,n){this.dependencies=e,this.facet=A,this.type=t,this.value=n,this.id=n9++}dynamicSlot(e){var A;let t=this.value,n=this.facet.compareInput,o=this.id,a=e[o]>>1,r=this.type==2,s=!1,l=!1,g=[];for(let C of this.dependencies)C=="doc"?s=!0:C=="selection"?l=!0:(((A=e[C.id])!==null&&A!==void 0?A:1)&1)==0&&g.push(e[C.id]);return{create(C){return C.values[a]=t(C),1},update(C,d){if(s&&d.docChanged||l&&(d.docChanged||d.selection)||WM(C,g)){let B=t(C);if(r?!MJ(B,C.values[a],n):!n(B,C.values[a]))return C.values[a]=B,1}return 0},reconfigure:(C,d)=>{let B,u=d.config.address[o];if(u!=null){let E=F6(d,u);if(this.dependencies.every(f=>f instanceof nt?d.facet(f)===C.facet(f):f instanceof La?d.field(f,!1)==C.field(f,!1):!0)||(r?MJ(B=t(C),E,n):n(B=t(C),E)))return C.values[a]=E,0}else B=t(C);return C.values[a]=B,1}}}};function MJ(i,e,A){if(i.length!=e.length)return!1;for(let t=0;ti[s.id]),n=A.map(s=>s.type),o=t.filter(s=>!(s&1)),a=i[e.id]>>1;function r(s){let l=[];for(let g=0;gt===n),e);return e.provide&&(A.provides=e.provide(A)),A}create(e){let A=e.facet(b6).find(t=>t.field==this);return(A?.create||this.createF)(e)}slot(e){let A=e[this.id]>>1;return{create:t=>(t.values[A]=this.create(t),1),update:(t,n)=>{let o=t.values[A],a=this.updateF(o,n);return this.compareF(o,a)?0:(t.values[A]=a,1)},reconfigure:(t,n)=>{let o=t.facet(b6),a=n.facet(b6),r;return(r=o.find(s=>s.field==this))&&r!=a.find(s=>s.field==this)?(t.values[A]=r.create(t),1):n.config.address[this.id]!=null?(t.values[A]=n.field(this),0):(t.values[A]=this.create(t),1)}}}init(e){return[this,b6.of({field:this,create:e})]}get extension(){return this}},hd={lowest:4,low:3,default:2,high:1,highest:0};function Hu(i){return e=>new R6(e,i)}var oc={highest:Hu(hd.highest),high:Hu(hd.high),default:Hu(hd.default),low:Hu(hd.low),lowest:Hu(hd.lowest)},R6=class{constructor(e,A){this.inner=e,this.prec=A}},g0=class i{of(e){return new Pu(this,e)}reconfigure(e){return i.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}},Pu=class{constructor(e,A){this.compartment=e,this.inner=A}},N6=class i{constructor(e,A,t,n,o,a){for(this.base=e,this.compartments=A,this.dynamicSlots=t,this.address=n,this.staticValues=o,this.facets=a,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,A,t){let n=[],o=Object.create(null),a=new Map;for(let d of FgA(e,A,a))d instanceof La?n.push(d):(o[d.facet.id]||(o[d.facet.id]=[])).push(d);let r=Object.create(null),s=[],l=[];for(let d of n)r[d.id]=l.length<<1,l.push(B=>d.slot(B));let g=t?.config.facets;for(let d in o){let B=o[d],u=B[0].facet,E=g&&g[d]||[];if(B.every(f=>f.type==0))if(r[u.id]=s.length<<1|1,o9(E,B))s.push(t.facet(u));else{let f=u.combine(B.map(m=>m.value));s.push(t&&u.compare(f,t.facet(u))?t.facet(u):f)}else{for(let f of B)f.type==0?(r[f.id]=s.length<<1|1,s.push(f.value)):(r[f.id]=l.length<<1,l.push(m=>f.dynamicSlot(m)));r[u.id]=l.length<<1,l.push(f=>NgA(f,u,B))}}let C=l.map(d=>d(r));return new i(e,a,C,r,s,o)}};function FgA(i,e,A){let t=[[],[],[],[],[]],n=new Map;function o(a,r){let s=n.get(a);if(s!=null){if(s<=r)return;let l=t[s].indexOf(a);l>-1&&t[s].splice(l,1),a instanceof Pu&&A.delete(a.compartment)}if(n.set(a,r),Array.isArray(a))for(let l of a)o(l,r);else if(a instanceof Pu){if(A.has(a.compartment))throw new RangeError("Duplicate use of compartment in extensions");let l=e.get(a.compartment)||a.inner;A.set(a.compartment,l),o(l,r)}else if(a instanceof R6)o(a.inner,a.prec);else if(a instanceof La)t[r].push(a),a.provides&&o(a.provides,r);else if(a instanceof jB)t[r].push(a),a.facet.extensions&&o(a.facet.extensions,hd.default);else{let l=a.extension;if(!l)throw new Error(`Unrecognized extension value in extension set (${a}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);o(l,r)}}return o(i,hd.default),t.reduce((a,r)=>a.concat(r))}function zu(i,e){if(e&1)return 2;let A=e>>1,t=i.status[A];if(t==4)throw new Error("Cyclic dependency between fields and/or facets");if(t&2)return t;i.status[A]=4;let n=i.computeSlot(i,i.config.dynamicSlots[A]);return i.status[A]=2|n}function F6(i,e){return e&1?i.config.staticValues[e>>1]:i.values[e>>1]}var SJ=nt.define(),HM=nt.define({combine:i=>i.some(e=>e),static:!0}),LJ=nt.define({combine:i=>i.length?i[0]:void 0,static:!0}),GJ=nt.define(),KJ=nt.define(),UJ=nt.define(),kJ=nt.define({combine:i=>i.length?i[0]:!1}),sl=class{constructor(e,A){this.type=e,this.value=A}static define(){return new ZM}},ZM=class{of(e){return new sl(this,e)}},XM=class{constructor(e){this.map=e}of(e){return new ln(this,e)}},ln=(()=>{class i{constructor(A,t){this.type=A,this.value=t}map(A){let t=this.type.map(this.value,A);return t===void 0?void 0:t==this.value?this:new i(this.type,t)}is(A){return this.type==A}static define(A={}){return new XM(A.map||(t=>t))}static mapEffects(A,t){if(!A.length)return A;let n=[];for(let o of A){let a=o.map(t);a&&n.push(a)}return n}}return i.reconfigure=i.define(),i.appendConfig=i.define(),i})(),l0=(()=>{class i{constructor(A,t,n,o,a,r){this.startState=A,this.changes=t,this.selection=n,this.effects=o,this.annotations=a,this.scrollIntoView=r,this._doc=null,this._state=null,n&&FJ(n,t.newLength),a.some(s=>s.type==i.time)||(this.annotations=a.concat(i.time.of(Date.now())))}static create(A,t,n,o,a,r){return new i(A,t,n,o,a,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(A){for(let t of this.annotations)if(t.type==A)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(A){let t=this.annotation(i.userEvent);return!!(t&&(t==A||t.length>A.length&&t.slice(0,A.length)==A&&t[A.length]=="."))}}return i.time=sl.define(),i.userEvent=sl.define(),i.addToHistory=sl.define(),i.remote=sl.define(),i})();function LgA(i,e){let A=[];for(let t=0,n=0;;){let o,a;if(t=i[t]))o=i[t++],a=i[t++];else if(n=0;n--){let o=t[n](i);o instanceof l0?i=o:Array.isArray(o)&&o.length==1&&o[0]instanceof l0?i=o[0]:i=OJ(e,VB(o),!1)}return i}function KgA(i){let e=i.startState,A=e.facet(UJ),t=i;for(let n=A.length-1;n>=0;n--){let o=A[n](i);o&&Object.keys(o).length&&(t=TJ(t,$M(e,o,i.changes.newLength),!0))}return t==i?i:l0.create(e,i.changes,i.selection,t.effects,t.annotations,t.scrollIntoView)}var UgA=[];function VB(i){return i==null?UgA:Array.isArray(i)?i:[i]}var $o=(function(i){return i[i.Word=0]="Word",i[i.Space=1]="Space",i[i.Other=2]="Other",i})($o||($o={})),TgA=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,A9;try{A9=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch(i){}function OgA(i){if(A9)return A9.test(i);for(let e=0;e"\x80"&&(A.toUpperCase()!=A.toLowerCase()||TgA.test(A)))return!0}return!1}function JgA(i){return e=>{if(!/\S/.test(e))return $o.Space;if(OgA(e))return $o.Word;for(let A=0;A-1)return $o.Word;return $o.Other}}var ir=(()=>{class i{constructor(A,t,n,o,a,r){this.config=A,this.doc=t,this.selection=n,this.values=o,this.status=A.statusTemplate.slice(),this.computeSlot=a,r&&(r._state=this);for(let s=0;so.set(g,l)),t=null),o.set(s.value.compartment,s.value.extension)):s.is(ln.reconfigure)?(t=null,n=s.value):s.is(ln.appendConfig)&&(t=null,n=VB(n).concat(s.value));let a;t?a=A.startState.values.slice():(t=N6.resolve(n,o,this),a=new i(t,this.doc,this.selection,t.dynamicSlots.map(()=>null),(l,g)=>g.reconfigure(l,this),null).values);let r=A.startState.facet(HM)?A.newSelection:A.newSelection.asSingle();new i(t,A.newDoc,r,a,(s,l)=>l.update(s,A),A)}replaceSelection(A){return typeof A=="string"&&(A=this.toText(A)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:A},range:Be.cursor(t.from+A.length)}))}changeByRange(A){let t=this.selection,n=A(t.ranges[0]),o=this.changes(n.changes),a=[n.range],r=VB(n.effects);for(let s=1;sr.spec.fromJSON(s,l)))}}return i.create({doc:A.doc,selection:Be.fromJSON(A.selection),extensions:t.extensions?o.concat([t.extensions]):o})}static create(A={}){let t=N6.resolve(A.extensions||[],new Map),n=A.doc instanceof On?A.doc:On.of((A.doc||"").split(t.staticFacet(i.lineSeparator)||jM)),o=A.selection?A.selection instanceof Be?A.selection:Be.single(A.selection.anchor,A.selection.head):Be.single(0);return FJ(o,n.length),t.staticFacet(HM)||(o=o.asSingle()),new i(t,n,o,t.dynamicSlots.map(()=>null),(a,r)=>r.create(a),null)}get tabSize(){return this.facet(i.tabSize)}get lineBreak(){return this.facet(i.lineSeparator)||` -`}get readOnly(){return this.facet(kJ)}phrase(A,...t){for(let n of this.facet(i.phrases))if(Object.prototype.hasOwnProperty.call(n,A)){A=n[A];break}return t.length&&(A=A.replace(/\$(\$|\d*)/g,(n,o)=>{if(o=="$")return"$";let a=+(o||1);return!a||a>t.length?n:t[a-1]})),A}languageDataAt(A,t,n=-1){let o=[];for(let a of this.facet(SJ))for(let r of a(this,t,n))Object.prototype.hasOwnProperty.call(r,A)&&o.push(r[A]);return o}charCategorizer(A){let t=this.languageDataAt("wordChars",A);return JgA(t.length?t[0]:"")}wordAt(A){let{text:t,from:n,length:o}=this.doc.lineAt(A),a=this.charCategorizer(A),r=A-n,s=A-n;for(;r>0;){let l=tr(t,r,!1);if(a(t.slice(l,r))!=$o.Word)break;r=l}for(;se.length?e[0]:4}),i.lineSeparator=LJ,i.readOnly=kJ,i.phrases=nt.define({compare(e,A){let t=Object.keys(e),n=Object.keys(A);return t.length==n.length&&t.every(o=>e[o]==A[o])}}),i.languageData=SJ,i.changeFilter=GJ,i.transactionFilter=KJ,i.transactionExtender=UJ,i})();g0.reconfigure=ln.define();function Lr(i,e,A={}){let t={};for(let n of i)for(let o of Object.keys(n)){let a=n[o],r=t[o];if(r===void 0)t[o]=a;else if(!(r===a||a===void 0))if(Object.hasOwnProperty.call(A,o))t[o]=A[o](r,a);else throw new Error("Config merge conflict for field "+o)}for(let n in e)t[n]===void 0&&(t[n]=e[n]);return t}var cg=class{eq(e){return this==e}range(e,A=e){return ju.create(e,A,this)}};cg.prototype.startSide=cg.prototype.endSide=0;cg.prototype.point=!1;cg.prototype.mapMode=Wr.TrackDel;function a9(i,e){return i==e||i.constructor==e.constructor&&i.eq(e)}var ju=class i{constructor(e,A,t){this.from=e,this.to=A,this.value=t}static create(e,A,t){return new i(e,A,t)}};function e9(i,e){return i.from-e.from||i.value.startSide-e.value.startSide}var t9=class i{constructor(e,A,t,n){this.from=e,this.to=A,this.value=t,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(e,A,t,n=0){let o=t?this.to:this.from;for(let a=n,r=o.length;;){if(a==r)return a;let s=a+r>>1,l=o[s]-e||(t?this.value[s].endSide:this.value[s].startSide)-A;if(s==a)return l>=0?a:r;l>=0?r=s:a=s+1}}between(e,A,t,n){for(let o=this.findIndex(A,-1e9,!0),a=this.findIndex(t,1e9,!1,o);oB||d==B&&l.startSide>0&&l.endSide<=0)continue;(B-d||l.endSide-l.startSide)<0||(a<0&&(a=d),l.point&&(r=Math.max(r,B-d)),t.push(l),n.push(d-a),o.push(B-a))}return{mapped:t.length?new i(n,o,t,r):null,pos:a}}},uo=(()=>{class i{constructor(A,t,n,o){this.chunkPos=A,this.chunk=t,this.nextLayer=n,this.maxPoint=o}static create(A,t,n,o){return new i(A,t,n,o)}get length(){let A=this.chunk.length-1;return A<0?0:Math.max(this.chunkEnd(A),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let A=this.nextLayer.size;for(let t of this.chunk)A+=t.value.length;return A}chunkEnd(A){return this.chunkPos[A]+this.chunk[A].length}update(A){let{add:t=[],sort:n=!1,filterFrom:o=0,filterTo:a=this.length}=A,r=A.filter;if(t.length==0&&!r)return this;if(n&&(t=t.slice().sort(e9)),this.isEmpty)return t.length?i.of(t):this;let s=new L6(this,null,-1).goto(0),l=0,g=[],C=new Xr;for(;s.value||l=0){let d=t[l++];C.addInner(d.from,d.to,d.value)||g.push(d)}else s.rangeIndex==1&&s.chunkIndexthis.chunkEnd(s.chunkIndex)||as.to||a=a&&A<=a+r.length&&r.between(a,A-a,t-a,n)===!1)return}this.nextLayer.between(A,t,n)}}iter(A=0){return Vu.from([this]).goto(A)}get isEmpty(){return this.nextLayer==this}static iter(A,t=0){return Vu.from(A).goto(t)}static compare(A,t,n,o,a=-1){let r=A.filter(d=>d.maxPoint>0||!d.isEmpty&&d.maxPoint>=a),s=t.filter(d=>d.maxPoint>0||!d.isEmpty&&d.maxPoint>=a),l=_J(r,s,n),g=new Ed(r,l,a),C=new Ed(s,l,a);n.iterGaps((d,B,u)=>xJ(g,d,C,B,u,o)),n.empty&&n.length==0&&xJ(g,0,C,0,0,o)}static eq(A,t,n=0,o){o==null&&(o=999999999);let a=A.filter(C=>!C.isEmpty&&t.indexOf(C)<0),r=t.filter(C=>!C.isEmpty&&A.indexOf(C)<0);if(a.length!=r.length)return!1;if(!a.length)return!0;let s=_J(a,r),l=new Ed(a,s,0).goto(n),g=new Ed(r,s,0).goto(n);for(;;){if(l.to!=g.to||!i9(l.active,g.active)||l.point&&(!g.point||!a9(l.point,g.point)))return!1;if(l.to>o)return!0;l.next(),g.next()}}static spans(A,t,n,o,a=-1){let r=new Ed(A,null,a).goto(t),s=t,l=r.openStart;for(;;){let g=Math.min(r.to,n);if(r.point){let C=r.activeForPoint(r.to),d=r.pointFroms&&(o.span(s,g,r.active,l),l=r.openEnd(g));if(r.to>n)return l+(r.point&&r.to>n?1:0);s=r.to,r.next()}}static of(A,t=!1){let n=new Xr;for(let o of A instanceof ju?[A]:t?YgA(A):A)n.add(o.from,o.to,o.value);return n.finish()}static join(A){if(!A.length)return i.empty;let t=A[A.length-1];for(let n=A.length-2;n>=0;n--)for(let o=A[n];o!=i.empty;o=o.nextLayer)t=new i(o.chunkPos,o.chunk,t,Math.max(o.maxPoint,t.maxPoint));return t}}return i.empty=new i([],[],null,-1),i})();function YgA(i){if(i.length>1)for(let e=i[0],A=1;A0)return i.slice().sort(e9);e=t}return i}uo.empty.nextLayer=uo.empty;var Xr=class i{finishChunk(e){this.chunks.push(new t9(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,A,t){this.addInner(e,A,t)||(this.nextLayer||(this.nextLayer=new i)).add(e,A,t)}addInner(e,A,t){let n=e-this.lastTo||t.startSide-this.last.endSide;if(n<=0&&(e-this.lastFrom||t.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(A-this.chunkStart),this.last=t,this.lastFrom=e,this.lastTo=A,this.value.push(t),t.point&&(this.maxPoint=Math.max(this.maxPoint,A-e)),!0)}addChunk(e,A){if((e-this.lastTo||A.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,A.maxPoint),this.chunks.push(A),this.chunkPos.push(e);let t=A.value.length-1;return this.last=A.value[t],this.lastFrom=A.from[t]+e,this.lastTo=A.to[t]+e,!0}finish(){return this.finishInner(uo.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let A=uo.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,A}};function _J(i,e,A){let t=new Map;for(let o of i)for(let a=0;a=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=t&&n.push(new L6(a,A,t,o));return n.length==1?n[0]:new i(n)}get startSide(){return this.value?this.value.startSide:0}goto(e,A=-1e9){for(let t of this.heap)t.goto(e,A);for(let t=this.heap.length>>1;t>=0;t--)zM(this.heap,t);return this.next(),this}forward(e,A){for(let t of this.heap)t.forward(e,A);for(let t=this.heap.length>>1;t>=0;t--)zM(this.heap,t);(this.to-e||this.value.endSide-A)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),zM(this.heap,0)}}};function zM(i,e){for(let A=i[e];;){let t=(e<<1)+1;if(t>=i.length)break;let n=i[t];if(t+1=0&&(n=i[t+1],t++),A.compare(n)<0)break;i[t]=A,i[e]=n,e=t}}var Ed=class{constructor(e,A,t){this.minPoint=t,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Vu.from(e,A,t)}goto(e,A=-1e9){return this.cursor.goto(e,A),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=A,this.openStart=-1,this.next(),this}forward(e,A){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-A)<0;)this.removeActive(this.minActive);this.cursor.forward(e,A)}removeActive(e){M6(this.active,e),M6(this.activeTo,e),M6(this.activeRank,e),this.minActive=RJ(this.active,this.activeTo)}addActive(e){let A=0,{value:t,to:n,rank:o}=this.cursor;for(;A0;)A++;S6(this.active,A,t),S6(this.activeTo,A,n),S6(this.activeRank,A,o),e&&S6(e,A,this.cursor.from),this.minActive=RJ(this.active,this.activeTo)}next(){let e=this.to,A=this.point;this.point=null;let t=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>e){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),t&&M6(t,n)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let o=this.cursor.value;if(!o.point)this.addActive(t),this.cursor.next();else if(A&&this.cursor.to==this.to&&this.cursor.from=0&&t[n]=0&&!(this.activeRank[t]e||this.activeTo[t]==e&&this.active[t].endSide>=this.point.endSide)&&A.push(this.active[t]);return A.reverse()}openEnd(e){let A=0;for(let t=this.activeTo.length-1;t>=0&&this.activeTo[t]>e;t--)A++;return A}};function xJ(i,e,A,t,n,o){i.goto(e),A.goto(t);let a=t+n,r=t,s=t-e,l=!!o.boundChange;for(let g=!1;;){let C=i.to+s-A.to,d=C||i.endSide-A.endSide,B=d<0?i.to+s:A.to,u=Math.min(B,a);if(i.point||A.point?(i.point&&A.point&&a9(i.point,A.point)&&i9(i.activeForPoint(i.to),A.activeForPoint(A.to))||o.comparePoint(r,u,i.point,A.point),g=!1):(g&&o.boundChange(r),u>r&&!i9(i.active,A.active)&&o.compareRange(r,u,i.active,A.active),l&&ua)break;r=B,d<=0&&i.next(),d>=0&&A.next()}}function i9(i,e){if(i.length!=e.length)return!1;for(let A=0;A=e;t--)i[t+1]=i[t];i[e]=A}function RJ(i,e){let A=-1,t=1e9;for(let n=0;n=e)return n;if(n==i.length)break;o+=i.charCodeAt(n)==9?A-o%A:1,n=tr(i,n)}return t===!0?-1:i.length}var JJ=typeof Symbol>"u"?"__\u037C":Symbol.for("\u037C"),r9=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),YJ=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{},Cg=class{constructor(e,A){this.rules=[];let{finish:t}=A||{};function n(a){return/^@/.test(a)?[a]:a.split(/,\s*/)}function o(a,r,s,l){let g=[],C=/^@(\w+)\b/.exec(a[0]),d=C&&C[1]=="keyframes";if(C&&r==null)return s.push(a[0]+";");for(let B in r){let u=r[B];if(/&/.test(B))o(B.split(/,\s*/).map(E=>a.map(f=>E.replace(/&/,f))).reduce((E,f)=>E.concat(f)),u,s);else if(u&&typeof u=="object"){if(!C)throw new RangeError("The value of a property ("+B+") should be a primitive value.");o(n(B),u,g,d)}else u!=null&&g.push(B.replace(/_.*/,"").replace(/[A-Z]/g,E=>"-"+E.toLowerCase())+": "+u+";")}(g.length||d)&&s.push((t&&!C&&!l?a.map(t):a).join(", ")+" {"+g.join(" ")+"}")}for(let a in e)o(n(a),e[a],this.rules)}getRules(){return this.rules.join(` -`)}static newName(){let e=YJ[JJ]||1;return YJ[JJ]=e+1,"\u037C"+e.toString(36)}static mount(e,A,t){let n=e[r9],o=t&&t.nonce;n?o&&n.setNonce(o):n=new s9(e,o),n.mount(Array.isArray(A)?A:[A],e)}},HJ=new Map,s9=class{constructor(e,A){let t=e.ownerDocument||e,n=t.defaultView;if(!e.head&&e.adoptedStyleSheets&&n.CSSStyleSheet){let o=HJ.get(t);if(o)return e[r9]=o;this.sheet=new n.CSSStyleSheet,HJ.set(t,this)}else this.styleTag=t.createElement("style"),A&&this.styleTag.setAttribute("nonce",A);this.modules=[],e[r9]=this}mount(e,A){let t=this.sheet,n=0,o=0;for(let a=0;a-1&&(this.modules.splice(s,1),o--,s=-1),s==-1){if(this.modules.splice(o++,0,r),t)for(let l=0;l",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},HgA=typeof navigator<"u"&&/Mac/.test(navigator.platform),zgA=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(lr=0;lr<10;lr++)sC[48+lr]=sC[96+lr]=String(lr);var lr;for(lr=1;lr<=24;lr++)sC[lr+111]="F"+lr;var lr;for(lr=65;lr<=90;lr++)sC[lr]=String.fromCharCode(lr+32),WB[lr]=String.fromCharCode(lr);var lr;for(K6 in sC)WB.hasOwnProperty(K6)||(WB[K6]=sC[K6]);var K6;function zJ(i){var e=HgA&&i.metaKey&&i.shiftKey&&!i.ctrlKey&&!i.altKey||zgA&&i.shiftKey&&i.key&&i.key.length==1||i.key=="Unidentified",A=!e&&i.key||(i.shiftKey?WB:sC)[i.keyCode]||i.key||"Unidentified";return A=="Esc"&&(A="Escape"),A=="Del"&&(A="Delete"),A=="Left"&&(A="ArrowLeft"),A=="Up"&&(A="ArrowUp"),A=="Right"&&(A="ArrowRight"),A=="Down"&&(A="ArrowDown"),A}function po(){var i=arguments[0];typeof i=="string"&&(i=document.createElement(i));var e=1,A=arguments[1];if(A&&typeof A=="object"&&A.nodeType==null&&!Array.isArray(A)){for(var t in A)if(Object.prototype.hasOwnProperty.call(A,t)){var n=A[t];typeof n=="string"?i.setAttribute(t,n):n!=null&&(i[t]=n)}e++}for(;e2),Ct={mac:qJ||/Mac/.test(Us.platform),windows:/Win/.test(Us.platform),linux:/Linux|X11/.test(Us.platform),ie:E8,ie_version:NY?p9.documentMode||6:m9?+m9[1]:f9?+f9[1]:0,gecko:jJ,gecko_version:jJ?+(/Firefox\/(\d+)/.exec(Us.userAgent)||[0,0])[1]:0,chrome:!!l9,chrome_version:l9?+l9[1]:0,ios:qJ,android:/Android\b/.test(Us.userAgent),webkit:VJ,webkit_version:VJ?+(/\bAppleWebKit\/(\d+)/.exec(Us.userAgent)||[0,0])[1]:0,safari:w9,safari_version:w9?+(/\bVersion\/(\d+(\.\d+)?)/.exec(Us.userAgent)||[0,0])[1]:0,tabSize:p9.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"};function IS(i,e){for(let A in i)A=="class"&&e.class?e.class+=" "+i.class:A=="style"&&e.style?e.style+=";"+i.style:e[A]=i[A];return e}var $6=Object.create(null);function BS(i,e,A){if(i==e)return!0;i||(i=$6),e||(e=$6);let t=Object.keys(i),n=Object.keys(e);if(t.length-(A&&t.indexOf(A)>-1?1:0)!=n.length-(A&&n.indexOf(A)>-1?1:0))return!1;for(let o of t)if(o!=A&&(n.indexOf(o)==-1||i[o]!==e[o]))return!1;return!0}function PgA(i,e){for(let A=i.attributes.length-1;A>=0;A--){let t=i.attributes[A].name;e[t]==null&&i.removeAttribute(t)}for(let A in e){let t=e[A];A=="style"?i.style.cssText=t:i.getAttribute(A)!=t&&i.setAttribute(A,t)}}function WJ(i,e,A){let t=!1;if(e)for(let n in e)A&&n in A||(t=!0,n=="style"?i.style.cssText="":i.removeAttribute(n));if(A)for(let n in A)e&&e[n]==A[n]||(t=!0,n=="style"?i.style.cssText=A[n]:i.setAttribute(n,A[n]));return t}function jgA(i){let e=Object.create(null);for(let A=0;A0?3e8:-4e8:A>0?1e8:-1e8,new wd(e,A,A,t,e.widget||null,!1)}static replace(e){let A=!!e.block,t,n;if(e.isBlockGap)t=-5e8,n=4e8;else{let{start:o,end:a}=FY(e,A);t=(o?A?-3e8:-1:5e8)-1,n=(a?A?2e8:1:-6e8)+1}return new wd(e,t,n,A,e.widget||null,!0)}static line(e){return new l4(e)}static set(e,A=!1){return uo.of(e,A)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};Lt.none=uo.empty;var s4=class i extends Lt{constructor(e){let{start:A,end:t}=FY(e);super(A?-1:5e8,t?1:-6e8,null,e),this.tagName=e.tagName||"span",this.attrs=e.class&&e.attributes?IS(e.attributes,{class:e.class}):e.class?{class:e.class}:e.attributes||$6}eq(e){return this==e||e instanceof i&&this.tagName==e.tagName&&BS(this.attrs,e.attrs)}range(e,A=e){if(e>=A)throw new RangeError("Mark decorations may not be empty");return super.range(e,A)}};s4.prototype.point=!1;var l4=class i extends Lt{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof i&&this.spec.class==e.spec.class&&BS(this.spec.attributes,e.spec.attributes)}range(e,A=e){if(A!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,A)}};l4.prototype.mapMode=Wr.TrackBefore;l4.prototype.point=!0;var wd=class i extends Lt{constructor(e,A,t,n,o,a){super(A,t,o,e),this.block=n,this.isReplace=a,this.mapMode=n?A<=0?Wr.TrackBefore:Wr.TrackAfter:Wr.TrackDel}get type(){return this.startSide!=this.endSide?As.WidgetRange:this.startSide<=0?As.WidgetBefore:As.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof i&&VgA(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,A=e){if(this.isReplace&&(e>A||e==A&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&A!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,A)}};wd.prototype.point=!0;function FY(i,e=!1){let{inclusiveStart:A,inclusiveEnd:t}=i;return A==null&&(A=i.inclusive),t==null&&(t=i.inclusive),{start:A??e,end:t??e}}function VgA(i,e){return i==e||!!(i&&e&&i.compare(e))}function th(i,e,A,t=0){let n=A.length-1;n>=0&&A[n]+t>=i?A[n]=Math.max(A[n],e):A.push(i,e)}var A8=class i extends cg{constructor(e,A){super(),this.tagName=e,this.attributes=A}eq(e){return e==this||e instanceof i&&this.tagName==e.tagName&&BS(this.attributes,e.attributes)}static create(e){return new i(e.tagName,e.attributes||$6)}static set(e,A=!1){return uo.of(e,A)}};A8.prototype.startSide=A8.prototype.endSide=-1;function g4(i){let e;return i.nodeType==11?e=i.getSelection?i:i.ownerDocument:e=i,e.getSelection()}function y9(i,e){return e?i==e||i.contains(e.nodeType!=1?e.parentNode:e):!1}function $u(i,e){if(!e.anchorNode)return!1;try{return y9(i,e.anchorNode)}catch(A){return!1}}function V6(i){return i.nodeType==3?c4(i,0,i.nodeValue.length).getClientRects():i.nodeType==1?i.getClientRects():[]}function A4(i,e,A,t){return A?ZJ(i,e,A,t,-1)||ZJ(i,e,A,t,1):!1}function S2(i){for(var e=0;;e++)if(i=i.previousSibling,!i)return e}function e8(i){return i.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(i.nodeName)}function ZJ(i,e,A,t,n){for(;;){if(i==A&&e==t)return!0;if(e==(n<0?0:cC(i))){if(i.nodeName=="DIV")return!1;let o=i.parentNode;if(!o||o.nodeType!=1)return!1;e=S2(i)+(n<0?0:1),i=o}else if(i.nodeType==1){if(i=i.childNodes[e+(n<0?-1:0)],i.nodeType==1&&i.contentEditable=="false")return!1;e=n<0?cC(i):0}else return!1}}function cC(i){return i.nodeType==3?i.nodeValue.length:i.childNodes.length}function t8(i,e){let A=e?i.left:i.right;return{left:A,right:A,top:i.top,bottom:i.bottom}}function qgA(i){let e=i.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:i.innerWidth,top:0,bottom:i.innerHeight}}function LY(i,e){let A=e.width/i.offsetWidth,t=e.height/i.offsetHeight;return(A>.995&&A<1.005||!isFinite(A)||Math.abs(e.width-i.offsetWidth)<1)&&(A=1),(t>.995&&t<1.005||!isFinite(t)||Math.abs(e.height-i.offsetHeight)<1)&&(t=1),{scaleX:A,scaleY:t}}function WgA(i,e,A,t,n,o,a,r){let s=i.ownerDocument,l=s.defaultView||window;for(let g=i,C=!1;g&&!C;)if(g.nodeType==1){let d,B=g==s.body,u=1,E=1;if(B)d=qgA(l);else{if(/^(fixed|sticky)$/.test(getComputedStyle(g).position)&&(C=!0),g.scrollHeight<=g.clientHeight&&g.scrollWidth<=g.clientWidth){g=g.assignedSlot||g.parentNode;continue}let v=g.getBoundingClientRect();({scaleX:u,scaleY:E}=LY(g,v)),d={left:v.left,right:v.left+g.clientWidth*u,top:v.top,bottom:v.top+g.clientHeight*E}}let f=0,m=0;if(n=="nearest")e.top0&&e.bottom>d.bottom+m&&(m=e.bottom-d.bottom+a)):e.bottom>d.bottom&&(m=e.bottom-d.bottom+a,A<0&&e.top-m0&&e.right>d.right+f&&(f=e.right-d.right+o)):e.right>d.right&&(f=e.right-d.right+o,A<0&&e.leftd.bottom||e.leftd.right)&&(e={left:Math.max(e.left,d.left),right:Math.min(e.right,d.right),top:Math.max(e.top,d.top),bottom:Math.min(e.bottom,d.bottom)}),g=g.assignedSlot||g.parentNode}else if(g.nodeType==11)g=g.host;else break}function GY(i,e=!0){let A=i.ownerDocument,t=null,n=null;for(let o=i.parentNode;o&&!(o==A.body||(!e||t)&&n);)if(o.nodeType==1)!n&&o.scrollHeight>o.clientHeight&&(n=o),e&&!t&&o.scrollWidth>o.clientWidth&&(t=o),o=o.assignedSlot||o.parentNode;else if(o.nodeType==11)o=o.host;else break;return{x:t,y:n}}var D9=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:A,focusNode:t}=e;this.set(A,Math.min(e.anchorOffset,A?cC(A):0),t,Math.min(e.focusOffset,t?cC(t):0))}set(e,A,t,n){this.anchorNode=e,this.anchorOffset=A,this.focusNode=t,this.focusOffset=n}},pd=null;Ct.safari&&Ct.safari_version>=26&&(pd=!1);function KY(i){if(i.setActive)return i.setActive();if(pd)return i.focus(pd);let e=[];for(let A=i;A&&(e.push(A,A.scrollTop,A.scrollLeft),A!=A.ownerDocument);A=A.parentNode);if(i.focus(pd==null?{get preventScroll(){return pd={preventScroll:!0},!0}}:void 0),!pd){pd=!1;for(let A=0;AMath.max(0,i.document.documentElement.scrollHeight-i.innerHeight-4):i.scrollTop>Math.max(1,i.scrollHeight-i.clientHeight-4)}function TY(i,e){for(let A=i,t=e;;){if(A.nodeType==3&&t>0)return{node:A,offset:t};if(A.nodeType==1&&t>0){if(A.contentEditable=="false")return null;A=A.childNodes[t-1],t=cC(A)}else if(A.parentNode&&!e8(A))t=S2(A),A=A.parentNode;else return null}}function OY(i,e){for(let A=i,t=e;;){if(A.nodeType==3&&t=A){if(r.level==t)return a;(o<0||(n!=0?n<0?r.fromA:e[o].level>r.level))&&(o=a)}}if(o<0)throw new RangeError("Index out of range");return o}};function HY(i,e){if(i.length!=e.length)return!1;for(let A=0;A=0;E-=3)if(c0[E+1]==-B){let f=c0[E+2],m=f&2?n:f&4?f&1?o:n:0;m&&(la[C]=la[c0[E]]=m),r=E;break}}else{if(c0.length==189)break;c0[r++]=C,c0[r++]=d,c0[r++]=s}else if((u=la[C])==2||u==1){let E=u==n;s=E?0:1;for(let f=r-3;f>=0;f-=3){let m=c0[f+2];if(m&2)break;if(E)c0[f+2]|=2;else{if(m&4)break;c0[f+2]|=4}}}}}function ncA(i,e,A,t){for(let n=0,o=t;n<=A.length;n++){let a=n?A[n-1].to:i,r=ns;)u==f&&(u=A[--E].from,f=E?A[E-1].to:i),la[--u]=B;s=g}else o=l,s++}}}function b9(i,e,A,t,n,o,a){let r=t%2?2:1;if(t%2==n%2)for(let s=e,l=0;ss&&a.push(new Bg(s,E.from,B));let f=E.direction==yd!=!(B%2);M9(i,f?t+1:t,n,E.inner,E.from,E.to,a),s=E.to}u=E.to}else{if(u==A||(g?la[u]!=r:la[u]==r))break;u++}d?b9(i,s,u,t+1,n,d,a):se;){let g=!0,C=!1;if(!l||s>o[l-1].to){let E=la[s-1];E!=r&&(g=!1,C=E==16)}let d=!g&&r==1?[]:null,B=g?t:t+1,u=s;A:for(;;)if(l&&u==o[l-1].to){if(C)break A;let E=o[--l];if(!g)for(let f=E.from,m=l;;){if(f==e)break A;if(m&&o[m-1].to==f)f=o[--m].from;else{if(la[f-1]==r)break A;break}}if(d)d.push(E);else{E.tola.length;)la[la.length]=256;let t=[],n=e==yd?0:1;return M9(i,n,n,A,0,i.length,t),t}function zY(i){return[new Bg(0,i,0)]}var PY="";function acA(i,e,A,t,n){var o;let a=t.head-i.from,r=Bg.find(e,a,(o=t.bidiLevel)!==null&&o!==void 0?o:-1,t.assoc),s=e[r],l=s.side(n,A);if(a==l){let d=r+=n?1:-1;if(d<0||d>=e.length)return null;s=e[r=d],a=s.side(!n,A),l=s.side(n,A)}let g=tr(i.text,a,s.forward(n,A));(gs.to)&&(g=l),PY=i.text.slice(Math.min(a,g),Math.max(a,g));let C=r==(n?e.length-1:0)?null:e[r+(n?1:-1)];return C&&g==l&&C.level+(n?0:1)i.some(e=>e)}),$Y=nt.define({combine:i=>i.some(e=>e)}),AH=nt.define(),e4=class i{constructor(e,A="nearest",t="nearest",n=5,o=5,a=!1){this.range=e,this.y=A,this.x=t,this.yMargin=n,this.xMargin=o,this.isSnapshot=a}map(e){return e.empty?this:new i(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new i(Be.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},U6=ln.define({map:(i,e)=>i.map(e)}),eH=ln.define();function Gr(i,e,A){let t=i.facet(WY);t.length?t[0](e):window.onerror&&window.onerror(String(e),A,void 0,void 0,e)||(A?console.error(A+":",e):console.error(e))}var lC=nt.define({combine:i=>i.length?i[0]:!0}),scA=0,XB=nt.define({combine(i){return i.filter((e,A)=>{for(let t=0;t{let s=[];return a&&s.push(Q8.of(l=>{let g=l.plugin(r);return g?a(g):Lt.none})),o&&s.push(o(r)),s})}static fromClass(e,A){return i.define((t,n)=>new e(t,n),A)}},t4=class{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let A=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(A)}catch(t){if(Gr(A.state,t,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(n){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(A){Gr(e.state,A,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var A;if(!((A=this.value)===null||A===void 0)&&A.destroy)try{this.value.destroy()}catch(t){Gr(e.state,t,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},AY=nt.define(),S9=nt.define(),Q8=nt.define(),tH=nt.define(),uS=nt.define(),C4=nt.define(),iH=nt.define();function eY(i,e){let A=i.state.facet(iH);if(!A.length)return A;let t=A.map(o=>o instanceof Function?o(i):o),n=[];return uo.spans(t,e.from,e.to,{point(){},span(o,a,r,s){let l=o-e.from,g=a-e.from,C=n;for(let d=r.length-1;d>=0;d--,s--){let B=r[d].spec.bidiIsolate,u;if(B==null&&(B=rcA(e.text,l,g)),s>0&&C.length&&(u=C[C.length-1]).to==l&&u.direction==B)u.to=g,C=u.inner;else{let E={from:l,to:g,direction:B,inner:[]};C.push(E),C=E.inner}}}}),n}var nH=nt.define();function pS(i){let e=0,A=0,t=0,n=0;for(let o of i.state.facet(nH)){let a=o(i);a&&(a.left!=null&&(e=Math.max(e,a.left)),a.right!=null&&(A=Math.max(A,a.right)),a.top!=null&&(t=Math.max(t,a.top)),a.bottom!=null&&(n=Math.max(n,a.bottom)))}return{left:e,right:A,top:t,bottom:n}}var Wu=nt.define(),rc=class i{constructor(e,A,t,n){this.fromA=e,this.toA=A,this.fromB=t,this.toB=n}join(e){return new i(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let A=e.length,t=this;for(;A>0;A--){let n=e[A-1];if(!(n.fromA>t.toA)){if(n.toAn.push(new rc(o,a,r,s))),this.changedRanges=n}static create(e,A,t){return new i(e,A,t)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},lcA=[],_a=class{constructor(e,A,t=0){this.dom=e,this.length=A,this.flags=t,this.parent=null,e.cmTile=this}get breakAfter(){return this.flags&1}get children(){return lcA}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(e){if(this.flags|=2,this.flags&4){this.flags&=-5;let A=this.domAttrs;A&&PgA(this.dom,A)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:"")+(this.breakAfter?"#":"")}destroy(){this.parent=null}setDOM(e){this.dom=e,e.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e,A=this.posAtStart){let t=A;for(let n of this.children){if(n==e)return t;t+=n.length+n.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}covers(e){return!0}coordsIn(e,A){return null}domPosFor(e,A){let t=S2(this.dom),n=this.length?e>0:A>0;return new C0(this.parent.dom,t+(n?1:0),e==0||e==this.length)}markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&this.parent.flags&2&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let e=this;e;e=e.parent)if(e instanceof oh)return e;return null}static get(e){return e.cmTile}},nh=class extends _a{constructor(e){super(e,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(e){this.children.push(e),e.parent=this}sync(e){if(this.flags&2)return;super.sync(e);let A=this.dom,t=null,n,o=e?.node==A?e:null,a=0;for(let r of this.children){if(r.sync(e),a+=r.length+r.breakAfter,n=t?t.nextSibling:A.firstChild,o&&n!=r.dom&&(o.written=!0),r.dom.parentNode==A)for(;n&&n!=r.dom;)n=tY(n);else A.insertBefore(r.dom,n);t=r.dom}for(n=t?t.nextSibling:A.firstChild,o&&n&&(o.written=!0);n;)n=tY(n);this.length=a}};function tY(i){let e=i.nextSibling;return i.parentNode.removeChild(i),e}var oh=class extends nh{constructor(e,A){super(A),this.view=e}owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}isBlock(){return!0}nearest(e){for(;;){if(!e)return null;let A=_a.get(e);if(A&&this.owns(A))return A;e=e.parentNode}}blockTiles(e){for(let A=[],t=this,n=0,o=0;;)if(n==t.children.length){if(!A.length)return;t=t.parent,t.breakAfter&&o++,n=A.pop()}else{let a=t.children[n++];if(a instanceof gC)A.push(n),t=a,n=0;else{let r=o+a.length,s=e(a,o);if(s!==void 0)return s;o=r+a.breakAfter}}}resolveBlock(e,A){let t,n=-1,o,a=-1;if(this.blockTiles((r,s)=>{let l=s+r.length;if(e>=s&&e<=l){if(r.isWidget()&&A>=-1&&A<=1){if(r.flags&32)return!0;r.flags&16&&(t=void 0)}(se||e==s&&(A>1?r.length:r.covers(-1)))&&(!o||!r.isWidget()&&o.isWidget())&&(o=r,a=e-s)}}),!t&&!o)throw new Error("No tile at position "+e);return t&&A<0||!o?{tile:t,offset:n}:{tile:o,offset:a}}},gC=class i extends nh{constructor(e,A){super(e),this.wrapper=A}isBlock(){return!0}covers(e){return this.children.length?e<0?this.children[0].covers(-1):this.lastChild.covers(1):!1}get domAttrs(){return this.wrapper.attributes}static of(e,A){let t=new i(A||document.createElement(e.tagName),e);return A||(t.flags|=4),t}},ah=class i extends nh{constructor(e,A){super(e),this.attrs=A}isLine(){return!0}static start(e,A,t){let n=new i(A||document.createElement("div"),e);return(!A||!t)&&(n.flags|=4),n}get domAttrs(){return this.attrs}resolveInline(e,A,t){let n=null,o=-1,a=null,r=-1;function s(g,C){for(let d=0,B=0;d=C&&(u.isComposite()?s(u,C-B):(!a||a.isHidden&&(A>0||t&&ccA(a,u)))&&(E>C||u.flags&32)?(a=u,r=C-B):(Bt&&(e=t);let n=e,o=e,a=0;e==0&&A<0||e==t&&A>=0?Ct.chrome||Ct.gecko||(e?(n--,a=1):o=0)?0:r.length-1];return Ct.safari&&!a&&s.width==0&&(s=Array.prototype.find.call(r,l=>l.width)||s),a?t8(s,a<0):s||null}static of(e,A){let t=new i(A||document.createTextNode(e),e);return A||(t.flags|=2),t}},Dd=class i extends _a{constructor(e,A,t,n){super(e,A,n),this.widget=t}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(e){return this.flags&48?!1:(this.flags&(e<0?64:128))>0}coordsIn(e,A){return this.coordsInWidget(e,A,!1)}coordsInWidget(e,A,t){let n=this.widget.coordsAt(this.dom,e,A);if(n)return n;if(t)return t8(this.dom.getBoundingClientRect(),this.length?e==0:A<=0);{let o=this.dom.getClientRects(),a=null;if(!o.length)return null;let r=this.flags&16?!0:this.flags&32?!1:e>0;for(let s=r?o.length-1:0;a=o[s],!(e>0?s==0:s==o.length-1||a.top0;)if(n.isComposite())if(a){if(!e)break;t&&t.break(),e--,a=!1}else if(o==n.children.length){if(!e&&!r.length)break;t&&t.leave(n),a=!!n.breakAfter,{tile:n,index:o}=r.pop(),o++}else{let s=n.children[o],l=s.breakAfter;(A>0?s.length<=e:s.length=0;r--){let s=A.marks[r],l=n.lastChild;if(l instanceof ll&&l.mark.eq(s.mark))l.dom!=s.dom&&l.setDOM(c9(s.dom)),n=l;else{if(this.cache.reused.get(s)){let C=_a.get(s.dom);C&&C.setDOM(c9(s.dom))}let g=ll.of(s.mark,s.dom);n.append(g),n=g}this.cache.reused.set(s,2)}let o=_a.get(e.text);o&&this.cache.reused.set(o,2);let a=new fd(e.text,e.text.nodeValue);a.flags|=8,n.append(a)}addInlineWidget(e,A,t){let n=this.afterWidget&&e.flags&48&&(this.afterWidget.flags&48)==(e.flags&48);n||this.flushBuffer();let o=this.ensureMarks(A,t);!n&&!(e.flags&16)&&o.append(this.getBuffer(1)),o.append(e),this.pos+=e.length,this.afterWidget=e}addMark(e,A,t){this.flushBuffer(),this.ensureMarks(A,t).append(e),this.pos+=e.length,this.afterWidget=null}addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}continueWidget(e){let A=this.afterWidget||this.lastBlock;A.length+=e,this.pos+=e}addLineStart(e,A){var t;e||(e=oH);let n=ah.start(e,A||((t=this.cache.find(ah))===null||t===void 0?void 0:t.dom),!!A);this.getBlockPos().append(this.lastBlock=this.curLine=n)}addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}ensureLine(e){this.curLine||this.addLineStart(e)}ensureMarks(e,A){var t;let n=this.curLine;for(let o=e.length-1;o>=0;o--){let a=e[o],r;if(A>0&&(r=n.lastChild)&&r instanceof ll&&r.mark.eq(a))n=r,A--;else{let s=ll.of(a,(t=this.cache.find(ll,l=>l.mark.eq(a)))===null||t===void 0?void 0:t.dom);n.append(s),n=s,A=0}}return n}endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChild;(!e||!iY(this.curLine,!1)||e.dom.nodeName!="BR"&&e.isWidget()&&!(Ct.ios&&iY(this.curLine,!0)))&&this.curLine.append(this.cache.findWidget(C9,0,32)||new Dd(C9.toDOM(),0,C9,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let e=this.wrappers.length-1;e>=0;e--)this.wrappers[e].to=this.pos){let A=new _9(e.from,e.to,e.value,e.rank),t=this.wrappers.length;for(;t>0&&(this.wrappers[t-1].rank-A.rank||this.wrappers[t-1].to-A.to)<0;)t--;this.wrappers.splice(t,0,A)}this.wrapperPos=this.pos}getBlockPos(){var e;this.updateBlockWrappers();let A=this.root;for(let t of this.wrappers){let n=A.lastChild;if(t.froma.wrapper.eq(t.wrapper)))===null||e===void 0?void 0:e.dom);A.append(o),A=o}}return A}blockPosCovered(){let e=this.lastBlock;return e!=null&&!e.breakAfter&&(!e.isWidget()||(e.flags&160)>0)}getBuffer(e){let A=2|(e<0?16:32),t=this.cache.find(rh,void 0,1);return t&&(t.flags=A),t||new rh(A)}flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}},R9=class{constructor(e){this.skipCount=0,this.text="",this.textOff=0,this.cursor=e.iter()}skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount+=e-(this.text.length-this.textOff),this.text="",this.textOff=0)}next(e){if(this.textOff==this.text.length){let{value:n,lineBreak:o,done:a}=this.cursor.next(this.skipCount);if(this.skipCount=0,a)throw new Error("Ran out of text content when drawing inline views");this.text=n;let r=this.textOff=Math.min(e,n.length);return o?null:n.slice(0,r)}let A=Math.min(this.text.length,this.textOff+e),t=this.text.slice(this.textOff,A);return this.textOff=A,t}},n8=[Dd,ah,fd,ll,rh,gC,oh];for(let i=0;i[]),this.index=n8.map(()=>0),this.reused=new Map}add(e){let A=e.constructor.bucket,t=this.buckets[A];t.length<6?t.push(e):t[this.index[A]=(this.index[A]+1)%6]=e}find(e,A,t=2){let n=e.bucket,o=this.buckets[n],a=this.index[n];for(let r=o.length-1;r>=0;r--){let s=(r+a)%o.length,l=o[s];if((!A||A(l))&&!this.reused.has(l))return o.splice(s,1),s{if(this.cache.add(a),a.isComposite())return!1},enter:a=>this.cache.add(a),leave:()=>{},break:()=>{}}}run(e,A){let t=A&&this.getCompositionContext(A.text);for(let n=0,o=0,a=0;;){let r=an){let l=s-n;this.preserve(l,!a,!r),n=s,o+=l}if(!r)break;A&&r.fromA<=A.range.fromA&&r.toA>=A.range.toA?(this.forward(r.fromA,A.range.fromA,A.range.fromA{if(a.isWidget())if(this.openWidget)this.builder.continueWidget(s-r);else{let l=s>0||r{a.isLine()?this.builder.addLineStart(a.attrs,this.cache.maybeReuse(a)):(this.cache.add(a),a instanceof ll&&n.unshift(a.mark)),this.openWidget=!1},leave:a=>{a.isLine()?n.length&&(n.length=o=0):a instanceof ll&&(n.shift(),o=Math.min(o,n.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(e)}emit(e,A){let t=null,n=this.builder,o=0,a=uo.spans(this.decorations,e,A,{point:(r,s,l,g,C,d)=>{if(l instanceof wd){if(this.disallowBlockEffectsFor[d]){if(l.block)throw new RangeError("Block decorations may not be specified via plugins");if(s>this.view.state.doc.lineAt(r).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}if(o=g.length,C>g.length)n.continueWidget(s-r);else{let B=l.widget||(l.block?nY.block:nY.inline),u=CcA(l),E=this.cache.findWidget(B,s-r,u)||Dd.of(B,this.view,s-r,u);l.block?(l.startSide>0&&n.addLineStartIfNotCovered(t),n.addBlockWidget(E)):(n.ensureLine(t),n.addInlineWidget(E,g,C))}t=null}else t=dcA(t,l);s>r&&this.text.skip(s-r)},span:(r,s,l,g)=>{for(let C=r;Co,this.openMarks=a}forward(e,A,t=1){A-e<=10?this.old.advance(A-e,t,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(A-e-10,-1),this.old.advance(5,t,this.reuseWalker))}getCompositionContext(e){let A=[],t=null;for(let n=e.parentNode;;n=n.parentNode){let o=_a.get(n);if(n==this.view.contentDOM)break;o instanceof ll?A.push(o):o?.isLine()?t=o:o instanceof gC||(n.nodeName=="DIV"&&!t&&n!=this.view.contentDOM?t=new ah(n,oH):t||A.push(ll.of(new s4({tagName:n.nodeName.toLowerCase(),attributes:jgA(n)}),n)))}return{line:t,marks:A}}};function iY(i,e){let A=t=>{for(let n of t.children)if((e?n.isText():n.length)||A(n))return!0;return!1};return A(i)}function CcA(i){let e=i.isReplace?(i.startSide<0?64:0)|(i.endSide>0?128:0):i.startSide>0?32:16;return i.block&&(e|=256),e}var oH={class:"cm-line"};function dcA(i,e){let A=e.spec.attributes,t=e.spec.class;return!A&&!t||(i||(i={class:"cm-line"}),A&&IS(A,i),t&&(i.class+=" "+t)),i}function IcA(i){let e=[];for(let A=i.parents.length;A>1;A--){let t=A==i.parents.length?i.tile:i.parents[A].tile;t instanceof ll&&e.push(t.mark)}return e}function c9(i){let e=_a.get(i);return e&&e.setDOM(i.cloneNode()),i}var nY=(()=>{class i extends gl{constructor(A){super(),this.tag=A}eq(A){return A.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(A){return A.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}return i.inline=new i("span"),i.block=new i("div"),i})(),C9=new class extends gl{toDOM(){return document.createElement("br")}get isHidden(){return!0}get editable(){return!0}},o8=class{constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=Lt.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new oh(e,e.contentDOM),this.updateInner([new rc(0,0,0,e.state.doc.length)],null)}update(e){var A;let t=e.changedRanges;this.minWidth>0&&t.length&&(t.every(({fromA:g,toA:C})=>Cthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((A=this.domChanged)===null||A===void 0)&&A.newSel?n=this.domChanged.newSel.head:!mcA(e.changes,this.hasComposition)&&!e.selectionSet&&(n=e.state.selection.main.head));let o=n>-1?hcA(this.view,e.changes,n):null;if(this.domChanged=null,this.hasComposition){let{from:g,to:C}=this.hasComposition;t=new rc(g,C,e.changes.mapPos(g,-1),e.changes.mapPos(C,1)).addToSet(t.slice())}this.hasComposition=o?{from:o.range.fromB,to:o.range.toB}:null,(Ct.ie||Ct.chrome)&&!o&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let a=this.decorations,r=this.blockWrappers;this.updateDeco();let s=ucA(a,this.decorations,e.changes);s.length&&(t=rc.extendWithRanges(t,s));let l=pcA(r,this.blockWrappers,e.changes);return l.length&&(t=rc.extendWithRanges(t,l)),o&&!t.some(g=>g.fromA<=o.range.fromA&&g.toA>=o.range.toA)&&(t=o.range.addToSet(t.slice())),this.tile.flags&2&&t.length==0?!1:(this.updateInner(t,o),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,A){this.view.viewState.mustMeasureContent=!0;let{observer:t}=this.view;t.ignore(()=>{if(A||e.length){let a=this.tile,r=new F9(this.view,a,this.blockWrappers,this.decorations,this.dynamicDecorationMap);A&&_a.get(A.text)&&r.cache.reused.set(_a.get(A.text),2),this.tile=r.run(e,A),L9(a,r.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=Ct.chrome||Ct.ios?{node:t.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(o),o&&(o.written||t.selectionRange.focusNode!=o.node||!this.tile.dom.contains(o.node))&&(this.forceSelection=!0),this.tile.dom.style.height=""});let n=[];if(this.view.viewport.from||this.view.viewport.to-1)&&$u(t,this.view.observer.selectionRange)&&!(n&&t.contains(n));if(!(o||A||a))return;let r=this.forceSelection;this.forceSelection=!1;let s=this.view.state.selection.main,l,g;if(s.empty?g=l=this.inlineDOMNearPos(s.anchor,s.assoc||1):(g=this.inlineDOMNearPos(s.head,s.head==s.from?1:-1),l=this.inlineDOMNearPos(s.anchor,s.anchor==s.from?1:-1)),Ct.gecko&&s.empty&&!this.hasComposition&&BcA(l)){let d=document.createTextNode("");this.view.observer.ignore(()=>l.node.insertBefore(d,l.node.childNodes[l.offset]||null)),l=g=new C0(d,0),r=!0}let C=this.view.observer.selectionRange;(r||!C.focusNode||(!A4(l.node,l.offset,C.anchorNode,C.anchorOffset)||!A4(g.node,g.offset,C.focusNode,C.focusOffset))&&!this.suppressWidgetCursorChange(C,s))&&(this.view.observer.ignore(()=>{Ct.android&&Ct.chrome&&t.contains(C.focusNode)&&fcA(C.focusNode,t)&&(t.blur(),t.focus({preventScroll:!0}));let d=g4(this.view.root);if(d)if(s.empty){if(Ct.gecko){let B=EcA(l.node,l.offset);if(B&&B!=3){let u=(B==1?TY:OY)(l.node,l.offset);u&&(l=new C0(u.node,u.offset))}}d.collapse(l.node,l.offset),s.bidiLevel!=null&&d.caretBidiLevel!==void 0&&(d.caretBidiLevel=s.bidiLevel)}else if(d.extend){d.collapse(l.node,l.offset);try{d.extend(g.node,g.offset)}catch(B){}}else{let B=document.createRange();s.anchor>s.head&&([l,g]=[g,l]),B.setEnd(g.node,g.offset),B.setStart(l.node,l.offset),d.removeAllRanges(),d.addRange(B)}a&&this.view.root.activeElement==t&&(t.blur(),n&&n.focus())}),this.view.observer.setSelectionRange(l,g)),this.impreciseAnchor=l.precise?null:new C0(C.anchorNode,C.anchorOffset),this.impreciseHead=g.precise?null:new C0(C.focusNode,C.focusOffset)}suppressWidgetCursorChange(e,A){return this.hasComposition&&A.empty&&A4(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==A.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,A=e.state.selection.main,t=g4(e.root),{anchorNode:n,anchorOffset:o}=e.observer.selectionRange;if(!t||!A.empty||!A.assoc||!t.modify)return;let a=this.lineAt(A.head,A.assoc);if(!a)return;let r=a.posAtStart;if(A.head==r||A.head==r+a.length)return;let s=this.coordsAt(A.head,-1),l=this.coordsAt(A.head,1);if(!s||!l||s.bottom>l.top)return;let g=this.domAtPos(A.head+A.assoc,A.assoc);t.collapse(g.node,g.offset),t.modify("move",A.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let C=e.observer.selectionRange;e.docView.posFromDOM(C.anchorNode,C.anchorOffset)!=A.from&&t.collapse(n,o)}posFromDOM(e,A){let t=this.tile.nearest(e);if(!t)return this.tile.dom.compareDocumentPosition(e)&2?0:this.view.state.doc.length;let n=t.posAtStart;if(t.isComposite()){let o;if(e==t.dom)o=t.dom.childNodes[A];else{let a=cC(e)==0?0:A==0?-1:1;for(;;){let r=e.parentNode;if(r==t.dom)break;a==0&&r.firstChild!=r.lastChild&&(e==r.firstChild?a=-1:a=1),e=r}a<0?o=e:o=e.nextSibling}if(o==t.dom.firstChild)return n;for(;o&&!_a.get(o);)o=o.nextSibling;if(!o)return n+t.length;for(let a=0,r=n;;a++){let s=t.children[a];if(s.dom==o)return r;r+=s.length+s.breakAfter}}else return t.isText()?e==t.dom?n+A:n+(A?t.length:0):n}domAtPos(e,A){let{tile:t,offset:n}=this.tile.resolveBlock(e,A);return t.isWidget()?t.domPosFor(e,A):t.domIn(n,A)}inlineDOMNearPos(e,A){let t,n=-1,o=!1,a,r=-1,s=!1;return this.tile.blockTiles((l,g)=>{if(l.isWidget()){if(l.flags&32&&g>=e)return!0;l.flags&16&&(o=!0)}else{let C=g+l.length;if(g<=e&&(t=l,n=e-g,o=C=e&&!a&&(a=l,r=e-g,s=g>e),g>e&&a)return!0}}),!t&&!a?this.domAtPos(e,A):(o&&a?t=null:s&&t&&(a=null),t&&A<0||!a?t.domIn(n,A):a.domIn(r,A))}coordsAt(e,A){let{tile:t,offset:n}=this.tile.resolveBlock(e,A);return t.isWidget()?t.widget instanceof i4?null:t.coordsInWidget(n,A,!0):t.coordsIn(n,A)}lineAt(e,A){let{tile:t}=this.tile.resolveBlock(e,A);return t.isLine()?t:null}coordsForChar(e){let{tile:A,offset:t}=this.tile.resolveBlock(e,1);if(!A.isLine())return null;function n(o,a){if(o.isComposite())for(let r of o.children){if(r.length>=a){let s=n(r,a);if(s)return s}if(a-=r.length,a<0)break}else if(o.isText()&&aMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,r=-1,s=this.view.textDirection==Lo.LTR,l=0,g=(C,d,B)=>{for(let u=0;un);u++){let E=C.children[u],f=d+E.length,m=E.dom.getBoundingClientRect(),{height:v}=m;if(B&&!u&&(l+=m.top-B.top),E instanceof gC)f>t&&g(E,d,m);else if(d>=t&&(l>0&&A.push(-l),A.push(v+l),l=0,a)){let S=E.dom.lastChild,k=S?V6(S):[];if(k.length){let M=k[k.length-1],x=s?M.right-m.left:m.right-M.left;x>r&&(r=x,this.minWidth=o,this.minWidthFrom=d,this.minWidthTo=f)}}B&&u==C.children.length-1&&(l+=B.bottom-m.bottom),d=f+E.breakAfter}};return g(this.tile,0,null),A}textDirectionAt(e){let{tile:A}=this.tile.resolveBlock(e,1);return getComputedStyle(A.dom).direction=="rtl"?Lo.RTL:Lo.LTR}measureTextSize(){let e=this.tile.blockTiles(a=>{if(a.isLine()&&a.children.length&&a.length<=20){let r=0,s;for(let l of a.children){if(!l.isText()||/[^ -~]/.test(l.text))return;let g=V6(l.dom);if(g.length!=1)return;r+=g[0].width,s=g[0].height}if(r)return{lineHeight:a.dom.getBoundingClientRect().height,charWidth:r/a.length,textHeight:s}}});if(e)return e;let A=document.createElement("div"),t,n,o;return A.className="cm-line",A.style.width="99999px",A.style.position="absolute",A.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.tile.dom.appendChild(A);let a=V6(A.firstChild)[0];t=A.getBoundingClientRect().height,n=a&&a.width?a.width/27:7,o=a&&a.height?a.height:t,A.remove()}),{lineHeight:t,charWidth:n,textHeight:o}}computeBlockGapDeco(){let e=[],A=this.view.viewState;for(let t=0,n=0;;n++){let o=n==A.viewports.length?null:A.viewports[n],a=o?o.from-1:this.view.state.doc.length;if(a>t){let r=(A.lineBlockAt(a).bottom-A.lineBlockAt(t).top)/this.view.scaleY;e.push(Lt.replace({widget:new i4(r),block:!0,inclusive:!0,isBlockGap:!0}).range(t,a))}if(!o)break;t=o.to+1}return Lt.set(e)}updateDeco(){let e=1,A=this.view.state.facet(Q8).map(o=>(this.dynamicDecorationMap[e++]=typeof o=="function")?o(this.view):o),t=!1,n=this.view.state.facet(uS).map((o,a)=>{let r=typeof o=="function";return r&&(t=!0),r?o(this.view):o});for(n.length&&(this.dynamicDecorationMap[e++]=t,A.push(uo.join(n))),this.decorations=[this.editContextFormatting,...A,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];etypeof o=="function"?o(this.view):o)}scrollIntoView(e){var A;if(e.isSnapshot){let g=this.view.viewState.lineBlockAt(e.range.head);this.view.scrollDOM.scrollTop=g.top-e.yMargin,this.view.scrollDOM.scrollLeft=e.xMargin;return}for(let g of this.view.state.facet(AH))try{if(g(this.view,e.range,e))return!0}catch(C){Gr(this.view.state,C,"scroll handler")}let{range:t}=e,n=this.coordsAt(t.head,(A=t.assoc)!==null&&A!==void 0?A:t.empty?0:t.head>t.anchor?-1:1),o;if(!n)return;!t.empty&&(o=this.coordsAt(t.anchor,t.anchor>t.head?-1:1))&&(n={left:Math.min(n.left,o.left),top:Math.min(n.top,o.top),right:Math.max(n.right,o.right),bottom:Math.max(n.bottom,o.bottom)});let a=pS(this.view),r={left:n.left-a.left,top:n.top-a.top,right:n.right+a.right,bottom:n.bottom+a.bottom},{offsetWidth:s,offsetHeight:l}=this.view.scrollDOM;if(WgA(this.view.scrollDOM,r,t.head1&&(n.top>window.pageYOffset+window.visualViewport.offsetTop+window.visualViewport.height||n.bottomt.isWidget()||t.children.some(A);return A(this.tile.resolveBlock(e,1).tile)}destroy(){L9(this.tile)}};function L9(i,e){let A=e?.get(i);if(A!=1){A==null&&i.destroy();for(let t of i.children)L9(t,e)}}function BcA(i){return i.node.nodeType==1&&i.node.firstChild&&(i.offset==0||i.node.childNodes[i.offset-1].contentEditable=="false")&&(i.offset==i.node.childNodes.length||i.node.childNodes[i.offset].contentEditable=="false")}function aH(i,e){let A=i.observer.selectionRange;if(!A.focusNode)return null;let t=TY(A.focusNode,A.focusOffset),n=OY(A.focusNode,A.focusOffset),o=t||n;if(n&&t&&n.node!=t.node){let r=_a.get(n.node);if(!r||r.isText()&&r.text!=n.node.nodeValue)o=n;else if(i.docView.lastCompositionAfterCursor){let s=_a.get(t.node);!s||s.isText()&&s.text!=t.node.nodeValue||(o=n)}}if(i.docView.lastCompositionAfterCursor=o!=t,!o)return null;let a=e-o.offset;return{from:a,to:a+o.node.nodeValue.length,node:o.node}}function hcA(i,e,A){let t=aH(i,A);if(!t)return null;let{node:n,from:o,to:a}=t,r=n.nodeValue;if(/[\n\r]/.test(r)||i.state.doc.sliceString(t.from,t.to)!=r)return null;let s=e.invertedDesc;return{range:new rc(s.mapPos(o),s.mapPos(a),o,a),text:n}}function EcA(i,e){return i.nodeType!=1?0:(e&&i.childNodes[e-1].contentEditable=="false"?1:0)|(e{te.from&&(A=!0)}),A}var i4=class extends gl{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}};function wcA(i,e,A=1){let t=i.charCategorizer(e),n=i.doc.lineAt(e),o=e-n.from;if(n.length==0)return Be.cursor(e);o==0?A=1:o==n.length&&(A=-1);let a=o,r=o;A<0?a=tr(n.text,o,!1):r=tr(n.text,o);let s=t(n.text.slice(a,r));for(;a>0;){let l=tr(n.text,a,!1);if(t(n.text.slice(l,a))!=s)break;a=l}for(;ri.defaultLineHeight*1.5){let r=i.viewState.heightOracle.textHeight,s=Math.floor((n-A.top-(i.defaultLineHeight-r)*.5)/r);o+=s*i.viewState.heightOracle.lineLength}let a=i.state.sliceDoc(A.from,A.to);return A.from+G6(a,o,i.state.tabSize)}function K9(i,e,A){let t=i.lineBlockAt(e);if(Array.isArray(t.type)){let n;for(let o of t.type){if(o.from>e)break;if(!(o.toe)return o;(!n||o.type==As.Text&&(n.type!=o.type||(A<0?o.frome)))&&(n=o)}}return n||t}return t}function DcA(i,e,A,t){let n=K9(i,e.head,e.assoc||-1),o=!t||n.type!=As.Text||!(i.lineWrapping||n.widgetLineBreaks)?null:i.coordsAtPos(e.assoc<0&&e.head>n.from?e.head-1:e.head);if(o){let a=i.dom.getBoundingClientRect(),r=i.textDirectionAt(n.from),s=i.posAtCoords({x:A==(r==Lo.LTR)?a.right-1:a.left+1,y:(o.top+o.bottom)/2});if(s!=null)return Be.cursor(s,A?-1:1)}return Be.cursor(A?n.to:n.from,A?-1:1)}function oY(i,e,A,t){let n=i.state.doc.lineAt(e.head),o=i.bidiSpans(n),a=i.textDirectionAt(n.from);for(let r=e,s=null;;){let l=acA(n,o,a,r,A),g=PY;if(!l){if(n.number==(A?i.state.doc.lines:1))return r;g=` -`,n=i.state.doc.line(n.number+(A?1:-1)),o=i.bidiSpans(n),l=i.visualLineSide(n,!A)}if(s){if(!s(g))return r}else{if(!t)return l;s=t(g)}r=l}}function vcA(i,e,A){let t=i.state.charCategorizer(e),n=t(A);return o=>{let a=t(o);return n==$o.Space&&(n=a),n==a}}function bcA(i,e,A,t){let n=e.head,o=A?1:-1;if(n==(A?i.state.doc.length:0))return Be.cursor(n,e.assoc);let a=e.goalColumn,r,s=i.contentDOM.getBoundingClientRect(),l=i.coordsAtPos(n,e.assoc||((e.empty?A:e.head==e.from)?1:-1)),g=i.documentTop;if(l)a==null&&(a=l.left-s.left),r=o<0?l.top:l.bottom;else{let u=i.viewState.lineBlockAt(n);a==null&&(a=Math.min(s.right-s.left,i.defaultCharacterWidth*(n-u.from))),r=(o<0?u.top:u.bottom)+g}let C=s.left+a,d=i.viewState.heightOracle.textHeight>>1,B=t??d;for(let u=0;;u+=d){let E=r+(B+u)*o,f=U9(i,{x:C,y:E},!1,o);if(A?E>s.bottom:Er:v{if(e>o&&en(i)),A.from,e.head>A.from?-1:1);return t==A.from?A:Be.cursor(t,ti.viewState.docHeight)return new Ig(i.state.doc.length,-1);if(l=i.elementAtHeight(s),t==null)break;if(l.type==As.Text){if(t<0?l.toi.viewport.to)break;let d=i.docView.coordsAt(t<0?l.from:l.to,t>0?-1:1);if(d&&(t<0?d.top<=s+o:d.bottom>=s+o))break}let C=i.viewState.heightOracle.textHeight/2;s=t>0?l.bottom+C:l.top-C}if(i.viewport.from>=l.to||i.viewport.to<=l.from){if(A)return null;if(l.type==As.Text){let C=ycA(i,n,l,a,r);return new Ig(C,C==l.from?1:-1)}}if(l.type!=As.Text)return s<(l.top+l.bottom)/2?new Ig(l.from,1):new Ig(l.to,-1);let g=i.docView.lineAt(l.from,2);return(!g||g.length!=l.length)&&(g=i.docView.lineAt(l.from,-2)),new T9(i,a,r,i.textDirectionAt(l.from)).scanTile(g,l.from)}var T9=class{constructor(e,A,t,n){this.view=e,this.x=A,this.y=t,this.baseDir=n,this.line=null,this.spans=null}bidiSpansAt(e){return(!this.line||this.line.from>e||this.line.to1||t.length&&(t[0].level!=this.baseDir||t[0].to+n.from>1;e:if(o.has(u)){let f=t+Math.floor(Math.random()*B);for(let m=0;m1)){if(m.bottomthis.y)(!s||s.top>m.top)&&(s=m),v=-1;else{let S=m.left>this.x?this.x-m.left:m.right(C.left+C.right)/2==d}}scanText(e,A){let t=[];for(let o=0;o{let a=t[o]-A,r=t[o+1]-A;return c4(e.dom,a,r).getClientRects()});return n.after?new Ig(t[n.i+1],-1):new Ig(t[n.i],1)}scanTile(e,A){if(!e.length)return new Ig(A,1);if(e.children.length==1){let r=e.children[0];if(r.isText())return this.scanText(r,A);if(r.isComposite())return this.scanTile(r,A)}let t=[A];for(let r=0,s=A;r{let s=e.children[r];return s.flags&48?null:(s.dom.nodeType==1?s.dom:c4(s.dom,0,s.length)).getClientRects()}),o=e.children[n.i],a=t[n.i];return o.isText()?this.scanText(o,a):o.isComposite()?this.scanTile(o,a):n.after?new Ig(t[n.i+1],-1):new Ig(a,1)}},ZB="\uFFFF",O9=class{constructor(e,A){this.points=e,this.view=A,this.text="",this.lineSeparator=A.state.facet(ir.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=ZB}readRange(e,A){if(!e)return this;let t=e.parentNode;for(let n=e;;){this.findPointBefore(t,n);let o=this.text.length;this.readNode(n);let a=_a.get(n),r=n.nextSibling;if(r==A){a?.breakAfter&&!r&&t!=this.view.contentDOM&&this.lineBreak();break}let s=_a.get(r);(a&&s?a.breakAfter:(a?a.breakAfter:e8(n))||e8(r)&&(n.nodeName!="BR"||a?.isWidget())&&this.text.length>o)&&!ScA(r,A)&&this.lineBreak(),n=r}return this.findPointBefore(t,A),this}readTextNode(e){let A=e.nodeValue;for(let t of this.points)t.node==e&&(t.pos=this.text.length+Math.min(t.offset,A.length));for(let t=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let o=-1,a=1,r;if(this.lineSeparator?(o=A.indexOf(this.lineSeparator,t),a=this.lineSeparator.length):(r=n.exec(A))&&(o=r.index,a=r[0].length),this.append(A.slice(t,o<0?A.length:o)),o<0)break;if(this.lineBreak(),a>1)for(let s of this.points)s.node==e&&s.pos>this.text.length&&(s.pos-=a-1);t=o+a}}readNode(e){let A=_a.get(e),t=A&&A.overrideDOMText;if(t!=null){this.findPointInside(e,t.length);for(let n=t.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else e.nodeType==3?this.readTextNode(e):e.nodeName=="BR"?e.nextSibling&&this.lineBreak():e.nodeType==1&&this.readRange(e.firstChild,null)}findPointBefore(e,A){for(let t of this.points)t.node==e&&e.childNodes[t.offset]==A&&(t.pos=this.text.length)}findPointInside(e,A){for(let t of this.points)(e.nodeType==3?t.node==e:e.contains(t.node))&&(t.pos=this.text.length+(McA(e,t.node,t.offset)?A:0))}};function McA(i,e,A){for(;;){if(!e||A-1;let{impreciseHead:o,impreciseAnchor:a}=e.docView,r=e.state.selection;if(e.state.readOnly&&A>-1)this.newSel=null;else if(A>-1&&(this.bounds=sH(e.docView.tile,A,t,0))){let s=o||a?[]:_cA(e),l=new O9(s,e);l.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=l.text,this.newSel=xcA(s,this.bounds.from)}else{let s=e.observer.selectionRange,l=o&&o.node==s.focusNode&&o.offset==s.focusOffset||!y9(e.contentDOM,s.focusNode)?r.main.head:e.docView.posFromDOM(s.focusNode,s.focusOffset),g=a&&a.node==s.anchorNode&&a.offset==s.anchorOffset||!y9(e.contentDOM,s.anchorNode)?r.main.anchor:e.docView.posFromDOM(s.anchorNode,s.anchorOffset),C=e.viewport;if((Ct.ios||Ct.chrome)&&r.main.empty&&l!=g&&(C.from>0||C.to-1&&r.ranges.length>1)this.newSel=r.replaceRange(Be.range(g,l));else if(e.lineWrapping&&g==l&&!(r.main.empty&&r.main.head==l)&&e.inputState.lastTouchTime>Date.now()-100){let d=e.coordsAtPos(l,-1),B=0;d&&(B=e.inputState.lastTouchY<=d.bottom?-1:1),this.newSel=Be.create([Be.cursor(l,B)])}else this.newSel=Be.single(g,l)}}};function sH(i,e,A,t){if(i.isComposite()){let n=-1,o=-1,a=-1,r=-1;for(let s=0,l=t,g=t;sA)return sH(C,e,A,l);if(d>=e&&n==-1&&(n=s,o=l),l>A&&C.dom.parentNode==i.dom){a=s,r=g;break}g=d,l=d+C.breakAfter}return{from:o,to:r<0?t+i.length:r,startDOM:(n?i.children[n-1].dom.nextSibling:null)||i.dom.firstChild,endDOM:a=0?i.children[a].dom:null}}else return i.isText()?{from:t,to:t+i.length,startDOM:i.dom,endDOM:i.dom.nextSibling}:null}function lH(i,e){let A,{newSel:t}=e,{state:n}=i,o=n.selection.main,a=i.inputState.lastKeyTime>Date.now()-100?i.inputState.lastKeyCode:-1;if(e.bounds){let{from:r,to:s}=e.bounds,l=o.from,g=null;(a===8||Ct.android&&e.text.length=r&&o.to<=s&&(e.typeOver||C!=e.text)&&C.slice(0,o.from-r)==e.text.slice(0,o.from-r)&&C.slice(o.to-r)==e.text.slice(d=e.text.length-(C.length-(o.to-r)))?A={from:o.from,to:o.to,insert:On.of(e.text.slice(o.from-r,d).split(ZB))}:(B=gH(C,e.text,l-r,g))&&(Ct.chrome&&a==13&&B.toB==B.from+2&&e.text.slice(B.from,B.toB)==ZB+ZB&&B.toB--,A={from:r+B.from,to:r+B.toA,insert:On.of(e.text.slice(B.from,B.toB).split(ZB))})}else t&&(!i.hasFocus&&n.facet(lC)||r8(t,o))&&(t=null);if(!A&&!t)return!1;if((Ct.mac||Ct.android)&&A&&A.from==A.to&&A.from==o.head-1&&/^\. ?$/.test(A.insert.toString())&&i.contentDOM.getAttribute("autocorrect")=="off"?(t&&A.insert.length==2&&(t=Be.single(t.main.anchor-1,t.main.head-1)),A={from:A.from,to:A.to,insert:On.of([A.insert.toString().replace("."," ")])}):n.doc.lineAt(o.from).toDate.now()-50?A={from:o.from,to:o.to,insert:n.toText(i.inputState.insertingText)}:Ct.chrome&&A&&A.from==A.to&&A.from==o.head&&A.insert.toString()==` - `&&i.lineWrapping&&(t&&(t=Be.single(t.main.anchor-1,t.main.head-1)),A={from:o.from,to:o.to,insert:On.of([" "])}),A)return fS(i,A,t,a);if(t&&!r8(t,o)){let r=!1,s="select";return i.inputState.lastSelectionTime>Date.now()-50&&(i.inputState.lastSelectionOrigin=="select"&&(r=!0),s=i.inputState.lastSelectionOrigin,s=="select.pointer"&&(t=rH(n.facet(C4).map(l=>l(i)),t))),i.dispatch({selection:t,scrollIntoView:r,userEvent:s}),!0}else return!1}function fS(i,e,A,t=-1){if(Ct.ios&&i.inputState.flushIOSKey(e))return!0;let n=i.state.selection.main;if(Ct.android&&(e.to==n.to&&(e.from==n.from||e.from==n.from-1&&i.state.sliceDoc(e.from,n.from)==" ")&&e.insert.length==1&&e.insert.lines==2&&ih(i.contentDOM,"Enter",13)||(e.from==n.from-1&&e.to==n.to&&e.insert.length==0||t==8&&e.insert.lengthn.head)&&ih(i.contentDOM,"Backspace",8)||e.from==n.from&&e.to==n.to+1&&e.insert.length==0&&ih(i.contentDOM,"Delete",46)))return!0;let o=e.insert.toString();i.inputState.composing>=0&&i.inputState.composing++;let a,r=()=>a||(a=kcA(i,e,A));return i.state.facet(ZY).some(s=>s(i,e.from,e.to,o,r))||i.dispatch(r()),!0}function kcA(i,e,A){let t,n=i.state,o=n.selection.main,a=-1;if(e.from==e.to&&e.fromo.to){let s=e.fromC(i)),l,s);e.from==g&&(a=g)}if(a>-1)t={changes:e,selection:Be.cursor(e.from+e.insert.length,-1)};else if(e.from>=o.from&&e.to<=o.to&&e.to-e.from>=(o.to-o.from)/3&&(!A||A.main.empty&&A.main.from==e.from+e.insert.length)&&i.inputState.composing<0){let s=o.frome.to?n.sliceDoc(e.to,o.to):"";t=n.replaceSelection(i.state.toText(s+e.insert.sliceString(0,void 0,i.state.lineBreak)+l))}else{let s=n.changes(e),l=A&&A.main.to<=s.newLength?A.main:void 0;if(n.selection.ranges.length>1&&(i.inputState.composing>=0||i.inputState.compositionPendingChange)&&e.to<=o.to+10&&e.to>=o.to-10){let g=i.state.sliceDoc(e.from,e.to),C,d=A&&aH(i,A.main.head);if(d){let u=e.insert.length-(e.to-e.from);C={from:d.from,to:d.to-u}}else C=i.state.doc.lineAt(o.head);let B=o.to-e.to;t=n.changeByRange(u=>{if(u.from==o.from&&u.to==o.to)return{changes:s,range:l||u.map(s)};let E=u.to-B,f=E-g.length;if(i.state.sliceDoc(f,E)!=g||E>=C.from&&f<=C.to)return{range:u};let m=n.changes({from:f,to:E,insert:e.insert}),v=u.to-o.to;return{changes:m,range:l?Be.range(Math.max(0,l.anchor+v),Math.max(0,l.head+v)):u.map(m)}})}else t={changes:s,selection:l&&n.selection.replaceRange(l)}}let r="input.type";return(i.composing||i.inputState.compositionPendingChange&&i.inputState.compositionEndedAt>Date.now()-50)&&(i.inputState.compositionPendingChange=!1,r+=".compose",i.inputState.compositionFirstChange&&(r+=".start",i.inputState.compositionFirstChange=!1)),n.update(t,{userEvent:r,scrollIntoView:!0})}function gH(i,e,A,t){let n=Math.min(i.length,e.length),o=0;for(;o0&&r>0&&i.charCodeAt(a-1)==e.charCodeAt(r-1);)a--,r--;if(t=="end"){let s=Math.max(0,o-Math.min(a,r));A-=a+s-o}if(a=a?o-A:0;o-=s,r=o+(r-a),a=o}else if(r=r?o-A:0;o-=s,a=o+(a-r),r=o}return{from:o,toA:a,toB:r}}function _cA(i){let e=[];if(i.root.activeElement!=i.contentDOM)return e;let{anchorNode:A,anchorOffset:t,focusNode:n,focusOffset:o}=i.observer.selectionRange;return A&&(e.push(new a8(A,t)),(n!=A||o!=t)&&e.push(new a8(n,o))),e}function xcA(i,e){if(i.length==0)return null;let A=i[0].pos,t=i.length==2?i[1].pos:A;return A>-1&&t>-1?Be.single(A+e,t+e):null}function r8(i,e){return e.head==i.main.head&&e.anchor==i.main.anchor}var Y9=class{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastTouchX=0,this.lastTouchY=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.lastWheelEvent=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText="",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,Ct.safari&&e.contentDOM.addEventListener("input",()=>null),Ct.gecko&&PcA(e.contentDOM.ownerDocument)}handleEvent(e){!UcA(this.view,e)||this.ignoreDuringComposition(e)||e.type=="keydown"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,A){let t=this.handlers[e];if(t){for(let n of t.observers)n(this.view,A);for(let n of t.handlers){if(A.defaultPrevented)break;if(n(this.view,A)){A.preventDefault();break}}}}ensureHandlers(e){let A=RcA(e),t=this.handlers,n=this.view.contentDOM;for(let o in A)if(o!="scroll"){let a=!A[o].handlers.length,r=t[o];r&&a!=!r.handlers.length&&(n.removeEventListener(o,this.handleEvent),r=null),r||n.addEventListener(o,this.handleEvent,{passive:a})}for(let o in t)o!="scroll"&&!A[o]&&n.removeEventListener(o,this.handleEvent);this.handlers=A}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&CH.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),Ct.android&&Ct.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;let A;return Ct.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&!e.shiftKey&&((A=cH.find(t=>t.keyCode==e.keyCode))&&!e.ctrlKey||NcA.indexOf(e.key)>-1&&e.ctrlKey)?(this.pendingIOSKey=A||e,setTimeout(()=>this.flushIOSKey(),250),!0):(e.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(e){let A=this.pendingIOSKey;return!A||A.key=="Enter"&&e&&e.from0?!0:Ct.safari&&!Ct.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function aY(i,e){return(A,t)=>{try{return e.call(i,t,A)}catch(n){Gr(A.state,n)}}}function RcA(i){let e=Object.create(null);function A(t){return e[t]||(e[t]={observers:[],handlers:[]})}for(let t of i){let n=t.spec,o=n&&n.plugin.domEventHandlers,a=n&&n.plugin.domEventObservers;if(o)for(let r in o){let s=o[r];s&&A(r).handlers.push(aY(t.value,s))}if(a)for(let r in a){let s=a[r];s&&A(r).observers.push(aY(t.value,s))}}for(let t in sc)A(t).handlers.push(sc[t]);for(let t in cl)A(t).observers.push(cl[t]);return e}var cH=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],NcA="dthko",CH=[16,17,18,20,91,92,224,225],T6=6;function O6(i){return Math.max(0,i)*.7+8}function FcA(i,e){return Math.max(Math.abs(i.clientX-e.clientX),Math.abs(i.clientY-e.clientY))}var H9=class{constructor(e,A,t,n){this.view=e,this.startEvent=A,this.style=t,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=A,this.scrollParents=GY(e.contentDOM),this.atoms=e.state.facet(C4).map(a=>a(e));let o=e.contentDOM.ownerDocument;o.addEventListener("mousemove",this.move=this.move.bind(this)),o.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=A.shiftKey,this.multiple=e.state.facet(ir.allowMultipleSelections)&&LcA(e,A),this.dragging=KcA(e,A)&&BH(A)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&FcA(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let A=0,t=0,n=0,o=0,a=this.view.win.innerWidth,r=this.view.win.innerHeight;this.scrollParents.x&&({left:n,right:a}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:o,bottom:r}=this.scrollParents.y.getBoundingClientRect());let s=pS(this.view);e.clientX-s.left<=n+T6?A=-O6(n-e.clientX):e.clientX+s.right>=a-T6&&(A=O6(e.clientX-a)),e.clientY-s.top<=o+T6?t=-O6(o-e.clientY):e.clientY+s.bottom>=r-T6&&(t=O6(e.clientY-r)),this.setScrollSpeed(A,t)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,A){this.scrollSpeed={x:e,y:A},e||A?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:A}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),A&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=A,A=0),(e||A)&&this.view.win.scrollBy(e,A),this.dragging===!1&&this.select(this.lastEvent)}select(e){let{view:A}=this,t=rH(this.atoms,this.style.get(e,this.extend,this.multiple));(this.mustSelect||!t.eq(A.state.selection,this.dragging===!1))&&this.view.dispatch({selection:t,userEvent:"select.pointer"}),this.mustSelect=!1}update(e){e.transactions.some(A=>A.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}};function LcA(i,e){let A=i.state.facet(jY);return A.length?A[0](e):Ct.mac?e.metaKey:e.ctrlKey}function GcA(i,e){let A=i.state.facet(VY);return A.length?A[0](e):Ct.mac?!e.altKey:!e.ctrlKey}function KcA(i,e){let{main:A}=i.state.selection;if(A.empty)return!1;let t=g4(i.root);if(!t||t.rangeCount==0)return!0;let n=t.getRangeAt(0).getClientRects();for(let o=0;o=e.clientX&&a.top<=e.clientY&&a.bottom>=e.clientY)return!0}return!1}function UcA(i,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let A=e.target,t;A!=i.contentDOM;A=A.parentNode)if(!A||A.nodeType==11||(t=_a.get(A))&&t.isWidget()&&!t.isHidden&&t.widget.ignoreEvent(e))return!1;return!0}var sc=Object.create(null),cl=Object.create(null),dH=Ct.ie&&Ct.ie_version<15||Ct.ios&&Ct.webkit_version<604;function TcA(i){let e=i.dom.parentNode;if(!e)return;let A=e.appendChild(document.createElement("textarea"));A.style.cssText="position: fixed; left: -10000px; top: 10px",A.focus(),setTimeout(()=>{i.focus(),A.remove(),IH(i,A.value)},50)}function u8(i,e,A){for(let t of i.facet(e))A=t(A,i);return A}function IH(i,e){e=u8(i.state,ES,e);let{state:A}=i,t,n=1,o=A.toText(e),a=o.lines==A.selection.ranges.length;if(z9!=null&&A.selection.ranges.every(s=>s.empty)&&z9==o.toString()){let s=-1;t=A.changeByRange(l=>{let g=A.doc.lineAt(l.from);if(g.from==s)return{range:l};s=g.from;let C=A.toText((a?o.line(n++).text:e)+A.lineBreak);return{changes:{from:g.from,insert:C},range:Be.cursor(l.from+C.length)}})}else a?t=A.changeByRange(s=>{let l=o.line(n++);return{changes:{from:s.from,to:s.to,insert:l.text},range:Be.cursor(s.from+l.length)}}):t=A.replaceSelection(o);i.dispatch(t,{userEvent:"input.paste",scrollIntoView:!0})}cl.scroll=i=>{i.inputState.lastScrollTop=i.scrollDOM.scrollTop,i.inputState.lastScrollLeft=i.scrollDOM.scrollLeft};cl.wheel=cl.mousewheel=i=>{i.inputState.lastWheelEvent=Date.now()};sc.keydown=(i,e)=>(i.inputState.setSelectionOrigin("select"),e.keyCode==27&&i.inputState.tabFocusMode!=0&&(i.inputState.tabFocusMode=Date.now()+2e3),!1);cl.touchstart=(i,e)=>{let A=i.inputState,t=e.targetTouches[0];A.lastTouchTime=Date.now(),t&&(A.lastTouchX=t.clientX,A.lastTouchY=t.clientY),A.setSelectionOrigin("select.pointer")};cl.touchmove=i=>{i.inputState.setSelectionOrigin("select.pointer")};sc.mousedown=(i,e)=>{if(i.observer.flush(),i.inputState.lastTouchTime>Date.now()-2e3)return!1;let A=null;for(let t of i.state.facet(qY))if(A=t(i,e),A)break;if(!A&&e.button==0&&(A=JcA(i,e)),A){let t=!i.hasFocus;i.inputState.startMouseSelection(new H9(i,e,A,t)),t&&i.observer.ignore(()=>{KY(i.contentDOM);let o=i.root.activeElement;o&&!o.contains(i.contentDOM)&&o.blur()});let n=i.inputState.mouseSelection;if(n)return n.start(e),n.dragging===!1}else i.inputState.setSelectionOrigin("select.pointer");return!1};function rY(i,e,A,t){if(t==1)return Be.cursor(e,A);if(t==2)return wcA(i.state,e,A);{let n=i.docView.lineAt(e,A),o=i.state.doc.lineAt(n?n.posAtEnd:e),a=n?n.posAtStart:o.from,r=n?n.posAtEnd:o.to;return rDate.now()-400&&Math.abs(e.clientX-i.clientX)<2&&Math.abs(e.clientY-i.clientY)<2?(lY+1)%3:1}function JcA(i,e){let A=i.posAndSideAtCoords({x:e.clientX,y:e.clientY},!1),t=BH(e),n=i.state.selection;return{update(o){o.docChanged&&(A.pos=o.changes.mapPos(A.pos),n=n.map(o.changes))},get(o,a,r){let s=i.posAndSideAtCoords({x:o.clientX,y:o.clientY},!1),l,g=rY(i,s.pos,s.assoc,t);if(A.pos!=s.pos&&!a){let C=rY(i,A.pos,A.assoc,t),d=Math.min(C.from,g.from),B=Math.max(C.to,g.to);g=d1&&(l=YcA(n,s.pos))?l:r?n.addRange(g):Be.create([g])}}}function YcA(i,e){for(let A=0;A=e)return Be.create(i.ranges.slice(0,A).concat(i.ranges.slice(A+1)),i.mainIndex==A?0:i.mainIndex-(i.mainIndex>A?1:0))}return null}sc.dragstart=(i,e)=>{let{selection:{main:A}}=i.state;if(e.target.draggable){let n=i.docView.tile.nearest(e.target);if(n&&n.isWidget()){let o=n.posAtStart,a=o+n.length;(o>=A.to||a<=A.from)&&(A=Be.range(o,a))}}let{inputState:t}=i;return t.mouseSelection&&(t.mouseSelection.dragging=!0),t.draggedContent=A,e.dataTransfer&&(e.dataTransfer.setData("Text",u8(i.state,QS,i.state.sliceDoc(A.from,A.to))),e.dataTransfer.effectAllowed="copyMove"),!1};sc.dragend=i=>(i.inputState.draggedContent=null,!1);function cY(i,e,A,t){if(A=u8(i.state,ES,A),!A)return;let n=i.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:o}=i.inputState,a=t&&o&&GcA(i,e)?{from:o.from,to:o.to}:null,r={from:n,insert:A},s=i.state.changes(a?[a,r]:r);i.focus(),i.dispatch({changes:s,selection:{anchor:s.mapPos(n,-1),head:s.mapPos(n,1)},userEvent:a?"move.drop":"input.drop"}),i.inputState.draggedContent=null}sc.drop=(i,e)=>{if(!e.dataTransfer)return!1;if(i.state.readOnly)return!0;let A=e.dataTransfer.files;if(A&&A.length){let t=Array(A.length),n=0,o=()=>{++n==A.length&&cY(i,e,t.filter(a=>a!=null).join(i.state.lineBreak),!1)};for(let a=0;a{/[\x00-\x08\x0e-\x1f]{2}/.test(r.result)||(t[a]=r.result),o()},r.readAsText(A[a])}return!0}else{let t=e.dataTransfer.getData("Text");if(t)return cY(i,e,t,!0),!0}return!1};sc.paste=(i,e)=>{if(i.state.readOnly)return!0;i.observer.flush();let A=dH?null:e.clipboardData;return A?(IH(i,A.getData("text/plain")||A.getData("text/uri-list")),!0):(TcA(i),!1)};function HcA(i,e){let A=i.dom.parentNode;if(!A)return;let t=A.appendChild(document.createElement("textarea"));t.style.cssText="position: fixed; left: -10000px; top: 10px",t.value=e,t.focus(),t.selectionEnd=e.length,t.selectionStart=0,setTimeout(()=>{t.remove(),i.focus()},50)}function zcA(i){let e=[],A=[],t=!1;for(let n of i.selection.ranges)n.empty||(e.push(i.sliceDoc(n.from,n.to)),A.push(n));if(!e.length){let n=-1;for(let{from:o}of i.selection.ranges){let a=i.doc.lineAt(o);a.number>n&&(e.push(a.text),A.push({from:a.from,to:Math.min(i.doc.length,a.to+1)})),n=a.number}t=!0}return{text:u8(i,QS,e.join(i.lineBreak)),ranges:A,linewise:t}}var z9=null;sc.copy=sc.cut=(i,e)=>{if(!$u(i.contentDOM,i.observer.selectionRange))return!1;let{text:A,ranges:t,linewise:n}=zcA(i.state);if(!A&&!n)return!1;z9=n?A:null,e.type=="cut"&&!i.state.readOnly&&i.dispatch({changes:t,scrollIntoView:!0,userEvent:"delete.cut"});let o=dH?null:e.clipboardData;return o?(o.clearData(),o.setData("text/plain",A),!0):(HcA(i,A),!1)};var hH=sl.define();function EH(i,e){let A=[];for(let t of i.facet(XY)){let n=t(i,e);n&&A.push(n)}return A.length?i.update({effects:A,annotations:hH.of(!0)}):null}function QH(i){setTimeout(()=>{let e=i.hasFocus;if(e!=i.inputState.notifiedFocused){let A=EH(i.state,e);A?i.dispatch(A):i.update([])}},10)}cl.focus=i=>{i.inputState.lastFocusTime=Date.now(),!i.scrollDOM.scrollTop&&(i.inputState.lastScrollTop||i.inputState.lastScrollLeft)&&(i.scrollDOM.scrollTop=i.inputState.lastScrollTop,i.scrollDOM.scrollLeft=i.inputState.lastScrollLeft),QH(i)};cl.blur=i=>{i.observer.clearSelectionRange(),QH(i)};cl.compositionstart=cl.compositionupdate=i=>{i.observer.editContext||(i.inputState.compositionFirstChange==null&&(i.inputState.compositionFirstChange=!0),i.inputState.composing<0&&(i.inputState.composing=0))};cl.compositionend=i=>{i.observer.editContext||(i.inputState.composing=-1,i.inputState.compositionEndedAt=Date.now(),i.inputState.compositionPendingKey=!0,i.inputState.compositionPendingChange=i.observer.pendingRecords().length>0,i.inputState.compositionFirstChange=null,Ct.chrome&&Ct.android?i.observer.flushSoon():i.inputState.compositionPendingChange?Promise.resolve().then(()=>i.observer.flush()):setTimeout(()=>{i.inputState.composing<0&&i.docView.hasComposition&&i.update([])},50))};cl.contextmenu=i=>{i.inputState.lastContextMenu=Date.now()};sc.beforeinput=(i,e)=>{var A,t;if((e.inputType=="insertText"||e.inputType=="insertCompositionText")&&(i.inputState.insertingText=e.data,i.inputState.insertingTextAt=Date.now()),e.inputType=="insertReplacementText"&&i.observer.editContext){let o=(A=e.dataTransfer)===null||A===void 0?void 0:A.getData("text/plain"),a=e.getTargetRanges();if(o&&a.length){let r=a[0],s=i.posAtDOM(r.startContainer,r.startOffset),l=i.posAtDOM(r.endContainer,r.endOffset);return fS(i,{from:s,to:l,insert:i.state.toText(o)},null),!0}}let n;if(Ct.chrome&&Ct.android&&(n=cH.find(o=>o.inputType==e.inputType))&&(i.observer.delayAndroidKey(n.key,n.keyCode),n.key=="Backspace"||n.key=="Delete")){let o=((t=window.visualViewport)===null||t===void 0?void 0:t.height)||0;setTimeout(()=>{var a;(((a=window.visualViewport)===null||a===void 0?void 0:a.height)||0)>o+10&&i.hasFocus&&(i.contentDOM.blur(),i.focus())},100)}return Ct.ios&&e.inputType=="deleteContentForward"&&i.observer.flushSoon(),Ct.safari&&e.inputType=="insertText"&&i.inputState.composing>=0&&setTimeout(()=>cl.compositionend(i,e),20),!1};var CY=new Set;function PcA(i){CY.has(i)||(CY.add(i),i.addEventListener("copy",()=>{}),i.addEventListener("cut",()=>{}))}var dY=["pre-wrap","normal","pre-line","break-spaces"],sh=!1;function IY(){sh=!1}var P9=class{constructor(e){this.lineWrapping=e,this.doc=On.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,A){let t=this.doc.lineAt(A).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(t+=Math.max(0,Math.ceil((A-e-t*this.lineLength*.5)/this.lineLength))),this.lineHeight*t}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return dY.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let A=!1;for(let t=0;t-1,s=Math.abs(A-this.lineHeight)>.3||this.lineWrapping!=r||Math.abs(t-this.charWidth)>.1;if(this.lineWrapping=r,this.lineHeight=A,this.charWidth=t,this.textHeight=n,this.lineLength=o,s){this.heightSamples={};for(let l=0;l0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>q6&&(sh=!0),this.height=e)}replace(e,A,t){return i.of(t)}decomposeLeft(e,A){A.push(this)}decomposeRight(e,A){A.push(this)}applyChanges(e,A,t,n){let o=this,a=t.doc;for(let r=n.length-1;r>=0;r--){let{fromA:s,toA:l,fromB:g,toB:C}=n[r],d=o.lineAt(s,Qa.ByPosNoHeight,t.setDoc(A),0,0),B=d.to>=l?d:o.lineAt(l,Qa.ByPosNoHeight,t,0,0);for(C+=B.to-l,l=B.to;r>0&&d.from<=n[r-1].toA;)s=n[r-1].fromA,g=n[r-1].fromB,r--,so*2){let r=e[A-1];r.break?e.splice(--A,1,r.left,null,r.right):e.splice(--A,1,r.left,r.right),t+=1+r.break,n-=r.size}else if(o>n*2){let r=e[t];r.break?e.splice(t,1,r.left,null,r.right):e.splice(t,1,r.left,r.right),t+=2+r.break,o-=r.size}else break;else if(n=o&&a(this.lineAt(0,Qa.ByPos,t,n,o))}setMeasuredHeight(e){let A=e.heights[e.index++];A<0?(this.spaceAbove=-A,A=e.heights[e.index++]):this.spaceAbove=0,this.setHeight(A)}updateHeight(e,A=0,t=!1,n){return n&&n.from<=A&&n.more&&this.setMeasuredHeight(n),this.outdated=!1,this}toString(){return`block(${this.length})`}},dg=class i extends l8{constructor(e,A,t){super(e,A,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=t}mainBlock(e,A){return new ac(A,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(e,A,t){let n=t[0];return t.length==1&&(n instanceof i||n instanceof M2&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof M2?n=new i(n.length,this.height,this.spaceAbove):n.height=this.height,this.outdated||(n.outdated=!1),n):Nl.of(t)}updateHeight(e,A=0,t=!1,n){return n&&n.from<=A&&n.more?this.setMeasuredHeight(n):(t||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},M2=class i extends Nl{constructor(e){super(e,0)}heightMetrics(e,A){let t=e.doc.lineAt(A).number,n=e.doc.lineAt(A+this.length).number,o=n-t+1,a,r=0;if(e.lineWrapping){let s=Math.min(this.height,e.lineHeight*o);a=s/o,this.length>o+1&&(r=(this.height-s)/(this.length-o-1))}else a=this.height/o;return{firstLine:t,lastLine:n,perLine:a,perChar:r}}blockAt(e,A,t,n){let{firstLine:o,lastLine:a,perLine:r,perChar:s}=this.heightMetrics(A,n);if(A.lineWrapping){let l=n+(e0){let o=t[t.length-1];o instanceof i?t[t.length-1]=new i(o.length+n):t.push(null,new i(n-1))}if(e>0){let o=t[0];o instanceof i?t[0]=new i(e+o.length):t.unshift(new i(e-1),null)}return Nl.of(t)}decomposeLeft(e,A){A.push(new i(e-1),null)}decomposeRight(e,A){A.push(null,new i(this.length-e-1))}updateHeight(e,A=0,t=!1,n){let o=A+this.length;if(n&&n.from<=A+this.length&&n.more){let a=[],r=Math.max(A,n.from),s=-1;for(n.from>A&&a.push(new i(n.from-A-1).updateHeight(e,A));r<=o&&n.more;){let g=e.doc.lineAt(r).length;a.length&&a.push(null);let C=n.heights[n.index++],d=0;C<0&&(d=-C,C=n.heights[n.index++]),s==-1?s=C:Math.abs(C-s)>=q6&&(s=-2);let B=new dg(g,C,d);B.outdated=!1,a.push(B),r+=g+1}r<=o&&a.push(null,new i(o-r).updateHeight(e,r));let l=Nl.of(a);return(s<0||Math.abs(l.height-this.height)>=q6||Math.abs(s-this.heightMetrics(e,A).perLine)>=q6)&&(sh=!0),s8(this,l)}else(t||this.outdated)&&(this.setHeight(e.heightForGap(A,A+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},V9=class extends Nl{constructor(e,A,t){super(e.length+A+t.length,e.height+t.height,A|(e.outdated||t.outdated?2:0)),this.left=e,this.right=t,this.size=e.size+t.size}get break(){return this.flags&1}blockAt(e,A,t,n){let o=t+this.left.height;return er))return l;let g=A==Qa.ByPosNoHeight?Qa.ByPosNoHeight:Qa.ByPos;return s?l.join(this.right.lineAt(r,g,t,a,r)):this.left.lineAt(r,g,t,n,o).join(l)}forEachLine(e,A,t,n,o,a){let r=n+this.left.height,s=o+this.left.length+this.break;if(this.break)e=s&&this.right.forEachLine(e,A,t,r,s,a);else{let l=this.lineAt(s,Qa.ByPos,t,n,o);e=e&&l.from<=A&&a(l),A>l.to&&this.right.forEachLine(l.to+1,A,t,r,s,a)}}replace(e,A,t){let n=this.left.length+this.break;if(Athis.left.length)return this.balanced(this.left,this.right.replace(e-n,A-n,t));let o=[];e>0&&this.decomposeLeft(e,o);let a=o.length;for(let r of t)o.push(r);if(e>0&&BY(o,a-1),A=t&&A.push(null)),e>t&&this.right.decomposeLeft(e-t,A)}decomposeRight(e,A){let t=this.left.length,n=t+this.break;if(e>=n)return this.right.decomposeRight(e-n,A);e2*A.size||A.size>2*e.size?Nl.of(this.break?[e,null,A]:[e,A]):(this.left=s8(this.left,e),this.right=s8(this.right,A),this.setHeight(e.height+A.height),this.outdated=e.outdated||A.outdated,this.size=e.size+A.size,this.length=e.length+this.break+A.length,this)}updateHeight(e,A=0,t=!1,n){let{left:o,right:a}=this,r=A+o.length+this.break,s=null;return n&&n.from<=A+o.length&&n.more?s=o=o.updateHeight(e,A,t,n):o.updateHeight(e,A,t),n&&n.from<=r+a.length&&n.more?s=a=a.updateHeight(e,r,t,n):a.updateHeight(e,r,t),s?this.balanced(o,a):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function BY(i,e){let A,t;i[e]==null&&(A=i[e-1])instanceof M2&&(t=i[e+1])instanceof M2&&i.splice(e-1,3,new M2(A.length+1+t.length))}var VcA=5,q9=class i{constructor(e,A){this.pos=e,this.oracle=A,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,A){if(this.lineStart>-1){let t=Math.min(A,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof dg?n.length+=t-this.pos:(t>this.pos||!this.isCovered)&&this.nodes.push(new dg(t-this.pos,-1,0)),this.writtenTo=t,A>t&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=A}point(e,A,t){if(e=VcA)&&this.addLineDeco(n,o,a)}else A>e&&this.span(e,A);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:A}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=A,this.writtenToe&&this.nodes.push(new dg(this.pos-e,-1,0)),this.writtenTo=this.pos}blankContent(e,A){let t=new M2(A-e);return this.oracle.doc.lineAt(e).to==A&&(t.flags|=4),t}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof dg)return e;let A=new dg(0,-1,0);return this.nodes.push(A),A}addBlock(e){this.enterLine();let A=e.deco;A&&A.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,A&&A.endSide>0&&(this.covering=e)}addLineDeco(e,A,t){let n=this.ensureLine();n.length+=t,n.collapsed+=t,n.widgetHeight=Math.max(n.widgetHeight,e),n.breaks+=A,this.writtenTo=this.pos=this.pos+t}finish(e){let A=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(A instanceof dg)&&!this.isCovered?this.nodes.push(new dg(0,-1,0)):(this.writtenTog.clientHeight||g.scrollWidth>g.clientWidth)&&C.overflow!="visible"){let d=g.getBoundingClientRect();o=Math.max(o,d.left),a=Math.min(a,d.right),r=Math.max(r,d.top),s=Math.min(l==i.parentNode?n.innerHeight:s,d.bottom)}l=C.position=="absolute"||C.position=="fixed"?g.offsetParent:g.parentNode}else if(l.nodeType==11)l=l.host;else break;return{left:o-A.left,right:Math.max(o,a)-A.left,top:r-(A.top+e),bottom:Math.max(r,s)-(A.top+e)}}function ZcA(i){let e=i.getBoundingClientRect(),A=i.ownerDocument.defaultView||window;return e.left0&&e.top0}function XcA(i,e){let A=i.getBoundingClientRect();return{left:0,right:A.right-A.left,top:e,bottom:A.bottom-(A.top+e)}}var o4=class{constructor(e,A,t,n){this.from=e,this.to=A,this.size=t,this.displaySize=n}static same(e,A){if(e.length!=A.length)return!1;for(let t=0;ttypeof n!="function"&&n.class=="cm-lineWrapping");this.heightOracle=new P9(t),this.stateDeco=EY(A),this.heightMap=Nl.empty().applyChanges(this.stateDeco,On.empty,this.heightOracle.setDoc(A.doc),[new rc(0,0,0,A.doc.length)]);for(let n=0;n<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());n++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=Lt.set(this.lineGaps.map(n=>n.draw(this,!1))),this.scrollParent=e.scrollDOM,this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:A}=this.state.selection;for(let t=0;t<=1;t++){let n=t?A.head:A.anchor;if(!e.some(({from:o,to:a})=>n>=o&&n<=a)){let{from:o,to:a}=this.lineBlockAt(n);e.push(new $B(o,a))}}return this.viewports=e.sort((t,n)=>t.from-n.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?hY:new X9(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(Zu(e,this.scaler))})}update(e,A=null){this.state=e.state;let t=this.stateDeco;this.stateDeco=EY(this.state);let n=e.changedRanges,o=rc.extendWithRanges(n,qcA(t,this.stateDeco,e?e.changes:Zr.empty(this.state.doc.length))),a=this.heightMap.height,r=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollOffset);IY(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),o),(this.heightMap.height!=a||sh)&&(e.flags|=2),r?(this.scrollAnchorPos=e.changes.mapPos(r.from,-1),this.scrollAnchorHeight=r.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=a);let s=o.length?this.mapViewport(this.viewport,e.changes):this.viewport;(A&&(A.range.heads.to)||!this.viewportIsAppropriate(s))&&(s=this.getViewport(0,A));let l=s.from!=this.viewport.from||s.to!=this.viewport.to;this.viewport=s,e.flags|=this.updateForViewport(),(l||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),A&&(this.scrollTarget=A),!this.mustEnforceCursorAssoc&&(e.selectionSet||e.focusChanged)&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet($Y)&&(this.mustEnforceCursorAssoc=!0)}measure(){let{view:e}=this,A=e.contentDOM,t=window.getComputedStyle(A),n=this.heightOracle,o=t.whiteSpace;this.defaultTextDirection=t.direction=="rtl"?Lo.RTL:Lo.LTR;let a=this.heightOracle.mustRefreshForWrapping(o)||this.mustMeasureContent==="refresh",r=A.getBoundingClientRect(),s=a||this.mustMeasureContent||this.contentDOMHeight!=r.height;this.contentDOMHeight=r.height,this.mustMeasureContent=!1;let l=0,g=0;if(r.width&&r.height){let{scaleX:M,scaleY:x}=LY(A,r);(M>.005&&Math.abs(this.scaleX-M)>.005||x>.005&&Math.abs(this.scaleY-x)>.005)&&(this.scaleX=M,this.scaleY=x,l|=16,a=s=!0)}let C=(parseInt(t.paddingTop)||0)*this.scaleY,d=(parseInt(t.paddingBottom)||0)*this.scaleY;(this.paddingTop!=C||this.paddingBottom!=d)&&(this.paddingTop=C,this.paddingBottom=d,l|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(n.lineWrapping&&(s=!0),this.editorWidth=e.scrollDOM.clientWidth,l|=16);let B=GY(this.view.contentDOM,!1).y;B!=this.scrollParent&&(this.scrollParent=B,this.scrollAnchorHeight=-1,this.scrollOffset=0);let u=this.getScrollOffset();this.scrollOffset!=u&&(this.scrollAnchorHeight=-1,this.scrollOffset=u),this.scrolledToBottom=UY(this.scrollParent||e.win);let E=(this.printing?XcA:WcA)(A,this.paddingTop),f=E.top-this.pixelViewport.top,m=E.bottom-this.pixelViewport.bottom;this.pixelViewport=E;let v=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(v!=this.inView&&(this.inView=v,v&&(s=!0)),!this.inView&&!this.scrollTarget&&!ZcA(e.dom))return 0;let S=r.width;if((this.contentDOMWidth!=S||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=r.width,this.editorHeight=e.scrollDOM.clientHeight,l|=16),s){let M=e.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(M)&&(a=!0),a||n.lineWrapping&&Math.abs(S-this.contentDOMWidth)>n.charWidth){let{lineHeight:x,charWidth:F,textHeight:z}=e.docView.measureTextSize();a=x>0&&n.refresh(o,x,F,z,Math.max(5,S/F),M),a&&(e.docView.minWidth=0,l|=16)}f>0&&m>0?g=Math.max(f,m):f<0&&m<0&&(g=Math.min(f,m)),IY();for(let x of this.viewports){let F=x.from==this.viewport.from?M:e.docView.measureVisibleLineHeights(x);this.heightMap=(a?Nl.empty().applyChanges(this.stateDeco,On.empty,this.heightOracle,[new rc(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(n,0,a,new j9(x.from,F))}sh&&(l|=2)}let k=!this.viewportIsAppropriate(this.viewport,g)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return k&&(l&2&&(l|=this.updateScaler()),this.viewport=this.getViewport(g,this.scrollTarget),l|=this.updateForViewport()),(l&2||k)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(a?[]:this.lineGaps,e)),l|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),l}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,A){let t=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),n=this.heightMap,o=this.heightOracle,{visibleTop:a,visibleBottom:r}=this,s=new $B(n.lineAt(a-t*1e3,Qa.ByHeight,o,0,0).from,n.lineAt(r+(1-t)*1e3,Qa.ByHeight,o,0,0).to);if(A){let{head:l}=A.range;if(ls.to){let g=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),C=n.lineAt(l,Qa.ByPos,o,0,0),d;A.y=="center"?d=(C.top+C.bottom)/2-g/2:A.y=="start"||A.y=="nearest"&&l=r+Math.max(10,Math.min(t,250)))&&n>a-2*1e3&&o>1,a=n<<1;if(this.defaultTextDirection!=Lo.LTR&&!t)return[];let r=[],s=(g,C,d,B)=>{if(C-gg&&mm.from>=d.from&&m.to<=d.to&&Math.abs(m.from-g)m.fromv));if(!f){if(CS.from<=C&&S.to>=C)){let S=A.moveToLineBoundary(Be.cursor(C),!1,!0).head;S>g&&(C=S)}let m=this.gapSize(d,g,C,B),v=t||m<2e6?m:2e6;f=new o4(g,C,m,v)}r.push(f)},l=g=>{if(g.length2e6)for(let x of e)x.from>=g.from&&x.fromg.from&&s(g.from,B,g,C),uA.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let A=this.stateDeco;this.lineGaps.length&&(A=A.concat(this.lineGapDeco));let t=[];uo.spans(A,this.viewport.from,this.viewport.to,{span(o,a){t.push({from:o,to:a})},point(){}},20);let n=0;if(t.length!=this.visibleRanges.length)n=12;else for(let o=0;o=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(A=>A.from<=e&&A.to>=e)||Zu(this.heightMap.lineAt(e,Qa.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(A=>A.top<=e&&A.bottom>=e)||Zu(this.heightMap.lineAt(this.scaler.fromDOM(e),Qa.ByHeight,this.heightOracle,0,0),this.scaler)}getScrollOffset(){return(this.scrollParent==this.view.scrollDOM?this.scrollParent.scrollTop:(this.scrollParent?this.scrollParent.getBoundingClientRect().top:0)-this.view.contentDOM.getBoundingClientRect().top)*this.scaleY}scrollAnchorAt(e){let A=this.lineBlockAtHeight(e+8);return A.from>=this.viewport.from||this.viewportLines[0].top-e>200?A:this.viewportLines[0]}elementAtHeight(e){return Zu(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},$B=class{constructor(e,A){this.from=e,this.to=A}};function $cA(i,e,A){let t=[],n=i,o=0;return uo.spans(A,i,e,{span(){},point(a,r){a>n&&(t.push({from:n,to:a}),o+=a-n),n=r}},20),n=1)return e[e.length-1].to;let t=Math.floor(i*A);for(let n=0;;n++){let{from:o,to:a}=e[n],r=a-o;if(t<=r)return o+t;t-=r}}function Y6(i,e){let A=0;for(let{from:t,to:n}of i.ranges){if(e<=n){A+=e-t;break}A+=n-t}return A/i.total}function A0A(i,e){for(let A of i)if(e(A))return A}var hY={toDOM(i){return i},fromDOM(i){return i},scale:1,eq(i){return i==this}};function EY(i){let e=i.facet(Q8).filter(t=>typeof t!="function"),A=i.facet(uS).filter(t=>typeof t!="function");return A.length&&e.push(uo.join(A)),e}var X9=class i{constructor(e,A,t){let n=0,o=0,a=0;this.viewports=t.map(({from:r,to:s})=>{let l=A.lineAt(r,Qa.ByPos,e,0,0).top,g=A.lineAt(s,Qa.ByPos,e,0,0).bottom;return n+=g-l,{from:r,to:s,top:l,bottom:g,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(A.height-n);for(let r of this.viewports)r.domTop=a+(r.top-o)*this.scale,a=r.domBottom=r.domTop+(r.bottom-r.top),o=r.bottom}toDOM(e){for(let A=0,t=0,n=0;;A++){let o=AA.from==e.viewports[t].from&&A.to==e.viewports[t].to):!1}};function Zu(i,e){if(e.scale==1)return i;let A=e.toDOM(i.top),t=e.toDOM(i.bottom);return new ac(i.from,i.length,A,t-A,Array.isArray(i._content)?i._content.map(n=>Zu(n,e)):i._content)}var H6=nt.define({combine:i=>i.join(" ")}),I9=nt.define({combine:i=>i.indexOf(!0)>-1}),$9=Cg.newName(),uH=Cg.newName(),pH=Cg.newName(),fH={"&light":"."+uH,"&dark":"."+pH};function AS(i,e,A){return new Cg(e,{finish(t){return/&/.test(t)?t.replace(/&\w*/,n=>{if(n=="&")return i;if(!A||!A[n])throw new RangeError(`Unsupported selector: ${n}`);return A[n]}):i+" "+t}})}var e0A=AS("."+$9,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-selectionHandle":{backgroundColor:"currentColor",width:"1.5px"},".cm-selectionHandle-start::before, .cm-selectionHandle-end::before":{content:'""',backgroundColor:"inherit",borderRadius:"50%",width:"8px",height:"8px",position:"absolute",left:"-3.25px"},".cm-selectionHandle-start::before":{top:"-8px"},".cm-selectionHandle-end::before":{bottom:"-8px"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},fH),t0A={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},B9=Ct.ie&&Ct.ie_version<=11,eS=class{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new D9,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(A=>{for(let t of A)this.queue.push(t);(Ct.ie&&Ct.ie_version<=11||Ct.ios&&e.composing)&&A.some(t=>t.type=="childList"&&t.removedNodes.length||t.type=="characterData"&&t.oldValue.length>t.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&Ct.android&&e.constructor.EDIT_CONTEXT!==!1&&!(Ct.chrome&&Ct.chrome_version<126)&&(this.editContext=new tS(e),e.state.facet(lC)&&(e.contentDOM.editContext=this.editContext.editContext)),B9&&(this.onCharData=A=>{this.queue.push({target:A.target,type:"characterData",oldValue:A.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var A;((A=this.view.docView)===null||A===void 0?void 0:A.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),A.length>0&&A[A.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(A=>{A.length>0&&A[A.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((A,t)=>A!=e[t]))){this.gapIntersection.disconnect();for(let A of e)this.gapIntersection.observe(A);this.gaps=e}}onSelectionChange(e){let A=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:t}=this,n=this.selectionRange;if(t.state.facet(lC)?t.root.activeElement!=this.dom:!$u(this.dom,n))return;let o=n.anchorNode&&t.docView.tile.nearest(n.anchorNode);if(o&&o.isWidget()&&o.widget.ignoreEvent(e)){A||(this.selectionChanged=!1);return}(Ct.ie&&Ct.ie_version<=11||Ct.android&&Ct.chrome)&&!t.state.selection.main.empty&&n.focusNode&&A4(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,A=g4(e.root);if(!A)return!1;let t=Ct.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&i0A(this.view,A)||A;if(!t||this.selectionRange.eq(t))return!1;let n=$u(this.dom,t);return n&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let o=this.delayedAndroidKey;o&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=o.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&o.force&&ih(this.dom,o.key,o.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||e=="Enter")&&(this.delayedAndroidKey={key:e,keyCode:A,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let A=-1,t=-1,n=!1;for(let o of e){let a=this.readMutation(o);a&&(a.typeOver&&(n=!0),A==-1?{from:A,to:t}=a:(A=Math.min(a.from,A),t=Math.max(a.to,t)))}return{from:A,to:t,typeOver:n}}readChange(){let{from:e,to:A,typeOver:t}=this.processRecords(),n=this.selectionChanged&&$u(this.dom,this.selectionRange);if(e<0&&!n)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let o=new J9(this.view,e,A,t);return this.view.docView.domChanged={newSel:o.newSel?o.newSel.main:null},o}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let A=this.readChange();if(!A)return this.view.requestMeasure(),!1;let t=this.view.state,n=lH(this.view,A);return this.view.state==t&&(A.domChanged||A.newSel&&!r8(this.view.state.selection,A.newSel.main))&&this.view.update([]),n}readMutation(e){let A=this.view.docView.tile.nearest(e.target);if(!A||A.isWidget())return null;if(A.markDirty(e.type=="attributes"),e.type=="childList"){let t=QY(A,e.previousSibling||e.target.previousSibling,-1),n=QY(A,e.nextSibling||e.target.nextSibling,1);return{from:t?A.posAfter(t):A.posAtStart,to:n?A.posBefore(n):A.posAtEnd,typeOver:!1}}else return e.type=="characterData"?{from:A.posAtStart,to:A.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(lC)!=e.state.facet(lC)&&(e.view.contentDOM.editContext=e.state.facet(lC)?this.editContext.editContext:null))}destroy(){var e,A,t;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(A=this.gapIntersection)===null||A===void 0||A.disconnect(),(t=this.resizeScroll)===null||t===void 0||t.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function QY(i,e,A){for(;e;){let t=_a.get(e);if(t&&t.parent==i)return t;let n=e.parentNode;e=n!=i.dom?n:A>0?e.nextSibling:e.previousSibling}return null}function uY(i,e){let A=e.startContainer,t=e.startOffset,n=e.endContainer,o=e.endOffset,a=i.docView.domAtPos(i.state.selection.main.anchor,1);return A4(a.node,a.offset,n,o)&&([A,t,n,o]=[n,o,A,t]),{anchorNode:A,anchorOffset:t,focusNode:n,focusOffset:o}}function i0A(i,e){if(e.getComposedRanges){let n=e.getComposedRanges(i.root)[0];if(n)return uY(i,n)}let A=null;function t(n){n.preventDefault(),n.stopImmediatePropagation(),A=n.getTargetRanges()[0]}return i.contentDOM.addEventListener("beforeinput",t,!0),i.dom.ownerDocument.execCommand("indent"),i.contentDOM.removeEventListener("beforeinput",t,!0),A?uY(i,A):null}var tS=class{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let A=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=t=>{let n=e.state.selection.main,{anchor:o,head:a}=n,r=this.toEditorPos(t.updateRangeStart),s=this.toEditorPos(t.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:t.updateRangeStart,editorBase:r,drifted:!1});let l=s-r>t.text.length;r==this.from&&othis.to&&(s=o);let g=gH(e.state.sliceDoc(r,s),t.text,(l?n.from:n.to)-r,l?"end":null);if(!g){let d=Be.single(this.toEditorPos(t.selectionStart),this.toEditorPos(t.selectionEnd));r8(d,n)||e.dispatch({selection:d,userEvent:"select"});return}let C={from:g.from+r,to:g.toA+r,insert:On.of(t.text.slice(g.from,g.toB).split(` -`))};if((Ct.mac||Ct.android)&&C.from==a-1&&/^\. ?$/.test(t.text)&&e.contentDOM.getAttribute("autocorrect")=="off"&&(C={from:r,to:s,insert:On.of([t.text.replace("."," ")])}),this.pendingContextChange=C,!e.state.readOnly){let d=this.to-this.from+(C.to-C.from+C.insert.length);fS(e,C,Be.single(this.toEditorPos(t.selectionStart,d),this.toEditorPos(t.selectionEnd,d)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)),C.from=0&&!/[\\p{Alphabetic}\\p{Number}_]/.test(A.text.slice(Math.max(0,t.updateRangeStart-1),Math.min(A.text.length,t.updateRangeStart+1)))&&this.handlers.compositionend(t)},this.handlers.characterboundsupdate=t=>{let n=[],o=null;for(let a=this.toEditorPos(t.rangeStart),r=this.toEditorPos(t.rangeEnd);a{let n=[];for(let o of t.getTextFormats()){let a=o.underlineStyle,r=o.underlineThickness;if(!/none/i.test(a)&&!/none/i.test(r)){let s=this.toEditorPos(o.rangeStart),l=this.toEditorPos(o.rangeEnd);if(s{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:t}=this.composing;this.composing=null,t&&this.reset(e.state)}};for(let t in this.handlers)A.addEventListener(t,this.handlers[t]);this.measureReq={read:t=>{this.editContext.updateControlBounds(t.contentDOM.getBoundingClientRect());let n=g4(t.root);n&&n.rangeCount&&this.editContext.updateSelectionBounds(n.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let A=0,t=!1,n=this.pendingContextChange;return e.changes.iterChanges((o,a,r,s,l)=>{if(t)return;let g=l.length-(a-o);if(n&&a>=n.to)if(n.from==o&&n.to==a&&n.insert.eq(l)){n=this.pendingContextChange=null,A+=g,this.to+=g;return}else n=null,this.revertPending(e.state);if(o+=A,a+=A,a<=this.from)this.from+=g,this.to+=g;else if(othis.to||this.to-this.from+l.length>3e4){t=!0;return}this.editContext.updateText(this.toContextPos(o),this.toContextPos(a),l.toString()),this.to+=g}A+=g}),n&&!t&&this.revertPending(e.state),!t}update(e){let A=this.pendingContextChange,t=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(t.from,t.to)&&e.transactions.some(n=>!n.isUserEvent("input.type")&&n.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||A)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:A}=e.selection.main;this.from=Math.max(0,A-1e4),this.to=Math.min(e.doc.length,A+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let A=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(A.from),this.toContextPos(A.from+A.insert.length),e.doc.sliceString(A.from,A.to))}setSelection(e){let{main:A}=e.selection,t=this.toContextPos(Math.max(this.from,Math.min(this.to,A.anchor))),n=this.toContextPos(A.head);(this.editContext.selectionStart!=t||this.editContext.selectionEnd!=n)&&this.editContext.updateSelection(t,n)}rangeIsValid(e){let{head:A}=e.selection.main;return!(this.from>0&&A-this.from<500||this.to1e4*3)}toEditorPos(e,A=this.to-this.from){e=Math.min(e,A);let t=this.composing;return t&&t.drifted?t.editorBase+(e-t.contextBase):e+this.from}toContextPos(e){let A=this.composing;return A&&A.drifted?A.contextBase+(e-A.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}},ui=(()=>{class i{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(A={}){var t;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),A.parent&&A.parent.appendChild(this.dom);let{dispatch:n}=A;this.dispatchTransactions=A.dispatchTransactions||n&&(o=>o.forEach(a=>n(a,this)))||(o=>this.update(o)),this.dispatch=this.dispatch.bind(this),this._root=A.root||ZgA(A.parent)||document,this.viewState=new g8(this,A.state||ir.create(A)),A.scrollTo&&A.scrollTo.is(U6)&&(this.viewState.scrollTarget=A.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(XB).map(o=>new t4(o));for(let o of this.plugins)o.update(this);this.observer=new eS(this),this.inputState=new Y9(this),this.inputState.ensureHandlers(this.plugins),this.docView=new o8(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((t=document.fonts)===null||t===void 0)&&t.ready&&document.fonts.ready.then(()=>{this.viewState.mustMeasureContent="refresh",this.requestMeasure()})}dispatch(...A){let t=A.length==1&&A[0]instanceof l0?A:A.length==1&&Array.isArray(A[0])?A[0]:[this.state.update(...A)];this.dispatchTransactions(t,this)}update(A){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let t=!1,n=!1,o,a=this.state;for(let B of A){if(B.startState!=a)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");a=B.state}if(this.destroyed){this.viewState.state=a;return}let r=this.hasFocus,s=0,l=null;A.some(B=>B.annotation(hH))?(this.inputState.notifiedFocused=r,s=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,l=EH(a,r),l||(s=1));let g=this.observer.delayedAndroidKey,C=null;if(g?(this.observer.clearDelayedAndroidKey(),C=this.observer.readChange(),(C&&!this.state.doc.eq(a.doc)||!this.state.selection.eq(a.selection))&&(C=null)):this.observer.clear(),a.facet(ir.phrases)!=this.state.facet(ir.phrases))return this.setState(a);o=i8.create(this,a,A),o.flags|=s;let d=this.viewState.scrollTarget;try{this.updateState=2;for(let B of A){if(d&&(d=d.map(B.changes)),B.scrollIntoView){let{main:u}=B.state.selection;d=new e4(u.empty?u:Be.cursor(u.head,u.head>u.anchor?-1:1))}for(let u of B.effects)u.is(U6)&&(d=u.value.clip(this.state))}this.viewState.update(o,d),this.bidiCache=c8.update(this.bidiCache,o.changes),o.empty||(this.updatePlugins(o),this.inputState.update(o)),t=this.docView.update(o),this.state.facet(Wu)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(A),this.docView.updateSelection(t,A.some(B=>B.isUserEvent("select.pointer")))}finally{this.updateState=0}if(o.startState.facet(H6)!=o.state.facet(H6)&&(this.viewState.mustMeasureContent=!0),(t||n||d||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),t&&this.docViewUpdate(),!o.empty)for(let B of this.state.facet(g9))try{B(o)}catch(u){Gr(this.state,u,"update listener")}(l||C)&&Promise.resolve().then(()=>{l&&this.state==l.startState&&this.dispatch(l),C&&!lH(this,C)&&g.force&&ih(this.contentDOM,g.key,g.keyCode)})}setState(A){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=A;return}this.updateState=2;let t=this.hasFocus;try{for(let n of this.plugins)n.destroy(this);this.viewState=new g8(this,A),this.plugins=A.facet(XB).map(n=>new t4(n)),this.pluginMap.clear();for(let n of this.plugins)n.update(this);this.docView.destroy(),this.docView=new o8(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}t&&this.focus(),this.requestMeasure()}updatePlugins(A){let t=A.startState.facet(XB),n=A.state.facet(XB);if(t!=n){let o=[];for(let a of n){let r=t.indexOf(a);if(r<0)o.push(new t4(a));else{let s=this.plugins[r];s.mustUpdate=A,o.push(s)}}for(let a of this.plugins)a.mustUpdate!=A&&a.destroy(this);this.plugins=o,this.pluginMap.clear()}else for(let o of this.plugins)o.mustUpdate=A;for(let o=0;o-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,A&&this.observer.forceFlush();let t=null,n=this.viewState.scrollParent,o=this.viewState.getScrollOffset(),{scrollAnchorPos:a,scrollAnchorHeight:r}=this.viewState;Math.abs(o-this.viewState.scrollOffset)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let s=0;;s++){if(r<0)if(UY(n||this.win))a=-1,r=this.viewState.heightMap.height;else{let u=this.viewState.scrollAnchorAt(o);a=u.from,r=u.top}this.updateState=1;let l=this.viewState.measure();if(!l&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(s>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let g=[];l&4||([this.measureRequests,g]=[g,this.measureRequests]);let C=g.map(u=>{try{return u.read(this)}catch(E){return Gr(this.state,E),pY}}),d=i8.create(this,this.state,[]),B=!1;d.flags|=l,t?t.flags|=l:t=d,this.updateState=2,d.empty||(this.updatePlugins(d),this.inputState.update(d),this.updateAttrs(),B=this.docView.update(d),B&&this.docViewUpdate());for(let u=0;u1||E<-1)&&(n==this.scrollDOM||this.hasFocus||Math.max(this.inputState.lastWheelEvent,this.inputState.lastTouchTime)>Date.now()-100)){o=o+E,n?n.scrollTop+=E:this.win.scrollBy(0,E),r=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(t&&!t.empty)for(let s of this.state.facet(g9))s(t)}get themeClasses(){return $9+" "+(this.state.facet(I9)?pH:uH)+" "+this.state.facet(H6)}updateAttrs(){let A=fY(this,AY,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),t={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(lC)?"true":"false",class:"cm-content",style:`${Ct.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(t["aria-readonly"]="true"),fY(this,S9,t);let n=this.observer.ignore(()=>{let o=WJ(this.contentDOM,this.contentAttrs,t),a=WJ(this.dom,this.editorAttrs,A);return o||a});return this.editorAttrs=A,this.contentAttrs=t,n}showAnnouncements(A){let t=!0;for(let n of A)for(let o of n.effects)if(o.is(i.announce)){t&&(this.announceDOM.textContent=""),t=!1;let a=this.announceDOM.appendChild(document.createElement("div"));a.textContent=o.value}}mountStyles(){this.styleModules=this.state.facet(Wu);let A=this.state.facet(i.cspNonce);Cg.mount(this.root,this.styleModules.concat(e0A).reverse(),A?{nonce:A}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(A){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),A){if(this.measureRequests.indexOf(A)>-1)return;if(A.key!=null){for(let t=0;tn.plugin==A)||null),t&&t.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(A){return this.readMeasured(),this.viewState.elementAtHeight(A)}lineBlockAtHeight(A){return this.readMeasured(),this.viewState.lineBlockAtHeight(A)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(A){return this.viewState.lineBlockAt(A)}get contentHeight(){return this.viewState.contentHeight}moveByChar(A,t,n){return d9(this,A,oY(this,A,t,n))}moveByGroup(A,t){return d9(this,A,oY(this,A,t,n=>vcA(this,A.head,n)))}visualLineSide(A,t){let n=this.bidiSpans(A),o=this.textDirectionAt(A.from),a=n[t?n.length-1:0];return Be.cursor(a.side(t,o)+A.from,a.forward(!t,o)?1:-1)}moveToLineBoundary(A,t,n=!0){return DcA(this,A,t,n)}moveVertically(A,t,n){return d9(this,A,bcA(this,A,t,n))}domAtPos(A,t=1){return this.docView.domAtPos(A,t)}posAtDOM(A,t=0){return this.docView.posFromDOM(A,t)}posAtCoords(A,t=!0){this.readMeasured();let n=U9(this,A,t);return n&&n.pos}posAndSideAtCoords(A,t=!0){return this.readMeasured(),U9(this,A,t)}coordsAtPos(A,t=1){this.readMeasured();let n=this.docView.coordsAt(A,t);if(!n||n.left==n.right)return n;let o=this.state.doc.lineAt(A),a=this.bidiSpans(o),r=a[Bg.find(a,A-o.from,-1,t)];return t8(n,r.dir==Lo.LTR==t>0)}coordsForChar(A){return this.readMeasured(),this.docView.coordsForChar(A)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(A){return!this.state.facet($J)||Athis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(A))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(A){if(A.length>n0A)return zY(A.length);let t=this.textDirectionAt(A.from),n;for(let a of this.bidiCache)if(a.from==A.from&&a.dir==t&&(a.fresh||HY(a.isolates,n=eY(this,A))))return a.order;n||(n=eY(this,A));let o=ocA(A.text,t,n);return this.bidiCache.push(new c8(A.from,A.to,t,n,!0,o)),o}get hasFocus(){var A;return(this.dom.ownerDocument.hasFocus()||Ct.safari&&((A=this.inputState)===null||A===void 0?void 0:A.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{KY(this.contentDOM),this.docView.updateSelection()})}setRoot(A){this._root!=A&&(this._root=A,this.observer.setWindow((A.nodeType==9?A:A.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let A of this.plugins)A.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(A,t={}){return U6.of(new e4(typeof A=="number"?Be.cursor(A):A,t.y,t.x,t.yMargin,t.xMargin))}scrollSnapshot(){let{scrollTop:A,scrollLeft:t}=this.scrollDOM,n=this.viewState.scrollAnchorAt(A);return U6.of(new e4(Be.cursor(n.from),"start","start",n.top-A,t,!0))}setTabFocusMode(A){A==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof A=="boolean"?this.inputState.tabFocusMode=A?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+A)}static domEventHandlers(A){return Po.define(()=>({}),{eventHandlers:A})}static domEventObservers(A){return Po.define(()=>({}),{eventObservers:A})}static theme(A,t){let n=Cg.newName(),o=[H6.of(n),Wu.of(AS(`.${n}`,A))];return t&&t.dark&&o.push(I9.of(!0)),o}static baseTheme(A){return oc.lowest(Wu.of(AS("."+$9,A,fH)))}static findFromDOM(A){var t;let n=A.querySelector(".cm-content"),o=n&&_a.get(n)||_a.get(A);return((t=o?.root)===null||t===void 0?void 0:t.view)||null}}return i.styleModule=Wu,i.inputHandler=ZY,i.clipboardInputFilter=ES,i.clipboardOutputFilter=QS,i.scrollHandler=AH,i.focusChangeEffect=XY,i.perLineTextDirection=$J,i.exceptionSink=WY,i.updateListener=g9,i.editable=lC,i.mouseSelectionStyle=qY,i.dragMovesSelection=VY,i.clickAddsSelectionRange=jY,i.decorations=Q8,i.blockWrappers=tH,i.outerDecorations=uS,i.atomicRanges=C4,i.bidiIsolatedRanges=iH,i.scrollMargins=nH,i.darkTheme=I9,i.cspNonce=nt.define({combine:e=>e.length?e[0]:""}),i.contentAttributes=S9,i.editorAttributes=AY,i.lineWrapping=i.contentAttributes.of({class:"cm-lineWrapping"}),i.announce=ln.define(),i})(),n0A=4096,pY={},c8=class i{constructor(e,A,t,n,o,a){this.from=e,this.to=A,this.dir=t,this.isolates=n,this.fresh=o,this.order=a}static update(e,A){if(A.empty&&!e.some(o=>o.fresh))return e;let t=[],n=e.length?e[e.length-1].dir:Lo.LTR;for(let o=Math.max(0,e.length-10);o=0;n--){let o=t[n],a=typeof o=="function"?o(i):o;a&&IS(a,A)}return A}var o0A=Ct.mac?"mac":Ct.windows?"win":Ct.linux?"linux":"key";function a0A(i,e){let A=i.split(/-(?!$)/),t=A[A.length-1];t=="Space"&&(t=" ");let n,o,a,r;for(let s=0;st.concat(n),[]))),A}function wH(i,e,A){return yH(mH(i.state),e,i,A)}var b2=null,s0A=4e3;function l0A(i,e=o0A){let A=Object.create(null),t=Object.create(null),n=(a,r)=>{let s=t[a];if(s==null)t[a]=r;else if(s!=r)throw new Error("Key binding "+a+" is used both as a regular binding and as a multi-stroke prefix")},o=(a,r,s,l,g)=>{var C,d;let B=A[a]||(A[a]=Object.create(null)),u=r.split(/ (?!$)/).map(m=>a0A(m,e));for(let m=1;m{let k=b2={view:S,prefix:v,scope:a};return setTimeout(()=>{b2==k&&(b2=null)},s0A),!0}]})}let E=u.join(" ");n(E,!1);let f=B[E]||(B[E]={preventDefault:!1,stopPropagation:!1,run:((d=(C=B._any)===null||C===void 0?void 0:C.run)===null||d===void 0?void 0:d.slice())||[]});s&&f.run.push(s),l&&(f.preventDefault=!0),g&&(f.stopPropagation=!0)};for(let a of i){let r=a.scope?a.scope.split(" "):["editor"];if(a.any)for(let l of r){let g=A[l]||(A[l]=Object.create(null));g._any||(g._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:C}=a;for(let d in g)g[d].run.push(B=>C(B,iS))}let s=a[e]||a.key;if(s)for(let l of r)o(l,s,a.run,a.preventDefault,a.stopPropagation),a.shift&&o(l,"Shift-"+s,a.shift,a.preventDefault,a.stopPropagation)}return A}var iS=null;function yH(i,e,A,t){iS=e;let n=zJ(e),o=$r(n,0),a=Rl(o)==n.length&&n!=" ",r="",s=!1,l=!1,g=!1;b2&&b2.view==A&&b2.scope==t&&(r=b2.prefix+" ",CH.indexOf(e.keyCode)<0&&(l=!0,b2=null));let C=new Set,d=f=>{if(f){for(let m of f.run)if(!C.has(m)&&(C.add(m),m(A)))return f.stopPropagation&&(g=!0),!0;f.preventDefault&&(f.stopPropagation&&(g=!0),l=!0)}return!1},B=i[t],u,E;return B&&(d(B[r+z6(n,e,!a)])?s=!0:a&&(e.altKey||e.metaKey||e.ctrlKey)&&!(Ct.windows&&e.ctrlKey&&e.altKey)&&!(Ct.mac&&e.altKey&&!(e.ctrlKey||e.metaKey))&&(u=sC[e.keyCode])&&u!=n?(d(B[r+z6(u,e,!0)])||e.shiftKey&&(E=WB[e.keyCode])!=n&&E!=u&&d(B[r+z6(E,e,!1)]))&&(s=!0):a&&e.shiftKey&&d(B[r+z6(n,e,!0)])&&(s=!0),!s&&d(B._any)&&(s=!0)),l&&(s=!0),s&&g&&e.stopPropagation(),iS=null,s}var md=class i{constructor(e,A,t,n,o){this.className=e,this.left=A,this.top=t,this.width=n,this.height=o}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,A){return A.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.width!=null&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,A,t){if(t.empty){let n=e.coordsAtPos(t.head,t.assoc||1);if(!n)return[];let o=DH(e);return[new i(A,n.left-o.left,n.top-o.top,null,n.bottom-n.top)]}else return g0A(e,A,t)}};function DH(i){let e=i.scrollDOM.getBoundingClientRect();return{left:(i.textDirection==Lo.LTR?e.left:e.right-i.scrollDOM.clientWidth*i.scaleX)-i.scrollDOM.scrollLeft*i.scaleX,top:e.top-i.scrollDOM.scrollTop*i.scaleY}}function wY(i,e,A,t){let n=i.coordsAtPos(e,A*2);if(!n)return t;let o=i.dom.getBoundingClientRect(),a=(n.top+n.bottom)/2,r=i.posAtCoords({x:o.left+1,y:a}),s=i.posAtCoords({x:o.right-1,y:a});return r==null||s==null?t:{from:Math.max(t.from,Math.min(r,s)),to:Math.min(t.to,Math.max(r,s))}}function g0A(i,e,A){if(A.to<=i.viewport.from||A.from>=i.viewport.to)return[];let t=Math.max(A.from,i.viewport.from),n=Math.min(A.to,i.viewport.to),o=i.textDirection==Lo.LTR,a=i.contentDOM,r=a.getBoundingClientRect(),s=DH(i),l=a.querySelector(".cm-line"),g=l&&window.getComputedStyle(l),C=r.left+(g?parseInt(g.paddingLeft)+Math.min(0,parseInt(g.textIndent)):0),d=r.right-(g?parseInt(g.paddingRight):0),B=K9(i,t,1),u=K9(i,n,-1),E=B.type==As.Text?B:null,f=u.type==As.Text?u:null;if(E&&(i.lineWrapping||B.widgetLineBreaks)&&(E=wY(i,t,1,E)),f&&(i.lineWrapping||u.widgetLineBreaks)&&(f=wY(i,n,-1,f)),E&&f&&E.from==f.from&&E.to==f.to)return v(S(A.from,A.to,E));{let M=E?S(A.from,null,E):k(B,!1),x=f?S(null,A.to,f):k(u,!0),F=[];return(E||B).to<(f||u).from-(E&&f?1:0)||B.widgetLineBreaks>1&&M.bottom+i.defaultLineHeight/2Z&&wA.from=QA)break;xA>BA&&eA(Math.max(IA,BA),M==null&&IA<=Z,Math.min(xA,QA),x==null&&xA>=CA,dA.dir)}if(BA=RA.to+1,BA>=QA)break}return X.length==0&&eA(Z,M==null,CA,x==null,i.textDirection),{top:z,bottom:j,horizontal:X}}function k(M,x){let F=r.top+(x?M.top:M.bottom);return{top:F,bottom:F,horizontal:[]}}}function c0A(i,e){return i.constructor==e.constructor&&i.eq(e)}var nS=class{constructor(e,A){this.view=e,this.layer=A,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),A.above&&this.dom.classList.add("cm-layer-above"),A.class&&this.dom.classList.add(A.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),A.mount&&A.mount(this.dom,e)}update(e){e.startState.facet(W6)!=e.state.facet(W6)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let A=0,t=e.facet(W6);for(;A!c0A(A,this.drawn[t]))){let A=this.dom.firstChild,t=0;for(let n of e)n.update&&A&&n.constructor&&this.drawn[t].constructor&&n.update(A,this.drawn[t])?(A=A.nextSibling,t++):this.dom.insertBefore(n.draw(),A);for(;A;){let n=A.nextSibling;A.remove(),A=n}this.drawn=e,Ct.safari&&Ct.safari_version>=26&&(this.dom.style.display=this.dom.firstChild?"":"none")}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}},W6=nt.define();function vH(i){return[Po.define(e=>new nS(e,i)),W6.of(i)]}var lh=nt.define({combine(i){return Lr(i,{cursorBlinkRate:1200,drawRangeCursor:!0,iosSelectionHandles:!0},{cursorBlinkRate:(e,A)=>Math.min(e,A),drawRangeCursor:(e,A)=>e||A})}});function bH(i={}){return[lh.of(i),C0A,d0A,I0A,$Y.of(!0)]}function MH(i){return i.startState.facet(lh)!=i.state.facet(lh)}var C0A=vH({above:!0,markers(i){let{state:e}=i,A=e.facet(lh),t=[];for(let n of e.selection.ranges){let o=n==e.selection.main;if(n.empty||A.drawRangeCursor&&!(o&&Ct.ios&&A.iosSelectionHandles)){let a=o?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",r=n.empty?n:Be.cursor(n.head,n.assoc);for(let s of md.forRange(i,a,r))t.push(s)}}return t},update(i,e){i.transactions.some(t=>t.selection)&&(e.style.animationName=e.style.animationName=="cm-blink"?"cm-blink2":"cm-blink");let A=MH(i);return A&&yY(i.state,e),i.docChanged||i.selectionSet||A},mount(i,e){yY(e.state,i)},class:"cm-cursorLayer"});function yY(i,e){e.style.animationDuration=i.facet(lh).cursorBlinkRate+"ms"}var d0A=vH({above:!1,markers(i){let e=[],{main:A,ranges:t}=i.state.selection;for(let n of t)if(!n.empty)for(let o of md.forRange(i,"cm-selectionBackground",n))e.push(o);if(Ct.ios&&!A.empty&&i.state.facet(lh).iosSelectionHandles){for(let n of md.forRange(i,"cm-selectionHandle cm-selectionHandle-start",Be.cursor(A.from,1)))e.push(n);for(let n of md.forRange(i,"cm-selectionHandle cm-selectionHandle-end",Be.cursor(A.to,1)))e.push(n)}return e},update(i,e){return i.docChanged||i.selectionSet||i.viewportChanged||MH(i)},class:"cm-selectionLayer"}),I0A=oc.highest(ui.theme({".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"},caretColor:"transparent !important"},".cm-content":{caretColor:"transparent !important","& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}})),SH=ln.define({map(i,e){return i==null?null:e.mapPos(i)}}),Xu=La.define({create(){return null},update(i,e){return i!=null&&(i=e.changes.mapPos(i)),e.effects.reduce((A,t)=>t.is(SH)?t.value:A,i)}}),B0A=Po.fromClass(class{constructor(i){this.view=i,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(i){var e;let A=i.state.field(Xu);A==null?this.cursor!=null&&((e=this.cursor)===null||e===void 0||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(i.startState.field(Xu)!=A||i.docChanged||i.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:i}=this,e=i.state.field(Xu),A=e!=null&&i.coordsAtPos(e);if(!A)return null;let t=i.scrollDOM.getBoundingClientRect();return{left:A.left-t.left+i.scrollDOM.scrollLeft*i.scaleX,top:A.top-t.top+i.scrollDOM.scrollTop*i.scaleY,height:A.bottom-A.top}}drawCursor(i){if(this.cursor){let{scaleX:e,scaleY:A}=this.view;i?(this.cursor.style.left=i.left/e+"px",this.cursor.style.top=i.top/A+"px",this.cursor.style.height=i.height/A+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(i){this.view.state.field(Xu)!=i&&this.view.dispatch({effects:SH.of(i)})}},{eventObservers:{dragover(i){this.setDropPos(this.view.posAtCoords({x:i.clientX,y:i.clientY}))},dragleave(i){(i.target==this.view.contentDOM||!this.view.contentDOM.contains(i.relatedTarget))&&this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function kH(){return[Xu,B0A]}function DY(i,e,A,t,n){e.lastIndex=0;for(let o=i.iterRange(A,t),a=A,r;!o.next().done;a+=o.value.length)if(!o.lineBreak)for(;r=e.exec(o.value);)n(a+r.index,r)}function h0A(i,e){let A=i.visibleRanges;if(A.length==1&&A[0].from==i.viewport.from&&A[0].to==i.viewport.to)return A;let t=[];for(let{from:n,to:o}of A)n=Math.max(i.state.doc.lineAt(n).from,n-e),o=Math.min(i.state.doc.lineAt(o).to,o+e),t.length&&t[t.length-1].to>=n?t[t.length-1].to=o:t.push({from:n,to:o});return t}var oS=class{constructor(e){let{regexp:A,decoration:t,decorate:n,boundary:o,maxLength:a=1e3}=e;if(!A.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=A,n)this.addMatch=(r,s,l,g)=>n(g,l,l+r[0].length,r,s);else if(typeof t=="function")this.addMatch=(r,s,l,g)=>{let C=t(r,s,l);C&&g(l,l+r[0].length,C)};else if(t)this.addMatch=(r,s,l,g)=>g(l,l+r[0].length,t);else throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.boundary=o,this.maxLength=a}createDeco(e){let A=new Xr,t=A.add.bind(A);for(let{from:n,to:o}of h0A(e,this.maxLength))DY(e.state.doc,this.regexp,n,o,(a,r)=>this.addMatch(r,e,a,t));return A.finish()}updateDeco(e,A){let t=1e9,n=-1;return e.docChanged&&e.changes.iterChanges((o,a,r,s)=>{s>=e.view.viewport.from&&r<=e.view.viewport.to&&(t=Math.min(r,t),n=Math.max(s,n))}),e.viewportMoved||n-t>1e3?this.createDeco(e.view):n>-1?this.updateRange(e.view,A.map(e.changes),t,n):A}updateRange(e,A,t,n){for(let o of e.visibleRanges){let a=Math.max(o.from,t),r=Math.min(o.to,n);if(r>=a){let s=e.state.doc.lineAt(a),l=s.tos.from;a--)if(this.boundary.test(s.text[a-1-s.from])){g=a;break}for(;rd.push(m.range(E,f));if(s==l)for(this.regexp.lastIndex=g-s.from;(B=this.regexp.exec(s.text))&&B.indexthis.addMatch(f,e,E,u));A=A.update({filterFrom:g,filterTo:C,filter:(E,f)=>EC,add:d})}}return A}},aS=/x/.unicode!=null?"gu":"g",E0A=new RegExp(`[\0-\b --\x7F-\x9F\xAD\u061C\u200B\u200E\u200F\u2028\u2029\u202D\u202E\u2066\u2067\u2069\uFEFF\uFFF9-\uFFFC]`,aS),Q0A={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"},h9=null;function u0A(){var i;if(h9==null&&typeof document<"u"&&document.body){let e=document.body.style;h9=((i=e.tabSize)!==null&&i!==void 0?i:e.MozTabSize)!=null}return h9||!1}var Z6=nt.define({combine(i){let e=Lr(i,{render:null,specialChars:E0A,addSpecialChars:null});return(e.replaceTabs=!u0A())&&(e.specialChars=new RegExp(" |"+e.specialChars.source,aS)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,aS)),e}});function _H(i={}){return[Z6.of(i),p0A()]}var vY=null;function p0A(){return vY||(vY=Po.fromClass(class{constructor(i){this.view=i,this.decorations=Lt.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(i.state.facet(Z6)),this.decorations=this.decorator.createDeco(i)}makeDecorator(i){return new oS({regexp:i.specialChars,decoration:(e,A,t)=>{let{doc:n}=A.state,o=$r(e[0],0);if(o==9){let a=n.lineAt(t),r=A.state.tabSize,s=rC(a.text,r,t-a.from);return Lt.replace({widget:new sS((r-s%r)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[o]||(this.decorationCache[o]=Lt.replace({widget:new rS(i,o)}))},boundary:i.replaceTabs?void 0:/[^]/})}update(i){let e=i.state.facet(Z6);i.startState.facet(Z6)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(i.view)):this.decorations=this.decorator.updateDeco(i,this.decorations)}},{decorations:i=>i.decorations}))}var f0A="\u2022";function m0A(i){return i>=32?f0A:i==10?"\u2424":String.fromCharCode(9216+i)}var rS=class extends gl{constructor(e,A){super(),this.options=e,this.code=A}eq(e){return e.code==this.code}toDOM(e){let A=m0A(this.code),t=e.state.phrase("Control character")+" "+(Q0A[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,t,A);if(n)return n;let o=document.createElement("span");return o.textContent=A,o.title=t,o.setAttribute("aria-label",t),o.className="cm-specialChar",o}ignoreEvent(){return!1}},sS=class extends gl{constructor(e){super(),this.width=e}eq(e){return e.width==this.width}toDOM(){let e=document.createElement("span");return e.textContent=" ",e.className="cm-tab",e.style.width=this.width+"px",e}ignoreEvent(){return!1}};function xH(){return y0A}var w0A=Lt.line({class:"cm-activeLine"}),y0A=Po.fromClass(class{constructor(i){this.decorations=this.getDeco(i)}update(i){(i.docChanged||i.selectionSet)&&(this.decorations=this.getDeco(i.view))}getDeco(i){let e=-1,A=[];for(let t of i.state.selection.ranges){let n=i.lineBlockAt(t.head);n.from>e&&(A.push(w0A.range(n.from)),e=n.from)}return Lt.set(A)}},{decorations:i=>i.decorations});var lS=2e3;function D0A(i,e,A){let t=Math.min(e.line,A.line),n=Math.max(e.line,A.line),o=[];if(e.off>lS||A.off>lS||e.col<0||A.col<0){let a=Math.min(e.off,A.off),r=Math.max(e.off,A.off);for(let s=t;s<=n;s++){let l=i.doc.line(s);l.length<=r&&o.push(Be.range(l.from+a,l.to+r))}}else{let a=Math.min(e.col,A.col),r=Math.max(e.col,A.col);for(let s=t;s<=n;s++){let l=i.doc.line(s),g=G6(l.text,a,i.tabSize,!0);if(g<0)o.push(Be.cursor(l.to));else{let C=G6(l.text,r,i.tabSize);o.push(Be.range(l.from+g,l.from+C))}}}return o}function v0A(i,e){let A=i.coordsAtPos(i.viewport.from);return A?Math.round(Math.abs((A.left-e)/i.defaultCharacterWidth)):-1}function bY(i,e){let A=i.posAtCoords({x:e.clientX,y:e.clientY},!1),t=i.state.doc.lineAt(A),n=A-t.from,o=n>lS?-1:n==t.length?v0A(i,e.clientX):rC(t.text,i.state.tabSize,A-t.from);return{line:t.number,col:o,off:n}}function b0A(i,e){let A=bY(i,e),t=i.state.selection;return A?{update(n){if(n.docChanged){let o=n.changes.mapPos(n.startState.doc.line(A.line).from),a=n.state.doc.lineAt(o);A={line:a.number,col:A.col,off:Math.min(A.off,a.length)},t=t.map(n.changes)}},get(n,o,a){let r=bY(i,n);if(!r)return t;let s=D0A(i.state,A,r);return s.length?a?Be.create(s.concat(t.ranges)):Be.create(s):t}}:null}function RH(i){let e=i?.eventFilter||(A=>A.altKey&&A.button==0);return ui.mouseSelectionStyle.of((A,t)=>e(t)?b0A(A,t):null)}var M0A={Alt:[18,i=>!!i.altKey],Control:[17,i=>!!i.ctrlKey],Shift:[16,i=>!!i.shiftKey],Meta:[91,i=>!!i.metaKey]},S0A={style:"cursor: crosshair"};function NH(i={}){let[e,A]=M0A[i.key||"Alt"],t=Po.fromClass(class{constructor(n){this.view=n,this.isDown=!1}set(n){this.isDown!=n&&(this.isDown=n,this.view.update([]))}},{eventObservers:{keydown(n){this.set(n.keyCode==e||A(n))},keyup(n){(n.keyCode==e||!A(n))&&this.set(!1)},mousemove(n){this.set(A(n))}}});return[t,ui.contentAttributes.of(n=>{var o;return!((o=n.plugin(t))===null||o===void 0)&&o.isDown?S0A:null})]}var P6="-10000px",C8=class{constructor(e,A,t,n){this.facet=A,this.createTooltipView=t,this.removeTooltipView=n,this.input=e.state.facet(A),this.tooltips=this.input.filter(a=>a);let o=null;this.tooltipViews=this.tooltips.map(a=>o=t(a,o))}update(e,A){var t;let n=e.state.facet(this.facet),o=n.filter(s=>s);if(n===this.input){for(let s of this.tooltipViews)s.update&&s.update(e);return!1}let a=[],r=A?[]:null;for(let s=0;sA[l]=s),A.length=r.length),this.input=n,this.tooltips=o,this.tooltipViews=a,!0}};function k0A(i){let e=i.dom.ownerDocument.documentElement;return{top:0,left:0,bottom:e.clientHeight,right:e.clientWidth}}var E9=nt.define({combine:i=>{var e,A,t;return{position:Ct.ios?"absolute":((e=i.find(n=>n.position))===null||e===void 0?void 0:e.position)||"fixed",parent:((A=i.find(n=>n.parent))===null||A===void 0?void 0:A.parent)||null,tooltipSpace:((t=i.find(n=>n.tooltipSpace))===null||t===void 0?void 0:t.tooltipSpace)||k0A}}}),MY=new WeakMap,mS=Po.fromClass(class{constructor(i){this.view=i,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=i.state.facet(E9);this.position=e.position,this.parent=e.parent,this.classes=i.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new C8(i,ch,(A,t)=>this.createTooltip(A,t),A=>{this.resizeObserver&&this.resizeObserver.unobserve(A.dom),A.dom.remove()}),this.above=this.manager.tooltips.map(A=>!!A.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(A=>{Date.now()>this.lastTransaction-50&&A.length>0&&A[A.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),i.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let i of this.manager.tooltipViews)this.intersectionObserver.observe(i.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(i){i.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(i,this.above);e&&this.observeIntersection();let A=e||i.geometryChanged,t=i.state.facet(E9);if(t.position!=this.position&&!this.madeAbsolute){this.position=t.position;for(let n of this.manager.tooltipViews)n.dom.style.position=this.position;A=!0}if(t.parent!=this.parent){this.parent&&this.container.remove(),this.parent=t.parent,this.createContainer();for(let n of this.manager.tooltipViews)this.container.appendChild(n.dom);A=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);A&&this.maybeMeasure()}createTooltip(i,e){let A=i.create(this.view),t=e?e.dom:null;if(A.dom.classList.add("cm-tooltip"),i.arrow&&!A.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let n=document.createElement("div");n.className="cm-tooltip-arrow",A.dom.appendChild(n)}return A.dom.style.position=this.position,A.dom.style.top=P6,A.dom.style.left="0px",this.container.insertBefore(A.dom,t),A.mount&&A.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(A.dom),A}destroy(){var i,e,A;this.view.win.removeEventListener("resize",this.measureSoon);for(let t of this.manager.tooltipViews)t.dom.remove(),(i=t.destroy)===null||i===void 0||i.call(t);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(A=this.intersectionObserver)===null||A===void 0||A.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let i=1,e=1,A=!1;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:o}=this.manager.tooltipViews[0];if(Ct.safari){let a=o.getBoundingClientRect();A=Math.abs(a.top+1e4)>1||Math.abs(a.left)>1}else A=!!o.offsetParent&&o.offsetParent!=this.container.ownerDocument.body}if(A||this.position=="absolute")if(this.parent){let o=this.parent.getBoundingClientRect();o.width&&o.height&&(i=o.width/this.parent.offsetWidth,e=o.height/this.parent.offsetHeight)}else({scaleX:i,scaleY:e}=this.view.viewState);let t=this.view.scrollDOM.getBoundingClientRect(),n=pS(this.view);return{visible:{left:t.left+n.left,top:t.top+n.top,right:t.right-n.right,bottom:t.bottom-n.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((o,a)=>{let r=this.manager.tooltipViews[a];return r.getCoords?r.getCoords(o.pos):this.view.coordsAtPos(o.pos)}),size:this.manager.tooltipViews.map(({dom:o})=>o.getBoundingClientRect()),space:this.view.state.facet(E9).tooltipSpace(this.view),scaleX:i,scaleY:e,makeAbsolute:A}}writeMeasure(i){var e;if(i.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let r of this.manager.tooltipViews)r.dom.style.position="absolute"}let{visible:A,space:t,scaleX:n,scaleY:o}=i,a=[];for(let r=0;r=Math.min(A.bottom,t.bottom)||C.rightMath.min(A.right,t.right)+.1)){g.style.top=P6;continue}let B=s.arrow?l.dom.querySelector(".cm-tooltip-arrow"):null,u=B?7:0,E=d.right-d.left,f=(e=MY.get(l))!==null&&e!==void 0?e:d.bottom-d.top,m=l.offset||x0A,v=this.view.textDirection==Lo.LTR,S=d.width>t.right-t.left?v?t.left:t.right-d.width:v?Math.max(t.left,Math.min(C.left-(B?14:0)+m.x,t.right-E)):Math.min(Math.max(t.left,C.left-E+(B?14:0)-m.x),t.right-E),k=this.above[r];!s.strictSide&&(k?C.top-f-u-m.yt.bottom)&&k==t.bottom-C.bottom>C.top-t.top&&(k=this.above[r]=!k);let M=(k?C.top-t.top:t.bottom-C.bottom)-u;if(MS&&z.topx&&(x=k?z.top-f-2-u:z.bottom+u+2);if(this.position=="absolute"?(g.style.top=(x-i.parent.top)/o+"px",SY(g,(S-i.parent.left)/n)):(g.style.top=x/o+"px",SY(g,S/n)),B){let z=C.left+(v?m.x:-m.x)-(S+14-7);B.style.left=z/n+"px"}l.overlap!==!0&&a.push({left:S,top:x,right:F,bottom:x+f}),g.classList.toggle("cm-tooltip-above",k),g.classList.toggle("cm-tooltip-below",!k),l.positioned&&l.positioned(i.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let i of this.manager.tooltipViews)i.dom.style.top=P6}},{eventObservers:{scroll(){this.maybeMeasure()}}});function SY(i,e){let A=parseInt(i.style.left,10);(isNaN(A)||Math.abs(e-A)>1)&&(i.style.left=e+"px")}var _0A=ui.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),x0A={x:0,y:0},ch=nt.define({enables:[mS,_0A]}),d8=nt.define({combine:i=>i.reduce((e,A)=>e.concat(A),[])}),I8=class i{static create(e){return new i(e)}constructor(e){this.view=e,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new C8(e,d8,(A,t)=>this.createHostedView(A,t),A=>A.dom.remove())}createHostedView(e,A){let t=e.create(this.view);return t.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(t.dom,A?A.dom.nextSibling:this.dom.firstChild),this.mounted&&t.mount&&t.mount(this.view),t}mount(e){for(let A of this.manager.tooltipViews)A.mount&&A.mount(e);this.mounted=!0}positioned(e){for(let A of this.manager.tooltipViews)A.positioned&&A.positioned(e)}update(e){this.manager.update(e)}destroy(){var e;for(let A of this.manager.tooltipViews)(e=A.destroy)===null||e===void 0||e.call(A)}passProp(e){let A;for(let t of this.manager.tooltipViews){let n=t[e];if(n!==void 0){if(A===void 0)A=n;else if(A!==n)return}}return A}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}},R0A=ch.compute([d8],i=>{let e=i.facet(d8);return e.length===0?null:{pos:Math.min(...e.map(A=>A.pos)),end:Math.max(...e.map(A=>{var t;return(t=A.end)!==null&&t!==void 0?t:A.pos})),create:I8.create,above:e[0].above,arrow:e.some(A=>A.arrow)}}),gS=class{constructor(e,A,t,n,o){this.view=e,this.source=A,this.field=t,this.setHover=n,this.hoverTime=o,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:e.dom,time:0},this.checkHover=this.checkHover.bind(this),e.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),e.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout(()=>this.startHover(),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let e=Date.now()-this.lastMove.time;er.bottom||A.xr.right+e.defaultCharacterWidth)return;let s=e.bidiSpans(e.state.doc.lineAt(n)).find(g=>g.from<=n&&g.to>=n),l=s&&s.dir==Lo.RTL?-1:1;o=A.x{this.pending==r&&(this.pending=null,s&&!(Array.isArray(s)&&!s.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(s)?s:[s])}))},s=>Gr(e.state,s,"hover tooltip"))}else a&&!(Array.isArray(a)&&!a.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(a)?a:[a])})}get tooltip(){let e=this.view.plugin(mS),A=e?e.manager.tooltips.findIndex(t=>t.create==I8.create):-1;return A>-1?e.manager.tooltipViews[A]:null}mousemove(e){var A,t;this.lastMove={x:e.clientX,y:e.clientY,target:e.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:n,tooltip:o}=this;if(n.length&&o&&!N0A(o.dom,e)||this.pending){let{pos:a}=n[0]||this.pending,r=(t=(A=n[0])===null||A===void 0?void 0:A.end)!==null&&t!==void 0?t:a;(a==r?this.view.posAtCoords(this.lastMove)!=a:!F0A(this.view,a,r,e.clientX,e.clientY))&&(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:A}=this;if(A.length){let{tooltip:t}=this;t&&t.dom.contains(e.relatedTarget)?this.watchTooltipLeave(t.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(e){let A=t=>{e.removeEventListener("mouseleave",A),this.active.length&&!this.view.dom.contains(t.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};e.addEventListener("mouseleave",A)}destroy(){clearTimeout(this.hoverTimeout),clearTimeout(this.restartTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}},j6=4;function N0A(i,e){let{left:A,right:t,top:n,bottom:o}=i.getBoundingClientRect(),a;if(a=i.querySelector(".cm-tooltip-arrow")){let r=a.getBoundingClientRect();n=Math.min(r.top,n),o=Math.max(r.bottom,o)}return e.clientX>=A-j6&&e.clientX<=t+j6&&e.clientY>=n-j6&&e.clientY<=o+j6}function F0A(i,e,A,t,n,o){let a=i.scrollDOM.getBoundingClientRect(),r=i.documentTop+i.documentPadding.top+i.contentHeight;if(a.left>t||a.rightn||Math.min(a.bottom,r)=e&&s<=A}function FH(i,e={}){let A=ln.define(),t=La.define({create(){return[]},update(n,o){if(n.length&&(e.hideOnChange&&(o.docChanged||o.selection)?n=[]:e.hideOn&&(n=n.filter(a=>!e.hideOn(o,a))),o.docChanged)){let a=[];for(let r of n){let s=o.changes.mapPos(r.pos,-1,Wr.TrackDel);if(s!=null){let l=Object.assign(Object.create(null),r);l.pos=s,l.end!=null&&(l.end=o.changes.mapPos(l.end)),a.push(l)}}n=a}for(let a of o.effects)a.is(A)&&(n=a.value),a.is(L0A)&&(n=[]);return n},provide:n=>d8.from(n)});return{active:t,extension:[t,Po.define(n=>new gS(n,i,t,A,e.hoverTime||300)),R0A]}}function wS(i,e){let A=i.plugin(mS);if(!A)return null;let t=A.manager.tooltips.indexOf(e);return t<0?null:A.manager.tooltipViews[t]}var L0A=ln.define();var kY=nt.define({combine(i){let e,A;for(let t of i)e=e||t.topContainer,A=A||t.bottomContainer;return{topContainer:e,bottomContainer:A}}});function d4(i,e){let A=i.plugin(LH),t=A?A.specs.indexOf(e):-1;return t>-1?A.panels[t]:null}var LH=Po.fromClass(class{constructor(i){this.input=i.state.facet(vd),this.specs=this.input.filter(A=>A),this.panels=this.specs.map(A=>A(i));let e=i.state.facet(kY);this.top=new Ah(i,!0,e.topContainer),this.bottom=new Ah(i,!1,e.bottomContainer),this.top.sync(this.panels.filter(A=>A.top)),this.bottom.sync(this.panels.filter(A=>!A.top));for(let A of this.panels)A.dom.classList.add("cm-panel"),A.mount&&A.mount()}update(i){let e=i.state.facet(kY);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new Ah(i.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new Ah(i.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let A=i.state.facet(vd);if(A!=this.input){let t=A.filter(s=>s),n=[],o=[],a=[],r=[];for(let s of t){let l=this.specs.indexOf(s),g;l<0?(g=s(i.view),r.push(g)):(g=this.panels[l],g.update&&g.update(i)),n.push(g),(g.top?o:a).push(g)}this.specs=t,this.panels=n,this.top.sync(o),this.bottom.sync(a);for(let s of r)s.dom.classList.add("cm-panel"),s.mount&&s.mount()}else for(let t of this.panels)t.update&&t.update(i)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:i=>ui.scrollMargins.of(e=>{let A=e.plugin(i);return A&&{top:A.top.scrollMargin(),bottom:A.bottom.scrollMargin()}})}),Ah=class{constructor(e,A,t){this.view=e,this.top=A,this.container=t,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(e){for(let A of this.panels)A.destroy&&e.indexOf(A)<0&&A.destroy();this.panels=e,this.syncDOM()}syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.dom=void 0);return}if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let A=this.container||this.view.dom;A.insertBefore(this.dom,this.top?A.firstChild:null)}let e=this.dom.firstChild;for(let A of this.panels)if(A.dom.parentNode==this.dom){for(;e!=A.dom;)e=_Y(e);e=e.nextSibling}else this.dom.insertBefore(A.dom,e);for(;e;)e=_Y(e)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses)){for(let e of this.classes.split(" "))e&&this.container.classList.remove(e);for(let e of(this.classes=this.view.themeClasses).split(" "))e&&this.container.classList.add(e)}}};function _Y(i){let e=i.nextSibling;return i.remove(),e}var vd=nt.define({enables:LH});function GH(i,e){let A,t=new Promise(a=>A=a),n=a=>G0A(a,e,A);i.state.field(Q9,!1)?i.dispatch({effects:KH.of(n)}):i.dispatch({effects:ln.appendConfig.of(Q9.init(()=>[n]))});let o=UH.of(n);return{close:o,result:t.then(a=>((i.win.queueMicrotask||(s=>i.win.setTimeout(s,10)))(()=>{i.state.field(Q9).indexOf(n)>-1&&i.dispatch({effects:o})}),a))}}var Q9=La.define({create(){return[]},update(i,e){for(let A of e.effects)A.is(KH)?i=[A.value].concat(i):A.is(UH)&&(i=i.filter(t=>t!=A.value));return i},provide:i=>vd.computeN([i],e=>e.field(i))}),KH=ln.define(),UH=ln.define();function G0A(i,e,A){let t=e.content?e.content(i,()=>a(null)):null;if(!t){if(t=po("form"),e.input){let r=po("input",e.input);/^(text|password|number|email|tel|url)$/.test(r.type)&&r.classList.add("cm-textfield"),r.name||(r.name="input"),t.appendChild(po("label",(e.label||"")+": ",r))}else t.appendChild(document.createTextNode(e.label||""));t.appendChild(document.createTextNode(" ")),t.appendChild(po("button",{class:"cm-button",type:"submit"},e.submitLabel||"OK"))}let n=t.nodeName=="FORM"?[t]:t.querySelectorAll("form");for(let r=0;r{l.keyCode==27?(l.preventDefault(),a(null)):l.keyCode==13&&(l.preventDefault(),a(s))}),s.addEventListener("submit",l=>{l.preventDefault(),a(s)})}let o=po("div",t,po("button",{onclick:()=>a(null),"aria-label":i.state.phrase("close"),class:"cm-dialog-close",type:"button"},["\xD7"]));e.class&&(o.className=e.class),o.classList.add("cm-dialog");function a(r){o.contains(o.ownerDocument.activeElement)&&i.focus(),A(r)}return{dom:o,top:e.top,mount:()=>{if(e.focus){let r;typeof e.focus=="string"?r=t.querySelector(e.focus):r=t.querySelector("input")||t.querySelector("button"),r&&"select"in r?r.select():r&&"focus"in r&&r.focus()}}}}var Cl=class extends cg{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}};Cl.prototype.elementClass="";Cl.prototype.toDOM=void 0;Cl.prototype.mapMode=Wr.TrackBefore;Cl.prototype.startSide=Cl.prototype.endSide=-1;Cl.prototype.point=!0;var X6=nt.define(),K0A=nt.define(),U0A={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>uo.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},a4=nt.define();function p8(i){return[TH(),a4.of(P(P({},U0A),i))]}var cS=nt.define({combine:i=>i.some(e=>e)});function TH(i){let e=[T0A];return i&&i.fixed===!1&&e.push(cS.of(!0)),e}var T0A=Po.fromClass(class{constructor(i){this.view=i,this.domAfter=null,this.prevViewport=i.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=i.state.facet(a4).map(e=>new B8(i,e)),this.fixed=!i.state.facet(cS);for(let e of this.gutters)e.config.side=="after"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),i.scrollDOM.insertBefore(this.dom,i.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(i){if(this.updateGutters(i)){let e=this.prevViewport,A=i.view.viewport,t=Math.min(e.to,A.to)-Math.max(e.from,A.from);this.syncGutters(t<(A.to-A.from)*.8)}if(i.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(cS)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=i.view.viewport}syncGutters(i){let e=this.dom.nextSibling;i&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let A=uo.iter(this.view.state.facet(X6),this.view.viewport.from),t=[],n=this.gutters.map(o=>new dS(o,this.view.viewport,-this.view.documentPadding.top));for(let o of this.view.viewportLineBlocks)if(t.length&&(t=[]),Array.isArray(o.type)){let a=!0;for(let r of o.type)if(r.type==As.Text&&a){CS(A,t,r.from);for(let s of n)s.line(this.view,r,t);a=!1}else if(r.widget)for(let s of n)s.widget(this.view,r)}else if(o.type==As.Text){CS(A,t,o.from);for(let a of n)a.line(this.view,o,t)}else if(o.widget)for(let a of n)a.widget(this.view,o);for(let o of n)o.finish();i&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(i){let e=i.startState.facet(a4),A=i.state.facet(a4),t=i.docChanged||i.heightChanged||i.viewportChanged||!uo.eq(i.startState.facet(X6),i.state.facet(X6),i.view.viewport.from,i.view.viewport.to);if(e==A)for(let n of this.gutters)n.update(i)&&(t=!0);else{t=!0;let n=[];for(let o of A){let a=e.indexOf(o);a<0?n.push(new B8(this.view,o)):(this.gutters[a].update(i),n.push(this.gutters[a]))}for(let o of this.gutters)o.dom.remove(),n.indexOf(o)<0&&o.destroy();for(let o of n)o.config.side=="after"?this.getDOMAfter().appendChild(o.dom):this.dom.appendChild(o.dom);this.gutters=n}return t}destroy(){for(let i of this.gutters)i.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:i=>ui.scrollMargins.of(e=>{let A=e.plugin(i);if(!A||A.gutters.length==0||!A.fixed)return null;let t=A.dom.offsetWidth*e.scaleX,n=A.domAfter?A.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==Lo.LTR?{left:t,right:n}:{right:t,left:n}})});function xY(i){return Array.isArray(i)?i:[i]}function CS(i,e,A){for(;i.value&&i.from<=A;)i.from==A&&e.push(i.value),i.next()}var dS=class{constructor(e,A,t){this.gutter=e,this.height=t,this.i=0,this.cursor=uo.iter(e.markers,A.from)}addElement(e,A,t){let{gutter:n}=this,o=(A.top-this.height)/e.scaleY,a=A.height/e.scaleY;if(this.i==n.elements.length){let r=new h8(e,a,o,t);n.elements.push(r),n.dom.appendChild(r.dom)}else n.elements[this.i].update(e,a,o,t);this.height=A.bottom,this.i++}line(e,A,t){let n=[];CS(this.cursor,n,A.from),t.length&&(n=n.concat(t));let o=this.gutter.config.lineMarker(e,A,n);o&&n.unshift(o);let a=this.gutter;n.length==0&&!a.config.renderEmptyElements||this.addElement(e,A,n)}widget(e,A){let t=this.gutter.config.widgetMarker(e,A.widget,A),n=t?[t]:null;for(let o of e.state.facet(K0A)){let a=o(e,A.widget,A);a&&(n||(n=[])).push(a)}n&&this.addElement(e,A,n)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let A=e.elements.pop();e.dom.removeChild(A.dom),A.destroy()}}},B8=class{constructor(e,A){this.view=e,this.config=A,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let t in A.domEventHandlers)this.dom.addEventListener(t,n=>{let o=n.target,a;if(o!=this.dom&&this.dom.contains(o)){for(;o.parentNode!=this.dom;)o=o.parentNode;let s=o.getBoundingClientRect();a=(s.top+s.bottom)/2}else a=n.clientY;let r=e.lineBlockAtHeight(a-e.documentTop);A.domEventHandlers[t](e,r,n)&&n.preventDefault()});this.markers=xY(A.markers(e)),A.initialSpacer&&(this.spacer=new h8(e,0,0,[A.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let A=this.markers;if(this.markers=xY(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let n=this.config.updateSpacer(this.spacer.markers[0],e);n!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[n])}let t=e.view.viewport;return!uo.eq(this.markers,A,t.from,t.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}},h8=class{constructor(e,A,t,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,A,t,n)}update(e,A,t,n){this.height!=A&&(this.height=A,this.dom.style.height=A+"px"),this.above!=t&&(this.dom.style.marginTop=(this.above=t)?t+"px":""),O0A(this.markers,n)||this.setMarkers(e,n)}setMarkers(e,A){let t="cm-gutterElement",n=this.dom.firstChild;for(let o=0,a=0;;){let r=a,s=oo(r,s,l)||a(r,s,l):a}return t}})}}),r4=class extends Cl{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}};function u9(i,e){return i.state.facet(eh).formatNumber(e,i.state)}var H0A=a4.compute([eh],i=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(e){return e.state.facet(J0A)},lineMarker(e,A,t){return t.some(n=>n.toDOM)?null:new r4(u9(e,e.state.doc.lineAt(A.from).number))},widgetMarker:(e,A,t)=>{for(let n of e.state.facet(Y0A)){let o=n(e,A,t);if(o)return o}return null},lineMarkerChange:e=>e.startState.facet(eh)!=e.state.facet(eh),initialSpacer(e){return new r4(u9(e,RY(e.state.doc.lines)))},updateSpacer(e,A){let t=u9(A.view,RY(A.view.state.doc.lines));return t==e.number?e:new r4(t)},domEventHandlers:i.facet(eh).domEventHandlers,side:"before"}));function OH(i={}){return[eh.of(i),TH(),H0A]}function RY(i){let e=9;for(;e{let e=[],A=-1;for(let t of i.selection.ranges){let n=i.doc.lineAt(t.head).from;n>A&&(A=n,e.push(z0A.range(n)))}return uo.of(e)});function JH(){return P0A}var j0A=0,I4=class{constructor(e,A){this.from=e,this.to=A}},Hi=class{constructor(e={}){this.id=j0A++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=ys.match(e)),A=>{let t=e(A);return t===void 0?null:[this,t]}}};Hi.closedBy=new Hi({deserialize:i=>i.split(" ")});Hi.openedBy=new Hi({deserialize:i=>i.split(" ")});Hi.group=new Hi({deserialize:i=>i.split(" ")});Hi.isolate=new Hi({deserialize:i=>{if(i&&i!="rtl"&&i!="ltr"&&i!="auto")throw new RangeError("Invalid value for isolate: "+i);return i||"auto"}});Hi.contextHash=new Hi({perNode:!0});Hi.lookAhead=new Hi({perNode:!0});Hi.mounted=new Hi({perNode:!0});var bd=class{constructor(e,A,t,n=!1){this.tree=e,this.overlay=A,this.parser=t,this.bracketed=n}static get(e){return e&&e.props&&e.props[Hi.mounted.id]}},V0A=Object.create(null),ys=class i{constructor(e,A,t,n=0){this.name=e,this.props=A,this.id=t,this.flags=n}static define(e){let A=e.props&&e.props.length?Object.create(null):V0A,t=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new i(e.name||"",A,e.id,t);if(e.props){for(let o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let A=this.prop(Hi.group);return A?A.indexOf(e)>-1:!1}return this.id==e}static match(e){let A=Object.create(null);for(let t in e)for(let n of t.split(" "))A[n]=e[t];return t=>{for(let n=t.prop(Hi.group),o=-1;o<(n?n.length:0);o++){let a=A[o<0?t.name:n[o]];if(a)return a}}}};ys.none=new ys("",Object.create(null),0,8);var B4=class i{constructor(e){this.types=e;for(let A=0;A0;for(let s=this.cursor(a|Ga.IncludeAnonymous);;){let l=!1;if(s.from<=o&&s.to>=n&&(!r&&s.type.isAnonymous||A(s)!==!1)){if(s.firstChild())continue;l=!0}for(;l&&t&&(r||!s.type.isAnonymous)&&t(s),!s.nextSibling();){if(!s.parent())return;l=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let A in this.props)e.push([+A,this.props[A]]);return e}balance(e={}){return this.children.length<=8?this:kS(ys.none,this.children,this.positions,0,this.children.length,0,this.length,(A,t,n)=>new i(this.type,A,t,n,this.propValues),e.makeTree||((A,t,n)=>new i(ys.none,A,t,n)))}static build(e){return W0A(e)}};Pa.empty=new Pa(ys.none,[],[],0);var yS=class i{constructor(e,A){this.buffer=e,this.index=A}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new i(this.buffer,this.index)}},k2=class i{constructor(e,A,t){this.buffer=e,this.length=A,this.set=t}get type(){return ys.none}toString(){let e=[];for(let A=0;A0));s=a[s+3]);return r}slice(e,A,t){let n=this.buffer,o=new Uint16Array(A-e),a=0;for(let r=e,s=0;r=e&&Ae;case 1:return A<=e&&t>e;case 2:return t>e;case 4:return!0}}function h4(i,e,A,t){for(var n;i.from==i.to||(A<1?i.from>=e:i.from>e)||(A>-1?i.to<=e:i.to0?r.length:-1;e!=l;e+=A){let g=r[e],C=s[e]+a.from,d;if(!(!(o&Ga.EnterBracketed&&g instanceof Pa&&(d=bd.get(g))&&!d.overlay&&d.bracketed&&t>=C&&t<=C+g.length)&&!PH(n,t,C,C+g.length))){if(g instanceof k2){if(o&Ga.ExcludeBuffers)continue;let B=g.findChild(0,g.buffer.length,A,t-C,n);if(B>-1)return new E4(new vS(a,g,e,C),null,B)}else if(o&Ga.IncludeAnonymous||!g.type.isAnonymous||SS(g)){let B;if(!(o&Ga.IgnoreMounts)&&(B=bd.get(g))&&!B.overlay)return new i(B.tree,C,e,a);let u=new i(g,C,e,a);return o&Ga.IncludeAnonymous||!u.type.isAnonymous?u:u.nextChild(A<0?g.children.length-1:0,A,t,n,o)}}}if(o&Ga.IncludeAnonymous||!a.type.isAnonymous||(a.index>=0?e=a.index+A:e=A<0?-1:a._parent._tree.children.length,a=a._parent,!a))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,A,t=0){let n;if(!(t&Ga.IgnoreOverlays)&&(n=bd.get(this._tree))&&n.overlay){let o=e-this.from,a=t&Ga.EnterBracketed&&n.bracketed;for(let{from:r,to:s}of n.overlay)if((A>0||a?r<=o:r=o:s>o))return new i(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,A,t)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function HH(i,e,A,t){let n=i.cursor(),o=[];if(!n.firstChild())return o;if(A!=null){for(let a=!1;!a;)if(a=n.type.is(A),!n.nextSibling())return o}for(;;){if(t!=null&&n.type.is(t))return o;if(n.type.is(e)&&o.push(n.node),!n.nextSibling())return t==null?o:[]}}function DS(i,e,A=e.length-1){for(let t=i;A>=0;t=t.parent){if(!t)return!1;if(!t.type.isAnonymous){if(e[A]&&e[A]!=t.name)return!1;A--}}return!0}var vS=class{constructor(e,A,t,n){this.parent=e,this.buffer=A,this.index=t,this.start=n}},E4=class i extends w8{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,A,t){super(),this.context=e,this._parent=A,this.index=t,this.type=e.buffer.set.types[e.buffer.buffer[t]]}child(e,A,t){let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.context.start,t);return o<0?null:new i(this.context,this,o)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,A,t=0){if(t&Ga.ExcludeBuffers)return null;let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],A>0?1:-1,e-this.context.start,A);return o<0?null:new i(this.context,this,o)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,A=e.buffer[this.index+3];return A<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new i(this.context,this._parent,A):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,A=this._parent?this._parent.index+4:0;return this.index==A?this.externalSibling(-1):new i(this.context,this._parent,e.findChild(A,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],A=[],{buffer:t}=this.context,n=this.index+4,o=t.buffer[this.index+3];if(o>n){let a=t.buffer[this.index+1];e.push(t.slice(n,o,a)),A.push(0)}return new Pa(this.type,e,A,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function jH(i){if(!i.length)return null;let e=0,A=i[0];for(let o=1;oA.from||a.to=e){let r=new d0(a.tree,a.overlay[0].from+o.from,-1,o);(n||(n=[t])).push(h4(r,e,A,!1))}}return n?jH(n):t}var Q4=class{get name(){return this.type.name}constructor(e,A=0){if(this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,this.mode=A&~Ga.EnterBracketed,e instanceof d0)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let t=e._parent;t;t=t._parent)this.stack.unshift(t.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,A){this.index=e;let{start:t,buffer:n}=this.buffer;return this.type=A||n.set.types[n.buffer[e]],this.from=t+n.buffer[e+1],this.to=t+n.buffer[e+2],!0}yield(e){return e?e instanceof d0?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,A,t){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,A,t,this.mode));let{buffer:n}=this.buffer,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.buffer.start,t);return o<0?!1:(this.stack.push(this.index),this.yieldBuf(o))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,A,t=this.mode){return this.buffer?t&Ga.ExcludeBuffers?!1:this.enterChild(1,e,A):this.yield(this._tree.enter(e,A,t))}parent(){if(!this.buffer)return this.yieldNode(this.mode&Ga.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&Ga.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:A}=this.buffer,t=this.stack.length-1;if(e<0){let n=t<0?0:this.stack[t]+4;if(this.index!=n)return this.yieldBuf(A.findChild(n,this.index,-1,0,4))}else{let n=A.buffer[this.index+3];if(n<(t<0?A.buffer.length:A.buffer[this.stack[t]+3]))return this.yieldBuf(n)}return t<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let A,t,{buffer:n}=this;if(n){if(e>0){if(this.index-1)for(let o=A+e,a=e<0?-1:t._tree.children.length;o!=a;o+=e){let r=t._tree.children[o];if(this.mode&Ga.IncludeAnonymous||r instanceof k2||!r.type.isAnonymous||SS(r))return!1}return!0}move(e,A){if(A&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,A=0){for(;(this.from==this.to||(A<1?this.from>=e:this.from>e)||(A>-1?this.to<=e:this.to=0;){for(let a=e;a;a=a._parent)if(a.index==n){if(n==this.index)return a;A=a,t=o+1;break A}n=this.stack[--o]}for(let n=t;n=0;o--){if(o<0)return DS(this._tree,e,n);let a=t[A.buffer[this.stack[o]]];if(!a.isAnonymous){if(e[n]&&e[n]!=a.name)return!1;n--}}return!0}};function SS(i){return i.children.some(e=>e instanceof k2||!e.type.isAnonymous||SS(e))}function W0A(i){var e;let{buffer:A,nodeSet:t,maxBufferLength:n=1024,reused:o=[],minRepeatType:a=t.types.length}=i,r=Array.isArray(A)?new yS(A,A.length):A,s=t.types,l=0,g=0;function C(M,x,F,z,j,X){let{id:eA,start:Z,end:CA,size:wA}=r,BA=g,QA=l;if(wA<0)if(r.next(),wA==-1){let qA=o[eA];F.push(qA),z.push(Z-M);return}else if(wA==-3){l=eA;return}else if(wA==-4){g=eA;return}else throw new RangeError(`Unrecognized record size: ${wA}`);let RA=s[eA],dA,IA,xA=Z-M;if(CA-Z<=n&&(IA=f(r.pos-x,j))){let qA=new Uint16Array(IA.size-IA.skip),ue=r.pos-IA.size,HA=qA.length;for(;r.pos>ue;)HA=m(IA.start,qA,HA);dA=new k2(qA,CA-IA.start,t),xA=IA.start-M}else{let qA=r.pos-wA;r.next();let ue=[],HA=[],bA=eA>=a?eA:-1,PA=0,it=CA;for(;r.pos>qA;)bA>=0&&r.id==bA&&r.size>=0?(r.end<=it-n&&(u(ue,HA,Z,PA,r.end,it,bA,BA,QA),PA=ue.length,it=r.end),r.next()):X>2500?d(Z,qA,ue,HA):C(Z,qA,ue,HA,bA,X+1);if(bA>=0&&PA>0&&PA-1&&PA>0){let Xe=B(RA,QA);dA=kS(RA,ue,HA,0,ue.length,0,CA-Z,Xe,Xe)}else dA=E(RA,ue,HA,CA-Z,BA-CA,QA)}F.push(dA),z.push(xA)}function d(M,x,F,z){let j=[],X=0,eA=-1;for(;r.pos>x;){let{id:Z,start:CA,end:wA,size:BA}=r;if(BA>4)r.next();else{if(eA>-1&&CA=0;wA-=3)Z[BA++]=j[wA],Z[BA++]=j[wA+1]-CA,Z[BA++]=j[wA+2]-CA,Z[BA++]=BA;F.push(new k2(Z,j[2]-CA,t)),z.push(CA-M)}}function B(M,x){return(F,z,j)=>{let X=0,eA=F.length-1,Z,CA;if(eA>=0&&(Z=F[eA])instanceof Pa){if(!eA&&Z.type==M&&Z.length==j)return Z;(CA=Z.prop(Hi.lookAhead))&&(X=z[eA]+Z.length+CA)}return E(M,F,z,j,X,x)}}function u(M,x,F,z,j,X,eA,Z,CA){let wA=[],BA=[];for(;M.length>z;)wA.push(M.pop()),BA.push(x.pop()+F-j);M.push(E(t.types[eA],wA,BA,X-j,Z-X,CA)),x.push(j-F)}function E(M,x,F,z,j,X,eA){if(X){let Z=[Hi.contextHash,X];eA=eA?[Z].concat(eA):[Z]}if(j>25){let Z=[Hi.lookAhead,j];eA=eA?[Z].concat(eA):[Z]}return new Pa(M,x,F,z,eA)}function f(M,x){let F=r.fork(),z=0,j=0,X=0,eA=F.end-n,Z={size:0,start:0,skip:0};A:for(let CA=F.pos-M;F.pos>CA;){let wA=F.size;if(F.id==x&&wA>=0){Z.size=z,Z.start=j,Z.skip=X,X+=4,z+=4,F.next();continue}let BA=F.pos-wA;if(wA<0||BA=a?4:0,RA=F.start;for(F.next();F.pos>BA;){if(F.size<0)if(F.size==-3||F.size==-4)QA+=4;else break A;else F.id>=a&&(QA+=4);F.next()}j=RA,z+=wA,X+=QA}return(x<0||z==M)&&(Z.size=z,Z.start=j,Z.skip=X),Z.size>4?Z:void 0}function m(M,x,F){let{id:z,start:j,end:X,size:eA}=r;if(r.next(),eA>=0&&z4){let CA=r.pos-(eA-4);for(;r.pos>CA;)F=m(M,x,F)}x[--F]=Z,x[--F]=X-M,x[--F]=j-M,x[--F]=z}else eA==-3?l=z:eA==-4&&(g=z);return F}let v=[],S=[];for(;r.pos>0;)C(i.start||0,i.bufferStart||0,v,S,-1,0);let k=(e=i.length)!==null&&e!==void 0?e:v.length?S[0]+v[0].length:0;return new Pa(s[i.topID],v.reverse(),S.reverse(),k)}var zH=new WeakMap;function m8(i,e){if(!i.isAnonymous||e instanceof k2||e.type!=i)return 1;let A=zH.get(e);if(A==null){A=1;for(let t of e.children){if(t.type!=i||!(t instanceof Pa)){A=1;break}A+=m8(i,t)}zH.set(e,A)}return A}function kS(i,e,A,t,n,o,a,r,s){let l=0;for(let u=t;u=g)break;x+=F}if(S==k+1){if(x>g){let F=u[k];B(F.children,F.positions,0,F.children.length,E[k]+v);continue}C.push(u[k])}else{let F=E[S-1]+u[S-1].length-M;C.push(kS(i,u,E,k,S,M,F,null,s))}d.push(M+v-o)}}return B(e,A,t,n,0),(r||s)(C,d,a)}var Md=class i{constructor(e,A,t,n,o=!1,a=!1){this.from=e,this.to=A,this.tree=t,this.offset=n,this.open=(o?1:0)|(a?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,A=[],t=!1){let n=[new i(0,e.length,e,0,!1,t)];for(let o of A)o.to>e.length&&n.push(o);return n}static applyChanges(e,A,t=128){if(!A.length)return e;let n=[],o=1,a=e.length?e[0]:null;for(let r=0,s=0,l=0;;r++){let g=r=t)for(;a&&a.from=d.from||C<=d.to||l){let B=Math.max(d.from,s)-l,u=Math.min(d.to,C)-l;d=B>=u?null:new i(B,u,d.tree,d.offset+l,r>0,!!g)}if(d&&n.push(d),a.to>C)break;a=onew I4(n.from,n.to)):[new I4(0,0)]:[new I4(0,e.length)],this.createParse(e,A||[],t)}parse(e,A,t){let n=this.startParse(e,A,t);for(;;){let o=n.advance();if(o)return o}}},MS=class{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,A){return this.string.slice(e,A)}};var VAe=new Hi({perNode:!0});var Z0A=0,lc=class i{constructor(e,A,t,n){this.name=e,this.set=A,this.base=t,this.modified=n,this.id=Z0A++}toString(){let{name:e}=this;for(let A of this.modified)A.name&&(e=`${A.name}(${e})`);return e}static define(e,A){let t=typeof e=="string"?e:"?";if(e instanceof i&&(A=e),A?.base)throw new Error("Can not derive from a modified tag");let n=new i(t,[],null,[]);if(n.set.push(n),A)for(let o of A.set)n.set.push(o);return n}static defineModifier(e){let A=new b8(e);return t=>t.modified.indexOf(A)>-1?t:b8.get(t.base||t,t.modified.concat(A).sort((n,o)=>n.id-o.id))}},X0A=0,b8=class i{constructor(e){this.name=e,this.instances=[],this.id=X0A++}static get(e,A){if(!A.length)return e;let t=A[0].instances.find(r=>r.base==e&&$0A(A,r.modified));if(t)return t;let n=[],o=new lc(e.name,n,e,A);for(let r of A)r.instances.push(o);let a=ACA(A);for(let r of e.set)if(!r.modified.length)for(let s of a)n.push(i.get(r,s));return o}};function $0A(i,e){return i.length==e.length&&i.every((A,t)=>A==e[t])}function ACA(i){let e=[[]];for(let A=0;At.length-A.length)}function M8(i){let e=Object.create(null);for(let A in i){let t=i[A];Array.isArray(t)||(t=[t]);for(let n of A.split(" "))if(n){let o=[],a=2,r=n;for(let C=0;;){if(r=="..."&&C>0&&C+3==n.length){a=1;break}let d=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(r);if(!d)throw new RangeError("Invalid path: "+n);if(o.push(d[0]=="*"?"":d[0][0]=='"'?JSON.parse(d[0]):d[0]),C+=d[0].length,C==n.length)break;let B=n[C++];if(C==n.length&&B=="!"){a=0;break}if(B!="/")throw new RangeError("Invalid path: "+n);r=n.slice(C)}let s=o.length-1,l=o[s];if(!l)throw new RangeError("Invalid path: "+n);let g=new kd(t,a,s>0?o.slice(0,s):null);e[l]=g.sort(e[l])}}return WH.add(e)}var WH=new Hi({combine(i,e){let A,t,n;for(;i||e;){if(!i||e&&i.depth>=e.depth?(n=e,e=e.next):(n=i,i=i.next),A&&A.mode==n.mode&&!n.context&&!A.context)continue;let o=new kd(n.tags,n.mode,n.context);A?A.next=o:t=o,A=o}return t}}),kd=class{constructor(e,A,t,n){this.tags=e,this.mode=A,this.context=t,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let a=n;for(let r of o)for(let s of r.set){let l=A[s.id];if(l){a=a?a+" "+l:l;break}}return a},scope:t}}function eCA(i,e){let A=null;for(let t of i){let n=t.style(e);n&&(A=A?A+" "+n:n)}return A}function ZH(i,e,A,t=0,n=i.length){let o=new xS(t,Array.isArray(e)?e:[e],A);o.highlightRange(i.cursor(),t,n,"",o.highlighters),o.flush(n)}var xS=class{constructor(e,A,t){this.at=e,this.highlighters=A,this.span=t,this.class=""}startSpan(e,A){A!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=A)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,A,t,n,o){let{type:a,from:r,to:s}=e;if(r>=t||s<=A)return;a.isTop&&(o=this.highlighters.filter(B=>!B.scope||B.scope(a)));let l=n,g=tCA(e)||kd.empty,C=eCA(o,g.tags);if(C&&(l&&(l+=" "),l+=C,g.mode==1&&(n+=(n?" ":"")+C)),this.startSpan(Math.max(A,r),l),g.opaque)return;let d=e.tree&&e.tree.prop(Hi.mounted);if(d&&d.overlay){let B=e.node.enter(d.overlay[0].from+r,1),u=this.highlighters.filter(f=>!f.scope||f.scope(d.tree.type)),E=e.firstChild();for(let f=0,m=r;;f++){let v=f=S||!e.nextSibling())););if(!v||S>t)break;m=v.to+r,m>A&&(this.highlightRange(B.cursor(),Math.max(A,v.from+r),Math.min(t,m),"",u),this.startSpan(Math.min(t,m),l))}E&&e.parent()}else if(e.firstChild()){d&&(n="");do if(!(e.to<=A)){if(e.from>=t)break;this.highlightRange(e,A,t,n,o),this.startSpan(Math.min(t,e.to),l)}while(e.nextSibling());e.parent()}}};function tCA(i){let e=i.type.prop(WH);for(;e&&e.context&&!i.matchContext(e.context);)e=e.next;return e||null}var tt=lc.define,y8=tt(),_2=tt(),VH=tt(_2),qH=tt(_2),x2=tt(),D8=tt(x2),_S=tt(x2),h0=tt(),Sd=tt(h0),I0=tt(),B0=tt(),RS=tt(),u4=tt(RS),v8=tt(),Oe={comment:y8,lineComment:tt(y8),blockComment:tt(y8),docComment:tt(y8),name:_2,variableName:tt(_2),typeName:VH,tagName:tt(VH),propertyName:qH,attributeName:tt(qH),className:tt(_2),labelName:tt(_2),namespace:tt(_2),macroName:tt(_2),literal:x2,string:D8,docString:tt(D8),character:tt(D8),attributeValue:tt(D8),number:_S,integer:tt(_S),float:tt(_S),bool:tt(x2),regexp:tt(x2),escape:tt(x2),color:tt(x2),url:tt(x2),keyword:I0,self:tt(I0),null:tt(I0),atom:tt(I0),unit:tt(I0),modifier:tt(I0),operatorKeyword:tt(I0),controlKeyword:tt(I0),definitionKeyword:tt(I0),moduleKeyword:tt(I0),operator:B0,derefOperator:tt(B0),arithmeticOperator:tt(B0),logicOperator:tt(B0),bitwiseOperator:tt(B0),compareOperator:tt(B0),updateOperator:tt(B0),definitionOperator:tt(B0),typeOperator:tt(B0),controlOperator:tt(B0),punctuation:RS,separator:tt(RS),bracket:u4,angleBracket:tt(u4),squareBracket:tt(u4),paren:tt(u4),brace:tt(u4),content:h0,heading:Sd,heading1:tt(Sd),heading2:tt(Sd),heading3:tt(Sd),heading4:tt(Sd),heading5:tt(Sd),heading6:tt(Sd),contentSeparator:tt(h0),list:tt(h0),quote:tt(h0),emphasis:tt(h0),strong:tt(h0),link:tt(h0),monospace:tt(h0),strikethrough:tt(h0),inserted:tt(),deleted:tt(),changed:tt(),invalid:tt(),meta:v8,documentMeta:tt(v8),annotation:tt(v8),processingInstruction:tt(v8),definition:lc.defineModifier("definition"),constant:lc.defineModifier("constant"),function:lc.defineModifier("function"),standard:lc.defineModifier("standard"),local:lc.defineModifier("local"),special:lc.defineModifier("special")};for(let i in Oe){let e=Oe[i];e instanceof lc&&(e.name=i)}var ZAe=NS([{tag:Oe.link,class:"tok-link"},{tag:Oe.heading,class:"tok-heading"},{tag:Oe.emphasis,class:"tok-emphasis"},{tag:Oe.strong,class:"tok-strong"},{tag:Oe.keyword,class:"tok-keyword"},{tag:Oe.atom,class:"tok-atom"},{tag:Oe.bool,class:"tok-bool"},{tag:Oe.url,class:"tok-url"},{tag:Oe.labelName,class:"tok-labelName"},{tag:Oe.inserted,class:"tok-inserted"},{tag:Oe.deleted,class:"tok-deleted"},{tag:Oe.literal,class:"tok-literal"},{tag:Oe.string,class:"tok-string"},{tag:Oe.number,class:"tok-number"},{tag:[Oe.regexp,Oe.escape,Oe.special(Oe.string)],class:"tok-string2"},{tag:Oe.variableName,class:"tok-variableName"},{tag:Oe.local(Oe.variableName),class:"tok-variableName tok-local"},{tag:Oe.definition(Oe.variableName),class:"tok-variableName tok-definition"},{tag:Oe.special(Oe.variableName),class:"tok-variableName2"},{tag:Oe.definition(Oe.propertyName),class:"tok-propertyName tok-definition"},{tag:Oe.typeName,class:"tok-typeName"},{tag:Oe.namespace,class:"tok-namespace"},{tag:Oe.className,class:"tok-className"},{tag:Oe.macroName,class:"tok-macroName"},{tag:Oe.propertyName,class:"tok-propertyName"},{tag:Oe.operator,class:"tok-operator"},{tag:Oe.comment,class:"tok-comment"},{tag:Oe.meta,class:"tok-meta"},{tag:Oe.invalid,class:"tok-invalid"},{tag:Oe.punctuation,class:"tok-punctuation"}]);var FS,dh=new Hi;function iCA(i){return nt.define({combine:i?e=>e.concat(i):void 0})}var nCA=new Hi,gc=(()=>{class i{constructor(A,t,n=[],o=""){this.data=A,this.name=o,ir.prototype.hasOwnProperty("tree")||Object.defineProperty(ir.prototype,"tree",{get(){return Kr(this)}}),this.parser=t,this.extension=[R2.of(this),ir.languageData.of((a,r,s)=>{let l=XH(a,r,s),g=l.type.prop(dh);if(!g)return[];let C=a.facet(g),d=l.type.prop(nCA);if(d){let B=l.resolve(r-l.from,s);for(let u of d)if(u.test(B,a)){let E=a.facet(u.facet);return u.type=="replace"?E:E.concat(C)}}return C})].concat(n)}isActiveAt(A,t,n=-1){return XH(A,t,n).type.prop(dh)==this.data}findRegions(A){let t=A.facet(R2);if(t?.data==this.data)return[{from:0,to:A.doc.length}];if(!t||!t.allowsNesting)return[];let n=[],o=(a,r)=>{if(a.prop(dh)==this.data){n.push({from:r,to:r+a.length});return}let s=a.prop(Hi.mounted);if(s){if(s.tree.prop(dh)==this.data){if(s.overlay)for(let l of s.overlay)n.push({from:l.from+r,to:l.to+r});else n.push({from:r,to:r+a.length});return}else if(s.overlay){let l=n.length;if(o(s.tree,s.overlay[0].from+r),n.length>l)return}}for(let l=0;lt.isTop?A:void 0)]}),e.name)}configure(e,A){return new i(this.data,this.parser.configure(e),A||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function Kr(i){let e=i.field(gc.state,!1);return e?e.tree:Pa.empty}function jS(i,e,A=50){var t;let n=(t=i.field(gc.state,!1))===null||t===void 0?void 0:t.context;if(!n)return null;let o=n.viewport;n.updateViewport({from:0,to:e});let a=n.isDone(e)||n.work(A,e)?n.tree:null;return n.updateViewport(o),a}var US=class{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,A){let t=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,A):this.string.slice(e-t,A-t)}},p4=null,TS=class i{constructor(e,A,t=[],n,o,a,r,s){this.parser=e,this.state=A,this.fragments=t,this.tree=n,this.treeLen=o,this.viewport=a,this.skipped=r,this.scheduleOn=s,this.parse=null,this.tempSkipped=[]}static create(e,A,t){return new i(e,A,[],Pa.empty,0,t,[],null)}startParse(){return this.parser.startParse(new US(this.state.doc),this.fragments)}work(e,A){return A!=null&&A>=this.state.doc.length&&(A=void 0),this.tree!=Pa.empty&&this.isDone(A??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var t;if(typeof e=="number"){let n=Date.now()+e;e=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),A!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>A)&&A=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(A=this.parse.advance()););}),this.treeLen=e,this.tree=A,this.fragments=this.withoutTempSkipped(Md.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let A=p4;p4=this;try{return e()}finally{p4=A}}withoutTempSkipped(e){for(let A;A=this.tempSkipped.pop();)e=$H(e,A.from,A.to);return e}changes(e,A){let{fragments:t,tree:n,treeLen:o,viewport:a,skipped:r}=this;if(this.takeTree(),!e.empty){let s=[];if(e.iterChangedRanges((l,g,C,d)=>s.push({fromA:l,toA:g,fromB:C,toB:d})),t=Md.applyChanges(t,s),n=Pa.empty,o=0,a={from:e.mapPos(a.from,-1),to:e.mapPos(a.to,1)},this.skipped.length){r=[];for(let l of this.skipped){let g=e.mapPos(l.from,1),C=e.mapPos(l.to,-1);ge.from&&(this.fragments=$H(this.fragments,n,o),this.skipped.splice(t--,1))}return this.skipped.length>=A?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,A){this.skipped.push({from:e,to:A})}static getSkippingParser(e){return new class extends Ch{createParse(A,t,n){let o=n[0].from,a=n[n.length-1].to;return{parsedPos:o,advance(){let s=p4;if(s){for(let l of n)s.tempSkipped.push(l);e&&(s.scheduleOn=s.scheduleOn?Promise.all([s.scheduleOn,e]):e)}return this.parsedPos=a,new Pa(ys.none,[],[],a-o)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let A=this.fragments;return this.treeLen>=e&&A.length&&A[0].from==0&&A[0].to>=e}static get(){return p4}};function $H(i,e,A){return Md.applyChanges(i,[{fromA:e,toA:A,fromB:e,toB:A}])}var m4=class i{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let A=this.context.changes(e.changes,e.state),t=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),A.viewport.to);return A.work(20,t)||A.takeTree(),new i(A)}static init(e){let A=Math.min(3e3,e.doc.length),t=TS.create(e.facet(R2).parser,e,{from:0,to:A});return t.work(20,A)||t.takeTree(),new i(t)}};gc.state=La.define({create:m4.init,update(i,e){for(let A of e.effects)if(A.is(gc.setState))return A.value;return e.startState.facet(R2)!=e.state.facet(R2)?m4.init(e.state):i.apply(e)}});var az=i=>{let e=setTimeout(()=>i(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(az=i=>{let e=-1,A=setTimeout(()=>{e=requestIdleCallback(i,{timeout:400})},100);return()=>e<0?clearTimeout(A):cancelIdleCallback(e)});var LS=typeof navigator<"u"&&(!((FS=navigator.scheduling)===null||FS===void 0)&&FS.isInputPending)?()=>navigator.scheduling.isInputPending():null,oCA=Po.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let A=this.view.state.field(gc.state).context;(A.updateViewport(e.view.viewport)||this.view.viewport.to>A.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(A)}scheduleWork(){if(this.working)return;let{state:e}=this.view,A=e.field(gc.state);(A.tree!=A.context.tree||!A.context.isDone(e.doc.length))&&(this.working=az(this.work))}work(e){this.working=null;let A=Date.now();if(this.chunkEndn+1e3,s=o.context.work(()=>LS&&LS()||Date.now()>a,n+(r?0:1e5));this.chunkBudget-=Date.now()-A,(s||this.chunkBudget<=0)&&(o.context.takeTree(),this.view.dispatch({effects:gc.setState.of(new m4(o.context))})),this.chunkBudget>0&&!(s&&!r)&&this.scheduleWork(),this.checkAsyncSchedule(o.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(A=>Gr(this.view.state,A)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),R2=nt.define({combine(i){return i.length?i[0]:null},enables:i=>[gc.state,oCA,ui.contentAttributes.compute([i],e=>{let A=e.facet(i);return A&&A.name?{"data-language":A.name}:{}})]}),k8=class{constructor(e,A=[]){this.language=e,this.support=A,this.extension=[e,A]}};var aCA=nt.define(),Rd=nt.define({combine:i=>{if(!i.length)return" ";let e=i[0];if(!e||/\S/.test(e)||Array.from(e).some(A=>A!=e[0]))throw new Error("Invalid indent unit: "+JSON.stringify(i[0]));return e}});function Cc(i){let e=i.facet(Rd);return e.charCodeAt(0)==9?i.tabSize*e.length:e.length}function hh(i,e){let A="",t=i.tabSize,n=i.facet(Rd)[0];if(n==" "){for(;e>=t;)A+=" ",e-=t;n=" "}for(let o=0;o=e?rCA(i,A,e):null}var _d=class{constructor(e,A={}){this.state=e,this.options=A,this.unit=Cc(e)}lineAt(e,A=1){let t=this.state.doc.lineAt(e),{simulateBreak:n,simulateDoubleBreak:o}=this.options;return n!=null&&n>=t.from&&n<=t.to?o&&n==e?{text:"",from:e}:(A<0?n-1&&(o+=a-this.countColumn(t,t.search(/\S|$/))),o}countColumn(e,A=e.length){return rC(e,this.state.tabSize,A)}lineIndent(e,A=1){let{text:t,from:n}=this.lineAt(e,A),o=this.options.overrideIndentation;if(o){let a=o(n);if(a>-1)return a}return this.countColumn(t,t.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}},VS=new Hi;function rCA(i,e,A){let t=e.resolveStack(A),n=e.resolveInner(A,-1).resolve(A,0).enterUnfinishedNodesBefore(A);if(n!=t.node){let o=[];for(let a=n;a&&!(a.fromt.node.to||a.from==t.node.from&&a.type==t.node.type);a=a.parent)o.push(a);for(let a=o.length-1;a>=0;a--)t={node:o[a],next:t}}return rz(t,i,A)}function rz(i,e,A){for(let t=i;t;t=t.next){let n=lCA(t.node);if(n)return n(OS.create(e,A,t))}return 0}function sCA(i){return i.pos==i.options.simulateBreak&&i.options.simulateDoubleBreak}function lCA(i){let e=i.type.prop(VS);if(e)return e;let A=i.firstChild,t;if(A&&(t=A.type.prop(Hi.closedBy))){let n=i.lastChild,o=n&&t.indexOf(n.name)>-1;return a=>dCA(a,!0,1,void 0,o&&!sCA(a)?n.from:void 0)}return i.parent==null?gCA:null}function gCA(){return 0}var OS=class i extends _d{constructor(e,A,t){super(e.state,e.options),this.base=e,this.pos=A,this.context=t}get node(){return this.context.node}static create(e,A,t){return new i(e,A,t)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let A=this.state.doc.lineAt(e.from);for(;;){let t=e.resolve(A.from);for(;t.parent&&t.parent.from==t.from;)t=t.parent;if(cCA(t,e))break;A=this.state.doc.lineAt(t.from)}return this.lineIndent(A.from)}continue(){return rz(this.context.next,this.base,this.pos)}};function cCA(i,e){for(let A=e;A;A=A.parent)if(i==A)return!0;return!1}function CCA(i){let e=i.node,A=e.childAfter(e.from),t=e.lastChild;if(!A)return null;let n=i.options.simulateBreak,o=i.state.doc.lineAt(A.from),a=n==null||n<=o.from?o.to:Math.min(o.to,n);for(let r=A.to;;){let s=e.childAfter(r);if(!s||s==t)return null;if(!s.type.isSkipped){if(s.from>=a)return null;let l=/^ */.exec(o.text.slice(A.to-o.from))[0].length;return{from:A.from,to:A.to+l}}r=s.to}}function dCA(i,e,A,t,n){let o=i.textAfter,a=o.match(/^\s*/)[0].length,r=t&&o.slice(a,a+t.length)==t||n==i.pos+a,s=e?CCA(i):null;return s?r?i.column(s.from):i.column(s.to):i.baseIndent+(r?0:i.unit*A)}function qS({except:i,units:e=1}={}){return A=>{let t=i&&i.test(A.textAfter);return A.baseIndent+(t?0:e*A.unit)}}var ICA=200;function sz(){return ir.transactionFilter.of(i=>{if(!i.docChanged||!i.isUserEvent("input.type")&&!i.isUserEvent("input.complete"))return i;let e=i.startState.languageDataAt("indentOnInput",i.startState.selection.main.head);if(!e.length)return i;let A=i.newDoc,{head:t}=i.newSelection.main,n=A.lineAt(t);if(t>n.from+ICA)return i;let o=A.sliceString(n.from,t);if(!e.some(l=>l.test(o)))return i;let{state:a}=i,r=-1,s=[];for(let{head:l}of a.selection.ranges){let g=a.doc.lineAt(l);if(g.from==r)continue;r=g.from;let C=x8(a,g.from);if(C==null)continue;let d=/^\s*/.exec(g.text)[0],B=hh(a,C);d!=B&&s.push({from:g.from,to:g.from+d.length,insert:B})}return s.length?[i,{changes:s,sequential:!0}]:i})}var WS=nt.define(),w4=new Hi;function lz(i){let e=i.firstChild,A=i.lastChild;return e&&e.toA)continue;if(o&&r.from=e&&l.to>A&&(o=l)}}return o}function hCA(i){let e=i.lastChild;return e&&e.to==i.to&&e.type.isError}function Ih(i,e,A){for(let t of i.facet(WS)){let n=t(i,e,A);if(n)return n}return BCA(i,e,A)}function gz(i,e){let A=e.mapPos(i.from,1),t=e.mapPos(i.to,-1);return A>=t?void 0:{from:A,to:t}}var Eh=ln.define({map:gz}),y4=ln.define({map:gz});function cz(i){let e=[];for(let{head:A}of i.state.selection.ranges)e.some(t=>t.from<=A&&t.to>=A)||e.push(i.lineBlockAt(A));return e}var xd=La.define({create(){return Lt.none},update(i,e){e.isUserEvent("delete")&&e.changes.iterChangedRanges((A,t)=>i=Az(i,A,t)),i=i.map(e.changes);for(let A of e.effects)if(A.is(Eh)&&!ECA(i,A.value.from,A.value.to)){let{preparePlaceholder:t}=e.state.facet($S),n=t?Lt.replace({widget:new JS(t(e.state,A.value))}):ez;i=i.update({add:[n.range(A.value.from,A.value.to)]})}else A.is(y4)&&(i=i.update({filter:(t,n)=>A.value.from!=t||A.value.to!=n,filterFrom:A.value.from,filterTo:A.value.to}));return e.selection&&(i=Az(i,e.selection.main.head)),i},provide:i=>ui.decorations.from(i),toJSON(i,e){let A=[];return i.between(0,e.doc.length,(t,n)=>{A.push(t,n)}),A},fromJSON(i){if(!Array.isArray(i)||i.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let A=0;A{ne&&(t=!0)}),t?i.update({filterFrom:e,filterTo:A,filter:(n,o)=>n>=A||o<=e}):i}function _8(i,e,A){var t;let n=null;return(t=i.field(xd,!1))===null||t===void 0||t.between(e,A,(o,a)=>{(!n||n.from>o)&&(n={from:o,to:a})}),n}function ECA(i,e,A){let t=!1;return i.between(e,e,(n,o)=>{n==e&&o==A&&(t=!0)}),t}function Cz(i,e){return i.field(xd,!1)?e:e.concat(ln.appendConfig.of(Bz()))}var QCA=i=>{for(let e of cz(i)){let A=Ih(i.state,e.from,e.to);if(A)return i.dispatch({effects:Cz(i.state,[Eh.of(A),dz(i,A)])}),!0}return!1},ZS=i=>{if(!i.state.field(xd,!1))return!1;let e=[];for(let A of cz(i)){let t=_8(i.state,A.from,A.to);t&&e.push(y4.of(t),dz(i,t,!1))}return e.length&&i.dispatch({effects:e}),e.length>0};function dz(i,e,A=!0){let t=i.state.doc.lineAt(e.from).number,n=i.state.doc.lineAt(e.to).number;return ui.announce.of(`${i.state.phrase(A?"Folded lines":"Unfolded lines")} ${t} ${i.state.phrase("to")} ${n}.`)}var uCA=i=>{let{state:e}=i,A=[];for(let t=0;t{let e=i.state.field(xd,!1);if(!e||!e.size)return!1;let A=[];return e.between(0,i.state.doc.length,(t,n)=>{A.push(y4.of({from:t,to:n}))}),i.dispatch({effects:A}),!0};var Iz=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:QCA},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:ZS},{key:"Ctrl-Alt-[",run:uCA},{key:"Ctrl-Alt-]",run:XS}],pCA={placeholderDOM:null,preparePlaceholder:null,placeholderText:"\u2026"},$S=nt.define({combine(i){return Lr(i,pCA)}});function Bz(i){let e=[xd,mCA];return i&&e.push($S.of(i)),e}function hz(i,e){let{state:A}=i,t=A.facet($S),n=a=>{let r=i.lineBlockAt(i.posAtDOM(a.target)),s=_8(i.state,r.from,r.to);s&&i.dispatch({effects:y4.of(s)}),a.preventDefault()};if(t.placeholderDOM)return t.placeholderDOM(i,n,e);let o=document.createElement("span");return o.textContent=t.placeholderText,o.setAttribute("aria-label",A.phrase("folded code")),o.title=A.phrase("unfold"),o.className="cm-foldPlaceholder",o.onclick=n,o}var ez=Lt.replace({widget:new class extends gl{toDOM(i){return hz(i,null)}}}),JS=class extends gl{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return hz(e,this.value)}},fCA={openText:"\u2304",closedText:"\u203A",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1},f4=class extends Cl{constructor(e,A){super(),this.config=e,this.open=A}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let A=document.createElement("span");return A.textContent=this.open?this.config.openText:this.config.closedText,A.title=e.state.phrase(this.open?"Fold line":"Unfold line"),A}};function Ez(i={}){let e=P(P({},fCA),i),A=new f4(e,!0),t=new f4(e,!1),n=Po.fromClass(class{constructor(a){this.from=a.viewport.from,this.markers=this.buildMarkers(a)}update(a){(a.docChanged||a.viewportChanged||a.startState.facet(R2)!=a.state.facet(R2)||a.startState.field(xd,!1)!=a.state.field(xd,!1)||Kr(a.startState)!=Kr(a.state)||e.foldingChanged(a))&&(this.markers=this.buildMarkers(a.view))}buildMarkers(a){let r=new Xr;for(let s of a.viewportLineBlocks){let l=_8(a.state,s.from,s.to)?t:Ih(a.state,s.from,s.to)?A:null;l&&r.add(s.from,s.from,l)}return r.finish()}}),{domEventHandlers:o}=e;return[n,p8({class:"cm-foldGutter",markers(a){var r;return((r=a.plugin(n))===null||r===void 0?void 0:r.markers)||uo.empty},initialSpacer(){return new f4(e,!1)},domEventHandlers:$A(P({},o),{click:(a,r,s)=>{if(o.click&&o.click(a,r,s))return!0;let l=_8(a.state,r.from,r.to);if(l)return a.dispatch({effects:y4.of(l)}),!0;let g=Ih(a.state,r.from,r.to);return g?(a.dispatch({effects:Eh.of(g)}),!0):!1}})}),Bz()]}var mCA=ui.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}}),Bh=class i{constructor(e,A){this.specs=e;let t;function n(r){let s=Cg.newName();return(t||(t=Object.create(null)))["."+s]=r,s}let o=typeof A.all=="string"?A.all:A.all?n(A.all):void 0,a=A.scope;this.scope=a instanceof gc?r=>r.prop(dh)==a.data:a?r=>r==a:void 0,this.style=NS(e.map(r=>({tag:r.tag,class:r.class||n(Object.assign({},r,{tag:null}))})),{all:o}).style,this.module=t?new Cg(t):null,this.themeType=A.themeType}static define(e,A){return new i(e,A||{})}},YS=nt.define(),Qz=nt.define({combine(i){return i.length?[i[0]]:null}});function GS(i){let e=i.facet(YS);return e.length?e:i.facet(Qz)}function Ak(i,e){let A=[wCA],t;return i instanceof Bh&&(i.module&&A.push(ui.styleModule.of(i.module)),t=i.themeType),e?.fallback?A.push(Qz.of(i)):t?A.push(YS.computeN([ui.darkTheme],n=>n.facet(ui.darkTheme)==(t=="dark")?[i]:[])):A.push(YS.of(i)),A}var HS=class{constructor(e){this.markCache=Object.create(null),this.tree=Kr(e.state),this.decorations=this.buildDeco(e,GS(e.state)),this.decoratedTo=e.viewport.to}update(e){let A=Kr(e.state),t=GS(e.state),n=t!=GS(e.startState),{viewport:o}=e.view,a=e.changes.mapPos(this.decoratedTo,1);A.length=o.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=a):(A!=this.tree||e.viewportChanged||n)&&(this.tree=A,this.decorations=this.buildDeco(e.view,t),this.decoratedTo=o.to)}buildDeco(e,A){if(!A||!this.tree.length)return Lt.none;let t=new Xr;for(let{from:n,to:o}of e.visibleRanges)ZH(this.tree,A,(a,r,s)=>{t.add(a,r,this.markCache[s]||(this.markCache[s]=Lt.mark({class:s})))},n,o);return t.finish()}},wCA=oc.high(Po.fromClass(HS,{decorations:i=>i.decorations})),uz=Bh.define([{tag:Oe.meta,color:"#404740"},{tag:Oe.link,textDecoration:"underline"},{tag:Oe.heading,textDecoration:"underline",fontWeight:"bold"},{tag:Oe.emphasis,fontStyle:"italic"},{tag:Oe.strong,fontWeight:"bold"},{tag:Oe.strikethrough,textDecoration:"line-through"},{tag:Oe.keyword,color:"#708"},{tag:[Oe.atom,Oe.bool,Oe.url,Oe.contentSeparator,Oe.labelName],color:"#219"},{tag:[Oe.literal,Oe.inserted],color:"#164"},{tag:[Oe.string,Oe.deleted],color:"#a11"},{tag:[Oe.regexp,Oe.escape,Oe.special(Oe.string)],color:"#e40"},{tag:Oe.definition(Oe.variableName),color:"#00f"},{tag:Oe.local(Oe.variableName),color:"#30a"},{tag:[Oe.typeName,Oe.namespace],color:"#085"},{tag:Oe.className,color:"#167"},{tag:[Oe.special(Oe.variableName),Oe.macroName],color:"#256"},{tag:Oe.definition(Oe.propertyName),color:"#00c"},{tag:Oe.comment,color:"#940"},{tag:Oe.invalid,color:"#f00"}]),yCA=ui.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),pz=1e4,fz="()[]{}",mz=nt.define({combine(i){return Lr(i,{afterCursor:!0,brackets:fz,maxScanDistance:pz,renderMatch:bCA})}}),DCA=Lt.mark({class:"cm-matchingBracket"}),vCA=Lt.mark({class:"cm-nonmatchingBracket"});function bCA(i){let e=[],A=i.matched?DCA:vCA;return e.push(A.range(i.start.from,i.start.to)),i.end&&e.push(A.range(i.end.from,i.end.to)),e}function tz(i){let e=[],A=i.facet(mz);for(let t of i.selection.ranges){if(!t.empty)continue;let n=cc(i,t.head,-1,A)||t.head>0&&cc(i,t.head-1,1,A)||A.afterCursor&&(cc(i,t.head,1,A)||t.headi.decorations}),SCA=[MCA,yCA];function wz(i={}){return[mz.of(i),SCA]}var kCA=new Hi;function zS(i,e,A){let t=i.prop(e<0?Hi.openedBy:Hi.closedBy);if(t)return t;if(i.name.length==1){let n=A.indexOf(i.name);if(n>-1&&n%2==(e<0?1:0))return[A[n+e]]}return null}function PS(i){let e=i.type.prop(kCA);return e?e(i.node):i}function cc(i,e,A,t={}){let n=t.maxScanDistance||pz,o=t.brackets||fz,a=Kr(i),r=a.resolveInner(e,A);for(let s=r;s;s=s.parent){let l=zS(s.type,A,o);if(l&&s.from0?e>=g.from&&eg.from&&e<=g.to))return _CA(i,e,A,s,g,l,o)}}return xCA(i,e,A,a,r.type,n,o)}function _CA(i,e,A,t,n,o,a){let r=t.parent,s={from:n.from,to:n.to},l=0,g=r?.cursor();if(g&&(A<0?g.childBefore(t.from):g.childAfter(t.to)))do if(A<0?g.to<=t.from:g.from>=t.to){if(l==0&&o.indexOf(g.type.name)>-1&&g.from0)return null;let l={from:A<0?e-1:e,to:A>0?e+1:e},g=i.doc.iterRange(e,A>0?i.doc.length:0),C=0;for(let d=0;!g.next().done&&d<=o;){let B=g.value;A<0&&(d+=B.length);let u=e+d*A;for(let E=A>0?0:B.length-1,f=A>0?B.length:-1;E!=f;E+=A){let m=a.indexOf(B[E]);if(!(m<0||t.resolveInner(u+E,1).type!=n))if(m%2==0==A>0)C++;else{if(C==1)return{start:l,end:{from:u+E,to:u+E+1},matched:m>>1==s>>1};C--}}A>0&&(d+=B.length)}return g.done?{start:l,matched:!1}:null}var RCA=Object.create(null),iz=[ys.none];var nz=[],oz=Object.create(null),NCA=Object.create(null);for(let[i,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])NCA[i]=FCA(RCA,e);function KS(i,e){nz.indexOf(i)>-1||(nz.push(i),console.warn(e))}function FCA(i,e){let A=[];for(let r of e.split(" ")){let s=[];for(let l of r.split(".")){let g=i[l]||Oe[l];g?typeof g=="function"?s.length?s=s.map(g):KS(l,`Modifier ${l} used at start of tag`):s.length?KS(l,`Tag ${l} used as modifier`):s=Array.isArray(g)?g:[g]:KS(l,`Unknown highlighting tag ${l}`)}for(let l of s)A.push(l)}if(!A.length)return 0;let t=e.replace(/ /g,"_"),n=t+" "+A.map(r=>r.id),o=oz[n];if(o)return o.id;let a=oz[n]=ys.define({id:iz.length,name:t,props:[M8({[t]:A})]});return iz.push(a),a.id}var oee={rtl:Lt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:Lo.RTL}),ltr:Lt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:Lo.LTR}),auto:Lt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var LCA=i=>{let{state:e}=i,A=e.doc.lineAt(e.selection.main.from),t=nk(i.state,A.from);return t.line?GCA(i):t.block?UCA(i):!1};function ik(i,e){return({state:A,dispatch:t})=>{if(A.readOnly)return!1;let n=i(e,A);return n?(t(A.update(n)),!0):!1}}var GCA=ik(JCA,0);var KCA=ik(xz,0);var UCA=ik((i,e)=>xz(i,e,OCA(e)),0);function nk(i,e){let A=i.languageDataAt("commentTokens",e,1);return A.length?A[0]:{}}var D4=50;function TCA(i,{open:e,close:A},t,n){let o=i.sliceDoc(t-D4,t),a=i.sliceDoc(n,n+D4),r=/\s*$/.exec(o)[0].length,s=/^\s*/.exec(a)[0].length,l=o.length-r;if(o.slice(l-e.length,l)==e&&a.slice(s,s+A.length)==A)return{open:{pos:t-r,margin:r&&1},close:{pos:n+s,margin:s&&1}};let g,C;n-t<=2*D4?g=C=i.sliceDoc(t,n):(g=i.sliceDoc(t,t+D4),C=i.sliceDoc(n-D4,n));let d=/^\s*/.exec(g)[0].length,B=/\s*$/.exec(C)[0].length,u=C.length-B-A.length;return g.slice(d,d+e.length)==e&&C.slice(u,u+A.length)==A?{open:{pos:t+d+e.length,margin:/\s/.test(g.charAt(d+e.length))?1:0},close:{pos:n-B-A.length,margin:/\s/.test(C.charAt(u-1))?1:0}}:null}function OCA(i){let e=[];for(let A of i.selection.ranges){let t=i.doc.lineAt(A.from),n=A.to<=t.to?t:i.doc.lineAt(A.to);n.from>t.from&&n.from==A.to&&(n=A.to==t.to+1?t:i.doc.lineAt(A.to-1));let o=e.length-1;o>=0&&e[o].to>t.from?e[o].to=n.to:e.push({from:t.from+/^\s*/.exec(t.text)[0].length,to:n.to})}return e}function xz(i,e,A=e.selection.ranges){let t=A.map(o=>nk(e,o.from).block);if(!t.every(o=>o))return null;let n=A.map((o,a)=>TCA(e,t[a],o.from,o.to));if(i!=2&&!n.every(o=>o))return{changes:e.changes(A.map((o,a)=>n[a]?[]:[{from:o.from,insert:t[a].open+" "},{from:o.to,insert:" "+t[a].close}]))};if(i!=1&&n.some(o=>o)){let o=[];for(let a=0,r;an&&(o==a||a>C.from)){n=C.from;let d=/^\s*/.exec(C.text)[0].length,B=d==C.length,u=C.text.slice(d,d+l.length)==l?d:-1;do.comment<0&&(!o.empty||o.single))){let o=[];for(let{line:r,token:s,indent:l,empty:g,single:C}of t)(C||!g)&&o.push({from:r.from+l,insert:s+" "});let a=e.changes(o);return{changes:a,selection:e.selection.map(a,1)}}else if(i!=1&&t.some(o=>o.comment>=0)){let o=[];for(let{line:a,comment:r,token:s}of t)if(r>=0){let l=a.from+r,g=l+s.length;a.text[g-a.from]==" "&&g++,o.push({from:l,to:g})}return{changes:o}}return null}function Qh(i,e){return Be.create(i.ranges.map(e),i.mainIndex)}function dc(i,e){return i.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function Ic({state:i,dispatch:e},A){let t=Qh(i.selection,A);return t.eq(i.selection,!0)?!1:(e(dc(i,t)),!0)}function N8(i,e){return Be.cursor(e?i.to:i.from)}function Rz(i,e){return Ic(i,A=>A.empty?i.moveByChar(A,e):N8(A,e))}function Ds(i){return i.textDirectionAt(i.state.selection.main.head)==Lo.LTR}var Nz=i=>Rz(i,!Ds(i)),Fz=i=>Rz(i,Ds(i));function Lz(i,e){return Ic(i,A=>A.empty?i.moveByGroup(A,e):N8(A,e))}var YCA=i=>Lz(i,!Ds(i)),HCA=i=>Lz(i,Ds(i));var hee=typeof Intl<"u"&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null;function zCA(i,e,A){if(e.type.prop(A))return!0;let t=e.to-e.from;return t&&(t>2||/[^\s,.;:]/.test(i.sliceDoc(e.from,e.to)))||e.firstChild}function F8(i,e,A){let t=Kr(i).resolveInner(e.head),n=A?Hi.closedBy:Hi.openedBy;for(let s=e.head;;){let l=A?t.childAfter(s):t.childBefore(s);if(!l)break;zCA(i,l,n)?t=l:s=A?l.to:l.from}let o=t.type.prop(n),a,r;return o&&(a=A?cc(i,t.from,1):cc(i,t.to,-1))&&a.matched?r=A?a.end.to:a.end.from:r=A?t.to:t.from,Be.cursor(r,A?-1:1)}var PCA=i=>Ic(i,e=>F8(i.state,e,!Ds(i))),jCA=i=>Ic(i,e=>F8(i.state,e,Ds(i)));function Gz(i,e){return Ic(i,A=>{if(!A.empty)return N8(A,e);let t=i.moveVertically(A,e);return t.head!=A.head?t:i.moveToLineBoundary(A,e)})}var Kz=i=>Gz(i,!1),Uz=i=>Gz(i,!0);function Tz(i){let e=i.scrollDOM.clientHeighta.empty?i.moveVertically(a,e,A.height):N8(a,e));if(n.eq(t.selection))return!1;let o;if(A.selfScroll){let a=i.coordsAtPos(t.selection.main.head),r=i.scrollDOM.getBoundingClientRect(),s=r.top+A.marginTop,l=r.bottom-A.marginBottom;a&&a.top>s&&a.bottomOz(i,!1),ek=i=>Oz(i,!0);function N2(i,e,A){let t=i.lineBlockAt(e.head),n=i.moveToLineBoundary(e,A);if(n.head==e.head&&n.head!=(A?t.to:t.from)&&(n=i.moveToLineBoundary(e,A,!1)),!A&&n.head==t.from&&t.length){let o=/^\s*/.exec(i.state.sliceDoc(t.from,Math.min(t.from+100,t.to)))[0].length;o&&e.head!=t.from+o&&(n=Be.cursor(t.from+o))}return n}var VCA=i=>Ic(i,e=>N2(i,e,!0)),qCA=i=>Ic(i,e=>N2(i,e,!1)),WCA=i=>Ic(i,e=>N2(i,e,!Ds(i))),ZCA=i=>Ic(i,e=>N2(i,e,Ds(i))),XCA=i=>Ic(i,e=>Be.cursor(i.lineBlockAt(e.head).from,1)),$CA=i=>Ic(i,e=>Be.cursor(i.lineBlockAt(e.head).to,-1));function A2A(i,e,A){let t=!1,n=Qh(i.selection,o=>{let a=cc(i,o.head,-1)||cc(i,o.head,1)||o.head>0&&cc(i,o.head-1,1)||o.headA2A(i,e,!1);function hg(i,e){let A=Qh(i.state.selection,t=>{let n=e(t);return Be.range(t.anchor,n.head,n.goalColumn,n.bidiLevel||void 0,n.assoc)});return A.eq(i.state.selection)?!1:(i.dispatch(dc(i.state,A)),!0)}function Jz(i,e){return hg(i,A=>i.moveByChar(A,e))}var Yz=i=>Jz(i,!Ds(i)),Hz=i=>Jz(i,Ds(i));function zz(i,e){return hg(i,A=>i.moveByGroup(A,e))}var t2A=i=>zz(i,!Ds(i)),i2A=i=>zz(i,Ds(i));var n2A=i=>hg(i,e=>F8(i.state,e,!Ds(i))),o2A=i=>hg(i,e=>F8(i.state,e,Ds(i)));function Pz(i,e){return hg(i,A=>i.moveVertically(A,e))}var jz=i=>Pz(i,!1),Vz=i=>Pz(i,!0);function qz(i,e){return hg(i,A=>i.moveVertically(A,e,Tz(i).height))}var Dz=i=>qz(i,!1),vz=i=>qz(i,!0),a2A=i=>hg(i,e=>N2(i,e,!0)),r2A=i=>hg(i,e=>N2(i,e,!1)),s2A=i=>hg(i,e=>N2(i,e,!Ds(i))),l2A=i=>hg(i,e=>N2(i,e,Ds(i))),g2A=i=>hg(i,e=>Be.cursor(i.lineBlockAt(e.head).from)),c2A=i=>hg(i,e=>Be.cursor(i.lineBlockAt(e.head).to)),bz=({state:i,dispatch:e})=>(e(dc(i,{anchor:0})),!0),Mz=({state:i,dispatch:e})=>(e(dc(i,{anchor:i.doc.length})),!0),Sz=({state:i,dispatch:e})=>(e(dc(i,{anchor:i.selection.main.anchor,head:0})),!0),kz=({state:i,dispatch:e})=>(e(dc(i,{anchor:i.selection.main.anchor,head:i.doc.length})),!0),C2A=({state:i,dispatch:e})=>(e(i.update({selection:{anchor:0,head:i.doc.length},userEvent:"select"})),!0),d2A=({state:i,dispatch:e})=>{let A=L8(i).map(({from:t,to:n})=>Be.range(t,Math.min(n+1,i.doc.length)));return e(i.update({selection:Be.create(A),userEvent:"select"})),!0},I2A=({state:i,dispatch:e})=>{let A=Qh(i.selection,t=>{let n=Kr(i),o=n.resolveStack(t.from,1);if(t.empty){let a=n.resolveStack(t.from,-1);a.node.from>=o.node.from&&a.node.to<=o.node.to&&(o=a)}for(let a=o;a;a=a.next){let{node:r}=a;if((r.from=t.to||r.to>t.to&&r.from<=t.from)&&a.next)return Be.range(r.to,r.from)}return t});return A.eq(i.selection)?!1:(e(dc(i,A)),!0)};function Wz(i,e){let{state:A}=i,t=A.selection,n=A.selection.ranges.slice();for(let o of A.selection.ranges){let a=A.doc.lineAt(o.head);if(e?a.to0)for(let r=o;;){let s=i.moveVertically(r,e);if(s.heada.to){n.some(l=>l.head==s.head)||n.push(s);break}else{if(s.head==r.head)break;r=s}}}return n.length==t.ranges.length?!1:(i.dispatch(dc(A,Be.create(n,n.length-1))),!0)}var B2A=i=>Wz(i,!1),h2A=i=>Wz(i,!0),E2A=({state:i,dispatch:e})=>{let A=i.selection,t=null;return A.ranges.length>1?t=Be.create([A.main]):A.main.empty||(t=Be.create([Be.cursor(A.main.head)])),t?(e(dc(i,t)),!0):!1};function v4(i,e){if(i.state.readOnly)return!1;let A="delete.selection",{state:t}=i,n=t.changeByRange(o=>{let{from:a,to:r}=o;if(a==r){let s=e(o);sa&&(A="delete.forward",s=R8(i,s,!0)),a=Math.min(a,s),r=Math.max(r,s)}else a=R8(i,a,!1),r=R8(i,r,!0);return a==r?{range:o}:{changes:{from:a,to:r},range:Be.cursor(a,an(i)))t.between(e,e,(n,o)=>{ne&&(e=A?o:n)});return e}var Zz=(i,e,A)=>v4(i,t=>{let n=t.from,{state:o}=i,a=o.doc.lineAt(n),r,s;if(A&&!e&&n>a.from&&nZz(i,!1,!0);var Xz=i=>Zz(i,!0,!1),$z=(i,e)=>v4(i,A=>{let t=A.head,{state:n}=i,o=n.doc.lineAt(t),a=n.charCategorizer(t);for(let r=null;;){if(t==(e?o.to:o.from)){t==A.head&&o.number!=(e?n.doc.lines:1)&&(t+=e?1:-1);break}let s=tr(o.text,t-o.from,e)+o.from,l=o.text.slice(Math.min(t,s)-o.from,Math.max(t,s)-o.from),g=a(l);if(r!=null&&g!=r)break;(l!=" "||t!=A.head)&&(r=g),t=s}return t}),AP=i=>$z(i,!1),Q2A=i=>$z(i,!0);var u2A=i=>v4(i,e=>{let A=i.lineBlockAt(e.head).to;return e.headv4(i,e=>{let A=i.moveToLineBoundary(e,!1).head;return e.head>A?A:Math.max(0,e.head-1)}),f2A=i=>v4(i,e=>{let A=i.moveToLineBoundary(e,!0).head;return e.head{if(i.readOnly)return!1;let A=i.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:On.of(["",""])},range:Be.cursor(t.from)}));return e(i.update(A,{scrollIntoView:!0,userEvent:"input"})),!0},w2A=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let A=i.changeByRange(t=>{if(!t.empty||t.from==0||t.from==i.doc.length)return{range:t};let n=t.from,o=i.doc.lineAt(n),a=n==o.from?n-1:tr(o.text,n-o.from,!1)+o.from,r=n==o.to?n+1:tr(o.text,n-o.from,!0)+o.from;return{changes:{from:a,to:r,insert:i.doc.slice(n,r).append(i.doc.slice(a,n))},range:Be.cursor(r)}});return A.changes.empty?!1:(e(i.update(A,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function L8(i){let e=[],A=-1;for(let t of i.selection.ranges){let n=i.doc.lineAt(t.from),o=i.doc.lineAt(t.to);if(!t.empty&&t.to==o.from&&(o=i.doc.lineAt(t.to-1)),A>=n.number){let a=e[e.length-1];a.to=o.to,a.ranges.push(t)}else e.push({from:n.from,to:o.to,ranges:[t]});A=o.number+1}return e}function eP(i,e,A){if(i.readOnly)return!1;let t=[],n=[];for(let o of L8(i)){if(A?o.to==i.doc.length:o.from==0)continue;let a=i.doc.lineAt(A?o.to+1:o.from-1),r=a.length+1;if(A){t.push({from:o.to,to:a.to},{from:o.from,insert:a.text+i.lineBreak});for(let s of o.ranges)n.push(Be.range(Math.min(i.doc.length,s.anchor+r),Math.min(i.doc.length,s.head+r)))}else{t.push({from:a.from,to:o.from},{from:o.to,insert:i.lineBreak+a.text});for(let s of o.ranges)n.push(Be.range(s.anchor-r,s.head-r))}}return t.length?(e(i.update({changes:t,scrollIntoView:!0,selection:Be.create(n,i.selection.mainIndex),userEvent:"move.line"})),!0):!1}var y2A=({state:i,dispatch:e})=>eP(i,e,!1),D2A=({state:i,dispatch:e})=>eP(i,e,!0);function tP(i,e,A){if(i.readOnly)return!1;let t=[];for(let o of L8(i))A?t.push({from:o.from,insert:i.doc.slice(o.from,o.to)+i.lineBreak}):t.push({from:o.to,insert:i.lineBreak+i.doc.slice(o.from,o.to)});let n=i.changes(t);return e(i.update({changes:n,selection:i.selection.map(n,A?1:-1),scrollIntoView:!0,userEvent:"input.copyline"})),!0}var v2A=({state:i,dispatch:e})=>tP(i,e,!1),b2A=({state:i,dispatch:e})=>tP(i,e,!0),M2A=i=>{if(i.state.readOnly)return!1;let{state:e}=i,A=e.changes(L8(e).map(({from:n,to:o})=>(n>0?n--:o{let o;if(i.lineWrapping){let a=i.lineBlockAt(n.head),r=i.coordsAtPos(n.head,n.assoc||1);r&&(o=a.bottom+i.documentTop-r.bottom+i.defaultLineHeight/2)}return i.moveVertically(n,!0,o)}).map(A);return i.dispatch({changes:A,selection:t,scrollIntoView:!0,userEvent:"delete.line"}),!0};function S2A(i,e){if(/\(\)|\[\]|\{\}/.test(i.sliceDoc(e-1,e+1)))return{from:e,to:e};let A=Kr(i).resolveInner(e),t=A.childBefore(e),n=A.childAfter(e),o;return t&&n&&t.to<=e&&n.from>=e&&(o=t.type.prop(Hi.closedBy))&&o.indexOf(n.name)>-1&&i.doc.lineAt(t.to).from==i.doc.lineAt(n.from).from&&!/\S/.test(i.sliceDoc(t.to,n.from))?{from:t.to,to:n.from}:null}var _z=iP(!1),k2A=iP(!0);function iP(i){return({state:e,dispatch:A})=>{if(e.readOnly)return!1;let t=e.changeByRange(n=>{let{from:o,to:a}=n,r=e.doc.lineAt(o),s=!i&&o==a&&S2A(e,o);i&&(o=a=(a<=r.to?r:e.doc.lineAt(a)).to);let l=new _d(e,{simulateBreak:o,simulateDoubleBreak:!!s}),g=x8(l,o);for(g==null&&(g=rC(/^\s*/.exec(e.doc.lineAt(o).text)[0],e.tabSize));ar.from&&o{let n=[];for(let a=t.from;a<=t.to;){let r=i.doc.lineAt(a);r.number>A&&(t.empty||t.to>r.from)&&(e(r,n,t),A=r.number),a=r.to+1}let o=i.changes(n);return{changes:n,range:Be.range(o.mapPos(t.anchor,1),o.mapPos(t.head,1))}})}var _2A=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let A=Object.create(null),t=new _d(i,{overrideIndentation:o=>{let a=A[o];return a??-1}}),n=ok(i,(o,a,r)=>{let s=x8(t,o.from);if(s==null)return;/\S/.test(o.text)||(s=0);let l=/^\s*/.exec(o.text)[0],g=hh(i,s);(l!=g||r.fromi.readOnly?!1:(e(i.update(ok(i,(A,t)=>{t.push({from:A.from,insert:i.facet(Rd)})}),{userEvent:"input.indent"})),!0),oP=({state:i,dispatch:e})=>i.readOnly?!1:(e(i.update(ok(i,(A,t)=>{let n=/^\s*/.exec(A.text)[0];if(!n)return;let o=rC(n,i.tabSize),a=0,r=hh(i,Math.max(0,o-Cc(i)));for(;a(i.setTabFocusMode(),!0);var R2A=[{key:"Ctrl-b",run:Nz,shift:Yz,preventDefault:!0},{key:"Ctrl-f",run:Fz,shift:Hz},{key:"Ctrl-p",run:Kz,shift:jz},{key:"Ctrl-n",run:Uz,shift:Vz},{key:"Ctrl-a",run:XCA,shift:g2A},{key:"Ctrl-e",run:$CA,shift:c2A},{key:"Ctrl-d",run:Xz},{key:"Ctrl-h",run:tk},{key:"Ctrl-k",run:u2A},{key:"Ctrl-Alt-h",run:AP},{key:"Ctrl-o",run:m2A},{key:"Ctrl-t",run:w2A},{key:"Ctrl-v",run:ek}],N2A=[{key:"ArrowLeft",run:Nz,shift:Yz,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:YCA,shift:t2A,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:WCA,shift:s2A,preventDefault:!0},{key:"ArrowRight",run:Fz,shift:Hz,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:HCA,shift:i2A,preventDefault:!0},{mac:"Cmd-ArrowRight",run:ZCA,shift:l2A,preventDefault:!0},{key:"ArrowUp",run:Kz,shift:jz,preventDefault:!0},{mac:"Cmd-ArrowUp",run:bz,shift:Sz},{mac:"Ctrl-ArrowUp",run:yz,shift:Dz},{key:"ArrowDown",run:Uz,shift:Vz,preventDefault:!0},{mac:"Cmd-ArrowDown",run:Mz,shift:kz},{mac:"Ctrl-ArrowDown",run:ek,shift:vz},{key:"PageUp",run:yz,shift:Dz},{key:"PageDown",run:ek,shift:vz},{key:"Home",run:qCA,shift:r2A,preventDefault:!0},{key:"Mod-Home",run:bz,shift:Sz},{key:"End",run:VCA,shift:a2A,preventDefault:!0},{key:"Mod-End",run:Mz,shift:kz},{key:"Enter",run:_z,shift:_z},{key:"Mod-a",run:C2A},{key:"Backspace",run:tk,shift:tk,preventDefault:!0},{key:"Delete",run:Xz,preventDefault:!0},{key:"Mod-Backspace",mac:"Alt-Backspace",run:AP,preventDefault:!0},{key:"Mod-Delete",mac:"Alt-Delete",run:Q2A,preventDefault:!0},{mac:"Mod-Backspace",run:p2A,preventDefault:!0},{mac:"Mod-Delete",run:f2A,preventDefault:!0}].concat(R2A.map(i=>({mac:i.key,run:i.run,shift:i.shift}))),aP=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:PCA,shift:n2A},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:jCA,shift:o2A},{key:"Alt-ArrowUp",run:y2A},{key:"Shift-Alt-ArrowUp",run:v2A},{key:"Alt-ArrowDown",run:D2A},{key:"Shift-Alt-ArrowDown",run:b2A},{key:"Mod-Alt-ArrowUp",run:B2A},{key:"Mod-Alt-ArrowDown",run:h2A},{key:"Escape",run:E2A},{key:"Mod-Enter",run:k2A},{key:"Alt-l",mac:"Ctrl-l",run:d2A},{key:"Mod-i",run:I2A,preventDefault:!0},{key:"Mod-[",run:oP},{key:"Mod-]",run:nP},{key:"Mod-Alt-\\",run:_2A},{key:"Shift-Mod-k",run:M2A},{key:"Shift-Mod-\\",run:e2A},{key:"Mod-/",run:LCA},{key:"Alt-A",run:KCA},{key:"Ctrl-m",mac:"Shift-Alt-m",run:x2A}].concat(N2A),rP={key:"Tab",run:nP,shift:oP};var U8=class{constructor(e,A,t){this.from=e,this.to=A,this.diagnostic=t}},Nd=class i{constructor(e,A,t){this.diagnostics=e,this.panel=A,this.selected=t}static init(e,A,t){let n=t.facet(E0).markerFilter;n&&(e=n(e,t));let o=e.slice().sort((B,u)=>B.from-u.from||B.to-u.to),a=new Xr,r=[],s=0,l=t.doc.iter(),g=0,C=t.doc.length;for(let B=0;;){let u=B==o.length?null:o[B];if(!u&&!r.length)break;let E,f;if(r.length)E=s,f=r.reduce((S,k)=>Math.min(S,k.to),u&&u.from>E?u.from:1e8);else{if(E=u.from,E>C)break;f=u.to,r.push(u),B++}for(;BS.from||S.to==E))r.push(S),B++,f=Math.min(S.to,f);else{f=Math.min(S.from,f);break}}f=Math.min(f,C);let m=!1;if(r.some(S=>S.from==E&&(S.to==f||f==C))&&(m=E==f,!m&&f-E<10)){let S=E-(g+l.value.length);S>0&&(l.next(S),g=E);for(let k=E;;){if(k>=f){m=!0;break}if(!l.lineBreak&&g+l.value.length>k)break;k=g+l.value.length,g+=l.value.length,l.next()}}let v=QP(r);if(m)a.add(E,E,Lt.widget({widget:new ak(v),diagnostics:r.slice()}));else{let S=r.reduce((k,M)=>M.markClass?k+" "+M.markClass:k,"");a.add(E,f,Lt.mark({class:"cm-lintRange cm-lintRange-"+v+S,diagnostics:r.slice(),inclusiveEnd:r.some(k=>k.to>f)}))}if(s=f,s==C)break;for(let S=0;S{if(!(e&&a.diagnostics.indexOf(e)<0))if(!t)t=new U8(n,o,e||a.diagnostics[0]);else{if(a.diagnostics.indexOf(t.diagnostic)<0)return!1;t=new U8(t.from,o,t.diagnostic)}}),t}function gP(i,e){let A=e.pos,t=e.end||A,n=i.state.facet(E0).hideOn(i,A,t);if(n!=null)return n;let o=i.startState.doc.lineAt(e.pos);return!!(i.effects.some(a=>a.is(J8))||i.changes.touchesRange(o.from,Math.max(o.to,t)))}function cP(i,e){return i.field(Fl,!1)?e:e.concat(ln.appendConfig.of(pP))}function F2A(i,e){return{effects:cP(i,[J8.of(e)])}}var J8=ln.define(),sk=ln.define(),CP=ln.define(),Fl=La.define({create(){return new Nd(Lt.none,null,null)},update(i,e){if(e.docChanged&&i.diagnostics.size){let A=i.diagnostics.map(e.changes),t=null,n=i.panel;if(i.selected){let o=e.changes.mapPos(i.selected.from,1);t=F2(A,i.selected.diagnostic,o)||F2(A,null,o)}!A.size&&n&&e.state.facet(E0).autoPanel&&(n=null),i=new Nd(A,n,t)}for(let A of e.effects)if(A.is(J8)){let t=e.state.facet(E0).autoPanel?A.value.length?b4.open:null:i.panel;i=Nd.init(A.value,t,e.state)}else A.is(sk)?i=new Nd(i.diagnostics,A.value?b4.open:null,i.selected):A.is(CP)&&(i=new Nd(i.diagnostics,i.panel,A.value));return i},provide:i=>[vd.from(i,e=>e.panel),ui.decorations.from(i,e=>e.diagnostics)]});var L2A=Lt.mark({class:"cm-lintRange cm-lintRange-active"});function G2A(i,e,A){let{diagnostics:t}=i.state.field(Fl),n,o=-1,a=-1;t.between(e-(A<0?1:0),e+(A>0?1:0),(s,l,{spec:g})=>{if(e>=s&&e<=l&&(s==l||(e>s||A>0)&&(eEP(i,A,!1)))}var K2A=i=>{let e=i.state.field(Fl,!1);(!e||!e.panel)&&i.dispatch({effects:cP(i.state,[sk.of(!0)])});let A=d4(i,b4.open);return A&&A.dom.querySelector(".cm-panel-lint ul").focus(),!0},sP=i=>{let e=i.state.field(Fl,!1);return!e||!e.panel?!1:(i.dispatch({effects:sk.of(!1)}),!0)},U2A=i=>{let e=i.state.field(Fl,!1);if(!e)return!1;let A=i.state.selection.main,t=F2(e.diagnostics,null,A.to+1);return!t&&(t=F2(e.diagnostics,null,0),!t||t.from==A.from&&t.to==A.to)?!1:(i.dispatch({selection:{anchor:t.from,head:t.to},scrollIntoView:!0}),!0)};var IP=[{key:"Mod-Shift-m",run:K2A,preventDefault:!0},{key:"F8",run:U2A}],T2A=Po.fromClass(class{constructor(i){this.view=i,this.timeout=-1,this.set=!0;let{delay:e}=i.state.facet(E0);this.lintTime=Date.now()+e,this.run=this.run.bind(this),this.timeout=setTimeout(this.run,e)}run(){clearTimeout(this.timeout);let i=Date.now();if(iPromise.resolve(t(this.view))),t=>{this.view.state.doc==e.doc&&this.view.dispatch(F2A(this.view.state,t.reduce((n,o)=>n.concat(o))))},t=>{Gr(this.view.state,t)})}}update(i){let e=i.state.facet(E0);(i.docChanged||e!=i.startState.facet(E0)||e.needsRefresh&&e.needsRefresh(i))&&(this.lintTime=Date.now()+e.delay,this.set||(this.set=!0,this.timeout=setTimeout(this.run,e.delay)))}force(){this.set&&(this.lintTime=Date.now(),this.run())}destroy(){clearTimeout(this.timeout)}});function O2A(i,e,A){let t=[],n=-1;for(let o of i)o.then(a=>{t.push(a),clearTimeout(n),t.length==i.length?e(t):n=setTimeout(()=>e(t),200)},A)}var E0=nt.define({combine(i){return P({sources:i.map(e=>e.source).filter(e=>e!=null)},Lr(i.map(e=>e.config),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{delay:Math.max,markerFilter:lP,tooltipFilter:lP,needsRefresh:(e,A)=>e?A?t=>e(t)||A(t):e:A,hideOn:(e,A)=>e?A?(t,n,o)=>e(t,n,o)||A(t,n,o):e:A,autoPanel:(e,A)=>e||A}))}});function lP(i,e){return i?e?(A,t)=>e(i(A,t),t):i:e}function BP(i,e={}){return[E0.of({source:i,config:e}),T2A,pP]}function hP(i){let e=[];if(i)A:for(let{name:A}of i){for(let t=0;to.toLowerCase()==n.toLowerCase())){e.push(n);continue A}}e.push("")}return e}function EP(i,e,A){var t;let n=A?hP(e.actions):[];return po("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},po("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage(i):e.message),(t=e.actions)===null||t===void 0?void 0:t.map((o,a)=>{let r=!1,s=B=>{if(B.preventDefault(),r)return;r=!0;let u=F2(i.state.field(Fl).diagnostics,e);u&&o.apply(i,u.from,u.to)},{name:l}=o,g=n[a]?l.indexOf(n[a]):-1,C=g<0?l:[l.slice(0,g),po("u",l.slice(g,g+1)),l.slice(g+1)],d=o.markClass?" "+o.markClass:"";return po("button",{type:"button",class:"cm-diagnosticAction"+d,onclick:s,onmousedown:s,"aria-label":` Action: ${l}${g<0?"":` (access key "${n[a]})"`}.`},C)}),e.source&&po("div",{class:"cm-diagnosticSource"},e.source))}var ak=class extends gl{constructor(e){super(),this.sev=e}eq(e){return e.sev==this.sev}toDOM(){return po("span",{class:"cm-lintPoint cm-lintPoint-"+this.sev})}},T8=class{constructor(e,A){this.diagnostic=A,this.id="item_"+Math.floor(Math.random()*4294967295).toString(16),this.dom=EP(e,A,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}},b4=class i{constructor(e){this.view=e,this.items=[];let A=n=>{if(!(n.ctrlKey||n.altKey||n.metaKey)){if(n.keyCode==27)sP(this.view),this.view.focus();else if(n.keyCode==38||n.keyCode==33)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(n.keyCode==40||n.keyCode==34)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(n.keyCode==36)this.moveSelection(0);else if(n.keyCode==35)this.moveSelection(this.items.length-1);else if(n.keyCode==13)this.view.focus();else if(n.keyCode>=65&&n.keyCode<=90&&this.selectedIndex>=0){let{diagnostic:o}=this.items[this.selectedIndex],a=hP(o.actions);for(let r=0;r{for(let o=0;osP(this.view)},"\xD7")),this.update()}get selectedIndex(){let e=this.view.state.field(Fl).selected;if(!e)return-1;for(let A=0;A{for(let g of l.diagnostics){if(a.has(g))continue;a.add(g);let C=-1,d;for(let B=t;Bt&&(this.items.splice(t,C-t),n=!0)),A&&d.diagnostic==A.diagnostic?d.dom.hasAttribute("aria-selected")||(d.dom.setAttribute("aria-selected","true"),o=d):d.dom.hasAttribute("aria-selected")&&d.dom.removeAttribute("aria-selected"),t++}});t({sel:o.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:r,panel:s})=>{let l=s.height/this.list.offsetHeight;r.tops.bottom&&(this.list.scrollTop+=(r.bottom-s.bottom)/l)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let e=this.list.firstChild;function A(){let t=e;e=t.nextSibling,t.remove()}for(let t of this.items)if(t.dom.parentNode==this.list){for(;e!=t.dom;)A();e=t.dom.nextSibling}else this.list.insertBefore(t.dom,e);for(;e;)A()}moveSelection(e){if(this.selectedIndex<0)return;let A=this.view.state.field(Fl),t=F2(A.diagnostics,this.items[e].diagnostic);t&&this.view.dispatch({selection:{anchor:t.from,head:t.to},scrollIntoView:!0,effects:CP.of(t)})}static open(e){return new i(e)}};function K8(i,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(i)}')`}function G8(i){return K8(``,'width="6" height="3"')}var J2A=ui.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:G8("#d11")},".cm-lintRange-warning":{backgroundImage:G8("orange")},".cm-lintRange-info":{backgroundImage:G8("#999")},".cm-lintRange-hint":{backgroundImage:G8("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}},"&dark .cm-lintRange-active":{backgroundColor:"#86714a80"},"&dark .cm-panel.cm-panel-lint ul":{"& [aria-selected]":{backgroundColor:"#2e343e"}}});function Y2A(i){return i=="error"?4:i=="warning"?3:i=="info"?2:1}function QP(i){let e="hint",A=1;for(let t of i){let n=Y2A(t.severity);n>A&&(A=n,e=t.severity)}return e}var O8=class extends Cl{constructor(e){super(),this.diagnostics=e,this.severity=QP(e)}toDOM(e){let A=document.createElement("div");A.className="cm-lint-marker cm-lint-marker-"+this.severity;let t=this.diagnostics,n=e.state.facet(Y8).tooltipFilter;return n&&(t=n(t,e.state)),t.length&&(A.onmouseover=()=>z2A(e,A,t)),A}};function H2A(i,e){let A=t=>{let n=e.getBoundingClientRect();if(!(t.clientX>n.left-10&&t.clientXn.top-10&&t.clientYe.getBoundingClientRect()}}})}),e.onmouseout=e.onmousemove=null,H2A(i,e)}let{hoverTime:n}=i.state.facet(Y8),o=setTimeout(t,n);e.onmouseout=()=>{clearTimeout(o),e.onmouseout=e.onmousemove=null},e.onmousemove=()=>{clearTimeout(o),o=setTimeout(t,n)}}function P2A(i,e){let A=Object.create(null);for(let n of e){let o=i.lineAt(n.from);(A[o.from]||(A[o.from]=[])).push(n)}let t=[];for(let n in A)t.push(new O8(A[n]).range(+n));return uo.of(t,!0)}var j2A=p8({class:"cm-gutter-lint",markers:i=>i.state.field(rk),widgetMarker:(i,e,A)=>{let t=[];return i.state.field(rk).between(A.from,A.to,(n,o,a)=>{n>A.from&&nt.is(lk)?t.value:A,i)},provide:i=>ch.from(i)}),V2A=ui.baseTheme({".cm-gutter-lint":{width:"1.4em","& .cm-gutterElement":{padding:".2em"}},".cm-lint-marker":{width:"1em",height:"1em"},".cm-lint-marker-info":{content:K8('')},".cm-lint-marker-warning":{content:K8('')},".cm-lint-marker-error":{content:K8('')}}),pP=[Fl,ui.decorations.compute([Fl],i=>{let{selected:e,panel:A}=i.field(Fl);return!e||!A||e.from==e.to?Lt.none:Lt.set([L2A.range(e.from,e.to)])}),FH(G2A,{hideOn:gP}),J2A],Y8=nt.define({combine(i){return Lr(i,{hoverTime:300,markerFilter:null,tooltipFilter:null})}});function fP(i={}){return[Y8.of(i),rk,j2A,V2A,uP]}var ck=class i{constructor(e,A,t,n,o,a,r,s,l,g=0,C){this.p=e,this.stack=A,this.state=t,this.reducePos=n,this.pos=o,this.score=a,this.buffer=r,this.bufferBase=s,this.curContext=l,this.lookAhead=g,this.parent=C}toString(){return`[${this.stack.filter((e,A)=>A%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,A,t=0){let n=e.parser.context;return new i(e,[],A,t,t,0,[],0,n?new H8(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,A){this.stack.push(this.state,A,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var A;let t=e>>19,n=e&65535,{parser:o}=this.p,a=this.reducePos=2e3&&!(!((A=this.p.parser.nodeSet.types[n])===null||A===void 0)&&A.isAnonymous)&&(l==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=g):this.p.lastBigReductionSizes;)this.stack.pop();this.reduceContext(n,l)}storeNode(e,A,t,n=4,o=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&a.buffer[r-4]==0&&a.buffer[r-1]>-1){if(A==t)return;if(a.buffer[r-2]>=A){a.buffer[r-2]=t;return}}}if(!o||this.pos==t)this.buffer.push(e,A,t,n);else{let a=this.buffer.length;if(a>0&&(this.buffer[a-4]!=0||this.buffer[a-1]<0)){let r=!1;for(let s=a;s>0&&this.buffer[s-2]>t;s-=4)if(this.buffer[s-1]>=0){r=!0;break}if(r)for(;a>0&&this.buffer[a-2]>t;)this.buffer[a]=this.buffer[a-4],this.buffer[a+1]=this.buffer[a-3],this.buffer[a+2]=this.buffer[a-2],this.buffer[a+3]=this.buffer[a-1],a-=4,n>4&&(n-=4)}this.buffer[a]=e,this.buffer[a+1]=A,this.buffer[a+2]=t,this.buffer[a+3]=n}}shift(e,A,t,n){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let o=e,{parser:a}=this.p;this.pos=n;let r=a.stateFlag(o,1);!r&&(n>t||A<=a.maxNode)&&(this.reducePos=n),this.pushState(o,r?t:Math.min(t,this.reducePos)),this.shiftContext(A,t),A<=a.maxNode&&this.buffer.push(A,t,n,4)}else this.pos=n,this.shiftContext(A,t),A<=this.p.parser.maxNode&&this.buffer.push(A,t,n,4)}apply(e,A,t,n){e&65536?this.reduce(e):this.shift(e,A,t,n)}useNode(e,A){let t=this.p.reused.length-1;(t<0||this.p.reused[t]!=e)&&(this.p.reused.push(e),t++);let n=this.pos;this.reducePos=this.pos=n+e.length,this.pushState(A,n),this.buffer.push(t,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,A=e.buffer.length;for(;A>0&&e.buffer[A-2]>e.reducePos;)A-=4;let t=e.buffer.slice(A),n=e.bufferBase+A;for(;e&&n==e.bufferBase;)e=e.parent;return new i(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,t,n,this.curContext,this.lookAhead,e)}recoverByDelete(e,A){let t=e<=this.p.parser.maxNode;t&&this.storeNode(e,this.pos,A,4),this.storeNode(0,this.pos,A,t?8:4),this.pos=this.reducePos=A,this.score-=190}canShift(e){for(let A=new Ck(this);;){let t=this.p.parser.stateSlot(A.state,4)||this.p.parser.hasAction(A.state,e);if(t==0)return!1;if((t&65536)==0)return!0;A.reduce(t)}}recoverByInsert(e){if(this.stack.length>=300)return[];let A=this.p.parser.nextStates(this.state);if(A.length>8||this.stack.length>=120){let n=[];for(let o=0,a;os&1&&r==a)||n.push(A[o],a)}A=n}let t=[];for(let n=0;n>19,n=A&65535,o=this.stack.length-t*3;if(o<0||e.getGoto(this.stack[o],n,!1)<0){let a=this.findForcedReduction();if(a==null)return!1;A=a}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(A),!0}findForcedReduction(){let{parser:e}=this.p,A=[],t=(n,o)=>{if(!A.includes(n))return A.push(n),e.allActions(n,a=>{if(!(a&393216))if(a&65536){let r=(a>>19)-o;if(r>1){let s=a&65535,l=this.stack.length-r*3;if(l>=0&&e.getGoto(this.stack[l],s,!1)>=0)return r<<19|65536|s}}else{let r=t(a,o+1);if(r!=null)return r}})};return t(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let A=0;A0&&this.emitLookAhead()}},H8=class{constructor(e,A){this.tracker=e,this.context=A,this.hash=e.strict?e.hash(A):0}},Ck=class{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let A=e&65535,t=e>>19;t==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(t-1)*3;let n=this.start.p.parser.getGoto(this.stack[this.base-3],A,!0);this.state=n}},dk=class i{constructor(e,A,t){this.stack=e,this.pos=A,this.index=t,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,A=e.bufferBase+e.buffer.length){return new i(e,A,A-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new i(this.stack,this.pos,this.index)}};function M4(i,e=Uint16Array){if(typeof i!="string")return i;let A=null;for(let t=0,n=0;t=92&&a--,a>=34&&a--;let s=a-32;if(s>=46&&(s-=46,r=!0),o+=s,r)break;o*=46}A?A[n++]=o:A=new e(o)}return A}var uh=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},mP=new uh,Ik=class{constructor(e,A){this.input=e,this.ranges=A,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=mP,this.rangeIndex=0,this.pos=this.chunkPos=A[0].from,this.range=A[0],this.end=A[A.length-1].to,this.readNext()}resolveOffset(e,A){let t=this.range,n=this.rangeIndex,o=this.pos+e;for(;ot.to:o>=t.to;){if(n==this.ranges.length-1)return null;let a=this.ranges[++n];o+=a.from-t.to,t=a}return o}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,A.from);return this.end}peek(e){let A=this.chunkOff+e,t,n;if(A>=0&&A=this.chunk2Pos&&tr.to&&(this.chunk2=this.chunk2.slice(0,r.to-t)),n=this.chunk2.charCodeAt(0)}}return t>=this.token.lookAhead&&(this.token.lookAhead=t+1),n}acceptToken(e,A=0){let t=A?this.resolveOffset(A,-1):this.pos;if(t==null||t=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,A){if(A?(this.token=A,A.start=e,A.lookAhead=e+1,A.value=A.extended=-1):this.token=mP,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&A<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,A-this.chunkPos);if(e>=this.chunk2Pos&&A<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,A-this.chunk2Pos);if(e>=this.range.from&&A<=this.range.to)return this.input.read(e,A);let t="";for(let n of this.ranges){if(n.from>=A)break;n.to>e&&(t+=this.input.read(Math.max(n.from,e),Math.min(n.to,A)))}return t}},L2=class{constructor(e,A){this.data=e,this.id=A}token(e,A){let{parser:t}=A.p;bP(this.data,e,A,this.id,t.data,t.tokenPrecTable)}};L2.prototype.contextual=L2.prototype.fallback=L2.prototype.extend=!1;var Bk=class{constructor(e,A,t){this.precTable=A,this.elseToken=t,this.data=typeof e=="string"?M4(e):e}token(e,A){let t=e.pos,n=0;for(;;){let o=e.next<0,a=e.resolveOffset(1,1);if(bP(this.data,e,A,0,this.data,this.precTable),e.token.value>-1)break;if(this.elseToken==null)return;if(o||n++,a==null)break;e.reset(a,e.token)}n&&(e.reset(t,e.token),e.acceptToken(this.elseToken,n))}};Bk.prototype.contextual=L2.prototype.fallback=L2.prototype.extend=!1;function bP(i,e,A,t,n,o){let a=0,r=1<0){let u=i[B];if(s.allows(u)&&(e.token.value==-1||e.token.value==u||W2A(u,e.token.value,n,o))){e.acceptToken(u);break}}let g=e.next,C=0,d=i[a+2];if(e.next<0&&d>C&&i[l+d*3-3]==65535){a=i[l+d*3-1];continue A}for(;C>1,u=l+B+(B<<1),E=i[u],f=i[u+1]||65536;if(g=f)C=B+1;else{a=i[u+2],e.advance();continue A}}break}}function wP(i,e,A){for(let t=e,n;(n=i[t])!=65535;t++)if(n==A)return t-e;return-1}function W2A(i,e,A,t){let n=wP(A,t,e);return n<0||wP(A,t,i)e)&&!t.type.isError)return A<0?Math.max(0,Math.min(t.to-1,e-25)):Math.min(i.length,Math.max(t.from+1,e+25));if(A<0?t.prevSibling():t.nextSibling())break;if(!t.parent())return A<0?0:i.length}}var hk=class{constructor(e,A){this.fragments=e,this.nodeSet=A,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?yP(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?yP(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=a,null;if(o instanceof Pa){if(a==e){if(a=Math.max(this.safeFrom,e)&&(this.trees.push(o),this.start.push(a),this.index.push(0))}else this.index[A]++,this.nextStart=a+o.length}}},Ek=class{constructor(e,A){this.stream=A,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(t=>new uh)}getActions(e){let A=0,t=null,{parser:n}=e.p,{tokenizers:o}=n,a=n.stateSlot(e.state,3),r=e.curContext?e.curContext.hash:0,s=0;for(let l=0;lC.end+25&&(s=Math.max(C.lookAhead,s)),C.value!=0)){let d=A;if(C.extended>-1&&(A=this.addActions(e,C.extended,C.end,A)),A=this.addActions(e,C.value,C.end,A),!g.extend&&(t=C,A>d))break}}for(;this.actions.length>A;)this.actions.pop();return s&&e.setLookAhead(s),!t&&e.pos==this.stream.end&&(t=new uh,t.value=e.p.parser.eofTerm,t.start=t.end=e.pos,A=this.addActions(e,t.value,t.end,A)),this.mainToken=t,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let A=new uh,{pos:t,p:n}=e;return A.start=t,A.end=Math.min(t+1,n.stream.end),A.value=t==n.stream.end?n.parser.eofTerm:0,A}updateCachedToken(e,A,t){let n=this.stream.clipPos(t.pos);if(A.token(this.stream.reset(n,e),t),e.value>-1){let{parser:o}=t.p;for(let a=0;a=0&&t.p.parser.dialect.allows(r>>1)){(r&1)==0?e.value=r>>1:e.extended=r>>1;break}}}else e.value=0,e.end=this.stream.clipPos(n+1)}putAction(e,A,t,n){for(let o=0;oe.bufferLength*4?new hk(t,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,A=this.minStackPos,t=this.stacks=[],n,o;if(this.bigReductionCount>300&&e.length==1){let[a]=e;for(;a.forceReduce()&&a.stack.length&&a.stack[a.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let a=0;aA)t.push(r);else{if(this.advanceStack(r,t,e))continue;{n||(n=[],o=[]),n.push(r);let s=this.tokens.getMainToken(r);o.push(s.value,s.end)}}break}}if(!t.length){let a=n&&Z2A(n);if(a)return Ll&&console.log("Finish with "+this.stackID(a)),this.stackToTree(a);if(this.parser.strict)throw Ll&&n&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+A);this.recovering||(this.recovering=5)}if(this.recovering&&n){let a=this.stoppedAt!=null&&n[0].pos>this.stoppedAt?n[0]:this.runRecovery(n,o,t);if(a)return Ll&&console.log("Force-finish "+this.stackID(a)),this.stackToTree(a.forceAll())}if(this.recovering){let a=this.recovering==1?1:this.recovering*3;if(t.length>a)for(t.sort((r,s)=>s.score-r.score);t.length>a;)t.pop();t.some(r=>r.reducePos>A)&&this.recovering--}else if(t.length>1){A:for(let a=0;a500&&l.buffer.length>500)if((r.score-l.score||r.buffer.length-l.buffer.length)>0)t.splice(s--,1);else{t.splice(a--,1);continue A}}}t.length>12&&(t.sort((a,r)=>r.score-a.score),t.splice(12,t.length-12))}this.minStackPos=t[0].pos;for(let a=1;a ":"";if(this.stoppedAt!=null&&n>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let l=e.curContext&&e.curContext.tracker.strict,g=l?e.curContext.hash:0;for(let C=this.fragments.nodeAt(n);C;){let d=this.parser.nodeSet.types[C.type.id]==C.type?o.getGoto(e.state,C.type.id):-1;if(d>-1&&C.length&&(!l||(C.prop(Hi.contextHash)||0)==g))return e.useNode(C,d),Ll&&console.log(a+this.stackID(e)+` (via reuse of ${o.getName(C.type.id)})`),!0;if(!(C instanceof Pa)||C.children.length==0||C.positions[0]>0)break;let B=C.children[0];if(B instanceof Pa&&C.positions[0]==0)C=B;else break}}let r=o.stateSlot(e.state,4);if(r>0)return e.reduce(r),Ll&&console.log(a+this.stackID(e)+` (via always-reduce ${o.getName(r&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let s=this.tokens.getActions(e);for(let l=0;ln?A.push(u):t.push(u)}return!1}advanceFully(e,A){let t=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>t)return DP(e,A),!0}}runRecovery(e,A,t){let n=null,o=!1;for(let a=0;a ":"";if(r.deadEnd&&(o||(o=!0,r.restart(),Ll&&console.log(g+this.stackID(r)+" (restarted)"),this.advanceFully(r,t))))continue;let C=r.split(),d=g;for(let B=0;B<10&&C.forceReduce()&&(Ll&&console.log(d+this.stackID(C)+" (via force-reduce)"),!this.advanceFully(C,t));B++)Ll&&(d=this.stackID(C)+" -> ");for(let B of r.recoverByInsert(s))Ll&&console.log(g+this.stackID(B)+" (via recover-insert)"),this.advanceFully(B,t);this.stream.end>r.pos?(l==r.pos&&(l++,s=0),r.recoverByDelete(s,l),Ll&&console.log(g+this.stackID(r)+` (via recover-delete ${this.parser.getName(s)})`),DP(r,t)):(!n||n.scoree.topRules[r][1]),n=[];for(let r=0;r=0)o(g,s,r[l++]);else{let C=r[l+-g];for(let d=-g;d>0;d--)o(r[l++],s,C);l++}}}this.nodeSet=new B4(A.map((r,s)=>ys.define({name:s>=this.minRepeatTerm?void 0:r,id:s,props:n[s],top:t.indexOf(s)>-1,error:s==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(s)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=1024;let a=M4(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let r=0;rtypeof r=="number"?new L2(a,r):r),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,A,t){let n=new Qk(this,e,A,t);for(let o of this.wrappers)n=o(n,e,A,t);return n}getGoto(e,A,t=!1){let n=this.goto;if(A>=n[0])return-1;for(let o=n[A+1];;){let a=n[o++],r=a&1,s=n[o++];if(r&&t)return s;for(let l=o+(a>>1);o0}validAction(e,A){return!!this.allActions(e,t=>t==A?!0:null)}allActions(e,A){let t=this.stateSlot(e,4),n=t?A(t):void 0;for(let o=this.stateSlot(e,1);n==null;o+=3){if(this.data[o]==65535)if(this.data[o+1]==1)o=CC(this.data,o+2);else break;n=A(CC(this.data,o+1))}return n}nextStates(e){let A=[];for(let t=this.stateSlot(e,1);;t+=3){if(this.data[t]==65535)if(this.data[t+1]==1)t=CC(this.data,t+2);else break;if((this.data[t+2]&1)==0){let n=this.data[t+1];A.some((o,a)=>a&1&&o==n)||A.push(this.data[t],n)}}return A}configure(e){let A=Object.assign(Object.create(i.prototype),this);if(e.props&&(A.nodeSet=this.nodeSet.extend(...e.props)),e.top){let t=this.topRules[e.top];if(!t)throw new RangeError(`Invalid top rule name ${e.top}`);A.top=t}return e.tokenizers&&(A.tokenizers=this.tokenizers.map(t=>{let n=e.tokenizers.find(o=>o.from==t);return n?n.to:t})),e.specializers&&(A.specializers=this.specializers.slice(),A.specializerSpecs=this.specializerSpecs.map((t,n)=>{let o=e.specializers.find(r=>r.from==t.external);if(!o)return t;let a=Object.assign(Object.assign({},t),{external:o.to});return A.specializers[n]=vP(a),a})),e.contextTracker&&(A.context=e.contextTracker),e.dialect&&(A.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(A.strict=e.strict),e.wrap&&(A.wrappers=A.wrappers.concat(e.wrap)),e.bufferLength!=null&&(A.bufferLength=e.bufferLength),A}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let A=this.dynamicPrecedences;return A==null?0:A[e]||0}parseDialect(e){let A=Object.keys(this.dialects),t=A.map(()=>!1);if(e)for(let o of e.split(" ")){let a=A.indexOf(o);a>=0&&(t[a]=!0)}let n=null;for(let o=0;ot)&&A.p.parser.stateFlag(A.state,2)&&(!e||e.scorei.external(A,t)<<1|e}return i.get}var X2A=M8({String:Oe.string,Number:Oe.number,"True False":Oe.bool,PropertyName:Oe.propertyName,Null:Oe.null,", :":Oe.separator,"[ ]":Oe.squareBracket,"{ }":Oe.brace}),MP=z8.deserialize({version:14,states:"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l",stateData:"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O",goto:"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R",nodeNames:"\u26A0 JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array",maxTerm:25,nodeProps:[["isolate",-2,6,11,""],["openedBy",7,"{",14,"["],["closedBy",8,"}",15,"]"]],propSources:[X2A],skippedNodes:[0],repeatNodeCount:2,tokenData:"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~",tokenizers:[0],topRules:{JsonText:[0,1]},tokenPrec:0});var $2A=S8.define({name:"json",parser:MP.configure({props:[VS.add({Object:qS({except:/^\s*\}/}),Array:qS({except:/^\s*\]/})}),w4.add({"Object Array":lz})]}),languageData:{closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/}});function SP(){return new k8($2A)}var kP=typeof String.prototype.normalize=="function"?i=>i.normalize("NFKD"):i=>i,K2=class{constructor(e,A,t=0,n=e.length,o,a){this.test=a,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(t,n),this.bufferStart=t,this.normalize=o?r=>o(kP(r)):kP,this.query=this.normalize(A)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return $r(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let A=qu(e),t=this.bufferStart+this.bufferPos;this.bufferPos+=Rl(e);let n=this.normalize(A);if(n.length)for(let o=0,a=t;;o++){let r=n.charCodeAt(o),s=this.match(r,a,this.bufferPos+this.bufferStart);if(o==n.length-1){if(s)return this.value=s,this;break}a==t&&othis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let A=this.matchPos<=this.to&&this.re.exec(this.curLine);if(A){let t=this.curLineStart+A.index,n=t+A[0].length;if(this.matchPos=Z8(this.text,n+(t==n?1:0)),t==this.curLineStart+this.curLine.length&&this.nextLine(),(tthis.value.to)&&(!this.test||this.test(t,n,A)))return this.value={from:t,to:n,match:A},this;e=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length=t||n.to<=A){let r=new i(A,e.sliceString(A,t));return pk.set(e,r),r}if(n.from==A&&n.to==t)return n;let{text:o,from:a}=n;return a>A&&(o=e.sliceString(A,a)+o,a=A),n.to=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,A=this.re.exec(this.flat.text);if(A&&!A[0]&&A.index==e&&(this.re.lastIndex=e+1,A=this.re.exec(this.flat.text)),A){let t=this.flat.from+A.index,n=t+A[0].length;if((this.flat.to>=this.to||A.index+A[0].length<=this.flat.text.length-10)&&(!this.test||this.test(t,n,A)))return this.value={from:t,to:n,match:A},this.matchPos=Z8(this.text,n+(t==n?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=q8.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}};typeof Symbol<"u"&&(V8.prototype[Symbol.iterator]=W8.prototype[Symbol.iterator]=function(){return this});function A1A(i){try{return new RegExp(i,vk),!0}catch(e){return!1}}function Z8(i,e){if(e>=i.length)return e;let A=i.lineAt(e),t;for(;e=56320&&t<57344;)e++;return e}var e1A=i=>{let{state:e}=i,A=String(e.doc.lineAt(i.state.selection.main.head).number),{close:t,result:n}=GH(i,{label:e.phrase("Go to line"),input:{type:"text",name:"line",value:A},focus:!0,submitLabel:e.phrase("go")});return n.then(o=>{let a=o&&/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(o.elements.line.value);if(!a){i.dispatch({effects:t});return}let r=e.doc.lineAt(e.selection.main.head),[,s,l,g,C]=a,d=g?+g.slice(1):0,B=l?+l:r.number;if(l&&C){let f=B/100;s&&(f=f*(s=="-"?-1:1)+r.number/e.doc.lines),B=Math.round(e.doc.lines*f)}else l&&s&&(B=B*(s=="-"?-1:1)+r.number);let u=e.doc.line(Math.max(1,Math.min(e.doc.lines,B))),E=Be.cursor(u.from+Math.max(0,Math.min(d,u.length)));i.dispatch({effects:[t,ui.scrollIntoView(E.from,{y:"center"})],selection:E})}),!0},t1A={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},NP=nt.define({combine(i){return Lr(i,t1A,{highlightWordAroundCursor:(e,A)=>e||A,minSelectionLength:Math.min,maxMatches:Math.min})}});function FP(i){let e=[r1A,a1A];return i&&e.push(NP.of(i)),e}var i1A=Lt.mark({class:"cm-selectionMatch"}),n1A=Lt.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function _P(i,e,A,t){return(A==0||i(e.sliceDoc(A-1,A))!=$o.Word)&&(t==e.doc.length||i(e.sliceDoc(t,t+1))!=$o.Word)}function o1A(i,e,A,t){return i(e.sliceDoc(A,A+1))==$o.Word&&i(e.sliceDoc(t-1,t))==$o.Word}var a1A=Po.fromClass(class{constructor(i){this.decorations=this.getDeco(i)}update(i){(i.selectionSet||i.docChanged||i.viewportChanged)&&(this.decorations=this.getDeco(i.view))}getDeco(i){let e=i.state.facet(NP),{state:A}=i,t=A.selection;if(t.ranges.length>1)return Lt.none;let n=t.main,o,a=null;if(n.empty){if(!e.highlightWordAroundCursor)return Lt.none;let s=A.wordAt(n.head);if(!s)return Lt.none;a=A.charCategorizer(n.head),o=A.sliceDoc(s.from,s.to)}else{let s=n.to-n.from;if(s200)return Lt.none;if(e.wholeWords){if(o=A.sliceDoc(n.from,n.to),a=A.charCategorizer(n.head),!(_P(a,A,n.from,n.to)&&o1A(a,A,n.from,n.to)))return Lt.none}else if(o=A.sliceDoc(n.from,n.to),!o)return Lt.none}let r=[];for(let s of i.visibleRanges){let l=new K2(A.doc,o,s.from,s.to);for(;!l.next().done;){let{from:g,to:C}=l.value;if((!a||_P(a,A,g,C))&&(n.empty&&g<=n.from&&C>=n.to?r.push(n1A.range(g,C)):(g>=n.to||C<=n.from)&&r.push(i1A.range(g,C)),r.length>e.maxMatches))return Lt.none}}return Lt.set(r)}},{decorations:i=>i.decorations}),r1A=ui.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),s1A=({state:i,dispatch:e})=>{let{selection:A}=i,t=Be.create(A.ranges.map(n=>i.wordAt(n.head)||Be.cursor(n.head)),A.mainIndex);return t.eq(A)?!1:(e(i.update({selection:t})),!0)};function l1A(i,e){let{main:A,ranges:t}=i.selection,n=i.wordAt(A.head),o=n&&n.from==A.from&&n.to==A.to;for(let a=!1,r=new K2(i.doc,e,t[t.length-1].to);;)if(r.next(),r.done){if(a)return null;r=new K2(i.doc,e,0,Math.max(0,t[t.length-1].from-1)),a=!0}else{if(a&&t.some(s=>s.from==r.value.from))continue;if(o){let s=i.wordAt(r.value.from);if(!s||s.from!=r.value.from||s.to!=r.value.to)continue}return r.value}}var g1A=({state:i,dispatch:e})=>{let{ranges:A}=i.selection;if(A.some(o=>o.from===o.to))return s1A({state:i,dispatch:e});let t=i.sliceDoc(A[0].from,A[0].to);if(i.selection.ranges.some(o=>i.sliceDoc(o.from,o.to)!=t))return!1;let n=l1A(i,t);return n?(e(i.update({selection:i.selection.addRange(Be.range(n.from,n.to),!1),effects:ui.scrollIntoView(n.to)})),!0):!1},Fd=nt.define({combine(i){return Lr(i,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new yk(e),scrollToMatch:e=>ui.scrollIntoView(e)})}});function LP(i){return i?[Fd.of(i),Dk]:Dk}var X8=class{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||A1A(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord,this.test=e.test}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,(A,t)=>t=="n"?` -`:t=="r"?"\r":t=="t"?" ":"\\")}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord&&this.test==e.test}create(){return this.regexp?new mk(this):new fk(this)}getCursor(e,A=0,t){let n=e.doc?e:ir.create({doc:e});return t==null&&(t=n.doc.length),this.regexp?fh(this,n,A,t):ph(this,n,A,t)}},$8=class{constructor(e){this.spec=e}};function c1A(i,e,A){return(t,n,o,a)=>{if(A&&!A(t,n,o,a))return!1;let r=t>=a&&n<=a+o.length?o.slice(t-a,n-a):e.doc.sliceString(t,n);return i(r,e,t,n)}}function ph(i,e,A,t){let n;return i.wholeWord&&(n=C1A(e.doc,e.charCategorizer(e.selection.main.head))),i.test&&(n=c1A(i.test,e,n)),new K2(e.doc,i.unquoted,A,t,i.caseSensitive?void 0:o=>o.toLowerCase(),n)}function C1A(i,e){return(A,t,n,o)=>((o>A||o+n.length=A)return null;n.push(t.value)}return n}highlight(e,A,t,n){let o=ph(this.spec,e,Math.max(0,A-this.spec.unquoted.length),Math.min(t+this.spec.unquoted.length,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}};function d1A(i,e,A){return(t,n,o)=>(!A||A(t,n,o))&&i(o[0],e,t,n)}function fh(i,e,A,t){let n;return i.wholeWord&&(n=I1A(e.charCategorizer(e.selection.main.head))),i.test&&(n=d1A(i.test,e,n)),new V8(e.doc,i.search,{ignoreCase:!i.caseSensitive,test:n},A,t)}function Aw(i,e){return i.slice(tr(i,e,!1),e)}function ew(i,e){return i.slice(e,tr(i,e))}function I1A(i){return(e,A,t)=>!t[0].length||(i(Aw(t.input,t.index))!=$o.Word||i(ew(t.input,t.index))!=$o.Word)&&(i(ew(t.input,t.index+t[0].length))!=$o.Word||i(Aw(t.input,t.index+t[0].length))!=$o.Word)}var mk=class extends $8{nextMatch(e,A,t){let n=fh(this.spec,e,t,e.doc.length).next();return n.done&&(n=fh(this.spec,e,0,A).next()),n.done?null:n.value}prevMatchInRange(e,A,t){for(let n=1;;n++){let o=Math.max(A,t-n*1e4),a=fh(this.spec,e,o,t),r=null;for(;!a.next().done;)r=a.value;if(r&&(o==A||r.from>o+10))return r;if(o==A)return null}}prevMatch(e,A,t){return this.prevMatchInRange(e,0,A)||this.prevMatchInRange(e,t,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(A,t)=>{if(t=="&")return e.match[0];if(t=="$")return"$";for(let n=t.length;n>0;n--){let o=+t.slice(0,n);if(o>0&&o=A)return null;n.push(t.value)}return n}highlight(e,A,t,n){let o=fh(this.spec,e,Math.max(0,A-250),Math.min(t+250,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}},k4=ln.define(),bk=ln.define(),G2=La.define({create(i){return new S4(wk(i).create(),null)},update(i,e){for(let A of e.effects)A.is(k4)?i=new S4(A.value.create(),i.panel):A.is(bk)&&(i=new S4(i.query,A.value?Mk:null));return i},provide:i=>vd.from(i,e=>e.panel)});var S4=class{constructor(e,A){this.query=e,this.panel=A}},B1A=Lt.mark({class:"cm-searchMatch"}),h1A=Lt.mark({class:"cm-searchMatch cm-searchMatch-selected"}),E1A=Po.fromClass(class{constructor(i){this.view=i,this.decorations=this.highlight(i.state.field(G2))}update(i){let e=i.state.field(G2);(e!=i.startState.field(G2)||i.docChanged||i.selectionSet||i.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:i,panel:e}){if(!e||!i.spec.valid)return Lt.none;let{view:A}=this,t=new Xr;for(let n=0,o=A.visibleRanges,a=o.length;no[n+1].from-500;)s=o[++n].to;i.highlight(A.state,r,s,(l,g)=>{let C=A.state.selection.ranges.some(d=>d.from==l&&d.to==g);t.add(l,g,C?h1A:B1A)})}return t.finish()}},{decorations:i=>i.decorations});function _4(i){return e=>{let A=e.state.field(G2,!1);return A&&A.query.spec.valid?i(e,A):nw(e)}}var tw=_4((i,{query:e})=>{let{to:A}=i.state.selection.main,t=e.nextMatch(i.state,A,A);if(!t)return!1;let n=Be.single(t.from,t.to),o=i.state.facet(Fd);return i.dispatch({selection:n,effects:[Sk(i,t),o.scrollToMatch(n.main,i)],userEvent:"select.search"}),KP(i),!0}),iw=_4((i,{query:e})=>{let{state:A}=i,{from:t}=A.selection.main,n=e.prevMatch(A,t,t);if(!n)return!1;let o=Be.single(n.from,n.to),a=i.state.facet(Fd);return i.dispatch({selection:o,effects:[Sk(i,n),a.scrollToMatch(o.main,i)],userEvent:"select.search"}),KP(i),!0}),Q1A=_4((i,{query:e})=>{let A=e.matchAll(i.state,1e3);return!A||!A.length?!1:(i.dispatch({selection:Be.create(A.map(t=>Be.range(t.from,t.to))),userEvent:"select.search.matches"}),!0)}),u1A=({state:i,dispatch:e})=>{let A=i.selection;if(A.ranges.length>1||A.main.empty)return!1;let{from:t,to:n}=A.main,o=[],a=0;for(let r=new K2(i.doc,i.sliceDoc(t,n));!r.next().done;){if(o.length>1e3)return!1;r.value.from==t&&(a=o.length),o.push(Be.range(r.value.from,r.value.to))}return e(i.update({selection:Be.create(o,a),userEvent:"select.search.matches"})),!0},xP=_4((i,{query:e})=>{let{state:A}=i,{from:t,to:n}=A.selection.main;if(A.readOnly)return!1;let o=e.nextMatch(A,t,t);if(!o)return!1;let a=o,r=[],s,l,g=[];a.from==t&&a.to==n&&(l=A.toText(e.getReplacement(a)),r.push({from:a.from,to:a.to,insert:l}),a=e.nextMatch(A,a.from,a.to),g.push(ui.announce.of(A.phrase("replaced match on line $",A.doc.lineAt(t).number)+".")));let C=i.state.changes(r);return a&&(s=Be.single(a.from,a.to).map(C),g.push(Sk(i,a)),g.push(A.facet(Fd).scrollToMatch(s.main,i))),i.dispatch({changes:C,selection:s,effects:g,userEvent:"input.replace"}),!0}),p1A=_4((i,{query:e})=>{if(i.state.readOnly)return!1;let A=e.matchAll(i.state,1e9).map(n=>{let{from:o,to:a}=n;return{from:o,to:a,insert:e.getReplacement(n)}});if(!A.length)return!1;let t=i.state.phrase("replaced $ matches",A.length)+".";return i.dispatch({changes:A,effects:ui.announce.of(t),userEvent:"input.replace.all"}),!0});function Mk(i){return i.state.facet(Fd).createPanel(i)}function wk(i,e){var A,t,n,o,a;let r=i.selection.main,s=r.empty||r.to>r.from+100?"":i.sliceDoc(r.from,r.to);if(e&&!s)return e;let l=i.facet(Fd);return new X8({search:((A=e?.literal)!==null&&A!==void 0?A:l.literal)?s:s.replace(/\n/g,"\\n"),caseSensitive:(t=e?.caseSensitive)!==null&&t!==void 0?t:l.caseSensitive,literal:(n=e?.literal)!==null&&n!==void 0?n:l.literal,regexp:(o=e?.regexp)!==null&&o!==void 0?o:l.regexp,wholeWord:(a=e?.wholeWord)!==null&&a!==void 0?a:l.wholeWord})}function GP(i){let e=d4(i,Mk);return e&&e.dom.querySelector("[main-field]")}function KP(i){let e=GP(i);e&&e==i.root.activeElement&&e.select()}var nw=i=>{let e=i.state.field(G2,!1);if(e&&e.panel){let A=GP(i);if(A&&A!=i.root.activeElement){let t=wk(i.state,e.query.spec);t.valid&&i.dispatch({effects:k4.of(t)}),A.focus(),A.select()}}else i.dispatch({effects:[bk.of(!0),e?k4.of(wk(i.state,e.query.spec)):ln.appendConfig.of(Dk)]});return!0},ow=i=>{let e=i.state.field(G2,!1);if(!e||!e.panel)return!1;let A=d4(i,Mk);return A&&A.dom.contains(i.root.activeElement)&&i.focus(),i.dispatch({effects:bk.of(!1)}),!0},UP=[{key:"Mod-f",run:nw,scope:"editor search-panel"},{key:"F3",run:tw,shift:iw,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:tw,shift:iw,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:ow,scope:"editor search-panel"},{key:"Mod-Shift-l",run:u1A},{key:"Mod-Alt-g",run:e1A},{key:"Mod-d",run:g1A,preventDefault:!0}],yk=class{constructor(e){this.view=e;let A=this.query=e.state.field(G2).query.spec;this.commit=this.commit.bind(this),this.searchField=po("input",{value:A.search,placeholder:Gl(e,"Find"),"aria-label":Gl(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=po("input",{value:A.replace,placeholder:Gl(e,"Replace"),"aria-label":Gl(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=po("input",{type:"checkbox",name:"case",form:"",checked:A.caseSensitive,onchange:this.commit}),this.reField=po("input",{type:"checkbox",name:"re",form:"",checked:A.regexp,onchange:this.commit}),this.wordField=po("input",{type:"checkbox",name:"word",form:"",checked:A.wholeWord,onchange:this.commit});function t(n,o,a){return po("button",{class:"cm-button",name:n,onclick:o,type:"button"},a)}this.dom=po("div",{onkeydown:n=>this.keydown(n),class:"cm-search"},[this.searchField,t("next",()=>tw(e),[Gl(e,"next")]),t("prev",()=>iw(e),[Gl(e,"previous")]),t("select",()=>Q1A(e),[Gl(e,"all")]),po("label",null,[this.caseField,Gl(e,"match case")]),po("label",null,[this.reField,Gl(e,"regexp")]),po("label",null,[this.wordField,Gl(e,"by word")]),...e.state.readOnly?[]:[po("br"),this.replaceField,t("replace",()=>xP(e),[Gl(e,"replace")]),t("replaceAll",()=>p1A(e),[Gl(e,"replace all")])],po("button",{name:"close",onclick:()=>ow(e),"aria-label":Gl(e,"close"),type:"button"},["\xD7"])])}commit(){let e=new X8({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:k4.of(e)}))}keydown(e){wH(this.view,e,"search-panel")?e.preventDefault():e.keyCode==13&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?iw:tw)(this.view)):e.keyCode==13&&e.target==this.replaceField&&(e.preventDefault(),xP(this.view))}update(e){for(let A of e.transactions)for(let t of A.effects)t.is(k4)&&!t.value.eq(this.query)&&this.setQuery(t.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(Fd).top}};function Gl(i,e){return i.state.phrase(e)}var P8=30,j8=/[\s\.,:;?!]/;function Sk(i,{from:e,to:A}){let t=i.state.doc.lineAt(e),n=i.state.doc.lineAt(A).to,o=Math.max(t.from,e-P8),a=Math.min(n,A+P8),r=i.state.sliceDoc(o,a);if(o!=t.from){for(let s=0;sr.length-P8;s--)if(!j8.test(r[s-1])&&j8.test(r[s])){r=r.slice(0,s);break}}return ui.announce.of(`${i.state.phrase("current match")}. ${r} ${i.state.phrase("on line")} ${t.number}.`)}var f1A=ui.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),Dk=[G2,oc.low(E1A),f1A];var rw=class{constructor(e,A,t,n){this.state=e,this.pos=A,this.explicit=t,this.view=n,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let A=Kr(this.state).resolveInner(this.pos,-1);for(;A&&e.indexOf(A.name)<0;)A=A.parent;return A?{from:A.from,to:this.pos,text:this.state.sliceDoc(A.from,this.pos),type:A.type}:null}matchBefore(e){let A=this.state.doc.lineAt(this.pos),t=Math.max(A.from,this.pos-250),n=A.text.slice(t-A.from,this.pos-A.from),o=n.search(jP(e,!1));return o<0?null:{from:t+o,to:this.pos,text:n.slice(o)}}get aborted(){return this.abortListeners==null}addEventListener(e,A,t){e=="abort"&&this.abortListeners&&(this.abortListeners.push(A),t&&t.onDocChange&&(this.abortOnDocChange=!0))}};function TP(i){let e=Object.keys(i).join(""),A=/\w/.test(e);return A&&(e=e.replace(/\w/g,"")),`[${A?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function m1A(i){let e=Object.create(null),A=Object.create(null);for(let{label:n}of i){e[n[0]]=!0;for(let o=1;otypeof n=="string"?{label:n}:n),[A,t]=e.every(n=>/^\w+$/.test(n.label))?[/\w*$/,/\w+$/]:m1A(e);return n=>{let o=n.matchBefore(t);return o||n.explicit?{from:o?o.from:n.pos,options:e,validFor:A}:null}}var sw=class{constructor(e,A,t,n){this.completion=e,this.source=A,this.match=t,this.score=n}};function Gd(i){return i.selection.main.from}function jP(i,e){var A;let{source:t}=i,n=e&&t[0]!="^",o=t[t.length-1]!="$";return!n&&!o?i:new RegExp(`${n?"^":""}(?:${t})${o?"$":""}`,(A=i.flags)!==null&&A!==void 0?A:i.ignoreCase?"i":"")}var VP=sl.define();function y1A(i,e,A,t){let{main:n}=i.selection,o=A-n.from,a=t-n.from;return $A(P({},i.changeByRange(r=>{if(r!=n&&A!=t&&i.sliceDoc(r.from+o,r.from+a)!=i.sliceDoc(A,t))return{range:r};let s=i.toText(e);return{changes:{from:r.from+o,to:t==n.from?r.to:r.from+a,insert:s},range:Be.cursor(r.from+o+s.length)}})),{scrollIntoView:!0,userEvent:"input.complete"})}var OP=new WeakMap;function D1A(i){if(!Array.isArray(i))return i;let e=OP.get(i);return e||OP.set(i,e=w1A(i)),e}var lw=ln.define(),x4=ln.define(),Rk=class{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let A=0;A=48&&M<=57||M>=97&&M<=122?2:M>=65&&M<=90?1:0:(x=qu(M))!=x.toLowerCase()?1:x!=x.toUpperCase()?2:0;(!v||F==1&&f||k==0&&F!=0)&&(A[C]==M||t[C]==M&&(d=!0)?a[C++]=v:a.length&&(m=!1)),k=F,v+=Rl(M)}return C==s&&a[0]==0&&m?this.result(-100+(d?-200:0),a,e):B==s&&u==0?this.ret(-200-e.length+(E==e.length?0:-100),[0,E]):r>-1?this.ret(-700-e.length,[r,r+this.pattern.length]):B==s?this.ret(-900-e.length,[u,E]):C==s?this.result(-100+(d?-200:0)+-700+(m?0:-1100),a,e):A.length==2?null:this.result((n[0]?-700:0)+-200+-1100,n,e)}result(e,A,t){let n=[],o=0;for(let a of A){let r=a+(this.astral?Rl($r(t,a)):1);o&&n[o-1]==a?n[o-1]=r:(n[o++]=a,n[o++]=r)}return this.ret(e-t.length,n)}},Nk=class{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:v1A,filterStrict:!1,compareCompletions:(e,A)=>(e.sortText||e.label).localeCompare(A.sortText||A.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,A)=>e&&A,closeOnBlur:(e,A)=>e&&A,icons:(e,A)=>e&&A,tooltipClass:(e,A)=>t=>JP(e(t),A(t)),optionClass:(e,A)=>t=>JP(e(t),A(t)),addToOptions:(e,A)=>e.concat(A),filterStrict:(e,A)=>e||A})}});function JP(i,e){return i?e?i+" "+e:i:e}function v1A(i,e,A,t,n,o){let a=i.textDirection==Lo.RTL,r=a,s=!1,l="top",g,C,d=e.left-n.left,B=n.right-e.right,u=t.right-t.left,E=t.bottom-t.top;if(r&&d=E||v>e.top?g=A.bottom-e.top:(l="bottom",g=e.bottom-A.top)}let f=(e.bottom-e.top)/o.offsetHeight,m=(e.right-e.left)/o.offsetWidth;return{style:`${l}: ${g/f}px; max-width: ${C/m}px`,class:"cm-completionInfo-"+(s?a?"left-narrow":"right-narrow":r?"left":"right")}}var Uk=ln.define();function b1A(i){let e=i.addToOptions.slice();return i.icons&&e.push({render(A){let t=document.createElement("div");return t.classList.add("cm-completionIcon"),A.type&&t.classList.add(...A.type.split(/\s+/g).map(n=>"cm-completionIcon-"+n)),t.setAttribute("aria-hidden","true"),t},position:20}),e.push({render(A,t,n,o){let a=document.createElement("span");a.className="cm-completionLabel";let r=A.displayLabel||A.label,s=0;for(let l=0;ls&&a.appendChild(document.createTextNode(r.slice(s,g)));let d=a.appendChild(document.createElement("span"));d.appendChild(document.createTextNode(r.slice(g,C))),d.className="cm-completionMatchedText",s=C}return sA.position-t.position).map(A=>A.render)}function kk(i,e,A){if(i<=A)return{from:0,to:i};if(e<0&&(e=0),e<=i>>1){let n=Math.floor(e/A);return{from:n*A,to:(n+1)*A}}let t=Math.floor((i-e)/A);return{from:i-(t+1)*A,to:i-t*A}}var Fk=class{constructor(e,A,t){this.view=e,this.stateField=A,this.applyCompletion=t,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:s=>this.placeInfo(s),key:this},this.space=null,this.currentClass="";let n=e.state.field(A),{options:o,selected:a}=n.open,r=e.state.facet(Ur);this.optionContent=b1A(r),this.optionClass=r.optionClass,this.tooltipClass=r.tooltipClass,this.range=kk(o.length,a,r.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",s=>{let{options:l}=e.state.field(A).open;for(let g=s.target,C;g&&g!=this.dom;g=g.parentNode)if(g.nodeName=="LI"&&(C=/-(\d+)$/.exec(g.id))&&+C[1]this.list.lastChild.getBoundingClientRect().bottom?this.range.to:null;g!=null&&(e.dispatch({effects:Uk.of(g)}),s.preventDefault())}}),this.dom.addEventListener("focusout",s=>{let l=e.state.field(this.stateField,!1);l&&l.tooltip&&e.state.facet(Ur).closeOnBlur&&s.relatedTarget!=e.contentDOM&&e.dispatch({effects:x4.of(null)})}),this.showOptions(o,n.id)}mount(){this.updateSel()}showOptions(e,A){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,A,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var A;let t=e.state.field(this.stateField),n=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),t!=n){let{options:o,selected:a,disabled:r}=t.open;(!n.open||n.open.options!=o)&&(this.range=kk(o.length,a,e.state.facet(Ur).maxRenderedOptions),this.showOptions(o,t.id)),this.updateSel(),r!=((A=n.open)===null||A===void 0?void 0:A.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!r)}}updateTooltipClass(e){let A=this.tooltipClass(e);if(A!=this.currentClass){for(let t of this.currentClass.split(" "))t&&this.dom.classList.remove(t);for(let t of A.split(" "))t&&this.dom.classList.add(t);this.currentClass=A}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),A=e.open;(A.selected>-1&&A.selected=this.range.to)&&(this.range=kk(A.options.length,A.selected,this.view.state.facet(Ur).maxRenderedOptions),this.showOptions(A.options,e.id));let t=this.updateSelectedOption(A.selected);if(t){this.destroyInfo();let{completion:n}=A.options[A.selected],{info:o}=n;if(!o)return;let a=typeof o=="string"?document.createTextNode(o):o(n);if(!a)return;"then"in a?a.then(r=>{r&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(r,n)}).catch(r=>Gr(this.view.state,r,"completion info")):(this.addInfoPane(a,n),t.setAttribute("aria-describedby",this.info.id))}}addInfoPane(e,A){this.destroyInfo();let t=this.info=document.createElement("div");if(t.className="cm-tooltip cm-completionInfo",t.id="cm-completionInfo-"+Math.floor(Math.random()*65535).toString(16),e.nodeType!=null)t.appendChild(e),this.infoDestroy=null;else{let{dom:n,destroy:o}=e;t.appendChild(n),this.infoDestroy=o||null}this.dom.appendChild(t),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let A=null;for(let t=this.list.firstChild,n=this.range.from;t;t=t.nextSibling,n++)t.nodeName!="LI"||!t.id?n--:n==e?t.hasAttribute("aria-selected")||(t.setAttribute("aria-selected","true"),A=t):t.hasAttribute("aria-selected")&&(t.removeAttribute("aria-selected"),t.removeAttribute("aria-describedby"));return A&&S1A(this.list,A),A}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let A=this.dom.getBoundingClientRect(),t=this.info.getBoundingClientRect(),n=e.getBoundingClientRect(),o=this.space;if(!o){let a=this.dom.ownerDocument.documentElement;o={left:0,top:0,right:a.clientWidth,bottom:a.clientHeight}}return n.top>Math.min(o.bottom,A.bottom)-10||n.bottom{a.target==n&&a.preventDefault()});let o=null;for(let a=t.from;at.from||t.from==0))if(o=d,typeof l!="string"&&l.header)n.appendChild(l.header(l));else{let B=n.appendChild(document.createElement("completion-section"));B.textContent=d}}let g=n.appendChild(document.createElement("li"));g.id=A+"-"+a,g.setAttribute("role","option");let C=this.optionClass(r);C&&(g.className=C);for(let d of this.optionContent){let B=d(r,this.view.state,this.view,s);B&&g.appendChild(B)}}return t.from&&n.classList.add("cm-completionListIncompleteTop"),t.tonew Fk(A,i,e)}function S1A(i,e){let A=i.getBoundingClientRect(),t=e.getBoundingClientRect(),n=A.height/i.offsetHeight;t.topA.bottom&&(i.scrollTop+=(t.bottom-A.bottom)/n)}function YP(i){return(i.boost||0)*100+(i.apply?10:0)+(i.info?5:0)+(i.type?1:0)}function k1A(i,e){let A=[],t=null,n=null,o=g=>{A.push(g);let{section:C}=g.completion;if(C){t||(t=[]);let d=typeof C=="string"?C:C.name;t.some(B=>B.name==d)||t.push(typeof C=="string"?{name:d}:C)}},a=e.facet(Ur);for(let g of i)if(g.hasResult()){let C=g.result.getMatch;if(g.result.filter===!1)for(let d of g.result.options)o(new sw(d,g.source,C?C(d):[],1e9-A.length));else{let d=e.sliceDoc(g.from,g.to),B,u=a.filterStrict?new Nk(d):new Rk(d);for(let E of g.result.options)if(B=u.match(E.label)){let f=E.displayLabel?C?C(E,B.matched):[]:B.matched,m=B.score+(E.boost||0);if(o(new sw(E,g.source,f,m)),typeof E.section=="object"&&E.section.rank==="dynamic"){let{name:v}=E.section;n||(n=Object.create(null)),n[v]=Math.max(m,n[v]||-1e9)}}}}if(t){let g=Object.create(null),C=0,d=(B,u)=>(B.rank==="dynamic"&&u.rank==="dynamic"?n[u.name]-n[B.name]:0)||(typeof B.rank=="number"?B.rank:1e9)-(typeof u.rank=="number"?u.rank:1e9)||(B.named.score-C.score||l(C.completion,d.completion))){let C=g.completion;!s||s.label!=C.label||s.detail!=C.detail||s.type!=null&&C.type!=null&&s.type!=C.type||s.apply!=C.apply||s.boost!=C.boost?r.push(g):YP(g.completion)>YP(s)&&(r[r.length-1]=g),s=g.completion}return r}var Lk=class i{constructor(e,A,t,n,o,a){this.options=e,this.attrs=A,this.tooltip=t,this.timestamp=n,this.selected=o,this.disabled=a}setSelected(e,A){return e==this.selected||e>=this.options.length?this:new i(this.options,HP(A,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,A,t,n,o,a){if(n&&!a&&e.some(l=>l.isPending))return n.setDisabled();let r=k1A(e,A);if(!r.length)return n&&e.some(l=>l.isPending)?n.setDisabled():null;let s=A.facet(Ur).selectOnOpen?0:-1;if(n&&n.selected!=s&&n.selected!=-1){let l=n.options[n.selected].completion;for(let g=0;gg.hasResult()?Math.min(l,g.from):l,1e8),create:L1A,above:o.aboveCursor},n?n.timestamp:Date.now(),s,!1)}map(e){return new i(this.options,this.attrs,$A(P({},this.tooltip),{pos:e.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}setDisabled(){return new i(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}},Gk=class i{constructor(e,A,t){this.active=e,this.id=A,this.open=t}static start(){return new i(N1A,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:A}=e,t=A.facet(Ur),o=(t.override||A.languageDataAt("autocomplete",Gd(A)).map(D1A)).map(s=>(this.active.find(g=>g.source==s)||new dC(s,this.active.some(g=>g.state!=0)?1:0)).update(e,t));o.length==this.active.length&&o.every((s,l)=>s==this.active[l])&&(o=this.active);let a=this.open,r=e.effects.some(s=>s.is(Tk));a&&e.docChanged&&(a=a.map(e.changes)),e.selection||o.some(s=>s.hasResult()&&e.changes.touchesRange(s.from,s.to))||!_1A(o,this.active)||r?a=Lk.build(o,A,this.id,a,t,r):a&&a.disabled&&!o.some(s=>s.isPending)&&(a=null),!a&&o.every(s=>!s.isPending)&&o.some(s=>s.hasResult())&&(o=o.map(s=>s.hasResult()?new dC(s.source,0):s));for(let s of e.effects)s.is(Uk)&&(a=a&&a.setSelected(s.value,this.id));return o==this.active&&a==this.open?this:new i(o,this.id,a)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?x1A:R1A}};function _1A(i,e){if(i==e)return!0;for(let A=0,t=0;;){for(;A-1&&(A["aria-activedescendant"]=i+"-"+e),A}var N1A=[];function qP(i,e){if(i.isUserEvent("input.complete")){let t=i.annotation(VP);if(t&&e.activateOnCompletion(t))return 12}let A=i.isUserEvent("input.type");return A&&e.activateOnTyping?5:A?1:i.isUserEvent("delete.backward")?2:i.selection?8:i.docChanged?16:0}var dC=class i{constructor(e,A,t=!1){this.source=e,this.state=A,this.explicit=t}hasResult(){return!1}get isPending(){return this.state==1}update(e,A){let t=qP(e,A),n=this;(t&8||t&16&&this.touches(e))&&(n=new i(n.source,0)),t&4&&n.state==0&&(n=new i(this.source,1)),n=n.updateFor(e,t);for(let o of e.effects)if(o.is(lw))n=new i(n.source,1,o.value);else if(o.is(x4))n=new i(n.source,0);else if(o.is(Tk))for(let a of o.value)a.source==n.source&&(n=a);return n}updateFor(e,A){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(Gd(e.state))}},gw=class i extends dC{constructor(e,A,t,n,o,a){super(e,3,A),this.limit=t,this.result=n,this.from=o,this.to=a}hasResult(){return!0}updateFor(e,A){var t;if(!(A&3))return this.map(e.changes);let n=this.result;n.map&&!e.changes.empty&&(n=n.map(n,e.changes));let o=e.changes.mapPos(this.from),a=e.changes.mapPos(this.to,1),r=Gd(e.state);if(r>a||!n||A&2&&(Gd(e.startState)==this.from||rA.map(e))}}),dl=La.define({create(){return Gk.start()},update(i,e){return i.update(e)},provide:i=>[ch.from(i,e=>e.tooltip),ui.contentAttributes.from(i,e=>e.attrs)]});function Ok(i,e){let A=e.completion.apply||e.completion.label,t=i.state.field(dl).active.find(n=>n.source==e.source);return t instanceof gw?(typeof A=="string"?i.dispatch($A(P({},y1A(i.state,A,t.from,t.to)),{annotations:VP.of(e.completion)})):A(i,e.completion,t.from,t.to),!0):!1}var L1A=M1A(dl,Ok);function aw(i,e="option"){return A=>{let t=A.state.field(dl,!1);if(!t||!t.open||t.open.disabled||Date.now()-t.open.timestamp-1?t.open.selected+n*(i?1:-1):i?0:a-1;return r<0?r=e=="page"?0:a-1:r>=a&&(r=e=="page"?a-1:0),A.dispatch({effects:Uk.of(r)}),!0}}var G1A=i=>{let e=i.state.field(dl,!1);return i.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampi.state.field(dl,!1)?(i.dispatch({effects:lw.of(!0)}),!0):!1,K1A=i=>{let e=i.state.field(dl,!1);return!e||!e.active.some(A=>A.state!=0)?!1:(i.dispatch({effects:x4.of(null)}),!0)},Kk=class{constructor(e,A){this.active=e,this.context=A,this.time=Date.now(),this.updates=[],this.done=void 0}},U1A=50,T1A=1e3,O1A=Po.fromClass(class{constructor(i){this.view=i,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of i.state.field(dl).active)e.isPending&&this.startQuery(e)}update(i){let e=i.state.field(dl),A=i.state.facet(Ur);if(!i.selectionSet&&!i.docChanged&&i.startState.field(dl)==e)return;let t=i.transactions.some(o=>{let a=qP(o,A);return a&8||(o.selection||o.docChanged)&&!(a&3)});for(let o=0;oU1A&&Date.now()-a.time>T1A){for(let r of a.context.abortListeners)try{r()}catch(s){Gr(this.view.state,s)}a.context.abortListeners=null,this.running.splice(o--,1)}else a.updates.push(...i.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),i.transactions.some(o=>o.effects.some(a=>a.is(lw)))&&(this.pendingStart=!0);let n=this.pendingStart?50:A.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(o=>o.isPending&&!this.running.some(a=>a.active.source==o.source))?setTimeout(()=>this.startUpdate(),n):-1,this.composing!=0)for(let o of i.transactions)o.isUserEvent("input.type")?this.composing=2:this.composing==2&&o.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:i}=this.view,e=i.field(dl);for(let A of e.active)A.isPending&&!this.running.some(t=>t.active.source==A.source)&&this.startQuery(A);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(Ur).updateSyncTime))}startQuery(i){let{state:e}=this.view,A=Gd(e),t=new rw(e,A,i.explicit,this.view),n=new Kk(i,t);this.running.push(n),Promise.resolve(i.source(t)).then(o=>{n.context.aborted||(n.done=o||null,this.scheduleAccept())},o=>{this.view.dispatch({effects:x4.of(null)}),Gr(this.view.state,o)})}scheduleAccept(){this.running.every(i=>i.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(Ur).updateSyncTime))}accept(){var i;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],A=this.view.state.facet(Ur),t=this.view.state.field(dl);for(let n=0;nr.source==o.active.source);if(a&&a.isPending)if(o.done==null){let r=new dC(o.active.source,0);for(let s of o.updates)r=r.update(s,A);r.isPending||e.push(r)}else this.startQuery(a)}(e.length||t.open&&t.open.disabled)&&this.view.dispatch({effects:Tk.of(e)})}},{eventHandlers:{blur(i){let e=this.view.state.field(dl,!1);if(e&&e.tooltip&&this.view.state.facet(Ur).closeOnBlur){let A=e.open&&wS(this.view,e.open.tooltip);(!A||!A.dom.contains(i.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:x4.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:lw.of(!1)}),20),this.composing=0}}}),J1A=typeof navigator=="object"&&/Win/.test(navigator.platform),Y1A=oc.highest(ui.domEventHandlers({keydown(i,e){let A=e.state.field(dl,!1);if(!A||!A.open||A.open.disabled||A.open.selected<0||i.key.length>1||i.ctrlKey&&!(J1A&&i.altKey)||i.metaKey)return!1;let t=A.open.options[A.open.selected],n=A.active.find(a=>a.source==t.source),o=t.completion.commitCharacters||n.result.commitCharacters;return o&&o.indexOf(i.key)>-1&&Ok(e,t),!1}})),H1A=ui.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"\xB7\xB7\xB7"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'\u0192'"}},".cm-completionIcon-class":{"&:after":{content:"'\u25CB'"}},".cm-completionIcon-interface":{"&:after":{content:"'\u25CC'"}},".cm-completionIcon-variable":{"&:after":{content:"'\u{1D465}'"}},".cm-completionIcon-constant":{"&:after":{content:"'\u{1D436}'"}},".cm-completionIcon-type":{"&:after":{content:"'\u{1D461}'"}},".cm-completionIcon-enum":{"&:after":{content:"'\u222A'"}},".cm-completionIcon-property":{"&:after":{content:"'\u25A1'"}},".cm-completionIcon-keyword":{"&:after":{content:"'\u{1F511}\uFE0E'"}},".cm-completionIcon-namespace":{"&:after":{content:"'\u25A2'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});var R4={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},Ld=ln.define({map(i,e){let A=e.mapPos(i,-1,Wr.TrackAfter);return A??void 0}}),Jk=new class extends cg{};Jk.startSide=1;Jk.endSide=-1;var WP=La.define({create(){return uo.empty},update(i,e){if(i=i.map(e.changes),e.selection){let A=e.state.doc.lineAt(e.selection.main.head);i=i.update({filter:t=>t>=A.from&&t<=A.to})}for(let A of e.effects)A.is(Ld)&&(i=i.update({add:[Jk.range(A.value,A.value+1)]}));return i}});function ZP(){return[P1A,WP]}var xk="()[]{}<>\xAB\xBB\xBB\xAB\uFF3B\uFF3D\uFF5B\uFF5D";function XP(i){for(let e=0;e{if((z1A?i.composing:i.compositionStarted)||i.state.readOnly)return!1;let n=i.state.selection.main;if(t.length>2||t.length==2&&Rl($r(t,0))==1||e!=n.from||A!=n.to)return!1;let o=V1A(i.state,t);return o?(i.dispatch(o),!0):!1}),j1A=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let t=$P(i,i.selection.main.head).brackets||R4.brackets,n=null,o=i.changeByRange(a=>{if(a.empty){let r=q1A(i.doc,a.head);for(let s of t)if(s==r&&cw(i.doc,a.head)==XP($r(s,0)))return{changes:{from:a.head-s.length,to:a.head+s.length},range:Be.cursor(a.head-s.length)}}return{range:n=a}});return n||e(i.update(o,{scrollIntoView:!0,userEvent:"delete.backward"})),!n},Aj=[{key:"Backspace",run:j1A}];function V1A(i,e){let A=$P(i,i.selection.main.head),t=A.brackets||R4.brackets;for(let n of t){let o=XP($r(n,0));if(e==n)return o==n?X1A(i,n,t.indexOf(n+n+n)>-1,A):W1A(i,n,o,A.before||R4.before);if(e==o&&ej(i,i.selection.main.from))return Z1A(i,n,o)}return null}function ej(i,e){let A=!1;return i.field(WP).between(0,i.doc.length,t=>{t==e&&(A=!0)}),A}function cw(i,e){let A=i.sliceString(e,e+2);return A.slice(0,Rl($r(A,0)))}function q1A(i,e){let A=i.sliceString(e-2,e);return Rl($r(A,0))==A.length?A:A.slice(1)}function W1A(i,e,A,t){let n=null,o=i.changeByRange(a=>{if(!a.empty)return{changes:[{insert:e,from:a.from},{insert:A,from:a.to}],effects:Ld.of(a.to+e.length),range:Be.range(a.anchor+e.length,a.head+e.length)};let r=cw(i.doc,a.head);return!r||/\s/.test(r)||t.indexOf(r)>-1?{changes:{insert:e+A,from:a.head},effects:Ld.of(a.head+e.length),range:Be.cursor(a.head+e.length)}:{range:n=a}});return n?null:i.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function Z1A(i,e,A){let t=null,n=i.changeByRange(o=>o.empty&&cw(i.doc,o.head)==A?{changes:{from:o.head,to:o.head+A.length,insert:A},range:Be.cursor(o.head+A.length)}:t={range:o});return t?null:i.update(n,{scrollIntoView:!0,userEvent:"input.type"})}function X1A(i,e,A,t){let n=t.stringPrefixes||R4.stringPrefixes,o=null,a=i.changeByRange(r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:e,from:r.to}],effects:Ld.of(r.to+e.length),range:Be.range(r.anchor+e.length,r.head+e.length)};let s=r.head,l=cw(i.doc,s),g;if(l==e){if(zP(i,s))return{changes:{insert:e+e,from:s},effects:Ld.of(s+e.length),range:Be.cursor(s+e.length)};if(ej(i,s)){let d=A&&i.sliceDoc(s,s+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:s,to:s+d.length,insert:d},range:Be.cursor(s+d.length)}}}else{if(A&&i.sliceDoc(s-2*e.length,s)==e+e&&(g=PP(i,s-2*e.length,n))>-1&&zP(i,g))return{changes:{insert:e+e+e+e,from:s},effects:Ld.of(s+e.length),range:Be.cursor(s+e.length)};if(i.charCategorizer(s)(l)!=$o.Word&&PP(i,s,n)>-1&&!$1A(i,s,e,n))return{changes:{insert:e+e,from:s},effects:Ld.of(s+e.length),range:Be.cursor(s+e.length)}}return{range:o=r}});return o?null:i.update(a,{scrollIntoView:!0,userEvent:"input.type"})}function zP(i,e){let A=Kr(i).resolveInner(e+1);return A.parent&&A.from==e}function $1A(i,e,A,t){let n=Kr(i).resolveInner(e,-1),o=t.reduce((a,r)=>Math.max(a,r.length),0);for(let a=0;a<5;a++){let r=i.sliceDoc(n.from,Math.min(n.to,n.from+A.length+o)),s=r.indexOf(A);if(!s||s>-1&&t.indexOf(r.slice(0,s))>-1){let g=n.firstChild;for(;g&&g.from==n.from&&g.to-g.from>A.length+s;){if(i.sliceDoc(g.to-A.length,g.to)==A)return!1;g=g.firstChild}return!0}let l=n.to==e&&n.parent;if(!l)break;n=l}return!1}function PP(i,e,A){let t=i.charCategorizer(e);if(t(i.sliceDoc(e-1,e))!=$o.Word)return e;for(let n of A){let o=e-n.length;if(i.sliceDoc(o,e)==n&&t(i.sliceDoc(o-1,o))!=$o.Word)return o}return-1}function tj(i={}){return[Y1A,dl,Ur.of(i),O1A,AdA,H1A]}var Yk=[{key:"Ctrl-Space",run:_k},{mac:"Alt-`",run:_k},{mac:"Alt-i",run:_k},{key:"Escape",run:K1A},{key:"ArrowDown",run:aw(!0)},{key:"ArrowUp",run:aw(!1)},{key:"PageDown",run:aw(!0,"page")},{key:"PageUp",run:aw(!1,"page")},{key:"Enter",run:G1A}],AdA=oc.highest(gh.computeN([Ur],i=>i.facet(Ur).defaultKeymap?[Yk]:[]));function edA(i,e=i.state){let A=new Set;for(let{from:t,to:n}of i.visibleRanges){let o=t;for(;o<=n;){let a=e.doc.lineAt(o);A.has(a)||A.add(a),o=a.to+1}}return A}function Hk(i){let e=i.selection.main.head;return i.doc.lineAt(e)}function ij(i,e){let A=0;A:for(let t=0;t=o.level&&this.markerType!=="codeOnly"?this.set(e,0,n.level):n.empty&&n.level===0&&o.level!==0?this.set(e,0,0):o.level>n.level?this.set(e,0,n.level+1):this.set(e,0,o.level)}let A=ij(e.text,this.state.tabSize),t=Math.floor(A/this.unitWidth);return this.set(e,A,t)}closestNonEmpty(e,A){let t=e.number+A;for(;A===-1?t>=1:t<=this.state.doc.lines;){if(this.has(t)){let a=this.get(t);if(!a.empty)return a}let o=this.state.doc.line(t);if(o.text.trim().length){let a=ij(o.text,this.state.tabSize),r=Math.floor(a/this.unitWidth);return this.set(o,a,r)}t+=A}let n=this.state.doc.line(A===-1?1:this.state.doc.lines);return this.set(n,0,0)}findAndSetActiveLines(){let e=Hk(this.state);if(!this.has(e))return;let A=this.get(e);if(this.has(A.line.number+1)){let o=this.get(A.line.number+1);o.level>A.level&&(A=o)}if(this.has(A.line.number-1)){let o=this.get(A.line.number-1);o.level>A.level&&(A=o)}if(A.level===0)return;A.active=A.level;let t,n;for(t=A.line.number;t>1;t--){if(!this.has(t-1))continue;let o=this.get(t-1);if(o.level0&&s.push(Cw("--indent-marker-bg-color",t,e,r,l)),s.push(Cw("--indent-marker-active-bg-color",n,e,a-1,1)),a!==o&&s.push(Cw("--indent-marker-bg-color",t,e,a,o-a))}else s.push(Cw("--indent-marker-bg-color",t,e,r,o-r));return s.join(",")}var Pk=class{constructor(e){this.view=e,this.unitWidth=Cc(e.state),this.currentLineNumber=Hk(e.state).number,this.generate(e.state)}update(e){let A=Cc(e.state),t=A!==this.unitWidth;t&&(this.unitWidth=A);let n=Hk(e.state).number,o=n!==this.currentLineNumber;this.currentLineNumber=n;let a=e.state.facet(dw).highlightActiveBlock&&o;(e.docChanged||e.viewportChanged||t||a)&&this.generate(e.state)}generate(e){let A=new Xr,t=edA(this.view,e),{hideFirstIndent:n,markerType:o,thickness:a,activeThickness:r}=e.facet(dw),s=new zk(t,e,this.unitWidth,o);for(let l of t){let g=s.get(l.number);if(!g?.level)continue;let C=idA(g,this.unitWidth,n,a,r);A.add(l.from,l.from,Lt.line({class:"cm-indent-markers",attributes:{style:`--indent-markers: ${C}`}}))}this.decorations=A.finish()}};function nj(i={}){return[dw.of(i),tdA(i.colors),Po.fromClass(Pk,{decorations:e=>e.decorations})]}var ndA=["mainAxis","crossAxis","fallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment"],odA=["mainAxis","crossAxis","limiter"];function mV(i,e){if(i==null)return{};var A,t,n=(function(a,r){if(a==null)return{};var s={};for(var l in a)if({}.hasOwnProperty.call(a,l)){if(r.indexOf(l)!==-1)continue;s[l]=a[l]}return s})(i,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(i);for(t=0;t{};function ddA(i){return i()}function f_(i){for(var e=0;e{i=A,e=t}),resolve:i,reject:e}}var IdA=1<<24,oE=16,s5=32,MV=64,tx=128,fc=512,ts=1024,mc=2048,_C=4096,w0=8192,aE=16384,ix=32768,Zd=65536,BdA=1<<17,SV=1<<18,kV=1<<19,hC=1<<25,Ow=32768,m_=1<<21,$2=1<<23,y0=Symbol("$state"),_V=Symbol("legacy props"),hdA=Symbol(""),Rh=new class extends Error{constructor(){super(...arguments),u0(this,"name","StaleReactionError"),u0(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};function sp(i){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function xV(i){return i===this.v}function RV(i,e){return i!=i?e==e:i!==e||i!==null&&typeof i=="object"||typeof i=="function"}function NV(i){return!RV(i,this.v)}var Mo=null;function Ph(i){Mo=i}function s1(i){return FV().get(i)}function Jt(i){Mo={p:Mo,i:!1,c:null,e:null,s:i,x:null,l:nE&&!(arguments.length>1&&arguments[1]!==void 0&&arguments[1])?{s:null,u:null,$:[]}:null}}function Yt(i){var e=Mo,A=e.e;if(A!==null)for(var t of(e.e=null,A))XV(t);return i!==void 0&&(e.x=i),e.i=!0,Mo=e.p,i??{}}function rE(){return!nE||Mo!==null&&Mo.l===null}function FV(i){var e,A;return Mo===null&&sp(),(A=(e=Mo).c)!==null&&A!==void 0?A:e.c=new Map((function(t){for(var n=t.p;n!==null;){var o=n.c;if(o!==null)return o;n=n.p}return null})(Mo)||void 0)}var zd=[];function LV(){var i=zd;zd=[],f_(i)}function Xd(i){if(zd.length===0&&!z4){var e=zd;queueMicrotask(()=>{e===zd&&LV()})}zd.push(i)}function EdA(){for(;zd.length>0;)LV()}function GV(i){var e=co;if(e===null)return go.f|=$2,i;if((e.f&ix)===0){if((e.f&tx)===0)throw i;e.b.error(i)}else jh(i,e)}function jh(i,e){for(;e!==null;){if((e.f&tx)!==0)try{return void e.b.error(i)}catch(A){i=A}e=e.parent}throw i}var Rw=new Set,ea=null,H4=null,mg=null,fg=[],l5=null,w_=!1,z4=!1,Jw=new WeakMap,Iw=new WeakMap,Od=new WeakMap,Jd=new WeakMap,Bw=new WeakMap,Nw=new WeakMap,Fw=new WeakMap,Ul=new WeakSet,$d=class i{constructor(){wV(this,Ul),u0(this,"committed",!1),u0(this,"current",new Map),u0(this,"previous",new Map),Go(this,Jw,new Set),Go(this,Iw,new Set),Go(this,Od,0),Go(this,Jd,0),Go(this,Bw,null),Go(this,Nw,[]),Go(this,Fw,[]),u0(this,"skipped_effects",new Set),u0(this,"is_fork",!1)}is_deferred(){return this.is_fork||xe(Jd,this)>0}process(e){fg=[],H4=null,this.apply();var A,t={parent:null,effect:null,effects:[],render_effects:[],block_effects:[]};for(var n of e)or(Ul,this,KV).call(this,n,t);this.is_fork||or(Ul,this,QdA).call(this),this.is_deferred()?(or(Ul,this,Uh).call(this,t.effects),or(Ul,this,Uh).call(this,t.render_effects),or(Ul,this,Uh).call(this,t.block_effects)):(H4=this,ea=null,gj(t.render_effects),gj(t.effects),H4=null,(A=xe(Bw,this))===null||A===void 0||A.resolve()),mg=null}capture(e,A){var t;this.previous.has(e)||this.previous.set(e,A),(e.f&$2)===0&&(this.current.set(e,e.v),(t=mg)===null||t===void 0||t.set(e,e.v))}activate(){ea=this,this.apply()}deactivate(){ea===this&&(ea=null,mg=null)}flush(){if(this.activate(),fg.length>0){if(TV(),ea!==null&&ea!==this)return}else xe(Od,this)===0&&this.process([]);this.deactivate()}discard(){for(var e of xe(Iw,this))e(this);xe(Iw,this).clear()}increment(e){vn(Od,this,xe(Od,this)+1),e&&vn(Jd,this,xe(Jd,this)+1)}decrement(e){vn(Od,this,xe(Od,this)-1),e&&vn(Jd,this,xe(Jd,this)-1),this.revive()}revive(){for(var e of xe(Nw,this))ns(e,mc),AI(e);for(var A of xe(Fw,this))ns(A,_C),AI(A);vn(Nw,this,[]),vn(Fw,this,[]),this.flush()}oncommit(e){xe(Jw,this).add(e)}ondiscard(e){xe(Iw,this).add(e)}settled(){var e;return((e=xe(Bw,this))!==null&&e!==void 0?e:vn(Bw,this,bV())).promise}static ensure(){if(ea===null){var e=ea=new i;Rw.add(ea),z4||i.enqueue(()=>{ea===e&&e.flush()})}return ea}static enqueue(e){Xd(e)}apply(){}};function KV(i,e){i.f^=ts;for(var A=i.first;A!==null;){var t,n=A.f,o=!!(96&n),a=o&&(n&ts)!==0||(n&w0)!==0||this.skipped_effects.has(A);if((A.f&tx)!==0&&(t=A.b)!==null&&t!==void 0&&t.is_pending()&&(e={parent:e,effect:A,effects:[],render_effects:[],block_effects:[]}),!a&&A.fn!==null){o?A.f^=ts:4&n?e.effects.push(A):gE(A)&&((A.f&oE)!==0&&e.block_effects.push(A),Wh(A));var r=A.first;if(r!==null){A=r;continue}}var s=A.parent;for(A=A.next;A===null&&s!==null;)s===e.effect&&(or(Ul,this,Uh).call(this,e.effects),or(Ul,this,Uh).call(this,e.render_effects),or(Ul,this,Uh).call(this,e.block_effects),e=e.parent),A=s.next,s=s.parent}}function Uh(i){for(var e of i)((e.f&mc)!==0?xe(Nw,this):xe(Fw,this)).push(e),or(Ul,this,UV).call(this,e.deps),ns(e,ts)}function UV(i){if(i!==null)for(var e of i)2&e.f&&(e.f&Ow)!==0&&(e.f^=Ow,or(Ul,this,UV).call(this,e.deps))}function QdA(){if(xe(Jd,this)===0){for(var i of xe(Jw,this))i();xe(Jw,this).clear()}xe(Od,this)===0&&or(Ul,this,udA).call(this)}function udA(){if(Rw.size>1){this.previous.clear();var i=mg,e=!0,A={parent:null,effect:null,effects:[],render_effects:[],block_effects:[]};for(var t of Rw)if(t!==this){var n=[];for(var[o,a]of this.current){if(t.current.has(o)){if(!e||a===t.current.get(o))continue;t.current.set(o,a)}n.push(o)}if(n.length!==0){var r=[...t.current.keys()].filter(B=>!this.current.has(B));if(r.length>0){var s=fg;fg=[];var l=new Set,g=new Map;for(var C of n)OV(C,r,l,g);if(fg.length>0){for(var d of(ea=t,t.apply(),fg))or(Ul,t,KV).call(t,d,A);t.deactivate()}fg=s}}}else e=!1;ea=null,mg=i}this.committed=!0,Rw.delete(this)}function jo(i){var e=z4;z4=!0;try{for(;;){var A;if(EdA(),fg.length===0&&((A=ea)===null||A===void 0||A.flush(),fg.length===0))return void(l5=null);TV()}}finally{z4=e}}function TV(){var i=jd;w_=!0;try{var e=0;for(Yw(!0);fg.length>0;){var A=$d.ensure();e++>1e3&&pdA(),A.process(fg),A1.clear()}}finally{w_=!1,Yw(i),l5=null}}function pdA(){try{(function(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")})()}catch(i){jh(i,l5)}}var QC=null;function gj(i){var e=i.length;if(e!==0){for(var A=0;A0)){for(var o of(A1.clear(),QC))if(!(24576&o.f)){for(var a=[o],r=o.parent;r!==null;)QC.has(r)&&(QC.delete(r),a.push(r)),r=r.parent;for(var s=a.length-1;s>=0;s--){var l=a[s];24576&l.f||Wh(l)}}QC.clear()}}QC=null}}function OV(i,e,A,t){if(!A.has(i)&&(A.add(i),i.reactions!==null))for(var n of i.reactions){var o=n.f;2&o?OV(n,e,A,t):4194320&o&&(o&mc)===0&&JV(n,e,t)&&(ns(n,mc),AI(n))}}function JV(i,e,A){var t=A.get(i);if(t!==void 0)return t;if(i.deps!==null)for(var n of i.deps){if(e.includes(n))return!0;if(2&n.f&&JV(n,e,A))return A.set(n,!0),!0}return A.set(i,!1),!1}function AI(i){for(var e=l5=i;e.parent!==null;){var A=(e=e.parent).f;if(w_&&e===co&&(A&oE)!==0&&(A&SV)===0)return;if(96&A){if((A&ts)===0)return;e.f^=ts}}fg.push(e)}var H2=new WeakMap,q2=new WeakMap,fdA=new WeakMap,Yd=new WeakMap,qk=new WeakMap,V2=new WeakMap,z2=new WeakMap,fC=new WeakMap,U2=new WeakMap,Pd=new WeakMap,Th=new WeakMap,mh=new WeakMap,Oh=new WeakMap,F4=new WeakMap,wh=new WeakMap,cj=new WeakMap,O2=new WeakSet,y_=class{constructor(e,A,t){var n,o,a,r;wV(this,O2),u0(this,"parent",void 0),Go(this,H2,!1),Go(this,q2,void 0),Go(this,fdA,null),Go(this,Yd,void 0),Go(this,qk,void 0),Go(this,V2,void 0),Go(this,z2,null),Go(this,fC,null),Go(this,U2,null),Go(this,Pd,null),Go(this,Th,null),Go(this,mh,0),Go(this,Oh,0),Go(this,F4,!1),Go(this,wh,null),Go(this,cj,(n=()=>(vn(wh,this,xC(xe(mh,this))),()=>{vn(wh,this,null)}),a=0,r=xC(0),()=>{j4()&&(c(r),sE(()=>(a===0&&(o=uA(()=>n(()=>P4(r)))),a+=1,()=>{Xd(()=>{var s;(a-=1)==0&&((s=o)===null||s===void 0||s(),o=void 0,P4(r))})})))})),vn(q2,this,e),vn(Yd,this,A),vn(qk,this,t),this.parent=co.b,vn(H2,this,!!xe(Yd,this).pending),vn(V2,this,lE(()=>{co.b=this;var s=or(O2,this,mdA).call(this);try{vn(z2,this,D0(()=>t(s)))}catch(l){this.error(l)}return xe(Oh,this)>0?or(O2,this,dj).call(this):vn(H2,this,!1),()=>{var l;(l=xe(Th,this))===null||l===void 0||l.remove()}},589952))}is_pending(){return xe(H2,this)||!!this.parent&&this.parent.is_pending()}has_pending_snippet(){return!!xe(Yd,this).pending}update_pending_count(e){or(O2,this,YV).call(this,e),vn(mh,this,xe(mh,this)+e),xe(wh,this)&&Vh(xe(wh,this),xe(mh,this))}get_effect_pending(){return xe(cj,this).call(this),c(xe(wh,this))}error(e){var A=xe(Yd,this).onerror,t=xe(Yd,this).failed;if(xe(F4,this)||!A&&!t)throw e;xe(z2,this)&&(is(xe(z2,this)),vn(z2,this,null)),xe(fC,this)&&(is(xe(fC,this)),vn(fC,this,null)),xe(U2,this)&&(is(xe(U2,this)),vn(U2,this,null));var n=!1,o=!1,a=()=>{n?console.warn("https://svelte.dev/e/svelte_boundary_reset_noop"):(n=!0,o&&(function(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")})(),$d.ensure(),vn(mh,this,0),xe(U2,this)!==null&&qh(xe(U2,this),()=>{vn(U2,this,null)}),vn(H2,this,this.has_pending_snippet()),vn(z2,this,or(O2,this,Cj).call(this,()=>(vn(F4,this,!1),D0(()=>xe(qk,this).call(this,xe(q2,this)))))),xe(Oh,this)>0?or(O2,this,dj).call(this):vn(H2,this,!1))},r=go;try{Ql(null),o=!0,A?.(e,a),o=!1}catch(s){jh(s,xe(V2,this)&&xe(V2,this).parent)}finally{Ql(r)}t&&Xd(()=>{vn(U2,this,or(O2,this,Cj).call(this,()=>{$d.ensure(),vn(F4,this,!0);try{return D0(()=>{t(xe(q2,this),()=>e,()=>a)})}catch(s){return jh(s,xe(V2,this).parent),null}finally{vn(F4,this,!1)}}))})}};function mdA(){var i=xe(q2,this);return xe(H2,this)&&(vn(Th,this,e1()),xe(q2,this).before(xe(Th,this)),i=xe(Th,this)),i}function Cj(i){var e=co,A=go,t=Mo;yg(xe(V2,this)),Ql(xe(V2,this)),Ph(xe(V2,this).ctx);try{return i()}catch(n){return GV(n),null}finally{yg(e),Ql(A),Ph(t)}}function dj(){var i=xe(Yd,this).pending;xe(z2,this)!==null&&(vn(Pd,this,document.createDocumentFragment()),xe(Pd,this).append(xe(Th,this)),aq(xe(z2,this),xe(Pd,this))),xe(fC,this)===null&&vn(fC,this,D0(()=>i(xe(q2,this))))}function YV(i){var e;this.has_pending_snippet()?(vn(Oh,this,xe(Oh,this)+i),xe(Oh,this)===0&&(vn(H2,this,!1),xe(fC,this)&&qh(xe(fC,this),()=>{vn(fC,this,null)}),xe(Pd,this)&&(xe(q2,this).before(xe(Pd,this)),vn(Pd,this,null)))):this.parent&&or(O2,e=this.parent,YV).call(e,i)}function HV(i,e,A,t){var n=rE()?lp:lt;if(A.length!==0||i.length!==0){var o=ea,a=co,r=(function(){var l=co,g=go,C=Mo,d=ea;return function(){var B=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];yg(l),Ql(g),Ph(C),B&&d?.activate()}})();i.length>0?Promise.all(i).then(()=>{r();try{return s()}finally{o?.deactivate(),hw()}}):s()}else t(e.map(n));function s(){Promise.all(A.map(l=>(function(g){var C=co;C===null&&(function(){throw new Error("https://svelte.dev/e/async_derived_orphan")})();var d=C.b,B=void 0,u=xC(es),E=!go,f=new Map;return(function(m){yc(4718592,m,!0)})(()=>{var m=bV();B=m.promise;try{Promise.resolve(g()).then(m.resolve,m.reject).then(()=>{v===ea&&v.committed&&v.deactivate(),hw()})}catch(x){m.reject(x),hw()}var v=ea;if(E){var S,k=!d.is_pending();d.update_pending_count(1),v.increment(k),(S=f.get(v))===null||S===void 0||S.reject(Rh),f.delete(v),f.set(v,m)}var M=function(x){var F=arguments.length>1&&arguments[1]!==void 0?arguments[1]:void 0;if(v.activate(),F)F!==Rh&&(u.f|=$2,Vh(u,F));else for(var[z,j]of((u.f&$2)!==0&&(u.f^=$2),Vh(u,x),f)){if(f.delete(z),z===v)break;j.reject(Rh)}E&&(d.update_pending_count(-1),v.decrement(k))};m.promise.then(M,x=>M(null,x||"unknown"))}),c5(()=>{for(var m of f.values())m.reject(Rh)}),new Promise(m=>{function v(S){function k(){S===B?m(u):v(B)}S.then(k,k)}v(B)})})(l))).then(l=>{r();try{t([...e.map(n),...l])}catch(g){(a.f&aE)===0&&jh(g,a)}o?.deactivate(),hw()}).catch(l=>{jh(l,a)})}}function hw(){yg(null),Ql(null),Ph(null)}function lp(i){var e=go!==null&&2&go.f?go:null;return co!==null&&(co.f|=kV),{ctx:Mo,deps:null,effects:null,equals:xV,f:2050,fn:i,reactions:null,rv:0,v:es,wv:0,parent:e??co,ac:null}}function Bl(i){var e=lp(i);return rq(e),e}function lt(i){var e=lp(i);return e.equals=NV,e}function zV(i){var e=i.effects;if(e!==null){i.effects=null;for(var A=0;A1&&arguments[1]!==void 0&&arguments[1],n=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],o=xC(i);return t||(o.equals=NV),nE&&n&&Mo!==null&&Mo.l!==null&&((A=(e=Mo.l).s)!==null&&A!==void 0?A:e.s=[]).push(o),o}function Ol(i,e){return N(i,uA(()=>c(i))),e}function N(i,e){var A,t=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return go===null||f0&&(go.f&BdA)===0||!rE()||!(4325394&go.f)||(A=MC)!==null&&A!==void 0&&A.includes(i)||(function(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")})(),Vh(i,t?Nh(e):e)}function Vh(i,e){if(!i.equals(e)){var A=i.v;rI?A1.set(i,e):A1.set(i,A),i.v=e;var t=$d.ensure();t.capture(i,A),2&i.f&&((i.f&mc)!==0&&nx(i),ns(i,(i.f&fc)!==0?ts:_C)),i.wv=lq(),WV(i,mc),!rE()||co===null||(co.f&ts)===0||96&co.f||(Eg===null?(function(n){Eg=n})([i]):Eg.push(i)),!t.is_fork&&Wk.size>0&&!Ij&&(function(){Ij=!1;var n=jd;Yw(!0);var o=Array.from(Wk);try{for(var a of o)(a.f&ts)!==0&&ns(a,_C),gE(a)&&Wh(a)}finally{Yw(n)}Wk.clear()})()}return e}function Bj(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=c(i),t=e===1?A++:A--;return N(i,A),t}function P4(i){N(i,i.v+1)}function WV(i,e){var A=i.reactions;if(A!==null)for(var t=rE(),n=A.length,o=0;o{if(Vd===o)return r();var s=go,l=Vd;Ql(null),uj(o);var g=r();return Ql(s),uj(l),g};return t&&A.set("length",EC(i.length)),new Proxy(i,{defineProperty(r,s,l){"value"in l&&l.configurable!==!1&&l.enumerable!==!1&&l.writable!==!1||(function(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")})();var g=A.get(s);return g===void 0?g=a(()=>{var C=EC(l.value);return A.set(s,C),C}):N(g,l.value,!0),!0},deleteProperty(r,s){var l=A.get(s);if(l===void 0){if(s in r){var g=a(()=>EC(es));A.set(s,g),P4(n)}}else N(l,es),P4(n);return!0},get(r,s,l){var g;if(s===y0)return i;var C=A.get(s),d=s in r;if(C===void 0&&(!d||(g=vC(r,s))!==null&&g!==void 0&&g.writable)&&(C=a(()=>EC(Nh(d?r[s]:es))),A.set(s,C)),C!==void 0){var B=c(C);return B===es?void 0:B}return Reflect.get(r,s,l)},getOwnPropertyDescriptor(r,s){var l=Reflect.getOwnPropertyDescriptor(r,s);if(l&&"value"in l){var g=A.get(s);g&&(l.value=c(g))}else if(l===void 0){var C=A.get(s),d=C?.v;if(C!==void 0&&d!==es)return{enumerable:!0,configurable:!0,value:d,writable:!0}}return l},has(r,s){var l;if(s===y0)return!0;var g=A.get(s),C=g!==void 0&&g.v!==es||Reflect.has(r,s);return(g!==void 0||co!==null&&(!C||(l=vC(r,s))!==null&&l!==void 0&&l.writable))&&(g===void 0&&(g=a(()=>EC(C?Nh(r[s]):es)),A.set(s,g)),c(g)===es)?!1:C},set(r,s,l,g){var C,d=A.get(s),B=s in r;if(t&&s==="length")for(var u=l;uEC(es)),A.set(u+"",E))}d===void 0?(!B||(C=vC(r,s))!==null&&C!==void 0&&C.writable)&&(N(d=a(()=>EC(void 0)),Nh(l)),A.set(s,d)):(B=d.v!==es,N(d,a(()=>Nh(l))));var f=Reflect.getOwnPropertyDescriptor(r,s);if(f!=null&&f.set&&f.set.call(g,l),!B){if(t&&typeof s=="string"){var m=A.get("length"),v=Number(s);Number.isInteger(v)&&v>=m.v&&N(m,v+1)}P4(n)}return!0},ownKeys(r){c(n);var s=Reflect.ownKeys(r).filter(C=>{var d=A.get(C);return d===void 0||d.v!==es});for(var[l,g]of A)g.v===es||l in r||s.push(l);return s},setPrototypeOf(){(function(){throw new Error("https://svelte.dev/e/state_prototype_fixed")})()}})}function hj(i){try{if(i!==null&&typeof i=="object"&&y0 in i)return i[y0]}catch(e){}return i}function wdA(i,e){return Object.is(hj(i),hj(e))}function e1(){var i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";return document.createTextNode(i)}function Jl(i){return VV.call(i)}function gp(i){return qV.call(i)}function gA(i,e){return Jl(i)}function at(i){var e=Jl(i);return e instanceof Comment&&e.data===""?gp(e):e}function kA(i){for(var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=i;e--;)A=gp(A);return A}var Ej=!1;function g5(i){var e=go,A=co;Ql(null),yg(null);try{return i()}finally{Ql(e),yg(A)}}function ydA(i,e,A){var t=arguments.length>3&&arguments[3]!==void 0?arguments[3]:A;i.addEventListener(e,()=>g5(A));var n=i.__on_r;i.__on_r=n?()=>{n(),t(!0)}:()=>t(!0),Ej||(Ej=!0,document.addEventListener("reset",o=>{Promise.resolve().then(()=>{if(!o.defaultPrevented)for(var a of o.target.elements){var r;(r=a.__on_r)===null||r===void 0||r.call(a)}})},{capture:!0}))}function ZV(i){co===null&&(go===null&&(function(){throw new Error("https://svelte.dev/e/effect_orphan")})(),(function(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")})()),rI&&(function(){throw new Error("https://svelte.dev/e/effect_in_teardown")})()}function yc(i,e,A){var t=co;t!==null&&(t.f&w0)!==0&&(i|=w0);var n={ctx:Mo,deps:null,nodes:null,f:i|mc|fc,first:null,fn:e,last:null,next:null,parent:t,b:t&&t.b,prev:null,teardown:null,wv:0,ac:null};if(A)try{Wh(n),n.f|=ix}catch(s){throw is(n),s}else e!==null&&AI(n);var o=n;if(A&&o.deps===null&&o.teardown===null&&o.nodes===null&&o.first===o.last&&(o.f&kV)===0&&(o=o.first,(i&oE)!==0&&(i&Zd)!==0&&o!==null&&(o.f|=Zd)),o!==null&&(o.parent=t,t!==null&&(function(s,l){var g=l.last;g===null?l.last=l.first=s:(g.next=s,s.prev=g,l.last=s)})(o,t),go!==null&&2&go.f&&(i&MV)===0)){var a,r=go;((a=r.effects)!==null&&a!==void 0?a:r.effects=[]).push(o)}return n}function j4(){return go!==null&&!f0}function c5(i){var e=yc(8,null,!1);return ns(e,ts),e.teardown=i,e}function D_(i){ZV();var e=co.f;if(!(!go&&(e&s5)!==0&&(e&ix)===0))return XV(i);var A,t=Mo;((A=t.e)!==null&&A!==void 0?A:t.e=[]).push(i)}function XV(i){return yc(1048580,i,!1)}function Tr(i){return yc(4,i,!1)}function KA(i,e){var A={effect:null,ran:!1,deps:i};Mo.l.$.push(A),A.effect=sE(()=>{i(),A.ran||(A.ran=!0,uA(e))})}function Vn(){var i=Mo;sE(()=>{for(var e of i.l.$){e.deps();var A=e.effect;(A.f&ts)!==0&&ns(A,_C),gE(A)&&Wh(A),e.ran=!1}})}function sE(i){return yc(8|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),i,!0)}function Le(i){HV(arguments.length>3&&arguments[3]!==void 0?arguments[3]:[],arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],e=>{yc(8,()=>i(...e.map(c)),!0)})}function lE(i){return yc(oE|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),i,!0)}function $V(i){return yc(IdA|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),i,!0)}function D0(i){return yc(524320,i,!0)}function Aq(i){var e=i.teardown;if(e!==null){var A=rI,t=go;Qj(!0),Ql(null);try{e.call(null)}finally{Qj(A),Ql(t)}}}function eq(i){var e=arguments.length>1&&arguments[1]!==void 0&&arguments[1],A=i.first;i.first=i.last=null;for(var t,n=function(){var o=A.ac;o!==null&&g5(()=>{o.abort(Rh)}),t=A.next,(A.f&MV)!==0?A.parent=null:is(A,e),A=t};A!==null;)n()}function is(i){var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=!1;!e&&(i.f&SV)===0||i.nodes===null||i.nodes.end===null||(tq(i.nodes.start,i.nodes.end),A=!0),eq(i,e&&!A),Hw(i,0),ns(i,aE);var t=i.nodes&&i.nodes.t;if(t!==null)for(var n of t)n.stop();Aq(i);var o=i.parent;o!==null&&o.first!==null&&iq(i),i.next=i.prev=i.teardown=i.ctx=i.deps=i.fn=i.nodes=i.ac=null}function tq(i,e){for(;i!==null;){var A=i===e?null:gp(i);i.remove(),i=A}}function iq(i){var e=i.parent,A=i.prev,t=i.next;A!==null&&(A.next=t),t!==null&&(t.prev=A),e!==null&&(e.first===i&&(e.first=t),e.last===i&&(e.last=A))}function qh(i,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],t=[];nq(i,t,!0);var n=()=>{A&&is(i),e&&e()},o=t.length;if(o>0){var a=()=>--o||n();for(var r of t)r.out(a)}else n()}function nq(i,e,A){if((i.f&w0)===0){i.f^=w0;var t=i.nodes&&i.nodes.t;if(t!==null)for(var n of t)(n.is_global||A)&&e.push(n);for(var o=i.first;o!==null;){var a=o.next;nq(o,e,((o.f&Zd)!==0||(o.f&s5)!==0&&(i.f&oE)!==0)&&A),o=a}}}function v_(i){oq(i,!0)}function oq(i,e){if((i.f&w0)!==0){i.f^=w0,(i.f&ts)===0&&(ns(i,mc),AI(i));for(var A=i.first;A!==null;){var t=A.next;oq(A,((A.f&Zd)!==0||(A.f&s5)!==0)&&e),A=t}var n=i.nodes&&i.nodes.t;if(n!==null)for(var o of n)(o.is_global||e)&&o.in()}}function aq(i,e){if(i.nodes)for(var A=i.nodes.start,t=i.nodes.end;A!==null;){var n=A===t?null:gp(A);e.append(A),A=n}}var DdA=null;var jd=!1;function Yw(i){jd=i}var rI=!1;function Qj(i){rI=i}var go=null,f0=!1;function Ql(i){go=i}var co=null;function yg(i){co=i}var MC=null;function rq(i){go!==null&&(MC===null?MC=[i]:MC.push(i))}var Ts=null,Kl=0,Eg=null,sq=1,V4=0,Vd=V4;function uj(i){Vd=i}function lq(){return++sq}function gE(i){var e=i.f;if((e&mc)!==0)return!0;if(2&e&&(i.f&=-32769),(e&_C)!==0){var A=i.deps;if(A!==null)for(var t=A.length,n=0;ni.wv)return!0}(e&fc)!==0&&mg===null&&ns(i,ts)}return!1}function gq(i,e){var A,t=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],n=i.reactions;if(n!==null&&((A=MC)===null||A===void 0||!A.includes(i)))for(var o=0;o{i.ac.abort(Rh)}),i.ac=null);try{i.f|=m_;var g=(0,i.fn)(),C=i.deps;if(Ts!==null){var d;if(Hw(i,Kl),C!==null&&Kl>0)for(C.length=Kl+Ts.length,d=0;d1&&arguments[1]!==void 0?arguments[1]:new Set;if(!(typeof i!="object"||i===null||i instanceof EventTarget||e.has(i))){for(var A in e.add(i),i instanceof Date&&i.getTime(),i)try{b_(i[A],e)}catch(r){}var t=ex(i);if(t!==Object.prototype&&t!==Array.prototype&&t!==Map.prototype&&t!==Set.prototype&&t!==Date.prototype){var n=vV(t);for(var o in n){var a=n[o].get;if(a)try{a.call(i)}catch(r){}}}}}var hq=new Set,M_=new Set;function Eq(i,e,A){var t=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};function n(o){if(t.capture||T4.call(e,o),!o.cancelBubble)return g5(()=>A?.call(this,o))}return i.startsWith("pointer")||i.startsWith("touch")||i==="wheel"?Xd(()=>{e.addEventListener(i,n,t)}):e.addEventListener(i,n,t),n}function De(i,e,A,t,n){var o={capture:t,passive:n},a=Eq(i,e,A,o);(e===document.body||e===window||e===document||e instanceof HTMLMediaElement)&&c5(()=>{e.removeEventListener(i,a,o)})}function cp(i){for(var e=0;ea||t});var C=go,d=co;Ql(null),yg(null);try{for(var B,u=[];a!==null;){var E=a.assignedSlot||a.parentNode||a.host||null;try{var f=a["__"+n];f==null||a.disabled&&i.target!==a||f.call(a,i)}catch(S){B?u.push(S):B=S}if(i.cancelBubble||E===A||E===null)break;a=E}if(B){var m=function(S){queueMicrotask(()=>{throw S})};for(var v of u)m(v);throw B}}finally{i.__root=A,delete i.currentTarget,Ql(C),yg(d)}}}function ox(i){var e=document.createElement("template");return e.innerHTML=i.replaceAll("",""),e.content}function eI(i,e){var A=co;A.nodes===null&&(A.nodes={start:i,end:e,a:null,t:null})}function TA(i,e){var A,t=!!(1&e),n=!!(2&e),o=!i.startsWith("");return()=>{A===void 0&&(A=ox(o?i:""+i),t||(A=Jl(A)));var a=n||jV?document.importNode(A,!0):A.cloneNode(!0);return t?eI(Jl(a),a.lastChild):eI(a,a),a}}function l1(i,e){return(function(A,t){var n,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"svg",a=!A.startsWith(""),r=!!(1&t),s="<".concat(o,">").concat(a?A:""+A,"");return()=>{if(!n){var l=Jl(ox(s));if(r)for(n=document.createDocumentFragment();Jl(l);)n.appendChild(Jl(l));else n=Jl(l)}var g=n.cloneNode(!0);return r?eI(Jl(g),g.lastChild):eI(g,g),g}})(i,e,"svg")}function mr(){var i=e1((arguments.length>0&&arguments[0]!==void 0?arguments[0]:"")+"");return eI(i,i),i}function zi(){var i=document.createDocumentFragment(),e=document.createComment(""),A=e1();return i.append(e,A),eI(e,A),i}function sA(i,e){i!==null&&i.before(e)}var MdA=["beforeinput","click","change","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"],SdA={formnovalidate:"formNoValidate",ismap:"isMap",nomodule:"noModule",playsinline:"playsInline",readonly:"readOnly",defaultvalue:"defaultValue",defaultchecked:"defaultChecked",srcobject:"srcObject",novalidate:"noValidate",allowfullscreen:"allowFullscreen",disablepictureinpicture:"disablePictureInPicture",disableremoteplayback:"disableRemotePlayback"},kdA=["touchstart","touchmove"];function _dA(i){return kdA.includes(i)}function Ht(i,e){var A,t=e==null?"":typeof e=="object"?e+"":e;t!==((A=i.__t)!==null&&A!==void 0?A:i.__t=i.nodeValue)&&(i.__t=t,i.nodeValue=t+"")}function xdA(i,e){return(function(A,t){var{target:n,anchor:o,props:a={},events:r,context:s,intro:l=!0}=t;(function(){if(bC===void 0){bC=window,jV=/Firefox/.test(navigator.userAgent);var u=Element.prototype,E=Node.prototype,f=Text.prototype;VV=vC(E,"firstChild").get,qV=vC(E,"nextSibling").get,lj(u)&&(u.__click=void 0,u.__className=void 0,u.__attributes=null,u.__style=void 0,u.__e=void 0),lj(f)&&(f.__t=void 0)}})();var g=new Set,C=u=>{for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};return new Promise(m=>{f.outro?qh(E,()=>{is(E),m(void 0)}):(is(E),m(void 0))})}})(()=>{var u=o??n.appendChild(e1());return(function(E,f,m){new y_(E,f,m)})(u,{pending:()=>{}},E=>{s&&(Jt({}),Mo.c=s),r&&(a.$$events=r),d=A(E,a)||{},s&&Yt()}),()=>{for(var E of g){n.removeEventListener(E,T4);var f=yh.get(E);--f===0?(document.removeEventListener(E,T4),yh.delete(E)):yh.set(E,f)}var m;M_.delete(C),u!==o&&((m=u.parentNode)===null||m===void 0||m.removeChild(u))}});return S_.set(d,B),d})(i,e)}var yh=new Map,S_=new WeakMap,Dh,IC=new WeakMap,Kd=new WeakMap,BC=new WeakMap,L4=new WeakMap,Zk=new WeakMap,pj=new WeakMap,RdA=new WeakMap,Zh=class{constructor(e){var A=this,t=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];u0(this,"anchor",void 0),Go(this,IC,new Map),Go(this,Kd,new Map),Go(this,BC,new Map),Go(this,L4,new Set),Go(this,Zk,!0),Go(this,pj,()=>{var n=ea;if(xe(IC,this).has(n)){var o=xe(IC,this).get(n),a=xe(Kd,this).get(o);if(a)v_(a),xe(L4,this).delete(o);else{var r=xe(BC,this).get(o);r&&(xe(Kd,this).set(o,r.effect),xe(BC,this).delete(o),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),a=r.effect)}for(var[s,l]of xe(IC,this)){if(xe(IC,this).delete(s),s===n)break;var g=xe(BC,this).get(l);g&&(is(g.effect),xe(BC,this).delete(l))}var C=function(u,E){if(u===o||xe(L4,A).has(u))return 1;var f=()=>{if(Array.from(xe(IC,A).values()).includes(u)){var m=document.createDocumentFragment();aq(E,m),m.append(e1()),xe(BC,A).set(u,{effect:E,fragment:m})}else is(E);xe(L4,A).delete(u),xe(Kd,A).delete(u)};xe(Zk,A)||!a?(xe(L4,A).add(u),qh(E,f,!1)):f()};for(var[d,B]of xe(Kd,this))C(d,B)}}),Go(this,RdA,n=>{xe(IC,this).delete(n);var o=Array.from(xe(IC,this).values());for(var[a,r]of xe(BC,this))o.includes(a)||(is(r.effect),xe(BC,this).delete(a))}),this.anchor=e,vn(Zk,this,t)}ensure(e,A){var t=ea;!A||xe(Kd,this).has(e)||xe(BC,this).has(e)||xe(Kd,this).set(e,D0(()=>A(this.anchor))),xe(IC,this).set(t,e),xe(pj,this).call(this)}};function os(i){Mo===null&&sp(),nE&&Mo.l!==null?Qq(Mo).m.push(i):D_(()=>{var e=uA(i);if(typeof e=="function")return e})}function Dg(i){Mo===null&&sp(),os(()=>()=>uA(i))}function NdA(){var i=Mo;return i===null&&sp(),(e,A,t)=>{var n,o=(n=i.s.$$events)===null||n===void 0?void 0:n[e];if(o){var a=rp(o)?o.slice():[o],r=(function(l,g){var{bubbles:C=!1,cancelable:d=!1}=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return new CustomEvent(l,{detail:g,bubbles:C,cancelable:d})})(e,A,t);for(var s of a)s.call(i.x,r);return!r.defaultPrevented}return!0}}function FdA(i){Mo===null&&sp(),Mo.l===null&&(function(){throw new Error("https://svelte.dev/e/lifecycle_legacy_only")})(),Qq(Mo).b.push(i)}function Qq(i){var e,A=i.l;return(e=A.u)!==null&&e!==void 0?e:A.u={a:[],b:[],m:[]}}function zA(i,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],t=new Zh(i);function n(o,a){t.ensure(o,a)}lE(()=>{var o=!1;e(function(a){o=!0,n(!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],a)}),o||n(!1,null)},A?Zd:0)}function uq(i,e,A){var t=new Zh(i),n=!rE();lE(()=>{var o=e();n&&o!==null&&typeof o=="object"&&(o={}),t.ensure(o,A)})}function Ka(i,e){return e}function Xk(i){for(var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=0;A5&&arguments[5]!==void 0?arguments[5]:null,a=i,r=new Map;!(4&e)||(a=i.appendChild(e1()));var s,l=null,g=lt(()=>{var E=A();return rp(E)?E:E==null?[]:xw(E)}),C=!0;function d(){u.fallback=l,(function(E,f,m,v,S){var k,M,x,F,z,j=!!(8&v),X=f.length,eA=E.items,Z=E.effect.first,CA=null,wA=[],BA=[];if(j)for(z=0;z0){var YA=4&v&&X===0?m:null;if(j){for(z=0;z{if(Ge){if(Ge.pending.delete(vt),Ge.done.add(vt),Ge.pending.size===0){var Ke=pA.outrogroups;Xk(xw(Ge.done)),Ke.delete(Ge),Ke.size===0&&(pA.outrogroups=null)}}else yA-=1},!1)},Dt=0;Dt{if(M!==void 0)for(F of M){var pA;(pA=F.nodes)===null||pA===void 0||(pA=pA.a)===null||pA===void 0||pA.apply()}})})(u,s,a,e,t),l!==null&&(s.length===0?(l.f&hC)===0?v_(l):(l.f^=hC,G4(l,null,a)):qh(l,()=>{l=null}))}var B=lE(()=>{for(var E=(s=c(g)).length,f=new Set,m=0;mo(a)):(l=D0(()=>o(Dh??(Dh=e1())))).f|=hC),C||d(),c(g)}),u={effect:B,items:r,outrogroups:null,fallback:l};C=!1}function LdA(i,e,A,t,n,o,a,r){var s=1&a?16&a?xC(A):cA(A,!1,!1):null,l=2&a?xC(n):null;return{v:s,i:l,e:D0(()=>(o(e,s??A,l??n,r),()=>{i.delete(t)}))}}function G4(i,e,A){if(i.nodes)for(var t=i.nodes.start,n=i.nodes.end,o=e&&(e.f&hC)===0?e.nodes.start:A;t!==null;){var a=gp(t);if(o.before(t),t===n)return;t=a}}function T2(i,e,A){e===null?i.effect.first=A:e.next=A,A===null?i.effect.last=e:A.prev=e}function pq(i,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],t=arguments.length>3&&arguments[3]!==void 0&&arguments[3],n=i,o="";Le(()=>{var a,r=co;if(o!==(o=(a=e())!==null&&a!==void 0?a:"")&&(r.nodes!==null&&(tq(r.nodes.start,r.nodes.end),r.nodes=null),o!=="")){var s=o+"";A?s="".concat(s,""):t&&(s="".concat(s,""));var l=ox(s);if((A||t)&&(l=Jl(l)),eI(Jl(l),l.lastChild),A||t)for(;Jl(l);)n.before(Jl(l));else n.before(l)}})}function ya(i,e,A,t,n){var o,a=(o=e.$$slots)===null||o===void 0?void 0:o[A],r=!1;a===!0&&(a=e[A==="default"?"children":A],r=!0),a===void 0?n!==null&&n(i):a(i,r?()=>t:t)}function fq(i,e,A){var t=new Zh(i);lE(()=>{var n,o=(n=e())!==null&&n!==void 0?n:null;t.ensure(o,o&&(a=>A(a,o)))},Zd)}function Ms(i,e,A){Tr(()=>{var t=uA(()=>e(i,A?.())||{});if(A&&t!=null&&t.update){var n=!1,o={};sE(()=>{var a=A();Y(a),n&&RV(o,a)&&(o=a,t.update(a))}),n=!0}if(t!=null&&t.destroy)return()=>t.destroy()})}function GdA(i,e){var A,t=void 0;$V(()=>{t!==(t=e())&&(A&&(is(A),A=null),t&&(A=D0(()=>{Tr(()=>t(i))})))})}function mq(i){var e,A,t="";if(typeof i=="string"||typeof i=="number")t+=i;else if(typeof i=="object")if(Array.isArray(i)){var n=i.length;for(e=0;e1&&arguments[1]!==void 0&&arguments[1]?" !important;":";",A="";for(var t in i){var n=i[t];n!=null&&n!==""&&(A+=" "+t+": "+n+e)}return A}function $k(i){return i[0]!=="-"||i[1]!=="-"?i.toLowerCase():i}function Ci(i,e,A,t,n,o){var a=i.__className;if(a!==A||a===void 0){var r=(function(g,C,d){var B=g==null?"":""+g;if(C&&(B=B?B+" "+C:C),d){for(var u in d)if(d[u])B=B?B+" "+u:u;else if(B.length)for(var E=u.length,f=0;(f=B.indexOf(u,f))>=0;){var m=f+E;f!==0&&!fj.includes(B[f-1])||m!==B.length&&!fj.includes(B[m])?f=m:B=(f===0?"":B.substring(0,f))+B.substring(m+1)}}return B===""?null:B})(A,t,o);r==null?i.removeAttribute("class"):e?i.className=r:i.setAttribute("class",r),i.__className=A}else if(o&&n!==o)for(var s in o){var l=!!o[s];n!=null&&l===!!n[s]||i.classList.toggle(s,l)}return o}function A_(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},A=arguments.length>2?arguments[2]:void 0,t=arguments.length>3?arguments[3]:void 0;for(var n in A){var o=A[n];e[n]!==o&&(A[n]==null?i.style.removeProperty(n):i.style.setProperty(n,o,t))}}function wg(i,e,A,t){if(i.__style!==e){var n=(function(o,a){if(a){var r,s,l="";if(Array.isArray(a)?(r=a[0],s=a[1]):r=a,o){o=String(o).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var g=!1,C=0,d=!1,B=[];r&&B.push(...Object.keys(r).map($k)),s&&B.push(...Object.keys(s).map($k));for(var u=0,E=-1,f=o.length,m=0;m2&&arguments[2]!==void 0&&arguments[2];if(i.multiple){if(e==null)return;if(!rp(e))return void console.warn("https://svelte.dev/e/select_multiple_invalid_value");for(var t of i.options)t.selected=e.includes(wj(t))}else{for(t of i.options)if(wdA(wj(t),e))return void(t.selected=!0);A&&e===void 0||(i.selectedIndex=-1)}}function KdA(i){var e=new MutationObserver(()=>{k_(i,i.__value)});e.observe(i,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),c5(()=>{e.disconnect()})}function wj(i){return"__value"in i?i.__value:i.value}var _h=Symbol("class"),K4=Symbol("style"),wq=Symbol("is custom element"),yq=Symbol("is html");function tI(i,e){var A=ax(i);A.value!==(A.value=e??void 0)&&(i.value!==e||e===0&&i.nodeName==="PROGRESS")&&(i.value=e??"")}function jn(i,e,A,t){var n=ax(i);n[e]!==(n[e]=A)&&(e==="loading"&&(i[hdA]=A),A==null?i.removeAttribute(e):typeof A!="string"&&Dq(i).includes(e)?i[e]=A:i.setAttribute(e,A))}function UdA(i,e,A,t){var n,o=ax(i),a=o[wq],r=!o[yq],s=e||{},l=i.tagName==="OPTION";for(var g in e)g in A||(A[g]=null);A.class?A.class=o1(A.class):(t||A[_h])&&(A.class=null),A[K4]&&((n=A.style)!==null&&n!==void 0||(A.style=null));var C,d,B,u,E,f,m=Dq(i),v=function(k){var M=A[k];if(l&&k==="value"&&M==null)return i.value=i.__value="",s[k]=M,0;if(k==="class")return C=i.namespaceURI==="http://www.w3.org/1999/xhtml",Ci(i,C,M,t,e?.[_h],A[_h]),s[k]=M,s[_h]=A[_h],0;if(k==="style")return wg(i,M,e?.[K4],A[K4]),s[k]=M,s[K4]=A[K4],0;if(M===(d=s[k])&&(M!==void 0||!i.hasAttribute(k))||(s[k]=M,(B=k[0]+k[1])==="$$"))return 0;if(B==="on"){var x={},F="$$"+k,z=k.slice(2);if(u=(function(wA){return MdA.includes(wA)})(z),(function(wA){return wA.endsWith("capture")&&wA!=="gotpointercapture"&&wA!=="lostpointercapture"})(z)&&(z=z.slice(0,-7),x.capture=!0),!u&&d){if(M!=null)return 0;i.removeEventListener(z,s[F],x),s[F]=null}if(M!=null)if(u)i["__".concat(z)]=M,cp([z]);else{let wA=function(BA){s[k].call(this,BA)};var CA=wA;s[F]=Eq(z,i,wA,x)}else u&&(i["__".concat(z)]=void 0)}else if(k==="style")jn(i,k,M);else if(k==="autofocus")(function(wA,BA){if(BA){var QA=document.body;wA.autofocus=!0,Xd(()=>{document.activeElement===QA&&wA.focus()})}})(i,!!M);else if(a||k!=="__value"&&(k!=="value"||M==null))if(k==="selected"&&l)(function(wA,BA){BA?wA.hasAttribute("selected")||wA.setAttribute("selected",""):wA.removeAttribute("selected")})(i,M);else if(E=k,r||(E=(function(wA){var BA;return wA=wA.toLowerCase(),(BA=SdA[wA])!==null&&BA!==void 0?BA:wA})(E)),f=E==="defaultValue"||E==="defaultChecked",M!=null||a||f)f||m.includes(E)&&(a||typeof M!="string")?(i[E]=M,E in o&&(o[E]=es)):typeof M!="function"&&jn(i,E,M);else if(o[k]=null,E==="value"||E==="checked"){var j=i,X=e===void 0;if(E==="value"){var eA=j.defaultValue;j.removeAttribute(E),j.defaultValue=eA,j.value=j.__value=X?eA:null}else{var Z=j.defaultChecked;j.removeAttribute(E),j.defaultChecked=Z,j.checked=!!X&&Z}}else i.removeAttribute(k);else i.value=i.__value=M};for(var S in A)v(S);return s}function Lw(i,e){var A=arguments.length>5?arguments[5]:void 0,t=arguments.length>6&&arguments[6]!==void 0&&arguments[6],n=arguments.length>7&&arguments[7]!==void 0&&arguments[7];HV(arguments.length>4&&arguments[4]!==void 0?arguments[4]:[],arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],arguments.length>3&&arguments[3]!==void 0?arguments[3]:[],o=>{var a=void 0,r={},s=i.nodeName==="SELECT",l=!1;if($V(()=>{var C=e(...o.map(c)),d=UdA(i,a,C,A,t,n);for(var B of(l&&s&&"value"in C&&k_(i,C.value),Object.getOwnPropertySymbols(r)))C[B]||is(r[B]);for(var u of Object.getOwnPropertySymbols(C)){var E=C[u];u.description!=="@attach"||a&&E===a[u]||(r[u]&&is(r[u]),r[u]=D0(()=>GdA(i,()=>E))),d[u]=E}a=d}),s){var g=i;Tr(()=>{k_(g,a.value,!0),KdA(g)})}l=!0})}function ax(i){var e;return(e=i.__attributes)!==null&&e!==void 0?e:i.__attributes={[wq]:i.nodeName.includes("-"),[yq]:i.namespaceURI==="http://www.w3.org/1999/xhtml"}}var yj=new Map;function Dq(i){var e,A=i.getAttribute("is")||i.nodeName,t=yj.get(A);if(t)return t;yj.set(A,t=[]);for(var n=i,o=Element.prototype;o!==n;){for(var a in e=vV(n))e[a].set&&t.push(a);n=ex(n)}return t}function zw(i,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e,t=new WeakSet;ydA(i,"input",(function(){var n=Xt(function*(o){var a=o?i.defaultValue:i.value;if(a=e_(i)?t_(a):a,A(a),ea!==null&&t.add(ea),yield Cq(),a!==(a=e())){var r=i.selectionStart,s=i.selectionEnd,l=i.value.length;if(i.value=a??"",s!==null){var g=i.value.length;r===s&&s===l&&g>l?(i.selectionStart=g,i.selectionEnd=g):(i.selectionStart=r,i.selectionEnd=Math.min(s,g))}}});return function(o){return n.apply(this,arguments)}})()),uA(e)==null&&i.value&&(A(e_(i)?t_(i.value):i.value),ea!==null&&t.add(ea)),sE(()=>{var n=e();if(i===document.activeElement){var o=H4??ea;if(t.has(o))return}e_(i)&&n===t_(i.value)||(i.type!=="date"||n||i.value)&&n!==i.value&&(i.value=n??"")})}function e_(i){var e=i.type;return e==="number"||e==="range"}function t_(i){return i===""?null:+i}function Ai(i,e,A){var t=vC(i,e);t&&t.set&&(i[e]=A,c5(()=>{i[e]=null}))}function Dj(i,e){return i===e||i?.[y0]===e}function ta(){var i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,A=arguments.length>2?arguments[2]:void 0;return Tr(()=>{var t,n;return sE(()=>{t=n,n=[],uA(()=>{i!==A(...n)&&(e(i,...n),t&&Dj(A(...t),i)&&e(null,...t))})}),()=>{Xd(()=>{n&&Dj(A(...n),i)&&e(null,...n)})}}),i}function uC(i){return function(){for(var e=arguments.length,A=new Array(e),t=0;t0&&arguments[0]!==void 0&&arguments[0],e=Mo,A=e.l.u;if(A){var t,n=()=>Y(e.s);if(i){var o=0,a={},r=lp(()=>{var s=!1,l=e.s;for(var g in l)l[g]!==a[g]&&(a[g]=l[g],s=!0);return s&&o++,o});n=()=>c(r)}A.b.length&&(t=()=>{vj(e,n),f_(A.b)},ZV(),yc(1048584,t,!0)),D_(()=>{var s=uA(()=>A.m.map(ddA));return()=>{for(var l of s)typeof l=="function"&&l()}}),A.a.length&&D_(()=>{vj(e,n),f_(A.a)})}}function vj(i,e){if(i.l.s)for(var A of i.l.s)c(A);e()}function C5(i){var e=xC(0);return function(){return arguments.length===1?(N(e,c(e)+1),arguments[0]):(c(e),i())}}function O4(i,e){var A,t=(A=i.$$events)===null||A===void 0?void 0:A[e.type],n=rp(t)?t.slice():t==null?[]:[t];for(var o of n)o.call(this,e)}var Ew=!1,TdA={get(i,e){if(!i.exclude.includes(e))return c(i.version),e in i.special?i.special[e]():i.props[e]},set(i,e,A){if(!(e in i.special)){var t=co;try{yg(i.parent_effect),i.special[e]=K({get[e](){return i.props[e]}},e,4)}finally{yg(t)}}return i.special[e](A),Bj(i.version),!0},getOwnPropertyDescriptor(i,e){if(!i.exclude.includes(e))return e in i.props?{enumerable:!0,configurable:!0,value:i.props[e]}:void 0},deleteProperty:(i,e)=>(i.exclude.includes(e)||(i.exclude.push(e),Bj(i.version)),!0),has:(i,e)=>!i.exclude.includes(e)&&e in i.props,ownKeys:i=>Reflect.ownKeys(i.props).filter(e=>!i.exclude.includes(e))};function Qw(i,e){return new Proxy({props:i,exclude:e,special:{},version:xC(0),parent_effect:co},TdA)}var OdA={get(i,e){for(var A=i.props.length;A--;){var t=i.props[A];if(N4(t)&&(t=t()),typeof t=="object"&&t!==null&&e in t)return t[e]}},set(i,e,A){for(var t=i.props.length;t--;){var n=i.props[t];N4(n)&&(n=n());var o=vC(n,e);if(o&&o.set)return o.set(A),!0}return!1},getOwnPropertyDescriptor(i,e){for(var A=i.props.length;A--;){var t=i.props[A];if(N4(t)&&(t=t()),typeof t=="object"&&t!==null&&e in t){var n=vC(t,e);return n&&!n.configurable&&(n.configurable=!0),n}}},has(i,e){if(e===y0||e===_V)return!1;for(var A of i.props)if(N4(A)&&(A=A()),A!=null&&e in A)return!0;return!1},ownKeys(i){var e=[];for(var A of i.props)if(N4(A)&&(A=A()),A){for(var t in A)e.includes(t)||e.push(t);for(var n of Object.getOwnPropertySymbols(A))e.includes(n)||e.push(n)}return e}};function t1(){for(var i=arguments.length,e=new Array(i),A=0;A(g&&(g=!1,l=s?uA(t):t),l);if(r){var d,B,u=y0 in i||_V in i;n=(d=(B=vC(i,e))===null||B===void 0?void 0:B.set)!==null&&d!==void 0?d:u&&e in i?M=>i[e]=M:void 0}var E,f=!1;if(r?[o,f]=(function(M){var x=Ew;try{return Ew=!1,[M(),Ew]}finally{Ew=x}})(()=>i[e]):o=i[e],o===void 0&&t!==void 0&&(o=C(),n&&(a&&(function(){throw new Error("https://svelte.dev/e/props_invalid_value")})(),n(o))),E=a?()=>{var M=i[e];return M===void 0?C():(g=!0,M)}:()=>{var M=i[e];return M!==void 0&&(l=void 0),M===void 0?l:M},a&&!(4&A))return E;if(n){var m=i.$$legacy;return function(M,x){return arguments.length>0?(a&&x&&!m&&!f||n(x?E():M),M):E()}}var v=!1,S=(1&A?lp:lt)(()=>(v=!1,E()));r&&c(S);var k=co;return function(M,x){if(arguments.length>0){var F=x?c(S):a&&r?Nh(M):M;return N(S,F),v=!0,l!==void 0&&(l=F),M}return rI&&v||(k.f&aE)!==0?S.v:c(S)}}function dr(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:(function(t){var n=(function(o){try{if(typeof window<"u"&&window.localStorage!==void 0)return window.localStorage[o]}catch(a){}})("debug");return n!=null&&n.endsWith("*")?t.startsWith(n.slice(0,-1)):t===n})(i);if(!e)return JdA;var A=(function(t){for(var n=0,o=0;o9466848e5&&isFinite(i)&&Math.floor(i)===i&&!isNaN(new Date(i).valueOf());if(typeof i=="bigint")return __(Number(i));try{var e=i&&i.valueOf();if(e!==i)return __(e)}catch(A){return!1}return!1}function vq(i){(uw=uw||window.document.createElement("div")).style.color="",uw.style.color=i;var e=uw.style.color;return e!==""?e.replace(/\s+/g,"").toLowerCase():void 0}var uw=void 0;function PdA(i){return typeof i=="string"&&i.length<99&&!!vq(i)}function sx(i,e){if(typeof i=="number"||typeof i=="string"||typeof i=="boolean"||i===void 0)return typeof i;if(typeof i=="bigint")return"number";if(i===null)return"null";if(Array.isArray(i))return"array";if(Jn(i))return"object";var A=e.stringify(i);return A&&rx(A)?"number":A==="true"||A==="false"?"boolean":A==="null"?"null":"unknown"}var jdA=/^https?:\/\/\S+$/;function d5(i){return typeof i=="string"&&jdA.test(i)}function cE(i,e){if(i==="")return"";var A=i.trim();return A==="null"?null:A==="true"||A!=="false"&&(rx(A)?e.parse(A):i)}var VdA=[];function Mj(i,e){if(i.length!==e.length)return!1;for(var A=0;A1&&arguments[1]!==void 0&&arguments[1],A={};if(!Array.isArray(i))throw new TypeError("Array expected");function t(a,r){(!Array.isArray(a)&&!Jn(a)||e&&r.length>0)&&(A[xt(r)]=!0),Jn(a)&&Object.keys(a).forEach(s=>{t(a[s],r.concat(s))})}for(var n=Math.min(i.length,1e4),o=0;oe?i.slice(0,e):i}function Sj(i){return Fe({},i)}function kj(i){return Object.values(i)}function _j(i,e,A,t){var n=i.slice(0),o=n.splice(e,A);return n.splice.apply(n,[e+t,0,...o]),n}function qdA(i,e,A){return i.slice(0,e).concat(A).concat(i.slice(e))}function Cp(i,e){try{return e.parse(i)}catch(A){return e.parse(gg(i))}}function Mq(i,e){try{return Cp(i,e)}catch(A){return}}function dp(i,e){i=i.replace(kq,"");try{return e(i)}catch(A){}try{return e("{"+i+"}")}catch(A){}try{return e("["+i+"]")}catch(A){}throw new Error("Failed to parse partial JSON")}function Sq(i){i=i.replace(kq,"");try{return gg(i)}catch(t){}try{var e=gg("["+i+"]");return e.substring(1,e.length-1)}catch(t){}try{var A=gg("{"+i+"}");return A.substring(1,A.length-1)}catch(t){}throw new Error("Failed to repair partial JSON")}var kq=/,\s*$/;function Xh(i,e){var A=Rj.exec(e);if(A){var t=Or(A[2]),n=(function(B,u){for(var E=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:B.length,m=0,v=E;v"line ".concat(n+1," column ").concat(o+1))}}var a=$dA.exec(e),r=a?Or(a[1]):void 0,s=r!==void 0?r-1:void 0,l=AIA.exec(e),g=l?Or(l[1]):void 0,C=g!==void 0?g-1:void 0,d=s!==void 0&&C!==void 0?(function(B,u,E){for(var f=B.indexOf(` -`),m=1;m1&&arguments[1]!==void 0?arguments[1]:void 0,A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:JSON;return q4(i)?i:{text:A.stringify(i.json,null,e)}}function xj(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:JSON;return W4(i)?i:{json:e.parse(i.text)}}function R_(i,e,A){return WdA(i,e,A).text}function ZdA(i,e){return XdA(i,e)>e}function XdA(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1/0;if(q4(i))return i.text.length;var A=i.json,t=0;return(function n(o){if(Array.isArray(o)){if((t+=o.length-1+2)>e)return;for(var a=0;ae)return}else if(Jn(o)){var r=Object.keys(o);t+=2+r.length+(r.length-1);for(var s=0;sxq(Fq(String(i))),unescapeValue:i=>Lq(Rq(i))},iIA={escapeValue:i=>Fq(String(i)),unescapeValue:i=>Lq(i)},nIA={escapeValue:i=>xq(String(i)),unescapeValue:i=>Rq(i)},oIA={escapeValue:i=>String(i),unescapeValue:i=>i};function xq(i){return i.replace(/[^\x20-\x7F]/g,e=>{var A;return e==="\b"||e==="\f"||e===` -`||e==="\r"||e===" "?e:"\\u"+("000"+((A=e.codePointAt(0))===null||A===void 0?void 0:A.toString(16))).slice(-4)})}function Rq(i){return i.replace(/\\u[a-fA-F0-9]{4}/g,e=>{try{var A=JSON.parse('"'+e+'"');return Nq[A]||A}catch(t){return e}})}var Nq={'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},aIA={'\\"':'"',"\\\\":"\\","\\/":"/","\\b":"\b","\\f":"\f","\\n":` -`,"\\r":"\r","\\t":" "};function Fq(i){return i.replace(/["\b\f\n\r\t\\]/g,e=>Nq[e]||e)}function Lq(i){return i.replace(/\\["bfnrt\\]/g,e=>aIA[e]||e)}function $h(i){return typeof i!="string"?String(i):i.endsWith(` -`)?i+` -`:i}function Gq(i,e){return CE(i,A=>A.nodeName.toUpperCase()===e.toUpperCase())}function W2(i,e,A){return CE(i,t=>(function(n,o,a){return typeof n.getAttribute=="function"&&n.getAttribute(o)===a})(t,e,A))}function CE(i,e){return!!gx(i,e)}function gx(i,e){for(var A=i;A&&!e(A);)A=A.parentNode;return A}function Ip(i){var e,A;return(e=i==null||(A=i.ownerDocument)===null||A===void 0?void 0:A.defaultView)!==null&&e!==void 0?e:void 0}function cx(i){var e=Ip(i),A=e?.document.activeElement;return!!A&&CE(A,t=>t===i)}function Kq(i,e){return gx(i,A=>A.nodeName===e)}function o_(i){return W2(i,"data-type","selectable-key")?fo.key:W2(i,"data-type","selectable-value")?fo.value:W2(i,"data-type","insert-selection-area-inside")?fo.inside:W2(i,"data-type","insert-selection-area-after")?fo.after:fo.multi}function Gw(i){return encodeURIComponent(xt(i))}function Uq(i){var e,A=gx(i,n=>!(n==null||!n.hasAttribute)&&n.hasAttribute("data-path")),t=(e=A?.getAttribute("data-path"))!==null&&e!==void 0?e:void 0;return t?ms(decodeURIComponent(t)):void 0}function rIA(i){var{allElements:e,currentElement:A,direction:t,hasPrio:n=()=>!0,margin:o=10}=i,a=iF(e.filter(function(m){var v=m.getBoundingClientRect();return v.width>0&&v.height>0}),s),r=s(A);function s(m){var v=m.getBoundingClientRect();return{x:v.left+v.width/2,y:v.top+v.height/2,rect:v,element:m}}function l(m,v){var S=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,k=m.x-v.x,M=(m.y-v.y)*S;return Math.sqrt(k*k+M*M)}var g=m=>l(m,r);if(t==="Left"||t==="Right"){var C=t==="Left"?a.filter(m=>{return v=r,m.rect.left+o{return v=r,m.rect.right>v.rect.right+o;var v}),d=C.filter(m=>{return v=m,S=r,Math.abs(v.y-S.y)l(m,r,10));return B?.element}if(t==="Up"||t==="Down"){var u=t==="Up"?a.filter(m=>{return v=r,m.y+o{return v=r,m.y>v.y+o;var v}),E=u.filter(m=>n(m.element)),f=$E(E,g)||$E(u,g);return f?.element}}function Cx(){var i,e,A,t;return typeof navigator<"u"&&(i=(e=(A=navigator)===null||A===void 0||(A=A.platform)===null||A===void 0?void 0:A.toUpperCase().includes("MAC"))!==null&&e!==void 0?e:(t=navigator)===null||t===void 0||(t=t.userAgentData)===null||t===void 0||(t=t.platform)===null||t===void 0?void 0:t.toUpperCase().includes("MAC"))!==null&&i!==void 0&&i}function RC(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"+",A=[];dx(i,arguments.length>2&&arguments[2]!==void 0?arguments[2]:Cx)&&A.push("Ctrl"),i.altKey&&A.push("Alt"),i.shiftKey&&A.push("Shift");var t=i.key.length===1?i.key.toUpperCase():i.key;return t in sIA||A.push(t),A.join(e)}function dx(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Cx;return i.ctrlKey||i.metaKey&&e()}var sIA={Ctrl:!0,Command:!0,Control:!0,Alt:!0,Option:!0,Shift:!0};function oi(i,e){e===void 0&&(e={});var A=e.insertAt;if(i&&typeof document<"u"){var t=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",A==="top"&&t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n),n.styleSheet?n.styleSheet.cssText=i:n.appendChild(document.createTextNode(i))}}oi(`.jse-absolute-popup.svelte-enkkpn { - position: relative; - left: 0; - top: 0; - width: 0; - height: 0; - z-index: 1001; -} -.jse-absolute-popup.svelte-enkkpn .jse-hidden-input:where(.svelte-enkkpn) { - position: fixed; - left: 0; - top: 0; - width: 0; - height: 0; - padding: 0; - margin: 0; - border: none; - outline: none; - overflow: hidden; -} -.jse-absolute-popup.svelte-enkkpn .jse-absolute-popup-content:where(.svelte-enkkpn) { - position: absolute; -}`);var lIA=TA('
    '),gIA=TA('
    ');function cIA(i,e){Jt(e,!1);var A=K(e,"popup",8),t=K(e,"closeAbsolutePopup",8),n=cA(),o=cA();function a(C){A().options&&A().options.closeOnOuterClick&&!CE(C.target,d=>d===c(n))&&t()(A().id)}function r(C){RC(C)==="Escape"&&(C.preventDefault(),C.stopPropagation(),t()(A().id))}os(function(){c(o)&&c(o).focus()}),di();var s=gIA();De("mousedown",bC,function(C){a(C)},!0),De("keydown",bC,r,!0),De("wheel",bC,function(C){a(C)},!0);var l=gA(s),g=C=>{var d=lIA(),B=gA(d);ta(B,u=>N(o,u),()=>c(o)),fq(kA(B,2),()=>A().component,(u,E)=>{E(u,t1(()=>A().props))}),Le(u=>wg(d,u),[()=>(c(n),Y(A()),uA(()=>(function(u,E){var f=u.getBoundingClientRect(),{left:m,top:v,positionAbove:S,positionLeft:k}=(function(){if(E.anchor){var{anchor:M,width:x=0,height:F=0,offsetTop:z=0,offsetLeft:j=0,position:X}=E,{left:eA,top:Z,bottom:CA,right:wA}=M.getBoundingClientRect(),BA=X==="top"||Z+F>window.innerHeight&&Z>F,QA=X==="left"||eA+x>window.innerWidth&&eA>x;return{left:QA?wA-j:eA+j,top:BA?Z-z:CA+z,positionAbove:BA,positionLeft:QA}}if(typeof E.left=="number"&&typeof E.top=="number"){var{left:RA,top:dA,width:IA=0,height:xA=0}=E;return{left:RA,top:dA,positionAbove:dA+xA>window.innerHeight&&dA>xA,positionLeft:RA+IA>window.innerWidth&&RA>IA}}throw new Error('Invalid config: pass either "left" and "top", or pass "anchor"')})();return(S?"bottom: ".concat(f.top-v,"px;"):"top: ".concat(v-f.top,"px;"))+(k?"right: ".concat(f.left-m,"px;"):"left: ".concat(m-f.left,"px;"))})(c(n),A().options)))]),sA(C,d)};zA(l,C=>{c(n)&&C(g)}),ta(s,C=>N(n,C),()=>c(n)),De("mousedown",s,function(C){C.stopPropagation()}),De("keydown",s,r),sA(i,s),Yt()}var CIA=TA(" ",1);function N_(i,e){Jt(e,!1);var A=dr("jsoneditor:AbsolutePopup"),t=cA([],!0);function n(r){var s=c(t).findIndex(g=>g.id===r);if(s!==-1){var l=c(t)[s];l.options.onClose&&l.options.onClose(),N(t,c(t).filter(g=>g.id!==r))}}(function(r,s){FV().set(r,s)})("absolute-popup",{openAbsolutePopup:function(r,s,l){A("open...",s,l);var g={id:Fh(),component:r,props:s||{},options:l||{}};return N(t,[...c(t),g]),g.id},closeAbsolutePopup:n}),KA(()=>c(t),()=>{A("popups",c(t))}),Vn(),di(!0);var o=CIA(),a=at(o);Da(a,1,()=>c(t),Ka,(r,s)=>{cIA(r,{get popup(){return c(s)},closeAbsolutePopup:n})}),ya(kA(a,2),e,"default",{},null),sA(i,o),Yt()}function Bp(i,e){for(var A=new Set(e),t=i.replace(/ \(copy( \d+)?\)$/,""),n=i,o=1;A.has(n);){var a="copy"+(o>1?" "+o:"");n="".concat(t," (").concat(a,")"),o++}return n}function mC(i,e){var A=e-3;return i.length>e?i.substring(0,A)+"...":i}function dIA(i){if(i==="")return"";var e=i.toLowerCase();if(e==="null")return null;if(e==="true")return!0;if(e==="false")return!1;if(e!=="undefined"){var A=Number(i),t=parseFloat(i);return isNaN(A)||isNaN(t)?i:A}}var IIA={id:"jsonquery",name:"JSONQuery",description:` -

    - Enter a JSON Query function to filter, sort, or transform the data. - You can use functions like get, filter, - sort, pick, groupBy, uniq, etcetera. - Example query: filter(.age >= 18) -

    -`,createQuery:function(i,e){var{filter:A,sort:t,projection:n}=e,o=[];A&&A.path&&A.relation&&A.value&&o.push(["filter",[(a=A.relation,yM("1 ".concat(a," 1"))[0]),pw(A.path),dIA(A.value)]]);var a;return t&&t.path&&t.direction&&o.push(["sort",pw(t.path),t.direction==="desc"?"desc":"asc"]),n&&n.paths&&(n.paths.length>1?o.push(["pick",...n.paths.map(pw)]):o.push(["map",pw(n.paths[0])])),jO(["pipe",...o])},executeQuery:function(i,e,A){var t=_q(A,JSON)?i:(function(n){var o=A.stringify(n);return o!==void 0?JSON.parse(o):void 0})(i);return e.trim()!==""?VO(t,e):t}};function pw(i){return["get",...i]}var BIA=l1("");function hIA(i,e){Jt(e,!1);var A=870711,t=cA(""),n=K(e,"data",8);function o(r){if(!r||!r.raw)return"";var s=r.raw,l={};return s=s.replace(/\s(?:xml:)?id=["']?([^"')\s]+)/g,(g,C)=>{var d="fa-".concat((A+=1).toString(16));return l[C]=d,' id="'.concat(d,'"')}),s=s.replace(/#(?:([^'")\s]+)|xpointer\(id\((['"]?)([^')]+)\2\)\))/g,(g,C,d,B)=>{var u=C||B;return u&&l[u]?"#".concat(l[u]):g}),s}KA(()=>Y(n()),()=>{N(t,o(n()))}),Vn();var a=BIA();pq(gA(a),()=>c(t),!0),sA(i,a),Yt()}oi(` - .fa-icon.svelte-v67cny { - display: inline-block; - fill: currentColor; - } - .fa-flip-horizontal.svelte-v67cny { - transform: scale(-1, 1); - } - .fa-flip-vertical.svelte-v67cny { - transform: scale(1, -1); - } - .fa-spin.svelte-v67cny { - animation: svelte-v67cny-fa-spin 1s 0s infinite linear; - } - .fa-inverse.svelte-v67cny { - color: #fff; - } - .fa-pulse.svelte-v67cny { - animation: svelte-v67cny-fa-spin 1s infinite steps(8); - } - @keyframes svelte-v67cny-fa-spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } - } -`);var EIA=l1(""),QIA=l1(""),uIA=l1(""),pIA=l1("",1);function Bn(i,e){var A=Qw(e,["children","$$slots","$$events","$$legacy"]),t=Qw(A,["class","data","scale","spin","inverse","pulse","flip","label","style"]);Jt(e,!1);var n=K(e,"class",8,""),o=K(e,"data",8),a=cA(),r=K(e,"scale",8,1),s=K(e,"spin",8,!1),l=K(e,"inverse",8,!1),g=K(e,"pulse",8,!1),C=K(e,"flip",8,void 0),d=K(e,"label",8,""),B=K(e,"style",8,""),u=cA(10),E=cA(10),f=cA(),m=cA();function v(){var k=1;return r()!==void 0&&(k=Number(r())),isNaN(k)||k<=0?(console.warn('Invalid prop: prop "scale" should be a number over 0.'),1):1*k}function S(){return c(a)?Math.max(c(a).width,c(a).height)/16:1}KA(()=>(Y(o()),Y(B()),Y(r())),()=>{N(a,(function(k){var M;if(k){if(!("definition"in k)){if("iconName"in k&&"icon"in k){k.iconName;var[x,F,,,z]=k.icon;M={width:x,height:F,paths:(Array.isArray(z)?z:[z]).map(j=>({d:j}))}}else M=k[Object.keys(k)[0]];return M}console.error("`import faIconName from '@fortawesome/package-name/faIconName` not supported - Please use `import { faIconName } from '@fortawesome/package-name/faIconName'` instead")}})(o())),B(),r(),N(u,c(a)?c(a).width/S()*v():0),N(E,c(a)?c(a).height/S()*v():0),N(f,(function(){var k="";B()!==null&&(k+=B());var M=v();return M===1?k.length===0?"":k:(k===""||k.endsWith(";")||(k+="; "),"".concat(k,"font-size: ").concat(M,"em"))})()),N(m,c(a)?"0 0 ".concat(c(a).width," ").concat(c(a).height):"0 0 ".concat(c(u)," ").concat(c(E)))}),Vn(),di(),(function(k,M){var x=Qw(M,["children","$$slots","$$events","$$legacy"]),F=Qw(x,["class","width","height","box","spin","inverse","pulse","flip","style","label"]),z=K(M,"class",8,""),j=K(M,"width",8),X=K(M,"height",8),eA=K(M,"box",8,"0 0 0 0"),Z=K(M,"spin",8,!1),CA=K(M,"inverse",8,!1),wA=K(M,"pulse",8,!1),BA=K(M,"flip",8,"none"),QA=K(M,"style",8,""),RA=K(M,"label",8,""),dA=EIA();Lw(dA,()=>{var IA;return Fe(Fe({version:"1.1",class:"fa-icon ".concat((IA=z())!==null&&IA!==void 0?IA:""),width:j(),height:X(),"aria-label":RA(),role:RA()?"img":"presentation",viewBox:eA(),style:QA()},F),{},{[_h]:{"fa-spin":Z(),"fa-pulse":wA(),"fa-inverse":CA(),"fa-flip-horizontal":BA()==="horizontal","fa-flip-vertical":BA()==="vertical"}})},void 0,void 0,void 0,"svelte-v67cny"),ya(gA(dA),M,"default",{},null),sA(k,dA)})(i,t1({get label(){return d()},get width(){return c(u)},get height(){return c(E)},get box(){return c(m)},get style(){return c(f)},get spin(){return s()},get flip(){return C()},get inverse(){return l()},get pulse(){return g()},get class(){return n()}},()=>t,{children:(k,M)=>{var x=zi();ya(at(x),e,"default",{},F=>{var z=pIA(),j=at(z);Da(j,1,()=>(c(a),uA(()=>{var CA;return((CA=c(a))===null||CA===void 0?void 0:CA.paths)||[]})),Ka,(CA,wA)=>{var BA=QIA();Lw(BA,()=>Fe({},c(wA))),sA(CA,BA)});var X=kA(j);Da(X,1,()=>(c(a),uA(()=>{var CA;return((CA=c(a))===null||CA===void 0?void 0:CA.polygons)||[]})),Ka,(CA,wA)=>{var BA=uIA();Lw(BA,()=>Fe({},c(wA))),sA(CA,BA)});var eA=kA(X),Z=CA=>{hIA(CA,{get data(){return c(a)},set data(wA){N(a,wA)},$$legacy:!0})};zA(eA,CA=>{c(a),uA(()=>{var wA;return(wA=c(a))===null||wA===void 0?void 0:wA.raw})&&CA(Z)}),sA(F,z)}),sA(k,x)},$$slots:{default:!0}})),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-boolean-toggle.svelte-eli4ob { - padding: 0; - margin: 1px 0 0; - vertical-align: top; - display: inline-flex; - color: var(--jse-value-color-boolean, #ff8c00); -} - -.jse-boolean-toggle.svelte-eli4ob:not(.jse-readonly) { - cursor: pointer; -}`);var fIA=TA('
    ');function mIA(i,e){Jt(e,!1);var A=K(e,"path",9),t=K(e,"value",9),n=K(e,"readOnly",9),o=K(e,"onPatch",9),a=K(e,"focus",9);di(!0);var r,s=fIA(),l=gA(s),g=lt(()=>t()===!0?DM:vM);Bn(l,{get data(){return c(g)}}),Le(()=>{jn(s,"aria-checked",t()===!0),r=Ci(s,1,"jse-boolean-toggle svelte-eli4ob",null,r,{"jse-readonly":n()}),jn(s,"title",n()?"Boolean value ".concat(t()):"Click to toggle this boolean value")}),De("mousedown",s,function(C){C.stopPropagation(),n()||(o()([{op:"replace",path:xt(A()),value:!t()}]),a()())}),sA(i,s),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup, -.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup .picker_arrow::before, -.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup .picker_arrow::after { - background: var(--jse-color-picker-background, var(--jse-panel-background, #ebebeb)); - line-height: normal; -} -.jse-color-picker-popup.svelte-v77py2 .picker_slider, -.jse-color-picker-popup.svelte-v77py2 .picker_sl, -.jse-color-picker-popup.svelte-v77py2 .picker_editor input, -.jse-color-picker-popup.svelte-v77py2 .picker_sample, -.jse-color-picker-popup.svelte-v77py2 .picker_done button { - box-shadow: var(--jse-color-picker-border-box-shadow, #cbcbcb 0 0 0 1px); -} -.jse-color-picker-popup.svelte-v77py2 .picker_editor input { - background: var(--jse-background-color, #fff); - color: var(--jse-text-color, #4d4d4d); -} -.jse-color-picker-popup.svelte-v77py2 .picker_done button { - background: var(--jse-button-background, #e0e0e0); - color: var(--jse-button-color, var(--jse-text-color, #4d4d4d)); -} -.jse-color-picker-popup.svelte-v77py2 .picker_done button:hover { - background: var(--jse-button-background-highlight, #e7e7e7); -}`);var wIA=TA('
    ');function yIA(i,e){Jt(e,!1);var A=K(e,"color",8),t=K(e,"onChange",8),n=K(e,"showOnTop",8),o=cA(),a=()=>{};os(Xt(function*(){var s,l=new((s=yield import("./chunk-HTWWQBR6.js"))===null||s===void 0?void 0:s.default)({parent:c(o),color:A(),popup:n()?"top":"bottom",onDone(g){var C=g.rgba[3]===1?g.hex.substring(0,7):g.hex;t()(C)}});l.show(),a=()=>{l.destroy()}})),Dg(()=>{a()}),di();var r=wIA();ta(r,s=>N(o,s),()=>c(o)),sA(i,r),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-color-picker-button.svelte-13mgyo6 { - font-size: var(--jse-font-size-mono, 14px); - width: var(--jse-color-picker-button-size, 1em); - height: var(--jse-color-picker-button-size, 1em); - box-sizing: border-box; - padding: 0; - margin: 2px 0 0 calc(0.5 * var(--jse-padding, 10px)); - display: inline-flex; - vertical-align: top; - border: 1px solid var(--jse-text-color, #4d4d4d); - border-radius: 2px; - background: inherit; - outline: none; -} - -.jse-color-picker-button.svelte-13mgyo6:not(.jse-readonly) { - cursor: pointer; -}`);var DIA=TA('');function vIA(i,e){Jt(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),{openAbsolutePopup:n}=s1("absolute-popup"),o=K(e,"path",9),a=K(e,"value",9),r=K(e,"readOnly",9),s=K(e,"onPatch",9),l=K(e,"focus",9);function g(u){s()([{op:"replace",path:xt(o()),value:u}]),C()}function C(){l()()}KA(()=>Y(a()),()=>{N(A,vq(a()))}),KA(()=>(Y(r()),Y(a())),()=>{N(t,r()?"Color ".concat(a()):"Click to open a color picker")}),Vn(),di(!0);var d,B=DIA();Le(()=>{var u;d=Ci(B,1,"jse-color-picker-button svelte-13mgyo6",null,d,{"jse-readonly":r()}),wg(B,"background: ".concat((u=c(A))!==null&&u!==void 0?u:"")),jn(B,"title",c(t)),jn(B,"aria-label",c(t))}),De("click",B,function(u){var E,f;if(!r()){var m=u.target,v=m.getBoundingClientRect().top,S=((E=(f=Ip(m))===null||f===void 0?void 0:f.innerHeight)!==null&&E!==void 0?E:0)-v<300&&v>300,k={color:a(),onChange:g,showOnTop:S};n(yIA,k,{anchor:m,closeOnOuterClick:!0,onClose:C,offsetTop:18,offsetLeft:-8,height:300})}}),sA(i,B),Yt()}var a_=1e3,Z4=100,fw=100,jw=2e4,Jh=[{start:0,end:Z4}],bIA=1048576,MIA=1048576,r_=10485760,s_="Insert or paste contents, enter [ insert a new array, enter { to insert a new object, or start typing to insert a new value",Ix="Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)",Ud="hover-insert-inside",mw="hover-insert-after",Fj="hover-collection",l_="valid",Lj="repairable",wC=336,yC=260,J4=100,Gj={[pg.asc]:"ascending",[pg.desc]:"descending"};function Tq(i){for(var e=rF(i,r=>r.start),A=[e[0]],t=0;t0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"array",expanded:i,visibleSections:Jh,items:[]}}function Ex(){var{expanded:i}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"object",expanded:i,properties:{}}}var Qx={createObjectDocumentState:Ex,createArrayDocumentState:hx,createValueDocumentState:function(){return{type:"value"}}};function Jq(i,e,A,t){var{createObjectDocumentState:n,createArrayDocumentState:o,createValueDocumentState:a}=t;return(function r(s,l,g){if(Array.isArray(s)){var C=cr(l)?l:o();if(g.length===0)return C;var d=Or(g[0]),B=r(s[d],C.items[d],g.slice(1));return qr(C,["items",g[0]],B)}if(Jn(s)){var u=Il(l)?l:n();if(g.length===0)return u;var E=g[0],f=r(s[E],u.properties[E],g.slice(1));return qr(u,["properties",E],f)}return Bx(l)?l:a()})(i,e,A)}function Tl(i,e){return X4(i,e,arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],(A,t)=>{if(A!==void 0&&t!==void 0)return Array.isArray(A)?cr(t)?t:hx({expanded:!!iI(t)&&t.expanded}):Jn(A)?Il(t)?t:Ex({expanded:!!iI(t)&&t.expanded}):Bx(t)?t:void 0},()=>!0)}function X4(i,e,A,t,n){var o=t(i,e,A);if(Array.isArray(i)&&cr(o)&&n(o)){var a=[];return ux(i,o.visibleSections,s=>{var l=A.concat(String(s)),g=X4(i[s],o.items[s],l,t,n);g!==void 0&&(a[s]=g)}),Mj(a,o.items)?o:Fe(Fe({},o),{},{items:a})}if(Jn(i)&&Il(o)&&n(o)){var r={};return Object.keys(i).forEach(s=>{var l=A.concat(s),g=X4(i[s],o.properties[s],l,t,n);g!==void 0&&(r[s]=g)}),Mj(Object.values(r),Object.values(o.properties))?o:Fe(Fe({},o),{},{properties:r})}return o}function ux(i,e,A){e.forEach(t=>{var{start:n,end:o}=t;bq(n,Math.min(i.length,o),A)})}function $4(i,e){for(var A=i,t=[],n=0;n{var C=iI(g)&&!g.expanded?Fe(Fe({},g),{},{expanded:!0}):g;return cr(C)?(function(d,B){if((function(f,m){return f.some(v=>m>=v.start&&m(function(l,g,C,d){return X4(l,g,C,(B,u,E)=>Array.isArray(B)&&d(E)?cr(u)?u.expanded?u:Fe(Fe({},u),{},{expanded:!0}):hx({expanded:!0}):Jn(B)&&d(E)?Il(u)?u.expanded?u:Fe(Fe({},u),{},{expanded:!0}):Ex({expanded:!0}):u,B=>iI(B)&&B.expanded)})(r,s,[],t))}function Hj(i,e,A,t){return AE(i,e,A,(n,o)=>t?(function(a,r,s){return X4(a,r,s,(l,g)=>zj(g),()=>!0)})(n,o,A):zj(o))}function zj(i){return cr(i)&&i.expanded?Fe(Fe({},i),{},{expanded:!1,visibleSections:Jh}):Il(i)&&i.expanded?Fe(Fe({},i),{},{expanded:!1}):i}function Yq(i,e,A){var t={json:i,documentState:e},n=A.reduce((o,a)=>({json:ol(o.json,[a]),documentState:RIA(o.json,o.documentState,a)}),t);return{json:n.json,documentState:Tl(n.json,n.documentState)}}function RIA(i,e,A){if(oM(A))return Pj(i,e,A,void 0);if(aM(A))return jj(i,e,A);if(B6(A)){var t=al(i,A.path),n=m0(i,e,t);return n?I5(i,e,t,{type:"value",enforceString:n}):e}return h6(A)||u2(A)?(function(o,a,r){if(u2(r)&&r.from===r.path)return a;var s=a,l=al(o,r.from),g=Q0(o,s,l);return u2(r)&&(s=jj(o,s,{path:r.from})),s=Pj(o,s,{path:r.path},g),s})(i,e,A):e}function Q0(i,e,A){try{return $e(e,$4(i,A))}catch(t){return}}function px(i,e,A,t,n){var o=Jq(i,e,A,n);return Su(o,$4(i,A),a=>{var r=$e(i,A);return t(r,a)})}function I5(i,e,A,t){return(function(n,o,a,r,s){var l=Jq(n,o,a,s);return qr(l,$4(n,a),r)})(i,e,A,t,Qx)}function AE(i,e,A,t){return px(i,e,A,t,Qx)}function Pj(i,e,A,t){var n=al(i,A.path),o=e;return o=AE(i,o,an(n),(a,r)=>{if(!cr(r))return r;var s=Or(Ji(n)),{items:l,visibleSections:g}=r;return Fe(Fe({},r),{},{items:s{if(!cr(r))return r;var s=Or(Ji(t)),{items:l,visibleSections:g}=r;return Fe(Fe({},r),{},{items:l.slice(0,s).concat(l.slice(s+1)),visibleSections:Hq(g,s,-1)})}):(function(a,r,s){var l=$4(a,s);return Fr(r,l)?cd(r,$4(a,s)):r})(i,e,t)}function Hq(i,e,A){return(function(t){for(var n=t.slice(0),o=1;o({start:t.start>e?t.start+A:t.start,end:t.end>e?t.end+A:t.end})))}function m0(i,e,A){var t,n=$e(i,A),o=Q0(i,e,A),a=Bx(o)?o.enforceString:void 0;return typeof a=="boolean"?a:typeof(t=n)=="string"&&typeof cE(t,JSON)!="string"}function hp(i,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],t=i.indexOf(e);return t!==-1?A?i.slice(t):i.slice(t+1):[]}function fx(i,e){var A=[];return(function t(n,o,a){A.push(a),sa(n)&&cr(o)&&o.expanded&&ux(n,o.visibleSections,r=>{t(n[r],o.items[r],a.concat(String(r)))}),Ea(n)&&Il(o)&&o.expanded&&Object.keys(n).forEach(r=>{t(n[r],o.properties[r],a.concat(r))})})(i,e,[]),A}function zq(i,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],t=[];return(function n(o,a){t.push({path:a,type:hc.value});var r=Q0(i,e,a);if(o&&iI(r)&&r.expanded){if(A&&t.push({path:a,type:hc.inside}),sa(o)){var s=cr(r)?r.visibleSections:Jh;ux(o,s,l=>{var g=a.concat(String(l));n(o[l],g),A&&t.push({path:g,type:hc.after})})}Ea(o)&&Object.keys(o).forEach(l=>{var g=a.concat(l);t.push({path:g,type:hc.key}),n(o[l],g),A&&t.push({path:g,type:hc.after})})}})(i,[]),t}function g_(i,e,A){var t=fx(i,e),n=t.map(xt).indexOf(xt(A));if(n!==-1&&n3&&arguments[3]!==void 0?arguments[3]:10240;return Bc(i,e,A,ZdA({json:$e(i,A)},t)?Y4:mx)}function c_(i,e,A){var t=Q0(i,e,A);return iI(t)&&t.expanded?e:nI(i,e,A)}function Y4(i){return i.length===0||i.length===1&&i[0]==="0"}function K_(i){return i.length===0}function mx(){return!0}function Kw(){return!1}function hl(i){return i&&i.type===fo.after||!1}function nr(i){return i&&i.type===fo.inside||!1}function Cr(i){return i&&i.type===fo.key||!1}function bn(i){return i&&i.type===fo.value||!1}function bo(i){return i&&i.type===fo.multi||!1}function B5(i){return bo(i)&&Ui(i.focusPath,i.anchorPath)}function Ap(i){return bo(i)||hl(i)||nr(i)||Cr(i)||bn(i)}function C_(i){return i&&i.type===fo.text||!1}function a1(i,e){var A=[];return(function(t,n,o){if(n){var a=qd(n),r=Qt(n);if(Ui(a,r))return o(a);if(t!==void 0){var s=jq(a,r);if(a.length===s.length||r.length===s.length)return o(s);var l=vs(a,r),g=DC(t,l),C=n1(t,l),d=kC(t,l,g),B=kC(t,l,C);if(!(d===-1||B===-1)){var u=$e(t,s);if(Ea(u)){for(var E=Object.keys(u),f=d;f<=B;f++){var m=o(s.concat(E[f]));if(m!==void 0)return m}return}if(sa(u)){for(var v=d;v<=B;v++){var S=o(s.concat(String(v)));if(S!==void 0)return S}return}throw new Error("Failed to create selection")}}}})(i,e,t=>{A.push(t)}),A}function Pq(i){return nr(i)?i.path:an(Qt(i))}function DC(i,e){if(!bo(e))return e.path;var A=kC(i,e,e.anchorPath);return kC(i,e,e.focusPath)A?e.focusPath:e.anchorPath}function Vj(i,e,A){var t=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(A){var n=t?Qt(A):DC(i,A),o=(function(s,l,g){var C=fx(s,l),d=C.map(xt),B=xt(g),u=d.indexOf(B);if(u!==-1&&u>0)return C[u-1]})(i,e,n);if(t)return nr(A)||hl(A)?o!==void 0?vs(n,n):void 0:o!==void 0?vs(qd(A),o):void 0;if(hl(A)||nr(A))return en(n);if(Cr(A)){if(o===void 0||o.length===0)return;var a=an(o),r=$e(i,a);return Array.isArray(r)||An(o)?en(o):NC(o)}return bn(A),o!==void 0?en(o):void 0}}function qj(i,e,A,t){if(!A)return{caret:void 0,previous:void 0,next:void 0};var n=zq(i,e,t),o=n.findIndex(a=>Ui(a.path,Qt(A))&&String(a.type)===String(A.type));return{caret:o!==-1?n[o]:void 0,previous:o!==-1&&o>0?n[o-1]:void 0,next:o!==-1&&oA[t].length;)t++;var n=A[t];return n===void 0||n.length===0||Array.isArray($e(i,an(n)))?en(n):NC(n)}function eE(i,e){if(e.length===1){var A=Tc(e);if(A.op==="replace")return en(al(i,A.path))}if(!An(e)&&e.every(a=>a.op==="move")){var t=Tc(e),n=e.slice(1);if((h6(t)||u2(t))&&t.from!==t.path&&n.every(a=>(h6(a)||u2(a))&&a.from===a.path))return NC(al(i,t.path))}var o=e.filter(a=>a.op!=="test"&&a.op!=="remove"&&(a.op!=="move"||a.from!==a.path)&&typeof a.path=="string").map(a=>al(i,a.path));if(!An(o))return{type:fo.multi,anchorPath:Tc(o),focusPath:Ji(o)}}function jq(i,e){for(var A=0;AA.length&&e.length>A.length;return{type:fo.multi,anchorPath:t?A.concat(i[A.length]):A,focusPath:t?A.concat(e[A.length]):A}}function Vq(i,e,A,t){if(Cr(e))return String(Ji(e.path));if(bn(e)){var n=$e(i,e.path);return typeof n=="string"?n:t.stringify(n,null,A)}if(bo(e)){if(An(e.focusPath))return t.stringify(i,null,A);var o=Pq(e),a=$e(i,o);if(Array.isArray(a)){if(B5(e)){var r=$e(i,e.focusPath);return t.stringify(r,null,A)}return a1(i,e).map(s=>{var l=$e(i,s);return"".concat(t.stringify(l,null,A),",")}).join(` -`)}return a1(i,e).map(s=>{var l=Ji(s),g=$e(i,s);return"".concat(t.stringify(l),": ").concat(t.stringify(g,null,A),",")}).join(` -`)}}function gr(i){return(Cr(i)||bn(i))&&i.edit===!0}function Lh(i){return Cr(i)||bn(i)||bo(i)}function ww(i){return Cr(i)||bn(i)||B5(i)}function U_(i){switch(i.type){case hc.key:return NC(i.path);case hc.value:return en(i.path);case hc.after:return SC(i.path);case hc.inside:return FC(i.path)}}function Zj(i,e){switch(i){case fo.key:return NC(e);case fo.value:return en(e);case fo.after:return SC(e);case fo.inside:return FC(e);case fo.multi:case fo.text:return vs(e,e)}}function yw(i,e,A){if(e)return ep(i,e,A)||v0(bo(e)?an(e.focusPath):e.path,A)?e:void 0}function ep(i,e,A){if(i===void 0||!e)return!1;if(Cr(e)||nr(e)||hl(e))return Ui(e.path,A);if(bn(e))return v0(A,e.path);if(bo(e)){var t=DC(i,e),n=n1(i,e),o=an(e.focusPath);if(!v0(A,o)||A.length<=o.length)return!1;var a=kC(i,e,t),r=kC(i,e,n),s=kC(i,e,A);return s!==-1&&s>=a&&s<=r}return!1}function kC(i,e,A){var t=an(e.focusPath);if(!v0(A,t)||A.length<=t.length)return-1;var n=A[t.length],o=$e(i,t);if(Ea(o))return Object.keys(o).indexOf(n);if(sa(o)){var a=Or(n);if(a');function Wq(i,e){Jt(e,!1);var A=dr("jsoneditor:EditableDiv"),t=K(e,"value",9),n=K(e,"initialValue",9),o=K(e,"shortText",9,!1),a=K(e,"label",9),r=K(e,"onChange",9),s=K(e,"onCancel",9),l=K(e,"onFind",9),g=K(e,"onPaste",9,Fa),C=K(e,"onValueClass",9,()=>""),d=cA(void 0,!0),B=cA(void 0,!0),u=!1;function E(){return c(d)?(function(v){return v.replace(/\n$/,"")})(c(d).innerText):""}function f(v){c(d)&&Ol(d,c(d).innerText=$h(v))}os(()=>{A("onMount",{value:t(),initialValue:n()}),f(n()!==void 0?n():t()),c(d)&&(function(v){if(v.firstChild!=null){var S=document.createRange(),k=window.getSelection();S.setStart(v,1),S.collapse(!0),k?.removeAllRanges(),k?.addRange(S)}else v.focus()})(c(d))}),Dg(()=>{var v=E();A("onDestroy",{closed:u,value:t(),newValue:v}),u||v===t()||r()(v,i1.no)}),KA(()=>(Y(C()),Y(t())),()=>{N(B,C()(t()))}),Vn(),di(!0);var m=NIA();ta(m,v=>N(d,v),()=>c(d)),Le(v=>{jn(m,"aria-label",a()),Ci(m,1,v,"svelte-1r0oryi")},[()=>o1((Y(wc),c(B),Y(o()),uA(()=>wc("jse-editable-div",c(B),{"jse-short-text":o()}))))]),De("input",m,function(){var v=E();v===""&&f(""),N(B,C()(v))}),De("keydown",m,function(v){v.stopPropagation();var S=RC(v);if(S==="Escape"&&(v.preventDefault(),u=!0,s()()),S==="Enter"||S==="Tab"){v.preventDefault(),u=!0;var k=E();r()(k,i1.nextInside)}S==="Ctrl+F"&&(v.preventDefault(),l()(!1)),S==="Ctrl+H"&&(v.preventDefault(),l()(!0))}),De("paste",m,function(v){if(v.stopPropagation(),g()&&v.clipboardData){var S=v.clipboardData.getData("text/plain");g()(S)}}),De("blur",m,function(){var v=document.hasFocus(),S=E();A("handleBlur",{hasFocus:v,closed:u,value:t(),newValue:S}),document.hasFocus()&&!u&&(u=!0,S!==t()&&r()(S,i1.self))}),sA(i,m),Yt()}function FIA(i,e){Jt(e,!1);var A=K(e,"path",9),t=K(e,"value",9),n=K(e,"selection",9),o=K(e,"mode",9),a=K(e,"parser",9),r=K(e,"normalization",9),s=K(e,"enforceString",9),l=K(e,"onPatch",9),g=K(e,"onPasteJson",9),C=K(e,"onSelect",9),d=K(e,"onFind",9),B=K(e,"focus",9),u=K(e,"findNextInside",9);function E(S){return s()?S:cE(S,a())}function f(){C()(en(A())),B()()}di(!0);var m=lt(()=>(Y(r()),Y(t()),uA(()=>r().escapeValue(t())))),v=lt(()=>(Y(gr),Y(n()),uA(()=>gr(n())?n().initialValue:void 0)));Wq(i,{get value(){return c(m)},get initialValue(){return c(v)},label:"Edit value",onChange:function(S,k){l()([{op:"replace",path:xt(A()),value:E(r().unescapeValue(S))}],(M,x,F)=>{if(!F||Ui(A(),Qt(F)))return{state:x,selection:k===i1.nextInside?u()(A()):en(A())}}),B()()},onCancel:f,onPaste:function(S){try{var k=a().parse(S);ua(k)&&g()({path:A(),contents:k,onPasteAsJson:()=>{f();var M=[{op:"replace",path:xt(A()),value:k}];l()(M,(x,F)=>({state:nI(x,F,A())}))}})}catch(M){}},get onFind(){return d()},onValueClass:function(S){return qq(E(r().unescapeValue(S)),o(),a())}}),Yt()}function Gh(i,e,A){var t=an(e),n=$e(i,t);if(sa(n)){var o=Or(Ji(e));return A.map((l,g)=>({op:"add",path:xt(t.concat(String(o+g))),value:l.value}))}if(Ea(n)){var a=Ji(e),r=Object.keys(n),s=a!==void 0?hp(r,a,!0):[];return[...A.map(l=>{var g=Bp(l.key,r);return{op:"add",path:xt(t.concat(g)),value:l.value}}),...s.map(l=>r1(t,l))]}throw new Error("Cannot create insert operations: parent must be an Object or Array")}function T_(i,e,A){var t=$e(i,e);if(Array.isArray(t)){var n=t.length;return A.map((o,a)=>({op:"add",path:xt(e.concat(String(n+a))),value:o.value}))}return A.map(o=>{var a=Bp(o.key,Object.keys(t));return{op:"add",path:xt(e.concat(a)),value:o.value}})}function Ep(i,e,A,t){var n=e.filter(r=>r!==A),o=Bp(t,n),a=hp(e,A,!1);return[{op:"move",from:xt(i.concat(A)),path:xt(i.concat(o))},...a.map(r=>r1(i,r))]}function Zq(i,e){var A=Ji(e);if(An(A))throw new Error("Cannot duplicate root object");var t=an(A),n=Ji(A),o=$e(i,t);if(sa(o)){var a=Ji(e),r=a?Or(Ji(a))+1:0;return[...e.map((g,C)=>({op:"copy",from:xt(g),path:xt(t.concat(String(C+r)))}))]}if(Ea(o)){var s=Object.keys(o),l=n!==void 0?hp(s,n,!1):[];return[...e.map(g=>{var C=Bp(Ji(g),s);return{op:"copy",from:xt(g),path:xt(t.concat(C))}}),...l.map(g=>r1(t,g))]}throw new Error("Cannot create duplicate operations: parent must be an Object or Array")}function Xq(i,e){if(bn(e))return[{op:"move",from:xt(e.path),path:""}];if(!bo(e))throw new Error("Cannot create extract operations: parent must be an Object or Array");var A=an(e.focusPath),t=$e(i,A);if(sa(t)){var n=a1(i,e).map(a=>{var r=Or(Ji(a));return t[r]});return[{op:"replace",path:"",value:n}]}if(Ea(t)){var o={};return a1(i,e).forEach(a=>{var r=String(Ji(a));o[r]=t[r]}),[{op:"replace",path:"",value:o}]}throw new Error("Cannot extract: unsupported type of selection "+JSON.stringify(e))}function $q(i,e,A,t){if(Cr(e)){var n=Mq(A,t),o=an(e.path),a=$e(i,o);return Ep(o,Object.keys(a),Ji(e.path),typeof n=="string"?n:A)}if(bn(e)||bo(e)&&An(e.focusPath))try{return[{op:"replace",path:xt(Qt(e)),value:dp(A,x=>Cp(x,t))}]}catch(x){return[{op:"replace",path:xt(Qt(e)),value:A}]}if(bo(e)){var r=d_(A,t);return(function(x,F,z){var j=Tc(F),X=an(j),eA=$e(x,X);if(sa(eA)){var Z=Tc(F),CA=Z?Or(Ji(Z)):0;return[...Xw(F),...z.map((qA,ue)=>({op:"add",path:xt(X.concat(String(ue+CA))),value:qA.value}))]}if(Ea(eA)){var wA=Ji(F),BA=an(wA),QA=Ji(wA),RA=Object.keys(eA),dA=QA!==void 0?hp(RA,QA,!1):[],IA=new Set(F.map(qA=>Ji(qA))),xA=RA.filter(qA=>!IA.has(qA));return[...Xw(F),...z.map(qA=>{var ue=Bp(qA.key,xA);return{op:"add",path:xt(BA.concat(ue)),value:qA.value}}),...dA.map(qA=>r1(BA,qA))]}throw new Error("Cannot create replace operations: parent must be an Object or Array")})(i,a1(i,e),r)}if(hl(e)){var s=d_(A,t),l=e.path,g=an(l),C=$e(i,g);if(sa(C)){var d=Or(Ji(l));return Gh(i,g.concat(String(d+1)),s)}if(Ea(C)){var B=String(Ji(l)),u=Object.keys(C);if(An(u)||Ji(u)===B)return T_(i,g,s);var E=u.indexOf(B),f=u[E+1];return Gh(i,g.concat(f),s)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}if(nr(e)){var m=d_(A,t),v=e.path,S=$e(i,v);if(sa(S))return Gh(i,v.concat("0"),m);if(Ea(S)){var k=Object.keys(S);if(An(k))return T_(i,v,m);var M=Tc(k);return Gh(i,v.concat(M),m)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}throw new Error("Cannot insert: unsupported type of selection "+JSON.stringify(e))}function Xw(i){return i.map(e=>({op:"remove",path:xt(e)})).reverse()}function r1(i,e){return{op:"move",from:xt(i.concat(e)),path:xt(i.concat(e))}}function d_(i,e){var A=/^\s*{/.test(i),t=/^\s*\[/.test(i),n=Mq(i,e),o=n!==void 0?n:dp(i,a=>Cp(a,e));return A&&Jn(o)||t&&Array.isArray(o)?[{key:"New item",value:o}]:Array.isArray(o)?o.map((a,r)=>({key:"New item "+r,value:a})):Jn(o)?Object.keys(o).map(a=>({key:a,value:o[a]})):[{key:"New item",value:o}]}function AW(i,e){if(Cr(e)){var A=an(e.path),t=$e(i,A),n=Ep(A,Object.keys(t),Ji(e.path),"");return{operations:n,newSelection:eE(i,n)}}if(bn(e))return{operations:[{op:"replace",path:xt(e.path),value:""}],newSelection:e};if(bo(e)){var o=a1(i,e),a=Xw(o),r=Ji(o);if(An(r))return{operations:[{op:"replace",path:"",value:""}],newSelection:en([])};var s=an(r),l=$e(i,s);if(sa(l)){var g=Tc(o),C=Or(Ji(g));return{operations:a,newSelection:C===0?FC(s):SC(s.concat(String(C-1)))}}if(Ea(l)){var d=Object.keys(l),B=Tc(o),u=Ji(B),E=d.indexOf(u),f=d[E-1];return{operations:a,newSelection:E===0?FC(s):SC(s.concat(f))}}throw new Error("Cannot create remove operations: parent must be an Object or Array")}throw new Error("Cannot remove: unsupported type of selection "+JSON.stringify(e))}function eW(i,e){var A=(function(t,n){if(An(n)||!n.every(u2))return n;var o=[];for(var a of n){var r=Xj(ms(a.from)),s=Xj(ms(a.path));if(!r||!s)return n;o.push({from:r,path:s,operation:a})}var l=o[0].path.parent,g=$e(t,l);if(!Ea(g)||!o.every(u=>(function(E,f){return Ui(E.from.parent,f)&&Ui(E.path.parent,f)})(u,l)))return n;var C=(function(u,E){var f=Object.keys(E),m=f.slice();for(var v of u){var S=m.indexOf(v.from.key);S!==-1&&(m.splice(S,1),m.push(v.path.key))}for(var k=0;ku.operation,B=o.filter(u=>u.operation.from!==u.operation.path);return B.some(u=>u.path.key===C)?B.map(d):[r1(l,C),...B.map(d)]})(i,e);return E6(i,A,{before:(t,n,o)=>{if(aM(n)){var a=ms(n.path);return{revertOperations:[...o,...I_(t,a)]}}if(u2(n)){var r=ms(n.from);return{revertOperations:n.from===n.path?[n,...I_(t,r)]:[...o,...I_(t,r)]}}return{document:t}}})}function Xj(i){return i.length>0?{parent:an(i),key:Ji(i)}:void 0}function I_(i,e){var A=an(e),t=Ji(e),n=$e(i,A);return Ea(n)?hp(Object.keys(n),t,!1).map(o=>r1(A,o)):[]}function $j(i){var e=i.activeIndex0?0:-1,A=i.items[e],t=i.items.map((n,o)=>Fe(Fe({},n),{},{active:o===e}));return Fe(Fe({},i),{},{items:t,activeItem:A,activeIndex:e})}function AV(i,e){var A,t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.toLowerCase(),o=(A=t?.maxResults)!==null&&A!==void 0?A:1/0,a=t?.columns,r=[],s=[];function l(f){r.length>=o||r.push(f)}function g(f,m){if(sa(m)){var v=s.length;s.push("0");for(var S=0;S=o)return;s.pop()}else if(Ea(m)){var k=Object.keys(m),M=s.length;for(var x of(s.push(""),k))if(s[M]=x,eV(x,f,s,Qc.key,l),g(f,m[x]),r.length>=o)return;s.pop()}else eV(String(m),f,s,Qc.value,l)}if(i==="")return[];if(a){if(!Array.isArray(e))throw new Error("json must be an Array when option columns is defined");for(var C=0;Cu.length+1;)s.pop();g(n,$e(d,u))}if(r.length>=o)break}return r}return g(n,e),r}function eV(i,e,A,t,n){var o=i.toLowerCase(),a=0,r=-1,s=-1;do(s=o.indexOf(e,r))!==-1&&(r=s+e.length,n({path:A.slice(0),field:t,fieldIndex:a,start:s,end:r}),a++);while(s!==-1)}function O_(i,e,A,t){return i.substring(0,A)+e+i.substring(t)}function tV(i,e,A){var t=i;return tF(A,n=>{t=O_(t,e,n.start,n.end)}),t}function LIA(i,e,A,t,n){var{field:o,path:a,start:r,end:s}=t;if(o===Qc.key){var l=an(a),g=$e(i,l),C=Ji(a),d=Ep(l,Object.keys(g),C,O_(C,A,r,s));return{newSelection:eE(i,d),operations:d}}if(o===Qc.value){var B=$e(i,a);if(B===void 0)throw new Error("Cannot replace: path not found ".concat(xt(a)));var u=typeof B=="string"?B:String(B),E=m0(i,e,a),f=O_(u,A,r,s),m=[{op:"replace",path:xt(a),value:E?f:cE(f,n)}];return{newSelection:eE(i,m),operations:m}}throw new Error("Cannot replace: unknown type of search result field ".concat(o))}function iV(i){return i.path.concat(i.field,String(i.fieldIndex))}function nV(i){var e=Oq(i)?i.searchResults.filter(A=>A.field===Qc.key):void 0;return e&&e.length>0?e:void 0}function oV(i){var e=Oq(i)?i.searchResults.filter(A=>A.field===Qc.value):void 0;return e&&e.length>0?e:void 0}var GIA={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function tW(i,e){return e.reduce((A,t)=>(function(n,o,a,r){return px(n,o,a,r,GIA)})(i,A,t.path,(n,o)=>Fe(Fe({},o),{},{searchResults:o.searchResults?o.searchResults.concat(t):[t]})),void 0)}function $w(i){var e,A=(e=i?.searchResults)!==null&&e!==void 0?e:[],t=Il(i)?Object.values(i.properties).flatMap($w):cr(i)?i.items.flatMap($w):[];return A.concat(t)}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-highlight.svelte-19qyvy6 { - background-color: var(--jse-search-match-color, #ffe665); - outline: var(--jse-search-match-outline, none); -} -.jse-highlight.jse-active.svelte-19qyvy6 { - background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); - outline: var(--jse-search-match-outline, 2px solid #e0be00); -}`);var KIA=TA(" ");function iW(i,e){Jt(e,!1);var A=cA(),t=K(e,"text",8),n=K(e,"searchResultItems",8);KA(()=>(Y(t()),Y(n())),()=>{N(A,(function(a,r){var s=[],l=0;for(var g of r){var C=a.slice(l,g.start);C!==""&&s.push({resultIndex:void 0,type:"normal",text:C,active:!1});var d=a.slice(g.start,g.end);s.push({resultIndex:g.resultIndex,type:"highlight",text:d,active:g.active}),l=g.end}var B=Ji(r);return B&&B.endc(A),Ka,(a,r)=>{var s=zi(),l=at(s),g=d=>{var B=mr();Le(()=>Ht(B,(c(r),uA(()=>c(r).text)))),sA(d,B)},C=d=>{var B,u=KIA(),E=gA(u);Le((f,m)=>{B=Ci(u,1,"jse-highlight svelte-19qyvy6",null,B,{"jse-active":c(r).active}),jn(u,"data-search-result-index",f),Ht(E,m)},[()=>(c(r),uA(()=>String(c(r).resultIndex))),()=>(Y($h),c(r),uA(()=>$h(c(r).text)))]),sA(d,u)};zA(l,d=>{c(r),uA(()=>c(r).type==="normal")?d(g):d(C,!1)}),sA(a,s)}),sA(i,o),Yt()}function Uw(i){var e=1e3;if(i<900)return i.toFixed()+" B";var A=i/e;if(A<900)return A.toFixed(1)+" KB";var t=A/e;if(t<900)return t.toFixed(1)+" MB";var n=t/e;return n<900?n.toFixed(1)+" GB":(n/e).toFixed(1)+" TB"}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-tag.svelte-ubve9r { - border: none; - font-size: 80%; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); - background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - border-radius: 2px; - cursor: pointer; - display: inline-block; - padding: 0 4px; - line-height: normal; - margin: 1px 0; -} -.jse-tag.svelte-ubve9r:hover { - opacity: 0.8; -} -.jse-tag.disabled.svelte-ubve9r { - opacity: 0.7; - cursor: inherit; -}`);var UIA=TA('');function Tw(i,e){Jt(e,!0);var A,t=Bl(()=>e.onclick?o=>{o.preventDefault(),o.stopPropagation(),e.onclick()}:void 0),n=UIA();n.__click=function(){for(var o,a=arguments.length,r=new Array(a),s=0;s2?r-2:0),l=2;l{var C,d=(C=a())!==null&&C!==void 0?C:null;g.ensure(d,d&&(B=>d(B,...s)))},Zd)})(gA(n),()=>{var o;return(o=e.children)!==null&&o!==void 0?o:CdA}),Le(()=>A=Ci(n,1,"jse-tag svelte-ubve9r",null,A,{disabled:!e.onclick})),sA(i,n),Yt()}cp(["click"]);oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-value.jse-string.svelte-1saqp8c { - color: var(--jse-value-color-string, #008000); -} -.jse-value.jse-object.svelte-1saqp8c, .jse-value.jse-array.svelte-1saqp8c { - min-width: 16px; - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); -} -.jse-value.jse-number.svelte-1saqp8c { - color: var(--jse-value-color-number, #ee422e); -} -.jse-value.jse-boolean.svelte-1saqp8c { - color: var(--jse-value-color-boolean, #ff8c00); -} -.jse-value.jse-null.svelte-1saqp8c { - color: var(--jse-value-color-null, #004ed0); -} -.jse-value.jse-invalid.svelte-1saqp8c { - color: var(--jse-text-color, #4d4d4d); -} -.jse-value.jse-url.svelte-1saqp8c { - color: var(--jse-value-color-url, #008000); - text-decoration: underline; -} - -.jse-value.svelte-1saqp8c { - display: inline-block; - min-width: 2em; - padding: 0 5px; - box-sizing: border-box; - outline: none; - border-radius: 1px; - vertical-align: top; - word-break: normal; - overflow-wrap: anywhere; - white-space: pre-wrap; -} -.jse-value.jse-table-cell.svelte-1saqp8c { - overflow-wrap: normal; - white-space: nowrap; -} -.jse-value.jse-empty.svelte-1saqp8c { - min-width: 4em; - outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - -moz-outline-radius: 2px; -} -.jse-value.jse-empty.svelte-1saqp8c::after { - pointer-events: none; - color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - content: "value"; -}`);var TIA=TA('
    ');function OIA(i,e){Jt(e,!0);var A=EC(!0),t=Bl(()=>c(A)&&typeof e.value=="string"&&e.value.length>e.truncateTextSize&&(!e.searchResultItems||!e.searchResultItems.some(B=>B.active&&B.end>e.truncateTextSize))),n=Bl(()=>c(t)&&typeof e.value=="string"?e.value.substring(0,e.truncateTextSize).trim():e.value),o=Bl(()=>d5(e.value));function a(){N(A,!1)}var r=TIA();r.__click=function(B){typeof e.value=="string"&&c(o)&&dx(B)&&(B.preventDefault(),B.stopPropagation(),window.open(e.value,"_blank"))},r.__dblclick=function(B){e.readOnly||(B.preventDefault(),e.onSelect(Zw(e.path)))};var s=gA(r),l=B=>{var u=Bl(()=>e.normalization.escapeValue(c(n)));iW(B,{get text(){return c(u)},get searchResultItems(){return e.searchResultItems}})},g=B=>{var u=mr();Le(E=>Ht(u,E),[()=>$h(e.normalization.escapeValue(c(n)))]),sA(B,u)};zA(s,B=>{e.searchResultItems?B(l):B(g,!1)});var C=kA(s,2),d=B=>{Tw(B,{onclick:a,children:(u,E)=>{var f=mr();Le(m=>Ht(f,"Show more (".concat(m??"",")")),[()=>Uw(e.value.length)]),sA(u,f)},$$slots:{default:!0}})};zA(C,B=>{c(t)&&typeof e.value=="string"&&B(d)}),Le(B=>{Ci(r,1,B,"svelte-1saqp8c"),jn(r,"title",c(o)?"Ctrl+Click or Ctrl+Enter to open url in new window":void 0)},[()=>o1(qq(e.value,e.mode,e.parser))]),sA(i,r),Yt()}cp(["click","dblclick"]);oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-tooltip.svelte-brt1mq { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - line-height: normal; - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); - border-radius: 3px; - background: var(--jse-context-menu-background, #656565); - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); - white-space: nowrap; - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); -}`);var JIA=TA('
    ');function YIA(i,e){var A=K(e,"text",8),t=JIA(),n=gA(t);Le(()=>Ht(n,A())),sA(i,t)}function tE(i,e){var A,{text:t,openAbsolutePopup:n,closeAbsolutePopup:o}=e;function a(){A=n(YIA,{text:t},{position:"top",width:10*t.length,offsetTop:3,anchor:i,closeOnOuterClick:!0})}function r(){o(A)}return i.addEventListener("mouseenter",a),i.addEventListener("mouseleave",r),{destroy(){i.removeEventListener("mouseenter",a),i.removeEventListener("mouseleave",r)}}}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-timestamp.svelte-1jcpman { - padding: 0; - margin: 0; - vertical-align: middle; - display: inline-flex; - color: var(--jse-value-color-number, #ee422e); -}`);var HIA=TA('
    ');function zIA(i,e){Jt(e,!1);var A=cA(void 0,!0),t=s1("absolute-popup"),n=K(e,"value",9);KA(()=>Y(n()),()=>{N(A,"Time: ".concat(new Date(n()).toString()))}),Vn(),di(!0);var o=HIA();Bn(gA(o),{get data(){return qO}}),Ms(o,(a,r)=>tE?.(a,r),()=>Fe({text:c(A)},t)),sA(i,o),Yt()}function PIA(i){var e=[];return!i.isEditing&&zdA(i.value)&&e.push({component:mIA,props:i}),!i.isEditing&&PdA(i.value)&&e.push({component:vIA,props:i}),i.isEditing&&e.push({component:FIA,props:i}),i.isEditing||e.push({component:OIA,props:i}),!i.isEditing&&__(i.value)&&e.push({component:zIA,props:i}),e}function El(i){return i.map((e,A)=>VIA.test(e)?"["+e+"]":/[.[\]]/.test(e)||e===""?'["'+(function(t){return t.replace(/"/g,'\\"')})(e)+'"]':(A>0?".":"")+e).join("")}function jIA(i){for(var e=[],A=0;Ao==='"',!0)),n('"')):e.push(t(o=>o==="]")),n("]")):e.push(t(o=>o==="."||o==="["));function t(o){for(var a=arguments.length>1&&arguments[1]!==void 0&&arguments[1],r="";A({x:i,y:i}),ZIA={left:"right",right:"left",bottom:"top",top:"bottom"},XIA={start:"end",end:"start"};function aV(i,e,A){return Wd(i,A5(e,A))}function h5(i,e){return typeof i=="function"?i(e):i}function oI(i){return i.split("-")[0]}function E5(i){return i.split("-")[1]}function nW(i){return i==="x"?"y":"x"}function oW(i){return i==="y"?"height":"width"}var $IA=new Set(["top","bottom"]);function Z2(i){return $IA.has(oI(i))?"y":"x"}function aW(i){return nW(Z2(i))}function J_(i){return i.replace(/start|end/g,e=>XIA[e])}var rV=["left","right"],sV=["right","left"],ABA=["top","bottom"],eBA=["bottom","top"];function tBA(i,e,A,t){var n=E5(i),o=(function(a,r,s){switch(a){case"top":case"bottom":return s?r?sV:rV:r?rV:sV;case"left":case"right":return r?ABA:eBA;default:return[]}})(oI(i),A==="start",t);return n&&(o=o.map(a=>a+"-"+n),e&&(o=o.concat(o.map(J_)))),o}function vw(i){return i.replace(/left|right|bottom|top/g,e=>ZIA[e])}function iBA(i){return typeof i!="number"?(function(e){return Fe({top:0,right:0,bottom:0,left:0},e)})(i):{top:i,right:i,bottom:i,left:i}}function t5(i){var{x:e,y:A,width:t,height:n}=i;return{width:t,height:n,top:A,left:e,right:e+t,bottom:A+n,x:e,y:A}}function lV(i,e,A){var t,{reference:n,floating:o}=i,a=Z2(e),r=aW(e),s=oW(r),l=oI(e),g=a==="y",C=n.x+n.width/2-o.width/2,d=n.y+n.height/2-o.height/2,B=n[s]/2-o[s]/2;switch(l){case"top":t={x:C,y:n.y-o.height};break;case"bottom":t={x:C,y:n.y+n.height};break;case"right":t={x:n.x+n.width,y:d};break;case"left":t={x:n.x-o.width,y:d};break;default:t={x:n.x,y:n.y}}switch(E5(e)){case"start":t[r]-=B*(A&&g?-1:1);break;case"end":t[r]+=B*(A&&g?-1:1)}return t}var nBA=(function(){var i=Xt(function*(e,A,t){for(var{placement:n="bottom",strategy:o="absolute",middleware:a=[],platform:r}=t,s=a.filter(Boolean),l=yield r.isRTL==null?void 0:r.isRTL(A),g=yield r.getElementRects({reference:e,floating:A,strategy:o}),{x:C,y:d}=lV(g,n,l),B=n,u={},E=0,f=0;f"u")&&(i instanceof ShadowRoot||i instanceof Yl(i).ShadowRoot)}var aBA=new Set(["inline","contents"]);function tp(i){var{overflow:e,overflowX:A,overflowY:t,display:n}=pc(i);return/auto|scroll|overlay|hidden|clip/.test(e+t+A)&&!aBA.has(n)}var rBA=new Set(["table","td","th"]);function sBA(i){return rBA.has(iE(i))}var lBA=[":popover-open",":modal"];function i5(i){return lBA.some(e=>{try{return i.matches(e)}catch(A){return!1}})}var gBA=["transform","translate","scale","rotate","perspective"],cBA=["transform","translate","scale","rotate","perspective","filter"],CBA=["paint","layout","strict","content"];function z_(i){var e=yx(),A=uc(i)?pc(i):i;return gBA.some(t=>!!A[t]&&A[t]!=="none")||!!A.containerType&&A.containerType!=="normal"||!e&&!!A.backdropFilter&&A.backdropFilter!=="none"||!e&&!!A.filter&&A.filter!=="none"||cBA.some(t=>(A.willChange||"").includes(t))||CBA.some(t=>(A.contain||"").includes(t))}function yx(){return!(typeof CSS>"u"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}var dBA=new Set(["html","body","#document"]);function Yh(i){return dBA.has(iE(i))}function pc(i){return Yl(i).getComputedStyle(i)}function u5(i){return uc(i)?{scrollLeft:i.scrollLeft,scrollTop:i.scrollTop}:{scrollLeft:i.scrollX,scrollTop:i.scrollY}}function X2(i){if(iE(i)==="html")return i;var e=i.assignedSlot||i.parentNode||gV(i)&&i.host||M0(i);return gV(e)?e.host:e}function lW(i){var e=X2(i);return Yh(e)?i.ownerDocument?i.ownerDocument.body:i.body:S0(e)&&tp(e)?e:lW(e)}function ip(i,e,A){var t;e===void 0&&(e=[]),A===void 0&&(A=!0);var n=lW(i),o=n===((t=i.ownerDocument)==null?void 0:t.body),a=Yl(n);if(o){var r=P_(a);return e.concat(a,a.visualViewport||[],tp(n)?n:[],r&&A?ip(r):[])}return e.concat(n,ip(n,[],A))}function P_(i){return i.parent&&Object.getPrototypeOf(i.parent)?i.frameElement:null}function gW(i){var e=pc(i),A=parseFloat(e.width)||0,t=parseFloat(e.height)||0,n=S0(i),o=n?i.offsetWidth:A,a=n?i.offsetHeight:t,r=e5(A)!==o||e5(t)!==a;return r&&(A=o,t=a),{width:A,height:t,$:r}}function Dx(i){return uc(i)?i:i.contextElement}function Hh(i){var e=Dx(i);if(!S0(e))return b0(1);var A=e.getBoundingClientRect(),{width:t,height:n,$:o}=gW(e),a=(o?e5(A.width):A.width)/t,r=(o?e5(A.height):A.height)/n;return a&&Number.isFinite(a)||(a=1),r&&Number.isFinite(r)||(r=1),{x:a,y:r}}var IBA=b0(0);function cW(i){var e=Yl(i);return yx()&&e.visualViewport?{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}:IBA}function aI(i,e,A,t){e===void 0&&(e=!1),A===void 0&&(A=!1);var n=i.getBoundingClientRect(),o=Dx(i),a=b0(1);e&&(t?uc(t)&&(a=Hh(t)):a=Hh(i));var r=(function(M,x,F){return x===void 0&&(x=!1),!(!F||x&&F!==Yl(M))&&x})(o,A,t)?cW(o):b0(0),s=(n.left+r.x)/a.x,l=(n.top+r.y)/a.y,g=n.width/a.x,C=n.height/a.y;if(o)for(var d=Yl(o),B=t&&uc(t)?Yl(t):t,u=d,E=P_(u);E&&t&&B!==u;){var f=Hh(E),m=E.getBoundingClientRect(),v=pc(E),S=m.left+(E.clientLeft+parseFloat(v.paddingLeft))*f.x,k=m.top+(E.clientTop+parseFloat(v.paddingTop))*f.y;s*=f.x,l*=f.y,g*=f.x,C*=f.y,s+=S,l+=k,E=P_(u=Yl(E))}return t5({width:g,height:C,x:s,y:l})}function n5(i,e){var A=u5(i).scrollLeft;return e?e.left+A:aI(M0(i)).left+A}function CW(i,e){var A=i.getBoundingClientRect();return{x:A.left+e.scrollLeft-n5(i,A),y:A.top+e.scrollTop}}var BBA=new Set(["absolute","fixed"]);function cV(i,e,A){var t;if(e==="viewport")t=(function(o,a){var r=Yl(o),s=M0(o),l=r.visualViewport,g=s.clientWidth,C=s.clientHeight,d=0,B=0;if(l){g=l.width,C=l.height;var u=yx();(!u||u&&a==="fixed")&&(d=l.offsetLeft,B=l.offsetTop)}var E=n5(s);if(E<=0){var f=s.ownerDocument,m=f.body,v=getComputedStyle(m),S=f.compatMode==="CSS1Compat"&&parseFloat(v.marginLeft)+parseFloat(v.marginRight)||0,k=Math.abs(s.clientWidth-m.clientWidth-S);k<=25&&(g-=k)}else E<=25&&(g+=E);return{width:g,height:C,x:d,y:B}})(i,A);else if(e==="document")t=(function(o){var a=M0(o),r=u5(o),s=o.ownerDocument.body,l=Wd(a.scrollWidth,a.clientWidth,s.scrollWidth,s.clientWidth),g=Wd(a.scrollHeight,a.clientHeight,s.scrollHeight,s.clientHeight),C=-r.scrollLeft+n5(o),d=-r.scrollTop;return pc(s).direction==="rtl"&&(C+=Wd(a.clientWidth,s.clientWidth)-l),{width:l,height:g,x:C,y:d}})(M0(i));else if(uc(e))t=(function(o,a){var r=aI(o,!0,a==="fixed"),s=r.top+o.clientTop,l=r.left+o.clientLeft,g=S0(o)?Hh(o):b0(1);return{width:o.clientWidth*g.x,height:o.clientHeight*g.y,x:l*g.x,y:s*g.y}})(e,A);else{var n=cW(i);t={x:e.x-n.x,y:e.y-n.y,width:e.width,height:e.height}}return t5(t)}function dW(i,e){var A=X2(i);return!(A===e||!uc(A)||Yh(A))&&(pc(A).position==="fixed"||dW(A,e))}function hBA(i,e,A){var t=S0(e),n=M0(e),o=A==="fixed",a=aI(i,!0,o,e),r={scrollLeft:0,scrollTop:0},s=b0(0);function l(){s.x=n5(n)}if(t||!t&&!o)if((iE(e)!=="body"||tp(n))&&(r=u5(e)),t){var g=aI(e,!0,o,e);s.x=g.x+e.clientLeft,s.y=g.y+e.clientTop}else n&&l();o&&!t&&n&&l();var C=!n||t||o?b0(0):CW(n,r);return{x:a.left+r.scrollLeft-s.x-C.x,y:a.top+r.scrollTop-s.y-C.y,width:a.width,height:a.height}}function B_(i){return pc(i).position==="static"}function CV(i,e){if(!S0(i)||pc(i).position==="fixed")return null;if(e)return e(i);var A=i.offsetParent;return M0(i)===A&&(A=A.ownerDocument.body),A}function dV(i,e){var A=Yl(i);if(i5(i))return A;if(!S0(i)){for(var t=X2(i);t&&!Yh(t);){if(uc(t)&&!B_(t))return t;t=X2(t)}return A}for(var n=CV(i,e);n&&sBA(n)&&B_(n);)n=CV(n,e);return n&&Yh(n)&&B_(n)&&!z_(n)?A:n||(function(o){for(var a=X2(o);S0(a)&&!Yh(a);){if(z_(a))return a;if(i5(a))return null;a=X2(a)}return null})(i)||A}var EBA={convertOffsetParentRelativeRectToViewportRelativeRect:function(i){var{elements:e,rect:A,offsetParent:t,strategy:n}=i,o=n==="fixed",a=M0(t),r=!!e&&i5(e.floating);if(t===a||r&&o)return A;var s={scrollLeft:0,scrollTop:0},l=b0(1),g=b0(0),C=S0(t);if((C||!C&&!o)&&((iE(t)!=="body"||tp(a))&&(s=u5(t)),S0(t))){var d=aI(t);l=Hh(t),g.x=d.x+t.clientLeft,g.y=d.y+t.clientTop}var B=!a||C||o?b0(0):CW(a,s);return{width:A.width*l.x,height:A.height*l.y,x:A.x*l.x-s.scrollLeft*l.x+g.x+B.x,y:A.y*l.y-s.scrollTop*l.y+g.y+B.y}},getDocumentElement:M0,getClippingRect:function(i){var{element:e,boundary:A,rootBoundary:t,strategy:n}=i,o=A==="clippingAncestors"?i5(e)?[]:(function(l,g){var C=g.get(l);if(C)return C;for(var d=ip(l,[],!1).filter(v=>uc(v)&&iE(v)!=="body"),B=null,u=pc(l).position==="fixed",E=u?X2(l):l;uc(E)&&!Yh(E);){var f=pc(E),m=z_(E);m||f.position!=="fixed"||(B=null),(u?!m&&!B:!m&&f.position==="static"&&B&&BBA.has(B.position)||tp(E)&&!m&&dW(l,E))?d=d.filter(v=>v!==E):B=f,E=X2(E)}return g.set(l,d),d})(e,this._c):[].concat(A),a=[...o,t],r=a[0],s=a.reduce((l,g)=>{var C=cV(e,g,n);return l.top=Wd(C.top,l.top),l.right=A5(C.right,l.right),l.bottom=A5(C.bottom,l.bottom),l.left=Wd(C.left,l.left),l},cV(e,r,n));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}},getOffsetParent:dV,getElementRects:(function(){var i=Xt(function*(e){var A=this.getOffsetParent||dV,t=this.getDimensions,n=yield t(e.floating);return{reference:hBA(e.reference,yield A(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}});return function(e){return i.apply(this,arguments)}})(),getClientRects:function(i){return Array.from(i.getClientRects())},getDimensions:function(i){var{width:e,height:A}=gW(i);return{width:e,height:A}},getScale:Hh,isElement:uc,isRTL:function(i){return pc(i).direction==="rtl"}};function IV(i,e){return i.x===e.x&&i.y===e.y&&i.width===e.width&&i.height===e.height}function QBA(i,e,A,t){t===void 0&&(t={});var{ancestorScroll:n=!0,ancestorResize:o=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:r=typeof IntersectionObserver=="function",animationFrame:s=!1}=t,l=Dx(i),g=n||o?[...l?ip(l):[],...ip(e)]:[];g.forEach(f=>{n&&f.addEventListener("scroll",A,{passive:!0}),o&&f.addEventListener("resize",A)});var C,d=l&&r?(function(f,m){var v,S=null,k=M0(f);function M(){var x;clearTimeout(v),(x=S)==null||x.disconnect(),S=null}return(function x(F,z){F===void 0&&(F=!1),z===void 0&&(z=1),M();var j=f.getBoundingClientRect(),{left:X,top:eA,width:Z,height:CA}=j;if(F||m(),Z&&CA){var wA={rootMargin:-Dw(eA)+"px "+-Dw(k.clientWidth-(X+Z))+"px "+-Dw(k.clientHeight-(eA+CA))+"px "+-Dw(X)+"px",threshold:Wd(0,A5(1,z))||1},BA=!0;try{S=new IntersectionObserver(QA,Fe(Fe({},wA),{},{root:k.ownerDocument}))}catch(RA){S=new IntersectionObserver(QA,wA)}S.observe(f)}function QA(RA){var dA=RA[0].intersectionRatio;if(dA!==z){if(!BA)return x();dA?x(!1,dA):v=setTimeout(()=>{x(!1,1e-7)},1e3)}dA!==1||IV(j,f.getBoundingClientRect())||x(),BA=!1}})(!0),M})(l,A):null,B=-1,u=null;a&&(u=new ResizeObserver(f=>{var[m]=f;m&&m.target===l&&u&&(u.unobserve(e),cancelAnimationFrame(B),B=requestAnimationFrame(()=>{var v;(v=u)==null||v.observe(e)})),A()}),l&&!s&&u.observe(l),u.observe(e));var E=s?aI(i):null;return s&&(function f(){var m=aI(i);E&&!IV(E,m)&&A(),E=m,C=requestAnimationFrame(f)})(),A(),()=>{var f;g.forEach(m=>{n&&m.removeEventListener("scroll",A),o&&m.removeEventListener("resize",A)}),d?.(),(f=u)==null||f.disconnect(),u=null,s&&cancelAnimationFrame(C)}}var uBA=function(i){return i===void 0&&(i=0),{name:"offset",options:i,fn:e=>Xt(function*(){var A,t,{x:n,y:o,placement:a,middlewareData:r}=e,s=yield(function(l,g){return H_.apply(this,arguments)})(e,i);return a===((A=r.offset)==null?void 0:A.placement)&&(t=r.arrow)!=null&&t.alignmentOffset?{}:{x:n+s.x,y:o+s.y,data:Fe(Fe({},s),{},{placement:a})}})()}},pBA=function(i){return i===void 0&&(i={}),{name:"shift",options:i,fn:e=>Xt(function*(){var{x:A,y:t,placement:n}=e,o=h5(i,e),{mainAxis:a=!0,crossAxis:r=!1,limiter:s={fn:S=>{var{x:k,y:M}=S;return{x:k,y:M}}}}=o,l=mV(o,odA),g={x:A,y:t},C=yield rW(e,l),d=Z2(oI(n)),B=nW(d),u=g[B],E=g[d];if(a){var f=B==="y"?"bottom":"right";u=aV(u+C[B==="y"?"top":"left"],u,u-C[f])}if(r){var m=d==="y"?"bottom":"right";E=aV(E+C[d==="y"?"top":"left"],E,E-C[m])}var v=s.fn(Fe(Fe({},e),{},{[B]:u,[d]:E}));return Fe(Fe({},v),{},{data:{x:v.x-A,y:v.y-t,enabled:{[B]:a,[d]:r}}})})()}},fBA=function(i){return i===void 0&&(i={}),{name:"flip",options:i,fn:e=>Xt(function*(){var A,t,{placement:n,middlewareData:o,rects:a,initialPlacement:r,platform:s,elements:l}=e,g=h5(i,e),{mainAxis:C=!0,crossAxis:d=!0,fallbackPlacements:B,fallbackStrategy:u="bestFit",fallbackAxisSideDirection:E="none",flipAlignment:f=!0}=g,m=mV(g,ndA);if((A=o.arrow)!=null&&A.alignmentOffset)return{};var v=oI(n),S=Z2(r),k=oI(r)===r,M=yield s.isRTL==null?void 0:s.isRTL(l.floating),x=B||(k||!f?[vw(r)]:(function(xA){var qA=vw(xA);return[J_(xA),qA,J_(qA)]})(r)),F=E!=="none";!B&&F&&x.push(...tBA(r,f,E,M));var z=[r,...x],j=yield rW(e,m),X=[],eA=((t=o.flip)==null?void 0:t.overflows)||[];if(C&&X.push(j[v]),d){var Z=(function(xA,qA,ue){ue===void 0&&(ue=!1);var HA=E5(xA),bA=aW(xA),PA=oW(bA),it=bA==="x"?HA===(ue?"end":"start")?"right":"left":HA==="start"?"bottom":"top";return qA.reference[PA]>qA.floating[PA]&&(it=vw(it)),[it,vw(it)]})(n,a,M);X.push(j[Z[0]],j[Z[1]])}if(eA=[...eA,{placement:n,overflows:X}],!X.every(xA=>xA<=0)){var CA,wA,BA=(((CA=o.flip)==null?void 0:CA.index)||0)+1,QA=z[BA];if(QA&&(!(d==="alignment"&&S!==Z2(QA))||eA.every(xA=>Z2(xA.placement)!==S||xA.overflows[0]>0)))return{data:{index:BA,overflows:eA},reset:{placement:QA}};var RA=(wA=eA.filter(xA=>xA.overflows[0]<=0).sort((xA,qA)=>xA.overflows[1]-qA.overflows[1])[0])==null?void 0:wA.placement;if(!RA)switch(u){case"bestFit":var dA,IA=(dA=eA.filter(xA=>{if(F){var qA=Z2(xA.placement);return qA===S||qA==="y"}return!0}).map(xA=>[xA.placement,xA.overflows.filter(qA=>qA>0).reduce((qA,ue)=>qA+ue,0)]).sort((xA,qA)=>xA[1]-qA[1])[0])==null?void 0:dA[0];IA&&(RA=IA);break;case"initialPlacement":RA=r}if(n!==RA)return{reset:{placement:RA}}}return{}})()}};function mBA(i){var e,A,t={autoUpdate:!0},n=i,o=s=>Fe(Fe(Fe({},t),i||{}),s||{}),a=s=>{e&&A&&(n=o(s),((l,g,C)=>{var d=new Map,B=Fe({platform:EBA},C),u=Fe(Fe({},B.platform),{},{_c:d});return nBA(l,g,Fe(Fe({},B),{},{platform:u}))})(e,A,n).then(l=>{var g;Object.assign(A.style,{position:l.strategy,left:"".concat(l.x,"px"),top:"".concat(l.y,"px")}),!((g=n)===null||g===void 0)&&g.onComputed&&n.onComputed(l)}))},r=s=>{Dg(s.subscribe(l=>{e===void 0?(e=l,a()):(Object.assign(e,l),a())}))};return[s=>{if("subscribe"in s)return r(s),{};e=s,a()},(s,l)=>{var g;A=s,n=o(l),setTimeout(()=>a(l),0),a(l);var C=()=>{g&&(g(),g=void 0)},d=function(){var{autoUpdate:B}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:n||{};C(),B!==!1&&Cq().then(()=>QBA(e,A,()=>a(n),B===!0?{}:B))};return g=d(),{update(B){a(B),g=d(B)},destroy(){C()}}},a]}function wBA(i){var{loadOptions:e,filterText:A,items:t,multiple:n,value:o,itemId:a,groupBy:r,filterSelectedItems:s,itemFilter:l,convertStringItemsToObjects:g,filterGroupedItems:C,label:d}=i;if(t&&e)return t;if(!t)return[];t&&t.length>0&&typeof t[0]!="object"&&(t=g(t));var B=t.filter(u=>{var E=l(u[d],A,u);return E&&n&&o!=null&&o.length&&(E=!o.some(f=>!!s&&f[a]===u[a])),E});return r&&(B=C(B)),B}function yBA(i){return IW.apply(this,arguments)}function IW(){return(IW=Xt(function*(i){var{dispatch:e,loadOptions:A,convertStringItemsToObjects:t,filterText:n}=i,o=yield A(n).catch(a=>{console.warn("svelte-select loadOptions error :>> ",a),e("error",{type:"loadOptions",details:a})});if(o&&!o.cancelled)return o?(o&&o.length>0&&typeof o[0]!="object"&&(o=t(o)),e("loaded",{items:o})):o=[],{filteredItems:o,loading:!1,focused:!0,listOpen:!0}})).apply(this,arguments)}oi(` - svg.svelte-1kxu7be { - width: var(--chevron-icon-width, 20px); - height: var(--chevron-icon-width, 20px); - color: var(--chevron-icon-colour, currentColor); - } -`);var DBA=l1(``);oi(` - svg.svelte-1hraxrc { - width: var(--clear-icon-width, 20px); - height: var(--clear-icon-width, 20px); - color: var(--clear-icon-color, currentColor); - } -`);var vBA=l1(``);function h_(i){sA(i,vBA())}oi(` - .loading.svelte-y9fi5p { - width: var(--spinner-width, 20px); - height: var(--spinner-height, 20px); - color: var(--spinner-color, var(--icons-color)); - animation: svelte-y9fi5p-rotate 0.75s linear infinite; - transform-origin: center center; - transform: none; - } - - .circle_path.svelte-y9fi5p { - stroke-dasharray: 90; - stroke-linecap: round; - } - - @keyframes svelte-y9fi5p-rotate { - 100% { - transform: rotate(360deg); - } - } -`);var bBA=l1('');oi(` - .svelte-select.svelte-1ul7oo4 { - /* deprecating camelCase custom props in favour of kebab-case for v5 */ - --borderRadius: var(--border-radius); - --clearSelectColor: var(--clear-select-color); - --clearSelectWidth: var(--clear-select-width); - --disabledBackground: var(--disabled-background); - --disabledBorderColor: var(--disabled-border-color); - --disabledColor: var(--disabled-color); - --disabledPlaceholderColor: var(--disabled-placeholder-color); - --disabledPlaceholderOpacity: var(--disabled-placeholder-opacity); - --errorBackground: var(--error-background); - --errorBorder: var(--error-border); - --groupItemPaddingLeft: var(--group-item-padding-left); - --groupTitleColor: var(--group-title-color); - --groupTitleFontSize: var(--group-title-font-size); - --groupTitleFontWeight: var(--group-title-font-weight); - --groupTitlePadding: var(--group-title-padding); - --groupTitleTextTransform: var(--group-title-text-transform); - --groupTitleBorderColor: var(--group-title-border-color); - --groupTitleBorderWidth: var(--group-title-border-width); - --groupTitleBorderStyle: var(--group-title-border-style); - --indicatorColor: var(--chevron-color); - --indicatorHeight: var(--chevron-height); - --indicatorWidth: var(--chevron-width); - --inputColor: var(--input-color); - --inputLeft: var(--input-left); - --inputLetterSpacing: var(--input-letter-spacing); - --inputMargin: var(--input-margin); - --inputPadding: var(--input-padding); - --itemActiveBackground: var(--item-active-background); - --itemColor: var(--item-color); - --itemFirstBorderRadius: var(--item-first-border-radius); - --itemHoverBG: var(--item-hover-bg); - --itemHoverColor: var(--item-hover-color); - --itemIsActiveBG: var(--item-is-active-bg); - --itemIsActiveColor: var(--item-is-active-color); - --itemIsNotSelectableColor: var(--item-is-not-selectable-color); - --itemPadding: var(--item-padding); - --listBackground: var(--list-background); - --listBorder: var(--list-border); - --listBorderRadius: var(--list-border-radius); - --listEmptyColor: var(--list-empty-color); - --listEmptyPadding: var(--list-empty-padding); - --listEmptyTextAlign: var(--list-empty-text-align); - --listMaxHeight: var(--list-max-height); - --listPosition: var(--list-position); - --listShadow: var(--list-shadow); - --listZIndex: var(--list-z-index); - --multiItemBG: var(--multi-item-bg); - --multiItemBorderRadius: var(--multi-item-border-radius); - --multiItemDisabledHoverBg: var(--multi-item-disabled-hover-bg); - --multiItemDisabledHoverColor: var(--multi-item-disabled-hover-color); - --multiItemHeight: var(--multi-item-height); - --multiItemMargin: var(--multi-item-margin); - --multiItemPadding: var(--multi-item-padding); - --multiSelectInputMargin: var(--multi-select-input-margin); - --multiSelectInputPadding: var(--multi-select-input-padding); - --multiSelectPadding: var(--multi-select-padding); - --placeholderColor: var(--placeholder-color); - --placeholderOpacity: var(--placeholder-opacity); - --selectedItemPadding: var(--selected-item-padding); - --spinnerColor: var(--spinner-color); - --spinnerHeight: var(--spinner-height); - --spinnerWidth: var(--spinner-width); - - --internal-padding: 0 0 0 16px; - - border: var(--border, 1px solid #d8dbdf); - border-radius: var(--border-radius, 6px); - min-height: var(--height, 42px); - position: relative; - display: flex; - align-items: stretch; - padding: var(--padding, var(--internal-padding)); - background: var(--background, #fff); - margin: var(--margin, 0); - width: var(--width, 100%); - font-size: var(--font-size, 16px); - max-height: var(--max-height); - } - - .svelte-1ul7oo4 { - box-sizing: var(--box-sizing, border-box); - } - - .svelte-select.svelte-1ul7oo4:hover { - border: var(--border-hover, 1px solid #b2b8bf); - } - - .value-container.svelte-1ul7oo4 { - display: flex; - flex: 1 1 0%; - flex-wrap: wrap; - align-items: center; - gap: 5px 10px; - padding: var(--value-container-padding, 5px 0); - position: relative; - overflow: var(--value-container-overflow, hidden); - align-self: stretch; - } - - .prepend.svelte-1ul7oo4, - .indicators.svelte-1ul7oo4 { - display: flex; - flex-shrink: 0; - align-items: center; - } - - .indicators.svelte-1ul7oo4 { - position: var(--indicators-position); - top: var(--indicators-top); - right: var(--indicators-right); - bottom: var(--indicators-bottom); - } - - input.svelte-1ul7oo4 { - position: absolute; - cursor: default; - border: none; - color: var(--input-color, var(--item-color)); - padding: var(--input-padding, 0); - letter-spacing: var(--input-letter-spacing, inherit); - margin: var(--input-margin, 0); - min-width: 10px; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - font-size: var(--font-size, 16px); - } - - .svelte-1ul7oo4:not(.multi) > .value-container:where(.svelte-1ul7oo4) > input:where(.svelte-1ul7oo4) { - width: 100%; - height: 100%; - } - - input.svelte-1ul7oo4::placeholder { - color: var(--placeholder-color, #78848f); - opacity: var(--placeholder-opacity, 1); - } - - input.svelte-1ul7oo4:focus { - outline: none; - } - - .svelte-select.focused.svelte-1ul7oo4 { - border: var(--border-focused, 1px solid #006fe8); - border-radius: var(--border-radius-focused, var(--border-radius, 6px)); - } - - .disabled.svelte-1ul7oo4 { - background: var(--disabled-background, #ebedef); - border-color: var(--disabled-border-color, #ebedef); - color: var(--disabled-color, #c1c6cc); - } - - .disabled.svelte-1ul7oo4 input:where(.svelte-1ul7oo4)::placeholder { - color: var(--disabled-placeholder-color, #c1c6cc); - opacity: var(--disabled-placeholder-opacity, 1); - } - - .selected-item.svelte-1ul7oo4 { - position: relative; - overflow: var(--selected-item-overflow, hidden); - padding: var(--selected-item-padding, 0 20px 0 0); - text-overflow: ellipsis; - white-space: nowrap; - color: var(--selected-item-color, inherit); - font-size: var(--font-size, 16px); - } - - .multi.svelte-1ul7oo4 .selected-item:where(.svelte-1ul7oo4) { - position: absolute; - line-height: var(--height, 42px); - height: var(--height, 42px); - } - - .selected-item.svelte-1ul7oo4:focus { - outline: none; - } - - .hide-selected-item.svelte-1ul7oo4 { - opacity: 0; - } - - .icon.svelte-1ul7oo4 { - display: flex; - align-items: center; - justify-content: center; - } - - .clear-select.svelte-1ul7oo4 { - all: unset; - display: flex; - align-items: center; - justify-content: center; - width: var(--clear-select-width, 40px); - height: var(--clear-select-height, 100%); - color: var(--clear-select-color, var(--icons-color)); - margin: var(--clear-select-margin, 0); - pointer-events: all; - flex-shrink: 0; - } - - .clear-select.svelte-1ul7oo4:focus { - outline: var(--clear-select-focus-outline, 1px solid #006fe8); - } - - .loading.svelte-1ul7oo4 { - width: var(--loading-width, 40px); - height: var(--loading-height); - color: var(--loading-color, var(--icons-color)); - margin: var(--loading--margin, 0); - flex-shrink: 0; - } - - .chevron.svelte-1ul7oo4 { - width: var(--chevron-width, 40px); - height: var(--chevron-height, 40px); - background: var(--chevron-background, transparent); - pointer-events: var(--chevron-pointer-events, none); - color: var(--chevron-color, var(--icons-color)); - border: var(--chevron-border, 0 0 0 1px solid #d8dbdf); - flex-shrink: 0; - } - - .multi.svelte-1ul7oo4 { - padding: var(--multi-select-padding, var(--internal-padding)); - } - - .multi.svelte-1ul7oo4 input:where(.svelte-1ul7oo4) { - padding: var(--multi-select-input-padding, 0); - position: relative; - margin: var(--multi-select-input-margin, 5px 0); - flex: 1 1 40px; - } - - .svelte-select.error.svelte-1ul7oo4 { - border: var(--error-border, 1px solid #ff2d55); - background: var(--error-background, #fff); - } - - .a11y-text.svelte-1ul7oo4 { - z-index: 9999; - border: 0px; - clip: rect(1px, 1px, 1px, 1px); - height: 1px; - width: 1px; - position: absolute; - overflow: hidden; - padding: 0px; - white-space: nowrap; - } - - .multi-item.svelte-1ul7oo4 { - background: var(--multi-item-bg, #ebedef); - margin: var(--multi-item-margin, 0); - outline: var(--multi-item-outline, 1px solid #ddd); - border-radius: var(--multi-item-border-radius, 4px); - height: var(--multi-item-height, 25px); - line-height: var(--multi-item-height, 25px); - display: flex; - cursor: default; - padding: var(--multi-item-padding, 0 5px); - overflow: hidden; - gap: var(--multi-item-gap, 4px); - outline-offset: -1px; - max-width: var(--multi-max-width, none); - color: var(--multi-item-color, var(--item-color)); - } - - .multi-item.disabled.svelte-1ul7oo4:hover { - background: var(--multi-item-disabled-hover-bg, #ebedef); - color: var(--multi-item-disabled-hover-color, #c1c6cc); - } - - .multi-item-text.svelte-1ul7oo4 { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .multi-item-clear.svelte-1ul7oo4 { - display: flex; - align-items: center; - justify-content: center; - --clear-icon-color: var(--multi-item-clear-icon-color, #000); - } - - .multi-item.active.svelte-1ul7oo4 { - outline: var(--multi-item-active-outline, 1px solid #006fe8); - } - - .svelte-select-list.svelte-1ul7oo4 { - box-shadow: var(--list-shadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24)); - border-radius: var(--list-border-radius, 4px); - max-height: var(--list-max-height, 252px); - overflow-y: auto; - background: var(--list-background, #fff); - position: var(--list-position, absolute); - z-index: var(--list-z-index, 2); - border: var(--list-border); - } - - .prefloat.svelte-1ul7oo4 { - opacity: 0; - pointer-events: none; - } - - .list-group-title.svelte-1ul7oo4 { - color: var(--group-title-color, #8f8f8f); - cursor: default; - font-size: var(--group-title-font-size, 16px); - font-weight: var(--group-title-font-weight, 600); - height: var(--height, 42px); - line-height: var(--height, 42px); - padding: var(--group-title-padding, 0 20px); - text-overflow: ellipsis; - overflow-x: hidden; - white-space: nowrap; - text-transform: var(--group-title-text-transform, uppercase); - border-width: var(--group-title-border-width, medium); - border-style: var(--group-title-border-style, none); - border-color: var(--group-title-border-color, color); - } - - .empty.svelte-1ul7oo4 { - text-align: var(--list-empty-text-align, center); - padding: var(--list-empty-padding, 20px 0); - color: var(--list-empty-color, #78848f); - } - - .item.svelte-1ul7oo4 { - cursor: default; - height: var(--item-height, var(--height, 42px)); - line-height: var(--item-line-height, var(--height, 42px)); - padding: var(--item-padding, 0 20px); - color: var(--item-color, inherit); - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - transition: var(--item-transition, all 0.2s); - align-items: center; - width: 100%; - } - - .item.group-item.svelte-1ul7oo4 { - padding-left: var(--group-item-padding-left, 40px); - } - - .item.svelte-1ul7oo4:active { - background: var(--item-active-background, #b9daff); - } - - .item.active.svelte-1ul7oo4 { - background: var(--item-is-active-bg, #007aff); - color: var(--item-is-active-color, #fff); - } - - .item.first.svelte-1ul7oo4 { - border-radius: var(--item-first-border-radius, 4px 4px 0 0); - } - - .item.hover.svelte-1ul7oo4:not(.active) { - background: var(--item-hover-bg, #e7f2ff); - color: var(--item-hover-color, inherit); - } - - .item.not-selectable.svelte-1ul7oo4, - .item.hover.item.not-selectable.svelte-1ul7oo4, - .item.active.item.not-selectable.svelte-1ul7oo4, - .item.not-selectable.svelte-1ul7oo4:active { - color: var(--item-is-not-selectable-color, #999); - background: transparent; - } - - .required.svelte-1ul7oo4 { - opacity: 0; - z-index: -1; - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - } -`);var MBA=TA('
    '),SBA=TA('
    No options
    '),kBA=TA('
    '),_BA=TA(' ',1),xBA=TA('
    '),RBA=TA('
    '),NBA=TA("
    "),FBA=TA(''),LBA=TA(''),GBA=TA(''),KBA=TA(''),UBA=TA(''),TBA=TA('
    ');function Hd(i,e){var A=(function(EA){var LA={};for(var Ce in EA.children&&(LA.default=!0),EA.$$slots)LA[Ce]=!0;return LA})(e);Jt(e,!1);var t,n=cA(),o=cA(),a=cA(),r=cA(),s=cA(),l=cA(),g=cA(),C=cA(),d=cA(),B=NdA(),u=K(e,"justValue",12,null),E=K(e,"filter",8,wBA),f=K(e,"getItems",8,yBA),m=K(e,"id",8,null),v=K(e,"name",8,null),S=K(e,"container",12,void 0),k=K(e,"input",12,void 0),M=K(e,"multiple",8,!1),x=K(e,"multiFullItemClearable",8,!1),F=K(e,"disabled",8,!1),z=K(e,"focused",12,!1),j=K(e,"value",12,null),X=K(e,"filterText",12,""),eA=K(e,"placeholder",8,"Please select"),Z=K(e,"placeholderAlwaysShow",8,!1),CA=K(e,"items",12,null),wA=K(e,"label",8,"label"),BA=K(e,"itemFilter",8,(EA,LA,Ce)=>"".concat(EA).toLowerCase().includes(LA.toLowerCase())),QA=K(e,"groupBy",8,void 0),RA=K(e,"groupFilter",8,EA=>EA),dA=K(e,"groupHeaderSelectable",8,!1),IA=K(e,"itemId",8,"value"),xA=K(e,"loadOptions",8,void 0),qA=K(e,"containerStyles",8,""),ue=K(e,"hasError",8,!1),HA=K(e,"filterSelectedItems",8,!0),bA=K(e,"required",8,!1),PA=K(e,"closeListOnChange",8,!0),it=K(e,"clearFilterTextOnBlur",8,!0),Xe=K(e,"createGroupHeaderItem",8,(EA,LA)=>({value:EA,[wA()]:EA})),YA=()=>c(g),hA=K(e,"searchable",8,!0),Ae=K(e,"inputStyles",8,""),pA=K(e,"clearable",8,!0),te=K(e,"loading",12,!1),NA=K(e,"listOpen",12,!1),Ge=K(e,"debounce",8,function(EA){var LA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1;clearTimeout(t),t=setTimeout(EA,LA)}),JA=K(e,"debounceWait",8,300),yA=K(e,"hideEmptyState",8,!1),Pt=K(e,"inputAttributes",24,()=>({})),Dt=K(e,"listAutoWidth",8,!0),fe=K(e,"showChevron",8,!1),Zt=K(e,"listOffset",8,5),Pe=K(e,"hoverItemIndex",12,0),qe=K(e,"floatingConfig",24,()=>({})),vt=K(e,"class",8,""),Ke=cA(),Ii=cA(),V=cA(),$=cA(),iA=cA();function oA(EA){return EA.map((LA,Ce)=>({index:Ce,value:LA,label:"".concat(LA)}))}function UA(EA){var LA=[],Ce={};EA.forEach(gt=>{var dt=QA()(gt);LA.includes(dt)||(LA.push(dt),Ce[dt]=[],dt&&Ce[dt].push(Object.assign(Xe()(dt,gt),{id:dt,groupHeader:!0,selectable:dA()}))),Ce[dt].push(Object.assign({groupItem:!!dt},gt))});var Te=[];return RA()(LA).forEach(gt=>{Ce[gt]&&Te.push(...Ce[gt])}),Te}function he(){var EA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0,LA=arguments.length>1?arguments[1]:void 0;Pe(EA<0?0:EA),!LA&&QA()&&c(g)[Pe()]&&!c(g)[Pe()].selectable&&bi(1)}function me(){var EA=!0;if(j()){var LA=[],Ce=[];j().forEach(Te=>{LA.includes(Te[IA()])?EA=!1:(LA.push(Te[IA()]),Ce.push(Te))}),EA||j(Ce)}return EA}function GA(EA){var LA=EA?EA[IA()]:j()[IA()];return CA().find(Ce=>Ce[IA()]===LA)}function OA(EA){return wt.apply(this,arguments)}function wt(){return(wt=Xt(function*(EA){var LA=j()[EA];j().length===1?j(void 0):j(j().filter(Ce=>Ce!==LA)),B("clear",LA)})).apply(this,arguments)}function rt(EA){if(z())switch(EA.stopPropagation(),EA.key){case"Escape":EA.preventDefault(),He();break;case"Enter":if(EA.preventDefault(),NA()){if(c(g).length===0)break;var LA=c(g)[Pe()];if(j()&&!M()&&j()[IA()]===LA[IA()]){He();break}J(c(g)[Pe()])}break;case"ArrowDown":EA.preventDefault(),NA()?bi(1):(NA(!0),N(Ke,void 0));break;case"ArrowUp":EA.preventDefault(),NA()?bi(-1):(NA(!0),N(Ke,void 0));break;case"Tab":if(NA()&&z()){if(c(g).length===0||j()&&j()[IA()]===c(g)[Pe()][IA()])return He();EA.preventDefault(),J(c(g)[Pe()]),He()}break;case"Backspace":if(!M()||X().length>0)return;if(M()&&j()&&j().length>0){if(OA(c(Ke)!==void 0?c(Ke):j().length-1),c(Ke)===0||c(Ke)===void 0)break;N(Ke,j().length>c(Ke)?c(Ke)-1:void 0)}break;case"ArrowLeft":if(!j()||!M()||X().length>0)return;c(Ke)===void 0?N(Ke,j().length-1):j().length>c(Ke)&&c(Ke)!==0&&N(Ke,c(Ke)-1);break;case"ArrowRight":if(!j()||!M()||X().length>0||c(Ke)===void 0)return;c(Ke)===j().length-1?N(Ke,void 0):c(Ke)0?NA(!0):void NA(!NA())}function Sn(){B("clear",j()),j(void 0),He(),je()}function He(){it()&&X(""),NA(!1)}FdA(Xt(function*(){N(Ii,j()),N(V,X()),N($,M())})),os(()=>{NA()&&z(!0),z()&&k()&&k().focus()});var En=K(e,"ariaValues",8,EA=>"Option ".concat(EA,", selected.")),Gi=K(e,"ariaListOpen",8,(EA,LA)=>"You are currently focused on option ".concat(EA,". There are ").concat(LA," results available.")),Pi=K(e,"ariaFocused",8,()=>"Select is focused, type to refine list, press down to open the menu."),gn,Rt=cA(null);function Qn(){clearTimeout(gn),gn=setTimeout(()=>{jt=!1},100)}Dg(()=>{var EA;(EA=c(Rt))===null||EA===void 0||EA.remove()});var jt=!1;function J(EA){EA&&EA.selectable!==!1&&(function(LA){if(LA){X("");var Ce=Object.assign({},LA);if(Ce.groupHeader&&!Ce.selectable)return;j(M()?j()?j().concat([Ce]):[Ce]:j(Ce)),setTimeout(()=>{PA()&&He(),N(Ke,void 0),B("change",j()),B("select",LA)})}})(EA)}function ut(EA){jt||Pe(EA)}function bi(EA){if(c(g).filter(Ce=>!Object.hasOwn(Ce,"selectable")||Ce.selectable===!0).length===0)return Pe(0);EA>0&&Pe()===c(g).length-1?Pe(0):EA<0&&Pe()===0?Pe(c(g).length-1):Pe(Pe()+EA);var LA=c(g)[Pe()];LA&&LA.selectable===!1&&(EA!==1&&EA!==-1||bi(EA))}function kn(EA,LA,Ce){if(!M())return LA&&LA[Ce]===EA[Ce]}var _n=ia,Co=ia;function ia(EA){return{update(LA){LA.scroll&&(Qn(),EA.scrollIntoView({behavior:"auto",block:"nearest"}))}}}var So=cA({strategy:"absolute",placement:"bottom-start",middleware:[uBA(Zt()),fBA(),pBA()],autoUpdate:!1}),[Vo,ga,Ko]=mBA(c(So)),va=cA(!0);KA(()=>(Y(CA()),Y(j())),()=>{CA(),j()&&(function(){if(typeof j()=="string"){var EA=(CA()||[]).find(LA=>LA[IA()]===j());j(EA||{[IA()]:j(),label:j()})}else M()&&Array.isArray(j())&&j().length>0&&j(j().map(LA=>typeof LA=="string"?{value:LA,label:LA}:LA))})()}),KA(()=>(Y(Pt()),Y(hA())),()=>{!Pt()&&hA()||(N(iA,Object.assign({autocapitalize:"none",autocomplete:"off",autocorrect:"off",spellcheck:!1,tabindex:0,type:"text","aria-autocomplete":"list"},Pt())),m()&&Ol(iA,c(iA).id=m()),hA()||Ol(iA,c(iA).readonly=!0))}),KA(()=>Y(M()),()=>{M()&&j()&&(Array.isArray(j())?j([...j()]):j([j()]))}),KA(()=>(c($),Y(M())),()=>{c($)&&!M()&&j()&&j(null)}),KA(()=>(Y(M()),Y(j())),()=>{M()&&j()&&j().length>1&&me()}),KA(()=>Y(j()),()=>{j()&&(M()?JSON.stringify(j())!==JSON.stringify(c(Ii))&&me()&&B("input",j()):c(Ii)&&JSON.stringify(j()[IA()])===JSON.stringify(c(Ii)[IA()])||B("input",j()))}),KA(()=>(Y(j()),Y(M()),c(Ii)),()=>{!j()&&M()&&c(Ii)&&B("input",j())}),KA(()=>(Y(z()),Y(k())),()=>{!z()&&k()&&He()}),KA(()=>(Y(X()),c(V)),()=>{X()!==c(V)&&(xA()||X().length!==0)&&(xA()?Ge()(Xt(function*(){te(!0);var EA=yield f()({dispatch:B,loadOptions:xA(),convertStringItemsToObjects:oA,filterText:X()});EA?(te(EA.loading),NA(NA()?EA.listOpen:X().length>0),z(NA()&&EA.focused),CA(QA()?UA(EA.filteredItems):EA.filteredItems)):(te(!1),z(!0),NA(!0))}),JA()):(NA(!0),M()&&N(Ke,void 0)))}),KA(()=>(Y(E()),Y(xA()),Y(X()),Y(CA()),Y(M()),Y(j()),Y(IA()),Y(QA()),Y(wA()),Y(HA()),Y(BA())),()=>{N(g,E()({loadOptions:xA(),filterText:X(),items:CA(),multiple:M(),value:j(),itemId:IA(),groupBy:QA(),label:wA(),filterSelectedItems:HA(),itemFilter:BA(),convertStringItemsToObjects:oA,filterGroupedItems:UA}))}),KA(()=>(Y(M()),Y(NA()),Y(j()),c(g)),()=>{!M()&&NA()&&j()&&c(g)&&he(c(g).findIndex(EA=>EA[IA()]===j()[IA()]),!0)}),KA(()=>(Y(NA()),Y(M())),()=>{NA()&&M()&&Pe(0)}),KA(()=>Y(X()),()=>{X()&&Pe(0)}),KA(()=>Y(Pe()),()=>{var EA;EA=Pe(),B("hoverItem",EA)}),KA(()=>(Y(M()),Y(j())),()=>{N(n,M()?j()&&j().length>0:j())}),KA(()=>(c(n),Y(X())),()=>{N(o,c(n)&&X().length>0)}),KA(()=>(c(n),Y(pA()),Y(F()),Y(te())),()=>{N(a,c(n)&&pA()&&!F()&&!te())}),KA(()=>(Y(Z()),Y(M()),Y(eA()),Y(j())),()=>{var EA;N(r,Z()&&M()||M()&&((EA=j())===null||EA===void 0?void 0:EA.length)===0?eA():j()?"":eA())}),KA(()=>(Y(j()),Y(M())),()=>{var EA,LA;N(s,j()?(EA=M(),LA=void 0,LA=EA&&j().length>0?j().map(Ce=>Ce[wA()]).join(", "):j()[wA()],En()(LA)):"")}),KA(()=>(c(g),Y(Pe()),Y(z()),Y(NA())),()=>{N(l,(function(){if(!c(g)||c(g).length===0)return"";var EA=c(g)[Pe()];if(NA()&&EA){var LA=c(g)?c(g).length:0;return Gi()(EA[wA()],LA)}return Pi()()})((c(g),Pe(),z(),NA())))}),KA(()=>Y(CA()),()=>{(function(EA){EA&&EA.length!==0&&!EA.some(LA=>typeof LA!="object")&&j()&&(M()?!j().some(LA=>!LA||!LA[IA()]):j()[IA()])&&(Array.isArray(j())?j(j().map(LA=>GA(LA)||LA)):j(GA()||j()))})(CA())}),KA(()=>(Y(M()),Y(j()),Y(IA())),()=>{u((M(),j(),IA(),M()?j()?j().map(EA=>EA[IA()]):null:j()?j()[IA()]:j()))}),KA(()=>(Y(M()),c(Ii),Y(j())),()=>{M()||!c(Ii)||j()||B("input",j())}),KA(()=>(Y(NA()),c(g),Y(M()),Y(j())),()=>{NA()&&c(g)&&!M()&&!j()&&he()}),KA(()=>c(g),()=>{(function(EA){NA()&&B("filter",EA)})(c(g))}),KA(()=>(Y(S()),Y(qe()),c(So)),()=>{S()&&qe()&&Ko(Object.assign(c(So),qe()))}),KA(()=>c(Rt),()=>{N(C,!!c(Rt))}),KA(()=>(c(Rt),Y(NA())),()=>{(function(EA,LA){if(!EA||!LA)return N(va,!0);setTimeout(()=>{N(va,!1)},0)})(c(Rt),NA())}),KA(()=>(Y(NA()),Y(S()),c(Rt)),()=>{NA()&&S()&&c(Rt)&&(function(){var{width:EA}=S().getBoundingClientRect();Ol(Rt,c(Rt).style.width=Dt()?EA+"px":"auto")})()}),KA(()=>Y(Pe()),()=>{N(d,Pe())}),KA(()=>(Y(k()),Y(NA()),Y(z())),()=>{k()&&NA()&&!z()&&je()}),KA(()=>(Y(S()),Y(qe())),()=>{var EA;S()&&((EA=qe())===null||EA===void 0?void 0:EA.autoUpdate)===void 0&&Ol(So,c(So).autoUpdate=!0)}),Vn();var ca={getFilteredItems:YA,handleClear:Sn};di();var pa,Uo=TBA();De("click",bC,function(EA){var LA;NA()||z()||!S()||S().contains(EA.target)||(LA=c(Rt))!==null&&LA!==void 0&&LA.contains(EA.target)||ze()}),De("keydown",bC,rt);var de=gA(Uo),xi=EA=>{var LA,Ce=kBA(),Te=gA(Ce),gt=ai=>{var Xi=zi();ya(at(Xi),e,"list-prepend",{},null),sA(ai,Xi)};zA(Te,ai=>{uA(()=>A["list-prepend"])&&ai(gt)});var dt=kA(Te,2),Ut=ai=>{var Xi=zi();ya(at(Xi),e,"list",{get filteredItems(){return c(g)}},null),sA(ai,Xi)},io=ai=>{var Xi=zi(),Na=at(Xi),Vt=$i=>{var cn=zi();Da(at(cn),1,()=>c(g),Ka,(Io,Rn,Tt)=>{var fa,oa=MBA(),y=gA(oa);ya(gA(y),e,"item",{get item(){return c(Rn)},index:Tt},b=>{var R=mr();Le(()=>Ht(R,(c(Rn),Y(wA()),uA(()=>{var W;return(W=c(Rn))===null||W===void 0?void 0:W[wA()]})))),sA(b,R)}),Ms(y,(b,R)=>_n?.(b),()=>({scroll:kn(c(Rn),j(),IA()),listDom:c(C)})),Ms(y,(b,R)=>Co?.(b),()=>({scroll:c(d)===Tt,listDom:c(C)})),Le(b=>fa=Ci(y,1,"item svelte-1ul7oo4",null,fa,b),[()=>{var b,R;return{"list-group-title":c(Rn).groupHeader,active:kn(c(Rn),j(),IA()),first:(R=Tt,R===0),hover:Pe()===Tt,"group-item":c(Rn).groupItem,"not-selectable":((b=c(Rn))===null||b===void 0?void 0:b.selectable)===!1}}]),De("mouseover",oa,()=>ut(Tt)),De("focus",oa,()=>ut(Tt)),De("click",oa,uC(()=>(function(b){var{item:R,i:W}=b;if(R?.selectable!==!1)return j()&&!M()&&j()[IA()]===R[IA()]?He():void((function(_){return _.groupHeader&&_.selectable||_.selectable||!_.hasOwnProperty("selectable")})(R)&&(Pe(W),J(R)))})({item:c(Rn),i:Tt}))),De("keydown",oa,J2(uC(function(b){O4.call(this,e,b)}))),sA(Io,oa)}),sA($i,cn)},It=$i=>{var cn=zi(),Io=at(cn),Rn=Tt=>{var fa=zi();ya(at(fa),e,"empty",{},oa=>{sA(oa,SBA())}),sA(Tt,fa)};zA(Io,Tt=>{yA()||Tt(Rn)},!0),sA($i,cn)};zA(Na,$i=>{c(g),uA(()=>c(g).length>0)?$i(Vt):$i(It,!1)},!0),sA(ai,Xi)};zA(dt,ai=>{uA(()=>A.list)?ai(Ut):ai(io,!1)});var Zi=kA(dt,2),nn=ai=>{var Xi=zi();ya(at(Xi),e,"list-append",{},null),sA(ai,Xi)};zA(Zi,ai=>{uA(()=>A["list-append"])&&ai(nn)}),Ms(Ce,ai=>ga?.(ai)),ta(Ce,ai=>N(Rt,ai),()=>c(Rt)),Tr(()=>De("scroll",Ce,Qn)),Tr(()=>De("pointerup",Ce,J2(uC(function(ai){O4.call(this,e,ai)})))),Tr(()=>De("mousedown",Ce,J2(uC(function(ai){O4.call(this,e,ai)})))),Le(()=>LA=Ci(Ce,1,"svelte-select-list svelte-1ul7oo4",null,LA,{prefloat:c(va)})),sA(EA,Ce)};zA(de,EA=>{NA()&&EA(xi)});var wn=kA(de,2),xn=gA(wn),na=EA=>{var LA=_BA(),Ce=at(LA),Te=gA(Ce),gt=gA(kA(Ce,2));Le(()=>{Ht(Te,c(s)),Ht(gt,c(l))}),sA(EA,LA)};zA(xn,EA=>{z()&&EA(na)});var Ra=kA(wn,2);ya(gA(Ra),e,"prepend",{},null);var Oi=kA(Ra,2),ko=gA(Oi),ar=EA=>{var LA=zi(),Ce=at(LA),Te=dt=>{var Ut=zi();Da(at(Ut),1,j,Ka,(io,Zi,nn)=>{var ai,Xi=RBA(),Na=gA(Xi);ya(gA(Na),e,"selection",{get selection(){return c(Zi)},index:nn},$i=>{var cn=mr();Le(()=>Ht(cn,(c(Zi),Y(wA()),uA(()=>c(Zi)[wA()])))),sA($i,cn)});var Vt=kA(Na,2),It=$i=>{var cn=xBA();ya(gA(cn),e,"multi-clear-icon",{},Io=>{h_(Io)}),De("pointerup",cn,J2(uC(()=>OA(nn)))),sA($i,cn)};zA(Vt,$i=>{F()||x()||!h_||$i(It)}),Le(()=>ai=Ci(Xi,1,"multi-item svelte-1ul7oo4",null,ai,{active:c(Ke)===nn,disabled:F()})),De("click",Xi,J2(()=>x()?OA(nn):{})),De("keydown",Xi,J2(uC(function($i){O4.call(this,e,$i)}))),sA(io,Xi)}),sA(dt,Ut)},gt=dt=>{var Ut,io=NBA();ya(gA(io),e,"selection",{get selection(){return j()}},Zi=>{var nn=mr();Le(()=>Ht(nn,(Y(j()),Y(wA()),uA(()=>j()[wA()])))),sA(Zi,nn)}),Le(()=>Ut=Ci(io,1,"selected-item svelte-1ul7oo4",null,Ut,{"hide-selected-item":c(o)})),sA(dt,io)};zA(Ce,dt=>{M()?dt(Te):dt(gt,!1)}),sA(EA,LA)};zA(ko,EA=>{c(n)&&EA(ar)});var To=kA(ko,2);Lw(To,()=>Fe(Fe({readOnly:!hA()},c(iA)),{},{placeholder:c(r),style:Ae(),disabled:F()}),void 0,void 0,void 0,"svelte-1ul7oo4",!0),ta(To,EA=>k(EA),()=>k());var ja=kA(Oi,2),to=gA(ja),Wi=EA=>{var LA=FBA();ya(gA(LA),e,"loading-icon",{},Ce=>{(function(Te){sA(Te,bBA())})(Ce)}),sA(EA,LA)};zA(to,EA=>{te()&&EA(Wi)});var ei=kA(to,2),qn=EA=>{var LA=LBA();ya(gA(LA),e,"clear-icon",{},Ce=>{h_(Ce)}),De("click",LA,Sn),sA(EA,LA)};zA(ei,EA=>{c(a)&&EA(qn)});var _o=kA(ei,2),qo=EA=>{var LA=GBA();ya(gA(LA),e,"chevron-icon",{get listOpen(){return NA()}},Ce=>{(function(Te){sA(Te,DBA())})(Ce)}),sA(EA,LA)};zA(_o,EA=>{fe()&&EA(qo)});var SA=kA(ja,2);ya(SA,e,"input-hidden",{get value(){return j()}},EA=>{var LA=KBA();Le(Ce=>{jn(LA,"name",v()),tI(LA,Ce)},[()=>(Y(j()),uA(()=>j()?JSON.stringify(j()):null))]),sA(EA,LA)});var ee=kA(SA,2),be=EA=>{var LA=zi();ya(at(LA),e,"required",{get value(){return j()}},Ce=>{sA(Ce,UBA())}),sA(EA,LA)};return zA(ee,EA=>{Y(bA()),Y(j()),uA(()=>bA()&&(!j()||j().length===0))&&EA(be)}),Tr(()=>De("pointerup",Uo,J2(mn))),ta(Uo,EA=>S(EA),()=>S()),Ms(Uo,EA=>Vo?.(EA)),Le(()=>{var EA;pa=Ci(Uo,1,"svelte-select ".concat((EA=vt())!==null&&EA!==void 0?EA:""),"svelte-1ul7oo4",pa,{multi:M(),disabled:F(),focused:z(),"list-open":NA(),"show-chevron":fe(),error:ue()}),wg(Uo,qA())}),De("keydown",To,rt),De("blur",To,ze),De("focus",To,je),zw(To,X),sA(i,Uo),Ai(e,"getFilteredItems",YA),Ai(e,"handleClear",Sn),Yt(ca)}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -table.jse-transform-wizard.svelte-9wqi8y { - border-collapse: collapse; - border-spacing: 0; - width: 100%; -} -table.jse-transform-wizard.svelte-9wqi8y input:where(.svelte-9wqi8y) { - font-family: inherit; - font-size: inherit; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) th:where(.svelte-9wqi8y) { - font-weight: normal; - text-align: left; - width: 60px; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) { - width: 100%; - display: flex; - flex-direction: row; - margin-bottom: calc(0.5 * var(--jse-padding, 10px)); -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select .multi-item { - align-items: center; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select .value-container { - gap: 0 !important; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-filter-path { - flex: 4; - margin-right: calc(0.5 * var(--jse-padding, 10px)); -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-filter-relation { - flex: 1.5; - margin-right: calc(0.5 * var(--jse-padding, 10px)); -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-sort-path { - flex: 3; - margin-right: calc(0.5 * var(--jse-padding, 10px)); -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-sort-direction { - flex: 1; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-projection-paths { - flex: 1; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select input { - box-sizing: border-box; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .jse-filter-value:where(.svelte-9wqi8y) { - flex: 4; - padding: 4px 8px; - border: var(--jse-input-border, 1px solid #d8dbdf); - border-radius: var(--jse-input-radius, 3px); - outline: none; - background: var(--jse-input-background, var(--jse-background-color, #fff)); - color: inherit; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .jse-filter-value:where(.svelte-9wqi8y):focus { - border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); -}`);var OBA=TA('
    Filter
    Sort
    Pick
    ');function JBA(i,e){var A,t,n,o,a;Jt(e,!1);var r=cA(void 0,!0),s=cA(void 0,!0),l=cA(void 0,!0),g=cA(void 0,!0),C=cA(void 0,!0),d=cA(void 0,!0),B=dr("jsoneditor:TransformWizard"),u=K(e,"json",9),E=K(e,"queryOptions",29,()=>({})),f=K(e,"onChange",9),m=["==","!=","<","<=",">",">="].map(HA=>({value:HA,label:HA})),v=[{value:"asc",label:"ascending"},{value:"desc",label:"descending"}],S=cA((A=E())!==null&&A!==void 0&&(A=A.filter)!==null&&A!==void 0&&A.path?j2(E().filter.path):void 0,!0),k=cA((t=m.find(HA=>{var bA;return HA.value===((bA=E().filter)===null||bA===void 0?void 0:bA.relation)}))!==null&&t!==void 0?t:m[0],!0),M=cA(((n=E())===null||n===void 0||(n=n.filter)===null||n===void 0?void 0:n.value)||"",!0),x=cA((o=E())!==null&&o!==void 0&&(o=o.sort)!==null&&o!==void 0&&o.path?j2(E().sort.path):void 0,!0),F=cA((a=v.find(HA=>{var bA;return HA.value===((bA=E().sort)===null||bA===void 0?void 0:bA.direction)}))!==null&&a!==void 0?a:v[0],!0);KA(()=>Y(u()),()=>{N(r,Array.isArray(u()))}),KA(()=>(c(r),Y(u())),()=>{N(s,c(r)?x_(u()):[])}),KA(()=>(c(r),Y(u())),()=>{N(l,c(r)?x_(u(),!0):[])}),KA(()=>(c(s),j2),()=>{N(g,c(s).map(j2))}),KA(()=>(c(l),j2),()=>{N(C,c(l)?c(l).map(j2):[])}),KA(()=>(Y(E()),c(C),Ui),()=>{var HA;N(d,(HA=E())!==null&&HA!==void 0&&(HA=HA.projection)!==null&&HA!==void 0&&HA.paths&&c(C)?E().projection.paths.map(bA=>c(C).find(PA=>Ui(PA.value,bA))).filter(bA=>!!bA):void 0)}),KA(()=>c(S),()=>{var HA,bA,PA;bA=(HA=c(S))===null||HA===void 0?void 0:HA.value,Ui((PA=E())===null||PA===void 0||(PA=PA.filter)===null||PA===void 0?void 0:PA.path,bA)||(B("changeFilterPath",bA),E(qr(E(),["filter","path"],bA,!0)),f()(E()))}),KA(()=>c(k),()=>{var HA,bA,PA;bA=(HA=c(k))===null||HA===void 0?void 0:HA.value,Ui((PA=E())===null||PA===void 0||(PA=PA.filter)===null||PA===void 0?void 0:PA.relation,bA)||(B("changeFilterRelation",bA),E(qr(E(),["filter","relation"],bA,!0)),f()(E()))}),KA(()=>c(M),()=>{var HA,bA;HA=c(M),Ui((bA=E())===null||bA===void 0||(bA=bA.filter)===null||bA===void 0?void 0:bA.value,HA)||(B("changeFilterValue",HA),E(qr(E(),["filter","value"],HA,!0)),f()(E()))}),KA(()=>c(x),()=>{var HA,bA,PA;bA=(HA=c(x))===null||HA===void 0?void 0:HA.value,Ui((PA=E())===null||PA===void 0||(PA=PA.sort)===null||PA===void 0?void 0:PA.path,bA)||(B("changeSortPath",bA),E(qr(E(),["sort","path"],bA,!0)),f()(E()))}),KA(()=>c(F),()=>{var HA,bA,PA;bA=(HA=c(F))===null||HA===void 0?void 0:HA.value,Ui((PA=E())===null||PA===void 0||(PA=PA.sort)===null||PA===void 0?void 0:PA.direction,bA)||(B("changeSortDirection",bA),E(qr(E(),["sort","direction"],bA,!0)),f()(E()))}),KA(()=>c(d),()=>{(function(HA){var bA;Ui((bA=E())===null||bA===void 0||(bA=bA.projection)===null||bA===void 0?void 0:bA.paths,HA)||(B("changeProjectionPaths",HA),E(qr(E(),["projection","paths"],HA,!0)),f()(E()))})(c(d)?c(d).map(HA=>HA.value):void 0)}),Vn(),di(!0);var z=OBA(),j=gA(z),X=gA(j),eA=kA(gA(X)),Z=gA(eA),CA=gA(Z);Hd(CA,{class:"jse-filter-path",showChevron:!0,get items(){return c(g)},get value(){return c(S)},set value(HA){N(S,HA)},$$legacy:!0});var wA=kA(CA,2);Hd(wA,{class:"jse-filter-relation",showChevron:!0,clearable:!1,get items(){return m},get value(){return c(k)},set value(HA){N(k,HA)},$$legacy:!0});var BA=kA(wA,2),QA=kA(X),RA=kA(gA(QA)),dA=gA(RA),IA=gA(dA);Hd(IA,{class:"jse-sort-path",showChevron:!0,get items(){return c(g)},get value(){return c(x)},set value(HA){N(x,HA)},$$legacy:!0}),Hd(kA(IA,2),{class:"jse-sort-direction",showChevron:!0,clearable:!1,get items(){return v},get value(){return c(F)},set value(HA){N(F,HA)},$$legacy:!0});var xA=kA(QA),qA=kA(gA(xA)),ue=gA(qA);Hd(gA(ue),{class:"jse-projection-paths",multiple:!0,showChevron:!0,get items(){return c(C)},get value(){return c(d)},set value(HA){N(d,HA)},$$legacy:!0}),zw(BA,()=>c(M),HA=>N(M,HA)),sA(i,z),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-select-query-language.svelte-jrd4q2 { - position: relative; - width: 32px; -} -.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) { - position: absolute; - top: 0; - right: 0; - display: flex; - flex-direction: column; - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); -} -.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) .jse-query-language:where(.svelte-jrd4q2) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - text-align: left; - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - white-space: nowrap; - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); - background: var(--jse-context-menu-background, #656565); -} -.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) .jse-query-language:where(.svelte-jrd4q2):hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -}`);var YBA=TA(''),HBA=TA('
    ');function zBA(i,e){Jt(e,!1);var A=K(e,"queryLanguages",8),t=K(e,"queryLanguageId",12),n=K(e,"onChangeQueryLanguage",8);di();var o=HBA();Da(gA(o),5,A,Ka,(a,r)=>{var s,l=YBA(),g=gA(l),C=u=>{Bn(u,{get data(){return DM}})},d=u=>{Bn(u,{get data(){return vM}})};zA(g,u=>{c(r),Y(t()),uA(()=>c(r).id===t())?u(C):u(d,!1)});var B=kA(g);Le(()=>{var u;s=Ci(l,1,"jse-query-language svelte-jrd4q2",null,s,{selected:c(r).id===t()}),jn(l,"title",(c(r),uA(()=>"Select ".concat(c(r).name," as query language")))),Ht(B," ".concat((c(r),(u=uA(()=>c(r).name))!==null&&u!==void 0?u:"")))}),De("click",l,()=>{return u=c(r).id,t(u),void n()(u);var u}),sA(a,l)}),sA(i,o),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-header.svelte-1k211ye { - display: flex; - background: var(--jse-theme-color, #3883fa); - color: var(--jse-menu-color, var(--jse-text-color-inverse, #fff)); -} -.jse-header.svelte-1k211ye .jse-title:where(.svelte-1k211ye) { - flex: 1; - padding: 5px; - vertical-align: middle; -} -.jse-header.svelte-1k211ye button:where(.svelte-1k211ye) { - border: none; - background: transparent; - min-width: 32px; - color: inherit; - cursor: pointer; -} -.jse-header.svelte-1k211ye button:where(.svelte-1k211ye):hover { - background: rgba(255, 255, 255, 0.1); -}`);var PBA=TA(''),jBA=TA('
    ');function o5(i,e){Jt(e,!1);var A=K(e,"title",9,"Modal"),t=K(e,"fullScreenButton",9,!1),n=K(e,"fullscreen",13,!1),o=K(e,"onClose",9,void 0);di(!0);var a=jBA(),r=gA(a),s=gA(r),l=kA(r,2);ya(l,e,"actions",{},null);var g=kA(l,2),C=B=>{var u=PBA(),E=gA(u),f=lt(()=>n()?CJ:rJ);Bn(E,{get data(){return c(f)}}),De("click",u,()=>n(!n())),sA(B,u)};zA(g,B=>{t()&&B(C)});var d=kA(g,2);Bn(gA(d),{get data(){return Ou}}),Le(()=>Ht(s,A())),De("click",d,()=>{var B;return(B=o())===null||B===void 0?void 0:B()}),sA(i,a),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-config.svelte-5gkegr { - border: none; - background: transparent; - min-width: 32px; - color: inherit; - cursor: pointer; -} -.jse-config.svelte-5gkegr:hover { - background: rgba(255, 255, 255, 0.1); -} -.jse-config.hide.svelte-5gkegr { - display: none; -}`);var VBA=TA(''),E_=dr("jsoneditor:AutoScrollHandler");function BV(i){var e,A;function t(r){return r<20?200:r<50?400:1200}function n(){if(i){var r=.05*(e||0);i.scrollTop+=r}}function o(r){A&&r===e||(a(),E_("startAutoScroll",r),e=r,A=setInterval(n,50))}function a(){A&&(E_("stopAutoScroll"),clearInterval(A),A=void 0,e=void 0)}return E_("createAutoScrollHandler",i),{onDrag:function(r){if(i){var s=r.clientY,{top:l,bottom:g}=i.getBoundingClientRect();sg?o(t(s-g)):a()}},onDragEnd:function(){a()}}}var qBA=(i,e,A,t)=>(i/=t/2)<1?A/2*i*i+e:-A/2*(--i*(i-2)-1)+e,BW=()=>{var i,e,A,t,n,o,a,r,s,l,g,C,d;function B(f){return f.getBoundingClientRect().top-(i.getBoundingClientRect?i.getBoundingClientRect().top:0)+A}function u(f){i.scrollTo?i.scrollTo(i.scrollLeft,f):i.scrollTop=f}function E(f){l||(l=f),u(o(g=f-l,A,r,s)),d=!0,g1&&arguments[1]!==void 0?arguments[1]:{};switch(s=1e3,n=m.offset||0,C=m.callback,o=m.easing||qBA,a=m.a11y||!1,typeof m.container){case"object":i=m.container;break;case"string":i=document.querySelector(m.container);break;default:i=window.document.documentElement}switch(A=i.scrollTop,typeof f){case"number":e=void 0,a=!1,t=A+f;break;case"object":t=B(e=f);break;case"string":e=document.querySelector(f),t=B(e)}switch(r=t-A+n,typeof m.duration){case"number":s=m.duration;break;case"function":s=m.duration(r)}d?l=0:requestAnimationFrame(E)}};function Kh(i,e){var A=Date.now(),t=i();return e(Date.now()-A),t}var xh=dr("validation"),WBA={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function hV(i,e,A,t){return px(i,e,A,t,WBA)}function hW(i,e,A,t){if(xh("validateJSON"),!e)return[];if(A!==t){var n=A.stringify(i);return e(n!==void 0?t.parse(n):void 0)}return e(i)}function ZBA(i,e,A,t){if(xh("validateText"),i.length>104857600)return{validationErrors:[{path:[],message:"Validation turned off: the document is too large",severity:Ec.info}]};if(i.length!==0)try{var n=Kh(()=>A.parse(i),s=>xh("validate: parsed json in ".concat(s," ms")));if(!e)return;var o=A===t?n:Kh(()=>t.parse(i),s=>xh("validate: parsed json with the validationParser in ".concat(s," ms"))),a=Kh(()=>e(o),s=>xh("validate: validated json in ".concat(s," ms")));return An(a)?void 0:{validationErrors:a}}catch(s){var r=Kh(()=>(function(l,g){if(l.length>bIA)return!1;try{return g.parse(gg(l)),!0}catch(C){return!1}})(i,A),l=>xh("validate: checked whether repairable in ".concat(l," ms")));return{parseError:Xh(i,s.message||s.toString()),isRepairable:r}}}var bw=dr("jsoneditor:FocusTracker");function vx(i){var e,{onMount:A,onDestroy:t,getWindow:n,hasFocus:o,onFocus:a,onBlur:r}=i,s=!1;function l(){var C=o();C&&(clearTimeout(e),s||(bw("focus"),a(),s=C))}function g(){s&&(clearTimeout(e),e=setTimeout(()=>{o()||(bw("blur"),s=!1,r())}))}A(()=>{bw("mount FocusTracker");var C=n();C&&(C.addEventListener("focusin",l,!0),C.addEventListener("focusout",g,!0))}),t(()=>{bw("destroy FocusTracker");var C=n();C&&(C.removeEventListener("focusin",l,!0),C.removeEventListener("focusout",g,!0))})}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-message.svelte-cbvd26 { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - padding: var(--jse-padding, 10px); - display: flex; - gap: var(--jse-padding, 10px); - flex-wrap: wrap; - align-items: stretch; -} -.jse-message.jse-success.svelte-cbvd26 { - background: var(--message-success-background, #9ac45d); - color: var(--jse-message-success-color, #fff); -} -.jse-message.svelte-cbvd26 .jse-text:where(.svelte-cbvd26) { - display: flex; - flex: 1; - min-width: 60%; - align-items: center; -} -.jse-message.svelte-cbvd26 .jse-text.jse-clickable:where(.svelte-cbvd26) { - cursor: pointer; -} -.jse-message.svelte-cbvd26 .jse-text.jse-clickable:where(.svelte-cbvd26):hover { - background-color: rgba(255, 255, 255, 0.1); -} -.jse-message.jse-error.svelte-cbvd26 { - background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); - color: var(--jse-message-error-color, #fff); -} -.jse-message.jse-warning.svelte-cbvd26 { - background: var(--jse-message-warning-background, #ffde5c); - color: var(--jse-message-warning-color, #4d4d4d); -} -.jse-message.jse-info.svelte-cbvd26 { - background: var(--jse-message-info-background, #4f91ff); - color: var(--jse-message-info-color, #fff); -} -.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) { - display: flex; - gap: var(--jse-padding, 10px); -} -.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) button.jse-action:where(.svelte-cbvd26) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-message-action-background, rgba(255, 255, 255, 0.2)); - color: inherit; - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); -} -.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) button.jse-action:where(.svelte-cbvd26):hover { - background: var(--jse-message-action-background-highlight, rgba(255, 255, 255, 0.3)); -}`);var XBA=TA(''),$BA=TA('
    ');function Hl(i,e){Jt(e,!1);var A=K(e,"type",9,"success"),t=K(e,"icon",9,void 0),n=K(e,"message",9,void 0),o=K(e,"actions",25,()=>[]),a=K(e,"onClick",9,void 0),r=K(e,"onClose",9,void 0);r()&&Dg(r()),di(!0);var s,l=$BA(),g=gA(l),C=gA(g),d=gA(C),B=E=>{Bn(E,{get data(){return t()}})};zA(d,E=>{t()&&E(B)});var u=kA(d);Da(kA(g,2),5,o,Ka,(E,f)=>{var m=XBA(),v=gA(m),S=M=>{Bn(M,{get data(){return c(f),uA(()=>c(f).icon)}})};zA(v,M=>{c(f),uA(()=>c(f).icon)&&M(S)});var k=kA(v);Le(()=>{var M;jn(m,"title",(c(f),uA(()=>c(f).title))),m.disabled=(c(f),uA(()=>c(f).disabled)),Ht(k," ".concat((c(f),(M=uA(()=>c(f).text))!==null&&M!==void 0?M:"")))}),De("click",m,()=>{c(f).onClick&&c(f).onClick()}),De("mousedown",m,()=>{c(f).onMouseDown&&c(f).onMouseDown()}),sA(E,m)}),Le(()=>{var E,f;Ci(l,1,"jse-message jse-".concat((E=A())!==null&&E!==void 0?E:""),"svelte-cbvd26"),s=Ci(g,1,"jse-text svelte-cbvd26",null,s,{"jse-clickable":!!a()}),Ht(u," ".concat((f=n())!==null&&f!==void 0?f:""))}),De("click",g,function(){a()&&a()()}),sA(i,l),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-validation-errors-overview.svelte-1342rh4 { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - overflow: auto; - max-height: 25%; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) { - border-collapse: collapse; - width: 100%; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) { - cursor: pointer; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-error:where(.svelte-1342rh4) { - background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); - color: var(--jse-message-error-color, #fff); -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-warning:where(.svelte-1342rh4) { - background: var(--jse-message-warning-background, #ffde5c); - color: var(--jse-message-warning-color, #4d4d4d); -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-warning:where(.svelte-1342rh4):hover { - filter: brightness(105%); -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-info:where(.svelte-1342rh4) { - background: var(--jse-message-info-background, #4f91ff); - color: var(--jse-message-info-color, #fff); -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4):hover { - filter: brightness(110%); -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td:where(.svelte-1342rh4) { - padding: 4px var(--jse-padding, 10px); - vertical-align: middle; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-icon:where(.svelte-1342rh4) { - width: 36px; - box-sizing: border-box; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) { - width: 36px; - box-sizing: border-box; - padding: 0; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) button.jse-validation-errors-collapse:where(.svelte-1342rh4) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - width: 36px; - height: 26px; - cursor: pointer; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) button.jse-validation-errors-collapse:where(.svelte-1342rh4):hover { - background-color: rgba(255, 255, 255, 0.2); -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td:where(.svelte-1342rh4) div.jse-validation-errors-expand:where(.svelte-1342rh4) { - display: inline-block; - position: relative; - top: 3px; -}`);var AhA=TA(''),ehA=TA(' '),thA=TA(' '),ihA=TA('
    '),nhA=TA('
    '),ohA=TA('
    ');function bx(i,e){Jt(e,!1);var A=cA(void 0,!0),t=K(e,"validationErrors",9),n=K(e,"selectError",9),o=cA(!0,!0);function a(){N(o,!1)}function r(){N(o,!0)}KA(()=>Y(t()),()=>{N(A,t().length)}),Vn(),di(!0);var s=zi(),l=at(s),g=C=>{var d=ohA(),B=gA(d),u=f=>{var m=ihA(),v=gA(m),S=gA(v);Da(S,1,()=>(Y(Pw),Y(t()),Y(fw),uA(()=>Pw(t(),fw))),Ka,(x,F,z)=>{var j=ehA(),X=gA(j);Bn(gA(X),{get data(){return w2}});var eA=kA(X),Z=gA(eA),CA=kA(eA),wA=gA(CA),BA=gA(kA(CA)),QA=RA=>{var dA=AhA();Bn(gA(dA),{get data(){return cJ}}),De("click",dA,uC(a)),sA(RA,dA)};zA(BA,RA=>{Y(t()),uA(()=>z===0&&t().length>1)&&RA(QA)}),Le(RA=>{var dA;Ci(j,1,"jse-validation-".concat((c(F),(dA=uA(()=>c(F).severity))!==null&&dA!==void 0?dA:"")),"svelte-1342rh4"),Ht(Z,RA),Ht(wA,(c(F),uA(()=>c(F).message)))},[()=>(Y(El),c(F),uA(()=>El(c(F).path)))]),De("click",j,()=>{setTimeout(()=>n()(c(F)))}),sA(x,j)});var k=kA(S),M=x=>{var F=thA(),z=kA(gA(F),2),j=gA(z);Le(()=>Ht(j,"(and ".concat(c(A)-fw," more errors)"))),sA(x,F)};zA(k,x=>{c(A)>fw&&x(M)}),sA(f,m)},E=f=>{var m=nhA(),v=gA(m),S=gA(v),k=gA(S);Bn(gA(k),{get data(){return w2}});var M=gA(kA(k));Bn(gA(kA(M)),{get data(){return _M}}),Le(x=>{var F;Ci(S,1,"jse-validation-".concat(x??""),"svelte-1342rh4"),Ht(M,"".concat((F=c(A))!==null&&F!==void 0?F:""," validation errors "))},[()=>(Y(t()),uA(()=>{return x=t(),[Ec.error,Ec.warning,Ec.info].find(F=>x.some(z=>z.severity===F));var x}))]),De("click",S,r),sA(f,m)};zA(B,f=>{c(o)||c(A)===1?f(u):f(E,!1)}),sA(C,d)};zA(l,C=>{Y(An),Y(t()),uA(()=>!An(t()))&&C(g)}),sA(i,s),Yt()}function a5(i,e){if(i)return i.addEventListener("keydown",A),{destroy(){i.removeEventListener("keydown",A)}};function A(t){t.key==="Escape"&&(t.preventDefault(),t.stopPropagation(),e())}}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -dialog.jse-modal.svelte-2aoco4 { - border-radius: 3px; - font-size: var(--jse-padding, 10px); - border: none; - padding: 0; - display: flex; - min-width: 0; - margin: auto; - overflow: visible; - transition: width 0.1s ease-in-out, height 0.1s ease-in-out; -} -dialog.jse-modal.jse-sort-modal.svelte-2aoco4 { - width: 400px; -} -dialog.jse-modal.jse-repair-modal.svelte-2aoco4 { - width: 600px; - height: 500px; -} -dialog.jse-modal.jse-jsoneditor-modal.svelte-2aoco4 { - width: 800px; - height: 600px; -} -dialog.jse-modal.jse-transform-modal.svelte-2aoco4 { - width: 1200px; - height: 800px; -} -dialog.jse-modal.jse-fullscreen.svelte-2aoco4 { - width: 100%; - height: 100%; -} -dialog.jse-modal.svelte-2aoco4::backdrop { - background: var(--jse-overlay-background, rgba(0, 0, 0, 0.3)); -} -dialog.jse-modal[open].svelte-2aoco4 { - animation: svelte-2aoco4-zoom 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); -} -dialog.jse-modal[open].svelte-2aoco4::backdrop { - animation: svelte-2aoco4-fade 0.2s ease-out; -} -dialog.jse-modal.svelte-2aoco4 .jse-modal-inner:where(.svelte-2aoco4) { - flex: 1; - display: flex; - flex-direction: column; - min-width: 0; - min-height: 0; - padding: 0; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - line-height: normal; - background: var(--jse-modal-background, #f5f5f5); - color: var(--jse-text-color, #4d4d4d); -} -@keyframes svelte-2aoco4-zoom { - from { - transform: scale(0.95); - } - to { - transform: scale(1); - } -} -@keyframes svelte-2aoco4-fade { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -dialog.jse-modal.svelte-2aoco4 .svelte-select { - --border: var(--jse-svelte-select-border, 1px solid #d8dbdf); - --item-is-active-bg: var(--jse-item-is-active-bg, #3883fa); - --border-radius: var(--jse-svelte-select-border-radius, 3px); - --background: var(--jse-svelte-select-background, #fff); - --padding: var(--jse-svelte-select-padding, 0 10px); - --multi-select-padding: var(--jse-svelte-select-multi-select-padding, 0 10px); - --font-size: var(--jse-svelte-select-font-size, var(--jse-font-size, 16px)); - --height: 36px; - --multi-item-height: 28px; - --multi-item-margin: 2px; - --multi-item-padding: 2px 8px; - --multi-item-border-radius: 6px; - --indicator-top: 8px; -}`);var ahA=TA('
    ');function np(i,e){Jt(e,!1);var A=K(e,"className",8,void 0),t=K(e,"fullscreen",8,!1),n=K(e,"onClose",8),o=cA();function a(){n()()}os(()=>c(o).showModal()),Dg(()=>c(o).close()),di();var r,s=ahA(),l=gA(s);ya(gA(l),e,"default",{},null),ta(s,g=>N(o,g),()=>c(o)),Tr(()=>De("close",s,a)),Tr(()=>{return De("pointerdown",s,(g=a,function(){for(var C=arguments.length,d=new Array(C),B=0;BDe("cancel",s,J2(function(g){O4.call(this,e,g)}))),Ms(s,(g,C)=>a5?.(g,C),()=>a),Le(g=>r=Ci(s,1,g,"svelte-2aoco4",r,{"jse-fullscreen":t()}),[()=>o1((Y(wc),Y(A()),uA(()=>wc("jse-modal",A()))))]),sA(i,s),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-modal-contents.svelte-10a6ob6 { - flex: 1; - display: flex; - flex-direction: column; - padding: 20px; - overflow: auto; - min-width: 0; - min-height: 0; -} -.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-top: var(--jse-padding, 10px); -} -.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} - -.jse-shortcuts.svelte-10a6ob6 { - display: flex; - flex-wrap: wrap; - justify-content: space-around; - margin: calc(2 * var(--jse-padding, 10px)) 0; -} -.jse-shortcuts.svelte-10a6ob6 .jse-shortcut:where(.svelte-10a6ob6) .jse-key:where(.svelte-10a6ob6) { - font-size: 200%; - color: var(--jse-theme-color, #3883fa); -}`);var rhA=TA('
    Clipboard permission is disabled by your browser. You can use:
    for copy
    for cut
    for paste
    ',1);function EW(i,e){Jt(e,!1);var A=K(e,"onClose",9),t=Cx()?"\u2318":"Ctrl";di(!0),np(i,{get onClose(){return A()},className:"jse-copy-paste",children:(n,o)=>{var a=rhA(),r=at(a);o5(r,{title:"Copying and pasting",get onClose(){return A()}});var s=kA(r,2),l=kA(gA(s),2),g=gA(l),C=gA(g),d=gA(C),B=kA(g,2),u=gA(B),E=gA(u),f=gA(kA(B,2)),m=gA(f),v=gA(kA(l,2));Le(()=>{Ht(d,"".concat(t,"+C")),Ht(E,"".concat(t,"+X")),Ht(m,"".concat(t,"+V"))}),De("click",v,function(){for(var S,k=arguments.length,M=new Array(k),x=0;x'),lhA=TA('
    '),ghA=TA(''),chA=TA('
    ');function p5(i,e){Jt(e,!1);var A=K(e,"items",25,()=>[]);di(!0);var t=chA(),n=gA(t);ya(n,e,"left",{},null);var o=kA(n,2);Da(o,1,A,Ka,(a,r)=>{var s=zi(),l=at(s),g=d=>{sA(d,shA())},C=d=>{var B=zi(),u=at(B),E=m=>{sA(m,lhA())},f=m=>{var v=zi(),S=at(v),k=x=>{var F=ghA(),z=gA(F),j=Z=>{Bn(Z,{get data(){return c(r),uA(()=>c(r).icon)}})};zA(z,Z=>{c(r),uA(()=>c(r).icon)&&Z(j)});var X=kA(z,2),eA=Z=>{var CA=mr();Le(()=>Ht(CA,(c(r),uA(()=>c(r).text)))),sA(Z,CA)};zA(X,Z=>{c(r),uA(()=>c(r).text)&&Z(eA)}),Le(()=>{var Z;Ci(F,1,"jse-button ".concat((c(r),(Z=uA(()=>c(r).className))!==null&&Z!==void 0?Z:"")),"svelte-3erbu0"),jn(F,"title",(c(r),uA(()=>c(r).title))),F.disabled=(c(r),uA(()=>c(r).disabled||!1))}),De("click",F,function(){for(var Z,CA=arguments.length,wA=new Array(CA),BA=0;BA{var F=mr();Le(z=>Ht(F,z),[()=>(c(r),uA(()=>(function(z){return console.error("Unknown type of menu item",z),"???"})(c(r))))]),sA(x,F)};zA(S,x=>{Y(pC),c(r),uA(()=>pC(c(r)))?x(k):x(M,!1)},!0),sA(m,v)};zA(u,m=>{Y(L_),c(r),uA(()=>L_(c(r)))?m(E):m(f,!1)},!0),sA(d,B)};zA(l,d=>{Y(P2),c(r),uA(()=>P2(c(r)))?d(g):d(C,!1)}),sA(a,s)}),ya(kA(o,2),e,"right",{},null),sA(i,t),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-json-repair-component.svelte-16jv58j { - flex: 1; - display: flex; - flex-direction: column; - background: var(--jse-background-color, #fff); - color: var(--jse-text-color, #4d4d4d); -} -.jse-json-repair-component.svelte-16jv58j .jse-info:where(.svelte-16jv58j) { - padding: calc(0.5 * var(--jse-padding, 10px)); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - vertical-align: center; -} -.jse-json-repair-component.svelte-16jv58j .jse-json-text:where(.svelte-16jv58j) { - flex: 1; - border: none; - padding: 2px; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - background: var(--jse-input-background, var(--jse-background-color, #fff)); - color: var(--jse-text-color, #4d4d4d); - resize: none; - outline: none; -}`);var ChA=TA('
    Repair invalid JSON, then click apply
    '),dhA=TA('
    ');function IhA(i,e){Jt(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=cA(void 0,!0),o=cA(void 0,!0),a=cA(void 0,!0),r=cA(void 0,!0),s=K(e,"text",13,""),l=K(e,"readOnly",9,!1),g=K(e,"onParse",9),C=K(e,"onRepair",9),d=K(e,"onChange",9,void 0),B=K(e,"onApply",9),u=K(e,"onCancel",9),E=dr("jsoneditor:JSONRepair"),f=cA(void 0,!0);function m(){if(c(f)&&c(A)){var eA=c(A).position!==void 0?c(A).position:0;c(f).setSelectionRange(eA,eA),c(f).focus()}}function v(){B()(s())}function S(){try{s(C()(s())),d()&&d()(s())}catch(eA){}}var k=cA(void 0,!0);KA(()=>Y(s()),()=>{N(A,(function(eA){try{return void g()(eA)}catch(Z){return Xh(eA,Z.message)}})(s()))}),KA(()=>Y(s()),()=>{N(t,(function(eA){try{return C()(eA),!0}catch(Z){return!1}})(s()))}),KA(()=>c(A),()=>{E("error",c(A))}),KA(()=>Y(u()),()=>{N(k,[{type:"space"},{type:"button",icon:Ou,title:"Cancel repair",className:"jse-cancel",onClick:u()}])}),KA(()=>NM,()=>{N(n,{icon:NM,text:"Show me",title:"Scroll to the error location",onClick:m})}),KA(()=>oC,()=>{N(o,{icon:oC,text:"Auto repair",title:"Automatically repair JSON",onClick:S})}),KA(()=>(c(t),c(n),c(o)),()=>{N(a,c(t)?[c(n),c(o)]:[c(n)])}),KA(()=>Y(l()),()=>{N(r,[{icon:w6,text:"Apply",title:"Apply fixed JSON",disabled:l(),onClick:v}])}),Vn(),di(!0);var M=dhA(),x=gA(M);p5(x,{get items(){return c(k)},$$slots:{left:(eA,Z)=>{sA(eA,ChA())}}});var F=kA(x,2),z=eA=>{var Z=lt(()=>(c(A),uA(()=>"Cannot parse JSON: ".concat(c(A).message))));Hl(eA,{type:"error",get icon(){return w2},get message(){return c(Z)},get actions(){return c(a)}})},j=eA=>{Hl(eA,{type:"success",message:"JSON is valid now and can be parsed.",get actions(){return c(r)}})};zA(F,eA=>{c(A)?eA(z):eA(j,!1)});var X=kA(F,2);ta(X,eA=>N(f,eA),()=>c(f)),Le(()=>{X.readOnly=l(),tI(X,s())}),De("input",X,function(eA){E("handleChange");var Z=eA.target.value;s()!==Z&&(s(Z),d()&&d()(s()))}),sA(i,M),Yt()}function QW(i,e){Jt(e,!1);var A=K(e,"text",13),t=K(e,"onParse",9),n=K(e,"onRepair",9),o=K(e,"onApply",9),a=K(e,"onClose",9);function r(l){o()(l),a()()}function s(){a()()}di(!0),np(i,{get onClose(){return a()},className:"jse-repair-modal",children:(l,g)=>{IhA(l,{get onParse(){return t()},get onRepair(){return n()},onApply:r,onCancel:s,get text(){return A()},set text(C){A(C)},$$legacy:!0})},$$slots:{default:!0}}),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -div.jse-collapsed-items.svelte-1v6dhm4 { - margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); - padding: calc(0.5 * var(--jse-padding, 10px)); - border: 8px solid transparent; - border-width: 8px 0; - background-color: var(--jse-contents-background-color, transparent); - background-image: linear-gradient(var(--jse-collapsed-items-background-color, #f5f5f5), var(--jse-collapsed-items-background-color, #f5f5f5)), linear-gradient(to bottom right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to bottom left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%); - background-repeat: repeat, repeat-x, repeat-x, repeat-x, repeat-x; - background-position: 0 0, 8px 0, 8px 0, 8px 100%, 8px 100%; - background-size: auto auto, 16px 16px, 16px 16px, 16px 16px, 16px 16px; - background-clip: padding-box, border-box, border-box, border-box, border-box; - background-origin: padding-box, border-box, border-box, border-box, border-box; - display: flex; -} -div.jse-collapsed-items.jse-selected.svelte-1v6dhm4 { - background-color: var(--jse-selection-background-color, #d3d3d3); - --jse-collapsed-items-background-color: var(--jse-collapsed-items-selected-background-color, #c2c2c2); -} -div.jse-collapsed-items.svelte-1v6dhm4 div.jse-text:where(.svelte-1v6dhm4), -div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4) { - margin: 0 calc(0.5 * var(--jse-padding, 10px)); -} -div.jse-collapsed-items.svelte-1v6dhm4 div.jse-text:where(.svelte-1v6dhm4) { - display: inline; -} -div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4) { - font-family: inherit; - font-size: inherit; - color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); - background: none; - border: none; - padding: 0; - text-decoration: underline; - cursor: pointer; -} -div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4):hover, div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4):focus { - color: var(--jse-collapsed-items-link-color-highlight, #ee5341); -}`);var BhA=TA(''),hhA=TA('
    ');function EhA(i,e){Jt(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=cA(void 0,!0),o=cA(void 0,!0),a=cA(void 0,!0),r=K(e,"visibleSections",9),s=K(e,"sectionIndex",9),l=K(e,"total",9),g=K(e,"path",9),C=K(e,"selection",9),d=K(e,"onExpandSection",9),B=K(e,"context",9);KA(()=>(Y(r()),Y(s())),()=>{N(A,r()[s()])}),KA(()=>c(A),()=>{N(t,c(A).end)}),KA(()=>(Y(r()),Y(s()),Y(l())),()=>{N(n,r()[s()+1]?r()[s()+1].start:l())}),KA(()=>(Y(B()),Y(C()),Y(g()),c(t)),()=>{N(o,ep(B().getJson(),C(),g().concat(String(c(t)))))}),KA(()=>(c(t),c(n)),()=>{N(a,(function(k,M){var x={start:k,end:Math.min(F_(k),M)},F=Math.max(Vw((k+M)/2),k),z={start:F,end:Math.min(F_(F),M)},j=Vw(M),X=j===M?j-Z4:j,eA={start:Math.max(X,k),end:M},Z=[x],CA=z.start>=x.end&&z.end<=eA.start;return CA&&Z.push(z),eA.start>=(CA?z.end:x.end)&&Z.push(eA),Z})(c(t),c(n)))}),Vn(),di(!0);var u,E,f=hhA(),m=gA(f),v=gA(m),S=gA(v);Da(kA(v,2),1,()=>c(a),Ka,(k,M)=>{var x=BhA(),F=gA(x);Le(()=>{var z,j;return Ht(F,"show ".concat((c(M),(z=uA(()=>c(M).start))!==null&&z!==void 0?z:""),"-").concat((c(M),(j=uA(()=>c(M).end))!==null&&j!==void 0?j:"")))}),De("click",x,()=>d()(g(),c(M))),sA(k,x)}),Le(()=>{var k,M;u=Ci(f,1,"jse-collapsed-items svelte-1v6dhm4",null,u,{"jse-selected":c(o)}),E=wg(f,"",E,{"--level":(Y(g()),uA(()=>g().length+2))}),Ht(S,"Items ".concat((k=c(t))!==null&&k!==void 0?k:"","-").concat((M=c(n))!==null&&M!==void 0?M:""))}),De("mousemove",f,function(k){k.stopPropagation()}),sA(i,f),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-context-menu-pointer.svelte-10ijtzr { - position: absolute; - top: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); - right: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); - width: var(--jse-context-menu-pointer-size, calc(1em + 4px)); - height: var(--jse-context-menu-pointer-size, calc(1em + 4px)); - padding: 0; - margin: 0; - cursor: pointer; - background: transparent; - border-radius: 2px; - background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); - color: var(--jse-context-menu-pointer-color, var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff))); - border: none; - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); -} -.jse-context-menu-pointer.jse-root.svelte-10ijtzr { - top: 0; - right: calc(-2px - var(--jse-context-menu-pointer-size, calc(1em + 4px))); -} -.jse-context-menu-pointer.jse-insert.svelte-10ijtzr { - right: -1px; -} -.jse-context-menu-pointer.svelte-10ijtzr:hover { - background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); -} -.jse-context-menu-pointer.jse-selected.svelte-10ijtzr { - background: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); -} -.jse-context-menu-pointer.jse-selected.svelte-10ijtzr:hover { - background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); -}`);var QhA=TA('');function Y2(i,e){Jt(e,!1);var A=K(e,"root",9,!1),t=K(e,"insert",9,!1),n=K(e,"selected",9),o=K(e,"onContextMenu",9);di(!0);var a,r=QhA();Bn(gA(r),{get data(){return r0}}),Le(()=>{a=Ci(r,1,"jse-context-menu-pointer svelte-10ijtzr",null,a,{"jse-root":A(),"jse-insert":t(),"jse-selected":n()}),jn(r,"title",Ix)}),De("click",r,function(s){for(var l=s.target;l&&l.nodeName!=="BUTTON";)l=l.parentNode;l&&o()({anchor:l,left:0,top:0,width:yC,height:wC,offsetTop:2,offsetLeft:0,showTip:!0})}),sA(i,r),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-key.svelte-1n4cez4 { - display: inline-block; - min-width: 2em; - padding: 0 5px; - box-sizing: border-box; - outline: none; - border-radius: 1px; - vertical-align: top; - color: var(--jse-key-color, #1a1a1a); - word-break: normal; - overflow-wrap: normal; - white-space: pre-wrap; -} -.jse-key.jse-empty.svelte-1n4cez4 { - min-width: 3em; - outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - -moz-outline-radius: 2px; -} -.jse-key.jse-empty.svelte-1n4cez4::after { - pointer-events: none; - color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - content: "key"; -}`);var uhA=TA('
    '),phA=TA(" ",1),fhA=TA('
    ');function uW(i,e){Jt(e,!0);var A=Bl(()=>bn(e.selection)&&gr(e.selection)),t=Bl(()=>e.context.onRenderValue({path:e.path,value:e.value,mode:e.context.mode,truncateTextSize:e.context.truncateTextSize,readOnly:e.context.readOnly,enforceString:e.enforceString,isEditing:c(A),parser:e.context.parser,normalization:e.context.normalization,selection:e.selection,searchResultItems:e.searchResultItems,onPatch:e.context.onPatch,onPasteJson:e.context.onPasteJson,onSelect:e.context.onSelect,onFind:e.context.onFind,findNextInside:e.context.findNextInside,focus:e.context.focus})),n=zi();Da(at(n),17,()=>c(t),Ka,(o,a)=>{var r=zi(),s=at(r),l=C=>{var d=Bl(()=>c(a).action),B=fhA();Ms(B,(u,E)=>{var f;return(f=c(d))===null||f===void 0?void 0:f(u,E)},()=>c(a).props),sA(C,B)},g=C=>{var d=Bl(()=>c(a).component),B=zi();fq(at(B),()=>c(d),(u,E)=>{E(u,t1(()=>c(a).props))}),sA(C,B)};zA(s,C=>{xIA(c(a))?C(l):C(g,!1)}),sA(o,r)}),sA(i,n),Yt()}var mhA={selecting:!1,selectionAnchor:void 0,selectionAnchorType:void 0,selectionFocus:void 0,dragging:!1};function Q_(i){var{json:e,selection:A,deltaY:t,items:n}=i;if(!A)return{operations:void 0,updatedSelection:void 0,offset:0};var o=t<0?(function(g){for(var{json:C,items:d,selection:B,deltaY:u}=g,E=DC(C,B),f=d.findIndex(x=>Ui(x.path,E)),m=()=>{var x;return(x=d[v-1])===null||x===void 0?void 0:x.height},v=f,S=0;m()!==void 0&&Math.abs(u)>S+m()/2;)S+=m(),v-=1;var k=d[v].path,M=v-f;return v!==f&&d[v]!==void 0?{beforePath:k,offset:M}:void 0})({json:e,selection:A,deltaY:t,items:n}):(function(g){for(var C,{json:d,items:B,selection:u,deltaY:E}=g,f=n1(d,u),m=B.findIndex(X=>Ui(X.path,f)),v=0,S=m,k=()=>{var X;return(X=B[S+1])===null||X===void 0?void 0:X.height};k()!==void 0&&Math.abs(E)>v+k()/2;)v+=k(),S+=1;var M=an(f),x=$e(d,M),F=Array.isArray(x)?S:S+1,z=(C=B[F])===null||C===void 0?void 0:C.path,j=S-m;return z?{beforePath:z,offset:j}:{append:!0,offset:j}})({json:e,selection:A,deltaY:t,items:n});if(!o||o.offset===0)return{operations:void 0,updatedSelection:void 0,offset:0};var a=(function(g,C,d){if(!C)return[];var B="beforePath"in d?d.beforePath:void 0,u="append"in d?d.append:void 0,E=an(Qt(C)),f=$e(g,E);if(!(u||B&&v0(B,E)&&B.length>E.length))return[];var m=DC(g,C),v=n1(g,C),S=Ji(m),k=Ji(v),M=B?B[E.length]:void 0;if(!Ea(f)){if(sa(f)){var x=Or(S),F=Or(k),z=M!==void 0?Or(M):f.length;return sF(F-x+1,z({op:"move",from:xt(E.concat(String(x+CA))),path:xt(E.concat(String(z+CA)))}):()=>({op:"move",from:xt(E.concat(String(x))),path:xt(E.concat(String(z)))}))}throw new Error("Cannot create move operations: parent must be an Object or Array")}var j=Object.keys(f),X=j.indexOf(S),eA=j.indexOf(k),Z=u?j.length:M!==void 0?j.indexOf(M):-1;return X!==-1&&eA!==-1&&Z!==-1?Z>X?[...j.slice(X,eA+1),...j.slice(Z,j.length)].map(CA=>r1(E,CA)):[...j.slice(Z,X),...j.slice(eA+1,j.length)].map(CA=>r1(E,CA)):[]})(e,A,o),r=an(DC(e,A)),s=$e(e,r);if(Array.isArray(s)){var l=(function(g){var C,d,{items:B,json:u,selection:E,offset:f}=g,m=DC(u,E),v=n1(u,E),S=B.findIndex(F=>Ui(F.path,m)),k=B.findIndex(F=>Ui(F.path,v)),M=(C=B[S+f])===null||C===void 0?void 0:C.path,x=(d=B[k+f])===null||d===void 0?void 0:d.path;return vs(M,x)})({items:n,json:e,selection:A,offset:o.offset});return{operations:a,updatedSelection:l,offset:o.offset}}return{operations:a,updatedSelection:void 0,offset:o.offset}}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -button.jse-validation-error.svelte-q6a061 { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - padding: 0; - margin: 0; - vertical-align: top; - display: inline-flex; - color: var(--jse-error-color, #ee5341); -} - -button.jse-validation-info.svelte-q6a061 { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - padding: 0; - margin: 0; - vertical-align: top; - display: inline-flex; - color: var(--jse-info-color, #4f91ff); -} - -button.jse-validation-warning.svelte-q6a061 { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - padding: 0; - margin: 0; - vertical-align: top; - display: inline-flex; - color: var(--jse-warning-color, #fdc539); -}`);var whA=TA('');function zh(i,e){Jt(e,!1);var A=cA(),t=s1("absolute-popup"),n=K(e,"validationError",8),o=K(e,"onExpand",8);KA(()=>Y(n()),()=>{N(A,_IA(n())&&n().isChildError?"Contains invalid data":n().message)}),Vn(),di();var a=whA();Bn(gA(a),{get data(){return w2}}),Tr(()=>De("click",a,function(){for(var r,s=arguments.length,l=new Array(s),g=0;gtE?.(r,s),()=>Fe({text:c(A)},t)),Le(()=>{var r;return Ci(a,1,"jse-validation-".concat((Y(n()),(r=uA(()=>n().severity))!==null&&r!==void 0?r:"")),"svelte-q6a061")}),sA(i,a),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-expand.svelte-1qi6rc1 { - width: var(--jse-indent-size, calc(1em + 4px)); - padding: 0; - margin: 0; - border: none; - cursor: pointer; - background: transparent; - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); - font-size: var(--jse-font-size-mono, 14px); - height: var(--jse-line-height, calc(1em + 4px)); -} -.jse-expand.svelte-1qi6rc1:hover { - opacity: 0.8; -} - -.jse-meta.svelte-1qi6rc1, -.jse-separator.svelte-1qi6rc1, -.jse-index.svelte-1qi6rc1, -.jse-bracket.svelte-1qi6rc1 { - vertical-align: top; - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); -} - -.jse-index.svelte-1qi6rc1 { - padding: 0 calc(0.5 * var(--jse-padding, 10px)); -} - -.jse-bracket.svelte-1qi6rc1 { - padding: 0 2px; -} -.jse-bracket.jse-expanded.svelte-1qi6rc1 { - padding-right: var(--jse-padding, 10px); -} - -.jse-identifier.svelte-1qi6rc1 { - vertical-align: top; - position: relative; -} - -.jse-json-node.svelte-1qi6rc1 { - position: relative; - color: var(--jse-text-color, #4d4d4d); -} -.jse-json-node.jse-root.svelte-1qi6rc1 { - min-height: 100%; - padding-bottom: 2px; - box-sizing: border-box; -} -.jse-json-node.jse-root.svelte-1qi6rc1 > .jse-contents-outer:where(.svelte-1qi6rc1) > .jse-contents:where(.svelte-1qi6rc1) { - padding-left: 0; -} -.jse-json-node.svelte-1qi6rc1 .jse-props:where(.svelte-1qi6rc1), -.jse-json-node.svelte-1qi6rc1 .jse-items:where(.svelte-1qi6rc1) { - position: relative; -} -.jse-json-node.svelte-1qi6rc1 .jse-header-outer:where(.svelte-1qi6rc1), -.jse-json-node.svelte-1qi6rc1 .jse-footer-outer:where(.svelte-1qi6rc1) { - display: flex; - margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); -} -.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1) { - position: relative; -} -.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1) .jse-meta:where(.svelte-1qi6rc1) > .jse-meta-inner:where(.svelte-1qi6rc1) { - display: flex; - justify-content: center; -} -.jse-json-node.svelte-1qi6rc1 .jse-contents-outer:where(.svelte-1qi6rc1) { - display: flex; - margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); -} -.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), -.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) { - display: flex; - flex-direction: row; - align-items: flex-start; -} -.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) { - padding-left: var(--jse-indent-size, calc(1em + 4px)); - cursor: var(--jse-contents-cursor, pointer); -} -.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) .jse-value-outer:where(.svelte-1qi6rc1) { - display: inline-flex; -} -.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { - display: inline-flex; - padding-left: calc(var(--jse-indent-size, calc(1em + 4px)) + 5px); -} -.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), -.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1), -.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { - background: var(--jse-contents-background-color, transparent); -} -.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area:where(.svelte-1qi6rc1) { - padding: 0 calc(0.5 * var(--jse-padding, 10px)); - flex: 1; -} -.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area.jse-inside:where(.svelte-1qi6rc1) { - display: inline-flex; - align-items: center; -} -.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area.jse-after:where(.svelte-1qi6rc1) { - display: flex; - align-items: flex-end; -} -.jse-json-node.svelte-1qi6rc1 .jse-context-menu-pointer-anchor:where(.svelte-1qi6rc1) { - position: relative; -} -.jse-json-node.svelte-1qi6rc1 .jse-insert-area:where(.svelte-1qi6rc1) { - display: flex; - position: relative; - z-index: 1; - margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); - max-width: 250px; - min-width: 100px; - height: 0; - margin-right: calc(0.5 * var(--jse-padding, 10px)); - outline: 1px solid; -} -.jse-json-node.svelte-1qi6rc1 .jse-insert-area.jse-hovered:where(.svelte-1qi6rc1) { - outline-color: var(--jse-context-menu-pointer-hover-background, #b2b2b2); -} -.jse-json-node.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1) { - position: relative; -} -.jse-json-node.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1):hover, -.jse-json-node.svelte-1qi6rc1 .jse-value-outer:where(.svelte-1qi6rc1):hover, -.jse-json-node.svelte-1qi6rc1 .jse-meta:where(.svelte-1qi6rc1):hover, -.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1):hover { - background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); - cursor: var(--jse-contents-cursor, pointer); -} -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer { - background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); - cursor: var(--jse-contents-cursor, pointer); -} -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-meta { - background: none; -} -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1), -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { - background: var(--jse-selection-background-color, #d3d3d3); - cursor: var(--jse-contents-selected-cursor, grab); -} -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1):hover, -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-value-outer:where(.svelte-1qi6rc1):hover, -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-meta:where(.svelte-1qi6rc1):hover, -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1):hover { - background: inherit; - cursor: inherit; -} -.jse-json-node.svelte-1qi6rc1 .jse-key-outer.jse-selected-key:where(.svelte-1qi6rc1) { - background: var(--jse-selection-background-color, #d3d3d3); - cursor: var(--jse-contents-selected-cursor, grab); -} -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-value-outer, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-meta, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-header, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-contents, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-header, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-contents, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-footer { - background: var(--jse-selection-background-color, #d3d3d3); - cursor: var(--jse-contents-selected-cursor, grab); -} -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-value-outer .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-meta .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-header .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-contents .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-header .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-contents .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-footer .jse-key-outer:hover { - background: inherit; - cursor: inherit; -} -.jse-json-node.jse-readonly.svelte-1qi6rc1 { - --jse-contents-selected-cursor: pointer; -} -.jse-json-node.svelte-1qi6rc1 .jse-insert-area.jse-selected:where(.svelte-1qi6rc1) { - outline-color: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); -}`);var Aa=C5(()=>mhA),yhA=TA('
    :
    '),DhA=TA('
    [
     ',1),vhA=TA('
    [
    ]
    ',1),bhA=TA('
    '),MhA=TA('
    '),ShA=TA('
    '),khA=TA('
    '),_hA=TA('
    '),xhA=TA(" ",1),RhA=TA('
    '),NhA=TA('
    ',1),FhA=TA('
    ',1),LhA=TA('
    :
    '),GhA=TA('
    {
    '),KhA=TA('
    {
    }
    ',1),UhA=TA('
    '),ThA=TA('
    '),OhA=TA('
    '),JhA=TA('
    '),YhA=TA('
    '),HhA=TA('
    '),zhA=TA('
    ',1),PhA=TA('
    ',1),jhA=TA('
    :
    '),VhA=TA('
    '),qhA=TA('
    '),WhA=TA('
    '),ZhA=TA('
    '),XhA=TA('
    ');function j_(i,e){Jt(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=K(e,"pointer",9),o=K(e,"value",9),a=K(e,"state",9),r=K(e,"validationErrors",9),s=K(e,"searchResults",9),l=K(e,"selection",9),g=K(e,"context",9),C=K(e,"onDragSelectionStart",9),d=dr("jsoneditor:JSONNode"),B=cA(void 0,!0),u=void 0,E=cA(void 0,!0),f=cA(void 0,!0),m=cA(void 0,!0),v=cA(void 0,!0),S=cA(void 0,!0),k=cA(void 0,!0),M=cA(void 0,!0);function x(YA){YA.stopPropagation();var hA=dx(YA);g().onExpand(c(f),!c(m),hA)}function F(){g().onExpand(c(f),!0)}function z(YA,hA){var Ae=Ep(c(f),Object.keys(o()),YA,hA);return g().onPatch(Ae),Ji(ms(Ae[0].path))}function j(YA){g().onDrag(YA)}function X(YA){Aa().selecting&&(Aa(Aa().selecting=!1),YA.stopPropagation()),g().onDragEnd(),document.removeEventListener("mousemove",j,!0),document.removeEventListener("mouseup",X)}function eA(){var YA;return((YA=g().findElement([]))===null||YA===void 0||(YA=YA.getBoundingClientRect())===null||YA===void 0?void 0:YA.top)||0}function Z(YA,hA){var Ae=eA()-YA.initialContentTop;return hA.clientY-YA.initialClientY-Ae}function CA(YA){if(!g().readOnly&&l()){var hA=an(Qt(l()));if(Ui(c(f),hA)){var Ae=(function(JA,yA){var Pt=[];function Dt($){var iA=c(f).concat($),oA=g().findElement(iA);oA!==void 0&&Pt.push({path:iA,height:oA.clientHeight})}if(Array.isArray(o())){var fe=g().getJson();if(fe===void 0)return;var Zt=DC(fe,JA),Pe=n1(fe,JA),qe=parseInt(Ji(Zt),10),vt=parseInt(Ji(Pe),10),Ke=yA.find($=>qe>=$.start&&vt<=$.end);if(!Ke)return;var{start:Ii,end:V}=Ke;bq(Ii,Math.min(o().length,V),$=>Dt(String($)))}else Object.keys(o()).forEach(Dt);return Pt})(l(),c(S)||Jh);if(d("dragSelectionStart",{selection:l(),items:Ae}),Ae){var pA=g().getJson();if(pA!==void 0){var te=DC(pA,l()),NA=Ae.findIndex(JA=>Ui(JA.path,te)),{offset:Ge}=Q_({json:pA,selection:g().getSelection(),deltaY:0,items:Ae});N(E,{initialTarget:YA.target,initialClientY:YA.clientY,initialContentTop:eA(),selectionStartIndex:NA,selectionItemsCount:a1(pA,l()).length,items:Ae,offset:Ge,didMoveItems:!1}),Aa(Aa().dragging=!0),document.addEventListener("mousemove",wA,!0),document.addEventListener("mouseup",BA)}}else d("Cannot drag the current selection (probably spread over multiple sections)")}else C()(YA)}}function wA(YA){if(c(E)){var hA=g().getJson();if(hA===void 0)return;var Ae=Z(c(E),YA),{offset:pA}=Q_({json:hA,selection:g().getSelection(),deltaY:Ae,items:c(E).items});pA!==c(E).offset&&(d("drag selection",pA,Ae),N(E,Fe(Fe({},c(E)),{},{offset:pA,didMoveItems:!0})))}}function BA(YA){if(c(E)){var hA=g().getJson();if(hA===void 0)return;var Ae=Z(c(E),YA),{operations:pA,updatedSelection:te}=Q_({json:hA,selection:g().getSelection(),deltaY:Ae,items:c(E).items});if(pA)g().onPatch(pA,(JA,yA)=>({state:yA,selection:te??l()}));else if(YA.target===c(E).initialTarget&&!c(E).didMoveItems){var NA=o_(YA.target),Ge=Uq(YA.target);Ge&&g().onSelect(Zj(NA,Ge))}N(E,void 0),Aa(Aa().dragging=!1),document.removeEventListener("mousemove",wA,!0),document.removeEventListener("mouseup",BA)}}function QA(YA){YA.shiftKey||(YA.stopPropagation(),YA.preventDefault(),g().onSelect(FC(c(f))))}function RA(YA){YA.shiftKey||(YA.stopPropagation(),YA.preventDefault(),g().onSelect(SC(c(f))))}function dA(YA){g().onSelect(FC(c(f))),jo(),g().onContextMenu(YA)}function IA(YA){g().onSelect(SC(c(f))),jo(),g().onContextMenu(YA)}KA(()=>Y(n()),()=>{N(f,ms(n()))}),KA(()=>Y(n()),()=>{N(A,encodeURIComponent(n()))}),KA(()=>Y(a()),()=>{N(m,!!iI(a())&&a().expanded)}),KA(()=>(Y(o()),Y(a())),()=>{N(v,m0(o(),a(),[]))}),KA(()=>Y(a()),()=>{N(S,cr(a())?a().visibleSections:void 0)}),KA(()=>Y(r()),()=>{var YA;N(k,(YA=r())===null||YA===void 0?void 0:YA.validationError)}),KA(()=>(Y(g()),Y(l()),c(f)),()=>{N(M,ep(g().getJson(),l(),c(f)))}),KA(()=>c(f),()=>{N(t,c(f).length===0)}),Vn(),di(!0);var xA,qA,ue=XhA(),HA=gA(ue),bA=YA=>{var hA=FhA(),Ae=at(hA),pA=gA(Ae),te=gA(pA),NA=gA(te),Ge=GA=>{Bn(GA,{get data(){return r0}})},JA=GA=>{Bn(GA,{get data(){return JB}})};zA(NA,GA=>{c(m)?GA(Ge):GA(JA,!1)});var yA=kA(te,2);ya(yA,e,"identifier",{},null);var Pt=kA(yA,2),Dt=GA=>{sA(GA,yhA())};zA(Pt,GA=>{c(t)||GA(Dt)});var fe=kA(Pt,2),Zt=gA(fe),Pe=gA(Zt),qe=GA=>{var OA=DhA();Tw(kA(at(OA),2),{children:(wt,rt)=>{var je=mr();Le(()=>{var ze,pi;return Ht(je,"".concat((Y(o()),(ze=uA(()=>o().length))!==null&&ze!==void 0?ze:""),` - `).concat((Y(o()),(pi=uA(()=>o().length===1?"item":"items"))!==null&&pi!==void 0?pi:"")))}),sA(wt,je)},$$slots:{default:!0}}),sA(GA,OA)},vt=GA=>{var OA=vhA();Tw(kA(at(OA),2),{onclick:F,children:(wt,rt)=>{var je=mr();Le(()=>{var ze,pi;return Ht(je,"".concat((Y(o()),(ze=uA(()=>o().length))!==null&&ze!==void 0?ze:""),` - `).concat((Y(o()),(pi=uA(()=>o().length===1?"item":"items"))!==null&&pi!==void 0?pi:"")))}),sA(wt,je)},$$slots:{default:!0}}),sA(GA,OA)};zA(Pe,GA=>{c(m)?GA(qe):GA(vt,!1)});var Ke=kA(fe,2),Ii=GA=>{var OA=bhA();Y2(gA(OA),{get root(){return c(t)},selected:!0,get onContextMenu(){return Y(g()),uA(()=>g().onContextMenu)}}),sA(GA,OA)};zA(Ke,GA=>{Y(g()),c(M),Y(l()),Y(bn),Y(bo),Y(gr),Y(Ui),Y(Qt),c(f),uA(()=>!g().readOnly&&c(M)&&l()&&(bn(l())||bo(l()))&&!gr(l())&&Ui(Qt(l()),c(f)))&&GA(Ii)});var V=kA(pA,2),$=GA=>{zh(GA,{get validationError(){return c(k)},onExpand:F})};zA(V,GA=>{c(k),c(m),uA(()=>c(k)&&(!c(m)||!c(k).isChildError))&&GA($)});var iA=kA(V,2),oA=GA=>{var OA=MhA();De("click",OA,QA),sA(GA,OA)},UA=GA=>{var OA=ShA();De("click",OA,RA),sA(GA,OA)};zA(iA,GA=>{c(m)?GA(oA):GA(UA,!1)});var he=kA(Ae,2),me=GA=>{var OA=NhA(),wt=at(OA),rt=gA(wt),je=Sn=>{var He,En,Gi=khA(),Pi=gA(Gi),gn=lt(()=>(c(M),Y(nr),Y(l()),uA(()=>c(M)&&nr(l()))));Y2(Pi,{insert:!0,get selected(){return c(gn)},onContextMenu:dA}),Le(Rt=>{He=Ci(Gi,1,"jse-insert-area jse-inside svelte-1qi6rc1",null,He,Rt),jn(Gi,"title",s_),En=wg(Gi,"",En,{"--level":(c(f),uA(()=>c(f).length+1))})},[()=>({"jse-hovered":c(B)===Ud,"jse-selected":c(M)&&nr(l())})]),sA(Sn,Gi)};zA(rt,Sn=>{Y(g()),c(B),Y(Ud),c(M),Y(nr),Y(l()),uA(()=>!g().readOnly&&(c(B)===Ud||c(M)&&nr(l())))&&Sn(je)}),Da(kA(rt,2),1,()=>c(S)||Jh,Ka,(Sn,He,En)=>{var Gi=xhA(),Pi=at(Gi);Da(Pi,1,()=>(Y(o()),c(He),c(E),uA(()=>(function(Qn,jt,J){var ut=jt.start,bi=Math.min(jt.end,Qn.length),kn=YD(ut,bi);return J&&J.offset!==0?_j(kn,J.selectionStartIndex,J.selectionItemsCount,J.offset).map((_n,Co)=>({index:_n,gutterIndex:Co})):kn.map(_n=>({index:_n,gutterIndex:_n}))})(o(),c(He),c(E)))),Qn=>Qn.index,(Qn,jt)=>{var J=lt(()=>(Y(cr),Y(r()),c(jt),uA(()=>cr(r())?r().items[c(jt).index]:void 0))),ut=lt(()=>(Y(yw),Y(g()),Y(l()),c(f),c(jt),uA(()=>yw(g().getJson(),l(),c(f).concat(String(c(jt).index)))))),bi=zi(),kn=at(bi),_n=lt(()=>(Y(_u),Y(n()),c(jt),uA(()=>_u(n(),c(jt).index)))),Co=lt(()=>(Y(cr),Y(a()),c(jt),uA(()=>cr(a())?a().items[c(jt).index]:void 0))),ia=lt(()=>(Y(cr),Y(s()),c(jt),uA(()=>cr(s())?s().items[c(jt).index]:void 0)));j_(kn,{get value(){return Y(o()),c(jt),uA(()=>o()[c(jt).index])},get pointer(){return c(_n)},get state(){return c(Co)},get validationErrors(){return c(J)},get searchResults(){return c(ia)},get selection(){return c(ut)},get context(){return g()},onDragSelectionStart:CA,$$slots:{identifier:(So,Vo)=>{var ga=_hA(),Ko=gA(ga),va=gA(Ko);Le(()=>Ht(va,(c(jt),uA(()=>c(jt).gutterIndex)))),sA(So,ga)}}}),sA(Qn,bi)});var gn=kA(Pi,2),Rt=Qn=>{var jt=lt(()=>c(S)||Jh);EhA(Qn,{get visibleSections(){return c(jt)},sectionIndex:En,get total(){return Y(o()),uA(()=>o().length)},get path(){return c(f)},get onExpandSection(){return Y(g()),uA(()=>g().onExpandSection)},get selection(){return l()},get context(){return g()}})};zA(gn,Qn=>{c(He),Y(o()),uA(()=>c(He).end{var He=RhA();De("click",He,RA),sA(Sn,He)};zA(pi,Sn=>{c(t)||Sn(mn)}),sA(GA,OA)};zA(he,GA=>{c(m)&&GA(me)}),De("click",te,x),sA(YA,hA)},PA=YA=>{var hA=zi(),Ae=at(hA),pA=NA=>{var Ge=PhA(),JA=at(Ge),yA=gA(JA),Pt=gA(yA),Dt=gA(Pt),fe=ze=>{Bn(ze,{get data(){return r0}})},Zt=ze=>{Bn(ze,{get data(){return JB}})};zA(Dt,ze=>{c(m)?ze(fe):ze(Zt,!1)});var Pe=kA(Pt,2);ya(Pe,e,"identifier",{},null);var qe=kA(Pe,2),vt=ze=>{sA(ze,LhA())};zA(qe,ze=>{c(t)||ze(vt)});var Ke=kA(qe,2),Ii=gA(Ke),V=gA(Ii),$=ze=>{sA(ze,GhA())},iA=ze=>{var pi=KhA();Tw(kA(at(pi),2),{onclick:F,children:(mn,Sn)=>{var He=mr();Le((En,Gi)=>Ht(He,"".concat(En??"",` - `).concat(Gi??"")),[()=>(Y(o()),uA(()=>Object.keys(o()).length)),()=>(Y(o()),uA(()=>Object.keys(o()).length===1?"prop":"props"))]),sA(mn,He)},$$slots:{default:!0}}),sA(ze,pi)};zA(V,ze=>{c(m)?ze($):ze(iA,!1)});var oA=kA(Ke,2),UA=ze=>{var pi=UhA();Y2(gA(pi),{get root(){return c(t)},selected:!0,get onContextMenu(){return Y(g()),uA(()=>g().onContextMenu)}}),sA(ze,pi)};zA(oA,ze=>{Y(g()),c(M),Y(l()),Y(bn),Y(bo),Y(gr),Y(Ui),Y(Qt),c(f),uA(()=>!g().readOnly&&c(M)&&l()&&(bn(l())||bo(l()))&&!gr(l())&&Ui(Qt(l()),c(f)))&&ze(UA)});var he=kA(yA,2),me=ze=>{zh(ze,{get validationError(){return c(k)},onExpand:F})};zA(he,ze=>{c(k),c(m),uA(()=>c(k)&&(!c(m)||!c(k).isChildError))&&ze(me)});var GA=kA(he,2),OA=ze=>{var pi=ThA();De("click",pi,QA),sA(ze,pi)},wt=ze=>{var pi=zi(),mn=at(pi),Sn=He=>{var En=OhA();De("click",En,RA),sA(He,En)};zA(mn,He=>{c(t)||He(Sn)},!0),sA(ze,pi)};zA(GA,ze=>{c(m)?ze(OA):ze(wt,!1)});var rt=kA(JA,2),je=ze=>{var pi=zhA(),mn=at(pi),Sn=gA(mn),He=gn=>{var Rt,Qn,jt=JhA(),J=gA(jt),ut=lt(()=>(c(M),Y(nr),Y(l()),uA(()=>c(M)&&nr(l()))));Y2(J,{insert:!0,get selected(){return c(ut)},onContextMenu:dA}),Le(bi=>{Rt=Ci(jt,1,"jse-insert-area jse-inside svelte-1qi6rc1",null,Rt,bi),jn(jt,"title",s_),Qn=wg(jt,"",Qn,{"--level":(c(f),uA(()=>c(f).length+1))})},[()=>({"jse-hovered":c(B)===Ud,"jse-selected":c(M)&&nr(l())})]),sA(gn,jt)};zA(Sn,gn=>{Y(g()),c(B),Y(Ud),c(M),Y(nr),Y(l()),uA(()=>!g().readOnly&&(c(B)===Ud||c(M)&&nr(l())))&&gn(He)}),Da(kA(Sn,2),1,()=>(Y(o()),c(E),uA(()=>(function(gn,Rt){var Qn=Object.keys(gn);return Rt&&Rt.offset!==0?_j(Qn,Rt.selectionStartIndex,Rt.selectionItemsCount,Rt.offset):Qn})(o(),c(E)))),Ka,(gn,Rt)=>{var Qn=lt(()=>(Y(_u),Y(n()),c(Rt),uA(()=>_u(n(),c(Rt))))),jt=lt(()=>(Y(Il),Y(s()),c(Rt),uA(()=>Il(s())?s().properties[c(Rt)]:void 0))),J=lt(()=>(Y(Il),Y(r()),c(Rt),uA(()=>Il(r())?r().properties[c(Rt)]:void 0))),ut=lt(()=>(c(f),c(Rt),uA(()=>c(f).concat(c(Rt))))),bi=lt(()=>(Y(yw),Y(g()),Y(l()),Y(c(ut)),uA(()=>yw(g().getJson(),l(),c(ut))))),kn=zi(),_n=at(kn),Co=lt(()=>(Y(Il),Y(a()),c(Rt),uA(()=>Il(a())?a().properties[c(Rt)]:void 0)));j_(_n,{get value(){return Y(o()),c(Rt),uA(()=>o()[c(Rt)])},get pointer(){return c(Qn)},get state(){return c(Co)},get validationErrors(){return c(J)},get searchResults(){return c(jt)},get selection(){return c(bi)},get context(){return g()},onDragSelectionStart:CA,$$slots:{identifier:(ia,So)=>{var Vo,ga=YhA(),Ko=gA(ga),va=lt(()=>(Y(nV),Y(c(jt)),uA(()=>nV(c(jt)))));(function(ca,pa){Jt(pa,!1);var Uo=cA(void 0,!0),de=cA(void 0,!0),xi=K(pa,"pointer",9),wn=K(pa,"key",9),xn=K(pa,"selection",9),na=K(pa,"searchResultItems",9),Ra=K(pa,"onUpdateKey",9),Oi=K(pa,"context",9),ko=cA(void 0,!0);function ar(SA){c(de)||Oi().readOnly||(SA.preventDefault(),Oi().onSelect(wx(c(ko))))}function To(SA,ee){var be=Ra()(wn(),Oi().normalization.unescapeValue(SA)),EA=an(c(ko)).concat(be);Oi().onSelect(ee===i1.nextInside?en(EA):NC(EA)),ee!==i1.self&&Oi().focus()}function ja(){Oi().onSelect(NC(c(ko))),Oi().focus()}KA(()=>Y(xi()),()=>{N(ko,ms(xi()))}),KA(()=>(Y(xn()),c(ko)),()=>{N(Uo,Cr(xn())&&Ui(xn().path,c(ko)))}),KA(()=>(c(Uo),Y(xn())),()=>{N(de,c(Uo)&&gr(xn()))}),Vn(),di(!0);var to=phA(),Wi=at(to),ei=SA=>{var ee=lt(()=>(Y(Oi()),Y(wn()),uA(()=>Oi().normalization.escapeValue(wn())))),be=lt(()=>(Y(gr),Y(xn()),uA(()=>gr(xn())?xn().initialValue:void 0)));Wq(SA,{get value(){return c(ee)},get initialValue(){return c(be)},label:"Edit key",shortText:!0,onChange:To,onCancel:ja,get onFind(){return Y(Oi()),uA(()=>Oi().onFind)}})},qn=SA=>{var ee,be=uhA(),EA=gA(be),LA=Te=>{var gt=lt(()=>(Y(Oi()),Y(wn()),uA(()=>Oi().normalization.escapeValue(wn()))));iW(Te,{get text(){return c(gt)},get searchResultItems(){return na()}})},Ce=Te=>{var gt=mr();Le(dt=>Ht(gt,dt),[()=>(Y($h),Y(Oi()),Y(wn()),uA(()=>$h(Oi().normalization.escapeValue(wn()))))]),sA(Te,gt)};zA(EA,Te=>{na()?Te(LA):Te(Ce,!1)}),Le(()=>ee=Ci(be,1,"jse-key svelte-1n4cez4",null,ee,{"jse-empty":wn()===""})),De("dblclick",be,ar),sA(SA,be)};zA(Wi,SA=>{Y(Oi()),c(de),uA(()=>!Oi().readOnly&&c(de))?SA(ei):SA(qn,!1)});var _o=kA(Wi,2),qo=SA=>{Y2(SA,{selected:!0,get onContextMenu(){return Y(Oi()),uA(()=>Oi().onContextMenu)}})};zA(_o,SA=>{Y(Oi()),c(Uo),c(de),uA(()=>!Oi().readOnly&&c(Uo)&&!c(de))&&SA(qo)}),sA(ca,to),Yt()})(Ko,{get pointer(){return c(Qn)},get key(){return c(Rt)},get selection(){return c(bi)},get searchResultItems(){return c(va)},get context(){return g()},onUpdateKey:z}),Le(ca=>Vo=Ci(ga,1,"jse-key-outer svelte-1qi6rc1",null,Vo,ca),[()=>({"jse-selected-key":Cr(c(bi))&&Ui(c(bi).path,c(ut))})]),sA(ia,ga)}}}),sA(gn,kn)});var En=kA(mn,2),Gi=kA(gA(En),2),Pi=gn=>{var Rt=HhA();De("click",Rt,RA),sA(gn,Rt)};zA(Gi,gn=>{c(t)||gn(Pi)}),sA(ze,pi)};zA(rt,ze=>{c(m)&&ze(je)}),De("click",Pt,x),sA(NA,Ge)},te=NA=>{var Ge=WhA(),JA=gA(Ge),yA=gA(JA);ya(yA,e,"identifier",{},null);var Pt=kA(yA,2),Dt=oA=>{sA(oA,jhA())};zA(Pt,oA=>{c(t)||oA(Dt)});var fe=kA(Pt,2),Zt=gA(fe),Pe=lt(()=>c(M)?l():void 0),qe=lt(()=>(Y(oV),Y(s()),uA(()=>oV(s()))));uW(Zt,{get path(){return c(f)},get value(){return o()},get enforceString(){return c(v)},get selection(){return c(Pe)},get searchResultItems(){return c(qe)},get context(){return g()}});var vt=kA(fe,2),Ke=oA=>{var UA=VhA();Y2(gA(UA),{get root(){return c(t)},selected:!0,get onContextMenu(){return Y(g()),uA(()=>g().onContextMenu)}}),sA(oA,UA)};zA(vt,oA=>{Y(g()),c(M),Y(l()),Y(bn),Y(bo),Y(gr),Y(Ui),Y(Qt),c(f),uA(()=>!g().readOnly&&c(M)&&l()&&(bn(l())||bo(l()))&&!gr(l())&&Ui(Qt(l()),c(f)))&&oA(Ke)});var Ii=kA(JA,2),V=oA=>{zh(oA,{get validationError(){return c(k)},onExpand:F})};zA(Ii,oA=>{c(k)&&oA(V)});var $=kA(Ii,2),iA=oA=>{var UA=qhA();De("click",UA,RA),sA(oA,UA)};zA($,oA=>{c(t)||oA(iA)}),sA(NA,Ge)};zA(Ae,NA=>{Y(Jn),Y(o()),uA(()=>Jn(o()))?NA(pA):NA(te,!1)},!0),sA(YA,hA)};zA(HA,YA=>{Y(o()),uA(()=>Array.isArray(o()))?YA(bA):YA(PA,!1)});var it=kA(HA,2),Xe=YA=>{var hA,Ae=ZhA(),pA=gA(Ae),te=lt(()=>(c(M),Y(hl),Y(l()),uA(()=>c(M)&&hl(l()))));Y2(pA,{insert:!0,get selected(){return c(te)},onContextMenu:IA}),Le(NA=>{hA=Ci(Ae,1,"jse-insert-area jse-after svelte-1qi6rc1",null,hA,NA),jn(Ae,"title",s_)},[()=>({"jse-hovered":c(B)===mw,"jse-selected":c(M)&&hl(l())})]),sA(YA,Ae)};zA(it,YA=>{Y(g()),c(B),Y(mw),c(M),Y(hl),Y(l()),uA(()=>!g().readOnly&&(c(B)===mw||c(M)&&hl(l())))&&YA(Xe)}),Le((YA,hA)=>{xA=Ci(ue,1,YA,"svelte-1qi6rc1",xA,hA),jn(ue,"data-path",c(A)),jn(ue,"aria-selected",c(M)),qA=wg(ue,"",qA,{"--level":(c(f),uA(()=>c(f).length))})},[()=>o1((Y(wc),c(m),Y(g()),c(f),Y(o()),uA(()=>wc("jse-json-node",{"jse-expanded":c(m)},g().onClassName(c(f),o()))))),()=>({"jse-root":c(t),"jse-selected":c(M)&&bo(l()),"jse-selected-value":c(M)&&bn(l()),"jse-readonly":g().readOnly,"jse-hovered":c(B)===Fj})]),De("mousedown",ue,function(YA){if((YA.buttons===1||YA.buttons===2)&&!((hA=YA.target).nodeName==="DIV"&&hA.contentEditable==="true"||YA.buttons===1&&Gq(YA.target,"BUTTON"))){var hA;YA.stopPropagation(),YA.preventDefault(),g().focus(),document.addEventListener("mousemove",j,!0),document.addEventListener("mouseup",X);var Ae=o_(YA.target),pA=g().getJson(),te=g().getDocumentState();if(!l()||Ae===fo.after||Ae===fo.inside||l().type!==Ae&&l().type!==fo.multi||!ep(pA,l(),c(f)))if(Aa(Aa().selecting=!0),Aa(Aa().selectionAnchor=c(f)),Aa(Aa().selectionAnchorType=Ae),Aa(Aa().selectionFocus=c(f)),YA.shiftKey){var NA=g().getSelection();NA&&g().onSelect(vs(qd(NA),c(f)))}else if(Ae===fo.multi)if(c(t)&&YA.target.hasAttribute("data-path")){var Ge=Ji(zq(o(),te));g().onSelect(U_(Ge))}else g().onSelect(vs(c(f),c(f)));else pA!==void 0&&g().onSelect(Zj(Ae,c(f)));else YA.button===0&&C()(YA)}}),De("mousemove",ue,function(YA){if(Aa().selecting){YA.preventDefault(),YA.stopPropagation(),Aa().selectionFocus===void 0&&window.getSelection&&window.getSelection().empty();var hA=o_(YA.target);Ui(c(f),Aa().selectionFocus)&&hA===Aa().selectionAnchorType||(Aa(Aa().selectionFocus=c(f)),Aa(Aa().selectionAnchorType=hA),g().onSelect(vs(Aa().selectionAnchor||Aa().selectionFocus,Aa().selectionFocus)))}}),De("mouseover",ue,function(YA){Aa().selecting||Aa().dragging||(YA.stopPropagation(),W2(YA.target,"data-type","selectable-value")?N(B,Fj):W2(YA.target,"data-type","selectable-key")?N(B,void 0):W2(YA.target,"data-type","insert-selection-area-inside")?N(B,Ud):W2(YA.target,"data-type","insert-selection-area-after")&&N(B,mw),clearTimeout(u))}),De("mouseout",ue,function(YA){YA.stopPropagation(),u=window.setTimeout(()=>N(B,void 0))}),sA(i,ue),Yt()}var pW={prefix:"fas",iconName:"jsoneditor-expand",icon:[512,512,[],"","M 0,448 V 512 h 512 v -64 z M 0,0 V 64 H 512 V 0 Z M 256,96 128,224 h 256 z M 256,416 384,288 H 128 Z"]},fW={prefix:"fas",iconName:"jsoneditor-collapse",icon:[512,512,[],"","m 0,224 v 64 h 512 v -64 z M 256,192 384,64 H 128 Z M 256,320 128,448 h 256 z"]},EV={prefix:"fas",iconName:"jsoneditor-format",icon:[512,512,[],"","M 0,32 v 64 h 416 v -64 z M 160,160 v 64 h 352 v -64 z M 160,288 v 64 h 288 v -64 z M 0,416 v 64 h 320 v -64 z"]},$hA={prefix:"fas",iconName:"jsoneditor-compact",icon:[512,512,[],"","M 0,32 v 64 h 512 v -64 z M 0,160 v 64 h 512 v -64 z M 0,288 v 64 h 352 v -64 z"]};oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-welcome.svelte-1lhnan { - flex: 1; - overflow: auto; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - display: flex; - flex-direction: column; - align-items: center; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-welcome.svelte-1lhnan:last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-welcome.svelte-1lhnan .jse-space.jse-before:where(.svelte-1lhnan) { - flex: 1; -} -.jse-welcome.svelte-1lhnan .jse-space.jse-after:where(.svelte-1lhnan) { - flex: 2; -} -.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) { - display: flex; - flex-direction: column; - max-width: 300px; - margin: 2em var(--jse-padding, 10px); - gap: var(--jse-padding, 10px); -} -.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) .jse-welcome-info:where(.svelte-1lhnan) { - color: var(--jse-panel-color-readonly, #b2b2b2); -} -.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -}`);var AEA=TA('
    You can paste clipboard data using Ctrl+V, or use the following options:
    ',1),eEA=TA('
    Empty document
    ');function V_(i,e){var A=typeof i=="string"?i.toLowerCase():i,t=typeof e=="string"?e.toLowerCase():e;return(0,DV.default)(A,t)}function mW(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],t=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,n=$e(i,e);if(sa(n)){if(A===void 0)throw new Error("Cannot sort: no property selected by which to sort the array");return(function(o){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,l=(function(C,d){var B={boolean:0,number:1,string:2,undefined:4},u=3;return function(E,f){var m=$e(E,C),v=$e(f,C);if(typeof m!=typeof v){var S,k,M=(S=B[typeof m])!==null&&S!==void 0?S:u,x=(k=B[typeof v])!==null&&k!==void 0?k:u;return M>x?d:Mv?d:m1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,s=$e(o,a),l=Object.keys(s).slice();l.sort((C,d)=>r*V_(C,d));var g={};return l.forEach(C=>g[C]=s[C]),[{op:"replace",path:xt(a),value:g}]})(i,e,t);throw new Error("Cannot sort: no array or object")}cp(["click"]);oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-navigation-bar-dropdown.svelte-1k47orx { - position: absolute; - top: 100%; - left: 0; - z-index: 3; - background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); - color: var(--jse-navigation-bar-dropdown-color, #656565); - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); - display: flex; - flex-direction: column; - max-height: 300px; - overflow: auto; - min-width: 80px; -} -.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx) { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - border: none; - background: transparent; - color: inherit; - cursor: pointer; - outline: none; - text-align: left; - white-space: nowrap; - box-sizing: border-box; - padding: calc(0.5 * var(--jse-padding, 10px)) 36px; -} -.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx):focus, .jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx):hover { - background: var(--jse-navigation-bar-background-highlight, #e5e5e5); -} -.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item.jse-selected:where(.svelte-1k47orx) { - background: var(--jse-navigation-bar-dropdown-color, #656565); - color: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); -}`);var tEA=TA(''),iEA=TA(''),nEA=TA('
    ');function oEA(i,e){Jt(e,!1);var A=K(e,"items",9),t=K(e,"selectedItem",9),n=K(e,"onSelect",9);di(!0);var o=nEA(),a=gA(o);Da(a,1,()=>(Y(Pw),Y(A()),uA(()=>Pw(A(),100))),l=>l,(l,g)=>{var C,d=tEA(),B=gA(d);Le((u,E)=>{C=Ci(d,1,"jse-navigation-bar-dropdown-item svelte-1k47orx",null,C,{"jse-selected":c(g)===t()}),jn(d,"title",u),Ht(B,E)},[()=>(c(g),uA(()=>c(g).toString())),()=>(Y(mC),c(g),uA(()=>mC(c(g).toString(),30)))]),De("click",d,uC(()=>n()(c(g)))),sA(l,d)});var r=kA(a,2),s=l=>{var g=iEA();jn(g,"title","Limited to 100 items"),sA(l,g)};zA(r,l=>{Y(A()),uA(()=>A().length>100)&&l(s)}),sA(i,o),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-navigation-bar-item.svelte-13sijxb { - position: relative; - display: flex; -} -.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb) { - font-family: inherit; - font-size: inherit; - padding: calc(0.5 * var(--jse-padding, 10px)) 2px; - border: none; - background: transparent; - color: inherit; - cursor: pointer; - outline: none; - min-width: 2em; - white-space: nowrap; -} -.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb):focus, .jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb):hover { - background: var(--jse-panel-button-background-highlight, #e0e0e0); - color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); -} -.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button.jse-navigation-bar-arrow:where(.svelte-13sijxb) { - padding: 2px var(--jse-padding, 10px) 0; -} -.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button.jse-navigation-bar-arrow.jse-open:where(.svelte-13sijxb) { - background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); - color: var(--jse-navigation-bar-dropdown-color, #656565); -} -.jse-navigation-bar-item.svelte-13sijxb:last-child { - padding-right: var(--jse-padding, 10px); -}`);var aEA=TA(''),rEA=TA('
    ');function QV(i,e){Jt(e,!1);var A,t=cA(void 0,!0),n=cA(void 0,!0),{openAbsolutePopup:o,closeAbsolutePopup:a}=s1("absolute-popup"),r=K(e,"path",9),s=K(e,"index",9),l=K(e,"onSelect",9),g=K(e,"getItems",9),C=cA(void 0,!0),d=cA(!1,!0);function B(S){a(A),l()(c(t).concat(S))}KA(()=>(Y(r()),Y(s())),()=>{N(t,r().slice(0,s()))}),KA(()=>(Y(r()),Y(s())),()=>{N(n,r()[s()])}),Vn(),di(!0);var u,E=rEA(),f=gA(E);Bn(gA(f),{get data(){return _M}});var m=kA(f,2),v=S=>{var k=aEA(),M=gA(k);Le(()=>Ht(M,c(n))),De("click",k,()=>B(c(n))),sA(S,k)};zA(m,S=>{c(n)!==void 0&&S(v)}),ta(E,S=>N(C,S),()=>c(C)),Le(()=>u=Ci(f,1,"jse-navigation-bar-button jse-navigation-bar-arrow svelte-13sijxb",null,u,{"jse-open":c(d)})),De("click",f,function(){if(c(C)){N(d,!0);var S={items:g()(c(t)),selectedItem:c(n),onSelect:B};A=o(oEA,S,{anchor:c(C),closeOnOuterClick:!0,onClose:()=>{N(d,!1)}})}}),sA(i,E),Yt()}function Mx(i){var e,A;if(navigator.clipboard)return navigator.clipboard.writeText(i);if((e=(A=document).queryCommandSupported)!==null&&e!==void 0&&e.call(A,"copy")){var t=document.createElement("textarea");t.value=i,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select();try{document.execCommand("copy")}catch(n){console.error(n)}finally{document.body.removeChild(t)}return Promise.resolve()}return console.error("Copy failed."),Promise.resolve()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-navigation-bar-path-editor.svelte-uyexy4 { - flex: 1; - display: flex; - border: var(--jse-edit-outline, 2px solid #656565); - background: var(--jse-background-color, #fff); -} -.jse-navigation-bar-path-editor.svelte-uyexy4 input.jse-navigation-bar-text:where(.svelte-uyexy4) { - flex: 1; - font-family: inherit; - font-size: inherit; - padding: 0 5px 1px; - background: var(--jse-background-color, #fff); - color: var(--jse-text-color, #4d4d4d); - border: none; - outline: none; -} -.jse-navigation-bar-path-editor.svelte-uyexy4 button:where(.svelte-uyexy4) { - border: none; - background: var(--jse-background-color, #fff); - cursor: pointer; - font-family: inherit; - font-size: 80%; - color: inherit; -} -.jse-navigation-bar-path-editor.svelte-uyexy4 button.jse-navigation-bar-copy.copied:where(.svelte-uyexy4) { - color: var(--message-success-background, #9ac45d); -} -.jse-navigation-bar-path-editor.svelte-uyexy4 button.jse-navigation-bar-validation-error:where(.svelte-uyexy4) { - color: var(--jse-error-color, #ee5341); -} -.jse-navigation-bar-path-editor.error.svelte-uyexy4 { - border-color: var(--jse-error-color, #ee5341); -} -.jse-navigation-bar-path-editor.error.svelte-uyexy4 input.jse-navigation-bar-text:where(.svelte-uyexy4) { - color: var(--jse-error-color, #ee5341); -} -.jse-navigation-bar-path-editor.svelte-uyexy4 .jse-copied-text:where(.svelte-uyexy4) { - background: var(--message-success-background, #9ac45d); - color: var(--jse-message-success-color, #fff); - position: relative; - margin: 2px; - padding: 0 5px; - border-radius: 3px; -}`);var sEA=TA(''),lEA=TA('
    Copied!
    '),gEA=TA('
    ');function cEA(i,e){Jt(e,!1);var A=cA(),t=s1("absolute-popup"),n=K(e,"path",8),o=K(e,"pathParser",8),a=K(e,"onChange",8),r=K(e,"onClose",8),s=K(e,"onError",8),l=K(e,"pathExists",8),g=cA(),C=cA(),d=cA(!1),B=void 0,u=cA(!1);function E(){c(g).focus()}function f(X){try{var eA=o().parse(X);return(function(Z){if(!l()(Z))throw new Error("Path does not exist in current document")})(eA),{path:eA,error:void 0}}catch(Z){return{path:void 0,error:Z}}}os(()=>{E()}),Dg(()=>{clearTimeout(B)}),KA(()=>(Y(o()),Y(n())),()=>{N(C,o().stringify(n()))}),KA(()=>(c(d),c(C)),()=>{N(A,c(d)?f(c(C)).error:void 0)}),Vn(),di();var m,v=gEA(),S=gA(v);ta(S,X=>N(g,X),()=>c(g));var k=kA(S,2),M=X=>{var eA=sEA();Bn(gA(eA),{get data(){return w2}}),Ms(eA,(Z,CA)=>tE?.(Z,CA),()=>Fe({text:String(c(A)||"")},t)),sA(X,eA)};zA(k,X=>{c(A)&&X(M)});var x=kA(k,2),F=X=>{sA(X,lEA())};zA(x,X=>{c(u)&&X(F)});var z,j=kA(x,2);Bn(gA(j),{get data(){return aC}}),Le(()=>{m=Ci(v,1,"jse-navigation-bar-path-editor svelte-uyexy4",null,m,{error:c(A)}),tI(S,c(C)),z=Ci(j,1,"jse-navigation-bar-copy svelte-uyexy4",null,z,{copied:c(u)})}),De("keydown",S,uC(function(X){var eA=RC(X);if(eA==="Escape"&&(X.preventDefault(),r()()),eA==="Enter"){X.preventDefault(),N(d,!0);var Z=f(c(C));Z.path!==void 0?a()(Z.path):s()(Z.error)}})),De("input",S,function(X){N(C,X.currentTarget.value)}),De("click",j,function(){Mx(c(C)),N(u,!0),B=window.setTimeout(()=>N(u,!1),1e3),E()}),sA(i,v),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-navigation-bar.svelte-hjhal6 { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-button-color, inherit); - padding: 0; - margin: 0; - display: flex; - overflow: auto; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6) { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); - color: var(--jse-panel-color-readonly, #b2b2b2); - background: transparent; - border: none; - display: flex; - cursor: pointer; - outline: none; - align-items: center; -} -.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit.flex:where(.svelte-hjhal6) { - flex: 1; -} -.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6):focus, .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6):hover, .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit.editing:where(.svelte-hjhal6) { - background: var(--jse-panel-button-background-highlight, #e0e0e0); - color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); - transition: color 0.2s ease-in, background 0.2s ease-in; -} -.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6) .jse-navigation-bar-space:where(.svelte-hjhal6) { - flex: 1; - text-align: left; -}`);var CEA=TA(" ",1),dEA=TA('
    ');function IEA(i,e){Jt(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=dr("jsoneditor:NavigationBar"),o=K(e,"json",9),a=K(e,"selection",9),r=K(e,"onSelect",9),s=K(e,"onError",9),l=K(e,"pathParser",9),g=cA(void 0,!0),C=cA(!1,!0);function d(eA){n("get items for path",eA);var Z=$e(o(),eA);if(Array.isArray(Z))return YD(0,Z.length).map(String);if(Jn(Z)){var CA=Object.keys(Z).slice(0);return CA.sort(V_),CA}return[]}function B(eA){return Fr(o(),eA)}function u(eA){n("select path",JSON.stringify(eA)),r()(vs(eA,eA))}function E(){N(C,!1)}function f(eA){E(),u(eA)}KA(()=>(Y(a()),Qt),()=>{N(A,a()?Qt(a()):[])}),KA(()=>(Y(o()),c(A)),()=>{N(t,ua($e(o(),c(A))))}),KA(()=>c(A),()=>{c(A),setTimeout(()=>{if(c(g)&&c(g).scrollTo){var eA=c(g).scrollWidth-c(g).clientWidth;eA>0&&(n("scrollTo ",eA),c(g).scrollTo({left:eA,behavior:"smooth"}))}})}),Vn(),di(!0);var m=dEA(),v=gA(m),S=eA=>{var Z=CEA(),CA=at(Z);Da(CA,1,()=>c(A),Ka,(QA,RA,dA)=>{QV(QA,{getItems:d,get path(){return c(A)},index:dA,onSelect:u})});var wA=kA(CA,2),BA=QA=>{QV(QA,{getItems:d,get path(){return c(A)},get index(){return c(A),uA(()=>c(A).length)},onSelect:u})};zA(wA,QA=>{c(t)&&QA(BA)}),sA(eA,Z)},k=eA=>{cEA(eA,{get path(){return c(A)},onClose:E,onChange:f,get onError(){return s()},pathExists:B,get pathParser(){return l()}})};zA(v,eA=>{c(C)?eA(k,!1):eA(S)});var M,x=kA(v,2),F=gA(x),z=gA(F),j=kA(F,2),X=lt(()=>c(C)?lJ:nJ);Bn(j,{get data(){return c(X)}}),ta(m,eA=>N(g,eA),()=>c(g)),Le(eA=>{M=Ci(x,1,"jse-navigation-bar-edit svelte-hjhal6",null,M,{flex:!c(C),editing:c(C)}),jn(x,"title",c(C)?"Cancel editing the selected path":"Edit the selected path"),Ht(z,eA)},[()=>(Y(ua),Y(o()),c(C),uA(()=>ua(o())||c(C)?"\xA0":"Navigation bar"))]),De("click",x,function(){N(C,!c(C))}),sA(i,m),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-search-box.svelte-1x1x8q0 { - border: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); - border-radius: 3px; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-color-readonly, #b2b2b2); - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); - display: inline-block; - width: 400px; - max-width: 100%; - overflow: auto; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) { - display: flex; - align-items: stretch; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0), -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) input:where(.svelte-1x1x8q0) { - font-family: inherit; - font-size: inherit; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0) { - display: block; - text-align: center; - border: none; - padding: 0 5px; - margin: 0; - cursor: pointer; - color: var(--jse-panel-button-color, inherit); - background: var(--jse-panel-button-background, transparent); -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0):hover { - color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); - background: var(--jse-panel-button-background-highlight, #e0e0e0); -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) input:where(.svelte-1x1x8q0) { - color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); - border: var(--jse-input-border, 1px solid #d8dbdf); - border-radius: 3px; - background: var(--jse-input-background, var(--jse-background-color, #fff)); - height: 28px; - padding: 0 5px; - margin: 0; - flex: 1; - width: 0; - min-width: 50px; - outline: none; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-replace-toggle:where(.svelte-1x1x8q0) { - padding: var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)); - min-width: 20px; - background: var(--jse-panel-button-background-highlight, #e0e0e0); -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) { - flex: 1; - display: flex; - flex-direction: column; - padding: calc(0.5 * var(--jse-padding, 10px)); - gap: calc(0.5 * var(--jse-padding, 10px)); -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) { - flex: 1; - display: flex; - align-items: center; - position: relative; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-icon:where(.svelte-1x1x8q0) { - color: inherit; - cursor: inherit; - background: inherit; - width: 32px; - text-align: center; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) label.jse-search-input-label:where(.svelte-1x1x8q0) { - flex: 1; - display: flex; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-count:where(.svelte-1x1x8q0) { - color: inherit; - font-size: 80%; - visibility: hidden; - padding: 0 5px; - min-width: 36px; - text-align: center; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-count.jse-visible:where(.svelte-1x1x8q0) { - visibility: visible; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-replace-section:where(.svelte-1x1x8q0) { - flex: 1; - display: flex; - padding-left: 32px; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-replace-section:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0) { - width: auto; -}`);var BEA=TA(''),hEA=TA('
    '),EEA=TA('');function wW(i,e){Jt(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=cA(void 0,!0),o=dr("jsoneditor:SearchBox"),a=K(e,"json",9),r=K(e,"documentState",9),s=K(e,"parser",9),l=K(e,"showSearch",9),g=K(e,"showReplace",13),C=K(e,"readOnly",9),d=K(e,"columns",9),B=K(e,"onSearch",9),u=K(e,"onFocus",9),E=K(e,"onPatch",9),f=K(e,"onClose",9),m=cA("",!0),v="",S=cA("",!0),k=cA(!1,!0),M=cA(void 0,!0),x=XE(function(NA){return PA.apply(this,arguments)},300),F=XE(function(NA){return it.apply(this,arguments)},300);function z(){g(!g()&&!C())}function j(NA){NA.stopPropagation();var Ge=RC(NA);Ge==="Enter"&&(NA.preventDefault(),c(m)!==v?x.flush():dA()),Ge==="Shift+Enter"&&(NA.preventDefault(),xA()),Ge==="Ctrl+Enter"&&(NA.preventDefault(),g()?CA():dA()),Ge==="Ctrl+H"&&(NA.preventDefault(),z()),Ge==="Escape"&&(NA.preventDefault(),hA())}function X(NA){RC(NA)==="Enter"&&(NA.preventDefault(),NA.stopPropagation(),CA())}function eA(){return Z.apply(this,arguments)}function Z(){return(Z=Xt(function*(){jo(),yield x.flush()})).apply(this,arguments)}function CA(){return wA.apply(this,arguments)}function wA(){return(wA=Xt(function*(){var NA;if(!C()){var Ge=(NA=c(M))===null||NA===void 0?void 0:NA.activeItem;if(o("handleReplace",{replaceText:c(S),activeItem:Ge}),c(M)&&Ge&&a()!==void 0){N(M,Fe(Fe({},$j(c(M))),{},{activeIndex:c(t)}));var{operations:JA,newSelection:yA}=LIA(a(),r(),c(S),Ge,s());E()(JA,(Pt,Dt)=>({state:Dt,selection:yA})),jo(),yield F.flush(),yield ue()}}})).apply(this,arguments)}function BA(){return QA.apply(this,arguments)}function QA(){return(QA=Xt(function*(){if(!C()){o("handleReplaceAll",{text:c(m),replaceText:c(S)});var{operations:NA,newSelection:Ge}=(function(JA,yA,Pt,Dt,fe){for(var Zt=AV(Pt,JA,{maxResults:1/0}),Pe=[],qe=0;qe$.field!==iA.field?$.field===Qc.key?1:-1:iA.path.length-$.path.length);var Ii,V=[];return Pe.forEach($=>{var{field:iA,path:oA,items:UA}=$;if(iA===Qc.key){var he=an(oA),me=$e(JA,he),GA=Ji(oA),OA=Ep(he,Object.keys(me),GA,tV(GA,Dt,UA));V=V.concat(OA),Ii=eE(JA,OA)}else{if(iA!==Qc.value)throw new Error("Cannot replace: unknown type of search result field ".concat(iA));var wt=$e(JA,oA);if(wt===void 0)throw new Error("Cannot replace: path not found ".concat(xt(oA)));var rt=typeof wt=="string"?wt:String(wt),je=m0(JA,yA,oA),ze=tV(rt,Dt,UA),pi=[{op:"replace",path:xt(oA),value:je?ze:cE(ze,fe)}];V=V.concat(pi),Ii=eE(JA,pi)}}),{operations:V,newSelection:Ii}})(a(),r(),c(m),c(S),s());E()(NA,(JA,yA)=>({state:yA,selection:Ge})),yield ue()}})).apply(this,arguments)}function RA(NA){NA.select()}function dA(){return IA.apply(this,arguments)}function IA(){return(IA=Xt(function*(){N(M,c(M)?$j(c(M)):void 0),yield ue()})).apply(this,arguments)}function xA(){return qA.apply(this,arguments)}function qA(){return qA=Xt(function*(){N(M,c(M)?(function(NA){var Ge=NA.activeIndex>0?NA.activeIndex-1:NA.items.length-1,JA=NA.items[Ge],yA=NA.items.map((Pt,Dt)=>Fe(Fe({},Pt),{},{active:Dt===Ge}));return Fe(Fe({},NA),{},{items:yA,activeItem:JA,activeIndex:Ge})})(c(M)):void 0),yield ue()}),qA.apply(this,arguments)}function ue(){return HA.apply(this,arguments)}function HA(){return(HA=Xt(function*(){var NA;o("handleFocus",c(M));var Ge=(NA=c(M))===null||NA===void 0?void 0:NA.activeItem;Ge&&a()!==void 0&&(yield u()(Ge.path,Ge.resultIndex))})).apply(this,arguments)}function bA(){return bA=Xt(function*(NA){yield Xe(NA,c(m),a())}),bA.apply(this,arguments)}function PA(){return PA=Xt(function*(NA){yield Xe(l(),NA,a()),yield ue()}),PA.apply(this,arguments)}function it(){return it=Xt(function*(NA){yield Xe(l(),c(m),NA)}),it.apply(this,arguments)}function Xe(NA,Ge,JA){return YA.apply(this,arguments)}function YA(){return YA=Xt(function*(NA,Ge,JA){return NA?(o("applySearch",{showSearch:NA,text:Ge}),Ge===""?(o("clearing search result"),c(M)!==void 0&&N(M,void 0),Promise.resolve()):(v=Ge,N(k,!0),new Promise(yA=>{setTimeout(()=>{var Pt=AV(Ge,JA,{maxResults:a_,columns:d()});N(M,(function(Dt,fe){var Zt=fe!=null&&fe.activeItem?iV(fe.activeItem):void 0,Pe=Dt.findIndex(Ke=>Ui(Zt,iV(Ke))),qe=Pe!==-1?Pe:fe?.activeIndex!==void 0&&fe?.activeIndex0?0:-1,vt=Dt.map((Ke,Ii)=>Fe(Fe({resultIndex:Ii},Ke),{},{active:Ii===qe}));return{items:vt,activeItem:vt[qe],activeIndex:qe}})(Pt,c(M))),N(k,!1),yA()})}))):(c(M)&&N(M,void 0),Promise.resolve())}),YA.apply(this,arguments)}function hA(){o("handleClose"),x.cancel(),F.cancel(),Xe(!1,c(m),a()),f()()}KA(()=>c(M),()=>{var NA;N(A,((NA=c(M))===null||NA===void 0||(NA=NA.items)===null||NA===void 0?void 0:NA.length)||0)}),KA(()=>c(M),()=>{var NA;N(t,((NA=c(M))===null||NA===void 0?void 0:NA.activeIndex)||0)}),KA(()=>(c(A),a_),()=>{N(n,c(A)>=a_?"".concat(999,"+"):String(c(A)))}),KA(()=>(Y(B()),c(M)),()=>{B()(c(M))}),KA(()=>Y(l()),()=>{(function(NA){bA.apply(this,arguments)})(l())}),KA(()=>c(m),()=>{x(c(m))}),KA(()=>Y(a()),()=>{F(a())}),Vn(),di(!0);var Ae=zi(),pA=at(Ae),te=NA=>{var Ge=EEA(),JA=gA(Ge),yA=gA(JA),Pt=GA=>{var OA=BEA(),wt=gA(OA),rt=lt(()=>g()?r0:JB);Bn(wt,{get data(){return c(rt)}}),De("click",OA,z),sA(GA,OA)};zA(yA,GA=>{C()||GA(Pt)});var Dt=gA(kA(yA,2)),fe=gA(Dt),Zt=gA(fe),Pe=GA=>{Bn(GA,{get data(){return iJ},spin:!0})},qe=GA=>{Bn(GA,{get data(){return Uu}})};zA(Zt,GA=>{c(k)?GA(Pe):GA(qe,!1)});var vt=kA(fe,2),Ke=gA(vt);Tr(()=>zw(Ke,()=>c(m),GA=>N(m,GA))),Ms(Ke,GA=>RA?.(GA)),Tr(()=>De("paste",Ke,eA));var Ii,V=kA(vt,2),$=gA(V),iA=kA(V,2);Bn(gA(iA),{get data(){return gJ}});var oA=kA(iA,2);Bn(gA(oA),{get data(){return tJ}});var UA=kA(oA,2);Bn(gA(UA),{get data(){return Ou}});var he=kA(Dt,2),me=GA=>{var OA=hEA(),wt=gA(OA),rt=kA(wt,2),je=kA(rt,2);zw(wt,()=>c(S),ze=>N(S,ze)),De("keydown",wt,X),De("click",rt,CA),De("click",je,BA),sA(GA,OA)};zA(he,GA=>{g()&&!C()&&GA(me)}),Le(()=>{var GA;Ii=Ci(V,1,"jse-search-count svelte-1x1x8q0",null,Ii,{"jse-visible":c(m)!==""}),Ht($,"".concat(c(t)!==-1&&c(t){l()&&NA(te)}),sA(i,Ae),Yt()}var op=Symbol("path");function QEA(i,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1/0,t={};Array.isArray(i)&&(function(o,a,r){if(o.length1?(o.length-1)/(a-1):o.length,l=0;l{Jn(o)?yW(o,t,e):t[op]=!0});var n=[];return op in t&&n.push([]),DW(t,[],n,e),n}function yW(i,e,A){for(var t in i){var n=i[t],o=e[t]||(e[t]={});Jn(n)&&A?yW(n,o,A):o[op]===void 0&&(o[op]=!0)}}function DW(i,e,A,t){for(var n in i){var o=e.concat(n),a=i[n];a&&a[op]===!0&&A.push(o),Ea(a)&&t&&DW(a,o,A,t)}}function uEA(i,e,A,t,n,o){for(var a=arguments.length>6&&arguments[6]!==void 0?arguments[6]:80,r=sa(A)?A.length:0,s=(function(v,S){var k=Object.values(v);if(An(k))return S;var M=(x,F)=>x+F;return k.reduce(M)/k.length})(t,n),l=i-a,g=e+2*a,C=v=>t[v]||n,d=0,B=o;B0&&(B-=C(--d));for(var u=d,E=0;Ev0(t,o))}}function Td(i,e){var{rowIndex:A,columnIndex:t}=i;return[String(A),...e[t]]}function pEA(i,e){var[A,t]=aF(i,a=>rx(a.path[0])),n=nF(A,fEA),o=oF(n,a=>{var r={row:[],columns:{}};return a.forEach(s=>{var l=(function(g,C){var d=Qg(g.path,C);return d.columnIndex!==-1?d.columnIndex:-1})(s,e);l!==-1?(r.columns[l]===void 0&&(r.columns[l]=[]),r.columns[l].push(s)):r.row.push(s)}),r});return{root:t,rows:o}}function Mh(i,e){if(e&&e.length!==0)return e.length===1?e[0]:{path:i,message:"Multiple validation issues: "+e.map(A=>El(A.path)+" "+A.message).join(", "),severity:Ec.warning}}function fEA(i){return parseInt(i.path[0],10)}function mEA(i,e,A){var t=e.some(n=>(function(o,a,r){if(!o)return!1;if(a.op==="replace"){var s=ms(a.path),{rowIndex:l,columnIndex:g}=Qg(s,r),C=r.findIndex(d=>Ui(d,o.path));if(l!==-1&&g!==-1&&g!==C)return!1}return!0})(i,n,A));return t?void 0:i}var bs=dr("jsoneditor:actions");function vW(i){return q_.apply(this,arguments)}function q_(){return q_=Xt(function*(i){var{json:e,selection:A,indentation:t,readOnly:n,parser:o,onPatch:a}=i;if(!n&&e!==void 0&&A&&Lh(A)){var r=Vq(e,A,t,o);if(r!==void 0){bs("cut",{selection:A,clipboard:r,indentation:t}),yield Mx(r);var{operations:s,newSelection:l}=AW(e,A);a(s,(g,C)=>({state:C,selection:l}))}}}),q_.apply(this,arguments)}function bW(i){return W_.apply(this,arguments)}function W_(){return W_=Xt(function*(i){var{json:e,selection:A,indentation:t,parser:n}=i,o=Vq(e,A,t,n);o!==void 0&&(bs("copy",{clipboard:o,indentation:t}),yield Mx(o))}),W_.apply(this,arguments)}function MW(i){var{clipboardText:e,json:A,selection:t,readOnly:n,parser:o,onPatch:a,onChangeText:r,onPasteMultilineText:s,openRepairModal:l}=i;if(!n)try{g(e)}catch(C){l(e,d=>{bs("repaired pasted text: ",d),g(d)})}function g(C){if(A!==void 0){var d=t||en([]),B=$q(A,d,C,o),u=(function(E,f,m){var v=arguments.length>3&&arguments[3]!==void 0?arguments[3]:MIA;if(E.length>v)return!1;var S=/\n/.test(E);if(!S)return!1;var k=f.some(x=>x.op==="replace"&&Array.isArray(x.value)),M=f.filter(x=>x.op==="add").length>1;if(!k&&!M)return!1;try{return dp(E,m.parse),!1}catch(x){return!0}})(e,B,o);bs("paste",{pastedText:C,operations:B,ensureSelection:d,pasteMultilineText:u}),a(B,(E,f)=>{var m=f;return B.filter(v=>(oM(v)||B6(v))&&ua(v.value)).forEach(v=>{var S=al(A,v.path);m=nI(E,m,S)}),{state:m}}),u&&s(C)}else bs("paste text",{pastedText:C}),r(e,(E,f)=>{if(E)return{state:nI(E,f,[])}})}}function SW(i){var{json:e,text:A,selection:t,keepSelection:n,readOnly:o,onChange:a,onPatch:r}=i;if(!o&&t){var s=e!==void 0&&(Cr(t)||bn(t))?vs(t.path,t.path):t;if(An(Qt(t)))bs("remove root",{selection:t}),a&&a({text:"",json:void 0},e!==void 0?{text:void 0,json:e}:{text:A||"",json:e},{contentErrors:void 0,patchResult:void 0});else if(e!==void 0){var{operations:l,newSelection:g}=AW(e,s);bs("remove",{operations:l,selection:t,newSelection:g}),r(l,(C,d)=>({state:d,selection:n?t:g}))}}}function r5(i){var{insertType:e,selectInside:A,initialValue:t,json:n,selection:o,readOnly:a,parser:r,onPatch:s,onReplaceJson:l}=i;if(!a){var g=(function(E,f,m){if(m==="object")return{};if(m==="array")return[];if(m==="structure"&&E!==void 0){var v=f?Pq(f):[],S=$e(E,v);if(Array.isArray(S)&&!An(S)){var k=Tc(S);return ua(k)?eF(k,M=>Array.isArray(M)?[]:Jn(M)?void 0:""):""}}return""})(n,o,e);if(n!==void 0){var C=r.stringify(g),d=$q(n,o,C,r);bs("onInsert",{insertType:e,operations:d,newValue:g,data:C});var B=Ji(d.filter(E=>E.op==="add"||E.op==="replace"));s(d,(E,f,m)=>{if(B){var v=al(E,B.path);if(ua(g))return{state:Bc(E,f,v,mx),selection:A?FC(v):m};if(g===""){var S=An(v)?void 0:$e(E,an(v));return{state:Bc(E,f,v,Kw),selection:Jn(S)?wx(v,t):Zw(v,t)}}}}),bs("after patch")}else{bs("onInsert",{insertType:e,newValue:g});var u=[];l(g,(E,f)=>({state:nI(E,f,u),selection:ua(g)?FC(u):Zw(u)}))}}}function kW(i){return Z_.apply(this,arguments)}function Z_(){return Z_=Xt(function*(i){var{char:e,selectInside:A,json:t,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s,onSelect:l}=i;o||(Cr(n)?l(Fe(Fe({},n),{},{edit:!0,initialValue:e})):e==="{"?r5({insertType:"object",selectInside:A,initialValue:void 0,json:t,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s}):e==="["?r5({insertType:"array",selectInside:A,initialValue:void 0,json:t,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s}):bn(n)&&t!==void 0?ua($e(t,n.path))||l(Fe(Fe({},n),{},{edit:!0,initialValue:e})):(bs("onInsertValueWithCharacter",{char:e}),yield(function(g){return X_.apply(this,arguments)})({char:e,json:t,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s})))}),Z_.apply(this,arguments)}function X_(){return X_=Xt(function*(i){var{char:e,json:A,selection:t,readOnly:n,parser:o,onPatch:a,onReplaceJson:r}=i;n||r5({insertType:"value",selectInside:!1,initialValue:e,json:A,selection:t,readOnly:n,parser:o,onPatch:a,onReplaceJson:r})}),X_.apply(this,arguments)}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-json-preview.svelte-25xmyd { - flex: 1; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-panel-color-readonly, #b2b2b2); - overflow: auto; - white-space: pre-wrap; - padding: 2px; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -}`);var wEA=TA('
    ');function _W(i,e){Jt(e,!1);var A=cA(),t=cA(),n=K(e,"text",8),o=K(e,"json",8),a=K(e,"indentation",8),r=K(e,"parser",8);KA(()=>(Y(o()),Y(n())),()=>{N(A,o()!==void 0?{json:o()}:{text:n()||""})}),KA(()=>(c(A),Y(a()),Y(r()),jw),()=>{N(t,mC(R_(c(A),a(),r()),jw))}),Vn(),di();var s=wEA(),l=gA(s);Le(()=>Ht(l,c(t))),sA(i,s),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -button.jse-context-menu-button.svelte-16jz6ui { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - flex: 1; - white-space: nowrap; - padding: var(--jse-padding, 10px); - color: inherit; -} -button.jse-context-menu-button.svelte-16jz6ui:hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -} -button.jse-context-menu-button.svelte-16jz6ui:focus { - background: var(--jse-context-menu-background-highlight, #7a7a7a); - z-index: 1; -} -button.jse-context-menu-button.svelte-16jz6ui:disabled { - color: var(--jse-context-menu-color-disabled, #9d9d9d); - background: unset; -} -button.jse-context-menu-button.left.svelte-16jz6ui { - text-align: left; -} -button.jse-context-menu-button.svelte-16jz6ui svg { - width: 16px; -}`);var yEA=TA('');function u_(i,e){Jt(e,!1);var A=K(e,"item",8),t=K(e,"className",8,void 0),n=K(e,"onRequestClose",8);di();var o=yEA(),a=gA(o),r=g=>{Bn(g,{get data(){return Y(A()),uA(()=>A().icon)}})};zA(a,g=>{Y(A()),uA(()=>A().icon)&&g(r)});var s=kA(a,2),l=g=>{var C=mr();Le(()=>Ht(C,(Y(A()),uA(()=>A().text)))),sA(g,C)};zA(s,g=>{Y(A()),uA(()=>A().text)&&g(l)}),Le(g=>{Ci(o,1,g,"svelte-16jz6ui"),jn(o,"title",(Y(A()),uA(()=>A().title))),o.disabled=(Y(A()),uA(()=>A().disabled||!1))},[()=>o1((Y(wc),Y(t()),Y(A()),uA(()=>wc("jse-context-menu-button",t(),A().className))))]),De("click",o,g=>{n()(),A().onClick(g)}),sA(i,o),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-dropdown-button.svelte-bov1j6 { - flex: 1; - line-height: normal; - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - position: relative; - padding: 0; - display: flex; -} -.jse-dropdown-button.svelte-bov1j6 ul:where(.svelte-bov1j6) { - margin: 0; - padding: 0; -} -.jse-dropdown-button.svelte-bov1j6 ul:where(.svelte-bov1j6) li:where(.svelte-bov1j6) { - margin: 0; - padding: 0; - list-style-type: none; -} -.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - width: 2em; - background: var(--jse-context-menu-background, #656565); - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); - border-radius: 0; -} -.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown.jse-visible:where(.svelte-bov1j6) { - background: var(--jse-context-menu-background, #656565); -} -.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -} -.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):focus { - z-index: 1; -} -.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):disabled { - color: var(--jse-context-menu-color-disabled, #9d9d9d); - background: unset; -} -.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) { - display: none; - position: absolute; - top: 100%; - left: 0; - z-index: 1; - background: var(--jse-context-menu-background, #656565); - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); -} -.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items.jse-visible:where(.svelte-bov1j6) { - display: block; -} -.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - width: 100%; - text-align: left; - padding: var(--jse-padding, 10px); - margin: 0; -} -.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6):hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -} -.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6):disabled { - color: var(--jse-context-menu-color-disabled, #9d9d9d); - background: unset; -}`);var DEA=TA('
  • '),vEA=TA('
      ');oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -button.jse-context-menu-button.svelte-1y5l9l1 { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - flex: 1; - white-space: nowrap; - padding: var(--jse-padding, 10px); - color: inherit; -} -button.jse-context-menu-button.svelte-1y5l9l1:hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -} -button.jse-context-menu-button.svelte-1y5l9l1:focus { - background: var(--jse-context-menu-background-highlight, #7a7a7a); - z-index: 1; -} -button.jse-context-menu-button.svelte-1y5l9l1:disabled { - color: var(--jse-context-menu-color-disabled, #9d9d9d); - background: unset; -} -button.jse-context-menu-button.left.svelte-1y5l9l1 { - text-align: left; -} -button.jse-context-menu-button.svelte-1y5l9l1 svg { - width: 16px; -}`);var bEA=TA('');function p_(i,e){Jt(e,!1);var A=cA(),t=K(e,"item",8),n=K(e,"className",8,void 0),o=K(e,"onRequestClose",8);KA(()=>(Y(t()),Y(o())),()=>{N(A,t().items.map(a=>Fe(Fe({},a),{},{onClick:r=>{o()(),a.onClick(r)}})))}),Vn(),di(),(function(a,r){Jt(r,!1);var s=cA(void 0,!0),l=K(r,"items",25,()=>[]),g=K(r,"title",9,void 0),C=K(r,"width",9,"120px"),d=cA(!1,!0);function B(){N(d,!1)}function u(M){RC(M)==="Escape"&&(M.preventDefault(),N(d,!1))}os(()=>{document.addEventListener("click",B),document.addEventListener("keydown",u)}),Dg(()=>{document.removeEventListener("click",B),document.removeEventListener("keydown",u)}),KA(()=>Y(l()),()=>{N(s,l().every(M=>M.disabled===!0))}),Vn(),di(!0);var E=vEA(),f=gA(E);ya(f,r,"defaultItem",{},null);var m,v=kA(f,2);Bn(gA(v),{get data(){return r0}});var S,k=kA(v,2);Da(gA(k),5,l,Ka,(M,x)=>{var F=DEA(),z=gA(F),j=gA(z),X=Z=>{Bn(Z,{get data(){return c(x),uA(()=>c(x).icon)}})};zA(j,Z=>{c(x),uA(()=>c(x).icon)&&Z(X)});var eA=kA(j);Le(()=>{var Z;jn(z,"title",(c(x),uA(()=>c(x).title))),z.disabled=(c(x),uA(()=>c(x).disabled)),Ci(z,1,o1((c(x),uA(()=>c(x).className))),"svelte-bov1j6"),Ht(eA," ".concat((c(x),(Z=uA(()=>c(x).text))!==null&&Z!==void 0?Z:"")))}),De("click",z,Z=>c(x).onClick(Z)),sA(M,F)}),Le(()=>{var M;jn(E,"title",g()),m=Ci(v,1,"jse-open-dropdown svelte-bov1j6",null,m,{"jse-visible":c(d)}),v.disabled=c(s),S=Ci(k,1,"jse-dropdown-items svelte-bov1j6",null,S,{"jse-visible":c(d)}),wg(k,"width: ".concat((M=C())!==null&&M!==void 0?M:"",";"))}),De("click",v,function(){var M=c(d);setTimeout(()=>N(d,!M))}),De("click",E,B),sA(a,E),Yt()})(i,{get width(){return Y(t()),uA(()=>t().width)},get items(){return c(A)},$$slots:{defaultItem:(a,r)=>{var s=bEA(),l=gA(s),g=d=>{Bn(d,{get data(){return Y(t()),uA(()=>t().main.icon)}})};zA(l,d=>{Y(t()),uA(()=>t().main.icon)&&d(g)});var C=kA(l);Le(d=>{var B;Ci(s,1,d,"svelte-1y5l9l1"),jn(s,"title",(Y(t()),uA(()=>t().main.title))),s.disabled=(Y(t()),uA(()=>t().main.disabled||!1)),Ht(C," ".concat((Y(t()),(B=uA(()=>t().main.text))!==null&&B!==void 0?B:"")))},[()=>o1((Y(wc),Y(n()),Y(t()),uA(()=>wc("jse-context-menu-button",n(),t().main.className))))]),De("click",s,d=>{o()(),t().main.onClick(d)}),sA(a,s)}}}),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-contextmenu.svelte-1shjn02 { - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - background: var(--jse-context-menu-background, #656565); - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); -} -.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) { - display: flex; - flex-direction: row; - align-items: flex-start; - justify-content: stretch; -} -.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-label:where(.svelte-1shjn02) { - flex: 1; - white-space: nowrap; - padding: var(--jse-padding, 10px); - color: var(--jse-context-menu-color-disabled, #9d9d9d); - line-height: normal; -} -.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-tip:where(.svelte-1shjn02) { - flex: 1; - background: var(--jse-context-menu-tip-background, rgba(255, 255, 255, 0.2)); - color: var(--context-menu-tip-color, inherit); - margin: calc(0.5 * var(--jse-padding, 10px)); - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); - font-size: 80%; - line-height: 1.3em; - display: flex; - flex-direction: row; - align-items: flex-start; - gap: var(--jse-padding, 10px); - border-radius: 3px; -} -.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-tip:where(.svelte-1shjn02) div.jse-tip-icon:where(.svelte-1shjn02) { - padding-top: calc(0.5 * var(--jse-padding, 10px)); -} -.jse-contextmenu.svelte-1shjn02 .jse-column:where(.svelte-1shjn02) { - flex: 1; - display: flex; - flex-direction: column; - align-items: stretch; -} -.jse-contextmenu.svelte-1shjn02 .jse-column:where(.svelte-1shjn02):not(:last-child) { - border-right: 1px solid var(--jse-context-menu-separator-color, #7a7a7a); -} -.jse-contextmenu.svelte-1shjn02 .jse-separator:where(.svelte-1shjn02) { - width: 100%; - height: 1px; - background: var(--jse-context-menu-separator-color, #7a7a7a); -}`);var MEA=TA('
      '),SEA=TA('
      '),kEA=TA('
      '),_EA=TA('
      '),xEA=TA('
      '),REA=TA('
      '),NEA=TA('
      '),FEA=TA('');function xW(i,e){Jt(e,!1);var A=K(e,"items",9),t=K(e,"onRequestClose",9),n=K(e,"tip",9),o=cA(void 0,!0);os(()=>{var d=Array.from(c(o).querySelectorAll("button")).find(B=>!B.disabled);d&&d.focus()});var a={ArrowUp:"Up",ArrowDown:"Down",ArrowLeft:"Left",ArrowRight:"Right"};function r(d){return console.error("Unknown type of context menu item",d),"???"}di(!0);var s=FEA(),l=gA(s);Da(l,1,A,Ka,(d,B)=>{var u=zi(),E=at(u),f=v=>{u_(v,{get item(){return c(B)},get onRequestClose(){return t()}})},m=v=>{var S=zi(),k=at(S),M=F=>{p_(F,{get item(){return c(B)},get onRequestClose(){return t()}})},x=F=>{var z=zi(),j=at(z),X=Z=>{var CA=xEA();Da(CA,5,()=>(c(B),uA(()=>c(B).items)),Ka,(wA,BA)=>{var QA=zi(),RA=at(QA),dA=xA=>{u_(xA,{get item(){return c(BA)},get onRequestClose(){return t()}})},IA=xA=>{var qA=zi(),ue=at(qA),HA=PA=>{p_(PA,{get item(){return c(BA)},get onRequestClose(){return t()}})},bA=PA=>{var it=zi(),Xe=at(it),YA=Ae=>{var pA=kEA();Da(pA,5,()=>(c(BA),uA(()=>c(BA).items)),Ka,(te,NA)=>{var Ge=zi(),JA=at(Ge),yA=Dt=>{u_(Dt,{className:"left",get item(){return c(NA)},get onRequestClose(){return t()}})},Pt=Dt=>{var fe=zi(),Zt=at(fe),Pe=vt=>{p_(vt,{className:"left",get item(){return c(NA)},get onRequestClose(){return t()}})},qe=vt=>{var Ke=zi(),Ii=at(Ke),V=iA=>{sA(iA,MEA())},$=iA=>{var oA=zi(),UA=at(oA),he=GA=>{var OA=SEA(),wt=gA(OA);Le(()=>Ht(wt,(c(NA),uA(()=>c(NA).text)))),sA(GA,OA)},me=GA=>{var OA=mr();Le(wt=>Ht(OA,wt),[()=>(c(NA),uA(()=>r(c(NA))))]),sA(GA,OA)};zA(UA,GA=>{Y(Kj),c(NA),uA(()=>Kj(c(NA)))?GA(he):GA(me,!1)},!0),sA(iA,oA)};zA(Ii,iA=>{Y(P2),c(NA),uA(()=>P2(c(NA)))?iA(V):iA($,!1)},!0),sA(vt,Ke)};zA(Zt,vt=>{Y(vh),c(NA),uA(()=>vh(c(NA)))?vt(Pe):vt(qe,!1)},!0),sA(Dt,fe)};zA(JA,Dt=>{Y(pC),c(NA),uA(()=>pC(c(NA)))?Dt(yA):Dt(Pt,!1)}),sA(te,Ge)}),sA(Ae,pA)},hA=Ae=>{var pA=zi(),te=at(pA),NA=JA=>{sA(JA,_EA())},Ge=JA=>{var yA=mr();Le(Pt=>Ht(yA,Pt),[()=>(c(BA),uA(()=>r(c(BA))))]),sA(JA,yA)};zA(te,JA=>{Y(P2),c(BA),uA(()=>P2(c(BA)))?JA(NA):JA(Ge,!1)},!0),sA(Ae,pA)};zA(Xe,Ae=>{Y(Tj),c(BA),uA(()=>Tj(c(BA)))?Ae(YA):Ae(hA,!1)},!0),sA(PA,it)};zA(ue,PA=>{Y(vh),c(BA),uA(()=>vh(c(BA)))?PA(HA):PA(bA,!1)},!0),sA(xA,qA)};zA(RA,xA=>{Y(pC),c(BA),uA(()=>pC(c(BA)))?xA(dA):xA(IA,!1)}),sA(wA,QA)}),sA(Z,CA)},eA=Z=>{var CA=zi(),wA=at(CA),BA=RA=>{sA(RA,REA())},QA=RA=>{var dA=mr();Le(IA=>Ht(dA,IA),[()=>(c(B),uA(()=>r(c(B))))]),sA(RA,dA)};zA(wA,RA=>{Y(P2),c(B),uA(()=>P2(c(B)))?RA(BA):RA(QA,!1)},!0),sA(Z,CA)};zA(j,Z=>{Y(Uj),c(B),uA(()=>Uj(c(B)))?Z(X):Z(eA,!1)},!0),sA(F,z)};zA(k,F=>{Y(vh),c(B),uA(()=>vh(c(B)))?F(M):F(x,!1)},!0),sA(v,S)};zA(E,v=>{Y(pC),c(B),uA(()=>pC(c(B)))?v(f):v(m,!1)}),sA(d,u)});var g=kA(l,2),C=d=>{var B=NEA(),u=gA(B),E=gA(u);Bn(gA(E),{get data(){return WO}});var f=gA(kA(E,2));Le(()=>Ht(f,n())),sA(d,B)};zA(g,d=>{n()&&d(C)}),ta(s,d=>N(o,d),()=>c(o)),De("keydown",s,function(d){var B=RC(d),u=a[B];if(u&&d.target){d.preventDefault();var E=rIA({allElements:Array.from(c(o).querySelectorAll("button:not([disabled])")),currentElement:d.target,direction:u,hasPrio:f=>f.getAttribute("data-type")!=="jse-open-dropdown"});E&&E.focus()}}),sA(i,s),Yt()}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-value.jse-string.svelte-1htmvf1 { - color: var(--jse-value-color-string, #008000); -} -.jse-value.jse-object.svelte-1htmvf1, .jse-value.jse-array.svelte-1htmvf1 { - min-width: 16px; - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); -} -.jse-value.jse-number.svelte-1htmvf1 { - color: var(--jse-value-color-number, #ee422e); -} -.jse-value.jse-boolean.svelte-1htmvf1 { - color: var(--jse-value-color-boolean, #ff8c00); -} -.jse-value.jse-null.svelte-1htmvf1 { - color: var(--jse-value-color-null, #004ed0); -} -.jse-value.jse-invalid.svelte-1htmvf1 { - color: var(--jse-text-color, #4d4d4d); -} -.jse-value.jse-url.svelte-1htmvf1 { - color: var(--jse-value-color-url, #008000); - text-decoration: underline; -} - -.jse-enum-value.svelte-1htmvf1 { - background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); - border: none; - padding: 0; - font-family: inherit; - font-size: inherit; - cursor: pointer; - outline: none; -} -.jse-enum-value.jse-selected.svelte-1htmvf1 { - background: var(--jse-selection-background-color, #d3d3d3); - color: inherit; -} -.jse-enum-value.jse-value.svelte-1htmvf1:focus { - color: var(--jse-text-color, #4d4d4d); -}`);var dte=TA(""),Ite=TA("");var Mw,Sw;function kw(i,e){return Mw||(Sw=new WeakMap,Mw=new ResizeObserver(A=>{for(var t of A){var n=Sw.get(t.target);n&&n(t.target)}})),Sw.set(i,e),Mw.observe(i),{destroy:()=>{Sw.delete(i),Mw.unobserve(i)}}}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-tree-mode.svelte-10mlrw4 { - flex: 1; - display: flex; - flex-direction: column; - position: relative; - background: var(--jse-background-color, #fff); - min-width: 0; - min-height: 0; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-text-color, #4d4d4d); - line-height: var(--jse-line-height, calc(1em + 4px)); -} -.jse-tree-mode.svelte-10mlrw4 .jse-hidden-input-label:where(.svelte-10mlrw4) .jse-hidden-input:where(.svelte-10mlrw4) { - position: fixed; - top: -10px; - left: -10px; - width: 1px; - height: 1px; - padding: 0; - border: 0; - outline: none; -} -.jse-tree-mode.no-main-menu.svelte-10mlrw4 { - border-top: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-tree-mode.svelte-10mlrw4 .jse-search-box-container:where(.svelte-10mlrw4) { - position: relative; - height: 0; - top: var(--jse-padding, 10px); - margin-right: calc(var(--jse-padding, 10px) + 20px); - margin-left: var(--jse-padding, 10px); - text-align: right; - z-index: 3; -} -.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) { - flex: 1; - overflow: auto; - position: relative; - padding: 2px; - display: flex; - flex-direction: column; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4):last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-loading-space:where(.svelte-10mlrw4) { - flex: 1; -} -.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-loading:where(.svelte-10mlrw4) { - flex: 2; - text-align: center; - color: var(--jse-panel-color-readonly, #b2b2b2); - box-sizing: border-box; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -} -.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-search-box-background:where(.svelte-10mlrw4) { - border: 50px solid var(--jse-modal-background, #f5f5f5); - margin: -2px; - margin-bottom: 2px; - display: inline-block; -}`);var LEA=TA(" ",1),GEA=TA('
      '),KEA=TA('
      ',1),UEA=TA(' ',1),TEA=TA('
      loading...
      '),OEA=TA('
      ',1);function $_(i,e){Jt(e,!1);var A=cA(void 0,!0),t=dr("jsoneditor:TreeMode"),n=typeof window>"u";t("isSSR:",n);var o=_1(),a=_1(),{openAbsolutePopup:r,closeAbsolutePopup:s}=s1("absolute-popup"),l=cA(void 0,!0),g=cA(void 0,!0),C=cA(void 0,!0),d=!1,B=BW(),u=K(e,"readOnly",9),E=K(e,"externalContent",9),f=K(e,"externalSelection",9),m=K(e,"history",9),v=K(e,"truncateTextSize",9),S=K(e,"mainMenuBar",9),k=K(e,"navigationBar",9),M=K(e,"escapeControlCharacters",9),x=K(e,"escapeUnicodeCharacters",9),F=K(e,"parser",9),z=K(e,"parseMemoizeOne",9),j=K(e,"validator",9),X=K(e,"validationParser",9),eA=K(e,"pathParser",9),Z=K(e,"indentation",9),CA=K(e,"onError",9),wA=K(e,"onChange",9),BA=K(e,"onChangeMode",9),QA=K(e,"onSelect",9),RA=K(e,"onUndo",9),dA=K(e,"onRedo",9),IA=K(e,"onRenderValue",9),xA=K(e,"onRenderMenu",9),qA=K(e,"onRenderContextMenu",9),ue=K(e,"onClassName",9),HA=K(e,"onFocus",9),bA=K(e,"onBlur",9),PA=K(e,"onSortModal",9),it=K(e,"onTransformModal",9),Xe=K(e,"onJSONEditorModal",9),YA=!1,hA=cA(!1,!0),Ae=cA(void 0,!0);vx({onMount:os,onDestroy:Dg,getWindow:()=>Ip(c(C)),hasFocus:()=>YA&&document.hasFocus()||cx(c(C)),onFocus:()=>{d=!0,HA()&&HA()()},onBlur:()=>{d=!1,bA()&&bA()()}});var pA=cA(void 0,!0),te=cA(void 0,!0),NA=void 0,Ge=!1,JA=cA(G_({json:c(pA)}),!0),yA=cA(Ap(f())?f():void 0,!0);function Pt(AA){N(yA,AA)}os(()=>{if(c(yA)){var AA=Qt(c(yA));N(JA,Bc(c(pA),c(JA),AA,Kw)),setTimeout(()=>qo(AA))}});var Dt,fe=cA(void 0,!0),Zt=cA(void 0,!0),Pe=cA(void 0,!0),qe=cA(void 0,!0),vt=cA(!1,!0),Ke=cA(!1,!0);function Ii(AA){N(qe,(Dt=AA)?tW(c(pA),Dt.items):void 0)}function V(AA,fA){return $.apply(this,arguments)}function $(){return($=Xt(function*(AA,fA){N(JA,Bc(c(pA),c(JA),AA,Kw));var ZA=_o(fA);yield Wi(AA,{element:ZA})})).apply(this,arguments)}function iA(){N(vt,!1),N(Ke,!1),Tt()}function oA(AA){t("select validation error",AA),N(yA,en(AA.path)),Wi(AA.path)}function UA(AA){var fA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:K_;t("expand"),N(JA,Bc(c(pA),c(JA),AA,fA))}function he(AA,fA){N(JA,Hj(c(pA),c(JA),AA,fA)),c(yA)&&(function(ZA,Ye){return v0(Qt(ZA),Ye)&&(Qt(ZA).length>Ye.length||nr(ZA))})(c(yA),AA)&&N(yA,void 0)}var me=cA(!1,!0),GA=cA([],!0),OA=cA(void 0,!0),wt=YB(hW);function rt(AA,fA,ZA,Ye){Kh(()=>{var Me;try{Me=wt(AA,fA,ZA,Ye)}catch(Re){Me=[{path:[],message:"Failed to validate: "+Re.message,severity:Ec.warning}]}Ui(Me,c(GA))||(t("validationErrors changed:",Me),N(GA,Me),N(OA,(function(Re,ct){var ti;return ct.forEach(ji=>{ti=hV(Re,ti,ji.path,(Wn,Cn)=>Fe(Fe({},Cn),{},{validationError:ji}))}),ct.forEach(ji=>{for(var Wn=ji.path;Wn.length>0;)Wn=an(Wn),ti=hV(Re,ti,Wn,(Cn,xo)=>xo.validationError?xo:Fe(Fe({},xo),{},{validationError:{isChildError:!0,path:Wn,message:"Contains invalid data",severity:Ec.warning}}))}),ti})(AA,c(GA))))},Me=>t("validationErrors updated in ".concat(Me," ms")))}function je(){return t("validate"),NA?{parseError:NA,isRepairable:!1}:(rt(c(pA),j(),F(),X()),An(c(GA))?void 0:{validationErrors:c(GA)})}function ze(){return c(pA)}function pi(){return c(JA)}function mn(){return c(yA)}function Sn(AA){t("applyExternalContent",{updatedContent:AA}),W4(AA)?(function(fA){if(fA!==void 0){var ZA=!Ui(c(pA),fA);if(t("update external json",{isChanged:ZA,currentlyText:c(pA)===void 0}),!!ZA){var Ye={documentState:c(JA),selection:c(yA),json:c(pA),text:c(te),textIsRepaired:c(me)};N(pA,fA),N(JA,Tl(fA,c(JA))),He(c(pA)),N(te,void 0),N(me,!1),NA=void 0,En(c(pA)),Gi(Ye)}}})(AA.json):q4(AA)&&(function(fA){if(!(fA===void 0||W4(E()))){var ZA=fA!==c(te);if(t("update external text",{isChanged:ZA}),!!ZA){var Ye={documentState:c(JA),selection:c(yA),json:c(pA),text:c(te),textIsRepaired:c(me)};try{N(pA,z()(fA)),N(JA,Tl(c(pA),c(JA))),He(c(pA)),N(te,fA),N(me,!1),NA=void 0}catch(Me){try{N(pA,z()(gg(fA))),N(JA,Tl(c(pA),c(JA))),He(c(pA)),N(te,fA),N(me,!0),NA=void 0,En(c(pA))}catch(Re){N(pA,void 0),N(JA,void 0),N(te,E().text),N(me,!1),NA=c(te)!==void 0&&c(te)!==""?Xh(c(te),Me.message||String(Me)):void 0}}En(c(pA)),Gi(Ye)}}})(AA.text)}function He(AA){Ge||(Ge=!0,N(JA,nI(AA,c(JA),[])))}function En(AA){c(yA)&&(Fr(AA,qd(c(yA)))&&Fr(AA,Qt(c(yA)))||(t("clearing selection: path does not exist anymore",c(yA)),N(yA,bh(AA,c(JA)))))}function Gi(AA){if(AA.json!==void 0||AA.text!==void 0){var fA=c(pA)!==void 0&&AA.json!==void 0;m().add({type:"tree",undo:{patch:fA?[{op:"replace",path:"",value:AA.json}]:void 0,json:AA.json,text:AA.text,documentState:AA.documentState,textIsRepaired:AA.textIsRepaired,selection:p0(AA.selection),sortedColumn:void 0},redo:{patch:fA?[{op:"replace",path:"",value:c(pA)}]:void 0,json:c(pA),text:c(te),documentState:c(JA),textIsRepaired:c(me),selection:p0(c(yA)),sortedColumn:void 0}})}}function Pi(AA,fA){var ZA;if(t("patch",AA,fA),c(pA)===void 0)throw new Error("Cannot apply patch: no JSON");var Ye=c(pA),Me={json:void 0,text:c(te),documentState:c(JA),selection:p0(c(yA)),textIsRepaired:c(me),sortedColumn:void 0},Re=eW(c(pA),AA),ct=Yq(c(pA),c(JA),AA),ti=(ZA=eE(c(pA),AA))!==null&&ZA!==void 0?ZA:c(yA),ji=typeof fA=="function"?fA(ct.json,ct.documentState,ti):void 0;return N(pA,ji?.json!==void 0?ji.json:ct.json),N(JA,ji?.state!==void 0?ji.state:ct.documentState),N(yA,ji?.selection!==void 0?ji.selection:ti),N(te,void 0),N(me,!1),N(Zt,void 0),N(Pe,void 0),NA=void 0,En(c(pA)),m().add({type:"tree",undo:Fe({patch:Re},Me),redo:{patch:AA,json:void 0,text:c(te),documentState:c(JA),selection:p0(c(yA)),sortedColumn:void 0,textIsRepaired:c(me)}}),{json:c(pA),previousJson:Ye,undo:Re,redo:AA}}function gn(){!u()&&c(yA)&&N(yA,wx(Qt(c(yA))))}function Rt(){if(!u()&&c(yA)){var AA=Qt(c(yA)),fA=$e(c(pA),AA);ua(fA)?(function(ZA,Ye){t("openJSONEditorModal",{path:ZA,value:Ye}),YA=!0,Xe()({content:{json:Ye},path:ZA,onPatch:c(b).onPatch,onClose:()=>{YA=!1,setTimeout(Tt)}})})(AA,fA):N(yA,Zw(AA))}}function Qn(){if(!u()&&bn(c(yA))){var AA=Qt(c(yA)),fA=xt(AA),ZA=$e(c(pA),AA),Ye=!m0(c(pA),c(JA),AA),Me=Ye?String(ZA):cE(String(ZA),F());t("handleToggleEnforceString",{enforceString:Ye,value:ZA,updatedValue:Me}),ee([{op:"replace",path:fA,value:Me}],(Re,ct)=>({state:I5(c(pA),ct,AA,{type:"value",enforceString:Ye})}))}}function jt(){return c(me)&&c(pA)!==void 0&&be(c(pA)),c(pA)!==void 0?{json:c(pA)}:{text:c(te)||""}}function J(){return ut.apply(this,arguments)}function ut(){return ut=Xt(function*(){var AA=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];yield vW({json:c(pA),selection:c(yA),indentation:AA?Z():void 0,readOnly:u(),parser:F(),onPatch:ee})}),ut.apply(this,arguments)}function bi(){return kn.apply(this,arguments)}function kn(){return kn=Xt(function*(){var AA=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];c(pA)!==void 0&&(yield bW({json:c(pA),selection:c(yA),indentation:AA?Z():void 0,parser:F()}))}),kn.apply(this,arguments)}function _n(AA){var fA;AA.preventDefault(),So((fA=AA.clipboardData)===null||fA===void 0?void 0:fA.getData("text/plain"))}function Co(){return ia.apply(this,arguments)}function ia(){return(ia=Xt(function*(){try{So(yield navigator.clipboard.readText())}catch(AA){console.error(AA),N(hA,!0)}})).apply(this,arguments)}function So(AA){AA!==void 0&&MW({clipboardText:AA,json:c(pA),selection:c(yA),readOnly:u(),parser:F(),onPatch:ee,onChangeText:EA,onPasteMultilineText:io,openRepairModal:Vo})}function Vo(AA,fA){N(Ae,{text:AA,onParse:ZA=>dp(ZA,Ye=>Cp(Ye,F())),onRepair:Sq,onApply:fA,onClose:Tt})}function ga(){SW({json:c(pA),text:c(te),selection:c(yA),keepSelection:!1,readOnly:u(),onChange:wA(),onPatch:ee})}function Ko(){!u()&&c(pA)!==void 0&&c(yA)&&Lh&&!An(Qt(c(yA)))&&(t("duplicate",{selection:c(yA)}),ee(Zq(c(pA),a1(c(pA),c(yA)))))}function va(){u()||!c(yA)||!bo(c(yA))&&!bn(c(yA))||An(Qt(c(yA)))||(t("extract",{selection:c(yA)}),ee(Xq(c(pA),c(yA)),(AA,fA)=>{if(ua(AA))return{state:c_(AA,fA,[])}}))}function ca(AA){r5({insertType:AA,selectInside:!0,initialValue:void 0,json:c(pA),selection:c(yA),readOnly:u(),parser:F(),onPatch:ee,onReplaceJson:be})}function pa(AA){Cr(c(yA))&&N(yA,en(c(yA).path)),c(yA)||N(yA,bh(c(pA),c(JA))),ca(AA)}function Uo(AA){if(!u()&&c(yA))if(ww(c(yA)))try{var fA=qd(c(yA)),ZA=$e(c(pA),fA),Ye=(function(Re,ct,ti){if(ct==="array"){if(Array.isArray(Re))return Re;if(Jn(Re))return kj(Re);if(typeof Re=="string")try{var ji=ti.parse(Re);if(Array.isArray(ji))return ji;if(Jn(ji))return kj(ji)}catch(Cn){return[Re]}return[Re]}if(ct==="object"){if(Array.isArray(Re))return Sj(Re);if(Jn(Re))return Re;if(typeof Re=="string")try{var Wn=ti.parse(Re);if(Jn(Wn))return Wn;if(Array.isArray(Wn))return Sj(Wn)}catch(Cn){return{value:Re}}return{value:Re}}if(ct==="value")return ua(Re)?ti.stringify(Re):Re;throw new Error("Cannot convert ".concat(sx(Re,ti)," to ").concat(ct))})(ZA,AA,F());if(Ye===ZA)return;var Me=[{op:"replace",path:xt(fA),value:Ye}];t("handleConvert",{selection:c(yA),path:fA,type:AA,operations:Me}),ee(Me,(Re,ct)=>({state:c(yA)?nI(Re,ct,Qt(c(yA))):c(JA)}))}catch(Re){CA()(Re)}else CA()(new Error("Cannot convert current selection to ".concat(AA)))}function de(){if(c(yA)){var AA=Vj(c(pA),c(JA),c(yA),!1),fA=an(Qt(c(yA)));AA&&!An(Qt(AA))&&Ui(fA,an(Qt(AA)))?N(yA,SC(Qt(AA))):N(yA,FC(fA)),t("insert before",{selection:c(yA),selectionBefore:AA,parentPath:fA}),jo(),nn()}}function xi(){if(c(yA)){var AA=n1(c(pA),c(yA));t("insert after",AA),N(yA,SC(AA)),jo(),nn()}}function wn(AA){return xn.apply(this,arguments)}function xn(){return(xn=Xt(function*(AA){yield kW({char:AA,selectInside:!0,json:c(pA),selection:c(yA),readOnly:u(),parser:F(),onPatch:ee,onReplaceJson:be,onSelect:Pt})})).apply(this,arguments)}function na(){if(!u()&&m().canUndo){var AA=m().undo();if(qw(AA)){var fA={json:c(pA),text:c(te)};N(pA,AA.undo.patch?ol(c(pA),AA.undo.patch):AA.undo.json),N(JA,AA.undo.documentState),N(yA,AA.undo.selection),N(te,AA.undo.text),N(me,AA.undo.textIsRepaired),NA=void 0,t("undo",{item:AA,json:c(pA),documentState:c(JA),selection:c(yA)}),SA(fA,AA.undo.patch&&AA.redo.patch?{json:c(pA),previousJson:fA.json,redo:AA.undo.patch,undo:AA.redo.patch}:void 0),Tt(),c(yA)&&Wi(Qt(c(yA)),{scrollToWhenVisible:!1})}else RA()(AA)}}function Ra(){if(!u()&&m().canRedo){var AA=m().redo();if(qw(AA)){var fA={json:c(pA),text:c(te)};N(pA,AA.redo.patch?ol(c(pA),AA.redo.patch):AA.redo.json),N(JA,AA.redo.documentState),N(yA,AA.redo.selection),N(te,AA.redo.text),N(me,AA.redo.textIsRepaired),NA=void 0,t("redo",{item:AA,json:c(pA),documentState:c(JA),selection:c(yA)}),SA(fA,AA.undo.patch&&AA.redo.patch?{json:c(pA),previousJson:fA.json,redo:AA.redo.patch,undo:AA.undo.patch}:void 0),Tt(),c(yA)&&Wi(Qt(c(yA)),{scrollToWhenVisible:!1})}else dA()(AA)}}function Oi(AA){var fA;u()||c(pA)===void 0||(YA=!0,PA()({id:o,json:c(pA),rootPath:AA,onSort:(fA=Xt(function*(ZA){var{operations:Ye}=ZA;t("onSort",AA,Ye),ee(Ye,(Me,Re)=>({state:c_(Me,Re,AA),selection:en(AA)}))}),function(ZA){return fA.apply(this,arguments)}),onClose:()=>{YA=!1,setTimeout(Tt)}}))}function ko(){c(yA)&&Oi(Wj(c(pA),c(yA)))}function ar(){Oi([])}function To(AA){if(c(pA)!==void 0){var{id:fA,onTransform:ZA,onClose:Ye}=AA,Me=AA.rootPath||[];YA=!0,it()({id:fA||a,json:c(pA),rootPath:Me,onTransform:Re=>{ZA?ZA({operations:Re,json:c(pA),transformedJson:ol(c(pA),Re)}):(t("onTransform",Me,Re),ee(Re,(ct,ti)=>({state:c_(ct,ti,Me),selection:en(Me)})))},onClose:()=>{YA=!1,setTimeout(Tt),Ye&&Ye()}})}}function ja(){c(yA)&&To({rootPath:Wj(c(pA),c(yA))})}function to(){To({rootPath:[]})}function Wi(AA){return ei.apply(this,arguments)}function ei(){return ei=Xt(function*(AA){var{scrollToWhenVisible:fA=!0,element:ZA}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};N(JA,Bc(c(pA),c(JA),AA,Kw));var Ye=ZA??qn(AA);if(t("scrollTo",{path:AA,elem:Ye,refContents:c(l)}),!Ye||!c(l))return Promise.resolve();var Me=c(l).getBoundingClientRect(),Re=Ye.getBoundingClientRect();if(!fA&&Re.bottom>Me.top&&Re.top{B(Ye,{container:c(l),offset:ct,duration:300,callback:()=>ti()})})}),ei.apply(this,arguments)}function qn(AA){var fA,ZA;return jo(),(fA=(ZA=c(l))===null||ZA===void 0?void 0:ZA.querySelector('div[data-path="'.concat(Gw(AA),'"]')))!==null&&fA!==void 0?fA:void 0}function _o(AA){var fA,ZA;return jo(),(fA=(ZA=c(l))===null||ZA===void 0?void 0:ZA.querySelector('span[data-search-result-index="'.concat(AA,'"]')))!==null&&fA!==void 0?fA:void 0}function qo(AA){var fA=qn(AA);if(fA&&c(l)){var ZA=c(l).getBoundingClientRect(),Ye=fA.getBoundingClientRect(),Me=ua($e(c(pA),AA))?20:Ye.height;Ye.topZA.bottom-20&&B(fA,{container:c(l),offset:-(ZA.height-Me-20),duration:0})}}function SA(AA,fA){if(AA.json!==void 0||AA?.text!==void 0){if(c(te)!==void 0){var ZA,Ye={text:c(te),json:void 0};(ZA=wA())===null||ZA===void 0||ZA(Ye,AA,{contentErrors:je(),patchResult:fA})}else if(c(pA)!==void 0){var Me,Re={text:void 0,json:c(pA)};(Me=wA())===null||Me===void 0||Me(Re,AA,{contentErrors:je(),patchResult:fA})}}}function ee(AA,fA){t("handlePatch",AA,fA);var ZA={json:c(pA),text:c(te)},Ye=Pi(AA,fA);return SA(ZA,Ye),Ye}function be(AA,fA){var ZA={json:c(pA),text:c(te)},Ye={documentState:c(JA),selection:c(yA),json:c(pA),text:c(te),textIsRepaired:c(me)},Me=Bc(c(pA),Tl(AA,c(JA)),[],Y4),Re=typeof fA=="function"?fA(AA,Me,c(yA)):void 0;N(pA,Re?.json!==void 0?Re.json:AA),N(JA,Re?.state!==void 0?Re.state:Me),N(yA,Re?.selection!==void 0?Re.selection:c(yA)),N(te,void 0),N(me,!1),NA=void 0,En(c(pA)),Gi(Ye),SA(ZA,void 0)}function EA(AA,fA){t("handleChangeText");var ZA={json:c(pA),text:c(te)},Ye={documentState:c(JA),selection:c(yA),json:c(pA),text:c(te),textIsRepaired:c(me)};try{N(pA,z()(AA)),N(JA,Bc(c(pA),Tl(c(pA),c(JA)),[],Y4)),N(te,void 0),N(me,!1),NA=void 0}catch(Re){try{N(pA,z()(gg(AA))),N(JA,Bc(c(pA),Tl(c(pA),c(JA)),[],Y4)),N(te,AA),N(me,!0),NA=void 0}catch(ct){N(pA,void 0),N(JA,G_({json:c(pA),expand:Y4})),N(te,AA),N(me,!1),NA=c(te)!==""?Xh(c(te),Re.message||String(Re)):void 0}}if(typeof fA=="function"){var Me=fA(c(pA),c(JA),c(yA));N(pA,Me?.json!==void 0?Me.json:c(pA)),N(JA,Me?.state!==void 0?Me.state:c(JA)),N(yA,Me?.selection!==void 0?Me.selection:c(yA))}En(c(pA)),Gi(Ye),SA(ZA,void 0)}function LA(AA,fA){var ZA=arguments.length>2&&arguments[2]!==void 0&&arguments[2];t("handleExpand",{path:AA,expanded:fA,recursive:ZA}),fA?UA(AA,ZA?mx:K_):he(AA,ZA),Tt()}function Ce(){LA([],!0,!0)}function Te(){LA([],!1,!0)}function gt(AA){t("openFind",{findAndReplace:AA}),N(vt,!1),N(Ke,!1),jo(),N(vt,!0),N(Ke,AA)}function dt(AA,fA){t("handleExpandSection",AA,fA),N(JA,(function(ZA,Ye,Me,Re){return AE(ZA,Ye,Me,(ct,ti)=>{if(!cr(ti))return ti;var ji=Tq(ti.visibleSections.concat(Re));return Fe(Fe({},ti),{},{visibleSections:ji})})})(c(pA),c(JA),AA,fA))}function Ut(AA){t("pasted json as text",AA),N(Zt,AA)}function io(AA){t("pasted multiline text",{pastedText:AA}),N(Pe,AA)}function Zi(AA){var fA,{anchor:ZA,left:Ye,top:Me,width:Re,height:ct,offsetTop:ti,offsetLeft:ji,showTip:Wn}=AA,Cn=(function(Bo){var{json:da,documentState:Nn,selection:qt,readOnly:un,onEditKey:si,onEditValue:_t,onToggleEnforceString:fi,onCut:ma,onCopy:ho,onPaste:Ia,onRemove:ba,onDuplicate:wr,onExtract:R0,onInsertBefore:ml,onInsert:Sg,onConvert:kc,onInsertAfter:kg,onSort:ss,onTransform:yr}=Bo,wl=da!==void 0,N0=!!qt,yl=!!qt&&An(Qt(qt)),Zn=qt?$e(da,Qt(qt)):void 0,Ua=Array.isArray(Zn)?"Edit array":Jn(Zn)?"Edit object":"Edit value",Ta=wl&&(bo(qt)||Cr(qt)||bn(qt)),m1=qt&&!yl?$e(da,an(Qt(qt))):void 0,EI=!un&&wl&&Ww(qt)&&!yl&&!Array.isArray(m1),w1=!un&&wl&&qt!==void 0&&Ww(qt),OE=w1&&!ua(Zn),QI=!un&&Ta,JE=Ta,kD=!un&&N0,_D=!un&&wl&&Ta&&!yl,xD=!un&&wl&&qt!==void 0&&(bo(qt)||bn(qt))&&!yl,_c=Ta,y1=_c?"Convert to:":"Insert:",Oa=!un&&(nr(qt)&&Array.isArray(Zn)||hl(qt)&&Array.isArray(m1)),Pl=!un&&(_c?ww(qt)&&!Jn(Zn):N0),YE=!un&&(_c?ww(qt)&&!Array.isArray(Zn):N0),HE=!un&&(_c?ww(qt)&&ua(Zn):N0),D1=qt!==void 0&&m0(da,Nn,Qt(qt));function Jr(zE){Ta?zE!=="structure"&&kc(zE):Sg(zE)}return[{type:"row",items:[{type:"button",onClick:()=>si(),icon:dd,text:"Edit key",title:"Edit the key (Double-click on the key)",disabled:!EI},{type:"dropdown-button",main:{type:"button",onClick:()=>_t(),icon:dd,text:Ua,title:"Edit the value (Double-click on the value)",disabled:!w1},width:"11em",items:[{type:"button",icon:dd,text:Ua,title:"Edit the value (Double-click on the value)",onClick:()=>_t(),disabled:!w1},{type:"button",icon:D1?kM:RM,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>fi(),disabled:!OE}]}]},{type:"separator"},{type:"row",items:[{type:"dropdown-button",main:{type:"button",onClick:()=>ma(!0),icon:Id,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!QI},width:"10em",items:[{type:"button",icon:Id,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>ma(!0),disabled:!QI},{type:"button",icon:Id,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>ma(!1),disabled:!QI}]},{type:"dropdown-button",main:{type:"button",onClick:()=>ho(!0),icon:aC,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!JE},width:"12em",items:[{type:"button",icon:aC,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>ho(!0),disabled:!JE},{type:"button",icon:aC,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>ho(!1),disabled:!JE}]},{type:"button",onClick:()=>Ia(),icon:bM,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:!kD}]},{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"button",onClick:()=>wr(),icon:SM,text:"Duplicate",title:"Duplicate selected contents (Ctrl+D)",disabled:!_D},{type:"button",onClick:()=>R0(),icon:XO,text:"Extract",title:"Extract selected contents",disabled:!xD},{type:"button",onClick:()=>ss(),icon:Ju,text:"Sort",title:"Sort array or object contents",disabled:un||!Ta},{type:"button",onClick:()=>yr(),icon:Ku,text:"Transform",title:"Transform array or object contents (filter, sort, project)",disabled:un||!Ta},{type:"button",onClick:()=>ba(),icon:m6,text:"Remove",title:"Remove selected contents (Delete)",disabled:un||!Ta}]},{type:"column",items:[{type:"label",text:y1},{type:"button",onClick:()=>Jr("structure"),icon:_c?Yu:Bd,text:"Structure",title:y1+" structure like the first item in the array",disabled:!Oa},{type:"button",onClick:()=>Jr("object"),icon:_c?Yu:Bd,text:"Object",title:y1+" object",disabled:!Pl},{type:"button",onClick:()=>Jr("array"),icon:_c?Yu:Bd,text:"Array",title:y1+" array",disabled:!YE},{type:"button",onClick:()=>Jr("value"),icon:_c?Yu:Bd,text:"Value",title:y1+" value",disabled:!HE}]}]},{type:"separator"},{type:"row",items:[{type:"button",onClick:()=>ml(),icon:oJ,text:"Insert before",title:"Select area before current entry to insert or paste contents",disabled:un||!Ta||yl},{type:"button",onClick:()=>kg(),icon:$O,text:"Insert after",title:"Select area after current entry to insert or paste contents",disabled:un||!Ta||yl}]}]})({json:c(pA),documentState:c(JA),selection:c(yA),readOnly:u(),onEditKey:gn,onEditValue:Rt,onToggleEnforceString:Qn,onCut:J,onCopy:bi,onPaste:Co,onRemove:ga,onDuplicate:Ko,onExtract:va,onInsertBefore:de,onInsert:pa,onInsertAfter:xi,onConvert:Uo,onSort:ko,onTransform:ja}),xo=(fA=qA()(Cn))!==null&&fA!==void 0?fA:Cn;if(xo!==!1){var ri={left:Ye,top:Me,offsetTop:ti,offsetLeft:ji,width:Re,height:ct,anchor:ZA,closeOnOuterClick:!0,onClose:()=>{YA=!1,Tt()}};YA=!0;var Ca=r(xW,{tip:Wn?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:xo,onRequestClose:()=>s(Ca)},ri)}}function nn(AA){if(!gr(c(yA)))if(AA&&(AA.stopPropagation(),AA.preventDefault()),AA&&AA.type==="contextmenu"&&AA.target!==c(g))Zi({left:AA.clientX,top:AA.clientY,width:yC,height:wC,showTip:!1});else{var fA,ZA=(fA=c(l))===null||fA===void 0?void 0:fA.querySelector(".jse-context-menu-pointer.jse-selected");if(ZA)Zi({anchor:ZA,offsetTop:2,width:yC,height:wC,showTip:!1});else{var Ye,Me=(Ye=c(l))===null||Ye===void 0?void 0:Ye.getBoundingClientRect();Me&&Zi({top:Me.top+2,left:Me.left+2,width:yC,height:wC,showTip:!1})}}}function ai(AA){Zi({anchor:Kq(AA.target,"BUTTON"),offsetTop:0,width:yC,height:wC,showTip:!0})}function Xi(){return Na.apply(this,arguments)}function Na(){return(Na=Xt(function*(){if(t("apply pasted json",c(Zt)),c(Zt)){var{onPasteAsJson:AA}=c(Zt);N(Zt,void 0),AA(),setTimeout(Tt)}})).apply(this,arguments)}function Vt(){return It.apply(this,arguments)}function It(){return(It=Xt(function*(){t("apply pasted multiline text",c(Pe)),c(Pe)&&(So(JSON.stringify(c(Pe))),setTimeout(Tt))})).apply(this,arguments)}function $i(){t("clear pasted json"),N(Zt,void 0),Tt()}function cn(){t("clear pasted multiline text"),N(Pe,void 0),Tt()}function Io(){BA()(xa.text)}function Rn(AA){N(yA,AA),Tt(),Wi(Qt(AA))}function Tt(){t("focus"),c(g)&&(c(g).focus(),c(g).select())}function fa(AA){return(function(fA,ZA,Ye){var Me=an(Ye),Re=[Ji(Ye)],ct=$e(fA,Me),ti=ct?g_(ct,ZA,Re):void 0;return ti?en(Me.concat(ti)):SC(Ye)})(c(pA),c(JA),AA)}function oa(AA){c(A)&&c(A).onDrag(AA)}function y(){c(A)&&c(A).onDragEnd()}var b=cA(void 0,!0);KA(()=>c(yA),()=>{var AA;AA=c(yA),Ui(AA,f())||(t("onSelect",AA),QA()(AA))}),KA(()=>(Y(M()),Y(x())),()=>{N(fe,lx({escapeControlCharacters:M(),escapeUnicodeCharacters:x()}))}),KA(()=>c(vt),()=>{(function(AA){c(l)&&AA&&c(l).scrollTop===0&&(Ol(l,c(l).style.overflowAnchor="none"),Ol(l,c(l).scrollTop+=J4),setTimeout(()=>{c(l)&&Ol(l,c(l).style.overflowAnchor="")}))})(c(vt))}),KA(()=>Y(E()),()=>{Sn(E())}),KA(()=>Y(f()),()=>{(function(AA){Ui(c(yA),AA)||(t("applyExternalSelection",{selection:c(yA),externalSelection:AA}),Ap(AA)&&N(yA,AA))})(f())}),KA(()=>(c(pA),Y(j()),Y(F()),Y(X())),()=>{rt(c(pA),j(),F(),X())}),KA(()=>(c(l),BV),()=>{N(A,c(l)?BV(c(l)):void 0)}),KA(()=>(Y(u()),Y(v()),Y(F()),c(fe),Y(IA()),Y(ue())),()=>{N(b,{mode:xa.tree,readOnly:u(),truncateTextSize:v(),parser:F(),normalization:c(fe),getJson:ze,getDocumentState:pi,getSelection:mn,findElement:qn,findNextInside:fa,focus:Tt,onPatch:ee,onInsert:ca,onExpand:LA,onSelect:Pt,onFind:gt,onExpandSection:dt,onPasteJson:Ut,onRenderValue:IA(),onContextMenu:Zi,onClassName:ue()||(()=>{}),onDrag:oa,onDragEnd:y})}),KA(()=>c(b),()=>{t("context changed",c(b))}),Vn();var R={expand:UA,collapse:he,validate:je,getJson:ze,patch:Pi,acceptAutoRepair:jt,openTransformModal:To,scrollTo:Wi,findElement:qn,findSearchResult:_o,focus:Tt};di(!0);var W=OEA();De("mousedown",bC,function(AA){!CE(AA.target,fA=>fA===c(C))&&gr(c(yA))&&(t("click outside the editor, exit edit mode"),N(yA,p0(c(yA))),d&&c(g)&&(c(g).focus(),c(g).blur()),t("blur (outside editor)"),c(g)&&c(g).blur())});var _,q=at(W),tA=gA(q),rA=AA=>{(function(fA,ZA){Jt(ZA,!1);var Ye=cA(void 0,!0),Me=cA(void 0,!0),Re=cA(void 0,!0),ct=K(ZA,"json",9),ti=K(ZA,"selection",9),ji=K(ZA,"readOnly",9),Wn=K(ZA,"showSearch",13,!1),Cn=K(ZA,"history",9),xo=K(ZA,"onExpandAll",9),ri=K(ZA,"onCollapseAll",9),Ca=K(ZA,"onUndo",9),Bo=K(ZA,"onRedo",9),da=K(ZA,"onSort",9),Nn=K(ZA,"onTransform",9),qt=K(ZA,"onContextMenu",9),un=K(ZA,"onCopy",9),si=K(ZA,"onRenderMenu",9);function _t(){Wn(!Wn())}var fi=cA(void 0,!0),ma=cA(void 0,!0),ho=cA(void 0,!0),Ia=cA(void 0,!0);KA(()=>Y(ct()),()=>{N(Ye,ct()!==void 0)}),KA(()=>(c(Ye),Y(ti()),bn),()=>{N(Me,c(Ye)&&(bo(ti())||Cr(ti())||bn(ti())))}),KA(()=>(Y(xo()),Y(ct())),()=>{N(fi,{type:"button",icon:pW,title:"Expand all",className:"jse-expand-all",onClick:xo(),disabled:!ua(ct())})}),KA(()=>(Y(ri()),Y(ct())),()=>{N(ma,{type:"button",icon:fW,title:"Collapse all",className:"jse-collapse-all",onClick:ri(),disabled:!ua(ct())})}),KA(()=>Y(ct()),()=>{N(ho,{type:"button",icon:Uu,title:"Search (Ctrl+F)",className:"jse-search",onClick:_t,disabled:ct()===void 0})}),KA(()=>(Y(ji()),c(fi),c(ma),Y(da()),Y(ct()),Y(Nn()),c(ho),Y(qt()),Y(Ca()),Y(Cn()),Y(Bo()),Y(un()),c(Me)),()=>{N(Ia,ji()?[c(fi),c(ma),{type:"separator"},{type:"button",icon:aC,title:"Copy (Ctrl+C)",className:"jse-copy",onClick:un(),disabled:!c(Me)},{type:"separator"},c(ho),{type:"space"}]:[c(fi),c(ma),{type:"separator"},{type:"button",icon:Ju,title:"Sort",className:"jse-sort",onClick:da(),disabled:ji()||ct()===void 0},{type:"button",icon:Ku,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:Nn(),disabled:ji()||ct()===void 0},c(ho),{type:"button",icon:MM,title:Ix,className:"jse-contextmenu",onClick:qt()},{type:"separator"},{type:"button",icon:D6,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:Ca(),disabled:!Cn().canUndo},{type:"button",icon:y6,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Bo(),disabled:!Cn().canRedo},{type:"space"}])}),KA(()=>(Y(si()),c(Ia)),()=>{N(Re,si()(c(Ia))||c(Ia))}),Vn(),di(!0),p5(fA,{get items(){return c(Re)}}),Yt()})(AA,{get json(){return c(pA)},get selection(){return c(yA)},get readOnly(){return u()},get history(){return m()},onExpandAll:Ce,onCollapseAll:Te,onUndo:na,onRedo:Ra,onSort:ar,onTransform:to,onContextMenu:ai,onCopy:bi,get onRenderMenu(){return xA()},get showSearch(){return c(vt)},set showSearch(fA){N(vt,fA)},$$legacy:!0})};zA(tA,AA=>{S()&&AA(rA)});var DA=kA(tA,2),ae=AA=>{IEA(AA,{get json(){return c(pA)},get selection(){return c(yA)},onSelect:Rn,get onError(){return CA()},get pathParser(){return eA()}})};zA(DA,AA=>{k()&&AA(ae)});var ge=kA(DA,2),pe=AA=>{var fA=UEA(),ZA=at(fA),Ye=gA(ZA);Ye.readOnly=!0,ta(Ye,ti=>N(g,ti),()=>c(g));var Me=kA(ZA,2),Re=ti=>{var ji=zi(),Wn=at(ji),Cn=ri=>{(function(Ca,Bo){function da(fi){fi.stopPropagation(),Bo.onCreateObject()}function Nn(fi){fi.stopPropagation(),Bo.onCreateArray()}Jt(Bo,!0);var qt=eEA();qt.__click=()=>Bo.onClick();var un=kA(gA(qt),2),si=kA(gA(un),2),_t=fi=>{var ma=AEA(),ho=kA(at(ma),2);jn(ho,"title","Create an empty JSON object (press '{')"),ho.__click=da;var Ia=kA(ho,2);jn(Ia,"title","Create an empty JSON array (press '[')"),Ia.__click=Nn,sA(fi,ma)};zA(si,fi=>{Bo.readOnly||fi(_t)}),sA(Ca,qt),Yt()})(ri,{get readOnly(){return u()},onCreateObject:()=>{Tt(),wn("{")},onCreateArray:()=>{Tt(),wn("[")},onClick:()=>{Tt()}})},xo=ri=>{var Ca=LEA(),Bo=at(Ca),da=lt(()=>u()?[]:[{icon:Tu,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:Io}]);Hl(Bo,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return c(da)}}),_W(kA(Bo,2),{get text(){return c(te)},get json(){return c(pA)},get indentation(){return Z()},get parser(){return F()}}),sA(ri,Ca)};zA(Wn,ri=>{c(te)===""||c(te)===void 0?ri(Cn):ri(xo,!1)}),sA(ti,ji)},ct=ti=>{var ji=KEA(),Wn=at(ji);wW(gA(Wn),{get json(){return c(pA)},get documentState(){return c(JA)},get parser(){return F()},get showSearch(){return c(vt)},get showReplace(){return c(Ke)},get readOnly(){return u()},columns:void 0,onSearch:Ii,onFocus:V,onPatch:ee,onClose:iA});var Cn=kA(Wn,2);jn(Cn,"data-jsoneditor-scrollable-contents",!0);var xo=gA(Cn),ri=si=>{sA(si,GEA())};zA(xo,si=>{c(vt)&&si(ri)}),j_(kA(xo,2),{get value(){return c(pA)},pointer:"",get state(){return c(JA)},get validationErrors(){return c(OA)},get searchResults(){return c(qe)},get selection(){return c(yA)},get context(){return c(b)},get onDragSelectionStart(){return Fa}}),ta(Cn,si=>N(l,si),()=>c(l));var Ca=kA(Cn,2),Bo=si=>{var _t=lt(()=>(c(Zt),uA(()=>"You pasted a JSON ".concat(Array.isArray(c(Zt).contents)?"array":"object"," as text")))),fi=lt(()=>[{icon:oC,text:"Paste as JSON instead",title:"Replace the value with the pasted JSON",onMouseDown:Xi},{text:"Leave as is",title:"Keep the JSON embedded in the value",onClick:$i}]);Hl(si,{type:"info",get message(){return c(_t)},get actions(){return c(fi)}})};zA(Ca,si=>{c(Zt)&&si(Bo)});var da=kA(Ca,2),Nn=si=>{var _t=lt(()=>[{icon:oC,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:Vt},{text:"Leave as is",title:"Keep the pasted array",onClick:cn}]);Hl(si,{type:"info",message:"Multiline text was pasted as array",get actions(){return c(_t)}})};zA(da,si=>{c(Pe)&&si(Nn)});var qt=kA(da,2),un=si=>{var _t=lt(()=>u()?[]:[{icon:w6,text:"Ok",title:"Accept the repaired document",onClick:jt},{icon:Tu,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:Io}]);Hl(si,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return c(_t)},onClose:Tt})};zA(qt,si=>{c(me)&&si(un)}),bx(kA(qt,2),{get validationErrors(){return c(GA)},selectError:oA}),sA(ti,ji)};zA(Me,ti=>{c(pA)===void 0?ti(Re):ti(ct,!1)}),De("paste",Ye,_n),sA(AA,fA)},Ve=AA=>{sA(AA,TEA())};zA(ge,AA=>{n?AA(Ve,!1):AA(pe)}),ta(q,AA=>N(C,AA),()=>c(C));var Ue=kA(q,2),Je=AA=>{EW(AA,{onClose:()=>N(hA,!1)})};zA(Ue,AA=>{c(hA)&&AA(Je)});var Ei=kA(Ue,2),no=AA=>{QW(AA,t1(()=>c(Ae),{onClose:()=>{var fA;(fA=c(Ae))===null||fA===void 0||fA.onClose(),N(Ae,void 0)}}))};return zA(Ei,AA=>{c(Ae)&&AA(no)}),Le(()=>_=Ci(q,1,"jse-tree-mode svelte-10mlrw4",null,_,{"no-main-menu":!S()})),De("keydown",q,function(AA){var fA=RC(AA),ZA=AA.shiftKey;if(t("keydown",{combo:fA,key:AA.key}),fA==="Ctrl+X"&&(AA.preventDefault(),J(!0)),fA==="Ctrl+Shift+X"&&(AA.preventDefault(),J(!1)),fA==="Ctrl+C"&&(AA.preventDefault(),bi(!0)),fA==="Ctrl+Shift+C"&&(AA.preventDefault(),bi(!1)),fA==="Ctrl+D"&&(AA.preventDefault(),Ko()),fA!=="Delete"&&fA!=="Backspace"||(AA.preventDefault(),ga()),fA==="Insert"&&(AA.preventDefault(),ca("structure")),fA==="Ctrl+A"&&(AA.preventDefault(),N(yA,en([]))),fA==="Ctrl+Q"&&nn(AA),fA==="ArrowUp"||fA==="Shift+ArrowUp"){AA.preventDefault();var Ye=c(yA)?Vj(c(pA),c(JA),c(yA),ZA)||c(yA):bh(c(pA),c(JA));N(yA,Ye),qo(Qt(Ye))}if(fA==="ArrowDown"||fA==="Shift+ArrowDown"){AA.preventDefault();var Me=c(yA)?(function(Cn,xo,ri){var Ca=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(ri){var Bo=Ca?Qt(ri):n1(Cn,ri),da=ua($e(Cn,Bo))?Hj(Cn,xo,Bo,!0):xo,Nn=g_(Cn,xo,Bo),qt=g_(Cn,da,Bo);if(Ca)return nr(ri)?Nn!==void 0?vs(Nn,Nn):void 0:hl(ri)?qt!==void 0?vs(qt,qt):void 0:qt!==void 0?vs(qd(ri),qt):void 0;if(hl(ri))return qt!==void 0?en(qt):void 0;if(nr(ri)||bn(ri))return Nn!==void 0?en(Nn):void 0;if(Cr(ri)){if(Nn===void 0||Nn.length===0)return;var un=an(Nn),si=$e(Cn,un);return Array.isArray(si)?en(Nn):NC(Nn)}return bo(ri)?qt!==void 0?en(qt):Nn!==void 0?en(Nn):void 0:void 0}})(c(pA),c(JA),c(yA),ZA)||c(yA):bh(c(pA),c(JA));N(yA,Me),qo(Qt(Me))}if(fA==="ArrowLeft"||fA==="Shift+ArrowLeft"){AA.preventDefault();var Re=c(yA)?(function(Cn,xo,ri){var Ca=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Bo=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if(ri){var{caret:da,previous:Nn}=qj(Cn,xo,ri,Bo);if(Ca)return bo(ri)?void 0:vs(ri.path,ri.path);if(da&&Nn)return U_(Nn);var qt=an(Qt(ri)),un=$e(Cn,qt);return bn(ri)&&Array.isArray(un)?vs(ri.path,ri.path):bo(ri)&&!Array.isArray(un)?NC(ri.focusPath):void 0}})(c(pA),c(JA),c(yA),ZA,!u())||c(yA):bh(c(pA),c(JA));N(yA,Re),qo(Qt(Re))}if(fA==="ArrowRight"||fA==="Shift+ArrowRight"){AA.preventDefault();var ct=c(yA)&&c(pA)!==void 0?(function(Cn,xo,ri){var Ca=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Bo=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if(ri){var{caret:da,next:Nn}=qj(Cn,xo,ri,Bo);return Ca?bo(ri)?void 0:vs(ri.path,ri.path):da&&Nn?U_(Nn):bo(ri)?en(ri.focusPath):void 0}})(c(pA),c(JA),c(yA),ZA,!u())||c(yA):bh(c(pA),c(JA));N(yA,ct),qo(Qt(ct))}if(fA==="Enter"&&c(yA)){if(B5(c(yA))){var ti=c(yA).focusPath,ji=$e(c(pA),an(ti));Array.isArray(ji)&&(AA.preventDefault(),N(yA,en(ti)))}Cr(c(yA))&&(AA.preventDefault(),N(yA,Fe(Fe({},c(yA)),{},{edit:!0}))),bn(c(yA))&&(AA.preventDefault(),ua($e(c(pA),c(yA).path))?LA(c(yA).path,!0):N(yA,Fe(Fe({},c(yA)),{},{edit:!0})))}if(fA.replace(/^Shift\+/,"").length===1&&c(yA))return AA.preventDefault(),void wn(AA.key);if(fA==="Enter"&&(hl(c(yA))||nr(c(yA))))return AA.preventDefault(),void wn("");if(fA==="Ctrl+Enter"&&bn(c(yA))){var Wn=$e(c(pA),c(yA).path);d5(Wn)&&window.open(String(Wn),"_blank")}fA==="Escape"&&c(yA)&&(AA.preventDefault(),N(yA,void 0)),fA==="Ctrl+F"&&(AA.preventDefault(),gt(!1)),fA==="Ctrl+H"&&(AA.preventDefault(),gt(!0)),fA==="Ctrl+Z"&&(AA.preventDefault(),na()),fA==="Ctrl+Shift+Z"&&(AA.preventDefault(),Ra())}),De("mousedown",q,function(AA){t("handleMouseDown",AA);var fA=AA.target;Gq(fA,"BUTTON")||fA.isContentEditable||(Tt(),c(yA)||c(pA)!==void 0||c(te)!==""&&c(te)!==void 0||(t("createDefaultSelection"),N(yA,en([]))))}),De("contextmenu",q,nn),sA(i,W),Ai(e,"expand",UA),Ai(e,"collapse",he),Ai(e,"validate",je),Ai(e,"getJson",ze),Ai(e,"patch",Pi),Ai(e,"acceptAutoRepair",jt),Ai(e,"openTransformModal",To),Ai(e,"scrollTo",Wi),Ai(e,"findElement",qn),Ai(e,"findSearchResult",_o),Ai(e,"focus",Tt),Yt(R)}function RW(i){return typeof(e=i)!="object"||e===null?i:new Proxy(i,{get:(A,t,n)=>RW(Reflect.get(A,t,n)),set:()=>!1,deleteProperty:()=>!1});var e}var _w=dr("jsoneditor:History");function NW(){var i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=i.maxItems||1e3,A=[],t=0;function n(){return t0}function a(){return{canUndo:n(),canRedo:o(),items:()=>A.slice().reverse(),add:s,undo:g,redo:C,clear:l}}function r(){i.onChange&&i.onChange(a())}function s(d){_w("add",d),A=[d].concat(A.slice(t)).slice(0,e),t=0,r()}function l(){_w("clear"),A=[],t=0,r()}function g(){if(n()){var d=A[t];return t+=1,_w("undo",d),r(),d}}function C(){if(o())return _w("redo",A[t-=1]),r(),A[t]}return{get:a}}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-transform-modal-inner.svelte-lta8xm { - flex: 1; - display: flex; - flex-direction: column; - min-width: 0; - min-height: 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) { - color: inherit; - flex: 1; - display: flex; - flex-direction: column; - padding: 0; - overflow: auto; - min-width: 0; - min-height: 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-top: var(--jse-padding, 10px); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) { - flex: 1; - display: flex; - gap: calc(2 * var(--jse-padding, 10px)); - min-height: 0; - box-sizing: border-box; - padding: 0 calc(2 * var(--jse-padding, 10px)) var(--jse-padding, 10px); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) { - flex: 1; - display: flex; - flex-direction: column; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p { - margin: var(--jse-padding, 10px) 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p:first-child { - margin-top: 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p:last-child { - margin-bottom: 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) code { - background: var(--jse-modal-code-background, rgba(0, 0, 0, 0.05)); - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .query-error:where(.svelte-lta8xm) { - color: var(--jse-error-color, #ee5341); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) textarea.jse-query:where(.svelte-lta8xm) { - flex: 1; - outline: none; - resize: vertical; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) { - flex: 1; - display: flex; - flex-direction: column; - gap: calc(2 * var(--jse-padding, 10px)); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data:where(.svelte-lta8xm) { - flex: 1; - display: flex; - flex-direction: column; - min-height: 0; - box-sizing: border-box; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data.jse-hide:where(.svelte-lta8xm) { - flex: none; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-preview-data:where(.svelte-lta8xm) { - flex: 1; - display: flex; - flex-direction: column; - min-height: 0; - box-sizing: border-box; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents.jse-hide-original-data:where(.svelte-lta8xm) { - flex-direction: column; - gap: 0; - margin-bottom: 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) { - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)) calc(2 * var(--jse-padding, 10px)); -} -@media screen and (max-width: 1200px) { - .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) { - flex-direction: column; - overflow: auto; - } - .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) textarea.jse-query:where(.svelte-lta8xm) { - min-height: 150px; - flex: none; - } - .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-tree-mode { - height: 300px; - flex: none; - } - .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data:where(.svelte-lta8xm), - .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-preview-data:where(.svelte-lta8xm) { - flex: unset; - } -} -.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) { - font-weight: bold; - display: block; - box-sizing: border-box; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) .jse-label-inner:where(.svelte-lta8xm) { - margin-top: calc(2 * var(--jse-padding, 10px)); - margin-bottom: calc(0.5 * var(--jse-padding, 10px)); - box-sizing: border-box; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) .jse-label-inner:where(.svelte-lta8xm) button:where(.svelte-lta8xm) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - font-weight: bold; - padding: 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-tree-mode { - flex: 1; - background: var(--jse-input-background-readonly, transparent); - box-shadow: none; - box-sizing: border-box; - --jse-main-border: var(--jse-input-border, 1px solid #d8dbdf); -} -.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm), -.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm) { - border: var(--jse-input-border, 1px solid #d8dbdf); - outline: none; - box-sizing: border-box; - padding: calc(0.5 * var(--jse-padding, 10px)); - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: inherit; - background: var(--jse-input-background, var(--jse-background-color, #fff)); -} -.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm):focus, -.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm):focus { - border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); -} -.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm):read-only, -.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm):read-only { - background: var(--jse-input-background-readonly, transparent); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-preview.jse-error:where(.svelte-lta8xm) { - flex: 1; - background: var(--jse-input-background-readonly, transparent); - border: var(--jse-input-border, 1px solid #d8dbdf); - color: var(--jse-error-color, #ee5341); - padding: calc(0.5 * var(--jse-padding, 10px)); -} -.jse-transform-modal-inner.svelte-lta8xm a { - color: var(--jse-a-color, #156fc5); -} -.jse-transform-modal-inner.svelte-lta8xm a:hover { - color: var(--jse-a-color-highlight, #0f508d); -}`);var U4=C5(()=>qIA),Sh=C5(()=>WIA),JEA=TA('
      '),YEA=TA(" ",1),HEA=TA('
      '),zEA=TA('
      Language
      Path
      Query
      Preview
      ',1),PEA=TA('
      ');function jEA(i,e){var A,t,n;Jt(e,!1);var o=dr("jsoneditor:TransformModal"),a=K(e,"id",25,()=>"transform-modal-"+Fh()),r=K(e,"json",9),s=K(e,"rootPath",25,()=>[]),l=K(e,"indentation",9),g=K(e,"truncateTextSize",9),C=K(e,"escapeControlCharacters",9),d=K(e,"escapeUnicodeCharacters",9),B=K(e,"parser",9),u=K(e,"parseMemoizeOne",9),E=K(e,"validationParser",9),f=K(e,"pathParser",9),m=K(e,"queryLanguages",9),v=K(e,"queryLanguageId",13),S=K(e,"onChangeQueryLanguage",9),k=K(e,"onRenderValue",9),M=K(e,"onRenderMenu",9),x=K(e,"onRenderContextMenu",9),F=K(e,"onClassName",9),z=K(e,"onTransform",9),j=K(e,"onClose",9),X=cA(void 0,!0),eA=cA(NW({onChange:JA=>N(eA,JA)}).get(),!0),Z=cA(void 0,!0),CA=cA(void 0,!0),wA=cA(!1,!0),BA="".concat(a(),":").concat(xt(s())),QA=(A=U4()[BA])!==null&&A!==void 0?A:{},RA=cA(Sh().showWizard!==!1,!0),dA=cA(Sh().showOriginal!==!1,!0),IA=cA((t=QA.queryOptions)!==null&&t!==void 0?t:{},!0),xA=cA(v()===QA.queryLanguageId&&QA.query?QA.query:"",!0),qA=cA((n=QA.isManual)!==null&&n!==void 0&&n,!0),ue=cA(void 0,!0),HA=cA(void 0,!0),bA=cA({text:""},!0);function PA(JA){var yA;return(yA=m().find(Pt=>Pt.id===JA))!==null&&yA!==void 0?yA:m()[0]}function it(JA){try{N(IA,JA),N(xA,PA(v()).createQuery(c(Z),JA)),N(ue,void 0),N(qA,!1),o("updateQueryByWizard",{queryOptions:c(IA),query:c(xA),isManual:c(qA)})}catch(yA){N(ue,String(yA))}}function Xe(JA){N(xA,JA.target.value),N(qA,!0),o("handleChangeQuery",{query:c(xA),isManual:c(qA)})}c(qA)||it(c(IA)),os(()=>{var JA;(JA=c(X))===null||JA===void 0||JA.focus()});var YA=XE(function(JA,yA){if(JA===void 0)return N(bA,{text:""}),void N(HA,"Error: No JSON");if(yA.trim()!=="")try{o("previewTransform",{query:yA});var Pt=PA(v()).executeQuery(JA,yA,B());N(bA,{json:Pt}),N(HA,void 0)}catch(Dt){N(bA,{text:""}),N(HA,String(Dt))}else N(bA,{json:JA})},300);function hA(){if(c(Z)===void 0)return N(bA,{text:""}),void N(HA,"Error: No JSON");try{o("handleTransform",{query:c(xA)});var JA=PA(v()).executeQuery(c(Z),c(xA),B());z()([{op:"replace",path:xt(s()),value:JA}]),j()()}catch(yA){console.error(yA),N(bA,{text:""}),N(HA,String(yA))}}function Ae(){N(RA,!c(RA)),Sh(Sh().showWizard=c(RA))}function pA(){N(dA,!c(dA)),Sh(Sh().showOriginal=c(dA))}function te(JA){JA.focus()}function NA(JA){o("handleChangeQueryLanguage",JA),v(JA),S()(JA),it(c(IA))}function Ge(){c(wA)?N(wA,!c(wA)):j()()}KA(()=>(Y(r()),Y(s())),()=>{N(Z,RW($e(r(),s())))}),KA(()=>c(Z),()=>{N(CA,c(Z)?{json:c(Z)}:{text:""})}),KA(()=>(c(Z),c(xA)),()=>{YA(c(Z),c(xA))}),KA(()=>(U4(),c(IA),c(xA),Y(v()),c(qA)),()=>{U4(U4()[BA]={queryOptions:c(IA),query:c(xA),queryLanguageId:v(),isManual:c(qA)}),o("store state in memory",BA,U4()[BA])}),Vn(),di(!0),np(i,{get onClose(){return j()},className:"jse-transform-modal",get fullscreen(){return c(wA)},children:(JA,yA)=>{var Pt=PEA();N_(gA(Pt),{children:(Dt,fe)=>{var Zt=zEA(),Pe=at(Zt);(function(J,ut){Jt(ut,!1);var bi,kn=K(ut,"queryLanguages",9),_n=K(ut,"queryLanguageId",9),Co=K(ut,"fullscreen",13),ia=K(ut,"onChangeQueryLanguage",9),So=K(ut,"onClose",9),Vo=cA(void 0,!0),{openAbsolutePopup:ga,closeAbsolutePopup:Ko}=s1("absolute-popup");function va(){var ca={queryLanguages:kn(),queryLanguageId:_n(),onChangeQueryLanguage:pa=>{Ko(bi),ia()(pa)}};bi=ga(zBA,ca,{offsetTop:-2,offsetLeft:0,anchor:c(Vo),closeOnOuterClick:!0})}di(!0),o5(J,{title:"Transform",fullScreenButton:!0,get onClose(){return So()},get fullscreen(){return Co()},set fullscreen(ca){Co(ca)},$$slots:{actions:(ca,pa)=>{var Uo,de=VBA();Bn(gA(de),{get data(){return aJ}}),ta(de,xi=>N(Vo,xi),()=>c(Vo)),Le(()=>Uo=Ci(de,1,"jse-config svelte-5gkegr",null,Uo,{hide:kn().length<=1})),De("click",de,va),sA(ca,de)}},$$legacy:!0}),Yt()})(Pe,{get queryLanguages(){return m()},get queryLanguageId(){return v()},onChangeQueryLanguage:NA,get onClose(){return j()},get fullscreen(){return c(wA)},set fullscreen(J){N(wA,J)},$$legacy:!0});var qe=gA(kA(Pe,2)),vt=gA(qe),Ke=kA(gA(vt),2);pq(gA(Ke),()=>(Y(v()),uA(()=>PA(v()).description)));var Ii=kA(Ke,4),V=kA(Ii,2),$=gA(V),iA=gA($),oA=gA(iA),UA=lt(()=>c(RA)?r0:JB);Bn(oA,{get data(){return c(UA)}});var he=kA(V,2),me=J=>{var ut=zi(),bi=at(ut),kn=Co=>{var ia=YEA(),So=at(ia);JBA(So,{get queryOptions(){return c(IA)},get json(){return c(Z)},onChange:it});var Vo=kA(So,2),ga=Ko=>{var va=JEA(),ca=gA(va);Le(()=>Ht(ca,c(ue))),sA(Ko,va)};zA(Vo,Ko=>{c(ue)&&Ko(ga)}),sA(Co,ia)},_n=Co=>{sA(Co,mr("(Only available for arrays, not for objects)"))};zA(bi,Co=>{c(Z),uA(()=>Array.isArray(c(Z)))?Co(kn):Co(_n,!1)}),sA(J,ut)};zA(he,J=>{c(RA)&&J(me)});var GA=kA(he,4);ta(GA,J=>N(X,J),()=>c(X));var OA,wt,rt=kA(vt,2),je=gA(rt),ze=gA(je),pi=gA(ze),mn=gA(pi),Sn=gA(mn),He=lt(()=>c(dA)?r0:JB);Bn(Sn,{get data(){return c(He)}});var En=kA(ze,2),Gi=J=>{$_(J,{get externalContent(){return c(CA)},externalSelection:void 0,get history(){return c(eA)},readOnly:!0,get truncateTextSize(){return g()},mainMenuBar:!1,navigationBar:!1,get indentation(){return l()},get escapeControlCharacters(){return C()},get escapeUnicodeCharacters(){return d()},get parser(){return B()},get parseMemoizeOne(){return u()},get onRenderValue(){return k()},get onRenderMenu(){return M()},get onRenderContextMenu(){return x()},onError:uA(()=>console.error),get onChange(){return Fa},get onChangeMode(){return Fa},get onSelect(){return Fa},get onUndo(){return Fa},get onRedo(){return Fa},get onFocus(){return Fa},get onBlur(){return Fa},get onSortModal(){return Fa},get onTransformModal(){return Fa},get onJSONEditorModal(){return Fa},get onClassName(){return F()},validator:void 0,get validationParser(){return E()},get pathParser(){return f()}})};zA(En,J=>{c(dA)&&J(Gi)});var Pi=kA(je,2),gn=kA(gA(Pi),2),Rt=J=>{$_(J,{get externalContent(){return c(bA)},externalSelection:void 0,get history(){return c(eA)},readOnly:!0,get truncateTextSize(){return g()},mainMenuBar:!1,navigationBar:!1,get indentation(){return l()},get escapeControlCharacters(){return C()},get escapeUnicodeCharacters(){return d()},get parser(){return B()},get parseMemoizeOne(){return u()},get onRenderValue(){return k()},get onRenderMenu(){return M()},get onRenderContextMenu(){return x()},onError:uA(()=>console.error),get onChange(){return Fa},get onChangeMode(){return Fa},get onSelect(){return Fa},get onUndo(){return Fa},get onRedo(){return Fa},get onFocus(){return Fa},get onBlur(){return Fa},get onSortModal(){return Fa},get onTransformModal(){return Fa},get onJSONEditorModal(){return Fa},get onClassName(){return F()},validator:void 0,get validationParser(){return E()},get pathParser(){return f()}})},Qn=J=>{var ut=HEA(),bi=gA(ut);Le(()=>Ht(bi,c(HA))),sA(J,ut)};zA(gn,J=>{c(HA)?J(Qn,!1):J(Rt)});var jt=gA(kA(qe,2));Tr(()=>De("click",jt,hA)),Ms(jt,J=>te?.(J)),Le(J=>{tI(Ii,J),tI(GA,c(xA)),OA=Ci(rt,1,"jse-data-contents svelte-lta8xm",null,OA,{"jse-hide-original-data":!c(dA)}),wt=Ci(je,1,"jse-original-data svelte-lta8xm",null,wt,{"jse-hide":!c(dA)}),jt.disabled=!!c(HA)},[()=>(Y(An),Y(s()),Y(El),uA(()=>An(s())?"(document root)":El(s())))]),De("click",iA,Ae),De("input",GA,Xe),De("click",mn,pA),sA(Dt,Zt)},$$slots:{default:!0}}),Ms(Pt,(Dt,fe)=>a5?.(Dt,fe),()=>Ge),sA(JA,Pt)},$$slots:{default:!0}}),Yt()}function ug(){}var VEA=0,fr=class{constructor(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.id=VEA++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=ap.match(e)),A=>{var t=e(A);return t===void 0?null:[this,t]}}};fr.closedBy=new fr({deserialize:i=>i.split(" ")}),fr.openedBy=new fr({deserialize:i=>i.split(" ")}),fr.group=new fr({deserialize:i=>i.split(" ")}),fr.isolate=new fr({deserialize:i=>{if(i&&i!="rtl"&&i!="ltr"&&i!="auto")throw new RangeError("Invalid value for isolate: "+i);return i||"auto"}}),fr.contextHash=new fr({perNode:!0}),fr.lookAhead=new fr({perNode:!0}),fr.mounted=new fr({perNode:!0});var pV,qEA=Object.create(null),ap=class i{constructor(e,A,t){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;this.name=e,this.props=A,this.id=t,this.flags=n}static define(e){var A=e.props&&e.props.length?Object.create(null):qEA,t=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new i(e.name||"",A,e.id,t);if(e.props){for(var o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;var A=this.prop(fr.group);return!!A&&A.indexOf(e)>-1}return this.id==e}static match(e){var A=Object.create(null);for(var t in e)for(var n of t.split(" "))A[n]=e[t];return o=>{for(var a=o.prop(fr.group),r=-1;r<(a?a.length:0);r++){var s=A[r<0?o.name:a[r]];if(s)return s}}}};ap.none=new ap("",Object.create(null),0,8),(function(i){i[i.ExcludeBuffers=1]="ExcludeBuffers",i[i.IncludeAnonymous=2]="IncludeAnonymous",i[i.IgnoreMounts=4]="IgnoreMounts",i[i.IgnoreOverlays=8]="IgnoreOverlays"})(pV||(pV={})),new fr({perNode:!0});oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-status-bar.svelte-1pmgv9j { - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-color-readonly, #b2b2b2); - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - margin: 0; - border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); - display: flex; - gap: var(--jse-padding, 10px); -} -.jse-status-bar.svelte-1pmgv9j:last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-status-bar.svelte-1pmgv9j .jse-status-bar-info:where(.svelte-1pmgv9j) { - padding: 2px; -}`);var WEA=TA('
      '),ZEA=TA('
      '),XEA=TA('
      '),$EA=TA('
      '),Sx=Bh.define([{tag:Oe.propertyName,color:"var(--internal-key-color)"},{tag:Oe.number,color:"var(--internal-value-color-number)"},{tag:Oe.bool,color:"var(--internal-value-color-boolean)"},{tag:Oe.string,color:"var(--internal-value-color-string)"},{tag:Oe.keyword,color:"var(--internal-value-color-null)"}]),AQA=Ak(Sx),eQA=Sx.style;Sx.style=i=>eQA(i||[]);var tQA=[Po.fromClass(class{constructor(i){this.view=i,this.indentUnit=Cc(i.state),this.initialPaddingLeft=null,this.isChrome=window?.navigator.userAgent.includes("Chrome"),this.generate(i.state)}update(i){var e=Cc(i.state);(e!==this.indentUnit||i.docChanged||i.viewportChanged)&&(this.indentUnit=e,this.generate(i.state))}generate(i){var e=new Xr;this.initialPaddingLeft?this.addStyleToBuilder(e,i,this.initialPaddingLeft):this.view.requestMeasure({read:A=>{var t=A.contentDOM.querySelector(".cm-line");t&&(this.initialPaddingLeft=window.getComputedStyle(t).getPropertyValue("padding-left"),this.addStyleToBuilder(e,A.state,this.initialPaddingLeft)),this.decorations=e.finish()}}),this.decorations=e.finish()}addStyleToBuilder(i,e,A){var t=this.getVisibleLines(e);for(var n of t){var{numColumns:o,containsTab:a}=this.numColumns(n.text,e.tabSize),r="calc(".concat(o+this.indentUnit,"ch + ").concat(A,")"),s=this.isChrome?"calc(-".concat(o+this.indentUnit,"ch - ").concat(a?1:0,"px)"):"-".concat(o+this.indentUnit,"ch");i.add(n.from,n.from,Lt.line({attributes:{style:"padding-left: ".concat(r,"; text-indent: ").concat(s,";")}}))}}getVisibleLines(i){var e=new Set,A=null;for(var{from:t,to:n}of this.view.visibleRanges)for(var o=t;o<=n;){var a=i.doc.lineAt(o);A!==a&&(e.add(a),A=a),o=a.to+1}return e}numColumns(i,e){var A=0,t=!1;A:for(var n=0;ni.decorations})];oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-text-mode.svelte-k2b9e6 { - --internal-key-color: var(--jse-key-color, #1a1a1a); - --internal-value-color-number: var(--jse-value-color-number, #ee422e); - --internal-value-color-boolean: var(--jse-value-color-boolean, #ff8c00); - --internal-value-color-string: var(--jse-value-color-string, #008000); - --internal-value-color-null: var(--jse-value-color-null, #004ed0); - flex: 1; - box-sizing: border-box; - display: flex; - flex-direction: column; - background: var(--jse-background-color, #fff); -} -.jse-text-mode.no-main-menu.svelte-k2b9e6 { - border-top: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) { - flex: 1; - display: flex; - position: relative; - flex-direction: column; - overflow: hidden; - min-width: 0; - min-height: 0; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6):last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents.jse-hidden:where(.svelte-k2b9e6) { - visibility: hidden; - position: absolute; - top: 0; - left: 0; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor { - flex: 1; - overflow: hidden; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-scroller { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - line-height: var(--jse-line-height, calc(1em + 4px)); - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-gutters { - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-color-readonly, #b2b2b2); - border-right: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-activeLine, -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-activeLineGutter { - background: var(--jse-active-line-background-color, rgba(0, 0, 0, 0.06)); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-selectionBackground { - background: var(--jse-selection-background-color, #d3d3d3); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-searchMatch { - background-color: var(--jse-search-match-color, #ffe665); - outline: var(--jse-search-match-outline, none); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-searchMatch.cm-searchMatch-selected { - background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); - outline: var(--jse-search-match-outline, 2px solid #e0be00); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-selectionMatch { - background-color: var(--jse-search-match-background-color, rgba(153, 255, 119, 0.5019607843)); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-foldPlaceholder { - background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); - border: none; - padding: 0 var(--jse-padding, 10px); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-tooltip { - font-size: var(--jse-font-size, 16px); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - color: var(--jse-tooltip-color, var(--jse-text-color, #4d4d4d)); - background: var(--jse-tooltip-background, var(--jse-modal-background, #f5f5f5)); - border: var(--jse-tooltip-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-diagnosticAction { - background: var(--jse-tooltip-action-button-color, var(--jse-text-color-inverse, #fff)); - background: var(--jse-tooltip-action-button-background, #4d4d4d); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-panels { - border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search { - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search input { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size-text-mode-search, 80%); - color: var(--jse-input-color, var(--jse-text-color, #4d4d4d)); - border: var(--jse-input-border, 1px solid #d8dbdf); - background: var(--jse-input-background, var(--jse-background-color, #fff)); - margin-right: 2px; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size-text-mode-search, 80%); - color: var(--jse-panel-button-color, inherit); - background: var(--jse-panel-button-background, transparent); - border: none; - cursor: pointer; - text-transform: capitalize; - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); - margin: 0; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button:hover { - color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); - background: var(--jse-panel-button-background-highlight, #e0e0e0); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search label { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size-text-mode-search, 80%); - padding-left: var(--jse-padding, 10px); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search label input { - margin-right: 2px; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button[name='close'] { - width: 32px; - height: 32px; - font-size: 24px; - line-height: 24px; - padding: 0; - right: 0; - top: -4px; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-cursor-primary { - border-color: var(--jse-text-color, #4d4d4d); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .jse-loading-space:where(.svelte-k2b9e6) { - flex: 1; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .jse-loading:where(.svelte-k2b9e6) { - flex: 2; - text-align: center; - color: var(--jse-panel-color-readonly, #b2b2b2); - box-sizing: border-box; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents.jse-preview:where(.svelte-k2b9e6) { - flex: 1; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-panel-color-readonly, #b2b2b2); - overflow: auto; - white-space: pre-wrap; - word-break: break-word; - padding: 2px; -} -.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) { - display: flex; - align-items: center; - gap: 8px; - padding: 8px 12px; - background: var(--jse-background-color, #fff); - border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); - border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-tip:where(.svelte-k2b9e6) { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-panel-color-readonly, #b2b2b2); -} -.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-progress-track:where(.svelte-k2b9e6) { - flex: 1; - height: 6px; - background: var(--jse-panel-background, #ebebeb); - border-radius: 3px; - overflow: hidden; - border: 1px solid var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-progress-fill:where(.svelte-k2b9e6) { - height: 100%; - background: linear-gradient(90deg, var(--jse-theme-color, #3883fa), var(--jse-theme-color-highlight, #5f9dff)); - border-radius: 2px; - transition: width 0.1s ease; - min-width: 2px; -} -.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-cancel-button:where(.svelte-k2b9e6) { - padding: 4px 12px; - font-size: 12px; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - background: var(--jse-theme-color, #3883fa); - color: #fff; - border-radius: 3px; - cursor: pointer; - transition: background-color 0.2s ease; - flex-shrink: 0; - border: 1px solid var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-cancel-button:where(.svelte-k2b9e6):hover { - background: var(--jse-theme-color-highlight, #5f9dff); - color: #fff; -}`);var iQA=TA('
      Collapsing
      '),nQA=TA('
      ',1),oQA=TA(" ",1),aQA=TA("
      ",1),rQA=TA('
      loading...
      '),sQA=TA("
      ");function lQA(i,e){Jt(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=K(e,"readOnly",9),o=K(e,"mainMenuBar",9),a=K(e,"statusBar",9),r=K(e,"askToFormat",9),s=K(e,"externalContent",9),l=K(e,"externalSelection",9),g=K(e,"history",9),C=K(e,"indentation",9),d=K(e,"tabSize",9),B=K(e,"escapeUnicodeCharacters",9),u=K(e,"parser",9),E=K(e,"validator",9),f=K(e,"validationParser",9),m=K(e,"onChange",9),v=K(e,"onChangeMode",9),S=K(e,"onSelect",9),k=K(e,"onUndo",9),M=K(e,"onRedo",9),x=K(e,"onError",9),F=K(e,"onFocus",9),z=K(e,"onBlur",9),j=K(e,"onRenderMenu",9),X=K(e,"onSortModal",9),eA=K(e,"onTransformModal",9),Z=dr("jsoneditor:TextMode"),CA={key:"Mod-i",run:me,shift:GA,preventDefault:!0},wA=typeof window>"u";Z("isSSR:",wA);var BA,QA=cA(void 0,!0),RA=cA(void 0,!0),dA=cA(void 0,!0),IA=cA(!1,!0),xA=cA(r(),!0),qA=cA([],!0),ue=cA(!1,!0),HA=cA(0,!0),bA=cA(0,!0),PA=null,it=new g0,Xe=new g0,YA=new g0,hA=new g0,Ae=new g0,pA=s(),te=cA(R_(pA,C(),u()),!0),NA=sl.define(),Ge=null;function JA(){if(!Ge||Ge.length===0)return!1;var SA=Ge[0].startState,ee=Ge[Ge.length-1].state,be=Ge.map(LA=>LA.changes).reduce((LA,Ce)=>LA.compose(Ce)),EA={type:"text",undo:{changes:be.invert(SA.doc).toJSON(),selection:pa(SA.selection)},redo:{changes:be.toJSON(),selection:pa(ee.selection)}};return Z("add history item",EA),g().add(EA),Ge=null,!0}var yA=cA(B(),!0);os(Xt(function*(){if(!wA)try{BA=(function(SA){var{target:ee,initialText:be,readOnly:EA,indentation:LA}=SA;Z("Create CodeMirror editor",{readOnly:EA,indentation:LA});var Ce=(function(gt,dt){return C_(gt)?gt.ranges.every(Ut=>Ut.anchor{N(dA,gt.state),gt.docChanged&&(gt.transactions.some(dt=>!!dt.annotation(NA))||(Ge=[...Ge??[],gt]),ga()),gt.selectionSet&&ca()}),SP(),LP({top:!0}),ui.lineWrapping,Xe.of(ir.readOnly.of(EA)),hA.of(ir.tabSize.of(d())),YA.of(Vo(LA)),Ae.of(ui.theme({},{dark:Qn()}))]});return BA=new ui({state:Te,parent:ee}),Ce&&BA.dispatch(BA.state.update({selection:Ce.main,scrollIntoView:!0})),BA})({target:c(QA),initialText:Uo(c(te),c(IA))?"":c(A).escapeValue(c(te)),readOnly:n(),indentation:C()})}catch(SA){console.error(SA)}})),Dg(()=>{Ko(),BA&&(Z("Destroy CodeMirror editor"),BA.destroy()),Ii()});var Pt=_1(),Dt=_1();function fe(){BA&&(Z("focus"),BA.focus())}function Zt(SA,ee){if(BA)try{(function(){var be=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],EA=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],LA=BA.state,Ce=LA.doc.length,Te=jS(LA,Ce,1/0);if(Te){var gt=[];if(be.length===0)gt=vt(Te,LA,void 0,EA);else{var{from:dt}=i_(c(A).escapeValue(c(te)),be);dt!==void 0&&dt!==0&&(gt=vt(Te,LA,dt,EA))}gt.length>0&&(function(Ut){Ke.apply(this,arguments)})(gt)}})(SA,ee)}catch(be){x()(be)}}function Pe(){return WS.of((SA,ee,be)=>{var EA=jS(SA,SA.doc.length,1/0);if(!EA||EA.lengthbe)){if(LA&&Te.from=ee&&dt.to>be&&(LA=dt)}}}return LA})}function qe(SA){var ee=SA.lastChild;return ee&&ee.to==SA.to&&ee.type.isError}function vt(SA,ee,be){var EA=!(arguments.length>3&&arguments[3]!==void 0)||arguments[3],LA=[],Ce=new Set;return SA.iterate({enter(Te){if(be===void 0||Te.from>=be){var gt=Ih(ee,Te.from,Te.to);if(gt){var dt="".concat(gt.from,"-").concat(gt.to);if(!Ce.has(dt))if(EA)LA.push({from:gt.from,to:gt.to}),Ce.add(dt);else{var Ut=LA.some(io=>io.from<=gt.from&&io.to>=gt.to);Ut||(LA.push({from:gt.from,to:gt.to}),Ce.add(dt))}}}}}),LA}function Ke(){return Ke=Xt(function*(SA){if(SA.length!==0){var ee=SA.length>5e3;ee&&(N(ue,!0),N(HA,0),N(bA,SA.length),PA=new AbortController);var be=EA=>new Promise(LA=>{var Ce;ee&&(Ce=PA)!==null&&Ce!==void 0&&Ce.signal.aborted?LA():requestAnimationFrame(()=>{var Te=Math.min(EA+100,SA.length),gt=SA.slice(EA,Te);BA.dispatch({effects:gt.map(dt=>Eh.of({from:dt.from,to:dt.to}))}),ee&&N(HA,Te),Te1&&arguments[1]!==void 0?arguments[1]:K_;if(BA)try{if(SA&&SA.length>0){var{from:be}=i_(c(A).escapeValue(c(te)),SA);be!==void 0&&(BA.dispatch({selection:{anchor:be,head:be}}),ZS(BA))}else XS(BA);ee?.(SA)}catch(EA){x()(EA)}}function $(){V([],()=>!0)}function iA(){Zt([],!0)}var oA=!1;function UA(SA){return he(SA,!1)}function he(SA,ee){Z("handlePatch",SA,ee);var be=u().parse(c(te)),EA=ol(be,SA),LA=E6(be,SA);return bi({text:u().stringify(EA,null,C())},ee,!1),{json:EA,previousJson:be,undo:LA,redo:SA}}function me(){if(Z("format"),n())return!1;try{var SA=u().parse(c(te));return bi({text:u().stringify(SA,null,C())},!0,!1),N(xA,r()),!0}catch(ee){x()(ee)}return!1}function GA(){if(Z("compact"),n())return!1;try{var SA=u().parse(c(te));return bi({text:u().stringify(SA)},!0,!1),N(xA,!1),!0}catch(ee){x()(ee)}return!1}function OA(){if(Z("repair"),!n())try{bi({text:gg(c(te))},!0,!1),N(de,l_),N(xi,void 0)}catch(SA){x()(SA)}}function wt(){var SA;if(!n())try{var ee=u().parse(c(te));oA=!0,X()({id:Pt,json:ee,rootPath:[],onSort:(SA=Xt(function*(be){var{operations:EA}=be;Z("onSort",EA),he(EA,!0)}),function(be){return SA.apply(this,arguments)}),onClose:()=>{oA=!1,fe()}})}catch(be){x()(be)}}function rt(SA){var{id:ee,rootPath:be,onTransform:EA,onClose:LA}=SA;try{var Ce=u().parse(c(te));oA=!0,eA()({id:ee||Dt,json:Ce,rootPath:be||[],onTransform:Te=>{EA?EA({operations:Te,json:Ce,transformedJson:ol(Ce,Te)}):(Z("onTransform",Te),he(Te,!0))},onClose:()=>{oA=!1,fe(),LA&&LA()}})}catch(Te){x()(Te)}}function je(){n()||rt({rootPath:[]})}function ze(){BA&&(c(QA)&&c(QA).querySelector(".cm-search")?ow(BA):nw(BA))}function pi(){if(n())return!1;Ko();var SA=g().undo();return Z("undo",SA),Jj(SA)?(BA.dispatch({annotations:NA.of("undo"),changes:Zr.fromJSON(SA.undo.changes),selection:Be.fromJSON(SA.undo.selection),scrollIntoView:!0}),!0):(k()(SA),!1)}function mn(){if(n())return!1;Ko();var SA=g().redo();return Z("redo",SA),Jj(SA)?(BA.dispatch({annotations:NA.of("redo"),changes:Zr.fromJSON(SA.redo.changes),selection:Be.fromJSON(SA.redo.selection),scrollIntoView:!0}),!0):(M()(SA),!1)}function Sn(){N(IA,!0),bi(s(),!0,!0)}function He(){v()(xa.tree)}function En(){ia()}function Gi(SA){Z("select validation error",SA);var{from:ee,to:be}=jt(SA);ee!==void 0&&be!==void 0&&(Pi(ee,be),fe())}function Pi(SA,ee){Z("setSelection",{anchor:SA,head:ee}),BA&&BA.dispatch(BA.state.update({selection:{anchor:SA,head:ee},scrollIntoView:!0}))}function gn(SA,ee){if(ee.state.selection.ranges.length===1){var be=ee.state.selection.ranges[0],EA=c(te).slice(be.from,be.to);if(EA==="{"||EA==="["){var LA=Ax.default.parse(c(te)),Ce=Object.keys(LA.pointers).find(gt=>{var dt;return((dt=LA.pointers[gt].value)===null||dt===void 0?void 0:dt.pos)===be.from}),Te=LA.pointers[Ce];Ce&&Te&&Te.value&&Te.valueEnd&&(Z("pointer found, selecting inner contents of path:",Ce,Te),Pi(Te.value.pos+1,Te.valueEnd.pos-1))}}}function Rt(){return BP(wn,{delay:300})}function Qn(){return!!c(QA)&&getComputedStyle(c(QA)).getPropertyValue("--jse-theme").includes("dark")}function jt(SA){var{path:ee,message:be,severity:EA}=SA,{line:LA,column:Ce,from:Te,to:gt}=i_(c(A).escapeValue(c(te)),ee);return{path:ee,line:LA,column:Ce,from:Te,to:gt,message:be,severity:EA,actions:[]}}function J(SA,ee){var{line:be,column:EA,position:LA,message:Ce}=SA;return{path:[],line:be,column:EA,from:LA,to:LA,severity:Ec.error,message:Ce,actions:ee&&!n()?[{name:"Auto repair",apply:()=>OA()}]:void 0}}function ut(SA){return{from:SA.from||0,to:SA.to||0,message:SA.message||"",actions:SA.actions,severity:SA.severity}}function bi(SA,ee,be){var EA=R_(SA,C(),u()),LA=!Ui(SA,pA),Ce=pA;Z("setCodeMirrorContent",{isChanged:LA,emitChange:ee,forceUpdate:be}),BA&&(LA||be)&&(pA=SA,N(te,EA),Uo(c(te),c(IA))||BA.dispatch({changes:{from:0,to:BA.state.doc.length,insert:c(A).escapeValue(c(te))}}),JA(),LA&&ee&&va(pA,Ce))}function kn(SA){return C_(SA)?Be.fromJSON(SA):void 0}function _n(){return Co.apply(this,arguments)}function Co(){return Co=Xt(function*(){Z("refresh"),yield(function(){return So.apply(this,arguments)})()}),Co.apply(this,arguments)}function ia(){if(BA){var SA=BA?c(A).unescapeValue(BA.state.doc.toString()):"",ee=SA!==c(te);if(Z("onChangeCodeMirrorValue",{isChanged:ee}),ee){var be=pA;N(te,SA),pA={text:c(te)},JA(),va(pA,be),jo(),ca()}}}function So(){return(So=Xt(function*(){if(jo(),BA){var SA=Qn();return Z("updateTheme",{dark:SA}),BA.dispatch({effects:[Ae.reconfigure(ui.theme({},{dark:SA}))]}),new Promise(ee=>setTimeout(ee))}return Promise.resolve()})).apply(this,arguments)}function Vo(SA){var ee=Rd.of(typeof SA=="number"?" ".repeat(SA):SA);return SA===" "?[ee]:[ee,tQA]}vx({onMount:os,onDestroy:Dg,getWindow:()=>Ip(c(RA)),hasFocus:()=>oA&&document.hasFocus()||cx(c(RA)),onFocus:F(),onBlur:()=>{Ko(),z()()}});var ga=XE(ia,300);function Ko(){ga.flush()}function va(SA,ee){m()&&m()(SA,ee,{contentErrors:xn(),patchResult:void 0})}function ca(){S()(pa(c(dA).selection))}function pa(SA){return Fe({type:fo.text},SA.toJSON())}function Uo(SA,ee){return!!SA&&SA.length>r_&&!ee}var de=cA(l_,!0),xi=cA(void 0,!0);function wn(){if(Uo(c(te),c(IA)))return[];var SA=xn();if(Oj(SA)){var{parseError:ee,isRepairable:be}=SA;return[ut(J(ee,be))]}return SIA(SA)?SA.validationErrors.map(jt).map(ut):[]}function xn(){Z("validate:start"),Ko();var SA=na(c(A).escapeValue(c(te)),E(),u(),f());return Oj(SA)?(N(de,SA.isRepairable?Lj:"invalid"),N(xi,SA.parseError),N(qA,[])):(N(de,l_),N(xi,void 0),N(qA,SA?.validationErrors||[])),Z("validate:end"),SA}var na=YB(ZBA);function Ra(){c(xi)&&(function(SA){Z("select parse error",SA);var ee=J(SA,!1);Pi(ee.from!=null?ee.from:0,ee.to!=null?ee.to:0),fe()})(c(xi))}var Oi={icon:AJ,text:"Show me",title:"Move to the parse error location",onClick:Ra};KA(()=>Y(B()),()=>{N(A,lx({escapeControlCharacters:!1,escapeUnicodeCharacters:B()}))}),KA(()=>Y(s()),()=>{bi(s(),!1,!1)}),KA(()=>Y(l()),()=>{(function(SA){if(C_(SA)){var ee=kn(SA);!BA||!ee||c(dA)&&c(dA).selection.eq(ee)||(Z("applyExternalSelection",ee),BA.dispatch({selection:ee}))}})(l())}),KA(()=>Y(E()),()=>{(function(SA){Z("updateLinter",SA),BA&&BA.dispatch({effects:it.reconfigure(Rt())})})(E())}),KA(()=>Y(C()),()=>{(function(SA){BA&&(Z("updateIndentation",SA),BA.dispatch({effects:YA.reconfigure(Vo(SA))}))})(C())}),KA(()=>Y(d()),()=>{(function(SA){BA&&(Z("updateTabSize",SA),BA.dispatch({effects:hA.reconfigure(ir.tabSize.of(SA))}))})(d())}),KA(()=>Y(n()),()=>{(function(SA){BA&&(Z("updateReadOnly",SA),BA.dispatch({effects:[Xe.reconfigure(ir.readOnly.of(SA))]}))})(n())}),KA(()=>(c(yA),Y(B())),()=>{c(yA)!==B()&&(N(yA,B()),Z("forceUpdateText",{escapeUnicodeCharacters:B()}),BA&&BA.dispatch({changes:{from:0,to:BA.state.doc.length,insert:c(A).escapeValue(c(te))}}))}),KA(()=>(c(de),Y(n()),oC),()=>{N(t,c(de)!==Lj||n()?[Oi]:[{icon:oC,text:"Auto repair",title:"Automatically repair JSON",onClick:OA},Oi])}),Vn();var ko={focus:fe,collapse:Zt,expand:V,patch:UA,handlePatch:he,openTransformModal:rt,refresh:_n,flush:Ko,validate:xn};di(!0);var ar,To=sQA(),ja=gA(To),to=SA=>{var ee=lt(()=>(c(te),uA(()=>c(te).length===0))),be=lt(()=>!c(ee)),EA=lt(()=>!c(ee)),LA=lt(()=>!c(ee)),Ce=lt(()=>!c(ee)),Te=lt(()=>!c(ee)),gt=lt(()=>!c(ee));(function(dt,Ut){Jt(Ut,!1);var io=cA(void 0,!0),Zi=K(Ut,"readOnly",9,!1),nn=K(Ut,"onExpandAll",9),ai=K(Ut,"onCollapseAll",9),Xi=K(Ut,"onFormat",9),Na=K(Ut,"onCompact",9),Vt=K(Ut,"onSort",9),It=K(Ut,"onTransform",9),$i=K(Ut,"onToggleSearch",9),cn=K(Ut,"onUndo",9),Io=K(Ut,"onRedo",9),Rn=K(Ut,"canExpandAll",9),Tt=K(Ut,"canCollapseAll",9),fa=K(Ut,"canUndo",9),oa=K(Ut,"canRedo",9),y=K(Ut,"canFormat",9),b=K(Ut,"canCompact",9),R=K(Ut,"canSort",9),W=K(Ut,"canTransform",9),_=K(Ut,"onRenderMenu",9),q=cA(void 0,!0),tA=cA(void 0,!0),rA={type:"button",icon:Uu,title:"Search (Ctrl+F)",className:"jse-search",onClick:$i()},DA=cA(void 0,!0);KA(()=>(Y(nn()),Y(Rn())),()=>{N(q,{type:"button",icon:pW,title:"Expand all",className:"jse-expand-all",onClick:nn(),disabled:!Rn()})}),KA(()=>(Y(ai()),Y(Tt())),()=>{N(tA,{type:"button",icon:fW,title:"Collapse all",className:"jse-collapse-all",onClick:ai(),disabled:!Tt()})}),KA(()=>(Y(Zi()),c(q),c(tA),Y(Xi()),Y(y()),Y(Na()),Y(b()),Y(Vt()),Y(R()),Y(It()),Y(W()),Y(cn()),Y(fa()),Y(Io()),Y(oa())),()=>{N(DA,Zi()?[c(q),c(tA),{type:"separator"},rA,{type:"space"}]:[c(q),c(tA),{type:"separator"},{type:"button",icon:EV,title:"Format JSON: add proper indentation and new lines (Ctrl+I)",className:"jse-format",onClick:Xi(),disabled:Zi()||!y()},{type:"button",icon:$hA,title:"Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)",className:"jse-compact",onClick:Na(),disabled:Zi()||!b()},{type:"separator"},{type:"button",icon:Ju,title:"Sort",className:"jse-sort",onClick:Vt(),disabled:Zi()||!R()},{type:"button",icon:Ku,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:It(),disabled:Zi()||!W()},rA,{type:"separator"},{type:"button",icon:D6,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:cn(),disabled:!fa()},{type:"button",icon:y6,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Io(),disabled:!oa()},{type:"space"}])}),KA(()=>(Y(_()),c(DA)),()=>{N(io,_()(c(DA))||c(DA))}),Vn(),di(!0),p5(dt,{get items(){return c(io)}}),Yt()})(SA,{get readOnly(){return n()},onExpandAll:$,onCollapseAll:iA,onFormat:me,onCompact:GA,onSort:wt,onTransform:je,onToggleSearch:ze,onUndo:pi,onRedo:mn,get canExpandAll(){return c(be)},get canCollapseAll(){return c(EA)},get canFormat(){return c(LA)},get canCompact(){return c(Ce)},get canSort(){return c(Te)},get canTransform(){return c(gt)},get canUndo(){return Y(g()),uA(()=>g().canUndo)},get canRedo(){return Y(g()),uA(()=>g().canRedo)},get onRenderMenu(){return j()}})};zA(ja,SA=>{o()&&SA(to)});var Wi=kA(ja,2),ei=SA=>{var ee=iQA(),be=kA(gA(ee),2),EA=gA(be),LA=kA(be,2);Le(()=>wg(EA,"width: ".concat(c(bA)>0?c(HA)/c(bA)*100:0,"%"))),De("click",LA,Ii),sA(SA,ee)};zA(Wi,SA=>{c(ue)&&SA(ei)});var qn=kA(Wi,2),_o=SA=>{var ee,be=lt(()=>(c(te),c(IA),uA(()=>Uo(c(te),c(IA))))),EA=aQA(),LA=at(EA);ta(LA,Ut=>N(QA,Ut),()=>c(QA));var Ce=kA(LA,2),Te=Ut=>{var io=nQA(),Zi=at(io),nn=lt(()=>(Y(Uw),Y(r_),c(te),uA(()=>"The JSON document is larger than ".concat(Uw(r_),", ")+"and may crash your browser when loading it in text mode. Actual size: ".concat(Uw(c(te).length),"."))));Hl(Zi,{get icon(){return w2},type:"error",get message(){return c(nn)},actions:[{text:"Open anyway",title:"Open the document in text mode. This may freeze or crash your browser.",onClick:Sn},{text:"Open in tree mode",title:"Open the document in tree mode. Tree mode can handle large documents.",onClick:He},{text:"Cancel",title:"Cancel opening this large document.",onClick:En}],onClose:fe});var ai=gA(kA(Zi,2));Le(Xi=>Ht(ai,Xi),[()=>(Y(mC),c(te),Y(jw),uA(()=>mC(c(te)||"",jw)))]),sA(Ut,io)};zA(Ce,Ut=>{c(be)&&Ut(Te)});var gt=kA(Ce,2),dt=Ut=>{var io=oQA(),Zi=at(io),nn=It=>{(function($i,cn){Jt(cn,!1);var Io=K(cn,"editorState",8),Rn=cA(),Tt=cA(),fa=cA(),oa=cA(),y=cA();KA(()=>Y(Io()),()=>{var DA;N(Rn,(DA=Io())===null||DA===void 0||(DA=DA.selection)===null||DA===void 0||(DA=DA.main)===null||DA===void 0?void 0:DA.head)}),KA(()=>(c(Rn),Y(Io())),()=>{var DA;N(Tt,c(Rn)!==void 0?(DA=Io())===null||DA===void 0||(DA=DA.doc)===null||DA===void 0?void 0:DA.lineAt(c(Rn)):void 0)}),KA(()=>c(Tt),()=>{N(fa,c(Tt)!==void 0?c(Tt).number:void 0)}),KA(()=>(c(Tt),c(Rn)),()=>{N(oa,c(Tt)!==void 0&&c(Rn)!==void 0?c(Rn)-c(Tt).from+1:void 0)}),KA(()=>Y(Io()),()=>{var DA;N(y,(DA=Io())===null||DA===void 0||(DA=DA.selection)===null||DA===void 0||(DA=DA.ranges)===null||DA===void 0?void 0:DA.reduce((ae,ge)=>ae+ge.to-ge.from,0))}),Vn(),di();var b=$EA(),R=gA(b),W=DA=>{var ae=WEA(),ge=gA(ae);Le(()=>{var pe;return Ht(ge,"Line: ".concat((pe=c(fa))!==null&&pe!==void 0?pe:""))}),sA(DA,ae)};zA(R,DA=>{c(fa)!==void 0&&DA(W)});var _=kA(R,2),q=DA=>{var ae=ZEA(),ge=gA(ae);Le(()=>{var pe;return Ht(ge,"Column: ".concat((pe=c(oa))!==null&&pe!==void 0?pe:""))}),sA(DA,ae)};zA(_,DA=>{c(oa)!==void 0&&DA(q)});var tA=kA(_,2),rA=DA=>{var ae=XEA(),ge=gA(ae);Le(()=>{var pe;return Ht(ge,"Selection: ".concat((pe=c(y))!==null&&pe!==void 0?pe:""," characters"))}),sA(DA,ae)};zA(tA,DA=>{c(y)!==void 0&&c(y)>0&&DA(rA)}),sA($i,b),Yt()})(It,{get editorState(){return c(dA)}})};zA(Zi,It=>{a()&&It(nn)});var ai=kA(Zi,2),Xi=It=>{Hl(It,{type:"error",get icon(){return w2},get message(){return c(xi),uA(()=>c(xi).message)},get actions(){return c(t)},onClick:Ra,onClose:fe})};zA(ai,It=>{c(xi)&&It(Xi)});var Na=kA(ai,2),Vt=It=>{var $i=lt(()=>[{icon:EV,text:"Format",title:"Format JSON: add proper indentation and new lines (Ctrl+I)",onClick:me},{icon:Ou,text:"No thanks",title:"Close this message",onClick:()=>N(xA,!1)}]);Hl(It,{type:"success",message:"Do you want to format the JSON?",get actions(){return c($i)},onClose:fe})};zA(Na,It=>{c(xi),c(xA),Y(Nj),c(te),uA(()=>!c(xi)&&c(xA)&&Nj(c(te)))&&It(Vt)}),bx(kA(Na,2),{get validationErrors(){return c(qA)},selectError:Gi}),sA(Ut,io)};zA(gt,Ut=>{c(be)||Ut(dt)}),Le(()=>ee=Ci(LA,1,"jse-contents svelte-k2b9e6",null,ee,{"jse-hidden":c(be)})),sA(SA,EA)},qo=SA=>{sA(SA,rQA())};return zA(qn,SA=>{wA?SA(qo,!1):SA(_o)}),ta(To,SA=>N(RA,SA),()=>c(RA)),Le(()=>ar=Ci(To,1,"jse-text-mode svelte-k2b9e6",null,ar,{"no-main-menu":!o()})),sA(i,To),Ai(e,"focus",fe),Ai(e,"collapse",Zt),Ai(e,"expand",V),Ai(e,"patch",UA),Ai(e,"handlePatch",he),Ai(e,"openTransformModal",rt),Ai(e,"refresh",_n),Ai(e,"flush",Ko),Ai(e,"validate",xn),Yt(ko)}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-inline-value.svelte-1jv89ui { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - line-height: var(--jse-line-height, calc(1em + 4px)); - border: none; - padding: 0 calc(0.5 * var(--jse-padding, 10px)); - background: transparent; - color: inherit; - cursor: inherit; -} -.jse-inline-value.jse-highlight.svelte-1jv89ui { - background-color: var(--jse-search-match-color, #ffe665); - outline: var(--jse-search-match-outline, none); -} -.jse-inline-value.jse-highlight.jse-active.svelte-1jv89ui { - background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); - outline: var(--jse-search-match-outline, 2px solid #e0be00); -}`);var gQA=TA('');oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-column-header.svelte-5pxwfq { - background: none; - border: none; - font-family: inherit; - font-size: inherit; - color: inherit; - display: flex; - gap: var(--jse-padding, 10px); - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); - width: 100%; -} -.jse-column-header.svelte-5pxwfq:hover { - background: var(--jse-table-header-background-highlight, #e8e8e8); -} -.jse-column-header.svelte-5pxwfq:not(.jse-column-header.jse-readonly) { - cursor: pointer; -} -.jse-column-header.svelte-5pxwfq span.jse-column-sort-icon:where(.svelte-5pxwfq) { - height: 1em; -}`);var cQA=TA(''),CQA=TA('');oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-table-mode-welcome.svelte-1b9gnk8 { - flex: 1; - display: flex; - flex-direction: column; - overflow: auto; - align-items: center; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode-welcome.svelte-1b9gnk8:last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-space.jse-before:where(.svelte-1b9gnk8) { - flex: 1; -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) { - display: flex; - flex-direction: column; - gap: var(--jse-padding, 10px); - max-width: 400px; - margin: 2em var(--jse-padding, 10px); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-arrays-info:where(.svelte-1b9gnk8) { - color: var(--jse-panel-color-readonly, #b2b2b2); -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) { - display: flex; - align-items: center; - gap: var(--jse-padding, 10px); -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) .jse-nested-property-path:where(.svelte-1b9gnk8) { - flex: 1; -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) .jse-nested-property-path:where(.svelte-1b9gnk8) .jse-nested-property-count:where(.svelte-1b9gnk8) { - opacity: 0.5; - white-space: nowrap; -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8) { - text-align: left; - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-space.jse-after:where(.svelte-1b9gnk8) { - flex: 2; -}`);var dQA=TA(`An empty document cannot be opened in table mode. You can go to tree mode instead, or paste - a JSON Array using Ctrl+V.`,1),IQA=TA(''),BQA=TA('
      '),hQA=TA('
      ');function EQA(i,e){Jt(e,!0);var A=Bl(()=>e.json?(function(E){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:2,m=[];return(function v(S,k){Ea(S)&&k.length{v(S[M],k.concat(M))}),sa(S)&&m.push(k)})(E,[]),m})(e.json).slice(0,99).filter(E=>E.length>0):[]),t=Bl(()=>!An(c(A))),n=Bl(()=>e.json===void 0&&(e.text===""||e.text===void 0)),o=Bl(()=>c(t)?"Object with nested arrays":c(n)?"An empty document":Ea(e.json)?"An object":sa(e.json)?"An empty array":"A ".concat(sx(e.json,e.parser))),a=hQA();a.__click=()=>e.onClick();var r=kA(gA(a),2),s=gA(r),l=gA(s),g=kA(s,2),C=gA(g),d=E=>{sA(E,mr(`An object cannot be opened in table mode. You can open a nested array instead, or open the - document in tree mode.`))},B=E=>{var f=zi(),m=at(f),v=k=>{sA(k,dQA())},S=k=>{var M=mr();Le(()=>{var x;return Ht(M,"".concat((x=c(o))!==null&&x!==void 0?x:""," cannot be opened in table mode. You can open the document in tree mode instead."))}),sA(k,M)};zA(m,k=>{c(n)&&!e.readOnly?k(v):k(S,!1)},!0),sA(E,f)};zA(C,E=>{c(t)?E(d):E(B,!1)});var u=kA(g,2);Da(u,17,()=>c(A),Ka,(E,f)=>{var m=Bl(()=>(function(X){return $e(e.json,X).length})(c(f))),v=BQA(),S=gA(v),k=gA(S),M=gA(kA(k)),x=kA(S,2);x.__click=()=>e.openJSONEditorModal(c(f));var F=gA(x),z=kA(x,2),j=X=>{var eA=IQA();eA.__click=()=>e.extractPath(c(f)),sA(X,eA)};zA(z,X=>{e.readOnly||X(j)}),Le(X=>{var eA;Ht(k,'"'.concat(X??"",'" ')),Ht(M,"(".concat((eA=c(m))!==null&&eA!==void 0?eA:""," ").concat(c(m)!==1?"items":"item",")")),Ht(F,e.readOnly?"View":"Edit")},[()=>El(c(f))]),sA(E,v)}),kA(u,2).__click=()=>e.onChangeMode(xa.tree),Le(()=>Ht(l,c(o))),sA(i,a),Yt()}cp(["click"]);oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-column-header.svelte-1wgrwv3 { - background: none; - border: none; - font-family: inherit; - font-size: inherit; - color: inherit; - display: flex; - gap: var(--jse-padding, 10px); - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); - width: 100%; -} -.jse-column-header.svelte-1wgrwv3:hover { - background: var(--jse-table-header-background-highlight, #e8e8e8); -} -.jse-column-header.svelte-1wgrwv3:not(.jse-column-header.jse-readonly) { - cursor: pointer; -}`);var QQA=TA('');oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-table-mode.svelte-1p86y3c { - flex: 1; - display: flex; - flex-direction: column; - position: relative; - background: var(--jse-background-color, #fff); - min-width: 0; - min-height: 0; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-text-color, #4d4d4d); - line-height: var(--jse-line-height, calc(1em + 4px)); -} -.jse-table-mode.no-main-menu.svelte-1p86y3c { - border-top: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode.svelte-1p86y3c .jse-search-box-container:where(.svelte-1p86y3c) { - position: relative; - height: 0; - top: calc(var(--jse-line-height, calc(1em + 4px)) + 2 * var(--jse-padding, 10px)); - margin-right: calc(var(--jse-padding, 10px) + 20px); - margin-left: var(--jse-padding, 10px); - text-align: right; - z-index: 3; -} -.jse-table-mode.svelte-1p86y3c .jse-hidden-input-label:where(.svelte-1p86y3c) { - position: fixed; - right: 0; - top: 0; - width: 0; - height: 0; -} -.jse-table-mode.svelte-1p86y3c .jse-hidden-input-label:where(.svelte-1p86y3c) .jse-hidden-input:where(.svelte-1p86y3c) { - width: 0; - height: 0; - padding: 0; - border: 0; - outline: none; -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) { - flex: 1; - align-items: flex-start; - flex-direction: column; - display: flex; - overflow: auto; - overflow-anchor: none; - scrollbar-gutter: stable; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c):last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) { - border-collapse: collapse; - border-spacing: 0; -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-start-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c), -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-end-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c) { - margin: 0; - padding: 0; -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-search-box-background:where(.svelte-1p86y3c) { - background: var(--jse-table-header-background, #f5f5f5); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-end-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c) { - padding-bottom: var(--jse-padding, 10px); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c):hover { - background-color: var(--jse-table-row-odd-background, rgba(0, 0, 0, 0.05)); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) { - padding: 0 var(--jse-padding, 10px) 0 0; - vertical-align: top; - white-space: nowrap; - height: var(--jse-line-height, calc(1em + 4px)); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c), .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-gutter:where(.svelte-1p86y3c) { - font-weight: normal; - text-align: left; - color: var(--jse-text-readonly, #8d8d8d); - background: var(--jse-table-header-background, #f5f5f5); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c) { - padding: 0; - position: sticky; - top: 0; -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c) .jse-table-root-error:where(.svelte-1p86y3c) { - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-gutter:where(.svelte-1p86y3c) { - padding: 0 var(--jse-padding, 10px) 0 calc(0.5 * var(--jse-padding, 10px)); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer:where(.svelte-1p86y3c) { - display: inline-block; - cursor: var(--jse-contents-cursor, pointer); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer:where(.svelte-1p86y3c):hover { - background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer.jse-selected-value:where(.svelte-1p86y3c) { - background: var(--jse-selection-background-color, #d3d3d3); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-context-menu-anchor:where(.svelte-1p86y3c) { - display: inline-flex; - position: relative; - vertical-align: top; -} -.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) { - align-items: unset; -} -.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) .jse-loading-space:where(.svelte-1p86y3c) { - flex: 1; -} -.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) .jse-loading:where(.svelte-1p86y3c) { - flex: 2; - text-align: center; - color: var(--jse-panel-color-readonly, #b2b2b2); - box-sizing: border-box; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -}`);var uQA=TA('
      '),pQA=TA(''),fQA=TA(''),mQA=TA(' '),wQA=TA('
      '),yQA=TA('
      '),DQA=TA(''),vQA=TA(''),bQA=TA('
      ',1),MQA=TA(" ",1),SQA=TA(' ',1),kQA=TA('
      loading...
      '),_QA=TA('
      ',1);function xQA(i,e){Jt(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=cA(void 0,!0),o=dr("jsoneditor:TableMode"),{openAbsolutePopup:a,closeAbsolutePopup:r}=s1("absolute-popup"),s=BW(),l=_1(),g=_1(),C=typeof window>"u";o("isSSR:",C);var d=K(e,"readOnly",9),B=K(e,"externalContent",9),u=K(e,"externalSelection",9),E=K(e,"history",9),f=K(e,"truncateTextSize",9),m=K(e,"mainMenuBar",9),v=K(e,"escapeControlCharacters",9),S=K(e,"escapeUnicodeCharacters",9),k=K(e,"flattenColumns",9),M=K(e,"parser",9),x=K(e,"parseMemoizeOne",9),F=K(e,"validator",9),z=K(e,"validationParser",9),j=K(e,"indentation",9),X=K(e,"onChange",9),eA=K(e,"onChangeMode",9),Z=K(e,"onSelect",9),CA=K(e,"onUndo",9),wA=K(e,"onRedo",9),BA=K(e,"onRenderValue",9),QA=K(e,"onRenderMenu",9),RA=K(e,"onRenderContextMenu",9),dA=K(e,"onFocus",9),IA=K(e,"onBlur",9),xA=K(e,"onSortModal",9),qA=K(e,"onTransformModal",9),ue=K(e,"onJSONEditorModal",9),HA=cA(void 0,!0),bA=cA(void 0,!0),PA=cA(void 0,!0),it=cA(void 0,!0),Xe=cA(void 0,!0);vx({onMount:os,onDestroy:Dg,getWindow:()=>Ip(c(bA)),hasFocus:()=>Ke&&document.hasFocus()||cx(c(bA)),onFocus:()=>{Ii=!0,dA()&&dA()()},onBlur:()=>{Ii=!1,IA()&&IA()()}});var YA,hA=cA(void 0,!0),Ae=cA(void 0,!0),pA=cA(void 0,!0),te=cA(void 0,!0),NA=cA(void 0,!0),Ge=cA(void 0,!0),JA=cA(!1,!0),yA=cA(!1,!0);function Pt(_){N(Ge,(YA=_)?tW(c(hA),YA.items):void 0)}function Dt(_){return fe.apply(this,arguments)}function fe(){return(fe=Xt(function*(_){N(OA,void 0),yield _n(_)})).apply(this,arguments)}function Zt(){N(JA,!1),N(yA,!1),J()}var Pe=cA(1e4,!0),qe=cA([],!0),vt=cA(void 0,!0),Ke=!1,Ii=!1,V=cA(!1,!0),$=cA({},!0),iA=cA(600,!0),oA=cA(0,!0),UA=18;function he(_){N(OA,_)}function me(_){c(OA)&&_!==void 0&&(Fr(_,qd(c(OA)))&&Fr(_,Qt(c(OA)))||(o("clearing selection: path does not exist anymore",c(OA)),N(OA,void 0)))}var GA=cA(c(hA)!==void 0?G_({json:c(hA)}):void 0,!0),OA=cA(Ap(u())?u():void 0,!0),wt=cA(void 0,!0),rt=cA(!1,!0);function je(_){if(!d()){o("onSortByHeader",_);var q=_.sortDirection===pg.desc?-1:1;Pi(mW(c(hA),[],_.path,q),(tA,rA)=>({state:rA,sortedColumn:_}))}}os(()=>{c(OA)&&ia(Qt(c(OA)))});var ze=cA(void 0,!0);function pi(_){if(_.json!==void 0||_.text!==void 0){var q=c(hA)!==void 0&&_.json!==void 0;E().add({type:"tree",undo:{patch:q?[{op:"replace",path:"",value:_.json}]:void 0,json:_.json,text:_.text,documentState:_.documentState,textIsRepaired:_.textIsRepaired,selection:p0(_.selection),sortedColumn:_.sortedColumn},redo:{patch:q?[{op:"replace",path:"",value:c(hA)}]:void 0,json:c(hA),text:c(Ae),documentState:c(GA),textIsRepaired:c(rt),selection:p0(c(OA)),sortedColumn:c(wt)}})}}var mn=cA([],!0),Sn=YB(hW);function He(_,q,tA,rA){Kh(()=>{var DA;try{DA=Sn(_,q,tA,rA)}catch(ae){DA=[{path:[],message:"Failed to validate: "+ae.message,severity:Ec.warning}]}Ui(DA,c(mn))||(o("validationErrors changed:",DA),N(mn,DA))},DA=>o("validationErrors updated in ".concat(DA," ms")))}function En(){return o("validate"),c(pA)?{parseError:c(pA),isRepairable:!1}:(He(c(hA),F(),M(),z()),An(c(mn))?void 0:{validationErrors:c(mn)})}function Gi(_,q){if(o("patch",_,q),c(hA)===void 0)throw new Error("Cannot apply patch: no JSON");var tA=c(hA),rA={json:void 0,text:c(Ae),documentState:c(GA),selection:p0(c(OA)),sortedColumn:c(wt),textIsRepaired:c(rt)},DA=eW(c(hA),_),ae=Yq(c(hA),c(GA),_),ge=mEA(c(wt),_,c(qe)),pe=typeof q=="function"?q(ae.json,ae.documentState,c(OA)):void 0;return N(hA,pe?.json!==void 0?pe.json:ae.json),N(GA,pe?.state!==void 0?pe.state:ae.documentState),N(OA,pe?.selection!==void 0?pe.selection:c(OA)),N(wt,pe?.sortedColumn!==void 0?pe.sortedColumn:ge),N(Ae,void 0),N(rt,!1),N(te,void 0),N(NA,void 0),N(pA,void 0),E().add({type:"tree",undo:Fe({patch:DA},rA),redo:{patch:_,json:void 0,text:void 0,documentState:c(GA),selection:p0(c(OA)),sortedColumn:c(wt),textIsRepaired:c(rt)}}),{json:c(hA),previousJson:tA,undo:DA,redo:_}}function Pi(_,q){o("handlePatch",_,q);var tA={json:c(hA),text:c(Ae)},rA=Gi(_,q);return gn(tA,rA),rA}function gn(_,q){if((_.json!==void 0||_?.text!==void 0)&&X()){if(c(Ae)!==void 0){var tA={text:c(Ae),json:void 0};X()(tA,_,{contentErrors:En(),patchResult:q})}else if(c(hA)!==void 0){var rA={text:void 0,json:c(hA)};X()(rA,_,{contentErrors:En(),patchResult:q})}}}function Rt(_){o("pasted json as text",_),N(te,_)}function Qn(_){o("pasted multiline text",{pastedText:_}),N(NA,_)}function jt(_){var q=parseInt(_[0],10),tA=[String(q+1),..._.slice(1)];return Fr(c(hA),tA)?en(tA):en(_)}function J(){o("focus"),c(it)&&(c(it).focus(),c(it).select())}function ut(_){N(oA,_.target.scrollTop)}function bi(){c(OA)||N(OA,(function(){if(sa(c(hA))&&!An(c(hA))&&!An(c(qe)))return en(["0",...c(qe)[0]])})())}function kn(){if(c(rt)&&c(hA)!==void 0){var _={json:c(hA),text:c(Ae)},q={json:c(hA),documentState:c(GA),selection:c(OA),sortedColumn:c(wt),text:c(Ae),textIsRepaired:c(rt)};N(Ae,void 0),N(rt,!1),me(c(hA)),pi(q),gn(_,void 0)}return{json:c(hA),text:c(Ae)}}function _n(_){var{scrollToWhenVisible:q=!0}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},tA=c(JA)?J4:0,rA=uV(_,c(qe),$,UA),DA=rA-c(oA)+tA+UA,ae=So(_);if(o("scrollTo",{path:_,top:rA,scrollTop:c(oA),elem:ae}),!c(PA))return Promise.resolve();var ge=c(PA).getBoundingClientRect();if(ae&&!q){var pe=ae.getBoundingClientRect();if(pe.bottom>ge.top&&pe.top{s(ae,{container:c(PA),offset:Ve,duration:300,callback:()=>{Co(_),Ue()}})}:Ue=>{s(DA,{container:c(PA),offset:Ve,duration:300,callback:()=>{jo(),Co(_),Ue()}})})}function Co(_){var q=So(_);if(q&&c(PA)){var tA=c(PA).getBoundingClientRect(),rA=q.getBoundingClientRect();if(rA.right>tA.right){var DA=rA.right-tA.right;Ol(PA,c(PA).scrollLeft+=DA)}if(rA.leftVe){var Ue=DA-Ve;Ol(PA,c(PA).scrollTop+=Ue)}if(rAv0(_.slice(1),ae)),DA=rA?_.slice(0,1).concat(rA):_;return(q=(tA=c(PA))===null||tA===void 0?void 0:tA.querySelector('td[data-path="'.concat(Gw(DA),'"]')))!==null&&q!==void 0?q:void 0}function Vo(_){var q,{anchor:tA,left:rA,top:DA,width:ae,height:ge,offsetTop:pe,offsetLeft:Ve,showTip:Ue}=_,Je=(function(fA){var{json:ZA,documentState:Ye,selection:Me,readOnly:Re,onEditValue:ct,onEditRow:ti,onToggleEnforceString:ji,onCut:Wn,onCopy:Cn,onPaste:xo,onRemove:ri,onDuplicateRow:Ca,onInsertBeforeRow:Bo,onInsertAfterRow:da,onRemoveRow:Nn}=fA,qt=ZA!==void 0,un=!!Me,si=ZA!==void 0&&Me?$e(ZA,Qt(Me)):void 0,_t=qt&&(bo(Me)||Cr(Me)||bn(Me)),fi=!Re&&qt&&Me!==void 0&&Ww(Me),ma=fi&&!ua(si),ho=!Re&&_t,Ia=Me!==void 0&&m0(ZA,Ye,Qt(Me));return[{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"label",text:"Table cell:"},{type:"dropdown-button",main:{type:"button",onClick:()=>ct(),icon:dd,text:"Edit",title:"Edit the value (Double-click on the value)",disabled:!fi},width:"11em",items:[{type:"button",icon:dd,text:"Edit",title:"Edit the value (Double-click on the value)",onClick:()=>ct(),disabled:!fi},{type:"button",icon:Ia?kM:RM,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>ji(),disabled:!ma}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Wn(!0),icon:Id,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!ho},width:"10em",items:[{type:"button",icon:Id,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>Wn(!0),disabled:Re||!_t},{type:"button",icon:Id,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>Wn(!1),disabled:Re||!_t}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Cn(!0),icon:aC,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!_t},width:"12em",items:[{type:"button",icon:aC,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>Cn(!1),disabled:!_t},{type:"button",icon:aC,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>Cn(!1),disabled:!_t}]},{type:"button",onClick:()=>xo(),icon:bM,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:Re||!un},{type:"button",onClick:()=>ri(),icon:m6,text:"Remove",title:"Remove selected contents (Delete)",disabled:Re||!_t}]},{type:"column",items:[{type:"label",text:"Table row:"},{type:"button",onClick:()=>ti(),icon:dd,text:"Edit row",title:"Edit the current row",disabled:Re||!un||!qt},{type:"button",onClick:()=>Ca(),icon:SM,text:"Duplicate row",title:"Duplicate the current row (Ctrl+D)",disabled:Re||!un||!qt},{type:"button",onClick:()=>Bo(),icon:Bd,text:"Insert before",title:"Insert a row before the current row",disabled:Re||!un||!qt},{type:"button",onClick:()=>da(),icon:Bd,text:"Insert after",title:"Insert a row after the current row",disabled:Re||!un||!qt},{type:"button",onClick:()=>Nn(),icon:m6,text:"Remove row",title:"Remove current row",disabled:Re||!un||!qt}]}]}]})({json:c(hA),documentState:c(GA),selection:c(OA),readOnly:d(),onEditValue:va,onEditRow:ca,onToggleEnforceString:pa,onCut:ar,onCopy:ja,onPaste:xi,onRemove:Wi,onDuplicateRow:qn,onInsertBeforeRow:_o,onInsertAfterRow:qo,onRemoveRow:SA}),Ei=(q=RA()(Je))!==null&&q!==void 0?q:Je;if(Ei!==!1){var no={left:rA,top:DA,offsetTop:pe,offsetLeft:Ve,width:ae,height:ge,anchor:tA,closeOnOuterClick:!0,onClose:()=>{Ke=!1,J()}};Ke=!0;var AA=a(xW,{tip:Ue?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:Ei,onRequestClose(){r(AA),J()}},no)}}function ga(_){if(!gr(c(OA)))if(_&&(_.stopPropagation(),_.preventDefault()),_&&_.type==="contextmenu"&&_.target!==c(it))Vo({left:_.clientX,top:_.clientY,width:yC,height:wC,showTip:!1});else{var q,tA=(q=c(PA))===null||q===void 0?void 0:q.querySelector(".jse-table-cell.jse-selected-value");if(tA)Vo({anchor:tA,offsetTop:2,width:yC,height:wC,showTip:!1});else{var rA,DA=(rA=c(PA))===null||rA===void 0?void 0:rA.getBoundingClientRect();DA&&Vo({top:DA.top+2,left:DA.left+2,width:yC,height:wC,showTip:!1})}}}function Ko(_){Vo({anchor:Kq(_.target,"BUTTON"),offsetTop:0,width:yC,height:wC,showTip:!0})}function va(){if(!d()&&c(OA)){var _=Qt(c(OA));ua($e(c(hA),_))?dt(_):N(OA,en(_))}}function ca(){!d()&&c(OA)&&dt(Qt(c(OA)).slice(0,1))}function pa(){if(!d()&&bn(c(OA))){var _=c(OA).path,q=xt(_),tA=$e(c(hA),_),rA=!m0(c(hA),c(GA),_),DA=rA?String(tA):cE(String(tA),M());o("handleToggleEnforceString",{enforceString:rA,value:tA,updatedValue:DA}),Pi([{op:"replace",path:q,value:DA}],(ae,ge)=>({state:I5(c(hA),ge,_,{type:"value",enforceString:rA})}))}}function Uo(){return de.apply(this,arguments)}function de(){return(de=Xt(function*(){if(o("apply pasted json",c(te)),c(te)){var{onPasteAsJson:_}=c(te);_(),setTimeout(J)}})).apply(this,arguments)}function xi(){return wn.apply(this,arguments)}function wn(){return(wn=Xt(function*(){try{EA(yield navigator.clipboard.readText())}catch(_){console.error(_),N(V,!0)}})).apply(this,arguments)}function xn(){return na.apply(this,arguments)}function na(){return(na=Xt(function*(){o("apply pasted multiline text",c(NA)),c(NA)&&(EA(JSON.stringify(c(NA))),setTimeout(J))})).apply(this,arguments)}function Ra(){o("clear pasted json"),N(te,void 0),J()}function Oi(){o("clear pasted multiline text"),N(NA,void 0),J()}function ko(){eA()(xa.text)}function ar(_){return To.apply(this,arguments)}function To(){return(To=Xt(function*(_){yield vW({json:c(hA),selection:c(OA),indentation:_?j():void 0,readOnly:d(),parser:M(),onPatch:Pi})})).apply(this,arguments)}function ja(){return to.apply(this,arguments)}function to(){return to=Xt(function*(){var _=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];c(hA)!==void 0&&(yield bW({json:c(hA),selection:c(OA),indentation:_?j():void 0,parser:M()}))}),to.apply(this,arguments)}function Wi(){SW({json:c(hA),text:c(Ae),selection:c(OA),keepSelection:!0,readOnly:d(),onChange:X(),onPatch:Pi})}function ei(_){d()||(o("extract",{path:_}),Pi(Xq(c(hA),en(_))))}function qn(){(function(_){var{json:q,selection:tA,columns:rA,readOnly:DA,onPatch:ae}=_;if(!DA&&q!==void 0&&tA&&Lh(tA)){var{rowIndex:ge,columnIndex:pe}=Qg(Qt(tA),rA);bs("duplicate row",{rowIndex:ge});var Ve=[String(ge)];ae(Zq(q,[Ve]),(Ue,Je)=>({state:Je,selection:en(Td({rowIndex:ge({state:no,selection:en(Td({rowIndex:Ve,columnIndex:pe},rA))}))}})({json:c(hA),selection:c(OA),columns:c(qe),readOnly:d(),onPatch:Pi})}function SA(){(function(_){var{json:q,selection:tA,columns:rA,readOnly:DA,onPatch:ae}=_;if(!DA&&q!==void 0&&tA&&Lh(tA)){var{rowIndex:ge,columnIndex:pe}=Qg(Qt(tA),rA);bs("remove row",{rowIndex:ge}),ae(Xw([[String(ge)]]),(Ve,Ue)=>{var Je=ge0?ge-1:void 0,Ei=Je!==void 0?en(Td({rowIndex:Je,columnIndex:pe},rA)):void 0;return bs("remove row new selection",{rowIndex:ge,newRowIndex:Je,newSelection:Ei}),{state:Ue,selection:Ei}})}})({json:c(hA),selection:c(OA),columns:c(qe),readOnly:d(),onPatch:Pi})}function ee(){return(ee=Xt(function*(_){yield kW({char:_,selectInside:!1,json:c(hA),selection:c(OA),readOnly:d(),parser:M(),onPatch:Pi,onReplaceJson:LA,onSelect:he})})).apply(this,arguments)}function be(_){var q;_.preventDefault(),EA((q=_.clipboardData)===null||q===void 0?void 0:q.getData("text/plain"))}function EA(_){_!==void 0&&MW({clipboardText:_,json:c(hA),selection:c(OA),readOnly:d(),parser:M(),onPatch:Pi,onChangeText:Ce,onPasteMultilineText:Qn,openRepairModal:Ut})}function LA(_,q){var tA={json:c(hA),text:c(Ae)},rA={json:c(hA),documentState:c(GA),selection:c(OA),sortedColumn:c(wt),text:c(Ae),textIsRepaired:c(rt)},DA=Tl(_,c(GA)),ae=typeof q=="function"?q(_,DA,c(OA)):void 0;N(hA,ae?.json!==void 0?ae.json:_),N(GA,ae?.state!==void 0?ae.state:DA),N(OA,ae?.selection!==void 0?ae.selection:c(OA)),N(wt,void 0),N(Ae,void 0),N(rt,!1),N(pA,void 0),me(c(hA)),pi(rA),gn(tA,void 0)}function Ce(_,q){o("handleChangeText");var tA={json:c(hA),text:c(Ae)},rA={json:c(hA),documentState:c(GA),selection:c(OA),sortedColumn:c(wt),text:c(Ae),textIsRepaired:c(rt)};try{N(hA,x()(_)),N(GA,Tl(c(hA),c(GA))),N(Ae,void 0),N(rt,!1),N(pA,void 0)}catch(ae){try{N(hA,x()(gg(_))),N(GA,Tl(c(hA),c(GA))),N(Ae,_),N(rt,!0),N(pA,void 0)}catch(ge){N(hA,void 0),N(GA,void 0),N(Ae,_),N(rt,!1),N(pA,c(Ae)!==""?Xh(c(Ae),ae.message||String(ae)):void 0)}}if(typeof q=="function"){var DA=q(c(hA),c(GA),c(OA));N(hA,DA?.json!==void 0?DA.json:c(hA)),N(GA,DA?.state!==void 0?DA.state:c(GA)),N(OA,DA?.selection!==void 0?DA.selection:c(OA))}me(c(hA)),pi(rA),gn(tA,void 0)}function Te(_){o("select validation error",_),N(OA,en(_.path)),_n(_.path)}function gt(_){if(c(hA)!==void 0){var{id:q,onTransform:tA,onClose:rA}=_,DA=_.rootPath||[];Ke=!0,qA()({id:q||g,json:c(hA),rootPath:DA||[],onTransform:ae=>{tA?tA({operations:ae,json:c(hA),transformedJson:ol(c(hA),ae)}):(o("onTransform",DA,ae),Pi(ae))},onClose:()=>{Ke=!1,setTimeout(J),rA&&rA()}})}}function dt(_){o("openJSONEditorModal",{path:_}),Ke=!0,ue()({content:{json:$e(c(hA),_)},path:_,onPatch:Pi,onClose:()=>{Ke=!1,setTimeout(J)}})}function Ut(_,q){N(Xe,{text:_,onParse:tA=>dp(tA,rA=>Cp(rA,M())),onRepair:Sq,onApply:q,onClose:J})}function io(){(function(_){d()||c(hA)===void 0||(Ke=!0,xA()({id:l,json:c(hA),rootPath:_,onSort:q=>{var{operations:tA,itemPath:rA,direction:DA}=q;o("onSort",tA,_,rA,DA),Pi(tA,(ae,ge)=>({state:ge,sortedColumn:{path:rA,sortDirection:DA===-1?pg.desc:pg.asc}}))},onClose:()=>{Ke=!1,setTimeout(J)}}))})([])}function Zi(){gt({rootPath:[]})}function nn(_){o("openFind",{findAndReplace:_}),N(JA,!1),N(yA,!1),jo(),N(JA,!0),N(yA,_)}function ai(){if(!d()&&E().canUndo){var _=E().undo();if(qw(_)){var q={json:c(hA),text:c(Ae)};N(hA,_.undo.patch?ol(c(hA),_.undo.patch):_.undo.json),N(GA,_.undo.documentState),N(OA,_.undo.selection),N(wt,_.undo.sortedColumn),N(Ae,_.undo.text),N(rt,_.undo.textIsRepaired),N(pA,void 0),o("undo",{item:_,json:c(hA)}),gn(q,_.undo.patch&&_.redo.patch?{json:c(hA),previousJson:q.json,redo:_.undo.patch,undo:_.redo.patch}:void 0),J(),c(OA)&&_n(Qt(c(OA)),{scrollToWhenVisible:!1})}else CA()(_)}}function Xi(){if(!d()&&E().canRedo){var _=E().redo();if(qw(_)){var q={json:c(hA),text:c(Ae)};N(hA,_.redo.patch?ol(c(hA),_.redo.patch):_.redo.json),N(GA,_.redo.documentState),N(OA,_.redo.selection),N(wt,_.redo.sortedColumn),N(Ae,_.redo.text),N(rt,_.redo.textIsRepaired),N(pA,void 0),o("redo",{item:_,json:c(hA)}),gn(q,_.undo.patch&&_.redo.patch?{json:c(hA),previousJson:q.json,redo:_.redo.patch,undo:_.undo.patch}:void 0),J(),c(OA)&&_n(Qt(c(OA)),{scrollToWhenVisible:!1})}else wA()(_)}}function Na(_){N(iA,_.getBoundingClientRect().height)}KA(()=>(Y(v()),Y(S())),()=>{N(HA,lx({escapeControlCharacters:v(),escapeUnicodeCharacters:S()}))}),KA(()=>c(JA),()=>{(function(_){if(c(PA)){var q=_?J4:-100;c(PA).scrollTo({top:Ol(PA,c(PA).scrollTop+=q),left:c(PA).scrollLeft})}})(c(JA))}),KA(()=>Y(B()),()=>{(function(_){var q={json:c(hA)},tA=q4(_)?_.text!==c(Ae):!Ui(q.json,_.json);if(o("update external content",{isChanged:tA}),tA){var rA={json:c(hA),documentState:c(GA),selection:c(OA),sortedColumn:c(wt),text:c(Ae),textIsRepaired:c(rt)};if(q4(_))try{N(hA,x()(_.text)),N(GA,Tl(c(hA),c(GA))),N(Ae,_.text),N(rt,!1),N(pA,void 0)}catch(DA){try{N(hA,x()(gg(_.text))),N(GA,Tl(c(hA),c(GA))),N(Ae,_.text),N(rt,!0),N(pA,void 0)}catch(ae){N(hA,void 0),N(GA,void 0),N(Ae,_.text),N(rt,!1),N(pA,c(Ae)!==""?Xh(c(Ae),DA.message||String(DA)):void 0)}}else N(hA,_.json),N(GA,Tl(c(hA),c(GA))),N(Ae,void 0),N(rt,!1),N(pA,void 0);me(c(hA)),N(wt,void 0),pi(rA)}})(B())}),KA(()=>Y(u()),()=>{(function(_){Ui(c(OA),_)||(o("applyExternalSelection",{selection:c(OA),externalSelection:_}),Ap(_)&&N(OA,_))})(u())}),KA(()=>(c(qe),c(hA),Y(k()),c(Pe)),()=>{N(qe,sa(c(hA))?(function(_,q){var tA=new Set(q.map(xt)),rA=new Set(_.map(xt));for(var DA of tA)rA.has(DA)||tA.delete(DA);for(var ae of rA)tA.has(ae)||tA.add(ae);return[...tA].map(ms)})(QEA(c(hA),k(),c(Pe)),c(qe)):[])}),KA(()=>(c(hA),c(qe)),()=>{N(vt,!(!c(hA)||An(c(qe))))}),KA(()=>(c(hA),c(Pe)),()=>{N(A,Array.isArray(c(hA))&&c(hA).length>c(Pe))}),KA(()=>(c(oA),c(iA),c(hA),c(JA),J4),()=>{N(t,uEA(c(oA),c(iA),c(hA),$,UA,c(JA)?J4:0))}),KA(()=>c(hA),()=>{c(hA),c(PA)&&c(PA).scrollTo({top:c(PA).scrollTop,left:c(PA).scrollLeft})}),KA(()=>c(OA),()=>{var _;_=c(OA),Ui(_,u())||(o("onSelect",_),Z()(_))}),KA(()=>(Y(d()),Y(f()),Y(M()),c(HA),c(hA),c(GA),Y(BA())),()=>{N(ze,{mode:xa.table,readOnly:d(),truncateTextSize:f(),parser:M(),normalization:c(HA),getJson:()=>c(hA),getDocumentState:()=>c(GA),findElement:So,findNextInside:jt,focus:J,onPatch:(_,q)=>Pi((function(tA,rA){return tA.flatMap(DA=>{if(B6(DA)){var ae=ms(DA.path);if(ae.length>0){for(var ge=[DA],pe=an(ae);pe.length>0&&!Fr(rA,pe);)ge.unshift({op:"add",path:xt(pe),value:{}}),pe=an(pe);return ge}}return DA})})(_,c(hA)),q),onSelect:he,onFind:nn,onPasteJson:Rt,onRenderValue:BA()})}),KA(()=>(c(hA),Y(F()),Y(M()),Y(z())),()=>{He(c(hA),F(),M(),z())}),KA(()=>(c(mn),c(qe)),()=>{N(n,pEA(c(mn),c(qe)))}),Vn();var Vt={validate:En,patch:Gi,focus:J,acceptAutoRepair:kn,scrollTo:_n,findElement:So,openTransformModal:gt};di(!0);var It=_QA();De("mousedown",bC,function(_){!CE(_.target,q=>q===c(bA))&&gr(c(OA))&&(o("click outside the editor, exit edit mode"),N(OA,p0(c(OA))),Ii&&c(it)&&(c(it).focus(),c(it).blur()),o("blur (outside editor)"),c(it)&&c(it).blur())});var $i,cn=at(It),Io=gA(cn),Rn=_=>{(function(q,tA){Jt(tA,!1);var rA=K(tA,"containsValidArray",9),DA=K(tA,"readOnly",9),ae=K(tA,"showSearch",13,!1),ge=K(tA,"history",9),pe=K(tA,"onSort",9),Ve=K(tA,"onTransform",9),Ue=K(tA,"onContextMenu",9),Je=K(tA,"onUndo",9),Ei=K(tA,"onRedo",9),no=K(tA,"onRenderMenu",9);function AA(){ae(!ae())}var fA=cA(void 0,!0),ZA=cA(void 0,!0);KA(()=>(Y(DA()),Y(pe()),Y(rA()),Y(Ve()),Y(Ue()),Y(Je()),Y(ge()),Y(Ei())),()=>{N(fA,DA()?[{type:"space"}]:[{type:"button",icon:Ju,title:"Sort",className:"jse-sort",onClick:pe(),disabled:DA()||!rA()},{type:"button",icon:Ku,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:Ve(),disabled:DA()||!rA()},{type:"button",icon:Uu,title:"Search (Ctrl+F)",className:"jse-search",onClick:AA,disabled:!rA()},{type:"button",icon:MM,title:Ix,className:"jse-contextmenu",onClick:Ue()},{type:"separator"},{type:"button",icon:D6,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:Je(),disabled:!ge().canUndo},{type:"button",icon:y6,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Ei(),disabled:!ge().canRedo},{type:"space"}])}),KA(()=>(Y(no()),c(fA)),()=>{N(ZA,no()(c(fA))||c(fA))}),Vn(),di(!0),p5(q,{get items(){return c(ZA)}}),Yt()})(_,{get containsValidArray(){return c(vt)},get readOnly(){return d()},get history(){return E()},onSort:io,onTransform:Zi,onUndo:ai,onRedo:Xi,onContextMenu:Ko,get onRenderMenu(){return QA()},get showSearch(){return c(JA)},set showSearch(q){N(JA,q)},$$legacy:!0})};zA(Io,_=>{m()&&_(Rn)});var Tt=kA(Io,2),fa=_=>{var q=SQA(),tA=at(q),rA=gA(tA);rA.readOnly=!0,ta(rA,pe=>N(it,pe),()=>c(it));var DA=kA(tA,2),ae=pe=>{var Ve=bQA(),Ue=at(Ve);wW(gA(Ue),{get json(){return c(hA)},get documentState(){return c(GA)},get parser(){return M()},get showSearch(){return c(JA)},get showReplace(){return c(yA)},get readOnly(){return d()},get columns(){return c(qe)},onSearch:Pt,onFocus:Dt,onPatch:Pi,onClose:Zt});var Je=kA(Ue,2),Ei=gA(Je),no=gA(Ei),AA=gA(no),fA=gA(AA),ZA=gA(fA),Ye=_t=>{var fi=lt(()=>(Y(Mh),c(n),uA(()=>{var ba;return Mh([],(ba=c(n))===null||ba===void 0?void 0:ba.root)}))),ma=zi(),ho=at(ma),Ia=ba=>{var wr=uQA();zh(gA(wr),{get validationError(){return c(fi)},get onExpand(){return ug}}),sA(ba,wr)};zA(ho,ba=>{c(fi)&&ba(Ia)}),sA(_t,ma)};zA(ZA,_t=>{Y(An),c(n),uA(()=>{var fi;return!An((fi=c(n))===null||fi===void 0?void 0:fi.root)})&&_t(Ye)});var Me=kA(fA);Da(Me,1,()=>c(qe),Ka,(_t,fi)=>{var ma=pQA();(function(ho,Ia){Jt(Ia,!1);var ba=cA(void 0,!0),wr=cA(void 0,!0),R0=cA(void 0,!0),ml=K(Ia,"path",9),Sg=K(Ia,"sortedColumn",9),kc=K(Ia,"readOnly",9),kg=K(Ia,"onSort",9);KA(()=>(Y(ml()),El),()=>{N(ba,An(ml())?"values":El(ml()))}),KA(()=>(Y(Sg()),Y(ml())),()=>{var Ua;N(wr,Sg()&&Ui(ml(),(Ua=Sg())===null||Ua===void 0?void 0:Ua.path)?Sg().sortDirection:void 0)}),KA(()=>(c(wr),Gj),()=>{N(R0,c(wr)?Gj[c(wr)]:void 0)}),Vn(),di(!0);var ss,yr=CQA(),wl=gA(yr),N0=gA(wl),yl=kA(wl,2),Zn=Ua=>{var Ta=cQA(),m1=gA(Ta),EI=lt(()=>(c(wr),Y(pg),Y(r0),Y(xM),uA(()=>c(wr)===pg.asc?r0:xM)));Bn(m1,{get data(){return c(EI)}}),Le(()=>jn(Ta,"title","Currently sorted in ".concat(c(R0)," order"))),sA(Ua,Ta)};zA(yl,Ua=>{c(wr)!==void 0&&Ua(Zn)}),Le(Ua=>{ss=Ci(yr,1,"jse-column-header svelte-5pxwfq",null,ss,{"jse-readonly":kc()}),jn(yr,"title",kc()?c(ba):c(ba)+" (Click to sort the data by this column)"),Ht(N0,Ua)},[()=>(Y(mC),c(ba),Y(50),uA(()=>mC(c(ba),50)))]),De("click",yr,function(){kc()||kg()({path:ml(),sortDirection:c(wr)===pg.asc?pg.desc:pg.asc})}),sA(ho,yr),Yt()})(gA(ma),{get path(){return c(fi)},get sortedColumn(){return c(wt)},get readOnly(){return d()},onSort:je}),sA(_t,ma)});var Re=kA(Me),ct=_t=>{var fi=fQA(),ma=gA(fi),ho=lt(()=>(c(hA),uA(()=>Array.isArray(c(hA))?c(hA).length:0)));(function(Ia,ba){Jt(ba,!1);var wr=K(ba,"count",9),R0=K(ba,"maxSampleCount",9),ml=K(ba,"readOnly",9),Sg=K(ba,"onRefresh",9);di(!0);var kc,kg=QQA();Bn(gA(kg),{get data(){return ZO}}),Le(()=>{kc=Ci(kg,1,"jse-column-header svelte-1wgrwv3",null,kc,{"jse-readonly":ml()}),jn(kg,"title","The Columns are created by sampling ".concat(R0()," items out of ").concat(wr(),". ")+"If you're missing a column, click here to sample all of the items instead of a subset. This is slower.")}),De("click",kg,()=>Sg()()),sA(Ia,kg),Yt()})(ma,{get count(){return c(ho)},get maxSampleCount(){return c(Pe)},get readOnly(){return d()},onRefresh:()=>N(Pe,1/0)}),sA(_t,fi)};zA(Re,_t=>{c(A)&&_t(ct)});var ti,ji,Wn=kA(AA),Cn=gA(Wn),xo=kA(Wn);Da(xo,1,()=>(c(t),uA(()=>c(t).visibleItems)),Ka,(_t,fi,ma)=>{var ho=lt(()=>(c(t),uA(()=>c(t).startIndex+ma))),Ia=lt(()=>(c(n),Y(c(ho)),uA(()=>c(n).rows[c(ho)]))),ba=lt(()=>(Y(Mh),Y(c(ho)),Y(c(Ia)),uA(()=>{var ss;return Mh([String(c(ho))],(ss=c(Ia))===null||ss===void 0?void 0:ss.row)}))),wr=lt(()=>(Y(Q0),c(hA),c(Ge),Y(c(ho)),uA(()=>Q0(c(hA),c(Ge),[String(c(ho))])))),R0=vQA(),ml=gA(R0);uq(ml,()=>c(ho),ss=>{var yr=mQA(),wl=gA(yr),N0=kA(wl),yl=Zn=>{zh(Zn,{get validationError(){return c(ba)},get onExpand(){return ug}})};zA(N0,Zn=>{c(ba)&&Zn(yl)}),Ms(yr,(Zn,Ua)=>kw?.(Zn,Ua),()=>Zn=>(function(Ua,Ta){$[Ta]=Ua.getBoundingClientRect().height})(Zn,c(ho))),Le(()=>{var Zn;return Ht(wl,"".concat((Zn=c(ho))!==null&&Zn!==void 0?Zn:""," "))}),sA(ss,yr)});var Sg=kA(ml);Da(Sg,1,()=>c(qe),Ka,(ss,yr,wl,N0)=>{var yl,Zn=lt(()=>(Y(c(ho)),c(yr),uA(()=>[String(c(ho))].concat(c(yr))))),Ua=lt(()=>(Y($e),c(fi),c(yr),uA(()=>$e(c(fi),c(yr))))),Ta=lt(()=>(Y(bn),c(OA),Y(v0),Y(c(Zn)),uA(()=>bn(c(OA))&&v0(c(OA).path,c(Zn))))),m1=lt(()=>(Y(c(Ia)),uA(()=>{var Oa;return(Oa=c(Ia))===null||Oa===void 0?void 0:Oa.columns[wl]}))),EI=lt(()=>(Y(Mh),Y(c(Zn)),Y(c(m1)),uA(()=>Mh(c(Zn),c(m1))))),w1=yQA(),OE=gA(w1),QI=gA(OE),JE=Oa=>{var Pl=lt(()=>(Y($w),Y(Q0),c(fi),Y(c(wr)),c(yr),uA(()=>$w(Q0(c(fi),c(wr),c(yr)))))),YE=lt(()=>(Y(c(Pl)),uA(()=>!!c(Pl)&&c(Pl).some(D1=>D1.active)))),HE=lt(()=>(Y(An),Y(c(Pl)),uA(()=>!An(c(Pl)))));(function(D1,Jr){Jt(Jr,!1);var zE=K(Jr,"path",9),lN=K(Jr,"value",9),gN=K(Jr,"parser",9),aAA=K(Jr,"isSelected",9),rAA=K(Jr,"containsSearchResult",9),sAA=K(Jr,"containsActiveSearchResult",9),lAA=K(Jr,"onEdit",9);di(!0);var cN,zp=gQA(),gAA=gA(zp);Le(PE=>{cN=Ci(zp,1,"jse-inline-value svelte-1jv89ui",null,cN,{"jse-selected":aAA(),"jse-highlight":rAA(),"jse-active":sAA()}),Ht(gAA,PE)},[()=>(Y(mC),Y(gN()),Y(lN()),Y(50),uA(()=>{var PE;return mC((PE=gN().stringify(lN()))!==null&&PE!==void 0?PE:"",50)}))]),De("dblclick",zp,()=>lAA()(zE())),sA(D1,zp),Yt()})(Oa,{get path(){return c(Zn)},get value(){return c(Ua)},get parser(){return M()},get isSelected(){return c(Ta)},get containsSearchResult(){return c(HE)},get containsActiveSearchResult(){return c(YE)},onEdit:dt})},kD=Oa=>{var Pl=lt(()=>(Y(Q0),c(hA),c(Ge),Y(c(Zn)),uA(()=>{var Jr;return(Jr=Q0(c(hA),c(Ge),c(Zn)))===null||Jr===void 0?void 0:Jr.searchResults}))),YE=lt(()=>c(Ua)!==void 0?c(Ua):""),HE=lt(()=>(Y(m0),c(hA),c(GA),Y(c(Zn)),uA(()=>m0(c(hA),c(GA),c(Zn))))),D1=lt(()=>c(Ta)?c(OA):void 0);uW(Oa,{get path(){return c(Zn)},get value(){return c(YE)},get enforceString(){return c(HE)},get selection(){return c(D1)},get searchResultItems(){return c(Pl)},get context(){return c(ze)}})};zA(QI,Oa=>{Y(ua),Y(c(Ua)),uA(()=>ua(c(Ua)))?Oa(JE):Oa(kD,!1)});var _D=kA(QI),xD=Oa=>{var Pl=wQA();Y2(gA(Pl),{selected:!0,onContextMenu:Vo}),sA(Oa,Pl)};zA(_D,Oa=>{Y(d()),Y(c(Ta)),Y(gr),c(OA),uA(()=>!d()&&c(Ta)&&!gr(c(OA)))&&Oa(xD)});var _c=kA(OE,2),y1=Oa=>{zh(Oa,{get validationError(){return c(EI)},get onExpand(){return ug}})};zA(_c,Oa=>{c(EI)&&Oa(y1)}),Le(Oa=>{jn(w1,"data-path",Oa),yl=Ci(OE,1,"jse-value-outer svelte-1p86y3c",null,yl,{"jse-selected-value":c(Ta)})},[()=>(Y(Gw),Y(c(Zn)),uA(()=>Gw(c(Zn))))]),sA(ss,w1)});var kc=kA(Sg),kg=ss=>{sA(ss,DQA())};zA(kc,ss=>{c(A)&&ss(kg)}),sA(_t,R0)});var ri,Ca=gA(kA(xo));ta(Je,_t=>N(PA,_t),()=>c(PA)),Ms(Je,(_t,fi)=>kw?.(_t,fi),()=>Na),Tr(()=>De("scroll",Je,ut));var Bo=kA(Je,2),da=_t=>{var fi=lt(()=>(c(te),uA(()=>"You pasted a JSON ".concat(Array.isArray(c(te).contents)?"array":"object"," as text")))),ma=lt(()=>[{icon:oC,text:"Paste as JSON instead",title:"Paste the text as JSON instead of a single value",onMouseDown:Uo},{text:"Leave as is",title:"Keep the pasted content as a single value",onClick:Ra}]);Hl(_t,{type:"info",get message(){return c(fi)},get actions(){return c(ma)}})};zA(Bo,_t=>{c(te)&&_t(da)});var Nn=kA(Bo,2),qt=_t=>{var fi=lt(()=>[{icon:oC,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:xn},{text:"Leave as is",title:"Keep the pasted array",onClick:Oi}]);Hl(_t,{type:"info",message:"Multiline text was pasted as array",get actions(){return c(fi)}})};zA(Nn,_t=>{c(NA)&&_t(qt)});var un=kA(Nn,2),si=_t=>{var fi=lt(()=>d()?[]:[{icon:w6,text:"Ok",title:"Accept the repaired document",onClick:kn},{icon:Tu,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:ko}]);Hl(_t,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return c(fi)},onClose:J})};zA(un,_t=>{c(rt)&&_t(si)}),bx(kA(un,2),{get validationErrors(){return c(mn)},selectError:Te}),Le(()=>{ti=Ci(Wn,1,"jse-table-invisible-start-section svelte-1p86y3c",null,ti,{"jse-search-box-background":c(JA)}),jn(Cn,"colspan",(c(qe),uA(()=>c(qe).length))),ji=wg(Cn,"",ji,{height:(c(t),uA(()=>c(t).startHeight+"px"))}),jn(Ca,"colspan",(c(qe),uA(()=>c(qe).length))),ri=wg(Ca,"",ri,{height:(c(t),uA(()=>c(t).endHeight+"px"))})}),sA(pe,Ve)},ge=pe=>{var Ve=zi(),Ue=at(Ve),Je=no=>{var AA=MQA(),fA=at(AA),ZA=lt(()=>d()?[]:[{icon:Tu,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:ko}]);Hl(fA,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return c(ZA)}}),_W(kA(fA,2),{get text(){return c(Ae)},get json(){return c(hA)},get indentation(){return j()},get parser(){return M()}}),sA(no,AA)},Ei=no=>{EQA(no,{get text(){return c(Ae)},get json(){return c(hA)},get readOnly(){return d()},get parser(){return M()},openJSONEditorModal:dt,extractPath:ei,get onChangeMode(){return eA()},onClick:()=>{J()}})};zA(Ue,no=>{c(pA)&&c(Ae)!==void 0&&c(Ae)!==""?no(Je):no(Ei,!1)},!0),sA(pe,Ve)};zA(DA,pe=>{c(vt)?pe(ae):pe(ge,!1)}),De("paste",rA,be),sA(_,q)},oa=_=>{sA(_,kQA())};zA(Tt,_=>{C?_(oa,!1):_(fa)}),ta(cn,_=>N(bA,_),()=>c(bA));var y=kA(cn,2),b=_=>{EW(_,{onClose:()=>N(V,!1)})};zA(y,_=>{c(V)&&_(b)});var R=kA(y,2),W=_=>{QW(_,t1(()=>c(Xe),{onClose:()=>{var q;(q=c(Xe))===null||q===void 0||q.onClose(),N(Xe,void 0)}}))};return zA(R,_=>{c(Xe)&&_(W)}),Le(()=>$i=Ci(cn,1,"jse-table-mode svelte-1p86y3c",null,$i,{"no-main-menu":!m()})),De("mousedown",cn,function(_){if(_.buttons===1||_.buttons===2){var q=_.target;q.isContentEditable||J();var tA=Uq(q);if(tA){if(gr(c(OA))&&ep(c(hA),c(OA),tA))return;N(OA,en(tA)),_.preventDefault()}}}),De("keydown",cn,function(_){var q=RC(_);if(o("keydown",{combo:q,key:_.key}),q==="Ctrl+X"&&(_.preventDefault(),ar(!0)),q==="Ctrl+Shift+X"&&(_.preventDefault(),ar(!1)),q==="Ctrl+C"&&(_.preventDefault(),ja(!0)),q==="Ctrl+Shift+C"&&(_.preventDefault(),ja(!1)),q==="Ctrl+D"&&(_.preventDefault(),qn()),q!=="Delete"&&q!=="Backspace"||(_.preventDefault(),Wi()),q==="Insert"&&_.preventDefault(),q==="Ctrl+A"&&_.preventDefault(),q==="Ctrl+Q"&&ga(_),q==="ArrowLeft"&&(_.preventDefault(),bi(),c(OA))){var tA=(function(Ve,Ue){var{rowIndex:Je,columnIndex:Ei}=Qg(Qt(Ue),Ve);return Ei>0?en(Td({rowIndex:Je,columnIndex:Ei-1},Ve)):Ue})(c(qe),c(OA));N(OA,tA),ia(Qt(tA))}if(q==="ArrowRight"&&(_.preventDefault(),bi(),c(OA))){var rA=(function(Ve,Ue){var{rowIndex:Je,columnIndex:Ei}=Qg(Qt(Ue),Ve);return Ei0?en(Td({rowIndex:Je-1,columnIndex:Ei},Ve)):Ue})(c(qe),c(OA));N(OA,DA),ia(Qt(DA))}if(q==="ArrowDown"&&(_.preventDefault(),bi(),c(OA))){var ae=(function(Ve,Ue,Je){var{rowIndex:Ei,columnIndex:no}=Qg(Qt(Je),Ue);return EiN(HA,$)}).get()),bA=cA(s());function PA($){if(Yj($)){N(bA,$.undo.mode);var iA=c(HA).items(),oA=iA.findIndex(he=>he===$),UA=oA!==-1?iA[oA-1]:void 0;ue("handleUndo",{index:oA,item:$,items:iA,prevItem:UA}),UA&&t(UA.redo.selection),F()(c(bA))}}function it($){if(Yj($)){N(bA,$.redo.mode);var iA=c(HA).items(),oA=iA.findIndex(he=>he===$),UA=oA!==-1?iA[oA+1]:void 0;ue("handleRedo",{index:oA,item:$,items:iA,nextItem:UA}),UA&&t(UA.undo.selection),F()(c(bA))}}var Xe=cA(),YA={type:"separator"},hA=cA(),Ae=cA();function pA($){if(c(IA))return c(IA).patch($);if(c(xA))return c(xA).patch($);if(c(qA))return c(qA).patch($);throw new Error('Method patch is not available in mode "'.concat(c(bA),'"'))}function te($,iA){if(c(IA))return c(IA).expand($,iA);if(c(qA))return c(qA).expand($,iA);throw new Error('Method expand is not available in mode "'.concat(c(bA),'"'))}function NA($,iA){if(c(IA))return c(IA).collapse($,iA);if(c(qA))return c(qA).collapse($,iA);throw new Error('Method collapse is not available in mode "'.concat(c(bA),'"'))}function Ge($){if(c(qA))c(qA).openTransformModal($);else if(c(IA))c(IA).openTransformModal($);else{if(!c(xA))throw new Error('Method transform is not available in mode "'.concat(c(bA),'"'));c(xA).openTransformModal($)}}function JA(){if(c(qA))return c(qA).validate();if(c(IA))return c(IA).validate();if(c(xA))return c(xA).validate();throw new Error('Method validate is not available in mode "'.concat(c(bA),'"'))}function yA(){return c(IA)?c(IA).acceptAutoRepair():A()}function Pt($){if(c(IA))return c(IA).scrollTo($);if(c(xA))return c(xA).scrollTo($);throw new Error('Method scrollTo is not available in mode "'.concat(c(bA),'"'))}function Dt($){if(c(IA))return c(IA).findElement($);if(c(xA))return c(xA).findElement($);throw new Error('Method findElement is not available in mode "'.concat(c(bA),'"'))}function fe(){c(qA)?c(qA).focus():c(IA)?c(IA).focus():c(xA)&&c(xA).focus()}function Zt(){return Pe.apply(this,arguments)}function Pe(){return(Pe=Xt(function*(){c(qA)&&(yield c(qA).refresh())})).apply(this,arguments)}KA(()=>Y(s()),()=>{(function($){if($!==c(bA)){var iA={type:"mode",undo:{mode:c(bA),selection:void 0},redo:{mode:$,selection:void 0}};c(bA)==="text"&&c(qA)&&c(qA).flush(),ue("add history item",iA),c(HA).add(iA),N(bA,$)}})(s())}),KA(()=>(c(bA),Y(F())),()=>{N(Xe,[{type:"button",text:"text",title:"Switch to text mode (current mode: ".concat(c(bA),")"),className:"jse-group-button jse-first"+(c(bA)===xa.text?" jse-selected":""),onClick:()=>F()(xa.text)},{type:"button",text:"tree",title:"Switch to tree mode (current mode: ".concat(c(bA),")"),className:"jse-group-button "+(c(bA)===xa.tree?" jse-selected":""),onClick:()=>F()(xa.tree)},{type:"button",text:"table",title:"Switch to table mode (current mode: ".concat(c(bA),")"),className:"jse-group-button jse-last"+(c(bA)===xa.table?" jse-selected":""),onClick:()=>F()(xa.table)}])}),KA(()=>(c(Xe),Y(eA()),c(bA),Y(M()),Y(n())),()=>{N(hA,$=>{var iA=L_($[0])?c(Xe).concat($):c(Xe).concat(YA,$),oA=d3(iA);return eA()(iA,{mode:c(bA),modal:M(),readOnly:n()})||oA})}),KA(()=>(Y(Z()),c(bA),Y(M()),Y(n()),Y(t())),()=>{N(Ae,$=>{var iA,oA=d3($);return(iA=Z()($,{mode:c(bA),modal:M(),readOnly:n(),selection:t()}))!==null&&iA!==void 0?iA:!n()&&oA})}),Vn();var qe={patch:pA,expand:te,collapse:NA,transform:Ge,validate:JA,acceptAutoRepair:yA,scrollTo:Pt,findElement:Dt,focus:fe,refresh:Zt};di();var vt=zi(),Ke=at(vt),Ii=$=>{ta(lQA($,{get externalContent(){return A()},get externalSelection(){return t()},get history(){return c(HA)},get readOnly(){return n()},get indentation(){return o()},get tabSize(){return a()},get mainMenuBar(){return l()},get statusBar(){return C()},get askToFormat(){return d()},get escapeUnicodeCharacters(){return u()},get parser(){return f()},get validator(){return v()},get validationParser(){return S()},get onChange(){return x()},get onChangeMode(){return F()},get onSelect(){return z()},onUndo:PA,onRedo:it,get onError(){return CA()},get onFocus(){return wA()},get onBlur(){return BA()},get onRenderMenu(){return c(hA)},get onSortModal(){return QA()},get onTransformModal(){return RA()},$$legacy:!0}),iA=>N(qA,iA),()=>c(qA))},V=$=>{var iA=zi(),oA=at(iA),UA=me=>{ta(xQA(me,{get externalContent(){return A()},get externalSelection(){return t()},get history(){return c(HA)},get readOnly(){return n()},get truncateTextSize(){return r()},get mainMenuBar(){return l()},get escapeControlCharacters(){return B()},get escapeUnicodeCharacters(){return u()},get flattenColumns(){return E()},get parser(){return f()},get parseMemoizeOne(){return m()},get validator(){return v()},get validationParser(){return S()},get indentation(){return o()},get onChange(){return x()},get onChangeMode(){return F()},get onSelect(){return z()},onUndo:PA,onRedo:it,get onRenderValue(){return j()},get onFocus(){return wA()},get onBlur(){return BA()},get onRenderMenu(){return c(hA)},get onRenderContextMenu(){return c(Ae)},get onSortModal(){return QA()},get onTransformModal(){return RA()},get onJSONEditorModal(){return dA()},$$legacy:!0}),GA=>N(xA,GA),()=>c(xA))},he=me=>{ta($_(me,{get externalContent(){return A()},get externalSelection(){return t()},get history(){return c(HA)},get readOnly(){return n()},get indentation(){return o()},get truncateTextSize(){return r()},get mainMenuBar(){return l()},get navigationBar(){return g()},get escapeControlCharacters(){return B()},get escapeUnicodeCharacters(){return u()},get parser(){return f()},get parseMemoizeOne(){return m()},get validator(){return v()},get validationParser(){return S()},get pathParser(){return k()},get onError(){return CA()},get onChange(){return x()},get onChangeMode(){return F()},get onSelect(){return z()},onUndo:PA,onRedo:it,get onRenderValue(){return j()},get onClassName(){return X()},get onFocus(){return wA()},get onBlur(){return BA()},get onRenderMenu(){return c(hA)},get onRenderContextMenu(){return c(Ae)},get onSortModal(){return QA()},get onTransformModal(){return RA()},get onJSONEditorModal(){return dA()},$$legacy:!0}),GA=>N(IA,GA),()=>c(IA))};zA(oA,me=>{c(bA),Y(xa),uA(()=>c(bA)===xa.table)?me(UA):me(he,!1)},!0),sA($,iA)};return zA(Ke,$=>{c(bA),Y(xa),uA(()=>c(bA)===xa.text||String(c(bA))==="code")?$(Ii):$(V,!1)}),sA(i,vt),Ai(e,"patch",pA),Ai(e,"expand",te),Ai(e,"collapse",NA),Ai(e,"transform",Ge),Ai(e,"validate",JA),Ai(e,"acceptAutoRepair",yA),Ai(e,"scrollTo",Pt),Ai(e,"findElement",Dt),Ai(e,"focus",fe),Ai(e,"refresh",Zt),Yt(qe)}oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-modal-wrapper.svelte-t4zsk3 { - flex: 1; - display: flex; - min-width: 0; - min-height: 0; - flex-direction: column; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) { - flex: 1; - display: flex; - flex-direction: column; - padding: 20px; - overflow: auto; - min-width: 0; - min-height: 0; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-top: var(--jse-padding, 10px); -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-label:where(.svelte-t4zsk3) { - font-weight: bold; - display: block; - box-sizing: border-box; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-label:where(.svelte-t4zsk3) .jse-label-inner:where(.svelte-t4zsk3) { - margin-top: calc(2 * var(--jse-padding, 10px)); - margin-bottom: calc(0.5 * var(--jse-padding, 10px)); - box-sizing: border-box; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-modal-inline-editor:where(.svelte-t4zsk3) { - flex: 1; - min-height: 150px; - min-width: 0; - max-width: 100%; - display: flex; - --jse-theme-color: var(--jse-modal-editor-theme-color, #707070); - --jse-theme-color-highlight: var(--jse-modal-editor-theme-color-highlight, #646464); -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) { - gap: var(--jse-padding, 10px); - align-items: center; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) .jse-error:where(.svelte-t4zsk3) { - flex: 1; - color: var(--jse-error-color, #ee5341); -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-secondary-background, #d3d3d3); - color: var(--jse-button-secondary-color, var(--jse-text-color, #4d4d4d)); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3):hover { - background: var(--jse-button-secondary-background-highlight, #e1e1e1); -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3):disabled { - background: var(--jse-button-secondary-background-disabled, #9d9d9d); -} -.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3) { - border: var(--jse-input-border, 1px solid #d8dbdf); - outline: none; - box-sizing: border-box; - padding: calc(0.5 * var(--jse-padding, 10px)); - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: inherit; - background: var(--jse-input-background, var(--jse-background-color, #fff)); -} -.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3):focus { - border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); -} -.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3):read-only { - background: var(--jse-input-background-readonly, transparent); -}`);var RQA=TA('
      '),NQA=TA(''),FQA=TA(''),LQA=TA(''),GQA=TA('
      Path
      Contents
      ',1),KQA=TA('
      '),UQA={};oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-modal-contents.svelte-lwzlls { - flex: 1; - display: flex; - flex-direction: column; - padding: 20px; - overflow: auto; - min-width: 0; - min-height: 0; -} -.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-top: var(--jse-padding, 10px); -} -.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} -.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) { - width: 100%; - border-collapse: collapse; - border-spacing: 0; -} -.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) th:where(.svelte-lwzlls), -.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) td:where(.svelte-lwzlls) { - text-align: left; - vertical-align: middle; - font-weight: normal; - padding-bottom: var(--jse-padding, 10px); -} -.jse-modal-contents.svelte-lwzlls input.jse-path:where(.svelte-lwzlls) { - width: 100%; - box-sizing: border-box; - padding: 5px 10px; - border: var(--jse-input-border, 1px solid #d8dbdf); - border-radius: var(--jse-input-radius, 3px); - font-family: inherit; - font-size: inherit; - background: inherit; - background: var(--jse-input-background-readonly, transparent); - color: inherit; - outline: none; -} -.jse-modal-contents.svelte-lwzlls .svelte-select input { - box-sizing: border-box; -} -.jse-modal-contents.svelte-lwzlls .jse-space:where(.svelte-lwzlls) { - height: 200px; -} -.jse-modal-contents.svelte-lwzlls .jse-space:where(.svelte-lwzlls) .jse-error:where(.svelte-lwzlls) { - color: var(--jse-error-color, #ee5341); -}`);var kh=C5(()=>UQA),TQA=TA('Property'),OQA=TA('
      '),JQA=TA('
      Path
      Direction
      ',1);oi(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-main.svelte-1l55585 { - width: 100%; - height: 100%; - min-width: 0; - min-height: 150px; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - line-height: normal; - position: relative; - display: flex; - flex-direction: row; -} -.jse-main.svelte-1l55585:not(.jse-focus) { - --jse-selection-background-color: var(--jse-selection-background-inactive-color, #e8e8e8); - --jse-context-menu-pointer-background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); -}`);var YQA=TA('
      ',1);function HQA(i,e){Jt(e,!1);var A=cA(void 0,!0),t=dr("jsoneditor:JSONEditor"),n={text:""},o=void 0,a=!1,r=xa.tree,s=!0,l=!0,g=!0,C=!0,d=!1,B=!1,u=!0,E=JSON,f=void 0,m=JSON,v={parse:jIA,stringify:El},S=[IIA],k=S[0].id,M=ug,x=void 0,F=void 0,z=PIA,j=ug,X=ug,eA=ug,Z=ug,CA=de=>{console.error(de),alert(de.toString())},wA=ug,BA=ug,QA=K(e,"content",13,n),RA=K(e,"selection",13,o),dA=K(e,"readOnly",13,a),IA=K(e,"indentation",13,2),xA=K(e,"tabSize",13,4),qA=K(e,"truncateTextSize",13,1e3),ue=K(e,"mode",13,r),HA=K(e,"mainMenuBar",13,s),bA=K(e,"navigationBar",13,l),PA=K(e,"statusBar",13,g),it=K(e,"askToFormat",13,C),Xe=K(e,"escapeControlCharacters",13,d),YA=K(e,"escapeUnicodeCharacters",13,B),hA=K(e,"flattenColumns",13,u),Ae=K(e,"parser",13,E),pA=K(e,"validator",13,f),te=K(e,"validationParser",13,m),NA=K(e,"pathParser",13,v),Ge=K(e,"queryLanguages",13,S),JA=K(e,"queryLanguageId",13,k),yA=K(e,"onChangeQueryLanguage",13,M),Pt=K(e,"onChange",13,x),Dt=K(e,"onSelect",13,F),fe=K(e,"onRenderValue",13,z),Zt=K(e,"onClassName",13,j),Pe=K(e,"onRenderMenu",13,X),qe=K(e,"onRenderContextMenu",13,eA),vt=K(e,"onChangeMode",13,Z),Ke=K(e,"onError",13,CA),Ii=K(e,"onFocus",13,wA),V=K(e,"onBlur",13,BA),$=cA(Fh(),!0),iA=cA(!1,!0),oA=cA(void 0,!0),UA=cA(void 0,!0),he=cA(void 0,!0),me=cA(void 0,!0),GA=cA(Ae(),!0);function OA(){return QA()}function wt(de){t("set");var xi=n_(de);if(xi)throw new Error(xi);N($,Fh()),QA(de),jo()}function rt(de){t("update");var xi=n_(de);if(xi)throw new Error(xi);QA(de),jo()}function je(de){var xi=c(oA).patch(de);return jo(),xi}function ze(de){RA(de),jo()}function pi(de,xi){c(oA).expand(de,xi),jo()}function mn(de){var xi=arguments.length>1&&arguments[1]!==void 0&&arguments[1];c(oA).collapse(de,xi),jo()}function Sn(){var de=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};c(oA).transform(de),jo()}function He(){return c(oA).validate()}function En(){var de=c(oA).acceptAutoRepair();return jo(),de}function Gi(de){return Pi.apply(this,arguments)}function Pi(){return(Pi=Xt(function*(de){yield c(oA).scrollTo(de)})).apply(this,arguments)}function gn(de){return c(oA).findElement(de)}function Rt(){c(oA).focus(),jo()}function Qn(){return jt.apply(this,arguments)}function jt(){return(jt=Xt(function*(){yield c(oA).refresh()})).apply(this,arguments)}function J(de){var xi,wn,xn,na,Ra,Oi,ko,ar,To,ja,to,Wi,ei,qn,_o,qo,SA,ee,be,EA,LA,Ce,Te,gt,dt,Ut,io,Zi,nn,ai,Xi,Na=Object.keys(de);for(var Vt of Na)switch(Vt){case"content":QA((xi=de[Vt])!==null&&xi!==void 0?xi:n);break;case"selection":RA((wn=de[Vt])!==null&&wn!==void 0?wn:o);break;case"readOnly":dA((xn=de[Vt])!==null&&xn!==void 0?xn:a);break;case"indentation":IA((na=de[Vt])!==null&&na!==void 0?na:2);break;case"tabSize":xA((Ra=de[Vt])!==null&&Ra!==void 0?Ra:4);break;case"truncateTextSize":qA((Oi=de[Vt])!==null&&Oi!==void 0?Oi:1e3);break;case"mode":ue((ko=de[Vt])!==null&&ko!==void 0?ko:r);break;case"mainMenuBar":HA((ar=de[Vt])!==null&&ar!==void 0?ar:s);break;case"navigationBar":bA((To=de[Vt])!==null&&To!==void 0?To:l);break;case"statusBar":PA((ja=de[Vt])!==null&&ja!==void 0?ja:g);break;case"askToFormat":it((to=de[Vt])!==null&&to!==void 0?to:C);break;case"escapeControlCharacters":Xe((Wi=de[Vt])!==null&&Wi!==void 0?Wi:d);break;case"escapeUnicodeCharacters":YA((ei=de[Vt])!==null&&ei!==void 0?ei:B);break;case"flattenColumns":hA((qn=de[Vt])!==null&&qn!==void 0?qn:u);break;case"parser":Ae((_o=de[Vt])!==null&&_o!==void 0?_o:E);break;case"validator":pA((qo=de[Vt])!==null&&qo!==void 0?qo:f);break;case"validationParser":te((SA=de[Vt])!==null&&SA!==void 0?SA:m);break;case"pathParser":NA((ee=de[Vt])!==null&&ee!==void 0?ee:v);break;case"queryLanguages":Ge((be=de[Vt])!==null&&be!==void 0?be:S);break;case"queryLanguageId":JA((EA=de[Vt])!==null&&EA!==void 0?EA:k);break;case"onChangeQueryLanguage":yA((LA=de[Vt])!==null&&LA!==void 0?LA:M);break;case"onChange":Pt((Ce=de[Vt])!==null&&Ce!==void 0?Ce:x);break;case"onRenderValue":fe((Te=de[Vt])!==null&&Te!==void 0?Te:z);break;case"onClassName":Zt((gt=de[Vt])!==null&>!==void 0?gt:j);break;case"onRenderMenu":Pe((dt=de[Vt])!==null&&dt!==void 0?dt:X);break;case"onRenderContextMenu":qe((Ut=de[Vt])!==null&&Ut!==void 0?Ut:eA);break;case"onChangeMode":vt((io=de[Vt])!==null&&io!==void 0?io:Z);break;case"onSelect":Dt((Zi=de[Vt])!==null&&Zi!==void 0?Zi:F);break;case"onError":Ke((nn=de[Vt])!==null&&nn!==void 0?nn:CA);break;case"onFocus":Ii((ai=de[Vt])!==null&&ai!==void 0?ai:wA);break;case"onBlur":V((Xi=de[Vt])!==null&&Xi!==void 0?Xi:BA);break;default:It(Vt)}function It($i){t('Unknown property "'.concat($i,'"'))}Ge().some($i=>$i.id===JA())||JA(Ge()[0].id),jo()}function ut(){return bi.apply(this,arguments)}function bi(){return(bi=Xt(function*(){throw new Error("class method destroy() is deprecated. It is replaced with a method destroy() in the vanilla library.")})).apply(this,arguments)}function kn(de,xi,wn){QA(de),Pt()&&Pt()(de,xi,wn)}function _n(de){RA(de),Dt()&&Dt()(d3(de))}function Co(){N(iA,!0),Ii()&&Ii()()}function ia(){N(iA,!1),V()&&V()()}function So(de){return Vo.apply(this,arguments)}function Vo(){return(Vo=Xt(function*(de){ue()!==de&&(ue(de),jo(),Rt(),vt()(de))})).apply(this,arguments)}function ga(de){t("handleChangeQueryLanguage",de),JA(de),yA()(de)}function Ko(de){var{id:xi,json:wn,rootPath:xn,onTransform:na,onClose:Ra}=de;dA()||N(me,{id:xi,json:wn,rootPath:xn,indentation:IA(),truncateTextSize:qA(),escapeControlCharacters:Xe(),escapeUnicodeCharacters:YA(),parser:Ae(),parseMemoizeOne:c(A),validationParser:te(),pathParser:NA(),queryLanguages:Ge(),queryLanguageId:JA(),onChangeQueryLanguage:ga,onRenderValue:fe(),onRenderMenu:Oi=>Pe()(Oi,{mode:ue(),modal:!0,readOnly:dA()}),onRenderContextMenu:Oi=>qe()(Oi,{mode:ue(),modal:!0,readOnly:dA(),selection:RA()}),onClassName:Zt(),onTransform:na,onClose:Ra})}function va(de){dA()||N(he,de)}function ca(de){var{content:xi,path:wn,onPatch:xn,onClose:na}=de;t("onJSONEditorModal",{content:xi,path:wn}),N(UA,{content:xi,path:wn,onPatch:xn,readOnly:dA(),indentation:IA(),tabSize:xA(),truncateTextSize:qA(),mainMenuBar:HA(),navigationBar:bA(),statusBar:PA(),askToFormat:it(),escapeControlCharacters:Xe(),escapeUnicodeCharacters:YA(),flattenColumns:hA(),parser:Ae(),validator:void 0,validationParser:te(),pathParser:NA(),onRenderValue:fe(),onClassName:Zt(),onRenderMenu:Pe(),onRenderContextMenu:qe(),onSortModal:va,onTransformModal:Ko,onClose:na})}function pa(de){de.stopPropagation()}KA(()=>(Y(Ae()),c(GA),Y(QA()),Fh),()=>{if(!_q(Ae(),c(GA))){if(t("parser changed, recreate editor"),W4(QA())){var de=c(GA).stringify(QA().json);QA({json:de!==void 0?Ae().parse(de):void 0})}N(GA,Ae()),N($,Fh())}}),KA(()=>Y(QA()),()=>{var de=n_(QA());de&&console.error("Error: "+de)}),KA(()=>Y(RA()),()=>{RA()===null&&console.warn("selection is invalid: it is null but should be undefined")}),KA(()=>Y(Ae()),()=>{N(A,YB(Ae().parse))}),KA(()=>Y(ue()),()=>{t("mode changed to",ue())}),Vn();var Uo={get:OA,set:wt,update:rt,patch:je,select:ze,expand:pi,collapse:mn,transform:Sn,validate:He,acceptAutoRepair:En,scrollTo:Gi,findElement:gn,focus:Rt,refresh:Qn,updateProps:J,destroy:ut};return di(!0),N_(i,{children:(de,xi)=>{var wn,xn=YQA(),na=at(xn);uq(gA(na),()=>c($),to=>{ta(fV(to,{get externalMode(){return ue()},get content(){return QA()},get selection(){return RA()},get readOnly(){return dA()},get indentation(){return IA()},get tabSize(){return xA()},get truncateTextSize(){return qA()},get statusBar(){return PA()},get askToFormat(){return it()},get mainMenuBar(){return HA()},get navigationBar(){return bA()},get escapeControlCharacters(){return Xe()},get escapeUnicodeCharacters(){return YA()},get flattenColumns(){return hA()},get parser(){return Ae()},get parseMemoizeOne(){return c(A)},get validator(){return pA()},get validationParser(){return te()},get pathParser(){return NA()},insideModal:!1,get onError(){return Ke()},onChange:kn,onChangeMode:So,onSelect:_n,get onRenderValue(){return fe()},get onClassName(){return Zt()},onFocus:Co,onBlur:ia,get onRenderMenu(){return Pe()},get onRenderContextMenu(){return qe()},onSortModal:va,onTransformModal:Ko,onJSONEditorModal:ca,$$legacy:!0}),Wi=>N(oA,Wi),()=>c(oA))});var Ra=kA(na,2),Oi=to=>{(function(Wi,ei){var qn,_o;Jt(ei,!1);var qo=cA(void 0,!0),SA=cA(void 0,!0),ee=cA(void 0,!0),be=cA(void 0,!0),EA=dr("jsoneditor:SortModal"),LA=K(ei,"id",9),Ce=K(ei,"json",9),Te=K(ei,"rootPath",9),gt=K(ei,"onSort",9),dt=K(ei,"onClose",9),Ut={value:1,label:"ascending"},io=[Ut,{value:-1,label:"descending"}],Zi="".concat(LA(),":").concat(xt(Te())),nn=cA((qn=kh()[Zi])===null||qn===void 0?void 0:qn.selectedProperty,!0),ai=cA(((_o=kh()[Zi])===null||_o===void 0?void 0:_o.selectedDirection)||Ut,!0),Xi=cA(void 0,!0);function Na(){try{var It,$i,cn;N(Xi,void 0);var Io=((It=c(nn))===null||It===void 0?void 0:It.value)||(($i=c(be))===null||$i===void 0||($i=$i[0])===null||$i===void 0?void 0:$i.value)||[],Rn=(cn=c(ai))===null||cn===void 0?void 0:cn.value,Tt=mW(Ce(),Te(),Io,Rn);gt()!==void 0&&Te()!==void 0&>()({operations:Tt,rootPath:Te(),itemPath:Io,direction:Rn}),dt()()}catch(fa){N(Xi,String(fa))}}function Vt(It){It.focus()}KA(()=>(Y(Ce()),Y(Te())),()=>{N(qo,$e(Ce(),Te()))}),KA(()=>c(qo),()=>{N(SA,Array.isArray(c(qo)))}),KA(()=>(c(SA),c(qo)),()=>{N(ee,c(SA)?x_(c(qo)):void 0)}),KA(()=>(c(ee),j2),()=>{N(be,c(ee)?c(ee).map(j2):void 0)}),KA(()=>(kh(),c(nn),c(ai)),()=>{kh(kh()[Zi]={selectedProperty:c(nn),selectedDirection:c(ai)}),EA("store state in memory",Zi,kh()[Zi])}),Vn(),di(!0),np(Wi,{get onClose(){return dt()},className:"jse-sort-modal",children:(It,$i)=>{var cn=JQA(),Io=at(cn),Rn=lt(()=>c(SA)?"Sort array items":"Sort object keys");o5(Io,{get title(){return c(Rn)},get onClose(){return dt()}});var Tt=gA(kA(Io,2)),fa=kA(gA(Tt)),oa=gA(fa),y=kA(gA(oa)),b=gA(y),R=kA(oa),W=ge=>{var pe=TQA(),Ve=kA(gA(pe));Hd(gA(Ve),{showChevron:!0,get items(){return c(be)},get value(){return c(nn)},set value(Ue){N(nn,Ue)},$$legacy:!0}),sA(ge,pe)};zA(R,ge=>{c(SA),c(be),uA(()=>{var pe;return c(SA)&&c(be)&&((pe=c(be))===null||pe===void 0?void 0:pe.length)>1})&&ge(W)});var _=kA(R),q=kA(gA(_));Hd(gA(q),{showChevron:!0,clearable:!1,get items(){return io},get value(){return c(ai)},set value(ge){N(ai,ge)},$$legacy:!0});var tA=kA(Tt,2),rA=gA(tA),DA=ge=>{var pe=OQA(),Ve=gA(pe);Le(()=>Ht(Ve,c(Xi))),sA(ge,pe)};zA(rA,ge=>{c(Xi)&&ge(DA)});var ae=gA(kA(tA,2));Tr(()=>De("click",ae,Na)),Ms(ae,ge=>Vt?.(ge)),Le(ge=>{tI(b,ge),ae.disabled=(c(SA),c(be),c(nn),uA(()=>{var pe;return!!(c(SA)&&c(be)&&((pe=c(be))===null||pe===void 0?void 0:pe.length)>1)&&!c(nn)}))},[()=>(Y(Te()),Y(An),Y(El),uA(()=>Te()&&!An(Te())?El(Te()):"(document root)"))]),sA(It,cn)},$$slots:{default:!0}}),Yt()})(to,t1(()=>c(he),{onClose:()=>{var Wi;(Wi=c(he))===null||Wi===void 0||Wi.onClose(),N(he,void 0)}}))};zA(Ra,to=>{c(he)&&to(Oi)});var ko=kA(Ra,2),ar=to=>{jEA(to,t1(()=>c(me),{onClose:()=>{var Wi;(Wi=c(me))===null||Wi===void 0||Wi.onClose(),N(me,void 0)}}))};zA(ko,to=>{c(me)&&to(ar)});var To=kA(ko,2),ja=to=>{(function(Wi,ei){Jt(ei,!1);var qn=cA(void 0,!0),_o=cA(void 0,!0),qo=cA(void 0,!0),SA=cA(void 0,!0),ee=dr("jsoneditor:JSONEditorModal"),be=K(ei,"content",9),EA=K(ei,"path",9),LA=K(ei,"onPatch",9),Ce=K(ei,"readOnly",9),Te=K(ei,"indentation",9),gt=K(ei,"tabSize",9),dt=K(ei,"truncateTextSize",9),Ut=K(ei,"mainMenuBar",9),io=K(ei,"navigationBar",9),Zi=K(ei,"statusBar",9),nn=K(ei,"askToFormat",9),ai=K(ei,"escapeControlCharacters",9),Xi=K(ei,"escapeUnicodeCharacters",9),Na=K(ei,"flattenColumns",9),Vt=K(ei,"parser",9),It=K(ei,"validator",9),$i=K(ei,"validationParser",9),cn=K(ei,"pathParser",9),Io=K(ei,"onRenderValue",9),Rn=K(ei,"onClassName",9),Tt=K(ei,"onRenderMenu",9),fa=K(ei,"onRenderContextMenu",9),oa=K(ei,"onSortModal",9),y=K(ei,"onTransformModal",9),b=K(ei,"onClose",9),R=cA(void 0,!0),W=cA(void 0,!0),_={mode:rA(be()),content:be(),selection:void 0,relativePath:EA()},q=cA([_],!0),tA=cA(void 0,!0);function rA(fA){return W4(fA)&&sa(fA.json)?xa.table:xa.tree}function DA(){var fA,ZA=(fA=Ji(c(q)))===null||fA===void 0?void 0:fA.selection;Ap(ZA)&&c(R).scrollTo(Qt(ZA))}function ae(){if(ee("handleApply"),!Ce())try{N(tA,void 0);var fA=c(qn).relativePath,ZA=c(qn).content,Ye=[{op:"replace",path:xt(fA),value:xj(ZA,Vt()).json}];if(c(q).length>1){var Me=xj(c(q)[c(q).length-2].content,Vt()).json,Re={json:ol(Me,Ye)},ct=Fe(Fe({},c(q)[c(q).length-2]||_),{},{content:Re});N(q,[...c(q).slice(0,c(q).length-2),ct]),jo(),DA()}else LA()(Ye),b()()}catch(ti){N(tA,String(ti))}}function ge(){if(ee("handleClose"),c(W))N(W,!1);else if(c(q).length>1){var fA;N(q,an(c(q))),jo(),(fA=c(R))===null||fA===void 0||fA.focus(),DA(),N(tA,void 0)}else b()()}function pe(fA){ee("handleChange",fA),Je(ZA=>Fe(Fe({},ZA),{},{content:fA}))}function Ve(fA){ee("handleChangeSelection",fA),Je(ZA=>Fe(Fe({},ZA),{},{selection:fA}))}function Ue(fA){ee("handleChangeMode",fA),Je(ZA=>Fe(Fe({},ZA),{},{mode:fA}))}function Je(fA){var ZA=fA(Ji(c(q)));N(q,[...an(c(q)),ZA])}function Ei(fA){N(tA,fA.toString()),console.error(fA)}function no(fA){var ZA,{content:Ye,path:Me}=fA;ee("handleJSONEditorModal",{content:Ye,path:Me});var Re={mode:rA(Ye),content:Ye,selection:void 0,relativePath:Me};N(q,[...c(q),Re]),jo(),(ZA=c(R))===null||ZA===void 0||ZA.focus()}function AA(fA){fA.focus()}os(()=>{var fA;(fA=c(R))===null||fA===void 0||fA.focus()}),KA(()=>c(q),()=>{N(qn,Ji(c(q))||_)}),KA(()=>c(q),()=>{N(_o,c(q).flatMap(fA=>fA.relativePath))}),KA(()=>(c(_o),El),()=>{N(qo,An(c(_o))?"(document root)":El(c(_o)))}),KA(()=>Y(Vt()),()=>{N(SA,YB(Vt().parse))}),Vn(),di(!0),np(Wi,{onClose:ge,className:"jse-jsoneditor-modal",get fullscreen(){return c(W)},children:(fA,ZA)=>{var Ye=KQA();N_(gA(Ye),{children:(Me,Re)=>{var ct=GQA(),ti=at(ct),ji=lt(()=>(c(q),uA(()=>c(q).length>1?" (".concat(c(q).length,")"):"")));o5(ti,{get title(){var si;return"Edit nested content ".concat((si=c(ji))!==null&&si!==void 0?si:"")},fullScreenButton:!0,onClose:ge,get fullscreen(){return c(W)},set fullscreen(si){N(W,si)},$$legacy:!0});var Wn=kA(ti,2),Cn=kA(gA(Wn),2),xo=kA(Cn,4);ta(fV(gA(xo),{get externalMode(){return c(qn),uA(()=>c(qn).mode)},get content(){return c(qn),uA(()=>c(qn).content)},get selection(){return c(qn),uA(()=>c(qn).selection)},get readOnly(){return Ce()},get indentation(){return Te()},get tabSize(){return gt()},get truncateTextSize(){return dt()},get statusBar(){return Zi()},get askToFormat(){return nn()},get mainMenuBar(){return Ut()},get navigationBar(){return io()},get escapeControlCharacters(){return ai()},get escapeUnicodeCharacters(){return Xi()},get flattenColumns(){return Na()},get parser(){return Vt()},get parseMemoizeOne(){return c(SA)},get validator(){return It()},get validationParser(){return $i()},get pathParser(){return cn()},insideModal:!0,onError:Ei,onChange:pe,onChangeMode:Ue,onSelect:Ve,get onRenderValue(){return Io()},get onClassName(){return Rn()},get onFocus(){return ug},get onBlur(){return ug},get onRenderMenu(){return Tt()},get onRenderContextMenu(){return fa()},get onSortModal(){return oa()},get onTransformModal(){return y()},onJSONEditorModal:no,$$legacy:!0}),si=>N(R,si),()=>c(R));var ri=gA(kA(xo,2)),Ca=si=>{var _t=RQA(),fi=gA(_t);Le(()=>Ht(fi,c(tA))),sA(si,_t)};zA(ri,si=>{c(tA)&&si(Ca)});var Bo=kA(ri,2),da=si=>{var _t=NQA();Bn(gA(_t),{get data(){return eJ}}),De("click",_t,ge),sA(si,_t)};zA(Bo,si=>{c(q),uA(()=>c(q).length>1)&&si(da)});var Nn=kA(Bo,2),qt=si=>{var _t=FQA();Tr(()=>De("click",_t,ae)),Ms(_t,fi=>AA?.(fi)),sA(si,_t)},un=si=>{var _t=LQA();De("click",_t,ge),sA(si,_t)};zA(Nn,si=>{Ce()?si(un,!1):si(qt)}),Le(()=>tI(Cn,c(qo))),sA(Me,ct)},$$slots:{default:!0}}),sA(fA,Ye)},$$slots:{default:!0}}),Yt()})(to,t1(()=>c(UA),{onClose:()=>{var Wi;(Wi=c(UA))===null||Wi===void 0||Wi.onClose(),N(UA,void 0)}}))};zA(To,to=>{c(UA)&&to(ja)}),Le(()=>wn=Ci(na,1,"jse-main svelte-1l55585",null,wn,{"jse-focus":c(iA)})),De("keydown",na,pa),sA(de,xn)},$$slots:{default:!0}}),Ai(e,"get",OA),Ai(e,"set",wt),Ai(e,"update",rt),Ai(e,"patch",je),Ai(e,"select",ze),Ai(e,"expand",pi),Ai(e,"collapse",mn),Ai(e,"transform",Sn),Ai(e,"validate",He),Ai(e,"acceptAutoRepair",En),Ai(e,"scrollTo",Gi),Ai(e,"findElement",gn),Ai(e,"focus",Rt),Ai(e,"refresh",Qn),Ai(e,"updateProps",J),Ai(e,"destroy",ut),Yt(Uo)}function FW(i){var{target:e,props:A}=i,t=xdA(HQA,{target:e,props:A});return t.destroy=Xt(function*(){return(function(n,o){var a=S_.get(n);return a?(S_.delete(n),a(o)):Promise.resolve()})(t)}),jo(),t}var Dc=class i{constructor(e){this.el=e}jsonString;editor=null;ngAfterViewInit(){let e={text:this.jsonString};setTimeout(()=>{this.editor=FW({target:document.getElementById("json-editor"),props:{content:e,mode:xa.text,mainMenuBar:!1,statusBar:!1}})})}getJsonString(){return this.editor?.get().text}static \u0275fac=function(A){return new(A||i)(st(ce))};static \u0275cmp=vA({type:i,selectors:[["app-json-editor"]],inputs:{jsonString:"jsonString"},decls:1,vars:0,consts:[["id","json-editor",1,"json-editor-container","jse-theme-dark"]],template:function(A,t){A&1&&$n(0,"div",0)},styles:[".jse-theme-dark[_ngcontent-%COMP%]{--jse-theme: dark;--jse-theme-color: #2f6dd0;--jse-theme-color-highlight: #467cd2;--jse-background-color: #1e1e1e;--jse-text-color: #d4d4d4;--jse-text-color-inverse: #4d4d4d;--jse-main-border: 1px solid #4f4f4f;--jse-menu-color: #fff;--jse-modal-background: #2f2f2f;--jse-modal-overlay-background: rgba(0, 0, 0, .5);--jse-modal-code-background: #2f2f2f;--jse-tooltip-color: var(--jse-text-color);--jse-tooltip-background: #4b4b4b;--jse-tooltip-border: 1px solid #737373;--jse-tooltip-action-button-color: inherit;--jse-tooltip-action-button-background: #737373;--jse-panel-background: #333333;--jse-panel-background-border: 1px solid #464646;--jse-panel-color: var(--jse-text-color);--jse-panel-color-readonly: #737373;--jse-panel-border: 1px solid #3c3c3c;--jse-panel-button-color-highlight: #e5e5e5;--jse-panel-button-background-highlight: #464646;--jse-navigation-bar-background: #656565;--jse-navigation-bar-background-highlight: #7e7e7e;--jse-navigation-bar-dropdown-color: var(--jse-text-color);--jse-context-menu-background: #4b4b4b;--jse-context-menu-background-highlight: #595959;--jse-context-menu-separator-color: #595959;--jse-context-menu-color: var(--jse-text-color);--jse-context-menu-pointer-background: #737373;--jse-context-menu-pointer-background-highlight: #818181;--jse-context-menu-pointer-color: var(--jse-context-menu-color);--jse-key-color: #9cdcfe;--jse-value-color: var(--jse-text-color);--jse-value-color-number: #b5cea8;--jse-value-color-boolean: #569cd6;--jse-value-color-null: #569cd6;--jse-value-color-string: #ce9178;--jse-value-color-url: #ce9178;--jse-delimiter-color: #949494;--jse-edit-outline: 2px solid var(--jse-text-color);--jse-selection-background-color: #464646;--jse-selection-background-inactive-color: #333333;--jse-hover-background-color: #343434;--jse-active-line-background-color: rgba(255, 255, 255, .06);--jse-search-match-background-color: #343434;--jse-collapsed-items-background-color: #333333;--jse-collapsed-items-selected-background-color: #565656;--jse-collapsed-items-link-color: #b2b2b2;--jse-collapsed-items-link-color-highlight: #ec8477;--jse-search-match-color: #724c27;--jse-search-match-outline: 1px solid #966535;--jse-search-match-active-color: #9f6c39;--jse-search-match-active-outline: 1px solid #bb7f43;--jse-tag-background: #444444;--jse-tag-color: #bdbdbd;--jse-table-header-background: #333333;--jse-table-header-background-highlight: #424242;--jse-table-row-odd-background: rgba(255, 255, 255, .1);--jse-input-background: #3d3d3d;--jse-input-border: var(--jse-main-border);--jse-button-background: #808080;--jse-button-background-highlight: #7a7a7a;--jse-button-color: #e0e0e0;--jse-button-secondary-background: #494949;--jse-button-secondary-background-highlight: #5d5d5d;--jse-button-secondary-background-disabled: #9d9d9d;--jse-button-secondary-color: var(--jse-text-color);--jse-a-color: #55abff;--jse-a-color-highlight: #4387c9;--jse-svelte-select-background: #3d3d3d;--jse-svelte-select-border: 1px solid #4f4f4f;--list-background: #3d3d3d;--item-hover-bg: #505050;--multi-item-bg: #5b5b5b;--input-color: #d4d4d4;--multi-clear-bg: #8a8a8a;--multi-item-clear-icon-color: #d4d4d4;--multi-item-outline: 1px solid #696969;--list-shadow: 0 2px 8px 0 rgba(0, 0, 0, .4);--jse-color-picker-background: #656565;--jse-color-picker-border-box-shadow: #8c8c8c 0 0 0 1px}.json-editor-container[_ngcontent-%COMP%]{height:100%} .jse-message.jse-error{display:none} .cm-gutters.cm-gutters-before{display:none} .jse-text-mode{border-radius:10px} .jse-contents{border-radius:10px;border-bottom:1px solid #4f4f4f}"]})};var zQA=(i,e)=>e.name;function PQA(i,e){if(i&1&&D(0),i&2){let A=p();Ee(" Configure ",A.selectedBuiltInTool," ")}}function jQA(i,e){if(i&1&&D(0),i&2){let A=p();Ee(" ",A.isEditMode?"Edit Built-in Tool":"Add Built-in Tool"," ")}}function VQA(i,e){if(i&1){let A=aA();I(0,"div",8),U("click",function(){let n=L(A).$implicit,o=p(3);return G(o.onToolSelected(n))}),I(1,"mat-icon",9),D(2),h(),I(3,"span",10),D(4),h()()}if(i&2){let A=e.$implicit,t=p(3);_A("selected",t.selectedBuiltInTool===A),Q(2),nA(t.getToolIcon(A)),Q(2),nA(A)}}function qQA(i,e){if(i&1&&(I(0,"div",4)(1,"h3",5),D(2),h(),I(3,"div",6),ke(4,VQA,5,4,"div",7,ni),h()()),i&2){let A=e.$implicit;Q(2),nA(A.name),Q(2),_e(A.tools)}}function WQA(i,e){if(i&1&&(I(0,"div",1),ke(1,qQA,6,1,"div",4,zQA),h()),i&2){let A=p();Q(),_e(A.toolCategories)}}function ZQA(i,e){if(i&1&&(I(0,"div",2)(1,"h3",11),D(2,"Configure Tool Arguments"),h(),lA(3,"app-json-editor",12),h()),i&2){let A=p();Q(3),H("jsonString",A.toolArgsString)}}function XQA(i,e){if(i&1){let A=aA();I(0,"button",14),U("click",function(){L(A);let n=p(2);return G(n.backToToolSelection())}),D(1,"Back"),h()}}function $QA(i,e){if(i&1){let A=aA();T(0,XQA,2,0,"button",13),I(1,"button",14),U("click",function(){L(A);let n=p();return G(n.saveArgs())}),D(2),h()}if(i&2){let A=p();O(A.isEditMode?-1:0),Q(2),nA(A.isEditMode?"Save":"Create")}}function AuA(i,e){if(i&1){let A=aA();I(0,"button",14),U("click",function(){L(A);let n=p();return G(n.cancel())}),D(1,"Cancel"),h(),I(2,"button",15),U("click",function(){L(A);let n=p();return G(n.addTool())}),D(3),h()}if(i&2){let A=p();Q(3),Ee(" ",A.isEditMode?"Save":"Create"," ")}}var sI=class i{constructor(e,A){this.data=e;this.dialogRef=A}jsonEditorComponent;selectedBuiltInTool="google_search";toolCategories=[{name:"Search Tools",tools:["google_search","EnterpriseWebSearchTool","VertexAiSearchTool"]},{name:"Context Tools",tools:["FilesRetrieval","load_memory","preload_memory","url_context","VertexAiRagRetrieval"]},{name:"Agent Function Tools",tools:["exit_loop","get_user_choice","load_artifacts","LongRunningFunctionTool"]}];builtInToolArgs=new Map([["EnterpriseWebSearchTool",[]],["exit_loop",[]],["FilesRetrieval",["name","description","input_dir"]],["get_user_choice",[]],["google_search",[]],["load_artifacts",[]],["load_memory",[]],["LongRunningFunctionTool",["func"]],["preload_memory",[]],["url_context",[]],["VertexAiRagRetrieval",["name","description","rag_corpora","rag_resources","similarity_top_k","vector_distance_threshold"]],["VertexAiSearchTool",["data_store_id","data_store_specs","search_engine_id","filter","max_results"]]]);isEditMode=!1;showArgsEditor=!1;toolArgs={};toolArgsString="";ngOnInit(){if(this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName){this.selectedBuiltInTool=this.data.toolName;let e=this.builtInToolArgs.get(this.data.toolName);if(e&&e.length>0){if(this.data.toolArgs)this.toolArgs=P({},this.data.toolArgs),delete this.toolArgs.skip_summarization;else{this.toolArgs={};for(let A of e)this.toolArgs[A]=""}this.toolArgsString=JSON.stringify(this.toolArgs,null,2),this.showArgsEditor=!0}}}onToolSelected(e){this.selectedBuiltInTool=e;let A=this.builtInToolArgs.get(e);A&&A.length>0&&(this.initializeToolArgs(e,A),this.showArgsEditor=!0)}initializeToolArgs(e,A){this.toolArgs={};for(let t of A)this.toolArgs[t]="";this.toolArgsString=JSON.stringify(this.toolArgs,null,2)}backToToolSelection(){this.showArgsEditor=!1,this.toolArgs={},this.toolArgsString=""}saveArgs(){if(this.jsonEditorComponent)try{this.toolArgsString=this.jsonEditorComponent.getJsonString(),this.toolArgs=JSON.parse(this.toolArgsString)}catch(e){alert("Invalid JSON: "+e);return}this.addTool()}addTool(){let e={toolType:"Built-in tool",name:this.selectedBuiltInTool,isEditMode:this.isEditMode};Object.keys(this.toolArgs).length>0&&(e.args=this.toolArgs),this.dialogRef.close(e)}cancel(){this.dialogRef.close()}getToolIcon(e){return UB(e,"Built-in tool")}static \u0275fac=function(A){return new(A||i)(st(Do),st(zn))};static \u0275cmp=vA({type:i,selectors:[["app-built-in-tool-dialog"]],viewQuery:function(A,t){if(A&1&&Wt(Dc,5),A&2){let n;se(n=le())&&(t.jsonEditorComponent=n.first)}},decls:9,vars:3,consts:[["mat-dialog-title","",1,"dialog-title"],[1,"tool-categories-container"],[1,"args-editor-container"],["align","end"],[1,"tool-category"],[1,"category-title"],[1,"tool-list"],[1,"tool-item",3,"selected"],[1,"tool-item",3,"click"],[1,"tool-icon"],[1,"tool-name"],[1,"args-editor-title"],[3,"jsonString"],["mat-button",""],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,t){A&1&&(I(0,"h2",0),T(1,PQA,1,1)(2,jQA,1,1),h(),I(3,"mat-dialog-content"),T(4,WQA,3,0,"div",1)(5,ZQA,4,1,"div",2),h(),I(6,"mat-dialog-actions",3),T(7,$QA,3,2)(8,AuA,4,1),h()),A&2&&(Q(),O(t.showArgsEditor?1:2),Q(3),O(t.showArgsEditor?5:4),Q(3),O(t.showArgsEditor?7:8))},dependencies:[li,fn,Xo,Ba,zt,ha,ki,Dc],styles:[".dialog-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-subhead-color)!important;font-family:Google Sans;font-size:24px}.tool-categories-container[_ngcontent-%COMP%]{padding:16px 0}.tool-category[_ngcontent-%COMP%]{margin-bottom:24px}.tool-category[_ngcontent-%COMP%]:last-child{margin-bottom:0}.category-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin:0 0 12px;padding-left:8px}.tool-list[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;padding:12px 16px;border-radius:8px;cursor:pointer;transition:all .2s ease;border:1px solid var(--builder-tool-item-border-color);min-width:0}.tool-item.selected[_ngcontent-%COMP%]{border:1px solid #8ab4f8}.tool-item[_ngcontent-%COMP%] .tool-icon[_ngcontent-%COMP%]{color:#8ab4f8;margin-right:12px;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-item[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%]{font-family:Google Sans;font-size:14px;color:var(--mdc-dialog-supporting-text-color)!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.args-editor-container[_ngcontent-%COMP%]{padding:16px 0}.args-editor-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin:0 0 16px}"]})};function euA(i,e){if(i&1){let A=aA();vl(0),I(1,"div",6)(2,"div",7),U("click",function(){L(A);let n=p();return G(n.toggleToolInfo())}),I(3,"mat-icon",8),D(4,"info"),h(),I(5,"div",9)(6,"span"),D(7,"Tool Information"),h()(),I(8,"button",10)(9,"mat-icon"),D(10),h()()(),I(11,"div",11)(12,"div",12)(13,"div",13),D(14),h(),I(15,"div",14),D(16),h()(),I(17,"div",15)(18,"a",16)(19,"mat-icon"),D(20,"open_in_new"),h(),I(21,"span"),D(22,"View Official Documentation"),h()()()()(),bl()}if(i&2){let A,t,n,o=p();Q(10),nA(o.isToolInfoExpanded?"expand_less":"expand_more"),Q(),_A("expanded",o.isToolInfoExpanded),Q(3),nA((A=o.getToolInfo())==null?null:A.shortDescription),Q(2),nA((t=o.getToolInfo())==null?null:t.detailedDescription),Q(2),H("href",(n=o.getToolInfo())==null?null:n.docLink,mo)}}function tuA(i,e){i&1&&(I(0,"mat-hint",19),D(1," Start with a letter or underscore, and contain only letters, digits, and underscores. "),h())}function iuA(i,e){if(i&1){let A=aA();I(0,"mat-form-field",2)(1,"mat-label"),D(2),h(),I(3,"input",17),Ni("ngModelChange",function(n){L(A);let o=p();return wi(o.inputValue,n)||(o.inputValue=n),G(n)}),U("keydown",function(n){L(A);let o=p();return G(o.onKeyDown(n))}),h(),kt(4,tuA,2,0,"mat-hint",18),h()}if(i&2){let A=p();Q(2),nA(A.data.inputLabel||"Input"),Q(),Ri("ngModel",A.inputValue),H("placeholder",A.data.inputPlaceholder||"Enter value"),Q(),H("ngIf",!A.isInputValid())}}var vc=class i{constructor(e,A){this.dialogRef=e;this.data=A;this.inputValue=A.inputValue||""}inputValue="";isToolInfoExpanded=!1;isInputValid(){let e=this.inputValue.trim();return!(!e||!/^[a-zA-Z_]/.test(e)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))}onCancel(){this.dialogRef.close()}onConfirm(){if(this.data.showInput){let e=this.inputValue.trim();if(!this.isInputValid())return;this.dialogRef.close(e)}else this.dialogRef.close("confirm")}onKeyDown(e){e.key==="Enter"&&this.data.showInput&&this.onConfirm()}getToolInfo(){if(this.data.toolType)return nc.getToolDetailedInfo(this.data.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \u0275fac=function(A){return new(A||i)(st(zn),st(Do))};static \u0275cmp=vA({type:i,selectors:[["app-confirmation-dialog"]],decls:12,vars:6,consts:[["mat-dialog-title",""],[4,"ngIf"],[2,"width","100%","margin-top","16px"],["align","end"],["mat-button","",3,"click"],["mat-button","","color","primary","cdkFocusInitial","",3,"click","disabled"],[1,"tool-info-container"],[1,"tool-info-header",3,"click"],[1,"tool-info-icon"],[1,"tool-info-title"],["mat-icon-button","","type","button","aria-label","Toggle tool information",1,"tool-info-toggle"],[1,"tool-info-body"],[1,"tool-info-content"],[1,"tool-info-short"],[1,"tool-info-detailed"],[1,"tool-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"tool-info-link",3,"href"],["matInput","","cdkFocusInitial","",3,"ngModelChange","keydown","ngModel","placeholder"],["style","font-size: 11px; color: #666;",4,"ngIf"],[2,"font-size","11px","color","#666"]],template:function(A,t){A&1&&(I(0,"h2",0),D(1),h(),I(2,"mat-dialog-content"),kt(3,euA,23,6,"ng-container",1),I(4,"p"),D(5),h(),T(6,iuA,5,4,"mat-form-field",2),h(),I(7,"mat-dialog-actions",3)(8,"button",4),U("click",function(){return t.onCancel()}),D(9,"Cancel"),h(),I(10,"button",5),U("click",function(){return t.onConfirm()}),D(11),h()()),A&2&&(Q(),nA(t.data.title),Q(2),H("ngIf",t.data.showToolInfo&&t.getToolInfo()),Q(2),nA(t.data.message),Q(),O(t.data.showInput?6:-1),Q(4),H("disabled",t.data.showInput&&!t.isInputValid()),Q(),Ee(" ",t.data.confirmButtonText||"Confirm"," "))},dependencies:[li,ql,qi,ki,yi,zt,Xo,Ba,ha,Za,Zo,xs,J1,Ws,ka,fn,Gn,Kn,Ho],styles:["mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px;color:var(--mdc-dialog-supporting-text-color)}mat-dialog-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)}.tool-info-container[_ngcontent-%COMP%]{border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:var(--mdc-dialog-supporting-text-color)!important;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};var KW=["*",[["mat-chip-avatar"],["","matChipAvatar",""]],[["mat-chip-trailing-icon"],["","matChipRemove",""],["","matChipTrailingIcon",""]]],UW=["*","mat-chip-avatar, [matChipAvatar]","mat-chip-trailing-icon,[matChipRemove],[matChipTrailingIcon]"];function nuA(i,e){i&1&&(I(0,"span",3),Ze(1,1),h())}function ouA(i,e){i&1&&(I(0,"span",6),Ze(1,2),h())}function auA(i,e){i&1&&(I(0,"span",3),Ze(1,1),I(2,"span",7),Et(),I(3,"svg",8),lA(4,"path",9),h()()())}function ruA(i,e){i&1&&(I(0,"span",6),Ze(1,2),h())}var suA=`.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}@media(forced-colors: active){.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{forced-color-adjust:none}}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-outline-width, 1px);border-radius:var(--mat-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mat-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--secondary{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mat-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mat-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mat-chip-with-avatar-avatar-size, 24px);height:var(--mat-chip-with-avatar-avatar-size, 24px);font-size:var(--mat-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__graphic{padding-left:0}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mat-chip-container-shape-radius, 8px);height:var(--mat-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mat-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mat-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mat-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mat-chip-with-icon-icon-size, 18px);height:var(--mat-chip-with-icon-icon-size, 18px);font-size:var(--mat-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mat-chip-with-icon-icon-color: var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mat-chip-elevated-container-color: var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mat-chip-label-text-color: var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mat-chip-outline-width: var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mat-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mat-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-edit,.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-edit:focus,.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-edit:hover::after,.mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-chip-edit:focus::after,.mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:focus::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:hover::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mat-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-edit::before,.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus-visible .mat-focus-indicator::before{content:""}.mdc-evolution-chip__icon,.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{min-height:fit-content}img.mdc-evolution-chip__icon{min-height:0} -`;var TW=["*"],luA=`.mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-moz-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-webkit-input-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input:-ms-input-placeholder{opacity:1}.mat-mdc-chip-set+input.mat-mdc-chip-input{margin-left:0;margin-right:0} -`,Rx=new MA("mat-chips-default-options",{providedIn:"root",factory:()=>({separatorKeyCodes:[13]})}),kx=new MA("MatChipAvatar"),LW=new MA("MatChipTrailingIcon"),GW=new MA("MatChipEdit"),_x=new MA("MatChipRemove"),Nx=new MA("MatChip"),OW=(()=>{class i{_elementRef=w(ce);_parentChip=w(Nx);_isPrimary=!0;_isLeading=!1;get disabled(){return this._disabled||this._parentChip?.disabled||!1}set disabled(A){this._disabled=A}_disabled=!1;tabIndex=-1;_allowFocusWhenDisabled=!1;_getDisabledAttribute(){return this.disabled&&!this._allowFocusWhenDisabled?"":null}constructor(){w(Eo).load(Qr),this._elementRef.nativeElement.nodeName==="BUTTON"&&this._elementRef.nativeElement.setAttribute("type","button")}focus(){this._elementRef.nativeElement.focus()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","matChipContent",""]],hostAttrs:[1,"mat-mdc-chip-action","mdc-evolution-chip__action","mdc-evolution-chip__action--presentational"],hostVars:8,hostBindings:function(t,n){t&2&&(ie("disabled",n._getDisabledAttribute())("aria-disabled",n.disabled),_A("mdc-evolution-chip__action--primary",n._isPrimary)("mdc-evolution-chip__action--secondary",!n._isPrimary)("mdc-evolution-chip__action--trailing",!n._isPrimary&&!n._isLeading))},inputs:{disabled:[2,"disabled","disabled",Qe],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?-1:yn(A)],_allowFocusWhenDisabled:"_allowFocusWhenDisabled"}})}return i})(),Fx=(()=>{class i extends OW{_getTabindex(){return this.disabled&&!this._allowFocusWhenDisabled?null:this.tabIndex.toString()}_handleClick(A){!this.disabled&&this._isPrimary&&(A.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!this.disabled&&this._isPrimary&&!this._parentChip._isEditing&&(A.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["","matChipAction",""]],hostVars:3,hostBindings:function(t,n){t&1&&U("click",function(a){return n._handleClick(a)})("keydown",function(a){return n._handleKeydown(a)}),t&2&&(ie("tabindex",n._getTabindex()),_A("mdc-evolution-chip__action--presentational",!1))},features:[bt]})}return i})(),JW=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["mat-chip-avatar"],["","matChipAvatar",""]],hostAttrs:["role","img",1,"mat-mdc-chip-avatar","mdc-evolution-chip__icon","mdc-evolution-chip__icon--primary"],features:[pt([{provide:kx,useExisting:i}])]})}return i})();var YW=(()=>{class i extends Fx{_isPrimary=!1;_handleClick(A){this.disabled||(A.stopPropagation(),A.preventDefault(),this._parentChip.remove())}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!this.disabled&&(A.stopPropagation(),A.preventDefault(),this._parentChip.remove())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["","matChipRemove",""]],hostAttrs:["role","button",1,"mat-mdc-chip-remove","mat-mdc-chip-trailing-icon","mat-focus-indicator","mdc-evolution-chip__icon","mdc-evolution-chip__icon--trailing"],hostVars:1,hostBindings:function(t,n){t&2&&ie("aria-hidden",null)},features:[pt([{provide:_x,useExisting:i}]),bt]})}return i})(),Qp=(()=>{class i{_changeDetectorRef=w(Mt);_elementRef=w(ce);_tagName=w(LN);_ngZone=w(We);_focusMonitor=w(rr);_globalRippleOptions=w($C,{optional:!0});_document=w(ci);_onFocus=new ne;_onBlur=new ne;_isBasicChip=!1;role=null;_hasFocusInternal=!1;_pendingFocus=!1;_actionChanges;_animationsDisabled=In();_allLeadingIcons;_allTrailingIcons;_allEditIcons;_allRemoveIcons;_hasFocus(){return this._hasFocusInternal}id=w(Dn).getId("mat-mdc-chip-");ariaLabel=null;ariaDescription=null;_chipListDisabled=!1;_hadFocusOnRemove=!1;_textElement;get value(){return this._value!==void 0?this._value:this._textElement.textContent.trim()}set value(A){this._value=A}_value;color;removable=!0;highlighted=!1;disableRipple=!1;get disabled(){return this._disabled||this._chipListDisabled}set disabled(A){this._disabled=A}_disabled=!1;removed=new FA;destroyed=new FA;basicChipAttrName="mat-basic-chip";leadingIcon;editIcon;trailingIcon;removeIcon;primaryAction;_rippleLoader=w(Y3);_injector=w(St);constructor(){let A=w(Eo);A.load(Qr),A.load(ZC),this._monitorFocus(),this._rippleLoader?.configureRipple(this._elementRef.nativeElement,{className:"mat-mdc-chip-ripple",disabled:this._isRippleDisabled()})}ngOnInit(){this._isBasicChip=this._elementRef.nativeElement.hasAttribute(this.basicChipAttrName)||this._tagName.toLowerCase()===this.basicChipAttrName}ngAfterViewInit(){this._textElement=this._elementRef.nativeElement.querySelector(".mat-mdc-chip-action-label"),this._pendingFocus&&(this._pendingFocus=!1,this.focus())}ngAfterContentInit(){this._actionChanges=Vi(this._allLeadingIcons.changes,this._allTrailingIcons.changes,this._allEditIcons.changes,this._allRemoveIcons.changes).subscribe(()=>this._changeDetectorRef.markForCheck())}ngDoCheck(){this._rippleLoader.setDisabled(this._elementRef.nativeElement,this._isRippleDisabled())}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement),this._actionChanges?.unsubscribe(),this.destroyed.emit({chip:this}),this.destroyed.complete()}remove(){this.removable&&(this._hadFocusOnRemove=this._hasFocus(),this.removed.emit({chip:this}))}_isRippleDisabled(){return this.disabled||this.disableRipple||this._animationsDisabled||this._isBasicChip||!this._hasInteractiveActions()||!!this._globalRippleOptions?.disabled}_hasTrailingIcon(){return!!(this.trailingIcon||this.removeIcon)}_handleKeydown(A){(A.keyCode===8&&!A.repeat||A.keyCode===46)&&(A.preventDefault(),this.remove())}focus(){this.disabled||(this.primaryAction?this.primaryAction.focus():this._pendingFocus=!0)}_getSourceAction(A){return this._getActions().find(t=>{let n=t._elementRef.nativeElement;return n===A||n.contains(A)})}_getActions(){let A=[];return this.editIcon&&A.push(this.editIcon),this.primaryAction&&A.push(this.primaryAction),this.removeIcon&&A.push(this.removeIcon),A}_handlePrimaryActionInteraction(){}_hasInteractiveActions(){return this._getActions().length>0}_edit(A){}_monitorFocus(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{let t=A!==null;t!==this._hasFocusInternal&&(this._hasFocusInternal=t,t?this._onFocus.next({chip:this}):(this._changeDetectorRef.markForCheck(),setTimeout(()=>this._ngZone.run(()=>this._onBlur.next({chip:this})))))})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-basic-chip"],["","mat-basic-chip",""],["mat-chip"],["","mat-chip",""]],contentQueries:function(t,n,o){if(t&1&&ra(o,kx,5)(o,GW,5)(o,LW,5)(o,_x,5)(o,kx,5)(o,LW,5)(o,GW,5)(o,_x,5),t&2){let a;se(a=le())&&(n.leadingIcon=a.first),se(a=le())&&(n.editIcon=a.first),se(a=le())&&(n.trailingIcon=a.first),se(a=le())&&(n.removeIcon=a.first),se(a=le())&&(n._allLeadingIcons=a),se(a=le())&&(n._allTrailingIcons=a),se(a=le())&&(n._allEditIcons=a),se(a=le())&&(n._allRemoveIcons=a)}},viewQuery:function(t,n){if(t&1&&Wt(Fx,5),t&2){let o;se(o=le())&&(n.primaryAction=o.first)}},hostAttrs:[1,"mat-mdc-chip"],hostVars:31,hostBindings:function(t,n){t&1&&U("keydown",function(a){return n._handleKeydown(a)}),t&2&&(Ma("id",n.id),ie("role",n.role)("aria-label",n.ariaLabel),Ao("mat-"+(n.color||"primary")),_A("mdc-evolution-chip",!n._isBasicChip)("mdc-evolution-chip--disabled",n.disabled)("mdc-evolution-chip--with-trailing-action",n._hasTrailingIcon())("mdc-evolution-chip--with-primary-graphic",n.leadingIcon)("mdc-evolution-chip--with-primary-icon",n.leadingIcon)("mdc-evolution-chip--with-avatar",n.leadingIcon)("mat-mdc-chip-with-avatar",n.leadingIcon)("mat-mdc-chip-highlighted",n.highlighted)("mat-mdc-chip-disabled",n.disabled)("mat-mdc-basic-chip",n._isBasicChip)("mat-mdc-standard-chip",!n._isBasicChip)("mat-mdc-chip-with-trailing-icon",n._hasTrailingIcon())("_mat-animation-noopable",n._animationsDisabled))},inputs:{role:"role",id:"id",ariaLabel:[0,"aria-label","ariaLabel"],ariaDescription:[0,"aria-description","ariaDescription"],value:"value",color:"color",removable:[2,"removable","removable",Qe],highlighted:[2,"highlighted","highlighted",Qe],disableRipple:[2,"disableRipple","disableRipple",Qe],disabled:[2,"disabled","disabled",Qe]},outputs:{removed:"removed",destroyed:"destroyed"},exportAs:["matChip"],features:[pt([{provide:Nx,useExisting:i}])],ngContentSelectors:UW,decls:8,vars:2,consts:[[1,"mat-mdc-chip-focus-overlay"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary"],["matChipContent",""],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],[1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"]],template:function(t,n){t&1&&(Ot(KW),lA(0,"span",0),I(1,"span",1)(2,"span",2),T(3,nuA,2,0,"span",3),I(4,"span",4),Ze(5),lA(6,"span",5),h()()(),T(7,ouA,2,0,"span",6)),t&2&&(Q(3),O(n.leadingIcon?3:-1),Q(4),O(n._hasTrailingIcon()?7:-1))},dependencies:[OW],styles:[`.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}@media(forced-colors: active){.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{forced-color-adjust:none}}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-outline-width, 1px);border-radius:var(--mat-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mat-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--secondary{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mat-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mat-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mat-chip-with-avatar-avatar-size, 24px);height:var(--mat-chip-with-avatar-avatar-size, 24px);font-size:var(--mat-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__graphic{padding-left:0}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mat-chip-container-shape-radius, 8px);height:var(--mat-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mat-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mat-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mat-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mat-chip-with-icon-icon-size, 18px);height:var(--mat-chip-with-icon-icon-size, 18px);font-size:var(--mat-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mat-chip-with-icon-icon-color: var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mat-chip-elevated-container-color: var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mat-chip-label-text-color: var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mat-chip-outline-width: var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mat-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mat-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-edit,.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-edit:focus,.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-edit:hover::after,.mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-chip-edit:focus::after,.mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:focus::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:hover::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mat-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-edit::before,.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus-visible .mat-focus-indicator::before{content:""}.mdc-evolution-chip__icon,.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{min-height:fit-content}img.mdc-evolution-chip__icon{min-height:0} -`],encapsulation:2,changeDetection:0})}return i})();var Lx=(()=>{class i extends Qp{_defaultOptions=w(Rx,{optional:!0});chipListSelectable=!0;_chipListMultiple=!1;_chipListHideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get selectable(){return this._selectable&&this.chipListSelectable}set selectable(A){this._selectable=A,this._changeDetectorRef.markForCheck()}_selectable=!0;get selected(){return this._selected}set selected(A){this._setSelectedState(A,!1,!0)}_selected=!1;get ariaSelected(){return this.selectable?this.selected.toString():null}basicChipAttrName="mat-basic-chip-option";selectionChange=new FA;ngOnInit(){super.ngOnInit(),this.role="presentation"}select(){this._setSelectedState(!0,!1,!0)}deselect(){this._setSelectedState(!1,!1,!0)}selectViaInteraction(){this._setSelectedState(!0,!0,!0)}toggleSelected(A=!1){return this._setSelectedState(!this.selected,A,!0),this.selected}_handlePrimaryActionInteraction(){this.disabled||(this.focus(),this.selectable&&this.toggleSelected(!0))}_hasLeadingGraphic(){return this.leadingIcon?!0:!this._chipListHideSingleSelectionIndicator||this._chipListMultiple}_setSelectedState(A,t,n){A!==this.selected&&(this._selected=A,n&&this.selectionChange.emit({source:this,isUserInput:t,selected:this.selected}),this._changeDetectorRef.markForCheck())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275cmp=vA({type:i,selectors:[["mat-basic-chip-option"],["","mat-basic-chip-option",""],["mat-chip-option"],["","mat-chip-option",""]],hostAttrs:[1,"mat-mdc-chip","mat-mdc-chip-option"],hostVars:37,hostBindings:function(t,n){t&2&&(Ma("id",n.id),ie("tabindex",null)("aria-label",null)("aria-description",null)("role",n.role),_A("mdc-evolution-chip",!n._isBasicChip)("mdc-evolution-chip--filter",!n._isBasicChip)("mdc-evolution-chip--selectable",!n._isBasicChip)("mat-mdc-chip-selected",n.selected)("mat-mdc-chip-multiple",n._chipListMultiple)("mat-mdc-chip-disabled",n.disabled)("mat-mdc-chip-with-avatar",n.leadingIcon)("mdc-evolution-chip--disabled",n.disabled)("mdc-evolution-chip--selected",n.selected)("mdc-evolution-chip--selecting",!n._animationsDisabled)("mdc-evolution-chip--with-trailing-action",n._hasTrailingIcon())("mdc-evolution-chip--with-primary-icon",n.leadingIcon)("mdc-evolution-chip--with-primary-graphic",n._hasLeadingGraphic())("mdc-evolution-chip--with-avatar",n.leadingIcon)("mat-mdc-chip-highlighted",n.highlighted)("mat-mdc-chip-with-trailing-icon",n._hasTrailingIcon()))},inputs:{selectable:[2,"selectable","selectable",Qe],selected:[2,"selected","selected",Qe]},outputs:{selectionChange:"selectionChange"},features:[pt([{provide:Qp,useExisting:i},{provide:Nx,useExisting:i}]),bt],ngContentSelectors:UW,decls:8,vars:6,consts:[[1,"mat-mdc-chip-focus-overlay"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary"],["matChipAction","","role","option",3,"_allowFocusWhenDisabled"],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],[1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"],[1,"mdc-evolution-chip__checkmark"],["viewBox","-2 -3 30 30","focusable","false","aria-hidden","true",1,"mdc-evolution-chip__checkmark-svg"],["fill","none","stroke","currentColor","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-evolution-chip__checkmark-path"]],template:function(t,n){t&1&&(Ot(KW),lA(0,"span",0),I(1,"span",1)(2,"button",2),T(3,auA,5,0,"span",3),I(4,"span",4),Ze(5),lA(6,"span",5),h()()(),T(7,ruA,2,0,"span",6)),t&2&&(Q(2),H("_allowFocusWhenDisabled",!0),ie("aria-description",n.ariaDescription)("aria-label",n.ariaLabel)("aria-selected",n.ariaSelected),Q(),O(n._hasLeadingGraphic()?3:-1),Q(4),O(n._hasTrailingIcon()?7:-1))},dependencies:[Fx],styles:[suA],encapsulation:2,changeDetection:0})}return i})();var Gx=(()=>{class i{_elementRef=w(ce);_changeDetectorRef=w(Mt);_dir=w(No,{optional:!0});_lastDestroyedFocusedChipIndex=null;_keyManager;_destroyed=new ne;_defaultRole="presentation";get chipFocusChanges(){return this._getChipStream(A=>A._onFocus)}get chipDestroyedChanges(){return this._getChipStream(A=>A.destroyed)}get chipRemovedChanges(){return this._getChipStream(A=>A.removed)}get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._syncChipsState()}_disabled=!1;get empty(){return!this._chips||this._chips.length===0}get role(){return this._explicitRole?this._explicitRole:this.empty?null:this._defaultRole}tabIndex=0;set role(A){this._explicitRole=A}_explicitRole=null;get focused(){return this._hasFocusedChip()}_chips;_chipActions=new Rg;constructor(){}ngAfterViewInit(){this._setUpFocusManagement(),this._trackChipSetChanges(),this._trackDestroyedFocusedChip()}ngOnDestroy(){this._keyManager?.destroy(),this._chipActions.destroy(),this._destroyed.next(),this._destroyed.complete()}_hasFocusedChip(){return this._chips&&this._chips.some(A=>A._hasFocus())}_syncChipsState(){this._chips?.forEach(A=>{A._chipListDisabled=this._disabled,A._changeDetectorRef.markForCheck()})}focus(){}_handleKeydown(A){this._originatesFromChip(A)&&this._keyManager.onKeydown(A)}_isValidIndex(A){return A>=0&&Athis._elementRef.nativeElement.tabIndex=A))}_getChipStream(A){return this._chips.changes.pipe(Yn(null),Mi(()=>Vi(...this._chips.map(A))))}_originatesFromChip(A){let t=A.target;for(;t&&t!==this._elementRef.nativeElement;){if(t.classList.contains("mat-mdc-chip"))return!0;t=t.parentElement}return!1}_setUpFocusManagement(){this._chips.changes.pipe(Yn(this._chips)).subscribe(A=>{let t=[];A.forEach(n=>n._getActions().forEach(o=>t.push(o))),this._chipActions.reset(t),this._chipActions.notifyOnChanges()}),this._keyManager=new O0(this._chipActions).withVerticalOrientation().withHorizontalOrientation(this._dir?this._dir.value:"ltr").withHomeAndEnd().skipPredicate(A=>this._skipPredicate(A)),this.chipFocusChanges.pipe(yt(this._destroyed)).subscribe(({chip:A})=>{let t=A._getSourceAction(document.activeElement);t&&this._keyManager.updateActiveItem(t)}),this._dir?.change.pipe(yt(this._destroyed)).subscribe(A=>this._keyManager.withHorizontalOrientation(A))}_skipPredicate(A){return A.disabled}_trackChipSetChanges(){this._chips.changes.pipe(Yn(null),yt(this._destroyed)).subscribe(()=>{this.disabled&&Promise.resolve().then(()=>this._syncChipsState()),this._redirectDestroyedChipFocus()})}_trackDestroyedFocusedChip(){this.chipDestroyedChanges.pipe(yt(this._destroyed)).subscribe(A=>{let n=this._chips.toArray().indexOf(A.chip),o=A.chip._hasFocus(),a=A.chip._hadFocusOnRemove&&this._keyManager.activeItem&&A.chip._getActions().includes(this._keyManager.activeItem),r=o||a;this._isValidIndex(n)&&r&&(this._lastDestroyedFocusedChipIndex=n)})}_redirectDestroyedChipFocus(){if(this._lastDestroyedFocusedChipIndex!=null){if(this._chips.length){let A=Math.min(this._lastDestroyedFocusedChipIndex,this._chips.length-1),t=this._chips.toArray()[A];t.disabled?this._chips.length===1?this.focus():this._keyManager.setPreviousItemActive():t.focus()}else this.focus();this._lastDestroyedFocusedChipIndex=null}}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-chip-set"]],contentQueries:function(t,n,o){if(t&1&&ra(o,Qp,5),t&2){let a;se(a=le())&&(n._chips=a)}},hostAttrs:[1,"mat-mdc-chip-set","mdc-evolution-chip-set"],hostVars:1,hostBindings:function(t,n){t&1&&U("keydown",function(a){return n._handleKeydown(a)}),t&2&&ie("role",n.role)},inputs:{disabled:[2,"disabled","disabled",Qe],role:"role",tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:yn(A)]},ngContentSelectors:TW,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(t,n){t&1&&(Ot(),Ln(0,"div",0),Ze(1),Xn())},styles:[`.mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-moz-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-webkit-input-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input:-ms-input-placeholder{opacity:1}.mat-mdc-chip-set+input.mat-mdc-chip-input{margin-left:0;margin-right:0} -`],encapsulation:2,changeDetection:0})}return i})(),xx=class{source;value;constructor(e,A){this.source=e,this.value=A}},guA={provide:cs,useExisting:Va(()=>Kx),multi:!0},Kx=(()=>{class i extends Gx{_onTouched=()=>{};_onChange=()=>{};_defaultRole="listbox";_defaultOptions=w(Rx,{optional:!0});get multiple(){return this._multiple}set multiple(A){this._multiple=A,this._syncListboxProperties()}_multiple=!1;get selected(){let A=this._chips.toArray().filter(t=>t.selected);return this.multiple?A:A[0]}ariaOrientation="horizontal";get selectable(){return this._selectable}set selectable(A){this._selectable=A,this._syncListboxProperties()}_selectable=!0;compareWith=(A,t)=>A===t;required=!1;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncListboxProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get chipSelectionChanges(){return this._getChipStream(A=>A.selectionChange)}get chipBlurChanges(){return this._getChipStream(A=>A._onBlur)}get value(){return this._value}set value(A){this._chips&&this._chips.length&&this._setSelectionByValue(A,!1),this._value=A}_value;change=new FA;_chips=void 0;ngAfterContentInit(){this._chips.changes.pipe(Yn(null),yt(this._destroyed)).subscribe(()=>{this.value!==void 0&&Promise.resolve().then(()=>{this._setSelectionByValue(this.value,!1)}),this._syncListboxProperties()}),this.chipBlurChanges.pipe(yt(this._destroyed)).subscribe(()=>this._blur()),this.chipSelectionChanges.pipe(yt(this._destroyed)).subscribe(A=>{this.multiple||this._chips.forEach(t=>{t!==A.source&&t._setSelectedState(!1,!1,!1)}),A.isUserInput&&this._propagateChanges()})}focus(){if(this.disabled)return;let A=this._getFirstSelectedChip();A&&!A.disabled?A.focus():this._chips.length>0?this._keyManager.setFirstItemActive():this._elementRef.nativeElement.focus()}writeValue(A){A!=null?this.value=A:this.value=void 0}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}_setSelectionByValue(A,t=!0){this._clearSelection(),Array.isArray(A)?A.forEach(n=>this._selectValue(n,t)):this._selectValue(A,t)}_blur(){this.disabled||setTimeout(()=>{this.focused||this._markAsTouched()})}_keydown(A){A.keyCode===9&&super._allowFocusEscape()}_markAsTouched(){this._onTouched(),this._changeDetectorRef.markForCheck()}_propagateChanges(){let A=null;Array.isArray(this.selected)?A=this.selected.map(t=>t.value):A=this.selected?this.selected.value:void 0,this._value=A,this.change.emit(new xx(this,A)),this._onChange(A),this._changeDetectorRef.markForCheck()}_clearSelection(A){this._chips.forEach(t=>{t!==A&&t.deselect()})}_selectValue(A,t){let n=this._chips.find(o=>o.value!=null&&this.compareWith(o.value,A));return n&&(t?n.selectViaInteraction():n.select()),n}_syncListboxProperties(){this._chips&&Promise.resolve().then(()=>{this._chips.forEach(A=>{A._chipListMultiple=this.multiple,A.chipListSelectable=this._selectable,A._chipListHideSingleSelectionIndicator=this.hideSingleSelectionIndicator,A._changeDetectorRef.markForCheck()})})}_getFirstSelectedChip(){return Array.isArray(this.selected)?this.selected.length?this.selected[0]:void 0:this.selected}_skipPredicate(A){return!1}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275cmp=vA({type:i,selectors:[["mat-chip-listbox"]],contentQueries:function(t,n,o){if(t&1&&ra(o,Lx,5),t&2){let a;se(a=le())&&(n._chips=a)}},hostAttrs:[1,"mdc-evolution-chip-set","mat-mdc-chip-listbox"],hostVars:10,hostBindings:function(t,n){t&1&&U("focus",function(){return n.focus()})("blur",function(){return n._blur()})("keydown",function(a){return n._keydown(a)}),t&2&&(Ma("tabIndex",n.disabled||n.empty?-1:n.tabIndex),ie("role",n.role)("aria-required",n.role?n.required:null)("aria-disabled",n.disabled.toString())("aria-multiselectable",n.multiple)("aria-orientation",n.ariaOrientation),_A("mat-mdc-chip-list-disabled",n.disabled)("mat-mdc-chip-list-required",n.required))},inputs:{multiple:[2,"multiple","multiple",Qe],ariaOrientation:[0,"aria-orientation","ariaOrientation"],selectable:[2,"selectable","selectable",Qe],compareWith:"compareWith",required:[2,"required","required",Qe],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",Qe],value:"value"},outputs:{change:"change"},features:[pt([guA]),bt],ngContentSelectors:TW,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(t,n){t&1&&(Ot(),Ln(0,"div",0),Ze(1),Xn())},styles:[luA],encapsulation:2,changeDetection:0})}return i})();var f5=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({providers:[HI,{provide:Rx,useValue:{separatorKeyCodes:[13]}}],imports:[Jc,Di]})}return i})();var zW=(()=>{class i{get vertical(){return this._vertical}set vertical(A){this._vertical=kr(A)}_vertical=!1;get inset(){return this._inset}set inset(A){this._inset=kr(A)}_inset=!1;static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-divider"]],hostAttrs:["role","separator",1,"mat-divider"],hostVars:7,hostBindings:function(t,n){t&2&&(ie("aria-orientation",n.vertical?"vertical":"horizontal"),_A("mat-divider-vertical",n.vertical)("mat-divider-horizontal",!n.vertical)("mat-divider-inset",n.inset))},inputs:{vertical:"vertical",inset:"inset"},decls:0,vars:0,template:function(t,n){},styles:[`.mat-divider{display:block;margin:0;border-top-style:solid;border-top-color:var(--mat-divider-color, var(--mat-sys-outline-variant));border-top-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-vertical{border-top:0;border-right-style:solid;border-right-color:var(--mat-divider-color, var(--mat-sys-outline-variant));border-right-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-inset{margin-left:80px}[dir=rtl] .mat-divider.mat-divider-inset{margin-left:auto;margin-right:80px} -`],encapsulation:2,changeDetection:0})}return i})(),PW=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Di]})}return i})();var m5=class i{themeService=w(og);get currentTheme(){return this.themeService.currentTheme()}get themeIcon(){return this.currentTheme==="light"?"dark_mode":"light_mode"}get themeTooltip(){return this.currentTheme==="light"?"Switch to dark mode":"Switch to light mode"}toggleTheme(){this.themeService.toggleTheme()}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-theme-toggle"]],decls:3,vars:2,consts:[["mat-icon-button","","aria-label","Toggle theme",1,"theme-toggle-button",3,"click","matTooltip"]],template:function(A,t){A&1&&(I(0,"button",0),U("click",function(){return t.toggleTheme()}),I(1,"mat-icon"),D(2),h()()),A&2&&(H("matTooltip",t.themeTooltip),Q(2),nA(t.themeIcon))},dependencies:[Un,zt,qi,yi,Ha,rn],styles:[".theme-toggle-button[_ngcontent-%COMP%]{color:var(--side-panel-mat-icon-color);width:24px;height:24px;padding:0}.theme-toggle-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.theme-toggle-button[_ngcontent-%COMP%]:hover{opacity:.8}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color);border-radius:50%;transition:all .2s ease;margin-right:0!important}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);opacity:1}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}"]})};var jW=(i,e)=>e.name;function CuA(i,e){if(i&1&&D(0),i&2){let A=p().$implicit;Ee(" AgentTool: ",A.name," ")}}function duA(i,e){if(i&1&&D(0),i&2){let A=p().$implicit;Ee(" ",A.name," ")}}function IuA(i,e){i&1&&(I(0,"mat-icon",28),D(1,"chevron_right"),h())}function BuA(i,e){if(i&1){let A=aA();I(0,"div",27),U("click",function(){let n=L(A).$implicit,o=p(2);return G(o.selectAgentFromBreadcrumb(n))}),T(1,CuA,1,1)(2,duA,1,1),h(),T(3,IuA,2,0,"mat-icon",28)}if(i&2){let A=e.$implicit,t=e.$index,n=p(2);_A("current-agent",(n.currentSelectedAgent==null?null:n.currentSelectedAgent.name)===A.name),Q(),O(t===0&&n.isInAgentToolContext()?1:2),Q(2),O(t0?0:-1)}}function buA(i,e){if(i&1){let A=aA();I(0,"div",15)(1,"div",16)(2,"div"),D(3," Tools "),h(),I(4,"div")(5,"button",40,2)(7,"mat-icon"),D(8,"add"),h()(),I(9,"mat-menu",null,3)(11,"button",23),U("click",function(){L(A);let n=p();return G(n.addTool("Function tool"))}),I(12,"span"),D(13,"Function tool"),h()(),I(14,"button",23),U("click",function(){L(A);let n=p();return G(n.addTool("Built-in tool"))}),I(15,"span"),D(16,"Built-in tool"),h()(),I(17,"button",23),U("click",function(){L(A);let n=p();return G(n.createAgentTool())}),I(18,"span"),D(19,"Agent tool"),h()()()()(),T(20,vuA,1,1),mt(21,"async"),h()}if(i&2){let A,t=Bi(10),n=p();Q(5),H("matMenuTriggerFor",t),Q(6),H("matTooltip",n.toolMenuTooltips("Function tool")),Q(3),H("matTooltip",n.toolMenuTooltips("Built-in tool")),Q(3),H("matTooltip",n.toolMenuTooltips("Agent tool")),Q(3),O((A=Ft(21,5,n.toolsMap$))?20:-1,A)}}function MuA(i,e){if(i&1){let A=aA();I(0,"mat-chip",43),U("click",function(){let n=L(A).$implicit,o=p(2);return G(o.selectAgent(n))}),I(1,"mat-icon",44),D(2),h(),I(3,"span",45),D(4),h(),I(5,"button",48),U("click",function(n){let o=L(A).$implicit;return p(2).deleteSubAgent(o.name),G(n.stopPropagation())}),I(6,"mat-icon"),D(7,"cancel"),h()()()}if(i&2){let A=e.$implicit,t=p(2);Q(2),nA(t.getAgentIcon(A.agent_class)),Q(2),nA(A.name)}}function SuA(i,e){if(i&1&&(I(0,"div",20)(1,"mat-chip-set",47),ke(2,MuA,8,2,"mat-chip",42,jW),h()()),i&2){let A=p();Q(2),_e(A.agentConfig.sub_agents)}}function kuA(i,e){if(i&1){let A=aA();lA(0,"mat-divider"),I(1,"div",22),D(2,"Model (LLM) Interaction"),h(),I(3,"button",23),U("click",function(){L(A);let n=p();return G(n.addCallback("before_model"))}),I(4,"span"),D(5,"Before Model"),h()(),I(6,"button",23),U("click",function(){L(A);let n=p();return G(n.addCallback("after_model"))}),I(7,"span"),D(8,"After Model"),h()(),lA(9,"mat-divider"),I(10,"div",22),D(11,"Tool Execution"),h(),I(12,"button",23),U("click",function(){L(A);let n=p();return G(n.addCallback("before_tool"))}),I(13,"span"),D(14,"Before Tool"),h()(),I(15,"button",23),U("click",function(){L(A);let n=p();return G(n.addCallback("after_tool"))}),I(16,"span"),D(17,"After Tool"),h()()}if(i&2){let A=p();Q(3),H("matTooltip",A.callbackMenuTooltips("before_model")),Q(3),H("matTooltip",A.callbackMenuTooltips("after_model")),Q(6),H("matTooltip",A.callbackMenuTooltips("before_tool")),Q(3),H("matTooltip",A.callbackMenuTooltips("after_tool"))}}function _uA(i,e){if(i&1){let A=aA();I(0,"div",52),U("click",function(){let n=L(A).$implicit,o=p(3);return G(o.editCallback(n))}),I(1,"mat-chip",53)(2,"span",54)(3,"span",55),D(4),h(),I(5,"span",56),D(6),h()()(),I(7,"button",57),U("click",function(n){let o=L(A).$implicit,a=p(3);return a.deleteCallback(a.agentConfig.name,o),G(n.stopPropagation())}),I(8,"mat-icon"),D(9,"remove"),h()()()}if(i&2){let A=e.$implicit;Q(4),nA(A.type),Q(2),nA(A.name)}}function xuA(i,e){if(i&1&&(I(0,"div",49)(1,"mat-chip-set",50),ke(2,_uA,10,2,"div",51,ni),h()()),i&2){let A=p(),t=p();Q(2),_e(A.get(t.agentConfig.name))}}function RuA(i,e){if(i&1&&T(0,xuA,4,0,"div",49),i&2){let A=e,t=p();O(t.agentConfig&&A.get(t.agentConfig.name)&&A.get(t.agentConfig.name).length>0?0:-1)}}var w5=class i{CALLBACKS_TAB_INDEX=3;jsonEditorComponent;appNameInput="";exitBuilderMode=new FA;closePanel=new FA;featureFlagService=w(Nr);isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();toolArgsString=mA("");editingToolArgs=mA(!1);editingTool=null;selectedTabIndex=0;agentConfig={isRoot:!1,name:"",agent_class:"",model:"",instruction:"",sub_agents:[],tools:[],callbacks:[]};hierarchyPath=[];currentSelectedAgent=void 0;isRootAgentEditable=!0;models=["gemini-2.5-flash","gemini-2.5-pro"];agentTypes=["LlmAgent","LoopAgent","ParallelAgent","SequentialAgent"];agentBuilderService=w($c);dialog=w(Xa);agentService=w(el);snackBar=w(Xc);router=w(Is);cdr=w(Mt);selectedTool=void 0;toolAgentName="";toolTypes=["Custom tool","Function tool","Built-in tool","Agent Tool"];editingCallback=null;selectedCallback=void 0;callbackTypes=["before_agent","before_model","before_tool","after_tool","after_model","after_agent"];builtInTools=["EnterpriseWebSearchTool","exit_loop","FilesRetrieval","get_user_choice","google_search","load_artifacts","load_memory","LongRunningFunctionTool","preload_memory","url_context","VertexAiRagRetrieval","VertexAiSearchTool"];builtInToolArgs=new Map([["EnterpriseWebSearchTool",[]],["exit_loop",[]],["FilesRetrieval",["name","description","input_dir"]],["get_user_choice",[]],["google_search",[]],["load_artifacts",[]],["load_memory",[]],["LongRunningFunctionTool",["func"]],["preload_memory",[]],["url_context",[]],["VertexAiRagRetrieval",["name","description","rag_corpora","rag_resources","similarity_top_k","vector_distance_threshold"]],["VertexAiSearchTool",["data_store_id","data_store_specs","search_engine_id","filter","max_results"]]]);header="Select an agent or tool to edit";toolsMap$;callbacksMap$;getJsonStringForEditor(e){if(!e)return"{}";let A=P({},e);return delete A.skip_summarization,JSON.stringify(A,null,2)}constructor(){this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.callbacksMap$=this.agentBuilderService.getAgentCallbacksMap(),this.agentBuilderService.getSelectedNode().subscribe(e=>{this.agentConfig=e,this.currentSelectedAgent=e,e&&(this.editingTool=null,this.editingCallback=null,this.header="Agent configuration",this.updateBreadcrumb(e)),this.cdr.markForCheck()}),this.agentBuilderService.getSelectedTool().subscribe(e=>{this.selectedTool=e,!(e&&e.toolType==="Agent Tool")&&(e?(this.editingTool=e,this.editingToolArgs.set(!1),setTimeout(()=>{let A=e.toolType=="Function tool"?"Function tool":e.name;if(e.toolType=="Function tool"&&!e.name&&(e.name="Function tool"),e.toolType==="Custom tool")e.args||(e.args={}),this.toolArgsString.set(this.getJsonStringForEditor(e.args)),this.editingToolArgs.set(!0);else{let t=this.builtInToolArgs.get(A);if(t){e.args||(e.args={});for(let n of t)e.args&&(e.args[n]="")}this.toolArgsString.set(this.getJsonStringForEditor(e.args)),e.args&&this.getObjectKeys(e.args).length>0&&this.editingToolArgs.set(!0)}this.cdr.markForCheck()}),this.selectedTabIndex=2):this.editingTool=null,this.cdr.markForCheck())}),this.agentBuilderService.getSelectedCallback().subscribe(e=>{this.selectedCallback=e,e?(this.selectCallback(e),this.selectedTabIndex=this.CALLBACKS_TAB_INDEX):this.editingCallback=null,this.cdr.markForCheck()}),this.agentBuilderService.getAgentCallbacks().subscribe(e=>{this.agentConfig&&e&&this.agentConfig.name===e.agentName&&(this.agentConfig=$A(P({},this.agentConfig),{callbacks:e.callbacks}),this.cdr.markForCheck())}),this.agentBuilderService.getSideTabChangeRequest().subscribe(e=>{e==="tools"?this.selectedTabIndex=2:e==="config"&&(this.selectedTabIndex=0)})}getObjectKeys(e){return e?Object.keys(e).filter(A=>A!=="skip_summarization"):[]}getCallbacksByType(){let e=new Map;return this.callbackTypes.forEach(A=>{e.set(A,[])}),this.agentConfig?.callbacks&&this.agentConfig.callbacks.forEach(A=>{let t=e.get(A.type);t&&t.push(A)}),e}updateBreadcrumb(e){this.hierarchyPath=this.buildHierarchyPath(e)}buildHierarchyPath(e){let A=[],t=this.findContextualRoot(e);return t?e.name===t.name?[t]:this.findPathToAgent(t,e,[t])||[e]:[e]}isInAgentToolContext(){return!this.hierarchyPath||this.hierarchyPath.length===0?!1:this.hierarchyPath[0]?.isAgentTool===!0}findContextualRoot(e){if(e.isAgentTool)return e;let A=this.agentBuilderService.getNodes();for(let n of A)if(n.isAgentTool&&this.findPathToAgent(n,e,[n]))return n;let t=this.agentBuilderService.getRootNode();if(t&&this.findPathToAgent(t,e,[t]))return t;if(e.isRoot)return e;for(let n of A)if(n.isRoot&&this.findPathToAgent(n,e,[n]))return n;return t}findPathToAgent(e,A,t){if(e.name===A.name)return t;for(let n of e.sub_agents){let o=[...t,n],a=this.findPathToAgent(n,A,o);if(a)return a}return null}selectAgentFromBreadcrumb(e){this.agentBuilderService.setSelectedNode(e),this.selectedTabIndex=0}selectAgent(e){this.agentBuilderService.setSelectedNode(e),this.selectedTabIndex=0}selectTool(e){if(e.toolType==="Agent Tool"){let A=e.name;this.agentBuilderService.requestNewTab(A);return}if(e.toolType==="Function tool"||e.toolType==="Built-in tool"){this.editTool(e);return}this.agentBuilderService.setSelectedTool(e)}editTool(e){if(!this.agentConfig)return;let A;e.toolType==="Built-in tool"?A=this.dialog.open(sI,{width:"700px",maxWidth:"90vw",data:{toolName:e.name,isEditMode:!0,toolArgs:e.args}}):A=this.dialog.open(Q2,{width:"500px",data:{toolType:e.toolType,toolName:e.name,isEditMode:!0}}),A.afterClosed().subscribe(t=>{if(t&&t.isEditMode){let n=this.agentConfig.tools?.findIndex(o=>o.name===e.name);n!==void 0&&n!==-1&&this.agentConfig.tools&&(this.agentConfig.tools[n].name=t.name,t.args&&(this.agentConfig.tools[n].args=t.args),this.agentBuilderService.setAgentTools(this.agentConfig.name,this.agentConfig.tools))}})}addTool(e){if(this.agentConfig){let A;e==="Built-in tool"?A=this.dialog.open(sI,{width:"700px",maxWidth:"90vw",data:{}}):A=this.dialog.open(Q2,{width:"500px",data:{toolType:e}}),A.afterClosed().subscribe(t=>{if(t){let n={toolType:t.toolType,name:t.name};this.agentBuilderService.addTool(this.agentConfig.name,n),this.agentBuilderService.setSelectedTool(n)}})}}addCallback(e){if(this.agentConfig){let A=this.agentConfig?.callbacks?.map(n=>n.name)??[];this.dialog.open(Mu,{width:"500px",data:{callbackType:e,existingCallbackNames:A}}).afterClosed().subscribe(n=>{if(n){let o={name:n.name,type:n.type};this.agentBuilderService.addCallback(this.agentConfig.name,o)}})}}editCallback(e){if(!this.agentConfig)return;let A=this.agentConfig.callbacks?.map(n=>n.name)??[];this.dialog.open(Mu,{width:"500px",data:{callbackType:e.type,existingCallbackNames:A,isEditMode:!0,callback:e,availableCallbackTypes:this.callbackTypes}}).afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=this.agentBuilderService.updateCallback(this.agentConfig.name,e.name,$A(P({},e),{name:n.name,type:n.type}));o.success?this.cdr.markForCheck():console.error("Failed to update callback:",o.error)}})}deleteCallback(e,A){this.dialog.open(vc,{data:{title:"Delete Callback",message:`Are you sure you want to delete ${A.name}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(n=>{if(n==="confirm"){let o=this.agentBuilderService.deleteCallback(e,A);o.success?this.cdr.markForCheck():console.error("Failed to delete callback:",o.error)}})}addSubAgent(e){e&&this.agentBuilderService.setAddSubAgentSubject(e)}deleteSubAgent(e){this.agentBuilderService.setDeleteSubAgentSubject(e)}deleteTool(e,A){let t=A.toolType==="Agent Tool",n=t&&A.toolAgentName||A.name;this.dialog.open(vc,{data:{title:t?"Delete Agent Tool":"Delete Tool",message:t?`Are you sure you want to delete the agent tool "${n}"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(a=>{if(a==="confirm")if(A.toolType==="Agent Tool"){let r=A.toolAgentName||A.name;this.deleteAgentToolAndBoard(e,A,r)}else this.agentBuilderService.deleteTool(e,A)})}deleteAgentToolAndBoard(e,A,t){this.agentBuilderService.deleteTool(e,A),this.agentBuilderService.requestTabDeletion(t)}backToToolList(){this.editingTool=null,this.agentBuilderService.setSelectedTool(void 0)}editToolArgs(){this.editingToolArgs.set(!0)}cancelEditToolArgs(e){this.editingToolArgs.set(!1),this.toolArgsString.set(this.getJsonStringForEditor(e?.args))}saveToolArgs(e){if(this.jsonEditorComponent&&e)try{let A=JSON.parse(this.jsonEditorComponent.getJsonString()),t=e.args?e.args.skip_summarization:!1;e.args=A,e.args.skip_summarization=t,this.toolArgsString.set(JSON.stringify(e.args,null,2)),this.editingToolArgs.set(!1)}catch(A){console.error("Error parsing tool arguments JSON",A)}}onToolTypeSelectionChange(e){e?.toolType==="Built-in tool"?(e.name="google_search",this.onBuiltInToolSelectionChange(e)):e?.toolType==="Custom tool"?(e.args={},this.toolArgsString.set(this.getJsonStringForEditor(e.args)),this.editingToolArgs.set(!0)):e&&(e.name="",e.args={skip_summarization:!1},this.toolArgsString.set("{}"),this.editingToolArgs.set(!1))}onBuiltInToolSelectionChange(e){e&&(this.editingToolArgs.set(!1),setTimeout(()=>{e.args={skip_summarization:!1};let A=this.builtInToolArgs.get(e.name);if(A)for(let t of A)e.args&&(e.args[t]="");this.toolArgsString.set(this.getJsonStringForEditor(e.args)),e.args&&this.getObjectKeys(e.args).length>0&&this.editingToolArgs.set(!0),this.cdr.markForCheck()}))}selectCallback(e){this.editingCallback=e}backToCallbackList(){this.editingCallback=null}onCallbackTypeChange(e){}createAgentTool(){this.dialog.open(vc,{width:"750px",height:"450px",data:{title:"Create Agent Tool",message:"Please enter a name for the agent tool:",confirmButtonText:"Create",showInput:!0,inputLabel:"Agent Tool Name",inputPlaceholder:"Enter agent tool name",showToolInfo:!0,toolType:"Agent tool"}}).afterClosed().subscribe(A=>{if(A&&typeof A=="string"){let t=this.agentConfig?.name||"root_agent";this.agentBuilderService.requestNewTab(A,t)}})}saveChanges(){if(!this.agentBuilderService.getRootNode()){this.snackBar.open("Please create an agent first.","OK");return}this.appNameInput?this.saveAgent(this.appNameInput):this.agentService.getApp().subscribe(A=>{A?this.saveAgent(A):this.snackBar.open("No agent selected. Please select an agent first.","OK")})}cancelChanges(){this.agentService.agentChangeCancel(this.appNameInput).subscribe(e=>{}),this.exitBuilderMode.emit()}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A){this.snackBar.open("Please create an agent first.","OK");return}let t=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();a0.generateYamlFile(A,t,e,n),this.agentService.agentBuildTmp(e,t).subscribe(o=>{o&&this.agentService.agentBuild(e,t).subscribe(a=>{a?this.router.navigate(["/"],{queryParams:{app:e}}).then(()=>{window.location.reload()}):this.snackBar.open("Something went wrong, please try again","OK")})})}getToolIcon(e){return UB(e.name,e.toolType)}getAgentIcon(e){switch(e){case"SequentialAgent":return"more_horiz";case"LoopAgent":return"sync";case"ParallelAgent":return"density_medium";default:return"psychology"}}addSubAgentWithType(e){if(!this.agentConfig?.name)return;let A=this.agentConfig.agent_class!=="LlmAgent";this.agentBuilderService.setAddSubAgentSubject(this.agentConfig.name,e,A)}callbackMenuTooltips(e){return nc.getCallbackMenuTooltips(e)}toolMenuTooltips(e){return nc.getToolMenuTooltips(e)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-builder-tabs"]],viewQuery:function(A,t){if(A&1&&Wt(Dc,5),A&2){let n;se(n=le())&&(t.jsonEditorComponent=n.first)}},inputs:{appNameInput:"appNameInput"},outputs:{exitBuilderMode:"exitBuilderMode",closePanel:"closePanel"},decls:77,vars:12,consts:[["subAgentMenu","matMenu"],["callbacksMenu","matMenu"],["agentMenuTrigger","matMenuTrigger"],["toolsMenu","matMenu"],[2,"margin-top","20px","margin-left","20px","display","flex"],[2,"width","100%"],[1,"drawer-header"],[1,"drawer-logo"],["src","assets/ADK-512-color.svg","width","32px","height","32px"],[2,"display","flex","align-items","center","gap","8px","margin-right","15px"],["matTooltip","Collapse panel",1,"material-symbols-outlined",2,"color","#c4c7c5","cursor","pointer",3,"click"],[1,"builder-tabs-container"],[1,"builder-tab-content"],[1,"agent-breadcrumb-container"],[1,"content-wrapper"],[1,"builder-panel-wrapper"],[1,"panel-title"],[1,"config-form"],["mat-icon-button","","type","button","aria-label","Add sub agent",1,"panel-action-button",3,"matMenuTriggerFor"],["mat-menu-item","",3,"click"],[1,"tools-chips-container"],["mat-icon-button","","type","button","aria-label","Add callback",1,"panel-action-button",3,"matMenuTriggerFor"],[1,"menu-header"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[1,"action-buttons"],["mat-raised-button","","color","secondary",1,"save-button",3,"click"],["mat-button","",1,"cancel-button",3,"click"],[1,"breadcrumb-chip",3,"click"],[1,"breadcrumb-arrow"],[1,"form-row"],[1,"agent-name-field"],["matInput","",3,"ngModelChange","ngModel","disabled"],[1,"agent-type-field"],["disabled","",3,"ngModelChange","ngModel"],[3,"value"],[3,"ngModel"],[3,"ngModelChange","ngModel"],["matInput","","rows","5",3,"ngModelChange","ngModel"],["matInput","","rows","3",3,"ngModelChange","ngModel"],["matInput","","type","number","min","1",3,"ngModelChange","ngModel"],["mat-icon-button","","type","button","aria-label","Add tool",1,"panel-action-button",3,"matMenuTriggerFor"],["aria-label","Tools"],[1,"tool-chip"],[1,"tool-chip",3,"click"],["matChipAvatar","",1,"tool-icon"],[1,"tool-chip-name"],["matChipRemove","","aria-label","Remove tool",3,"click"],["aria-label","Sub Agents"],["matChipRemove","","aria-label","Remove sub agent",3,"click"],[1,"tools-chips-container","callbacks-list"],["aria-label","Callbacks"],[1,"callback-row"],[1,"callback-row",3,"click"],[1,"callback-chip"],[1,"chip-content"],[1,"chip-type"],[1,"chip-name"],["mat-icon-button","","aria-label","Remove callback",1,"callback-remove",3,"click"]],template:function(A,t){if(A&1&&(I(0,"div",4)(1,"div",5)(2,"div",6)(3,"div",7),lA(4,"img",8),D(5," Agent Development Kit "),h(),I(6,"div",9),lA(7,"app-theme-toggle"),I(8,"span",10),U("click",function(){return t.closePanel.emit()}),D(9,"left_panel_close"),h()()()()(),I(10,"div",11)(11,"div",12),T(12,huA,3,0,"div",13),I(13,"div",14)(14,"div",15)(15,"div",16),D(16," Configuration "),h(),I(17,"div"),T(18,wuA,16,7,"div",17),h()(),T(19,buA,22,7,"div",15),I(20,"div",15)(21,"div",16)(22,"div"),D(23," Sub Agents "),h(),I(24,"div")(25,"button",18)(26,"mat-icon"),D(27,"add"),h()(),I(28,"mat-menu",null,0)(30,"button",19),U("click",function(){return t.addSubAgentWithType("LlmAgent")}),I(31,"mat-icon"),D(32,"psychology"),h(),I(33,"span"),D(34,"LLM Agent"),h()(),I(35,"button",19),U("click",function(){return t.addSubAgentWithType("SequentialAgent")}),I(36,"mat-icon"),D(37,"more_horiz"),h(),I(38,"span"),D(39,"Sequential Agent"),h()(),I(40,"button",19),U("click",function(){return t.addSubAgentWithType("LoopAgent")}),I(41,"mat-icon"),D(42,"sync"),h(),I(43,"span"),D(44,"Loop Agent"),h()(),I(45,"button",19),U("click",function(){return t.addSubAgentWithType("ParallelAgent")}),I(46,"mat-icon"),D(47,"density_medium"),h(),I(48,"span"),D(49,"Parallel Agent"),h()()()()(),T(50,SuA,4,0,"div",20),h(),I(51,"div",15)(52,"div",16)(53,"div"),D(54," Callbacks "),h(),I(55,"div")(56,"button",21)(57,"mat-icon"),D(58,"add"),h()(),I(59,"mat-menu",null,1)(61,"div",22),D(62,"Agent Lifecycle"),h(),I(63,"button",23),U("click",function(){return t.addCallback("before_agent")}),I(64,"span"),D(65,"Before Agent"),h()(),I(66,"button",23),U("click",function(){return t.addCallback("after_agent")}),I(67,"span"),D(68,"After Agent"),h()(),T(69,kuA,18,4),h()()(),T(70,RuA,1,1),mt(71,"async"),h()(),I(72,"div",24)(73,"button",25),U("click",function(){return t.saveChanges()}),D(74," Save "),h(),I(75,"button",26),U("click",function(){return t.cancelChanges()}),D(76," Cancel "),h()()()()),A&2){let n,o=Bi(29),a=Bi(60);Q(12),O(t.hierarchyPath.length>0?12:-1),Q(6),O(t.agentConfig?18:-1),Q(),O((t.agentConfig==null?null:t.agentConfig.agent_class)==="LlmAgent"?19:-1),Q(6),H("matMenuTriggerFor",o),Q(25),O(t.agentConfig&&t.agentConfig.sub_agents&&t.agentConfig.sub_agents.length>0?50:-1),Q(6),H("matMenuTriggerFor",a),Q(7),H("matTooltip",t.callbackMenuTooltips("before_agent")),Q(3),H("matTooltip",t.callbackMenuTooltips("after_agent")),Q(3),O((t.agentConfig==null?null:t.agentConfig.agent_class)==="LlmAgent"?69:-1),Q(),O((n=Ft(71,10,t.callbacksMap$))?70:-1,n)}},dependencies:[li,fn,Gn,gQ,Kn,dv,Ho,ki,ic,fO,Zo,zt,ka,yi,xs,Vr,ig,rn,hs,tg,Gs,f5,Qp,JW,YW,Gx,PW,zW,m5,gs],styles:[".builder-tabs-container[_ngcontent-%COMP%]{width:100%;margin-top:40px;height:calc(95vh - 20px);display:flex;flex-direction:column}.agent-breadcrumb-container[_ngcontent-%COMP%]{padding:2px 20px 8px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;border-bottom:1px solid var(--builder-border-color)}.breadcrumb-chip[_ngcontent-%COMP%]{color:var(--builder-text-muted-color);font-family:Google Sans;font-size:16px;font-weight:500;border:none;cursor:pointer;transition:all .2s ease;padding:4px 8px;border-radius:4px;display:inline-block;-webkit-user-select:none;user-select:none}.breadcrumb-chip[_ngcontent-%COMP%]:hover{color:var(--builder-text-link-color)}.breadcrumb-chip.current-agent[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-weight:500}.breadcrumb-arrow[_ngcontent-%COMP%]{color:var(--builder-breadcrumb-separator-color);font-size:16px;width:16px;height:16px}.builder-tab-content[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);display:flex;flex-direction:column;flex:1;overflow:hidden}.builder-tab-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:8px 0;font-size:14px;line-height:1.5}.components-section[_ngcontent-%COMP%]{margin-bottom:32px}.components-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:14px;font-weight:500;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.config-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;margin-top:20px}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%]{display:flex;gap:16px;align-items:flex-start}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%] .agent-name-field[_ngcontent-%COMP%]{flex:1}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%] .agent-type-field[_ngcontent-%COMP%]{width:32%}.config-form[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.config-form[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{margin-bottom:8px}.config-form[_ngcontent-%COMP%] .tool-code-section[_ngcontent-%COMP%]{margin-top:16px}.config-form[_ngcontent-%COMP%] .tool-code-section[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0 0 8px;color:var(--builder-text-secondary-color);font-size:14px;font-weight:500}.config-form[_ngcontent-%COMP%] .tool-args-header[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:14px;font-weight:500;letter-spacing:.5px;text-transform:uppercase}.json-editor-wrapper[_ngcontent-%COMP%]{height:300px;max-height:300px}.tab-content-container[_ngcontent-%COMP%]{margin-top:20px;overflow-y:auto}.agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px}.sub-agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px;margin-left:16px}.tree-view[_ngcontent-%COMP%] expand-button[_ngcontent-%COMP%]{border:0}.node-item[_ngcontent-%COMP%]{display:flex;align-items:center}.node-icon[_ngcontent-%COMP%]{margin-right:14px}.node-name[_ngcontent-%COMP%]{margin-top:2px;display:flex;align-items:center}.no-tools-message[_ngcontent-%COMP%]{display:block;color:var(--builder-text-secondary-color);font-size:16px;margin-top:16px;margin-bottom:16px;text-align:center}.tools-list[_ngcontent-%COMP%]{list-style:none;padding:0}.tool-name[_ngcontent-%COMP%]{cursor:pointer;padding:11px;border-radius:8px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;color:var(--builder-text-primary-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.tool-name[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{visibility:hidden}.tool-name[_ngcontent-%COMP%]:hover button[_ngcontent-%COMP%]{visibility:visible}.tool-list-item-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px}.tools-chips-container[_ngcontent-%COMP%]{margin-top:12px;padding:0 4px}.tools-chips-container.callbacks-list[_ngcontent-%COMP%]{padding-right:0;padding-left:0}.callback-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;width:100%;cursor:pointer}.callback-remove[_ngcontent-%COMP%]{color:var(--builder-icon-color);cursor:pointer;width:32px;height:32px;min-width:32px;min-height:32px;display:inline-flex;align-items:center;justify-content:center;padding:0}.callback-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center;transform:translateY(.5px)}.back-button[_ngcontent-%COMP%]{margin-bottom:16px}.add-tool-button[_ngcontent-%COMP%]{width:100%;border:none;border-radius:4px;margin-top:12px;cursor:pointer}.add-tool-button-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.add-tool-button-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--builder-add-button-text-color);font-family:Google Sans;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.agent-tool-section[_ngcontent-%COMP%]{margin-top:16px;padding:16px;border:1px solid var(--builder-border-color);border-radius:8px}.agent-tool-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:16px;font-weight:500;margin:0 0 8px}.agent-tool-section[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;margin:0 0 16px;line-height:1.5}.agent-tool-section[_ngcontent-%COMP%] .create-agent-tool-btn[_ngcontent-%COMP%]{color:var(--builder-button-primary-text-color);font-weight:500}.no-callbacks-message[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:16px;margin-top:16px;text-align:center}.callback-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px}.callback-section[_ngcontent-%COMP%]{margin-top:16px}.callback-section[_ngcontent-%COMP%] .callback-section-label[_ngcontent-%COMP%]{margin:0 0 8px;color:var(--builder-text-secondary-color);font-size:14px;font-weight:500;text-transform:none}.callback-groups-wrapper[_ngcontent-%COMP%]{margin-top:16px}.callback-group[_ngcontent-%COMP%]{margin-top:5px}.callback-list[_ngcontent-%COMP%]{padding:8px 0}.no-callbacks-in-type[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;font-style:italic;padding:12px;text-align:center}.callback-item[_ngcontent-%COMP%]{cursor:pointer;padding:8px 12px;border-radius:4px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;color:var(--builder-text-primary-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.callback-item[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{visibility:hidden}.callback-item[_ngcontent-%COMP%]:hover button[_ngcontent-%COMP%]{visibility:visible}.add-callback-icon[_ngcontent-%COMP%]{color:var(--builder-button-primary-background-color)}mat-tab-group[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;padding:16px 20px 0;min-height:0}mat-tab-group[_ngcontent-%COMP%]{flex:1;padding-bottom:0;display:flex;flex-direction:column;overflow:hidden}.action-buttons[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;padding:16px 20px;border-top:1px solid var(--builder-border-color);flex-shrink:0;margin-top:auto}.action-buttons[_ngcontent-%COMP%] .save-button[_ngcontent-%COMP%]{color:var(--builder-button-primary-text-color);font-weight:500}.action-buttons[_ngcontent-%COMP%] .cancel-button[_ngcontent-%COMP%]{color:var(--builder-button-secondary-text-color);border:1px solid var(--builder-button-secondary-border-color)}.action-buttons[_ngcontent-%COMP%] .cancel-button[_ngcontent-%COMP%]:hover{color:var(--builder-button-secondary-hover-text-color)}.builder-panel-wrapper[_ngcontent-%COMP%]{border-bottom:1px solid var(--builder-border-color);padding:12px 24px}.panel-title[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color);font-family:Google Sans;font-size:16px;font-style:normal;font-weight:500;line-height:24px;display:flex;justify-content:space-between}.panel-title[_ngcontent-%COMP%] .panel-action-button[_ngcontent-%COMP%]{color:var(--builder-icon-color);width:32px;height:32px;min-width:32px;min-height:32px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;padding:0}.panel-title[_ngcontent-%COMP%] .panel-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center}.content-wrapper[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:9px}.drawer-logo[_ngcontent-%COMP%]{font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center}"],changeDetection:0})};var g1=new MA("MARKDOWN_COMPONENT");var NuA=["chatMessages"],FuA=(i,e)=>({"user-message":i,"bot-message":e}),LuA=i=>({text:i,thought:!1});function GuA(i,e){i&1&&(I(0,"div",7)(1,"mat-icon",12),D(2,"smart_toy"),h(),I(3,"h3"),D(4,"Assistant Ready"),h(),I(5,"p"),D(6,"Your builder assistant is ready to help you build agents."),h()())}function KuA(i,e){i&1&&(I(0,"div",15)(1,"span",16),D(2,"\u30FB\u30FB\u30FB"),h()())}function UuA(i,e){if(i&1&&(I(0,"div",19),D(1),h()),i&2){let A=p(3).$implicit;Q(),nA(A.text)}}function TuA(i,e){if(i&1&&dn(0,20),i&2){let A=p(3).$implicit,t=p(2);H("ngComponentOutlet",t.markdownComponent)("ngComponentOutletInputs",jl(2,LuA,A.text))}}function OuA(i,e){if(i&1&&(I(0,"div",18),D(1,"Assistant"),h(),T(2,UuA,2,1,"div",19)(3,TuA,1,4,"ng-container",20)),i&2){let A=p(2).$implicit;Q(2),O(A.isError?2:3)}}function JuA(i,e){if(i&1&&(I(0,"div",17),D(1),h()),i&2){let A=p(2).$implicit;Q(),nA(A.text)}}function YuA(i,e){if(i&1&&T(0,OuA,4,1)(1,JuA,2,1,"div",17),i&2){let A=p().$implicit;O(A.role==="bot"?0:1)}}function HuA(i,e){if(i&1&&(I(0,"div",13)(1,"mat-card",14),T(2,KuA,3,0,"div",15)(3,YuA,2,1),h()()),i&2){let A=e.$implicit;H("ngClass",L0(2,FuA,A.role==="user",A.role==="bot")),Q(2),O(A.isLoading?2:3)}}function zuA(i,e){if(i&1&&ke(0,HuA,4,5,"div",13,ni),i&2){let A=p();_e(A.messages)}}var y5=class i{isVisible=!0;appName="";closePanel=new FA;reloadCanvas=new FA;assistantAppName="__adk_agent_builder_assistant";userId="user";currentSession="";userMessage="";messages=[];shouldAutoScroll=!1;isGenerating=!1;chatMessages;markdownComponent=w(g1);agentService=w(el);sessionService=w(tl);agentBuilderService=w($c);constructor(){}ngOnInit(){this.sessionService.createSession(this.userId,this.assistantAppName).subscribe(e=>{this.currentSession=e.id;let A={appName:this.assistantAppName,userId:this.userId,sessionId:e.id,newMessage:{role:"user",parts:[{text:"hello"}]},streaming:!1,stateDelta:{root_directory:`${this.appName}/tmp/${this.appName}`}};this.messages.push({role:"bot",text:"",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0,this.agentService.runSse(A).subscribe({next:t=>re(this,null,function*(){if(t.errorCode){let n=this.messages[this.messages.length-1];n.role==="bot"&&n.isLoading&&(n.text=`Error Code: ${t.errorCode}`,n.isLoading=!1,n.isError=!0,this.shouldAutoScroll=!0),this.isGenerating=!1;return}if(t.content){let n="";for(let o of t.content.parts)o.text&&(n+=o.text);if(n){let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text=n,o.isLoading=!1,this.shouldAutoScroll=!0)}}}),error:t=>{console.error("SSE error:",t);let n=this.messages[this.messages.length-1];n.role==="bot"&&n.isLoading&&(n.text="Sorry, I encountered an error. Please try again.",n.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})})}onClosePanel(){this.closePanel.emit()}sendMessage(e){if(e.trim()){this.saveAgent(this.appName),e!="____Something went wrong, please try again"&&this.messages.push({role:"user",text:e});let A=e;this.userMessage="",this.messages.push({role:"bot",text:"",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0;let t={appName:this.assistantAppName,userId:this.userId,sessionId:this.currentSession,newMessage:{role:"user",parts:[{text:A}]},streaming:!1};this.agentService.runSse(t).subscribe({next:n=>re(this,null,function*(){if(n.errorCode){let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text=`Error Code: ${n.errorCode}`,o.isLoading=!1,o.isError=!0,this.shouldAutoScroll=!0),this.isGenerating=!1;return}if(n.content){let o="";for(let a of n.content.parts)a.text&&(o+=a.text);if(o){let a=this.messages[this.messages.length-1];a.role==="bot"&&a.isLoading&&(a.text=o,a.isLoading=!1,this.shouldAutoScroll=!0,this.reloadCanvas.emit())}}}),error:n=>{console.error("SSE error:",n);let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text="Sorry, I encountered an error. Please try again.",o.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})}}ngAfterViewChecked(){this.shouldAutoScroll&&(this.scrollToBottom(),this.shouldAutoScroll=!1)}scrollToBottom(){try{this.chatMessages&&setTimeout(()=>{this.chatMessages.nativeElement.scrollTop=this.chatMessages.nativeElement.scrollHeight},50)}catch(e){console.error("Error scrolling to bottom:",e)}}onKeyDown(e){if(e.key==="Enter"){if(e.shiftKey)return;this.userMessage?.trim()&&this.currentSession&&(e.preventDefault(),this.sendMessage(this.userMessage))}}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A)return;let t=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();a0.generateYamlFile(A,t,e,n),this.agentService.agentBuildTmp(e,t).subscribe(o=>{console.log(o?"save to tmp":"something went wrong")})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-builder-assistant"]],viewQuery:function(A,t){if(A&1&&Wt(NuA,5),A&2){let n;se(n=le())&&(t.chatMessages=n.first)}},inputs:{isVisible:"isVisible",appName:"appName"},outputs:{closePanel:"closePanel",reloadCanvas:"reloadCanvas"},decls:21,vars:6,consts:[["chatMessages",""],[1,"builder-assistant-panel"],[1,"panel-header"],[1,"panel-title"],["mat-icon-button","","matTooltip","Close assistant panel",1,"close-btn",3,"click"],[1,"panel-content"],[1,"chat-messages"],[1,"assistant-placeholder"],[1,"chat-input-container"],[1,"input-wrapper"],["cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","5","placeholder","Ask Gemini to build your agent",1,"assistant-input-box",3,"ngModelChange","keydown","ngModel","disabled"],["mat-icon-button","","matTooltip","Send message",1,"send-button",3,"click","disabled"],[1,"large-icon"],[3,"ngClass"],[1,"message-card"],[1,"loading-message"],[1,"dots"],[1,"message-text"],[1,"bot-label"],[1,"error-message"],[3,"ngComponentOutlet","ngComponentOutletInputs"]],template:function(A,t){if(A&1){let n=aA();I(0,"div",1)(1,"div",2)(2,"div",3)(3,"mat-icon"),D(4,"auto_awesome"),h(),I(5,"span"),D(6,"Assistant"),h()(),I(7,"button",4),U("click",function(){return t.onClosePanel()}),I(8,"mat-icon"),D(9,"close"),h()()(),I(10,"div",5)(11,"div",6,0),T(13,GuA,7,0,"div",7)(14,zuA,2,0),h(),I(15,"div",8)(16,"div",9)(17,"textarea",10),Ni("ngModelChange",function(a){return L(n),wi(t.userMessage,a)||(t.userMessage=a),G(a)}),U("keydown",function(a){return t.onKeyDown(a)}),h(),I(18,"button",11),U("click",function(){return t.sendMessage(t.userMessage.trim())}),I(19,"mat-icon"),D(20,"send"),h()()()()()()}A&2&&(_A("hidden",!t.isVisible),Q(13),O(t.messages.length===0?13:14),Q(4),Ri("ngModel",t.userMessage),H("disabled",t.isGenerating),Q(),H("disabled",!t.userMessage.trim()||t.isGenerating))},dependencies:[li,Vl,Kc,fn,Gn,Kn,Ho,zt,yi,rn,qf,YI,P3],styles:[".builder-assistant-panel[_ngcontent-%COMP%]{position:fixed;right:0;top:72px;width:400px;height:calc(100vh - 72px);background-color:var(--mat-sys-surface-container);border-left:1px solid var(--mat-sys-outline-variant);box-shadow:-2px 0 10px #0006;display:flex;flex-direction:column;transition:transform .3s ease}.builder-assistant-panel.hidden[_ngcontent-%COMP%]{transform:translate(100%)}.panel-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mat-sys-outline-variant)}.panel-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-weight:400;font-size:16px;color:var(--mat-sys-on-surface);font-family:Google Sans,Helvetica Neue,sans-serif}.panel-title[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);font-size:20px;width:20px;height:20px}.close-btn[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)}.close-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.panel-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden}.assistant-placeholder[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;height:300px;color:var(--mat-sys-on-surface-variant)}.assistant-placeholder[_ngcontent-%COMP%] .large-icon[_ngcontent-%COMP%]{font-size:64px;width:64px;height:64px;margin-bottom:16px;color:var(--mat-sys-primary)}.assistant-placeholder[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0 0 8px;font-size:20px;font-weight:500;color:var(--mat-sys-on-surface);font-family:Google Sans,Helvetica Neue,sans-serif}.assistant-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5;color:var(--mat-sys-on-surface-variant)}.chat-messages[_ngcontent-%COMP%]{flex:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column}.chat-input-container[_ngcontent-%COMP%]{padding:16px 20px 20px;border-top:none}.input-wrapper[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:50px;padding:10px 6px 10px 18px;gap:8px}.assistant-input-box[_ngcontent-%COMP%]{flex:1;color:var(--mat-sys-on-surface);background-color:transparent;border:none;padding:0;resize:none;overflow:hidden;font-family:Google Sans,Helvetica Neue,sans-serif;font-size:14px;line-height:20px;min-height:20px;max-height:120px}.assistant-input-box[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant);font-size:14px}.assistant-input-box[_ngcontent-%COMP%]:focus{outline:none}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar{width:4px}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background-color:var(--mat-sys-outline);border-radius:4px}.send-button[_ngcontent-%COMP%]{color:var(--mat-sys-primary);width:36px;height:36px;min-width:36px;flex-shrink:0;margin:0;padding:0}.send-button[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-outline)}.send-button[_ngcontent-%COMP%]:hover:not(:disabled){color:var(--mat-sys-primary);border-radius:50%}.send-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.message-card[_ngcontent-%COMP%]{padding:10px 16px;margin:6px 0;font-size:14px;font-weight:400;position:relative;display:block;box-shadow:none;line-height:1.5;width:100%}.user-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:12px}.user-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{border:1px solid var(--mat-sys-outline-variant);border-radius:4px;color:var(--mat-sys-on-surface);padding:8px 12px}.bot-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:0}.bot-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{border:none;border-radius:0;color:var(--mat-sys-on-surface);padding:0;margin:0}.bot-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;font-family:Google Sans,Helvetica Neue,sans-serif}.error-message[_ngcontent-%COMP%]{color:var(--mat-app-warn, #d32f2f);font-family:Google Sans,Helvetica Neue,sans-serif;font-size:14px;white-space:pre-line;word-break:break-word;padding:8px 12px}.message-text[_ngcontent-%COMP%]{white-space:pre-line;word-break:break-word;overflow-wrap:break-word;font-family:Google Sans,Helvetica Neue,sans-serif}.message-text[_ngcontent-%COMP%] p{margin:0;line-height:1.4}.message-text[_ngcontent-%COMP%] p:first-child{margin-top:0}.message-text[_ngcontent-%COMP%] p:last-child{margin-bottom:0}.message-text[_ngcontent-%COMP%] ul, .message-text[_ngcontent-%COMP%] ol{margin:0;padding-left:1.5em}.message-text[_ngcontent-%COMP%] li{margin:0}.message-text[_ngcontent-%COMP%] code{padding:2px 4px;border-radius:3px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.9em}.message-text[_ngcontent-%COMP%] pre{padding:8px 12px;border-radius:6px;overflow-x:auto;margin:.5em 0}.message-text[_ngcontent-%COMP%] pre code{padding:0}.message-text[_ngcontent-%COMP%] blockquote{border-left:3px solid var(--mat-sys-primary);padding-left:12px;margin:.5em 0;font-style:italic;color:var(--mat-sys-on-surface-variant)}.message-text[_ngcontent-%COMP%] strong{font-weight:600}.message-text[_ngcontent-%COMP%] em{font-style:italic}.loading-message[_ngcontent-%COMP%]{display:flex;align-items:center;color:var(--mat-sys-on-surface-variant);font-family:Google Sans,Helvetica Neue,sans-serif;padding:0;margin:0}.loading-message[_ngcontent-%COMP%] .dots[_ngcontent-%COMP%]{font-size:24px;letter-spacing:-12px;animation:_ngcontent-%COMP%_pulse 1.4s ease-in-out infinite;display:inline-block;line-height:1}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:.3}50%{opacity:1}}"]})};var dE=class i{constructor(e,A){this.http=e;this.zone=A}apiServerDomain=Rr.getApiServerBaseUrl();_currentApp=new gi("");currentApp=this._currentApp.asObservable();isLoading=new gi(!1);getApp(){return this.currentApp}setApp(e){this._currentApp.next(e)}getLoadingState(){return this.isLoading}runSse(e){let A=this.apiServerDomain+"/run_sse";return this.isLoading.next(!0),new Fi(t=>{let n=this,o=new AbortController,a=o.signal,r;return fetch(A,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream"},body:JSON.stringify(e),signal:a}).then(s=>{r=s.body?.getReader();let l=new TextDecoder("utf-8"),g="",C=()=>{r?.read().then(({done:d,value:B})=>{if(this.isLoading.next(!0),d)return this.isLoading.next(!1),t.complete();let u=l.decode(B,{stream:!0});g+=u;try{g.split(/\r?\n/).filter(f=>f.startsWith("data:")).forEach(f=>{let m=f.replace(/^data:\s*/,""),v=JSON.parse(m);n.zone.run(()=>t.next(v))}),g=""}catch(E){E instanceof SyntaxError&&C()}C()}).catch(d=>{a.aborted||n.zone.run(()=>t.error(d))})};C()}).catch(s=>{a.aborted||n.zone.run(()=>t.error(s))}),()=>{o.abort(),r?.cancel(),this.isLoading.next(!1)}})}listApps(){if(this.apiServerDomain!=null){let e=this.apiServerDomain+"/list-apps?relative_path=./";return this.http.get(e)}return new Fi}getVersion(){if(this.apiServerDomain!=null){let e=this.apiServerDomain+"/version";return this.http.get(e)}return new Fi}agentBuild(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/dev/apps/${e}/builder/save`;return this.http.post(t,A)}return new Fi}agentBuildTmp(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/dev/apps/${e}/builder/save?tmp=true`;return this.http.post(t,A)}return new Fi}getAgentBuilder(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/apps/${e}/builder?ts=${Date.now()}`;return this.http.get(A,{responseType:"text"})}return new Fi}getAgentBuilderTmp(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/apps/${e}/builder?ts=${Date.now()}&tmp=true`;return this.http.get(A,{responseType:"text"})}return new Fi}getSubAgentBuilder(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/dev/apps/${e}/builder?ts=${Date.now()}&file_path=${A}&tmp=true`;return this.http.get(t,{responseType:"text"})}return new Fi}agentChangeCancel(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/apps/${e}/builder/cancel`;return this.http.post(A,{})}return new Fi}getAppInfo(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/apps/${e}/build_graph`;return this.http.get(A)}return new Fi}getAppGraphImage(e,A,t){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/dev/apps/${e}/build_graph_image`,o={dark_mode:A};return t&&(o.node=t),this.http.get(n,{params:o})}return new Fi}static \u0275fac=function(A){return new(A||i)(Wo(Mr),Wo(We))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var juA=["edgeLabelWrapper"],VuA=["edgeLabel",""];function quA(i,e){i&1&&dn(0)}function WuA(i,e){if(i&1&&(Et(),I(0,"foreignObject"),hr(),I(1,"div",1,0),kt(3,quA,1,0,"ng-container",2),h()()),i&2){let A=p(2),t=p();ie("x",t.edgeLabelPoint().x)("y",t.edgeLabelPoint().y)("width",A.size().width)("height",A.size().height),Q(3),H("ngTemplateOutlet",e)("ngTemplateOutletContext",t.getLabelContext())}}function ZuA(i,e){if(i&1&&T(0,WuA,4,6,":svg:foreignObject"),i&2){let A,t=p(2);O((A=t.htmlTemplate())?0:-1,A)}}function XuA(i,e){if(i&1&&(Et(),I(0,"foreignObject"),hr(),I(1,"div",1,0),D(3),h()()),i&2){let A=p(),t=p();ie("x",t.edgeLabelPoint().x)("y",t.edgeLabelPoint().y)("width",A.size().width)("height",A.size().height),Q(),kN(t.edgeLabelStyle()),Q(2),Ee(" ",A.edgeLabel.text," ")}}function $uA(i,e){if(i&1&&(T(0,ZuA,1,1),T(1,XuA,4,7,":svg:foreignObject")),i&2){let A=e,t=p();O(A.edgeLabel.type==="html-template"&&t.htmlTemplate()?0:-1),Q(),O(A.edgeLabel.type==="default"?1:-1)}}var A4A=["edge",""];function e4A(i,e){if(i&1){let A=aA();Et(),lA(0,"path",0),I(1,"path",1),U("click",function(){L(A);let n=p();return n.select(),G(n.pull())}),h()}if(i&2){let A=p();_A("edge_selected",A.model().selected()),ie("d",A.model().path().path)("marker-start",A.model().markerStartUrl())("marker-end",A.model().markerEndUrl()),Q(),ie("d",A.model().path().path)}}function t4A(i,e){if(i&1&&dn(0,2),i&2){let A=p(2);H("ngTemplateOutlet",e)("ngTemplateOutletContext",A.model().context)("ngTemplateOutletInjector",A.injector)}}function i4A(i,e){if(i&1&&T(0,t4A,1,3,"ng-container",2),i&2){let A,t=p();O((A=t.edgeTemplate())?0:-1,A)}}function n4A(i,e){if(i&1&&(Et(),lA(0,"g",3)),i&2){let A=p(),t=p();H("model",A)("point",e)("edgeModel",t.model())("htmlTemplate",t.edgeLabelHtmlTemplate())}}function o4A(i,e){if(i&1&&T(0,n4A,1,4,":svg:g",3),i&2){let A,t=p();O((A=(A=t.model().path().labelPoints)==null?null:A.start)?0:-1,A)}}function a4A(i,e){if(i&1&&(Et(),lA(0,"g",3)),i&2){let A=p(),t=p();H("model",A)("point",e)("edgeModel",t.model())("htmlTemplate",t.edgeLabelHtmlTemplate())}}function r4A(i,e){if(i&1&&T(0,a4A,1,4,":svg:g",3),i&2){let A,t=p();O((A=(A=t.model().path().labelPoints)==null?null:A.center)?0:-1,A)}}function s4A(i,e){if(i&1&&(Et(),lA(0,"g",3)),i&2){let A=p(),t=p();H("model",A)("point",e)("edgeModel",t.model())("htmlTemplate",t.edgeLabelHtmlTemplate())}}function l4A(i,e){if(i&1&&T(0,s4A,1,4,":svg:g",3),i&2){let A,t=p();O((A=(A=t.model().path().labelPoints)==null?null:A.end)?0:-1,A)}}function g4A(i,e){if(i&1){let A=aA();Et(),I(0,"circle",5),U("pointerStart",function(n){L(A);let o=p(2);return G(o.startReconnection(n,o.model().targetHandle()))}),h()}if(i&2){let A=p(2);ie("cx",A.model().sourceHandle().pointAbsolute().x)("cy",A.model().sourceHandle().pointAbsolute().y)}}function c4A(i,e){if(i&1){let A=aA();Et(),I(0,"circle",5),U("pointerStart",function(n){L(A);let o=p(2);return G(o.startReconnection(n,o.model().sourceHandle()))}),h()}if(i&2){let A=p(2);ie("cx",A.model().targetHandle().pointAbsolute().x)("cy",A.model().targetHandle().pointAbsolute().y)}}function C4A(i,e){if(i&1&&(T(0,g4A,1,2,":svg:circle",4),T(1,c4A,1,2,":svg:circle",4)),i&2){let A=p();O(A.model().reconnectable===!0||A.model().reconnectable==="source"?0:-1),Q(),O(A.model().reconnectable===!0||A.model().reconnectable==="target"?1:-1)}}var Xx=["*"],d4A=["resizer"],I4A=["resizable",""];function B4A(i,e){if(i&1){let A=aA();Et(),I(0,"g")(1,"line",1),U("pointerStart",function(n){L(A);let o=p();return G(o.startResize("top",n))}),h(),I(2,"line",2),U("pointerStart",function(n){L(A);let o=p();return G(o.startResize("left",n))}),h(),I(3,"line",3),U("pointerStart",function(n){L(A);let o=p();return G(o.startResize("bottom",n))}),h(),I(4,"line",4),U("pointerStart",function(n){L(A);let o=p();return G(o.startResize("right",n))}),h(),I(5,"rect",5),U("pointerStart",function(n){L(A);let o=p();return G(o.startResize("top-left",n))}),h(),I(6,"rect",6),U("pointerStart",function(n){L(A);let o=p();return G(o.startResize("top-right",n))}),h(),I(7,"rect",7),U("pointerStart",function(n){L(A);let o=p();return G(o.startResize("bottom-left",n))}),h(),I(8,"rect",8),U("pointerStart",function(n){L(A);let o=p();return G(o.startResize("bottom-right",n))}),h()()}if(i&2){let A=p();Q(),ie("x1",A.lineGap)("y1",-A.gap())("x2",A.model.size().width-A.lineGap)("y2",-A.gap())("stroke",A.resizerColor()),Q(),ie("x1",-A.gap())("y1",A.lineGap)("x2",-A.gap())("y2",A.model.size().height-A.lineGap)("stroke",A.resizerColor()),Q(),ie("x1",A.lineGap)("y1",A.model.size().height+A.gap())("x2",A.model.size().width-A.lineGap)("y2",A.model.size().height+A.gap())("stroke",A.resizerColor()),Q(),ie("x1",A.model.size().width+A.gap())("y1",A.lineGap)("x2",A.model.size().width+A.gap())("y2",A.model.size().height-A.lineGap)("stroke",A.resizerColor()),Q(),ie("x",-(A.handleSize/2)-A.gap())("y",-(A.handleSize/2)-A.gap())("width",A.handleSize)("height",A.handleSize)("fill",A.resizerColor()),Q(),ie("x",A.model.size().width-A.handleSize/2+A.gap())("y",-(A.handleSize/2)-A.gap())("width",A.handleSize)("height",A.handleSize)("fill",A.resizerColor()),Q(),ie("x",-(A.handleSize/2)-A.gap())("y",A.model.size().height-A.handleSize/2+A.gap())("width",A.handleSize)("height",A.handleSize)("fill",A.resizerColor()),Q(),ie("x",A.model.size().width-A.handleSize/2+A.gap())("y",A.model.size().height-A.handleSize/2+A.gap())("width",A.handleSize)("height",A.handleSize)("fill",A.resizerColor())}}var h4A=["node",""];function E4A(i,e){if(i&1){let A=aA();Et(),I(0,"foreignObject",3),U("click",function(){L(A);let n=p();return n.pullNode(),G(n.selectNode())}),hr(),I(1,"default-node",4),lA(2,"div",5)(3,"handle",6)(4,"handle",7),h()()}if(i&2){let A=p();ie("width",A.model().foWidth())("height",A.model().foHeight()),Q(),ft("width",A.model().styleWidth())("height",A.model().styleHeight())("max-width",A.model().styleWidth())("max-height",A.model().styleHeight()),H("selected",A.model().selected()),Q(),H("outerHTML",A.model().text(),Fc)}}function Q4A(i,e){if(i&1){let A=aA();Et(),I(0,"foreignObject",3),U("click",function(){L(A);let n=p();return G(n.pullNode())}),hr(),I(1,"div",8),dn(2,9),h()()}if(i&2){let A=p();ie("width",A.model().foWidth())("height",A.model().foHeight()),Q(),ft("width",A.model().styleWidth())("height",A.model().styleHeight()),Q(),H("ngTemplateOutlet",A.nodeTemplate()??null)("ngTemplateOutletContext",A.model().context)("ngTemplateOutletInjector",A.injector)}}function u4A(i,e){if(i&1){let A=aA();Et(),I(0,"g",10),U("click",function(){L(A);let n=p();return G(n.pullNode())}),dn(1,9),h()}if(i&2){let A=p();Q(),H("ngTemplateOutlet",A.nodeSvgTemplate()??null)("ngTemplateOutletContext",A.model().context)("ngTemplateOutletInjector",A.injector)}}function p4A(i,e){if(i&1){let A=aA();Et(),I(0,"foreignObject",3),U("click",function(){L(A);let n=p(2);return G(n.pullNode())}),hr(),I(1,"div",8),dn(2,11),h()()}if(i&2){let A=p(2);ie("width",A.model().foWidth())("height",A.model().foHeight()),Q(),ft("width",A.model().styleWidth())("height",A.model().styleHeight()),Q(),H("ngComponentOutlet",e)("ngComponentOutletInputs",A.model().componentTypeInputs)("ngComponentOutletInjector",A.injector)}}function f4A(i,e){if(i&1&&(T(0,p4A,3,9,":svg:foreignObject",0),mt(1,"async")),i&2){let A,t=p();O((A=Ft(1,1,t.model().componentInstance$))?0:-1,A)}}function m4A(i,e){if(i&1){let A=aA();Et(),I(0,"rect",12),U("click",function(){L(A);let n=p();return n.pullNode(),G(n.selectNode())}),h()}if(i&2){let A=p();ft("stroke",A.model().color())("fill",A.model().color()),_A("default-group-node_selected",A.model().selected()),H("resizable",A.model().resizable())("gap",3)("resizerColor",A.model().color()),ie("width",A.model().size().width)("height",A.model().size().height)}}function w4A(i,e){if(i&1){let A=aA();Et(),I(0,"g",10),U("click",function(){L(A);let n=p();return G(n.pullNode())}),dn(1,9),h()}if(i&2){let A=p();Q(),H("ngTemplateOutlet",A.groupNodeTemplate()??null)("ngTemplateOutletContext",A.model().context)("ngTemplateOutletInjector",A.injector)}}function y4A(i,e){}function D4A(i,e){if(i&1&&kt(0,y4A,0,0,"ng-template",13),i&2){let A=p();H("ngTemplateOutlet",A)}}function v4A(i,e){if(i&1&&T(0,D4A,1,1,null,13),i&2){let A=p();O(A.model().resizable()?0:-1)}}function b4A(i,e){if(i&1){let A=aA();Et(),I(0,"circle",17),U("pointerStart",function(n){L(A);let o=p().$implicit,a=p();return G(a.startConnection(n,o))})("pointerEnd",function(){L(A);let n=p(2);return G(n.endConnection())}),h()}if(i&2){let A=p().$implicit;ie("cx",A.hostOffset().x)("cy",A.hostOffset().y)("stroke-width",A.strokeWidth)}}function M4A(i,e){if(i&1){let A=aA();Et(),I(0,"g",18),U("pointerStart",function(n){L(A);let o=p().$implicit,a=p();return G(a.startConnection(n,o))})("pointerEnd",function(){L(A);let n=p(2);return G(n.endConnection())}),h()}if(i&2){let A=p().$implicit;H("handleSizeController",A)}}function S4A(i,e){i&1&&(Et(),dn(0))}function k4A(i,e){if(i&1){let A=aA();Et(),I(0,"g",18),U("pointerStart",function(n){L(A);let o=p().$implicit,a=p();return G(a.startConnection(n,o))})("pointerEnd",function(){L(A);let n=p(2);return G(n.endConnection())}),kt(1,S4A,1,0,"ng-container",19),h()}if(i&2){let A=p().$implicit;H("handleSizeController",A),Q(),H("ngTemplateOutlet",A.template)("ngTemplateOutletContext",A.templateContext)}}function _4A(i,e){if(i&1){let A=aA();Et(),I(0,"circle",20),U("pointerEnd",function(){L(A);let n=p().$implicit,o=p();return o.endConnection(),G(o.resetValidateConnection(n))})("pointerOver",function(){L(A);let n=p().$implicit,o=p();return G(o.validateConnection(n))})("pointerOut",function(){L(A);let n=p().$implicit,o=p();return G(o.resetValidateConnection(n))}),h()}if(i&2){let A=p().$implicit,t=p();ie("r",t.model().magnetRadius)("cx",A.hostOffset().x)("cy",A.hostOffset().y)}}function x4A(i,e){if(i&1&&(T(0,b4A,1,3,":svg:circle",14),T(1,M4A,1,1,":svg:g",15),T(2,k4A,2,3,":svg:g",15),T(3,_4A,1,3,":svg:circle",16)),i&2){let A=e.$implicit,t=p();O(A.template===void 0?0:-1),Q(),O(A.template===null?1:-1),Q(),O(A.template?2:-1),Q(),O(t.showMagnet()?3:-1)}}function R4A(i,e){if(i&1&&(Et(),I(0,"foreignObject"),hr(),dn(1,13),h()),i&2){let A=e.$implicit;ie("width",A.size().width)("height",A.size().height)("transform",A.transform()),Q(),H("ngTemplateOutlet",A.template())}}var N4A=["connection",""];function F4A(i,e){if(i&1&&(Et(),lA(0,"path",0)),i&2){let A=p(2);ie("d",e)("marker-end",A.markerUrl())("stroke",A.defaultColor)}}function L4A(i,e){if(i&1&&T(0,F4A,1,3,":svg:path",0),i&2){let A,t=p();O((A=t.path())?0:-1,A)}}function G4A(i,e){i&1&&dn(0)}function K4A(i,e){if(i&1&&kt(0,G4A,1,0,"ng-container",1),i&2){let A=p(2);H("ngTemplateOutlet",e)("ngTemplateOutletContext",A.getContext())}}function U4A(i,e){if(i&1&&T(0,K4A,1,2,"ng-container"),i&2){let A,t=p();O((A=t.template())?0:-1,A)}}var T4A=["background",""];function O4A(i,e){if(i&1&&(Et(),Ln(0,"pattern",0),$n(1,"circle"),Xn(),$n(2,"rect",1)),i&2){let A=p();ie("id",A.patternId)("x",A.x())("y",A.y())("width",A.scaledGap())("height",A.scaledGap()),Q(),ie("cx",A.patternSize())("cy",A.patternSize())("r",A.patternSize())("fill",A.patternColor()),Q(),ie("fill",A.patternUrl)}}function J4A(i,e){if(i&1&&(Et(),Ln(0,"pattern",0),$n(1,"image"),Xn(),$n(2,"rect",1)),i&2){let A=p(2);ie("id",A.patternId)("x",A.imageX())("y",A.imageY())("width",A.scaledImageWidth())("height",A.scaledImageHeight()),Q(),ie("href",A.bgImageSrc())("width",A.scaledImageWidth())("height",A.scaledImageHeight()),Q(),ie("fill",A.patternUrl)}}function Y4A(i,e){if(i&1&&(Et(),$n(0,"image")),i&2){let A=p(2);ie("x",A.imageX())("y",A.imageY())("width",A.scaledImageWidth())("height",A.scaledImageHeight())("href",A.bgImageSrc())}}function H4A(i,e){if(i&1&&(T(0,J4A,3,9),T(1,Y4A,1,5,":svg:image")),i&2){let A=p();O(A.repeated()?0:-1),Q(),O(A.repeated()?-1:1)}}var z4A=["flowDefs",""];function P4A(i,e){if(i&1&&(Et(),$n(0,"polyline",3)),i&2){let A=p().$implicit,t=p();ft("stroke",A.value.color??t.defaultColor)("stroke-width",A.value.strokeWidth??2)("fill",A.value.color??t.defaultColor)}}function j4A(i,e){if(i&1&&(Et(),$n(0,"polyline",4)),i&2){let A=p().$implicit,t=p();ft("stroke",A.value.color??t.defaultColor)("stroke-width",A.value.strokeWidth??2)}}function V4A(i,e){if(i&1&&(Et(),Ln(0,"marker",0),T(1,P4A,1,6,":svg:polyline",1),T(2,j4A,1,4,":svg:polyline",2),Xn()),i&2){let A=e.$implicit;ie("id",A.key)("markerWidth",A.value.width??16.5)("markerHeight",A.value.height??16.5)("orient",A.value.orient??"auto-start-reverse")("markerUnits",A.value.markerUnits??"userSpaceOnUse"),Q(),O(A.value.type==="arrow-closed"||!A.value.type?1:-1),Q(),O(A.value.type==="arrow"?2:-1)}}var q4A=["previewFlow",""],W4A=["alignmentHelper",""];function Z4A(i,e){if(i&1&&(Et(),$n(0,"line")),i&2){let A=e.$implicit,t=p(3);ie("stroke",t.lineColor())("stroke-dasharray",A.isCenter?4:null)("x1",A.x)("y1",A.y)("x2",A.x2)("y2",A.y2)}}function X4A(i,e){i&1&&ke(0,Z4A,1,6,":svg:line",null,Ja),i&2&&_e(e.lines)}function $4A(i,e){if(i&1&&T(0,X4A,2,0),i&2){let A,t=p();O((A=t.intersections())?0:-1,A)}}function ApA(i,e){i&1&&(Et(),lA(0,"g",8))}function epA(i,e){if(i&1&&(Et(),lA(0,"g",9)),i&2){let A=p();H("tolerance",A.tolerance)("lineColor",A.lineColor)}}function tpA(i,e){i&1&&T(0,ApA,1,0,":svg:g",8)(1,epA,1,2,":svg:g",9),i&2&&O(e===!0?0:1)}function ipA(i,e){if(i&1&&(Et(),lA(0,"g",10)),i&2){let A,t=e.$implicit,n=p(2);H("model",t)("groupNodeTemplate",(A=n.groupNodeTemplateDirective())==null?null:A.templateRef),ie("transform",t.pointTransform())}}function npA(i,e){if(i&1&&(Et(),lA(0,"g",11)),i&2){let A,t,n=e.$implicit,o=p(2);H("model",n)("edgeTemplate",(A=o.edgeTemplateDirective())==null?null:A.templateRef)("edgeLabelHtmlTemplate",(t=o.edgeLabelHtmlDirective())==null?null:t.templateRef)}}function opA(i,e){if(i&1&&(Et(),lA(0,"g",12)),i&2){let A,t,n=e.$implicit,o=p(2);H("model",n)("nodeTemplate",(A=o.nodeTemplateDirective())==null?null:A.templateRef)("nodeSvgTemplate",(t=o.nodeSvgTemplateDirective())==null?null:t.templateRef),ie("transform",n.pointTransform())}}function apA(i,e){if(i&1&&(ke(0,ipA,1,3,":svg:g",10,wI().trackNodes,!0),ke(2,npA,1,3,":svg:g",11,wI().trackEdges,!0),ke(4,opA,1,4,":svg:g",12,wI().trackNodes,!0)),i&2){let A=p();_e(A.groups()),Q(2),_e(A.edgeModels()),Q(2),_e(A.nonGroups())}}function rpA(i,e){if(i&1&&(Et(),lA(0,"g",11)),i&2){let A,t,n=e.$implicit,o=p(2);H("model",n)("edgeTemplate",(A=o.edgeTemplateDirective())==null?null:A.templateRef)("edgeLabelHtmlTemplate",(t=o.edgeLabelHtmlDirective())==null?null:t.templateRef)}}function spA(i,e){if(i&1&&(Et(),lA(0,"g",13)),i&2){let A,t,n,o=e.$implicit,a=p(2);H("model",o)("nodeTemplate",(A=a.nodeTemplateDirective())==null?null:A.templateRef)("nodeSvgTemplate",(t=a.nodeSvgTemplateDirective())==null?null:t.templateRef)("groupNodeTemplate",(n=a.groupNodeTemplateDirective())==null?null:n.templateRef),ie("transform",o.pointTransform())}}function lpA(i,e){if(i&1&&(ke(0,rpA,1,3,":svg:g",11,wI().trackEdges,!0),ke(2,spA,1,5,":svg:g",13,wI().trackNodes,!0)),i&2){let A=p();_e(A.edgeModels()),Q(2),_e(A.nodeModels())}}function gpA(i,e){i&1&&(Et(),dn(0,6)),i&2&&H("ngTemplateOutlet",e.template())}function cpA(i,e){if(i&1&&lA(0,"canvas",7),i&2){let A=p();H("width",A.flowWidth())("height",A.flowHeight())}}var CpA=["customTemplateEdge",""],dpA=(i,e)=>{let A=Math.max(0,Math.min(i.x+i.width,e.x+e.width)-Math.max(i.x,e.x)),t=Math.max(0,Math.min(i.y+i.height,e.y+e.height)-Math.max(i.y,e.y));return Math.ceil(A*t)};function sZ(i){if(i.length===0)return{x:0,y:0,width:0,height:0};let e={x:1/0,y:1/0,x2:-1/0,y2:-1/0};return i.forEach(A=>{let t=BpA(A);e=EpA(e,t)}),hpA(e)}function IpA(i,e,A){let t=e.find(o=>o.rawNode.id===i);if(!t)return[];let n=v5(t);return e.filter(o=>{if(o.rawNode.id===i)return!1;let a=dpA(v5(o),n);return A?.partially?a>0:a>=n.width*n.height})}function BpA(i){return{x:i.point().x,y:i.point().y,x2:i.point().x+i.size().width,y2:i.point().y+i.size().height}}function v5(i){return{x:i.globalPoint().x,y:i.globalPoint().y,width:i.width(),height:i.height()}}function hpA({x:i,y:e,x2:A,y2:t}){return{x:i,y:e,width:A-i,height:t-e}}function EpA(i,e){return{x:Math.min(i.x,e.x),y:Math.min(i.y,e.y),x2:Math.max(i.x2,e.x2),y2:Math.max(i.y2,e.y2)}}var b5=class{constructor(e){this.settings=e,this.curve=e.curve??"bezier",this.type=e.type??"default",this.mode=e.mode??"strict";let A=this.getValidators(e);this.validator=t=>A.every(n=>n(t))}getValidators(e){let A=[];return A.push(QpA),this.mode==="loose"&&A.push(upA),e.validator&&A.push(e.validator),A}},QpA=i=>i.source!==i.target,upA=i=>i.sourceHandle!==void 0&&i.targetHandle!==void 0;function BE(i){return i.split("").reduce((e,A)=>(e=(e<<5)-e+A.charCodeAt(0),e&e),0)}var pl=(()=>{class i{constructor(){this.nodes=mA([],{equal:(A,t)=>!A.length&&!t.length?!0:A===t}),this.rawNodes=ye(()=>this.nodes().map(A=>A.rawNode)),this.edges=mA([],{equal:(A,t)=>!A.length&&!t.length?!0:A===t}),this.rawEdges=ye(()=>this.edges().map(A=>A.edge)),this.validEdges=ye(()=>{let A=this.nodes();return this.edges().filter(t=>A.includes(t.source())&&A.includes(t.target()))}),this.connection=mA(new b5({})),this.markers=ye(()=>{let A=new Map;this.validEdges().forEach(n=>{if(n.edge.markers?.start){let o=BE(JSON.stringify(n.edge.markers.start));A.set(o,n.edge.markers.start)}if(n.edge.markers?.end){let o=BE(JSON.stringify(n.edge.markers.end));A.set(o,n.edge.markers.end)}});let t=this.connection().settings.marker;if(t){let n=BE(JSON.stringify(t));A.set(n,t)}return A}),this.entities=ye(()=>[...this.nodes(),...this.edges()]),this.minimap=mA(null)}getNode(A){return this.nodes().find(({rawNode:t})=>t.id===A)}getDetachedEdges(){return this.edges().filter(A=>A.detached())}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function ppA(i,e,A,t,n,o){let a=e/(i.width*(1+o)),r=A/(i.height*(1+o)),s=Math.min(a,r),l=fpA(s,t,n),g=i.x+i.width/2,C=i.y+i.height/2,d=e/2-g*l,B=A/2-C*l;return{x:d,y:B,zoom:l}}function fpA(i,e=0,A=1){return Math.min(Math.max(i,e),A)}function mpA(i,e,A){let t=i.zoom;return{x:-i.x/t,y:-i.y/t,width:e/t,height:A/t}}function wpA(i,e,A,t){let n=mpA(e,A,t);return!(i.x+i.widthn.x+n.width||i.y+i.heightn.y+n.height)}var ypA={detachedGroupsLayer:!1,virtualization:!1,virtualizationZoomThreshold:.5,lazyLoadTrigger:"immediate"},as=(()=>{class i{constructor(){this.entitiesSelectable=mA(!0),this.elevateNodesOnSelect=mA(!0),this.elevateEdgesOnSelect=mA(!0),this.view=mA([400,400]),this.computedFlowWidth=mA(0),this.computedFlowHeight=mA(0),this.minZoom=mA(.5),this.maxZoom=mA(3),this.background=mA({type:"solid",color:"#fff"}),this.snapGrid=mA([1,1]),this.optimization=mA(ypA)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),lI=(()=>{class i{constructor(){this.entitiesService=w(pl),this.flowSettingsService=w(as),this.writableViewport=mA({changeType:"initial",state:i.getDefaultViewport(),duration:0}),this.readableViewport=mA(i.getDefaultViewport()),this.viewportChangeEnd$=new ne}static getDefaultViewport(){return{zoom:1,x:0,y:0}}fitView(A={padding:.1,duration:0,nodes:[]}){let t=this.getBoundsNodes(A.nodes??[]),n=ppA(sZ(t),this.flowSettingsService.computedFlowWidth(),this.flowSettingsService.computedFlowHeight(),this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom(),A.padding??.1),o=A.duration??0;this.writableViewport.set({changeType:"absolute",state:n,duration:o})}triggerViewportChangeEvent(A){A==="end"&&this.viewportChangeEnd$.next()}getBoundsNodes(A){return A?.length?A.map(t=>this.entitiesService.nodes().find(({rawNode:n})=>n.id===t)).filter(t=>!!t):this.entitiesService.nodes()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function LC(i){return i!==void 0}var F5=(()=>{class i{constructor(){this.element=w(ce).nativeElement}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["svg","rootSvgRef",""]]})}}return i})();function VW(){let i=window.navigator.userAgent.toLowerCase(),e=/(macintosh|macintel|macppc|mac68k|macos)/i,A=/(win32|win64|windows|wince)/i,t=/(iphone|ipad|ipod)/i,n=null;return e.test(i)?n="macos":t.test(i)?n="ios":A.test(i)?n="windows":/android/.test(i)?n="android":!n&&/linux/.test(i)&&(n="linux"),n}var Jx=(()=>{class i{constructor(){this.actions=mA({multiSelection:[VW()==="macos"?"MetaLeft":"ControlLeft",VW()==="macos"?"MetaRight":"ControlRight"]}),this.actionsActive={multiSelection:!1},Fo(this.actions).pipe(Mi(()=>Vi(Nc(document,"keydown").pipe(mi(A=>{for(let t in this.actions())(this.actions()[t]??[]).includes(A.code)&&(this.actionsActive[t]=!0)})),Nc(document,"keyup").pipe(mi(A=>{for(let t in this.actions())(this.actions()[t]??[]).includes(A.code)&&(this.actionsActive[t]=!1)})))),xr()).subscribe()}setShortcuts(A){this.actions.update(t=>P(P({},t),A))}isActiveAction(A){return this.actionsActive[A]}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),yp=(()=>{class i{constructor(){this.flowEntitiesService=w(pl),this.keyboardService=w(Jx),this.viewport$=new ne,this.resetSelection=this.viewport$.pipe(mi(({start:A,end:t,target:n})=>{if(A&&t&&n){let o=i.delta,a=Math.abs(t.x-A.x),r=Math.abs(t.y-A.y),s=at.selected.set(!1)),A&&A.selected.set(!0))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),Ux=(()=>{class i{constructor(){this.rootSvg=w(F5).element,this.host=w(ce).nativeElement,this.selectionService=w(yp),this.viewportService=w(lI),this.flowSettingsService=w(as),this.zone=w(We),this.rootSvgSelection=zs(this.rootSvg),this.transform=mA(""),this.viewportForSelection={},this.manualViewportChangeEffect=Fn(()=>{let A=this.viewportService.writableViewport(),t=A.state;if(A.changeType!=="initial"){if(LC(t.zoom)&&!LC(t.x)&&!LC(t.y)){this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.scaleTo,t.zoom);return}if(LC(t.x)&&LC(t.y)&&!LC(t.zoom)){let n=wa(this.viewportService.readableViewport).zoom;this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.transform,zD.translate(t.x,t.y).scale(n));return}if(LC(t.x)&&LC(t.y)&&LC(t.zoom)){this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.transform,zD.translate(t.x,t.y).scale(t.zoom));return}}},{allowSignalWrites:!0}),this.handleZoom=({transform:A})=>{this.viewportService.readableViewport.set(Tx(A)),this.transform.set(A.toString())},this.handleZoomStart=({transform:A})=>{this.viewportForSelection={start:Tx(A)}},this.handleZoomEnd=({transform:A,sourceEvent:t})=>{this.zone.run(()=>{this.viewportForSelection=$A(P({},this.viewportForSelection),{end:Tx(A),target:DpA(t)}),this.viewportService.triggerViewportChangeEvent("end"),this.selectionService.setViewport(this.viewportForSelection)})},this.filterCondition=A=>A.type==="mousedown"||A.type==="touchstart"?A.target.closest(".vflow-node")===null:!0}ngOnInit(){this.zone.runOutsideAngular(()=>{this.zoomBehavior=lF().scaleExtent([this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom()]).filter(this.filterCondition).on("start",this.handleZoomStart).on("zoom",this.handleZoom).on("end",this.handleZoomEnd),this.rootSvgSelection.call(this.zoomBehavior).on("dblclick.zoom",null)})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["g","mapContext",""]],hostVars:1,hostBindings:function(t,n){t&2&&ie("transform",n.transform())}})}}return i})(),Tx=i=>({zoom:i.k,x:i.x,y:i.y}),DpA=i=>{if(i instanceof Event&&i.target instanceof Element)return i.target},M5=i=>Math.round(i*100)/100;function ul(i,e){return Math.ceil(i/e)*e}var c1=(()=>{class i{constructor(){this.status=mA({state:"idle",payload:null})}setIdleStatus(){this.status.set({state:"idle",payload:null})}setConnectionStartStatus(A,t){this.status.set({state:"connection-start",payload:{source:A,sourceHandle:t}})}setReconnectionStartStatus(A,t,n){this.status.set({state:"reconnection-start",payload:{source:A,sourceHandle:t,oldEdge:n}})}setConnectionValidationStatus(A,t,n,o,a){this.status.set({state:"connection-validation",payload:{source:t,target:n,sourceHandle:o,targetHandle:a,valid:A}})}setReconnectionValidationStatus(A,t,n,o,a,r){this.status.set({state:"reconnection-validation",payload:{source:t,target:n,sourceHandle:o,targetHandle:a,valid:A,oldEdge:r}})}setConnectionEndStatus(A,t,n,o){this.status.set({state:"connection-end",payload:{source:A,target:t,sourceHandle:n,targetHandle:o}})}setReconnectionEndStatus(A,t,n,o,a){this.status.set({state:"reconnection-end",payload:{source:A,target:t,sourceHandle:n,targetHandle:o,oldEdge:a}})}setNodeDragStartStatus(A){this.status.set({state:"node-drag-start",payload:{node:A}})}setNodeDragEndStatus(A){this.status.set({state:"node-drag-end",payload:{node:A}})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function qW(i){return i.state==="node-drag-start"}function vpA(i){return i.state==="node-drag-end"}var lZ=(()=>{class i{constructor(){this.entitiesService=w(pl),this.settingsService=w(as),this.flowStatusService=w(c1)}enable(A,t){zs(A).call(this.getDragBehavior(t))}disable(A){zs(A).call(HD().on("drag",null))}destroy(A){zs(A).on(".drag",null)}getDragBehavior(A){let t=[],n=[],o=a=>A.dragHandlesCount()?!!a.target.closest(".vflow-drag-handle"):!0;return HD().filter(o).on("start",a=>{t=this.getDragNodes(A),this.flowStatusService.setNodeDragStartStatus(A),n=t.map(r=>({x:r.point().x-a.x,y:r.point().y-a.y}))}).on("drag",a=>{t.forEach((r,s)=>{let l={x:M5(a.x+n[s].x),y:M5(a.y+n[s].y)};this.moveNode(r,l)})}).on("end",()=>{this.flowStatusService.setNodeDragEndStatus(A)})}getDragNodes(A){return A.selected()?this.entitiesService.nodes().filter(t=>t.selected()&&t.draggable()):[A]}moveNode(A,t){t=this.alignToGrid(t);let n=A.parent();n&&(t.x=Math.min(n.width()-A.width(),t.x),t.x=Math.max(0,t.x),t.y=Math.min(n.height()-A.height(),t.y),t.y=Math.max(0,t.y)),A.setPoint(t)}alignToGrid(A){let[t,n]=this.settingsService.snapGrid();return t>1&&(A.x=ul(A.x,t)),n>1&&(A.y=ul(A.y,n)),A}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),S5=(()=>{class i{constructor(){this.templateRef=w(wo)}static ngTemplateContextGuard(A,t){return!0}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["ng-template","edge",""]]})}}return i})(),WW=(()=>{class i{constructor(){this.templateRef=w(wo)}static ngTemplateContextGuard(A,t){return!0}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["ng-template","connection",""]]})}}return i})(),ZW=(()=>{class i{constructor(){this.templateRef=w(wo)}static ngTemplateContextGuard(A,t){return!0}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["ng-template","edgeLabelHtml",""]]})}}return i})(),hE=(()=>{class i{constructor(){this.templateRef=w(wo)}static ngTemplateContextGuard(A,t){return!0}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["ng-template","nodeHtml",""]]})}}return i})(),XW=(()=>{class i{constructor(){this.templateRef=w(wo)}static ngTemplateContextGuard(A,t){return!0}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["ng-template","nodeSvg",""]]})}}return i})(),k5=(()=>{class i{constructor(){this.templateRef=w(wo)}static ngTemplateContextGuard(A,t){return!0}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["ng-template","groupNode",""]]})}}return i})();function $W(i,e){let A=i.reduce((t,n)=>(t[n.rawNode.id]=n,t),{});e.forEach(t=>{t.source.set(A[t.edge.source]),t.target.set(A[t.edge.target])})}function fp(i){try{return new Proxy(i,{apply:()=>{}})(),!0}catch(e){return!1}}var Yx=(()=>{class i{constructor(){this._event$=new ne,this.event$=this._event$.asObservable()}pushEvent(A){this._event$.next(A)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),EE=(()=>{class i{constructor(){this.model=mA(null)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),gZ=(()=>{class i{constructor(){this.eventBus=w(Yx),this.nodeService=w(EE),this.destroyRef=w(Er),this.selected=this.nodeService.model().selected,this.data=mA(void 0)}ngOnInit(){this.trackEvents().pipe(xr(this.destroyRef)).subscribe()}trackEvents(){let A=Object.getOwnPropertyNames(this),t=new Map;for(let n of A){let o=this[n];o instanceof FA&&t.set(o,n),o instanceof RN&&t.set(bpA(o),n)}return Vi(...Array.from(t.keys()).map(n=>n.pipe(mi(o=>{this.eventBus.pushEvent({nodeId:this.nodeService.model()?.rawNode.id??"",eventName:t.get(n),eventPayload:o})}))))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,standalone:!1})}}return i})();function bpA(i){return new Fi(e=>{let A=i.subscribe(t=>{e.next(t)});return()=>{A.unsubscribe()}})}var MpA=(()=>{class i extends gZ{constructor(){super(...arguments),this.node=ve.required()}ngOnInit(){let A=this.node().data;A&&(this.data=A),super.ngOnInit()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})()}static{this.\u0275dir=VA({type:i,inputs:{node:[1,"node"]},standalone:!1,features:[bt]})}}return i})(),SpA=(()=>{class i extends gZ{constructor(){super(...arguments),this.node=ve.required()}ngOnInit(){this.node().data&&this.data.set(this.node().data),super.ngOnInit()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})()}static{this.\u0275dir=VA({type:i,inputs:{node:[1,"node"]},standalone:!1,features:[bt]})}}return i})();function cZ(i){return Object.prototype.isPrototypeOf.call(SpA,i)}function CZ(i){return Object.prototype.isPrototypeOf.call(MpA,i)}function kpA(i){return typeof i.point=="function"}function _pA(i){return cZ(i.type)?!0:fp(i.type)&&!fp(i.point)}function xpA(i){return CZ(i.type)?!0:fp(i.type)&&fp(i.point)}var _5=2;function RpA(i){return kpA(i)?i:$A(P({},NpA(i)),{id:i.id,type:i.type})}function NpA(i){let e={};for(let A in i)Object.prototype.hasOwnProperty.call(i,A)&&(e[A]=mA(i[A]));return e}function FpA(i,e,A){!e&&wN(i);let t=e??w(St);return A?vr(t,A):t}function mp(i,e){let A=FpA(mp,e?.injector),t;return ye(()=>(t||(t=wa(()=>sr(i,$A(P({},e),{injector:A})))),t()))}function LpA(i){return i.rawNode.type==="default-group"||i.rawNode.type==="template-group"}var gI=(()=>{class i{constructor(){this.flowEntitiesService=w(pl),this.flowSettingsService=w(as),this.viewportService=w(lI),this.nodes=ye(()=>this.flowSettingsService.optimization().virtualization?this.viewportNodesAfterInteraction().sort((A,t)=>A.renderOrder()-t.renderOrder()):[...this.flowEntitiesService.nodes()].sort((A,t)=>A.renderOrder()-t.renderOrder())),this.groups=ye(()=>this.nodes().filter(A=>!!A.children().length||LpA(A))),this.nonGroups=ye(()=>this.nodes().filter(A=>!this.groups().includes(A))),this.viewportNodes=ye(()=>{let A=this.flowEntitiesService.nodes(),t=this.viewportService.readableViewport(),n=this.flowSettingsService.computedFlowWidth(),o=this.flowSettingsService.computedFlowHeight();return A.filter(a=>{let{x:r,y:s}=a.globalPoint(),l=a.width(),g=a.height();return wpA({x:r,y:s,width:l,height:g},t,n,o)})}),this.viewportNodesAfterInteraction=mp(Vi(Fo(this.flowEntitiesService.nodes).pipe(pI(qp),Bt(A=>!!A.length)),this.viewportService.viewportChangeEnd$.pipe(Os(300))).pipe(Se(()=>{let A=this.viewportService.readableViewport(),t=this.flowSettingsService.optimization().virtualizationZoomThreshold;return A.zoomMath.max(...this.flowEntitiesService.nodes().map(A=>A.renderOrder())))}pullNode(A){A.renderOrder.set(this.maxOrder()+1),A.children().forEach(t=>this.pullNode(t))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function x5(i,e){e||(e={equal:Object.is});let A;return ye(()=>A=i(A),e)}var GpA=(()=>{class i{static{this.defaultWidth=100}static{this.defaultHeight=50}static{this.defaultColor="#1b262c"}constructor(A){this.rawNode=A,this.entitiesService=w(pl),this.settingsService=w(as),this.nodeRenderingService=w(gI),this.isVisible=mA(!1),this.point=mA({x:0,y:0}),this.width=mA(i.defaultWidth),this.height=mA(i.defaultHeight),this.size=ye(()=>({width:this.width(),height:this.height()})),this.styleWidth=ye(()=>this.controlledByResizer()?`${this.width()}px`:"100%"),this.styleHeight=ye(()=>this.controlledByResizer()?`${this.height()}px`:"100%"),this.foWidth=ye(()=>this.width()+_5),this.foHeight=ye(()=>this.height()+_5),this.renderOrder=mA(0),this.selected=mA(!1),this.preview=mA({style:{}}),this.globalPoint=ye(()=>{let n=this.parent(),o=this.point().x,a=this.point().y;for(;n!==null;)o+=n.point().x,a+=n.point().y,n=n.parent();return{x:o,y:a}}),this.pointTransform=ye(()=>`translate(${this.globalPoint().x}, ${this.globalPoint().y})`),this.handles=mA([]),this.draggable=mA(!0),this.dragHandlesCount=mA(0),this.magnetRadius=20,this.isComponentType=_pA(this.rawNode)||xpA(this.rawNode),this.shouldLoad=x5(n=>{if(n||this.settingsService.optimization().lazyLoadTrigger==="immediate")return!0;if(this.settingsService.optimization().lazyLoadTrigger==="viewport"){if(cZ(this.rawNode.type)||CZ(this.rawNode.type))return!0;if(fp(this.rawNode.type)||this.rawNode.type==="html-template"||this.rawNode.type==="svg-template"||this.rawNode.type==="template-group")return this.nodeRenderingService.viewportNodes().includes(this)}return!0}),this.componentInstance$=Fo(this.shouldLoad).pipe(Bt(Boolean),Mi(()=>this.rawNode.type()),aa(()=>oe(this.rawNode.type)),Js(1)),this.text=mA(""),this.componentTypeInputs={node:this.rawNode},this.parent=ye(()=>this.entitiesService.nodes().find(n=>n.rawNode.id===this.parentId())??null),this.children=ye(()=>this.entitiesService.nodes().filter(n=>n.parentId()===this.rawNode.id)),this.color=mA(i.defaultColor),this.controlledByResizer=mA(!1),this.resizable=mA(!1),this.resizing=mA(!1),this.resizerTemplate=mA(null),this.context={$implicit:{}},this.parentId=mA(null);let t=RpA(A);t.point&&(this.point=t.point),t.width&&(this.width=t.width),t.height&&(this.height=t.height),t.draggable&&(this.draggable=t.draggable),t.parentId&&(this.parentId=t.parentId),t.preview&&(this.preview=t.preview),t.type==="default-group"&&t.color&&(this.color=t.color),t.type==="default-group"&&t.resizable&&(this.resizable=t.resizable),t.type==="default"&&t.text&&(this.text=t.text),t.type==="html-template"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}}),t.type==="svg-template"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),t.type==="template-group"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),this.point$=Fo(this.point),this.width$=Fo(this.width),this.height$=Fo(this.height),this.size$=Fo(this.size),this.selected$=Fo(this.selected),this.handles$=Fo(this.handles)}setPoint(A){this.point.set(A)}}return i})(),up=class{constructor(e){this.edgeLabel=e,this.size=mA({width:0,height:0})}};function GC(i,e,A){return{x:(1-A)*i.x+A*e.x,y:(1-A)*i.y+A*e.y}}function Hx({sourcePoint:i,targetPoint:e}){return{path:`M ${i.x},${i.y}L ${e.x},${e.y}`,labelPoints:{start:GC(i,e,.15),center:GC(i,e,.5),end:GC(i,e,.85)}}}function zx({sourcePoint:i,targetPoint:e,sourcePosition:A,targetPosition:t}){let n={x:i.x-e.x,y:i.y-e.y},o=AZ(i,A,n),a=AZ(e,t,n),r=`M${i.x},${i.y} C${o.x},${o.y} ${a.x},${a.y} ${e.x},${e.y}`;return KpA(r,i,e,o,a)}function AZ(i,e,A){let t={x:0,y:0};switch(e){case"top":t.y=1;break;case"bottom":t.y=-1;break;case"right":t.x=1;break;case"left":t.x=-1;break}let n={x:A.x*Math.abs(t.x),y:A.y*Math.abs(t.y)},a=.25*25*Math.sqrt(Math.abs(n.x+n.y));return{x:i.x+t.x*a,y:i.y-t.y*a}}function KpA(i,e,A,t,n){return{path:i,labelPoints:{start:Ox(e,A,t,n,.1),center:Ox(e,A,t,n,.5),end:Ox(e,A,t,n,.9)}}}function Ox(i,e,A,t,n){let o=GC(i,A,n),a=GC(A,t,n),r=GC(t,e,n);return GC(GC(o,a,n),GC(a,r,n),n)}var eZ={left:{x:-1,y:0},right:{x:1,y:0},top:{x:0,y:-1},bottom:{x:0,y:1}};function UpA(i,e){let A=Math.abs(e.x-i.x)/2,t=e.xe==="left"||e==="right"?i.xMath.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2));function OpA({source:i,sourcePosition:e="bottom",target:A,targetPosition:t="top",offset:n}){let o=eZ[e],a=eZ[t],r={x:i.x+o.x*n,y:i.y+o.y*n},s={x:A.x+a.x*n,y:A.y+a.y*n},l=TpA({source:r,sourcePosition:e,target:s}),g=l.x!==0?"x":"y",C=l[g],d=[],B,u,E={x:0,y:0},f={x:0,y:0},[m,v]=UpA(i,A);if(o[g]*a[g]===-1){B=m,u=v;let k=[{x:B,y:r.y},{x:B,y:s.y}],M=[{x:r.x,y:u},{x:s.x,y:u}];o[g]===C?d=g==="x"?k:M:d=g==="x"?M:k}else{let k=[{x:r.x,y:s.y}],M=[{x:s.x,y:r.y}];if(g==="x"?d=o.x===C?M:k:d=o.y===C?k:M,e===t){let X=Math.abs(i[g]-A[g]);if(X<=n){let eA=Math.min(n-1,n-X);o[g]===C?E[g]=(r[g]>i[g]?-1:1)*eA:f[g]=(s[g]>A[g]?-1:1)*eA}}if(e!==t){let X=g==="x"?"y":"x",eA=o[g]===a[X],Z=r[X]>s[X],CA=r[X]=j?(B=(x.x+F.x)/2,u=d[0].y):(B=d[0].x,u=(x.y+F.y)/2)}return[[i,{x:r.x+E.x,y:r.y+E.y},...d,{x:s.x+f.x,y:s.y+f.y},A],B,u]}function JpA(i,e,A,t){let n=Math.min(tZ(i,e)/2,tZ(e,A)/2,t),{x:o,y:a}=e;if(i.x===o&&o===A.x||i.y===a&&a===A.y)return`L${o} ${a}`;if(i.y===a){let l=i.x{let m="";return f>0&&f{let E=d*u;if(E<=0)return o[0];if(E>=d)return o[l-1];let f=0,m=l-1;for(;f>>1;C[F](this.source()?.shouldLoad()??!1)&&(this.target()?.shouldLoad()??!1)),this.renderOrder=mA(0),this.detached=ye(()=>{let A=this.source(),t=this.target();if(!A||!t)return!0;let n=!1,o=!1;return this.edge.sourceHandle?n=!!A.handles().find(a=>a.rawHandle.id===this.edge.sourceHandle):n=!!A.handles().find(a=>a.rawHandle.type==="source"),this.edge.targetHandle?o=!!t.handles().find(a=>a.rawHandle.id===this.edge.targetHandle):o=!!t.handles().find(a=>a.rawHandle.type==="target"),!n||!o}),this.detached$=Fo(this.detached),this.path=ye(()=>{let A=this.sourceHandle(),t=this.targetHandle();if(!A||!t)return{path:""};let n=this.getPathFactoryParams(A,t);switch(this.curve){case"straight":return Hx(n);case"bezier":return zx(n);case"smooth-step":return IE(n);case"step":return IE(n,0);default:return this.curve(n)}}),this.sourceHandle=x5(A=>{let t=null;return this.floating?t=this.closestHandles().sourceHandle:this.edge.sourceHandle?t=this.source()?.handles().find(n=>n.rawHandle.id===this.edge.sourceHandle)??null:t=this.source()?.handles().find(n=>n.rawHandle.type==="source")??null,t===null?A:t}),this.targetHandle=x5(A=>{let t=null;return this.floating?t=this.closestHandles().targetHandle:this.edge.targetHandle?t=this.target()?.handles().find(n=>n.rawHandle.id===this.edge.targetHandle)??null:t=this.target()?.handles().find(n=>n.rawHandle.type==="target")??null,t===null?A:t}),this.closestHandles=ye(()=>{let A=this.source(),t=this.target();if(!A||!t)return{sourceHandle:null,targetHandle:null};let n=this.flowEntitiesService.connection().mode==="strict"?A.handles().filter(l=>l.rawHandle.type==="source"):A.handles(),o=this.flowEntitiesService.connection().mode==="strict"?t.handles().filter(l=>l.rawHandle.type==="target"):t.handles();if(n.length===0||o.length===0)return{sourceHandle:null,targetHandle:null};let a=1/0,r=null,s=null;for(let l of n)for(let g of o){let C=l.pointAbsolute(),d=g.pointAbsolute(),B=Math.sqrt(Math.pow(C.x-d.x,2)+Math.pow(C.y-d.y,2));B{let A=this.edge.markers?.start;return A?`url(#${BE(JSON.stringify(A))})`:""}),this.markerEndUrl=ye(()=>{let A=this.edge.markers?.end;return A?`url(#${BE(JSON.stringify(A))})`:""}),this.context={$implicit:{edge:this.edge,path:ye(()=>this.path().path),markerStart:this.markerStartUrl,markerEnd:this.markerEndUrl,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}},this.edgeLabels={},this.type=e.type??"default",this.curve=e.curve??"bezier",this.reconnectable=e.reconnectable??!1,this.floating=e.floating??!1,e.edgeLabels?.start&&(this.edgeLabels.start=new up(e.edgeLabels.start)),e.edgeLabels?.center&&(this.edgeLabels.center=new up(e.edgeLabels.center)),e.edgeLabels?.end&&(this.edgeLabels.end=new up(e.edgeLabels.end))}getPathFactoryParams(e,A){return{mode:"edge",edge:this.edge,sourcePoint:e.pointAbsolute(),targetPoint:A.pointAbsolute(),sourcePosition:e.rawHandle.position,targetPosition:A.rawHandle.position,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}},R5=class{static nodes(e,A){let t=new Map;return A.forEach(n=>t.set(n.rawNode,n)),e.map(n=>t.get(n)??new GpA(n))}static edges(e,A){let t=new Map;return A.forEach(n=>t.set(n.edge,n)),e.map(n=>t.has(n)?t.get(n):new Px(n))}},YpA=25,jx=(()=>{class i{constructor(){this.entitiesService=w(pl),this.nodesPositionChange$=Fo(this.entitiesService.nodes).pipe(Mi(A=>Vi(...A.map(t=>t.point$.pipe(Dl(1),Se(()=>t))))),Se(A=>[{type:"position",id:A.rawNode.id,point:A.point()},...this.entitiesService.nodes().filter(t=>t!==A&&t.selected()).map(t=>({type:"position",id:t.rawNode.id,point:t.point()}))])),this.nodeSizeChange$=Fo(this.entitiesService.nodes).pipe(Mi(A=>Vi(...A.map(t=>t.size$.pipe(Dl(1),Se(()=>t))))),Se(A=>[{type:"size",id:A.rawNode.id,size:A.size()}])),this.nodeAddChange$=Fo(this.entitiesService.nodes).pipe(YC(),Se(([A,t])=>t.filter(n=>!A.includes(n))),Bt(A=>!!A.length),Se(A=>A.map(t=>({type:"add",id:t.rawNode.id})))),this.nodeRemoveChange$=Fo(this.entitiesService.nodes).pipe(YC(),Se(([A,t])=>A.filter(n=>!t.includes(n))),Bt(A=>!!A.length),Se(A=>A.map(t=>({type:"remove",id:t.rawNode.id})))),this.nodeSelectedChange$=Fo(this.entitiesService.nodes).pipe(Mi(A=>Vi(...A.map(t=>t.selected$.pipe(xg(),Dl(1),Se(()=>t))))),Se(A=>[{type:"select",id:A.rawNode.id,selected:A.selected()}])),this.changes$=Vi(this.nodesPositionChange$,this.nodeSizeChange$,this.nodeAddChange$,this.nodeRemoveChange$,this.nodeSelectedChange$).pipe(pI(qp,YpA))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),HpA=(i,e)=>i.length===e.length&&[...new Set([...i,...e])].every(A=>i.filter(t=>t===A).length===e.filter(t=>t===A).length),Vx=(()=>{class i{constructor(){this.entitiesService=w(pl),this.edgeDetachedChange$=Vi(Fo(ye(()=>{let A=this.entitiesService.nodes();return wa(this.entitiesService.edges).filter(({source:n,target:o})=>!A.includes(n())||!A.includes(o()))})),Fo(this.entitiesService.edges).pipe(Mi(A=>QN(...A.map(t=>t.detached$.pipe(Se(()=>t))))),Se(A=>A.filter(t=>t.detached())),Dl(2))).pipe(xg(HpA),Bt(A=>!!A.length),Se(A=>A.map(({edge:t})=>({type:"detached",id:t.id})))),this.edgeAddChange$=Fo(this.entitiesService.edges).pipe(YC(),Se(([A,t])=>t.filter(n=>!A.includes(n))),Bt(A=>!!A.length),Se(A=>A.map(({edge:t})=>({type:"add",id:t.id})))),this.edgeRemoveChange$=Fo(this.entitiesService.edges).pipe(YC(),Se(([A,t])=>A.filter(n=>!t.includes(n))),Bt(A=>!!A.length),Se(A=>A.map(({edge:t})=>({type:"remove",id:t.id})))),this.edgeSelectChange$=Fo(this.entitiesService.edges).pipe(Mi(A=>Vi(...A.map(t=>t.selected$.pipe(xg(),Dl(1),Se(()=>t))))),Se(A=>[{type:"select",id:A.edge.id,selected:A.selected()}])),this.changes$=Vi(this.edgeDetachedChange$,this.edgeAddChange$,this.edgeRemoveChange$,this.edgeSelectChange$).pipe(pI(qp))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),zpA=(()=>{class i{constructor(){this.nodesChangeService=w(jx),this.edgesChangeService=w(Vx),this.onNodesChange=Hn(this.nodesChangeService.changes$),this.onNodesChangePosition=Hn(this.nodeChangesOfType("position"),{alias:"onNodesChange.position"}),this.onNodesChangePositionSignle=Hn(this.singleChange(this.nodeChangesOfType("position")),{alias:"onNodesChange.position.single"}),this.onNodesChangePositionMany=Hn(this.manyChanges(this.nodeChangesOfType("position")),{alias:"onNodesChange.position.many"}),this.onNodesChangeSize=Hn(this.nodeChangesOfType("size"),{alias:"onNodesChange.size"}),this.onNodesChangeSizeSingle=Hn(this.singleChange(this.nodeChangesOfType("size")),{alias:"onNodesChange.size.single"}),this.onNodesChangeSizeMany=Hn(this.manyChanges(this.nodeChangesOfType("size")),{alias:"onNodesChange.size.many"}),this.onNodesChangeAdd=Hn(this.nodeChangesOfType("add"),{alias:"onNodesChange.add"}),this.onNodesChangeAddSingle=Hn(this.singleChange(this.nodeChangesOfType("add")),{alias:"onNodesChange.add.single"}),this.onNodesChangeAddMany=Hn(this.manyChanges(this.nodeChangesOfType("add")),{alias:"onNodesChange.add.many"}),this.onNodesChangeRemove=Hn(this.nodeChangesOfType("remove"),{alias:"onNodesChange.remove"}),this.onNodesChangeRemoveSingle=Hn(this.singleChange(this.nodeChangesOfType("remove")),{alias:"onNodesChange.remove.single"}),this.onNodesChangeRemoveMany=Hn(this.manyChanges(this.nodeChangesOfType("remove")),{alias:"onNodesChange.remove.many"}),this.onNodesChangeSelect=Hn(this.nodeChangesOfType("select"),{alias:"onNodesChange.select"}),this.onNodesChangeSelectSingle=Hn(this.singleChange(this.nodeChangesOfType("select")),{alias:"onNodesChange.select.single"}),this.onNodesChangeSelectMany=Hn(this.manyChanges(this.nodeChangesOfType("select")),{alias:"onNodesChange.select.many"}),this.onEdgesChange=Hn(this.edgesChangeService.changes$),this.onNodesChangeDetached=Hn(this.edgeChangesOfType("detached"),{alias:"onEdgesChange.detached"}),this.onNodesChangeDetachedSingle=Hn(this.singleChange(this.edgeChangesOfType("detached")),{alias:"onEdgesChange.detached.single"}),this.onNodesChangeDetachedMany=Hn(this.manyChanges(this.edgeChangesOfType("detached")),{alias:"onEdgesChange.detached.many"}),this.onEdgesChangeAdd=Hn(this.edgeChangesOfType("add"),{alias:"onEdgesChange.add"}),this.onEdgeChangeAddSingle=Hn(this.singleChange(this.edgeChangesOfType("add")),{alias:"onEdgesChange.add.single"}),this.onEdgeChangeAddMany=Hn(this.manyChanges(this.edgeChangesOfType("add")),{alias:"onEdgesChange.add.many"}),this.onEdgeChangeRemove=Hn(this.edgeChangesOfType("remove"),{alias:"onEdgesChange.remove"}),this.onEdgeChangeRemoveSingle=Hn(this.singleChange(this.edgeChangesOfType("remove")),{alias:"onEdgesChange.remove.single"}),this.onEdgeChangeRemoveMany=Hn(this.manyChanges(this.edgeChangesOfType("remove")),{alias:"onEdgesChange.remove.many"}),this.onEdgeChangeSelect=Hn(this.edgeChangesOfType("select"),{alias:"onEdgesChange.select"}),this.onEdgeChangeSelectSingle=Hn(this.singleChange(this.edgeChangesOfType("select")),{alias:"onEdgesChange.select.single"}),this.onEdgeChangeSelectMany=Hn(this.manyChanges(this.edgeChangesOfType("select")),{alias:"onEdgesChange.select.many"})}nodeChangesOfType(A){return this.nodesChangeService.changes$.pipe(Se(t=>t.filter(n=>n.type===A)),Bt(t=>!!t.length))}edgeChangesOfType(A){return this.edgesChangeService.changes$.pipe(Se(t=>t.filter(n=>n.type===A)),Bt(t=>!!t.length))}singleChange(A){return A.pipe(Bt(t=>t.length===1),Se(([t])=>t))}manyChanges(A){return A.pipe(Bt(t=>t.length>1))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["","changesController",""]],outputs:{onNodesChange:"onNodesChange",onNodesChangePosition:"onNodesChange.position",onNodesChangePositionSignle:"onNodesChange.position.single",onNodesChangePositionMany:"onNodesChange.position.many",onNodesChangeSize:"onNodesChange.size",onNodesChangeSizeSingle:"onNodesChange.size.single",onNodesChangeSizeMany:"onNodesChange.size.many",onNodesChangeAdd:"onNodesChange.add",onNodesChangeAddSingle:"onNodesChange.add.single",onNodesChangeAddMany:"onNodesChange.add.many",onNodesChangeRemove:"onNodesChange.remove",onNodesChangeRemoveSingle:"onNodesChange.remove.single",onNodesChangeRemoveMany:"onNodesChange.remove.many",onNodesChangeSelect:"onNodesChange.select",onNodesChangeSelectSingle:"onNodesChange.select.single",onNodesChangeSelectMany:"onNodesChange.select.many",onEdgesChange:"onEdgesChange",onNodesChangeDetached:"onEdgesChange.detached",onNodesChangeDetachedSingle:"onEdgesChange.detached.single",onNodesChangeDetachedMany:"onEdgesChange.detached.many",onEdgesChangeAdd:"onEdgesChange.add",onEdgeChangeAddSingle:"onEdgesChange.add.single",onEdgeChangeAddMany:"onEdgesChange.add.many",onEdgeChangeRemove:"onEdgesChange.remove",onEdgeChangeRemoveSingle:"onEdgesChange.remove.single",onEdgeChangeRemoveMany:"onEdgesChange.remove.many",onEdgeChangeSelect:"onEdgesChange.select",onEdgeChangeSelectSingle:"onEdgesChange.select.single",onEdgeChangeSelectMany:"onEdgesChange.select.many"}})}}return i})(),L5=(()=>{class i{constructor(){this.host=w(ce).nativeElement,this.initialTouch$=new ne,this.prevTouchEvent=null,this.mouseMovement$=Nc(this.host,"mousemove").pipe(Se(A=>({x:A.clientX,y:A.clientY,movementX:A.movementX,movementY:A.movementY,target:A.target,originalEvent:A})),pI(uI),HC()),this.touchMovement$=Vi(this.initialTouch$,Nc(this.host,"touchmove")).pipe(mi(A=>A.preventDefault()),Se(A=>{let t=A.touches[0]?.clientX??0,n=A.touches[0]?.clientY??0,o=this.prevTouchEvent?A.touches[0].pageX-this.prevTouchEvent.touches[0].pageX:0,a=this.prevTouchEvent?A.touches[0].pageY-this.prevTouchEvent.touches[0].pageY:0,r=document.elementFromPoint(t,n);return{x:t,y:n,movementX:o,movementY:a,target:r,originalEvent:A}}),mi(A=>this.prevTouchEvent=A.originalEvent),pI(uI),HC()),this.pointerMovement$=Vi(this.mouseMovement$,this.touchMovement$),this.touchEnd$=Nc(this.host,"touchend").pipe(Se(A=>{let t=A.changedTouches[0]?.clientX??0,n=A.changedTouches[0]?.clientY??0,o=document.elementFromPoint(t,n);return{x:t,y:n,target:o,originalEvent:A}}),mi(()=>this.prevTouchEvent=null),HC()),this.mouseUp$=Nc(this.host,"mouseup").pipe(Se(A=>{let t=A.clientX,n=A.clientY,o=A.target;return{x:t,y:n,target:o,originalEvent:A}}),HC()),this.documentPointerEnd$=Vi(Nc(document,"mouseup"),Nc(document,"touchend")).pipe(HC())}setInitialTouch(A){this.initialTouch$.next(A)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["svg","rootPointer",""]]})}}return i})(),pp=(()=>{class i{constructor(){this.pointerMovementDirective=w(L5),this.rootSvg=w(F5).element,this.host=w(ce).nativeElement,this.svgCurrentSpacePoint=ye(()=>{let A=this.pointerMovement();return A?this.documentPointToFlowPoint({x:A.x,y:A.y}):{x:0,y:0}}),this.pointerMovement=sr(this.pointerMovementDirective.pointerMovement$)}documentPointToFlowPoint(A){let t=this.rootSvg.createSVGPoint();return t.x=A.x,t.y=A.y,t.matrixTransform(this.host.getScreenCTM().inverse())}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["g","spacePointContext",""]]})}}return i})();function PpA(i){return typeof i=="string"?{type:"solid",color:i}:i}function N5(i,e,A){let t=A.value;return A.value=function(...n){queueMicrotask(()=>{t?.apply(this,n)})},A}var dZ=(()=>{class i{constructor(){this.toolbars=mA([]),this.nodeToolbarsMap=ye(()=>{let A=new Map;return this.toolbars().forEach(t=>{let n=A.get(t.node)??[];A.set(t.node,[...n,t])}),A})}addToolbar(A){this.toolbars.update(t=>[...t,A])}removeToolbar(A){this.toolbars.update(t=>t.filter(n=>n!==A))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return jE([N5],i.prototype,"addToolbar",null),jE([N5],i.prototype,"removeToolbar",null),i})();function G5(i,e){return new Fi(A=>{let t=new ResizeObserver(n=>{e.run(()=>A.next(n))});return i.forEach(n=>t.observe(n)),()=>t.disconnect()})}var jpA=(()=>{class i{constructor(){this.zone=w(We),this.destroyRef=w(Er),this.settingsService=w(as),this.model=ve.required(),this.edgeModel=ve.required(),this.point=ve({x:0,y:0}),this.htmlTemplate=ve(),this.edgeLabelWrapperRef=Yo.required("edgeLabelWrapper"),this.edgeLabelPoint=ye(()=>{let A=this.point(),{width:t,height:n}=this.model().size();return{x:A.x-t/2,y:A.y-n/2}}),this.edgeLabelStyle=ye(()=>{let A=this.model().edgeLabel;if(A.type==="default"&&A.style){let t=this.settingsService.background(),n="transparent";return t.type==="dots"&&(n=t.backgroundColor??"#fff"),t.type==="solid"&&(n=t.color),A.style.backgroundColor=A.style.backgroundColor??n,A.style}return null})}ngAfterViewInit(){let A=this.edgeLabelWrapperRef().nativeElement;G5([A],this.zone).pipe(Yn(null),mi(()=>{let t=A.clientWidth+_5,n=A.clientHeight+_5;this.model().size.set({width:t,height:n})}),xr(this.destroyRef)).subscribe()}getLabelContext(){return{$implicit:{edge:this.edgeModel().edge,label:this.model().edgeLabel}}}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["g","edgeLabel",""]],viewQuery:function(t,n){t&1&&ls(n.edgeLabelWrapperRef,juA,5),t&2&&br()},inputs:{model:[1,"model"],edgeModel:[1,"edgeModel"],point:[1,"point"],htmlTemplate:[1,"htmlTemplate"]},attrs:VuA,decls:1,vars:1,consts:[["edgeLabelWrapper",""],[1,"edge-label-wrapper"],[4,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(t,n){if(t&1&&T(0,$uA,2,2),t&2){let o;O((o=n.model())?0:-1,o)}},dependencies:[Uc],styles:[".edge-label-wrapper[_ngcontent-%COMP%]{width:max-content;margin-top:1px;margin-left:1px}"],changeDetection:0})}}return i})();function IZ(i){let e={};return i.sourceHandle.rawHandle.type==="source"?(e.source=i.source,e.sourceHandle=i.sourceHandle):(e.source=i.target,e.sourceHandle=i.targetHandle),i.targetHandle.rawHandle.type==="target"?(e.target=i.target,e.targetHandle=i.targetHandle):(e.target=i.source,e.targetHandle=i.sourceHandle),e}var BZ=(()=>{class i{constructor(){this.statusService=w(c1),this.flowEntitiesService=w(pl),this.onConnect=Hn(Fo(this.statusService.status).pipe(Bt(A=>A.state==="connection-end"),Se(A=>D5(A,this.isStrictMode())),mi(()=>this.statusService.setIdleStatus()),Bt(A=>this.flowEntitiesService.connection().validator(A)))),this.connect=Hn(Fo(this.statusService.status).pipe(Bt(A=>A.state==="connection-end"),Se(A=>D5(A,this.isStrictMode())),mi(()=>this.statusService.setIdleStatus()),Bt(A=>this.flowEntitiesService.connection().validator(A)))),this.onReconnect=Hn(Fo(this.statusService.status).pipe(Bt(A=>A.state==="reconnection-end"),Se(A=>{let t=D5(A,this.isStrictMode()),n=A.payload.oldEdge.edge;return{connection:t,oldEdge:n}}),mi(()=>this.statusService.setIdleStatus()),Bt(({connection:A})=>this.flowEntitiesService.connection().validator(A)))),this.reconnect=Hn(Fo(this.statusService.status).pipe(Bt(A=>A.state==="reconnection-end"),Se(A=>{let t=D5(A,this.isStrictMode()),n=A.payload.oldEdge.edge;return{connection:t,oldEdge:n}}),mi(()=>this.statusService.setIdleStatus()),Bt(({connection:A})=>this.flowEntitiesService.connection().validator(A)))),this.isStrictMode=ye(()=>this.flowEntitiesService.connection().mode==="strict")}startConnection(A){this.statusService.setConnectionStartStatus(A.parentNode,A)}startReconnection(A,t){this.statusService.setReconnectionStartStatus(A.parentNode,A,t)}validateConnection(A){let t=this.statusService.status();if(t.state==="connection-start"||t.state==="reconnection-start"){let n=t.state==="reconnection-start",o=t.payload.source,a=A.parentNode,r=t.payload.sourceHandle,s=A;if(this.isStrictMode()){let g=IZ({source:t.payload.source,sourceHandle:t.payload.sourceHandle,target:A.parentNode,targetHandle:A});o=g.source,a=g.target,r=g.sourceHandle,s=g.targetHandle}let l=this.flowEntitiesService.connection().validator({source:o.rawNode.id,target:a.rawNode.id,sourceHandle:r.rawHandle.id,targetHandle:s.rawHandle.id});A.state.set(l?"valid":"invalid"),n?this.statusService.setReconnectionValidationStatus(l,t.payload.source,A.parentNode,t.payload.sourceHandle,A,t.payload.oldEdge):this.statusService.setConnectionValidationStatus(l,t.payload.source,A.parentNode,t.payload.sourceHandle,A)}}resetValidateConnection(A){A.state.set("idle");let t=this.statusService.status();(t.state==="connection-validation"||t.state==="reconnection-validation")&&(t.state==="reconnection-validation"?this.statusService.setReconnectionStartStatus(t.payload.source,t.payload.sourceHandle,t.payload.oldEdge):this.statusService.setConnectionStartStatus(t.payload.source,t.payload.sourceHandle))}endConnection(){let A=this.statusService.status();if(A.state==="connection-validation"||A.state==="reconnection-validation"){let t=A.state==="reconnection-validation",n=A.payload.source,o=A.payload.sourceHandle,a=A.payload.target,r=A.payload.targetHandle;t?this.statusService.setReconnectionEndStatus(n,a,o,r,A.payload.oldEdge):this.statusService.setConnectionEndStatus(n,a,o,r)}}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["","onConnect",""],["","onReconnect",""],["","connect",""],["","reconnect",""]],outputs:{onConnect:"onConnect",connect:"connect",onReconnect:"onReconnect",reconnect:"reconnect"}})}}return i})();function D5(i,e){let A=i.payload.source,t=i.payload.target,n=i.payload.sourceHandle,o=i.payload.targetHandle;if(e){let g=IZ({source:i.payload.source,sourceHandle:i.payload.sourceHandle,target:i.payload.target,targetHandle:i.payload.targetHandle});A=g.source,t=g.target,n=g.sourceHandle,o=g.targetHandle}let a=A.rawNode.id,r=t.rawNode.id,s=n.rawHandle.id,l=o.rawHandle.id;return{source:a,target:r,sourceHandle:s,targetHandle:l}}var wp=(()=>{class i{constructor(){this.flowEntitiesService=w(pl),this.flowSettingsService=w(as),this.edges=ye(()=>this.flowSettingsService.optimization().virtualization?this.viewportEdges().sort((A,t)=>A.renderOrder()-t.renderOrder()):[...this.flowEntitiesService.validEdges()].sort((A,t)=>A.renderOrder()-t.renderOrder())),this.viewportEdges=ye(()=>this.flowEntitiesService.validEdges().filter(A=>{let t=A.sourceHandle(),n=A.targetHandle();return t&&n})),this.maxOrder=ye(()=>Math.max(...this.flowEntitiesService.validEdges().map(A=>A.renderOrder())))}pull(A){A.renderOrder()!==0&&this.maxOrder()===A.renderOrder()||A.renderOrder.set(this.maxOrder()+1)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function VpA(i){return window.TouchEvent&&i instanceof TouchEvent}var $x=(()=>{class i{constructor(){this.hostElement=w(ce).nativeElement,this.pointerMovementDirective=w(L5),this.pointerOver=Si(),this.pointerOut=Si(),this.pointerStart=Si(),this.pointerEnd=Si(),this.wasPointerOver=!1,this.touchEnd=this.pointerMovementDirective.touchEnd$.pipe(Bt(({target:A})=>A===this.hostElement),mi(({originalEvent:A})=>this.pointerEnd.emit(A)),xr()).subscribe(),this.touchOverOut=this.pointerMovementDirective.touchMovement$.pipe(mi(({target:A,originalEvent:t})=>{this.handleTouchOverAndOut(A,t)}),xr()).subscribe()}onPointerStart(A){this.pointerStart.emit(A),VpA(A)&&this.pointerMovementDirective.setInitialTouch(A)}onPointerEnd(A){this.pointerEnd.emit(A)}onMouseOver(A){this.pointerOver.emit(A)}onMouseOut(A){this.pointerOut.emit(A)}handleTouchOverAndOut(A,t){A===this.hostElement?(this.pointerOver.emit(t),this.wasPointerOver=!0):(this.wasPointerOver&&this.pointerOut.emit(t),this.wasPointerOver=!1)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["","pointerStart",""],["","pointerEnd",""],["","pointerOver",""],["","pointerOut",""]],hostBindings:function(t,n){t&1&&U("mousedown",function(a){return n.onPointerStart(a)})("touchstart",function(a){return n.onPointerStart(a)})("mouseup",function(a){return n.onPointerEnd(a)})("mouseover",function(a){return n.onMouseOver(a)})("mouseout",function(a){return n.onMouseOut(a)})},outputs:{pointerOver:"pointerOver",pointerOut:"pointerOut",pointerStart:"pointerStart",pointerEnd:"pointerEnd"}})}}return i})(),AR=(()=>{class i{constructor(){this.injector=w(St),this.selectionService=w(yp),this.flowSettingsService=w(as),this.flowStatusService=w(c1),this.edgeRenderingService=w(wp),this.connectionController=w(BZ,{optional:!0}),this.model=ve.required(),this.edgeTemplate=ve(),this.edgeLabelHtmlTemplate=ve(),this.isReconnecting=ye(()=>{let A=this.flowStatusService.status();return(A.state==="reconnection-start"||A.state==="reconnection-validation")&&A.payload.oldEdge===this.model()})}select(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}pull(){this.flowSettingsService.elevateEdgesOnSelect()&&this.edgeRenderingService.pull(this.model())}startReconnection(A,t){A.stopPropagation(),this.connectionController?.startReconnection(t,this.model())}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["g","edge",""]],hostAttrs:[1,"selectable"],hostVars:2,hostBindings:function(t,n){t&2&&ft("visibility",n.isReconnecting()?"hidden":"visible")},inputs:{model:[1,"model"],edgeTemplate:[1,"edgeTemplate"],edgeLabelHtmlTemplate:[1,"edgeLabelHtmlTemplate"]},attrs:A4A,decls:6,vars:6,consts:[[1,"edge"],[1,"interactive-edge",3,"click"],[3,"ngTemplateOutlet","ngTemplateOutletContext","ngTemplateOutletInjector"],["edgeLabel","",3,"model","point","edgeModel","htmlTemplate"],["r","10",1,"reconnect-handle"],["r","10",1,"reconnect-handle",3,"pointerStart"]],template:function(t,n){if(t&1&&(T(0,e4A,2,6),T(1,i4A,1,1),T(2,o4A,1,1),T(3,r4A,1,1),T(4,l4A,1,1),T(5,C4A,2,2)),t&2){let o,a,r;O(n.model().type==="default"?0:-1),Q(),O(n.model().type==="template"&&n.edgeTemplate()?1:-1),Q(),O((o=n.model().edgeLabels.start)?2:-1,o),Q(),O((a=n.model().edgeLabels.center)?3:-1,a),Q(),O((r=n.model().edgeLabels.end)?4:-1,r),Q(),O(n.model().sourceHandle()&&n.model().targetHandle()?5:-1)}},dependencies:[Uc,jpA,$x],styles:[".edge[_ngcontent-%COMP%]{fill:none;stroke-width:2;stroke:#b1b1b7}.edge_selected[_ngcontent-%COMP%]{stroke-width:2.5;stroke:#0f4c75}.interactive-edge[_ngcontent-%COMP%]{fill:none;stroke-width:20;stroke:transparent}.reconnect-handle[_ngcontent-%COMP%]{fill:transparent;cursor:move}"],changeDetection:0})}}return i})(),qx=(()=>{class i{constructor(){this.node=mA(null)}createHandle(A){let t=this.node();t&&t.handles.update(n=>[...n,A])}destroyHandle(A){let t=this.node();t&&t.handles.update(n=>n.filter(o=>o!==A))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return jE([N5],i.prototype,"createHandle",null),i})(),qpA=(()=>{class i{constructor(){this.handleModel=ve.required({alias:"handleSizeController"}),this.handleWrapper=w(ce)}ngAfterViewInit(){let A=this.handleWrapper.nativeElement,t=A.getBBox(),n=WpA(A);this.handleModel().size.set({width:t.width+n,height:t.height+n})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["","handleSizeController",""]],inputs:{handleModel:[1,"handleSizeController","handleModel"]}})}}return i})();function WpA(i){let e=i.firstElementChild;if(e){let A=getComputedStyle(e).strokeWidth,t=Number(A.replace("px",""));return isNaN(t)?0:t}return 0}var ZpA=(()=>{class i{constructor(){this.selected=ve(!1)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["default-node"]],hostVars:2,hostBindings:function(t,n){t&2&&_A("selected",n.selected())},inputs:{selected:[1,"selected"]},ngContentSelectors:Xx,decls:1,vars:0,template:function(t,n){t&1&&(Ot(),Ze(0))},styles:["[_nghost-%COMP%]{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}.selected[_nghost-%COMP%]{border-width:2px}"],changeDetection:0})}}return i})(),XpA=(()=>{class i{get model(){return this.nodeAccessor.model()}constructor(){this.nodeAccessor=w(EE),this.rootPointer=w(L5),this.viewportService=w(lI),this.spacePointContext=w(pp),this.settingsService=w(as),this.hostRef=w(ce),this.resizable=ve(),this.resizerColor=ve("#2e414c"),this.gap=ve(1.5),this.resizer=Yo.required("resizer"),this.lineGap=3,this.handleSize=6,this.resizeSide=null,this.zoom=ye(()=>this.viewportService.readableViewport().zoom??0),this.minWidth=0,this.minHeight=0,this.maxWidth=1/0,this.maxHeight=1/0,this.resizeOnGlobalMouseMove=this.rootPointer.pointerMovement$.pipe(Bt(()=>this.resizeSide!==null),Bt(A=>A.movementX!==0||A.movementY!==0),mi(A=>this.resize(A)),xr()).subscribe(),this.endResizeOnGlobalMouseUp=this.rootPointer.documentPointerEnd$.pipe(mi(()=>this.endResize()),xr()).subscribe(),Fn(()=>{let A=this.resizable();typeof A=="boolean"?this.model.resizable.set(A):this.model.resizable.set(!0)},{allowSignalWrites:!0})}ngOnInit(){this.model.controlledByResizer.set(!0),this.model.resizerTemplate.set(this.resizer())}ngOnDestroy(){this.model.controlledByResizer.set(!1)}ngAfterViewInit(){this.minWidth=+getComputedStyle(this.hostRef.nativeElement).minWidth.replace("px","")||0,this.minHeight=+getComputedStyle(this.hostRef.nativeElement).minHeight.replace("px","")||0,this.maxWidth=+getComputedStyle(this.hostRef.nativeElement).maxWidth.replace("px","")||1/0,this.maxHeight=+getComputedStyle(this.hostRef.nativeElement).maxHeight.replace("px","")||1/0}startResize(A,t){t.stopPropagation(),this.resizeSide=A,this.model.resizing.set(!0)}resize(A){if(!this.resizeSide)return;let t=$pA(A.movementX,A.movementY,this.zoom()),n=this.applyResize(this.resizeSide,this.model,t,this.getDistanceToEdge(A)),{x:o,y:a,width:r,height:s}=A3A(n,this.model,this.resizeSide,this.minWidth,this.minHeight,this.maxWidth,this.maxHeight);this.model.setPoint({x:o,y:a}),this.model.width.set(r),this.model.height.set(s)}endResize(){this.resizeSide=null,this.model.resizing.set(!1)}getDistanceToEdge(A){let t=this.spacePointContext.documentPointToFlowPoint({x:A.x,y:A.y}),{x:n,y:o}=this.model.globalPoint();return{left:t.x-n,right:t.x-(n+this.model.width()),top:t.y-o,bottom:t.y-(o+this.model.height())}}applyResize(A,t,n,o){let{x:a,y:r}=t.point(),s=t.width(),l=t.height(),[g,C]=this.settingsService.snapGrid();switch(A){case"left":{let d=n.x+o.left,B=ul(a+d,g),u=B-a;return{x:B,y:r,width:s-u,height:l}}case"right":{let d=n.x+o.right,B=ul(s+d,g);return{x:a,y:r,width:B,height:l}}case"top":{let d=n.y+o.top,B=ul(r+d,C),u=B-r;return{x:a,y:B,width:s,height:l-u}}case"bottom":{let d=n.y+o.bottom,B=ul(l+d,C);return{x:a,y:r,width:s,height:B}}case"top-left":{let d=n.x+o.left,B=n.y+o.top,u=ul(a+d,g),E=ul(r+B,C),f=u-a,m=E-r;return{x:u,y:E,width:s-f,height:l-m}}case"top-right":{let d=n.x+o.right,B=n.y+o.top,u=ul(r+B,C),E=u-r;return{x:a,y:u,width:ul(s+d,g),height:l-E}}case"bottom-left":{let d=n.x+o.left,B=n.y+o.bottom,u=ul(a+d,g),E=u-a;return{x:u,y:r,width:s-E,height:ul(l+B,C)}}case"bottom-right":{let d=n.x+o.right,B=n.y+o.bottom;return{x:a,y:r,width:ul(s+d,g),height:ul(l+B,C)}}}}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["","resizable",""]],viewQuery:function(t,n){t&1&&ls(n.resizer,d4A,5),t&2&&br()},inputs:{resizable:[1,"resizable"],resizerColor:[1,"resizerColor"],gap:[1,"gap"]},attrs:I4A,ngContentSelectors:Xx,decls:3,vars:0,consts:[["resizer",""],["stroke-width","2",1,"top",3,"pointerStart"],["stroke-width","2",1,"left",3,"pointerStart"],["stroke-width","2",1,"bottom",3,"pointerStart"],["stroke-width","2",1,"right",3,"pointerStart"],[1,"top-left",3,"pointerStart"],[1,"top-right",3,"pointerStart"],[1,"bottom-left",3,"pointerStart"],[1,"bottom-right",3,"pointerStart"]],template:function(t,n){t&1&&(Ot(),kt(0,B4A,9,40,"ng-template",null,0,PC),Ze(2))},dependencies:[$x],styles:[".top[_ngcontent-%COMP%]{cursor:n-resize}.left[_ngcontent-%COMP%]{cursor:w-resize}.right[_ngcontent-%COMP%]{cursor:e-resize}.bottom[_ngcontent-%COMP%]{cursor:s-resize}.top-left[_ngcontent-%COMP%]{cursor:nw-resize}.top-right[_ngcontent-%COMP%]{cursor:ne-resize}.bottom-left[_ngcontent-%COMP%]{cursor:sw-resize}.bottom-right[_ngcontent-%COMP%]{cursor:se-resize}"],changeDetection:0})}}return jE([N5],i.prototype,"ngAfterViewInit",null),i})();function $pA(i,e,A){return{x:M5(i/A),y:M5(e/A)}}function A3A(i,e,A,t,n,o,a){let{x:r,y:s,width:l,height:g}=i;l=Math.max(l,0),g=Math.max(g,0),l=Math.max(t,l),g=Math.max(n,g),l=Math.min(o,l),g=Math.min(a,g),r=Math.min(r,e.point().x+e.width()-t),s=Math.min(s,e.point().y+e.height()-n),r=Math.max(r,e.point().x+e.width()-o),s=Math.max(s,e.point().y+e.height()-a);let C=e.parent();if(C){let B=C.width(),u=C.height(),E=e.point().x,f=e.point().y;r=Math.max(r,0),s=Math.max(s,0),A.includes("left")&&r===0&&(l=Math.min(l,E+e.width())),A.includes("top")&&s===0&&(g=Math.min(g,f+e.height())),l=Math.min(l,B-r),g=Math.min(g,u-s)}let d=sZ(e.children());return d&&(A.includes("left")&&(r=Math.min(r,e.point().x+e.width()-(d.x+d.width)),l=Math.max(l,d.x+d.width)),A.includes("right")&&(l=Math.max(l,d.x+d.width)),A.includes("bottom")&&(g=Math.max(g,d.y+d.height)),A.includes("top")&&(s=Math.min(s,e.point().y+e.height()-(d.y+d.height)),g=Math.max(g,d.y+d.height))),{x:r,y:s,width:l,height:g}}var Wx=class{constructor(e,A){this.rawHandle=e,this.parentNode=A,this.strokeWidth=2,this.size=mA({width:10+2*this.strokeWidth,height:10+2*this.strokeWidth}),this.pointAbsolute=ye(()=>({x:this.parentNode.globalPoint().x+this.hostOffset().x+this.sizeOffset().x,y:this.parentNode.globalPoint().y+this.hostOffset().y+this.sizeOffset().y})),this.state=mA("idle"),this.updateHostSizeAndPosition$=new ne,this.hostSize=sr(this.updateHostSizeAndPosition$.pipe(Se(()=>this.getHostSize())),{initialValue:{width:0,height:0}}),this.hostPosition=sr(this.updateHostSizeAndPosition$.pipe(Se(()=>({x:this.hostReference instanceof HTMLElement?this.hostReference.offsetLeft:0,y:this.hostReference instanceof HTMLElement?this.hostReference.offsetTop:0}))),{initialValue:{x:0,y:0}}),this.hostOffset=ye(()=>{switch(this.rawHandle.position){case"left":return{x:-this.rawHandle.userOffsetX,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case"right":return{x:-this.rawHandle.userOffsetX+this.parentNode.size().width,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case"top":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY};case"bottom":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY+this.parentNode.size().height}}}),this.sizeOffset=ye(()=>{switch(this.rawHandle.position){case"left":return{x:-(this.size().width/2),y:0};case"right":return{x:this.size().width/2,y:0};case"top":return{x:0,y:-(this.size().height/2)};case"bottom":return{x:0,y:this.size().height/2}}}),this.hostReference=this.rawHandle.hostReference,this.template=this.rawHandle.template,this.templateContext={$implicit:{point:this.hostOffset,state:this.state,node:this.parentNode.rawNode}}}updateHost(){this.updateHostSizeAndPosition$.next()}getHostSize(){return this.hostReference instanceof HTMLElement?{width:this.hostReference.offsetWidth,height:this.hostReference.offsetHeight}:this.hostReference instanceof SVGGraphicsElement?this.hostReference.getBBox():{width:0,height:0}}},Dp=(()=>{class i{constructor(){this.injector=w(St),this.handleService=w(qx),this.element=w(ce).nativeElement,this.destroyRef=w(Er),this.position=ve.required(),this.type=ve.required(),this.id=ve(),this.template=ve(),this.offsetX=ve(0),this.offsetY=ve(0)}ngOnInit(){vr(this.injector,()=>{let A=this.handleService.node();if(A){let t=new Wx({position:this.position(),type:this.type(),id:this.id(),hostReference:this.element.parentElement,template:this.template(),userOffsetX:this.offsetX(),userOffsetY:this.offsetY()},A);this.handleService.createHandle(t),requestAnimationFrame(()=>t.updateHost()),this.destroyRef.onDestroy(()=>this.handleService.destroyHandle(t))}})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["handle"]],inputs:{position:[1,"position"],type:[1,"type"],id:[1,"id"],template:[1,"template"],offsetX:[1,"offsetX"],offsetY:[1,"offsetY"]},decls:0,vars:0,template:function(t,n){},encapsulation:2,changeDetection:0})}}return i})(),e3A=(()=>{class i{constructor(){this.nodeAccessor=w(EE),this.zone=w(We),this.destroyRef=w(Er),this.hostElementRef=w(ce)}ngOnInit(){this.nodeAccessor.model().handles$.pipe(Mi(t=>G5([...t.map(n=>n.hostReference),this.hostElementRef.nativeElement],this.zone).pipe(Se(()=>t))),mi(t=>{t.forEach(n=>n.updateHost())}),xr(this.destroyRef)).subscribe()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["","nodeHandlesController",""]]})}}return i})(),t3A=(()=>{class i{constructor(){this.nodeAccessor=w(EE),this.zone=w(We),this.destroyRef=w(Er),this.hostElementRef=w(ce)}ngOnInit(){let A=this.nodeAccessor.model(),t=this.hostElementRef.nativeElement;Vi(G5([t],this.zone)).pipe(Yn(null),Bt(()=>!A.resizing()),mi(()=>{A.width.set(t.clientWidth),A.height.set(t.clientHeight)}),xr(this.destroyRef)).subscribe()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["","nodeResizeController",""]]})}}return i})(),hZ=(()=>{class i{constructor(){this.injector=w(St),this.handleService=w(qx),this.draggableService=w(lZ),this.flowStatusService=w(c1),this.nodeRenderingService=w(gI),this.flowSettingsService=w(as),this.selectionService=w(yp),this.hostRef=w(ce),this.nodeAccessor=w(EE),this.overlaysService=w(dZ),this.connectionController=w(BZ,{optional:!0}),this.model=ve.required(),this.nodeTemplate=ve(),this.nodeSvgTemplate=ve(),this.groupNodeTemplate=ve(),this.showMagnet=ye(()=>this.flowStatusService.status().state==="connection-start"||this.flowStatusService.status().state==="connection-validation"||this.flowStatusService.status().state==="reconnection-start"||this.flowStatusService.status().state==="reconnection-validation"),this.toolbars=ye(()=>this.overlaysService.nodeToolbarsMap().get(this.model()))}ngOnInit(){this.model().isVisible.set(!0),this.nodeAccessor.model.set(this.model()),this.handleService.node.set(this.model()),Fn(()=>{this.model().draggable()?this.draggableService.enable(this.hostRef.nativeElement,this.model()):this.draggableService.disable(this.hostRef.nativeElement)},{injector:this.injector})}ngOnDestroy(){this.model().isVisible.set(!1),this.draggableService.destroy(this.hostRef.nativeElement)}startConnection(A,t){A.stopPropagation(),this.connectionController?.startConnection(t)}validateConnection(A){this.connectionController?.validateConnection(A)}resetValidateConnection(A){this.connectionController?.resetValidateConnection(A)}endConnection(){this.connectionController?.endConnection()}pullNode(){this.flowSettingsService.elevateNodesOnSelect()&&this.nodeRenderingService.pullNode(this.model())}selectNode(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["g","node",""]],hostAttrs:[1,"vflow-node"],inputs:{model:[1,"model"],nodeTemplate:[1,"nodeTemplate"],nodeSvgTemplate:[1,"nodeSvgTemplate"],groupNodeTemplate:[1,"groupNodeTemplate"]},features:[pt([qx,EE])],attrs:h4A,decls:11,vars:7,consts:[[1,"selectable"],["nodeHandlesController","",1,"selectable"],["rx","5","ry","5",1,"default-group-node",3,"resizable","gap","resizerColor","default-group-node_selected","stroke","fill"],[1,"selectable",3,"click"],["nodeHandlesController","",3,"selected"],[3,"outerHTML"],["type","source","position","right"],["type","target","position","left"],["nodeHandlesController","","nodeResizeController","",1,"wrapper"],[3,"ngTemplateOutlet","ngTemplateOutletContext","ngTemplateOutletInjector"],["nodeHandlesController","",1,"selectable",3,"click"],[3,"ngComponentOutlet","ngComponentOutletInputs","ngComponentOutletInjector"],["rx","5","ry","5",1,"default-group-node",3,"click","resizable","gap","resizerColor"],[3,"ngTemplateOutlet"],["r","5",1,"default-handle"],[3,"handleSizeController"],[1,"magnet"],["r","5",1,"default-handle",3,"pointerStart","pointerEnd"],[3,"pointerStart","pointerEnd","handleSizeController"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"magnet",3,"pointerEnd","pointerOver","pointerOut"]],template:function(t,n){if(t&1&&(T(0,E4A,5,12,":svg:foreignObject",0),T(1,Q4A,3,9,":svg:foreignObject",0),T(2,u4A,2,3,":svg:g",1),T(3,f4A,2,3),T(4,m4A,1,11,":svg:rect",2),T(5,w4A,2,3,":svg:g",1),T(6,v4A,1,1),ke(7,x4A,4,4,null,null,ni),ke(9,R4A,2,4,":svg:foreignObject",null,ni)),t&2){let o;O(n.model().rawNode.type==="default"?0:-1),Q(),O(n.model().rawNode.type==="html-template"&&n.nodeTemplate()?1:-1),Q(),O(n.model().rawNode.type==="svg-template"&&n.nodeSvgTemplate()?2:-1),Q(),O(n.model().isComponentType?3:-1),Q(),O(n.model().rawNode.type==="default-group"?4:-1),Q(),O(n.model().rawNode.type==="template-group"&&n.groupNodeTemplate()?5:-1),Q(),O((o=n.model().resizerTemplate())?6:-1,o),Q(),_e(n.model().handles()),Q(2),_e(n.toolbars())}},dependencies:[$x,ZpA,Dp,Uc,Kc,XpA,qpA,e3A,t3A,gs],styles:[".magnet[_ngcontent-%COMP%]{opacity:0}.wrapper[_ngcontent-%COMP%]{display:table-cell}.default-group-node[_ngcontent-%COMP%]{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected[_ngcontent-%COMP%]{stroke-width:2px}.default-handle[_ngcontent-%COMP%]{stroke:#fff;fill:#1b262c}"],changeDetection:0})}}return i})(),i3A=(()=>{class i{constructor(){this.flowStatusService=w(c1),this.spacePointContext=w(pp),this.flowEntitiesService=w(pl),this.model=ve.required(),this.template=ve(),this.path=ye(()=>{let A=this.flowStatusService.status(),t=this.model().curve;if(A.state==="connection-start"||A.state==="reconnection-start"){let n=A.payload.sourceHandle,o=n.pointAbsolute(),a=n.rawHandle.position,r=this.spacePointContext.svgCurrentSpacePoint(),s=iZ(n.rawHandle.position),l=this.getPathFactoryParams(o,r,a,s);switch(t){case"straight":return Hx(l).path;case"bezier":return zx(l).path;case"smooth-step":return IE(l).path;case"step":return IE(l,0).path;default:return t(l).path}}if(A.state==="connection-validation"||A.state==="reconnection-validation"){let n=A.payload.sourceHandle,o=n.pointAbsolute(),a=n.rawHandle.position,r=A.payload.targetHandle,s=A.payload.valid?r.pointAbsolute():this.spacePointContext.svgCurrentSpacePoint(),l=A.payload.valid?r.rawHandle.position:iZ(n.rawHandle.position),g=this.getPathFactoryParams(o,s,a,l);switch(t){case"straight":return Hx(g).path;case"bezier":return zx(g).path;case"smooth-step":return IE(g).path;case"step":return IE(g,0).path;default:return t(g).path}}return null}),this.markerUrl=ye(()=>{let A=this.model().settings.marker;return A?`url(#${BE(JSON.stringify(A))})`:""}),this.defaultColor="rgb(177, 177, 183)"}getContext(){return{$implicit:{path:this.path,marker:this.markerUrl}}}getPathFactoryParams(A,t,n,o){return{mode:"connection",sourcePoint:A,targetPoint:t,sourcePosition:n,targetPosition:o,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["g","connection",""]],inputs:{model:[1,"model"],template:[1,"template"]},attrs:N4A,decls:2,vars:2,consts:[["fill","none","stroke-width","2"],[4,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(t,n){t&1&&(T(0,L4A,1,1),T(1,U4A,1,1)),t&2&&(O(n.model().type==="default"?0:-1),Q(),O(n.model().type==="template"?1:-1))},dependencies:[Uc],encapsulation:2,changeDetection:0})}}return i})();function iZ(i){switch(i){case"top":return"bottom";case"bottom":return"top";case"left":return"right";case"right":return"left"}}function n3A(){return String.fromCharCode(65+Math.floor(Math.random()*26))+Date.now()}var o3A="#fff",a3A=20,r3A=2,nZ="rgb(177, 177, 183)",oZ=.1,s3A=!0,l3A=(()=>{class i{constructor(){this.viewportService=w(lI),this.rootSvg=w(F5).element,this.settingsService=w(as),this.backgroundSignal=this.settingsService.background,this.scaledGap=ye(()=>{let A=this.backgroundSignal();return A.type==="dots"?this.viewportService.readableViewport().zoom*(A.gap??a3A):0}),this.x=ye(()=>this.viewportService.readableViewport().x%this.scaledGap()),this.y=ye(()=>this.viewportService.readableViewport().y%this.scaledGap()),this.patternColor=ye(()=>{let A=this.backgroundSignal();return A.type==="dots"?A.color??nZ:nZ}),this.patternSize=ye(()=>{let A=this.backgroundSignal();return A.type==="dots"?this.viewportService.readableViewport().zoom*(A.size??r3A)/2:0}),this.bgImageSrc=ye(()=>{let A=this.backgroundSignal();return A.type==="image"?A.src:""}),this.imageSize=mp(Fo(this.backgroundSignal).pipe(Mi(()=>g3A(this.bgImageSrc())),Se(A=>({width:A.naturalWidth,height:A.naturalHeight}))),{initialValue:{width:0,height:0}}),this.scaledImageWidth=ye(()=>{let A=this.backgroundSignal();if(A.type==="image"){let t=A.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().width*t*(A.scale??oZ)}return 0}),this.scaledImageHeight=ye(()=>{let A=this.backgroundSignal();if(A.type==="image"){let t=A.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().height*t*(A.scale??oZ)}return 0}),this.imageX=ye(()=>{let A=this.backgroundSignal();return A.type==="image"?A.repeat?A.fixed?0:this.viewportService.readableViewport().x%this.scaledImageWidth():A.fixed?0:this.viewportService.readableViewport().x:0}),this.imageY=ye(()=>{let A=this.backgroundSignal();return A.type==="image"?A.repeat?A.fixed?0:this.viewportService.readableViewport().y%this.scaledImageHeight():A.fixed?0:this.viewportService.readableViewport().y:0}),this.repeated=ye(()=>{let A=this.backgroundSignal();return A.type==="image"&&(A.repeat??s3A)}),this.patternId=n3A(),this.patternUrl=`url(#${this.patternId})`,Fn(()=>{let A=this.backgroundSignal();A.type==="dots"&&(this.rootSvg.style.backgroundColor=A.backgroundColor??o3A),A.type==="solid"&&(this.rootSvg.style.backgroundColor=A.color)})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["g","background",""]],attrs:T4A,decls:2,vars:2,consts:[["patternUnits","userSpaceOnUse"],["x","0","y","0","width","100%","height","100%"]],template:function(t,n){t&1&&(T(0,O4A,3,10),T(1,H4A,2,2)),t&2&&(O(n.backgroundSignal().type==="dots"?0:-1),Q(),O(n.backgroundSignal().type==="image"?1:-1))},encapsulation:2,changeDetection:0})}}return i})();function g3A(i){let e=new Image;return e.src=i,new Promise(A=>{e.onload=()=>A(e)})}var c3A=(()=>{class i{constructor(){this.markers=ve.required(),this.defaultColor="rgb(177, 177, 183)"}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["defs","flowDefs",""]],inputs:{markers:[1,"markers"]},attrs:z4A,decls:3,vars:2,consts:[["viewBox","-10 -10 20 20","refX","0","refY","0"],["points","-5,-4 1,0 -5,4 -5,-4",1,"marker__arrow_closed",3,"stroke","stroke-width","fill"],["points","-5,-4 0,0 -5,4",1,"marker__arrow_default",3,"stroke","stroke-width"],["points","-5,-4 1,0 -5,4 -5,-4",1,"marker__arrow_closed"],["points","-5,-4 0,0 -5,4",1,"marker__arrow_default"]],template:function(t,n){t&1&&(ke(0,V4A,3,7,":svg:marker",0,ni),mt(2,"keyvalue")),t&2&&_e(Ft(2,0,n.markers()))},dependencies:[HN],styles:[".marker__arrow_default[_ngcontent-%COMP%]{stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;fill:none}.marker__arrow_closed[_ngcontent-%COMP%]{stroke-linecap:round;stroke-linejoin:round}"],changeDetection:0})}}return i})(),C3A=(()=>{class i{constructor(){this.host=w(ce),this.flowSettingsService=w(as),this.flowWidth=ye(()=>{let A=this.flowSettingsService.view();return A==="auto"?"100%":A[0]}),this.flowHeight=ye(()=>{let A=this.flowSettingsService.view();return A==="auto"?"100%":A[1]}),G5([this.host.nativeElement],w(We)).pipe(mi(([A])=>{this.flowSettingsService.computedFlowWidth.set(A.contentRect.width),this.flowSettingsService.computedFlowHeight.set(A.contentRect.height)}),xr()).subscribe()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["svg","flowSizeController",""]],hostVars:2,hostBindings:function(t,n){t&2&&ie("width",n.flowWidth())("height",n.flowHeight())}})}}return i})(),d3A=(()=>{class i{constructor(){this.flowStatusService=w(c1)}resetConnection(){let A=this.flowStatusService.status();(A.state==="connection-start"||A.state==="reconnection-start")&&this.flowStatusService.setIdleStatus()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["svg","rootSvgContext",""]],hostBindings:function(t,n){t&1&&U("mouseup",function(){return n.resetConnection()},mI)("touchend",function(){return n.resetConnection()},mI)("contextmenu",function(){return n.resetConnection()})}})}}return i})();function Zx(i,e){let A=[];for(let t of e){let{x:n,y:o}=t.globalPoint();i.x>=n&&i.x<=n+t.width()&&i.y>=o&&i.y<=o+t.height()&&A.push({x:i.x-n,y:i.y-o,spaceNodeId:t.rawNode.id})}return A.reverse(),A.push({spaceNodeId:null,x:i.x,y:i.y}),A}var eR=(()=>{class i{static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),I3A=(()=>{class i extends eR{shouldRenderNode(A){return!A.isVisible()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})()}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function B3A(i,e){if(Object.keys(e.preview().style).length){Q3A(i,e);return}if(e.rawNode.type==="default"){h3A(i,e);return}if(e.rawNode.type==="default-group"){E3A(i,e);return}u3A(i,e)}function h3A(i,e){let A=e.globalPoint(),t=e.width(),n=e.height();EZ(i,e,5),i.fillStyle="white",i.fill(),i.strokeStyle="#1b262c",i.lineWidth=1.5,i.stroke(),i.fillStyle="black",i.font="14px Arial",i.textAlign="center",i.textBaseline="middle";let o=A.x+t/2,a=A.y+n/2;i.fillText(e.text(),o,a)}function E3A(i,e){let A=e.globalPoint(),t=e.width(),n=e.height();i.globalAlpha=.05,i.fillStyle=e.color(),i.fillRect(A.x,A.y,t,n),i.globalAlpha=1,i.strokeStyle=e.color(),i.lineWidth=1.5,i.strokeRect(A.x,A.y,t,n)}function Q3A(i,e){let A=e.globalPoint(),t=e.width(),n=e.height(),o=e.preview().style;if(o.borderRadius){let a=parseFloat(o.borderRadius);EZ(i,e,a)}else i.beginPath(),i.rect(A.x,A.y,t,n),i.closePath();o.backgroundColor&&(i.fillStyle=o.backgroundColor),o.borderColor&&(i.strokeStyle=o.borderColor),o.borderWidth&&(i.lineWidth=parseFloat(o.borderWidth)),i.fill(),i.stroke()}function u3A(i,e){let A=e.globalPoint(),t=e.width(),n=e.height();i.fillStyle="rgb(0 0 0 / 10%)",i.fillRect(A.x,A.y,t,n)}function EZ(i,e,A){let t=e.globalPoint(),n=e.width(),o=e.height();i.beginPath(),i.moveTo(t.x+A,t.y),i.lineTo(t.x+n-A,t.y),i.quadraticCurveTo(t.x+n,t.y,t.x+n,t.y+A),i.lineTo(t.x+n,t.y+o-A),i.quadraticCurveTo(t.x+n,t.y+o,t.x+n-A,t.y+o),i.lineTo(t.x+A,t.y+o),i.quadraticCurveTo(t.x,t.y+o,t.x,t.y+o-A),i.lineTo(t.x,t.y+A),i.quadraticCurveTo(t.x,t.y,t.x+A,t.y),i.closePath()}var p3A=(()=>{class i{constructor(){this.viewportService=w(lI),this.renderStrategy=w(eR),this.nodeRenderingService=w(gI),this.renderer2=w(on),this.element=w(ce).nativeElement,this.ctx=this.element.getContext("2d"),this.width=ve(0),this.height=ve(0),this.dpr=window.devicePixelRatio,Fn(()=>{this.renderer2.setProperty(this.element,"width",this.width()*this.dpr),this.renderer2.setProperty(this.element,"height",this.height()*this.dpr),this.renderer2.setStyle(this.element,"width",`${this.width()}px`),this.renderer2.setStyle(this.element,"height",`${this.height()}px`),this.ctx.scale(this.dpr,this.dpr)}),Fn(()=>{let A=this.viewportService.readableViewport();this.ctx.clearRect(0,0,this.width(),this.height()),this.ctx.save(),this.ctx.setTransform(A.zoom*this.dpr,0,0,A.zoom*this.dpr,A.x*this.dpr,A.y*this.dpr);for(let t=0;t{class i{constructor(){this.nodeRenderingService=w(gI),this.edgeRenderingService=w(wp),this.flowEntitiesService=w(pl),this.settingsService=w(as),this.flowInitialized=mA(!1),w(We).runOutsideAngular(()=>re(this,null,function*(){yield f3A(2),this.flowInitialized.set(!0)}))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function f3A(i){return new Promise(e=>{let A=0;function t(){A++,A{class i{constructor(){this.nodeRenderingService=w(gI),this.flowStatus=w(c1),this.tolerance=ve(10),this.lineColor=ve("#1b262c"),this.isNodeDragging=ye(()=>qW(this.flowStatus.status())),this.intersections=x5(A=>{let t=this.flowStatus.status();if(qW(t)){let n=t.payload.node,o=rZ(v5(n)),a=this.nodeRenderingService.viewportNodes().filter(d=>d!==n).filter(d=>!n.children().includes(d)).map(d=>rZ(v5(d))),r=[],s=o.x,l=o.y,g=1/0,C=1/0;return a.forEach(d=>{let B=o.left+o.width/2,u=d.left+d.width/2;for(let[m,v,S,k]of[[B,u,u-o.width/2,!0],[o.left,d.left,d.left,!1],[o.left,d.right,d.right,!1],[o.right,d.left,d.left-o.width,!1],[o.right,d.right,d.right-o.width,!1]]){let M=Math.abs(m-v);if(M<=this.tolerance()){let x=Math.min(o.top,d.top),F=Math.max(o.bottom,d.bottom);if(r.push({x:v,y:x,x2:v,y2:F,isCenter:k}),MA.payload.node),Se(A=>[A,this.intersections()]),mi(([A,t])=>{if(t){let n={x:t.snappedX,y:t.snappedY},o=A.parent()?[A.parent()]:[];A.setPoint(Zx(n,o)[0])}}),xr()).subscribe()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["g","alignmentHelper",""]],inputs:{tolerance:[1,"tolerance"],lineColor:[1,"lineColor"]},attrs:W4A,decls:1,vars:1,template:function(t,n){t&1&&T(0,$4A,1,1),t&2&&O(n.isNodeDragging()?0:-1)},encapsulation:2,changeDetection:0})}}return i})();var K5=(()=>{class i{constructor(){this.viewportService=w(lI),this.flowEntitiesService=w(pl),this.nodesChangeService=w(jx),this.edgesChangeService=w(Vx),this.nodeRenderingService=w(gI),this.edgeRenderingService=w(wp),this.flowSettingsService=w(as),this.componentEventBusService=w(Yx),this.keyboardService=w(Jx),this.injector=w(St),this.flowRenderingService=w(aZ),this.alignmentHelper=ve(!1),this.nodeModels=this.nodeRenderingService.nodes,this.groups=this.nodeRenderingService.groups,this.nonGroups=this.nodeRenderingService.nonGroups,this.edgeModels=this.edgeRenderingService.edges,this.onComponentNodeEvent=Hn(this.componentEventBusService.event$),this.nodeTemplateDirective=K0(hE),this.nodeSvgTemplateDirective=K0(XW),this.groupNodeTemplateDirective=K0(k5),this.edgeTemplateDirective=K0(S5),this.edgeLabelHtmlDirective=K0(ZW),this.connectionTemplateDirective=K0(WW),this.mapContext=Yo(Ux),this.spacePointContext=Yo.required(pp),this.viewport=this.viewportService.readableViewport.asReadonly(),this.nodesChange=mp(this.nodesChangeService.changes$,{initialValue:[]}),this.edgesChange=mp(this.edgesChangeService.changes$,{initialValue:[]}),this.initialized=this.flowRenderingService.flowInitialized.asReadonly(),this.viewportChange$=Fo(this.viewportService.readableViewport).pipe(Dl(1)),this.nodesChange$=this.nodesChangeService.changes$,this.edgesChange$=this.edgesChangeService.changes$,this.initialized$=Fo(this.flowRenderingService.flowInitialized),this.markers=this.flowEntitiesService.markers,this.minimap=this.flowEntitiesService.minimap,this.flowOptimization=this.flowSettingsService.optimization,this.flowWidth=this.flowSettingsService.computedFlowWidth,this.flowHeight=this.flowSettingsService.computedFlowHeight}set view(A){this.flowSettingsService.view.set(A)}set minZoom(A){this.flowSettingsService.minZoom.set(A)}set maxZoom(A){this.flowSettingsService.maxZoom.set(A)}set background(A){this.flowSettingsService.background.set(PpA(A))}set optimization(A){this.flowSettingsService.optimization.update(t=>P(P({},t),A))}set entitiesSelectable(A){this.flowSettingsService.entitiesSelectable.set(A)}set keyboardShortcuts(A){this.keyboardService.setShortcuts(A)}set connection(A){this.flowEntitiesService.connection.set(A)}get connection(){return this.flowEntitiesService.connection()}set snapGrid(A){this.flowSettingsService.snapGrid.set(A)}set elevateNodesOnSelect(A){this.flowSettingsService.elevateNodesOnSelect.set(A)}set elevateEdgesOnSelect(A){this.flowSettingsService.elevateEdgesOnSelect.set(A)}set nodes(A){let t=vr(this.injector,()=>R5.nodes(A,this.flowEntitiesService.nodes()));$W(t,this.flowEntitiesService.edges()),this.flowEntitiesService.nodes.set(t),t.forEach(n=>this.nodeRenderingService.pullNode(n))}set edges(A){let t=vr(this.injector,()=>R5.edges(A,this.flowEntitiesService.edges()));$W(this.flowEntitiesService.nodes(),t),this.flowEntitiesService.edges.set(t)}viewportTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:A,duration:0})}zoomTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:{zoom:A},duration:0})}panTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:A,duration:0})}fitView(A){this.viewportService.fitView(A)}getNode(A){return this.flowEntitiesService.getNode(A)?.rawNode}getDetachedEdges(){return this.flowEntitiesService.getDetachedEdges().map(A=>A.edge)}documentPointToFlowPoint(A,t){let n=this.spacePointContext().documentPointToFlowPoint(A);return t?.spaces?Zx(n,this.nodeRenderingService.groups()):n}getIntesectingNodes(A,t={partially:!0}){return IpA(A,this.nodeModels(),t).map(n=>n.rawNode)}toNodeSpace(A,t){let n=this.nodeModels().find(a=>a.rawNode.id===A);if(!n)return{x:1/0,y:1/0};if(t===null)return n.globalPoint();let o=this.nodeModels().find(a=>a.rawNode.id===t);return o?Zx(n.globalPoint(),[o])[0]:{x:1/0,y:1/0}}trackNodes(A,{rawNode:t}){return t}trackEdges(A,{edge:t}){return t}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["vflow"]],contentQueries:function(t,n,o){t&1&&c3(o,n.nodeTemplateDirective,hE,5)(o,n.nodeSvgTemplateDirective,XW,5)(o,n.groupNodeTemplateDirective,k5,5)(o,n.edgeTemplateDirective,S5,5)(o,n.edgeLabelHtmlDirective,ZW,5)(o,n.connectionTemplateDirective,WW,5),t&2&&br(6)},viewQuery:function(t,n){t&1&&ls(n.mapContext,Ux,5)(n.spacePointContext,pp,5),t&2&&br(2)},inputs:{view:"view",minZoom:"minZoom",maxZoom:"maxZoom",background:"background",optimization:"optimization",entitiesSelectable:"entitiesSelectable",keyboardShortcuts:"keyboardShortcuts",connection:[2,"connection","connection",A=>new b5(A)],snapGrid:"snapGrid",elevateNodesOnSelect:"elevateNodesOnSelect",elevateEdgesOnSelect:"elevateEdgesOnSelect",nodes:"nodes",alignmentHelper:[1,"alignmentHelper"],edges:"edges"},outputs:{onComponentNodeEvent:"onComponentNodeEvent"},features:[pt([lZ,lI,c1,pl,jx,Vx,gI,wp,yp,as,Yx,Jx,dZ,{provide:eR,useClass:I3A},aZ]),r3([{directive:zpA,outputs:["onNodesChange","onNodesChange","onNodesChange.position","onNodesChange.position","onNodesChange.position.single","onNodesChange.position.single","onNodesChange.position.many","onNodesChange.position.many","onNodesChange.size","onNodesChange.size","onNodesChange.size.single","onNodesChange.size.single","onNodesChange.size.many","onNodesChange.size.many","onNodesChange.add","onNodesChange.add","onNodesChange.add.single","onNodesChange.add.single","onNodesChange.add.many","onNodesChange.add.many","onNodesChange.remove","onNodesChange.remove","onNodesChange.remove.single","onNodesChange.remove.single","onNodesChange.remove.many","onNodesChange.remove.many","onNodesChange.select","onNodesChange.select","onNodesChange.select.single","onNodesChange.select.single","onNodesChange.select.many","onNodesChange.select.many","onEdgesChange","onEdgesChange","onEdgesChange.detached","onEdgesChange.detached","onEdgesChange.detached.single","onEdgesChange.detached.single","onEdgesChange.detached.many","onEdgesChange.detached.many","onEdgesChange.add","onEdgesChange.add","onEdgesChange.add.single","onEdgesChange.add.single","onEdgesChange.add.many","onEdgesChange.add.many","onEdgesChange.remove","onEdgesChange.remove","onEdgesChange.remove.single","onEdgesChange.remove.single","onEdgesChange.remove.many","onEdgesChange.remove.many","onEdgesChange.select","onEdgesChange.select","onEdgesChange.select.single","onEdgesChange.select.single","onEdgesChange.select.many","onEdgesChange.select.many"]}])],decls:11,vars:8,consts:[["flow",""],["rootSvgRef","","rootSvgContext","","rootPointer","","flowSizeController","",1,"root-svg"],["flowDefs","",3,"markers"],["background",""],["mapContext","","spacePointContext",""],["connection","",3,"model","template"],[3,"ngTemplateOutlet"],["previewFlow","",1,"preview-flow",3,"width","height"],["alignmentHelper",""],["alignmentHelper","",3,"tolerance","lineColor"],["node","",3,"model","groupNodeTemplate"],["edge","",3,"model","edgeTemplate","edgeLabelHtmlTemplate"],["node","",3,"model","nodeTemplate","nodeSvgTemplate"],["node","",3,"model","nodeTemplate","nodeSvgTemplate","groupNodeTemplate"]],template:function(t,n){if(t&1&&(Et(),I(0,"svg",1,0),lA(2,"defs",2)(3,"g",3),I(4,"g",4),T(5,tpA,2,1),lA(6,"g",5),T(7,apA,6,0),T(8,lpA,4,0),h(),T(9,gpA,1,1,":svg:ng-container",6),h(),T(10,cpA,1,2,"canvas",7)),t&2){let o,a,r;Q(2),H("markers",n.markers()),Q(3),O((o=n.alignmentHelper())?5:-1,o),Q(),H("model",n.connection)("template",(a=n.connectionTemplateDirective())==null?null:a.templateRef),Q(),O(n.flowOptimization().detachedGroupsLayer?7:-1),Q(),O(n.flowOptimization().detachedGroupsLayer?-1:8),Q(),O((r=n.minimap())?9:-1,r),Q(),O(n.flowOptimization().virtualization?10:-1)}},dependencies:[F5,d3A,L5,C3A,c3A,l3A,Ux,pp,i3A,hZ,AR,Uc,p3A,m3A],styles:["[_nghost-%COMP%]{display:grid;grid-template-columns:1fr;width:100%;height:100%;-webkit-user-select:none;user-select:none}[_nghost-%COMP%] *{box-sizing:border-box}.root-svg[_ngcontent-%COMP%]{grid-row-start:1;grid-column-start:1}.preview-flow[_ngcontent-%COMP%]{pointer-events:none;grid-row-start:1;grid-column-start:1}"],changeDetection:0})}}return i})();var U5=(()=>{class i{constructor(){this.flowSettingsService=w(as),this.selectionService=w(yp),this.parentEdge=w(AR,{optional:!0}),this.parentNode=w(hZ,{optional:!0}),this.host=w(ce),this.selectOnEvent=this.getEvent$().pipe(mi(()=>this.select()),xr()).subscribe()}select(){let A=this.entity();A&&this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(A)}entity(){return this.parentNode?this.parentNode.model():this.parentEdge?this.parentEdge.model():null}getEvent$(){return Nc(this.host.nativeElement,"click")}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=VA({type:i,selectors:[["","selectable",""]]})}}return i})();var QZ=(()=>{class i{constructor(){this.edge=w(AR),this.flowSettingsService=w(as),this.edgeRenderingService=w(wp),this.model=this.edge.model(),this.context=this.model.context.$implicit}pull(){this.flowSettingsService.elevateEdgesOnSelect()&&this.edgeRenderingService.pull(this.model)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=vA({type:i,selectors:[["g","customTemplateEdge",""]],hostBindings:function(t,n){t&1&&U("mousedown",function(){return n.pull()})("touchstart",function(){return n.pull()})},attrs:CpA,ngContentSelectors:Xx,decls:3,vars:1,consts:[["interactiveEdge",""],[1,"interactive-edge"]],template:function(t,n){t&1&&(Ot(),Ze(0),Et(),$n(1,"path",1,0)),t&2&&(Q(),ie("d",n.context.path()))},styles:[".interactive-edge[_ngcontent-%COMP%]{fill:none;stroke-width:20;stroke:transparent}"],changeDetection:0})}}return i})();var w3A=["canvas"],y3A=["svgCanvas"],D3A=()=>({type:"dots",color:"#424242",size:1,gap:12}),v3A=()=>[12,12],b3A=(i,e)=>e.name;function M3A(i,e){if(i&1){let A=aA();I(0,"div",6)(1,"div",11)(2,"button",12),U("click",function(){L(A);let n=p();return G(n.backToMainCanvas())}),I(3,"mat-icon"),D(4,"arrow_back"),h()(),I(5,"div",13)(6,"span",14),D(7,"smart_toy"),h(),I(8,"div",15)(9,"h3",16),D(10),h(),I(11,"p",17),D(12,"Agent Tool"),h()()()()()}if(i&2){let A=p();Q(2),H("matTooltip",A.getBackButtonTooltip()),Q(8),nA(A.currentAgentTool())}}function S3A(i,e){if(i&1){let A=aA();I(0,"span",18),U("click",function(){L(A);let n=p();return G(n.toggleSidePanelRequest.emit())}),D(1,"left_panel_open"),h()}}function k3A(i,e){if(i&1){let A=aA();Et(),I(0,"foreignObject"),hr(),I(1,"div",27),U("click",function(n){return n.stopPropagation()}),I(2,"button",28,0),U("click",function(n){return n.stopPropagation()}),I(4,"mat-icon"),D(5,"add"),h()(),I(6,"span",29),D(7,"Add sub-agent"),h(),I(8,"mat-menu",null,1)(10,"button",30),U("click",function(n){let o;L(A);let a=Bi(3),r=p().$implicit,s=p(2);return G(s.handleAgentTypeSelection("LlmAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),I(11,"mat-icon"),D(12,"psychology"),h(),I(13,"span"),D(14,"LLM Agent"),h()(),I(15,"button",30),U("click",function(n){let o;L(A);let a=Bi(3),r=p().$implicit,s=p(2);return G(s.handleAgentTypeSelection("SequentialAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),I(16,"mat-icon"),D(17,"more_horiz"),h(),I(18,"span"),D(19,"Sequential Agent"),h()(),I(20,"button",30),U("click",function(n){let o;L(A);let a=Bi(3),r=p().$implicit,s=p(2);return G(s.handleAgentTypeSelection("LoopAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),I(21,"mat-icon"),D(22,"sync"),h(),I(23,"span"),D(24,"Loop Agent"),h()(),I(25,"button",30),U("click",function(n){let o;L(A);let a=Bi(3),r=p().$implicit,s=p(2);return G(s.handleAgentTypeSelection("ParallelAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),I(26,"mat-icon"),D(27,"density_medium"),h(),I(28,"span"),D(29,"Parallel Agent"),h()()()()()}if(i&2){let A=Bi(9),t=p().$implicit;ie("width",200)("height",100)("x",t.width()/2-100)("y",t.height()/2-40),Q(2),H("matMenuTriggerFor",A)}}function _3A(i,e){i&1&&(Et(),lA(0,"handle",26))}function x3A(i,e){if(i&1){let A=aA();Et(),I(0,"g")(1,"rect",21),U("click",function(n){let o=L(A).$implicit,a=p(2);return G(a.onGroupClick(o.node,n))})("pointerdown",function(n){let o=L(A).$implicit,a=p(2);return G(a.onGroupPointerDown(o.node,n))}),h(),I(2,"foreignObject",22),hr(),I(3,"div",23)(4,"mat-icon",24),D(5),h(),I(6,"span",25),D(7),h()()(),T(8,k3A,30,5,":svg:foreignObject"),T(9,_3A,1,0,":svg:handle",26),h()}if(i&2){let A,t,n=e.$implicit,o=p(2);Q(),ft("stroke",o.isGroupSelected(n.node)?"rgba(0, 187, 234, 0.8)":"rgba(0, 187, 234, 0.3)")("fill",o.isGroupSelected(n.node)?"rgba(0, 187, 234, 0.1)":"rgba(0, 187, 234, 0.03)")("stroke-width",o.isGroupSelected(n.node)?3:2),ie("width",n.width())("height",n.height()),Q(),ie("width",200)("height",32),Q(3),nA(o.getAgentIcon(n.node.data==null||(A=n.node.data())==null?null:A.agent_class)),Q(2),nA(n.node.data==null||(t=n.node.data())==null?null:t.agent_class),Q(),O(o.isGroupEmpty(n.node.id)?8:-1),Q(),O(o.shouldShowTopHandle(n.node)?9:-1)}}function R3A(i,e){i&1&&(I(0,"span",35),D(1,"Root"),h())}function N3A(i,e){if(i&1){let A=aA();I(0,"button",43),U("click",function(n){L(A),p();let o=Ki(0);return p(2).openDeleteSubAgentDialog(o),G(n.stopPropagation())}),I(1,"mat-icon"),D(2,"delete"),h()()}}function F3A(i,e){if(i&1){let A=aA();I(0,"div",46),U("click",function(n){let o=L(A).$implicit,a=p(2).$implicit;return p(2).selectTool(o,a.node),G(n.stopPropagation())}),I(1,"mat-icon",47),D(2),h(),I(3,"span",48),D(4),h()()}if(i&2){let A=e.$implicit,t=p(4);Q(2),nA(t.getToolIcon(A)),Q(2),nA(A.name)}}function L3A(i,e){if(i&1&&(I(0,"div",38)(1,"div",44),ke(2,F3A,5,2,"div",45,b3A),h()()),i&2){p();let A=Ki(3);Q(2),_e(A)}}function G3A(i,e){if(i&1){let A=aA();I(0,"div",39)(1,"button",49,2),U("click",function(n){return n.stopPropagation()}),I(3,"span",50),D(4,"+"),h()(),I(5,"mat-menu",null,3)(7,"button",30),U("click",function(n){let o;L(A);let a=Bi(2),r=p().$implicit,s=p(2);return G(s.handleAgentTypeSelection("LlmAgent",(o=r.node.data())==null?null:o.name,a,n))}),I(8,"mat-icon"),D(9,"psychology"),h(),I(10,"span"),D(11,"LLM Agent"),h()(),I(12,"button",30),U("click",function(n){let o;L(A);let a=Bi(2),r=p().$implicit,s=p(2);return G(s.handleAgentTypeSelection("SequentialAgent",(o=r.node.data())==null?null:o.name,a,n))}),I(13,"mat-icon"),D(14,"more_horiz"),h(),I(15,"span"),D(16,"Sequential Agent"),h()(),I(17,"button",30),U("click",function(n){let o;L(A);let a=Bi(2),r=p().$implicit,s=p(2);return G(s.handleAgentTypeSelection("LoopAgent",(o=r.node.data())==null?null:o.name,a,n))}),I(18,"mat-icon"),D(19,"sync"),h(),I(20,"span"),D(21,"Loop Agent"),h()(),I(22,"button",30),U("click",function(n){let o;L(A);let a=Bi(2),r=p().$implicit,s=p(2);return G(s.handleAgentTypeSelection("ParallelAgent",(o=r.node.data())==null?null:o.name,a,n))}),I(23,"mat-icon"),D(24,"density_medium"),h(),I(25,"span"),D(26,"Parallel Agent"),h()()()()}if(i&2){let A=Bi(6);Q(),H("matMenuTriggerFor",A)}}function K3A(i,e){i&1&&lA(0,"handle",40)}function U3A(i,e){i&1&&lA(0,"handle",26)}function T3A(i,e){i&1&&lA(0,"handle",41)}function O3A(i,e){i&1&&lA(0,"handle",42)}function J3A(i,e){if(i&1){let A=aA();ro(0)(1),mt(2,"async"),ro(3),I(4,"div",31),U("click",function(n){let o=L(A).$implicit,a=p(2);return G(a.onCustomTemplateNodeClick(o.node,n))})("pointerdown",function(n){let o=L(A).$implicit,a=p(2);return G(a.onNodePointerDown(o.node,n))}),I(5,"div",32)(6,"div",33)(7,"mat-icon",34),D(8),h(),D(9),T(10,R3A,2,0,"span",35),h(),I(11,"div",36),T(12,N3A,3,0,"button",37),h()(),T(13,L3A,4,0,"div",38),T(14,G3A,27,1,"div",39),T(15,K3A,1,0,"handle",40),T(16,U3A,1,0,"handle",26),T(17,T3A,1,0,"handle",41),T(18,O3A,1,0,"handle",42),h()}if(i&2){let A=e.$implicit,t=p(2),n=A.node.data==null?null:A.node.data(),o=so((n==null?null:n.name)||"root_agent"),a=Ft(2,17,t.toolsMap$);Q(3);let s=so(t.getToolsForNode(o,a)).length>0;Q(),_A("custom-node_selected",t.isNodeSelected(A.node))("custom-node_has-tools",s)("in-group",A.node.parentId&&A.node.parentId()),Q(4),nA(t.getAgentIcon(n==null?null:n.agent_class)),Q(),Ee(" ",o," "),Q(),O(t.isRootAgent(o)?10:-1),Q(2),O(t.isRootAgentForCurrentTab(o)?-1:12),Q(),O(s?13:-1),Q(),O(t.shouldShowAddButton(A.node)?14:-1),Q(),O(t.shouldShowLeftHandle(A.node)?15:-1),Q(),O(t.shouldShowTopHandle(A.node)?16:-1),Q(),O(t.shouldShowRightHandle(A.node)?17:-1),Q(),O(t.shouldShowBottomHandle(A.node)?18:-1)}}function Y3A(i,e){if(i&1&&(I(0,"vflow",8),kt(1,x3A,10,14,"ng-template",19)(2,J3A,19,20,"ng-template",20),h()),i&2){let A=p();H("nodes",A.vflowNodes())("edges",A.edges())("background",Lc(4,D3A))("snapGrid",Lc(5,v3A))}}function H3A(i,e){i&1&&(I(0,"div",9)(1,"div",51)(2,"mat-icon",52),D(3,"touch_app"),h(),I(4,"h4"),D(5,"Start Building Your ADK"),h(),I(6,"p"),D(7,"Drag components from the left panel to create your workflow"),h(),I(8,"div",53)(9,"div",54)(10,"mat-icon"),D(11,"drag_indicator"),h(),I(12,"span"),D(13,"Drag to move nodes"),h()(),I(14,"div",54)(15,"mat-icon"),D(16,"link"),h(),I(17,"span"),D(18,"Shift + Click to connect nodes"),h()()()()())}var QE=class i{constructor(e,A,t){this.dialog=e;this.agentService=A;this.router=t;this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.agentBuilderService.getSelectedTool().subscribe(n=>{this.selectedTool=n})}_snackbarService=w(Xc);canvasRef;svgCanvasRef;agentBuilderService=w($c);cdr=w(Mt);showSidePanel=!0;showBuilderAssistant=!1;appNameInput="";toggleSidePanelRequest=new FA;builderAssistantCloseRequest=new FA;ctx;connections=mA([]);nodeId=1;edgeId=1;callbackId=1;toolId=1;appName="";nodes=mA([]);edges=mA([]);workflowShellWidth=340;workflowGroupWidth=420;workflowGroupHeight=220;workflowGroupYOffset=180;workflowGroupXOffset=-40;workflowInnerNodePoint={x:40,y:80};groupNodes=mA([]);vflowNodes=ye(()=>[...this.groupNodes(),...this.nodes()]);selectedAgents=[];selectedTool;selectedCallback;currentAgentTool=mA(null);agentToolBoards=mA(new Map);isAgentToolMode=!1;navigationStack=[];existingAgent=void 0;toolsMap$;nodePositions=new Map;ngOnInit(){this.agentService.getApp().subscribe(e=>{e&&(this.appName=e)}),this.appNameInput&&(this.appName=this.appNameInput),this.agentBuilderService.getNewTabRequest().subscribe(e=>{if(e){let{tabName:A,currentAgentName:t}=e;this.switchToAgentToolBoard(A,t)}}),this.agentBuilderService.getTabDeletionRequest().subscribe(e=>{e&&this.deleteAgentToolBoard(e)}),this.agentBuilderService.getSelectedCallback().subscribe(e=>{this.selectedCallback=e}),this.agentBuilderService.getAgentCallbacks().subscribe(e=>{if(e){let A=this.nodes().find(t=>t.data?t.data().name===e.agentName:void 0);if(A&&A.data){let t=A.data();t.callbacks=e.callbacks,A.data.set(t)}}}),this.agentBuilderService.getDeleteSubAgentSubject().subscribe(e=>{e&&this.openDeleteSubAgentDialog(e)}),this.agentBuilderService.getAddSubAgentSubject().subscribe(e=>{e.parentAgentName&&this.addSubAgent(e.parentAgentName,e.agentClass,e.isFromEmptyGroup)}),this.agentBuilderService.getSelectedNode().subscribe(e=>{this.selectedAgents=this.nodes().filter(A=>A.data&&A.data().name===e?.name)}),this.toolsMap$.subscribe(e=>{this.nodes().some(t=>t.parentId&&t.parentId())&&this.groupNodes().length>0&&this.updateGroupDimensions()})}ngOnChanges(e){e.appNameInput&&e.appNameInput.currentValue&&(this.appName=e.appNameInput.currentValue)}ngAfterViewInit(){}onCustomTemplateNodeClick(e,A){this.shouldIgnoreNodeInteraction(A.target)||this.selectAgentNode(e,{openConfig:!0})}onNodePointerDown(e,A){this.shouldIgnoreNodeInteraction(A.target)||this.selectAgentNode(e,{openConfig:!1})}onGroupClick(e,A){if(A.stopPropagation(),!e?.data)return;let t=e.data().name,n=this.nodes().find(o=>o.data&&o.data().name===t);n&&this.selectAgentNode(n,{openConfig:!0})}onGroupPointerDown(e,A){if(A.stopPropagation(),!e?.data)return;let t=e.data().name,n=this.nodes().find(o=>o.data&&o.data().name===t);n&&this.selectAgentNode(n,{openConfig:!1})}onCanvasClick(e){let A=e.target;if(!A)return;let t=[".custom-node",".action-button-bar",".add-subagent-btn",".open-panel-btn",".agent-tool-banner",".mat-mdc-menu-panel"];A.closest(t.join(","))||this.clearCanvasSelection()}shouldIgnoreNodeInteraction(e){return e?!!e.closest("mat-chip, .add-subagent-btn, .mat-mdc-menu-panel"):!1}selectAgentNode(e,A={}){if(!e?.data)return;let t=this.agentBuilderService.getNode(e.data().name);t&&(this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedNode(t),this.nodePositions.set(t.name,P({},e.point())),A.openConfig&&this.agentBuilderService.requestSideTabChange("config"))}handleAgentTypeSelection(e,A,t,n,o=!1){n.stopPropagation(),t?.closeMenu(),this.onAgentTypeSelected(e,A,o)}clearCanvasSelection(){!this.selectedAgents.length&&!this.selectedTool&&!this.selectedCallback||(this.selectedAgents=[],this.selectedTool=void 0,this.selectedCallback=void 0,this.agentBuilderService.setSelectedNode(void 0),this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedCallback(void 0),this.cdr.markForCheck())}onAddResource(e){}onAgentTypeSelected(e,A,t=!1){A&&this.addSubAgent(A,e,t)}generateNodeId(){return this.nodeId+=1,this.nodeId.toString()}generateEdgeId(){return this.edgeId+=1,this.edgeId.toString()}createNode(e,A,t){let n=mA(e),a={id:this.generateNodeId(),point:mA(P({},A)),type:"html-template",data:n};return t&&(a.parentId=mA(t)),this.nodePositions.set(e.name,P({},a.point())),a}createWorkflowGroup(e,A,t,n,o,a){let r,s=null;if(n){let B=(o||this.groupNodes()).find(u=>u.id===n);if(B){let u=B.point(),E=B.height?B.height():this.workflowGroupHeight;if(a&&o){let f=a.filter(m=>m.parentId&&m.parentId()===B.id);if(f.length>0){let z=0;for(let j of f){let X=j.data?j.data():void 0,eA=120;X&&X.tools&&X.tools.length>0&&(eA+=20+X.tools.length*36),z=Math.max(z,eA)}E=Math.max(220,80+z+40)}}r={x:u.x,y:u.y+E+60},s=null}else r={x:t.x+this.workflowGroupXOffset,y:t.y+this.workflowGroupYOffset}}else r={x:t.x+this.workflowGroupXOffset,y:t.y+this.workflowGroupYOffset};let l=this.generateNodeId(),g={id:l,point:mA(r),type:"template-group",data:mA(e),parentId:mA(s),width:mA(this.workflowGroupWidth),height:mA(this.workflowGroupHeight)},C=e.agent_class==="SequentialAgent"?{id:this.generateEdgeId(),source:A.id,sourceHandle:"source-bottom",target:l,targetHandle:"target-top"}:null;return{groupNode:g,edge:C}}calculateWorkflowChildPosition(e,A){let r=(A-20)/2;return{x:45+e*428,y:r}}createAgentNodeWithGroup(e,A,t,n,o){let a=this.createNode(e,A,t),r=null,s=null;if(this.isWorkflowAgent(e.agent_class)){let l=this.createWorkflowGroup(e,a,A,t,n,o);r=l.groupNode,s=l.edge}return{shellNode:a,groupNode:r,groupEdge:s}}createWorkflowChildEdge(e,A){return this.createWorkflowChildEdgeFromArrays(e,A,this.nodes(),this.groupNodes())}createWorkflowChildEdgeFromArrays(e,A,t,n){if(!A)return null;let o=n.find(r=>r.id===A);if(!o||!o.data)return null;let a=o.data().agent_class;if(a==="LoopAgent"||a==="ParallelAgent"){let r=t.find(s=>s.data&&s.data().name===o.data().name);if(r)return{id:this.generateEdgeId(),source:r.id,sourceHandle:"source-bottom",target:e.id,targetHandle:"target-top"}}if(a==="SequentialAgent"){let r=t.filter(g=>g.parentId&&g.parentId()===A);if(r.length===0)return null;r.sort((g,C)=>g.point().x-C.point().x);let s=r.findIndex(g=>g.id===e.id);if(s<=0)return null;let l=r[s-1];return{id:this.generateEdgeId(),source:l.id,sourceHandle:"source-right",target:e.id,targetHandle:"target-left"}}return null}isWorkflowAgent(e){return e?e==="SequentialAgent"||e==="ParallelAgent"||e==="LoopAgent":!1}addSubAgent(e,A="LlmAgent",t=!1){let n=this.nodes().find(C=>C.data&&C.data().name===e);if(!n||!n.data)return;let a={name:this.agentBuilderService.getNextSubAgentName(),agent_class:A,model:"gemini-2.5-flash",instruction:"You are a sub-agent that performs specialized tasks.",isRoot:!1,sub_agents:[],tools:[]},r=this.isWorkflowAgent(n.data().agent_class),s=n.parentId&&n.parentId()&&this.groupNodes().some(C=>C.id===n.parentId()),l,g=null;if(t&&r){let C=n.data();if(!C)return;let d=this.groupNodes().find(v=>v.data&&v.data()?.name===C.name);if(!d){console.error("Could not find group for workflow node");return}let B=this.agentBuilderService.getNode(n.data().name);if(!B){console.error("Could not find clicked agent data");return}let u=B.sub_agents.length,E=d.height?d.height():this.workflowGroupHeight,f=this.calculateWorkflowChildPosition(u,E),m=this.createAgentNodeWithGroup(a,f,d.id);l=m.shellNode,g=m.groupNode,B.sub_agents.push(a),g&&this.groupNodes.set([...this.groupNodes(),g]),m.groupEdge&&this.edges.set([...this.edges(),m.groupEdge])}else if(s){let C=n.parentId()??void 0,d=this.groupNodes().find(S=>S.id===C);if(!d||!d.data){console.error("Could not find parent group node");return}let B=d.data().name,u=this.agentBuilderService.getNode(B);if(!u){console.error("Could not find workflow parent agent");return}let E=u.sub_agents.length,f=d.height?d.height():this.workflowGroupHeight,m=this.calculateWorkflowChildPosition(E,f),v=this.createAgentNodeWithGroup(a,m,C);l=v.shellNode,g=v.groupNode,u.sub_agents.push(a),g&&this.groupNodes.set([...this.groupNodes(),g]),v.groupEdge&&this.edges.set([...this.edges(),v.groupEdge])}else{let C=n.data().sub_agents.length,d={x:n.point().x+C*400,y:n.point().y+300},B=this.createAgentNodeWithGroup(a,d);l=B.shellNode,g=B.groupNode;let u=this.agentBuilderService.getNode(n.data().name);u&&u.sub_agents.push(a),g&&this.groupNodes.set([...this.groupNodes(),g]),B.groupEdge&&this.edges.set([...this.edges(),B.groupEdge])}if(this.agentBuilderService.addNode(a),this.nodes.set([...this.nodes(),l]),this.selectedAgents=[l],(s||r)&&this.updateGroupDimensions(),r||s){let C=l.parentId?l.parentId()??void 0:void 0,d=this.createWorkflowChildEdge(l,C);d&&this.edges.set([...this.edges(),d])}else{let C={id:this.generateEdgeId(),source:n.id,sourceHandle:"source-bottom",target:l.id,targetHandle:"target-top"};this.edges.set([...this.edges(),C])}this.agentBuilderService.setSelectedNode(a),this.agentBuilderService.requestSideTabChange("config")}addTool(e){let A=this.nodes().find(o=>o.id===e);if(!A||!A.data)return;let t=A.data();if(!t)return;this.dialog.open(Q2,{width:"500px"}).afterClosed().subscribe(o=>{if(o)if(o.toolType==="Agent Tool")this.createAgentTool(t.name);else{let a={toolType:o.toolType,name:o.name};this.agentBuilderService.addTool(t.name,a),this.agentBuilderService.setSelectedTool(a)}})}addCallback(e){let A=this.nodes().find(o=>o.id===e);if(!A||!A.data)return;let t={name:`callback_${this.callbackId}`,type:"before_agent",code:`def callback_function(callback_context): - # Add your callback logic here - return None`,description:"Auto-generated callback"};this.callbackId++;let n=this.agentBuilderService.addCallback(A.data().name,t);n.success||this._snackbarService.open(n.error||"Failed to add callback","Close",{duration:3e3,panelClass:["error-snackbar"]})}createAgentTool(e){this.dialog.open(vc,{width:"750px",height:"310px",data:{title:"Create Agent Tool",message:"Please enter a name for the agent tool:",confirmButtonText:"Create",showInput:!0,inputLabel:"Agent Tool Name",inputPlaceholder:"Enter agent tool name"}}).afterClosed().subscribe(t=>{t&&typeof t=="string"&&this.agentBuilderService.requestNewTab(t,e)})}deleteTool(e,A){let t=A.toolType==="Agent Tool",n=t&&A.toolAgentName||A.name;this.dialog.open(vc,{data:{title:t?"Delete Agent Tool":"Delete Tool",message:t?`Are you sure you want to delete the agent tool "${n}"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(a=>{a==="confirm"&&this.deleteToolWithoutDialog(e,A)})}deleteToolWithoutDialog(e,A){if(A.toolType==="Agent Tool"){let t=A.toolAgentName||A.name;this.deleteAgentToolAndBoard(e,A,t)}else this.agentBuilderService.deleteTool(e,A)}deleteAgentToolAndBoard(e,A,t){this.agentBuilderService.deleteTool(e,A),this.agentBuilderService.requestTabDeletion(t)}deleteCallback(e,A){this.dialog.open(vc,{data:{title:"Delete Callback",message:`Are you sure you want to delete ${A.name}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(n=>{if(n==="confirm"){let o=this.agentBuilderService.deleteCallback(e,A);o.success||this._snackbarService.open(o.error||"Failed to delete callback","Close",{duration:3e3,panelClass:["error-snackbar"]}),this.cdr.detectChanges()}})}openDeleteSubAgentDialog(e){this.dialog.open(vc,{data:{title:"Delete sub agent",message:`Are you sure you want to delete ${e}? This will also delete all the underlying sub agents and tools.`,confirmButtonText:"Delete"}}).afterClosed().subscribe(t=>{t==="confirm"&&this.deleteSubAgent(e)})}deleteSubAgent(e){let A=this.agentBuilderService.getNode(e);if(!A)return;let t=this.agentBuilderService.getParentNode(this.agentBuilderService.getRootNode(),A,void 0,this.agentToolBoards());t&&(this.deleteSubAgentHelper(A,t),this.agentBuilderService.getSelectedNode().pipe(Ro(1),Bt(n=>!!n)).subscribe(n=>{this.agentBuilderService.getNodes().includes(n)||this.agentBuilderService.setSelectedNode(t)}))}isNodeInSequentialWorkflow(e){if(!e.parentId||!e.parentId())return!1;let A=e.parentId(),t=this.groupNodes().find(n=>n.id===A);return!t||!t.data?!1:t.data().agent_class==="SequentialAgent"}getSequentialSiblings(e){if(!e.parentId||!e.parentId())return{previous:void 0,next:void 0};let A=e.parentId(),t=this.nodes().filter(o=>o.parentId&&o.parentId()===A);t.sort((o,a)=>o.point().x-a.point().x);let n=t.findIndex(o=>o.id===e.id);return n===-1?{previous:void 0,next:void 0}:{previous:n>0?t[n-1]:void 0,next:nn.data&&n.data().name===e.name);if(t){let n=this.isNodeInSequentialWorkflow(t),o,a;if(n){let s=this.getSequentialSiblings(t);o=s.previous,a=s.next}this.nodes.set(this.nodes().filter(s=>s.id!==t.id));let r=this.groupNodes().find(s=>s.data&&s.data().name===e.name);if(r){this.groupNodes.set(this.groupNodes().filter(l=>l.id!==r.id));let s=this.edges().filter(l=>l.target!==t.id&&l.source!==t.id&&l.target!==r.id&&l.source!==r.id);this.edges.set(s)}else{let s=this.edges().filter(l=>l.target!==t.id&&l.source!==t.id);this.edges.set(s)}if(n&&o&&a){let s={id:this.generateEdgeId(),source:o.id,sourceHandle:"source-right",target:a.id,targetHandle:"target-left"};this.edges.set([...this.edges(),s])}}this.nodePositions.delete(e.name),A.sub_agents=A.sub_agents.filter(n=>n.name!==e.name),this.agentBuilderService.deleteNode(e),t&&t.parentId&&t.parentId()&&this.updateGroupDimensions()}selectTool(e,A){if(e.toolType==="Agent Tool"){let t=e.name;this.switchToAgentToolBoard(t);return}if(e.toolType==="Function tool"||e.toolType==="Built-in tool"){if(A.data){let t=this.agentBuilderService.getNode(A.data().name);t&&this.editTool(e,t)}return}if(A.data){let t=this.agentBuilderService.getNode(A.data().name);t&&this.agentBuilderService.setSelectedNode(t)}this.agentBuilderService.setSelectedTool(e)}editTool(e,A){let t;e.toolType==="Built-in tool"?t=this.dialog.open(sI,{width:"700px",maxWidth:"90vw",data:{toolName:e.name,isEditMode:!0,toolArgs:e.args}}):t=this.dialog.open(Q2,{width:"500px",data:{toolType:e.toolType,toolName:e.name,isEditMode:!0}}),t.afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=A.tools?.findIndex(a=>a.name===e.name);o!==void 0&&o!==-1&&A.tools&&(A.tools[o].name=n.name,n.args&&(A.tools[o].args=n.args),this.agentBuilderService.setAgentTools(A.name,A.tools))}})}selectCallback(e,A){if(A.data){let t=this.agentBuilderService.getNode(A.data().name);t&&this.agentBuilderService.setSelectedNode(t)}this.agentBuilderService.setSelectedCallback(e)}openToolsTab(e){if(e.data){let A=this.agentBuilderService.getNode(e.data().name);A&&this.agentBuilderService.setSelectedNode(A)}this.agentBuilderService.requestSideTabChange("tools")}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A){this._snackbarService.open("Please create an agent first.","OK");return}let t=new FormData,n=this.agentToolBoards();a0.generateYamlFile(A,t,e,n),this.agentService.agentBuild(e,t).subscribe(o=>{o?this.router.navigate(["/"],{queryParams:{app:e}}).then(()=>{window.location.reload()}):this._snackbarService.open("Something went wrong, please try again","OK")})}isRootAgent(e){let A=this.agentBuilderService.getRootNode();return A?A.name===e:!1}isRootAgentForCurrentTab(e){return this.isAgentToolMode&&this.currentAgentTool()?e===this.currentAgentTool():this.isRootAgent(e)}shouldShowHorizontalHandle(e,A){if(!e.parentId||!e.parentId())return!1;let t=e.parentId(),n=this.groupNodes().find(s=>s.id===t);if(!n||!n.data||n.data().agent_class!=="SequentialAgent")return!1;let a=this.nodes().filter(s=>s.parentId&&s.parentId()===t);if(a.length<=1)return!1;a.sort((s,l)=>s.point().x-l.point().x);let r=a.findIndex(s=>s.id===e.id);return A==="left"?r>0:r0):!1}shouldShowTopHandle(e){let A=e.data?e.data():void 0,t=A?.name,n=t?this.isRootAgent(t):!1;if(e.type==="template-group")return A?.agent_class==="SequentialAgent";if(n)return!1;if(e.parentId&&e.parentId()){let a=e.parentId(),r=this.groupNodes().find(s=>s.id===a);if(r&&r.data){let s=r.data().agent_class;if(s==="LoopAgent"||s==="ParallelAgent")return!0}return!1}return!0}getToolsForNode(e,A){return!e||!A?[]:A.get(e)??[]}loadFromYaml(e,A){try{let t=NB(e);this.agentBuilderService.clear(),this.nodePositions.clear(),this.agentToolBoards.set(new Map),this.agentBuilderService.setAgentToolBoards(new Map),this.currentAgentTool.set(null),this.isAgentToolMode=!1,this.navigationStack=[];let n=$A(P({name:t.name||"root_agent",agent_class:t.agent_class||"LlmAgent",model:t.model||"gemini-2.5-flash",instruction:t.instruction||"",description:t.description||""},t.max_iterations&&{max_iterations:t.max_iterations}),{isRoot:!0,sub_agents:t.sub_agents||[],tools:this.parseToolsFromYaml(t.tools||[]),callbacks:this.parseCallbacksFromYaml(t)});this.agentBuilderService.addNode(n),this.agentBuilderService.setSelectedNode(n),this.processAgentToolsFromYaml(n.tools||[],A),this.loadAgentBoard(n)}catch(t){console.error("Error parsing YAML:",t)}}parseToolsFromYaml(e){return e.map(A=>{let t={name:A.name,toolType:this.determineToolType(A),toolAgentName:A.name};if(A.name==="AgentTool"&&A.args&&A.args.agent&&A.args.agent.config_path){t.toolType="Agent Tool";let o=A.args.agent.config_path.replace("./","").replace(".yaml","");t.name=o,t.toolAgentName=o,t.args=A.args}else A.args&&(t.args=A.args);return t})}parseCallbacksFromYaml(e){let A=[];return Object.keys(e).forEach(t=>{if(t.endsWith("_callback")&&Array.isArray(e[t])){let n=t.replace("_callback","");e[t].forEach(o=>{o.name&&A.push({name:o.name,type:n})})}}),A}determineToolType(e){return e.name==="AgentTool"&&e.args&&e.args.agent?"Agent Tool":e.name&&e.name.includes(".")&&e.args?"Custom tool":e.name&&e.name.includes(".")&&!e.args?"Function tool":"Built-in tool"}processAgentToolsFromYaml(e,A){let t=e.filter(n=>n.toolType==="Agent Tool");for(let n of t)this.agentToolBoards().has(n.name)||this.loadAgentToolConfiguration(n,A)}loadAgentToolConfiguration(e,A){let t=e.name;this.agentService.getSubAgentBuilder(A,`${t}.yaml`).subscribe({next:n=>{if(n)try{let o=NB(n),a=$A(P({name:o.name||t,agent_class:o.agent_class||"LlmAgent",model:o.model||"gemini-2.5-flash",instruction:o.instruction||`You are the ${t} agent that can be used as a tool by other agents.`,description:o.description||""},o.max_iterations&&{max_iterations:o.max_iterations}),{isRoot:!1,sub_agents:o.sub_agents||[],tools:this.parseToolsFromYaml(o.tools||[]),callbacks:this.parseCallbacksFromYaml(o),isAgentTool:!0,skip_summarization:!!e.args?.skip_summarization}),r=this.agentToolBoards();if(r.set(t,a),this.agentToolBoards.set(r),this.agentBuilderService.setAgentToolBoards(r),this.agentBuilderService.addNode(a),this.processAgentToolsFromYaml(a.tools||[],A),a.sub_agents&&a.sub_agents.length>0)for(let s of a.sub_agents)s.config_path&&this.agentService.getSubAgentBuilder(A,s.config_path).subscribe(l=>{if(l){let g=NB(l);this.processAgentToolsFromYaml(this.parseToolsFromYaml(g.tools||[]),A)}})}catch(o){console.error(`Error parsing YAML for agent tool ${t}:`,o),this.createDefaultAgentToolConfiguration(e)}else this.createDefaultAgentToolConfiguration(e)},error:n=>{console.error(`Error loading agent tool configuration for ${t}:`,n),this.createDefaultAgentToolConfiguration(e)}})}createDefaultAgentToolConfiguration(e){let A=e.name,t={name:A,agent_class:"LlmAgent",model:"gemini-2.5-flash",instruction:`You are the ${A} agent that can be used as a tool by other agents.`,isRoot:!1,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!!e.args?.skip_summarization},n=this.agentToolBoards();n.set(A,t),this.agentToolBoards.set(n),this.agentBuilderService.setAgentToolBoards(n),this.agentBuilderService.addNode(t)}loadAgentTools(e){e.tools?(e.tools=e.tools.filter(A=>A.name&&A.name.trim()!==""),e.tools.forEach(A=>{A.toolType!=="Agent Tool"&&(A.name.includes(".")&&A.args?A.toolType="Custom tool":A.name.includes(".")&&!A.args?A.toolType="Function tool":A.toolType="Built-in tool")})):e.tools=[]}isNodeSelected(e){return this.selectedAgents.includes(e)}isGroupSelected(e){if(!e.data)return!1;let A=e.data().name,t=this.nodes().find(n=>n.data&&n.data().name===A);return t?this.isNodeSelected(t):!1}loadSubAgents(e,A){return re(this,null,function*(){let t=[{node:A,depth:1,index:1,parentShellId:void 0,parentAgent:void 0,parentGroupId:void 0}],n=[],o=[],a=[];for(;t.length>0;){let{node:r,depth:s,index:l,parentShellId:g,parentAgent:C,parentGroupId:d}=t.shift(),B=r;if(r.config_path)try{let k=yield Zp(this.agentService.getSubAgentBuilder(e,r.config_path));B=NB(k),B.tools&&(B.tools=this.parseToolsFromYaml(B.tools||[])),this.processAgentToolsFromYaml(B.tools||[],e)}catch(k){console.error(`Failed to load agent from ${r.config_path}`,k);continue}if(C&&C.sub_agents){let k=C.sub_agents.indexOf(r);k!==-1&&(C.sub_agents[k]=B,this.agentBuilderService.addNode(C))}this.agentBuilderService.addNode(B);let u=this.nodePositions.get(B.name),E=this.isWorkflowAgent(B.agent_class),f=C?this.isWorkflowAgent(C.agent_class):!1,m,v,S=null;if(f&&!B.isRoot){let k=C?.sub_agents.indexOf(B)??l,M=o.find(z=>z.id===d),x=M?.height?M.height():this.workflowGroupHeight;m=u??this.calculateWorkflowChildPosition(k,x);let F=this.createAgentNodeWithGroup(B,m,d??void 0,o,n);v=F.shellNode,S=F.groupNode,n.push(v),S&&o.push(S),F.groupEdge&&a.push(F.groupEdge)}else{if(u)m=u;else if(!g)m={x:100,y:150};else{let M=n.find(x=>x.id===g);M?m={x:M.point().x+(l-1)*400,y:M.point().y+300}:m={x:100,y:s*150+50}}let k=this.createAgentNodeWithGroup(B,m,void 0,o,n);v=k.shellNode,S=k.groupNode,n.push(v),E&&!B.isRoot&&(S&&o.push(S),k.groupEdge&&a.push(k.groupEdge))}if(g)if(d){let k=this.createWorkflowChildEdgeFromArrays(v,d,n,o);k&&a.push(k)}else{let k={id:this.generateEdgeId(),source:g,sourceHandle:"source-bottom",target:v.id,targetHandle:"target-top"};a.push(k)}if(B.sub_agents&&B.sub_agents.length>0){let k=1,M=E&&S?S.id:d;for(let x of B.sub_agents)t.push({node:x,parentShellId:v.id,depth:s+1,index:k,parentAgent:B,parentGroupId:M}),k++}}this.nodes.set(n),this.groupNodes.set(o),this.edges.set(a),this.updateGroupDimensions()})}switchToAgentToolBoard(e,A){let t=this.currentAgentTool()||"main";t!==e&&this.navigationStack.push(t);let n=this.agentToolBoards(),o=n.get(e);if(!o){o={isRoot:!1,name:e,agent_class:"LlmAgent",model:"gemini-2.5-flash",instruction:`You are the ${e} agent that can be used as a tool by other agents.`,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!1};let a=new Map(n);a.set(e,o),this.agentToolBoards.set(a),this.agentBuilderService.setAgentToolBoards(a),A?this.addAgentToolToAgent(e,A):this.addAgentToolToRoot(e)}this.currentAgentTool.set(e),this.isAgentToolMode=!0,this.loadAgentBoard(o),this.agentBuilderService.setSelectedNode(o),this.agentBuilderService.requestSideTabChange("config")}backToMainCanvas(){if(this.navigationStack.length>0){let e=this.navigationStack.pop();if(e==="main"){this.currentAgentTool.set(null),this.isAgentToolMode=!1;let A=this.agentBuilderService.getRootNode();A&&(this.loadAgentBoard(A),this.agentBuilderService.setSelectedNode(A),this.agentBuilderService.requestSideTabChange("config"))}else{let t=this.agentToolBoards().get(e);t&&(this.currentAgentTool.set(e),this.isAgentToolMode=!0,this.loadAgentBoard(t),this.agentBuilderService.setSelectedNode(t),this.agentBuilderService.requestSideTabChange("config"))}}else{this.currentAgentTool.set(null),this.isAgentToolMode=!1;let e=this.agentBuilderService.getRootNode();e&&(this.loadAgentBoard(e),this.agentBuilderService.setSelectedNode(e),this.agentBuilderService.requestSideTabChange("config"))}}loadAgentBoard(e){return re(this,null,function*(){if(this.captureCurrentNodePositions(),this.nodes.set([]),this.groupNodes.set([]),this.edges.set([]),this.nodeId=0,this.edgeId=0,this.loadAgentTools(e),this.agentBuilderService.addNode(e),e.tools&&e.tools.length>0?this.agentBuilderService.setAgentTools(e.name,e.tools):this.agentBuilderService.setAgentTools(e.name,[]),e.sub_agents&&e.sub_agents.length>0)yield this.loadSubAgents(this.appName,e);else{let A=this.nodePositions.get(e.name)??{x:100,y:150},t=this.createNode(e,A);if(this.nodes.set([t]),this.isWorkflowAgent(e.agent_class)){let{groupNode:n,edge:o}=this.createWorkflowGroup(e,t,A);this.groupNodes.set([n]),o&&this.edges.set([o])}}this.agentBuilderService.setSelectedNode(e)})}addAgentToolToAgent(e,A){let t=this.agentBuilderService.getNode(A);if(t){if(t.tools&&t.tools.some(o=>o.name===e))return;let n={name:e,toolType:"Agent Tool",toolAgentName:e};t.tools||(t.tools=[]),t.tools.push(n),t.tools=t.tools.filter(o=>o.name&&o.name.trim()!==""),this.agentBuilderService.setAgentTools(A,t.tools)}}addAgentToolToRoot(e){let A=this.agentBuilderService.getRootNode();if(A){if(A.tools&&A.tools.some(n=>n.name===e))return;let t={name:e,toolType:"Agent Tool",toolAgentName:e};A.tools||(A.tools=[]),A.tools.push(t),this.agentBuilderService.setAgentTools("root_agent",A.tools)}}deleteAgentToolBoard(e){let A=this.agentToolBoards(),t=new Map(A);t.delete(e),this.agentToolBoards.set(t),this.agentBuilderService.setAgentToolBoards(t);let n=this.agentBuilderService.getNodes();for(let o of n)o.tools&&(o.tools=o.tools.filter(a=>!(a.toolType==="Agent Tool"&&(a.toolAgentName===e||a.name===e))),this.agentBuilderService.setAgentTools(o.name,o.tools));this.navigationStack=this.navigationStack.filter(o=>o!==e),this.currentAgentTool()===e&&this.backToMainCanvas()}getBackButtonTooltip(){if(this.navigationStack.length>0){let e=this.navigationStack[this.navigationStack.length-1];return e==="main"?"Back to Main Canvas":`Back to ${e}`}return"Back to Main Canvas"}onBuilderAssistantClose(){this.builderAssistantCloseRequest.emit()}reloadCanvasFromYaml(){this.appNameInput&&this.agentService.getAgentBuilderTmp(this.appNameInput).subscribe({next:e=>{e&&this.loadFromYaml(e,this.appNameInput)},error:e=>{console.error("Error reloading canvas:",e)}})}captureCurrentNodePositions(){for(let e of this.nodes()){if(!e?.data)continue;let A=e.data();A&&this.nodePositions.set(A.name,P({},e.point()))}}updateGroupDimensions(){for(let s of this.groupNodes()){if(!s.data)continue;let l=s.data().name,g=this.nodes().filter(m=>m.parentId&&m.parentId()===s.id);if(g.length===0){s.width&&s.width.set(480),s.height&&s.height.set(220);continue}g.sort((m,v)=>m.point().x-v.point().x),g.forEach((m,v)=>{let F={x:45+v*428,y:80};if(m.point.set(F),m.data){let z=m.data();z&&this.nodePositions.set(z.name,F)}});let C=1/0,d=1/0,B=-1/0,u=-1/0;for(let m of g){let v=m.point(),S=m.data?m.data():void 0,k=120;S&&S.tools&&S.tools.length>0&&(k+=20+S.tools.length*36),C=Math.min(C,v.x),d=Math.min(d,v.y),B=Math.max(B,v.x+340+68),u=Math.max(u,v.y+k)}let E=B-C+80,f=u-d+80;s.width&&s.width.set(Math.max(480,E)),s.height&&s.height.set(Math.max(220,f))}}getToolIcon(e){return UB(e.name,e.toolType)}getAgentIcon(e){switch(e){case"SequentialAgent":return"more_horiz";case"LoopAgent":return"sync";case"ParallelAgent":return"density_medium";default:return"psychology"}}isGroupEmpty(e){return!this.nodes().some(t=>t.parentId&&t.parentId()===e)}shouldShowAddButton(e){let A=e.data?e.data():void 0;if(!A)return!1;let t=this.isWorkflowAgent(A.agent_class),n=e.parentId&&e.parentId();if(t&&!n||!this.isNodeSelected(e))return!1;if(n&&e.parentId){let o=e.parentId(),a=this.nodes().filter(s=>s.parentId&&s.parentId()===o);if(a.length===0)return!0;let r=a.reduce((s,l)=>l.point().x>s.point().x?l:s,a[0]);return e.id===r.id}return!0}static \u0275fac=function(A){return new(A||i)(st(Xa),st(dE),st(Is))};static \u0275cmp=vA({type:i,selectors:[["app-canvas"]],viewQuery:function(A,t){if(A&1&&Wt(w3A,5)(y3A,5),A&2){let n;se(n=le())&&(t.canvasRef=n.first),se(n=le())&&(t.svgCanvasRef=n.first)}},inputs:{showSidePanel:"showSidePanel",showBuilderAssistant:"showBuilderAssistant",appNameInput:"appNameInput"},outputs:{toggleSidePanelRequest:"toggleSidePanelRequest",builderAssistantCloseRequest:"builderAssistantCloseRequest"},features:[ii],decls:7,vars:8,consts:[["emptyGroupMenuTrigger","matMenuTrigger"],["emptyGroupMenu","matMenu"],["agentMenuTrigger","matMenuTrigger"],["agentMenu","matMenu"],[1,"canvas-container"],[1,"canvas-workspace",3,"click"],[1,"agent-tool-banner"],["matTooltip","Open panel",1,"material-symbols-outlined","open-panel-btn"],["view","auto",3,"nodes","edges","background","snapGrid"],[1,"canvas-instructions"],[3,"closePanel","reloadCanvas","isVisible","appName"],[1,"banner-content"],["mat-icon-button","",1,"back-to-main-btn",3,"click","matTooltip"],[1,"banner-info"],[1,"material-symbols-outlined","banner-icon"],[1,"banner-text"],[1,"agent-tool-name"],[1,"banner-subtitle"],["matTooltip","Open panel",1,"material-symbols-outlined","open-panel-btn",3,"click"],["groupNode",""],["nodeHtml",""],["selectable","","rx","12","ry","12",3,"click","pointerdown"],["x","12","y","12"],[1,"workflow-group-chip"],[1,"workflow-chip-icon"],[1,"workflow-chip-label"],["type","target","position","top","id","target-top"],[1,"empty-group-placeholder",3,"click"],["mat-icon-button","","matTooltip","Add sub-agent","aria-label","Add sub-agent",3,"click","matMenuTriggerFor"],[1,"empty-group-label"],["mat-menu-item","",3,"click"],["selectable","",1,"custom-node",3,"click","pointerdown"],[1,"node-title-wrapper"],[1,"node-title"],[2,"margin-right","5px"],[1,"node-badge"],[1,"action-button-bar"],["matIconButton","","matTooltip","Delete sub-agent","aria-label","Delete sub-agent",1,"action-btn","delete-subagent-btn"],[1,"tools-container"],[1,"add-subagent-container"],["type","target","position","left","id","target-left"],["type","source","position","right","id","source-right"],["type","source","position","bottom","id","source-bottom"],["matIconButton","","matTooltip","Delete sub-agent","aria-label","Delete sub-agent",1,"action-btn","delete-subagent-btn",3,"click"],[1,"tools-list"],[1,"tool-item"],[1,"tool-item",3,"click"],[1,"tool-item-icon"],[1,"tool-item-name"],["matIconButton","","matTooltip","Add sub-agent","aria-label","Add sub-agent",1,"add-subagent-btn",3,"click","matMenuTriggerFor"],[1,"add-subagent-symbol"],[1,"instruction-content"],[1,"instruction-icon"],[1,"instruction-tips"],[1,"tip"]],template:function(A,t){A&1&&(I(0,"div",4)(1,"div",5),U("click",function(o){return t.onCanvasClick(o)}),T(2,M3A,13,2,"div",6),T(3,S3A,2,0,"span",7),T(4,Y3A,3,6,"vflow",8),T(5,H3A,19,0,"div",9),h(),I(6,"app-builder-assistant",10),U("closePanel",function(){return t.onBuilderAssistantClose()})("reloadCanvas",function(){return t.reloadCanvasFromYaml()}),h()()),A&2&&(Q(),_A("has-banner",t.currentAgentTool()),Q(),O(t.currentAgentTool()?2:-1),Q(),O(t.showSidePanel?-1:3),Q(),O(t.vflowNodes().length>0?4:-1),Q(),O(t.vflowNodes().length===0?5:-1),Q(),H("isVisible",t.showBuilderAssistant)("appName",t.appName))},dependencies:[K5,Dp,U5,hE,k5,zt,rn,hs,Gs,tg,y5,gs],styles:['[_nghost-%COMP%]{width:100%;height:100%;display:flex;flex-direction:column;flex:1;min-height:0}.canvas-container[_ngcontent-%COMP%]{width:100%;height:100%;display:flex;flex-direction:column;border-radius:8px;overflow:hidden;box-shadow:var(--builder-canvas-shadow);flex:1;min-height:0;position:relative}.canvas-header[_ngcontent-%COMP%]{padding:16px 24px;border-bottom:2px solid var(--builder-border-color);display:flex;justify-content:space-between;align-items:center}.canvas-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--builder-text-primary-color);font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.canvas-controls[_ngcontent-%COMP%]{display:flex;gap:8px}.canvas-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid var(--builder-button-border-color);color:var(--builder-button-text-color);transition:all .3s ease}.canvas-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{border-color:var(--builder-button-hover-border-color);transform:translateY(-1px)}.canvas-workspace[_ngcontent-%COMP%]{flex:1;position:relative;overflow:hidden;min-height:0;width:100%;height:100%}.agent-tool-banner[_ngcontent-%COMP%]{position:absolute;top:0;left:0;right:0;border-bottom:2px solid rgba(59,130,246,.3);box-shadow:0 4px 16px #0000004d}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%]{padding:12px 20px;display:flex;align-items:center;gap:16px}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%]{color:#fff;border:1px solid rgba(255,255,255,.2);transition:all .2s ease}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05)}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;flex:1}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-icon[_ngcontent-%COMP%]{font-size:28px;width:28px;height:28px;color:#ffffffe6}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] .agent-tool-name[_ngcontent-%COMP%]{margin:0;color:#fff;font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;line-height:1.2}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] .banner-subtitle[_ngcontent-%COMP%]{margin:0;color:#fffc;font-size:12px;font-weight:400;line-height:1}.canvas-workspace[_ngcontent-%COMP%]:has(.agent-tool-banner) vflow[_ngcontent-%COMP%]{padding-top:68px}.canvas-workspace.has-banner[_ngcontent-%COMP%] vflow{padding-top:68px!important} vflow{width:100%!important;height:100%!important;display:block!important} vflow .root-svg{color:var(--builder-text-primary-color)!important;width:100%!important;height:100%!important;min-width:100%!important;min-height:100%!important}.diagram-canvas[_ngcontent-%COMP%]{display:block;width:100%;height:100%;cursor:crosshair;transition:cursor .2s ease;object-fit:contain;image-rendering:pixelated}.diagram-canvas[_ngcontent-%COMP%]:active{cursor:grabbing}.canvas-instructions[_ngcontent-%COMP%]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none}.instruction-content[_ngcontent-%COMP%]{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:2px solid var(--builder-canvas-instruction-border);border-radius:16px;padding:32px;box-shadow:var(--builder-canvas-shadow)}.instruction-content[_ngcontent-%COMP%] .instruction-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;color:var(--builder-button-text-color);margin-bottom:16px;animation:_ngcontent-%COMP%_pulse 2s infinite}.instruction-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:20px;font-weight:600;margin:0 0 12px;font-family:Google Sans,Helvetica Neue,sans-serif}.instruction-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;margin:0 0 24px;line-height:1.5}.instruction-tips[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;align-items:flex-start}.tip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;color:var(--builder-accent-color);font-size:13px}.tip[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.connection-mode-indicator[_ngcontent-%COMP%]{position:absolute;top:20px;left:50%;transform:translate(-50%);animation:_ngcontent-%COMP%_slideDown .3s ease-out}.connection-indicator-content[_ngcontent-%COMP%]{color:#fff;padding:12px 20px;border-radius:24px;display:flex;align-items:center;gap:12px;box-shadow:0 4px 16px #1b73e866;border:1px solid rgba(255,255,255,.2)}.connection-indicator-content[_ngcontent-%COMP%] .connection-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;animation:_ngcontent-%COMP%_pulse 1.5s infinite}.connection-indicator-content[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:14px;font-weight:500;white-space:nowrap}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:#fff;border:1px solid rgba(255,255,255,.3);width:32px;height:32px;min-width:32px}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{transform:scale(1.1)}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}@keyframes _ngcontent-%COMP%_slideDown{0%{opacity:0;transform:translate(-50%) translateY(-20px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.canvas-footer[_ngcontent-%COMP%]{padding:12px 24px;border-top:1px solid var(--builder-border-color);display:flex;justify-content:space-between;align-items:center}.node-count[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;color:var(--builder-text-secondary-color);font-size:13px;font-weight:500}.node-count[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:var(--builder-accent-color)}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}.canvas-workspace.drag-over[_ngcontent-%COMP%]:before{content:"";position:absolute;inset:0;border:2px dashed #00bbea;border-radius:8px;margin:16px;animation:_ngcontent-%COMP%_dashMove 1s linear infinite}@keyframes _ngcontent-%COMP%_dashMove{0%{border-color:#8ab4f84d}50%{border-color:#8ab4f8cc}to{border-color:#8ab4f84d}}@media(max-width:768px){.canvas-header[_ngcontent-%COMP%]{padding:12px 16px}.canvas-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:16px}.instruction-content[_ngcontent-%COMP%]{padding:24px;margin:16px}.instruction-content[_ngcontent-%COMP%] .instruction-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px}.instruction-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{font-size:18px}.canvas-footer[_ngcontent-%COMP%]{padding:8px 16px;flex-direction:column;gap:8px}}.custom-node[_ngcontent-%COMP%]{width:340px;border:1px solid var(--builder-canvas-node-border);border-radius:8px;align-items:center;position:relative;max-height:none;padding-bottom:0;overflow:visible}.custom-node[_ngcontent-%COMP%]:hover{border-color:var(--builder-canvas-node-hover-border)}.custom-node_selected[_ngcontent-%COMP%]{border:2px solid;border-color:var(--builder-accent-color)}.custom-node_selected[_ngcontent-%COMP%] mat-chip[_ngcontent-%COMP%]{--mdc-chip-outline-color: var(--builder-canvas-node-chip-outline)}.custom-node_selected[_ngcontent-%COMP%]:hover{border-color:var(--builder-accent-color)}[_nghost-%COMP%] .default-group-node{border:2px solid var(--builder-canvas-group-border)!important}.node-title-wrapper[_ngcontent-%COMP%]{padding-top:12px;padding-bottom:12px;border-radius:8px 8px 0 0;display:flex;justify-content:space-between;align-items:center}.node-title[_ngcontent-%COMP%]{padding-left:12px;padding-right:12px;display:flex;align-items:center;color:var(--builder-text-primary-color);font-weight:500}.node-badge[_ngcontent-%COMP%]{margin-left:8px;padding:2px 6px;border-radius:999px;color:var(--builder-accent-color);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.tools-container[_ngcontent-%COMP%]{padding:8px 12px;border-top:1px solid var(--builder-border-color)}.tools-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:4px;cursor:pointer;transition:background-color .2s ease;color:var(--builder-text-primary-color)}.tool-item[_ngcontent-%COMP%] .tool-item-icon[_ngcontent-%COMP%]{font-size:22px;width:22px;height:22px;color:var(--builder-text-primary-color);flex-shrink:0}.tool-item[_ngcontent-%COMP%] .tool-item-name[_ngcontent-%COMP%]{font-family:Google Sans,sans-serif;font-size:15px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-item.more-tools[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-style:italic}.tool-item.more-tools[_ngcontent-%COMP%] .tool-item-icon[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color)}.custom-node_selected[_ngcontent-%COMP%] .node-title-wrapper[_ngcontent-%COMP%]{border-bottom-color:var(--builder-canvas-node-chip-outline)}.custom-node_selected[_ngcontent-%COMP%] .node-title-wrapper[_ngcontent-%COMP%] .node-title[_ngcontent-%COMP%]{color:var(--builder-accent-color)}.tools-header[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callbacks-container[_ngcontent-%COMP%]{padding:12px 6px 12px 12px}.callbacks-header[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callback-type[_ngcontent-%COMP%]{font-size:11px;color:var(--builder-accent-color);padding:2px 6px;border-radius:4px;margin-left:4px;font-weight:500}.add-callback-btn[_ngcontent-%COMP%]{border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-callback-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-callback-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);transform:scale(1.1)}.instruction-title[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px}.instructions[_ngcontent-%COMP%]{font-family:Google Sans;margin-bottom:10px}.agent-resources[_ngcontent-%COMP%]{padding:8px 12px}.empty-resource[_ngcontent-%COMP%]{margin-top:8px;color:var(--builder-text-secondary-color);margin-bottom:8px;display:flex;font-size:13px}.empty-resource[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:none}.action-button-bar[_ngcontent-%COMP%]{display:flex;gap:8px;margin-right:4px}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);border:none;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;pointer-events:auto;border-radius:4px}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);transform:scale(1.1)}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.action-button-bar[_ngcontent-%COMP%] .delete-subagent-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color)}.add-tool-btn[_ngcontent-%COMP%]{border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-tool-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-tool-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);transform:scale(1.1)}.add-subagent-container[_ngcontent-%COMP%]{position:absolute;left:50%;bottom:-68px;transform:translate(-50%);display:flex;justify-content:center;pointer-events:none}.custom-node.in-group[_ngcontent-%COMP%] .add-subagent-container[_ngcontent-%COMP%]{left:auto;right:-68px;bottom:50%;transform:translateY(50%)}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]{width:48px;height:48px;border-radius:50%;border:2px solid var(--builder-accent-color);color:var(--builder-accent-color);display:flex;align-items:center;justify-content:center;padding:0;box-sizing:border-box;transition:transform .2s ease,box-shadow .2s ease,background .2s ease;pointer-events:auto}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%] .add-subagent-symbol[_ngcontent-%COMP%]{font-size:28px;line-height:1;font-weight:400}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05);box-shadow:var(--builder-canvas-add-btn-shadow)}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]:focus-visible{outline:none;box-shadow:var(--builder-canvas-add-btn-shadow)}.open-panel-btn[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;color:var(--builder-text-tertiary-color);cursor:pointer;margin-left:20px;margin-top:20px}.custom-node[_ngcontent-%COMP%]:hover .action-button-bar[_ngcontent-%COMP%], .custom-node.custom-node_selected[_ngcontent-%COMP%] .action-button-bar[_ngcontent-%COMP%]{opacity:1;pointer-events:auto}[_nghost-%COMP%] div[nodehandlescontroller][noderesizecontroller].wrapper{height:0px!important;overflow:visible!important}[_nghost-%COMP%] foreignObject.selectable, [_nghost-%COMP%] foreignObject.selectable>div{overflow:visible!important}[_nghost-%COMP%] .interactive-edge{stroke:var(--builder-accent-color)!important;stroke-width:2!important}[_nghost-%COMP%] .default-handle{stroke:var(--builder-accent-color)!important;stroke-width:1!important;fill:var(--builder-canvas-handle-fill)!important}[_nghost-%COMP%] .reconnect-handle{stroke:var(--builder-accent-color)!important;stroke-width:2!important;fill:var(--builder-canvas-reconnect-handle-fill)!important}[_nghost-%COMP%] .workflow-group-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--builder-canvas-workflow-chip-border);border-radius:16px;color:var(--builder-accent-color);font-family:Google Sans,sans-serif;font-size:12px;font-weight:500;height:32px;box-sizing:border-box;white-space:nowrap;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}[_nghost-%COMP%] .workflow-group-chip .workflow-chip-icon{font-size:16px;width:16px;height:16px;line-height:16px}[_nghost-%COMP%] .workflow-group-chip .workflow-chip-label{color:var(--builder-text-primary-color);font-weight:500;font-size:12px;line-height:1}[_nghost-%COMP%] .empty-group-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;border-radius:8px;text-align:center;border:2px dashed var(--builder-canvas-empty-group-border);transition:all .3s ease}[_nghost-%COMP%] .empty-group-placeholder:hover{border-color:var(--builder-canvas-empty-group-hover-border)}[_nghost-%COMP%] .empty-group-placeholder button{border:2px solid var(--builder-accent-color);color:var(--builder-accent-color);width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;transition:all .2s ease}[_nghost-%COMP%] .empty-group-placeholder button:hover{transform:scale(1.1);box-shadow:var(--builder-canvas-add-btn-shadow)}[_nghost-%COMP%] .empty-group-placeholder button mat-icon{font-size:24px;width:24px;height:24px}[_nghost-%COMP%] .empty-group-placeholder .empty-group-label{font-size:13px;font-weight:500;color:var(--builder-text-secondary-color);font-family:Google Sans,sans-serif}']})};function z3A(i,e){i&1&&$n(0,"div",2)}var P3A=new MA("MAT_PROGRESS_BAR_DEFAULT_OPTIONS");var uE=(()=>{class i{_elementRef=w(ce);_ngZone=w(We);_changeDetectorRef=w(Mt);_renderer=w(on);_cleanupTransitionEnd;constructor(){let A=uQ(),t=w(P3A,{optional:!0});this._isNoopAnimation=A==="di-disabled",A==="reduced-motion"&&this._elementRef.nativeElement.classList.add("mat-progress-bar-reduced-motion"),t&&(t.color&&(this.color=this._defaultColor=t.color),this.mode=t.mode||this.mode)}_isNoopAnimation;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor="primary";get value(){return this._value}set value(A){this._value=pZ(A||0),this._changeDetectorRef.markForCheck()}_value=0;get bufferValue(){return this._bufferValue||0}set bufferValue(A){this._bufferValue=pZ(A||0),this._changeDetectorRef.markForCheck()}_bufferValue=0;animationEnd=new FA;get mode(){return this._mode}set mode(A){this._mode=A,this._changeDetectorRef.markForCheck()}_mode="determinate";ngAfterViewInit(){this._ngZone.runOutsideAngular(()=>{this._cleanupTransitionEnd=this._renderer.listen(this._elementRef.nativeElement,"transitionend",this._transitionendHandler)})}ngOnDestroy(){this._cleanupTransitionEnd?.()}_getPrimaryBarTransform(){return`scaleX(${this._isIndeterminate()?1:this.value/100})`}_getBufferBarFlexBasis(){return`${this.mode==="buffer"?this.bufferValue:100}%`}_isIndeterminate(){return this.mode==="indeterminate"||this.mode==="query"}_transitionendHandler=A=>{this.animationEnd.observers.length===0||!A.target||!A.target.classList.contains("mdc-linear-progress__primary-bar")||(this.mode==="determinate"||this.mode==="buffer")&&this._ngZone.run(()=>this.animationEnd.next({value:this.value}))};static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-progress-bar"]],hostAttrs:["role","progressbar","aria-valuemin","0","aria-valuemax","100","tabindex","-1",1,"mat-mdc-progress-bar","mdc-linear-progress"],hostVars:10,hostBindings:function(t,n){t&2&&(ie("aria-valuenow",n._isIndeterminate()?null:n.value)("mode",n.mode),Ao("mat-"+n.color),_A("_mat-animation-noopable",n._isNoopAnimation)("mdc-linear-progress--animation-ready",!n._isNoopAnimation)("mdc-linear-progress--indeterminate",n._isIndeterminate()))},inputs:{color:"color",value:[2,"value","value",yn],bufferValue:[2,"bufferValue","bufferValue",yn],mode:"mode"},outputs:{animationEnd:"animationEnd"},exportAs:["matProgressBar"],decls:7,vars:5,consts:[["aria-hidden","true",1,"mdc-linear-progress__buffer"],[1,"mdc-linear-progress__buffer-bar"],[1,"mdc-linear-progress__buffer-dots"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__primary-bar"],[1,"mdc-linear-progress__bar-inner"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__secondary-bar"]],template:function(t,n){t&1&&(Ln(0,"div",0),$n(1,"div",1),T(2,z3A,1,0,"div",2),Xn(),Ln(3,"div",3),$n(4,"span",4),Xn(),Ln(5,"div",5),$n(6,"span",4),Xn()),t&2&&(Q(),ft("flex-basis",n._getBufferBarFlexBasis()),Q(),O(n.mode==="buffer"?2:-1),Q(),ft("transform",n._getPrimaryBarTransform()))},styles:[`.mat-mdc-progress-bar{--mat-progress-bar-animation-multiplier: 1;display:block;text-align:start}.mat-mdc-progress-bar[mode=query]{transform:scaleX(-1)}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-dots,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__secondary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__bar-inner.mdc-linear-progress__bar-inner{animation:none}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-bar{transition:transform 1ms}.mat-progress-bar-reduced-motion{--mat-progress-bar-animation-multiplier: 2}.mdc-linear-progress{position:relative;width:100%;transform:translateZ(0);outline:1px solid rgba(0,0,0,0);overflow-x:hidden;transition:opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:max(var(--mat-progress-bar-track-height, 4px),var(--mat-progress-bar-active-indicator-height, 4px))}@media(forced-colors: active){.mdc-linear-progress{outline-color:CanvasText}}.mdc-linear-progress__bar{position:absolute;top:0;bottom:0;margin:auto 0;width:100%;animation:none;transform-origin:top left;transition:transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:var(--mat-progress-bar-active-indicator-height, 4px)}.mdc-linear-progress--indeterminate .mdc-linear-progress__bar{transition:none}[dir=rtl] .mdc-linear-progress__bar{right:0;transform-origin:center right}.mdc-linear-progress__bar-inner{display:inline-block;position:absolute;width:100%;animation:none;border-top-style:solid;border-color:var(--mat-progress-bar-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-progress-bar-active-indicator-height, 4px)}.mdc-linear-progress__buffer{display:flex;position:absolute;top:0;bottom:0;margin:auto 0;width:100%;overflow:hidden;height:var(--mat-progress-bar-track-height, 4px);border-radius:var(--mat-progress-bar-track-shape, var(--mat-sys-corner-none))}.mdc-linear-progress__buffer-dots{background-image:radial-gradient(circle, var(--mat-progress-bar-track-color, var(--mat-sys-surface-variant)) calc(var(--mat-progress-bar-track-height, 4px) / 2), transparent 0);background-repeat:repeat-x;background-size:calc(calc(var(--mat-progress-bar-track-height, 4px) / 2)*5);background-position:left;flex:auto;transform:rotate(180deg);animation:mdc-linear-progress-buffering calc(250ms*var(--mat-progress-bar-animation-multiplier)) infinite linear}@media(forced-colors: active){.mdc-linear-progress__buffer-dots{background-color:ButtonBorder}}[dir=rtl] .mdc-linear-progress__buffer-dots{animation:mdc-linear-progress-buffering-reverse calc(250ms*var(--mat-progress-bar-animation-multiplier)) infinite linear;transform:rotate(0)}.mdc-linear-progress__buffer-bar{flex:0 1 100%;transition:flex-basis 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);background-color:var(--mat-progress-bar-track-color, var(--mat-sys-surface-variant))}.mdc-linear-progress__primary-bar{transform:scaleX(0)}.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{left:-145.166611%}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation:mdc-linear-progress-primary-indeterminate-translate calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-primary-indeterminate-scale calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation-name:mdc-linear-progress-primary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{right:-145.166611%;left:auto}.mdc-linear-progress__secondary-bar{display:none}.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{left:-54.888891%;display:block}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation:mdc-linear-progress-secondary-indeterminate-translate calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-secondary-indeterminate-scale calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation-name:mdc-linear-progress-secondary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{right:-54.888891%;left:auto}@keyframes mdc-linear-progress-buffering{from{transform:rotate(180deg) translateX(calc(var(--mat-progress-bar-track-height, 4px) * -2.5))}}@keyframes mdc-linear-progress-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(83.67142%)}100%{transform:translateX(200.611057%)}}@keyframes mdc-linear-progress-primary-indeterminate-scale{0%{transform:scaleX(0.08)}36.65%{animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);transform:scaleX(0.08)}69.15%{animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);transform:scaleX(0.661479)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(84.386165%)}100%{transform:translateX(160.277782%)}}@keyframes mdc-linear-progress-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);transform:scaleX(0.08)}19.15%{animation-timing-function:cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);transform:scaleX(0.457104)}44.15%{animation-timing-function:cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);transform:scaleX(0.72796)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-primary-indeterminate-translate-reverse{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(-83.67142%)}100%{transform:translateX(-200.611057%)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate-reverse{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(-37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(-84.386165%)}100%{transform:translateX(-160.277782%)}}@keyframes mdc-linear-progress-buffering-reverse{from{transform:translateX(-10px)}} -`],encapsulation:2,changeDetection:0})}return i})();function pZ(i,e=0,A=100){return Math.max(e,Math.min(A,i))}var pE=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Di]})}return i})();var j3A=["switch"],V3A=["*"];function q3A(i,e){i&1&&(I(0,"span",11),Et(),I(1,"svg",13),lA(2,"path",14),h(),I(3,"svg",15),lA(4,"path",16),h()())}var W3A=new MA("mat-slide-toggle-default-options",{providedIn:"root",factory:()=>({disableToggleValue:!1,hideIcon:!1,disabledInteractive:!1})}),T5=class{source;checked;constructor(e,A){this.source=e,this.checked=A}},Z3A=(()=>{class i{_elementRef=w(ce);_focusMonitor=w(rr);_changeDetectorRef=w(Mt);defaults=w(W3A);_onChange=A=>{};_onTouched=()=>{};_validatorOnChange=()=>{};_uniqueId;_checked=!1;_createChangeEvent(A){return new T5(this,A)}_labelId;get buttonId(){return`${this.id||this._uniqueId}-button`}_switchElement;focus(){this._switchElement.nativeElement.focus()}_noopAnimations=In();_focused=!1;name=null;id;labelPosition="after";ariaLabel=null;ariaLabelledby=null;ariaDescribedby;required=!1;color;disabled=!1;disableRipple=!1;tabIndex=0;get checked(){return this._checked}set checked(A){this._checked=A,this._changeDetectorRef.markForCheck()}hideIcon;disabledInteractive;change=new FA;toggleChange=new FA;get inputId(){return`${this.id||this._uniqueId}-input`}constructor(){w(Eo).load(Qr);let A=w(new Ys("tabindex"),{optional:!0}),t=this.defaults;this.tabIndex=A==null?0:parseInt(A)||0,this.color=t.color||"accent",this.id=this._uniqueId=w(Dn).getId("mat-mdc-slide-toggle-"),this.hideIcon=t.hideIcon??!1,this.disabledInteractive=t.disabledInteractive??!1,this._labelId=this._uniqueId+"-label"}ngAfterContentInit(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{A==="keyboard"||A==="program"?(this._focused=!0,this._changeDetectorRef.markForCheck()):A||Promise.resolve().then(()=>{this._focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck()})})}ngOnChanges(A){A.required&&this._validatorOnChange()}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef)}writeValue(A){this.checked=!!A}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorOnChange=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck()}toggle(){this.checked=!this.checked,this._onChange(this.checked)}_emitChangeEvent(){this._onChange(this.checked),this.change.emit(this._createChangeEvent(this.checked))}_handleClick(){this.disabled||(this.toggleChange.emit(),this.defaults.disableToggleValue||(this.checked=!this.checked,this._onChange(this.checked),this.change.emit(new T5(this,this.checked))))}_getAriaLabelledBy(){return this.ariaLabelledby?this.ariaLabelledby:this.ariaLabel?null:this._labelId}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-slide-toggle"]],viewQuery:function(t,n){if(t&1&&Wt(j3A,5),t&2){let o;se(o=le())&&(n._switchElement=o.first)}},hostAttrs:[1,"mat-mdc-slide-toggle"],hostVars:13,hostBindings:function(t,n){t&2&&(Ma("id",n.id),ie("tabindex",null)("aria-label",null)("name",null)("aria-labelledby",null),Ao(n.color?"mat-"+n.color:""),_A("mat-mdc-slide-toggle-focused",n._focused)("mat-mdc-slide-toggle-checked",n.checked)("_mat-animation-noopable",n._noopAnimations))},inputs:{name:"name",id:"id",labelPosition:"labelPosition",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],required:[2,"required","required",Qe],color:"color",disabled:[2,"disabled","disabled",Qe],disableRipple:[2,"disableRipple","disableRipple",Qe],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:yn(A)],checked:[2,"checked","checked",Qe],hideIcon:[2,"hideIcon","hideIcon",Qe],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Qe]},outputs:{change:"change",toggleChange:"toggleChange"},exportAs:["matSlideToggle"],features:[pt([{provide:cs,useExisting:Va(()=>i),multi:!0},{provide:Oc,useExisting:i,multi:!0}]),ii],ngContentSelectors:V3A,decls:14,vars:27,consts:[["switch",""],["mat-internal-form-field","",3,"labelPosition"],["role","switch","type","button",1,"mdc-switch",3,"click","tabIndex","disabled"],[1,"mat-mdc-slide-toggle-touch-target"],[1,"mdc-switch__track"],[1,"mdc-switch__handle-track"],[1,"mdc-switch__handle"],[1,"mdc-switch__shadow"],[1,"mdc-elevation-overlay"],[1,"mdc-switch__ripple"],["mat-ripple","",1,"mat-mdc-slide-toggle-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-switch__icons"],[1,"mdc-label",3,"click","for"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--on"],["d","M19.69,5.23L8.96,15.96l-4.23-4.23L2.96,13.5l6,6L21.46,7L19.69,5.23z"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--off"],["d","M20 13H4v-2h16v2z"]],template:function(t,n){if(t&1&&(Ot(),I(0,"div",1)(1,"button",2,0),U("click",function(){return n._handleClick()}),lA(3,"div",3)(4,"span",4),I(5,"span",5)(6,"span",6)(7,"span",7),lA(8,"span",8),h(),I(9,"span",9),lA(10,"span",10),h(),T(11,q3A,5,0,"span",11),h()()(),I(12,"label",12),U("click",function(a){return a.stopPropagation()}),Ze(13),h()()),t&2){let o=Bi(2);H("labelPosition",n.labelPosition),Q(),_A("mdc-switch--selected",n.checked)("mdc-switch--unselected",!n.checked)("mdc-switch--checked",n.checked)("mdc-switch--disabled",n.disabled)("mat-mdc-slide-toggle-disabled-interactive",n.disabledInteractive),H("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("disabled",n.disabled&&!n.disabledInteractive),ie("id",n.buttonId)("name",n.name)("aria-label",n.ariaLabel)("aria-labelledby",n._getAriaLabelledBy())("aria-describedby",n.ariaDescribedby)("aria-required",n.required||null)("aria-checked",n.checked)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),Q(9),H("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),Q(),O(n.hideIcon?-1:11),Q(),H("for",n.buttonId),ie("id",n._labelId)}},dependencies:[Cs,C6],styles:[`.mdc-switch{align-items:center;background:none;border:none;cursor:pointer;display:inline-flex;flex-shrink:0;margin:0;outline:none;overflow:visible;padding:0;position:relative;width:var(--mat-slide-toggle-track-width, 52px)}.mdc-switch.mdc-switch--disabled{cursor:default;pointer-events:none}.mdc-switch.mat-mdc-slide-toggle-disabled-interactive{pointer-events:auto}.mdc-switch__track{overflow:hidden;position:relative;width:100%;height:var(--mat-slide-toggle-track-height, 32px);border-radius:var(--mat-slide-toggle-track-shape, var(--mat-sys-corner-full))}.mdc-switch--disabled.mdc-switch .mdc-switch__track{opacity:var(--mat-slide-toggle-disabled-track-opacity, 0.12)}.mdc-switch__track::before,.mdc-switch__track::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";height:100%;left:0;position:absolute;width:100%;border-width:var(--mat-slide-toggle-track-outline-width, 2px);border-color:var(--mat-slide-toggle-track-outline-color, var(--mat-sys-outline))}.mdc-switch--selected .mdc-switch__track::before,.mdc-switch--selected .mdc-switch__track::after{border-width:var(--mat-slide-toggle-selected-track-outline-width, 2px);border-color:var(--mat-slide-toggle-selected-track-outline-color, transparent)}.mdc-switch--disabled .mdc-switch__track::before,.mdc-switch--disabled .mdc-switch__track::after{border-width:var(--mat-slide-toggle-disabled-unselected-track-outline-width, 2px);border-color:var(--mat-slide-toggle-disabled-unselected-track-outline-color, var(--mat-sys-on-surface))}@media(forced-colors: active){.mdc-switch__track{border-color:currentColor}}.mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0, 0, 0.2, 1);transform:translateX(0);background:var(--mat-slide-toggle-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch--selected .mdc-switch__track::before{transform:translateX(-100%)}.mdc-switch--selected .mdc-switch__track::before{opacity:var(--mat-slide-toggle-hidden-track-opacity, 0);transition:var(--mat-slide-toggle-hidden-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::before{opacity:var(--mat-slide-toggle-visible-track-opacity, 1);transition:var(--mat-slide-toggle-visible-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-hover-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-focus-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:active .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-pressed-track-color, var(--mat-sys-surface-variant))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::before,.mdc-switch.mdc-switch--disabled .mdc-switch__track::before{background:var(--mat-slide-toggle-disabled-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch__track::after{transform:translateX(-100%);background:var(--mat-slide-toggle-selected-track-color, var(--mat-sys-primary))}[dir=rtl] .mdc-switch__track::after{transform:translateX(100%)}.mdc-switch--selected .mdc-switch__track::after{transform:translateX(0)}.mdc-switch--selected .mdc-switch__track::after{opacity:var(--mat-slide-toggle-visible-track-opacity, 1);transition:var(--mat-slide-toggle-visible-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::after{opacity:var(--mat-slide-toggle-hidden-track-opacity, 0);transition:var(--mat-slide-toggle-hidden-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-hover-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-focus-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:active .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-pressed-track-color, var(--mat-sys-primary))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::after,.mdc-switch.mdc-switch--disabled .mdc-switch__track::after{background:var(--mat-slide-toggle-disabled-selected-track-color, var(--mat-sys-on-surface))}.mdc-switch__handle-track{height:100%;pointer-events:none;position:absolute;top:0;transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);left:0;right:auto;transform:translateX(0);width:calc(100% - var(--mat-slide-toggle-handle-width))}[dir=rtl] .mdc-switch__handle-track{left:auto;right:0}.mdc-switch--selected .mdc-switch__handle-track{transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch__handle-track{transform:translateX(-100%)}.mdc-switch__handle{display:flex;pointer-events:auto;position:absolute;top:50%;transform:translateY(-50%);left:0;right:auto;transition:width 75ms cubic-bezier(0.4, 0, 0.2, 1),height 75ms cubic-bezier(0.4, 0, 0.2, 1),margin 75ms cubic-bezier(0.4, 0, 0.2, 1);width:var(--mat-slide-toggle-handle-width);height:var(--mat-slide-toggle-handle-height);border-radius:var(--mat-slide-toggle-handle-shape, var(--mat-sys-corner-full))}[dir=rtl] .mdc-switch__handle{left:auto;right:0}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle{width:var(--mat-slide-toggle-unselected-handle-size, 16px);height:var(--mat-slide-toggle-unselected-handle-size, 16px);margin:var(--mat-slide-toggle-unselected-handle-horizontal-margin, 0 8px)}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-slide-toggle-unselected-with-icon-handle-horizontal-margin, 0 4px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle{width:var(--mat-slide-toggle-selected-handle-size, 24px);height:var(--mat-slide-toggle-selected-handle-size, 24px);margin:var(--mat-slide-toggle-selected-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-slide-toggle-selected-with-icon-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch__handle:has(.mdc-switch__icons){width:var(--mat-slide-toggle-with-icon-handle-size, 24px);height:var(--mat-slide-toggle-with-icon-handle-size, 24px)}.mat-mdc-slide-toggle .mdc-switch:active:not(.mdc-switch--disabled) .mdc-switch__handle{width:var(--mat-slide-toggle-pressed-handle-size, 28px);height:var(--mat-slide-toggle-pressed-handle-size, 28px)}.mat-mdc-slide-toggle .mdc-switch--selected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-slide-toggle-selected-pressed-handle-horizontal-margin, 0 22px)}.mat-mdc-slide-toggle .mdc-switch--unselected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-slide-toggle-unselected-pressed-handle-horizontal-margin, 0 2px)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__handle::after{opacity:var(--mat-slide-toggle-disabled-selected-handle-opacity, 1)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__handle::after{opacity:var(--mat-slide-toggle-disabled-unselected-handle-opacity, 0.38)}.mdc-switch__handle::before,.mdc-switch__handle::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";width:100%;height:100%;left:0;position:absolute;top:0;transition:background-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1),border-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);z-index:-1}@media(forced-colors: active){.mdc-switch__handle::before,.mdc-switch__handle::after{border-color:currentColor}}.mdc-switch--selected:enabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-handle-color, var(--mat-sys-on-primary))}.mdc-switch--selected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-hover-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-focus-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:active .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-pressed-handle-color, var(--mat-sys-primary-container))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:hover:not(:focus):not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:focus:not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:active .mdc-switch__handle::after,.mdc-switch--selected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-disabled-selected-handle-color, var(--mat-sys-surface))}.mdc-switch--unselected:enabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-handle-color, var(--mat-sys-outline))}.mdc-switch--unselected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-hover-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-focus-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:active .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-pressed-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-disabled-unselected-handle-color, var(--mat-sys-on-surface))}.mdc-switch__handle::before{background:var(--mat-slide-toggle-handle-surface-color)}.mdc-switch__shadow{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0}.mdc-switch:enabled .mdc-switch__shadow{box-shadow:var(--mat-slide-toggle-handle-elevation-shadow)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__shadow,.mdc-switch.mdc-switch--disabled .mdc-switch__shadow{box-shadow:var(--mat-slide-toggle-disabled-handle-elevation-shadow)}.mdc-switch__ripple{left:50%;position:absolute;top:50%;transform:translate(-50%, -50%);z-index:-1;width:var(--mat-slide-toggle-state-layer-size, 40px);height:var(--mat-slide-toggle-state-layer-size, 40px)}.mdc-switch__ripple::after{content:"";opacity:0}.mdc-switch--disabled .mdc-switch__ripple::after{display:none}.mat-mdc-slide-toggle-disabled-interactive .mdc-switch__ripple::after{display:block}.mdc-switch:hover .mdc-switch__ripple::after{transition:75ms opacity cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:focus .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:active .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:hover:not(:focus) .mdc-switch__ripple::after,.mdc-switch--unselected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-hover-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-switch--unselected:enabled:focus .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-focus-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-switch--unselected:enabled:active .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-pressed-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch--selected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-hover-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-switch--selected:enabled:focus .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-focus-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-switch--selected:enabled:active .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-pressed-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch__icons{position:relative;height:100%;width:100%;z-index:1;transform:translateZ(0)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__icons{opacity:var(--mat-slide-toggle-disabled-unselected-icon-opacity, 0.38)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__icons{opacity:var(--mat-slide-toggle-disabled-selected-icon-opacity, 0.38)}.mdc-switch__icon{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;opacity:0;transition:opacity 30ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-switch--unselected .mdc-switch__icon{width:var(--mat-slide-toggle-unselected-icon-size, 16px);height:var(--mat-slide-toggle-unselected-icon-size, 16px);fill:var(--mat-slide-toggle-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mat-slide-toggle-disabled-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__icon{width:var(--mat-slide-toggle-selected-icon-size, 16px);height:var(--mat-slide-toggle-selected-icon-size, 16px);fill:var(--mat-slide-toggle-selected-icon-color, var(--mat-sys-on-primary-container))}.mdc-switch--selected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mat-slide-toggle-disabled-selected-icon-color, var(--mat-sys-on-surface))}.mdc-switch--selected .mdc-switch__icon--on,.mdc-switch--unselected .mdc-switch__icon--off{opacity:1;transition:opacity 45ms 30ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle{-webkit-user-select:none;user-select:none;display:inline-block;-webkit-tap-highlight-color:rgba(0,0,0,0);outline:0}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple,.mat-mdc-slide-toggle .mdc-switch__ripple::after{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple:not(:empty),.mat-mdc-slide-toggle .mdc-switch__ripple::after:not(:empty){transform:translateZ(0)}.mat-mdc-slide-toggle.mat-mdc-slide-toggle-focused .mat-focus-indicator::before{content:""}.mat-mdc-slide-toggle .mat-internal-form-field{color:var(--mat-slide-toggle-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-slide-toggle-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-slide-toggle-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-slide-toggle-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-slide-toggle-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-slide-toggle-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-slide-toggle .mat-ripple-element{opacity:.12}.mat-mdc-slide-toggle .mat-focus-indicator::before{border-radius:50%}.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle-track,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__icon,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::after,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::after{transition:none}.mat-mdc-slide-toggle .mdc-switch:enabled+.mdc-label{cursor:pointer}.mat-mdc-slide-toggle .mdc-switch--disabled+label{color:var(--mat-slide-toggle-disabled-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-slide-toggle label:empty{display:none}.mat-mdc-slide-toggle-touch-target{position:absolute;top:50%;left:50%;height:var(--mat-slide-toggle-touch-target-size, 48px);width:100%;transform:translate(-50%, -50%);display:var(--mat-slide-toggle-touch-target-display, block)}[dir=rtl] .mat-mdc-slide-toggle-touch-target{left:auto;right:50%;transform:translate(50%, -50%)} -`],encapsulation:2,changeDetection:0})}return i})(),mZ=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Z3A,Di]})}return i})();var aR=["*"];function X3A(i,e){i&1&&Ze(0)}var $3A=["tabListContainer"],AfA=["tabList"],efA=["tabListInner"],tfA=["nextPaginator"],ifA=["previousPaginator"],nfA=["content"];function ofA(i,e){}var afA=["tabBodyWrapper"],rfA=["tabHeader"];function sfA(i,e){}function lfA(i,e){if(i&1&&kt(0,sfA,0,0,"ng-template",12),i&2){let A=p().$implicit;H("cdkPortalOutlet",A.templateLabel)}}function gfA(i,e){if(i&1&&D(0),i&2){let A=p().$implicit;nA(A.textLabel)}}function cfA(i,e){if(i&1){let A=aA();I(0,"div",7,2),U("click",function(){let n=L(A),o=n.$implicit,a=n.$index,r=p(),s=Bi(1);return G(r._handleClick(o,s,a))})("cdkFocusChange",function(n){let o=L(A).$index,a=p();return G(a._tabFocusChanged(n,o))}),lA(2,"span",8)(3,"div",9),I(4,"span",10)(5,"span",11),T(6,lfA,1,1,null,12)(7,gfA,1,1),h()()()}if(i&2){let A=e.$implicit,t=e.$index,n=Bi(1),o=p();Ao(A.labelClass),_A("mdc-tab--active",o.selectedIndex===t),H("id",o._getTabLabelId(A,t))("disabled",A.disabled)("fitInkBarToContent",o.fitInkBarToContent),ie("tabIndex",o._getTabIndex(t))("aria-posinset",t+1)("aria-setsize",o._tabs.length)("aria-controls",o._getTabContentId(t))("aria-selected",o.selectedIndex===t)("aria-label",A.ariaLabel||null)("aria-labelledby",!A.ariaLabel&&A.ariaLabelledby?A.ariaLabelledby:null),Q(3),H("matRippleTrigger",n)("matRippleDisabled",A.disabled||o.disableRipple),Q(3),O(A.templateLabel?6:7)}}function CfA(i,e){i&1&&Ze(0)}function dfA(i,e){if(i&1){let A=aA();I(0,"mat-tab-body",13),U("_onCentered",function(){L(A);let n=p();return G(n._removeTabBodyWrapperHeight())})("_onCentering",function(n){L(A);let o=p();return G(o._setTabBodyWrapperHeight(n))})("_beforeCentering",function(n){L(A);let o=p();return G(o._bodyCentered(n))}),h()}if(i&2){let A=e.$implicit,t=e.$index,n=p();Ao(A.bodyClass),H("id",n._getTabContentId(t))("content",A.content)("position",A.position)("animationDuration",n.animationDuration)("preserveContent",n.preserveContent),ie("tabindex",n.contentTabIndex!=null&&n.selectedIndex===t?n.contentTabIndex:null)("aria-labelledby",n._getTabLabelId(A,t))("aria-hidden",n.selectedIndex!==t)}}var IfA=new MA("MatTabContent"),BfA=(()=>{class i{template=w(wo);constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","matTabContent",""]],features:[pt([{provide:IfA,useExisting:i}])]})}return i})(),hfA=new MA("MatTabLabel"),vZ=new MA("MAT_TAB"),vp=(()=>{class i extends FU{_closestTab=w(vZ,{optional:!0});static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["","mat-tab-label",""],["","matTabLabel",""]],features:[pt([{provide:hfA,useExisting:i}]),bt]})}return i})(),bZ=new MA("MAT_TAB_GROUP"),bp=(()=>{class i{_viewContainerRef=w(Jo);_closestTabGroup=w(bZ,{optional:!0});disabled=!1;get templateLabel(){return this._templateLabel}set templateLabel(A){this._setTemplateLabelInput(A)}_templateLabel;_explicitContent=void 0;_implicitContent;textLabel="";ariaLabel;ariaLabelledby;labelClass;bodyClass;id=null;_contentPortal=null;get content(){return this._contentPortal}_stateChanges=new ne;position=null;origin=null;isActive=!1;constructor(){w(Eo).load(Qr)}ngOnChanges(A){(A.hasOwnProperty("textLabel")||A.hasOwnProperty("disabled"))&&this._stateChanges.next()}ngOnDestroy(){this._stateChanges.complete()}ngOnInit(){this._contentPortal=new jr(this._explicitContent||this._implicitContent,this._viewContainerRef)}_setTemplateLabelInput(A){A&&A._closestTab===this&&(this._templateLabel=A)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-tab"]],contentQueries:function(t,n,o){if(t&1&&ra(o,vp,5)(o,BfA,7,wo),t&2){let a;se(a=le())&&(n.templateLabel=a.first),se(a=le())&&(n._explicitContent=a.first)}},viewQuery:function(t,n){if(t&1&&Wt(wo,7),t&2){let o;se(o=le())&&(n._implicitContent=o.first)}},hostAttrs:["hidden",""],hostVars:1,hostBindings:function(t,n){t&2&&ie("id",null)},inputs:{disabled:[2,"disabled","disabled",Qe],textLabel:[0,"label","textLabel"],ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],labelClass:"labelClass",bodyClass:"bodyClass",id:"id"},exportAs:["matTab"],features:[pt([{provide:vZ,useExisting:i}]),ii],ngContentSelectors:aR,decls:1,vars:0,template:function(t,n){t&1&&(Ot(),s3(0,X3A,1,0,"ng-template"))},encapsulation:2})}return i})(),tR="mdc-tab-indicator--active",wZ="mdc-tab-indicator--no-transition",iR=class{_items;_currentItem;constructor(e){this._items=e}hide(){this._items.forEach(e=>e.deactivateInkBar()),this._currentItem=void 0}alignToElement(e){let A=this._items.find(n=>n.elementRef.nativeElement===e),t=this._currentItem;if(A!==t&&(t?.deactivateInkBar(),A)){let n=t?.elementRef.nativeElement.getBoundingClientRect?.();A.activateInkBar(n),this._currentItem=A}}},EfA=(()=>{class i{_elementRef=w(ce);_inkBarElement=null;_inkBarContentElement=null;_fitToContent=!1;get fitInkBarToContent(){return this._fitToContent}set fitInkBarToContent(A){this._fitToContent!==A&&(this._fitToContent=A,this._inkBarElement&&this._appendInkBarElement())}activateInkBar(A){let t=this._elementRef.nativeElement;if(!A||!t.getBoundingClientRect||!this._inkBarContentElement){t.classList.add(tR);return}let n=t.getBoundingClientRect(),o=A.width/n.width,a=A.left-n.left;t.classList.add(wZ),this._inkBarContentElement.style.setProperty("transform",`translateX(${a}px) scaleX(${o})`),t.getBoundingClientRect(),t.classList.remove(wZ),t.classList.add(tR),this._inkBarContentElement.style.setProperty("transform","")}deactivateInkBar(){this._elementRef.nativeElement.classList.remove(tR)}ngOnInit(){this._createInkBarElement()}ngOnDestroy(){this._inkBarElement?.remove(),this._inkBarElement=this._inkBarContentElement=null}_createInkBarElement(){let A=this._elementRef.nativeElement.ownerDocument||document,t=this._inkBarElement=A.createElement("span"),n=this._inkBarContentElement=A.createElement("span");t.className="mdc-tab-indicator",n.className="mdc-tab-indicator__content mdc-tab-indicator__content--underline",t.appendChild(this._inkBarContentElement),this._appendInkBarElement()}_appendInkBarElement(){this._inkBarElement;let A=this._fitToContent?this._elementRef.nativeElement.querySelector(".mdc-tab__content"):this._elementRef.nativeElement;A.appendChild(this._inkBarElement)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,inputs:{fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",Qe]}})}return i})();var MZ=(()=>{class i extends EfA{elementRef=w(ce);disabled=!1;focus(){this.elementRef.nativeElement.focus()}getOffsetLeft(){return this.elementRef.nativeElement.offsetLeft}getOffsetWidth(){return this.elementRef.nativeElement.offsetWidth}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["","matTabLabelWrapper",""]],hostVars:3,hostBindings:function(t,n){t&2&&(ie("aria-disabled",!!n.disabled),_A("mat-mdc-tab-disabled",n.disabled))},inputs:{disabled:[2,"disabled","disabled",Qe]},features:[bt]})}return i})(),yZ={passive:!0},QfA=650,ufA=100,pfA=(()=>{class i{_elementRef=w(ce);_changeDetectorRef=w(Mt);_viewportRuler=w(Ns);_dir=w(No,{optional:!0});_ngZone=w(We);_platform=w(Qi);_sharedResizeObserver=w(H3);_injector=w(St);_renderer=w(on);_animationsDisabled=In();_eventCleanups;_scrollDistance=0;_selectedIndexChanged=!1;_destroyed=new ne;_showPaginationControls=!1;_disableScrollAfter=!0;_disableScrollBefore=!0;_tabLabelCount;_scrollDistanceChanged=!1;_keyManager;_currentTextContent;_stopScrolling=new ne;disablePagination=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){let t=isNaN(A)?0:A;this._selectedIndex!=t&&(this._selectedIndexChanged=!0,this._selectedIndex=t,this._keyManager&&this._keyManager.updateActiveItem(t))}_selectedIndex=0;selectFocusedIndex=new FA;indexFocused=new FA;constructor(){this._eventCleanups=this._ngZone.runOutsideAngular(()=>[this._renderer.listen(this._elementRef.nativeElement,"mouseleave",()=>this._stopInterval())])}ngAfterViewInit(){this._eventCleanups.push(this._renderer.listen(this._previousPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("before"),yZ),this._renderer.listen(this._nextPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("after"),yZ))}ngAfterContentInit(){let A=this._dir?this._dir.change:oe("ltr"),t=this._sharedResizeObserver.observe(this._elementRef.nativeElement).pipe(Os(32),yt(this._destroyed)),n=this._viewportRuler.change(150).pipe(yt(this._destroyed)),o=()=>{this.updatePagination(),this._alignInkBarToSelectedTab()};this._keyManager=new O0(this._items).withHorizontalOrientation(this._getLayoutDirection()).withHomeAndEnd().withWrap().skipPredicate(()=>!1),this._keyManager.updateActiveItem(Math.max(this._selectedIndex,0)),ao(o,{injector:this._injector}),Vi(A,n,t,this._items.changes,this._itemsResized()).pipe(yt(this._destroyed)).subscribe(()=>{this._ngZone.run(()=>{Promise.resolve().then(()=>{this._scrollDistance=Math.max(0,Math.min(this._getMaxScrollDistance(),this._scrollDistance)),o()})}),this._keyManager?.withHorizontalOrientation(this._getLayoutDirection())}),this._keyManager.change.subscribe(a=>{this.indexFocused.emit(a),this._setTabFocus(a)})}_itemsResized(){return typeof ResizeObserver!="function"?Br:this._items.changes.pipe(Yn(this._items),Mi(A=>new Fi(t=>this._ngZone.runOutsideAngular(()=>{let n=new ResizeObserver(o=>t.next(o));return A.forEach(o=>n.observe(o.elementRef.nativeElement)),()=>{n.disconnect()}}))),Dl(1),Bt(A=>A.some(t=>t.contentRect.width>0&&t.contentRect.height>0)))}ngAfterContentChecked(){this._tabLabelCount!=this._items.length&&(this.updatePagination(),this._tabLabelCount=this._items.length,this._changeDetectorRef.markForCheck()),this._selectedIndexChanged&&(this._scrollToLabel(this._selectedIndex),this._checkScrollingControls(),this._alignInkBarToSelectedTab(),this._selectedIndexChanged=!1,this._changeDetectorRef.markForCheck()),this._scrollDistanceChanged&&(this._updateTabScrollPosition(),this._scrollDistanceChanged=!1,this._changeDetectorRef.markForCheck())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._keyManager?.destroy(),this._destroyed.next(),this._destroyed.complete(),this._stopScrolling.complete()}_handleKeydown(A){if(!Sa(A))switch(A.keyCode){case 13:case 32:if(this.focusIndex!==this.selectedIndex){let t=this._items.get(this.focusIndex);t&&!t.disabled&&(this.selectFocusedIndex.emit(this.focusIndex),this._itemSelected(A))}break;default:this._keyManager?.onKeydown(A)}}_onContentChanges(){let A=this._elementRef.nativeElement.textContent;A!==this._currentTextContent&&(this._currentTextContent=A||"",this._ngZone.run(()=>{this.updatePagination(),this._alignInkBarToSelectedTab(),this._changeDetectorRef.markForCheck()}))}updatePagination(){this._checkPaginationEnabled(),this._checkScrollingControls(),this._updateTabScrollPosition()}get focusIndex(){return this._keyManager?this._keyManager.activeItemIndex:0}set focusIndex(A){!this._isValidIndex(A)||this.focusIndex===A||!this._keyManager||this._keyManager.setActiveItem(A)}_isValidIndex(A){return this._items?!!this._items.toArray()[A]:!0}_setTabFocus(A){if(this._showPaginationControls&&this._scrollToLabel(A),this._items&&this._items.length){this._items.toArray()[A].focus();let t=this._tabListContainer.nativeElement;this._getLayoutDirection()=="ltr"?t.scrollLeft=0:t.scrollLeft=t.scrollWidth-t.offsetWidth}}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_updateTabScrollPosition(){if(this.disablePagination)return;let A=this.scrollDistance,t=this._getLayoutDirection()==="ltr"?-A:A;this._tabList.nativeElement.style.transform=`translateX(${Math.round(t)}px)`,(this._platform.TRIDENT||this._platform.EDGE)&&(this._tabListContainer.nativeElement.scrollLeft=0)}get scrollDistance(){return this._scrollDistance}set scrollDistance(A){this._scrollTo(A)}_scrollHeader(A){let t=this._tabListContainer.nativeElement.offsetWidth,n=(A=="before"?-1:1)*t/3;return this._scrollTo(this._scrollDistance+n)}_handlePaginatorClick(A){this._stopInterval(),this._scrollHeader(A)}_scrollToLabel(A){if(this.disablePagination)return;let t=this._items?this._items.toArray()[A]:null;if(!t)return;let n=this._tabListContainer.nativeElement.offsetWidth,{offsetLeft:o,offsetWidth:a}=t.elementRef.nativeElement,r,s;this._getLayoutDirection()=="ltr"?(r=o,s=r+a):(s=this._tabListInner.nativeElement.offsetWidth-o,r=s-a);let l=this.scrollDistance,g=this.scrollDistance+n;rg&&(this.scrollDistance+=Math.min(s-g,r-l))}_checkPaginationEnabled(){if(this.disablePagination)this._showPaginationControls=!1;else{let A=this._tabListInner.nativeElement.scrollWidth,t=this._elementRef.nativeElement.offsetWidth,n=A-t>=5;n||(this.scrollDistance=0),n!==this._showPaginationControls&&(this._showPaginationControls=n,this._changeDetectorRef.markForCheck())}}_checkScrollingControls(){this.disablePagination?this._disableScrollAfter=this._disableScrollBefore=!0:(this._disableScrollBefore=this.scrollDistance==0,this._disableScrollAfter=this.scrollDistance==this._getMaxScrollDistance(),this._changeDetectorRef.markForCheck())}_getMaxScrollDistance(){let A=this._tabListInner.nativeElement.scrollWidth,t=this._tabListContainer.nativeElement.offsetWidth;return A-t||0}_alignInkBarToSelectedTab(){let A=this._items&&this._items.length?this._items.toArray()[this.selectedIndex]:null,t=A?A.elementRef.nativeElement:null;t?this._inkBar.alignToElement(t):this._inkBar.hide()}_stopInterval(){this._stopScrolling.next()}_handlePaginatorPress(A,t){t&&t.button!=null&&t.button!==0||(this._stopInterval(),$p(QfA,ufA).pipe(yt(Vi(this._stopScrolling,this._destroyed))).subscribe(()=>{let{maxScrollDistance:n,distance:o}=this._scrollHeader(A);(o===0||o>=n)&&this._stopInterval()}))}_scrollTo(A){if(this.disablePagination)return{maxScrollDistance:0,distance:0};let t=this._getMaxScrollDistance();return this._scrollDistance=Math.max(0,Math.min(t,A)),this._scrollDistanceChanged=!0,this._checkScrollingControls(),{maxScrollDistance:t,distance:this._scrollDistance}}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,inputs:{disablePagination:[2,"disablePagination","disablePagination",Qe],selectedIndex:[2,"selectedIndex","selectedIndex",yn]},outputs:{selectFocusedIndex:"selectFocusedIndex",indexFocused:"indexFocused"}})}return i})(),ffA=(()=>{class i extends pfA{_items;_tabListContainer;_tabList;_tabListInner;_nextPaginator;_previousPaginator;_inkBar;ariaLabel;ariaLabelledby;disableRipple=!1;ngAfterContentInit(){this._inkBar=new iR(this._items),super.ngAfterContentInit()}_itemSelected(A){A.preventDefault()}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275cmp=vA({type:i,selectors:[["mat-tab-header"]],contentQueries:function(t,n,o){if(t&1&&ra(o,MZ,4),t&2){let a;se(a=le())&&(n._items=a)}},viewQuery:function(t,n){if(t&1&&Wt($3A,7)(AfA,7)(efA,7)(tfA,5)(ifA,5),t&2){let o;se(o=le())&&(n._tabListContainer=o.first),se(o=le())&&(n._tabList=o.first),se(o=le())&&(n._tabListInner=o.first),se(o=le())&&(n._nextPaginator=o.first),se(o=le())&&(n._previousPaginator=o.first)}},hostAttrs:[1,"mat-mdc-tab-header"],hostVars:4,hostBindings:function(t,n){t&2&&_A("mat-mdc-tab-header-pagination-controls-enabled",n._showPaginationControls)("mat-mdc-tab-header-rtl",n._getLayoutDirection()=="rtl")},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],disableRipple:[2,"disableRipple","disableRipple",Qe]},features:[bt],ngContentSelectors:aR,decls:13,vars:10,consts:[["previousPaginator",""],["tabListContainer",""],["tabList",""],["tabListInner",""],["nextPaginator",""],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-before",3,"click","mousedown","touchend","matRippleDisabled"],[1,"mat-mdc-tab-header-pagination-chevron"],[1,"mat-mdc-tab-label-container",3,"keydown"],["role","tablist",1,"mat-mdc-tab-list",3,"cdkObserveContent"],[1,"mat-mdc-tab-labels"],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-after",3,"mousedown","click","touchend","matRippleDisabled"]],template:function(t,n){t&1&&(Ot(),I(0,"div",5,0),U("click",function(){return n._handlePaginatorClick("before")})("mousedown",function(a){return n._handlePaginatorPress("before",a)})("touchend",function(){return n._stopInterval()}),lA(2,"div",6),h(),I(3,"div",7,1),U("keydown",function(a){return n._handleKeydown(a)}),I(5,"div",8,2),U("cdkObserveContent",function(){return n._onContentChanges()}),I(7,"div",9,3),Ze(9),h()()(),I(10,"div",10,4),U("mousedown",function(a){return n._handlePaginatorPress("after",a)})("click",function(){return n._handlePaginatorClick("after")})("touchend",function(){return n._stopInterval()}),lA(12,"div",6),h()),t&2&&(_A("mat-mdc-tab-header-pagination-disabled",n._disableScrollBefore),H("matRippleDisabled",n._disableScrollBefore||n.disableRipple),Q(3),_A("_mat-animation-noopable",n._animationsDisabled),Q(2),ie("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby||null),Q(5),_A("mat-mdc-tab-header-pagination-disabled",n._disableScrollAfter),H("matRippleDisabled",n._disableScrollAfter||n.disableRipple))},dependencies:[Cs,pL],styles:[`.mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mdc-tab-indicator .mdc-tab-indicator__content{transition-duration:var(--mat-tab-animation-duration, 250ms)}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;outline:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-pagination-icon-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1;border-bottom-style:solid;border-bottom-width:var(--mat-tab-divider-height, 1px);border-bottom-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-group-inverted-header .mat-mdc-tab-label-container{border-bottom:none;border-top-style:solid;border-top-width:var(--mat-tab-divider-height, 1px);border-top-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.cdk-drop-list .mat-mdc-tab-labels,.mat-mdc-tab-labels.cdk-drop-list{min-height:var(--mat-tab-container-height, 48px)}.mat-mdc-tab::before{margin:5px}@media(forced-colors: active){.mat-mdc-tab[aria-disabled=true]{color:GrayText}} -`],encapsulation:2})}return i})(),mfA=new MA("MAT_TABS_CONFIG"),DZ=(()=>{class i extends Ag{_host=w(nR);_ngZone=w(We);_centeringSub=Oo.EMPTY;_leavingSub=Oo.EMPTY;constructor(){super()}ngOnInit(){super.ngOnInit(),this._centeringSub=this._host._beforeCentering.pipe(Yn(this._host._isCenterPosition())).subscribe(A=>{this._host._content&&A&&!this.hasAttached()&&this._ngZone.run(()=>{Promise.resolve().then(),this.attach(this._host._content)})}),this._leavingSub=this._host._afterLeavingCenter.subscribe(()=>{this._host.preserveContent||this._ngZone.run(()=>this.detach())})}ngOnDestroy(){super.ngOnDestroy(),this._centeringSub.unsubscribe(),this._leavingSub.unsubscribe()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","matTabBodyHost",""]],features:[bt]})}return i})(),nR=(()=>{class i{_elementRef=w(ce);_dir=w(No,{optional:!0});_ngZone=w(We);_injector=w(St);_renderer=w(on);_diAnimationsDisabled=In();_eventCleanups;_initialized=!1;_fallbackTimer;_positionIndex;_dirChangeSubscription=Oo.EMPTY;_position;_previousPosition;_onCentering=new FA;_beforeCentering=new FA;_afterLeavingCenter=new FA;_onCentered=new FA(!0);_portalHost;_contentElement;_content;animationDuration="500ms";preserveContent=!1;set position(A){this._positionIndex=A,this._computePositionAnimationState()}constructor(){if(this._dir){let A=w(Mt);this._dirChangeSubscription=this._dir.change.subscribe(t=>{this._computePositionAnimationState(t),A.markForCheck()})}}ngOnInit(){this._bindTransitionEvents(),this._position==="center"&&(this._setActiveClass(!0),ao(()=>this._onCentering.emit(this._elementRef.nativeElement.clientHeight),{injector:this._injector})),this._initialized=!0}ngOnDestroy(){clearTimeout(this._fallbackTimer),this._eventCleanups?.forEach(A=>A()),this._dirChangeSubscription.unsubscribe()}_bindTransitionEvents(){this._ngZone.runOutsideAngular(()=>{let A=this._elementRef.nativeElement,t=n=>{n.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.remove("mat-tab-body-animating"),n.type==="transitionend"&&this._transitionDone())};this._eventCleanups=[this._renderer.listen(A,"transitionstart",n=>{n.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.add("mat-tab-body-animating"),this._transitionStarted())}),this._renderer.listen(A,"transitionend",t),this._renderer.listen(A,"transitioncancel",t)]})}_transitionStarted(){clearTimeout(this._fallbackTimer);let A=this._position==="center";this._beforeCentering.emit(A),A&&this._onCentering.emit(this._elementRef.nativeElement.clientHeight)}_transitionDone(){this._position==="center"?this._onCentered.emit():this._previousPosition==="center"&&this._afterLeavingCenter.emit()}_setActiveClass(A){this._elementRef.nativeElement.classList.toggle("mat-mdc-tab-body-active",A)}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_isCenterPosition(){return this._positionIndex===0}_computePositionAnimationState(A=this._getLayoutDirection()){this._previousPosition=this._position,this._positionIndex<0?this._position=A=="ltr"?"left":"right":this._positionIndex>0?this._position=A=="ltr"?"right":"left":this._position="center",this._animationsDisabled()?this._simulateTransitionEvents():this._initialized&&(this._position==="center"||this._previousPosition==="center")&&(clearTimeout(this._fallbackTimer),this._fallbackTimer=this._ngZone.runOutsideAngular(()=>setTimeout(()=>this._simulateTransitionEvents(),100)))}_simulateTransitionEvents(){this._transitionStarted(),ao(()=>this._transitionDone(),{injector:this._injector})}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration==="0ms"||this.animationDuration==="0s"}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-tab-body"]],viewQuery:function(t,n){if(t&1&&Wt(DZ,5)(nfA,5),t&2){let o;se(o=le())&&(n._portalHost=o.first),se(o=le())&&(n._contentElement=o.first)}},hostAttrs:[1,"mat-mdc-tab-body"],hostVars:1,hostBindings:function(t,n){t&2&&ie("inert",n._position==="center"?null:"")},inputs:{_content:[0,"content","_content"],animationDuration:"animationDuration",preserveContent:"preserveContent",position:"position"},outputs:{_onCentering:"_onCentering",_beforeCentering:"_beforeCentering",_onCentered:"_onCentered"},decls:3,vars:6,consts:[["content",""],["cdkScrollable","",1,"mat-mdc-tab-body-content"],["matTabBodyHost",""]],template:function(t,n){t&1&&(I(0,"div",1,0),kt(2,ofA,0,0,"ng-template",2),h()),t&2&&_A("mat-tab-body-content-left",n._position==="left")("mat-tab-body-content-right",n._position==="right")("mat-tab-body-content-can-animate",n._position==="center"||n._previousPosition==="center")},dependencies:[DZ,j0],styles:[`.mat-mdc-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-mdc-tab-body.mat-mdc-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-mdc-tab-group.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body.mat-mdc-tab-body-active{overflow-y:hidden}.mat-mdc-tab-body-content{height:100%;overflow:auto;transform:none;visibility:hidden}.mat-tab-body-animating>.mat-mdc-tab-body-content,.mat-mdc-tab-body-active>.mat-mdc-tab-body-content{visibility:visible}.mat-tab-body-animating>.mat-mdc-tab-body-content{min-height:1px}.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body-content{overflow:hidden}.mat-tab-body-content-can-animate{transition:transform var(--mat-tab-animation-duration) 1ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable .mat-tab-body-content-can-animate{transition:none}.mat-tab-body-content-left{transform:translate3d(-100%, 0, 0)}.mat-tab-body-content-right{transform:translate3d(100%, 0, 0)} -`],encapsulation:2})}return i})(),fE=(()=>{class i{_elementRef=w(ce);_changeDetectorRef=w(Mt);_ngZone=w(We);_tabsSubscription=Oo.EMPTY;_tabLabelSubscription=Oo.EMPTY;_tabBodySubscription=Oo.EMPTY;_diAnimationsDisabled=In();_allTabs;_tabBodies;_tabBodyWrapper;_tabHeader;_tabs=new Rg;_indexToSelect=0;_lastFocusedTabIndex=null;_tabBodyWrapperHeight=0;color;get fitInkBarToContent(){return this._fitInkBarToContent}set fitInkBarToContent(A){this._fitInkBarToContent=A,this._changeDetectorRef.markForCheck()}_fitInkBarToContent=!1;stretchTabs=!0;alignTabs=null;dynamicHeight=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){this._indexToSelect=isNaN(A)?null:A}_selectedIndex=null;headerPosition="above";get animationDuration(){return this._animationDuration}set animationDuration(A){let t=A+"";this._animationDuration=/^\d+$/.test(t)?A+"ms":t}_animationDuration;get contentTabIndex(){return this._contentTabIndex}set contentTabIndex(A){this._contentTabIndex=isNaN(A)?null:A}_contentTabIndex=null;disablePagination=!1;disableRipple=!1;preserveContent=!1;get backgroundColor(){return this._backgroundColor}set backgroundColor(A){let t=this._elementRef.nativeElement.classList;t.remove("mat-tabs-with-background",`mat-background-${this.backgroundColor}`),A&&t.add("mat-tabs-with-background",`mat-background-${A}`),this._backgroundColor=A}_backgroundColor;ariaLabel;ariaLabelledby;selectedIndexChange=new FA;focusChange=new FA;animationDone=new FA;selectedTabChange=new FA(!0);_groupId;_isServer=!w(Qi).isBrowser;constructor(){let A=w(mfA,{optional:!0});this._groupId=w(Dn).getId("mat-tab-group-"),this.animationDuration=A&&A.animationDuration?A.animationDuration:"500ms",this.disablePagination=A&&A.disablePagination!=null?A.disablePagination:!1,this.dynamicHeight=A&&A.dynamicHeight!=null?A.dynamicHeight:!1,A?.contentTabIndex!=null&&(this.contentTabIndex=A.contentTabIndex),this.preserveContent=!!A?.preserveContent,this.fitInkBarToContent=A&&A.fitInkBarToContent!=null?A.fitInkBarToContent:!1,this.stretchTabs=A&&A.stretchTabs!=null?A.stretchTabs:!0,this.alignTabs=A&&A.alignTabs!=null?A.alignTabs:null}ngAfterContentChecked(){let A=this._indexToSelect=this._clampTabIndex(this._indexToSelect);if(this._selectedIndex!=A){let t=this._selectedIndex==null;if(!t){this.selectedTabChange.emit(this._createChangeEvent(A));let n=this._tabBodyWrapper.nativeElement;n.style.minHeight=n.clientHeight+"px"}Promise.resolve().then(()=>{this._tabs.forEach((n,o)=>n.isActive=o===A),t||(this.selectedIndexChange.emit(A),this._tabBodyWrapper.nativeElement.style.minHeight="")})}this._tabs.forEach((t,n)=>{t.position=n-A,this._selectedIndex!=null&&t.position==0&&!t.origin&&(t.origin=A-this._selectedIndex)}),this._selectedIndex!==A&&(this._selectedIndex=A,this._lastFocusedTabIndex=null,this._changeDetectorRef.markForCheck())}ngAfterContentInit(){this._subscribeToAllTabChanges(),this._subscribeToTabLabels(),this._tabsSubscription=this._tabs.changes.subscribe(()=>{let A=this._clampTabIndex(this._indexToSelect);if(A===this._selectedIndex){let t=this._tabs.toArray(),n;for(let o=0;o{t[A].isActive=!0,this.selectedTabChange.emit(this._createChangeEvent(A))})}this._changeDetectorRef.markForCheck()})}ngAfterViewInit(){this._tabBodySubscription=this._tabBodies.changes.subscribe(()=>this._bodyCentered(!0))}_subscribeToAllTabChanges(){this._allTabs.changes.pipe(Yn(this._allTabs)).subscribe(A=>{this._tabs.reset(A.filter(t=>t._closestTabGroup===this||!t._closestTabGroup)),this._tabs.notifyOnChanges()})}ngOnDestroy(){this._tabs.destroy(),this._tabsSubscription.unsubscribe(),this._tabLabelSubscription.unsubscribe(),this._tabBodySubscription.unsubscribe()}realignInkBar(){this._tabHeader&&this._tabHeader._alignInkBarToSelectedTab()}updatePagination(){this._tabHeader&&this._tabHeader.updatePagination()}focusTab(A){let t=this._tabHeader;t&&(t.focusIndex=A)}_focusChanged(A){this._lastFocusedTabIndex=A,this.focusChange.emit(this._createChangeEvent(A))}_createChangeEvent(A){let t=new oR;return t.index=A,this._tabs&&this._tabs.length&&(t.tab=this._tabs.toArray()[A]),t}_subscribeToTabLabels(){this._tabLabelSubscription&&this._tabLabelSubscription.unsubscribe(),this._tabLabelSubscription=Vi(...this._tabs.map(A=>A._stateChanges)).subscribe(()=>this._changeDetectorRef.markForCheck())}_clampTabIndex(A){return Math.min(this._tabs.length-1,Math.max(A||0,0))}_getTabLabelId(A,t){return A.id||`${this._groupId}-label-${t}`}_getTabContentId(A){return`${this._groupId}-content-${A}`}_setTabBodyWrapperHeight(A){if(!this.dynamicHeight||!this._tabBodyWrapperHeight){this._tabBodyWrapperHeight=A;return}let t=this._tabBodyWrapper.nativeElement;t.style.height=this._tabBodyWrapperHeight+"px",this._tabBodyWrapper.nativeElement.offsetHeight&&(t.style.height=A+"px")}_removeTabBodyWrapperHeight(){let A=this._tabBodyWrapper.nativeElement;this._tabBodyWrapperHeight=A.clientHeight,A.style.height="",this._ngZone.run(()=>this.animationDone.emit())}_handleClick(A,t,n){t.focusIndex=n,A.disabled||(this.selectedIndex=n)}_getTabIndex(A){let t=this._lastFocusedTabIndex??this.selectedIndex;return A===t?0:-1}_tabFocusChanged(A,t){A&&A!=="mouse"&&A!=="touch"&&(this._tabHeader.focusIndex=t)}_bodyCentered(A){A&&this._tabBodies?.forEach((t,n)=>t._setActiveClass(n===this._selectedIndex))}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration==="0"||this.animationDuration==="0ms"}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-tab-group"]],contentQueries:function(t,n,o){if(t&1&&ra(o,bp,5),t&2){let a;se(a=le())&&(n._allTabs=a)}},viewQuery:function(t,n){if(t&1&&Wt(afA,5)(rfA,5)(nR,5),t&2){let o;se(o=le())&&(n._tabBodyWrapper=o.first),se(o=le())&&(n._tabHeader=o.first),se(o=le())&&(n._tabBodies=o)}},hostAttrs:[1,"mat-mdc-tab-group"],hostVars:11,hostBindings:function(t,n){t&2&&(ie("mat-align-tabs",n.alignTabs),Ao("mat-"+(n.color||"primary")),ft("--mat-tab-animation-duration",n.animationDuration),_A("mat-mdc-tab-group-dynamic-height",n.dynamicHeight)("mat-mdc-tab-group-inverted-header",n.headerPosition==="below")("mat-mdc-tab-group-stretch-tabs",n.stretchTabs))},inputs:{color:"color",fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",Qe],stretchTabs:[2,"mat-stretch-tabs","stretchTabs",Qe],alignTabs:[0,"mat-align-tabs","alignTabs"],dynamicHeight:[2,"dynamicHeight","dynamicHeight",Qe],selectedIndex:[2,"selectedIndex","selectedIndex",yn],headerPosition:"headerPosition",animationDuration:"animationDuration",contentTabIndex:[2,"contentTabIndex","contentTabIndex",yn],disablePagination:[2,"disablePagination","disablePagination",Qe],disableRipple:[2,"disableRipple","disableRipple",Qe],preserveContent:[2,"preserveContent","preserveContent",Qe],backgroundColor:"backgroundColor",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"]},outputs:{selectedIndexChange:"selectedIndexChange",focusChange:"focusChange",animationDone:"animationDone",selectedTabChange:"selectedTabChange"},exportAs:["matTabGroup"],features:[pt([{provide:bZ,useExisting:i}])],ngContentSelectors:aR,decls:9,vars:8,consts:[["tabHeader",""],["tabBodyWrapper",""],["tabNode",""],[3,"indexFocused","selectFocusedIndex","selectedIndex","disableRipple","disablePagination","aria-label","aria-labelledby"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"id","mdc-tab--active","class","disabled","fitInkBarToContent"],[1,"mat-mdc-tab-body-wrapper"],["role","tabpanel",3,"id","class","content","position","animationDuration","preserveContent"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"click","cdkFocusChange","id","disabled","fitInkBarToContent"],[1,"mdc-tab__ripple"],["mat-ripple","",1,"mat-mdc-tab-ripple",3,"matRippleTrigger","matRippleDisabled"],[1,"mdc-tab__content"],[1,"mdc-tab__text-label"],[3,"cdkPortalOutlet"],["role","tabpanel",3,"_onCentered","_onCentering","_beforeCentering","id","content","position","animationDuration","preserveContent"]],template:function(t,n){t&1&&(Ot(),I(0,"mat-tab-header",3,0),U("indexFocused",function(a){return n._focusChanged(a)})("selectFocusedIndex",function(a){return n.selectedIndex=a}),ke(2,cfA,8,17,"div",4,ni),h(),T(4,CfA,1,0),I(5,"div",5,1),ke(7,dfA,1,10,"mat-tab-body",6,ni),h()),t&2&&(H("selectedIndex",n.selectedIndex||0)("disableRipple",n.disableRipple)("disablePagination",n.disablePagination),g3("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby),Q(2),_e(n._tabs),Q(2),O(n._isServer?4:-1),Q(),_A("_mat-animation-noopable",n._animationsDisabled()),Q(2),_e(n._tabs))},dependencies:[ffA,MZ,Qv,Cs,Ag,nR],styles:[`.mdc-tab{min-width:90px;padding:0 24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;z-index:1;touch-action:manipulation}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab--active .mdc-tab__text-label{transition-delay:100ms}._mat-animation-noopable .mdc-tab__text-label{transition:none}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transition:var(--mat-tab-animation-duration, 250ms) transform cubic-bezier(0.4, 0, 0.2, 1);transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}._mat-animation-noopable .mdc-tab-indicator__content,.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mat-mdc-tab-ripple.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;height:var(--mat-tab-container-height, 48px);font-family:var(--mat-tab-label-text-font, var(--mat-sys-title-small-font));font-size:var(--mat-tab-label-text-size, var(--mat-sys-title-small-size));letter-spacing:var(--mat-tab-label-text-tracking, var(--mat-sys-title-small-tracking));line-height:var(--mat-tab-label-text-line-height, var(--mat-sys-title-small-line-height));font-weight:var(--mat-tab-label-text-weight, var(--mat-sys-title-small-weight))}.mat-mdc-tab.mdc-tab{flex-grow:0}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-tab-active-indicator-height, 2px);border-radius:var(--mat-tab-active-indicator-shape, 0)}.mat-mdc-tab:hover .mdc-tab__text-label{color:var(--mat-tab-inactive-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab:focus .mdc-tab__text-label{color:var(--mat-tab-inactive-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-active-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-active-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-active-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-hover-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-active-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-focus-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-disabled-ripple-color, var(--mat-sys-on-surface-variant))}.mat-mdc-tab .mdc-tab__ripple::before{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-inactive-label-text-color, var(--mat-sys-on-surface));display:inline-flex;align-items:center}.mat-mdc-tab .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-group.mat-mdc-tab-group-stretch-tabs>.mat-mdc-tab-header .mat-mdc-tab{flex-grow:1}.mat-mdc-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-background-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-focus-indicator::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-focus-indicator::before{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mdc-tab__ripple::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header{flex-direction:column-reverse}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header .mdc-tab-indicator__content--underline{align-self:flex-start}.mat-mdc-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important} -`],encapsulation:2})}return i})(),oR=class{index;tab};var SZ=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Di]})}return i})();var yfA={cancelEditingTooltip:"Cancel editing",saveEvalMessageTooltip:"Save eval case message",thoughtChipLabel:"Thought",outcomeLabel:"Outcome",outputLabel:"Output",actualToolUsesLabel:"Actual tool uses:",expectedToolUsesLabel:"Expected tool uses:",actualResponseLabel:"Actual response:",expectedResponseLabel:"Expected response:",matchScoreLabel:"Match score",thresholdLabel:"Threshold",evalPassLabel:"PASS",evalFailLabel:"FAIL",editEvalMessageTooltip:"Edit eval case message",deleteEvalMessageTooltip:"Delete eval case message",editFunctionArgsTooltip:"Edit function arguments",typeMessagePlaceholder:"Type a message...",sendMessageTooltip:"Send message",stopMessageTooltip:"Stop",uploadFileTooltip:"Upload local file",moreOptionsTooltip:"More options",updateStateMenuLabel:"Update state",updateStateMenuTooltip:"Update the session state",turnOffMicTooltip:"Hang up",useMicTooltip:"Call",turnOffCamTooltip:"Turn off camera",useCamTooltip:"Use camera",updatedSessionStateChipLabel:"Updated session state",proactiveAudioTooltip:"Enable the model to speak spontaneously without waiting for user input",affectiveDialogTooltip:"Enable the model to respond with emotional expression",sessionResumptionTooltip:"Allow the session to resume from a previous state",saveLiveBlobTooltip:"Save the recorded live stream data"},C1=new MA("Chat Panel Messages",{factory:()=>yfA});var O5="comm",J5="rule",Y5="decl";var kZ="@import";var _Z="@namespace",xZ="@keyframes";var RZ="@layer";var rR=Math.abs,Mp=String.fromCharCode;function H5(i){return i.trim()}function Sp(i,e,A){return i.replace(e,A)}function NZ(i,e,A){return i.indexOf(e,A)}function d1(i,e){return i.charCodeAt(e)|0}function I1(i,e,A){return i.slice(e,A)}function zl(i){return i.length}function FZ(i){return i.length}function mE(i,e){return e.push(i),i}var z5=1,wE=1,LZ=0,vg=0,Ir=0,DE="";function P5(i,e,A,t,n,o,a,r){return{value:i,root:e,parent:A,type:t,props:n,children:o,line:z5,column:wE,length:a,return:"",siblings:r}}function GZ(){return Ir}function KZ(){return Ir=vg>0?d1(DE,--vg):0,wE--,Ir===10&&(wE=1,z5--),Ir}function bg(){return Ir=vg2||yE(Ir)>3?"":" "}function JZ(i,e){for(;--e&&bg()&&!(Ir<48||Ir>102||Ir>57&&Ir<65||Ir>70&&Ir<97););return j5(i,kp()+(e<6&&KC()==32&&bg()==32))}function sR(i){for(;bg();)switch(Ir){case i:return vg;case 34:case 39:i!==34&&i!==39&&sR(Ir);break;case 40:i===41&&sR(i);break;case 92:bg();break}return vg}function YZ(i,e){for(;bg()&&i+Ir!==57;)if(i+Ir===84&&KC()===47)break;return"/*"+j5(e,vg-1)+"*"+Mp(i===47?i:bg())}function HZ(i){for(;!yE(KC());)bg();return j5(i,vg)}function jZ(i){return TZ(q5("",null,null,null,[""],i=UZ(i),0,[0],i))}function q5(i,e,A,t,n,o,a,r,s){for(var l=0,g=0,C=a,d=0,B=0,u=0,E=1,f=1,m=1,v=0,S="",k=n,M=o,x=t,F=S;f;)switch(u=v,v=bg()){case 40:if(u!=108&&d1(F,C-1)==58){NZ(F+=Sp(V5(v),"&","&\f"),"&\f",rR(l?r[l-1]:0))!=-1&&(m=-1);break}case 34:case 39:case 91:F+=V5(v);break;case 9:case 10:case 13:case 32:F+=OZ(u);break;case 92:F+=JZ(kp()-1,7);continue;case 47:switch(KC()){case 42:case 47:mE(DfA(YZ(bg(),kp()),e,A,s),s),(yE(u||1)==5||yE(KC()||1)==5)&&zl(F)&&I1(F,-1,void 0)!==" "&&(F+=" ");break;default:F+="/"}break;case 123*E:r[l++]=zl(F)*m;case 125*E:case 59:case 0:switch(v){case 0:case 125:f=0;case 59+g:m==-1&&(F=Sp(F,/\f/g,"")),B>0&&(zl(F)-C||E===0&&u===47)&&mE(B>32?PZ(F+";",t,A,C-1,s):PZ(Sp(F," ","")+";",t,A,C-2,s),s);break;case 59:F+=";";default:if(mE(x=zZ(F,e,A,l,g,n,r,S,k=[],M=[],C,o),o),v===123)if(g===0)q5(F,e,x,x,k,o,C,r,M);else{switch(d){case 99:if(d1(F,3)===110)break;case 108:if(d1(F,2)===97)break;default:g=0;case 100:case 109:case 115:}g?q5(i,x,x,t&&mE(zZ(i,x,x,0,0,n,r,S,n,k=[],C,M),M),n,M,C,r,t?k:M):q5(F,x,x,x,[""],M,0,r,M)}}l=g=B=0,E=m=1,S=F="",C=a;break;case 58:C=1+zl(F),B=u;default:if(E<1){if(v==123)--E;else if(v==125&&E++==0&&KZ()==125)continue}switch(F+=Mp(v),v*E){case 38:m=g>0?1:(F+="\f",-1);break;case 44:r[l++]=(zl(F)-1)*m,m=1;break;case 64:KC()===45&&(F+=V5(bg())),d=KC(),g=C=zl(S=F+=HZ(kp())),v++;break;case 45:u===45&&zl(F)==2&&(E=0)}}return o}function zZ(i,e,A,t,n,o,a,r,s,l,g,C){for(var d=n-1,B=n===0?o:[""],u=FZ(B),E=0,f=0,m=0;E0?B[v]+" "+S:Sp(S,/&\f/g,B[v])))&&(s[m++]=k);return P5(i,e,A,n===0?J5:r,s,l,g,C)}function DfA(i,e,A,t){return P5(i,e,A,O5,Mp(GZ()),I1(i,2,-2),0,t)}function PZ(i,e,A,t,n){return P5(i,e,A,Y5,I1(i,0,t),I1(i,t+1,-1),t,n)}function W5(i,e){for(var A="",t=0;t/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(i),"detector"),bfA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-WLB2FJ7K.js");return{id:$Z,diagram:i}}),"loader"),MfA={id:$Z,detector:vfA,loader:bfA},SfA=MfA,AX="flowchart",kfA=we((i,e)=>e?.flowchart?.defaultRenderer==="dagre-wrapper"||e?.flowchart?.defaultRenderer==="elk"?!1:/^\s*graph/.test(i),"detector"),_fA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-RCKFX6QR.js");return{id:AX,diagram:i}}),"loader"),xfA={id:AX,detector:kfA,loader:_fA},RfA=xfA,eX="flowchart-v2",NfA=we((i,e)=>e?.flowchart?.defaultRenderer==="dagre-d3"?!1:(e?.flowchart?.defaultRenderer==="elk"&&(e.layout="elk"),/^\s*graph/.test(i)&&e?.flowchart?.defaultRenderer==="dagre-wrapper"?!0:/^\s*flowchart/.test(i)),"detector"),FfA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-RCKFX6QR.js");return{id:eX,diagram:i}}),"loader"),LfA={id:eX,detector:NfA,loader:FfA},GfA=LfA,tX="er",KfA=we(i=>/^\s*erDiagram/.test(i),"detector"),UfA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-QGHEW6NO.js");return{id:tX,diagram:i}}),"loader"),TfA={id:tX,detector:KfA,loader:UfA},OfA=TfA,iX="gitGraph",JfA=we(i=>/^\s*gitGraph/.test(i),"detector"),YfA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-BDIW4D5I.js");return{id:iX,diagram:i}}),"loader"),HfA={id:iX,detector:JfA,loader:YfA},zfA=HfA,nX="gantt",PfA=we(i=>/^\s*gantt/.test(i),"detector"),jfA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-WZIWL22C.js");return{id:nX,diagram:i}}),"loader"),VfA={id:nX,detector:PfA,loader:jfA},qfA=VfA,oX="info",WfA=we(i=>/^\s*info/.test(i),"detector"),ZfA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-ZX24QP2W.js");return{id:oX,diagram:i}}),"loader"),XfA={id:oX,detector:WfA,loader:ZfA},aX="pie",$fA=we(i=>/^\s*pie/.test(i),"detector"),AmA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-PM3FQFTD.js");return{id:aX,diagram:i}}),"loader"),emA={id:aX,detector:$fA,loader:AmA},rX="quadrantChart",tmA=we(i=>/^\s*quadrantChart/.test(i),"detector"),imA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-V2DCVTQX.js");return{id:rX,diagram:i}}),"loader"),nmA={id:rX,detector:tmA,loader:imA},omA=nmA,sX="xychart",amA=we(i=>/^\s*xychart(-beta)?/.test(i),"detector"),rmA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-J4R5U4YL.js");return{id:sX,diagram:i}}),"loader"),smA={id:sX,detector:amA,loader:rmA},lmA=smA,lX="requirement",gmA=we(i=>/^\s*requirement(Diagram)?/.test(i),"detector"),cmA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-S22PTQH2.js");return{id:lX,diagram:i}}),"loader"),CmA={id:lX,detector:gmA,loader:cmA},dmA=CmA,gX="sequence",ImA=we(i=>/^\s*sequenceDiagram/.test(i),"detector"),BmA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-T2UY75BD.js");return{id:gX,diagram:i}}),"loader"),hmA={id:gX,detector:ImA,loader:BmA},EmA=hmA,cX="class",QmA=we((i,e)=>e?.class?.defaultRenderer==="dagre-wrapper"?!1:/^\s*classDiagram/.test(i),"detector"),umA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-46YSBSFN.js");return{id:cX,diagram:i}}),"loader"),pmA={id:cX,detector:QmA,loader:umA},fmA=pmA,CX="classDiagram",mmA=we((i,e)=>/^\s*classDiagram/.test(i)&&e?.class?.defaultRenderer==="dagre-wrapper"?!0:/^\s*classDiagram-v2/.test(i),"detector"),wmA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-75WMU75S.js");return{id:CX,diagram:i}}),"loader"),ymA={id:CX,detector:mmA,loader:wmA},DmA=ymA,dX="state",vmA=we((i,e)=>e?.state?.defaultRenderer==="dagre-wrapper"?!1:/^\s*stateDiagram/.test(i),"detector"),bmA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-2LZ42ZOW.js");return{id:dX,diagram:i}}),"loader"),MmA={id:dX,detector:vmA,loader:bmA},SmA=MmA,IX="stateDiagram",kmA=we((i,e)=>!!(/^\s*stateDiagram-v2/.test(i)||/^\s*stateDiagram/.test(i)&&e?.state?.defaultRenderer==="dagre-wrapper"),"detector"),_mA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-N5S45BK4.js");return{id:IX,diagram:i}}),"loader"),xmA={id:IX,detector:kmA,loader:_mA},RmA=xmA,BX="journey",NmA=we(i=>/^\s*journey/.test(i),"detector"),FmA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-QMDHABEH.js");return{id:BX,diagram:i}}),"loader"),LmA={id:BX,detector:NmA,loader:FmA},GmA=LmA,KmA=we((i,e,A)=>{qa.debug(`rendering svg for syntax error -`);let t=yF(e),n=t.append("g");t.attr("viewBox","0 0 2412 512"),mF(t,100,512,!0),n.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),n.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),n.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),n.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),n.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),n.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),n.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in text"),n.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text(`mermaid version ${A}`)},"draw"),hX={draw:KmA},UmA=hX,TmA={db:{},renderer:hX,parser:{parse:we(()=>{},"parse")}},OmA=TmA,EX="flowchart-elk",JmA=we((i,e={})=>/^\s*flowchart-elk/.test(i)||/^\s*(flowchart|graph)/.test(i)&&e?.flowchart?.defaultRenderer==="elk"?(e.layout="elk",!0):!1,"detector"),YmA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-RCKFX6QR.js");return{id:EX,diagram:i}}),"loader"),HmA={id:EX,detector:JmA,loader:YmA},zmA=HmA,QX="timeline",PmA=we(i=>/^\s*timeline/.test(i),"detector"),jmA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-ZCQFE5RP.js");return{id:QX,diagram:i}}),"loader"),VmA={id:QX,detector:PmA,loader:jmA},qmA=VmA,uX="mindmap",WmA=we(i=>/^\s*mindmap/.test(i),"detector"),ZmA=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-ICVZGLGO.js");return{id:uX,diagram:i}}),"loader"),XmA={id:uX,detector:WmA,loader:ZmA},$mA=XmA,pX="kanban",A6A=we(i=>/^\s*kanban/.test(i),"detector"),e6A=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-6UL33SIT.js");return{id:pX,diagram:i}}),"loader"),t6A={id:pX,detector:A6A,loader:e6A},i6A=t6A,fX="sankey",n6A=we(i=>/^\s*sankey(-beta)?/.test(i),"detector"),o6A=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-W67OU2Q2.js");return{id:fX,diagram:i}}),"loader"),a6A={id:fX,detector:n6A,loader:o6A},r6A=a6A,mX="packet",s6A=we(i=>/^\s*packet(-beta)?/.test(i),"detector"),l6A=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-WAKWL6X3.js");return{id:mX,diagram:i}}),"loader"),g6A={id:mX,detector:s6A,loader:l6A},wX="radar",c6A=we(i=>/^\s*radar-beta/.test(i),"detector"),C6A=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-5PR7OWPD.js");return{id:wX,diagram:i}}),"loader"),d6A={id:wX,detector:c6A,loader:C6A},yX="block",I6A=we(i=>/^\s*block(-beta)?/.test(i),"detector"),B6A=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-257HQBMN.js");return{id:yX,diagram:i}}),"loader"),h6A={id:yX,detector:I6A,loader:B6A},E6A=h6A,DX="architecture",Q6A=we(i=>/^\s*architecture/.test(i),"detector"),u6A=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-3YZ77ADE.js");return{id:DX,diagram:i}}),"loader"),p6A={id:DX,detector:Q6A,loader:u6A},f6A=p6A,vX="ishikawa",m6A=we(i=>/^\s*ishikawa(-beta)?\b/i.test(i),"detector"),w6A=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-LA76DWZL.js");return{id:vX,diagram:i}}),"loader"),y6A={id:vX,detector:m6A,loader:w6A},bX="venn",D6A=we(i=>/^\s*venn-beta/.test(i),"detector"),v6A=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-JW2YJHYO.js");return{id:bX,diagram:i}}),"loader"),b6A={id:bX,detector:D6A,loader:v6A},M6A=b6A,MX="treemap",S6A=we(i=>/^\s*treemap/.test(i),"detector"),k6A=we(()=>re(null,null,function*(){let{diagram:i}=yield import("./chunk-UWBTGTN5.js");return{id:MX,diagram:i}}),"loader"),_6A={id:MX,detector:S6A,loader:k6A},qZ=!1,X5=we(()=>{qZ||(qZ=!0,eQ("error",OmA,i=>i.toLowerCase().trim()==="error"),eQ("---",{db:{clear:we(()=>{},"clear")},styles:{},renderer:{draw:we(()=>{},"draw")},parser:{parse:we(()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with un-indented `---` blocks")},"parse")},init:we(()=>null,"init")},i=>i.toLowerCase().trimStart().startsWith("---")),B3(zmA,$mA,f6A),B3(SfA,i6A,DmA,fmA,OfA,qfA,XfA,emA,dmA,EmA,GfA,RfA,qmA,zfA,RmA,SmA,GmA,omA,r6A,g6A,lmA,E6A,d6A,y6A,_6A,M6A))},"addDiagrams"),x6A=we(()=>re(null,null,function*(){qa.debug("Loading registered diagrams");let e=(yield Promise.allSettled(Object.entries(I3).map(o=>re(null,[o],function*([A,{detector:t,loader:n}]){if(n)try{E3(A)}catch(a){try{let{diagram:r,id:s}=yield n();eQ(s,r,t)}catch(r){throw qa.error(`Failed to load external diagram with key ${A}. Removing from detectors.`),delete I3[A],r}}})))).filter(A=>A.status==="rejected");if(e.length>0){qa.error(`Failed to load ${e.length} external diagrams`);for(let A of e)qa.error(A);throw new Error(`Failed to load ${e.length} external diagrams`)}}),"loadRegisteredDiagrams"),R6A="graphics-document document";function SX(i,e){i.attr("role",R6A),e!==""&&i.attr("aria-roledescription",e)}we(SX,"setA11yDiagramInfo");function kX(i,e,A,t){if(i.insert!==void 0){if(A){let n=`chart-desc-${t}`;i.attr("aria-describedby",n),i.insert("desc",":first-child").attr("id",n).text(A)}if(e){let n=`chart-title-${t}`;i.attr("aria-labelledby",n),i.insert("title",":first-child").attr("id",n).text(e)}}}we(kX,"addSVGa11yTitleDescription");var gR=class _X{constructor(e,A,t,n,o){this.type=e,this.text=A,this.db=t,this.parser=n,this.renderer=o}static{we(this,"Diagram")}static fromText(t){return re(this,arguments,function*(e,A={}){let n=MI(),o=jD(e,n);e=SF(e)+` -`;try{E3(o)}catch(g){let C=dF(o);if(!C)throw new CF(`Diagram ${o} not found.`);let{id:d,diagram:B}=yield C();eQ(d,B)}let{db:a,parser:r,renderer:s,init:l}=E3(o);return r.parser&&(r.parser.yy=a),a.clear?.(),l?.(n),A.title&&a.setDiagramTitle?.(A.title),yield r.parse(e),new _X(o,e,a,r,s)})}render(e,A){return re(this,null,function*(){yield this.renderer.draw(this.text,e,A,this)})}getParser(){return this.parser}getType(){return this.type}},WZ=[],N6A=we(()=>{WZ.forEach(i=>{i()}),WZ=[]},"attachFunctions"),F6A=we(i=>i.replace(/^\s*%%(?!{)[^\n]+\n?/gm,"").trimStart(),"cleanupComments");function xX(i){let e=i.match(cF);if(!e)return{text:i,metadata:{}};let A=vF(e[1],{schema:DF})??{};A=typeof A=="object"&&!Array.isArray(A)?A:{};let t={};return A.displayMode&&(t.displayMode=A.displayMode.toString()),A.title&&(t.title=A.title.toString()),A.config&&(t.config=A.config),{text:i.slice(e[0].length),metadata:t}}we(xX,"extractFrontMatter");var L6A=we(i=>i.replace(/\r\n?/g,` -`).replace(/<(\w+)([^>]*)>/g,(e,A,t)=>"<"+A+t.replace(/="([^"]*)"/g,"='$1'")+">"),"cleanupText"),G6A=we(i=>{let{text:e,metadata:A}=xX(i),{displayMode:t,title:n,config:o={}}=A;return t&&(o.gantt||(o.gantt={}),o.gantt.displayMode=t),{title:n,config:o,text:e}},"processFrontmatter"),K6A=we(i=>{let e=SI.detectInit(i)??{},A=SI.detectDirective(i,"wrap");return Array.isArray(A)?e.wrap=A.some(({type:t})=>t==="wrap"):A?.type==="wrap"&&(e.wrap=!0),{text:bF(i),directive:e}},"processDirectives");function CR(i){let e=L6A(i),A=G6A(e),t=K6A(A.text),n=MF(A.config,t.directive);return i=F6A(t.text),{code:i,title:A.title,config:n}}we(CR,"preprocessDiagram");function RX(i){let e=new TextEncoder().encode(i),A=Array.from(e,t=>String.fromCodePoint(t)).join("");return btoa(A)}we(RX,"toBase64");var U6A=5e4,T6A="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",O6A="sandbox",J6A="loose",Y6A="http://www.w3.org/2000/svg",H6A="http://www.w3.org/1999/xlink",z6A="http://www.w3.org/1999/xhtml",P6A="100%",j6A="100%",V6A="border:0;margin:0;",q6A="margin:0",W6A="allow-top-navigation-by-user-activation allow-popups",Z6A='The "iframe" tag is not supported by your browser.',X6A=["foreignobject"],$6A=["dominant-baseline"];function dR(i){let e=CR(i);return AQ(),pF(e.config??{}),e}we(dR,"processAndSetConfigs");function NX(i,e){return re(this,null,function*(){X5();try{let{code:A,config:t}=dR(i);return{diagramType:(yield LX(A)).type,config:t}}catch(A){if(e?.suppressErrors)return!1;throw A}})}we(NX,"parse");var ZZ=we((i,e,A=[])=>` -.${i} ${e} { ${A.join(" !important; ")} !important; }`,"cssImportantStyles"),A8A=we((i,e=new Map)=>{let A="";if(i.themeCSS!==void 0&&(A+=` -${i.themeCSS}`),i.fontFamily!==void 0&&(A+=` -:root { --mermaid-font-family: ${i.fontFamily}}`),i.altFontFamily!==void 0&&(A+=` -:root { --mermaid-alt-font-family: ${i.altFontFamily}}`),e instanceof Map){let a=fF(i)?["> *","span"]:["rect","polygon","ellipse","circle","path"];e.forEach(r=>{An(r.styles)||a.forEach(s=>{A+=ZZ(r.id,s,r.styles)}),An(r.textStyles)||(A+=ZZ(r.id,"tspan",(r?.textStyles||[]).map(s=>s.replace("color","fill"))))})}return A},"createCssStyles"),e8A=we((i,e,A,t)=>{let n=A8A(i,A),o=wF(e,n,i.themeVariables);return W5(jZ(`${t}{${o}}`),VZ)},"createUserStyles"),t8A=we((i="",e,A)=>{let t=i;return!A&&!e&&(t=t.replace(/marker-end="url\([\d+./:=?A-Za-z-]*?#/g,'marker-end="url(#')),t=kF(t),t=t.replace(/
      /g,"
      "),t},"cleanUpSvgCode"),i8A=we((i="",e)=>{let A=e?.viewBox?.baseVal?.height?e.viewBox.baseVal.height+"px":j6A,t=RX(`${i}`);return``},"putIntoIFrame"),XZ=we((i,e,A,t,n)=>{let o=i.append("div");o.attr("id",A),t&&o.attr("style",t);let a=o.append("svg").attr("id",e).attr("width","100%").attr("xmlns",Y6A);return n&&a.attr("xmlns:xlink",n),a.append("g"),i},"appendDivSvgG");function cR(i,e){return i.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}we(cR,"sandboxedIframe");var n8A=we((i,e,A,t)=>{i.getElementById(e)?.remove(),i.getElementById(A)?.remove(),i.getElementById(t)?.remove()},"removeExistingElements"),o8A=we(function(i,e,A){return re(this,null,function*(){X5();let t=dR(e);e=t.code;let n=MI();qa.debug(n),e.length>(n?.maxTextSize??U6A)&&(e=T6A);let o="#"+i,a="i"+i,r="#"+a,s="d"+i,l="#"+s,g=we(()=>{let CA=zs(d?r:l).node();CA&&"remove"in CA&&CA.remove()},"removeTempElements"),C=zs("body"),d=n.securityLevel===O6A,B=n.securityLevel===J6A,u=n.fontFamily;if(A!==void 0){if(A&&(A.innerHTML=""),d){let Z=cR(zs(A),a);C=zs(Z.nodes()[0].contentDocument.body),C.node().style.margin=0}else C=zs(A);XZ(C,i,s,`font-family: ${u}`,H6A)}else{if(n8A(document,i,s,a),d){let Z=cR(zs("body"),a);C=zs(Z.nodes()[0].contentDocument.body),C.node().style.margin=0}else C=zs("body");XZ(C,i,s)}let E,f;try{E=yield gR.fromText(e,{title:t.title})}catch(Z){if(n.suppressErrorRendering)throw g(),Z;E=yield gR.fromText("error"),f=Z}let m=C.select(l).node(),v=E.type,S=m.firstChild,k=S.firstChild,M=E.renderer.getClasses?.(e,E),x=e8A(n,v,M,o),F=document.createElement("style");F.innerHTML=x,S.insertBefore(F,k);try{yield E.renderer.draw(e,i,"11.13.0",E)}catch(Z){throw n.suppressErrorRendering?g():UmA.draw(e,i,"11.13.0"),Z}let z=C.select(`${l} svg`),j=E.db.getAccTitle?.(),X=E.db.getAccDescription?.();GX(v,z,j,X),C.select(`[id="${i}"]`).selectAll("foreignobject > *").attr("xmlns",z6A);let eA=C.select(l).node().innerHTML;if(qa.debug("config.arrowMarkerAbsolute",n.arrowMarkerAbsolute),eA=t8A(eA,d,BF(n.arrowMarkerAbsolute)),d){let Z=C.select(l+" svg").node();eA=i8A(eA,Z)}else B||(eA=gF.sanitize(eA,{ADD_TAGS:X6A,ADD_ATTR:$6A,HTML_INTEGRATION_POINTS:{foreignobject:!0}}));if(N6A(),f)throw f;return g(),{diagramType:v,svg:eA,bindFunctions:E.db.bindFunctions}})},"render");function FX(i={}){let e=IF({},i);e?.fontFamily&&!e.themeVariables?.fontFamily&&(e.themeVariables||(e.themeVariables={}),e.themeVariables.fontFamily=e.fontFamily),EF(e),e?.theme&&e.theme in h3?e.themeVariables=h3[e.theme].getThemeVariables(e.themeVariables):e&&(e.themeVariables=h3.default.getThemeVariables(e.themeVariables));let A=typeof e=="object"?hF(e):qD();PD(A.logLevel),X5()}we(FX,"initialize");var LX=we((i,e={})=>{let{code:A}=CR(i);return gR.fromText(A,e)},"getDiagramFromText");function GX(i,e,A,t){SX(e,i),kX(e,A,t,e.attr("id"))}we(GX,"addA11yInfo");var cI=Object.freeze({render:o8A,parse:NX,getDiagramFromText:LX,initialize:FX,getConfig:MI,setConfig:uF,getSiteConfig:qD,updateSiteConfig:QF,reset:we(()=>{AQ()},"reset"),globalReset:we(()=>{AQ(VD)},"globalReset"),defaultConfig:VD});PD(MI().logLevel);AQ(MI());var a8A=we((i,e,A)=>{qa.warn(i),WD(i)?(A&&A(i.str,i.hash),e.push($A(P({},i),{message:i.str,error:i}))):(A&&A(i),i instanceof Error&&e.push({str:i.message,message:i.message,hash:i.name,error:i}))},"handleError"),KX=we(function(){return re(this,arguments,function*(i={querySelector:".mermaid"}){try{yield r8A(i)}catch(e){if(WD(e)&&qa.error(e.str),UC.parseError&&UC.parseError(e),!i.suppressErrors)throw qa.error("Use the suppressErrors option to suppress these errors"),e}})},"run"),r8A=we(function(){return re(this,arguments,function*({postRenderCallback:i,querySelector:e,nodes:A}={querySelector:".mermaid"}){let t=cI.getConfig();qa.debug(`${i?"":"No "}Callback function found`);let n;if(A)n=A;else if(e)n=document.querySelectorAll(e);else throw new Error("Nodes and querySelector are both undefined");qa.debug(`Found ${n.length} diagrams`),t?.startOnLoad!==void 0&&(qa.debug("Start On Load: "+t?.startOnLoad),cI.updateSiteConfig({startOnLoad:t?.startOnLoad}));let o=new SI.InitIDGenerator(t.deterministicIds,t.deterministicIDSeed),a,r=[];for(let s of Array.from(n)){if(qa.info("Rendering diagram: "+s.id),s.getAttribute("data-processed"))continue;s.setAttribute("data-processed","true");let l=`mermaid-${o.next()}`;a=s.innerHTML,a=_F(SI.entityDecode(a)).trim().replace(//gi,"
      ");let g=SI.detectInit(a);g&&qa.debug("Detected early reinit: ",g);try{let{svg:C,bindFunctions:d}=yield JX(l,a,s);s.innerHTML=C,i&&(yield i(l)),d&&d(s)}catch(C){a8A(C,r,UC.parseError)}}if(r.length>0)throw r[0]})},"runThrowsErrors"),UX=we(function(i){cI.initialize(i)},"initialize"),s8A=we(function(i,e,A){return re(this,null,function*(){qa.warn("mermaid.init is deprecated. Please use run instead."),i&&UX(i);let t={postRenderCallback:A,querySelector:".mermaid"};typeof e=="string"?t.querySelector=e:e&&(e instanceof HTMLElement?t.nodes=[e]:t.nodes=e),yield KX(t)})},"init"),l8A=we((A,...t)=>re(null,[A,...t],function*(i,{lazyLoad:e=!0}={}){X5(),B3(...i),e===!1&&(yield x6A())}),"registerExternalDiagrams"),TX=we(function(){if(UC.startOnLoad){let{startOnLoad:i}=cI.getConfig();i&&UC.run().catch(e=>qa.error("Mermaid failed to initialize",e))}},"contentLoaded");typeof document<"u"&&window.addEventListener("load",TX,!1);var g8A=we(function(i){UC.parseError=i},"setParseErrorHandler"),Z5=[],lR=!1,OX=we(()=>re(null,null,function*(){if(!lR){for(lR=!0;Z5.length>0;){let i=Z5.shift();if(i)try{yield i()}catch(e){qa.error("Error executing queue",e)}}lR=!1}}),"executeQueue"),c8A=we((i,e)=>re(null,null,function*(){return new Promise((A,t)=>{let n=we(()=>new Promise((o,a)=>{cI.parse(i,e).then(r=>{o(r),A(r)},r=>{qa.error("Error parsing",r),UC.parseError?.(r),a(r),t(r)})}),"performCall");Z5.push(n),OX().catch(t)})}),"parse"),JX=we((i,e,A)=>new Promise((t,n)=>{let o=we(()=>new Promise((a,r)=>{cI.render(i,e,A).then(s=>{a(s),t(s)},s=>{qa.error("Error parsing",s),UC.parseError?.(s),r(s),n(s)})}),"performCall");Z5.push(o),OX().catch(n)}),"render"),C8A=we(()=>Object.keys(I3).map(i=>({id:i})),"getRegisteredDiagramsMetadata"),UC={startOnLoad:!0,mermaidAPI:cI,parse:c8A,render:JX,init:s8A,run:KX,registerExternalDiagrams:l8A,registerLayoutLoaders:RF,initialize:UX,parseError:void 0,contentLoaded:TX,setParseErrorHandler:g8A,detectType:jD,registerIconPacks:xF,getRegisteredDiagramsMetadata:C8A},IR=UC;var pre=Vp(YX());Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));Prism.languages.js=Prism.languages.javascript;(function(i){i.languages.typescript=i.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),i.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete i.languages.typescript.parameter,delete i.languages.typescript["literal-property"];var e=i.languages.extend("typescript",{});delete e["class-name"],i.languages.typescript["class-name"].inside=e,i.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e}}}}),i.languages.ts=i.languages.typescript})(Prism);(function(i){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;i.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},i.languages.css.atrule.inside.rest=i.languages.css;var A=i.languages.markup;A&&(A.tag.addInlined("style","css"),A.tag.addAttribute("style","css"))})(Prism);Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}};Prism.languages.webmanifest=Prism.languages.json;(function(i){var e="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",A={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},t={bash:A,environment:{pattern:RegExp("\\$"+e),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+e),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};i.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+e),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:t},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:A}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:t.entity}}],environment:{pattern:RegExp("\\$?"+e),alias:"constant"},variable:t.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},A.inside=i.languages.bash;for(var n=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=t.variable[1].inside,a=0;a]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/};Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python;Prism.languages.py=Prism.languages.python;(function(i){var e=/[*&][^\s[\]{},]+/,A=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+A.source+"(?:[ ]+"+e.source+")?|"+e.source+"(?:[ ]+"+A.source+")?)",n=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function a(r,s){s=(s||"").replace(/m/g,"")+"m";var l=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return t}).replace(/<>/g,function(){return r});return RegExp(l,s)}i.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return t})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return t}).replace(/<>/g,function(){return"(?:"+n+"|"+o+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:a(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:a(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:a(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:a(o),lookbehind:!0,greedy:!0},number:{pattern:a(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:A,important:e,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},i.languages.yml=i.languages.yaml})(Prism);var I8A=i=>({color:i}),B1=class i{constructor(e,A){this.elementRef=e;this.chatPanel=A;Fn(()=>{let t=this.text();setTimeout(()=>{this.renderMermaid(),this.addCopyButtons()},100)})}text=ve("");thought=ve(!1);isReadme=ve(!1);ngOnInit(){IR.initialize({startOnLoad:!1,flowchart:{useMaxWidth:!0,htmlLabels:!0,curve:"basis"},theme:"neutral",themeVariables:{fontSize:"12px",primaryColor:"#e8f0fe",primaryTextColor:"#1a73e8",primaryBorderColor:"#1a73e8",lineColor:"#5f6368",secondaryColor:"#f1f3f4",tertiaryColor:"#ffffff"}})}renderMermaid(){let A=this.elementRef.nativeElement.querySelectorAll("pre code.language-mermaid"),t=!1;A.forEach(n=>{let o=n.parentElement;if(o){let a=n.textContent||"",r=document.createElement("div");r.classList.add("mermaid"),r.textContent=a.trim();let s=document.createElement("div");s.classList.add("mermaid-container"),s.appendChild(r),o.parentNode?.replaceChild(s,o),t=!0}}),t&&IR.run()}addCopyButtons(){let e=this.elementRef.nativeElement;e.querySelectorAll("pre").forEach(o=>{o.querySelector(".copy-code-button")||o.closest(".mermaid-container")||(o.style.position="relative",this.createCopyButton(o,o.querySelector("code")||o))});let t="";e.querySelectorAll("*").forEach(o=>{if(/^H[1-6]$/.test(o.tagName))t=o.textContent||"";else if(o.tagName==="CODE"){let a=o;if(a.closest("pre")||a.querySelector(".copy-code-button")||a.closest(".mermaid-container"))return;this.isReadme()&&t.toLowerCase().includes("sample inputs")&&(a.style.position="relative",this.createCopyButton(a,a),a.classList.add("runnable"),this.createRunButton(a,a))}})}createCopyButton(e,A){let t=document.createElement("button");t.className="copy-code-button",t.setAttribute("aria-label","Copy code"),t.type="button";let n=` - - - - `,o=` - - - - `;t.innerHTML=n,t.addEventListener("click",a=>{a.stopPropagation();let r=(A.textContent||"").trim();navigator.clipboard.writeText(r).then(()=>{t.innerHTML=o,t.classList.add("copied"),setTimeout(()=>{t.innerHTML=n,t.classList.remove("copied")},2e3)}).catch(s=>{console.error("Failed to copy text: ",s)})}),e.appendChild(t)}createRunButton(e,A){if(e.querySelector(".run-code-button"))return;let t=document.createElement("button");t.className="run-code-button",t.setAttribute("aria-label","Run sample input"),t.type="button";let n=` - - - - `;t.innerHTML=n,t.addEventListener("click",o=>{o.stopPropagation();let a=(A.textContent||"").trim();this.chatPanel&&(this.chatPanel.userInput=a,this.chatPanel.userInputChange.emit(a),setTimeout(()=>{this.chatPanel.sendMessage.emit(new Event("submit"))},50))}),e.appendChild(t)}static \u0275fac=function(A){return new(A||i)(st(ce),st(h1,8))};static \u0275cmp=vA({type:i,selectors:[["app-markdown"]],inputs:{text:[1,"text"],thought:[1,"thought"],isReadme:[1,"isReadme"]},features:[pt([GQ()])],decls:1,vars:4,consts:[[3,"data","ngStyle"]],template:function(A,t){A&1&&lA(0,"markdown",0),A&2&&H("data",t.text())("ngStyle",jl(2,I8A,t.thought()?"#9aa0a6":"inherit"))},dependencies:[li,vI,vK,DK],styles:[".mermaid-container[_ngcontent-%COMP%]{display:flex;justify-content:center;margin:16px 0}.mermaid[_ngcontent-%COMP%]{font-size:12px!important}.mermaid[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{max-width:100%;height:auto} .copy-code-button{position:absolute;top:4px;right:4px;z-index:10;display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border-radius:4px;background-color:var(--mat-sys-surface-container-high)!important;color:var(--mat-sys-on-surface-variant);border:none;cursor:pointer;opacity:0;transition:opacity .2s ease-in-out,background-color .2s ease-in-out,color .2s ease-in-out} pre:hover .copy-code-button{opacity:1} .copy-code-button:hover{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important} .copy-code-button:active{transform:scale(.95)} .copy-code-button.copied{color:#81c784!important;background-color:#4caf5026!important;opacity:1} pre:not(:hover) .copy-code-button.copied, code:not(pre code):not(:hover) .copy-code-button.copied{opacity:0!important;transition:none!important} .copy-code-button svg{width:16px;height:16px} .run-code-button{position:absolute;top:4px;right:4px;z-index:10;display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border-radius:4px;background-color:var(--mat-sys-surface-container-high)!important;color:var(--mat-sys-on-surface-variant);border:none;cursor:pointer;opacity:0;transition:opacity .2s ease-in-out,background-color .2s ease-in-out,color .2s ease-in-out} .run-code-button:hover{background-color:var(--mat-sys-primary-container)!important;color:var(--mat-sys-on-primary-container)!important} .run-code-button:active{transform:scale(.95)} .run-code-button svg{width:16px;height:16px} code:not(pre code){display:inline-block;position:relative;padding:0 4px;background-color:var(--mat-sys-surface-container-high);vertical-align:top} code:not(pre code).runnable:hover{padding-right:68px!important} code:not(pre code) .copy-code-button{position:absolute;top:50%;right:2px;transform:translateY(-50%);width:28px;height:28px;opacity:0;transition:none!important} code:not(pre code):hover .copy-code-button{opacity:1} code:not(pre code).runnable:hover .copy-code-button{right:32px!important} code:not(pre code) .copy-code-button:active{transform:translateY(-50%)!important} code:not(pre code) .run-code-button{position:absolute;top:50%;right:2px;transform:translateY(-50%);width:28px;height:28px;opacity:0;transition:none!important} code:not(pre code).runnable:hover .run-code-button{opacity:1} code:not(pre code) .run-code-button:active{transform:translateY(-50%)!important}"]})};function h8A(i,e){if(i&1){let A=aA();I(0,"span",6),U("click",function(n){L(A);let o=p();return G(o.toggleExpand(n))}),h()}if(i&2){let A=p();_A("expanded",A.isExpanded)}}function E8A(i,e){if(i&1){let A=aA();I(0,"button",11),U("click",function(n){L(A);let o=p(2);return G(o.openMarkdownDialog(o.key,o.json,n))}),D(1," MARKDOWN "),h()}}function Q8A(i,e){if(i&1&&(I(0,"span",7),D(1),h(),I(2,"span",8),D(3,":"),h(),T(4,E8A,2,0,"button",9),I(5,"span",10),D(6,"\xA0"),h()),i&2){let A=p();Q(),nA(A.key),Q(3),O(A.showMarkdown&&A.hasLineBreaks(A.json)?4:-1)}}function u8A(i,e){i&1&&(I(0,"span",14),D(1,"..."),h(),I(2,"span",13),D(3,"]"),h())}function p8A(i,e){if(i&1&&(I(0,"span",13),D(1,"["),h(),T(2,u8A,4,0)),i&2){let A=p(2);Q(2),O(A.isExpanded?-1:2)}}function f8A(i,e){i&1&&(I(0,"span",14),D(1,"..."),h())}function m8A(i,e){if(i&1&&T(0,f8A,2,0,"span",14),i&2){let A=p(2);O(A.isExpanded?-1:0)}}function w8A(i,e){if(i&1){let A=aA();I(0,"span",12),U("click",function(n){L(A);let o=p();return G(o.toggleExpand(n))}),T(1,p8A,3,1)(2,m8A,1,1),h()}if(i&2){let A=p();Q(),O(A.isArray(A.json)?1:2)}}function y8A(i,e){if(i&1&&(I(0,"span",15),D(1),h()),i&2){let A=p(2);Q(),Ee('"',A.json,'"')}}function D8A(i,e){if(i&1&&(I(0,"span",16),D(1),h()),i&2){let A=p(2);Q(),nA(A.json)}}function v8A(i,e){if(i&1&&(I(0,"span",17),D(1),h()),i&2){let A=p(2);Q(),nA(A.json)}}function b8A(i,e){i&1&&(I(0,"span",18),D(1,"null"),h())}function M8A(i,e){i&1&&(I(0,"span",19),D(1,"undefined"),h())}function S8A(i,e){if(i&1&&(I(0,"span",4),T(1,y8A,2,1,"span",15)(2,D8A,2,1,"span",16)(3,v8A,2,1,"span",17)(4,b8A,2,0,"span",18)(5,M8A,2,0,"span",19),h()),i&2){let A=p();H("ngClass",A.getTypeClass(A.json)),Q(),O(A.isString(A.json)?1:A.isNumber(A.json)?2:A.isBoolean(A.json)?3:A.isNull(A.json)?4:A.isUndefined(A.json)?5:-1)}}function k8A(i,e){if(i&1&&lA(0,"app-custom-json-viewer",22),i&2){let A=e.$implicit,t=e.$index,n=p(3);H("json",A)("key",t)("depth",n.depth+1)("expanded",n.expanded)("showMarkdown",n.showMarkdown)}}function _8A(i,e){if(i&1&&ke(0,k8A,1,5,"app-custom-json-viewer",22,Ja),i&2){let A=p(2);_e(A.json)}}function x8A(i,e){if(i&1&&lA(0,"app-custom-json-viewer",22),i&2){let A=e.$implicit,t=p(3);H("json",t.json[A])("key",A)("depth",t.depth+1)("expanded",t.expanded)("showMarkdown",t.showMarkdown)}}function R8A(i,e){if(i&1&&ke(0,x8A,1,5,"app-custom-json-viewer",22,ni),i&2){let A=p(2);_e(A.getKeys(A.json))}}function N8A(i,e){i&1&&(I(0,"div",21),D(1,"]"),h())}function F8A(i,e){if(i&1&&(I(0,"div",20),T(1,_8A,2,0)(2,R8A,2,0),T(3,N8A,2,0,"div",21),h()),i&2){let A=p();_A("root-children",A.depth===0),Q(),O(A.isArray(A.json)?1:2),Q(2),O(A.isArray(A.json)?3:-1)}}var BR=class i{dialogRef=w(zn);data=w(Do);close(){this.dialogRef.close()}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-markdown-preview-dialog"]],decls:10,vars:2,consts:[[1,"md-dialog-header"],["mat-dialog-title","",1,"md-title"],[1,"title-icon"],["mat-icon-button","",1,"close-button",3,"click"],[1,"md-dialog-content"],[3,"text"]],template:function(A,t){A&1&&(I(0,"div",0)(1,"h2",1)(2,"mat-icon",2),D(3,"article"),h(),D(4),h(),I(5,"button",3),U("click",function(){return t.close()}),I(6,"mat-icon"),D(7,"close"),h()()(),I(8,"mat-dialog-content",4),lA(9,"app-markdown",5),h()),A&2&&(Q(4),Ee(" Markdown Preview - ",t.data.key," "),Q(5),H("text",t.data.value))},dependencies:[li,Ls,Xo,Ba,zt,yi,B1],styles:[".md-dialog-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;padding:16px 24px 8px;border-bottom:1px solid var(--mat-sys-outline-variant)}.md-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin:0;font-size:1.25rem;font-weight:500;color:var(--mat-sys-on-surface)}.title-icon[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.close-button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)}.md-dialog-content[_ngcontent-%COMP%]{padding:24px;min-width:500px;max-width:80vw;max-height:70vh;overflow-y:auto;background-color:var(--mat-sys-surface-container-high);color:var(--mat-sys-on-surface)}"],changeDetection:0})},fl=class i{json;key;expanded=!0;depth=0;showMarkdown=!1;dialog=w(Xa);isExpanded=!0;ngOnInit(){this.isExpanded=this.expanded}isExpandable(){return this.json!==null&&typeof this.json=="object"}isObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}isArray(e){return Array.isArray(e)}isString(e){return typeof e=="string"}hasLineBreaks(e){return typeof e=="string"&&e.includes(` -`)}isNumber(e){return typeof e=="number"}isBoolean(e){return typeof e=="boolean"}isNull(e){return e===null}isUndefined(e){return e===void 0}getKeys(e){return e?Object.keys(e):[]}getTypeClass(e){return this.isString(e)?"segment-type-string":this.isNumber(e)?"segment-type-number":this.isBoolean(e)?"segment-type-boolean":this.isNull(e)?"segment-type-null":"segment-type-undefined"}toggleExpand(e){e.stopPropagation(),this.isExpanded=!this.isExpanded}openMarkdownDialog(e,A,t){t.stopPropagation(),this.dialog.open(BR,{data:{key:e.toString(),value:A},width:"800px",maxWidth:"90vw",panelClass:"custom-md-dialog"})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-custom-json-viewer"]],inputs:{json:"json",key:"key",expanded:"expanded",depth:"depth",showMarkdown:"showMarkdown"},decls:7,vars:6,consts:[[1,"segment"],[1,"segment-header"],[1,"segment-toggler",3,"expanded"],[1,"segment-value"],[1,"segment-value",3,"ngClass"],[1,"segment-children",3,"root-children"],[1,"segment-toggler",3,"click"],[1,"segment-key"],[1,"segment-separator"],["matTooltip","View in Markdown",1,"md-btn"],[1,"segment-space"],["matTooltip","View in Markdown",1,"md-btn",3,"click"],[1,"segment-value",3,"click"],[1,"bracket"],[1,"collapsed-summary"],[1,"value-string"],[1,"value-number"],[1,"value-boolean"],[1,"value-null"],[1,"value-undefined"],[1,"segment-children"],[1,"bracket","close-bracket"],[3,"json","key","depth","expanded","showMarkdown"]],template:function(A,t){A&1&&(I(0,"div",0)(1,"div",1),T(2,h8A,1,2,"span",2),T(3,Q8A,7,2),T(4,w8A,3,1,"span",3)(5,S8A,6,2,"span",4),h(),T(6,F8A,4,4,"div",5),h()),A&2&&(_A("segment-expandable",t.isExpandable()),Q(2),O(t.isExpandable()&&t.depth>0?2:-1),Q(),O(t.key!==void 0?3:-1),Q(),O(t.isExpandable()?4:5),Q(2),O(t.isExpandable()&&t.isExpanded?6:-1))},dependencies:[i,li,Vl,rn,Ls],styles:["[_nghost-%COMP%]{display:block;font-family:var(--ngx-json-font-family, monospace);font-size:var(--ngx-json-font-size, 13px);line-height:1.4}.segment[_ngcontent-%COMP%]{margin:2px 0;display:block}.segment-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;flex-wrap:wrap}.segment-toggler[_ngcontent-%COMP%]{cursor:pointer;display:inline-block;width:0;height:0;border-style:solid;border-width:5px 0 5px 6px;border-color:transparent transparent transparent var(--mat-sys-outline);margin-right:8px;margin-top:4px;transition:transform .15s ease}.segment-toggler.expanded[_ngcontent-%COMP%]{transform:rotate(90deg)}.segment-toggler[_ngcontent-%COMP%]:hover{border-left-color:var(--mat-sys-primary)}.segment-key[_ngcontent-%COMP%]{color:var(--mat-sys-primary);font-weight:400;cursor:pointer}.segment-separator[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)}.segment-space[_ngcontent-%COMP%]{display:inline-block;width:4px;-webkit-user-select:none;user-select:none}.segment-value[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)}.bracket[_ngcontent-%COMP%]{color:var(--mat-sys-outline);font-weight:400}.collapsed-summary[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:11px;margin:0 4px}.segment-children[_ngcontent-%COMP%]{margin-left:12px;padding-left:4px}.segment-children.root-children[_ngcontent-%COMP%]{margin-left:0;padding-left:0}.close-bracket[_ngcontent-%COMP%]{display:block}.md-btn[_ngcontent-%COMP%]{border:none;outline:none;cursor:pointer;font-family:Roboto,sans-serif;font-size:10px;font-weight:700;letter-spacing:.5px;color:var(--mat-sys-primary);background-color:var(--mat-sys-primary-container);border-radius:4px;padding:2px 6px;margin-left:4px;margin-right:2px;display:inline-flex;align-items:center;justify-content:center;opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease,background-color .2s ease,color .2s ease,transform .2s ease;height:16px}.md-btn[_ngcontent-%COMP%]:hover{opacity:1!important;transform:scale(1.05);background-color:var(--mat-sys-primary);color:var(--mat-sys-on-primary)}.segment-header[_ngcontent-%COMP%]:hover .md-btn[_ngcontent-%COMP%]{opacity:.5;visibility:visible}.segment-type-string[_ngcontent-%COMP%]{color:var(--ngx-json-string, #FF6B6B)}.segment-type-string[_ngcontent-%COMP%] .value-string[_ngcontent-%COMP%]{white-space:pre-wrap;word-break:break-word}.segment-type-number[_ngcontent-%COMP%]{color:var(--mat-sys-error)}.segment-type-boolean[_ngcontent-%COMP%]{color:var(--mat-sys-secondary)}.segment-type-null[_ngcontent-%COMP%], .segment-type-undefined[_ngcontent-%COMP%]{color:var(--mat-sys-outline);font-style:italic} .custom-md-dialog .mat-mdc-dialog-container{border-radius:12px!important;border:1px solid var(--mat-sys-outline-variant);box-shadow:0 12px 40px #0000004d!important;background-color:var(--mat-sys-surface-container-high)!important}"],changeDetection:0})};function L8A(i,e){if(i&1&&(I(0,"div",1),D(1),h()),i&2){let A=p();Q(),nA(A.title)}}var Ay=class i{title="";set json(e){if(typeof e=="string")try{this.parsedJson=JSON.parse(e)}catch(A){this.parsedJson=e}else this.parsedJson=e}parsedJson={};static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-json-tooltip"]],inputs:{title:"title",json:"json"},decls:4,vars:3,consts:[[1,"tooltip-shell"],[1,"tooltip-title"],[1,"tooltip-content"],[3,"json","expanded"]],template:function(A,t){A&1&&(I(0,"div",0),T(1,L8A,2,1,"div",1),I(2,"div",2),lA(3,"app-custom-json-viewer",3),h()()),A&2&&(Q(),O(t.title?1:-1),Q(2),H("json",t.parsedJson)("expanded",!0))},dependencies:[fl],styles:["[_nghost-%COMP%]{display:block;font-size:12px;line-height:1.4;word-break:break-word;overflow:hidden}.tooltip-shell[_ngcontent-%COMP%]{display:flex;flex-direction:column;max-width:800px;max-height:80vh;overflow:hidden}.tooltip-content[_ngcontent-%COMP%]{min-height:0;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable}.tooltip-title[_ngcontent-%COMP%]{font-weight:600;font-size:9px;color:var(--mat-sys-primary);opacity:.5;margin-bottom:4px;text-transform:uppercase;letter-spacing:.5px;position:sticky;top:0;background:inherit;z-index:1}app-custom-json-viewer[_ngcontent-%COMP%]{display:block;height:auto!important;min-width:0}"]})};var E1=class i{json="";title="";overlayRef=null;overlay=w(ad);elementRef=w(ce);show(){if(!this.json)return;let e=this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8},{originX:"center",originY:"bottom",overlayX:"center",overlayY:"top",offsetY:8},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",offsetY:-8},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",offsetY:-8}]).withViewportMargin(16).withPush(!1);this.overlayRef=this.overlay.create({positionStrategy:e,scrollStrategy:this.overlay.scrollStrategies.close(),panelClass:"json-tooltip-panel",maxWidth:"90vw"});let A=new Fs(Ay),t=this.overlayRef.attach(A);t.instance.json=this.json,t.instance.title=this.title,t.changeDetectorRef.detectChanges(),this.overlayRef.updatePosition()}hide(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}ngOnDestroy(){this.hide()}static \u0275fac=function(A){return new(A||i)};static \u0275dir=VA({type:i,selectors:[["","appJsonTooltip",""]],hostBindings:function(A,t){A&1&&U("mouseenter",function(){return t.show()})("mouseleave",function(){return t.hide()})},inputs:{json:[0,"appJsonTooltip","json"],title:[0,"appJsonTooltipTitle","title"]}})},ey=class i{tooltipTemplate;context={};disabled=!1;overlayRef=null;overlay=w(ad);elementRef=w(ce);viewContainerRef=w(Jo);show(){if(this.disabled||!this.tooltipTemplate)return;let e=this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8},{originX:"center",originY:"bottom",overlayX:"center",overlayY:"top",offsetY:8},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",offsetY:-8},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",offsetY:-8}]).withViewportMargin(16).withPush(!1);this.overlayRef=this.overlay.create({positionStrategy:e,scrollStrategy:this.overlay.scrollStrategies.close(),panelClass:"html-tooltip-panel",maxWidth:"90vw"});let A=new jr(this.tooltipTemplate,this.viewContainerRef,this.context);this.overlayRef.attach(A)}hide(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}ngOnDestroy(){this.hide()}static \u0275fac=function(A){return new(A||i)};static \u0275dir=VA({type:i,selectors:[["","appHtmlTooltip",""]],hostBindings:function(A,t){A&1&&U("mouseenter",function(){return t.show()})("mouseleave",function(){return t.hide()})},inputs:{tooltipTemplate:[0,"appHtmlTooltip","tooltipTemplate"],context:[0,"appHtmlTooltipContext","context"],disabled:[0,"appHtmlTooltipDisabled","disabled"]}})};function G8A(i,e){if(i&1&&(I(0,"div",3)(1,"mat-icon",4),D(2,"robot_2"),h()()),i&2){let A=p();ft("background-color",A.color),_A("hidden",!A.author),H("appJsonTooltip",A.tooltip)}}function K8A(i,e){if(i&1&&(I(0,"div",5),D(1),h()),i&2){let A=p();ft("background-color",A.color),_A("hidden",!A.author),H("appJsonTooltip",A.tooltip),Q(),Ee(" ",A.initial," ")}}function U8A(i,e){i&1&&(I(0,"div",2)(1,"mat-icon"),D(2,"person"),h()())}var ty=class i{role="user";author="";nodePath="";themeService=w(og);stringToColorService=w(g2);get tooltip(){if(this.role==="user")return"";let e={author:this.author,nodePath:this.nodePath||""};return JSON.stringify(e,null,2)}get color(){let e=this.getNodeName(this.nodePath||""),A=this.themeService.currentTheme();return this.stringToColorService.stc(e,A)}get initial(){let A=this.getNodeName(this.nodePath||"").match(/[A-Za-z0-9]/);return A?A[0].toUpperCase():"N"}getNodeName(e){return e.split(/[/.>]/).filter(Boolean).pop()||e}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-chat-avatar"]],inputs:{role:"role",author:"author",nodePath:"nodePath"},decls:3,vars:1,consts:[[1,"bot-avatar",3,"appJsonTooltip","hidden","background-color"],[1,"node-circle-icon",3,"background-color","appJsonTooltip","hidden"],[1,"user-avatar"],[1,"bot-avatar",3,"appJsonTooltip"],["fontSet","material-symbols-outlined"],[1,"node-circle-icon",3,"appJsonTooltip"]],template:function(A,t){A&1&&T(0,G8A,3,5,"div",0)(1,K8A,2,6,"div",1)(2,U8A,3,0,"div",2),A&2&&O(t.role==="bot"?0:t.role==="node"?1:t.role==="user"?2:-1)},dependencies:[li,Un,zt,qi,E1],styles:["[_nghost-%COMP%]{display:contents}.node-circle-icon[_ngcontent-%COMP%]{width:32px;height:32px;border-radius:50%;margin-left:4px;margin-right:16px;margin-top:2px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;align-self:flex-start;color:#fff;font-size:14px;font-weight:600;line-height:1;text-transform:uppercase}.bot-avatar[_ngcontent-%COMP%], .user-avatar[_ngcontent-%COMP%]{width:40px;height:40px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.bot-avatar[_ngcontent-%COMP%]{margin-right:12px;color:#fff}.user-avatar[_ngcontent-%COMP%]{background-color:var(--mat-sys-primary);color:var(--mat-sys-on-primary)}.hidden[_ngcontent-%COMP%]{visibility:hidden}"]})};var iy=new MA("FeedbackService");var T8A={goodResponseTooltip:"Good response",badResponseTooltip:"Bad response",feedbackAdditionalLabel:"Additional feedback (Optional)",feedbackCommentPlaceholderDown:"Share what could be improved in the response",feedbackCommentPlaceholderUp:"Share what you liked about the response",feedbackCancelButton:"Cancel",feedbackSubmitButton:"Submit",feedbackDialogTitle:"Reasons for feedback (Select all that apply)",feedbackReasonHallucination:"Hallucinated libraries / APIs etc",feedbackReasonIncomplete:"Incomplete answer",feedbackReasonFollowup:"Didn't understand followup",feedbackReasonFactual:"Factual errors",feedbackReasonLinks:"Broken/incorrect links",feedbackReasonIrrelevant:"Irrelevant information",feedbackReasonRepetitive:"Repetitive",feedbackReasonAccurate:"Accurate info",feedbackReasonHelpful:"Helpful",feedbackReasonConcise:"Concise",feedbackReasonUnderstanding:"Good understanding",feedbackReasonClear:"Clear and easy to follow"},HX=new MA("Message Feedback Messages",{factory:()=>T8A});function O8A(i,e){i&1&&(I(0,"mat-icon"),D(1,"thumb_up_filled"),h())}function J8A(i,e){i&1&&(I(0,"mat-icon"),D(1,"thumb_up"),h())}function Y8A(i,e){i&1&&(I(0,"mat-icon"),D(1,"thumb_down_filled"),h())}function H8A(i,e){i&1&&(I(0,"mat-icon"),D(1,"thumb_down"),h())}function z8A(i,e){if(i&1&&(I(0,"mat-chip-option",7),D(1),h()),i&2){let A=e.$implicit;H("value",A),Q(),Ee(" ",A," ")}}function P8A(i,e){if(i&1){let A=aA();I(0,"div",4)(1,"div",5)(2,"h3"),D(3),h(),I(4,"mat-chip-listbox",6),ke(5,z8A,2,2,"mat-chip-option",7,ni),h()(),I(7,"div",8)(8,"h3"),D(9),h(),I(10,"mat-form-field",9)(11,"textarea",10),D(12," "),h()()(),I(13,"div",11)(14,"button",12),U("click",function(){L(A);let n=p();return G(n.onDetailedFeedbackCancelled())}),D(15),h(),I(16,"button",13),U("click",function(){L(A);let n=p();return G(n.onDetailedFeedbackSubmitted())}),D(17),h()()()}if(i&2){let A=p();Q(3),nA(A.i18n.feedbackDialogTitle),Q(),H("formControl",A.selectedReasons),Q(),_e(A.reasons()),Q(4),nA(A.i18n.feedbackAdditionalLabel),Q(2),H("formControl",A.comment)("placeholder",A.feedbackPlaceholder()),Q(4),Ee(" ",A.i18n.feedbackCancelButton," "),Q(2),Ee(" ",A.i18n.feedbackSubmitButton," ")}}var ny=class i{sessionName=ve.required();eventId=ve.required();i18n=w(HX);feedbackService=w(iy);existingFeedback=If({params:()=>({sessionName:this.sessionName(),eventId:this.eventId()}),stream:({params:e})=>this.feedbackService.getFeedback(e.sessionName,e.eventId)});selectedFeedbackDirection=mA(void 0);feedbackDirection=ye(()=>this.selectedFeedbackDirection()??this.existingFeedback.value()?.direction);isDetailedFeedbackVisible=mA(!1);feedbackPlaceholder=ye(()=>this.feedbackDirection()==="up"?this.i18n.feedbackCommentPlaceholderUp:this.i18n.feedbackCommentPlaceholderDown);positiveReasonsResource=If({stream:()=>this.feedbackService.getPositiveFeedbackReasons()});negativeReasonsResource=If({stream:()=>this.feedbackService.getNegativeFeedbackReasons()});reasons=ye(()=>this.feedbackDirection()==="up"?this.positiveReasonsResource.value():this.negativeReasonsResource.value());selectedReasons=new Ps([]);comment=new Ps("");isLoading=mA(!1);sendFeedback(e){this.feedbackDirection()===e?(this.isLoading.set(!0),this.feedbackService.deleteFeedback(this.sessionName(),this.eventId()).subscribe(()=>{this.isLoading.set(!1),this.selectedFeedbackDirection.set(void 0),this.resetDetailedFeedback()})):(this.selectedReasons.reset(),this.isLoading.set(!0),this.feedbackService.sendFeedback(this.sessionName(),this.eventId(),{direction:e}).subscribe(()=>{this.isLoading.set(!1),this.isDetailedFeedbackVisible.set(!0),this.selectedFeedbackDirection.set(e)}))}onDetailedFeedbackSubmitted(){let e=this.feedbackDirection();e&&(this.isLoading.set(!0),this.feedbackService.sendFeedback(this.sessionName(),this.eventId(),{direction:e,reasons:this.selectedReasons.value??[],comment:this.comment.value??void 0}).subscribe(()=>{this.isLoading.set(!1),this.resetDetailedFeedback()}))}onDetailedFeedbackCancelled(){this.selectedFeedbackDirection.set(void 0),this.resetDetailedFeedback()}resetDetailedFeedback(){this.isDetailedFeedbackVisible.set(!1),this.comment.reset(),this.selectedReasons.reset([])}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-message-feedback"]],inputs:{sessionName:[1,"sessionName"],eventId:[1,"eventId"]},decls:9,vars:7,consts:[[1,"message-feedback-container"],[1,"feedback-buttons"],["mat-icon-button","",3,"click","matTooltip","disabled"],["class","feedback-details-container",4,"ngIf"],[1,"feedback-details-container"],[1,"reasons-chips"],["multiple","",3,"formControl"],[3,"value"],[1,"additional-feedback"],["appearance","outline"],["matInput","",3,"formControl","placeholder"],[1,"actions"],["mat-stroked-button","",3,"click"],["mat-flat-button","","color","primary",3,"click"]],template:function(A,t){A&1&&(I(0,"div",0)(1,"div",1)(2,"button",2),U("click",function(){return t.sendFeedback("up")}),T(3,O8A,2,0,"mat-icon")(4,J8A,2,0,"mat-icon"),h(),I(5,"button",2),U("click",function(){return t.sendFeedback("down")}),T(6,Y8A,2,0,"mat-icon")(7,H8A,2,0,"mat-icon"),h()(),kt(8,P8A,18,7,"div",3),h()),A&2&&(Q(2),H("matTooltip",t.i18n.goodResponseTooltip)("disabled",t.isLoading()),Q(),O(t.feedbackDirection()==="up"?3:4),Q(2),H("matTooltip",t.i18n.badResponseTooltip)("disabled",t.isLoading()),Q(),O(t.feedbackDirection()==="down"?6:7),Q(2),H("ngIf",t.isDetailedFeedbackVisible()))},dependencies:[li,ql,WC,Gn,Kn,x1,qi,ki,yi,f5,Kx,Lx,Za,Zo,Un,zt,Ws,ka,Ha,rn],styles:[".message-feedback-container[_ngcontent-%COMP%]{display:block}.feedback-buttons[_ngcontent-%COMP%]{--mat-icon-button-touch-target-size: 32px;--button-size: 32px;--icon-size: 12px;margin-left:96px;display:flex}.feedback-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:var(--button-size);height:var(--button-size);transition:all .2s ease}.feedback-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:var(--icon-size);height:var(--icon-size);width:var(--icon-size);transition:all .2s ease}.feedback-buttons[_ngcontent-%COMP%] button.selected[_ngcontent-%COMP%]{color:var(--side-panel-button-filled-label-text-color, white)}.feedback-buttons[_ngcontent-%COMP%] button.selected[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:inherit}.reasons-chips[_ngcontent-%COMP%]{margin-bottom:20px}.feedback-details-container[_ngcontent-%COMP%]{margin-left:54px;max-width:500px;padding:16px;border-radius:8px;margin-top:8px;border:1px solid var(--builder-border-color)}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-weight:500;margin-bottom:8px;margin-top:0;color:var(--builder-text-secondary-color)}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{min-height:60px;resize:vertical}.feedback-details-container[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}.feedback-details-container[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:18px;padding:0 16px;height:32px;line-height:32px;font-weight:500}"]})};var j8A={cancelButton:"Cancel",saveButton:"Save",invalidJsonAlert:"Invalid JSON: "},zX=new MA("Edit Json Dialog Messages",{factory:()=>j8A});var CI=class i{constructor(e,A){this.dialogRef=e;this.data=A;this.jsonString=JSON.stringify(A.jsonContent,null,2),this.functionName=A.functionName||""}jsonEditorComponent=Yo(Dc);jsonString="";functionName="";i18n=w(zX);ngOnInit(){}onSave(){try{this.jsonString=this.jsonEditorComponent().getJsonString();let e=JSON.parse(this.jsonString);this.dialogRef.close(e)}catch(e){alert(this.i18n.invalidJsonAlert+e)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(A){return new(A||i)(st(zn),st(Do))};static \u0275cmp=vA({type:i,selectors:[["app-edit-json-dialog"]],viewQuery:function(A,t){A&1&&ls(t.jsonEditorComponent,Dc,5),A&2&&br()},decls:11,vars:5,consts:[[1,"dialog-container"],["mat-dialog-title",""],[1,"editor"],[3,"jsonString"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,t){A&1&&(I(0,"div",0)(1,"h2",1),D(2),h(),I(3,"mat-dialog-content",2),D(4),lA(5,"app-json-editor",3),h(),I(6,"mat-dialog-actions",4)(7,"button",5),D(8),h(),I(9,"button",6),U("click",function(){return t.onSave()}),D(10),h()()()),A&2&&(Q(2),nA(t.data.dialogHeader),Q(2),Ee(" ",t.functionName," "),Q(),H("jsonString",t.jsonString),Q(3),nA(t.i18n.cancelButton),Q(2),nA(t.i18n.saveButton))},dependencies:[Xo,Ba,Dc,ha,ki,r2],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:18px;width:500px;box-shadow:0 8px 16px var(--edit-json-dialog-container-box-shadow-color)}.editor[_ngcontent-%COMP%]{padding-top:12px;height:300px}"]})};function vE(i){if(!i)return!1;if(i.name==="computer"){let t=i.args?.action,n=i.args?.coordinate;return["left_click","right_click","middle_click","double_click"].includes(t)&&Array.isArray(n)&&n.length===2}let e=["click_at","hover_at","type_text_at","scroll_at","drag_and_drop","mouse_move","scroll_document","wait_5_seconds","navigate","open_web_browser"].includes(i.name),A=i.args?.x!=null&&i.args?.y!=null||Array.isArray(i.args?.coordinate)&&i.args?.coordinate.length===2;return e}function k0(i){return i?!!i.response?.image?.data:!1}var hR=(a=>(a[a.INACTIVE=0]="INACTIVE",a[a.PENDING=1]="PENDING",a[a.RUNNING=2]="RUNNING",a[a.COMPLETED=3]="COMPLETED",a[a.INTERRUPTED=4]="INTERRUPTED",a[a.FAILED=5]="FAILED",a))(hR||{});var V8A=()=>({type:"dots",color:"#424242",size:1,gap:10});function q8A(i,e){i&1&&(I(0,"span",2),D(1,"(Pinned - Click X to close)"),h())}function W8A(i,e){i&1&&(I(0,"span",2),D(1,"(Click to pin)"),h())}function Z8A(i,e){i&1&&(I(0,"mat-icon",10),D(1,"chevron_right"),h())}function X8A(i,e){if(i&1){let A=aA();I(0,"span",9),U("click",function(){let n=L(A).$index,o=p(2);return G(o.navigateToLevel(n))}),D(1),h(),T(2,Z8A,2,0,"mat-icon",10)}if(i&2){let A=e.$implicit,t=e.$index,n=p(2);_A("active",t===n.breadcrumbs().length-1),Q(),Ee(" ",A," "),Q(),O(t0?17:-1)}}function iwA(i,e){if(i&1&&(Et(),I(0,"g",24),lA(1,"path",25),h()),i&2){let A=e.$implicit;Q(),ie("d",A.path())("stroke",A.edge.data!=null&&A.edge.data.isActive?"#42A5F5":"rgba(138, 180, 248, 0.8)")("stroke-width",A.edge.data!=null&&A.edge.data.isActive?"3":"2")("class",A.edge.data!=null&&A.edge.data.isActive?"active-edge":"")("marker-end",A.markerEnd())}}var oy=class i{nodes=null;agentGraphData=null;nodePath=null;allNodes=null;isPinned=!1;onClose;graphNodes=mA([]);graphEdges=mA([]);NodeStatus=hR;connection={mode:"loose"};fullAgentData=null;navigationStack=[];breadcrumbs=mA([]);close(){this.onClose&&this.onClose()}ngOnInit(){this.buildGraph()}buildGraph(){if(this.agentGraphData?.root_agent){this.fullAgentData=this.agentGraphData.root_agent,this.navigationStack=[{name:this.agentGraphData.root_agent.name,data:this.agentGraphData.root_agent}],this.nodePath&&this.navigateToNodePath(this.nodePath),this.updateBreadcrumbs();let e=this.navigationStack[this.navigationStack.length-1].data;this.buildGraphFromStructure(e)}else this.buildGraphFromStateOnly()}buildGraphFromStructure(e){let A=[],t=[];if(e.nodes&&Array.isArray(e.nodes))this.buildMeshGraph(e.nodes,A,t);else if(e.graph&&e.graph.nodes){let n=IO(e.graph.nodes,e.graph.edges||[],g6);e.graph.nodes.forEach((o,a)=>{let r=tc(o,`node_${a}`),s=this.nodes?this.nodes[r]:null,l=o.type||"agent",g=n.positions.get(r)||{x:g6.startX,y:g6.startY},C=tC(o),d=this.getNodeStatusAtLevel(r,o);A.push({id:r,type:"html-template",point:mA({x:g.x,y:g.y}),width:mA(180),height:mA(80),data:mA({name:r,type:l,status:d,input:s?.input,triggeredBy:s?.triggered_by,retryCount:s?.retry_count,runId:s?.run_id,hasNestedStructure:C,nodeData:o})})}),e.graph.edges&&e.graph.edges.forEach((o,a)=>{let r=tc(o.from_node),s=tc(o.to_node);if(r&&s){let l=this.getNodeStatusAtLevel(r,o.from_node),g=this.getNodeStatusAtLevel(s,o.to_node),C=l===2||l===3&&(g===2||g===1);t.push({id:`${r}_to_${s}_${a}`,source:r,target:s,type:"template",data:{isActive:C},markers:{end:{type:"arrow-closed",width:15,height:15,color:C?"#42A5F5":"rgba(138, 180, 248, 0.8)"}}})}})}this.graphNodes.set(A),this.graphEdges.set(t)}buildMeshGraph(e,A,t){let n=e.findIndex(d=>d.name===e[0]?.name||d.type==="coordinator"),o=n>=0?e[n]:null,a=e.filter((d,B)=>B!==n),r=100,s=200,l=300,C=400-(a.length-1)*l/2;if(o){let d=tC(o),B=tc(o),u=this.getNodeStatusAtLevel(B,o);A.push({id:B,type:"html-template",point:mA({x:400,y:r}),width:mA(180),height:mA(80),data:mA({name:B,type:"agent",status:u,hasNestedStructure:d,nodeData:o})})}a.forEach((d,B)=>{let u=C+B*l,E=r+s,f=tC(d),m=tc(d),v=this.getNodeStatusAtLevel(m,d);if(A.push({id:m,type:"html-template",point:mA({x:u,y:E}),width:mA(180),height:mA(80),data:mA({name:m,type:"agent",status:v,hasNestedStructure:f,nodeData:d})}),o){let S=tc(o),k=this.getNodeStatusAtLevel(S,o),M=k===2||k===3&&(v===2||v===1);t.push({id:`${S}_to_${m}`,source:S,target:m,type:"template",floating:!0,data:{isActive:M},markers:{end:{type:"arrow-closed",width:15,height:15,color:M?"#42A5F5":"rgba(138, 180, 248, 0.8)"}}})}})}buildGraphFromStateOnly(){let e=[],A=[];if(!this.nodes){this.graphNodes.set(e),this.graphEdges.set(A);return}let a=Object.keys(this.nodes);a.forEach((r,s)=>{let l=this.nodes[r];e.push({id:r,type:"html-template",point:mA({x:200,y:50+s*120}),width:mA(180),height:mA(80),data:mA({name:r,type:r==="__START__"?"start":"agent",status:l.status,input:l.input,triggeredBy:l.triggered_by,retryCount:l.retry_count,runId:l.run_id})})}),a.forEach(r=>{let s=this.nodes[r];if(s.triggered_by&&a.includes(s.triggered_by)){let g=this.nodes[s.triggered_by]?.status===2;A.push({id:`${s.triggered_by}_to_${r}`,source:s.triggered_by,target:r,type:"template",floating:!0,data:{isActive:g},markers:{end:{type:"arrow-closed",width:15,height:15,color:g?"#42A5F5":"rgba(138, 180, 248, 0.8)"}}})}}),this.graphNodes.set(e),this.graphEdges.set(A)}getStatusColor(e){switch(e){case 0:return"#757575";case 1:return"#FFA726";case 2:return"#42A5F5";case 3:return"#66BB6A";case 4:return"#FFCA28";case 5:return"#EF5350";default:return"#757575"}}getStatusLabel(e){switch(e){case 0:return"INACTIVE";case 1:return"PENDING";case 2:return"RUNNING";case 3:return"COMPLETED";case 4:return"INTERRUPTED";case 5:return"FAILED";default:return"UNKNOWN"}}getStatusIcon(e){switch(e){case 0:return"radio_button_unchecked";case 1:return"schedule";case 2:return"play_circle";case 3:return"check_circle";case 4:return"pause_circle";case 5:return"error";default:return"help"}}updateBreadcrumbs(){this.breadcrumbs.set(this.navigationStack.map(e=>e.name))}navigateIntoNode(e){let A=this.navigationStack[this.navigationStack.length-1].data,t=LB(A,e);t&&tC(t)&&(this.navigationStack.push({name:e,data:t}),this.updateBreadcrumbs(),this.buildGraphFromStructure(t))}navigateToLevel(e){if(e>=0&&e1?9:-1),Q(2),H("nodes",t.graphNodes())("edges",t.graphEdges())("connection",t.connection)("background",Lc(8,V8A)))},dependencies:[li,Un,zt,qi,yi,K5,Dp,U5,QZ,hE,S5],styles:[".workflow-graph-tooltip[_ngcontent-%COMP%]{width:500px;height:400px;border-radius:8px;padding:12px;display:flex;flex-direction:column;box-shadow:0 4px 16px #0006}.tooltip-header[_ngcontent-%COMP%]{font-size:14px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid rgba(255,255,255,.1);display:flex;align-items:center;gap:8px}.pinned-hint[_ngcontent-%COMP%]{font-size:12px;font-weight:400;opacity:.7;font-style:italic;flex:1}.close-button[_ngcontent-%COMP%]{width:24px;height:24px;line-height:24px;margin-left:auto}.close-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:18px}.breadcrumb-nav[_ngcontent-%COMP%]{display:flex;align-items:center;margin-bottom:8px;font-size:12px;color:var(--mdc-dialog-supporting-text-color)}.breadcrumb-item[_ngcontent-%COMP%]{cursor:pointer;padding:3px 6px;border-radius:3px;transition:background-color .2s}.breadcrumb-item.active[_ngcontent-%COMP%]{font-weight:500;cursor:default}.breadcrumb-separator[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;opacity:.5;margin:0 2px}.vflow-container[_ngcontent-%COMP%]{flex:1;min-height:0;border:1px solid rgba(255,255,255,.1);border-radius:4px;overflow:hidden;position:relative}.vflow-container[_ngcontent-%COMP%] vflow[_ngcontent-%COMP%]{width:100%;height:100%;display:block}.workflow-node[_ngcontent-%COMP%]{border:2px solid;border-radius:6px;padding:8px 12px;min-width:160px;box-shadow:0 2px 6px #0000004d;transition:all .2s}.workflow-node.expandable[_ngcontent-%COMP%]{cursor:pointer}.workflow-node.expandable[_ngcontent-%COMP%]:hover{box-shadow:0 4px 12px #8ab4f84d;transform:scale(1.02)}.node-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.node-type-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:#8ab4f8e6}.status-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;margin-left:auto}.node-label[_ngcontent-%COMP%]{font-weight:500;font-size:13px;color:var(--mdc-dialog-supporting-text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.node-type[_ngcontent-%COMP%]{font-size:10px;color:#8ab4f8cc;font-weight:500;text-transform:uppercase;letter-spacing:.5px;margin-top:2px}.node-status[_ngcontent-%COMP%]{font-size:11px;font-weight:600;margin-top:2px}.node-retry[_ngcontent-%COMP%]{font-size:10px;color:var(--mdc-dialog-supporting-text-color);opacity:.7;margin-top:2px}[_nghost-%COMP%] .active-edge{animation:_ngcontent-%COMP%_dash 1.5s linear infinite;stroke-dasharray:8 4}@keyframes _ngcontent-%COMP%_dash{to{stroke-dashoffset:-12}}"]})};var ay=class i{appWorkflowGraphTooltip=null;agentGraphData=null;nodePath=null;allNodes=null;overlay=w(ad);overlayPositionBuilder=w(lm);viewContainerRef=w(Jo);overlayRef=null;isPinned=!1;onClick(e){e.stopPropagation(),!(!this.appWorkflowGraphTooltip||Object.keys(this.appWorkflowGraphTooltip).length===0)&&(this.isPinned?this.hide():this.showPinned())}show(){this.isPinned||!this.appWorkflowGraphTooltip||Object.keys(this.appWorkflowGraphTooltip).length===0||this.overlayRef||this.showTooltip(!1)}hide(){this.isPinned||this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}showPinned(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null),this.isPinned=!0,this.showTooltip(!0)}showTooltip(e){if(this.overlayRef)return;let A=this.overlayPositionBuilder.flexibleConnectedTo(this.viewContainerRef.element).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8},{originX:"center",originY:"bottom",overlayX:"center",overlayY:"top",offsetY:8}]);this.overlayRef=this.overlay.create({positionStrategy:A,scrollStrategy:this.overlay.scrollStrategies.close(),hasBackdrop:e,backdropClass:e?"cdk-overlay-transparent-backdrop":void 0}),e&&this.overlayRef&&this.overlayRef.backdropClick().subscribe(()=>{this.isPinned=!1,this.hide()});let t=new Fs(oy),n=this.overlayRef.attach(t);n.instance.nodes=this.appWorkflowGraphTooltip,n.instance.agentGraphData=this.agentGraphData,n.instance.nodePath=this.nodePath,n.instance.allNodes=this.allNodes,n.instance.isPinned=e,n.instance.onClose=()=>{this.isPinned=!1,this.hide()}}ngOnDestroy(){this.isPinned=!1,this.hide()}static \u0275fac=function(A){return new(A||i)};static \u0275dir=VA({type:i,selectors:[["","appWorkflowGraphTooltip",""]],hostBindings:function(A,t){A&1&&U("click",function(o){return t.onClick(o)})("mouseenter",function(){return t.show()})("mouseleave",function(){return t.hide()})},inputs:{appWorkflowGraphTooltip:"appWorkflowGraphTooltip",agentGraphData:"agentGraphData",nodePath:"nodePath",allNodes:"allNodes"}})};function nwA(i,e){if(i&1){let A=aA();I(0,"div",5)(1,"img",10),U("load",function(n){L(A);let o=p(4);return G(o.onImageLoad(n))})("click",function(n){L(A),p(3);let o=Ki(0);return p().openImageViewer(o),G(n.stopPropagation())}),h(),lA(2,"div",11),h()}if(i&2){p(3);let A=Ki(0),t=p();Q(),H("src",A,mo),Q(),H("ngStyle",t.getClickBoxStyle())}}function owA(i,e){i&1&&(I(0,"div",6)(1,"mat-icon",12),D(2,"image_not_supported"),h(),I(3,"span",13),D(4,"No screenshot"),h()())}function awA(i,e){if(i&1){let A=aA();T(0,nwA,3,2,"div",5)(1,owA,5,0,"div",6),I(2,"div",7)(3,"span",8),D(4),h(),I(5,"mat-icon"),D(6,"arrow_forward"),h()(),I(7,"div",5)(8,"img",9),U("click",function(n){L(A),p(2);let o=Ki(1);return p().openImageViewer(o),G(n.stopPropagation())}),h()()}if(i&2){p(2);let A=Ki(0),t=Ki(1),n=p();O(A?0:1),Q(4),nA(n.getActionName()),Q(4),H("src",t,mo)}}function rwA(i,e){if(i&1){let A=aA();I(0,"div",5)(1,"img",10),U("load",function(n){L(A);let o=p(3);return G(o.onImageLoad(n))})("click",function(n){L(A),p(2);let o=Ki(0);return p().openImageViewer(o),G(n.stopPropagation())}),h(),lA(2,"div",11),h()}if(i&2){p(2);let A=Ki(0),t=p();Q(),H("src",A,mo),Q(),H("ngStyle",t.getClickBoxStyle())}}function swA(i,e){if(i&1){let A=aA();I(0,"div",3),U("click",function(){L(A);let n=p(2);return G(n.clickEvent.emit(n.index))}),I(1,"div",4),T(2,awA,9,3)(3,rwA,3,2,"div",5),h()()}if(i&2){p();let A=Ki(1);_A("dual-images",!!A),Q(2),O(A?2:3)}}function lwA(i,e){if(i&1){let A=aA();I(0,"div",14),U("click",function(){L(A);let n=p(2);return G(n.clickEvent.emit(n.index))}),I(1,"div",6)(2,"mat-icon",12),D(3,"image_not_supported"),h(),I(4,"span",13),D(5,"No screenshot"),h()()()}}function gwA(i,e){if(i&1&&(ro(0)(1),T(2,swA,4,3,"div",1)(3,lwA,6,0,"div",2)),i&2){let A=p(),t=so(A.getPreviousComputerUseScreenshot());Q();let n=so(A.getNextComputerUseScreenshot());Q(),O(t||n?2:3)}}function cwA(i,e){if(i&1){let A=aA();I(0,"div",15),U("click",function(){L(A);let n=p();return G(n.clickEvent.emit(n.index))}),I(1,"div",16)(2,"span",17),D(3),h()(),lA(4,"img",18),I(5,"div",19)(6,"mat-icon",20),D(7,"computer"),h(),I(8,"span",21),D(9),h()()()}if(i&2){let A=p();Q(3),nA(A.functionResponse.name),Q(),H("src",A.getComputerUseScreenshot(),mo),Q(5),nA(A.getComputerUseUrl())}}var ry=class i{functionCall;functionResponse;allMessages=[];index=0;clickEvent=new FA;openImage=new FA;imageDimensions=new Map;VIRTUAL_WIDTH=1e3;VIRTUAL_HEIGHT=1e3;isComputerUseResponse(){return!!this.functionResponse&&k0(this.functionResponse)}isComputerUseClick(){return!!this.functionCall&&vE(this.functionCall)}getComputerUseScreenshot(){return this.getScreenshotFromPayload(this.functionResponse?.response)}getComputerUseUrl(){return this.isComputerUseResponse()&&(this.functionResponse?.response).url||""}getPreviousComputerUseScreenshot(){for(let e=this.index-1;e>=0;e--){let A=this.allMessages[e];if(this.isMsgComputerUseResponse(A)&&A.functionResponses&&A.functionResponses.length>0)for(let t=A.functionResponses.length-1;t>=0;t--){let n=A.functionResponses[t];if(k0(n)){let a=n.response;return this.getScreenshotFromPayload(a)}let o=n.parts;if(Array.isArray(o))for(let a=o.length-1;a>=0;a--){let r=o[a];if(r.inlineData?.mimeType?.startsWith("image/")&&r.inlineData.data){let s=r.inlineData.mimeType,l=r.inlineData.data.replace(/-/g,"+").replace(/_/g,"/");return`data:${s};base64,${l}`}}}}return""}getNextComputerUseScreenshot(){for(let e=this.index+1;e0)for(let t=0;t0?e.functionResponses.some(A=>{if(k0(A))return!0;let t=A.parts;return Array.isArray(t)?t.some(n=>n.inlineData?.mimeType?.startsWith("image/")):!1}):!1}getScreenshotFromPayload(e){let A=e?.image;if(!A?.data)return"";let t=A.data;return t.startsWith("data:")?t:`data:${A.mimetype||"image/png"};base64,${t}`}getAllComputerUseScreenshots(){let e=[];for(let A of this.allMessages)if(this.isMsgComputerUseResponse(A)&&A.functionResponses)for(let t of A.functionResponses){if(k0(t)){let o=t.response;e.push(this.getScreenshotFromPayload(o))}let n=t.parts;if(Array.isArray(n)){for(let o of n)if(o.inlineData?.mimeType?.startsWith("image/")&&o.inlineData.data){let a=o.inlineData.mimeType,r=o.inlineData.data.replace(/-/g,"+").replace(/_/g,"/");e.push(`data:${a};base64,${r}`)}}}return e}getAllComputerUseUrls(){let e=[],A="";for(let t of this.allMessages)if(this.isMsgComputerUseResponse(t)&&t.functionResponses)for(let n of t.functionResponses){let o=n.response?.url;o&&(A=o),k0(n)&&e.push(A);let a=n.parts;if(Array.isArray(a))for(let r of a)r.inlineData?.mimeType?.startsWith("image/")&&r.inlineData.data&&e.push(A)}return e}getAllComputerUseCoordinates(){let e=[],A=null;for(let t of this.allMessages){let n=t.functionCalls;if(Array.isArray(n))for(let o of n)vE(o)?A=o:o.name==="computer"&&(A=null);if(this.isMsgComputerUseResponse(t)&&t.functionResponses)for(let o of t.functionResponses){let a=!1;k0(o)&&(a=!0);let r=o.parts;if(Array.isArray(r))for(let s of r)s.inlineData?.mimeType?.startsWith("image/")&&s.inlineData.data&&(a=!0);a&&(A&&e.length>0&&(e[e.length-1]=this.getClickCoordinates(A)),e.push(null))}}return e}openImageViewer(e){let A=this.getAllComputerUseScreenshots(),t=this.getAllComputerUseUrls(),n=this.getAllComputerUseCoordinates(),o=A.indexOf(e);this.openImage.emit({images:A,currentIndex:o,urls:t,coordinates:n})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-computer-action"]],inputs:{functionCall:"functionCall",functionResponse:"functionResponse",allMessages:"allMessages",index:"index"},outputs:{clickEvent:"clickEvent",openImage:"openImage"},decls:2,vars:1,consts:[[1,"computer-use-container"],[1,"computer-use-container","click-visualization-container",3,"dual-images"],[1,"computer-use-container","click-visualization-container","fallback"],[1,"computer-use-container","click-visualization-container",3,"click"],[1,"images-wrapper-flex"],[1,"image-wrapper"],[1,"image-wrapper","fallback-image"],[1,"arrow-container"],[1,"action-name-above"],["alt","Next Screenshot",1,"computer-use-screenshot",3,"click","src"],["alt","Computer Use Screenshot",1,"computer-use-screenshot",3,"load","click","src"],[1,"click-overlay-box",3,"ngStyle"],[1,"missing-icon"],[1,"fallback-text"],[1,"computer-use-container","click-visualization-container","fallback",3,"click"],[1,"computer-use-container",3,"click"],[1,"computer-use-header"],[1,"computer-use-tool-name"],["alt","Computer Use Screenshot",1,"computer-use-screenshot",3,"src"],[1,"computer-use-footprint"],[1,"computer-icon"],[1,"url-text"]],template:function(A,t){A&1&&T(0,gwA,4,3)(1,cwA,10,3,"div",0),A&2&&O(t.isComputerUseClick()?0:t.isComputerUseResponse()?1:-1)},dependencies:[li,vI,Un,zt,Ha],styles:['[_nghost-%COMP%]{display:block}.computer-use-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;border-radius:12px;border:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color);overflow:hidden;cursor:pointer;margin:5px 5px 10px;transition:opacity .2s}.computer-use-container[_ngcontent-%COMP%]:hover{opacity:.9}.computer-use-tool-name[_ngcontent-%COMP%]{font-size:12px;font-family:monospace;font-weight:600;color:var(--chat-panel-input-field-textarea-color);opacity:.9;padding:12px}.computer-use-tool-name[_ngcontent-%COMP%] .actual-pixels[_ngcontent-%COMP%]{opacity:.6;margin-left:8px;font-weight:400}.computer-use-screenshot[_ngcontent-%COMP%]{width:100%;height:auto;display:block;border-bottom:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color)}.computer-use-footprint[_ngcontent-%COMP%]{display:flex;align-items:center;padding:8px 12px;gap:8px}.computer-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0}.url-text[_ngcontent-%COMP%]{font-size:11px;font-family:monospace;white-space:normal;word-break:break-all;color:var(--chat-panel-input-field-textarea-color);opacity:.8;min-width:0}.image-wrapper[_ngcontent-%COMP%]{position:relative;width:100%}.images-wrapper-flex[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:580px;gap:12px}.images-wrapper-flex[_ngcontent-%COMP%] .image-wrapper[_ngcontent-%COMP%]{flex:1;min-width:0}.images-wrapper-flex[_ngcontent-%COMP%] .image-wrapper[_ngcontent-%COMP%] .computer-use-screenshot[_ngcontent-%COMP%]{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;border-radius:8px}.arrow-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--chat-panel-input-field-textarea-color);opacity:.8;gap:4px}.arrow-container[_ngcontent-%COMP%] .action-name-above[_ngcontent-%COMP%]{font-size:11px;font-family:monospace;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:80px}.arrow-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:32px;width:32px;height:32px}.fallback-image[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high, #e0e0e0);width:240px;height:120px;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--chat-panel-input-field-textarea-color);opacity:.7}.fallback-image[_ngcontent-%COMP%] .missing-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px}.fallback-image[_ngcontent-%COMP%] .fallback-text[_ngcontent-%COMP%]{font-size:14px;font-weight:500}.click-overlay-box[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;border:1px solid rgba(255,255,255,.8);border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 4px #00000080;pointer-events:none;display:flex;align-items:center;justify-content:center}.click-overlay-box[_ngcontent-%COMP%]:before{content:"";width:2px;height:2px;border-radius:50%;box-shadow:0 0 2px #fff}.click-overlay-box[_ngcontent-%COMP%]:after{content:"";position:absolute;width:100%;height:100%;border-radius:50%}']})};function CwA(i,e){if(i&1&&(I(0,"mat-icon"),D(1),h()),i&2){let A=p();Q(),nA(A.icon)}}var sy=class i{icon="";text="";tooltipContent=null;tooltipTitle="";disabled=!1;buttonClick=new FA;handleClick(e){this.buttonClick.emit(e)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-hover-info-button"]],inputs:{icon:"icon",text:"text",tooltipContent:"tooltipContent",tooltipTitle:"tooltipTitle",disabled:"disabled"},outputs:{buttonClick:"buttonClick"},decls:3,vars:7,consts:[["mat-stroked-button","",1,"hover-info-button",3,"click","appJsonTooltip","appJsonTooltipTitle","disabled"]],template:function(A,t){A&1&&(I(0,"button",0),U("click",function(o){return t.handleClick(o)}),T(1,CwA,2,1,"mat-icon"),D(2),h()),A&2&&(_A("icon-only",!t.text),H("appJsonTooltip",t.tooltipContent)("appJsonTooltipTitle",t.tooltipTitle)("disabled",t.disabled),Q(),O(t.icon?1:-1),Q(),Ee(" ",t.text,` -`))},dependencies:[li,qi,ki,Un,zt,E1],styles:[`.hover-info-button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)!important;background-color:var(--mat-sys-surface-container-high)!important;border-color:transparent!important;margin:5px 5px 5px 0;font-size:11px!important;padding:6px 12px!important;min-height:24px!important;height:24px!important;border-radius:8px!important;font-family:Roboto Mono,monospace!important;max-width:300px;text-align:left;display:inline-flex;align-items:center}.hover-info-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px!important;width:18px!important;height:18px!important;margin-right:6px!important;color:var(--mat-sys-on-surface)!important}.hover-info-button.icon-only[_ngcontent-%COMP%]{padding:0!important;min-width:24px!important;width:24px!important;justify-content:center}.hover-info-button.icon-only[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:-8px!important}.hover-info-button.icon-only[_ngcontent-%COMP%] .mdc-button__label[_ngcontent-%COMP%]{display:none!important}[_nghost-%COMP%] .hover-info-button{background-color:var(--mat-sys-surface-container-high)!important;color:var(--mat-sys-on-surface)!important}[_nghost-%COMP%] .hover-info-button .mdc-button__label{overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important} - - - - - - - - - - - - - - - - -`]})};var PX=(i,e)=>e.key;function dwA(i,e){if(i&1){let A=aA();I(0,"div",7)(1,"div",11),U("click",function(){L(A);let n=p(3);return G(n.setActiveTab("form"))}),D(2,"Form"),h(),I(3,"div",11),U("click",function(){L(A);let n=p(3);return G(n.setActiveTab("json"))}),D(4,"JSON"),h(),I(5,"div",11),U("click",function(){L(A);let n=p(3);return G(n.setActiveTab("payload"))}),D(6,"Payload"),h(),I(7,"div",11),U("click",function(){L(A);let n=p(3);return G(n.setActiveTab("response schema"))}),D(8,"Schema"),h()()}if(i&2){let A=p(3);Q(),_A("active",A.activeTab==="form"),Q(2),_A("active",A.activeTab==="json"),Q(2),_A("active",A.activeTab==="payload"),Q(2),_A("active",A.activeTab==="response schema")}}function IwA(i,e){if(i&1){let A=aA();I(0,"div",9)(1,"div",12),D(2),h(),I(3,"div",13)(4,"div",14),D(5,"Payload"),h(),lA(6,"app-custom-json-viewer",15),h(),I(7,"div",16)(8,"div",17)(9,"label",18)(10,"input",19),Ni("ngModelChange",function(n){L(A);let o=p(3);return wi(o.confirmationModel.confirmed,n)||(o.confirmationModel.confirmed=n),G(n)}),h(),I(11,"span"),D(12,"Confirmed"),h()()(),I(13,"button",20),U("click",function(){L(A);let n=p(3);return G(n.onSend())}),D(14," Submit "),h()()()}if(i&2){let A=p(3);Q(2),Ee(" ",A.functionCall.args==null||A.functionCall.args.toolConfirmation==null?null:A.functionCall.args.toolConfirmation.hint," "),Q(4),H("json",A.functionCall.args==null||A.functionCall.args.originalFunctionCall==null?null:A.functionCall.args.originalFunctionCall.args),Q(4),H("id",ZE("confirmed-checkbox-",A.functionCall.id)),Ri("ngModel",A.confirmationModel.confirmed)}}function BwA(i,e){i&1&&D(0," *")}function hwA(i,e){if(i&1&&(I(0,"div",28),D(1),h()),i&2){let A=p(2).$implicit;Q(),nA(A.description)}}function EwA(i,e){if(i&1){let A=aA();I(0,"input",27),Ni("ngModelChange",function(n){L(A);let o=p().$implicit,a=p(5);return wi(a.formModel[o.key],n)||(a.formModel[o.key]=n),G(n)}),h(),T(1,hwA,2,1,"div",28)}if(i&2){let A=p().$implicit,t=p(5);H("id",A.key),Ri("ngModel",t.formModel[A.key]),Q(),O(A.description?1:-1)}}function QwA(i,e){if(i&1){let A=aA();I(0,"input",31),Ni("ngModelChange",function(n){L(A);let o=p(2).$implicit,a=p(5);return wi(a.formModel[o.key],n)||(a.formModel[o.key]=n),G(n)}),h()}if(i&2){let A=p(2).$implicit,t=p(5);H("id",A.key),Ri("ngModel",t.formModel[A.key])}}function uwA(i,e){if(i&1){let A=aA();I(0,"input",32),Ni("ngModelChange",function(n){L(A);let o=p(2).$implicit,a=p(5);return wi(a.formModel[o.key],n)||(a.formModel[o.key]=n),G(n)}),h()}if(i&2){let A=p(2).$implicit,t=p(5);H("id",A.key),Ri("ngModel",t.formModel[A.key])}}function pwA(i,e){if(i&1&&(I(0,"div",28),D(1),h()),i&2){let A=p(2).$implicit;Q(),nA(A.description)}}function fwA(i,e){if(i&1&&(T(0,QwA,1,2,"input",29)(1,uwA,1,2,"input",30),T(2,pwA,2,1,"div",28)),i&2){let A=p().$implicit;O(A.type==="number"||A.type==="integer"?0:1),Q(2),O(A.description?2:-1)}}function mwA(i,e){if(i&1&&(I(0,"div",25),D(1),T(2,BwA,1,0),h(),I(3,"div",26),T(4,EwA,2,3)(5,fwA,3,2),h()),i&2){let A=e.$implicit;Q(),Ee(" ",A.title),Q(),O(A.required?2:-1),Q(2),O(A.type==="boolean"?4:5)}}function wwA(i,e){if(i&1){let A=aA();I(0,"div",21),ke(1,mwA,6,3,null,null,PX),I(3,"div",23)(4,"button",24),U("click",function(){L(A);let n=p(4);return G(n.onSend())}),D(5," Submit "),h()()()}if(i&2){let A=p(4);Q(),_e(A.formFields)}}function ywA(i,e){if(i&1){let A=aA();I(0,"div",22)(1,"textarea",33),Ni("ngModelChange",function(n){L(A);let o=p(4);return wi(o.formModelJson,n)||(o.formModelJson=n),G(n)}),U("ngModelChange",function(n){L(A);let o=p(4);return G(o.onJsonInputChange(n))}),h()(),I(2,"div",23)(3,"button",24),U("click",function(){L(A);let n=p(4);return G(n.onSend())}),D(4," Submit "),h()()}if(i&2){let A=p(4);Q(),Ri("ngModel",A.formModelJson)}}function DwA(i,e){if(i&1&&(I(0,"div",22)(1,"pre"),D(2),h()()),i&2){let A=p(4);Q(2),nA(A.getPayloadJson())}}function vwA(i,e){if(i&1&&(I(0,"div",22)(1,"pre"),D(2),h()()),i&2){let A=p(4);Q(2),nA(A.getResponseSchemaJson())}}function bwA(i,e){if(i&1&&(I(0,"div",10),T(1,wwA,6,0,"div",21)(2,ywA,5,1)(3,DwA,3,1,"div",22)(4,vwA,3,1,"div",22),h()),i&2){let A=p(3);Q(),O(A.activeTab==="form"?1:A.activeTab==="json"?2:A.activeTab==="payload"?3:A.activeTab==="response schema"?4:-1)}}function MwA(i,e){if(i&1){let A=aA();I(0,"input",34),Ni("ngModelChange",function(n){L(A);let o=p(3);return wi(o.functionCall.userResponse,n)||(o.functionCall.userResponse=n),G(n)}),U("keydown.enter",function(){L(A);let n=p(3);return G(n.onSend())}),h(),I(1,"button",35),U("click",function(){L(A);let n=p(3);return G(n.onSend())}),I(2,"mat-icon"),D(3,"send"),h()()}if(i&2){let A=p(3);Ri("ngModel",A.functionCall.userResponse),Q(),H("disabled",!A.functionCall.userResponse)}}function SwA(i,e){if(i&1&&(I(0,"div",2)(1,"div",4),lA(2,"app-markdown",5),h(),I(3,"div",6),T(4,dwA,9,8,"div",7),I(5,"div",8),T(6,IwA,15,5,"div",9)(7,bwA,5,1,"div",10)(8,MwA,4,2),h()()()),i&2){let A=p(2);Q(2),H("text",A.getPromptText()),Q(2),O(A.formFields.length>0?4:-1),Q(2),O(A.isConfirmationRequest?6:A.formFields.length>0?7:8)}}function kwA(i,e){if(i&1){let A=aA();I(0,"div",7)(1,"div",11),U("click",function(){L(A);let n=p(3);return G(n.setActiveTab("form"))}),D(2,"Form"),h(),I(3,"div",11),U("click",function(){L(A);let n=p(3);return G(n.setActiveTab("json"))}),D(4,"JSON"),h(),I(5,"div",11),U("click",function(){L(A);let n=p(3);return G(n.setActiveTab("payload"))}),D(6,"Payload"),h(),I(7,"div",11),U("click",function(){L(A);let n=p(3);return G(n.setActiveTab("response schema"))}),D(8,"Schema"),h()()}if(i&2){let A=p(3);Q(),_A("active",A.activeTab==="form"),Q(2),_A("active",A.activeTab==="json"),Q(2),_A("active",A.activeTab==="payload"),Q(2),_A("active",A.activeTab==="response schema")}}function _wA(i,e){if(i&1){let A=aA();I(0,"div",9)(1,"div",12),D(2),h(),I(3,"div",13)(4,"div",14),D(5,"Payload"),h(),lA(6,"app-custom-json-viewer",15),h(),I(7,"div",16)(8,"div",17)(9,"label",18)(10,"input",19),Ni("ngModelChange",function(n){L(A);let o=p(3);return wi(o.confirmationModel.confirmed,n)||(o.confirmationModel.confirmed=n),G(n)}),h(),I(11,"span"),D(12,"Confirmed"),h()()(),I(13,"button",20),U("click",function(){L(A);let n=p(3);return G(n.onSend())}),D(14," Submit "),h()()()}if(i&2){let A=p(3);Q(2),Ee(" ",A.functionCall.args==null||A.functionCall.args.toolConfirmation==null?null:A.functionCall.args.toolConfirmation.hint," "),Q(4),H("json",A.functionCall.args==null||A.functionCall.args.originalFunctionCall==null?null:A.functionCall.args.originalFunctionCall.args),Q(4),H("id",ZE("confirmed-checkbox-standalone-",A.functionCall.id)),Ri("ngModel",A.confirmationModel.confirmed)}}function xwA(i,e){i&1&&D(0," *")}function RwA(i,e){if(i&1&&(I(0,"div",28),D(1),h()),i&2){let A=p(2).$implicit;Q(),nA(A.description)}}function NwA(i,e){if(i&1){let A=aA();I(0,"input",27),Ni("ngModelChange",function(n){L(A);let o=p().$implicit,a=p(5);return wi(a.formModel[o.key],n)||(a.formModel[o.key]=n),G(n)}),h(),T(1,RwA,2,1,"div",28)}if(i&2){let A=p().$implicit,t=p(5);H("id",A.key),Ri("ngModel",t.formModel[A.key]),Q(),O(A.description?1:-1)}}function FwA(i,e){if(i&1){let A=aA();I(0,"input",31),Ni("ngModelChange",function(n){L(A);let o=p(2).$implicit,a=p(5);return wi(a.formModel[o.key],n)||(a.formModel[o.key]=n),G(n)}),h()}if(i&2){let A=p(2).$implicit,t=p(5);H("id",A.key),Ri("ngModel",t.formModel[A.key])}}function LwA(i,e){if(i&1){let A=aA();I(0,"input",32),Ni("ngModelChange",function(n){L(A);let o=p(2).$implicit,a=p(5);return wi(a.formModel[o.key],n)||(a.formModel[o.key]=n),G(n)}),h()}if(i&2){let A=p(2).$implicit,t=p(5);H("id",A.key),Ri("ngModel",t.formModel[A.key])}}function GwA(i,e){if(i&1&&(I(0,"div",28),D(1),h()),i&2){let A=p(2).$implicit;Q(),nA(A.description)}}function KwA(i,e){if(i&1&&(T(0,FwA,1,2,"input",29)(1,LwA,1,2,"input",30),T(2,GwA,2,1,"div",28)),i&2){let A=p().$implicit;O(A.type==="number"||A.type==="integer"?0:1),Q(2),O(A.description?2:-1)}}function UwA(i,e){if(i&1&&(I(0,"div",25),D(1),T(2,xwA,1,0),h(),I(3,"div",26),T(4,NwA,2,3)(5,KwA,3,2),h()),i&2){let A=e.$implicit;Q(),Ee(" ",A.title),Q(),O(A.required?2:-1),Q(2),O(A.type==="boolean"?4:5)}}function TwA(i,e){if(i&1){let A=aA();I(0,"div",21),ke(1,UwA,6,3,null,null,PX),I(3,"div",23)(4,"button",24),U("click",function(){L(A);let n=p(4);return G(n.onSend())}),D(5," Submit "),h()()()}if(i&2){let A=p(4);Q(),_e(A.formFields)}}function OwA(i,e){if(i&1){let A=aA();I(0,"div",22)(1,"textarea",33),Ni("ngModelChange",function(n){L(A);let o=p(4);return wi(o.formModelJson,n)||(o.formModelJson=n),G(n)}),U("ngModelChange",function(n){L(A);let o=p(4);return G(o.onJsonInputChange(n))}),h()(),I(2,"div",23)(3,"button",24),U("click",function(){L(A);let n=p(4);return G(n.onSend())}),D(4," Submit "),h()()}if(i&2){let A=p(4);Q(),Ri("ngModel",A.formModelJson)}}function JwA(i,e){if(i&1&&(I(0,"div",22)(1,"pre"),D(2),h()()),i&2){let A=p(4);Q(2),nA(A.getPayloadJson())}}function YwA(i,e){if(i&1&&(I(0,"div",22)(1,"pre"),D(2),h()()),i&2){let A=p(4);Q(2),nA(A.getResponseSchemaJson())}}function HwA(i,e){if(i&1&&(I(0,"div",10),T(1,TwA,6,0,"div",21)(2,OwA,5,1)(3,JwA,3,1,"div",22)(4,YwA,3,1,"div",22),h()),i&2){let A=p(3);Q(),O(A.activeTab==="form"?1:A.activeTab==="json"?2:A.activeTab==="payload"?3:A.activeTab==="response schema"?4:-1)}}function zwA(i,e){if(i&1){let A=aA();I(0,"input",34),Ni("ngModelChange",function(n){L(A);let o=p(3);return wi(o.functionCall.userResponse,n)||(o.functionCall.userResponse=n),G(n)}),U("keydown.enter",function(){L(A);let n=p(3);return G(n.onSend())}),h(),I(1,"button",35),U("click",function(){L(A);let n=p(3);return G(n.onSend())}),I(2,"mat-icon"),D(3,"send"),h()()}if(i&2){let A=p(3);Ri("ngModel",A.functionCall.userResponse),Q(),H("disabled",!A.functionCall.userResponse)}}function PwA(i,e){if(i&1&&(I(0,"div",3),T(1,kwA,9,8,"div",7),I(2,"div",8),T(3,_wA,15,5,"div",9)(4,HwA,5,1,"div",10)(5,zwA,4,2),h()()),i&2){let A=p(2);Q(),O(A.formFields.length>0?1:-1),Q(2),O(A.isConfirmationRequest?3:A.formFields.length>0?4:5)}}function jwA(i,e){if(i&1&&(I(0,"div",1),U("click",function(t){return t.stopPropagation()}),T(1,SwA,9,3,"div",2)(2,PwA,6,2,"div",3),h()),i&2){let A=p();Q(),O(A.hasMessage()?1:2)}}var ly=class i{functionCall;appName;userId;sessionId;responseComplete=new FA;formModel={};formFields=[];activeTab="form";formModelJson="";confirmationModel={confirmed:!1,payload:""};get isConfirmationRequest(){return this.functionCall?.name==="adk_request_confirmation"}cdr=w(Mt);ngOnChanges(e){e.functionCall&&this.initForm()}initForm(){if(this.formModel={},this.formFields=[],this.isConfirmationRequest){this.confirmationModel.confirmed=this.functionCall.args?.toolConfirmation?.confirmed||!1,this.confirmationModel.payload=JSON.stringify(this.functionCall.args?.originalFunctionCall?.args||{},null,2);return}let e=this.functionCall?.args?.response_schema;if(e&&e.type==="object"&&e.properties)for(let A of Object.keys(e.properties)){let t=e.properties[A],n=t.type;if(!n&&t.anyOf){let o=t.anyOf.find(a=>a.type!=="null");o&&(n=o.type)}this.formFields.push({key:A,type:n,title:t.title||A,description:t.description||"",required:e.required?.includes(A)||!1}),n==="boolean"?this.formModel[A]=!1:n==="number"||n==="integer"?this.formModel[A]=null:this.formModel[A]=""}}getCleanedFormModel(){let e=this.functionCall?.args?.response_schema;if(!e||e.type!=="object"||!e.properties)return this.formModel;let A=P({},this.formModel);for(let t of Object.keys(e.properties)){let n=e.properties[t],o=A[t];if(o!=null&&o!==""){let a=n.type;if(!a&&n.anyOf){let r=n.anyOf.find(s=>s.type!=="null");r&&(a=r.type)}a==="integer"?A[t]=parseInt(o,10):a==="number"&&(A[t]=parseFloat(o))}else A[t]=null}return A}updateFormModelJson(){this.formModelJson=JSON.stringify(this.getCleanedFormModel(),null,2)}onJsonInputChange(e){try{let A=JSON.parse(e);this.formModel=A}catch(A){}}setActiveTab(e){this.activeTab=e,e==="json"&&this.updateFormModelJson()}hasMessage(){return!!(this.functionCall.args?.prompt||this.functionCall.args?.message)}getPromptText(){return this.functionCall.args?.prompt||this.functionCall.args?.message||"Please provide your response"}hasPayload(){return this.functionCall.args?.payload!==void 0&&this.functionCall.args?.payload!==null}getPayloadJson(){try{return JSON.stringify(this.functionCall.args?.payload||{},null,2)}catch(e){return""}}hasResponseSchema(){return!!this.functionCall.args?.response_schema}getResponseSchemaJson(){try{return JSON.stringify(this.functionCall.args?.response_schema||{},null,2)}catch(e){return""}}onSend(){if(this.isConfirmationRequest){let o={};try{o=JSON.parse(this.confirmationModel.payload)}catch(s){o=this.functionCall.args?.originalFunctionCall?.args||{}}let a={confirmed:this.confirmationModel.confirmed,payload:o};this.functionCall.responseStatus="sent",this.cdr.detectChanges();let r={role:"user",parts:[{functionResponse:{id:this.functionCall.id,name:this.functionCall.name,response:a}}],functionCallEventId:this.functionCall.functionCallEventId};this.responseComplete.emit(r);return}let e,A=this.functionCall?.args?.response_schema;if(A&&A.type==="object"&&A.properties&&this.formFields.length>0){let o=this.getCleanedFormModel();e=o,this.functionCall.userResponse=JSON.stringify(o),this.functionCall.sentUserResponse=this.functionCall.userResponse}else{if(!this.functionCall.userResponse||!this.functionCall.userResponse.trim())return;this.functionCall.sentUserResponse=this.functionCall.userResponse;try{let o=JSON.parse(this.functionCall.userResponse);typeof o=="object"&&o!==null?e=o:e={result:this.functionCall.userResponse}}catch(o){e={result:this.functionCall.userResponse}}}this.functionCall.responseStatus="sent",this.cdr.detectChanges();let n={role:"user",parts:[{functionResponse:{id:this.functionCall.id,name:this.functionCall.name,response:e}}],functionCallEventId:this.functionCall.functionCallEventId};this.responseComplete.emit(n)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-long-running-response"]],inputs:{functionCall:"functionCall",appName:"appName",userId:"userId",sessionId:"sessionId"},outputs:{responseComplete:"responseComplete"},features:[ii],decls:1,vars:1,consts:[[1,"response-chip-container"],[1,"response-chip-container",3,"click"],[1,"message-box"],[1,"request-card-standalone"],[1,"message-content"],[3,"text"],[1,"request-card"],[1,"tabs-header"],[1,"input-container"],[1,"confirmation-container",2,"width","100%"],[1,"tabs-content"],[1,"tab-link",3,"click"],[1,"confirmation-hint",2,"margin-bottom","10px","font-size","13px","font-weight","600","color","var(--mat-sys-on-surface)"],[1,"confirmation-payload",2,"margin-bottom","10px"],[1,"field-label",2,"margin-bottom","5px","font-size","12px","font-weight","500","color","var(--mat-sys-on-surface-variant)"],[3,"json"],[1,"confirmation-footer",2,"display","flex","justify-content","space-between","align-items","center","margin-top","10px"],[1,"confirmation-checkbox",2,"font-size","12px"],[2,"display","flex","align-items","center","gap","6px","cursor","pointer"],["type","checkbox",2,"cursor","pointer",3,"ngModelChange","id","ngModel"],["mat-raised-button","","color","primary",1,"form-submit-button",2,"margin-top","0",3,"click"],[1,"schema-form","grid-layout"],[1,"json-view"],[1,"grid-submit"],["mat-raised-button","","color","primary",1,"form-submit-button",3,"click"],[1,"grid-label"],[1,"grid-value"],["type","checkbox",3,"ngModelChange","id","ngModel"],[1,"field-description"],["type","number",1,"form-input",3,"id","ngModel"],["type","text",1,"form-input",3,"id","ngModel"],["type","number",1,"form-input",3,"ngModelChange","id","ngModel"],["type","text",1,"form-input",3,"ngModelChange","id","ngModel"],[1,"json-textarea",3,"ngModelChange","ngModel"],["placeholder","Enter your response...",1,"response-input",3,"ngModelChange","keydown.enter","ngModel"],["mat-icon-button","",1,"send-button",3,"click","disabled"]],template:function(A,t){A&1&&T(0,jwA,3,1,"div",0),A&2&&O(t.functionCall.responseStatus!=="sent"&&t.functionCall.responseStatus!=="sending"?0:-1)},dependencies:[fn,Gn,gQ,ev,Kn,Ho,yi,ki,zt,B1,fl],styles:["[_nghost-%COMP%]{display:block}.response-chip-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;margin:5px 5px 5px 0}.message-box[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high);border:1px solid var(--mat-sys-outline-variant);border-radius:20px;padding:12px 16px;box-shadow:none;display:flex;flex-direction:column;gap:12px}.message-content[_ngcontent-%COMP%]{flex:1;font-size:12px}.request-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;width:100%}.request-card-standalone[_ngcontent-%COMP%]{background:color-mix(in srgb,var(--mat-sys-surface-container-high) 70%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid color-mix(in srgb,var(--mat-sys-outline-variant) 30%,transparent);border-radius:12px;padding:12px;box-shadow:0 4px 16px #0003;display:flex;flex-direction:column;gap:8px;max-width:400px}.data-buttons[_ngcontent-%COMP%]{display:flex;gap:8px}.input-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;width:100%}.input-container[_ngcontent-%COMP%] .response-input[_ngcontent-%COMP%]{flex:1;border:1px solid var(--mat-sys-outline-variant);border-radius:4px;padding:4px 8px;background:var(--mat-sys-surface-container);outline:none;font-size:12px;font-family:inherit;color:var(--mat-sys-on-surface);caret-color:var(--mat-sys-primary)}.input-container[_ngcontent-%COMP%] .response-input[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant);opacity:.6}.input-container[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%]{color:var(--mat-sys-primary);width:24px;height:24px;min-width:24px;padding:0;line-height:24px;box-sizing:border-box}.input-container[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-on-surface-variant);opacity:.3}.input-container[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}.tabs-header[_ngcontent-%COMP%]{display:flex;gap:8px;border-bottom:1px solid var(--mat-sys-outline-variant);margin-bottom:8px;padding-bottom:4px}.tab-link[_ngcontent-%COMP%]{font-size:11px;font-weight:500;color:var(--mat-sys-on-surface-variant);cursor:pointer;padding:2px 6px;border-radius:4px}.tab-link[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-high)}.tab-link.active[_ngcontent-%COMP%]{color:var(--mat-sys-primary);background:var(--mat-sys-primary-container)}.tabs-content[_ngcontent-%COMP%]{width:100%}.json-view[_ngcontent-%COMP%]{padding:4px 0;max-height:200px;overflow:auto}.json-view[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{margin:0;font-size:10px;font-family:monospace;color:var(--mat-sys-on-surface)}.json-view[_ngcontent-%COMP%] .json-textarea[_ngcontent-%COMP%]{width:100%;height:150px;margin:0;font-size:10px;font-family:monospace;color:var(--mat-sys-on-surface);background:transparent;border:1px solid var(--mat-sys-outline-variant);border-radius:4px;padding:4px;resize:vertical;box-sizing:border-box}.json-view[_ngcontent-%COMP%] .json-textarea[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--mat-sys-primary)}.schema-form.grid-layout[_ngcontent-%COMP%]{display:grid;grid-template-columns:max-content 1fr;gap:4px 8px;align-items:start;width:100%;padding:4px 2px}.grid-label[_ngcontent-%COMP%]{font-size:11px;font-weight:500;color:var(--mat-sys-on-surface);text-align:right;white-space:nowrap;padding-top:6px}.grid-value[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px;width:100%}.grid-value[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%]{width:100%;border:1px solid var(--mat-sys-outline-variant);border-radius:4px;padding:4px 6px;font-size:11px;background:var(--mat-sys-surface-container);color:var(--mat-sys-on-surface);box-sizing:border-box;height:28px}.grid-value[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--mat-sys-primary)}.grid-value[_ngcontent-%COMP%] input[type=checkbox][_ngcontent-%COMP%]{margin:4px 0;align-self:flex-start}.field-description[_ngcontent-%COMP%]{font-size:10px;color:var(--mat-sys-on-surface-variant);opacity:.8}.grid-submit[_ngcontent-%COMP%]{grid-column:1/-1;display:flex;justify-content:flex-end;margin-top:4px}.form-submit-button[_ngcontent-%COMP%]{align-self:flex-end;margin-top:2px;height:28px!important;line-height:28px!important;font-size:11px!important}"]})};function VwA(i,e){if(i&1&&lA(0,"a2ui-surface",0),i&2){let A=p();H("surfaceId",A.surfaceId())("surface",A.surface())}}var gy=class i{processor=w(ZN);beginRendering=null;surfaceUpdate=null;dataModelUpdate=null;surfaceId=mA(null);activeSurface=mA(null);surface=ye(()=>this.activeSurface());constructor(){}ngOnChanges(e){let A=[],t=null;e.beginRendering&&this.beginRendering&&Object.keys(this.beginRendering).length>0&&(A.push(this.beginRendering),t=this.beginRendering?.beginRendering?.surfaceId??t),e.surfaceUpdate&&this.surfaceUpdate&&Object.keys(this.surfaceUpdate).length>0&&(A.push(this.surfaceUpdate),t=this.surfaceUpdate?.surfaceUpdate?.surfaceId??t),e.dataModelUpdate&&this.dataModelUpdate&&Object.keys(this.dataModelUpdate).length>0&&(A.push(this.dataModelUpdate),t=this.dataModelUpdate?.dataModelUpdate?.surfaceId??t),A.length>0&&this.processor.processMessages(A),t&&this.surfaceId.set(t);let n=this.surfaceId();if(n){let o=this.processor.getSurfaces();o.has(n)&&this.activeSurface.set(o.get(n))}}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-a2ui-canvas"]],inputs:{beginRendering:"beginRendering",surfaceUpdate:"surfaceUpdate",dataModelUpdate:"dataModelUpdate"},features:[ii],decls:1,vars:1,consts:[[3,"surfaceId","surface"]],template:function(A,t){A&1&&T(0,VwA,1,2,"a2ui-surface",0),A&2&&O(t.surface()?0:-1)},dependencies:[li,AF],styles:["[_nghost-%COMP%]{display:block;height:100%;width:100%;overflow:auto}[_nghost-%COMP%] *{box-sizing:border-box}.canvas[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;padding:16px;box-sizing:border-box;min-height:100%}"],changeDetection:0})};var Cy=(i,e)=>({text:i,thought:e});function qwA(i,e){if(i&1&&(I(0,"div",1),D(1),h()),i&2){let A=p();Q(),nA(A.type)}}function WwA(i,e){if(i&1&&lA(0,"img",8),i&2){let A=p().$implicit;H("src",A.url,mo)}}function ZwA(i,e){if(i&1&&(I(0,"a",9),D(1),h()),i&2){let A=p(2).$implicit;H("href",A.url,mo),Q(),nA(A.file.name)}}function XwA(i,e){if(i&1&&D(0),i&2){let A=p(2).$implicit;Ee(" ",A.file.name," ")}}function $wA(i,e){if(i&1&&(I(0,"mat-icon"),D(1,"insert_drive_file"),h(),T(2,ZwA,2,2,"a",9)(3,XwA,1,1)),i&2){let A=p().$implicit;Q(2),O(A.url?2:3)}}function A5A(i,e){if(i&1&&(I(0,"div",7),T(1,WwA,1,1,"img",8),T(2,$wA,4,1),h()),i&2){let A=e.$implicit;Q(),O(A.file.type.startsWith("image/")?1:-1),Q(),O(A.file.type.startsWith("image/")?-1:2)}}function e5A(i,e){if(i&1&&(I(0,"div",4),ke(1,A5A,3,2,"div",7,ni),h()),i&2){let A=p(2);Q(),_e(A.uiEvent.attachments)}}function t5A(i,e){i&1&&(I(0,"div",1),D(1,"thought"),h())}function i5A(i,e){if(i&1&&(I(0,"div"),T(1,t5A,2,0,"div",1),dn(2,10),h()),i&2){let A=e.$implicit,t=e.$index,n=p(4);_A("thought-container",A.thought&&n.type!=="thought")("not-first-part",t!==0),Q(),O(A.thought&&n.type!=="thought"?1:-1),Q(),H("ngComponentOutlet",n.markdownComponent)("ngComponentOutletInputs",L0(7,Cy,A.text,A.thought))}}function n5A(i,e){if(i&1&&ke(0,i5A,3,10,"div",11,ni),i&2){let A=p(3);_e(A.uiEvent.textParts)}}function o5A(i,e){if(i&1&&dn(0,10),i&2){let A=p(3);H("ngComponentOutlet",A.markdownComponent)("ngComponentOutletInputs",L0(2,Cy,A.uiEvent.text||A.rawMessageText,A.uiEvent.thought))}}function a5A(i,e){if(i&1&&(I(0,"div",5),T(1,n5A,2,0)(2,o5A,1,5,"ng-container",10),h()),i&2){let A=p(2);H("appJsonTooltip",A.jsonOutputData),Q(),O(A.uiEvent.textParts&&A.uiEvent.textParts.length>0?1:2)}}function r5A(i,e){if(i&1){let A=aA();I(0,"div",13)(1,"textarea",14,0),U("ngModelChange",function(n){L(A);let o=p(4);return G(o.userEditEvalCaseMessageChange.emit(n))})("keydown",function(n){L(A);let o=p(4);return G(o.handleKeydown.emit({event:n,message:o.uiEvent}))}),h(),I(3,"div",15)(4,"span",16),U("click",function(){L(A);let n=p(4);return G(n.cancelEditMessage.emit(n.uiEvent))}),D(5," close "),h(),I(6,"span",17),U("click",function(){L(A);let n=p(4);return G(n.saveEditMessage.emit(n.uiEvent))}),D(7," check "),h()()()}if(i&2){let A=p(4);Q(),H("ngModel",A.userEditEvalCaseMessage),Q(3),H("matTooltip",A.i18n.cancelEditingTooltip),Q(2),H("matTooltip",A.i18n.saveEvalMessageTooltip)}}function s5A(i,e){i&1&&(I(0,"div",1),D(1,"thought"),h())}function l5A(i,e){if(i&1&&(I(0,"div"),T(1,s5A,2,0,"div",1),dn(2,10),h()),i&2){let A=e.$implicit,t=e.$index,n=p(6);_A("thought-container",A.thought&&n.type!=="thought")("not-first-part",t!==0),Q(),O(A.thought&&n.type!=="thought"?1:-1),Q(),H("ngComponentOutlet",n.markdownComponent)("ngComponentOutletInputs",L0(7,Cy,A.text,A.thought))}}function g5A(i,e){if(i&1&&ke(0,l5A,3,10,"div",11,ni),i&2){let A=p(5);_e(A.uiEvent.textParts)}}function c5A(i,e){if(i&1&&dn(0,10),i&2){let A=p(5);H("ngComponentOutlet",A.markdownComponent)("ngComponentOutletInputs",L0(2,Cy,A.uiEvent.text,A.uiEvent.thought))}}function C5A(i,e){if(i&1&&T(0,g5A,2,0)(1,c5A,1,5,"ng-container",10),i&2){let A=p(4);O(A.uiEvent.textParts&&A.uiEvent.textParts.length>0?0:1)}}function d5A(i,e){if(i&1&&T(0,r5A,8,3,"div",13)(1,C5A,2,1),i&2){let A=p(3);O(A.uiEvent.isEditing?0:1)}}function I5A(i,e){if(i&1&&(I(0,"div"),lA(1,"div",18),h()),i&2){let A=p(3);Q(),H("innerHTML",A.renderGooglerSearch(A.uiEvent.renderedContent),Fc)}}function B5A(i,e){if(i&1&&lA(0,"app-a2ui-canvas",12),i&2){let A=p(3);H("beginRendering",A.uiEvent.a2uiData.beginRendering)("surfaceUpdate",A.uiEvent.a2uiData.surfaceUpdate)("dataModelUpdate",A.uiEvent.a2uiData.dataModelUpdate)}}function h5A(i,e){if(i&1&&(I(0,"div")(1,"div"),T(2,d5A,2,1),h(),T(3,I5A,2,1,"div"),T(4,B5A,1,3,"app-a2ui-canvas",12),h()),i&2){let A=p(2);Q(2),O(A.uiEvent.text?2:-1),Q(),O(A.uiEvent.renderedContent?3:-1),Q(),O(A.uiEvent.a2uiData?4:-1)}}function E5A(i,e){if(i&1&&(I(0,"code"),D(1),h()),i&2){let A=p(2);Q(),Ee(" ",A.uiEvent.executableCode.code," ")}}function Q5A(i,e){if(i&1&&(I(0,"div")(1,"div"),D(2),h(),I(3,"div"),D(4),h()()),i&2){let A=p(2);Q(2),Ya("",A.i18n.outcomeLabel,": ",A.uiEvent.codeExecutionResult.outcome),Q(2),Ya("",A.i18n.outputLabel,": ",A.uiEvent.codeExecutionResult.output)}}function u5A(i,e){if(i&1){let A=aA();I(0,"div",19)(1,"img",21),U("click",function(){L(A);let n=p(4);return G(n.openViewImageDialog.emit(n.uiEvent.inlineData.data))}),h()()}if(i&2){let A=p(4);Q(),H("src",A.uiEvent.inlineData.data,mo)}}function p5A(i,e){if(i&1&&(I(0,"div"),lA(1,"app-audio-player",22),h()),i&2){let A=p(4);Q(),H("base64data",A.uiEvent.inlineData.data)}}function f5A(i,e){if(i&1&&(I(0,"div",20),lA(1,"video",23),h()),i&2){let A=p(4);Q(),H("src",A.uiEvent.inlineData.data,mo)}}function m5A(i,e){if(i&1){let A=aA();I(0,"div")(1,"div",25)(2,"mat-icon",26),D(3,"description"),h(),I(4,"a",27),U("click",function(){L(A);let n=p(5);return G(n.openBase64InNewTab.emit({data:n.uiEvent.inlineData.data,mimeType:n.uiEvent.inlineData.mimeType}))}),D(5),h()()()}if(i&2){let A=p(5);Q(5),Ee(" ",A.uiEvent.inlineData.name," ")}}function w5A(i,e){if(i&1&&(I(0,"div",24)(1,"pre",28),D(2),h()()),i&2){let A=p(5);Q(2),nA(A.getTextContent(A.uiEvent.inlineData.data))}}function y5A(i,e){if(i&1&&T(0,m5A,6,1,"div")(1,w5A,3,1,"div",24),i&2){let A=p(4);O(A.uiEvent.inlineData.mimeType==="text/html"?0:1)}}function D5A(i,e){if(i&1){let A=aA();I(0,"div")(1,"button",29),U("click",function(){L(A);let n=p(4);return G(n.openBase64InNewTab.emit({data:n.uiEvent.inlineData.data,mimeType:n.uiEvent.inlineData.mimeType}))}),D(2),h()()}if(i&2){let A=p(4);Q(2),Ee(" ",A.uiEvent.inlineData.name," ")}}function v5A(i,e){if(i&1&&(I(0,"div")(1,"div"),T(2,u5A,2,1,"div",19)(3,p5A,2,1,"div")(4,f5A,2,1,"div",20)(5,y5A,2,1)(6,D5A,3,1,"div"),h()()),i&2){let A,t=p(3);Q(2),O((A=t.uiEvent.inlineData.mediaType)===t.MediaType.IMAGE?2:A===t.MediaType.AUDIO?3:A===t.MediaType.VIDEO?4:A===t.MediaType.TEXT?5:6)}}function b5A(i,e){if(i&1){let A=aA();I(0,"div")(1,"img",30),U("click",function(){L(A);let n=p(4);return G(n.openViewImageDialog.emit(n.uiEvent.inlineData.data))}),h()()}if(i&2){let A=p(4);Q(),H("src",A.uiEvent.inlineData.data,mo)}}function M5A(i,e){if(i&1&&(I(0,"div",20),lA(1,"video",23),h()),i&2){let A=p(4);Q(),H("src",A.uiEvent.inlineData.data,mo)}}function S5A(i,e){if(i&1&&(I(0,"div",7)(1,"mat-icon"),D(2,"insert_drive_file"),h(),I(3,"a",9),D(4),h()()),i&2){let A=p(4);Q(3),H("href",A.uiEvent.inlineData.data,mo),Q(),nA(A.uiEvent.inlineData.displayName)}}function k5A(i,e){if(i&1&&(I(0,"div"),T(1,b5A,2,1,"div")(2,M5A,2,1,"div",20)(3,S5A,5,2,"div",7),h()),i&2){let A=p(3);Q(),O(A.uiEvent.inlineData.mimeType.startsWith("image/")?1:A.uiEvent.inlineData.mimeType.startsWith("video/")?2:3)}}function _5A(i,e){if(i&1&&T(0,v5A,7,1,"div")(1,k5A,4,1,"div"),i&2){let A=p(2);O(A.uiEvent.role==="bot"?0:1)}}function x5A(i,e){if(i&1&&(I(0,"div",31),lA(1,"app-audio-player",22),h()),i&2){let A=p(4);Q(),H("base64data",A.audioUrl||"")}}function R5A(i,e){if(i&1&&T(0,x5A,2,1,"div",31),i&2){let A=e.$implicit;O(A.fileData&&A.fileData.mimeType.startsWith("audio/")?0:-1)}}function N5A(i,e){if(i&1&&ke(0,R5A,1,1,null,null,ni),i&2){let A=p(2);_e(A.uiEvent.event==null||A.uiEvent.event.content==null?null:A.uiEvent.event.content.parts)}}function F5A(i,e){if(i&1&&(I(0,"div",34)(1,"div",35),D(2),h(),lA(3,"app-custom-json-viewer",36),h(),I(4,"div",37)(5,"div",38),D(6),h(),lA(7,"app-custom-json-viewer",36),h()),i&2){let A=p(3);Q(2),nA(A.i18n.actualToolUsesLabel),Q(),H("json",A.uiEvent.actualInvocationToolUses),Q(3),nA(A.i18n.expectedToolUsesLabel),Q(),H("json",A.uiEvent.expectedInvocationToolUses)}}function L5A(i,e){if(i&1&&(I(0,"div",34)(1,"div",35),D(2),h(),I(3,"div"),D(4),h()(),I(5,"div",37)(6,"div",38),D(7),h(),I(8,"div"),D(9),h()()),i&2){let A=p(3);Q(2),nA(A.i18n.actualResponseLabel),Q(2),nA(A.uiEvent.actualFinalResponse),Q(3),nA(A.i18n.expectedResponseLabel),Q(2),nA(A.uiEvent.expectedFinalResponse)}}function G5A(i,e){if(i&1&&(I(0,"div",33)(1,"span",39),D(2),h(),I(3,"span",40),D(4),h()()),i&2){let A=p(3);Q(2),Ya("",A.i18n.matchScoreLabel,": ",A.uiEvent.evalScore),Q(2),Ya("",A.i18n.thresholdLabel,": ",A.uiEvent.evalThreshold)}}function K5A(i,e){if(i&1&&(I(0,"div",6)(1,"div",32),T(2,F5A,8,4)(3,L5A,10,4),h(),T(4,G5A,5,4,"div",33),h()),i&2){let A=p(2);Q(2),O(A.uiEvent.actualInvocationToolUses?2:A.uiEvent.actualFinalResponse?3:-1),Q(2),O(A.uiEvent.evalScore!==void 0&&A.uiEvent.evalThreshold!==void 0?4:-1)}}function U5A(i,e){if(i&1&&(T(0,e5A,3,0,"div",4),T(1,a5A,3,2,"div",5)(2,h5A,5,3,"div"),T(3,E5A,2,1,"code"),T(4,Q5A,5,4,"div"),T(5,_5A,2,1),T(6,N5A,2,0),T(7,K5A,5,2,"div",6)),i&2){let A=p();O(A.uiEvent.attachments?0:-1),Q(),O(A.uiEvent.event.nodeInfo!=null&&A.uiEvent.event.nodeInfo.messageAsOutput?1:A.uiEvent.thought||A.uiEvent.text||A.uiEvent.renderedContent||A.uiEvent.a2uiData||A.uiEvent.event.inputTranscription||A.uiEvent.event.outputTranscription?2:-1),Q(2),O(A.uiEvent.executableCode?3:-1),Q(),O(A.uiEvent.codeExecutionResult?4:-1),Q(),O(A.uiEvent.inlineData?5:-1),Q(),O(!(A.uiEvent.event==null||A.uiEvent.event.content==null)&&A.uiEvent.event.content.parts?6:-1),Q(),O(A.uiEvent.failedMetric&&A.uiEvent.evalStatus===2?7:-1)}}function T5A(i,e){if(i&1&&lA(0,"app-custom-json-viewer",2),i&2){let A=p();H("json",A.uiEvent.event.output)("appJsonTooltip",(A.uiEvent.event.nodeInfo==null?null:A.uiEvent.event.nodeInfo.outputFor)||A.uiEvent.nodePath)}}function O5A(i,e){if(i&1&&lA(0,"app-custom-json-viewer",3),i&2){let A=p();H("json",A.uiEvent.error)("appJsonTooltip",A.uiEvent.error)}}function J5A(i,e){if(i&1&&D(0),i&2){let A=p(2);Ee(" ",A.uiEvent.event.inputTranscription.text," ")}}function Y5A(i,e){if(i&1&&D(0),i&2){let A=p(2);Ee(" ",A.uiEvent.event.outputTranscription.text," ")}}function H5A(i,e){if(i&1&&T(0,J5A,1,1)(1,Y5A,1,1),i&2){let A=p();O(A.role==="user"&&A.uiEvent.event.inputTranscription?0:A.role==="bot"&&A.uiEvent.event.outputTranscription?1:-1)}}var cy=class i{uiEvent;type="message";role="bot";evalStatus;userEditEvalCaseMessage="";userEditEvalCaseMessageChange=new FA;handleKeydown=new FA;cancelEditMessage=new FA;saveEditMessage=new FA;openViewImageDialog=new FA;openBase64InNewTab=new FA;i18n=w(C1);sanitizer=w(Qs);markdownComponent=w(g1);MediaType=iC;renderGooglerSearch(e){return this.sanitizer.bypassSecurityTrustHtml(e)}get rawMessageText(){let e=this.uiEvent.event?.content?.parts;return e?e.filter(A=>A.text).map(A=>A.text).join(""):""}get jsonOutputData(){if(this.uiEvent.event?.nodeInfo?.messageAsOutput===!0){let e=this.rawMessageText;if(e)try{return JSON.parse(e)}catch(A){return null}}return null}get hasAudio(){if(this.uiEvent.inlineData?.mediaType==="audio")return!0;let e=this.uiEvent.event?.content?.parts;return e?e.some(A=>A.fileData&&A.fileData.mimeType&&A.fileData.mimeType.startsWith("audio/")):!1}get noBubble(){if(this.uiEvent.text||this.rawMessageText)return!1;if(this.uiEvent.inlineData){let A=this.uiEvent.inlineData.mediaType;if(A==="audio"||A==="image"||A==="video"||A==="text")return!0}if(this.uiEvent.inlineData?.mimeType){let A=this.uiEvent.inlineData.mimeType;if(A.startsWith("audio/")||A.startsWith("image/")||A.startsWith("video/"))return!0}let e=this.uiEvent.event?.content?.parts;return e?e.some(A=>A.fileData&&A.fileData.mimeType&&(A.fileData.mimeType.startsWith("audio/")||A.fileData.mimeType.startsWith("image/")||A.fileData.mimeType.startsWith("video/"))):!1}getTextContent(e){if(!e)return"";let A=e.indexOf(",");if(A===-1)return"";let t=e.substring(A+1);try{return atob(t)}catch(n){return"Failed to decode text content"}}audioUrl=null;ngOnChanges(e){e.uiEvent&&this.uiEvent&&this.checkAndLoadAudio()}http=w(Mr);artifactService=w(EB);changeDetectorRef=w(Mt);checkAndLoadAudio(){let e=this.uiEvent.event?.content?.parts;if(e){let A=e.find(t=>t.fileData&&t.fileData.mimeType&&t.fileData.mimeType.startsWith("audio/pcm"));A&&A.fileData&&this.loadAudio(A.fileData.fileUri)}}loadAudio(e){if(!e||!e.startsWith("artifact://"))return;let A=e.substring(11).split("/"),t=A[0],n=A[1],o=A[2],a=A.slice(3).join("/"),r=a.indexOf("#"),s=r!==-1?a.substring(0,r):a,l=r!==-1?a.substring(r+1):"0",g=s.lastIndexOf("/"),C=g!==-1?s.substring(g+1):s;this.artifactService.getLatestArtifact(n,t,o,C).subscribe(d=>{let B="";if(d.inlineData&&d.inlineData.data?B=d.inlineData.data:d.data&&(B=d.data),B){let u=this.base64ToArrayBuffer(B),E=u.byteLength-u.byteLength%2,f=u.slice(0,E),v=this.pcmToWav(f,24e3,1),S=new FileReader;S.onloadend=()=>{this.audioUrl=S.result,this.changeDetectorRef.detectChanges()},S.readAsDataURL(v)}})}base64ToArrayBuffer(e){let A=e.replace(/\s/g,""),t=A.indexOf(",");for(t!==-1&&(A=A.substring(t+1)),A=A.replace(/-/g,"+").replace(/_/g,"/");A.length%4!==0;)A+="=";let n=window.atob(A),o=n.length,a=new Uint8Array(o);for(let r=0;rA.toString(16).padStart(2,"0")).join(" ")}pcmToWav(e,A,t){let n=new ArrayBuffer(44),o=new DataView(n);return this.writeString(o,0,"RIFF"),o.setUint32(4,36+e.byteLength,!0),this.writeString(o,8,"WAVE"),this.writeString(o,12,"fmt "),o.setUint32(16,16,!0),o.setUint16(20,1,!0),o.setUint16(22,t,!0),o.setUint32(24,A,!0),o.setUint32(28,A*t*2,!0),o.setUint16(32,t*2,!0),o.setUint16(34,16,!0),this.writeString(o,36,"data"),o.setUint32(40,e.byteLength,!0),new Blob([n,e],{type:"audio/wav"})}writeString(e,A,t){for(let n=0;n0?6:7)}}function q5A(i,e){if(i&1&&(I(0,"span"),D(1),h()),i&2){let A=e.$implicit;Ao("token-"+A.type),Q(),nA(A.value)}}function W5A(i,e){if(i&1&&ke(0,q5A,2,3,"span",24,Ja),i&2){let A=p().$implicit;_e(A.right.tokens)}}function Z5A(i,e){if(i&1&&D(0),i&2){let A=p().$implicit;nA(A.right.value)}}function X5A(i,e){if(i&1&&(I(0,"div",20)(1,"span",21),D(2),h(),I(3,"span",22),D(4),h(),I(5,"span",23),T(6,W5A,2,0)(7,Z5A,1,1),h()()),i&2){let A=e.$implicit;_A("line-added",A.right.type==="added")("line-empty",A.right.type==="empty")("line-unchanged",A.right.type==="unchanged"),Q(2),nA(A.right.lineNumber||""),Q(2),nA(A.right.type==="added"?"+":""),Q(2),O(A.right.tokens&&A.right.tokens.length>0?6:7)}}var dy=class i{dialogRef=w(zn);data=w(Do);diffRows=[];ngOnInit(){let e=this.data.precedingInstruction||"",A=this.data.currentInstruction||"",t=this.diffLines(e,A);this.diffRows=this.alignDiff(t)}diffLines(e,A){let t=e.split(` -`),n=A.split(` -`),o=t.length,a=n.length,r=Array.from({length:o+1},()=>Array(a+1).fill(0));for(let C=1;C<=o;C++)for(let d=1;d<=a;d++)t[C-1]===n[d-1]?r[C][d]=r[C-1][d-1]+1:r[C][d]=Math.max(r[C-1][d],r[C][d-1]);let s=[],l=o,g=a;for(;l>0||g>0;)l>0&&g>0&&t[l-1]===n[g-1]?(s.unshift({type:"unchanged",value:t[l-1],leftLineNumber:l,rightLineNumber:g}),l--,g--):g>0&&(l===0||r[l][g-1]>=r[l-1][g])?(s.unshift({type:"added",value:n[g-1],rightLineNumber:g}),g--):(s.unshift({type:"removed",value:t[l-1],leftLineNumber:l}),l--);return s}alignDiff(e){let A=[],t=0;for(;tArray(a+1).fill(0));for(let d=1;d<=o;d++)for(let B=1;B<=a;B++)t[d-1]===n[B-1]?r[d][B]=r[d-1][B-1]+1:r[d][B]=Math.max(r[d-1][B],r[d][B-1]);let s=o,l=a,g=[],C=[];for(;s>0||l>0;)if(s>0&&l>0&&t[s-1]===n[l-1]){let d=t[s-1];g.unshift({type:"unchanged",value:d}),C.unshift({type:"unchanged",value:d}),s--,l--}else l>0&&(s===0||r[s][l-1]>=r[s-1][l])?(C.unshift({type:"added",value:n[l-1]}),l--):(g.unshift({type:"removed",value:t[s-1]}),s--);return{left:this.mergeTokens(g),right:this.mergeTokens(C)}}mergeTokens(e){if(e.length===0)return[];let A=[e[0]];for(let t=1;t({"eval-pass":i,"eval-fail":e}),ER=i=>({hidden:i}),QR=(i,e)=>e.id;function AyA(i,e){if(i&1){let A=aA();I(0,"app-content-bubble",11),U("userEditEvalCaseMessageChange",function(n){L(A);let o=p();return G(o.userEditEvalCaseMessageChange.emit(n))})("handleKeydown",function(n){L(A);let o=p();return G(o.handleKeydown.emit(n))})("cancelEditMessage",function(n){L(A);let o=p();return G(o.cancelEditMessage.emit(n))})("saveEditMessage",function(n){L(A);let o=p();return G(o.saveEditMessage.emit(n))})("openViewImageDialog",function(n){L(A);let o=p();return G(o.onImageClick(n))})("openBase64InNewTab",function(n){L(A);let o=p();return G(o.openBase64InNewTab.emit(n))}),h()}if(i&2){let A=p();H("type",A.uiEvent.thought?"thought":"message")("role",A.uiEvent.role)("evalStatus",A.uiEvent.evalStatus)("uiEvent",A.uiEvent)("userEditEvalCaseMessage",A.userEditEvalCaseMessage)}}function eyA(i,e){if(i&1&&lA(0,"app-content-bubble",2),i&2){let A=p();H("uiEvent",A.uiEvent)}}function tyA(i,e){if(i&1&&lA(0,"app-content-bubble",3),i&2){let A=p();H("role","user")("uiEvent",A.uiEvent)}}function iyA(i,e){if(i&1&&lA(0,"app-content-bubble",3),i&2){let A=p();H("role","bot")("uiEvent",A.uiEvent)}}function nyA(i,e){if(i&1){let A=aA();I(0,"app-hover-info-button",12),U("buttonClick",function(n){L(A);let o=p();return G(o.openSystemInstructionDiffDialog(n))}),h()}i&2&&H("icon","warning")("text","Performance")("tooltipContent","System instructions modified between turns, causing a context cache miss and increasing latency. Click to compare changes and view the diff.")("tooltipTitle","Performance Warning")}function oyA(i,e){i&1&&lA(0,"app-hover-info-button",6),i&2&&H("icon","stop_circle")("text","Turn Complete")("tooltipContent","The agent has completed this turn")("tooltipTitle","Turn Complete")}function ayA(i,e){i&1&&lA(0,"app-hover-info-button",6),i&2&&H("icon","report")("text","Interrupted")("tooltipContent","The stream was interrupted")("tooltipTitle","Interrupted")}function ryA(i,e){if(i&1&&lA(0,"app-hover-info-button",6),i&2){let A=e.$implicit,t=p(2);H("icon","bolt")("text",t.getFunctionCallButtonText(A))("tooltipContent",A.args||"")("tooltipTitle","Function Call")}}function syA(i,e){if(i&1){let A=aA();I(0,"app-computer-action",16),U("clickEvent",function(n){L(A);let o=p(3);return G(o.clickEvent.emit(n))})("openImage",function(n){L(A);let o=p(3);return G(o.openViewImageDialog.emit(n))}),h()}if(i&2){let A=p().$implicit,t=p(2);H("functionCall",A)("allMessages",t.uiEvents)("index",t.index)}}function lyA(i,e){if(i&1&&T(0,syA,1,3,"app-computer-action",15),i&2){let A=e.$implicit,t=p(2);O(t.isComputerUseClick(A)?0:-1)}}function gyA(i,e){if(i&1&&(I(0,"div",13),ke(1,ryA,1,4,"app-hover-info-button",6,QR),h(),I(3,"div",14),ke(4,lyA,1,1,null,null,QR),h()),i&2){let A=p();Q(),_e(A.uiEvent.functionCalls),Q(3),_e(A.uiEvent.functionCalls)}}function cyA(i,e){if(i&1){let A=aA();I(0,"app-computer-action",19),U("clickEvent",function(n){L(A);let o=p(3);return G(o.clickEvent.emit(n))}),h()}if(i&2){let A=p().$implicit,t=p(2);H("functionResponse",A)("allMessages",t.uiEvents)("index",t.index)}}function CyA(i,e){if(i&1){let A=aA();I(0,"div",18),lA(1,"app-hover-info-button",6),I(2,"button",20),U("click",function(n){return n.stopPropagation()}),I(3,"mat-icon",21),D(4,"more_vert"),h()(),I(5,"mat-menu",null,0)(7,"button",22),U("click",function(){L(A);let n=p().$implicit,o=p(2);return G(o.openSendAnotherResponseDialog(n))}),I(8,"span"),D(9,"Send another response"),h()()()()}if(i&2){let A=Bi(6),t=p().$implicit;Q(),H("icon","check")("text",t.name)("tooltipContent",t.response||"")("tooltipTitle","Function Response"),Q(),H("matMenuTriggerFor",A)}}function dyA(i,e){if(i&1&&T(0,cyA,1,3,"app-computer-action",17)(1,CyA,10,5,"div",18),i&2){let A=e.$implicit,t=p(2);O(t.isComputerUseResponse(A)?0:1)}}function IyA(i,e){if(i&1&&ke(0,dyA,2,1,null,null,ni),i&2){let A=p();_e(A.uiEvent.functionResponses)}}function ByA(i,e){if(i&1&&lA(0,"app-hover-info-button",6),i&2){let A=p(),t=Ki(10);H("icon","data_object")("text","State: "+t.join(", "))("tooltipContent",A.getFilteredStateDelta(A.uiEvent.stateDelta))("tooltipTitle","State Update")}}function hyA(i,e){if(i&1&&lA(0,"app-hover-info-button",6),i&2){p();let A=Ki(0),t=p();H("icon","attachment")("text","Artifact: "+A.join(", "))("tooltipContent",t.uiEvent.artifactDelta)("tooltipTitle","Artifact")}}function EyA(i,e){if(i&1&&(ro(0),T(1,hyA,1,4,"app-hover-info-button",6)),i&2){let A=p(),t=so(A.Object.keys(A.uiEvent.artifactDelta));Q(),O(t.length>0?1:-1)}}function QyA(i,e){if(i&1&&lA(0,"app-content-bubble",7),i&2){let A=p();H("uiEvent",A.uiEvent)}}function uyA(i,e){if(i&1&&lA(0,"app-hover-info-button",6),i&2){let A=p();H("icon","route")("text","route: "+A.String(A.uiEvent.route))("tooltipContent",A.uiEvent.route)("tooltipTitle","Route")}}function pyA(i,e){if(i&1&&lA(0,"app-hover-info-button",6),i&2){let A=p();H("icon","swap_horiz")("text",A.uiEvent.author+" \u2192 "+A.getTransferTargetName())("tooltipContent",A.uiEvent.transferToAgent)("tooltipTitle","Transfer to Agent")}}function fyA(i,e){if(i&1){let A=aA();I(0,"button",23),U("click",function(n){L(A);let o=p();return G(o.agentStateClick.emit({event:n,index:o.index}))}),I(1,"mat-icon"),D(2,"account_tree"),h(),D(3," Agent State "),h()}if(i&2){let A=p();H("appWorkflowGraphTooltip",A.getWorkflowNodes())("agentGraphData",A.agentGraphData)("nodePath",A.uiEvent.nodePath)("allNodes",A.allWorkflowNodes)}}function myA(i,e){if(i&1&&lA(0,"app-hover-info-button",9),i&2){let A=p();H("icon","check_circle")("text",A.getEndOfAgentAuthor()+" completed!")}}function wyA(i,e){if(i&1){let A=aA();I(0,"app-long-running-response",25),U("responseComplete",function(n){L(A);let o=p(3);return G(o.longRunningResponseComplete.emit(n))}),h()}if(i&2){let A=p().$implicit,t=p(2);H("functionCall",A)("appName",t.appName)("userId",t.userId)("sessionId",t.sessionId)}}function yyA(i,e){if(i&1&&T(0,wyA,1,4,"app-long-running-response",24),i&2){let A=e.$implicit,t=p(2);O(A.needsResponse&&!t.hasFunctionResponse(A.id)?0:-1)}}function DyA(i,e){if(i&1&&ke(0,yyA,1,1,null,null,QR),i&2){let A=p();_e(A.uiEvent.functionCalls)}}function vyA(i,e){if(i&1&&(I(0,"div",10)(1,"span",26),D(2),h()()),i&2){let A=p();H("ngClass",L0(2,$5A,A.uiEvent.evalStatus===1,A.uiEvent.evalStatus===2)),Q(2),nA(A.uiEvent.evalStatus===1?A.i18n.evalPassLabel:A.uiEvent.evalStatus===2?A.i18n.evalFailLabel:"")}}function byA(i,e){if(i&1){let A=aA();I(0,"div")(1,"span",27),U("click",function(){L(A);let n=p(2);return G(n.editEvalCaseMessage.emit(n.uiEvent))}),D(2," edit "),h(),I(3,"span",27),U("click",function(){L(A);let n=p(2);return G(n.deleteEvalCaseMessage.emit({message:n.uiEvent,index:n.index}))}),D(4," delete "),h()()}if(i&2){let A=p(2);Q(),H("ngClass",jl(4,ER,A.isEvalCaseEditing))("matTooltip",A.i18n.editEvalMessageTooltip),Q(2),H("ngClass",jl(6,ER,A.isEvalCaseEditing))("matTooltip",A.i18n.deleteEvalMessageTooltip)}}function MyA(i,e){if(i&1){let A=aA();I(0,"div")(1,"span",27),U("click",function(){L(A);let n=p(2);return G(n.editFunctionArgs.emit(n.uiEvent))}),D(2," edit "),h()()}if(i&2){let A=p(2);Q(),H("ngClass",jl(2,ER,A.isEvalCaseEditing))("matTooltip",A.i18n.editFunctionArgsTooltip)}}function SyA(i,e){if(i&1&&T(0,byA,5,8,"div")(1,MyA,3,4,"div"),i&2){let A=p();O(A.uiEvent.text?0:A.isEditFunctionArgsEnabled&&A.uiEvent.functionCalls&&A.uiEvent.functionCalls.length>0?1:-1)}}var bE=class i{uiEvent;index;uiEvents=[];appName="";userId="";sessionId="";sessionName="";evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;isEditFunctionArgsEnabled=!1;userEditEvalCaseMessage="";agentGraphData=null;allWorkflowNodes=null;handleKeydown=new FA;cancelEditMessage=new FA;saveEditMessage=new FA;userEditEvalCaseMessageChange=new FA;openViewImageDialog=new FA;openBase64InNewTab=new FA;editEvalCaseMessage=new FA;deleteEvalCaseMessage=new FA;editFunctionArgs=new FA;clickEvent=new FA;longRunningResponseComplete=new FA;agentStateClick=new FA;i18n=w(C1);dialog=w(Xa);Object=Object;String=String;getFunctionCallButtonText(e){let A=e.args;if(A&&typeof A=="string")try{A=JSON.parse(A)}catch(t){}if(A&&typeof A=="object"){let t={EditFile:"path",WriteFile:"path"};if(e.name in t){let o=t[e.name];if(o in A){let a=this.formatPythonValue(A[o]),r=Object.keys(A).length>1;return`${e.name}(${a}${r?", \u2026":""})`}}let n=Object.keys(A);if(n.length===1){let o=A[n[0]],a=this.formatPythonValue(o);return`${e.name}(${a})`}else if(n.length===0)return`${e.name}()`}else if(!A)return`${e.name}()`;return e.name}formatPythonValue(e){return e==null?"None":typeof e=="boolean"?e?"True":"False":typeof e=="string"?`"${e}"`:typeof e=="object"?JSON.stringify(e).replace(/\btrue\b/g,"True").replace(/\bfalse\b/g,"False").replace(/\bnull\b/g,"None"):String(e)}shouldShowMessageCard(e){return!!(e.text||e.attachments||e.inlineData||e.executableCode||e.codeExecutionResult||e.a2uiData||e.renderedContent||e.isLoading||e.failedMetric&&e.evalStatus===2||e.event?.content?.parts?.some(A=>A.fileData))}isComputerUseClick(e){return vE(e)}isComputerUseResponse(e){return k0(e)}getFilteredStateKeys(e){return e?Object.keys(e).filter(A=>A!=="__llm_request_key__"):[]}getFilteredStateDelta(e){if(!e)return null;let A=P({},e);return delete A.__llm_request_key__,A}hasWorkflowNodes(){let e=this.uiEvent.event?.actions?.agentState?.nodes;return!!e&&Object.keys(e).length>0}getWorkflowNodes(){return this.uiEvent.event?.actions?.agentState?.nodes||null}hasEndOfAgent(){return this.uiEvent.event?.actions?.endOfAgent===!0}getEndOfAgentAuthor(){return this.uiEvent.event?.author||"Agent"}getTransferTargetName(){let e=this.uiEvent.transferToAgent;return e?typeof e=="string"?e:e.agentName||e.name||e.targetAgent||JSON.stringify(e):""}hasFunctionResponse(e){return e?this.uiEvents.some(A=>A.functionResponses?.some(t=>t.id===e&&t.response?.status!=="pending")):!1}openSendAnotherResponseDialog(e){let A="",t=e.id;if(t){for(let o of this.uiEvents)if(o.functionCalls){let a=o.functionCalls.find(r=>r.id===t);if(a){A=a.functionCallEventId||o.event?.id||"";break}}}this.dialog.open(CI,{data:{dialogHeader:"Send Another Response",functionName:e.name,jsonContent:e.response},width:"600px"}).afterClosed().subscribe(o=>{if(o){let a={role:"user",parts:[{functionResponse:{id:t,name:e.name,response:o}}],functionCallEventId:A};this.longRunningResponseComplete.emit(a)}})}getAllImages(){let e=[],A=new Set,t=n=>{A.has(n)||(A.add(n),e.push(n))};for(let n of this.uiEvents){if(n.attachments)for(let a of n.attachments)a.file.type.startsWith("image/")&&a.url&&t(a.url);n.inlineData?.mimeType?.startsWith("image/")&&n.inlineData.data&&t(n.inlineData.data);let o=n.event?.content?.parts;if(Array.isArray(o)){for(let a of o)if(a.inlineData?.mimeType?.startsWith("image/")&&a.inlineData.data){let r=a.inlineData.mimeType,s=a.inlineData.data.replace(/-/g,"+").replace(/_/g,"/");t(`data:${r};base64,${s}`)}}if(n.functionResponses){for(let a of n.functionResponses)if(this.isComputerUseResponse(a)){let s=a.response?.image;if(s?.data){let l=s.data,g=s.mimetype||"image/png",C=l.startsWith("data:")?l:`data:${g};base64,${l}`;t(C)}}}}return e}onImageClick(e){let A=this.getAllImages(),t=A.indexOf(e);this.openViewImageDialog.emit({images:A,currentIndex:t})}openSystemInstructionDiffDialog(e){e.stopPropagation();let A=this.uiEvent.event.precedingSystemInstruction||"",t=this.uiEvent.event.currentSystemInstruction||"";this.dialog.open(dy,{data:{precedingInstruction:A,currentInstruction:t},maxWidth:"95vw",maxHeight:"95vh",width:"85vw",height:"90vh",panelClass:"system-instruction-diff-dialog-panel"})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-event-content"]],inputs:{uiEvent:"uiEvent",index:"index",uiEvents:"uiEvents",appName:"appName",userId:"userId",sessionId:"sessionId",sessionName:"sessionName",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",userEditEvalCaseMessage:"userEditEvalCaseMessage",agentGraphData:"agentGraphData",allWorkflowNodes:"allWorkflowNodes"},outputs:{handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",clickEvent:"clickEvent",longRunningResponseComplete:"longRunningResponseComplete",agentStateClick:"agentStateClick"},decls:21,vars:20,consts:[["responseMenu","matMenu"],[3,"type","role","evalStatus","uiEvent","userEditEvalCaseMessage"],["type","output",3,"uiEvent"],["type","transcription",3,"role","uiEvent"],[1,"event-chips-container"],[1,"performance-warning-btn",3,"icon","text","tooltipContent","tooltipTitle"],[3,"icon","text","tooltipContent","tooltipTitle"],["type","error",3,"uiEvent"],["mat-stroked-button","",1,"event-action-button",3,"appWorkflowGraphTooltip","agentGraphData","nodePath","allNodes"],[3,"icon","text"],[3,"ngClass"],[3,"userEditEvalCaseMessageChange","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","type","role","evalStatus","uiEvent","userEditEvalCaseMessage"],[1,"performance-warning-btn",3,"buttonClick","icon","text","tooltipContent","tooltipTitle"],[1,"function-calls-buttons"],[1,"function-calls-previews"],[3,"functionCall","allMessages","index"],[3,"clickEvent","openImage","functionCall","allMessages","index"],[3,"functionResponse","allMessages","index"],[1,"function-response-chip-container"],[3,"clickEvent","functionResponse","allMessages","index"],["mat-icon-button","",1,"menu-trigger-btn",3,"click","matMenuTriggerFor"],[1,"more-icon"],["mat-menu-item","",3,"click"],["mat-stroked-button","",1,"event-action-button",3,"click","appWorkflowGraphTooltip","agentGraphData","nodePath","allNodes"],[3,"functionCall","appName","userId","sessionId"],[3,"responseComplete","functionCall","appName","userId","sessionId"],[2,"font-family","monospace"],[1,"material-symbols-outlined","eval-case-edit-button",3,"click","ngClass","matTooltip"]],template:function(A,t){if(A&1&&(T(0,AyA,1,5,"app-content-bubble",1),T(1,eyA,1,1,"app-content-bubble",2),T(2,tyA,1,2,"app-content-bubble",3),T(3,iyA,1,2,"app-content-bubble",3),I(4,"div",4),T(5,nyA,1,4,"app-hover-info-button",5),T(6,oyA,1,4,"app-hover-info-button",6),T(7,ayA,1,4,"app-hover-info-button",6),T(8,gyA,6,0),T(9,IyA,2,0),ro(10),T(11,ByA,1,4,"app-hover-info-button",6),T(12,EyA,2,2),T(13,QyA,1,1,"app-content-bubble",7),T(14,uyA,1,4,"app-hover-info-button",6),T(15,pyA,1,4,"app-hover-info-button",6),T(16,fyA,4,4,"button",8),T(17,myA,1,2,"app-hover-info-button",9),h(),T(18,DyA,2,0),T(19,vyA,3,5,"div",10),T(20,SyA,2,1)),A&2){O(t.shouldShowMessageCard(t.uiEvent)?0:-1),Q(),O(t.uiEvent.event.output?1:-1),Q(),O(t.uiEvent.event.inputTranscription?2:-1),Q(),O(t.uiEvent.event.outputTranscription?3:-1),Q(2),O(t.uiEvent.event.systemInstructionChanged?5:-1),Q(),O(t.uiEvent.event.turnComplete?6:-1),Q(),O(t.uiEvent.event.interrupted?7:-1),Q(),O(t.uiEvent.functionCalls&&t.uiEvent.functionCalls.length>0?8:-1),Q(),O(t.uiEvent.functionResponses&&t.uiEvent.functionResponses.length>0?9:-1),Q();let n=so(t.getFilteredStateKeys(t.uiEvent.stateDelta));Q(),O(n.length>0?11:-1),Q(),O(t.uiEvent.artifactDelta?12:-1),Q(),O(t.uiEvent.error?13:-1),Q(),O(t.uiEvent.route?14:-1),Q(),O(t.uiEvent.transferToAgent?15:-1),Q(),O(t.hasWorkflowNodes()?16:-1),Q(),O(t.hasEndOfAgent()?17:-1),Q(),O(t.uiEvent.functionCalls&&t.uiEvent.functionCalls.length>0?18:-1),Q(),O(t.uiEvent.evalStatus===1||t.uiEvent.evalStatus===2?19:-1),Q(),O(t.evalCase&&t.isEvalEditMode?20:-1)}},dependencies:[li,Vl,Un,zt,qi,ki,yi,Ha,rn,ay,ry,ly,sy,cy,s2,hs,Gs,tg],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;width:100%}app-content-bubble[_ngcontent-%COMP%] + app-content-bubble[_ngcontent-%COMP%]{margin-top:5px}.event-chips-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;width:100%}.user[_nghost-%COMP%] .event-chips-container[_ngcontent-%COMP%], .user [_nghost-%COMP%] .event-chips-container[_ngcontent-%COMP%]{justify-content:flex-end}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#2e7d32}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--mat-sys-error)}.hidden[_ngcontent-%COMP%]{visibility:hidden}.event-action-button[_ngcontent-%COMP%]{margin:5px}.function-calls-previews[_ngcontent-%COMP%]{width:100%}.function-response-chip-container[_ngcontent-%COMP%]{display:inline-flex;align-items:center;position:relative}.function-response-chip-container[_ngcontent-%COMP%] .menu-trigger-btn[_ngcontent-%COMP%]{visibility:hidden;width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center;padding:0;position:absolute;right:10px;top:50%;transform:translateY(-50%);background-color:var(--mat-sys-surface-container-high);border-radius:50%;z-index:2}.function-response-chip-container[_ngcontent-%COMP%] .menu-trigger-btn[_ngcontent-%COMP%] .more-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.function-response-chip-container[_ngcontent-%COMP%]:hover .menu-trigger-btn[_ngcontent-%COMP%]{visibility:visible} .performance-warning-btn.hover-info-button, .performance-warning-btn .hover-info-button{background-color:#ffb3001a!important;border:1px solid rgba(255,179,0,.3)!important} .performance-warning-btn.hover-info-button mat-icon, .performance-warning-btn .hover-info-button mat-icon{color:#ffb300!important} .performance-warning-btn.hover-info-button:hover, .performance-warning-btn .hover-info-button:hover{background-color:#ffb30033!important;box-shadow:0 2px 6px #ffb30026}html.light-theme[_ngcontent-%COMP%] .performance-warning-btn.hover-info-button, html.light-theme[_ngcontent-%COMP%] .performance-warning-btn .hover-info-button{background-color:#e6510014!important;border:1px solid rgba(230,81,0,.3)!important}html.light-theme[_ngcontent-%COMP%] .performance-warning-btn.hover-info-button mat-icon, html.light-theme[_ngcontent-%COMP%] .performance-warning-btn .hover-info-button mat-icon{color:#e65100!important}html.light-theme[_ngcontent-%COMP%] .performance-warning-btn.hover-info-button:hover, html.light-theme[_ngcontent-%COMP%] .performance-warning-btn .hover-info-button:hover{background-color:#e6510026!important;box-shadow:0 2px 6px #e6510026}"]})};function kyA(i,e){if(i&1&&lA(0,"app-chat-avatar",1),i&2){let A=p();H("role",A.uiEvent.event.content?"bot":"node")("author",A.uiEvent.author)("nodePath",A.uiEvent.nodePath)}}function _yA(i,e){i&1&&lA(0,"div",4)}function xyA(i,e){if(i&1&&ke(0,_yA,1,0,"div",4,ni),i&2){let A=p();_e(A.indentationArray)}}function RyA(i,e){i&1&&lA(0,"app-chat-avatar")}function NyA(i,e){if(i&1&&lA(0,"app-message-feedback",3),i&2){let A=p();H("sessionName",A.sessionName)("eventId",A.uiEvent.event.id||"")}}var Iy=class i{uiEvent;index;uiEvents=[];isSelected=!1;isSelectable=!0;appName="";userId="";sessionId="";sessionName="";evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;isEditFunctionArgsEnabled=!1;userEditEvalCaseMessage="";agentGraphData=null;allWorkflowNodes=null;isUserFeedbackEnabled=!1;isLoadingAgentResponse=!1;rowClick=new FA;handleKeydown=new FA;cancelEditMessage=new FA;saveEditMessage=new FA;userEditEvalCaseMessageChange=new FA;openViewImageDialog=new FA;openBase64InNewTab=new FA;editEvalCaseMessage=new FA;deleteEvalCaseMessage=new FA;editFunctionArgs=new FA;clickEvent=new FA;longRunningResponseComplete=new FA;agentStateClick=new FA;onRowClick(e){this.isSelectable&&this.rowClick.emit({event:e,uiEvent:this.uiEvent,index:this.index})}get indentationDepth(){if(!this.uiEvent.nodePath)return 0;let A=this.uiEvent.nodePath.split("/").filter(Boolean).length;return A>2?A-2:0}get indentationArray(){let e=this.indentationDepth;return e>0?Array.from({length:e},(A,t)=>t):[]}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-event-row"]],hostAttrs:[1,"message-row-container"],hostVars:8,hostBindings:function(A,t){A&1&&U("click",function(o){return t.onRowClick(o)}),A&2&&_A("selected",t.isSelected)("user",t.uiEvent.role==="user")("bot",t.uiEvent.role==="bot")("selectable",t.isSelectable)},inputs:{uiEvent:"uiEvent",index:"index",uiEvents:"uiEvents",isSelected:"isSelected",isSelectable:"isSelectable",appName:"appName",userId:"userId",sessionId:"sessionId",sessionName:"sessionName",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",userEditEvalCaseMessage:"userEditEvalCaseMessage",agentGraphData:"agentGraphData",allWorkflowNodes:"allWorkflowNodes",isUserFeedbackEnabled:"isUserFeedbackEnabled",isLoadingAgentResponse:"isLoadingAgentResponse"},outputs:{rowClick:"rowClick",handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",clickEvent:"clickEvent",longRunningResponseComplete:"longRunningResponseComplete",agentStateClick:"agentStateClick"},decls:7,vars:21,consts:[[1,"event-number-container"],[3,"role","author","nodePath"],[1,"message-content",3,"userEditEvalCaseMessageChange","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","clickEvent","longRunningResponseComplete","agentStateClick","uiEvent","index","uiEvents","appName","userId","sessionId","sessionName","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userEditEvalCaseMessage","agentGraphData","allWorkflowNodes"],[3,"sessionName","eventId"],[1,"indentation-line"]],template:function(A,t){A&1&&(I(0,"div",0),D(1),h(),T(2,kyA,1,3,"app-chat-avatar",1),T(3,xyA,2,0),I(4,"app-event-content",2),U("userEditEvalCaseMessageChange",function(o){return t.userEditEvalCaseMessageChange.emit(o)})("handleKeydown",function(o){return t.handleKeydown.emit(o)})("cancelEditMessage",function(o){return t.cancelEditMessage.emit(o)})("saveEditMessage",function(o){return t.saveEditMessage.emit(o)})("openViewImageDialog",function(o){return t.openViewImageDialog.emit(o)})("openBase64InNewTab",function(o){return t.openBase64InNewTab.emit(o)})("editEvalCaseMessage",function(o){return t.editEvalCaseMessage.emit(o)})("deleteEvalCaseMessage",function(o){return t.deleteEvalCaseMessage.emit(o)})("editFunctionArgs",function(o){return t.editFunctionArgs.emit(o)})("clickEvent",function(o){return t.clickEvent.emit(o)})("longRunningResponseComplete",function(o){return t.longRunningResponseComplete.emit(o)})("agentStateClick",function(o){return t.agentStateClick.emit(o)}),h(),T(5,RyA,1,0,"app-chat-avatar"),T(6,NyA,1,2,"app-message-feedback",3)),A&2&&(_A("hidden",!t.isSelectable),Q(),Ee(" #",t.index+1," "),Q(),O(t.uiEvent.role==="bot"&&!t.uiEvent.isLoading?2:-1),Q(),O(t.uiEvent.role==="bot"?3:-1),Q(),H("uiEvent",t.uiEvent)("index",t.index)("uiEvents",t.uiEvents)("appName",t.appName)("userId",t.userId)("sessionId",t.sessionId)("sessionName",t.sessionName)("evalCase",t.evalCase)("isEvalEditMode",t.isEvalEditMode)("isEvalCaseEditing",t.isEvalCaseEditing)("isEditFunctionArgsEnabled",t.isEditFunctionArgsEnabled)("userEditEvalCaseMessage",t.userEditEvalCaseMessage)("agentGraphData",t.agentGraphData)("allWorkflowNodes",t.allWorkflowNodes),Q(),O(t.uiEvent.role==="user"?5:-1),Q(),O(t.isUserFeedbackEnabled&&!t.isLoadingAgentResponse&&t.uiEvent.role==="bot"?6:-1))},dependencies:[li,ny,ty,bE],styles:[".generated-image-container[_ngcontent-%COMP%]{max-width:400px;margin-left:20px}.generated-image[_ngcontent-%COMP%]{max-width:100%;min-width:40px;border-radius:8px}.html-artifact-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:flex-start;align-items:center}app-content-bubble[_ngcontent-%COMP%] + app-content-bubble[_ngcontent-%COMP%]{margin-top:5px}.event-chips-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;width:100%}[_nghost-%COMP%]{display:flex;flex-direction:row;flex-wrap:nowrap;margin-left:-20px;margin-right:-20px;padding:4px 20px;border-radius:4px;transition:all .2s ease}.selectable[_nghost-%COMP%]:hover{box-shadow:inset 0 0 0 2px var(--mat-sys-outline-variant, rgba(0, 0, 0, .12))}.selected[_nghost-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))!important}app-message-feedback[_ngcontent-%COMP%]{width:100%}.user[_nghost-%COMP%]{justify-content:flex-end;align-items:flex-start;gap:15px}.bot[_nghost-%COMP%]{align-items:flex-start;padding-right:48px}.bot[_nghost-%COMP%] app-chat-avatar[_ngcontent-%COMP%]{align-self:flex-start}.message-content[_ngcontent-%COMP%]{display:contents}.bot[_nghost-%COMP%] > .message-content[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-width:0;align-items:flex-start}.user[_nghost-%COMP%] > .message-content[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-width:0;align-items:flex-end}.bot[_nghost-%COMP%]:focus-within app-content-bubble[_ngcontent-%COMP%] .content-bubble{border:1px solid var(--mat-sys-outline)}.message-textarea[_ngcontent-%COMP%]{max-width:100%;border:none;background-color:transparent;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}app-content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}app-content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--mat-sys-outline-variant);padding-right:8px;min-width:350px;max-width:350px}app-content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}app-content-bubble[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--mat-sys-outline-variant);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--mat-sys-tertiary)}.header-actual[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#2e7d32}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--mat-sys-error)}.hidden[_ngcontent-%COMP%]{visibility:hidden}.image-preview-chat[_ngcontent-%COMP%]{max-width:90%;max-height:70vh;width:auto;height:auto;border-radius:8px;cursor:pointer;transition:transform .2s ease-in-out}.attachment[_ngcontent-%COMP%]{display:flex;align-items:center}[_nghost-%COMP%] .message-text p{white-space:pre-line;word-break:break-word;overflow-wrap:break-word}.event-number-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-self:flex-start;min-width:30px;margin-top:10px;margin-right:8px;font-size:12px;font-weight:600;text-align:center;color:var(--mat-sys-on-surface-variant)}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.link-style-button[_ngcontent-%COMP%]{border:none;padding:0;font:inherit;color:var(--mat-sys-primary)!important;text-decoration:underline;cursor:pointer;outline:none;font-size:14px}.cancel-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--mat-sys-outline-variant);cursor:pointer;margin-right:16px}.save-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--mat-sys-primary);cursor:pointer;margin-right:16px}.indentation-line[_ngcontent-%COMP%]{width:20px;border-left:1px solid var(--mat-sys-outline-variant);align-self:stretch;opacity:.5;margin-top:-4px;margin-bottom:-4px}@media(max-width:768px){[_nghost-%COMP%]{margin-left:-12px!important;margin-right:-12px!important;padding:4px 12px!important}.bot[_nghost-%COMP%]{padding-right:12px!important}.indentation-line[_ngcontent-%COMP%]{width:12px!important}.event-number-container[_ngcontent-%COMP%]{min-width:20px!important;margin-right:4px!important}}"]})};function FyA(i,e){if(i&1){let A=aA();I(0,"button",3),U("click",function(){L(A);let n=p();return G(n.toggleVideoRecording.emit())}),I(1,"mat-icon"),D(2,"videocam"),h()(),I(3,"div",4),lA(4,"div",5)(5,"div",5)(6,"div",5)(7,"div",5),h()}if(i&2){let A=p();_A("recording",A.isVideoRecording),H("matTooltip",A.isVideoRecording?A.i18n.turnOffCamTooltip:A.i18n.useCamTooltip)("disabled",A.disabled||!A.isBidiStreamingEnabled),Q(4),ft("height",4+A.micVolume*16,"px"),Q(),ft("height",4+A.micVolume*24,"px"),Q(),ft("height",4+A.micVolume*18,"px"),Q(),ft("height",4+A.micVolume*14,"px")}}function LyA(i,e){if(i&1){let A=aA();I(0,"div",2)(1,"div",6),D(2,"Live Flags"),h(),I(3,"div",7)(4,"mat-checkbox",8),U("change",function(n){L(A);let o=p();return G(o.flags.proactiveAudio=n.checked)}),D(5,"Proactive Audio"),h()(),I(6,"div",7)(7,"mat-checkbox",8),U("change",function(n){L(A);let o=p();return G(o.flags.enableAffectiveDialog=n.checked)}),D(8,"Affective Dialog"),h()(),I(9,"div",7)(10,"mat-checkbox",8),U("change",function(n){L(A);let o=p();return G(o.flags.enableSessionResumption=n.checked)}),D(11,"Session Resumption"),h()(),I(12,"div",7)(13,"mat-checkbox",8),U("change",function(n){L(A);let o=p();return G(o.flags.saveLiveBlob=n.checked)}),D(14,"Save Live Blob"),h()()()}if(i&2){let A=p();Q(4),H("checked",A.flags.proactiveAudio)("matTooltip",A.i18n.proactiveAudioTooltip)("disabled",A.disabled),Q(3),H("checked",A.flags.enableAffectiveDialog)("matTooltip",A.i18n.affectiveDialogTooltip)("disabled",A.disabled),Q(3),H("checked",A.flags.enableSessionResumption)("matTooltip",A.i18n.sessionResumptionTooltip)("disabled",A.disabled),Q(3),H("checked",A.flags.saveLiveBlob)("matTooltip",A.i18n.saveLiveBlobTooltip)("disabled",A.disabled)}}var By=class i{get inCall(){return this.isAudioRecording}isAudioRecording=!1;isVideoRecording=!1;micVolume=0;isBidiStreamingEnabled=!1;disabled=!1;toggleAudioRecording=new FA;toggleVideoRecording=new FA;i18n=w(C1);showFlags=!1;flags={proactiveAudio:!1,enableAffectiveDialog:!1,enableSessionResumption:!1,saveLiveBlob:!1};onCallClick(){this.showFlags=!1,this.toggleAudioRecording.emit(this.flags)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-call-controls"]],hostVars:2,hostBindings:function(A,t){A&2&&_A("in-call",t.inCall)},inputs:{isAudioRecording:"isAudioRecording",isVideoRecording:"isVideoRecording",micVolume:"micVolume",isBidiStreamingEnabled:"isBidiStreamingEnabled",disabled:"disabled"},outputs:{toggleAudioRecording:"toggleAudioRecording",toggleVideoRecording:"toggleVideoRecording"},decls:6,vars:6,consts:[[1,"call-btn-container",3,"mouseenter","mouseleave"],["mat-icon-button","",1,"audio-rec-btn",3,"click","disabled"],[1,"flags-panel"],["mat-icon-button","",1,"video-rec-btn",3,"click","matTooltip","disabled"],[1,"mic-visualizer"],[1,"bar"],[1,"flags-title"],[1,"flag-item"],["matTooltipPosition","left",3,"change","checked","matTooltip","disabled"]],template:function(A,t){A&1&&(T(0,FyA,8,12),I(1,"div",0),U("mouseenter",function(){return t.showFlags=!0})("mouseleave",function(){return t.showFlags=!1}),I(2,"button",1),U("click",function(){return t.onCallClick()}),I(3,"mat-icon"),D(4),h()(),T(5,LyA,15,12,"div",2),h()),A&2&&(O(t.isAudioRecording?0:-1),Q(2),_A("recording",t.isAudioRecording),H("disabled",t.disabled||!t.isBidiStreamingEnabled),Q(2),nA(t.isAudioRecording?"call_end":"call"),Q(),O(t.showFlags&&!t.isAudioRecording&&!t.disabled?5:-1))},dependencies:[li,qi,yi,Un,zt,Ha,rn,uO,ic],styles:['[_nghost-%COMP%]{display:flex;align-items:center;gap:4px;border-radius:28px;transition:all .2s ease}.in-call[_nghost-%COMP%]{background-color:var(--mat-sys-surface-variant)}button[_ngcontent-%COMP%]:not(:disabled){color:var(--mat-sys-on-surface-variant)!important}button[_ngcontent-%COMP%]:not(:disabled).recording{background-color:var(--mat-sys-error)!important;color:var(--mat-sys-on-error, #ffffff)!important}button.audio-rec-btn[_ngcontent-%COMP%]:not(.recording):not(:disabled){color:#34a853!important}button[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-on-surface-variant)!important;opacity:.38!important;cursor:not-allowed}.mic-visualizer[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;gap:3px;height:24px;margin-right:8px;width:24px}.mic-visualizer[_ngcontent-%COMP%] .bar[_ngcontent-%COMP%]{width:4px;background-color:#34a853;border-radius:2px;transition:height .1s ease-out}.call-btn-container[_ngcontent-%COMP%]{position:relative;display:inline-block}.flags-panel[_ngcontent-%COMP%]{position:absolute;bottom:100%;left:50%;transform:translate(-50%);margin-bottom:8px;background:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:12px;padding:12px;box-shadow:0 4px 20px #00000026;z-index:100;width:250px;display:flex;flex-direction:column;gap:8px;animation:_ngcontent-%COMP%_fadeIn .2s ease-out}.flags-panel[_ngcontent-%COMP%]:before{content:"";position:absolute;bottom:-8px;left:0;right:0;height:8px;background:transparent}.flags-panel[_ngcontent-%COMP%] .flags-title[_ngcontent-%COMP%]{font-weight:600;font-size:14px;color:var(--mat-sys-on-surface);margin-bottom:4px}.flags-panel[_ngcontent-%COMP%] .flag-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--mat-sys-on-surface-variant)}.flags-panel[_ngcontent-%COMP%] .flag-item[_ngcontent-%COMP%] .flag-label[_ngcontent-%COMP%]{font-weight:500}.flags-panel[_ngcontent-%COMP%] .flag-item[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{--mdc-checkbox-state-layer-size: 30px}@keyframes _ngcontent-%COMP%_fadeIn{0%{opacity:0;transform:translate(-50%) translateY(10px)}to{opacity:1;transform:translate(-50%) translateY(0)}}']})};var GyA=i=>({$implicit:i});function KyA(i,e){i&1&&lA(0,"div",9)}function UyA(i,e){if(i&1&&(I(0,"span",15),D(1),h()),i&2){let A=p(2).$implicit,t=p();ft("right",100-t.getRelativeStart(A.span),"%"),Q(),nA(t.formatDuration(A.span.end_time-A.span.start_time))}}function TyA(i,e){if(i&1){let A=aA();I(0,"div",6),U("click",function(){L(A);let n=p().$implicit,o=p();return G(o.selectRow(n))}),I(1,"div",7)(2,"div",8),ke(3,KyA,1,0,"div",9,Ja),h(),I(5,"span",10),D(6),h(),I(7,"div",11),D(8),h()(),I(9,"div",12)(10,"div",13),D(11),h(),T(12,UyA,2,3,"span",14),h()()}if(i&2){let A=p().$implicit,t=p(),n=Bi(12);_A("selected",t.rowSelected(A)),H("id",ZE("trace-node-",A.span.span_id))("appHtmlTooltip",n)("appHtmlTooltipContext",jl(19,GyA,t.getUiEvent(A)))("appHtmlTooltipDisabled",!t.getUiEvent(A)),Q(3),_e(t.getArray(A.level)),Q(2),_A("is-event-row",t.isEventRow(A)),Q(),Ee(" ",t.getSpanIcon(A.span.name)," "),Q(),_A("is-event-row",t.isEventRow(A)),Q(),Ee(" ",t.formatSpanName(A.span.name)," "),Q(2),ft("left",t.getRelativeStart(A.span),"%")("width",t.getRelativeWidth(A.span),"%"),Q(),Ee(" ",t.formatDuration(A.span.end_time-A.span.start_time)," "),Q(),O(t.getRelativeWidth(A.span)<10?12:-1)}}function OyA(i,e){if(i&1&&T(0,TyA,13,21,"div",5),i&2){let A=e.$implicit,t=p();O(t.shouldShowNode(A)?0:-1)}}function JyA(i,e){if(i&1&&(I(0,"div",16),lA(1,"app-event-content",17),h()),i&2){let A=p().$implicit;Q(),H("uiEvent",A)("index",0)}}function YyA(i,e){if(i&1&&T(0,JyA,2,2,"div",16),i&2){let A=e.$implicit;O(A?0:-1)}}var hy=class i{spans=[];invocationId="";uiEvents=[];shouldShowEvent;tree=[];baseStartTimeMs=0;totalDurationMs=1;rootLatencyNanos=0;flatTree=[];shouldShowNode(e){let A=this.getUiEvent(e);return A&&this.shouldShowEvent?this.shouldShowEvent(A):!0}traceLabelIconMap=new Map([["Invocation","start"],["agent_run","robot"],["invoke_agent","robot_2"],["tool","build"],["execute_tool","build"],["call_llm","chat"]]);selectedRow=void 0;traceService=w(ng);constructor(){}selectRootSpan(){if(this.tree&&this.tree.length>0){if(this.selectedRow&&this.selectedRow.span_id===this.tree[0].span_id)return;this.traceService.selectedRow(this.tree[0])}}isRootSpanSelected(){return!this.selectedRow||!this.tree||this.tree.length===0?!1:String(this.selectedRow.span_id)===String(this.tree[0].span_id)}ngOnInit(){this.rebuildTree(),this.traceService.selectedTraceRow$.subscribe(e=>{this.selectedRow=e,e&&setTimeout(()=>{let A=document.getElementById("trace-node-"+e.span_id);A&&A.scrollIntoView({behavior:"smooth",block:"nearest"})},50)})}ngOnChanges(e){e.spans&&!e.spans.isFirstChange()&&this.rebuildTree()}rebuildTree(){if(!this.spans||this.spans.length===0){this.tree=[],this.flatTree=[],this.rootLatencyNanos=0;return}this.tree=this.buildSpanTree(this.spans),this.flatTree=[],this.tree.forEach(A=>{A.children&&this.flatTree.push(...this.flattenTree(A.children,0))});let e=this.getGlobalTimes(this.spans);this.baseStartTimeMs=e.start,this.totalDurationMs=e.duration,this.tree&&this.tree.length>0?this.rootLatencyNanos=this.tree[0].end_time-this.tree[0].start_time:this.rootLatencyNanos=0}buildSpanTree(e){let A=e.map(o=>P({},o)),t=new Map,n=[];return A.forEach(o=>t.set(String(o.span_id),o)),A.forEach(o=>{if(o.parent_span_id&&t.has(String(o.parent_span_id))){let a=t.get(String(o.parent_span_id));a.children=a.children||[],a.children.push(o)}else n.push(o)}),n}getGlobalTimes(e){let A=Math.min(...e.map(n=>this.toMs(n.start_time))),t=Math.max(...e.map(n=>this.toMs(n.end_time)));return{start:A,duration:t-A}}toMs(e){return e/1e6}formatDuration(e){if(e===0)return"0us";if(e<1e3)return`${e}ns`;if(e<1e6)return`${(e/1e3).toFixed(2)}us`;if(e<1e9)return`${(e/1e6).toFixed(2)}ms`;if(e<6e10)return`${(e/1e9).toFixed(2)}s`;let A=Math.floor(e/6e10),t=(e%6e10/1e9).toFixed(2);return`${A}m ${t}s`}getRelativeStart(e){return(this.toMs(e.start_time)-this.baseStartTimeMs)/this.totalDurationMs*100}getRelativeWidth(e){return(this.toMs(e.end_time)-this.toMs(e.start_time))/this.totalDurationMs*100}flattenTree(e,A=0){return e.flatMap(n=>[{span:n,level:A},...n.children?this.flattenTree(n.children,A+1):[]])}getSpanIcon(e){for(let[A,t]of this.traceLabelIconMap.entries())if(e.startsWith(A))return t;return"start"}formatSpanName(e){return e.startsWith("invoke_agent ")||e.startsWith("execute_tool ")?e.substring(13):e.startsWith("invoke_node ")?e.substring(12):e}getArray(e){return Array.from({length:e})}selectRow(e){this.selectedRow&&this.selectedRow.span_id==e.span.span_id||this.traceService.selectedRow(e.span)}rowSelected(e){return!this.selectedRow||!e?.span?!1:String(this.selectedRow.span_id)===String(e.span.span_id)}isEventRow(e){let A=this.getEventId(e);return A&&this.uiEvents&&this.uiEvents.length>0?this.uiEvents.some(t=>t.event?.id===A):!1}getEventId(e){return e?.span?.attrEventId??""}getUiEvent(e){let A=this.getEventId(e);return A&&this.uiEvents&&this.uiEvents.length>0&&this.uiEvents.find(t=>t.event?.id===A)||null}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-trace-tree"]],inputs:{spans:"spans",invocationId:"invocationId",uiEvents:"uiEvents",shouldShowEvent:"shouldShowEvent"},features:[ii],decls:13,vars:6,consts:[["eventTooltip",""],[1,"invocation-id-container",3,"click"],[1,"invocation-id",3,"matTooltip"],[1,"total-latency"],[1,"trace-container"],[1,"trace-row",3,"selected","id","appHtmlTooltip","appHtmlTooltipContext","appHtmlTooltipDisabled"],[1,"trace-row",3,"click","id","appHtmlTooltip","appHtmlTooltipContext","appHtmlTooltipDisabled"],[1,"trace-row-left"],[1,"trace-indent"],[1,"indent-connector"],[1,"material-symbols-outlined",2,"margin-right","8px"],[1,"trace-label"],[1,"trace-bar-container"],[1,"trace-bar"],[1,"short-trace-bar-duration",3,"right"],[1,"short-trace-bar-duration"],[1,"event-tooltip-container"],[3,"uiEvent","index"]],template:function(A,t){A&1&&(I(0,"div")(1,"div",1),U("click",function(){return t.selectRootSpan()}),I(2,"span"),D(3,"Invocation ID: "),h(),I(4,"div",2),D(5),h(),I(6,"span",3),D(7),h()(),I(8,"div",4),ke(9,OyA,1,1,null,null,ni),h()(),kt(11,YyA,1,1,"ng-template",null,0,PC)),A&2&&(Q(),_A("selected",t.isRootSpanSelected()),ie("id",t.tree&&t.tree.length>0?"trace-node-"+t.tree[0].span_id:null),Q(3),H("matTooltip",t.invocationId),Q(),nA(t.invocationId),Q(2),Ee("Total latency: ",t.formatDuration(t.rootLatencyNanos)),Q(2),_e(t.flatTree))},dependencies:[qi,Un,Ha,rn,ey,bE],styles:[".trace-container[_ngcontent-%COMP%]{white-space:nowrap;font-size:12px;overflow-x:auto;padding:8px}.trace-label[_ngcontent-%COMP%]{color:var(--trace-label-color, #e3e3e3);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;font-size:12px}.trace-bar-container[_ngcontent-%COMP%]{position:relative;height:18px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:var(--mat-sys-primary);border-radius:4px;padding-left:6px;box-sizing:border-box;overflow:hidden;font-size:11px;line-height:18px;color:var(--mat-sys-on-primary);font-family:Google Sans;transition:background-color .2s,color .2s}.trace-duration[_ngcontent-%COMP%]{color:var(--trace-duration-color, #888);font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;position:relative;height:32px}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:#ccc}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:#ccc}.trace-label[_ngcontent-%COMP%]{flex:1;min-width:0;font-size:13px}.trace-bar-container[_ngcontent-%COMP%]{flex:1;min-width:0}.short-trace-bar-duration[_ngcontent-%COMP%]{position:absolute;color:var(--trace-tree-short-trace-bar-duration-color);padding-right:6px}.trace-row[_ngcontent-%COMP%]{align-items:center;cursor:pointer;scroll-margin-top:40px}.trace-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant, rgba(0, 0, 0, .04))}.trace-row.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))}.trace-row-left[_ngcontent-%COMP%]{display:flex;min-width:250px;width:20%;max-width:350px}.invocation-id-container[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:11px;font-weight:600;letter-spacing:.3px;margin-bottom:6px;padding:8px 12px;border-radius:12px 12px 0 0;background-color:var(--mat-sys-surface);display:flex;width:100%;box-sizing:border-box;align-items:center;position:sticky;top:-20px;z-index:10;box-shadow:0 2px 4px #0000000d;cursor:pointer}.invocation-id-container[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant)}.invocation-id-container.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))}.invocation-id-container[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:first-child{opacity:.8;margin-right:6px;text-transform:uppercase}.invocation-id[_ngcontent-%COMP%]{font-family:Google Sans Mono,Roboto Mono,monospace;padding:2px 6px;border-radius:4px;color:var(--mat-sys-on-surface)}.total-latency[_ngcontent-%COMP%]{margin-left:auto;background:transparent;color:var(--mat-sys-on-surface);padding:2px 8px;font-size:11px;font-weight:600;letter-spacing:.2px}.trace-row-left[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .trace-row-left[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-span-div-color)}.trace-row-left[_ngcontent-%COMP%] .is-event-row[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-is-event-row-color)}.event-tooltip-container[_ngcontent-%COMP%]{max-width:800px;max-height:200px;overflow:auto;padding:8px;background:var(--mat-sys-surface-container-low, #202124);color:var(--mat-sys-on-surface, #e8eaed);border-radius:8px;box-shadow:0 4px 16px #00000080;border:1px solid var(--mat-sys-outline-variant, rgba(255, 255, 255, .1))}.event-tooltip-container[_ngcontent-%COMP%] app-content-bubble{max-height:160px;overflow-y:auto;display:block}"]})};var HyA=["videoContainer"],zyA=["autoScroll"],PyA=["messageTextarea"],jyA=i=>({text:i,thought:!1,isReadme:!0}),VyA=()=>[],qyA=(i,e)=>e.metricName,WyA=(i,e)=>e.branchId,ZyA=(i,e)=>e.event;function XyA(i,e){i&1&&(I(0,"span",14),D(1,"PASS"),h())}function $yA(i,e){i&1&&(I(0,"span",15),D(1,"FAIL"),h())}function ADA(i,e){if(i&1&&(I(0,"span",21),D(1),h()),i&2){let A=e.$implicit;ft("color",A.evalStatus==1?"var(--app-color-success)":"var(--app-color-error)"),Q(),Ya(" ",A.metricName,": ",A.score," ")}}function eDA(i,e){if(i&1&&(I(0,"div")(1,"span",17),D(2,"Metrics"),h(),I(3,"div",19),ke(4,ADA,2,4,"span",20,qyA),h()()),i&2){p();let A=Ki(0);Q(4),_e(A.overallEvalMetricResults)}}function tDA(i,e){if(i&1&&(ro(0),I(1,"div",8)(2,"div",11)(3,"h3",12),D(4,"Evaluation Result"),h(),I(5,"div",13),T(6,XyA,2,0,"span",14)(7,$yA,2,0,"span",15),h()(),I(8,"div",16)(9,"div")(10,"span",17),D(11,"Case ID"),h(),I(12,"div",18),D(13),h()(),I(14,"div")(15,"span",17),D(16,"Set ID"),h(),I(17,"div",18),D(18),h()(),T(19,eDA,6,0,"div"),h()()),i&2){let A=so(p(2).evalCaseResult());Q(6),O(A.finalEvalStatus==1?6:7),Q(7),nA(A.evalId),Q(5),nA(A.setId),Q(),O(A.overallEvalMetricResults!=null&&A.overallEvalMetricResults.length?19:-1)}}function iDA(i,e){if(i&1&&(I(0,"div",9),dn(1,22),h()),i&2){let A=p(2);Q(),H("ngComponentOutlet",A.markdownComponent)("ngComponentOutletInputs",jl(2,jyA,A.agentReadme))}}function nDA(i,e){if(i&1&&(I(0,"div",26),lA(1,"app-trace-tree",27),h()),i&2){p();let A=Ki(0),t=p(3);ft("display",t.viewMode==="traces"?"":"none"),Q(),H("spans",t.spansByInvocationId.get(A.event.id)||t.spansByInvocationId.get(A.event.invocationId)||Lc(6,VyA))("invocationId",A.event.invocationId||A.event.id||"")("uiEvents",t.uiEvents)("shouldShowEvent",t.shouldShowEvent)}}function oDA(i,e){if(i&1){let A=aA();ro(0),I(1,"app-event-row",24),U("rowClick",function(n){L(A);let o=p(3);return G(o.handleRowClick(n.event,n.uiEvent,n.index))})("handleKeydown",function(n){L(A);let o=p(3);return G(o.handleKeydown.emit(n))})("cancelEditMessage",function(n){L(A);let o=p(3);return G(o.cancelEditMessage.emit(n))})("saveEditMessage",function(n){L(A);let o=p(3);return G(o.saveEditMessage.emit(n))})("userEditEvalCaseMessageChange",function(n){L(A);let o=p(3);return G(o.userEditEvalCaseMessageChange.emit(n))})("openViewImageDialog",function(n){L(A);let o=p(3);return G(o.openViewImageDialog.emit(n))})("openBase64InNewTab",function(n){L(A);let o=p(3);return G(o.openBase64InNewTab.emit(n))})("editEvalCaseMessage",function(n){L(A);let o=p(3);return G(o.editEvalCaseMessage.emit(n))})("deleteEvalCaseMessage",function(n){L(A);let o=p(3);return G(o.deleteEvalCaseMessage.emit(n))})("editFunctionArgs",function(n){L(A);let o=p(3);return G(o.editFunctionArgs.emit(n))})("clickEvent",function(n){L(A);let o=p(3);return G(o.clickEvent.emit(n))})("longRunningResponseComplete",function(n){L(A);let o=p(3);return G(o.longRunningResponseComplete.emit(n))})("agentStateClick",function(n){L(A);let o=p(3);return G(o.handleAgentStateClick(n.event,n.index))}),h(),T(2,nDA,2,7,"div",25)}if(i&2){let A=p().$implicit,t=p(2),n=so(A.event),o=t.shouldShowEvent?t.shouldShowEvent(n):!0;Q(),ft("display",t.viewMode==="events"&&o||t.viewMode==="traces"&&n.role==="user"&&o?"":"none"),H("isSelectable",t.viewMode!=="traces")("uiEvent",n)("index",A.index)("uiEvents",t.uiEvents)("isSelected",t.isMessageEventSelected(A.index))("appName",t.appName)("userId",t.userId)("sessionId",t.sessionId)("sessionName",t.sessionName())("evalCase",t.evalCase)("isEvalEditMode",t.isEvalEditMode)("isEvalCaseEditing",t.isEvalCaseEditing)("isEditFunctionArgsEnabled",t.isEditFunctionArgsEnabled)("userEditEvalCaseMessage",t.userEditEvalCaseMessage)("agentGraphData",t.agentGraphData)("allWorkflowNodes",t.getAllWorkflowNodes(A.index))("isUserFeedbackEnabled",t.isUserFeedbackEnabled()??!1)("isLoadingAgentResponse",t.isLoadingAgentResponse()??!1),Q(),O(n.role==="bot"&&t.isFirstEventForInvocation(n,A.index)?2:-1)}}function aDA(i,e){if(i&1&&(I(0,"span",32),D(1),h()),i&2){let A=p().$implicit;H("matTooltip","Branch "+A.branchId),Q(),nA(A.branchId)}}function rDA(i,e){if(i&1){let A=aA();I(0,"app-event-row",24),U("rowClick",function(n){L(A);let o=p(5);return G(o.handleRowClick(n.event,n.uiEvent,n.index))})("handleKeydown",function(n){L(A);let o=p(5);return G(o.handleKeydown.emit(n))})("cancelEditMessage",function(n){L(A);let o=p(5);return G(o.cancelEditMessage.emit(n))})("saveEditMessage",function(n){L(A);let o=p(5);return G(o.saveEditMessage.emit(n))})("userEditEvalCaseMessageChange",function(n){L(A);let o=p(5);return G(o.userEditEvalCaseMessageChange.emit(n))})("openViewImageDialog",function(n){L(A);let o=p(5);return G(o.openViewImageDialog.emit(n))})("openBase64InNewTab",function(n){L(A);let o=p(5);return G(o.openBase64InNewTab.emit(n))})("editEvalCaseMessage",function(n){L(A);let o=p(5);return G(o.editEvalCaseMessage.emit(n))})("deleteEvalCaseMessage",function(n){L(A);let o=p(5);return G(o.deleteEvalCaseMessage.emit(n))})("editFunctionArgs",function(n){L(A);let o=p(5);return G(o.editFunctionArgs.emit(n))})("clickEvent",function(n){L(A);let o=p(5);return G(o.clickEvent.emit(n))})("longRunningResponseComplete",function(n){L(A);let o=p(5);return G(o.longRunningResponseComplete.emit(n))})("agentStateClick",function(n){L(A);let o=p(5);return G(o.handleAgentStateClick(n.event,n.index))}),h()}if(i&2){let A=e.$implicit,t=p(5),n=A.event,o=t.shouldShowEvent?t.shouldShowEvent(n):!0;ft("display",t.viewMode==="events"&&o||t.viewMode==="traces"&&n.role==="user"&&o?"":"none"),H("isSelectable",t.viewMode!=="traces")("uiEvent",n)("index",A.globalIndex)("uiEvents",t.uiEvents)("isSelected",t.isMessageEventSelected(A.globalIndex))("appName",t.appName)("userId",t.userId)("sessionId",t.sessionId)("sessionName",t.sessionName())("evalCase",t.evalCase)("isEvalEditMode",t.isEvalEditMode)("isEvalCaseEditing",t.isEvalCaseEditing)("isEditFunctionArgsEnabled",t.isEditFunctionArgsEnabled)("userEditEvalCaseMessage",t.userEditEvalCaseMessage)("agentGraphData",t.agentGraphData)("allWorkflowNodes",t.getAllWorkflowNodes(A.globalIndex))("isUserFeedbackEnabled",t.isUserFeedbackEnabled()??!1)("isLoadingAgentResponse",t.isLoadingAgentResponse()??!1)}}function sDA(i,e){if(i&1&&(I(0,"mat-tab"),kt(1,aDA,2,2,"ng-template",29),I(2,"div",30),ke(3,rDA,1,20,"app-event-row",31,ZyA),h()()),i&2){let A=e.$implicit;Q(3),_e(A.events)}}function lDA(i,e){if(i&1&&(I(0,"div",23)(1,"mat-tab-group",28),ke(2,sDA,5,0,"mat-tab",null,WyA),h()()),i&2){let A=p().$implicit;Q(2),_e(A.branches)}}function gDA(i,e){if(i&1&&T(0,oDA,3,22)(1,lDA,4,0,"div",23),i&2){let A=e.$implicit;O(A.type==="event"?0:A.type==="branches"?1:-1)}}function cDA(i,e){i&1&&(I(0,"div",10),lA(1,"mat-progress-bar",33),h())}function CDA(i,e){if(i&1){let A=aA();I(0,"div",7,0),U("scroll",function(n){L(A);let o=p();return G(o.onScroll.next(n))})("wheel",function(){L(A);let n=p();return G(n.onManualScroll())})("touchmove",function(){L(A);let n=p();return G(n.onManualScroll())})("mousedown",function(){L(A);let n=p();return G(n.onManualScroll())})("keydown",function(){L(A);let n=p();return G(n.onManualScroll())}),T(2,tDA,20,5,"div",8),T(3,iDA,2,4,"div",9),ke(4,gDA,2,1,null,null,ni),T(6,cDA,2,0,"div",10),h()}if(i&2){let A=p();Q(2),O(A.showEvalSummary()&&A.evalCaseResult()?2:-1),Q(),O(A.uiEvents.length===0&&A.agentReadme?3:-1),Q(),_e(A.displayItems),Q(2),O(A.isLoadingAgentResponse()?6:-1)}}function dDA(i,e){if(i&1){let A=aA();I(0,"div",51),lA(1,"img",52),I(2,"button",53),U("click",function(){L(A);let n=p().$index,o=p(4);return G(o.removeFile.emit(n))}),I(3,"mat-icon",54),D(4,"close"),h()()()}if(i&2){let A=p().$implicit;Q(),H("src",A.url,mo)}}function IDA(i,e){if(i&1){let A=aA();I(0,"div",50)(1,"button",53),U("click",function(){L(A);let n=p().$index,o=p(4);return G(o.removeFile.emit(n))}),I(2,"mat-icon",54),D(3,"close"),h()(),I(4,"div",55)(5,"mat-icon"),D(6,"insert_drive_file"),h(),I(7,"span"),D(8),h()()()}if(i&2){let A=p().$implicit;Q(8),nA(A.file.name)}}function BDA(i,e){if(i&1&&(I(0,"div"),T(1,dDA,5,1,"div",51)(2,IDA,9,1,"div",50),h()),i&2){let A=e.$implicit;Q(),O(A.file.type.startsWith("image/")?1:A.file.type.startsWith("image/")?-1:2)}}function hDA(i,e){if(i&1){let A=aA();I(0,"div",50)(1,"button",53),U("click",function(){L(A);let n=p(4);return G(n.removeStateUpdate.emit())}),I(2,"mat-icon",54),D(3,"close"),h()(),I(4,"div",55)(5,"span"),D(6),h()()()}if(i&2){let A=p(4);Q(6),nA(A.i18n.updatedSessionStateChipLabel)}}function EDA(i,e){if(i&1&&(I(0,"div",39),ke(1,BDA,3,1,"div",null,ni),T(3,hDA,7,1,"div",50),h()),i&2){let A=p(3);Q(),_e(A.selectedFiles),Q(2),O(A.updatedSessionState?3:-1)}}function QDA(i,e){if(i&1){let A=aA();I(0,"button",42),mt(1,"async"),U("click",function(){L(A);let n=p(3);return G(n.updateState.emit())}),I(2,"mat-icon"),D(3,"tune"),h(),I(4,"span"),D(5),h()()}if(i&2){let A=p(3);H("disabled",(A.isLoadingAgentResponse()??!1)||!Ft(1,2,A.isManualStateUpdateEnabledObs)),Q(5),nA(A.i18n.updateStateMenuLabel)}}function uDA(i,e){if(i&1){let A=aA();I(0,"button",56),U("click",function(n){L(A);let o=p(3);return G(o.stopMessage.emit(n))}),I(1,"mat-icon"),D(2,"stop"),h()()}if(i&2){let A=p(3);H("matTooltip",A.i18n.stopMessageTooltip)}}function pDA(i,e){if(i&1){let A=aA();I(0,"button",57),U("click",function(n){L(A);let o=p(3);return G(o.sendMessage.emit(n))}),I(1,"mat-icon"),D(2,"send"),h()()}if(i&2){let A=p(3);H("matTooltip",A.i18n.sendMessageTooltip)}}function fDA(i,e){if(i&1){let A=aA();I(0,"div",35)(1,"input",36,1),U("change",function(n){L(A);let o=p(2);return G(o.fileSelect.emit(n))}),h(),I(3,"div",37)(4,"mat-form-field",38),T(5,EDA,4,1,"div",39),I(6,"button",40)(7,"mat-icon"),D(8,"add"),h()(),I(9,"mat-menu",41,2)(11,"button",42),mt(12,"async"),U("click",function(){L(A);let n=Bi(2);return G(n.click())}),I(13,"mat-icon"),D(14,"attach_file"),h(),I(15,"span"),D(16),h()(),T(17,QDA,6,4,"button",43),h(),I(18,"textarea",44,3),U("ngModelChange",function(n){L(A);let o=p(2);return G(o.userInputChange.emit(n))})("keydown.enter",function(n){L(A);let o=p(2);return G(!o.isLoadingAgentResponse()&&o.sendMessage.emit(n))}),h(),I(20,"div",45)(21,"app-call-controls",46),mt(22,"async"),U("toggleAudioRecording",function(n){L(A);let o=p(2);return G(o.toggleAudioRecording.emit(n))})("toggleVideoRecording",function(){L(A);let n=p(2);return G(n.toggleVideoRecording.emit())}),h(),T(23,uDA,3,1,"button",47)(24,pDA,3,1,"button",48),h()(),lA(25,"div",49,4),h()()}if(i&2){let A=Bi(10),t=p(2);_A("video-streaming",t.isVideoRecording),Q(5),O(t.selectedFiles.length&&t.appName!=""||t.updatedSessionState?5:-1),Q(),H("matMenuTriggerFor",A)("disabled",t.isLoadingAgentResponse()??!1)("matTooltip","Actions"),Q(5),H("disabled",(t.isLoadingAgentResponse()??!1)||!Ft(12,20,t.isMessageFileUploadEnabledObs)),Q(5),nA(t.i18n.uploadFileTooltip),Q(),O(t.hideMoreOptionsButton()?-1:17),Q(),H("ngModel",t.userInput)("placeholder",t.i18n.typeMessagePlaceholder)("disabled",t.isLoadingAgentResponse()??!1),Q(3),H("isAudioRecording",t.isAudioRecording)("isVideoRecording",t.isVideoRecording)("micVolume",t.micVolume)("isBidiStreamingEnabled",Ft(22,22,t.isBidiStreamingEnabledObs)??!1)("disabled",t.isLoadingAgentResponse()??!1),Q(2),O(t.isLoadingAgentResponse()?23:24),Q(2),_A("visible",t.isVideoRecording)}}function mDA(i,e){if(i&1&&T(0,fDA,27,24,"div",34),i&2){let A=p();O(A.canEditSession()?0:-1)}}function wDA(i,e){i&1&&(I(0,"div",6),lA(1,"mat-progress-spinner",58),h())}var h1=class i{appName="";agentReadme="";sessionName=ve("");uiEvents=[];showBranches=!1;traceData=[];isChatMode=!0;evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;agentGraphData=null;isEditFunctionArgsEnabled=!1;isTokenStreamingEnabled=!1;useSse=!1;userInput="";userEditEvalCaseMessage="";selectedFiles=[];updatedSessionState=null;selectedMessageIndex=void 0;isAudioRecording=!1;micVolume=0;isVideoRecording=!1;userId="";sessionId="";viewMode="events";shouldShowEvent;spansByInvocationId=new Map;displayItems=[];eventsScrollTop=-1;tracesScrollTop=-1;userInputChange=new FA;userEditEvalCaseMessageChange=new FA;clickEvent=new FA;handleKeydown=new FA;cancelEditMessage=new FA;saveEditMessage=new FA;openViewImageDialog=new FA;openBase64InNewTab=new FA;editEvalCaseMessage=new FA;deleteEvalCaseMessage=new FA;editFunctionArgs=new FA;fileSelect=new FA;removeFile=new FA;removeStateUpdate=new FA;sendMessage=new FA;stopMessage=new FA;updateState=new FA;toggleAudioRecording=new FA;toggleVideoRecording=new FA;longRunningResponseComplete=new FA;toggleHideIntermediateEvents=new FA;toggleSse=new FA;manualScroll=new FA;videoContainer;scrollContainer;textarea;scrollInterrupted=!1;scrollHeight=0;lastMessageRef=null;nextPageToken="";scrollTimeout=null;mutationObserver=null;i18n=w(C1);uiStateService=w(ag);themeService=w(og);stringToColorService=w(g2);markdownComponent=w(g1);featureFlagService=w(Nr);agentService=w(el);sessionService=w(tl);destroyRef=w(Er);MediaType=iC;JSON=JSON;Object=Object;String=String;isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled();canEditSession=mA(!0);isUserFeedbackEnabled=sr(this.featureFlagService.isFeedbackServiceEnabled());isLoadingAgentResponse=sr(this.agentService.getLoadingState());hideMoreOptionsButton=sr(this.featureFlagService.isMoreOptionsButtonHidden());onScroll=new ne;sanitizer=w(Qs);onManualScroll(){this.scrollInterrupted=!0,this.manualScroll.emit()}hideIntermediateEvents=ve(!1);invocationDisplayMap=ve(new Map);evalCaseResult=ve(null);showEvalSummary=ve(!1);constructor(){Fn(()=>{let e=this.sessionName();e&&(this.nextPageToken="",this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(oo(),Bt(A=>A)).subscribe(()=>{this.uiStateService.lazyLoadMessages(e,{pageSize:100,pageToken:this.nextPageToken}).pipe(oo()).subscribe()}))}),Fn(()=>{this.isLoadingAgentResponse()||this.focusInput()})}ngOnInit(){this.uiStateService.isSessionLoading().pipe(xr(this.destroyRef)).subscribe(e=>{e||this.focusInput()}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(oo(),Bt(e=>e),Mi(()=>Vi(this.uiStateService.onNewMessagesLoaded().pipe(mi(e=>{this.nextPageToken=e.nextPageToken??"",e.isBackground||this.restoreScrollPosition()})),this.onScroll.pipe(Mi(e=>{let A=e.target;return A.scrollTop!==0?Br:this.nextPageToken?(this.scrollHeight=A.scrollHeight,this.uiStateService.lazyLoadMessages(this.sessionName(),{pageSize:100,pageToken:this.nextPageToken}).pipe(oo(),aa(()=>EN))):Br})))),xr(this.destroyRef)).subscribe()}ngAfterViewInit(){if(this.scrollContainer?.nativeElement){let e=this.scrollContainer.nativeElement;e.addEventListener("scroll",()=>{let A=Math.abs(e.scrollHeight-e.scrollTop-e.clientHeight)<50;this.scrollInterrupted=!A}),this.mutationObserver=new MutationObserver(()=>{this.scrollInterrupted||this.scrollToBottom()}),this.mutationObserver.observe(e,{childList:!0,subtree:!0,characterData:!0}),this.destroyRef.onDestroy(()=>{this.mutationObserver?.disconnect()})}}ngOnChanges(e){if(e.viewMode){let A=e.viewMode.previousValue,t=e.viewMode.currentValue;this.scrollContainer?.nativeElement&&(A==="events"?this.eventsScrollTop=this.scrollContainer.nativeElement.scrollTop:A==="traces"&&(this.tracesScrollTop=this.scrollContainer.nativeElement.scrollTop)),setTimeout(()=>{this.scrollContainer?.nativeElement&&(t==="events"&&this.eventsScrollTop!==-1?this.scrollContainer.nativeElement.scrollTop=this.eventsScrollTop:t==="traces"&&this.tracesScrollTop!==-1?this.scrollContainer.nativeElement.scrollTop=this.tracesScrollTop:this.scrollToBottom())})}if(e.appName&&this.focusInput(),(e.appName||e.uiEvents)&&this.uiEvents.length===0&&this.agentReadme&&setTimeout(()=>this.scrollToTop(),0),e.uiEvents){let A=this.uiEvents[this.uiEvents.length-1];A!==this.lastMessageRef&&((A?.role==="user"||A?.isLoading===!0)&&(this.scrollInterrupted=!1),this.scrollToBottom()),this.lastMessageRef=A}e.traceData&&this.traceData&&this.rebuildTrace(),(e.uiEvents||e.showBranches||e.viewMode)&&this.computeDisplayItems()}computeDisplayItems(){if(!this.showBranches||this.viewMode==="traces"){this.displayItems=this.uiEvents.map((t,n)=>({type:"event",event:t,index:n}));return}let e=[],A=null;this.uiEvents.forEach((t,n)=>{let o=t.event?.branch;if(o){A||(A={type:"branches",branchesMap:new Map,startIndex:n});let a=A.branchesMap.get(o)||[];a.push({event:t,globalIndex:n}),A.branchesMap.set(o,a)}else A&&(e.push(this.finalizeGroup(A)),A=null),e.push({type:"event",event:t,index:n})}),A&&e.push(this.finalizeGroup(A)),this.displayItems=e}finalizeGroup(e){let A=[];return e.branchesMap.forEach((t,n)=>{A.push({branchId:n,events:t})}),{type:"branches",branches:A,startIndex:e.startIndex}}rebuildTrace(){let e=this.traceData.reduce((A,t)=>{let n=String(t.trace_id),o=A.get(n);return o?(o.push(t),o.sort((a,r)=>a.start_time-r.start_time)):A.set(n,[t]),A},new Map);this.spansByInvocationId=new Map;for(let[A,t]of e){let n=t.find(o=>o.attrInvocationId!==void 0)?.attrInvocationId;if(!n){let o=t.find(a=>a.attrAssociatedEventIds!==void 0)?.attrAssociatedEventIds;o&&o.length>0&&(n=o[0])}n||(n=A),n&&this.spansByInvocationId.set(String(n),t)}}isFirstEventForInvocation(e,A){let t=e.event?.invocationId||e.event?.id;if(!t)return!1;for(let n=A-1;n>=0;n--){let o=this.uiEvents[n],a=o.event?.invocationId||o.event?.id;if(o.role==="bot"&&a===t)return!1}return!0}scrollToBottom(){this.sessionId&&(this.scrollInterrupted||(this.scrollTimeout&&clearTimeout(this.scrollTimeout),this.scrollTimeout=setTimeout(()=>{this.scrollContainer?.nativeElement.scrollTo({top:this.scrollContainer.nativeElement.scrollHeight,behavior:"auto"}),this.scrollTimeout=null},50)))}scrollToTop(){setTimeout(()=>{this.scrollContainer?.nativeElement.scrollTo({top:0,behavior:"smooth"})},50)}focusInput(){setTimeout(()=>{this.textarea?.nativeElement?.focus()},50)}isMessageEventSelected(e){return e===this.selectedMessageIndex}restoreScrollPosition(){if(!this.scrollHeight){this.scrollInterrupted=!1,this.scrollToBottom();return}let e=this.scrollContainer?.nativeElement;e&&(e.scrollTop=e.scrollHeight-this.scrollHeight,this.scrollHeight=0)}getAllWorkflowNodes(e){let A={};for(let t=0;t<=e;t++){let o=this.uiEvents[t].event,a=o?.actions?.agentState?.nodes,r=o?.nodeInfo?.path;a&&r&&(A[r]||(A[r]={}),Object.assign(A[r],a))}return Object.keys(A).length>0?A:null}handleAgentStateClick(e,A){e.stopPropagation(),A===this.selectedMessageIndex||this.clickEvent.emit(A)}handleRowClick(e,A,t){let n=window.getSelection();n&&n.toString().length>0||this.clickEvent.emit(t)}handleKeyboardNavigation(e){if(this.selectedMessageIndex===void 0)return;let A=document.activeElement;if(A&&(A.tagName==="INPUT"||A.tagName==="TEXTAREA"||A.isContentEditable)||e.key!=="ArrowUp"&&e.key!=="ArrowDown")return;e.preventDefault();let t;e.key==="ArrowDown"?t=this.selectedMessageIndex+1>=this.uiEvents.length?0:this.selectedMessageIndex+1:t=this.selectedMessageIndex-1<0?this.uiEvents.length-1:this.selectedMessageIndex-1,this.clickEvent.emit(t),this.scrollToSelectedMessage(t)}scrollToSelectedMessage(e){let A=e!==void 0?e:this.selectedMessageIndex;A!==void 0&&setTimeout(()=>{if(!this.scrollContainer?.nativeElement)return;let t=this.scrollContainer.nativeElement.querySelectorAll(".message-row-container");t&&t[A]&&t[A].scrollIntoView({behavior:"smooth",block:"nearest",inline:"nearest"})},50)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-chat-panel"]],viewQuery:function(A,t){if(A&1&&Wt(HyA,5,ce)(zyA,5)(PyA,5),A&2){let n;se(n=le())&&(t.videoContainer=n.first),se(n=le())&&(t.scrollContainer=n.first),se(n=le())&&(t.textarea=n.first)}},hostBindings:function(A,t){A&1&&U("keydown",function(o){return t.handleKeyboardNavigation(o)},Fg)},inputs:{appName:"appName",agentReadme:"agentReadme",sessionName:[1,"sessionName"],uiEvents:"uiEvents",showBranches:"showBranches",traceData:"traceData",isChatMode:"isChatMode",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",agentGraphData:"agentGraphData",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",isTokenStreamingEnabled:"isTokenStreamingEnabled",useSse:"useSse",userInput:"userInput",userEditEvalCaseMessage:"userEditEvalCaseMessage",selectedFiles:"selectedFiles",updatedSessionState:"updatedSessionState",selectedMessageIndex:"selectedMessageIndex",isAudioRecording:"isAudioRecording",micVolume:"micVolume",isVideoRecording:"isVideoRecording",userId:"userId",sessionId:"sessionId",viewMode:"viewMode",shouldShowEvent:"shouldShowEvent",hideIntermediateEvents:[1,"hideIntermediateEvents"],invocationDisplayMap:[1,"invocationDisplayMap"],evalCaseResult:[1,"evalCaseResult"],showEvalSummary:[1,"showEvalSummary"]},outputs:{userInputChange:"userInputChange",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",clickEvent:"clickEvent",handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",fileSelect:"fileSelect",removeFile:"removeFile",removeStateUpdate:"removeStateUpdate",sendMessage:"sendMessage",stopMessage:"stopMessage",updateState:"updateState",toggleAudioRecording:"toggleAudioRecording",toggleVideoRecording:"toggleVideoRecording",longRunningResponseComplete:"longRunningResponseComplete",toggleHideIntermediateEvents:"toggleHideIntermediateEvents",toggleSse:"toggleSse",manualScroll:"manualScroll"},features:[ii],decls:5,vars:5,consts:[["autoScroll",""],["fileInput",""],["inputActionsMenu","matMenu"],["messageTextarea",""],["videoContainer",""],[1,"chat-messages"],[1,"loading-spinner-container"],[1,"chat-messages",3,"scroll","wheel","touchmove","mousedown","keydown"],[1,"eval-result-summary",2,"margin","16px","padding","16px","border-radius","8px","background","var(--mat-sys-surface-container)","border","1px solid var(--mat-sys-outline-variant)"],[1,"readme-content"],[1,"agent-loading-indicator"],[2,"display","flex","justify-content","space-between","align-items","center"],[2,"margin","0","color","var(--mat-sys-primary)"],[1,"status-card__summary"],[1,"status-card__passed",2,"font-size","16px","font-weight","600","font-family","monospace"],[1,"status-card__failed",2,"font-size","16px","font-weight","600","font-family","monospace"],[2,"margin-top","12px","display","flex","gap","24px"],[2,"color","var(--mat-sys-on-surface-variant)","font-size","13px"],[2,"font-weight","500"],[2,"display","flex","gap","8px","margin-top","4px"],[2,"font-size","13px","font-weight","500",3,"color"],[2,"font-size","13px","font-weight","500"],[3,"ngComponentOutlet","ngComponentOutletInputs"],[1,"branches-container"],[3,"rowClick","handleKeydown","cancelEditMessage","saveEditMessage","userEditEvalCaseMessageChange","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","clickEvent","longRunningResponseComplete","agentStateClick","isSelectable","uiEvent","index","uiEvents","isSelected","appName","userId","sessionId","sessionName","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userEditEvalCaseMessage","agentGraphData","allWorkflowNodes","isUserFeedbackEnabled","isLoadingAgentResponse"],[1,"trace-tree-container",3,"display"],[1,"trace-tree-container"],[3,"spans","invocationId","uiEvents","shouldShowEvent"],["animationDuration","0ms"],["mat-tab-label",""],[1,"branch-events-content"],[3,"display","isSelectable","uiEvent","index","uiEvents","isSelected","appName","userId","sessionId","sessionName","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userEditEvalCaseMessage","agentGraphData","allWorkflowNodes","isUserFeedbackEnabled","isLoadingAgentResponse"],["matTooltipPosition","above",1,"tab-name",3,"matTooltip"],["mode","indeterminate"],[1,"chat-input",3,"video-streaming"],[1,"chat-input"],["type","file","multiple","","hidden","",3,"change"],[1,"chat-input-content-row"],["appearance","outline","subscriptSizing","dynamic",1,"input-field"],[1,"file-preview"],["mat-icon-button","","matPrefix","",1,"input-prefix-menu-btn",3,"matMenuTriggerFor","disabled","matTooltip"],["xPosition","after"],["mat-menu-item","",3,"click","disabled"],["mat-menu-item","",3,"disabled"],["matInput","","cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","10",1,"chat-input-box",3,"ngModelChange","keydown.enter","ngModel","placeholder","disabled"],["matSuffix","",1,"input-suffix-container"],[3,"toggleAudioRecording","toggleVideoRecording","isAudioRecording","isVideoRecording","micVolume","isBidiStreamingEnabled","disabled"],["mat-icon-button","",1,"stop-message-btn",3,"matTooltip"],["mat-icon-button","",1,"send-message-btn",3,"matTooltip"],[1,"video-container"],[1,"file-container"],[1,"image-container"],["alt","preview",1,"image-preview",3,"src"],["mat-icon-button","",1,"delete-button",3,"click"],["color","warn"],[1,"file-info"],["mat-icon-button","",1,"stop-message-btn",3,"click","matTooltip"],["mat-icon-button","",1,"send-message-btn",3,"click","matTooltip"],["mode","indeterminate","diameter","50"]],template:function(A,t){if(A&1&&(ro(0),mt(1,"async"),T(2,CDA,7,3,"div",5),T(3,mDA,1,1),T(4,wDA,2,0,"div",6)),A&2){let n=Ft(1,3,t.uiStateService.isSessionLoading());Q(2),O(t.appName!=""&&!n?2:-1),Q(),O(t.appName!=""&&t.isChatMode&&!n?3:-1),Q(),O(n?4:-1)}},dependencies:[li,Kc,fn,Gn,Kn,Ho,Un,zt,kU,pE,uE,qi,yi,Ws,ka,Zo,mQ,Rv,P3,YI,Za,s2,hs,Gs,tg,l2,Es,mZ,Ha,rn,RU,SZ,vp,bp,fE,W0,Iy,By,hy,gs],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%}.generated-image-container[_ngcontent-%COMP%]{max-width:400px;margin-left:20px}.generated-image[_ngcontent-%COMP%]{max-width:100%;min-width:40px;border-radius:8px}.html-artifact-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:flex-start;align-items:center}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;position:relative}.chat-sub-toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 20px;background-color:var(--mat-sys-surface-container);border-bottom:1px solid var(--mat-sys-outline-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{border-radius:16px;height:28px;align-items:center}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] .mat-button-toggle-label-content{line-height:28px;padding:0 12px;font-size:13px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-bar-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;background-color:transparent;border:none;margin-left:16px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;height:28px;cursor:pointer;transition:background-color .2s ease}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-label[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;color:var(--mat-sys-on-surface-variant);padding:0;margin-left:4px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:transparent;border:1px dashed var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;font-weight:500;height:28px;cursor:pointer;transition:all .2s ease;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant);border-color:var(--mat-sys-outline);color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;margin-right:4px} .filter-panel{min-width:max-content!important;max-width:50vw} .filter-panel .mat-mdc-menu-item{min-height:32px!important;font-size:12px!important} .filter-panel .mat-mdc-menu-item .mat-mdc-menu-item-text, .filter-panel .mat-mdc-menu-item .mdc-list-item__primary-text{font-size:12px!important;line-height:normal}.trace-tree-container[_ngcontent-%COMP%]{margin:12px 48px 12px 12px;border-radius:12px;border:none;background:var(--mat-sys-surface-container-lowest, #fff);box-shadow:0 4px 20px #0000000d,0 1px 3px #0000000a}.chat-input[_ngcontent-%COMP%]{display:flex;flex-direction:column;padding:10px;width:min(960px,88%);margin:0 auto;position:relative;transition:all .3s ease;box-sizing:border-box}.chat-input[_ngcontent-%COMP%] .chat-input-content-row[_ngcontent-%COMP%]{display:flex;gap:16px;align-items:flex-end;width:100%}.video-container[_ngcontent-%COMP%]{display:none;border-radius:12px;overflow:hidden;background:var(--mat-sys-surface-variant);border:1px solid var(--mat-sys-outline-variant);width:200px}.video-container.visible[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;flex-shrink:0;box-shadow:0 8px 24px #00000026}.video-container[_ngcontent-%COMP%] video{width:100%!important;height:auto!important;max-height:280px;object-fit:cover;border-radius:12px;transform:scaleX(-1)}.input-field[_ngcontent-%COMP%]{flex-grow:1;position:relative}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);border:none;box-sizing:content-box;caret-color:var(--mat-sys-primary)}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant)}.input-field[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:not(:disabled):not(.stop-message-btn){color:var(--mat-sys-primary)!important}.input-field[_ngcontent-%COMP%] .mat-mdc-form-field-flex{align-items:flex-end!important}.input-field[_ngcontent-%COMP%] .mat-mdc-form-field-icon-prefix, .input-field[_ngcontent-%COMP%] .mat-mdc-form-field-icon-suffix{align-self:flex-end!important;margin-bottom:8px!important}button.stop-message-btn[_ngcontent-%COMP%]:not(:disabled){color:#ea4335!important}button.stop-message-btn[_ngcontent-%COMP%]:not(:disabled):hover{background-color:#ea433514!important}button[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-on-surface-variant)!important;opacity:.38!important;cursor:not-allowed}button.input-prefix-menu-btn[_ngcontent-%COMP%]{margin-left:12px!important}button.input-prefix-menu-btn[_ngcontent-%COMP%]:not(:disabled){color:var(--mat-sys-on-surface-variant)!important}.input-suffix-container[_ngcontent-%COMP%]{display:flex;align-items:flex-end;gap:8px;margin-right:12px!important}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.image-container[_ngcontent-%COMP%]{position:relative;display:inline-block;border-radius:12px;overflow:hidden}.image-preview[_ngcontent-%COMP%]{display:block;width:100%;height:auto;border-radius:12px;width:80px;height:80px}.delete-button[_ngcontent-%COMP%]{position:absolute;top:1px;right:1px;border:none;border-radius:50%;padding:8px;cursor:pointer;color:var(--mat-sys-error);display:flex;align-items:center;justify-content:center;scale:.7}.delete-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}.file-container[_ngcontent-%COMP%]{position:relative;display:flex;flex-direction:column;gap:8px;height:80px;border-radius:12px}.file-info[_ngcontent-%COMP%]{margin-right:60px;padding-top:20px;padding-left:16px}.chat-input-box[_ngcontent-%COMP%]{caret-color:#fff}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}.messages-loading-container[_ngcontent-%COMP%]{margin-top:1em;margin-bottom:1em}.agent-loading-indicator[_ngcontent-%COMP%]{margin-top:16px;margin-bottom:8px;padding:0 20px;width:240px}.readme-content[_ngcontent-%COMP%]{padding:0 20px;font-size:14px;line-height:1.8;color:var(--mat-sys-on-surface)}.readme-content[_ngcontent-%COMP%] pre code{font-size:12px!important}.branches-container[_ngcontent-%COMP%]{margin:8px -20px;border-radius:8px;overflow:hidden}.light-theme[_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mat-mdc-tab-header, .light-theme [_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mat-mdc-tab-header{background:transparent!important}.light-theme[_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mat-mdc-tab, .light-theme [_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mat-mdc-tab{background:var(--mat-sys-surface-container-highest)!important}.light-theme[_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mat-mdc-tab.mdc-tab--active, .light-theme [_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mat-mdc-tab.mdc-tab--active{background:#e8f5e9!important}.light-theme[_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mdc-tab-indicator__content--underline, .light-theme [_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mdc-tab-indicator__content--underline{border-color:#2e7d32!important}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab-header{height:32px!important;background:transparent!important;justify-content:flex-start!important}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab-label-container{border-bottom:none!important}.branches-container[_ngcontent-%COMP%] .mdc-tab-indicator__content--underline{border-color:#4caf50!important}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab{height:32px!important;font-size:12px!important;min-width:auto!important;padding:0 16px!important;flex:0 0 auto!important;border-top-left-radius:8px!important;border-top-right-radius:8px!important;background:var(--mat-sys-surface-container-highest)!important;margin-right:2px;overflow:hidden!important}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-sys-on-surface-variant)!important;opacity:.6}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab.mdc-tab--active{background:#1b4d24!important}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-sys-on-surface)!important;opacity:1!important}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab-body-content{padding:0!important}.branches-container[_ngcontent-%COMP%] .mdc-tab__text-label{font-size:12px!important}.branches-container[_ngcontent-%COMP%] .tab-name{max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.branches-container[_ngcontent-%COMP%] .branch-events-content[_ngcontent-%COMP%]{padding:8px 20px;background:#1b4d24}.light-theme[_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .branch-events-content[_ngcontent-%COMP%], .light-theme [_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .branch-events-content[_ngcontent-%COMP%]{background:#e8f5e9}@media(max-width:768px){.chat-messages[_ngcontent-%COMP%]{padding:12px!important}.chat-input[_ngcontent-%COMP%]{width:100%!important;padding:8px!important}.chat-input-content-row[_ngcontent-%COMP%]{gap:8px!important}.input-suffix-container[_ngcontent-%COMP%]{gap:4px!important;margin-right:4px!important}button.input-prefix-menu-btn[_ngcontent-%COMP%]{margin-left:4px!important}}"]})};var yDA=[[["caption"]],[["colgroup"],["col"]],"*"],DDA=["caption","colgroup, col","*"];function vDA(i,e){i&1&&Ze(0,2)}function bDA(i,e){i&1&&(I(0,"thead",0),dn(1,1),h(),I(2,"tbody",0),dn(3,2)(4,3),h(),I(5,"tfoot",0),dn(6,4),h())}function MDA(i,e){i&1&&dn(0,1)(1,2)(2,3)(3,4)}var bc=new MA("CDK_TABLE");var uy=(()=>{class i{template=w(wo);constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdkCellDef",""]]})}return i})(),py=(()=>{class i{template=w(wo);constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdkHeaderCellDef",""]]})}return i})(),qX=(()=>{class i{template=w(wo);constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdkFooterCellDef",""]]})}return i})(),ME=(()=>{class i{_table=w(bc,{optional:!0});_hasStickyChanged=!1;get name(){return this._name}set name(A){this._setNameInput(A)}_name;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;get stickyEnd(){return this._stickyEnd}set stickyEnd(A){A!==this._stickyEnd&&(this._stickyEnd=A,this._hasStickyChanged=!0)}_stickyEnd=!1;cell;headerCell;footerCell;cssClassFriendlyName;_columnCssClassName;constructor(){}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}_updateColumnCssClassName(){this._columnCssClassName=[`cdk-column-${this.cssClassFriendlyName}`]}_setNameInput(A){A&&(this._name=A,this.cssClassFriendlyName=A.replace(/[^a-z0-9_-]/gi,"-"),this._updateColumnCssClassName())}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdkColumnDef",""]],contentQueries:function(t,n,o){if(t&1&&ra(o,uy,5)(o,py,5)(o,qX,5),t&2){let a;se(a=le())&&(n.cell=a.first),se(a=le())&&(n.headerCell=a.first),se(a=le())&&(n.footerCell=a.first)}},inputs:{name:[0,"cdkColumnDef","name"],sticky:[2,"sticky","sticky",Qe],stickyEnd:[2,"stickyEnd","stickyEnd",Qe]}})}return i})(),Qy=class{constructor(e,A){A.nativeElement.classList.add(...e._columnCssClassName)}},WX=(()=>{class i extends Qy{constructor(){super(w(ME),w(ce))}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["cdk-header-cell"],["th","cdk-header-cell",""]],hostAttrs:["role","columnheader",1,"cdk-header-cell"],features:[bt]})}return i})();var ZX=(()=>{class i extends Qy{constructor(){let A=w(ME),t=w(ce);super(A,t);let n=A._table?._getCellRole();n&&t.nativeElement.setAttribute("role",n)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["cdk-cell"],["td","cdk-cell",""]],hostAttrs:[1,"cdk-cell"],features:[bt]})}return i})();var pR=(()=>{class i{template=w(wo);_differs=w(k1);columns;_columnsDiffer;constructor(){}ngOnChanges(A){if(!this._columnsDiffer){let t=A.columns&&A.columns.currentValue||[];this._columnsDiffer=this._differs.find(t).create(),this._columnsDiffer.diff(t)}}getColumnsDiff(){return this._columnsDiffer.diff(this.columns)}extractCellTemplate(A){return this instanceof fR?A.headerCell.template:this instanceof mR?A.footerCell.template:A.cell.template}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,features:[ii]})}return i})(),fR=(()=>{class i extends pR{_table=w(bc,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(w(wo),w(k1))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdkHeaderRowDef",""]],inputs:{columns:[0,"cdkHeaderRowDef","columns"],sticky:[2,"cdkHeaderRowDefSticky","sticky",Qe]},features:[bt,ii]})}return i})(),mR=(()=>{class i extends pR{_table=w(bc,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(w(wo),w(k1))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdkFooterRowDef",""]],inputs:{columns:[0,"cdkFooterRowDef","columns"],sticky:[2,"cdkFooterRowDefSticky","sticky",Qe]},features:[bt,ii]})}return i})(),fy=(()=>{class i extends pR{_table=w(bc,{optional:!0});when;constructor(){super(w(wo),w(k1))}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdkRowDef",""]],inputs:{columns:[0,"cdkRowDefColumns","columns"],when:[0,"cdkRowDefWhen","when"]},features:[bt]})}return i})(),xp=(()=>{class i{_viewContainer=w(Jo);cells;context;static mostRecentCellOutlet=null;constructor(){i.mostRecentCellOutlet=this}ngOnDestroy(){i.mostRecentCellOutlet===this&&(i.mostRecentCellOutlet=null)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","cdkCellOutlet",""]]})}return i})();var wR=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["cdk-row"],["tr","cdk-row",""]],hostAttrs:["role","row",1,"cdk-row"],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(t,n){t&1&&dn(0,0)},dependencies:[xp],encapsulation:2})}return i})(),XX=(()=>{class i{templateRef=w(wo);_contentClassNames=["cdk-no-data-row","cdk-row"];_cellClassNames=["cdk-cell","cdk-no-data-cell"];_cellSelector="td, cdk-cell, [cdk-cell], .cdk-cell";constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["ng-template","cdkNoDataRow",""]]})}return i})(),jX=["top","bottom","left","right"],uR=class{_isNativeHtmlTable;_stickCellCss;_isBrowser;_needsPositionStickyOnElement;direction;_positionListener;_tableInjector;_elemSizeCache=new WeakMap;_resizeObserver=globalThis?.ResizeObserver?new globalThis.ResizeObserver(e=>this._updateCachedSizes(e)):null;_updatedStickyColumnsParamsToReplay=[];_stickyColumnsReplayTimeout=null;_cachedCellWidths=[];_borderCellCss;_destroyed=!1;constructor(e,A,t=!0,n=!0,o,a,r){this._isNativeHtmlTable=e,this._stickCellCss=A,this._isBrowser=t,this._needsPositionStickyOnElement=n,this.direction=o,this._positionListener=a,this._tableInjector=r,this._borderCellCss={top:`${A}-border-elem-top`,bottom:`${A}-border-elem-bottom`,left:`${A}-border-elem-left`,right:`${A}-border-elem-right`}}clearStickyPositioning(e,A){(A.includes("left")||A.includes("right"))&&this._removeFromStickyColumnReplayQueue(e);let t=[];for(let n of e)n.nodeType===n.ELEMENT_NODE&&t.push(n,...Array.from(n.children));ao({write:()=>{for(let n of t)this._removeStickyStyle(n,A)}},{injector:this._tableInjector})}updateStickyColumns(e,A,t,n=!0,o=!0){if(!e.length||!this._isBrowser||!(A.some(f=>f)||t.some(f=>f))){this._positionListener?.stickyColumnsUpdated({sizes:[]}),this._positionListener?.stickyEndColumnsUpdated({sizes:[]});return}let a=e[0],r=a.children.length,s=this.direction==="rtl",l=s?"right":"left",g=s?"left":"right",C=A.lastIndexOf(!0),d=t.indexOf(!0),B,u,E;o&&this._updateStickyColumnReplayQueue({rows:[...e],stickyStartStates:[...A],stickyEndStates:[...t]}),ao({earlyRead:()=>{B=this._getCellWidths(a,n),u=this._getStickyStartColumnPositions(B,A),E=this._getStickyEndColumnPositions(B,t)},write:()=>{for(let f of e)for(let m=0;m!!f)&&(this._positionListener.stickyColumnsUpdated({sizes:C===-1?[]:B.slice(0,C+1).map((f,m)=>A[m]?f:null)}),this._positionListener.stickyEndColumnsUpdated({sizes:d===-1?[]:B.slice(d).map((f,m)=>t[m+d]?f:null).reverse()}))}},{injector:this._tableInjector})}stickRows(e,A,t){if(!this._isBrowser)return;let n=t==="bottom"?e.slice().reverse():e,o=t==="bottom"?A.slice().reverse():A,a=[],r=[],s=[];ao({earlyRead:()=>{for(let l=0,g=0;l{let l=o.lastIndexOf(!0);for(let g=0;g{let t=e.querySelector("tfoot");t&&(A.some(n=>!n)?this._removeStickyStyle(t,["bottom"]):this._addStickyStyle(t,"bottom",0,!1))}},{injector:this._tableInjector})}destroy(){this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._resizeObserver?.disconnect(),this._destroyed=!0}_removeStickyStyle(e,A){if(!e.classList.contains(this._stickCellCss))return;for(let n of A)e.style[n]="",e.classList.remove(this._borderCellCss[n]);jX.some(n=>A.indexOf(n)===-1&&e.style[n])?e.style.zIndex=this._getCalculatedZIndex(e):(e.style.zIndex="",this._needsPositionStickyOnElement&&(e.style.position=""),e.classList.remove(this._stickCellCss))}_addStickyStyle(e,A,t,n){e.classList.add(this._stickCellCss),n&&e.classList.add(this._borderCellCss[A]),e.style[A]=`${t}px`,e.style.zIndex=this._getCalculatedZIndex(e),this._needsPositionStickyOnElement&&(e.style.cssText+="position: -webkit-sticky; position: sticky; ")}_getCalculatedZIndex(e){let A={top:100,bottom:10,left:1,right:1},t=0;for(let n of jX)e.style[n]&&(t+=A[n]);return t?`${t}`:""}_getCellWidths(e,A=!0){if(!A&&this._cachedCellWidths.length)return this._cachedCellWidths;let t=[],n=e.children;for(let o=0;o0;o--)A[o]&&(t[o]=n,n+=e[o]);return t}_retrieveElementSize(e){let A=this._elemSizeCache.get(e);if(A)return A;let t=e.getBoundingClientRect(),n={width:t.width,height:t.height};return this._resizeObserver&&(this._elemSizeCache.set(e,n),this._resizeObserver.observe(e,{box:"border-box"})),n}_updateStickyColumnReplayQueue(e){this._removeFromStickyColumnReplayQueue(e.rows),this._stickyColumnsReplayTimeout||this._updatedStickyColumnsParamsToReplay.push(e)}_removeFromStickyColumnReplayQueue(e){let A=new Set(e);for(let t of this._updatedStickyColumnsParamsToReplay)t.rows=t.rows.filter(n=>!A.has(n));this._updatedStickyColumnsParamsToReplay=this._updatedStickyColumnsParamsToReplay.filter(t=>!!t.rows.length)}_updateCachedSizes(e){let A=!1;for(let t of e){let n=t.borderBoxSize?.length?{width:t.borderBoxSize[0].inlineSize,height:t.borderBoxSize[0].blockSize}:{width:t.contentRect.width,height:t.contentRect.height};n.width!==this._elemSizeCache.get(t.target)?.width&&SDA(t.target)&&(A=!0),this._elemSizeCache.set(t.target,n)}A&&this._updatedStickyColumnsParamsToReplay.length&&(this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._stickyColumnsReplayTimeout=setTimeout(()=>{if(!this._destroyed){for(let t of this._updatedStickyColumnsParamsToReplay)this.updateStickyColumns(t.rows,t.stickyStartStates,t.stickyEndStates,!0,!1);this._updatedStickyColumnsParamsToReplay=[],this._stickyColumnsReplayTimeout=null}},0))}};function SDA(i){return["cdk-cell","cdk-header-cell","cdk-footer-cell"].some(e=>i.classList.contains(e))}var _p=new MA("STICKY_POSITIONING_LISTENER");var yR=(()=>{class i{viewContainer=w(Jo);elementRef=w(ce);constructor(){let A=w(bc);A._rowOutlet=this,A._outletAssigned()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","rowOutlet",""]]})}return i})(),DR=(()=>{class i{viewContainer=w(Jo);elementRef=w(ce);constructor(){let A=w(bc);A._headerRowOutlet=this,A._outletAssigned()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","headerRowOutlet",""]]})}return i})(),vR=(()=>{class i{viewContainer=w(Jo);elementRef=w(ce);constructor(){let A=w(bc);A._footerRowOutlet=this,A._outletAssigned()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","footerRowOutlet",""]]})}return i})(),bR=(()=>{class i{viewContainer=w(Jo);elementRef=w(ce);constructor(){let A=w(bc);A._noDataRowOutlet=this,A._outletAssigned()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["","noDataRowOutlet",""]]})}return i})(),MR=(()=>{class i{_differs=w(k1);_changeDetectorRef=w(Mt);_elementRef=w(ce);_dir=w(No,{optional:!0});_platform=w(Qi);_viewRepeater;_viewportRuler=w(Ns);_injector=w(St);_virtualScrollViewport=w(NU,{optional:!0,host:!0});_positionListener=w(_p,{optional:!0})||w(_p,{optional:!0,skipSelf:!0});_document=w(ci);_data;_renderedRange;_onDestroy=new ne;_renderRows;_renderChangeSubscription=null;_columnDefsByName=new Map;_rowDefs;_headerRowDefs;_footerRowDefs;_dataDiffer;_defaultRowDef=null;_customColumnDefs=new Set;_customRowDefs=new Set;_customHeaderRowDefs=new Set;_customFooterRowDefs=new Set;_customNoDataRow=null;_headerRowDefChanged=!0;_footerRowDefChanged=!0;_stickyColumnStylesNeedReset=!0;_forceRecalculateCellWidths=!0;_cachedRenderRowsMap=new Map;_isNativeHtmlTable;_stickyStyler;stickyCssClass="cdk-table-sticky";needsPositionStickyOnElement=!0;_isServer;_isShowingNoDataRow=!1;_hasAllOutlets=!1;_hasInitialized=!1;_headerRowStickyUpdates=new ne;_footerRowStickyUpdates=new ne;_disableVirtualScrolling=!1;_getCellRole(){if(this._cellRoleInternal===void 0){let A=this._elementRef.nativeElement.getAttribute("role");return A==="grid"||A==="treegrid"?"gridcell":"cell"}return this._cellRoleInternal}_cellRoleInternal=void 0;get trackBy(){return this._trackByFn}set trackBy(A){this._trackByFn=A}_trackByFn;get dataSource(){return this._dataSource}set dataSource(A){this._dataSource!==A&&(this._switchDataSource(A),this._changeDetectorRef.markForCheck())}_dataSource;_dataSourceChanges=new ne;_dataStream=new ne;get multiTemplateDataRows(){return this._multiTemplateDataRows}set multiTemplateDataRows(A){this._multiTemplateDataRows=A,this._rowOutlet&&this._rowOutlet.viewContainer.length&&(this._forceRenderDataRows(),this.updateStickyColumnStyles())}_multiTemplateDataRows=!1;get fixedLayout(){return this._virtualScrollEnabled()?!0:this._fixedLayout}set fixedLayout(A){this._fixedLayout=A,this._forceRecalculateCellWidths=!0,this._stickyColumnStylesNeedReset=!0}_fixedLayout=!1;recycleRows=!1;contentChanged=new FA;viewChange=new gi({start:0,end:Number.MAX_VALUE});_rowOutlet;_headerRowOutlet;_footerRowOutlet;_noDataRowOutlet;_contentColumnDefs;_contentRowDefs;_contentHeaderRowDefs;_contentFooterRowDefs;_noDataRow;constructor(){w(new Ys("role"),{optional:!0})||this._elementRef.nativeElement.setAttribute("role","table"),this._isServer=!this._platform.isBrowser,this._isNativeHtmlTable=this._elementRef.nativeElement.nodeName==="TABLE",this._dataDiffer=this._differs.find([]).create((t,n)=>this.trackBy?this.trackBy(n.dataIndex,n.data):n)}ngOnInit(){this._setupStickyStyler(),this._viewportRuler.change().pipe(yt(this._onDestroy)).subscribe(()=>{this._forceRecalculateCellWidths=!0})}ngAfterContentInit(){this._viewRepeater=this.recycleRows||this._virtualScrollEnabled()?new Wf:new Zf,this._virtualScrollEnabled()&&this._setupVirtualScrolling(this._virtualScrollViewport),this._hasInitialized=!0}ngAfterContentChecked(){this._canRender()&&this._render()}ngOnDestroy(){this._stickyStyler?.destroy(),[this._rowOutlet?.viewContainer,this._headerRowOutlet?.viewContainer,this._footerRowOutlet?.viewContainer,this._cachedRenderRowsMap,this._customColumnDefs,this._customRowDefs,this._customHeaderRowDefs,this._customFooterRowDefs,this._columnDefsByName].forEach(A=>{A?.clear()}),this._headerRowDefs=[],this._footerRowDefs=[],this._defaultRowDef=null,this._headerRowStickyUpdates.complete(),this._footerRowStickyUpdates.complete(),this._onDestroy.next(),this._onDestroy.complete(),eu(this.dataSource)&&this.dataSource.disconnect(this)}renderRows(){this._renderRows=this._getAllRenderRows();let A=this._dataDiffer.diff(this._renderRows);if(!A){this._updateNoDataRow(),this.contentChanged.next();return}let t=this._rowOutlet.viewContainer;this._viewRepeater.applyChanges(A,t,(n,o,a)=>this._getEmbeddedViewArgs(n.item,a),n=>n.item.data,n=>{n.operation===Yg.INSERTED&&n.context&&this._renderCellTemplateForItem(n.record.item.rowDef,n.context)}),this._updateRowIndexContext(),A.forEachIdentityChange(n=>{let o=t.get(n.currentIndex);o.context.$implicit=n.item.data}),this._updateNoDataRow(),this.contentChanged.next(),this.updateStickyColumnStyles()}addColumnDef(A){this._customColumnDefs.add(A)}removeColumnDef(A){this._customColumnDefs.delete(A)}addRowDef(A){this._customRowDefs.add(A)}removeRowDef(A){this._customRowDefs.delete(A)}addHeaderRowDef(A){this._customHeaderRowDefs.add(A),this._headerRowDefChanged=!0}removeHeaderRowDef(A){this._customHeaderRowDefs.delete(A),this._headerRowDefChanged=!0}addFooterRowDef(A){this._customFooterRowDefs.add(A),this._footerRowDefChanged=!0}removeFooterRowDef(A){this._customFooterRowDefs.delete(A),this._footerRowDefChanged=!0}setNoDataRow(A){this._customNoDataRow=A}updateStickyHeaderRowStyles(){let A=this._getRenderedRows(this._headerRowOutlet);if(this._isNativeHtmlTable){let n=VX(this._headerRowOutlet,"thead");n&&(n.style.display=A.length?"":"none")}let t=this._headerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,["top"]),this._stickyStyler.stickRows(A,t,"top"),this._headerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyFooterRowStyles(){let A=this._getRenderedRows(this._footerRowOutlet);if(this._isNativeHtmlTable){let n=VX(this._footerRowOutlet,"tfoot");n&&(n.style.display=A.length?"":"none")}let t=this._footerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,["bottom"]),this._stickyStyler.stickRows(A,t,"bottom"),this._stickyStyler.updateStickyFooterContainer(this._elementRef.nativeElement,t),this._footerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyColumnStyles(){let A=this._getRenderedRows(this._headerRowOutlet),t=this._getRenderedRows(this._rowOutlet),n=this._getRenderedRows(this._footerRowOutlet);(this._isNativeHtmlTable&&!this.fixedLayout||this._stickyColumnStylesNeedReset)&&(this._stickyStyler.clearStickyPositioning([...A,...t,...n],["left","right"]),this._stickyColumnStylesNeedReset=!1),A.forEach((o,a)=>{this._addStickyColumnStyles([o],this._headerRowDefs[a])}),this._rowDefs.forEach(o=>{let a=[];for(let r=0;r{this._addStickyColumnStyles([o],this._footerRowDefs[a])}),Array.from(this._columnDefsByName.values()).forEach(o=>o.resetStickyChanged())}stickyColumnsUpdated(A){this._positionListener?.stickyColumnsUpdated(A)}stickyEndColumnsUpdated(A){this._positionListener?.stickyEndColumnsUpdated(A)}stickyHeaderRowsUpdated(A){this._headerRowStickyUpdates.next(A),this._positionListener?.stickyHeaderRowsUpdated(A)}stickyFooterRowsUpdated(A){this._footerRowStickyUpdates.next(A),this._positionListener?.stickyFooterRowsUpdated(A)}_outletAssigned(){!this._hasAllOutlets&&this._rowOutlet&&this._headerRowOutlet&&this._footerRowOutlet&&this._noDataRowOutlet&&(this._hasAllOutlets=!0,this._canRender()&&this._render())}_canRender(){return this._hasAllOutlets&&this._hasInitialized}_render(){this._cacheRowDefs(),this._cacheColumnDefs(),!this._headerRowDefs.length&&!this._footerRowDefs.length&&this._rowDefs.length;let t=this._renderUpdatedColumns()||this._headerRowDefChanged||this._footerRowDefChanged;this._stickyColumnStylesNeedReset=this._stickyColumnStylesNeedReset||t,this._forceRecalculateCellWidths=t,this._headerRowDefChanged&&(this._forceRenderHeaderRows(),this._headerRowDefChanged=!1),this._footerRowDefChanged&&(this._forceRenderFooterRows(),this._footerRowDefChanged=!1),this.dataSource&&this._rowDefs.length>0&&!this._renderChangeSubscription?this._observeRenderChanges():this._stickyColumnStylesNeedReset&&this.updateStickyColumnStyles(),this._checkStickyStates()}_getAllRenderRows(){if(!Array.isArray(this._data)||!this._renderedRange)return[];let A=[],t=Math.min(this._data.length,this._renderedRange.end),n=this._cachedRenderRowsMap;this._cachedRenderRowsMap=new Map;for(let o=this._renderedRange.start;o{let r=n&&n.has(a)?n.get(a):[];if(r.length){let s=r.shift();return s.dataIndex=t,s}else return{data:A,rowDef:a,dataIndex:t}})}_cacheColumnDefs(){this._columnDefsByName.clear(),Ey(this._getOwnDefs(this._contentColumnDefs),this._customColumnDefs).forEach(t=>{this._columnDefsByName.has(t.name),this._columnDefsByName.set(t.name,t)})}_cacheRowDefs(){this._headerRowDefs=Ey(this._getOwnDefs(this._contentHeaderRowDefs),this._customHeaderRowDefs),this._footerRowDefs=Ey(this._getOwnDefs(this._contentFooterRowDefs),this._customFooterRowDefs),this._rowDefs=Ey(this._getOwnDefs(this._contentRowDefs),this._customRowDefs);let A=this._rowDefs.filter(t=>!t.when);this._defaultRowDef=A[0]}_renderUpdatedColumns(){let A=(a,r)=>{let s=!!r.getColumnsDiff();return a||s},t=this._rowDefs.reduce(A,!1);t&&this._forceRenderDataRows();let n=this._headerRowDefs.reduce(A,!1);n&&this._forceRenderHeaderRows();let o=this._footerRowDefs.reduce(A,!1);return o&&this._forceRenderFooterRows(),t||n||o}_switchDataSource(A){this._data=[],eu(this.dataSource)&&this.dataSource.disconnect(this),this._renderChangeSubscription&&(this._renderChangeSubscription.unsubscribe(),this._renderChangeSubscription=null),A||(this._dataDiffer&&this._dataDiffer.diff([]),this._rowOutlet&&this._rowOutlet.viewContainer.clear()),this._dataSource=A}_observeRenderChanges(){if(!this.dataSource)return;let A;eu(this.dataSource)?A=this.dataSource.connect(this):fI(this.dataSource)?A=this.dataSource:Array.isArray(this.dataSource)&&(A=oe(this.dataSource)),this._renderChangeSubscription=Dr([A,this.viewChange]).pipe(yt(this._onDestroy)).subscribe(([t,n])=>{this._data=t||[],this._renderedRange=n,this._dataStream.next(t),this.renderRows()})}_forceRenderHeaderRows(){this._headerRowOutlet.viewContainer.length>0&&this._headerRowOutlet.viewContainer.clear(),this._headerRowDefs.forEach((A,t)=>this._renderRow(this._headerRowOutlet,A,t)),this.updateStickyHeaderRowStyles()}_forceRenderFooterRows(){this._footerRowOutlet.viewContainer.length>0&&this._footerRowOutlet.viewContainer.clear(),this._footerRowDefs.forEach((A,t)=>this._renderRow(this._footerRowOutlet,A,t)),this.updateStickyFooterRowStyles()}_addStickyColumnStyles(A,t){let n=Array.from(t?.columns||[]).map(r=>{let s=this._columnDefsByName.get(r);return s}),o=n.map(r=>r.sticky),a=n.map(r=>r.stickyEnd);this._stickyStyler.updateStickyColumns(A,o,a,!this.fixedLayout||this._forceRecalculateCellWidths)}_getRenderedRows(A){let t=[];for(let n=0;n!o.when||o.when(t,A));else{let o=this._rowDefs.find(a=>a.when&&a.when(t,A))||this._defaultRowDef;o&&n.push(o)}return n.length,n}_getEmbeddedViewArgs(A,t){let n=A.rowDef,o={$implicit:A.data};return{templateRef:n.template,context:o,index:t}}_renderRow(A,t,n,o={}){let a=A.viewContainer.createEmbeddedView(t.template,o,n);return this._renderCellTemplateForItem(t,o),a}_renderCellTemplateForItem(A,t){for(let n of this._getCellTemplates(A))xp.mostRecentCellOutlet&&xp.mostRecentCellOutlet._viewContainer.createEmbeddedView(n,t);this._changeDetectorRef.markForCheck()}_updateRowIndexContext(){let A=this._rowOutlet.viewContainer;for(let t=0,n=A.length;t{let n=this._columnDefsByName.get(t);return A.extractCellTemplate(n)})}_forceRenderDataRows(){this._dataDiffer.diff([]),this._rowOutlet.viewContainer.clear(),this.renderRows()}_checkStickyStates(){let A=(t,n)=>t||n.hasStickyChanged();this._headerRowDefs.reduce(A,!1)&&this.updateStickyHeaderRowStyles(),this._footerRowDefs.reduce(A,!1)&&this.updateStickyFooterRowStyles(),Array.from(this._columnDefsByName.values()).reduce(A,!1)&&(this._stickyColumnStylesNeedReset=!0,this.updateStickyColumnStyles())}_setupStickyStyler(){let A=this._dir?this._dir.value:"ltr",t=this._injector;this._stickyStyler=new uR(this._isNativeHtmlTable,this.stickyCssClass,this._platform.isBrowser,this.needsPositionStickyOnElement,A,this,t),(this._dir?this._dir.change:oe()).pipe(yt(this._onDestroy)).subscribe(n=>{this._stickyStyler.direction=n,this.updateStickyColumnStyles()})}_setupVirtualScrolling(A){let t=typeof requestAnimationFrame<"u"?uI:RD;this.viewChange.next({start:0,end:0}),A.renderedRangeStream.pipe(v1(0,t),yt(this._onDestroy)).subscribe(this.viewChange),A.attach({dataStream:this._dataStream,measureRangeSize:(n,o)=>this._measureRangeSize(n,o)}),Dr([A.renderedContentOffset,this._headerRowStickyUpdates]).pipe(yt(this._onDestroy)).subscribe(([n,o])=>{if(!(!o.sizes||!o.offsets||!o.elements))for(let a=0;a{if(!(!o.sizes||!o.offsets||!o.elements))for(let a=0;a!t._table||t._table===this)}_updateNoDataRow(){let A=this._customNoDataRow||this._noDataRow;if(!A)return;let t=this._rowOutlet.viewContainer.length===0;if(t===this._isShowingNoDataRow)return;let n=this._noDataRowOutlet.viewContainer;if(t){let o=n.createEmbeddedView(A.templateRef),a=o.rootNodes[0];if(o.rootNodes.length===1&&a?.nodeType===this._document.ELEMENT_NODE){a.setAttribute("role","row"),a.classList.add(...A._contentClassNames);let r=a.querySelectorAll(A._cellSelector);for(let s=0;s=A.end||t!=="vertical")return 0;let n=this.viewChange.value,o=this._rowOutlet.viewContainer;A.startn.end;let a=A.start-n.start,r=A.end-A.start,s,l;for(let d=0;d-1;d--){let B=o.get(d+a);if(B&&B.rootNodes.length){l=B.rootNodes[B.rootNodes.length-1];break}}let g=s?.getBoundingClientRect?.(),C=l?.getBoundingClientRect?.();return g&&C?C.bottom-g.top:0}_virtualScrollEnabled(){return!this._disableVirtualScrolling&&this._virtualScrollViewport!=null}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["cdk-table"],["table","cdk-table",""]],contentQueries:function(t,n,o){if(t&1&&ra(o,XX,5)(o,ME,5)(o,fy,5)(o,fR,5)(o,mR,5),t&2){let a;se(a=le())&&(n._noDataRow=a.first),se(a=le())&&(n._contentColumnDefs=a),se(a=le())&&(n._contentRowDefs=a),se(a=le())&&(n._contentHeaderRowDefs=a),se(a=le())&&(n._contentFooterRowDefs=a)}},hostAttrs:[1,"cdk-table"],hostVars:2,hostBindings:function(t,n){t&2&&_A("cdk-table-fixed-layout",n.fixedLayout)},inputs:{trackBy:"trackBy",dataSource:"dataSource",multiTemplateDataRows:[2,"multiTemplateDataRows","multiTemplateDataRows",Qe],fixedLayout:[2,"fixedLayout","fixedLayout",Qe],recycleRows:[2,"recycleRows","recycleRows",Qe]},outputs:{contentChanged:"contentChanged"},exportAs:["cdkTable"],features:[pt([{provide:bc,useExisting:i},{provide:_p,useValue:null}])],ngContentSelectors:DDA,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(t,n){t&1&&(Ot(yDA),Ze(0),Ze(1,1),T(2,vDA,1,0),T(3,bDA,7,0)(4,MDA,4,0)),t&2&&(Q(2),O(n._isServer?2:-1),Q(),O(n._isNativeHtmlTable?3:4))},dependencies:[DR,yR,bR,vR],styles:[`.cdk-table-fixed-layout{table-layout:fixed} -`],encapsulation:2})}return i})();function Ey(i,e){return i.concat(Array.from(e))}function VX(i,e){let A=e.toUpperCase(),t=i.viewContainer.element.nativeElement;for(;t;){let n=t.nodeType===1?t.nodeName:null;if(n===A)return t;if(n==="TABLE")break;t=t.parentNode}return null}var kDA=[[["caption"]],[["colgroup"],["col"]],"*"],_DA=["caption","colgroup, col","*"];function xDA(i,e){i&1&&Ze(0,2)}function RDA(i,e){i&1&&(I(0,"thead",0),dn(1,1),h(),I(2,"tbody",2),dn(3,3)(4,4),h(),I(5,"tfoot",0),dn(6,5),h())}function NDA(i,e){i&1&&dn(0,1)(1,3)(2,4)(3,5)}var $X=(()=>{class i extends MR{stickyCssClass="mat-mdc-table-sticky";needsPositionStickyOnElement=!1;static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275cmp=vA({type:i,selectors:[["mat-table"],["table","mat-table",""]],hostAttrs:[1,"mat-mdc-table","mdc-data-table__table"],hostVars:2,hostBindings:function(t,n){t&2&&_A("mat-table-fixed-layout",n.fixedLayout)},exportAs:["matTable"],features:[pt([{provide:MR,useExisting:i},{provide:bc,useExisting:i},{provide:_p,useValue:null}]),bt],ngContentSelectors:_DA,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["role","rowgroup",1,"mdc-data-table__content"],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(t,n){t&1&&(Ot(kDA),Ze(0),Ze(1,1),T(2,xDA,1,0),T(3,RDA,7,0)(4,NDA,4,0)),t&2&&(Q(2),O(n._isServer?2:-1),Q(),O(n._isNativeHtmlTable?3:4))},dependencies:[DR,yR,bR,vR],styles:[`.mat-mdc-table-sticky{position:sticky !important}mat-table{display:block}mat-header-row{min-height:var(--mat-table-header-container-height, 56px)}mat-row{min-height:var(--mat-table-row-item-container-height, 52px)}mat-footer-row{min-height:var(--mat-table-footer-container-height, 52px)}mat-row,mat-header-row,mat-footer-row{display:flex;border-width:0;border-bottom-width:1px;border-style:solid;align-items:center;box-sizing:border-box}mat-cell:first-of-type,mat-header-cell:first-of-type,mat-footer-cell:first-of-type{padding-left:24px}[dir=rtl] mat-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:first-of-type:not(:only-of-type){padding-left:0;padding-right:24px}mat-cell:last-of-type,mat-header-cell:last-of-type,mat-footer-cell:last-of-type{padding-right:24px}[dir=rtl] mat-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:last-of-type:not(:only-of-type){padding-right:0;padding-left:24px}mat-cell,mat-header-cell,mat-footer-cell{flex:1;display:flex;align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit}.mat-mdc-table{min-width:100%;border:0;border-spacing:0;table-layout:auto;white-space:normal;background-color:var(--mat-table-background-color, var(--mat-sys-surface))}.mat-table-fixed-layout{table-layout:fixed}.mdc-data-table__cell{box-sizing:border-box;overflow:hidden;text-align:start;text-overflow:ellipsis}.mdc-data-table__cell,.mdc-data-table__header-cell{padding:0 16px}.mat-mdc-header-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-header-container-height, 56px);color:var(--mat-table-header-headline-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-header-headline-font, var(--mat-sys-title-small-font, Roboto, sans-serif));line-height:var(--mat-table-header-headline-line-height, var(--mat-sys-title-small-line-height));font-size:var(--mat-table-header-headline-size, var(--mat-sys-title-small-size, 14px));font-weight:var(--mat-table-header-headline-weight, var(--mat-sys-title-small-weight, 500))}.mat-mdc-row{height:var(--mat-table-row-item-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)))}.mat-mdc-row,.mdc-data-table__content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-table-row-item-label-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-row-item-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-row-item-label-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-row-item-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-footer-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-footer-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-footer-supporting-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-footer-supporting-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-footer-supporting-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-footer-supporting-text-weight, var(--mat-sys-body-medium-weight));letter-spacing:var(--mat-table-footer-supporting-text-tracking, var(--mat-sys-body-medium-tracking))}.mat-mdc-header-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-header-headline-tracking, var(--mat-sys-title-small-tracking));font-weight:inherit;line-height:inherit;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;outline:none;text-align:start}.mdc-data-table__row:last-child>.mat-mdc-header-cell{border-bottom:none}.mat-mdc-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking));line-height:inherit}.mdc-data-table__row:last-child>.mat-mdc-cell{border-bottom:none}.mat-mdc-footer-cell{letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking))}mat-row.mat-mdc-row,mat-header-row.mat-mdc-header-row,mat-footer-row.mat-mdc-footer-row{border-bottom:none}.mat-mdc-table tbody,.mat-mdc-table tfoot,.mat-mdc-table thead,.mat-mdc-cell,.mat-mdc-footer-cell,.mat-mdc-header-row,.mat-mdc-row,.mat-mdc-footer-row,.mat-mdc-table .mat-mdc-header-cell{background:inherit}.mat-mdc-table mat-header-row.mat-mdc-header-row,.mat-mdc-table mat-row.mat-mdc-row,.mat-mdc-table mat-footer-row.mat-mdc-footer-cell{height:unset}mat-header-cell.mat-mdc-header-cell,mat-cell.mat-mdc-cell,mat-footer-cell.mat-mdc-footer-cell{align-self:stretch} -`],encapsulation:2})}return i})(),A$=(()=>{class i extends uy{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["","matCellDef",""]],features:[pt([{provide:uy,useExisting:i}]),bt]})}return i})(),e$=(()=>{class i extends py{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["","matHeaderCellDef",""]],features:[pt([{provide:py,useExisting:i}]),bt]})}return i})();var t$=(()=>{class i extends ME{get name(){return this._name}set name(A){this._setNameInput(A)}_updateColumnCssClassName(){super._updateColumnCssClassName(),this._columnCssClassName.push(`mat-column-${this.cssClassFriendlyName}`)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["","matColumnDef",""]],inputs:{name:[0,"matColumnDef","name"]},features:[pt([{provide:ME,useExisting:i}]),bt]})}return i})(),i$=(()=>{class i extends WX{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["mat-header-cell"],["th","mat-header-cell",""]],hostAttrs:["role","columnheader",1,"mat-mdc-header-cell","mdc-data-table__header-cell"],features:[bt]})}return i})();var n$=(()=>{class i extends ZX{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["mat-cell"],["td","mat-cell",""]],hostAttrs:[1,"mat-mdc-cell","mdc-data-table__cell"],features:[bt]})}return i})();var o$=(()=>{class i extends fy{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275dir=VA({type:i,selectors:[["","matRowDef",""]],inputs:{columns:[0,"matRowDefColumns","columns"],when:[0,"matRowDefWhen","when"]},features:[pt([{provide:fy,useExisting:i}]),bt]})}return i})();var a$=(()=>{class i extends wR{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Li(i)))(n||i)}})();static \u0275cmp=vA({type:i,selectors:[["mat-row"],["tr","mat-row",""]],hostAttrs:["role","row",1,"mat-mdc-row","mdc-data-table__row"],exportAs:["matRow"],features:[pt([{provide:wR,useExisting:i}]),bt],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(t,n){t&1&&dn(0,0)},dependencies:[xp],encapsulation:2})}return i})();var FDA=9007199254740991,dI=class extends Au{_data;_renderData=new gi([]);_filter=new gi("");_internalPageChanges=new ne;_renderChangesSubscription=null;filteredData;get data(){return this._data.value}set data(e){e=Array.isArray(e)?e:[],this._data.next(e),this._renderChangesSubscription||this._filterData(e)}get filter(){return this._filter.value}set filter(e){this._filter.next(e),this._renderChangesSubscription||this._filterData(this.data)}get sort(){return this._sort}set sort(e){this._sort=e,this._updateChangeSubscription()}_sort;get paginator(){return this._paginator}set paginator(e){this._paginator=e,this._updateChangeSubscription()}_paginator;sortingDataAccessor=(e,A)=>{let t=e[A];if(k3(t)){let n=Number(t);return n{let t=A.active,n=A.direction;return!t||n==""?e:e.sort((o,a)=>{let r=this.sortingDataAccessor(o,t),s=this.sortingDataAccessor(a,t),l=typeof r,g=typeof s;l!==g&&(l==="number"&&(r+=""),g==="number"&&(s+=""));let C=0;return r!=null&&s!=null?r>s?C=1:r{let t=A.trim().toLowerCase();return Object.values(e).some(n=>`${n}`.toLowerCase().includes(t))};constructor(e=[]){super(),this._data=new gi(e),this._updateChangeSubscription()}_updateChangeSubscription(){let e=this._sort?Vi(this._sort.sortChange,this._sort.initialized):oe(null),A=this._paginator?Vi(this._paginator.page,this._internalPageChanges,this._paginator.initialized):oe(null),t=this._data,n=Dr([t,this._filter]).pipe(Se(([r])=>this._filterData(r))),o=Dr([n,e]).pipe(Se(([r])=>this._orderData(r))),a=Dr([o,A]).pipe(Se(([r])=>this._pageData(r)));this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=a.subscribe(r=>this._renderData.next(r))}_filterData(e){return this.filteredData=this.filter==null||this.filter===""?e:e.filter(A=>this.filterPredicate(A,this.filter)),this.paginator&&this._updatePaginator(this.filteredData.length),this.filteredData}_orderData(e){return this.sort?this.sortData(e.slice(),this.sort):e}_pageData(e){if(!this.paginator)return e;let A=this.paginator.pageIndex*this.paginator.pageSize;return e.slice(A,A+this.paginator.pageSize)}_updatePaginator(e){Promise.resolve().then(()=>{let A=this.paginator;if(A&&(A.length=e,A.pageIndex>0)){let t=Math.ceil(A.length/A.pageSize)-1||0,n=Math.min(A.pageIndex,t);n!==A.pageIndex&&(A.pageIndex=n,this._internalPageChanges.next())}})}connect(){return this._renderChangesSubscription||this._updateChangeSubscription(),this._renderData}disconnect(){this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=null}};var SE=[{metricName:"tool_trajectory_avg_score",threshold:1},{metricName:"response_match_score",threshold:.7}];var my="0123456789abcdef",wy=class i{constructor(e){this.bytes=e}static ofInner(e){if(e.length!==16)throw new TypeError("not 128-bit length");return new i(e)}static fromFieldsV7(e,A,t,n){if(!Number.isInteger(e)||!Number.isInteger(A)||!Number.isInteger(t)||!Number.isInteger(n)||e<0||A<0||t<0||n<0||e>0xffffffffffff||A>4095||t>1073741823||n>4294967295)throw new RangeError("invalid field value");let o=new Uint8Array(16);return o[0]=e/2**40,o[1]=e/2**32,o[2]=e/2**24,o[3]=e/2**16,o[4]=e/2**8,o[5]=e,o[6]=112|A>>>8,o[7]=A,o[8]=128|t>>>24,o[9]=t>>>16,o[10]=t>>>8,o[11]=t,o[12]=n>>>24,o[13]=n>>>16,o[14]=n>>>8,o[15]=n,new i(o)}static parse(e){var A,t,n,o;let a;switch(e.length){case 32:a=(A=/^[0-9a-f]{32}$/i.exec(e))===null||A===void 0?void 0:A[0];break;case 36:a=(t=/^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(e))===null||t===void 0?void 0:t.slice(1,6).join("");break;case 38:a=(n=/^\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\}$/i.exec(e))===null||n===void 0?void 0:n.slice(1,6).join("");break;case 45:a=(o=/^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(e))===null||o===void 0?void 0:o.slice(1,6).join("");break;default:break}if(a){let r=new Uint8Array(16);for(let s=0;s<16;s+=4){let l=parseInt(a.substring(2*s,2*s+8),16);r[s+0]=l>>>24,r[s+1]=l>>>16,r[s+2]=l>>>8,r[s+3]=l}return new i(r)}else throw new SyntaxError("could not parse UUID string")}toString(){let e="";for(let A=0;A>>4),e+=my.charAt(this.bytes[A]&15),(A===3||A===5||A===7||A===9)&&(e+="-");return e}toHex(){let e="";for(let A=0;A>>4),e+=my.charAt(this.bytes[A]&15);return e}toJSON(){return this.toString()}getVariant(){let e=this.bytes[8]>>>4;if(e<0)throw new Error("unreachable");if(e<=7)return this.bytes.every(A=>A===0)?"NIL":"VAR_0";if(e<=11)return"VAR_10";if(e<=13)return"VAR_110";if(e<=15)return this.bytes.every(A=>A===255)?"MAX":"VAR_RESERVED";throw new Error("unreachable")}getVersion(){return this.getVariant()==="VAR_10"?this.bytes[6]>>>4:void 0}clone(){return new i(this.bytes.slice(0))}equals(e){return this.compareTo(e)===0}compareTo(e){for(let A=0;A<16;A++){let t=this.bytes[A]-e.bytes[A];if(t!==0)return Math.sign(t)}return 0}},SR=class{constructor(e){this.timestamp_biased=0,this.counter=0,this.random=e??LDA()}generate(){return this.generateOrResetCore(Date.now(),1e4)}generateOrAbort(){return this.generateOrAbortCore(Date.now(),1e4)}generateOrResetCore(e,A){let t=this.generateOrAbortCore(e,A);return t===void 0&&(this.timestamp_biased=0,t=this.generateOrAbortCore(e,A)),t}generateOrAbortCore(e,A){if(!Number.isInteger(e)||e<0||e>0xffffffffffff)throw new RangeError("`unixTsMs` must be a 48-bit unsigned integer");if(A<0||A>0xffffffffffff)throw new RangeError("`rollbackAllowance` out of reasonable range");if(e++,e>this.timestamp_biased)this.timestamp_biased=e,this.resetCounter();else if(e+A>=this.timestamp_biased)this.counter++,this.counter>4398046511103&&(this.timestamp_biased++,this.resetCounter());else return;return wy.fromFieldsV7(this.timestamp_biased-1,Math.trunc(this.counter/2**30),this.counter&2**30-1,this.random.nextUint32())}resetCounter(){this.counter=this.random.nextUint32()*1024+(this.random.nextUint32()&1023)}generateV4(){let e=new Uint8Array(Uint32Array.of(this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32()).buffer);return e[6]=64|e[6]>>>4,e[8]=128|e[8]>>>2,wy.ofInner(e)}},LDA=()=>{if(typeof crypto<"u"&&typeof crypto.getRandomValues<"u")return new kR;if(typeof UUIDV7_DENY_WEAK_RNG<"u"&&UUIDV7_DENY_WEAK_RNG)throw new Error("no cryptographically strong RNG available");return{nextUint32:()=>Math.trunc(Math.random()*65536)*65536+Math.trunc(Math.random()*65536)}},kR=class{constructor(){this.buffer=new Uint32Array(8),this.cursor=65535}nextUint32(){return this.cursor>=this.buffer.length&&(crypto.getRandomValues(this.buffer),this.cursor=0),this.buffer[this.cursor++]}},r$;var yy=()=>GDA().toString(),GDA=()=>(r$||(r$=new SR)).generateV4();function KDA(i,e){i&1&&(I(0,"div",1),lA(1,"mat-progress-spinner",6),h()),i&2&&(Q(),H("diameter",28)("strokeWidth",3))}function UDA(i,e){if(i&1){let A=aA();I(0,"mat-form-field",2)(1,"input",7),Ni("ngModelChange",function(n){L(A);let o=p();return wi(o.newCaseId,n)||(o.newCaseId=n),G(n)}),U("keydown.enter",function(){L(A);let n=p();return G(n.createNewEvalCase())}),h()()}if(i&2){let A=p();Q(),Ri("ngModel",A.newCaseId)}}var Dy=class i{evalService=w(A0);data=w(Do);dialogRef=w(zn);newCaseId=this.data.defaultName||"case_"+yy().slice(0,6);loading=!1;constructor(){}createNewEvalCase(){if(!this.newCaseId||this.newCaseId=="")alert("Cannot create eval set with empty id!");else{if(this.data.existingCases?.includes(this.newCaseId)&&!confirm(`Eval case "${this.newCaseId}" already exists. Do you want to overwrite it?`))return;this.loading=!0,this.evalService.addCurrentSession(this.data.appName,this.data.evalSetId,this.newCaseId,this.data.sessionId,this.data.userId).subscribe({next:e=>{this.dialogRef.close(!0)},error:e=>{this.loading=!1,alert("Failed to add session to eval set!")}})}}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-add-eval-session-dialog"]],decls:11,vars:3,consts:[["mat-dialog-title",""],[2,"display","flex","justify-content","center","padding","20px"],[2,"padding-left","20px","padding-right","24px"],["align","end"],["mat-button","","mat-dialog-close","",3,"disabled"],["mat-button","","cdkFocusInitial","",3,"click","disabled"],["mode","indeterminate",3,"diameter","strokeWidth"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"]],template:function(A,t){A&1&&(I(0,"h2",0),D(1,"Add Current Session To Eval Set"),h(),I(2,"mat-dialog-content"),D(3,` Please enter the eval case name -`),h(),T(4,KDA,2,2,"div",1)(5,UDA,2,1,"mat-form-field",2),I(6,"mat-dialog-actions",3)(7,"button",4),D(8,"Cancel"),h(),I(9,"button",5),U("click",function(){return t.createNewEvalCase()}),D(10,"Create"),h()()),A&2&&(Q(4),O(t.loading?4:5),Q(3),H("disabled",t.loading),Q(2),H("disabled",t.loading))},dependencies:[Xo,Ba,Zo,ka,fn,Gn,Kn,Ho,ha,ki,r2,Es],styles:["h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important}"]})};var TDA={allEvalSetsHeader:"Eval sets",createNewEvalSetTooltip:"Create new evaluation set",createNewEvalSetTitle:"Create New Evaluation Set",evalSetDescription:"An evaluation set is a curated collection of evaluation cases, where each case includes input-output examples for assessing agent performance.",createEvalSetButton:"Create Evaluation Set",runEvaluationButton:"Run All",runSelectedEvaluationButton:"Run Selected",viewEvalRunHistoryTooltip:"View eval run history",caseIdHeader:"Case ID",resultHeader:"Result",viewEvalRunResultTooltip:"View eval run result",passStatus:"Pass",failStatus:"Fail",passStatusCaps:"PASS",failStatusCaps:"FAIL",passedSuffix:"Passed",failedSuffix:"Failed",addSessionToSetButtonPrefix:"From Current Session",deleteEvalCaseTooltip:"Delete eval case",editEvalCaseTooltip:"Edit eval case",deleteEvalSetTooltip:"Delete eval set"},s$=new MA("Eval Tab Messages",{factory:()=>TDA});function ODA(i,e){if(i&1){let A=aA();I(0,"mat-form-field",1)(1,"mat-label"),D(2,"Execution Mode"),h(),I(3,"mat-select",6),U("selectionChange",function(n){L(A);let o=p();return G(o.executionMode=n.value)}),I(4,"mat-option",7),D(5,"Live"),h(),I(6,"mat-option",8),D(7,"Replay"),h()()()}if(i&2){let A=p();Q(3),H("value",A.executionMode)}}var vy=class i{evalService=w(A0);featureFlagService=w(Nr);data=w(Do);dialogRef=w(zn);newSetId=this.data.defaultName||"evalset_"+yy().slice(0,6);executionMode="live";isEvalV2Enabled=!1;constructor(){this.featureFlagService.isEvalV2Enabled().subscribe(e=>{this.isEvalV2Enabled=e})}createNewEvalSet(){if(!this.newSetId||this.newSetId=="")alert("Cannot create eval set with empty id!");else{let e=this.isEvalV2Enabled?this.executionMode:void 0;this.evalService.createNewEvalSet(this.data.appName,this.newSetId,e).subscribe(A=>{this.dialogRef.close(!0)})}}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-new-eval-set-dialog-component"]],decls:14,vars:2,consts:[["mat-dialog-title",""],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"],[3,"selectionChange","value"],["value","live"],["value","replay"]],template:function(A,t){A&1&&(I(0,"h2",0),D(1,"Create New Eval Set"),h(),I(2,"mat-dialog-content"),D(3,` Please enter the eval set name -`),h(),I(4,"mat-form-field",1)(5,"mat-label"),D(6,"Eval Set Name"),h(),I(7,"input",2),Ni("ngModelChange",function(o){return wi(t.newSetId,o)||(t.newSetId=o),o}),U("keydown.enter",function(){return t.createNewEvalSet()}),h()(),T(8,ODA,8,1,"mat-form-field",1),I(9,"mat-dialog-actions",3)(10,"button",4),D(11,"Cancel"),h(),I(12,"button",5),U("click",function(){return t.createNewEvalSet()}),D(13,"Create"),h()()),A&2&&(Q(7),Ri("ngModel",t.newSetId),Q(),O(t.isEvalV2Enabled?8:-1))},dependencies:[Xo,Ba,Zo,ka,fn,Gn,Kn,Ho,ha,ki,r2,W0,xs,ig,Vr],styles:["h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important}"]})};var JDA=["knob"],YDA=["valueIndicatorContainer"];function HDA(i,e){if(i&1&&(I(0,"div",2,1)(2,"div",5)(3,"span",6),D(4),h()()()),i&2){let A=p();Q(4),nA(A.valueIndicatorText)}}var zDA=["trackActive"],PDA=["*"];function jDA(i,e){if(i&1&&lA(0,"div"),i&2){let A=e.$implicit,t=e.$index,n=p(3);Ao(A===0?"mdc-slider__tick-mark--active":"mdc-slider__tick-mark--inactive"),ft("transform",n._calcTickMarkTransform(t))}}function VDA(i,e){if(i&1&&ke(0,jDA,1,4,"div",8,Ja),i&2){let A=p(2);_e(A._tickMarks)}}function qDA(i,e){if(i&1&&(I(0,"div",6,1),T(2,VDA,2,0),h()),i&2){let A=p();Q(2),O(A._cachedWidth?2:-1)}}function WDA(i,e){if(i&1&&lA(0,"mat-slider-visual-thumb",7),i&2){let A=p();H("discrete",A.discrete)("thumbPosition",1)("valueIndicatorText",A.startValueIndicatorText)}}var Ti=(function(i){return i[i.START=1]="START",i[i.END=2]="END",i})(Ti||{}),kE=(function(i){return i[i.ACTIVE=0]="ACTIVE",i[i.INACTIVE=1]="INACTIVE",i})(kE||{}),_R=new MA("_MatSlider"),l$=new MA("_MatSliderThumb"),ZDA=new MA("_MatSliderRangeThumb"),g$=new MA("_MatSliderVisualThumb");var XDA=(()=>{class i{_cdr=w(Mt);_ngZone=w(We);_slider=w(_R);_renderer=w(on);_listenerCleanups;discrete=!1;thumbPosition;valueIndicatorText;_ripple;_knob;_valueIndicatorContainer;_sliderInput;_sliderInputEl;_hoverRippleRef;_focusRippleRef;_activeRippleRef;_isHovered=!1;_isActive=!1;_isValueIndicatorVisible=!1;_hostElement=w(ce).nativeElement;_platform=w(Qi);constructor(){}ngAfterViewInit(){let A=this._slider._getInput(this.thumbPosition);A&&(this._ripple.radius=24,this._sliderInput=A,this._sliderInputEl=this._sliderInput._hostElement,this._ngZone.runOutsideAngular(()=>{let t=this._sliderInputEl,n=this._renderer;this._listenerCleanups=[n.listen(t,"pointermove",this._onPointerMove),n.listen(t,"pointerdown",this._onDragStart),n.listen(t,"pointerup",this._onDragEnd),n.listen(t,"pointerleave",this._onMouseLeave),n.listen(t,"focus",this._onFocus),n.listen(t,"blur",this._onBlur)]}))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A())}_onPointerMove=A=>{if(this._sliderInput._isFocused)return;let t=this._hostElement.getBoundingClientRect(),n=this._slider._isCursorOnSliderThumb(A,t);this._isHovered=n,n?this._showHoverRipple():this._hideRipple(this._hoverRippleRef)};_onMouseLeave=()=>{this._isHovered=!1,this._hideRipple(this._hoverRippleRef)};_onFocus=()=>{this._hideRipple(this._hoverRippleRef),this._showFocusRipple(),this._hostElement.classList.add("mdc-slider__thumb--focused")};_onBlur=()=>{this._isActive||this._hideRipple(this._focusRippleRef),this._isHovered&&this._showHoverRipple(),this._hostElement.classList.remove("mdc-slider__thumb--focused")};_onDragStart=A=>{A.button===0&&(this._isActive=!0,this._showActiveRipple())};_onDragEnd=()=>{this._isActive=!1,this._hideRipple(this._activeRippleRef),this._sliderInput._isFocused||this._hideRipple(this._focusRippleRef),this._platform.SAFARI&&this._showHoverRipple()};_showHoverRipple(){this._isShowingRipple(this._hoverRippleRef)||(this._hoverRippleRef=this._showRipple({enterDuration:0,exitDuration:0}),this._hoverRippleRef?.element.classList.add("mat-mdc-slider-hover-ripple"))}_showFocusRipple(){this._isShowingRipple(this._focusRippleRef)||(this._focusRippleRef=this._showRipple({enterDuration:0,exitDuration:0},!0),this._focusRippleRef?.element.classList.add("mat-mdc-slider-focus-ripple"))}_showActiveRipple(){this._isShowingRipple(this._activeRippleRef)||(this._activeRippleRef=this._showRipple({enterDuration:225,exitDuration:400}),this._activeRippleRef?.element.classList.add("mat-mdc-slider-active-ripple"))}_isShowingRipple(A){return A?.state===_s.FADING_IN||A?.state===_s.VISIBLE}_showRipple(A,t){if(!this._slider.disabled&&(this._showValueIndicator(),this._slider._isRange&&this._slider._getThumb(this.thumbPosition===Ti.START?Ti.END:Ti.START)._showValueIndicator(),!(this._slider._globalRippleOptions?.disabled&&!t)))return this._ripple.launch({animation:this._slider._noopAnimations?{enterDuration:0,exitDuration:0}:A,centered:!0,persistent:!0})}_hideRipple(A){if(A?.fadeOut(),this._isShowingAnyRipple())return;this._slider._isRange||this._hideValueIndicator();let t=this._getSibling();t._isShowingAnyRipple()||(this._hideValueIndicator(),t._hideValueIndicator())}_showValueIndicator(){this._hostElement.classList.add("mdc-slider__thumb--with-indicator")}_hideValueIndicator(){this._hostElement.classList.remove("mdc-slider__thumb--with-indicator")}_getSibling(){return this._slider._getThumb(this.thumbPosition===Ti.START?Ti.END:Ti.START)}_getValueIndicatorContainer(){return this._valueIndicatorContainer?.nativeElement}_getKnob(){return this._knob.nativeElement}_isShowingAnyRipple(){return this._isShowingRipple(this._hoverRippleRef)||this._isShowingRipple(this._focusRippleRef)||this._isShowingRipple(this._activeRippleRef)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=vA({type:i,selectors:[["mat-slider-visual-thumb"]],viewQuery:function(t,n){if(t&1&&Wt(Cs,5)(JDA,5)(YDA,5),t&2){let o;se(o=le())&&(n._ripple=o.first),se(o=le())&&(n._knob=o.first),se(o=le())&&(n._valueIndicatorContainer=o.first)}},hostAttrs:[1,"mdc-slider__thumb","mat-mdc-slider-visual-thumb"],inputs:{discrete:"discrete",thumbPosition:"thumbPosition",valueIndicatorText:"valueIndicatorText"},features:[pt([{provide:g$,useExisting:i}])],decls:4,vars:2,consts:[["knob",""],["valueIndicatorContainer",""],[1,"mdc-slider__value-indicator-container"],[1,"mdc-slider__thumb-knob"],["matRipple","",1,"mat-focus-indicator",3,"matRippleDisabled"],[1,"mdc-slider__value-indicator"],[1,"mdc-slider__value-indicator-text"]],template:function(t,n){t&1&&(T(0,HDA,5,1,"div",2),lA(1,"div",3,0)(3,"div",4)),t&2&&(O(n.discrete?0:-1),Q(3),H("matRippleDisabled",!0))},dependencies:[Cs],styles:[`.mat-mdc-slider-visual-thumb .mat-ripple{height:100%;width:100%}.mat-mdc-slider .mdc-slider__tick-marks{justify-content:start}.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--active,.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--inactive{position:absolute;left:2px} -`],encapsulation:2,changeDetection:0})}return i})(),c$=(()=>{class i{_ngZone=w(We);_cdr=w(Mt);_elementRef=w(ce);_dir=w(No,{optional:!0});_globalRippleOptions=w($C,{optional:!0});_trackActive;_thumbs;_input;_inputs;get disabled(){return this._disabled}set disabled(A){this._disabled=A;let t=this._getInput(Ti.END),n=this._getInput(Ti.START);t&&(t.disabled=this._disabled),n&&(n.disabled=this._disabled)}_disabled=!1;get discrete(){return this._discrete}set discrete(A){this._discrete=A,this._updateValueIndicatorUIs()}_discrete=!1;get showTickMarks(){return this._showTickMarks}set showTickMarks(A){this._showTickMarks=A,this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI())}_showTickMarks=!1;get min(){return this._min}set min(A){let t=A==null||isNaN(A)?this._min:A;this._min!==t&&this._updateMin(t)}_min=0;color;disableRipple=!1;_updateMin(A){let t=this._min;this._min=A,this._isRange?this._updateMinRange({old:t,new:A}):this._updateMinNonRange(A),this._onMinMaxOrStepChange()}_updateMinRange(A){let t=this._getInput(Ti.END),n=this._getInput(Ti.START),o=t.value,a=n.value;n.min=A.new,t.min=Math.max(A.new,n.value),n.max=Math.min(t.max,t.value),n._updateWidthInactive(),t._updateWidthInactive(),A.newA.old?this._onTranslateXChangeBySideEffect(n,t):this._onTranslateXChangeBySideEffect(t,n),o!==t.value&&this._onValueChange(t),a!==n.value&&this._onValueChange(n)}_updateMaxNonRange(A){let t=this._getInput(Ti.END);if(t){let n=t.value;t.max=A,t._updateThumbUIByValue(),this._updateTrackUI(t),n!==t.value&&this._onValueChange(t)}}get step(){return this._step}set step(A){let t=isNaN(A)?this._step:A;this._step!==t&&this._updateStep(t)}_step=1;_updateStep(A){this._step=A,this._isRange?this._updateStepRange():this._updateStepNonRange(),this._onMinMaxOrStepChange()}_updateStepRange(){let A=this._getInput(Ti.END),t=this._getInput(Ti.START),n=A.value,o=t.value,a=t.value;A.min=this._min,t.max=this._max,A.step=this._step,t.step=this._step,this._platform.SAFARI&&(A.value=A.value,t.value=t.value),A.min=Math.max(this._min,t.value),t.max=Math.min(this._max,A.value),t._updateWidthInactive(),A._updateWidthInactive(),A.value`${A}`;_tickMarks;_noopAnimations=In();_dirChangeSubscription;_resizeObserver=null;_cachedWidth;_cachedLeft;_rippleRadius=24;startValueIndicatorText="";endValueIndicatorText="";_endThumbTransform;_startThumbTransform;_isRange=!1;_isRtl=!1;_hasViewInitialized=!1;_tickMarkTrackWidth=0;_hasAnimation=!1;_resizeTimer=null;_platform=w(Qi);constructor(){w(Eo).load(Qr),this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe(()=>this._onDirChange()),this._isRtl=this._dir.value==="rtl")}_knobRadius=8;_inputPadding;ngAfterViewInit(){this._platform.isBrowser&&this._updateDimensions();let A=this._getInput(Ti.END),t=this._getInput(Ti.START);this._isRange=!!A&&!!t,this._cdr.detectChanges();let n=this._getThumb(Ti.END);this._rippleRadius=n._ripple.radius,this._inputPadding=this._rippleRadius-this._knobRadius,this._isRange?this._initUIRange(A,t):this._initUINonRange(A),this._updateTrackUI(A),this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._observeHostResize(),this._cdr.detectChanges()}_initUINonRange(A){A.initProps(),A.initUI(),this._updateValueIndicatorUI(A),this._hasViewInitialized=!0,A._updateThumbUIByValue()}_initUIRange(A,t){A.initProps(),A.initUI(),t.initProps(),t.initUI(),A._updateMinMax(),t._updateMinMax(),A._updateStaticStyles(),t._updateStaticStyles(),this._updateValueIndicatorUIs(),this._hasViewInitialized=!0,A._updateThumbUIByValue(),t._updateThumbUIByValue()}ngOnDestroy(){this._dirChangeSubscription?.unsubscribe(),this._resizeObserver?.disconnect(),this._resizeObserver=null}_onDirChange(){this._isRtl=this._dir?.value==="rtl",this._isRange?this._onDirChangeRange():this._onDirChangeNonRange(),this._updateTickMarkUI()}_onDirChangeRange(){let A=this._getInput(Ti.END),t=this._getInput(Ti.START);A._setIsLeftThumb(),t._setIsLeftThumb(),A.translateX=A._calcTranslateXByValue(),t.translateX=t._calcTranslateXByValue(),A._updateStaticStyles(),t._updateStaticStyles(),A._updateWidthInactive(),t._updateWidthInactive(),A._updateThumbUIByValue(),t._updateThumbUIByValue()}_onDirChangeNonRange(){this._getInput(Ti.END)._updateThumbUIByValue()}_observeHostResize(){typeof ResizeObserver>"u"||!ResizeObserver||this._ngZone.runOutsideAngular(()=>{this._resizeObserver=new ResizeObserver(()=>{this._isActive()||(this._resizeTimer&&clearTimeout(this._resizeTimer),this._onResize())}),this._resizeObserver.observe(this._elementRef.nativeElement)})}_isActive(){return this._getThumb(Ti.START)._isActive||this._getThumb(Ti.END)._isActive}_getValue(A=Ti.END){let t=this._getInput(A);return t?t.value:this.min}_skipUpdate(){return!!(this._getInput(Ti.START)?._skipUIUpdate||this._getInput(Ti.END)?._skipUIUpdate)}_updateDimensions(){this._cachedWidth=this._elementRef.nativeElement.offsetWidth,this._cachedLeft=this._elementRef.nativeElement.getBoundingClientRect().left}_setTrackActiveStyles(A){let t=this._trackActive.nativeElement.style;t.left=A.left,t.right=A.right,t.transformOrigin=A.transformOrigin,t.transform=A.transform}_calcTickMarkTransform(A){let t=A*(this._tickMarkTrackWidth/(this._tickMarks.length-1));return`translateX(${this._isRtl?this._cachedWidth-6-t:t}px)`}_onTranslateXChange(A){this._hasViewInitialized&&(this._updateThumbUI(A),this._updateTrackUI(A),this._updateOverlappingThumbUI(A))}_onTranslateXChangeBySideEffect(A,t){this._hasViewInitialized&&(A._updateThumbUIByValue(),t._updateThumbUIByValue())}_onValueChange(A){this._hasViewInitialized&&(this._updateValueIndicatorUI(A),this._updateTickMarkUI(),this._cdr.detectChanges())}_onMinMaxOrStepChange(){this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.markForCheck())}_onResize(){if(this._hasViewInitialized){if(this._updateDimensions(),this._isRange){let A=this._getInput(Ti.END),t=this._getInput(Ti.START);A._updateThumbUIByValue(),t._updateThumbUIByValue(),A._updateStaticStyles(),t._updateStaticStyles(),A._updateMinMax(),t._updateMinMax(),A._updateWidthInactive(),t._updateWidthInactive()}else{let A=this._getInput(Ti.END);A&&A._updateThumbUIByValue()}this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.detectChanges()}}_thumbsOverlap=!1;_areThumbsOverlapping(){let A=this._getInput(Ti.START),t=this._getInput(Ti.END);return!A||!t?!1:t.translateX-A.translateX<20}_updateOverlappingThumbClassNames(A){let t=A.getSibling(),n=this._getThumb(A.thumbPosition);this._getThumb(t.thumbPosition)._hostElement.classList.remove("mdc-slider__thumb--top"),n._hostElement.classList.toggle("mdc-slider__thumb--top",this._thumbsOverlap)}_updateOverlappingThumbUI(A){!this._isRange||this._skipUpdate()||this._thumbsOverlap!==this._areThumbsOverlapping()&&(this._thumbsOverlap=!this._thumbsOverlap,this._updateOverlappingThumbClassNames(A))}_updateThumbUI(A){if(this._skipUpdate())return;let t=this._getThumb(A.thumbPosition===Ti.END?Ti.END:Ti.START);t._hostElement.style.transform=`translateX(${A.translateX}px)`}_updateValueIndicatorUI(A){if(this._skipUpdate())return;let t=this.displayWith(A.value);if(this._hasViewInitialized?A._valuetext.set(t):A._hostElement.setAttribute("aria-valuetext",t),this.discrete){A.thumbPosition===Ti.START?this.startValueIndicatorText=t:this.endValueIndicatorText=t;let n=this._getThumb(A.thumbPosition);t.length<3?n._hostElement.classList.add("mdc-slider__thumb--short-value"):n._hostElement.classList.remove("mdc-slider__thumb--short-value")}}_updateValueIndicatorUIs(){let A=this._getInput(Ti.END),t=this._getInput(Ti.START);A&&this._updateValueIndicatorUI(A),t&&this._updateValueIndicatorUI(t)}_updateTickMarkTrackUI(){if(!this.showTickMarks||this._skipUpdate())return;let A=this._step&&this._step>0?this._step:1,n=(Math.floor(this.max/A)*A-this.min)/(this.max-this.min);this._tickMarkTrackWidth=(this._cachedWidth-6)*n}_updateTrackUI(A){this._skipUpdate()||(this._isRange?this._updateTrackUIRange(A):this._updateTrackUINonRange(A))}_updateTrackUIRange(A){let t=A.getSibling();if(!t||!this._cachedWidth)return;let n=Math.abs(t.translateX-A.translateX)/this._cachedWidth;A._isLeftThumb&&this._cachedWidth?this._setTrackActiveStyles({left:"auto",right:`${this._cachedWidth-t.translateX}px`,transformOrigin:"right",transform:`scaleX(${n})`}):this._setTrackActiveStyles({left:`${t.translateX}px`,right:"auto",transformOrigin:"left",transform:`scaleX(${n})`})}_updateTrackUINonRange(A){this._isRtl?this._setTrackActiveStyles({left:"auto",right:"0px",transformOrigin:"right",transform:`scaleX(${1-A.fillPercentage})`}):this._setTrackActiveStyles({left:"0px",right:"auto",transformOrigin:"left",transform:`scaleX(${A.fillPercentage})`})}_updateTickMarkUI(){if(!this.showTickMarks||this.step===void 0||this.min===void 0||this.max===void 0)return;let A=this.step>0?this.step:1;this._isRange?this._updateTickMarkUIRange(A):this._updateTickMarkUINonRange(A)}_updateTickMarkUINonRange(A){let t=this._getValue(),n=Math.max(Math.round((t-this.min)/A),0)+1,o=Math.max(Math.round((this.max-t)/A),0)-1;this._isRtl?n++:o++,this._tickMarks=Array(n).fill(kE.ACTIVE).concat(Array(o).fill(kE.INACTIVE))}_updateTickMarkUIRange(A){let t=this._getValue(),n=this._getValue(Ti.START),o=Math.max(Math.round((n-this.min)/A),0),a=Math.max(Math.round((t-n)/A)+1,0),r=Math.max(Math.round((this.max-t)/A),0);this._tickMarks=Array(o).fill(kE.INACTIVE).concat(Array(a).fill(kE.ACTIVE),Array(r).fill(kE.INACTIVE))}_getInput(A){if(A===Ti.END&&this._input)return this._input;if(this._inputs?.length)return A===Ti.START?this._inputs.first:this._inputs.last}_getThumb(A){return A===Ti.END?this._thumbs?.last:this._thumbs?.first}_setTransition(A){this._hasAnimation=!this._platform.IOS&&A&&!this._noopAnimations,this._elementRef.nativeElement.classList.toggle("mat-mdc-slider-with-animation",this._hasAnimation)}_isCursorOnSliderThumb(A,t){let n=t.width/2,o=t.x+n,a=t.y+n,r=A.clientX-o,s=A.clientY-a;return Math.pow(r,2)+Math.pow(s,2)xR),multi:!0};var xR=(()=>{class i{_ngZone=w(We);_elementRef=w(ce);_cdr=w(Mt);_slider=w(_R);_platform=w(Qi);_listenerCleanups;get value(){return yn(this._hostElement.value,0)}set value(A){A===null&&(A=this._getDefaultValue()),A=isNaN(A)?0:A;let t=A+"";if(!this._hasSetInitialValue){this._initialValue=t;return}this._isActive||this._setValue(t)}_setValue(A){this._hostElement.value=A,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges(),this._slider._cdr.markForCheck()}valueChange=new FA;dragStart=new FA;dragEnd=new FA;get translateX(){return this._slider.min>=this._slider.max?(this._translateX=this._tickMarkOffset,this._translateX):(this._translateX===void 0&&(this._translateX=this._calcTranslateXByValue()),this._translateX)}set translateX(A){this._translateX=A}_translateX;thumbPosition=Ti.END;get min(){return yn(this._hostElement.min,0)}set min(A){this._hostElement.min=A+"",this._cdr.detectChanges()}get max(){return yn(this._hostElement.max,0)}set max(A){this._hostElement.max=A+"",this._cdr.detectChanges()}get step(){return yn(this._hostElement.step,0)}set step(A){this._hostElement.step=A+"",this._cdr.detectChanges()}get disabled(){return Qe(this._hostElement.disabled)}set disabled(A){this._hostElement.disabled=A,this._cdr.detectChanges(),this._slider.disabled!==this.disabled&&(this._slider.disabled=this.disabled)}get percentage(){return this._slider.min>=this._slider.max?this._slider._isRtl?1:0:(this.value-this._slider.min)/(this._slider.max-this._slider.min)}get fillPercentage(){return this._slider._cachedWidth?this._translateX===0?0:this.translateX/this._slider._cachedWidth:this._slider._isRtl?1:0}_hostElement=this._elementRef.nativeElement;_valuetext=mA("");_knobRadius=8;_tickMarkOffset=3;_isActive=!1;_isFocused=!1;_setIsFocused(A){this._isFocused=A}_hasSetInitialValue=!1;_initialValue;_formControl;_destroyed=new ne;_skipUIUpdate=!1;_onChangeFn;_onTouchedFn=()=>{};_isControlInitialized=!1;constructor(){let A=w(on);this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[A.listen(this._hostElement,"pointerdown",this._onPointerDown.bind(this)),A.listen(this._hostElement,"pointermove",this._onPointerMove.bind(this)),A.listen(this._hostElement,"pointerup",this._onPointerUp.bind(this))]})}ngOnDestroy(){this._listenerCleanups.forEach(A=>A()),this._destroyed.next(),this._destroyed.complete(),this.dragStart.complete(),this.dragEnd.complete()}initProps(){this._updateWidthInactive(),this.disabled!==this._slider.disabled&&(this._slider.disabled=!0),this.step=this._slider.step,this.min=this._slider.min,this.max=this._slider.max,this._initValue()}initUI(){this._updateThumbUIByValue()}_initValue(){this._hasSetInitialValue=!0,this._initialValue===void 0?this.value=this._getDefaultValue():(this._hostElement.value=this._initialValue,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges())}_getDefaultValue(){return this.min}_onBlur(){this._setIsFocused(!1),this._onTouchedFn()}_onFocus(){this._slider._setTransition(!1),this._slider._updateTrackUI(this),this._setIsFocused(!0)}_onChange(){this.valueChange.emit(this.value),this._isActive&&this._updateThumbUIByValue({withAnimation:!0})}_onInput(){this._onChangeFn?.(this.value),(this._slider.step||!this._isActive)&&this._updateThumbUIByValue({withAnimation:!0}),this._slider._onValueChange(this)}_onNgControlValueChange(){(!this._isActive||!this._isFocused)&&(this._slider._onValueChange(this),this._updateThumbUIByValue()),this._slider.disabled=this._formControl.disabled}_onPointerDown(A){if(!(this.disabled||A.button!==0)){if(this._platform.IOS){let t=this._slider._isCursorOnSliderThumb(A,this._slider._getThumb(this.thumbPosition)._hostElement.getBoundingClientRect());this._isActive=t,this._updateWidthActive(),this._slider._updateDimensions();return}this._isActive=!0,this._setIsFocused(!0),this._updateWidthActive(),this._slider._updateDimensions(),this._slider.step||this._updateThumbUIByPointerEvent(A,{withAnimation:!0}),this.disabled||(this._handleValueCorrection(A),this.dragStart.emit({source:this,parent:this._slider,value:this.value}))}}_handleValueCorrection(A){this._skipUIUpdate=!0,setTimeout(()=>{this._skipUIUpdate=!1,this._fixValue(A)},0)}_fixValue(A){let t=A.clientX-this._slider._cachedLeft,n=this._slider._cachedWidth,o=this._slider.step===0?1:this._slider.step,a=Math.floor((this._slider.max-this._slider.min)/o),r=this._slider._isRtl?1-t/n:t/n,l=Math.round(r*a)/a*(this._slider.max-this._slider.min)+this._slider.min,g=Math.round(l/o)*o,C=this.value;if(g===C){this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation});return}this.value=g,this.valueChange.emit(this.value),this._onChangeFn?.(this.value),this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation})}_onPointerMove(A){!this._slider.step&&this._isActive&&this._updateThumbUIByPointerEvent(A)}_onPointerUp(){this._isActive&&(this._isActive=!1,this._platform.SAFARI&&this._setIsFocused(!1),this.dragEnd.emit({source:this,parent:this._slider,value:this.value}),setTimeout(()=>this._updateWidthInactive(),this._platform.IOS?10:0))}_clamp(A){let t=this._tickMarkOffset,n=this._slider._cachedWidth-this._tickMarkOffset;return Math.max(Math.min(A,n),t)}_calcTranslateXByValue(){return this._slider._isRtl?(1-this.percentage)*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset:this.percentage*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset}_calcTranslateXByPointerEvent(A){return A.clientX-this._slider._cachedLeft}_updateWidthActive(){}_updateWidthInactive(){this._hostElement.style.padding=`0 ${this._slider._inputPadding}px`,this._hostElement.style.width=`calc(100% + ${this._slider._inputPadding-this._tickMarkOffset*2}px)`,this._hostElement.style.left=`-${this._slider._rippleRadius-this._tickMarkOffset}px`}_updateThumbUIByValue(A){this.translateX=this._clamp(this._calcTranslateXByValue()),this._updateThumbUI(A)}_updateThumbUIByPointerEvent(A,t){this.translateX=this._clamp(this._calcTranslateXByPointerEvent(A)),this._updateThumbUI(t)}_updateThumbUI(A){this._slider._setTransition(!!A?.withAnimation),this._slider._onTranslateXChange(this)}writeValue(A){(this._isControlInitialized||A!==null)&&(this.value=A)}registerOnChange(A){this._onChangeFn=A,this._isControlInitialized=!0}registerOnTouched(A){this._onTouchedFn=A}setDisabledState(A){this.disabled=A}focus(){this._hostElement.focus()}blur(){this._hostElement.blur()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=VA({type:i,selectors:[["input","matSliderThumb",""]],hostAttrs:["type","range",1,"mdc-slider__input"],hostVars:1,hostBindings:function(t,n){t&1&&U("change",function(){return n._onChange()})("input",function(){return n._onInput()})("blur",function(){return n._onBlur()})("focus",function(){return n._onFocus()}),t&2&&ie("aria-valuetext",n._valuetext())},inputs:{value:[2,"value","value",yn]},outputs:{valueChange:"valueChange",dragStart:"dragStart",dragEnd:"dragEnd"},exportAs:["matSliderThumb"],features:[pt([$DA,{provide:l$,useExisting:i}])]})}return i})();var Q1=class i{transform(e){if(!e)return"";let A=e.replace(/(_avg_score|_score|avg_score)$/,"");return A=A.replace(/_/g," "),A.split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join(" ")}static \u0275fac=function(A){return new(A||i)};static \u0275pipe=KD({name:"formatMetricName",type:i,pure:!0})};function AvA(i,e){if(i&1&&(I(0,"div",9)(1,"div",10)(2,"mat-checkbox",11)(3,"div",12)(4,"span",13),D(5),mt(6,"formatMetricName"),h(),I(7,"span",14),D(8),h()()(),I(9,"div",15)(10,"div",16)(11,"span",17),D(12,"Threshold"),h(),I(13,"div",18)(14,"mat-slider",19),lA(15,"input",20),h(),I(16,"span",21),D(17),h()()()()()()),i&2){let A,t=e.$implicit,n=p(2);Q(2),H("formControlName",t.metricName+"_selected"),Q(2),H("matTooltip",t.metricName),Q(),nA(Ft(6,10,t.metricName)),Q(3),nA(t.description),Q(),ft("visibility",(A=n.evalForm.get(t.metricName+"_selected"))!=null&&A.value?"visible":"hidden"),Q(5),H("min",t.metricValueInfo.interval.minValue)("max",t.metricValueInfo.interval.maxValue),Q(),H("formControlName",t.metricName+"_threshold"),Q(2),Ee(" ",n.evalForm.controls[t.metricName+"_threshold"].value," ")}}function evA(i,e){if(i&1&&(I(0,"div"),kt(1,AvA,18,12,"div",8),h()),i&2){let A=p();Q(),H("ngForOf",A.metricsInfo)}}function tvA(i,e){if(i&1&&(I(0,"div")(1,"div",9)(2,"div",10)(3,"mat-checkbox",22)(4,"span",13),D(5),mt(6,"formatMetricName"),h()(),I(7,"div",15)(8,"div",16)(9,"span",17),D(10,"Threshold"),h(),I(11,"div",18)(12,"mat-slider",23),lA(13,"input",24),h(),I(14,"span",21),D(15),h()()()()()(),I(16,"div",9)(17,"div",10)(18,"mat-checkbox",25)(19,"span",13),D(20),mt(21,"formatMetricName"),h()(),I(22,"div",15)(23,"div",16)(24,"span",17),D(25,"Threshold"),h(),I(26,"div",18)(27,"mat-slider",23),lA(28,"input",26),h(),I(29,"span",21),D(30),h()()()()()()()),i&2){let A,t,n=p();Q(4),H("matTooltip","tool_trajectory_avg_score"),Q(),nA(Ft(6,10,"tool_trajectory_avg_score")),Q(2),ft("visibility",(A=n.evalForm.get("tool_trajectory_avg_score_selected"))!=null&&A.value?"visible":"hidden"),Q(8),Ee(" ",n.evalForm.controls.tool_trajectory_avg_score_threshold.value," "),Q(4),H("matTooltip","response_match_score"),Q(),nA(Ft(21,12,"response_match_score")),Q(2),ft("visibility",(t=n.evalForm.get("response_match_score_selected"))!=null&&t.value?"visible":"hidden"),Q(8),Ee(" ",n.evalForm.controls.response_match_score_threshold.value," ")}}var by=class i{constructor(e,A,t){this.dialogRef=e;this.fb=A;this.data=t;this.evalMetrics=this.data.evalMetrics||[],this.metricsInfo=this.data.metricsInfo||[],this.evalForm=this.fb.group({}),this.metricsInfo.forEach(n=>{let o=this.evalMetrics.find(l=>l.metricName===n.metricName),a=!!o,r=o?o.threshold:this.getDefaultThreshold(n);this.evalForm.addControl(`${n.metricName}_selected`,this.fb.control(a));let s=n.metricValueInfo.interval;this.evalForm.addControl(`${n.metricName}_threshold`,this.fb.control(r,[js.required,js.min(s.minValue),js.max(s.maxValue)]))}),this.metricsInfo.length===0&&this.addDefaultControls()}evalForm;evalMetrics=[];metricsInfo=[];addDefaultControls(){[{name:"tool_trajectory_avg_score",min:0,max:1,default:1},{name:"response_match_score",min:0,max:1,default:.7}].forEach(A=>{let t=this.evalMetrics.find(a=>a.metricName===A.name),n=!!t,o=t?t.threshold:A.default;this.evalForm.addControl(`${A.name}_selected`,this.fb.control(n)),this.evalForm.addControl(`${A.name}_threshold`,this.fb.control(o,[js.required,js.min(A.min),js.max(A.max)]))})}getDefaultThreshold(e){return e.metricName==="tool_trajectory_avg_score"?1:e.metricName==="response_match_score"?.7:e.metricValueInfo.interval.maxValue}onReset(){this.metricsInfo.forEach(e=>{let A=SE.find(o=>o.metricName===e.metricName),t=!!A,n=A?A.threshold:this.getDefaultThreshold(e);this.evalForm.get(`${e.metricName}_selected`)?.setValue(t),this.evalForm.get(`${e.metricName}_threshold`)?.setValue(n)}),this.metricsInfo.length===0&&SE.forEach(e=>{this.evalForm.get(`${e.metricName}_selected`)?.setValue(!0),this.evalForm.get(`${e.metricName}_threshold`)?.setValue(e.threshold)})}onStart(){if(this.evalForm.valid){let e=[];this.metricsInfo.length>0?this.metricsInfo.forEach(A=>{if(this.evalForm.get(`${A.metricName}_selected`)?.value){let n=this.evalForm.get(`${A.metricName}_threshold`)?.value;e.push({metricName:A.metricName,threshold:n})}}):["tool_trajectory_avg_score","response_match_score"].forEach(t=>{if(this.evalForm.get(`${t}_selected`)?.value){let o=this.evalForm.get(`${t}_threshold`)?.value;e.push({metricName:t,threshold:o})}}),this.dialogRef.close(e)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(A){return new(A||i)(st(zn),st(rL),st(Do))};static \u0275cmp=vA({type:i,selectors:[["app-run-eval-config-dialog"]],decls:14,vars:3,consts:[[1,"dialog-container"],["mat-dialog-title","",1,"dialog-title"],[1,"eval-form",3,"formGroup"],[4,"ngIf"],["align","end",1,"dialog-actions"],["mat-button","",1,"reset-button",3,"click"],["mat-button","",1,"cancel-button",3,"click"],["mat-button","",1,"save-button",3,"click"],["class","metric-container",4,"ngFor","ngForOf"],[1,"metric-container"],[1,"metric-header"],[3,"formControlName"],[2,"display","flex","flex-direction","column"],[1,"metric-title",3,"matTooltip"],[1,"metric-description"],[1,"metric-slider-container","inline-slider"],[2,"display","flex","flex-direction","column","align-items","flex-start"],[1,"slider-label",2,"margin-right","0","font-size","11px","color","var(--mat-sys-on-surface-variant)"],[2,"display","flex","align-items","center"],["step","0.1","thumbLabel","",1,"threshold-slider",3,"min","max"],["matSliderThumb","",3,"formControlName"],[1,"threshold-value"],["formControlName","tool_trajectory_avg_score_selected"],["min","0","max","1","step","0.1","thumbLabel","",1,"threshold-slider"],["matSliderThumb","","formControlName","tool_trajectory_avg_score_threshold"],["formControlName","response_match_score_selected"],["matSliderThumb","","formControlName","response_match_score_threshold"]],template:function(A,t){A&1&&(I(0,"div",0)(1,"h2",1),D(2,"EVALUATION METRICS"),h(),I(3,"mat-dialog-content")(4,"form",2),kt(5,evA,2,1,"div",3)(6,tvA,31,14,"div",3),h()(),I(7,"mat-dialog-actions",4)(8,"button",5),U("click",function(){return t.onReset()}),D(9,"Reset to Default"),h(),I(10,"button",6),U("click",function(){return t.onCancel()}),D(11,"Cancel"),h(),I(12,"button",7),U("click",function(){return t.onStart()}),D(13,"Start"),h()()()),A&2&&(Q(4),H("formGroup",t.evalForm),Q(),H("ngIf",t.metricsInfo.length>0),Q(),H("ngIf",t.metricsInfo.length===0))},dependencies:[Xo,Ba,fn,oL,Gn,Kn,XF,WC,qC,Cv,c$,xR,ha,ki,ic,li,DI,ql,rn,Q1],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:12px;width:680px;box-shadow:0 8px 16px var(--run-eval-config-dialog-container-box-shadow-color)}.metric-container[_ngcontent-%COMP%]{margin-bottom:6px;padding-bottom:4px;border-bottom:1px solid var(--run-eval-config-dialog-border-color, #e0e0e0)}.metric-container[_ngcontent-%COMP%]:last-child{border-bottom:none}.metric-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;margin-bottom:2px}.metric-title[_ngcontent-%COMP%]{font-weight:600;font-size:1em}.metric-description[_ngcontent-%COMP%]{font-size:.85em;color:var(--run-eval-config-dialog-description-color, #666);margin-top:2px;white-space:normal}.metric-slider-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-left:28px}.inline-slider[_ngcontent-%COMP%]{margin-left:20px;flex:1;display:flex;justify-content:flex-end;align-items:center}.slider-label[_ngcontent-%COMP%]{margin-right:10px;font-size:.9em}.threshold-slider[_ngcontent-%COMP%]{max-width:80px;flex:1}.threshold-value[_ngcontent-%COMP%]{margin-left:10px;min-width:30px;text-align:right}h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}"]})};var Mc=class i{constructor(e,A){this.dialogRef=e;this.data=A}onConfirm(){this.dialogRef.close(!0)}onCancel(){this.dialogRef.close(!1)}static \u0275fac=function(A){return new(A||i)(st(zn),st(Do))};static \u0275cmp=vA({type:i,selectors:[["app-delete-session-dialog"]],decls:11,vars:4,consts:[[1,"confirm-delete-wrapper"],["mat-dialog-title",""],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,t){A&1&&(I(0,"div",0)(1,"h2",1),D(2),h(),I(3,"mat-dialog-content")(4,"p"),D(5),h()(),I(6,"mat-dialog-actions",2)(7,"button",3),U("click",function(){return t.onCancel()}),D(8),h(),I(9,"button",4),U("click",function(){return t.onConfirm()}),D(10),h()()()),A&2&&(Q(2),nA(t.data.title),Q(3),nA(t.data.message),Q(3),nA(t.data.cancelButtonText),Q(2),nA(t.data.confirmButtonText))},dependencies:[Xo,Ba,ha,ki],encapsulation:2})};var ivA=["app-info-table",""],nvA=["*"];function ovA(i,e){if(i&1&&(Ln(0,"thead")(1,"tr")(2,"th",2),D(3),Xn()()()),i&2){let A=p();Q(3),nA(A.title())}}var u1=class i{title=ve();static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["table","app-info-table",""]],hostAttrs:[1,"info-table"],inputs:{title:[1,"title"]},attrs:ivA,ngContentSelectors:nvA,decls:6,vars:1,consts:[[1,"label-col"],[1,"value-col"],["colspan","2"]],template:function(A,t){A&1&&(Ot(),Ln(0,"colgroup"),$n(1,"col",0)(2,"col",1),Xn(),T(3,ovA,4,1,"thead"),Ln(4,"tbody"),Ze(5),Xn()),A&2&&(Q(3),O(t.title()?3:-1))},styles:["[_nghost-%COMP%]{display:table;width:100%;border-collapse:separate;border-spacing:0;font-family:inherit;font-size:13px;background-color:var(--mat-sys-surface);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;overflow:hidden;table-layout:fixed}[_nghost-%COMP%] thead[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-low)}[_nghost-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{text-align:left;padding:12px 16px;font-weight:500;color:var(--mat-sys-on-surface);border-bottom:1px solid var(--mat-sys-outline-variant)}[_nghost-%COMP%] .label-col[_ngcontent-%COMP%]{width:40%}[_nghost-%COMP%] tbody tr td{padding:10px 16px;color:var(--mat-sys-on-surface-variant);border-bottom:1px solid var(--mat-sys-outline-variant);overflow:hidden;overflow-wrap:anywhere}[_nghost-%COMP%] tbody tr td:first-child{font-weight:500;color:var(--mat-sys-on-surface);background-color:var(--mat-sys-surface-container-lowest);border-right:1px solid var(--mat-sys-outline-variant)}[_nghost-%COMP%] tbody tr:last-child td{border-bottom:none}"]})};var C$=(i,e)=>e.timestamp,avA=(i,e)=>e.evalId;function rvA(i,e){i&1&&(I(0,"span",3),D(1,"Eval Sets"),h())}function svA(i,e){if(i&1){let A=aA();I(0,"span",9),U("click",function(){L(A);let n=p(2);return G(n.goToEvalSet())}),D(1),h()}if(i&2){let A=p(2);Q(),nA(A.selectedEvalSet())}}function lvA(i,e){if(i&1&&(I(0,"span",8),D(1),h()),i&2){let A=p(2);Q(),nA(A.selectedEvalSet())}}function gvA(i,e){if(i&1&&(I(0,"span",6),D(1,">"),h(),T(2,svA,2,1,"span",7)(3,lvA,2,1,"span",8)),i&2){let A=p();Q(2),O(A.selectedEvalTab()==="history"||A.selectedHistoryRun()||A.selectedEvalCase()?2:3)}}function cvA(i,e){i&1&&(I(0,"span",6),D(1,">"),h(),I(2,"span",10),D(3,"Eval Cases"),h())}function CvA(i,e){i&1&&(I(0,"span",6),D(1,">"),h(),I(2,"span",11),D(3,"Runs"),h())}function dvA(i,e){if(i&1&&(I(0,"span",6),D(1,">"),h(),I(2,"span",12),D(3),h()),i&2){let A=p();Q(3),nA(A.formatTimestamp(A.selectedHistoryRun()))}}function IvA(i,e){if(i&1&&(I(0,"span",6),D(1,">"),h(),I(2,"span",13),D(3),h()),i&2){let A,t=p();Q(3),nA((A=t.selectedEvalCase())==null?null:A.evalId)}}function BvA(i,e){if(i&1){let A=aA();I(0,"button",14),U("click",function(){L(A);let n=p();return G(n.openNewEvalSetDialog())}),I(1,"mat-icon"),D(2,"add"),h(),D(3," New "),h(),I(4,"button",15),U("click",function(){L(A);let n=p();return G(n.getEvalSet())}),I(5,"mat-icon"),D(6,"refresh"),h()()}if(i&2){let A=p();H("matTooltip",A.i18n.createNewEvalSetTooltip)}}function hvA(i,e){}function EvA(i,e){if(i&1){let A=aA();I(0,"div")(1,"div",16)(2,"div",17),D(3),h(),I(4,"div",18),D(5),h(),I(6,"div",19),U("click",function(){L(A);let n=p();return G(n.openNewEvalSetDialog())}),D(7),h()()()}if(i&2){let A=p();Q(3),Ee(" ",A.i18n.createNewEvalSetTitle," "),Q(2),Ee(" ",A.i18n.evalSetDescription," "),Q(2),Ee(" ",A.i18n.createEvalSetButton," ")}}function QvA(i,e){if(i&1){let A=aA();I(0,"div",21),U("click",function(){let n=L(A).$implicit,o=p(2);return G(o.selectEvalSet(n))}),I(1,"div",22)(2,"span",23),D(3,"folder"),h(),I(4,"div",24),D(5),h()(),I(6,"div",25)(7,"button",26),U("click",function(n){let o=L(A).$implicit,a=p(2);return G(a.confirmDeleteEvalSet(n,o))}),I(8,"mat-icon"),D(9,"delete"),h()()()()}if(i&2){let A=e.$implicit,t=p(2);Q(5),nA(A),Q(2),H("matTooltip",t.i18n.deleteEvalSetTooltip)}}function uvA(i,e){if(i&1&&(I(0,"div"),ke(1,QvA,10,2,"div",20,ni),h()),i&2){let A=p();Q(),_e(A.evalsets)}}function pvA(i,e){i&1&&(I(0,"div",33),lA(1,"mat-progress-spinner",34),h()),i&2&&(Q(),H("diameter",28)("strokeWidth",3))}function fvA(i,e){if(i&1&&(I(0,"tr")(1,"td"),D(2,"Execution Mode"),h(),I(3,"td")(4,"span",37),D(5),h()()()),i&2){let A,t,n=p(4);Q(4),H("matTooltip",((A=n.currentEvalSet())==null?null:A.model_execution_mode)||"N/A"),Q(),nA(((t=n.currentEvalSet())==null?null:t.model_execution_mode)||"N/A")}}function mvA(i,e){if(i&1&&(I(0,"div",35)(1,"table",36)(2,"tr")(3,"td"),D(4,"Name"),h(),I(5,"td")(6,"span",37),D(7),h()()(),T(8,fvA,6,2,"tr"),I(9,"tr")(10,"td"),D(11,"Total Cases"),h(),I(12,"td")(13,"span",37),D(14),h()()(),I(15,"tr")(16,"td"),D(17,"Total Runs"),h(),I(18,"td")(19,"span",37),D(20),h()()()()()),i&2){let A=p(3);Q(6),H("matTooltip",A.selectedEvalSet()),Q(),nA(A.selectedEvalSet()),Q(),O(A.isEvalV2Enabled()?8:-1),Q(5),H("matTooltip",A.evalCases.length.toString()),Q(),nA(A.evalCases.length),Q(5),H("matTooltip",A.getEvalHistoryOfCurrentSetSorted().length.toString()),Q(),nA(A.getEvalHistoryOfCurrentSetSorted().length)}}function wvA(i,e){i&1&&lA(0,"mat-progress-spinner",42),i&2&&H("diameter",20)}function yvA(i,e){i&1&&(I(0,"mat-icon"),D(1,"play_arrow"),h())}function DvA(i,e){if(i&1){let A=aA();I(0,"div",46),U("click",function(){let n=L(A).$implicit,o=p(6);return G(o.getEvalCase(n))}),I(1,"mat-checkbox",47),U("click",function(n){return n.stopPropagation()})("change",function(n){let o=L(A).$implicit,a=p(6);return G(n?a.selection.toggle(o):null)}),h(),I(2,"div",48),D(3),h(),I(4,"button",49),U("click",function(n){let o=L(A).$implicit,a=p(6);return G(a.requestEditEvalCase(n,o))}),I(5,"mat-icon"),D(6,"edit"),h()(),I(7,"button",26),U("click",function(n){let o=L(A).$implicit,a=p(6);return G(a.confirmDeleteEvalCase(n,o))}),I(8,"mat-icon"),D(9,"delete"),h()()()}if(i&2){let A,t=e.$implicit,n=p(6);_A("selected-row",t===((A=n.selectedEvalCase())==null?null:A.evalId)),Q(),H("checked",n.selection.isSelected(t)),Q(2),Ee(" ",t," "),Q(),H("matTooltip",n.i18n.editEvalCaseTooltip),Q(3),H("matTooltip",n.i18n.deleteEvalCaseTooltip)}}function vvA(i,e){if(i&1&&(I(0,"div",44),ke(1,DvA,10,6,"div",45,ni),h()),i&2){let A=p(5);Q(),_e(A.evalCases)}}function bvA(i,e){if(i&1){let A=aA();I(0,"div",39)(1,"mat-checkbox",40),U("change",function(n){L(A);let o=p(4);return G(n?o.toggleAllRows():null)}),h(),I(2,"button",41),U("click",function(){L(A);let n=p(4);return G(n.openEvalConfigDialog())}),T(3,wvA,1,1,"mat-progress-spinner",42)(4,yvA,2,0,"mat-icon"),D(5),h(),I(6,"button",43),U("click",function(){L(A);let n=p(4);return G(n.openNewEvalCaseDialog())}),I(7,"mat-icon"),D(8,"add"),h(),D(9),h(),lA(10,"span",4),I(11,"button",15),U("click",function(){L(A);let n=p(4);return G(n.listEvalCases())}),I(12,"mat-icon"),D(13,"refresh"),h()()(),T(14,vvA,3,0,"div",44)}if(i&2){let A=p(4);Q(),H("checked",A.selection.hasValue()&&A.isAllSelected())("indeterminate",A.selection.hasValue()&&!A.isAllSelected()),Q(),H("disabled",A.evalCases.length==0||A.loadingMetrics()),Q(),O(A.loadingMetrics()?3:4),Q(2),Ee(" ",A.isAllSelected()||A.selection.isEmpty()?A.i18n.runEvaluationButton:A.i18n.runSelectedEvaluationButton," "),Q(4),Ee(" ",A.i18n.addSessionToSetButtonPrefix," "),Q(5),O(A.evalCases.length>0?14:-1)}}function MvA(i,e){if(i&1){let A=aA();I(0,"div",55),U("click",function(){let n=L(A).$implicit,o=p(5);return G(o.getHistorySession(n.result,n.timestamp))}),I(1,"div",48),D(2),h(),lA(3,"div",4),I(4,"div",56)(5,"span",57),D(6),h()()()}if(i&2){let A=e.$implicit,t=e.$index;p();let n=Ki(7),o=p(4);_A("selected-row",A.timestamp==o.selectedHistoryRun()),Q(2),Ya(" #",n.length-t," ",o.formatTimestamp(A.timestamp)," "),Q(3),H("ngClass",o.isMetricsSucceed(A.result)?"status-card__passed":"status-card__failed"),Q(),Ee(" ",o.getMetricsScore(A.result)," ")}}function SvA(i,e){i&1&&(I(0,"div",54),D(1," No runs found for this case. "),h())}function kvA(i,e){if(i&1&&(I(0,"div",38)(1,"div",50)(2,"h3",51),D(3),h()(),I(4,"h4",52),D(5,"Past Runs"),h(),I(6,"div",44),ro(7),ke(8,MvA,7,6,"div",53,C$),T(10,SvA,2,0,"div",54),h()()),i&2){let A=p(4),t=A.selectedEvalCase();Q(3),Ee("Case: ",t.evalId),Q(4);let n=so(A.caseHistory());Q(),_e(n),Q(2),O(n.length===0?10:-1)}}function _vA(i,e){i&1&&(I(0,"div",16)(1,"div",17),D(2,"No Eval Cases"),h(),I(3,"div",18),D(4,"Add a session to this set to get started."),h()())}function xvA(i,e){if(i&1&&(I(0,"div"),T(1,bvA,15,7)(2,kvA,11,3,"div",38),T(3,_vA,5,0,"div",16),h()),i&2){let A=p(3);Q(),O(A.selectedEvalCase()?2:1),Q(2),O(A.evalCases.length===0?3:-1)}}function RvA(i,e){i&1&&(I(0,"div",16)(1,"div",17),D(2,"No Runs"),h(),I(3,"div",18),D(4,"Run an evaluation to see results here."),h()())}function NvA(i,e){if(i&1){let A=aA();I(0,"div",46),U("click",function(){let n=L(A).$implicit,o=p(6);return G(o.selectedHistoryRun.set(n.timestamp))}),I(1,"div",48),D(2),h(),lA(3,"div",4),I(4,"div",60)(5,"span",61),D(6),h(),I(7,"span",62),D(8,"|"),h(),I(9,"span",63),D(10),h()()()}if(i&2){let A=e.$implicit,t=e.$index;p(3);let n=Ki(0),o=p(3);Q(2),Ya(" #",n.length-t," ",o.formatTimestamp(A.timestamp)," "),Q(4),Ya("",o.getPassCountForCurrentResult(A.evaluationResults.evaluationResults)," ",o.i18n.passStatusCaps),Q(3),ft("color",o.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)===0?"gray":""),Q(),Ya("",o.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)," ",o.i18n.failStatusCaps)}}function FvA(i,e){if(i&1&&(I(0,"div",44),ke(1,NvA,11,8,"div",59,C$),h()),i&2){p(2);let A=Ki(0);Q(),_e(A)}}function LvA(i,e){if(i&1&&(I(0,"span",62),D(1,"|"),h(),I(2,"span",63),D(3),h()),i&2){p(2);let A=Ki(1),t=p(5);Q(3),Ya("",t.getFailCountForCurrentResult(A.evaluationResults)," ",t.i18n.failStatusCaps)}}function GvA(i,e){if(i&1&&(I(0,"span",70)(1,"span",71),D(2),mt(3,"formatMetricName"),h(),D(4,": "),I(5,"span",72),D(6),mt(7,"number"),h()()),i&2){let A=e.$implicit;Q(),H("matTooltip",A.metricName),Q(),nA(Ft(3,3,A.metricName)),Q(4),nA(G0(7,5,A.threshold,"1.2-2"))}}function KvA(i,e){if(i&1&&(I(0,"div",67),ke(1,GvA,8,8,"span",70,ni),h()),i&2){let A=p(7);Q(),_e(A.currentHistoryMetrics())}}function UvA(i,e){if(i&1){let A=aA();I(0,"div",73),U("click",function(){let n=L(A).$implicit;p(2);let o=Ki(0),a=p(5);return G(a.getHistorySession(n,o))}),I(1,"span"),D(2),h(),I(3,"span",74),D(4),h()()}if(i&2){let A=e.$implicit,t=p(7);Q(2),Ee(" ",A.evalId," "),Q(),H("ngClass",t.isMetricsSucceed(A)?"status-card__passed":"status-card__failed"),Q(),Ee(" ",t.getMetricsScore(A)," ")}}function TvA(i,e){if(i&1&&(I(0,"div",64)(1,"div",65)(2,"div",66)(3,"div",60)(4,"span",61),D(5),h(),T(6,LvA,4,2),h(),T(7,KvA,3,0,"div",67),h()()(),I(8,"div",68),ke(9,UvA,5,3,"div",69,avA),h()),i&2){p();let A=Ki(1),t=p(5);Q(5),Ya("",t.getPassCountForCurrentResult(A.evaluationResults)," ",t.i18n.passStatusCaps),Q(),O(t.getFailCountForCurrentResult(A.evaluationResults)>0?6:-1),Q(),O(t.currentHistoryMetrics().length>0?7:-1),Q(2),_e(A.evaluationResults)}}function OvA(i,e){if(i&1&&(ro(0)(1),T(2,TvA,11,4)),i&2){let A=p(5),t=so(A.selectedHistoryRun());Q();let n=so(A.getEvalHistoryOfCurrentSet()[t]);Q(),O(n?2:-1)}}function JvA(i,e){if(i&1&&(I(0,"div",58),T(1,FvA,3,0,"div",44)(2,OvA,3,3),h()),i&2){let A=p(4);Q(),O(A.selectedHistoryRun()?2:1)}}function YvA(i,e){if(i&1&&(ro(0),T(1,RvA,5,0,"div",16)(2,JvA,3,1,"div",58)),i&2){let A=so(p(3).evalHistorySorted());Q(),O(A.length===0?1:2)}}function HvA(i,e){if(i&1&&(T(0,mvA,21,7,"div",35),T(1,xvA,4,2,"div"),T(2,YvA,3,2)),i&2){let A=p(2);O(A.selectedEvalTab()==="info"?0:-1),Q(),O(A.selectedEvalTab()==="cases"?1:-1),Q(),O(A.selectedEvalTab()==="history"?2:-1)}}function zvA(i,e){if(i&1){let A=aA();I(0,"div",5)(1,"div",27)(2,"div",28)(3,"button",29),U("click",function(){L(A);let n=p();return n.selectedEvalTab.set("info"),n.selectedEvalCase.set(null),G(n.selectedHistoryRun.set(null))}),I(4,"mat-icon"),D(5,"info"),h()(),I(6,"button",30),U("click",function(){L(A);let n=p();return n.selectedEvalTab.set("cases"),n.selectedEvalCase.set(null),G(n.selectedHistoryRun.set(null))}),I(7,"mat-icon"),D(8,"list"),h()(),I(9,"button",31),U("click",function(){L(A);let n=p();return n.selectedEvalTab.set("history"),n.selectedEvalCase.set(null),n.selectedHistoryRun.set(null),G(n.getEvaluationResult())}),I(10,"mat-icon"),D(11,"history"),h()()(),I(12,"div",32),T(13,pvA,2,2,"div",33)(14,HvA,3,3),h()()()}if(i&2){let A=p();Q(3),_A("active",A.selectedEvalTab()==="info"),Q(3),_A("active",A.selectedEvalTab()==="cases"),Q(3),_A("active",A.selectedEvalTab()==="history"),Q(4),O(A.evalRunning()?13:14)}}var My=new MA("EVAL_TAB_COMPONENT"),Sc=class i{checkboxes=GN(ic);appName=ve("");userId=ve("");sessionId=ve("");sessionSelected=Si();shouldShowTab=Si();evalNotInstalledMsg=Si();evalCaseSelected=Si();evalSetIdSelected=Si();shouldReturnToSession=Si();editEvalCaseRequested=Si();evalCasesSubject=new gi([]);changeDetectorRef=w(Mt);flagService=w(Nr);i18n=w(s$);displayedColumns=["select","evalId"];evalsets=[];selectedEvalSet=mA("");currentEvalSet=mA(null);evalHistorySorted=ye(()=>{let e=this.appEvaluationResults[this.appName()]?.[this.selectedEvalSet()]||{};return Object.keys(e).sort((t,n)=>n.localeCompare(t)).map(t=>({timestamp:t,evaluationResults:e[t]}))});currentHistoryMetrics=ye(()=>{let e=this.selectedHistoryRun()||this.evalHistorySorted()[0]?.timestamp;if(!e)return this.evalMetrics;let A=this.evalHistorySorted().find(t=>t.timestamp===e);return A?this.getEvalMetrics(A):this.evalMetrics});caseHistory=ye(()=>{let e=this.selectedEvalCase();if(!e)return[];let A=e.evalId,t=this.evalHistorySorted();return console.log("[DEBUG] caseHistory history:",t.map(n=>n.timestamp),"selectedHistoryRun:",this.selectedHistoryRun()),t.map(n=>{let o=n.evaluationResults.evaluationResults.find(a=>a.evalId===A);return{timestamp:n.timestamp,result:o}}).filter(n=>n.result!==void 0)});evalCases=[];selectedEvalCase=mA(null);deletedEvalCaseIndex=-1;dataSource=new dI(this.evalCases);selection=new P0(!0,[]);showEvalHistory=mA(!1);selectedEvalTab=mA("cases");selectedHistoryRun=mA(null);evalRunning=mA(!1);loadingMetrics=mA(!1);evalMetrics=SE;isEvalV2Enabled=mA(!1);currentEvalResultBySet=new Map;dialog=w(Xa);appEvaluationResults={};evalService=w(A0);sessionService=w(tl);constructor(){this.evalCasesSubject.subscribe(e=>{!this.selectedEvalCase()&&this.deletedEvalCaseIndex>=0&&e.length>0?(this.selectNewEvalCase(e),this.deletedEvalCaseIndex=-1):e.length===0&&this.shouldReturnToSession.emit(!0)})}ngOnChanges(e){e.appName&&(this.selectedEvalSet.set(""),this.evalCases=[],this.getEvalSet(),this.getEvaluationResult())}ngOnInit(){this.flagService.isEvalV2Enabled().pipe(oo()).subscribe(A=>this.isEvalV2Enabled.set(A));let e=window.localStorage.getItem("adk_eval_metrics_selection");if(e)try{this.evalMetrics=JSON.parse(e)}catch(A){console.error("Error parsing saved eval metrics",A),this.evalMetrics=SE}}selectNewEvalCase(e){let A=this.deletedEvalCaseIndex;this.deletedEvalCaseIndex===e.length&&(A=0),this.getEvalCase(e[A])}getEvalSet(){this.appName()!==""&&this.evalService.getEvalSets(this.appName()).pipe(aa(e=>e.status===404&&e.statusText==="Not Found"?(this.shouldShowTab.emit(!1),oe(null)):oe([]))).subscribe(e=>{e!==null&&(this.shouldShowTab.emit(!0),this.evalsets=e,this.changeDetectorRef.detectChanges())})}getNextDefaultEvalSetName(){let e=/^eval_set_(\d+)$/,A=0;for(let t of this.evalsets)if(typeof t=="string"){let n=t.match(e);if(n){let o=parseInt(n[1],10);o>A&&(A=o)}}return`eval_set_${A+1}`}openNewEvalSetDialog(){let e=this.getNextDefaultEvalSetName();this.dialog.open(vy,{width:"600px",data:{appName:this.appName(),defaultName:e}}).afterClosed().subscribe(t=>{t&&(this.getEvalSet(),this.changeDetectorRef.detectChanges())})}openNewEvalCaseDialog(){this.sessionId()&&this.sessionService.getSession(this.userId(),this.appName(),this.sessionId()).subscribe(e=>{let t=(e.state?.__session_metadata__?.displayName||this.sessionId()).replace(/ /g,"_").replace(/[^a-zA-Z0-9_-]/g,"");this.dialog.open(Dy,{width:"600px",data:{appName:this.appName(),userId:this.userId(),sessionId:this.sessionId(),evalSetId:this.selectedEvalSet(),defaultName:t,existingCases:this.evalCases}}).afterClosed().subscribe(o=>{o&&(this.listEvalCases(),this.changeDetectorRef.detectChanges())})})}listEvalCases(){this.evalCases=[],this.evalService.listEvalCases(this.appName(),this.selectedEvalSet()).subscribe(e=>{this.evalCases=e,this.dataSource=new dI(this.evalCases),this.evalCasesSubject.next(this.evalCases),this.changeDetectorRef.detectChanges()})}runEval(){this.evalRunning.set(!0),this.evalService.runEval(this.appName(),this.selectedEvalSet(),this.selection.selected.length===0?this.dataSource.data:this.selection.selected,this.evalMetrics).pipe(aa(e=>(e.error?.detail?.includes("not installed")&&this.evalNotInstalledMsg.emit(e.error.detail),oe([])))).subscribe(e=>{this.currentEvalResultBySet.set(this.selectedEvalSet(),e),this.getEvaluationResult(!0),this.changeDetectorRef.detectChanges()})}selectEvalSet(e){this.selectedEvalSet.set(e),this.listEvalCases(),this.isEvalV2Enabled()&&this.evalService.getEvalSet(this.appName(),e).pipe(aa(A=>(console.error("Error fetching eval set details",A),oe(null)))).subscribe(A=>{this.currentEvalSet.set(A),this.changeDetectorRef.detectChanges()})}clearSelectedEvalSet(){if(this.selectedEvalTab()!=="cases"){this.selectedEvalTab.set("cases");return}this.selectedEvalSet.set(""),this.currentEvalSet.set(null)}clearAllNavigation(){this.selectedEvalSet.set(""),this.selectedHistoryRun.set(null),this.selectedEvalCase.set(null),this.currentEvalSet.set(null)}goToEvalSet(){this.selectedHistoryRun.set(null),this.selectedEvalCase.set(null)}isAllSelected(){let e=this.selection.selected.length,A=this.dataSource.data.length;return e===A}toggleAllRows(){if(this.isAllSelected()){this.selection.clear();return}this.selection.select(...this.dataSource.data)}getEvalResultForCase(e){let A=this.currentEvalResultBySet.get(this.selectedEvalSet())?.filter(t=>t.evalId==e);if(!(!A||A.length==0))return A[0].finalEvalStatus}formatToolUses(e){if(!e||!Array.isArray(e))return[];let A=[];for(let t of e)A.push({name:t.name,args:t.args});return A}addEvalCaseResultToEvents(e,A){let t=A.evalMetricResultPerInvocation,n=-1;if(t)for(let o=0;on.evalId==e)[0],t=A.sessionId;this.sessionService.getSession(this.userId(),this.appName(),t).subscribe(n=>{this.addEvalCaseResultToEvents(n,A);let o=this.fromApiResultToSession(n);this.sessionSelected.emit(o)})}toggleEvalHistoryButton(){this.showEvalHistory.set(!this.showEvalHistory())}getEvalHistoryOfCurrentSet(){return this.appEvaluationResults[this.appName()]?this.appEvaluationResults[this.appName()][this.selectedEvalSet()]||{}:{}}getEvalHistoryOfCurrentSetSorted(){let e=this.getEvalHistoryOfCurrentSet();return e?Object.keys(e).sort((n,o)=>o.localeCompare(n)).map(n=>({timestamp:n,evaluationResults:e[n]})):[]}getPassCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==1).length}getFailCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==2).length}getMetricsCounts(e){if(!e)return{passed:0,total:0};let A=0,t=0;if(e.evalMetricResults&&e.evalMetricResults.length>0)A=e.evalMetricResults.filter(n=>n.evalStatus===1).length,t=e.evalMetricResults.length;else if(e.evalMetricResultPerInvocation)for(let n of e.evalMetricResultPerInvocation)n.evalMetricResults&&(A+=n.evalMetricResults.filter(o=>o.evalStatus===1).length,t+=n.evalMetricResults.length);return{passed:A,total:t}}getMetricsScore(e){let{passed:A,total:t}=this.getMetricsCounts(e);return`${A}/${t}`}isMetricsSucceed(e){let{passed:A,total:t}=this.getMetricsCounts(e);return A===t}formatTimestamp(e){let A=Number(e);if(isNaN(A))return"Invalid timestamp provided";let t=new Date(A*1e3);if(isNaN(t.getTime()))return"Invalid date created from timestamp";let n={month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0};return new Intl.DateTimeFormat("en-US",n).format(t)}getEvaluationStatusCardActionButtonIcon(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled?"keyboard_arrow_up":"keyboard_arrow_down"}toggleHistoryStatusCard(e){this.getEvalHistoryOfCurrentSet()[e].isToggled=!this.getEvalHistoryOfCurrentSet()[e].isToggled}isEvaluationStatusCardToggled(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled}generateHistoryEvaluationDatasource(e){return this.getEvalHistoryOfCurrentSet()[e].evaluationResults}getHistorySession(e,A){let t=e.sessionId,n=e.evalId;this.selectedHistoryRun.set(A),this.evalService.getEvalCase(this.appName(),this.selectedEvalSet(),n).subscribe(o=>{this.sessionService.getSession(this.userId(),this.appName(),t).subscribe(a=>{this.addEvalCaseResultToEvents(a,e);let r=this.fromApiResultToSession(a);r.evalCase=o,r.evalCaseResult=e,r.timestamp=A,this.sessionSelected.emit(r)})})}getEvalCase(e){this.evalService.getEvalCase(this.appName(),this.selectedEvalSet(),e).subscribe(A=>{this.selectedEvalCase.set(A),this.evalCaseSelected.emit(A),this.evalSetIdSelected.emit(this.selectedEvalSet())})}resetEvalCase(){this.selectedEvalCase.set(null)}resetEvalResults(){this.currentEvalResultBySet.clear()}confirmDeleteEvalCase(e,A){e.stopPropagation();let t={title:"Confirm delete",message:`Are you sure you want to delete ${A}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(Mc,{width:"600px",data:t}).afterClosed().subscribe(o=>{o&&this.deleteEvalCase(A)})}requestEditEvalCase(e,A){e.stopPropagation(),this.evalService.getEvalCase(this.appName(),this.selectedEvalSet(),A).subscribe(t=>{this.selectedEvalCase.set(t),this.evalCaseSelected.emit(t),this.evalSetIdSelected.emit(this.selectedEvalSet()),this.editEvalCaseRequested.emit(t)})}deleteEvalCase(e){this.evalService.deleteEvalCase(this.appName(),this.selectedEvalSet(),e).subscribe(A=>{this.deletedEvalCaseIndex=this.evalCases.indexOf(e),this.selectedEvalCase.set(null),this.listEvalCases(),this.changeDetectorRef.detectChanges()})}confirmDeleteEvalSet(e,A){e.stopPropagation();let t={title:"Confirm delete",message:`Are you sure you want to delete eval set ${A}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(Mc,{width:"600px",data:t}).afterClosed().subscribe(o=>{o&&this.deleteEvalSet(A)})}deleteEvalSet(e){this.evalService.deleteEvalSet(this.appName(),e).subscribe(A=>{this.getEvalSet(),this.changeDetectorRef.detectChanges()})}getEvaluationResult(e=!1){this.evalService.listEvalResults(this.appName()).pipe(aa(A=>A.status===404&&A.statusText==="Not Found"?(this.shouldShowTab.emit(!1),oe(null)):oe([])),Mi(A=>{if(!A||A.length===0)return oe([]);let t=A.map(n=>this.evalService.getEvalResult(this.appName(),n));return JC(t)})).subscribe(A=>{if(A.length===0)return;let t="";for(let n of A){this.appEvaluationResults[this.appName()]||(this.appEvaluationResults[this.appName()]={}),this.appEvaluationResults[this.appName()][n.evalSetId]||(this.appEvaluationResults[this.appName()][n.evalSetId]={});let o=n.creationTimestamp;(!t||o>t)&&(t=o);let a={isToggled:!1,evaluationResults:n.evalCaseResults.map(r=>({setId:r.id,evalId:r.evalId,finalEvalStatus:r.finalEvalStatus,evalMetricResults:r.evalMetricResults,evalMetricResultPerInvocation:r.evalMetricResultPerInvocation,sessionId:r.sessionId,sessionDetails:r.sessionDetails,overallEvalMetricResults:r.overallEvalMetricResults??[]}))};this.appEvaluationResults[this.appName()][n.evalSetId][o]=a}this.changeDetectorRef.detectChanges(),e&&t&&(this.selectedEvalTab.set("history"),this.selectedHistoryRun.set(t)),this.evalRunning.set(!1)})}openEvalConfigDialog(){this.loadingMetrics.set(!0),this.evalService.getMetricsInfo(this.appName()).pipe(aa(e=>(console.error("Error fetching metrics info",e),oe({metricsInfo:[]})))).subscribe(e=>{this.loadingMetrics.set(!1),this.dialog.open(by,{maxWidth:"90vw",maxHeight:"90vh",data:{evalMetrics:this.evalMetrics,metricsInfo:e.metricsInfo||[]}}).afterClosed().subscribe(t=>{t&&(this.evalMetrics=t,window.localStorage.setItem("adk_eval_metrics_selection",JSON.stringify(t)),this.runEval())})})}getEvalMetrics(e){if(!e||!e.evaluationResults||!e.evaluationResults.evaluationResults)return this.evalMetrics;let A=e.evaluationResults.evaluationResults;return A.length===0?this.evalMetrics:typeof A[0].overallEvalMetricResults>"u"||!A[0].overallEvalMetricResults||A[0].overallEvalMetricResults.length===0?this.evalMetrics:A[0].overallEvalMetricResults.map(n=>({metricName:n.metricName,threshold:n.threshold}))}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-eval-tab"]],viewQuery:function(A,t){A&1&&ls(t.checkboxes,ic,5),A&2&&br()},inputs:{appName:[1,"appName"],userId:[1,"userId"],sessionId:[1,"sessionId"]},outputs:{sessionSelected:"sessionSelected",shouldShowTab:"shouldShowTab",evalNotInstalledMsg:"evalNotInstalledMsg",evalCaseSelected:"evalCaseSelected",evalSetIdSelected:"evalSetIdSelected",shouldReturnToSession:"shouldReturnToSession",editEvalCaseRequested:"editEvalCaseRequested"},features:[ii],decls:17,vars:11,consts:[[1,"eval-container"],[1,"eval-detail-header"],["mat-icon-button","","matTooltip","All Eval Sets",3,"click"],[1,"breadcrumb-item",2,"font-weight","500","color","var(--mat-sys-on-surface)"],[1,"spacer"],[1,"eval-details-container"],[1,"breadcrumb-separator"],["matTooltip","Eval Set",1,"breadcrumb-item","clickable"],["matTooltip","Eval Set",1,"breadcrumb-item"],["matTooltip","Eval Set",1,"breadcrumb-item","clickable",3,"click"],["matTooltip","Eval Cases",1,"breadcrumb-item"],["matTooltip","Runs",1,"breadcrumb-item"],["matTooltip","Run",1,"breadcrumb-item"],["matTooltip","Eval Case",1,"breadcrumb-item"],["mat-button","",3,"click","matTooltip"],["mat-icon-button","","matTooltip","Refresh",3,"click"],[1,"empty-eval-info"],[1,"info-title"],[1,"info-detail"],[1,"info-create",3,"click"],[1,"eval-set-row"],[1,"eval-set-row",3,"click"],[1,"eval-set-left"],[1,"material-symbols-outlined"],[1,"eval-set-name"],[1,"eval-set-right"],["mat-icon-button","",1,"delete-btn",3,"click","matTooltip"],[1,"eval-details-content"],[1,"vertical-tabs-sidebar"],["mat-icon-button","","matTooltip","Info","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Eval Cases","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Runs","matTooltipPosition","right",3,"click"],[1,"vertical-tabs-content"],[2,"display","flex","justify-content","center","align-items","center","padding","20px"],["mode","indeterminate",3,"diameter","strokeWidth"],[1,"info-tables-container"],["app-info-table",""],[3,"matTooltip"],[1,"eval-case-details",2,"padding","16px"],[1,"toolbar",2,"position","sticky","top","0","z-index","1"],[2,"margin-left","6px",3,"change","checked","indeterminate"],["mat-button","","color","primary",3,"click","disabled"],["mode","indeterminate",2,"display","inline-block","vertical-align","middle","margin-right","8px",3,"diameter"],["mat-button","","color","accent",3,"click"],[1,"eval-cases-list"],[1,"eval-case-row",3,"selected-row"],[1,"eval-case-row",3,"click"],[3,"click","change","checked"],[1,"eval-case-id"],["mat-icon-button","",1,"edit-btn",3,"click","matTooltip"],[2,"margin-bottom","16px"],[2,"margin-top","0"],[2,"margin-bottom","8px"],[1,"eval-case-row","clickable",3,"selected-row"],[2,"padding","16px","text-align","center","color","var(--app-color-text-secondary)"],[1,"eval-case-row","clickable",3,"click"],[1,"status-card__summary",2,"width","50px","text-align","center"],[2,"font-family","monospace",3,"ngClass"],[2,"padding","16px"],[1,"eval-case-row"],[1,"status-card__summary"],[1,"status-card__passed",2,"font-family","monospace"],[1,"status-card__separator"],[1,"status-card__failed",2,"font-family","monospace"],[1,"status-card",2,"margin-top","0"],[1,"status-card__overview"],[1,"status-card__info"],[1,"status-card__metrics"],[1,"status-card__history-cases"],[1,"status-card__history-case",2,"display","flex","justify-content","space-between","align-items","center"],[1,"status-card__metric"],[1,"status-card__metric-name",3,"matTooltip"],[1,"status-card__metric-value"],[1,"status-card__history-case",2,"display","flex","justify-content","space-between","align-items","center",3,"click"],[2,"font-family","monospace","width","50px","text-align","center",3,"ngClass"]],template:function(A,t){A&1&&(I(0,"div",0)(1,"div",1)(2,"button",2),U("click",function(){return t.clearAllNavigation()}),I(3,"mat-icon"),D(4,"home"),h()(),T(5,rvA,2,0,"span",3),T(6,gvA,4,1),T(7,cvA,4,0),T(8,CvA,4,0),T(9,dvA,4,1),T(10,IvA,4,1),lA(11,"span",4),T(12,BvA,7,1),h(),T(13,hvA,0,0),T(14,EvA,8,3,"div"),T(15,uvA,3,0,"div"),T(16,zvA,15,7,"div",5),h()),A&2&&(Q(5),O(t.selectedEvalSet()===""?5:-1),Q(),O(t.selectedEvalSet()!==""?6:-1),Q(),O(t.selectedEvalSet()!==""&&t.selectedEvalTab()==="cases"&&!t.selectedEvalCase()?7:-1),Q(),O(t.selectedEvalSet()!==""&&t.selectedEvalTab()==="history"&&!t.selectedHistoryRun()?8:-1),Q(),O(t.selectedHistoryRun()&&!t.selectedEvalCase()?9:-1),Q(),O(t.selectedEvalCase()?10:-1),Q(2),O(t.selectedEvalSet()===""?12:-1),Q(),O(t.selectedEvalSet()==""?13:-1),Q(),O(t.evalsets.length==0?14:-1),Q(),O(t.evalsets.length>0&&t.selectedEvalSet()==""?15:-1),Q(),O(t.selectedEvalSet()!=""?16:-1))},dependencies:[zt,ki,yi,rn,ic,Vl,Es,u1,W0,Za,bI,Q1],styles:[".eval-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;box-sizing:border-box}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 10px;background-color:var(--mat-sys-surface-container, #f5f5f5);border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0);gap:8px}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%]{flex:1 1 auto}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{height:32px!important;line-height:normal!important;border-radius:16px!important;font-size:13px!important;font-weight:500!important;display:inline-flex!important;align-items:center;justify-content:center}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%]{padding:0 12px!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:4px!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%]{width:32px!important;min-width:32px!important;padding:0!important;border-radius:50%!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:0!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple{width:32px!important;height:32px!important;border-radius:50%!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important;vertical-align:middle}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{vertical-align:middle}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%]{width:100%;background:transparent;border-top:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{font-weight:600}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:middle;padding:6px 16px;border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr.mat-header-row[_ngcontent-%COMP%]{display:none}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]{cursor:pointer;background:transparent}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr.selected-row[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high, #e0e0e0)}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%]{display:flex;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant);height:48px;flex-shrink:0;padding:0 16px;gap:8px}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%]{flex:1 1 auto}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-separator[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);margin:0 4px}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]{font-size:14px;color:var(--mat-sys-on-surface-variant)}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item.clickable[_ngcontent-%COMP%]{color:var(--mat-sys-primary);cursor:pointer}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item.clickable[_ngcontent-%COMP%]:hover{text-decoration:underline}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]:last-child{color:var(--mat-sys-on-surface);font-weight:500}.eval-container[_ngcontent-%COMP%] .eval-set-title[_ngcontent-%COMP%]{font-size:14px;font-weight:500;color:var(--mat-sys-on-surface);margin-right:16px}.eval-case-id[_ngcontent-%COMP%]{cursor:pointer}.eval-set-actions[_ngcontent-%COMP%]{display:flex;justify-content:space-between;color:var(--mat-sys-on-surface);font-style:normal;font-weight:700;font-size:14px}.empty-eval-info[_ngcontent-%COMP%]{margin-top:12px}.info-title[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);font-size:14px;font-weight:500;padding-top:13px;padding-right:16px;padding-left:16px}.info-detail[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:14px;font-weight:400;padding-top:13px;padding-right:16px;padding-left:16px;letter-spacing:.2px}.info-create[_ngcontent-%COMP%]{color:var(--mat-sys-primary);font-size:14px;font-style:normal;font-weight:500;padding-right:16px;padding-left:16px;margin-top:19px;padding-bottom:16px;cursor:pointer}.eval-set-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;cursor:pointer;padding:6px 16px;min-height:44px;border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0);background:transparent}.eval-set-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.eval-set-row[_ngcontent-%COMP%]:hover .delete-btn[_ngcontent-%COMP%]{opacity:1}.eval-set-row[_ngcontent-%COMP%] .eval-set-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px}.eval-set-row[_ngcontent-%COMP%] .eval-set-left[_ngcontent-%COMP%] span.material-symbols-outlined[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:20px}.eval-set-row[_ngcontent-%COMP%] .eval-set-name[_ngcontent-%COMP%]{font-size:14px;color:var(--mat-sys-on-surface)}.eval-set-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out;color:var(--mat-sys-outline)}.eval-set-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-error)}.eval-set-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important}.selected-eval-case[_ngcontent-%COMP%]{font-weight:900;color:var(--mat-sys-primary)}.save-session-btn[_ngcontent-%COMP%]{width:100%;border:none;border-radius:4px;margin-top:12px;cursor:pointer}.save-session-btn-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.save-session-btn-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--mat-sys-on-primary);font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.run-eval-btn[_ngcontent-%COMP%]{border-radius:4px;border:1px solid var(--mat-sys-outline);padding:8px 24px;margin-top:16px;color:var(--mat-sys-primary);cursor:pointer}.run-eval-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-high)}.result-btn[_ngcontent-%COMP%]{display:flex;border-radius:4px;border:1px solid var(--mat-sys-outline-variant);margin-top:4px;cursor:pointer}.result-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-high)}.result-btn.pass[_ngcontent-%COMP%]{color:var(--mat-sys-tertiary)}.result-btn.fail[_ngcontent-%COMP%]{color:var(--mat-sys-error)}.evaluation-tab-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.evaluation-history-icon[_ngcontent-%COMP%]{cursor:pointer;margin-top:4px}.status-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;border-radius:8px;padding:12px 16px;margin-top:12px;background-color:var(--mat-sys-surface-container)}.status-card__overview[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.status-card__info[_ngcontent-%COMP%]{display:flex;flex-direction:column}.status-card__timestamp[_ngcontent-%COMP%]{font-size:.9em;color:var(--mat-sys-on-surface-variant);margin-bottom:5px}.status-card__summary[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:.95em;font-weight:500;color:var(--mat-sys-on-surface)}.status-card__metrics[_ngcontent-%COMP%]{display:flex;align-items:center;flex-wrap:wrap;font-size:.75em;margin-top:3px}.status-card__metric[_ngcontent-%COMP%]{width:160px;display:flex;align-items:center;color:var(--mat-sys-on-surface);margin-right:12px;margin-bottom:4px}.status-card__metric-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.status-card__metric-value[_ngcontent-%COMP%]{margin-left:4px;flex-shrink:0}.status-card__failed[_ngcontent-%COMP%]{color:var(--mat-sys-error)}.status-card__separator[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);margin:0 8px}.status-card__passed[_ngcontent-%COMP%]{color:#2e7d32}.status-card__action[_ngcontent-%COMP%]{display:flex;align-items:center}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);cursor:pointer;transition:transform .2s ease-in-out}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:1.2em;cursor:pointer}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__history-cases[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin-top:3px;justify-content:flex-start;width:100%}.status-card__history-case[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%;margin-top:4px;padding:8px 12px;border-radius:4px;cursor:pointer;box-sizing:border-box}.status-card__history-case[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.eval-spinner[_ngcontent-%COMP%]{margin-top:12px}.eval-details-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;overflow:hidden}.eval-details-content[_ngcontent-%COMP%]{display:flex;flex:1;overflow:hidden}.vertical-tabs-sidebar[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:48px;border-right:1px solid var(--mat-sys-outline-variant);padding-top:8px;align-items:center;gap:8px}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.vertical-tabs-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto}.eval-cases-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:100%}.eval-case-row[_ngcontent-%COMP%]{display:flex;align-items:center;cursor:pointer;padding:8px 16px;gap:12px;border-bottom:1px solid var(--mat-sys-outline-variant);background:transparent}.eval-case-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low)}.eval-case-row[_ngcontent-%COMP%]:hover .delete-btn[_ngcontent-%COMP%], .eval-case-row[_ngcontent-%COMP%]:hover .edit-btn[_ngcontent-%COMP%]{opacity:1}.eval-case-row.selected-row[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high)}.eval-case-row[_ngcontent-%COMP%] .eval-case-id[_ngcontent-%COMP%]{font-size:14px;color:var(--mat-sys-on-surface);font-family:Google Sans Mono,monospace;flex:1}.eval-case-row[_ngcontent-%COMP%] .edit-btn[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out;color:var(--mat-sys-on-surface-variant)}.eval-case-row[_ngcontent-%COMP%] .edit-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-primary)}.eval-case-row[_ngcontent-%COMP%] .edit-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important}.eval-case-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out;color:var(--mat-sys-on-surface-variant)}.eval-case-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-error)}.eval-case-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important}.eval-case-row.header-row[_ngcontent-%COMP%]{cursor:default;background-color:var(--mat-sys-surface-container-lowest)}.eval-case-row.header-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-lowest)}.info-tables-container[_ngcontent-%COMP%]{padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:24px}"]})};var PvA={noSessionsFound:"No sessions found",readonlyChip:"Read-only",filterSessionsLabel:"Search using session ID"},d$=new MA("Session Tab Messages",{factory:()=>PvA});function jvA(i,e){if(i&1&&(I(0,"div",1)(1,"mat-form-field",4)(2,"mat-label"),D(3),h(),I(4,"mat-icon",5),D(5,"filter_list"),h(),lA(6,"input",6),h()()),i&2){let A=p();Q(3),nA(A.i18n.filterSessionsLabel),Q(3),H("formControl",A.filterControl)}}function VvA(i,e){i&1&&(I(0,"div",2),lA(1,"mat-progress-bar",7),h())}function qvA(i,e){if(i&1&&(I(0,"div",3),D(1),h()),i&2){let A=p();Q(),Ya("",A.i18n.noSessionsFound," for user '",A.userId,"'")}}function WvA(i,e){if(i&1&&(I(0,"div",18),D(1),h()),i&2){let A=p().$implicit;H("title",A.id),Q(),nA(A.id)}}function ZvA(i,e){if(i&1&&(I(0,"div",19)(1,"mat-icon"),D(2,"visibility"),h(),D(3),h()),i&2){let A=p(3);Q(3),Ee(" ",A.i18n.readonlyChip," ")}}function XvA(i,e){if(i&1){let A=aA();I(0,"div",10),U("click",function(){let n=L(A).$implicit,o=p(2);return G(o.getSession(n.id))}),I(1,"div",11)(2,"div",12)(3,"div",13),D(4),h(),I(5,"button",14),U("click",function(n){let o=L(A).$implicit,a=p(2);return G(a.promoteToTest(n,o))}),I(6,"mat-icon"),D(7,"fact_check"),h()(),I(8,"button",15),U("click",function(n){let o=L(A).$implicit,a=p(2);return G(a.deleteSession(n,o))}),I(9,"mat-icon"),D(10,"delete"),h()()(),I(11,"div",16)(12,"div",17),D(13),h(),T(14,WvA,2,2,"div",18),h()(),T(15,ZvA,4,1,"div",19),mt(16,"async"),h()}if(i&2){let A=e.$implicit,t=p(2);H("ngClass",A.id===t.sessionId?"session-item current":"session-item"),Q(3),_A("is-monospace",!t.hasDisplayName(A)),H("title",A.id),Q(),nA(t.getSessionDisplayName(A)),Q(9),nA(t.getDate(A)),Q(),O(t.hasDisplayName(A)?14:-1),Q(),O(Ft(16,8,t.sessionService.canEdit(t.userId,A))===!1?15:-1)}}function $vA(i,e){i&1&&(I(0,"div",2),lA(1,"mat-progress-bar",7),h())}function AbA(i,e){if(i&1){let A=aA();T(0,$vA,2,0,"div",2),I(1,"div",20)(2,"button",21),U("click",function(){L(A);let n=p(2);return G(n.loadMoreSessions())}),D(3,"Load more"),h()()}if(i&2){p(2);let A=Ki(3);O(A?0:-1)}}function ebA(i,e){if(i&1&&(I(0,"div",8),ke(1,XvA,17,10,"div",9,ni),h(),T(3,AbA,4,1),mt(4,"async")),i&2){let A=p();Q(),_e(A.sessionList),Q(2),O(Ft(4,1,A.isSessionFilteringEnabled)&&A.canLoadMoreSessions?3:-1)}}var Sy=class i{userId="";appName="";sessionId="";sessionSelected=new FA;sessionReloaded=new FA;SESSIONS_PAGE_LIMIT=100;sessionList=[];canLoadMoreSessions=!1;pageToken="";filterControl=new Ps("");editingSessionId=null;sessionNameControl=new Ps("");refreshSessionsSubject=new ne;route=w($s);changeDetectorRef=w(Mt);sessionService=w(tl);uiStateService=w(ag);i18n=w(d$);featureFlagService=w(Nr);dialog=w(Xa);testsService=w(c2);isSessionFilteringEnabled=this.featureFlagService.isSessionFilteringEnabled();isLoadingMoreInProgress=mA(!1);isInitialized=mA(!1);constructor(){this.filterControl.valueChanges.pipe(Os(300)).subscribe(()=>{this.pageToken="",this.sessionList=[],this.refreshSessionsSubject.next()}),this.refreshSessionsSubject.pipe(mi(()=>{this.uiStateService.setIsSessionListLoading(!0)}),Mi(()=>{let e=this.filterControl.value||void 0;return this.isSessionFilteringEnabled?this.sessionService.listSessions(this.userId,this.appName,{filter:e,pageToken:this.pageToken,pageSize:this.SESSIONS_PAGE_LIMIT}).pipe(aa(()=>oe({items:[],nextPageToken:""}))):this.sessionService.listSessions(this.userId,this.appName).pipe(aa(()=>oe({items:[],nextPageToken:""})))}),mi(({items:e,nextPageToken:A})=>{this.isInitialized.set(!0),this.sessionList=Array.from(new Map([...this.sessionList,...e].map(t=>[t.id,t])).values()).sort((t,n)=>Number(n.lastUpdateTime)-Number(t.lastUpdateTime)),this.pageToken=A??"",this.canLoadMoreSessions=!!A,this.changeDetectorRef.markForCheck()})).subscribe(()=>{this.isLoadingMoreInProgress.set(!1),this.uiStateService.setIsSessionListLoading(!1)},()=>{this.isLoadingMoreInProgress.set(!1),this.uiStateService.setIsSessionListLoading(!1)})}ngOnInit(){this.featureFlagService.isSessionFilteringEnabled().subscribe(e=>{if(e){let A=this.route.snapshot.queryParams.session;A&&this.filterControl.setValue(A)}}),setTimeout(()=>{this.refreshSessionsSubject.next()},500)}getSession(e){e&&this.sessionSelected.emit(e)}loadMoreSessions(){this.isLoadingMoreInProgress.set(!0),this.refreshSessionsSubject.next()}getSessionDisplayName(e){return e.state?.__session_metadata__?.displayName||e.id}hasDisplayName(e){return!!e.state?.__session_metadata__?.displayName}startEditSessionName(e){this.editingSessionId=e.id,this.sessionNameControl.setValue(this.getSessionDisplayName(e))}cancelEditSessionName(){this.editingSessionId=null,this.sessionNameControl.setValue("")}saveSessionName(e){if(!this.editingSessionId||!e.id)return;let A=this.sessionNameControl.value,t=e.state||{},n=$A(P({},t),{__session_metadata__:$A(P({},t.__session_metadata__||{}),{displayName:A})});e.state=n,this.editingSessionId=null,this.sessionService.updateSession(this.userId,this.appName,e.id,{stateDelta:n}).subscribe({error:()=>{}})}deleteSession(e,A){e.stopPropagation();let t=A.id,n=this.getSessionDisplayName(A),o=`Are you sure you want to delete session ${t}?`;n!==t&&(o=`Are you sure you want to delete session "${n}" (${t})?`);let a={title:"Confirm delete",message:o,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(Mc,{width:"600px",data:a}).afterClosed().subscribe(s=>{s&&this.sessionService.deleteSession(this.userId,this.appName,t).subscribe(()=>{this.refreshSession(t)})})}promoteToTest(e,A){e.stopPropagation();let t=window.prompt("Enter test name (e.g., test1):");t&&this.sessionService.getSession(this.userId,this.appName,A.id).subscribe(n=>{let o={events:n.events};this.testsService.createTest(this.appName,t,o).subscribe({next:()=>{alert(`Test ${t} created successfully.`)},error:a=>{alert(`Error creating test: ${a.message||a}`)}})})}getDate(e){let A=e.lastUpdateTime||0;return new Date(A*1e3).toLocaleString()}fromApiResultToSession(e){return{id:e.id??"",appName:e.appName??"",userId:e.userId??"",state:e.state??{},events:e.events??[]}}reloadSession(e){this.sessionReloaded.emit(e)}refreshSession(e){let A=null;if(this.sessionList.length>0){let t=this.sessionList.findIndex(n=>n.id===e);t===this.sessionList.length-1&&(t=-1),A=this.sessionList[t+1]}return this.isSessionFilteringEnabled?this.filterControl.setValue(""):(this.sessionList=[],this.refreshSessionsSubject.next()),A}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-session-tab"]],inputs:{userId:"userId",appName:"appName",sessionId:"sessionId"},outputs:{sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded"},decls:8,vars:7,consts:[[1,"session-wrapper"],[1,"session-filter-container"],[1,"loading-spinner-container"],[1,"empty-state"],["appearance","outline",1,"session-filter"],["matPrefix",""],["matInput","",3,"formControl"],["mode","indeterminate"],[1,"session-tab-container",2,"margin-top","16px"],[3,"ngClass"],[3,"click","ngClass"],[1,"session-info"],[1,"session-header"],[1,"session-id",3,"title"],["mat-icon-button","","title","Promote to test",1,"action-btn","promote-btn",3,"click"],["mat-icon-button","","title","Delete session",1,"action-btn","delete-btn",3,"click"],[1,"session-sub-row"],[1,"session-date"],[1,"session-real-id",3,"title"],[1,"readonly-badge"],[1,"load-more"],["mat-button","","color","primary",3,"click"]],template:function(A,t){if(A&1&&(I(0,"div",0),T(1,jvA,7,2,"div",1),mt(2,"async"),ro(3),mt(4,"async"),T(5,VvA,2,0,"div",2)(6,qvA,2,2,"div",3)(7,ebA,5,3),h()),A&2){Q(),O(Ft(2,2,t.isSessionFilteringEnabled)?1:-1),Q(2);let n=so(Ft(4,4,t.uiStateService.isSessionListLoading()));Q(2),O((n||!t.isInitialized())&&!t.isLoadingMoreInProgress()?5:!n&&t.isInitialized()&&t.sessionList.length===0?6:7)}},dependencies:[Vl,uE,zt,Za,Zo,xs,mQ,Ws,ka,fn,Gn,Kn,WC,x1,qi,ki,yi,Un,Ls,gs],styles:[".session-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;font-size:14px;font-weight:700;color:var(--session-tab-session-wrapper-color);display:flex;flex-direction:column;overflow:hidden;height:100%}.session-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{color:initial;padding-top:1em;text-align:center;font-weight:400;font-style:italic}.session-wrapper[_ngcontent-%COMP%] .session-filter-container[_ngcontent-%COMP%]{border-radius:8px;padding:16px;margin-bottom:16px;margin-top:16px}.session-wrapper[_ngcontent-%COMP%] .session-filter[_ngcontent-%COMP%]{width:100%}.session-tab-container[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.session-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;border:none;border-radius:8px;margin-bottom:4px;cursor:pointer}.session-item[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant, rgba(0, 0, 0, .04))}.session-item.current[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))}.session-item[_ngcontent-%COMP%] mat-chip[_ngcontent-%COMP%]{margin-right:11px}.session-id[_ngcontent-%COMP%]{color:var(--session-tab-session-id-color);font-family:Roboto,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.session-id.is-monospace[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.session-sub-row[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:8px}.session-date[_ngcontent-%COMP%]{color:var(--session-tab-session-date-color);font-family:Roboto;font-size:12px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.3px;white-space:nowrap}.session-real-id[_ngcontent-%COMP%]{color:var(--session-tab-session-id-color);font-family:Google Sans Mono,monospace;font-size:12px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.3px;opacity:.7;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;text-align:right}.session-info[_ngcontent-%COMP%]{padding:11px;flex:1;min-width:0}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;height:24px;margin-bottom:2px}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .session-id[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .session-name-input[_ngcontent-%COMP%]{flex:1;height:20px;padding:0 4px;font-family:inherit;font-size:14px;border:1px solid var(--mat-sys-outline, #ccc);border-radius:4px;background:var(--mat-sys-surface, #fff);color:var(--mat-sys-on-surface, #000);outline:none;min-width:0;margin-right:4px}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .session-name-input[_ngcontent-%COMP%]:focus{border-color:var(--mat-sys-primary, #1976d2)}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]{width:24px;height:24px;padding:0;display:none}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] .mat-icon{font-size:16px;width:16px;height:16px;line-height:16px}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .save-btn[_ngcontent-%COMP%], .session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .cancel-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;margin-left:2px}.session-item[_ngcontent-%COMP%]:hover .action-btn.edit-btn[_ngcontent-%COMP%], .session-item[_ngcontent-%COMP%]:hover .action-btn.delete-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center}.loading-spinner-container[_ngcontent-%COMP%]{margin-left:auto;margin-right:auto;margin-top:2em;width:100%}.load-more[_ngcontent-%COMP%]{display:flex;justify-content:center;margin-top:1em}.readonly-badge[_ngcontent-%COMP%]{color:var(--chat-readonly-badge-color);border-radius:4px;padding:1px 6px;display:flex;align-items:center;margin-right:8px;font-size:12px;line-height:16px;gap:4px;white-space:nowrap}.readonly-badge[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;padding-top:1px;flex-shrink:0}"]})};var tbA=["consoleArea"];function ibA(i,e){i&1&&lA(0,"mat-progress-bar",3)}var Rp=class i{constructor(e,A){this.dialogRef=e;this.data=A}consoleOutput=mA("");isLoading=mA(!0);subscription;consoleArea;ngOnInit(){this.subscription=this.data.output$.subscribe({next:e=>{this.consoleOutput.update(A=>A+e),this.scrollToBottom()},complete:()=>{this.isLoading.set(!1)}})}ngOnDestroy(){this.subscription?.unsubscribe()}scrollToBottom(){setTimeout(()=>{if(this.consoleArea){let e=this.consoleArea.nativeElement;e.scrollTop=e.scrollHeight}},0)}close(){this.dialogRef.close()}static \u0275fac=function(A){return new(A||i)(st(zn),st(Do))};static \u0275cmp=vA({type:i,selectors:[["app-console-dialog"]],viewQuery:function(A,t){if(A&1&&Wt(tbA,5),A&2){let n;se(n=le())&&(t.consoleArea=n.first)}},decls:11,vars:3,consts:[["consoleArea",""],["mat-dialog-title",""],[1,"mat-typography"],["mode","indeterminate",2,"margin-bottom","8px"],[1,"console-box"],["align","end"],["mat-button","",3,"click"]],template:function(A,t){A&1&&(I(0,"h2",1),D(1),h(),I(2,"mat-dialog-content",2),T(3,ibA,1,0,"mat-progress-bar",3),I(4,"div",4,0)(6,"pre"),D(7),h()()(),I(8,"mat-dialog-actions",5)(9,"button",6),U("click",function(){return t.close()}),D(10,"Close"),h()()),A&2&&(Q(),nA(t.data.title),Q(2),O(t.isLoading()?3:-1),Q(4),nA(t.consoleOutput()))},dependencies:[li,qi,ki,Ls,Xo,ha,Ba,pE,uE],styles:[".console-box[_ngcontent-%COMP%]{background-color:#1e1e1e;color:#dcdcdc;padding:16px;border-radius:4px;min-height:200px;flex:1;overflow-y:auto;font-family:Roboto Mono,monospace;font-size:12px}.console-box[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{margin:0;white-space:pre-wrap;word-wrap:break-word} .mat-mdc-dialog-content{max-height:70vh!important;overflow:hidden!important;display:flex;flex-direction:column}"]})};function nbA(i,e){i&1&&(I(0,"div",7),lA(1,"mat-spinner",8),h())}var Np=class i{constructor(e,A){this.dialogRef=e;this.data=A;this.inputValue=A.value}inputValue;loading=mA(!1);onCancel(){this.dialogRef.close()}onSubmitClick(){this.inputValue&&(this.loading.set(!0),this.data.onSubmit(this.inputValue).subscribe({next:()=>{this.loading.set(!1),this.dialogRef.close(!0)},error:e=>{this.loading.set(!1),window.alert(`Operation failed: ${e.message||e}`)}}))}static \u0275fac=function(A){return new(A||i)(st(zn),st(Do))};static \u0275cmp=vA({type:i,selectors:[["app-prompt-dialog"]],decls:13,vars:7,consts:[["mat-dialog-title",""],[1,"full-width"],["matInput","",3,"ngModelChange","ngModel","disabled"],["class","spinner-container",4,"ngIf"],["align","end"],["mat-button","",3,"click","disabled"],["mat-button","","color","primary",3,"click","disabled"],[1,"spinner-container"],["diameter","40"]],template:function(A,t){A&1&&(I(0,"h2",0),D(1),h(),I(2,"mat-dialog-content")(3,"mat-form-field",1)(4,"mat-label"),D(5),h(),I(6,"input",2),Ni("ngModelChange",function(o){return wi(t.inputValue,o)||(t.inputValue=o),o}),h()(),kt(7,nbA,2,0,"div",3),h(),I(8,"mat-dialog-actions",4)(9,"button",5),U("click",function(){return t.onCancel()}),D(10,"Cancel"),h(),I(11,"button",6),U("click",function(){return t.onSubmitClick()}),D(12,"Submit"),h()()),A&2&&(Q(),nA(t.data.title),Q(4),nA(t.data.label),Q(),Ri("ngModel",t.inputValue),H("disabled",t.loading()),Q(),H("ngIf",t.loading()),Q(2),H("disabled",t.loading()),Q(2),H("disabled",t.loading()||!t.inputValue))},dependencies:[li,ql,Ls,Xo,ha,Ba,qi,ki,Za,Zo,xs,Ws,ka,l2,Es,fn,Gn,Kn,Ho],styles:[".full-width[_ngcontent-%COMP%]{width:100%}.spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:16px}"]})};function obA(i,e){i&1&&(I(0,"div",6)(1,"mat-icon"),D(2,"assignment_late"),h(),I(3,"span"),D(4,"No tests found for this agent."),h()())}function abA(i,e){i&1&&(I(0,"th",13),D(1," Test Name "),h())}function rbA(i,e){if(i&1&&(I(0,"td",14),D(1),h()),i&2){let A=e.$implicit;Q(),Ee(" ",A.replace(".json","")," ")}}function sbA(i,e){i&1&&(I(0,"th",13),D(1," Actions "),h())}function lbA(i,e){if(i&1){let A=aA();I(0,"td",14)(1,"button",15),U("click",function(){let n=L(A).$implicit,o=p(2);return G(o.runTest(n))}),I(2,"mat-icon"),D(3,"play_arrow"),h()(),I(4,"button",16),U("click",function(){let n=L(A).$implicit,o=p(2);return G(o.rebuildTest(n))}),I(5,"mat-icon"),D(6,"sync"),h()(),I(7,"button",17),U("click",function(){let n=L(A).$implicit,o=p(2);return G(o.renameTest(n))}),I(8,"mat-icon"),D(9,"edit"),h()(),I(10,"button",18),U("click",function(){let n=L(A).$implicit,o=p(2);return G(o.deleteTest(n))}),I(11,"mat-icon"),D(12,"delete"),h()()()}if(i&2){let A=p(2);Q(),H("disabled",A.isRunning()||A.isRebuilding()),Q(3),H("disabled",A.isRunning()||A.isRebuilding()),Q(3),H("disabled",A.isRunning()||A.isRebuilding()),Q(3),H("disabled",A.isRunning()||A.isRebuilding())}}function gbA(i,e){if(i&1){let A=aA();I(0,"tr",19),U("click",function(){let n=L(A).$implicit,o=p(2);return G(o.selectTest(n))}),h()}if(i&2){let A=e.$implicit,t=p(2);_A("selected-row",A===t.selectedTest())}}function cbA(i,e){if(i&1&&(I(0,"table",7),vl(1,8),kt(2,abA,2,0,"th",9)(3,rbA,2,1,"td",10),bl(),vl(4,11),kt(5,sbA,2,0,"th",9)(6,lbA,13,4,"td",10),bl(),kt(7,gbA,1,2,"tr",12),h()),i&2){let A=p();H("dataSource",A.dataSource),Q(7),H("matRowDefColumns",A.displayedColumns)}}var ky=class i{appName=ve("");sessionId=ve("");userId=ve("");isViewOnlySession=ve(!1);testsService=w(c2);dialog=w(Xa);sessionService=w(tl);dataSource=new dI([]);consoleOutput=mA("");selectedTest=mA(null);testSelected=Si();isRunning=mA(!1);isRebuilding=mA(!1);displayedColumns=["name","actions"];ngOnInit(){this.loadTests()}ngOnChanges(e){e.appName&&!e.appName.isFirstChange()&&this.loadTests()}loadTests(){this.appName()&&this.testsService.listTests(this.appName()).subscribe(e=>{this.dataSource.data=e})}selectTest(e){this.selectedTest.set(e),this.testsService.getTest(this.appName(),e).subscribe(A=>{this.testSelected.emit({testName:e,events:A.events||[]})})}promoteCurrentSessionToTest(){this.sessionId()&&this.sessionService.getSession(this.userId(),this.appName(),this.sessionId()).subscribe(e=>{let t=(e.state?.__session_metadata__?.displayName||this.sessionId()).replace(/ /g,"_").replace(/[^a-zA-Z0-9_-]/g,""),n={events:e.events};this.dialog.open(Np,{data:{title:"Add Current Session as Test",label:"Test Name",value:t,onSubmit:o=>this.testsService.createTest(this.appName(),o,n).pipe(Mi(()=>this.testsService.rebuildTests(this.appName(),o)))}}).afterClosed().subscribe(o=>{o&&this.loadTests()})})}renameTest(e){this.dialog.open(Np,{data:{title:"Rename Test",label:"New Name",value:e.replace(".json",""),onSubmit:A=>{let t=A.replace(/ /g,"_").replace(/[^a-zA-Z0-9_-]/g,"");return this.testsService.getTest(this.appName(),e).pipe(Mi(n=>this.testsService.createTest(this.appName(),t,n)),Mi(()=>this.testsService.deleteTest(this.appName(),e)))}}}).afterClosed().subscribe(A=>{A&&this.loadTests()})}runAllTests(){this.runTest()}runTest(e){this.isRunning.set(!0);let A=new ne;this.dialog.open(Rp,{width:"90vw",maxWidth:"1200px",height:"80vh",data:{title:`Running ${e||"all tests"}`,output$:A.asObservable()}}),this.testsService.runTests(this.appName(),e).subscribe({next:t=>{A.next(t)},error:t=>{A.next(` -Error: ${t.message||t}`),this.isRunning.set(!1),A.complete()},complete:()=>{this.isRunning.set(!1),A.complete()}})}deleteTest(e){confirm(`Are you sure you want to delete test ${e}?`)&&this.testsService.deleteTest(this.appName(),e).subscribe(()=>{this.loadTests()})}rebuildAllTests(){this.rebuildTest()}rebuildTest(e){this.isRebuilding.set(!0);let A=new ne;this.dialog.open(Rp,{width:"90vw",maxWidth:"1200px",height:"80vh",data:{title:`Rebuilding ${e||"all tests"}`,output$:A.asObservable()}}),A.next(`Rebuilding tests... -`),this.testsService.rebuildTests(this.appName(),e).subscribe({next:()=>{A.next(`Successfully rebuilt tests. -`),this.isRebuilding.set(!1),this.loadTests(),A.complete()},error:t=>{A.next(`Error rebuilding tests: ${t.message||t} -`),this.isRebuilding.set(!1),A.complete()}})}clearConsole(){this.consoleOutput.set("")}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-tests-tab"]],inputs:{appName:[1,"appName"],sessionId:[1,"sessionId"],userId:[1,"userId"],isViewOnlySession:[1,"isViewOnlySession"]},outputs:{testSelected:"testSelected"},features:[ii],decls:20,vars:4,consts:[[1,"tests-container"],[1,"toolbar"],["mat-button","","color","primary",3,"click","disabled"],["mat-button","","color","accent",3,"click","disabled"],[1,"spacer"],["mat-icon-button","","matTooltip","Refresh",3,"click"],[1,"empty-state"],["mat-table","",1,"tests-table",3,"dataSource"],["matColumnDef","name"],["mat-header-cell","",4,"matHeaderCellDef"],["mat-cell","",4,"matCellDef"],["matColumnDef","actions"],["mat-row","",3,"selected-row","click",4,"matRowDef","matRowDefColumns"],["mat-header-cell",""],["mat-cell",""],["mat-icon-button","","color","primary","matTooltip","Run Test",3,"click","disabled"],["mat-icon-button","","color","accent","matTooltip","Rebuild Test",3,"click","disabled"],["mat-icon-button","","color","primary","matTooltip","Rename Test",3,"click","disabled"],["mat-icon-button","","color","warn","matTooltip","Delete Test",3,"click","disabled"],["mat-row","",3,"click"]],template:function(A,t){A&1&&(I(0,"div",0)(1,"div",1)(2,"button",2),U("click",function(){return t.promoteCurrentSessionToTest()}),I(3,"mat-icon"),D(4,"add"),h(),D(5," From Current Session "),h(),I(6,"button",2),U("click",function(){return t.runAllTests()}),I(7,"mat-icon"),D(8,"playlist_play"),h(),D(9," Run All "),h(),I(10,"button",3),U("click",function(){return t.rebuildAllTests()}),I(11,"mat-icon"),D(12,"sync"),h(),D(13," Rebuild All "),h(),lA(14,"span",4),I(15,"button",5),U("click",function(){return t.loadTests()}),I(16,"mat-icon"),D(17,"refresh"),h()()(),T(18,obA,5,0,"div",6)(19,cbA,8,2,"table",7),h()),A&2&&(Q(2),H("disabled",!t.sessionId()||t.isViewOnlySession()),Q(4),H("disabled",t.isRunning()||t.isRebuilding()||t.dataSource.data.length===0),Q(4),H("disabled",t.isRunning()||t.isRebuilding()||t.dataSource.data.length===0),Q(8),O(t.dataSource.data.length===0?18:19))},dependencies:[li,qi,ki,yi,Un,zt,$X,t$,e$,i$,A$,n$,o$,a$,Ha,rn,l2,pE,Ls],styles:[".tests-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;box-sizing:border-box}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 10px;background-color:var(--mat-sys-surface-container);border-bottom:1px solid var(--mat-sys-outline-variant);gap:8px}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%]{flex:1 1 auto}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{height:32px!important;line-height:normal!important;border-radius:16px!important;font-size:13px!important;font-weight:500!important;display:inline-flex!important;align-items:center;justify-content:center}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%]{padding:0 12px!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:4px!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%]{width:32px!important;min-width:32px!important;padding:0!important;border-radius:50%!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:0!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple{width:32px!important;height:32px!important;border-radius:50%!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important;vertical-align:middle}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{vertical-align:middle}.tests-container[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px;color:var(--mat-sys-on-surface-variant);font-style:italic;gap:8px}.tests-container[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%]{width:100%;background:transparent;border-top:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{font-weight:600}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:middle;padding:6px 16px;border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr.mat-header-row[_ngcontent-%COMP%]{display:none}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]{cursor:pointer;background:transparent}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover td.mat-column-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{opacity:1}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr.selected-row[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high, #e0e0e0)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] td.mat-column-actions[_ngcontent-%COMP%]{text-align:right}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] td.mat-column-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%]{margin-top:16px;display:flex;flex-direction:column;gap:8px;flex:1;min-height:200px}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;font-size:1.1rem;font-weight:600}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-size:.9rem;color:var(--mat-sys-on-surface-variant)}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-actions[_ngcontent-%COMP%] .running-status[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_pulse 1.5s infinite}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]{background-color:#1e1e1e;color:#d4d4d4;padding:12px;border-radius:4px;font-family:Courier New,Courier,monospace;font-size:.85rem;overflow:auto;flex:1;margin:0;white-space:pre-wrap;word-break:break-all;border:1px solid #333}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar{width:8px;height:8px}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover{background:#777}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:#1e1e1e}@keyframes _ngcontent-%COMP%_pulse{0%{opacity:.6}50%{opacity:1}to{opacity:.6}}"]})};var CbA={stateIsEmpty:"State is empty"},I$=new MA("State Tab Messages",{factory:()=>CbA});function dbA(i,e){if(i&1&&(I(0,"div",1),D(1),h()),i&2){let A=p();Q(),nA(A.i18n.stateIsEmpty)}}function IbA(i,e){if(i&1&&(I(0,"div"),lA(1,"app-custom-json-viewer",2),h()),i&2){let A=p();Q(),H("json",A.sessionState)}}var _y=class i{sessionState;i18n=w(I$);get isEmptyState(){return!this.sessionState||Object.keys(this.sessionState).length===0}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-state-tab"]],inputs:{sessionState:"sessionState"},decls:3,vars:1,consts:[[1,"state-wrapper"],[1,"empty-state"],[3,"json"]],template:function(A,t){A&1&&(I(0,"div",0),T(1,dbA,2,1,"div",1)(2,IbA,2,1,"div"),h()),A&2&&(Q(),O(t.isEmptyState?1:2))},dependencies:[fl],styles:[".state-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;margin-top:16px}.state-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{text-align:center;font-style:italic}"]})};var BbA=(i,e)=>e.span_id;function hbA(i,e){if(i&1){let A=aA();I(0,"span",20)(1,"a",24),U("click",function(){let n;L(A);let o=p(3);return G(o.selectSpanById((n=o.selectedSpan())==null?null:n.parent_span_id))}),D(2),h(),I(3,"button",21),U("click",function(){let n;L(A);let o=p(3);return G(o.copyToClipboard((n=o.selectedSpan())==null?null:n.parent_span_id))}),I(4,"mat-icon"),D(5),h()()()}if(i&2){let A,t,n,o=p(3);Q(),H("matTooltip",((A=o.selectedSpan())==null?null:A.parent_span_id)||""),Q(),nA((t=o.selectedSpan())==null?null:t.parent_span_id),Q(3),nA(o.copiedId===((n=o.selectedSpan())==null?null:n.parent_span_id)?"check":"content_copy")}}function EbA(i,e){i&1&&D(0," None ")}function QbA(i,e){if(i&1){let A=aA();I(0,"tr")(1,"td"),D(2),h(),I(3,"td")(4,"span",20)(5,"a",24),U("click",function(){let n=L(A).$implicit,o=p(4);return G(o.selectSpanById(n.span_id))}),D(6),h(),I(7,"button",21),U("click",function(){let n=L(A).$implicit,o=p(4);return G(o.copyToClipboard(n.span_id))}),I(8,"mat-icon"),D(9),h()()()()()}if(i&2){let A=e.$implicit,t=p(4);Q(2),nA(A.name),Q(3),H("matTooltip",A.span_id),Q(),nA(A.span_id),Q(3),nA(t.copiedId===A.span_id?"check":"content_copy")}}function ubA(i,e){if(i&1&&(I(0,"table",22),ke(1,QbA,10,4,"tr",null,BbA),h()),i&2){let A=p(3);Q(),_e(A.selectedSpanChildren)}}function pbA(i,e){if(i&1){let A=aA();I(0,"table",23)(1,"tr")(2,"td"),D(3,"Event ID"),h(),I(4,"td")(5,"span",20)(6,"a",24),U("click",function(){L(A),p();let n=Ki(59),o=p(2);return G(o.switchToEvent.emit(n))}),D(7),h(),I(8,"button",21),U("click",function(){L(A),p();let n=Ki(59),o=p(2);return G(o.copyToClipboard(n))}),I(9,"mat-icon"),D(10),h()()()()()()}if(i&2){p();let A=Ki(59),t=p(2);Q(6),H("matTooltip",A||""),Q(),nA(A),Q(3),nA(t.copiedId===A?"check":"content_copy")}}function fbA(i,e){if(i&1){let A=aA();I(0,"div",13)(1,"table",15)(2,"tr")(3,"td"),D(4,"Name"),h(),I(5,"td")(6,"span",16)(7,"span",17),D(8),h(),I(9,"button",18),U("click",function(){let n;L(A);let o=p(2);return G(o.copyToClipboard((n=o.selectedSpan())==null?null:n.name))}),I(10,"mat-icon"),D(11),h()()()()(),I(12,"tr")(13,"td"),D(14,"Span ID"),h(),I(15,"td",19)(16,"span",20)(17,"span",17),D(18),h(),I(19,"button",21),U("click",function(){let n;L(A);let o=p(2);return G(o.copyToClipboard((n=o.selectedSpan())==null?null:n.span_id))}),I(20,"mat-icon"),D(21),h()()()()(),I(22,"tr")(23,"td"),D(24,"Parent ID"),h(),I(25,"td"),T(26,hbA,6,3,"span",20)(27,EbA,1,0),h()(),I(28,"tr")(29,"td"),D(30,"Trace ID"),h(),I(31,"td",19)(32,"span",20)(33,"span",17),D(34),h(),I(35,"button",21),U("click",function(){let n;L(A);let o=p(2);return G(o.copyToClipboard((n=o.selectedSpan())==null?null:n.trace_id))}),I(36,"mat-icon"),D(37),h()()()()(),I(38,"tr")(39,"td"),D(40,"Start Time"),h(),I(41,"td")(42,"span",16)(43,"span",17),D(44),h(),I(45,"button",18),U("click",function(){let n;L(A);let o=p(2);return G(o.copyToClipboard(o.formatTime((n=o.selectedSpan())==null?null:n.start_time),"startTime"))}),I(46,"mat-icon"),D(47),h()()()()(),I(48,"tr")(49,"td"),D(50,"End Time"),h(),I(51,"td")(52,"span",16)(53,"span",17),D(54),h(),I(55,"button",18),U("click",function(){let n;L(A);let o=p(2);return G(o.copyToClipboard(o.formatTime((n=o.selectedSpan())==null?null:n.end_time),"endTime"))}),I(56,"mat-icon"),D(57),h()()()()()(),T(58,ubA,3,0,"table",22),ro(59),T(60,pbA,11,3,"table",23),h()}if(i&2){let A,t,n,o,a,r,s,l,g,C,d,B,u,E,f=p(2);Q(7),H("matTooltip",((A=f.selectedSpan())==null?null:A.name)||""),Q(),nA((t=f.selectedSpan())==null?null:t.name),Q(3),nA(f.copiedId===((n=f.selectedSpan())==null?null:n.name)?"check":"content_copy"),Q(6),H("matTooltip",((o=f.selectedSpan())==null?null:o.span_id)||""),Q(),nA((a=f.selectedSpan())==null?null:a.span_id),Q(3),nA(f.copiedId===((r=f.selectedSpan())==null?null:r.span_id)?"check":"content_copy"),Q(5),O((s=f.selectedSpan())!=null&&s.parent_span_id?26:27),Q(7),H("matTooltip",((l=f.selectedSpan())==null?null:l.trace_id)||""),Q(),nA((g=f.selectedSpan())==null?null:g.trace_id),Q(3),nA(f.copiedId===((C=f.selectedSpan())==null?null:C.trace_id)?"check":"content_copy"),Q(6),H("matTooltip",f.formatTime((d=f.selectedSpan())==null?null:d.start_time)),Q(),nA(f.formatTime((B=f.selectedSpan())==null?null:B.start_time)),Q(3),nA(f.copiedId==="startTime"?"check":"content_copy"),Q(6),H("matTooltip",f.formatTime((u=f.selectedSpan())==null?null:u.end_time)),Q(),nA(f.formatTime((E=f.selectedSpan())==null?null:E.end_time)),Q(3),nA(f.copiedId==="endTime"?"check":"content_copy"),Q(),O(f.selectedSpanChildren.length>0?58:-1),Q();let m=so(f.getSelectedSpanEventId());Q(),O(m?60:-1)}}function mbA(i,e){if(i&1){let A=aA();I(0,"tr")(1,"td"),D(2),h(),I(3,"td")(4,"span",16)(5,"span"),D(6),h(),I(7,"button",18),U("click",function(){let n=L(A).$implicit;p(2);let o=Ki(1),a=p(2);return G(a.copyToClipboard(o[n]==null?null:o[n].toString()))}),I(8,"mat-icon"),D(9),h()()()()()}if(i&2){let A=e.$implicit;p(2);let t=Ki(1),n=p(2);Q(2),nA(A),Q(4),nA(t[A]),Q(3),nA(n.copiedId===(t[A]==null?null:t[A].toString())?"check":"content_copy")}}function wbA(i,e){if(i&1&&(I(0,"table",15),ke(1,mbA,10,3,"tr",null,ni),h()),i&2){p();let A=Ki(1),t=p(2);Q(),_e(t.Object.keys(A))}}function ybA(i,e){i&1&&(I(0,"div",1),D(1,"No attributes available"),h())}function DbA(i,e){if(i&1&&(I(0,"div",13),ro(1),T(2,wbA,3,0,"table",15)(3,ybA,2,0,"div",1),h()),i&2){let A=p(2);Q();let t=so(A.getSelectedSpanAttributesView());Q(),O(t&&A.Object.keys(t).length>0?2:3)}}function vbA(i,e){if(i&1){let A=aA();ro(0),I(1,"div",14),lA(2,"app-custom-json-viewer",25),I(3,"button",26),U("click",function(){L(A);let n=Ki(0),o=p(2);return G(o.copyJsonToClipboard(n,"raw"))}),I(4,"mat-icon"),D(5),h()()()}if(i&2){let A=p(2),t=so(A.getSelectedSpanRawView());Q(2),H("json",t),Q(3),nA(A.copiedId==="raw"?"check":"content_copy")}}function bbA(i,e){if(i&1){let A=aA();I(0,"div",0)(1,"div",2)(2,"mat-paginator",3),U("page",function(n){L(A);let o=p();return G(o.onPage(n))}),h(),I(3,"div",4),D(4),h(),lA(5,"div",5),I(6,"button",6),U("click",function(){L(A);let n=p();return G(n.traceService.selectedRow(void 0))}),I(7,"mat-icon"),D(8,"remove_selection"),h()()(),I(9,"div",7)(10,"div",8)(11,"button",9),U("click",function(){L(A);let n=p();return G(n.selectedDetailTab.set("info"))}),I(12,"mat-icon"),D(13,"info"),h()(),I(14,"button",10),U("click",function(){L(A);let n=p();return G(n.selectedDetailTab.set("attributes"))}),I(15,"mat-icon"),D(16,"list_alt"),h()(),I(17,"button",11),U("click",function(){L(A);let n=p();return G(n.selectedDetailTab.set("raw"))}),I(18,"mat-icon"),D(19,"data_object"),h()()(),I(20,"div",12),T(21,fbA,61,19,"div",13),T(22,DbA,4,2,"div",13),T(23,vbA,6,3,"div",14),h()()()}if(i&2){let A,t=p();Q(2),H("length",t.orderedTraceData.length)("pageSize",1)("pageIndex",t.selectedSpanIndex),Q(2),Ee(" ",(A=t.selectedSpan())==null?null:A.name," "),Q(7),_A("active",t.selectedDetailTab()==="info"),Q(3),_A("active",t.selectedDetailTab()==="attributes"),Q(3),_A("active",t.selectedDetailTab()==="raw"),Q(4),O(t.selectedDetailTab()==="info"?21:-1),Q(),O(t.selectedDetailTab()==="attributes"?22:-1),Q(),O(t.selectedDetailTab()==="raw"?23:-1)}}function MbA(i,e){i&1&&(I(0,"div",1),D(1,"Select a trace span to view its details"),h())}var RR=class i extends rd{nextPageLabel="Next Span";previousPageLabel="Previous Span";firstPageLabel="First Span";lastPageLabel="Last Span";getRangeLabel=(e,A,t)=>t===0?"Span 0 of 0":(t=Math.max(t,0),`Span ${e*A+1} of ${t}`);static \u0275fac=(()=>{let e;return function(t){return(e||(e=Li(i)))(t||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac})},xy=class i{_traceData=[];orderedTraceData=[];set traceData(e){this._traceData=e||[],this.orderedTraceData=this.computeOrdered(this._traceData)}get traceData(){return this._traceData}computeOrdered(e){let A=e.map(a=>P({},a)),t=new Map,n=[];A.forEach(a=>t.set(String(a.span_id),a)),A.forEach(a=>{if(a.parent_span_id&&t.has(String(a.parent_span_id))){let r=t.get(String(a.parent_span_id));r.children=r.children||[],r.children.push(a)}else n.push(a)});let o=a=>a.flatMap(r=>[r,...r.children?o(r.children):[]]);return o(n)}traceService=w(ng);selectedSpan=sr(this.traceService.selectedTraceRow$);static getValidTraceTab(e){return e==="info"||e==="attributes"||e==="raw"?e:"info"}selectedDetailTab=mA(i.getValidTraceTab(window.localStorage.getItem("adk-trace-tab-selected-tab")));switchToEvent=Si();constructor(){Fn(()=>{window.localStorage.setItem("adk-trace-tab-selected-tab",this.selectedDetailTab())})}formatTime(e){return e?new Date(e/1e6).toLocaleString():"N/A"}get selectedSpanChildren(){let e=this.selectedSpan();return e?e.children&&e.children.length>0?e.children:this.traceData.filter(A=>A.parent_span_id&&String(A.parent_span_id)===String(e.span_id)):[]}selectSpanById(e){if(!e)return;let A=this.traceData.find(t=>String(t.span_id)===String(e));A&&this.traceService.selectedRow(A)}get selectedSpanIndex(){let e=this.selectedSpan();if(!e)return;let A=this.orderedTraceData.findIndex(t=>t.span_id===e.span_id);return A===-1?void 0:A}onPage(e){e.pageIndex>=0&&e.pageIndex=this.orderedTraceData.length?0:this.selectedSpanIndex+1:t=this.selectedSpanIndex-1<0?this.orderedTraceData.length-1:this.selectedSpanIndex-1,this.traceService.selectedRow(this.orderedTraceData[t])}Object=Object;copiedId=null;copyToClipboard(e,A){if(e==null||e==="")return;let t=String(e);navigator.clipboard.writeText(t).then(()=>{this.copiedId=A||t,setTimeout(()=>this.copiedId=null,2e3)})}getSelectedSpanEventId(){return this.selectedSpan()?.attrEventId}getSelectedSpanAttributesView(){return this.selectedSpan()?.rawAttributesUseThisFieldOnlyForDisplay??{}}getSelectedSpanRawView(){return this.selectedSpan()?.rawSpanUseThisFieldOnlyForDisplay}copyJsonToClipboard(e,A){if(!e)return;let t=JSON.stringify(e,null,2);navigator.clipboard.writeText(t).then(()=>{this.copiedId=A,setTimeout(()=>this.copiedId=null,2e3)})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-trace-tab"]],hostBindings:function(A,t){A&1&&U("keydown",function(o){return t.handleKeyboardNavigation(o)},Fg)},inputs:{traceData:"traceData"},outputs:{switchToEvent:"switchToEvent"},features:[pt([{provide:rd,useClass:RR}])],decls:2,vars:1,consts:[[1,"event-details-container"],[1,"empty-state"],[1,"event-details-header"],["hidePageSize","","aria-label","Select span",1,"event-paginator",3,"page","length","pageSize","pageIndex"],[1,"span-title"],[2,"flex-grow","1"],["mat-icon-button","","matTooltip","Clear selection",3,"click"],[1,"event-details-content"],[1,"vertical-tabs-sidebar"],["mat-icon-button","","matTooltip","Info","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Attributes","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Raw JSON","matTooltipPosition","right",3,"click"],[1,"vertical-tabs-content"],[1,"info-tables-container"],[1,"json-viewer-container","json-viewer-wrapper"],["app-info-table",""],[1,"value-cell"],[3,"matTooltip"],["mat-icon-button","","matTooltip","Copy",1,"copy-value-button",3,"click"],[1,"id-text"],[1,"id-cell"],["mat-icon-button","","matTooltip","Copy",1,"copy-id-button",3,"click"],["app-info-table","","title","Children"],["app-info-table","","title","Events"],["href","javascript:void(0)",1,"span-link","id-text",3,"click","matTooltip"],[3,"json"],["mat-icon-button","","matTooltip","Copy JSON",1,"floating-copy-button",3,"click"]],template:function(A,t){A&1&&T(0,bbA,24,13,"div",0)(1,MbA,2,0,"div",1),A&2&&O(t.selectedSpan()!==void 0?0:1)},dependencies:[qi,yi,Un,zt,Ha,rn,fl,pm,u1],styles:["[_nghost-%COMP%]{display:block;height:100%}.json-viewer-container[_ngcontent-%COMP%]{margin:10px}.event-paginator[_ngcontent-%COMP%]{display:flex;justify-content:center;background-color:transparent}.event-paginator[_ngcontent-%COMP%] .mat-mdc-paginator-range-label{order:2;margin:0 0 0 8px}.span-title[_ngcontent-%COMP%]{font-weight:500;font-family:Google Sans Mono,monospace;font-size:13px;color:var(--mat-sys-on-surface);text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:300px;margin-left:16px}.event-details-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.event-details-content[_ngcontent-%COMP%]{display:flex;flex:1;overflow:hidden}.vertical-tabs-sidebar[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:48px;border-right:1px solid var(--mat-sys-outline-variant);padding-top:8px;align-items:center;gap:8px}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.vertical-tabs-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto}.event-details-header[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant);height:48px;flex-shrink:0}.empty-state[_ngcontent-%COMP%]{padding:16px;text-align:center;color:var(--mat-sys-on-surface-variant);font-style:italic;font-size:14px}.info-tables-container[_ngcontent-%COMP%]{padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:24px}.span-link[_ngcontent-%COMP%]{color:var(--mat-sys-primary);text-decoration:none;cursor:pointer}.span-link[_ngcontent-%COMP%]:hover{text-decoration:underline}.id-text[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:11px}.id-cell[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;overflow:hidden}.id-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child, .value-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.id-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .id-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%]{opacity:1}.copy-id-button[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%]{width:28px!important;height:28px!important;padding:0!important;line-height:28px!important;flex-shrink:0;margin:-4px 0!important;opacity:0;transition:opacity .2s ease-in-out;border-radius:4px!important;overflow:hidden!important}.copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.copy-id-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.json-viewer-wrapper[_ngcontent-%COMP%]{position:relative}.json-viewer-wrapper[_ngcontent-%COMP%]:hover .floating-copy-button[_ngcontent-%COMP%]{opacity:1}.floating-copy-button[_ngcontent-%COMP%]{position:absolute;top:4px;right:4px;z-index:10;opacity:0;transition:opacity .2s ease-in-out;background-color:var(--mat-sys-surface-container-high)!important;border-radius:4px!important;overflow:hidden!important;width:28px!important;height:28px!important;line-height:28px!important;padding:0!important}.floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.floating-copy-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.floating-copy-button[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}"]})};var SbA={agentDevelopmentKitLabel:"Agent Development Kit",disclosureTooltip:"ADK Web is for development purposes. It has access to all the data and should not be used in production.",collapsePanelTooltip:"Collapse panel",eventsTabLabel:"Events",stateTabLabel:"State",artifactsTabLabel:"Artifacts",sessionsTabLabel:"Sessions",evalTabLabel:"Evals",testsTabLabel:"Tests",selectEventAriaLabel:"Select event",infoTabLabel:"Info",graphTabLabel:"Graph",requestDetailsTabLabel:"Request",responseDetailsTabLabel:"Response",responseIsNotAvailable:"Response is not available",requestIsNotAvailable:"Request is not available",clearSelectionButtonLabel:"Remove selection"},_E=new MA("Side Panel Messages",{factory:()=>SbA});var kbA=["eventMenuTrigger"],_bA=["graphContainer"],xbA=(i,e)=>e.span_id,RbA=(i,e)=>e.modality,B$=(i,e)=>e.key,NbA=(i,e)=>e.id;function FbA(i,e){if(i&1){let A=aA();I(0,"button",10),U("click",function(){L(A);let n=p();return G(n.selectedDetailTab="graph")}),I(1,"mat-icon"),D(2,"account_tree"),h()()}if(i&2){let A=p();_A("active",A.selectedDetailTab==="graph"),H("matTooltip",zC(A.i18n.graphTabLabel))}}function LbA(i,e){if(i&1){let A=aA();I(0,"div",31),lA(1,"app-custom-json-viewer",32),I(2,"button",33),U("click",function(){L(A);let n=p(3);return G(n.copyJsonToClipboard(n.selectedEvent().nodeInfo.outputFor,"nodeInfo.outputFor"))}),I(3,"mat-icon"),D(4),h()()()}if(i&2){let A=p(3);Q(),H("json",A.selectedEvent().nodeInfo.outputFor)("showMarkdown",!0),Q(3),nA(A.copiedId==="nodeInfo.outputFor"?"check":"content_copy")}}function GbA(i,e){i&1&&D(0," N/A ")}function KbA(i,e){if(i&1){let A=aA();I(0,"tr")(1,"td"),D(2,"Message As Output"),h(),I(3,"td")(4,"span",24)(5,"span",22),D(6),h(),I(7,"button",25),U("click",function(){L(A);let n=p(3);return G(n.copyToClipboard(n.selectedEvent().nodeInfo.messageAsOutput))}),I(8,"mat-icon"),D(9),h()()()()()}if(i&2){let A,t=p(3);Q(5),H("matTooltip",((A=t.selectedEvent().nodeInfo.messageAsOutput)==null?null:A.toString())||""),Q(),nA(t.selectedEvent().nodeInfo.messageAsOutput),Q(3),nA(t.copiedId===t.selectedEvent().nodeInfo.messageAsOutput?"check":"content_copy")}}function UbA(i,e){if(i&1){let A=aA();I(0,"table",26)(1,"tr")(2,"td"),D(3,"Node Path"),h(),I(4,"td")(5,"span",24)(6,"span",22),D(7),h(),I(8,"button",25),U("click",function(){L(A);let n=p(2);return G(n.copyToClipboard(n.selectedEvent().nodeInfo.path))}),I(9,"mat-icon"),D(10),h()()()()(),I(11,"tr")(12,"td"),D(13,"Output For"),h(),I(14,"td"),T(15,LbA,5,3,"div",31)(16,GbA,1,0),h()(),T(17,KbA,10,3,"tr"),h()}if(i&2){let A=p(2);Q(6),H("matTooltip",A.selectedEvent().nodeInfo.path||""),Q(),nA(A.selectedEvent().nodeInfo.path||"N/A"),Q(3),nA(A.copiedId===A.selectedEvent().nodeInfo.path?"check":"content_copy"),Q(5),O(A.selectedEvent().nodeInfo.outputFor?15:16),Q(2),O(A.selectedEvent().nodeInfo.messageAsOutput!==void 0?17:-1)}}function TbA(i,e){if(i&1){let A=aA();I(0,"div",31),lA(1,"app-custom-json-viewer",32),I(2,"button",33),U("click",function(){L(A);let n=p().$implicit,o=p(3);return G(o.copyJsonToClipboard(o.selectedEvent().actions[n],"action."+n))}),I(3,"mat-icon"),D(4),h()()()}if(i&2){let A=p().$implicit,t=p(3);Q(),H("json",t.selectedEvent().actions[A])("showMarkdown",!0),Q(3),nA(t.copiedId==="action."+A?"check":"content_copy")}}function ObA(i,e){if(i&1){let A=aA();I(0,"span",24)(1,"span",22),D(2),h(),I(3,"button",25),U("click",function(){let n;L(A);let o=p().$implicit,a=p(3);return G(a.copyToClipboard((n=a.selectedEvent().actions[o])==null?null:n.toString()))}),I(4,"mat-icon"),D(5),h()()()}if(i&2){let A,t,n=p().$implicit,o=p(3);Q(),H("matTooltip",((A=o.selectedEvent().actions[n])==null?null:A.toString())||""),Q(),nA(o.selectedEvent().actions[n]),Q(3),nA(o.copiedId===((t=o.selectedEvent().actions[n])==null?null:t.toString())?"check":"content_copy")}}function JbA(i,e){if(i&1&&(I(0,"tr")(1,"td"),D(2),h(),I(3,"td"),T(4,TbA,5,3,"div",31)(5,ObA,6,3,"span",24),h()()),i&2){let A=e.$implicit,t=p(3);Q(2),nA(A),Q(2),O(t.isObject(t.selectedEvent().actions[A])?4:5)}}function YbA(i,e){if(i&1&&(I(0,"table",27),ke(1,JbA,6,2,"tr",null,ni),h()),i&2){let A=p(2);Q(),_e(A.Object.keys(A.selectedEvent().actions))}}function HbA(i,e){if(i&1){let A=aA();I(0,"tr")(1,"td"),D(2),h(),I(3,"td")(4,"div",31),lA(5,"app-custom-json-viewer",32),I(6,"button",33),U("click",function(){let n=L(A),o=n.$implicit,a=n.$index,r=p(3);return G(r.copyJsonToClipboard(o,"fc."+a))}),I(7,"mat-icon"),D(8),h()()()()()}if(i&2){let A=e.$implicit,t=e.$index,n=p(3);Q(2),nA(A==null?null:A.name),Q(3),H("json",A)("showMarkdown",!0),Q(3),nA(n.copiedId==="fc."+t?"check":"content_copy")}}function zbA(i,e){if(i&1&&(I(0,"table",28),ke(1,HbA,9,4,"tr",null,Ja),h()),i&2){let A=p(2);Q(),_e(A.functionCalls())}}function PbA(i,e){if(i&1&&(I(0,"div",35),lA(1,"img",36),h()),i&2){let A=p().$implicit;Q(),H("src","data:"+A.inlineData.mimeType+";base64,"+A.inlineData.data,mo)}}function jbA(i,e){if(i&1&&(I(0,"div"),lA(1,"audio",37),h()),i&2){let A=p().$implicit;Q(),H("src","data:"+A.inlineData.mimeType+";base64,"+A.inlineData.data)}}function VbA(i,e){if(i&1&&(I(0,"div"),lA(1,"video",37),h()),i&2){let A=p().$implicit;Q(),H("src","data:"+A.inlineData.mimeType+";base64,"+A.inlineData.data,mo)}}function qbA(i,e){if(i&1&&(I(0,"div"),D(1),h()),i&2){let A=p().$implicit;Q(),Ee(" Unsupported media type: ",A.inlineData==null?null:A.inlineData.mimeType," ")}}function WbA(i,e){if(i&1&&T(0,PbA,2,1,"div",35)(1,jbA,2,1,"div")(2,VbA,2,1,"div")(3,qbA,2,1,"div"),i&2){let A=e.$implicit;O(!(A.inlineData==null||A.inlineData.mimeType==null)&&A.inlineData.mimeType.startsWith("image/")?0:!(A.inlineData==null||A.inlineData.mimeType==null)&&A.inlineData.mimeType.startsWith("audio/")?1:!(A.inlineData==null||A.inlineData.mimeType==null)&&A.inlineData.mimeType.startsWith("video/")?2:3)}}function ZbA(i,e){if(i&1&&(I(0,"div",34),ke(1,WbA,4,1,null,null,Ja),h()),i&2){let A=p().$implicit;Q(),_e(A.mediaParts)}}function XbA(i,e){if(i&1){let A=aA();I(0,"tr")(1,"td"),D(2),h(),I(3,"td"),T(4,ZbA,3,0,"div",34),I(5,"div",31),lA(6,"app-custom-json-viewer",32),I(7,"button",33),U("click",function(){let n=L(A),o=n.$implicit,a=n.$index,r=p(3);return G(r.copyJsonToClipboard(o.cleanedFr,"pfr."+a))}),I(8,"mat-icon"),D(9),h()()()()()}if(i&2){let A=e.$implicit,t=e.$index,n=p(3);Q(2),nA(A.name),Q(2),O(A.hasMedia?4:-1),Q(2),H("json",A.cleanedFr)("showMarkdown",!0),Q(3),nA(n.copiedId==="pfr."+t?"check":"content_copy")}}function $bA(i,e){if(i&1&&(I(0,"table",29),ke(1,XbA,10,5,"tr",null,Ja),h()),i&2){let A=p(2);Q(),_e(A.processedFunctionResponses())}}function A7A(i,e){if(i&1){let A=aA();I(0,"tr")(1,"td"),D(2),h(),I(3,"td")(4,"span",21)(5,"a",38),U("click",function(){let n=L(A).$implicit,o=p(3);return G(o.switchToSpan(n))}),D(6),h(),I(7,"button",23),U("click",function(){let n=L(A).$implicit,o=p(3);return G(o.copyToClipboard(n.span_id))}),I(8,"mat-icon"),D(9),h()()()()()}if(i&2){let A=e.$implicit,t=p(3);Q(2),nA(A.name),Q(3),H("matTooltip",A.span_id),Q(),nA(A.span_id),Q(3),nA(t.copiedId===A.span_id?"check":"content_copy")}}function e7A(i,e){if(i&1&&(I(0,"table",30),ke(1,A7A,10,4,"tr",null,xbA),h()),i&2){let A=p(2);Q(),_e(A.associatedSpans())}}function t7A(i,e){if(i&1){let A=aA();I(0,"div",16)(1,"table",19)(2,"tr")(3,"td"),D(4,"Event ID"),h(),I(5,"td",20)(6,"span",21)(7,"span",22),D(8),h(),I(9,"button",23),U("click",function(){let n;L(A);let o=p();return G(o.copyToClipboard((n=o.selectedEvent())==null?null:n.id))}),I(10,"mat-icon"),D(11),h()()()()(),I(12,"tr")(13,"td"),D(14,"Invocation ID"),h(),I(15,"td",20)(16,"span",21)(17,"span",22),D(18),h(),I(19,"button",23),U("click",function(){let n;L(A);let o=p();return G(o.copyToClipboard((n=o.selectedEvent())==null?null:n.invocationId))}),I(20,"mat-icon"),D(21),h()()()()(),I(22,"tr")(23,"td"),D(24,"Branch"),h(),I(25,"td")(26,"span",24)(27,"span",22),D(28),h(),I(29,"button",25),U("click",function(){let n;L(A);let o=p();return G(o.copyToClipboard((n=o.selectedEvent())==null?null:n.branch))}),I(30,"mat-icon"),D(31),h()()()()(),I(32,"tr")(33,"td"),D(34,"Timestamp"),h(),I(35,"td")(36,"span",24)(37,"span",22),D(38),h(),I(39,"button",25),U("click",function(){let n;L(A);let o=p();return G(o.copyToClipboard(o.formatTime((n=o.selectedEvent())==null?null:n.timestamp),"timestamp"))}),I(40,"mat-icon"),D(41),h()()()()(),I(42,"tr")(43,"td"),D(44,"Author"),h(),I(45,"td")(46,"span",24)(47,"span",22),D(48),h(),I(49,"button",25),U("click",function(){let n;L(A);let o=p();return G(o.copyToClipboard((n=o.selectedEvent())==null?null:n.author))}),I(50,"mat-icon"),D(51),h()()()()()(),T(52,UbA,18,5,"table",26),T(53,YbA,3,0,"table",27),T(54,zbA,3,0,"table",28),T(55,$bA,3,0,"table",29),T(56,e7A,3,0,"table",30),h()}if(i&2){let A,t,n,o,a,r,s,l,g,C,d,B,u,E,f,m,v=p();Q(7),H("matTooltip",((A=v.selectedEvent())==null?null:A.id)||""),Q(),nA((t=v.selectedEvent())==null?null:t.id),Q(3),nA(v.copiedId===((n=v.selectedEvent())==null?null:n.id)?"check":"content_copy"),Q(6),H("matTooltip",((o=v.selectedEvent())==null?null:o.invocationId)||""),Q(),nA(((a=v.selectedEvent())==null?null:a.invocationId)||"N/A"),Q(3),nA(v.copiedId===((r=v.selectedEvent())==null?null:r.invocationId)?"check":"content_copy"),Q(6),H("matTooltip",((s=v.selectedEvent())==null?null:s.branch)||""),Q(),nA(((l=v.selectedEvent())==null?null:l.branch)||"N/A"),Q(3),nA(v.copiedId===((g=v.selectedEvent())==null?null:g.branch)?"check":"content_copy"),Q(6),H("matTooltip",v.formatTime((C=v.selectedEvent())==null?null:C.timestamp)),Q(),nA(v.formatTime((d=v.selectedEvent())==null?null:d.timestamp)),Q(3),nA(v.copiedId==="timestamp"?"check":"content_copy"),Q(6),H("matTooltip",((B=v.selectedEvent())==null?null:B.author)||""),Q(),nA((u=v.selectedEvent())==null?null:u.author),Q(3),nA(v.copiedId===((E=v.selectedEvent())==null?null:E.author)?"check":"content_copy"),Q(),O((f=v.selectedEvent())!=null&&f.nodeInfo?52:-1),Q(),O((m=v.selectedEvent())!=null&&m.actions&&v.Object.keys(v.selectedEvent().actions).length>0?53:-1),Q(),O(v.functionCalls().length>0?54:-1),Q(),O(v.processedFunctionResponses().length>0?55:-1),Q(),O(v.associatedSpans().length>0?56:-1)}}function i7A(i,e){if(i&1&&(I(0,"div",42),mt(1,"number"),I(2,"span",43),D(3),h(),I(4,"span",44),D(5),mt(6,"number"),h()()),i&2){let A=e.$implicit;H("matTooltip",A.modality+": "+Ft(1,3,A.tokenCount)),Q(3),nA(A.modality),Q(2),nA(Ft(6,5,A.tokenCount))}}function n7A(i,e){if(i&1&&ke(0,i7A,7,7,"div",42,RbA),i&2){let A=p().$implicit,t=p(3);_e(t.selectedEvent().usageMetadata[A])}}function o7A(i,e){if(i&1&&(I(0,"span",22),mt(1,"number"),D(2),mt(3,"number"),h()),i&2){let A=p(2).$implicit,t=p(3);H("matTooltip",Ft(1,2,t.selectedEvent().usageMetadata[A])||""),Q(2),nA(Ft(3,4,t.selectedEvent().usageMetadata[A]))}}function a7A(i,e){if(i&1&&(I(0,"span",22),D(1),h()),i&2){let A,t=p(2).$implicit,n=p(3);H("matTooltip",((A=n.selectedEvent().usageMetadata[t])==null?null:A.toString())||""),Q(),nA(n.selectedEvent().usageMetadata[t])}}function r7A(i,e){if(i&1&&T(0,o7A,4,6,"span",22)(1,a7A,2,2,"span",22),i&2){let A=p().$implicit,t=p(3);O(t.isNumber(t.selectedEvent().usageMetadata[A])?0:1)}}function s7A(i,e){if(i&1&&(I(0,"tr")(1,"td"),D(2),h(),I(3,"td")(4,"span",24)(5,"span"),T(6,n7A,2,0)(7,r7A,2,1),h()()()()),i&2){let A=e.$implicit,t=p(3);Q(2),nA(A),Q(2),_A("numeric-cell",t.isNumericValue(A,t.selectedEvent().usageMetadata[A])),Q(2),O(A==="promptTokensDetails"||A==="promptTokenDetails"||A==="candidatesTokenDetails"||A==="candidatesTokensDetails"||A==="cacheTokensDetails"?6:7)}}function l7A(i,e){if(i&1&&(I(0,"table",39),ke(1,s7A,8,4,"tr",null,ni),h()),i&2){let A=p(2);Q(),_e(A.Object.keys(A.selectedEvent().usageMetadata))}}function g7A(i,e){i&1&&(I(0,"table",39)(1,"tr")(2,"td",45),D(3," Select an LLM response to see usage metadata. "),h()()())}function c7A(i,e){if(i&1&&(I(0,"div",16),T(1,l7A,3,0,"table",39)(2,g7A,4,0,"table",39),I(3,"table",40)(4,"tr")(5,"td"),D(6,"Total Prompt Tokens"),h(),I(7,"td",41),D(8),mt(9,"number"),h()(),I(10,"tr")(11,"td"),D(12,"Total Candidates Tokens"),h(),I(13,"td",41),D(14),mt(15,"number"),h()(),I(16,"tr")(17,"td"),D(18,"Total Tokens"),h(),I(19,"td",41),D(20),mt(21,"number"),h()()()()),i&2){let A,t=p();Q(),O((A=t.selectedEvent())!=null&&A.usageMetadata&&t.Object.keys(t.selectedEvent().usageMetadata).length>0?1:2),Q(7),nA(Ft(9,4,t.sessionUsageMetadata()["Prompt Tokens"])),Q(6),nA(Ft(15,6,t.sessionUsageMetadata()["Candidates Tokens"])),Q(6),nA(Ft(21,8,t.sessionUsageMetadata()["Total Tokens"]))}}function C7A(i,e){if(i&1){let A=aA();I(0,"div",17),lA(1,"app-custom-json-viewer",32),I(2,"button",33),U("click",function(){L(A);let n=p();return G(n.copyJsonToClipboard(n.filteredSelectedEvent(),"raw"))}),I(3,"mat-icon"),D(4),h()()()}if(i&2){let A=p();Q(),H("json",A.filteredSelectedEvent())("showMarkdown",!0),Q(3),nA(A.copiedId==="raw"?"check":"content_copy")}}function d7A(i,e){if(i&1&&lA(0,"app-custom-json-viewer",32),i&2){let A=p().$implicit;H("json",A.oldValue)("showMarkdown",!0)}}function I7A(i,e){if(i&1&&(I(0,"span"),D(1),h()),i&2){let A=p().$implicit;Q(),nA(A.oldValue)}}function B7A(i,e){if(i&1&&lA(0,"app-custom-json-viewer",32),i&2){let A=p().$implicit;H("json",A.newValue)("showMarkdown",!0)}}function h7A(i,e){if(i&1&&(I(0,"span"),D(1),h()),i&2){let A=p().$implicit;Q(),nA(A.newValue)}}function E7A(i,e){if(i&1&&(I(0,"div",47)(1,"div",48),D(2),h(),I(3,"div",49)(4,"div",50)(5,"div",51),D(6,"Old Value"),h(),I(7,"div",52),T(8,d7A,1,2,"app-custom-json-viewer",32)(9,I7A,2,1,"span"),h()(),I(10,"div",50)(11,"div",51),D(12,"New Value"),h(),I(13,"div",52),T(14,B7A,1,2,"app-custom-json-viewer",32)(15,h7A,2,1,"span"),h()()()()),i&2){let A=e.$implicit,t=p(3);Q(2),nA(A.key),Q(6),O(t.isObject(A.oldValue)?8:9),Q(6),O(t.isObject(A.newValue)?14:15)}}function Q7A(i,e){if(i&1&&ke(0,E7A,16,3,"div",47,B$),i&2){let A=p(2);_e(A.stateChanges())}}function u7A(i,e){i&1&&(I(0,"div",46),D(1," No state changes in this event. "),h())}function p7A(i,e){if(i&1&&(I(0,"div",16),T(1,Q7A,2,0)(2,u7A,2,0,"div",46),h()),i&2){let A=p();Q(),O(A.stateChanges().length>0?1:2)}}function f7A(i,e){i&1&&(I(0,"div",53)(1,"mat-icon",66),D(2,"warning"),h(),I(3,"span"),D(4,"The loaded session file was for a different app. The graph may not be accurate."),h()())}function m7A(i,e){if(i&1){let A=aA();I(0,"button",72),U("click",function(){let n=L(A).$implicit,o=p(3);return G(o.onInvocationSelected(n.key))}),I(1,"mat-icon",73),D(2,"check"),h(),D(3),h()}if(i&2){let A,t=e.$implicit,n=p(3);H("matTooltip",t.key),Q(),ft("visibility",((A=n.selectedEvent())==null?null:A.invocationId)===t.key?"visible":"hidden"),Q(2),Ee(" ",t.value," ")}}function w7A(i,e){if(i&1&&(I(0,"button",67)(1,"div",68)(2,"span",69),D(3),h(),I(4,"mat-icon",70),D(5,"arrow_drop_down"),h()()(),I(6,"mat-menu",null,3),ke(8,m7A,4,4,"button",71,B$),h()),i&2){let A,t=Bi(7),n=p(2);H("matMenuTriggerFor",t),Q(2),H("matTooltip",((A=n.selectedEvent())==null?null:A.invocationId)||""),Q(),Ee(" ",n.invocationDisplayMap().get(n.selectedEvent().invocationId)||n.selectedEvent().invocationId," "),Q(5),_e(n.invocationDisplayEntries())}}function y7A(i,e){if(i&1&&(I(0,"span",57),D(1),h()),i&2){let A,t,n=p(2);H("matTooltip",((A=n.selectedEvent())==null?null:A.invocationId)||""),Q(),nA((t=n.selectedEvent())!=null&&t.invocationId?n.invocationDisplayMap().get(n.selectedEvent().invocationId)||n.selectedEvent().invocationId:"N/A")}}function D7A(i,e){i&1&&(I(0,"mat-icon",75),D(1,"chevron_right"),h())}function v7A(i,e){i&1&&(I(0,"mat-icon",75),D(1,"chevron_right"),h())}function b7A(i,e){if(i&1&&(T(0,v7A,2,0,"mat-icon",75),I(1,"button",74),D(2),h()),i&2){let A=e.$implicit,t=e.$index,n=p(3);O(t>0?0:-1),Q(),_A("active",t===n.breadcrumbs().length-1),Q(),Ee(" ",A," ")}}function M7A(i,e){if(i&1&&(I(0,"div",58)(1,"button",74),D(2),h(),T(3,D7A,2,0,"mat-icon",75),ke(4,b7A,3,4,null,null,Ja),h()),i&2){let A=p(2);Q(2),nA(A.appName()),Q(),O(A.breadcrumbs().length>0?3:-1),Q(),_e(A.breadcrumbs())}}function S7A(i,e){if(i&1){let A=aA();I(0,"button",76),U("click",function(){L(A);let n=p(2);return G(n.showAgentStructureGraph.emit(!0))}),I(1,"mat-icon"),D(2,"fullscreen"),h()()}}function k7A(i,e){i&1&&(I(0,"div",61),D(1," Graph is not available for this agent. "),h())}function _7A(i,e){i&1&&(I(0,"div",62),lA(1,"mat-progress-spinner",77),h())}function x7A(i,e){if(i&1&&lA(0,"div",63),i&2){let A=p(2);H("innerHtml",A.renderedEventGraph(),Fc)}}function R7A(i,e){if(i&1){let A=aA();I(0,"button",78),U("click",function(){let n=L(A).$implicit,o=p(2);return G(o.handleMenuSelection(n))}),I(1,"span"),D(2),mt(3,"date"),h()()}if(i&2){let A=e.$implicit;Q(2),Ya("Run ",A.runIndex," (",G0(3,2,A.timestamp,"mediumTime"),")")}}function N7A(i,e){if(i&1&&(I(0,"div",18),T(1,f7A,5,0,"div",53),I(2,"div",54)(3,"div",55)(4,"span",56),D(5,"Invocation:"),h(),T(6,w7A,10,3)(7,y7A,2,2,"span",57),h()(),T(8,M7A,6,2,"div",58),I(9,"div",59,0),T(11,S7A,3,0,"button",60),T(12,k7A,2,0,"div",61)(13,_7A,2,0,"div",62)(14,x7A,1,1,"div",63),h(),lA(15,"div",64,1),I(17,"mat-menu",null,2),ke(19,R7A,4,5,"button",65,NbA),h()()),i&2){let A,t=Bi(18),n=p();Q(),O(n.isViewOnlyAppNameMismatch()?1:-1),Q(5),O(n.invocationDisplayMap().size>0&&((A=n.selectedEvent())!=null&&A.invocationId)?6:7),Q(2),O(n.hasSubWorkflows()&&(n.breadcrumbs().length>0||n.appName())?8:-1),Q(3),O(n.graphsAvailable()?11:-1),Q(),O(n.graphsAvailable()?n.renderedEventGraph()?14:13:12),Q(3),ft("left",n.menuPos.x+"px")("top",n.menuPos.y+"px"),H("matMenuTriggerFor",t),Q(4),_e(n.menuEvents)}}function F7A(i,e){i&1&&(I(0,"div",62),lA(1,"mat-progress-spinner",77),h())}function L7A(i,e){i&1&&(I(0,"div",61),D(1,"Select an LLM response to see request details."),h())}function G7A(i,e){if(i&1){let A=aA();I(0,"div",17),lA(1,"app-custom-json-viewer",32),I(2,"button",33),U("click",function(){L(A);let n=p(2);return G(n.copyJsonToClipboard(n.llmRequest(),"request"))}),I(3,"mat-icon"),D(4),h()()()}if(i&2){let A=p(2);Q(),H("json",A.llmRequest())("showMarkdown",!0),Q(3),nA(A.copiedId==="request"?"check":"content_copy")}}function K7A(i,e){if(i&1&&(T(0,F7A,2,0,"div",62),mt(1,"async"),S1(2,L7A,2,0,"div",61)(3,G7A,5,3,"div",17)),i&2){let A=p();O(Ft(1,1,A.uiStateService.isEventRequestResponseLoading())===!0?0:A.llmRequest()?3:2)}}function U7A(i,e){i&1&&(I(0,"div",62),lA(1,"mat-progress-spinner",77),h())}function T7A(i,e){i&1&&(I(0,"div",61),D(1,"Select an LLM response to see response details."),h())}function O7A(i,e){if(i&1){let A=aA();I(0,"div",17),lA(1,"app-custom-json-viewer",32),I(2,"button",33),U("click",function(){L(A);let n=p(2);return G(n.copyJsonToClipboard(n.llmResponse(),"response"))}),I(3,"mat-icon"),D(4),h()()()}if(i&2){let A=p(2);Q(),H("json",A.llmResponse())("showMarkdown",!0),Q(3),nA(A.copiedId==="response"?"check":"content_copy")}}function J7A(i,e){if(i&1&&(T(0,U7A,2,0,"div",62),mt(1,"async"),S1(2,T7A,2,0,"div",61)(3,O7A,5,3,"div",17)),i&2){let A=p();O(Ft(1,1,A.uiStateService.isEventRequestResponseLoading())===!0?0:A.llmResponse()?3:2)}}var Ry=class i{eventDataSize=ve.required();eventDataMap=ve(new Map);selectedEventIndex=ve();selectedEvent=ve.required();filteredSelectedEvent=ve();renderedEventGraph=ve();rawSvgString=ve(null);llmRequest=ve();llmResponse=ve();traceData=ve([]);appName=ve("");selectedEventGraphPath=ve("");hasSubWorkflows=ve(!1);graphsAvailable=ve(!0);invocationDisplayMap=ve(new Map);forceGraphTab=ve(!1);isViewOnlySession=ve(!1);isViewOnlyAppNameMismatch=ve(!1);invocationDisplayEntries=ye(()=>Array.from(this.invocationDisplayMap().entries()).map(([e,A])=>({key:e,value:A})));breadcrumbs=ye(()=>{let e=this.selectedEventGraphPath();return e?e.split("/").filter(A=>A):[]});functionCalls=ye(()=>(this.selectedEvent()?.content?.parts||[]).filter(A=>!!A.functionCall).map(A=>A.functionCall));functionResponses=ye(()=>(this.selectedEvent()?.content?.parts||[]).filter(A=>!!A.functionResponse).map(A=>A.functionResponse));processedFunctionResponses=ye(()=>this.functionResponses().map(A=>{if(!A)return null;if(A&&Array.isArray(A.parts)){let n=A.parts.filter(a=>!!a.inlineData).map(a=>a.inlineData&&a.inlineData.data?$A(P({},a),{inlineData:$A(P({},a.inlineData),{data:a.inlineData.data.replace(/-/g,"+").replace(/_/g,"/")})}):a),o=P({},A);return delete o.parts,{name:A.name,cleanedFr:o,mediaParts:n,hasMedia:n.length>0}}return{name:A.name,cleanedFr:A,mediaParts:[],hasMedia:!1}}).filter(A=>A!==null));page=Si();closeSelectedEvent=Si();openImageDialog=Si();switchToTraceView=Si();showAgentStructureGraph=Si();drillDownNodePath=Si();selectEventById=Si();jumpToInvocation=Si();onInvocationSelected(e){this.jumpToInvocation.emit(e)}eventMenuTrigger;graphContainer;menuEvents=[];menuPos={x:0,y:0};uiStateService=w(ag);traceService=w(ng);i18n=w(_E);isEventRequestResponseLoadingSignal=sr(this.uiStateService.isEventRequestResponseLoading(),{initialValue:!1});associatedSpans=ye(()=>{let e=this.selectedEvent();if(!e||!e.id)return[];let A=this.traceData();if(!A)return[];let t=o=>{let a=[];for(let r of o)a.push(r),r.children&&(a=a.concat(t(r.children)));return a};return t(A).filter(o=>o.attrEventId===e.id)});sessionUsageMetadata=ye(()=>{let e=Array.from(this.eventDataMap().values()),A=0,t=0,n=0;return e.forEach(o=>{let a=o.usageMetadata;if(a){let r=a.promptTokenCount??a.promptTokens??0,s=a.candidatesTokenCount??a.candidatesTokens??0,l=a.totalTokenCount??a.totalTokens??0;A+=Number(r),t+=Number(s),n+=Number(l)}}),{"Prompt Tokens":A,"Candidates Tokens":t,"Total Tokens":n}});_selectedDetailTab="event";get selectedDetailTab(){return this._selectedDetailTab}set selectedDetailTab(e){this._selectedDetailTab=e,window.localStorage.setItem("adk-event-tab-selected-tab",e),e==="graph"&&setTimeout(()=>{this.graphContainer?.nativeElement&&FB(this.graphContainer.nativeElement,(A,t)=>{this.handleNodeClick(A,t)})},50)}copiedId=null;copyToClipboard(e,A){e&&navigator.clipboard.writeText(e).then(()=>{this.copiedId=A||e,setTimeout(()=>this.copiedId=null,2e3)})}copyJsonToClipboard(e,A){if(!e)return;let t=JSON.stringify(e,null,2);navigator.clipboard.writeText(t).then(()=>{this.copiedId=A,setTimeout(()=>this.copiedId=null,2e3)})}switchToSpan(e){this.switchToTraceView.emit(),this.traceService.selectedRow(e)}stateChanges=ye(()=>{let e=this.selectedEvent();if(!e)return[];let A=Array.from(this.eventDataMap().values());A.sort((o,a)=>(o.timestamp||0)-(a.timestamp||0));let t={},n=[];for(let o of A){let a=o.actions?.stateDelta;if(o.id===e.id){if(a)for(let r of Object.keys(a))r!=="__llm_request_key__"&&n.push({key:r,oldValue:t[r]!==void 0?t[r]:"N/A",newValue:a[r]});break}if(a)for(let r of Object.keys(a))r!=="__llm_request_key__"&&(t[r]=a[r])}return n});constructor(){let e=window.localStorage.getItem("adk-event-tab-selected-tab");e&&["event","raw","request","response","graph","metadata","state"].includes(e)&&(this._selectedDetailTab=e),Fn(()=>{let t=this.renderedEventGraph(),n=this._selectedDetailTab;t&&n==="graph"&&setTimeout(()=>{this.graphContainer?.nativeElement&&FB(this.graphContainer.nativeElement,(o,a)=>{this.handleNodeClick(o,a)})},50)});let A=!1;Fn(()=>{let t=this.forceGraphTab(),n=this.selectedEvent();t&&!A&&(this.selectedDetailTab=this.graphsAvailable()?"graph":"event"),A=t})}formatTime(e){if(!e)return"N/A";let A=e<1e10?e*1e3:e;return new Date(A).toLocaleString()}isNumber(e){return typeof e=="number"}isNumericValue(e,A){return typeof A=="number"?!0:["promptTokensDetails","promptTokenDetails","candidatesTokenDetails","candidatesTokensDetails","cacheTokensDetails"].includes(e)}isObject(e){return e!==null&&typeof e=="object"}handleNodeClick(e,A){let t=Array.from(this.eventDataMap().values()),o=this.selectedEvent()?.invocationId;o&&(t=t.filter(l=>l.invocationId===o));let a=[],r=[],s="";t.forEach(l=>{let g=l.nodeInfo?.path;if(l.author==="user"&&(g="__START__"),!g)return;let C=g;g!=="__START__"&&(C=g.split("/").map(E=>E.split("@")[0]).join("/"));let d=C.split("/"),B=d[d.length-1],u="";if(d.length>=2&&d[d.length-1]==="call_llm"&&d[d.length-2]===l.author?(B=d[d.length-2],u=d.slice(1,-2).join("/")):u=d.slice(1,-1).join("/"),u===this.selectedEventGraphPath()){let E=g.split("/"),f=E[E.length-1],m=e.includes("@")?f:B;m!==s&&(s===e&&r.length>0&&a.push(r),s=m,r=[]),m===e&&r.push(l)}}),s===e&&r.length>0&&a.push(r),a.length!==0&&(a.length===1?this.selectEventById.emit(a[0][0].id):(this.menuEvents=a.map((l,g)=>({id:l[0].id,runIndex:g+1,timestamp:l[0].timestamp})),A&&(this.menuPos={x:A.clientX,y:A.clientY}),this.eventMenuTrigger.openMenu()))}handleMenuSelection(e){this.selectEventById.emit(e.id)}Object=Object;static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-event-tab"]],viewQuery:function(A,t){if(A&1&&Wt(kbA,5)(_bA,5),A&2){let n;se(n=le())&&(t.eventMenuTrigger=n.first),se(n=le())&&(t.graphContainer=n.first)}},inputs:{eventDataSize:[1,"eventDataSize"],eventDataMap:[1,"eventDataMap"],selectedEventIndex:[1,"selectedEventIndex"],selectedEvent:[1,"selectedEvent"],filteredSelectedEvent:[1,"filteredSelectedEvent"],renderedEventGraph:[1,"renderedEventGraph"],rawSvgString:[1,"rawSvgString"],llmRequest:[1,"llmRequest"],llmResponse:[1,"llmResponse"],traceData:[1,"traceData"],appName:[1,"appName"],selectedEventGraphPath:[1,"selectedEventGraphPath"],hasSubWorkflows:[1,"hasSubWorkflows"],graphsAvailable:[1,"graphsAvailable"],invocationDisplayMap:[1,"invocationDisplayMap"],forceGraphTab:[1,"forceGraphTab"],isViewOnlySession:[1,"isViewOnlySession"],isViewOnlyAppNameMismatch:[1,"isViewOnlyAppNameMismatch"]},outputs:{page:"page",closeSelectedEvent:"closeSelectedEvent",openImageDialog:"openImageDialog",switchToTraceView:"switchToTraceView",showAgentStructureGraph:"showAgentStructureGraph",drillDownNodePath:"drillDownNodePath",selectEventById:"selectEventById",jumpToInvocation:"jumpToInvocation"},decls:35,vars:32,consts:[["graphContainer",""],["eventMenuTrigger","matMenuTrigger"],["eventMenu","matMenu"],["invocationSelectorMenu","matMenu"],[1,"event-details-container"],[1,"event-details-header"],["hidePageSize","",1,"event-paginator",3,"page","length","pageSize","pageIndex"],["mat-icon-button","",3,"click","matTooltip"],[1,"event-details-content"],[1,"vertical-tabs-sidebar"],["mat-icon-button","","matTooltipPosition","right",3,"click","matTooltip"],["mat-icon-button","","matTooltipPosition","right",3,"active","matTooltip"],["mat-icon-button","","matTooltip","Usage Metadata","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","State Changes","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Raw JSON","matTooltipPosition","right",3,"click"],[1,"vertical-tabs-content"],[1,"info-tables-container"],[1,"json-viewer-container","json-viewer-wrapper"],[1,"event-graph-wrapper"],["app-info-table",""],[1,"id-text"],[1,"id-cell"],[3,"matTooltip"],["mat-icon-button","","matTooltip","Copy",1,"copy-id-button",3,"click"],[1,"value-cell"],["mat-icon-button","","matTooltip","Copy",1,"copy-value-button",3,"click"],["app-info-table","","title","Node Info"],["app-info-table","","title","Actions"],["app-info-table","","title","Function Calls"],["app-info-table","","title","Function Responses"],["app-info-table","","title","Associated Spans"],[1,"json-viewer-wrapper"],[3,"json","showMarkdown"],["mat-icon-button","","matTooltip","Copy JSON",1,"floating-copy-button",3,"click"],[1,"media-container"],[1,"generated-image-container"],["alt","image",3,"src"],["controls","",3,"src"],["href","javascript:void(0)",1,"span-link","id-text",3,"click","matTooltip"],["app-info-table","","title","Usage Summary for Event"],["app-info-table","","title","Usage Summary for Session"],[1,"numeric-cell"],[1,"detail-row",3,"matTooltip"],[1,"modality-label"],[1,"modality-value"],["colspan","2",2,"text-align","center","padding","20px","color","var(--mat-sys-on-surface-variant)"],[1,"empty-state"],[1,"state-change-card"],[1,"state-change-header"],[1,"state-change-values"],[1,"state-value-block"],[1,"state-value-label"],[1,"state-value-content"],[1,"warning-banner",2,"background-color","#fff3cd","color","#856404","padding","8px","margin-bottom","8px","border-radius","4px","display","flex","align-items","center"],[1,"graph-header",2,"justify-content","space-between"],[2,"display","flex","align-items","center","min-width","0","flex","1","width","100%"],[2,"white-space","nowrap","flex-shrink","0"],[2,"margin-left","8px","font-weight","normal",3,"matTooltip"],[1,"breadcrumb-container"],[1,"event-graph-container"],["mat-icon-button","","matTooltip","Full Screen",1,"fullscreen-graph-button"],[1,"request-response-empty-state"],[1,"request-response-loading-spinner-container"],[1,"svg-graph-wrapper",3,"innerHtml"],[2,"visibility","hidden","position","fixed",3,"matMenuTriggerFor"],["mat-menu-item",""],[2,"margin-right","8px"],["mat-button","",1,"invocation-selector-button",2,"margin-left","8px","padding","0 8px","min-width","0","flex","1","height","24px","line-height","24px","width","100%",3,"matMenuTriggerFor"],[2,"display","flex","align-items","center","width","100%","min-width","0","justify-content","space-between"],[2,"font-weight","normal","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","flex","1","text-align","left",3,"matTooltip"],[2,"margin-left","4px","font-size","18px","width","18px","height","18px","flex-shrink","0"],["mat-menu-item","","matTooltipPosition","right",3,"matTooltip"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[2,"font-size","16px","width","16px","height","16px","margin-right","8px","color","var(--mat-sys-primary)"],["disabled","",1,"breadcrumb-item"],[1,"breadcrumb-separator"],["mat-icon-button","","matTooltip","Full Screen",1,"fullscreen-graph-button",3,"click"],["mode","indeterminate","diameter","50"],["mat-menu-item","",3,"click"]],template:function(A,t){A&1&&(I(0,"div",4)(1,"div",5)(2,"mat-paginator",6),U("page",function(o){return t.page.emit(o)}),h(),I(3,"button",7),U("click",function(){return t.closeSelectedEvent.emit()}),I(4,"mat-icon"),D(5,"remove_selection"),h()()(),I(6,"div",8)(7,"div",9)(8,"button",10),U("click",function(){return t.selectedDetailTab="event"}),I(9,"mat-icon"),D(10,"info"),h()(),T(11,FbA,3,4,"button",11),I(12,"button",10),U("click",function(){return t.selectedDetailTab="request"}),I(13,"mat-icon"),D(14,"input"),h()(),I(15,"button",10),U("click",function(){return t.selectedDetailTab="response"}),I(16,"mat-icon"),D(17,"output"),h()(),I(18,"button",12),U("click",function(){return t.selectedDetailTab="metadata"}),I(19,"mat-icon"),D(20,"analytics"),h()(),I(21,"button",13),U("click",function(){return t.selectedDetailTab="state"}),I(22,"mat-icon"),D(23,"published_with_changes"),h()(),I(24,"button",14),U("click",function(){return t.selectedDetailTab="raw"}),I(25,"mat-icon"),D(26,"data_object"),h()()(),I(27,"div",15),T(28,t7A,57,20,"div",16),T(29,c7A,22,10,"div",16),T(30,C7A,5,3,"div",17),T(31,p7A,3,1,"div",16),T(32,N7A,21,10,"div",18),T(33,K7A,4,3),T(34,J7A,4,3),h()()()),A&2&&(Q(2),H("length",t.eventDataSize())("pageSize",1)("pageIndex",t.selectedEventIndex()),ie("aria-label",t.i18n.selectEventAriaLabel),Q(),H("matTooltip",zC(t.i18n.clearSelectionButtonLabel)),Q(5),_A("active",t.selectedDetailTab==="event"),H("matTooltip",zC(t.i18n.infoTabLabel)),Q(3),O(t.graphsAvailable()?11:-1),Q(),_A("active",t.selectedDetailTab==="request"),H("matTooltip",zC(t.i18n.requestDetailsTabLabel)),Q(3),_A("active",t.selectedDetailTab==="response"),H("matTooltip",zC(t.i18n.responseDetailsTabLabel)),Q(3),_A("active",t.selectedDetailTab==="metadata"),Q(3),_A("active",t.selectedDetailTab==="state"),Q(3),_A("active",t.selectedDetailTab==="raw"),Q(4),O(t.selectedDetailTab==="event"?28:-1),Q(),O(t.selectedDetailTab==="metadata"?29:-1),Q(),O(t.selectedDetailTab==="raw"?30:-1),Q(),O(t.selectedDetailTab==="state"?31:-1),Q(),O(t.selectedDetailTab==="graph"?32:-1),Q(),O(t.selectedDetailTab==="request"?33:-1),Q(),O(t.selectedDetailTab==="response"?34:-1))},dependencies:[qi,ki,yi,zt,pm,Es,rn,s2,hs,Gs,tg,fl,u1,gs,YN,bI],styles:["[_nghost-%COMP%]{display:block;height:100%}.json-viewer-container[_ngcontent-%COMP%]{margin:10px}.event-paginator[_ngcontent-%COMP%]{margin-right:auto;display:flex;justify-content:center;background-color:transparent}.event-paginator[_ngcontent-%COMP%] .mat-mdc-paginator-range-label{order:2;margin:0 0 0 8px}.event-details-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.event-details-content[_ngcontent-%COMP%]{display:flex;flex:1;overflow:hidden}.vertical-tabs-sidebar[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:48px;border-right:1px solid var(--mat-sys-outline-variant);padding-top:8px;align-items:center;gap:8px}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.vertical-tabs-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto}.event-details-header[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant);height:48px;flex-shrink:0}.empty-state[_ngcontent-%COMP%]{padding:16px;text-align:center;color:var(--mat-sys-on-surface-variant);font-style:italic}.details-content[_ngcontent-%COMP%]{color:var(--side-panel-details-content-color);font-size:14px}.event-graph-wrapper[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;width:100%}.breadcrumb-container[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:13px;color:var(--mat-sys-on-surface-variant);padding:8px 12px}.breadcrumb-container[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-weight:500;margin-right:8px;color:var(--mat-sys-on-surface)}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]{background:none;border:none;color:var(--mat-sys-primary);font-size:13px;padding:2px 4px}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-item.active[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface)}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-on-surface);font-weight:500}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-separator[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;color:var(--mat-sys-on-surface-variant);margin:0 4px}.graph-header[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:13px;color:var(--mat-sys-on-surface-variant);background-color:var(--mat-sys-surface-container-lowest);padding:8px 16px;border-bottom:1px solid var(--mat-sys-outline-variant)}.graph-header[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-weight:500;margin-right:8px;color:var(--mat-sys-on-surface)}.event-graph-container[_ngcontent-%COMP%]{flex:1;overflow:hidden;padding:16px;position:relative}.fullscreen-graph-button[_ngcontent-%COMP%]{position:absolute;top:4px;right:4px;z-index:10;width:48px!important;height:48px!important;padding:0!important;display:flex!important;justify-content:center!important;align-items:center!important}.fullscreen-graph-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:28px!important;width:28px!important;height:28px!important;line-height:28px!important;margin:0!important;padding:0!important}.event-graph-container[_ngcontent-%COMP%] .svg-graph-wrapper[_ngcontent-%COMP%]{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.event-graph-container[_ngcontent-%COMP%] svg{max-width:100%;max-height:100%;width:auto;height:auto;display:block}.event-graph-container[_ngcontent-%COMP%] svg>g.graph>polygon:first-child{fill:transparent!important}.request-response-loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em}.request-response-empty-state[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em;font-style:italic}.id-text[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:12px}.id-cell[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;overflow:hidden}.id-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child, .value-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.id-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .id-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%]{opacity:1}.numeric-cell[_ngcontent-%COMP%]{text-align:right!important}.value-cell.numeric-cell[_ngcontent-%COMP%]{justify-content:flex-end}.value-cell.numeric-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{text-align:right;font-family:Google Sans Mono,monospace;font-size:13px;font-weight:500;color:var(--mat-sys-on-surface)}.value-cell.numeric-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child span[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}td.numeric-cell[_ngcontent-%COMP%]{text-align:right!important;font-family:Google Sans Mono,monospace!important;font-size:13px!important;font-weight:500!important;color:var(--mat-sys-on-surface)!important}.detail-row[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center;gap:8px;margin-bottom:4px;font-size:12px;transition:transform .15s ease-in-out}.detail-row[_ngcontent-%COMP%]:hover{transform:translate(-2px)}.detail-row[_ngcontent-%COMP%]:last-child{margin-bottom:0}.detail-row[_ngcontent-%COMP%] .modality-label[_ngcontent-%COMP%]{font-size:10px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;padding:2px 6px;border-radius:4px;color:var(--mat-sys-primary);background-color:var(--mat-sys-primary-container);opacity:.85}.detail-row[_ngcontent-%COMP%] .modality-value[_ngcontent-%COMP%]{font-weight:500;font-family:Google Sans Mono,monospace;color:var(--mat-sys-on-surface)}.copy-id-button[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%]{width:28px!important;height:28px!important;padding:0!important;line-height:28px!important;flex-shrink:0;margin:-4px 0!important;opacity:0;transition:opacity .2s ease-in-out;border-radius:4px!important;overflow:hidden!important}.copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.copy-id-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.info-tables-container[_ngcontent-%COMP%]{padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:24px}.invocation-selector-button[_ngcontent-%COMP%] .mdc-button__label{width:100%;flex:1;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;justify-content:space-between}.media-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;margin-top:8px;margin-bottom:12px}.generated-image-container[_ngcontent-%COMP%]{max-width:100%;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a;border:1px solid var(--mat-sys-outline-variant)}.generated-image-container[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:100%;height:auto;display:block}audio[_ngcontent-%COMP%], video[_ngcontent-%COMP%]{max-width:100%;border-radius:4px}.json-viewer-wrapper[_ngcontent-%COMP%]{position:relative}.json-viewer-wrapper[_ngcontent-%COMP%]:hover .floating-copy-button[_ngcontent-%COMP%]{opacity:1}.floating-copy-button[_ngcontent-%COMP%]{position:absolute;top:4px;right:4px;z-index:10;opacity:0;transition:opacity .2s ease-in-out;background-color:var(--mat-sys-surface-container-high)!important;border-radius:4px!important;overflow:hidden!important;width:28px!important;height:28px!important;line-height:28px!important;padding:0!important}.floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.floating-copy-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.floating-copy-button[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.state-change-card[_ngcontent-%COMP%]{border-radius:8px;padding:10px;display:flex;flex-direction:column;gap:8px}.state-change-header[_ngcontent-%COMP%]{font-weight:600;font-size:14px;color:var(--mat-sys-primary);padding-bottom:4px}.state-change-values[_ngcontent-%COMP%]{display:flex;gap:12px;flex-wrap:wrap}.state-value-block[_ngcontent-%COMP%]{flex:1;min-width:200px;background-color:var(--mat-sys-surface-container-highest);border-radius:6px;padding:8px;display:flex;flex-direction:column;gap:4px}.state-value-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;color:var(--mat-sys-on-surface-variant)}.state-value-content[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:13px;color:var(--mat-sys-on-surface);word-break:break-all}"],changeDetection:0})};var Y7A=["evalTabContainer"];function H7A(i,e){}function z7A(i,e){i&1&&(I(0,"div",1),lA(1,"mat-progress-spinner",4),h())}function P7A(i,e){if(i&1&&(I(0,"span",11),D(1),h()),i&2){let A=p(2);Q(),nA(A.i18n.infoTabLabel)}}function j7A(i,e){if(i&1){let A=aA();I(0,"app-trace-tab",12),U("switchToEvent",function(n){L(A);let o=p(2);return G(o.switchToEvent.emit(n))}),h()}if(i&2){let A=p(2);H("traceData",A.traceData())}}function V7A(i,e){if(i&1){let A=aA();I(0,"app-event-tab",13),U("page",function(n){L(A);let o=p(2);return G(o.page.emit(n))})("closeSelectedEvent",function(){L(A);let n=p(2);return G(n.closeSelectedEvent.emit())})("openImageDialog",function(n){L(A);let o=p(2);return G(o.openImageDialog.emit(n))})("switchToTraceView",function(){L(A);let n=p(2);return G(n.switchToTraceView.emit())})("showAgentStructureGraph",function(n){L(A);let o=p(2);return G(o.showAgentStructureGraph.emit(n))})("drillDownNodePath",function(n){L(A);let o=p(2);return G(o.drillDownNodePath.emit(n))})("selectEventById",function(n){L(A);let o=p(2);return G(o.selectEventById.emit(n))})("jumpToInvocation",function(n){L(A);let o=p(2);return G(o.jumpToInvocation.emit(n))}),h()}if(i&2){let A=p(2);H("eventDataSize",A.eventData().size)("eventDataMap",A.eventData())("selectedEventIndex",A.selectedEventIndex())("selectedEvent",A.selectedEvent())("traceData",A.traceData())("filteredSelectedEvent",A.filteredSelectedEvent())("renderedEventGraph",A.renderedEventGraph())("rawSvgString",A.rawSvgString())("appName",A.appName())("selectedEventGraphPath",A.selectedEventGraphPath())("llmRequest",A.llmRequest())("llmResponse",A.llmResponse())("hasSubWorkflows",A.hasSubWorkflows())("graphsAvailable",A.graphsAvailable())("invocationDisplayMap",A.invocationDisplayMap())("forceGraphTab",A.forceGraphTab())("isViewOnlySession",A.isViewOnlySession())("isViewOnlyAppNameMismatch",A.isViewOnlyAppNameMismatch())}}function q7A(i,e){i&1&&(I(0,"div",9),D(1,"Select an event or trace span to view details"),h())}function W7A(i,e){if(i&1&&(I(0,"span",11),D(1),h()),i&2){let A=p(2);Q(),nA(A.i18n.stateTabLabel)}}function Z7A(i,e){if(i&1&&(I(0,"span",11),D(1),h()),i&2){let A=p(3);Q(),nA(A.i18n.artifactsTabLabel)}}function X7A(i,e){if(i&1&&(I(0,"mat-tab"),kt(1,Z7A,2,1,"ng-template",6),lA(2,"app-artifact-tab",14),h()),i&2){let A=p(2);Q(2),H("artifacts",A.artifacts())}}function $7A(i,e){if(i&1&&(I(0,"span",11),D(1),h()),i&2){let A=p(3);Q(),nA(A.i18n.testsTabLabel)}}function AMA(i,e){if(i&1){let A=aA();I(0,"mat-tab"),kt(1,$7A,2,1,"ng-template",6),I(2,"app-tests-tab",15),U("testSelected",function(n){L(A);let o=p(2);return G(o.testSelected.emit(n))}),h()()}if(i&2){let A=p(2);Q(2),H("appName",A.appName())("sessionId",A.sessionId())("userId",A.userId())("isViewOnlySession",A.isViewOnlySession())}}function eMA(i,e){if(i&1&&(I(0,"span",11),D(1),h()),i&2){let A=p(3);Q(),nA(A.i18n.evalTabLabel)}}function tMA(i,e){i&1&&(I(0,"mat-tab"),kt(1,eMA,2,1,"ng-template",6),dn(2,null,0),h())}function iMA(i,e){if(i&1){let A=aA();I(0,"div",2)(1,"mat-tab-group",5),Ni("selectedIndexChange",function(n){L(A);let o=p();return wi(o.selectedIndex,n)||(o.selectedIndex=n),G(n)}),U("selectedTabChange",function(n){L(A);let o=p();return G(o.onTabChange(n))}),I(2,"mat-tab"),kt(3,P7A,2,1,"ng-template",6),T(4,j7A,1,1,"app-trace-tab",7)(5,V7A,1,18,"app-event-tab",8)(6,q7A,2,0,"div",9),h(),I(7,"mat-tab"),kt(8,W7A,2,1,"ng-template",6),lA(9,"app-state-tab",10),h(),T(10,X7A,3,1,"mat-tab"),mt(11,"async"),T(12,AMA,3,4,"mat-tab"),mt(13,"async"),T(14,tMA,4,0,"mat-tab"),mt(15,"async"),h()()}if(i&2){let A=p(),t=Ki(2);H("hidden",t||!A.showSidePanel()),Q(),Ri("selectedIndex",A.selectedIndex),Q(3),O(A.selectedSpan()?4:A.selectedEvent()?5:6),Q(5),H("sessionState",A.currentSessionState()),Q(),O(Ft(11,7,A.isArtifactsTabEnabledObs)?10:-1),Q(2),O(Ft(13,9,A.isTestsEnabledObs)?12:-1),Q(2),O(Ft(15,11,A.isEvalEnabledObs)?14:-1)}}var xE=class i{Object=Object;appName=ve("");userId=ve("");sessionId=ve("");traceData=ve([]);eventData=ve(new Map);currentSessionState=ve();artifacts=ve([]);selectedEvent=ve();selectedEventIndex=ve();renderedEventGraph=ve();rawSvgString=ve(null);selectedEventGraphPath=ve("");llmRequest=ve();llmResponse=ve();showSidePanel=ve(!1);isApplicationSelectorEnabledObs=ve(oe(!1));isBuilderMode=ve(!1);disableBuilderIcon=ve(!1);hasSubWorkflows=ve(!1);graphsAvailable=ve(!0);invocationDisplayMap=ve(new Map);forceGraphTab=ve(!1);isViewOnlySession=ve(!1);isViewOnlyAppNameMismatch=ve(!1);closePanel=Si();tabChange=Si();sessionSelected=Si();sessionReloaded=Si();evalCaseSelected=Si();editEvalCaseRequested=Si();testSelected=Si();evalSetIdSelected=Si();returnToSession=Si();evalNotInstalled=Si();page=Si();switchToEvent=Si();closeSelectedEvent=Si();openImageDialog=Si();openAddItemDialog=Si();enterBuilderMode=Si();showAgentStructureGraph=Si();switchToTraceView=Si();drillDownNodePath=Si();selectEventById=Si();jumpToInvocation=Si();sessionTabComponent=void 0;evalTabComponent=Yo(Sc);evalTabContainer=Yo("evalTabContainer",{read:Jo});tabGroup=Yo(fE);logoComponent=w(wB,{optional:!0});i18n=w(_E);featureFlagService=w(Nr);evalTabComponentClass=w(My,{optional:!0});environmentInjector=w(Hr);uiStateService=w(ag);traceService=w(ng);selectedSpan=sr(this.traceService.selectedTraceRow$);selectedIndex=0;pendingEvalCaseSelection=mA(void 0);pendingEvalResultSelection=mA(void 0);evalTabRef=mA(null);constructor(){Fn(()=>{let e=this.selectedEvent(),A=this.selectedSpan(),t=this.tabGroup();(e||A)&&t&&t.selectedIndex!==0&&(this.selectedIndex=0)}),Fn(()=>{this.evalTabContainer()?this.initEvalTab():this.evalTabRef.set(null)}),Fn(()=>{let e=this.evalTabRef();e&&(e.setInput("appName",this.appName()),e.setInput("userId",this.userId()),e.setInput("sessionId",this.sessionId()))}),Fn(()=>{let e=this.evalTabRef(),A=this.pendingEvalCaseSelection();e&&A&&(e.instance.selectEvalSet(A.evalSetId),e.instance.selectedEvalTab.set("cases"),e.instance.selectedEvalCase.set(A.evalCase),this.pendingEvalCaseSelection.set(void 0))}),Fn(()=>{let e=this.evalTabRef(),A=this.pendingEvalResultSelection();e&&A&&(e.instance.selectEvalSet(A.evalSetId),e.instance.selectedHistoryRun.set(A.timestamp),A.evalCase?(e.instance.selectedEvalTab.set("cases"),e.instance.selectedEvalCase.set(A.evalCase)):e.instance.selectedEvalTab.set("history"),this.pendingEvalResultSelection.set(void 0))})}ngOnInit(){}onTabChange(e){this.tabChange.emit(e),this.selectedIndex=e.index}switchToEvalTab(){this.isEvalEnabledObs.pipe(oo()).subscribe(e=>{e&&JC([this.isArtifactsTabEnabledObs.pipe(oo()),this.isTestsEnabledObs.pipe(oo())]).subscribe(([A,t])=>{let n=2;A&&n++,t&&n++,this.selectedIndex=n})})}selectEvalCase(e,A){let t=this.evalTabComponent();t?(t.selectEvalSet(e),t.selectedEvalTab.set("cases"),t.selectedEvalCase.set(A)):this.pendingEvalCaseSelection.set({evalSetId:e,evalCase:A})}selectEvalResult(e,A,t){let n=this.evalTabComponent();n?(n.selectEvalSet(e),n.selectedHistoryRun.set(A),t?(n.selectedEvalTab.set("cases"),n.selectedEvalCase.set(t)):n.selectedEvalTab.set("history")):this.pendingEvalResultSelection.set({evalSetId:e,timestamp:A,evalCase:t})}isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();isTraceEnabledObs=this.featureFlagService.isTraceEnabled();isArtifactsTabEnabledObs=this.featureFlagService.isArtifactsTabEnabled();isEvalEnabledObs=this.featureFlagService.isEvalEnabled();isTestsEnabledObs=this.featureFlagService.isTestsEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled;filteredSelectedEvent=ye(()=>this.selectedEvent());ngAfterViewInit(){}initEvalTab(){this.isEvalEnabledObs.pipe(oo()).subscribe(e=>{if(e){let A=this.evalTabContainer();if(!A)return;A.clear();let t=A.createComponent(this.evalTabComponentClass??Sc,{environmentInjector:this.environmentInjector});if(!t)return;t.instance.sessionSelected.subscribe(n=>{this.sessionSelected.emit(n)}),t.instance.evalCaseSelected.subscribe(n=>{this.evalCaseSelected.emit(n)}),t.instance.editEvalCaseRequested.subscribe(n=>{this.editEvalCaseRequested.emit(n)}),t.instance.evalSetIdSelected.subscribe(n=>{this.evalSetIdSelected.emit(n)}),t.instance.shouldReturnToSession.subscribe(n=>{this.returnToSession.emit(n)}),t.instance.evalNotInstalledMsg.subscribe(n=>{this.evalNotInstalled.emit(n)}),this.evalTabRef.set(t)}})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-side-panel"]],viewQuery:function(A,t){A&1&&ls(t.evalTabComponent,Sc,5)(t.evalTabContainer,Y7A,5,Jo)(t.tabGroup,fE,5),A&2&&br(3)},inputs:{appName:[1,"appName"],userId:[1,"userId"],sessionId:[1,"sessionId"],traceData:[1,"traceData"],eventData:[1,"eventData"],currentSessionState:[1,"currentSessionState"],artifacts:[1,"artifacts"],selectedEvent:[1,"selectedEvent"],selectedEventIndex:[1,"selectedEventIndex"],renderedEventGraph:[1,"renderedEventGraph"],rawSvgString:[1,"rawSvgString"],selectedEventGraphPath:[1,"selectedEventGraphPath"],llmRequest:[1,"llmRequest"],llmResponse:[1,"llmResponse"],showSidePanel:[1,"showSidePanel"],isApplicationSelectorEnabledObs:[1,"isApplicationSelectorEnabledObs"],isBuilderMode:[1,"isBuilderMode"],disableBuilderIcon:[1,"disableBuilderIcon"],hasSubWorkflows:[1,"hasSubWorkflows"],graphsAvailable:[1,"graphsAvailable"],invocationDisplayMap:[1,"invocationDisplayMap"],forceGraphTab:[1,"forceGraphTab"],isViewOnlySession:[1,"isViewOnlySession"],isViewOnlyAppNameMismatch:[1,"isViewOnlyAppNameMismatch"]},outputs:{closePanel:"closePanel",tabChange:"tabChange",sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded",evalCaseSelected:"evalCaseSelected",editEvalCaseRequested:"editEvalCaseRequested",testSelected:"testSelected",evalSetIdSelected:"evalSetIdSelected",returnToSession:"returnToSession",evalNotInstalled:"evalNotInstalled",page:"page",switchToEvent:"switchToEvent",closeSelectedEvent:"closeSelectedEvent",openImageDialog:"openImageDialog",openAddItemDialog:"openAddItemDialog",enterBuilderMode:"enterBuilderMode",showAgentStructureGraph:"showAgentStructureGraph",switchToTraceView:"switchToTraceView",drillDownNodePath:"drillDownNodePath",selectEventById:"selectEventById",jumpToInvocation:"jumpToInvocation"},decls:7,vars:8,consts:[["evalTabContainer",""],[1,"loading-spinner-container"],[1,"tabs-container",3,"hidden"],[1,"resize-handler"],["mode","indeterminate","diameter","50"],["animationDuration","0ms",3,"selectedIndexChange","selectedTabChange","selectedIndex"],["mat-tab-label",""],[3,"traceData"],[3,"eventDataSize","eventDataMap","selectedEventIndex","selectedEvent","traceData","filteredSelectedEvent","renderedEventGraph","rawSvgString","appName","selectedEventGraphPath","llmRequest","llmResponse","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab","isViewOnlySession","isViewOnlyAppNameMismatch"],[1,"empty-state"],[3,"sessionState"],[1,"tab-label"],[3,"switchToEvent","traceData"],[3,"page","closeSelectedEvent","openImageDialog","switchToTraceView","showAgentStructureGraph","drillDownNodePath","selectEventById","jumpToInvocation","eventDataSize","eventDataMap","selectedEventIndex","selectedEvent","traceData","filteredSelectedEvent","renderedEventGraph","rawSvgString","appName","selectedEventGraphPath","llmRequest","llmResponse","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab","isViewOnlySession","isViewOnlyAppNameMismatch"],[3,"artifacts"],[3,"testSelected","appName","sessionId","userId","isViewOnlySession"]],template:function(A,t){if(A&1&&(T(0,H7A,0,0),mt(1,"async"),ro(2),mt(3,"async"),T(4,z7A,2,0,"div",1),T(5,iMA,16,13,"div",2),lA(6,"div",3)),A&2){O(Ft(1,3,t.isAlwaysOnSidePanelEnabledObs)===!1?0:-1),Q(2);let n=so(Ft(3,5,t.uiStateService.isSessionLoading()));Q(2),O(n?4:-1),Q(),O(t.appName()!=""?5:-1)}},dependencies:[fE,bp,vp,xy,_y,d6,Ry,Es,ky,gs],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;position:relative}.drawer-header-wrapper[_ngcontent-%COMP%]{display:flex;height:48px;align-items:center;padding-left:20px}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center}.tabs-container[_ngcontent-%COMP%]{width:100%;flex:1;overflow:hidden;display:flex;flex-direction:column}.tab-label[_ngcontent-%COMP%]{font-size:14px}.resize-handler[_ngcontent-%COMP%]{width:6px;border-radius:4px;position:absolute;display:block;top:20px;bottom:20px;right:0;z-index:100;cursor:ew-resize}.resize-handler[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-outline-variant)}.empty-state[_ngcontent-%COMP%]{padding:16px;text-align:center;color:var(--mat-sys-on-surface-variant);font-style:italic}mat-tab-group[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;min-height:0}mat-tab-group[_ngcontent-%COMP%] .mdc-tab{padding:0 12px;min-width:48px} .mat-mdc-tab-body-wrapper{flex:1;min-height:0} .mat-mdc-tab-body-wrapper .mat-mdc-tab-body-content{overflow-x:hidden}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:6px}.drawer-logo[_ngcontent-%COMP%]{font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.1px}.drawer-header-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.panel-toggle-icon[_ngcontent-%COMP%]{font-size:20px;width:24px;height:24px;color:var(--side-panel-mat-icon-color, #c4c7c5);cursor:pointer;display:flex;align-items:center;justify-content:center}.powered-by-adk[_ngcontent-%COMP%]{font-size:10px;color:var(--side-panel-powered-by-adk-color);text-align:right;margin-top:-5px}.adk-info-icon[_ngcontent-%COMP%]{font-size:14px;color:var(--side-panel-mat-icon-color, #bdc1c6);cursor:pointer;margin-left:4px;vertical-align:middle}.mode-toggle-container[_ngcontent-%COMP%]{display:flex;align-items:center}.build-mode-button[_ngcontent-%COMP%]{margin:0 4px}.app-actions[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}@media(max-width:768px){.resize-handler[_ngcontent-%COMP%]{display:none!important}.tab-label[_ngcontent-%COMP%]{font-size:12px!important} .mdc-tab{padding:0 8px!important}}"]})};var nMA=["editInput"];function oMA(i,e){if(i&1){let A=aA();I(0,"button",5),U("click",function(){L(A);let n=p();return G(n.startEdit())}),I(1,"mat-icon"),D(2,"edit"),h()()}}function aMA(i,e){if(i&1){let A=aA();I(0,"button",6),U("click",function(){L(A);let n=p();return G(n.saveEdit())}),I(1,"mat-icon"),D(2,"check"),h()(),I(3,"button",7),U("click",function(){L(A);let n=p();return G(n.cancelEdit())}),I(4,"mat-icon"),D(5,"close"),h()()}}var Ny=class i{value="";displayValue="";tooltip="";placeholder="";textClass="";save=new FA;isEditing=!1;draftValue="";editInput;startEdit(){this.draftValue=this.value,this.isEditing=!0,setTimeout(()=>{this.editInput.nativeElement.focus()})}cancelEdit(){this.isEditing=!1,this.draftValue=""}saveEdit(){this.save.emit(this.draftValue),this.isEditing=!1}handleKeydown(e){e.key==="Enter"?this.saveEdit():e.key==="Escape"&&this.cancelEdit()}get effectiveDisplayValue(){return this.displayValue||this.value}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-inline-edit"]],viewQuery:function(A,t){if(A&1&&Wt(nMA,5),A&2){let n;se(n=le())&&(t.editInput=n.first)}},inputs:{value:"value",displayValue:"displayValue",tooltip:"tooltip",placeholder:"placeholder",textClass:"textClass"},outputs:{save:"save"},decls:6,vars:10,consts:[["editInput",""],[1,"inline-edit-container"],[1,"inline-edit-text-wrapper"],[1,"inline-edit-input",3,"ngModelChange","keydown","readonly","ngClass","matTooltip","ngModel"],["mat-icon-button","","aria-label","Edit",1,"inline-edit-action-button"],["mat-icon-button","","aria-label","Edit",1,"inline-edit-action-button",3,"click"],["mat-icon-button","","aria-label","Save",1,"inline-edit-action-button",3,"click"],["mat-icon-button","","aria-label","Cancel",1,"inline-edit-action-button",3,"click"]],template:function(A,t){A&1&&(I(0,"div",1)(1,"div",2)(2,"input",3,0),U("ngModelChange",function(o){return t.draftValue=o})("keydown",function(o){return t.handleKeydown(o)}),h()(),T(4,oMA,3,0,"button",4)(5,aMA,6,0),h()),A&2&&(Q(2),_A("readonly",!t.isEditing),H("readonly",!t.isEditing)("ngClass",t.textClass)("matTooltip",t.isEditing?"":t.tooltip)("ngModel",t.isEditing?t.draftValue:t.effectiveDisplayValue),ie("placeholder",t.isEditing?t.placeholder:"")("aria-label",t.placeholder)("size",((t.isEditing?t.draftValue:t.effectiveDisplayValue)==null?null:(t.isEditing?t.draftValue:t.effectiveDisplayValue).length)||1),Q(2),O(t.isEditing?5:4))},dependencies:[li,Vl,fn,Gn,Kn,Ho,qi,yi,Un,zt,Ha,rn],styles:["[_nghost-%COMP%]{display:block;max-width:100%;min-width:0;width:100%}.inline-edit-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;max-width:100%;min-width:0;box-sizing:border-box}.inline-edit-text-wrapper[_ngcontent-%COMP%]{flex:0 1 auto;min-width:0;display:flex;align-items:center}.inline-edit-input[_ngcontent-%COMP%]{min-width:48px;max-width:100%;padding:2px 6px;margin:-3px -7px;border:1px solid var(--chat-toolbar-session-text-color, #ccc);border-radius:4px;color:var(--chat-toolbar-session-id-color, inherit);font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;background:transparent;field-sizing:content;transition:all .2s ease}.inline-edit-input[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--primary-color, #1a73e8)}.inline-edit-input.readonly[_ngcontent-%COMP%]{min-width:0;border-color:transparent;cursor:inherit}.inline-edit-input.readonly[_ngcontent-%COMP%]:focus{outline:none;border-color:transparent}.inline-edit-action-button[_ngcontent-%COMP%]{flex-shrink:0;width:28px!important;height:28px!important;padding:0!important;display:flex;align-items:center;justify-content:center}.inline-edit-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}"]})};var rMA={openPanelTooltip:"Open panel",retrieveLatestSessionTooltip:"Retrieve latest session and show",evalCaseIdLabel:"Eval Case ID",cancelButton:"Cancel",saveButton:"Save",editEvalCaseTooltip:"Edit current eval case",deleteEvalCaseTooltip:"Delete current eval case",sessionIdLabel:"Session",copySessionIdTooltip:"Copy session ID",sessionIdCopiedMessage:"Session ID copied",copySessionIdFailedMessage:"Failed to copy session ID",userIdLabel:"User ID",editUserIdTooltip:"Edit user ID",userIdInputPlaceholder:"Enter user ID",saveUserIdTooltip:"Save user ID",cancelUserIdEditTooltip:"Cancel editing user ID",invalidUserIdMessage:"User ID cannot be empty",loadingSessionLabel:"Loading session...",tokenStreamingLabel:"Token Streaming",moreOptionsTooltip:"More options",createNewSessionTooltip:"Create a new Session",newSessionButton:"New Session",deleteSessionTooltip:"Delete session",exportSessionTooltip:"Export session",importSessionTooltip:"Import session",viewSessionTooltip:"View session",loadingAgentsLabel:"Loading agents, please wait...",welcomeMessage:"Welcome to ADK!",selectAgentMessage:"Select an agent to begin.",failedToLoadAgentsMessage:"Failed to load agents. To get started, run",errorMessageLabel:"Error message:",noAgentsFoundWarning:"Warning: No agents found in current folder.",cannotEditSessionMessage:"Chat is disabled to prevent changes to the end user's session.",viewSessionReadOnlyMessage:'This is a read-only view of a session file. Use "Import Session" if you want to continue this session.',readOnlyBadgeLabel:"Read-only"},h$=new MA("Chat Messages",{factory:()=>rMA});var XA={};cAA(XA,{BRAND:()=>RMA,DIRTY:()=>II,EMPTY_PATH:()=>cMA,INVALID:()=>hi,NEVER:()=>E9A,OK:()=>Ss,ParseStatus:()=>rs,Schema:()=>hn,ZodAny:()=>Gy,ZodArray:()=>Gp,ZodBigInt:()=>GR,ZodBoolean:()=>KR,ZodBranded:()=>Kp,ZodCatch:()=>VR,ZodDate:()=>UR,ZodDefault:()=>jR,ZodDiscriminatedUnion:()=>Ky,ZodEffects:()=>KE,ZodEnum:()=>Jy,ZodError:()=>x0,ZodFirstPartyTypeKind:()=>_i,ZodFunction:()=>Ty,ZodIntersection:()=>YR,ZodIssueCode:()=>Ne,ZodLazy:()=>HR,ZodLiteral:()=>zR,ZodMap:()=>v$,ZodNaN:()=>S$,ZodNativeEnum:()=>PR,ZodNever:()=>BI,ZodNull:()=>OR,ZodNullable:()=>UE,ZodNumber:()=>LR,ZodObject:()=>LE,ZodOptional:()=>f1,ZodParsedType:()=>ht,ZodPipeline:()=>Up,ZodPromise:()=>Yy,ZodReadonly:()=>qR,ZodRecord:()=>Uy,ZodSchema:()=>hn,ZodSet:()=>b$,ZodString:()=>Oy,ZodSymbol:()=>y$,ZodTransformer:()=>KE,ZodTuple:()=>GE,ZodType:()=>hn,ZodUndefined:()=>TR,ZodUnion:()=>JR,ZodUnknown:()=>Lp,ZodVoid:()=>D$,addIssueToContext:()=>ot,any:()=>JMA,array:()=>PMA,bigint:()=>GMA,boolean:()=>R$,coerce:()=>h9A,custom:()=>k$,date:()=>KMA,datetimeRegex:()=>w$,defaultErrorMap:()=>TC,discriminatedUnion:()=>WMA,effect:()=>s9A,enum:()=>o9A,function:()=>t9A,getErrorMap:()=>RE,getParsedType:()=>_0,instanceof:()=>FMA,intersection:()=>ZMA,isAborted:()=>Fy,isAsync:()=>NE,isDirty:()=>Ly,isValid:()=>p1,late:()=>NMA,lazy:()=>i9A,literal:()=>n9A,makeIssue:()=>Fp,map:()=>A9A,nan:()=>LMA,nativeEnum:()=>a9A,never:()=>HMA,null:()=>OMA,nullable:()=>g9A,number:()=>x$,object:()=>jMA,objectUtil:()=>E$,oboolean:()=>B9A,onumber:()=>I9A,optional:()=>l9A,ostring:()=>d9A,pipeline:()=>C9A,preprocess:()=>c9A,promise:()=>r9A,quotelessJson:()=>sMA,record:()=>$MA,set:()=>e9A,setErrorMap:()=>gMA,strictObject:()=>VMA,string:()=>_$,symbol:()=>UMA,transformer:()=>s9A,tuple:()=>XMA,undefined:()=>TMA,union:()=>qMA,unknown:()=>YMA,util:()=>Mn,void:()=>zMA});var Mn;(function(i){i.assertEqual=n=>{};function e(n){}i.assertIs=e;function A(n){throw new Error}i.assertNever=A,i.arrayToEnum=n=>{let o={};for(let a of n)o[a]=a;return o},i.getValidEnumValues=n=>{let o=i.objectKeys(n).filter(r=>typeof n[n[r]]!="number"),a={};for(let r of o)a[r]=n[r];return i.objectValues(a)},i.objectValues=n=>i.objectKeys(n).map(function(o){return n[o]}),i.objectKeys=typeof Object.keys=="function"?n=>Object.keys(n):n=>{let o=[];for(let a in n)Object.prototype.hasOwnProperty.call(n,a)&&o.push(a);return o},i.find=(n,o)=>{for(let a of n)if(o(a))return a},i.isInteger=typeof Number.isInteger=="function"?n=>Number.isInteger(n):n=>typeof n=="number"&&Number.isFinite(n)&&Math.floor(n)===n;function t(n,o=" | "){return n.map(a=>typeof a=="string"?`'${a}'`:a).join(o)}i.joinValues=t,i.jsonStringifyReplacer=(n,o)=>typeof o=="bigint"?o.toString():o})(Mn||(Mn={}));var E$=(function(i){return i.mergeShapes=(e,A)=>P(P({},e),A),i})(E$||{}),ht=Mn.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),_0=i=>{switch(typeof i){case"undefined":return ht.undefined;case"string":return ht.string;case"number":return Number.isNaN(i)?ht.nan:ht.number;case"boolean":return ht.boolean;case"function":return ht.function;case"bigint":return ht.bigint;case"symbol":return ht.symbol;case"object":return Array.isArray(i)?ht.array:i===null?ht.null:i.then&&typeof i.then=="function"&&i.catch&&typeof i.catch=="function"?ht.promise:typeof Map<"u"&&i instanceof Map?ht.map:typeof Set<"u"&&i instanceof Set?ht.set:typeof Date<"u"&&i instanceof Date?ht.date:ht.object;default:return ht.unknown}};var Ne=Mn.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),sMA=i=>JSON.stringify(i,null,2).replace(/"([^"]+)":/g,"$1:"),x0=(()=>{class i extends Error{get errors(){return this.issues}constructor(A){super(),this.issues=[],this.addIssue=n=>{this.issues=[...this.issues,n]},this.addIssues=(n=[])=>{this.issues=[...this.issues,...n]};let t=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,t):this.__proto__=t,this.name="ZodError",this.issues=A}format(A){let t=A||function(a){return a.message},n={_errors:[]},o=a=>{for(let r of a.issues)if(r.code==="invalid_union")r.unionErrors.map(o);else if(r.code==="invalid_return_type")o(r.returnTypeError);else if(r.code==="invalid_arguments")o(r.argumentsError);else if(r.path.length===0)n._errors.push(t(r));else{let s=n,l=0;for(;lt.message){let t={},n=[];for(let o of this.issues)if(o.path.length>0){let a=o.path[0];t[a]=t[a]||[],t[a].push(A(o))}else n.push(A(o));return{formErrors:n,fieldErrors:t}}get formErrors(){return this.flatten()}}return i.create=e=>new i(e),i})();var lMA=(i,e)=>{let A;switch(i.code){case Ne.invalid_type:i.received===ht.undefined?A="Required":A=`Expected ${i.expected}, received ${i.received}`;break;case Ne.invalid_literal:A=`Invalid literal value, expected ${JSON.stringify(i.expected,Mn.jsonStringifyReplacer)}`;break;case Ne.unrecognized_keys:A=`Unrecognized key(s) in object: ${Mn.joinValues(i.keys,", ")}`;break;case Ne.invalid_union:A="Invalid input";break;case Ne.invalid_union_discriminator:A=`Invalid discriminator value. Expected ${Mn.joinValues(i.options)}`;break;case Ne.invalid_enum_value:A=`Invalid enum value. Expected ${Mn.joinValues(i.options)}, received '${i.received}'`;break;case Ne.invalid_arguments:A="Invalid function arguments";break;case Ne.invalid_return_type:A="Invalid function return type";break;case Ne.invalid_date:A="Invalid date";break;case Ne.invalid_string:typeof i.validation=="object"?"includes"in i.validation?(A=`Invalid input: must include "${i.validation.includes}"`,typeof i.validation.position=="number"&&(A=`${A} at one or more positions greater than or equal to ${i.validation.position}`)):"startsWith"in i.validation?A=`Invalid input: must start with "${i.validation.startsWith}"`:"endsWith"in i.validation?A=`Invalid input: must end with "${i.validation.endsWith}"`:Mn.assertNever(i.validation):i.validation!=="regex"?A=`Invalid ${i.validation}`:A="Invalid";break;case Ne.too_small:i.type==="array"?A=`Array must contain ${i.exact?"exactly":i.inclusive?"at least":"more than"} ${i.minimum} element(s)`:i.type==="string"?A=`String must contain ${i.exact?"exactly":i.inclusive?"at least":"over"} ${i.minimum} character(s)`:i.type==="number"?A=`Number must be ${i.exact?"exactly equal to ":i.inclusive?"greater than or equal to ":"greater than "}${i.minimum}`:i.type==="bigint"?A=`Number must be ${i.exact?"exactly equal to ":i.inclusive?"greater than or equal to ":"greater than "}${i.minimum}`:i.type==="date"?A=`Date must be ${i.exact?"exactly equal to ":i.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(i.minimum))}`:A="Invalid input";break;case Ne.too_big:i.type==="array"?A=`Array must contain ${i.exact?"exactly":i.inclusive?"at most":"less than"} ${i.maximum} element(s)`:i.type==="string"?A=`String must contain ${i.exact?"exactly":i.inclusive?"at most":"under"} ${i.maximum} character(s)`:i.type==="number"?A=`Number must be ${i.exact?"exactly":i.inclusive?"less than or equal to":"less than"} ${i.maximum}`:i.type==="bigint"?A=`BigInt must be ${i.exact?"exactly":i.inclusive?"less than or equal to":"less than"} ${i.maximum}`:i.type==="date"?A=`Date must be ${i.exact?"exactly":i.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(i.maximum))}`:A="Invalid input";break;case Ne.custom:A="Invalid input";break;case Ne.invalid_intersection_types:A="Intersection results could not be merged";break;case Ne.not_multiple_of:A=`Number must be a multiple of ${i.multipleOf}`;break;case Ne.not_finite:A="Number must be finite";break;default:A=e.defaultError,Mn.assertNever(i)}return{message:A}},TC=lMA;var Q$=TC;function gMA(i){Q$=i}function RE(){return Q$}var Fp=i=>{let{data:e,path:A,errorMaps:t,issueData:n}=i,o=[...A,...n.path||[]],a=$A(P({},n),{path:o});if(n.message!==void 0)return $A(P({},n),{path:o,message:n.message});let r="",s=t.filter(l=>!!l).slice().reverse();for(let l of s)r=l(a,{data:e,defaultError:r}).message;return $A(P({},n),{path:o,message:r})},cMA=[];function ot(i,e){let A=RE(),t=Fp({issueData:e,data:i.data,path:i.path,errorMaps:[i.common.contextualErrorMap,i.schemaErrorMap,A,A===TC?void 0:TC].filter(n=>!!n)});i.common.issues.push(t)}var rs=class i{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(e,A){let t=[];for(let n of A){if(n.status==="aborted")return hi;n.status==="dirty"&&e.dirty(),t.push(n.value)}return{status:e.value,value:t}}static mergeObjectAsync(e,A){return re(this,null,function*(){let t=[];for(let n of A){let o=yield n.key,a=yield n.value;t.push({key:o,value:a})}return i.mergeObjectSync(e,t)})}static mergeObjectSync(e,A){let t={};for(let n of A){let{key:o,value:a}=n;if(o.status==="aborted"||a.status==="aborted")return hi;o.status==="dirty"&&e.dirty(),a.status==="dirty"&&e.dirty(),o.value!=="__proto__"&&(typeof a.value<"u"||n.alwaysSet)&&(t[o.value]=a.value)}return{status:e.value,value:t}}},hi=Object.freeze({status:"aborted"}),II=i=>({status:"dirty",value:i}),Ss=i=>({status:"valid",value:i}),Fy=i=>i.status==="aborted",Ly=i=>i.status==="dirty",p1=i=>i.status==="valid",NE=i=>typeof Promise<"u"&&i instanceof Promise;var Kt=(function(i){return i.errToObj=e=>typeof e=="string"?{message:e}:e||{},i.toString=e=>typeof e=="string"?e:e?.message,i})(Kt||{});var Mg=class{constructor(e,A,t,n){this._cachedPath=[],this.parent=e,this.data=A,this._path=t,this._key=n}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},u$=(i,e)=>{if(p1(e))return{success:!0,data:e.value};if(!i.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let A=new x0(i.common.issues);return this._error=A,this._error}}};function tn(i){if(!i)return{};let{errorMap:e,invalid_type_error:A,required_error:t,description:n}=i;if(e&&(A||t))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:n}:{errorMap:(a,r)=>{let{message:s}=i;return a.code==="invalid_enum_value"?{message:s??r.defaultError}:typeof r.data>"u"?{message:s??t??r.defaultError}:a.code!=="invalid_type"?{message:r.defaultError}:{message:s??A??r.defaultError}},description:n}}var hn=class{get description(){return this._def.description}_getType(e){return _0(e.data)}_getOrReturnCtx(e,A){return A||{common:e.parent.common,data:e.data,parsedType:_0(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return{status:new rs,ctx:{common:e.parent.common,data:e.data,parsedType:_0(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){let A=this._parse(e);if(NE(A))throw new Error("Synchronous parse encountered promise.");return A}_parseAsync(e){let A=this._parse(e);return Promise.resolve(A)}parse(e,A){let t=this.safeParse(e,A);if(t.success)return t.data;throw t.error}safeParse(e,A){let t={common:{issues:[],async:A?.async??!1,contextualErrorMap:A?.errorMap},path:A?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:_0(e)},n=this._parseSync({data:e,path:t.path,parent:t});return u$(t,n)}"~validate"(e){let A={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:_0(e)};if(!this["~standard"].async)try{let t=this._parseSync({data:e,path:[],parent:A});return p1(t)?{value:t.value}:{issues:A.common.issues}}catch(t){t?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),A.common={issues:[],async:!0}}return this._parseAsync({data:e,path:[],parent:A}).then(t=>p1(t)?{value:t.value}:{issues:A.common.issues})}parseAsync(e,A){return re(this,null,function*(){let t=yield this.safeParseAsync(e,A);if(t.success)return t.data;throw t.error})}safeParseAsync(e,A){return re(this,null,function*(){let t={common:{issues:[],contextualErrorMap:A?.errorMap,async:!0},path:A?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:_0(e)},n=this._parse({data:e,path:t.path,parent:t}),o=yield NE(n)?n:Promise.resolve(n);return u$(t,o)})}refine(e,A){let t=n=>typeof A=="string"||typeof A>"u"?{message:A}:typeof A=="function"?A(n):A;return this._refinement((n,o)=>{let a=e(n),r=()=>o.addIssue(P({code:Ne.custom},t(n)));return typeof Promise<"u"&&a instanceof Promise?a.then(s=>s?!0:(r(),!1)):a?!0:(r(),!1)})}refinement(e,A){return this._refinement((t,n)=>e(t)?!0:(n.addIssue(typeof A=="function"?A(t,n):A),!1))}_refinement(e){return new KE({schema:this,typeName:_i.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:A=>this["~validate"](A)}}optional(){return f1.create(this,this._def)}nullable(){return UE.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Gp.create(this)}promise(){return Yy.create(this,this._def)}or(e){return JR.create([this,e],this._def)}and(e){return YR.create(this,e,this._def)}transform(e){return new KE($A(P({},tn(this._def)),{schema:this,typeName:_i.ZodEffects,effect:{type:"transform",transform:e}}))}default(e){let A=typeof e=="function"?e:()=>e;return new jR($A(P({},tn(this._def)),{innerType:this,defaultValue:A,typeName:_i.ZodDefault}))}brand(){return new Kp(P({typeName:_i.ZodBranded,type:this},tn(this._def)))}catch(e){let A=typeof e=="function"?e:()=>e;return new VR($A(P({},tn(this._def)),{innerType:this,catchValue:A,typeName:_i.ZodCatch}))}describe(e){let A=this.constructor;return new A($A(P({},this._def),{description:e}))}pipe(e){return Up.create(this,e)}readonly(){return qR.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},CMA=/^c[^\s-]{8,}$/i,dMA=/^[0-9a-z]+$/,IMA=/^[0-9A-HJKMNP-TV-Z]{26}$/i,BMA=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,hMA=/^[a-z0-9_-]{21}$/i,EMA=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,QMA=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,uMA=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,pMA="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",NR,fMA=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,mMA=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,wMA=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,yMA=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,DMA=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,vMA=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,f$="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",bMA=new RegExp(`^${f$}$`);function m$(i){let e="[0-5]\\d";i.precision?e=`${e}\\.\\d{${i.precision}}`:i.precision==null&&(e=`${e}(\\.\\d+)?`);let A=i.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${e})${A}`}function MMA(i){return new RegExp(`^${m$(i)}$`)}function w$(i){let e=`${f$}T${m$(i)}`,A=[];return A.push(i.local?"Z?":"Z"),i.offset&&A.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${A.join("|")})`,new RegExp(`^${e}$`)}function SMA(i,e){return!!((e==="v4"||!e)&&fMA.test(i)||(e==="v6"||!e)&&wMA.test(i))}function kMA(i,e){if(!EMA.test(i))return!1;try{let[A]=i.split(".");if(!A)return!1;let t=A.replace(/-/g,"+").replace(/_/g,"/").padEnd(A.length+(4-A.length%4)%4,"="),n=JSON.parse(atob(t));return!(typeof n!="object"||n===null||"typ"in n&&n?.typ!=="JWT"||!n.alg||e&&n.alg!==e)}catch(A){return!1}}function _MA(i,e){return!!((e==="v4"||!e)&&mMA.test(i)||(e==="v6"||!e)&&yMA.test(i))}var Oy=(()=>{class i extends hn{_parse(A){if(this._def.coerce&&(A.data=String(A.data)),this._getType(A)!==ht.string){let a=this._getOrReturnCtx(A);return ot(a,{code:Ne.invalid_type,expected:ht.string,received:a.parsedType}),hi}let n=new rs,o;for(let a of this._def.checks)if(a.kind==="min")A.data.lengtha.value&&(o=this._getOrReturnCtx(A,o),ot(o,{code:Ne.too_big,maximum:a.value,type:"string",inclusive:!0,exact:!1,message:a.message}),n.dirty());else if(a.kind==="length"){let r=A.data.length>a.value,s=A.data.lengthA.test(o),P({validation:t,code:Ne.invalid_string},Kt.errToObj(n)))}_addCheck(A){return new i($A(P({},this._def),{checks:[...this._def.checks,A]}))}email(A){return this._addCheck(P({kind:"email"},Kt.errToObj(A)))}url(A){return this._addCheck(P({kind:"url"},Kt.errToObj(A)))}emoji(A){return this._addCheck(P({kind:"emoji"},Kt.errToObj(A)))}uuid(A){return this._addCheck(P({kind:"uuid"},Kt.errToObj(A)))}nanoid(A){return this._addCheck(P({kind:"nanoid"},Kt.errToObj(A)))}cuid(A){return this._addCheck(P({kind:"cuid"},Kt.errToObj(A)))}cuid2(A){return this._addCheck(P({kind:"cuid2"},Kt.errToObj(A)))}ulid(A){return this._addCheck(P({kind:"ulid"},Kt.errToObj(A)))}base64(A){return this._addCheck(P({kind:"base64"},Kt.errToObj(A)))}base64url(A){return this._addCheck(P({kind:"base64url"},Kt.errToObj(A)))}jwt(A){return this._addCheck(P({kind:"jwt"},Kt.errToObj(A)))}ip(A){return this._addCheck(P({kind:"ip"},Kt.errToObj(A)))}cidr(A){return this._addCheck(P({kind:"cidr"},Kt.errToObj(A)))}datetime(A){return typeof A=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:A}):this._addCheck(P({kind:"datetime",precision:typeof A?.precision>"u"?null:A?.precision,offset:A?.offset??!1,local:A?.local??!1},Kt.errToObj(A?.message)))}date(A){return this._addCheck({kind:"date",message:A})}time(A){return typeof A=="string"?this._addCheck({kind:"time",precision:null,message:A}):this._addCheck(P({kind:"time",precision:typeof A?.precision>"u"?null:A?.precision},Kt.errToObj(A?.message)))}duration(A){return this._addCheck(P({kind:"duration"},Kt.errToObj(A)))}regex(A,t){return this._addCheck(P({kind:"regex",regex:A},Kt.errToObj(t)))}includes(A,t){return this._addCheck(P({kind:"includes",value:A,position:t?.position},Kt.errToObj(t?.message)))}startsWith(A,t){return this._addCheck(P({kind:"startsWith",value:A},Kt.errToObj(t)))}endsWith(A,t){return this._addCheck(P({kind:"endsWith",value:A},Kt.errToObj(t)))}min(A,t){return this._addCheck(P({kind:"min",value:A},Kt.errToObj(t)))}max(A,t){return this._addCheck(P({kind:"max",value:A},Kt.errToObj(t)))}length(A,t){return this._addCheck(P({kind:"length",value:A},Kt.errToObj(t)))}nonempty(A){return this.min(1,Kt.errToObj(A))}trim(){return new i($A(P({},this._def),{checks:[...this._def.checks,{kind:"trim"}]}))}toLowerCase(){return new i($A(P({},this._def),{checks:[...this._def.checks,{kind:"toLowerCase"}]}))}toUpperCase(){return new i($A(P({},this._def),{checks:[...this._def.checks,{kind:"toUpperCase"}]}))}get isDatetime(){return!!this._def.checks.find(A=>A.kind==="datetime")}get isDate(){return!!this._def.checks.find(A=>A.kind==="date")}get isTime(){return!!this._def.checks.find(A=>A.kind==="time")}get isDuration(){return!!this._def.checks.find(A=>A.kind==="duration")}get isEmail(){return!!this._def.checks.find(A=>A.kind==="email")}get isURL(){return!!this._def.checks.find(A=>A.kind==="url")}get isEmoji(){return!!this._def.checks.find(A=>A.kind==="emoji")}get isUUID(){return!!this._def.checks.find(A=>A.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(A=>A.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(A=>A.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(A=>A.kind==="cuid2")}get isULID(){return!!this._def.checks.find(A=>A.kind==="ulid")}get isIP(){return!!this._def.checks.find(A=>A.kind==="ip")}get isCIDR(){return!!this._def.checks.find(A=>A.kind==="cidr")}get isBase64(){return!!this._def.checks.find(A=>A.kind==="base64")}get isBase64url(){return!!this._def.checks.find(A=>A.kind==="base64url")}get minLength(){let A=null;for(let t of this._def.checks)t.kind==="min"&&(A===null||t.value>A)&&(A=t.value);return A}get maxLength(){let A=null;for(let t of this._def.checks)t.kind==="max"&&(A===null||t.valuenew i(P({checks:[],typeName:_i.ZodString,coerce:e?.coerce??!1},tn(e))),i})();function xMA(i,e){let A=(i.toString().split(".")[1]||"").length,t=(e.toString().split(".")[1]||"").length,n=A>t?A:t,o=Number.parseInt(i.toFixed(n).replace(".","")),a=Number.parseInt(e.toFixed(n).replace(".",""));return o%a/10**n}var LR=(()=>{class i extends hn{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(A){if(this._def.coerce&&(A.data=Number(A.data)),this._getType(A)!==ht.number){let a=this._getOrReturnCtx(A);return ot(a,{code:Ne.invalid_type,expected:ht.number,received:a.parsedType}),hi}let n,o=new rs;for(let a of this._def.checks)a.kind==="int"?Mn.isInteger(A.data)||(n=this._getOrReturnCtx(A,n),ot(n,{code:Ne.invalid_type,expected:"integer",received:"float",message:a.message}),o.dirty()):a.kind==="min"?(a.inclusive?A.dataa.value:A.data>=a.value)&&(n=this._getOrReturnCtx(A,n),ot(n,{code:Ne.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),o.dirty()):a.kind==="multipleOf"?xMA(A.data,a.value)!==0&&(n=this._getOrReturnCtx(A,n),ot(n,{code:Ne.not_multiple_of,multipleOf:a.value,message:a.message}),o.dirty()):a.kind==="finite"?Number.isFinite(A.data)||(n=this._getOrReturnCtx(A,n),ot(n,{code:Ne.not_finite,message:a.message}),o.dirty()):Mn.assertNever(a);return{status:o.value,value:A.data}}gte(A,t){return this.setLimit("min",A,!0,Kt.toString(t))}gt(A,t){return this.setLimit("min",A,!1,Kt.toString(t))}lte(A,t){return this.setLimit("max",A,!0,Kt.toString(t))}lt(A,t){return this.setLimit("max",A,!1,Kt.toString(t))}setLimit(A,t,n,o){return new i($A(P({},this._def),{checks:[...this._def.checks,{kind:A,value:t,inclusive:n,message:Kt.toString(o)}]}))}_addCheck(A){return new i($A(P({},this._def),{checks:[...this._def.checks,A]}))}int(A){return this._addCheck({kind:"int",message:Kt.toString(A)})}positive(A){return this._addCheck({kind:"min",value:0,inclusive:!1,message:Kt.toString(A)})}negative(A){return this._addCheck({kind:"max",value:0,inclusive:!1,message:Kt.toString(A)})}nonpositive(A){return this._addCheck({kind:"max",value:0,inclusive:!0,message:Kt.toString(A)})}nonnegative(A){return this._addCheck({kind:"min",value:0,inclusive:!0,message:Kt.toString(A)})}multipleOf(A,t){return this._addCheck({kind:"multipleOf",value:A,message:Kt.toString(t)})}finite(A){return this._addCheck({kind:"finite",message:Kt.toString(A)})}safe(A){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:Kt.toString(A)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:Kt.toString(A)})}get minValue(){let A=null;for(let t of this._def.checks)t.kind==="min"&&(A===null||t.value>A)&&(A=t.value);return A}get maxValue(){let A=null;for(let t of this._def.checks)t.kind==="max"&&(A===null||t.valueA.kind==="int"||A.kind==="multipleOf"&&Mn.isInteger(A.value))}get isFinite(){let A=null,t=null;for(let n of this._def.checks){if(n.kind==="finite"||n.kind==="int"||n.kind==="multipleOf")return!0;n.kind==="min"?(t===null||n.value>t)&&(t=n.value):n.kind==="max"&&(A===null||n.valuenew i(P({checks:[],typeName:_i.ZodNumber,coerce:e?.coerce||!1},tn(e))),i})(),GR=(()=>{class i extends hn{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(A){if(this._def.coerce)try{A.data=BigInt(A.data)}catch(a){return this._getInvalidInput(A)}if(this._getType(A)!==ht.bigint)return this._getInvalidInput(A);let n,o=new rs;for(let a of this._def.checks)a.kind==="min"?(a.inclusive?A.dataa.value:A.data>=a.value)&&(n=this._getOrReturnCtx(A,n),ot(n,{code:Ne.too_big,type:"bigint",maximum:a.value,inclusive:a.inclusive,message:a.message}),o.dirty()):a.kind==="multipleOf"?A.data%a.value!==BigInt(0)&&(n=this._getOrReturnCtx(A,n),ot(n,{code:Ne.not_multiple_of,multipleOf:a.value,message:a.message}),o.dirty()):Mn.assertNever(a);return{status:o.value,value:A.data}}_getInvalidInput(A){let t=this._getOrReturnCtx(A);return ot(t,{code:Ne.invalid_type,expected:ht.bigint,received:t.parsedType}),hi}gte(A,t){return this.setLimit("min",A,!0,Kt.toString(t))}gt(A,t){return this.setLimit("min",A,!1,Kt.toString(t))}lte(A,t){return this.setLimit("max",A,!0,Kt.toString(t))}lt(A,t){return this.setLimit("max",A,!1,Kt.toString(t))}setLimit(A,t,n,o){return new i($A(P({},this._def),{checks:[...this._def.checks,{kind:A,value:t,inclusive:n,message:Kt.toString(o)}]}))}_addCheck(A){return new i($A(P({},this._def),{checks:[...this._def.checks,A]}))}positive(A){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:Kt.toString(A)})}negative(A){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:Kt.toString(A)})}nonpositive(A){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:Kt.toString(A)})}nonnegative(A){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:Kt.toString(A)})}multipleOf(A,t){return this._addCheck({kind:"multipleOf",value:A,message:Kt.toString(t)})}get minValue(){let A=null;for(let t of this._def.checks)t.kind==="min"&&(A===null||t.value>A)&&(A=t.value);return A}get maxValue(){let A=null;for(let t of this._def.checks)t.kind==="max"&&(A===null||t.valuenew i(P({checks:[],typeName:_i.ZodBigInt,coerce:e?.coerce??!1},tn(e))),i})(),KR=(()=>{class i extends hn{_parse(A){if(this._def.coerce&&(A.data=!!A.data),this._getType(A)!==ht.boolean){let n=this._getOrReturnCtx(A);return ot(n,{code:Ne.invalid_type,expected:ht.boolean,received:n.parsedType}),hi}return Ss(A.data)}}return i.create=e=>new i(P({typeName:_i.ZodBoolean,coerce:e?.coerce||!1},tn(e))),i})(),UR=(()=>{class i extends hn{_parse(A){if(this._def.coerce&&(A.data=new Date(A.data)),this._getType(A)!==ht.date){let a=this._getOrReturnCtx(A);return ot(a,{code:Ne.invalid_type,expected:ht.date,received:a.parsedType}),hi}if(Number.isNaN(A.data.getTime())){let a=this._getOrReturnCtx(A);return ot(a,{code:Ne.invalid_date}),hi}let n=new rs,o;for(let a of this._def.checks)a.kind==="min"?A.data.getTime()a.value&&(o=this._getOrReturnCtx(A,o),ot(o,{code:Ne.too_big,message:a.message,inclusive:!0,exact:!1,maximum:a.value,type:"date"}),n.dirty()):Mn.assertNever(a);return{status:n.value,value:new Date(A.data.getTime())}}_addCheck(A){return new i($A(P({},this._def),{checks:[...this._def.checks,A]}))}min(A,t){return this._addCheck({kind:"min",value:A.getTime(),message:Kt.toString(t)})}max(A,t){return this._addCheck({kind:"max",value:A.getTime(),message:Kt.toString(t)})}get minDate(){let A=null;for(let t of this._def.checks)t.kind==="min"&&(A===null||t.value>A)&&(A=t.value);return A!=null?new Date(A):null}get maxDate(){let A=null;for(let t of this._def.checks)t.kind==="max"&&(A===null||t.valuenew i(P({checks:[],coerce:e?.coerce||!1,typeName:_i.ZodDate},tn(e))),i})(),y$=(()=>{class i extends hn{_parse(A){if(this._getType(A)!==ht.symbol){let n=this._getOrReturnCtx(A);return ot(n,{code:Ne.invalid_type,expected:ht.symbol,received:n.parsedType}),hi}return Ss(A.data)}}return i.create=e=>new i(P({typeName:_i.ZodSymbol},tn(e))),i})(),TR=(()=>{class i extends hn{_parse(A){if(this._getType(A)!==ht.undefined){let n=this._getOrReturnCtx(A);return ot(n,{code:Ne.invalid_type,expected:ht.undefined,received:n.parsedType}),hi}return Ss(A.data)}}return i.create=e=>new i(P({typeName:_i.ZodUndefined},tn(e))),i})(),OR=(()=>{class i extends hn{_parse(A){if(this._getType(A)!==ht.null){let n=this._getOrReturnCtx(A);return ot(n,{code:Ne.invalid_type,expected:ht.null,received:n.parsedType}),hi}return Ss(A.data)}}return i.create=e=>new i(P({typeName:_i.ZodNull},tn(e))),i})(),Gy=(()=>{class i extends hn{constructor(){super(...arguments),this._any=!0}_parse(A){return Ss(A.data)}}return i.create=e=>new i(P({typeName:_i.ZodAny},tn(e))),i})(),Lp=(()=>{class i extends hn{constructor(){super(...arguments),this._unknown=!0}_parse(A){return Ss(A.data)}}return i.create=e=>new i(P({typeName:_i.ZodUnknown},tn(e))),i})(),BI=(()=>{class i extends hn{_parse(A){let t=this._getOrReturnCtx(A);return ot(t,{code:Ne.invalid_type,expected:ht.never,received:t.parsedType}),hi}}return i.create=e=>new i(P({typeName:_i.ZodNever},tn(e))),i})(),D$=(()=>{class i extends hn{_parse(A){if(this._getType(A)!==ht.undefined){let n=this._getOrReturnCtx(A);return ot(n,{code:Ne.invalid_type,expected:ht.void,received:n.parsedType}),hi}return Ss(A.data)}}return i.create=e=>new i(P({typeName:_i.ZodVoid},tn(e))),i})(),Gp=(()=>{class i extends hn{_parse(A){let{ctx:t,status:n}=this._processInputParams(A),o=this._def;if(t.parsedType!==ht.array)return ot(t,{code:Ne.invalid_type,expected:ht.array,received:t.parsedType}),hi;if(o.exactLength!==null){let r=t.data.length>o.exactLength.value,s=t.data.lengtho.maxLength.value&&(ot(t,{code:Ne.too_big,maximum:o.maxLength.value,type:"array",inclusive:!0,exact:!1,message:o.maxLength.message}),n.dirty()),t.common.async)return Promise.all([...t.data].map((r,s)=>o.type._parseAsync(new Mg(t,r,t.path,s)))).then(r=>rs.mergeArray(n,r));let a=[...t.data].map((r,s)=>o.type._parseSync(new Mg(t,r,t.path,s)));return rs.mergeArray(n,a)}get element(){return this._def.type}min(A,t){return new i($A(P({},this._def),{minLength:{value:A,message:Kt.toString(t)}}))}max(A,t){return new i($A(P({},this._def),{maxLength:{value:A,message:Kt.toString(t)}}))}length(A,t){return new i($A(P({},this._def),{exactLength:{value:A,message:Kt.toString(t)}}))}nonempty(A){return this.min(1,A)}}return i.create=(e,A)=>new i(P({type:e,minLength:null,maxLength:null,exactLength:null,typeName:_i.ZodArray},tn(A))),i})();function FE(i){if(i instanceof LE){let e={};for(let A in i.shape){let t=i.shape[A];e[A]=f1.create(FE(t))}return new LE($A(P({},i._def),{shape:()=>e}))}else return i instanceof Gp?new Gp($A(P({},i._def),{type:FE(i.element)})):i instanceof f1?f1.create(FE(i.unwrap())):i instanceof UE?UE.create(FE(i.unwrap())):i instanceof GE?GE.create(i.items.map(e=>FE(e))):i}var LE=(()=>{class i extends hn{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let A=this._def.shape(),t=Mn.objectKeys(A);return this._cached={shape:A,keys:t},this._cached}_parse(A){if(this._getType(A)!==ht.object){let g=this._getOrReturnCtx(A);return ot(g,{code:Ne.invalid_type,expected:ht.object,received:g.parsedType}),hi}let{status:n,ctx:o}=this._processInputParams(A),{shape:a,keys:r}=this._getCached(),s=[];if(!(this._def.catchall instanceof BI&&this._def.unknownKeys==="strip"))for(let g in o.data)r.includes(g)||s.push(g);let l=[];for(let g of r){let C=a[g],d=o.data[g];l.push({key:{status:"valid",value:g},value:C._parse(new Mg(o,d,o.path,g)),alwaysSet:g in o.data})}if(this._def.catchall instanceof BI){let g=this._def.unknownKeys;if(g==="passthrough")for(let C of s)l.push({key:{status:"valid",value:C},value:{status:"valid",value:o.data[C]}});else if(g==="strict")s.length>0&&(ot(o,{code:Ne.unrecognized_keys,keys:s}),n.dirty());else if(g!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{let g=this._def.catchall;for(let C of s){let d=o.data[C];l.push({key:{status:"valid",value:C},value:g._parse(new Mg(o,d,o.path,C)),alwaysSet:C in o.data})}}return o.common.async?Promise.resolve().then(()=>re(this,null,function*(){let g=[];for(let C of l){let d=yield C.key,B=yield C.value;g.push({key:d,value:B,alwaysSet:C.alwaysSet})}return g})).then(g=>rs.mergeObjectSync(n,g)):rs.mergeObjectSync(n,l)}get shape(){return this._def.shape()}strict(A){return Kt.errToObj,new i(P($A(P({},this._def),{unknownKeys:"strict"}),A!==void 0?{errorMap:(t,n)=>{let o=this._def.errorMap?.(t,n).message??n.defaultError;return t.code==="unrecognized_keys"?{message:Kt.errToObj(A).message??o}:{message:o}}}:{}))}strip(){return new i($A(P({},this._def),{unknownKeys:"strip"}))}passthrough(){return new i($A(P({},this._def),{unknownKeys:"passthrough"}))}extend(A){return new i($A(P({},this._def),{shape:()=>P(P({},this._def.shape()),A)}))}merge(A){return new i({unknownKeys:A._def.unknownKeys,catchall:A._def.catchall,shape:()=>P(P({},this._def.shape()),A._def.shape()),typeName:_i.ZodObject})}setKey(A,t){return this.augment({[A]:t})}catchall(A){return new i($A(P({},this._def),{catchall:A}))}pick(A){let t={};for(let n of Mn.objectKeys(A))A[n]&&this.shape[n]&&(t[n]=this.shape[n]);return new i($A(P({},this._def),{shape:()=>t}))}omit(A){let t={};for(let n of Mn.objectKeys(this.shape))A[n]||(t[n]=this.shape[n]);return new i($A(P({},this._def),{shape:()=>t}))}deepPartial(){return FE(this)}partial(A){let t={};for(let n of Mn.objectKeys(this.shape)){let o=this.shape[n];A&&!A[n]?t[n]=o:t[n]=o.optional()}return new i($A(P({},this._def),{shape:()=>t}))}required(A){let t={};for(let n of Mn.objectKeys(this.shape))if(A&&!A[n])t[n]=this.shape[n];else{let a=this.shape[n];for(;a instanceof f1;)a=a._def.innerType;t[n]=a}return new i($A(P({},this._def),{shape:()=>t}))}keyof(){return M$(Mn.objectKeys(this.shape))}}return i.create=(e,A)=>new i(P({shape:()=>e,unknownKeys:"strip",catchall:BI.create(),typeName:_i.ZodObject},tn(A))),i.strictCreate=(e,A)=>new i(P({shape:()=>e,unknownKeys:"strict",catchall:BI.create(),typeName:_i.ZodObject},tn(A))),i.lazycreate=(e,A)=>new i(P({shape:e,unknownKeys:"strip",catchall:BI.create(),typeName:_i.ZodObject},tn(A))),i})(),JR=(()=>{class i extends hn{_parse(A){let{ctx:t}=this._processInputParams(A),n=this._def.options;function o(a){for(let s of a)if(s.result.status==="valid")return s.result;for(let s of a)if(s.result.status==="dirty")return t.common.issues.push(...s.ctx.common.issues),s.result;let r=a.map(s=>new x0(s.ctx.common.issues));return ot(t,{code:Ne.invalid_union,unionErrors:r}),hi}if(t.common.async)return Promise.all(n.map(a=>re(this,null,function*(){let r=$A(P({},t),{common:$A(P({},t.common),{issues:[]}),parent:null});return{result:yield a._parseAsync({data:t.data,path:t.path,parent:r}),ctx:r}}))).then(o);{let a,r=[];for(let l of n){let g=$A(P({},t),{common:$A(P({},t.common),{issues:[]}),parent:null}),C=l._parseSync({data:t.data,path:t.path,parent:g});if(C.status==="valid")return C;C.status==="dirty"&&!a&&(a={result:C,ctx:g}),g.common.issues.length&&r.push(g.common.issues)}if(a)return t.common.issues.push(...a.ctx.common.issues),a.result;let s=r.map(l=>new x0(l));return ot(t,{code:Ne.invalid_union,unionErrors:s}),hi}}get options(){return this._def.options}}return i.create=(e,A)=>new i(P({options:e,typeName:_i.ZodUnion},tn(A))),i})(),OC=i=>i instanceof HR?OC(i.schema):i instanceof KE?OC(i.innerType()):i instanceof zR?[i.value]:i instanceof Jy?i.options:i instanceof PR?Mn.objectValues(i.enum):i instanceof jR?OC(i._def.innerType):i instanceof TR?[void 0]:i instanceof OR?[null]:i instanceof f1?[void 0,...OC(i.unwrap())]:i instanceof UE?[null,...OC(i.unwrap())]:i instanceof Kp||i instanceof qR?OC(i.unwrap()):i instanceof VR?OC(i._def.innerType):[],Ky=class i extends hn{_parse(e){let{ctx:A}=this._processInputParams(e);if(A.parsedType!==ht.object)return ot(A,{code:Ne.invalid_type,expected:ht.object,received:A.parsedType}),hi;let t=this.discriminator,n=A.data[t],o=this.optionsMap.get(n);return o?A.common.async?o._parseAsync({data:A.data,path:A.path,parent:A}):o._parseSync({data:A.data,path:A.path,parent:A}):(ot(A,{code:Ne.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[t]}),hi)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,A,t){let n=new Map;for(let o of A){let a=OC(o.shape[e]);if(!a.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(let r of a){if(n.has(r))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(r)}`);n.set(r,o)}}return new i(P({typeName:_i.ZodDiscriminatedUnion,discriminator:e,options:A,optionsMap:n},tn(t)))}};function FR(i,e){let A=_0(i),t=_0(e);if(i===e)return{valid:!0,data:i};if(A===ht.object&&t===ht.object){let n=Mn.objectKeys(e),o=Mn.objectKeys(i).filter(r=>n.indexOf(r)!==-1),a=P(P({},i),e);for(let r of o){let s=FR(i[r],e[r]);if(!s.valid)return{valid:!1};a[r]=s.data}return{valid:!0,data:a}}else if(A===ht.array&&t===ht.array){if(i.length!==e.length)return{valid:!1};let n=[];for(let o=0;o{class i extends hn{_parse(A){let{status:t,ctx:n}=this._processInputParams(A),o=(a,r)=>{if(Fy(a)||Fy(r))return hi;let s=FR(a.value,r.value);return s.valid?((Ly(a)||Ly(r))&&t.dirty(),{status:t.value,value:s.data}):(ot(n,{code:Ne.invalid_intersection_types}),hi)};return n.common.async?Promise.all([this._def.left._parseAsync({data:n.data,path:n.path,parent:n}),this._def.right._parseAsync({data:n.data,path:n.path,parent:n})]).then(([a,r])=>o(a,r)):o(this._def.left._parseSync({data:n.data,path:n.path,parent:n}),this._def.right._parseSync({data:n.data,path:n.path,parent:n}))}}return i.create=(e,A,t)=>new i(P({left:e,right:A,typeName:_i.ZodIntersection},tn(t))),i})(),GE=(()=>{class i extends hn{_parse(A){let{status:t,ctx:n}=this._processInputParams(A);if(n.parsedType!==ht.array)return ot(n,{code:Ne.invalid_type,expected:ht.array,received:n.parsedType}),hi;if(n.data.lengththis._def.items.length&&(ot(n,{code:Ne.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),t.dirty());let a=[...n.data].map((r,s)=>{let l=this._def.items[s]||this._def.rest;return l?l._parse(new Mg(n,r,n.path,s)):null}).filter(r=>!!r);return n.common.async?Promise.all(a).then(r=>rs.mergeArray(t,r)):rs.mergeArray(t,a)}get items(){return this._def.items}rest(A){return new i($A(P({},this._def),{rest:A}))}}return i.create=(e,A)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new i(P({items:e,typeName:_i.ZodTuple,rest:null},tn(A)))},i})(),Uy=class i extends hn{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:A,ctx:t}=this._processInputParams(e);if(t.parsedType!==ht.object)return ot(t,{code:Ne.invalid_type,expected:ht.object,received:t.parsedType}),hi;let n=[],o=this._def.keyType,a=this._def.valueType;for(let r in t.data)n.push({key:o._parse(new Mg(t,r,t.path,r)),value:a._parse(new Mg(t,t.data[r],t.path,r)),alwaysSet:r in t.data});return t.common.async?rs.mergeObjectAsync(A,n):rs.mergeObjectSync(A,n)}get element(){return this._def.valueType}static create(e,A,t){return A instanceof hn?new i(P({keyType:e,valueType:A,typeName:_i.ZodRecord},tn(t))):new i(P({keyType:Oy.create(),valueType:e,typeName:_i.ZodRecord},tn(A)))}},v$=(()=>{class i extends hn{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(A){let{status:t,ctx:n}=this._processInputParams(A);if(n.parsedType!==ht.map)return ot(n,{code:Ne.invalid_type,expected:ht.map,received:n.parsedType}),hi;let o=this._def.keyType,a=this._def.valueType,r=[...n.data.entries()].map(([s,l],g)=>({key:o._parse(new Mg(n,s,n.path,[g,"key"])),value:a._parse(new Mg(n,l,n.path,[g,"value"]))}));if(n.common.async){let s=new Map;return Promise.resolve().then(()=>re(this,null,function*(){for(let l of r){let g=yield l.key,C=yield l.value;if(g.status==="aborted"||C.status==="aborted")return hi;(g.status==="dirty"||C.status==="dirty")&&t.dirty(),s.set(g.value,C.value)}return{status:t.value,value:s}}))}else{let s=new Map;for(let l of r){let g=l.key,C=l.value;if(g.status==="aborted"||C.status==="aborted")return hi;(g.status==="dirty"||C.status==="dirty")&&t.dirty(),s.set(g.value,C.value)}return{status:t.value,value:s}}}}return i.create=(e,A,t)=>new i(P({valueType:A,keyType:e,typeName:_i.ZodMap},tn(t))),i})(),b$=(()=>{class i extends hn{_parse(A){let{status:t,ctx:n}=this._processInputParams(A);if(n.parsedType!==ht.set)return ot(n,{code:Ne.invalid_type,expected:ht.set,received:n.parsedType}),hi;let o=this._def;o.minSize!==null&&n.data.sizeo.maxSize.value&&(ot(n,{code:Ne.too_big,maximum:o.maxSize.value,type:"set",inclusive:!0,exact:!1,message:o.maxSize.message}),t.dirty());let a=this._def.valueType;function r(l){let g=new Set;for(let C of l){if(C.status==="aborted")return hi;C.status==="dirty"&&t.dirty(),g.add(C.value)}return{status:t.value,value:g}}let s=[...n.data.values()].map((l,g)=>a._parse(new Mg(n,l,n.path,g)));return n.common.async?Promise.all(s).then(l=>r(l)):r(s)}min(A,t){return new i($A(P({},this._def),{minSize:{value:A,message:Kt.toString(t)}}))}max(A,t){return new i($A(P({},this._def),{maxSize:{value:A,message:Kt.toString(t)}}))}size(A,t){return this.min(A,t).max(A,t)}nonempty(A){return this.min(1,A)}}return i.create=(e,A)=>new i(P({valueType:e,minSize:null,maxSize:null,typeName:_i.ZodSet},tn(A))),i})(),Ty=class i extends hn{constructor(){super(...arguments),this.validate=this.implement}_parse(e){let{ctx:A}=this._processInputParams(e);if(A.parsedType!==ht.function)return ot(A,{code:Ne.invalid_type,expected:ht.function,received:A.parsedType}),hi;function t(r,s){return Fp({data:r,path:A.path,errorMaps:[A.common.contextualErrorMap,A.schemaErrorMap,RE(),TC].filter(l=>!!l),issueData:{code:Ne.invalid_arguments,argumentsError:s}})}function n(r,s){return Fp({data:r,path:A.path,errorMaps:[A.common.contextualErrorMap,A.schemaErrorMap,RE(),TC].filter(l=>!!l),issueData:{code:Ne.invalid_return_type,returnTypeError:s}})}let o={errorMap:A.common.contextualErrorMap},a=A.data;if(this._def.returns instanceof Yy){let r=this;return Ss(function(...s){return re(this,null,function*(){let l=new x0([]),g=yield r._def.args.parseAsync(s,o).catch(B=>{throw l.addIssue(t(s,B)),l}),C=yield Reflect.apply(a,this,g);return yield r._def.returns._def.type.parseAsync(C,o).catch(B=>{throw l.addIssue(n(C,B)),l})})})}else{let r=this;return Ss(function(...s){let l=r._def.args.safeParse(s,o);if(!l.success)throw new x0([t(s,l.error)]);let g=Reflect.apply(a,this,l.data),C=r._def.returns.safeParse(g,o);if(!C.success)throw new x0([n(g,C.error)]);return C.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...e){return new i($A(P({},this._def),{args:GE.create(e).rest(Lp.create())}))}returns(e){return new i($A(P({},this._def),{returns:e}))}implement(e){return this.parse(e)}strictImplement(e){return this.parse(e)}static create(e,A,t){return new i(P({args:e||GE.create([]).rest(Lp.create()),returns:A||Lp.create(),typeName:_i.ZodFunction},tn(t)))}},HR=(()=>{class i extends hn{get schema(){return this._def.getter()}_parse(A){let{ctx:t}=this._processInputParams(A);return this._def.getter()._parse({data:t.data,path:t.path,parent:t})}}return i.create=(e,A)=>new i(P({getter:e,typeName:_i.ZodLazy},tn(A))),i})(),zR=(()=>{class i extends hn{_parse(A){if(A.data!==this._def.value){let t=this._getOrReturnCtx(A);return ot(t,{received:t.data,code:Ne.invalid_literal,expected:this._def.value}),hi}return{status:"valid",value:A.data}}get value(){return this._def.value}}return i.create=(e,A)=>new i(P({value:e,typeName:_i.ZodLiteral},tn(A))),i})();function M$(i,e){return new Jy(P({values:i,typeName:_i.ZodEnum},tn(e)))}var Jy=(()=>{class i extends hn{_parse(A){if(typeof A.data!="string"){let t=this._getOrReturnCtx(A),n=this._def.values;return ot(t,{expected:Mn.joinValues(n),received:t.parsedType,code:Ne.invalid_type}),hi}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(A.data)){let t=this._getOrReturnCtx(A),n=this._def.values;return ot(t,{received:t.data,code:Ne.invalid_enum_value,options:n}),hi}return Ss(A.data)}get options(){return this._def.values}get enum(){let A={};for(let t of this._def.values)A[t]=t;return A}get Values(){let A={};for(let t of this._def.values)A[t]=t;return A}get Enum(){let A={};for(let t of this._def.values)A[t]=t;return A}extract(A,t=this._def){return i.create(A,P(P({},this._def),t))}exclude(A,t=this._def){return i.create(this.options.filter(n=>!A.includes(n)),P(P({},this._def),t))}}return i.create=M$,i})(),PR=(()=>{class i extends hn{_parse(A){let t=Mn.getValidEnumValues(this._def.values),n=this._getOrReturnCtx(A);if(n.parsedType!==ht.string&&n.parsedType!==ht.number){let o=Mn.objectValues(t);return ot(n,{expected:Mn.joinValues(o),received:n.parsedType,code:Ne.invalid_type}),hi}if(this._cache||(this._cache=new Set(Mn.getValidEnumValues(this._def.values))),!this._cache.has(A.data)){let o=Mn.objectValues(t);return ot(n,{received:n.data,code:Ne.invalid_enum_value,options:o}),hi}return Ss(A.data)}get enum(){return this._def.values}}return i.create=(e,A)=>new i(P({values:e,typeName:_i.ZodNativeEnum},tn(A))),i})(),Yy=(()=>{class i extends hn{unwrap(){return this._def.type}_parse(A){let{ctx:t}=this._processInputParams(A);if(t.parsedType!==ht.promise&&t.common.async===!1)return ot(t,{code:Ne.invalid_type,expected:ht.promise,received:t.parsedType}),hi;let n=t.parsedType===ht.promise?t.data:Promise.resolve(t.data);return Ss(n.then(o=>this._def.type.parseAsync(o,{path:t.path,errorMap:t.common.contextualErrorMap})))}}return i.create=(e,A)=>new i(P({type:e,typeName:_i.ZodPromise},tn(A))),i})(),KE=(()=>{class i extends hn{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===_i.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(A){let{status:t,ctx:n}=this._processInputParams(A),o=this._def.effect||null,a={addIssue:r=>{ot(n,r),r.fatal?t.abort():t.dirty()},get path(){return n.path}};if(a.addIssue=a.addIssue.bind(a),o.type==="preprocess"){let r=o.transform(n.data,a);if(n.common.async)return Promise.resolve(r).then(s=>re(this,null,function*(){if(t.value==="aborted")return hi;let l=yield this._def.schema._parseAsync({data:s,path:n.path,parent:n});return l.status==="aborted"?hi:l.status==="dirty"?II(l.value):t.value==="dirty"?II(l.value):l}));{if(t.value==="aborted")return hi;let s=this._def.schema._parseSync({data:r,path:n.path,parent:n});return s.status==="aborted"?hi:s.status==="dirty"?II(s.value):t.value==="dirty"?II(s.value):s}}if(o.type==="refinement"){let r=s=>{let l=o.refinement(s,a);if(n.common.async)return Promise.resolve(l);if(l instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return s};if(n.common.async===!1){let s=this._def.schema._parseSync({data:n.data,path:n.path,parent:n});return s.status==="aborted"?hi:(s.status==="dirty"&&t.dirty(),r(s.value),{status:t.value,value:s.value})}else return this._def.schema._parseAsync({data:n.data,path:n.path,parent:n}).then(s=>s.status==="aborted"?hi:(s.status==="dirty"&&t.dirty(),r(s.value).then(()=>({status:t.value,value:s.value}))))}if(o.type==="transform")if(n.common.async===!1){let r=this._def.schema._parseSync({data:n.data,path:n.path,parent:n});if(!p1(r))return hi;let s=o.transform(r.value,a);if(s instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:t.value,value:s}}else return this._def.schema._parseAsync({data:n.data,path:n.path,parent:n}).then(r=>p1(r)?Promise.resolve(o.transform(r.value,a)).then(s=>({status:t.value,value:s})):hi);Mn.assertNever(o)}}return i.create=(e,A,t)=>new i(P({schema:e,typeName:_i.ZodEffects,effect:A},tn(t))),i.createWithPreprocess=(e,A,t)=>new i(P({schema:A,effect:{type:"preprocess",transform:e},typeName:_i.ZodEffects},tn(t))),i})();var f1=(()=>{class i extends hn{_parse(A){return this._getType(A)===ht.undefined?Ss(void 0):this._def.innerType._parse(A)}unwrap(){return this._def.innerType}}return i.create=(e,A)=>new i(P({innerType:e,typeName:_i.ZodOptional},tn(A))),i})(),UE=(()=>{class i extends hn{_parse(A){return this._getType(A)===ht.null?Ss(null):this._def.innerType._parse(A)}unwrap(){return this._def.innerType}}return i.create=(e,A)=>new i(P({innerType:e,typeName:_i.ZodNullable},tn(A))),i})(),jR=(()=>{class i extends hn{_parse(A){let{ctx:t}=this._processInputParams(A),n=t.data;return t.parsedType===ht.undefined&&(n=this._def.defaultValue()),this._def.innerType._parse({data:n,path:t.path,parent:t})}removeDefault(){return this._def.innerType}}return i.create=(e,A)=>new i(P({innerType:e,typeName:_i.ZodDefault,defaultValue:typeof A.default=="function"?A.default:()=>A.default},tn(A))),i})(),VR=(()=>{class i extends hn{_parse(A){let{ctx:t}=this._processInputParams(A),n=$A(P({},t),{common:$A(P({},t.common),{issues:[]})}),o=this._def.innerType._parse({data:n.data,path:n.path,parent:P({},n)});return NE(o)?o.then(a=>({status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new x0(n.common.issues)},input:n.data})})):{status:"valid",value:o.status==="valid"?o.value:this._def.catchValue({get error(){return new x0(n.common.issues)},input:n.data})}}removeCatch(){return this._def.innerType}}return i.create=(e,A)=>new i(P({innerType:e,typeName:_i.ZodCatch,catchValue:typeof A.catch=="function"?A.catch:()=>A.catch},tn(A))),i})(),S$=(()=>{class i extends hn{_parse(A){if(this._getType(A)!==ht.nan){let n=this._getOrReturnCtx(A);return ot(n,{code:Ne.invalid_type,expected:ht.nan,received:n.parsedType}),hi}return{status:"valid",value:A.data}}}return i.create=e=>new i(P({typeName:_i.ZodNaN},tn(e))),i})(),RMA=Symbol("zod_brand"),Kp=class extends hn{_parse(e){let{ctx:A}=this._processInputParams(e),t=A.data;return this._def.type._parse({data:t,path:A.path,parent:A})}unwrap(){return this._def.type}},Up=class i extends hn{_parse(e){let{status:A,ctx:t}=this._processInputParams(e);if(t.common.async)return re(this,null,function*(){let o=yield this._def.in._parseAsync({data:t.data,path:t.path,parent:t});return o.status==="aborted"?hi:o.status==="dirty"?(A.dirty(),II(o.value)):this._def.out._parseAsync({data:o.value,path:t.path,parent:t})});{let n=this._def.in._parseSync({data:t.data,path:t.path,parent:t});return n.status==="aborted"?hi:n.status==="dirty"?(A.dirty(),{status:"dirty",value:n.value}):this._def.out._parseSync({data:n.value,path:t.path,parent:t})}}static create(e,A){return new i({in:e,out:A,typeName:_i.ZodPipeline})}},qR=(()=>{class i extends hn{_parse(A){let t=this._def.innerType._parse(A),n=o=>(p1(o)&&(o.value=Object.freeze(o.value)),o);return NE(t)?t.then(o=>n(o)):n(t)}unwrap(){return this._def.innerType}}return i.create=(e,A)=>new i(P({innerType:e,typeName:_i.ZodReadonly},tn(A))),i})();function p$(i,e){let A=typeof i=="function"?i(e):typeof i=="string"?{message:i}:i;return typeof A=="string"?{message:A}:A}function k$(i,e={},A){return i?Gy.create().superRefine((t,n)=>{let o=i(t);if(o instanceof Promise)return o.then(a=>{if(!a){let r=p$(e,t),s=r.fatal??A??!0;n.addIssue($A(P({code:"custom"},r),{fatal:s}))}});if(!o){let a=p$(e,t),r=a.fatal??A??!0;n.addIssue($A(P({code:"custom"},a),{fatal:r}))}}):Gy.create()}var NMA={object:LE.lazycreate},_i=(function(i){return i.ZodString="ZodString",i.ZodNumber="ZodNumber",i.ZodNaN="ZodNaN",i.ZodBigInt="ZodBigInt",i.ZodBoolean="ZodBoolean",i.ZodDate="ZodDate",i.ZodSymbol="ZodSymbol",i.ZodUndefined="ZodUndefined",i.ZodNull="ZodNull",i.ZodAny="ZodAny",i.ZodUnknown="ZodUnknown",i.ZodNever="ZodNever",i.ZodVoid="ZodVoid",i.ZodArray="ZodArray",i.ZodObject="ZodObject",i.ZodUnion="ZodUnion",i.ZodDiscriminatedUnion="ZodDiscriminatedUnion",i.ZodIntersection="ZodIntersection",i.ZodTuple="ZodTuple",i.ZodRecord="ZodRecord",i.ZodMap="ZodMap",i.ZodSet="ZodSet",i.ZodFunction="ZodFunction",i.ZodLazy="ZodLazy",i.ZodLiteral="ZodLiteral",i.ZodEnum="ZodEnum",i.ZodEffects="ZodEffects",i.ZodNativeEnum="ZodNativeEnum",i.ZodOptional="ZodOptional",i.ZodNullable="ZodNullable",i.ZodDefault="ZodDefault",i.ZodCatch="ZodCatch",i.ZodPromise="ZodPromise",i.ZodBranded="ZodBranded",i.ZodPipeline="ZodPipeline",i.ZodReadonly="ZodReadonly",i})(_i||{});var FMA=(i,e={message:`Input not instance of ${i.name}`})=>k$(A=>A instanceof i,e),_$=Oy.create,x$=LR.create,LMA=S$.create,GMA=GR.create,R$=KR.create,KMA=UR.create,UMA=y$.create,TMA=TR.create,OMA=OR.create,JMA=Gy.create,YMA=Lp.create,HMA=BI.create,zMA=D$.create,PMA=Gp.create,jMA=LE.create,VMA=LE.strictCreate,qMA=JR.create,WMA=Ky.create,ZMA=YR.create,XMA=GE.create,$MA=Uy.create,A9A=v$.create,e9A=b$.create,t9A=Ty.create,i9A=HR.create,n9A=zR.create,o9A=Jy.create,a9A=PR.create,r9A=Yy.create,s9A=KE.create,l9A=f1.create,g9A=UE.create,c9A=KE.createWithPreprocess,C9A=Up.create,d9A=()=>_$().optional(),I9A=()=>x$().optional(),B9A=()=>R$().optional(),h9A={string:i=>Oy.create($A(P({},i),{coerce:!0})),number:i=>LR.create($A(P({},i),{coerce:!0})),boolean:i=>KR.create($A(P({},i),{coerce:!0})),bigint:i=>GR.create($A(P({},i),{coerce:!0})),date:i=>UR.create($A(P({},i),{coerce:!0}))};var E9A=hi;var Q9A=XA.union([XA.string(),XA.number(),XA.boolean()]),Hy=XA.lazy(()=>XA.union([Q9A,XA.array(Hy),XA.record(XA.string(),Hy)]));function zy(i){return i.transform(e=>{if(!e||typeof e!="object")return e;let A={};for(let[t,n]of Object.entries(e))n!==null&&(A[t]=n);return A})}var WR=XA.string().transform((i,e)=>{try{return JSON.parse(i)}catch(A){return e.addIssue({code:"custom",message:"Invalid JSON string"}),XA.NEVER}}),Tp=i=>XA.union([i,WR.pipe(i)]);var Py="gen_ai.input.messages",jy="gen_ai.output.messages",Vy="gen_ai.system_instructions",qy="gen_ai.tool.definitions",Wy="gen_ai.response.finish_reasons",Zy="gen_ai.usage.input_tokens",Xy="gen_ai.usage.output_tokens",N$="function",Jp="gen_ai.client.inference.operation.details",u9A=XA.object({type:XA.literal("text"),content:XA.string()}),p9A=XA.object({type:XA.literal("blob"),mime_type:XA.string(),data:XA.any()}),f9A=XA.object({type:XA.literal("file_data"),mime_type:XA.string(),uri:XA.string()}),m9A=XA.object({type:XA.literal("tool_call"),id:XA.string().nullable().optional(),name:XA.string(),arguments:XA.record(XA.string(),XA.any()).nullable().optional()}),w9A=XA.object({type:XA.literal("tool_call_response"),id:XA.string().nullable().optional(),response:XA.record(XA.string(),XA.any()).nullable().optional()}),ZR=XA.discriminatedUnion("type",[u9A,p9A,f9A,m9A,w9A]),y9A=XA.object({role:XA.string(),parts:XA.array(ZR)}),D9A=XA.object({role:XA.string(),parts:XA.array(ZR),finish_reason:XA.string()}),v9A=XA.object({type:XA.literal(N$),name:XA.string(),description:XA.string().nullable().optional(),parameters:XA.record(XA.string(),XA.any()).nullable().optional()}),b9A=XA.object({name:XA.string(),type:XA.string()}),M9A=XA.union([v9A,b9A]),S9A=Tp(XA.array(y9A)),k9A=Tp(XA.array(D9A)),_9A=Tp(XA.array(ZR)),x9A=Tp(XA.array(M9A)),XR=XA.array(XA.string()),Op=XA.number(),R9A=XA.object({[Py]:S9A.optional(),[jy]:k9A.optional(),[Vy]:_9A.optional(),[qy]:x9A.optional(),[Wy]:XR.optional(),[Zy]:Op.optional(),[Xy]:Op.optional()}).passthrough(),F$=XA.object({event_name:XA.literal(Jp),body:XA.unknown().optional(),attributes:R9A.optional()});var $y="gen_ai.system.message",AD="gen_ai.user.message",eD="gen_ai.choice",N9A=zy(XA.object({id:XA.string().nullable().optional(),name:XA.string(),args:XA.record(XA.string(),XA.any()),needsResponse:XA.boolean().nullable().optional()})),F9A=zy(XA.object({id:XA.string().nullable().optional(),name:XA.string(),response:XA.record(XA.string(),XA.any())})),G$=zy(XA.object({text:XA.string().nullable().optional(),function_call:N9A.nullable().optional(),function_response:F9A.nullable().optional()})),L9A=XA.object({parts:XA.array(G$),role:XA.string()}),L$=XA.object({content:XA.object({parts:XA.array(G$),role:XA.string().optional()}),role:XA.string().optional()}).transform(i=>{let e=P({},i.content);return i.role!==void 0&&(e.role=i.role),{content:e}}).pipe(XA.object({content:L9A})),G9A=XA.object({content:XA.string()}),K9A=XA.object({event_name:XA.enum([AD,eD]),body:XA.union([L$,WR.pipe(L$)])}),U9A=XA.object({event_name:XA.literal($y),body:G9A}),K$=XA.union([U9A,K9A]);var T9A="gcp.vertex.agent.llm_request",O9A="gcp.vertex.agent.llm_response";function tD(i){let e=J9A(i);if(e!==void 0)return e;let A=Y9A(i);if(A!==void 0)return A;let t=H9A(i);if(t!==void 0)return t}function J9A(i){let e=(i.logs??[]).find(r=>r.event_name===Jp);if(e===void 0)return;let A=e.attributes??{},t=A[Vy],n=A[Py],o=A[qy],a=A[jy];if(!(t===void 0&&n===void 0&&o===void 0&&a===void 0))return{kind:"experimental",inputs:{system_instruction:t,user_messages:n,tool_definitions:o},outputs:a}}function Y9A(i){let e=i.logs??[],A,t=[],n;for(let o of e)switch(o.event_name){case $y:A=o.body;break;case AD:t.push(o.body);break;case eD:n=o.body;break;default:break}if(!(A===void 0&&t.length===0&&n===void 0))return{kind:"stable",inputs:{system_instruction:A,user_messages:t},outputs:n}}function H9A(i){let e=i.attributes??{},A=e[T9A],t=e[O9A];if(!(A===void 0&&t===void 0))return{kind:"legacy",inputs:U$(A),outputs:U$(t)}}function U$(i){if(typeof i!="string")return i;try{return JSON.parse(i)}catch(e){return i}}var z9A=XA.union([K$,F$]);var P9A="gen_ai.operation.name",T$="gen_ai.conversation.id",j9A="gen_ai.agent.name",V9A="gen_ai.agent.description",O$="gcp.vertex.agent.invocation_id",q9A="gcp.vertex.agent.associated_event_ids",J$="gcp.vertex.agent.event_id";var AN="invoke_agent",hI="generate_content",W9A=XA.object({name:XA.string(),start_time:XA.number(),end_time:XA.number(),trace_id:XA.union([XA.string(),XA.number()]),span_id:XA.union([XA.string(),XA.number()]),parent_span_id:XA.union([XA.string(),XA.number()]).nullable().optional(),attributes:XA.record(XA.string(),Hy).optional(),logs:XA.array(z9A).optional()}),Z9A=XA.object({attrConversationId:XA.string().optional(),attrInvocationId:XA.string().optional(),attrAssociatedEventIds:XA.array(XA.string()).optional(),attrAgentName:XA.string().optional(),attrAgentDescription:XA.string().optional(),attrEventId:XA.string().optional(),attrResponseFinishReasons:XR.optional(),attrUsageInputTokens:Op.optional(),attrUsageOutputTokens:Op.optional()});function X9A(i){let e=i.attributes??{},A={attrConversationId:e[T$],attrInvocationId:e[O$],attrAssociatedEventIds:e[q9A],attrAgentName:e[j9A],attrAgentDescription:e[V9A],attrEventId:e[J$],attrResponseFinishReasons:e[Wy],attrUsageInputTokens:e[Zy],attrUsageOutputTokens:e[Xy]};for(let t of Object.keys(A))A[t]===void 0&&delete A[t];return A}var $9A=XA.object({attrConversationId:XA.string({message:`'${T$}' is required on '${AN}' spans`})}),ASA=XA.object({attrEventId:XA.string({message:`'${J$}' is required on '${hI}' spans`}),attrInvocationId:XA.string({message:`'${O$}' is required on '${hI}' spans`})});function eN(i,e){for(let A of e)i.addIssue(A)}function $R(i,e,A){let t=X9A(i),n=Z9A.safeParse(t);if(!n.success)return eN(A,n.error.issues),null;if(e===null)return n.data;let o=e.safeParse(t);return o.success?P(P({},n.data),o.data):(eN(A,o.error.issues),null)}var Y$=XA.unknown().transform((i,e)=>{let A=W9A.safeParse(i);if(!A.success)return eN(e,A.error.issues),XA.NEVER;let t=A.data,n=t.attributes?.[P9A],B=t,{logs:o,attributes:a}=B,r=Pp(B,["logs","attributes"]),s=a!==void 0?{rawAttributesUseThisFieldOnlyForDisplay:a}:{rawAttributesUseThisFieldOnlyForDisplay:{}},l={rawSpanUseThisFieldOnlyForDisplay:i};if(n===AN){let u=$R(t,$9A,e);return u===null?XA.NEVER:$A(P(P(P(P({},r),s),l),u),{attrOperationName:AN})}if(n===hI){let u=$R(t,ASA,e);if(u===null)return XA.NEVER;let E=tD({attributes:t.attributes,logs:o});return P($A(P(P(P(P({},r),s),l),u),{attrOperationName:hI}),E!==void 0?{io:E}:{})}let g=$R(t,null,e);if(g===null)return XA.NEVER;let C=tD({attributes:t.attributes,logs:o});return P(P(P(P(P({},r),s),l),g),C!==void 0?{io:C}:{})});function tN(i){if(!i)return;let e=i.system_instruction;if(e===void 0&&i.systemInstruction&&(e=i.systemInstruction),e===void 0&&i.config&&(e=i.config.system_instruction!==void 0?i.config.system_instruction:i.config.systemInstruction),typeof e=="string")return e}var eSA=["sideDrawer"],tSA=["drawerSessionTab"],iSA=["appSearchInput"],nSA=["invChipMenuTrigger"],oSA=["nodeChipMenuTrigger"],aSA=["addMenuTrigger"],rSA=[[["","adk-web-chat-container-top",""]]],sSA=["[adk-web-chat-container-top]"],z$=()=>[],lSA=(i,e)=>e.metricName;function gSA(i,e){i&1&&dn(0)}function cSA(i,e){if(i&1&&kt(0,gSA,1,0,"ng-container",40),i&2){let A=p();H("ngComponentOutlet",A.logoComponent)}}function CSA(i,e){if(i&1&&(I(0,"span",45),D(1),h()),i&2){let A=p(2);Q(),Ee(" ",A.adkVersion())}}function dSA(i,e){if(i&1&&(I(0,"div",48)(1,"div",50)(2,"span",51),D(3,"Version:"),h(),I(4,"span",52),D(5),h()(),I(6,"div",50)(7,"span",51),D(8,"Language:"),h(),I(9,"span",52),D(10),h()(),I(11,"div",50)(12,"span",51),D(13,"Lang Version:"),h(),I(14,"span",52),D(15),h()()()),i&2){let A=p(2);Q(5),nA(A.versionInfo().version),Q(5),nA(A.versionInfo().language),Q(5),nA(A.versionInfo().language_version)}}function ISA(i,e){if(i&1&&(lA(0,"img",41),I(1,"div",42)(2,"div",43)(3,"span",44),D(4,"Agent Development Kit"),h(),T(5,CSA,2,1,"span",45),h(),I(6,"div",46)(7,"div",47),D(8),h(),T(9,dSA,16,3,"div",48),h()(),I(10,"span",49),D(11,"ADK"),h()),i&2){let A=p();Q(5),O(A.adkVersion()?5:-1),Q(3),nA(A.sidePanelI18n.disclosureTooltip),Q(),O(A.versionInfo()?9:-1)}}function BSA(i,e){i&1&&(I(0,"mat-icon",20),D(1,"warning"),h())}function hSA(i,e){if(i&1){let A=aA();I(0,"span",54)(1,"button",56),U("click",function(){L(A);let n=p(2);return G(n.openAgentStructureGraphDialog())}),I(2,"mat-icon"),D(3,"account_tree"),h()()()}if(i&2){let A=p(2);H("matTooltip",A.graphsAvailable()?"View Agent Structure Graph":"Agent structure graph is not available for this agent"),Q(),H("disabled",!A.graphsAvailable())}}function ESA(i,e){if(i&1){let A=aA();lA(0,"div",53),T(1,hSA,4,2,"span",54),I(2,"span",54)(3,"button",55),U("click",function(){L(A);let n=p();return G(n.enterBuilderMode())}),I(4,"mat-icon"),D(5,"edit"),h()()()}if(i&2){let A=p();Q(),O(A.graphsAvailable()?1:-1),Q(),H("matTooltip",A.disableBuilderSwitch?"Editing is not available for this agent because it was not built by the builder":"Edit in Builder Mode"),Q(),H("disabled",A.disableBuilderSwitch)}}function QSA(i,e){if(i&1){let A=aA();I(0,"div",57)(1,"mat-icon",62),D(2,"visibility"),h(),I(3,"span",63),D(4),h(),I(5,"button",64),U("click",function(){L(A);let n=p(2);return G(n.closeReadonlySession())}),I(6,"mat-icon",65),D(7,"close"),h()()()}if(i&2){let A=p(2);Q(4),Ya("",A.readonlySessionType(),": ",A.readonlySessionName())}}function uSA(i,e){if(i&1){let A=aA();I(0,"button",69),U("click",function(){L(A);let n=p(7);return G(n.onNewSessionClick())}),I(1,"mat-icon",18),D(2,"add_comment"),h(),I(3,"span"),D(4),h()()}if(i&2){let A=p(7);H("matTooltip",A.i18n.createNewSessionTooltip),Q(4),nA(A.i18n.newSessionButton)}}function pSA(i,e){if(i&1){let A=aA();I(0,"button",70),U("click",function(){L(A);let n=p(7);return G(n.onNewSessionClick())}),I(1,"mat-icon",18),D(2,"add_comment"),h()()}if(i&2){let A=p(7);H("matTooltip",A.i18n.createNewSessionTooltip)}}function fSA(i,e){if(i&1&&(lA(0,"div",53),T(1,uSA,5,2,"button",67)(2,pSA,3,1,"button",68)),i&2){let A=p(6);Q(),O(A.uiEvents().length>0&&!A.isMobile()?1:2)}}function mSA(i,e){if(i&1&&T(0,fSA,3,1),i&2){let A=p(5);O(A.sessionId?0:-1)}}function wSA(i,e){if(i&1&&(T(0,mSA,1,1),mt(1,"async")),i&2){let A=p(4);O(Ft(1,1,A.isNewSessionButtonEnabledObs)?0:-1)}}function ySA(i,e){if(i&1&&(ro(0),mt(1,"async"),T(2,wSA,2,3)),i&2){let A=Ft(1,1,p(3).uiStateService.isSessionLoading());Q(2),O(A===!1?2:-1)}}function DSA(i,e){if(i&1){let A=aA();I(0,"div",16)(1,"button",66),U("click",function(){L(A);let n=p(2);return G(n.toggleSessionSelectorDrawer())}),I(2,"mat-icon",18),D(3,"chat"),h(),I(4,"span",19),D(5),h(),I(6,"mat-icon",21),D(7,"arrow_drop_down"),h()(),T(8,ySA,3,3),h()}if(i&2){let A=p(2);Q(5),nA(A.getToolbarSessionId()),Q(3),O(A.evalCase?-1:8)}}function vSA(i,e){if(i&1&&(I(0,"div",57)(1,"span",63),D(2),h(),I(3,"span",71),D(4),h()()),i&2){let A=p(3);Q(2),nA(A.i18n.evalCaseIdLabel),Q(2),nA(A.evalCase.evalId)}}function bSA(i,e){if(i&1){let A=aA();I(0,"button",72),U("click",function(){L(A);let n=p(3);return G(n.cancelEditEvalCase())}),D(1),h(),I(2,"button",73),U("click",function(){L(A);let n=p(3);return G(n.saveEvalCase())}),D(3),h()}if(i&2){let A=p(3);Q(),Ee(" ",A.i18n.cancelButton," "),Q(),H("disabled",!A.hasEvalCaseChanged()||A.isEvalCaseEditing()),Q(),Ee(" ",A.i18n.saveButton," ")}}function MSA(i,e){}function SSA(i,e){if(i&1&&(T(0,vSA,5,2,"div",57),I(1,"div",60),T(2,bSA,4,3)(3,MSA,0,0),h()),i&2){let A=p(2);O(A.isViewOnlySession()?-1:0),Q(2),O(A.isEvalEditMode()?2:3)}}function kSA(i,e){}function _SA(i,e){if(i&1&&(I(0,"div",74),D(1),h()),i&2){let A=p(3);Q(),nA(A.i18n.loadingSessionLabel)}}function xSA(i,e){if(i&1&&(I(0,"div",59),ro(1),mt(2,"async"),T(3,kSA,0,0)(4,_SA,2,1,"div",74),h()),i&2){let A=Ft(2,1,p(2).uiStateService.isSessionLoading());Q(3),O(A===!1?3:4)}}function RSA(i,e){if(i&1){let A=aA();I(0,"button",75),U("click",function(){L(A);let n=p(2);return G(n.themeService==null?null:n.themeService.toggleTheme())}),I(1,"mat-icon"),D(2),h()()}if(i&2){let A=p(2);H("matTooltip",(A.themeService==null?null:A.themeService.currentTheme())==="dark"?"Switch to Light Mode":"Switch to Dark Mode"),Q(2),nA((A.themeService==null?null:A.themeService.currentTheme())==="dark"?"light_mode":"dark_mode")}}function NSA(i,e){if(i&1&&(I(0,"div",22),T(1,QSA,8,2,"div",57)(2,DSA,9,2,"div",16),I(3,"div",58),T(4,SSA,4,2)(5,xSA,5,3,"div",59),h(),I(6,"div",60),ro(7),mt(8,"async"),T(9,RSA,3,2,"button",61),h()()),i&2){let A=p();Q(),O(A.isViewOnlySession()?1:2),Q(3),O(A.evalCase?4:5);let t=Ft(8,3,A.uiStateService.isSessionLoading());Q(5),O(t===!1?9:-1)}}function FSA(i,e){i&1&&(I(0,"div",85),lA(1,"mat-progress-spinner",86),h())}function LSA(i,e){i&1&&(I(0,"mat-icon",92),D(1,"check"),h())}function GSA(i,e){if(i&1){let A=aA();I(0,"button",89),U("click",function(){let n=L(A).$implicit,o=p(3);return G(o.selectAppFromDrawer(n))}),I(1,"mat-icon",90),D(2,"robot_2"),h(),I(3,"span",91),D(4),h(),T(5,LSA,2,0,"mat-icon",92),h()}if(i&2){let A=e.$implicit,t=p(3);_A("selected",A===t.appName),Q(4),nA(A),Q(),O(A===t.appName?5:-1)}}function KSA(i,e){i&1&&(I(0,"div",88),D(1,"No apps found"),h())}function USA(i,e){i&1&&ke(0,GSA,6,4,"button",87,ni,!1,KSA,2,0,"div",88),i&2&&_e(e)}function TSA(i,e){if(i&1){let A=aA();I(0,"div",76)(1,"span",77),D(2,"Select an App"),h(),I(3,"div")(4,"button",78),U("click",function(){L(A);let n=p();return G(n.openAddItemDialog())}),I(5,"mat-icon"),D(6,"add"),h()(),I(7,"button",79),U("click",function(){L(A);let n=p();return G(n.toggleAppSelectorDrawer())}),I(8,"mat-icon"),D(9,"close"),h()()()(),I(10,"div",80)(11,"mat-form-field",81)(12,"mat-icon",82),D(13,"search"),h(),I(14,"input",83,3),U("keydown",function(n){L(A);let o=p();return G(o.handleAppSearchKeydown(n))}),h()()(),I(16,"div",84),U("keydown",function(n){L(A);let o=p();return G(o.handleAppListKeydown(n))}),T(17,FSA,2,0,"div",85),mt(18,"async"),S1(19,USA,3,1),h()}if(i&2){let A,t=p();Q(14),H("formControl",t.appDrawerSearchControl),Q(3),O(t.isLoadingApps()?17:(A=Ft(18,2,t.filteredDrawerApps$))?19:-1,A)}}function OSA(i,e){if(i&1){let A=aA();I(0,"button",95),U("click",function(){L(A);let n=p(2);return G(n.importSession())}),I(1,"mat-icon"),D(2,"upload"),h(),I(3,"span"),D(4,"Import"),h()()}if(i&2){let A=p(2);H("matTooltip",A.i18n.importSessionTooltip)}}function JSA(i,e){if(i&1){let A=aA();I(0,"button",108),U("click",function(){L(A);let n=p(3);return G(n.exportSession())}),I(1,"mat-icon"),D(2,"download"),h(),I(3,"span"),D(4,"Export"),h()()}if(i&2){let A=p(3);H("matTooltip",A.i18n.exportSessionTooltip)}}function YSA(i,e){if(i&1){let A=aA();I(0,"button",109),U("click",function(){L(A);let n=p(3);return G(n.deleteSession(n.sessionId))}),I(1,"mat-icon"),D(2,"delete"),h(),I(3,"span"),D(4,"Delete"),h()()}if(i&2){let A=p(3);H("matTooltip",A.i18n.deleteSessionTooltip)}}function HSA(i,e){if(i&1){let A=aA();I(0,"div",97)(1,"span",100),D(2,"Current Session"),h(),I(3,"div",101)(4,"app-inline-edit",102),U("save",function(n){L(A);let o=p(2);return G(o.saveSessionName(n))}),h()(),I(5,"div",103)(6,"span",104),D(7),h(),I(8,"button",105),U("click",function(){L(A);let n=p(2);return G(n.copySessionId())}),I(9,"mat-icon"),D(10,"content_copy"),h()(),T(11,JSA,5,1,"button",106),mt(12,"async"),T(13,YSA,5,1,"button",107),mt(14,"async"),h()()}if(i&2){let A=p(2);Q(4),H("value",A.sessionDisplayNameDraft)("displayValue",A.getCurrentSessionDisplayName())("tooltip",A.sessionId),Q(2),H("title",A.sessionId),Q(),nA(A.sessionId),Q(4),O(Ft(12,7,A.isExportSessionEnabledObs)?11:-1),Q(2),O(Ft(14,9,A.isDeleteSessionEnabledObs)?13:-1)}}function zSA(i,e){if(i&1){let A=aA();I(0,"div",76)(1,"span",77),D(2,"Select a Session"),h(),I(3,"div",93),T(4,OSA,5,1,"button",94),mt(5,"async"),I(6,"button",95),U("click",function(){L(A);let n=p();return G(n.viewSession())}),I(7,"mat-icon"),D(8,"visibility"),h(),I(9,"span"),D(10,"View"),h()(),I(11,"button",96),U("click",function(){L(A);let n=p();return G(n.toggleSessionSelectorDrawer())}),I(12,"mat-icon"),D(13,"close"),h()()()(),T(14,HSA,15,11,"div",97),I(15,"div",98)(16,"app-session-tab",99,4),U("sessionSelected",function(n){L(A);let o=p();return G(o.onSessionSelectedFromDrawer(n))})("sessionReloaded",function(n){L(A);let o=p();return G(o.onSessionReloadedFromDrawer(n))}),h()()}if(i&2){let A=p();Q(4),O(Ft(5,6,A.importSessionEnabledObs)?4:-1),Q(2),H("matTooltip",A.i18n.viewSessionTooltip),Q(8),O(A.sessionId?14:-1),Q(2),H("userId",A.userId)("appName",A.appName)("sessionId",A.sessionId)}}function PSA(i,e){if(i&1){let A=aA();I(0,"app-side-panel",110),U("jumpToInvocation",function(n){L(A);let o=p();return G(o.handleJumpToInvocation(n))})("closePanel",function(){L(A);let n=p();return G(n.toggleSidePanel())})("tabChange",function(n){L(A);let o=p();return G(o.handleTabChange(n))})("sessionSelected",function(n){L(A);let o=p();return G(o.updateWithSelectedSession(n))})("evalCaseSelected",function(n){L(A);let o=p();return G(o.updateWithSelectedEvalCase(n))})("editEvalCaseRequested",function(n){L(A);let o=p();return G(o.handleEditEvalCaseRequested(n))})("testSelected",function(n){L(A);let o=p();return G(o.updateWithSelectedTest(n.testName,n.events))})("evalSetIdSelected",function(n){L(A);let o=p();return G(o.updateSelectedEvalSetId(n))})("returnToSession",function(n){L(A);let o=p();return G(o.handleReturnToSession(n))})("evalNotInstalled",function(n){L(A);let o=p();return G(o.handleEvalNotInstalled(n))})("page",function(n){L(A);let o=p();return G(o.handlePageEvent(n))})("closeSelectedEvent",function(){L(A);let n=p();return G(n.closeSelectedEvent())})("openImageDialog",function(n){L(A);let o=p();return G(o.openViewImageDialog(n))})("openAddItemDialog",function(){L(A);let n=p();return G(n.openAddItemDialog())})("enterBuilderMode",function(){L(A);let n=p();return G(n.enterBuilderMode())})("showAgentStructureGraph",function(){L(A);let n=p();return G(n.openAgentStructureGraphDialog("event"))})("switchToEvent",function(n){L(A);let o=p();return G(o.selectEvent(n))})("switchToTraceView",function(){L(A);let n=p();return G(n.switchToTraceView())})("drillDownNodePath",function(n){L(A);let o=p();return G(o.onEventTabDrillDown(n))})("selectEventById",function(n){L(A);let o=p();return G(o.selectEvent(n))}),h()}if(i&2){let A=p();H("isApplicationSelectorEnabledObs",A.isApplicationSelectorEnabledObs)("showSidePanel",A.showSidePanel)("appName",A.appName)("userId",A.userId)("sessionId",A.sessionId)("isViewOnlySession",A.isViewOnlySession())("isViewOnlyAppNameMismatch",A.isViewOnlyAppNameMismatch())("traceData",A.traceData)("eventData",A.eventData)("currentSessionState",A.currentSessionState)("artifacts",A.artifacts)("selectedEvent",A.selectedEvent)("selectedEventIndex",A.selectedEventIndex)("renderedEventGraph",A.renderedEventGraph)("rawSvgString",A.rawSvgString)("selectedEventGraphPath",A.selectedEventGraphPath)("llmRequest",A.llmRequest)("llmResponse",A.llmResponse)("disableBuilderIcon",A.disableBuilderSwitch)("hasSubWorkflows",A.hasSubWorkflows)("graphsAvailable",A.graphsAvailable())("invocationDisplayMap",A.invocationDisplayMap())("forceGraphTab",A.autoSelectLatestEvent)}}function jSA(i,e){if(i&1){let A=aA();I(0,"app-builder-tabs",111),U("exitBuilderMode",function(){L(A);let n=p();return G(n.exitBuilderMode())})("closePanel",function(){L(A);let n=p();return G(n.toggleSidePanel())}),h(),lA(1,"div",112)}if(i&2){let A=p();H("appNameInput",A.appName)}}function VSA(i,e){if(i&1){let A=aA();I(0,"div",37)(1,"div",113)(2,"button",114),U("click",function(){L(A);let n=p();return G(n.saveAgentBuilder())}),I(3,"mat-icon"),D(4,"check"),h()(),I(5,"button",115),U("click",function(){L(A);let n=p();return G(n.exitBuilderMode())}),I(6,"mat-icon"),D(7,"close"),h()(),I(8,"button",116),U("click",function(){L(A);let n=p();return G(n.toggleBuilderAssistant())}),I(9,"mat-icon"),D(10,"assistant"),h()()(),I(11,"app-canvas",117),U("toggleSidePanelRequest",function(){L(A);let n=p();return G(n.toggleSidePanel())})("builderAssistantCloseRequest",function(){L(A);let n=p();return G(n.toggleBuilderAssistant())}),h()()}if(i&2){let A=p();Q(8),_A("active",A.showBuilderAssistant),Q(3),H("showSidePanel",A.showSidePanel)("showBuilderAssistant",A.showBuilderAssistant)("appNameInput",A.appName)}}function qSA(i,e){if(i&1&&(I(0,"div",119)(1,"span"),D(2),h()()),i&2){let A=p(3);Q(2),nA(A.i18n.loadingAgentsLabel)}}function WSA(i,e){if(i&1&&(I(0,"span"),D(1),lA(2,"br"),D(3),h()),i&2){let A=p(4);Q(),nA(A.i18n.welcomeMessage),Q(2),Ee(" ",A.i18n.selectAgentMessage)}}function ZSA(i,e){if(i&1&&(D(0),lA(1,"br"),I(2,"pre",121),D(3),h()),i&2){let A=p(5);Ee(" ",A.i18n.errorMessageLabel," "),Q(3),nA(A.loadingError())}}function XSA(i,e){if(i&1&&(I(0,"pre",120),D(1),h()),i&2){let A=p(5);Q(),nA(A.i18n.noAgentsFoundWarning)}}function $SA(i,e){if(i&1&&(I(0,"div"),D(1),I(2,"pre"),D(3,"adk web"),h(),D(4," in the folder that contains the agents."),lA(5,"br"),T(6,ZSA,4,2)(7,XSA,2,1,"pre",120),h()),i&2){let A=p(4);Q(),Ee(" ",A.i18n.failedToLoadAgentsMessage," "),Q(5),O(A.loadingError()?6:7)}}function AkA(i,e){if(i&1&&(I(0,"div",119),T(1,WSA,4,2,"span"),mt(2,"async"),S1(3,$SA,8,2,"div"),h()),i&2){let A=p(3);Q(),O((Ft(2,1,A.apps$)||Lc(3,z$)).length>0?1:3)}}function ekA(i,e){if(i&1&&(T(0,qSA,3,1,"div",119),mt(1,"async"),S1(2,AkA,4,4,"div",119)),i&2){let A=p(2);O(A.isLoadingApps()?0:Ft(1,1,A.isApplicationSelectorEnabledObs)?2:-1)}}function tkA(i,e){if(i&1){let A=aA();I(0,"div",145,8),U("click",function(n){return n.stopPropagation()}),I(2,"span",146),D(3),h(),I(4,"button",147),U("click",function(n){L(A);let o=p(4);return G(o.removeInvocationIdFilter(n))}),I(5,"mat-icon"),D(6,"close"),h()()()}if(i&2){p();let A=Bi(17),t=p(3);H("matMenuTriggerFor",A)("matTooltip",t.invocationIdFilter()?"Invocation: "+(t.invocationDisplayMap().get(t.invocationIdFilter())||t.invocationIdFilter()):"Filter events by a specific invocation"),Q(2),H("title",t.invocationIdFilter()?t.invocationDisplayMap().get(t.invocationIdFilter())||t.invocationIdFilter():"Invocation"),Q(),nA(t.invocationIdFilter()?t.invocationDisplayMap().get(t.invocationIdFilter())||t.invocationIdFilter():"Invocation")}}function ikA(i,e){if(i&1){let A=aA();I(0,"div",145,9),U("click",function(n){return n.stopPropagation()}),I(2,"span",63),D(3,"Node"),h(),I(4,"button",147),U("click",function(n){L(A);let o=p(4);return G(o.removeNodePathFilter(n))}),I(5,"mat-icon"),D(6,"close"),h()()()}if(i&2){p();let A=Bi(21),t=p(3);H("matMenuTriggerFor",A)("matTooltip",t.nodePathFilter()?"Node: "+t.nodePathFilter():"Filter events generated by a specific node")}}function nkA(i,e){if(i&1){let A=aA();I(0,"div",148),U("click",function(n){return n.stopPropagation()}),I(1,"span",63),D(2,"Final"),h(),I(3,"button",147),U("click",function(n){return L(A),p(4).toggleHideIntermediateEvents(),G(n.stopPropagation())}),I(4,"mat-icon"),D(5,"close"),h()()()}}function okA(i,e){if(i&1&&(I(0,"button",149,10),U("click",function(t){return t.stopPropagation()}),I(2,"mat-icon"),D(3,"add"),h(),I(4,"span"),D(5,"Filter"),h()()),i&2){p();let A=Bi(12);H("matMenuTriggerFor",A)}}function akA(i,e){if(i&1){let A=aA();I(0,"button",150),U("click",function(n){L(A);let o=p(4);return G(o.clearAllFilters(n))}),I(1,"mat-icon"),D(2,"clear_all"),h(),I(3,"span"),D(4,"Clear"),h()()}}function rkA(i,e){if(i&1){let A=aA();I(0,"button",151),U("click",function(){L(A);let n=p(4);return G(n.addInvocationIdFilter())}),D(1,"Invocation"),h()}}function skA(i,e){if(i&1){let A=aA();I(0,"button",152),U("click",function(){L(A);let n=p(4);return G(n.addNodePathFilter())}),D(1,"Node"),h()}}function lkA(i,e){if(i&1){let A=aA();I(0,"button",153),U("click",function(){L(A);let n=p(4);return G(n.toggleHideIntermediateEvents())}),D(1,"Final"),h()}}function gkA(i,e){if(i&1){let A=aA();I(0,"button",154),U("click",function(){let n=L(A).$implicit,o=p(4);return G(o.setInvocationIdFilter(n))}),I(1,"mat-icon",155),D(2,"check"),h(),D(3),h()}if(i&2){let A=e.$implicit,t=p(4);H("matTooltip",A),Q(),ft("visibility",t.invocationIdFilter()===A?"visible":"hidden"),Q(2),Ee(" ",t.invocationDisplayMap().get(A)||A," ")}}function ckA(i,e){if(i&1){let A=aA();I(0,"button",156),U("click",function(){let n=L(A).$implicit,o=p(4);return G(o.setNodePathFilter(n))}),I(1,"mat-icon",155),D(2,"check"),h(),D(3),h()}if(i&2){let A=e.$implicit,t=p(4);Q(),ft("visibility",t.nodePathFilter()===A?"visible":"hidden"),Q(2),Ee(" ",A," ")}}function CkA(i,e){if(i&1){let A=aA();I(0,"mat-button-toggle-group",130),U("change",function(n){L(A);let o=p(3);return G(o.onViewModeChange(n.value))}),I(1,"mat-button-toggle",131),D(2,"Events"),h(),I(3,"mat-button-toggle",132),D(4,"Traces"),h()(),I(5,"div",133),U("click",function(n){L(A);let o=p(3);return G(o.openAddFilterMenu(n))}),T(6,tkA,7,4,"div",134),T(7,ikA,7,2,"div",134),T(8,nkA,6,0,"div",135),T(9,okA,6,1,"button",136),T(10,akA,5,0,"button",137),h(),I(11,"mat-menu",138,5),T(13,rkA,2,0,"button",139),T(14,skA,2,0,"button",140),T(15,lkA,2,0,"button",141),h(),I(16,"mat-menu",142,6),U("closed",function(){L(A);let n=p(3);return G(n.onInvocationMenuClosed())}),ke(18,gkA,4,4,"button",143,ni),h(),I(20,"mat-menu",142,7),U("closed",function(){L(A);let n=p(3);return G(n.onNodePathMenuClosed())}),ke(22,ckA,4,3,"button",144,ni),h()}if(i&2){let A=p(3);H("value",A.viewMode()),Q(6),O(A.invocationIdFilterActive()?6:-1),Q(),O(A.nodePathFilterActive()?7:-1),Q(),O(A.hideIntermediateEvents()?8:-1),Q(),O(!A.invocationIdFilterActive()||!A.nodePathFilterActive()||!A.hideIntermediateEvents()?9:-1),Q(),O(A.invocationIdFilterActive()||A.nodePathFilterActive()||A.hideIntermediateEvents()?10:-1),Q(3),O(A.invocationIdFilterActive()?-1:13),Q(),O(A.nodePathFilterActive()?-1:14),Q(),O(A.hideIntermediateEvents()?-1:15),Q(3),_e(A.invocationIdOptions()),Q(4),_e(A.nodePathOptions())}}function dkA(i,e){i&1&&(I(0,"span",123),D(1,"README.md"),h())}function IkA(i,e){if(i&1){let A=aA();I(0,"button",157),U("click",function(){L(A);let n=p(3);return G(n.isSideBySide.set(!n.isSideBySide()))}),I(1,"mat-icon",158),D(2),h(),I(3,"span",159),D(4,"Compare"),h()()}if(i&2){let A=p(3);ft("color",A.isSideBySide()?"var(--mat-sys-primary)":"var(--mat-sys-on-surface-variant)"),Q(2),nA(A.isSideBySide()?"check_circle":"radio_button_unchecked")}}function BkA(i,e){if(i&1){let A=aA();I(0,"button",156),U("click",function(n){L(A);let o=p(4);return o.showBranches.set(!o.showBranches()),G(n.stopPropagation())}),I(1,"mat-icon",162),D(2),h(),I(3,"span",163),D(4,"Branches"),h()()}if(i&2){let A=p(4);Q(),ft("color",A.showBranches()?"var(--mat-sys-primary)":"var(--mat-sys-on-surface-variant)"),Q(),Ee(" ",A.showBranches()?"check_box":"check_box_outline_blank"," ")}}function hkA(i,e){if(i&1){let A=aA();I(0,"button",156),U("click",function(n){return L(A),p(4).toggleSse(),G(n.stopPropagation())}),I(1,"mat-icon",162),D(2),h(),I(3,"span",163),D(4,"Streaming"),h()()}if(i&2){let A=p(4);Q(),ft("color",A.useSse()?"var(--mat-sys-primary)":"var(--mat-sys-on-surface-variant)"),Q(),Ee(" ",A.useSse()?"check_box":"check_box_outline_blank"," ")}}function EkA(i,e){if(i&1&&(I(0,"button",160)(1,"mat-icon"),D(2,"more_vert"),h()(),I(3,"mat-menu",161,11),T(5,BkA,5,3,"button",144),T(6,hkA,5,3,"button",144),h()),i&2){let A=Bi(4);p();let t=Ki(10),n=Ki(11),o=p(2);H("matMenuTriggerFor",A)("matTooltip",o.i18n.moreOptionsTooltip),Q(5),O(t?5:-1),Q(),O(n?6:-1)}}function QkA(i,e){if(i&1){let A=aA();I(0,"app-chat-panel",164),mt(1,"async"),Ni("userInputChange",function(n){L(A);let o=p(3);return wi(o.userInput,n)||(o.userInput=n),G(n)}),U("toggleHideIntermediateEvents",function(){L(A);let n=p(3);return G(n.toggleHideIntermediateEvents())})("toggleSse",function(){L(A);let n=p(3);return G(n.toggleSse())})("clickEvent",function(n){L(A);let o=p(3);return G(o.clickEvent(n))})("handleKeydown",function(n){L(A);let o=p(3);return G(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){L(A);let o=p(3);return G(o.cancelEditMessage(n))})("saveEditMessage",function(n){L(A);let o=p(3);return G(o.saveEditMessage(n))})("openViewImageDialog",function(n){L(A);let o=p(3);return G(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){L(A);let o=p(3);return G(o.openBase64InNewTab(n.data,n.mimeType))})("fileSelect",function(n){L(A);let o=p(3);return G(o.onFileSelect(n))})("removeFile",function(n){L(A);let o=p(3);return G(o.removeFile(n))})("removeStateUpdate",function(){L(A);let n=p(3);return G(n.removeStateUpdate())})("sendMessage",function(n){L(A);let o=p(3);return G(o.handleChatInput(n))})("stopMessage",function(){L(A);let n=p(3);return G(n.handleStopMessage())})("updateState",function(){L(A);let n=p(3);return G(n.updateState())})("toggleAudioRecording",function(n){L(A);let o=p(3);return G(o.toggleAudioRecording(n))})("toggleVideoRecording",function(){L(A);let n=p(3);return G(n.toggleVideoRecording())})("longRunningResponseComplete",function(n){L(A);let o=p(3);return G(o.sendMessage(n))})("manualScroll",function(){L(A);let n=p(3);return G(n.onManualScroll())}),h()}if(i&2){let A=p(3);H("appName",A.appName)("agentReadme",A.agentReadme),Ri("userInput",A.userInput),H("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("showBranches",A.showBranches())("traceData",A.traceData)("isTokenStreamingEnabled",Ft(1,23,A.isTokenStreamingEnabledObs)??!1)("useSse",A.useSse())("isChatMode",!0)("selectedFiles",A.selectedFiles)("updatedSessionState",A.updatedSessionState())("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("isAudioRecording",A.isAudioRecording)("micVolume",A.micVolume())("isVideoRecording",A.isVideoRecording)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function ukA(i,e){if(i&1){let A=aA();I(0,"app-chat-panel",165),mt(1,"async"),Ni("userInputChange",function(n){L(A);let o=p(3);return wi(o.userInput,n)||(o.userInput=n),G(n)})("userEditEvalCaseMessageChange",function(n){L(A);let o=p(3);return wi(o.userEditEvalCaseMessage,n)||(o.userEditEvalCaseMessage=n),G(n)}),U("clickEvent",function(n){L(A);let o=p(3);return G(o.clickEvent(n))})("handleKeydown",function(n){L(A);let o=p(3);return G(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){L(A);let o=p(3);return G(o.cancelEditMessage(n))})("saveEditMessage",function(n){L(A);let o=p(3);return G(o.saveEditMessage(n))})("openViewImageDialog",function(n){L(A);let o=p(3);return G(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){L(A);let o=p(3);return G(o.openBase64InNewTab(n.data,n.mimeType))})("editEvalCaseMessage",function(n){L(A);let o=p(3);return G(o.editEvalCaseMessage(n))})("deleteEvalCaseMessage",function(n){L(A);let o=p(3);return G(o.deleteEvalCaseMessage(n.message,n.index))})("editFunctionArgs",function(n){L(A);let o=p(3);return G(o.editFunctionArgs(n))}),h()}if(i&2){let A=p(3);H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("showBranches",A.showBranches())("isChatMode",!1)("evalCase",A.evalCase)("isEvalEditMode",A.isEvalEditMode())("isEvalCaseEditing",A.isEvalCaseEditing())("isEditFunctionArgsEnabled",Ft(1,20,A.isEditFunctionArgsEnabledObs)??!1),Ri("userInput",A.userInput)("userEditEvalCaseMessage",A.userEditEvalCaseMessage),H("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function pkA(i,e){if(i&1&&(I(0,"div",179),D(1),h()),i&2){p();let A=Ki(40);Q(),Ee(" ",A)}}function fkA(i,e){if(i&1&&(I(0,"div",171)(1,"span",172),D(2),mt(3,"formatMetricName"),h(),I(4,"div",173)(5,"span",174),D(6),mt(7,"number"),h(),I(8,"span",175),D(9),mt(10,"number"),h()(),I(11,"div",176)(12,"div",177),D(13),mt(14,"formatMetricName"),h(),I(15,"div",178),D(16),h(),I(17,"div",48)(18,"div",50)(19,"span",51),D(20,"Actual:"),h(),I(21,"span",52),D(22),mt(23,"number"),h()(),I(24,"div",50)(25,"span",51),D(26,"Threshold:"),h(),I(27,"span",52),D(28),mt(29,"number"),h()(),I(30,"div",50)(31,"span",51),D(32,"Min:"),h(),I(33,"span",52),D(34),h()(),I(35,"div",50)(36,"span",51),D(37,"Max:"),h(),I(38,"span",52),D(39),h()()(),ro(40),T(41,pkA,2,1,"div",179),h()()),i&2){let A=e.$implicit,t=p(6);ft("border",A.evalStatus==1?"1px solid #2e7d32":"1px solid var(--mat-sys-error)"),Q(2),nA(Ft(3,16,A.metricName)),Q(3),ft("color",A.evalStatus==1?"#2e7d32":"var(--mat-sys-error)"),Q(),Ee(" ",A.score!=null?G0(7,18,A.score,"1.2-2"):"?"," "),Q(3),Ee(" / ",G0(10,21,A.threshold,"1.2-2")," "),Q(4),nA(Ft(14,24,A.metricName)),Q(3),nA(A.metricName),Q(5),ft("color",A.evalStatus==1?"#2e7d32":"var(--mat-sys-error)"),Q(),nA(A.score!=null?G0(23,26,A.score,"1.2-2"):"?"),Q(6),nA(G0(29,29,A.threshold,"1.2-2")),Q(6),nA(t.getMetricMin(A.metricName)),Q(5),nA(t.getMetricMax(A.metricName)),Q();let n=so(t.getMetricDescription(A.metricName));Q(),O(n?41:-1)}}function mkA(i,e){if(i&1&&(I(0,"div",169),ke(1,fkA,42,33,"div",170,lSA),h()),i&2){p();let A=Ki(0);Q(),_e(A.overallEvalMetricResults)}}function wkA(i,e){if(i&1&&(ro(0),I(1,"div",166),T(2,mkA,3,0,"div",169),h()),i&2){let A=so(p(4).evalCaseResult());Q(2),O(A.overallEvalMetricResults!=null&&A.overallEvalMetricResults.length?2:-1)}}function ykA(i,e){if(i&1){let A=aA();I(0,"div",167)(1,"div",180)(2,"div",181),D(3,"Expected"),h(),I(4,"app-chat-panel",182),U("manualScroll",function(){L(A);let n=p(4);return G(n.onManualScroll())}),h()(),I(5,"div",180)(6,"div",181),D(7,"Actual"),h(),I(8,"app-chat-panel",183),mt(9,"async"),mt(10,"async"),U("toggleHideIntermediateEvents",function(){L(A);let n=p(4);return G(n.toggleHideIntermediateEvents())})("toggleSse",function(){L(A);let n=p(4);return G(n.toggleSse())}),Ni("userInputChange",function(n){L(A);let o=p(4);return wi(o.userInput,n)||(o.userInput=n),G(n)})("userEditEvalCaseMessageChange",function(n){L(A);let o=p(4);return wi(o.userEditEvalCaseMessage,n)||(o.userEditEvalCaseMessage=n),G(n)}),U("clickEvent",function(n){L(A);let o=p(4);return G(o.clickEvent(n))})("handleKeydown",function(n){L(A);let o=p(4);return G(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){L(A);let o=p(4);return G(o.cancelEditMessage(n))})("saveEditMessage",function(n){L(A);let o=p(4);return G(o.saveEditMessage(n))})("openViewImageDialog",function(n){L(A);let o=p(4);return G(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){L(A);let o=p(4);return G(o.openBase64InNewTab(n.data,n.mimeType))})("editEvalCaseMessage",function(n){L(A);let o=p(4);return G(o.editEvalCaseMessage(n))})("deleteEvalCaseMessage",function(n){L(A);let o=p(4);return G(o.deleteEvalCaseMessage(n.message,n.index))})("editFunctionArgs",function(n){L(A);let o=p(4);return G(o.editFunctionArgs(n))})("fileSelect",function(n){L(A);let o=p(4);return G(o.onFileSelect(n))})("removeFile",function(n){L(A);let o=p(4);return G(o.removeFile(n))})("removeStateUpdate",function(){L(A);let n=p(4);return G(n.removeStateUpdate())})("sendMessage",function(n){L(A);let o=p(4);return G(o.handleChatInput(n))})("updateState",function(){L(A);let n=p(4);return G(n.updateState())})("toggleAudioRecording",function(n){L(A);let o=p(4);return G(o.toggleAudioRecording(n))})("toggleVideoRecording",function(){L(A);let n=p(4);return G(n.toggleVideoRecording())})("longRunningResponseComplete",function(n){L(A);let o=p(4);return G(o.sendMessage(n))})("manualScroll",function(){L(A);let n=p(4);return G(n.onManualScroll())}),h()()()}if(i&2){let A=p(4);Q(4),H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredExpectedUiEvents())("showBranches",A.showBranches())("isChatMode",!1)("evalCase",A.evalCase)("isEvalEditMode",!1)("isEvalCaseEditing",!1)("isEditFunctionArgsEnabled",!1)("userInput","")("selectedFiles",Lc(56,z$))("updatedSessionState",null)("agentGraphData",A.agentGraphData())("selectedMessageIndex",-1)("isAudioRecording",!1)("micVolume",0)("isVideoRecording",!1)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn),Q(4),H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("showBranches",A.showBranches())("traceData",A.traceData)("isTokenStreamingEnabled",Ft(9,52,A.isTokenStreamingEnabledObs)??!1)("useSse",A.useSse())("isChatMode",!1)("evalCase",A.evalCase)("isEvalEditMode",A.isEvalEditMode())("isEvalCaseEditing",A.isEvalCaseEditing())("isEditFunctionArgsEnabled",Ft(10,54,A.isEditFunctionArgsEnabledObs)??!1),Ri("userInput",A.userInput)("userEditEvalCaseMessage",A.userEditEvalCaseMessage),H("selectedFiles",A.selectedFiles)("updatedSessionState",A.updatedSessionState())("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("isAudioRecording",A.isAudioRecording)("micVolume",A.micVolume())("isVideoRecording",A.isVideoRecording)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function DkA(i,e){if(i&1){let A=aA();I(0,"app-chat-panel",184),U("manualScroll",function(){L(A);let n=p(4);return G(n.onManualScroll())}),h()}if(i&2){let A=p(4);H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("showBranches",A.showBranches())("traceData",A.traceData)("isChatMode",!1)("evalCase",A.evalCase)("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function vkA(i,e){if(i&1&&(T(0,wkA,3,2,"div",166),T(1,ykA,11,57,"div",167)(2,DkA,1,16,"app-chat-panel",168)),i&2){let A=p(3);O(A.evalCaseResult()?0:-1),Q(),O(A.isSideBySide()?1:2)}}function bkA(i,e){i&1&&(I(0,"div",129)(1,"mat-icon",185),D(2,"insert_drive_file"),h(),I(3,"h3",186),D(4,"File View"),h(),I(5,"p",187),D(6,"File content lost on refresh. Please re-upload the file to view or use it."),h()())}function MkA(i,e){if(i&1){let A=aA();I(0,"div",122),T(1,CkA,24,9)(2,dkA,2,0,"span",123),lA(3,"div",124),I(4,"button",125),mt(5,"async"),U("click",function(){L(A);let n=p(2);return G(n.refreshLatestSession())}),I(6,"mat-icon",18),mt(7,"async"),D(8,"refresh"),h()(),T(9,IkA,5,3,"button",126),ro(10)(11),mt(12,"async"),T(13,EkA,7,4),h(),T(14,QkA,2,25,"app-chat-panel",127)(15,ukA,2,22,"app-chat-panel",128)(16,vkA,3,2)(17,bkA,7,0,"div",129)}if(i&2){let A,t=p(2);Q(),O(t.uiEvents().length===0&&t.agentReadme?2:1),Q(3),H("matTooltip",t.i18n.retrieveLatestSessionTooltip)("disabled",Ft(5,8,t.uiStateService.isSessionLoading())===!0),Q(2),_A("spinning",Ft(7,10,t.uiStateService.isSessionLoading())),Q(3),O(t.chatType()==="eval-result"?9:-1),Q();let n=so(t.viewMode()!=="traces");Q();let o=so(Ft(12,13,t.isTokenStreamingEnabledObs)&&t.canEditSession());Q(2),O(n||o?13:-1),Q(),O((A=t.chatType())==="session"?14:A==="eval-case"?15:A==="eval-result"?16:A==="file"?17:-1)}}function SkA(i,e){if(i&1&&(I(0,"div",38),Ze(1),I(2,"mat-card",118),T(3,ekA,3,3),T(4,MkA,18,16),h()()),i&2){let A=p();Q(2),_A("no-side-panel",!A.showSidePanel),Q(),O(A.selectedAppControl.value?-1:3),Q(),O(A.appName!=""?4:-1)}}function kkA(i,e){if(i&1){let A=aA();I(0,"app-agent-structure-graph-dialog",188),U("close",function(){L(A);let n=p();return G(n.showAgentStructureOverlay=!1)}),h()}if(i&2){let A=p();H("appName",A.appName)("preloadedAppData",A.agentGraphData())("preloadedLightGraphSvg",A.agentStructureOverlayMode==="event"?A.eventGraphSvgLight:A.sessionGraphSvgLight)("preloadedDarkGraphSvg",A.agentStructureOverlayMode==="event"?A.eventGraphSvgDark:A.sessionGraphSvgDark)("startPath",A.agentStructureOverlayMode==="event"?A.selectedEventGraphPath:"")}}var _kA="root_agent",iD="q",xkA="hideSidePanel",iN="",nN="",H$="application/json+a2ui";function oN(i){for(i=i.replace(/-/g,"+").replace(/_/g,"/");i.length%4!==0;)i+="=";return i}var aN=class i extends rd{nextPageLabel="Next Event";previousPageLabel="Previous Event";firstPageLabel="First Event";lastPageLabel="Last Event";getRangeLabel=(e,A,t)=>t===0?`Event 0 of ${t}`:(t=Math.max(t,0),`Event ${e*A+1} of ${t}`);static \u0275fac=(()=>{let e;return function(t){return(e||(e=Li(i)))(t||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac})},RkA="Restarting bidirectional streaming is not currently supported. Please refresh the page or start a new session.",nD=class i{i18n=w(h$);sidePanelI18n=w(_E);_snackbarService=w(Xc);activatedRoute=w($s);agentService=w(el);artifactService=w(EB);changeDetectorRef=w(Mt);dialog=w(Xa);document=w(ci);downloadService=w(QB);evalService=w(A0);eventService=w(fm);featureFlagService=w(Nr);graphService=w(uB);localFileService=w(mm);location=w(vm);renderer=w(on);router=w(Is);safeValuesService=w(Qs);testsService=w(c2);sessionService=w(tl);streamChatService=w(ym);webSocketService=w(mB);audioRecordingService=w(pB);audioPlayingService=w(fB);stringToColorService=w(g2);traceService=w(ng);uiStateService=w(ag);agentBuilderService=w($c);themeService=w(og,{optional:!0});logoComponent=w(wB,{optional:!0});activeSseSubscription;chatPanel=Yo(h1);canvasComponent=Yo.required(QE);sideDrawer=Yo.required("sideDrawer");sidePanel=Yo.required(xE);drawerSessionTab=Yo("drawerSessionTab");evalTab=Yo(Sc);appSearchInput=Yo("appSearchInput");canChat=ye(()=>this.chatType()==="session");isEvalCaseEditing=mA(!1);hasEvalCaseChanged=mA(!1);isEvalEditMode=mA(!1);isBuilderMode=mA(!1);chatType=mA("session");currentEvalCaseId=null;currentEvalTimestamp=null;videoElement;currentMessage="";uiEvents=mA([]);invocationDisplayMap=ye(()=>{let e=new Map,A=1,t="";for(let n of this.uiEvents()){if(n.role==="user")if(n.text)t=n.text;else if(n.event?.content?.parts?.length){let o=n.event.content.parts.find(a=>a.text);o&&o.text&&(t=o.text)}else t="User Message";if(n.event?.invocationId){let o=n.event.invocationId;if(!e.has(o)){let a=t||"User Message";a.length>50&&(a=a.substring(0,47)+"..."),e.set(o,`#${A} (${a})`),A++}}}return e});artifacts=[];userInput="";userEditEvalCaseMessage="";userId="user";appName="";sessionId="";sessionIdOfLoadedMessages="";evalCase=null;evalCaseResult=mA(null);metricsInfo=this.evalService.metricsInfo;updatedEvalCase=null;adkVersion=mA("");versionInfo=mA(null);evalSetId="";isAudioRecording=!1;micVolume=this.audioRecordingService.volumeLevel;isVideoRecording=!1;longRunningEvents=[];functionCallEventId="";redirectUri=Rr.getBaseUrlWithoutPath();isMobile=mA(window.innerWidth<=768);showSidePanel=window.localStorage.getItem("adk-side-panel-visible")!=="false";showBuilderAssistant=!0;showAppSelectorDrawer=!1;showSessionSelectorDrawer=!1;useSse=mA(window.localStorage.getItem("adk-use-sse")==="true");currentSessionState={};root_agent=_kA;updatedSessionState=mA(null);canEditSession=mA(!0);isViewOnlySession=mA(!1);isViewOnlyAppNameMismatch=mA(!1);isLoadedAppUnavailable=mA(!1);unavailableAppName=mA("");readonlySessionType=mA("");readonlySessionName=mA("");isSideBySide=mA(!1);showBranches=mA(!1);expectedUiEvents=mA([]);viewMode=mA(window.localStorage.getItem("chat-view-mode")||"events");invocationIdFilterActive=mA(!1);nodePathFilterActive=mA(!1);invocationIdFilter=mA("");nodePathFilter=mA("");invocationIdOptions=ye(()=>{let e=new Set;for(let A of this.uiEvents())A.event?.invocationId&&e.add(A.event.invocationId);return Array.from(e)});nodePathOptions=ye(()=>{let e=new Set;for(let A of this.uiEvents()){let t=A.bareNodePath;t&&e.add(t)}return Array.from(e)});invChipMenuTrigger=Yo("invChipMenuTrigger");nodeChipMenuTrigger=Yo("nodeChipMenuTrigger");addMenuTrigger=Yo("addMenuTrigger");openAddFilterMenu(e){e.stopPropagation(),this.addMenuTrigger()?.openMenu()}addInvocationIdFilter(){this.invocationIdFilterActive.set(!0),setTimeout(()=>{this.invChipMenuTrigger()?.openMenu()})}addNodePathFilter(){this.nodePathFilterActive.set(!0),setTimeout(()=>{this.nodeChipMenuTrigger()?.openMenu()})}removeInvocationIdFilter(e){e.stopPropagation(),this.invocationIdFilterActive.set(!1),this.invocationIdFilter.set("")}removeNodePathFilter(e){e.stopPropagation(),this.nodePathFilterActive.set(!1),this.nodePathFilter.set("")}setInvocationIdFilter(e){this.invocationIdFilter.set(e)}setNodePathFilter(e){this.nodePathFilter.set(e)}onInvocationMenuClosed(){this.invocationIdFilter()||this.invocationIdFilterActive.set(!1)}onNodePathMenuClosed(){this.nodePathFilter()||this.nodePathFilterActive.set(!1)}clearAllFilters(e){e.stopPropagation(),this.invocationIdFilterActive()&&(this.invocationIdFilterActive.set(!1),this.invocationIdFilter.set("")),this.nodePathFilterActive()&&(this.nodePathFilterActive.set(!1),this.nodePathFilter.set("")),this.hideIntermediateEvents()&&this.toggleHideIntermediateEvents()}shouldShowEvent(e){let A=this.invocationIdFilter();if(A&&!(e.event?.invocationId||"").includes(A))return!1;let t=this.nodePathFilter();if(t&&!(e.bareNodePath||"").includes(t))return!1;if(!this.hideIntermediateEvents()||e.role==="user")return!0;if(e.event?.content!==void 0){let n=e.event.content.parts||[];if(n.length>0&&n.every(a=>a.functionCall||a.functionResponse)){if(n.some(r=>{let s=r.functionCall?.id||r.functionResponse?.id;return s&&e.event?.longRunningToolIds?.includes(s)}))return!0}else return!0}if(e.event?.output!==void 0){let n=e.event?.nodeInfo,o=!1,a=n?.outputFor;if(Array.isArray(a)?o=a.some(r=>!r.includes("/")):typeof a=="string"?o=!a.includes("/"):n?.path&&(o=!n.path.includes("/")),o)return!0}return!1}shouldShowEventFn=this.shouldShowEvent.bind(this);getMetricTooltip(e,A,t){let n=this.metricsInfo().find(g=>g.metricName===e),o=n?.description||"",a=n?.metricValueInfo?.interval?.minValue??"?",r=n?.metricValueInfo?.interval?.maxValue??"?",s=A!=null?parseFloat(A).toFixed(2):"?",l=t!=null?parseFloat(t).toFixed(2):"?";return`${o?o+" | ":""}Actual: ${s} | Threshold: ${l} | Min: ${a} | Max: ${r}`}getMetricDescription(e){return this.metricsInfo().find(t=>t.metricName===e)?.description||""}getMetricMin(e){let t=this.metricsInfo().find(n=>n.metricName===e)?.metricValueInfo?.interval?.minValue;return t!=null?t.toFixed(2):"?"}getMetricMax(e){let t=this.metricsInfo().find(n=>n.metricName===e)?.metricValueInfo?.interval?.maxValue;return t!=null?t.toFixed(2):"?"}getVersionTooltip(){let e=this.versionInfo();return e?`Version: ${e.version} | Language: ${e.language} | Language Version: ${e.language_version}`:""}getMergedTooltip(){let e=this.sidePanelI18n.disclosureTooltip||"",A=this.getVersionTooltip();return A?`${e} | ${A}`:e}filteredUiEvents=ye(()=>this.uiEvents().filter(e=>this.shouldShowEvent(e)));filteredExpectedUiEvents=ye(()=>this.expectedUiEvents().filter(e=>this.shouldShowEvent(e)));onViewModeChange(e){this.viewMode.set(e);try{window.localStorage.setItem("chat-view-mode",e)}catch(A){}}originalSessionId="";hideIntermediateEvents=mA(window.localStorage.getItem("adk-hide-intermediate-events")==="true");toggleHideIntermediateEvents(){let e=!this.hideIntermediateEvents();this.hideIntermediateEvents.set(e),window.localStorage.setItem("adk-hide-intermediate-events",String(e))}sessionHasUsedBidi=new Set;eventData=new Map;traceData=[];renderedEventGraph;rawSvgString=null;agentGraphData=mA(null);sessionGraphSvgLight={};sessionGraphSvgDark={};sessionGraphDot={};dynamicGraphDot={};agentReadme="";graphsAvailable=mA(!0);get hasSubWorkflows(){return Object.keys(this.sessionGraphSvgLight).length>1}selectedEvent=void 0;selectedEventIndex=void 0;selectedMessageIndex=void 0;llmRequest=void 0;llmResponse=void 0;getMediaTypeFromMimetype=I6;selectedFiles=[];MediaType=iC;selectedAppControl=new Ps("",{nonNullable:!0});appDrawerSearchControl=new Ps("",{nonNullable:!0});openBase64InNewTab(e,A){this.safeValuesService.openBase64InNewTab(e,A)}isLoadingApps=mA(!1);loadingError=mA("");apps$=oe([]).pipe(mi(()=>{this.isLoadingApps.set(!0),this.selectedAppControl.disable()}),Mi(()=>this.agentService.listApps().pipe(aa(e=>(this.loadingError.set(e.message),oe(void 0))))),Ro(1),mi(e=>{this.isLoadingApps.set(!1),this.selectedAppControl.enable(),e?.length==1&&this.router.navigate([],{relativeTo:this.activatedRoute,queryParams:{app:e[0]},queryParamsHandling:"merge"})}),Js());filteredDrawerApps$=this.apps$.pipe(Mi(e=>Dr([oe(e),this.appDrawerSearchControl.valueChanges.pipe(Yn(""))])),Se(([e,A])=>{if(!e||!A||A.trim()==="")return e;let t=A.toLowerCase().trim();return e.filter(n=>n.toLowerCase().includes(t))}));importSessionEnabledObs=this.featureFlagService.isImportSessionEnabled();isEditFunctionArgsEnabledObs=this.featureFlagService.isEditFunctionArgsEnabled();isSessionUrlEnabledObs=this.featureFlagService.isSessionUrlEnabled();isApplicationSelectorEnabledObs=this.featureFlagService.isApplicationSelectorEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isExportSessionEnabledObs=this.featureFlagService.isExportSessionEnabled();isNewSessionButtonEnabledObs=this.featureFlagService.isNewSessionButtonEnabled();isEventFilteringEnabled=sr(this.featureFlagService.isEventFilteringEnabled());isApplicationSelectorEnabled=sr(this.featureFlagService.isApplicationSelectorEnabled());isDeleteSessionEnabledObs=this.featureFlagService.isDeleteSessionEnabled();isUserIdOnToolbarEnabledObs=this.featureFlagService.isUserIdOnToolbarEnabled();isDeveloperUiDisclaimerEnabledObs=this.featureFlagService.isDeveloperUiDisclaimerEnabled();disableBuilderSwitch=!1;autoSelectLatestEvent=!1;constructor(){Fn(()=>{this.themeService?.currentTheme()&&this.updateRenderedGraph()})}ngOnInit(){if(this.checkScreenSize(),this.isMobile()?this.showSidePanel=!1:this.showSidePanel=window.localStorage.getItem("adk-side-panel-visible")!=="false",this.syncSelectedAppFromUrl(),this.updateSelectedAppUrl(),this.hideSidePanelIfNeeded(),this.agentService.getVersion().subscribe(t=>{this.adkVersion.set(t.version||""),this.versionInfo.set(t)}),Dr([this.agentService.getApp(),this.activatedRoute.queryParams]).pipe(Bt(([t,n])=>!!t&&!!n[iD]),oo(),Se(([,t])=>t[iD])).subscribe(t=>{setTimeout(()=>{this.userInput=t})}),this.streamChatService.onStreamClose().subscribe(t=>{let n=`Please check server log for full details: -`+t;this.openSnackBar(n,"OK")}),this.webSocketService.getMessages().subscribe(t=>{if(t)try{let n=JSON.parse(t);(n.interrupted||n.inputTranscription!==void 0&&n.partial)&&this.audioPlayingService.stopAudio(),this.appendEventRow(n),this.changeDetectorRef.detectChanges()}catch(n){}}),new URL(window.location.href).searchParams.has("code")){let t=window.location.href;window.opener?.postMessage({authResponseUrl:t},window.origin),window.close()}this.agentService.getApp().subscribe(t=>{this.appName=t,this.evalService.metricsInfo.set([])}),this.traceService.selectedTraceRow$.subscribe(t=>{t&&(this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0,this.showSidePanel||(this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true"),this.sideDrawer()?.open()),this.changeDetectorRef.detectChanges())}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(oo()).subscribe(t=>{t&&(this.uiStateService.onNewMessagesLoaded().subscribe(n=>{this.populateMessages(n.items,!0,!n.isBackground),this.loadTraceData()}),this.uiStateService.onNewMessagesLoadingFailed().subscribe(n=>{this.openSnackBar(n.message,"OK")}))})}get sessionTab(){return this.drawerSessionTab()}switchToTraceView(){this.onViewModeChange("traces")}ngAfterViewInit(){this.showSidePanel&&this.sideDrawer()?.open(),this.isApplicationSelectorEnabled()||this.loadSessionByUrlOrReset()}selectApp(e){if(this.isLoadedAppUnavailable.set(!1),e!=this.appName){let A=!this.appName;this.agentService.setApp(e),A?this.loadSessionByUrlOrReset():this.createSessionAndReset()}}loadSessionByUrlOrReset(){this.isSessionUrlEnabledObs.subscribe(e=>{let A=this.activatedRoute.snapshot?.queryParams,t=A.session,n=A.userId,o=A.evalCase,a=A.evalResult,r=A.file;if(n&&(this.userId=n),o){this.chatType.set("eval-case");let s=o.split("/");if(s.length===2){let l=s[0],g=s[1];this.evalSetId=l,this.evalService.getEvalCase(this.appName,l,g).subscribe(C=>{C&&(this.updateWithSelectedEvalCase(C),setTimeout(()=>{let d=this.sidePanel();d.switchToEvalTab(),d.selectEvalCase(l,C)},600))})}return}if(a){this.chatType.set("eval-result");let s=a.split("/");if(console.log("loadSessionByUrlOrReset evalResultUrl parts:",s),s.length===3){let l=s[0],g=s[1],C=s[2];this.evalSetId=l;let d=`${this.appName}_${l}_${C}`;console.log("loadSessionByUrlOrReset runId:",d),this.evalService.getEvalResult(this.appName,d).subscribe(B=>{if(console.log("loadSessionByUrlOrReset runResult:",B),B){let u=B.evalCaseResults?.find(E=>E.evalId===g);if(console.log("loadSessionByUrlOrReset evalCaseResult:",u),u){let E=u.sessionId;this.evalService.getEvalCase(this.appName,l,g).subscribe(f=>{this.sessionService.getSession(this.userId,this.appName,E).subscribe(m=>{this.addEvalCaseResultToEvents(m,u);let v={id:m?.id??"",appName:m?.appName??"",userId:m?.userId??"",state:m?.state??[],events:m?.events??[],isEvalResult:!0,evalCase:f,evalCaseResult:u,timestamp:C};this.updateWithSelectedSession(v),setTimeout(()=>{let S=this.sidePanel();S.switchToEvalTab(),S.selectEvalResult(l,C,f)},600)})})}}})}return}if(r){this.chatType.set("file");return}if(!e||!t){this.chatType.set("session"),this.createSessionAndReset();return}t&&(this.chatType.set("session"),this.sessionId=t,this.loadSession(t,!0))})}loadSession(e,A=!1){this.uiStateService.setIsSessionLoading(!0),this.isViewOnlySession.set(!1),this.isViewOnlyAppNameMismatch.set(!1),Dr([this.sessionService.getSession(this.userId,this.appName,e).pipe(aa(t=>(A&&(this.openSnackBar("Cannot find specified session. Creating a new one.",void 0,3e3),this.createSessionAndReset()),oe(null)))),this.featureFlagService.isInfinityMessageScrollingEnabled()]).pipe(oo()).subscribe(([t,n])=>{this.uiStateService.setIsSessionLoading(!1),t&&(n&&t.id&&this.uiStateService.lazyLoadMessages(t.id,{pageSize:100,pageToken:""}).pipe(oo()).subscribe(),this.updateWithSelectedSession(t))})}hideSidePanelIfNeeded(){this.activatedRoute.queryParams.pipe(Bt(e=>e[xkA]==="true"),Ro(1)).subscribe(()=>{this.showSidePanel=!1,this.sideDrawer()?.close()})}createSessionAndReset(){this.resetToNewSession(),this.chatType.set("session"),this.isViewOnlySession.set(!1),this.isViewOnlyAppNameMismatch.set(!1),this.canEditSession.set(!0),this.chatPanel()?.canEditSession?.set(!0),this.eventData=new Map,this.uiEvents.set([]),this.artifacts=[],this.userInput="",this.longRunningEvents=[],this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0,this.traceService.resetTraceService()}resetToNewSession(){this.sessionId="",this.currentSessionState={},this.sessionTab?.refreshSession(),this.clearSessionUrl()}createSession(){this.uiStateService.setIsSessionListLoading(!0),this.sessionService.createSession(this.userId,this.appName).subscribe(e=>{this.currentSessionState=e.state,this.sessionId=e.id??"",this.sessionTab?.refreshSession(),this.sessionTab?.reloadSession(this.sessionId),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()})},()=>{this.uiStateService.setIsSessionListLoading(!1)})}refreshLatestSession(){this.appName&&(this.uiStateService.setIsSessionLoading(!0),this.sessionService.listSessions(this.userId,this.appName).pipe(oo()).subscribe({next:e=>{if(e.items&&e.items.length>0){let t=e.items.sort((n,o)=>{let a=Number(n.lastUpdateTime||0);return Number(o.lastUpdateTime||0)-a})[0];t.id?this.loadSession(t.id):this.uiStateService.setIsSessionLoading(!1)}else this.uiStateService.setIsSessionLoading(!1),this.openSnackBar("No sessions found for this app.","OK");this.sessionTab?.refreshSession()},error:e=>{this.uiStateService.setIsSessionLoading(!1),this.openSnackBar("Failed to refresh sessions.","OK"),console.error("Error listing sessions:",e)}}))}handleChatInput(e){return re(this,null,function*(){if(e.preventDefault(),!this.userInput.trim()&&this.selectedFiles.length<=0||e instanceof KeyboardEvent&&(e.isComposing||e.keyCode===229))return;let A={role:"user",parts:yield this.getUserMessageParts()};this.userInput="",this.selectedFiles=[];let t=this.router.parseUrl(this.location.path());t.queryParams[iD]&&(delete t.queryParams[iD],this.location.replaceState(t.toString())),yield this.sendMessage(A)})}ensureSessionActive(e){return re(this,null,function*(){if(this.sessionId)return!0;try{let A="";e?.parts&&e.parts[0]?.text&&(A=e.parts[0].text,A.length>50&&(A=A.substring(0,47)+"..."));let t=A?{__session_metadata__:{displayName:A}}:void 0,n=yield Zp(this.sessionService.createSession(this.userId,this.appName,t));return this.currentSessionState=n.state||t||{},this.sessionId=n.id??"",this.sessionTab?.refreshSession(),this.sessionTab?.reloadSession(this.sessionId),this.drawerSessionTab()?.refreshSession(),this.drawerSessionTab()?.reloadSession(this.sessionId),this.isSessionUrlEnabledObs.pipe(oo()).subscribe(o=>{o&&this.updateSelectedSessionUrl()}),!0}catch(A){return this.openSnackBar("Failed to create session","OK"),!1}})}sendMessage(e){return re(this,null,function*(){if(!(yield this.ensureSessionActive(e)))return;let t=e.functionCallEventId;t&&delete e.functionCallEventId;let n=`user_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,o={id:n,author:e.role||"user",content:e},a=this.buildUiEventFromEvent(o);this.uiEvents.update(s=>[...s,a]),setTimeout(()=>this.changeDetectorRef.detectChanges(),0),this.eventData.set(n,o),this.eventData=new Map(this.eventData);let r={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:e,streaming:this.useSse(),stateDelta:this.updatedSessionState()};t&&(r.functionCallEventId=t),this.submitAgentRunRequest(r),this.changeDetectorRef.detectChanges()})}submitAgentRunRequest(e){this.autoSelectLatestEvent=!0,this.activeSseSubscription=this.agentService.runSse(e).subscribe({next:A=>re(this,null,function*(){if(A.error){this.openSnackBar(A.error,"OK");return}this.appendEventRow(A);let t=this.sidePanel().selectedIndex===0;this.autoSelectLatestEvent&&A.id&&t&&this.selectEvent(A.id,void 0,!1),A.actions&&this.processActionStateDelta(A),this.changeDetectorRef.detectChanges()}),error:A=>{this.activeSseSubscription=void 0,console.error("Send message error:",A);let t=String(A);t.includes("aborted")||t.includes("AbortError")||this.openSnackBar(A,"OK")},complete:()=>{this.activeSseSubscription=void 0,this.updatedSessionState()&&(this.currentSessionState=this.updatedSessionState(),this.updatedSessionState.set(null)),this.featureFlagService.isSessionReloadOnNewMessageEnabled().pipe(oo()).subscribe(A=>{A&&this.sessionTab?.reloadSession(this.sessionId)}),this.loadTraceData()}})}handleStopMessage(){this.activeSseSubscription&&(this.activeSseSubscription.unsubscribe(),this.activeSseSubscription=void 0)}appendEventRow(e,A=!1){if(e.inputTranscription!==void 0?e.author="user":e.outputTranscription!==void 0&&(e.author="bot"),e.errorMessage&&e.id&&!this.eventData.has(e.id)&&(this.eventData.set(e.id,e),this.eventData=new Map(this.eventData)),e.id&&!this.eventData.has(e.id)&&(this.eventData.set(e.id,e),this.eventData=new Map(this.eventData)),this.traceService.setEventData(this.eventData),e?.longRunningToolIds&&e.longRunningToolIds.length>0){let t=this.longRunningEvents.length;this.getAsyncFunctionsFromParts(e.longRunningToolIds,e.content.parts,e.invocationId),this.functionCallEventId=e.id;for(let n=t;n{this.sendOAuthResponse(o,s,this.redirectUri)}).catch(s=>{console.error("OAuth Error:",s)});break}}}if(e.partial)this.uiEvents.update(t=>{if(t.length>0){let o=t.length-1,a=t[o],r=!!(a.event?.inputTranscription||a.event?.outputTranscription),s=!!(e.inputTranscription||e.outputTranscription);if(a.event?.partial&&a.role===(e.author==="user"?"user":"bot")&&r===s){let l=this.mergePartialEvent(a,e),g=[...t];return g[o]=l,g}}let n=this.buildUiEventFromEvent(e,A);return A?[n,...t]:[...t,n]});else{let t=this.buildUiEventFromEvent(e,A);this.uiEvents.update(n=>{let o=n.findIndex(a=>a.event?.id===e.id&&e.id);if(o<0&&n.length>0){let a=e.inputTranscription!==void 0,r=e.outputTranscription!==void 0,s=e.content?.parts?.some(l=>l.thought);if(a||r||s)if(A)for(let l=0;lC.thought))){o=l;break}}}else for(let l=n.length-1;l>=0;l--){let g=n[l].event;if(g?.partial){if(a&&g.inputTranscription!==void 0){o=l;break}if(r&&g.outputTranscription!==void 0){o=l;break}if(s&&(n[l].thought||g.content?.parts?.some(C=>C.thought))){o=l;break}}}else{let l=A?0:n.length-1,g=n[l];if(g.event?.partial){let C=!!(g.event?.inputTranscription||g.event?.outputTranscription),d=!!(e.inputTranscription||e.outputTranscription);C===d&&(o=l)}}}if(o>=0){let a=n[o];(!t.functionResponses||t.functionResponses.length===0)&&(t.functionResponses=a.functionResponses),(!t.functionCalls||t.functionCalls.length===0)&&(t.functionCalls=a.functionCalls);let r=[...n];return r[o]=t,r}else return A?[t,...n]:[...n,t]})}if(e.actions?.artifactDelta){let t=this.uiEvents().find(n=>n.event?.id===e.id);if(t)for(let n in e.actions.artifactDelta)e.actions.artifactDelta.hasOwnProperty(n)&&this.renderArtifact(n,e.actions.artifactDelta[n],t)}}mergePartialEvent(e,A){let t=new su($A(P({},e),{event:A,textParts:e.textParts?e.textParts.map(o=>P({},o)):void 0})),n=A.content?.parts||[];if(this.isEventA2aResponse(A)&&(n=this.combineA2uiDataParts(n)),n=this.combineTextParts(n),n.forEach(o=>{if(o.text!==void 0&&o.text!==null){let a=o.thought?this.processThoughtText(o.text):o.text;t.text=(t.text||"")+a;let r=!!o.thought;this.addTextToParts(t,a,r)}else this.processPartIntoMessage(o,A,t)}),t.thought=t.textParts?.every(o=>o.thought)??!1,A.inputTranscription){let o=e.event?.inputTranscription?.text||"";t.event.inputTranscription={text:o+(A.inputTranscription.text||"")}}if(A.outputTranscription){let o=e.event?.outputTranscription?.text||"";t.event.outputTranscription={text:o+(A.outputTranscription.text||"")}}return t}getUserMessageParts(){return re(this,null,function*(){let e=[];if(this.userInput.trim()&&e.push({text:`${this.userInput}`}),this.selectedFiles.length>0)for(let A of this.selectedFiles)e.push(yield this.localFileService.createMessagePartFromFile(A.file));return e})}processActionStateDelta(e){e.actions&&e.actions.stateDelta&&Object.keys(e.actions.stateDelta).length>0&&(this.currentSessionState=P(P({},this.currentSessionState||{}),e.actions.stateDelta))}combineTextParts(e){let A=[],t;for(let n of e)if(n.text){let o=!!n.thought;t&&t.text&&!!t.thought===o?t.text+=n.text:(t={text:n.text,thought:o},A.push(t))}else t=void 0,A.push(n);return A}isEventA2aResponse(e){return!!e?.customMetadata?.["a2a:response"]}isA2aDataPart(e){if(!e.inlineData||e.inlineData.mimeType!=="text/plain")return!1;let A=atob(oN(e.inlineData.data));return A.startsWith(iN)&&A.endsWith(nN)}isA2uiDataPart(e){let A=this.extractA2aDataPartJson(e);return A&&A.kind==="data"&&A.metadata?.mimeType===H$}extractA2aDataPartJson(e){if(!this.isA2aDataPart(e))return null;let A=atob(oN(e.inlineData.data)),t=A.substring(iN.length,A.length-nN.length),n;try{n=JSON.parse(t)}catch(o){return null}return n}combineA2uiDataParts(e){let A=[],t=[],n;for(let o of e)this.isA2uiDataPart(o)?(t.push(this.extractA2aDataPartJson(o)),n||(n={inlineData:{mimeType:"text/plain",data:o.inlineData.data}},A.push(n))):A.push(o);if(n?.inlineData){let a=iN+JSON.stringify({kind:"data",metadata:{mimeType:H$},data:t})+nN;n.inlineData.data=btoa(a)}return A}processA2uiPartIntoMessage(e){let A={};return e.a2ui.forEach(t=>{t.data.beginRendering?A.beginRendering=t.data:t.data.surfaceUpdate?A.surfaceUpdate=t.data:t.data.dataModelUpdate&&(A.dataModelUpdate=t.data)}),A}extractA2uiJsonFromText(e){if(!e.text)return;let A="",t="",n=e.text.indexOf(A);if(n===-1)return;let o=e.text.indexOf(t,n+A.length);if(o===-1)return;let a=e.text.substring(n+A.length,o).trim();try{let r=JSON.parse(a);Array.isArray(r)||(r=[r]);let s={};r.forEach(C=>{C.beginRendering?s.beginRendering=C:C.surfaceUpdate?s.surfaceUpdate=C:C.dataModelUpdate&&(s.dataModelUpdate=C)}),e.a2uiData=s;let l=e.text.substring(0,n),g=e.text.substring(o+t.length);if(e.text=(l+g).trim(),e.textParts){for(let C of e.textParts){let d=C.text.indexOf(A);if(d!==-1){let B=C.text.indexOf(t,d+A.length);if(B!==-1){let u=C.text.substring(0,d),E=C.text.substring(B+t.length);C.text=(u+E).trim()}}}e.textParts=e.textParts.filter(C=>C.text.trim().length>0)}}catch(r){console.warn("Failed to parse inline block from text:",r)}}updateRedirectUri(e,A){try{let t=new URL(e);return t.searchParams.set("redirect_uri",A),t.toString()}catch(t){return console.warn("Failed to update redirect URI: ",t),e}}formatBase64Data(e,A){let t=oN(e);return`data:${A};base64,${t}`}addTextToParts(e,A,t){if(!A)return;e.textParts||(e.textParts=[]);let n=e.textParts[e.textParts.length-1];n&&!!n.thought===t?n.text+=A:e.textParts.push({text:A,thought:t})}processPartIntoMessage(e,A,t){if(e)if(A&&(t.event=A,A.invocationIndex!==void 0&&(t.invocationIndex=A.invocationIndex),A.toolUseIndex!==void 0&&(t.toolUseIndex=A.toolUseIndex),A.finalResponsePartIndex!==void 0&&(t.finalResponsePartIndex=A.finalResponsePartIndex)),e.text){let n=e.thought?this.processThoughtText(e.text):e.text;t.text=(t.text||"")+n,this.addTextToParts(t,n,!!e.thought),t.thought=t.textParts?.every(o=>o.thought)??!1,A?.groundingMetadata&&A.groundingMetadata.searchEntryPoint&&A.groundingMetadata.searchEntryPoint.renderedContent&&(t.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),A?.id&&(t.event=A)}else if(e.inlineData){let n=this.formatBase64Data(e.inlineData.data,e.inlineData.mimeType),o=I6(e.inlineData.mimeType);t.inlineData={displayName:e.inlineData.displayName,data:n,mimeType:e.inlineData.mimeType,mediaType:o},t.role==="user"&&A?.id&&(t.event=A)}else if(e.functionCall){t.functionCalls||(t.functionCalls=[]);let n=A?.longRunningToolIds?.includes(e.functionCall.id),o=e.functionCall;n&&(o=$A(P({},e.functionCall),{isLongRunning:!0,invocationId:A.invocationId,functionCallEventId:A.id,needsResponse:!0,responseStatus:e.functionCall.responseStatus||"pending",userResponse:e.functionCall.userResponse||""}));let a=t.functionCalls.findIndex(r=>r.id===e.functionCall.id);a>=0?t.functionCalls[a]=P(P({},t.functionCalls[a]),o):t.functionCalls.push(o),A?.id&&(t.event=A)}else e.functionResponse?(t.functionResponses||(t.functionResponses=[]),t.functionResponses.push(e.functionResponse),A?.id&&(t.event=A)):e.executableCode?t.executableCode=e.executableCode:e.codeExecutionResult?t.codeExecutionResult=e.codeExecutionResult:e.a2ui&&(t.a2uiData=this.processA2uiPartIntoMessage(e))}handleArtifactFetchFailure(e,A,t,n){this.openSnackBar("Failed to fetch artifact data","OK"),e.error={errorMessage:"Failed to fetch artifact data"+(n?": "+(n.message||n):"")},this.changeDetectorRef.detectChanges(),this.artifacts=this.artifacts.filter(o=>o.id!==A||o.versionId!==t)}renderArtifact(e,A,t){if(this.artifacts.some(a=>a.id===e&&a.versionId===A))return;t.inlineData={data:"",mimeType:"image/png"};let o={id:e,versionId:A,data:"",mimeType:"image/png",mediaType:"image"};this.artifacts=[...this.artifacts,o],this.artifactService.getArtifactVersion(this.userId,this.appName,this.sessionId,e,A).subscribe({next:a=>{let r=a.mimeType,s=a.data;if((!r||!s)&&a.inlineData&&(r=a.inlineData.mimeType,s=a.inlineData.data),!r&&!s&&a.text){r="text/plain";try{s=btoa(unescape(encodeURIComponent(a.text)))}catch(d){console.error("Failed to encode text to base64",d),this.handleArtifactFetchFailure(t,e,A,{message:"Failed to encode text data"});return}}if(!r||!s){this.handleArtifactFetchFailure(t,e,A,{message:"Invalid response data: missing mimeType or data or text"});return}let l=this.formatBase64Data(s,r),g=I6(r),C={name:this.createDefaultArtifactName(r),data:l,mimeType:r,mediaType:g};t.inlineData=C,this.changeDetectorRef.detectChanges(),this.artifacts=this.artifacts.map(d=>d.id===e&&d.versionId===A?{id:e,versionId:A,data:l,mimeType:r,mediaType:g}:d)},error:a=>{this.handleArtifactFetchFailure(t,e,A,a)}})}sendOAuthResponse(e,A,t){this.longRunningEvents.pop();var n=structuredClone(e.args.authConfig);n.exchangedAuthCredential.oauth2.authResponseUri=A,n.exchangedAuthCredential.oauth2.redirectUri=t;let o={role:"user",parts:[{functionResponse:{id:e.id,name:e.name,response:n}}],functionCallEventId:this.functionCallEventId};this.sendMessage(o)}clickEvent(e){let A=this.uiEvents()[e],t=A.event.id;if(t){if(this.selectedMessageIndex===e){this.sideDrawer()?.open(),this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true");return}if(A.role==="user"){this.selectedEvent=this.eventData.get(t),this.selectedEventIndex=this.getIndexOfKeyInMap(t),this.selectedMessageIndex=e,this.llmRequest=void 0,this.llmResponse=void 0,this.sideDrawer()?.open(),this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true"),this.updateRenderedGraph(),this.viewMode()!=="events"&&this.onViewModeChange("events");return}this.sideDrawer()?.open(),this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true"),this.selectEvent(t,e)}}handleJumpToInvocation(e){let A=this.uiEvents(),t=-1,n=-1;for(let o=0;o{this.chatPanel()?.scrollToSelectedMessage(t)},100))}ngOnDestroy(){this.handleStopMessage(),this.streamChatService.closeStream()}onAppSelection(e){this.isAudioRecording&&(this.stopAudioRecording(),this.isAudioRecording=!1),this.isVideoRecording&&(this.stopVideoRecording(),this.isVideoRecording=!1),this.evalTab()?.resetEvalResults(),this.traceData=[]}toggleAudioRecording(e){return re(this,null,function*(){this.isAudioRecording?this.stopAudioRecording():yield this.startAudioRecording(e)})}startAudioRecording(e){return re(this,null,function*(){if(this.sessionId&&this.sessionHasUsedBidi.has(this.sessionId)){this.openSnackBar(RkA,"OK");return}(yield this.ensureSessionActive())&&(this.isAudioRecording=!0,this.streamChatService.startAudioChat({appName:this.appName,userId:this.userId,sessionId:this.sessionId,flags:e}),this.sessionHasUsedBidi.add(this.sessionId))})}stopAudioRecording(){this.audioPlayingService.stopAudio(),this.streamChatService.stopAudioChat(),this.isAudioRecording=!1,this.isVideoRecording&&this.stopVideoRecording()}toggleVideoRecording(){this.isVideoRecording?this.stopVideoRecording():this.startVideoRecording()}startVideoRecording(){let e=this.chatPanel()?.videoContainer;e&&(this.isVideoRecording=!0,this.streamChatService.startVideoStreaming(e))}stopVideoRecording(){let e=this.chatPanel()?.videoContainer;e&&(this.streamChatService.stopVideoStreaming(e),this.isVideoRecording=!1)}getAsyncFunctionsFromParts(e,A,t){for(let n of A)n.functionCall&&e.includes(n.functionCall.id)&&this.longRunningEvents.push({function:n.functionCall,invocationId:t})}openOAuthPopup(e){return new Promise((A,t)=>{if(!this.safeValuesService.windowOpen(window,e,"oauthPopup","width=600,height=700")){t("Popup blocked!");return}let o=a=>{if(a.origin!==window.location.origin)return;let{authResponseUrl:r}=a.data;r?(A(r),window.removeEventListener("message",o)):console.log("OAuth failed",a)};window.addEventListener("message",o)})}toggleSidePanel(){this.showSidePanel?(this.sideDrawer()?.close(),this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0):this.sideDrawer()?.open(),this.showSidePanel=!this.showSidePanel,window.localStorage.setItem("adk-side-panel-visible",this.showSidePanel.toString())}toggleAppSelectorDrawer(){this.showSessionSelectorDrawer=!1,this.showAppSelectorDrawer=!this.showAppSelectorDrawer,this.showAppSelectorDrawer&&this.appDrawerSearchControl.setValue("")}onSelectorDrawerOpened(){this.showAppSelectorDrawer&&this.appSearchInput()?.nativeElement.focus()}handleAppSearchKeydown(e){if(e.key==="ArrowDown"){e.preventDefault(),e.stopPropagation();let A=this.document.querySelector(".app-selector-list .app-selector-item");A&&A.focus()}}handleAppListKeydown(e){if(e.key!=="ArrowDown"&&e.key!=="ArrowUp")return;e.stopPropagation();let A=Array.from(this.document.querySelectorAll(".app-selector-list .app-selector-item")),t=A.indexOf(this.document.activeElement);if(t>-1){if(e.preventDefault(),e.key==="ArrowDown"){let n=t+1;n=0?A[n].focus():this.appSearchInput()?.nativeElement.focus()}}}onAppSelectorDrawerClosed(){this.showAppSelectorDrawer=!1}toggleSessionSelectorDrawer(){this.showAppSelectorDrawer=!1,this.showSessionSelectorDrawer=!this.showSessionSelectorDrawer}onSessionSelectorDrawerClosed(){this.showSessionSelectorDrawer=!1}onSelectorDrawerClosed(){this.showAppSelectorDrawer=!1,this.showSessionSelectorDrawer=!1}onSessionSelectedFromDrawer(e){this.showSessionSelectorDrawer=!1,this.loadSession(e)}onSessionReloadedFromDrawer(e){this.loadSession(e)}selectAppFromDrawer(e){this.selectedAppControl.setValue(e),this.showAppSelectorDrawer=!1}handleTabChange(e){this.canChat()||(this.resetEditEvalCaseVars(),this.handleReturnToSession(!0))}handleReturnToSession(e){this.sessionTab?.getSession(this.sessionId),this.evalTab()?.resetEvalCase(),this.chatType.set("session")}handleEvalNotInstalled(e){e&&this.openSnackBar(e,"OK")}resetEventsAndMessages({keepMessages:e}={}){e||(this.eventData.clear(),this.uiEvents.set([]),this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0),this.artifacts=[]}loadTraceData(){this.sessionId&&(this.uiStateService.setIsEventRequestResponseLoading(!0),this.eventService.getTrace(this.appName,this.sessionId).pipe(oo(),aa(e=>(console.error("[DEBUG] getTrace error:",e),oe([])))).subscribe(e=>{this.traceData=e,this.updateSystemInstructionFlags(),this.traceService.setEventData(this.eventData),this.traceService.setMessages(this.uiEvents()),this.selectedEvent&&this.populateLlmRequestResponse(),this.uiStateService.setIsEventRequestResponseLoading(!1),this.changeDetectorRef.detectChanges()}),this.changeDetectorRef.detectChanges())}updateSystemInstructionFlags(){if(!this.traceData||this.traceData.length===0||this.eventData.size===0)return;let e=n=>{let o=[];for(let a of n)o.push(a),a.children&&(o=o.concat(e(a.children)));return o},t=e(this.traceData).filter(n=>{let o=n.attrOperationName===hI,a=n.name==="call_llm";return(o||a)&&n.io?.inputs!==void 0}).sort((n,o)=>(n.start_time||0)-(o.start_time||0));for(let n of this.eventData.values())n.systemInstructionChanged=!1,n.precedingSystemInstruction=void 0,n.currentSystemInstruction=void 0;for(let n=1;n{r==="bot"&&t&&this.isA2uiDataPart(l)&&(l={a2ui:this.extractA2aDataPartJson(l).data}),this.processPartIntoMessage(l,e,s)}),this.extractA2uiJsonFromText(s),s}populateMessages(e,A=!1,t=!1){this.resetEventsAndMessages({keepMessages:t&&this.sessionIdOfLoadedMessages===this.sessionId}),e.forEach(n=>{this.appendEventRow(n,A)}),this.sessionIdOfLoadedMessages=this.sessionId}restorePendingLongRunningCalls(){let e=this.uiEvents(),A=new Set;this.uiEvents().forEach(t=>{t.functionResponses&&t.functionResponses.forEach(n=>{n.id&&A.add(n.id)})}),this.uiEvents().forEach(t=>{t.functionCalls&&t.functionCalls.forEach(n=>{let o=t.event.id?this.eventData.get(t.event.id):null;(n.isLongRunning||o?.longRunningToolIds?.includes(n.id))&&!A.has(n.id)&&(n.isLongRunning=!0,n.invocationId=o?.invocationId,n.functionCallEventId=t.event.id||"",n.needsResponse=!0,n.responseStatus="pending",n.userResponse=n.userResponse||"")})})}updateWithSelectedSession(e){if(!(!e||!e.id)){if(this.traceService.resetTraceService(),this.traceData=[],this.sessionId=e.id,this.currentSessionState=e.state||{},this.evalCase=null,this.resetEventsAndMessages(),e.isEvalResult){this.isViewOnlySession.set(!0),this.readonlySessionType.set("Eval Result");let A=e.evalCase?.evalId,t=e.timestamp;this.currentEvalCaseId=A,this.currentEvalTimestamp=t;let n=t;if(t){let o=Number(t);isNaN(o)||(n=new Date(o*1e3).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0}))}this.readonlySessionName.set(A&&n?`${n} > ${A}`:e.id),this.canEditSession.set(!1),this.chatPanel()?.canEditSession?.set(!1)}else this.isViewOnlySession.set(!1);e.evalCase?this.expectedUiEvents.set(this.buildUiEventsFromEvalCase(e.evalCase)):this.expectedUiEvents.set([]),e.evalCaseResult?this.evalCaseResult.set(e.evalCaseResult):this.evalCaseResult.set(null),e.isEvalResult?this.chatType.set("eval-result"):(this.chatType.set("session"),this.isSideBySide.set(!1)),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()}),e.events&&e.state&&(e.events.forEach(A=>{this.appendEventRow(A,!1)}),this.restorePendingLongRunningCalls()),this.changeDetectorRef.detectChanges(),this.loadTraceData(),e.isEvalResult||this.sessionService.canEdit(this.userId,e).pipe(oo(),aa(()=>oe(!0))).subscribe(A=>{this.chatPanel()?.canEditSession?.set(A),this.canEditSession.set(A)}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(oo()).subscribe(A=>{A||this.populateMessages(e.events||[]),this.loadTraceData()})}}formatToolUses(e){if(!e||!Array.isArray(e))return[];let A=[];for(let t of e)A.push({name:t.name,args:t.args});return A}addEvalCaseResultToEvents(e,A){let t=A.evalMetricResultPerInvocation,n=-1;if(t)for(let o=0;o{this.appendEventRow(t,!1)}),this.canEditSession.set(!1),this.chatPanel()?.canEditSession?.set(!1),this.isViewOnlySession.set(!0),this.changeDetectorRef.detectChanges()}buildUiEventsFromEvalCase(e){let A=this.uiEvents(),t=this.eventData,n=this.chatType(),o=this.isViewOnlySession(),a=this.readonlySessionType(),r=this.readonlySessionName();this.uiEvents.set([]),this.eventData=new Map,this.updateWithSelectedEvalCase(e);let s=this.uiEvents();return this.uiEvents.set(A),this.eventData=t,this.chatType.set(n),this.isViewOnlySession.set(o),this.readonlySessionType.set(a),this.readonlySessionName.set(r),s}updateWithSelectedEvalCase(e){if(this.evalCase=e,this.chatType.set("eval-case"),this.isViewOnlySession.set(!0),this.readonlySessionType.set("Eval Case"),this.readonlySessionName.set(e.evalId),this.chatType.set("eval-case"),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()}),this.resetEventsAndMessages(),e.events&&e.events.length>0)for(let A of e.events)this.appendEventRow(A,!1);else{e.events=[];let A=0;for(let t of e.conversation){if(t.userContent?.parts&&e.events.push({author:"user",content:t.userContent,invocationIndex:A}),t.intermediateData?.invocationEvents){let n=0;for(let o of t.intermediateData.invocationEvents)o.invocationIndex=A,o.content?.parts?.[0]?.functionCall&&(o.toolUseIndex=n,n++),e.events.push(o)}else if(t.intermediateData?.toolUses){let n=0;for(let o of t.intermediateData.toolUses)e.events.push({author:"bot",content:{parts:[{functionCall:{name:o.name,args:o.args}}]},invocationIndex:A,toolUseIndex:n}),n++,e.events.push({author:"bot",content:{parts:[{functionResponse:{name:o.name}}]},invocationIndex:A})}t.finalResponse?.parts&&e.events.push({author:"bot",content:t.finalResponse,invocationIndex:A}),A++}for(let t of e.events)this.appendEventRow(t,!1)}}handleEditEvalCaseRequested(e){this.updateWithSelectedEvalCase(e),this.editEvalCase()}updateSelectedEvalSetId(e){this.evalSetId=e}editEvalCaseMessage(e){this.isEvalCaseEditing.set(!0),this.userEditEvalCaseMessage=e.text,e.isEditing=!0,setTimeout(()=>{let A=this.chatPanel()?.textarea?.nativeElement;if(!A)return;A.focus();let t=A.value.length;e.text.charAt(t-1)===` -`&&t--,A.setSelectionRange(t,t)},0)}editFunctionArgs(e){this.isEvalCaseEditing.set(!0),this.dialog.open(CI,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Edit function arguments",functionName:e.functionCall.name,jsonContent:e.functionCall.args}}).afterClosed().subscribe(t=>{this.isEvalCaseEditing.set(!1),t&&(this.hasEvalCaseChanged.set(!0),e.functionCall.args=t,this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].intermediateData.toolUses[e.toolUseIndex].args=t)})}saveEvalCase(){this.evalService.updateEvalCase(this.appName,this.evalSetId,this.updatedEvalCase.evalId,this.updatedEvalCase).subscribe(e=>{this.openSnackBar("Eval case updated","OK"),this.resetEditEvalCaseVars()})}cancelEditEvalCase(){this.resetEditEvalCaseVars(),this.updateWithSelectedEvalCase(this.evalCase)}resetEditEvalCaseVars(){this.hasEvalCaseChanged.set(!1),this.isEvalCaseEditing.set(!1),this.isEvalEditMode.set(!1),this.updatedEvalCase=null}cancelEditMessage(e){e.isEditing=!1,this.isEvalCaseEditing.set(!1)}saveEditMessage(e){this.hasEvalCaseChanged.set(!0),this.isEvalCaseEditing.set(!1),e.isEditing=!1,e.text=this.userEditEvalCaseMessage?this.userEditEvalCaseMessage:" ",this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts[e.finalResponsePartIndex]={text:this.userEditEvalCaseMessage},this.userEditEvalCaseMessage=""}handleKeydown(e,A){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),this.saveEditMessage(A)):e.key==="Escape"&&this.cancelEditMessage(A)}deleteEvalCaseMessage(e,A){this.hasEvalCaseChanged.set(!0),this.uiEvents.update(t=>t.filter((n,o)=>o!==A)),this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts.splice(e.finalResponsePartIndex,1)}editEvalCase(){this.isEvalEditMode.set(!0),this.isViewOnlySession.set(!1)}deleteEvalCase(){let e={title:"Confirm delete",message:`Are you sure you want to delete ${this.evalCase.evalId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(Mc,{width:"600px",data:e}).afterClosed().subscribe(t=>{t&&(this.evalTab()?.deleteEvalCase(this.evalCase.evalId),this.openSnackBar("Eval case deleted","OK"))})}onNewSessionClick(){this.resetToNewSession(),this.eventData.clear(),this.uiEvents.set([]),this.artifacts=[],this.traceData=[],this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0,this.traceService.resetTraceService(),this.chatPanel()?.focusInput(),this.evalTab()?.showEvalHistory&&this.evalTab()?.toggleEvalHistoryButton()}getToolbarSessionId(){if(!this.sessionId)return"NEW SESSION";if(this.isViewOnlySession())return this.sessionId;let e=this.currentSessionState?.__session_metadata__;return e?.displayName?e.displayName:this.sessionId}getCurrentSessionDisplayName(){return this.sessionId?this.currentSessionState?.__session_metadata__?.displayName||this.sessionId:"NEW SESSION"}copySessionId(){return re(this,null,function*(){if(this.sessionId)try{yield navigator.clipboard.writeText(this.sessionId),this.openSnackBar(this.i18n.sessionIdCopiedMessage,"OK")}catch(e){this.openSnackBar(this.i18n.copySessionIdFailedMessage,"OK")}})}saveSessionName(e){if(!this.sessionId)return;let A={__session_metadata__:$A(P({},this.currentSessionState?.__session_metadata__||{}),{displayName:e})};this.currentSessionState=P(P({},this.currentSessionState),A),this.updatedSessionState.set(P(P({},this.updatedSessionState()),A)),this.sessionService.updateSession(this.userId,this.appName,this.sessionId,{stateDelta:A}).subscribe({next:()=>{this.sessionTab&&this.sessionTab.reloadSession(this.sessionId),this.drawerSessionTab()&&this.drawerSessionTab().reloadSession(this.sessionId)}})}get sessionDisplayNameDraft(){return this.currentSessionState?.__session_metadata__?.displayName||""}saveUserId(e){if(e=e.trim(),!e){this.openSnackBar(this.i18n.invalidUserIdMessage,"OK");return}this.userId=e,this.isSessionUrlEnabledObs.pipe(Ro(1)).subscribe(A=>{A&&this.updateSelectedSessionUrl()})}onFileSelect(e){let A=e.target;if(A.files)for(let t=0;t{e&&this.canvasComponent()?.loadFromYaml(e,this.appName)},error:e=>{console.error("Error loading agent configuration:",e),this.openSnackBar("Error loading agent configuration","OK")}})}exitBuilderMode(){let e=this.router.createUrlTree([],{queryParams:{mode:null},queryParamsHandling:"merge"}).toString();this.location.replaceState(e),this.isBuilderMode.set(!1),this.agentBuilderService.clear()}toggleBuilderAssistant(){this.showBuilderAssistant=!this.showBuilderAssistant}openAddItemDialog(){this.apps$.pipe(Ro(1)).subscribe(e=>{let A=this.dialog.open(l6,{width:"600px",data:{existingAppNames:e??[]}})})}eventGraphSvgLight={};eventGraphSvgDark={};selectedEventGraphPath="";showAgentStructureOverlay=!1;agentStructureOverlayMode="session";openAgentStructureGraphDialog(e="session"){this.agentStructureOverlayMode=e,this.showAgentStructureOverlay=!0}saveAgentBuilder(){this.canvasComponent()?.saveAgent(this.appName)}onEventTabDrillDown(e){this.updateRenderedGraph(void 0,e)}updateRenderedGraph(e,A){return re(this,null,function*(){let t=this.sessionGraphSvgLight,n=this.sessionGraphSvgDark;if(Object.keys(t).length===0||Object.keys(n).length===0){this.renderedEventGraph=void 0;return}let o=e||this.selectedEvent?.nodeInfo?.path;!e&&this.selectedEvent?.author==="user"&&(o="__START__");let a=o;o&&o!=="__START__"&&(a=o.split("/").map(m=>m.split("@")[0]).join("/"));let r=A!==void 0?A:"",s="";if(a&&A===void 0){let m=a.split("/");if(s=m[m.length-1],m.length>=2&&m[m.length-1]==="call_llm"&&m[m.length-2]===this.selectedEvent?.author?(s=m[m.length-2],r=m.slice(1,-2).join("/")):r=m.slice(1,-1).join("/"),r&&!(r in t&&!(r in this.dynamicGraphDot))){let S=this.tryGenerateDynamicGraph(r);if(S&&this.dynamicGraphDot[r]!==S)try{let k=yield this.graphService.render(S);this.sessionGraphSvgLight[r]=k,this.sessionGraphSvgDark[r]=k,this.dynamicGraphDot[r]=S}catch(k){console.error("Failed to render dynamic graph",k)}}for(;r&&!(r in t);){let v=r.split("/");v.pop(),r=v.join("/")}}let l=this.sessionGraphDot[r]||this.sessionGraphDot[""]||"",g=l,C=!1;if(this.selectedEvent){let m=this.getV1HighlightPairs(this.selectedEvent);for(let[v,S]of m)if(v&&S&&S===this.selectedEvent.author){let k=new RegExp(`("${S}"|${S})\\s*->\\s*("${v}"|${v})`,"g");k.test(l)&&(g=l.replace(k,"$& [dir=back]"),C=!0)}}let d="",B="";if(C)try{d=yield this.graphService.render(g),B=d}catch(m){console.error("Failed to render modified graph",m),d=t[r]||t[""]||"",B=n[r]||n[""]||""}else d=t[r]||t[""]||"",B=n[r]||n[""]||"";if(this.selectedEvent){let m=this.getV1HighlightPairs(this.selectedEvent);m.length>0&&(d=this.applyV1Highlighting(d,m,!1),B=this.applyV1Highlighting(B,m,!0))}let u=[],E=[];if(this.selectedEventIndex!==void 0){let m=Array.from(this.eventData.values()),S=m[this.selectedEventIndex]?.invocationId;for(let k=0;kz.split("@")[0]).join("/")),F){let z=F.split("/"),j=z[z.length-1],X="";z.length>=2&&z[z.length-1]==="call_llm"&&z[z.length-2]===M.author?(j=z[z.length-2],X=z.slice(1,-2).join("/")):X=z.slice(1,-1).join("/");let eA=r in this.dynamicGraphDot,Z=x?x.split("/"):[],CA=Z.length>0?Z[Z.length-1]:"",wA=eA?CA:j;X===r&&(k<=this.selectedEventIndex&&(u.length===0||u[u.length-1]!==wA)&&u.push(wA),(E.length===0||E[E.length-1]!==wA)&&E.push(wA))}}}if(this.selectedEvent){let m=this.getV1HighlightPairs(this.selectedEvent);for(let[v,S]of m)S&&S!==""&&(E.includes(S)||E.push(S),u.includes(S)||u.push(S)),v&&v!==""&&(E.includes(v)||E.push(v),u.includes(v)||u.push(v))}E.length>0&&d&&B&&(d=this.highlightExecutionPathInSvg(d,u,E,"light"),B=this.highlightExecutionPathInSvg(B,u,E,"dark")),this.selectedEventGraphPath=r,this.eventGraphSvgLight=$A(P({},t),{[r]:d}),this.eventGraphSvgDark=$A(P({},n),{[r]:B});let f=this.themeService?.currentTheme()==="dark"?B:d;this.rawSvgString=f,this.renderedEventGraph=this.safeValuesService.bypassSecurityTrustHtml(f),this.changeDetectorRef.detectChanges()})}tryGenerateDynamicGraph(e){let A=Array.from(this.eventData.values()),t=[];for(let l of A){let g=l.nodeInfo?.path;if(!g)continue;let C=g.split("/"),d=C.map(u=>u.split("@")[0]),B="";if(d.length>=2&&d[d.length-1]==="call_llm"&&d[d.length-2]===l.author?B=d.slice(1,-2).join("/"):B=d.slice(1,-1).join("/"),B===e){let u=C[C.length-1];t.push({run:u,branch:l.branch})}}if(t.length===0)return null;let n=new Set,o=new Map;for(let l of t)n.add(l.run),l.branch&&o.set(l.run,l.branch);if(n.size===0)return null;let a=`digraph G { -`;a+=` rankdir=TB; -`,a+=` node [shape=box, style=filled, fillcolor="#e6f4ea", color="#34a853"]; -`,a+=` "START" [shape=ellipse, style=filled, fillcolor="#fce8e6", color="#ea4335"]; -`;let r=new Map;for(let l of n){let g=l.split("@")[0];r.has(g)||r.set(g,[]),r.get(g).push(l)}for(let[l,g]of Array.from(r.entries())){a+=` subgraph cluster_${l} { -`,a+=` label="${l}"; -`,a+=` style=dashed; -`,a+=` color="#b0b0b0"; -`;for(let C of g){let d=C.split("@")[1]||"";a+=` "${C}" [label="@${d}"]; -`}a+=` } -`}let s=new Set;for(let l of n){let g=o.get(l);if(g){let C=g.split(".");if(C.length>=2){let d=C[C.length-2],B=C[C.length-1];s.add(`"${d}" -> "${B}"`)}else C.length===1&&s.add(`"START" -> "${C[0]}"`)}else s.add(`"START" -> "${l}"`)}for(let l of s)a+=` ${l}; -`;return a+="}",a}highlightExecutionPathInSvg(e,A,t,n="light"){if(!t||t.length===0)return e;let a=new DOMParser().parseFromString(e,"image/svg+xml"),r=new Map,s=new Map,l=a.querySelectorAll("g.edge");l.forEach(X=>{let Z=X.querySelector("title")?.textContent?.trim()||"";if(Z.includes("->")){let CA=Z.split("->"),wA=CA[0].trim().replace(/^"|"$/g,""),BA=CA[1].trim().replace(/^"|"$/g,"");r.has(BA)||r.set(BA,[]),r.get(BA).push(wA),s.has(wA)||s.set(wA,[]),s.get(wA).push(BA)}});let g=new Map,C=a.querySelectorAll("g.node");C.forEach(X=>{let Z=Array.from(X.querySelectorAll("text")).map(QA=>QA.textContent?.trim()||"").join(""),wA=X.querySelector("title")?.textContent?.trim()||"",BA=wA.replace(/^"|"$/g,"");g.set(Z,BA),wA&&g.set(wA,BA)});let d=X=>{let eA=X.toLowerCase();for(let[Z,CA]of g.entries()){let wA=Z.toLowerCase().replace(/\s+/g,"_");if(wA===eA||wA===`"${eA}"`)return CA}for(let[Z,CA]of g.entries())if(Z.toLowerCase().replace(/\s+/g,"_").includes(eA))return CA;return null},B=A.map(X=>d(X)).filter(X=>X),u=t.map(X=>d(X)).filter(X=>X),{visitedNodes:E,visitedEdges:f}=this.calculateVisitedPath(B,r),{visitedNodes:m}=this.calculateVisitedPath(u,r),v=this.calculateEdgeCounts(B,E,f,s),S=n==="dark"?"#34a853":"#a1c2a1",k=n==="dark"?"#ceead6":"#0d652d",M=n==="dark"?"#137333":"#a6d8b5",x=n==="dark"?"#34a853":"#a1c2a1",F=n==="dark"?"#0d652d":"#e6f4ea",z=null,j=B[B.length-1];if(B.length>0&&j){let X=[...B],eA=Array.from(E).find(CA=>CA.toLowerCase()==="__start__");X.length>0&&X[0].toLowerCase()!=="__start__"&&eA&&X.unshift(eA);let Z=X.lastIndexOf(j);if(Z>0){let CA=X[Z-1],wA=X[Z],BA=[],QA=new Set,RA=s.get(CA)||[];for(let dA of RA){let IA=`${CA}->${dA}`;f.has(IA)&&(BA.push({node:dA,path:[IA]}),QA.add(dA))}for(;BA.length>0;){let dA=BA.shift();if(dA.node===wA){dA.path.length>0&&(z=dA.path[dA.path.length-1]);break}let IA=s.get(dA.node)||[];for(let xA of IA){let qA=`${dA.node}->${xA}`;f.has(qA)&&!QA.has(xA)&&(QA.add(xA),BA.push({node:xA,path:[...dA.path,qA]}))}}}}return l.forEach(X=>{let Z=X.querySelector("title")?.textContent?.trim()||"";if(Z.includes("->")){let CA=Z.split("->"),wA=CA[0].trim().replace(/^"|"$/g,""),BA=CA[1].trim().replace(/^"|"$/g,""),QA=`${wA}->${BA}`;if(f.has(QA)){let RA=QA===z,dA=X.querySelector("path");dA&&(dA.setAttribute("stroke",RA?k:S),dA.setAttribute("stroke-width",RA?"4":"2"));let IA=X.querySelector("polygon");IA&&(IA.setAttribute("fill",RA?k:S),IA.setAttribute("stroke",RA?k:S));let xA=v.get(QA)||0;if(xA>1){let qA=X.querySelector("text");if(qA)qA.textContent=`${qA.textContent} (${xA}x)`,qA.setAttribute("fill",n==="dark"?"#ffffff":"#000000"),qA.setAttribute("font-weight","bold");else if(dA){let HA=[...(dA.getAttribute("d")||"").matchAll(/[-+]?[0-9]*\.?[0-9]+/g)];if(HA.length>=4){let bA=HA.map(Ae=>parseFloat(Ae[0])),PA=(bA[0]+bA[bA.length-2])/2,it=(bA[1]+bA[bA.length-1])/2,Xe=a.createElementNS("http://www.w3.org/2000/svg","g"),YA=a.createElementNS("http://www.w3.org/2000/svg","rect");YA.setAttribute("x",(PA-14).toString()),YA.setAttribute("y",(it-10).toString()),YA.setAttribute("width","28"),YA.setAttribute("height","20"),YA.setAttribute("rx","4"),YA.setAttribute("fill",n==="dark"?"#0d652d":"#e6f4ea"),YA.setAttribute("stroke",S),YA.setAttribute("stroke-width","1"),Xe.appendChild(YA);let hA=a.createElementNS("http://www.w3.org/2000/svg","text");hA.setAttribute("x",PA.toString()),hA.setAttribute("y",(it+4).toString()),hA.setAttribute("text-anchor","middle"),hA.setAttribute("fill",n==="dark"?"#ffffff":"#000000"),hA.setAttribute("font-size","12px"),hA.setAttribute("font-weight","bold"),hA.textContent=xA.toString()+"x",Xe.appendChild(hA),X.appendChild(Xe)}}}}}}),C.forEach(X=>{let eA=X.querySelector("title"),Z=eA?.textContent?.trim().replace(/^"|"$/g,"")||"";if(E.has(Z)){let CA=X.querySelector("ellipse, polygon, path, rect");if(CA){let wA=Z===j||Z.toLowerCase()==="__end__";CA.setAttribute("stroke",wA?k:x),CA.setAttribute("fill",wA?M:F),CA.setAttribute("stroke-width",wA?"4":"2")}}if(!m.has(Z)){X.classList.add("unvisited-node");let CA=X.querySelector("ellipse, polygon, path, rect");if(CA){CA.setAttribute("stroke",n==="dark"?"#666666":"#b0b0b0"),CA.setAttribute("fill",n==="dark"?"#424242":"#e0e0e0");let QA=a.createElementNS("http://www.w3.org/2000/svg","title");QA.textContent="Not run in this invocation",CA.appendChild(QA)}if(X.querySelectorAll("text").forEach(QA=>{QA.setAttribute("fill",n==="dark"?"#888888":"#757575");let RA=a.createElementNS("http://www.w3.org/2000/svg","title");RA.textContent="Not run in this invocation",QA.appendChild(RA)}),eA)eA.textContent="Not run in this invocation";else{let QA=a.createElementNS("http://www.w3.org/2000/svg","title");QA.textContent="Not run in this invocation",X.appendChild(QA)}X.querySelectorAll("a").forEach(QA=>{QA.title="Not run in this invocation"})}}),new XMLSerializer().serializeToString(a)}getV1HighlightPairs(e){let A=[],t=e.content?.parts?.filter(o=>o.functionCall)||[],n=e.content?.parts?.filter(o=>o.functionResponse)||[];if(t.length>0)for(let o of t)o.functionCall?.name&&e.author&&A.push([e.author,o.functionCall.name]);else if(n.length>0)for(let o of n)o.functionResponse?.name&&e.author&&A.push([o.functionResponse.name,e.author]);else e.author&&A.push([e.author,""]);return A}applyV1Highlighting(e,A,t){let o=new DOMParser().parseFromString(e,"image/svg+xml"),a="#0F5223",r="#69CB87",s=t?"#cccccc":"#000000",l=new Set;for(let[d,B]of A)d&&l.add(d),B&&l.add(B);return o.querySelectorAll("g.node").forEach(d=>{let u=d.querySelector("title")?.textContent?.trim().replace(/^"|"$/g,"")||"",E=Array.from(d.querySelectorAll("text")),f=E.map(v=>v.textContent?.trim()||"").join("").toLowerCase().replace(/\s+/g,"_"),m=l.has(u);if(!m)for(let v of l){let S=v.toLowerCase().replace(/\s+/g,"_");if(f.includes(S)){m=!0;break}}if(m){let v=d.querySelector("ellipse, polygon, path, rect");v&&(v.setAttribute("fill",a),v.setAttribute("stroke",a)),E.forEach(S=>S.setAttribute("fill",s))}else E.forEach(v=>v.setAttribute("fill",s))}),o.querySelectorAll("g.edge").forEach(d=>{let u=d.querySelector("title")?.textContent?.trim()||"";if(u.includes("->")){let[E,f]=u.split("->"),m=E.trim().replace(/^"|"$/g,""),v=f.trim().replace(/^"|"$/g,"");for(let[S,k]of A)if(m===S&&v===k||m===k&&v===S){let M=d.querySelector("path");M&&M.setAttribute("stroke",r);let x=d.querySelector("polygon");x&&(x.setAttribute("stroke",r),x.setAttribute("fill",r));break}}}),new XMLSerializer().serializeToString(o)}calculateVisitedPath(e,A){let t=new Set(e),n=!0;for(;n;){n=!1;let a=Array.from(t);for(let r of a){let s=A.get(r)||[];if(s.length===1){let l=s[0];t.has(l)||(t.add(l),n=!0)}}}for(let[a,r]of A.entries())if(a.toLowerCase()==="__end__"){for(let s of r)if(t.has(s)){t.add(a);break}}let o=new Set;for(let a of t){if(a==="__start__")continue;let r=A.get(a)||[];if(r.length===1)o.add(`${r[0]}->${a}`);else if(r.length>1)for(let s of r)(t.has(s)||s==="__start__")&&o.add(`${s}->${a}`)}return{visitedNodes:t,visitedEdges:o}}calculateEdgeCounts(e,A,t,n){let o=new Map,a=[...e],r=Array.from(A).find(l=>l.toLowerCase()==="__start__"),s=Array.from(A).find(l=>l.toLowerCase()==="__end__");a.length>0&&a[0].toLowerCase()!=="__start__"&&r&&a.unshift(r),a.length>0&&s&&a[a.length-1].toLowerCase()!=="__end__"&&a.push(s);for(let l=0;l${f}`;t.has(m)&&(B.push({node:f,path:[m]}),u.add(f))}for(;B.length>0;){let f=B.shift();if(f.node===C){d=f.path;break}let m=n.get(f.node)||[];for(let v of m){let S=`${f.node}->${v}`;t.has(S)&&!u.has(v)&&(u.add(v),B.push({node:v,path:[...f.path,S]}))}}if(d)for(let f of d)o.set(f,(o.get(f)||0)+1)}return o}onManualScroll(){this.autoSelectLatestEvent=!1}selectEvent(e,A,t=!0){t&&(this.autoSelectLatestEvent=!1),this.traceService.selectedRow(void 0),this.selectedEvent=this.eventData.get(e),this.selectedEventIndex=this.getIndexOfKeyInMap(e),this.selectedMessageIndex=A!==void 0?A:this.uiEvents().findIndex(n=>n.event.id===e),t&&this.viewMode()!=="events"&&this.onViewModeChange("events"),this.chatPanel()?.scrollToSelectedMessage(this.selectedMessageIndex),this.populateLlmRequestResponse(),this.updateRenderedGraph()}populateLlmRequestResponse(){if(this.llmRequest=void 0,this.llmResponse=void 0,!this.selectedEvent)return;let e=this.findSpanIoForSelectedEvent();e!==void 0&&(this.llmRequest=e.inputs,this.llmResponse=e.outputs)}findSpanIoForSelectedEvent(){let e=this.selectedEvent?.id;if(e===void 0)return;let A=this.traceData?.find(n=>n.attrOperationName===hI&&n.attrEventId===e);return A?.io!==void 0?A.io:this.traceData?.find(n=>n.attrEventId===e&&n.name==="call_llm")?.io}deleteSession(e){let A={title:"Confirm delete",message:`Are you sure you want to delete this session ${this.sessionId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(Mc,{width:"600px",data:A}).afterClosed().subscribe(n=>{n&&this.sessionService.deleteSession(this.userId,this.appName,e).subscribe(o=>{let a=this.sessionTab?.refreshSession(e);a?this.sessionTab?.getSession(a.id):window.location.reload()})})}syncSelectedAppFromUrl(){let e=this.activatedRoute.snapshot?.queryParams?.app;e&&(this.selectedAppControl.setValue(e,{emitEvent:!1}),this.selectApp(e)),Dr([this.activatedRoute.queryParams,this.apps$]).subscribe(([A,t])=>{let n=A.app;if(t&&t.length&&n){if(!t.includes(n)){this.openSnackBar(`Agent '${n}' not found`,"OK");return}n!==this.appName&&(this.selectedAppControl.setValue(n,{emitEvent:!1}),this.selectApp(n)),this.agentService.getAppInfo(n).subscribe(o=>{setTimeout(()=>{this.agentGraphData.set(o),this.agentReadme=o?.readme||""})}),this.sessionGraphSvgLight={},this.sessionGraphSvgDark={},this.dynamicGraphDot={},setTimeout(()=>this.graphsAvailable.set(!0)),this.agentService.getAppGraphImage(n,!1).pipe(aa(o=>(console.error("Error fetching light mode graphs:",o),this.graphsAvailable.set(!1),oe(null)))).subscribe({next:o=>re(this,null,function*(){try{if(o){console.log("Light mode graph response:",o),this.sessionGraphSvgLight={},this.dynamicGraphDot={};for(let[a,r]of Object.entries(o))if(r?.dotSrc){let l=a.split("/").map(C=>C.split("@")[0]).join("/").split("/"),g=l.length>1?l.slice(1).join("/"):l[0]==="root_agent"||l[0]===n?"":l[0];this.sessionGraphDot[g]=r.dotSrc,this.sessionGraphSvgLight[g]=yield this.graphService.render(r.dotSrc)}console.log("sessionGraphSvgLight after rendering:",Object.keys(this.sessionGraphSvgLight)),console.log("graphsAvailable:",this.graphsAvailable()),this.selectedEvent&&this.selectedEventIndex!==void 0&&this.updateRenderedGraph()}}catch(a){console.error("Error rendering light mode graphs:",a),setTimeout(()=>this.graphsAvailable.set(!1))}}),error:o=>{console.error("Error fetching light mode graphs:",o),setTimeout(()=>this.graphsAvailable.set(!1))}}),this.agentService.getAppGraphImage(n,!0).pipe(aa(o=>(console.error("Error fetching dark mode graphs:",o),oe(null)))).subscribe({next:o=>re(this,null,function*(){try{if(o){this.sessionGraphSvgDark={};for(let[a,r]of Object.entries(o))if(r?.dotSrc){let l=a.split("/").map(C=>C.split("@")[0]).join("/").split("/"),g=l.length>1?l.slice(1).join("/"):l[0]==="root_agent"||l[0]===n?"":l[0];this.sessionGraphSvgDark[g]=yield this.graphService.render(r.dotSrc)}this.selectedEvent&&this.selectedEventIndex!==void 0&&this.updateRenderedGraph()}}catch(a){console.error("Error rendering dark mode graphs:",a),setTimeout(()=>this.graphsAvailable.set(!1))}}),error:o=>{console.error("Error fetching dark mode graphs:",o),setTimeout(()=>this.graphsAvailable.set(!1))}}),this.agentService.getAgentBuilder(n).pipe(aa(o=>(setTimeout(()=>this.disableBuilderSwitch=!0),this.agentBuilderService.setLoadedAgentData(void 0),oe("")))).subscribe(o=>{!o||o==""?(setTimeout(()=>this.disableBuilderSwitch=!0),this.agentBuilderService.setLoadedAgentData(void 0)):(setTimeout(()=>this.disableBuilderSwitch=!1),this.agentBuilderService.setLoadedAgentData(o))}),this.isBuilderMode.set(!1)}A.mode==="builder"&&this.enterBuilderMode()})}updateSelectedAppUrl(){this.selectedAppControl.valueChanges.pipe(xg(),Bt(Boolean)).subscribe(e=>{this.selectApp(e);let A=this.activatedRoute.snapshot?.queryParams?.app;e!==A&&this.router.navigate([],{queryParams:{app:e,mode:null},queryParamsHandling:"merge"})})}updateSelectedSessionUrl(){let e=this.chatType(),A={userId:this.userId};switch(A.session=null,A.evalCase=null,A.evalResult=null,A.file=null,e){case"session":A.session=this.sessionId;break;case"eval-case":A.evalCase=`${this.evalSetId}/${this.evalCase?.evalId}`;break;case"eval-result":A.evalResult=`${this.evalSetId}/${this.currentEvalCaseId}/${this.currentEvalTimestamp}`;break;case"file":A.file=this.readonlySessionName();break}let t=this.router.createUrlTree([],{queryParams:A,queryParamsHandling:"merge"}).toString();this.location.replaceState(t)}clearSessionUrl(){this.isSessionUrlEnabledObs.pipe(oo()).subscribe(e=>{if(e){let A=this.router.createUrlTree([],{queryParams:{session:null},queryParamsHandling:"merge"}).toString();this.location.replaceState(A)}})}handlePageEvent(e){if(e.pageIndex>=0){let A=this.getKeyAtIndexInMap(e.pageIndex);A&&(this.selectEvent(A),setTimeout(()=>{let t=this.uiEvents().findIndex(n=>n.event.id===A);if(t!==-1){let n=this.chatPanel()?.scrollContainer?.nativeElement;if(!n)return;let o=n.querySelectorAll(".message-row-container");o&&o[t]&&o[t].scrollIntoView({behavior:"smooth",block:"nearest",inline:"nearest"})}},0))}}closeSelectedEvent(){this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0}handleEscapeKey(e){e.key==="Escape"&&this.selectedEvent&&(e.preventDefault(),this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0)}getIndexOfKeyInMap(e){let A=0,t=(o,a)=>0,n=Array.from(this.eventData.keys()).sort(t);for(let o of n){if(o===e)return A;A++}}getKeyAtIndexInMap(e){let A=(n,o)=>0,t=Array.from(this.eventData.keys()).sort(A);if(e>=0&&e{console.log(e);let t=(e.state?.__session_metadata__||this.currentSessionState?.__session_metadata__)?.displayName,n=t&&t.trim()?`${t.trim().replace(/[/\\?%*:|"<>]/g,"_")}.json`:`session-${this.sessionId}.json`;this.downloadService.downloadObjectAsJson(e,n)})}updateState(){this.dialog.open(CI,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Update state",jsonContent:this.currentSessionState}}).afterClosed().subscribe(A=>{A&&this.updatedSessionState.set(A)})}removeStateUpdate(){this.updatedSessionState.set(null)}importSession(){let e=document.createElement("input");e.type="file",e.accept="application/json",e.onchange=()=>{if(!e.files||e.files.length===0)return;let A=e.files[0],t=new FileReader;t.onload=n=>{if(n.target?.result)try{let o=JSON.parse(n.target.result);if(!o.events||o.events.length===0){this.openSnackBar("Invalid session file: no events found","OK");return}if(o.appName&&o.appName!==this.appName){let a={title:"App name mismatch",message:`The session file was exported from app "${o.appName}" but the current app is "${this.appName}". Do you want to import it anyway?`,confirmButtonText:"Import",cancelButtonText:"Cancel"};this.dialog.open(Mc,{width:"600px",data:a}).afterClosed().subscribe(s=>{s&&this.doImportSession(o)})}else this.doImportSession(o)}catch(o){this.openSnackBar("Error parsing session file","OK")}},t.readAsText(A)},e.click()}viewSession(){let e=document.createElement("input");e.type="file",e.accept="application/json",e.onchange=()=>{if(!e.files||e.files.length===0)return;let A=e.files[0],t=new FileReader;t.onload=n=>{if(n.target?.result)try{let o=JSON.parse(n.target.result);if(!o.events||o.events.length===0){this.openSnackBar("Invalid session file: no events found","OK");return}this.doViewSession(o,A.name)}catch(o){this.openSnackBar("Error parsing session file","OK")}},t.readAsText(A)},e.click()}doViewSession(e,A){let t=e.appName;t&&t!==this.appName?this.apps$.pipe(Ro(1)).subscribe(n=>{n?.includes(t)?this.router.navigate([],{queryParams:{app:t},queryParamsHandling:"merge"}).then(()=>{this.openSnackBar(`Switched to app '${t}'`,"OK"),this.performViewSessionLoading(e,A)}):(this.isLoadedAppUnavailable.set(!0),this.unavailableAppName.set(t),this.performViewSessionLoading(e,A))}):this.performViewSessionLoading(e,A)}performViewSessionLoading(e,A){this.traceService.resetTraceService(),this.traceData=[],this.isViewOnlySession()||(this.originalSessionId=this.sessionId),this.readonlySessionType.set("File"),this.readonlySessionName.set(A),this.sessionId=`File: ${A}`,this.currentSessionState=e.state||{},this.evalCase=null,this.chatType.set("session"),this.updateSelectedSessionUrl(),this.showSessionSelectorDrawer=!1,this.resetEventsAndMessages(),this.isViewOnlySession.set(!0),this.canEditSession.set(!1),this.chatPanel()?.canEditSession?.set(!1);let t=!!(e.appName&&e.appName!==this.appName);this.isViewOnlyAppNameMismatch.set(t),e.events&&e.events.forEach(n=>{this.appendEventRow(n,!1)}),this.changeDetectorRef.detectChanges()}closeReadonlySession(){this.isViewOnlySession.set(!1),this.readonlySessionType.set(""),this.readonlySessionName.set(""),this.evalCase=null,this.router.navigate([],{queryParams:{session:null,evalCase:null,evalResult:null,file:null},queryParamsHandling:"merge"}),this.createSessionAndReset(),this.originalSessionId=""}doImportSession(e){let A=Date.now()/1e3,t=e.events.map(n=>$A(P({},n),{timestamp:A}));this.sessionService.importSession(this.userId,this.appName,t,e.state).subscribe(n=>{this.openSnackBar(`Session imported successfully (ID: ${n.id})`,"OK"),this.sessionTab?.refreshSession(),this.showSessionSelectorDrawer=!1,this.updateWithSelectedSession(n)})}onResize(){this.checkScreenSize()}checkScreenSize(){let e=window.innerWidth<=768;this.isMobile.set(e)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-chat"]],viewQuery:function(A,t){A&1&&ls(t.chatPanel,h1,5)(t.canvasComponent,QE,5)(t.sideDrawer,eSA,5)(t.sidePanel,xE,5)(t.drawerSessionTab,tSA,5)(t.evalTab,Sc,5)(t.appSearchInput,iSA,5)(t.invChipMenuTrigger,nSA,5)(t.nodeChipMenuTrigger,oSA,5)(t.addMenuTrigger,aSA,5),A&2&&br(10)},hostBindings:function(A,t){A&1&&U("keydown",function(o){return t.handleEscapeKey(o)},Fg)("resize",function(){return t.onResize()},Fg)},features:[pt([{provide:rd,useClass:aN}])],ngContentSelectors:sSA,decls:47,vars:17,consts:[["userMenu","matMenu"],["selectorDrawer",""],["sideDrawer",""],["appSearchInput",""],["drawerSessionTab",""],["addFilterMenu","matMenu"],["invocationMenu","matMenu"],["nodePathMenu","matMenu"],["invChipMenuTrigger","matMenuTrigger"],["nodeChipMenuTrigger","matMenuTrigger"],["addMenuTrigger","matMenuTrigger"],["moreOptionsMenu","matMenu"],[1,"app-toolbar"],[1,"toolbar-group","toolbar-agent-group"],["mat-icon-button","","aria-label","Toggle side panel",1,"toolbar-icon-button",3,"click"],[1,"toolbar-logo"],[1,"selector-group"],["matTooltip","Select an app",1,"selector-button",3,"click"],["fontSet","material-symbols-outlined"],[1,"selector-label"],["color","warn","matTooltip","The app for the loaded file is not available",2,"margin-left","4px"],["fontSet","material-symbols-outlined",1,"selector-caret"],[1,"toolbar-group","toolbar-session-group"],["mat-icon-button","","matTooltip","User","aria-label","User menu",1,"toolbar-icon-button","user-avatar-button",3,"matMenuTriggerFor"],["xPosition","before","panelClass","user-avatar-menu"],[1,"user-menu-panel",3,"click"],[1,"user-menu-header"],[1,"user-menu-label"],[2,"flex","1"],["mat-icon-button","","matTooltip","Reset to default user",1,"small-icon-button",3,"click"],[1,"user-menu-content"],["textClass","user-menu-id",3,"save","value","placeholder"],["autosize","",1,"drawer-container"],["mode","over","position","start",1,"selector-drawer",3,"closedStart","opened","autoFocus"],["autosize","",1,"side-panel-container"],["appResizableDrawer","",1,"side-drawer",3,"mode"],[3,"isApplicationSelectorEnabledObs","showSidePanel","appName","userId","sessionId","isViewOnlySession","isViewOnlyAppNameMismatch","traceData","eventData","currentSessionState","artifacts","selectedEvent","selectedEventIndex","renderedEventGraph","rawSvgString","selectedEventGraphPath","llmRequest","llmResponse","disableBuilderIcon","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab"],[1,"builder-mode-container"],[1,"chat-container"],[3,"appName","preloadedAppData","preloadedLightGraphSvg","preloadedDarkGraphSvg","startPath"],[4,"ngComponentOutlet"],["src","assets/ADK-512-color.svg","width","20px","height","20px","alt","ADK Logo"],[1,"logo-title-container"],[1,"logo-text-wrapper"],[1,"toolbar-logo-text","logo-wide"],[1,"toolbar-logo-text","logo-wide",2,"color","var(--mat-sys-outline)"],[1,"custom-tooltip"],[1,"tooltip-desc"],[1,"tooltip-grid"],[1,"toolbar-logo-text","logo-narrow"],[1,"tooltip-item"],[1,"tooltip-label"],[1,"tooltip-value"],[1,"selector-group-divider"],["matTooltipPosition","below",3,"matTooltip"],["mat-icon-button","",1,"toolbar-icon-button",3,"click","disabled"],["mat-icon-button","","matTooltipPosition","below",1,"toolbar-icon-button",3,"click","disabled"],[1,"readonly-chip"],[1,"toolbar-content"],[2,"display","flex","align-items","center"],[1,"toolbar-actions"],["mat-icon-button","",1,"toolbar-icon-button",3,"matTooltip"],["fontSet","material-symbols-outlined",2,"font-size","18px","width","18px","height","18px","line-height","18px"],[1,"chip-label"],["mat-icon-button","","aria-label","Close readonly view",1,"chip-close-button",3,"click"],[2,"font-size","16px","width","16px","height","16px"],["matTooltip","Select a session",1,"selector-button",3,"click"],["id","toolbar-new-session-button",1,"selector-button","new-session-button",3,"matTooltip"],["id","toolbar-new-session-button",1,"selector-button","new-session-button","icon-only",3,"matTooltip"],["id","toolbar-new-session-button",1,"selector-button","new-session-button",3,"click","matTooltip"],["id","toolbar-new-session-button",1,"selector-button","new-session-button","icon-only",3,"click","matTooltip"],[1,"chip-value"],["mat-button","",2,"height","30px",3,"click"],["mat-flat-button","",2,"height","30px",3,"click","disabled"],[1,"toolbar-session-text"],["mat-icon-button","",1,"toolbar-icon-button",3,"click","matTooltip"],[1,"selector-drawer-header"],[1,"selector-drawer-title"],["mat-icon-button","","matTooltip","Create new agent","matTooltipPosition","below","aria-label","Create new agent",1,"toolbar-icon-button",3,"click"],["mat-icon-button","","aria-label","Close app selector",1,"toolbar-icon-button",3,"click"],[1,"app-selector-search"],["subscriptSizing","dynamic","appearance","outline",1,"app-selector-search-field"],["matPrefix",""],["matInput","","placeholder","Search apps...",3,"keydown","formControl"],[1,"app-selector-list",3,"keydown"],[1,"app-selector-loading"],["mode","indeterminate","diameter","32"],[1,"app-selector-item",3,"selected"],[1,"app-selector-empty"],[1,"app-selector-item",3,"click"],["fontSet","material-symbols-outlined",1,"app-selector-item-icon"],[1,"app-selector-item-name"],[1,"app-selector-check"],[2,"display","flex","gap","4px"],["mat-button","",1,"toolbar-button",3,"matTooltip"],["mat-button","",1,"toolbar-button",3,"click","matTooltip"],["mat-icon-button","","aria-label","Close session selector",1,"toolbar-icon-button",3,"click"],[1,"session-selector-current-id"],[1,"session-selector-drawer-content"],[3,"sessionSelected","sessionReloaded","userId","appName","sessionId"],[1,"session-selector-current-id-label"],[1,"session-selector-current-id-row"],["textClass","session-selector-current-id-value",3,"save","value","displayValue","tooltip"],[1,"session-selector-current-real-id-row",2,"display","flex","align-items","center","gap","4px"],[1,"session-selector-current-real-id-value",3,"title"],["mat-icon-button","","matTooltip","Copy session ID","aria-label","Copy session ID",1,"session-selector-action-button",3,"click"],["mat-button","",3,"matTooltip"],["mat-button","","color","warn",3,"matTooltip"],["mat-button","",3,"click","matTooltip"],["mat-button","","color","warn",3,"click","matTooltip"],[3,"jumpToInvocation","closePanel","tabChange","sessionSelected","evalCaseSelected","editEvalCaseRequested","testSelected","evalSetIdSelected","returnToSession","evalNotInstalled","page","closeSelectedEvent","openImageDialog","openAddItemDialog","enterBuilderMode","showAgentStructureGraph","switchToEvent","switchToTraceView","drillDownNodePath","selectEventById","isApplicationSelectorEnabledObs","showSidePanel","appName","userId","sessionId","isViewOnlySession","isViewOnlyAppNameMismatch","traceData","eventData","currentSessionState","artifacts","selectedEvent","selectedEventIndex","renderedEventGraph","rawSvgString","selectedEventGraphPath","llmRequest","llmResponse","disableBuilderIcon","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab"],[3,"exitBuilderMode","closePanel","appNameInput"],[1,"resize-handler"],[1,"builder-exit-button"],["mat-icon-button","","matTooltip","Accept",1,"builder-mode-action-button",3,"click"],["mat-icon-button","","matTooltip","Exit Builder Mode",1,"builder-mode-action-button",3,"click"],["mat-icon-button","","matTooltip","Builder Assistant",1,"builder-mode-action-button",3,"click"],[3,"toggleSidePanelRequest","builderAssistantCloseRequest","showSidePanel","showBuilderAssistant","appNameInput"],[1,"chat-card"],[1,"empty-state-container"],[1,"warning"],[1,"error"],[1,"chat-sub-toolbar"],[2,"font-weight","500","font-size","14px","color","var(--mat-sys-on-surface)"],[2,"flex-grow","1"],["mat-icon-button","",1,"toolbar-icon-button",3,"click","matTooltip","disabled"],["mat-button","","matTooltip","Compare with expected",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px","margin-left","8px","margin-right","8px",3,"color"],[3,"appName","agentReadme","userInput","hideIntermediateEvents","uiEvents","showBranches","traceData","isTokenStreamingEnabled","useSse","isChatMode","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"appName","agentReadme","hideIntermediateEvents","uiEvents","showBranches","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[1,"file-view-container",2,"padding","20px","display","flex","flex-direction","column","align-items","center","justify-content","center","height","100%"],["hideSingleSelectionIndicator","",3,"change","value"],["value","events"],["value","traces"],[1,"filter-bar-container",3,"click"],[1,"filter-chip",3,"matMenuTriggerFor","matTooltip"],["matTooltip","Hide intermediate events to only show final results",1,"filter-chip"],["type","button","matTooltip","Add a filter",1,"add-filter-btn",3,"matMenuTriggerFor"],["type","button","matTooltip","Clear all filters",1,"add-filter-btn"],[1,"filter-panel"],["mat-menu-item","","matTooltip","Filter events by a specific invocation","matTooltipPosition","right"],["mat-menu-item","","matTooltip","Filter events generated by a specific node","matTooltipPosition","right"],["mat-menu-item","","matTooltip","Hide intermediate events to only show final results","matTooltipPosition","right"],[1,"filter-panel",3,"closed"],["mat-menu-item","","matTooltipPosition","right",3,"matTooltip"],["mat-menu-item",""],[1,"filter-chip",3,"click","matMenuTriggerFor","matTooltip"],[1,"chip-label",3,"title"],[1,"chip-remove",3,"click"],["matTooltip","Hide intermediate events to only show final results",1,"filter-chip",3,"click"],["type","button","matTooltip","Add a filter",1,"add-filter-btn",3,"click","matMenuTriggerFor"],["type","button","matTooltip","Clear all filters",1,"add-filter-btn",3,"click"],["mat-menu-item","","matTooltip","Filter events by a specific invocation","matTooltipPosition","right",3,"click"],["mat-menu-item","","matTooltip","Filter events generated by a specific node","matTooltipPosition","right",3,"click"],["mat-menu-item","","matTooltip","Hide intermediate events to only show final results","matTooltipPosition","right",3,"click"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[2,"font-size","16px","width","16px","height","16px","margin-right","8px","color","var(--mat-sys-primary)"],["mat-menu-item","",3,"click"],["mat-button","","matTooltip","Compare with expected",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px","margin-left","8px","margin-right","8px",3,"click"],[2,"font-size","20px","width","20px","height","20px","line-height","20px","margin-right","4px","vertical-align","middle"],[2,"font-size","13px","font-weight","500","vertical-align","middle"],["mat-icon-button","","aria-label","More options",1,"toolbar-icon-button",3,"matMenuTriggerFor","matTooltip"],["xPosition","before"],[2,"font-size","20px","width","20px","height","20px","line-height","20px","margin-right","8px","vertical-align","middle"],[2,"vertical-align","middle"],[3,"userInputChange","toggleHideIntermediateEvents","toggleSse","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","fileSelect","removeFile","removeStateUpdate","sendMessage","stopMessage","updateState","toggleAudioRecording","toggleVideoRecording","longRunningResponseComplete","manualScroll","appName","agentReadme","userInput","hideIntermediateEvents","uiEvents","showBranches","traceData","isTokenStreamingEnabled","useSse","isChatMode","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"userInputChange","userEditEvalCaseMessageChange","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","appName","agentReadme","hideIntermediateEvents","uiEvents","showBranches","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[1,"eval-result-summary",2,"margin","0","padding","8px 24px","background","var(--mat-sys-surface-container)","border-bottom","1px solid var(--mat-sys-outline-variant)","display","flex","align-items","center"],[1,"side-by-side-layout"],[3,"appName","agentReadme","hideIntermediateEvents","uiEvents","showBranches","traceData","isChatMode","evalCase","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[2,"display","flex","gap","12px","align-items","center","flex-wrap","wrap"],[1,"metric-block",2,"position","relative","display","flex","flex-direction","column","gap","2px","background","var(--mat-sys-surface-container-high)","padding","6px 12px","border-radius","6px","flex-shrink","0","cursor","pointer",3,"border"],[1,"metric-block",2,"position","relative","display","flex","flex-direction","column","gap","2px","background","var(--mat-sys-surface-container-high)","padding","6px 12px","border-radius","6px","flex-shrink","0","cursor","pointer"],[2,"color","var(--mat-sys-on-surface-variant)","font-size","11px","font-weight","500"],[2,"display","flex","align-items","baseline","gap","4px"],[2,"font-size","16px","font-weight","600"],[2,"color","var(--mat-sys-on-surface-variant)","font-size","14px","font-weight","500"],[1,"metric-tooltip"],[1,"tooltip-title"],[1,"tooltip-subtitle",2,"font-size","10px","color","var(--mat-sys-on-surface-variant)","margin-bottom","4px"],[1,"tooltip-desc",2,"margin-top","8px","border-top","1px solid var(--mat-sys-outline-variant)","padding-top","6px","margin-bottom","0"],[1,"side-panel-half"],[1,"panel-header"],[3,"manualScroll","appName","agentReadme","hideIntermediateEvents","uiEvents","showBranches","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"toggleHideIntermediateEvents","toggleSse","userInputChange","userEditEvalCaseMessageChange","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","fileSelect","removeFile","removeStateUpdate","sendMessage","updateState","toggleAudioRecording","toggleVideoRecording","longRunningResponseComplete","manualScroll","appName","agentReadme","hideIntermediateEvents","uiEvents","showBranches","traceData","isTokenStreamingEnabled","useSse","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"manualScroll","appName","agentReadme","hideIntermediateEvents","uiEvents","showBranches","traceData","isChatMode","evalCase","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[2,"font-size","48px","width","48px","height","48px","color","var(--mat-sys-on-surface-variant)"],[2,"margin-top","16px"],[2,"color","var(--mat-sys-on-surface-variant)"],[3,"close","appName","preloadedAppData","preloadedLightGraphSvg","preloadedDarkGraphSvg","startPath"]],template:function(A,t){if(A&1&&(Ot(rSA),I(0,"mat-toolbar",12)(1,"div",13)(2,"button",14),U("click",function(){return t.toggleSidePanel()}),I(3,"mat-icon"),D(4,"menu"),h()(),I(5,"div",15),T(6,cSA,1,1,"ng-container")(7,ISA,12,3),h(),I(8,"div",16)(9,"button",17),U("click",function(){return t.toggleAppSelectorDrawer()}),I(10,"mat-icon",18),D(11,"robot_2"),h(),I(12,"span",19),D(13),h(),T(14,BSA,2,0,"mat-icon",20),I(15,"mat-icon",21),D(16,"arrow_drop_down"),h()(),T(17,ESA,6,3),h()(),T(18,NSA,10,5,"div",22),I(19,"button",23)(20,"mat-icon"),D(21,"account_circle"),h()(),I(22,"mat-menu",24,0)(24,"div",25),U("click",function(o){return o.stopPropagation()}),I(25,"div",26)(26,"span",27),D(27,"User ID"),h(),lA(28,"span",28),I(29,"button",29),U("click",function(){return t.saveUserId("user")}),I(30,"mat-icon"),D(31,"restart_alt"),h()()(),I(32,"div",30)(33,"app-inline-edit",31),U("save",function(o){return t.saveUserId(o)}),h()()()()(),I(34,"mat-drawer-container",32)(35,"mat-drawer",33,1),U("closedStart",function(){return t.onSelectorDrawerClosed()})("opened",function(){return t.onSelectorDrawerOpened()}),T(37,TSA,20,4)(38,zSA,18,8),h(),I(39,"mat-drawer-container",34)(40,"mat-drawer",35,2),T(42,PSA,1,23,"app-side-panel",36)(43,jSA,2,1),h(),T(44,VSA,12,5,"div",37)(45,SkA,5,4,"div",38),h()(),T(46,kkA,1,5,"app-agent-structure-graph-dialog",39)),A&2){let n=Bi(23);Q(6),O(t.logoComponent?6:7),Q(7),nA(t.isLoadedAppUnavailable()?t.unavailableAppName():t.appName||"Select an app"),Q(),O(t.isLoadedAppUnavailable()?14:-1),Q(3),O(t.isBuilderMode()?-1:17),Q(),O(t.appName?18:-1),Q(),H("matMenuTriggerFor",n),Q(14),H("value",t.userId)("placeholder",t.i18n.userIdInputPlaceholder),Q(2),_A("match-side-panel-width",t.showSidePanel),H("opened",t.showAppSelectorDrawer||t.showSessionSelectorDrawer)("autoFocus",!1),Q(2),O(t.showAppSelectorDrawer?37:t.showSessionSelectorDrawer?38:-1),Q(3),H("mode",t.isMobile()?"over":"side"),Q(2),O(t.isBuilderMode()?43:42),Q(2),O(t.isBuilderMode()?44:45),Q(2),O(t.showAgentStructureOverlay?46:-1)}},dependencies:[u7,t7,Am,rn,Q7,bm,fn,Gn,Kn,WC,x1,zt,ki,yi,s2,hs,Gs,tg,qf,uT,Kc,Zo,ka,Es,h1,c6,xE,QE,w5,Sy,Ny,gs,bI,Q1],styles:['.expand-side-drawer[_ngcontent-%COMP%]{position:relative;top:4%;left:1%}.chat-container[_ngcontent-%COMP%]{width:100%;height:100%;max-width:100%;margin:auto;display:flex;flex-direction:column;flex:1}.chat-container.side-by-side[_ngcontent-%COMP%]{max-width:100%}.side-by-side-layout[_ngcontent-%COMP%]{display:flex;flex-direction:row;width:100%;height:100%;flex:1;overflow:hidden;gap:16px;padding:16px;box-sizing:border-box}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;height:100%;min-width:0;background-color:var(--mat-sys-surface-container-low);border-radius:8px;overflow:hidden}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%] .panel-header[_ngcontent-%COMP%]{padding:6px 16px;font-size:14px;font-weight:600;color:var(--mat-sys-on-surface);border-bottom:1px solid var(--mat-sys-outline-variant)}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%] app-chat-panel[_ngcontent-%COMP%]{flex:1;overflow:hidden;display:flex;flex-direction:column}.event-container[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)}.chat-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;overflow:hidden;flex:1;min-height:12%;min-width:300px;box-shadow:none;border-radius:12px 0 0}.chat-card[_ngcontent-%COMP%] app-chat-panel[_ngcontent-%COMP%]{flex:1;min-height:0}.chat-card.no-side-panel[_ngcontent-%COMP%]{border-radius:0}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;margin-top:16px}.content-bubble[_ngcontent-%COMP%]{padding:5px 20px;margin:5px;border-radius:20px;max-width:80%;font-size:14px;font-weight:400;position:relative;display:inline-block}.function-event-button[_ngcontent-%COMP%]{margin:5px 5px 10px}.function-event-button-highlight[_ngcontent-%COMP%]{border-color:var(--mat-sys-primary)!important;color:var(--mat-sys-on-primary)!important}.role-user[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center}.role-user[_ngcontent-%COMP%] .content-bubble[_ngcontent-%COMP%]{align-self:flex-end;color:var(--mat-sys-on-primary-container);background-color:var(--mat-sys-primary-container);box-shadow:none}.role-bot[_ngcontent-%COMP%]{display:flex;align-items:center}.role-bot[_ngcontent-%COMP%] .content-bubble[_ngcontent-%COMP%]{align-self:flex-start;color:var(--mat-sys-on-surface);background-color:var(--mat-sys-surface-container-high);box-shadow:none}.role-bot[_ngcontent-%COMP%]:focus-within .content-bubble[_ngcontent-%COMP%]{border:1px solid var(--mat-sys-outline)}.message-textarea[_ngcontent-%COMP%]{max-width:100%;border:none;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}.content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--mat-sys-outline-variant);padding-right:8px;min-width:350px;max-width:350px}.content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}.content-bubble[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--mat-sys-outline-variant);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--mat-sys-tertiary)}.header-actual[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#2e7d32}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--mat-sys-error)}.navigation-button-sidepanel[_ngcontent-%COMP%]{margin-left:auto;margin-right:20px}.fab-button[_ngcontent-%COMP%]{position:fixed;bottom:200px;right:100px}.sidepanel-toggle[_ngcontent-%COMP%]{position:relative;top:100px}.side-drawer[_ngcontent-%COMP%]{color:var(--chat-side-drawer-color);border-radius:0}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.file-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:5px;padding:5px;border-radius:4px}.empty-state-container[_ngcontent-%COMP%]{color:var(--chat-empty-state-container-color);height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Google Sans,sans-serif;font-weight:400;letter-spacing:normal;line-height:24px;font-size:18px}.empty-state-container[_ngcontent-%COMP%] pre.warning[_ngcontent-%COMP%]{color:var(--chat-warning-color)}.empty-state-container[_ngcontent-%COMP%] pre.error[_ngcontent-%COMP%]{color:var(--chat-error-color)}.new-session-button[_ngcontent-%COMP%]{margin-top:0;width:130px;height:28px;font-size:14px}.adk-checkbox[_ngcontent-%COMP%]{position:fixed;bottom:0;left:0;right:0;margin-bottom:20px;margin-left:20px}.app-toolbar[_ngcontent-%COMP%]{height:48px;min-height:48px!important;display:flex;align-items:center;font-family:Google Sans,sans-serif;font-size:13px;padding:0 8px!important;z-index:1}.toolbar-group[_ngcontent-%COMP%]{display:flex;align-items:center;flex-shrink:0}.toolbar-agent-group[_ngcontent-%COMP%]{margin-right:6px}.toolbar-session-group[_ngcontent-%COMP%]{flex-shrink:1;min-width:0;flex:1}.toolbar-logo[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;margin-right:16px;flex-shrink:0}.toolbar-logo-text[_ngcontent-%COMP%]{font-family:Google Sans,sans-serif;font-size:14px;font-weight:500;white-space:nowrap}.disclosure-info-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;opacity:.7;cursor:pointer;margin-right:16px;color:var(--chat-toolbar-icon-color)}.toolbar-content[_ngcontent-%COMP%]{display:flex;align-items:center;flex:1;min-width:0}.drawer-container[_ngcontent-%COMP%]{height:calc(100% - 48px)}.side-panel-container[_ngcontent-%COMP%]{width:100%;height:100%}.toolbar-actions[_ngcontent-%COMP%]{margin-left:auto;display:flex;align-items:center;flex-shrink:0}.toolbar-session-text[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-text-color);font-family:Google Sans,sans-serif;font-size:13px;font-style:normal;font-weight:500;text-transform:uppercase;flex-shrink:0}.toolbar-session-id[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-id-color);font-family:Google Sans Mono,monospace;font-size:13px;margin-left:5px}.readonly-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;background-color:var(--mat-sys-primary-container)!important;color:var(--mat-sys-on-primary-container)!important;padding:4px 12px;border-radius:16px;font-size:13px;font-weight:500;gap:6px}.readonly-chip[_ngcontent-%COMP%] .chip-label[_ngcontent-%COMP%]{text-transform:uppercase;font-size:11px;font-weight:700;opacity:.9}.readonly-chip[_ngcontent-%COMP%] .chip-value[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.readonly-chip[_ngcontent-%COMP%] .chip-close-button[_ngcontent-%COMP%]{width:24px!important;height:24px!important;min-width:24px!important;padding:0!important;display:flex!important;align-items:center;justify-content:center;color:inherit!important;opacity:.8;margin-left:4px}.readonly-chip[_ngcontent-%COMP%] .chip-close-button[_ngcontent-%COMP%]:hover{opacity:1;background-color:#fff3!important}.toolbar-session-id-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-left:5px}.toolbar-session-id-container[_ngcontent-%COMP%] .toolbar-session-id[_ngcontent-%COMP%]{margin-left:0}.toolbar-icon-button[_ngcontent-%COMP%]{color:var(--chat-toolbar-icon-color);background:transparent!important;border:none!important;box-shadow:none!important}.toolbar-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.small-icon-button[_ngcontent-%COMP%]{width:28px!important;height:28px!important;min-width:28px!important;min-height:28px!important;padding:0!important}.small-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px!important;width:18px!important;height:18px!important}.toolbar-user-id-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-left:5px}.toolbar-user-id-input[_ngcontent-%COMP%]{width:140px;height:24px;border:1px solid var(--chat-toolbar-session-text-color);border-radius:4px;color:var(--chat-toolbar-session-id-color);padding:0 6px;font-family:Google Sans Mono,monospace;font-size:12px}.toolbar-user-id-input[_ngcontent-%COMP%]:focus{outline:1px solid var(--chat-toolbar-icon-color)}.user-avatar-button[_ngcontent-%COMP%]{margin-left:auto;flex-shrink:0}.user-avatar-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:24px;width:24px;height:24px}.user-menu-panel[_ngcontent-%COMP%]{padding:16px;min-width:240px}.user-menu-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin-bottom:12px}.user-menu-avatar-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px;color:var(--chat-toolbar-icon-color)}.user-menu-label[_ngcontent-%COMP%]{font-size:14px;font-weight:500;color:var(--chat-toolbar-session-text-color);text-transform:uppercase}.user-menu-content[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.user-menu-id[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:14px;color:var(--chat-toolbar-session-id-color);word-break:break-all}.user-menu-input[_ngcontent-%COMP%]{flex:1;height:28px;border:1px solid var(--chat-toolbar-session-text-color);border-radius:4px;color:var(--chat-toolbar-session-id-color);padding:0 8px;font-family:Google Sans Mono,monospace;font-size:13px;background:transparent}.user-menu-input[_ngcontent-%COMP%]:focus{outline:1px solid var(--chat-toolbar-icon-color)}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.readonly-badge[_ngcontent-%COMP%]{color:var(--mat-sys-on-primary-container)!important;background-color:var(--mat-sys-primary-container)!important;border-radius:16px;padding:4px 12px;display:flex;align-items:center;margin-left:8px;font-family:Google Sans,sans-serif;font-size:13px;line-height:18px;gap:4px;white-space:nowrap}.readonly-badge[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;flex-shrink:0}.readonly-session-message[_ngcontent-%COMP%]{display:block;color:var(--chat-toolbar-session-text-color);font-family:Google Sans,sans-serif;font-size:13px;margin-left:1em;font-weight:400;line-height:18px;letter-spacing:.3px;flex-shrink:1}.builder-mode-container[_ngcontent-%COMP%]{position:relative;width:100%;height:100vh;display:flex;flex-direction:column}.builder-exit-button[_ngcontent-%COMP%]{position:absolute;top:20px;right:20px;display:flex;gap:8px}.builder-mode-action-button[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color)!important;border-radius:50%!important;transition:all .2s ease!important;margin:0!important;padding:0!important;width:40px!important;height:40px!important;min-width:40px!important;min-height:40px!important;border:1px solid var(--builder-tool-item-border-color)!important;box-shadow:0 2px 4px #0000001a!important;display:flex!important;align-items:center!important;justify-content:center!important}.builder-mode-action-button[_ngcontent-%COMP%]:hover{box-shadow:0 4px 8px #00000026!important}.builder-mode-action-button.active[_ngcontent-%COMP%]{color:#fff!important;border-color:var(--builder-button-primary-background-color)!important}.builder-mode-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}app-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;flex:1!important;display:flex!important;flex-direction:column!important;min-height:0!important}.build-mode-container[_ngcontent-%COMP%]{display:flex;width:100%;height:100%}.build-left-panel[_ngcontent-%COMP%], .build-right-panel[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;border:1px solid var(--builder-border-color);margin:10px;border-radius:8px}.selector-group[_ngcontent-%COMP%]{display:flex;align-items:center;border-radius:6px;border:1px solid var(--mat-sys-outline-variant, #c4c7c5);margin-right:8px;flex-shrink:0;height:32px;overflow:hidden}.selector-group[_ngcontent-%COMP%] .toolbar-icon-button[_ngcontent-%COMP%]{width:32px;height:32px;padding:0;display:flex;align-items:center;justify-content:center;flex-shrink:0}.selector-group[_ngcontent-%COMP%] .toolbar-icon-button[_ngcontent-%COMP%] .mdc-icon-button__ripple{border-radius:4px;inset:1px}.selector-group[_ngcontent-%COMP%] .toolbar-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.selector-group-divider[_ngcontent-%COMP%]{width:1px;height:16px;background-color:var(--mat-sys-outline-variant, #c4c7c5);flex-shrink:0}.selector-button[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;padding:4px 12px;margin-right:1px;border-radius:6px;border:none;background:transparent;cursor:pointer;color:var(--chat-toolbar-icon-color);font-family:Google Sans,sans-serif;font-size:13px;font-weight:500;height:100%;flex-shrink:0;white-space:nowrap;width:auto;max-width:220px;overflow:hidden;transition:background-color .15s ease;position:relative;z-index:0}.selector-button[_ngcontent-%COMP%]:before{content:"";position:absolute;inset:1px;border-radius:4px;background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant));opacity:0;pointer-events:none;z-index:-1;transition:opacity .15s ease}.selector-button[_ngcontent-%COMP%]:hover:before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.selector-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0}.new-session-button[_ngcontent-%COMP%]{width:auto!important}.new-session-button.icon-only[_ngcontent-%COMP%]{width:32px!important;padding:0!important;justify-content:center}.selector-label[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;flex:1;text-align:left}.selector-caret[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0;margin-left:auto;opacity:.7}.selector-drawer-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:8px 8px 8px 20px;height:48px;flex-shrink:0}.selector-drawer-title[_ngcontent-%COMP%]{font-size:16px;font-weight:500;font-family:Google Sans,sans-serif}.selector-drawer[_ngcontent-%COMP%]{width:320px;background-color:var(--mat-sys-surface, #fff)}.selector-drawer[_ngcontent-%COMP%] .mat-drawer-inner-container{display:flex;flex-direction:column;height:100%;overflow:hidden}.selector-drawer.match-side-panel-width[_ngcontent-%COMP%]{width:var(--side-drawer-width)}.app-selector-search[_ngcontent-%COMP%]{padding:0 12px 4px;flex-shrink:0}.app-selector-search-field[_ngcontent-%COMP%]{width:100%;font-size:13px}.app-selector-search-field[_ngcontent-%COMP%] .mat-mdc-form-field-infix[_ngcontent-%COMP%]{min-height:36px;padding-top:6px!important;padding-bottom:6px!important}.app-selector-search-field[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-text-color);font-size:18px;width:18px;height:18px}.app-selector-list[_ngcontent-%COMP%]{flex:1;overflow-y:auto;padding:0 8px}.app-selector-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;border:none;background:transparent;cursor:pointer;border-radius:8px;font-family:Google Sans Mono,monospace;font-size:13px;color:var(--chat-toolbar-icon-color);text-align:left;transition:background-color .15s ease}.app-selector-item[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant, rgba(0, 0, 0, .04))}.app-selector-item.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, #d7e3f7);font-weight:500}.app-selector-item-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;flex-shrink:0;color:var(--chat-toolbar-session-text-color)}.app-selector-check[_ngcontent-%COMP%]{margin-left:auto;font-size:18px;width:18px;height:18px}.app-selector-item-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-selector-loading[_ngcontent-%COMP%]{display:flex;justify-content:center;padding:24px}.app-selector-empty[_ngcontent-%COMP%]{text-align:center;padding:24px;color:var(--chat-toolbar-session-text-color);font-style:italic}.session-selector-current-id[_ngcontent-%COMP%]{padding:8px 20px;border-bottom:1px solid var(--mat-sys-outline-variant, #c4c7c5)}.session-selector-current-id-label[_ngcontent-%COMP%]{font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.5px;color:var(--mat-sys-on-surface-variant, #444746)}.session-selector-current-id-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.session-selector-current-id-value[_ngcontent-%COMP%]{font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px;font-family:Google Sans,sans-serif;color:var(--mat-sys-on-surface, #1a1c20);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:0 1 auto;min-width:0}.session-selector-current-real-id-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.session-selector-current-real-id-value[_ngcontent-%COMP%]{font-size:11px;font-family:Google Sans Mono,monospace;color:var(--chat-toolbar-session-id-color);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:0 1 auto;min-width:0;opacity:.7}.session-selector-action-button[_ngcontent-%COMP%]{flex-shrink:0;width:28px!important;height:28px!important;padding:0!important}.session-selector-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}.session-selector-drawer-content[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.build-panel-header[_ngcontent-%COMP%]{padding:16px 20px;border-bottom:1px solid var(--builder-border-color);border-radius:8px 8px 0 0}.build-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--builder-text-primary-color);font-size:16px;font-weight:500;font-family:Google Sans,Helvetica Neue,sans-serif}.build-panel-content[_ngcontent-%COMP%]{flex:1;padding:20px;color:var(--builder-text-secondary-color);overflow-y:auto}.build-panel-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5}.app-name-option[_ngcontent-%COMP%], .app-select[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:unset}.adk-web-developer-ui-disclaimer[_ngcontent-%COMP%]{padding-left:4px;padding-bottom:4px;font-size:10px;color:var(--adk-web-text-color-light-gray)}.menu-check-icon.inactive[_ngcontent-%COMP%]{visibility:hidden}.logo-narrow[_ngcontent-%COMP%]{display:none}@media(max-width:900px){.logo-wide[_ngcontent-%COMP%]{display:none}.logo-narrow[_ngcontent-%COMP%]{display:inline}}@media(max-width:768px){.toolbar-agent-group[_ngcontent-%COMP%] .selector-label[_ngcontent-%COMP%], .toolbar-session-group[_ngcontent-%COMP%] .selector-label[_ngcontent-%COMP%]{display:none!important}.selector-caret[_ngcontent-%COMP%]{margin-left:2px!important}.selector-group[_ngcontent-%COMP%], .toolbar-agent-group[_ngcontent-%COMP%]{margin-right:4px!important}.chat-card[_ngcontent-%COMP%]{min-width:0!important}.side-drawer[_ngcontent-%COMP%]{width:85vw!important;max-width:360px!important}.selector-drawer[_ngcontent-%COMP%]{width:100vw!important;max-width:100%!important}.side-by-side-layout[_ngcontent-%COMP%]{flex-direction:column!important;overflow-y:auto!important;gap:12px!important;padding:12px!important}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%]{height:400px!important;flex:none!important}.chat-sub-toolbar[_ngcontent-%COMP%]{padding:0 8px!important;gap:4px!important;overflow-x:auto;white-space:nowrap}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-bar-container[_ngcontent-%COMP%]{margin-left:8px!important;gap:4px!important}}@media(max-width:400px){.toolbar-logo[_ngcontent-%COMP%]{display:none!important}}.chat-sub-toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 8px 0 20px;background-color:var(--mat-sys-surface-container);border-bottom:1px solid var(--mat-sys-outline-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{border-radius:16px;height:28px;align-items:center}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] .mat-button-toggle-label-content{line-height:28px;padding:0 12px;font-size:13px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-bar-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;background-color:transparent;border:none;margin-left:16px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;height:28px;cursor:pointer;transition:background-color .2s ease}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-label[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;color:var(--mat-sys-on-surface-variant);padding:0;margin-left:4px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:transparent;border:1px dashed var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;font-weight:500;height:28px;cursor:pointer;transition:all .2s ease;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant);border-color:var(--mat-sys-outline);color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;margin-right:4px} .filter-panel{min-width:max-content!important;max-width:50vw} .filter-panel .mat-mdc-menu-item{min-height:32px!important;font-size:12px!important} .filter-panel .mat-mdc-menu-item .mat-mdc-menu-item-text, .filter-panel .mat-mdc-menu-item .mdc-list-item__primary-text{font-size:12px!important;line-height:normal}.metric-block[_ngcontent-%COMP%]:hover .metric-tooltip[_ngcontent-%COMP%]{visibility:visible!important;opacity:1!important}.metric-tooltip[_ngcontent-%COMP%]{visibility:hidden;opacity:0;position:absolute;z-index:100;top:110%;left:0;background:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:12px;width:220px;box-shadow:0 4px 12px #00000026;transition:opacity .15s ease,visibility .15s ease;pointer-events:none}.metric-tooltip[_ngcontent-%COMP%] .tooltip-title[_ngcontent-%COMP%]{font-weight:600;font-size:13px;margin-bottom:4px;color:var(--mat-sys-on-surface)}.metric-tooltip[_ngcontent-%COMP%] .tooltip-desc[_ngcontent-%COMP%]{font-size:11px;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;white-space:normal;line-height:1.4}.metric-tooltip[_ngcontent-%COMP%] .tooltip-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:6px;font-size:11px;border-top:1px solid var(--mat-sys-outline-variant);padding-top:6px}.metric-tooltip[_ngcontent-%COMP%] .tooltip-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:4px}.metric-tooltip[_ngcontent-%COMP%] .tooltip-label[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-weight:400}.metric-tooltip[_ngcontent-%COMP%] .tooltip-value[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface)}.logo-title-container[_ngcontent-%COMP%]{position:relative;display:inline-flex;align-items:center;cursor:default}.logo-title-container[_ngcontent-%COMP%]:hover .custom-tooltip[_ngcontent-%COMP%]{visibility:visible;opacity:1}.custom-tooltip[_ngcontent-%COMP%]{visibility:hidden;opacity:0;position:absolute;z-index:100;top:110%;left:50%;transform:translate(-50%);background:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:12px;width:250px;box-shadow:0 4px 12px #00000026;transition:opacity .15s ease,visibility .15s ease;pointer-events:none;white-space:normal}.custom-tooltip[_ngcontent-%COMP%] .tooltip-title[_ngcontent-%COMP%]{font-weight:600;font-size:13px;margin-bottom:4px;color:var(--mat-sys-on-surface)}.custom-tooltip[_ngcontent-%COMP%] .tooltip-desc[_ngcontent-%COMP%]{font-size:11px;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;line-height:1.4}.custom-tooltip[_ngcontent-%COMP%] .tooltip-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr;gap:4px;font-size:11px;border-top:1px solid var(--mat-sys-outline-variant);padding-top:6px}.custom-tooltip[_ngcontent-%COMP%] .tooltip-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:4px}.custom-tooltip[_ngcontent-%COMP%] .tooltip-label[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-weight:400}.custom-tooltip[_ngcontent-%COMP%] .tooltip-value[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface)}@keyframes _ngcontent-%COMP%_spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.spinning[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_spin 1s linear infinite}']})};var TE=class i{static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-root"]],decls:1,vars:0,template:function(A,t){A&1&&lA(0,"app-chat")},dependencies:[nD],encapsulation:2})};var NkA=[{path:"",component:TE}],oD=class i{static \u0275fac=function(A){return new(A||i)};static \u0275mod=et({type:i});static \u0275inj=At({imports:[Vf.forRoot(NkA),Vf]})};var aD=class{static getRuntimeConfig(){return window.runtimeConfig}};function FkA(i,e){if(i&1&&(Ln(0,"a",0),$n(1,"img",1),D(2),Xn()),i&2){p();let A=Ki(0),t=Ki(1);Q(),Ma("src",zC(A),mo),Q(),Ee(" ",t," ")}}function LkA(i,e){i&1&&(Ln(0,"div"),D(1," Invalid custom logo config. Make sure that your runtime config specifies both imgUrl and text in the logo field. "),Xn())}var rD=class i{logoConfig=aD.getRuntimeConfig().logo;static \u0275fac=function(A){return new(A||i)};static \u0275cmp=vA({type:i,selectors:[["app-custom-logo"]],decls:4,vars:3,consts:[["href","/"],["width","32px","height","32px",1,"orcas-logo",3,"src"]],template:function(A,t){if(A&1&&(ro(0)(1),T(2,FkA,3,3,"a",0)(3,LkA,2,0,"div")),A&2){let n=so(t.logoConfig==null?null:t.logoConfig.imageUrl);Q();let o=so(t.logoConfig==null?null:t.logoConfig.text);Q(),O(n&&o?2:3)}},styles:[`a[_ngcontent-%COMP%]{color:inherit;text-decoration:none;display:flex;align-items:center;gap:8px} - - - - - - - - - - - - - - - - -`]})};var GkA={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-as-n":!0,"layout-dis-iflx":!0,"layout-al-c":!0},KkA={"layout-w-100":!0},UkA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-mt-0":!0,"layout-mb-2":!0,"typography-sz-bm":!0,"color-c-n10":!0},TkA={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-pt-3":!0,"layout-pb-3":!0,"layout-pl-5":!0,"layout-pr-5":!0,"layout-mb-1":!0,"border-br-16":!0,"border-bw-0":!0,"border-c-n70":!0,"border-bs-s":!0,"color-bgc-s30":!0,"color-c-n100":!0,"behavior-ho-80":!0},rN={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mb-2":!0,"color-c-n10":!0},OkA=$A(P({},rN),{"typography-sz-tl":!0}),JkA=$A(P({},rN),{"typography-sz-tm":!0}),YkA=$A(P({},rN),{"typography-sz-ts":!0}),HkA={"behavior-sw-n":!0},Z$={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-pl-4":!0,"layout-pr-4":!0,"layout-pt-2":!0,"layout-pb-2":!0,"border-br-6":!0,"border-bw-1":!0,"color-bc-s70":!0,"border-bs-s":!0,"layout-as-n":!0,"color-c-n10":!0},zkA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0,"color-c-n10":!0},PkA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},jkA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},VkA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},qkA={"typography-f-c":!0,"typography-fs-n":!0,"typography-w-400":!0,"typography-sz-bm":!0,"typography-ws-p":!0,"layout-as-n":!0},WkA=$A(P({},Z$),{"layout-r-none":!0,"layout-fs-c":!0}),ZkA={"layout-el-cv":!0},P$=Hs.merge(GkA,{"color-c-p30":!0}),XkA=Hs.merge(Z$,{"color-c-n5":!0}),$kA=Hs.merge(WkA,{"color-c-n5":!0}),A_A=Hs.merge(TkA,{"color-c-n100":!0}),j$=Hs.merge(OkA,{"color-c-n5":!0}),V$=Hs.merge(JkA,{"color-c-n5":!0}),q$=Hs.merge(YkA,{"color-c-n5":!0}),e_A=Hs.merge(UkA,{"color-c-n5":!0}),W$=Hs.merge(zkA,{"color-c-n60":!0}),t_A=Hs.merge(qkA,{"color-c-n35":!0}),i_A=Hs.merge(PkA,{"color-c-n35":!0}),n_A=Hs.merge(jkA,{"color-c-n35":!0}),o_A=Hs.merge(VkA,{"color-c-n35":!0}),X$={additionalStyles:{Card:{},Button:{"--n-60":"var(--n-100)"},Image:{"max-width":"120px","max-height":"120px",marginLeft:"auto",marginRight:"auto"}},components:{AudioPlayer:{},Button:{"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-5":!0,"layout-pr-5":!0,"border-br-2":!0,"border-bw-0":!0,"border-bs-s":!0,"color-bgc-p30":!0,"color-c-n100":!0,"behavior-ho-70":!0},Card:{"border-br-4":!0,"color-bgc-p100":!0,"color-bc-n90":!0,"border-bw-1":!0,"border-bs-s":!0,"layout-pt-4":!0,"layout-pb-4":!0,"layout-pl-4":!0,"layout-pr-4":!0},CheckBox:{element:{"layout-m-0":!0,"layout-mr-2":!0,"layout-p-2":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0,"color-c-p30":!0},label:{"color-c-p30":!0,"typography-f-sf":!0,"typography-v-r":!0,"typography-w-400":!0,"layout-flx-1":!0,"typography-sz-ll":!0},container:{"layout-dsp-iflex":!0,"layout-al-c":!0}},Column:{},DateTimeInput:{container:{},label:{},element:{"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-3":!0,"layout-pr-3":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0}},Divider:{"color-bgc-n90":!0,"layout-mt-6":!0,"layout-mb-6":!0},Image:{all:{"border-br-50pc":!0,"layout-el-cv":!0,"layout-w-100":!0,"layout-h-100":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0,"layout-sp-c":!0,"layout-mb-3":!0},avatar:{},header:{},icon:{},largeFeature:{},mediumFeature:{},smallFeature:{}},Icon:{"border-br-1":!0,"layout-p-2":!0,"color-bgc-n98":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0,"layout-sp-c":!0},List:{"layout-g-4":!0,"layout-p-2":!0},Modal:{backdrop:{"color-bbgc-p60_20":!0},element:{"border-br-2":!0,"color-bgc-p100":!0,"layout-p-4":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bc-p80":!0}},MultipleChoice:{container:{},label:{},element:{}},Row:{"layout-g-4":!0},Slider:{container:{},label:{},element:{}},Tabs:{container:{},controls:{all:{},selected:{}},element:{}},Text:{all:{"layout-w-100":!0,"layout-g-2":!0,"color-c-p30":!0},h1:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-2":!0,"layout-p-0":!0,"typography-sz-tl":!0},h2:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-2":!0,"layout-p-0":!0,"typography-sz-tl":!0},h3:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"typography-sz-ts":!0},h4:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"typography-sz-bl":!0},h5:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"color-c-n30":!0,"typography-sz-bm":!0,"layout-mb-1":!0},body:{},caption:{}},TextField:{container:{"typography-sz-bm":!0,"layout-w-100":!0,"layout-g-2":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0},label:{"layout-flx-0":!0},element:{"typography-sz-bm":!0,"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-3":!0,"layout-pr-3":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0,"color-c-p30":!0}},Video:{"border-br-5":!0,"layout-el-cv":!0}},elements:{a:P$,audio:KkA,body:e_A,button:A_A,h1:j$,h2:V$,h3:q$,h4:{},h5:{},iframe:HkA,input:XkA,p:W$,pre:t_A,textarea:$kA,video:ZkA},markdown:{p:[...Object.keys(W$)],h1:[...Object.keys(j$)],h2:[...Object.keys(V$)],h3:[...Object.keys(q$)],h4:[],h5:[],ul:[...Object.keys(n_A)],ol:[...Object.keys(i_A)],li:[...Object.keys(o_A)],a:[...Object.keys(P$)],strong:[],em:[]}};var sD=class i{nodes=[];subAgentIdCounter=1;selectedToolSubject=new gi(void 0);selectedNodeSubject=new gi(void 0);selectedCallbackSubject=new gi(void 0);loadedAgentDataSubject=new gi(void 0);agentToolsMapSubject=new gi(new Map);agentToolsSubject=new gi(void 0);newAgentToolBoardSubject=new gi(void 0);agentCallbacksMapSubject=new gi(new Map);agentCallbacksSubject=new gi(void 0);agentToolDeletionSubject=new gi(void 0);deleteSubAgentSubject=new gi("");addSubAgentSubject=new gi({parentAgentName:""});tabChangeSubject=new gi(void 0);agentToolBoardsSubject=new gi(new Map);constructor(){}getNode(e){return this.nodes.find(t=>t.name===e)}getRootNode(){return this.nodes.find(A=>!!A.isRoot)}addNode(e){let A=this.nodes.findIndex(l=>l.name===e.name);A!==-1?this.nodes[A]=e:this.nodes.push(e);let t=/^sub_agent_(\d+)$/,n=e.name.match(t);if(n){let l=parseInt(n[1],10);l>=this.subAgentIdCounter&&(this.subAgentIdCounter=l+1)}let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e.name,e.tools||[]),this.agentToolsMapSubject.next(a);let r=this.agentCallbacksMapSubject.value,s=new Map(r);s.set(e.name,e.callbacks||[]),this.agentCallbacksMapSubject.next(s),this.setSelectedNode(this.selectedNodeSubject.value)}getNodes(){return this.nodes}clear(){this.nodes=[],this.subAgentIdCounter=1,this.setSelectedNode(void 0),this.setSelectedTool(void 0),this.agentToolsMapSubject.next(new Map),this.agentCallbacksMapSubject.next(new Map),this.setSelectedCallback(void 0),this.setAgentTools(),this.setAgentCallbacks()}getSelectedNode(){return this.selectedNodeSubject.asObservable()}setSelectedNode(e){this.selectedNodeSubject.next(e)}getSelectedTool(){return this.selectedToolSubject.asObservable()}setSelectedTool(e){this.selectedToolSubject.next(e)}getSelectedCallback(){return this.selectedCallbackSubject.asObservable()}setSelectedCallback(e){this.selectedCallbackSubject.next(e)}getNextSubAgentName(){return`sub_agent_${this.subAgentIdCounter++}`}addTool(e,A){let t=this.getNode(e);if(t){let n=t.tools||[];t.tools=[A,...n];let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e,t.tools),this.agentToolsMapSubject.next(a)}}deleteTool(e,A){let t=this.getNode(e);if(t&&t.tools){let n=t.tools.length;if(t.tools=t.tools.filter(o=>o.name!==A.name),t.tools.lengthr.name===A.name))return{success:!1,error:`Callback with name '${A.name}' already exists`};t.callbacks.push(A),this.agentCallbacksSubject.next({agentName:e,callbacks:t.callbacks});let o=this.agentCallbacksMapSubject.value,a=new Map(o);return a.set(e,t.callbacks),this.agentCallbacksMapSubject.next(a),{success:!0}}catch(t){return{success:!1,error:"Failed to add callback: "+t.message}}}updateCallback(e,A,t){try{let n=this.getNode(e);if(!n)return{success:!1,error:"Agent not found"};if(!n.callbacks)return{success:!1,error:"No callbacks found for this agent"};let o=n.callbacks.findIndex(g=>g.name===A);if(o===-1)return{success:!1,error:"Callback not found"};if(n.callbacks.some((g,C)=>C!==o&&g.name===t.name))return{success:!1,error:`Callback with name '${t.name}' already exists`};let r=P(P({},n.callbacks[o]),t);n.callbacks[o]=r,this.agentCallbacksSubject.next({agentName:e,callbacks:n.callbacks});let s=this.agentCallbacksMapSubject.value,l=new Map(s);return l.set(e,n.callbacks),this.agentCallbacksMapSubject.next(l),this.selectedCallbackSubject.value?.name===A&&this.setSelectedCallback(r),{success:!0}}catch(n){return{success:!1,error:"Failed to update callback: "+n.message}}}deleteCallback(e,A){try{let t=this.getNode(e);if(!t)return{success:!1,error:"Agent not found"};if(!t.callbacks)return{success:!1,error:"No callbacks found for this agent"};let n=t.callbacks.findIndex(r=>r.name===A.name);if(n===-1)return{success:!1,error:"Callback not found"};t.callbacks.splice(n,1),this.agentCallbacksSubject.next({agentName:e,callbacks:t.callbacks});let o=this.agentCallbacksMapSubject.value,a=new Map(o);return a.set(e,t.callbacks),this.agentCallbacksMapSubject.next(a),this.selectedCallbackSubject.value?.name===A.name&&this.setSelectedCallback(void 0),{success:!0}}catch(t){return{success:!1,error:"Failed to delete callback: "+t.message}}}setLoadedAgentData(e){this.loadedAgentDataSubject.next(e)}getLoadedAgentData(){return this.loadedAgentDataSubject.asObservable()}getAgentToolsMap(){return this.agentToolsMapSubject.asObservable()}getAgentCallbacksMap(){return this.agentCallbacksMapSubject.asObservable()}requestSideTabChange(e){this.tabChangeSubject.next(e)}getSideTabChangeRequest(){return this.tabChangeSubject.asObservable()}requestNewTab(e,A){this.newAgentToolBoardSubject.next({toolName:e,currentAgentName:A})}getNewTabRequest(){return this.newAgentToolBoardSubject.asObservable().pipe(Se(A=>A?{tabName:A.toolName,currentAgentName:A.currentAgentName}:void 0))}requestTabDeletion(e){this.agentToolDeletionSubject.next(e)}getTabDeletionRequest(){return this.agentToolDeletionSubject.asObservable()}setAgentToolBoards(e){this.agentToolBoardsSubject.next(e)}getAgentToolBoards(){return this.agentToolBoardsSubject.asObservable()}getCurrentAgentToolBoards(){return this.agentToolBoardsSubject.value}getAgentTools(){return this.agentToolsSubject.asObservable()}getDeleteSubAgentSubject(){return this.deleteSubAgentSubject.asObservable()}setDeleteSubAgentSubject(e){this.deleteSubAgentSubject.next(e)}getAddSubAgentSubject(){return this.addSubAgentSubject.asObservable()}setAddSubAgentSubject(e,A,t){this.addSubAgentSubject.next({parentAgentName:e,agentClass:A,isFromEmptyGroup:t})}setAgentTools(e,A){if(e&&A){this.agentToolsSubject.next({agentName:e,tools:A});let t=this.agentToolsMapSubject.value,n=new Map(t);n.set(e,A),this.agentToolsMapSubject.next(n)}else this.agentToolsSubject.next(void 0)}getAgentCallbacks(){return this.agentCallbacksSubject.asObservable()}setAgentCallbacks(e,A){e&&A?this.agentCallbacksSubject.next({agentName:e,callbacks:A}):this.agentCallbacksSubject.next(void 0)}getParentNode(e,A,t,n){if(e){if(e.name===A.name)return t;for(let o of e.sub_agents){let a=this.getParentNode(o,A,e,n);if(a)return a}if(e.tools){for(let o of e.tools)if(o.toolType==="Agent Tool"){let a=n.get(o.toolAgentName||o.name);if(a){let r=this.getParentNode(a,A,e,n);if(r)return r}}}}}deleteNode(e){this.nodes=this.nodes.filter(A=>A.name!==e.name),this.setSelectedNode(this.selectedNodeSubject.value)}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var lD=class i{constructor(e){this.http=e}apiServerDomain=Rr.getApiServerBaseUrl();getLatestArtifact(e,A,t,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${t}/artifacts/${n}`;return this.http.get(o)}getArtifactVersion(e,A,t,n,o){let a=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${t}/artifacts/${n}/versions/${o}`;return this.http.get(a)}static \u0275fac=function(A){return new(A||i)(Wo(Mr))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var gD=class i{audioContext=new AudioContext({sampleRate:22e3});lastAudioTime=0;scheduledAudioSources=new Set;playAudio(e){let A=this.combineAudioBuffer(e);A&&this.playPCM(A)}stopAudio(){for(let e of this.scheduledAudioSources)e.onended=null,e.stop();this.scheduledAudioSources.clear(),this.lastAudioTime=this.audioContext.currentTime}combineAudioBuffer(e){if(e.length===0)return;let A=e.reduce((o,a)=>o+a.length,0),t=new Uint8Array(A),n=0;for(let o of e)t.set(o,n),n+=o.length;return t}playPCM(e){let A=new Float32Array(e.length/2);for(let r=0;r=32768&&(s-=65536),A[r]=s/32768}let t=this.audioContext.createBuffer(1,A.length,22e3);t.copyToChannel(A,0);let n=this.audioContext.createBufferSource();n.buffer=t,n.connect(this.audioContext.destination),n.onended=()=>{this.scheduledAudioSources.delete(n)},this.scheduledAudioSources.add(n);let o=this.audioContext.currentTime,a=Math.max(this.lastAudioTime,o);n.start(a),this.lastAudioTime=a+t.duration}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var cD=class i{audioWorkletModulePath=w(Dm);stream;audioContext;source;audioBuffer=[];volumeLevel=mA(0);lastVolumeUpdate=0;startRecording(){return re(this,null,function*(){try{this.stream=yield navigator.mediaDevices.getUserMedia({audio:!0}),this.audioContext=new AudioContext,yield this.audioContext.audioWorklet.addModule(this.audioWorkletModulePath),this.source=this.audioContext.createMediaStreamSource(this.stream);let e=new AudioWorkletNode(this.audioContext,"audio-processor");e.port.onmessage=A=>{let t=A.data,n=Date.now();if(n-this.lastVolumeUpdate>100){let a=0;for(let l=0;le.stop()),this.volumeLevel.set(0)}getCombinedAudioBuffer(){if(this.audioBuffer.length===0)return;let e=this.audioBuffer.reduce((n,o)=>n+o.length,0),A=new Uint8Array(e),t=0;for(let n of this.audioBuffer)A.set(n,t),t+=n.length;return A}cleanAudioBuffer(){this.audioBuffer=[]}float32ToPCM(e){let A=new ArrayBuffer(e.length*2),t=new DataView(A);for(let n=0;n{let n=t.metricsInfo||[];this.metricsInfoCache.set(e,n),this.metricsInfo.set(n)}))}return new Fi}createNewEvalSet(e,A,t="live"){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/dev/apps/${e}/eval-sets`;return this.http.post(n,{eval_set:{eval_set_id:A,model_execution_mode:t,tool_execution_mode:t,eval_cases:[]}})}return new Fi}getEvalSet(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}`;return this.http.get(t,{})}return new Fi}listEvalCases(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}/evals`;return this.http.get(t,{})}return new Fi}addCurrentSession(e,A,t,n,o){let a=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}/add_session`;return this.http.post(a,{evalId:t,sessionId:n,userId:o})}runEval(e,A,t,n){let o=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}/run_eval`;return this.http.post(o,{evalIds:t,evalMetrics:n})}listEvalResults(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/apps/${e}/eval_results`;return this.http.get(A,{})}return new Fi}getEvalResult(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/dev/apps/${e}/eval_results/${encodeURIComponent(A)}`;return this.http.get(t,{})}return new Fi}getEvalCase(e,A,t){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}/evals/${t}`;return this.http.get(n,{})}return new Fi}updateEvalCase(e,A,t,n){let o=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}/evals/${t}`;return this.http.put(o,{evalId:t,conversation:n.conversation,sessionInput:n.sessionInput,creationTimestamp:n.creationTimestamp})}deleteEvalCase(e,A,t){let n=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}/evals/${t}`;return this.http.delete(n,{})}deleteEvalSet(e,A){let t=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}`;return this.http.delete(t,{})}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var ID=class i{constructor(e){this.http=e}apiServerDomain=Rr.getApiServerBaseUrl();getEventTrace(e,A){let t=this.apiServerDomain+`/dev/apps/${e}/debug/trace/${A.id}`;return this.http.get(t)}getTrace(e,A){let t=this.apiServerDomain+`/dev/apps/${e}/debug/trace/session/${A}`;return this.http.get(t).pipe(Se(o=>{let a=Y$.array().safeParse(o);if(a.success)return a.data;throw new Error(a.error.issues.map(r=>`${r.path.join(".")}: ${r.message}`).join(", "))}))}getEvent(e,A,t,n){let o=this.apiServerDomain+`/dev/apps/${A}/users/${e}/sessions/${t}/events/${n}/graph`;return this.http.get(o)}static \u0275fac=function(A){return new(A||i)(Wo(Mr))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var BD=class i{route=w($s);constructor(){}isImportSessionEnabled(){return oe(!0)}isEditFunctionArgsEnabled(){return this.route.queryParams.pipe(Se(e=>e[pT]==="true"))}isSessionUrlEnabled(){return oe(!0)}isA2ACardEnabled(){return this.route.queryParams.pipe(Se(e=>e[fT]==="true"))}isApplicationSelectorEnabled(){return oe(!0)}isAlwaysOnSidePanelEnabled(){return oe(!1)}isTraceEnabled(){return oe(!0)}isArtifactsTabEnabled(){return oe(!0)}isEvalEnabled(){return oe(!0)}isEvalV2Enabled(){return this.route.queryParams.pipe(Se(e=>e[wT]==="true"))}isTestsEnabled(){return this.route.queryParams.pipe(Se(e=>e[mT]==="true"))}isTokenStreamingEnabled(){return oe(!0)}isMessageFileUploadEnabled(){return oe(!0)}isManualStateUpdateEnabled(){return oe(!0)}isBidiStreamingEnabled(){return oe(!0)}isExportSessionEnabled(){return oe(!0)}isEventFilteringEnabled(){return oe(!1)}isDeleteSessionEnabled(){return oe(!0)}isLoadingAnimationsEnabled(){return oe(!0)}isSessionsTabReorderingEnabled(){return oe(!1)}isSessionFilteringEnabled(){return oe(!1)}isSessionReloadOnNewMessageEnabled(){return oe(!1)}isUserIdOnToolbarEnabled(){return oe(!0)}isDeveloperUiDisclaimerEnabled(){return oe(!0)}isFeedbackServiceEnabled(){return oe(!1)}isInfinityMessageScrollingEnabled(){return oe(!1)}isMoreOptionsButtonHidden(){return oe(!1)}isNewSessionButtonEnabled(){return oe(!0)}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var hD=class i{sendFeedback(e,A,t){return oe(void 0)}getFeedback(e,A){return oe(void 0)}deleteFeedback(e,A){return oe(void 0)}getPositiveFeedbackReasons(){return oe([])}getNegativeFeedbackReasons(){return oe([])}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var a_A=(()=>{var i=import.meta.url;return function(e={}){var A,t=e,n,o,a=new Promise((y,b)=>{n=y,o=b});t.agerrMessages=[],t.stderrMessages=[],u=y=>t.stderrMessages.push(y);var r=Object.assign({},t),s="./this.program",l=(y,b)=>{throw b},g="",C,d;typeof document<"u"&&document.currentScript&&(g=document.currentScript.src),i&&(g=i),g.startsWith("blob:")?g="":g=g.substr(0,g.replace(/[?#].*/,"").lastIndexOf("/")+1),C=y=>fetch(y,{credentials:"same-origin"}).then(b=>b.ok?b.arrayBuffer():Promise.reject(new Error(b.status+" : "+b.url)));var B=console.log.bind(console),u=console.error.bind(console);Object.assign(t,r),r=null;var E;function f(y){for(var b=atob(y),R=new Uint8Array(b.length),W=0;Wy.startsWith(it);function YA(){var y="data:application/octet-stream;base64,AGFzbQEAAAABmAd0YAJ/fwF/YAF/AGABfwF/YAN/f38Bf2ACf38AYAN/f38AYAR/f39/AX9gBH9/f38AYAV/f39/fwF/YAZ/f39/f38Bf2AFf39/f38AYAZ/f39/f38AYAh/f39/f39/fwF/YAAAYAABf2AHf39/f39/fwF/YAF8AXxgAn9/AXxgAX8BfGAHf39/f39/fwBgA39/fwF8YAd/f39/fHx/AGACf3wAYAR8fHx/AXxgAnx8AXxgA398fABgBX9+fn5+AGAEf39/fABgCn9/f39/f39/f38Bf2ADf35/AX5gBH9/fHwBf2ADfHx8AXxgCX9/f39/f39/fwBgA39/fgBgAAF8YAR/f39/AXxgAn9/AX5gBX9/f39+AX9gA39/fgF/YAp/f39/f39/f39/AGAEf35+fwBgBH9/fH8AYAJ/fgBgAnx/AXxgBH9/f3wBf2ABfwF+YAJ/fgF/YAJ/fAF/YAN8fH8BfGADf3x/AGAIf39/f39/f38AYAV/f39/fAF/YAt/f39/f39/f39/fwF/YAN/f3wAYAV/f35/fwBgBH9/fH8Bf2AAAX5gB39/f398f38Bf2AFf39/f3wAYAN/f3wBf2ADf35/AX9gAn19AX1gBH9/fX8AYAZ/fHx8fHwBfGADf39/AX5gDH9/f39/f39/f39/fwF/YAV/f3x/fwF/YAd/f398fH9/AGAGf39/fH9/AGAGf39/f35/AX9gD39/f39/f39/f39/f39/fwBgBH9/f38BfmAGf3x/f39/AX9gB39/f39/fn4Bf2AGf39/f35+AX9gB39/f39+f38Bf2AGf39/f39+AX9gAn5/AGAEf35/fwF/YAR/f3x8AXxgBX9/fH9/AGAJf39/f39/f39/AX9gBH9/fHwAYAR+fn5+AX9gAn99AX9gAn5/AX9gCH9/f398fHx/AGADf31/AGAGf39+fn5/AGABfAF/YAJ+fgF9YAJ/fQBgBH9/f34BfmAGf31/f39/AGADf3x8AX9gBX9/f3x/AGAFf398fH8AYAZ8fHx/f38AYAJ+fgF8YAJ8fwF/YAR/fHx8AGAGf39/f398AGAEf3x/fwBgBnx8f3x8fwBgB398fHx8fHwAYAV/fHx8fAF/YAF/AX1gA39/fwF9YAN+fn4Bf2AEf35+fgBgBH98f38Bf2AKf3x/f39/f39/fwBgBX9/fHx8AGAFf39/f38BfGADfHx8AX9gBHx8fHwBfAKRARgBYQFhAAcBYQFiAAUBYQFjACIBYQFkAAYBYQFlAAYBYQFmAAIBYQFnAAMBYQFoAAEBYQFpAA0BYQFqAAMBYQFrAAIBYQFsAAYBYQFtAEsBYQFuAEwBYQFvAAIBYQFwAE0BYQFxAAcBYQFyAE4BYQFzAAABYQF0AAABYQF1AAYBYQF2AAABYQF3AAABYQF4AAYDgRT/EwEAAAACAAUDAwIGGAICAAACGAQAAAIADQAEEAUBAgYEAwIGDQIFAAACBCcABAACGAcEEAJPAAACAQMCBAICAhAEBAAAAQQIAgYCBgACBA4FAhoAAwEBAAIABQMCBQUCAgICAxYBAwUEBAACAgUDBgcDAgQAAwMiAwQNAwAKAgIGAwICABoYBDcCUAICBQIOABgAFAIADQIHBCgaCgYHAwQEAQYCAQQFBAQFAgIKAgAHBAINAgIAAwIFAAQEAQE4IiMBAwMECAIDBBEEAwMEAAQEBQMCAikAAgcGBAQEAgIEBAQEBQUDAwIDAgIPBAcCFgUEBAUEAQAqAAICBQEEFgEGCAYJAQEDAwADAAQICAYDAgAFFgMCEhABACMKAhIIBAsEAgUGABkAAQEAUQIMDAcAAAIAAwIUBAcAAAIAAAMEAwYBOQIBBAMBBAIDUgIAAQA6FQACAgIEBAQCAAIHAgUaKwMCBwQZEQcEBQoKATsELAAFLQQbGwAFBAQABQgKBAECAQUCAAQECQkFAAACAihTAgMAAREALAACAAsAAAMCAQAEAlQEAi4FAAQCAgQCBAgOBAAFEQIEAgQGAgUAABwCHAIAAgQCAAMEAlUCAwEGAgIBAQgOViIAB1cEOwEFDAIGAhERBQcvAwEKAQIEBQEAAAQDAQIECwFYAgABAQkDBAECAwEIBwADBAUABAUEBwUDAAIJWTAYEAUBBQYAAgMHCAQpAgEBAQ0BBwIHAAIDBjgAAQMEAgAABAEBBQEEBQIAIAUEBAAEAhkFAgEECAcEBgYBAgEGBQYGCQ4ABwACBgECAgAAAAAKCgcBAAYAAgoEAgICAgIFBAEEAAICBAQDBwAPAA8DAAIBBQAFBAQCAQAEWlsEBgJcAAACAAYBBBMEPAY9AgIOEAQFFAEAFAcKAAQEHgIDERseBV0EPgcHEgcEEQIHAQcFGwI/PwcGBAQFAwcHARMCBQgIBAQEBQMEAAIEBAIEAgAFMQUDATIBMQEBBQEEAxsACQMBAw4BAQQFAQEBBQMABAIABQcGAQMEBwReAgYEAwwABQYGBgYBBgIECAICACEPAwYBAAIBAgYGAgAFAQAFXwIABwgEAwQACQkDBWAABwUAYQcMBgYMBQULAgUHAAUEAARAAgIAAgMCAAACAAoEAQIBA0EKAwBBCgICAwICBgUvAgAqBAJiAAgAAwcHAQIACgcDBQACEANjARAAEABkBQQBAQNCBgUABQUSEgAOAQoBAQMMAAAABQAGAQQCDwQCAAAEAgQHAAQBCAkFBAUFAwEEBQQNAQYILwoCAgQABxMjAgACAgYBAQAAAgACBAUUBAEAAQMTQwEAAQAAAQEKAAQEDgUHBAQBASQBAAYAAgUCAgQEAQEEAwUDBAABCQIIAAIBBAINLgEEBAQHBQUHBwIBZRsUBwcGBgMIAwMFAwMDBh0EBAAOEwUBBAEEBQYECmYDAAIEBAIDBQQPAAMEGGdoGWkEAwQFBQYCCwABBAUIBQUFEgIEAQECAgQBAgADBAQBAQYPBAktAgQBBAcMAAIEagQCCQkPBAkGBhwAAAIGBQABPAEIBQMABgYGCAMBBgYGCAADBgYGCAYcAzQcBwACAQQDAAUAAAAEAgUIBAEFBQUFIQErJgIFAgIEAwACAAABBAIAAgQABwUFAAQBAxJEF0NEBAAFAhIUBQIBBAAAAA0AAxYLAwMDCUUJRQYGAAUPAgYHDwwGCQgFAgEBAgEHAzIFBTJAAQIBAgIEAgQBBQIEAgUDBQIBAgIIDAwIDAwCCA4MAgABAQEEAgEBBAIDA0YnA0YnAgIKAAQ0BAICAAUENAQEAAQLCgsLCgsLAgMTEwEDEwETCQQDBxRrRwYJBkcGAAAFAgYBAggAAgICAgIAAAACBAIFBwUHAQACBQQFBAICBAIAAgUBAAICAgIABwEabAEAAAQDIQMOBwIPKwQQBDAkBxoobQABBAIFAgMNAzUEAQQ9AgICEBAOAwgBBAQEBBEOAQEBBgEFNSkABQQAAQoEBAIBAAQEBQAFExYFAwQCAQ0DbkI3BQtvICwBBAEEAxILAQVwADEFBAIHCQQBAwcFcQQEAw0BAQQEGQEDBwcwAwRyBAgFAAABAAMFCAEAAQ0FBAICBgIHAQAFAQMAAwMHBQADBQUDAAMHIwAFBT4NAwcFBjkFBwQKEQcHCgoGChYBAQEKBgcDCy4KAgMBAQEEBgcBBBEEBAQBAgECEgEFAgIBBgcCAAQFARIEBAQBAAEGAwIABQcCCQQkCAQBAgEUBAEDACoEBAEBAQAABQQCBAAABhkCAwsDBgICAQEFBwIBAAQABAIZBAIBAQEBAQEBBwcBAQQCAgoAAgALAAADCBMECwcKBgAEBAEAAAYGBAcIAAMBAAIBNQUFDQQEBhYEABQDBwoECgsHBwUCAQECBAAIAwEEAQEBBQQBAAMFAgUEBwQEACQABQAAAAMBAQMBBAEBAC0BAwIECgQEBAEEBAQHAQcEAQEBBAEAAQECAAYBAgEEBgIDBgoOCjpzAwgRAwAAAAMEAQcHBAAFAwcEBAQFBQEKAQEBAQcBAQEKBAUHBwUFCgEBAQcBAQEKAQEABQcHBQQFAQEAAQEFBwcFBQEBAQEBBwAfHx8fAQUEBQQFBQECAgICAgACAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBAUGBgYGBggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBgcDAAYAAAYGBgYGBgYICAgGBwMABgAABgYGBgYGBgAAAAAAAAAICAgIBgMABgAABgYGBgYGBQYDBgYmAwYGByEICAAAAAgEBAAABAAECAAHAQAEBAQAAAQABwEBAQEBAQEBAAAAAxcVFRcVFxUVFxUXFRcVAAMAAQAOAgEBAgICCwsLCgoKBwcHAwEBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECBAQEBAQEAgIBAQIIAggMDAEICAMGAwADAAEIAwYDAAMABgYGAwELCwlJCUkPDw8PDw8MAgkJCQkJDAkJCQkJCEozJQglCAgISjMlCCUICAkJCQkJCQkJCQkJCQUJCQkJCQkDBwgDBwgBAQIHATYAAAICAgECAwICAwc2AwEAAwMESB0DHQMCAw0EAwEOAQUFBQUAAwAAAAAAAgMCDgEBAQEBAQEBAAEBAAAABQEBAQEBBQABAwEAAAEAAwAAAB4eAAMBAQAAAAEBAQEBAQAEBQAAAAAAAAABAAMEAAAAAwACAAMCAAAAAQABAAAAAQAFBQUAAAAAAQEHBwcBBwcHBwQFBwcFBQEBAQEBAQEBBQEHAQEBBAUHBwUFAQEBAQUHBwUFAQEBAQEBBAUHBwQHAXABzgbOBgUHAQGEAoCAAgYIAX8BQbCpDwsHpQEhAXkCAAF6ALYIAUEAiBMBQgCHEwFDAIYTAUQAGAFFAE8BRgEAAUcAhRMBSACEEwFJAIMTAUoAghMBSwCBEwFMAIATAU0A/xIBTgD+EgFPAP0SAVAA/BIBUQD7EgFSAPoSAVMA+RIBVAD4EgFVAPcSAVYA9hIBVwD1EgFYAPQSAVkA8xIBWgDyEgFfAPESASQA5xICYWEAvhECYmEAvRECY2EAvBEJ+wwBAEEBC80GnRK4EagRmRGUEYsRiBGCEf0QGPgQ5A/jD+APzgjAD7cP+BPhE98TzBPLE8oTwxOvE64TqgybE5UTpAeaE/YGhgWGBbsRuhG5EbcRthG1EbQRsxGyEbERsBGDCq8RrhGtEawRqxGDCqoRqRGnEaYRpRGiEaERoBGfEZ4RpBGdEZwRmxHeCZoRmBGXEZMRkhGREZARjxGjEY4RjRGMEZYRlRGKEYkRhxGGEYURhBGDEYERgBH/EP4Q/BD7EPoQ+RD3EPYQ9RD0EPMQ8hDxEPAQ7xDuEO0Q0AnsEOsQ6hDpEOgQ5xDmEMUJ5RDkEOMQ4hDhENAQzxDOEM0QzBDLEMoQyRDIEMcQxhDFEMQQwxDCEMEQwBDgEN8Q3hDdENwQ2xDaENkQ2BDXENYQ1RDUENMQ0hDREL8QvhC9EN4JuxClELcJuhC5ELgQtxC2ELUQtBCzELIQsRCwEK8QrhCtEKwQqxCqEKkQoBC8EJgQkhCREKgQpxCiEKYQpBCjEKEQnxCeEJ0QnBCbEJoQmRCXEJYQlRCUEJMQkBBqT48QuAbNCcEGjhDLCcIGtgaNEMwJzwmMEIsQrQaVCYoQiRCIEJMJhgWHEIYQhRCEEIMQghCBEIAQ/w/+D/0P/A/7D/oP+Q/4D/cP9g/1D/QP8w/yD/EP8A/vD+4P7Q/sD+sP6g/pD5MJ6A+ICecP5g/lD+AE4g/hD98P3g/dD9wP2w/aD9kP2A/XD9YP1Q/UD9MP0g/RD9APzw/OD4gJhgU36wYbzA/LD8oPyQ/ID8cPxg/FD8QPww/CD8EPhwa/D4cGvg+HBr0PvA+7D7oPuQ+4D7oI9ga2D7UPtA+zD7IPsQ+wD68Prg+tD4UGuAiFBrgIhQasD6sPqg+pD6gPpw+mD6UP9gakD6MPog+hD4EEoA+BBJ8PgQSeD4EEnQ+BBJwPmw+aD5kPlhSVFJQUkxSSD5IUkRSzCJAUjxSOFI0UjBSLFIoUiRSIFLoIhxSGFIUUhBSDFIIUgRSAFP8T/hP9E/wT+xP6E/kT9xP2E/UT9BPzE/IT8RPwE+8T7hPtE+wT6xPqE+UT6RPoE+cT5hPkE+MTzQ/iE8EB4BPeE90T3BPbE9oT2ROcCNgTkg/XE5wI1hPVE9QToAGgAdMT0hPRE9ATzxPOE80TxgTJE8gTxxPGE8UTxBPCE8ET0A3AE78TvhO9E7wTuxO6E5wItxOtCrMTtBOhDbETthO1E+wHshOwE5INrROsE8UJbLAK+wKrE6oT7wyoE6kTzQWnE80MpBOmE6UToAGgAe8MoxOhE6ATrAyeE5wTlBOTE5ITjxPCB6ITnROfE5kTmBOXE5YTkROQE44TjROME4sTihOJEw7uEu0S7xLwEqoDoAHsEusS6hLpEugSlgfmEpUH5RLkEuMSoAGgAeIS4RLgEsIL3xLCC5IHvAveEt0SjgfWEtcS1RLaEtkS2BKNB64L1BLTEosH0hLrA+sD6wPrA9kK6BHmEeQR4hHgEd4R3BHaEdgR1hHUEdIR0BHOEd0KjxLmB9cKgxKCEoESgBL/EdgK/hH9EfwR4Qr6EfkR+BH3EfYRoAH1EfQRzArzEfER8BHvEe0R6xHLCvIR3BLbEu4R7BHqEfsCbGyOEo0SjBKLEooSiRKIEocS2AqGEoUShBJs1grWCp0E4ATgBPsR4ARs0grRCp0EoAGgAdAKjgVs0grRCp0EoAGgAdAKjgVszwrOCp0EoAGgAc0KjgVszwrOCp0EoAGgAc0KjgX7AmzREtASzxL7AmzOEs0SzBJsyxLKEskSyBKSC5ILxxLGEsQSwxLCEmzBEsASvxK+EooLigu9ErwSuxK6ErkSbLgStxK2ErUStBKzErISsRJssBKvEq4SrRKsEqsSqhKpEvsCbIELqBKnEqYSpRKkEqMS6RHlEeER1RHREd0R2RH7AmyBC6ISoRKgEp8SnhKcEucR4xHfEdMRzxHbEdcR9wbKCpsS9wbKCpoSbJUFlQX0AfQB9AH3CqAB8QLxAmyVBZUF9AH0AfQB9wqgAfEC8QJslAWUBfQB9AH0AfYKoAHxAvECbJQFlAX0AfQB9AH2CqAB8QLxAmyZEpgSbJcSlhJslRKUEmyTEpISbOIKkRKVB2ziCpASlQf7As0RkQH7AmzrA+sDzBHDEcYRyxFsxBHHEcoRbMURyBHJEWzBEWzAEWzCEa4KvQq/Eb0KrgoK3Mk1/xOADAEHfwJAIABFDQAgAEEIayIDIABBBGsoAgAiAkF4cSIAaiEFAkAgAkEBcQ0AIAJBAnFFDQEgAyADKAIAIgRrIgNB4JULKAIASQ0BIAAgBGohAAJAAkACQEHklQsoAgAgA0cEQCADKAIMIQEgBEH/AU0EQCABIAMoAggiAkcNAkHQlQtB0JULKAIAQX4gBEEDdndxNgIADAULIAMoAhghBiABIANHBEAgAygCCCICIAE2AgwgASACNgIIDAQLIAMoAhQiAgR/IANBFGoFIAMoAhAiAkUNAyADQRBqCyEEA0AgBCEHIAIiAUEUaiEEIAEoAhQiAg0AIAFBEGohBCABKAIQIgINAAsgB0EANgIADAMLIAUoAgQiAkEDcUEDRw0DQdiVCyAANgIAIAUgAkF+cTYCBCADIABBAXI2AgQgBSAANgIADwsgAiABNgIMIAEgAjYCCAwCC0EAIQELIAZFDQACQCADKAIcIgRBAnRBgJgLaiICKAIAIANGBEAgAiABNgIAIAENAUHUlQtB1JULKAIAQX4gBHdxNgIADAILAkAgAyAGKAIQRgRAIAYgATYCEAwBCyAGIAE2AhQLIAFFDQELIAEgBjYCGCADKAIQIgIEQCABIAI2AhAgAiABNgIYCyADKAIUIgJFDQAgASACNgIUIAIgATYCGAsgAyAFTw0AIAUoAgQiBEEBcUUNAAJAAkACQAJAIARBAnFFBEBB6JULKAIAIAVGBEBB6JULIAM2AgBB3JULQdyVCygCACAAaiIANgIAIAMgAEEBcjYCBCADQeSVCygCAEcNBkHYlQtBADYCAEHklQtBADYCAA8LQeSVCygCACAFRgRAQeSVCyADNgIAQdiVC0HYlQsoAgAgAGoiADYCACADIABBAXI2AgQgACADaiAANgIADwsgBEF4cSAAaiEAIAUoAgwhASAEQf8BTQRAIAUoAggiAiABRgRAQdCVC0HQlQsoAgBBfiAEQQN2d3E2AgAMBQsgAiABNgIMIAEgAjYCCAwECyAFKAIYIQYgASAFRwRAIAUoAggiAiABNgIMIAEgAjYCCAwDCyAFKAIUIgIEfyAFQRRqBSAFKAIQIgJFDQIgBUEQagshBANAIAQhByACIgFBFGohBCABKAIUIgINACABQRBqIQQgASgCECICDQALIAdBADYCAAwCCyAFIARBfnE2AgQgAyAAQQFyNgIEIAAgA2ogADYCAAwDC0EAIQELIAZFDQACQCAFKAIcIgRBAnRBgJgLaiICKAIAIAVGBEAgAiABNgIAIAENAUHUlQtB1JULKAIAQX4gBHdxNgIADAILAkAgBSAGKAIQRgRAIAYgATYCEAwBCyAGIAE2AhQLIAFFDQELIAEgBjYCGCAFKAIQIgIEQCABIAI2AhAgAiABNgIYCyAFKAIUIgJFDQAgASACNgIUIAIgATYCGAsgAyAAQQFyNgIEIAAgA2ogADYCACADQeSVCygCAEcNAEHYlQsgADYCAA8LIABB/wFNBEAgAEF4cUH4lQtqIQICf0HQlQsoAgAiBEEBIABBA3Z0IgBxRQRAQdCVCyAAIARyNgIAIAIMAQsgAigCCAshACACIAM2AgggACADNgIMIAMgAjYCDCADIAA2AggPC0EfIQEgAEH///8HTQRAIABBJiAAQQh2ZyICa3ZBAXEgAkEBdGtBPmohAQsgAyABNgIcIANCADcCECABQQJ0QYCYC2ohBAJ/AkACf0HUlQsoAgAiB0EBIAF0IgJxRQRAQdSVCyACIAdyNgIAIAQgAzYCAEEYIQFBCAwBCyAAQRkgAUEBdmtBACABQR9HG3QhASAEKAIAIQQDQCAEIgIoAgRBeHEgAEYNAiABQR12IQQgAUEBdCEBIAIgBEEEcWoiBygCECIEDQALIAcgAzYCEEEYIQEgAiEEQQgLIQAgAyICDAELIAIoAggiBCADNgIMIAIgAzYCCEEYIQBBCCEBQQALIQcgASADaiAENgIAIAMgAjYCDCAAIANqIAc2AgBB8JULQfCVCygCAEEBayIAQX8gABs2AgALCy0AIAAoAgggAU0EQEHpswNBibgBQdIBQbPEARAAAAsgACgCBCABaiAAKAIMcAt+AQJ/IwBBIGsiAiQAAkAgAEEAIACtIAGtfkIgiKcbRQRAQQAgACAAIAEQTiIDGw0BIAJBIGokACADDwsgAiABNgIEIAIgADYCAEGI9ggoAgBBpuoDIAIQIBoQLwALIAIgACABbDYCEEGI9ggoAgBB9ekDIAJBEGoQIBoQLwALFwBBAUF/IAAgASABEEAiABChAiAARhsLJQEBfyAAKAIsIgBBAEGAASAAKAIAEQMAIgAEfyAAKAIQBUEACws0AQF/AkAgACABEOYBIgFFDQAgACgCLCIAIAFBCCAAKAIAEQMAIgBFDQAgACgCECECCyACC28BAX8jAEEgayIDJAAgA0IANwMYIANCADcDECADIAI2AgwCQCADQRBqIAEgAhCzCiIBQQBIBEAgA0H8gAsoAgAQswU2AgBBioAEIAMQNwwBCyAAIANBEGoiABCNBSABEKECGiAAEFwLIANBIGokAAszAQF/IAIEQCAAIQMDQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQQFrIgINAAsLIAALJAEBfyMAQRBrIgMkACADIAI2AgwgACABIAIQzQsgA0EQaiQAC6QBAQN/IwBBEGsiAiQAAkAgABAtIgMgACgCAEEDcSAAKQMIEOgJIgEEfyABKAIYBUEACyIBDQAgAygCTCIBKAIAKAIMIgMEQCABKAIIIAAoAgBBA3EgACkDCCADESYAIgENAQtBACEBIAAoAgBBA3FBAkYNACACIAApAwg3AwggAkElNgIAQfDdCiEBQfDdCkEgQeAXIAIQtAEaCyACQRBqJAAgAQsPACAAIAEgAiADQQAQ8QsLQwAgACAAIAGlIAG9Qv///////////wCDQoCAgICAgID4/wBWGyABIAC9Qv///////////wCDQoCAgICAgID4/wBYGwsUACAAECgEQCAALQAPDwsgACgCBAsVACAAEKMBBEAgACgCBA8LIAAQpQMLowEBAn8CQAJAIAAEQCAAKAIIIgMgACgCDCICRgRAIAAgA0EBdEEBIAMbIAEQ/AEgACgCDCECCyACRQ0BIAAoAggiAyACTw0CIAAgACgCBCADaiACcCICIAEQ3wEaIAAgACgCCEEBajYCCCACDwtB0dMBQYm4AUE7QdbDARAAAAtBr5UDQYm4AUHDAEHWwwEQAAALQZoMQYm4AUHEAEHWwwEQAAALJgAgACABEK4HIgFFBEBBAA8LIAAQ7AEoAgwgASgCEEECdGooAgALLgAgAC0ADyIAQQFqQf8BcUERTwRAQbS7A0Gg/ABB3ABB6ZcBEAAACyAAQf8BRwtDACAAIAAgAaQgAb1C////////////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AkHYmQshASAAQdiZC0EYEM4BRQ0CQRgQTyIBRQ0BCyABIAIpAgg3AgAgASACKQIYNwIQIAEgAikCEDcCCAwBC0EAIQELIAJBIGokAEHkmwtBAToAAEHgmwsgATYCACABC60BAgF/An4CQAJAIAAEQCABBEAgAEEAEL8CIgMoAvQDDQIgAykDsAQiBCABQQhrIgEoAgBBCGqtIgVUDQMgAyAEIAV9IgQ3A7AEIAMoAsAEQQJPBEAgA0EtIAUgBCADKQO4BCACEJEECyABIAAoAhQRAQALDwtBsdQBQZ+9AUGKB0GonwEQAAALQbDSAUGfvQFBkQdBqJ8BEAAAC0HjqAFBn70BQZoHQaifARAAAAsJACAAQQAQ2AYLvwoCBX8PfiMAQeAAayIFJAAgBEL///////8/gyEMIAIgBIVCgICAgICAgICAf4MhCiACQv///////z+DIg1CIIghDiAEQjCIp0H//wFxIQcCQAJAIAJCMIinQf//AXEiCUH//wFrQYKAfk8EQCAHQf//AWtBgYB+Sw0BCyABUCACQv///////////wCDIgtCgICAgICAwP//AFQgC0KAgICAgIDA//8AURtFBEAgAkKAgICAgIAghCEKDAILIANQIARC////////////AIMiAkKAgICAgIDA//8AVCACQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQogAyEBDAILIAEgC0KAgICAgIDA//8AhYRQBEAgAiADhFAEQEKAgICAgIDg//8AIQpCACEBDAMLIApCgICAgICAwP//AIQhCkIAIQEMAgsgAyACQoCAgICAgMD//wCFhFAEQCABIAuEQgAhAVAEQEKAgICAgIDg//8AIQoMAwsgCkKAgICAgIDA//8AhCEKDAILIAEgC4RQBEBCACEBDAILIAIgA4RQBEBCACEBDAILIAtC////////P1gEQCAFQdAAaiABIA0gASANIA1QIgYbeSAGQQZ0rXynIgZBD2sQsQFBECAGayEGIAUpA1giDUIgiCEOIAUpA1AhAQsgAkL///////8/Vg0AIAVBQGsgAyAMIAMgDCAMUCIIG3kgCEEGdK18pyIIQQ9rELEBIAYgCGtBEGohBiAFKQNIIQwgBSkDQCEDCyADQg+GIgtCgID+/w+DIgIgAUIgiCIEfiIQIAtCIIgiEyABQv////8P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AQRAIAEoAgQiAkUNAQNAIAEgAigCADYCBCACIAE2AgAgAiIBKAIEIgINAAsgBCABNgIADAELCyAAKAIIIQULIAAgAzYCDCAAIAVBgCByNgIIIAMLoQEBAn8CQCAAECVFIAIgAWtBBUhyDQAgASACEJYFIAJBBGshBCAAEEYiAiAAECVqIQUCQANAAkAgAiwAACEAIAEgBE8NACAAQQBMIABB/wBOckUEQCABKAIAIAIsAABHDQMLIAFBBGohASACIAUgAmtBAUpqIQIMAQsLIABBAEwgAEH/AE5yDQEgAiwAACAEKAIAQQFrSw0BCyADQQQ2AgALC4QBAQJ/IwBBEGsiAiQAIAAQowEEQCAAKAIAIAAQ9gIaEKEFCyABECUaIAEQowEhAyAAIAEoAgg2AgggACABKQIANwIAIAFBABDTASACQQA6AA8gASACQQ9qENIBAkAgACABRiIBIANyRQ0ACyAAEKMBIAFyRQRAIAAQpQMaCyACQRBqJAALUAEBfgJAIANBwABxBEAgASADQUBqrYYhAkIAIQEMAQsgA0UNACACIAOtIgSGIAFBwAAgA2utiIQhAiABIASGIQELIAAgATcDACAAIAI3AwgLzgkCBH8EfiMAQfAAayIGJAAgBEL///////////8AgyEJAkACQCABUCIFIAJC////////////AIMiCkKAgICAgIDA//8AfUKAgICAgIDAgIB/VCAKUBtFBEAgA0IAUiAJQoCAgICAgMD//wB9IgtCgICAgICAwICAf1YgC0KAgICAgIDAgIB/URsNAQsgBSAKQoCAgICAgMD//wBUIApCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhBCABIQMMAgsgA1AgCUKAgICAgIDA//8AVCAJQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQQMAgsgASAKQoCAgICAgMD//wCFhFAEQEKAgICAgIDg//8AIAIgASADhSACIASFQoCAgICAgICAgH+FhFAiBRshBEIAIAEgBRshAwwCCyADIAlCgICAgICAwP//AIWEUA0BIAEgCoRQBEAgAyAJhEIAUg0CIAEgA4MhAyACIASDIQQMAgsgAyAJhFBFDQAgASEDIAIhBAwBCyADIAEgASADVCAJIApWIAkgClEbIggbIQogBCACIAgbIgxC////////P4Mh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9ANFBEAgAykDsAQiIkKAgICAEH1CkHtaDQEgAyAiQvAEfCIiNwOwBCADKALABEECTwRAIANBK0LwBCAiIAMpA7gEIiMgIlQEfiADICI3A7gEICIFICMLQZ8LEJEECyACQRA2ApwDIAJBADYCKCACQQA2AhAgAiABQYACQakLEJgBIgM2AqgDIANFBEAgASABQasLEGdBAAwFCyACIAFBgAhBtgsQmAEiAzYCQCADRQRAIAEgAigCqANBuAsQZyABIAFBvAsQZwwECyACIANBgAhqNgJEQQAiBkUEQCABQbwBQcw6EJgBIgZFDQMgBkIANwJQIAZCADcCaCAGIAE2AmQgBiABNgJ8IAZCADcCCCAGQQA6AAQgBkIANwIcIAZBADoAGCAGIAE2AhAgBkEANgIAIAZCADcCMCAGQQA6ACwgBiABNgIkIAZBADYCFCAGQQA2AmAgBkIANwJYIAZCADcCcCAGQQA2AnggBkIANwJEIAZBADoAQCAGIAE2AjggBkEANgIoIAZBADYCPCAGIAE2AkwgBkIANwKMASAGQQA6AIgBIAZCATcCgAEgBiABNgKUASAGQgA3ApgBIAZBADoAoAEgBkIANwKkASAGQgA3AqwBIAZCADcCtAELIAJBADYCmAMgAiAGNgKEAyACQQA2ApADIAJBADYC0AIgAkEANgLIAiACQQA2AsACIAJCADcD8AMgAkEhOgD4AyACQQA2AogCIAJBADYCkAEgAkEAOwH8ASACQgA3AsADIAJBADYC+AEgAkIANwKsAyACIAE2AtQDIAJCADcCyAMgAkEANgLQAyACQQA6ALQDIAJBADYC6AMgAkIANwLgAyACQgA3AtgDIAIgATYC7AMgAUHPATYCoAIgAUGbATYCiAIgAUEANgKcAiABQoCAgIAQNwKUAiAFBEBBACEGA0AgBSAGaiAGQQFqIQYtAAANAAsgASAGQYjCABCYASIDBEAgAyAFIAYQHxoLIAEgAzYC8AELIAFBADYCgAMgAUGgAWogAUGcAWpBABDBBhogAUIANwMAIAFBQGtBAEHAABA4GiABQgA3AowBIAFBADYChAEgAUIANwKUASABQgA3A7ADIAFBADYCNCABQQE6ADAgAUEANgIsIAFCADcCJCABQQA2AsQCIAFBADYCvAIgAUIANwKkAiABQgA3AqwCIAFBADYCtAIg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akECED0MGgUgESADQQR0IhJqIhQgASASaiISKQMANwMAIBQgEikDCDcDCCADQQFqIQMMAQsACwALIAJBAmoiA0EQEBoiAiABKQMINwMIIAIgASkDADcDACACIBApAyA3AxAgAiAQKQMoNwMYIAIgECsDICAQKwMwIgYgECsDQKFEAAAAAAAACECjIgegOQMgIBArAyghCCAQKwNIIQkgECsDOCEFIAIgBiAHoDkDMCACIAUgBSAJoUQAAAAAAAAIQKMiBaA5AzggAiAIIAWgOQMoQQQgAyADQQRNGyERIAFBIGshE0EEIQEDQCABIBFGBEAgACACIAMgBBBIIAIQGCAPIBApAzg3AyggDyAQKQMwNwMgIA8gECkDKDcDOCAPIBApAyA3AzAgACAPQSBqQQIQPQwZBSACIAFBBHQiEmoiFCASIBNqIhIpAwA3AwAgFCASKQMINwMIIAFBAWohAQwBCwALAAsgAkEDaiIDQRAQGiICIAFBCGopAwA3AwggAiABKQMANwMAIAIgASsDACIFIAUgECsDEKEiBkQAAAAAAADQv6KgOQMQIAErAwghCCAQKwNIIQkgAiAQKwM4Igc5AzggAiAFIAZEAAAAAAAAAsCioDkDMCACIAUgBiAGoKE5AyAgAiAIIAcgCaFEAAAAAAAACECjoCIFOQMoIAIgBTkDGCAQKwMwIQUgAiAHOQNIIAIgBTkDQEEEIAMgA0EETRshESABQTBrIRNBBCEBA0AgASARRgRAIAAgAiADIAQQSCACEBgMGAUgAiABQQR0IhJqIhQgEiATaiISKQMANwMAIBQgEikDCDcDCCABQQFqIQEMAQsACwALIAJBBEcNG0EGQRAQGiICIAEpAwg3AwggAiABKQMANwMAIAIgECkDKDcDGCACIBApAyA3AxAgAiAQKQNINwMoIAIgECkDQDcDICACIAEpAyg3AzggAiABKQMgNwMwIAIgECkDgAE3A0AgAiAQKQOIATcDSCACIBApA6ABNwNQIAIgECkDqAE3A1ggACACQQYgBBBIIAIQGCAPIBArAxAgECsDsAEgECsDAKGgOQMgIA8gECsDGCAQKwO4ASAQKwMIoaA5AyggDyAQKQNINwM4IA8gECkDQDcDMCAAIA9BIGoiAUECED0gDyAQKQOIATcDOCAPIBApA4ABNwMwIAAgAUECED0gDyAQ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AgsgACABNwMAIAAgAjcDCAvbAQIBfwJ+QQEhBAJAIABCAFIgAUL///////////8AgyIFQoCAgICAgMD//wBWIAVCgICAgICAwP//AFEbDQAgAkIAUiADQv///////////wCDIgZCgICAgICAwP//AFYgBkKAgICAgIDA//8AURsNACAAIAKEIAUgBoSEUARAQQAPCyABIAODQgBZBEAgACACVCABIANTIAEgA1EbBEBBfw8LIAAgAoUgASADhYRCAFIPCyAAIAJWIAEgA1UgASADURsEQEF/DwsgACAChSABIAOFhEIAUiEECyAECxYAIABFBEBBAA8LQfyACyAANgIAQX8LCwAgACABIAIRAAALZAECfyMAQRBrIgMkAAJAIABBABCxAiIARQ0AAkACQAJAAkAgAQ4EAAECAgMLIAAoAhAhAgwDCyAAKAIIIQIMAgsgACgCDCECDAELIAMgATYCAEHExQQgAxA3CyADQRBqJAAgAgukAQIDfwJ8IwBBEGsiAiQAIAAQwQIgACgCECIBKwMYRAAAAAAAAFJAoyEEIAErAxBEAAAAAAAAUkCjIQUgABAcIQEDQCABBEAgASgCECgClAEiAyADKwMAIAWhOQMAIAMgAysDCCAEoTkDCCAAIAEQHSEBDAELCyACIAAoAhAiASkDGDcDCCACIAEpAxA3AwAgACACEMAMIABBARDKBSACQRBqJAALDwAgAUEBaiAAIAAQqgGfC6gBAgR/AnwgASgCACECIABBBGoiAyEAIAMhAQNAIAAoAgAiAARAIAAoAhAiBCsDCCIGIAIrAwgiB2MEQCAAQQRqIQAMAgUgACABIAAgAiAESyIEGyAGIAdkIgUbIQEgACAAIARBAnRqIAUbIQAMAgsACwsCQAJAIAEgA0YNACACKwMIIgYgASgCECIAKwMIIgdjDQAgACACTSAGIAdkcg0BCyADIQELIAELZAEBfyMAQRBrIgQkACAAQQA7ARwgAEEANgIYIAAgAzkDCCAAIAI2AgQgACABNgIAIAQgADYCDCABQTRqIARBDGoQwAEgACgCBCAEIAA2AghBKGogBEEIahDAASAEQRBqJAAgAAs8ACAAIAEQ0gIEQCAAEMMEDwsgABD9ByIBRQRAQQAPCyAAIAEQ/AchACABEG0gACAALQAkQQNyOgAkIAALrAEBAX8CQCAAECgE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IAUgBCsDCDkDECAFQShqIAMgFiAUIAsRHgBFBEAgBUIANwNYIAUgAzYCACAFIAc2AhggB0EBaiEHIAAgAxAdIQMMAQsLQZj/CigCABAYQZj/CkEANgIAENcMDAILQQAhByACQbADakEAQdAAEDgaIAUEQEGY/wooAgAhBET////////vfyEURP///////+//IRhE////////7/8hG0T////////vfyEZA0AgBSAHRgRARJqZmZmZmak/IRYCQCAAQdLkABAnIgBFDQAgAC0AAEUNACAAEK4CIRYLQbD/CiAbIBsgGaEgFqIiE6AiFzkDAEG4/wogGSAToSIVOQMAQaj/CiAUIBggFKEgFqIiE6EiFDkDAEGg/wogGCAToCITOQMAIAIgFTkD2AMgAiAXOQPoAyACIBU5A7gDIAIgEzkD0AMgAiAXOQPIAyACIBQ5A/ADIAIgEzkDwAMgAiAUOQPgAyABKAIAIQBBABDQByELAkACQCAAQQJGBEAgC0UNAiACQbADahDWDEEAIQMDQEGY/wooAgAhAUHk/gooAgAhAEEAIQQDQCAAIARHBEAgASAEQeAAbGoiCyALKwMIRM3MzMzMzPA/ojkDCCALIAsrAxBEzczMzMzM8D+iOQMQIARBAWohBAwBCwsgA0EBaiIDENAHDQALQezaCi0AAEUNASACIAM2AhBBiPYIKAIAQezdAyACQRBqECAaDAELIAtFDQEgAkGwA2oQ1gxBACEHQQAhBANAIAJBsANqIgEhACAHBEAgABDUDAtB+P4KQv////////93NwMAQfD+CkL/////////9/8ANwMAAkBB5P4KKAIAIgUEQCAAKAIAIQZE////////738hFET////////v/yEWQQAhAANAIAAgBUYNAkHw/gogFCAGIABBAnRqKAIAIgMrAwAQKSIUOQMAQfj+CiAWIAMrAwAQIyIWOQMAIABBAWohAAwACwALQeGVA0H8twFBzwFBzJIBEAAAC0GA/wogBigCACsDCDkDACAGIAVBAnRqQQRrKAIAKwMIIRNBkP8KIBYgFKE5AwBBiP8KIBM5AwBEAAAAAAAAAAAhFUQAAAAAAAAAACEUIwBBMGsiDiQAQQFBEBAaIg9B6P4KKAIAQQJ0IgA2AgQgDyAAQSgQGjYCAEHA/wogARDNBTYCACAOQgA3AyggDkIANwMg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AmRBByAHLwGMAkECdkEBcSAHKALoASAHKAL4ASAHKAKIAiAHKALcAUEAENoEIAAgCSgCECgCaEEGIAcvAYwCQQF2QQFxIAcoAuQBIAcoAvQBIAcoAoQCIAcoAtwBQQAQ2gQCQCAAKAI8IgFFDQAgASgCRCIBRQ0AIAAgAREBAAsgABCMBCAaEOwCIBoQGBAYCyACQeAVaiQADwtBsIMEQcIAQQFBiPYIKAIAEDoaEDsAC84GAQJ/IwBBgAJrIgMkACADQdABaiIEQYi/CEEwEB8aIAFCADcCAAJAAkACQAJAIAAgBBDeBA0AIAMoAtgBQQJJDQAgAyADKQPYATcDyAEgAyADKQPQATcDwAEgAygC0AEgA0HAAWpBABAZQRhsaigCAA0BC0EAIQBBACEBA0AgASADKALYAU8NAiADIAMpA9gBNwMgIAMgAykD0AE3AxggA0EYaiABEBkhAgJAAkAgAygC4AEiBA4CAQUACyADIAMoAtABIAJBGGxqIgIpAwg3AwggAyACKQMQNwMQIAMgAikDADcDACADIAQRAQALIAFBAWohAQwACwALIAMoAtgBQQNPBEBB95gEQQAQKgsgAyADKQPYATcDuAEgAyADKQPQATcDsAEgASADKALQASADQbABakEAEBlBGGxqKAIAEGQ2AgAgAyADKQPYATcDqAEgAyADKQPQATcDoAEgAygC0AEgA0GgAWpBARAZQRhsaigCAARAIAMgAykD2AE3A5gBIAMgAykD0AE3A5ABIAEgAygC0AEgA0GQAWpBARAZQRhsaigCABBkNgIECyADIAMpA9gBNwOIASADIAMpA9ABNwOAASADKALQASEBIANBgAFqQQAQGSEEIAMoAtABIQAgAgJ8IAEgBEEYbGotABBBAUYEQCADIAMpA9gBNwNYIAMgAykD0AE3A1AgACADQdAAakEAEBlBGGxqKwMIDAELIAMgAykD2AE3A3ggAyADKQPQATcDcEQAAAAAAAAAACAAIANB8ABqQQEQGUEYbGotABBBAUcNABogAyADKQPYATcDaCADIAMpA9ABNwNgRAAAAAAAAPA/IAMoAtABIANB4ABqQQEQGUEYbGorAwihCzkDAEEAIQFBASEAA0AgASADKALYAU8NASADIAMpA9gBNwNIIAMgAykD0AE3A0AgA0FAayABEBkhAgJAAkAgAygC4AEiBA4CAQQACyADIAMoAtABIAJBGGxqIgIpAwg3AzAgAyACKQMQNwM4IAMgAikDADcDKCADQShqIAQRAQALIAFBAWohAQwACwALIANB0AFqIgFBGBAxIAEQNCADQYACaiQAIAAPC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALrwEBAX8gACgCECIBRQRAQaT1AEGEuQFBiAFB0pEBEAAACyABKALcARAYIAEoAtgBEBggASgC4AEQGCABKALkARAYIAEoAugBEBggASgC7AEQGCABKALwARAYIAEoAvQBEBggASgC+AEQGCABKAL8ARAYIAEoAoACEBggASgChAIQGCABKAKIAhAYIAEoApgCEBggASgCpAIQGCABKAKgAhAYIAAgASgCADYCECABEBgLngEBAn9BuAIQxgMiASAAKAIQIgI2AgAgACABNgIQIAIEQCABQRBqIAJBEGpBKBAfGiABQThqIAJBOGpBKBAfGiABIAIoApgBNgKYASABIAIoApwBNgKcASABIAIrA6ABOQOgASABIAIoAogBNgKIASABQeAAaiACQeAAakEoEB8aIAEPCyABQoCAgICAgID4PzcDoAEgAUIDNwOYASABC6AGAQV/IwBBMGsiAyQAA0BBgOAKKAIAIAJNBEACQEH43wpBEBAxQZDgCiAAKAIAIgQpAwA3AwBBmOAKIAQpAwg3AwBB+N8KQRAQJiECQfjfCigCACACQQR0aiICQZDgCikDADcDACACQZjgCikDADcDCEGQ4AogBCkDADcDAEGY4AogBCkDCDcDAEH43wpBEBAmIQJB+N8KKAIAIAJBBHRqIgJBkOAKKQMANwMAIAJBmOAKKQMANwMIQQIgACgCBCIAIABBAk0bQQFrIQZBASECA0AgAiAGRg0BQZDgCiAEIAJBBHRqIgApAwA3AwBBmOAKIAApAwg3AwBB+N8KQRAQJiEFQfjfCigCACAFQQR0aiIFQZDgCikDADcDACAFQZjgCikDADcDCEGQ4AogACkDADcDAEGY4AogACkDCDcDAEH43wpBEBAmIQVB+N8KKAIAIAVBBHRqIgVBkOAKKQMANwMAIAVBmOAKKQMANwMIQZDgCiAAKQMANwMAQZjgCiAAKQMINwMAQfjfCkEQECYhAEH43wooAgAgAEEEdGoiAEGQ4AopAwA3AwAgAEGY4AopAwA3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qgIgA0EAOgAHIAIgBGogA0EHahDSASADQRBqJAAMAQsQygEACyAFQRBqJAALFwAgACADNgIQIAAgAjYCDCAAIAE2AggLDQAgACABIAJBARCiBwsSACAAIAEgAkL/////DxCwBacLzAEBA38jAEEgayIDQgA3AxggA0IANwMQIANCADcDCCADQgA3AwAgAS0AACICRQRAQQAPCyABLQABRQRAIAAhAQNAIAEiA0EBaiEBIAMtAAAgAkYNAAsgAyAAaw8LA0AgAyACQQN2QRxxaiIEIAQoAgBBASACdHI2AgAgAS0AASECIAFBAWohASACDQALAkAgACIBLQAAIgJFDQADQCADIAJBA3ZBHHFqKAIAIAJ2QQFxRQ0BIAEtAAEhAiABQQFqIQEgAg0ACwsgASAAawuAAQEEfyAAIABBPRC0BSIBRgRAQQAPCwJAIAAgASAAayIEai0AAA0AQYiBCygCACIBRQ0AIAEoAgAiAkUNAANAAkAgACACIAQQ6gFFBEAgASgCACAEaiICLQAAQT1GDQELIAEoAgQhAiABQQRqIQEgAg0BDAILCyACQQFqIQMLIAMLTgEBf0EBQRwQGiIGIAU6ABQgBiAAIAEQrAE2AggCfyADBEAgACACENUCDAELIAAgAhCsAQshBSAGIAA2AhggBiAENgIQIAYgBTYCDCAGCwkAIAC9QjSIpwuZAQEDfCAAIACiIgMgAyADoqIgA0R81c9aOtnlPaJE65wriublWr6goiADIANEff6xV+Mdxz6iRNVhwRmgASq/oKJEpvgQERERgT+goCEFIAAgA6IhBCACRQRAIAQgAyAFokRJVVVVVVXFv6CiIACgDwsgACADIAFEAAAAAAAA4D+iIAQgBaKhoiABoSAERElVVVVVVcU/oqChC5IBAQN8RAAAAAAAAPA/IAAgAKIiAkQAAAAAAADgP6IiA6EiBEQAAAAAAADwPyAEoSADoSACIAIgAiACRJAVyxmgAfo+okR3UcEWbMFWv6CiRExVVVVVVaU/oKIgAiACoiIDIAOiIAIgAkTUOIi+6fqovaJExLG0vZ7uIT6gokStUpyAT36SvqCioKIgACABoqGgoAuNAQAgACAAIAAgACAAIABECff9DeE9Aj+iRIiyAXXg70k/oKJEO49otSiCpL+gokRVRIgOVcHJP6CiRH1v6wMS1tS/oKJE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EC4BmgFsrHwhEAwBCwsgAkEBaiECDAALAAtBACEAA0AgDCAAQQJ0aigCACICBEAgCCACQVBBACACKAIAQQNxQQJHG2ooAigoAhAoAvgBIgVBAnRqIgogCigCACACKAIQLgGaAWo2AgAgBSABIAEgBUgbIQEgAEEBaiEADAELCyADQQFqIQMMAQsACwALIAZBEGokACARDwsgECARfCERDAALAAuDAQECfyAAIAFBARCNASIBKAIQQQA2AsQBQQUQnwghAiABKAIQIgNBADYCzAEgAyACNgLAAUEFEJ8IIQIgASgCECIDIAI2AsgBQdz9CigCACICIAAgAhsoAhBBuAFBwAEgAhtqIAE2AgAgAyACNgK8AUHc/QogATYCACADQQA2ArgBIAELuQEBA38gACAAQTBqIgIgACgCAEEDcUEDRhsoAigoAhAiASgC4AEgASgC5AEiAUEBaiABQQJqENoBIQEgACACIAAoAgBBA3FBA0YbKAIoKAIQIAE2AuABIAAgAiAAKAIAQQNxQQNGGygCKCgCECIBIAEoAuQBIgNBAWo2AuQBIAEoAuABIANBAnRqIAA2AgAgACACIAAoAgBBA3FBA0YbKAIoKAIQIgAoAuABIAAoAuQBQQJ0akEANgIACyAAIAAgASACIABBp4cBECciAAR/IAAQkQIFQR4LEP8OC00AIAEoAhBBwAFqIQEDQCABKAIAIgEEQCABKAIQKAKYAhAYIAEoAhAoAqACEBggASgCECIBQQA2ArABIAFBuAFqIQEMAQUgABD4DgsLCz8BAn8gACgCECgCqAIhAANAIAAiASgCDCIARSAAIAFGckUEQCAAKAIMIgJFDQEgASACNgIMIAIhAAwBCwsgAQsLACAAIAFBARCFDwsLACAAIAFBABCFDwuGAQECfwJAIAAgASkDCBC/A0UNACAAEDkgAEYEQCAAIAEQbiECA0AgAgRAIAAgAiABEHIgACACEI0GIQIMAQsLIAAtABhBIHEEQCABEMcLCyAAIAEQzwcgARCzByAAQQEgASkDCBC/BgsgACABQRJBAEEAEMgDDQAgABA5IABGBEAgARAYCwsLgwEBA38jAEEgayIBJAAgACgCECICKAIMIgNBDE8EQCABQeQANgIUIAFBibwBNgIQQYj2CCgCAEHYvwQgAUEQahAgGhA7AAsgASACKAIINgII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ACAAIAEQRSIBRQ0AIAEtAABFDQAgACABIAEQdkEAR0EAIAcgAiADENsCIQEgACgCECABNgJ8IAAQLSgCECIBIAEtAHFBEHI6AHELIABBgNwKKAIAQQBBABBiIQEgACgCECICQf8BIAEgAUH/AU4bOgCgASAAIAIoAggoAgQoAgARAQALRAACQCAAECgEQCAAECRBD0YNAQsgAEEAEH8LAkAgABAoBEAgAEEAOgAPDAELIABBADYCBAsgABAoBH8gAAUgACgCAAsLlAYBBH8jAEGQAWsiASQAAkACQCAARQ0AIAAtAABFDQBB8NoKKAIAIgMEQEG+3gotAAANASABIAM2AnBB/vkEIAFB8ABqECpBvt4KQQE6AAAMAQtBwN4KKAIAIQMCQEHk2gooAgAEQCADDQEDQEHM3gooAgAgAk0EQEHE3gpBCBAxQcTeChA0QcDeCkHk2gooAgAiAjYCACABQfQAaiACEP4JQdzeCiABKAKMATYCAEHU3gogASkChAE3AgBBzN4KIAEpAnw3AgBBxN4KIAEpAnQ3AgAMAwUgAUHM3gopAgA3A0ggAUHE3gopAgA3A0AgAUFAayACEBkhAwJAAkBB1N4KKAIAIgQOAgEHAAsgAUHE3gooAgAgA0EDdGopAgA3AzggAUE4aiAEEQEACyACQQFqIQIMAQsACwALAkAgA0Ho2gooAgBGDQADQEHM3gooAgAgAk0EQEHE3gpBCBAxQcTeChA0QcDeCkHo2gooAgAiAjYCACACRQ0CIAItAABFDQIgAUH0AGogAhD+CUHc3gogASgCjAE2AgBB1N4KIAEpAoQBNwIAQczeCiABKQJ8NwIAQcTeCiABKQJ0NwIABSABQczeCikCADcDMCABQcTeCikCADcDKCABQShqIAIQGSEDAkACQEHU3gooAgAiBA4CAQcACyABQcTeCigCACADQQN0aikCADcDICABQSBqIAQRAQALIAJBAWohAgwBCwsLAkAgAC0AAEEvRg0AQczeCigCAEUNACABQdzeCigCADYCGCABQdTeCikCADcDECABQczeCikCADcDCCABQcTeCikCADcDACABIAAQ/QkhAgwCCyAAIQIMAQtBACECA0AgAkEDRwRAIAAgAkH54gFqLAAAIAAQQEEBahDkCyIDQQFqIAAgAxshACACQQFqIQIMAQsLIAFB3N4K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AUEHcXRyOgAADwtBl7IDQe/6AEHRAEHfIRAAAAtQAQF/IAEoAhAoApwBRQRAQQAPCyAAIAFBMEEAIAEoAgBBA3FBA0cbaigCKBDDDgR/IAAgAUFQQQAgASgCAEEDcUECRxtqKAIoEMMOBUEACws1AQJ/AkAgABAcIgFFBEAMAQsgARCGAiECA0AgACABEB0iAUUNASACIAEQnggaDAALAAsgAguGAwEDfyABIAFBMGoiAyABKAIAQQNxQQNGGygCKCgCECICKALQASACKALUASICQQFqIAJBAmoQ2gEhAiABIAMgASgCAEEDcUEDRhsoAigoAhAgAjYC0AEgASADIAEoAgBBA3FBA0YbKAIoKAIQIgIgAigC1AEiBEEBajYC1AEgAigC0AEgBEECdGogATYCACABIAMgASgCAEEDcUEDRhsoAigoAhAiAygC0AEgAygC1AFBAnRqQQA2AgAgASABQTBrIgMgASgCAEEDcUECRhsoAigoAhAiAigC2AEgAigC3AEiAkEBaiACQQJqENoBIQIgASADIAEoAgBBA3FBAkYbKAIoKAIQIAI2AtgBIAEgAyABKAIAQQNxQQJGGygCKCgCECICIAIoAtwBIgRBAWo2AtwBIAIoAtgBIARBAnRqIAE2AgAgASADIAEoAgBBA3FBAkYbKAIoKAIQIgEoAtgBIAEoAtwBQQJ0akEANgIAIAAoAhBBAToA8AEgABBhKAIQQQE6APABC4ABAQJ/QcABIQMgACECA0AgAigCECADaigCACICBEBBuAEhAyABIAJHDQELCyACBEAgASgCECICKAK8ASEBIAIoArgBIgIEQCACKAIQIAE2ArwBCyABIAAgARsoAhBBuAFBwAEgARtqIAI2AgAPC0GbpANBq7oBQb8BQdyfARAAAAsJAEEBIAAQ1AILYQEEfyAAKAIEIQQCQANAIAIgBEYNASACQQJ0IAJBAWohAiAAKAIAIgVqIgMoAgAgAUcNAAsgACAEQQFrIgE2AgQgAyAFIAFBAnQiAWooAgA2AgAgACgCACABakEANgIACwtDAAJAIAAQKARAIAAQJEEPRg0BCyAAEI4PCwJAIAAQKARAIABBADoADwwBCyAAQQA2AgQLIAAQKAR/IAAFIAAoAgALC3QBAn8jAEEgayICJAACQCAArSABrX5CIIhQBEAgACABEE4iA0UNASACQSBqJAAgAw8LIAIgATYCBCACIAA2AgBBiPYIKAIAQabqAyACECAaEC8ACyACIAAgAWw2AhBBiPYIKAIAQfXpAyACQRBqECAaEC8AC7cNAgh/A3wjAEHAAmsiBCQAAkAgABA5IgkgACgCAEEDcSIKQQAQ5QMiBUUNAANAIAVFDQECQCAAIAUQRSIDRQ0AIAMtAABFBEAgBSgCCEHC8AAQPkUNAQsgAUG57QQQGxogASACKAIAEEQgBSgCCCACIAEQuwIgAUGTzQMQGxoCQCACLQAFQQFHDQACQCAFKAIIIgNBwcMBED4NACADQbHDARA+DQAgA0G5wwEQPg0AIANBl8MBED4NACADQajDARA+DQAgA0GfwwEQPkUNAQsgACAFEEUiA0UNASADLQAARQ0BIANBABCQCiIIRQRAIAQgAzYCAEHK+gQgBBAqDAILIAFB7v8EEBsaIAIgAigCACIDQQFqNgIAIAEgAxBEIAFB/s0EEBsaQQAhBwNAIAgoAgAgB00EQCACIAIoAgBBAWs2AgAgAUHu/wQQGxogASACKAIAEEQgAUH+yAEQGxogCBCOCgwDCyAHBEAgAUG57QQQGxoLIAgoAgghAyACIAIoAgAiBkEBajYCACABIAYQRCABQfDYAxAbGiABIAIoAgAQRAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADIAdB0ABsaiIDKAIAIgYOEAoKAAABAQIDBAQGBwsFBQgJCyAEQdAAQfAAIAZBAkYbNgJQIAFB7+wEIARB0ABqEB4gASACKAIAEEQgASADQQhqELQIDAoLIARBwgBB4gAgBkEERhs2AmAgAUHv7AQgBEHgAGoQHiABIAIoAgAQRCABIANBCGoQtAgMCQsgAUGk7QRBABAeIAEgAigCABBEIAEgA0EIahC0CAwICyABQYztBEEAEB4gASACKAIAEEQgAysDCCELIAQgAysDEDkDmAEgBCALOQOQASABQffqBCAEQZABahAeIAEgAigCABBEIARB4wBB8gAgAygCGCIGQQFGG0HsACAGGzYCgAEgAUH87AQgBEGAAWoQHiABIAIoAgAQRCAEIAMrAyA5A3AgAUG76gQgBEHwAGoQHiABIAIoAgAQRCABQdfMAxAbGiADKAIoIAIgARC7AiABQQoQZQwHCyAEQcMAQeMAIAZBCEYbNgKgASABQe/sBCAEQaABahAeIAEgAigCABBEIAFBo+wEQQAQHiABIAIoAgAQRCABQfDMAxAbGiADKAIIIAIgARC7AiABQQoQZQwGCyAEQcMAQeMAIAZBDUYbNgKQAiABQe/sBCAEQZACahAeIAEgAigCABBEAkACQAJAIAMoAggOAgABAgsgAUGj7ARBABAeIAEgAigCABBEIAFB8MwDEBsaIAMoAhAgAiABELsCIAFBChBlDAcLIAFB/esEQQAQHiABIAIoAgAQRCABIAIoAgAQRCADKwMQIQsgBCADKwMYOQOIAiAEIAs5A4ACIAFBo+sEIARBgAJqEB4gASACKAIAEEQgAysDICELIAQgAysDKDkD+AEgBCALOQPwASABQY3rBCAEQfABahAeIAEgAigCABBEIAEgAygCMCADKAI0IAIQkA8MBgsgAUGQ7ARBABAeIAEgAigCABBEIAEgAigCABBEIAMrAxAhCyADKwMYIQwgBCADKwMgOQPgASAEIAw5A9gBIAQgCzkD0AEgAUHV6wQgBEHQAWoQHiABIAIoAgAQRCADKwMoIQsgAysDMCEMIAQgAysDODkDwAEgBCAMOQO4ASAEIAs5A7ABIAFBuesEIARBsAFqEB4gASACKAIAEEQgASADKAJAIAMoAkQgAhCQDwwFCyABQbDtBEEAEB4gASACKAIAEEQgBCADKwMIOQOgAiABQczqBCAEQaACahAeIAEgAigCABBEIAFBjc0DEBsaIAMoAhAgAiABELsCIAFBChBlDAQLIAFBmO0EQQAQHiABIAIoAgAQRCABQYPNAxAbGiADKAIIIAIgARC7AiABQQoQZQwDCyABQfHrBEEAEB4gASACKAIAEEQgBCADKAIINgKwAiABQe7HBCAEQbACahAeDAILIARBsgI2AhQgBEGFuwE2AhBBiPYIKAIAQdi/BCAEQRBqECAaEDsACyAEQeUAQcUAIAYbNgJAIAFB7+wEIARBQGsQHiABIAIoAgAQRCADKwMIIQsgAysDECEMIAMrAxghDSAEIAMrAyA5AzggBCANOQMwIAQgDDkDKCAEIAs5AyAgAUHJygQgBEEgahAeCyACIAIoAgBBAWsiAzYCACABIAMQRCABQa8IEBsaIAdBAWohBwwACwALIAAgBRBFIAIgARC7AgsgCSAKIAUQ5QMhBQwACwALIARBwAJqJAAL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IAM2AgAgAUEgakG4MiABEIQBA0AgAi0AACACQQFqIQINAAtBuqADIQMMAQUgAUEgakEpEH8LCwsgAEGsywMgAUEgahDCARDAAwwACwALIAFBIGoQXCABQTBqJAALaQECfyMAQRBrIgMkACADQgA3AwggA0IANwMAA0ACQCACLQAAIgRB3ABHBEAgBA0BIAAgASADEMIBEHEgAxBcIANBEGokAA8LIANB3AAQfyACLQAAIQQLIAMgBMAQfyACQQFqIQIMAAsAC5ICAQV/IAAQhwUhAyAAECQhAQJAAkACQANAIAEiAkUNASADIAFBAWsiAWotAABBLkcNAAsgABAkIQEDQCABQQFrIQUgASACRwRAIAMgBWotAABBMEcNAgsCQCAAECgEQCAALQAPIgRFDQQgACAEQQFrOgAPDAELIAAgACgCBEEBazYCBAsgASACRyAFIQENAAsgABAkIgFBAkkNACABIANqIgFBAmsiAi0AAEEtRw0AIAFBAWstAABBMEcNACACQTA6AAAgABAoBEAgAC0ADyIBRQ0DIAAgAUEBazoADw8LIAAgACgCBEEBazYCBAsPC0HijwNBoPwAQZIDQegqEAAAC0HijwNBoPwAQagDQegqEAAAC8cBAQN/IwBBEGsiAiQAIAFBUEEAIAEoAgBBA3FBAkcbaiIBQVBBACABKAIAQQNxIgNBAkcbaigCKCEEIAFBMEEAIANBA0cbaigCKCEDIAIgASkDCDcDCCACIAEpAwA3AwACQCAAIAMgBCACENkCRQ0AIAAQOSAARgRAIAAtABhBIHEEQCABEMcLCyAAIAEQzwcgARCzByAAQQIgASkDCBC/BgsgACABQQ9BAEEAEMgDDQAgABA5IABGBEAgARAYCwsgAkEQaiQACxoAIAAgARCsASIBIAIQwQMgACABQQAQjAEaC0UAIAAgAUG+zgMgAisDAEQAAAAAAABSQKMQjQMgACABQb7OAyADIAIrAwgiA6EgA0G42wotAAAbRAAAAAAAAFJAoxCNAwt9AQN/IwBBMGsiAiQAIAAQISEDIAAQLSEEAkACQCADBEBBfyEAIAQgASADEJIGQX9HDQEMAgsgAiAAKQMINwMAIAJBEGoiA0EeQdTPASACELQBGkF/IQAgASADIAQoAkwoAgQoAgQRAABBf0YNAQtBACEACyACQTBqJAAgAAvN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ABCPATYCuAJBAEHk2wooAgBEAAAAAAAALEBEAAAAAAAA8D8QTCEOIABBnKAKNgLIAiAAIA45A8ACIAAgARAhNgK0ASAAKAKoAhAYIABBADYCqAIgACgCrAIQGCAAQQA2AqwCIAAoArQCEBggAEEANgK0AgJAAkAgAUGqKRAnIgUEQCAAIAFB/doAECciAkG8zgMgAhs2AqACIAAgAUHw2gAQJyICQbqgAyACGyIENgKkAiAAKAKgAiICIAQQyQIgAmoiAkEAIAItAAAbIgIEQCADIAIsAAA2AtACQYLkBCADQdACahAqIABB8f8ENgKkAgsgACAFEGQ2AqgCIANCADcD0AQgA0IANwPIBCADQgA3A8AEIANBwARqQQQQJiECIAMoAsAEIAJBAnRqIAMoAtQENgIAIAAoAqgCIQIDQCACIAAoAqACELEFIgIEQCADIAI2AtQEIANBwARqQQQQJiECIAMoAsAEIAJBAnRqIAMoAtQENgIAQQAhAgwBCwsgAygCyAQiAkEBayIFQQBIDQIgAkECTwRAIANBADYC1AQgA0HABGoiBEEEECYhAiADKALABCACQQJ0aiADKALUBDYCACAEIABBrAJqQQBBBBDHAQtBACECA0AgAygCyAQgAksEQCADIAMpA8gENwO4AiADIAMpA8AENwOwAiADQbACaiACEBkhCQJAAkACQCADKALQBCIEDgICAAELIAMoAsAEIAlBAnRqKAIAEBgMAQsgAygCwAQgCUECdGooAgAgBBEBAAsgAkEBaiECDAELCyADQcAEaiICQQQQMSACEDQgACAFNgKwAiABQZEkECciBUUNASAFLQAARQ0BQQAhBiAAKAKwAkECakEEED8hB0EBIQIDQCAAKAKwAiIEIAJOBEAgACACIAQgBRDfCARAIAcgBkEBaiIGQQJ0aiACNgIACyACQQFqIQIMAQsLAkAgBgRAIAcgBjYCACAHIAZBAnRqIARBAWo2AgQMAQsgAyAFNgLAAkHA5QQgA0HAAmoQKiAHEBhBACEHCyAAIAc2ArQCDAELIABBATYCsAILQQEQ2gIgA0GoBGohDCADQcgEaiENQYC/CCgCACEIIAAgACgCmAEiAjYCnAEDQAJAAkACQCACBEACfyAAKAI8IgRFBEBBACEGQQAMAQsgBCgCDCEGIAQoAggLIQQgAiAGNgIYIAIg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/////////w+DhCICQoGAgICAgICACFoEQCAAQgF8IQAMAQsgAkKAgICAgICAgAhSDQAgAEIBgyAAfCEACyAAQoCAgICAgIAIhSAAIABC/////////wdWIgQbIQAgBK0LIQIgBUEgaiQAIAFCgICAgICAgICAf4MgAkI0hoQgAIS/C4kCAAJAIAAEfyABQf8ATQ0BAkBBxIMLKAIAKAIARQRAIAFBgH9xQYC/A0YNAwwBCyABQf8PTQRAIAAgAUE/cUGAAXI6AAEgACABQQZ2QcABcjoAAEECDwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCABGtB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LC0H8gAtBGTYCAEF/BUEBCw8LIAAgAToAAEEBC8ICAQR/IwBB0AFrIgUkACAFIAI2AswBIAVBoAFqIgJBAEEoEDgaIAUgBSgCzAE2AsgBAkBBACABIAVByAFqIAVB0ABqIAIgAyAEENELQQBIBEBBfyEEDAELIAAoAkxBAEggACAAKAIAIghBX3E2AgACfwJAAkAgACgCMEUEQCAAQdAANgIwIABBADYCHCAAQgA3AxAgACgCLCEGIAAgBTYCLAwBCyAAKAIQDQELQX8gABCmBw0BGgsgACABIAVByAFqIAVB0ABqIAVBoAFqIAMgBBDRCwshAiAGBEAgAEEAQQAgACgCJBEDABogAEEANgIwIAAgBjYCLCAAQQA2AhwgACgCFCEBIABCADcDECACQX8gARshAgsgACAAKAIAIgAgCEEgcXI2AgBBfyACIABBIHEbIQQNAAsgBUHQAWokACAECxIAIAAgAUEKQoCAgIAIELAFpwthAAJAIAANACACKAIAIgANAEEADwsgACABEKoEIABqIgAtAABFBEAgAkEANgIAQQAPCyAAIAEQyQIgAGoiAS0AAARAIAIgAUEBajYCACABQQA6AAAgAA8LIAJBADYCACAAC38CAn8CfiMAQaABayIEJAAgBCABNgI8IAQgATYCFCAEQX82AhggBEEQaiIFQgAQjwIgBCAFIANBARDYCyAE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IABCADcCBCAAIAAoAiwiATYCHCAAIAE2AhQgACABIAAoAjBqNgIQQQALlAMCA34CfwJAIAC9IgJCNIinQf8PcSIEQf8PRw0AIABEAAAAAACAVkCiIgAgAKMPCyACQgGGIgFCgICAgICAwNaAf1gEQCAARAAAAAAAAAAAoiAAIAFCgICAgICAwNaAf1EbDwsCfiAERQRAQQAhBCACQgyGIgFCAFkEQANAIARBAWshBCABQgGGIgFCAFkNAAsLIAJBASAEa62GDAELIAJC/////////weDQoCAgICAgIAIhAshASAEQYUISgRAA0ACQCABQoCAgICAgKALfSIDQgBTDQAgAyIBQgBSDQAgAEQAAAAAAAAAAKIPCyABQgGGIQEgBEEBayIEQYUISg0AC0GFCCEECwJAIAFCgICAgICAoAt9IgNCAFMNACADIgFCAFINACAARAAAAAAAAAAAog8LIAFC/////////wdYBEADQCAEQQFrIQQgAUKAgICAgICABFQgAUIBhiEBDQALCyACQoCAgICAgICAgH+DIAFCgICAgICAgAh9IAStQjSGhCABQQEgBGutiCAEQQBKG4S/C+ICAQV/AkACQAJAIAIoAkxBAE4EQCABQQJIDQEMAgtBASEGIAFBAUoNAQsgAiACKAJIIgJBAWsgAnI2AkggAUEBRw0BIABBADoAACAADwsgAUEBayEEIAAhAQJAA0ACQAJAAkAgAigCBCIDIAIoAggiBUYNAAJ/IANBCiAFIANrEPoCIgcEQCAHIAIoAgQiA2tBAWoMAQsgAigCCCACKAIEIgNrCyEFIAEgAyAFIAQgBCAFSxsiAxAfGiACIAIoAgQgA2oiBTYCBCABIANqIQEgBw0CIAQgA2siBEUNAiAFIAIoAghGDQAgAiAFQQFqNgIEIAUtAAAhAwwBCyACEL0FIgNBAE4NAEEAIQQgACABRg0DIAItAABBEHENAQwDCyABIAM6AAAgAUEBaiEBIANB/wFxQQpGDQAgBEEBayIEDQELCyAARQRAQQAhBAwBCyABQQA6AAAgACEECyAGDQALIAQLpBgDE38EfAF+IwBBMGsiCSQAAkACQAJAIAC9IhlCIIinIgNB/////wdxIgZB+tS9gARNBEAgA0H//z9xQfvDJEYNASAGQfyyi4AETQRAIBlCAFkEQCABIABEAABAVPsh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IABEAAAAAAAA4D+ioiIDob1CgICAgHCDvyIERAAAIGVHFfc/oiIBIAkgCEEUdmq3IgKgIgUgASACIAWhoCAAIABEAAAAAAAAAECgoyIBIAMgASABoiICIAKiIgEgASABRJ/GeNAJmsM/okSveI4dxXHMP6CiRAT6l5mZmdk/oKIgAiABIAEgAUREUj7fEvHCP6JE3gPLlmRGxz+gokRZkyKUJEnSP6CiRJNVVVVVVeU/oKKgoKIgACAEoSADoaAiACAEoEQAou8u/AXnPaIgAEQAACBlRxX3P6KgoKAhAAsgAAtZAQF/IwBBIGsiAiQAIAAQ7AEiAAR/IAAoAgghACACQgA3AwggAkEANgIYIAJCADcDECACIAE2AgggAkIANwMAIAAgAkEEIAAoAgARAwAFQQALIAJBIGokAAuVAQIDfwV8IAMQVyIImiEJIAAoAgghBiADEEohByAGEBwhBANAIAQEQCAEKAIQKAKUASIFIAIgBSsDACIKIAiiIAcgBSsDCCILoqCgOQMIIAUgASAKIAeiIAsgCaKgoDkDACAGIAQQHSEEDAELCyAAQThqIQQDQCAEKAIAIgAEQCAAIAEgAiADEK8HIABBBGohBAwBCwsLtQIBBX8jAEEwayIDJAAgACgACCABTwRAIABBADYCFCAAQQQQJiEEIAAoAgAgBEECdGogACgCFDYCACAAQQQQjAIgACgACCABQX9zakECdCIEBEAgACgCACADIAApAgg3AyggAyAAKQIANwMgIANBIGogAUEBahAZIAAoAgAhByADIAApAgg3AxggAyAAKQIANwMQQQJ0aiAHIANBEGogARAZQQJ0aiAEELYBGgsgACACNgIUIAMgACkCCDcDCCADIAApAgA3AwAgAyABEBkhAQJAAkACQCAAKAIQIgIOAgIAAQsgACgCACABQQJ0aigCABAYDAELIAAoAgAgAUECdGooAgAgAhEBAAsgACgCACABQQJ0aiAAKAIUNgIAIANBMGokAA8LQfGhA0GFuAFBFkGhGhAAAAsdACAAKAIIIAFBARCFARogASgCECgCgAEgADYCDAtEAQF/IAAEQCAAKAIEIgEEQCABEG0LIAAoAggiAQRAIAEQbQsgACgCDBAYIAAoAhQiAQRAIAEgACgCEBEBAAsgABAYCws+AQN/IAAQLSECIAAoAhAiAQRAA0Ag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/wotAABB1P8KQQE6AABBAXFFBEAgCkEwQQAgCigCAEEDcUEDRxtqKAIoECEhACAEIApBUEEAIAooAgBBA3FBAkcbaigCKBAhNgIEIAQgADYCAEHo7QQgBBAqCyAGEBggChCZBAwFBSAEKAKMASENIAQrA1ghEyAFIAQrA4ABOQMIIAUgEzkDACABQQFrIQEgBUEQaiEFIAIgDWohAgwCCwALCwNAIAItAAAiBUEJayIBQRdLQQEgAXRBn4CABHFFckUEQCACQQFqIQIMAQsLIAogABDeBiEJIBIEQCAEKAJ8IQEgCSAVOQMYIAkgFjkDECAJIAE2AggLIAgEQCAEKAJ4IQEgCSAXOQMoIAkgFDkDICAJIAE2AgwLIAIgBUEARyIRaiECQQAhBQNAIAAgBUcEQCAFQQR0IgEgCSgCAGoiDSABIAZqIgEpAwA3AwAgDSABKQMINwMIIAVBAWohBQwBCwsgBhAYDAELCyAKKAIQIgUoAmAiAARAIAogAEH12QAQsQQgCigCECEFCyAFKAJsIgAEQCAKIABB2tkAELEEIAooAhAhBQsgBSgCZCIABH8gCiAAQfDZABCxBCAKKAIQBSAFCygCaCIABEAgCiAAQejZABCxBAsgC0EBaiELCyADIAoQMCEKDAELCyADIA8QHSEPDAELCyALRQRAQQAhAQwBC0ECQQEgAxC0AiALRhshAQtBACEAQQAhCiADKAIQKAIIIgIoAlgiCARAIAJBADYCVEEBIQoLAkAgCA0AQfjaCigCAEEBRw0AIAMQtgRFDQBBASEAIAMoAhAoAgwiAkUNACACQQA6AFELIAMQwQIgCARAIAMoAhAhD0QAAAAAAAAAACEVRAAAAAAAAAAAIRZBACERQQAhEkEAIQ4jAEFAaiILJAAgAygCECICKAKQASENIARB2ABqIgkgAikDEDcDACAJIAIpAyg3AxggCSACKQMgNwMQIAkgAikDGDcDCAJAIAIoAggoAlgiBkUNAAJAIAkrAwAgCSsDEGINACAJKwMIIAkrAxhiDQAgCUL/////////dzcDGCAJQv/////////3/wA3AwAgCUL/////////9/8ANwMIIAlC/////////3c3AxALIAYoAgghBwNAIBEgBigCAE8NASALQgA3AzggC0IANwMwIAtCADcDKCALQgA3AyACQAJAAkACQAJA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AisDAKEiGyAboiACKwMYIAIrAwihIhsgG6KgIAUrAxAgBSsDAKEgBCsDOKAgBCsDKKEiGyAbokQAAAAAAADQP6JlIQMMAQsgBSgCICEDIAUoAiQgASACKQMYNwPIAiABIAIpAxA3A8ACIAMgAUHAAmoQ5gwhBiAEKAJIIQMgBCgCTCABIAIpAwg3A7gCIAEgAikDADcDsAIgAyABQbACahDmDCEHIAQoAkgiEUEBdCEXIAUoAiAiDkEBdCEYIBFBAWshGSAOQQFrIRpBACEDQQAhCAJAA0AgASAGIAhBBHRqIgkpAwg3A6gCIAEgCSkDADcDoAIgASAGIAggGmogDm9BBHRqIhIpAwg3A5gCIAEgEikDADcDkAIgAUHABGogAUGgAmogAUGQAmoQ6wwgASAHIAxBBHRqIgspAwg3A4gCIAEgCykDADcDgAIgASAHIAwgGWogEW9BBHRqIhMpAwg3A/gBIAEgEykDADcD8AEgAUGwBGogAUGAAmogAUHwAWoQ6wwgAUIANwOYBCABQgA3A+gBIAEgASkDyAQ3A9gBIAEgASkDuAQ3A8gBIAFCADcDkAQgAUIANwPgASABIAEpA8AENwPQASABIAEpA7AENwPAASABKwPoASABKwPYASIboSABKwPAASABKwPQASIcoaIgASsDyAEgG6EgASsD4AEgHKGioSEfIAEgEikDCDcDuAEgASASKQMANwOwASABIAkpAwg3A6gBIAEgCSkDADcDoAEgASALKQMINwOYASABIAspAwA3A5ABIAFBsAFqIAFBoAFqIAFBkAFqEOoMIRUgASATKQMINwOIASABIBMpAwA3A4ABIAEgCykDCDcDeCABIAspAwA3A3AgASAJKQMINwNoIAEgCSkDADcDYCABQYABaiABQfAAaiABQeAAahDqDCEWIAEgEikDCDcDWCABIBIpAwA3A1AgASAJKQMINwNIIAEgCSkDADcDQCABIBMpAwg3AzggASATKQMANwMwIAEgCykDCDcDKCABIAspAwA3AyAgASsDMCIgIAErA1giGyABQUBrIgkrAwgiIaGiIAErAyAiJSAhIBuhIiKiIAErA1AiHiABKwMoIh0gASsDOCIcoaIiJiAJKwMAIiMgHCAdoaKgoKAiJEQAAAAAAAAAAGIEfyABICUgHCAboaIgJiAgIBsgHaGioKAgJKMi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AgAiESAKKAIASARAIBAgAkECdCIRaiAMNgIAIAMgEWogBCAFaigCADYCACACQQFqIQIMAQsgAyARQQJ0aiIMIAwoAgAgBCAFaigCAGo2AgALIABBAWohAAwBCwsgByAJaiACNgIAIAEhAAwACwALIANBACADQQBKGyEJQQAhAANAIAAgCUYNByAPIABBAWoiAUECdCIDaiEEIA8gAEECdCIFaigCACEAA0AgACAEKAIATkUEQCAGIBQgAEECdGooAgAiCEECdGogAjYCACAQIAJBAnRqIAg2AgAgAEEBaiEAIAJBAWohAgwBCwsgBSAHaiEEIAMgDmohCCAFIA5qKAIAIQADQCAAIAgoAgBORQRAIAYgEyAAQQJ0aigCACIFQQJ0aigCACAEKAIASARAIBAgAkECdGogBTYCACACQQFqIQILIABBAWohAAwBCwsgAyAHaiACNgIAIAEhAAwACwALIAVBAUYNBAsgEkHqBDYCBCASQZa3ATYCAEGI9ggoAgBB2L8EIBIQIBoQOwALQcLeAUGWtwFBlQRBr7ABEAAAC0GH0AFBlrcBQZYEQa+wARAAAAtB2pUBQZa3AUGXBEGvsAEQAAALIANBACADQQBKGyEIIA0oAhwhAyABKAIcIQUgACgCHCEVQQAhAANAIAAgCEYNASAPIABBAWoiAUECdCIJaiEKIA8gAEECdCIEaigCACEAA0AgACAKKAIATkUEQCAGIBQgAEECdGooAgAiC0ECdGogAjYCACAQIAJBAnRqIAs2AgAgAyACQQN0aiAVIABBA3RqKwMAOQMAIABBAWohACACQQFqIQIMAQsLIAQgB2ohCiAJIA5qIQsgBCAOaigCACEAA0AgACALKAIATkUEQAJAIAYgEyAAQQJ0aigCACIEQQJ0aigCACIMIAooAgBIBEAgECACQQJ0aiAENgIAIAMgAkEDdGogBSAAQQN0aisDADkDACACQQFqIQIMAQsgAyAMQQN0aiIEIAUgAEEDdGorAwAgBCsDAKA5AwALIABBAWohAAwBCwsgByAJaiACNgIAIAEhAAwACwALIA0gAjYCCCAGEBgLIBJBEGokACANC8sHAg9/AXwjAEEQayINJAACQCAARQRADAELAkACQCAAKAIgRQRAIAAoAhghDiAAKAIUIQcgACgCBCIIIAAoAgAiAiAAKAIIIgEgACgCEEEAELYCIgkgATYCCCAJKAIYIQ8gCSgCFCEDQX8gCCAIQQBIG0EBaiEKQQAhAQNAIAEgCkYEQEEAIQEgAkEAIAJBAEobIQogA0EEaiEFA0ACQCABIApGBEBBACEBIAhBACAIQQBKGyECDAELIAcgAUEBaiICQQJ0aiEEIAcgAUECdGooAgAhAQNAIAQoAgAgAUwEQCACIQEMAwUgBSAOIAFBAnRqKAIAQQJ0aiILIAsoAgBBAWo2AgAgAUEBaiEBDAELAAsACwsDQCABIAJGRQRAIAFBAnQhBSADIAFBAWoiAUECdGoiBCAEKAIAIAMgBWooAgBqNgIADAELC0EAIQICQAJAAkACQCAAKAIQIgFBBGsOBQADAwMBAgsgCSgCHCEFIAAoAhwhBEEAIQADQCAAIApGDQggByAAQQFqIgJBAnRqIQsgByAAQQJ0aigCACEBA0AgCygCACABTARAIAIhAAwCBSAPIAMgDiABQQJ0IgZqIgwoAgBBAnRqKAIAQQJ0aiAANgIAIAQgBmooAgAhBiADIAwoAgBBAnRqIgwgDCgCACIMQQFqNgIAIAUgDEECdGogBjYCACABQQFqIQEMAQsACwALAAsDQCACIApGDQcgByACQQFqIgBBAnRqIQUgByACQQJ0aigCACEBA0AgBSgCACABTARAIAAhAgwCBSADIA4gAUECdGooAgBBAnRqIgQgBCgCACIEQQFqNgIAIA8gBEECdGogAjYCACABQQFqIQEMAQsACwALAAsgAUEBRg0ECyANQfQANgIEIA1BlrcBNgIAQYj2CCgCAEHYvwQgDRAgGhA7AAUgAyABQQJ0akEANgIAIAFBAWohAQwBCwALAAtBodABQZa3AUHFAEGckwEQAAALIAkoAhwhBSAAKAIcIQQDQCACIApGDQEgByACQQFqIgBBAnRqIQsgByACQQJ0aigCACEBA0AgCygCACABTARAIAAhAgwCBSAPIAMgDiABQQJ0aiIGKAIAQQJ0aigCAEECdGogAjYCACAEIAFBA3RqKwMAIRAgAyAGKAIAQQJ0aiIGIAYoAgAiBkEBajYCACAFIAZBA3RqIBA5AwAgAUEBaiEBDAELAAsACwALA0AgCEEATEUEQCADIAhBAnRqIAMgCEEBayIIQQJ0aigCADYCAAwBCwsgA0EANgIACyANQRBqJAAgCQsLACAAIAFBAhD/Bws+AQJ8IAG3IQMDQEGc2wovAQAgAkoEQBDXASEEIAAoAhAoApQBIAJBA3RqIAQgA6I5AwAgAkEBaiECDAELCwv3AQICfwJ8IwBBMGsiAyQAIAAgARAsIQEDQCABBEACQAJAIAJFDQAgASACEEUiBC0AAEUNACADIANBKGo2AiACQCAEQfCDASADQSBqEFFBAEwNACADKwMoIgVEAAAAAAAAAABjDQAgBUQAAAAAAAAAAGINAkH42gooAgANAgsgAyAENgIQQem1AyADQRBqECogABAhIQQgA0KAgICAgICA+D83AwggAyAENgIAQbGmBCADEIABCyADQoCAgICAgID4PzcDKEQAAAAAAADwPyEFCyABKAIQIAU5A4gBIAYgBaAhBiAAIAEQMCEBDAELCyADQTBqJAAgBguQAQEFfyMAQeAAayIDJAAgAEEBQab0AEHx/wQQIiEFIABBAUHlOUHx/wQQIiEGIAAQHCECIAFBAkkhAQNAIAIEQCADQTdqIgQgAigCEDQC9AEQzA0gAiAFIAQQcSABRQRAIANBDmoiBCACKAIQNAL4ARDMDSACIAYgBBBxCyAAIAIQHSECDAELCyADQeAAaiQAC9gBAQJ/IAAQeSEBA0AgAQRAIAEQggggARB4IQEMAQsLAkAgAEHiJUEAQQEQNkUNACAAKAIQKAIIEBggACgCECIBQQA2AgggASgCuAEQGCAAKAIQKAKMAhAYIAAoAhAoAtgBEBggACgCECICKALEAQRAIAIoAugBIQEDQCABIAIoAuwBSkUEQCACKALEASABQcgAbGooAgwQGCABQQFqIQEgACgCECECDAELCyACKALEAUG4f0EAIAIoAugBQX9GG2oQGAsgABA5IABGDQAgACgCECgCDBC8AQsLzgIBA38jAEHQAGsiAiQAIAJCADcDSCACQgA3A0ACfyAAEDxFBEAgAUEANgIAQQAMAQsgAkIANwM4IAJCADcDMCACQgA3AyggAkIANwMYIAJCADcDECACQgA3AwggAkG6AzYCJCACQbsDNgIgIAAQHCEDA0AgAwRAIAMoAhBBADYCsAEgACADEB0hAwwBCwsgABAcIQMDQCADBEAgA0F/IAIoAiQRAABFBEAgAkFAayIEQQAQ6AUgAiACKAIwNgIAIAQgAhDnBSAAIAQQsQNBARCSASIEQeIl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AigCACAFIAIpAgg3A7gGIAUgAikCADcDsAYgBUGwBmogAxAZQcgAbGooAixBAWtBfUsNACACKAIAIAUgAikCCDcD+AMgBSACKQIANwPwAyAFQfADaiADEBlByABsaigCPCACKAIAIQAgBSACKQIINwPoAyAFIAIpAgA3A+ADIAVB4ANqIAMQGSEBQQFrQX1NBEAgAigCACEGAn8gACABQcgAbGooAkBBAUYEQCAFIAIpAgg3A8gBIAUgAikCADcDwAEgBiAFQcABaiADEBlByABsaigCLCEAIAIoAgAgBSACKQIINwO4ASAFIAIpAgA3A7ABIAVBsAFqIAQQGUHIAGxqIAA2AiggAigCACAFIAIpAgg3A6gBIAUgAikCADcDoAEgBUGgAWogAxAZQcgAbGpBfzYCLCACKAIAIAUgAikCCDcDmAEgBSACKQIANwOQASAFQZABaiADEBlByABsaigCPCEAIAIoAgAgBSACKQIINwOIASAFIAIpAgA3A4ABIAVBgAFqIAQQGUHIAGxqIAA2AiwgAigCACEAIAUgAikCCDcDeCAFIAIpAgA3A3AgACAFQfAAaiADEBlByABsaigCKCEBIAUgAikCCDcDaCAFIAIpAgA3A2AgACAFQeAAaiABEBlByABsaiADNgIwIAIoAgAhACAFIAIpAgg3A1ggBSACKQIANwNQIAAgBUHQAGogBBAZQcgAbGooAighASAFIAIpAgg3A0ggBSACKQIANwNAIAAgBUFAayABEBlByABsaiAENgIwIAIoAgAhACAFIAIpAgg3AzggBSACKQIANwMwIAAgBUEwaiAEEBlByABsakEsagwBCyAFIAIpAgg3A4gDIAUgAikCADcDgAMgBiAFQYADaiAEEBlByABsakF/NgIsIAIoAgAgBSACKQIINwP4AiAFIAIpAgA3A/ACIAVB8AJqIAMQGUHIAGxqKAIsIQAgAigCACAFIAIpAgg3A+gCIAUgAikCADcD4AIgBUHgAmogBBAZQcgAbGogADYCKCACKAIAIAUgAikCCDcD2AIgBSACKQIANwPQAiAFQdACaiADEBlByABsaigCKCEAIAIoAgAgBSACKQIINwPIAiAFIAIpAgA3A8ACIAVBwAJqIAMQGUHIAGxqIAA2AiwgAigCACAFIAIpAgg3A7gCIAUgAikCADcDsAIgBUGwAmogAxAZQcgAbGooAjwhACACKAIAIAUgAikCCDcDqAIgBSACKQIANwOgAiAFQaACaiADEBlByABsaiAANgIoIAIoAgAhACAFIAIpAgg3A5gCIAUgAikCADcDkAIgACAFQZACaiADEBlByABsaigCKCEBIAUgAikCCDcDiAIgBSACKQIANwOAAiAAIAVBgAJqIAEQGUHIAGxqIAM2AjAgAigCACEAIAUgAikCCDcD+AEgBSACKQIANwPwASAAIAVB8AFqIAMQGUHIAGxqKAIsIQEgBSACKQIINwPoASAFIAIpAgA3A+ABIAAgBUHgAWogARAZQcgAbGogAzYCMCACKAIAIQAgBSACKQIINwPYASAFIAIpAgA3A9ABIAAgBUHQAWogBBAZQcgAbGpBKGoLKAIAIQEgBSACKQIINwMoIAUgAikCADcDICAAIAVBIGogARAZQcgAbGogBDYCMCACKAIAIAUgAikCCDcDGCAFIAIpAgA3AxAgBUEQaiADEBlByABsakEANgI8IAIoAgAgBSACKQIINwMIIAUgAikCADcDACAFIAQQGUHIAGxqQQA2AjwMAgsgACABQcgAbGooAiwhACACKAIAIAUgAikCCDcD2AMgBSACKQIANwPQAyAFQdADaiAEEBlByABsaiAANgIoIAIoAgAgBSACKQIINwPIAyAFIAIpAgA3A8ADIAVBwANqIAMQGUHIAGxqQX82AiwgAigCACAFIAIpAgg3A7gDIAUgAikCADcDsAMgBUGwA2ogBBAZQcgAbGpBfzYCLCACKAIAIQAgBSACKQIINwOoAyAFIAIpAgA3A6ADIAAgBUGgA2ogBBAZQcgAbGooAighASAFIAIpAgg3A5gDIAUgAikCADcDkAMgACAFQZADaiABEBlByABsaiAENgIwDAELIAIoAgAgBSACKQIINwOoBiAFIAIpAgA3A6AGIAVBoAZqIAMQGUHIAGxqKAIoIQYgAigCACEHIAUgAikCCDcDmAYgBSACKQIANwOQBgJAIAcgBUGQBmogBhAZQcgAbGooAjAiB0EBa0F9Sw0AIAIoAgAgBSACKQIINwOIBiAFIAIpAgA3A4AGIAVBgAZqIAYQGUHIAGxqKAI0QQFrQX1LDQAgAigCACEGIAUgAikCCDcDuAUgBSACKQIANwOwBQJAIAYgBUGwBWogBxAZQcgAbGooAgRBAEwNACACKAIAIAUgAikCCDcDqAUgBSACKQIANwOgBSAFQaAFaiAHEBlByABsaigCBCABIABBEGoQxwQNACACKAIAIAUgAikCCDcDmAUgBSACKQIANwOQBSAFQZAFaiADEBlByABsakF/NgIoIAIoAgAgBSACKQIINwOIBSAFIAIpAgA3A4AFIAVBgAVqIAMQGUHIAGxqQX82AiwgAigCACAFIAIpAgg3A/gEIAUgAikCADcD8AQgBUHwBGogBBAZQcgAbGpBfzYCLCACKAIAIQAgBSACKQIINwPoBCAFIAIpAgA3A+AEIAAgBUHgBGogBBAZQcgAbGooAighASAFIAIpAgg3A9gEIAUgAikCADcD0AQgACAFQdAEaiABEBlByABsaiAENgI0DAILIAIoAgAgBSACKQIINwPIBCAFIAIpAgA3A8AEIAVBwARqIAQQGUHIAGxqQX82AiggAigCACAFIAIpAgg3A7gEIAUgAikCADcDsAQgBUGwBGogBBAZQcgAbGpBfzYCLCACKAIAIAUgAikCCDcDqAQgBSACKQIANwOgBCAFQaAEaiADEBlByABsakF/NgIsIAIoAgAhACAFIAIpAgg3A5gEIAUgAikCADcDkAQgACAFQZAEaiADEBlByABsaigCKCEBIAUgAikCCDcDiAQgBSACKQIANwOABCAAIAVBgARqIAEQGUHIAGxqIAM2AjAMAQsgAigCACEAIAUgAikCCDcD+AUgBSACKQIANwPwBSAAIAVB8AVqIAMQGUHIAGxqKAIoIQEgBSACKQIINwPoBSAFIAIpAgA3A+AFIAAgBUHgBWogARAZQcgAbGogAzYCMCACKAIAIQAgBSACKQIINwPYBSAFIAIpAgA3A9AFIAAgBUHQBWogAxAZQcgAbGooAighASAFIAIpAgg3A8gFIAUgAikCADcDwAUgACAFQcAFaiABEBlByABsaiAENgI0CyAFQdAGaiQAC1UCAnwBfyABQQAgAUEAShshASAAtyIDIQIDfyABIARGBH8gAyACo5siAplEAAAAAAAA4EFjBEAgAqoPC0GAgICAeAUgBEEBaiEEIAIQrQchAgwBCwsLPgECfCAAIAErAwAiAhAyOQMAIAAgASsDCCIDEDI5AwggACACIAErAxCgEDI5AxAgACADIAErAxigEDI5AxgLLAEBfyAAKAIEIgIE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RQRAAkAgASADKAK4ASACQQJ0aigCACIDECEiBUGABCABKAIAEQMABEAgBCAFNgIAQaG4BCAEECoMAQtBEBBSIgYgAzYCDCAGIAU2AgggASAGQQEgASgCABEDABoLIAMgARD0CSACQQFqIQIMAQsLIARBEGokAAsoAQF/A38gAAR/IAAoAgQQ9QkgAWpBAWohASAAKAIAIQAMAQUgAQsLC00BAn8gARAhIgMEQAJAIANB4jdBBxDqAQ0AIAAgARAhQYAEIAAoAgARAwAiAEUNACAAKAIMIQILIAIPC0GI1AFB6/sAQQxBnvcAEAAACxkAIABB5PwJQZTuCSgCABCTASIAEPQJIAAL8gECA38GfCAAIAEoAiwgASgCCCIDIAEoAgQiAUEBayICQQAgASACTxtsQQR0aiICKQMANwMQIAAgAikDCDcDGCAAIAIpAwg3AwggACACKQMANwMAQQEgAyADQQFNGyEDIAArAxghBSAAKwMIIQYgACsDECEHIAArAwAhCEEBIQEDQCABIANGBEAgACAFOQMYIAAgBjkDCCAAIAc5AxAgACAIOQMABSAFIAIgAUEEdGoiBCsDCCIJIAUgCWQbIQUgByAEKwMAIgogByAKZBshByAGIAkgBiAJYxshBiAIIAogCCAKYxshCCABQQFqIQEMAQsLCyoBAX8CQCABRQ0AIAAgARBFIgBFDQAgAC0AAEUNACAAEGhBAXMhAgsgAgtRAQF/AkACQCADRQ0AIANBOhDNASIERQ0AIARBADoAACAAIAIgAyAEQQFqIgMgAREHACAEQTo6AAAMAQsgACACIANBACABEQcACyAAIAM2AiQLXAAgASgCCEUEQCAAIAEQ1QYLIAIgAEGc3QooAgAgASsDAEQAAAAAAADwPxBMOQMAIAIgAEGg3QooAgAgASgCCBCPATYCCCACIABBpN0KKAIAIAEoAgwQjwE2AgwLlwQCCHwIfyMAQUBqIgwkACABKAIAIQ8gAisDCCEGIAIrAwAhByABKAIEIRBE////////738hA0F/IQ1BfyECA0ACQCALIBBGBEAgDyANQTBsaiIBKAIAIAIgAiABKAIEQQFrRmsiASABQQNwa0EEdGohAkEAIQEMAQsgDyALQTBsaiIBKAIEIREgASgCACESQQAhAQNAIAEgEUYEQCALQQFqIQsMAwUgEiABQQR0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dSAGQRBqJAAgBUHomws2AghBhJ0LIAUoAggQogIaQYidC0EBOgAACyAFQRBqJABBjJ0LQYSdCxDcCkGQnQtBAToAAAsgAEGMnQsoAgAiADYCACAAENsKCxEAIABB6JsLRwRAIAAQ3goLCxMAIAAgASgCACIANgIAIAAQ2woLnQEBBH8gAEG4swk2AgAgAEEIaiEBA0AgARDEAiACSwRAIAEgAhCdAygCAARAIAEgAhCdAygCABCRBQsgAkEBaiECDAELCyAAQZABahA1GiMAQRBrIgIkACACQQxqIAEQogIiASgCACIDKAIABEAgAxDfCiABKAIAGiABKAIAEJwDIAEoAgAiASgCACABEL8KGhC+CgsgAkEQaiQAIAALDwAgACAAKAIEQQFqNgIECwwAIAAgACgCABDACgt7AQN/IwBBEGsiBCQAIARBBGoiAiAANgIAIAIgACgCBCIDNgIEIAIgAyABQQJ0ajYCCCACIgMoAgQhASACKAIIIQIDQCABIAJGBEAgAygCACADKAIENgIEIARBEGokAAUgABCcAxogARDBCiADIAFBBGoiATYCBAwBCwsLIAAgAEGIvAk2AgAgACgCCBBmRwRAIAAoAggQmwsLIAALBABBfwumAQEDfyMAQRBrIgQkACMAQSBrIgMkACADQRhqIAAgARDGCiADQRBqIAMoAhggAygCHCACEKsLIAMoAhAhBSMAQRBrIgEkACABIAA2AgwgAUEMaiIAIAUgABD1BmtBAnUQ+wYhACABQRBqJAAgAyAANgIMIAMgAiADKAIUEKQDNgIIIARBCGogA0EMaiADQQhqEPsBIANBIGokACAEKAIMIARBEGokAAuBBgEKfyMAQRBrIhMkACACIAA2AgBBBEEAIAcbIRUgA0GABHEhFgNAIBRBBEYEQCANECVBAUsEQCATIA0Q3gE2AgwgAiATQQxqQQEQ+wYgDRDyAiACKAIAEOMKNgIACyADQbABcSIDQRBHBEAgASADQSBGBH8gAigCAAUgAAs2AgALIBNBEGokAAUCQAJAAkACQAJAAkAgCCAUai0AAA4FAAEDAgQFCyABIAIoAgA2AgAMBAsgASACKAIANgIAIAZBIBDRASEHIAIgAigCACIPQQRqNgIAIA8gBzYCAAwDCyANEPYBDQIgDUEAEJoFKAIAIQcgAiACKAIAIg9BBGo2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QQFqIQUgAUEBaiEBDAELCyADQQA6AAcgBSADQQdqENIBIANBEGokAAwBCxDKAQALCw8AIAAgACgCGCABajYCGAsXACAAIAI2AhwgACABNgIUIAAgATYCGAtXAQJ/AkAgACgCACICRQ0AAn8gAigCGCIDIAIoAhxGBEAgAiABIAIoAgAoAjQRAAAMAQsgAiADQQRqNgIYIAMgATYCACABC0F/EMgCRQ0AIABBADYCAAsLMQEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBBGo2AgwgASgCAAsnAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEoAgALJwEBfwJAIAAoAgAiAkUNACACIAEQvQtBfxDIAkUNACAAQQA2AgALC1MBA38CQEF/IAAoAkwQyAJFBEAgACgCTCEADAELIAAjAEEQayIBJAAgAUEMaiICIAAQUyACEMwBQSAQmwEhACACEFAgAUEQaiQAIAA2AkwLIADACxoAIAAgASABKAIAQQxrKAIAaigCGDYCACAACwsAIABB4JoLEKkCCw0AIAAgASACQQAQogcLCQAgABCSBxAYCz0BAX8gACgCGCICIAAoAhxGBEAgACABEKYDIAAoAgAoAjQRAAAPCyAAIAJBAWo2AhggAiABOgAAIAEQpgMLNAEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBAWo2AgwgASwAABCmAwsqAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEsAAAQpgMLDwAgACAAKAIAKAIYEQIACwgAIAAoAhBFCwQAQX8LLAAgACABEK4HIgFFBEAPCwJAIAMEQCAAIAEgAhCoBAwBCyAAIAEgAhC7CwsLCAAgABCLBxoLvg8CBX8PfiMAQdACayIFJAAgBEL///////8/gyEKIAJC////////P4MhCyACIASFQoCAgICAgICAgH+DIQwgBEIwiKdB//8BcSEIAkACQCACQjCIp0H//wFxIglB//8Ba0GCgH5PBEAgCEH//wFrQYGAfksNAQsgAVAgAkL///////////8AgyINQoCAgICAgMD//wBUIA1CgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhDAwCCyADUCAEQv///////////wCDIgJC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dGpBADYCAAsgDEUEQEEAIQwMAQsgBCAMakEAOgAACyACIQALIAMoAgQgAygCLGusIAMpA3ggFXx8IRUgDiAIQQBHaiEOCyABQQFqIQQgAS0AASIBDQEMCAsLIAIhAAwBC0EBIQVBACEMQQAhAAwCCyAPIQUMAgsgDyEFCyAOQX8gDhshDgsgBUUNASAMEBggABAYDAELQX8hDgsgBkGwAmokACADQZABaiQAIA4LQwACQCAARQ0AAkACQAJAAkAgAUECag4GAAECAgQDBAsgACACPAAADwsgACACPQEADwsgACACPgIADwsgACACNwMACwsPACAAIAEgAkEAQQAQmQcLFQEBfxDtAyEAQQ9B0N0KKAIAIAAbC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRBAALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC28BBX8gACgCACIDLAAAQTBrIgFBCUsEQEEADwsDQEF/IQQgAkHMmbPmAE0EQEF/IAEgAkEKbCIFaiABIAVB/////wdzSxshBAsgACADQQFqIgU2AgAgAywAASAEIQIgBSEDQTBrIgFBCkkNAAsgAgv1EgISfwJ+IwBBQGoiCCQAIAggATYCPCAIQSdqIRYgCEEoaiERAkACQAJAAkADQEEAIQcDQCABIQ0gByAOQf////8Hc0oNAiAHIA5qIQ4CQAJAAkACQCABIgctAAAiCwRAA0ACQAJAIAtB/wFxIgFFBEAgByEBDAELIAFBJUcNASAHIQsDQCALLQABQSVHBEAgCyEBDAILIAdBAWohByALLQACIAtBAmoiASELQSVGDQALCyAHIA1rIgcgDkH/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KQOIAyAWIAJBAE4iARshFiAEKQOAAyAXIAEbIRcgCSAGIAhHIAJBAEhycSAVIBhCAEIAEKgDQQBHcUUgFCABIA1qIg1B7gBqTnENAEH8gAtBxAA2AgALIARB8AJqIBcgFiANENoLIAQpA/gCIRUgBCkD8AILIRYgDiAVNwMoIA4gFjcDICAEQZDGAGokACAOKQMoIRUgDikDICEWDAELQgAhFQsgACAWNwMAIAAgFTcDCCAOQTBqJAALwwYCBH8DfiMAQYABayIFJAACQAJAAkAgAyAEQgBCABCoA0UNAAJ/IARC////////P4MhCgJ/IARCMIinQf//AXEiB0H//wFHBEBBBCAHDQEaQQJBAyADIAqEUBsMAgsgAyAKhFALC0UNACACQjCIpyIIQf//AXEiBkH//wFHDQELIAVBEGogASACIAMgBBBpIAUgBSkDECICIAUpAxgiASACIAEQxQsgBSkDCCECIAUpAwAhBAwBCyABIAJC////////////AIMiCiADIARC////////////AIMiCRCoA0EATARAIAEgCiADIAkQqAMEQCABIQQMAgsgBUHwAGogASACQgBCABBpIAUpA3ghAiAFKQNwIQQMAQsgBEIwiKdB//8BcSEHIAYEfiABBSAFQeAAaiABIApCAEKAgICAgIDAu8AAEGkgBSkDaCIKQjCIp0H4AGshBiAFKQNgCyEEIAdFBEAgBUHQAGogAyAJQgBCgICAgICAwLvAABBpIAUpA1giCUIwiKdB+ABrIQcgBSkDUCEDCyAJQv///////z+DQoCAgICAgMAAhCELIApC////////P4NCgICAgICAwACEIQogBiAHSgRAA0ACfiAKIAt9IAMgBFatfSIJQgBZBEAgCSAEIAN9IgSEUARAIAVBIGogASACQgBCABBpIAUpAyghAiAFKQMgIQQMBQsgCUIBhiAEQj+IhAwBCyAKQgGGIARCP4iECyEKIARCAYYhBCAGQQFrIgYgB0oNAAsgByEGCwJAIAogC30gAyAEVq19IglCAFMEQCAKIQkMAQsgCSAEIAN9IgSEQgBSDQAgBUEwaiABIAJCAEIAEGkgBSkDOCECIAUpAzAhBAwBCyAJQv///////z9YBEADQCAEQj+IIAZBAWshBiAEQgGGIQQgCUIBhoQiCUKAgICAgIDAAFQNAAsLIAhB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QfWrBCADQTBqEDMLIAAgAhAdIQIMAAsACyABQQFqIQdBASEEA0AgACgCECICKAK0ASAETgRAIAIoArgBIARBAnRqKAIAIQUgAQRAIAkgBSgCECICKwMooCEIIAogAisDIKAhCyAJIAIrAxigIQwgCiACKwMQoCENQezaCi0AAEECTwRAIAEQsAIgBRAhIQIgAyAIOQMgIAMgCzkDGCADIAw5AxAgAyANOQMIIAMgAjYCACAGQeOrBCADEDMgBSgCECECCyACIAg5AyggAiALOQMgIAIgDDkDGCACIA05AxALIAUgBxDzCyAEQQFqIQQMAQsLIANB4ABqJAALyhoDD38LfAF+IwBBwARrIgIkACAAKAJIIQpB7NoKLQAAQQJPBEAgARCwAiACIAAQITYCsANBiPYIKAIAQfDwAyACQbADahAgGgsgAUEBaiEJQQEhBANAIAAoAhAiAygCtAEgBEgEQAJAAkAgABA8IAdrIhBBACAAKAIQIgMoArQBayILRw0AIAMoAgwNACADQgA3AxAgA0KAgICAgICAmcAANwMoIANCgICAgICAgJnAADcDICADQgA3AxgMAQsCQAJ/AkAgAEEEQQQgAkGgBGoQ+QNBAk0EQCACQQM2ArAEDAELQQAgAigCsARBBEcNARpBACEJIAItALwEQQJxRQ0CIApBAEHwFkEAECIiCSAKQQFB8BZBABAiIgZyDQIgAiAAECE2AqADQcifAyACQaADahAqC0EACyEGQQAhCQsgAkHoA2pBAEE4EDgaIAJCADcD4AMgAkIANwPYAyACQgA3A9ADIAJCADcDyAMgAkIANwPAAyACQgA3A7gDQQEhBwNAAkAgACgCECIDKAK0ASAHSARAIBBBAEwNASAAEBwhBwNAIAdFDQIgBygCECIDKAKAAUUEQCADIAA2AoABIAJCADcDiAQgAkIANwOABCADKwNgIRIgAysDWCERIAIgAysDUDkDmAQgAiARIBKgOQOQBCACQegDakEgECYhAyACKALoAyADQQV0aiIDIAIpA4AENwMAIAMgAikDmAQ3AxggAyACKQOQBDcDECADIAIpA4gENwMIIAYEQCACIAcgBkEAQQAQYjYCzAMgAkG4A2pBBBAmIQMgAigCuAMgA0ECdGogAigCzAM2AgALIAIgBzYC5AMgAkHQA2pBBBAmIQMgAigC0AMg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EBwhAwNAIAMEQCADKAIQQQA2ArgBIAAgAxAdIQMMAQsLQezaCi0AAEECTwRAIAEoAhAhAyAFIAAQITYC5AEgBSADNgLgAUGI9ggoAgBBjfkDIAVB4AFqECAaCyABIAEoAhBBAWo2AhAgBUG88AkoAgA2AtwBQdKnASAFQdwBakEAEOMBIgpB4iVBmAJBARA2GkE4EFIhAyAKKAIQIAM2AowBIAAQOSEDIAooAhAgAygCEC8BsAE7AbABIAAgCkHa3AAQuQcgACAKQZjbABC5ByAAIApBsNgBELkHIAVBqAJqIQggBUGgAmohDCAFQZgCaiELQQEhDwNAIAAoAhAiAygCtAEgD04EQCADKAK4ASAPQQJ0aigCACIEEJQEIAogBBAhELgHIgYoAhAiAyAJNgKIASADIAQ2AugBAkACQCABKAIEIgdFBEBE////////738hG0T////////v/yEaDAELRP///////+9/IRtE////////7/8hGiAEIAcQRSIDLQAARQ0AIAEoAgAgBEcEQCADIAQoAkQgBxBFEE1FDQELIAVBADoA+AEgBSALNgLEASAFIAw2AsgBIAUgCDYCzAEgBSAFQfgBajYC0AEgBSAFQZACajYCwAEgA0H4vgEgBUHAAWoQUUEETgRAIAUrA6gCIRogBSsDoAIhHSAFKwOYAiEbIAUrA5ACIRxBgNsKKwMAIh5EAAAAAAAAAABkBEAgGyAeoyEbIBwgHqMhHCAdIB6jIR0gGiAeoyEaCyAGKAIQQQNBAkEBIAUtAPgBIgNBP0YbIANBIUYbOgCHAQwCCyAEECEhByAFIAM2ArQBIAUgBzYCsAFBh+sDIAVBsAFqECoLRP///////+//IR1E////////738hHAsgCUEBaiEJIAQQHCEDA0AgAwRAIAMoAhAgBjYCuAEgBCADEB0hAwwBCwsgBigCECIDLQCHAQRAIAMoApQBIgMgGiAboEQAAAAAAADgP6I5AwggAyAdIBygRAAAAAAAAOA/ojkDAAsgD0EBaiEPDAELCyAAEBwhAwJ/AkADQCADBEACQCADKAIQIgQoArgBDQACQCAEKALoASIGRQ0AIAYgACgCECgCjAEoAjBGDQAgAxAhIQEgABAhIQAgBSADKAIQKALoARAhNgKoASAFIAA2AqQBIAUgATYCoAFBiv0EIAVBoAFqEDcM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QRhqCyILKwMIIQggCysDACEHAn8gASgCECIAKAIEIAFGBEAgACgCAAwBCyABQRhqCyIAKwMIIQkgACsDACEKIAJBfyAHIAShIgcgBSADoaIgCCADoSIFIAYgBKGioSIGRAAAAAAAAAAAZCAGRAAAAAAAAAAAYxsiADYCACACQX8gByAJIAOhoiAFIAogBKGioSIDRAAAAAAAAAAAZCADRAAAAAAAAAAAYxsiATYCBCACIAAgAWw2AggLTQECfAJ/QQEgACgCACIAKwMAIgIgASgCACIBKwMAIgNkDQAaQX8gAiADYw0AGkEBIAArAwgiAiABKwMIIgNkDQAaQX9BACACIANjGwsLzg8DEH8KfAF+IwBBsAFrIgIkACABQQAgAUEAShshDyABQSgQGiENA0AgAyAPRkUEQCAAIANBAnRqKAIAKAIEIApqIQogA0EBaiEDDAELCyAKQRgQGiIOQRhrIQYDQCAIIA9HBEAgDSAIQShsaiIEIA4gB0EYbGo2AgAgACAIQQJ0aigCACILKAIEIQxBACEDRP///////+9/IRJE////////7/8hE0T////////v/yEVRP///////+9/IRQDQCADIAxGBEAgBCATOQMgIAQgFTkDGCAEIBI5AxAgBCAUOQMIIAQgBiAHQRhsajYCBCAIQQFqIQgMAwUgCygCACADQQR0aiIFKwMAIRYgBSsDCCEXIA4gB0EYbGoiBUEANgIUIAUgBDYCECAFIBc5AwggBSAWOQMAIANBAWohAyAHQQFqIQcgEyAXECMhEyAVIBYQIyEVIBIgFxApIRIgFCAWECkhFAwBCwALAAsLIAJCADcDiAEgAkIANwOAASACQgA3A3hBACEDIApBBBAaIQwCQANAIAMgCkYEQAJAIAwgCkEEQeADELUBIAJBjAFqIRBBACELA0AgCiALRg0BIAIgDCALQQJ0aiIRKAIAIgM2AnQgAgJ/IAMoAhAiBCgCACADRgRAIAQoAgQMAQsgA0EYawsiBTYCcEEAIQgDQAJAAkAgCEECRwRAAkAgAkH0AGogAkHwAGoQzQxBAWoOAwADAgMLIAVBGGohB0EAIQMDQAJAIAIoAoABIANLBEAgAiACKQOAATcDWCACIAIpA3g3A1AgAigCeCACQdAAaiADEBlBAnRqKAIAIgYgBSACQZQBaiIJEMwMIAIoApwB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dGohBAJAIAZBAkgNACAGQQJrQQF2IgkgBCAFayIAQQJ1SA0AIAUgAEEBdSIBQQFyIgJBAnRqIQAgBiABQQJqIgFKBEAgASACIAAoAgAgACgCBCADKAIMEQAAIgEbIQIgAEEEaiAAIAEbIQALIAAoAgAgBCgCACADKAIMEQAADQAgBCgCACEBA0ACQCAEIAAiBCgCADYCACACIAlKDQAgBSACQQF0IgdBAXIiAkECdGohACAGIAdBAmoiB0oEQCAHIAIgACgCACAAKAIEIAMoAgwRAAAiBxshAiAAQQRqIAAgBxshAAsgACgCACABIAMoAgwRAABFDQELCyAEIAE2AgALIAhBAWshCAwACwALIANBEGokAAtGAgF8An8gACgCBCEDIAAoAgAhAAN8IAAgA0YEfCABBSAAKAIAIgIrAwggAisDGKEgAisDEKIgAaAhASAAQQRqIQAMAQsLC2wCAX8CfCMAQRBrIgIkACACIAE2AgwgASAANgIgIAAgAkEMahDAASAAIAIoAgwiASsDECIDIAArAxigIgQ5AxggACADIAErAwggASsDGKGiIAArAyCgIgM5AyAgACADIASjOQMQIAJBEGokAAsnACAAIAAoAhhFIAAoAhAgAXJyIgE2AhAgACgCFCABcQRAEJEBAAsLMQEDfyAAKAIEIgQgAUEEaiICayEDIAIgBEcEQCABIAIgAxC2ARoLIAAgASADajYCBAt+AQN/IAAoAgAiAUE0aiABKAI4IQMgASgCNCEBA0ACQCABIANGDQAgASgCACAARg0AIAFBBGohAQwBCwsgARC0DSAAKAIEIgFBKGogASgCLCEDIAEoAighAQNAAkAgASADRg0AIAEoAgAgAEYNACABQQRqIQEMAQsLIAEQtA0L6gEBCH8gAEHTrAMQ0QIhAiABKAIAIQYjAEEQayIDJAAgA0EIaiIEIAIQqQUaAkAgBC0AAEUNACACIAIoAgBBDGsoAgBqIgUoAgQaIANBBGoiBCAFEFMgBBC6CyEFIAQQUCADIAIQuQshByACIAIoAgBBDGsoAgBqIggQuAshCSADIAUgBygCACAIIAkgBiAFKAIAKAIQEQgANgIEIAQQpwVFDQAgAiACKAIAQQxrKAIAakEFEKoFCyADQQhqEKgFIANBEGokACACQdjgARDRAiABKAIgKwMQIAErAxigEJEH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EiACQQJ0akF/NgIAIAJBAWohAgwBCwtBhscBQZa3AUGLBkGBDhAAAAtBhscBQZa3AUGkBkGBDhAAAAtBhscBQZa3AUG4BkGBDhAAAAtBh9ABQZa3AUHQBUGBDhAAAAsgFEEQaiQAIA8L2AYCCn8BfCMAQRBrIgokACAAKAIgRQRAAkACQCAAKAIQQQFrIgQOBAEAAAEAC0HU0AFBlrcBQZAFQcg1EAAACyACKAIAIQUgACgCACEDIAAoAhghBiAAKAIUIQcCQAJAAkACQCAEDgQAAgIBAgsgACgCHCEJIAEEQCAFRQRAIANBCBA/IQULQQAhBCADQQAgA0EAShshAwNAIAMgBEYNBCAFIARBA3RqIgtCADcDACAHIARBAnRqKAIAIgAgByAEQQFqIgRBAnRqKAIAIgggACAIShshCEQAAAAAAAAAACENA0AgACAIRgRADAIFIAsgCSAAQQN0aisDACABIAYgAEECdGooAgBBA3RqKwMAoiANoCINOQMAIABBAWohAAwBCwALAAsACyAFRQRAIANBCBA/IQULQQAhASADQQAgA0EAShshBANAIAEgBEYNAyAFIAFBA3RqIgNCADcDACAHIAFBAnRqKAIAIgAgByABQQFqIgFBAnRqKAIAIgYgACAGShshBkQAAAAAAAAAACENA0AgACAGRgRADAIFIAMgCSAAQQN0aisDACANoCINOQMAIABBAWohAAwBCwALAAsACyAAKAIcIQkgAQRAIAVFBEAgA0EIED8hBQtBACEEIANBACADQQBKGyEDA0AgAyAERg0DIAUgBEEDdGoiC0IANwMAIAcgBEECdGooAgAiACAHIARBAWoiBEECdGooAgAiCCAAIAhKGyEIRAAAAAAAAAAAIQ0DQCAAIAhGBEAMAgUgCyAJIABBAnQiDGooAgC3IAEgBiAMaigCAEEDdGorAwCiIA2gIg05AwAgAEEBaiEADAELAAsACwALIAVFBEAgA0EIED8hBQtBACEBIANBACADQQBKGyEEA0AgASAERg0CIAUgAUEDdGoiA0IANwMAIAcgAUECdGooAgAiACAHIAFBAWoiAUECdGooAgAiBiAAIAZKGyEGRAAAAAAAAAAAIQ0DQCAAIAZGBEAMAgUgAyANIAkgAEECdGooAgC3oCINOQMAIABBAWohAAwBCwALAAsACyAKQcMFNgIE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AxggBiAAKALsAUHIAGxqIgEgASsDECAAKwN4ECM5AxALC4kDAgZ/BHwgABBhKAIQKALEASEFIAAQYSAARgR8RAAAAAAAACBABSAAQczbCigCAEEIQQAQYrcLIQkgACgCECIBKwOAASEHIAErA3ghCEEBIQIDQCACIAEoArQBSkUEQCABKAK4ASACQQJ0aigCACIBEO0NIQYgASgCECIEKALsASAAKAIQIgEoAuwBRgRAIAggCSAEKwN4oCIKIAggCmQbIQgLIAQoAugBIAEoAugBRgRAIAcgCSAEKwOAAaAiCiAHIApkGyEHCyADIAZyIQMgAkEBaiECDAELCyAAEGEhAiAAKAIQIQECQCAAIAJGDQAgASgCDEUNACAAEDlBASEDIAAoAhAhASgCEC0AdEEBcQ0AIAcgASsDWKAhByAIIAErAzigIQgLIAEgBzkDgAEgASAIOQN4IAAQYSAARwRAIAUgACgCECIAKALoAUHIAGxqIgEgASsDGCIJIAcgByAJYxs5AxggBSAAKALsAUHIAGxqIgAgACsDECIHIAggByAIZBs5AxALIAMLcAECf0EBIQQDQCAEIAAoAhAiAygCtAFKRQRAIAMoArgBIARBAnRqKAIAIAEgAhDuDSAEQQFqIQQMAQsLIAMgASADKwMQojkDECADIAIgAysDGKI5AxggAyABIAMrAyCiOQMgIAMgAiADKwMoojkDKAvlBAIIfwR8QQEhAgNAIAIgACgCECIDKAK0AUpFBEAgAygCuAEgAkECdGooAgAgARDvDSACQQFqIQIMAQsLIAAQYSECIAAoAhAhAwJAIAAgAkYEQCADKALsASEFRAAAwP///9/BIQpEAADA////30EhCyADKALoASIIIQQDQCAEIAVKBEAgAygCtAEiAEEAIABBAEobQQFqIQBBASECA0AgACACRg0EIAogAygCuAEgAkECdGooAgAoAhAiBCsDIEQAAAAAAAAgQKAiDCAKIAxkGyEKIAsgBCsDEEQAAAAAAAAgwKAiDCALIAxjGyELIAJBAWohAgwACwAFAkAgAygCxAEgBEHIAGxqIgAoAgAiBkUNAEEBIQIgACgCBCIHKAIAIgBFDQADQCAAKAIQIgAtAKwBIglFIAIgBk5yRQRAIAcgAkECdGooAgAhACACQQFqIQIMAQsLIAkNACAGQQJrIQIgACsDECAAKwNYoSEMIAcgBkECdGpBBGshAANAIAAoAgAoAhAiAC0ArAEEQCAHIAJBAnRqIQAgAkEBayECDAELCyAKIAArAxAgACsDYKAiDSAKIA1kGyEKIAsgDCALIAxjGyELCyAEQQFqIQQMAQsACwALIAMoAugBIQggAygC7AEhBSADKAKEAigCECgC9AG3IQogAygCgAIoAhAoAvQBtyELCyABKAIQKALEASIAIAVByABsaigCBCgCACgCECsDGCEMIAAgCEHIAGxqKAIEKAIAKAIQKwMYIQ0gAyAKOQMgIAMgCzkDECADIA0gAysDgAGgOQMoIAMgDCADKwN4oTkDGAuiAQICfAF/AkACf0H/////ByAAQdQgECciA0UNABogABA8IQAgAxCuAiEBIABBAEgNAUEAIAFEAAAAAAAAAABjDQAaIAC4IQIgAUQAAAAAAADwP2QEQEH/////B0QAAMD////fQSABoyACYw0BGgsgASACoiIBmUQAAAAAAADgQWMEQCABqg8LQYCAgIB4Cw8LQc+YA0GH/ABBzQBBztkAEAAAC4gCAgd/AXwjAEEQayIEJAAgAEHM2wooAgBBCEEAEGIgABDtBbchCCAAKAIQIgEoAugBIQMgASgChAIhBSABKAKAAiEGA0AgAyABKALsAUpFBEACQCADQcgAbCIHIAEoAsQBaiICKAIARQ0AIAIoAgQoAgAiAkUEQCAAECEhASAEIAM2AgQgBCABNgIAQdu0BCAEEDcMAQsgBiACIAIoAhArA1ggCKAgASsDYKBBABCfARogACgCECIBKALEASAHaiICKAIEIAIoAgBBAnRqQQRrKAIAIgIgBSACKAIQKwNgIAigIAErA0CgQQAQnwEaCyADQQFqIQMgACgCECEBDAELCyAEQRBqJAAL2wICCn8BfCAAQczbCigCAEEIQQAQYiEHQQEhAQNAIAAoAhAiBSgCtAEiBCABSARAIAe3IQtBASEBA0AgASAESkUEQCABQQJ0IQkgAUEBaiIHIQEDQCAFKAK4ASICIAlqKAIAIQMgASAESkUEQCACIAFBAnRqKAIAIgYgAyADKAIQKALoASAGKAIQKALoAUoiAhsiCCgCECIKKALsASADIAYgAhsiAygCECIGKALoASICTgRAIAggAyACQcgAbCICIAooAsQBaigCBCgCACgCECgC+AEg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P2UNACAAEPENIAAoAhAiASgCgAIgASgChAIgEiARIAEoAnRBAXEbIhFEAAAAAOD/70AgEUQAAAAA4P/vQGMbQegHEJ8BGgsCQCAAQQIgABDwDRDMBEUNACAAKAIQIgIoAugBIQUDQAJAAkAgAigC7AEiCiAFTgRAQQAhCCACKALEASAFQcgAbGoiBygCACIJQQAgCUEAShshA0EAIQEDQCABIANGDQNBACEEAkAgBygCBCABQQJ0aigCACIIKAIQIgsoApACIg1FDQADQCANIARBAnRqKAIAIgZFDQEgBkFQQQAgBigCAEEDcSIMQQJHG2ooAigoAhAoAvQBIAVKDQQgBEEBaiEEIAZBMEEAIAxBA0cbaigCKCgCECgC9AEgBUwNAAsMAwtBACEEAkAgCygCiAIiC0UNAANAIAsgBEECdGooAgAiBkUNASAGQTBBACAGKAIAQQNxIg1BA0cbaigCKCgCECgC9AEgBUoNBCAEQQFqIQQgBSAGQVBBACANQQJHG2ooAigoAhAoAvQBTg0ACwwDCyABQQFqIQEMAAsACyAAQQIgABDwDRDMBEUNA0GImwNBprsBQY0BQbHiABAAAAsgASEDCwJAIAhFIAMgCUhyRQRAIAdBzABBvH8gBSAKSBtqKAIAKAIAIgJFDQEgBygCBCgCACEDIAAQugIiASgCEEECOgCsASABIANEAAAAAAAAAABBABCfARogASACRAAAAAAAAAAAQQAQnwEaIAEoAhAgAygCECgC9AEiASACKAIQKAL0ASICIAEgAkgbNgL0ASAAKAIQIQILIAVBAWohBQwBCwtB0toAQaa7AUH2AEGO+gAQAAALIAAoAhAiASgC7AEhBSABKALoASECIAEoAsQBIQQDQCACIAVMBEBBACEBIAQgAkHIAGxqIgcoAgAiA0EAIANBAEobIQYDQCABIAZHBEAgBygCBCABQQJ0aigCACgCECIDKAL0ASEIIAMgAjYC9AEgAyAItzkDECABQQFqIQEMAQsLIAJBAWohAgwBCwsgACAAEO8NAkAgACgCECIBKALsAUEATA0AIAEoAggiAigCVCIFRQ0AIAErACgiESABKwAYoSIUIAErACAiEiABKwAQoSIVIAEoAnRBAXEiAxshEyAVIBQgAxshFAJAAnwCQAJAAkACQAJAIAVBAWsOBQQABwEDBwsgAisD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IAJB7BxqENAEIQcgAigC7BwhAwwBCyACQegMaiACQewcahDPBCEHIBogAigC7BwiA0EFSXINACAHIAcpAwA3AxAgByAHKQMINwMYIAcgByADQQR0akEQayIDKQMANwMgIAcgAykDCDcDKCADKQMAIWUgByADKQMINwM4IAcgZTcDMCACQQQ2AuwcQQQMAQsgA0UNASADCyEGQQAhAwwBCyAHEBhBACEDA0AgAigCmB0gA00EQCACQZAdaiIDQSAQMSADEDRBACEDA0AgAigC+B0gA00EQCACQfAdaiIDQRAQMSADEDRBACEDA0AgAigC0B0gA00EQCACQcgdaiIDQRAQMSADEDQMCwUgAkHwCWogAkHQHWopAwA3AwAgAiACKQPIHTcD6AkgAkHoCWogAxAZIQUCQAJAIAIoAtgdIgQOAgETAAsgAkHgCWogAigCyB0gBUEEdGoiBSkDCDcDACACIAUpAwA3A9gJIAJB2AlqIAQRAQALIANBAWohAwwBCwALAAUgAkHQCWogAkH4HWopAwA3AwAgAiACKQPwHTcDyAkgAkHICWogAxAZIQUCQAJAIAIoAoAeIgQOAgERAAsgAkHACWogAigC8B0gBUEEdGoiBSkDCDcDACACIAUpAwA3A7gJIAJBuAlqIAQRAQALIANBAWohAwwBCwALAAUgAkGwCWogAkGYHWopAwA3AwAgAiACKQOQHTcDqAkgAkGoCWogAxAZIQUCQAJAIAIoAqAdIgQOAgEPAAsgAkGQCWogAigCkB0gBUEFdGoiBSkDCDcDACACQZgJaiAFKQMQNwMAIAJBoAlqIAUpAxg3AwAgAiAFKQMANwOICSACQYgJaiAEEQEACyADQQFqIQMMAQsACwALA0AgAyAGSQRAIAwgByADQQR0aiIGKQMANwMAIAwgBikDCDcDCCACQfAdakEQECYhBiACKALwHSAGQQR0aiIGIAwpAwA3AwAgBiAMKQMINwMIIANBAWohAyACKALsHCEGDAELCyAHEBggCiEDA0AgCCgCACgCyAEoAgAhBiADBEAgA0EBayEDIAZBUEEAIAYoAgBBA3FBAkcbaigCKEEQaiEIDAELCyACKAL4HSIHBEAgAkHoCmogAkH4HWoiAykDADcDACACIAIpA/AdNwPgCiAMIAIoAvAdIAJB4ApqIAdBAWsQGUEEdGoiBykD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Dg0FIAIoAqwEIQggAigCqAQhCwJAAkACQCAJQQFqDgMAAQIDCyADKAIAIAIgAykCCDcDYCACIAMpAgA3A1ggAkHYAGogABAZQQJ0aigCACADKAIAIAIgAykCCDcDUCACIAMpAgA3A0ggAkHIAGogBRAZQQJ0aigCACAEQQAgBiABELgCIAMoAgAgAkFAayADKQIINwMAIAIgAykCADcDOCACQThqIAAQGUECdGooAgAgAygCACACIAMpAgg3AzAgAiADKQIANwMoIAJBKGogBRAZQQJ0aigCACAHQQEgCyABELgCIAhBAUcNAiADKAIAIAIgAykCCDcDICACIAMpAgA3AxggAkEYaiAFEBlBAnRqKAIAIAMoAgAgAiADKQIINwMQIAIgAykCADcDCCACQQhqIAAQGUECdGooAgAgByABEJcODAILAkACQAJAIAhBAWoOAwABAgQLIAMoAgAgAiADKQIINwOgASACIAMpAgA3A5gBIAJBmAFqIAAQGUECdGooAgAgAygCACACIAMpAgg3A5ABIAIgAykCADcDiAEgAkGIAWogBRAZQQJ0aigCACAEQQAgBiABELgCIAMoAgAgAiADKQIINwOAASACIAMpAgA3A3ggAkH4AGogABAZQQJ0aigCACADKAIAIAIgAykCCDcDcCACIAMpAgA3A2ggAkHoAGogBRAZQQJ0aigCACAHQQEgCyABELgCDAMLIAMoAgAgAiADKQIINwPgASACIAMpAgA3A9gBIAJB2AFqIAUQGUECdGooAgAgAygCACACIAMpAgg3A9ABIAIgAykCADcDyAEgAkHIAWogABAZQQJ0aigCAEEAIAQgBiABELgCIAMoAgAgAiADKQIINwPAASACIAMpAgA3A7gBIAJBuAFqIAUQGUECdGooAgAgAygCACACIAMpAgg3A7ABIAIgAykCADcDqAEgAkGoAWogABAZQQJ0aigCAEEBIAcgCyABELgCDAILIAMoAgAgAiADKQIINwOgAiACIAMpAgA3A5gCIAJBmAJqIAUQGUECdGooAgAgAygCACACIAMpAgg3A5ACIAIgAykCADcDiAIgAkGIAmogABAZQQJ0aigCAEEAIAQgBiABELgCIAMoAgAgAiADKQIINwOAAiACIAMpAgA3A/gBIAJB+AFqIAUQGUECdGooAgAgAygCACACIAMpAgg3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QbgCakEEECYhCiAEKAK4AiAKQQJ0aiAEKALMAjYCACACKAIAIAE2AhggCSACQQggCSgCABEDACECDAELCyAIIARB0AJqQYAEIAgoAgARAwAhAgNAAkAgASsDQCEbIAJFDQAgAisDECAbY0UNACAEIAIoAgA2AswCIARBuAJqQQQQJiEKIAQoArgCIApBAnRqIAQoAswCNgIAIAIoAgAgATYCGCAIIAJBCCAIKAIAEQMAIQIMAQsLIAQgGzkD2AIgCSAEQdACakGABCAJKAIAEQMAIQIDQAJAIAErAzghGyACRQ0AIAIrAwggG2NFDQAgBCACKAIANgLMAiAEQbgCakEEECYhCiAEKAK4AiAKQQJ0aiAEKALMAjYCACACKAIAIAE2AhQgCSACQQggCSgCABEDACECDAELCyAEIBs5A9ACIAQgASsDMDkD2AIgCCAEQdACakGABCAIKAIAEQMAIQIDQAJAIAJFDQAgAisDECABKwNAY0UNACAEIAIoAgA2AswCIARBuAJqQQQQJiEKIAQoArgCIApBAnRqIAQoAswCNgIAIAIoAgAgATYCFCAIIAJBCCAIKAIAEQMAIQIMAQsLIARBuAJqIAFBJGogAUEgakEEEMcBIAEoAiAiASAMIAEgDEsbIQwgBkEBaiEGDAELCwNAIBAgEUYEQCAAKAIQIAAoAgAiAUEobGoiAyABNgIgIAMgAUEBajYCSEEAIQMgACgCAEEGbCAMQQF0akEEEBohAiAAIAAoAgBBA2wgDGpBGBAaNgIUIAAoAgAiBkEAIAZBAEobIQEDQCABIANGBEAgBkECaiEDA0AgASADSARAIAAoAhAgAUEobGogAjYCHCABQQFqIQEgAiAMQQJ0aiECDAELCwUgACgCECADQShsaiACNgIcIANBAWohAyACQRhqIQIMAQsLQQAhBgJAAkADQCAGIA9GBEACQCAIEJkBGiAJEJkBGiALEBhBACEBQYj2CCgCACECA0AgASAAKAIATg0BIAAoAhAgAUEobGoiAygCFEUEQCAEIAE2AhAgAkH4zAQgBEEQahAgGiADKAIURQ0FCyADKAIYRQRAIAQgATYCACACQeLMBCAEECAaIAMoAhhFDQYLIAFBAWohAQwACwALBSASIAZByABsaiIBKwM4IAErAyihIhsgASsDQCABKwMwoSIfoEQAAAAAAADg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EmogBhAZQcgAbGogBTYCKAsgAigCACEGIARBkBJqIAIpAgg3AwAgBCACKQIANwOIEgJAIAYgBEGIEmogBRAZQcgAbGooAjQiBkEBa0F9Sw0AIAIoAgAgBEGAEmogAikCCDcDACAEIAIpAgA3A/gRIARB+BFqIAYQGUHIAGxqKAIsIAlHDQAgAigCACAEQfARaiACKQIINwMAIAQgAikCADcD6BEgBEHoEWogBhAZQcgAbGogBTYCLAsgAxDvASEHIAMQ7wEhCiACKAIAIARB4BFqIAIpAgg3AwAgBCACKQIANwPYESAEQdgRaiAJEBlByABsaigCOCEGIAMoAgAgBEHQEWogAykCCDcDACAEIAMpAgA3A8gRIARByBFqIAYQGUEobGpBAjYCACADKAIAIARBwBFqIAMpAgg3AwAgBCADKQIANwO4ESAEQbgRaiAGEBlBKGxqIg4gCCkDADcDCCAOIAgpAwg3AxAgAygCACAEQbARaiADKQIINwMAIAQgAykCADcDqBEgBEGoEWogBhAZQShsaiAANgIEIAMoAgAgBEGgEWogAykCCDcDACAEIAMpAgA3A5gRIARBmBFqIAYQGUEobGogCjYCICADKAIAIARBkBFqIAMpAgg3AwAgBCADKQIANwOIESAEQYgRaiAGEBlBKGxqIAc2AiQgAygCACAEQYARaiADKQIINwMAIAQgAykCADcD+BAgBEH4EGogBxAZQShsakEDNgIAIAMoAgAgBEHwEGogAykCCDcDACAEIAMpAgA3A+gQIARB6BBqIAcQGUEobGogCTYCGCADKAIAIARB4BBqIAMpAgg3AwAgBCADKQIANwPYECAEQdgQaiAHEBlBKGxqIAY2AhwgAygCACAEQdAQaiADKQIINwMAIAQgAykCADcDyBAgBEHIEGogChAZQShsakEDNgIAIAMoAgAgBEHAEGogAykCCDcDACAEIAMpAgA3A7gQIARBuBBqIAoQGUEobGogBTYCGCADKAIAIARBsBBqIAMpAgg3AwAgBCADKQIANwOoECAEQagQaiAKEBlBKGxqIAY2AhwgAigCACAEQaAQaiACKQIINwMAIAQgAikCADcDmBAgBEGYEGogCRAZQcgAbGogBzYCOCACKAIAIARBkBBqIAIpAgg3AwAgBCACKQIANwOIECAEQYgQaiAFEBlByABsaiAK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IAIoAgAgBEGIDGogAikCCDcDACAEIAIpAgA3A4AMIARBgAxqIAkQGUHIAGxqKwMYoZlESK+8mvLXej5lRSALRXINAAJAIBMoAgAiBUEATA0AIAUgASAHEMcERQ0AIAIoAgAhBSAEQbgLaiACKQIINwMAIAQgAikCADcDsAsgBSAEQbALaiAIEBlByABsaigCMCEHIARBqAtqIAIpAgg3AwAgBCACKQIANwOgCyAFIARBoAtqIAcQGUHIAGxqIAg2AiggAigCACAEQZgLaiACKQIINwMAIAQgAikCADcDkAsgBEGQC2ogBhAZQcgAbGpBfzYCMCACKAIAIARBiAtqIAIpAgg3AwAgBCACKQIANwOACyAEQYALaiAGEBlByABsakF/NgI0DAILIAIoAgAhBSAEQfgLaiACKQIINwMAIAQgAikCADcD8AsgBSAEQfALaiAGEBlByABsaigCMCEHIARB6AtqIAIpAgg3AwAgBCACKQIANwPgCyAFIARB4AtqIAcQGUHIAGxqIAY2AiwgAigCACAEQdgLaiACKQIINwMAIAQgAikCADcD0AsgBEHQC2ogCBAZQcgAbGpBfzYCMCACKAIAIARByAtqIAIpAgg3AwAgBCACKQIANwPACyAEQcALaiAIEBlByABsakF/NgI0DAELIAIoAgAhBSAEQfgKaiACKQIINwMAIAQgAikCADcD8AogBSAEQfAKaiAIEBlByABsaigCMCEHIARB6ApqIAIpAgg3AwAgBCACKQIANwPgCgJAIAUgBEHgCmogBxAZQcgAbGooAihBAWtBfUsNACACKAIAIQUgBEHYCmogAikCCDcDACAEIAIpAgA3A9AKIAUgBEHQCmogCBAZQcgAbGooAjAhByAEQcgKaiACKQIINwMAIAQgAikCADcDwAogBSAEQcAKaiAHEBlByABsaigCLEEBa0F9Sw0AIAIoAgAhBSAEQbgKaiACKQIINwMAIAQgAikCADcDsAogBSAEQbAKaiAIEBlByABsaigCMCEHIARBqApqIAIpAgg3AwAgBCACKQIANwOgCiAFIARBoApqIAcQGUHIAGxqKAIoIQcgAigCACEFIARBmApqIAIpAgg3AwAgBCACKQIANwOQCiAFIARBkApqIAgQGUHIAGxqKAIwIQogBEGICmogAikCCDcDACAEIAIpAgA3A4AKIAUg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aCAEIAIpAgA3A2AgBSAEQeAAaiAHEBlByABsaiAGNgIoIAIoAgAhBSAEIAIpAgg3A1ggBCACKQIANwNQIAUgBEHQAGogCBAZQcgAbGooAjQhByAEIAIpAgg3A0ggBCACKQIANwNAIAUgBEFAayAHEBlByABsakF/NgIsIAIoAgAgBCACKQIINwM4IAQgAikCADcDMCAEQTBqIAgQGUHIAGxqQX82AjQgAigCACAEIAIpAgg3AyggBCACKQIANwMgIARBIGogCBAZQcgAbGpBMGoMAQsgB0F/NgIsIAIoAgAhBSAEIAIpAgg3A/gBIAQgAikCADcD8AEgBSAEQfABaiAIEBlByABsaigCNCEHIAQgAikCCDcD6AEgBCACKQIANwPgASAFIARB4AFqIAcQGUHIAGxqIAg2AiggAigCACEFIAQgAikCCDcD2AEgBCACKQIANwPQASAFIARB0AFqIAgQGUHIAGxqKAI0IQcgBCACKQIINwPIASAEIAIpAgA3A8ABIAUgBEHAAWogBxAZQcgAbGogBjYCLCACKAIAIAQgAikCCDcDuAEgBCACKQIANwOwASAEQbABaiAIEBlByABsaigCNCEFIAIoAgAgBCACKQIINwOoASAEIAIpAgA3A6ABIARBoAFqIAYQGUHIAGxqIAU2AjAgAigCACAEIAIpAgg3A5gBIAQgAikCADcDkAEgBEGQAWogBhAZQcgAbGpBfzYCNCACKAIAIAQgAikCCDcDiAEgBCACKQIANwOAASAEQYABaiAIEBlByABsakE0agsoAgAhBSACKAIAIAQgAikCCDcDGCAEIAIpAgA3AxAgBEEQaiAIEBlByABsaiAANgIEIAIoAgAgBCACKQIINwMIIAQgAikCADcDACAEIAYQGUHIAGxqIAA2AgAMAAsAC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALySADEH8CfAJ+IwBBkAlrIgQkACAEQaAIaiIJQQBBwAAQOBogAEEAQeAAEDgiBUHIABAmIQAgBSgCACAAQcgAbGogBUEYakHIABAfGiADKAIAIRMgCRDvASEJIARBmAhqIARBqAhqIgApAwA3AwAgBCAEKQOgCDcDkAggBCgCoAggBEGQCGogCRAZQShsakECNgIAIARBiAhqIAApAwA3AwAgBCAEKQOgCDcDgAggBCgCoAggBEGACGog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AiACKAIAQQNxIQMLIAIgBiADQQNGGygCKCAFRw0CQZDdCigCACIDRQ0CIAIgAxBFIgMtAABFDQIgAUGwAmogAiADEMAODAILA0ACQCADIARPBEAgAUHgAmpBHBAxQQAhA0EAIQIDQCACIAEoArgCIgRPDQIgASABKQK4AjcD+AEgASABKQKwAjcD8AEgASgCsAIgAUHwAWogAhAZQRxsaigADEECTwRAIAEgASkCuAI3A+gBIAEgASkCsAI3A+ABIAEgASgCsAIgAUHgAWogAhAZQRxsaiIEKQIUNwPYASABIAQpAgw3A9ABIAEgBCkCBDcDyAEgBSABQcgBahDBDgsgAkEBaiECDAALAAsgASABKQLoAjcDwAEgASABKQLgAjcDuAEgAUG4AWogAxAZIQICQAJAIAEoAvACIgQOAgEJAAsgASABKALgAiACQRxsaiICKQIINwOgASABIAIpAhA3A6gBIAEgAigCGDYCsAEgASACKQIANwOYASABQZgBaiAEEQEACyADQQFqIQMgASgC6AIhBAwBCwsDQCADIARPBEAgAUGwAmpBHBAxIAAgBRAdIQUMBQUgASABKQK4AjcDqAIgASABKQKwAjcDoAIgAUGgAmogAxAZIQICQAJAIAEoAsACIgQOAgEJAAsgASABKAKwAiACQRxsaiICKQIINwOIAiABIAIpAhA3A5ACIAEgAigCGDYCmAIgASACKQIANwOAAiABQYACaiAEEQEACyADQQFqIQMgASgCuAIhBAwBCwALAAsgAUHgAmogAiADEMAOCyAAIAIgBRByIQIMAAsACwALIAFBkANqJAAPC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALHAEBf0EBIQIgACABENIOBH9BAQUgACABENEOCwtAAQJ/AkAgASAAKAIATw0AIAIgACgCBCIETw0AIAAoAgggASAEbCACaiIAQQN2ai0AACAAQQdxdkEBcSEDCyADC84CAQp/AkACQCAABEAgACgCACIFIAFLIAAoAgQiBCACS3FFBEAgBCACQQFqIgMgAyAESRsiBCAFIAFBAWoiAyADIAVJGyIFbCIDQQN2IANBB3FBAEdqEMYDIQcgACgCACEIA0AgBiAIRwRAIAQgBmwhCSAAKAIEIQpBACEDA0AgAyAKRgRAIAZBAWohBgwDCyAAIAYgAxDEDgRAIAcgAyAJaiILQQN2aiIMIAwtAABBASALQQdxdHI6AAALIANBAWohAwwACwALCyAAKAIIEBggACAHNgIIIAAgBDYCBCAAIAU2AgALIAEgBU8NASACIARPDQIgACgCCCABIARsIAJqIgBBA3ZqIgEgAS0AAEEBIABBB3F0cjoAAA8LQcbVAUGbuQFByQBB7CEQAAALQYwmQZu5AUHmAEHsIRAAAAtBwyxBm7kBQecAQewhEAAAC0wBAX8DQCAAIgEoAhAoAngiAA0ACyABQTBBACABKAIAQQNxIgBBA0cbaigCKCgCECgC6AEgAUFQQQAgAEECRxtqKAIoKAIQKALoAUcLqgIBB38jAEEQayIEJAAgACgCACIDKAIQIQUgAygCCCEGIAIEQBCiDgsgBUEYaiICIQADQCAAKAIAIgAEQCAAKAIIRQRAEKIOCyAAQQxqIQAMAQsLIAFBggJrIgFBA0kEQCADIAEQowggAiEAA0AgACgCACIABEACQCAAKAIAQYsCRg0AAkAgACgCBCIDLQAVBEAgBSgCACAGRg0BCyAAKAIIEHYgACgCCCEDIAUoAgAhByAAKAIEKAIIIQgEQCAHIAEgCCADEOcDIQMMAQsgByABIAggAxAiIQMLIAUoAgAgBkcNACADQQE6ABYLIABBDGohAAwBCwsgBiACELkCIARBEGokAA8LIARB9gI2AgQgBEHcETYCAEGI9ggoAgBB2L8EIAQQIBoQOwALzwQBB38jAEEgayIEJAACQAJAAkACQAJAIAFBUEEAIAEoAgBBA3EiBUECRxtqKAIoIgYoAhAoAtABIgdFDQAgAUEwQQAgBUEDRxtqIQgDQCAHIANBAnRqKAIAIgJFDQEgA0EBaiEDIAJBUEEAIAIoAgBBA3FBAkcbaigCKCAIKAIoRw0ACyABIAIQjAMCQCACKAIQIgAtAHBBBEcNACAAKAJ4DQAgACABNgJ4CyABIAFBMGoiACABKAIAQQNxQQNGGygCKCgCECIDKALkASICQQFqIgVB/////wNPDQIgAkECaiICQYCAgIAETw0DIAMoAuABIQMCQCACRQRAIAMQGEEAIQIMAQsgAyACQQJ0IgMQaiICRQ0FIAMgBUECdCIFTQ0AIAIgBWpBADYAAAsgASAAIAEoAgBBA3FBA0YbKAIoKAIQIAI2AuABIAEgACABKAIAQQNxQQNGGygCKCgCECICIAIoAuQBIgNBAWo2AuQBIAIoAuABIANBAnRqIAE2AgAgASAAIAEoAgBBA3FBA0YbKAIoKAIQIgAoAuABIAAoAuQBQQJ0akEANgIADAELIAYgAUEwQQAgBUEDRxtqKAIoIAEQqAgiAigCECIDQQRBAyABKAIQIgEtAHBBBEYbOgBwIAMgASgCYDYCYCAAIAIQ+wULIARBIGokAA8LQY7AA0HS/ABBzQBBvbMBEAAACyAEQQQ2AgQgBCACNgIAQYj2CCgCAEGm6gMgBBAgGhAvAAsgBCADNgIQQYj2CCgCAEH16QMgBEEQahAgGhAvAAu8AQEDfyABKAIQIgRBATYCsAECQCAEKALUAUUNAANAIAQoAtABIAVBAnRqKAIAIgZFDQECQCAAIAYQ+QVFDQAgBkFQQQAgBigCAEEDcUECRxtqKAIoIgQoAhAoArABDQAgACAEIAIgAxDJDgsgBUEBaiEFIAEoAhAhBAwACwALIAMgBCgC9AFHBEBB1TtBm7kBQbYKQck5EAAACyACIAE2AhQgAkEEECYhACACKAIAIABBAnRqIAIoAhQ2AgALjQMBB38gACgCECgCxAEgASgCECICKAL0AUHIAGxqKAJAIQYgAkEBOgC0ASACQQE2ArABIAAQYSEFAkAgASgCECIDKALQASICRQ0AIAUoAhAoArQBQQBMIQcDQCACIARBAnRqKAIAIgJFDQECQCAHRQRAIAAgAkEwQQAgAigCAEEDcUEDRxtqKAIoEKkBRQ0BIAAgAkFQQQAgAigCAEEDcUECRxtqKAIoEKkBRQ0BCyACKAIQKAKcAUUNACACIAJBMGsiCCACKAIAQQNxIgNBAkYbKAIoKAIQIgUtALQBBEAgBiAFKAKsAiACQTBBACADQQNHG2ooAigoAhAoAqwCEMUOIAIQpgggBEEBayEEIAIoAhAtAHBBBEYNASAAIAIQyA4MAQsgBiACQTBBACADQQNHG2ooAigoAhAoAqwCIAUoAqwCEMUOIAIgCCACKAIAQQNxQQJGGygCKCICKAIQKAKwAQ0AIAAgAhDKDgsgBEEBaiEEIAEoAhAiAygC0AEhAgwACwALIANBADoAtAELJQEBfyAAEBwhAgNAIAIEQCAAIAIgARCUCCAAIAIQHSECDAELCwvQAQEHfyABKAIQKALIASECA0AgAigCACIBBEAgAUFQQQAgASgCAEEDcUECRxtqKAIoKAIQKAL4ASEFIAAoAhAoAsgBIQQgASgCECIGLgGaASEHA0AgBCgCACIBBEACQAJAIAUgAUFQQQAgASgCAEEDcUECRxtqKAIoKAIQKAL4ASIISARAIAEoAhAhAQwBCyAFIAhHDQEgASgCECIBKwM4IAYrAzhkRQ0BCyABLgGaASAHbCADaiEDCyAEQQRqIQQMAQsLIAJBBGohAgwBCwsgAwvSAQIFfwJ+IAEoAhAoAsABIQIDQCACKAIAIgEEQCABQTBBACABKAIAQQNxQQNHG2ooAigoAhAoAvgBIQQgACgCECgCwAEhAyABKAIQIgUyAZoBIQgDQCADKAIAIgEEQAJAAkAgBCABQTBBACABKAIAQQNxQQNHG2ooAigoAhAoAvgBIgZIBEAgASgCECEBDAELIAQgBkcNASABKAIQIgErAxAgBSsDEGRFDQELIAEyAZoBIAh+IAd8IQcLIANBBGohAwwBCwsgAkEEaiECDAELCyAHC+ACAQh/IAAoAgAhBSABQQBMIQlBACEBA0AgBSABQQJ0aigCACIEBEAgBEEoaiEIIAEhAAJAIAlFBEADQCAFIABBAWoiAEECdGooAgAiAkUNAiACKAIQIgYrAxAgBCgCECIHKwMQoSACQVBBACACKAIAQQNxQQJHG2ooAigoAhAoAvgBIAhBUEEAIAQoAgBBA3FBAkcbaigCACgCECgC+AFrt6JEAAAAAAAAAABjRQ0AIAYuAZoBIAcuAZoBbCADaiEDDAALAAsDQCAFIABBAWoiAEECdGooAgAiAkUNASACKAIQIgYrAzggBCgCECIHKwM4oSACQTBBACACKAIAQQNxQQNHG2ooAigoAhAoAvgBIAhBMEEAIAQoAgBBA3FBA0cbaigCACgCECgC+AFrt6JEAAAAAAAAAABjRQ0AIAYuAZoBIAcuAZoBbCADaiEDDAALAAsgAUEBaiEBDAELCyADC6UCAQN/AkAgAkUEQANAIAMgASgCECICKALMAU8NAiACKALIASADQQJ0aigCACICIAJBMGsiBCACKAIAQQNxQQJGGygCKCgCECIFKAKwAUUEQCAFQQE2ArABIAAgAiAEIAIoAgBBA3FBAkYbKAIoNgIUIABBBBAmIQIgACgCACACQQJ0aiAAKAIUNgIACyADQQFqIQMMAAsACwNAIAMgASgCECICKALEAU8NASACKALAASADQQJ0aigCACICIAJBMGoiBCACKAIAQQNxQQNGGygCKCgCECIFKAKwAUUEQCAFQQE2ArABIAAgAiAEIAIoAgBBA3FBA0YbKAIoNgIUIABBBBAmIQIgACgCACACQQJ0aiAAKAIUNgIACyADQQFqIQMMAAsACwufBAEGfyMAQfAAayICJAAgASgCECgC9AEiA0HIAGwiBSAAKAIQKALEAWoiBCgCACEGAkACfwJAIAQoAghBAEwEQCAAECEhACABECEhASACIAY2AhAgAiADNgIMIAIgATYCCCACIAA2AgQgAkGSCTYCAEGd3gQgAhA3DAELIAQoAgQgBkECdGogATYCACABKAIQIAY2AvgBIAAoAhAiBCgCxAEgBWoiACAAKAIAIgVBAWo2AgAgBSAAKAIITg0CIANByABsIgVB6P0KKAIAKAIQKALEAWooAggiByAGSARAIAEQISEAIAEoAhAoAvgBIQEgAkHo/QooAgAoAhAoAsQBIAVqKAIINgIwIAJBpgk2AiAgAiAANgIkIAIgATYCKCACIAM2AixB7MoEIAJBIGoQNwwBCyAEKALsASEFIAQoAugBIgQgA0wgAyAFTHFFBEAgAiAFNgJMIAIgBDYCSCACIAM2AkQgAkGrCTYCQEGlzAQgAkFAaxA3DAELQQAgACgCBCAGQQJ0aiAAKAIMIAdBAnRqTQ0BGiABECEhAEHo/QooAgAoAhAoAsQBIANByABsaigCCCEGIAEoAhAoAvgBIQEgAiADNgJgIAIgAzYCZCACIAY2AmggAkGxCTYCUCACIAM2AlQgAiAANgJYIAIgATYCXEG1ywQgAkHQAGoQNwtBfwsgAkHwAGokAA8LQaDqAEGbuQFBmQlBivQAEAAAC2IBAn8CfwJAIAEoAhAiAS0ArAFBAUcNACABKALEAUEBRw0AIAEoAswBQQFHDQAgASgCyAEhAQNAIAEoAgAiAigCECIDQfgAaiEBIAMtAHANAAtBASAAIAIQqQENARoLQQALCx0BAX8gASgCEC0ArAEEf0EABSAAIAEQqQFBAEcLC9wBAQN/IAJBAE4hBSABIQMDQCABIQQCQAJAAn8gBUUEQCADKAIQIgMoAvgBIgFBAEwNAkHo/QooAgAoAhAoAsQBIAMoAvQBQcgAbGooAgQgAUECdGpBBGsMAQtB6P0KKAIAKAIQKALEASADKAIQIgEoAvQBQcgAbGooAgQgASgC+AEiAUECdGpBBGoLKAIAIgNFDQAgAygCECgC+AEgAWsgAmxBAEoNAUH2lQNBm7kBQfIGQZI3EAAACyAEDwsgAyEBIAAgAxDSDg0AIAMgBCAAIAMQ0Q4bIQEMAAsACz0BAn8gABDVDkEBIQEDQCABIAAoAhAiAigCtAFKRQRAIAIoArgBIAFBAnRqKAIAENQOIAFBAWohAQwBCwsLXgECfwJAIAAoAhAiASgCjAJFDQAgASgC6AEhAgNAIAIgASgC7AFKDQEgASgCjAIgAkECdGogASgCxAEgAkHIAGxqKAIEKAIANgIAIAJBAWohAiAAKAIQIQEMAAsACwvEAQEEfyACKAIQIgYoAugBIQMgASgCECIEKALoASEFAkACQAJAQeT9Ci0AAEUEQCAFRSADRXIgAyAFRnINASAELQC1AUEHRgRAIAQtAKwBQQFGDQQLIAYtALUBQQdHDQIgBi0ArAFBAUYNAwwCCyADIAVHDQELIAAoAhAiACgCxAEgBCgC9AFByABsaigCQCIDRQ0BIAMgAiABIAAoAnRBAXEiABsoAhAoAqwCIAEgAiAAGygCECgCrAIQxA4PC0EBDwtBAAuBAgIJfwF8IAAoAhAiASgC7AEhBSABKALoASIDIQIDQCACIAVKBEADQAJAIAMgBUoNACADQcgAbCICQej9CigCACgCECgCxAFqQQA6ADEgASgCxAEgAmoiASgCBCABKAIAQQRBpQMQtQEgA0EBaiEDIAAoAhAiASgC7AEhBQwBCwsFQQAhBCABKALEASACQcgAbGoiBygCACIGQQAgBkEAShshCANAIAQgCEZFBEACfyAHKAIEIARBAnRqKAIAKAIQIgkrAxAiCplEAAAAAAAA4EFjBEAgCqoMAQtBgICAgHgLIQYgCSAGNgL4ASAEQQFqIQQMAQsLIAJBAWohAgwBCwsLvwEBA38gACgCEEEYaiEAAkACQANAIAAoAgAiAARAAkACQCAAKAIAIgJBigJGBEAgACgCBEUNAiAAKAIIEHYgACgCCCECIAAoAgQhA0UNASABIAMgAhCoBAwCCyABLQAAQQJxRQ0EIAJBiwJHDQUgACgCBBChCA0BQcCgA0HcEUHVAkGDKRAAAAsgASADIAIQcQsgAEEMaiEADAELCw8LQdrbAUHcEUHTAkGDKRAAAAtBpOwAQdwRQdQCQYMpEAAAC7gJAQ1/IwBB0ABrIgIkACACQgA3A0ggAkFAayINQgA3AwAgAkIANwM4IAAoAhAiBC0A8AFBAUYEQCAEKALoASEJA0AgBCgC7AEgCUgEQANAIAIoAkAgCk0EQCACQThqIgBBBBAxIAAQNAUgAiACQUBrKQMANwMQIAIgAikDODcDCCACQQhqIAoQGSEAAkACQAJAIAIoAkgiAQ4CAgABCyACKAI4IABBAnRqKAIAEBgMAQsgAigCOCAAQQJ0aigCACABEQEACyAKQQFqIQoMAQsLBQJAIAlByABsIgggBCgCxAFqIgUoAgAiAUUNAEEAIQMgAUEAIAFBAEobIQQgBSgCBCIFKAIAKAIQKAL4ASEMQQAhAQNAIAEgBEZFBEAgBSABQQJ0aigCACgCEEEANgKwASABQQFqIQEMAQsLA0AgAigCQCADTQRAIAJBOGpBBBAxQQAhBQNAIAAoAhAiBCgCxAEgCGoiASgCACIDIAVKBEAgASgCBCIBIAVBAnRqIAEgA0ECdGogBUF/c0ECdGogBC0AdEEBcRsoAgAhBEEAIQZBACEBQQAhBwNAIAQoAhAiAygC3AEgAU0EQEEAIQEDQCADKALUASABTQRAAkAgBiAHckUEQCACIAQ2AkwgAkE4akEEECYhASACKAI4IAFBAnRqIAIoAkw2AgAMAQsgAygCsAEgB3INACAAIAQgAkE4aiAJEMkOCyAFQQFqIQUMBQUgACADKALQASABQQJ0aigCABD5BSAGaiEGIAQoAhAhAyABQQFqIQEMAQsACwAFIAAgAygC2AEgAUECdGooAgAQ+QUgB2ohByABQQFqIQEMAQsACwALCwJAAkAgAigCQEUNACAELQB0QQFxRQRAIAJBOGoQiAsLQQAhC0EAIQMDQCADIAAoAhAiBCgCxAEiBiAIaigCACIHTkUEQCACIA0pAwA3AzAgAiACKQM4NwMoIAIoAjghASACQShqIAMQGSEEIAAoAhAoAsQBIAhqKAIEIANBAnRqIAEgBEECdGooAgAiATYCACABKAIQIAMgDGo2AvgBIANBAWohAwwBCwsDQCAHIAtMDQFBACEBIAYgCGooAgQgC0ECdGooAgAiDCgCECgC0AEiBQRAA0ACQCAAKAIQIQQgBSABQQJ0aigCACIDRQ0AIANBMEEAIAMoAgBBA3EiBkEDRxtqKAIoKAIQKAL4ASEHIANBUEEAIAZBAkcbaigCKCgCECgC+AEhBgJAAkAgBC0AdEEBcUUEQCAGIAdIDQEMAgsgBiAHTA0BCyAAIAMQ+QUNBiADEKYIIAAgAxDIDiABQQFrIQEgDCgCECgC0AEhBQsgAUEBaiEBDAELCyAEKALEASIGIAhqKAIAIQcLIAtBAWohCwwACwALQej9CigCACgCECgCxAEgCGpBADoAMQwDC0GFpwNBm7kBQfEKQdM5EAAABSACIA0pAwA3AyAgAiACKQM4NwMYIAJBGGogAxAZIQECQAJAAkAgAigCSCIEDgICAAELIAIoAjggAUECdGooAgAQGAwBCyACKAI4IAFBAnRqKAIAIAQRAQALIANBAWohAwwBCwALAAsgCUEBaiEJDAELCwsgAkHQAGokAAvAAgEHfyAAKAIQIgMoAugBIQUDQEEAIQJBACEBIAUgAygC7AFKRQRAA0AgAiAFQcgAbCIHIAMoAsQBaiIEKAIAIgZORQRAIAQoAgQgAkECdGooAgAoAhAiBCACNgKsAiAEQQA6ALQBIARBADYCsAECfyAEKALUASIERSABckEBcQRAIARBAEcgAXIMAQtBDBDGAyIBIAYgBmwiA0EDdiADQQVxQQBHahDGAzYCCCABIAY2AgQgASAGNgIAIAAoAhAiAygCxAEgB2ogATYCQEEBCyEBIAJBAWohAgwBCwtBACECAkAgAUEBcUUNAANAIAIgAygCxAEgB2oiASgCAE4NASABKAIEIAJBAnRqKAIAIgEoAhAoArABRQRAIAAgARDKDiAAKAIQIQMLIAJBAWohAgwACwALIAVBAWohBQwBCwsLpQkBC38jAEHQAGsiAyQAIANCADcDSCADQUBrQgA3AwAgA0IANwM4IAAoAhAiBEHAAWohAgNAIAIoAgAiAgRAIAIoAhAiAkEANgKwASACQbgBaiECDAELCyAEKALsASEFIAQoAugBIQIDQCACIAVMBEAgBCgCxAEgAkHIAGxqQQA2AgAgAkEBaiECDAELCyAAEDkhAiAAKAIQKALAASEEAkAgACACRiIFBEAgBCECDAELA0AgBCICKAIQKAK4ASIEDQALC0HIAUHAASABGyEIQbgBQbwBIAUbIQkgA0HMAGohCgJAA0AgAgRAAkAgAigCECIEIAhqKAIAKAIADQAgBCgCsAENACAEQQE2ArABIAMgAjYCTCADQThqQQQQJiEEIAMoAjggBEECdGogAygCTDYCAANAIAMoAkBFDQEgA0E4aiAKEKEEIAMoAkwiBSgCEC0AtQFBB0cEQCAAIAUQ0A4EQEEAIQIDQCADKAJAIAJNBEBBfyEEDAgFIAMgA0FAaykDADcDMCADIAMpAzg3AyggA0EoaiACEBkhAAJAAkACQCADKAJIIgEOAgIAAQsgAygCOCAAQQJ0aigCABAYDAELIAMoAjggAEECdGooAgAgAREBAAsgAkEBaiECDAELAAsACyADQThqIAUgARDPDgwBCyADQThqIQtBACEEAkAgAUEBaiIMIAUoAhAoAugBIgYoAhAiBSwAkQJGDQAgBSgC6AEhBQNAIAYoAhAiBCgC7AEiByAFTgRAIAVBAnQhByAFQQFqIQUgACAHIAQoAowCaigCABDQDiIERQ0BDAILCyAEKALoASEFA0AgBSAHTARAIAsgBCgCjAIgBUECdGooAgAgARDPDiAFQQFqIQUgBigCECIEKALsASEHDAELCyAEIAw6AJECQQAhBAsgBEUNAAtBACECA0AgAiADKAJATw0EIAMgA0FAaykDADcDICADIAMpAzg3AxggA0EYaiACEBkhAAJAAkACQCADKAJIIgEOAgIAAQsgAygCOCAAQQJ0aigCABAYDAELIAMoAjggAEECdGooAgAgAREBAAsgAkEBaiECDAALAAsgAigCECAJaigCACECDAELC0Ho/QooAgAhBSAAKAIQIgIoAugBIQQDQCACKALsASAETgRAIARByABsIgEgBSgCECgCxAFqQQA6ADECQCACLQB0QQFxRQ0AIAIoAsQBIAFqIgEoAgAiBkEATA0AIAZBAWsiBkEBdkEBaiEHIAEoAgQhAUEAIQIDQCACIAdHBEAgASACQQJ0aigCACABIAYgAmtBAnRqKAIAEJcIIAJBAWohAgwBCwsgACgCECECCyAEQQFqIQQMAQsLAkAgABBhIABHDQAQyQRCAFcNACAAQQAQlggLQQAhBEEAIQIDQCACIAMoAkBPDQEgAyADQUBrKQMANwMQIAMgAykDODcDCCADQQhqIAIQGSEAAkACQAJAIAMoAkgiAQ4CAgABCyADKAI4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IQILIAMgASACIAYQ6w4gASECCyAAIAYQMCEGDAALAAsACyAAEOoODAELIAAgA0EAQQAQ6Q4gAxAcIQEDQCABBEAgASgCECICQQA6ALQBIAJBADYCsAEgAyABEB0hAQwBCwsgAxAcIQEDQCABBEAgAyABEOgOIAMgARAdIQEMAQsLIAMQHCEBA0AgAQRAIAEoAhBBADYCkAEgAyABEB0hAQwBCwtBACEJIAMQHCEBA0AgAQRAIAEoAhAoApABRQRAIAMgASAJQQFqIgkQoAgLIAMgARAdIQEMAQsLAkAgCUECSA0AIANB5xwQygQhAiADEBwhAUEBIQgDQCABRQ0BIAggASgCECgCkAFGBEAgAyACIAFBAEEBEF4aIAhBAWohCAsgAyABEB0hAQwACwALIAMQHCEHA0AgBwRAIAMgBxAsIQEDQCABBEAgBygCECICKALIASACKALMASICQQFqIAJBAmoQ2gEhBCAHKAIQIgIgBDYCyAEgAiACKALMASICQQFqNgLMASAEIAJBAnRqIAE2AgAgBygCECICKALIASACKALMAUECdGpBADYCACABIAFBMGsiBSABKAIAQQNxQQJGGygCKCgCECICKALAASACKALEASICQQFqIAJBAmoQ2gEhAiABIAUgASgCAEEDcUECRhsoAigoAhAgAjYCwAEgASAFIAEoAgBBA3FBAkYbKAIoKAIQIgQgBCgCxAEiAkEBajYCxAEgBCgCwAEgAkECdGogATYCACABIAUgASgCAEEDcUECRhsoAigoAhAiAigCwAEgAigCxAFBAnRqQQA2AgAgAyABEDAhAQwBCwsgAyAHEB0hBwwBCwsgA0EBIBAgAEGnhwEQJyICBH8gAhCRAgVBfwsQ/w4aIAAoAhBC/////3c3A+gBQQAhBwJAIAlBAkgNACAJQQFqIgIQnwghB0EBIQEDQCABIAJGDQEgByABQQJ0akH/////BzYCACABQQFqIQEMAAsACyAAEBwhCANAIAgEQCAIEIYCIQIgCCgCECIBIAIoAhAoAqQBKAIQIgIoAvQBIgU2AvQBIAUgACgCECIEKALsAUoEQCAEIAU2AuwBCyAFIAQoAugBSARAIAQgBTYC6AELIAcEQCABIAIoApABIgI2ApABIAcgAkECdGoiAiACKAIAIgIgBSACIAVIGzYCAAsgACAIEB0hCAwB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IAFCADcDECABQgA3AwggASAANgIcIAFBCGpBBBAmIQAgASgCCCAAQQJ0aiABKAIcNgIAIAFBHGohCkH/////ByEEA0AgASgCEARAIAFBCGogCkEEEL4BQQAhACABKAIcIQcDQCAHKAIQIgIoAsgBIABBAnRqKAIAIgMEQCADQVBBACADKAIAQQNxIgtBAkcbaigCKCIMKAIQIg0oArACIQYCQCADKAIQIg4oAqQBQQBIBEAgBiAITCAGIAlOcQ0BIA0oAvQBIANBMEEAIAtBA0cbaigCKCgCECgC9AEgDigCrAFqayICIAQgBUUgAiAESHIiAhshBCADIAUgAhshBQwBCyAGIAIoArACTg0AIAEgDDYCHCABQQhqQQQQJiECIAEoAgggAkECdGogASgCHDYCAAsgAEEBaiEADAEFQQAhACAEQQBMDQMDQCACKAKYAiAAQQJ0aigCACIDRQ0EIANBMEEAIAMoAgBBA3FBA0cbaigCKCIDKAIQKAKwAiACKAKwAkgEQCABIAM2AhwgAUEIakEEECYhAiABKAIIIAJBAnRqIAEoAhw2AgAgBygCECECCyAAQQFqIQAMAAsACwALAAsLDAELIAQoAhAiACgCsAIhCCAAKAKsAiEJIAFBADYCGCABQgA3AxAgAUIANwMIIAEgBDYCHCABQQhqQQQQJiEAIAEoAgggAEECdGogASgCHDYCACABQRxqIQpB/////wchBANAIAEoAhAEQCABQQhqIApBBBC+AUEAIQAgASgCHCEHA0AgBygCECICKALAASAAQQJ0aigCACIDBEAgA0EwQQAgAygCAEEDcSILQQNHG2ooAigiDCgCECINKAKwAiEGAkAgAygCECIOKAKkAUEASARAIAYgCEwgBiAJTnENASADQVBBACALQQJHG2ooAigoAhAoAvQBIA0oAvQBIA4oAqwBamsiAiAEIAVFIAIgBEhyIgIbIQQgAyAFIAIbIQUMAQsgBiACKAKwAk4NACABIAw2AhwgAUEIakEEECYhAiABKAIIIAJBAnRqIAEoAhw2AgALIABBAWohAAwBBUEAIQAgBEEATA0DA0AgAigCoAIgAEECdGooAgAiA0UNBCADQVBBACADKAIAQQNxQQJHG2ooAigiAygCECgCsAIgAigCsAJIBEAgASADNgIcIAFBCGpBBBAmIQIgASgCCCAC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4woQwgEQcQtBkOMKECQEQCAAQeDjCigCACgCFEGQ4woQwgEQcQtBsOMKECQEQCAAQeDjCigCACgCHEGw4woQwgEQiwYLQcDjChAkBEAgAEHg4wooAgAoAiRBwOMKEMIBEHELQdDjChAkBEAgAEHg4wooAgAoAiBB0OMKEMIBEHELQYilCkKAgICAgICA+D83AwBB+KQKQoCAgICAgID4PzcDAEHopApCgICAgICAgPg/NwMAQeCkCkKAgICAgICA+D83AwBByKQKQoCAgICAgID4PzcDAEHApApCgICAgICAgPg/NwMAQYjkCkIANwMAQfjjCkIANwMAQZzkCkEANgIAQZTkCkEANgIAC30AIAAoAhAoAgghAEHw4goQJARAIABB4OMKKAIAKAIIQfDiChDCARBxC0Gw4woQJARAIABB4OMKKAIAKAIMQbDjChDCARCLBgtBgKUKQoCAgICAgID4PzcDAEHwpApCgICAgICAgPg/NwMAQZjkCkEANgIAQZDkCkEANgIAC3MAIAAoAhAoAggiAEHg4wooAgAoAgBB8OIKEMIBEHEgACgCECgCDARAIABB4OMKKAIAKAIEQbDjChDCARBxC0HYpApCgICAgICAgPg/NwMAQbikCkKAgICAgICA+D83AwBBhOQKQQA2AgBB9OMKQQA2AgALxAMBBH8jAEEQayIDJAAgACgCECgCCCEBQeTjCigCAEUEQEHs4wpBoAI2AgBB6OMKQaECNgIAQeTjCkHw7wkoAgA2AgALIAEoAkwiAigCBCEEIAJB5OMKNgIEAkACQAJAAkACQAJAIAAoAkAOBwEBBAACAgIDCyAAIAEgAEEBEMcIDAQLIAAtAJsBQQhxDQMgASAAENUIDAMLQeDiChAkBEBB4OMKKAIAKAIAIgJFBEAgAUEAQcHDARCIASECQeDjCigCACACNgIACyABIAJB4OIKEMIBEHELIAEoAhAoAgwEQCABQeDjCigCACgCBEGg4woQwgEQiwYLQQAhAiABQb7jAEHg4wooAgAoAiwQkAcDQCACQQhGRQRAIAJBBHRB4OIKahBcIAJBAWohAgwBCwtB4OMKKAIAEBhB0KQKQoCAgICAgID4PzcDAEGwpApCgICAgICAgPg/NwMAQYDkCkEANgIAQfDjCkEANgIAIAAtAJsBQQhxDQIgASAAENUIDAILIANB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IAUoAggoAghB4IYKRwRAIAQgATYCGCAGIQMLIAFBACAEQegAaiACIAQtAGcgAxCWBEUNASABIAIQ3wkMAQsgASAGIARB6ABqIANB6cUBIAMbIgMgBC0AZ0EAEJYERQ0AIAEQISEBIAQgAzYCCCAEIAI2AgQgBCABNgIAQd+9BCAEECoLIARBADYCjAEgACAEQegAakEoEB8aCyAEQZABaiQACxoAIAAoAhAoAgwiAARAIAAoAiwQGCAAEBgLC6kFAgR8CH9BMBBSIQYgACgCECgCCCgCCCgCBCEKAnwgAEHU2wooAgBE////////739EexSuR+F6hD8QTCAAQdDbCigCAET////////vf0R7FK5H4XqUPxBMIgEQKSICvUL/////////9/8AUiABvUL/////////9/8AUnJFBEAgACgCECIFQpqz5syZs+bUPzcDICAFQpqz5syZs+bUPzcDKETNzMzMzMwMQAwBCyACRGEyVTAqqTM/ECMhASAAKAIQIgUgASACIAJEAAAAAAAAAABkGyIBOQMgIAUgATkDKCABRAAAAAAAAFJAogshA0EBIQtBASAAQYjcCigCACAKQQAQYiIHIAdBAU0bIAdBAEcgAEG83AooAgBEAAAAAAAA8D9EAAAAAAAAAAAQTCIERAAAAAAAAAAAZHEiCmoiBUEBdEEQEBoiCCADRAAAAAAAAOA/oiICOQMYIAggAjkDECAIIAKaIgE5AwggCCABOQMAQQIhCQJAIAdBAkkEQCACIQEMAQsgAiEBA0AgByALRkUEQCAIIAlBBHRqIgwgAUQAAAAAAAAQQKAiAZo5AwggDCACRAAAAAAAABBAoCICmjkDACAMIAI5AxAgDCABOQMYIAtBAWohCyAJQQJqIQkMAQsLIAIgAqAhAwsgCkUgBSAHTXJFBEAgCCAJQQR0aiIFIAREAAAAAAAA4D+iIgQgAaAiATkDGCAFIAQgAqAiAjkDECAFIAGaOQMIIAUgApo5AwALIAZCADcDECAGQQI2AgggBiAHNgIEIAZBATYCACAGIAg2AiwgBkIANwMYIAZCADcDICAAKAIQIgAgAiACoEQAAAAAAABSQKMiATkDcCAAIAE5A2ggACADRAAAAAAAAFJAoyIBOQMoIAAgATkDICAAIAY2AgwLwQMCBH8CfCMAQdAAayIBJAAgABAtKAIQKAJ0IQJBoN8KIAAoAhAoAngoAgAiAzYCACAAIAJBBHFFIgRBAUECIAMQQCICIAJBAk0bQQFqQQEQGiIDEMgGIgJFBEAgASAAKAIQKAJ4KAIANgIgQYPxAyABQSBqEDdBoN8KQb3RATYCACAAIARBASADEMgGIQILIAMQGCABQUBrIAAgAhDkCSABIAAoAhAiAysDIEQAAAAAAABSQKIiBTkDQCABIAMrAyhEAAAAAAAAUkCiIgY5A0ggAEGc3AooAgBB+pMBEHoQaEUEQCABIAIrAwAgBRAjIgU5A0AgASACKwMIIAYQIyIGOQNICyAAQfjbCigCAEH6kwEQehBoIQMgASABKQNINwMYIAEgASkDQDcDECACIAFBEGogAxDjCSABIAZEAAAAAAAA4D+iOQM4IAEgASkDODcDCCABIAVEAAAAAAAA4L+iOQMwIAEgASkDMDcDACACIAFBDxDiCSAAKAIQIgAgAisDAEQAAAAAAABSQKM5AyAgAisDCCEFIAAgAjYCDCAAIAVEAAAAAAAA8D+gRAAAAAAAAFJAozkDKCABQdAAaiQAC6IeAw9/GnwDfiMAQYABayIBJABBMBBSIQggACgCECgCCCgCCCIGKwMYIRogBisDICEcIAYrAxAgBigCCCEEIAYoAgQhByAGKAIAQQBHIABBrzsQJxBociENAkAgBkGw/QlGDQAgDQRAIABB1NsKKAIARAAAAAAAAAAARHsUrkfheoQ/EEwgAEHQ2wooAgBEAAAAAAAAAABEexSuR+F6lD8QTBAjRAAAAAAAAFJAoiITIRUgE0QAAAAAAAAAAGQNASAAKAIQIgIrAyAgAisDKBApRAAAAAAAAFJAoiITIRUMAQsgACgCECICKwMoRAAAAAAAAFJAoiETIAIrAyBEAAAAAAAAUkCiIRULIABBiNwKKAIAIAdBABBiIQkgAEGQ3AooAgBEAAAAAAAAAABEAAAAAACAdsAQTCAERQRAIABBlNwKKAIARAAAAAAAAAAARAAAAAAAAFnAEEwhHCAAQYTcCigCAEEEQQAQYiEEIABBmNwKKAIARAAAAAAAAAAARAAAAAAAAFnAEEwhGgsgACgCECgCeCICKwMYIRECQCACKwMgIhZEAAAAAAAAAABkRSARRAAAAAAAAAAAZEF/c3EgBkGw/QlGcg0AIABB1+QAECciAgRAIAFCADcDeCABQgA3A3AgASABQfgAajYCQCABIAFB8ABqNgJEIAJB3IMBIAFBQGsQUSECIAEgASsDeEQAAAAAAAAAABAjIhA5A3ggASABKwNwRAAAAAAAAAAAECMiFzkDcCACQQBKBEAgEEQAAAAAAABSQKIiECAQoCIQIBGgIREgAkEBRwRAIBdEAAAAAAAAUkCiIhAgEKAgFqAhFgwDCyAQIBagIRYMAgsgFkQAAAAAAAAgQKAhFiARRAAAAAAAADBAoCERDAELIBZEAAAAAAAAIECgIRYgEUQAAAAAAAAwQKAhEQsgACgCECgCeCsDGCEUIAAQLSgCECgCCCsDACIQRAAAAAAAAAAAZAR8IBBEAAAAAAAAUkCiIhAgFiAQo5uiIRYgECARIBCjm6IFIBELIR8gASAWAn8CQCAAKAIQKAIIIgItAAxBAUYEQCACKAIAQZ3sABA+RQ0BIABByJoBECchBiABQeAAaiAAEC0gBhDMBiABKAJgIgcgASgCZCICcUF/RgRAIAEgABAhNgIkIAEgBkH/3gEgBhs2AiBBtPwEIAFBIGoQKgwCCyAAEC0oAhBBAToAciAHQQJqIQMgAkECagwCCyAAQb+eARAnIgZFDQAgBi0AAEUNACABQeAAaiAAEC0gBhDMBiABKAJgIgcgASgCZCICcUF/RgRAIAEgABAhNgI0IAEgBjYCMEHh/AQgAUEwahAqDAELIAAQLSgCEEEBOgByIAdBAmohAyACQQJqDAELQQALtyIgECM5A2ggASAfIAO3ECM5A2AgBEH4ACAavSAcvYRQIARBAktyGyEEAn8CQCAAQZmzARAnIgJFDQAgAi0AACICQfQARyACQeIAR3ENACAAKAIQIgMoAnggAjoAUCACQeMARwwBCyAAKAIQIgMoAnhB4wA6AFBBAAshCqAhIgJAAkAgBEEERw0AICIQpweZRAAAAAAAAOA/Y0UgGr1CAFJyDQBBASELIBy9UA0BCyADKAIIKAIIKAIsIgIEQCACKAIAIQIgASABKQNoNwMYIAEgASkDYDcDECABQdAAaiABQRBqIAIRBAAgASABKQNYNwNoIAEgASkDUDcDYEEAIQsMAQsCQCATIAErA2giEETNO39mnqD2P6IiF2RFIApyRQRAIAFEAAAAAAAA8D9EAAAAAAAA8D8gECAToyIXIBeioaOfIAErA2CiIhg5A2AMAQsgASAXOQNoIAEgASsDYETNO39mnqD2P6IiGDkDYCAXIRALQQAhCyAEQQNJDQAgASAQRBgtRFT7IQlAIAS4oxBKIhCjOQNoIAEgGCAQozkDYAsgASsDaCEXAkACQCAAQZzcCigCAEH6kwEQeiICLQAAQfMARw0AIAJBoZYBED5FDQAgASATOQNoIAEgFTkDYCAIIAgoAihBgBByNgIoDAELIAIQaARAAkAgFSAAKAIQKAJ4IgIrAxhjRQRAIBMgAisDIGNFDQELIAAQISECIAEgABAtECE2AgQgASACNgIAQZmRBCABECoLIAEgEzkDaCABIBU5A2AMAQsgASAVIAErA2AQIyIVOQNgIAEgEyABKwNoECMiEzkDaAsgDQRAIAEgFSATECMiEzkDYCABIBM5A2ggEyEVCyARIBShIRACfCAfIhEgAEH42wooAgBB+pMBEHoQaA0AGiALBEAgESABKwNgECMMAQsgHyAWIAErA2giFGNFDQAaIBFEAAAAAAAA8D8gFiAWoiAUIBSio6GfIAErA2CiECMLIREgACgCECgCeCICIBEgEKE5AyggCCgCKEGAEHEiD0UEQCACIBYgICAWoSABKwNoIBehIhGgIBEgFiAgYxugOQMwC0EBIQpBASAJIAlBAU0bIgYgCUEARyAAQbzcCigCAEQAAAAAAADwP0QAAAAAAAAAABBMIiNEAAAAAAAAAABkcWohDEECIQcCQAJAAkAgBEECTQRAIAxBAXRBEBAaIQUgASsDYCEUIAUgASsDaCITRAAAAAAAAOA/oiIROQMYIAUgFEQAAAAAAADgP6IiEDkDECAFIBGaOQMIIAUgEJo5AwAgCUECSQ0BA0AgCSAKRgRAIBEgEaAhEyAQIBCgIRQMAwUgBSAHQQR0aiICIBFEAAAAAAAAEECgIhGaOQMIIAIgEEQAAAAAAAAQQKAiEJo5AwAgAiAQOQMQIAIgETkDGCAKQQFqIQogB0ECaiEHDAELAAsACyAEIAxsQRAQGiEFAkAgACgCECgCCCgCCCgCLCICBEAgBSABQeAAaiACKAIEEQQAIAErA2hEAAAAAAAA4D+iIRkgASsDYEQAAAAAAADgP6IhGAwBC0QYLURU+yEZQCAEuKMiJEQYLURU+yEJwKBEAAAAAAAA4D+iIhREGC1EVPshCUAgJKFEAAAAAAAA4D+ioCEQIBpEzTt/Zp6g9j+iICREAAAAAAAA4D+iIhcQSqMhKCAcRAAAAAAAAOA/oiEpIBQQVyIdRAAAAAAAAOA/oiERIBQQSiIeRAAAAAAAAOA/oiEmQQAhA0QAAAAAAAAAACEYIByZIBqZoEQAAAAAAADwPxBHISAgASsDaCEhIAErA2AhGyAXEFchJyAiRAAAAAAAgGZAo0QYLURU+yEJQKIhFANAIAMgBEYNASAkIBCgIhAQSiESIAUgA0EEdGoiAiAUICcgEBBXoiARoCIRICcgEqIgJqAiJiARICiiICCgoiApIBGioCISEKgBoCIXEFciHSASIBEQRyISoiAhoiIlOQMIIAIgGyASIBcQSiIeoqIiEjkDACADQQFqIQMgJZkgGRAjIRkgEpkgGBAjIRggC0UNAAsgBSASOQMwIAUgJTkDGCAFICWaIhE5AzggBSAROQMoIAUgEpoiETkDICAFIBE5AxALIAEgEyAZIBmgIhEQIyITOQNoIAEgFSAYIBigIhAQIyIUOQNgIBMgEaMhESAUIBCjIRBBACEDA0AgAyAERkUEQCAFIANBBHRqIgIgESACKwMIojkDCCACIBAgAisDAKI5AwAgA0EBaiEDDAELCyAMQQJJDQFBASAEIARBAU0bIQogBSsDCCIZvSEqIAUrAwAiGL0hK0EBIQMDQAJAIAMgCkYEQCASvSEsDAELIAUgBCADayAEcEEEdGoiAisDCCEQIAIrAwAiEr0iLCArUg0AIANBAWohAyAQvSAqUQ0BCwsgKyAsUSAqIBC9UXFFBEBBACELIBkgEKEgGCASoRCoASERIAQgCWxBBHQhBwJAA0AgBCALRgRAQQAhAyAEIAlBAWtsQQR0IQogDEEBayAEbEEEdCEGIBQhECATIREDQCADIARGDQcgBSADQQR0aiIHIApqIgIrAwAgAisDCCAGIAdqIgIrAwAgA0EBaiEDIAIrAwiZIhIgEqAgERAjIRGZIhIgEqAgEBAjIRCZIhIgEqAgExAjIROZIhIgEqAgFBAjIRQMAAsACyAFIAtBBHRqIg4rAwgiFb0hKkEBIQMCQCAOKwMAIhe9IisgEr1SICogEL1SckUEQCARIRIMAQsDQAJAIAMgCkYEQCAYvSEsDAELIAUgAyALaiAEcEEEdGoiAisDCCEZIAIrAwAiGL0iLCArUg0AIANBAWohAyAqIBm9UQ0BCwsgKyAsUSAqIBm9UXENAiARRBgtRFT7IQlAoCAZIBWhIBggF6EQqAEiEqFEAAAAAAAA4D+iIhAQVyEbIBEgEKEiEBBKRAAAAAAAABBAIBujIhGiIR4gEBBXIBGiIR0LQQEhAwJAAkAgHkQAAAAAAAAAAGIEQCAVIREgFyEQDAELIBUhESAXIRAgHUQAAAAAAAAAAGENAQsDQCADIAZGBEAgCSAMSQRAIAcgDmoiAiAjIB2iRAAAAAAAAOA/okQAAAAAAADQP6IgEaA5AwggAiAjIB6iRAAAAAAAAOA/okQAAAAAAADQP6IgEKA5AwALIAtBAWohCyASIREgFSEQIBchEgwDBSAOIAMgBGxBBHRqIgIgHSARoCIROQMIIAIgHiAQoCIQOQMAIANBAWohAwwBCwALAAsLQcCdA0HeuQFBnxJBuiAQAAALQdigA0HeuQFBkhJBuiAQAAALQdigA0HeuQFB/BFBuiAQAAALQQIhBCAJIAxPDQAgBSAJQQV0aiICICNEAAAAAAAA4D+iIhIgEKAiEDkDECACIBIgEaAiEZo5AwggAiAQmjkDACACIBE5AxggESARoCERIBAgEKAhEAwBCyAUIRAgEyERCyAIIBw5AyAgCCAiOQMQIAggBDYCCCAIIAk2AgQgCCANNgIAIAggBTYCLCAIIBo5AxgCQCAPBEAgHyAQECMhECAAKAIQIgMgEEQAAAAAAABSQKM5A2ggAyAWIBMQI0QAAAAAAABSQKM5AyggAyAfIBQQI0QAAAAAAABSQKM5AyAgFiARECMhEQwBCyAAKAIQIgMgEEQAAAAAAABSQKM5A2ggAyATRAAAAAAAAFJAozkDKCADIBREAAAAAAAAUkCjOQMgCyADIAg2AgwgAyARRAAAAAAAAFJAozkDcCABQYABaiQACzMBAX8gACgCFCIBBEAgARDqAwsCQCAAKAJERQ0AIAAoAkwiAUUNACAAIAERAQALIAAQGAsJACAAKAJEEBgLDAAgACgCECgCDBAYC7gFAgh/AnwjAEHACWsiASQAAkACQCAAQciaARAnEPsEIgUEQEGA3wooAgAiAkUEQEGA3wpB/PwJQZTuCSgCABCTASICNgIACyACIAVBgAQgAigCABEDACICRQRAIAVB4zsQnwQiBkUNAkEAIQICQAJAAkACQANAIAFBwAFqIgRBgAggBhCoBwRAIAEgAUHQAGo2AkwgASABQdQAajYCSCABIAFB2ABqNgJEIAEgAUHcAGo2AkBBASEHIARB/LEBIAFBQGsQUUEERiACciICIAEtAMABQSVHBEAgBEGKsQEQsgVBAEcgA3IhAwsgA3FBAXFFDQEMAgsLIAMhByACQQFxRQ0BC0HQABBSIgIgASgCXCIDtzkDICACIAEoAlgiBLc5AyggAiABKAJUIANrtzkDMCABKAJQIQMgAiAFNgIIIAIgAyAEa7c5AzhBiN8KQYjfCigCACIDQQFqNgIAIAIgAzYCDCAGEOoLIAFB4ABqEOgLIAIgASgCeCIEQQFqQQEQGiIDNgJEIAYQ5gMgAyAEQQEgBhC7BUEBRgRAIAMgBGpBADoAAEGA3wooAgAiAyACQQEgAygCABEDABogAiAHQQFxOgAQDAMLIAEgBTYCIEHd+wMgAUEgahAqIAMQGCACEBgMAQsgASAFNgIwQZr7AyABQTBqECoLQQAhAgsgBhDqAyACRQ0DCyACKwMwIQkgACgCECIDIAIrAzgiCkQAAAAAAABSQKM5AyggAyAJRAAAAAAAAFJAozkDIEEYEFIhAyAAKAIQIAM2AgwgAyACKAIMNgIAIAMgAisDIJogCUQAAAAAAADgP6KhOQMIIAMgAisDKJogCkQAAAAAAADgP6KhOQMQDAILIAEgABAhNgIAQYr8AyABECoMAQsgASAFNgIQQcH7AyABQRBqECoLIAFBwAlqJAALPgECfwJ/QX8gACgCACICIAEoAgAiA0kNABpBASACIANLDQAaQX8gACgCBCIAIAEoAgQiAUkNABogACABSwsLMABBGBBSIgEgACgCCDYCCCABIAAoAgw2AgwgASAAKAIQNgIQIAEgACgCFDYCFCABC2MBA38jAEEQayICJAAgAkEIaiABKAIAQQAQ0AECQCAAKAAAIAIoAgggACgABCIBIAIoAgwiAyABIANJIgQbEOoBIgANAEEBIQAgASADSw0AQX9BACAEGyEACyACQRBqJAAgAAv/BAEKfyACQeMAcQRAIAAgASACIAAoAiAoAgARAwAPCwJAAkAgAkGEBHFFBEAgACgCICgCBEEMcSIDIAJBgANxRXINAQsgACEDA0AgA0UEQEEAIQQMAwsgAyABIAIgAygCICgCABEDACIEDQIgAygCKCEDDAALAAsCQAJAAkAgAwRAIAJBmANxRQ0DIAJBkAJxQQBHIQsgAkGIAXFBAEchDCAAIQMDQCADRQ0CAkAgAyABIAIgAygCICgCABEDACIERQ0AIAQgAygCBCIHKAIAaiEGIAcoAgQiCkEASARAIAYoAgAhBgsCQCAFRQ0AIAwCfyAHKAIUIgcEQCAGIAkgBxEAAAwBCyAKQQBMBEAgBiAJEE0MAQsgBiAJIAoQzgELIgdBAEhxDQAgCyAHQQBKcUUNAQsgBCEFIAYhCSADIQgLIAMoAighAwwACwALIAJBGHFFDQICQAJAIAAoAiwiBEUNACAEKAIMIQgCfyAEKAIEKAIIIgNBAEgEQCAIKAIIDAELIAggA2sLIAFHDQAgASEDDAELIAAhBANAIARFBEAgAEEANgIsQQAPCyAEIAFBBCAEKAIgKAIAEQMAIgNFBEAgBCgCKCEEDAELCyAAIAQ2AiwLQYABQYACIAJBCHEbIQEgBCADIAIgBCgCICgCABEDACEFA0AgACEDIAUEQANAIAMgBEYNBCADIAVBBCADKAIgKAIAEQMARQRAIAMoAighAwwBCwsgBCAFIAIgBCgCICgCABEDACEFDAELIAAgBCgCKCIENgIsIARFDQMgBEEAIAEgBCgCICgCABEDACEFDAALAAsgACAINgIsCyAFDwtBAA8LIAAgAzYCLCAECxEAIAAgAaJEAAAAAAAAJECiC2IAIwBBIGsiBiQAIAAgAisDACADKwMAoDkDACAAIAIrAwggAysDCKA5AwggBiACKQMINwMIIAYgAikDADcDACAGIAApAwg3AxggBiAAKQMANwMQIAEgBkECED0gBkEgaiQAC9IEAgJ/BXwjAEHwAGsiByQAIAcgAikDCDcDGCAHIAIpAwA3AxAgBUQAAAAAAADgP6IiCkQAAAAAAADQP6JEAAAAAAAA4D8gBUQAAAAAAAAQQGQbIQsgAysDCCEJIAACfCAGQSBxIggEQCADKwMAIQUgAisDAAwBCyACKwMAIgQgAysDACIFRAAAAAAAAAAAYSAJRAAAAAAAAAAAYXENABogAiACKwMIIAogCSAFmiAJmhBHIgyjoqA5AwggBCAKIAUgDKOioAsiBCAFoDkDACAAIAIrAwgiCiAJoDkDCCAHIAApAwg3AyggByAAKQMANwMgIAcgCiALIAWiIgWhIAsgCZqiIgmhIgs5A2ggByAFIAQgCaGgOQNgIAcgBSAKoCAJoSIKOQM4IAcgBSAEIAmgoDkDMCAFIAlEZmZmZmZm7r+iIASgoCEMIAUgCURmZmZmZmbuP6IgBKCgIQ0gBUQAAAAAAAAQQKJEAAAAAAAACECjIQQgCUQAAAAAAAAQwKJEAAAAAAAACECjIQUCfCAIBEAgCyAFoCEJIAQgDKAhCyAKIAWgIQogBCANoAwBCyALIAWhIQkgDCAEoSELIAogBaEhCiANIAShCyEFIAcgCTkDWCAHIAs5A1AgByAKOQNIIAcgBTkDQCABIAdBEGpBAhA9AkAgBkHAAHEEQCAHIAdBMGoiAEQAAAAAAADgP0EAIAAQoQEMAQsgBkGAAXFFDQAgByAHQTBqIgBEAAAAAAAA4D8gAEEAEKEBCyABIAdBMGpBBEEAEPABIAdB8ABqJAALFAAgACABokQAAAAAAAAkQKIgAqALiwICAX8HfCMAQSBrIgckACACKwMAIQQCQCADKwMAIglEAAAAAAAAAABiIAMrAwgiCkQAAAAAAAAAAGJyRQRAIAIrAwghBQwBCyACKwMIIAVEAAAAAAAA4D+iIgggCpoiBSAJmiILIAUQRyIMo6IiDaEhBSAEIAggCyAMo6IiC6EhBAsgByAJIAoQR0QAAAAAAADgP6IiCCAKRAAAAAAAAOA/oiAFoCIMoDkDGCAHIAggCUQAAAAAAADgP6IgBKAiDqA5AxAgByAMIAihOQMIIAcgDiAIoTkDACABIAcgBkF/c0EEdkEBcRCGBCAAIAogBaAgDaE5AwggACAJIASgIAuhOQMAIAdBIGokAAudAgEBfyMAQaABayIEJAAgBEIANwNIIARCADcDQCAEQgA3AzggBEIANwMYIARCADcDCCAEIAAgAaJEAAAAAAAAJECiOQMwIARCADcDECAEIAQpAzA3AwAgBEEgaiAEQRBqIAQgAiADIARB0ABqEIIKAkACQCAEKwMgRAAAAAAAAOA/oiIARAAAAAAAAAAAZARAIAQrA2ggBCsDiAGhIgFEAAAAAAAAAABkRQ0BIAAgAaIgBCsDgAEgBCsDcKGZoyIBRAAAAAAAAAAAZEUNAiAEQaABaiQAIAAgAKAgACACoiABo6EPC0GDuANBkrkBQYQKQcakARAAAAtB57gDQZK5AUGHCkHGpAEQAAALQbG4A0GSuQFBiwpBxqQBEAAAC6kBAQF/IwBB8ABrIgckACAHIAIpAwg3AxggByACKQMANwMQIAcgAykDCDcDCCAHIAMpAwA3AwAgACAHQRBqIAcgBSAGIAdBIGoQggoCQCAGQcAAcQRAIAEgB0FAa0EDIAZBf3NBBHZBAXEQSAwBCyAGQX9zQQR2QQFxIQAgBkGAAXEEQCABIAdBIGpBAyAAEEgMAQsgASAHQSBqQQQgABBICyAHQfAAaiQAC/EDAgF/CnwjAEFAaiIHJAAgAysDCCIEIAIrAwgiCaAhDiADKwMAIgggAisDACINoCEPIAhEmpmZmZmZ2T+iIQogBESamZmZmZnZv6IhCyAERJqZmZmZmek/oiAJoCEQIAhEmpmZmZmZ6T+iIA2gIRECfCAIRAAAAAAAAAAAYQRARAAAAAAAAAAAIAREAAAAAAAAAABhDQEaCyAFRAAAAAAAAOA/oiIFIASaIgQgCJoiCCAEEEciBKOiIQwgBSAIIASjogshBSACIAkgDKEiCDkDCCACIA0gBaEiCTkDACAAIA4gDKE5AwggACAPIAWhOQMAIAcgCiAQIAyhIgSgOQM4IAcgCyARIAWhIgWgOQMwIAcgBCAKoTkDKCAHIAUgC6E5AyAgByAIIAqhOQMYIAcgCSALoTkDECAHIAogCKA5AwggByALIAmgOQMAIAdBEGohAwJAIAZBwABxBEAgByACKQMANwMAIAcgAikDCDcDCCAHIAQ5AzggByAFOQMwDAELIAZBgAFxRQ0AIAMgAikDADcDACADIAIpAwg3AwggByAEOQMoIAcgBTkDIAsgASAHQQQgBkF/c0EEdkEBcRBIIAcgBDkDCCAHIAU5AwAgAyAAKQMINwMIIAMgACkDADcDACABIAdBAhA9IAdBQGskAAtQACAAIAGiRAAAAAAAACRAoiIARJqZmZmZmcm/oiACRAAAAAAAAOA/oiIBoCAAIABEmpmZmZmZ2b+iIAGgIgGgoCAAIAFEAAAAAAAAAABkGwuIBAIBfwt8IwBBQGoiByQAIAMrAwghBCAAIAMrAwAiCCACKwMAIgmgIhA5AwAgACAEIAIrAwgiDqAiETkDCCAJIAhEMzMzMzMz4z+ioCEKIAkgCESamZmZmZnJP6KgIQsgDiAERDMzMzMzM+M/oqAhDCAOIAREmpmZmZmZyT+ioCENAkAgCCAEEEciD0QAAAAAAAAAAGRFDQAgD0SamZmZmZnJv6IgBUQAAAAAAADgP6KgIg9EAAAAAAAAAABkRQ0AIAIgDiAPIASaIgUgCJoiDiAFEEciEqOiIgWhOQMIIAIgCSAPIA4gEqOiIgmhOQMAIAAgESAFoTkDCCAAIBAgCaE5AwAgDCAFoSEMIAogCaEhCiANIAWhIQ0gCyAJoSELCyAHIAggDKA5AzggByAKIAShOQMwIAcgDCAIoTkDKCAHIAQgCqA5AyAgByANIAihOQMYIAcgBCALoDkDECAHIAggDaA5AwggByALIAShOQMAIAdBEGohAwJAIAZBwABxBEAgByAMOQM4IAcgCjkDMCAHIA05AwggByALOQMADAELIAZBgAFxRQ0AIAcgDDkDKCAHIAo5AyAgByANOQMYIAcgCzkDEAsgASAHQQRBARBIIAcgAikDCDcDCCAHIAIpAwA3AwAgAyAAKQMINwMIIAMgACkDADcDACABIAdBAhA9IAdBQGskAAvTAgIBfwJ8IwBB4AFrIgQkACAEQgA3A0ggBEIANwNAIARCADcDOCAEQgA3AxggBEIANwMIIAQgACABokQAAAAAAAAkQKI5AzAgBEIANwMQIAQgBCkDMDcDACAEQSBqIARBEGogBCABIAIgAyAEQdAAahCECgJAAkACQCAEKwMgIgBEAAAAAAAAAABkBEAgACAEKwOAASAEKwNgIgWhoCIBRAAAAAAAAAAAZEUNASAEKwPIASAEKwNooSIGRAAAAAAAAAAAZEUNAiAGIAGiIAUgBCsDUKGZoyIFRAAAAAAAAAAAZEUNAyAEQeABaiQAIAAgAkQAAAAAAADgP6IgAiABoiAFoyADQSBxG6EPC0GDuANBkrkBQboKQYAUEAAAC0H+sANBkrkBQbwKQYAUEAAAC0HnuANBkrkBQb8KQYAUEAAAC0GxuANBkrkBQcMKQYAUEAAAC5UBAQF/IwBBsAFrIgckACAHIAIpAwg3AxggByACKQMANwMQIAcgAykDCDcDCCAHIAMpAwA3AwAgACAHQRBqIAcgBCAFIAYgB0EgaiIAEIQKAkAgBkHAAHEEQCABIABBBUEBEEgMAQsgBkGAAXEEQCABIAdB4ABqQQVBARBIDAELIAEgB0EgakEIQQEQSAsgB0GwAWokAAuhAgEBfyMAQaABayIEJAAgBEIANwNIIARCADcDQCAEQgA3AzggBEIANwMYIARCADcDCCAEIAAgAaJEAAAAAAAAJECiOQMwIARCADcDECAEIAQpAzA3AwAgBEEgaiAEQRBqIAQgAiADIARB0ABqEIUKAkACQCAEKwMgIgBEAAAAAAAAAABkBEAgBCsDiAEgBCsDaKEiAUQAAAAAAAAAAGRFDQEgACABoiAEKwNgIAQrA3ChmaMiAUQAAAAAAAAAAGRFDQIgBEGgAWokACAAIAIgAKIgAaMgAkQAAAAAAADgP6IgA0EgcRuhDwtBg7gDQZK5AUG1CUHk8QAQAAALQee4A0GSuQFBuAlB5PEAEAAAC0GxuANBkrkBQbwJQeTxABAAAAuoAQEBfyMAQfAAayIHJAAgByACKQMINwMYIAcgAikDADcDECAHIAMpAwg3AwggByADKQMANwMAIAAgB0EQaiAHIAUgBiAHQSBqIgAQhQoCQCAGQcAAcQRAIAEgAEEDIAZBf3NBBHZBAXEQSAwBCyAGQX9zQQR2QQFxIQAgBkGAAXEEQCABIAdBQGtBAyAAEEgMAQsgASAHQTBqQQMgABBICyAHQfAAaiQACzQBAXwgACgCBCsDACABKwMAIAAoAgAiACsDAKEiAiACoiABKwMIIAArAwihIgIgAqKgn2YL9BIBEX8jAEEQayIHJAAgAC0ACUEQcQRAIABBABDnAQsgACgCDCEDIAAoAgQiDCgCCCEJAn8CQAJAIAFFBEBBACACQcADcUUgA0VyDQMaIAJBwABxBEAgDCgCEEUgCUEATnFFBEBBACAJayEEA0AgAygCBCIBBEAgAyABKAIANgIEIAEgAzYCACABIQMMAQsgAygCACAMKAIQIgYEQAJ/IAlBAEgEQCADKAIIDAELIAMgBGoLIAYRAQALIAwoAghBAEgEQCADEBgLIgMNAAsLIABBADYCDCAAQQA2AhhBAAwECwJAIAJBgAJxBEADQCADKAIAIgFFDQIgAyABKAIENgIAIAEgAzYCBCABIQMMAAsACwNAIAMoAgQiAUUNASADIAEoAgA2AgQgASADNgIAIAEhAwwACwALIAAgAzYCDCAJQQBODQEMAgsgDCgCFCEOIAwoAgQhCiAMKAIAIQ8CQAJAAkACQAJAAkAgAkGCIHEiE0UNACAAKAIgKAIEQQhHDQAgASAPaiEIIApBAE4iBkUEQCAIKAIAIQgLIAAgAUEEIAAoAgARAwAhBCAKQQBKIQsDQCAERQ0BIAQgD2ohBSAGRQRAIAUoAgAhBQsCfyAOBEAgCCAFIA4RAAAMAQsgC0UEQCAIIAUQTQwBCyAIIAUgChDOAQsNASABIARGBEAgByAAKAIMIgMoAgQ2AgggByADKAIANgIMIAdBCGohBAwDBSAAIARBCCAAKAIAEQMAIQQMAQsACwALAkACQAJAAkACQAJAAkACQCACQYUEcQRAAn8gASACQYAEcQ0AGiABIA9qIgggCkEATg0AGiAIKAIACyEIIAMNASAHQQhqIgYhBAwDCyACQSBxBEAgDwJ/IAlBAEgEQCABKAIIDAELIAEgCWsLIgVqIQggCkEASARAIAgoAgAhCAsgA0UNAiABIQ0gBSEBDAELIANFBEAgB0EIaiIGIQQMAwsCfyAJQQBIBEAgAygCCAwBCyADIAlrCyABRgRAIAdBCGoiBiEEDAQLIAEgD2ohCCAKQQBODQAgCCgCACEIC0EAIAlrIRAgCUEATiERIAdBCGoiBiELAkADQCADIQQCQAJ/AkACQAJAA0ACfyARRQRAIAQoAggMAQsgBCAQagsgD2ohBSAKQQBOIhJFBEAgBSgCACEFCyAEAn8gDgRAIAggBSAOEQAADAELIApBAEwEQCAIIAUQTQwBCyAIIAUgChDOAQsiBUUNBBogBUEATg0DIAQoAgQiBUUNAgJ/IBFFBEAgBSgCCAwBCyAFIBBqCyAPaiEDIBJFBEAgAygCACEDCwJ/IA4EQCAIIAMgDhEAAAwBCyAKQQBMBEAgCCADEE0MAQsgCCADIAoQzgELIgNBAE4NASAEIAUoAgA2AgQgBSAENgIAIAsgBTYCBCAFIgsoAgQiBA0ACyAFIQQMCAsgA0UEQCALIAQ2AgQgBSEDDAkLIAYgBTYCACALIAQ2AgQgBCELIAUiBigCACIDDQQMBwsgCyAENgIEDAYLIAQoAgAiBUUNAwJ/IBFFBEAgBSgCCAwBCyAFIBBqCyAPaiEDIBJFBEAgAygCACEDCwJ/IA4EQCAIIAMgDhEAAAwBCyAKQQBMBEAgCCADEE0MAQsgCCADIAoQzgELIgNBAEoEQCAEIAUoAgQ2AgAgBSAENgIEIAYgBTYCACAFIgYoAgAiAw0DIAshBAwGCyADDQEgBiAENgIAIAQhBiAFCyEDIAshBAwFCyALIAU2AgQgBiAENgIAIAQhBiAFIgsoAgQiAw0ACyAFIQQMAgsgBiAENgIAIAQhBiALIQQMAQsgB0EIaiIGIQQgASENIAUhAQsgBEEANgIEIAZBADYCACACQQhxDQEgAkEQcQ0DIAJBhARxDQhBACEDIAJBAXENB0EAIQEgAkEgcUUNCCAAIAAoAhhBAWo2AhggDSEDDAkLIAYgAygCBDYCACAEIAMoAgA2AgQgAkGEBHENCCACQQhxRQ0BIAcoAgghBiADQQA2AgAgAyAGNgIEIAcgAzYCCAsgBygCDCIDRQ0GA0AgAygCBCIBBEAgAyABKAIANgIEIAEgAzYCACABIQMMAQsLIAcgAygCADYCDAwHCyACQRBxRQ0BIAcoAgwhBiADQQA2AgQgAyAGNgIAIAcgAzYCDAsgBygCCCIDRQ0EA0AgAygCACIBBEAgAyABKAIENgIAIAEgAzYCBCABIQMMAQsLIAcgAygCBDYCCAwFCyATRQ0BCwJ/IAlBAEgEQCADKAIIDAELIAMgCWsLIQECQCACQQJxRQ0AIAwoAhAiBkUNACABIAYRAQALIAwoAghBAEgEQCADEBgLIAAgACgCGCIDQQFrNgIYIANBAEoNAiAAIANBAms2AhgMAgsgAkEBcQRAIAAoAiAtAARBBHENAyADQQA2AgQgAyAHKAIMNgIAIAcgAzYCDAwBC0EAIAJBIHFFDQUaIAAoAiAtAARBBHEEQCAMKAIQIgQEQCABIAQRAQALIAwoAghBAE4NAyANEBgMAwsgDUEANgIEIA0gBygCDDYCACAHIA02AgwgACAAKAIYQQFqNgIYDAILIAwoAgwiBgRAIAEgDCAGEQAAIQELAkACQAJAIAEEQCAJQQBIDQEgASAJaiEDCyADRQ0DDAELQQwQTyIDRQ0BIAMgATYCCAsgACgCGCIBQQBIDQIgACABQQFqNgIYDAILIAwoAgxFDQAgDCgCECIDRQ0AIAEgAxEBAAsDQCAEIgMoAgQiBA0ACyADIAcoAgg2AgQgACAHKAIMNgIMIAJBHnRBH3UgAXEMAwsgAyAHKAIIIgU2AgQgAyAHKAIMNgIAAkAgAkGEBHFFDQAgACgCICgCBEEIcUUNAAJ/IAlBAEgEQCADKAIIDAELIAMgCWsLIA9qIQEgCkEATiIGRQRAIAEoAgAhAQtBACAJayELIAlBAE4hDQNAIAUiBEUNAQNAIAQoAgAiAgRAIAQgAigCBDYCACACIAQ2AgQgAiEEDAELCyADIAQ2AgQCfyANRQRAIAQoAggMAQsgBCALagsgD2ohBSAGRQRAIAUoAgAhBQsCfyAOBEAgASAFIA4RAAAMAQsgCkEATARAIAEgBRBNDAELIAEgBSAKEM4BCw0BIAMgBCgCADYCBCAEIAM2AgAgBCgCBCEFIAQhAwwACwALIAAgAzYCDCAJQQBIDQELIAMgCWsMAQsgAygCCAsgB0EQaiQAC4QBAQJ/IwBBEGsiAiQAQQFBIBBOIgEEQCAAKAIAIgMEQCABIAMQZDYCAAsgACgCBCIDBEAgASADEGQ2AgQLIAEgACgCGEH/AHE2AhggASAAKwMQOQMQIAEgACgCCDYCCCACQRBqJAAgAQ8LIAJBIDYCAEGI9ggoAgBB9ekDIAIQIBoQLwALFAAgACgCABAYIAAoAgQQGCAAEBgLqAECA38CfCABKAIAIQICQAJAAkACQCAAKAIAIgNFBEAgAkUNAQwECyACRQ0CIAMgAhBNIgINAQsgASgCBCECAkAgACgCBCIDRQRAIAINBAwBCyACRQ0CIAMgAhBNIgINAQtBfyECIAAoAhhB/wBxIgMgASgCGEH/AHEiBEkNACADIARLDQEgACsDECIFIAErAxAiBmMNACAFIAZkIQILIAIPC0EBDwtBfwsEACMACxAAIwAgAGtBcHEiACQAIAALBgAgACQACwwAIAAQrQoaIAAQGAsGAEG09wALBgBBybMBCwYAQZjiAAscACAAIAEoAgggBRDbAQRAIAEgAiADIAQQ7QYLCzkAIAAgASgCCCAFENsBBEAgASACIAMgBBDtBg8LIAAoAggiACABIAIgAyAEIAUgACgCACgCFBELAAuTAgEGfyAAIAEoAgggBRDbAQRAIAEgAiADIAQQ7QYPCyABLQA1IAAoAgwhBiABQQA6ADUgAS0ANCABQQA6ADQgAEEQaiIJIAEgAiADIAQgBRDqBiABLQA0IgpyIQggAS0ANSILciEHAkAgBkECSQ0AIAkgBkEDdGohCSAAQRhqIQYDQCABLQA2DQECQCAKQQFxBEAgASgCGEEBRg0DIAAtAAhBAnENAQwDCyALQQFxRQ0AIAAtAAhBAXFFDQILIAFBADsBNCAGIAEgAiADIAQgBRDqBiABLQA1IgsgB3JBAXEhByABLQA0IgogCHJBAXEhCCAGQQhqIgYgCUkNAAsLIAEgB0EBcToANSABIAhBAXE6ADQLlAEAIAAgASgCCCAEENsBBEAgASACIAMQ7AYPCwJAIAAgASgCACAEENsBRQ0AAkAgASgCECACRwRAIAIgASgCFEcNAQsgA0EBRw0BIAFBATYCIA8LIAEgAjYCFCABIAM2AiAgASABKAIoQQFqNgIoAkAgASgCJEEBRw0AIAEoAhhBAkcNACABQQE6ADYLIAFBBDYCLAsL+AEAIAAgASgCCCAEENsBBEAgASACIAMQ7AYPCwJAIAAgASgCACAEENsBBEACQCABKAIQIAJHBEAgAiABKAIURw0BCyADQQFHDQIgAUEBNgIgDwsgASADNgIgAkAgASgCLEEERg0AIAFBADsBNCAAKAIIIgAgASACIAJBASAEIAAoAgAoAhQRCwAgAS0ANUEBRgRAIAFBAzYCLCABLQA0RQ0BDAMLIAFBBDYCLAsgASACNgIUIAEgASgCKEEBajYCKCABKAIkQQFHDQEgASgCGEECRw0BIAFBAToANg8LIAAoAggiACABIAIgAyAEIAAoAgAoAhgRCgALC7EEAQN/IAAgASgCCCAEENsBBEAgASACIAMQ7AYPCwJAAkAgACABKAIAIAQQ2wEEQAJAIAEoAhAgAkcEQCACIAEoAhRHDQELIANBAUcNAyABQQE2AiAPCyABIAM2AiAgASgCLEEERg0BIABBEGoiBSAAKAIMQQN0aiEHQQAhAwNAAkACQCABAn8CQCAFIAdPDQAgAUEAOwE0IAUgASACIAJBASAEEOoGIAEtADYNACABLQA1QQFHDQMgAS0ANEEBRgRAIAEoAhhBAUYNA0EBIQNBASEGIAAtAAhBAnFFDQMMBAtBASEDIAAtAAhBAXENA0EDDAELQQNBBCADGws2AiwgBg0FDAQLIAFBAzYCLAwECyAFQQhqIQUMAAsACyAAKAIMIQUgAEEQaiIGIAEgAiADIAQQiAUgBUECSQ0BIAYgBUEDdGohBiAAQRhqIQUCQCAAKAIIIgBBAnFFBEAgASgCJEEBRw0BCwNAIAEtADYNAyAFIAEgAiADIAQQiAUgBUEIaiIFIAZJDQALDAILIABBAXFFBEADQCABLQA2DQMgASgCJEEBRg0DIAUgASACIAMgBBCIBSAFQQhqIgUgBkkNAAwDCwALA0AgAS0ANg0CIAEoAiRBAUYEQCABKAIYQQFGDQMLIAUgASACIAMgBBCIBSAFQQhqIgUgBkkNAAsMAQsgASACNgIUIAEgASgCKEEBajYCKCABKAIkQQFHDQAgASgCGEECRw0AIAFBAToANgsLcAECfyAAIAEoAghBABDbAQRAIAEgAiADEO8GDwsgACgCDCEEIABBEGoiBSABIAIgAxCyCgJAIARBAkkNACAFIARBA3RqIQQgAEEYaiEAA0AgACABIAIgAxCyCiABLQA2DQEgAEEIaiIAIARJDQALCwszACAAIAEoAghBABDbAQRAIAEgAiADEO8GDwsgACgCCCIAIAEgAiADIAAoAgAoAhwRBwALGgAgACABKAIIQQAQ2wEEQCABIAIgAxDvBgsLgwUBBn8jAEFAaiIEJAACf0EBIAAgAUEAENsBDQAaQQAgAUUNABojAEEQayIGJAAgBiABKAIAIgNBCGsoAgAiBTYCDCAGIAEgBWo2AgQgBiADQQRrKAIANgIIIAYoAggiA0Ho6AlBABDbASEFIAYoAgQhBwJAIAUEQCAGKAIMIQEjAEFAaiIDJAAgA0FAayQAQQAgByABGyEDDAELIAMhBSMAQUBqIgMkACABIAdOBEAgA0IANwIcIANCADcCJCADQgA3AiwgA0IANwIUIANBADYCECADQejoCTYCDCADIAU2AgQgA0EANgI8IANCgYCAgICAgIABNwI0IAMgATYCCCAFIANBBGogByAHQQFBACAFKAIAKAIUEQsAIAFBACADKAIcGyEICyADQUBrJAAgCCIDDQAjAEFAaiIDJAAgA0EANgIQIANBuOgJNgIMIAMgATYCCCADQejoCTYCBEEAIQEgA0EUakEAQScQOBogA0EANgI8IANBAToAOyAFIANBBGogB0EBQQAgBSgCACgCGBEKAAJAAkACQCADKAIoDgIAAQILIAMoAhhBACADKAIkQQFGG0EAIAMoAiBBAUYbQQAgAygCLEEBRhshAQwBCyADKAIcQQFHBEAgAygCLA0BIAMoAiBBAUcNASADKAIkQQFHDQELIAMoAhQhAQsgA0FAayQAIAEhAwsgBkEQaiQAQQAgA0UNABogBEEIakEAQTgQOBogBEEBOgA7IARBfzYCECAEIAA2AgwgBCADNgIE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KAIIEPgGIghBf0YNBCAGIAcoAgBrIAhJDQYDQCAIBEAgAi0AACEFIAcgBygCACIJQQFqNgIAIAkgBToAACAIQQFrIQggAkEBaiECDAELCyAEIAQoAgBBBGoiAjYCACACIQgDQCADIAhGBEAgAyEIDAULIAgoAgBFDQQgCEEEaiEIDAALAAsgBCACNgIADAMLIAQoAgALIANHIRAMAwsgBygCACEFDAELC0ECIRALIA9BEGokACAQCwkAIAAQ4QoQGAszACMAQRBrIgAkACAAIAQ2AgwgACADIAJrNgIIIABBDGogAEEIahCvCygCACAAQRBqJAALNAADQCABIAJGRQRAIAQgAyABLAAAIgAgAEEASBs6AAAgBEEBaiEEIAFBAWohAQwBCwsgAQsMACACIAEgAUEASBsLKgADQCABIAJGRQRAIAMgAS0AADoAACADQQFqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQbClCRCgCgseACABQQBOBH9BsKUJKAIAIAFBAnRqKAIABSABC8ALDwAgACABIAJBpJkJEKAKCx4AIAFBAE4Ef0GkmQkoAgAgAUECdGooAgAFIAELwAsJACAAENcKEBgLNQADQCABIAJGRQRAIAQgASgCACIAIAMgAEGAAUkbOgAAIARBAWohBCABQQRqIQEMAQsLIAELDgAgASACIAFBgAFJG8ALKgADQCABIAJGRQRAIAMgASwAADYCACADQQRqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQbClCRCfCgseACABQf8ATQR/QbClCSgCACABQQJ0aigCAAUgAQsLDwAgACABIAJBpJkJEJ8KCx4AIAFB/wBNBH9BpJkJKAIAIAFBAnRqKAIABSABCws6AANAAkAgAiADRg0AIAIoAgAiAEH/AEsNACAAQQJ0QYC0CWooAgAgAXFFDQAgAkEEaiECDAELCyACCzoAA0ACQCACIANGDQAgAigCACIAQf8ATQRAIABBAnRBgLQJaigCACABcQ0BCyACQQRqIQIMAQsLIAILSQEBfwNAIAEgAkZFBEBBACEAIAMgASgCACIEQf8ATQR/IARBAnRBgLQJaigCAAVBAAs2AgAgA0EEaiEDIAFBBGohAQwBCwsgAQslAEEAIQAgAkH/AE0EfyACQQJ0QYC0CWooAgAgAXFBAEcFQQALCwkAIAAQ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AkAgAEH8AWogAEH4AWoQWw0AIAAoArABIAEQJSACakYEQCABECUhAyABIAEQJUEBdBBBIAEgARBVEEEgACADIAFBABBDIgJqNgKwAQsgAEH8AWoiAxCDASAAQQdqIABBBmogAiAAQbABaiAALADPASAALADOASAAQcABaiAAQRBqIABBDGogAEEIaiAAQdABahCIBw0AIAMQlgEaDAELCwJAIABBwAFqECVFDQAgAC0AB0EBRw0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCsAEgBBCPCzgCACAAQcABaiAAQRBqIAAoAgwgBBCvASAAQfwBaiAAQfgBahBbBEAgBCAEKAIAQQJyNgIACyAAKAL8ASABEDUaIABBwAFqEDUaIABBgAJqJAALjwMBAX8jAEGAAmsiACQAIAAgAjYC+AEgACABNgL8ASADEKgCIQYgAEHEAWogAyAAQfcBahClBCAAQbgBahBUIgEgARBVEEEgACABQQAQQyICNgK0ASAAIABBEGo2AgwgAEEANgIIA0ACQCAAQfwBaiAAQfgBahBbDQAgACgCtAEgARAlIAJqRgRAIAEQJSEDIAEgARAlQQF0EEEgASABEFUQQSAAIAMgAUEAEEMiAmo2ArQBCyAAQfwBaiIDEIMBIAYgAiAAQbQBaiAAQQhqIAAsAPcBIABBxAFqIABBEGogAEEMakHAsQkQ2QMNACADEJYBGgwBCwsCQCAAQcQBahAlRQ0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCtAEgBCAGEJALNwMAIABBxAFqIABBEGogACgCDCAEEK8BIABB/AFqIABB+AFqEFsEQCAEIAQoAgBBAnI2AgALIAAoAvwBIAEQNRogAEHEAWoQNRogAEGAAmokAAuPAwEBfyMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIAMQqAIhBiAAQcQBaiADIABB9wFqEKUEIABBuAFqEFQiASABEFUQQSAAIAFBABBDIgI2ArQBIAAgAEEQajYCDCAAQQA2AggDQAJAIABB/AFqIABB+AFqEFsNACAAKAK0ASABECUgAmpGBEAgARAlIQMgASABECVBAXQQQSABIAEQVRBBIAAgAyABQQAQQyICajYC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AjgCQCABQeIlQQBBARA2BEAgASgCECgCCA0BCyACLQCbAUEEcQ0AQZqwBEEAEDdBfyEBDAELAkAgBQRAIAVBgCAQTyIGNgIAIAYNAQtBwf4AQQAQN0F/IQEMAQsgAkKAIDcCLCACIAY2AiggACABEJ8GIQEgAhCHBCABRQRAIAUgAigCKDYCACADIAIoAjA2AggLIAAQlQQLIARBEGokACADKAIMIQACQCABRQRAIAAhBwwBCyAAEBgLIANBEGokACAHCwsAEPYMELwMEJMKCzUAIAFB4iVBAEEBEDYEQCABKAIQKAKUASIABEAgASAAEQEAIAEoAhBBADYClAELIAEQ0wkLCwsAIAAgASACEJQGCwwAIAAQlwYgABCWBgsFABCVBgsHACAAELkBCwsAIAAgASACEJAHCw0AIAAgASACQQIQ4wYLDQAgACABIAJBARDjBgsNACAAIAEgAkEAEOMGCwsAIAAgAUEBEJIBCxwAIAAgACABQQEQjQEgACACQQEQjQFBAEEBEF4LCwAgACABQQEQjQELCwAgACABQQEQjAELCwAgACABQQAQjAELCQAgACABENUCCwkAIAAgARCsAQs2AQF/QQBBAUHC8ABBvdEBELUFGhD2DBC8DBCTCiAAENwNA0BBABDcDSIBBEAgARC5AQwBCwsLRwEBfyMAQRBrIgMkACADQQA7AA0gA0EAOgAPIANBAkEAIAIbIAFyOgAMIAMgAygCDDYCCCAAIANBCGpBABDjASADQRBqJAALsAMCBX8BfiMAQRBrIgMkACADQQA2AgwCfxCVBiEEIwBB4ABrIgEkACABQgA3A1ggAUIANwNQIAFCADcDSAJAAkACf0EAIABFDQAaAkADQCACQQVHBEAgACACQQJ0QbCWBWooAgAQLkUNAiACQQFqIQIMAQsLIAEgADYCAEHu+wQgARA3QQAMAQsgBCACQQJ0aigCQCECIAFCADcDQEEAIQADQCACBEAgAUE4aiACKAIEQToQ0AECQCAABEAgASABKQNANwMoIAEgASkDODcDICABQShqIAFBIGoQ+gYNAQsgASgCOCIARQ0EIAAgASgCPCIAEJACIgVFDQUgASAFNgJcIAFByABqQQQQJiEAIAEoAkggAEECdGogASgCXDYCAAsgASABKQM4IgY3A0AgBqchACACKAIAIQIMAQsLIAFB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iAFqQQAQGUECdGogAygCuAEQzgwEQCADIAMpA7gBNwOAASADIAMpA7ABNwN4IAchAiADKAKwASADQfgAakEAEBlBAnRqIAMoArgBENAMIgsNAUEAIQtBouwDQQAQKkEAIQIDQCACIAMoArgBTw0FIAMgAykDuAE3A1AgAyADKQOwATcDSCADQcgAaiACEBkhBAJAAkACQCADKALAASIFDgICAAELIAMoArABIARBAnRqKAIAEBgMAQsgAygCsAEgBEECdGooAgAgBREBAAsgAkEBaiECDAALAAsCQCAMDQAgA0GYAWogABD9AiAAQQhBCBDqBSECQcTtA0EAECogASsDACINIAK3Ig5mIA4gASsDCCIPZXIEQCADQUBrIA85AwAgAyANOQM4IAMgAjYCMEHj8AQgA0EwahCAAQwBCyADKwOYASIOIA1lIAMrA6ABIhAgD2VyRQ0AIAMgDzkDKCADIA05AyAgAyAQOQMYIAMgDjkDEEGV8QQgA0EQahCAAQtBACECA0AgAiADKAK4AU8NBCADIAMpA7gBNwMIIAMgAykDsAE3AwAgAyACEBkhBAJAAkACQCADKALAASIFDgICAAELIAMoArABIARBAnRqKAIAEBgMAQsgAygCsAEgBEECdGooAgAgBREBAAsgAkEBaiECDAALAAsDQCACRQRAQQAhAgNAIAIgAygCuAFPDQYgAyADKQO4ATcDYCADIAMpA7ABNwNYIANB2ABqIAIQGSEEAkACQAJAIAMoAsABIgUOAgIAAQsgAygCsAEgBEECdGooAgAQGAwBCyADKAKwASAEQQJ0aigCACAFEQEACyACQQFqIQIMAAsACyACKAIQIANBmAFqIAIgC0EAEMUMIAMpA5gBNwOQASADKAK4AUEATgRAIANBsAFqQQQQjAIgAyADKQO4ATcDcCADIAMpA7ABNwNoIAIgAygCsAEgA0HoAGpBABAZQQJ0aiADKAK4AUEAEMQMIAIoAhAoArABIQIMAQsLQYnNAUGDugFBggJBzDAQAAALQYnNAUGDugFB4QFBzDAQAAALIAAgChAdIQoMBQtBASEMCyADQbABaiICQQQQMSACEDQLIAAgBxAwIQcMAAsACwsgCwRAIAsQzwwLIANB0AFqJAAgDAtbAQJ/IAAQHCEBA0AgAQRAIAAgARAsIQIDQCACBEAgAhDAAiAAIAIQMCECDAELCyABEOcCIAAgARAdIQEMAQsLIAAQqQwgACgCECgCmAEQGCAAKAIQKAKMARAYCz4BAn8Cf0F/IAAoAgAiAiABKAIAIgNIDQAaQQEgAiADSg0AGkF/IAAoAgQiACABKAIEIgFIDQAaIAAgAUoLC4cBAQJ/AkBB4P8KKAIAIgMoAgQiAiADKAIIRwRAIAMhAQwBCyADKAIMIgFFBEAgAyACIAMoAgBrQRRtQQF0ELAMIgE2AgwLQeD/CiABNgIAIAEgASgCACICNgIECyABIAJBFGo2AgQgAiAAKAIANgIAIAAoAgQhACACQQA2AgggAiAANgIEIAILagECfyAAEBwhAQNAIAEEQCAAIAEQLCECA0AgAgRAIAIQwAIgACACEDAhAgwBCwsgARDnAiAAIAEQHSEBDAELCwJAQfjaCigCAEUEQEHQ/wooAgBBAE4NAQsgABDJDQsgACgCECgCuAEQGAsRACAAIAFByP8KQcT/ChDlBgvmCQMOfwF8AX4jAEHQAGsiBCQAQfjaCigCAAJ/An9BASACQQZIDQAaIAAQPEEEEBohCCAAEBwhAyACQQhGIQwDQCADBEAgAyABIAwQxwwhBSADKAIQIQcCQCAFBEAgByAJNgKwAiAIIAlBAnRqIAU2AgAgCUEBaiEJDAELIAdBqXc2ArACCyAAIAMQHSEDDAELCyAIRQRAQQAhCEEBDAELIAggCRDODARAQQEhA0EAIAJBCEYNAhogCCAJENAMDAILIAJBCEYEQEH27ANBABAqQQAMAQsgASsDACERIAQgASsDCDkDOCAEIBE5AzBBhu4DIARBMGoQKkEACyENQQAhA0EACyEKQezaCi0AAARAQYj2CCgCACAEAn9Bxi4gAyACQQhGcQ0AGkHpJyAKRQ0AGkG+LkG0LiACQQpGGws2AiBByPgDIARBIGoQIBoLQQFKIQ4CQCAKBEAgABAcIQEDQCABRQ0CIAAgARAsIQMDQCADBEAgAygCECAEQcgAaiADIApBARDFDCAEKQNINwOQASAAIAMQMCEDDAELCyAAIAEQHSEBDAALAAsgA0EBcyACQQhHcg0AIABBABCkDkEBIQ4LQYj2CCgCACEPIAAQHCELIAJBCkchEANAIAsEQCAAIAsQLCEBA0AgAQRAIAFBUEEAIAEoAgBBA3FBAkcbaigCKCEFIAEoAhAhAwJAAkAgDkUNACADKAIIRQ0AIAEQmgNB+NoKKAIAQQNHDQECQAJAIAEoAhAoAggiAygCBA4CAwEACyALECEhAyAEIAUQITYCFCAEIAM2AhBBpeYEIARBEGoQKiABKAIQKAIIIQMLIAMoAgAiAygCBCEGIANBADYCBCADKAIAIQcgA0EANgIAIAEQmQQgASAFIAcgBkHk0goQlAEgBxAYDAELIAMvAagBIgNFDQAgBSALRgRAIAEgACgCSCgCECgC+AEQyAwMAQsgCgRAQQAhBUEBIAPBIgNBACADQQBKG0GM2wotAAAbIQcgASEDA0AgBSAHRg0CAkAgEEUEQCADIAggCUEBEMQMDAELIAQgAygCECkDkAEiEjcDCCAEIBI3A0AgBEEIaiAEQcgAahCOBEHs2gotAABBAk8EQCADQTBBACADKAIAQQNxQQNHG2ooAigQISEGIAQgA0FQQQAgAygCAEEDcUECRxtqKAIoECE2AgQgBCAGNgIAIA9Bp/IDIAQQIBoLIAMgA0FQQQAgAygCAEEDcUECRxtqKAIoIAQoAkggBCgCTEHk0goQlAEgAxCaAwsgBUEBaiEFIAMoAhAoArABIQMMAAsAC0EBIQYgASIHIQMDQAJAIAYhBSADIAMoAhAoArABIgxGDQAgBUEBaiEGIAwiAw0BCwtBACEDIAVBBBAaIQYCQANAIAMgBUYEQCAFQQBOBEAgACAGIAUgAkHk0goQgg8gBhAYDAMLBSAGIANBAnRqIAc2AgAgA0EBaiEDIAcoAhAoArABIQcMAQsLQa3KAUHXuwFBygdB9J0BEAAACwsgACABEDAhAQwBCwsgACALEB0hCwwBCwsgCgRAIAoQzwwLIA1FBEBBACEDIAlBACAJQQBKGyEAA0AgACADRwRAIAggA0ECdGoiASgCACgCABAYIAEoAgAQGCADQQFqIQMMAQsLIAgQGAsgBEHQAGokAEEAC64BAgJ8A38CQCAAKAIAIgQgASgCACIFSw0AQX8hBgJAIAQgBUkNACAAKAIYIgQgASgCGCIFSw0BIAQgBUkNACAAKwMIIgIgASsDCCIDZA0BIAIgA2MNACAAKwMQIgIgASsDECIDZA0BIAIgA2MNACAAKwMgIgIgASsDICIDZA0BIAIgA2MNAEEBIQYgACsDKCICIAErAygiA2QNAEF/QQAgAiADYxshBgsgBg8LQQELLwBBwAAQUiIBQQhqIABBCGpBMBAfGiABIAAoAjgiADYCOCAAKAIQQQE7AagBIAELSAECfAJ/QX8gACgCACIAKwMIIgIgASgCACIBKwMIIgNjDQAaQQEgAiADZA0AGkF/IAArAwAiAiABKwMAIgNjDQAaIAIgA2QLC7IGAgh/BXwjAEEQayIGJAACfwJAIAEoAhAiBSgC6AEEQCAGQQQ2AgwgBSsDICENIAUrAyghDCAAQQE2AihBBBDNAiIEIAxEAAAAAAAA4D+iIg6aIgw5AzggBCANRAAAAAAAAOA/oiINOQMwIAQgDDkDKCAEIA2aIgw5AyAgBCAOOQMYIAQgDDkDECAEIA45AwggBCANOQMADAELAkACQAJAAkACQCABEOUCQQFrDgMAAQIDCyAGIAEoAhAoAgwiCCgCCCIJNgIMAkAgCUEDTwRAIAkQzQIhBCAIKAIsIQpBACEFA0AgBSAJRg0CIAQgBUEEdCIHaiILIAcgCmoiBysDAEQAAAAAAABSQKM5AwAgCyAHKwMIRAAAAAAAAFJAozkDCCAFQQFqIQUMAAsACyABIAZBDGpEAAAAAAAAAABEAAAAAAAAAAAQ0QUhBAsgASgCECgCCCgCAEGaEhA+BEAgAEEBNgIoDAULAkAgASgCECgCCCgCAEHW4wAQPkUNACAEIAYoAgwQ6QxFDQAgAEEBNgIoDAULIAgoAghBAksNAyAIKAIARQ0DIABBAjYCKAwECyAGQQQ2AgxBBBDNAiEEIAEoAhAoAgwiASsDGCEPIAErAyAhECABKwMQIQ0gBCABKwMoRAAAAAAAAFJAoyIMOQM4IAQgDUQAAAAAAABSQKMiDjkDMCAEIAw5AyggBCAQRAAAAAAAAFJAoyINOQMgIAQgD0QAAAAAAABSQKMiDDkDGCAEIA05AxAgBCAMOQMIIAQgDjkDACAAQQE2AigMAwsgAEECNgIoIAEgBkEMakQAAAAAAAAAAEQAAAAAAAAAABDRBSEEDAILIAYgASgCECgCCCgCADYCAEHq+QMgBhA3QQEMAgsgAEEANgIoC0EAIQcgBigCDCEBAkACQCACRAAAAAAAAPA/YgRAIAQhBQwBCyAEIQUgA0QAAAAAAADwP2ENAQsDQCABIAdGDQEgBSACIAUrAwCiOQMAIAUgAyAFKwMIojkDCCAHQQFqIQcgBUEQaiEFDAALAAsgACABNgIgIAAgBDYCJCAEIAEgACAAQRBqEOcMQQALIAZBEGokAAubBwIGfwR8IwBBEGsiBiQAAn8CQCABKAIQIgQoAugBBEAgBkEENgIMIAQrAyghCiAEKwMgIQsgAEEBNgIoQQQQzQIiBCACIAtEAAAAAAAA4D+ioCICOQMwIAQgAyAKRAAAAAAAAOA/oqAiAzkDGCAEIAM5AwggBCACOQMAIAQgA5oiAzkDOCAEIAM5AyggBCACmiICOQMgIAQgAjkDEAwBCwJAAkACQAJAAkAgARDlAkEBaw4DAAECAwsgBiABKAIQIgcoAgwiBSgCCCIINgIMQQEhBAJAIAcoAggoAgBBmhIQPg0AIAEoAhAoAggoAgBB1uMAED4EQCAFKAIsIAgQ6QwNAQtBAiEEIAUoAghBAk0EQCAFKAIADQELQQAhBAsgACAENgIoIAhBA08EQCAIEM0CIQQgBSgCLCEFIAAoAihBAUYNBEEAIQEDQCABIAhGDQYgBSABQQR0IgdqIgkrAwghCiAEIAdqIgcgCiADIAkrAwAiCyAKEEciCqNEAAAAAAAA8D+gokQAAAAAAABSQKM5AwggByALIAIgCqNEAAAAAAAA8D+gokQAAAAAAABSQKM5AwAgAUEBaiEBDAALAAsgASAGQQxqIAIgAxDRBSEEDAQLIAZBBDYCDEEEEM0CIQQgASgCECgCDCIBKwMYIQogASsDICELIAErAxAhDCAEIAMgASsDKEQAAAAAAABSQKOgIg05AzggBCAMRAAAAAAAAFJAoyACoSIMOQMwIAQgDTkDKCAEIAIgC0QAAAAAAABSQKOgIgI5AyAgBCAKRAAAAAAAAFJAoyADoSIDOQMYIAQgAjkDECAEIAM5AwggBCAMOQMAIABBATYCKAwDCyAAQQI2AiggASAGQQxqIAIgAxDRBSEEDAILIAYgASgCECgCCCgCADYCAEGL+gMgBhA3QQEMAgsgBCACIAUrAwBEAAAAAAAAUkCjoDkDACAEIAMgBSsDCEQAAAAAAABSQKOgOQMIIAQgBSsDEEQAAAAAAABSQKMgAqE5AxAgBCADIAUrAxhEAAAAAAAAUkCjoDkDGCAEIAUrAyBEAAAAAAAAUkCjIAKhOQMgIAQgBSsDKEQAAAAAAABSQKMgA6E5AyggBCACIAUrAzBEAAAAAAAAUkCjoDkDMCAEIAUrAzhEAAAAAAAAUkCjIAOhOQM4CyAAIAQ2AiQgACAGKAIMIgE2AiAgBCABIAAgAEEQahDnDEEACyAGQRBqJAALEQAgACABQeD+CkHc/goQ5QYLLQECfUF/IAIgACgCAEECdGoqAgAiAyACIAEoAgBBAnRqKgIAIgReIAMgBF0bCxIAIABBNGoQ9QMgAEEoahD1AwsJACAAEJINEBgLGQECfiAAKQMIIgIgASkDCCIDViACIANUawsdACAAKAIAQQR2IgAgASgCAEEEdiIBSyAAIAFJawtEAgF/AnwgACgCBCgCBCABKAIEKAIERgRAIAAoAgBFIAEoAgBBAEdxDwsgACsDECIDIAErAxAiBGQEf0EABSADIARjCwsJACAAEKENEBgLCQAgABDsBxAYC4kIAgl/AnwjAEGgAWsiAyQAIAAQog0gA0EANgKcASAAQQRqIQcgAEEkaiEEAkACQAJAA0AgBCgCACECRP///////+9/IQogBCgCBCIFIQEDfCACIAVGBHwgCkRIr7ya8td6vmNFIAEgBUZyRQRAIAEgBCgCBEEEaygCADYCACAEIAQoAgRBBGs2AgQLIAoFIAogAigCACIGELUCIgtkBEAgAyAGNgKcASALIQogAiEBCyACQQRqIQIMAQsLREivvJry13q+YwRAIAMoApwBIgItABxBAUYNAiADIAIoAgAoAiAiATYCBCADIAIoAgQiBigCICIFNgKYASABIAVHBEAgASAFIAIQrw0MAgsgCEGRzgBODQMgAigCACEJIwBBEGsiBSQAIAEgASgCACgCAEEAEOAFIAUgASAGIAlBAEEAQQAQ8AcgBSgCCCEGIAVBEGokACABIANBBGoiBSADQZgBaiAGEO8HIAFBAToAKCADIAY2AhAgBCADQRBqIgEQwAEgAygCBCADKAKYASACEK8NIAEgByAFEPYDIAhBAWohCAwBCwsgBxDeBUEAIQEDQCABIAAoAhxPDQMgAUECdCABQQFqIQEgACgCGGooAgAiBBC1AkRIr7ya8td6vmNFDQALIANBEGoiAUHIlAk2AjggAUG0lAk2AgAgAUHUlAkoAgAiADYCACABIABBDGsoAgBqQdiUCSgCADYCACABIAEoAgBBDGsoAgBqIgJBADYCFCACIAFBBGoiADYCGCACQQA2AgwgAkKC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ACxBAXEEQCACQQFxRQ0CIAErABAiESADKwAQIhJjDQIgESASZA0BIAErABgiESADKwAYIhJjDQIgESASZCECCyACDQIgAS0AVCECIAMtAFRBAXEEQCACQQFxRQ0CIAErADgiESADKwA4IhJjDQIgESASZA0BIAErAEAiESADKwBAIhJjDQIgESASZCECCyACDQIgBygCECgCpAFBwAFxIgEgACgCECgCpAFBwAFxIgJJDQEgASACSw0AQX8hAiAHKAIAQQR2IgEgACgCAEEEdiIASQ0CIAAgAUkhAgwCC0EBIQIMAQtBfyECCyAFQbAEaiQAIAILQAICfAF/IAArAwAiAiABKwMAIgNkBEAgACsDCCABKwMIZUUPCyACIANjBH9BAEF/IAArAwggASsDCGYbBUEACwv0AgEJfyMAQRBrIgYkACAAKAIwIQEjAEEQayIDJAADQAJAQQAhByACIAEoAgBPDQADQCACQQV0IgUgASgCBGoiCEEIaiEEIAgoABAgB00EQCAEQQQQMSABKAIEIAVqQQhqEDQgAkEBaiECDAMFIAMgBCkCCDcDCCADIAQpAgA3AwAgAyAHEBkhBAJAAkACQCABKAIEIAVqIgUoAhgiCA4CAgABCyAFKAIIIARBAnRqKAIAEBgMAQsgBSgCCCAEQQJ0aigCACAIEQEACyAHQQFqIQcMAQsACwALCyABKAIEEBggARAYIANBEGokACAAQRhqIQEDQCAAKAAgIAlLBEAgBiABKQIINwMIIAYgASkCADcDACAGIAkQGSECAkACQAJAIAAoAigiAw4CAgABCyABKAIAIAJBAnRqKAIAEBgMAQsgASgCACACQQJ0aigCACADEQEACyAJQQFqIQkMAQsLIAFBBBAxIAEQNCAAEBggBkEQaiQACxsBAnxBfyAAKwMAIgIgASsDACIDZCACIANjGwsPACAAKAIQEJkBGiAAEBgLIAECfEEBQX9BACAAKwMAIgIgASsDACIDYxsgAiADZBsLWgIBfAF/QX8gACsDCCABKwMIoSICREivvJry13o+ZCACREivvJry13q+YxsiAwR/IAMFQX8gACsDACABKwMAoSICREivvJry13o+ZCACREivvJry13q+YxsLC1oCAXwBf0F/IAArAwAgASsDAKEiAkRIr7ya8td6PmQgAkRIr7ya8td6vmMbIgMEfyADBUF/IAArAwggASsDCKEiAkRIr7ya8td6PmQgAkRIr7ya8td6vmMbCwuTAQEFfyMAQRBrIgIkACAAQQRqIQEDQCADIAAoAgxPRQRAIAIgASkCCDcDCCACIAEpAgA3AwAgAiADEBkhBAJAAkACQCAAKAIUIgUOAgIAAQsgASgCACAEQQJ0aigCABAYDAELIAEoAgAgBEECdGooAgAgBREBAAsgA0EBaiEDDAELCyABQQQQMSABEDQgAkEQaiQACyUAIAAoAgAoAhAoAvgBIgAgASgCACgCECgC+AEiAUogACABSGsLEgAgAUHatgEgAigCCEEBEDYaCxIAIAFB6bYBIAIoAgRBARA2GgsSACABQcq2ASACKAIAQQEQNhoLGQBBfyAAKAIAIgAgASgCACIBSyAAIAFJGwslACAAKAIAKAIQKAL0ASIAIAEoAgAoAhAoAvQBIgFKIAAgAUhrCyUAIAEoAgAoAhAoAvQBIgEgACgCACgCECgC9AEiAEogACABSmsLIwAgACgCECgCAEEEdiIAIAEoAhAoAgBBBHYiAUsgACABSWsLlQEBBH8jAEEQayIBJAAgAARAA0AgACgACCACTQRAIABBBBAxIAAQNAUgASAAKQIINwMIIAEgACkCADcDACABIAIQGSEDAkACQAJAIAAoAhAiBA4CAgABCyAAKAIAIANBAnRqKAIAEBgMAQsgACgCACADQQJ0aigCACAEEQEACyACQQFqIQIMAQsLCyAAEBggAUEQaiQACxQAIAAoAhBBHGogAEcEQCAAEBgLC44BAgF/BHwjAEEwayIDJAAgAyABKAIIIgQ2AiQgAyAENgIgIABBivwEIANBIGoQHiACKwMAIQUgAisDECEGIAIrAwghByACKwMYIQggAyABKAIINgIQIAMgCCAHoEQAAAAAAADgP6I5AwggAyAGIAWgRAAAAAAAAOA/ojkDACAAQbH5BCADEB4gA0EwaiQACwIAC90DAgF/AnwjAEGgAWsiBCQAAkACQCAABEAgAUUNASABKAIIRQ0CIAEoAkQEQCAEIAIpAwA3A2AgBCACKQMINwNoIAQgAikDGDcDiAEgBCACKQMQNwOAASAEIAQrA2giBTkDmAEgBCAEKwNgIgY5A3AgBCAEKwOAATkDkAEgBCAEKwOIATkDeCADBEBBACECIABBpssDQQAQHgNA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AzggBEIANwMwIABBh9MEIARBMGoQHiAEQfT8CigCAEECazYCICAEQgA3AxAgBEIANwMYIABBptQEIARBEGoQHiAEIAM2AgAgAEHAzgMgBBAeIAMQGAUgASAFQQR0aiIGKwMAIQggBisDCCEJIAArA/gDIQogACsDgAQhCyAEQgA3A4ABIAQgCSALoDkDeCAEIAggCqA5A3AgAEGZ3wEgBEHwAGoQHiAFQQFqIQUMAQsLCwUgASAFQQR0aiIHKwMAIQggBysDCCEJIAArA/gDIQogACsDgAQhCyAEIAAoAhArA6ABOQPoAiAEQgA3A+ACIAQgCSALoDkD2AIgBCAIIAqgOQPQAiAAQZCmBCAEQdACahAeIAVBAWohBQwBCwsgBEGgA2okAAupBQICfwl8IwBB8AJrIgMkACAAQe2uBBAbGkH0/ApB8PwKKAIAQQZrNgIAIAArA4AEIQwgACsD+AMhDSAAKAIQIgQrA6ABIQUgACsD6AMhBiABKwMAIQcgASsDECEIIAArA/ADIQogASsDCCELIAErAxghCSADQbgCaiIBIARBEGpBKBAfGiABQwAAAAAQvAMhASADQgA3A+gCIANCgICAgICAgPg/NwOgAiADQgA3A+ACIAMgBSAGIAggB6GiIgUgCiAJIAuhoiIIoCIJo0QAAAAAAADgP6JEAAAAAAAAFECiOQOoAiADQeACaiIEQfylBCADQaACahB0IAMgCDkDkAIgAyAJRAAAAAAAANA/ojkDiAIgAyAFOQOAAiAEQavTBCADQYACahB0IAMgACgC6AKyuzkD8AEgA0IANwPoASADQoCAgICAgKCrwAA3A+ABIARBh9MEIANB4AFqEHQgA0H0/AooAgA2AtABIAMgBiAHIA2goiIGOQPAASADIAogCyAMoKIiBzkDyAEgBEGm1AQgA0HAAWoQdCADIAE2ArABIARBwM4DIANBsAFqEHQgACAEEP8FEBsaIAEQGCACBEAgA0GIAWoiASAAKAIQQThqQSgQHxogAUMAAAAAELwDIQEgA0IANwOAASADQgA3A3ggA0IANwNwIABBs90EIANB8ABqEB4gA0KAgICAgICA+D83A2AgAyAIOQNYIAMgBTkDUCAAQavTBCADQdAAahAeIANBQGsgACgC6AKyuzkDACADQgA3AzggA0IANwMwIABBh9MEIANBMGoQHiADQfT8CigCADYCICADIAY5AxAgAyAHOQMYIABBptQEIANBEGoQHiADIAE2AgAgAEHAzgMgAxAeIAEQGAsgA0HgAmoQXCADQfACaiQAC+gDAgN/BnwjAEHQAWsiAyQAIAIoAgAhBCACKAIEIgUrAxAhBiADIAUoAgA2ArABIAMgBjkDqAEgAyAENgKgASAAQY/+AyADQaABahAeQfT8CkHw/AooAgBBCWs2AgACfCABKwMAIgYgAi0AMCIEQewARg0AGiAEQfIARgRAIAYgAisDIKEMAQsgBiACKwMgRAAAAAAAAOC/oqALIQYgACsD8AMhByAAKwOABCEIIAErAwghCSAAKwPoAyEKIAArA/gDIQsgA0H4AGoiASAAKAIQQRBqQSgQHxogAUMAAAAAELwDIQEgA0IANwPIASADQgA3A8ABIAIoAgQoAgAhBCACKAIAIQUgA0IANwNwIANCgICAgICAgOg/NwNoIAMgBTYCZCADIAQ2AmAgA0HAAWoiBEGX3AMgA0HgAGoQdCADIAIoAgQrAxAgACsD6AOiOQNQIARB7KUEIANB0ABqEHQgA0FAayAAKALoArK7OQMAIANCADcDOCADQgA3AzAgBEGH0wQgA0EwahB0IANB9PwKKAIANgIgIAMgCiAGIAugojkDECADIAcgCSAIoKI5AxggBEGm1AQgA0EQahB0IAMgATYCACAEQcDOAyADEHQgACAEEP8FEBsaIAQQXCABEBggA0HQAWokAAscACAAQYmyBBAbGkHw/ApB8PwKKAIAQQVqNgIACxwAIABB97EEEBsaQfD8CkHw/AooAgBBBWs2AgALCwAgAEGitAQQGxoLLQEBfyMAQRBrIgEkACABIAAoAhAoAggQITYCACAAQZyBBCABEB4gAUEQaiQACwsAIABB84cEEBsaCxwAIABB3ocEEBsaQfD8CkHw/AooAgBBAms2AgALCwAgAEHYswQQGxoLCwAgAEHGswQQGxoLpgICB38BfiMAQTBrIgQkACAEQQxqQQBBJBA4GiAEIAE2AhwgACABEG4hAgNAIAIEQCAAIAIgARByIAAgAkEAEM4IIQIMAQsLIAEpAwghCkEAIQFBACEDAkAgACgCMCICBEAgCqchBSACKAIAIgYEQEEBIAIoAgh0IQMLIANBAWshBwNAIAEgA0YNAgJAAkAgBiABIAVq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b3BlbkF0dHJpYnV0ZUVudGl0aWVzID09IG9wZW5FbnRpdHkAaW5maW5pdHkAbGlzdC0+c2l6ZSA8IGxpc3QtPmNhcGFjaXR5AHJldC5zaXplIDwgcmV0LmNhcGFjaXR5AGZhbnRhc3kAL3N2Zy9pdm9yeQBvdXQgb2YgbWVtb3J5AEZlYnJ1YXJ5AEphbnVhcnkAZ3ZwbHVnaW5fZG90X2xheW91dF9MVFhfbGlicmFyeQBndnBsdWdpbl9uZWF0b19sYXlvdXRfTFRYX2xpYnJhcnkAZ3ZwbHVnaW5fY29yZV9MVFhfbGlicmFyeQBnYXRoZXJfdGltZV9lbnRyb3B5AGNvcHkAYWxiYW55AEp1bHkAU3BhcnNlTWF0cml4X211bHRpcGx5AGVxdWFsbHkAYXNzZW1ibHkAc3VtbWVyc2t5AHNoeQBzYXRpc2Z5AGJlYXV0aWZ5AG5vanVzdGlmeQBDbGFzc2lmeQAvc3ZnL2xpZ2h0Z3JleQAvc3ZnL2RpbWdyZXkAL3N2Zy9kYXJrZ3JleQAvc3ZnL2xpZ2h0c2xhdGVncmV5AC9zdmcvZGFya3NsYXRlZ3JleQAvc3ZnL3NsYXRlZ3JleQB3ZWJncmV5AHgxMWdyZXkAL3N2Zy9ncmV5AG1vdmUgdG8gZnJvbnQgbG9jayBpbmNvbnNpc3RlbmN5AGV4dHJhY3RfYWRqYWNlbmN5AG1lcmdlX29uZXdheQBhcnJheQBhbGxvY0FycmF5AC9zdmcvbGlnaHRncmF5AC9zdmcvZGltZ3JheQAvc3ZnL2RhcmtncmF5AC9zdmcvbGlnaHRzbGF0ZWdyYXkAL3N2Zy9kYXJrc2xhdGVncmF5AC9zdmcvc2xhdGVncmF5AHdlYmdyYXkAeDExZ3JheQAvc3ZnL2dyYXkAVGh1cnNkYXkAVHVlc2RheQBXZWRuZXNkYXkAU2F0dXJkYXkAU3VuZGF5AE1vbmRheQBGcmlkYXkATWF5AC4uLy4uL2xpYi9jZ3JhcGgvZ3JhbW1hci55ACVtLyVkLyV5AHBvcnRob3l4AHBvcnRob195eAB4eHgAcHgAYm94AHZpZXdCb3gAY2hrQm91bmRCb3gAL01lZGlhQm94AGdldF9lZGdlX2xhYmVsX21hdHJpeABpZGVhbF9kaXN0YW5jZV9tYXRyaXgAbXVzdCBub3QgdW5kZWNsYXJlIHByZWZpeAB1bmJvdW5kIHByZWZpeABodG1sbGV4AG1heAAjJTAyeCUwMnglMDJ4ACMlMnglMnglMnglMngAIyUxeCUxeCUxeAAtKyAgIDBYMHgALTBYKzBYIDBYLTB4KzB4IDB4AHJhcnJvdwBsYXJyb3cASGVsdmV0aWNhLU5hcnJvdwBhcnJvd19sZW5ndGhfY3JvdwAvc3ZnL3Nub3cAc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nX3Nsb3cAL3N2Zy9saWdodHllbGxvdwAvc3ZnL2dyZWVueWVsbG93AC9zdmcvbGlnaHRnb2xkZW5yb2R5ZWxsb3cAL3N2Zy95ZWxsb3cAZmF0YWwgZXJyb3IgLSBzY2FubmVyIGlucHV0IGJ1ZmZlciBvdmVyZmxvdwBmbGV4IHNjYW5uZXIgcHVzaC1iYWNrIG92ZXJmbG93AGNvdXJpZXJuZXcAU3ByaW5nU21vb3RoZXJfbmV3AFRyaWFuZ2xlU21vb3RoZXJfbmV3AGRpYWdfcHJlY29uX25ldwBRdWFkVHJlZV9uZXcAU3RyZXNzTWFqb3JpemF0aW9uU21vb3RoZXIyX25ldwBuICYmIG5ldwBza2V3AHN0cnZpZXcAL3N2Zy9ob25leWRldwAgLWFuY2hvciB3AHNvcnR2AHBvdjpwb3YATm92AGludgBlcXVpdgBwaXYAbm9uYW1lLmd2AEdEX3JhbmsoZylbcl0uYXYgPT0gR0RfcmFuayhnKVtyXS52AGNjJXNfJXp1AGNjJXMrJXp1AC9zdmcvcGVydQBudQBtdQAlYyVsbHUAVGh1AHRhdQBUYXUATnUATXUAX3BvcnRfJXNfKCVkKV8oJWQpXyV1AE51bWJlciBvZiBpdGVyYXRpb25zID0gJXUATnVtYmVyIG9mIGluY3JlYXNlcyA9ICV1AHBsYWludGV4dABzdHJlc3N3dABpbnB1dAB0ZXh0bGF5b3V0AGRvdF9sYXlvdXQAbmVhdG9fbGF5b3V0AGluaXRMYXlvdXQAY2x1c3QAbWFwQ2x1c3QAbGFiZWxqdXN0AHNjQWRqdXN0AEF1Z3VzdABlZGdlc2ZpcnN0AG5vZGVzZmlyc3QAbWF4aW1hbF9pbmRlcGVuZGVudF9lZGdlX3NldF9oZWF2ZXN0X2VkZ2VfcGVybm9kZV9zdXBlcm5vZGVzX2ZpcnN0AGV4aXN0AHJlYWxpZ25Ob2RlbGlzdABhcHBlbmROb2RlbGlzdABzbG90X2Zyb21fY29uc3RfbGlzdABzbG90X2Zyb21fbGlzdABkZWZhdWx0ZGlzdABtaW5kaXN0AHBvd2VyX2Rpc3QAZ3JhcGhfZGlzdABhdmdfZGlzdABnZXRFZGdlTGlzdABpcXVlc3QAbG93YXN0AHNwcmluZ19lbGVjdHJpY2FsX2VtYmVkZGluZ19mYXN0AGd2X3NvcnQAdmlld3BvcnQAdGFpbHBvcnQAdW5leHBlY3RlZCBwYXJzZXIgc3RhdGUgLSBwbGVhc2Ugc2VuZCBhIGJ1ZyByZXBvcnQAaGVhZHBvcnQAaHRtbF9wb3J0AGluc2VydABSVHJlZUluc2VydABmaW5kU1ZlcnQAc3RhcnQAcGFydABlc3RpbWF0ZV90ZXh0X3dpZHRoXzFwdABxdW90AH9yb290AG5vdABtYWtlX3ZuX3Nsb3QAZW1pdF94ZG90AHhkb3Q6eGRvdABlcHM6eGRvdABzdmc6eGRvdABqcGc6eGRvdABwbmc6eGRvdABqcGVnOnhkb3QAZ2lmOnhkb3QAanBlOnhkb3QAeGRvdDEuNDp4ZG90AHhkb3QxLjI6eGRvdABzZG90AG1pZGRvdABndjpkb3QAcGxhaW4tZXh0OmRvdABkb3Q6ZG90AGVwczpkb3QAY2Fub246ZG90AHBsYWluOmRvdABzdmc6ZG90AGpwZzpkb3QAcG5nOmRvdABqcGVnOmRvdABnaWY6ZG90AGpwZTpkb3QAf2JvdABkb0RvdABzcGFuLT5mb250AHZhZ3hicHJpbnQAZW5kcG9pbnQAeGRvdF9wb2ludABkZWNpZGVfcG9pbnQAVW5zYXRpc2ZpZWQgY29uc3RyYWludAB0cmFuc3BhcmVudABjb21wb25lbnQAaW52YWxpZCBhcmd1bWVudABjb21tZW50AGp1bmsgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudABjZW50AGkgPT0gZWNudABhcmlhbG10AGdldF9oYXNoX3NlY3JldF9zYWx0AGNpcmN1aXQAcG9seV9pbml0AE11bHRpbGV2ZWxfaW5pdABuc2xpbWl0AG1jbGltaXQAUG9ydHJhaXQAbGlnaHQAdmlydHVhbF93ZWlnaHQAbGhlaWdodABLUF9SaWdodABCb29rbWFuLUxpZ2h0AGd0AEtQX0xlZnQAY2hhcnNldABpbnNldABiaXRhcnJheV9yZXNldABndl9hcmVuYV9yZXNldABzdWJzZXQAYml0YXJyYXlfc2V0AG1hdHJpeF9zZXQAc2NhcmxldAAvc3ZnL2Rhcmt2aW9sZXQAL3N2Zy9ibHVldmlvbGV0AC9zdmcvdmlvbGV0AFRyZWJ1Y2hldABhZ3hnZXQAdGFpbHRhcmdldABsYWJlbHRhcmdldABlZGdldGFyZ2V0AGhlYWR0YXJnZXQAYml0YXJyYXlfZ2V0AHN0eWxlc2hlZXQAc3RyaWN0AGFnY29weWRpY3QAYWdtYWtlZGF0YWRpY3QAcmVjLT5kaWN0ID09IGRhdGFkaWN0AHdyaXRlX2RpY3QAaGludGVyc2VjdABndmJpc2VjdABlbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIGRlY2xhcmF0aW9uIGlzIGluY29ycmVjdABhc3BlY3QAbGF5ZXJzZWxlY3QAS1BfU3VidHJhY3QAUXVhZFRyZWVfcmVwdWxzaXZlX2ZvcmNlX2ludGVyYWN0AGNvbXBhY3QAT2N0AHJlcXVlc3RlZCBmZWF0dXJlIHJlcXVpcmVzIFhNTF9EVEQgc3VwcG9ydCBpbiBFeHBhdABsYWJlbGZsb2F0AGxhYmVsX2Zsb2F0AFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfZm9ybWF0AC9zdmcvd2hlYXQAbW9uY2hhaW5zX2F0AFNhdABBZ3JhcGhpbmZvX3QAQWdlZGdlaW5mb190AEFnbm9kZWluZm9fdABcdAByb3cgPCBtZS0+bnJvd3MAbWludXMAb3BsdXMAcmFkaXVzAGhlYXJ0cwBzYW1wbGVwb2ludHMAZGlyZWRnZWNvbnN0cmFpbnRzAGxldmVsIGFzc2lnbm1lbnQgY29uc3RyYWludHMAeHkgcHNldWRvLW9ydGhvZ29uYWwgY29uc3RyYWludHMAeXggcHNldWRvLW9ydGhvZ29uYWwgY29uc3RyYWludHMAeHkgb3J0aG9nb25hbCBjb25zdHJhaW50cwB5eCBvcnRob2dvbmFsIGNvbnN0cmFpbnRzAGxpbmUgc2VnbWVudHMAc2V0X2NlbGxfaGVpZ2h0cwByZWN0cwBhY2NvdW50aW5nUmVwb3J0U3RhdHMAZW50aXR5VHJhY2tpbmdSZXBvcnRTdGF0cwBaYXBmRGluZ2JhdHMAcmVtaW5jcm9zcwBjb21wcmVzcwBndnVzZXJzaGFwZV9maWxlX2FjY2VzcwBicmFzcwBjbGFzcwBhcHBseWF0dHJzAGFnbWFrZWF0dHJzAGJpbmRhdHRycwBwYXJzZV9sYXllcnMAbWtDbHVzdGVycwByb3VuZF9jb3JuZXJzAG1ha2VfYmFycmllcnMAY2RhdGEubnRvcGxldmVsID09IGFnbm5vZGVzKGcpIC0gY2RhdGEubnZhcnMAY2Fubm90IHJlYWxsb2Mgb3BzAGNhbm5vdCByZWFsbG9jIHBubHBzAGVwcwBjb3JlX2xvYWRpbWFnZV9wcwBlcHM6cHMAcHMyOnBzAChsaWIpOnBzAGd2X3RyaW1femVyb3MAYWd4YnVmX3RyaW1femVyb3MAdGV4Z3lyZWhlcm9zAGltYWdlcG9zAHRpbm9zAHNldEVkZ2VMYWJlbFBvcwBTZXR0aW5nIGluaXRpYWwgcG9zaXRpb25zAHhsaW50ZXJzZWN0aW9ucwBjb2x1bW5zAGRlamF2dXNhbnMAbmltYnVzc2FucwBsaWJlcmF0aW9uc2FucwBmcmVlc2FucwBzZXRDaGlsZFN1YnRyZWVTcGFucwBPcGVuU2FucwBvZmZzZXQgPT0gbl90ZXJtcwBkaXRlbXMAZGlhbXMAY29sIDwgbWUtPm5jb2xzAGNhbm5vdCByZWFsbG9jIGRxLnBubHMAY2Fubm90IHJlYWxsb2MgcG5scwBsZXZlbHMAZm9yY2VsYWJlbHMAZGlhZ29uYWxzAG1lcmdlX3JhbmtzAHNwbGl0QmxvY2tzAGludmlzAGNhbm5vdCByZWFsbG9jIHRyaXMAc2V0X2NlbGxfd2lkdGhzAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzAHllcwBzaG93Ym94ZXMAYmVhdXRpZnlfbGVhdmVzAGF0dGFjaF9lZGdlX2xhYmVsX2Nvb3JkaW5hdGVzAHBvbHlsaW5lcwBzcGxpbmVzAG9ydGhvZ29uYWwgbGluZXMAdGV4Z3lyZXRlcm1lcwBvdGltZXMAVGltZXMAZm9udG5hbWVzAHByZWZpeCBtdXN0IG5vdCBiZSBib3VuZCB0byBvbmUgb2YgdGhlIHJlc2VydmVkIG5hbWVzcGFjZSBuYW1lcwBTcGFyc2VNYXRyaXhfc3VtX3JlcGVhdF9lbnRyaWVzAHBlcmlwaGVyaWVzAEdldEJyYW5jaGVzAGYgPCBncmFwaFtqXS5uZWRnZXMAbWlubWF4X2VkZ2VzAGV4Y2hhbmdlX3RyZWVfZWRnZXMAbWFrZVN0cmFpZ2h0RWRnZXMAdW5kb0NsdXN0ZXJFZGdlcwBjb21wb3VuZEVkZ2VzAG1lcmdlX3RyZWVzAF9fY2x1c3Rlcm5vZGVzAGFnbm5vZGVzAE5EX2lkKG5wKSA9PSBuX25vZGVzAExvYWROb2RlcwBzaWRlcwBzcGFkZXMAdmVydGljZXMAY29vcmRzAHNldGJvdW5kcwBtZHMAY2RzAG1ha2VTZWxmQXJjcwBlbWl0X2VkZ2VfZ3JhcGhpY3MAY2x1YnMAY29uc29sYXMAJWxmJTJzAApTdHJpbmcgc3RhcnRpbmc6PCUuODBzAApTdHJpbmcgc3RhcnRpbmc6IiUuODBzACAlLipzACVzJXMAZXhwYXQ6IEFjY291bnRpbmcoJXApOiBEaXJlY3QgJTEwbGx1LCBpbmRpcmVjdCAlMTBsbHUsIGFtcGxpZmljYXRpb24gJTguMmYlcwAlLipzJWMlcwAgJXM6JXMAX18lZDolcwAvJXMvJXMAJXMtJXMALCVzACBmb250LWZhbWlseT0iJXMAIiBzdHJva2UtZGFzaGFycmF5PSIlcwAiIGNsYXNzPSIlcwBwb2x5ICVzACgoJWYsJWYpLCglZiwlZikpICVzICVzAGNvbG9yICVzAHJvb3QgPSAlcwAgVGl0bGU6ICVzACJzdHJpY3QiOiAlcwBjb3VyAHV0cgBhcHBlbmRhdHRyAGFkZGF0dHIAYmVnaW5zdHIAZnN0cgBzdHJ2aWV3X3N0cgBwb3ZfY29sb3JfYXNfc3RyAHZwc2MhPW51bGxwdHIAYmVuZFRvU3RyAHVhcnIAY3JhcnIAbGFycgBoYXJyAGRhcnIAdUFycgByQXJyAGxBcnIAaEFycgBkQXJyAEFwcgBTcGFyc2VNYXRyaXhfbXVsdGlwbHlfdmVjdG9yAHRlcm1pbmF0b3IAaW5zdWxhdG9yAGludGVybmFsRW50aXR5UHJvY2Vzc29yAHRleGd5cmVjdXJzb3IAc3ludGF4IGVycm9yAG1vbmV5X2dldCBlcnJvcgBFcnJvcgByZmxvb3IAbGZsb29yAGxhYmVsZm9udGNvbG9yAHBlbmNvbG9yAGZpbGxjb2xvcgBiZ2NvbG9yAHJvdyBtYWpvcgBjb2x1bW4gbWFqb3IAbmVpZ2hib3IAc3R5bGVfb3IAbXIAcmFua2RpcgBwYWdlZGlyAGxheWVyAHVwcGVyID49IGxvd2VyAE5vZGVDb3ZlcgAvc3ZnL3NpbHZlcgBjbHVzdGVyAGV4cGFuZENsdXN0ZXIAcnByb21vdGVyAGxwcm9tb3RlcgBjZW50ZXIAbWF4aXRlcgBwYXJ0aWFsIGNoYXJhY3RlcgAhIHJvb3RQYXJzZXItPm1fcGFyZW50UGFyc2VyAGRrZ3JlZW5jb3BwZXIAY29vbGNvcHBlcgBndl9zb3J0X2NvbXBhcl93cmFwcGVyAHRhcGVyAG92ZXJsYXBfYmV6aWVyAGZpZ19iZXppZXIAY291cmllcgBDb3VyaWVyAGhpZXIAZGFnZ2VyAERhZ2dlcgBvdXRwdXRvcmRlcgBwb3N0b3JkZXIAZmxhdF9yZW9yZGVyAGNlbGxib3JkZXIAZml4TGFiZWxPcmRlcgBjeWxpbmRlcgAvc3ZnL2xhdmVuZGVyAHJlbmRlcgBmb2xkZXIAY2x1c3Rlcl9sZWFkZXIATkRfVUZfc2l6ZShuKSA8PSAxIHx8IG4gPT0gbGVhZGVyAE9jdG9iZXIAcmVmZXJlbmNlIHRvIGludmFsaWQgY2hhcmFjdGVyIG51bWJlcgBOb3ZlbWJlcgBTZXB0ZW1iZXIARGVjZW1iZXIAbWFjcgBicgBzdGFyAGZlbGRzcGFyAHJlZ3VsYXIAaW9zX2Jhc2U6OmNsZWFyAGJydmJhcgBNYXIAXHIATkRfcmFuayh2KSA9PSByAHN0cmVxAHN0cnZpZXdfZXEAc3Rydmlld19zdHJfZXEAc3Rydmlld19jYXNlX3N0cl9lcQBzdHJ2aWV3X2Nhc2VfZXEAdnAAJSVCZWdpblByb2xvZwovRG90RGljdCAyMDAgZGljdCBkZWYKRG90RGljdCBiZWdpbgoKL3NldHVwTGF0aW4xIHsKbWFyawovRW5jb2RpbmdWZWN0b3IgMjU2IGFycmF5IGRlZgogRW5jb2RpbmdWZWN0b3IgMAoKSVNPTGF0aW4xRW5jb2RpbmcgMCAyNTUgZ2V0aW50ZXJ2YWwgcHV0aW50ZXJ2YWwKRW5jb2RpbmdWZWN0b3IgNDUgL2h5cGhlbiBwdXQKCiUgU2V0IHVwIElTTyBMYXRpbiAxIGNoYXJhY3RlciBlbmNvZGluZwovc3Rhcm5ldElTTyB7CiAgICAgICAgZHVwIGR1cCBmaW5kZm9udCBkdXAgbGVuZ3RoIGRpY3QgYmVnaW4KICAgICAgICB7IDEgaW5kZXggL0ZJRCBuZSB7IGRlZiB9eyBwb3AgcG9wIH0gaWZlbHNlCiAgICAgICAgfSBmb3JhbGwKICAgICAgICAvRW5jb2RpbmcgRW5jb2RpbmdWZWN0b3IgZGVmCiAgICAgICAgY3VycmVudGRpY3QgZW5kIGRlZmluZWZvbnQKfSBkZWYKL1RpbWVzLVJvbWFuIHN0YXJuZXRJU08gZGVmCi9UaW1lcy1JdGFsaWMgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGQgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGRJdGFsaWMgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYSBzdGFybmV0SVNPIGRlZgovSGVsdmV0aWNhLU9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYS1Cb2xkIHN0YXJuZXRJU08gZGVmCi9IZWx2ZXRpY2EtQm9sZE9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXIgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXItT2JsaXF1ZSBzdGFybmV0SVNPIGRlZgovQ291cmllci1Cb2xkIHN0YXJuZXRJU08gZGVmCi9Db3VyaWVyLUJvbGRPYmxpcXVlIHN0YXJuZXRJU08gZGVmCmNsZWFydG9tYXJrCn0gYmluZCBkZWYKCiUlQmVnaW5SZXNvdXJjZTogcHJvY3NldCBncmFwaHZpeiAwIDAKL2Nvb3JkLWZvbnQtZmFtaWx5IC9UaW1lcy1Sb21hbiBkZWYKL2RlZmF1bHQtZm9udC1mYW1pbHkgL1RpbWVzLVJvbWFuIGRlZgovY29vcmRmb250IGNvb3JkLWZvbnQtZmFtaWx5IGZpbmRmb250IDggc2NhbGVmb250IGRlZgoKL0ludlNjYWxlRmFjdG9yIDEuMCBkZWYKL3NldF9zY2FsZSB7CiAgICAgICBkdXAgMSBleGNoIGRpdiAvSW52U2NhbGVGYWN0b3IgZXhjaCBkZWYKICAgICAgIHNjYWxlCn0gYmluZCBkZWYKCiUgc3R5bGVzCi9zb2xpZCB7IFtdIDAgc2V0ZGFzaCB9IGJpbmQgZGVmCi9kYXNoZWQgeyBbOSBJbnZTY2FsZUZhY3RvciBtdWwgZHVwIF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2RvdHRlZCB7IFsxIEludlNjYWxlRmFjdG9yIG11bCA2IEludlNjYWxlRmFjdG9yIG11bF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2ludmlzIHsvZmlsbCB7bmV3cGF0aH0gZGVmIC9zdHJva2Uge25ld3BhdGh9IGRlZiAvc2hvdyB7cG9wIG5ld3BhdGh9IGRlZn0gYmluZCBkZWYKL2JvbGQgeyAyIHNldGxpbmV3aWR0aCB9IGJpbmQgZGVmCi9maWxsZWQgeyB9IGJpbmQgZGVmCi91bmZpbGxlZCB7IH0gYmluZCBkZWYKL3JvdW5kZWQgeyB9IGJpbmQgZGVmCi9kaWFnb25hbHMgeyB9IGJpbmQgZGVmCi90YXBlcmVkIHsgfSBiaW5kIGRlZgoKJSBob29rcyBmb3Igc2V0dGluZyBjb2xvciAKL25vZGVjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2VkZ2Vjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2dyYXBoY29sb3IgeyBzZXRoc2Jjb2xvciB9IGJpbmQgZGVmCi9ub3Bjb2xvciB7cG9wIHBvcCBwb3B9IGJpbmQgZGVmCgovYmVnaW5wYWdlIHsJJSBpIGogbnBhZ2VzCgkvbnBhZ2VzIGV4Y2ggZGVmCgkvaiBleGNoIGRlZgoJL2kgZXhjaCBkZWYKCS9zdHIgMTAgc3RyaW5nIGRlZgoJbnBhZ2VzIDEgZ3QgewoJCWdzYXZlCgkJCWNvb3JkZm9udCBzZXRmb250CgkJCTAgMCBtb3ZldG8KCQkJKFwoKSBzaG93IGkgc3RyIGN2cyBzaG93ICgsKSBzaG93IGogc3RyIGN2cyBzaG93IChcKSkgc2hvdwoJCWdyZXN0b3JlCgl9IGlmCn0gYmluZCBkZWYKCi9zZXRfZm9udCB7CglmaW5kZm9udCBleGNoCglzY2FsZWZvbnQgc2V0Zm9udAp9IGRlZgoKJSBkcmF3IHRleHQgZml0dGVkIHRvIGl0cyBleHBlY3RlZCB3aWR0aAovYWxpZ25lZHRleHQgewkJCSUgd2lkdGggdGV4dAoJL3RleHQgZXhjaCBkZWYKCS93aWR0aCBleGNoIGRlZgoJZ3NhdmUKCQl3aWR0aCAwIGd0IHsKCQkJW10gMCBzZXRkYXNoCgkJCXRleHQgc3RyaW5nd2lkdGggcG9wIHdpZHRoIGV4Y2ggc3ViIHRleHQgbGVuZ3RoIGRpdiAwIHRleHQgYXNob3cKCQl9IGlmCglncmVzdG9yZQp9IGRlZgoKL2JveHByaW0gewkJCQklIHhjb3JuZXIgeWNvcm5lciB4c2l6ZSB5c2l6ZQoJCTQgMiByb2xsCgkJbW92ZXRvCgkJMiBjb3B5CgkJZXhjaCAwIHJsaW5ldG8KCQkwIGV4Y2ggcmxpbmV0bwoJCXBvcCBuZWcgMCBybGluZXRvCgkJY2xvc2VwYXRoCn0gYmluZCBkZWYKCi9lbGxpcHNlX3BhdGggewoJL3J5IGV4Y2ggZGVmCgkvcnggZXhjaCBkZWYKCS95IGV4Y2ggZGVmCgkveCBleGNoIGRlZgoJbWF0cml4IGN1cnJlbnRtYXRyaXgKCW5ld3BhdGgKCXggeSB0cmFuc2xhdGUKCXJ4IHJ5IHNjYWxlCgkwIDAgMSAwIDM2MCBhcmMKCXNldG1hdHJpeAp9IGJpbmQgZGVmCgovZW5kcGFnZSB7IHNob3dwYWdlIH0gYmluZCBkZWYKL3Nob3dwYWdlIHsgfSBkZWYKCi9sYXllcmNvbG9yc2VxCglbCSUgbGF5ZXIgY29sb3Igc2VxdWVuY2UgLSBkYXJrZXN0IHRvIGxpZ2h0ZXN0CgkJWzAgMCAwXQoJCVsuMiAuOCAuOF0KCQlbLjQgLjggLjhdCgkJWy42IC44IC44XQoJCVsuOCAuOCAuOF0KCV0KZGVmCgovbGF5ZXJsZW4gbGF5ZXJjb2xvcnNlcSBsZW5ndGggZGVmCgovc2V0bGF5ZXIgey9tYXhsYXllciBleGNoIGRlZiAvY3VybGF5ZXIgZXhjaCBkZWYKCWxheWVyY29sb3JzZXEgY3VybGF5ZXIgMSBzdWIgbGF5ZXJsZW4gbW9kIGdldAoJYWxvYWQgcG9wIHNldGhzYmNvbG9yCgkvbm9kZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZWRnZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZ3JhcGhjb2xvciB7bm9wY29sb3J9IGRlZgp9IGJpbmQgZGVmCgovb25sYXllciB7IGN1cmxheWVyIG5lIHtpbnZpc30gaWYgfSBkZWYKCi9vbmxheWVycyB7CgkvbXl1cHBlciBleGNoIGRlZgoJL215bG93ZXIgZXhjaCBkZWYKCWN1cmxheWVyIG15bG93ZXIgbHQKCWN1cmxheWVyIG15dXBwZXIgZ3QKCW9yCgl7aW52aXN9IGlmCn0gZGVmCgovY3VybGF5ZXIgMCBkZWYKCiUlRW5kUmVzb3VyY2UKJSVFbmRQcm9sb2cKJSVCZWdpblNldHVwCjE0IGRlZmF1bHQtZm9udC1mYW1pbHkgc2V0X2ZvbnQKJSAvYXJyb3dsZW5ndGggMTAgZGVmCiUgL2Fycm93d2lkdGggNSBkZWYKCiUgbWFrZSBzdXJlIHBkZm1hcmsgaXMgaGFybWxlc3MgZm9yIFBTLWludGVycHJldGVycyBvdGhlciB0aGFuIERpc3RpbGxlcgovcGRmbWFyayB3aGVyZSB7cG9wfSB7dXNlcmRpY3QgL3BkZm1hcmsgL2NsZWFydG9tYXJrIGxvYWQgcHV0fSBpZmVsc2UKJSBtYWtlICc8PCcgYW5kICc+Picgc2FmZSBvbiBQUyBMZXZlbCAxIGRldmljZXMKL2xhbmd1YWdlbGV2ZWwgd2hlcmUge3BvcCBsYW5ndWFnZWxldmVsfXsxfSBpZmVsc2UKMiBsdCB7CiAgICB1c2VyZGljdCAoPDwpIGN2biAoWykgY3ZuIGxvYWQgcHV0CiAgICB1c2VyZGljdCAoPj4pIGN2biAoWykgY3ZuIGxvYWQgcHV0Cn0gaWYKCiUlRW5kU2V0dXAAc3VwAGdyb3VwAGN1cAB0aGluc3AAZW5zcABlbXNwAG5ic3AAcGVycAB3ZWllcnAAZ2VuZXJhdGUtY29uc3RyYWludHMuY3BwAGJsb2NrLmNwcABjc29sdmVfVlBTQy5jcHAAf3RvcABwcm9wAGFneGJwb3AAbm9wAGFzeW1wAGNvbXAAZmluZENDb21wAGJtcABzY2FsZV9jbGFtcAB4bHAAbHAgIT0gY2xwAHRhaWxfbHAAaGVhZF9scAB0YWlsdG9vbHRpcABsYWJlbHRvb2x0aXAAZWRnZXRvb2x0aXAAaGVhZHRvb2x0aXAAaGVsbGlwAHRhaWxjbGlwAGhlYWRjbGlwAC9zdmcvcGFwYXlhd2hpcABocAB0cmFuc3Bvc2Vfc3RlcABjb21wdXRlU3RlcABsYXllcmxpc3RzZXAAbGF5ZXJzZXAAaXBzZXAAcmFua3NlcABub2Rlc2VwAHN1YmdyYXBocyBuZXN0ZWQgbW9yZSB0aGFuICVkIGRlZXAAU2VwAHNmZHAAY3AAd2VicABpZG1hcABjbHVzdGVyX21hcABjbWFweDptYXAAZXBzOm1hcABjbWFweF9ucDptYXAAaW1hcF9ucDptYXAAaXNtYXA6bWFwAGltYXA6bWFwAGNtYXA6bWFwAHN2ZzptYXAAanBnOm1hcABwbmc6bWFwAGpwZWc6bWFwAGdpZjptYXAAanBlOm1hcABvdmVybGFwAGxldmVsc2dhcABjYXAAS1BfVXAAJUk6JU06JVMgJXAAc3RhcnQgPD0gcAByc3F1bwBsc3F1bwByZHF1bwBsZHF1bwBiZHF1bwBzYnF1bwByc2FxdW8AbHNhcXVvAHJhcXVvAGxhcXVvAGF1dG8ATnVuaXRvAC9zdmcvdG9tYXRvAG5lYXRvAGV1cm8AL3N2Zy9nYWluc2Jvcm8ATWV0aG9kWmVybwBtaWNybwBuaW1idXNtb25vAGxpYmVyYXRpb25tb25vAGZyZWVtb25vAGFyaW1vAHJhdGlvAHBvcnRobwByaG8AUmhvAC9zdmcvaW5kaWdvAHBpbmZvAGNjZ3JhcGhpbmZvAGNjZ25vZGVpbmZvAGNsX2VkZ2VfaW5mbwBnZXRQYWNrSW5mbwBtYWtlSW5mbwBwYXJzZVBhY2tNb2RlSW5mbwBjaXJjbwBpY28AXCUwM28AL3N2Zy9yb3N5YnJvd24AL3N2Zy9zYW5keWJyb3duAHZlcnlkYXJrYnJvd24AL3N2Zy9zYWRkbGVicm93bgAvc3ZnL2Jyb3duAEtQX0Rvd24AY2Fubm90IGNoYW5nZSBzZXR0aW5nIG9uY2UgcGFyc2luZyBoYXMgYmVndW4AU3VuAEp1bgB0aG9ybgAvc3ZnL2NyaW1zb24AeGRvdF9qc29uAHhkb3RfanNvbjpqc29uAGpzb24wOmpzb24Ab21pY3JvbgBPbWljcm9uAHNjYXJvbgBTY2Fyb24Ad2VibWFyb29uAHgxMW1hcm9vbgAvc3ZnL21hcm9vbgAvc3ZnL2xpZ2h0c2FsbW9uAC9zdmcvZGFya3NhbG1vbgAvc3ZnL3NhbG1vbgB1cHNpbG9uAGVwc2lsb24AVXBzaWxvbgBFcHNpbG9uAHJlc29sdXRpb24AZGlzdG9ydGlvbgBzdGQ6OmV4Y2VwdGlvbgBwYXJ0aXRpb24AZG90X3Bvc2l0aW9uAFNldHRpbmcgdXAgc3RyZXNzIGZ1bmN0aW9uAHVuY2xvc2VkIENEQVRBIHNlY3Rpb24AcG9zdGFjdGlvbgByb3RhdGlvbgBvcmllbnRhdGlvbgBhYm9taW5hdGlvbgBhY2NvdW50aW5nR2V0Q3VycmVudEFtcGxpZmljYXRpb24AeGRvdHZlcnNpb24AU1RzZXRVbmlvbgA8cG9seWdvbgBoZXhhZ29uAHNlcHRhZ29uAHBlbnRhZ29uAHRyaXBsZW9jdGFnb24AZG91Ymxlb2N0YWdvbgAvc3ZnL2xlbW9uY2hpZmZvbgBNb24AcGx1c21uAG5vdGluAGlzaW4AL3N2Zy9tb2NjYXNpbgBwaW4AbWluAHZvcm9fbWFyZ2luAGluZmluAG9uZWRfb3B0aW1pemVyX3RyYWluAHBsYWluAG1ha2VfY2hhaW4AbWVyZ2VfY2hhaW4AZGVsZXRlTWluAGZpbmRNaW4AdmFsaWduAGJhbGlnbgB5ZW4ATXVsdGlsZXZlbF9jb2Fyc2VuAGN1cnJlbgBQb2Jzb3BlbgBndl9mb3BlbgBndnVzZXJzaGFwZV9vcGVuAGVudGl0eVRyYWNraW5nT25PcGVuAC9zdmcvbGluZW4AZGltZW4AbWlubGVuAHN0eWxlX3Rva2VuAHVuY2xvc2VkIHRva2VuAC9zdmcveWVsbG93Z3JlZW4AbWVkaXVtZm9yZXN0Z3JlZW4AL3N2Zy9mb3Jlc3RncmVlbgAvc3ZnL2xpZ2h0Z3JlZW4AaHVudGVyc2dyZWVuAC9zdmcvbGF3bmdyZWVuAC9zdmcvZGFya2dyZWVuAC9zdmcvbWVkaXVtc3ByaW5nZ3JlZW4AL3N2Zy9zcHJpbmdncmVlbgAvc3ZnL2RhcmtvbGl2ZWdyZWVuAC9zdmcvbGltZWdyZWVuAC9zdmcvcGFsZWdyZWVuAHdlYmdyZWVuAC9zdmcvbGlnaHRzZWFncmVlbgAvc3ZnL21lZGl1bXNlYWdyZWVuAC9zdmcvZGFya3NlYWdyZWVuAC9zdmcvc2VhZ3JlZW4AeDExZ3JlZW4AL3N2Zy9ncmVlbgBHcmVlbgAvc3ZnL2xpZ2h0Y3lhbgAvc3ZnL2RhcmtjeWFuAC9zdmcvY3lhbgBuZXd0YW4AZGFya3RhbgAvc3ZnL3RhbgByb3dzcGFuAGNvbHNwYW4AbmFuAHRpbWVzbmV3cm9tYW4AbmltYnVzcm9tYW4AdGltZXNyb21hbgBUaW1lcy1Sb21hbgBQYWxhdGluby1Sb21hbgBOZXdDZW50dXJ5U2NobGJrLVJvbWFuAEphbgBHRF9yYW5rKGcpW3JdLm4gPD0gR0RfcmFuayhnKVtyXS5hbgBhZ3hicHV0X24AXG4Abl9ub2RlcyA9PSBncmFwaC0+bgBBLT5tID09IEEtPm4Aam9iLT5vYmotPnUubgBuemMgPT0gKHNpemVfdCluAHMsJWxmLCVsZiVuACBlLCVsZiwlbGYlbgAlZCAlMVsiXSVuAHYgPT0gbgBiID09IG4AbmNsdXN0ZXIgPD0gbgBwc3ltAGFsZWZzeW0AdGhldGFzeW0AcXVhbnR1bQBzdW0AL3N2Zy9wbHVtAGludnRyYXBleml1bQBtZWRpdW0AOTpwcmlzbQBscm0AY3VzdG9tAGFwdHItPnRhZyA9PSBUX2F0b20AL2Rldi91cmFuZG9tAGd2X3JhbmRvbQBtbQBybG0Ac2ltAElNRFNfZ2l2ZW5fZGltAG9yZG0AY20AcGFyYWxsZWxvZ3JhbQAvc3ZnL21pbnRjcmVhbQBKdWwAdGwAZnJhc2wAU3ltYm9sAGZpbmRDb2wAPD94bWwAeXVtbAB1dW1sAG91bWwAaXVtbABldW1sAGF1bWwAWXVtbABVdW1sAE91bWwASXVtbABFdW1sAEF1bWwAY29yZV9sb2FkaW1hZ2VfdnJtbABqcGc6dnJtbABwbmc6dnJtbABqcGVnOnZybWwAZ2lmOnZybWwAanBlOnZybWwAYnVsbABmaWxsAC9zdmcvc2Vhc2hlbGwAZm9yYWxsAEFwcmlsAHBlcm1pbAByY2VpbABsY2VpbABjY2VkaWwAQ2NlZGlsAGFycm93dGFpbABsdGFpbABzYW1ldGFpbABsZXZlbCA+PSAwICYmIGxldmVsIDw9IG4tPmxldmVsAHN0cmVzc19tYWpvcml6YXRpb25fa0RfbWtlcm5lbABpc19wYXJhbGxlbABDYWxjdWxhdGluZyBjaXJjdWl0IG1vZGVsAENhbGN1bGF0aW5nIHN1YnNldCBtb2RlbABDYWxjdWxhdGluZyBNRFMgbW9kZWwAeGxhYmVsAHRhaWxsYWJlbABoZWFkbGFiZWwAZ3JhcGggbGFiZWwAaWV4Y2wAb2JqcC0+bGJsAG92YWwAbWVyZ2V2aXJ0dWFsAC9zdmcvbGlnaHRjb3JhbAAvc3ZnL2NvcmFsAFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfYXJyYXlzX2ludGVybmFsAE11bHRpbGV2ZWxfY29hcnNlbl9pbnRlcm5hbABRdWFkVHJlZV9hZGRfaW50ZXJuYWwAYXJyb3dfbGVuZ3RoX25vcm1hbABhcmlhbAByYWRpYWwAL3N2Zy90ZWFsAHJlYWwAbG9jYWwAZXN0aW1hdGVfY2hhcmFjdGVyX3dpZHRoX2Nhbm9uaWNhbABnbG9iYWwAcS0+bAAuLi8uLi9saWIvY2dyYXBoL3NjYW4ubAB0azp0awBnaWY6dGsAcGF0Y2h3b3JrAHRvawBib29rAEF2YW50R2FyZGUtQm9vawBzaW5rAG92ZXJsYXBfc2hyaW5rAHNwaWN5cGluawAvc3ZnL2hvdHBpbmsAL3N2Zy9saWdodHBpbmsAL3N2Zy9kZWVwcGluawBuZW9ucGluawAvc3ZnL3BpbmsAbmV3cmFuawBjbHVzdGVycmFuawBfbmV3X3JhbmsAaW5zdGFsbF9pbl9yYW5rAHJlbW92ZV9mcm9tX3JhbmsAL3N2Zy9jb3Juc2lsawBvbmVibG9jawB2LT5sZWZ0LT5ibG9jayA9PSB2LT5yaWdodC0+YmxvY2sAL3N2Zy9maXJlYnJpY2sAUFFjaGVjawBwYWNrAC9zdmcvYmxhY2sAQmxhY2sAYmFjawB6d2oAenduagBqb2ItPm9iagBnZXRpbnRyc3hpAHBzaQBQc2kAQ2FsaWJyaQBGcmkAdHdvcGkAZHBpAHZvcm9ub2kAVm9yb25vaQBjaGFuaQBkZW1pAEJvb2ttYW4tRGVtaQBBdmFudEdhcmRlLURlbWkAL3N2Zy9kYXJra2hha2kAL3N2Zy9raGFraQBwaGkAY2hpAFBoaQBDaGkAZGkAWGkAUGkATkRfaWQobnApID09IGkATl9JRFgocHEtPnBxW2ldKSA9PSBpAFN0cmVzc01ham9yaXphdGlvblNtb290aGVyX3Ntb290aABTcHJpbmdTbW9vdGhlcl9zbW9vdGgAYm90aABzdGFydHN3aXRoAGxpbmVsZW5ndGgAYmFkX2FycmF5X25ld19sZW5ndGgAYXZlcmFnZV9lZGdlX2xlbmd0aABldGgAcGVud2lkdGgAbHdpZHRoAHNldGxpbmV3aWR0aABzaG9ydHBhdGgAZm9udHBhdGgAUG9ic3BhdGgAYmVnaW5wYXRoAGltYWdlcGF0aABlbmRwYXRoAHN0cmFpZ2h0X3BhdGgAbWFwX3BhdGgAPHBhdGgAY2Fubm90IGZpbmQgdHJpYW5nbGUgcGF0aAAvc3ZnL2xhdmVuZGVyYmx1c2gAZmxlc2gAb3NsYXNoAE9zbGFzaABkdHN0cmhhc2gAc3RyZGljdF9oYXNoAG5kYXNoAG1kYXNoAGRpZ3JhcGgAc3ViZ3JhcGgAY29uc3RydWN0X2dyYXBoAGNoa1NncmFwaABjbG9zZXN0X3BhaXJzMmdyYXBoAGFnZGVsZXRlIG9uIHdyb25nIGdyYXBoAGNvbm5lY3RHcmFwaAB1cHNpaAAlc2xpbmUtdGhyb3VnaABjaGFuU2VhcmNoAFJUcmVlU2VhcmNoAE1hcmNoAERpc2NvbkJyYW5jaABQaWNrQnJhbmNoAEFkZEJyYW5jaAAuLi8uLi9saWIvdXRpbC9iaXRhcnJheS5oAC4uLy4uL2xpYi91dGlsL3N0cnZpZXcuaAAuLi8uLi9saWIvdXRpbC9zb3J0LmgALi4vLi4vbGliL2NncmFwaC9ub2RlX3NldC5oAC4uLy4uL2xpYi91dGlsL3N0cmVxLmgALi4vLi4vbGliL3V0aWwvc3RhcnRzd2l0aC5oAC4uLy4uL2xpYi91dGlsL2d2X21hdGguaAAuLi8uLi9saWIvdXRpbC9hZ3hidWYuaAAuLi8uLi9saWIvdXRpbC90b2tlbml6ZS5oAC4uLy4uL2xpYi91dGlsL2FsbG9jLmgAYXV4ZwBjb3JlX2xvYWRpbWFnZV9zdmcAc3ZnOnN2ZwBqcGc6c3ZnAHBuZzpzdmcAanBlZzpzdmcAZ2lmOnN2ZwBqcGU6c3ZnAHN2Z19pbmxpbmU6c3ZnAEF1ZwBkb1Byb2xvZwBwb3dlcl9pdGVyYXRpb25fb3J0aG9nAHBuZwBpZGVhbF9kaXN0X3NjaGVtZSB2YWx1ZSB3cm9uZwB4ZG90IHZlcnNpb24gIiVzIiB0b28gbG9uZwBjb25nAGxibGVuY2xvc2luZwBiYXNpY19zdHJpbmcAZmFpbHVyZSBtYWxsb2MnaW5nIGZvciByZXN1bHQgc3RyaW5nAHNwcmluZwBvcmRlcmluZwBnZW5lcmF0ZVJhbmRvbU9yZGVyaW5nAGFyaW5nAEFyaW5nAERhbXBpbmcAV2FybmluZwBvdmVybGFwX3NjYWxpbmcAeCBhbmQgeSBzY2FsaW5nAG9sZCBzY2FsaW5nAHNtb290aGluZwB1bmtub3duIGVuY29kaW5nAG11bHRpbGV2ZWxfc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nAHNwcmluZ19lbGVjdHJpY2FsX3NwcmluZ19lbWJlZGRpbmcAY2VsbHBhZGRpbmcAY2VsbHNwYWNpbmcAcmFuZwBsYW5nAGZpdmVwb3ZlcmhhbmcAdGhyZWVwb3ZlcmhhbmcAbm92ZXJoYW5nAGVtaXRfaHRtbF9pbWcAbGcAb3JpZwBzemxpZwBvZWxpZwBhZWxpZwBPRWxpZwBBRWxpZwBjb3JlX2xvYWRpbWFnZV9maWcAanBnOmZpZwBwbmc6ZmlnAGZpZzpmaWcAanBlZzpmaWcAZ2lmOmZpZwBqcGU6ZmlnAGVnZwBuZXh0X3NlZwByZWcAanBlZwBpID09IGRlZwBkZwBjZwBjbG9zZXN1YmcAbWlzbWF0Y2hlZCB0YWcAYmV6LT5zZmxhZwBiZXotPmVmbGFnACEqZmxhZwAhZmxhZwA8ZwAlLjVnLCUuNWcsJS41ZywlLjVnACUuNWcgJS41ZwAlZyAlZwBib3hJbnRlcnNlY3RmAGVwc2YAYWdlZGdlc2VxY21wZgBjY3dyb3RhdGVwZgBmbm9mAGluZgBzZWxmAGhhbGYAJWxmJWxmJWxmJWxmACVsZiwlbGYsJWxmLCVsZiwlbGYAJSpmICUqZiAlbGYgJWxmAGxpYmVyYXRpb25zZXJpZgBmcmVlc2VyaWYAc2Fucy1TZXJpZgBnaWYAL3N2Zy9wZWFjaHB1ZmYAcmlmZgBhY2NvdW50aW5nUmVwb3J0RGlmZgAoWG1sQmlnQ291bnQpLTEgLSByb290UGFyc2VyLT5tX2FsbG9jX3RyYWNrZXIuYnl0ZXNBbGxvY2F0ZWQgPj0gYWJzRGlmZgB0YWlsaHJlZgBsYWJlbGhyZWYAZWRnZWhyZWYAaGVhZGhyZWYAb3JkZgBwZGYAc2lnbWFmAFxmACUuMExmACVMZgB1cy0+ZgAlLjAzZgAlcyB0cmFuc21pdCAlLjNmAHJnYjwlOS4zZiwgJTkuM2YsICU5LjNmPiB0cmFuc21pdCAlLjNmACUuMDJmACUuMmYAJS4wZiwlLjBmLCUuMGYsJS4wZgAgJS4wZiwlLjBmACUuMGYgJS4wZiAlLjBmICUuMGYAIiBmaWxsLW9wYWNpdHk9IiVmACIgc3Ryb2tlLW9wYWNpdHk9IiVmAApmaW5hbCBlID0gJWYAYnJvbnplAGFycm93c2l6ZQBsYWJlbGZvbnRzaXplAHNlYXJjaHNpemUAZml4ZWRzaXplAG5vZGVfc2V0X3NpemUAdGV4dHNwYW5fc2l6ZQBzdmdfc2l6ZQBpbmRleCA8IGxpc3QtPnNpemUAY2FwYWNpdHkgPiBkaWN0LT5zaXplAGNhcGFjaXR5ID4gc2VsZi0+c2l6ZQBiei5zaXplAHBvaW50LXNpemUAU0laRV9NQVggLSBzaXplb2Yoc2l6ZV90KSAtIEVYUEFUX01BTExPQ19QQURESU5HID49IHNpemUAbm9ybWFsaXplAEVMaW5pdGlhbGl6ZQBta01hemUAaWN1cnZlAHRyeV9yZXNlcnZlAG5vZGVfc2V0X3JlbW92ZQBzdHJkaWN0X3JlbW92ZQBzb2x2ZQAhdi0+YWN0aXZlAC1hY3RpdmUAZm9udF9pbl9saXN0X3Blcm1pc3NpdmUAL3N2Zy9vbGl2ZQB1Z3JhdmUAb2dyYXZlAGlncmF2ZQBlZ3JhdmUAYWdyYXZlAFVncmF2ZQBPZ3JhdmUASWdyYXZlAEVncmF2ZQBBZ3JhdmUAdHJ1ZQAvc3ZnL2Jpc3F1ZQBvYmxpcXVlAEF2YW50R2FyZGUtQm9va09ibGlxdWUAQXZhbnRHYXJkZS1EZW1pT2JsaXF1ZQBIZWx2ZXRpY2EtTmFycm93LUJvbGRPYmxpcXVlAENvdXJpZXItQm9sZE9ibGlxdWUASGVsdmV0aWNhLUJvbGRPYmxpcXVlAEhlbHZldGljYS1OYXJyb3ctT2JsaXF1ZQBDb3VyaWVyLU9ibGlxdWUASGVsdmV0aWNhLU9ibGlxdWUAbmF2eWJsdWUAL3N2Zy9saWdodHNreWJsdWUAL3N2Zy9kZWVwc2t5Ymx1ZQAvc3ZnL3NreWJsdWUAbmV3bWlkbmlnaHRibHVlAC9zdmcvbWlkbmlnaHRibHVlAC9zdmcvbGlnaHRibHVlAC9zdmcvY2FkZXRibHVlAC9zdmcvY29ybmZsb3dlcmJsdWUAL3N2Zy9kb2RnZXJibHVlAC9zdmcvcG93ZGVyYmx1ZQBuZW9uYmx1ZQAvc3ZnL21lZGl1bWJsdWUAL3N2Zy9saWdodHN0ZWVsYmx1ZQAvc3ZnL3N0ZWVsYmx1ZQAvc3ZnL3JveWFsYmx1ZQAvc3ZnL2RhcmtibHVlAHJpY2hibHVlAGxpZ2h0c2xhdGVibHVlAC9zdmcvbWVkaXVtc2xhdGVibHVlAC9zdmcvZGFya3NsYXRlYmx1ZQAvc3ZnL3NsYXRlYmx1ZQAvc3ZnL2FsaWNlYmx1ZQAvc3ZnL2JsdWUAY2FsbFN0b3JlRW50aXR5VmFsdWUAc3RvcmVBdHRyaWJ1dGVWYWx1ZQBCbHVlAG5lYXRvX2VucXVldWUAVHVlAHlhY3V0ZQB1YWN1dGUAb2FjdXRlAGlhY3V0ZQBlYWN1dGUAYWFjdXRlAFlhY3V0ZQBVYWN1dGUAT2FjdXRlAElhY3V0ZQBFYWN1dGUAQWFjdXRlAHJlZmVyZW5jZSB0byBleHRlcm5hbCBlbnRpdHkgaW4gYXR0cmlidXRlAGR1cGxpY2F0ZSBhdHRyaWJ1dGUAbm90ZQBwcmltZXJzaXRlAHJpYm9zaXRlAHJlc3RyaWN0aW9uc2l0ZQBwcm90ZWFzZXNpdGUAL3N2Zy9naG9zdHdoaXRlAC9zdmcvbmF2YWpvd2hpdGUAL3N2Zy9mbG9yYWx3aGl0ZQAvc3ZnL2FudGlxdWV3aGl0ZQAvc3ZnL3doaXRlAFdoaXRlAHBvcF9vYmpfc3RhdGUAcGNwX3JvdGF0ZQBjb25jZW50cmF0ZQBkZWNvcmF0ZQBRdWFkVHJlZV9yZXB1bHNpdmVfZm9yY2VfYWNjdW11bGF0ZQBub3RyYW5zbGF0ZQAvc3ZnL2Nob2NvbGF0ZQBwYXJzZXJDcmVhdGUAZ2VvbVVwZGF0ZQBpbnZob3VzZQAvc3ZnL2NoYXJ0cmV1c2UAWE1MX1BhcnNlADxlbGxpcHNlAGR1c3R5cm9zZQAvc3ZnL21pc3R5cm9zZQBTcGFyc2VNYXRyaXhfdHJhbnNwb3NlAGx1X2RlY29tcG9zZQBhZ2Nsb3NlAGVudGl0eVRyYWNraW5nT25DbG9zZQBTcGFyc2VNYXRyaXhfbXVsdGlwbHlfZGVuc2UAZmFsc2UAL3N2Zy9tZWRpdW10dXJxdW9pc2UAL3N2Zy9kYXJrdHVycXVvaXNlAC9zdmcvcGFsZXR1cnF1b2lzZQAvc3ZnL3R1cnF1b2lzZQBwaGFzZQBTSVpFX01BWCAtIHJvb3RQYXJzZXItPm1fYWxsb2NfdHJhY2tlci5ieXRlc0FsbG9jYXRlZCA+PSBpbmNyZWFzZQBzbG90X2Zyb21fYmFzZQAvc3ZnL2F6dXJlAHNpZ25hdHVyZQBtb3JlX2NvcmUATXNxdWFyZQBQYWxhdGlubyBMaW5vdHlwZQBBLT50eXBlID09IEItPnR5cGUAc3VwZQBlbGxpcHNlX3RhbmdlbnRfc2xvcGUAZ3ZyZW5kZXJfdXNlcnNoYXBlAG1pdGVyX3NoYXBlAGxhbmRzY2FwZQBMYW5kc2NhcGUASnVuZQBub25lAGRvY3VtZW50IGlzIG5vdCBzdGFuZGFsb25lAGNvdXNpbmUAL3N2Zy9tZWRpdW1hcXVhbWFyaW5lAC9zdmcvYXF1YW1hcmluZQA8cG9seWxpbmUAJXNvdmVybGluZQB1bmRlcmxpbmUAcmVhbGx5cm91dGVzcGxpbmUAUHJvdXRlc3BsaW5lAGxpbmVhcl9zcGxpbmUAYl9zcGxpbmUAb2xpbmUAYWd4YnVmX2lzX2lubGluZQBzdmdfaW5saW5lAHJlZmluZQBwcmltZQBQcmltZQAvc3ZnL2xpbWUAY29sb3JzY2hlbWUAbGFiZWxfc2NoZW1lAHNhbWUAbGFiZWxmb250bmFtZQBVRl9zZXRuYW1lAGZvbnRfbmFtZQBmb250LT5uYW1lAHVzLT5uYW1lAHJlc2VydmVkIHByZWZpeCAoeG1sKSBtdXN0IG5vdCBiZSB1bmRlY2xhcmVkIG9yIGJvdW5kIHRvIGFub3RoZXIgbmFtZXNwYWNlIG5hbWUAc3R5bGUAL3N2Zy90aGlzdGxlAHRpdGxlAC9zdmcvbWVkaXVtcHVycGxlAGRhcmtwdXJwbGUAd2VicHVycGxlAHJlYmVjY2FwdXJwbGUAdmVyeV9saWdodF9wdXJwbGUAbWVkX3B1cnBsZQB4MTFwdXJwbGUAL3N2Zy9wdXJwbGUAc2hhcGVmaWxlAGdyYWRpZW50YW5nbGUAcmVjdGFuZ2xlAFJlY3RhbmdsZQBsYWJlbGFuZ2xlAGludnRyaWFuZ2xlAGRlc3RpbmF0aW9uIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAc291cmNlIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAZGZzQ3ljbGUAZG91YmxlY2lyY2xlAE1jaXJjbGUAaW52aXNpYmxlAGV4cGF0X2hlYXBfaW5jcmVhc2VfdG9sZXJhYmxlAHRob3JuZGFsZQBpbnB1dHNjYWxlAG9zY2FsZQBpbWFnZXNjYWxlAC9zdmcvd2hpdGVzbW9rZQBtYW5kYXJpbm9yYW5nZQAvc3ZnL2RhcmtvcmFuZ2UAL3N2Zy9vcmFuZ2UAZXhjaGFuZ2UAL3N2Zy9iZWlnZQBuZXdlZGdlAGRlbGV0ZV9mYXN0X2VkZ2UAZGVsZXRlX2ZsYXRfZWRnZQBhZGRfdHJlZV9lZGdlAHBhdGNod29ya19pbml0X25vZGVfZWRnZQB0d29waV9pbml0X25vZGVfZWRnZQBtYWtlU3RyYWlnaHRFZGdlAG1ha2VTZWxmRWRnZQBtYWtlQ29tcG91bmRFZGdlACF1c2Vfc3RhZ2UAb3NhZ2UAcGFnZQBndmxvYWRpbWFnZQB2ZWUAdGVlAFFVQURfVFJFRV9IWUJSSUQsIHNpemUgbGFyZ2VyIHRoYW4gJWQsIHN3aXRjaCB0byBmYXN0IHF1YWR0cmVlAGZlYXNpYmxlX3RyZWUAbm9kZV9zZXRfZnJlZQBleHBhdF9mcmVlAGd2X2FyZW5hX2ZyZWUAbmV3bm9kZQBpbnN0YWxsbm9kZQBhZ25vZGUAZGVsZXRlX2Zhc3Rfbm9kZQBwYWNrbW9kZQBTcGxpdE5vZGUAb3RpbGRlAG50aWxkZQBhdGlsZGUAT3RpbGRlAE50aWxkZQBBdGlsZGUAZGl2aWRlAHRyYWRlAGdyYXBodml6X25vZGVfaW5kdWNlAHNvdXJjZQByZXB1bHNpdmVmb3JjZQBpbGxlZ2FsIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlAGVycm9yIGluIHByb2Nlc3NpbmcgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZQByZWN1cnNpdmUgZW50aXR5IHJlZmVyZW5jZQBsYWJlbGRpc3RhbmNlAFRCX2JhbGFuY2UAVEJiYWxhbmNlAGRldmljZQBtb25vc3BhY2UAL3N2Zy9vbGRsYWNlAGZhY2UAc3ViZQAgLWFuY2hvciBlAHMxLT5jb21tX2Nvb3JkPT1zMi0+Y29tbV9jb29yZABNcmVjb3JkAGZvcndhcmQAcHJvZABsaWdodGdvbGRlbnJvZABtZWRpdW1nb2xkZW5yb2QAL3N2Zy9kYXJrZ29sZGVucm9kAC9zdmcvcGFsZWdvbGRlbnJvZAAvc3ZnL2dvbGRlbnJvZAAvc3ZnL2J1cmx5d29vZABsaWdodHdvb2QAbWVkaXVtd29vZABkYXJrd29vZABfYmFja2dyb3VuZABjb21wb3VuZABubyBlbGVtZW50IGZvdW5kAGZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tbm8gYWN0aW9uIGZvdW5kAC9zdmcvYmxhbmNoZWRhbG1vbmQAYXJyb3dfbGVuZ3RoX2RpYW1vbmQATWRpYW1vbmQAbm9kZV9zZXRfZmluZABzdHJkaWN0X2ZpbmQAZ3Z1c2Vyc2hhcGVfZmluZABFTGxlZnRibmQAZXhwYW5kAGN1bWJlcmxhbmQAYnJpZ2h0Z29sZABvbGRnb2xkAC9zdmcvZ29sZABib2xkAEhlbHZldGljYS1OYXJyb3ctQm9sZABUaW1lcy1Cb2xkAENvdXJpZXItQm9sZABQYWxhdGluby1Cb2xkAE5ld0NlbnR1cnlTY2hsYmstQm9sZABIZWx2ZXRpY2EtQm9sZAAlMCpsbGQAJSpsbGQAKyVsbGQAbi0+YnJhbmNoW2ldLmNoaWxkACUrLjRsZAAlcyVsZABzb2xpZAAvc3ZnL21lZGl1bW9yY2hpZAAvc3ZnL2RhcmtvcmNoaWQAL3N2Zy9vcmNoaWQAaWxsZWdhbCBjaGFyYWN0ZXIocykgaW4gcHVibGljIGlkAGRpamtzdHJhX3NnZABmaXhlZABjdXJ2ZWQAZGVyaXZlZABkb3R0ZWQAbWVtb3J5IGV4aGF1c3RlZABsb2NhbGUgbm90IHN1cHBvcnRlZABwYXJzaW5nIGFib3J0ZWQAcGFyc2VyIG5vdCBzdGFydGVkAGF0dHJpYnV0ZSBtYWNyb3Mgbm90IGltcGxlbWVudGVkAGFjY291bnRpbmdEaWZmVG9sZXJhdGVkAHJvb3RQYXJzZXItPm1fYWxsb2NfdHJhY2tlci5ieXRlc0FsbG9jYXRlZCA+PSBieXRlc0FsbG9jYXRlZABmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkAGNvbmRlbnNlZAAvc3ZnL21lZGl1bXZpb2xldHJlZAAvc3ZnL3BhbGV2aW9sZXRyZWQASW1wcm9wZXIgJXMgdmFsdWUgJXMgLSBpZ25vcmVkACVzIHZhbHVlICVzIDwgJWQgLSB0b28gc21hbGwgLSBpZ25vcmVkACVzIHZhbHVlICVzID4gJWQgLSB0b28gbGFyZ2UgLSBpZ25vcmVkAC9zdmcvaW5kaWFucmVkAC9zdmcvZGFya3JlZABhIHN1Y2Nlc3NmdWwgcHJpb3IgY2FsbCB0byBmdW5jdGlvbiBYTUxfR2V0QnVmZmVyIGlzIHJlcXVpcmVkAHRhcGVyZWQAL3N2Zy9vcmFuZ2VyZWQAcmVzZXJ2ZWQgcHJlZml4ICh4bWxucykgbXVzdCBub3QgYmUgZGVjbGFyZWQgb3IgdW5kZWNsYXJlZAAvc3ZnL3JlZABzdHJpcGVkAGlsbC1jb25kaXRpb25lZAB1bmRlZmluZWQAbm90IGNvbnN0cmFpbmVkAGxhYmVsYWxpZ25lZAB0ZXh0IGRlY2xhcmF0aW9uIG5vdCB3ZWxsLWZvcm1lZABYTUwgZGVjbGFyYXRpb24gbm90IHdlbGwtZm9ybWVkAHVuZmlsbGVkAGlucHV0IGluIGZsZXggc2Nhbm5lciBmYWlsZWQAdHJpYW5ndWxhdGlvbiBmYWlsZWQAcGFyc2luZyBmaW5pc2hlZABkYXNoZWQAbGltaXQgb24gaW5wdXQgYW1wbGlmaWNhdGlvbiBmYWN0b3IgKGZyb20gRFREIGFuZCBlbnRpdGllcykgYnJlYWNoZWQAd2VkZ2VkAHNpemUgPT0gZnJlZWQAcm91bmRlZABzcGxpbmUgWyUuMDNmLCAlLjAzZl0gLS0gWyUuMDNmLCAlLjAzZl0gaXMgaG9yaXpvbnRhbDsgd2lsbCBiZSB0cml2aWFsbHkgYm91bmRlZABzcGxpbmUgWyUuMDNmLCAlLjAzZl0gLS0gWyUuMDNmLCAlLjAzZl0gaXMgdmVydGljYWw7IHdpbGwgYmUgdHJpdmlhbGx5IGJvdW5kZWQAcGFyc2VyIG5vdCBzdXNwZW5kZWQAcGFyc2VyIHN1c3BlbmRlZABXZWQAUmVkAFNwYXJzZU1hdHJpeF9hZGQAbm9kZV9zZXRfYWRkAHN0cmRpY3RfYWRkAGRkICE9IHBhcmVudF9kZABLUF9BZGQAcGFkAHhsaGR4bG9hZAB4bGhkeHVubG9hZAByZWFkAGFycm93aGVhZABsaGVhZABzYW1laGVhZABib3gzZAAlc18lZABfc3Bhbl8lZABfYmxvY2tfJWQAX3dlYWtfJWQAX2Nsb25lXyVkAC4lZAAlWS0lbS0lZAAlbGYsJWQAJXMgaW4gbGluZSAlZAAlJSUlQm91bmRpbmdCb3g6ICVkICVkICVkICVkACJfc3ViZ3JhcGhfY250IjogJWQAIl9ndmlkIjogJWQAImhlYWQiOiAlZABhZ3hicHV0YwB2cHNjAGNwLT5zcmMAdWNpcmMAb2NpcmMAaWNpcmMAZWNpcmMAYWNpcmMAVWNpcmMAT2NpcmMASWNpcmMARWNpcmMAQWNpcmMAcGMAbGFiZWxsb2MAZXhwYXRfbWFsbG9jAGV4cGF0X3JlYWxsb2MAZ3ZfcmVjYWxsb2MAc3RkOjpiYWRfYWxsb2MAZ3ZfYXJlbmFfYWxsb2MAYmFrZXJzY2hvYwBzZW1pU3dlZXRDaG9jAG1jAFNwYXJzZU1hdHJpeF9pc19zeW1tZXRyaWMAQS0+aXNfcGF0dGVybl9zeW1tZXRyaWMAcGljOnBpYwBpdGFsaWMAQm9va21hbi1MaWdodEl0YWxpYwBaYXBmQ2hhbmNlcnktTWVkaXVtSXRhbGljAEJvb2ttYW4tRGVtaUl0YWxpYwBUaW1lcy1Cb2xkSXRhbGljAFBhbGF0aW5vLUJvbGRJdGFsaWMATmV3Q2VudHVyeVNjaGxiay1Cb2xkSXRhbGljAFRpbWVzLUl0YWxpYwBQYWxhdGluby1JdGFsaWMATmV3Q2VudHVyeVNjaGxiay1JdGFsaWMAcmFkaWMAI2ZjZmNmYwByb3V0ZXNwbGluZXM6ICVkIGVkZ2VzLCAlenUgYm94ZXMgJS4yZiBzZWMAOiAlLjJmIHNlYwBsaXN0ZGVscmVjAGxldmVsIGdyYXBoIHJlYwBsZXZlbCBlZGdlIHJlYwBsZXZlbCBub2RlIHJlYwBEZWMAX25lYXRvX2NjAGJjAHZpc2liaWxpdHkuYwBTcGFyc2VNYXRyaXguYwBodG1sbGV4LmMAaW5kZXguYwBzbWFydF9pbmlfeC5jAGd2cmVuZGVyX2NvcmVfcG92LmMAbHUuYwBjdnQuYwBsYXlvdXQuYwB0ZXh0c3Bhbl9sdXQuYwBhZGp1c3QuYwBub2RlbGlzdC5jAHNob3J0ZXN0LmMAY2xvc2VzdC5jAGd2cmVuZGVyX2NvcmVfZG90LmMAY29uc3RyYWludC5jAGRvdGluaXQuYwBuZWF0b2luaXQuYwBwYXRjaHdvcmtpbml0LmMAdHdvcGlpbml0LmMAb3NhZ2Vpbml0LmMAZW1pdC5jAGZsYXQuYwBhcnJvd3MuYwBtaW5jcm9zcy5jAHN0cmVzcy5jAHBvc3RfcHJvY2Vzcy5jAGNjb21wcy5jAG5zLmMAdXRpbHMuYwB4bGFiZWxzLmMAc2hhcGVzLmMAZG90c3BsaW5lcy5jAG5lYXRvc3BsaW5lcy5jAGNsdXN0ZXJlZGdlcy5jAGhlZGdlcy5jAGF0dHIuYwByZWZzdHIuYwBmYXN0Z3IuYwBjbHVzdGVyLmMAdGFwZXIuYwBndnJlbmRlci5jAHNwbGl0LnEuYwBjb21wLmMAZ3ZyZW5kZXJfY29yZV9tYXAuYwBoZWFwLmMAb3J0aG8uYwBndnJlbmRlcl9jb3JlX2pzb24uYwBwYXJ0aXRpb24uYwBwb3NpdGlvbi5jAGd2X2ZvcGVuLmMAdGV4dHNwYW4uYwBnZW9tLmMAcmFuZG9tLmMAcm91dGVzcGwuYwB4bWwuYwBNdWx0aWxldmVsLmMAc3ByaW5nX2VsZWN0cmljYWwuYwBndnJlbmRlcl9jb3JlX3RrLmMAcmFuay5jAHBhY2suYwBkdHN0cmhhc2guYwBncmFwaC5jAGd2cmVuZGVyX2NvcmVfc3ZnLmMAZ3ZyZW5kZXJfY29yZV9maWcuYwBzdHVmZi5jAG1hemUuYwBzcGFyc2Vfc29sdmUuYwByb3V0ZS5jAHdyaXRlLmMAY29seGxhdGUuYwB4bWxwYXJzZS5jAGd2bG9hZGltYWdlX2NvcmUuYwBndnVzZXJzaGFwZS5jAGNpcmNsZS5jAGh0bWx0YWJsZS5jAGVkZ2UuYwBndmxvYWRpbWFnZS5jAGJsb2NrdHJlZS5jAFF1YWRUcmVlLmMAbm9kZS5jAG5vZGVfaW5kdWNlLmMAZ3ZkZXZpY2UuYwBjb21wb3VuZC5jAHRyYXBlem9pZC5jAHNnZC5jAGNvbmMuYwByZWMuYwBkaWprc3RyYS5jAGFyZW5hLmMAZlBRLmMAY2xhc3MyLmMAJWxmLCVsZiwlbGYsJWxmJWMAJWxmLCVsZiwlbGYsJVteLF0lYwBcJWMAJGMAd2IAbnN1YgBzZXRoc2IAcmIAcHJvdGVjdF9yc3FiAGpvYgBjb3JlX2xvYWRpbWFnZV9wc2xpYgBGZWIAb2RiAGluaXRfc3BsaW5lc19iYgBiZXppZXJfYmIAcHJvdGVpbnN0YWIAcm5hc3RhYgAvc3ZnL29saXZlZHJhYgBcYgByd2EAL3N2Zy9hcXVhAGlvdGEASW90YQAvc3ZnL2RhcmttYWdlbnRhAC9zdmcvbWFnZW50YQBkZWx0YQBEZWx0YQB6ZXRhAHRoZXRhAFRoZXRhAGJldGEAWmV0YQBCZXRhAHByZXYgIT0gb2JqLT5kYXRhAG1ha2VHcmFwaERhdGEARXRhAG5pbWJ1c3NhbnNhAHBhcmEAa2FwcGEAS2FwcGEAL3N2Zy9zaWVubmEAVmVyZGFuYQBnYW1tYQBHYW1tYQBzaWdtYQBTaWdtYQBjb25zb2xhAG5hYmxhAC9zdmcvZnVjaHNpYQBHZW9yZ2lhAGFscGhhAEFscGhhAG9tZWdhAE9tZWdhAGFyZWEAbGFtYmRhAExhbWJkYQBoZWx2ZXRpY2EASGVsdmV0aWNhAG1pY2EAPjxhAGAAU3BhcnNlTWF0cml4X2Nvb3JkaW5hdGVfZm9ybV9hZGRfZW50cnlfAGd2X2xpc3RfY29weV8AX3RkcmF3XwBfdGxkcmF3XwBfaGxkcmF3XwBfbGRyYXdfAF9oZHJhd18AX2RyYXdfAGd2X2xpc3Rfc29ydF8AZ3ZfbGlzdF9hcHBlbmRfc2xvdF8AZ3ZfbGlzdF9wcmVwZW5kX3Nsb3RfAGd2X2xpc3RfcG9wX2Zyb250XwBndl9saXN0X3Nocmlua190b19maXRfAGFneHNldF8AZ3ZfbGlzdF9nZXRfAGRvdF9zcGxpbmVzXwAlc18AZ3ZfbGlzdF9jbGVhcl8AZ3ZfbGlzdF9wb3BfYmFja18AZ3ZfbGlzdF9kZXRhY2hfAGd2X2xpc3RfcmVtb3ZlXwBndl9saXN0X3JldmVyc2VfAGd2X2xpc3RfZnJlZV8AZ3ZfbGlzdF90cnlfYXBwZW5kXwBwYWdlJWQsJWRfAGd2X2xpc3Rfc3luY18AX2NjXwAgaWQ9ImFfAF4AU3RhcnRpbmcgcGhhc2UgMiBbZG90X21pbmNyb3NzXQBTdGFydGluZyBwaGFzZSAzIFtkb3RfcG9zaXRpb25dAG5fZWRnZXMgPT0gZ3JhcGgtPnNvdXJjZXNbZ3JhcGgtPm5dAFN0YXJ0aW5nIHBoYXNlIDEgW2RvdF9yYW5rXQBqZFttYXNrW2pjW2tdXV0gPT0gamNba10AamNbbWFza1tqYltrXV1dID09IGpiW2tdAG5lZWRsZVtpXSAhPSBuZWVkbGVbal0AamFbbWFza1tqYVtqXV1dID09IGphW2pdAHEtPnF0c1tpaV0AIXJ0cC0+c3BsaXQuUGFydGl0aW9uc1swXS50YWtlbltpXQByLmJvdW5kYXJ5W2ldIDw9IHIuYm91bmRhcnlbTlVNRElNUyArIGldAFslLjAzZiwlLjAzZl0AW2ludGVybmFsIGhhcmQtY29kZWRdAG5wLT5jZWxsc1sxXQBucC0+Y2VsbHNbMF0AdXMtPm5hbWVbMF0AY3AtPnNyY1swXQBbLi5dAFxcACJwb2ludHMiOiBbACJzdG9wcyI6IFsACVsAWgBjb21wdXRlU2NhbGVYWQB5PD1ZACVhICViICVkICVIOiVNOiVTICVZAFBPU0lYAG56IDw9IElOVF9NQVgAeSA+PSBJTlRfTUlOICYmIHkgPD0gSU5UX01BWAB4ID49IElOVF9NSU4gJiYgeCA8PSBJTlRfTUFYAHcgPj0gMCAmJiB3IDw9IElOVF9NQVgAZV9jbnQgPD0gSU5UX01BWABwYWlyLnJpZ2h0IDw9IElOVF9NQVgAcGFpci5sZWZ0IDw9IElOVF9NQVgAdGFyZ2V0IDw9IElOVF9NQVgAbnNlZ3MgPD0gSU5UX01BWABuX2VkZ2VzIDw9IElOVF9NQVgAc3RwLm52ZXJ0aWNlcyA8PSBJTlRfTUFYAG9ic1twb2x5X2ldLT5wbiA8PSBJTlRfTUFYAGlucHV0X3JvdXRlLnBuIDw9IElOVF9NQVgAZ3JhcGgtPm4gPD0gSU5UX01BWABoID49IDAgJiYgaCA8PSBJTlRfTUFYAGVfY250IC0gMSA8PSBJTlRfTUFYAExJU1RfU0laRSgmbGlzdCkgLSAxIDw9IElOVF9NQVgATElTVF9TSVpFKCZsYXllcklEcykgLSAxIDw9IElOVF9NQVgAc3RybGVuKGFyZ3MpIDw9IElOVF9NQVgATElTVF9TSVpFKCZvYmpsKSA8PSBJTlRfTUFYAExJU1RfU0laRSgmY3R4LT5UcmVlX2VkZ2UpIDw9IElOVF9NQVgAbm9kZV9zZXRfc2l6ZShnLT5uX2lkKSA8PSBJTlRfTUFYAGkgPCBJTlRfTUFYAHJlc3VsdCA8PSAoaW50KVVDSEFSX01BWABzc3ogPD0gVUNIQVJfTUFYAGNvbCA+PSAwICYmIGNvbCA8PSBVSU5UMTZfTUFYAHg8PVgAVwBWAFUAXFQAVEVYVABTVFJFU1NfTUFKT1JJWkFUSU9OX1BPV0VSX0RJU1QAU1RSRVNTX01BSk9SSVpBVElPTl9HUkFQSF9ESVNUAFNUUkVTU19NQUpPUklaQVRJT05fQVZHX0RJU1QARkFTVABGT05UAGIgPT0gQl9SSUdIVABIRUlHSFQAQl9MRUZUAF8lbGx1X1NVU1BFQ1QAQlQAVHJlYnVjaGV0IE1TAElOVklTACVIOiVNOiVTAFZSAFRSAEEtPmZvcm1hdCA9PSBCLT5mb3JtYXQgJiYgQS0+Zm9ybWF0ID09IEZPUk1BVF9DU1IATFIARElSAEhSAENFTlRFUgAlJVRSQUlMRVIAQS0+dHlwZSA9PSBNQVRSSVhfVFlQRV9SRUFMIHx8IEEtPnR5cGUgPT0gTUFUUklYX1RZUEVfSU5URUdFUgBDRUxMQk9SREVSAEJSACpSAFEARVhQAEJfVVAAU1VQAFRPUABPAG1hcE4AXE4AQl9ET1dOAFRIT1JOACUlQkVHSU4AUk9XU1BBTgBDT0xTUEFOAE5BTgBQTQBCT1RUT00AQk0AQU0AJUg6JU0AXEwAdGFpbFVSTABsYWJlbFVSTABlZGdlVVJMAGhlYWRVUkwASFRNTAB4IT1OVUxMAHJvb3RQYXJzZXItPm1fcGFyZW50UGFyc2VyID09IE5VTEwARURfdG9fdmlydChvcmlnKSA9PSBOVUxMAEVEX3RvX3ZpcnQoZSkgPT0gTlVMTABwcmVmaXggIT0gTlVMTABkdGQtPnNjYWZmSW5kZXggIT0gTlVMTABzbS0+THcgIT0gTlVMTABsdSAhPSBOVUxMAGlucHV0ICE9IE5VTEwAbGlzdCAhPSBOVUxMAHJlZmVyZW50ICE9IE5VTEwAZGljdCAhPSBOVUxMAGRpY3QtPmJ1Y2tldHMgIT0gTlVMTABhdHRyICE9IE5VTEwAYWxsb2NhdG9yICE9IE5VTEwAcGFyc2VyICE9IE5VTEwAcm9vdFBhcnNlciAhPSBOVUxMAGxlYWRlciAhPSBOVUxMAGNtcCAhPSBOVUxMAGRhdGFwICE9IE5VTEwAaW50byAhPSBOVUxMAGl0ZW0gIT0gTlVMTABvcnRob2cgIT0gTlVMTABzZWxmICE9IE5VTEwAdmFsdWUgIT0gTlVMTABmaWxlbmFtZSAhPSBOVUxMAGpvYi0+b3V0cHV0X2ZpbGUgIT0gTlVMTABtb2RlICE9IE5VTEwAeGQgIT0gTlVMTABzbS0+THdkICE9IE5VTEwAam9iICE9IE5VTEwAc291cmNlLmRhdGEgIT0gTlVMTABiLmRhdGEgIT0gTlVMTABhLmRhdGEgIT0gTlVMTABhcmVuYSAhPSBOVUxMAGxpc3QgJiYgbGlzdFswXSAhPSBOVUxMAEFGICE9IE5VTEwAc20tPkQgIT0gTlVMTABFRF90b192aXJ0KG9yaWcpICE9IE5VTEwATENfQUxMAEJMAGJlc3Rjb3N0IDwgSFVHRV9WQUwATk9STUFMAFJBRElBTABBLT50eXBlID09IE1BVFJJWF9UWVBFX1JFQUwAVVJXIENoYW5jZXJ5IEwAVVJXIEJvb2ttYW4gTABDZW50dXJ5IFNjaG9vbGJvb2sgTABVUlcgR290aGljIEwAS0sASgBpIDwgTUFYX0kAUC0+ZW5kLnRoZXRhIDwgMiAqIE1fUEkAQVNDSUkAXEgARVRIAFdJRFRIAERPVEZPTlRQQVRIAEdERk9OVFBBVEgAbWtOQ29uc3RyYWludEcAXEcARVhQQVRfRU5USVRZX0RFQlVHAEVYUEFUX0VOVFJPUFlfREVCVUcARVhQQVRfQUNDT1VOVElOR19ERUJVRwBFWFBBVF9NQUxMT0NfREVCVUcAUk5HAFNQUklORwBDRUxMUEFERElORwBDRUxMU1BBQ0lORwBMQU5HAElNRwBceEYAJSVFT0YASU5GAFx4RkYAUklGRgBkZWx0YSA8PSAweEZGRkYAXHhFRgBceERGAFx4Q0YAXHhCRgBceEFGAFx4OUYAXHg4RgBceDdGAFx4MUYAXHhFAFxFAFBPSU5ULVNJWkUAVFJVRQBDTE9TRQBGQUxTRQBrZXkgIT0gVE9NQlNUT05FAHIgIT0gVE9NQlNUT05FAE5PTkUAR1JBRElFTlRBTkdMRQBUUklBTkdMRQBNSURETEUASU5WSVNJQkxFAFRBQkxFAEFHVFlQRShvYmopID09IEFHSU5FREdFIHx8IEFHVFlQRShvYmopID09IEFHT1VURURHRQBceEZFAFx4RUUAXHhERQBCX05PREUAXHhDRQBceEJFAFx4QUUAXHg5RQBceDhFAFx4MUUAVEQAQS0+Zm9ybWF0ID09IEZPUk1BVF9DT09SRABuICYmIGkgPj0gMCAmJiBpIDwgTk9ERUNBUkQAJSVFTkQASFlCUklEAFNPTElEAFx4RkQAXHhFRABET1RURUQAREFTSEVEAFJPVU5ERUQAXHhERABceENEAFx4QkQAXHhBRABceDlEAFx4OEQAXHgxRABceEMAZGVsZXRlVlBTQwBceEZDAFx4RUMAXHhEQwBceENDAFx4QkMAXHhBQwBceDlDAFx4OEMAXHgxQwBceEIAU1VCAFx4RkIAXHhFQgBceERCAFx4Q0IAXHhCQgBceEFCAFx4OUIAXHg4QgBceDFCAEEgJiYgQgBceEZBAFx4RUEAXHhEQQBceENBAFx4QkEAXHhBQQBceDlBAFx4OEEAXHgxQQBAAD8APCVzPgA8bmlsPgA8L3RzcGFuPjwvdGV4dFBhdGg+AAogICAgPCU5LjNmLCAlOS4zZiwgJTkuM2Y+AD4KPHRpdGxlPgA8Rk9OVD4APEJSPgA8SFRNTD4APC9IVE1MPgA8SU1HPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBiZWZvcmUgPFRBQkxFPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBhZnRlciA8L1RBQkxFPgA8VEQ+AC0+ACI+AAlba2V5PQA8PQA8ACYjeCV4OwAmcXVvdDsAJmx0OwAmZ3Q7ACZhbXA7ACMlZDsAJiMzOTsAJiM0NTsAJiM5MzsAJiMxMzsAJiMxNjA7ACYjMTA7ADtzdG9wLW9wYWNpdHk6ACUlQm91bmRpbmdCb3g6AGNhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzIGFuZCBzZXR0aW5nIHVwIHN0cmVzcyB0ZXJtczoAPHN0b3Agb2Zmc2V0PSIlLjAzZiIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6AHNvbHZpbmcgbW9kZWw6AC9cOgBncmV5OQBncmF5OQBceEY5AFx4RTkAXHhEOQBceEM5AFx4QjkAXHhBOQBncmV5OTkAZ3JheTk5AFx4OTkAZ3JleTg5AGdyYXk4OQBceDg5ADAxMjM0NTY3ODkAZ3JleTc5AGdyYXk3OQBncmV5NjkAZ3JheTY5AGdyZXk1OQBncmF5NTkAZ3JleTQ5AGdyYXk0OQBncmV5MzkAZ3JheTM5AGdyZXkyOQBncmF5MjkAZ3JleTE5AGdyYXkxOQBceDE5AC9yZGd5OS85AC9idXB1OS85AC9yZHB1OS85AC9wdWJ1OS85AC95bGduYnU5LzkAL2duYnU5LzkAL3JkeWxidTkvOQAvcmRidTkvOQAvZ3JleXM5LzkAL2dyZWVuczkvOQAvYmx1ZXM5LzkAL3B1cnBsZXM5LzkAL29yYW5nZXM5LzkAL3JlZHM5LzkAL3B1b3I5LzkAL3lsb3JicjkvOQAvcHVidWduOS85AC9idWduOS85AC9wcmduOS85AC9yZHlsZ245LzkAL3lsZ245LzkAL3NwZWN0cmFsOS85AC9waXlnOS85AC9icmJnOS85AC9wdXJkOS85AC95bG9ycmQ5LzkAL29ycmQ5LzkAL3BhaXJlZDkvOQAvc2V0MzkvOQAvc2V0MTkvOQAvcGFzdGVsMTkvOQAvcGFpcmVkMTIvOQAvc2V0MzEyLzkAL3JkZ3kxMS85AC9yZHlsYnUxMS85AC9yZGJ1MTEvOQAvcHVvcjExLzkAL3ByZ24xMS85AC9yZHlsZ24xMS85AC9zcGVjdHJhbDExLzkAL3BpeWcxMS85AC9icmJnMTEvOQAvcGFpcmVkMTEvOQAvc2V0MzExLzkAL3JkZ3kxMC85AC9yZHlsYnUxMC85AC9yZGJ1MTAvOQAvcHVvcjEwLzkAL3ByZ24xMC85AC9yZHlsZ24xMC85AC9zcGVjdHJhbDEwLzkAL3BpeWcxMC85AC9icmJnMTAvOQAvcGFpcmVkMTAvOQAvc2V0MzEwLzkAZ3JleTgAZ3JheTgAXHg4AHV0ZjgAI2Y4ZjhmOAAjZThlOGU4AFx4RjgAR0lGOABceEU4AFx4RDgAXHhDOABceEI4AFx4QTgAZ3JleTk4AGdyYXk5OABceDk4AGdyZXk4OABncmF5ODgAXHg4OABncmV5NzgAZ3JheTc4AGdyZXk2OABncmF5NjgAZ3JleTU4AGdyYXk1OABncmV5NDgAZ3JheTQ4AGdyZXkzOABncmF5MzgAZ3JleTI4AGdyYXkyOABncmV5MTgAZ3JheTE4AFx4MTgAL3JkZ3k5LzgAL2J1cHU5LzgAL3JkcHU5LzgAL3B1YnU5LzgAL3lsZ25idTkvOAAvZ25idTkvOAAvcmR5bGJ1OS84AC9yZGJ1OS84AC9ncmV5czkvOAAvZ3JlZW5zOS84AC9ibHVlczkvOAAvcHVycGxlczkvOAAvb3JhbmdlczkvOAAvcmVkczkvOAAvcHVvcjkvOAAveWxvcmJyOS84AC9wdWJ1Z245LzgAL2J1Z245LzgAL3ByZ245LzgAL3JkeWxnbjkvOAAveWxnbjkvOAAvc3BlY3RyYWw5LzgAL3BpeWc5LzgAL2JyYmc5LzgAL3B1cmQ5LzgAL3lsb3JyZDkvOAAvb3JyZDkvOAAvcGFpcmVkOS84AC9zZXQzOS84AC9zZXQxOS84AC9wYXN0ZWwxOS84AC9yZGd5OC84AC9idXB1OC84AC9yZHB1OC84AC9wdWJ1OC84AC95bGduYnU4LzgAL2duYnU4LzgAL3JkeWxidTgvOAAvcmRidTgvOAAvYWNjZW50OC84AC9ncmV5czgvOAAvZ3JlZW5zOC84AC9ibHVlczgvOAAvcHVycGxlczgvOAAvb3JhbmdlczgvOAAvcmVkczgvOAAvcHVvcjgvOAAveWxvcmJyOC84AC9wdWJ1Z244LzgAL2J1Z244LzgAL3ByZ244LzgAL3JkeWxnbjgvOAAveWxnbjgvOAAvc3BlY3RyYWw4LzgAL3BpeWc4LzgAL2JyYmc4LzgAL3B1cmQ4LzgAL3lsb3JyZDgvOAAvb3JyZDgvOAAvcGFpcmVkOC84AC9zZXQzOC84AC9zZXQyOC84AC9wYXN0ZWwyOC84AC9kYXJrMjgvOAAvc2V0MTgvOAAvcGFzdGVsMTgvOAAvcGFpcmVkMTIvOAAvc2V0MzEyLzgAL3JkZ3kxMS84AC9yZHlsYnUxMS84AC9yZGJ1MTEvOAAvcHVvcjExLzgAL3ByZ24xMS84AC9yZHlsZ24xMS84AC9zcGVjdHJhbDExLzgAL3BpeWcxMS84AC9icmJnMTEvOAAvcGFpcmVkMTEvOAAvc2V0MzExLzgAL3JkZ3kxMC84AC9yZHlsYnUxMC84AC9yZGJ1MTAvOAAvcHVvcjEwLzgAL3ByZ24xMC84AC9yZHlsZ24xMC84AC9zcGVjdHJhbDEwLzgAL3BpeWcxMC84AC9icmJnMTAvOAAvcGFpcmVkMTAvOAAvc2V0MzEwLzgAdXRmLTgAQy5VVEYtOABncmV5NwBncmF5NwBceDcAXHhGNwBceEU3AFx4RDcAXHhDNwBceEI3AFx4QTcAZ3JleTk3AGdyYXk5NwBceDk3AGdyZXk4NwBncmF5ODcAXHg4NwBncmV5NzcAZ3JheTc3AGdyZXk2NwBncmF5NjcAZ3JleTU3AGdyYXk1NwBncmV5NDcAZ3JheTQ3AGdyZXkzNwBncmF5MzcAZ3JleTI3AGdyYXkyNwBncmV5MTcAZ3JheTE3AFx4MTcAL3JkZ3k5LzcAL2J1cHU5LzcAL3JkcHU5LzcAL3B1YnU5LzcAL3lsZ25idTkvNwAvZ25idTkvNwAvcmR5bGJ1OS83AC9yZGJ1OS83AC9ncmV5czkvNwAvZ3JlZW5zOS83AC9ibHVlczkvNwAvcHVycGxlczkvNwAvb3JhbmdlczkvNwAvcmVkczkvNwAvcHVvcjkvNwAveWxvcmJyOS83AC9wdWJ1Z245LzcAL2J1Z245LzcAL3ByZ245LzcAL3JkeWxnbjkvNwAveWxnbjkvNwAvc3BlY3RyYWw5LzcAL3BpeWc5LzcAL2JyYmc5LzcAL3B1cmQ5LzcAL3lsb3JyZDkvNwAvb3JyZDkvNwAvcGFpcmVkOS83AC9zZXQzOS83AC9zZXQxOS83AC9wYXN0ZWwxOS83AC9yZGd5OC83AC9idXB1OC83AC9yZHB1OC83AC9wdWJ1OC83AC95bGduYnU4LzcAL2duYnU4LzcAL3JkeWxidTgvNwAvcmRidTgvNwAvYWNjZW50OC83AC9ncmV5czgvNwAvZ3JlZW5zOC83AC9ibHVlczgvNwAvcHVycGxlczgvNwAvb3JhbmdlczgvNwAvcmVkczgvNwAvcHVvcjgvNwAveWxvcmJyOC83AC9wdWJ1Z244LzcAL2J1Z244LzcAL3ByZ244LzcAL3JkeWxnbjgvNwAveWxnbjgvNwAvc3BlY3RyYWw4LzcAL3BpeWc4LzcAL2JyYmc4LzcAL3B1cmQ4LzcAL3lsb3JyZDgvNwAvb3JyZDgvNwAvcGFpcmVkOC83AC9zZXQzOC83AC9zZXQyOC83AC9wYXN0ZWwyOC83AC9kYXJrMjgvNwAvc2V0MTgvNwAvcGFzdGVsMTgvNwAvcmRneTcvNwAvYnVwdTcvNwAvcmRwdTcvNwAvcHVidTcvNwAveWxnbmJ1Ny83AC9nbmJ1Ny83AC9yZHlsYnU3LzcAL3JkYnU3LzcAL2FjY2VudDcvNwAvZ3JleXM3LzcAL2dyZWVuczcvNwAvYmx1ZXM3LzcAL3B1cnBsZXM3LzcAL29yYW5nZXM3LzcAL3JlZHM3LzcAL3B1b3I3LzcAL3lsb3JicjcvNwAvcHVidWduNy83AC9idWduNy83AC9wcmduNy83AC9yZHlsZ243LzcAL3lsZ243LzcAL3NwZWN0cmFsNy83AC9waXlnNy83AC9icmJnNy83AC9wdXJkNy83AC95bG9ycmQ3LzcAL29ycmQ3LzcAL3BhaXJlZDcvNwAvc2V0MzcvNwAvc2V0MjcvNwAvcGFzdGVsMjcvNwAvZGFyazI3LzcAL3NldDE3LzcAL3Bhc3RlbDE3LzcAL3BhaXJlZDEyLzcAL3NldDMxMi83AC9yZGd5MTEvNwAvcmR5bGJ1MTEvNwAvcmRidTExLzcAL3B1b3IxMS83AC9wcmduMTEvNwAvcmR5bGduMTEvNwAvc3BlY3RyYWwxMS83AC9waXlnMTEvNwAvYnJiZzExLzcAL3BhaXJlZDExLzcAL3NldDMxMS83AC9yZGd5MTAvNwAvcmR5bGJ1MTAvNwAvcmRidTEwLzcAL3B1b3IxMC83AC9wcmduMTAvNwAvcmR5bGduMTAvNwAvc3BlY3RyYWwxMC83AC9waXlnMTAvNwAvYnJiZzEwLzcAL3BhaXJlZDEwLzcAL3NldDMxMC83ADEuNwBncmV5NgBncmF5NgBceDYAXHhGNgBceEU2AFx4RDYAXHhDNgBceEI2AFx4QTYAZ3JleTk2AGdyYXk5NgBceDk2AGdyZXk4NgBncmF5ODYAXHg4NgBncmV5NzYAZ3JheTc2AGdyZXk2NgBncmF5NjYAZ3JleTU2AGdyYXk1NgBncmV5NDYAZ3JheTQ2AGdyZXkzNgBncmF5MzYAZ3JleTI2AGdyYXkyNgBncmV5MTYAZ3JheTE2AFx4MTYAL3JkZ3k5LzYAL2J1cHU5LzYAL3JkcHU5LzYAL3B1YnU5LzYAL3lsZ25idTkvNgAvZ25idTkvNgAvcmR5bGJ1OS82AC9yZGJ1OS82AC9ncmV5czkvNgAvZ3JlZW5zOS82AC9ibHVlczkvNgAvcHVycGxlczkvNgAvb3JhbmdlczkvNgAvcmVkczkvNgAvcHVvcjkvNgAveWxvcmJyOS82AC9wdWJ1Z245LzYAL2J1Z245LzYAL3ByZ245LzYAL3JkeWxnbjkvNgAveWxnbjkvNgAvc3BlY3RyYWw5LzYAL3BpeWc5LzYAL2JyYmc5LzYAL3B1cmQ5LzYAL3lsb3JyZDkvNgAvb3JyZDkvNgAvcGFpcmVkOS82AC9zZXQzOS82AC9zZXQxOS82AC9wYXN0ZWwxOS82AC9yZGd5OC82AC9idXB1OC82AC9yZHB1OC82AC9wdWJ1OC82AC95bGduYnU4LzYAL2duYnU4LzYAL3JkeWxidTgvNgAvcmRidTgvNgAvYWNjZW50OC82AC9ncmV5czgvNgAvZ3JlZW5zOC82AC9ibHVlczgvNgAvcHVycGxlczgvNgAvb3JhbmdlczgvNgAvcmVkczgvNgAvcHVvcjgvNgAveWxvcmJyOC82AC9wdWJ1Z244LzYAL2J1Z244LzYAL3ByZ244LzYAL3JkeWxnbjgvNgAveWxnbjgvNgAvc3BlY3RyYWw4LzYAL3BpeWc4LzYAL2JyYmc4LzYAL3B1cmQ4LzYAL3lsb3JyZDgvNgAvb3JyZDgvNgAvcGFpcmVkOC82AC9zZXQzOC82AC9zZXQyOC82AC9wYXN0ZWwyOC82AC9kYXJrMjgvNgAvc2V0MTgvNgAvcGFzdGVsMTgvNgAvcmRneTcvNgAvYnVwdTcvNgAvcmRwdTcvNgAvcHVidTcvNgAveWxnbmJ1Ny82AC9nbmJ1Ny82AC9yZHlsYnU3LzYAL3JkYnU3LzYAL2FjY2VudDcvNgAvZ3JleXM3LzYAL2dyZWVuczcvNgAvYmx1ZXM3LzYAL3B1cnBsZXM3LzYAL29yYW5nZXM3LzYAL3JlZHM3LzYAL3B1b3I3LzYAL3lsb3JicjcvNgAvcHVidWduNy82AC9idWduNy82AC9wcmduNy82AC9yZHlsZ243LzYAL3lsZ243LzYAL3NwZWN0cmFsNy82AC9waXlnNy82AC9icmJnNy82AC9wdXJkNy82AC95bG9ycmQ3LzYAL29ycmQ3LzYAL3BhaXJlZDcvNgAvc2V0MzcvNgAvc2V0MjcvNgAvcGFzdGVsMjcvNgAvZGFyazI3LzYAL3NldDE3LzYAL3Bhc3RlbDE3LzYAL3JkZ3k2LzYAL2J1cHU2LzYAL3JkcHU2LzYAL3B1YnU2LzYAL3lsZ25idTYvNgAvZ25idTYvNgAvcmR5bGJ1Ni82AC9yZGJ1Ni82AC9hY2NlbnQ2LzYAL2dyZXlzNi82AC9ncmVlbnM2LzYAL2JsdWVzNi82AC9wdXJwbGVzNi82AC9vcmFuZ2VzNi82AC9yZWRzNi82AC9wdW9yNi82AC95bG9yYnI2LzYAL3B1YnVnbjYvNgAvYnVnbjYvNgAvcHJnbjYvNgAvcmR5bGduNi82AC95bGduNi82AC9zcGVjdHJhbDYvNgAvcGl5ZzYvNgAvYnJiZzYvNgAvcHVyZDYvNgAveWxvcnJkNi82AC9vcnJkNi82AC9wYWlyZWQ2LzYAL3NldDM2LzYAL3NldDI2LzYAL3Bhc3RlbDI2LzYAL2RhcmsyNi82AC9zZXQxNi82AC9wYXN0ZWwxNi82AC9wYWlyZWQxMi82AC9zZXQzMTIvNgAvcmRneTExLzYAL3JkeWxidTExLzYAL3JkYnUxMS82AC9wdW9yMTEvNgAvcHJnbjExLzYAL3JkeWxnbjExLzYAL3NwZWN0cmFsMTEvNgAvcGl5ZzExLzYAL2JyYmcxMS82AC9wYWlyZWQxMS82AC9zZXQzMTEvNgAvcmRneTEwLzYAL3JkeWxidTEwLzYAL3JkYnUxMC82AC9wdW9yMTAvNgAvcHJnbjEwLzYAL3JkeWxnbjEwLzYAL3NwZWN0cmFsMTAvNgAvcGl5ZzEwLzYAL2JyYmcxMC82AC9wYWlyZWQxMC82AC9zZXQzMTAvNgBncmV5NQBncmF5NQBceDUAYmlnNQBceEY1AFx4RTUAXHhENQBceEM1AFx4QjUAXHhBNQBncmV5OTUAZ3JheTk1AFx4OTUAZ3JleTg1AGdyYXk4NQBceDg1AGdyZXk3NQBncmF5NzUAZ3JleTY1AGdyYXk2NQBncmV5NTUAZ3JheTU1AGdyZXk0NQBncmF5NDUAZ3JleTM1AGdyYXkzNQBncmV5MjUAZ3JheTI1AGdyZXkxNQBncmF5MTUAXHgxNQBncmF5MDUAL3JkZ3k5LzUAL2J1cHU5LzUAL3JkcHU5LzUAL3B1YnU5LzUAL3lsZ25idTkvNQAvZ25idTkvNQAvcmR5bGJ1OS81AC9yZGJ1OS81AC9ncmV5czkvNQAvZ3JlZW5zOS81AC9ibHVlczkvNQAvcHVycGxlczkvNQAvb3JhbmdlczkvNQAvcmVkczkvNQAvcHVvcjkvNQAveWxvcmJyOS81AC9wdWJ1Z245LzUAL2J1Z245LzUAL3ByZ245LzUAL3JkeWxnbjkvNQAveWxnbjkvNQAvc3BlY3RyYWw5LzUAL3BpeWc5LzUAL2JyYmc5LzUAL3B1cmQ5LzUAL3lsb3JyZDkvNQAvb3JyZDkvNQAvcGFpcmVkOS81AC9zZXQzOS81AC9zZXQxOS81AC9wYXN0ZWwxOS81AC9yZGd5OC81AC9idXB1OC81AC9yZHB1OC81AC9wdWJ1OC81AC95bGduYnU4LzUAL2duYnU4LzUAL3JkeWxidTgvNQAvcmRidTgvNQAvYWNjZW50OC81AC9ncmV5czgvNQAvZ3JlZW5zOC81AC9ibHVlczgvNQAvcHVycGxlczgvNQAvb3JhbmdlczgvNQAvcmVkczgvNQAvcHVvcjgvNQAveWxvcmJyOC81AC9wdWJ1Z244LzUAL2J1Z244LzUAL3ByZ244LzUAL3JkeWxnbjgvNQAveWxnbjgvNQAvc3BlY3RyYWw4LzUAL3BpeWc4LzUAL2JyYmc4LzUAL3B1cmQ4LzUAL3lsb3JyZDgvNQAvb3JyZDgvNQAvcGFpcmVkOC81AC9zZXQzOC81AC9zZXQyOC81AC9wYXN0ZWwyOC81AC9kYXJrMjgvNQAvc2V0MTgvNQAvcGFzdGVsMTgvNQAvcmRneTcvNQAvYnVwdTcvNQAvcmRwdTcvNQAvcHVidTcvNQAveWxnbmJ1Ny81AC9nbmJ1Ny81AC9yZHlsYnU3LzUAL3JkYnU3LzUAL2FjY2VudDcvNQAvZ3JleXM3LzUAL2dyZWVuczcvNQAvYmx1ZXM3LzUAL3B1cnBsZXM3LzUAL29yYW5nZXM3LzUAL3JlZHM3LzUAL3B1b3I3LzUAL3lsb3JicjcvNQAvcHVidWduNy81AC9idWduNy81AC9wcmduNy81AC9yZHlsZ243LzUAL3lsZ243LzUAL3NwZWN0cmFsNy81AC9waXlnNy81AC9icmJnNy81AC9wdXJkNy81AC95bG9ycmQ3LzUAL29ycmQ3LzUAL3BhaXJlZDcvNQAvc2V0MzcvNQAvc2V0MjcvNQAvcGFzdGVsMjcvNQAvZGFyazI3LzUAL3NldDE3LzUAL3Bhc3RlbDE3LzUAL3JkZ3k2LzUAL2J1cHU2LzUAL3JkcHU2LzUAL3B1YnU2LzUAL3lsZ25idTYvNQAvZ25idTYvNQAvcmR5bGJ1Ni81AC9yZGJ1Ni81AC9hY2NlbnQ2LzUAL2dyZXlzNi81AC9ncmVlbnM2LzUAL2JsdWVzNi81AC9wdXJwbGVzNi81AC9vcmFuZ2VzNi81AC9yZWRzNi81AC9wdW9yNi81AC95bG9yYnI2LzUAL3B1YnVnbjYvNQAvYnVnbjYvNQAvcHJnbjYvNQAvcmR5bGduNi81AC95bGduNi81AC9zcGVjdHJhbDYvNQAvcGl5ZzYvNQAvYnJiZzYvNQAvcHVyZDYvNQAveWxvcnJkNi81AC9vcnJkNi81AC9wYWlyZWQ2LzUAL3NldDM2LzUAL3NldDI2LzUAL3Bhc3RlbDI2LzUAL2RhcmsyNi81AC9zZXQxNi81AC9wYXN0ZWwxNi81AC9yZGd5NS81AC9idXB1NS81AC9yZHB1NS81AC9wdWJ1NS81AC95bGduYnU1LzUAL2duYnU1LzUAL3JkeWxidTUvNQAvcmRidTUvNQAvYWNjZW50NS81AC9ncmV5czUvNQAvZ3JlZW5zNS81AC9ibHVlczUvNQAvcHVycGxlczUvNQAvb3JhbmdlczUvNQAvcmVkczUvNQAvcHVvcjUvNQAveWxvcmJyNS81AC9wdWJ1Z241LzUAL2J1Z241LzUAL3ByZ241LzUAL3JkeWxnbjUvNQAveWxnbjUvNQAvc3BlY3RyYWw1LzUAL3BpeWc1LzUAL2JyYmc1LzUAL3B1cmQ1LzUAL3lsb3JyZDUvNQAvb3JyZDUvNQAvcGFpcmVkNS81AC9zZXQzNS81AC9zZXQyNS81AC9wYXN0ZWwyNS81AC9kYXJrMjUvNQAvc2V0MTUvNQAvcGFzdGVsMTUvNQAvcGFpcmVkMTIvNQAvc2V0MzEyLzUAL3JkZ3kxMS81AC9yZHlsYnUxMS81AC9yZGJ1MTEvNQAvcHVvcjExLzUAL3ByZ24xMS81AC9yZHlsZ24xMS81AC9zcGVjdHJhbDExLzUAL3BpeWcxMS81AC9icmJnMTEvNQAvcGFpcmVkMTEvNQAvc2V0MzExLzUAL3JkZ3kxMC81AC9yZHlsYnUxMC81AC9yZGJ1MTAvNQAvcHVvcjEwLzUAL3ByZ24xMC81AC9yZHlsZ24xMC81AC9zcGVjdHJhbDEwLzUAL3BpeWcxMC81AC9icmJnMTAvNQAvcGFpcmVkMTAvNQAvc2V0MzEwLzUAYmlnLTUAQklHLTUAIC1kYXNoIDUAaXZvcnk0AGdyZXk0AGRhcmtzbGF0ZWdyYXk0AFx4NABzbm93NABsaWdodHllbGxvdzQAaG9uZXlkZXc0AHdoZWF0NAB0b21hdG80AHJvc3licm93bjQAbWFyb29uNABsaWdodHNhbG1vbjQAbGVtb25jaGlmZm9uNABzcHJpbmdncmVlbjQAZGFya29saXZlZ3JlZW40AHBhbGVncmVlbjQAZGFya3NlYWdyZWVuNABsaWdodGN5YW40AHRhbjQAcGx1bTQAc2Vhc2hlbGw0AGNvcmFsNABob3RwaW5rNABsaWdodHBpbms0AGRlZXBwaW5rNABjb3Juc2lsazQAZmlyZWJyaWNrNABraGFraTQAbGF2ZW5kZXJibHVzaDQAcGVhY2hwdWZmNABiaXNxdWU0AGxpZ2h0c2t5Ymx1ZTQAZGVlcHNreWJsdWU0AGxpZ2h0Ymx1ZTQAY2FkZXRibHVlNABkb2RnZXJibHVlNABsaWdodHN0ZWVsYmx1ZTQAcm95YWxibHVlNABzbGF0ZWJsdWU0AG5hdmFqb3doaXRlNABhbnRpcXVld2hpdGU0AGNob2NvbGF0ZTQAY2hhcnRyZXVzZTQAbWlzdHlyb3NlNABwYWxldHVycXVvaXNlNABhenVyZTQAdGhlcmU0AGFxdWFtYXJpbmU0AHRoaXN0bGU0AG1lZGl1bXB1cnBsZTQAZGFya29yYW5nZTQAbGlnaHRnb2xkZW5yb2Q0AGRhcmtnb2xkZW5yb2Q0AGJ1cmx5d29vZDQAZ29sZDQAbWVkaXVtb3JjaGlkNABkYXJrb3JjaGlkNABwYWxldmlvbGV0cmVkNABpbmRpYW5yZWQ0AG9yYW5nZXJlZDQAb2xpdmVkcmFiNABtYWdlbnRhNABzaWVubmE0AFx4RjQAXHhFNABceEQ0AFx4QzQAXHhCNABceEE0AGdyZXk5NABncmF5OTQAXHg5NABncmV5ODQAZ3JheTg0AFx4ODQAZ3JleTc0AGdyYXk3NABncmV5NjQAZ3JheTY0AGdyZXk1NABncmF5NTQAMjAyNjAzMDMuMDQ1NABncmV5NDQAZ3JheTQ0AGdyZXkzNABncmF5MzQAZnJhYzM0AGdyZXkyNABncmF5MjQAZ3JleTE0AGdyYXkxNABceDE0AGZyYWMxNAAvcmRneTkvNAAvYnVwdTkvNAAvcmRwdTkvNAAvcHVidTkvNAAveWxnbmJ1OS80AC9nbmJ1OS80AC9yZHlsYnU5LzQAL3JkYnU5LzQAL2dyZXlzOS80AC9ncmVlbnM5LzQAL2JsdWVzOS80AC9wdXJwbGVzOS80AC9vcmFuZ2VzOS80AC9yZWRzOS80AC9wdW9yOS80AC95bG9yYnI5LzQAL3B1YnVnbjkvNAAvYnVnbjkvNAAvcHJnbjkvNAAvcmR5bGduOS80AC95bGduOS80AC9zcGVjdHJhbDkvNAAvcGl5ZzkvNAAvYnJiZzkvNAAvcHVyZDkvNAAveWxvcnJkOS80AC9vcnJkOS80AC9wYWlyZWQ5LzQAL3NldDM5LzQAL3NldDE5LzQAL3Bhc3RlbDE5LzQAL3JkZ3k4LzQAL2J1cHU4LzQAL3JkcHU4LzQAL3B1YnU4LzQAL3lsZ25idTgvNAAvZ25idTgvNAAvcmR5bGJ1OC80AC9yZGJ1OC80AC9hY2NlbnQ4LzQAL2dyZXlzOC80AC9ncmVlbnM4LzQAL2JsdWVzOC80AC9wdXJwbGVzOC80AC9vcmFuZ2VzOC80AC9yZWRzOC80AC9wdW9yOC80AC95bG9yYnI4LzQAL3B1YnVnbjgvNAAvYnVnbjgvNAAvcHJnbjgvNAAvcmR5bGduOC80AC95bGduOC80AC9zcGVjdHJhbDgvNAAvcGl5ZzgvNAAvYnJiZzgvNAAvcHVyZDgvNAAveWxvcnJkOC80AC9vcnJkOC80AC9wYWlyZWQ4LzQAL3NldDM4LzQAL3NldDI4LzQAL3Bhc3RlbDI4LzQAL2RhcmsyOC80AC9zZXQxOC80AC9wYXN0ZWwxOC80AC9yZGd5Ny80AC9idXB1Ny80AC9yZHB1Ny80AC9wdWJ1Ny80AC95bGduYnU3LzQAL2duYnU3LzQAL3JkeWxidTcvNAAvcmRidTcvNAAvYWNjZW50Ny80AC9ncmV5czcvNAAvZ3JlZW5zNy80AC9ibHVlczcvNAAvcHVycGxlczcvNAAvb3JhbmdlczcvNAAvcmVkczcvNAAvcHVvcjcvNAAveWxvcmJyNy80AC9wdWJ1Z243LzQAL2J1Z243LzQAL3ByZ243LzQAL3JkeWxnbjcvNAAveWxnbjcvNAAvc3BlY3RyYWw3LzQAL3BpeWc3LzQAL2JyYmc3LzQAL3B1cmQ3LzQAL3lsb3JyZDcvNAAvb3JyZDcvNAAvcGFpcmVkNy80AC9zZXQzNy80AC9zZXQyNy80AC9wYXN0ZWwyNy80AC9kYXJrMjcvNAAvc2V0MTcvNAAvcGFzdGVsMTcvNAAvcmRneTYvNAAvYnVwdTYvNAAvcmRwdTYvNAAvcHVidTYvNAAveWxnbmJ1Ni80AC9nbmJ1Ni80AC9yZHlsYnU2LzQAL3JkYnU2LzQAL2FjY2VudDYvNAAvZ3JleXM2LzQAL2dyZWVuczYvNAAvYmx1ZXM2LzQAL3B1cnBsZXM2LzQAL29yYW5nZXM2LzQAL3JlZHM2LzQAL3B1b3I2LzQAL3lsb3JicjYvNAAvcHVidWduNi80AC9idWduNi80AC9wcmduNi80AC9yZHlsZ242LzQAL3lsZ242LzQAL3NwZWN0cmFsNi80AC9waXlnNi80AC9icmJnNi80AC9wdXJkNi80AC95bG9ycmQ2LzQAL29ycmQ2LzQAL3BhaXJlZDYvNAAvc2V0MzYvNAAvc2V0MjYvNAAvcGFzdGVsMjYvNAAvZGFyazI2LzQAL3NldDE2LzQAL3Bhc3RlbDE2LzQAL3JkZ3k1LzQAL2J1cHU1LzQAL3JkcHU1LzQAL3B1YnU1LzQAL3lsZ25idTUvNAAvZ25idTUvNAAvcmR5bGJ1NS80AC9yZGJ1NS80AC9hY2NlbnQ1LzQAL2dyZXlzNS80AC9ncmVlbnM1LzQAL2JsdWVzNS80AC9wdXJwbGVzNS80AC9vcmFuZ2VzNS80AC9yZWRzNS80AC9wdW9yNS80AC95bG9yYnI1LzQAL3B1YnVnbjUvNAAvYnVnbjUvNAAvcHJnbjUvNAAvcmR5bGduNS80AC95bGduNS80AC9zcGVjdHJhbDUvNAAvcGl5ZzUvNAAvYnJiZzUvNAAvcHVyZDUvNAAveWxvcnJkNS80AC9vcnJkNS80AC9wYWlyZWQ1LzQAL3NldDM1LzQAL3NldDI1LzQAL3Bhc3RlbDI1LzQAL2RhcmsyNS80AC9zZXQxNS80AC9wYXN0ZWwxNS80AC9yZGd5NC80AC9idXB1NC80AC9yZHB1NC80AC9wdWJ1NC80AC95bGduYnU0LzQAL2duYnU0LzQAL3JkeWxidTQvNAAvcmRidTQvNAAvYWNjZW50NC80AC9ncmV5czQvNAAvZ3JlZW5zNC80AC9ibHVlczQvNAAvcHVycGxlczQvNAAvb3JhbmdlczQvNAAvcmVkczQvNAAvcHVvcjQvNAAveWxvcmJyNC80AC9wdWJ1Z240LzQAL2J1Z240LzQAL3ByZ240LzQAL3JkeWxnbjQvNAAveWxnbjQvNAAvc3BlY3RyYWw0LzQAL3BpeWc0LzQAL2JyYmc0LzQAL3B1cmQ0LzQAL3lsb3JyZDQvNAAvb3JyZDQvNAAvcGFpcmVkNC80AC9zZXQzNC80AC9zZXQyNC80AC9wYXN0ZWwyNC80AC9kYXJrMjQvNAAvc2V0MTQvNAAvcGFzdGVsMTQvNAAvcGFpcmVkMTIvNAAvc2V0MzEyLzQAL3JkZ3kxMS80AC9yZHlsYnUxMS80AC9yZGJ1MTEvNAAvcHVvcjExLzQAL3ByZ24xMS80AC9yZHlsZ24xMS80AC9zcGVjdHJhbDExLzQAL3BpeWcxMS80AC9icmJnMTEvNAAvcGFpcmVkMTEvNAAvc2V0MzExLzQAL3JkZ3kxMC80AC9yZHlsYnUxMC80AC9yZGJ1MTAvNAAvcHVvcjEwLzQAL3ByZ24xMC80AC9yZHlsZ24xMC80AC9zcGVjdHJhbDEwLzQAL3BpeWcxMC80AC9icmJnMTAvNAAvcGFpcmVkMTAvNAAvc2V0MzEwLzQAMS40AG4gPj0gNABzaWRlcyA9PSA0AGl2b3J5MwBTcGFyc2VNYXRyaXhfbXVsdGlwbHkzAGdyZXkzAGRhcmtzbGF0ZWdyYXkzAFx4MwBzbm93MwBsaWdodHllbGxvdzMAaG9uZXlkZXczAHdoZWF0MwBzdXAzAHRvbWF0bzMAcm9zeWJyb3duMwBtYXJvb24zAGxpZ2h0c2FsbW9uMwBsZW1vbmNoaWZmb24zAHNwcmluZ2dyZWVuMwBkYXJrb2xpdmVncmVlbjMAcGFsZWdyZWVuMwBkYXJrc2VhZ3JlZW4zAGxpZ2h0Y3lhbjMAdGFuMwBwbHVtMwBzZWFzaGVsbDMAY29yYWwzAGhvdHBpbmszAGxpZ2h0cGluazMAZGVlcHBpbmszAGNvcm5zaWxrMwBmaXJlYnJpY2szAGtoYWtpMwBsYXZlbmRlcmJsdXNoMwBwZWFjaHB1ZmYzAGJpc3F1ZTMAbGlnaHRza3libHVlMwBkZWVwc2t5Ymx1ZTMAbGlnaHRibHVlMwBjYWRldGJsdWUzAGRvZGdlcmJsdWUzAGxpZ2h0c3RlZWxibHVlMwByb3lhbGJsdWUzAHNsYXRlYmx1ZTMAbmF2YWpvd2hpdGUzAGFudGlxdWV3aGl0ZTMAY2hvY29sYXRlMwBjaGFydHJldXNlMwBtaXN0eXJvc2UzAHBhbGV0dXJxdW9pc2UzAGF6dXJlMwBhcXVhbWFyaW5lMwB0aGlzdGxlMwBtZWRpdW1wdXJwbGUzAGRhcmtvcmFuZ2UzAGxpZ2h0Z29sZGVucm9kMwBkYXJrZ29sZGVucm9kMwBidXJseXdvb2QzAGdvbGQzAG1lZGl1bW9yY2hpZDMAZGFya29yY2hpZDMAcGFsZXZpb2xldHJlZDMAaW5kaWFucmVkMwBvcmFuZ2VyZWQzAG9saXZlZHJhYjMAbWFnZW50YTMAc2llbm5hMwBceEYzAFx4RTMAXHhEMwBceEMzAFx4QjMAXHhBMwBncmV5OTMAZ3JheTkzAFx4OTMAZ3JleTgzAGdyYXk4MwBceDgzAGdyZXk3MwBncmF5NzMAZ3JleTYzAGdyYXk2MwBncmV5NTMAZ3JheTUzAFNUU0laRShuZXh0KSA8PSBVSU5UNjRfQygxKSA8PCA1MwBTVFNJWkUobikgPD0gVUlOVDY0X0MoMSkgPDwgNTMAZ3JleTQzAGdyYXk0MwBncmV5MzMAZ3JheTMzAGdyZXkyMwBncmF5MjMAZ3JleTEzAGdyYXkxMwBceDEzAC9yZGd5OS8zAC9idXB1OS8zAC9yZHB1OS8zAC9wdWJ1OS8zAC95bGduYnU5LzMAL2duYnU5LzMAL3JkeWxidTkvMwAvcmRidTkvMwAvZ3JleXM5LzMAL2dyZWVuczkvMwAvYmx1ZXM5LzMAL3B1cnBsZXM5LzMAL29yYW5nZXM5LzMAL3JlZHM5LzMAL3B1b3I5LzMAL3lsb3JicjkvMwAvcHVidWduOS8zAC9idWduOS8zAC9wcmduOS8zAC9yZHlsZ245LzMAL3lsZ245LzMAL3NwZWN0cmFsOS8zAC9waXlnOS8zAC9icmJnOS8zAC9wdXJkOS8zAC95bG9ycmQ5LzMAL29ycmQ5LzMAL3BhaXJlZDkvMwAvc2V0MzkvMwAvc2V0MTkvMwAvcGFzdGVsMTkvMwAvcmRneTgvMwAvYnVwdTgvMwAvcmRwdTgvMwAvcHVidTgvMwAveWxnbmJ1OC8zAC9nbmJ1OC8zAC9yZHlsYnU4LzMAL3JkYnU4LzMAL2FjY2VudDgvMwAvZ3JleXM4LzMAL2dyZWVuczgvMwAvYmx1ZXM4LzMAL3B1cnBsZXM4LzMAL29yYW5nZXM4LzMAL3JlZHM4LzMAL3B1b3I4LzMAL3lsb3JicjgvMwAvcHVidWduOC8zAC9idWduOC8zAC9wcmduOC8zAC9yZHlsZ244LzMAL3lsZ244LzMAL3NwZWN0cmFsOC8zAC9waXlnOC8zAC9icmJnOC8zAC9wdXJkOC8zAC95bG9ycmQ4LzMAL29ycmQ4LzMAL3BhaXJlZDgvMwAvc2V0MzgvMwAvc2V0MjgvMwAvcGFzdGVsMjgvMwAvZGFyazI4LzMAL3NldDE4LzMAL3Bhc3RlbDE4LzMAL3JkZ3k3LzMAL2J1cHU3LzMAL3JkcHU3LzMAL3B1YnU3LzMAL3lsZ25idTcvMwAvZ25idTcvMwAvcmR5bGJ1Ny8zAC9yZGJ1Ny8zAC9hY2NlbnQ3LzMAL2dyZXlzNy8zAC9ncmVlbnM3LzMAL2JsdWVzNy8zAC9wdXJwbGVzNy8zAC9vcmFuZ2VzNy8zAC9yZWRzNy8zAC9wdW9yNy8zAC95bG9yYnI3LzMAL3B1YnVnbjcvMwAvYnVnbjcvMwAvcHJnbjcvMwAvcmR5bGduNy8zAC95bGduNy8zAC9zcGVjdHJhbDcvMwAvcGl5ZzcvMwAvYnJiZzcvMwAvcHVyZDcvMwAveWxvcnJkNy8zAC9vcnJkNy8zAC9wYWlyZWQ3LzMAL3NldDM3LzMAL3NldDI3LzMAL3Bhc3RlbDI3LzMAL2RhcmsyNy8zAC9zZXQxNy8zAC9wYXN0ZWwxNy8zAC9yZGd5Ni8zAC9idXB1Ni8zAC9yZHB1Ni8zAC9wdWJ1Ni8zAC95bGduYnU2LzMAL2duYnU2LzMAL3JkeWxidTYvMwAvcmRidTYvMwAvYWNjZW50Ni8zAC9ncmV5czYvMwAvZ3JlZW5zNi8zAC9ibHVlczYvMwAvcHVycGxlczYvMwAvb3JhbmdlczYvMwAvcmVkczYvMwAvcHVvcjYvMwAveWxvcmJyNi8zAC9wdWJ1Z242LzMAL2J1Z242LzMAL3ByZ242LzMAL3JkeWxnbjYvMwAveWxnbjYvMwAvc3BlY3RyYWw2LzMAL3BpeWc2LzMAL2JyYmc2LzMAL3B1cmQ2LzMAL3lsb3JyZDYvMwAvb3JyZDYvMwAvcGFpcmVkNi8zAC9zZXQzNi8zAC9zZXQyNi8zAC9wYXN0ZWwyNi8zAC9kYXJrMjYvMwAvc2V0MTYvMwAvcGFzdGVsMTYvMwAvcmRneTUvMwAvYnVwdTUvMwAvcmRwdTUvMwAvcHVidTUvMwAveWxnbmJ1NS8zAC9nbmJ1NS8zAC9yZHlsYnU1LzMAL3JkYnU1LzMAL2FjY2VudDUvMwAvZ3JleXM1LzMAL2dyZWVuczUvMwAvYmx1ZXM1LzMAL3B1cnBsZXM1LzMAL29yYW5nZXM1LzMAL3JlZHM1LzMAL3B1b3I1LzMAL3lsb3JicjUvMwAvcHVidWduNS8zAC9idWduNS8zAC9wcmduNS8zAC9yZHlsZ241LzMAL3lsZ241LzMAL3NwZWN0cmFsNS8zAC9waXlnNS8zAC9icmJnNS8zAC9wdXJkNS8zAC95bG9ycmQ1LzMAL29ycmQ1LzMAL3BhaXJlZDUvMwAvc2V0MzUvMwAvc2V0MjUvMwAvcGFzdGVsMjUvMwAvZGFyazI1LzMAL3NldDE1LzMAL3Bhc3RlbDE1LzMAL3JkZ3k0LzMAL2J1cHU0LzMAL3JkcHU0LzMAL3B1YnU0LzMAL3lsZ25idTQvMwAvZ25idTQvMwAvcmR5bGJ1NC8zAC9yZGJ1NC8zAC9hY2NlbnQ0LzMAL2dyZXlzNC8zAC9ncmVlbnM0LzMAL2JsdWVzNC8zAC9wdXJwbGVzNC8zAC9vcmFuZ2VzNC8zAC9yZWRzNC8zAC9wdW9yNC8zAC95bG9yYnI0LzMAL3B1YnVnbjQvMwAvYnVnbjQvMwAvcHJnbjQvMwAvcmR5bGduNC8zAC95bGduNC8zAC9zcGVjdHJhbDQvMwAvcGl5ZzQvMwAvYnJiZzQvMwAvcHVyZDQvMwAveWxvcnJkNC8zAC9vcnJkNC8zAC9wYWlyZWQ0LzMAL3NldDM0LzMAL3NldDI0LzMAL3Bhc3RlbDI0LzMAL2RhcmsyNC8zAC9zZXQxNC8zAC9wYXN0ZWwxNC8zAC9yZGd5My8zAC9idXB1My8zAC9yZHB1My8zAC9wdWJ1My8zAC95bGduYnUzLzMAL2duYnUzLzMAL3JkeWxidTMvMwAvcmRidTMvMwAvYWNjZW50My8zAC9ncmV5czMvMwAvZ3JlZW5zMy8zAC9ibHVlczMvMwAvcHVycGxlczMvMwAvb3JhbmdlczMvMwAvcmVkczMvMwAvcHVvcjMvMwAveWxvcmJyMy8zAC9wdWJ1Z24zLzMAL2J1Z24zLzMAL3ByZ24zLzMAL3JkeWxnbjMvMwAveWxnbjMvMwAvc3BlY3RyYWwzLzMAL3BpeWczLzMAL2JyYmczLzMAL3B1cmQzLzMAL3lsb3JyZDMvMwAvb3JyZDMvMwAvcGFpcmVkMy8zAC9zZXQzMy8zAC9zZXQyMy8zAC9wYXN0ZWwyMy8zAC9kYXJrMjMvMwAvc2V0MTMvMwAvcGFzdGVsMTMvMwAvcGFpcmVkMTIvMwAvc2V0MzEyLzMAL3JkZ3kxMS8zAC9yZHlsYnUxMS8zAC9yZGJ1MTEvMwAvcHVvcjExLzMAL3ByZ24xMS8zAC9yZHlsZ24xMS8zAC9zcGVjdHJhbDExLzMAL3BpeWcxMS8zAC9icmJnMTEvMwAvcGFpcmVkMTEvMwAvc2V0MzExLzMAL3JkZ3kxMC8zAC9yZHlsYnUxMC8zAC9yZGJ1MTAvMwAvcHVvcjEwLzMAL3ByZ24xMC8zAC9yZHlsZ24xMC8zAC9zcGVjdHJhbDEwLzMAL3BpeWcxMC8zAC9icmJnMTAvMwAvcGFpcmVkMTAvMwAvc2V0MzEwLzMAMTQuMS4zAGl2b3J5MgBncmV5MgBkYXJrc2xhdGVncmF5MgBceDIAc25vdzIAbGlnaHR5ZWxsb3cyAGhvbmV5ZGV3MgBSVHJlZUluc2VydDIAd2hlYXQyAHN1cDIAbm9wMgB0b21hdG8yAHJvc3licm93bjIAbWFyb29uMgBsaWdodHNhbG1vbjIAbGVtb25jaGlmZm9uMgBzcHJpbmdncmVlbjIAZGFya29saXZlZ3JlZW4yAHBhbGVncmVlbjIAZGFya3NlYWdyZWVuMgBsaWdodGN5YW4yAHRhbjIAcGx1bTIAc2Vhc2hlbGwyAGNvcmFsMgBob3RwaW5rMgBsaWdodHBpbmsyAGRlZXBwaW5rMgBjb3Juc2lsazIAZmlyZWJyaWNrMgBraGFraTIAbGF2ZW5kZXJibHVzaDIAcGVhY2hwdWZmMgBicm9uemUyAGJpc3F1ZTIAbGlnaHRza3libHVlMgBkZWVwc2t5Ymx1ZTIAbGlnaHRibHVlMgBjYWRldGJsdWUyAGRvZGdlcmJsdWUyAGxpZ2h0c3RlZWxibHVlMgByb3lhbGJsdWUyAHNsYXRlYmx1ZTIAbmF2YWpvd2hpdGUyAGFudGlxdWV3aGl0ZTIAY2hvY29sYXRlMgBjaGFydHJldXNlMgBtaXN0eXJvc2UyAHBhbGV0dXJxdW9pc2UyAGF6dXJlMgBhcXVhbWFyaW5lMgB0aGlzdGxlMgBtZWRpdW1wdXJwbGUyAGRhcmtvcmFuZ2UyAGxpZ2h0Z29sZGVucm9kMgBkYXJrZ29sZGVucm9kMgBidXJseXdvb2QyAGdvbGQyAG1lZGl1bW9yY2hpZDIAZGFya29yY2hpZDIAcGFsZXZpb2xldHJlZDIAaW5kaWFucmVkMgBvcmFuZ2VyZWQyAG9saXZlZHJhYjIAbWFnZW50YTIAc2llbm5hMgBceEYyAFx4RTIAXHhEMgBceEMyAFx4QjIAXHhBMgBncmV5OTIAZ3JheTkyAFx4OTIAZ3JleTgyAGdyYXk4MgBceDgyAGdyZXk3MgBncmF5NzIAZ3JleTYyAGdyYXk2MgBncmV5NTIAZ3JheTUyAGdyZXk0MgBncmF5NDIAZ3JleTMyAGdyYXkzMgBncmV5MjIAZ3JheTIyAGdyZXkxMgBncmF5MTIAXHgxMgBmcmFjMTIAL3BhaXJlZDEyLzEyAC9zZXQzMTIvMTIAL3JkZ3k5LzIAL2J1cHU5LzIAL3JkcHU5LzIAL3B1YnU5LzIAL3lsZ25idTkvMgAvZ25idTkvMgAvcmR5bGJ1OS8yAC9yZGJ1OS8yAC9ncmV5czkvMgAvZ3JlZW5zOS8yAC9ibHVlczkvMgAvcHVycGxlczkvMgAvb3JhbmdlczkvMgAvcmVkczkvMgAvcHVvcjkvMgAveWxvcmJyOS8yAC9wdWJ1Z245LzIAL2J1Z245LzIAL3ByZ245LzIAL3JkeWxnbjkvMgAveWxnbjkvMgAvc3BlY3RyYWw5LzIAL3BpeWc5LzIAL2JyYmc5LzIAL3B1cmQ5LzIAL3lsb3JyZDkvMgAvb3JyZDkvMgAvcGFpcmVkOS8yAC9zZXQzOS8yAC9zZXQxOS8yAC9wYXN0ZWwxOS8yAC9yZGd5OC8yAC9idXB1OC8yAC9yZHB1OC8yAC9wdWJ1OC8yAC95bGduYnU4LzIAL2duYnU4LzIAL3JkeWxidTgvMgAvcmRidTgvMgAvYWNjZW50OC8yAC9ncmV5czgvMgAvZ3JlZW5zOC8yAC9ibHVlczgvMgAvcHVycGxlczgvMgAvb3JhbmdlczgvMgAvcmVkczgvMgAvcHVvcjgvMgAveWxvcmJyOC8yAC9wdWJ1Z244LzIAL2J1Z244LzIAL3ByZ244LzIAL3JkeWxnbjgvMgAveWxnbjgvMgAvc3BlY3RyYWw4LzIAL3BpeWc4LzIAL2JyYmc4LzIAL3B1cmQ4LzIAL3lsb3JyZDgvMgAvb3JyZDgvMgAvcGFpcmVkOC8yAC9zZXQzOC8yAC9zZXQyOC8yAC9wYXN0ZWwyOC8yAC9kYXJrMjgvMgAvc2V0MTgvMgAvcGFzdGVsMTgvMgAvcmRneTcvMgAvYnVwdTcvMgAvcmRwdTcvMgAvcHVidTcvMgAveWxnbmJ1Ny8yAC9nbmJ1Ny8yAC9yZHlsYnU3LzIAL3JkYnU3LzIAL2FjY2VudDcvMgAvZ3JleXM3LzIAL2dyZWVuczcvMgAvYmx1ZXM3LzIAL3B1cnBsZXM3LzIAL29yYW5nZXM3LzIAL3JlZHM3LzIAL3B1b3I3LzIAL3lsb3JicjcvMgAvcHVidWduNy8yAC9idWduNy8yAC9wcmduNy8yAC9yZHlsZ243LzIAL3lsZ243LzIAL3NwZWN0cmFsNy8yAC9waXlnNy8yAC9icmJnNy8yAC9wdXJkNy8yAC95bG9ycmQ3LzIAL29ycmQ3LzIAL3BhaXJlZDcvMgAvc2V0MzcvMgAvc2V0MjcvMgAvcGFzdGVsMjcvMgAvZGFyazI3LzIAL3NldDE3LzIAL3Bhc3RlbDE3LzIAL3JkZ3k2LzIAL2J1cHU2LzIAL3JkcHU2LzIAL3B1YnU2LzIAL3lsZ25idTYvMgAvZ25idTYvMgAvcmR5bGJ1Ni8yAC9yZGJ1Ni8yAC9hY2NlbnQ2LzIAL2dyZXlzNi8yAC9ncmVlbnM2LzIAL2JsdWVzNi8yAC9wdXJwbGVzNi8yAC9vcmFuZ2VzNi8yAC9yZWRzNi8yAC9wdW9yNi8yAC95bG9yYnI2LzIAL3B1YnVnbjYvMgAvYnVnbjYvMgAvcHJnbjYvMgAvcmR5bGduNi8yAC95bGduNi8yAC9zcGVjdHJhbDYvMgAvcGl5ZzYvMgAvYnJiZzYvMgAvcHVyZDYvMgAveWxvcnJkNi8yAC9vcnJkNi8yAC9wYWlyZWQ2LzIAL3NldDM2LzIAL3NldDI2LzIAL3Bhc3RlbDI2LzIAL2RhcmsyNi8yAC9zZXQxNi8yAC9wYXN0ZWwxNi8yAC9yZGd5NS8yAC9idXB1NS8yAC9yZHB1NS8yAC9wdWJ1NS8yAC95bGduYnU1LzIAL2duYnU1LzIAL3JkeWxidTUvMgAvcmRidTUvMgAvYWNjZW50NS8yAC9ncmV5czUvMgAvZ3JlZW5zNS8yAC9ibHVlczUvMgAvcHVycGxlczUvMgAvb3JhbmdlczUvMgAvcmVkczUvMgAvcHVvcjUvMgAveWxvcmJyNS8yAC9wdWJ1Z241LzIAL2J1Z241LzIAL3ByZ241LzIAL3JkeWxnbjUvMgAveWxnbjUvMgAvc3BlY3RyYWw1LzIAL3BpeWc1LzIAL2JyYmc1LzIAL3B1cmQ1LzIAL3lsb3JyZDUvMgAvb3JyZDUvMgAvcGFpcmVkNS8yAC9zZXQzNS8yAC9zZXQyNS8yAC9wYXN0ZWwyNS8yAC9kYXJrMjUvMgAvc2V0MTUvMgAvcGFzdGVsMTUvMgAvcmRneTQvMgAvYnVwdTQvMgAvcmRwdTQvMgAvcHVidTQvMgAveWxnbmJ1NC8yAC9nbmJ1NC8yAC9yZHlsYnU0LzIAL3JkYnU0LzIAL2FjY2VudDQvMgAvZ3JleXM0LzIAL2dyZWVuczQvMgAvYmx1ZXM0LzIAL3B1cnBsZXM0LzIAL29yYW5nZXM0LzIAL3JlZHM0LzIAL3B1b3I0LzIAL3lsb3JicjQvMgAvcHVidWduNC8yAC9idWduNC8yAC9wcmduNC8yAC9yZHlsZ240LzIAL3lsZ240LzIAL3NwZWN0cmFsNC8yAC9waXlnNC8yAC9icmJnNC8yAC9wdXJkNC8yAC95bG9ycmQ0LzIAL29ycmQ0LzIAL3BhaXJlZDQvMgAvc2V0MzQvMgAvc2V0MjQvMgAvcGFzdGVsMjQvMgAvZGFyazI0LzIAL3NldDE0LzIAL3Bhc3RlbDE0LzIAL3JkZ3kzLzIAL2J1cHUzLzIAL3JkcHUzLzIAL3B1YnUzLzIAL3lsZ25idTMvMgAvZ25idTMvMgAvcmR5bGJ1My8yAC9yZGJ1My8yAC9hY2NlbnQzLzIAL2dyZXlzMy8yAC9ncmVlbnMzLzIAL2JsdWVzMy8yAC9wdXJwbGVzMy8yAC9vcmFuZ2VzMy8yAC9yZWRzMy8yAC9wdW9yMy8yAC95bG9yYnIzLzIAL3B1YnVnbjMvMgAvYnVnbjMvMgAvcHJnbjMvMgAvcmR5bGduMy8yAC95bGduMy8yAC9zcGVjdHJhbDMvMgAvcGl5ZzMvMgAvYnJiZzMvMgAvcHVyZDMvMgAveWxvcnJkMy8yAC9vcnJkMy8yAC9wYWlyZWQzLzIAL3NldDMzLzIAL3NldDIzLzIAL3Bhc3RlbDIzLzIAL2RhcmsyMy8yAC9zZXQxMy8yAC9wYXN0ZWwxMy8yAC9wYWlyZWQxMi8yAC9zZXQzMTIvMgAvcmRneTExLzIAL3JkeWxidTExLzIAL3JkYnUxMS8yAC9wdW9yMTEvMgAvcHJnbjExLzIAL3JkeWxnbjExLzIAL3NwZWN0cmFsMTEvMgAvcGl5ZzExLzIAL2JyYmcxMS8yAC9wYWlyZWQxMS8yAC9zZXQzMTEvMgAvcmRneTEwLzIAL3JkeWxidTEwLzIAL3JkYnUxMC8yAC9wdW9yMTAvMgAvcHJnbjEwLzIAL3JkeWxnbjEwLzIAL3NwZWN0cmFsMTAvMgAvcGl5ZzEwLzIAL2JyYmcxMC8yAC9wYWlyZWQxMC8yAC9zZXQzMTAvMgAxLjIAIC1kYXNoIDIAbGVuID49IDIAZXhwID09IDEgfHwgZXhwID09IDIAZGltID09IDIATkRfb3V0KHYpLnNpemUgPT0gMgBpdm9yeTEAZ3JleTEAZGFya3NsYXRlZ3JheTEAXHgxAHNub3cxAGxpZ2h0eWVsbG93MQBob25leWRldzEAbnNsaW1pdDEAd2hlYXQxAHN1cDEAbm9wMQB0b21hdG8xAHJvc3licm93bjEAbWFyb29uMQBsaWdodHNhbG1vbjEAbGVtb25jaGlmZm9uMQBsYXRpbjEAYWdvcGVuMQBzcHJpbmdncmVlbjEAZGFya29saXZlZ3JlZW4xAHBhbGVncmVlbjEAZGFya3NlYWdyZWVuMQBsaWdodGN5YW4xAHRhbjEAcGx1bTEAc2Vhc2hlbGwxAGNvcmFsMQBob3RwaW5rMQBsaWdodHBpbmsxAGRlZXBwaW5rMQBjb3Juc2lsazEAZmlyZWJyaWNrMQBqMCA8PSBpMSAmJiBpMSA8PSBqMQBraGFraTEAbGF2ZW5kZXJibHVzaDEAcGVhY2hwdWZmMQBiaXNxdWUxAGxpZ2h0c2t5Ymx1ZTEAZGVlcHNreWJsdWUxAGxpZ2h0Ymx1ZTEAY2FkZXRibHVlMQBkb2RnZXJibHVlMQBsaWdodHN0ZWVsYmx1ZTEAcm95YWxibHVlMQBzbGF0ZWJsdWUxAG5hdmFqb3doaXRlMQBhbnRpcXVld2hpdGUxAGNob2NvbGF0ZTEAY2hhcnRyZXVzZTEAbWlzdHlyb3NlMQBwYWxldHVycXVvaXNlMQBhenVyZTEAYXF1YW1hcmluZTEAdGhpc3RsZTEAbWVkaXVtcHVycGxlMQBkYXJrb3JhbmdlMQBhcmdfZTAgJiYgYXJnX2UxAGxpZ2h0Z29sZGVucm9kMQBkYXJrZ29sZGVucm9kMQBidXJseXdvb2QxAGdvbGQxAG1lZGl1bW9yY2hpZDEAZGFya29yY2hpZDEAcGFsZXZpb2xldHJlZDEAaW5kaWFucmVkMQBvcmFuZ2VyZWQxAG9saXZlZHJhYjEAbWFnZW50YTEAc2llbm5hMQBceEYxAFx4RTEAXHhEMQBceEMxAFx4QjEAXHhBMQBncmV5OTEAZ3JheTkxAFx4OTEAZ3JleTgxAGdyYXk4MQBceDgxAGdyZXk3MQBncmF5NzEAZ3JleTYxAGdyYXk2MQBncmV5NTEAZ3JheTUxAGdyZXk0MQBncmF5NDEAZ3JleTMxAGdyYXkzMQBncmV5MjEAZ3JheTIxAGdyZXkxMQBncmF5MTEAXHgxMQAvcGFpcmVkMTIvMTEAL3NldDMxMi8xMQAvcmRneTExLzExAC9yZHlsYnUxMS8xMQAvcmRidTExLzExAC9wdW9yMTEvMTEAL3ByZ24xMS8xMQAvcmR5bGduMTEvMTEAL3NwZWN0cmFsMTEvMTEAL3BpeWcxMS8xMQAvYnJiZzExLzExAC9wYWlyZWQxMS8xMQAvc2V0MzExLzExAGNzW2ldLT5zbGFjaygpPi0wLjAwMDAwMDEAL3JkZ3k5LzEAL2J1cHU5LzEAL3JkcHU5LzEAL3B1YnU5LzEAL3lsZ25idTkvMQAvZ25idTkvMQAvcmR5bGJ1OS8xAC9yZGJ1OS8xAC9ncmV5czkvMQAvZ3JlZW5zOS8xAC9ibHVlczkvMQAvcHVycGxlczkvMQAvb3JhbmdlczkvMQAvcmVkczkvMQAvcHVvcjkvMQAveWxvcmJyOS8xAC9wdWJ1Z245LzEAL2J1Z245LzEAL3ByZ245LzEAL3JkeWxnbjkvMQAveWxnbjkvMQAvc3BlY3RyYWw5LzEAL3BpeWc5LzEAL2JyYmc5LzEAL3B1cmQ5LzEAL3lsb3JyZDkvMQAvb3JyZDkvMQAvcGFpcmVkOS8xAC9zZXQzOS8xAC9zZXQxOS8xAC9wYXN0ZWwxOS8xAC9yZGd5OC8xAC9idXB1OC8xAC9yZHB1OC8xAC9wdWJ1OC8xAC95bGduYnU4LzEAL2duYnU4LzEAL3JkeWxidTgvMQAvcmRidTgvMQAvYWNjZW50OC8xAC9ncmV5czgvMQAvZ3JlZW5zOC8xAC9ibHVlczgvMQAvcHVycGxlczgvMQAvb3JhbmdlczgvMQAvcmVkczgvMQAvcHVvcjgvMQAveWxvcmJyOC8xAC9wdWJ1Z244LzEAL2J1Z244LzEAL3ByZ244LzEAL3JkeWxnbjgvMQAveWxnbjgvMQAvc3BlY3RyYWw4LzEAL3BpeWc4LzEAL2JyYmc4LzEAL3B1cmQ4LzEAL3lsb3JyZDgvMQAvb3JyZDgvMQAvcGFpcmVkOC8xAC9zZXQzOC8xAC9zZXQyOC8xAC9wYXN0ZWwyOC8xAC9kYXJrMjgvMQAvc2V0MTgvMQAvcGFzdGVsMTgvMQAvcmRneTcvMQAvYnVwdTcvMQAvcmRwdTcvMQAvcHVidTcvMQAveWxnbmJ1Ny8xAC9nbmJ1Ny8xAC9yZHlsYnU3LzEAL3JkYnU3LzEAL2FjY2VudDcvMQAvZ3JleXM3LzEAL2dyZWVuczcvMQAvYmx1ZXM3LzEAL3B1cnBsZXM3LzEAL29yYW5nZXM3LzEAL3JlZHM3LzEAL3B1b3I3LzEAL3lsb3JicjcvMQAvcHVidWduNy8xAC9idWduNy8xAC9wcmduNy8xAC9yZHlsZ243LzEAL3lsZ243LzEAL3NwZWN0cmFsNy8xAC9waXlnNy8xAC9icmJnNy8xAC9wdXJkNy8xAC95bG9ycmQ3LzEAL29ycmQ3LzEAL3BhaXJlZDcvMQAvc2V0MzcvMQAvc2V0MjcvMQAvcGFzdGVsMjcvMQAvZGFyazI3LzEAL3NldDE3LzEAL3Bhc3RlbDE3LzEAL3JkZ3k2LzEAL2J1cHU2LzEAL3JkcHU2LzEAL3B1YnU2LzEAL3lsZ25idTYvMQAvZ25idTYvMQAvcmR5bGJ1Ni8xAC9yZGJ1Ni8xAC9hY2NlbnQ2LzEAL2dyZXlzNi8xAC9ncmVlbnM2LzEAL2JsdWVzNi8xAC9wdXJwbGVzNi8xAC9vcmFuZ2VzNi8xAC9yZWRzNi8xAC9wdW9yNi8xAC95bG9yYnI2LzEAL3B1YnVnbjYvMQAvYnVnbjYvMQAvcHJnbjYvMQAvcmR5bGduNi8xAC95bGduNi8xAC9zcGVjdHJhbDYvMQAvcGl5ZzYvMQAvYnJiZzYvMQAvcHVyZDYvMQAveWxvcnJkNi8xAC9vcnJkNi8xAC9wYWlyZWQ2LzEAL3NldDM2LzEAL3NldDI2LzEAL3Bhc3RlbDI2LzEAL2RhcmsyNi8xAC9zZXQxNi8xAC9wYXN0ZWwxNi8xAC9yZGd5NS8xAC9idXB1NS8xAC9yZHB1NS8xAC9wdWJ1NS8xAC95bGduYnU1LzEAL2duYnU1LzEAL3JkeWxidTUvMQAvcmRidTUvMQAvYWNjZW50NS8xAC9ncmV5czUvMQAvZ3JlZW5zNS8xAC9ibHVlczUvMQAvcHVycGxlczUvMQAvb3JhbmdlczUvMQAvcmVkczUvMQAvcHVvcjUvMQAveWxvcmJyNS8xAC9wdWJ1Z241LzEAL2J1Z241LzEAL3ByZ241LzEAL3JkeWxnbjUvMQAveWxnbjUvMQAvc3BlY3RyYWw1LzEAL3BpeWc1LzEAL2JyYmc1LzEAL3B1cmQ1LzEAL3lsb3JyZDUvMQAvb3JyZDUvMQAvcGFpcmVkNS8xAC9zZXQzNS8xAC9zZXQyNS8xAC9wYXN0ZWwyNS8xAC9kYXJrMjUvMQAvc2V0MTUvMQAvcGFzdGVsMTUvMQAvcmRneTQvMQAvYnVwdTQvMQAvcmRwdTQvMQAvcHVidTQvMQAveWxnbmJ1NC8xAC9nbmJ1NC8xAC9yZHlsYnU0LzEAL3JkYnU0LzEAL2FjY2VudDQvMQAvZ3JleXM0LzEAL2dyZWVuczQvMQAvYmx1ZXM0LzEAL3B1cnBsZXM0LzEAL29yYW5nZXM0LzEAL3JlZHM0LzEAL3B1b3I0LzEAL3lsb3JicjQvMQAvcHVidWduNC8xAC9idWduNC8xAC9wcmduNC8xAC9yZHlsZ240LzEAL3lsZ240LzEAL3NwZWN0cmFsNC8xAC9waXlnNC8xAC9icmJnNC8xAC9wdXJkNC8xAC95bG9ycmQ0LzEAL29ycmQ0LzEAL3BhaXJlZDQvMQAvc2V0MzQvMQAvc2V0MjQvMQAvcGFzdGVsMjQvMQAvZGFyazI0LzEAL3NldDE0LzEAL3Bhc3RlbDE0LzEAL3JkZ3kzLzEAL2J1cHUzLzEAL3JkcHUzLzEAL3B1YnUzLzEAL3lsZ25idTMvMQAvZ25idTMvMQAvcmR5bGJ1My8xAC9yZGJ1My8xAC9hY2NlbnQzLzEAL2dyZXlzMy8xAC9ncmVlbnMzLzEAL2JsdWVzMy8xAC9wdXJwbGVzMy8xAC9vcmFuZ2VzMy8xAC9yZWRzMy8xAC9wdW9yMy8xAC95bG9yYnIzLzEAL3B1YnVnbjMvMQAvYnVnbjMvMQAvcHJnbjMvMQAvcmR5bGduMy8xAC95bGduMy8xAC9zcGVjdHJhbDMvMQAvcGl5ZzMvMQAvYnJiZzMvMQAvcHVyZDMvMQAveWxvcnJkMy8xAC9vcnJkMy8xAC9wYWlyZWQzLzEAL3NldDMzLzEAL3NldDIzLzEAL3Bhc3RlbDIzLzEAL2RhcmsyMy8xAC9zZXQxMy8xAC9wYXN0ZWwxMy8xAC9wYWlyZWQxMi8xAC9zZXQzMTIvMQAvcmRneTExLzEAL3JkeWxidTExLzEAL3JkYnUxMS8xAC9wdW9yMTEvMQAvcHJnbjExLzEAL3JkeWxnbjExLzEAL3NwZWN0cmFsMTEvMQAvcGl5ZzExLzEAL2JyYmcxMS8xAC9wYWlyZWQxMS8xAC9zZXQzMTEvMQAvcmRneTEwLzEAL3JkeWxidTEwLzEAL3JkYnUxMC8xAC9wdW9yMTAvMQAvcHJnbjEwLzEAL3JkeWxnbjEwLzEAL3NwZWN0cmFsMTAvMQAvcGl5ZzEwLzEAL2JyYmcxMC8xAC9wYWlyZWQxMC8xAC9zZXQzMTAvMQBsYXRpbi0xAElTT184ODU5LTEASVNPODg1OS0xAElTTy04ODU5LTEAaSA+PSAxAHEtPm4gPT0gMQBydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0ucGFydGl0aW9uW2ldID09IDAgfHwgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLnBhcnRpdGlvbltpXSA9PSAxAGJ6LnNpemUgJSAzID09IDEATElTVF9TSVpFKCZjdHgtPlRyZWVfZWRnZSkgPT0gY3R4LT5OX25vZGVzIC0gMQBub2RlX3NldF9zaXplKGctPm5faWQpID09IG9zaXplICsgMQBuLT5jb3VudCArICgqbm4pLT5jb3VudCA9PSBOT0RFQ0FSRCArIDEAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdICsgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID09IE5PREVDQVJEICsgMQBncmV5MABncmF5MABqc29uMAAjZjBmMGYwACNlMGUwZTAAeGItPmxvY2F0ZWQgPiBBR1hCVUZfSU5MSU5FX1NJWkVfMABcMABUMABceEYwAFx4RTAAXHhEMABceEMwAFx4QjAAXHhBMABncmV5OTAAZ3JheTkwAFx4OTAAZ3JleTgwAGdyYXk4MABceDgwACM4MDgwODAAZ3JleTcwAGdyYXk3MABjY3dyb3QgPT0gMCB8fCBjY3dyb3QgPT0gOTAgfHwgY2N3cm90ID09IDE4MCB8fCBjY3dyb3QgPT0gMjcwAGN3cm90ID09IDAgfHwgY3dyb3QgPT0gOTAgfHwgY3dyb3QgPT0gMTgwIHx8IGN3cm90ID09IDI3MABncmV5NjAAZ3JheTYwAGdyZXk1MABncmF5NTAAZ3JleTQwAGdyYXk0MAByLndpZHRoKCk8MWU0MABncmV5MzAAZ3JheTMwACMzMDMwMzAAZ3JleTIwAGdyYXkyMABncmV5MTAAZ3JheTEwAFx4MTAAIzEwMTAxMAAvcGFpcmVkMTIvMTAAL3NldDMxMi8xMAAvcmRneTExLzEwAC9yZHlsYnUxMS8xMAAvcmRidTExLzEwAC9wdW9yMTEvMTAAL3ByZ24xMS8xMAAvcmR5bGduMTEvMTAAL3NwZWN0cmFsMTEvMTAAL3BpeWcxMS8xMAAvYnJiZzExLzEwAC9wYWlyZWQxMS8xMAAvc2V0MzExLzEwAC9yZGd5MTAvMTAAL3JkeWxidTEwLzEwAC9yZGJ1MTAvMTAAL3B1b3IxMC8xMAAvcHJnbjEwLzEwAC9yZHlsZ24xMC8xMAAvc3BlY3RyYWwxMC8xMAAvcGl5ZzEwLzEwAC9icmJnMTAvMTAAL3BhaXJlZDEwLzEwAC9zZXQzMTAvMTAAMTIwMABncmV5MTAwAGdyYXkxMDAASVNPLUlSLTEwMAAxMDAwMAAlIVBTLUFkb2JlLTMuMABueiA+IDAAbGlzdC0+Y2FwYWNpdHkgPiAwAGRpc3QgPiAwAHBhdGhjb3VudCA+IDAAd2d0ID4gMABuc2l0ZXMgPiAwAHNpZGVzID4gMABydiA9PSAwIHx8IChORF9vcmRlcihydiktTkRfb3JkZXIodikpKmRpciA+IDAAaW5wbiA+IDAAbGVuID4gMABxdDEtPm4gPiAwICYmIHF0Mi0+biA+IDAAbSA+IDAgJiYgbiA+IDAAbmV3VG90YWwgPiAwAHdpZHRoID4gMABsaXN0LT5zaXplID4gMABkaWN0LT5zaXplID4gMABzcGwtPnNpemUgPiAwAHNlbGYtPnNpemUgPiAwAGJ6LnNpemUgPiAwAGluY3JlYXNlID4gMABib3VuZCA+IDAAZ3JhcGgtPndlaWdodHNbeF0gPiAwAGdyYXBoLT53ZWlnaHRzW25fZWRnZXNdID4gMABpbmRleCA+PSAwAHQgPj0gMABubm9kZXMgPj0gMABuX25vZGVzID49IDAAbl9vYnMgPj0gMABuID49IDAAbi0+bGV2ZWwgPj0gMABvcmlnaW5hbCA+PSAwAE1heHJhbmsgPj0gMABQYWNrID49IDAAaWkgPCAxPDxkaW0gJiYgaWkgPj0gMAB3aWR0aCA+PSAwAGpkaWFnID49IDAAaWRpYWcgPj0gMABkID49IDAAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdID49IDAgJiYgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID49IDAAViA+PSAwAGFnbm5vZGVzKGdyYXBoKSA+PSAwAGFnbm5vZGVzKGcpID49IDAARURfdHJlZV9pbmRleChlKSA+PSAwAEVEX2NvdW50KGUpID49IDAAb2JqcDEtPnN6LnggPT0gMCAmJiBvYmpwMS0+c3oueSA9PSAwAGNfY250ID09IDAAcmFua19yZXN1bHQgPT0gMABnZXR0aW1lb2ZkYXlfcmVzID09IDAAaiA9PSAwAE5EX2luKHJpZ2h0KS5zaXplICsgTkRfb3V0KHJpZ2h0KS5zaXplID09IDAAYS5zaGFwZSA9PSAwIHx8IGIuc2hhcGUgPT0gMABsaXN0LT5iYXNlICE9IE5VTEwgfHwgaW5kZXggPT0gMCB8fCBzdHJpZGUgPT0gMABkdHNpemUoZGVzdCkgPT0gMABkdHNpemUoZy0+bl9zZXEpID09IDAAZHRzaXplKGctPmdfc2VxKSA9PSAwAGR0c2l6ZShnLT5lX3NlcSkgPT0gMABHRF9taW5yYW5rKGcpID09IDAAZHRzaXplKGctPmdfaWQpID09IDAAZHRzaXplKGctPmVfaWQpID09IDAAY29zeCAhPSAwIHx8IHNpbnggIT0gMAByZXFfYWxpZ25tZW50ICE9IDAAbWVtY21wKCZzdHlsZSwgJihncmFwaHZpel9wb2x5Z29uX3N0eWxlX3QpezB9LCBzaXplb2Yoc3R5bGUpKSAhPSAwAHJlc3VsdCA9PSAoaW50KShzaXplIC0gMSkgfHwgcmVzdWx0IDwgMABtYXNrW2lpXSA8IDAATkRfaGVhcGluZGV4KHYpIDwgMABcLwBYMTEvAGd2UmVuZGVySm9icyAlczogJS4yZiBzZWNzLgAlLipzLgBzcGVjaWZpZWQgcm9vdCBub2RlICIlcyIgd2FzIG5vdCBmb3VuZC4AR3JhcGggJXMgaGFzIGFycmF5IHBhY2tpbmcgd2l0aCB1c2VyIHZhbHVlcyBidXQgbm8gInNvcnR2IiBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkLgAxLgAtMC4AJSFQUy1BZG9iZS0AJVBERi0APCEtLQAgLAArACoAc3RyZXEoYXB0ci0+dS5uYW1lLEtleSkAIWlzX2V4YWN0bHlfZXF1YWwoUi54LCBRLngpIHx8ICFpc19leGFjdGx5X2VxdWFsKFIueSwgUS55KQBORF9vcmRlcih2KSA8IE5EX29yZGVyKHcpAHUgPT0gVUZfZmluZCh1KQAhTElTVF9JU19FTVBUWShwbGlzdCkAZ3ZfbGlzdF9pc19jb250aWd1b3VzXygqbGlzdCkAb25lIDw9IExJU1RfU0laRShsaXN0KQBucCA8IExJU1RfU0laRShsaXN0KQBpc19wb3dlcl9vZl8yKGFsaWdubWVudCkAc3RkOjppc19oZWFwKGhlYXAuYmVnaW4oKSwgaGVhcC5lbmQoKSwgZ3QpACEocS0+cXRzKQAhTElTVF9JU19FTVBUWSgmbGVhdmVzKQBvbl9oZWFwKHIpAG5vZGVfc2V0X3NpemUoZy0+bl9pZCkgPT0gKHNpemVfdClkdHNpemUoZy0+bl9zZXEpAE5EX3JhbmsoZnJvbSkgPCBORF9yYW5rKHRvKQBub3Qgd2VsbC1mb3JtZWQgKGludmFsaWQgdG9rZW4pAGFnc3VicmVwKGcsbikAbiAhPSBORF9uZXh0KG4pAGZpbmRfZmFzdF9ub2RlKGcsIG4pAChudWxsKQAoIWpjbikgJiYgKCF2YWwpACEocS0+bCkAc3ltLT5pZCA+PSAwICYmIHN5bS0+aWQgPCB0b3BkaWN0c2l6ZShvYmopAExJU1RfU0laRSgmYXJyKSA9PSAoc2l6ZV90KWFnbm5vZGVzKHNnKQBtb3ZlIHRvICglLjBmLCAlLjBmKQA7IHNwbGluZSB0byAoJS4wZiwgJS4wZikAOyBsaW5lIHRvICglLjBmLCAlLjBmKQBTcGFyc2VNYXRyaXhfaXNfc3ltbWV0cmljKEEsIHRydWUpAHZhbHVlICYmIHN0cmxlbih2YWx1ZSkAU3BhcnNlTWF0cml4X2lzX3N5bW1ldHJpYyhBLCBmYWxzZSkAIXVzZV9zdGFnZSB8fCBzaXplIDw9IHNpemVvZihzdGFnZSkARURfbGFiZWwoZmUpACFUUkVFX0VER0UoZSkAIWNvbnN0cmFpbmluZ19mbGF0X2VkZ2UoZywgZSkAbm9kZV9zZXRfaXNfZW1wdHkoZy0+bl9pZCkAcl8lZCkAbF8lZCkAKGxpYikAIVNwYXJzZU1hdHJpeF9oYXNfZGlhZ29uYWwoQSkAIHNjYW5uaW5nIGEgSFRNTCBzdHJpbmcgKG1pc3NpbmcgJz4nPyBiYWQgbmVzdGluZz8gbG9uZ2VyIHRoYW4gJWQ/KQAgc2Nhbm5pbmcgYSBxdW90ZWQgc3RyaW5nIChtaXNzaW5nIGVuZHF1b3RlPyBsb25nZXIgdGhhbiAlZD8pACBzY2FubmluZyBhIC8qLi4uKi8gY29tbWVudCAobWlzc2luZyAnKi8/IGxvbmdlciB0aGFuICVkPykAZmFsbGJhY2soNCkAb25faGVhcChyMCkgfHwgb25faGVhcChyMSkAYWd0YWlsKGUpID09IFVGX2ZpbmQoYWd0YWlsKGUpKQBhZ2hlYWQoZSkgPT0gVUZfZmluZChhZ2hlYWQoZSkpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9nZXRfbmV4dF9idWZmZXIoKQBvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eWVuc3VyZV9idWZmZXJfc3RhY2soKQBzdHJlcShtb2RlLCAiciIpIHx8IHN0cmVxKG1vZGUsICJyYiIpIHx8IHN0cmVxKG1vZGUsICJ3IikgfHwgc3RyZXEobW9kZSwgIndiIikAcG5hbWUgIT0gTlVMTCAmJiAhc3RyZXEocG5hbWUsICIiKQBzZXRsaW5ld2lkdGgoACkgcm90YXRlKCVkKSB0cmFuc2xhdGUoACB0cmFuc2Zvcm09InNjYWxlKABOT1RBVElPTigAICgAIG5lYXIgJyVzJwAlbGYsJWxmLCVsZiwnJVteJ10nAGlzZGlnaXQoKGludClkb3RwWzFdKSAmJiBpc2RpZ2l0KChpbnQpZG90cFsyXSkgJiYgZG90cFszXSA9PSAnXDAnACYAJQAkAHVybCgjADx0ZXh0UGF0aCB4bGluazpocmVmPSIjADxhcmVhIHNoYXBlPSJwb2x5IgAgZmlsbD0iIyUwMnglMDJ4JTAyeCIAKHNlcSAmIFNFUV9NQVNLKSA9PSBzZXEgJiYgInNlcXVlbmNlIElEIG92ZXJmbG93IgBndl9zb3J0X2NvbXBhciA9PSBOVUxMICYmIGd2X3NvcnRfYXJnID09IE5VTEwgJiYgInVuc3VwcG9ydGVkIHJlY3Vyc2l2ZSBjYWxsIHRvIGd2X3NvcnQiAGd2X3NvcnRfY29tcGFyICE9IE5VTEwgJiYgIm5vIGNvbXBhcmF0b3Igc2V0IGluIGd2X3NvcnQiAG9wLT5vcC51LnBvbHlnb24uY250IDw9IElOVF9NQVggJiYgInBvbHlnb24gY291bnQgZXhjZWVkcyBndnJlbmRlcl9wb2x5Z29uIHN1cHBvcnQiACB0ZXh0LWFuY2hvcj0ic3RhcnQiAHAueCAhPSBhICYmICJjYW5ub3QgaGFuZGxlIGVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpbiBob3Jpem9udGFsIGV4dHJlbWUgcG9pbnQiAGZ1bGxfbGVuZ3RoX3dpdGhvdXRfc2hhZnQgPiAwICYmICJub24tcG9zaXRpdmUgZnVsbCBsZW5ndGggd2l0aG91dCBzaGFmdCIAPGFyZWEgc2hhcGU9InJlY3QiAHNpemUgPiAwICYmICJhdHRlbXB0IHRvIGFsbG9jYXRlIGFycmF5IG9mIDAtc2l6ZWQgZWxlbWVudHMiAGluZGV4IDwgc2VsZi0+c2l6ZV9iaXRzICYmICJvdXQgb2YgYm91bmRzIGFjY2VzcyIAaW5kZXggPCBzZWxmLnNpemVfYml0cyAmJiAib3V0IG9mIGJvdW5kcyBhY2Nlc3MiACpzMSAhPSAqczIgJiYgImR1cGxpY2F0ZSBzZXBhcmF0b3IgY2hhcmFjdGVycyIAR0RfbWlucmFuayhzdWJnKSA8PSBHRF9tYXhyYW5rKHN1YmcpICYmICJjb3JydXB0ZWQgcmFuayBib3VuZHMiAGluZGV4IDwgbGlzdC5zaXplICYmICJpbmRleCBvdXQgb2YgYm91bmRzIgAodWludHB0cl90KXMgJSAyID09IDAgJiYgImhlYXAgcG9pbnRlciB3aXRoIGxvdyBiaXQgc2V0IHdpbGwgY29sbGlkZSB3aXRoIGFub255bW91cyBJRHMiACAoKyU2bGQgYnl0ZXMgJXN8JXUsIHhtbHBhcnNlLmM6JWQpICUqcyIAIGZvbnQtZmFtaWx5PSIlcyIAIGZvbnQtd2VpZ2h0PSIlcyIAIGZpbGw9IiVzIgAgZm9udC1zdHJldGNoPSIlcyIAIGZvbnQtc3R5bGU9IiVzIgBiYWQgZWRnZSBsZW4gIiVzIgAgYmFzZWxpbmUtc2hpZnQ9InN1cGVyIgBhZ3hibGVuKHhiKSA8PSBzaXplb2YoeGItPnN0b3JlKSAmJiAiYWd4YnVmIGNvcnJ1cHRpb24iAGNlbGwucm93IDwgdGFibGUtPnJvd19jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiAGNlbGwuY29sIDwgdGFibGUtPmNvbHVtbl9jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiACB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgBmdWxsX2xlbmd0aCA+IDAgJiYgIm5vbi1wb3NpdGl2ZSBmdWxsIGxlbmd0aCIAZnVsbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIGZ1bGwgYmFzZSB3aWR0aCIAbm9taW5hbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIG5vbWluYWwgYmFzZSB3aWR0aCIAIiB3aWR0aD0iJWdweCIgaGVpZ2h0PSIlZ3B4IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0IiB4PSIlZyIgeT0iJWciACIgd2lkdGg9IiVncHgiIGhlaWdodD0iJWdweCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgeD0iJWciIHk9IiVnIgAgZm9udC1zaXplPSIlLjJmIgAgZmlsbC1vcGFjaXR5PSIlZiIAPHRleHQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIAaXNmaW5pdGUobSkgJiYgImVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpcyBpbmZpbml0ZSIAKHhiLT5sb2NhdGVkID09IEFHWEJVRl9PTl9IRUFQIHx8IHhiLT5sb2NhdGVkIDw9IHNpemVvZih4Yi0+c3RvcmUpKSAmJiAiY29ycnVwdGVkIGFneGJ1ZiB0eXBlIgBBLT50eXBlID09IHR5cGUgJiYgImNhbGwgdG8gU3BhcnNlTWF0cml4X2Nvb3JkaW5hdGVfZm9ybV9hZGRfZW50cnkgIiAid2l0aCBpbmNvbXBhdGlibGUgdmFsdWUgdHlwZSIAIHRleHQtYW5jaG9yPSJtaWRkbGUiADxhcmVhIHNoYXBlPSJjaXJjbGUiAGNlbGwtPnJvdyArIGNlbGwtPnJvd3NwYW4gPD0gdGFibGUtPnJvd19jb3VudCAmJiAiY2VsbCBzcGFucyBoaWdoZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBjZWxsLnJvdyArIGNlbGwucm93c3BhbiA8PSB0YWJsZS0+cm93X2NvdW50ICYmICJjZWxsIHNwYW5zIGhpZ2hlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwtPmNvbCArIGNlbGwtPmNvbHNwYW4gPD0gdGFibGUtPmNvbHVtbl9jb3VudCAmJiAiY2VsbCBzcGFucyB3aWRlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwuY29sICsgY2VsbC5jb2xzcGFuIDw9IHRhYmxlLT5jb2x1bW5fY291bnQgJiYgImNlbGwgc3BhbnMgd2lkZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBvbGRfbm1lbWIgPCBTSVpFX01BWCAvIHNpemUgJiYgImNsYWltZWQgcHJldmlvdXMgZXh0ZW50IGlzIHRvbyBsYXJnZSIAdGhldGEgPj0gMCAmJiB0aGV0YSA8PSBNX1BJICYmICJ0aGV0YSBvdXQgb2YgcmFuZ2UiAHRhYmxlLT5oZWlnaHRzID09IE5VTEwgJiYgInRhYmxlIGhlaWdodHMgY29tcHV0ZWQgdHdpY2UiAHRhYmxlLT53aWR0aHMgPT0gTlVMTCAmJiAidGFibGUgd2lkdGhzIGNvbXB1dGVkIHR3aWNlIgAgdGV4dC1hbmNob3I9ImVuZCIAIGZvbnQtd2VpZ2h0PSJib2xkIgAgZm9udC1zdHlsZT0iaXRhbGljIgAgYmFzZWxpbmUtc2hpZnQ9InN1YiIAXCIAbGxlbiA8PSBJTlRfTUFYICYmICJYTUwgdG9rZW4gdG9vIGxvbmcgZm9yIGV4cGF0IEFQSSIAIiByeT0iAF9wIiBzdGFydE9mZnNldD0iNTAlIj48dHNwYW4geD0iMCIgZHk9IgAiIGN5PSIAIiB5PSIAIiByeD0iACBjeD0iACB4PSIAIHRhcmdldD0iACBwb2ludHM9IgAgY29vcmRzPSIAIHRleHQtZGVjb3JhdGlvbj0iACBmaWxsPSIAIiBzdHJva2Utd2lkdGg9IgA8aW1hZ2UgeGxpbms6aHJlZj0iADw/eG1sLXN0eWxlc2hlZXQgaHJlZj0iACIgbmFtZT0iACB4bGluazp0aXRsZT0iACB0aXRsZT0iACIgc3Ryb2tlPSIAPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0iADxkZWZzPgo8cmFkaWFsR3JhZGllbnQgaWQ9IgA8bWFwIGlkPSIAPGcgaWQ9IgAgZD0iACIgeTI9IgAiIHgyPSIAIiB5MT0iAHgxPSIAIHZpZXdCb3g9IiVkLjAwICVkLjAwICVkLjAwICVkLjAwIgAgdHJhbnNmb3JtPSJyb3RhdGUoJWQgJWcgJWcpIgBhZ3hibGVuKCZjdHgtPlNidWYpID09IDAgJiYgInBlbmRpbmcgc3RyaW5nIGRhdGEgdGhhdCB3YXMgbm90IGNvbnN1bWVkIChtaXNzaW5nICIgImVuZHN0cigpL2VuZGh0bWxzdHIoKT8pIgAgYWx0PSIiAEN5Y2xlIEVycm9yIQBQdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbGVkIQA8IS0tIEdlbmVyYXRlZCBieSAAJXMlenUgLSMlMDJ4JTAyeCUwMnglMDJ4IAAlcyV6dSAtIyUwMnglMDJ4JTAyeCAAJWMgJXp1IAB0ICV1IAAgY3JlYXRlIHRleHQgAHhMYXlvdXQgAGRlZmF1bHQgAHN0cmljdCAAJXMlenUgLSVzIAAgLXNtb290aCBiZXppZXIgACBtb3ZldG8gACB2ZXJzaW9uIAAgY3JlYXRlIHBvbHlnb24gACAtdGV4dCB7JXN9IC1maWxsIAAgY3JlYXRlIG92YWwgACAtd2lkdGggAG5ld3BhdGggAGdyYXBoIABzLCUuNWcsJS41ZyAAJS41ZywlLjVnLCUuNWcsJS41ZyAAZSwlLjVnLCUuNWcgACVnICVnIAAlLjAzbGYgACUuM2YgACVkICVkICVkICVkICVkICVkICUuMWYgJS40ZiAlZCAlLjFmICUuMWYgJS4wZiAlLjBmIAAgLW91dGxpbmUgACBjcmVhdGUgbGluZSAAbm9kZSAAW0dyYXBodml6XSAlczolZDogJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgACVkIABUb3RhbCBzaXplID4gMSBpbiAiJXMiIGNvbG9yIHNwZWMgAFsgL1JlY3QgWyAAVCAAUyAAT1BFTiAASSAARiAARSAAQyAAIC0+IABSYW5rIHNlcGFyYXRpb24gPSAAVW5zYXRpc2ZpZWQgY29uc3RyYWludDogAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzOiAAJXM6IABTb2x2aW5nIG1vZGVsOiAAU2V0dGluZyB1cCBzcHJpbmcgbW9kZWw6IABjb252ZXJ0IGdyYXBoOiAAIFRpdGxlOiAAInRleHQiOiAAeyJmcmFjIjogJS4wM2YsICJjb2xvciI6IAAibmFtZSI6IAAic3R5bGUiOiAAImZhY2UiOiAAMiAAPCEtLSAAIC0tIAAlIABfcCIgAGxfJWQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAADSAgICAgICAgICAgICAgICBpdGVyID0gJWQsIHN0ZXAgPSAlZiBGbm9ybSA9ICVmIG56ID0gJXp1ICBLID0gJWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgAAogICAgADoJIAAgICAgJXN9CgB0cnlpbmcgdG8gYWRkIHRvIHJlY3QgeyVmICsvLSAlZiwgJWYgKy8tICVmfQoAI2RlZmF1bHQgeyBmaW5pc2ggeyBhbWJpZW50IDAuMSBkaWZmdXNlIDAuOSB9IH0KAHBpZ21lbnQgeyBjb2xvciAlcyB9CgBsaWdodF9zb3VyY2UgeyA8MTUwMCwzMDAwLC0yNTAwPiBjb2xvciBXaGl0ZSB9CgBnbG9iYWxfc2V0dGluZ3MgeyBhc3N1bWVkX2dhbW1hIDEuMCB9CgAgICAgdGV4dHVyZSBJbWFnZVRleHR1cmUgeyB1cmwgIiVzIiB9CgAgICAgfQoALy9za3kKcGxhbmUgeyA8MCwgMSwgMD4sIDEgaG9sbG93CiAgICB0ZXh0dXJlIHsKICAgICAgICBwaWdtZW50IHsgYm96byB0dXJidWxlbmNlIDAuOTUKICAgICAgICAgICAgY29sb3JfbWFwIHsKICAgICAgICAgICAgICAgIFswLjAwIHJnYiA8MC4wNSwgMC4yMCwgMC41MD5dCiAgICAgICAgICAgICAgICBbMC41MCByZ2IgPDAuMDUsIDAuMjAsIDAuNTA+XQogICAgICAgICAgICAgICAgWzAuNzUgcmdiIDwxLjAwLCAxLjAwLCAxLjAwPl0KICAgICAgICAgICAgICAgIFswLjc1IHJnYiA8MC4yNSwgMC4yNSwgMC4yNT5dCiAgICAgICAgICAgICAgICBbMS4wMCByZ2IgPDAuNTAsIDAuNTAsIDAuNTA+XQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNjYWxlIDwxLjAwLCAxLjAwLCAxLjUwPiAqIDIuNTAKICAgICAgICAgICAgdHJhbnNsYXRlIDwwLjAwLCAwLjAwLCAwLjAwPgogICAgICAgIH0KICAgICAgICBmaW5pc2ggeyBhbWJpZW50IDEgZGlmZnVzZSAwIH0KICAgIH0KICAgIHNjYWxlIDEwMDAwCn0KLy9taXN0CmZvZyB7IGZvZ190eXBlIDIKICAgIGRpc3RhbmNlIDUwCiAgICBj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ZCBjZWxsIHNpemUgd2l0aCB1bnNwZWNpZmllZCB3aWR0aCBvciBoZWlnaHQKAGZpeGVkIHRhYmxlIHNpemUgd2l0aCB1bnNwZWNpZmllZCB3aWR0aCBvciBoZWlnaHQKAHBvcyBhdHRyaWJ1dGUgZm9yIGVkZ2UgKCVzLCVzKSBkb2Vzbid0IGhhdmUgM24rMSBwb2ludHMKACAgZ2VuZXJhdGVkICVkIGNvbnN0cmFpbnRzCgBzcGxpbmVzIGFuZCBjbHVzdGVyIGVkZ2VzIG5vdCBzdXBwb3J0ZWQgLSB1c2luZyBsaW5lIHNlZ21lbnRzCgBvYmplY3RzCgBXYXJuaW5nOiBub2RlICVzLCBwb3NpdGlvbiAlcywgZXhwZWN0ZWQgdHdvIGZsb2F0cwoAZm9udCBuYW1lICVzIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBtYXkgbm90IGJlIGFjY2VwdGVkIGJ5IHNvbWUgUFMgdmlld2VycwoAZm9udCBuYW1lICVzIGlzIGxvbmdlciB0aGFuIDI5IGNoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHJlamVjdGVkIGJ5IHNvbWUgUFMgdmlld2VycwoAY2Fubm90IGFsbG9jYXRlIHBzCgBzY2FsZT0xLjAgJXMgcmVxdWlyZWQgZm9yIGNvbXBhcmlzb25zCgBTZXR0aW5nIGluaXRpYWwgcG9zaXRpb25zCgAlcyBEV0IgMiBjb21wYXRpYmlsaXR5IGRlZmluaXRpb25zCgBhcnJheSBwYWNraW5nOiAlcyAlenUgcm93cyAlenUgY29sdW1ucwoAc3ludGF4IGFtYmlndWl0eSAtIGJhZGx5IGRlbGltaXRlZCBudW1iZXIgJyVzJyBpbiBsaW5lICVkIG9mICVzIHNwbGl0cyBpbnRvIHR3byB0b2tlbnMKAGVkZ2UgbGFiZWxzIHdpdGggc3BsaW5lcz1jdXJ2ZWQgbm90IHN1cHBvcnRlZCBpbiBkb3QgLSB1c2UgeGxhYmVscwoAZmxhdCBlZGdlIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgb25lIG9mIHdoaWNoIGhhcyBhIHJlY29yZCBzaGFwZSAtIHJlcGxhY2UgcmVjb3JkcyB3aXRoIEhUTUwtbGlrZSBsYWJlbHMKAG91dCBvZiBtZW1vcnkgd2hlbiB0cnlpbmcgdG8gYWxsb2NhdGUgJXp1IGJ5dGVzCgBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gdHJ5aW5nIHRvIGFsbG9jYXRlICV6dSAqICV6dSBieXRlcwoAdXBkYXRlOiBtaXNtYXRjaGVkIGxjYSBpbiB0cmVldXBkYXRlcwoAZ3JhcGggJXMsIGNvb3JkICVzLCBleHBlY3RlZCBmb3VyIGRvdWJsZXMKAG5vZGUgJXMsIHBvc2l0aW9uICVzLCBleHBlY3RlZCB0d28gZG91YmxlcwoARm91bmQgJWQgRGlHLUNvTGEgYm91bmRhcmllcwoASW5jaGVzCgAoJTR6dSkgJTd6dSBub2RlcyAlN3p1IGVkZ2VzCgBjb21wb3VuZEVkZ2VzOiBjb3VsZCBub3QgY29uc3RydWN0IG9ic3RhY2xlcyAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgB0aGUgYm91bmRpbmcgYm94ZXMgb2Ygc29tZSBub2RlcyB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBjb21wb3VuZEVkZ2VzOiBub2RlcyB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBzb21lIG5vZGVzIHdpdGggbWFyZ2luICglLjAyZiwlLjAyZikgdG91Y2ggLSBmYWxsaW5nIGJhY2sgdG8gc3RyYWlnaHQgbGluZSBlZGdlcwoAbWVyZ2UyOiBncmFwaCAlcywgcmFuayAlZCBoYXMgb25seSAlZCA8ICVkIG5vZGVzCgBTY2FubmluZyBncmFwaCAlcywgJWQgbm9kZXMKAFdhcm5pbmc6IG5vIGhhcmQtY29kZWQgbWV0cmljcyBmb3IgJyVzJy4gIEZhbGxpbmcgYmFjayB0byAnVGltZXMnIG1ldHJpY3MKAGluIGVkZ2UgJXMlcyVzCgBVc2luZyAlczogJXM6JXMKAEZvcm1hdDogIiVzIiBub3QgcmVjb2duaXplZC4gVXNlIG9uZSBvZjolcwoATGF5b3V0IHR5cGU6ICIlcyIgbm90IHJlY29nbml6ZWQuIFVzZSBvbmUgb2Y6JXMKAGxheW91dCAlcwoALmZ0ICVzCgBiYWQgbGFiZWwgZm9ybWF0ICVzCgBpbiByb3V0ZXNwbGluZXMsIGVkZ2UgaXMgYSBsb29wIGF0ICVzCgAgICAgICAgJTdkIG5vZGVzICU3ZCBlZGdlcyAlN3p1IGNvbXBvbmVudHMgJXMKAGluIGxhYmVsIG9mIGVkZ2UgJXMgJXMgJXMKACAgRWRnZSAlcyAlcyAlcwoAb3J0aG8gJXMgJXMKAHBvbHlsaW5lICVzICVzCgBzcGxpbmUgJXMgJXMKAHJlY3RhbmdsZSAoJS4wZiwlLjBmKSAoJS4wZiwlLjBmKSAlcyAlcwoAaW4gY2x1c3RlciAlcwoAJXMgd2FzIGFscmVhZHkgaW4gYSByYW5rc2V0LCBkZWxldGVkIGZyb20gY2x1c3RlciAlcwoAJXMgLT4gJXM6IHRhaWwgbm90IGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiBoZWFkIGlzIGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKAGhlYWQgY2x1c3RlciAlcyBpbnNpZGUgdGFpbCBjbHVzdGVyICVzCgBoZWFkIG5vZGUgJXMgaW5zaWRlIHRhaWwgY2x1c3RlciAlcwoAJXMgLT4gJXM6IGhlYWQgbm90IGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiB0YWlsIGlzIGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKAHRhaWwgY2x1c3RlciAlcyBpbnNpZGUgaGVhZCBjbHVzdGVyICVzCgB0YWlsIG5vZGUgJXMgaW5zaWRlIGhlYWQgY2x1c3RlciAlcwoAVW5oYW5kbGVkIGFkanVzdCBvcHRpb24gJXMKAHJlcG9zaXRpb24gJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggeGxhYmVsICVzCgBubyBwb3NpdGlvbiBmb3IgZWRnZSB3aXRoIHRhaWwgbGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggbGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggaGVhZCBsYWJlbCAlcwoALy8qKiogYmVnaW5fZ3JhcGggJXMKAE1heC4gaXRlcmF0aW9ucyAoJWQpIHJlYWNoZWQgb24gZ3JhcGggJXMKAENvdWxkIG5vdCBwYXJzZSAiX2JhY2tncm91bmQiIGF0dHJpYnV0ZSBpbiBncmFwaCAlcwoAaW4gbGFiZWwgb2YgZ3JhcGggJXMKAENyZWF0aW5nIGVkZ2VzIHVzaW5nICVzCgBBZGp1c3RpbmcgJXMgdXNpbmcgJXMKACVzIHdoaWxlIG9wZW5pbmcgJXMKAGRlcml2ZSBncmFwaCBfZGdfJWQgb2YgJXMKACBdICAlenUgdHJ1ZSAlcwoAXSAgJWQgdHJ1ZSAlcwoAIF0gICV6dSBmYWxzZSAlcwoAXSAgJWQgZmFsc2UgJXMKAG1ha2VQb2x5OiB1bmtub3duIHNoYXBlIHR5cGUgJXMKAG1ha2VBZGRQb2x5OiB1bmtub3duIHNoYXBlIHR5cGUgJXMKAHVzaW5nICVzIGZvciB1bmtub3duIHNoYXBlICVzCgAgIG9jdHJlZSBzY2hlbWUgJXMKAGNhbid0IG9wZW4gbGlicmFyeSBmaWxlICVzCgBjYW4ndCBmaW5kIGxpYnJhcnkgZmlsZSAlcwoAQm91bmRpbmdCb3ggbm90IGZvdW5kIGluIGVwc2YgZmlsZSAlcwoAY291bGRuJ3Qgb3BlbiBlcHNmIGZpbGUgJXMKAGNvdWxkbid0IHJlYWQgZnJvbSBlcHNmIGZpbGUgJXMKAGluIG5vZGUgJXMKAHNoYXBlZmlsZSBub3Qgc2V0IG9yIG5vdCBmb3VuZCBmb3IgZXBzZiBub2RlICVzCgBpbiBsYWJlbCBvZiBub2RlICVzCgBlbmQgJXMKAHJhbmtpbmc6IGZhaWx1cmUgdG8gY3JlYXRlIHN0cm9uZyBjb25zdHJhaW50IGVkZ2UgYmV0d2VlbiBub2RlcyAlcyBhbmQgJXMKAG9vcHMsIGludGVybmFsIGVycm9yOiB1bmhhbmRsZWQgY29sb3IgdHlwZT0lZCAlcwoAJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJS4xZiAlZCAlZCAlZCAlZCAlZCAlZAogJWQgJXMKAC8vKioqIHRleHRzcGFuOiAlcywgZm9udHNpemUgPSAlLjNmLCBmb250bmFtZSA9ICVzCgB0cmllcyA9ICVkLCBtb2RlID0gJXMKAC8vKioqIGNvbW1lbnQ6ICVzCgBmYWlsZWQgdG8gcmVzZXJ2ZSAlenUgZWxlbWVudHMgb2Ygc2l6ZSAlenUgYnl0ZXM6ICVzCgBmb250bmFtZTogIiVzIiByZXNvbHZlZCB0bzogJXMKACUlJSVQYWdlT3JpZW50YXRpb246ICVzCgBkZWxhdW5heV90cmlhbmd1bGF0aW9uOiAlcwoAZGVsYXVuYXlfdHJpOiAlcwoAZ3ZwcmludGY6ICVzCgBuZXN0aW5nIG5vdCBhbGxvd2VkIGluIHN0eWxlOiAlcwoAdW5tYXRjaGVkICcpJyBpbiBzdHlsZTogJXMKAHVubWF0Y2hlZCAnKCcgaW4gc3R5bGU6ICVzCgAlJSUlVGl0bGU6ICVzCgAlcyBUaXRsZTogJXMKACMgVGl0bGU6ICVzCgAvLyoqKiBiZWdpbl9ub2RlOiAlcwoAbGliL3BhdGhwbGFuLyVzOiVkOiAlcwoAZ3JpZCglZCwlZCk6ICVzCgBDb3VsZCBub3Qgb3BlbiAiJXMiIGZvciB3cml0aW5nIDogJXMKAHN0YXJ0IHBvcnQ6ICglLjVnLCAlLjVnKSwgdGFuZ2VudCBhbmdsZTogJS41ZywgJXMKAGVuZCBwb3J0OiAoJS41ZywgJS41ZyksIHRhbmdlbnQgYW5nbGU6ICUuNWcsICVzCgAgWyV6dV0gJXAgc2V0ICVkICglLjAyZiwlLjAyZikgKCUuMDJmLCUuMDJmKSAlcwoAJSUgJXMKACMgJXMKACAgbW9kZSAgICVzCgBsaXN0IGVsZW1lbnQgdHlwZSBpcyBub3QgYSBwb2ludGVyLCBidXQgYGZyZWVgIHVzZWQgYXMgZGVzdHJ1Y3RvcgoAY29uanVnYXRlX2dyYWRpZW50OiB1bmV4cGVjdGVkIGxlbmd0aCAwIHZlY3RvcgoAJXMgdG8gY2hhbmdlIGRyYXdpbmcgc2l6ZSwgbXVsdGlwbHkgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb24gdGhlIC5QUyBsaW5lIGFib3ZlIGFuZCB0aGUgbnVtYmVyIG9uIHRoZSB0d28gbGluZXMgYmVsb3cgKHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlcikgYnkgYSBzY2FsZSBmYWN0b3IKAGFkZF9zZWdtZW50OiBlcnJvcgoAJS41ZyAlLjVnICUuNWcgJXNjb2xvcgoAMCAwIDAgZWRnZWNvbG9yCgAwLjggMC44IDAuOCBzZXRyZ2Jjb2xvcgoAMCAwIDEgc2V0cmdiY29sb3IKADEgMCAwIHNldHJnYmNvbG9yCgAwIDAgMCBzZXRyZ2Jjb2xvcgoAJWQgJWQgc2V0bGF5ZXIKAC8vKioqIGVuZF9sYXllcgoAVVRGLTggaW5wdXQgdXNlcyBub24tTGF0aW4xIGNoYXJhY3RlcnMgd2hpY2ggY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhpcyBQb3N0U2NyaXB0IGRyaXZlcgoATGV0dGVyCgAvLyoqKiBiZWdpbl9jbHVzdGVyCgAvLyoqKiBlbmRfY2x1c3RlcgoAcmVtb3ZpbmcgZW1wdHkgY2x1c3RlcgoAQ2VudGVyCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlciAldS4gRmFsbGluZyBiYWNrIHRvIHdpZHRoIG9mIHNwYWNlIGNoYXJhY3RlcgoAYmFzZSByZWZlcmVyCgAlJVBhZ2VUcmFpbGVyCgAlJVRyYWlsZXIKAC8vKioqIGJlemllcgoAIiVzIiB3YXMgbm90IGZvdW5kIGFzIGEgZmlsZSBvciBhcyBhIHNoYXBlIGxpYnJhcnkgbWVtYmVyCgBzdG9wCgAgY3VydmV0bwoAbmV3cGF0aCAlLjBmICUuMGYgbW92ZXRvCgAlLjBmICUuMGYgbGluZXRvCgAgbGF5b3V0PW5lYXRvCgBub2RlICVzIGluIGdyYXBoICVzIGhhcyBubyBwb3NpdGlvbgoAJXMgbWF4cHNodCBhbmQgbWF4cHN3aWQgaGF2ZSBubyBtZWFuaW5nIGluIERXQiAyLjAsIHNldCBwYWdlIGJvdW5kYXJpZXMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaGFzIG5vIG1lYW5pbmcgaW4gRFdCIDIsIGFycm93aGVhZCA9IDcgbWFrZXMgZmlsbGVkIGFycm93aGVhZHMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaXMgdW5kZWZpbmVkIGluIERXQiAyLCBpbml0aWFsbHkgMSBpbiBncGljLCAyIGluIDEwdGggRWRpdGlvbgoAbWFqb3JpemF0aW9uCgAvLyoqKiBwb2x5Z29uCgBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyBlZGdlIHdlaWdodCBzdW0KAHNmZHAgb25seSBzdXBwb3J0cyBzdGFydD1yYW5kb20KAG5vZGUgcG9zaXRpb25zIGFyZSBpZ25vcmVkIHVubGVzcyBzdGFydD1yYW5kb20KAGNsb3NlcGF0aCBmaWxsCgAgZWxsaXBzZV9wYXRoIGZpbGwKACAgJS4wZiAlLjBmIGNlbGwKACVmICVmICVmICVmIGNlbGwKAGdyYXBoICVzIGlzIGRpc2Nvbm5lY3RlZC4gSGVuY2UsIHRoZSBjaXJjdWl0IG1vZGVsCgBncmFwaCBpcyBkaXNjb25uZWN0ZWQuIEhlbmNlLCB0aGUgY2lyY3VpdCBtb2RlbAoAZWRnZXMgaW4gZ3JhcGggJXMgaGF2ZSBubyBsZW4gYXR0cmlidXRlLiBIZW5jZSwgdGhlIG1kcyBtb2RlbAoAY2lyY3VpdCBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG1kcyBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG5vZGUgJyVzJywgZ3JhcGggJyVzJyBzaXplIHRvbyBzbWFsbCBmb3IgbGFiZWwKACVzIERXQiAyIGRvZXNuJ3QgdXNlIGZpbGwgYW5kIGRvZXNuJ3QgZGVmaW5lIGZpbGx2YWwKAFsge0NhdGFsb2d9IDw8IC9VUkkgPDwgL0Jhc2UgJXMgPj4gPj4KL1BVVCBwZGZtYXJrCgBbIC9Dcm9wQm94IFslZCAlZCAlZCAlZF0gL1BBR0VTIHBkZm1hcmsKACAgL0JvcmRlciBbIDAgMCAwIF0KICAvQWN0aW9uIDw8IC9TdWJ0eXBlIC9VUkkgL1VSSSAlcyA+PgogIC9TdWJ0eXBlIC9MaW5rCi9BTk4gcGRmbWFyawoAdHJvdWJsZSBpbiBpbml0X3JhbmsKAGxpbmV0aGljayA9IDA7IG9sZGxpbmV0aGljayA9IGxpbmV0aGljawoAIHNldGxpbmV3aWR0aAoAZ3NhdmUKJWQgJWQgJWQgJWQgYm94cHJpbSBjbGlwIG5ld3BhdGgKAGdzYXZlICVnICVnIHRyYW5zbGF0ZSBuZXdwYXRoCgAvLyoqKiBlbmRfZ3JhcGgKAGxheW91dCBhdHRyaWJ1dGUgaXMgaW52YWxpZCBleGNlcHQgb24gdGhlIHJvb3QgZ3JhcGgKAGluIGNoZWNrcGF0aCwgYm94ZXMgJXp1IGFuZCAlenUgZG9uJ3QgdG91Y2gKAG1lcmdlX29uZXdheSBnbGl0Y2gKACVzIGRvbid0IGNoYW5nZSBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaW4gdGhpcyBkcmF3aW5nCgBOb2RlIG5vdCBhZGphY2VudCB0byBjZWxsIC0tIEFib3J0aW5nCgBpbmNvbXBhcmFibGUgc2VnbWVudHMgISEgLS0gQWJvcnRpbmcKAEFsdGVybmF0aXZlbHksIGNvbnNpZGVyIHJ1bm5pbmcgbmVhdG8gdXNpbmcgLUdwYWNrPXRydWUgb3IgZGVjb21wb3NpbmcKAGxhYmVsX3NjaGVtZSA9ICVkID4gNCA6IGlnbm9yaW5nCgBndnJlbmRlcl9zZXRfc3R5bGU6IHVuc3VwcG9ydGVkIHN0eWxlICVzIC0gaWdub3JpbmcKAEFycm93IHR5cGUgIiVzIiB1bmtub3duIC0gaWdub3JpbmcKAGZkcCBkb2VzIG5vdCBzdXBwb3J0IHN0YXJ0PXNlbGYgLSBpZ25vcmluZwoAJXMgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgMSBvciAyIC0gaWdub3JpbmcKAE1vcmUgdGhhbiAyIGNvbG9ycyBzcGVjaWZpZWQgZm9yIGEgZ3JhZGllbnQgLSBpZ25vcmluZyByZW1haW5pbmcKAGFzIHJlcXVpcmVkIGJ5IHRoZSAtbiBmbGFnCgBiYlslc10gJS41ZyAlLjVnICUuNWcgJS41ZwoAL3BhdGhib3ggewogICAgL1kgZXhjaCAlLjVnIHN1YiBkZWYKICAgIC9YIGV4Y2ggJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCAlLjVnIHN1YiBkZWYKICAgIG5ld3BhdGggeCB5IG1vdmV0bwogICAgWCB5IGxpbmV0bwogICAgWCBZIGxpbmV0bwogICAgeCBZIGxpbmV0bwogICAgY2xvc2VwYXRoIHN0cm9rZQogfSBkZWYKL2RiZ3N0YXJ0IHsgZ3NhdmUgJS41ZyAlLjVnIHRyYW5zbGF0ZSB9IGRlZgovYXJyb3dsZW5ndGggMTAgZGVmCi9hcnJvd3dpZHRoIGFycm93bGVuZ3RoIDIgZGl2IGRlZgovYXJyb3doZWFkIHsKICAgIGdzYXZlCiAgICByb3RhdGUKICAgIGN1cnJlbnRwb2ludAogICAgbmV3cGF0aAogICAgbW92ZXRvCiAgICBhcnJvd2xlbmd0aCBhcnJvd3dpZHRoIDIgZGl2IHJsaW5ldG8KICAgIDAgYXJyb3d3aWR0aCBuZWcgcmxpbmV0bwogICAgY2xvc2VwYXRoIGZpbGwKICAgIGdyZXN0b3JlCn0gYmluZCBkZWYKL21ha2VhcnJvdyB7CiAgICBjdXJyZW50cG9pbnQgZXhjaCBwb3Agc3ViIGV4Y2ggY3VycmVudHBvaW50IHBvcCBzdWIgYXRhbgogICAgYXJyb3doZWFkCn0gYmluZCBkZWYKL3BvaW50IHsgICAgbmV3cGF0aCAgICAyIDAgMzYwIGFyYyBmaWxsfSBkZWYvbWFrZXZlYyB7CiAgICAvWSBleGNoIGRlZgogICAgL1ggZXhjaCBkZWYKICAgIC95IGV4Y2ggZGVmCiAgICAveCBleGNoIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIFkgbGluZXRvIHN0cm9rZQogICAgWCBZIG1vdmV0bwogICAgeCB5IG1ha2VhcnJvdwp9IGRlZgoAL3BhdGhib3ggewogICAgL1ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAvWSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIHkgbGluZXRvCiAgICBYIFkgbGluZXRvCiAgICB4IFkgbGluZXRvCiAgICBjbG9zZXBhdGggc3Ryb2tlCn0gZGVmCgAlIVBTLUFkb2JlLTIuMAovbm9kZSB7CiAgL1kgZXhjaCBkZWYKICAvWCBleGNoIGRlZgogIC95IGV4Y2ggZGVmCiAgL3ggZXhjaCBkZWYKICBuZXdwYXRoCiAgeCB5IG1vdmV0bwogIHggWSBsaW5ldG8KICBYIFkgbGluZXRvCiAgWCB5IGxpbmV0bwogIGNsb3NlcGF0aCBmaWxsCn0gZGVmCi9jZWxsIHsKICAvWSBleGNoIGRlZgogIC9YIGV4Y2ggZGVmCiAgL3kgZXhjaCBkZWYKICAveCBleGNoIGRlZgogIG5ld3BhdGgKICB4IHkgbW92ZXRvCiAgeCBZIGxpbmV0bwogIFggWSBsaW5ldG8KICBYIHkgbGluZXRvCiAgY2xvc2VwYXRoIHN0cm9rZQp9IGRlZgoAfSBiaW5kIGRlZgoALlBTICUuNWYgJS41ZgoAb3ZlcmxhcDogJXMgdmFsdWUgJWQgc2NhbGluZyAlLjA0ZgoAICBiZWF1dGlmeV9sZWF2ZXMgJWQgbm9kZSB3ZWlnaHRzICVkIHJvdGF0aW9uICUuMDNmCgAgIHJlcHVsc2l2ZSBleHBvbmVudDogJS4wM2YKACAgSyA6ICUuMDNmIEMgOiAlLjAzZgoAJXMgJS4zZgoACmludGVyc2VjdGlvbiBhdCAlLjNmICUuM2YKACAgICBzY2FsZSAlLjNmCgB0b3J1cyB7ICUuM2YsICUuM2YKACAgICA8JTkuM2YsICU5LjNmLCAlOS4zZj4sICUuM2YKACBpbiAlcyAtIHNldHRpbmcgdG8gJS4wMmYKAGNpcmNsZSAlcyAlLjBmLCUuMGYsJS4wZgoAcmVjdCAlcyAlLjBmLCUuMGYgJS4wZiwlLjBmCgAlZCAlZCAlZCAlLjBmICVkICVkICVkICVkICVkICUuM2YgJWQgJS40ZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYKACAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmCgAlJSUlUGFnZTogMSAxCiUlJSVQYWdlQm91bmRpbmdCb3g6ICUuMGYgJS4wZiAlLjBmICUuMGYKAHBvc1slenVdICUuMGYgJS4wZgoALm5yIFNGICUuMGYKc2NhbGV0aGlja25lc3MgPSAlLjBmCgAlcyBzYXZlIHBvaW50IHNpemUgYW5kIGZvbnQKLm5yIC5TIFxuKC5zCi5uciBERiBcbiguZgoAc2hvd3BhZ2UKJSUlJVRyYWlsZXIKJSUlJUJvdW5kaW5nQm94OiAlLmYgJS5mICUuZiAlLmYKAGFkZGluZyAlenUgaXRlbXMsIHRvdGFsIGFyZWEgPSAlZiwgdyA9ICVmLCBhcmVhL3c9JWYKAGdhcD0lZiwlZgoAICBhc3BlY3QgJWYKAGEgJWYgYiAlZiBjICVmIGQgJWYgciAlZgoAbW9kZWwgJWQgc21hcnRfaW5pdCAlZCBzdHJlc3N3dCAlZCBpdGVyYXRpb25zICVkIHRvbCAlZgoAU29sdmluZyBtb2RlbCAlZCBpdGVyYXRpb25zICVkIHRvbCAlZgoAJXMgY29vcmQgJS41ZyAlLjVnIGh0ICVmIHdpZHRoICVmCgByZWMgJWYgJWYgJWYgJWYKACVzIDogJWYgJWYgJWYgJWYKACVzIDogJWYgJWYKAG1heHBzaHQgPSAlZgptYXhwc3dpZCA9ICVmCgBtZHNNb2RlbDogZGVsdGEgPSAlZgoAIHIxICVmIHIyICVmCgBQYWNraW5nOiBjb21wdXRlIGdyaWQgc2l6ZQoAZ3NhdmUKACUlRW5kQ29tbWVudHMKc2F2ZQoAVW5yZWNvZ25pemVkIGNoYXJhY3RlciAnJWMnICglZCkgaW4gc2lkZXMgYXR0cmlidXRlCgBJbWFnZXMgdW5zdXBwb3J0ZWQgaW4gImJhY2tncm91bmQiIGF0dHJpYnV0ZQoAJXMgR05VIHBpYyB2cy4gMTB0aCBFZGl0aW9uIGRcKGUndGVudGUKAHJlc2V0ICVzIHNldCB0byBrbm93biBzdGF0ZQoAJWcgJWcgc2V0X3NjYWxlICVkIHJvdGF0ZSAlZyAlZyB0cmFuc2xhdGUKACVmICVmIHRyYW5zbGF0ZQoAJWQgJWQgdHJhbnNsYXRlCgAvLyoqKiBlbGxpcHNlCgBVbnJlY29nbml6ZWQgb3ZlcmxhcCB2YWx1ZSAiJXMiIC0gdXNpbmcgZmFsc2UKAG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKACVzOiB2c25wcmludGYgZmFpbHVyZQoAZW5kcGFnZQpzaG93cGFnZQpncmVzdG9yZQoAZW5kCnJlc3RvcmUKAGxheW91dCB3YXMgbm90IGRvbmUKAExheW91dCB3YXMgbm90IGRvbmUKAC8vKioqIHBvbHlsaW5lCgB0cnlpbmcgdG8gZGVsZXRlIGEgbm9uLWxpbmUKACMgZW5kIG9mIEZJRyBmaWxlCgBTaW5nbGUKAHJlbmRlcmVyIGZvciAlcyBpcyB1bmF2YWlsYWJsZQoAZHluYW1pYyBsb2FkaW5nIG5vdCBhdmFpbGFibGUKACUuMGYgJS4wZiBsaW5ldG8gc3Ryb2tlCgBjbG9zZXBhdGggc3Ryb2tlCgAgZWxsaXBzZV9wYXRoIHN0cm9rZQoALy8qKiogYmVnaW5fZWRnZQoALy8qKiogZW5kX2VkZ2UKAGxvc3QgJXMgJXMgZWRnZQoAb3ZlcmZsb3cgd2hlbiBjYWxjdWxhdGluZyB2aXJ0dWFsIHdlaWdodCBvZiBlZGdlCgBhZGRfdHJlZV9lZGdlOiBtaXNzaW5nIHRyZWUgZWRnZQoAaW4gcm91dGVzcGxpbmVzLCBjYW5ub3QgZmluZCBOT1JNQUwgZWRnZQoAc2hvd3BhZ2UKACVkICVkICVkIGJlZ2lucGFnZQoALy8qKiogYmVnaW5fcGFnZQoALy8qKiogZW5kX3BhZ2UKAEZpbGVuYW1lICIlcyIgaXMgdW5zYWZlCgBsYWJlbDogYXJlYSB0b28gbGFyZ2UgZm9yIHJ0cmVlCgAvLyoqKiBlbmRfbm9kZQoAVXNpbmcgZGVmYXVsdCBjYWxjdWxhdGlvbiBmb3Igcm9vdCBub2RlCgBjb250YWluX25vZGVzIGNsdXN0ICVzIHJhbmsgJWQgbWlzc2luZyBub2RlCgAlZiAlZiAlZiAlZiBub2RlCgA8PCAvUGFnZVNpemUgWyVkICVkXSA+PiBzZXRwYWdlZGV2aWNlCgBpbiBjaGVja3BhdGgsIGJveCAlenUgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGluIGNoZWNrcGF0aCwgYm94IDAgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGNsdXN0ZXIgbmFtZWQgJXMgbm90IGZvdW5kCgBtaW5jcm9zczogcGFzcyAlZCBpdGVyICVkIHRyeWluZyAlZCBjdXJfY3Jvc3MgJWxsZCBiZXN0X2Nyb3NzICVsbGQKAG5vZGUgJXMsIHBvcnQgJXMgdW5yZWNvZ25pemVkCgAlcyVzIHVuc3VwcG9ydGVkCgBjbHVzdGVyIGN5Y2xlICVzIC0tICVzIG5vdCBzdXBwb3J0ZWQKACVzIC0+ICVzOiBzcGxpbmUgc2l6ZSA+IDEgbm90IHN1cHBvcnRlZAoAbGF5b3V0IGFib3J0ZWQKAHBhZ2VkaXI9JXMgaWdub3JlZAoAVHdvIGNsdXN0ZXJzIG5hbWVkICVzIC0gdGhlIHNlY29uZCB3aWxsIGJlIGlnbm9yZWQKAElsbGVnYWwgYXR0cmlidXRlICVzIGluICVzIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgYXR0cmlidXRlICJtb2RlbCIgaW4gZ3JhcGggJXMgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBhdHRyaWJ1dGUgIm1vZGUiIGluIGdyYXBoICVzIC0gaWdub3JlZAoAc3RhcnQ9MCBub3Qgc3VwcG9ydGVkIHdpdGggbW9kZT1zZWxmIC0gaWdub3JlZAoAT3ZlcmxhcCB2YWx1ZSAiJXMiIHVuc3VwcG9ydGVkIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgUk9XUyAtIGlnbm9yZWQKAFVua25vd24gdmFsdWUgJXMgZm9yIENPTFVNTlMgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBWQUxJR04gLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBBTElHTiAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJXMgZm9yIEZJWEVEU0laRSAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJS4qcyBmb3IgU1RZTEUgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBCQUxJR04gaW4gVEQgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBBTElHTiBpbiBURCAtIGlnbm9yZWQKAFJPV1NQQU4gdmFsdWUgY2Fubm90IGJlIDAgLSBpZ25vcmVkCgBDT0xTUEFOIHZhbHVlIGNhbm5vdCBiZSAwIC0gaWdub3JlZAoAbm9kZSAlcywgcG9ydCAlcywgdW5yZWNvZ25pemVkIGNvbXBhc3MgcG9pbnQgJyVzJyAtIGlnbm9yZWQKAFVua25vd24gInNwbGluZXMiIHZhbHVlOiAiJXMiIC0gaWdub3JlZAoAaW4gcm91dGVzcGxpbmVzLCBQc2hvcnRlc3RwYXRoIGZhaWxlZAoAaW4gcm91dGVzcGxpbmVzLCBQcm91dGVzcGxpbmUgZmFpbGVkCgAjIHBsdWdpbiBsb2FkaW5nIG9mIGRlcGVuZGVuY3kgIiUuKnMiIGZhaWxlZAoAUGFyc2luZyBvZiAiJXMiIGZhaWxlZAoAJXM6JWQ6IGNsYWltZWQgdW5yZWFjaGFibGUgY29kZSB3YXMgcmVhY2hlZAoAIyB1bnN1Y2Nlc3NmdWwgcGx1Z2luIGxvYWQKACUuNWcgJS41ZyB0cmFuc2xhdGUgbmV3cGF0aCB1c2VyX3NoYXBlXyVkCgBuc2l6ZXNjYWxlPSVmLGl0ZXJhdGlvbnM9JWQKAGN0cmwtPm92ZXJsYXA9JWQKACVzICV6dSBub2RlcyAlenUgZWRnZXMgbWF4aXRlcj0lZCBiYWxhbmNlPSVkCgAvLyoqKiBiZWdpbl9sYXllcjogJXMsICVkLyVkCgBkZWdlbmVyYXRlIGNvbmNlbnRyYXRlZCByYW5rICVzLCVkCgAgIG1heCBsZXZlbHMgJWQKAAklcyAlZAoAICBCYXJuZXMtSHV0dCBjb25zdGFudCAlLjAzZiB0b2xlcmFuY2UgICUuMDNmIG1heGl0ZXIgJWQKAGd2d3JpdGVfbm9feiBwcm9ibGVtICVkCgAgIHF1YWR0cmVlIHNpemUgJWQgbWF4X2xldmVsICVkCgByZWJ1aWxkX3ZsaXN0czogbGVhZCBpcyBudWxsIGZvciByYW5rICVkCgByZWJ1aWxkX3ZsaXN0czogcmFuayBsZWFkICVzIG5vdCBpbiBvcmRlciAlZCBvZiByYW5rICVkCgAgIHNtb290aGluZyAlcyBvdmVybGFwICVkIGluaXRpYWxfc2NhbGluZyAlLjAzZiBkb19zaHJpbmtpbmcgJWQKACAgY29vbGluZyAlLjAzZiBzdGVwIHNpemUgICUuMDNmIGFkYXB0aXZlICVkCgBVbnN1cHBvcnRlZCBjaGFyc2V0IHZhbHVlICVkCgBpbiByb3V0ZXNwbGluZXMsIGlsbGVnYWwgdmFsdWVzIG9mIHByZXYgJWQgYW5kIG5leHQgJWQsIGxpbmUgJWQKACAgZWRnZV9s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bWluYXRpb24sIHZlcnNpb24gMgoAJXMgZmlsbHZhbCBpcyAwLjMgaW4gMTB0aCBFZGl0aW9uIChmaWxsIDAgbWVhbnMgYmxhY2spLCAwLjUgaW4gZ3BpYyAoZmlsbCAwIG1lYW5zIHdoaXRlKSwgdW5kZWZpbmVkIGluIERXQiAyCgAlcyByZXNldCB3b3JrcyBpbiBncGljIGFuZCAxMHRoIGVkaXRpb24sIGJ1dCBpc24ndCBkZWZpbmVkIGluIERXQiAyCgBzZXR1cExhdGluMQoAXDAwMQoAJXMgICAgICAgIHRvbGVyYW5jZSAwLjAxCgAgICAgdG9sZXJhbmNlIDAuMQoAJSVQYWdlczogMQoAICAgICAgICBkaWZmdXNlQ29sb3IgMSAxIDEKADEwMC4wMAoAIEVQU0YtMy4wCgAlcyBib3hyYWQgaXMgbm93IDAuMCBpbiBncGljLCBlbHNlIGl0IHJlbWFpbnMgMi4wCgBzcGhlcmUgezwlOS4zZiwgJTkuM2YsICU5LjNmPiwgMS4wCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2YgQVNDSUkgY2hhcmFjdGVyICV1LiBGYWxsaW5nIGJhY2sgdG8gMAoAaW5zdGFsbF9pbl9yYW5rLCBsaW5lICVkOiAlcyAlcyByYW5rICVkIGkgPSAlZCBhbiA9IDAKAGNvbmNlbnRyYXRlPXRydWUgbWF5IG5vdCB3b3JrIGNvcnJlY3RseS4KAE5vIGxpYnogc3VwcG9ydC4KAHR3b3BpOiB1c2Ugb2Ygd2VpZ2h0PTAgY3JlYXRlcyBkaXNjb25uZWN0ZWQgY29tcG9uZW50LgoAdGhlIGdyYXBoIGludG8gY29ubmVjdGVkIGNvbXBvbmVudHMuCgBPcnRob2dvbmFsIGVkZ2VzIGRvIG5vdCBjdXJyZW50bHkgaGFuZGxlIGVkZ2UgbGFiZWxzLiBUcnkgdXNpbmcgeGxhYmVscy4KAG1pbmNyb3NzICVzOiAlbGxkIGNyb3NzaW5ncywgJS4yZiBzZWNzLgoAJXMgaXMgbm90IGEga25vd24gY29sb3IuCgBpcyBpbmFwcHJvcHJpYXRlLiBSZXZlcnRpbmcgdG8gdGhlIHNob3J0ZXN0IHBhdGggbW9kZWwuCgBpcyB1bmRlZmluZWQuIFJldmVydGluZyB0byB0aGUgc2hvcnRlc3QgcGF0aCBtb2RlbC4KAFVuYWJsZSB0byByZWNsYWltIGJveCBzcGFjZSBpbiBzcGxpbmUgcm91dGluZyBmb3IgZWRnZSAiJXMiIC0+ICIlcyIuIFNvbWV0aGluZyBpcyBwcm9iYWJseSBzZXJpb3VzbHkgd3JvbmcuCgBFcnJvciBkdXJpbmcgY29udmVyc2lvbiB0byAiVVRGLTgiLiBRdWl0aW5nLgoAb3JkZXJpbmcgJyVzJyBub3QgcmVjb2duaXplZC4KAGdyYWRpZW50IHBlbiBjb2xvcnMgbm90IHlldCBzdXBwb3J0ZWQuCgAgIGluaXRDTWFqVlBTQyBkb25lOiAlZCBnbG9iYWwgY29uc3RyYWludHMgZ2VuZXJhdGVkLgoAVGhlIGNoYXJhY3RlciAnJWMnIGFwcGVhcnMgaW4gYm90aCB0aGUgbGF5ZXJzZXAgYW5kIGxheWVybGlzdHNlcCBhdHRyaWJ1dGVzIC0gbGF5ZXJsaXN0c2VwIGlnbm9yZWQuCgB0aGUgYXNwZWN0IGF0dHJpYnV0ZSBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gaW1wbGVtZW50YXRpb24gZmxhd3MgLSBhdHRyaWJ1dGUgaWdub3JlZC4KAFRoZSBsYXllcnNlbGVjdCBhdHRyaWJ1dGUgIiVzIiBkb2VzIG5vdCBtYXRjaCBhbnkgbGF5ZXIgc3BlY2lmZWQgYnkgdGhlIGxheWVycyBhdHRyaWJ1dGUgLSBpZ25vcmVkLgoAZWRnZSAlcyAtPiAlcyA6IHNldCBtb3JlIHRoYW4gb25lIHNwbGluZS4gRmlyc3QgdXNlZCwgb3RoZXIgZHJvcHBlZC4KACV6dSBvdXQgb2YgJXp1IGxhYmVscyBwb3NpdGlvbmVkLgoAJXp1IG91dCBvZiAlenUgZXh0ZXJpb3IgbGFiZWxzIHBvc2l0aW9uZWQuCgAgIGdlbmVyYXRlIGVkZ2UgY29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgTm9uLW92ZXJsYXAgQ29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgRWRnZSBDb25zdHJhaW50cy4uLgoAR2VuZXJhdGluZyBEaUctQ29MYSBFZGdlIENvbnN0cmFpbnRz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c2V0dGluZyBhIGJvdW5kaW5nIGJveCBzaXplLCBzZWUgZG90KDEpKQoAZXJyb3IgaW4gY29sb3J4bGF0ZSgpCgB0cnVuY2F0aW5nIHN0eWxlICclcycKAElsbGVnYWwgdmFsdWUgaW4gIiVzIiBjb2xvciBhdHRyaWJ1dGU7IGZsb2F0IGV4cGVjdGVkIGFmdGVyICc7JwoAZGVmaW5lIGF0dHJzMCAlJSAlJTsgZGVmaW5lIHVuZmlsbGVkICUlICUlOyBkZWZpbmUgcm91bmRlZCAlJSAlJTsgZGVmaW5lIGRpYWdvbmFscyAlJSAlJQoAPHN2ZyB3aWR0aD0iJWRwdCIgaGVpZ2h0PSIlZHB0IgoAIyBkZXBlbmRlbmNpZXMgIiUuKnMiIGRpZCBub3QgbWF0Y2ggIiUuKnMiCgAjIHR5cGUgIiUuKnMiIGRpZCBub3QgbWF0Y2ggIiUuKnMiCgAkYyBjcmVhdGUgaW1hZ2UgJS4yZiAlLjJmIC1pbWFnZSAicGhvdG9fJXMiCgBObyBvciBpbXByb3BlciBpbWFnZSBmaWxlPSIlcyIKAGZpbGUgbG9hZGluZyBpcyBkaXNhYmxlZCBiZWNhdXNlIHRoZSBlbnZpcm9ubWVudCBjb250YWlucyBTRVJWRVJfTkFNRT0iJXMiCgBDb3VsZCBub3QgcGFyc2UgeGRvdCAiJXMiCgBObyBsb2FkaW1hZ2UgcGx1Z2luIGZvciAiJXMiCgAgWyV6dV0gKCUuMDJmLCUuMDJmKSAoJS4wMmYsJS4wMmYpICVwICIlcyIKAGZvbnRuYW1lOiB1bmFibGUgdG8gcmVzb2x2ZSAiJXMiCgBEdXBsaWNhdGUgY2x1c3RlciBuYW1lICIlcyIKAHVucmVjb2duaXplZCBhcGkgbmFtZSAiJXMiCgBpbWFnZSBjcmVhdGUgcGhvdG8gInBob3RvXyVzIiAtZmlsZSAiJXMiCgBObyBvciBpbXByb3BlciBzaGFwZWZpbGU9IiVzIiBmb3Igbm9kZSAiJXMiCgBObyBvciBpbXByb3BlciBpbWFnZT0iJXMiIGZvciBub2RlICIlcyIKAG5vZGUgIiVzIiBpcyBjb250YWluZWQgaW4gdHdvIG5vbi1jb21wYXJhYmxlIGNsdXN0ZXJzICIlcyIgYW5kICIlcyIKAEVycm9yOiBub2RlICIlcyIgYmVsb25ncyB0byB0d28gbm9uLW5lc3RlZCBjbHVzdGVycyAiJXMiIGFuZCAiJXMiCgAgICIlcyIKACNpbmNsdWRlICJjb2xvcnMuaW5jIgojaW5jbHVkZSAidGV4dHVyZXMuaW5jIgojaW5jbHVkZSAic2hhcGVzLmluYyIKAFVua25vd24gSFRNTCBlbGVtZW50IDwlcz4gb24gbGluZSAlbHUgCgAlcyBpbiBsaW5lICVsdSAKAHNjYWxlIGJ5ICVnLCVnIAoAY29tcHJlc3MgJWcgCgBMYXlvdXQgd2FzIG5vdCBkb25lLiAgTWlzc2luZyBsYXlvdXQgcGx1Z2lucz8gCgCJUE5HDQoaCgAJAEGBgAULtgMBAQEBAQEBAQIDAQECAQEBAQEBAQEBAQEBAQEBAQEBAgEEBQEBAQEBAQYBAQcICQoKCgoKCgoKCgoBAQsBDAENDg8QERITFBUWExMTExcYGRMaGxwdExMTExMBHgEBEwEfICEiIxMkJSYTExMTJygpEyorLC0TExMTEwEBAQEBExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMuExMTLxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTMBMTExMTExMTExMTExMTExMAAAAAAAAEAAQAHAAcACEAIQAkACIACgACABYACQAiACIAIgAVAB0AAQAUABQAFAAUABQAFAAUAAgABAAFABwAGwAXABwAIQAgAB8AHgAJABMAAAAVABIAFQADAAcAFQAVABQAFAAUABQAFAAUABQAFAAIAAQABQAFAAYAHAAaABgAGQAhAAcAFQAUABQAFAAUABQAFAALABQADQAUAAwAFAAUABQADgAUABQAFAAQABQADwAUABEAQcKDBQuVBAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMABAAHAAMABAAFAAUABgAGAAgABwAHABEAFgASABEAEgAIAAgADwAPABcADwAYAA8AGQAaABoAHgAWADQAHgAFADIABgAiACIAMwAXABgANQAZABoAGgAqADYAKgA0ADcAMgBFADsAPAAzADsAPABGADUARwBIAEwANgAiAEkASgA3AEUATgBQAGIAUQBSAFQARgBHAFUASABMAFYASQBKAFgAWgBOAEQAUABRAFIAVAA4AC8ALABVACkAVgAbABAAWABaAF0AXQBdAF0AXQBdAF0AXgBeAF4AXgBeAF4AXgBfAF8AXwBfAF8AXwBfAGAACQBgAGAAYABgAGAAYQBhAGMAAgBjAGMAYwBjAGMAZAAAAGQAAABkAGQAZABlAAAAZQBlAGUAZQBlAGYAAAAAAGYAZgBmAGYAZwAAAGcAZwBnAGcAaAAAAGgAaABoAGgAaABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAEHkhwULzQGuAC4ALwAzADUAMAA3AKoA2wDbANsA2wAAAD0AhwA3ADcA2wDbAAAAKAA1AC4AMgAvAGIAAAAAAEcAAADbANsAUQAAANsA2wDbAAAA2wCEAFUA2wCCANsAAACBANsAAAA+AEIAQQBIAEQAUgBbAAAAAABeAF8A2wAAANsA2wDbAAAAAAB7AEkAVwBSAFoAWgBdAAAAXwAAAF8AAABlAF0AXwAAAF0AbgBqAAAAaQAAAG4AAADbAJMAmgChAKgAqwBwALEAuAC/AMYAzQDTAEHCiQULzwFcAAEAXQBdAF4AXgBfAF8AXABcAFwAXABcAGAAXABcAFwAYQBcAFwAYgBiAGIAYgBiAGIAYgBjAGQAZQBmAFwAXABcAGcAXABcAFwAYABcAFwAYQBcAGEAXABoAGEAXABiAGIAYgBiAGIAYgBiAGIAYwBkAGUAZQBcAGYAXABcAFwAZwBoAGEAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAAAAXABcAFwAXABcAFwAXABcAFwAXABcAFwAQaGLBQswAQECAwEEAQUBBgcHAQYGBgYGBgYGBgYGBgYGBgYDBgYGBgYGBgYGBgYGBgYGBgYGAEHiiwULowQKAAsADAANAA4ACgAPABAAEQASABMACgAUABUAFQAVABYAFwAVABgAFQAVABkAFQAVABUAGgAVABUACgAVABUAFQAWABcAGAAVABUAGQAVABUAFQAaABUAFQAVABUAGwAMAAwAJAAeAB4AIAAhACAAIQAkACUAJgAtADIALwAuACoAJQAmACgAKQAzACoANAArADUANgA3ADwAMgBHAD0AIgBFACIAPwBAAEYAMwA0AEgANQA2ADcALwBJACoARwBKAEUATABcADwARgBcAD0ATQBIAE4ATwBSAEkAQQBQAFEASgBMAFMAVAAxAFUAVgBXAE0ATgBYAE8AUgBZAFAAUQBaAFsAUwBEAFQAVQBWAFcASwBEACwAWAAsAFkAOAAsAFoAWwAdAB0AHQAdAB0AHQAdAB8AHwAfAB8AHwAfAB8AIwAjACMAIwAjACMAIwAnAFwAJwAnACcAJwAnADAAMAA5ABwAOQA5ADkAOQA5ADoAXAA6AFwAOgA6ADoAOwBcADsAOwA7ADsAOwA+AFwAXAA+AD4APgA+AEIAXABCAEIAQgBCAEMAXABDAEMAQwBDAEMACQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAMAAAADQAAAA4AAAAOAEGQkAUL0QUR7u4TCAPu/u7u7gHu7u4B7u4J/u4SFRfuEgHu7u7uCg3u7u7u7u7u7u4B7u4WCAEBGQ4Y7u4bGBru7h3u7u7uARX77u7u7hAe7u7uAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWEQICAgICAgICAgICAgISEAITAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUAhUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4CDwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBAgMEBQYHCAkKCwwNAAAACwMEBQ8HAwwNBgwNDgwNGhUAAQADBw4GDwgMDRITCSoQERAWLzANMhETLjIUEhQSQRMsE0JAKkIZ//8sAAAAACIMDQ4jDwkQEQoQEcwQES1F/AEG9g8H9iQCEBEvMCg2SUomMTs8PTYqOTo+Py/YQEQwNyVHQzVIKwAAOAAAAAAAAwkAAAABDgILDAgjJCUzODoADRASGxYcEicvIhcwHjkGBzIFDxEUGCkAEykAAAAAADQVKB0eACEmMR8uOxksABsAIBoqKzcANTYtAAAAAAACAgEAAwMBAAEAAQEBAAIBAQACAgMBAQAABQABAwEDBQMBAQEBAgABAAQCAAIDAQADAgEAAQEAAQEBAwAAAAAAFxgYGBkaGxscHB0dHh4fHyAgISEiIyMlJiQkJycoKCgpKSoqKisrLCwtLi4vMDEzMjQ0NDU1NTY2NzcAAAAA7u787u7u7u7uHyDu+e/u7u4M7u7uBg/u7vLu7u7u7vXuAEHxlQULLwMIBCEFCxITJxQVFikyQRcYGRosMzRCRhscHS4eSx8ga2V5AF9BR19zdHJkYXRhAEGwlgULFRAdAAB3DAAAWwwAAPFQAAA7TwAABgBB0JYFC+PrATLEAABVXcl/yX//ACO1AAC7LdS+rtT/ABSnAAAUd/39wIb/ANLCAABVXcl/yX//AMOzAAC7LdS+rtT/ALSlAAAUd/39wIb/ANeYAAAqZv///5n/AHLBAABVXcl/yX//AGOyAAC7LdS+rtT/AFSkAAAUd/39wIb/AHeXAAAqZv///5n/ADWMAACXrbA4bLD/ABLAAABVXcl/yX//AAOxAAC7LdS+rtT/APSiAAAUd/39wIb/ABeWAAAqZv///5n/ANWKAACXrbA4bLD/ALKDAADo/PDwAn//ALK+AABVXcl/yX//AKOvAAC7LdS+rtT/AJShAAAUd/39wIb/ALeUAAAqZv///5n/AHWJAACXrbA4bLD/AFKCAADo/PDwAn//AJd8AAAR4L+/Wxf/AFK9AABVXcl/yX//AEOuAAC7LdS+rtT/ADSgAAAUd/39wIb/AFeTAAAqZv///5n/ABWIAACXrbA4bLD/APKAAADo/PDwAn//ADd7AAAR4L+/Wxf/ANJ2AAAAAGZmZmb/AFLEAACTGffe6/f/AEO1AACOS+GeyuH/ADSnAACRvL0xgr3/APLCAACfEP/v8///AOOzAACPLue91+f/ANSlAACPf9Zrrtb/APeYAACT0LUhcbX/AJLBAACfEP/v8///AIOyAACPLue91+f/AHSkAACPf9Zrrtb/AJeXAACRvL0xgr3/AFWMAACV8ZwIUZz/ADLAAACfEP/v8///ACOxAACUK+/G2+//ABSjAACOS+GeyuH/ADeWAACPf9Zrrtb/APWKAACRvL0xgr3/ANKDAACV8ZwIUZz/ANK+AACfEP/v8///AMOvAACUK+/G2+//ALShAACOS+GeyuH/ANeUAACPf9Zrrtb/AJWJAACQqcZCksb/AHKCAACT0LUhcbX/ALd8AACX8ZQIRZT/AHK9AACUCP/3+///AGOuAACTGffe6/f/AFSgAACUK+/G2+//AHeTAACOS+GeyuH/ADWIAACPf9Zrrtb/ABKBAACQqcZCksb/AFd7AACT0LUhcbX/APJ2AACX8ZQIRZT/ADG8AACUCP/3+///ACKtAACTGffe6/f/ABOfAACUK+/G2+//ADaSAACOS+GeyuH/APSGAACPf9Zrrtb/ANF/AACQqcZCksb/ABZ6AACT0LUhcbX/ALF1AACV8ZwIUZz/AKByAACY62sIMGv/ACzGAAAX71RUMAX/AFDKAAB3/zwAPDD/AB23AAAX7IyMUQr/AA6pAAAYwr+/gS3/ANGaAAAdcN/fwn3/AC+OAAAeNPb26MP/AKyFAAB5JurH6uX/AJF+AAB4X82AzcH/AMx4AAB8pZc1l4//AFt0AAB8/GYBZl7/ALTFAAAX71RUMAX/AM3JAAB8/GYBZl7/AJO7AAB3/zwAPDD/AKW2AAAX7IyMUQr/AJaoAAAYwr+/gS3/AFmaAAAdcN/fwn3/ALeNAAAeNPb26MP/ADSFAAAAAPX19fX/ABl+AAB5JurH6uX/AFR4AAB4X82AzcH/AONzAAB8pZc1l4//ANjEAAAch9jYs2X/AMm1AAAAAPX19fX/ALqnAAB7f7RatKz/AHjDAAAV16amYRr/AGm0AAAdcN/fwn3/AFqmAAB4X82AzcH/AH2ZAAB5/YUBhXH/ABjCAAAV16amYRr/AAmzAAAdcN/fwn3/APqkAAAAAPX19fX/AB2YAAB4X82AzcH/ANuMAAB5/YUBhXH/ALjAAAAX7IyMUQr/AKmxAAAch9jYs2X/AJqjAAAeNPb26MP/AL2WAAB5JurH6uX/AHuLAAB7f7RatKz/AFiEAAB8/GYBZl7/AFi/AAAX7IyMUQr/AEmwAAAch9jYs2X/ADqiAAAeNPb26MP/AF2VAAAAAPX19fX/ABuKAAB5JurH6uX/APiCAAB7f7RatKz/AD19AAB8/GYBZl7/APi9AAAX7IyMUQr/AOmuAAAYwr+/gS3/ANqgAAAdcN/fwn3/AP2TAAAeNPb26MP/ALuIAAB5JurH6uX/AJiBAAB4X82AzcH/AN17AAB8pZc1l4//AHh3AAB8/GYBZl7/ALe8AAAX7IyMUQr/AKitAAAYwr+/gS3/AJmfAAAdcN/fwn3/ALySAAAeNPb26MP/AHqHAAAAAPX19fX/AFeAAAB5JurH6uX/AJx6AAB4X82AzcH/ADd2AAB8pZc1l4//ACZzAAB8/GYBZl7/AJzEAACHFPnl9fn/AI21AAB1StiZ2Mn/AH6nAABnuaIsol//ADzDAACIDvvt+Pv/AC20AAB/NuKy4uL/AB6mAABxeMJmwqT/AEGZAABivosji0X/ANzBAACIDvvt+Pv/AM2yAAB/NuKy4uL/AL6kAABxeMJmwqT/AOGXAABnuaIsol//AJ+MAABm/20AbSz/AHzAAACIDvvt+Pv/AG2xAAB3IuzM7Ob/AF6jAAB1StiZ2Mn/AIGWAABxeMJmwqT/AD+LAABnuaIsol//AByEAABm/20AbSz/ABy/AACIDvvt+Pv/AA2wAAB3IuzM7Ob/AP6hAAB1StiZ2Mn/ACGVAABxeMJmwqT/AN+JAABpn65Brnb/ALyCAABivosji0X/AAF9AABm/1gAWCT/ALy9AACGBv33/P3/AK2uAACHFPnl9fn/AJ6gAAB3IuzM7Ob/AMGTAAB1StiZ2Mn/AH+IAABxeMJmwqT/AFyBAABpn65Brnb/AKF7AABivosji0X/ADx3AABm/1gAWCT/AHu8AACGBv33/P3/AGytAACHFPnl9fn/AF2fAAB3IuzM7Ob/AICSAAB1StiZ2Mn/AD6HAABxeMJmwqT/ABuAAABpn65Brnb/AGB6AABivosji0X/APt1AABm/20AbSz/AOpyAABl/0QARBv/AO/DAACQFPTg7PT/AOC0AACURtqevNr/ANGmAADEe6eIVqf/AI/CAACIDvvt+Pv/AICzAACSNeOzzeP/AHGlAACiSsaMlsb/AJSYAADKlZ2IQZ3/AC/BAACIDvvt+Pv/ACCyAACSNeOzzeP/ABGkAACiSsaMlsb/ADSXAADEe6eIVqf/APKLAADW4YGBD3z/AM+/AACIDvvt+Pv/AMCwAACUK+a/0+b/ALGiAACURtqevNr/ANSVAACiSsaMlsb/AJKKAADEe6eIVqf/AG+DAADW4YGBD3z/AG++AACIDvvt+Pv/AGCvAACUK+a/0+b/AFGhAACURtqevNr/AHSUAACiSsaMlsb/ADKJAAC+ZLGMa7H/AA+CAADKlZ2IQZ3/AFR8AADV/G5uAWv/AA+9AACGBv33/P3/AACuAACQFPTg7PT/APGfAACUK+a/0+b/ABSTAACURtqevNr/ANKHAACiSsaMlsb/AK+AAAC+ZLGMa7H/APR6AADKlZ2IQZ3/AI92AADV/G5uAWv/ANm7AACGBv33/P3/AMqsAACQFPTg7PT/ALueAACUK+a/0+b/AN6RAACURtqevNr/AJyGAACiSsaMlsb/AHl/AAC+ZLGMa7H/AL55AADKlZ2IQZ3/AFl1AADW4YGBD3z/AEhyAADV/01NAEv/ACfFAABy054bnnf/ABi2AAAS/NnZXwL/AAmoAACtX7N1cLP/AMfDAABy054bnnf/ALi0AAAS/NnZXwL/AKmmAACtX7N1cLP/AMyZAADp0efnKYr/AGfCAABy054bnnf/AFizAAAS/NnZXwL/AEmlAACtX7N1cLP/AGyYAADp0efnKYr/ACqNAAA+0KZmph7/AAfBAABy054bnnf/APixAAAS/NnZXwL/AOmjAACtX7N1cLP/AAyXAADp0efnKYr/AMqLAAA+0KZmph7/AKeEAAAf/ObmqwL/AKe/AABy054bnnf/AJiwAAAS/NnZXwL/AImiAACtX7N1cLP/AKyVAADp0efnKYr/AGqKAAA+0KZmph7/AEeDAAAf/ObmqwL/AIx9AAAb0qamdh3/AEe+AABy054bnnf/ADivAAAS/NnZXwL/ACmhAACtX7N1cLP/AEyUAADp0efnKYr/AAqJAAA+0KZmph7/AOeBAAAf/ObmqwL/ACx8AAAb0qamdh3/AMd3AAAAAGZmZmb/ABXEAABMGfPg89v/AAa1AABfPd2o3bX/APemAACMqspDosr/ALXCAABBEfnw+ej/AKazAABXLuS65Lz/AJelAAB7Zcx7zMT/ALqYAACNxb4rjL7/AFXBAABBEfnw+ej/AEayAABXLuS65Lz/ADekAAB7Zcx7zMT/AFqXAACMqspDosr/ABiMAACR86wIaKz/APW/AABBEfnw+ej/AOawAABNKevM68X/ANeiAABfPd2o3bX/APqVAAB7Zcx7zMT/ALiKAACMqspDosr/AJWDAACR86wIaKz/AJW+AABBEfnw+ej/AIavAABNKevM68X/AHehAABfPd2o3bX/AJqUAAB7Zcx7zMT/AFiJAACJoNNOs9P/ADWCAACNxb4rjL7/AHp8AACT8p4IWJ7/ADW9AAA8DPz3/PD/ACauAABMGfPg89v/ABegAABNKevM68X/ADqTAABfPd2o3bX/APiHAAB7Zcx7zMT/ANWAAACJoNNOs9P/ABp7AACNxb4rjL7/ALV2AACT8p4IWJ7/AP+7AAA8DPz3/PD/APCsAABMGfPg89v/AOGeAABNKevM68X/AASSAABfPd2o3bX/AMKGAAB7Zcx7zMT/AJ9/AACJoNNOs9P/AOR5AACNxb4rjL7/AH91AACR86wIaKz/AG5yAACW74EIQIH/AEfEAABKFfXl9eD/ADi1AABQSNmh2Zv/ACmnAABisqMxo1T/AOfCAABJD/jt+On/ANizAABONuS65LP/AMmlAABWaMR0xHb/AOyYAABivosji0X/AIfBAABJD/jt+On/AHiyAABONuS65LP/AGmkAABWaMR0xHb/AIyXAABisqMxo1T/AEqMAABm/20AbSz/ACfAAABJD/jt+On/ABixAABNLOnH6cD/AAmjAABQSNmh2Zv/ACyWAABWaMR0xHb/AOqKAABisqMxo1T/AMeDAABm/20AbSz/AMe+AABJD/jt+On/ALivAABNLOnH6cD/AKmhAABQSNmh2Zv/AMyUAABWaMR0xHb/AIqJAABgnqtBq13/AGeCAABivosji0X/AKx8AABs/1oAWjL/AGe9AABIB/z3/PX/AFiuAABKFfXl9eD/AEmgAABNLOnH6cD/AGyTAABQSNmh2Zv/ACqIAABWaMR0xHb/AAeBAABgnqtBq13/AEx7AABivosji0X/AOd2AABs/1oAWjL/ACa8AABIB/z3/PX/ABetAABKFfXl9eD/AAifAABNLOnH6cD/ACuSAABQSNmh2Zv/AOmGAABWaMR0xHb/AMZ/AABgnqtBq13/AAt6AABivosji0X/AKZ1AABm/20AbSz/AJVyAABl/0QARBv/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AG/DAADk3NDQHIv/AGC0AADlPvHxttr/AFGmAAA9Z+G44Yb/AHSZAABIxqxNrCb/AA/CAADk3NDQHIv/AACzAADlPvHxttr/APGkAAAAAPf39/f/ABSYAAA9Z+G44Yb/ANKMAABIxqxNrCb/AK/AAADm3MXFG33/AKCxAADnTOnpo8n/AJGjAADpHf394O//ALSWAAA7JvXm9dD/AHKLAAA/gdeh12r/AE+EAABExZJNkiH/AE+/AADm3MXFG33/AECwAADnTOnpo8n/ADGiAADpHf394O//AFSVAAAAAPf39/f/ABKKAAA7JvXm9dD/AO+CAAA/gdeh12r/ADR9AABExZJNkiH/AO+9AADm3MXFG33/AOCuAADodt7ed67/ANGgAADlPvHxttr/APSTAADpHf394O//ALKIAAA7JvXm9dD/AI+BAAA9Z+G44Yb/ANR7AAA/prx/vEH/AG93AABExZJNkiH/AK68AADm3MXFG33/AJ+tAADodt7ed67/AJCfAADlPvHxttr/ALOSAADpHf394O//AHGHAAAAAPf39/f/AE6AAAA7JvXm9dD/AJN6AAA9Z+G44Yb/AC52AAA/prx/vEH/AB1zAABExZJNkiH/AP7FAADO/0tAAEv/AB7KAABl/0QARBv/AO+2AADOrYN2KoP/AOCoAADHV6uZcKv/AKOaAADHM8/Cpc//AAGOAADSFejn1Oj/AH6FAABMHvDZ8NP/AGN+AABQRNum26D/AJ54AABYe65armH/AC10AABhxXgbeDf/AIbFAADO/0tAAEv/AJvJAABhxXgbeDf/AGG7AABl/0QARBv/AHe2AADOrYN2KoP/AGioAADHV6uZcKv/ACuaAADHM8/Cpc//AImNAADSFejn1Oj/AAaFAAAAAPf39/f/AOt9AABMHvDZ8NP/ACZ4AABQRNum26D/ALVzAABYe65armH/AKXEAADERsOvjcP/AJa1AAAAAPf39/f/AIenAABSWr9/v3v/AEXDAADJqJR7MpT/ADa0AADHM8/Cpc//ACemAABQRNum26D/AEqZAABm/4gAiDf/AOXBAADJqJR7MpT/ANayAADHM8/Cpc//AMekAAAAAPf39/f/AOqXAABQRNum26D/AKiMAABm/4gAiDf/AIXAAADOrYN2KoP/AHaxAADERsOvjcP/AGejAADSFejn1Oj/AIqWAABMHvDZ8NP/AEiLAABSWr9/v3v/ACWEAABhxXgbeDf/ACW/AADOrYN2KoP/ABawAADERsOvjcP/AAeiAADSFejn1Oj/ACqVAAAAAPf39/f/AOiJAABMHvDZ8NP/AMWCAABSWr9/v3v/AAp9AABhxXgbeDf/AMW9AADOrYN2KoP/ALauAADHV6uZcKv/AKegAADHM8/Cpc//AMqTAADSFejn1Oj/AIiIAABMHvDZ8NP/AGWBAABQRNum26D/AKp7AABYe65armH/AEV3AABhxXgbeDf/AIS8AADOrYN2KoP/AHWtAADHV6uZcKv/AGafAADHM8/Cpc//AImSAADSFejn1Oj/AEeHAAAAAPf39/f/ACSAAABMHvDZ8NP/AGl6AABQRNum26D/AAR2AABYe65armH/APNyAABhxXgbeDf/AAHEAAC9C/Ls5/L/APK0AACXPdumvdv/AOOmAACNxb4rjL7/AKHCAAC5CPbx7vb/AJKzAACbKOG9yeH/AIOlAACRcM90qc//AKaYAACP97AFcLD/AEHBAAC5CPbx7vb/ADKyAACbKOG9yeH/ACOkAACRcM90qc//AEaXAACNxb4rjL7/AASMAACP940EWo3/AOG/AAC5CPbx7vb/ANKwAACoGObQ0eb/AMOiAACXPdumvdv/AOaVAACRcM90qc//AKSKAACNxb4rjL7/AIGDAACP940EWo3/AIG+AAC5CPbx7vb/AHKvAACoGObQ0eb/AGOhAACXPdumvdv/AIaUAACRcM90qc//AESJAACOt8A2kMD/ACGCAACP97AFcLD/AGZ8AACP+HsDTnv/ACG9AADpCP//9/v/ABKuAAC9C/Ls5/L/AAOgAACoGObQ0eb/ACaTAACXPdumvdv/AOSHAACRcM90qc//AMGAAACOt8A2kMD/AAZ7AACP97AFcLD/AKF2AACP+HsDTnv/AOu7AADpCP//9/v/ANysAAC9C/Ls5/L/AM2eAACoGObQ0eb/APCRAACXPdumvdv/AK6GAACRcM90qc//AIt/AACOt8A2kMD/ANB5AACP97AFcLD/AGt1AACP940EWo3/AFpyAACP+VgCOFj/AJHEAADIDvDs4vD/AIK1AACXPdumvdv/AHOnAACC0JkckJn/ADHDAADPCPf27/f/ACK0AACbKOG9yeH/ABOmAACPgM9nqc//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ANaZAADPhKOYTqP/AHHCAAD+4eTkGhz/AGKzAACSsrg3frj/AFOlAABTk69Nr0r/AHaYAADPhKOYTqP/ADSNAAAV////fwD/ABHBAAD+4eTkGhz/AAKyAACSsrg3frj/APOjAABTk69Nr0r/ABaXAADPhKOYTqP/ANSLAAAV////fwD/ALGEAAAqzP///zP/ALG/AAD+4eTkGhz/AKKwAACSsrg3frj/AJOiAABTk69Nr0r/ALaVAADPhKOYTqP/AHSKAAAV////fwD/AFGDAAAqzP///zP/AJZ9AAAPwaamVij/AFG+AAD+4eTkGhz/AEKvAACSsrg3frj/ADOhAABTk69Nr0r/AFaUAADPhKOYTqP/ABSJAAAV////fwD/APGBAAAqzP///zP/ADZ8AAAPwaamVij/ANF3AADoeff3gb//APG8AAD+4eTkGhz/AOKtAACSsrg3frj/ANOfAABTk69Nr0r/APaSAADPhKOYTqP/ALSHAAAV////fwD/AJGAAAAqzP///zP/ANZ6AAAPwaamVij/AHF2AADoeff3gb//AGBzAAAAAJmZmZn/ABLFAAByeMJmwqX/AAO2AAALm/z8jWL/APSnAACcTcuNoMv/ALLDAAByeMJmwqX/AKO0AAALm/z8jWL/AJSmAACcTcuNoMv/ALeZAADkZufnisP/AFLCAAByeMJmwqX/AEOzAAALm/z8jWL/ADSlAACcTcuNoMv/AFeYAADkZufnisP/ABWNAAA6m9im2FT/APLAAAByeMJmwqX/AOOxAAALm/z8jWL/ANSjAACcTcuNoMv/APeWAADkZufnisP/ALWLAAA6m9im2FT/AJKEAAAi0P//2S//AJK/AAByeMJmwqX/AIOwAAALm/z8jWL/AHSiAACcTcuNoMv/AJeVAADkZufnisP/AFWKAAA6m9im2FT/ADKDAAAi0P//2S//AHd9AAAZWuXlxJT/ADK+AAByeMJmwqX/ACOvAAALm/z8jWL/ABShAACcTcuNoMv/ADeUAADkZufnisP/APWIAAA6m9im2FT/ANKBAAAi0P//2S//ABd8AAAZWuXlxJT/ALJ3AAAAALOzs7P/AELGAAB4VNON08f/AGjKAADTUr28gL3/ADO3AAAqTP///7P/ACSpAACvJdq+utr/AOeaAAAEi/v7gHL/AEWOAACQZNOAsdP/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ACs6AAAhIv//+Nz/AEYwAAD259zcFDz/AI80AAB///8A////AP9GAACq/4sAAIv/AIE0AAB//4sAi4v/AHdRAAAe77i4hgv/AEEIAAAAAKmpqan/AJ8zAABV/2QAZAD/AHYHAAAAAKmpqan/AAk7AAAnbr29t2v/AD1gAADU/4uLAIv/ANYzAAA6jmtVay//AF5OAAAX////jAD/AHpTAADGwMyZMsz/AIZVAAAA/4uLAAD/AMYwAAAKeenplnr/ADg0AABVPbyPvI//ADpHAACvj4tIPYv/AGMIAAB/Z08vT0//AJgHAAB/Z08vT0//ABVKAACA/9EAztH/AP8QAADH/9OUANP/AMs5AADo6///FJP/ACJGAACK//8Av///ADQIAAAAAGlpaWn/AGkHAAAAAGlpaWn/AJRGAACU4f8ekP//AGQ6AAAAzrKyIiL/AJ5IAAAcD///+vD/AGIzAABVwIsiiyL/AAJhAADU////AP//AO4uAAAAANzc3Nz/AH1IAACqB//4+P//AL9SAAAj////1wD/AJ1RAAAe2drapSD/AJUIAAAAAICAgID/AGE0AABV/4AAgAD/AE4KAAA70P+t/y//AMoHAAAAAICAgID/AFcLAABVD//w//D/AK85AADplv//abT/AHdVAAAAjM3NXFz/AEwvAADC/4JLAIL/AFYGAAAqD/////D/ABg7AAAmavDw5oz/AAIdAACqFPrm5vr/AG08AADwD///8PX/AJAzAABA//x8/AD/ABQyAAAmMf//+s3/AGJGAACJP+at2Ob/AGo4AAAAd/DwgID/AHI0AAB/H//g////AF8KAAAqKPr6+tL/ACUIAAAAANPT09P/AHMzAABVZO6Q7pD/AFoHAAAAANPT09P/ALw5AAD4Sf//tsH/ALUwAAAMhP//oHr/ABE0AAB90bIgsqr/ABBGAACPdfqHzvr/AE8IAACUOJl3iJn/AIQHAACUOJl3iJn/AM1GAACXNN6wxN7/AD0KAAAqH////+D/ABhMAABV//8A/wD/AOozAABVwM0yzTL/AAwzAAAVFPr68Ob/AE5gAADU////AP//AKkwAAAA/4CAAAD/AGhLAABxgM1mzar/AL1GAACq/80AAM3/AGhTAADMmNO6VdP/AOBMAAC3fNuTcNv/ACQ0AABnqbM8s3H/ACVHAACwj+57aO7/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APeqAAAXJO7u38z/AMacAAAXJM3NwLD/AAeQAAAYIouLg3j/AC5gAAB///8A////AINLAABxgP9//9T/AKW5AABxgP9//9T/AD2rAABxgO527sb/AAydAABxgM1mzar/AFSQAABxgItFi3T/AKZKAAB/D//w////AJ65AAB/D//w////ADarAAB/D+7g7u7/AAWdAAB/Ds3Bzc3/AEaQAAB/DouDi4v/AIhOAAAqGvX19dz/AEhFAAAXOv//5MT/AOe4AAAXOv//5MT/AH+qAAAXOu7u1bf/AE6cAAAWOs3Nt57/AI+PAAAXOouLfWv/AIU6AAAAAAAAAAD/ADdSAAAZMf//683/AHBHAACq//8AAP//AEy5AACq//8AAP//AOSqAACq/+4AAO7/ALOcAACq/80AAM3/APSPAACq/4sAAIv/ABQRAADAzuKKK+L/AP0vAAAAvqWlKir/AOi3AAAAv///QED/AJypAAAAv+7uOzv/AHObAAAAv83NMzP/ALSOAAAAvouLIyP/ALFRAAAXY97euIf/AAS6AAAXZP//05v/AIurAAAXY+7uxZH/AFqdAAAXY83Nqn3/AKKQAAAXY4uLc1X/AHZGAACAZ6BfnqD/ABW5AACDZ/+Y9f//AK2qAACDZu6O5e7/AHycAACDZ816xc3/AL2PAACDZotThov/AGVJAAA///9//wD/AHi5AAA///9//wD/ABCrAAA//+527gD/AN+cAAA//81mzQD/ACCQAAA//4tFiwD/ADVJAAAR2tLSaR7/AG25AAAR2///fyT/AAWrAAAR2+7udiH/ANScAAAR2s3NZh3/ABWQAAAR3IuLRRP/AH84AAALr///f1D/AHe4AAAHqf//clb/AByqAAAGqe7ualD/APObAAAGqc3NW0X/ADSPAAAGqIuLPi//AIVGAACak+1kle3/ADA6AAAhIv//+Nz/AJy4AAAhIv//+Nz/AEGqAAAiI+7u6M3/ABicAAAiIs3NyLH/AFmPAAAjIouLiHj/AEswAAD259zcFDz/AJQ0AAB///8A////AFy4AAB///8A////AAGqAAB//+4A7u7/ANibAAB//80Azc3/ABmPAAB//4sAi4v/AARHAACq/4sAAIv/AIY0AAB//4sAi4v/AHxRAAAe77i4hgv/APW5AAAe8P//uQ//AHyrAAAe8O7urQ7/AEudAAAe8M3NlQz/AJOQAAAe8IuLZQj/AEYIAAAAAKmpqan/AKQzAABV/2QAZAD/AHsHAAAAAKmpqan/AA47AAAnbr29t2v/AEJgAADU/4uLAIv/ANszAAA6jmtVay//AC64AAA6j//K/3D/ANOpAAA6j+687mj/AKqbAAA6j82izVr/AOuOAAA6j4tuiz3/AGNOAAAX////jAD/AMi5AAAV////fwD/AGCrAAAV/+7udgD/AC+dAAAV/83NZgD/AHeQAAAV/4uLRQD/AH9TAADGwMyZMsz/ACO6AADGwf+/Pv//AKqrAADGwO6yOu7/AHmdAADGwM2aMs3/AMGQAADGwItoIov/AItVAAAA/4uLAAD/AMswAAAKeenplnr/AD00AABVPbyPvI//AEm4AABVPv/B/8H/AO6pAABVPu607rT/AMWbAABVPs2bzZv/AAaPAABVPotpi2n/AD9HAACvj4tIPYv/AGgIAAB/Z08vT0//AJK3AAB/aP+X////AEKpAAB/Z+6N7u7/ACubAAB/aM15zc3/AHGOAAB/aItSi4v/AJ0HAAB/Z08vT0//ABpKAACA/9EAztH/AAQRAADH/9OUANP/ANA5AADo6///FJP/AJK4AADo6///FJP/ADeqAADo6+7uEon/AA6cAADo683NEHb/AE+PAADn7IuLClD/ACdGAACK//8Av///AP24AACK//8Av///AJWqAACK/+4Asu7/AGScAACK/80Ams3/AKWPAACK/4sAaIv/ADkIAAAAAGlpaWn/AG4HAAAAAGlpaWn/AJlGAACU4f8ekP//ACC5AACU4f8ekP//ALiqAACU4e4chu7/AIecAACU4c0YdM3/AMiPAACU4YsQTov/AGk6AAAAzrKyIiL/AKa4AAAAz///MDD/AEuqAAAAz+7uLCz/ACKcAAAAz83NJib/AGOPAAAAz4uLGhr/AKNIAAAcD///+vD/AGczAABVwIsiiyL/AAdhAADU////AP//APMuAAAAANzc3Nz/AIJIAACqB//4+P//AMRSAAAj////1wD/AA+6AAAj////1wD/AJarAAAj/+7uyQD/AGWdAAAj/83NrQD/AK2QAAAj/4uLdQD/AKJRAAAe2drapSD/APm5AAAe2v//wSX/AICrAAAe2u7utCL/AE+dAAAe2s3Nmx3/AJeQAAAe2ouLaRT/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AFEvAADC/4JLAIL/ALMWAAAqAP////4AAFsGAAAqD/////D/AIW3AAAqD/////D/ADWpAAAqD+7u7uD/AAebAAAqDs3NzcH/AGSOAAAqDouLi4P/AB07AAAmavDw5oz/AMa4AAAncP//9o//AFaqAAAncO7u5oX/AC2cAAAnb83NxnP/AG6PAAAnb4uLhk7/AAcdAACqFPrm5vr/AHI8AADwD///8PX/AM24AADwD///8PX/AF2qAADvD+7u4OX/ADScAADwDs3NwcX/AHWPAADvDouLg4b/AJUzAABA//x8/AD/ABkyAAAmMf//+s3/AAS4AAAmMf//+s3/ALipAAAlMu7u6b//AI+bAAAmMc3NyaX/ANCOAAAnMYuLiXD/AGdGAACJP+at2Ob/AAq5AACKQP+/7///AKKqAACKQO6y3+7/AHGcAACKP82awM3/ALKPAACJQItog4v/AG84AAAAd/DwgID/AHc0AAB/H//g////AFe4AAB/H//g////APypAAB/H+7R7u7/ANObAAB/H820zc3/ABSPAAB/H4t6i4v/AFhRAAAjc+7u3YL/AOW5AAAjdP//7Iv/AGyrAAAjc+7u3IL/ADudAAAjc83NvnD/AIOQAAAjc4uLgUz/AGQKAAAqKPr6+tL/ACoIAAAAANPT09P/AHgzAABVZO6Q7pD/AF8HAAAAANPT09P/AME5AAD4Sf//tsH/AIe4AAD5Uf//rrn/ACyqAAD4Ue7uoq3/AAOcAAD5UM3NjJX/AESPAAD5UIuLX2X/ALowAAAMhP//oHr/APe3AAAMhP//oHr/AKupAAALhO7ulXL/AIKbAAAMhc3NgWL/AMOOAAAMhYuLV0L/ABY0AAB90bIgsqr/ABVGAACPdfqHzvr/AO+4AACPT/+w4v//AIeqAACPT+6k0+7/AFacAACOT82Nts3/AJePAACPTotge4v/ABZHAACvj/+EcP//AFQIAACUOJl3iJn/AIkHAACUOJl3iJn/ANJGAACXNN6wxN7/ACy5AACXNf/K4f//AMSqAACXNe680u7/AJOcAACXNc2itc3/ANSPAACWNYtue4v/AEIKAAAqH////+D/AKu3AAAqH////+D/AFupAAAqH+7u7tH/AESbAAAqH83NzbT/AIqOAAAqH4uLi3r/AB1MAABV//8A/wD/AO8zAABVwM0yzTL/ABEzAAAVFPr68Ob/AFNgAADU////AP//AF+6AADU////AP//AOarAADU/+7uAO7/ALWdAADU/83NAM3/AP2QAADU/4uLAIv/AK4wAADvubCwMGD/AO+3AADky///NLP/AKOpAADky+7uMKf/AHqbAADkzM3NKZD/ALuOAADky4uLHGL/AG1LAABxgM1mzar/AMJGAACq/80AAM3/AG1TAADMmNO6VdP/ABW6AADLmf/gZv//AJyrAADLme7RX+7/AGudAADLmc20Us3/ALOQAADLmot6N4v/AOVMAAC3fNuTcNv/ALq5AAC3ff+rgv//AFKrAAC3fe6fee7/ACGdAAC3fc2JaM3/AGmQAAC3fItdR4v/ACk0AABnqbM8s3H/ACpHAACwj+57aO7/ALMzAABv//oA+pr/AAVKAAB9p9FI0cz/AOdUAADk5MfHFYX/AFVGAACqxnAZGXD/AIQ2AABqCf/1//r/AJJJAAAEHv//5OH/AIS5AAAEHv//5OH/AByrAAAEHu7u1dL/AOucAAADHc3Nt7X/ACyQAAAFHYuLfXv/AEEyAAAaSf//5LX/AJJIAAAZUf//3q3/AFK5AAAZUf//3q3/AOqqAAAZUu7uz6H/ALmcAAAZUs3Ns4v/APqPAAAZUouLeV7/AIcEAACq/4AAAID/AAdGAACq/4AAAID/AEBLAAAqAP////4AAAdRAAAbF/399eb/APJEAAAq/4CAgAD/ABhgAAA4wI5rjiP/AFS6AAA4wf/A/z7/ANurAAA4wO6z7jr/AKqdAAA4wM2azTL/APKQAAA4wItpiyL/AHNOAAAb////pQD/AMy5AAAb////pQD/AGSrAAAb/+7umgD/ADOdAAAb/83NhQD/AHuQAAAb/4uLWgD/AN5VAAAL////RQD/AEm6AAAL////RQD/ANCrAAAL/+7uQAD/AJ+dAAAL/83NNwD/AOeQAAAL/4uLJQD/AI9TAADWe9racNb/ACe6AADWfP//g/r/AK6rAADWfO7ueun/AH2dAADWfM3Nacn/AMWQAADVfIuLR4n/AI9RAAAmSO7u6Kr/AP4zAABVZPuY+5j/AD64AABVZf+a/5r/AOOpAABVZO6Q7pD/ALqbAABVZM18zXz/APuOAABVZItUi1T/AC1KAAB/Q+6v7u7/AI+5AAB/RP+7////ACerAAB/RO6u7u7/APacAAB/RM2Wzc3/ADeQAAB/Q4tmi4v/APxUAADxfNvbcJP/AC+6AADxff//gqv/ALarAADxfe7ueZ//AIWdAADxfc3NaIn/AM2QAADxfIuLR13/AEctAAAaKf//79X/ACJCAAAURv//2rn/ANy4AAAURv//2rn/AGyqAAATRe7uy63/AEOcAAATRc3Nr5X/AISPAAAURYuLd2X/ANULAAAUsM3NhT//AOc5AAD3P///wMv/AJa4AAD1Sf//tcX/ADuqAAD1Se7uqbj/ABKcAAD1Ss3NkZ7/AFOPAAD1SYuLY2z/APg1AADURt3doN3/AGe4AADURP//u///AAyqAADURO7uru7/AOObAADURM3Nls3/ACSPAADUQ4uLZov/AKlGAACEO+aw4Ob/AEFNAADE3fCgIPD/AMC5AAC/z/+bMP//AFirAADAz+6RLO7/ACedAADAz819Js3/AG+QAADAz4tVGov/AAdNAAC/qplmM5n/AChWAAAA////AAD/AE+6AAAA////AAD/ANarAAAA/+7uAAD/AKWdAAAA/83NAAD/AO2QAAAA/4uLAAD/AL8vAAAAPby8j4//AOS3AAAAPv//wcH/AJipAAAAPu7utLT/AG+bAAAAPs3Nm5v/ALCOAAAAPouLaWn/APVGAACfteFBaeH/ADy5AACft/9Idv//ANSqAACft+5Dbu7/AKOcAACfts06X83/AOSPAACft4snQIv/AOwvAAAR3IuLRRP/ANswAAAEivr6gHL/APy3AAAJlv//jGn/ALCpAAAJlu7ugmL/AIebAAAJls3NcFT/AMiOAAAJlouLTDn/AM4vAAATmvT0pGD/AE80AABnqosui1f/AE24AABnq/9U/5//APKpAABnq+5O7pT/AMmbAABnq81DzYD/AAqPAABnqosui1f/AD03AAAREP//9e7/AG24AAAREP//9e7/ABKqAAASEe7u5d7/AOmbAAASEc3Nxb//ACqPAAASEIuLhoL/AM1gAAANt6CgUi3/AGi6AAANuP//gkf/AO+rAAANuO7ueUL/AL6dAAANuM3NaDn/AAaRAAANuYuLRyb/ANsbAAAAAMDAwMD/ADhGAACLbOuHzuv/AAG5AACQeP+Hzv//AJmqAACQeO5+wO7/AGicAACQeM1sps3/AKmPAACRd4tKcIv/AFJHAACvj81qWs3/AEe5AACvkP+Db///AN+qAACvkO56Z+7/AK6cAACvkM1pWc3/AO+PAACvkItHPIv/AHsIAACUOJBwgJD/AJa3AACVOP/G4v//AEapAACVOO650+7/AC+bAACUOc2fts3/AHWOAACVOItse4v/ALAHAACUOJBwgJD/ABcKAAAABf//+vr/AKW3AAAABf//+vr/AFWpAAAABe7u6en/AD6bAAAABM3Nycn/AISOAAAAA4uLiYn/AMozAABq//8A/3//ACG4AABq//8A/3//AMapAABq/+4A7nb/AJ2bAABq/80AzWb/AN6OAABq/4sAi0X/AOZGAACSm7RGgrT/ADG5AACSnP9juP//AMmqAACSnO5crO7/AJicAACSnM1PlM3/ANmPAACTm4s2ZIv/AK00AAAYVNLStIz/AGK4AAAUsP//pU//AAeqAAAUsO7umkn/AN6bAAAUsM3NhT//AB+PAAAUsIuLWiv/AAo5AAB//4AAgID/ANJMAADUHdjYv9j/ALG5AADUHv//4f//AEmrAADUHu7u0u7/ABidAADUHc3Ntc3/AGCQAADUHYuLe4v/ANwuAAAGuP//Y0f/ANy3AAAGuP//Y0f/AJCpAAAGuO7uXEL/AGebAAAGuM3NTzn/AKiOAAAGuYuLNib/ALsPAAAqAP////4AAEBKAAB7tuBA4ND/AJO5AACB//8A9f//ACurAACB/+4A5e7/APqcAACB/80Axc3/ADuQAACB/4sAhov/ACQRAADUc+7ugu7/AABVAADj19DQIJD/ADO6AADrwf//Ppb/ALqrAADrwO7uOoz/AImdAADrwM3NMnj/ANGQAADrwIuLIlL/AIUIAAAAAICAgID/AAg0AABV/4AAgAD/ALoHAAAAAICAgID/AJUwAAAA/4CAAAD/AP1MAADU/4CAAID/AMsSAAAbRPX13rP/AMu3AAAbRf//57r/AH+pAAAbRO7u2K7/AFubAAAbRM3Nupb/AKGOAAAbQ4uLfmb/AMZIAAAAAP//////AEROAAAAAPX19fX/AI0IAAAAAL6+vr7/AFg0AABV//8A/wD/AMIHAAAAAL6+vr7/AJ8wAADvubCwMGD/ADJNAADE3fCgIPD/AH4KAAAq/////wD/ALC3AAAq/////wD/AGCpAAAq/+7u7gD/AEmbAAAq/83NzQD/AI+OAAAq/4uLiwD/AEQzAAA4wM2azTL/AEHAggcLA5R4AgBBzoIHC4UIoED/////////////////////////////////////////////////////////////////////////////////////AAKqAkQDAAQABKoGOQZxAaoCqgIABIMEAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABDkCOQKDBIMEgwSNA14HxwVWBVYFxwXjBHMExwXHBaoCHQPHBeMEHQfHBccFcwTHBVYFcwTjBMcFxwWNB8cFxwXjBKoCOQKqAsEDAASqAo0DAASNAwAEjQOqAgAEAAQ5AjkCAAQ5AjkGAAQABAAEAASqAh0DOQIABAAExwUABAAEjQPXA5oB1wNUBP///////////////////////////////////////////////////////////////////////////////////////wACqgJxBAAEAAQACKoGOQKqAqoCAASPBAACqgIAAjkCAAQABAAEAAQABAAEAAQABAAEAASqAqoCjwSPBI8EAARxB8cFVgXHBccFVgXjBDkGOQYdAwAEOQZWBY0HxwU5BuMEOQbHBXMEVgXHBccFAAjHBccFVgWqAjkCqgKmBAAEqgIABHMEjQNzBI0DqgIABHMEOQKqAnMEOQKqBnMEAARzBHMEjQMdA6oCcwQABMcFAAQABI0DJwPDAScDKQT///////////////////////////////////////////////////////////////////////////////////////8AAqoCXAMABAAEqgY5BrYBqgKqAgAEZgUAAqoCAAI5AgAEAAQABAAEAAQABAAEAAQABAAEqgKqAmYFZgVmBQAEXAfjBOMEVgXHBeME4wTHBccFqgKNA1YFcwSqBlYFxwXjBMcF4wQABHMExwXjBKoG4wRzBHMEHQM5Ah0DYAMABKoCAAQABI0DAASNAzkCAAQABDkCOQKNAzkCxwUABAAEAAQABB0DHQM5AgAEjQNWBY0DjQMdAzMDMwIzA1QE////////////////////////////////////////////////////////////////////////////////////////AAIdA3EEAAQABKoGOQY5AqoCqgIABI8EAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABKoCqgKPBI8EjwQABKgGVgVWBVYFxwVWBVYFxwU5Bh0DAARWBeMEHQfHBccF4wTHBVYFcwTjBMcFVgUdB1YF4wTjBKoCOQKqAo8EAASqAgAEAASNAwAEjQOqAgAEcwQ5AjkCAAQ5AjkGcwQABAAEAAQdAx0DOQJzBI0DVgUABI0DHQPJAsMByQKPBP//vHgCAEHeigcLhQigQP////////////////////////////////////////////////////////////////////////////////////85AjkC1wJzBHMEHQdWBYcBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEOQI5AqwErASsBHMEHwhWBVYFxwXHBVYF4wQ5BscFOQIABFYFcwSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEOQI5AjkCwQNzBKoCcwRzBAAEcwRzBDkCcwRzBMcBxwEABMcBqgZzBHMEcwRzBKoCAAQ5AnMEAATHBQAEAAQABKwCFAKsAqwE////////////////////////////////////////////////////////////////////////////////////////OQKqAssDcwRzBB0HxwXnAaoCqgIdA6wEOQKqAjkCOQJzBHMEcwRzBHMEcwRzBHMEcwRzBKoCqgKsBKwErATjBM0HxwXHBccFxwVWBeMEOQbHBTkCcwTHBeMEqgbHBTkGVgU5BscFVgXjBMcFVgWNB1YFVgXjBKoCOQKqAqwEcwSqAnME4wRzBOMEcwSqAuME4wQ5AjkCcwQ5Ah0H4wTjBOME4wQdA3MEqgLjBHMEOQZzBHMEAAQdAz0CHQOsBP///////////////////////////////////////////////////////////////////////////////////////zkCOQLXAnMEcwQdB1YFhwGqAqoCHQOsBDkCqgI5AjkCcwRzBHMEcwRzBHMEcwRzBHMEcwQ5AjkCrASsBKwEcwQfCFYFVgXHBccFVgXjBDkGxwU5AgAEVgVzBKoGxwU5BlYFOQbHBVYF4wTHBVYFjQdWBVYF4wQ5AjkCOQLBA3MEqgJzBHMEAARzBHMEOQJzBHMExwHHAQAExwGqBnMEcwRzBHMEqgIABDkCcwQABMcFAAQABAAErAIUAqwCrAT///////////////////////////////////////////////////////////////////////////////////////85AqoCywNzBHMEHQfHBecBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEqgKqAqwErASsBOMEzQfHBccFxwXHBVYF4wQ5BscFOQJzBMcF4wSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEqgI5AqoCrARzBKoCcwTjBHME4wRzBKoC4wTjBDkCOQJzBDkCHQfjBOME4wTjBB0DcwSqAuMEcwQ5BnMEcwQABB0DPQIdA6wE///weAIAQe6SBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT////////////////////////////////////////////////////////////////////////////////////////NBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0E////////////////////////////////////////////////////////////////////////////////////////zQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBP///////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT//xh5AgBB/ZoHC4YIQI9AAAD///////////////////////////////8CAf///////////////////////////////////////////////wIB5ACIAVgCWAKiA7UC3QA9AT0BwgFYAuQAqAHkABsBWAJYAlgCWAJYAlgCWAJYAlgCWALkAOQAWAJYAlgCuwGyA9kCpAKhAuYCRwIkAtYC+QIBAUQBcQIfAlcD5AL/AnkC/wKdAmcCWgLYArECTQSKAlQCTQI7ARsBOwFYAvQB9AESAkcCzwFHAhQCTQFKAjgC6ADsAPQBKAFYAzgCLAJHAkcCZgHhAV4BMQIDAkkDDQICAs8BYAEJAWABWAL//wAA////////////////////////////////DwH///////////////////////////////////////////////8PAfgAwAFYAlgCsQPWAvMAZgFmAcUBWAL4ALIB+AA5AVgCWAJYAlgCWAJYAlgCWAJYAlgC+AD4AFgCWAJYAssBtgPoArACqAL6AlUCMgLgAgUDGgFiAZkCMgJkA+wCEQOMAhEDrgJ3Am0C4gLJAlkEoAJqAl0CYgE5AWIBWAL0AfQBIwJYAtgBWAIeAmwBXAJJAv8AAwEYAj8BbQNJAkACWAJYAogB6AGAAUMCDwJVAyICDgLaAYcBIAGHAVgC//8AAP///////////////////////////////wIB////////////////////////////////////////////////AgHkAIgBWAJYAqIDtQLdAD0BPQHCAVgC5ACoAeQAGwFYAlgCWAJYAlgCWAJYAlgCWAJYAuQA5ABYAlgCWAK7AbID2QKkAqEC5gJHAiQC1gL5AgEBRAFxAh8CWAPjAv8CeQL/Ap0CZwJaAtgCsAJNBIoCVAJNAjsBGwE7AVgC9AH0ARICRwLPAUcCFAJNAUoCOALoAOwA9AEoAVgDOAIsAkcCRwJmAeEBXgExAgMCSQMNAgICzwFgAQkBYAFYAv//AAD///////////////////////////////8PAf///////////////////////////////////////////////w8B+ADAAVgCWAKxA9YC8wBmAWYBxQFYAvgAsgH4ADkBWAJYAlgCWAJYAlgCWAJYAlgCWAL4APgAWAJYAlgCywG2A+gCsAKoAvoCVQIyAuACBQMaAWIBmAIyAmUD6wIRA4wCEQOuAncCbQLiAskCWQSgAmoCXQJiATkBYgFYAvQB9AEjAlgC2AFYAh4CbAFcAkkC/wADARgCPwFtA0kCQAJYAlgCiAHoAYABQwIPAlUDIgIOAtoBhwEgAYcBWAL//yB5AgBBjqMHC4UIoED/////////////////////////////////////////////////////////////////////////////////////iwI1A64DtAYXBZoHPQYzAh8DHwMABLQGiwLjAosCsgIXBRcFFwUXBRcFFwUXBRcFFwUXBbICsgK0BrQGtAY/BAAIeQV9BZYFKQYOBZoEMwYEBlwCXAI/BXUE5wb8BUwG0wRMBo8FFAXjBNsFeQXpB3sF4wR7BR8DsgIfA7QGAAQABOcEFAVmBBQF7ATRAhQFEgU5AjkCogQ5AssHEgXlBBQFFAVKAysEIwMSBbwEiwa8BLwEMwQXBbICFwW0Bv///////////////////////////////////////////////////////////////////////////////////////8kCpgMrBLQGkQUECPoGcwKoA6gDLwS0BgoDUgMKA+wCkQWRBZEFkQWRBZEFkQWRBZEFkQUzAzMDtAa0BrQGpAQACDEGGQbfBaQGdwV3BZEGsgb6AvoCMwYZBfYHsgbNBt0FzQYpBsMFdQV/BjEG0wgrBssFzQWoA+wCqAO0BgAEAARmBboFvgS6BW0FewO6BbIFvgK+AlIFvgJWCLIFfwW6BboF8gPDBNMDsgU3BWQHKQU3BagEsgXsArIFtAb///////////////////////////////////////////////////////////////////////////////////////+LAjUDrgO0BhcFmgc9BjMCHwMfAwAEtAaLAuMCiwKyAhcFFwUXBRcFFwUXBRcFFwUXBRcFsgKyArQGtAa0Bj8EAAh5BX0FlgUpBg4FmgQzBgQGXAJcAj8FdQTnBvwFTAbTBEwGjwUUBeME2wV5BekHewXjBHsFHwOyAh8DtAYABAAE5wQUBWYEFAXsBNECFAUSBTkCOQKiBDkCywcSBeUEFAUUBUoDKwQjAxIFvASLBrwEvAQzBBcFsgIXBbQG////////////////////////////////////////////////////////////////////////////////////////yQKmAysEkQWRBQQI+gZzAqgDqAMvBLQGCgNSAwoD7AKRBZEFkQWRBZEFkQWRBZEFkQWRBTMDMwO0BrQGtAakBAAIMQYZBt8FpAZ3BXcFkQayBvoC+gIzBhkF9geyBs0G3QXNBikGwwV1BX8GMQbTCCsGywXNBagD7AKoA7QGAAQABGYFugW+BLoFbQV7A7oFsgW+Ar4CUgW+AlYIsgV/BboFugXyA8ME0wOyBTcFZAcpBTcFqASyBewCsgW0Bv//KHkCAEGeqwcLhQigQGYE////////////////////////////////AAD///////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//9mBP///////////////////////////////wAA////////////////////////////////////////////////ZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBP//ZgT///////////////////////////////8AAP///////////////////////////////////////////////2YEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgT///////////////////////////////////////////////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//80eQIAQa6zBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////2kC8AKZAjIEMgTNBKYFRwHwAvAC8AIyBPAC8ALwAjIEMgQyBDIEMgQyBDIEMgQyBDIEMgTwAvACMgQyBDIE8AIqBrgEhwTJBOgESQQzBGkFPAU6AtADmwQNBK0FGwVkBXYEaAWoBNkDpQQwBbME0QZ0BJAEZwTwAtgC8AIyBDIEMgQ0BHUE9gN1BF0E9QIEBF8ESALvAgkEXAKkBl8ESwR1BHUEHAM9AywDXwTrA/QFAgTyA8wD8AIyBPACMgT///////////////////////////////////////////////////////////////////////////////////////9pAvAC7wKwBLAEeQWmBdYB8ALwAnUDsATwAvAC8AIfA7AEsASwBLAEsASwBLAEsASwBLAE8ALwArAEsASwBIEDKgYRBcME5QQkBY0EqwRfBXgFOgJDBPAEbAT2BVcFoAWyBKwF4wQXBOUEbAX5BBIHzgToBHsENwPYAjcDsASwBLAEQwSnBBgEpQSZBPUCBAS+BGMC7wJiBFwC4Aa5BIcEqQSsBGsDcgMsA7oEOARFBmsERQQ6BHgDsAR4A7AE////////////////////////////////////////////////////////////////////////////////////////aQLwApkCMgTZA80EpgVHAfAC8ALwAjIE8ALwAvACMgQyBDIEMgQyBDIEMgQyBDIEMgQyBPAC8AIyBDIEMgTwAioG4wSHBMkE6ARJBDMEaQU8BToC0AObBA0EFwYbBWQFWQRkBagE2QOlBDAFswTRBnQEkARnBPAC2ALwAjIEMgQyBDQEdQSuA3UETAQ2AwQEdQR0Au8CCQSQAqQGXwRLBHUEdQRVAz0DXAN0BOsD9AUCBPIDzAPwAjIE8AIyBP///////////////////////////////////////////////////////////////////////////////////////2kC8AIgA7AEsATcBaYFaQLwAvACdQOwBPAC8ALwAi0DsASwBLAEsASwBLAEsASwBLAEsATwAvACsASwBLAELQMqBukEuATnBA8FvwSvBGkFbQU6Av0DMwU6BEoGSAWeBasEKAb9BAMEewVLBXcFaQdBBXgF5ATiA9ID4gOwBLAEsAS+BL8E8QO/BGoESANIBH8EnQIaA1EEjwKkBn8EjwTKBMoEkwOsA4EDdQRrBDAGmwSDBEME4gOwBOIDsAT//0B5AgBBvrsHC4UIoED/////////////////////////////////////////////////////////////////////////////////////0AImA6wDjAYWBZwI0AUmAqIDogMWBYwG6QKiA+kCogMWBRYFFgUWBRYFFgUWBRYFFgUWBaIDogOMBowGjAZdBAAIeAV8BZYFKgYPBZkENAYDBl4DowOLBXQEvgb8BUwG0wRMBpAFeAXuBNsFeAXpB3sF7AR7BaIDogOiA4wGFgUWBc4E/AQrBPwExATQAvwEEAUyAsECvAQyAsgHEAXbBPwE/ARqAysEJwMQBbwEjAa8BLwENAQUBaIDFAWMBv///////////////////////////////////////////////////////////////////////////////////////7wCOAOzBPAGsAUtCuYGqAJZBFkEsAXwBuQC1wPkAoQFsAWwBbAFsAWwBbAFsAWwBbAFsAU4AzgD8AbwBvAG7wS2BzYGGAbKBaQGdwU0BX0GswZeBHEEKwYZBZUHxgbNBt0FzQZCBq8FdAV/BhwGBwkcBuUFiQVZBIQFWQTwBrAFsAVYBZgFtQSYBVAFYQOYBbMFvAI5A14FvAJ3CLMFfgWYBZgF+gO/BKUDswUzBdYHWgU1BcYEsAVZBLAF8Ab////////////////////////////////////////////////////////////////////////////////////////QAiYDrAOMBhYFnAjQBSYCogOiAxYFjAbpAqID6QKiAxYFFgUWBRYFFgUWBRYFFgUWBRYFogOiA4wGjAaMBl0EAAh2BXwFlgUgBg8FmQQ0BgMGXgOjA4sFdAS+BvwFTAbTBEwGkAV4Be4E2wV2BewHewXsBHsFogOiA6IDjAYWBRYFzgT8BCsE/ATEBNAC+QQQBTICwQKyBDICyQcQBdsE/AT8BGoDKwQnAxAFugSMBrwEugQ0BBQFogMUBYwG////////////////////////////////////////////////////////////////////////////////////////vAI4A7ME8AawBS0K5gaoAlkEWQSwBfAG5ALXA+QChAWwBbAFsAWwBbAFsAWwBbAFsAWwBTgDOAPwBvAG8AbvBLYHNgYYBsoFpAZ3BTQFfQazBl4EcQQrBhkFlQfGBs0G3QXNBkIGrwV0BX8GHAYHCRwG5QWJBVkEhAVZBPAGsAWwBVgFmAW1BJgFUAVhA5gFswW8AjkDXgW8AncIswV8BZgFmAX6A78EpQOzBTEF1gdaBTUFxgSwBVkEsAXwBv//SHkCAEHOwwcLhQigQP////////////////////////////////////////////////////////////////////////////////////8UAiMCNQMrBZMElgbXBcUBXgJeAmoEkwT2AZMCIQLwApMEkwSTBJMEkwSTBJMEkwSTBJMEIQIhApMEkwSTBG8DMQcQBS8FDAXVBXMEIQTTBecFOwIjAukEJwQ5BwgGOwbRBDsG8gRkBG0E0wXDBGgHngR7BJEEogLwAqICVgSWA54EcwTnBM8D5wR9BLYCYgTpBAYCBgIzBAYCcQfpBNUE5wTnBEQD0QPTAukEAgQ5BjEECAS+AwgDaAQIA5ME////////////////////////////////////////////////////////////////////////////////////////FAJKAscDKwWRBDUHAAYhArYCtgJcBJEEUgKTAkgCTgORBJEEkQSRBJEEkQSRBJEEkQSRBEgCUgKRBJEEkQTRAy0HhQVgBRkF7AV7BGQEywUfBqYCpgJQBYUEiweBBl4GBgVeBkgFaASiBAwGMwW8B1YF/gSiBKYCTgOmAkIESgPbBNUEEAUdBBAFugQZA4UEQgVxAnEC9gRxAtsHQgX0BBAFEAWiA/oDeQNCBY0E2QagBI0E5wMnA2gEJwORBP///////////////////////////////////////////////////////////////////////////////////////xQCEgIXAysFaARYBlwFvAFIAkgCagRoBOwBfwIGAs0CaARoBGgEaARoBGgEaARoBGgEaAQGAgYCaARoBGgEagPHBnEEyQSuBFQFFwTHA2oFbQUvAiMCdQTLA7IGngXDBYcEwwWNBAQE/ANoBWIE0QYnBAYEPwRKAs0CSgIjBCcDbwSFBJ4EmgOeBPIDgQICBJ4ECAIIAucDCAL6Bp4EfQSeBJ4EKwNtA5gCngSyA7wF0wOyA40DywJoBMsCaAT///////////////////////////////////////////////////////////////////////////////////////8UAkoCoAMrBWgE2QaqBQoCtgK2AlwEaAQ5ApMCSAJeA2gEaARoBGgEaARoBGgEaARoBGgESAJIAmgEaARoBKwD2QYGBfYE5QRqBVYEPwSFBZoFkwKmAucEJQQKBwoG1wWkBNcF3wQ9BD8EhwW4BCcH2QSDBEoEpgJeA6YCOQQzA28EwQTDBN0DwQR1BPwCVATVBGACYAKLBGACPQfVBK4EwwTBBF4DyQNIA9UEGQROBj8EJwSkA9cCaATXAmgE//9QeQIAQd7LBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////+4BpgJLAyUF4QSKBq8FuQEAAwADxwMlBSgC/gIoAsAD6QRwA3gEagSFBDoEhwQFBMUEhwSAAoACJQUlBSUF1ANuB14FOwUjBf4FOgXLBM0FhQYeAyQEjgXUBGsHIwb0BeEE9AWdBX0E8wQNBlUFzgevBewE0AQAA8ADAAMlBSUFAAQIBHsEogOYBN4DmgITBKgEWAJWAkkESgIMB7oEUASSBHoERwN1A8MCmgT5A+YFCgTwA40DcQMAA3EDJQX///////////////////////////////////////////////////////////////////////////////////////8IAgMDFASgBSAFCQdlBicCkwOTA9sDoAWgAggDoALGA5wF6wMDBf8EMgXLBC8FbwRpBS8F8ALwAqAFoAWgBWMEvAcRBg8GuQWsBsUFXwV1Bk4HkQPDBIkGfAUwCLcGjwacBY8GYQYxBXkFqwYZBgMJeAbbBYQFkwPGA5MDoAWgBQAExAQqBUAETgWTBCUDnQRwBdQCxQIOBcECIAiFBRYFQwUwBSkEGgQuA2oFiQToBrQEfwQ0BAAEGgMABKAF////////////////////////////////////////////////////////////////////////////////////////7gGmAksDJQXhBIoGrwW5AQADAAPHAyUFKAL+AigCwAPpBHADeARqBIUEOgSHBPkDxQSHBBIDEgMlBSUFJQXUA24HXgU7BSMF/gU6BcsEzQWFBh4DJASOBdQEawcjBtgF4QTYBZ0FfQTzBA0GVQXOB68F7ATQBAADwAMAAyUFJQUABJUEbgShA5oExgOhApUEgARhAlQCOQRIAgkHuARMBKAEcQSxA3MDxwKaBE4ElAYCBHoEjQNxAwADcQMlBf///////////////////////////////////////////////////////////////////////////////////////wgCAwMUBKAFIAUJB2UGJwKTA5MD2wOgBaACCAOgAsYDnAXrAwMF/wQyBcsELwWIBGkFLwXwAvACoAWgBaAFYwS8BxEGEwa5BawGxQVfBXUGTgebA8MEiQZ8BUQIowaPBqYFjwZhBjkFeQWrBhkGAwlrBtsFhAWTA8YDkwOgBaAFAARIBTEFSQRNBXUEDAMyBWcF7QLrAiEF1gIECIUFFgVNBTMFRQQjBFYDewXmBHgHqwRbBSMEAAQaAwAEoAX//1h5AgBB7tMHC8gKoED/////////////////////////////////////////////////////////////////////////////////////zwGbAjUD/AMOBLgFdQXEAW0CbQL8A/wD/wFzAgUCFwMOBA4EDgQOBA4EDgQOBA4EDgQOBCQCJAL8A/wD/AO1AycHoQRaBEQE7AToA60DDAX8BAQCjQIoBF0D1wYqBUwFIgRiBVgErQPmAyIFigQeBycE5gO/A3QCFwN0AvwD/ANUAtUDNARiAzQE+wNxAsQDNATWAeoBowPWAWQGNAQ4BDQENATKAiEDrgI0BJ0DuAV3A58DKQOEAq8DhAL8A///AAD///////////////////////////////8AAP///////////////////////////////////////////////88BmwKCA/wDDgTVBaMF3gF+An4C/AP8AxACcwIjAnADDgQOBA4EDgQOBA4EDgQOBA4EDgQ1AjUC/AP8A/wDtQMwB9kEfAQ8BAsF5wOsAxkFDAUiAqYCYARiA/4GRQVpBUIEfQWBBMgD9gM5BbsEQAdoBCgE0wOZAnADmQL8A/wDZwLzA0sEWQNLBAcEiALLA0sE9wELAtcD9wGCBksETQRLBEsE2AIxA8YCSwTJA/YFrQPKAy4DwALNA8AC/AP////////////////////////////////////////////////////////////////////////////////////////PAZsCNQP8Aw4EuAV1BcQBbQJtAvwD/AP/AXMCBQIaAw4EDgQOBA4EDgQOBA4EDgQOBA4EJAIkAvwD/AP8A7UDJwehBFoELgTsBOgDrQMMBfwEBAKNAigEXQPXBigFPAUiBFAFWASeA+YDIgWKBB8HJwTmA78DdAITA3QC/AP8A1QCHQQdBFQDHQTSA3ECHQQdBNYB6gGjA9YBVAYdBBsEHQQdBL4CHQOuAh0EkQO4BXcDlAMpA4QCrwOEAvwD////////////////////////////////////////////////////////////////////////////////////////zwGbAoID/AMOBNUFowXeAX4CfgL8A/wDEAJzAiMCeQMOBA4EDgQOBA4EDgQOBA4EDgQOBDUCNQL8A/wD/AO1AzAH2QR8BCYECwXnA6wDGQUMBSICpgJgBGID/gZABVkFQgRrBYEEuQP2AzkFuwRBB2gEKATTA5kCZgOZAvwD/ANnAjkEOQRLAzkE7gOIAjkEOAT3AQsC1wP3AW4GOAQ4BDkEOQTRAicDxgI4BMED9gWtA8MDLgPAAs0DwAL8A///DAAAAAQAAAAGAAAAAgAAAAMAAAABAAAACQAAAAgAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAFEAAABSAAAAUwAAAFQAAABV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APUAAABlFwAAlyIAALo2AAD2AAAAt2AAALYAAABFDgAAAiIAAFM3AAAwIAAAYCwAAKUiAAAjOwAAxgMAAM46AADAAwAAjAsAANYDAAAqMgAAsQAAAOhRAACjAAAADEwAADIgAABTUQAADyIAAKQsAAAdIgAAszoAAMgDAABiDgAAIgAAALAaAADSIQAA+1oAABoiAABSQAAAKiMAAL8uAAC7AAAAlxoAAJIhAABaNwAACSMAAJkuAAAdIAAADzkAABwhAAAIQQAArgAAAEMbAAALIwAARC8AAMEDAABSNgAADyAAALEuAAA6IAAAjS4AABkgAACrLgAAGiAAAIcwAABhAQAA7A4AAMUiAADSEQAApwAAADIHAACtAAAA6GAAAMMDAAC8QgAAwgMAAFY2AAA8IgAAoxgAAGAmAACpXwAAgiIAABRRAACGIgAA7zUAABEiAAA8LAAAgyIAANK3AAC5AAAAhqkAALIAAABimwAAswAAAO1KAACHIgAAmUAAAN8AAADrCwAAxAMAAE2QAAA0IgAAbGAAALgDAADeNQAA0QMAAEosAAAJIAAAQDAAAP4AAAAkUAAA3AIAAGYXAADXAAAAMVAAACIhAACrGgAA0SEAALxHAAD6AAAAkRoAAJEhAABaWQAA+wAAAPhEAAD5AAAA6DYAAKgAAAAbPQAA0gMAAOIwAADFAwAAtTYAAPwAAABlLAAAGCEAALA6AAC+AwAAtUcAAP0AAAC2MgAApQAAALA2AAD/AAAAZ2AAALYDAACWOgAADSAAAJo6AAAMIAAA5z8BAAgAAAADAAAA5T4AACLQAAALAAAABgAAAFcVAADzaAAAAgAAAAEAAADKLAAApXQAAAQAAAACAAAAGUIAAAAEAAADAAAABAAAAAxBAAAu0AAABQAAAAUAAAC4QgAABAQAAAQAAAAHAAAALRUAAKo2AAAFAAAACQAAAKw2AAAibQAABAAAAAoAAAAsQgAAQPkBAAQAAAAMAAAAsC8AAAAAAQAAAdDR0tPU1dbX2NkAQebyBwsJ8L8AAAAAAAABAEH48gcLDWludmlzAABmaWxsZWQAQZDzBwsaMBoAACJRAADPNQAAbgsAAPR4AABpxgAAVY4AQdDzBwt5//////////////////////////////////////////8AAAAAAAAABP7//4f+//8HAAAAAAAAAAD//3////9///////////N//v3//////3///////////w/g/////zH8////AAAAAAAAAP//////////////AQD4AwBB4PQHC0FA1///+/////9/f1T9/w8A/t////////////7f/////wMA////////nxn////PPwMAAAAAAAD+////fwL+////fwBBqvUHC7MB////BwcAAAAAAP7//wf+BwAAAAD+//////////98/38vAGAAAADg////////IwAAAP8DAAAA4J/5///9xQMAAACwAwADAOCH+f///W0DAAAAXgAAHADgr/v///3tIwAAAAABAAAA4J/5///9zSMAAACwAwAAAODHPdYYx78DAAAAAAAAAADg3/3///3vAwAAAAADAAAA4N/9///97wMAAABAAwAAAODf/f///f8DAAAAAAMAQfD2BwsZ/v////9/DQA/AAAAAAAAAJYl8P6ubA0gHwBBmPcHCwb//v///wMAQcT3Bwty/////z8A/////38A7doHAAAAAFABUDGCq2IsAAAAAEAAyYD1BwAAAAAIAQL/////////////////////////D///////////////A///Pz//////Pz//qv///z/////////fX9wfzw//H9wfAAAAAEBMAEHA+AcLAQcAQdD4BwsmgAAAAP4DAAD+////////////HwD+/////////////wfg/////x8AQZD5BwsV//////////////////////////8/AEGw+QcLFf//////////////////////////DwBB1fkHC8kCYP8H/v//h/7//wcAAAAAAACAAP//f////3//////AAAAAAAAAP//////////////AQD4AwADAAAAAAD//////////z8AAAADAAAAwNf///v/////f39U/f8PAP7f///////////+3/////97AP///////58Z////zz8DAAAAAAAA/v///38C/v///38A/v/7//+7FgD///8HBwAAAAAA/v//B///BwD/A////////////3z/f+///z3/A+7////////z/z8e/8//AADun/n///3F0585gLDP/wMA5If5///9bdOHOQBewP8fAO6v+////e3zvzsAAMH/AADun/n///3N8485wLDD/wAA7Mc91hjHv8PHPYAAgP8AAO7f/f//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rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/xcArv93AK7/BwAuAK7/JgCu/xcAEQAjAK7/DQCu/67/rv+u/zoArv+u/zUArv+u/67/KACu/wcArv87AEUArv9IAK7/rv+u/67/rv8AQYG1CAvBBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygAAAAAAAAAAAICAgICAhAMWQEAH1AIAwcSExRXFhcIC2kMHwoFDA4pESsPLRAvMCAyBjQ1GxwdHgsMISIjJCUmJygMGBkXBAobHBogKgohIiMkJSYnKAwKDlMKLFgxWFhYWFhYDBscDy5YMyEiIyQlJicoGxz/U///ISIjJCUmJygM//8F////CRT//////wwbHP8QFRYhIiMkJSYnKBsc/////yEiIyQlJicoDP8SExQRFhf///////8MGxz///8SISIjJCUmJygbHP////8hIiMkJSYnKAz///////8T////////DBsc/////yEiIyQlJicoGxz/////ISIjJCUmJygSExQVFhcYGf///////////yMkJSYnGxITFBYXIjZoAR84ViEgAhsbG14bGzc5cDbSwk8EPCJHIj8iRCIiWCJlIiIFBl9gOQQHCAkKCwwNDgRmZ11qbQUGb1g7cQcICQoLDA0OBHI8W3M+YUYbEhMUFhcEBQY/QWJJBwgJCgsMDQ4FBgBcAAAHCAkKCwwNDgQAAE8AAABTQgAAAAAABAUGAERUVQcICQoLDA0OBQYAAAAABwgJCgsMDQ4EACosLkcxMwAAAAAAAAQFBgAAAEoHCAkKCwwNDgUGAAAAAAcICQoLDA0OBAAAAAAA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X0NUWVBFAAAAAExDX05VTUVSSUMAAExDX1RJTUUAAAAAAExDX0NPTExBVEUAAExDX01PTkVUQVJZAExDX01FU1NBR0VTAEHw9QgLB0MuVVRGLTgAQYj2CAugEDCrAgDIqwIAWKwCAE5vIGVycm9yIGluZm9ybWF0aW9uAElsbGVnYWwgYnl0ZSBzZXF1ZW5jZQBEb21haW4gZXJyb3IAUmVzdWx0IG5vdCByZXByZXNlbnRhYmxlAE5vdCBhIHR0eQBQZXJtaXNzaW9uIGRlbmllZABPcGVyYXRpb24gbm90IHBlcm1pdHRlZABObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5AE5vIHN1Y2ggcHJvY2VzcwBGaWxlIGV4aXN0cwBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRhdGEgdHlwZQBObyBzcGFjZSBsZWZ0IG9uIGRldmljZQBPdXQgb2YgbWVtb3J5AFJlc291cmNlIGJ1c3kASW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwAUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUASW52YWxpZCBzZWVrAENyb3NzLWRldmljZSBsaW5rAFJlYWQtb25seSBmaWxlIHN5c3RlbQBEaXJlY3Rvcnkgbm90IGVtcHR5AENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgBPcGVyYXRpb24gdGltZWQgb3V0AENvbm5lY3Rpb24gcmVmdXNlZABIb3N0IGlzIGRvd24ASG9zdCBpcyB1bnJlYWNoYWJsZQBBZGRyZXNzIGluIHVzZQBCcm9rZW4gcGlwZQBJL08gZXJyb3IATm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwBCbG9jayBkZXZpY2UgcmVxdWlyZWQATm8gc3VjaCBkZXZpY2UATm90IGEgZGlyZWN0b3J5AElzIGEgZGlyZWN0b3J5AFRleHQgZmlsZSBidXN5AEV4ZWMgZm9ybWF0IGVycm9yAEludmFsaWQgYXJndW1lbnQAQXJndW1lbnQgbGlzdCB0b28gbG9uZwBTeW1ib2xpYyBsaW5rIGxvb3AARmlsZW5hbWUgdG9vIGxvbmcAVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0ATm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUAQmFkIGZpbGUgZGVzY3JpcHRvcgBObyBjaGlsZCBwcm9jZXNzAEJhZCBhZGRyZXNzAEZpbGUgdG9vIGxhcmdlAFRvbyBtYW55IGxpbmtzAE5vIGxvY2tzIGF2YWlsYWJsZQBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1cgBTdGF0ZSBub3QgcmVjb3ZlcmFibGUAUHJldmlvdXMgb3duZXIgZGllZABPcGVyYXRpb24gY2FuY2VsZWQARnVuY3Rpb24gbm90IGltcGxlbWVudGVkAE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlAElkZW50aWZpZXIgcmVtb3ZlZABEZXZpY2Ugbm90IGEgc3RyZWFtAE5vIGRhdGEgYXZhaWxhYmxlAERldmljZSB0aW1lb3V0AE91dCBvZiBzdHJlYW1zIHJlc291cmNlcwBMaW5rIGhhcyBiZWVuIHNldmVyZWQAUHJvdG9jb2wgZXJyb3IAQmFkIG1lc3NhZ2UARmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZQBOb3QgYSBzb2NrZXQARGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZABNZXNzYWdlIHRvbyBsYXJnZQBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQAUHJvdG9jb2wgbm90IGF2YWlsYWJsZQBQcm90b2NvbCBub3Qgc3VwcG9ydGVkAFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQATm90IHN1cHBvcnRlZABQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZABBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sAEFkZHJlc3Mgbm90IGF2YWlsYWJsZQBOZXR3b3JrIGlzIGRvd24ATmV0d29yayB1bnJlYWNoYWJsZQBDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsAQ29ubmVjdGlvbiBhYm9ydGVkAE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUAU29ja2V0IGlzIGNvbm5lY3RlZABTb2NrZXQgbm90IGNvbm5lY3RlZABDYW5ub3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24AT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MAT3BlcmF0aW9uIGluIHByb2dyZXNzAFN0YWxlIGZpbGUgaGFuZGxlAFJlbW90ZSBJL08gZXJyb3IAUXVvdGEgZXhjZWVkZWQATm8gbWVkaXVtIGZvdW5kAFdyb25nIG1lZGl1bSB0eXBlAE11bHRpaG9wIGF0dGVtcHRlZABSZXF1aXJlZCBrZXkgbm90IGF2YWlsYWJsZQBLZXkgaGFzIGV4cGlyZWQAS2V5IGhhcyBiZWVuIHJldm9rZWQAS2V5IHdhcyByZWplY3RlZCBieSBzZXJ2aWNlAAAAAAClAlsA8AG1BYwFJQGDBh0DlAT/AMcDMQMLBrwBjwF/A8oEKwDaBq8AQgNOA9wBDgQVAKEGDQGUAgsCOAZkArwC/wJdA+cECwfPAssF7wXbBeECHgZFAoUAggJsA28E8QDzAxgF2QDaA0wGVAJ7AZ0DvQQAAFEAFQK7ALMDbQD/AYUELwX5BDgAZQFGAZ8AtwaoAXMCUwEAQdiGCQsMIQQAAAAAAAAAAC8CAEH4hgkLBjUERwRWBABBjocJCwKgBABBoocJCyJGBWAFbgVhBgAAzwEAAAAAAAAAAMkG6Qb5Bh4HOQdJB14HAEHQhwkLkQHRdJ4AV529KoBwUg///z4nCgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QUYAAAANQAAAHEAAABr////zvv//5K///8AAAAAAAAAABkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEHxiAkLIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBBq4kJCwEMAEG3iQkLFRMAAAAAEwAAAAAJDAAAAAAADAAADABB5YkJCwEQAEHxiQkLFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABBn4oJCwESAEGrigkLHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBB4ooJCw4aAAAAGhoaAAAAAAAACQBBk4sJCwEUAEGfiwkLFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABBzYsJCwEWAEHZiwkLJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBBpIwJCwILAgBBzIwJCwj//////////wBBkI0JC/UI/////////////////////////////////////////////////////////////////wABAgMEBQYHCAn/////////CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiP///////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAQIEBwMGBQAAAAAAAAACAADAAwAAwAQAAMAFAADABgAAwAcAAMAIAADACQAAwAoAAMALAADADAAAwA0AAMAOAADADwAAwBAAAMARAADAEgAAwBMAAMAUAADAFQAAwBYAAMAXAADAGAAAwBkAAMAaAADAGwAAwBwAAMAdAADAHgAAwB8AAMAAAACzAQAAwwIAAMMDAADDBAAAwwUAAMMGAADDBwAAwwgAAMMJAADDCgAAwwsAAMMMAADDDQAA0w4AAMMPAADDAAAMuwEADMMCAAzDAwAMwwQADNsAAAAAVEkCAA0CAAAOAgAADwIAABACAAARAgAAEgIAABMCAAAUAgAAFQIAABYCAAAXAgAAGAIAABkCAAAaAgAABAAAAAAAAACQSQIAGwIAABwCAAD8/////P///5BJAgAdAgAAHgIAALhIAgDMSAIAAAAAANhJAgAfAgAAIAIAAA8CAAAQAgAAIQIAACICAAATAgAAFAIAABUCAAAjAgAAFwIAACQCAAAZAgAAJQIAAMh0AgAoSQIA7EoCAE5TdDNfXzI5YmFzaWNfaW9zSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFAAAAoHQCAFxJAgBOU3QzX18yMTViYXNpY19zdHJlYW1idWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUUAAAAAJHUCAKhJAgAAAAAAAQAAABxJAgAD9P//TlN0M19fMjEzYmFzaWNfb3N0cmVhbUljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQAAyHQCAORJAgBUSQIATlN0M19fMjE1YmFzaWNfc3RyaW5nYnVmSWNOU18xMWNoYXJfdHJhaXRz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";return y}var hA;function Ae(y){if(y==hA&&E)return new Uint8Array(E);var b=m(y);if(b)return b;throw"both async and sync fetching of the wasm failed"}function pA(y){return Promise.resolve().then(()=>Ae(y))}function te(y,b,R){return pA(y).then(W=>WebAssembly.instantiate(W,b)).then(R,W=>{u(`failed to asynchronously prepare wasm: ${W}`),PA(W)})}function NA(y,b,R,W){return te(b,R,W)}function Ge(){return{a:Vt}}function JA(){var y=Ge();function b(W,_){return It=W.exports,v=It.y,Z(),IA(It.z),bA(),It}HA();function R(W){b(W.instance)}return hA??=YA(),NA(E,hA,y,R).catch(o),{}}function yA(y){return t.agerrMessages.push(Ke(y)),0}function Pt(y){this.name="ExitStatus",this.message=`Program terminated with exit(${y})`,this.status=y}var Dt=y=>{y.forEach(b=>b(t))};function fe(y,b="i8"){switch(b.endsWith("*")&&(b="*"),b){case"i1":return k[y];case"i8":return k[y];case"i16":return x[y>>1];case"i32":return F[y>>2];case"i64":return X[y>>3];case"float":return j[y>>2];case"double":return eA[y>>3];case"*":return z[y>>2];default:PA(`invalid type for getValue: ${b}`)}}var Zt=y=>cn(y),Pe=()=>Rn(),qe=typeof TextDecoder<"u"?new TextDecoder:void 0,vt=(y,b=0,R=NaN)=>{for(var W=b+R,_=b;y[_]&&!(_>=W);)++_;if(_-b>16&&y.buffer&&qe)return qe.decode(y.subarray(b,_));for(var q="";b<_;){var tA=y[b++];if(!(tA&128)){q+=String.fromCharCode(tA);continue}var rA=y[b++]&63;if((tA&224)==192){q+=String.fromCharCode((tA&31)<<6|rA);continue}var DA=y[b++]&63;if((tA&240)==224?tA=(tA&15)<<12|rA<<6|DA:tA=(tA&7)<<18|rA<<12|DA<<6|y[b++]&63,tA<65536)q+=String.fromCharCode(tA);else{var ae=tA-65536;q+=String.fromCharCode(55296|ae>>10,56320|ae&1023)}}return q},Ke=(y,b)=>y?vt(M,y,b):"",Ii=(y,b,R,W)=>{PA(`Assertion failed: ${Ke(y)}, at: `+[b?Ke(b):"unknown filename",R,W?Ke(W):"unknown function"])};class V{constructor(b){this.excPtr=b,this.ptr=b-24}set_type(b){z[this.ptr+4>>2]=b}get_type(){return z[this.ptr+4>>2]}set_destructor(b){z[this.ptr+8>>2]=b}get_destructor(){return z[this.ptr+8>>2]}set_caught(b){b=b?1:0,k[this.ptr+12]=b}get_caught(){return k[this.ptr+12]!=0}set_rethrown(b){b=b?1:0,k[this.ptr+13]=b}get_rethrown(){return k[this.ptr+13]!=0}init(b,R){this.set_adjusted_ptr(0),this.set_type(b),this.set_destructor(R)}set_adjusted_ptr(b){z[this.ptr+16>>2]=b}get_adjusted_ptr(){return z[this.ptr+16>>2]}}var $=0,iA=(y,b,R)=>{var W=new V(y);throw W.init(b,R),$=y,$},oA={isAbs:y=>y.charAt(0)==="/",splitPath:y=>{var b=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return b.exec(y).slice(1)},normalizeArray:(y,b)=>{for(var R=0,W=y.length-1;W>=0;W--){var _=y[W];_==="."?y.splice(W,1):_===".."?(y.splice(W,1),R++):R&&(y.splice(W,1),R--)}if(b)for(;R;R--)y.unshift("..");return y},normalize:y=>{var b=oA.isAbs(y),R=y.substr(-1)==="/";return y=oA.normalizeArray(y.split("/").filter(W=>!!W),!b).join("/"),!y&&!b&&(y="."),y&&R&&(y+="/"),(b?"/":"")+y},dirname:y=>{var b=oA.splitPath(y),R=b[0],W=b[1];return!R&&!W?".":(W&&(W=W.substr(0,W.length-1)),R+W)},basename:y=>{if(y==="/")return"/";y=oA.normalize(y),y=y.replace(/\/$/,"");var b=y.lastIndexOf("/");return b===-1?y:y.substr(b+1)},join:(...y)=>oA.normalize(y.join("/")),join2:(y,b)=>oA.normalize(y+"/"+b)},UA=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return y=>crypto.getRandomValues(y);PA("initRandomDevice")},he=y=>(he=UA())(y),me={resolve:(...y)=>{for(var b="",R=!1,W=y.length-1;W>=-1&&!R;W--){var _=W>=0?y[W]:J.cwd();if(typeof _!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!_)return"";b=_+"/"+b,R=oA.isAbs(_)}return b=oA.normalizeArray(b.split("/").filter(q=>!!q),!R).join("/"),(R?"/":"")+b||"."},relative:(y,b)=>{y=me.resolve(y).substr(1),b=me.resolve(b).substr(1);function R(ae){for(var ge=0;ge=0&&ae[pe]==="";pe--);return ge>pe?[]:ae.slice(ge,pe-ge+1)}for(var W=R(y.split("/")),_=R(b.split("/")),q=Math.min(W.length,_.length),tA=q,rA=0;rA{for(var b=0,R=0;R=55296&&W<=57343?(b+=4,++R):b+=3}return b},wt=(y,b,R,W)=>{if(!(W>0))return 0;for(var _=R,q=R+W-1,tA=0;tA=55296&&rA<=57343){var DA=y.charCodeAt(++tA);rA=65536+((rA&1023)<<10)|DA&1023}if(rA<=127){if(R>=q)break;b[R++]=rA}else if(rA<=2047){if(R+1>=q)break;b[R++]=192|rA>>6,b[R++]=128|rA&63}else if(rA<=65535){if(R+2>=q)break;b[R++]=224|rA>>12,b[R++]=128|rA>>6&63,b[R++]=128|rA&63}else{if(R+3>=q)break;b[R++]=240|rA>>18,b[R++]=128|rA>>12&63,b[R++]=128|rA>>6&63,b[R++]=128|rA&63}}return b[R]=0,R-_};function rt(y,b,R){var W=R>0?R:OA(y)+1,_=new Array(W),q=wt(y,_,0,_.length);return b&&(_.length=q),_}var je=()=>{if(!GA.length){var y=null;if(typeof window<"u"&&typeof window.prompt=="function"&&(y=window.prompt("Input: "),y!==null&&(y+=` -`)),!y)return null;GA=rt(y,!0)}return GA.shift()},ze={ttys:[],init(){},shutdown(){},register(y,b){ze.ttys[y]={input:[],output:[],ops:b},J.registerDevice(y,ze.stream_ops)},stream_ops:{open(y){var b=ze.ttys[y.node.rdev];if(!b)throw new J.ErrnoError(43);y.tty=b,y.seekable=!1},close(y){y.tty.ops.fsync(y.tty)},fsync(y){y.tty.ops.fsync(y.tty)},read(y,b,R,W,_){if(!y.tty||!y.tty.ops.get_char)throw new J.ErrnoError(60);for(var q=0,tA=0;tA0&&(B(vt(y.output)),y.output=[])},ioctl_tcgets(y){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(y,b,R){return 0},ioctl_tiocgwinsz(y){return[24,80]}},default_tty1_ops:{put_char(y,b){b===null||b===10?(u(vt(y.output)),y.output=[]):b!=0&&y.output.push(b)},fsync(y){y.output&&y.output.length>0&&(u(vt(y.output)),y.output=[])}}},pi=(y,b)=>{M.fill(0,y,y+b)},mn=(y,b)=>Math.ceil(y/b)*b,Sn=y=>{y=mn(y,65536);var b=$i(65536,y);return b&&pi(b,y),b},He={ops_table:null,mount(y){return He.createNode(null,"/",16895,0)},createNode(y,b,R,W){if(J.isBlkdev(R)||J.isFIFO(R))throw new J.ErrnoError(63);He.ops_table||={dir:{node:{getattr:He.node_ops.getattr,setattr:He.node_ops.setattr,lookup:He.node_ops.lookup,mknod:He.node_ops.mknod,rename:He.node_ops.rename,unlink:He.node_ops.unlink,rmdir:He.node_ops.rmdir,readdir:He.node_ops.readdir,symlink:He.node_ops.symlink},stream:{llseek:He.stream_ops.llseek}},file:{node:{getattr:He.node_ops.getattr,setattr:He.node_ops.setattr},stream:{llseek:He.stream_ops.llseek,read:He.stream_ops.read,write:He.stream_ops.write,allocate:He.stream_ops.allocate,mmap:He.stream_ops.mmap,msync:He.stream_ops.msync}},link:{node:{getattr:He.node_ops.getattr,setattr:He.node_ops.setattr,readlink:He.node_ops.readlink},stream:{}},chrdev:{node:{getattr:He.node_ops.getattr,setattr:He.node_ops.setattr},stream:J.chrdev_stream_ops}};var _=J.createNode(y,b,R,W);return J.isDir(_.mode)?(_.node_ops=He.ops_table.dir.node,_.stream_ops=He.ops_table.dir.stream,_.contents={}):J.isFile(_.mode)?(_.node_ops=He.ops_table.file.node,_.stream_ops=He.ops_table.file.stream,_.usedBytes=0,_.contents=null):J.isLink(_.mode)?(_.node_ops=He.ops_table.link.node,_.stream_ops=He.ops_table.link.stream):J.isChrdev(_.mode)&&(_.node_ops=He.ops_table.chrdev.node,_.stream_ops=He.ops_table.chrdev.stream),_.timestamp=Date.now(),y&&(y.contents[b]=_,y.timestamp=_.timestamp),_},getFileDataAsTypedArray(y){return y.contents?y.contents.subarray?y.contents.subarray(0,y.usedBytes):new Uint8Array(y.contents):new Uint8Array(0)},expandFileStorage(y,b){var R=y.contents?y.contents.length:0;if(!(R>=b)){var W=1024*1024;b=Math.max(b,R*(R>>0),R!=0&&(b=Math.max(b,256));var _=y.contents;y.contents=new Uint8Array(b),y.usedBytes>0&&y.contents.set(_.subarray(0,y.usedBytes),0)}},resizeFileStorage(y,b){if(y.usedBytes!=b)if(b==0)y.contents=null,y.usedBytes=0;else{var R=y.contents;y.contents=new Uint8Array(b),R&&y.contents.set(R.subarray(0,Math.min(b,y.usedBytes))),y.usedBytes=b}},node_ops:{getattr(y){var b={};return b.dev=J.isChrdev(y.mode)?y.id:1,b.ino=y.id,b.mode=y.mode,b.nlink=1,b.uid=0,b.gid=0,b.rdev=y.rdev,J.isDir(y.mode)?b.size=4096:J.isFile(y.mode)?b.size=y.usedBytes:J.isLink(y.mode)?b.size=y.link.length:b.size=0,b.atime=new Date(y.timestamp),b.mtime=new Date(y.timestamp),b.ctime=new Date(y.timestamp),b.blksize=4096,b.blocks=Math.ceil(b.size/b.blksize),b},setattr(y,b){b.mode!==void 0&&(y.mode=b.mode),b.timestamp!==void 0&&(y.timestamp=b.timestamp),b.size!==void 0&&He.resizeFileStorage(y,b.size)},lookup(y,b){throw J.genericErrors[44]},mknod(y,b,R,W){return He.createNode(y,b,R,W)},rename(y,b,R){if(J.isDir(y.mode)){var W;try{W=J.lookupNode(b,R)}catch(q){}if(W)for(var _ in W.contents)throw new J.ErrnoError(55)}delete y.parent.contents[y.name],y.parent.timestamp=Date.now(),y.name=R,b.contents[R]=y,b.timestamp=y.parent.timestamp},unlink(y,b){delete y.contents[b],y.timestamp=Date.now()},rmdir(y,b){var R=J.lookupNode(y,b);for(var W in R.contents)throw new J.ErrnoError(55);delete y.contents[b],y.timestamp=Date.now()},readdir(y){var b=[".",".."];for(var R of Object.keys(y.contents))b.push(R);return b},symlink(y,b,R){var W=He.createNode(y,b,41471,0);return W.link=R,W},readlink(y){if(!J.isLink(y.mode))throw new J.ErrnoError(28);return y.link}},stream_ops:{read(y,b,R,W,_){var q=y.node.contents;if(_>=y.node.usedBytes)return 0;var tA=Math.min(y.node.usedBytes-_,W);if(tA>8&&q.subarray)b.set(q.subarray(_,_+tA),R);else for(var rA=0;rA0||R+b{var _=W?"":`al ${y}`;C(y).then(q=>{b(new Uint8Array(q)),_&&bA()},q=>{if(R)R();else throw`Loading data file "${y}" failed.`}),_&&HA()},Gi=(y,b,R,W,_,q)=>{J.createDataFile(y,b,R,W,_,q)},Pi=[],gn=(y,b,R,W)=>{typeof Browser<"u"&&Browser.init();var _=!1;return Pi.forEach(q=>{_||q.canHandle(b)&&(q.handle(y,b,R,W),_=!0)}),_},Rt=(y,b,R,W,_,q,tA,rA,DA,ae)=>{var ge=b?me.resolve(oA.join2(y,b)):y;function pe(Ve){function Ue(Je){ae?.(),rA||Gi(y,b,Je,W,_,DA),q?.(),bA()}gn(Ve,ge,Ue,()=>{tA?.(),bA()})||Ue(Ve)}HA(),typeof R=="string"?En(R,pe,tA):pe(R)},Qn=y=>{var b={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},R=b[y];if(typeof R>"u")throw new Error(`Unknown file open mode: ${y}`);return R},jt=(y,b)=>{var R=0;return y&&(R|=365),b&&(R|=146),R},J={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(y){this.name="ErrnoError",this.errno=y}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(y){this.node=y}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(y){this.shared.flags=y}get position(){return this.shared.position}set position(y){this.shared.position=y}},FSNode:class{constructor(y,b,R,W){y||(y=this),this.parent=y,this.mount=y.mount,this.mounted=null,this.id=J.nextInode++,this.name=b,this.mode=R,this.node_ops={},this.stream_ops={},this.rdev=W,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(y){y?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(y){y?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return J.isDir(this.mode)}get isDevice(){return J.isChrdev(this.mode)}},lookupPath(y,b={}){if(y=me.resolve(y),!y)return{path:"",node:null};var R={follow_mount:!0,recurse_count:0};if(b=Object.assign(R,b),b.recurse_count>8)throw new J.ErrnoError(32);for(var W=y.split("/").filter(pe=>!!pe),_=J.root,q="/",tA=0;tA40)throw new J.ErrnoError(32)}}return{path:q,node:_}},getPath(y){for(var b;;){if(J.isRoot(y)){var R=y.mount.mountpoint;return b?R[R.length-1]!=="/"?`${R}/${b}`:R+b:R}b=b?`${y.name}/${b}`:y.name,y=y.parent}},hashName(y,b){for(var R=0,W=0;W>>0)%J.nameTable.length},hashAddNode(y){var b=J.hashName(y.parent.id,y.name);y.name_next=J.nameTable[b],J.nameTable[b]=y},hashRemoveNode(y){var b=J.hashName(y.parent.id,y.name);if(J.nameTable[b]===y)J.nameTable[b]=y.name_next;else for(var R=J.nameTable[b];R;){if(R.name_next===y){R.name_next=y.name_next;break}R=R.name_next}},lookupNode(y,b){var R=J.mayLookup(y);if(R)throw new J.ErrnoError(R);for(var W=J.hashName(y.id,b),_=J.nameTable[W];_;_=_.name_next){var q=_.name;if(_.parent.id===y.id&&q===b)return _}return J.lookup(y,b)},createNode(y,b,R,W){var _=new J.FSNode(y,b,R,W);return J.hashAddNode(_),_},destroyNode(y){J.hashRemoveNode(y)},isRoot(y){return y===y.parent},isMountpoint(y){return!!y.mounted},isFile(y){return(y&61440)===32768},isDir(y){return(y&61440)===16384},isLink(y){return(y&61440)===40960},isChrdev(y){return(y&61440)===8192},isBlkdev(y){return(y&61440)===24576},isFIFO(y){return(y&61440)===4096},isSocket(y){return(y&49152)===49152},flagsToPermissionString(y){var b=["r","w","rw"][y&3];return y&512&&(b+="w"),b},nodePermissions(y,b){return J.ignorePermissions?0:b.includes("r")&&!(y.mode&292)||b.includes("w")&&!(y.mode&146)||b.includes("x")&&!(y.mode&73)?2:0},mayLookup(y){if(!J.isDir(y.mode))return 54;var b=J.nodePermissions(y,"x");return b||(y.node_ops.lookup?0:2)},mayCreate(y,b){try{var R=J.lookupNode(y,b);return 20}catch(W){}return J.nodePermissions(y,"wx")},mayDelete(y,b,R){var W;try{W=J.lookupNode(y,b)}catch(q){return q.errno}var _=J.nodePermissions(y,"wx");if(_)return _;if(R){if(!J.isDir(W.mode))return 54;if(J.isRoot(W)||J.getPath(W)===J.cwd())return 10}else if(J.isDir(W.mode))return 31;return 0},mayOpen(y,b){return y?J.isLink(y.mode)?32:J.isDir(y.mode)&&(J.flagsToPermissionString(b)!=="r"||b&512)?31:J.nodePermissions(y,J.flagsToPermissionString(b)):44},MAX_OPEN_FDS:4096,nextfd(){for(var y=0;y<=J.MAX_OPEN_FDS;y++)if(!J.streams[y])return y;throw new J.ErrnoError(33)},getStreamChecked(y){var b=J.getStream(y);if(!b)throw new J.ErrnoError(8);return b},getStream:y=>J.streams[y],createStream(y,b=-1){return y=Object.assign(new J.FSStream,y),b==-1&&(b=J.nextfd()),y.fd=b,J.streams[b]=y,y},closeStream(y){J.streams[y]=null},dupStream(y,b=-1){var R=J.createStream(y,b);return R.stream_ops?.dup?.(R),R},chrdev_stream_ops:{open(y){var b=J.getDevice(y.node.rdev);y.stream_ops=b.stream_ops,y.stream_ops.open?.(y)},llseek(){throw new J.ErrnoError(70)}},major:y=>y>>8,minor:y=>y&255,makedev:(y,b)=>y<<8|b,registerDevice(y,b){J.devices[y]={stream_ops:b}},getDevice:y=>J.devices[y],getMounts(y){for(var b=[],R=[y];R.length;){var W=R.pop();b.push(W),R.push(...W.mounts)}return b},syncfs(y,b){typeof y=="function"&&(b=y,y=!1),J.syncFSRequests++,J.syncFSRequests>1&&u(`warning: ${J.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var R=J.getMounts(J.root.mount),W=0;function _(tA){return J.syncFSRequests--,b(tA)}function q(tA){if(tA)return q.errored?void 0:(q.errored=!0,_(tA));++W>=R.length&&_(null)}R.forEach(tA=>{if(!tA.type.syncfs)return q(null);tA.type.syncfs(tA,y,q)})},mount(y,b,R){var W=R==="/",_=!R,q;if(W&&J.root)throw new J.ErrnoError(10);if(!W&&!_){var tA=J.lookupPath(R,{follow_mount:!1});if(R=tA.path,q=tA.node,J.isMountpoint(q))throw new J.ErrnoError(10);if(!J.isDir(q.mode))throw new J.ErrnoError(54)}var rA={type:y,opts:b,mountpoint:R,mounts:[]},DA=y.mount(rA);return DA.mount=rA,rA.root=DA,W?J.root=DA:q&&(q.mounted=rA,q.mount&&q.mount.mounts.push(rA)),DA},unmount(y){var b=J.lookupPath(y,{follow_mount:!1});if(!J.isMountpoint(b.node))throw new J.ErrnoError(28);var R=b.node,W=R.mounted,_=J.getMounts(W);Object.keys(J.nameTable).forEach(tA=>{for(var rA=J.nameTable[tA];rA;){var DA=rA.name_next;_.includes(rA.mount)&&J.destroyNode(rA),rA=DA}}),R.mounted=null;var q=R.mount.mounts.indexOf(W);R.mount.mounts.splice(q,1)},lookup(y,b){return y.node_ops.lookup(y,b)},mknod(y,b,R){var W=J.lookupPath(y,{parent:!0}),_=W.node,q=oA.basename(y);if(!q||q==="."||q==="..")throw new J.ErrnoError(28);var tA=J.mayCreate(_,q);if(tA)throw new J.ErrnoError(tA);if(!_.node_ops.mknod)throw new J.ErrnoError(63);return _.node_ops.mknod(_,q,b,R)},create(y,b){return b=b!==void 0?b:438,b&=4095,b|=32768,J.mknod(y,b,0)},mkdir(y,b){return b=b!==void 0?b:511,b&=1023,b|=16384,J.mknod(y,b,0)},mkdirTree(y,b){for(var R=y.split("/"),W="",_=0;_"u"&&(R=b,b=438),b|=8192,J.mknod(y,b,R)},symlink(y,b){if(!me.resolve(y))throw new J.ErrnoError(44);var R=J.lookupPath(b,{parent:!0}),W=R.node;if(!W)throw new J.ErrnoError(44);var _=oA.basename(b),q=J.mayCreate(W,_);if(q)throw new J.ErrnoError(q);if(!W.node_ops.symlink)throw new J.ErrnoError(63);return W.node_ops.symlink(W,_,y)},rename(y,b){var R=oA.dirname(y),W=oA.dirname(b),_=oA.basename(y),q=oA.basename(b),tA,rA,DA;if(tA=J.lookupPath(y,{parent:!0}),rA=tA.node,tA=J.lookupPath(b,{parent:!0}),DA=tA.node,!rA||!DA)throw new J.ErrnoError(44);if(rA.mount!==DA.mount)throw new J.ErrnoError(75);var ae=J.lookupNode(rA,_),ge=me.relative(y,W);if(ge.charAt(0)!==".")throw new J.ErrnoError(28);if(ge=me.relative(b,R),ge.charAt(0)!==".")throw new J.ErrnoError(55);var pe;try{pe=J.lookupNode(DA,q)}catch(Je){}if(ae!==pe){var Ve=J.isDir(ae.mode),Ue=J.mayDelete(rA,_,Ve);if(Ue)throw new J.ErrnoError(Ue);if(Ue=pe?J.mayDelete(DA,q,Ve):J.mayCreate(DA,q),Ue)throw new J.ErrnoError(Ue);if(!rA.node_ops.rename)throw new J.ErrnoError(63);if(J.isMountpoint(ae)||pe&&J.isMountpoint(pe))throw new J.ErrnoError(10);if(DA!==rA&&(Ue=J.nodePermissions(rA,"w"),Ue))throw new J.ErrnoError(Ue);J.hashRemoveNode(ae);try{rA.node_ops.rename(ae,DA,q),ae.parent=DA}catch(Je){throw Je}finally{J.hashAddNode(ae)}}},rmdir(y){var b=J.lookupPath(y,{parent:!0}),R=b.node,W=oA.basename(y),_=J.lookupNode(R,W),q=J.mayDelete(R,W,!0);if(q)throw new J.ErrnoError(q);if(!R.node_ops.rmdir)throw new J.ErrnoError(63);if(J.isMountpoint(_))throw new J.ErrnoError(10);R.node_ops.rmdir(R,W),J.destroyNode(_)},readdir(y){var b=J.lookupPath(y,{follow:!0}),R=b.node;if(!R.node_ops.readdir)throw new J.ErrnoError(54);return R.node_ops.readdir(R)},unlink(y){var b=J.lookupPath(y,{parent:!0}),R=b.node;if(!R)throw new J.ErrnoError(44);var W=oA.basename(y),_=J.lookupNode(R,W),q=J.mayDelete(R,W,!1);if(q)throw new J.ErrnoError(q);if(!R.node_ops.unlink)throw new J.ErrnoError(63);if(J.isMountpoint(_))throw new J.ErrnoError(10);R.node_ops.unlink(R,W),J.destroyNode(_)},readlink(y){var b=J.lookupPath(y),R=b.node;if(!R)throw new J.ErrnoError(44);if(!R.node_ops.readlink)throw new J.ErrnoError(28);return me.resolve(J.getPath(R.parent),R.node_ops.readlink(R))},stat(y,b){var R=J.lookupPath(y,{follow:!b}),W=R.node;if(!W)throw new J.ErrnoError(44);if(!W.node_ops.getattr)throw new J.ErrnoError(63);return W.node_ops.getattr(W)},lstat(y){return J.stat(y,!0)},chmod(y,b,R){var W;if(typeof y=="string"){var _=J.lookupPath(y,{follow:!R});W=_.node}else W=y;if(!W.node_ops.setattr)throw new J.ErrnoError(63);W.node_ops.setattr(W,{mode:b&4095|W.mode&-4096,timestamp:Date.now()})},lchmod(y,b){J.chmod(y,b,!0)},fchmod(y,b){var R=J.getStreamChecked(y);J.chmod(R.node,b)},chown(y,b,R,W){var _;if(typeof y=="string"){var q=J.lookupPath(y,{follow:!W});_=q.node}else _=y;if(!_.node_ops.setattr)throw new J.ErrnoError(63);_.node_ops.setattr(_,{timestamp:Date.now()})},lchown(y,b,R){J.chown(y,b,R,!0)},fchown(y,b,R){var W=J.getStreamChecked(y);J.chown(W.node,b,R)},truncate(y,b){if(b<0)throw new J.ErrnoError(28);var R;if(typeof y=="string"){var W=J.lookupPath(y,{follow:!0});R=W.node}else R=y;if(!R.node_ops.setattr)throw new J.ErrnoError(63);if(J.isDir(R.mode))throw new J.ErrnoError(31);if(!J.isFile(R.mode))throw new J.ErrnoError(28);var _=J.nodePermissions(R,"w");if(_)throw new J.ErrnoError(_);R.node_ops.setattr(R,{size:b,timestamp:Date.now()})},ftruncate(y,b){var R=J.getStreamChecked(y);if((R.flags&2097155)===0)throw new J.ErrnoError(28);J.truncate(R.node,b)},utime(y,b,R){var W=J.lookupPath(y,{follow:!0}),_=W.node;_.node_ops.setattr(_,{timestamp:Math.max(b,R)})},open(y,b,R){if(y==="")throw new J.ErrnoError(44);b=typeof b=="string"?Qn(b):b,b&64?(R=typeof R>"u"?438:R,R=R&4095|32768):R=0;var W;if(typeof y=="object")W=y;else{y=oA.normalize(y);try{var _=J.lookupPath(y,{follow:!(b&131072)});W=_.node}catch(DA){}}var q=!1;if(b&64)if(W){if(b&128)throw new J.ErrnoError(20)}else W=J.mknod(y,R,0),q=!0;if(!W)throw new J.ErrnoError(44);if(J.isChrdev(W.mode)&&(b&=-513),b&65536&&!J.isDir(W.mode))throw new J.ErrnoError(54);if(!q){var tA=J.mayOpen(W,b);if(tA)throw new J.ErrnoError(tA)}b&512&&!q&&J.truncate(W,0),b&=-131713;var rA=J.createStream({node:W,path:J.getPath(W),flags:b,seekable:!0,position:0,stream_ops:W.stream_ops,ungotten:[],error:!1});return rA.stream_ops.open&&rA.stream_ops.open(rA),rA},close(y){if(J.isClosed(y))throw new J.ErrnoError(8);y.getdents&&(y.getdents=null);try{y.stream_ops.close&&y.stream_ops.close(y)}catch(b){throw b}finally{J.closeStream(y.fd)}y.fd=null},isClosed(y){return y.fd===null},llseek(y,b,R){if(J.isClosed(y))throw new J.ErrnoError(8);if(!y.seekable||!y.stream_ops.llseek)throw new J.ErrnoError(70);if(R!=0&&R!=1&&R!=2)throw new J.ErrnoError(28);return y.position=y.stream_ops.llseek(y,b,R),y.ungotten=[],y.position},read(y,b,R,W,_){if(W<0||_<0)throw new J.ErrnoError(28);if(J.isClosed(y))throw new J.ErrnoError(8);if((y.flags&2097155)===1)throw new J.ErrnoError(8);if(J.isDir(y.node.mode))throw new J.ErrnoError(31);if(!y.stream_ops.read)throw new J.ErrnoError(28);var q=typeof _<"u";if(!q)_=y.position;else if(!y.seekable)throw new J.ErrnoError(70);var tA=y.stream_ops.read(y,b,R,W,_);return q||(y.position+=tA),tA},write(y,b,R,W,_,q){if(W<0||_<0)throw new J.ErrnoError(28);if(J.isClosed(y))throw new J.ErrnoError(8);if((y.flags&2097155)===0)throw new J.ErrnoError(8);if(J.isDir(y.node.mode))throw new J.ErrnoError(31);if(!y.stream_ops.write)throw new J.ErrnoError(28);y.seekable&&y.flags&1024&&J.llseek(y,0,2);var tA=typeof _<"u";if(!tA)_=y.position;else if(!y.seekable)throw new J.ErrnoError(70);var rA=y.stream_ops.write(y,b,R,W,_,q);return tA||(y.position+=rA),rA},allocate(y,b,R){if(J.isClosed(y))throw new J.ErrnoError(8);if(b<0||R<=0)throw new J.ErrnoError(28);if((y.flags&2097155)===0)throw new J.ErrnoError(8);if(!J.isFile(y.node.mode)&&!J.isDir(y.node.mode))throw new J.ErrnoError(43);if(!y.stream_ops.allocate)throw new J.ErrnoError(138);y.stream_ops.allocate(y,b,R)},mmap(y,b,R,W,_){if((W&2)!==0&&(_&2)===0&&(y.flags&2097155)!==2)throw new J.ErrnoError(2);if((y.flags&2097155)===1)throw new J.ErrnoError(2);if(!y.stream_ops.mmap)throw new J.ErrnoError(43);if(!b)throw new J.ErrnoError(28);return y.stream_ops.mmap(y,b,R,W,_)},msync(y,b,R,W,_){return y.stream_ops.msync?y.stream_ops.msync(y,b,R,W,_):0},ioctl(y,b,R){if(!y.stream_ops.ioctl)throw new J.ErrnoError(59);return y.stream_ops.ioctl(y,b,R)},readFile(y,b={}){if(b.flags=b.flags||0,b.encoding=b.encoding||"binary",b.encoding!=="utf8"&&b.encoding!=="binary")throw new Error(`Invalid encoding type "${b.encoding}"`);var R,W=J.open(y,b.flags),_=J.stat(y),q=_.size,tA=new Uint8Array(q);return J.read(W,tA,0,q,0),b.encoding==="utf8"?R=vt(tA):b.encoding==="binary"&&(R=tA),J.close(W),R},writeFile(y,b,R={}){R.flags=R.flags||577;var W=J.open(y,R.flags,R.mode);if(typeof b=="string"){var _=new Uint8Array(OA(b)+1),q=wt(b,_,0,_.length);J.write(W,_,0,q,void 0,R.canOwn)}else if(ArrayBuffer.isView(b))J.write(W,b,0,b.byteLength,void 0,R.canOwn);else throw new Error("Unsupported data type");J.close(W)},cwd:()=>J.currentPath,chdir(y){var b=J.lookupPath(y,{follow:!0});if(b.node===null)throw new J.ErrnoError(44);if(!J.isDir(b.node.mode))throw new J.ErrnoError(54);var R=J.nodePermissions(b.node,"x");if(R)throw new J.ErrnoError(R);J.currentPath=b.path},createDefaultDirectories(){J.mkdir("/tmp"),J.mkdir("/home"),J.mkdir("/home/web_user")},createDefaultDevices(){J.mkdir("/dev"),J.registerDevice(J.makedev(1,3),{read:()=>0,write:(W,_,q,tA,rA)=>tA}),J.mkdev("/dev/null",J.makedev(1,3)),ze.register(J.makedev(5,0),ze.default_tty_ops),ze.register(J.makedev(6,0),ze.default_tty1_ops),J.mkdev("/dev/tty",J.makedev(5,0)),J.mkdev("/dev/tty1",J.makedev(6,0));var y=new Uint8Array(1024),b=0,R=()=>(b===0&&(b=he(y).byteLength),y[--b]);J.createDevice("/dev","random",R),J.createDevice("/dev","urandom",R),J.mkdir("/dev/shm"),J.mkdir("/dev/shm/tmp")},createSpecialDirectories(){J.mkdir("/proc");var y=J.mkdir("/proc/self");J.mkdir("/proc/self/fd"),J.mount({mount(){var b=J.createNode(y,"fd",16895,73);return b.node_ops={lookup(R,W){var _=+W,q=J.getStreamChecked(_),tA={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>q.path}};return tA.parent=tA,tA}},b}},{},"/proc/self/fd")},createStandardStreams(y,b,R){y?J.createDevice("/dev","stdin",y):J.symlink("/dev/tty","/dev/stdin"),b?J.createDevice("/dev","stdout",null,b):J.symlink("/dev/tty","/dev/stdout"),R?J.createDevice("/dev","stderr",null,R):J.symlink("/dev/tty1","/dev/stderr"),J.open("/dev/stdin",0),J.open("/dev/stdout",1),J.open("/dev/stderr",1)},staticInit(){[44].forEach(y=>{J.genericErrors[y]=new J.ErrnoError(y),J.genericErrors[y].stack=""}),J.nameTable=new Array(4096),J.mount(He,{},"/"),J.createDefaultDirectories(),J.createDefaultDevices(),J.createSpecialDirectories(),J.filesystems={MEMFS:He}},init(y,b,R){J.initialized=!0,J.createStandardStreams(y,b,R)},quit(){J.initialized=!1;for(var y=0;ythis.length-1||Ue<0)){var Je=Ue%this.chunkSize,Ei=Ue/this.chunkSize|0;return this.getter(Ei)[Je]}}setDataGetter(Ue){this.getter=Ue}cacheLength(){var Ue=new XMLHttpRequest;if(Ue.open("HEAD",R,!1),Ue.send(null),!(Ue.status>=200&&Ue.status<300||Ue.status===304))throw new Error("Couldn't load "+R+". Status: "+Ue.status);var Je=Number(Ue.getResponseHeader("Content-length")),Ei,no=(Ei=Ue.getResponseHeader("Accept-Ranges"))&&Ei==="bytes",AA=(Ei=Ue.getResponseHeader("Content-Encoding"))&&Ei==="gzip",fA=1024*1024;no||(fA=Je);var ZA=(Me,Re)=>{if(Me>Re)throw new Error("invalid range ("+Me+", "+Re+") or no bytes requested!");if(Re>Je-1)throw new Error("only "+Je+" bytes available! programmer error!");var ct=new XMLHttpRequest;if(ct.open("GET",R,!1),Je!==fA&&ct.setRequestHeader("Range","bytes="+Me+"-"+Re),ct.responseType="arraybuffer",ct.overrideMimeType&&ct.overrideMimeType("text/plain; charset=x-user-defined"),ct.send(null),!(ct.status>=200&&ct.status<300||ct.status===304))throw new Error("Couldn't load "+R+". Status: "+ct.status);return ct.response!==void 0?new Uint8Array(ct.response||[]):rt(ct.responseText||"",!0)},Ye=this;Ye.setDataGetter(Me=>{var Re=Me*fA,ct=(Me+1)*fA-1;if(ct=Math.min(ct,Je-1),typeof Ye.chunks[Me]>"u"&&(Ye.chunks[Me]=ZA(Re,ct)),typeof Ye.chunks[Me]>"u")throw new Error("doXHR failed!");return Ye.chunks[Me]}),(AA||!Je)&&(fA=Je=1,Je=this.getter(0).length,fA=Je,B("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=Je,this._chunkSize=fA,this.lengthKnown=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if(typeof XMLHttpRequest<"u"){throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var tA,rA}else var rA={isDevice:!1,url:R};var DA=J.createFile(y,b,rA,W,_);rA.contents?DA.contents=rA.contents:rA.url&&(DA.contents=null,DA.url=rA.url),Object.defineProperties(DA,{usedBytes:{get:function(){return this.contents.length}}});var ae={},ge=Object.keys(DA.stream_ops);ge.forEach(Ve=>{var Ue=DA.stream_ops[Ve];ae[Ve]=(...Je)=>(J.forceLoadFile(DA),Ue(...Je))});function pe(Ve,Ue,Je,Ei,no){var AA=Ve.node.contents;if(no>=AA.length)return 0;var fA=Math.min(AA.length-no,Ei);if(AA.slice)for(var ZA=0;ZA(J.forceLoadFile(DA),pe(Ve,Ue,Je,Ei,no)),ae.mmap=(Ve,Ue,Je,Ei,no)=>{J.forceLoadFile(DA);var AA=Sn(Ue);if(!AA)throw new J.ErrnoError(48);return pe(Ve,k,AA,Ue,Je),{ptr:AA,allocated:!0}},DA.stream_ops=ae,DA}},ut={DEFAULT_POLLMASK:5,calculateAt(y,b,R){if(oA.isAbs(b))return b;var W;if(y===-100)W=J.cwd();else{var _=ut.getStreamFromFD(y);W=_.path}if(b.length==0){if(!R)throw new J.ErrnoError(44);return W}return oA.join2(W,b)},doStat(y,b,R){var W=y(b);F[R>>2]=W.dev,F[R+4>>2]=W.mode,z[R+8>>2]=W.nlink,F[R+12>>2]=W.uid,F[R+16>>2]=W.gid,F[R+20>>2]=W.rdev,X[R+24>>3]=BigInt(W.size),F[R+32>>2]=4096,F[R+36>>2]=W.blocks;var _=W.atime.getTime(),q=W.mtime.getTime(),tA=W.ctime.getTime();return X[R+40>>3]=BigInt(Math.floor(_/1e3)),z[R+48>>2]=_%1e3*1e3*1e3,X[R+56>>3]=BigInt(Math.floor(q/1e3)),z[R+64>>2]=q%1e3*1e3*1e3,X[R+72>>3]=BigInt(Math.floor(tA/1e3)),z[R+80>>2]=tA%1e3*1e3*1e3,X[R+88>>3]=BigInt(W.ino),0},doMsync(y,b,R,W,_){if(!J.isFile(b.node.mode))throw new J.ErrnoError(43);if(W&2)return 0;var q=M.slice(y,y+R);J.msync(b,q,_,R,W)},getStreamFromFD(y){var b=J.getStreamChecked(y);return b},varargs:void 0,getStr(y){var b=Ke(y);return b}};function bi(y,b,R,W){try{if(b=ut.getStr(b),b=ut.calculateAt(y,b),R&-8)return-28;var _=J.lookupPath(b,{follow:!0}),q=_.node;if(!q)return-44;var tA="";return R&4&&(tA+="r"),R&2&&(tA+="w"),R&1&&(tA+="x"),tA&&J.nodePermissions(q,tA)?-2:0}catch(rA){if(typeof J>"u"||rA.name!=="ErrnoError")throw rA;return-rA.errno}}function kn(){var y=F[+ut.varargs>>2];return ut.varargs+=4,y}var _n=kn;function Co(y,b,R){ut.varargs=R;try{var W=ut.getStreamFromFD(y);switch(b){case 0:{var _=kn();if(_<0)return-28;for(;J.streams[_];)_++;var q;return q=J.dupStream(W,_),q.fd}case 1:case 2:return 0;case 3:return W.flags;case 4:{var _=kn();return W.flags|=_,0}case 12:{var _=_n(),tA=0;return x[_+tA>>1]=2,0}case 13:case 14:return 0}return-28}catch(rA){if(typeof J>"u"||rA.name!=="ErrnoError")throw rA;return-rA.errno}}function ia(y,b){try{var R=ut.getStreamFromFD(y);return ut.doStat(J.stat,R.path,b)}catch(W){if(typeof J>"u"||W.name!=="ErrnoError")throw W;return-W.errno}}function So(y,b,R){ut.varargs=R;try{var W=ut.getStreamFromFD(y);switch(b){case 21509:return W.tty?0:-59;case 21505:{if(!W.tty)return-59;if(W.tty.ops.ioctl_tcgets){var _=W.tty.ops.ioctl_tcgets(W),q=_n();F[q>>2]=_.c_iflag||0,F[q+4>>2]=_.c_oflag||0,F[q+8>>2]=_.c_cflag||0,F[q+12>>2]=_.c_lflag||0;for(var tA=0;tA<32;tA++)k[q+tA+17]=_.c_cc[tA]||0;return 0}return 0}case 21510:case 21511:case 21512:return W.tty?0:-59;case 21506:case 21507:case 21508:{if(!W.tty)return-59;if(W.tty.ops.ioctl_tcsets){for(var q=_n(),rA=F[q>>2],DA=F[q+4>>2],ae=F[q+8>>2],ge=F[q+12>>2],pe=[],tA=0;tA<32;tA++)pe.push(k[q+tA+17]);return W.tty.ops.ioctl_tcsets(W.tty,b,{c_iflag:rA,c_oflag:DA,c_cflag:ae,c_lflag:ge,c_cc:pe})}return 0}case 21519:{if(!W.tty)return-59;var q=_n();return F[q>>2]=0,0}case 21520:return W.tty?-28:-59;case 21531:{var q=_n();return J.ioctl(W,b,q)}case 21523:{if(!W.tty)return-59;if(W.tty.ops.ioctl_tiocgwinsz){var Ve=W.tty.ops.ioctl_tiocgwinsz(W.tty),q=_n();x[q>>1]=Ve[0],x[q+2>>1]=Ve[1]}return 0}case 21524:return W.tty?0:-59;case 21515:return W.tty?0:-59;default:return-28}}catch(Ue){if(typeof J>"u"||Ue.name!=="ErrnoError")throw Ue;return-Ue.errno}}function Vo(y,b,R,W){try{b=ut.getStr(b);var _=W&256,q=W&4096;return W=W&-6401,b=ut.calculateAt(y,b,q),ut.doStat(_?J.lstat:J.stat,b,R)}catch(tA){if(typeof J>"u"||tA.name!=="ErrnoError")throw tA;return-tA.errno}}function ga(y,b,R,W){ut.varargs=W;try{b=ut.getStr(b),b=ut.calculateAt(y,b);var _=W?kn():0;return J.open(b,R,_).fd}catch(q){if(typeof J>"u"||q.name!=="ErrnoError")throw q;return-q.errno}}function Ko(y,b){try{return y=ut.getStr(y),ut.doStat(J.stat,y,b)}catch(R){if(typeof J>"u"||R.name!=="ErrnoError")throw R;return-R.errno}}var va=()=>{PA("")},ca=y=>y%4===0&&(y%100!==0||y%400===0),pa=[0,31,60,91,121,152,182,213,244,274,305,335],Uo=[0,31,59,90,120,151,181,212,243,273,304,334],de=y=>{var b=ca(y.getFullYear()),R=b?pa:Uo,W=R[y.getMonth()]+y.getDate()-1;return W},xi=9007199254740992,wn=-9007199254740992,xn=y=>yxi?NaN:Number(y);function na(y,b){y=xn(y);var R=new Date(y*1e3);F[b>>2]=R.getSeconds(),F[b+4>>2]=R.getMinutes(),F[b+8>>2]=R.getHours(),F[b+12>>2]=R.getDate(),F[b+16>>2]=R.getMonth(),F[b+20>>2]=R.getFullYear()-1900,F[b+24>>2]=R.getDay();var W=de(R)|0;F[b+28>>2]=W,F[b+36>>2]=-(R.getTimezoneOffset()*60);var _=new Date(R.getFullYear(),0,1),q=new Date(R.getFullYear(),6,1).getTimezoneOffset(),tA=_.getTimezoneOffset(),rA=(q!=tA&&R.getTimezoneOffset()==Math.min(tA,q))|0;F[b+32>>2]=rA}function Ra(y,b,R,W,_,q,tA){_=xn(_);try{if(isNaN(_))return 61;var rA=ut.getStreamFromFD(W),DA=J.mmap(rA,y,_,b,R),ae=DA.ptr;return F[q>>2]=DA.allocated,z[tA>>2]=ae,0}catch(ge){if(typeof J>"u"||ge.name!=="ErrnoError")throw ge;return-ge.errno}}function Oi(y,b,R,W,_,q){q=xn(q);try{var tA=ut.getStreamFromFD(_);R&2&&ut.doMsync(y,tA,b,W,q)}catch(rA){if(typeof J>"u"||rA.name!=="ErrnoError")throw rA;return-rA.errno}}var ko=(y,b,R)=>wt(y,M,b,R),ar=(y,b,R,W)=>{var _=new Date().getFullYear(),q=new Date(_,0,1),tA=new Date(_,6,1),rA=q.getTimezoneOffset(),DA=tA.getTimezoneOffset(),ae=Math.max(rA,DA);z[y>>2]=ae*60,F[b>>2]=+(rA!=DA);var ge=Ue=>{var Je=Ue>=0?"-":"+",Ei=Math.abs(Ue),no=String(Math.floor(Ei/60)).padStart(2,"0"),AA=String(Ei%60).padStart(2,"0");return`UTC${Je}${no}${AA}`},pe=ge(rA),Ve=ge(DA);DADate.now(),ja=()=>2147483648,to=y=>{var b=v.buffer,R=(y-b.byteLength+65535)/65536|0;try{return v.grow(R),Z(),1}catch(W){}},Wi=y=>{var b=M.length;y>>>=0;var R=ja();if(y>R)return!1;for(var W=1;W<=4;W*=2){var _=b*(1+.2/W);_=Math.min(_,y+100663296);var q=Math.min(R,mn(Math.max(y,_),65536)),tA=to(q);if(tA)return!0}return!1},ei={},qn=()=>s,_o=()=>{if(!_o.strings){var y=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",b={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:y,_:qn()};for(var R in ei)ei[R]===void 0?delete b[R]:b[R]=ei[R];var W=[];for(var R in b)W.push(`${R}=${b[R]}`);_o.strings=W}return _o.strings},qo=(y,b)=>{for(var R=0;R{var R=0;return _o().forEach((W,_)=>{var q=b+R;z[y+_*4>>2]=q,qo(W,q),R+=W.length+1}),0},ee=(y,b)=>{var R=_o();z[y>>2]=R.length;var W=0;return R.forEach(_=>W+=_.length+1),z[b>>2]=W,0},be=y=>{l(y,new Pt(y))},EA=(y,b)=>{be(y)},LA=EA;function Ce(y){try{var b=ut.getStreamFromFD(y);return J.close(b),0}catch(R){if(typeof J>"u"||R.name!=="ErrnoError")throw R;return R.errno}}var Te=(y,b,R,W)=>{for(var _=0,q=0;q>2],rA=z[b+4>>2];b+=8;var DA=J.read(y,k,tA,rA,W);if(DA<0)return-1;if(_+=DA,DA>2]=q,0}catch(tA){if(typeof J>"u"||tA.name!=="ErrnoError")throw tA;return tA.errno}}function dt(y,b,R,W){b=xn(b);try{if(isNaN(b))return 61;var _=ut.getStreamFromFD(y);return J.llseek(_,b,R),X[W>>3]=BigInt(_.position),_.getdents&&b===0&&R===0&&(_.getdents=null),0}catch(q){if(typeof J>"u"||q.name!=="ErrnoError")throw q;return q.errno}}var Ut=(y,b,R,W)=>{for(var _=0,q=0;q>2],rA=z[b+4>>2];b+=8;var DA=J.write(y,k,tA,rA,W);if(DA<0)return-1;if(_+=DA,DA>2]=q,0}catch(tA){if(typeof J>"u"||tA.name!=="ErrnoError")throw tA;return tA.errno}}var Zi=y=>{var b=t["_"+y];return b},nn=(y,b)=>{k.set(y,b)},ai=y=>Io(y),Xi=y=>{var b=OA(y)+1,R=ai(b);return ko(y,R,b),R},Na=(y,b,R,W,_)=>{var q={string:Je=>{var Ei=0;return Je!=null&&Je!==0&&(Ei=Xi(Je)),Ei},array:Je=>{var Ei=ai(Je.length);return nn(Je,Ei),Ei}};function tA(Je){return b==="string"?Ke(Je):b==="boolean"?!!Je:Je}var rA=Zi(y),DA=[],ae=0;if(W)for(var ge=0;ge(t._viz_set_y_invert=It.A)(y),t._viz_set_reduce=y=>(t._viz_set_reduce=It.B)(y),t._viz_get_graphviz_version=()=>(t._viz_get_graphviz_version=It.C)(),t._free=y=>(t._free=It.D)(y),t._malloc=y=>(t._malloc=It.E)(y),t._viz_get_plugin_list=y=>(t._viz_get_plugin_list=It.G)(y),t._viz_create_graph=(y,b,R)=>(t._viz_create_graph=It.H)(y,b,R),t._viz_read_one_graph=y=>(t._viz_read_one_graph=It.I)(y),t._viz_string_dup=(y,b)=>(t._viz_string_dup=It.J)(y,b),t._viz_string_dup_html=(y,b)=>(t._viz_string_dup_html=It.K)(y,b),t._viz_string_free=(y,b)=>(t._viz_string_free=It.L)(y,b),t._viz_string_free_html=(y,b)=>(t._viz_string_free_html=It.M)(y,b),t._viz_add_node=(y,b)=>(t._viz_add_node=It.N)(y,b),t._viz_add_edge=(y,b,R)=>(t._viz_add_edge=It.O)(y,b,R),t._viz_add_subgraph=(y,b)=>(t._viz_add_subgraph=It.P)(y,b),t._viz_set_default_graph_attribute=(y,b,R)=>(t._viz_set_default_graph_attribute=It.Q)(y,b,R),t._viz_set_default_node_attribute=(y,b,R)=>(t._viz_set_default_node_attribute=It.R)(y,b,R),t._viz_set_default_edge_attribute=(y,b,R)=>(t._viz_set_default_edge_attribute=It.S)(y,b,R),t._viz_set_attribute=(y,b,R)=>(t._viz_set_attribute=It.T)(y,b,R),t._viz_free_graph=y=>(t._viz_free_graph=It.U)(y),t._viz_create_context=()=>(t._viz_create_context=It.V)(),t._viz_free_context=y=>(t._viz_free_context=It.W)(y),t._viz_layout=(y,b,R)=>(t._viz_layout=It.X)(y,b,R),t._viz_free_layout=(y,b)=>(t._viz_free_layout=It.Y)(y,b),t._viz_reset_errors=()=>(t._viz_reset_errors=It.Z)(),t._viz_render=(y,b,R)=>(t._viz_render=It._)(y,b,R);var $i=(y,b)=>($i=It.$)(y,b),cn=y=>(cn=It.aa)(y),Io=y=>(Io=It.ba)(y),Rn=()=>(Rn=It.ca)();t.ccall=Na,t.getValue=fe,t.PATH=oA,t.UTF8ToString=Ke,t.stringToUTF8=ko,t.lengthBytesUTF8=OA,t.FS=J;var Tt,fa;qA=function y(){Tt||oa(),Tt||(qA=y)};function oa(){if(xA>0||!fa&&(fa=1,QA(),xA>0))return;function y(){Tt||(Tt=1,t.calledRun=1,!S&&(RA(),n(t),dA()))}y()}return oa(),A=a,A}})(),$$=[[/^Error: (.*)/,"error"],[/^Warning: (.*)/,"warning"]];function r_A(i){return i.map(e=>{for(let A=0;A<$$.length;A++){let[t,n]=$$[A],o;if((o=t.exec(e))!==null)return{message:o[1].trimEnd(),level:n}}return{message:e.trimEnd()}})}function s_A(i){let e=[],A;for(let t=0;t{if(typeof A.name!="string")throw new Error("image name must be a string");if(typeof A.width!="number"&&typeof A.width!="string")throw new Error("image width must be a number or string");if(typeof A.height!="number"&&typeof A.height!="string")throw new Error("image height must be a number or string");let t=i.PATH.join("/",A.name),n=` - -`;return i.FS.createPath("/",i.PATH.dirname(t)),i.FS.writeFile(t,n),t}):[]}function c_A(i,e){for(let A of e)i.FS.analyzePath(A).exists&&i.FS.unlink(A)}function C_A(i,e,A){let t;try{let n=i.lengthBytesUTF8(e);return t=i.ccall("malloc","number",["number"],[n+1]),i.stringToUTF8(e,t,n+1),i.ccall("viz_read_one_graph","number",["number"],[t])}finally{t&&i.ccall("free","number",["number"],[t])}}function d_A(i,e,A){let t=i.ccall("viz_create_graph","number",["string","number","number"],[e.name,typeof e.directed<"u"?e.directed:!0,typeof e.strict<"u"?e.strict:!1]);return iAA(i,t,e),t}function iAA(i,e,A){nAA(i,e,A),A.nodes&&A.nodes.forEach(t=>{if(typeof t.name>"u")throw new Error("nodes must have a name");let n=i.ccall("viz_add_node","number",["number","string"],[e,String(t.name)]);t.attributes&&tAA(i,e,n,t.attributes)}),A.edges&&A.edges.forEach(t=>{if(typeof t.tail>"u")throw new Error("edges must have a tail");if(typeof t.head>"u")throw new Error("edges must have a head");let n=i.ccall("viz_add_edge","number",["number","string","string"],[e,String(t.tail),String(t.head)]);t.attributes&&tAA(i,e,n,t.attributes)}),A.subgraphs&&A.subgraphs.forEach(t=>{let n=i.ccall("viz_add_subgraph","number",["number","string"],[e,typeof t.name<"u"?String(t.name):0]);iAA(i,n,t)})}function nAA(i,e,A){if(A.graphAttributes)for(let[t,n]of Object.entries(A.graphAttributes))ED(i,e,n,o=>{i.ccall("viz_set_default_graph_attribute","number",["number","string","number"],[e,t,o])});if(A.nodeAttributes)for(let[t,n]of Object.entries(A.nodeAttributes))ED(i,e,n,o=>{i.ccall("viz_set_default_node_attribute","number",["number","string","number"],[e,t,o])});if(A.edgeAttributes)for(let[t,n]of Object.entries(A.edgeAttributes))ED(i,e,n,o=>{i.ccall("viz_set_default_edge_attribute","number",["number","string","number"],[e,t,o])})}function tAA(i,e,A,t){for(let[n,o]of Object.entries(t))ED(i,e,o,a=>{i.ccall("viz_set_attribute","number",["number","string","number"],[A,n,a])})}function ED(i,e,A,t){let n;if(typeof A=="object"&&"html"in A?n=i.ccall("viz_string_dup_html","number",["number","string"],[e,String(A.html)]):n=i.ccall("viz_string_dup","number",["number","string"],[e,String(A)]),n==0)throw new Error("couldn't dup string");t(n),typeof A=="object"&&"html"in A?i.ccall("viz_string_free_html","number",["number","number"],[e,n]):i.ccall("viz_string_free","number",["number","number"],[e,n])}var sN=class{constructor(e){this.module=e}get graphvizVersion(){return l_A(this.module)}get formats(){return AAA(this.module,"device")}get engines(){return AAA(this.module,"layout")}renderFormats(e,A,t={}){return eAA(this.module,e,A,P({engine:"dot"},t))}render(e,A={}){let t;A.format===void 0?t="dot":t=A.format;let n=eAA(this.module,e,[t],P({engine:"dot"},A));return n.status==="success"&&(n.output=n.output[t]),n}renderString(e,A={}){let t=this.render(e,A);if(t.status!=="success")throw new Error(t.errors.find(n=>n.level=="error")?.message||"render failed");return t.output}renderSVGElement(e,A={}){let t=this.renderString(e,$A(P({},A),{format:"svg"})),n;return typeof A.trustedTypePolicy<"u"?n=A.trustedTypePolicy.createHTML(t):n=t,new DOMParser().parseFromString(n,"image/svg+xml").documentElement}renderJSON(e,A={}){let t=this.renderString(e,$A(P({},A),{format:"json"}));return JSON.parse(t)}};function oAA(){return a_A().then(i=>new sN(i))}var QD=class i{render(e){return re(this,null,function*(){let A={format:"svg",engine:"dot"};return(yield oAA()).renderString(e,A)})}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var uD=new MA("VideoService");var pD=class i{createMessagePartFromFile(e){return re(this,null,function*(){return{inlineData:{displayName:e.name,data:yield this.readFileAsBytes(e),mimeType:e.type}}})}readFileAsBytes(e){return new Promise((A,t)=>{let n=new FileReader;n.onload=o=>{let a=o.target.result.split(",")[1];A(a)},n.onerror=t,n.readAsDataURL(e)})}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var fD=class i extends wm{sanitizer=w(jC);windowOpen(e,A,t,n){return e.open(A,t,n)}createObjectUrl(e){return URL.createObjectURL(e)}openBlobUrl(e){let A=this.createObjectUrl(e);return this.windowOpen(window,A,"_blank")}setAnchorHref(e,A){e.href=A}bypassSecurityTrustHtml(e){return this.sanitizer.bypassSecurityTrustHtml(e)}bypassSecurityTrustUrl(e){return this.sanitizer.bypassSecurityTrustUrl(e)}static \u0275fac=(()=>{let e;return function(t){return(e||(e=Li(i)))(t||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var mD=class i{constructor(e){this.http=e}apiServerDomain=Rr.getApiServerBaseUrl();createSession(e,A,t){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`,o={};return t?o.state=t:o.state={},this.http.post(n,t?o:null)}return new Fi}updateSession(e,A,t,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${t}`;return this.http.patch(o,n)}listSessions(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.get(t).pipe(Se(n=>({items:n,nextPageToken:""})))}return oe({items:[],nextPageToken:""})}deleteSession(e,A,t){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${t}`;return this.http.delete(n)}getSession(e,A,t){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${t}`;return this.http.get(n)}importSession(e,A,t,n){if(this.apiServerDomain!=null){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`,a={events:t};return n&&(a.state=n),this.http.post(o,a)}return new Fi}canEdit(e,A){return oe(!0)}static \u0275fac=function(A){return new(A||i)(Wo(Mr))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var wD=class i{audioRecordingService=w(pB);videoService=w(uD);webSocketService=w(mB);audioIntervalId=void 0;videoIntervalId=void 0;constructor(){}getWsUrl(e,A,t,n){let a=`${window.location.protocol==="https:"?"wss":"ws"}://${Rr.getWSServerUrl()}/run_live?app_name=${e}&user_id=${A}&session_id=${t}`;return n&&(n.proactiveAudio&&(a+="&proactive_audio=true"),n.enableAffectiveDialog&&(a+="&enable_affective_dialog=true"),n.enableSessionResumption&&(a+="&enable_session_resumption=true"),n.saveLiveBlob&&(a+="&save_live_blob=true")),a}startAudioChat(o){return re(this,arguments,function*({appName:e,userId:A,sessionId:t,flags:n}){this.webSocketService.connect(this.getWsUrl(e,A,t,n)),yield this.startAudioStreaming()})}stopAudioChat(){this.stopAudioStreaming(),this.webSocketService.closeConnection()}startAudioStreaming(){return re(this,null,function*(){try{yield this.audioRecordingService.startRecording(),this.audioIntervalId=window.setInterval(()=>this.sendBufferedAudio(),250)}catch(e){console.error("Error accessing microphone:",e)}})}stopAudioStreaming(){clearInterval(this.audioIntervalId),this.audioIntervalId=void 0,this.audioRecordingService.stopRecording()}sendBufferedAudio(){let e=this.audioRecordingService.getCombinedAudioBuffer();if(!e)return;let A={blob:{mime_type:"audio/pcm",data:e}};this.webSocketService.sendMessage(A),this.audioRecordingService.cleanAudioBuffer()}startVideoChat(a){return re(this,arguments,function*({appName:e,userId:A,sessionId:t,videoContainer:n,flags:o}){this.webSocketService.connect(this.getWsUrl(e,A,t,o)),yield this.startAudioStreaming(),yield this.startVideoStreaming(n)})}stopVideoChat(e){this.stopAudioStreaming(),this.stopVideoStreaming(e),this.webSocketService.closeConnection()}startVideoStreaming(e){return re(this,null,function*(){try{yield this.videoService.startRecording(e),this.videoIntervalId=window.setInterval(()=>re(this,null,function*(){return yield this.sendCapturedFrame()}),1e3)}catch(A){console.error("Error accessing camera:",A)}})}sendCapturedFrame(){return re(this,null,function*(){let e=yield this.videoService.getCapturedFrame();if(!e)return;let A={blob:{mime_type:"image/jpeg",data:e}};this.webSocketService.sendMessage(A)})}stopVideoStreaming(e){clearInterval(this.videoIntervalId),this.videoIntervalId=void 0,this.videoService.stopRecording(e)}onStreamClose(){return this.webSocketService.onCloseReason()}closeStream(){this.webSocketService.closeConnection()}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var yD=class i{stc(e,A){let t=this.hashCode(e),n=Math.abs(t%360),o=60+Math.abs((t>>8)%40),a;return A==="dark"?a=15+Math.abs((t>>16)%30):a=40+Math.abs((t>>16)%30),this.hslToHex(n,o,a)}hashCode(e){let A=0;for(let t=0,n=e.length;t{let r=(a+e/30)%12,s=t-n*Math.max(Math.min(r-3,9-r,1),-1);return Math.round(255*s).toString(16).padStart(2,"0")};return`#${o(0)}${o(8)}${o(4)}ff`}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var DD=class i{THEME_STORAGE_KEY="adk-theme-preference";currentTheme=mA(this.getInitialTheme());constructor(){Fn(()=>{this.applyTheme(this.currentTheme())})}getInitialTheme(){let e=window.localStorage.getItem(this.THEME_STORAGE_KEY);return e==="light"||e==="dark"?e:"dark"}applyTheme(e){let A=document.documentElement;A.classList.remove("light-theme","dark-theme"),A.classList.add(`${e}-theme`),A.style.colorScheme=e,window.localStorage.setItem(this.THEME_STORAGE_KEY,e),this.updatePrismTheme(e)}updatePrismTheme(e){let A="prism-theme-style",t=document.getElementById(A);t||(t=document.createElement("link"),t.id=A,t.rel="stylesheet",document.head.appendChild(t)),t.href=e==="light"?"prism-light.css":"prism-dark.css"}toggleTheme(){this.currentTheme.update(e=>e==="light"?"dark":"light")}setTheme(e){this.currentTheme.set(e)}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var vD=class i{selectedTraceRowSource=new gi(void 0);selectedTraceRow$=this.selectedTraceRowSource.asObservable();eventDataSource=new gi(void 0);eventData$=this.eventDataSource.asObservable();messagesSource=new gi([]);messages$=this.messagesSource.asObservable();selectedRow(e){this.selectedTraceRowSource.next(e)}setEventData(e){this.eventDataSource.next(e)}setMessages(e){this.messagesSource.next(e)}resetTraceService(){this.selectedTraceRowSource.next(void 0),this.eventDataSource.next(void 0),this.messagesSource.next([])}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var bD=class i{_isSessionLoading=new gi(!1);_isSessionListLoading=new gi(!1);_isEventRequestResponseLoading=new gi(!1);_isMessagesLoading=new gi(!1);_newMessagesLoadedResponse=new ne;_newMessagesLoadingFailedResponse=new ne;featureFlagService=w(Nr);isSessionLoading(){return this._isSessionLoading.pipe(WE(this.featureFlagService.isLoadingAnimationsEnabled()),Se(([e,A])=>e&&A),Js({bufferSize:1,refCount:!0}))}setIsSessionLoading(e){this._isSessionLoading.next(e)}isSessionListLoading(){return this._isSessionListLoading.pipe(WE(this.featureFlagService.isLoadingAnimationsEnabled()),Se(([e,A])=>e&&A),Js({bufferSize:1,refCount:!0}))}setIsSessionListLoading(e){this._isSessionListLoading.next(e)}isEventRequestResponseLoading(){return this._isEventRequestResponseLoading.pipe(WE(this.featureFlagService.isLoadingAnimationsEnabled()),Se(([e,A])=>e&&A),Js({bufferSize:1,refCount:!0}))}setIsEventRequestResponseLoading(e){this._isEventRequestResponseLoading.next(e)}setIsMessagesLoading(e){this._isMessagesLoading.next(e)}isMessagesLoading(){return this._isMessagesLoading.pipe(WE(this.featureFlagService.isLoadingAnimationsEnabled()),Se(([e,A])=>e&&A),Js({bufferSize:1,refCount:!0}))}lazyLoadMessages(e,A,t){throw new Error("Not implemented")}onNewMessagesLoaded(){return this._newMessagesLoadedResponse}onNewMessagesLoadingFailed(){return this._newMessagesLoadingFailedResponse}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var MD=class i{mediaRecorder;stream;renderer;videoElement;videoBuffer=[];constructor(e){this.renderer=e.createRenderer(null,null)}createVideoElement(e){e?.nativeElement&&(this.clearVideoElement(e),this.videoElement=this.renderer.createElement("video"),this.renderer.setAttribute(this.videoElement,"width","400"),this.renderer.setAttribute(this.videoElement,"height","300"),this.renderer.setAttribute(this.videoElement,"autoplay","true"),this.renderer.setAttribute(this.videoElement,"muted","true"),this.renderer.appendChild(e.nativeElement,this.videoElement))}startRecording(e){return re(this,null,function*(){this.createVideoElement(e);try{this.stream=yield navigator.mediaDevices.getUserMedia({video:!0}),this.videoElement&&(this.videoElement.srcObject=this.stream),this.mediaRecorder=new MediaRecorder(this.stream,{mimeType:"video/webm"}),this.mediaRecorder.start(1e3)}catch(A){console.error("Error accessing camera/microphone:",A)}})}getCapturedFrame(){return re(this,null,function*(){try{let e=yield this.captureFrame();return this.blobToUint8Array(e)}catch(e){console.error("Error capturing frame:",e);return}})}blobToUint8Array(e){return re(this,null,function*(){let A=yield e.arrayBuffer();return new Uint8Array(A)})}captureFrame(){return re(this,null,function*(){return new Promise((e,A)=>{try{if(!this.videoElement){A(new Error("Video element not available"));return}let t=document.createElement("canvas");t.width=this.videoElement.videoWidth,t.height=this.videoElement.videoHeight;let n=t.getContext("2d");if(!n){A(new Error("Canvas context not supported"));return}n.drawImage(this.videoElement,0,0,t.width,t.height),t.toBlob(o=>{o?e(o):A(new Error("Failed to create image blob"))},"image/png")}catch(t){A(t)}})})}stopRecording(e){this.mediaRecorder&&this.mediaRecorder.stop(),this.stream&&this.stream.getTracks().forEach(A=>A.stop()),this.clearVideoElement(e)}clearVideoElement(e){let A=e.nativeElement.querySelector("video");A&&this.renderer.removeChild(e.nativeElement,A)}static \u0275fac=function(A){return new(A||i)(Wo(zr))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var I_A={url:"",deserializer:i=>JSON.parse(i.data),serializer:i=>JSON.stringify(i)},B_A="WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }",Hp=class i extends BN{constructor(e,A){if(super(),this._socket=null,e instanceof Fi)this.destination=A,this.source=e;else{let t=this._config=Object.assign({},I_A);if(this._output=new ne,typeof e=="string")t.url=e;else for(let n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);if(!t.WebSocketCtor&&WebSocket)t.WebSocketCtor=WebSocket;else if(!t.WebSocketCtor)throw new Error("no WebSocket constructor can be found");this.destination=new _g}}lift(e){let A=new i(this._config,this.destination);return A.operator=e,A.source=this,A}_resetState(){this._socket=null,this.source||(this.destination=new _g),this._output=new ne}multiplex(e,A,t){let n=this;return new Fi(o=>{try{n.next(e())}catch(r){o.error(r)}let a=n.subscribe({next:r=>{try{t(r)&&o.next(r)}catch(s){o.error(s)}},error:r=>o.error(r),complete:()=>o.complete()});return()=>{try{n.next(A())}catch(r){o.error(r)}a.unsubscribe()}})}_connectSocket(){let{WebSocketCtor:e,protocol:A,url:t,binaryType:n}=this._config,o=this._output,a=null;try{a=A?new e(t,A):new e(t),this._socket=a,n&&(this._socket.binaryType=n)}catch(s){o.error(s);return}let r=new Oo(()=>{this._socket=null,a&&a.readyState===1&&a.close()});a.onopen=s=>{let{_socket:l}=this;if(!l){a.close(),this._resetState();return}let{openObserver:g}=this._config;g&&g.next(s);let C=this.destination;this.destination=CN.create(d=>{if(a.readyState===1)try{let{serializer:B}=this._config;a.send(B(d))}catch(B){this.destination.error(B)}},d=>{let{closingObserver:B}=this._config;B&&B.next(void 0),d&&d.code?a.close(d.code,d.reason):o.error(new TypeError(B_A)),this._resetState()},()=>{let{closingObserver:d}=this._config;d&&d.next(void 0),a.close(),this._resetState()}),C&&C instanceof _g&&r.add(C.subscribe(this.destination))},a.onerror=s=>{this._resetState(),o.error(s)},a.onclose=s=>{a===this._socket&&this._resetState();let{closeObserver:l}=this._config;l&&l.next(s),s.wasClean?o.complete():o.error(s)},a.onmessage=s=>{try{let{deserializer:l}=this._config;o.next(l(s))}catch(l){o.error(l)}}}_subscribe(e){let{source:A}=this;return A?A.subscribe(e):(this._socket||this._connectSocket(),this._output.subscribe(e),e.add(()=>{let{_socket:t}=this;this._output.observers.length===0&&(t&&(t.readyState===1||t.readyState===0)&&t.close(),this._resetState())}),e)}unsubscribe(){let{_socket:e}=this;e&&(e.readyState===1||e.readyState===0)&&e.close(),this._resetState(),super.unsubscribe()}};var SD=class i{audioPlayingService=w(fB);socket$;messages$=new gi("");audioBuffer=[];audioIntervalId=null;closeReasonSubject=new ne;connect(e){this.socket$=new Hp({url:e,serializer:A=>JSON.stringify(A),deserializer:A=>A.data,closeObserver:{next:A=>{this.emitWsCloseReason(A.reason)}}}),this.socket$.subscribe(A=>{this.handleIncomingEvent(A)},A=>{console.error("WebSocket error:",A)}),this.audioIntervalId=setInterval(()=>this.playIncomingAudio(),250)}playIncomingAudio(){this.audioPlayingService.playAudio(this.audioBuffer),this.audioBuffer=[]}sendMessage(e){if(e.blob.data=this.arrayBufferToBase64(e.blob.data.buffer),!this.socket$||this.socket$.closed){console.error("WebSocket is not open.");return}this.socket$.next(e)}closeConnection(){clearInterval(this.audioIntervalId),this.audioIntervalId=null,this.socket$&&this.socket$.complete()}getMessages(){return this.messages$.asObservable()}arrayBufferToBase64(e){let A="",t=new Uint8Array(e),n=t.byteLength;for(let o=0;oi.json()).then(i=>{window.runtimeConfig=i,PN(TE,{providers:[mN(jN,fn,VN,oD,Ws,Za,qi),{provide:tl,useClass:mD},{provide:el,useClass:dE},{provide:iy,useClass:hD},{provide:mB,useClass:SD},{provide:Dm,useValue:"./assets/audio-processor.js"},{provide:pB,useClass:cD},{provide:fB,useClass:gD},{provide:uD,useClass:MD},{provide:ym,useClass:wD},{provide:fm,useClass:ID},{provide:A0,useClass:dD},{provide:EB,useClass:lD},{provide:QB,useClass:CD},{provide:ng,useClass:vD},{provide:Nr,useClass:BD},{provide:uB,useClass:QD},{provide:g2,useClass:yD},{provide:Qs,useClass:fD},{provide:mm,useClass:pD},{provide:WN,useValue:$N},{provide:XN,useValue:X$},{provide:g1,useValue:B1},...i.logo?[{provide:wB,useValue:rD}]:[],{provide:$c,useClass:sD},{provide:My,useValue:Sc},oK(),GQ(),{provide:vm,useClass:Gc},{provide:ag,useClass:bD},{provide:og,useClass:DD}]}).catch(e=>console.error(e))}); diff --git a/src/google/adk/cli/browser/main-TCIQIOZ3.js b/src/google/adk/cli/browser/main-TCIQIOZ3.js new file mode 100644 index 0000000000..a6d773b6a4 --- /dev/null +++ b/src/google/adk/cli/browser/main-TCIQIOZ3.js @@ -0,0 +1,4155 @@ +import{$ as RQ,$a as SA,$b as lA,$c as nL,A as Fc,Aa as Ao,Ab as hA,Ac as ZF,B as qC,Ba as Yt,Bb as wn,Bc as ui,C as Lc,Ca as bi,Cb as Gn,Cc as me,D as Y3,Da as ce,Db as Kn,Dc as So,E as Ki,Ea as xg,Eb as Dl,Ec as XF,F as _F,Fa as P3,Fb as yl,Fc as J0,G as gt,Ga as j3,Gb as sn,Gc as wt,H as RF,Ha as qI,Hb as QA,Hc as ZI,I as jI,Ia as TF,Ib as ha,Ic as Be,J as Po,Ja as JF,Jb as U,Jc as Cn,K as xQ,Ka as _g,Kb as qd,Kc as $F,L as Ls,La as Gc,Lb as p,Lc as tp,M as uo,Ma as Go,Mb as Rt,Mc as AL,N as _Q,Na as ZC,Nb as Ve,Nc as Ts,O as kg,Oa as Pd,Ob as jo,Oc as Ab,P as H3,Pa as u,Pb as Jt,Pc as eL,Q as $n,Qa as q3,Qb as ae,Qc as eb,R as Vv,Ra as Hn,Rb as re,Rc as tL,S as VC,Sa as ao,Sb as ep,Sc as Uc,T as WC,Ta as Kr,Tb as ns,Tc as iL,U as Gs,Ua as Pi,Ub as ur,Uc as zl,V as wl,Va as ct,Vb as Qi,Vc as Tc,W as Sn,Wa as V3,Wb as ut,Wc as A2,X as hi,Xa as Mo,Xb as RA,Xc as Js,Y as Qt,Ya as Zv,Yb as zF,Yc as Vd,Z as NF,Za as OF,Zb as ro,Zc as Jc,_ as di,_a as W3,_b as y,_c as os,a as bo,aa as Mt,ab as Ze,ac as ue,ad as oL,b as bF,ba as FF,bb as VA,bc as ba,bd as ip,c as MF,ca as Ja,cb as Xv,cc as wi,cd as li,d as vi,da as qA,db as Z3,dc as Bi,dd as O0,e as SF,ea as We,eb as mt,ec as Di,ed as tb,f as ie,fa as LF,fb as Et,fc as ta,fd as aL,g as kF,ga as kA,gb as X3,gc as ga,gd as rL,h as ei,ha as Lo,hb as YF,hc as zn,hd as sL,i as Sg,ia as w,ib as VI,ic as XC,id as fr,j as jv,ja as GF,jb as $3,jc as NQ,jd as lL,k as U3,ka as Gr,kb as $v,kc as PF,kd as gL,l as Yd,la as Xa,lb as HF,lc as Bt,ld as e2,m as ar,ma as KF,mb as K0,mc as Kc,md as cL,n as kQ,na as T,nb as Ap,nc as Ks,nd as CL,o as Hd,oa as J,ob as te,oc as U0,od as IL,p as Lr,pa as Ct,pb as jd,pc as Ht,q as ne,qa as rr,qb as O,qc as si,r as T3,ra as Dt,rb as WI,rc as T0,rd as dL,s as zd,sa as ti,sb as Y,sc as $C,sd as BL,t as xF,ta as sr,tb as ws,tc as jF,u as J3,ua as UF,ub as ri,uc as qF,v as we,va as LA,vb as Ue,vc as ca,w as Qr,wa as qe,wb as Te,wc as pe,x as Nc,xa as z3,xb as H,xc as VF,y as qv,ya as Wv,yb as B,yc as WF,z as O3,za as bA,zb as Q,zc as Us}from"./chunk-EN473UE3.js";import{a as gA,b as Ye,c as vF,d as G3,f as K3,g as lt,h as Ce}from"./chunk-W7GRJBO5.js";var cO=G3(f9=>{"use strict";var gO={b:"\b",f:"\f",n:` +`,r:"\r",t:" ",'"':'"',"/":"/","\\":"\\"},q0A=97;f9.parse=function(t,e,A){var i={},n=0,o=0,a=0,r=A&&A.bigint&&typeof BigInt<"u";return{data:s("",!0),pointers:i};function s(P,Z){l();var tA;k(P,"value");var W=E();switch(W){case"t":h("rue"),tA=!0;break;case"f":h("alse"),tA=!1;break;case"n":h("ull"),tA=null;break;case'"':tA=g();break;case"[":tA=I(P);break;case"{":tA=d(P);break;default:f(),"-0123456789".indexOf(W)>=0?tA=C():x()}return k(P,"valueEnd"),l(),Z&&aNumber.MAX_SAFE_INTEGER||tA="a"&&tA<="f"?Z+=tA.charCodeAt()-q0A+10:tA>="0"&&tA<="9"?Z+=+tA:F()}return String.fromCharCode(Z)}function v(){for(var P="";t[a]>="0"&&t[a]<="9";)P+=E();if(P.length)return P;z(),x()}function k(P,Z){S(P,Z,b())}function S(P,Z,tA){i[P]=i[P]||{},i[P][Z]=tA}function b(){return{line:n,column:o,pos:a}}function x(){throw new SyntaxError("Unexpected token "+t[a]+" in JSON at position "+a)}function F(){f(),x()}function z(){if(a>=t.length)throw new SyntaxError("Unexpected end of JSON input")}};f9.stringify=function(t,e,A){if(!t8(t))return;var i=0,n,o,a=typeof A=="object"?A.space:A;switch(typeof a){case"number":var r=a>10?10:a<0?0:Math.floor(a);a=r&&S(r," "),n=r,o=r;break;case"string":a=a.slice(0,10),n=0,o=0;for(var s=0;s=0}var W0A=/"|\\/g,Z0A=/[\b]/g,X0A=/\f/g,$0A=/\n/g,ACA=/\r/g,eCA=/\t/g;function i8(t){return t=t.replace(W0A,"\\$&").replace(X0A,"\\f").replace(Z0A,"\\b").replace($0A,"\\n").replace(ACA,"\\r").replace(eCA,"\\t"),'"'+t+'"'}var tCA=/~/g,iCA=/\//g;function u9(t){return t.replace(tCA,"~0").replace(iCA,"~1")}});var Rz=G3((rBe,_z)=>{"use strict";var xz=function(t,e){var A,i,n=1,o=0,a=0,r=String.alphabet;function s(l,g,C){if(C){for(A=g;C=s(l,A),C<76&&C>65;)++A;return+l.slice(g-1,A)}return C=r&&r.indexOf(l.charAt(g)),C>-1?C+76:(C=l.charCodeAt(g)||0,C<45||C>127?C:C<46?65:C<48?C-1:C<58?C+18:C<65?C-11:C<91?C+11:C<97?C-37:C<123?C+5:C-63)}if((t+="")!=(e+="")){for(;n;)if(i=s(t,o++),n=s(e,a++),i<76&&n<76&&i>66&&n>66&&(i=s(t,o,o),n=s(e,a,o=A),a=A),i!=n)return i{"use strict";(function(t){"use strict";function e(j){return j!==null?Object.prototype.toString.call(j)==="[object Array]":!1}function A(j){return j!==null?Object.prototype.toString.call(j)==="[object Object]":!1}function i(j,$){if(j===$)return!0;var oA=Object.prototype.toString.call(j);if(oA!==Object.prototype.toString.call($))return!1;if(e(j)===!0){if(j.length!==$.length)return!1;for(var sA=0;sA",9:"Array"},k="EOF",S="UnquotedIdentifier",b="QuotedIdentifier",x="Rbracket",F="Rparen",z="Comma",P="Colon",Z="Rbrace",tA="Number",W="Current",BA="Expref",X="Pipe",iA="Or",AA="And",IA="EQ",aA="GT",rA="LT",uA="GTE",UA="LTE",$A="NE",zA="Flatten",pA="Star",PA="Filter",Je="Dot",_e="Not",YA="Lbrace",fA="Lbracket",XA="Lparen",DA="Literal",ee={".":Je,"*":pA,",":z,":":P,"{":YA,"}":Z,"]":x,"(":XA,")":F,"@":W},NA={"<":!0,">":!0,"=":!0,"!":!0},ke={" ":!0," ":!0,"\n":!0};function HA(j){return j>="a"&&j<="z"||j>="A"&&j<="Z"||j==="_"}function vA(j){return j>="0"&&j<="9"||j==="-"}function Gt(j){return j>="a"&&j<="z"||j>="A"&&j<="Z"||j>="0"&&j<="9"||j==="_"}function ft(){}ft.prototype={tokenize:function(j){var $=[];this._current=0;for(var oA,sA,TA;this._current")return j[this._current]==="="?(this._current++,{type:uA,value:">=",start:$}):{type:aA,value:">",start:$};if(oA==="="&&j[this._current]==="=")return this._current++,{type:IA,value:"==",start:$}},_consumeLiteral:function(j){this._current++;for(var $=this._current,oA=j.length,sA;j[this._current]!=="`"&&this._current=0)return!0;if(oA.indexOf(j)>=0)return!0;if(sA.indexOf(j[0])>=0)try{return JSON.parse(j),!0}catch(TA){return!1}else return!1}};var he={};he[k]=0,he[S]=0,he[b]=0,he[x]=0,he[F]=0,he[z]=0,he[Z]=0,he[tA]=0,he[W]=0,he[BA]=0,he[X]=1,he[iA]=2,he[AA]=3,he[IA]=5,he[aA]=5,he[rA]=5,he[uA]=5,he[UA]=5,he[$A]=5,he[zA]=9,he[pA]=20,he[PA]=21,he[Je]=40,he[_e]=45,he[YA]=50,he[fA]=55,he[XA]=60;function Ot(){}Ot.prototype={parse:function(j){this._loadTokens(j),this.index=0;var $=this.expression(0);if(this._lookahead(0)!==k){var oA=this._lookaheadToken(0),sA=new Error("Unexpected token type: "+oA.type+", value: "+oA.value);throw sA.name="ParserError",sA}return $},_loadTokens:function(j){var $=new ft,oA=$.tokenize(j);oA.push({type:k,value:"",start:j.length}),this.tokens=oA},expression:function(j){var $=this._lookaheadToken(0);this._advance();for(var oA=this.nud($),sA=this._lookahead(0);j=0)return this.expression(j);if($===fA)return this._match(fA),this._parseMultiselectList();if($===YA)return this._match(YA),this._parseMultiselectHash()},_parseProjectionRHS:function(j){var $;if(he[this._lookahead(0)]<10)$={type:"Identity"};else if(this._lookahead(0)===fA)$=this.expression(j);else if(this._lookahead(0)===PA)$=this.expression(j);else if(this._lookahead(0)===Je)this._match(Je),$=this._parseDotRHS(j);else{var oA=this._lookaheadToken(0),sA=new Error("Sytanx error, unexpected token: "+oA.value+"("+oA.type+")");throw sA.name="ParserError",sA}return $},_parseMultiselectList:function(){for(var j=[];this._lookahead(0)!==x;){var $=this.expression(0);if(j.push($),this._lookahead(0)===z&&(this._match(z),this._lookahead(0)===x))throw new Error("Unexpected token Rbracket")}return this._match(x),{type:"MultiSelectList",children:j}},_parseMultiselectHash:function(){for(var j=[],$=[S,b],oA,sA,TA,de;;){if(oA=this._lookaheadToken(0),$.indexOf(oA.type)<0)throw new Error("Expecting an identifier token, got: "+oA.type);if(sA=oA.value,this._advance(),this._match(P),TA=this.expression(0),de={type:"KeyValuePair",name:sA,value:TA},j.push(de),this._lookahead(0)===z)this._match(z);else if(this._lookahead(0)===Z){this._match(Z);break}}return{type:"MultiSelectHash",children:j}}};function He(j){this.runtime=j}He.prototype={search:function(j,$){return this.visit(j,$)},visit:function(j,$){var oA,sA,TA,de,Qe,GA,OA,ht,tt,ze;switch(j.type){case"Field":return $!==null&&A($)?(GA=$[j.name],GA===void 0?null:GA):null;case"Subexpression":for(TA=this.visit(j.children[0],$),ze=1;ze0)for(ze=hn;zeKe;ze+=nn)TA.push($[ze]);return TA;case"Projection":var Si=this.visit(j.children[0],$);if(!e(Si))return null;for(tt=[],ze=0;zeQe;break;case uA:TA=de>=Qe;break;case rA:TA=de=j&&($=oA<0?j-1:j),$}};function je(j){this._interpreter=j,this.functionTable={abs:{_func:this._functionAbs,_signature:[{types:[s]}]},avg:{_func:this._functionAvg,_signature:[{types:[f]}]},ceil:{_func:this._functionCeil,_signature:[{types:[s]}]},contains:{_func:this._functionContains,_signature:[{types:[g,C]},{types:[l]}]},ends_with:{_func:this._functionEndsWith,_signature:[{types:[g]},{types:[g]}]},floor:{_func:this._functionFloor,_signature:[{types:[s]}]},length:{_func:this._functionLength,_signature:[{types:[g,C,I]}]},map:{_func:this._functionMap,_signature:[{types:[h]},{types:[C]}]},max:{_func:this._functionMax,_signature:[{types:[f,m]}]},merge:{_func:this._functionMerge,_signature:[{types:[I],variadic:!0}]},max_by:{_func:this._functionMaxBy,_signature:[{types:[C]},{types:[h]}]},sum:{_func:this._functionSum,_signature:[{types:[f]}]},starts_with:{_func:this._functionStartsWith,_signature:[{types:[g]},{types:[g]}]},min:{_func:this._functionMin,_signature:[{types:[f,m]}]},min_by:{_func:this._functionMinBy,_signature:[{types:[C]},{types:[h]}]},type:{_func:this._functionType,_signature:[{types:[l]}]},keys:{_func:this._functionKeys,_signature:[{types:[I]}]},values:{_func:this._functionValues,_signature:[{types:[I]}]},sort:{_func:this._functionSort,_signature:[{types:[m,f]}]},sort_by:{_func:this._functionSortBy,_signature:[{types:[C]},{types:[h]}]},join:{_func:this._functionJoin,_signature:[{types:[g]},{types:[m]}]},reverse:{_func:this._functionReverse,_signature:[{types:[g,C]}]},to_array:{_func:this._functionToArray,_signature:[{types:[l]}]},to_string:{_func:this._functionToString,_signature:[{types:[l]}]},to_number:{_func:this._functionToNumber,_signature:[{types:[l]}]},not_null:{_func:this._functionNotNull,_signature:[{types:[l],variadic:!0}]}}}je.prototype={callFunction:function(j,$){var oA=this.functionTable[j];if(oA===void 0)throw new Error("Unknown function: "+j+"()");return this._validateArgs(j,$,oA._signature),oA._func.call(this,$)},_validateArgs:function(j,$,oA){var sA;if(oA[oA.length-1].variadic){if($.length=0;TA--)sA+=oA[TA];return sA}else{var de=j[0].slice(0);return de.reverse(),de}},_functionAbs:function(j){return Math.abs(j[0])},_functionCeil:function(j){return Math.ceil(j[0])},_functionAvg:function(j){for(var $=0,oA=j[0],sA=0;sA=0},_functionFloor:function(j){return Math.floor(j[0])},_functionLength:function(j){return A(j[0])?Object.keys(j[0]).length:j[0].length},_functionMap:function(j){for(var $=[],oA=this._interpreter,sA=j[0],TA=j[1],de=0;de0){var $=this._getTypeName(j[0][0]);if($===s)return Math.max.apply(Math,j[0]);for(var oA=j[0],sA=oA[0],TA=1;TA0){var $=this._getTypeName(j[0][0]);if($===s)return Math.min.apply(Math,j[0]);for(var oA=j[0],sA=oA[0],TA=1;TAOe?1:zeTA&&(TA=Qe,de=oA[GA]);return de},_functionMinBy:function(j){for(var $=j[1],oA=j[0],sA=this.createKeyFunction($,[s,g]),TA=1/0,de,Qe,GA=0;GA"u"?H8.jmespath={}:H8)});var ktA=G3((Xwe,Yy)=>{"use strict";var hSA=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};var kt=(function(t){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,A=0,i={},n={manual:t.Prism&&t.Prism.manual,disableWorkerMessageHandler:t.Prism&&t.Prism.disableWorkerMessageHandler,util:{encode:function E(f){return f instanceof o?new o(f.type,E(f.content),f.alias):Array.isArray(f)?f.map(E):f.replace(/&/g,"&").replace(/"u")return null;if(document.currentScript&&document.currentScript.tagName==="SCRIPT")return document.currentScript;try{throw new Error}catch(v){var E=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(v.stack)||[])[1];if(E){var f=document.getElementsByTagName("script");for(var m in f)if(f[m].src==E)return f[m]}return null}},isActive:function(E,f,m){for(var v="no-"+f;E;){var k=E.classList;if(k.contains(f))return!0;if(k.contains(v))return!1;E=E.parentElement}return!!m}},languages:{plain:i,plaintext:i,text:i,txt:i,extend:function(E,f){var m=n.util.clone(n.languages[E]);for(var v in f)m[v]=f[v];return m},insertBefore:function(E,f,m,v){v=v||n.languages;var k=v[E],S={};for(var b in k)if(k.hasOwnProperty(b)){if(b==f)for(var x in m)m.hasOwnProperty(x)&&(S[x]=m[x]);m.hasOwnProperty(b)||(S[b]=k[b])}var F=v[E];return v[E]=S,n.languages.DFS(n.languages,function(z,P){P===F&&z!=E&&(this[z]=S)}),S},DFS:function E(f,m,v,k){k=k||{};var S=n.util.objId;for(var b in f)if(f.hasOwnProperty(b)){m.call(f,b,f[b],v||b);var x=f[b],F=n.util.type(x);F==="Object"&&!k[S(x)]?(k[S(x)]=!0,E(x,m,null,k)):F==="Array"&&!k[S(x)]&&(k[S(x)]=!0,E(x,m,b,k))}}},plugins:{},highlightAll:function(E,f){n.highlightAllUnder(document,E,f)},highlightAllUnder:function(E,f,m){var v={callback:m,container:E,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};n.hooks.run("before-highlightall",v),v.elements=Array.prototype.slice.apply(v.container.querySelectorAll(v.selector)),n.hooks.run("before-all-elements-highlight",v);for(var k=0,S;S=v.elements[k++];)n.highlightElement(S,f===!0,v.callback)},highlightElement:function(E,f,m){var v=n.util.getLanguage(E),k=n.languages[v];n.util.setLanguage(E,v);var S=E.parentElement;S&&S.nodeName.toLowerCase()==="pre"&&n.util.setLanguage(S,v);var b=E.textContent,x={element:E,language:v,grammar:k,code:b};function F(P){x.highlightedCode=P,n.hooks.run("before-insert",x),x.element.innerHTML=x.highlightedCode,n.hooks.run("after-highlight",x),n.hooks.run("complete",x),m&&m.call(x.element)}if(n.hooks.run("before-sanity-check",x),S=x.element.parentElement,S&&S.nodeName.toLowerCase()==="pre"&&!S.hasAttribute("tabindex")&&S.setAttribute("tabindex","0"),!x.code){n.hooks.run("complete",x),m&&m.call(x.element);return}if(n.hooks.run("before-highlight",x),!x.grammar){F(n.util.encode(x.code));return}if(f&&t.Worker){var z=new Worker(n.filename);z.onmessage=function(P){F(P.data)},z.postMessage(JSON.stringify({language:x.language,code:x.code,immediateClose:!0}))}else F(n.highlight(x.code,x.grammar,x.language))},highlight:function(E,f,m){var v={code:E,grammar:f,language:m};if(n.hooks.run("before-tokenize",v),!v.grammar)throw new Error('The language "'+v.language+'" has no grammar.');return v.tokens=n.tokenize(v.code,v.grammar),n.hooks.run("after-tokenize",v),o.stringify(n.util.encode(v.tokens),v.language)},tokenize:function(E,f){var m=f.rest;if(m){for(var v in m)f[v]=m[v];delete f.rest}var k=new s;return l(k,k.head,E),r(E,k,f,k.head,0),C(k)},hooks:{all:{},add:function(E,f){var m=n.hooks.all;m[E]=m[E]||[],m[E].push(f)},run:function(E,f){var m=n.hooks.all[E];if(!(!m||!m.length))for(var v=0,k;k=m[v++];)k(f)}},Token:o};t.Prism=n;function o(E,f,m,v){this.type=E,this.content=f,this.alias=m,this.length=(v||"").length|0}o.stringify=function E(f,m){if(typeof f=="string")return f;if(Array.isArray(f)){var v="";return f.forEach(function(F){v+=E(F,m)}),v}var k={type:f.type,content:E(f.content,m),tag:"span",classes:["token",f.type],attributes:{},language:m},S=f.alias;S&&(Array.isArray(S)?Array.prototype.push.apply(k.classes,S):k.classes.push(S)),n.hooks.run("wrap",k);var b="";for(var x in k.attributes)b+=" "+x+'="'+(k.attributes[x]||"").replace(/"/g,""")+'"';return"<"+k.tag+' class="'+k.classes.join(" ")+'"'+b+">"+k.content+""};function a(E,f,m,v){E.lastIndex=f;var k=E.exec(m);if(k&&v&&k[1]){var S=k[1].length;k.index+=S,k[0]=k[0].slice(S)}return k}function r(E,f,m,v,k,S){for(var b in m)if(!(!m.hasOwnProperty(b)||!m[b])){var x=m[b];x=Array.isArray(x)?x:[x];for(var F=0;F=S.reach);AA+=iA.value.length,iA=iA.next){var IA=iA.value;if(f.length>E.length)return;if(!(IA instanceof o)){var aA=1,rA;if(tA){if(rA=a(X,AA,E,Z),!rA||rA.index>=E.length)break;var zA=rA.index,uA=rA.index+rA[0].length,UA=AA;for(UA+=iA.value.length;zA>=UA;)iA=iA.next,UA+=iA.value.length;if(UA-=iA.value.length,AA=UA,iA.value instanceof o)continue;for(var $A=iA;$A!==f.tail&&(UAS.reach&&(S.reach=_e);var YA=iA.prev;PA&&(YA=l(f,YA,PA),AA+=PA.length),g(f,YA,aA);var fA=new o(b,P?n.tokenize(pA,P):pA,W,pA);if(iA=l(f,YA,fA),Je&&l(f,iA,Je),aA>1){var XA={cause:b+","+F,reach:_e};r(E,f,m,iA.prev,AA,XA),S&&XA.reach>S.reach&&(S.reach=XA.reach)}}}}}}function s(){var E={value:null,prev:null,next:null},f={value:null,prev:E,next:null};E.next=f,this.head=E,this.tail=f,this.length=0}function l(E,f,m){var v=f.next,k={value:m,prev:f,next:v};return f.next=k,v.prev=k,E.length++,k}function g(E,f,m){for(var v=f.next,k=0;k/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]};kt.languages.markup.tag.inside["attr-value"].inside.entity=kt.languages.markup.entity;kt.languages.markup.doctype.inside["internal-subset"].inside=kt.languages.markup;kt.hooks.add("wrap",function(t){t.type==="entity"&&(t.attributes.title=t.content.replace(/&/,"&"))});Object.defineProperty(kt.languages.markup.tag,"addInlined",{value:function(e,A){var i={};i["language-"+A]={pattern:/(^$)/i,lookbehind:!0,inside:kt.languages[A]},i.cdata=/^$/i;var n={"included-cdata":{pattern://i,inside:i}};n["language-"+A]={pattern:/[\s\S]+/,inside:kt.languages[A]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:n},kt.languages.insertBefore("markup","cdata",o)}});Object.defineProperty(kt.languages.markup.tag,"addAttribute",{value:function(t,e){kt.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+t+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:kt.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}});kt.languages.html=kt.languages.markup;kt.languages.mathml=kt.languages.markup;kt.languages.svg=kt.languages.markup;kt.languages.xml=kt.languages.extend("markup",{});kt.languages.ssml=kt.languages.xml;kt.languages.atom=kt.languages.xml;kt.languages.rss=kt.languages.xml;(function(t){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;t.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},t.languages.css.atrule.inside.rest=t.languages.css;var A=t.languages.markup;A&&(A.tag.addInlined("style","css"),A.tag.addAttribute("style","css"))})(kt);kt.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};kt.languages.javascript=kt.languages.extend("clike",{"class-name":[kt.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});kt.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;kt.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:kt.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:kt.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:kt.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:kt.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:kt.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});kt.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:kt.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});kt.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});kt.languages.markup&&(kt.languages.markup.tag.addInlined("script","javascript"),kt.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));kt.languages.js=kt.languages.javascript;(function(){if(typeof kt>"u"||typeof document>"u")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var t="Loading\u2026",e=function(I,d){return"\u2716 Error "+I+" while fetching file: "+d},A="\u2716 Error: File does not exist or is empty",i={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},n="data-src-status",o="loading",a="loaded",r="failed",s="pre[data-src]:not(["+n+'="'+a+'"]):not(['+n+'="'+o+'"])';function l(I,d,h){var E=new XMLHttpRequest;E.open("GET",I,!0),E.onreadystatechange=function(){E.readyState==4&&(E.status<400&&E.responseText?d(E.responseText):E.status>=400?h(e(E.status,E.statusText)):h(A))},E.send(null)}function g(I){var d=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(I||"");if(d){var h=Number(d[1]),E=d[2],f=d[3];return E?f?[h,Number(f)]:[h,void 0]:[h,h]}}kt.hooks.add("before-highlightall",function(I){I.selector+=", "+s}),kt.hooks.add("before-sanity-check",function(I){var d=I.element;if(d.matches(s)){I.code="",d.setAttribute(n,o);var h=d.appendChild(document.createElement("CODE"));h.textContent=t;var E=d.getAttribute("data-src"),f=I.language;if(f==="none"){var m=(/\.(\w+)$/.exec(E)||[,"none"])[1];f=i[m]||m}kt.util.setLanguage(h,f),kt.util.setLanguage(d,f);var v=kt.plugins.autoloader;v&&v.loadLanguages(f),l(E,function(k){d.setAttribute(n,a);var S=g(d.getAttribute("data-range"));if(S){var b=k.split(/\r\n?|\n/g),x=S[0],F=S[1]==null?b.length:S[1];x<0&&(x+=b.length),x=Math.max(0,Math.min(x-1,b.length)),F<0&&(F+=b.length),F=Math.max(0,Math.min(F,b.length)),k=b.slice(x,F).join(` +`),d.hasAttribute("data-start")||d.setAttribute("data-start",String(x+1))}h.textContent=k,kt.highlightElement(h)},function(k){d.setAttribute(n,r),h.textContent=k})}}),kt.plugins.fileHighlight={highlight:function(d){for(var h=(d||document).querySelectorAll(s),E=0,f;f=h[E++];)kt.highlightElement(f)}};var C=!1;kt.fileHighlight=function(){C||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),C=!0),kt.plugins.fileHighlight.highlight.apply(this,arguments)}})()});var wL=(()=>{class t{_renderer;_elementRef;onChange=A=>{};onTouched=()=>{};constructor(A,i){this._renderer=A,this._elementRef=i}setProperty(A,i){this._renderer.setProperty(this._elementRef.nativeElement,A,i)}registerOnTouched(A){this.onTouched=A}registerOnChange(A){this.onChange=A}setDisabledState(A){this.setProperty("disabled",A)}static \u0275fac=function(i){return new(i||t)(ct(Pi),ct(ce))};static \u0275dir=VA({type:t})}return t})(),ab=(()=>{class t extends wL{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,features:[mt]})}return t})(),as=new kA(""),LiA={provide:as,useExisting:Ja(()=>rb),multi:!0},rb=(()=>{class t extends ab{writeValue(A){this.setProperty("checked",A)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["input","type","checkbox","formControlName",""],["input","type","checkbox","formControl",""],["input","type","checkbox","ngModel",""]],hostBindings:function(i,n){i&1&&U("change",function(a){return n.onChange(a.target.checked)})("blur",function(){return n.onTouched()})},standalone:!1,features:[Bt([LiA]),mt]})}return t})(),GiA={provide:as,useExisting:Ja(()=>Dn),multi:!0};function KiA(){let t=Ab()?Ab().getUserAgent():"";return/android (\d+)/.test(t.toLowerCase())}var UiA=new kA(""),Dn=(()=>{class t extends wL{_compositionMode;_composing=!1;constructor(A,i,n){super(A,i),this._compositionMode=n,this._compositionMode==null&&(this._compositionMode=!KiA())}writeValue(A){let i=A??"";this.setProperty("value",i)}_handleInput(A){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(A)}_compositionStart(){this._composing=!0}_compositionEnd(A){this._composing=!1,this._compositionMode&&this.onChange(A)}static \u0275fac=function(i){return new(i||t)(ct(Pi),ct(ce),ct(UiA,8))};static \u0275dir=VA({type:t,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(i,n){i&1&&U("input",function(a){return n._handleInput(a.target.value)})("blur",function(){return n.onTouched()})("compositionstart",function(){return n._compositionStart()})("compositionend",function(a){return n._compositionEnd(a.target.value)})},standalone:!1,features:[Bt([GiA]),mt]})}return t})();function sb(t){return t==null||lb(t)===0}function lb(t){return t==null?null:Array.isArray(t)||typeof t=="string"?t.length:t instanceof Set?t.size:null}var Oc=new kA(""),OQ=new kA(""),TiA=/^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,Ys=class{static min(e){return DL(e)}static max(e){return JiA(e)}static required(e){return OiA(e)}static requiredTrue(e){return YiA(e)}static email(e){return HiA(e)}static minLength(e){return ziA(e)}static maxLength(e){return PiA(e)}static pattern(e){return jiA(e)}static nullValidator(e){return op()}static compose(e){return kL(e)}static composeAsync(e){return xL(e)}};function DL(t){return e=>{if(e.value==null||t==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A{if(e.value==null||t==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A>t?{max:{max:t,actual:e.value}}:null}}function OiA(t){return sb(t.value)?{required:!0}:null}function YiA(t){return t.value===!0?null:{required:!0}}function HiA(t){return sb(t.value)||TiA.test(t.value)?null:{email:!0}}function ziA(t){return e=>{let A=e.value?.length??lb(e.value);return A===null||A===0?null:A{let A=e.value?.length??lb(e.value);return A!==null&&A>t?{maxlength:{requiredLength:t,actualLength:A}}:null}}function jiA(t){if(!t)return op;let e,A;return typeof t=="string"?(A="",t.charAt(0)!=="^"&&(A+="^"),A+=t,t.charAt(t.length-1)!=="$"&&(A+="$"),e=new RegExp(A)):(A=t.toString(),e=t),i=>{if(sb(i.value))return null;let n=i.value;return e.test(n)?null:{pattern:{requiredPattern:A,actualValue:n}}}}function op(t){return null}function yL(t){return t!=null}function vL(t){return $3(t)?Lr(t):t}function bL(t){let e={};return t.forEach(A=>{e=A!=null?gA(gA({},e),A):e}),Object.keys(e).length===0?null:e}function ML(t,e){return e.map(A=>A(t))}function qiA(t){return!t.validate}function SL(t){return t.map(e=>qiA(e)?e:A=>e.validate(A))}function kL(t){if(!t)return null;let e=t.filter(yL);return e.length==0?null:function(A){return bL(ML(A,e))}}function gb(t){return t!=null?kL(SL(t)):null}function xL(t){if(!t)return null;let e=t.filter(yL);return e.length==0?null:function(A){let i=ML(A,e).map(vL);return qC(i).pipe(we(bL))}}function cb(t){return t!=null?xL(SL(t)):null}function EL(t,e){return t===null?[e]:Array.isArray(t)?[...t,e]:[t,e]}function _L(t){return t._rawValidators}function RL(t){return t._rawAsyncValidators}function ib(t){return t?Array.isArray(t)?t:[t]:[]}function ap(t,e){return Array.isArray(t)?t.includes(e):t===e}function hL(t,e){let A=ib(e);return ib(t).forEach(n=>{ap(A,n)||A.push(n)}),A}function QL(t,e){return ib(e).filter(A=>!ap(t,A))}var rp=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(e){this._rawValidators=e||[],this._composedValidatorFn=gb(this._rawValidators)}_setAsyncValidators(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=cb(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(e){this._onDestroyCallbacks.push(e)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(e=>e()),this._onDestroyCallbacks=[]}reset(e=void 0){this.control?.reset(e)}hasError(e,A){return this.control?this.control.hasError(e,A):!1}getError(e,A){return this.control?this.control.getError(e,A):null}},Y0=class extends rp{name;get formDirective(){return null}get path(){return null}},Hs=class extends rp{_parent=null;name=null;valueAccessor=null},sp=class{_cd;constructor(e){this._cd=e}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}};var yn=(()=>{class t extends sp{constructor(A){super(A)}static \u0275fac=function(i){return new(i||t)(ct(Hs,2))};static \u0275dir=VA({type:t,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(i,n){i&2&&RA("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)},standalone:!1,features:[mt]})}return t})(),NL=(()=>{class t extends sp{constructor(A){super(A)}static \u0275fac=function(i){return new(i||t)(ct(Y0,10))};static \u0275dir=VA({type:t,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["","formArray",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(i,n){i&2&&RA("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)("ng-submitted",n.isSubmitted)},standalone:!1,features:[mt]})}return t})();var FQ="VALID",np="INVALID",Wd="PENDING",LQ="DISABLED",t2=class{},lp=class extends t2{value;source;constructor(e,A){super(),this.value=e,this.source=A}},KQ=class extends t2{pristine;source;constructor(e,A){super(),this.pristine=e,this.source=A}},UQ=class extends t2{touched;source;constructor(e,A){super(),this.touched=e,this.source=A}},Zd=class extends t2{status;source;constructor(e,A){super(),this.status=e,this.source=A}},gp=class extends t2{source;constructor(e){super(),this.source=e}},TQ=class extends t2{source;constructor(e){super(),this.source=e}};function Cb(t){return(dp(t)?t.validators:t)||null}function ViA(t){return Array.isArray(t)?gb(t):t||null}function Ib(t,e){return(dp(e)?e.asyncValidators:t)||null}function WiA(t){return Array.isArray(t)?cb(t):t||null}function dp(t){return t!=null&&!Array.isArray(t)&&typeof t=="object"}function FL(t,e,A){let i=t.controls;if(!(e?Object.keys(i):i).length)throw new Mt(1e3,"");if(!i[A])throw new Mt(1001,"")}function LL(t,e,A){t._forEachChild((i,n)=>{if(A[n]===void 0)throw new Mt(1002,"")})}var Xd=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(e,A){this._assignValidators(e),this._assignAsyncValidators(A)}get validator(){return this._composedValidatorFn}set validator(e){this._rawValidators=this._composedValidatorFn=e}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}get parent(){return this._parent}get status(){return ca(this.statusReactive)}set status(e){ca(()=>this.statusReactive.set(e))}_status=pe(()=>this.statusReactive());statusReactive=bA(void 0);get valid(){return this.status===FQ}get invalid(){return this.status===np}get pending(){return this.status==Wd}get disabled(){return this.status===LQ}get enabled(){return this.status!==LQ}errors;get pristine(){return ca(this.pristineReactive)}set pristine(e){ca(()=>this.pristineReactive.set(e))}_pristine=pe(()=>this.pristineReactive());pristineReactive=bA(!0);get dirty(){return!this.pristine}get touched(){return ca(this.touchedReactive)}set touched(e){ca(()=>this.touchedReactive.set(e))}_touched=pe(()=>this.touchedReactive());touchedReactive=bA(!1);get untouched(){return!this.touched}_events=new ie;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(e){this._assignValidators(e)}setAsyncValidators(e){this._assignAsyncValidators(e)}addValidators(e){this.setValidators(hL(e,this._rawValidators))}addAsyncValidators(e){this.setAsyncValidators(hL(e,this._rawAsyncValidators))}removeValidators(e){this.setValidators(QL(e,this._rawValidators))}removeAsyncValidators(e){this.setAsyncValidators(QL(e,this._rawAsyncValidators))}hasValidator(e){return ap(this._rawValidators,e)}hasAsyncValidator(e){return ap(this._rawAsyncValidators,e)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(e={}){let A=this.touched===!1;this.touched=!0;let i=e.sourceControl??this;e.onlySelf||this._parent?.markAsTouched(Ye(gA({},e),{sourceControl:i})),A&&e.emitEvent!==!1&&this._events.next(new UQ(!0,i))}markAllAsDirty(e={}){this.markAsDirty({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsDirty(e))}markAllAsTouched(e={}){this.markAsTouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsTouched(e))}markAsUntouched(e={}){let A=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let i=e.sourceControl??this;this._forEachChild(n=>{n.markAsUntouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:i})}),e.onlySelf||this._parent?._updateTouched(e,i),A&&e.emitEvent!==!1&&this._events.next(new UQ(!1,i))}markAsDirty(e={}){let A=this.pristine===!0;this.pristine=!1;let i=e.sourceControl??this;e.onlySelf||this._parent?.markAsDirty(Ye(gA({},e),{sourceControl:i})),A&&e.emitEvent!==!1&&this._events.next(new KQ(!1,i))}markAsPristine(e={}){let A=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let i=e.sourceControl??this;this._forEachChild(n=>{n.markAsPristine({onlySelf:!0,emitEvent:e.emitEvent})}),e.onlySelf||this._parent?._updatePristine(e,i),A&&e.emitEvent!==!1&&this._events.next(new KQ(!0,i))}markAsPending(e={}){this.status=Wd;let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new Zd(this.status,A)),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.markAsPending(Ye(gA({},e),{sourceControl:A}))}disable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=LQ,this.errors=null,this._forEachChild(n=>{n.disable(Ye(gA({},e),{onlySelf:!0}))}),this._updateValue();let i=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new lp(this.value,i)),this._events.next(new Zd(this.status,i)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Ye(gA({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(n=>n(!0))}enable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=FQ,this._forEachChild(i=>{i.enable(Ye(gA({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(Ye(gA({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(e,A){e.onlySelf||(this._parent?.updateValueAndValidity(e),e.skipPristineCheck||this._parent?._updatePristine({},A),this._parent?._updateTouched({},A))}setParent(e){this._parent=e}getRawValue(){return this.value}updateValueAndValidity(e={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let i=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===FQ||this.status===Wd)&&this._runAsyncValidator(i,e.emitEvent)}let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new lp(this.value,A)),this._events.next(new Zd(this.status,A)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.updateValueAndValidity(Ye(gA({},e),{sourceControl:A}))}_updateTreeValidity(e={emitEvent:!0}){this._forEachChild(A=>A._updateTreeValidity(e)),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?LQ:FQ}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(e,A){if(this.asyncValidator){this.status=Wd,this._hasOwnPendingAsyncValidator={emitEvent:A!==!1,shouldHaveEmitted:e!==!1};let i=vL(this.asyncValidator(this));this._asyncValidationSubscription=i.subscribe(n=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(n,{emitEvent:A,shouldHaveEmitted:e})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let e=(this._hasOwnPendingAsyncValidator?.emitEvent||this._hasOwnPendingAsyncValidator?.shouldHaveEmitted)??!1;return this._hasOwnPendingAsyncValidator=null,e}return!1}setErrors(e,A={}){this.errors=e,this._updateControlsErrors(A.emitEvent!==!1,this,A.shouldHaveEmitted)}get(e){let A=e;return A==null||(Array.isArray(A)||(A=A.split(".")),A.length===0)?null:A.reduce((i,n)=>i&&i._find(n),this)}getError(e,A){let i=A?this.get(A):this;return i?.errors?i.errors[e]:null}hasError(e,A){return!!this.getError(e,A)}get root(){let e=this;for(;e._parent;)e=e._parent;return e}_updateControlsErrors(e,A,i){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),(e||i)&&this._events.next(new Zd(this.status,A)),this._parent&&this._parent._updateControlsErrors(e,A,i)}_initObservables(){this.valueChanges=new LA,this.statusChanges=new LA}_calculateStatus(){return this._allControlsDisabled()?LQ:this.errors?np:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(Wd)?Wd:this._anyControlsHaveStatus(np)?np:FQ}_anyControlsHaveStatus(e){return this._anyControls(A=>A.status===e)}_anyControlsDirty(){return this._anyControls(e=>e.dirty)}_anyControlsTouched(){return this._anyControls(e=>e.touched)}_updatePristine(e,A){let i=!this._anyControlsDirty(),n=this.pristine!==i;this.pristine=i,e.onlySelf||this._parent?._updatePristine(e,A),n&&this._events.next(new KQ(this.pristine,A))}_updateTouched(e={},A){this.touched=this._anyControlsTouched(),this._events.next(new UQ(this.touched,A)),e.onlySelf||this._parent?._updateTouched(e,A)}_onDisabledChange=[];_registerOnCollectionChange(e){this._onCollectionChange=e}_setUpdateStrategy(e){dp(e)&&e.updateOn!=null&&(this._updateOn=e.updateOn)}_parentMarkedDirty(e){return!e&&!!this._parent?.dirty&&!this._parent._anyControlsDirty()}_find(e){return null}_assignValidators(e){this._rawValidators=Array.isArray(e)?e.slice():e,this._composedValidatorFn=ViA(this._rawValidators)}_assignAsyncValidators(e){this._rawAsyncValidators=Array.isArray(e)?e.slice():e,this._composedAsyncValidatorFn=WiA(this._rawAsyncValidators)}},$d=class extends Xd{constructor(e,A,i){super(Cb(A),Ib(i,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;registerControl(e,A){return this.controls[e]?this.controls[e]:(this.controls[e]=A,A.setParent(this),A._registerOnCollectionChange(this._onCollectionChange),A)}addControl(e,A,i={}){this.registerControl(e,A),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}removeControl(e,A={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}setControl(e,A,i={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],A&&this.registerControl(e,A),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}contains(e){return this.controls.hasOwnProperty(e)&&this.controls[e].enabled}setValue(e,A={}){LL(this,!0,e),Object.keys(e).forEach(i=>{FL(this,!0,i),this.controls[i].setValue(e[i],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(Object.keys(e).forEach(i=>{let n=this.controls[i];n&&n.patchValue(e[i],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e={},A={}){this._forEachChild((i,n)=>{i.reset(e?e[n]:null,Ye(gA({},A),{onlySelf:!0}))}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A),A?.emitEvent!==!1&&this._events.next(new TQ(this))}getRawValue(){return this._reduceChildren({},(e,A,i)=>(e[i]=A.getRawValue(),e))}_syncPendingControls(){let e=this._reduceChildren(!1,(A,i)=>i._syncPendingControls()?!0:A);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){Object.keys(this.controls).forEach(A=>{let i=this.controls[A];i&&e(i,A)})}_setUpControls(){this._forEachChild(e=>{e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(e){for(let[A,i]of Object.entries(this.controls))if(this.contains(A)&&e(i))return!0;return!1}_reduceValue(){let e={};return this._reduceChildren(e,(A,i,n)=>((i.enabled||this.disabled)&&(A[n]=i.value),A))}_reduceChildren(e,A){let i=e;return this._forEachChild((n,o)=>{i=A(i,n,o)}),i}_allControlsDisabled(){for(let e of Object.keys(this.controls))if(this.controls[e].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_find(e){return this.controls.hasOwnProperty(e)?this.controls[e]:null}};var nb=class extends $d{};var AB=new kA("",{factory:()=>Bp}),Bp="always";function GL(t,e){return[...e.path,t]}function JQ(t,e,A=Bp){db(t,e),e.valueAccessor.writeValue(t.value),(t.disabled||A==="always")&&e.valueAccessor.setDisabledState?.(t.disabled),XiA(t,e),AnA(t,e),$iA(t,e),ZiA(t,e)}function cp(t,e,A=!0){let i=()=>{};e?.valueAccessor?.registerOnChange(i),e?.valueAccessor?.registerOnTouched(i),Ip(t,e),t&&(e._invokeOnDestroyCallbacks(),t._registerOnCollectionChange(()=>{}))}function Cp(t,e){t.forEach(A=>{A.registerOnValidatorChange&&A.registerOnValidatorChange(e)})}function ZiA(t,e){if(e.valueAccessor.setDisabledState){let A=i=>{e.valueAccessor.setDisabledState(i)};t.registerOnDisabledChange(A),e._registerOnDestroy(()=>{t._unregisterOnDisabledChange(A)})}}function db(t,e){let A=_L(t);e.validator!==null?t.setValidators(EL(A,e.validator)):typeof A=="function"&&t.setValidators([A]);let i=RL(t);e.asyncValidator!==null?t.setAsyncValidators(EL(i,e.asyncValidator)):typeof i=="function"&&t.setAsyncValidators([i]);let n=()=>t.updateValueAndValidity();Cp(e._rawValidators,n),Cp(e._rawAsyncValidators,n)}function Ip(t,e){let A=!1;if(t!==null){if(e.validator!==null){let n=_L(t);if(Array.isArray(n)&&n.length>0){let o=n.filter(a=>a!==e.validator);o.length!==n.length&&(A=!0,t.setValidators(o))}}if(e.asyncValidator!==null){let n=RL(t);if(Array.isArray(n)&&n.length>0){let o=n.filter(a=>a!==e.asyncValidator);o.length!==n.length&&(A=!0,t.setAsyncValidators(o))}}}let i=()=>{};return Cp(e._rawValidators,i),Cp(e._rawAsyncValidators,i),A}function XiA(t,e){e.valueAccessor.registerOnChange(A=>{t._pendingValue=A,t._pendingChange=!0,t._pendingDirty=!0,t.updateOn==="change"&&KL(t,e)})}function $iA(t,e){e.valueAccessor.registerOnTouched(()=>{t._pendingTouched=!0,t.updateOn==="blur"&&t._pendingChange&&KL(t,e),t.updateOn!=="submit"&&t.markAsTouched()})}function KL(t,e){t._pendingDirty&&t.markAsDirty(),t.setValue(t._pendingValue,{emitModelToViewChange:!1}),e.viewToModelUpdate(t._pendingValue),t._pendingChange=!1}function AnA(t,e){let A=(i,n)=>{e.valueAccessor.writeValue(i),n&&e.viewToModelUpdate(i)};t.registerOnChange(A),e._registerOnDestroy(()=>{t._unregisterOnChange(A)})}function UL(t,e){t==null,db(t,e)}function enA(t,e){return Ip(t,e)}function Bb(t,e){if(!t.hasOwnProperty("model"))return!1;let A=t.model;return A.isFirstChange()?!0:!Object.is(e,A.currentValue)}function tnA(t){return Object.getPrototypeOf(t.constructor)===ab}function TL(t,e){t._syncPendingControls(),e.forEach(A=>{let i=A.control;i.updateOn==="submit"&&i._pendingChange&&(A.viewToModelUpdate(i._pendingValue),i._pendingChange=!1)})}function Eb(t,e){if(!e)return null;Array.isArray(e);let A,i,n;return e.forEach(o=>{o.constructor===Dn?A=o:tnA(o)?i=o:n=o}),n||i||A||null}function inA(t,e){let A=t.indexOf(e);A>-1&&t.splice(A,1)}var nnA={provide:Y0,useExisting:Ja(()=>eB)},GQ=Promise.resolve(),eB=(()=>{class t extends Y0{callSetDisabledState;get submitted(){return ca(this.submittedReactive)}_submitted=pe(()=>this.submittedReactive());submittedReactive=bA(!1);_directives=new Set;form;ngSubmit=new LA;options;constructor(A,i,n){super(),this.callSetDisabledState=n,this.form=new $d({},gb(A),cb(i))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(A){GQ.then(()=>{let i=this._findContainer(A.path);A.control=i.registerControl(A.name,A.control),JQ(A.control,A,this.callSetDisabledState),A.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(A)})}getControl(A){return this.form.get(A.path)}removeControl(A){GQ.then(()=>{this._findContainer(A.path)?.removeControl(A.name),this._directives.delete(A)})}addFormGroup(A){GQ.then(()=>{let i=this._findContainer(A.path),n=new $d({});UL(n,A),i.registerControl(A.name,n),n.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(A){GQ.then(()=>{this._findContainer(A.path)?.removeControl?.(A.name)})}getFormGroup(A){return this.form.get(A.path)}updateModel(A,i){GQ.then(()=>{this.form.get(A.path).setValue(i)})}setValue(A){this.control.setValue(A)}onSubmit(A){return this.submittedReactive.set(!0),TL(this.form,this._directives),this.ngSubmit.emit(A),this.form._events.next(new gp(this.control)),A?.target?.method==="dialog"}onReset(){this.resetForm()}resetForm(A=void 0){this.form.reset(A),this.submittedReactive.set(!1)}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.form._updateOn=this.options.updateOn)}_findContainer(A){return A.pop(),A.length?this.form.get(A):this.form}static \u0275fac=function(i){return new(i||t)(ct(Oc,10),ct(OQ,10),ct(AB,8))};static \u0275dir=VA({type:t,selectors:[["form",3,"ngNoForm","",3,"formGroup","",3,"formArray",""],["ng-form"],["","ngForm",""]],hostBindings:function(i,n){i&1&&U("submit",function(a){return n.onSubmit(a)})("reset",function(){return n.onReset()})},inputs:{options:[0,"ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[Bt([nnA]),mt]})}return t})();function uL(t,e){let A=t.indexOf(e);A>-1&&t.splice(A,1)}function fL(t){return typeof t=="object"&&t!==null&&Object.keys(t).length===2&&"value"in t&&"disabled"in t}var Os=class extends Xd{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(e=null,A,i){super(Cb(A),Ib(i,A)),this._applyFormState(e),this._setUpdateStrategy(A),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),dp(A)&&(A.nonNullable||A.initialValueIsDefault)&&(fL(e)?this.defaultValue=e.value:this.defaultValue=e)}setValue(e,A={}){this.value=this._pendingValue=e,this._onChange.length&&A.emitModelToViewChange!==!1&&this._onChange.forEach(i=>i(this.value,A.emitViewToModelChange!==!1)),this.updateValueAndValidity(A)}patchValue(e,A={}){this.setValue(e,A)}reset(e=this.defaultValue,A={}){this._applyFormState(e),this.markAsPristine(A),this.markAsUntouched(A),this.setValue(this.value,A),A.overwriteDefaultValue&&(this.defaultValue=this.value),this._pendingChange=!1,A?.emitEvent!==!1&&this._events.next(new TQ(this))}_updateValue(){}_anyControls(e){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(e){this._onChange.push(e)}_unregisterOnChange(e){uL(this._onChange,e)}registerOnDisabledChange(e){this._onDisabledChange.push(e)}_unregisterOnDisabledChange(e){uL(this._onDisabledChange,e)}_forEachChild(e){}_syncPendingControls(){return this.updateOn==="submit"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(e){fL(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}};var onA=t=>t instanceof Os;var anA={provide:Hs,useExisting:Ja(()=>ko)},pL=Promise.resolve(),ko=(()=>{class t extends Hs{_changeDetectorRef;callSetDisabledState;control=new Os;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name="";isDisabled;model;options;update=new LA;constructor(A,i,n,o,a,r){super(),this._changeDetectorRef=a,this.callSetDisabledState=r,this._parent=A,this._setValidators(i),this._setAsyncValidators(n),this.valueAccessor=Eb(this,o)}ngOnChanges(A){if(this._checkForErrors(),!this._registered||"name"in A){if(this._registered&&(this._checkName(),this.formDirective)){let i=A.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}"isDisabled"in A&&this._updateDisabled(A),Bb(A,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective?.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){JQ(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(A){pL.then(()=>{this.control.setValue(A,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(A){let i=A.isDisabled.currentValue,n=i!==0&&Be(i);pL.then(()=>{n&&!this.control.disabled?this.control.disable():!n&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(A){return this._parent?GL(A,this._parent):[A]}static \u0275fac=function(i){return new(i||t)(ct(Y0,9),ct(Oc,10),ct(OQ,10),ct(as,10),ct(wt,8),ct(AB,8))};static \u0275dir=VA({type:t,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],standalone:!1,features:[Bt([anA]),mt,Yt]})}return t})();var JL=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""],standalone:!1})}return t})(),rnA={provide:as,useExisting:Ja(()=>YQ),multi:!0},YQ=(()=>{class t extends ab{writeValue(A){let i=A??"";this.setProperty("value",i)}registerOnChange(A){this.onChange=i=>{A(i==""?null:parseFloat(i))}}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["input","type","number","formControlName",""],["input","type","number","formControl",""],["input","type","number","ngModel",""]],hostBindings:function(i,n){i&1&&U("input",function(a){return n.onChange(a.target.value)})("blur",function(){return n.onTouched()})},standalone:!1,features:[Bt([rnA]),mt]})}return t})();var ob=class extends Xd{constructor(e,A,i){super(Cb(A),Ib(i,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;at(e){return this.controls[this._adjustIndex(e)]}push(e,A={}){Array.isArray(e)?e.forEach(i=>{this.controls.push(i),this._registerControl(i)}):(this.controls.push(e),this._registerControl(e)),this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}insert(e,A,i={}){this.controls.splice(e,0,A),this._registerControl(A),this.updateValueAndValidity({emitEvent:i.emitEvent})}removeAt(e,A={}){let i=this._adjustIndex(e);i<0&&(i=0),this.controls[i]&&this.controls[i]._registerOnCollectionChange(()=>{}),this.controls.splice(i,1),this.updateValueAndValidity({emitEvent:A.emitEvent})}setControl(e,A,i={}){let n=this._adjustIndex(e);n<0&&(n=0),this.controls[n]&&this.controls[n]._registerOnCollectionChange(()=>{}),this.controls.splice(n,1),A&&(this.controls.splice(n,0,A),this._registerControl(A)),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}get length(){return this.controls.length}setValue(e,A={}){LL(this,!1,e),e.forEach((i,n)=>{FL(this,!1,n),this.at(n).setValue(i,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(e.forEach((i,n)=>{this.at(n)&&this.at(n).patchValue(i,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e=[],A={}){this._forEachChild((i,n)=>{i.reset(e[n],Ye(gA({},A),{onlySelf:!0}))}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A),A?.emitEvent!==!1&&this._events.next(new TQ(this))}getRawValue(){return this.controls.map(e=>e.getRawValue())}clear(e={}){this.controls.length<1||(this._forEachChild(A=>A._registerOnCollectionChange(()=>{})),this.controls.splice(0),this.updateValueAndValidity({emitEvent:e.emitEvent}))}_adjustIndex(e){return e<0?e+this.length:e}_syncPendingControls(){let e=this.controls.reduce((A,i)=>i._syncPendingControls()?!0:A,!1);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){this.controls.forEach((A,i)=>{e(A,i)})}_updateValue(){this.value=this.controls.filter(e=>e.enabled||this.disabled).map(e=>e.value)}_anyControls(e){return this.controls.some(A=>A.enabled&&e(A))}_setUpControls(){this._forEachChild(e=>this._registerControl(e))}_allControlsDisabled(){for(let e of this.controls)if(e.enabled)return!1;return this.controls.length>0||this.disabled}_registerControl(e){e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)}_find(e){return this.at(e)??null}};var snA=(()=>{class t extends Y0{callSetDisabledState;get submitted(){return ca(this._submittedReactive)}set submitted(A){this._submittedReactive.set(A)}_submitted=pe(()=>this._submittedReactive());_submittedReactive=bA(!1);_oldForm;_onCollectionChange=()=>this._updateDomValue();directives=[];constructor(A,i,n){super(),this.callSetDisabledState=n,this._setValidators(A),this._setAsyncValidators(i)}ngOnChanges(A){this.onChanges(A)}ngOnDestroy(){this.onDestroy()}onChanges(A){this._checkFormPresent(),A.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations(),this._oldForm=this.form)}onDestroy(){this.form&&(Ip(this.form,this),this.form._onCollectionChange===this._onCollectionChange&&this.form._registerOnCollectionChange(()=>{}))}get formDirective(){return this}get path(){return[]}addControl(A){let i=this.form.get(A.path);return JQ(i,A,this.callSetDisabledState),i.updateValueAndValidity({emitEvent:!1}),this.directives.push(A),i}getControl(A){return this.form.get(A.path)}removeControl(A){cp(A.control||null,A,!1),inA(this.directives,A)}addFormGroup(A){this._setUpFormContainer(A)}removeFormGroup(A){this._cleanUpFormContainer(A)}getFormGroup(A){return this.form.get(A.path)}getFormArray(A){return this.form.get(A.path)}addFormArray(A){this._setUpFormContainer(A)}removeFormArray(A){this._cleanUpFormContainer(A)}updateModel(A,i){this.form.get(A.path).setValue(i)}onReset(){this.resetForm()}resetForm(A=void 0,i={}){this.form.reset(A,i),this._submittedReactive.set(!1)}onSubmit(A){return this.submitted=!0,TL(this.form,this.directives),this.ngSubmit.emit(A),this.form._events.next(new gp(this.control)),A?.target?.method==="dialog"}_updateDomValue(){this.directives.forEach(A=>{let i=A.control,n=this.form.get(A.path);i!==n&&(cp(i||null,A),onA(n)&&(JQ(n,A,this.callSetDisabledState),A.control=n))}),this.form._updateTreeValidity({emitEvent:!1})}_setUpFormContainer(A){let i=this.form.get(A.path);UL(i,A),i.updateValueAndValidity({emitEvent:!1})}_cleanUpFormContainer(A){let i=this.form?.get(A.path);i&&enA(i,A)&&i.updateValueAndValidity({emitEvent:!1})}_updateRegistrations(){this.form._registerOnCollectionChange(this._onCollectionChange),this._oldForm?._registerOnCollectionChange(()=>{})}_updateValidators(){db(this.form,this),this._oldForm&&Ip(this._oldForm,this)}_checkFormPresent(){this.form}static \u0275fac=function(i){return new(i||t)(ct(Oc,10),ct(OQ,10),ct(AB,8))};static \u0275dir=VA({type:t,features:[mt,Yt]})}return t})();var hb=new kA(""),lnA={provide:Hs,useExisting:Ja(()=>XI)},XI=(()=>{class t extends Hs{_ngModelWarningConfig;callSetDisabledState;viewModel;form;set isDisabled(A){}model;update=new LA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,i,n,o,a){super(),this._ngModelWarningConfig=o,this.callSetDisabledState=a,this._setValidators(A),this._setAsyncValidators(i),this.valueAccessor=Eb(this,n)}ngOnChanges(A){if(this._isControlChanged(A)){let i=A.form.previousValue;i&&cp(i,this,!1),JQ(this.form,this,this.callSetDisabledState),this.form.updateValueAndValidity({emitEvent:!1})}Bb(A,this.viewModel)&&(this.form.setValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.form&&cp(this.form,this,!1)}get path(){return[]}get control(){return this.form}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_isControlChanged(A){return A.hasOwnProperty("form")}static \u0275fac=function(i){return new(i||t)(ct(Oc,10),ct(OQ,10),ct(as,10),ct(hb,8),ct(AB,8))};static \u0275dir=VA({type:t,selectors:[["","formControl",""]],inputs:{form:[0,"formControl","form"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},exportAs:["ngForm"],standalone:!1,features:[Bt([lnA]),mt,Yt]})}return t})();var gnA={provide:Hs,useExisting:Ja(()=>Qb)},Qb=(()=>{class t extends Hs{_ngModelWarningConfig;_added=!1;viewModel;control;name=null;set isDisabled(A){}model;update=new LA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,i,n,o,a){super(),this._ngModelWarningConfig=a,this._parent=A,this._setValidators(i),this._setAsyncValidators(n),this.valueAccessor=Eb(this,o)}ngOnChanges(A){this._added||this._setUpControl(),Bb(A,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}ngOnDestroy(){this.formDirective?.removeControl(this)}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}get path(){return GL(this.name==null?this.name:this.name.toString(),this._parent)}get formDirective(){return this._parent?this._parent.formDirective:null}_setUpControl(){this.control=this.formDirective.addControl(this),this._added=!0}static \u0275fac=function(i){return new(i||t)(ct(Y0,13),ct(Oc,10),ct(OQ,10),ct(as,10),ct(hb,8))};static \u0275dir=VA({type:t,selectors:[["","formControlName",""]],inputs:{name:[0,"formControlName","name"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},standalone:!1,features:[Bt([gnA]),mt,Yt]})}return t})();var cnA={provide:Y0,useExisting:Ja(()=>i2)},i2=(()=>{class t extends snA{form=null;ngSubmit=new LA;get control(){return this.form}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","formGroup",""]],hostBindings:function(i,n){i&1&&U("submit",function(a){return n.onSubmit(a)})("reset",function(){return n.onReset()})},inputs:{form:[0,"formGroup","form"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[Bt([cnA]),mt]})}return t})();function CnA(t){return typeof t=="number"?t:parseFloat(t)}var InA=(()=>{class t{_validator=op;_onChange;_enabled;ngOnChanges(A){if(this.inputName in A){let i=this.normalizeInput(A[this.inputName].currentValue);this._enabled=this.enabled(i),this._validator=this._enabled?this.createValidator(i):op,this._onChange?.()}}validate(A){return this._validator(A)}registerOnValidatorChange(A){this._onChange=A}enabled(A){return A!=null}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,features:[Yt]})}return t})();var dnA={provide:Oc,useExisting:Ja(()=>ub),multi:!0},ub=(()=>{class t extends InA{min;inputName="min";normalizeInput=A=>CnA(A);createValidator=A=>DL(A);static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["input","type","number","min","","formControlName",""],["input","type","number","min","","formControl",""],["input","type","number","min","","ngModel",""]],hostVars:1,hostBindings:function(i,n){i&2&&te("min",n._enabled?n.min:null)},inputs:{min:"min"},standalone:!1,features:[Bt([dnA]),mt]})}return t})();var OL=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})();function mL(t){return!!t&&(t.asyncValidators!==void 0||t.validators!==void 0||t.updateOn!==void 0)}var YL=(()=>{class t{useNonNullable=!1;get nonNullable(){let A=new t;return A.useNonNullable=!0,A}group(A,i=null){let n=this._reduceControls(A),o={};return mL(i)?o=i:i!==null&&(o.validators=i.validator,o.asyncValidators=i.asyncValidator),new $d(n,o)}record(A,i=null){let n=this._reduceControls(A);return new nb(n,i)}control(A,i,n){let o={};return this.useNonNullable?(mL(i)?o=i:(o.validators=i,o.asyncValidators=n),new Os(A,Ye(gA({},o),{nonNullable:!0}))):new Os(A,i,n)}array(A,i,n){let o=A.map(a=>this._createControl(a));return new ob(o,i,n)}_reduceControls(A){let i={};return Object.keys(A).forEach(n=>{i[n]=this._createControl(A[n])}),i}_createControl(A){if(A instanceof Os)return A;if(A instanceof Xd)return A;if(Array.isArray(A)){let i=A[0],n=A.length>1?A[1]:null,o=A.length>2?A[2]:null;return this.control(i,n,o)}else return this.control(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var ln=(()=>{class t{static withConfig(A){return{ngModule:t,providers:[{provide:AB,useValue:A.callSetDisabledState??Bp}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[OL]})}return t})(),n2=(()=>{class t{static withConfig(A){return{ngModule:t,providers:[{provide:hb,useValue:A.warnOnNgModelWithFormControl??"always"},{provide:AB,useValue:A.callSetDisabledState??Bp}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[OL]})}return t})();function $I(t){return t.buttons===0||t.detail===0}function A1(t){let e=t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0];return!!e&&e.identifier===-1&&(e.radiusX==null||e.radiusX===1)&&(e.radiusY==null||e.radiusY===1)}var fb;function HL(){if(fb==null){let t=typeof document<"u"?document.head:null;fb=!!(t&&(t.createShadowRoot||t.attachShadow))}return fb}function pb(t){if(HL()){let e=t.getRootNode?t.getRootNode():null;if(typeof ShadowRoot<"u"&&ShadowRoot&&e instanceof ShadowRoot)return e}return null}function HQ(){let t=typeof document<"u"&&document?document.activeElement:null;for(;t&&t.shadowRoot;){let e=t.shadowRoot.activeElement;if(e===t)break;t=e}return t}function Ur(t){return t.composedPath?t.composedPath()[0]:t.target}var mb;try{mb=typeof Intl<"u"&&Intl.v8BreakIterator}catch(t){mb=!1}var gi=(()=>{class t{_platformId=w(j3);isBrowser=this._platformId?O0(this._platformId):typeof document=="object"&&!!document;EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent);TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent);BLINK=this.isBrowser&&!!(window.chrome||mb)&&typeof CSS<"u"&&!this.EDGE&&!this.TRIDENT;WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT;IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window);FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent);ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT;SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT;constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var zQ;function zL(){if(zQ==null&&typeof window<"u")try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:()=>zQ=!0}))}finally{zQ=zQ||!1}return zQ}function tB(t){return zL()?t:!!t.capture}function zs(t,e=0){return Ep(t)?Number(t):arguments.length===2?e:0}function Ep(t){return!isNaN(parseFloat(t))&&!isNaN(Number(t))}function Ds(t){return t instanceof ce?t.nativeElement:t}var PL=new kA("cdk-input-modality-detector-options"),jL={ignoreKeys:[18,17,224,91,16]},qL=650,wb={passive:!0,capture:!0},VL=(()=>{class t{_platform=w(gi);_listenerCleanups;modalityDetected;modalityChanged;get mostRecentModality(){return this._modality.value}_mostRecentTarget=null;_modality=new ei(null);_options;_lastTouchMs=0;_onKeydown=A=>{this._options?.ignoreKeys?.some(i=>i===A.keyCode)||(this._modality.next("keyboard"),this._mostRecentTarget=Ur(A))};_onMousedown=A=>{Date.now()-this._lastTouchMs{if(A1(A)){this._modality.next("keyboard");return}this._lastTouchMs=Date.now(),this._modality.next("touch"),this._mostRecentTarget=Ur(A)};constructor(){let A=w(qe),i=w(ti),n=w(PL,{optional:!0});if(this._options=gA(gA({},jL),n),this.modalityDetected=this._modality.pipe(wl(1)),this.modalityChanged=this.modalityDetected.pipe(kg()),this._platform.isBrowser){let o=w(Kr).createRenderer(null,null);this._listenerCleanups=A.runOutsideAngular(()=>[o.listen(i,"keydown",this._onKeydown,wb),o.listen(i,"mousedown",this._onMousedown,wb),o.listen(i,"touchstart",this._onTouchstart,wb)])}}ngOnDestroy(){this._modality.complete(),this._listenerCleanups?.forEach(A=>A())}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),PQ=(function(t){return t[t.IMMEDIATE=0]="IMMEDIATE",t[t.EVENTUAL=1]="EVENTUAL",t})(PQ||{}),WL=new kA("cdk-focus-monitor-default-options"),hp=tB({passive:!0,capture:!0}),$a=(()=>{class t{_ngZone=w(qe);_platform=w(gi);_inputModalityDetector=w(VL);_origin=null;_lastFocusOrigin=null;_windowFocused=!1;_windowFocusTimeoutId;_originTimeoutId;_originFromTouchInteraction=!1;_elementInfo=new Map;_monitoredElementCount=0;_rootNodeFocusListenerCount=new Map;_detectionMode;_windowFocusListener=()=>{this._windowFocused=!0,this._windowFocusTimeoutId=setTimeout(()=>this._windowFocused=!1)};_document=w(ti);_stopInputModalityDetector=new ie;constructor(){let A=w(WL,{optional:!0});this._detectionMode=A?.detectionMode||PQ.IMMEDIATE}_rootNodeFocusAndBlurListener=A=>{let i=Ur(A);for(let n=i;n;n=n.parentElement)A.type==="focus"?this._onFocus(A,n):this._onBlur(A,n)};monitor(A,i=!1){let n=Ds(A);if(!this._platform.isBrowser||n.nodeType!==1)return ne();let o=pb(n)||this._document,a=this._elementInfo.get(n);if(a)return i&&(a.checkChildren=!0),a.subject;let r={checkChildren:i,subject:new ie,rootNode:o};return this._elementInfo.set(n,r),this._registerGlobalListeners(r),r.subject}stopMonitoring(A){let i=Ds(A),n=this._elementInfo.get(i);n&&(n.subject.complete(),this._setClasses(i),this._elementInfo.delete(i),this._removeGlobalListeners(n))}focusVia(A,i,n){let o=Ds(A),a=this._document.activeElement;o===a?this._getClosestElementsInfo(o).forEach(([r,s])=>this._originChanged(r,i,s)):(this._setOrigin(i),typeof o.focus=="function"&&o.focus(n))}ngOnDestroy(){this._elementInfo.forEach((A,i)=>this.stopMonitoring(i))}_getWindow(){return this._document.defaultView||window}_getFocusOrigin(A){return this._origin?this._originFromTouchInteraction?this._shouldBeAttributedToTouch(A)?"touch":"program":this._origin:this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:A&&this._isLastInteractionFromInputLabel(A)?"mouse":"program"}_shouldBeAttributedToTouch(A){return this._detectionMode===PQ.EVENTUAL||!!A?.contains(this._inputModalityDetector._mostRecentTarget)}_setClasses(A,i){A.classList.toggle("cdk-focused",!!i),A.classList.toggle("cdk-touch-focused",i==="touch"),A.classList.toggle("cdk-keyboard-focused",i==="keyboard"),A.classList.toggle("cdk-mouse-focused",i==="mouse"),A.classList.toggle("cdk-program-focused",i==="program")}_setOrigin(A,i=!1){this._ngZone.runOutsideAngular(()=>{if(this._origin=A,this._originFromTouchInteraction=A==="touch"&&i,this._detectionMode===PQ.IMMEDIATE){clearTimeout(this._originTimeoutId);let n=this._originFromTouchInteraction?qL:1;this._originTimeoutId=setTimeout(()=>this._origin=null,n)}})}_onFocus(A,i){let n=this._elementInfo.get(i),o=Ur(A);!n||!n.checkChildren&&i!==o||this._originChanged(i,this._getFocusOrigin(o),n)}_onBlur(A,i){let n=this._elementInfo.get(i);!n||n.checkChildren&&A.relatedTarget instanceof Node&&i.contains(A.relatedTarget)||(this._setClasses(i),this._emitOrigin(n,null))}_emitOrigin(A,i){A.subject.observers.length&&this._ngZone.run(()=>A.subject.next(i))}_registerGlobalListeners(A){if(!this._platform.isBrowser)return;let i=A.rootNode,n=this._rootNodeFocusListenerCount.get(i)||0;n||this._ngZone.runOutsideAngular(()=>{i.addEventListener("focus",this._rootNodeFocusAndBlurListener,hp),i.addEventListener("blur",this._rootNodeFocusAndBlurListener,hp)}),this._rootNodeFocusListenerCount.set(i,n+1),++this._monitoredElementCount===1&&(this._ngZone.runOutsideAngular(()=>{this._getWindow().addEventListener("focus",this._windowFocusListener)}),this._inputModalityDetector.modalityDetected.pipe(Qt(this._stopInputModalityDetector)).subscribe(o=>{this._setOrigin(o,!0)}))}_removeGlobalListeners(A){let i=A.rootNode;if(this._rootNodeFocusListenerCount.has(i)){let n=this._rootNodeFocusListenerCount.get(i);n>1?this._rootNodeFocusListenerCount.set(i,n-1):(i.removeEventListener("focus",this._rootNodeFocusAndBlurListener,hp),i.removeEventListener("blur",this._rootNodeFocusAndBlurListener,hp),this._rootNodeFocusListenerCount.delete(i))}--this._monitoredElementCount||(this._getWindow().removeEventListener("focus",this._windowFocusListener),this._stopInputModalityDetector.next(),clearTimeout(this._windowFocusTimeoutId),clearTimeout(this._originTimeoutId))}_originChanged(A,i,n){this._setClasses(A,i),this._emitOrigin(n,i),this._lastFocusOrigin=i}_getClosestElementsInfo(A){let i=[];return this._elementInfo.forEach((n,o)=>{(o===A||n.checkChildren&&o.contains(A))&&i.push([o,n])}),i}_isLastInteractionFromInputLabel(A){let{_mostRecentTarget:i,mostRecentModality:n}=this._inputModalityDetector;if(n!=="mouse"||!i||i===A||A.nodeName!=="INPUT"&&A.nodeName!=="TEXTAREA"||A.disabled)return!1;let o=A.labels;if(o){for(let a=0;a{class t{_elementRef=w(ce);_focusMonitor=w($a);_monitorSubscription;_focusOrigin=null;cdkFocusChange=new LA;constructor(){}get focusOrigin(){return this._focusOrigin}ngAfterViewInit(){let A=this._elementRef.nativeElement;this._monitorSubscription=this._focusMonitor.monitor(A,A.nodeType===1&&A.hasAttribute("cdkMonitorSubtreeFocus")).subscribe(i=>{this._focusOrigin=i,this.cdkFocusChange.emit(i)})}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._monitorSubscription?.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkMonitorElementFocus",""],["","cdkMonitorSubtreeFocus",""]],outputs:{cdkFocusChange:"cdkFocusChange"},exportAs:["cdkMonitorFocus"]})}return t})();var Qp=new WeakMap,eo=(()=>{class t{_appRef;_injector=w(Dt);_environmentInjector=w(Gr);load(A){let i=this._appRef=this._appRef||this._injector.get(K0),n=Qp.get(i);n||(n={loaders:new Set,refs:[]},Qp.set(i,n),i.onDestroy(()=>{Qp.get(i)?.refs.forEach(o=>o.destroy()),Qp.delete(i)})),n.loaders.has(A)||(n.loaders.add(A),n.refs.push(tp(A,{environmentInjector:this._environmentInjector})))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var o2=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["ng-component"]],exportAs:["cdkVisuallyHidden"],decls:0,vars:0,template:function(i,n){},styles:[`.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0} +`],encapsulation:2,changeDetection:0})}return t})(),up;function BnA(){if(up===void 0&&(up=null,typeof window<"u")){let t=window;t.trustedTypes!==void 0&&(up=t.trustedTypes.createPolicy("angular#components",{createHTML:e=>e}))}return up}function e1(t){return BnA()?.createHTML(t)||t}function ZL(t,e,A){let i=A.sanitize(_g.HTML,e);t.innerHTML=e1(i||"")}function iB(t){return Array.isArray(t)?t:[t]}var XL=new Set,t1,nB=(()=>{class t{_platform=w(gi);_nonce=w(TF,{optional:!0});_matchMedia;constructor(){this._matchMedia=this._platform.isBrowser&&window.matchMedia?window.matchMedia.bind(window):hnA}matchMedia(A){return(this._platform.WEBKIT||this._platform.BLINK)&&EnA(A,this._nonce),this._matchMedia(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function EnA(t,e){if(!XL.has(t))try{t1||(t1=document.createElement("style"),e&&t1.setAttribute("nonce",e),t1.setAttribute("type","text/css"),document.head.appendChild(t1)),t1.sheet&&(t1.sheet.insertRule(`@media ${t} {body{ }}`,0),XL.add(t))}catch(A){console.error(A)}}function hnA(t){return{matches:t==="all"||t==="",media:t,addListener:()=>{},removeListener:()=>{}}}var jQ=(()=>{class t{_mediaMatcher=w(nB);_zone=w(qe);_queries=new Map;_destroySubject=new ie;constructor(){}ngOnDestroy(){this._destroySubject.next(),this._destroySubject.complete()}isMatched(A){return $L(iB(A)).some(n=>this._registerQuery(n).mql.matches)}observe(A){let n=$L(iB(A)).map(a=>this._registerQuery(a).observable),o=Qr(n);return o=O3(o.pipe(uo(1)),o.pipe(wl(1),Ls(0))),o.pipe(we(a=>{let r={matches:!1,breakpoints:{}};return a.forEach(({matches:s,query:l})=>{r.matches=r.matches||s,r.breakpoints[l]=s}),r}))}_registerQuery(A){if(this._queries.has(A))return this._queries.get(A);let i=this._mediaMatcher.matchMedia(A),o={observable:new vi(a=>{let r=s=>this._zone.run(()=>a.next(s));return i.addListener(r),()=>{i.removeListener(r)}}).pipe(Sn(i),we(({matches:a})=>({query:A,matches:a})),Qt(this._destroySubject)),mql:i};return this._queries.set(A,o),o}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function $L(t){return t.map(e=>e.split(",")).reduce((e,A)=>e.concat(A)).map(e=>e.trim())}function QnA(t){if(t.type==="characterData"&&t.target instanceof Comment)return!0;if(t.type==="childList"){for(let e=0;e{class t{create(A){return typeof MutationObserver>"u"?null:new MutationObserver(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),eG=(()=>{class t{_mutationObserverFactory=w(AG);_observedElements=new Map;_ngZone=w(qe);constructor(){}ngOnDestroy(){this._observedElements.forEach((A,i)=>this._cleanupObserver(i))}observe(A){let i=Ds(A);return new vi(n=>{let a=this._observeElement(i).pipe(we(r=>r.filter(s=>!QnA(s))),gt(r=>!!r.length)).subscribe(r=>{this._ngZone.run(()=>{n.next(r)})});return()=>{a.unsubscribe(),this._unobserveElement(i)}})}_observeElement(A){return this._ngZone.runOutsideAngular(()=>{if(this._observedElements.has(A))this._observedElements.get(A).count++;else{let i=new ie,n=this._mutationObserverFactory.create(o=>i.next(o));n&&n.observe(A,{characterData:!0,childList:!0,subtree:!0}),this._observedElements.set(A,{observer:n,stream:i,count:1})}return this._observedElements.get(A).stream})}_unobserveElement(A){this._observedElements.has(A)&&(this._observedElements.get(A).count--,this._observedElements.get(A).count||this._cleanupObserver(A))}_cleanupObserver(A){if(this._observedElements.has(A)){let{observer:i,stream:n}=this._observedElements.get(A);i&&i.disconnect(),n.complete(),this._observedElements.delete(A)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),tG=(()=>{class t{_contentObserver=w(eG);_elementRef=w(ce);event=new LA;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._disabled?this._unsubscribe():this._subscribe()}_disabled=!1;get debounce(){return this._debounce}set debounce(A){this._debounce=zs(A),this._subscribe()}_debounce;_currentSubscription=null;constructor(){}ngAfterContentInit(){!this._currentSubscription&&!this.disabled&&this._subscribe()}ngOnDestroy(){this._unsubscribe()}_subscribe(){this._unsubscribe();let A=this._contentObserver.observe(this._elementRef);this._currentSubscription=(this.debounce?A.pipe(Ls(this.debounce)):A).subscribe(this.event)}_unsubscribe(){this._currentSubscription?.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkObserveContent",""]],inputs:{disabled:[2,"cdkObserveContentDisabled","disabled",Be],debounce:"debounce"},outputs:{event:"cdkObserveContent"},exportAs:["cdkObserveContent"]})}return t})(),fp=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({providers:[AG]})}return t})();var oB=(()=>{class t{_platform=w(gi);constructor(){}isDisabled(A){return A.hasAttribute("disabled")}isVisible(A){return fnA(A)&&getComputedStyle(A).visibility==="visible"}isTabbable(A){if(!this._platform.isBrowser)return!1;let i=unA(MnA(A));if(i&&(iG(i)===-1||!this.isVisible(i)))return!1;let n=A.nodeName.toLowerCase(),o=iG(A);return A.hasAttribute("contenteditable")?o!==-1:n==="iframe"||n==="object"||this._platform.WEBKIT&&this._platform.IOS&&!vnA(A)?!1:n==="audio"?A.hasAttribute("controls")?o!==-1:!1:n==="video"?o===-1?!1:o!==null?!0:this._platform.FIREFOX||A.hasAttribute("controls"):A.tabIndex>=0}isFocusable(A,i){return bnA(A)&&!this.isDisabled(A)&&(i?.ignoreVisibility||this.isVisible(A))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function unA(t){try{return t.frameElement}catch(e){return null}}function fnA(t){return!!(t.offsetWidth||t.offsetHeight||typeof t.getClientRects=="function"&&t.getClientRects().length)}function pnA(t){let e=t.nodeName.toLowerCase();return e==="input"||e==="select"||e==="button"||e==="textarea"}function mnA(t){return DnA(t)&&t.type=="hidden"}function wnA(t){return ynA(t)&&t.hasAttribute("href")}function DnA(t){return t.nodeName.toLowerCase()=="input"}function ynA(t){return t.nodeName.toLowerCase()=="a"}function aG(t){if(!t.hasAttribute("tabindex")||t.tabIndex===void 0)return!1;let e=t.getAttribute("tabindex");return!!(e&&!isNaN(parseInt(e,10)))}function iG(t){if(!aG(t))return null;let e=parseInt(t.getAttribute("tabindex")||"",10);return isNaN(e)?-1:e}function vnA(t){let e=t.nodeName.toLowerCase(),A=e==="input"&&t.type;return A==="text"||A==="password"||e==="select"||e==="textarea"}function bnA(t){return mnA(t)?!1:pnA(t)||wnA(t)||t.hasAttribute("contenteditable")||aG(t)}function MnA(t){return t.ownerDocument&&t.ownerDocument.defaultView||window}var pp=class{_element;_checker;_ngZone;_document;_injector;_startAnchor=null;_endAnchor=null;_hasAttached=!1;startAnchorListener=()=>this.focusLastTabbableElement();endAnchorListener=()=>this.focusFirstTabbableElement();get enabled(){return this._enabled}set enabled(e){this._enabled=e,this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_enabled=!0;constructor(e,A,i,n,o=!1,a){this._element=e,this._checker=A,this._ngZone=i,this._document=n,this._injector=a,o||this.attachAnchors()}destroy(){let e=this._startAnchor,A=this._endAnchor;e&&(e.removeEventListener("focus",this.startAnchorListener),e.remove()),A&&(A.removeEventListener("focus",this.endAnchorListener),A.remove()),this._startAnchor=this._endAnchor=null,this._hasAttached=!1}attachAnchors(){return this._hasAttached?!0:(this._ngZone.runOutsideAngular(()=>{this._startAnchor||(this._startAnchor=this._createAnchor(),this._startAnchor.addEventListener("focus",this.startAnchorListener)),this._endAnchor||(this._endAnchor=this._createAnchor(),this._endAnchor.addEventListener("focus",this.endAnchorListener))}),this._element.parentNode&&(this._element.parentNode.insertBefore(this._startAnchor,this._element),this._element.parentNode.insertBefore(this._endAnchor,this._element.nextSibling),this._hasAttached=!0),this._hasAttached)}focusInitialElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusInitialElement(e)))})}focusFirstTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusFirstTabbableElement(e)))})}focusLastTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusLastTabbableElement(e)))})}_getRegionBoundary(e){let A=this._element.querySelectorAll(`[cdk-focus-region-${e}], [cdkFocusRegion${e}], [cdk-focus-${e}]`);return e=="start"?A.length?A[0]:this._getFirstTabbableElement(this._element):A.length?A[A.length-1]:this._getLastTabbableElement(this._element)}focusInitialElement(e){let A=this._element.querySelector("[cdk-focus-initial], [cdkFocusInitial]");if(A){if(!this._checker.isFocusable(A)){let i=this._getFirstTabbableElement(A);return i?.focus(e),!!i}return A.focus(e),!0}return this.focusFirstTabbableElement(e)}focusFirstTabbableElement(e){let A=this._getRegionBoundary("start");return A&&A.focus(e),!!A}focusLastTabbableElement(e){let A=this._getRegionBoundary("end");return A&&A.focus(e),!!A}hasAttached(){return this._hasAttached}_getFirstTabbableElement(e){if(this._checker.isFocusable(e)&&this._checker.isTabbable(e))return e;let A=e.children;for(let i=0;i=0;i--){let n=A[i].nodeType===this._document.ELEMENT_NODE?this._getLastTabbableElement(A[i]):null;if(n)return n}return null}_createAnchor(){let e=this._document.createElement("div");return this._toggleAnchorTabIndex(this._enabled,e),e.classList.add("cdk-visually-hidden"),e.classList.add("cdk-focus-trap-anchor"),e.setAttribute("aria-hidden","true"),e}_toggleAnchorTabIndex(e,A){e?A.setAttribute("tabindex","0"):A.removeAttribute("tabindex")}toggleAnchors(e){this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_executeOnStable(e){this._injector?Hn(e,{injector:this._injector}):setTimeout(e)}},qQ=(()=>{class t{_checker=w(oB);_ngZone=w(qe);_document=w(ti);_injector=w(Dt);constructor(){w(eo).load(o2)}create(A,i=!1){return new pp(A,this._checker,this._ngZone,this._document,i,this._injector)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var rG=new kA("liveAnnouncerElement",{providedIn:"root",factory:()=>null}),sG=new kA("LIVE_ANNOUNCER_DEFAULT_OPTIONS"),SnA=0,VQ=(()=>{class t{_ngZone=w(qe);_defaultOptions=w(sG,{optional:!0});_liveElement;_document=w(ti);_sanitizer=w(e2);_previousTimeout;_currentPromise;_currentResolve;constructor(){let A=w(rG,{optional:!0});this._liveElement=A||this._createLiveElement()}announce(A,...i){let n=this._defaultOptions,o,a;return i.length===1&&typeof i[0]=="number"?a=i[0]:[o,a]=i,this.clear(),clearTimeout(this._previousTimeout),o||(o=n&&n.politeness?n.politeness:"polite"),a==null&&n&&(a=n.duration),this._liveElement.setAttribute("aria-live",o),this._liveElement.id&&this._exposeAnnouncerToModals(this._liveElement.id),this._ngZone.runOutsideAngular(()=>(this._currentPromise||(this._currentPromise=new Promise(r=>this._currentResolve=r)),clearTimeout(this._previousTimeout),this._previousTimeout=setTimeout(()=>{!A||typeof A=="string"?this._liveElement.textContent=A:ZL(this._liveElement,A,this._sanitizer),typeof a=="number"&&(this._previousTimeout=setTimeout(()=>this.clear(),a)),this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0},100),this._currentPromise))}clear(){this._liveElement&&(this._liveElement.textContent="")}ngOnDestroy(){clearTimeout(this._previousTimeout),this._liveElement?.remove(),this._liveElement=null,this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0}_createLiveElement(){let A="cdk-live-announcer-element",i=this._document.getElementsByClassName(A),n=this._document.createElement("div");for(let o=0;o .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{class t{_platform=w(gi);_hasCheckedHighContrastMode=!1;_document=w(ti);_breakpointSubscription;constructor(){this._breakpointSubscription=w(jQ).observe("(forced-colors: active)").subscribe(()=>{this._hasCheckedHighContrastMode&&(this._hasCheckedHighContrastMode=!1,this._applyBodyHighContrastModeCssClasses())})}getHighContrastMode(){if(!this._platform.isBrowser)return a2.NONE;let A=this._document.createElement("div");A.style.backgroundColor="rgb(1,2,3)",A.style.position="absolute",this._document.body.appendChild(A);let i=this._document.defaultView||window,n=i&&i.getComputedStyle?i.getComputedStyle(A):null,o=(n&&n.backgroundColor||"").replace(/ /g,"");switch(A.remove(),o){case"rgb(0,0,0)":case"rgb(45,50,54)":case"rgb(32,32,32)":return a2.WHITE_ON_BLACK;case"rgb(255,255,255)":case"rgb(255,250,239)":return a2.BLACK_ON_WHITE}return a2.NONE}ngOnDestroy(){this._breakpointSubscription.unsubscribe()}_applyBodyHighContrastModeCssClasses(){if(!this._hasCheckedHighContrastMode&&this._platform.isBrowser&&this._document.body){let A=this._document.body.classList;A.remove(yb,nG,oG),this._hasCheckedHighContrastMode=!0;let i=this.getHighContrastMode();i===a2.BLACK_ON_WHITE?A.add(yb,nG):i===a2.WHITE_ON_BLACK&&A.add(yb,oG)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),WQ=(()=>{class t{constructor(){w(lG)._applyBodyHighContrastModeCssClasses()}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fp]})}return t})();var vb={},In=class t{_appId=w(P3);static _infix=`a${Math.floor(Math.random()*1e5).toString()}`;getId(e,A=!1){return this._appId!=="ng"&&(e+=this._appId),vb.hasOwnProperty(e)||(vb[e]=0),`${e}${A?t._infix+"-":""}${vb[e]++}`}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var knA=200,mp=class{_letterKeyStream=new ie;_items=[];_selectedItemIndex=-1;_pressedLetters=[];_skipPredicateFn;_selectedItem=new ie;selectedItem=this._selectedItem;constructor(e,A){let i=typeof A?.debounceInterval=="number"?A.debounceInterval:knA;A?.skipPredicate&&(this._skipPredicateFn=A.skipPredicate),this.setItems(e),this._setupKeyHandler(i)}destroy(){this._pressedLetters=[],this._letterKeyStream.complete(),this._selectedItem.complete()}setCurrentSelectedItemIndex(e){this._selectedItemIndex=e}setItems(e){this._items=e}handleKey(e){let A=e.keyCode;e.key&&e.key.length===1?this._letterKeyStream.next(e.key.toLocaleUpperCase()):(A>=65&&A<=90||A>=48&&A<=57)&&this._letterKeyStream.next(String.fromCharCode(A))}isTyping(){return this._pressedLetters.length>0}reset(){this._pressedLetters=[]}_setupKeyHandler(e){this._letterKeyStream.pipe(di(A=>this._pressedLetters.push(A)),Ls(e),gt(()=>this._pressedLetters.length>0),we(()=>this._pressedLetters.join("").toLocaleUpperCase())).subscribe(A=>{for(let i=1;it[A]):t.altKey||t.shiftKey||t.ctrlKey||t.metaKey}var aB=class{_items;_activeItemIndex=bA(-1);_activeItem=bA(null);_wrap=!1;_typeaheadSubscription=bo.EMPTY;_itemChangesSubscription;_vertical=!0;_horizontal=null;_allowedModifierKeys=[];_homeAndEnd=!1;_pageUpAndDown={enabled:!1,delta:10};_effectRef;_typeahead;_skipPredicateFn=e=>e.disabled;constructor(e,A){this._items=e,e instanceof xg?this._itemChangesSubscription=e.changes.subscribe(i=>this._itemsChanged(i.toArray())):VI(e)&&(this._effectRef=Ao(()=>this._itemsChanged(e()),{injector:A}))}tabOut=new ie;change=new ie;skipPredicate(e){return this._skipPredicateFn=e,this}withWrap(e=!0){return this._wrap=e,this}withVerticalOrientation(e=!0){return this._vertical=e,this}withHorizontalOrientation(e){return this._horizontal=e,this}withAllowedModifierKeys(e){return this._allowedModifierKeys=e,this}withTypeAhead(e=200){this._typeaheadSubscription.unsubscribe();let A=this._getItemsArray();return this._typeahead=new mp(A,{debounceInterval:typeof e=="number"?e:void 0,skipPredicate:i=>this._skipPredicateFn(i)}),this._typeaheadSubscription=this._typeahead.selectedItem.subscribe(i=>{this.setActiveItem(i)}),this}cancelTypeahead(){return this._typeahead?.reset(),this}withHomeAndEnd(e=!0){return this._homeAndEnd=e,this}withPageUpDown(e=!0,A=10){return this._pageUpAndDown={enabled:e,delta:A},this}setActiveItem(e){let A=this._activeItem();this.updateActiveItem(e),this._activeItem()!==A&&this.change.next(this._activeItemIndex())}onKeydown(e){let A=e.keyCode,n=["altKey","ctrlKey","metaKey","shiftKey"].every(o=>!e[o]||this._allowedModifierKeys.indexOf(o)>-1);switch(A){case 9:this.tabOut.next();return;case 40:if(this._vertical&&n){this.setNextItemActive();break}else return;case 38:if(this._vertical&&n){this.setPreviousItemActive();break}else return;case 39:if(this._horizontal&&n){this._horizontal==="rtl"?this.setPreviousItemActive():this.setNextItemActive();break}else return;case 37:if(this._horizontal&&n){this._horizontal==="rtl"?this.setNextItemActive():this.setPreviousItemActive();break}else return;case 36:if(this._homeAndEnd&&n){this.setFirstItemActive();break}else return;case 35:if(this._homeAndEnd&&n){this.setLastItemActive();break}else return;case 33:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex()-this._pageUpAndDown.delta;this._setActiveItemByIndex(o>0?o:0,1);break}else return;case 34:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex()+this._pageUpAndDown.delta,a=this._getItemsArray().length;this._setActiveItemByIndex(o-1&&i!==this._activeItemIndex()&&(this._activeItemIndex.set(i),this._typeahead?.setCurrentSelectedItemIndex(i))}}};var ZQ=class extends aB{setActiveItem(e){this.activeItem&&this.activeItem.setInactiveStyles(),super.setActiveItem(e),this.activeItem&&this.activeItem.setActiveStyles()}};var H0=class extends aB{_origin="program";setFocusOrigin(e){return this._origin=e,this}setActiveItem(e){super.setActiveItem(e),this.activeItem&&this.activeItem.focus(this._origin)}};var CG=" ";function Sb(t,e,A){let i=Dp(t,e);A=A.trim(),!i.some(n=>n.trim()===A)&&(i.push(A),t.setAttribute(e,i.join(CG)))}function yp(t,e,A){let i=Dp(t,e);A=A.trim();let n=i.filter(o=>o!==A);n.length?t.setAttribute(e,n.join(CG)):t.removeAttribute(e)}function Dp(t,e){return t.getAttribute(e)?.match(/\S+/g)??[]}var IG="cdk-describedby-message",wp="cdk-describedby-host",Mb=0,dG=(()=>{class t{_platform=w(gi);_document=w(ti);_messageRegistry=new Map;_messagesContainer=null;_id=`${Mb++}`;constructor(){w(eo).load(o2),this._id=w(P3)+"-"+Mb++}describe(A,i,n){if(!this._canBeDescribed(A,i))return;let o=bb(i,n);typeof i!="string"?(cG(i,this._id),this._messageRegistry.set(o,{messageElement:i,referenceCount:0})):this._messageRegistry.has(o)||this._createMessageElement(i,n),this._isElementDescribedByMessage(A,o)||this._addMessageReference(A,o)}removeDescription(A,i,n){if(!i||!this._isElementNode(A))return;let o=bb(i,n);if(this._isElementDescribedByMessage(A,o)&&this._removeMessageReference(A,o),typeof i=="string"){let a=this._messageRegistry.get(o);a&&a.referenceCount===0&&this._deleteMessageElement(o)}this._messagesContainer?.childNodes.length===0&&(this._messagesContainer.remove(),this._messagesContainer=null)}ngOnDestroy(){let A=this._document.querySelectorAll(`[${wp}="${this._id}"]`);for(let i=0;in.indexOf(IG)!=0);A.setAttribute("aria-describedby",i.join(" "))}_addMessageReference(A,i){let n=this._messageRegistry.get(i);Sb(A,"aria-describedby",n.messageElement.id),A.setAttribute(wp,this._id),n.referenceCount++}_removeMessageReference(A,i){let n=this._messageRegistry.get(i);n.referenceCount--,yp(A,"aria-describedby",n.messageElement.id),A.removeAttribute(wp)}_isElementDescribedByMessage(A,i){let n=Dp(A,"aria-describedby"),o=this._messageRegistry.get(i),a=o&&o.messageElement.id;return!!a&&n.indexOf(a)!=-1}_canBeDescribed(A,i){if(!this._isElementNode(A))return!1;if(i&&typeof i=="object")return!0;let n=i==null?"":`${i}`.trim(),o=A.getAttribute("aria-label");return n?!o||o.trim()!==n:!1}_isElementNode(A){return A.nodeType===this._document.ELEMENT_NODE}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function bb(t,e){return typeof t=="string"?`${e||""}/${t}`:t}function cG(t,e){t.id||(t.id=`${IG}-${e}-${Mb++}`)}var Rg=(function(t){return t[t.NORMAL=0]="NORMAL",t[t.NEGATED=1]="NEGATED",t[t.INVERTED=2]="INVERTED",t})(Rg||{}),vp,r1;function bp(){if(r1==null){if(typeof document!="object"||!document||typeof Element!="function"||!Element)return r1=!1,r1;if(document.documentElement?.style&&"scrollBehavior"in document.documentElement.style)r1=!0;else{let t=Element.prototype.scrollTo;t?r1=!/\{\s*\[native code\]\s*\}/.test(t.toString()):r1=!1}}return r1}function rB(){if(typeof document!="object"||!document)return Rg.NORMAL;if(vp==null){let t=document.createElement("div"),e=t.style;t.dir="rtl",e.width="1px",e.overflow="auto",e.visibility="hidden",e.pointerEvents="none",e.position="absolute";let A=document.createElement("div"),i=A.style;i.width="2px",i.height="1px",t.appendChild(A),document.body.appendChild(t),vp=Rg.NORMAL,t.scrollLeft===0&&(t.scrollLeft=1,vp=t.scrollLeft===0?Rg.NEGATED:Rg.INVERTED),t.remove()}return vp}function kb(){return typeof __karma__<"u"&&!!__karma__||typeof jasmine<"u"&&!!jasmine||typeof jest<"u"&&!!jest||typeof Mocha<"u"&&!!Mocha}var sB,BG=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function xb(){if(sB)return sB;if(typeof document!="object"||!document)return sB=new Set(BG),sB;let t=document.createElement("input");return sB=new Set(BG.filter(e=>(t.setAttribute("type",e),t.type===e))),sB}var EG={XSmall:"(max-width: 599.98px)",Small:"(min-width: 600px) and (max-width: 959.98px)",Medium:"(min-width: 960px) and (max-width: 1279.98px)",Large:"(min-width: 1280px) and (max-width: 1919.98px)",XLarge:"(min-width: 1920px)",Handset:"(max-width: 599.98px) and (orientation: portrait), (max-width: 959.98px) and (orientation: landscape)",Tablet:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait), (min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",Web:"(min-width: 840px) and (orientation: portrait), (min-width: 1280px) and (orientation: landscape)",HandsetPortrait:"(max-width: 599.98px) and (orientation: portrait)",TabletPortrait:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait)",WebPortrait:"(min-width: 840px) and (orientation: portrait)",HandsetLandscape:"(max-width: 959.98px) and (orientation: landscape)",TabletLandscape:"(min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",WebLandscape:"(min-width: 1280px) and (orientation: landscape)"};var _nA=new kA("MATERIAL_ANIMATIONS"),hG=null;function XQ(){return w(_nA,{optional:!0})?.animationsDisabled||w(qI,{optional:!0})==="NoopAnimations"?"di-disabled":(hG??=w(nB).matchMedia("(prefers-reduced-motion)").matches,hG?"reduced-motion":"enabled")}function An(){return XQ()!=="enabled"}function Oa(t){return t==null?"":typeof t=="string"?t:`${t}px`}function mr(t){return t!=null&&`${t}`!="false"}var ys=(function(t){return t[t.FADING_IN=0]="FADING_IN",t[t.VISIBLE=1]="VISIBLE",t[t.FADING_OUT=2]="FADING_OUT",t[t.HIDDEN=3]="HIDDEN",t})(ys||{}),_b=class{_renderer;element;config;_animationForciblyDisabledThroughCss;state=ys.HIDDEN;constructor(e,A,i,n=!1){this._renderer=e,this.element=A,this.config=i,this._animationForciblyDisabledThroughCss=n}fadeOut(){this._renderer.fadeOutRipple(this)}},QG=tB({passive:!0,capture:!0}),Rb=class{_events=new Map;addHandler(e,A,i,n){let o=this._events.get(A);if(o){let a=o.get(i);a?a.add(n):o.set(i,new Set([n]))}else this._events.set(A,new Map([[i,new Set([n])]])),e.runOutsideAngular(()=>{document.addEventListener(A,this._delegateEventHandler,QG)})}removeHandler(e,A,i){let n=this._events.get(e);if(!n)return;let o=n.get(A);o&&(o.delete(i),o.size===0&&n.delete(A),n.size===0&&(this._events.delete(e),document.removeEventListener(e,this._delegateEventHandler,QG)))}_delegateEventHandler=e=>{let A=Ur(e);A&&this._events.get(e.type)?.forEach((i,n)=>{(n===A||n.contains(A))&&i.forEach(o=>o.handleEvent(e))})}},$Q={enterDuration:225,exitDuration:150},RnA=800,uG=tB({passive:!0,capture:!0}),fG=["mousedown","touchstart"],pG=["mouseup","mouseleave","touchend","touchcancel"],NnA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["ng-component"]],hostAttrs:["mat-ripple-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[`.mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale3d(0, 0, 0);background-color:var(--mat-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface) 10%, transparent))}@media(forced-colors: active){.mat-ripple-element{display:none}}.cdk-drag-preview .mat-ripple-element,.cdk-drag-placeholder .mat-ripple-element{display:none} +`],encapsulation:2,changeDetection:0})}return t})(),Au=class t{_target;_ngZone;_platform;_containerElement;_triggerElement=null;_isPointerDown=!1;_activeRipples=new Map;_mostRecentTransientRipple=null;_lastTouchStartEvent;_pointerUpEventsRegistered=!1;_containerRect=null;static _eventManager=new Rb;constructor(e,A,i,n,o){this._target=e,this._ngZone=A,this._platform=n,n.isBrowser&&(this._containerElement=Ds(i)),o&&o.get(eo).load(NnA)}fadeInRipple(e,A,i={}){let n=this._containerRect=this._containerRect||this._containerElement.getBoundingClientRect(),o=gA(gA({},$Q),i.animation);i.centered&&(e=n.left+n.width/2,A=n.top+n.height/2);let a=i.radius||FnA(e,A,n),r=e-n.left,s=A-n.top,l=o.enterDuration,g=document.createElement("div");g.classList.add("mat-ripple-element"),g.style.left=`${r-a}px`,g.style.top=`${s-a}px`,g.style.height=`${a*2}px`,g.style.width=`${a*2}px`,i.color!=null&&(g.style.backgroundColor=i.color),g.style.transitionDuration=`${l}ms`,this._containerElement.appendChild(g);let C=window.getComputedStyle(g),I=C.transitionProperty,d=C.transitionDuration,h=I==="none"||d==="0s"||d==="0s, 0s"||n.width===0&&n.height===0,E=new _b(this,g,i,h);g.style.transform="scale3d(1, 1, 1)",E.state=ys.FADING_IN,i.persistent||(this._mostRecentTransientRipple=E);let f=null;return!h&&(l||o.exitDuration)&&this._ngZone.runOutsideAngular(()=>{let m=()=>{f&&(f.fallbackTimer=null),clearTimeout(k),this._finishRippleTransition(E)},v=()=>this._destroyRipple(E),k=setTimeout(v,l+100);g.addEventListener("transitionend",m),g.addEventListener("transitioncancel",v),f={onTransitionEnd:m,onTransitionCancel:v,fallbackTimer:k}}),this._activeRipples.set(E,f),(h||!l)&&this._finishRippleTransition(E),E}fadeOutRipple(e){if(e.state===ys.FADING_OUT||e.state===ys.HIDDEN)return;let A=e.element,i=gA(gA({},$Q),e.config.animation);A.style.transitionDuration=`${i.exitDuration}ms`,A.style.opacity="0",e.state=ys.FADING_OUT,(e._animationForciblyDisabledThroughCss||!i.exitDuration)&&this._finishRippleTransition(e)}fadeOutAll(){this._getActiveRipples().forEach(e=>e.fadeOut())}fadeOutAllNonPersistent(){this._getActiveRipples().forEach(e=>{e.config.persistent||e.fadeOut()})}setupTriggerEvents(e){let A=Ds(e);!this._platform.isBrowser||!A||A===this._triggerElement||(this._removeTriggerEvents(),this._triggerElement=A,fG.forEach(i=>{t._eventManager.addHandler(this._ngZone,i,A,this)}))}handleEvent(e){e.type==="mousedown"?this._onMousedown(e):e.type==="touchstart"?this._onTouchStart(e):this._onPointerUp(),this._pointerUpEventsRegistered||(this._ngZone.runOutsideAngular(()=>{pG.forEach(A=>{this._triggerElement.addEventListener(A,this,uG)})}),this._pointerUpEventsRegistered=!0)}_finishRippleTransition(e){e.state===ys.FADING_IN?this._startFadeOutTransition(e):e.state===ys.FADING_OUT&&this._destroyRipple(e)}_startFadeOutTransition(e){let A=e===this._mostRecentTransientRipple,{persistent:i}=e.config;e.state=ys.VISIBLE,!i&&(!A||!this._isPointerDown)&&e.fadeOut()}_destroyRipple(e){let A=this._activeRipples.get(e)??null;this._activeRipples.delete(e),this._activeRipples.size||(this._containerRect=null),e===this._mostRecentTransientRipple&&(this._mostRecentTransientRipple=null),e.state=ys.HIDDEN,A!==null&&(e.element.removeEventListener("transitionend",A.onTransitionEnd),e.element.removeEventListener("transitioncancel",A.onTransitionCancel),A.fallbackTimer!==null&&clearTimeout(A.fallbackTimer)),e.element.remove()}_onMousedown(e){let A=$I(e),i=this._lastTouchStartEvent&&Date.now(){let A=e.state===ys.VISIBLE||e.config.terminateOnPointerUp&&e.state===ys.FADING_IN;!e.config.persistent&&A&&e.fadeOut()}))}_getActiveRipples(){return Array.from(this._activeRipples.keys())}_removeTriggerEvents(){let e=this._triggerElement;e&&(fG.forEach(A=>t._eventManager.removeHandler(A,e,this)),this._pointerUpEventsRegistered&&(pG.forEach(A=>e.removeEventListener(A,this,uG)),this._pointerUpEventsRegistered=!1))}};function FnA(t,e,A){let i=Math.max(Math.abs(t-A.left),Math.abs(t-A.right)),n=Math.max(Math.abs(e-A.top),Math.abs(e-A.bottom));return Math.sqrt(i*i+n*n)}var r2=new kA("mat-ripple-global-options"),rs=(()=>{class t{_elementRef=w(ce);_animationsDisabled=An();color;unbounded=!1;centered=!1;radius=0;animation;get disabled(){return this._disabled}set disabled(A){A&&this.fadeOutAllNonPersistent(),this._disabled=A,this._setupTriggerEventsIfEnabled()}_disabled=!1;get trigger(){return this._trigger||this._elementRef.nativeElement}set trigger(A){this._trigger=A,this._setupTriggerEventsIfEnabled()}_trigger;_rippleRenderer;_globalOptions;_isInitialized=!1;constructor(){let A=w(qe),i=w(gi),n=w(r2,{optional:!0}),o=w(Dt);this._globalOptions=n||{},this._rippleRenderer=new Au(this,A,this._elementRef,i,o)}ngOnInit(){this._isInitialized=!0,this._setupTriggerEventsIfEnabled()}ngOnDestroy(){this._rippleRenderer._removeTriggerEvents()}fadeOutAll(){this._rippleRenderer.fadeOutAll()}fadeOutAllNonPersistent(){this._rippleRenderer.fadeOutAllNonPersistent()}get rippleConfig(){return{centered:this.centered,radius:this.radius,color:this.color,animation:gA(gA(gA({},this._globalOptions.animation),this._animationsDisabled?{enterDuration:0,exitDuration:0}:{}),this.animation),terminateOnPointerUp:this._globalOptions.terminateOnPointerUp}}get rippleDisabled(){return this.disabled||!!this._globalOptions.disabled}_setupTriggerEventsIfEnabled(){!this.disabled&&this._isInitialized&&this._rippleRenderer.setupTriggerEvents(this.trigger)}launch(A,i=0,n){return typeof A=="number"?this._rippleRenderer.fadeInRipple(A,i,gA(gA({},this.rippleConfig),n)):this._rippleRenderer.fadeInRipple(0,0,gA(gA({},this.rippleConfig),A))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","mat-ripple",""],["","matRipple",""]],hostAttrs:[1,"mat-ripple"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mat-ripple-unbounded",n.unbounded)},inputs:{color:[0,"matRippleColor","color"],unbounded:[0,"matRippleUnbounded","unbounded"],centered:[0,"matRippleCentered","centered"],radius:[0,"matRippleRadius","radius"],animation:[0,"matRippleAnimation","animation"],disabled:[0,"matRippleDisabled","disabled"],trigger:[0,"matRippleTrigger","trigger"]},exportAs:["matRipple"]})}return t})();var LnA={capture:!0},GnA=["focus","mousedown","mouseenter","touchstart"],Nb="mat-ripple-loader-uninitialized",Fb="mat-ripple-loader-class-name",mG="mat-ripple-loader-centered",Mp="mat-ripple-loader-disabled",Sp=(()=>{class t{_document=w(ti);_animationsDisabled=An();_globalRippleOptions=w(r2,{optional:!0});_platform=w(gi);_ngZone=w(qe);_injector=w(Dt);_eventCleanups;_hosts=new Map;constructor(){let A=w(Kr).createRenderer(null,null);this._eventCleanups=this._ngZone.runOutsideAngular(()=>GnA.map(i=>A.listen(this._document,i,this._onInteraction,LnA)))}ngOnDestroy(){let A=this._hosts.keys();for(let i of A)this.destroyRipple(i);this._eventCleanups.forEach(i=>i())}configureRipple(A,i){A.setAttribute(Nb,this._globalRippleOptions?.namespace??""),(i.className||!A.hasAttribute(Fb))&&A.setAttribute(Fb,i.className||""),i.centered&&A.setAttribute(mG,""),i.disabled&&A.setAttribute(Mp,"")}setDisabled(A,i){let n=this._hosts.get(A);n?(n.target.rippleDisabled=i,!i&&!n.hasSetUpEvents&&(n.hasSetUpEvents=!0,n.renderer.setupTriggerEvents(A))):i?A.setAttribute(Mp,""):A.removeAttribute(Mp)}_onInteraction=A=>{let i=Ur(A);if(i instanceof HTMLElement){let n=i.closest(`[${Nb}="${this._globalRippleOptions?.namespace??""}"]`);n&&this._createRipple(n)}};_createRipple(A){if(!this._document||this._hosts.has(A))return;A.querySelector(".mat-ripple")?.remove();let i=this._document.createElement("span");i.classList.add("mat-ripple",A.getAttribute(Fb)),A.append(i);let n=this._globalRippleOptions,o=this._animationsDisabled?0:n?.animation?.enterDuration??$Q.enterDuration,a=this._animationsDisabled?0:n?.animation?.exitDuration??$Q.exitDuration,r={rippleDisabled:this._animationsDisabled||n?.disabled||A.hasAttribute(Mp),rippleConfig:{centered:A.hasAttribute(mG),terminateOnPointerUp:n?.terminateOnPointerUp,animation:{enterDuration:o,exitDuration:a}}},s=new Au(r,this._ngZone,i,this._platform,this._injector),l=!r.rippleDisabled;l&&s.setupTriggerEvents(A),this._hosts.set(A,{target:r,renderer:s,hasSetUpEvents:l}),A.removeAttribute(Nb)}destroyRipple(A){let i=this._hosts.get(A);i&&(i.renderer._removeTriggerEvents(),this._hosts.delete(A))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var lr=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["structural-styles"]],decls:0,vars:0,template:function(i,n){},styles:[`.mat-focus-indicator{position:relative}.mat-focus-indicator::before{top:0;left:0;right:0;bottom:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border-width:var(--mat-focus-indicator-border-width, 3px);border-style:var(--mat-focus-indicator-border-style, solid);border-color:var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus-visible::before{content:""}@media(forced-colors: active){html{--mat-focus-indicator-display: block}} +`],encapsulation:2,changeDetection:0})}return t})();var KnA=["mat-icon-button",""],UnA=["*"],TnA=new kA("MAT_BUTTON_CONFIG");function wG(t){return t==null?void 0:Cn(t)}var Lb=(()=>{class t{_elementRef=w(ce);_ngZone=w(qe);_animationsDisabled=An();_config=w(TnA,{optional:!0});_focusMonitor=w($a);_cleanupClick;_renderer=w(Pi);_rippleLoader=w(Sp);_isAnchor;_isFab=!1;color;get disableRipple(){return this._disableRipple}set disableRipple(A){this._disableRipple=A,this._updateRippleDisabled()}_disableRipple=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._updateRippleDisabled()}_disabled=!1;ariaDisabled;disabledInteractive;tabIndex;set _tabindex(A){this.tabIndex=A}constructor(){w(eo).load(lr);let A=this._elementRef.nativeElement;this._isAnchor=A.tagName==="A",this.disabledInteractive=this._config?.disabledInteractive??!1,this.color=this._config?.color??null,this._rippleLoader?.configureRipple(A,{className:"mat-mdc-button-ripple"})}ngAfterViewInit(){this._focusMonitor.monitor(this._elementRef,!0),this._isAnchor&&this._setupAsAnchor()}ngOnDestroy(){this._cleanupClick?.(),this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement)}focus(A="program",i){A?this._focusMonitor.focusVia(this._elementRef.nativeElement,A,i):this._elementRef.nativeElement.focus(i)}_getAriaDisabled(){return this.ariaDisabled!=null?this.ariaDisabled:this._isAnchor?this.disabled||null:this.disabled&&this.disabledInteractive?!0:null}_getDisabledAttribute(){return this.disabledInteractive||!this.disabled?null:!0}_updateRippleDisabled(){this._rippleLoader?.setDisabled(this._elementRef.nativeElement,this.disableRipple||this.disabled)}_getTabIndex(){return this._isAnchor?this.disabled&&!this.disabledInteractive?-1:this.tabIndex:this.tabIndex}_setupAsAnchor(){this._cleanupClick=this._ngZone.runOutsideAngular(()=>this._renderer.listen(this._elementRef.nativeElement,"click",A=>{this.disabled&&(A.preventDefault(),A.stopImmediatePropagation())}))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,hostAttrs:[1,"mat-mdc-button-base"],hostVars:13,hostBindings:function(i,n){i&2&&(te("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled())("tabindex",n._getTabIndex()),ro(n.color?"mat-"+n.color:""),RA("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("mat-unthemed",!n.color)("_mat-animation-noopable",n._animationsDisabled))},inputs:{color:"color",disableRipple:[2,"disableRipple","disableRipple",Be],disabled:[2,"disabled","disabled",Be],ariaDisabled:[2,"aria-disabled","ariaDisabled",Be],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Be],tabIndex:[2,"tabIndex","tabIndex",wG],_tabindex:[2,"tabindex","_tabindex",wG]}})}return t})(),ji=(()=>{class t extends Lb{constructor(){super(),this._rippleLoader.configureRipple(this._elementRef.nativeElement,{centered:!0})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["button","mat-icon-button",""],["a","mat-icon-button",""],["button","matIconButton",""],["a","matIconButton",""]],hostAttrs:[1,"mdc-icon-button","mat-mdc-icon-button"],exportAs:["matButton","matAnchor"],features:[mt],attrs:KnA,ngContentSelectors:UnA,decls:4,vars:0,consts:[[1,"mat-mdc-button-persistent-ripple","mdc-icon-button__ripple"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(Rt(),Kn(0,"span",0),Ve(1),Kn(2,"span",1)(3,"span",2))},styles:[`.mat-mdc-icon-button{-webkit-user-select:none;user-select:none;display:inline-block;position:relative;box-sizing:border-box;border:none;outline:none;background-color:rgba(0,0,0,0);fill:currentColor;text-decoration:none;cursor:pointer;z-index:0;overflow:visible;border-radius:var(--mat-icon-button-container-shape, var(--mat-sys-corner-full, 50%));flex-shrink:0;text-align:center;width:var(--mat-icon-button-state-layer-size, 40px);height:var(--mat-icon-button-state-layer-size, 40px);padding:calc(calc(var(--mat-icon-button-state-layer-size, 40px) - var(--mat-icon-button-icon-size, 24px)) / 2);font-size:var(--mat-icon-button-icon-size, 24px);color:var(--mat-icon-button-icon-color, var(--mat-sys-on-surface-variant));-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-icon-button .mat-mdc-button-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-icon-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-icon-button .mdc-button__label,.mat-mdc-icon-button .mat-icon{z-index:1;position:relative}.mat-mdc-icon-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-icon-button:focus-visible>.mat-focus-indicator::before{content:"";border-radius:inherit}.mat-mdc-icon-button .mat-ripple-element{background-color:var(--mat-icon-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface-variant) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-icon-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-icon-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-icon-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-icon-button-touch-target-size, 48px);display:var(--mat-icon-button-touch-target-display, block);left:50%;width:var(--mat-icon-button-touch-target-size, 48px);transform:translate(-50%, -50%)}.mat-mdc-icon-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-icon-button[disabled],.mat-mdc-icon-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-icon-button-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-icon-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-icon-button img,.mat-mdc-icon-button svg{width:var(--mat-icon-button-icon-size, 24px);height:var(--mat-icon-button-icon-size, 24px);vertical-align:baseline}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple{border-radius:var(--mat-icon-button-container-shape, var(--mat-sys-corner-full, 50%))}.mat-mdc-icon-button[hidden]{display:none}.mat-mdc-icon-button.mat-unthemed:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-primary:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-accent:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-warn:not(.mdc-ripple-upgraded):focus::before{background:rgba(0,0,0,0);opacity:1} +`,`@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-button-base.mat-tonal-button,.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}} +`],encapsulation:2,changeDetection:0})}return t})();var JnA=new kA("cdk-dir-doc",{providedIn:"root",factory:()=>w(ti)}),OnA=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;function DG(t){let e=t?.toLowerCase()||"";return e==="auto"&&typeof navigator<"u"&&navigator?.language?OnA.test(navigator.language)?"rtl":"ltr":e==="rtl"?"rtl":"ltr"}var fo=(()=>{class t{get value(){return this.valueSignal()}valueSignal=bA("ltr");change=new LA;constructor(){let A=w(JnA,{optional:!0});if(A){let i=A.body?A.body.dir:null,n=A.documentElement?A.documentElement.dir:null;this.valueSignal.set(DG(i||n||"ltr"))}}ngOnDestroy(){this.change.complete()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var fi=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})();var Yc=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();var YnA=["matButton",""],HnA=[[["",8,"material-icons",3,"iconPositionEnd",""],["mat-icon",3,"iconPositionEnd",""],["","matButtonIcon","",3,"iconPositionEnd",""]],"*",[["","iconPositionEnd","",8,"material-icons"],["mat-icon","iconPositionEnd",""],["","matButtonIcon","","iconPositionEnd",""]]],znA=[".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])","*",".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"];var yG=new Map([["text",["mat-mdc-button"]],["filled",["mdc-button--unelevated","mat-mdc-unelevated-button"]],["elevated",["mdc-button--raised","mat-mdc-raised-button"]],["outlined",["mdc-button--outlined","mat-mdc-outlined-button"]],["tonal",["mat-tonal-button"]]]),pi=(()=>{class t extends Lb{get appearance(){return this._appearance}set appearance(A){this.setAppearance(A||this._config?.defaultAppearance||"text")}_appearance=null;constructor(){super();let A=PnA(this._elementRef.nativeElement);A&&this.setAppearance(A)}setAppearance(A){if(A===this._appearance)return;let i=this._elementRef.nativeElement.classList,n=this._appearance?yG.get(this._appearance):null,o=yG.get(A);n&&i.remove(...n),i.add(...o),this._appearance=A}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["button","matButton",""],["a","matButton",""],["button","mat-button",""],["button","mat-raised-button",""],["button","mat-flat-button",""],["button","mat-stroked-button",""],["a","mat-button",""],["a","mat-raised-button",""],["a","mat-flat-button",""],["a","mat-stroked-button",""]],hostAttrs:[1,"mdc-button"],inputs:{appearance:[0,"matButton","appearance"]},exportAs:["matButton","matAnchor"],features:[mt],attrs:YnA,ngContentSelectors:znA,decls:7,vars:4,consts:[[1,"mat-mdc-button-persistent-ripple"],[1,"mdc-button__label"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(Rt(HnA),Kn(0,"span",0),Ve(1),wn(2,"span",1),Ve(3,1),Gn(),Ve(4,2),Kn(5,"span",2)(6,"span",3)),i&2&&RA("mdc-button__ripple",!n._isFab)("mdc-fab__ripple",n._isFab)},styles:[`.mat-mdc-button-base{text-decoration:none}.mat-mdc-button-base .mat-icon{min-height:fit-content;flex-shrink:0}@media(hover: none){.mat-mdc-button-base:hover>span.mat-mdc-button-persistent-ripple::before{opacity:0}}.mdc-button{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:64px;border:none;outline:none;line-height:inherit;-webkit-appearance:none;overflow:visible;vertical-align:middle;background:rgba(0,0,0,0);padding:0 8px}.mdc-button::-moz-focus-inner{padding:0;border:0}.mdc-button:active{outline:none}.mdc-button:hover{cursor:pointer}.mdc-button:disabled{cursor:default;pointer-events:none}.mdc-button[hidden]{display:none}.mdc-button .mdc-button__label{position:relative}.mat-mdc-button{padding:0 var(--mat-button-text-horizontal-padding, 12px);height:var(--mat-button-text-container-height, 40px);font-family:var(--mat-button-text-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-text-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-text-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-text-label-text-transform);font-weight:var(--mat-button-text-label-text-weight, var(--mat-sys-label-large-weight))}.mat-mdc-button,.mat-mdc-button .mdc-button__ripple{border-radius:var(--mat-button-text-container-shape, var(--mat-sys-corner-full))}.mat-mdc-button:not(:disabled){color:var(--mat-button-text-label-text-color, var(--mat-sys-primary))}.mat-mdc-button[disabled],.mat-mdc-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-text-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-button:has(.material-icons,mat-icon,[matButtonIcon]){padding:0 var(--mat-button-text-with-icon-horizontal-padding, 16px)}.mat-mdc-button>.mat-icon{margin-right:var(--mat-button-text-icon-spacing, 8px);margin-left:var(--mat-button-text-icon-offset, -4px)}[dir=rtl] .mat-mdc-button>.mat-icon{margin-right:var(--mat-button-text-icon-offset, -4px);margin-left:var(--mat-button-text-icon-spacing, 8px)}.mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-text-icon-offset, -4px);margin-left:var(--mat-button-text-icon-spacing, 8px)}[dir=rtl] .mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-text-icon-spacing, 8px);margin-left:var(--mat-button-text-icon-offset, -4px)}.mat-mdc-button .mat-ripple-element{background-color:var(--mat-button-text-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-text-state-layer-color, var(--mat-sys-primary))}.mat-mdc-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-text-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-text-touch-target-size, 48px);display:var(--mat-button-text-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-unelevated-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-filled-container-height, 40px);font-family:var(--mat-button-filled-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-filled-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-filled-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-filled-label-text-transform);font-weight:var(--mat-button-filled-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-filled-horizontal-padding, 24px)}.mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-button-filled-icon-spacing, 8px);margin-left:var(--mat-button-filled-icon-offset, -8px)}[dir=rtl] .mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-button-filled-icon-offset, -8px);margin-left:var(--mat-button-filled-icon-spacing, 8px)}.mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-filled-icon-offset, -8px);margin-left:var(--mat-button-filled-icon-spacing, 8px)}[dir=rtl] .mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-filled-icon-spacing, 8px);margin-left:var(--mat-button-filled-icon-offset, -8px)}.mat-mdc-unelevated-button .mat-ripple-element{background-color:var(--mat-button-filled-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-filled-state-layer-color, var(--mat-sys-on-primary))}.mat-mdc-unelevated-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-filled-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-unelevated-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-unelevated-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-unelevated-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-unelevated-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-filled-touch-target-size, 48px);display:var(--mat-button-filled-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-unelevated-button:not(:disabled){color:var(--mat-button-filled-label-text-color, var(--mat-sys-on-primary));background-color:var(--mat-button-filled-container-color, var(--mat-sys-primary))}.mat-mdc-unelevated-button,.mat-mdc-unelevated-button .mdc-button__ripple{border-radius:var(--mat-button-filled-container-shape, var(--mat-sys-corner-full))}.mat-mdc-unelevated-button[disabled],.mat-mdc-unelevated-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-filled-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-filled-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-raised-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);box-shadow:var(--mat-button-protected-container-elevation-shadow, var(--mat-sys-level1));height:var(--mat-button-protected-container-height, 40px);font-family:var(--mat-button-protected-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-protected-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-protected-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-protected-label-text-transform);font-weight:var(--mat-button-protected-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-protected-horizontal-padding, 24px)}.mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-button-protected-icon-spacing, 8px);margin-left:var(--mat-button-protected-icon-offset, -8px)}[dir=rtl] .mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-button-protected-icon-offset, -8px);margin-left:var(--mat-button-protected-icon-spacing, 8px)}.mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-protected-icon-offset, -8px);margin-left:var(--mat-button-protected-icon-spacing, 8px)}[dir=rtl] .mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-protected-icon-spacing, 8px);margin-left:var(--mat-button-protected-icon-offset, -8px)}.mat-mdc-raised-button .mat-ripple-element{background-color:var(--mat-button-protected-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-protected-state-layer-color, var(--mat-sys-primary))}.mat-mdc-raised-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-protected-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-raised-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-raised-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-raised-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-raised-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-protected-touch-target-size, 48px);display:var(--mat-button-protected-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-raised-button:not(:disabled){color:var(--mat-button-protected-label-text-color, var(--mat-sys-primary));background-color:var(--mat-button-protected-container-color, var(--mat-sys-surface))}.mat-mdc-raised-button,.mat-mdc-raised-button .mdc-button__ripple{border-radius:var(--mat-button-protected-container-shape, var(--mat-sys-corner-full))}@media(hover: hover){.mat-mdc-raised-button:hover{box-shadow:var(--mat-button-protected-hover-container-elevation-shadow, var(--mat-sys-level2))}}.mat-mdc-raised-button:focus{box-shadow:var(--mat-button-protected-focus-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button:active,.mat-mdc-raised-button:focus:active{box-shadow:var(--mat-button-protected-pressed-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button[disabled],.mat-mdc-raised-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-protected-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-protected-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-raised-button[disabled].mat-mdc-button-disabled,.mat-mdc-raised-button.mat-mdc-button-disabled.mat-mdc-button-disabled{box-shadow:var(--mat-button-protected-disabled-container-elevation-shadow, var(--mat-sys-level0))}.mat-mdc-raised-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-outlined-button{border-style:solid;transition:border 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-outlined-container-height, 40px);font-family:var(--mat-button-outlined-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-outlined-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-outlined-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-outlined-label-text-transform);font-weight:var(--mat-button-outlined-label-text-weight, var(--mat-sys-label-large-weight));border-radius:var(--mat-button-outlined-container-shape, var(--mat-sys-corner-full));border-width:var(--mat-button-outlined-outline-width, 1px);padding:0 var(--mat-button-outlined-horizontal-padding, 24px)}.mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-button-outlined-icon-spacing, 8px);margin-left:var(--mat-button-outlined-icon-offset, -8px)}[dir=rtl] .mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-button-outlined-icon-offset, -8px);margin-left:var(--mat-button-outlined-icon-spacing, 8px)}.mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-outlined-icon-offset, -8px);margin-left:var(--mat-button-outlined-icon-spacing, 8px)}[dir=rtl] .mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-outlined-icon-spacing, 8px);margin-left:var(--mat-button-outlined-icon-offset, -8px)}.mat-mdc-outlined-button .mat-ripple-element{background-color:var(--mat-button-outlined-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-outlined-state-layer-color, var(--mat-sys-primary))}.mat-mdc-outlined-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-outlined-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-outlined-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-outlined-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-outlined-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-outlined-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-outlined-touch-target-size, 48px);display:var(--mat-button-outlined-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-outlined-button:not(:disabled){color:var(--mat-button-outlined-label-text-color, var(--mat-sys-primary));border-color:var(--mat-button-outlined-outline-color, var(--mat-sys-outline))}.mat-mdc-outlined-button[disabled],.mat-mdc-outlined-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-outlined-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:var(--mat-button-outlined-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-tonal-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-tonal-container-height, 40px);font-family:var(--mat-button-tonal-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-tonal-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-tonal-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-tonal-label-text-transform);font-weight:var(--mat-button-tonal-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-tonal-horizontal-padding, 24px)}.mat-tonal-button:not(:disabled){color:var(--mat-button-tonal-label-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-button-tonal-container-color, var(--mat-sys-secondary-container))}.mat-tonal-button,.mat-tonal-button .mdc-button__ripple{border-radius:var(--mat-button-tonal-container-shape, var(--mat-sys-corner-full))}.mat-tonal-button[disabled],.mat-tonal-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-tonal-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-tonal-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-tonal-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-tonal-button>.mat-icon{margin-right:var(--mat-button-tonal-icon-spacing, 8px);margin-left:var(--mat-button-tonal-icon-offset, -8px)}[dir=rtl] .mat-tonal-button>.mat-icon{margin-right:var(--mat-button-tonal-icon-offset, -8px);margin-left:var(--mat-button-tonal-icon-spacing, 8px)}.mat-tonal-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-tonal-icon-offset, -8px);margin-left:var(--mat-button-tonal-icon-spacing, 8px)}[dir=rtl] .mat-tonal-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-tonal-icon-spacing, 8px);margin-left:var(--mat-button-tonal-icon-offset, -8px)}.mat-tonal-button .mat-ripple-element{background-color:var(--mat-button-tonal-ripple-color, color-mix(in srgb, var(--mat-sys-on-secondary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-tonal-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-tonal-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-tonal-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-tonal-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-tonal-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-tonal-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-tonal-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-tonal-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-tonal-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-tonal-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-tonal-touch-target-size, 48px);display:var(--mat-button-tonal-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-button,.mat-mdc-unelevated-button,.mat-mdc-raised-button,.mat-mdc-outlined-button,.mat-tonal-button{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before,.mat-tonal-button .mat-mdc-button-ripple,.mat-tonal-button .mat-mdc-button-persistent-ripple,.mat-tonal-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-tonal-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before,.mat-tonal-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-button .mdc-button__label,.mat-mdc-button .mat-icon,.mat-mdc-unelevated-button .mdc-button__label,.mat-mdc-unelevated-button .mat-icon,.mat-mdc-raised-button .mdc-button__label,.mat-mdc-raised-button .mat-icon,.mat-mdc-outlined-button .mdc-button__label,.mat-mdc-outlined-button .mat-icon,.mat-tonal-button .mdc-button__label,.mat-tonal-button .mat-icon{z-index:1;position:relative}.mat-mdc-button .mat-focus-indicator,.mat-mdc-unelevated-button .mat-focus-indicator,.mat-mdc-raised-button .mat-focus-indicator,.mat-mdc-outlined-button .mat-focus-indicator,.mat-tonal-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-unelevated-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-raised-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-outlined-button:focus-visible>.mat-focus-indicator::before,.mat-tonal-button:focus-visible>.mat-focus-indicator::before{content:"";border-radius:inherit}.mat-mdc-button._mat-animation-noopable,.mat-mdc-unelevated-button._mat-animation-noopable,.mat-mdc-raised-button._mat-animation-noopable,.mat-mdc-outlined-button._mat-animation-noopable,.mat-tonal-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-button>.mat-icon,.mat-mdc-unelevated-button>.mat-icon,.mat-mdc-raised-button>.mat-icon,.mat-mdc-outlined-button>.mat-icon,.mat-tonal-button>.mat-icon{display:inline-block;position:relative;vertical-align:top;font-size:1.125rem;height:1.125rem;width:1.125rem}.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mdc-button__ripple{top:-1px;left:-1px;bottom:-1px;right:-1px}.mat-mdc-unelevated-button .mat-focus-indicator::before,.mat-tonal-button .mat-focus-indicator::before,.mat-mdc-raised-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-outlined-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 3px)*-1)} +`,`@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-button-base.mat-tonal-button,.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}} +`],encapsulation:2,changeDetection:0})}return t})();function PnA(t){return t.hasAttribute("mat-raised-button")?"elevated":t.hasAttribute("mat-stroked-button")?"outlined":t.hasAttribute("mat-flat-button")?"filled":t.hasAttribute("mat-button")?"text":null}var qi=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Yc,fi]})}return t})();var Gb=class{_box;_destroyed=new ie;_resizeSubject=new ie;_resizeObserver;_elementObservables=new Map;constructor(e){this._box=e,typeof ResizeObserver<"u"&&(this._resizeObserver=new ResizeObserver(A=>this._resizeSubject.next(A)))}observe(e){return this._elementObservables.has(e)||this._elementObservables.set(e,new vi(A=>{let i=this._resizeSubject.subscribe(A);return this._resizeObserver?.observe(e,{box:this._box}),()=>{this._resizeObserver?.unobserve(e),i.unsubscribe(),this._elementObservables.delete(e)}}).pipe(gt(A=>A.some(i=>i.target===e)),Gs({bufferSize:1,refCount:!0}),Qt(this._destroyed))),this._elementObservables.get(e)}destroy(){this._destroyed.next(),this._destroyed.complete(),this._resizeSubject.complete(),this._elementObservables.clear()}},kp=(()=>{class t{_cleanupErrorListener;_observers=new Map;_ngZone=w(qe);constructor(){typeof ResizeObserver<"u"}ngOnDestroy(){for(let[,A]of this._observers)A.destroy();this._observers.clear(),this._cleanupErrorListener?.()}observe(A,i){let n=i?.box||"content-box";return this._observers.has(n)||this._observers.set(n,new Gb(n)),this._observers.get(n).observe(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var jnA=["notch"],qnA=["matFormFieldNotchedOutline",""],VnA=["*"],vG=["iconPrefixContainer"],bG=["textPrefixContainer"],MG=["iconSuffixContainer"],SG=["textSuffixContainer"],WnA=["textField"],ZnA=["*",[["mat-label"]],[["","matPrefix",""],["","matIconPrefix",""]],[["","matTextPrefix",""]],[["","matTextSuffix",""]],[["","matSuffix",""],["","matIconSuffix",""]],[["mat-error"],["","matError",""]],[["mat-hint",3,"align","end"]],[["mat-hint","align","end"]]],XnA=["*","mat-label","[matPrefix], [matIconPrefix]","[matTextPrefix]","[matTextSuffix]","[matSuffix], [matIconSuffix]","mat-error, [matError]","mat-hint:not([align='end'])","mat-hint[align='end']"];function $nA(t,e){t&1&&hA(0,"span",21)}function AoA(t,e){if(t&1&&(B(0,"label",20),Ve(1,1),O(2,$nA,1,0,"span",21),Q()),t&2){let A=p(2);H("floating",A._shouldLabelFloat())("monitorResize",A._hasOutline())("id",A._labelId),te("for",A._control.disableAutomaticLabeling?null:A._control.id),u(2),Y(!A.hideRequiredMarker&&A._control.required?2:-1)}}function eoA(t,e){if(t&1&&O(0,AoA,3,5,"label",20),t&2){let A=p();Y(A._hasFloatingLabel()?0:-1)}}function toA(t,e){t&1&&hA(0,"div",7)}function ioA(t,e){}function noA(t,e){if(t&1&&Et(0,ioA,0,0,"ng-template",13),t&2){p(2);let A=Qi(1);H("ngTemplateOutlet",A)}}function ooA(t,e){if(t&1&&(B(0,"div",9),O(1,noA,1,1,null,13),Q()),t&2){let A=p();H("matFormFieldNotchedOutlineOpen",A._shouldLabelFloat()),u(),Y(A._forceDisplayInfixLabel()?-1:1)}}function aoA(t,e){t&1&&(B(0,"div",10,2),Ve(2,2),Q())}function roA(t,e){t&1&&(B(0,"div",11,3),Ve(2,3),Q())}function soA(t,e){}function loA(t,e){if(t&1&&Et(0,soA,0,0,"ng-template",13),t&2){p();let A=Qi(1);H("ngTemplateOutlet",A)}}function goA(t,e){t&1&&(B(0,"div",14,4),Ve(2,4),Q())}function coA(t,e){t&1&&(B(0,"div",15,5),Ve(2,5),Q())}function CoA(t,e){t&1&&hA(0,"div",16)}function IoA(t,e){t&1&&(B(0,"div",18),Ve(1,6),Q())}function doA(t,e){if(t&1&&(B(0,"mat-hint",22),y(1),Q()),t&2){let A=p(2);H("id",A._hintLabelId),u(),lA(A.hintLabel)}}function BoA(t,e){if(t&1&&(B(0,"div",19),O(1,doA,2,2,"mat-hint",22),Ve(2,7),hA(3,"div",23),Ve(4,8),Q()),t&2){let A=p();u(),Y(A.hintLabel?1:-1)}}var vs=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["mat-label"]]})}return t})(),LG=new kA("MatError"),Kb=(()=>{class t{id=w(In).getId("mat-mdc-error-");constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["mat-error"],["","matError",""]],hostAttrs:[1,"mat-mdc-form-field-error","mat-mdc-form-field-bottom-align"],hostVars:1,hostBindings:function(i,n){i&2&&ha("id",n.id)},inputs:{id:"id"},features:[Bt([{provide:LG,useExisting:t}])]})}return t})(),s1=(()=>{class t{align="start";id=w(In).getId("mat-mdc-hint-");static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["mat-hint"]],hostAttrs:[1,"mat-mdc-form-field-hint","mat-mdc-form-field-bottom-align"],hostVars:4,hostBindings:function(i,n){i&2&&(ha("id",n.id),te("align",null),RA("mat-mdc-form-field-hint-end",n.align==="end"))},inputs:{align:"align",id:"id"}})}return t})(),GG=new kA("MatPrefix"),Ub=(()=>{class t{set _isTextSelector(A){this._isText=!0}_isText=!1;static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matPrefix",""],["","matIconPrefix",""],["","matTextPrefix",""]],inputs:{_isTextSelector:[0,"matTextPrefix","_isTextSelector"]},features:[Bt([{provide:GG,useExisting:t}])]})}return t})(),KG=new kA("MatSuffix"),Tb=(()=>{class t{set _isTextSelector(A){this._isText=!0}_isText=!1;static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matSuffix",""],["","matIconSuffix",""],["","matTextSuffix",""]],inputs:{_isTextSelector:[0,"matTextSuffix","_isTextSelector"]},features:[Bt([{provide:KG,useExisting:t}])]})}return t})(),UG=new kA("FloatingLabelParent"),kG=(()=>{class t{_elementRef=w(ce);get floating(){return this._floating}set floating(A){this._floating=A,this.monitorResize&&this._handleResize()}_floating=!1;get monitorResize(){return this._monitorResize}set monitorResize(A){this._monitorResize=A,this._monitorResize?this._subscribeToResize():this._resizeSubscription.unsubscribe()}_monitorResize=!1;_resizeObserver=w(kp);_ngZone=w(qe);_parent=w(UG);_resizeSubscription=new bo;constructor(){}ngOnDestroy(){this._resizeSubscription.unsubscribe()}getWidth(){return EoA(this._elementRef.nativeElement)}get element(){return this._elementRef.nativeElement}_handleResize(){setTimeout(()=>this._parent._handleLabelResized())}_subscribeToResize(){this._resizeSubscription.unsubscribe(),this._ngZone.runOutsideAngular(()=>{this._resizeSubscription=this._resizeObserver.observe(this._elementRef.nativeElement,{box:"border-box"}).subscribe(()=>this._handleResize())})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["label","matFormFieldFloatingLabel",""]],hostAttrs:[1,"mdc-floating-label","mat-mdc-floating-label"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mdc-floating-label--float-above",n.floating)},inputs:{floating:"floating",monitorResize:"monitorResize"}})}return t})();function EoA(t){let e=t;if(e.offsetParent!==null)return e.scrollWidth;let A=e.cloneNode(!0);A.style.setProperty("position","absolute"),A.style.setProperty("transform","translate(-9999px, -9999px)"),document.documentElement.appendChild(A);let i=A.scrollWidth;return A.remove(),i}var xG="mdc-line-ripple--active",xp="mdc-line-ripple--deactivating",_G=(()=>{class t{_elementRef=w(ce);_cleanupTransitionEnd;constructor(){let A=w(qe),i=w(Pi);A.runOutsideAngular(()=>{this._cleanupTransitionEnd=i.listen(this._elementRef.nativeElement,"transitionend",this._handleTransitionEnd)})}activate(){let A=this._elementRef.nativeElement.classList;A.remove(xp),A.add(xG)}deactivate(){this._elementRef.nativeElement.classList.add(xp)}_handleTransitionEnd=A=>{let i=this._elementRef.nativeElement.classList,n=i.contains(xp);A.propertyName==="opacity"&&n&&i.remove(xG,xp)};ngOnDestroy(){this._cleanupTransitionEnd()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["div","matFormFieldLineRipple",""]],hostAttrs:[1,"mdc-line-ripple"]})}return t})(),RG=(()=>{class t{_elementRef=w(ce);_ngZone=w(qe);open=!1;_notch;ngAfterViewInit(){let A=this._elementRef.nativeElement,i=A.querySelector(".mdc-floating-label");i?(A.classList.add("mdc-notched-outline--upgraded"),typeof requestAnimationFrame=="function"&&(i.style.transitionDuration="0s",this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>i.style.transitionDuration="")}))):A.classList.add("mdc-notched-outline--no-label")}_setNotchWidth(A){let i=this._notch.nativeElement;!this.open||!A?i.style.width="":i.style.width=`calc(${A}px * var(--mat-mdc-form-field-floating-label-scale, 0.75) + 9px)`}_setMaxWidth(A){this._notch.nativeElement.style.setProperty("--mat-form-field-notch-max-width",`calc(100% - ${A}px)`)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["div","matFormFieldNotchedOutline",""]],viewQuery:function(i,n){if(i&1&&Jt(jnA,5),i&2){let o;ae(o=re())&&(n._notch=o.first)}},hostAttrs:[1,"mdc-notched-outline"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mdc-notched-outline--notched",n.open)},inputs:{open:[0,"matFormFieldNotchedOutlineOpen","open"]},attrs:qnA,ngContentSelectors:VnA,decls:5,vars:0,consts:[["notch",""],[1,"mat-mdc-notch-piece","mdc-notched-outline__leading"],[1,"mat-mdc-notch-piece","mdc-notched-outline__notch"],[1,"mat-mdc-notch-piece","mdc-notched-outline__trailing"]],template:function(i,n){i&1&&(Rt(),Kn(0,"div",1),wn(1,"div",2,0),Ve(3),Gn(),Kn(4,"div",3))},encapsulation:2,changeDetection:0})}return t})(),eu=(()=>{class t{value=null;stateChanges;id;placeholder;ngControl=null;focused=!1;empty=!1;shouldLabelFloat=!1;required=!1;disabled=!1;errorState=!1;controlType;autofilled;userAriaDescribedBy;disableAutomaticLabeling;describedByIds;static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t})}return t})();var tu=new kA("MatFormField"),hoA=new kA("MAT_FORM_FIELD_DEFAULT_OPTIONS"),NG="fill",QoA="auto",FG="fixed",uoA="translateY(-50%)",Ko=(()=>{class t{_elementRef=w(ce);_changeDetectorRef=w(wt);_platform=w(gi);_idGenerator=w(In);_ngZone=w(qe);_defaults=w(hoA,{optional:!0});_currentDirection;_textField;_iconPrefixContainer;_textPrefixContainer;_iconSuffixContainer;_textSuffixContainer;_floatingLabel;_notchedOutline;_lineRipple;_iconPrefixContainerSignal=So("iconPrefixContainer");_textPrefixContainerSignal=So("textPrefixContainer");_iconSuffixContainerSignal=So("iconSuffixContainer");_textSuffixContainerSignal=So("textSuffixContainer");_prefixSuffixContainers=pe(()=>[this._iconPrefixContainerSignal(),this._textPrefixContainerSignal(),this._iconSuffixContainerSignal(),this._textSuffixContainerSignal()].map(A=>A?.nativeElement).filter(A=>A!==void 0));_formFieldControl;_prefixChildren;_suffixChildren;_errorChildren;_hintChildren;_labelChild=J0(vs);get hideRequiredMarker(){return this._hideRequiredMarker}set hideRequiredMarker(A){this._hideRequiredMarker=mr(A)}_hideRequiredMarker=!1;color="primary";get floatLabel(){return this._floatLabel||this._defaults?.floatLabel||QoA}set floatLabel(A){A!==this._floatLabel&&(this._floatLabel=A,this._changeDetectorRef.markForCheck())}_floatLabel;get appearance(){return this._appearanceSignal()}set appearance(A){let i=A||this._defaults?.appearance||NG;this._appearanceSignal.set(i)}_appearanceSignal=bA(NG);get subscriptSizing(){return this._subscriptSizing||this._defaults?.subscriptSizing||FG}set subscriptSizing(A){this._subscriptSizing=A||this._defaults?.subscriptSizing||FG}_subscriptSizing=null;get hintLabel(){return this._hintLabel}set hintLabel(A){this._hintLabel=A,this._processHints()}_hintLabel="";_hasIconPrefix=!1;_hasTextPrefix=!1;_hasIconSuffix=!1;_hasTextSuffix=!1;_labelId=this._idGenerator.getId("mat-mdc-form-field-label-");_hintLabelId=this._idGenerator.getId("mat-mdc-hint-");_describedByIds;get _control(){return this._explicitFormFieldControl||this._formFieldControl}set _control(A){this._explicitFormFieldControl=A}_destroyed=new ie;_isFocused=null;_explicitFormFieldControl;_previousControl=null;_previousControlValidatorFn=null;_stateChanges;_valueChanges;_describedByChanges;_outlineLabelOffsetResizeObserver=null;_animationsDisabled=An();constructor(){let A=this._defaults,i=w(fo);A&&(A.appearance&&(this.appearance=A.appearance),this._hideRequiredMarker=!!A?.hideRequiredMarker,A.color&&(this.color=A.color)),Ao(()=>this._currentDirection=i.valueSignal()),this._syncOutlineLabelOffset()}ngAfterViewInit(){this._updateFocusState(),this._animationsDisabled||this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._elementRef.nativeElement.classList.add("mat-form-field-animations-enabled")},300)}),this._changeDetectorRef.detectChanges()}ngAfterContentInit(){this._assertFormFieldControl(),this._initializeSubscript(),this._initializePrefixAndSuffix()}ngAfterContentChecked(){this._assertFormFieldControl(),this._control!==this._previousControl&&(this._initializeControl(this._previousControl),this._control.ngControl&&this._control.ngControl.control&&(this._previousControlValidatorFn=this._control.ngControl.control.validator),this._previousControl=this._control),this._control.ngControl&&this._control.ngControl.control&&this._control.ngControl.control.validator!==this._previousControlValidatorFn&&this._changeDetectorRef.markForCheck()}ngOnDestroy(){this._outlineLabelOffsetResizeObserver?.disconnect(),this._stateChanges?.unsubscribe(),this._valueChanges?.unsubscribe(),this._describedByChanges?.unsubscribe(),this._destroyed.next(),this._destroyed.complete()}getLabelId=pe(()=>this._hasFloatingLabel()?this._labelId:null);getConnectedOverlayOrigin(){return this._textField||this._elementRef}_animateAndLockLabel(){this._hasFloatingLabel()&&(this.floatLabel="always")}_initializeControl(A){let i=this._control,n="mat-mdc-form-field-type-";A&&this._elementRef.nativeElement.classList.remove(n+A.controlType),i.controlType&&this._elementRef.nativeElement.classList.add(n+i.controlType),this._stateChanges?.unsubscribe(),this._stateChanges=i.stateChanges.subscribe(()=>{this._updateFocusState(),this._changeDetectorRef.markForCheck()}),this._describedByChanges?.unsubscribe(),this._describedByChanges=i.stateChanges.pipe(Sn([void 0,void 0]),we(()=>[i.errorState,i.userAriaDescribedBy]),VC(),gt(([[o,a],[r,s]])=>o!==r||a!==s)).subscribe(()=>this._syncDescribedByIds()),this._valueChanges?.unsubscribe(),i.ngControl&&i.ngControl.valueChanges&&(this._valueChanges=i.ngControl.valueChanges.pipe(Qt(this._destroyed)).subscribe(()=>this._changeDetectorRef.markForCheck()))}_checkPrefixAndSuffixTypes(){this._hasIconPrefix=!!this._prefixChildren.find(A=>!A._isText),this._hasTextPrefix=!!this._prefixChildren.find(A=>A._isText),this._hasIconSuffix=!!this._suffixChildren.find(A=>!A._isText),this._hasTextSuffix=!!this._suffixChildren.find(A=>A._isText)}_initializePrefixAndSuffix(){this._checkPrefixAndSuffixTypes(),Ki(this._prefixChildren.changes,this._suffixChildren.changes).subscribe(()=>{this._checkPrefixAndSuffixTypes(),this._changeDetectorRef.markForCheck()})}_initializeSubscript(){this._hintChildren.changes.subscribe(()=>{this._processHints(),this._changeDetectorRef.markForCheck()}),this._errorChildren.changes.subscribe(()=>{this._syncDescribedByIds(),this._changeDetectorRef.markForCheck()}),this._validateHints(),this._syncDescribedByIds()}_assertFormFieldControl(){this._control}_updateFocusState(){let A=this._control.focused;A&&!this._isFocused?(this._isFocused=!0,this._lineRipple?.activate()):!A&&(this._isFocused||this._isFocused===null)&&(this._isFocused=!1,this._lineRipple?.deactivate()),this._elementRef.nativeElement.classList.toggle("mat-focused",A),this._textField?.nativeElement.classList.toggle("mdc-text-field--focused",A)}_syncOutlineLabelOffset(){$F({earlyRead:()=>{if(this._appearanceSignal()!=="outline")return this._outlineLabelOffsetResizeObserver?.disconnect(),null;if(globalThis.ResizeObserver){this._outlineLabelOffsetResizeObserver||=new globalThis.ResizeObserver(()=>{this._writeOutlinedLabelStyles(this._getOutlinedLabelOffset())});for(let A of this._prefixSuffixContainers())this._outlineLabelOffsetResizeObserver.observe(A,{box:"border-box"})}return this._getOutlinedLabelOffset()},write:A=>this._writeOutlinedLabelStyles(A())})}_shouldAlwaysFloat(){return this.floatLabel==="always"}_hasOutline(){return this.appearance==="outline"}_forceDisplayInfixLabel(){return!this._platform.isBrowser&&this._prefixChildren.length&&!this._shouldLabelFloat()}_hasFloatingLabel=pe(()=>!!this._labelChild());_shouldLabelFloat(){return this._hasFloatingLabel()?this._control.shouldLabelFloat||this._shouldAlwaysFloat():!1}_shouldForward(A){let i=this._control?this._control.ngControl:null;return i&&i[A]}_getSubscriptMessageType(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"}_handleLabelResized(){this._refreshOutlineNotchWidth()}_refreshOutlineNotchWidth(){!this._hasOutline()||!this._floatingLabel||!this._shouldLabelFloat()?this._notchedOutline?._setNotchWidth(0):this._notchedOutline?._setNotchWidth(this._floatingLabel.getWidth())}_processHints(){this._validateHints(),this._syncDescribedByIds()}_validateHints(){this._hintChildren}_syncDescribedByIds(){if(this._control){let A=[];if(this._control.userAriaDescribedBy&&typeof this._control.userAriaDescribedBy=="string"&&A.push(...this._control.userAriaDescribedBy.split(" ")),this._getSubscriptMessageType()==="hint"){let o=this._hintChildren?this._hintChildren.find(r=>r.align==="start"):null,a=this._hintChildren?this._hintChildren.find(r=>r.align==="end"):null;o?A.push(o.id):this._hintLabel&&A.push(this._hintLabelId),a&&A.push(a.id)}else this._errorChildren&&A.push(...this._errorChildren.map(o=>o.id));let i=this._control.describedByIds,n;if(i){let o=this._describedByIds||A;n=A.concat(i.filter(a=>a&&!o.includes(a)))}else n=A;this._control.setDescribedByIds(n),this._describedByIds=A}}_getOutlinedLabelOffset(){if(!this._hasOutline()||!this._floatingLabel)return null;if(!this._iconPrefixContainer&&!this._textPrefixContainer)return["",null];if(!this._isAttachedToDom())return null;let A=this._iconPrefixContainer?.nativeElement,i=this._textPrefixContainer?.nativeElement,n=this._iconSuffixContainer?.nativeElement,o=this._textSuffixContainer?.nativeElement,a=A?.getBoundingClientRect().width??0,r=i?.getBoundingClientRect().width??0,s=n?.getBoundingClientRect().width??0,l=o?.getBoundingClientRect().width??0,g=this._currentDirection==="rtl"?"-1":"1",C=`${a+r}px`,d=`calc(${g} * (${C} + var(--mat-mdc-form-field-label-offset-x, 0px)))`,h=`var(--mat-mdc-form-field-label-transform, ${uoA} translateX(${d}))`,E=a+r+s+l;return[h,E]}_writeOutlinedLabelStyles(A){if(A!==null){let[i,n]=A;this._floatingLabel&&(this._floatingLabel.element.style.transform=i),n!==null&&this._notchedOutline?._setMaxWidth(n)}}_isAttachedToDom(){let A=this._elementRef.nativeElement;if(A.getRootNode){let i=A.getRootNode();return i&&i!==A}return document.documentElement.contains(A)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-form-field"]],contentQueries:function(i,n,o){if(i&1&&(ep(o,n._labelChild,vs,5),jo(o,eu,5)(o,GG,5)(o,KG,5)(o,LG,5)(o,s1,5)),i&2){ur();let a;ae(a=re())&&(n._formFieldControl=a.first),ae(a=re())&&(n._prefixChildren=a),ae(a=re())&&(n._suffixChildren=a),ae(a=re())&&(n._errorChildren=a),ae(a=re())&&(n._hintChildren=a)}},viewQuery:function(i,n){if(i&1&&(ns(n._iconPrefixContainerSignal,vG,5)(n._textPrefixContainerSignal,bG,5)(n._iconSuffixContainerSignal,MG,5)(n._textSuffixContainerSignal,SG,5),Jt(WnA,5)(vG,5)(bG,5)(MG,5)(SG,5)(kG,5)(RG,5)(_G,5)),i&2){ur(4);let o;ae(o=re())&&(n._textField=o.first),ae(o=re())&&(n._iconPrefixContainer=o.first),ae(o=re())&&(n._textPrefixContainer=o.first),ae(o=re())&&(n._iconSuffixContainer=o.first),ae(o=re())&&(n._textSuffixContainer=o.first),ae(o=re())&&(n._floatingLabel=o.first),ae(o=re())&&(n._notchedOutline=o.first),ae(o=re())&&(n._lineRipple=o.first)}},hostAttrs:[1,"mat-mdc-form-field"],hostVars:38,hostBindings:function(i,n){i&2&&RA("mat-mdc-form-field-label-always-float",n._shouldAlwaysFloat())("mat-mdc-form-field-has-icon-prefix",n._hasIconPrefix)("mat-mdc-form-field-has-icon-suffix",n._hasIconSuffix)("mat-form-field-invalid",n._control.errorState)("mat-form-field-disabled",n._control.disabled)("mat-form-field-autofilled",n._control.autofilled)("mat-form-field-appearance-fill",n.appearance=="fill")("mat-form-field-appearance-outline",n.appearance=="outline")("mat-form-field-hide-placeholder",n._hasFloatingLabel()&&!n._shouldLabelFloat())("mat-primary",n.color!=="accent"&&n.color!=="warn")("mat-accent",n.color==="accent")("mat-warn",n.color==="warn")("ng-untouched",n._shouldForward("untouched"))("ng-touched",n._shouldForward("touched"))("ng-pristine",n._shouldForward("pristine"))("ng-dirty",n._shouldForward("dirty"))("ng-valid",n._shouldForward("valid"))("ng-invalid",n._shouldForward("invalid"))("ng-pending",n._shouldForward("pending"))},inputs:{hideRequiredMarker:"hideRequiredMarker",color:"color",floatLabel:"floatLabel",appearance:"appearance",subscriptSizing:"subscriptSizing",hintLabel:"hintLabel"},exportAs:["matFormField"],features:[Bt([{provide:tu,useExisting:t},{provide:UG,useExisting:t}])],ngContentSelectors:XnA,decls:18,vars:21,consts:[["labelTemplate",""],["textField",""],["iconPrefixContainer",""],["textPrefixContainer",""],["textSuffixContainer",""],["iconSuffixContainer",""],[1,"mat-mdc-text-field-wrapper","mdc-text-field",3,"click"],[1,"mat-mdc-form-field-focus-overlay"],[1,"mat-mdc-form-field-flex"],["matFormFieldNotchedOutline","",3,"matFormFieldNotchedOutlineOpen"],[1,"mat-mdc-form-field-icon-prefix"],[1,"mat-mdc-form-field-text-prefix"],[1,"mat-mdc-form-field-infix"],[3,"ngTemplateOutlet"],[1,"mat-mdc-form-field-text-suffix"],[1,"mat-mdc-form-field-icon-suffix"],["matFormFieldLineRipple",""],["aria-atomic","true","aria-live","polite",1,"mat-mdc-form-field-subscript-wrapper","mat-mdc-form-field-bottom-align"],[1,"mat-mdc-form-field-error-wrapper"],[1,"mat-mdc-form-field-hint-wrapper"],["matFormFieldFloatingLabel","",3,"floating","monitorResize","id"],["aria-hidden","true",1,"mat-mdc-form-field-required-marker","mdc-floating-label--required"],[3,"id"],[1,"mat-mdc-form-field-hint-spacer"]],template:function(i,n){if(i&1&&(Rt(ZnA),Et(0,eoA,1,1,"ng-template",null,0,$C),B(2,"div",6,1),U("click",function(a){return n._control.onContainerClick(a)}),O(4,toA,1,0,"div",7),B(5,"div",8),O(6,ooA,2,2,"div",9),O(7,aoA,3,0,"div",10),O(8,roA,3,0,"div",11),B(9,"div",12),O(10,loA,1,1,null,13),Ve(11),Q(),O(12,goA,3,0,"div",14),O(13,coA,3,0,"div",15),Q(),O(14,CoA,1,0,"div",16),Q(),B(15,"div",17),O(16,IoA,2,0,"div",18)(17,BoA,5,1,"div",19),Q()),i&2){let o;u(2),RA("mdc-text-field--filled",!n._hasOutline())("mdc-text-field--outlined",n._hasOutline())("mdc-text-field--no-label",!n._hasFloatingLabel())("mdc-text-field--disabled",n._control.disabled)("mdc-text-field--invalid",n._control.errorState),u(2),Y(!n._hasOutline()&&!n._control.disabled?4:-1),u(2),Y(n._hasOutline()?6:-1),u(),Y(n._hasIconPrefix?7:-1),u(),Y(n._hasTextPrefix?8:-1),u(2),Y(!n._hasOutline()||n._forceDisplayInfixLabel()?10:-1),u(2),Y(n._hasTextSuffix?12:-1),u(),Y(n._hasIconSuffix?13:-1),u(),Y(n._hasOutline()?-1:14),u(),RA("mat-mdc-form-field-subscript-dynamic-size",n.subscriptSizing==="dynamic");let a=n._getSubscriptMessageType();u(),Y((o=a)==="error"?16:o==="hint"?17:-1)}},dependencies:[kG,RG,Jc,_G,s1],styles:[`.mdc-text-field{display:inline-flex;align-items:baseline;padding:0 16px;position:relative;box-sizing:border-box;overflow:hidden;will-change:opacity,transform,color;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.mdc-text-field__input{width:100%;min-width:0;border:none;border-radius:0;background:none;padding:0;-moz-appearance:none;-webkit-appearance:none;height:28px}.mdc-text-field__input::-webkit-calendar-picker-indicator,.mdc-text-field__input::-webkit-search-cancel-button{display:none}.mdc-text-field__input::-ms-clear{display:none}.mdc-text-field__input:focus{outline:none}.mdc-text-field__input:invalid{box-shadow:none}.mdc-text-field__input::placeholder{opacity:0}.mdc-text-field__input::-moz-placeholder{opacity:0}.mdc-text-field__input::-webkit-input-placeholder{opacity:0}.mdc-text-field__input:-ms-input-placeholder{opacity:0}.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mdc-text-field--focused .mdc-text-field__input::placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{opacity:1}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-moz-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-webkit-input-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive:-ms-input-placeholder{opacity:0}.mdc-text-field--outlined .mdc-text-field__input,.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input{height:100%}.mdc-text-field--outlined .mdc-text-field__input{display:flex;border:none !important;background-color:rgba(0,0,0,0)}.mdc-text-field--disabled .mdc-text-field__input{pointer-events:auto}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mat-form-field-filled-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mat-form-field-filled-caret-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mat-form-field-outlined-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mat-form-field-outlined-caret-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mat-form-field-filled-error-caret-color, var(--mat-sys-error))}.mdc-text-field--outlined.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mat-form-field-outlined-error-caret-color, var(--mat-sys-error))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-text-field__input{color:var(--mat-form-field-filled-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-text-field__input{color:var(--mat-form-field-outlined-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-text-field--disabled .mdc-text-field__input{background-color:Window}}.mdc-text-field--filled{height:56px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:var(--mat-form-field-filled-container-shape, var(--mat-sys-corner-extra-small));border-top-right-radius:var(--mat-form-field-filled-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--mat-form-field-filled-container-color, var(--mat-sys-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled{background-color:var(--mat-form-field-filled-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 4%, transparent))}.mdc-text-field--outlined{height:56px;overflow:visible;padding-right:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)));padding-left:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)) + 4px)}[dir=rtl] .mdc-text-field--outlined{padding-right:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)) + 4px);padding-left:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)))}.mdc-floating-label{position:absolute;left:0;transform-origin:left top;line-height:1.15rem;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text;overflow:hidden;will-change:transform}[dir=rtl] .mdc-floating-label{right:0;left:auto;transform-origin:right top;text-align:right}.mdc-text-field .mdc-floating-label{top:50%;transform:translateY(-50%);pointer-events:none}.mdc-notched-outline .mdc-floating-label{display:inline-block;position:relative;max-width:100%}.mdc-text-field--outlined .mdc-floating-label{left:4px;right:auto}[dir=rtl] .mdc-text-field--outlined .mdc-floating-label{left:auto;right:4px}.mdc-text-field--filled .mdc-floating-label{left:16px;right:auto}[dir=rtl] .mdc-text-field--filled .mdc-floating-label{left:auto;right:16px}.mdc-text-field--disabled .mdc-floating-label{cursor:default}@media(forced-colors: active){.mdc-text-field--disabled .mdc-floating-label{z-index:1}}.mdc-text-field--filled.mdc-text-field--no-label .mdc-floating-label{display:none}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mat-form-field-filled-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-filled-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mat-form-field-filled-hover-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-floating-label{color:var(--mat-form-field-filled-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mat-form-field-filled-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-filled-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mat-form-field-filled-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--filled .mdc-floating-label{font-family:var(--mat-form-field-filled-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-form-field-filled-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-form-field-filled-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-form-field-filled-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mat-form-field-outlined-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-outlined-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mat-form-field-outlined-hover-label-text-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-floating-label{color:var(--mat-form-field-outlined-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mat-form-field-outlined-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-outlined-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mat-form-field-outlined-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined .mdc-floating-label{font-family:var(--mat-form-field-outlined-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-form-field-outlined-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-form-field-outlined-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-form-field-outlined-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-floating-label--float-above{cursor:auto;transform:translateY(-106%) scale(0.75)}.mdc-text-field--filled .mdc-floating-label--float-above{transform:translateY(-106%) scale(0.75)}.mdc-text-field--outlined .mdc-floating-label--float-above{transform:translateY(-37.25px) scale(1);font-size:.75rem}.mdc-notched-outline .mdc-floating-label--float-above{text-overflow:clip}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:133.3333333333%}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{transform:translateY(-34.75px) scale(0.75)}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:1px;margin-right:0;content:"*"}[dir=rtl] .mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:0;margin-right:1px}.mdc-notched-outline{display:flex;position:absolute;top:0;right:0;left:0;box-sizing:border-box;width:100%;max-width:100%;height:100%;text-align:left;pointer-events:none}[dir=rtl] .mdc-notched-outline{text-align:right}.mdc-text-field--outlined .mdc-notched-outline{z-index:1}.mat-mdc-notch-piece{box-sizing:border-box;height:100%;pointer-events:none;border:none;border-top:1px solid;border-bottom:1px solid}.mdc-text-field--focused .mat-mdc-notch-piece{border-width:2px}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-outline-color, var(--mat-sys-outline));border-width:var(--mat-form-field-outlined-outline-width, 1px)}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-hover-outline-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-focus-outline-color, var(--mat-sys-primary))}.mdc-text-field--outlined.mdc-text-field--disabled .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-notched-outline .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-hover-outline-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-focus-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline .mat-mdc-notch-piece{border-width:var(--mat-form-field-outlined-focus-outline-width, 2px)}.mdc-notched-outline__leading{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading{width:max(12px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)))}[dir=rtl] .mdc-notched-outline__leading{border-left:none;border-right:1px solid;border-bottom-left-radius:0;border-top-left-radius:0;border-top-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__trailing{flex-grow:1;border-left:none;border-right:1px solid;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}[dir=rtl] .mdc-notched-outline__trailing{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__notch{flex:0 0 auto;width:auto}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__notch{max-width:min(var(--mat-form-field-notch-max-width, 100%),calc(100% - max(12px, var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))) * 2))}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{max-width:min(100%,calc(100% - max(12px, var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))) * 2))}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:1px}.mdc-text-field--focused.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:2px}.mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:0;padding-right:8px;border-top:none}[dir=rtl] .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:8px;padding-right:0}.mdc-notched-outline--no-label .mdc-notched-outline__notch{display:none}.mdc-line-ripple::before,.mdc-line-ripple::after{position:absolute;bottom:0;left:0;width:100%;border-bottom-style:solid;content:""}.mdc-line-ripple::before{z-index:1;border-bottom-width:var(--mat-form-field-filled-active-indicator-height, 1px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-active-indicator-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-hover-active-indicator-color, var(--mat-sys-on-surface))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-disabled-active-indicator-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-error-active-indicator-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-error-hover-active-indicator-color, var(--mat-sys-on-error-container))}.mdc-line-ripple::after{transform:scaleX(0);opacity:0;z-index:2}.mdc-text-field--filled .mdc-line-ripple::after{border-bottom-width:var(--mat-form-field-filled-focus-active-indicator-height, 2px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mat-form-field-filled-focus-active-indicator-color, var(--mat-sys-primary))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mat-form-field-filled-error-focus-active-indicator-color, var(--mat-sys-error))}.mdc-line-ripple--active::after{transform:scaleX(1);opacity:1}.mdc-line-ripple--deactivating::after{opacity:0}.mdc-text-field--disabled{pointer-events:none}.mat-mdc-form-field-textarea-control{vertical-align:middle;resize:vertical;box-sizing:border-box;height:auto;margin:0;padding:0;border:none;overflow:auto}.mat-mdc-form-field-input-control.mat-mdc-form-field-input-control{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font:inherit;letter-spacing:inherit;text-decoration:inherit;text-transform:inherit;border:none}.mat-mdc-form-field .mat-mdc-floating-label.mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;line-height:normal;pointer-events:all;will-change:auto}.mat-mdc-form-field:not(.mat-form-field-disabled) .mat-mdc-floating-label.mdc-floating-label{cursor:inherit}.mdc-text-field--no-label:not(.mdc-text-field--textarea) .mat-mdc-form-field-input-control.mdc-text-field__input,.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control{height:auto}.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control.mdc-text-field__input[type=color]{height:23px}.mat-mdc-text-field-wrapper{height:auto;flex:auto;will-change:auto}.mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-left:0;--mat-mdc-form-field-label-offset-x: -16px}.mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:0}[dir=rtl] .mat-mdc-text-field-wrapper{padding-left:16px;padding-right:16px}[dir=rtl] .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-left:0}[dir=rtl] .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-right:0}.mat-form-field-disabled .mdc-text-field__input::placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-label-always-float .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}.mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .mat-mdc-floating-label{left:auto;right:auto}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-text-field__input{display:inline-block}.mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field .mdc-notched-outline__notch{padding-top:0}.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:1px solid rgba(0,0,0,0)}[dir=rtl] .mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:none;border-right:1px solid rgba(0,0,0,0)}.mat-mdc-form-field-infix{min-height:var(--mat-form-field-container-height, 56px);padding-top:var(--mat-form-field-filled-with-label-container-padding-top, 24px);padding-bottom:var(--mat-form-field-filled-with-label-container-padding-bottom, 8px)}.mdc-text-field--outlined .mat-mdc-form-field-infix,.mdc-text-field--no-label .mat-mdc-form-field-infix{padding-top:var(--mat-form-field-container-vertical-padding, 16px);padding-bottom:var(--mat-form-field-container-vertical-padding, 16px)}.mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:calc(var(--mat-form-field-container-height, 56px)/2)}.mdc-text-field--filled .mat-mdc-floating-label{display:var(--mat-form-field-filled-label-display, block)}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY(calc(calc(6.75px + var(--mat-form-field-container-height, 56px) / 2) * -1)) scale(var(--mat-mdc-form-field-floating-label-scale, 0.75));transform:var(--mat-mdc-form-field-label-transform)}@keyframes _mat-form-field-subscript-animation{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.mat-mdc-form-field-subscript-wrapper{box-sizing:border-box;width:100%;position:relative}.mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-error-wrapper{position:absolute;top:0;left:0;right:0;padding:0 16px;opacity:1;transform:translateY(0);animation:_mat-form-field-subscript-animation 0ms cubic-bezier(0.55, 0, 0.55, 0.2)}.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-error-wrapper{position:static}.mat-mdc-form-field-bottom-align::before{content:"";display:inline-block;height:16px}.mat-mdc-form-field-bottom-align.mat-mdc-form-field-subscript-dynamic-size::before{content:unset}.mat-mdc-form-field-hint-end{order:1}.mat-mdc-form-field-hint-wrapper{display:flex}.mat-mdc-form-field-hint-spacer{flex:1 0 1em}.mat-mdc-form-field-error{display:block;color:var(--mat-form-field-error-text-color, var(--mat-sys-error))}.mat-mdc-form-field-subscript-wrapper,.mat-mdc-form-field-bottom-align::before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-subscript-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-form-field-subscript-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-form-field-subscript-text-size, var(--mat-sys-body-small-size));letter-spacing:var(--mat-form-field-subscript-text-tracking, var(--mat-sys-body-small-tracking));font-weight:var(--mat-form-field-subscript-text-weight, var(--mat-sys-body-small-weight))}.mat-mdc-form-field-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;opacity:0;pointer-events:none;background-color:var(--mat-form-field-state-layer-color, var(--mat-sys-on-surface))}.mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-focus-state-layer-opacity, 0)}select.mat-mdc-form-field-input-control{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(0,0,0,0);display:inline-flex;box-sizing:border-box}select.mat-mdc-form-field-input-control:not(:disabled){cursor:pointer}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option{color:var(--mat-form-field-select-option-text-color, var(--mat-sys-neutral10))}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option:disabled{color:var(--mat-form-field-select-disabled-option-text-color, color-mix(in srgb, var(--mat-sys-neutral10) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{content:"";width:0;height:0;border-left:5px solid rgba(0,0,0,0);border-right:5px solid rgba(0,0,0,0);border-top:5px solid;position:absolute;right:0;top:50%;margin-top:-2.5px;pointer-events:none;color:var(--mat-form-field-enabled-select-arrow-color, var(--mat-sys-on-surface-variant))}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{right:auto;left:0}.mat-mdc-form-field-type-mat-native-select.mat-focused .mat-mdc-form-field-infix::after{color:var(--mat-form-field-focus-select-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field-type-mat-native-select.mat-form-field-disabled .mat-mdc-form-field-infix::after{color:var(--mat-form-field-disabled-select-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:15px}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:0;padding-left:15px}@media(forced-colors: active){.mat-form-field-appearance-fill .mat-mdc-text-field-wrapper{outline:solid 1px}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-form-field-disabled .mat-mdc-text-field-wrapper{outline-color:GrayText}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-focused .mat-mdc-text-field-wrapper{outline:dashed 3px}}@media(forced-colors: active){.mat-mdc-form-field.mat-focused .mdc-notched-outline{border:dashed 3px}}.mat-mdc-form-field-input-control[type=date],.mat-mdc-form-field-input-control[type=datetime],.mat-mdc-form-field-input-control[type=datetime-local],.mat-mdc-form-field-input-control[type=month],.mat-mdc-form-field-input-control[type=week],.mat-mdc-form-field-input-control[type=time]{line-height:1}.mat-mdc-form-field-input-control::-webkit-datetime-edit{line-height:1;padding:0;margin-bottom:-2px}.mat-mdc-form-field{--mat-mdc-form-field-floating-label-scale: 0.75;display:inline-flex;flex-direction:column;min-width:0;text-align:left;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-container-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-form-field-container-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-form-field-container-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-form-field-container-text-tracking, var(--mat-sys-body-large-tracking));font-weight:var(--mat-form-field-container-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-floating-label--float-above{font-size:calc(var(--mat-form-field-outlined-label-text-populated-size)*var(--mat-mdc-form-field-floating-label-scale))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:var(--mat-form-field-outlined-label-text-populated-size)}[dir=rtl] .mat-mdc-form-field{text-align:right}.mat-mdc-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-mdc-text-field-wrapper{width:100%;z-index:0}.mat-mdc-form-field-icon-prefix,.mat-mdc-form-field-icon-suffix{align-self:center;line-height:0;pointer-events:auto;position:relative;z-index:1}.mat-mdc-form-field-icon-prefix>.mat-icon,.mat-mdc-form-field-icon-suffix>.mat-icon{padding:0 12px;box-sizing:content-box}.mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-leading-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-disabled-leading-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-disabled-trailing-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-invalid .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-trailing-icon-color, var(--mat-sys-error))}.mat-form-field-invalid:not(.mat-focused):not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-hover-trailing-icon-color, var(--mat-sys-on-error-container))}.mat-form-field-invalid.mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-focus-trailing-icon-color, var(--mat-sys-error))}.mat-mdc-form-field-icon-prefix,[dir=rtl] .mat-mdc-form-field-icon-suffix{padding:0 4px 0 0}.mat-mdc-form-field-icon-suffix,[dir=rtl] .mat-mdc-form-field-icon-prefix{padding:0 0 0 4px}.mat-mdc-form-field-subscript-wrapper .mat-icon,.mat-mdc-form-field label .mat-icon{width:1em;height:1em;font-size:inherit}.mat-mdc-form-field-infix{flex:auto;min-width:0;width:180px;position:relative;box-sizing:border-box}.mat-mdc-form-field-infix:has(textarea[cols]){width:auto}.mat-mdc-form-field .mdc-notched-outline__notch{margin-left:-1px;-webkit-clip-path:inset(-9em -999em -9em 1px);clip-path:inset(-9em -999em -9em 1px)}[dir=rtl] .mat-mdc-form-field .mdc-notched-outline__notch{margin-left:0;margin-right:-1px;-webkit-clip-path:inset(-9em 1px -9em -999em);clip-path:inset(-9em 1px -9em -999em)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-floating-label{transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1),color 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input{transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::-moz-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::-webkit-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input:-ms-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field--filled:not(.mdc-ripple-upgraded):focus .mdc-text-field__ripple::before{transition-duration:75ms}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-line-ripple::after{transition:transform 180ms cubic-bezier(0.4, 0, 0.2, 1),opacity 180ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field.mat-form-field-animations-enabled .mat-mdc-form-field-error-wrapper{animation-duration:300ms}.mdc-notched-outline .mdc-floating-label{max-width:calc(100% + 1px)}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:calc(133.3333333333% + 1px)} +`],encapsulation:2,changeDetection:0})}return t})();var Ya=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fp,Ko,fi]})}return t})();var TG=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["ng-component"]],hostAttrs:["cdk-text-field-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[`textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0 !important;box-sizing:content-box !important;height:auto !important;overflow:hidden !important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0 !important;box-sizing:content-box !important;height:0 !important}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms} +`],encapsulation:2,changeDetection:0})}return t})(),foA={passive:!0},JG=(()=>{class t{_platform=w(gi);_ngZone=w(qe);_renderer=w(Kr).createRenderer(null,null);_styleLoader=w(eo);_monitoredElements=new Map;constructor(){}monitor(A){if(!this._platform.isBrowser)return ar;this._styleLoader.load(TG);let i=Ds(A),n=this._monitoredElements.get(i);if(n)return n.subject;let o=new ie,a="cdk-text-field-autofilled",r=l=>{l.animationName==="cdk-text-field-autofill-start"&&!i.classList.contains(a)?(i.classList.add(a),this._ngZone.run(()=>o.next({target:l.target,isAutofilled:!0}))):l.animationName==="cdk-text-field-autofill-end"&&i.classList.contains(a)&&(i.classList.remove(a),this._ngZone.run(()=>o.next({target:l.target,isAutofilled:!1})))},s=this._ngZone.runOutsideAngular(()=>(i.classList.add("cdk-text-field-autofill-monitored"),this._renderer.listen(i,"animationstart",r,foA)));return this._monitoredElements.set(i,{subject:o,unlisten:s}),o}stopMonitoring(A){let i=Ds(A),n=this._monitoredElements.get(i);n&&(n.unlisten(),n.subject.complete(),i.classList.remove("cdk-text-field-autofill-monitored"),i.classList.remove("cdk-text-field-autofilled"),this._monitoredElements.delete(i))}ngOnDestroy(){this._monitoredElements.forEach((A,i)=>this.stopMonitoring(i))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var _p=(()=>{class t{_elementRef=w(ce);_platform=w(gi);_ngZone=w(qe);_renderer=w(Pi);_resizeEvents=new ie;_previousValue;_initialHeight;_destroyed=new ie;_listenerCleanups;_minRows;_maxRows;_enabled=!0;_previousMinRows=-1;_textareaElement;get minRows(){return this._minRows}set minRows(A){this._minRows=zs(A),this._setMinHeight()}get maxRows(){return this._maxRows}set maxRows(A){this._maxRows=zs(A),this._setMaxHeight()}get enabled(){return this._enabled}set enabled(A){this._enabled!==A&&((this._enabled=A)?this.resizeToFitContent(!0):this.reset())}get placeholder(){return this._textareaElement.placeholder}set placeholder(A){this._cachedPlaceholderHeight=void 0,A?this._textareaElement.setAttribute("placeholder",A):this._textareaElement.removeAttribute("placeholder"),this._cacheTextareaPlaceholderHeight()}_cachedLineHeight;_cachedPlaceholderHeight;_document=w(ti);_hasFocus=!1;_isViewInited=!1;constructor(){w(eo).load(TG),this._textareaElement=this._elementRef.nativeElement}_setMinHeight(){let A=this.minRows&&this._cachedLineHeight?`${this.minRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.minHeight=A)}_setMaxHeight(){let A=this.maxRows&&this._cachedLineHeight?`${this.maxRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.maxHeight=A)}ngAfterViewInit(){this._platform.isBrowser&&(this._initialHeight=this._textareaElement.style.height,this.resizeToFitContent(),this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[this._renderer.listen("window","resize",()=>this._resizeEvents.next()),this._renderer.listen(this._textareaElement,"focus",this._handleFocusEvent),this._renderer.listen(this._textareaElement,"blur",this._handleFocusEvent)],this._resizeEvents.pipe(jI(16)).subscribe(()=>{this._cachedLineHeight=this._cachedPlaceholderHeight=void 0,this.resizeToFitContent(!0)})}),this._isViewInited=!0,this.resizeToFitContent(!0))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A()),this._resizeEvents.complete(),this._destroyed.next(),this._destroyed.complete()}_cacheTextareaLineHeight(){if(this._cachedLineHeight)return;let A=this._textareaElement.cloneNode(!1),i=A.style;A.rows=1,i.position="absolute",i.visibility="hidden",i.border="none",i.padding="0",i.height="",i.minHeight="",i.maxHeight="",i.top=i.bottom=i.left=i.right="auto",i.overflow="hidden",this._textareaElement.parentNode.appendChild(A),this._cachedLineHeight=A.clientHeight,A.remove(),this._setMinHeight(),this._setMaxHeight()}_measureScrollHeight(){let A=this._textareaElement,i=A.style.marginBottom||"",n=this._platform.FIREFOX,o=this._hasFocus,a=n?"cdk-textarea-autosize-measuring-firefox":"cdk-textarea-autosize-measuring";o&&(A.style.marginBottom=`${A.clientHeight}px`),A.classList.add(a);let r=A.scrollHeight-4;return A.classList.remove(a),o&&(A.style.marginBottom=i),r}_cacheTextareaPlaceholderHeight(){if(!this._isViewInited||this._cachedPlaceholderHeight!=null)return;if(!this.placeholder){this._cachedPlaceholderHeight=0;return}let A=this._textareaElement.value;this._textareaElement.value=this._textareaElement.placeholder,this._cachedPlaceholderHeight=this._measureScrollHeight(),this._textareaElement.value=A}_handleFocusEvent=A=>{this._hasFocus=A.type==="focus"};ngDoCheck(){this._platform.isBrowser&&this.resizeToFitContent()}resizeToFitContent(A=!1){if(!this._enabled||(this._cacheTextareaLineHeight(),this._cacheTextareaPlaceholderHeight(),!this._cachedLineHeight))return;let i=this._elementRef.nativeElement,n=i.value;if(!A&&this._minRows===this._previousMinRows&&n===this._previousValue)return;let o=this._measureScrollHeight(),a=Math.max(o,this._cachedPlaceholderHeight||0);i.style.height=`${a}px`,this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame<"u"?requestAnimationFrame(()=>this._scrollToCaretPosition(i)):setTimeout(()=>this._scrollToCaretPosition(i))}),this._previousValue=n,this._previousMinRows=this._minRows}reset(){this._initialHeight!==void 0&&(this._textareaElement.style.height=this._initialHeight)}_noopInputHandler(){}_scrollToCaretPosition(A){let{selectionStart:i,selectionEnd:n}=A;!this._destroyed.isStopped&&this._hasFocus&&A.setSelectionRange(i,n)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["textarea","cdkTextareaAutosize",""]],hostAttrs:["rows","1",1,"cdk-textarea-autosize"],hostBindings:function(i,n){i&1&&U("input",function(){return n._noopInputHandler()})},inputs:{minRows:[0,"cdkAutosizeMinRows","minRows"],maxRows:[0,"cdkAutosizeMaxRows","maxRows"],enabled:[2,"cdkTextareaAutosize","enabled",Be],placeholder:"placeholder"},exportAs:["cdkTextareaAutosize"]})}return t})(),lB=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})();var YG=new kA("MAT_INPUT_VALUE_ACCESSOR");var gB=(()=>{class t{isErrorState(A,i){return!!(A&&A.invalid&&(A.touched||i&&i.submitted))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var cB=class{_defaultMatcher;ngControl;_parentFormGroup;_parentForm;_stateChanges;errorState=!1;matcher;constructor(e,A,i,n,o){this._defaultMatcher=e,this.ngControl=A,this._parentFormGroup=i,this._parentForm=n,this._stateChanges=o}updateErrorState(){let e=this.errorState,A=this._parentFormGroup||this._parentForm,i=this.matcher||this._defaultMatcher,n=this.ngControl?this.ngControl.control:null,o=i?.isErrorState(n,A)??!1;o!==e&&(this.errorState=o,this._stateChanges.next())}};var poA=["button","checkbox","file","hidden","image","radio","range","reset","submit"],moA=new kA("MAT_INPUT_CONFIG"),ua=(()=>{class t{_elementRef=w(ce);_platform=w(gi);ngControl=w(Hs,{optional:!0,self:!0});_autofillMonitor=w(JG);_ngZone=w(qe);_formField=w(tu,{optional:!0});_renderer=w(Pi);_uid=w(In).getId("mat-input-");_previousNativeValue;_inputValueAccessor;_signalBasedValueAccessor;_previousPlaceholder=null;_errorStateTracker;_config=w(moA,{optional:!0});_cleanupIosKeyup;_cleanupWebkitWheel;_isServer=!1;_isNativeSelect=!1;_isTextarea=!1;_isInFormField=!1;focused=!1;stateChanges=new ie;controlType="mat-input";autofilled=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=mr(A),this.focused&&(this.focused=!1,this.stateChanges.next())}_disabled=!1;get id(){return this._id}set id(A){this._id=A||this._uid}_id;placeholder;name;get required(){return this._required??this.ngControl?.control?.hasValidator(Ys.required)??!1}set required(A){this._required=mr(A)}_required;get type(){return this._type}set type(A){this._type=A||"text",this._validateType(),!this._isTextarea&&xb().has(this._type)&&(this._elementRef.nativeElement.type=this._type)}_type="text";get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}userAriaDescribedBy;get value(){return this._signalBasedValueAccessor?this._signalBasedValueAccessor.value():this._inputValueAccessor.value}set value(A){A!==this.value&&(this._signalBasedValueAccessor?this._signalBasedValueAccessor.value.set(A):this._inputValueAccessor.value=A,this.stateChanges.next())}get readonly(){return this._readonly}set readonly(A){this._readonly=mr(A)}_readonly=!1;disabledInteractive;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}_neverEmptyInputTypes=["date","datetime","datetime-local","month","time","week"].filter(A=>xb().has(A));constructor(){let A=w(eB,{optional:!0}),i=w(i2,{optional:!0}),n=w(gB),o=w(YG,{optional:!0,self:!0}),a=this._elementRef.nativeElement,r=a.nodeName.toLowerCase();o?VI(o.value)?this._signalBasedValueAccessor=o:this._inputValueAccessor=o:this._inputValueAccessor=a,this._previousNativeValue=this.value,this.id=this.id,this._platform.IOS&&this._ngZone.runOutsideAngular(()=>{this._cleanupIosKeyup=this._renderer.listen(a,"keyup",this._iOSKeyupListener)}),this._errorStateTracker=new cB(n,this.ngControl,i,A,this.stateChanges),this._isServer=!this._platform.isBrowser,this._isNativeSelect=r==="select",this._isTextarea=r==="textarea",this._isInFormField=!!this._formField,this.disabledInteractive=this._config?.disabledInteractive||!1,this._isNativeSelect&&(this.controlType=a.multiple?"mat-native-select-multiple":"mat-native-select"),this._signalBasedValueAccessor&&Ao(()=>{this._signalBasedValueAccessor.value(),this.stateChanges.next()})}ngAfterViewInit(){this._platform.isBrowser&&this._autofillMonitor.monitor(this._elementRef.nativeElement).subscribe(A=>{this.autofilled=A.isAutofilled,this.stateChanges.next()})}ngOnChanges(){this.stateChanges.next()}ngOnDestroy(){this.stateChanges.complete(),this._platform.isBrowser&&this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement),this._cleanupIosKeyup?.(),this._cleanupWebkitWheel?.()}ngDoCheck(){this.ngControl&&(this.updateErrorState(),this.ngControl.disabled!==null&&this.ngControl.disabled!==this.disabled&&(this.disabled=this.ngControl.disabled,this.stateChanges.next())),this._dirtyCheckNativeValue(),this._dirtyCheckPlaceholder()}focus(A){this._elementRef.nativeElement.focus(A)}updateErrorState(){this._errorStateTracker.updateErrorState()}_focusChanged(A){if(A!==this.focused){if(!this._isNativeSelect&&A&&this.disabled&&this.disabledInteractive){let i=this._elementRef.nativeElement;i.type==="number"?(i.type="text",i.setSelectionRange(0,0),i.type="number"):i.setSelectionRange(0,0)}this.focused=A,this.stateChanges.next()}}_onInput(){}_dirtyCheckNativeValue(){let A=this._elementRef.nativeElement.value;this._previousNativeValue!==A&&(this._previousNativeValue=A,this.stateChanges.next())}_dirtyCheckPlaceholder(){let A=this._getPlaceholder();if(A!==this._previousPlaceholder){let i=this._elementRef.nativeElement;this._previousPlaceholder=A,A?i.setAttribute("placeholder",A):i.removeAttribute("placeholder")}}_getPlaceholder(){return this.placeholder||null}_validateType(){poA.indexOf(this._type)>-1}_isNeverEmpty(){return this._neverEmptyInputTypes.indexOf(this._type)>-1}_isBadInput(){let A=this._elementRef.nativeElement.validity;return A&&A.badInput}get empty(){return!this._isNeverEmpty()&&!this._elementRef.nativeElement.value&&!this._isBadInput()&&!this.autofilled}get shouldLabelFloat(){if(this._isNativeSelect){let A=this._elementRef.nativeElement,i=A.options[0];return this.focused||A.multiple||!this.empty||!!(A.selectedIndex>-1&&i&&i.label)}else return this.focused&&!this.disabled||!this.empty}get describedByIds(){return this._elementRef.nativeElement.getAttribute("aria-describedby")?.split(" ")||[]}setDescribedByIds(A){let i=this._elementRef.nativeElement;A.length?i.setAttribute("aria-describedby",A.join(" ")):i.removeAttribute("aria-describedby")}onContainerClick(){this.focused||this.focus()}_isInlineSelect(){let A=this._elementRef.nativeElement;return this._isNativeSelect&&(A.multiple||A.size>1)}_iOSKeyupListener=A=>{let i=A.target;!i.value&&i.selectionStart===0&&i.selectionEnd===0&&(i.setSelectionRange(1,1),i.setSelectionRange(0,0))};_getReadonlyAttribute(){return this._isNativeSelect?null:this.readonly||this.disabled&&this.disabledInteractive?"true":null}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["input","matInput",""],["textarea","matInput",""],["select","matNativeControl",""],["input","matNativeControl",""],["textarea","matNativeControl",""]],hostAttrs:[1,"mat-mdc-input-element"],hostVars:21,hostBindings:function(i,n){i&1&&U("focus",function(){return n._focusChanged(!0)})("blur",function(){return n._focusChanged(!1)})("input",function(){return n._onInput()}),i&2&&(ha("id",n.id)("disabled",n.disabled&&!n.disabledInteractive)("required",n.required),te("name",n.name||null)("readonly",n._getReadonlyAttribute())("aria-disabled",n.disabled&&n.disabledInteractive?"true":null)("aria-invalid",n.empty&&n.required?null:n.errorState)("aria-required",n.required)("id",n.id),RA("mat-input-server",n._isServer)("mat-mdc-form-field-textarea-control",n._isInFormField&&n._isTextarea)("mat-mdc-form-field-input-control",n._isInFormField)("mat-mdc-input-disabled-interactive",n.disabledInteractive)("mdc-text-field__input",n._isInFormField)("mat-mdc-native-select-inline",n._isInlineSelect()))},inputs:{disabled:"disabled",id:"id",placeholder:"placeholder",name:"name",required:"required",type:"type",errorStateMatcher:"errorStateMatcher",userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],value:"value",readonly:"readonly",disabledInteractive:[2,"disabledInteractive","disabledInteractive",Be]},exportAs:["matInput"],features:[Bt([{provide:eu,useExisting:t}]),Yt]})}return t})(),Ps=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Ya,Ya,lB,fi]})}return t})();var rn=(function(t){return t[t.State=0]="State",t[t.Transition=1]="Transition",t[t.Sequence=2]="Sequence",t[t.Group=3]="Group",t[t.Animate=4]="Animate",t[t.Keyframes=5]="Keyframes",t[t.Style=6]="Style",t[t.Trigger=7]="Trigger",t[t.Reference=8]="Reference",t[t.AnimateChild=9]="AnimateChild",t[t.AnimateRef=10]="AnimateRef",t[t.Query=11]="Query",t[t.Stagger=12]="Stagger",t})(rn||{}),Ng="*";function HG(t,e=null){return{type:rn.Sequence,steps:t,options:e}}function Jb(t){return{type:rn.Style,styles:t,offset:null}}var z0=class{_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_originalOnDoneFns=[];_originalOnStartFns=[];_started=!1;_destroyed=!1;_finished=!1;_position=0;parentPlayer=null;totalTime;constructor(e=0,A=0){this.totalTime=e+A}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}init(){}play(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}triggerMicrotask(){queueMicrotask(()=>this._onFinish())}_onStart(){this._onStartFns.forEach(e=>e()),this._onStartFns=[]}pause(){}restart(){}finish(){this._onFinish()}destroy(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this._started=!1,this._finished=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}setPosition(e){this._position=this.totalTime?e*this.totalTime:1}getPosition(){return this.totalTime?this._position/this.totalTime:1}triggerCallback(e){let A=e=="start"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},IB=class{_onDoneFns=[];_onStartFns=[];_finished=!1;_started=!1;_destroyed=!1;_onDestroyFns=[];parentPlayer=null;totalTime=0;players;constructor(e){this.players=e;let A=0,i=0,n=0,o=this.players.length;o==0?queueMicrotask(()=>this._onFinish()):this.players.forEach(a=>{a.onDone(()=>{++A==o&&this._onFinish()}),a.onDestroy(()=>{++i==o&&this._onDestroy()}),a.onStart(()=>{++n==o&&this._onStart()})}),this.totalTime=this.players.reduce((a,r)=>Math.max(a,r.totalTime),0)}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this.players.forEach(e=>e.init())}onStart(e){this._onStartFns.push(e)}_onStart(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(e=>e()),this._onStartFns=[])}onDone(e){this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}play(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(e=>e.play())}pause(){this.players.forEach(e=>e.pause())}restart(){this.players.forEach(e=>e.restart())}finish(){this._onFinish(),this.players.forEach(e=>e.finish())}destroy(){this._onDestroy()}_onDestroy(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(e=>e.destroy()),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this.players.forEach(e=>e.reset()),this._destroyed=!1,this._finished=!1,this._started=!1}setPosition(e){let A=e*this.totalTime;this.players.forEach(i=>{let n=i.totalTime?Math.min(1,A/i.totalTime):1;i.setPosition(n)})}getPosition(){let e=this.players.reduce((A,i)=>A===null||i.totalTime>A.totalTime?i:A,null);return e!=null?e.getPosition():0}beforeDestroy(){this.players.forEach(e=>{e.beforeDestroy&&e.beforeDestroy()})}triggerCallback(e){let A=e=="start"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},iu="!";function zG(t){return new Mt(3e3,!1)}function woA(){return new Mt(3100,!1)}function DoA(){return new Mt(3101,!1)}function yoA(t){return new Mt(3001,!1)}function voA(t){return new Mt(3003,!1)}function boA(t){return new Mt(3004,!1)}function jG(t,e){return new Mt(3005,!1)}function qG(){return new Mt(3006,!1)}function VG(){return new Mt(3007,!1)}function WG(t,e){return new Mt(3008,!1)}function ZG(t){return new Mt(3002,!1)}function XG(t,e,A,i,n){return new Mt(3010,!1)}function $G(){return new Mt(3011,!1)}function AK(){return new Mt(3012,!1)}function eK(){return new Mt(3200,!1)}function tK(){return new Mt(3202,!1)}function iK(){return new Mt(3013,!1)}function nK(t){return new Mt(3014,!1)}function oK(t){return new Mt(3015,!1)}function aK(t){return new Mt(3016,!1)}function rK(t,e){return new Mt(3404,!1)}function MoA(t){return new Mt(3502,!1)}function sK(t){return new Mt(3503,!1)}function lK(){return new Mt(3300,!1)}function gK(t){return new Mt(3504,!1)}function cK(t){return new Mt(3301,!1)}function CK(t,e){return new Mt(3302,!1)}function IK(t){return new Mt(3303,!1)}function dK(t,e){return new Mt(3400,!1)}function BK(t){return new Mt(3401,!1)}function EK(t){return new Mt(3402,!1)}function hK(t,e){return new Mt(3505,!1)}function P0(t){switch(t.length){case 0:return new z0;case 1:return t[0];default:return new IB(t)}}function zb(t,e,A=new Map,i=new Map){let n=[],o=[],a=-1,r=null;if(e.forEach(s=>{let l=s.get("offset"),g=l==a,C=g&&r||new Map;s.forEach((I,d)=>{let h=d,E=I;if(d!=="offset")switch(h=t.normalizePropertyName(h,n),E){case iu:E=A.get(d);break;case Ng:E=i.get(d);break;default:E=t.normalizeStyleValue(d,h,E,n);break}C.set(h,E)}),g||o.push(C),r=C,a=l}),n.length)throw MoA(n);return o}function Rp(t,e,A,i){switch(e){case"start":t.onStart(()=>i(A&&Ob(A,"start",t)));break;case"done":t.onDone(()=>i(A&&Ob(A,"done",t)));break;case"destroy":t.onDestroy(()=>i(A&&Ob(A,"destroy",t)));break}}function Ob(t,e,A){let i=A.totalTime,n=!!A.disabled,o=Np(t.element,t.triggerName,t.fromState,t.toState,e||t.phaseName,i??t.totalTime,n),a=t._data;return a!=null&&(o._data=a),o}function Np(t,e,A,i,n="",o=0,a){return{element:t,triggerName:e,fromState:A,toState:i,phaseName:n,totalTime:o,disabled:!!a}}function js(t,e,A){let i=t.get(e);return i||t.set(e,i=A),i}function Pb(t){let e=t.indexOf(":"),A=t.substring(1,e),i=t.slice(e+1);return[A,i]}var SoA=typeof document>"u"?null:document.documentElement;function Fp(t){let e=t.parentNode||t.host||null;return e===SoA?null:e}function koA(t){return t.substring(1,6)=="ebkit"}var g1=null,PG=!1;function QK(t){g1||(g1=xoA()||{},PG=g1.style?"WebkitAppearance"in g1.style:!1);let e=!0;return g1.style&&!koA(t)&&(e=t in g1.style,!e&&PG&&(e="Webkit"+t.charAt(0).toUpperCase()+t.slice(1)in g1.style)),e}function xoA(){return typeof document<"u"?document.body:null}function jb(t,e){for(;e;){if(e===t)return!0;e=Fp(e)}return!1}function qb(t,e,A){if(A)return Array.from(t.querySelectorAll(e));let i=t.querySelector(e);return i?[i]:[]}var _oA=1e3,Vb="{{",RoA="}}",Wb="ng-enter",Lp="ng-leave",nu="ng-trigger",ou=".ng-trigger",Zb="ng-animating",Gp=".ng-animating";function Hc(t){if(typeof t=="number")return t;let e=t.match(/^(-?[\.\d]+)(m?s)/);return!e||e.length<2?0:Yb(parseFloat(e[1]),e[2])}function Yb(t,e){return e==="s"?t*_oA:t}function au(t,e,A){return t.hasOwnProperty("duration")?t:FoA(t,e,A)}var NoA=/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i;function FoA(t,e,A){let i,n=0,o="";if(typeof t=="string"){let a=t.match(NoA);if(a===null)return e.push(zG(t)),{duration:0,delay:0,easing:""};i=Yb(parseFloat(a[1]),a[2]);let r=a[3];r!=null&&(n=Yb(parseFloat(r),a[4]));let s=a[5];s&&(o=s)}else i=t;if(!A){let a=!1,r=e.length;i<0&&(e.push(woA()),a=!0),n<0&&(e.push(DoA()),a=!0),a&&e.splice(r,0,zG(t))}return{duration:i,delay:n,easing:o}}function uK(t){return t.length?t[0]instanceof Map?t:t.map(e=>new Map(Object.entries(e))):[]}function Fg(t,e,A){e.forEach((i,n)=>{let o=Kp(n);A&&!A.has(n)&&A.set(n,t.style[o]),t.style[o]=i})}function s2(t,e){e.forEach((A,i)=>{let n=Kp(i);t.style[n]=""})}function dB(t){return Array.isArray(t)?t.length==1?t[0]:HG(t):t}function fK(t,e,A){let i=e.params||{},n=Xb(t);n.length&&n.forEach(o=>{i.hasOwnProperty(o)||A.push(yoA(o))})}var Hb=new RegExp(`${Vb}\\s*(.+?)\\s*${RoA}`,"g");function Xb(t){let e=[];if(typeof t=="string"){let A;for(;A=Hb.exec(t);)e.push(A[1]);Hb.lastIndex=0}return e}function BB(t,e,A){let i=`${t}`,n=i.replace(Hb,(o,a)=>{let r=e[a];return r==null&&(A.push(voA(a)),r=""),r.toString()});return n==i?t:n}var LoA=/-+([a-z0-9])/g;function Kp(t){return t.replace(LoA,(...e)=>e[1].toUpperCase())}function pK(t,e){return t===0||e===0}function mK(t,e,A){if(A.size&&e.length){let i=e[0],n=[];if(A.forEach((o,a)=>{i.has(a)||n.push(a),i.set(a,o)}),n.length)for(let o=1;oa.set(r,Up(t,r)))}}return e}function qs(t,e,A){switch(e.type){case rn.Trigger:return t.visitTrigger(e,A);case rn.State:return t.visitState(e,A);case rn.Transition:return t.visitTransition(e,A);case rn.Sequence:return t.visitSequence(e,A);case rn.Group:return t.visitGroup(e,A);case rn.Animate:return t.visitAnimate(e,A);case rn.Keyframes:return t.visitKeyframes(e,A);case rn.Style:return t.visitStyle(e,A);case rn.Reference:return t.visitReference(e,A);case rn.AnimateChild:return t.visitAnimateChild(e,A);case rn.AnimateRef:return t.visitAnimateRef(e,A);case rn.Query:return t.visitQuery(e,A);case rn.Stagger:return t.visitStagger(e,A);default:throw boA(e.type)}}function Up(t,e){return window.getComputedStyle(t)[e]}var B7=(()=>{class t{validateStyleProperty(A){return QK(A)}containsElement(A,i){return jb(A,i)}getParentElement(A){return Fp(A)}query(A,i,n){return qb(A,i,n)}computeStyle(A,i,n){return n||""}animate(A,i,n,o,a,r=[],s){return new z0(n,o)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac})}return t})(),C1=class{static NOOP=new B7},I1=class{};var GoA=new Set(["width","height","minWidth","minHeight","maxWidth","maxHeight","left","top","bottom","right","fontSize","outlineWidth","outlineOffset","paddingTop","paddingLeft","paddingBottom","paddingRight","marginTop","marginLeft","marginBottom","marginRight","borderRadius","borderWidth","borderTopWidth","borderLeftWidth","borderRightWidth","borderBottomWidth","textIndent","perspective"]),Hp=class extends I1{normalizePropertyName(e,A){return Kp(e)}normalizeStyleValue(e,A,i,n){let o="",a=i.toString().trim();if(GoA.has(A)&&i!==0&&i!=="0")if(typeof i=="number")o="px";else{let r=i.match(/^[+-]?[\d\.]+([a-z]*)$/);r&&r[1].length==0&&n.push(jG(e,i))}return a+o}};var zp="*";function KoA(t,e){let A=[];return typeof t=="string"?t.split(/\s*,\s*/).forEach(i=>UoA(i,A,e)):A.push(t),A}function UoA(t,e,A){if(t[0]==":"){let s=ToA(t,A);if(typeof s=="function"){e.push(s);return}t=s}let i=t.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(i==null||i.length<4)return A.push(oK(t)),e;let n=i[1],o=i[2],a=i[3];e.push(wK(n,a));let r=n==zp&&a==zp;o[0]=="<"&&!r&&e.push(wK(a,n))}function ToA(t,e){switch(t){case":enter":return"void => *";case":leave":return"* => void";case":increment":return(A,i)=>parseFloat(i)>parseFloat(A);case":decrement":return(A,i)=>parseFloat(i) *"}}var Tp=new Set(["true","1"]),Jp=new Set(["false","0"]);function wK(t,e){let A=Tp.has(t)||Jp.has(t),i=Tp.has(e)||Jp.has(e);return(n,o)=>{let a=t==zp||t==n,r=e==zp||e==o;return!a&&A&&typeof n=="boolean"&&(a=n?Tp.has(t):Jp.has(t)),!r&&i&&typeof o=="boolean"&&(r=o?Tp.has(e):Jp.has(e)),a&&r}}var RK=":self",JoA=new RegExp(`s*${RK}s*,?`,"g");function NK(t,e,A,i){return new n7(t).build(e,A,i)}var DK="",n7=class{_driver;constructor(e){this._driver=e}build(e,A,i){let n=new o7(A);return this._resetContextStyleTimingState(n),qs(this,dB(e),n)}_resetContextStyleTimingState(e){e.currentQuerySelector=DK,e.collectedStyles=new Map,e.collectedStyles.set(DK,new Map),e.currentTime=0}visitTrigger(e,A){let i=A.queryCount=0,n=A.depCount=0,o=[],a=[];return e.name.charAt(0)=="@"&&A.errors.push(qG()),e.definitions.forEach(r=>{if(this._resetContextStyleTimingState(A),r.type==rn.State){let s=r,l=s.name;l.toString().split(/\s*,\s*/).forEach(g=>{s.name=g,o.push(this.visitState(s,A))}),s.name=l}else if(r.type==rn.Transition){let s=this.visitTransition(r,A);i+=s.queryCount,n+=s.depCount,a.push(s)}else A.errors.push(VG())}),{type:rn.Trigger,name:e.name,states:o,transitions:a,queryCount:i,depCount:n,options:null}}visitState(e,A){let i=this.visitStyle(e.styles,A),n=e.options&&e.options.params||null;if(i.containsDynamicStyles){let o=new Set,a=n||{};i.styles.forEach(r=>{r instanceof Map&&r.forEach(s=>{Xb(s).forEach(l=>{a.hasOwnProperty(l)||o.add(l)})})}),o.size&&A.errors.push(WG(e.name,[...o.values()]))}return{type:rn.State,name:e.name,style:i,options:n?{params:n}:null}}visitTransition(e,A){A.queryCount=0,A.depCount=0;let i=qs(this,dB(e.animation),A),n=KoA(e.expr,A.errors);return{type:rn.Transition,matchers:n,animation:i,queryCount:A.queryCount,depCount:A.depCount,options:c1(e.options)}}visitSequence(e,A){return{type:rn.Sequence,steps:e.steps.map(i=>qs(this,i,A)),options:c1(e.options)}}visitGroup(e,A){let i=A.currentTime,n=0,o=e.steps.map(a=>{A.currentTime=i;let r=qs(this,a,A);return n=Math.max(n,A.currentTime),r});return A.currentTime=n,{type:rn.Group,steps:o,options:c1(e.options)}}visitAnimate(e,A){let i=zoA(e.timings,A.errors);A.currentAnimateTimings=i;let n,o=e.styles?e.styles:Jb({});if(o.type==rn.Keyframes)n=this.visitKeyframes(o,A);else{let a=e.styles,r=!1;if(!a){r=!0;let l={};i.easing&&(l.easing=i.easing),a=Jb(l)}A.currentTime+=i.duration+i.delay;let s=this.visitStyle(a,A);s.isEmptyStep=r,n=s}return A.currentAnimateTimings=null,{type:rn.Animate,timings:i,style:n,options:null}}visitStyle(e,A){let i=this._makeStyleAst(e,A);return this._validateStyleAst(i,A),i}_makeStyleAst(e,A){let i=[],n=Array.isArray(e.styles)?e.styles:[e.styles];for(let r of n)typeof r=="string"?r===Ng?i.push(r):A.errors.push(ZG(r)):i.push(new Map(Object.entries(r)));let o=!1,a=null;return i.forEach(r=>{if(r instanceof Map&&(r.has("easing")&&(a=r.get("easing"),r.delete("easing")),!o)){for(let s of r.values())if(s.toString().indexOf(Vb)>=0){o=!0;break}}}),{type:rn.Style,styles:i,easing:a,offset:e.offset,containsDynamicStyles:o,options:null}}_validateStyleAst(e,A){let i=A.currentAnimateTimings,n=A.currentTime,o=A.currentTime;i&&o>0&&(o-=i.duration+i.delay),e.styles.forEach(a=>{typeof a!="string"&&a.forEach((r,s)=>{let l=A.collectedStyles.get(A.currentQuerySelector),g=l.get(s),C=!0;g&&(o!=n&&o>=g.startTime&&n<=g.endTime&&(A.errors.push(XG(s,g.startTime,g.endTime,o,n)),C=!1),o=g.startTime),C&&l.set(s,{startTime:o,endTime:n}),A.options&&fK(r,A.options,A.errors)})})}visitKeyframes(e,A){let i={type:rn.Keyframes,styles:[],options:null};if(!A.currentAnimateTimings)return A.errors.push($G()),i;let n=1,o=0,a=[],r=!1,s=!1,l=0,g=e.steps.map(m=>{let v=this._makeStyleAst(m,A),k=v.offset!=null?v.offset:HoA(v.styles),S=0;return k!=null&&(o++,S=v.offset=k),s=s||S<0||S>1,r=r||S0&&o{let k=I>0?v==d?1:I*v:a[v],S=k*f;A.currentTime=h+E.delay+S,E.duration=S,this._validateStyleAst(m,A),m.offset=k,i.styles.push(m)}),i}visitReference(e,A){return{type:rn.Reference,animation:qs(this,dB(e.animation),A),options:c1(e.options)}}visitAnimateChild(e,A){return A.depCount++,{type:rn.AnimateChild,options:c1(e.options)}}visitAnimateRef(e,A){return{type:rn.AnimateRef,animation:this.visitReference(e.animation,A),options:c1(e.options)}}visitQuery(e,A){let i=A.currentQuerySelector,n=e.options||{};A.queryCount++,A.currentQuery=e;let[o,a]=OoA(e.selector);A.currentQuerySelector=i.length?i+" "+o:o,js(A.collectedStyles,A.currentQuerySelector,new Map);let r=qs(this,dB(e.animation),A);return A.currentQuery=null,A.currentQuerySelector=i,{type:rn.Query,selector:o,limit:n.limit||0,optional:!!n.optional,includeSelf:a,animation:r,originalSelector:e.selector,options:c1(e.options)}}visitStagger(e,A){A.currentQuery||A.errors.push(iK());let i=e.timings==="full"?{duration:0,delay:0,easing:"full"}:au(e.timings,A.errors,!0);return{type:rn.Stagger,animation:qs(this,dB(e.animation),A),timings:i,options:null}}};function OoA(t){let e=!!t.split(/\s*,\s*/).find(A=>A==RK);return e&&(t=t.replace(JoA,"")),t=t.replace(/@\*/g,ou).replace(/@\w+/g,A=>ou+"-"+A.slice(1)).replace(/:animating/g,Gp),[t,e]}function YoA(t){return t?gA({},t):null}var o7=class{errors;queryCount=0;depCount=0;currentTransition=null;currentQuery=null;currentQuerySelector=null;currentAnimateTimings=null;currentTime=0;collectedStyles=new Map;options=null;unsupportedCSSPropertiesFound=new Set;constructor(e){this.errors=e}};function HoA(t){if(typeof t=="string")return null;let e=null;if(Array.isArray(t))t.forEach(A=>{if(A instanceof Map&&A.has("offset")){let i=A;e=parseFloat(i.get("offset")),i.delete("offset")}});else if(t instanceof Map&&t.has("offset")){let A=t;e=parseFloat(A.get("offset")),A.delete("offset")}return e}function zoA(t,e){if(t.hasOwnProperty("duration"))return t;if(typeof t=="number"){let o=au(t,e).duration;return $b(o,0,"")}let A=t;if(A.split(/\s+/).some(o=>o.charAt(0)=="{"&&o.charAt(1)=="{")){let o=$b(0,0,"");return o.dynamic=!0,o.strValue=A,o}let n=au(A,e);return $b(n.duration,n.delay,n.easing)}function c1(t){return t?(t=gA({},t),t.params&&(t.params=YoA(t.params))):t={},t}function $b(t,e,A){return{duration:t,delay:e,easing:A}}function E7(t,e,A,i,n,o,a=null,r=!1){return{type:1,element:t,keyframes:e,preStyleProps:A,postStyleProps:i,duration:n,delay:o,totalTime:n+o,easing:a,subTimeline:r}}var su=class{_map=new Map;get(e){return this._map.get(e)||[]}append(e,A){let i=this._map.get(e);i||this._map.set(e,i=[]),i.push(...A)}has(e){return this._map.has(e)}clear(){this._map.clear()}},PoA=1,joA=":enter",qoA=new RegExp(joA,"g"),VoA=":leave",WoA=new RegExp(VoA,"g");function FK(t,e,A,i,n,o=new Map,a=new Map,r,s,l=[]){return new a7().buildKeyframes(t,e,A,i,n,o,a,r,s,l)}var a7=class{buildKeyframes(e,A,i,n,o,a,r,s,l,g=[]){l=l||new su;let C=new r7(e,A,l,n,o,g,[]);C.options=s;let I=s.delay?Hc(s.delay):0;C.currentTimeline.delayNextStep(I),C.currentTimeline.setStyles([a],null,C.errors,s),qs(this,i,C);let d=C.timelines.filter(h=>h.containsAnimation());if(d.length&&r.size){let h;for(let E=d.length-1;E>=0;E--){let f=d[E];if(f.element===A){h=f;break}}h&&!h.allowOnlyTimelineStyles()&&h.setStyles([r],null,C.errors,s)}return d.length?d.map(h=>h.buildKeyframes()):[E7(A,[],[],[],0,I,"",!1)]}visitTrigger(e,A){}visitState(e,A){}visitTransition(e,A){}visitAnimateChild(e,A){let i=A.subInstructions.get(A.element);if(i){let n=A.createSubContext(e.options),o=A.currentTimeline.currentTime,a=this._visitSubInstructions(i,n,n.options);o!=a&&A.transformIntoNewTimeline(a)}A.previousNode=e}visitAnimateRef(e,A){let i=A.createSubContext(e.options);i.transformIntoNewTimeline(),this._applyAnimationRefDelays([e.options,e.animation.options],A,i),this.visitReference(e.animation,i),A.transformIntoNewTimeline(i.currentTimeline.currentTime),A.previousNode=e}_applyAnimationRefDelays(e,A,i){for(let n of e){let o=n?.delay;if(o){let a=typeof o=="number"?o:Hc(BB(o,n?.params??{},A.errors));i.delayNextStep(a)}}}_visitSubInstructions(e,A,i){let o=A.currentTimeline.currentTime,a=i.duration!=null?Hc(i.duration):null,r=i.delay!=null?Hc(i.delay):null;return a!==0&&e.forEach(s=>{let l=A.appendInstructionToTimeline(s,a,r);o=Math.max(o,l.duration+l.delay)}),o}visitReference(e,A){A.updateOptions(e.options,!0),qs(this,e.animation,A),A.previousNode=e}visitSequence(e,A){let i=A.subContextCount,n=A,o=e.options;if(o&&(o.params||o.delay)&&(n=A.createSubContext(o),n.transformIntoNewTimeline(),o.delay!=null)){n.previousNode.type==rn.Style&&(n.currentTimeline.snapshotCurrentStyles(),n.previousNode=Pp);let a=Hc(o.delay);n.delayNextStep(a)}e.steps.length&&(e.steps.forEach(a=>qs(this,a,n)),n.currentTimeline.applyStylesToKeyframe(),n.subContextCount>i&&n.transformIntoNewTimeline()),A.previousNode=e}visitGroup(e,A){let i=[],n=A.currentTimeline.currentTime,o=e.options&&e.options.delay?Hc(e.options.delay):0;e.steps.forEach(a=>{let r=A.createSubContext(e.options);o&&r.delayNextStep(o),qs(this,a,r),n=Math.max(n,r.currentTimeline.currentTime),i.push(r.currentTimeline)}),i.forEach(a=>A.currentTimeline.mergeTimelineCollectedStyles(a)),A.transformIntoNewTimeline(n),A.previousNode=e}_visitTiming(e,A){if(e.dynamic){let i=e.strValue,n=A.params?BB(i,A.params,A.errors):i;return au(n,A.errors)}else return{duration:e.duration,delay:e.delay,easing:e.easing}}visitAnimate(e,A){let i=A.currentAnimateTimings=this._visitTiming(e.timings,A),n=A.currentTimeline;i.delay&&(A.incrementTime(i.delay),n.snapshotCurrentStyles());let o=e.style;o.type==rn.Keyframes?this.visitKeyframes(o,A):(A.incrementTime(i.duration),this.visitStyle(o,A),n.applyStylesToKeyframe()),A.currentAnimateTimings=null,A.previousNode=e}visitStyle(e,A){let i=A.currentTimeline,n=A.currentAnimateTimings;!n&&i.hasCurrentStyleProperties()&&i.forwardFrame();let o=n&&n.easing||e.easing;e.isEmptyStep?i.applyEmptyStep(o):i.setStyles(e.styles,o,A.errors,A.options),A.previousNode=e}visitKeyframes(e,A){let i=A.currentAnimateTimings,n=A.currentTimeline.duration,o=i.duration,r=A.createSubContext().currentTimeline;r.easing=i.easing,e.styles.forEach(s=>{let l=s.offset||0;r.forwardTime(l*o),r.setStyles(s.styles,s.easing,A.errors,A.options),r.applyStylesToKeyframe()}),A.currentTimeline.mergeTimelineCollectedStyles(r),A.transformIntoNewTimeline(n+o),A.previousNode=e}visitQuery(e,A){let i=A.currentTimeline.currentTime,n=e.options||{},o=n.delay?Hc(n.delay):0;o&&(A.previousNode.type===rn.Style||i==0&&A.currentTimeline.hasCurrentStyleProperties())&&(A.currentTimeline.snapshotCurrentStyles(),A.previousNode=Pp);let a=i,r=A.invokeQuery(e.selector,e.originalSelector,e.limit,e.includeSelf,!!n.optional,A.errors);A.currentQueryTotal=r.length;let s=null;r.forEach((l,g)=>{A.currentQueryIndex=g;let C=A.createSubContext(e.options,l);o&&C.delayNextStep(o),l===A.element&&(s=C.currentTimeline),qs(this,e.animation,C),C.currentTimeline.applyStylesToKeyframe();let I=C.currentTimeline.currentTime;a=Math.max(a,I)}),A.currentQueryIndex=0,A.currentQueryTotal=0,A.transformIntoNewTimeline(a),s&&(A.currentTimeline.mergeTimelineCollectedStyles(s),A.currentTimeline.snapshotCurrentStyles()),A.previousNode=e}visitStagger(e,A){let i=A.parentContext,n=A.currentTimeline,o=e.timings,a=Math.abs(o.duration),r=a*(A.currentQueryTotal-1),s=a*A.currentQueryIndex;switch(o.duration<0?"reverse":o.easing){case"reverse":s=r-s;break;case"full":s=i.currentStaggerTime;break}let g=A.currentTimeline;s&&g.delayNextStep(s);let C=g.currentTime;qs(this,e.animation,A),A.previousNode=e,i.currentStaggerTime=n.currentTime-C+(n.startTime-i.currentTimeline.startTime)}},Pp={},r7=class t{_driver;element;subInstructions;_enterClassName;_leaveClassName;errors;timelines;parentContext=null;currentTimeline;currentAnimateTimings=null;previousNode=Pp;subContextCount=0;options={};currentQueryIndex=0;currentQueryTotal=0;currentStaggerTime=0;constructor(e,A,i,n,o,a,r,s){this._driver=e,this.element=A,this.subInstructions=i,this._enterClassName=n,this._leaveClassName=o,this.errors=a,this.timelines=r,this.currentTimeline=s||new jp(this._driver,A,0),r.push(this.currentTimeline)}get params(){return this.options.params}updateOptions(e,A){if(!e)return;let i=e,n=this.options;i.duration!=null&&(n.duration=Hc(i.duration)),i.delay!=null&&(n.delay=Hc(i.delay));let o=i.params;if(o){let a=n.params;a||(a=this.options.params={}),Object.keys(o).forEach(r=>{(!A||!a.hasOwnProperty(r))&&(a[r]=BB(o[r],a,this.errors))})}}_copyOptions(){let e={};if(this.options){let A=this.options.params;if(A){let i=e.params={};Object.keys(A).forEach(n=>{i[n]=A[n]})}}return e}createSubContext(e=null,A,i){let n=A||this.element,o=new t(this._driver,n,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(n,i||0));return o.previousNode=this.previousNode,o.currentAnimateTimings=this.currentAnimateTimings,o.options=this._copyOptions(),o.updateOptions(e),o.currentQueryIndex=this.currentQueryIndex,o.currentQueryTotal=this.currentQueryTotal,o.parentContext=this,this.subContextCount++,o}transformIntoNewTimeline(e){return this.previousNode=Pp,this.currentTimeline=this.currentTimeline.fork(this.element,e),this.timelines.push(this.currentTimeline),this.currentTimeline}appendInstructionToTimeline(e,A,i){let n={duration:A??e.duration,delay:this.currentTimeline.currentTime+(i??0)+e.delay,easing:""},o=new s7(this._driver,e.element,e.keyframes,e.preStyleProps,e.postStyleProps,n,e.stretchStartingKeyframe);return this.timelines.push(o),n}incrementTime(e){this.currentTimeline.forwardTime(this.currentTimeline.duration+e)}delayNextStep(e){e>0&&this.currentTimeline.delayNextStep(e)}invokeQuery(e,A,i,n,o,a){let r=[];if(n&&r.push(this.element),e.length>0){e=e.replace(qoA,"."+this._enterClassName),e=e.replace(WoA,"."+this._leaveClassName);let s=i!=1,l=this._driver.query(this.element,e,s);i!==0&&(l=i<0?l.slice(l.length+i,l.length):l.slice(0,i)),r.push(...l)}return!o&&r.length==0&&a.push(nK(A)),r}},jp=class t{_driver;element;startTime;_elementTimelineStylesLookup;duration=0;easing=null;_previousKeyframe=new Map;_currentKeyframe=new Map;_keyframes=new Map;_styleSummary=new Map;_localTimelineStyles=new Map;_globalTimelineStyles;_pendingStyles=new Map;_backFill=new Map;_currentEmptyStepKeyframe=null;constructor(e,A,i,n){this._driver=e,this.element=A,this.startTime=i,this._elementTimelineStylesLookup=n,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(A),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(A,this._localTimelineStyles)),this._loadKeyframe()}containsAnimation(){switch(this._keyframes.size){case 0:return!1;case 1:return this.hasCurrentStyleProperties();default:return!0}}hasCurrentStyleProperties(){return this._currentKeyframe.size>0}get currentTime(){return this.startTime+this.duration}delayNextStep(e){let A=this._keyframes.size===1&&this._pendingStyles.size;this.duration||A?(this.forwardTime(this.currentTime+e),A&&this.snapshotCurrentStyles()):this.startTime+=e}fork(e,A){return this.applyStylesToKeyframe(),new t(this._driver,e,A||this.currentTime,this._elementTimelineStylesLookup)}_loadKeyframe(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=new Map,this._keyframes.set(this.duration,this._currentKeyframe))}forwardFrame(){this.duration+=PoA,this._loadKeyframe()}forwardTime(e){this.applyStylesToKeyframe(),this.duration=e,this._loadKeyframe()}_updateStyle(e,A){this._localTimelineStyles.set(e,A),this._globalTimelineStyles.set(e,A),this._styleSummary.set(e,{time:this.currentTime,value:A})}allowOnlyTimelineStyles(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}applyEmptyStep(e){e&&this._previousKeyframe.set("easing",e);for(let[A,i]of this._globalTimelineStyles)this._backFill.set(A,i||Ng),this._currentKeyframe.set(A,Ng);this._currentEmptyStepKeyframe=this._currentKeyframe}setStyles(e,A,i,n){A&&this._previousKeyframe.set("easing",A);let o=n&&n.params||{},a=ZoA(e,this._globalTimelineStyles);for(let[r,s]of a){let l=BB(s,o,i);this._pendingStyles.set(r,l),this._localTimelineStyles.has(r)||this._backFill.set(r,this._globalTimelineStyles.get(r)??Ng),this._updateStyle(r,l)}}applyStylesToKeyframe(){this._pendingStyles.size!=0&&(this._pendingStyles.forEach((e,A)=>{this._currentKeyframe.set(A,e)}),this._pendingStyles.clear(),this._localTimelineStyles.forEach((e,A)=>{this._currentKeyframe.has(A)||this._currentKeyframe.set(A,e)}))}snapshotCurrentStyles(){for(let[e,A]of this._localTimelineStyles)this._pendingStyles.set(e,A),this._updateStyle(e,A)}getFinalKeyframe(){return this._keyframes.get(this.duration)}get properties(){let e=[];for(let A in this._currentKeyframe)e.push(A);return e}mergeTimelineCollectedStyles(e){e._styleSummary.forEach((A,i)=>{let n=this._styleSummary.get(i);(!n||A.time>n.time)&&this._updateStyle(i,A.value)})}buildKeyframes(){this.applyStylesToKeyframe();let e=new Set,A=new Set,i=this._keyframes.size===1&&this.duration===0,n=[];this._keyframes.forEach((r,s)=>{let l=new Map([...this._backFill,...r]);l.forEach((g,C)=>{g===iu?e.add(C):g===Ng&&A.add(C)}),i||l.set("offset",s/this.duration),n.push(l)});let o=[...e.values()],a=[...A.values()];if(i){let r=n[0],s=new Map(r);r.set("offset",0),s.set("offset",1),n=[r,s]}return E7(this.element,n,o,a,this.duration,this.startTime,this.easing,!1)}},s7=class extends jp{keyframes;preStyleProps;postStyleProps;_stretchStartingKeyframe;timings;constructor(e,A,i,n,o,a,r=!1){super(e,A,a.delay),this.keyframes=i,this.preStyleProps=n,this.postStyleProps=o,this._stretchStartingKeyframe=r,this.timings={duration:a.duration,delay:a.delay,easing:a.easing}}containsAnimation(){return this.keyframes.length>1}buildKeyframes(){let e=this.keyframes,{delay:A,duration:i,easing:n}=this.timings;if(this._stretchStartingKeyframe&&A){let o=[],a=i+A,r=A/a,s=new Map(e[0]);s.set("offset",0),o.push(s);let l=new Map(e[0]);l.set("offset",yK(r)),o.push(l);let g=e.length-1;for(let C=1;C<=g;C++){let I=new Map(e[C]),d=I.get("offset"),h=A+d*i;I.set("offset",yK(h/a)),o.push(I)}i=a,A=0,n="",e=o}return E7(this.element,e,this.preStyleProps,this.postStyleProps,i,A,n,!0)}};function yK(t,e=3){let A=Math.pow(10,e-1);return Math.round(t*A)/A}function ZoA(t,e){let A=new Map,i;return t.forEach(n=>{if(n==="*"){i??=e.keys();for(let o of i)A.set(o,Ng)}else for(let[o,a]of n)A.set(o,a)}),A}function vK(t,e,A,i,n,o,a,r,s,l,g,C,I){return{type:0,element:t,triggerName:e,isRemovalTransition:n,fromState:A,fromStyles:o,toState:i,toStyles:a,timelines:r,queriedElements:s,preStyleProps:l,postStyleProps:g,totalTime:C,errors:I}}var A7={},qp=class{_triggerName;ast;_stateStyles;constructor(e,A,i){this._triggerName=e,this.ast=A,this._stateStyles=i}match(e,A,i,n){return XoA(this.ast.matchers,e,A,i,n)}buildStyles(e,A,i){let n=this._stateStyles.get("*");return e!==void 0&&(n=this._stateStyles.get(e?.toString())||n),n?n.buildStyles(A,i):new Map}build(e,A,i,n,o,a,r,s,l,g){let C=[],I=this.ast.options&&this.ast.options.params||A7,d=r&&r.params||A7,h=this.buildStyles(i,d,C),E=s&&s.params||A7,f=this.buildStyles(n,E,C),m=new Set,v=new Map,k=new Map,S=n==="void",b={params:LK(E,I),delay:this.ast.options?.delay},x=g?[]:FK(e,A,this.ast.animation,o,a,h,f,b,l,C),F=0;return x.forEach(z=>{F=Math.max(z.duration+z.delay,F)}),C.length?vK(A,this._triggerName,i,n,S,h,f,[],[],v,k,F,C):(x.forEach(z=>{let P=z.element,Z=js(v,P,new Set);z.preStyleProps.forEach(W=>Z.add(W));let tA=js(k,P,new Set);z.postStyleProps.forEach(W=>tA.add(W)),P!==A&&m.add(P)}),vK(A,this._triggerName,i,n,S,h,f,x,[...m.values()],v,k,F))}};function XoA(t,e,A,i,n){return t.some(o=>o(e,A,i,n))}function LK(t,e){let A=gA({},e);return Object.entries(t).forEach(([i,n])=>{n!=null&&(A[i]=n)}),A}var l7=class{styles;defaultParams;normalizer;constructor(e,A,i){this.styles=e,this.defaultParams=A,this.normalizer=i}buildStyles(e,A){let i=new Map,n=LK(e,this.defaultParams);return this.styles.styles.forEach(o=>{typeof o!="string"&&o.forEach((a,r)=>{a&&(a=BB(a,n,A));let s=this.normalizer.normalizePropertyName(r,A);a=this.normalizer.normalizeStyleValue(r,s,a,A),i.set(r,a)})}),i}};function $oA(t,e,A){return new g7(t,e,A)}var g7=class{name;ast;_normalizer;transitionFactories=[];fallbackTransition;states=new Map;constructor(e,A,i){this.name=e,this.ast=A,this._normalizer=i,A.states.forEach(n=>{let o=n.options&&n.options.params||{};this.states.set(n.name,new l7(n.style,o,i))}),bK(this.states,"true","1"),bK(this.states,"false","0"),A.transitions.forEach(n=>{this.transitionFactories.push(new qp(e,n,this.states))}),this.fallbackTransition=AaA(e,this.states)}get containsQueries(){return this.ast.queryCount>0}matchTransition(e,A,i,n){return this.transitionFactories.find(a=>a.match(e,A,i,n))||null}matchStyles(e,A,i){return this.fallbackTransition.buildStyles(e,A,i)}};function AaA(t,e,A){let i=[(a,r)=>!0],n={type:rn.Sequence,steps:[],options:null},o={type:rn.Transition,animation:n,matchers:i,options:null,queryCount:0,depCount:0};return new qp(t,o,e)}function bK(t,e,A){t.has(e)?t.has(A)||t.set(A,t.get(e)):t.has(A)&&t.set(e,t.get(A))}var eaA=new su,c7=class{bodyNode;_driver;_normalizer;_animations=new Map;_playersById=new Map;players=[];constructor(e,A,i){this.bodyNode=e,this._driver=A,this._normalizer=i}register(e,A){let i=[],n=[],o=NK(this._driver,A,i,n);if(i.length)throw sK(i);this._animations.set(e,o)}_buildPlayer(e,A,i){let n=e.element,o=zb(this._normalizer,e.keyframes,A,i);return this._driver.animate(n,o,e.duration,e.delay,e.easing,[],!0)}create(e,A,i={}){let n=[],o=this._animations.get(e),a,r=new Map;if(o?(a=FK(this._driver,A,o,Wb,Lp,new Map,new Map,i,eaA,n),a.forEach(g=>{let C=js(r,g.element,new Map);g.postStyleProps.forEach(I=>C.set(I,null))})):(n.push(lK()),a=[]),n.length)throw gK(n);r.forEach((g,C)=>{g.forEach((I,d)=>{g.set(d,this._driver.computeStyle(C,d,Ng))})});let s=a.map(g=>{let C=r.get(g.element);return this._buildPlayer(g,new Map,C)}),l=P0(s);return this._playersById.set(e,l),l.onDestroy(()=>this.destroy(e)),this.players.push(l),l}destroy(e){let A=this._getPlayer(e);A.destroy(),this._playersById.delete(e);let i=this.players.indexOf(A);i>=0&&this.players.splice(i,1)}_getPlayer(e){let A=this._playersById.get(e);if(!A)throw cK(e);return A}listen(e,A,i,n){let o=Np(A,"","","");return Rp(this._getPlayer(e),i,o,n),()=>{}}command(e,A,i,n){if(i=="register"){this.register(e,n[0]);return}if(i=="create"){let a=n[0]||{};this.create(e,A,a);return}let o=this._getPlayer(e);switch(i){case"play":o.play();break;case"pause":o.pause();break;case"reset":o.reset();break;case"restart":o.restart();break;case"finish":o.finish();break;case"init":o.init();break;case"setPosition":o.setPosition(parseFloat(n[0]));break;case"destroy":this.destroy(e);break}}},MK="ng-animate-queued",taA=".ng-animate-queued",e7="ng-animate-disabled",iaA=".ng-animate-disabled",naA="ng-star-inserted",oaA=".ng-star-inserted",aaA=[],GK={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},raA={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},Lg="__ng_removed",lu=class{namespaceId;value;options;get params(){return this.options.params}constructor(e,A=""){this.namespaceId=A;let i=e&&e.hasOwnProperty("value"),n=i?e.value:e;if(this.value=laA(n),i){let o=e,{value:a}=o,r=vF(o,["value"]);this.options=r}else this.options={};this.options.params||(this.options.params={})}absorbOptions(e){let A=e.params;if(A){let i=this.options.params;Object.keys(A).forEach(n=>{i[n]==null&&(i[n]=A[n])})}}},ru="void",t7=new lu(ru),C7=class{id;hostElement;_engine;players=[];_triggers=new Map;_queue=[];_elementListeners=new Map;_hostClassName;constructor(e,A,i){this.id=e,this.hostElement=A,this._engine=i,this._hostClassName="ng-tns-"+e,Pl(A,this._hostClassName)}listen(e,A,i,n){if(!this._triggers.has(A))throw CK(i,A);if(i==null||i.length==0)throw IK(A);if(!gaA(i))throw dK(i,A);let o=js(this._elementListeners,e,[]),a={name:A,phase:i,callback:n};o.push(a);let r=js(this._engine.statesByElement,e,new Map);return r.has(A)||(Pl(e,nu),Pl(e,nu+"-"+A),r.set(A,t7)),()=>{this._engine.afterFlush(()=>{let s=o.indexOf(a);s>=0&&o.splice(s,1),this._triggers.has(A)||r.delete(A)})}}register(e,A){return this._triggers.has(e)?!1:(this._triggers.set(e,A),!0)}_getTrigger(e){let A=this._triggers.get(e);if(!A)throw BK(e);return A}trigger(e,A,i,n=!0){let o=this._getTrigger(A),a=new gu(this.id,A,e),r=this._engine.statesByElement.get(e);r||(Pl(e,nu),Pl(e,nu+"-"+A),this._engine.statesByElement.set(e,r=new Map));let s=r.get(A),l=new lu(i,this.id);if(!(i&&i.hasOwnProperty("value"))&&s&&l.absorbOptions(s.options),r.set(A,l),s||(s=t7),!(l.value===ru)&&s.value===l.value){if(!IaA(s.params,l.params)){let E=[],f=o.matchStyles(s.value,s.params,E),m=o.matchStyles(l.value,l.params,E);E.length?this._engine.reportError(E):this._engine.afterFlush(()=>{s2(e,f),Fg(e,m)})}return}let I=js(this._engine.playersByElement,e,[]);I.forEach(E=>{E.namespaceId==this.id&&E.triggerName==A&&E.queued&&E.destroy()});let d=o.matchTransition(s.value,l.value,e,l.params),h=!1;if(!d){if(!n)return;d=o.fallbackTransition,h=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:A,transition:d,fromState:s,toState:l,player:a,isFallbackTransition:h}),h||(Pl(e,MK),a.onStart(()=>{EB(e,MK)})),a.onDone(()=>{let E=this.players.indexOf(a);E>=0&&this.players.splice(E,1);let f=this._engine.playersByElement.get(e);if(f){let m=f.indexOf(a);m>=0&&f.splice(m,1)}}),this.players.push(a),I.push(a),a}deregister(e){this._triggers.delete(e),this._engine.statesByElement.forEach(A=>A.delete(e)),this._elementListeners.forEach((A,i)=>{this._elementListeners.set(i,A.filter(n=>n.name!=e))})}clearElementCache(e){this._engine.statesByElement.delete(e),this._elementListeners.delete(e);let A=this._engine.playersByElement.get(e);A&&(A.forEach(i=>i.destroy()),this._engine.playersByElement.delete(e))}_signalRemovalForInnerTriggers(e,A){let i=this._engine.driver.query(e,ou,!0);i.forEach(n=>{if(n[Lg])return;let o=this._engine.fetchNamespacesByElement(n);o.size?o.forEach(a=>a.triggerLeaveAnimation(n,A,!1,!0)):this.clearElementCache(n)}),this._engine.afterFlushAnimationsDone(()=>i.forEach(n=>this.clearElementCache(n)))}triggerLeaveAnimation(e,A,i,n){let o=this._engine.statesByElement.get(e),a=new Map;if(o){let r=[];if(o.forEach((s,l)=>{if(a.set(l,s.value),this._triggers.has(l)){let g=this.trigger(e,l,ru,n);g&&r.push(g)}}),r.length)return this._engine.markElementAsRemoved(this.id,e,!0,A,a),i&&P0(r).onDone(()=>this._engine.processLeaveNode(e)),!0}return!1}prepareLeaveAnimationListeners(e){let A=this._elementListeners.get(e),i=this._engine.statesByElement.get(e);if(A&&i){let n=new Set;A.forEach(o=>{let a=o.name;if(n.has(a))return;n.add(a);let s=this._triggers.get(a).fallbackTransition,l=i.get(a)||t7,g=new lu(ru),C=new gu(this.id,a,e);this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:a,transition:s,fromState:l,toState:g,player:C,isFallbackTransition:!0})})}}removeNode(e,A){let i=this._engine;if(e.childElementCount&&this._signalRemovalForInnerTriggers(e,A),this.triggerLeaveAnimation(e,A,!0))return;let n=!1;if(i.totalAnimations){let o=i.players.length?i.playersByQueriedElement.get(e):[];if(o&&o.length)n=!0;else{let a=e;for(;a=a.parentNode;)if(i.statesByElement.get(a)){n=!0;break}}}if(this.prepareLeaveAnimationListeners(e),n)i.markElementAsRemoved(this.id,e,!1,A);else{let o=e[Lg];(!o||o===GK)&&(i.afterFlush(()=>this.clearElementCache(e)),i.destroyInnerAnimations(e),i._onRemovalComplete(e,A))}}insertNode(e,A){Pl(e,this._hostClassName)}drainQueuedTransitions(e){let A=[];return this._queue.forEach(i=>{let n=i.player;if(n.destroyed)return;let o=i.element,a=this._elementListeners.get(o);a&&a.forEach(r=>{if(r.name==i.triggerName){let s=Np(o,i.triggerName,i.fromState.value,i.toState.value);s._data=e,Rp(i.player,r.phase,s,r.callback)}}),n.markedForDestroy?this._engine.afterFlush(()=>{n.destroy()}):A.push(i)}),this._queue=[],A.sort((i,n)=>{let o=i.transition.ast.depCount,a=n.transition.ast.depCount;return o==0||a==0?o-a:this._engine.driver.containsElement(i.element,n.element)?1:-1})}destroy(e){this.players.forEach(A=>A.destroy()),this._signalRemovalForInnerTriggers(this.hostElement,e)}},I7=class{bodyNode;driver;_normalizer;players=[];newHostElements=new Map;playersByElement=new Map;playersByQueriedElement=new Map;statesByElement=new Map;disabledNodes=new Set;totalAnimations=0;totalQueuedPlayers=0;_namespaceLookup={};_namespaceList=[];_flushFns=[];_whenQuietFns=[];namespacesByHostElement=new Map;collectedEnterElements=[];collectedLeaveElements=[];onRemovalComplete=(e,A)=>{};_onRemovalComplete(e,A){this.onRemovalComplete(e,A)}constructor(e,A,i){this.bodyNode=e,this.driver=A,this._normalizer=i}get queuedPlayers(){let e=[];return this._namespaceList.forEach(A=>{A.players.forEach(i=>{i.queued&&e.push(i)})}),e}createNamespace(e,A){let i=new C7(e,A,this);return this.bodyNode&&this.driver.containsElement(this.bodyNode,A)?this._balanceNamespaceList(i,A):(this.newHostElements.set(A,i),this.collectEnterElement(A)),this._namespaceLookup[e]=i}_balanceNamespaceList(e,A){let i=this._namespaceList,n=this.namespacesByHostElement;if(i.length-1>=0){let a=!1,r=this.driver.getParentElement(A);for(;r;){let s=n.get(r);if(s){let l=i.indexOf(s);i.splice(l+1,0,e),a=!0;break}r=this.driver.getParentElement(r)}a||i.unshift(e)}else i.push(e);return n.set(A,e),e}register(e,A){let i=this._namespaceLookup[e];return i||(i=this.createNamespace(e,A)),i}registerTrigger(e,A,i){let n=this._namespaceLookup[e];n&&n.register(A,i)&&this.totalAnimations++}destroy(e,A){e&&(this.afterFlush(()=>{}),this.afterFlushAnimationsDone(()=>{let i=this._fetchNamespace(e);this.namespacesByHostElement.delete(i.hostElement);let n=this._namespaceList.indexOf(i);n>=0&&this._namespaceList.splice(n,1),i.destroy(A),delete this._namespaceLookup[e]}))}_fetchNamespace(e){return this._namespaceLookup[e]}fetchNamespacesByElement(e){let A=new Set,i=this.statesByElement.get(e);if(i){for(let n of i.values())if(n.namespaceId){let o=this._fetchNamespace(n.namespaceId);o&&A.add(o)}}return A}trigger(e,A,i,n){if(Op(A)){let o=this._fetchNamespace(e);if(o)return o.trigger(A,i,n),!0}return!1}insertNode(e,A,i,n){if(!Op(A))return;let o=A[Lg];if(o&&o.setForRemoval){o.setForRemoval=!1,o.setForMove=!0;let a=this.collectedLeaveElements.indexOf(A);a>=0&&this.collectedLeaveElements.splice(a,1)}if(e){let a=this._fetchNamespace(e);a&&a.insertNode(A,i)}n&&this.collectEnterElement(A)}collectEnterElement(e){this.collectedEnterElements.push(e)}markElementAsDisabled(e,A){A?this.disabledNodes.has(e)||(this.disabledNodes.add(e),Pl(e,e7)):this.disabledNodes.has(e)&&(this.disabledNodes.delete(e),EB(e,e7))}removeNode(e,A,i){if(Op(A)){let n=e?this._fetchNamespace(e):null;n?n.removeNode(A,i):this.markElementAsRemoved(e,A,!1,i);let o=this.namespacesByHostElement.get(A);o&&o.id!==e&&o.removeNode(A,i)}else this._onRemovalComplete(A,i)}markElementAsRemoved(e,A,i,n,o){this.collectedLeaveElements.push(A),A[Lg]={namespaceId:e,setForRemoval:n,hasAnimation:i,removedBeforeQueried:!1,previousTriggersValues:o}}listen(e,A,i,n,o){return Op(A)?this._fetchNamespace(e).listen(A,i,n,o):()=>{}}_buildInstruction(e,A,i,n,o){return e.transition.build(this.driver,e.element,e.fromState.value,e.toState.value,i,n,e.fromState.options,e.toState.options,A,o)}destroyInnerAnimations(e){let A=this.driver.query(e,ou,!0);A.forEach(i=>this.destroyActiveAnimationsForElement(i)),this.playersByQueriedElement.size!=0&&(A=this.driver.query(e,Gp,!0),A.forEach(i=>this.finishActiveQueriedAnimationOnElement(i)))}destroyActiveAnimationsForElement(e){let A=this.playersByElement.get(e);A&&A.forEach(i=>{i.queued?i.markedForDestroy=!0:i.destroy()})}finishActiveQueriedAnimationOnElement(e){let A=this.playersByQueriedElement.get(e);A&&A.forEach(i=>i.finish())}whenRenderingDone(){return new Promise(e=>{if(this.players.length)return P0(this.players).onDone(()=>e());e()})}processLeaveNode(e){let A=e[Lg];if(A&&A.setForRemoval){if(e[Lg]=GK,A.namespaceId){this.destroyInnerAnimations(e);let i=this._fetchNamespace(A.namespaceId);i&&i.clearElementCache(e)}this._onRemovalComplete(e,A.setForRemoval)}e.classList?.contains(e7)&&this.markElementAsDisabled(e,!1),this.driver.query(e,iaA,!0).forEach(i=>{this.markElementAsDisabled(i,!1)})}flush(e=-1){let A=[];if(this.newHostElements.size&&(this.newHostElements.forEach((i,n)=>this._balanceNamespaceList(i,n)),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(let i=0;ii()),this._flushFns=[],this._whenQuietFns.length){let i=this._whenQuietFns;this._whenQuietFns=[],A.length?P0(A).onDone(()=>{i.forEach(n=>n())}):i.forEach(n=>n())}}reportError(e){throw EK(e)}_flushAnimations(e,A){let i=new su,n=[],o=new Map,a=[],r=new Map,s=new Map,l=new Map,g=new Set;this.disabledNodes.forEach(AA=>{g.add(AA);let IA=this.driver.query(AA,taA,!0);for(let aA=0;aA{let aA=Wb+E++;h.set(IA,aA),AA.forEach(rA=>Pl(rA,aA))});let f=[],m=new Set,v=new Set;for(let AA=0;AAm.add(rA)):v.add(IA))}let k=new Map,S=xK(I,Array.from(m));S.forEach((AA,IA)=>{let aA=Lp+E++;k.set(IA,aA),AA.forEach(rA=>Pl(rA,aA))}),e.push(()=>{d.forEach((AA,IA)=>{let aA=h.get(IA);AA.forEach(rA=>EB(rA,aA))}),S.forEach((AA,IA)=>{let aA=k.get(IA);AA.forEach(rA=>EB(rA,aA))}),f.forEach(AA=>{this.processLeaveNode(AA)})});let b=[],x=[];for(let AA=this._namespaceList.length-1;AA>=0;AA--)this._namespaceList[AA].drainQueuedTransitions(A).forEach(aA=>{let rA=aA.player,uA=aA.element;if(b.push(rA),this.collectedEnterElements.length){let _e=uA[Lg];if(_e&&_e.setForMove){if(_e.previousTriggersValues&&_e.previousTriggersValues.has(aA.triggerName)){let YA=_e.previousTriggersValues.get(aA.triggerName),fA=this.statesByElement.get(aA.element);if(fA&&fA.has(aA.triggerName)){let XA=fA.get(aA.triggerName);XA.value=YA,fA.set(aA.triggerName,XA)}}rA.destroy();return}}let UA=!C||!this.driver.containsElement(C,uA),$A=k.get(uA),zA=h.get(uA),pA=this._buildInstruction(aA,i,zA,$A,UA);if(pA.errors&&pA.errors.length){x.push(pA);return}if(UA){rA.onStart(()=>s2(uA,pA.fromStyles)),rA.onDestroy(()=>Fg(uA,pA.toStyles)),n.push(rA);return}if(aA.isFallbackTransition){rA.onStart(()=>s2(uA,pA.fromStyles)),rA.onDestroy(()=>Fg(uA,pA.toStyles)),n.push(rA);return}let PA=[];pA.timelines.forEach(_e=>{_e.stretchStartingKeyframe=!0,this.disabledNodes.has(_e.element)||PA.push(_e)}),pA.timelines=PA,i.append(uA,pA.timelines);let Je={instruction:pA,player:rA,element:uA};a.push(Je),pA.queriedElements.forEach(_e=>js(r,_e,[]).push(rA)),pA.preStyleProps.forEach((_e,YA)=>{if(_e.size){let fA=s.get(YA);fA||s.set(YA,fA=new Set),_e.forEach((XA,DA)=>fA.add(DA))}}),pA.postStyleProps.forEach((_e,YA)=>{let fA=l.get(YA);fA||l.set(YA,fA=new Set),_e.forEach((XA,DA)=>fA.add(DA))})});if(x.length){let AA=[];x.forEach(IA=>{AA.push(hK(IA.triggerName,IA.errors))}),b.forEach(IA=>IA.destroy()),this.reportError(AA)}let F=new Map,z=new Map;a.forEach(AA=>{let IA=AA.element;i.has(IA)&&(z.set(IA,IA),this._beforeAnimationBuild(AA.player.namespaceId,AA.instruction,F))}),n.forEach(AA=>{let IA=AA.element;this._getPreviousPlayers(IA,!1,AA.namespaceId,AA.triggerName,null).forEach(rA=>{js(F,IA,[]).push(rA),rA.destroy()})});let P=f.filter(AA=>_K(AA,s,l)),Z=new Map;kK(Z,this.driver,v,l,Ng).forEach(AA=>{_K(AA,s,l)&&P.push(AA)});let W=new Map;d.forEach((AA,IA)=>{kK(W,this.driver,new Set(AA),s,iu)}),P.forEach(AA=>{let IA=Z.get(AA),aA=W.get(AA);Z.set(AA,new Map([...IA?.entries()??[],...aA?.entries()??[]]))});let BA=[],X=[],iA={};a.forEach(AA=>{let{element:IA,player:aA,instruction:rA}=AA;if(i.has(IA)){if(g.has(IA)){aA.onDestroy(()=>Fg(IA,rA.toStyles)),aA.disabled=!0,aA.overrideTotalTime(rA.totalTime),n.push(aA);return}let uA=iA;if(z.size>1){let $A=IA,zA=[];for(;$A=$A.parentNode;){let pA=z.get($A);if(pA){uA=pA;break}zA.push($A)}zA.forEach(pA=>z.set(pA,uA))}let UA=this._buildAnimation(aA.namespaceId,rA,F,o,W,Z);if(aA.setRealPlayer(UA),uA===iA)BA.push(aA);else{let $A=this.playersByElement.get(uA);$A&&$A.length&&(aA.parentPlayer=P0($A)),n.push(aA)}}else s2(IA,rA.fromStyles),aA.onDestroy(()=>Fg(IA,rA.toStyles)),X.push(aA),g.has(IA)&&n.push(aA)}),X.forEach(AA=>{let IA=o.get(AA.element);if(IA&&IA.length){let aA=P0(IA);AA.setRealPlayer(aA)}}),n.forEach(AA=>{AA.parentPlayer?AA.syncPlayerEvents(AA.parentPlayer):AA.destroy()});for(let AA=0;AA!UA.destroyed);uA.length?caA(this,IA,uA):this.processLeaveNode(IA)}return f.length=0,BA.forEach(AA=>{this.players.push(AA),AA.onDone(()=>{AA.destroy();let IA=this.players.indexOf(AA);this.players.splice(IA,1)}),AA.play()}),BA}afterFlush(e){this._flushFns.push(e)}afterFlushAnimationsDone(e){this._whenQuietFns.push(e)}_getPreviousPlayers(e,A,i,n,o){let a=[];if(A){let r=this.playersByQueriedElement.get(e);r&&(a=r)}else{let r=this.playersByElement.get(e);if(r){let s=!o||o==ru;r.forEach(l=>{l.queued||!s&&l.triggerName!=n||a.push(l)})}}return(i||n)&&(a=a.filter(r=>!(i&&i!=r.namespaceId||n&&n!=r.triggerName))),a}_beforeAnimationBuild(e,A,i){let n=A.triggerName,o=A.element,a=A.isRemovalTransition?void 0:e,r=A.isRemovalTransition?void 0:n;for(let s of A.timelines){let l=s.element,g=l!==o,C=js(i,l,[]);this._getPreviousPlayers(l,g,a,r,A.toState).forEach(d=>{let h=d.getRealPlayer();h.beforeDestroy&&h.beforeDestroy(),d.destroy(),C.push(d)})}s2(o,A.fromStyles)}_buildAnimation(e,A,i,n,o,a){let r=A.triggerName,s=A.element,l=[],g=new Set,C=new Set,I=A.timelines.map(h=>{let E=h.element;g.add(E);let f=E[Lg];if(f&&f.removedBeforeQueried)return new z0(h.duration,h.delay);let m=E!==s,v=CaA((i.get(E)||aaA).map(F=>F.getRealPlayer())).filter(F=>{let z=F;return z.element?z.element===E:!1}),k=o.get(E),S=a.get(E),b=zb(this._normalizer,h.keyframes,k,S),x=this._buildPlayer(h,b,v);if(h.subTimeline&&n&&C.add(E),m){let F=new gu(e,r,E);F.setRealPlayer(x),l.push(F)}return x});l.forEach(h=>{js(this.playersByQueriedElement,h.element,[]).push(h),h.onDone(()=>saA(this.playersByQueriedElement,h.element,h))}),g.forEach(h=>Pl(h,Zb));let d=P0(I);return d.onDestroy(()=>{g.forEach(h=>EB(h,Zb)),Fg(s,A.toStyles)}),C.forEach(h=>{js(n,h,[]).push(d)}),d}_buildPlayer(e,A,i){return A.length>0?this.driver.animate(e.element,A,e.duration,e.delay,e.easing,i):new z0(e.duration,e.delay)}},gu=class{namespaceId;triggerName;element;_player=new z0;_containsRealPlayer=!1;_queuedCallbacks=new Map;destroyed=!1;parentPlayer=null;markedForDestroy=!1;disabled=!1;queued=!0;totalTime=0;constructor(e,A,i){this.namespaceId=e,this.triggerName=A,this.element=i}setRealPlayer(e){this._containsRealPlayer||(this._player=e,this._queuedCallbacks.forEach((A,i)=>{A.forEach(n=>Rp(e,i,void 0,n))}),this._queuedCallbacks.clear(),this._containsRealPlayer=!0,this.overrideTotalTime(e.totalTime),this.queued=!1)}getRealPlayer(){return this._player}overrideTotalTime(e){this.totalTime=e}syncPlayerEvents(e){let A=this._player;A.triggerCallback&&e.onStart(()=>A.triggerCallback("start")),e.onDone(()=>this.finish()),e.onDestroy(()=>this.destroy())}_queueEvent(e,A){js(this._queuedCallbacks,e,[]).push(A)}onDone(e){this.queued&&this._queueEvent("done",e),this._player.onDone(e)}onStart(e){this.queued&&this._queueEvent("start",e),this._player.onStart(e)}onDestroy(e){this.queued&&this._queueEvent("destroy",e),this._player.onDestroy(e)}init(){this._player.init()}hasStarted(){return this.queued?!1:this._player.hasStarted()}play(){!this.queued&&this._player.play()}pause(){!this.queued&&this._player.pause()}restart(){!this.queued&&this._player.restart()}finish(){this._player.finish()}destroy(){this.destroyed=!0,this._player.destroy()}reset(){!this.queued&&this._player.reset()}setPosition(e){this.queued||this._player.setPosition(e)}getPosition(){return this.queued?0:this._player.getPosition()}triggerCallback(e){let A=this._player;A.triggerCallback&&A.triggerCallback(e)}};function saA(t,e,A){let i=t.get(e);if(i){if(i.length){let n=i.indexOf(A);i.splice(n,1)}i.length==0&&t.delete(e)}return i}function laA(t){return t??null}function Op(t){return t&&t.nodeType===1}function gaA(t){return t=="start"||t=="done"}function SK(t,e){let A=t.style.display;return t.style.display=e??"none",A}function kK(t,e,A,i,n){let o=[];A.forEach(s=>o.push(SK(s)));let a=[];i.forEach((s,l)=>{let g=new Map;s.forEach(C=>{let I=e.computeStyle(l,C,n);g.set(C,I),(!I||I.length==0)&&(l[Lg]=raA,a.push(l))}),t.set(l,g)});let r=0;return A.forEach(s=>SK(s,o[r++])),a}function xK(t,e){let A=new Map;if(t.forEach(r=>A.set(r,[])),e.length==0)return A;let i=1,n=new Set(e),o=new Map;function a(r){if(!r)return i;let s=o.get(r);if(s)return s;let l=r.parentNode;return A.has(l)?s=l:n.has(l)?s=i:s=a(l),o.set(r,s),s}return e.forEach(r=>{let s=a(r);s!==i&&A.get(s).push(r)}),A}function Pl(t,e){t.classList?.add(e)}function EB(t,e){t.classList?.remove(e)}function caA(t,e,A){P0(A).onDone(()=>t.processLeaveNode(e))}function CaA(t){let e=[];return KK(t,e),e}function KK(t,e){for(let A=0;An.add(o)):e.set(t,i),A.delete(t),!0}var hB=class{_driver;_normalizer;_transitionEngine;_timelineEngine;_triggerCache={};onRemovalComplete=(e,A)=>{};constructor(e,A,i){this._driver=A,this._normalizer=i,this._transitionEngine=new I7(e.body,A,i),this._timelineEngine=new c7(e.body,A,i),this._transitionEngine.onRemovalComplete=(n,o)=>this.onRemovalComplete(n,o)}registerTrigger(e,A,i,n,o){let a=e+"-"+n,r=this._triggerCache[a];if(!r){let s=[],l=[],g=NK(this._driver,o,s,l);if(s.length)throw rK(n,s);r=$oA(n,g,this._normalizer),this._triggerCache[a]=r}this._transitionEngine.registerTrigger(A,n,r)}register(e,A){this._transitionEngine.register(e,A)}destroy(e,A){this._transitionEngine.destroy(e,A)}onInsert(e,A,i,n){this._transitionEngine.insertNode(e,A,i,n)}onRemove(e,A,i){this._transitionEngine.removeNode(e,A,i)}disableAnimations(e,A){this._transitionEngine.markElementAsDisabled(e,A)}process(e,A,i,n){if(i.charAt(0)=="@"){let[o,a]=Pb(i),r=n;this._timelineEngine.command(o,A,a,r)}else this._transitionEngine.trigger(e,A,i,n)}listen(e,A,i,n,o){if(i.charAt(0)=="@"){let[a,r]=Pb(i);return this._timelineEngine.listen(a,A,r,o)}return this._transitionEngine.listen(e,A,i,n,o)}flush(e=-1){this._transitionEngine.flush(e)}get players(){return[...this._transitionEngine.players,...this._timelineEngine.players]}whenRenderingDone(){return this._transitionEngine.whenRenderingDone()}afterFlushAnimationsDone(e){this._transitionEngine.afterFlushAnimationsDone(e)}};function daA(t,e){let A=null,i=null;return Array.isArray(e)&&e.length?(A=i7(e[0]),e.length>1&&(i=i7(e[e.length-1]))):e instanceof Map&&(A=i7(e)),A||i?new BaA(t,A,i):null}var BaA=(()=>{class t{_element;_startStyles;_endStyles;static initialStylesByElement=new WeakMap;_state=0;_initialStyles;constructor(A,i,n){this._element=A,this._startStyles=i,this._endStyles=n;let o=t.initialStylesByElement.get(A);o||t.initialStylesByElement.set(A,o=new Map),this._initialStyles=o}start(){this._state<1&&(this._startStyles&&Fg(this._element,this._startStyles,this._initialStyles),this._state=1)}finish(){this.start(),this._state<2&&(Fg(this._element,this._initialStyles),this._endStyles&&(Fg(this._element,this._endStyles),this._endStyles=null),this._state=1)}destroy(){this.finish(),this._state<3&&(t.initialStylesByElement.delete(this._element),this._startStyles&&(s2(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(s2(this._element,this._endStyles),this._endStyles=null),Fg(this._element,this._initialStyles),this._state=3)}}return t})();function i7(t){let e=null;return t.forEach((A,i)=>{EaA(i)&&(e=e||new Map,e.set(i,A))}),e}function EaA(t){return t==="display"||t==="position"}var Vp=class{element;keyframes;options;_specialStyles;_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_duration;_delay;_initialized=!1;_finished=!1;_started=!1;_destroyed=!1;_finalKeyframe;_originalOnDoneFns=[];_originalOnStartFns=[];domPlayer=null;time=0;parentPlayer=null;currentSnapshot=new Map;constructor(e,A,i,n){this.element=e,this.keyframes=A,this.options=i,this._specialStyles=n,this._duration=i.duration,this._delay=i.delay||0,this.time=this._duration+this._delay}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this._buildPlayer()&&this._preparePlayerBeforeStart()}_buildPlayer(){if(this._initialized)return this.domPlayer;this._initialized=!0;let e=this.keyframes,A=this._triggerWebAnimation(this.element,e,this.options);if(!A)return this._onFinish(),null;this.domPlayer=A,this._finalKeyframe=e.length?e[e.length-1]:new Map;let i=()=>this._onFinish();return A.addEventListener("finish",i),this.onDestroy(()=>{A.removeEventListener("finish",i)}),A}_preparePlayerBeforeStart(){this._delay?this._resetDomPlayerState():this.domPlayer?.pause()}_convertKeyframesToObject(e){let A=[];return e.forEach(i=>{A.push(Object.fromEntries(i))}),A}_triggerWebAnimation(e,A,i){let n=this._convertKeyframesToObject(A);try{return e.animate(n,i)}catch(o){return null}}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}play(){let e=this._buildPlayer();e&&(this.hasStarted()||(this._onStartFns.forEach(A=>A()),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),e.play())}pause(){this.init(),this.domPlayer?.pause()}finish(){this.init(),this.domPlayer&&(this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish())}reset(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}_resetDomPlayerState(){this.domPlayer?.cancel()}restart(){this.reset(),this.play()}hasStarted(){return this._started}destroy(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}setPosition(e){this.domPlayer||this.init(),this.domPlayer&&(this.domPlayer.currentTime=e*this.time)}getPosition(){return this.domPlayer?+(this.domPlayer.currentTime??0)/this.time:this._initialized?1:0}get totalTime(){return this._delay+this._duration}beforeDestroy(){let e=new Map;this.hasStarted()&&this._finalKeyframe.forEach((i,n)=>{n!=="offset"&&e.set(n,this._finished?i:Up(this.element,n))}),this.currentSnapshot=e}triggerCallback(e){let A=e==="start"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},Wp=class{validateStyleProperty(e){return!0}validateAnimatableStyleProperty(e){return!0}containsElement(e,A){return jb(e,A)}getParentElement(e){return Fp(e)}query(e,A,i){return qb(e,A,i)}computeStyle(e,A,i){return Up(e,A)}animate(e,A,i,n,o,a=[]){let r=n==0?"both":"forwards",s={duration:i,delay:n,fill:r};o&&(s.easing=o);let l=new Map,g=a.filter(d=>d instanceof Vp);pK(i,n)&&g.forEach(d=>{d.currentSnapshot.forEach((h,E)=>l.set(E,h))});let C=uK(A).map(d=>new Map(d));C=mK(e,C,l);let I=daA(e,C);return new Vp(e,C,s,I)}};var Yp="@",UK="@.disabled",Zp=class{namespaceId;delegate;engine;_onDestroy;\u0275type=0;constructor(e,A,i,n){this.namespaceId=e,this.delegate=A,this.engine=i,this._onDestroy=n}get data(){return this.delegate.data}destroyNode(e){this.delegate.destroyNode?.(e)}destroy(){this.engine.destroy(this.namespaceId,this.delegate),this.engine.afterFlushAnimationsDone(()=>{queueMicrotask(()=>{this.delegate.destroy()})}),this._onDestroy?.()}createElement(e,A){return this.delegate.createElement(e,A)}createComment(e){return this.delegate.createComment(e)}createText(e){return this.delegate.createText(e)}appendChild(e,A){this.delegate.appendChild(e,A),this.engine.onInsert(this.namespaceId,A,e,!1)}insertBefore(e,A,i,n=!0){this.delegate.insertBefore(e,A,i),this.engine.onInsert(this.namespaceId,A,e,n)}removeChild(e,A,i,n){if(n){this.delegate.removeChild(e,A,i,n);return}this.parentNode(A)&&this.engine.onRemove(this.namespaceId,A,this.delegate)}selectRootElement(e,A){return this.delegate.selectRootElement(e,A)}parentNode(e){return this.delegate.parentNode(e)}nextSibling(e){return this.delegate.nextSibling(e)}setAttribute(e,A,i,n){this.delegate.setAttribute(e,A,i,n)}removeAttribute(e,A,i){this.delegate.removeAttribute(e,A,i)}addClass(e,A){this.delegate.addClass(e,A)}removeClass(e,A){this.delegate.removeClass(e,A)}setStyle(e,A,i,n){this.delegate.setStyle(e,A,i,n)}removeStyle(e,A,i){this.delegate.removeStyle(e,A,i)}setProperty(e,A,i){A.charAt(0)==Yp&&A==UK?this.disableAnimations(e,!!i):this.delegate.setProperty(e,A,i)}setValue(e,A){this.delegate.setValue(e,A)}listen(e,A,i,n){return this.delegate.listen(e,A,i,n)}disableAnimations(e,A){this.engine.disableAnimations(e,A)}},d7=class extends Zp{factory;constructor(e,A,i,n,o){super(A,i,n,o),this.factory=e,this.namespaceId=A}setProperty(e,A,i){A.charAt(0)==Yp?A.charAt(1)=="."&&A==UK?(i=i===void 0?!0:!!i,this.disableAnimations(e,i)):this.engine.process(this.namespaceId,e,A.slice(1),i):this.delegate.setProperty(e,A,i)}listen(e,A,i,n){if(A.charAt(0)==Yp){let o=haA(e),a=A.slice(1),r="";return a.charAt(0)!=Yp&&([a,r]=QaA(a)),this.engine.listen(this.namespaceId,o,a,r,s=>{let l=s._data||-1;this.factory.scheduleListenerCallback(l,i,s)})}return this.delegate.listen(e,A,i,n)}};function haA(t){switch(t){case"body":return document.body;case"document":return document;case"window":return window;default:return t}}function QaA(t){let e=t.indexOf("."),A=t.substring(0,e),i=t.slice(e+1);return[A,i]}var Xp=class{delegate;engine;_zone;_currentId=0;_microtaskId=1;_animationCallbacksBuffer=[];_rendererCache=new Map;_cdRecurDepth=0;constructor(e,A,i){this.delegate=e,this.engine=A,this._zone=i,A.onRemovalComplete=(n,o)=>{o?.removeChild(null,n)}}createRenderer(e,A){let n=this.delegate.createRenderer(e,A);if(!e||!A?.data?.animation){let l=this._rendererCache,g=l.get(n);if(!g){let C=()=>l.delete(n);g=new Zp("",n,this.engine,C),l.set(n,g)}return g}let o=A.id,a=A.id+"-"+this._currentId;this._currentId++,this.engine.register(a,e);let r=l=>{Array.isArray(l)?l.forEach(r):this.engine.registerTrigger(o,a,e,l.name,l)};return A.data.animation.forEach(r),new d7(this,a,n,this.engine)}begin(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()}_scheduleCountTask(){queueMicrotask(()=>{this._microtaskId++})}scheduleListenerCallback(e,A,i){if(e>=0&&eA(i));return}let n=this._animationCallbacksBuffer;n.length==0&&queueMicrotask(()=>{this._zone.run(()=>{n.forEach(o=>{let[a,r]=o;a(r)}),this._animationCallbacksBuffer=[]})}),n.push([A,i])}end(){this._cdRecurDepth--,this._cdRecurDepth==0&&this._zone.runOutsideAngular(()=>{this._scheduleCountTask(),this.engine.flush(this._microtaskId)}),this.delegate.end&&this.delegate.end()}whenRenderingDone(){return this.engine.whenRenderingDone()}componentReplaced(e){this.engine.flush(),this.delegate.componentReplaced?.(e)}};var faA=(()=>{class t extends hB{constructor(A,i,n){super(A,i,n)}ngOnDestroy(){this.flush()}static \u0275fac=function(i){return new(i||t)(Lo(ti),Lo(C1),Lo(I1))};static \u0275prov=qA({token:t,factory:t.\u0275fac})}return t})();function paA(){return new Hp}function maA(){return new Xp(w(aL),w(hB),w(qe))}var TK=[{provide:I1,useFactory:paA},{provide:hB,useClass:faA},{provide:Kr,useFactory:maA}],rYA=[{provide:C1,useClass:B7},{provide:qI,useValue:"NoopAnimations"},...TK],waA=[{provide:C1,useFactory:()=>new Wp},{provide:qI,useFactory:()=>"BrowserAnimations"},...TK];function JK(){return q3("NgEagerAnimations"),[...waA]}function wr(t){t||(t=w(sr));let e=new vi(A=>{if(t.destroyed){A.next();return}return t.onDestroy(A.next.bind(A))});return A=>A.pipe(Qt(e))}var h7=class{source;destroyed=!1;destroyRef=w(sr);constructor(e){this.source=e,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}subscribe(e){if(this.destroyed)throw new Mt(953,!1);let A=this.source.pipe(wr(this.destroyRef)).subscribe({next:i=>e(i)});return{unsubscribe:()=>A.unsubscribe()}}};function kn(t,e){return new h7(t)}function po(t,e){let A=e?.injector??w(Dt),i=new Sg(1),n=Ao(()=>{let o;try{o=t()}catch(a){ca(()=>i.error(a));return}ca(()=>i.next(o))},{injector:A,manualCleanup:!0});return A.get(sr).onDestroy(()=>{n.destroy(),i.complete()}),i.asObservable()}function Ar(t,e){let i=!e?.manualCleanup?e?.injector?.get(sr)??w(sr):null,n=DaA(e?.equal),o;e?.requireSync?o=bA({kind:0},{equal:n}):o=bA({kind:1,value:e?.initialValue},{equal:n});let a,r=t.subscribe({next:s=>o.set({kind:1,value:s}),error:s=>{o.set({kind:2,error:s}),a?.()},complete:()=>{a?.()}});if(e?.requireSync&&o().kind===0)throw new Mt(601,!1);return a=i?.onDestroy(r.unsubscribe.bind(r)),pe(()=>{let s=o();switch(s.kind){case 1:return s.value;case 2:throw s.error;case 0:throw new Mt(601,!1)}},{equal:e?.equal})}function DaA(t=Object.is){return(e,A)=>e.kind===1&&A.kind===1&&t(e.value,A.value)}function $p(t){return VF(Ye(gA({},t),{loader:void 0,stream:e=>{let A,i=()=>A?.unsubscribe();e.abortSignal.addEventListener("abort",i);let n=bA({value:void 0}),o,a=new Promise(l=>o=l);function r(l){n.set(l),o?.(n),o=void 0}let s=t.stream;if(s===void 0)throw new Mt(990,!1);return A=s(e).subscribe({next:l=>r({value:l}),error:l=>{r({error:WF(l)}),e.abortSignal.removeEventListener("abort",i)},complete:()=>{o&&r({error:new Mt(991,!1)}),e.abortSignal.removeEventListener("abort",i)}}),a}}))}function p7(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var E1=p7();function qK(t){E1=t}var d1={exec:()=>null};function Un(t,e=""){let A=typeof t=="string"?t:t.source,i={replace:(n,o)=>{let a=typeof o=="string"?o:o.source;return a=a.replace(bs.caret,"$1"),A=A.replace(n,a),i},getRegex:()=>new RegExp(A,e)};return i}var yaA=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),htmlBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}>`)},vaA=/^(?:[ \t]*(?:\n|$))+/,baA=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,MaA=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,du=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,SaA=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,m7=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,VK=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,WK=Un(VK).replace(/bull/g,m7).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),kaA=Un(VK).replace(/bull/g,m7).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),w7=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,xaA=/^[^\n]+/,D7=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,_aA=Un(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",D7).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),RaA=Un(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,m7).getRegex(),im="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",y7=/|$))/,NaA=Un("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",y7).replace("tag",im).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),ZK=Un(w7).replace("hr",du).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",im).getRegex(),FaA=Un(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",ZK).getRegex(),v7={blockquote:FaA,code:baA,def:_aA,fences:MaA,heading:SaA,hr:du,html:NaA,lheading:WK,list:RaA,newline:vaA,paragraph:ZK,table:d1,text:xaA},OK=Un("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",du).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",im).getRegex(),LaA=Ye(gA({},v7),{lheading:kaA,table:OK,paragraph:Un(w7).replace("hr",du).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",OK).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",im).getRegex()}),GaA=Ye(gA({},v7),{html:Un(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",y7).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:d1,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Un(w7).replace("hr",du).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",WK).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()}),KaA=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,UaA=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,XK=/^( {2,}|\\)\n(?!\s*$)/,TaA=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",yaA?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),tU=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,jaA=Un(tU,"u").replace(/punct/g,nm).getRegex(),qaA=Un(tU,"u").replace(/punct/g,AU).getRegex(),iU="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",VaA=Un(iU,"gu").replace(/notPunctSpace/g,$K).replace(/punctSpace/g,b7).replace(/punct/g,nm).getRegex(),WaA=Un(iU,"gu").replace(/notPunctSpace/g,YaA).replace(/punctSpace/g,OaA).replace(/punct/g,AU).getRegex(),ZaA=Un("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,$K).replace(/punctSpace/g,b7).replace(/punct/g,nm).getRegex(),XaA=Un(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,eU).getRegex(),$aA="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",ArA=Un($aA,"gu").replace(/notPunctSpace/g,zaA).replace(/punctSpace/g,HaA).replace(/punct/g,eU).getRegex(),erA=Un(/\\(punct)/,"gu").replace(/punct/g,nm).getRegex(),trA=Un(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),irA=Un(y7).replace("(?:-->|$)","-->").getRegex(),nrA=Un("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",irA).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),em=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,orA=Un(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",em).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),nU=Un(/^!?\[(label)\]\[(ref)\]/).replace("label",em).replace("ref",D7).getRegex(),oU=Un(/^!?\[(ref)\](?:\[\])?/).replace("ref",D7).getRegex(),arA=Un("reflink|nolink(?!\\()","g").replace("reflink",nU).replace("nolink",oU).getRegex(),YK=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,M7={_backpedal:d1,anyPunctuation:erA,autolink:trA,blockSkip:PaA,br:XK,code:UaA,del:d1,delLDelim:d1,delRDelim:d1,emStrongLDelim:jaA,emStrongRDelimAst:VaA,emStrongRDelimUnd:ZaA,escape:KaA,link:orA,nolink:oU,punctuation:JaA,reflink:nU,reflinkSearch:arA,tag:nrA,text:TaA,url:d1},rrA=Ye(gA({},M7),{link:Un(/^!?\[(label)\]\((.*?)\)/).replace("label",em).getRegex(),reflink:Un(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",em).getRegex()}),Q7=Ye(gA({},M7),{emStrongRDelimAst:WaA,emStrongLDelim:qaA,delLDelim:XaA,delRDelim:ArA,url:Un(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",YK).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:Un(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},HK=t=>lrA[t];function zc(t,e){if(e){if(bs.escapeTest.test(t))return t.replace(bs.escapeReplace,HK)}else if(bs.escapeTestNoEncode.test(t))return t.replace(bs.escapeReplaceNoEncode,HK);return t}function zK(t){try{t=encodeURI(t).replace(bs.percentDecode,"%")}catch(e){return null}return t}function PK(t,e){let A=t.replace(bs.findPipe,(o,a,r)=>{let s=!1,l=a;for(;--l>=0&&r[l]==="\\";)s=!s;return s?"|":" |"}),i=A.split(bs.splitPipe),n=0;if(i[0].trim()||i.shift(),i.length>0&&!i.at(-1)?.trim()&&i.pop(),e)if(i.length>e)i.splice(e);else for(;i.length0?-2:-1}function crA(t,e=0){let A=e,i="";for(let n of t)if(n===" "){let o=4-A%4;i+=" ".repeat(o),A+=o}else i+=n,A++;return i}function jK(t,e,A,i,n){let o=e.href,a=e.title||null,r=t[1].replace(n.other.outputLinkReplace,"$1");i.state.inLink=!0;let s={type:t[0].charAt(0)==="!"?"image":"link",raw:A,href:o,title:a,text:r,tokens:i.inlineTokens(r)};return i.state.inLink=!1,s}function CrA(t,e,A){let i=t.match(A.other.indentCodeCompensation);if(i===null)return e;let n=i[1];return e.split(` +`).map(o=>{let a=o.match(A.other.beginningSpace);if(a===null)return o;let[r]=a;return r.length>=n.length?o.slice(n.length):o}).join(` +`)}var tm=class{options;rules;lexer;constructor(t){this.options=t||E1}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let A=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?A:Cu(A,` +`)}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let A=e[0],i=CrA(A,e[3]||"",this.rules);return{type:"code",raw:A,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:i}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let A=e[2].trim();if(this.rules.other.endingHash.test(A)){let i=Cu(A,"#");(this.options.pedantic||!i||this.rules.other.endingSpaceChar.test(i))&&(A=i.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:A,tokens:this.lexer.inline(A)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:Cu(e[0],` +`)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let A=Cu(e[0],` +`).split(` +`),i="",n="",o=[];for(;A.length>0;){let a=!1,r=[],s;for(s=0;s1,n={type:"list",raw:"",ordered:i,start:i?+A.slice(0,-1):"",loose:!1,items:[]};A=i?`\\d{1,9}\\${A.slice(-1)}`:`\\${A}`,this.options.pedantic&&(A=i?A:"[*+-]");let o=this.rules.other.listItemRegex(A),a=!1;for(;t;){let s=!1,l="",g="";if(!(e=o.exec(t))||this.rules.block.hr.test(t))break;l=e[0],t=t.substring(l.length);let C=crA(e[2].split(` +`,1)[0],e[1].length),I=t.split(` +`,1)[0],d=!C.trim(),h=0;if(this.options.pedantic?(h=2,g=C.trimStart()):d?h=e[1].length+1:(h=C.search(this.rules.other.nonSpaceChar),h=h>4?1:h,g=C.slice(h),h+=e[1].length),d&&this.rules.other.blankLine.test(I)&&(l+=I+` +`,t=t.substring(I.length+1),s=!0),!s){let E=this.rules.other.nextBulletRegex(h),f=this.rules.other.hrRegex(h),m=this.rules.other.fencesBeginRegex(h),v=this.rules.other.headingBeginRegex(h),k=this.rules.other.htmlBeginRegex(h),S=this.rules.other.blockquoteBeginRegex(h);for(;t;){let b=t.split(` +`,1)[0],x;if(I=b,this.options.pedantic?(I=I.replace(this.rules.other.listReplaceNesting," "),x=I):x=I.replace(this.rules.other.tabCharGlobal," "),m.test(I)||v.test(I)||k.test(I)||S.test(I)||E.test(I)||f.test(I))break;if(x.search(this.rules.other.nonSpaceChar)>=h||!I.trim())g+=` +`+x.slice(h);else{if(d||C.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||m.test(C)||v.test(C)||f.test(C))break;g+=` +`+I}d=!I.trim(),l+=b+` +`,t=t.substring(b.length+1),C=x.slice(h)}}n.loose||(a?n.loose=!0:this.rules.other.doubleBlankLine.test(l)&&(a=!0)),n.items.push({type:"list_item",raw:l,task:!!this.options.gfm&&this.rules.other.listIsTask.test(g),loose:!1,text:g,tokens:[]}),n.raw+=l}let r=n.items.at(-1);if(r)r.raw=r.raw.trimEnd(),r.text=r.text.trimEnd();else return;n.raw=n.raw.trimEnd();for(let s of n.items){if(this.lexer.state.top=!1,s.tokens=this.lexer.blockTokens(s.text,[]),s.task){if(s.text=s.text.replace(this.rules.other.listReplaceTask,""),s.tokens[0]?.type==="text"||s.tokens[0]?.type==="paragraph"){s.tokens[0].raw=s.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),s.tokens[0].text=s.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let g=this.lexer.inlineQueue.length-1;g>=0;g--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[g].src)){this.lexer.inlineQueue[g].src=this.lexer.inlineQueue[g].src.replace(this.rules.other.listReplaceTask,"");break}}let l=this.rules.other.listTaskCheckbox.exec(s.raw);if(l){let g={type:"checkbox",raw:l[0]+" ",checked:l[0]!=="[ ]"};s.checked=g.checked,n.loose?s.tokens[0]&&["paragraph","text"].includes(s.tokens[0].type)&&"tokens"in s.tokens[0]&&s.tokens[0].tokens?(s.tokens[0].raw=g.raw+s.tokens[0].raw,s.tokens[0].text=g.raw+s.tokens[0].text,s.tokens[0].tokens.unshift(g)):s.tokens.unshift({type:"paragraph",raw:g.raw,text:g.raw,tokens:[g]}):s.tokens.unshift(g)}}if(!n.loose){let l=s.tokens.filter(C=>C.type==="space"),g=l.length>0&&l.some(C=>this.rules.other.anyLine.test(C.raw));n.loose=g}}if(n.loose)for(let s of n.items){s.loose=!0;for(let l of s.tokens)l.type==="text"&&(l.type="paragraph")}return n}}html(t){let e=this.rules.block.html.exec(t);if(e)return{type:"html",block:!0,raw:e[0],pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:e[0]}}def(t){let e=this.rules.block.def.exec(t);if(e){let A=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),i=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",n=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:A,raw:e[0],href:i,title:n}}}table(t){let e=this.rules.block.table.exec(t);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let A=PK(e[1]),i=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),n=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(` +`):[],o={type:"table",raw:e[0],header:[],align:[],rows:[]};if(A.length===i.length){for(let a of i)this.rules.other.tableAlignRight.test(a)?o.align.push("right"):this.rules.other.tableAlignCenter.test(a)?o.align.push("center"):this.rules.other.tableAlignLeft.test(a)?o.align.push("left"):o.align.push(null);for(let a=0;a({text:r,tokens:this.lexer.inline(r),header:!1,align:o.align[s]})));return o}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let A=e[1].charAt(e[1].length-1)===` +`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:A,tokens:this.lexer.inline(A)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){let e=this.rules.inline.link.exec(t);if(e){let A=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(A)){if(!this.rules.other.endAngleBracket.test(A))return;let o=Cu(A.slice(0,-1),"\\");if((A.length-o.length)%2===0)return}else{let o=grA(e[2],"()");if(o===-2)return;if(o>-1){let a=(e[0].indexOf("!")===0?5:4)+e[1].length+o;e[2]=e[2].substring(0,o),e[0]=e[0].substring(0,a).trim(),e[3]=""}}let i=e[2],n="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(i);o&&(i=o[1],n=o[3])}else n=e[3]?e[3].slice(1,-1):"";return i=i.trim(),this.rules.other.startAngleBracket.test(i)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(A)?i=i.slice(1):i=i.slice(1,-1)),jK(e,{href:i&&i.replace(this.rules.inline.anyPunctuation,"$1"),title:n&&n.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let A;if((A=this.rules.inline.reflink.exec(t))||(A=this.rules.inline.nolink.exec(t))){let i=(A[2]||A[1]).replace(this.rules.other.multipleSpaceGlobal," "),n=e[i.toLowerCase()];if(!n){let o=A[0].charAt(0);return{type:"text",raw:o,text:o}}return jK(A,n,A[0],this.lexer,this.rules)}}emStrong(t,e,A=""){let i=this.rules.inline.emStrongLDelim.exec(t);if(!(!i||i[3]&&A.match(this.rules.other.unicodeAlphaNumeric))&&(!(i[1]||i[2])||!A||this.rules.inline.punctuation.exec(A))){let n=[...i[0]].length-1,o,a,r=n,s=0,l=i[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(l.lastIndex=0,e=e.slice(-1*t.length+n);(i=l.exec(e))!=null;){if(o=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!o)continue;if(a=[...o].length,i[3]||i[4]){r+=a;continue}else if((i[5]||i[6])&&n%3&&!((n+a)%3)){s+=a;continue}if(r-=a,r>0)continue;a=Math.min(a,a+r+s);let g=[...i[0]][0].length,C=t.slice(0,n+i.index+g+a);if(Math.min(n,a)%2){let d=C.slice(1,-1);return{type:"em",raw:C,text:d,tokens:this.lexer.inlineTokens(d)}}let I=C.slice(2,-2);return{type:"strong",raw:C,text:I,tokens:this.lexer.inlineTokens(I)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let A=e[2].replace(this.rules.other.newLineCharGlobal," "),i=this.rules.other.nonSpaceChar.test(A),n=this.rules.other.startingSpaceChar.test(A)&&this.rules.other.endingSpaceChar.test(A);return i&&n&&(A=A.substring(1,A.length-1)),{type:"codespan",raw:e[0],text:A}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t,e,A=""){let i=this.rules.inline.delLDelim.exec(t);if(i&&(!i[1]||!A||this.rules.inline.punctuation.exec(A))){let n=[...i[0]].length-1,o,a,r=n,s=this.rules.inline.delRDelim;for(s.lastIndex=0,e=e.slice(-1*t.length+n);(i=s.exec(e))!=null;){if(o=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!o||(a=[...o].length,a!==n))continue;if(i[3]||i[4]){r+=a;continue}if(r-=a,r>0)continue;a=Math.min(a,a+r);let l=[...i[0]][0].length,g=t.slice(0,n+i.index+l+a),C=g.slice(n,-n);return{type:"del",raw:g,text:C,tokens:this.lexer.inlineTokens(C)}}}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let A,i;return e[2]==="@"?(A=e[1],i="mailto:"+A):(A=e[1],i=A),{type:"link",raw:e[0],text:A,href:i,tokens:[{type:"text",raw:A,text:A}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let A,i;if(e[2]==="@")A=e[0],i="mailto:"+A;else{let n;do n=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(n!==e[0]);A=e[0],e[1]==="www."?i="http://"+e[0]:i=e[0]}return{type:"link",raw:e[0],text:A,href:i,tokens:[{type:"text",raw:A,text:A}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let A=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:A}}}},Gg=class u7{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||E1,this.options.tokenizer=this.options.tokenizer||new tm,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let A={other:bs,block:Am.normal,inline:cu.normal};this.options.pedantic?(A.block=Am.pedantic,A.inline=cu.pedantic):this.options.gfm&&(A.block=Am.gfm,this.options.breaks?A.inline=cu.breaks:A.inline=cu.gfm),this.tokenizer.rules=A}static get rules(){return{block:Am,inline:cu}}static lex(e,A){return new u7(A).lex(e)}static lexInline(e,A){return new u7(A).inlineTokens(e)}lex(e){e=e.replace(bs.carriageReturn,` +`),this.blockTokens(e,this.tokens);for(let A=0;A(n=a.call({lexer:this},e,A))?(e=e.substring(n.raw.length),A.push(n),!0):!1))continue;if(n=this.tokenizer.space(e)){e=e.substring(n.raw.length);let a=A.at(-1);n.raw.length===1&&a!==void 0?a.raw+=` +`:A.push(n);continue}if(n=this.tokenizer.code(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(` +`)?"":` +`)+n.raw,a.text+=` +`+n.text,this.inlineQueue.at(-1).src=a.text):A.push(n);continue}if(n=this.tokenizer.fences(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.heading(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.hr(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.blockquote(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.list(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.html(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.def(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(` +`)?"":` +`)+n.raw,a.text+=` +`+n.raw,this.inlineQueue.at(-1).src=a.text):this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title},A.push(n));continue}if(n=this.tokenizer.table(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.lheading(e)){e=e.substring(n.raw.length),A.push(n);continue}let o=e;if(this.options.extensions?.startBlock){let a=1/0,r=e.slice(1),s;this.options.extensions.startBlock.forEach(l=>{s=l.call({lexer:this},r),typeof s=="number"&&s>=0&&(a=Math.min(a,s))}),a<1/0&&a>=0&&(o=e.substring(0,a+1))}if(this.state.top&&(n=this.tokenizer.paragraph(o))){let a=A.at(-1);i&&a?.type==="paragraph"?(a.raw+=(a.raw.endsWith(` +`)?"":` +`)+n.raw,a.text+=` +`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):A.push(n),i=o.length!==e.length,e=e.substring(n.raw.length);continue}if(n=this.tokenizer.text(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="text"?(a.raw+=(a.raw.endsWith(` +`)?"":` +`)+n.raw,a.text+=` +`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):A.push(n);continue}if(e){let a="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(a);break}else throw new Error(a)}}return this.state.top=!0,A}inline(e,A=[]){return this.inlineQueue.push({src:e,tokens:A}),A}inlineTokens(e,A=[]){let i=e,n=null;if(this.tokens.links){let s=Object.keys(this.tokens.links);if(s.length>0)for(;(n=this.tokenizer.rules.inline.reflinkSearch.exec(i))!=null;)s.includes(n[0].slice(n[0].lastIndexOf("[")+1,-1))&&(i=i.slice(0,n.index)+"["+"a".repeat(n[0].length-2)+"]"+i.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(n=this.tokenizer.rules.inline.anyPunctuation.exec(i))!=null;)i=i.slice(0,n.index)+"++"+i.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let o;for(;(n=this.tokenizer.rules.inline.blockSkip.exec(i))!=null;)o=n[2]?n[2].length:0,i=i.slice(0,n.index+o)+"["+"a".repeat(n[0].length-o-2)+"]"+i.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);i=this.options.hooks?.emStrongMask?.call({lexer:this},i)??i;let a=!1,r="";for(;e;){a||(r=""),a=!1;let s;if(this.options.extensions?.inline?.some(g=>(s=g.call({lexer:this},e,A))?(e=e.substring(s.raw.length),A.push(s),!0):!1))continue;if(s=this.tokenizer.escape(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.tag(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.link(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(s.raw.length);let g=A.at(-1);s.type==="text"&&g?.type==="text"?(g.raw+=s.raw,g.text+=s.text):A.push(s);continue}if(s=this.tokenizer.emStrong(e,i,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.codespan(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.br(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.del(e,i,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.autolink(e)){e=e.substring(s.raw.length),A.push(s);continue}if(!this.state.inLink&&(s=this.tokenizer.url(e))){e=e.substring(s.raw.length),A.push(s);continue}let l=e;if(this.options.extensions?.startInline){let g=1/0,C=e.slice(1),I;this.options.extensions.startInline.forEach(d=>{I=d.call({lexer:this},C),typeof I=="number"&&I>=0&&(g=Math.min(g,I))}),g<1/0&&g>=0&&(l=e.substring(0,g+1))}if(s=this.tokenizer.inlineText(l)){e=e.substring(s.raw.length),s.raw.slice(-1)!=="_"&&(r=s.raw.slice(-1)),a=!0;let g=A.at(-1);g?.type==="text"?(g.raw+=s.raw,g.text+=s.text):A.push(s);continue}if(e){let g="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(g);break}else throw new Error(g)}}return A}},l2=class{options;parser;constructor(t){this.options=t||E1}space(t){return""}code({text:t,lang:e,escaped:A}){let i=(e||"").match(bs.notSpaceStart)?.[0],n=t.replace(bs.endingNewline,"")+` +`;return i?'
      '+(A?n:zc(n,!0))+`
      +`:"
      "+(A?n:zc(n,!0))+`
      +`}blockquote({tokens:t}){return`
      +${this.parser.parse(t)}
      +`}html({text:t}){return t}def(t){return""}heading({tokens:t,depth:e}){return`${this.parser.parseInline(t)} +`}hr(t){return`
      +`}list(t){let e=t.ordered,A=t.start,i="";for(let a=0;a +`+i+" +`}listitem(t){return`
    • ${this.parser.parse(t.tokens)}
    • +`}checkbox({checked:t}){return" '}paragraph({tokens:t}){return`

      ${this.parser.parseInline(t)}

      +`}table(t){let e="",A="";for(let n=0;n${i}`),` + +`+e+` +`+i+`
      +`}tablerow({text:t}){return` +${t} +`}tablecell(t){let e=this.parser.parseInline(t.tokens),A=t.header?"th":"td";return(t.align?`<${A} align="${t.align}">`:`<${A}>`)+e+` +`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${zc(t,!0)}`}br(t){return"
      "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:A}){let i=this.parser.parseInline(A),n=zK(t);if(n===null)return i;t=n;let o='
      ",o}image({href:t,title:e,text:A,tokens:i}){i&&(A=this.parser.parseInline(i,this.parser.textRenderer));let n=zK(t);if(n===null)return zc(A);t=n;let o=`${zc(A)}{let a=n[o].flat(1/0);A=A.concat(this.walkTokens(a,e))}):n.tokens&&(A=A.concat(this.walkTokens(n.tokens,e)))}}return A}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(A=>{let i=gA({},A);if(i.async=this.defaults.async||i.async||!1,A.extensions&&(A.extensions.forEach(n=>{if(!n.name)throw new Error("extension name required");if("renderer"in n){let o=e.renderers[n.name];o?e.renderers[n.name]=function(...a){let r=n.renderer.apply(this,a);return r===!1&&(r=o.apply(this,a)),r}:e.renderers[n.name]=n.renderer}if("tokenizer"in n){if(!n.level||n.level!=="block"&&n.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=e[n.level];o?o.unshift(n.tokenizer):e[n.level]=[n.tokenizer],n.start&&(n.level==="block"?e.startBlock?e.startBlock.push(n.start):e.startBlock=[n.start]:n.level==="inline"&&(e.startInline?e.startInline.push(n.start):e.startInline=[n.start]))}"childTokens"in n&&n.childTokens&&(e.childTokens[n.name]=n.childTokens)}),i.extensions=e),A.renderer){let n=this.defaults.renderer||new l2(this.defaults);for(let o in A.renderer){if(!(o in n))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let a=o,r=A.renderer[a],s=n[a];n[a]=(...l)=>{let g=r.apply(n,l);return g===!1&&(g=s.apply(n,l)),g||""}}i.renderer=n}if(A.tokenizer){let n=this.defaults.tokenizer||new tm(this.defaults);for(let o in A.tokenizer){if(!(o in n))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let a=o,r=A.tokenizer[a],s=n[a];n[a]=(...l)=>{let g=r.apply(n,l);return g===!1&&(g=s.apply(n,l)),g}}i.tokenizer=n}if(A.hooks){let n=this.defaults.hooks||new Iu;for(let o in A.hooks){if(!(o in n))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let a=o,r=A.hooks[a],s=n[a];Iu.passThroughHooks.has(o)?n[a]=l=>{if(this.defaults.async&&Iu.passThroughHooksRespectAsync.has(o))return lt(this,null,function*(){let C=yield r.call(n,l);return s.call(n,C)});let g=r.call(n,l);return s.call(n,g)}:n[a]=(...l)=>{if(this.defaults.async)return lt(this,null,function*(){let C=yield r.apply(n,l);return C===!1&&(C=yield s.apply(n,l)),C});let g=r.apply(n,l);return g===!1&&(g=s.apply(n,l)),g}}i.hooks=n}if(A.walkTokens){let n=this.defaults.walkTokens,o=A.walkTokens;i.walkTokens=function(a){let r=[];return r.push(o.call(this,a)),n&&(r=r.concat(n.call(this,a))),r}}this.defaults=gA(gA({},this.defaults),i)}),this}setOptions(t){return this.defaults=gA(gA({},this.defaults),t),this}lexer(t,e){return Gg.lex(t,e??this.defaults)}parser(t,e){return Kg.parse(t,e??this.defaults)}parseMarkdown(t){return(e,A)=>{let i=gA({},A),n=gA(gA({},this.defaults),i),o=this.onError(!!n.silent,!!n.async);if(this.defaults.async===!0&&i.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(n.hooks&&(n.hooks.options=n,n.hooks.block=t),n.async)return lt(this,null,function*(){let a=n.hooks?yield n.hooks.preprocess(e):e,r=yield(n.hooks?yield n.hooks.provideLexer():t?Gg.lex:Gg.lexInline)(a,n),s=n.hooks?yield n.hooks.processAllTokens(r):r;n.walkTokens&&(yield Promise.all(this.walkTokens(s,n.walkTokens)));let l=yield(n.hooks?yield n.hooks.provideParser():t?Kg.parse:Kg.parseInline)(s,n);return n.hooks?yield n.hooks.postprocess(l):l}).catch(o);try{n.hooks&&(e=n.hooks.preprocess(e));let a=(n.hooks?n.hooks.provideLexer():t?Gg.lex:Gg.lexInline)(e,n);n.hooks&&(a=n.hooks.processAllTokens(a)),n.walkTokens&&this.walkTokens(a,n.walkTokens);let r=(n.hooks?n.hooks.provideParser():t?Kg.parse:Kg.parseInline)(a,n);return n.hooks&&(r=n.hooks.postprocess(r)),r}catch(a){return o(a)}}}onError(t,e){return A=>{if(A.message+=` +Please report this to https://github.com/markedjs/marked.`,t){let i="

      An error occurred:

      "+zc(A.message+"",!0)+"
      ";return e?Promise.resolve(i):i}if(e)return Promise.reject(A);throw A}}},B1=new IrA;function Pn(t,e){return B1.parse(t,e)}Pn.options=Pn.setOptions=function(t){return B1.setOptions(t),Pn.defaults=B1.defaults,qK(Pn.defaults),Pn};Pn.getDefaults=p7;Pn.defaults=E1;Pn.use=function(...t){return B1.use(...t),Pn.defaults=B1.defaults,qK(Pn.defaults),Pn};Pn.walkTokens=function(t,e){return B1.walkTokens(t,e)};Pn.parseInline=B1.parseInline;Pn.Parser=Kg;Pn.parser=Kg.parse;Pn.Renderer=l2;Pn.TextRenderer=S7;Pn.Lexer=Gg;Pn.lexer=Gg.lex;Pn.Tokenizer=tm;Pn.Hooks=Iu;Pn.parse=Pn;var uYA=Pn.options,fYA=Pn.setOptions,pYA=Pn.use,mYA=Pn.walkTokens,wYA=Pn.parseInline;var DYA=Kg.parse,yYA=Gg.lex;var drA=["*"],BrA="Copy",ErA="Copied",hrA=(()=>{class t{constructor(){this._buttonClick$=new ie,this.copied=Ar(this._buttonClick$.pipe(hi(()=>Ki(ne(!0),Y3(3e3).pipe(_Q(!1)))),kg(),Gs(1))),this.copiedText=pe(()=>this.copied()?ErA:BrA)}onCopyToClipboardClick(){this._buttonClick$.next()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["markdown-clipboard"]],decls:2,vars:3,consts:[[1,"markdown-clipboard-button",3,"click"]],template:function(i,n){i&1&&(wn(0,"button",0),qd("click",function(){return n.onCopyToClipboardClick()}),y(1),Gn()),i&2&&(RA("copied",n.copied()),u(),lA(n.copiedText()))},encapsulation:2,changeDetection:0})}}return t})(),QrA=new kA("CLIPBOARD_OPTIONS");var urA=new kA("MARKED_EXTENSIONS"),frA=new kA("MARKED_OPTIONS"),prA=new kA("MERMAID_OPTIONS"),mrA=new kA("SANITIZE");function wrA(t){return typeof t=="function"}var DrA="[ngx-markdown] When using the `emoji` attribute you *have to* include Emoji-Toolkit files to `angular.json` or use imports. See README for more information",yrA="[ngx-markdown] When using the `katex` attribute you *have to* include KaTeX files to `angular.json` or use imports. See README for more information",vrA="[ngx-markdown] When using the `mermaid` attribute you *have to* include Mermaid files to `angular.json` or use imports. See README for more information",brA="[ngx-markdown] When using the `clipboard` attribute you *have to* include Clipboard files to `angular.json` or use imports. See README for more information",MrA="[ngx-markdown] When using the `clipboard` attribute you *have to* provide the `viewContainerRef` parameter to `MarkdownService.render()` function",SrA="[ngx-markdown] When using the `src` attribute you *have to* pass the `HttpClient` as a parameter of the `forRoot` method. See README for more information";var aU=(()=>{class t{get options(){return this._options}set options(A){this._options=gA(gA({},this.DEFAULT_MARKED_OPTIONS),A)}get renderer(){return this.options.renderer}set renderer(A){this.options.renderer=A}constructor(){this.clipboardOptions=w(QrA,{optional:!0}),this.extensions=w(urA,{optional:!0}),this.http=w(fr,{optional:!0}),this.mermaidOptions=w(prA,{optional:!0}),this.platform=w(j3),this.sanitize=w(mrA,{optional:!0}),this.sanitizer=w(e2),this.DEFAULT_MARKED_OPTIONS={renderer:new l2},this.DEFAULT_KATEX_OPTIONS={delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}]},this.DEFAULT_MERMAID_OPTIONS={startOnLoad:!1},this.DEFAULT_CLIPBOARD_OPTIONS={buttonComponent:void 0},this.DEFAULT_PARSE_OPTIONS={decodeHtml:!1,inline:!1,emoji:!1,mermaid:!1,markedOptions:void 0,disableSanitizer:!1},this.DEFAULT_RENDER_OPTIONS={clipboard:!1,clipboardOptions:void 0,katex:!1,katexOptions:void 0,mermaid:!1,mermaidOptions:void 0},this.DEFAULT_SECURITY_CONTEXT=_g.HTML,this._options=null,this._reload$=new ie,this.reload$=this._reload$.asObservable(),this.options=w(frA,{optional:!0})}parse(A,i=this.DEFAULT_PARSE_OPTIONS){let{decodeHtml:n,inline:o,emoji:a,mermaid:r,disableSanitizer:s}=i,l=gA(gA({},this.options),i.markedOptions),g=l.renderer||this.renderer||new l2;this.extensions&&(this.renderer=this.extendsRendererForExtensions(g)),r&&(this.renderer=this.extendsRendererForMermaid(g));let C=this.trimIndentation(A),I=n?this.decodeHtml(C):C,d=a?this.parseEmoji(I):I,h=this.parseMarked(d,l,o);return s?h:this.sanitizeHtml(h)}render(A,i=this.DEFAULT_RENDER_OPTIONS,n){let{clipboard:o,clipboardOptions:a,katex:r,katexOptions:s,mermaid:l,mermaidOptions:g}=i;r&&this.renderKatex(A,gA(gA({},this.DEFAULT_KATEX_OPTIONS),s)),l&&this.renderMermaid(A,gA(gA(gA({},this.DEFAULT_MERMAID_OPTIONS),this.mermaidOptions),g)),o&&this.renderClipboard(A,n,gA(gA(gA({},this.DEFAULT_CLIPBOARD_OPTIONS),this.clipboardOptions),a)),this.highlight(A)}reload(){this._reload$.next()}getSource(A){if(!this.http)throw new Error(SrA);return this.http.get(A,{responseType:"text"}).pipe(we(i=>this.handleExtension(A,i)))}highlight(A){if(!O0(this.platform)||typeof Prism>"u"||typeof Prism.highlightAllUnder>"u")return;A||(A=document);let i=A.querySelectorAll('pre code:not([class*="language-"])');Array.prototype.forEach.call(i,n=>n.classList.add("language-none")),Prism.highlightAllUnder(A)}decodeHtml(A){if(!O0(this.platform))return A;let i=document.createElement("textarea");return i.innerHTML=A,i.value}extendsRendererForExtensions(A){let i=A;return i.\u0275NgxMarkdownRendererExtendedForExtensions===!0||(this.extensions&&this.extensions.length>0&&Pn.use(...this.extensions),i.\u0275NgxMarkdownRendererExtendedForExtensions=!0),A}extendsRendererForMermaid(A){let i=A;if(i.\u0275NgxMarkdownRendererExtendedForMermaid===!0)return A;let n=A.code;return A.code=o=>o.lang==="mermaid"?`
      ${o.text}
      `:n(o),i.\u0275NgxMarkdownRendererExtendedForMermaid=!0,A}handleExtension(A,i){let n=A.lastIndexOf("://"),o=n>-1?A.substring(n+4):A,a=o.lastIndexOf("/"),r=a>-1?o.substring(a+1).split("?")[0]:"",s=r.lastIndexOf("."),l=s>-1?r.substring(s+1):"";return l&&l!=="md"?"```"+l+` +`+i+"\n```":i}parseMarked(A,i,n=!1){if(i.renderer){let o=gA({},i.renderer);delete o.\u0275NgxMarkdownRendererExtendedForExtensions,delete o.\u0275NgxMarkdownRendererExtendedForMermaid,delete i.renderer,Pn.use({renderer:o})}return n?Pn.parseInline(A,i):Pn.parse(A,i)}parseEmoji(A){if(!O0(this.platform))return A;if(typeof joypixels>"u"||typeof joypixels.shortnameToUnicode>"u")throw new Error(DrA);return joypixels.shortnameToUnicode(A)}renderKatex(A,i){if(O0(this.platform)){if(typeof katex>"u"||typeof renderMathInElement>"u")throw new Error(yrA);renderMathInElement(A,i)}}renderClipboard(A,i,n){if(!O0(this.platform))return;if(typeof ClipboardJS>"u")throw new Error(brA);if(!i)throw new Error(MrA);let{buttonComponent:o,buttonTemplate:a}=n,r=A.querySelectorAll("pre");for(let s=0;sC.classList.add("hover"),g.onmouseleave=()=>C.classList.remove("hover");let I;if(o){let h=i.createComponent(o);I=h.hostView,h.changeDetectorRef.markForCheck()}else if(a)I=i.createEmbeddedView(a);else{let h=i.createComponent(hrA);I=h.hostView,h.changeDetectorRef.markForCheck()}let d;I.rootNodes.forEach(h=>{C.appendChild(h),d=new ClipboardJS(h,{text:()=>l.innerText})}),I.onDestroy(()=>d.destroy())}}renderMermaid(A,i=this.DEFAULT_MERMAID_OPTIONS){if(!O0(this.platform))return;if(typeof mermaid>"u"||typeof mermaid.initialize>"u")throw new Error(vrA);let n=A.querySelectorAll(".mermaid");n.length!==0&&(mermaid.initialize(i),mermaid.run({nodes:n}))}trimIndentation(A){if(!A)return"";let i;return A.split(` +`).map(n=>{let o=i;return n.length>0&&(o=isNaN(o)?n.search(/\S|$/):Math.min(n.search(/\S|$/),o)),isNaN(i)&&(i=o),o?n.substring(o):n}).join(` +`)}sanitizeHtml(A){return lt(this,null,function*(){return wrA(this.sanitize)?this.sanitize(yield A):this.sanitize!==_g.NONE?this.sanitizer.sanitize(this.sanitize??this.DEFAULT_SECURITY_CONTEXT,A)??"":A})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),k7=(function(t){return t.CommandLine="command-line",t.LineHighlight="line-highlight",t.LineNumbers="line-numbers",t})(k7||{}),rU=(()=>{class t{constructor(){this.element=w(ce),this.markdownService=w(aU),this.viewContainerRef=w(Mo),this.error=new LA,this.load=new LA,this.ready=new LA,this._clipboard=!1,this._commandLine=!1,this._disableSanitizer=!1,this._emoji=!1,this._inline=!1,this._katex=!1,this._lineHighlight=!1,this._lineNumbers=!1,this._mermaid=!1,this.destroyed$=new ie}get disableSanitizer(){return this._disableSanitizer}set disableSanitizer(A){this._disableSanitizer=this.coerceBooleanProperty(A)}get inline(){return this._inline}set inline(A){this._inline=this.coerceBooleanProperty(A)}get clipboard(){return this._clipboard}set clipboard(A){this._clipboard=this.coerceBooleanProperty(A)}get emoji(){return this._emoji}set emoji(A){this._emoji=this.coerceBooleanProperty(A)}get katex(){return this._katex}set katex(A){this._katex=this.coerceBooleanProperty(A)}get mermaid(){return this._mermaid}set mermaid(A){this._mermaid=this.coerceBooleanProperty(A)}get lineHighlight(){return this._lineHighlight}set lineHighlight(A){this._lineHighlight=this.coerceBooleanProperty(A)}get lineNumbers(){return this._lineNumbers}set lineNumbers(A){this._lineNumbers=this.coerceBooleanProperty(A)}get commandLine(){return this._commandLine}set commandLine(A){this._commandLine=this.coerceBooleanProperty(A)}ngOnChanges(){this.loadContent()}loadContent(){if(this.data!=null){this.handleData();return}if(this.src!=null){this.handleSrc();return}}ngAfterViewInit(){!this.data&&!this.src&&this.handleTransclusion(),this.markdownService.reload$.pipe(Qt(this.destroyed$)).subscribe(()=>this.loadContent())}ngOnDestroy(){this.destroyed$.next(),this.destroyed$.complete()}render(A,i=!1){return lt(this,null,function*(){let n={decodeHtml:i,inline:this.inline,emoji:this.emoji,mermaid:this.mermaid,disableSanitizer:this.disableSanitizer},o={clipboard:this.clipboard,clipboardOptions:this.getClipboardOptions(),katex:this.katex,katexOptions:this.katexOptions,mermaid:this.mermaid,mermaidOptions:this.mermaidOptions},a=yield this.markdownService.parse(A,n);this.element.nativeElement.innerHTML=a,this.handlePlugins(),this.markdownService.render(this.element.nativeElement,o,this.viewContainerRef),this.ready.emit()})}coerceBooleanProperty(A){return A!=null&&`${String(A)}`!="false"}getClipboardOptions(){if(this.clipboardButtonComponent||this.clipboardButtonTemplate)return{buttonComponent:this.clipboardButtonComponent,buttonTemplate:this.clipboardButtonTemplate}}handleData(){this.render(this.data)}handleSrc(){this.markdownService.getSource(this.src).subscribe({next:A=>{this.render(A).then(()=>{this.load.emit(A)})},error:A=>this.error.emit(A)})}handleTransclusion(){this.render(this.element.nativeElement.innerHTML,!0)}handlePlugins(){this.commandLine&&(this.setPluginClass(this.element.nativeElement,k7.CommandLine),this.setPluginOptions(this.element.nativeElement,{dataFilterOutput:this.filterOutput,dataHost:this.host,dataPrompt:this.prompt,dataOutput:this.output,dataUser:this.user})),this.lineHighlight&&this.setPluginOptions(this.element.nativeElement,{dataLine:this.line,dataLineOffset:this.lineOffset}),this.lineNumbers&&(this.setPluginClass(this.element.nativeElement,k7.LineNumbers),this.setPluginOptions(this.element.nativeElement,{dataStart:this.start}))}setPluginClass(A,i){let n=A.querySelectorAll("pre");for(let o=0;o{let r=i[a];if(r){let s=this.toLispCase(a);n.item(o).setAttribute(s,r.toString())}})}toLispCase(A){let i=A.match(/([A-Z])/g);if(!i)return A;let n=A.toString();for(let o=0,a=i.length;o{class t{static forRoot(A){return{ngModule:t,providers:[Bu(A)]}}static forChild(){return{ngModule:t}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275mod=Ze({type:t})}static{this.\u0275inj=We({})}}return t})();var Ri="primary",bu=Symbol("RouteTitle"),F7=class{params;constructor(e){this.params=e||{}}has(e){return Object.prototype.hasOwnProperty.call(this.params,e)}get(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A[0]:A}return null}getAll(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A:[A]}return[]}get keys(){return Object.keys(this.params)}};function Q1(t){return new F7(t)}function x7(t,e,A){for(let i=0;it.length||A.pathMatch==="full"&&(e.hasChildren()||i.lengtht.length||A.pathMatch==="full"&&e.hasChildren()&&A.path!=="**")return null;let r={};return!x7(o,t.slice(0,o.length),r)||!x7(a,t.slice(t.length-a.length),r)?null:{consumed:t,posParams:r}}function gm(t){return new Promise((e,A)=>{t.pipe($n()).subscribe({next:i=>e(i),error:i=>A(i)})})}function _rA(t,e){if(t.length!==e.length)return!1;for(let A=0;Ai[o]===n)}else return t===e}function RrA(t){return t.length>0?t[t.length-1]:null}function f1(t){return zd(t)?t:$3(t)?Lr(Promise.resolve(t)):ne(t)}function QU(t){return zd(t)?gm(t):Promise.resolve(t)}var NrA={exact:pU,subset:mU},uU={exact:FrA,subset:LrA,ignored:()=>!0},fU={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},G7={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"};function lU(t,e,A){return NrA[A.paths](t.root,e.root,A.matrixParams)&&uU[A.queryParams](t.queryParams,e.queryParams)&&!(A.fragment==="exact"&&t.fragment!==e.fragment)}function FrA(t,e){return Pc(t,e)}function pU(t,e,A){if(!h1(t.segments,e.segments)||!rm(t.segments,e.segments,A)||t.numberOfChildren!==e.numberOfChildren)return!1;for(let i in e.children)if(!t.children[i]||!pU(t.children[i],e.children[i],A))return!1;return!0}function LrA(t,e){return Object.keys(e).length<=Object.keys(t).length&&Object.keys(e).every(A=>hU(t[A],e[A]))}function mU(t,e,A){return wU(t,e,e.segments,A)}function wU(t,e,A,i){if(t.segments.length>A.length){let n=t.segments.slice(0,A.length);return!(!h1(n,A)||e.hasChildren()||!rm(n,A,i))}else if(t.segments.length===A.length){if(!h1(t.segments,A)||!rm(t.segments,A,i))return!1;for(let n in e.children)if(!t.children[n]||!mU(t.children[n],e.children[n],i))return!1;return!0}else{let n=A.slice(0,t.segments.length),o=A.slice(t.segments.length);return!h1(t.segments,n)||!rm(t.segments,n,i)||!t.children[Ri]?!1:wU(t.children[Ri],e,o,i)}}function rm(t,e,A){return e.every((i,n)=>uU[A](t[n].parameters,i.parameters))}var ql=class{root;queryParams;fragment;_queryParamMap;constructor(e=new so([],{}),A={},i=null){this.root=e,this.queryParams=A,this.fragment=i}get queryParamMap(){return this._queryParamMap??=Q1(this.queryParams),this._queryParamMap}toString(){return UrA.serialize(this)}},so=class{segments;children;parent=null;constructor(e,A){this.segments=e,this.children=A,Object.values(A).forEach(i=>i.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return sm(this)}},g2=class{path;parameters;_parameterMap;constructor(e,A){this.path=e,this.parameters=A}get parameterMap(){return this._parameterMap??=Q1(this.parameters),this._parameterMap}toString(){return yU(this)}};function GrA(t,e){return h1(t,e)&&t.every((A,i)=>Pc(A.parameters,e[i].parameters))}function h1(t,e){return t.length!==e.length?!1:t.every((A,i)=>A.path===e[i].path)}function KrA(t,e){let A=[];return Object.entries(t.children).forEach(([i,n])=>{i===Ri&&(A=A.concat(e(n,i)))}),Object.entries(t.children).forEach(([i,n])=>{i!==Ri&&(A=A.concat(e(n,i)))}),A}var p1=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:()=>new q0,providedIn:"root"})}return t})(),q0=class{parse(e){let A=new U7(e);return new ql(A.parseRootSegment(),A.parseQueryParams(),A.parseFragment())}serialize(e){let A=`/${Eu(e.root,!0)}`,i=OrA(e.queryParams),n=typeof e.fragment=="string"?`#${TrA(e.fragment)}`:"";return`${A}${i}${n}`}},UrA=new q0;function sm(t){return t.segments.map(e=>yU(e)).join("/")}function Eu(t,e){if(!t.hasChildren())return sm(t);if(e){let A=t.children[Ri]?Eu(t.children[Ri],!1):"",i=[];return Object.entries(t.children).forEach(([n,o])=>{n!==Ri&&i.push(`${n}:${Eu(o,!1)}`)}),i.length>0?`${A}(${i.join("//")})`:A}else{let A=KrA(t,(i,n)=>n===Ri?[Eu(t.children[Ri],!1)]:[`${n}:${Eu(i,!1)}`]);return Object.keys(t.children).length===1&&t.children[Ri]!=null?`${sm(t)}/${A[0]}`:`${sm(t)}/(${A.join("//")})`}}function DU(t){return encodeURIComponent(t).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function om(t){return DU(t).replace(/%3B/gi,";")}function TrA(t){return encodeURI(t)}function K7(t){return DU(t).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function lm(t){return decodeURIComponent(t)}function gU(t){return lm(t.replace(/\+/g,"%20"))}function yU(t){return`${K7(t.path)}${JrA(t.parameters)}`}function JrA(t){return Object.entries(t).map(([e,A])=>`;${K7(e)}=${K7(A)}`).join("")}function OrA(t){let e=Object.entries(t).map(([A,i])=>Array.isArray(i)?i.map(n=>`${om(A)}=${om(n)}`).join("&"):`${om(A)}=${om(i)}`).filter(A=>A);return e.length?`?${e.join("&")}`:""}var YrA=/^[^\/()?;#]+/;function _7(t){let e=t.match(YrA);return e?e[0]:""}var HrA=/^[^\/()?;=#]+/;function zrA(t){let e=t.match(HrA);return e?e[0]:""}var PrA=/^[^=?&#]+/;function jrA(t){let e=t.match(PrA);return e?e[0]:""}var qrA=/^[^&#]+/;function VrA(t){let e=t.match(qrA);return e?e[0]:""}var U7=class{url;remaining;constructor(e){this.url=e,this.remaining=e}parseRootSegment(){return this.consumeOptional("/"),this.remaining===""||this.peekStartsWith("?")||this.peekStartsWith("#")?new so([],{}):new so([],this.parseChildren())}parseQueryParams(){let e={};if(this.consumeOptional("?"))do this.parseQueryParam(e);while(this.consumeOptional("&"));return e}parseFragment(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}parseChildren(e=0){if(e>50)throw new Mt(4010,!1);if(this.remaining==="")return{};this.consumeOptional("/");let A=[];for(this.peekStartsWith("(")||A.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),A.push(this.parseSegment());let i={};this.peekStartsWith("/(")&&(this.capture("/"),i=this.parseParens(!0,e));let n={};return this.peekStartsWith("(")&&(n=this.parseParens(!1,e)),(A.length>0||Object.keys(i).length>0)&&(n[Ri]=new so(A,i)),n}parseSegment(){let e=_7(this.remaining);if(e===""&&this.peekStartsWith(";"))throw new Mt(4009,!1);return this.capture(e),new g2(lm(e),this.parseMatrixParams())}parseMatrixParams(){let e={};for(;this.consumeOptional(";");)this.parseParam(e);return e}parseParam(e){let A=zrA(this.remaining);if(!A)return;this.capture(A);let i="";if(this.consumeOptional("=")){let n=_7(this.remaining);n&&(i=n,this.capture(i))}e[lm(A)]=lm(i)}parseQueryParam(e){let A=jrA(this.remaining);if(!A)return;this.capture(A);let i="";if(this.consumeOptional("=")){let a=VrA(this.remaining);a&&(i=a,this.capture(i))}let n=gU(A),o=gU(i);if(e.hasOwnProperty(n)){let a=e[n];Array.isArray(a)||(a=[a],e[n]=a),a.push(o)}else e[n]=o}parseParens(e,A){let i={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){let n=_7(this.remaining),o=this.remaining[n.length];if(o!=="/"&&o!==")"&&o!==";")throw new Mt(4010,!1);let a;n.indexOf(":")>-1?(a=n.slice(0,n.indexOf(":")),this.capture(a),this.capture(":")):e&&(a=Ri);let r=this.parseChildren(A+1);i[a??Ri]=Object.keys(r).length===1&&r[Ri]?r[Ri]:new so([],r),this.consumeOptional("//")}return i}peekStartsWith(e){return this.remaining.startsWith(e)}consumeOptional(e){return this.peekStartsWith(e)?(this.remaining=this.remaining.substring(e.length),!0):!1}capture(e){if(!this.consumeOptional(e))throw new Mt(4011,!1)}};function vU(t){return t.segments.length>0?new so([],{[Ri]:t}):t}function bU(t){let e={};for(let[i,n]of Object.entries(t.children)){let o=bU(n);if(i===Ri&&o.segments.length===0&&o.hasChildren())for(let[a,r]of Object.entries(o.children))e[a]=r;else(o.segments.length>0||o.hasChildren())&&(e[i]=o)}let A=new so(t.segments,e);return WrA(A)}function WrA(t){if(t.numberOfChildren===1&&t.children[Ri]){let e=t.children[Ri];return new so(t.segments.concat(e.segments),e.children)}return t}function mB(t){return t instanceof ql}function MU(t,e,A=null,i=null,n=new q0){let o=SU(t);return kU(o,e,A,i,n)}function SU(t){let e;function A(o){let a={};for(let s of o.children){let l=A(s);a[s.outlet]=l}let r=new so(o.url,a);return o===t&&(e=r),r}let i=A(t.root),n=vU(i);return e??n}function kU(t,e,A,i,n){let o=t;for(;o.parent;)o=o.parent;if(e.length===0)return R7(o,o,o,A,i,n);let a=ZrA(e);if(a.toRoot())return R7(o,o,new so([],{}),A,i,n);let r=XrA(a,o,t),s=r.processChildren?Qu(r.segmentGroup,r.index,a.commands):_U(r.segmentGroup,r.index,a.commands);return R7(o,r.segmentGroup,s,A,i,n)}function cm(t){return typeof t=="object"&&t!=null&&!t.outlets&&!t.segmentPath}function fu(t){return typeof t=="object"&&t!=null&&t.outlets}function cU(t,e,A){t||="\u0275";let i=new ql;return i.queryParams={[t]:e},A.parse(A.serialize(i)).queryParams[t]}function R7(t,e,A,i,n,o){let a={};for(let[l,g]of Object.entries(i??{}))a[l]=Array.isArray(g)?g.map(C=>cU(l,C,o)):cU(l,g,o);let r;t===e?r=A:r=xU(t,e,A);let s=vU(bU(r));return new ql(s,a,n)}function xU(t,e,A){let i={};return Object.entries(t.children).forEach(([n,o])=>{o===e?i[n]=A:i[n]=xU(o,e,A)}),new so(t.segments,i)}var Cm=class{isAbsolute;numberOfDoubleDots;commands;constructor(e,A,i){if(this.isAbsolute=e,this.numberOfDoubleDots=A,this.commands=i,e&&i.length>0&&cm(i[0]))throw new Mt(4003,!1);let n=i.find(fu);if(n&&n!==RrA(i))throw new Mt(4004,!1)}toRoot(){return this.isAbsolute&&this.commands.length===1&&this.commands[0]=="/"}};function ZrA(t){if(typeof t[0]=="string"&&t.length===1&&t[0]==="/")return new Cm(!0,0,t);let e=0,A=!1,i=t.reduce((n,o,a)=>{if(typeof o=="object"&&o!=null){if(o.outlets){let r={};return Object.entries(o.outlets).forEach(([s,l])=>{r[s]=typeof l=="string"?l.split("/"):l}),[...n,{outlets:r}]}if(o.segmentPath)return[...n,o.segmentPath]}return typeof o!="string"?[...n,o]:a===0?(o.split("/").forEach((r,s)=>{s==0&&r==="."||(s==0&&r===""?A=!0:r===".."?e++:r!=""&&n.push(r))}),n):[...n,o]},[]);return new Cm(A,e,i)}var uB=class{segmentGroup;processChildren;index;constructor(e,A,i){this.segmentGroup=e,this.processChildren=A,this.index=i}};function XrA(t,e,A){if(t.isAbsolute)return new uB(e,!0,0);if(!A)return new uB(e,!1,NaN);if(A.parent===null)return new uB(A,!0,0);let i=cm(t.commands[0])?0:1,n=A.segments.length-1+i;return $rA(A,n,t.numberOfDoubleDots)}function $rA(t,e,A){let i=t,n=e,o=A;for(;o>n;){if(o-=n,i=i.parent,!i)throw new Mt(4005,!1);n=i.segments.length}return new uB(i,!1,n-o)}function AsA(t){return fu(t[0])?t[0].outlets:{[Ri]:t}}function _U(t,e,A){if(t??=new so([],{}),t.segments.length===0&&t.hasChildren())return Qu(t,e,A);let i=esA(t,e,A),n=A.slice(i.commandIndex);if(i.match&&i.pathIndexo!==Ri)&&t.children[Ri]&&t.numberOfChildren===1&&t.children[Ri].segments.length===0){let o=Qu(t.children[Ri],e,A);return new so(t.segments,o.children)}return Object.entries(i).forEach(([o,a])=>{typeof a=="string"&&(a=[a]),a!==null&&(n[o]=_U(t.children[o],e,a))}),Object.entries(t.children).forEach(([o,a])=>{i[o]===void 0&&(n[o]=a)}),new so(t.segments,n)}}function esA(t,e,A){let i=0,n=e,o={match:!1,pathIndex:0,commandIndex:0};for(;n=A.length)return o;let a=t.segments[n],r=A[i];if(fu(r))break;let s=`${r}`,l=i0&&s===void 0)break;if(s&&l&&typeof l=="object"&&l.outlets===void 0){if(!IU(s,l,a))return o;i+=2}else{if(!IU(s,{},a))return o;i++}n++}return{match:!0,pathIndex:n,commandIndex:i}}function T7(t,e,A){let i=t.segments.slice(0,e),n=0;for(;n{typeof i=="string"&&(i=[i]),i!==null&&(e[A]=T7(new so([],{}),0,i))}),e}function CU(t){let e={};return Object.entries(t).forEach(([A,i])=>e[A]=`${i}`),e}function IU(t,e,A){return t==A.path&&Pc(e,A.parameters)}var fB="imperative",gr=(function(t){return t[t.NavigationStart=0]="NavigationStart",t[t.NavigationEnd=1]="NavigationEnd",t[t.NavigationCancel=2]="NavigationCancel",t[t.NavigationError=3]="NavigationError",t[t.RoutesRecognized=4]="RoutesRecognized",t[t.ResolveStart=5]="ResolveStart",t[t.ResolveEnd=6]="ResolveEnd",t[t.GuardsCheckStart=7]="GuardsCheckStart",t[t.GuardsCheckEnd=8]="GuardsCheckEnd",t[t.RouteConfigLoadStart=9]="RouteConfigLoadStart",t[t.RouteConfigLoadEnd=10]="RouteConfigLoadEnd",t[t.ChildActivationStart=11]="ChildActivationStart",t[t.ChildActivationEnd=12]="ChildActivationEnd",t[t.ActivationStart=13]="ActivationStart",t[t.ActivationEnd=14]="ActivationEnd",t[t.Scroll=15]="Scroll",t[t.NavigationSkipped=16]="NavigationSkipped",t})(gr||{}),bl=class{id;url;constructor(e,A){this.id=e,this.url=A}},c2=class extends bl{type=gr.NavigationStart;navigationTrigger;restoredState;constructor(e,A,i="imperative",n=null){super(e,A),this.navigationTrigger=i,this.restoredState=n}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}},Ug=class extends bl{urlAfterRedirects;type=gr.NavigationEnd;constructor(e,A,i){super(e,A),this.urlAfterRedirects=i}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}},ss=(function(t){return t[t.Redirect=0]="Redirect",t[t.SupersededByNewNavigation=1]="SupersededByNewNavigation",t[t.NoDataFromResolver=2]="NoDataFromResolver",t[t.GuardRejected=3]="GuardRejected",t[t.Aborted=4]="Aborted",t})(ss||{}),wB=(function(t){return t[t.IgnoredSameUrlNavigation=0]="IgnoredSameUrlNavigation",t[t.IgnoredByUrlHandlingStrategy=1]="IgnoredByUrlHandlingStrategy",t})(wB||{}),jl=class extends bl{reason;code;type=gr.NavigationCancel;constructor(e,A,i,n){super(e,A),this.reason=i,this.code=n}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}};function RU(t){return t instanceof jl&&(t.code===ss.Redirect||t.code===ss.SupersededByNewNavigation)}var qc=class extends bl{reason;code;type=gr.NavigationSkipped;constructor(e,A,i,n){super(e,A),this.reason=i,this.code=n}},u1=class extends bl{error;target;type=gr.NavigationError;constructor(e,A,i,n){super(e,A),this.error=i,this.target=n}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}},pu=class extends bl{urlAfterRedirects;state;type=gr.RoutesRecognized;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Im=class extends bl{urlAfterRedirects;state;type=gr.GuardsCheckStart;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},dm=class extends bl{urlAfterRedirects;state;shouldActivate;type=gr.GuardsCheckEnd;constructor(e,A,i,n,o){super(e,A),this.urlAfterRedirects=i,this.state=n,this.shouldActivate=o}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}},Bm=class extends bl{urlAfterRedirects;state;type=gr.ResolveStart;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Em=class extends bl{urlAfterRedirects;state;type=gr.ResolveEnd;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},hm=class{route;type=gr.RouteConfigLoadStart;constructor(e){this.route=e}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}},Qm=class{route;type=gr.RouteConfigLoadEnd;constructor(e){this.route=e}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}},um=class{snapshot;type=gr.ChildActivationStart;constructor(e){this.snapshot=e}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},fm=class{snapshot;type=gr.ChildActivationEnd;constructor(e){this.snapshot=e}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},pm=class{snapshot;type=gr.ActivationStart;constructor(e){this.snapshot=e}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},mm=class{snapshot;type=gr.ActivationEnd;constructor(e){this.snapshot=e}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},DB=class{routerEvent;position;anchor;scrollBehavior;type=gr.Scroll;constructor(e,A,i,n){this.routerEvent=e,this.position=A,this.anchor=i,this.scrollBehavior=n}toString(){let e=this.position?`${this.position[0]}, ${this.position[1]}`:null;return`Scroll(anchor: '${this.anchor}', position: '${e}')`}},yB=class{},mu=class{},vB=class{url;navigationBehaviorOptions;constructor(e,A){this.url=e,this.navigationBehaviorOptions=A}};function isA(t){return!(t instanceof yB)&&!(t instanceof vB)&&!(t instanceof mu)}var wm=class{rootInjector;outlet=null;route=null;children;attachRef=null;get injector(){return this.route?.snapshot._environmentInjector??this.rootInjector}constructor(e){this.rootInjector=e,this.children=new m1(this.rootInjector)}},m1=(()=>{class t{rootInjector;contexts=new Map;constructor(A){this.rootInjector=A}onChildOutletCreated(A,i){let n=this.getOrCreateContext(A);n.outlet=i,this.contexts.set(A,n)}onChildOutletDestroyed(A){let i=this.getContext(A);i&&(i.outlet=null,i.attachRef=null)}onOutletDeactivated(){let A=this.contexts;return this.contexts=new Map,A}onOutletReAttached(A){this.contexts=A}getOrCreateContext(A){let i=this.getContext(A);return i||(i=new wm(this.rootInjector),this.contexts.set(A,i)),i}getContext(A){return this.contexts.get(A)||null}static \u0275fac=function(i){return new(i||t)(Lo(Gr))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Dm=class{_root;constructor(e){this._root=e}get root(){return this._root.value}parent(e){let A=this.pathFromRoot(e);return A.length>1?A[A.length-2]:null}children(e){let A=J7(e,this._root);return A?A.children.map(i=>i.value):[]}firstChild(e){let A=J7(e,this._root);return A&&A.children.length>0?A.children[0].value:null}siblings(e){let A=O7(e,this._root);return A.length<2?[]:A[A.length-2].children.map(n=>n.value).filter(n=>n!==e)}pathFromRoot(e){return O7(e,this._root).map(A=>A.value)}};function J7(t,e){if(t===e.value)return e;for(let A of e.children){let i=J7(t,A);if(i)return i}return null}function O7(t,e){if(t===e.value)return[e];for(let A of e.children){let i=O7(t,A);if(i.length)return i.unshift(e),i}return[]}var vl=class{value;children;constructor(e,A){this.value=e,this.children=A}toString(){return`TreeNode(${this.value})`}};function QB(t){let e={};return t&&t.children.forEach(A=>e[A.value.outlet]=A),e}var wu=class extends Dm{snapshot;constructor(e,A){super(e),this.snapshot=A,Z7(this,e)}toString(){return this.snapshot.toString()}};function NU(t,e){let A=nsA(t,e),i=new ei([new g2("",{})]),n=new ei({}),o=new ei({}),a=new ei({}),r=new ei(""),s=new Vs(i,n,a,r,o,Ri,t,A.root);return s.snapshot=A.root,new wu(new vl(s,[]),A)}function nsA(t,e){let A={},i={},n={},a=new bB([],A,n,"",i,Ri,t,null,{},e);return new Du("",new vl(a,[]))}var Vs=class{urlSubject;paramsSubject;queryParamsSubject;fragmentSubject;dataSubject;outlet;component;snapshot;_futureSnapshot;_routerState;_paramMap;_queryParamMap;title;url;params;queryParams;fragment;data;constructor(e,A,i,n,o,a,r,s){this.urlSubject=e,this.paramsSubject=A,this.queryParamsSubject=i,this.fragmentSubject=n,this.dataSubject=o,this.outlet=a,this.component=r,this._futureSnapshot=s,this.title=this.dataSubject?.pipe(we(l=>l[bu]))??ne(void 0),this.url=e,this.params=A,this.queryParams=i,this.fragment=n,this.data=o}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=this.params.pipe(we(e=>Q1(e))),this._paramMap}get queryParamMap(){return this._queryParamMap??=this.queryParams.pipe(we(e=>Q1(e))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}};function W7(t,e,A="emptyOnly"){let i,{routeConfig:n}=t;return e!==null&&(A==="always"||n?.path===""||!e.component&&!e.routeConfig?.loadComponent)?i={params:gA(gA({},e.params),t.params),data:gA(gA({},e.data),t.data),resolve:gA(gA(gA(gA({},t.data),e.data),n?.data),t._resolvedData)}:i={params:gA({},t.params),data:gA({},t.data),resolve:gA(gA({},t.data),t._resolvedData??{})},n&&LU(n)&&(i.resolve[bu]=n.title),i}var bB=class{url;params;queryParams;fragment;data;outlet;component;routeConfig;_resolve;_resolvedData;_routerState;_paramMap;_queryParamMap;_environmentInjector;get title(){return this.data?.[bu]}constructor(e,A,i,n,o,a,r,s,l,g){this.url=e,this.params=A,this.queryParams=i,this.fragment=n,this.data=o,this.outlet=a,this.component=r,this.routeConfig=s,this._resolve=l,this._environmentInjector=g}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=Q1(this.params),this._paramMap}get queryParamMap(){return this._queryParamMap??=Q1(this.queryParams),this._queryParamMap}toString(){let e=this.url.map(i=>i.toString()).join("/"),A=this.routeConfig?this.routeConfig.path:"";return`Route(url:'${e}', path:'${A}')`}},Du=class extends Dm{url;constructor(e,A){super(A),this.url=e,Z7(this,A)}toString(){return FU(this._root)}};function Z7(t,e){e.value._routerState=t,e.children.forEach(A=>Z7(t,A))}function FU(t){let e=t.children.length>0?` { ${t.children.map(FU).join(", ")} } `:"";return`${t.value}${e}`}function N7(t){if(t.snapshot){let e=t.snapshot,A=t._futureSnapshot;t.snapshot=A,Pc(e.queryParams,A.queryParams)||t.queryParamsSubject.next(A.queryParams),e.fragment!==A.fragment&&t.fragmentSubject.next(A.fragment),Pc(e.params,A.params)||t.paramsSubject.next(A.params),_rA(e.url,A.url)||t.urlSubject.next(A.url),Pc(e.data,A.data)||t.dataSubject.next(A.data)}else t.snapshot=t._futureSnapshot,t.dataSubject.next(t._futureSnapshot.data)}function Y7(t,e){let A=Pc(t.params,e.params)&&GrA(t.url,e.url),i=!t.parent!=!e.parent;return A&&!i&&(!t.parent||Y7(t.parent,e.parent))}function LU(t){return typeof t.title=="string"||t.title===null}var GU=new kA(""),X7=(()=>{class t{activated=null;get activatedComponentRef(){return this.activated}_activatedRoute=null;name=Ri;activateEvents=new LA;deactivateEvents=new LA;attachEvents=new LA;detachEvents=new LA;routerOutletData=me();parentContexts=w(m1);location=w(Mo);changeDetector=w(wt);inputBinder=w(Mu,{optional:!0});supportsBindingToComponentInputs=!0;ngOnChanges(A){if(A.name){let{firstChange:i,previousValue:n}=A.name;if(i)return;this.isTrackedInParentContexts(n)&&(this.deactivate(),this.parentContexts.onChildOutletDestroyed(n)),this.initializeOutletWithName()}}ngOnDestroy(){this.isTrackedInParentContexts(this.name)&&this.parentContexts.onChildOutletDestroyed(this.name),this.inputBinder?.unsubscribeFromRouteData(this)}isTrackedInParentContexts(A){return this.parentContexts.getContext(A)?.outlet===this}ngOnInit(){this.initializeOutletWithName()}initializeOutletWithName(){if(this.parentContexts.onChildOutletCreated(this.name,this),this.activated)return;let A=this.parentContexts.getContext(this.name);A?.route&&(A.attachRef?this.attach(A.attachRef,A.route):this.activateWith(A.route,A.injector))}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new Mt(4012,!1);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new Mt(4012,!1);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new Mt(4012,!1);this.location.detach();let A=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(A.instance),A}attach(A,i){this.activated=A,this._activatedRoute=i,this.location.insert(A.hostView),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.attachEvents.emit(A.instance)}deactivate(){if(this.activated){let A=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(A)}}activateWith(A,i){if(this.isActivated)throw new Mt(4013,!1);this._activatedRoute=A;let n=this.location,a=A.snapshot.component,r=this.parentContexts.getOrCreateContext(this.name).children,s=new H7(A,r,n.injector,this.routerOutletData);this.activated=n.createComponent(a,{index:n.length,injector:s,environmentInjector:i}),this.changeDetector.markForCheck(),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.activateEvents.emit(this.activated.instance)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["router-outlet"]],inputs:{name:"name",routerOutletData:[1,"routerOutletData"]},outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"],features:[Yt]})}return t})(),H7=class{route;childContexts;parent;outletData;constructor(e,A,i,n){this.route=e,this.childContexts=A,this.parent=i,this.outletData=n}get(e,A){return e===Vs?this.route:e===m1?this.childContexts:e===GU?this.outletData:this.parent.get(e,A)}},Mu=new kA(""),$7=(()=>{class t{outletDataSubscriptions=new Map;bindActivatedRouteToOutletComponent(A){this.unsubscribeFromRouteData(A),this.subscribeToRouteData(A)}unsubscribeFromRouteData(A){this.outletDataSubscriptions.get(A)?.unsubscribe(),this.outletDataSubscriptions.delete(A)}subscribeToRouteData(A){let{activatedRoute:i}=A,n=Qr([i.queryParams,i.params,i.data]).pipe(hi(([o,a,r],s)=>(r=gA(gA(gA({},o),a),r),s===0?ne(r):Promise.resolve(r)))).subscribe(o=>{if(!A.isActivated||!A.activatedComponentRef||A.activatedRoute!==i||i.component===null){this.unsubscribeFromRouteData(A);return}let a=AL(i.component);if(!a){this.unsubscribeFromRouteData(A);return}for(let{templateName:r}of a.inputs)A.activatedComponentRef.setInput(r,o[r])});this.outletDataSubscriptions.set(A,n)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac})}return t})(),AM=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["ng-component"]],exportAs:["emptyRouterOutlet"],decls:1,vars:0,template:function(i,n){i&1&&hA(0,"router-outlet")},dependencies:[X7],encapsulation:2})}return t})();function eM(t){let e=t.children&&t.children.map(eM),A=e?Ye(gA({},t),{children:e}):gA({},t);return!A.component&&!A.loadComponent&&(e||A.loadChildren)&&A.outlet&&A.outlet!==Ri&&(A.component=AM),A}function osA(t,e,A){let i=yu(t,e._root,A?A._root:void 0);return new wu(i,e)}function yu(t,e,A){if(A&&t.shouldReuseRoute(e.value,A.value.snapshot)){let i=A.value;i._futureSnapshot=e.value;let n=asA(t,e,A);return new vl(i,n)}else{if(t.shouldAttach(e.value)){let o=t.retrieve(e.value);if(o!==null){let a=o.route;return a.value._futureSnapshot=e.value,a.children=e.children.map(r=>yu(t,r)),a}}let i=rsA(e.value),n=e.children.map(o=>yu(t,o));return new vl(i,n)}}function asA(t,e,A){return e.children.map(i=>{for(let n of A.children)if(t.shouldReuseRoute(i.value,n.value.snapshot))return yu(t,i,n);return yu(t,i)})}function rsA(t){return new Vs(new ei(t.url),new ei(t.params),new ei(t.queryParams),new ei(t.fragment),new ei(t.data),t.outlet,t.component,t)}var MB=class{redirectTo;navigationBehaviorOptions;constructor(e,A){this.redirectTo=e,this.navigationBehaviorOptions=A}},KU="ngNavigationCancelingError";function ym(t,e){let{redirectTo:A,navigationBehaviorOptions:i}=mB(e)?{redirectTo:e,navigationBehaviorOptions:void 0}:e,n=UU(!1,ss.Redirect);return n.url=A,n.navigationBehaviorOptions=i,n}function UU(t,e){let A=new Error(`NavigationCancelingError: ${t||""}`);return A[KU]=!0,A.cancellationCode=e,A}function ssA(t){return TU(t)&&mB(t.url)}function TU(t){return!!t&&t[KU]}var z7=class{routeReuseStrategy;futureState;currState;forwardEvent;inputBindingEnabled;constructor(e,A,i,n,o){this.routeReuseStrategy=e,this.futureState=A,this.currState=i,this.forwardEvent=n,this.inputBindingEnabled=o}activate(e){let A=this.futureState._root,i=this.currState?this.currState._root:null;this.deactivateChildRoutes(A,i,e),N7(this.futureState.root),this.activateChildRoutes(A,i,e)}deactivateChildRoutes(e,A,i){let n=QB(A);e.children.forEach(o=>{let a=o.value.outlet;this.deactivateRoutes(o,n[a],i),delete n[a]}),Object.values(n).forEach(o=>{this.deactivateRouteAndItsChildren(o,i)})}deactivateRoutes(e,A,i){let n=e.value,o=A?A.value:null;if(n===o)if(n.component){let a=i.getContext(n.outlet);a&&this.deactivateChildRoutes(e,A,a.children)}else this.deactivateChildRoutes(e,A,i);else o&&this.deactivateRouteAndItsChildren(A,i)}deactivateRouteAndItsChildren(e,A){e.value.component&&this.routeReuseStrategy.shouldDetach(e.value.snapshot)?this.detachAndStoreRouteSubtree(e,A):this.deactivateRouteAndOutlet(e,A)}detachAndStoreRouteSubtree(e,A){let i=A.getContext(e.value.outlet),n=i&&e.value.component?i.children:A,o=QB(e);for(let a of Object.values(o))this.deactivateRouteAndItsChildren(a,n);if(i&&i.outlet){let a=i.outlet.detach(),r=i.children.onOutletDeactivated();this.routeReuseStrategy.store(e.value.snapshot,{componentRef:a,route:e,contexts:r})}}deactivateRouteAndOutlet(e,A){let i=A.getContext(e.value.outlet),n=i&&e.value.component?i.children:A,o=QB(e);for(let a of Object.values(o))this.deactivateRouteAndItsChildren(a,n);i&&(i.outlet&&(i.outlet.deactivate(),i.children.onOutletDeactivated()),i.attachRef=null,i.route=null)}activateChildRoutes(e,A,i){let n=QB(A);e.children.forEach(o=>{this.activateRoutes(o,n[o.value.outlet],i),this.forwardEvent(new mm(o.value.snapshot))}),e.children.length&&this.forwardEvent(new fm(e.value.snapshot))}activateRoutes(e,A,i){let n=e.value,o=A?A.value:null;if(N7(n),n===o)if(n.component){let a=i.getOrCreateContext(n.outlet);this.activateChildRoutes(e,A,a.children)}else this.activateChildRoutes(e,A,i);else if(n.component){let a=i.getOrCreateContext(n.outlet);if(this.routeReuseStrategy.shouldAttach(n.snapshot)){let r=this.routeReuseStrategy.retrieve(n.snapshot);this.routeReuseStrategy.store(n.snapshot,null),a.children.onOutletReAttached(r.contexts),a.attachRef=r.componentRef,a.route=r.route.value,a.outlet&&a.outlet.attach(r.componentRef,r.route.value),N7(r.route.value),this.activateChildRoutes(e,null,a.children)}else a.attachRef=null,a.route=n,a.outlet&&a.outlet.activateWith(n,a.injector),this.activateChildRoutes(e,null,a.children)}else this.activateChildRoutes(e,null,i)}},vm=class{path;route;constructor(e){this.path=e,this.route=this.path[this.path.length-1]}},pB=class{component;route;constructor(e,A){this.component=e,this.route=A}};function lsA(t,e,A){let i=t._root,n=e?e._root:null;return hu(i,n,A,[i.value])}function gsA(t){let e=t.routeConfig?t.routeConfig.canActivateChild:null;return!e||e.length===0?null:{node:t,guards:e}}function kB(t,e){let A=Symbol(),i=e.get(t,A);return i===A?typeof t=="function"&&!LF(t)?t:e.get(t):i}function hu(t,e,A,i,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=QB(e);return t.children.forEach(a=>{csA(a,o[a.value.outlet],A,i.concat([a.value]),n),delete o[a.value.outlet]}),Object.entries(o).forEach(([a,r])=>uu(r,A.getContext(a),n)),n}function csA(t,e,A,i,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=t.value,a=e?e.value:null,r=A?A.getContext(t.value.outlet):null;if(a&&o.routeConfig===a.routeConfig){let s=CsA(a,o,o.routeConfig.runGuardsAndResolvers);s?n.canActivateChecks.push(new vm(i)):(o.data=a.data,o._resolvedData=a._resolvedData),o.component?hu(t,e,r?r.children:null,i,n):hu(t,e,A,i,n),s&&r&&r.outlet&&r.outlet.isActivated&&n.canDeactivateChecks.push(new pB(r.outlet.component,a))}else a&&uu(e,r,n),n.canActivateChecks.push(new vm(i)),o.component?hu(t,null,r?r.children:null,i,n):hu(t,null,A,i,n);return n}function CsA(t,e,A){if(typeof A=="function")return Xa(e._environmentInjector,()=>A(t,e));switch(A){case"pathParamsChange":return!h1(t.url,e.url);case"pathParamsOrQueryParamsChange":return!h1(t.url,e.url)||!Pc(t.queryParams,e.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!Y7(t,e)||!Pc(t.queryParams,e.queryParams);default:return!Y7(t,e)}}function uu(t,e,A){let i=QB(t),n=t.value;Object.entries(i).forEach(([o,a])=>{n.component?e?uu(a,e.children.getContext(o),A):uu(a,null,A):uu(a,e,A)}),n.component?e&&e.outlet&&e.outlet.isActivated?A.canDeactivateChecks.push(new pB(e.outlet.component,n)):A.canDeactivateChecks.push(new pB(null,n)):A.canDeactivateChecks.push(new pB(null,n))}function Su(t){return typeof t=="function"}function IsA(t){return typeof t=="boolean"}function dsA(t){return t&&Su(t.canLoad)}function BsA(t){return t&&Su(t.canActivate)}function EsA(t){return t&&Su(t.canActivateChild)}function hsA(t){return t&&Su(t.canDeactivate)}function QsA(t){return t&&Su(t.canMatch)}function JU(t){return t instanceof xF||t?.name==="EmptyError"}var am=Symbol("INITIAL_VALUE");function SB(){return hi(t=>Qr(t.map(e=>e.pipe(uo(1),Sn(am)))).pipe(we(e=>{for(let A of e)if(A!==!0){if(A===am)return am;if(A===!1||usA(A))return A}return!0}),gt(e=>e!==am),uo(1)))}function usA(t){return mB(t)||t instanceof MB}function OU(t){return t.aborted?ne(void 0).pipe(uo(1)):new vi(e=>{let A=()=>{e.next(),e.complete()};return t.addEventListener("abort",A),()=>t.removeEventListener("abort",A)})}function YU(t){return Qt(OU(t))}function fsA(t){return Nc(e=>{let{targetSnapshot:A,currentSnapshot:i,guards:{canActivateChecks:n,canDeactivateChecks:o}}=e;return o.length===0&&n.length===0?ne(Ye(gA({},e),{guardsResult:!0})):psA(o,A,i).pipe(Nc(a=>a&&IsA(a)?msA(A,n,t):ne(a)),we(a=>Ye(gA({},e),{guardsResult:a})))})}function psA(t,e,A){return Lr(t).pipe(Nc(i=>bsA(i.component,i.route,A,e)),$n(i=>i!==!0,!0))}function msA(t,e,A){return Lr(e).pipe(xQ(i=>O3(DsA(i.route.parent,A),wsA(i.route,A),vsA(t,i.path),ysA(t,i.route))),$n(i=>i!==!0,!0))}function wsA(t,e){return t!==null&&e&&e(new pm(t)),ne(!0)}function DsA(t,e){return t!==null&&e&&e(new um(t)),ne(!0)}function ysA(t,e){let A=e.routeConfig?e.routeConfig.canActivate:null;if(!A||A.length===0)return ne(!0);let i=A.map(n=>Fc(()=>{let o=e._environmentInjector,a=kB(n,o),r=BsA(a)?a.canActivate(e,t):Xa(o,()=>a(e,t));return f1(r).pipe($n())}));return ne(i).pipe(SB())}function vsA(t,e){let A=e[e.length-1],n=e.slice(0,e.length-1).reverse().map(o=>gsA(o)).filter(o=>o!==null).map(o=>Fc(()=>{let a=o.guards.map(r=>{let s=o.node._environmentInjector,l=kB(r,s),g=EsA(l)?l.canActivateChild(A,t):Xa(s,()=>l(A,t));return f1(g).pipe($n())});return ne(a).pipe(SB())}));return ne(n).pipe(SB())}function bsA(t,e,A,i){let n=e&&e.routeConfig?e.routeConfig.canDeactivate:null;if(!n||n.length===0)return ne(!0);let o=n.map(a=>{let r=e._environmentInjector,s=kB(a,r),l=hsA(s)?s.canDeactivate(t,e,A,i):Xa(r,()=>s(t,e,A,i));return f1(l).pipe($n())});return ne(o).pipe(SB())}function MsA(t,e,A,i,n){let o=e.canLoad;if(o===void 0||o.length===0)return ne(!0);let a=o.map(r=>{let s=kB(r,t),l=dsA(s)?s.canLoad(e,A):Xa(t,()=>s(e,A)),g=f1(l);return n?g.pipe(YU(n)):g});return ne(a).pipe(SB(),HU(i))}function HU(t){return MF(di(e=>{if(typeof e!="boolean")throw ym(t,e)}),we(e=>e===!0))}function SsA(t,e,A,i,n,o){let a=e.canMatch;if(!a||a.length===0)return ne(!0);let r=a.map(s=>{let l=kB(s,t),g=QsA(l)?l.canMatch(e,A,n):Xa(t,()=>l(e,A,n));return f1(g).pipe(YU(o))});return ne(r).pipe(SB(),HU(i))}var j0=class t extends Error{segmentGroup;constructor(e){super(),this.segmentGroup=e||null,Object.setPrototypeOf(this,t.prototype)}},vu=class t extends Error{urlTree;constructor(e){super(),this.urlTree=e,Object.setPrototypeOf(this,t.prototype)}};function ksA(t){throw new Mt(4e3,!1)}function xsA(t){throw UU(!1,ss.GuardRejected)}var P7=class{urlSerializer;urlTree;constructor(e,A){this.urlSerializer=e,this.urlTree=A}lineralizeSegments(e,A){return lt(this,null,function*(){let i=[],n=A.root;for(;;){if(i=i.concat(n.segments),n.numberOfChildren===0)return i;if(n.numberOfChildren>1||!n.children[Ri])throw ksA(`${e.redirectTo}`);n=n.children[Ri]}})}applyRedirectCommands(e,A,i,n,o){return lt(this,null,function*(){let a=yield _sA(A,n,o);if(a instanceof ql)throw new vu(a);let r=this.applyRedirectCreateUrlTree(a,this.urlSerializer.parse(a),e,i);if(a[0]==="/")throw new vu(r);return r})}applyRedirectCreateUrlTree(e,A,i,n){let o=this.createSegmentGroup(e,A.root,i,n);return new ql(o,this.createQueryParams(A.queryParams,this.urlTree.queryParams),A.fragment)}createQueryParams(e,A){let i={};return Object.entries(e).forEach(([n,o])=>{if(typeof o=="string"&&o[0]===":"){let r=o.substring(1);i[n]=A[r]}else i[n]=o}),i}createSegmentGroup(e,A,i,n){let o=this.createSegments(e,A.segments,i,n),a={};return Object.entries(A.children).forEach(([r,s])=>{a[r]=this.createSegmentGroup(e,s,i,n)}),new so(o,a)}createSegments(e,A,i,n){return A.map(o=>o.path[0]===":"?this.findPosParam(e,o,n):this.findOrReturn(o,i))}findPosParam(e,A,i){let n=i[A.path.substring(1)];if(!n)throw new Mt(4001,!1);return n}findOrReturn(e,A){let i=0;for(let n of A){if(n.path===e.path)return A.splice(i),n;i++}return e}};function _sA(t,e,A){if(typeof t=="string")return Promise.resolve(t);let i=t;return gm(f1(Xa(A,()=>i(e))))}function RsA(t,e){return t.providers&&!t._injector&&(t._injector=W3(t.providers,e,`Route: ${t.path}`)),t._injector??e}function jc(t){return t.outlet||Ri}function NsA(t,e){let A=t.filter(i=>jc(i)===e);return A.push(...t.filter(i=>jc(i)!==e)),A}var j7={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function zU(t){return{routeConfig:t.routeConfig,url:t.url,params:t.params,queryParams:t.queryParams,fragment:t.fragment,data:t.data,outlet:t.outlet,title:t.title,paramMap:t.paramMap,queryParamMap:t.queryParamMap}}function FsA(t,e,A,i,n,o,a){let r=PU(t,e,A);if(!r.matched)return ne(r);let s=zU(o(r));return i=RsA(e,i),SsA(i,e,A,n,s,a).pipe(we(l=>l===!0?r:gA({},j7)))}function PU(t,e,A){if(e.path==="")return e.pathMatch==="full"&&(t.hasChildren()||A.length>0)?gA({},j7):{matched:!0,consumedSegments:[],remainingSegments:A,parameters:{},positionalParamSegments:{}};let n=(e.matcher||EU)(A,t,e);if(!n)return gA({},j7);let o={};Object.entries(n.posParams??{}).forEach(([r,s])=>{o[r]=s.path});let a=n.consumed.length>0?gA(gA({},o),n.consumed[n.consumed.length-1].parameters):o;return{matched:!0,consumedSegments:n.consumed,remainingSegments:A.slice(n.consumed.length),parameters:a,positionalParamSegments:n.posParams??{}}}function dU(t,e,A,i){return A.length>0&&KsA(t,A,i)?{segmentGroup:new so(e,GsA(i,new so(A,t.children))),slicedSegments:[]}:A.length===0&&UsA(t,A,i)?{segmentGroup:new so(t.segments,LsA(t,A,i,t.children)),slicedSegments:A}:{segmentGroup:new so(t.segments,t.children),slicedSegments:A}}function LsA(t,e,A,i){let n={};for(let o of A)if(Mm(t,e,o)&&!i[jc(o)]){let a=new so([],{});n[jc(o)]=a}return gA(gA({},i),n)}function GsA(t,e){let A={};A[Ri]=e;for(let i of t)if(i.path===""&&jc(i)!==Ri){let n=new so([],{});A[jc(i)]=n}return A}function KsA(t,e,A){return A.some(i=>Mm(t,e,i)&&jc(i)!==Ri)}function UsA(t,e,A){return A.some(i=>Mm(t,e,i))}function Mm(t,e,A){return(t.hasChildren()||e.length>0)&&A.pathMatch==="full"?!1:A.path===""}function TsA(t,e,A){return e.length===0&&!t.children[A]}var q7=class{};function JsA(t,e,A,i,n,o,a="emptyOnly",r){return lt(this,null,function*(){return new V7(t,e,A,i,n,a,o,r).recognize()})}var OsA=31,V7=class{injector;configLoader;rootComponentType;config;urlTree;paramsInheritanceStrategy;urlSerializer;abortSignal;applyRedirects;absoluteRedirectCount=0;allowRedirects=!0;constructor(e,A,i,n,o,a,r,s){this.injector=e,this.configLoader=A,this.rootComponentType=i,this.config=n,this.urlTree=o,this.paramsInheritanceStrategy=a,this.urlSerializer=r,this.abortSignal=s,this.applyRedirects=new P7(this.urlSerializer,this.urlTree)}noMatchError(e){return new Mt(4002,`'${e.segmentGroup}'`)}recognize(){return lt(this,null,function*(){let e=dU(this.urlTree.root,[],[],this.config).segmentGroup,{children:A,rootSnapshot:i}=yield this.match(e),n=new vl(i,A),o=new Du("",n),a=MU(i,[],this.urlTree.queryParams,this.urlTree.fragment);return a.queryParams=this.urlTree.queryParams,o.url=this.urlSerializer.serialize(a),{state:o,tree:a}})}match(e){return lt(this,null,function*(){let A=new bB([],Object.freeze({}),Object.freeze(gA({},this.urlTree.queryParams)),this.urlTree.fragment,Object.freeze({}),Ri,this.rootComponentType,null,{},this.injector);try{return{children:yield this.processSegmentGroup(this.injector,this.config,e,Ri,A),rootSnapshot:A}}catch(i){if(i instanceof vu)return this.urlTree=i.urlTree,this.match(i.urlTree.root);throw i instanceof j0?this.noMatchError(i):i}})}processSegmentGroup(e,A,i,n,o){return lt(this,null,function*(){if(i.segments.length===0&&i.hasChildren())return this.processChildren(e,A,i,o);let a=yield this.processSegment(e,A,i,i.segments,n,!0,o);return a instanceof vl?[a]:[]})}processChildren(e,A,i,n){return lt(this,null,function*(){let o=[];for(let s of Object.keys(i.children))s==="primary"?o.unshift(s):o.push(s);let a=[];for(let s of o){let l=i.children[s],g=NsA(A,s),C=yield this.processSegmentGroup(e,g,l,s,n);a.push(...C)}let r=jU(a);return YsA(r),r})}processSegment(e,A,i,n,o,a,r){return lt(this,null,function*(){for(let s of A)try{return yield this.processSegmentAgainstRoute(s._injector??e,A,s,i,n,o,a,r)}catch(l){if(l instanceof j0||JU(l))continue;throw l}if(TsA(i,n,o))return new q7;throw new j0(i)})}processSegmentAgainstRoute(e,A,i,n,o,a,r,s){return lt(this,null,function*(){if(jc(i)!==a&&(a===Ri||!Mm(n,o,i)))throw new j0(n);if(i.redirectTo===void 0)return this.matchSegmentAgainstRoute(e,n,i,o,a,s);if(this.allowRedirects&&r)return this.expandSegmentAgainstRouteUsingRedirect(e,n,A,i,o,a,s);throw new j0(n)})}expandSegmentAgainstRouteUsingRedirect(e,A,i,n,o,a,r){return lt(this,null,function*(){let{matched:s,parameters:l,consumedSegments:g,positionalParamSegments:C,remainingSegments:I}=PU(A,n,o);if(!s)throw new j0(A);typeof n.redirectTo=="string"&&n.redirectTo[0]==="/"&&(this.absoluteRedirectCount++,this.absoluteRedirectCount>OsA&&(this.allowRedirects=!1));let d=this.createSnapshot(e,n,o,l,r);if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let h=yield this.applyRedirects.applyRedirectCommands(g,n.redirectTo,C,zU(d),e),E=yield this.applyRedirects.lineralizeSegments(n,h);return this.processSegment(e,i,A,E.concat(I),a,!1,r)})}createSnapshot(e,A,i,n,o){let a=new bB(i,n,Object.freeze(gA({},this.urlTree.queryParams)),this.urlTree.fragment,zsA(A),jc(A),A.component??A._loadedComponent??null,A,PsA(A),e),r=W7(a,o,this.paramsInheritanceStrategy);return a.params=Object.freeze(r.params),a.data=Object.freeze(r.data),a}matchSegmentAgainstRoute(e,A,i,n,o,a){return lt(this,null,function*(){if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let r=k=>this.createSnapshot(e,i,k.consumedSegments,k.parameters,a),s=yield gm(FsA(A,i,n,e,this.urlSerializer,r,this.abortSignal));if(i.path==="**"&&(A.children={}),!s?.matched)throw new j0(A);e=i._injector??e;let{routes:l}=yield this.getChildConfig(e,i,n),g=i._loadedInjector??e,{parameters:C,consumedSegments:I,remainingSegments:d}=s,h=this.createSnapshot(e,i,I,C,a),{segmentGroup:E,slicedSegments:f}=dU(A,I,d,l);if(f.length===0&&E.hasChildren()){let k=yield this.processChildren(g,l,E,h);return new vl(h,k)}if(l.length===0&&f.length===0)return new vl(h,[]);let m=jc(i)===o,v=yield this.processSegment(g,l,E,f,m?Ri:o,!0,h);return new vl(h,v instanceof vl?[v]:[])})}getChildConfig(e,A,i){return lt(this,null,function*(){if(A.children)return{routes:A.children,injector:e};if(A.loadChildren){if(A._loadedRoutes!==void 0){let o=A._loadedNgModuleFactory;return o&&!A._loadedInjector&&(A._loadedInjector=o.create(e).injector),{routes:A._loadedRoutes,injector:A._loadedInjector}}if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);if(yield gm(MsA(e,A,i,this.urlSerializer,this.abortSignal))){let o=yield this.configLoader.loadChildren(e,A);return A._loadedRoutes=o.routes,A._loadedInjector=o.injector,A._loadedNgModuleFactory=o.factory,o}throw xsA(A)}return{routes:[],injector:e}})}};function YsA(t){t.sort((e,A)=>e.value.outlet===Ri?-1:A.value.outlet===Ri?1:e.value.outlet.localeCompare(A.value.outlet))}function HsA(t){let e=t.value.routeConfig;return e&&e.path===""}function jU(t){let e=[],A=new Set;for(let i of t){if(!HsA(i)){e.push(i);continue}let n=e.find(o=>i.value.routeConfig===o.value.routeConfig);n!==void 0?(n.children.push(...i.children),A.add(n)):e.push(i)}for(let i of A){let n=jU(i.children);e.push(new vl(i.value,n))}return e.filter(i=>!A.has(i))}function zsA(t){return t.data||{}}function PsA(t){return t.resolve||{}}function jsA(t,e,A,i,n,o,a){return Nc(r=>lt(null,null,function*(){let{state:s,tree:l}=yield JsA(t,e,A,i,r.extractedUrl,n,o,a);return Ye(gA({},r),{targetSnapshot:s,urlAfterRedirects:l})}))}function qsA(t){return Nc(e=>{let{targetSnapshot:A,guards:{canActivateChecks:i}}=e;if(!i.length)return ne(e);let n=new Set(i.map(r=>r.route)),o=new Set;for(let r of n)if(!o.has(r))for(let s of qU(r))o.add(s);let a=0;return Lr(o).pipe(xQ(r=>n.has(r)?VsA(r,A,t):(r.data=W7(r,r.parent,t).resolve,ne(void 0))),di(()=>a++),Vv(1),Nc(r=>a===o.size?ne(e):ar))})}function qU(t){let e=t.children.map(A=>qU(A)).flat();return[t,...e]}function VsA(t,e,A){let i=t.routeConfig,n=t._resolve;return i?.title!==void 0&&!LU(i)&&(n[bu]=i.title),Fc(()=>(t.data=W7(t,t.parent,A).resolve,WsA(n,t,e).pipe(we(o=>(t._resolvedData=o,t.data=gA(gA({},t.data),o),null)))))}function WsA(t,e,A){let i=L7(t);if(i.length===0)return ne({});let n={};return Lr(i).pipe(Nc(o=>ZsA(t[o],e,A).pipe($n(),di(a=>{if(a instanceof MB)throw ym(new q0,a);n[o]=a}))),Vv(1),we(()=>n),Po(o=>JU(o)?ar:T3(o)))}function ZsA(t,e,A){let i=e._environmentInjector,n=kB(t,i),o=n.resolve?n.resolve(e,A):Xa(i,()=>n(e,A));return f1(o)}function BU(t){return hi(e=>{let A=t(e);return A?Lr(A).pipe(we(()=>e)):ne(e)})}var tM=(()=>{class t{buildTitle(A){let i,n=A.root;for(;n!==void 0;)i=this.getResolvedTitleForRoute(n)??i,n=n.children.find(o=>o.outlet===Ri);return i}getResolvedTitleForRoute(A){return A.data[bu]}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:()=>w(VU),providedIn:"root"})}return t})(),VU=(()=>{class t extends tM{title;constructor(A){super(),this.title=A}updateTitle(A){let i=this.buildTitle(A);i!==void 0&&this.title.setTitle(i)}static \u0275fac=function(i){return new(i||t)(Lo(gL))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),w1=new kA("",{factory:()=>({})}),xB=new kA(""),Sm=(()=>{class t{componentLoaders=new WeakMap;childrenLoaders=new WeakMap;onLoadStartListener;onLoadEndListener;compiler=w(jF);loadComponent(A,i){return lt(this,null,function*(){if(this.componentLoaders.get(i))return this.componentLoaders.get(i);if(i._loadedComponent)return Promise.resolve(i._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(i);let n=lt(this,null,function*(){try{let o=yield QU(Xa(A,()=>i.loadComponent())),a=yield XU(ZU(o));return this.onLoadEndListener&&this.onLoadEndListener(i),i._loadedComponent=a,a}finally{this.componentLoaders.delete(i)}});return this.componentLoaders.set(i,n),n})}loadChildren(A,i){if(this.childrenLoaders.get(i))return this.childrenLoaders.get(i);if(i._loadedRoutes)return Promise.resolve({routes:i._loadedRoutes,injector:i._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(i);let n=lt(this,null,function*(){try{let o=yield WU(i,this.compiler,A,this.onLoadEndListener);return i._loadedRoutes=o.routes,i._loadedInjector=o.injector,i._loadedNgModuleFactory=o.factory,o}finally{this.childrenLoaders.delete(i)}});return this.childrenLoaders.set(i,n),n}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function WU(t,e,A,i){return lt(this,null,function*(){let n=yield QU(Xa(A,()=>t.loadChildren())),o=yield XU(ZU(n)),a;o instanceof OF||Array.isArray(o)?a=o:a=yield e.compileModuleAsync(o),i&&i(t);let r,s,l=!1,g;return Array.isArray(a)?(s=a,l=!0):(r=a.create(A).injector,g=a,s=r.get(xB,[],{optional:!0,self:!0}).flat()),{routes:s.map(eM),injector:r,factory:g}})}function XsA(t){return t&&typeof t=="object"&&"default"in t}function ZU(t){return XsA(t)?t.default:t}function XU(t){return lt(this,null,function*(){return t})}var km=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:()=>w($sA),providedIn:"root"})}return t})(),$sA=(()=>{class t{shouldProcessUrl(A){return!0}extract(A){return A}merge(A,i){return A}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),iM=new kA(""),nM=new kA("");function $U(t,e,A){let i=t.get(nM),n=t.get(ti);if(!n.startViewTransition||i.skipNextTransition)return i.skipNextTransition=!1,new Promise(l=>setTimeout(l));let o,a=new Promise(l=>{o=l}),r=n.startViewTransition(()=>(o(),AlA(t)));r.updateCallbackDone.catch(l=>{}),r.ready.catch(l=>{}),r.finished.catch(l=>{});let{onViewTransitionCreated:s}=i;return s&&Xa(t,()=>s({transition:r,from:e,to:A})),a}function AlA(t){return new Promise(e=>{Hn({read:()=>setTimeout(e)},{injector:t})})}var elA=()=>{},oM=new kA(""),xm=(()=>{class t{currentNavigation=bA(null,{equal:()=>!1});currentTransition=null;lastSuccessfulNavigation=bA(null);events=new ie;transitionAbortWithErrorSubject=new ie;configLoader=w(Sm);environmentInjector=w(Gr);destroyRef=w(sr);urlSerializer=w(p1);rootContexts=w(m1);location=w(Uc);inputBindingEnabled=w(Mu,{optional:!0})!==null;titleStrategy=w(tM);options=w(w1,{optional:!0})||{};paramsInheritanceStrategy=this.options.paramsInheritanceStrategy||"emptyOnly";urlHandlingStrategy=w(km);createViewTransition=w(iM,{optional:!0});navigationErrorHandler=w(oM,{optional:!0});navigationId=0;get hasRequestedNavigation(){return this.navigationId!==0}transitions;afterPreactivation=()=>ne(void 0);rootComponentType=null;destroyed=!1;constructor(){let A=n=>this.events.next(new hm(n)),i=n=>this.events.next(new Qm(n));this.configLoader.onLoadEndListener=i,this.configLoader.onLoadStartListener=A,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}complete(){this.transitions?.complete()}handleNavigationRequest(A){let i=++this.navigationId;ca(()=>{this.transitions?.next(Ye(gA({},A),{extractedUrl:this.urlHandlingStrategy.extract(A.rawUrl),targetSnapshot:null,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null,id:i,routesRecognizeHandler:{},beforeActivateHandler:{}}))})}setupNavigations(A){return this.transitions=new ei(null),this.transitions.pipe(gt(i=>i!==null),hi(i=>{let n=!1,o=new AbortController,a=()=>!n&&this.currentTransition?.id===i.id;return ne(i).pipe(hi(r=>{if(this.navigationId>i.id)return this.cancelNavigationTransition(i,"",ss.SupersededByNewNavigation),ar;this.currentTransition=i;let s=this.lastSuccessfulNavigation();this.currentNavigation.set({id:r.id,initialUrl:r.rawUrl,extractedUrl:r.extractedUrl,targetBrowserUrl:typeof r.extras.browserUrl=="string"?this.urlSerializer.parse(r.extras.browserUrl):r.extras.browserUrl,trigger:r.source,extras:r.extras,previousNavigation:s?Ye(gA({},s),{previousNavigation:null}):null,abort:()=>o.abort(),routesRecognizeHandler:r.routesRecognizeHandler,beforeActivateHandler:r.beforeActivateHandler});let l=!A.navigated||this.isUpdatingInternalState()||this.isUpdatedBrowserUrl(),g=r.extras.onSameUrlNavigation??A.onSameUrlNavigation;if(!l&&g!=="reload")return this.events.next(new qc(r.id,this.urlSerializer.serialize(r.rawUrl),"",wB.IgnoredSameUrlNavigation)),r.resolve(!1),ar;if(this.urlHandlingStrategy.shouldProcessUrl(r.rawUrl))return ne(r).pipe(hi(C=>(this.events.next(new c2(C.id,this.urlSerializer.serialize(C.extractedUrl),C.source,C.restoredState)),C.id!==this.navigationId?ar:Promise.resolve(C))),jsA(this.environmentInjector,this.configLoader,this.rootComponentType,A.config,this.urlSerializer,this.paramsInheritanceStrategy,o.signal),di(C=>{i.targetSnapshot=C.targetSnapshot,i.urlAfterRedirects=C.urlAfterRedirects,this.currentNavigation.update(I=>(I.finalUrl=C.urlAfterRedirects,I)),this.events.next(new mu)}),hi(C=>Lr(i.routesRecognizeHandler.deferredHandle??ne(void 0)).pipe(we(()=>C))),di(()=>{let C=new pu(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(C)}));if(l&&this.urlHandlingStrategy.shouldProcessUrl(r.currentRawUrl)){let{id:C,extractedUrl:I,source:d,restoredState:h,extras:E}=r,f=new c2(C,this.urlSerializer.serialize(I),d,h);this.events.next(f);let m=NU(this.rootComponentType,this.environmentInjector).snapshot;return this.currentTransition=i=Ye(gA({},r),{targetSnapshot:m,urlAfterRedirects:I,extras:Ye(gA({},E),{skipLocationChange:!1,replaceUrl:!1})}),this.currentNavigation.update(v=>(v.finalUrl=I,v)),ne(i)}else return this.events.next(new qc(r.id,this.urlSerializer.serialize(r.extractedUrl),"",wB.IgnoredByUrlHandlingStrategy)),r.resolve(!1),ar}),we(r=>{let s=new Im(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);return this.events.next(s),this.currentTransition=i=Ye(gA({},r),{guards:lsA(r.targetSnapshot,r.currentSnapshot,this.rootContexts)}),i}),fsA(r=>this.events.next(r)),hi(r=>{if(i.guardsResult=r.guardsResult,r.guardsResult&&typeof r.guardsResult!="boolean")throw ym(this.urlSerializer,r.guardsResult);let s=new dm(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot,!!r.guardsResult);if(this.events.next(s),!a())return ar;if(!r.guardsResult)return this.cancelNavigationTransition(r,"",ss.GuardRejected),ar;if(r.guards.canActivateChecks.length===0)return ne(r);let l=new Bm(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);if(this.events.next(l),!a())return ar;let g=!1;return ne(r).pipe(qsA(this.paramsInheritanceStrategy),di({next:()=>{g=!0;let C=new Em(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(C)},complete:()=>{g||this.cancelNavigationTransition(r,"",ss.NoDataFromResolver)}}))}),BU(r=>{let s=g=>{let C=[];if(g.routeConfig?._loadedComponent)g.component=g.routeConfig?._loadedComponent;else if(g.routeConfig?.loadComponent){let I=g._environmentInjector;C.push(this.configLoader.loadComponent(I,g.routeConfig).then(d=>{g.component=d}))}for(let I of g.children)C.push(...s(I));return C},l=s(r.targetSnapshot.root);return l.length===0?ne(r):Lr(Promise.all(l).then(()=>r))}),BU(()=>this.afterPreactivation()),hi(()=>{let{currentSnapshot:r,targetSnapshot:s}=i,l=this.createViewTransition?.(this.environmentInjector,r.root,s.root);return l?Lr(l).pipe(we(()=>i)):ne(i)}),uo(1),hi(r=>{let s=osA(A.routeReuseStrategy,r.targetSnapshot,r.currentRouterState);this.currentTransition=i=r=Ye(gA({},r),{targetRouterState:s}),this.currentNavigation.update(g=>(g.targetRouterState=s,g)),this.events.next(new yB);let l=i.beforeActivateHandler.deferredHandle;return l?Lr(l.then(()=>r)):ne(r)}),di(r=>{new z7(A.routeReuseStrategy,i.targetRouterState,i.currentRouterState,s=>this.events.next(s),this.inputBindingEnabled).activate(this.rootContexts),a()&&(n=!0,this.currentNavigation.update(s=>(s.abort=elA,s)),this.lastSuccessfulNavigation.set(ca(this.currentNavigation)),this.events.next(new Ug(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects))),this.titleStrategy?.updateTitle(r.targetRouterState.snapshot),r.resolve(!0))}),Qt(OU(o.signal).pipe(gt(()=>!n&&!i.targetRouterState),di(()=>{this.cancelNavigationTransition(i,o.signal.reason+"",ss.Aborted)}))),di({complete:()=>{n=!0}}),Qt(this.transitionAbortWithErrorSubject.pipe(di(r=>{throw r}))),H3(()=>{o.abort(),n||this.cancelNavigationTransition(i,"",ss.SupersededByNewNavigation),this.currentTransition?.id===i.id&&(this.currentNavigation.set(null),this.currentTransition=null)}),Po(r=>{if(n=!0,this.destroyed)return i.resolve(!1),ar;if(TU(r))this.events.next(new jl(i.id,this.urlSerializer.serialize(i.extractedUrl),r.message,r.cancellationCode)),ssA(r)?this.events.next(new vB(r.url,r.navigationBehaviorOptions)):i.resolve(!1);else{let s=new u1(i.id,this.urlSerializer.serialize(i.extractedUrl),r,i.targetSnapshot??void 0);try{let l=Xa(this.environmentInjector,()=>this.navigationErrorHandler?.(s));if(l instanceof MB){let{message:g,cancellationCode:C}=ym(this.urlSerializer,l);this.events.next(new jl(i.id,this.urlSerializer.serialize(i.extractedUrl),g,C)),this.events.next(new vB(l.redirectTo,l.navigationBehaviorOptions))}else throw this.events.next(s),r}catch(l){this.options.resolveNavigationPromiseOnError?i.resolve(!1):i.reject(l)}}return ar}))}))}cancelNavigationTransition(A,i,n){let o=new jl(A.id,this.urlSerializer.serialize(A.extractedUrl),i,n);this.events.next(o),A.resolve(!1)}isUpdatingInternalState(){return this.currentTransition?.extractedUrl.toString()!==this.currentTransition?.currentUrlTree.toString()}isUpdatedBrowserUrl(){let A=this.urlHandlingStrategy.extract(this.urlSerializer.parse(this.location.path(!0))),i=ca(this.currentNavigation),n=i?.targetBrowserUrl??i?.extractedUrl;return A.toString()!==n?.toString()&&!i?.extras.skipLocationChange}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function tlA(t){return t!==fB}var AT=new kA("");var eT=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:()=>w(ilA),providedIn:"root"})}return t})(),bm=class{shouldDetach(e){return!1}store(e,A){}shouldAttach(e){return!1}retrieve(e){return null}shouldReuseRoute(e,A){return e.routeConfig===A.routeConfig}shouldDestroyInjector(e){return!0}},ilA=(()=>{class t extends bm{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),aM=(()=>{class t{urlSerializer=w(p1);options=w(w1,{optional:!0})||{};canceledNavigationResolution=this.options.canceledNavigationResolution||"replace";location=w(Uc);urlHandlingStrategy=w(km);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";currentUrlTree=new ql;getCurrentUrlTree(){return this.currentUrlTree}rawUrlTree=this.currentUrlTree;getRawUrlTree(){return this.rawUrlTree}createBrowserPath({finalUrl:A,initialUrl:i,targetBrowserUrl:n}){let o=A!==void 0?this.urlHandlingStrategy.merge(A,i):i,a=n??o;return a instanceof ql?this.urlSerializer.serialize(a):a}commitTransition({targetRouterState:A,finalUrl:i,initialUrl:n}){i&&A?(this.currentUrlTree=i,this.rawUrlTree=this.urlHandlingStrategy.merge(i,n),this.routerState=A):this.rawUrlTree=n}routerState=NU(null,w(Gr));getRouterState(){return this.routerState}_stateMemento=this.createStateMemento();get stateMemento(){return this._stateMemento}updateStateMemento(){this._stateMemento=this.createStateMemento()}createStateMemento(){return{rawUrlTree:this.rawUrlTree,currentUrlTree:this.currentUrlTree,routerState:this.routerState}}restoredState(){return this.location.getState()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:()=>w(nlA),providedIn:"root"})}return t})(),nlA=(()=>{class t extends aM{currentPageId=0;lastSuccessfulId=-1;get browserPageId(){return this.canceledNavigationResolution!=="computed"?this.currentPageId:this.restoredState()?.\u0275routerPageId??this.currentPageId}registerNonRouterCurrentEntryChangeListener(A){return this.location.subscribe(i=>{i.type==="popstate"&&setTimeout(()=>{A(i.url,i.state,"popstate",{replaceUrl:!0})})})}handleRouterEvent(A,i){A instanceof c2?this.updateStateMemento():A instanceof qc?this.commitTransition(i):A instanceof pu?this.urlUpdateStrategy==="eager"&&(i.extras.skipLocationChange||this.setBrowserUrl(this.createBrowserPath(i),i)):A instanceof yB?(this.commitTransition(i),this.urlUpdateStrategy==="deferred"&&!i.extras.skipLocationChange&&this.setBrowserUrl(this.createBrowserPath(i),i)):A instanceof jl&&!RU(A)?this.restoreHistory(i):A instanceof u1?this.restoreHistory(i,!0):A instanceof Ug&&(this.lastSuccessfulId=A.id,this.currentPageId=this.browserPageId)}setBrowserUrl(A,{extras:i,id:n}){let{replaceUrl:o,state:a}=i;if(this.location.isCurrentPathEqualTo(A)||o){let r=this.browserPageId,s=gA(gA({},a),this.generateNgRouterState(n,r));this.location.replaceState(A,"",s)}else{let r=gA(gA({},a),this.generateNgRouterState(n,this.browserPageId+1));this.location.go(A,"",r)}}restoreHistory(A,i=!1){if(this.canceledNavigationResolution==="computed"){let n=this.browserPageId,o=this.currentPageId-n;o!==0?this.location.historyGo(o):this.getCurrentUrlTree()===A.finalUrl&&o===0&&(this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}else this.canceledNavigationResolution==="replace"&&(i&&this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}resetInternalState({finalUrl:A}){this.routerState=this.stateMemento.routerState,this.currentUrlTree=this.stateMemento.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,A??this.rawUrlTree)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.getRawUrlTree()),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}generateNgRouterState(A,i){return this.canceledNavigationResolution==="computed"?{navigationId:A,\u0275routerPageId:i}:{navigationId:A}}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function _m(t,e){t.events.pipe(gt(A=>A instanceof Ug||A instanceof jl||A instanceof u1||A instanceof qc),we(A=>A instanceof Ug||A instanceof qc?0:(A instanceof jl?A.code===ss.Redirect||A.code===ss.SupersededByNewNavigation:!1)?2:1),gt(A=>A!==2),uo(1)).subscribe(()=>{e()})}var ls=(()=>{class t{get currentUrlTree(){return this.stateManager.getCurrentUrlTree()}get rawUrlTree(){return this.stateManager.getRawUrlTree()}disposed=!1;nonRouterCurrentEntryChangeSubscription;console=w(YF);stateManager=w(aM);options=w(w1,{optional:!0})||{};pendingTasks=w(UF);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";navigationTransitions=w(xm);urlSerializer=w(p1);location=w(Uc);urlHandlingStrategy=w(km);injector=w(Gr);_events=new ie;get events(){return this._events}get routerState(){return this.stateManager.getRouterState()}navigated=!1;routeReuseStrategy=w(eT);injectorCleanup=w(AT,{optional:!0});onSameUrlNavigation=this.options.onSameUrlNavigation||"ignore";config=w(xB,{optional:!0})?.flat()??[];componentInputBindingEnabled=!!w(Mu,{optional:!0});currentNavigation=this.navigationTransitions.currentNavigation.asReadonly();constructor(){this.resetConfig(this.config),this.navigationTransitions.setupNavigations(this).subscribe({error:A=>{}}),this.subscribeToNavigationEvents()}eventsSubscription=new bo;subscribeToNavigationEvents(){let A=this.navigationTransitions.events.subscribe(i=>{try{let n=this.navigationTransitions.currentTransition,o=ca(this.navigationTransitions.currentNavigation);if(n!==null&&o!==null){if(this.stateManager.handleRouterEvent(i,o),i instanceof jl&&i.code!==ss.Redirect&&i.code!==ss.SupersededByNewNavigation)this.navigated=!0;else if(i instanceof Ug)this.navigated=!0,this.injectorCleanup?.(this.routeReuseStrategy,this.routerState,this.config);else if(i instanceof vB){let a=i.navigationBehaviorOptions,r=this.urlHandlingStrategy.merge(i.url,n.currentRawUrl),s=gA({scroll:n.extras.scroll,browserUrl:n.extras.browserUrl,info:n.extras.info,skipLocationChange:n.extras.skipLocationChange,replaceUrl:n.extras.replaceUrl||this.urlUpdateStrategy==="eager"||tlA(n.source)},a);this.scheduleNavigation(r,fB,null,s,{resolve:n.resolve,reject:n.reject,promise:n.promise})}}isA(i)&&this._events.next(i)}catch(n){this.navigationTransitions.transitionAbortWithErrorSubject.next(n)}});this.eventsSubscription.add(A)}resetRootComponentType(A){this.routerState.root.component=A,this.navigationTransitions.rootComponentType=A}initialNavigation(){this.setUpLocationChangeListener(),this.navigationTransitions.hasRequestedNavigation||this.navigateToSyncWithBrowser(this.location.path(!0),fB,this.stateManager.restoredState(),{replaceUrl:!0})}setUpLocationChangeListener(){this.nonRouterCurrentEntryChangeSubscription??=this.stateManager.registerNonRouterCurrentEntryChangeListener((A,i,n,o)=>{this.navigateToSyncWithBrowser(A,n,i,o)})}navigateToSyncWithBrowser(A,i,n,o){let a=n?.navigationId?n:null;if(n){let s=gA({},n);delete s.navigationId,delete s.\u0275routerPageId,Object.keys(s).length!==0&&(o.state=s)}let r=this.parseUrl(A);this.scheduleNavigation(r,i,a,o).catch(s=>{this.disposed||this.injector.get(Wv)(s)})}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return ca(this.navigationTransitions.currentNavigation)}get lastSuccessfulNavigation(){return this.navigationTransitions.lastSuccessfulNavigation}resetConfig(A){this.config=A.map(eM),this.navigated=!1}ngOnDestroy(){this.dispose()}dispose(){this._events.unsubscribe(),this.navigationTransitions.complete(),this.nonRouterCurrentEntryChangeSubscription?.unsubscribe(),this.nonRouterCurrentEntryChangeSubscription=void 0,this.disposed=!0,this.eventsSubscription.unsubscribe()}createUrlTree(A,i={}){let{relativeTo:n,queryParams:o,fragment:a,queryParamsHandling:r,preserveFragment:s}=i,l=s?this.currentUrlTree.fragment:a,g=null;switch(r??this.options.defaultQueryParamsHandling){case"merge":g=gA(gA({},this.currentUrlTree.queryParams),o);break;case"preserve":g=this.currentUrlTree.queryParams;break;default:g=o||null}g!==null&&(g=this.removeEmptyProps(g));let C;try{let I=n?n.snapshot:this.routerState.snapshot.root;C=SU(I)}catch(I){(typeof A[0]!="string"||A[0][0]!=="/")&&(A=[]),C=this.currentUrlTree.root}return kU(C,A,g,l??null,this.urlSerializer)}navigateByUrl(A,i={skipLocationChange:!1}){let n=mB(A)?A:this.parseUrl(A),o=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(o,fB,null,i)}navigate(A,i={skipLocationChange:!1}){return olA(A),this.navigateByUrl(this.createUrlTree(A,i),i)}serializeUrl(A){return this.urlSerializer.serialize(A)}parseUrl(A){try{return this.urlSerializer.parse(A)}catch(i){return this.console.warn(FF(4018,!1)),this.urlSerializer.parse("/")}}isActive(A,i){let n;if(i===!0?n=gA({},fU):i===!1?n=gA({},G7):n=gA(gA({},G7),i),mB(A))return lU(this.currentUrlTree,A,n);let o=this.parseUrl(A);return lU(this.currentUrlTree,o,n)}removeEmptyProps(A){return Object.entries(A).reduce((i,[n,o])=>(o!=null&&(i[n]=o),i),{})}scheduleNavigation(A,i,n,o,a){if(this.disposed)return Promise.resolve(!1);let r,s,l;a?(r=a.resolve,s=a.reject,l=a.promise):l=new Promise((C,I)=>{r=C,s=I});let g=this.pendingTasks.add();return _m(this,()=>{queueMicrotask(()=>this.pendingTasks.remove(g))}),this.navigationTransitions.handleNavigationRequest({source:i,restoredState:n,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,rawUrl:A,extras:o,resolve:r,reject:s,promise:l,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),l.catch(Promise.reject.bind(Promise))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function olA(t){for(let e=0;e{class t{router;injector;preloadingStrategy;loader;subscription;constructor(A,i,n,o){this.router=A,this.injector=i,this.preloadingStrategy=n,this.loader=o}setUpPreloading(){this.subscription=this.router.events.pipe(gt(A=>A instanceof Ug),xQ(()=>this.preload())).subscribe(()=>{})}preload(){return this.processRoutes(this.injector,this.router.config)}ngOnDestroy(){this.subscription?.unsubscribe()}processRoutes(A,i){let n=[];for(let o of i){o.providers&&!o._injector&&(o._injector=W3(o.providers,A,""));let a=o._injector??A;o._loadedNgModuleFactory&&!o._loadedInjector&&(o._loadedInjector=o._loadedNgModuleFactory.create(a).injector);let r=o._loadedInjector??a;(o.loadChildren&&!o._loadedRoutes&&o.canLoad===void 0||o.loadComponent&&!o._loadedComponent)&&n.push(this.preloadConfig(a,o)),(o.children||o._loadedRoutes)&&n.push(this.processRoutes(r,o.children??o._loadedRoutes))}return Lr(n).pipe(qv())}preloadConfig(A,i){return this.preloadingStrategy.preload(i,()=>{if(A.destroyed)return ne(null);let n;i.loadChildren&&i.canLoad===void 0?n=Lr(this.loader.loadChildren(A,i)):n=ne(null);let o=n.pipe(Nc(a=>a===null?ne(void 0):(i._loadedRoutes=a.routes,i._loadedInjector=a.injector,i._loadedNgModuleFactory=a.factory,this.processRoutes(a.injector??A,a.routes))));if(i.loadComponent&&!i._loadedComponent){let a=this.loader.loadComponent(A,i);return Lr([o,a]).pipe(qv())}else return o})}static \u0275fac=function(i){return new(i||t)(Lo(ls),Lo(Gr),Lo(ku),Lo(Sm))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),iT=new kA(""),rlA=(()=>{class t{options;routerEventsSubscription;scrollEventsSubscription;lastId=0;lastSource=fB;restoredId=0;store={};urlSerializer=w(p1);zone=w(qe);viewportScroller=w(tb);transitions=w(xm);constructor(A){this.options=A,this.options.scrollPositionRestoration||="disabled",this.options.anchorScrolling||="disabled"}init(){this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.transitions.events.subscribe(A=>{A instanceof c2?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=A.navigationTrigger,this.restoredId=A.restoredState?A.restoredState.navigationId:0):A instanceof Ug?(this.lastId=A.id,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.urlAfterRedirects).fragment)):A instanceof qc&&A.code===wB.IgnoredSameUrlNavigation&&(this.lastSource=void 0,this.restoredId=0,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.url).fragment))})}consumeScrollEvents(){return this.transitions.events.subscribe(A=>{if(!(A instanceof DB)||A.scrollBehavior==="manual")return;let i={behavior:"instant"};A.position?this.options.scrollPositionRestoration==="top"?this.viewportScroller.scrollToPosition([0,0],i):this.options.scrollPositionRestoration==="enabled"&&this.viewportScroller.scrollToPosition(A.position,i):A.anchor&&this.options.anchorScrolling==="enabled"?this.viewportScroller.scrollToAnchor(A.anchor):this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.scrollToPosition([0,0])})}scheduleScrollEvent(A,i){let n=ca(this.transitions.currentNavigation)?.extras.scroll;this.zone.runOutsideAngular(()=>lt(this,null,function*(){yield new Promise(o=>{setTimeout(o),typeof requestAnimationFrame<"u"&&requestAnimationFrame(o)}),this.zone.run(()=>{this.transitions.events.next(new DB(A,this.lastSource==="popstate"?this.store[this.restoredId]:null,i,n))})}))}ngOnDestroy(){this.routerEventsSubscription?.unsubscribe(),this.scrollEventsSubscription?.unsubscribe()}static \u0275fac=function(i){V3()};static \u0275prov=qA({token:t,factory:t.\u0275fac})}return t})();function slA(){return w(ls).routerState.root}function xu(t,e){return{\u0275kind:t,\u0275providers:e}}function llA(){let t=w(Dt);return e=>{let A=t.get(K0);if(e!==A.components[0])return;let i=t.get(ls),n=t.get(nT);t.get(sM)===1&&i.initialNavigation(),t.get(rT,null,{optional:!0})?.setUpPreloading(),t.get(iT,null,{optional:!0})?.init(),i.resetRootComponentType(A.componentTypes[0]),n.closed||(n.next(),n.complete(),n.unsubscribe())}}var nT=new kA("",{factory:()=>new ie}),sM=new kA("",{factory:()=>1});function oT(){let t=[{provide:JF,useValue:!0},{provide:sM,useValue:0},$v(()=>{let e=w(Dt);return e.get(eL,Promise.resolve()).then(()=>new Promise(i=>{let n=e.get(ls),o=e.get(nT);_m(n,()=>{i(!0)}),e.get(xm).afterPreactivation=()=>(i(!0),o.closed?ne(void 0):o),n.initialNavigation()}))})];return xu(2,t)}function aT(){let t=[$v(()=>{w(ls).setUpLocationChangeListener()}),{provide:sM,useValue:2}];return xu(3,t)}var rT=new kA("");function sT(t){return xu(0,[{provide:rT,useExisting:tT},{provide:ku,useExisting:t}])}function lT(){return xu(8,[$7,{provide:Mu,useExisting:$7}])}function gT(t){q3("NgRouterViewTransitions");let e=[{provide:iM,useValue:$U},{provide:nM,useValue:gA({skipNextTransition:!!t?.skipInitialTransition},t)}];return xu(9,e)}var cT=[Uc,{provide:p1,useClass:q0},ls,m1,{provide:Vs,useFactory:slA},Sm,[]],Rm=(()=>{class t{constructor(){}static forRoot(A,i){return{ngModule:t,providers:[cT,[],{provide:xB,multi:!0,useValue:A},[],i?.errorHandler?{provide:oM,useValue:i.errorHandler}:[],{provide:w1,useValue:i||{}},i?.useHash?clA():ClA(),glA(),i?.preloadingStrategy?sT(i.preloadingStrategy).\u0275providers:[],i?.initialNavigation?IlA(i):[],i?.bindToComponentInputs?lT().\u0275providers:[],i?.enableViewTransitions?gT().\u0275providers:[],dlA()]}}static forChild(A){return{ngModule:t,providers:[{provide:xB,multi:!0,useValue:A}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})();function glA(){return{provide:iT,useFactory:()=>{let t=w(tb),e=w(w1);return e.scrollOffset&&t.setOffset(e.scrollOffset),new rlA(e)}}}function clA(){return{provide:eb,useClass:iL}}function ClA(){return{provide:eb,useClass:tL}}function IlA(t){return[t.initialNavigation==="disabled"?aT().\u0275providers:[],t.initialNavigation==="enabledBlocking"?oT().\u0275providers:[]]}var rM=new kA("");function dlA(){return[{provide:rM,useFactory:llA},{provide:HF,multi:!0,useExisting:rM}]}var hlA=["*"];var QlA=new kA("MAT_CARD_CONFIG"),Nm=(()=>{class t{appearance;constructor(){let A=w(QlA,{optional:!0});this.appearance=A?.appearance||"raised"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-card"]],hostAttrs:[1,"mat-mdc-card","mdc-card"],hostVars:8,hostBindings:function(i,n){i&2&&RA("mat-mdc-card-outlined",n.appearance==="outlined")("mdc-card--outlined",n.appearance==="outlined")("mat-mdc-card-filled",n.appearance==="filled")("mdc-card--filled",n.appearance==="filled")},inputs:{appearance:"appearance"},exportAs:["matCard"],ngContentSelectors:hlA,decls:1,vars:0,template:function(i,n){i&1&&(Rt(),Ve(0))},styles:[`.mat-mdc-card{display:flex;flex-direction:column;box-sizing:border-box;position:relative;border-style:solid;border-width:0;background-color:var(--mat-card-elevated-container-color, var(--mat-sys-surface-container-low));border-color:var(--mat-card-elevated-container-color, var(--mat-sys-surface-container-low));border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mat-card-elevated-container-elevation, var(--mat-sys-level1))}.mat-mdc-card::after{position:absolute;top:0;left:0;width:100%;height:100%;border:solid 1px rgba(0,0,0,0);content:"";display:block;pointer-events:none;box-sizing:border-box;border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium))}.mat-mdc-card-outlined{background-color:var(--mat-card-outlined-container-color, var(--mat-sys-surface));border-radius:var(--mat-card-outlined-container-shape, var(--mat-sys-corner-medium));border-width:var(--mat-card-outlined-outline-width, 1px);border-color:var(--mat-card-outlined-outline-color, var(--mat-sys-outline-variant));box-shadow:var(--mat-card-outlined-container-elevation, var(--mat-sys-level0))}.mat-mdc-card-outlined::after{border:none}.mat-mdc-card-filled{background-color:var(--mat-card-filled-container-color, var(--mat-sys-surface-container-highest));border-radius:var(--mat-card-filled-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mat-card-filled-container-elevation, var(--mat-sys-level0))}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media::before{display:block;content:""}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mat-mdc-card-actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px;padding:8px}.mat-mdc-card-title{font-family:var(--mat-card-title-text-font, var(--mat-sys-title-large-font));line-height:var(--mat-card-title-text-line-height, var(--mat-sys-title-large-line-height));font-size:var(--mat-card-title-text-size, var(--mat-sys-title-large-size));letter-spacing:var(--mat-card-title-text-tracking, var(--mat-sys-title-large-tracking));font-weight:var(--mat-card-title-text-weight, var(--mat-sys-title-large-weight))}.mat-mdc-card-subtitle{color:var(--mat-card-subtitle-text-color, var(--mat-sys-on-surface));font-family:var(--mat-card-subtitle-text-font, var(--mat-sys-title-medium-font));line-height:var(--mat-card-subtitle-text-line-height, var(--mat-sys-title-medium-line-height));font-size:var(--mat-card-subtitle-text-size, var(--mat-sys-title-medium-size));letter-spacing:var(--mat-card-subtitle-text-tracking, var(--mat-sys-title-medium-tracking));font-weight:var(--mat-card-subtitle-text-weight, var(--mat-sys-title-medium-weight))}.mat-mdc-card-title,.mat-mdc-card-subtitle{display:block;margin:0}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle{padding:16px 16px 0}.mat-mdc-card-header{display:flex;padding:16px 16px 0}.mat-mdc-card-content{display:block;padding:0 16px}.mat-mdc-card-content:first-child{padding-top:16px}.mat-mdc-card-content:last-child{padding-bottom:16px}.mat-mdc-card-title-group{display:flex;justify-content:space-between;width:100%}.mat-mdc-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;margin-bottom:16px;object-fit:cover}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title{line-height:normal}.mat-mdc-card-sm-image{width:80px;height:80px}.mat-mdc-card-md-image{width:112px;height:112px}.mat-mdc-card-lg-image{width:152px;height:152px}.mat-mdc-card-xl-image{width:240px;height:240px}.mat-mdc-card-subtitle~.mat-mdc-card-title,.mat-mdc-card-title~.mat-mdc-card-subtitle,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-title-group .mat-mdc-card-title,.mat-mdc-card-title-group .mat-mdc-card-subtitle{padding-top:0}.mat-mdc-card-content>:last-child:not(.mat-mdc-card-footer){margin-bottom:0}.mat-mdc-card-actions-align-end{justify-content:flex-end} +`],encapsulation:2,changeDetection:0})}return t})();var CT=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();var _u=class{};function Ru(t){return t&&typeof t.connect=="function"&&!(t instanceof SF)}var Tg=(function(t){return t[t.REPLACED=0]="REPLACED",t[t.INSERTED=1]="INSERTED",t[t.MOVED=2]="MOVED",t[t.REMOVED=3]="REMOVED",t})(Tg||{}),Fm=class{viewCacheSize=20;_viewCache=[];applyChanges(e,A,i,n,o){e.forEachOperation((a,r,s)=>{let l,g;if(a.previousIndex==null){let C=()=>i(a,r,s);l=this._insertView(C,s,A,n(a)),g=l?Tg.INSERTED:Tg.REPLACED}else s==null?(this._detachAndCacheView(r,A),g=Tg.REMOVED):(l=this._moveView(r,s,A,n(a)),g=Tg.MOVED);o&&o({context:l?.context,operation:g,record:a})})}detach(){for(let e of this._viewCache)e.destroy();this._viewCache=[]}_insertView(e,A,i,n){let o=this._insertViewFromCache(A,i);if(o){o.context.$implicit=n;return}let a=e();return i.createEmbeddedView(a.templateRef,a.context,a.index)}_detachAndCacheView(e,A){let i=A.detach(e);this._maybeCacheView(i,A)}_moveView(e,A,i,n){let o=i.get(e);return i.move(o,A),o.context.$implicit=n,o}_maybeCacheView(e,A){if(this._viewCache.length{let l,g;if(a.previousIndex==null){let C=i(a,r,s);l=A.createEmbeddedView(C.templateRef,C.context,C.index),g=Tg.INSERTED}else s==null?(A.remove(r),g=Tg.REMOVED):(l=A.get(r),A.move(l,s),g=Tg.MOVED);o&&o({context:l?.context,operation:g,record:a})})}detach(){}};var V0=class{_multiple;_emitChanges;compareWith;_selection=new Set;_deselectedToEmit=[];_selectedToEmit=[];_selected=null;get selected(){return this._selected||(this._selected=Array.from(this._selection.values())),this._selected}changed=new ie;constructor(e=!1,A,i=!0,n){this._multiple=e,this._emitChanges=i,this.compareWith=n,A&&A.length&&(e?A.forEach(o=>this._markSelected(o)):this._markSelected(A[0]),this._selectedToEmit.length=0)}select(...e){this._verifyValueAssignment(e),e.forEach(i=>this._markSelected(i));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}deselect(...e){this._verifyValueAssignment(e),e.forEach(i=>this._unmarkSelected(i));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}setSelection(...e){this._verifyValueAssignment(e);let A=this.selected,i=new Set(e.map(o=>this._getConcreteValue(o)));e.forEach(o=>this._markSelected(o)),A.filter(o=>!i.has(this._getConcreteValue(o,i))).forEach(o=>this._unmarkSelected(o));let n=this._hasQueuedChanges();return this._emitChangeEvent(),n}toggle(e){return this.isSelected(e)?this.deselect(e):this.select(e)}clear(e=!0){this._unmarkAll();let A=this._hasQueuedChanges();return e&&this._emitChangeEvent(),A}isSelected(e){return this._selection.has(this._getConcreteValue(e))}isEmpty(){return this._selection.size===0}hasValue(){return!this.isEmpty()}sort(e){this._multiple&&this.selected&&this._selected.sort(e)}isMultipleSelection(){return this._multiple}_emitChangeEvent(){this._selected=null,(this._selectedToEmit.length||this._deselectedToEmit.length)&&(this.changed.next({source:this,added:this._selectedToEmit,removed:this._deselectedToEmit}),this._deselectedToEmit=[],this._selectedToEmit=[])}_markSelected(e){e=this._getConcreteValue(e),this.isSelected(e)||(this._multiple||this._unmarkAll(),this.isSelected(e)||this._selection.add(e),this._emitChanges&&this._selectedToEmit.push(e))}_unmarkSelected(e){e=this._getConcreteValue(e),this.isSelected(e)&&(this._selection.delete(e),this._emitChanges&&this._deselectedToEmit.push(e))}_unmarkAll(){this.isEmpty()||this._selection.forEach(e=>this._unmarkSelected(e))}_verifyValueAssignment(e){e.length>1&&this._multiple}_hasQueuedChanges(){return!!(this._deselectedToEmit.length||this._selectedToEmit.length)}_getConcreteValue(e,A){if(this.compareWith){A=A??this._selection;for(let i of A)if(this.compareWith(e,i))return i;return e}else return e}};var Gm=(()=>{class t{_animationsDisabled=An();state="unchecked";disabled=!1;appearance="full";constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-pseudo-checkbox"]],hostAttrs:[1,"mat-pseudo-checkbox"],hostVars:12,hostBindings:function(i,n){i&2&&RA("mat-pseudo-checkbox-indeterminate",n.state==="indeterminate")("mat-pseudo-checkbox-checked",n.state==="checked")("mat-pseudo-checkbox-disabled",n.disabled)("mat-pseudo-checkbox-minimal",n.appearance==="minimal")("mat-pseudo-checkbox-full",n.appearance==="full")("_mat-animation-noopable",n._animationsDisabled)},inputs:{state:"state",disabled:"disabled",appearance:"appearance"},decls:0,vars:0,template:function(i,n){},styles:[`.mat-pseudo-checkbox{border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox._mat-animation-noopable{transition:none !important;animation:none !important}.mat-pseudo-checkbox._mat-animation-noopable::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{left:1px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{left:1px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-minimal-selected-checkmark-color, var(--mat-sys-primary))}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full{border-color:var(--mat-pseudo-checkbox-full-unselected-icon-color, var(--mat-sys-on-surface-variant));border-width:2px;border-style:solid}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-disabled{border-color:var(--mat-pseudo-checkbox-full-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate{background-color:var(--mat-pseudo-checkbox-full-selected-icon-color, var(--mat-sys-primary));border-color:rgba(0,0,0,0)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-full-selected-checkmark-color, var(--mat-sys-on-primary))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background-color:var(--mat-pseudo-checkbox-full-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-full-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mat-pseudo-checkbox{width:18px;height:18px}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after{width:14px;height:6px;transform-origin:center;top:-4.2426406871px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{top:8px;width:16px}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after{width:10px;height:4px;transform-origin:center;top:-2.8284271247px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{top:6px;width:12px} +`],encapsulation:2,changeDetection:0})}return t})();var ulA=["button"],flA=["*"];function plA(t,e){if(t&1&&(B(0,"div",2),hA(1,"mat-pseudo-checkbox",6),Q()),t&2){let A=p();u(),H("disabled",A.disabled)}}var IT=new kA("MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS",{providedIn:"root",factory:()=>({hideSingleSelectionIndicator:!1,hideMultipleSelectionIndicator:!1,disabledInteractive:!1})}),dT=new kA("MatButtonToggleGroup"),mlA={provide:as,useExisting:Ja(()=>lM),multi:!0},Km=class{source;value;constructor(e,A){this.source=e,this.value=A}},lM=(()=>{class t{_changeDetector=w(wt);_dir=w(fo,{optional:!0});_multiple=!1;_disabled=!1;_disabledInteractive=!1;_selectionModel;_rawValue;_controlValueAccessorChangeFn=()=>{};_onTouched=()=>{};_buttonToggles;appearance;get name(){return this._name}set name(A){this._name=A,this._markButtonsForCheck()}_name=w(In).getId("mat-button-toggle-group-");vertical=!1;get value(){let A=this._selectionModel?this._selectionModel.selected:[];return this.multiple?A.map(i=>i.value):A[0]?A[0].value:void 0}set value(A){this._setSelectionByValue(A),this.valueChange.emit(this.value)}valueChange=new LA;get selected(){let A=this._selectionModel?this._selectionModel.selected:[];return this.multiple?A:A[0]||null}get multiple(){return this._multiple}set multiple(A){this._multiple=A,this._markButtonsForCheck()}get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._markButtonsForCheck()}get disabledInteractive(){return this._disabledInteractive}set disabledInteractive(A){this._disabledInteractive=A,this._markButtonsForCheck()}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}change=new LA;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._markButtonsForCheck()}_hideSingleSelectionIndicator;get hideMultipleSelectionIndicator(){return this._hideMultipleSelectionIndicator}set hideMultipleSelectionIndicator(A){this._hideMultipleSelectionIndicator=A,this._markButtonsForCheck()}_hideMultipleSelectionIndicator;constructor(){let A=w(IT,{optional:!0});this.appearance=A&&A.appearance?A.appearance:"standard",this._hideSingleSelectionIndicator=A?.hideSingleSelectionIndicator??!1,this._hideMultipleSelectionIndicator=A?.hideMultipleSelectionIndicator??!1}ngOnInit(){this._selectionModel=new V0(this.multiple,void 0,!1)}ngAfterContentInit(){this._selectionModel.select(...this._buttonToggles.filter(A=>A.checked)),this.multiple||this._initializeTabIndex()}writeValue(A){this.value=A,this._changeDetector.markForCheck()}registerOnChange(A){this._controlValueAccessorChangeFn=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}_keydown(A){if(this.multiple||this.disabled||Qa(A))return;let n=A.target.id,o=this._buttonToggles.toArray().findIndex(r=>r.buttonId===n),a=null;switch(A.keyCode){case 32:case 13:a=this._buttonToggles.get(o)||null;break;case 38:a=this._getNextButton(o,-1);break;case 37:a=this._getNextButton(o,this.dir==="ltr"?-1:1);break;case 40:a=this._getNextButton(o,1);break;case 39:a=this._getNextButton(o,this.dir==="ltr"?1:-1);break;default:return}a&&(A.preventDefault(),a._onButtonClick(),a.focus())}_emitChangeEvent(A){let i=new Km(A,this.value);this._rawValue=i.value,this._controlValueAccessorChangeFn(i.value),this.change.emit(i)}_syncButtonToggle(A,i,n=!1,o=!1){!this.multiple&&this.selected&&!A.checked&&(this.selected.checked=!1),this._selectionModel?i?this._selectionModel.select(A):this._selectionModel.deselect(A):o=!0,o?Promise.resolve().then(()=>this._updateModelValue(A,n)):this._updateModelValue(A,n)}_isSelected(A){return this._selectionModel&&this._selectionModel.isSelected(A)}_isPrechecked(A){return typeof this._rawValue>"u"?!1:this.multiple&&Array.isArray(this._rawValue)?this._rawValue.some(i=>A.value!=null&&i===A.value):A.value===this._rawValue}_initializeTabIndex(){if(this._buttonToggles.forEach(A=>{A.tabIndex=-1}),this.selected)this.selected.tabIndex=0;else for(let A=0;Athis._selectValue(n,i))):(this._clearSelection(),this._selectValue(A,i)),!this.multiple&&i.every(n=>n.tabIndex===-1)){for(let n of i)if(!n.disabled){n.tabIndex=0;break}}}_clearSelection(){this._selectionModel.clear(),this._buttonToggles.forEach(A=>{A.checked=!1,this.multiple||(A.tabIndex=-1)})}_selectValue(A,i){for(let n of i)if(n.value===A){n.checked=!0,this._selectionModel.select(n),this.multiple||(n.tabIndex=0);break}}_updateModelValue(A,i){i&&this._emitChangeEvent(A),this.valueChange.emit(this.value)}_markButtonsForCheck(){this._buttonToggles?.forEach(A=>A._markForCheck())}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["mat-button-toggle-group"]],contentQueries:function(i,n,o){if(i&1&&jo(o,Um,5),i&2){let a;ae(a=re())&&(n._buttonToggles=a)}},hostAttrs:[1,"mat-button-toggle-group"],hostVars:6,hostBindings:function(i,n){i&1&&U("keydown",function(a){return n._keydown(a)}),i&2&&(te("role",n.multiple?"group":"radiogroup")("aria-disabled",n.disabled),RA("mat-button-toggle-vertical",n.vertical)("mat-button-toggle-group-appearance-standard",n.appearance==="standard"))},inputs:{appearance:"appearance",name:"name",vertical:[2,"vertical","vertical",Be],value:"value",multiple:[2,"multiple","multiple",Be],disabled:[2,"disabled","disabled",Be],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Be],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",Be],hideMultipleSelectionIndicator:[2,"hideMultipleSelectionIndicator","hideMultipleSelectionIndicator",Be]},outputs:{valueChange:"valueChange",change:"change"},exportAs:["matButtonToggleGroup"],features:[Bt([mlA,{provide:dT,useExisting:t}])]})}return t})(),Um=(()=>{class t{_changeDetectorRef=w(wt);_elementRef=w(ce);_focusMonitor=w($a);_idGenerator=w(In);_animationDisabled=An();_checked=!1;ariaLabel;ariaLabelledby=null;_buttonElement;buttonToggleGroup;get buttonId(){return`${this.id}-button`}id;name;value;get tabIndex(){return this._tabIndex()}set tabIndex(A){this._tabIndex.set(A)}_tabIndex;disableRipple=!1;get appearance(){return this.buttonToggleGroup?this.buttonToggleGroup.appearance:this._appearance}set appearance(A){this._appearance=A}_appearance;get checked(){return this.buttonToggleGroup?this.buttonToggleGroup._isSelected(this):this._checked}set checked(A){A!==this._checked&&(this._checked=A,this.buttonToggleGroup&&this.buttonToggleGroup._syncButtonToggle(this,this._checked),this._changeDetectorRef.markForCheck())}get disabled(){return this._disabled||this.buttonToggleGroup&&this.buttonToggleGroup.disabled}set disabled(A){this._disabled=A}_disabled=!1;get disabledInteractive(){return this._disabledInteractive||this.buttonToggleGroup!==null&&this.buttonToggleGroup.disabledInteractive}set disabledInteractive(A){this._disabledInteractive=A}_disabledInteractive;change=new LA;constructor(){w(eo).load(lr);let A=w(dT,{optional:!0}),i=w(new Us("tabindex"),{optional:!0})||"",n=w(IT,{optional:!0});this._tabIndex=bA(parseInt(i)||0),this.buttonToggleGroup=A,this._appearance=n&&n.appearance?n.appearance:"standard",this._disabledInteractive=n?.disabledInteractive??!1}ngOnInit(){let A=this.buttonToggleGroup;this.id=this.id||this._idGenerator.getId("mat-button-toggle-"),A&&(A._isPrechecked(this)?this.checked=!0:A._isSelected(this)!==this._checked&&A._syncButtonToggle(this,this._checked))}ngAfterViewInit(){this._animationDisabled||this._elementRef.nativeElement.classList.add("mat-button-toggle-animations-enabled"),this._focusMonitor.monitor(this._elementRef,!0)}ngOnDestroy(){let A=this.buttonToggleGroup;this._focusMonitor.stopMonitoring(this._elementRef),A&&A._isSelected(this)&&A._syncButtonToggle(this,!1,!1,!0)}focus(A){this._buttonElement.nativeElement.focus(A)}_onButtonClick(){if(this.disabled)return;let A=this.isSingleSelector()?!0:!this._checked;if(A!==this._checked&&(this._checked=A,this.buttonToggleGroup&&(this.buttonToggleGroup._syncButtonToggle(this,this._checked,!0),this.buttonToggleGroup._onTouched())),this.isSingleSelector()){let i=this.buttonToggleGroup._buttonToggles.find(n=>n.tabIndex===0);i&&(i.tabIndex=-1),this.tabIndex=0}this.change.emit(new Km(this,this.value))}_markForCheck(){this._changeDetectorRef.markForCheck()}_getButtonName(){return this.isSingleSelector()?this.buttonToggleGroup.name:this.name||null}isSingleSelector(){return this.buttonToggleGroup&&!this.buttonToggleGroup.multiple}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-button-toggle"]],viewQuery:function(i,n){if(i&1&&Jt(ulA,5),i&2){let o;ae(o=re())&&(n._buttonElement=o.first)}},hostAttrs:["role","presentation",1,"mat-button-toggle"],hostVars:14,hostBindings:function(i,n){i&1&&U("focus",function(){return n.focus()}),i&2&&(te("aria-label",null)("aria-labelledby",null)("id",n.id)("name",null),RA("mat-button-toggle-standalone",!n.buttonToggleGroup)("mat-button-toggle-checked",n.checked)("mat-button-toggle-disabled",n.disabled)("mat-button-toggle-disabled-interactive",n.disabledInteractive)("mat-button-toggle-appearance-standard",n.appearance==="standard"))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],id:"id",name:"name",value:"value",tabIndex:"tabIndex",disableRipple:[2,"disableRipple","disableRipple",Be],appearance:"appearance",checked:[2,"checked","checked",Be],disabled:[2,"disabled","disabled",Be],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Be]},outputs:{change:"change"},exportAs:["matButtonToggle"],ngContentSelectors:flA,decls:7,vars:13,consts:[["button",""],["type","button",1,"mat-button-toggle-button","mat-focus-indicator",3,"click","id","disabled"],[1,"mat-button-toggle-checkbox-wrapper"],[1,"mat-button-toggle-label-content"],[1,"mat-button-toggle-focus-overlay"],["matRipple","",1,"mat-button-toggle-ripple",3,"matRippleTrigger","matRippleDisabled"],["state","checked","aria-hidden","true","appearance","minimal",3,"disabled"]],template:function(i,n){if(i&1&&(Rt(),B(0,"button",1,0),U("click",function(){return n._onButtonClick()}),O(2,plA,2,1,"div",2),B(3,"span",3),Ve(4),Q()(),hA(5,"span",4)(6,"span",5)),i&2){let o=Qi(1);H("id",n.buttonId)("disabled",n.disabled&&!n.disabledInteractive||null),te("role",n.isSingleSelector()?"radio":"button")("tabindex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("aria-pressed",n.isSingleSelector()?null:n.checked)("aria-checked",n.isSingleSelector()?n.checked:null)("name",n._getButtonName())("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),u(2),Y(n.buttonToggleGroup&&(!n.buttonToggleGroup.multiple&&!n.buttonToggleGroup.hideSingleSelectionIndicator||n.buttonToggleGroup.multiple&&!n.buttonToggleGroup.hideMultipleSelectionIndicator)?2:-1),u(4),H("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)}},dependencies:[rs,Gm],styles:[`.mat-button-toggle-standalone,.mat-button-toggle-group{position:relative;display:inline-flex;flex-direction:row;white-space:nowrap;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0);border-radius:var(--mat-button-toggle-legacy-shape);transform:translateZ(0)}.mat-button-toggle-standalone:not([class*=mat-elevation-z]),.mat-button-toggle-group:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)}@media(forced-colors: active){.mat-button-toggle-standalone,.mat-button-toggle-group{outline:solid 1px}}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard .mat-pseudo-checkbox,.mat-button-toggle-group-appearance-standard .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard:not([class*=mat-elevation-z]),.mat-button-toggle-group-appearance-standard:not([class*=mat-elevation-z]){box-shadow:none}@media(forced-colors: active){.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{outline:0}}.mat-button-toggle-vertical{flex-direction:column}.mat-button-toggle-vertical .mat-button-toggle-label-content{display:block}.mat-button-toggle{white-space:nowrap;position:relative;color:var(--mat-button-toggle-legacy-text-color);font-family:var(--mat-button-toggle-legacy-label-text-font);font-size:var(--mat-button-toggle-legacy-label-text-size);line-height:var(--mat-button-toggle-legacy-label-text-line-height);font-weight:var(--mat-button-toggle-legacy-label-text-weight);letter-spacing:var(--mat-button-toggle-legacy-label-text-tracking);--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-button-toggle-legacy-selected-state-text-color)}.mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-button-toggle-legacy-focus-state-layer-opacity)}.mat-button-toggle .mat-icon svg{vertical-align:top}.mat-button-toggle-checkbox-wrapper{display:inline-block;justify-content:flex-start;align-items:center;width:0;height:18px;line-height:18px;overflow:hidden;box-sizing:border-box;position:absolute;top:50%;left:16px;transform:translate3d(0, -50%, 0)}[dir=rtl] .mat-button-toggle-checkbox-wrapper{left:auto;right:16px}.mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:12px}[dir=rtl] .mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:auto;right:12px}.mat-button-toggle-checked .mat-button-toggle-checkbox-wrapper{width:18px}.mat-button-toggle-animations-enabled .mat-button-toggle-checkbox-wrapper{transition:width 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-checkbox-wrapper{transition:none}.mat-button-toggle-checked{color:var(--mat-button-toggle-legacy-selected-state-text-color);background-color:var(--mat-button-toggle-legacy-selected-state-background-color)}.mat-button-toggle-disabled{pointer-events:none;color:var(--mat-button-toggle-legacy-disabled-state-text-color);background-color:var(--mat-button-toggle-legacy-disabled-state-background-color);--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color: var(--mat-button-toggle-legacy-disabled-state-text-color)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:var(--mat-button-toggle-legacy-disabled-selected-state-background-color)}.mat-button-toggle-disabled-interactive{pointer-events:auto}.mat-button-toggle-appearance-standard{color:var(--mat-button-toggle-text-color, var(--mat-sys-on-surface));background-color:var(--mat-button-toggle-background-color, transparent);font-family:var(--mat-button-toggle-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-toggle-label-text-size, var(--mat-sys-label-large-size));line-height:var(--mat-button-toggle-label-text-line-height, var(--mat-sys-label-large-line-height));font-weight:var(--mat-button-toggle-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-button-toggle-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:none;border-top:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:var(--mat-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-button-toggle-selected-state-background-color, var(--mat-sys-secondary-container))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled{color:var(--mat-button-toggle-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-toggle-disabled-state-background-color, transparent)}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color: var(--mat-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled.mat-button-toggle-checked{color:var(--mat-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-toggle-disabled-selected-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:var(--mat-button-toggle-state-layer-color, var(--mat-sys-on-surface))}.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{opacity:var(--mat-button-toggle-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-button-toggle-appearance-standard.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-button-toggle-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}@media(hover: none){.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{display:none}}.mat-button-toggle-label-content{-webkit-user-select:none;user-select:none;display:inline-block;padding:0 16px;line-height:var(--mat-button-toggle-legacy-height);position:relative}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{padding:0 12px;line-height:var(--mat-button-toggle-height, 40px)}.mat-button-toggle-label-content>*{vertical-align:middle}.mat-button-toggle-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit;pointer-events:none;opacity:0;background-color:var(--mat-button-toggle-legacy-state-layer-color)}@media(forced-colors: active){.mat-button-toggle-checked .mat-button-toggle-focus-overlay{border-bottom:solid 500px;opacity:.5;height:0}.mat-button-toggle-checked:hover .mat-button-toggle-focus-overlay{opacity:.6}.mat-button-toggle-checked.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{border-bottom:solid 500px}}.mat-button-toggle .mat-button-toggle-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-toggle-button{border:0;background:none;color:inherit;padding:0;margin:0;font:inherit;outline:none;width:100%;cursor:pointer}.mat-button-toggle-animations-enabled .mat-button-toggle-button{transition:padding 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-button{transition:none}.mat-button-toggle-disabled .mat-button-toggle-button{cursor:default}.mat-button-toggle-button::-moz-focus-inner{border:0}.mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:30px}[dir=rtl] .mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:0;padding-right:30px}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{--mat-focus-indicator-border-radius: var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-bottom-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-bottom-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-bottom-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-bottom-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-top-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))} +`],encapsulation:2,changeDetection:0})}return t})(),BT=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Yc,Um,fi]})}return t})();var wlA=20,Wc=(()=>{class t{_ngZone=w(qe);_platform=w(gi);_renderer=w(Kr).createRenderer(null,null);_cleanupGlobalListener;constructor(){}_scrolled=new ie;_scrolledCount=0;scrollContainers=new Map;register(A){this.scrollContainers.has(A)||this.scrollContainers.set(A,A.elementScrolled().subscribe(()=>this._scrolled.next(A)))}deregister(A){let i=this.scrollContainers.get(A);i&&(i.unsubscribe(),this.scrollContainers.delete(A))}scrolled(A=wlA){return this._platform.isBrowser?new vi(i=>{this._cleanupGlobalListener||(this._cleanupGlobalListener=this._ngZone.runOutsideAngular(()=>this._renderer.listen("document","scroll",()=>this._scrolled.next())));let n=A>0?this._scrolled.pipe(jI(A)).subscribe(i):this._scrolled.subscribe(i);return this._scrolledCount++,()=>{n.unsubscribe(),this._scrolledCount--,this._scrolledCount||(this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0)}}):ne()}ngOnDestroy(){this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0,this.scrollContainers.forEach((A,i)=>this.deregister(i)),this._scrolled.complete()}ancestorScrolled(A,i){let n=this.getAncestorScrollContainers(A);return this.scrolled(i).pipe(gt(o=>!o||n.indexOf(o)>-1))}getAncestorScrollContainers(A){let i=[];return this.scrollContainers.forEach((n,o)=>{this._scrollableContainsElement(o,A)&&i.push(o)}),i}_scrollableContainsElement(A,i){let n=Ds(i),o=A.getElementRef().nativeElement;do if(n==o)return!0;while(n=n.parentElement);return!1}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),W0=(()=>{class t{elementRef=w(ce);scrollDispatcher=w(Wc);ngZone=w(qe);dir=w(fo,{optional:!0});_scrollElement=this.elementRef.nativeElement;_destroyed=new ie;_renderer=w(Pi);_cleanupScroll;_elementScrolled=new ie;constructor(){}ngOnInit(){this._cleanupScroll=this.ngZone.runOutsideAngular(()=>this._renderer.listen(this._scrollElement,"scroll",A=>this._elementScrolled.next(A))),this.scrollDispatcher.register(this)}ngOnDestroy(){this._cleanupScroll?.(),this._elementScrolled.complete(),this.scrollDispatcher.deregister(this),this._destroyed.next(),this._destroyed.complete()}elementScrolled(){return this._elementScrolled}getElementRef(){return this.elementRef}scrollTo(A){let i=this.elementRef.nativeElement,n=this.dir&&this.dir.value=="rtl";A.left==null&&(A.left=n?A.end:A.start),A.right==null&&(A.right=n?A.start:A.end),A.bottom!=null&&(A.top=i.scrollHeight-i.clientHeight-A.bottom),n&&rB()!=Rg.NORMAL?(A.left!=null&&(A.right=i.scrollWidth-i.clientWidth-A.left),rB()==Rg.INVERTED?A.left=A.right:rB()==Rg.NEGATED&&(A.left=A.right?-A.right:A.right)):A.right!=null&&(A.left=i.scrollWidth-i.clientWidth-A.right),this._applyScrollToOptions(A)}_applyScrollToOptions(A){let i=this.elementRef.nativeElement;bp()?i.scrollTo(A):(A.top!=null&&(i.scrollTop=A.top),A.left!=null&&(i.scrollLeft=A.left))}measureScrollOffset(A){let i="left",n="right",o=this.elementRef.nativeElement;if(A=="top")return o.scrollTop;if(A=="bottom")return o.scrollHeight-o.clientHeight-o.scrollTop;let a=this.dir&&this.dir.value=="rtl";return A=="start"?A=a?n:i:A=="end"&&(A=a?i:n),a&&rB()==Rg.INVERTED?A==i?o.scrollWidth-o.clientWidth-o.scrollLeft:o.scrollLeft:a&&rB()==Rg.NEGATED?A==i?o.scrollLeft+o.scrollWidth-o.clientWidth:-o.scrollLeft:A==i?o.scrollLeft:o.scrollWidth-o.clientWidth-o.scrollLeft}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdk-scrollable",""],["","cdkScrollable",""]]})}return t})(),DlA=20,Ms=(()=>{class t{_platform=w(gi);_listeners;_viewportSize=null;_change=new ie;_document=w(ti);constructor(){let A=w(qe),i=w(Kr).createRenderer(null,null);A.runOutsideAngular(()=>{if(this._platform.isBrowser){let n=o=>this._change.next(o);this._listeners=[i.listen("window","resize",n),i.listen("window","orientationchange",n)]}this.change().subscribe(()=>this._viewportSize=null)})}ngOnDestroy(){this._listeners?.forEach(A=>A()),this._change.complete()}getViewportSize(){this._viewportSize||this._updateViewportSize();let A={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),A}getViewportRect(){let A=this.getViewportScrollPosition(),{width:i,height:n}=this.getViewportSize();return{top:A.top,left:A.left,bottom:A.top+n,right:A.left+i,height:n,width:i}}getViewportScrollPosition(){if(!this._platform.isBrowser)return{top:0,left:0};let A=this._document,i=this._getWindow(),n=A.documentElement,o=n.getBoundingClientRect(),a=-o.top||A.body?.scrollTop||i.scrollY||n.scrollTop||0,r=-o.left||A.body?.scrollLeft||i.scrollX||n.scrollLeft||0;return{top:a,left:r}}change(A=DlA){return A>0?this._change.pipe(jI(A)):this._change}_getWindow(){return this._document.defaultView||window}_updateViewportSize(){let A=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:A.innerWidth,height:A.innerHeight}:{width:0,height:0}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var ET=new kA("CDK_VIRTUAL_SCROLL_VIEWPORT");var Vc=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})(),Tm=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi,Vc,fi,Vc]})}return t})();var Nu=class{_attachedHost=null;attach(e){return this._attachedHost=e,e.attach(this)}detach(){let e=this._attachedHost;e!=null&&(this._attachedHost=null,e.detach())}get isAttached(){return this._attachedHost!=null}setAttachedHost(e){this._attachedHost=e}},Ss=class extends Nu{component;viewContainerRef;injector;projectableNodes;bindings;constructor(e,A,i,n,o){super(),this.component=e,this.viewContainerRef=A,this.injector=i,this.projectableNodes=n,this.bindings=o||null}},Jr=class extends Nu{templateRef;viewContainerRef;context;injector;constructor(e,A,i,n){super(),this.templateRef=e,this.viewContainerRef=A,this.context=i,this.injector=n}get origin(){return this.templateRef.elementRef}attach(e,A=this.context){return this.context=A,super.attach(e)}detach(){return this.context=void 0,super.detach()}},gM=class extends Nu{element;constructor(e){super(),this.element=e instanceof ce?e.nativeElement:e}},C2=class{_attachedPortal=null;_disposeFn=null;_isDisposed=!1;hasAttached(){return!!this._attachedPortal}attach(e){if(e instanceof Ss)return this._attachedPortal=e,this.attachComponentPortal(e);if(e instanceof Jr)return this._attachedPortal=e,this.attachTemplatePortal(e);if(this.attachDomPortal&&e instanceof gM)return this._attachedPortal=e,this.attachDomPortal(e)}attachDomPortal=null;detach(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()}dispose(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0}setDisposeFn(e){this._disposeFn=e}_invokeDisposeFn(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)}},Fu=class extends C2{outletElement;_appRef;_defaultInjector;constructor(e,A,i){super(),this.outletElement=e,this._appRef=A,this._defaultInjector=i}attachComponentPortal(e){let A;if(e.viewContainerRef){let i=e.injector||e.viewContainerRef.injector,n=i.get(Zv,null,{optional:!0})||void 0;A=e.viewContainerRef.createComponent(e.component,{index:e.viewContainerRef.length,injector:i,ngModuleRef:n,projectableNodes:e.projectableNodes||void 0,bindings:e.bindings||void 0}),this.setDisposeFn(()=>A.destroy())}else{let i=this._appRef,n=e.injector||this._defaultInjector||Dt.NULL,o=n.get(Gr,i.injector);A=tp(e.component,{elementInjector:n,environmentInjector:o,projectableNodes:e.projectableNodes||void 0,bindings:e.bindings||void 0}),i.attachView(A.hostView),this.setDisposeFn(()=>{i.viewCount>0&&i.detachView(A.hostView),A.destroy()})}return this.outletElement.appendChild(this._getComponentRootNode(A)),this._attachedPortal=e,A}attachTemplatePortal(e){let A=e.viewContainerRef,i=A.createEmbeddedView(e.templateRef,e.context,{injector:e.injector});return i.rootNodes.forEach(n=>this.outletElement.appendChild(n)),i.detectChanges(),this.setDisposeFn(()=>{let n=A.indexOf(i);n!==-1&&A.remove(n)}),this._attachedPortal=e,i}attachDomPortal=e=>{let A=e.element;A.parentNode;let i=this.outletElement.ownerDocument.createComment("dom-portal");A.parentNode.insertBefore(i,A),this.outletElement.appendChild(A),this._attachedPortal=e,super.setDisposeFn(()=>{i.parentNode&&i.parentNode.replaceChild(A,i)})};dispose(){super.dispose(),this.outletElement.remove()}_getComponentRootNode(e){return e.hostView.rootNodes[0]}},hT=(()=>{class t extends Jr{constructor(){let A=w(ao),i=w(Mo);super(A,i)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkPortal",""]],exportAs:["cdkPortal"],features:[mt]})}return t})(),Wl=(()=>{class t extends C2{_moduleRef=w(Zv,{optional:!0});_document=w(ti);_viewContainerRef=w(Mo);_isInitialized=!1;_attachedRef=null;constructor(){super()}get portal(){return this._attachedPortal}set portal(A){this.hasAttached()&&!A&&!this._isInitialized||(this.hasAttached()&&super.detach(),A&&super.attach(A),this._attachedPortal=A||null)}attached=new LA;get attachedRef(){return this._attachedRef}ngOnInit(){this._isInitialized=!0}ngOnDestroy(){super.dispose(),this._attachedRef=this._attachedPortal=null}attachComponentPortal(A){A.setAttachedHost(this);let i=A.viewContainerRef!=null?A.viewContainerRef:this._viewContainerRef,n=i.createComponent(A.component,{index:i.length,injector:A.injector||i.injector,projectableNodes:A.projectableNodes||void 0,ngModuleRef:this._moduleRef||void 0,bindings:A.bindings||void 0});return i!==this._viewContainerRef&&this._getRootNode().appendChild(n.hostView.rootNodes[0]),super.setDisposeFn(()=>n.destroy()),this._attachedPortal=A,this._attachedRef=n,this.attached.emit(n),n}attachTemplatePortal(A){A.setAttachedHost(this);let i=this._viewContainerRef.createEmbeddedView(A.templateRef,A.context,{injector:A.injector});return super.setDisposeFn(()=>this._viewContainerRef.clear()),this._attachedPortal=A,this._attachedRef=i,this.attached.emit(i),i}attachDomPortal=A=>{let i=A.element;i.parentNode;let n=this._document.createComment("dom-portal");A.setAttachedHost(this),i.parentNode.insertBefore(n,i),this._getRootNode().appendChild(i),this._attachedPortal=A,super.setDisposeFn(()=>{n.parentNode&&n.parentNode.replaceChild(i,n)})};_getRootNode(){let A=this._viewContainerRef.element.nativeElement;return A.nodeType===A.ELEMENT_NODE?A:A.parentNode}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkPortalOutlet",""]],inputs:{portal:[0,"cdkPortalOutlet","portal"]},outputs:{attached:"attached"},exportAs:["cdkPortalOutlet"],features:[mt]})}return t})(),Zc=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})();var QT=bp();function NB(t){return new Jm(t.get(Ms),t.get(ti))}var Jm=class{_viewportRuler;_previousHTMLStyles={top:"",left:""};_previousScrollPosition;_isEnabled=!1;_document;constructor(e,A){this._viewportRuler=e,this._document=A}attach(){}enable(){if(this._canBeEnabled()){let e=this._document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=e.style.left||"",this._previousHTMLStyles.top=e.style.top||"",e.style.left=Oa(-this._previousScrollPosition.left),e.style.top=Oa(-this._previousScrollPosition.top),e.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}}disable(){if(this._isEnabled){let e=this._document.documentElement,A=this._document.body,i=e.style,n=A.style,o=i.scrollBehavior||"",a=n.scrollBehavior||"";this._isEnabled=!1,i.left=this._previousHTMLStyles.left,i.top=this._previousHTMLStyles.top,e.classList.remove("cdk-global-scrollblock"),QT&&(i.scrollBehavior=n.scrollBehavior="auto"),window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),QT&&(i.scrollBehavior=o,n.scrollBehavior=a)}}_canBeEnabled(){if(this._document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;let A=this._document.documentElement,i=this._viewportRuler.getViewportSize();return A.scrollHeight>i.height||A.scrollWidth>i.width}};function yT(t,e){return new Om(t.get(Wc),t.get(qe),t.get(Ms),e)}var Om=class{_scrollDispatcher;_ngZone;_viewportRuler;_config;_scrollSubscription=null;_overlayRef;_initialScrollPosition;constructor(e,A,i,n){this._scrollDispatcher=e,this._ngZone=A,this._viewportRuler=i,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(this._scrollSubscription)return;let e=this._scrollDispatcher.scrolled(0).pipe(gt(A=>!A||!this._overlayRef.overlayElement.contains(A.getElementRef().nativeElement)));this._config&&this._config.threshold&&this._config.threshold>1?(this._initialScrollPosition=this._viewportRuler.getViewportScrollPosition().top,this._scrollSubscription=e.subscribe(()=>{let A=this._viewportRuler.getViewportScrollPosition().top;Math.abs(A-this._initialScrollPosition)>this._config.threshold?this._detach():this._overlayRef.updatePosition()})):this._scrollSubscription=e.subscribe(this._detach)}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}_detach=()=>{this.disable(),this._overlayRef.hasAttached()&&this._ngZone.run(()=>this._overlayRef.detach())}};var Lu=class{enable(){}disable(){}attach(){}};function cM(t,e){return e.some(A=>{let i=t.bottomA.bottom,o=t.rightA.right;return i||n||o||a})}function uT(t,e){return e.some(A=>{let i=t.topA.bottom,o=t.leftA.right;return i||n||o||a})}function Z0(t,e){return new Ym(t.get(Wc),t.get(Ms),t.get(qe),e)}var Ym=class{_scrollDispatcher;_viewportRuler;_ngZone;_config;_scrollSubscription=null;_overlayRef;constructor(e,A,i,n){this._scrollDispatcher=e,this._viewportRuler=A,this._ngZone=i,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(!this._scrollSubscription){let e=this._config?this._config.scrollThrottle:0;this._scrollSubscription=this._scrollDispatcher.scrolled(e).subscribe(()=>{if(this._overlayRef.updatePosition(),this._config&&this._config.autoClose){let A=this._overlayRef.overlayElement.getBoundingClientRect(),{width:i,height:n}=this._viewportRuler.getViewportSize();cM(A,[{width:i,height:n,bottom:n,right:i,top:0,left:0}])&&(this.disable(),this._ngZone.run(()=>this._overlayRef.detach()))}})}}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}},vT=(()=>{class t{_injector=w(Dt);constructor(){}noop=()=>new Lu;close=A=>yT(this._injector,A);block=()=>NB(this._injector);reposition=A=>Z0(this._injector,A);static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Jg=class{positionStrategy;scrollStrategy=new Lu;panelClass="";hasBackdrop=!1;backdropClass="cdk-overlay-dark-backdrop";disableAnimations;width;height;minWidth;minHeight;maxWidth;maxHeight;direction;disposeOnNavigation=!1;usePopover;eventPredicate;constructor(e){if(e){let A=Object.keys(e);for(let i of A)e[i]!==void 0&&(this[i]=e[i])}}};var Hm=class{connectionPair;scrollableViewProperties;constructor(e,A){this.connectionPair=e,this.scrollableViewProperties=A}};var bT=(()=>{class t{_attachedOverlays=[];_document=w(ti);_isAttached=!1;constructor(){}ngOnDestroy(){this.detach()}add(A){this.remove(A),this._attachedOverlays.push(A)}remove(A){let i=this._attachedOverlays.indexOf(A);i>-1&&this._attachedOverlays.splice(i,1),this._attachedOverlays.length===0&&this.detach()}canReceiveEvent(A,i,n){return n.observers.length<1?!1:A.eventPredicate?A.eventPredicate(i):!0}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),MT=(()=>{class t extends bT{_ngZone=w(qe);_renderer=w(Kr).createRenderer(null,null);_cleanupKeydown;add(A){super.add(A),this._isAttached||(this._ngZone.runOutsideAngular(()=>{this._cleanupKeydown=this._renderer.listen("body","keydown",this._keydownListener)}),this._isAttached=!0)}detach(){this._isAttached&&(this._cleanupKeydown?.(),this._isAttached=!1)}_keydownListener=A=>{let i=this._attachedOverlays;for(let n=i.length-1;n>-1;n--){let o=i[n];if(this.canReceiveEvent(o,A,o._keydownEvents)){this._ngZone.run(()=>o._keydownEvents.next(A));break}}};static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),ST=(()=>{class t extends bT{_platform=w(gi);_ngZone=w(qe);_renderer=w(Kr).createRenderer(null,null);_cursorOriginalValue;_cursorStyleIsSet=!1;_pointerDownEventTarget=null;_cleanups;add(A){if(super.add(A),!this._isAttached){let i=this._document.body,n={capture:!0},o=this._renderer;this._cleanups=this._ngZone.runOutsideAngular(()=>[o.listen(i,"pointerdown",this._pointerDownListener,n),o.listen(i,"click",this._clickListener,n),o.listen(i,"auxclick",this._clickListener,n),o.listen(i,"contextmenu",this._clickListener,n)]),this._platform.IOS&&!this._cursorStyleIsSet&&(this._cursorOriginalValue=i.style.cursor,i.style.cursor="pointer",this._cursorStyleIsSet=!0),this._isAttached=!0}}detach(){this._isAttached&&(this._cleanups?.forEach(A=>A()),this._cleanups=void 0,this._platform.IOS&&this._cursorStyleIsSet&&(this._document.body.style.cursor=this._cursorOriginalValue,this._cursorStyleIsSet=!1),this._isAttached=!1)}_pointerDownListener=A=>{this._pointerDownEventTarget=Ur(A)};_clickListener=A=>{let i=Ur(A),n=A.type==="click"&&this._pointerDownEventTarget?this._pointerDownEventTarget:i;this._pointerDownEventTarget=null;let o=this._attachedOverlays.slice();for(let a=o.length-1;a>-1;a--){let r=o[a],s=r._outsidePointerEvents;if(!(!r.hasAttached()||!this.canReceiveEvent(r,A,s))){if(fT(r.overlayElement,i)||fT(r.overlayElement,n))break;this._ngZone?this._ngZone.run(()=>s.next(A)):s.next(A)}}};static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function fT(t,e){let A=typeof ShadowRoot<"u"&&ShadowRoot,i=e;for(;i;){if(i===t)return!0;i=A&&i instanceof ShadowRoot?i.host:i.parentNode}return!1}var kT=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["ng-component"]],hostAttrs:["cdk-overlay-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[`.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed}@layer cdk-overlay{.cdk-overlay-container{z-index:1000}}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute}@layer cdk-overlay{.cdk-global-overlay-wrapper{z-index:1000}}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;display:flex;max-width:100%;max-height:100%}@layer cdk-overlay{.cdk-overlay-pane{z-index:1000}}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);opacity:0;touch-action:manipulation}@layer cdk-overlay{.cdk-overlay-backdrop{z-index:1000;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}}@media(prefers-reduced-motion){.cdk-overlay-backdrop{transition-duration:1ms}}.cdk-overlay-backdrop-showing{opacity:1}@media(forced-colors: active){.cdk-overlay-backdrop-showing{opacity:.6}}@layer cdk-overlay{.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing,.cdk-high-contrast-active .cdk-overlay-transparent-backdrop{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;display:flex;flex-direction:column;min-width:1px;min-height:1px}@layer cdk-overlay{.cdk-overlay-connected-position-bounding-box{z-index:1000}}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.cdk-overlay-popover{background:none;border:none;padding:0;outline:0;overflow:visible;position:fixed;pointer-events:none;white-space:normal;color:inherit;text-decoration:none;width:100%;height:100%;inset:auto;top:0;left:0}.cdk-overlay-popover::backdrop{display:none}.cdk-overlay-popover .cdk-overlay-backdrop{position:fixed;z-index:auto} +`],encapsulation:2,changeDetection:0})}return t})(),jm=(()=>{class t{_platform=w(gi);_containerElement;_document=w(ti);_styleLoader=w(eo);constructor(){}ngOnDestroy(){this._containerElement?.remove()}getContainerElement(){return this._loadStyles(),this._containerElement||this._createContainer(),this._containerElement}_createContainer(){let A="cdk-overlay-container";if(this._platform.isBrowser||kb()){let n=this._document.querySelectorAll(`.${A}[platform="server"], .${A}[platform="test"]`);for(let o=0;o{let e=this.element;clearTimeout(this._fallbackTimeout),this._cleanupTransitionEnd?.(),this._cleanupTransitionEnd=this._renderer.listen(e,"transitionend",this.dispose),this._fallbackTimeout=setTimeout(this.dispose,500),e.style.pointerEvents="none",e.classList.remove("cdk-overlay-backdrop-showing")})}dispose=()=>{clearTimeout(this._fallbackTimeout),this._cleanupClick?.(),this._cleanupTransitionEnd?.(),this._cleanupClick=this._cleanupTransitionEnd=this._fallbackTimeout=void 0,this.element.remove()}};function IM(t){return t&&t.nodeType===1}var _B=class{_portalOutlet;_host;_pane;_config;_ngZone;_keyboardDispatcher;_document;_location;_outsideClickDispatcher;_animationsDisabled;_injector;_renderer;_backdropClick=new ie;_attachments=new ie;_detachments=new ie;_positionStrategy;_scrollStrategy;_locationChanges=bo.EMPTY;_backdropRef=null;_detachContentMutationObserver;_detachContentAfterRenderRef;_disposed=!1;_previousHostParent;_keydownEvents=new ie;_outsidePointerEvents=new ie;_afterNextRenderRef;constructor(e,A,i,n,o,a,r,s,l,g=!1,C,I){this._portalOutlet=e,this._host=A,this._pane=i,this._config=n,this._ngZone=o,this._keyboardDispatcher=a,this._document=r,this._location=s,this._outsideClickDispatcher=l,this._animationsDisabled=g,this._injector=C,this._renderer=I,n.scrollStrategy&&(this._scrollStrategy=n.scrollStrategy,this._scrollStrategy.attach(this)),this._positionStrategy=n.positionStrategy}get overlayElement(){return this._pane}get backdropElement(){return this._backdropRef?.element||null}get hostElement(){return this._host}get eventPredicate(){return this._config?.eventPredicate||null}attach(e){if(this._disposed)return null;this._attachHost();let A=this._portalOutlet.attach(e);return this._positionStrategy?.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._scrollStrategy&&this._scrollStrategy.enable(),this._afterNextRenderRef?.destroy(),this._afterNextRenderRef=Hn(()=>{this.hasAttached()&&this.updatePosition()},{injector:this._injector}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!0),this._attachments.next(),this._completeDetachContent(),this._keyboardDispatcher.add(this),this._config.disposeOnNavigation&&(this._locationChanges=this._location.subscribe(()=>this.dispose())),this._outsideClickDispatcher.add(this),typeof A?.onDestroy=="function"&&A.onDestroy(()=>{this.hasAttached()&&this._ngZone.runOutsideAngular(()=>Promise.resolve().then(()=>this.detach()))}),A}detach(){if(!this.hasAttached())return;this.detachBackdrop(),this._togglePointerEvents(!1),this._positionStrategy&&this._positionStrategy.detach&&this._positionStrategy.detach(),this._scrollStrategy&&this._scrollStrategy.disable();let e=this._portalOutlet.detach();return this._detachments.next(),this._completeDetachContent(),this._keyboardDispatcher.remove(this),this._detachContentWhenEmpty(),this._locationChanges.unsubscribe(),this._outsideClickDispatcher.remove(this),e}dispose(){if(this._disposed)return;let e=this.hasAttached();this._positionStrategy&&this._positionStrategy.dispose(),this._disposeScrollStrategy(),this._backdropRef?.dispose(),this._locationChanges.unsubscribe(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),this._outsidePointerEvents.complete(),this._outsideClickDispatcher.remove(this),this._host?.remove(),this._afterNextRenderRef?.destroy(),this._previousHostParent=this._pane=this._host=this._backdropRef=null,e&&this._detachments.next(),this._detachments.complete(),this._completeDetachContent(),this._disposed=!0}hasAttached(){return this._portalOutlet.hasAttached()}backdropClick(){return this._backdropClick}attachments(){return this._attachments}detachments(){return this._detachments}keydownEvents(){return this._keydownEvents}outsidePointerEvents(){return this._outsidePointerEvents}getConfig(){return this._config}updatePosition(){this._positionStrategy&&this._positionStrategy.apply()}updatePositionStrategy(e){e!==this._positionStrategy&&(this._positionStrategy&&this._positionStrategy.dispose(),this._positionStrategy=e,this.hasAttached()&&(e.attach(this),this.updatePosition()))}updateSize(e){this._config=gA(gA({},this._config),e),this._updateElementSize()}setDirection(e){this._config=Ye(gA({},this._config),{direction:e}),this._updateElementDirection()}addPanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!0)}removePanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!1)}getDirection(){let e=this._config.direction;return e?typeof e=="string"?e:e.value:"ltr"}updateScrollStrategy(e){e!==this._scrollStrategy&&(this._disposeScrollStrategy(),this._scrollStrategy=e,this.hasAttached()&&(e.attach(this),e.enable()))}_updateElementDirection(){this._host.setAttribute("dir",this.getDirection())}_updateElementSize(){if(!this._pane)return;let e=this._pane.style;e.width=Oa(this._config.width),e.height=Oa(this._config.height),e.minWidth=Oa(this._config.minWidth),e.minHeight=Oa(this._config.minHeight),e.maxWidth=Oa(this._config.maxWidth),e.maxHeight=Oa(this._config.maxHeight)}_togglePointerEvents(e){this._pane.style.pointerEvents=e?"":"none"}_attachHost(){if(!this._host.parentElement){let e=this._config.usePopover?this._positionStrategy?.getPopoverInsertionPoint?.():null;IM(e)?e.after(this._host):e?.type==="parent"?e.element.appendChild(this._host):this._previousHostParent?.appendChild(this._host)}if(this._config.usePopover)try{this._host.showPopover()}catch(e){}}_attachBackdrop(){let e="cdk-overlay-backdrop-showing";this._backdropRef?.dispose(),this._backdropRef=new CM(this._document,this._renderer,this._ngZone,A=>{this._backdropClick.next(A)}),this._animationsDisabled&&this._backdropRef.element.classList.add("cdk-overlay-backdrop-noop-animation"),this._config.backdropClass&&this._toggleClasses(this._backdropRef.element,this._config.backdropClass,!0),this._config.usePopover?this._host.prepend(this._backdropRef.element):this._host.parentElement.insertBefore(this._backdropRef.element,this._host),!this._animationsDisabled&&typeof requestAnimationFrame<"u"?this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>this._backdropRef?.element.classList.add(e))}):this._backdropRef.element.classList.add(e)}_updateStackingOrder(){!this._config.usePopover&&this._host.nextSibling&&this._host.parentNode.appendChild(this._host)}detachBackdrop(){this._animationsDisabled?(this._backdropRef?.dispose(),this._backdropRef=null):this._backdropRef?.detach()}_toggleClasses(e,A,i){let n=iB(A||[]).filter(o=>!!o);n.length&&(i?e.classList.add(...n):e.classList.remove(...n))}_detachContentWhenEmpty(){let e=!1;try{this._detachContentAfterRenderRef=Hn(()=>{e=!0,this._detachContent()},{injector:this._injector})}catch(A){if(e)throw A;this._detachContent()}globalThis.MutationObserver&&this._pane&&(this._detachContentMutationObserver||=new globalThis.MutationObserver(()=>{this._detachContent()}),this._detachContentMutationObserver.observe(this._pane,{childList:!0}))}_detachContent(){(!this._pane||!this._host||this._pane.children.length===0)&&(this._pane&&this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!1),this._host&&this._host.parentElement&&(this._previousHostParent=this._host.parentElement,this._host.remove()),this._completeDetachContent())}_completeDetachContent(){this._detachContentAfterRenderRef?.destroy(),this._detachContentAfterRenderRef=void 0,this._detachContentMutationObserver?.disconnect()}_disposeScrollStrategy(){let e=this._scrollStrategy;e?.disable(),e?.detach?.()}},pT="cdk-overlay-connected-position-bounding-box",vlA=/([A-Za-z%]+)$/;function y1(t,e){return new zm(e,t.get(Ms),t.get(ti),t.get(gi),t.get(jm))}var zm=class{_viewportRuler;_document;_platform;_overlayContainer;_overlayRef;_isInitialRender=!1;_lastBoundingBoxSize={width:0,height:0};_isPushed=!1;_canPush=!0;_growAfterOpen=!1;_hasFlexibleDimensions=!0;_positionLocked=!1;_originRect;_overlayRect;_viewportRect;_containerRect;_viewportMargin=0;_scrollables=[];_preferredPositions=[];_origin;_pane;_isDisposed=!1;_boundingBox=null;_lastPosition=null;_lastScrollVisibility=null;_positionChanges=new ie;_resizeSubscription=bo.EMPTY;_offsetX=0;_offsetY=0;_transformOriginSelector;_appliedPanelClasses=[];_previousPushAmount=null;_popoverLocation="global";positionChanges=this._positionChanges;get positions(){return this._preferredPositions}constructor(e,A,i,n,o){this._viewportRuler=A,this._document=i,this._platform=n,this._overlayContainer=o,this.setOrigin(e)}attach(e){this._overlayRef&&this._overlayRef,this._validatePositions(),e.hostElement.classList.add(pT),this._overlayRef=e,this._boundingBox=e.hostElement,this._pane=e.overlayElement,this._isDisposed=!1,this._isInitialRender=!0,this._lastPosition=null,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(()=>{this._isInitialRender=!0,this.apply()})}apply(){if(this._isDisposed||!this._platform.isBrowser)return;if(!this._isInitialRender&&this._positionLocked&&this._lastPosition){this.reapplyLastPosition();return}this._clearPanelClasses(),this._resetOverlayElementStyles(),this._resetBoundingBoxStyles(),this._viewportRect=this._getNarrowedViewportRect(),this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._containerRect=this._getContainerRect();let e=this._originRect,A=this._overlayRect,i=this._viewportRect,n=this._containerRect,o=[],a;for(let r of this._preferredPositions){let s=this._getOriginPoint(e,n,r),l=this._getOverlayPoint(s,A,r),g=this._getOverlayFit(l,A,i,r);if(g.isCompletelyWithinViewport){this._isPushed=!1,this._applyPosition(r,s);return}if(this._canFitWithFlexibleDimensions(g,l,i)){o.push({position:r,origin:s,overlayRect:A,boundingBoxRect:this._calculateBoundingBoxRect(s,r)});continue}(!a||a.overlayFit.visibleAreas&&(s=g,r=l)}this._isPushed=!1,this._applyPosition(r.position,r.origin);return}if(this._canPush){this._isPushed=!0,this._applyPosition(a.position,a.originPoint);return}this._applyPosition(a.position,a.originPoint)}detach(){this._clearPanelClasses(),this._lastPosition=null,this._previousPushAmount=null,this._resizeSubscription.unsubscribe()}dispose(){this._isDisposed||(this._boundingBox&&D1(this._boundingBox.style,{top:"",left:"",right:"",bottom:"",height:"",width:"",alignItems:"",justifyContent:""}),this._pane&&this._resetOverlayElementStyles(),this._overlayRef&&this._overlayRef.hostElement.classList.remove(pT),this.detach(),this._positionChanges.complete(),this._overlayRef=this._boundingBox=null,this._isDisposed=!0)}reapplyLastPosition(){if(this._isDisposed||!this._platform.isBrowser)return;let e=this._lastPosition;e?(this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._viewportRect=this._getNarrowedViewportRect(),this._containerRect=this._getContainerRect(),this._applyPosition(e,this._getOriginPoint(this._originRect,this._containerRect,e))):this.apply()}withScrollableContainers(e){return this._scrollables=e,this}withPositions(e){return this._preferredPositions=e,e.indexOf(this._lastPosition)===-1&&(this._lastPosition=null),this._validatePositions(),this}withViewportMargin(e){return this._viewportMargin=e,this}withFlexibleDimensions(e=!0){return this._hasFlexibleDimensions=e,this}withGrowAfterOpen(e=!0){return this._growAfterOpen=e,this}withPush(e=!0){return this._canPush=e,this}withLockedPosition(e=!0){return this._positionLocked=e,this}setOrigin(e){return this._origin=e,this}withDefaultOffsetX(e){return this._offsetX=e,this}withDefaultOffsetY(e){return this._offsetY=e,this}withTransformOriginOn(e){return this._transformOriginSelector=e,this}withPopoverLocation(e){return this._popoverLocation=e,this}getPopoverInsertionPoint(){return this._popoverLocation==="global"?null:this._popoverLocation!=="inline"?this._popoverLocation:this._origin instanceof ce?this._origin.nativeElement:IM(this._origin)?this._origin:null}_getOriginPoint(e,A,i){let n;if(i.originX=="center")n=e.left+e.width/2;else{let a=this._isRtl()?e.right:e.left,r=this._isRtl()?e.left:e.right;n=i.originX=="start"?a:r}A.left<0&&(n-=A.left);let o;return i.originY=="center"?o=e.top+e.height/2:o=i.originY=="top"?e.top:e.bottom,A.top<0&&(o-=A.top),{x:n,y:o}}_getOverlayPoint(e,A,i){let n;i.overlayX=="center"?n=-A.width/2:i.overlayX==="start"?n=this._isRtl()?-A.width:0:n=this._isRtl()?0:-A.width;let o;return i.overlayY=="center"?o=-A.height/2:o=i.overlayY=="top"?0:-A.height,{x:e.x+n,y:e.y+o}}_getOverlayFit(e,A,i,n){let o=wT(A),{x:a,y:r}=e,s=this._getOffset(n,"x"),l=this._getOffset(n,"y");s&&(a+=s),l&&(r+=l);let g=0-a,C=a+o.width-i.width,I=0-r,d=r+o.height-i.height,h=this._subtractOverflows(o.width,g,C),E=this._subtractOverflows(o.height,I,d),f=h*E;return{visibleArea:f,isCompletelyWithinViewport:o.width*o.height===f,fitsInViewportVertically:E===o.height,fitsInViewportHorizontally:h==o.width}}_canFitWithFlexibleDimensions(e,A,i){if(this._hasFlexibleDimensions){let n=i.bottom-A.y,o=i.right-A.x,a=mT(this._overlayRef.getConfig().minHeight),r=mT(this._overlayRef.getConfig().minWidth),s=e.fitsInViewportVertically||a!=null&&a<=n,l=e.fitsInViewportHorizontally||r!=null&&r<=o;return s&&l}return!1}_pushOverlayOnScreen(e,A,i){if(this._previousPushAmount&&this._positionLocked)return{x:e.x+this._previousPushAmount.x,y:e.y+this._previousPushAmount.y};let n=wT(A),o=this._viewportRect,a=Math.max(e.x+n.width-o.width,0),r=Math.max(e.y+n.height-o.height,0),s=Math.max(o.top-i.top-e.y,0),l=Math.max(o.left-i.left-e.x,0),g=0,C=0;return n.width<=o.width?g=l||-a:g=e.xh&&!this._isInitialRender&&!this._growAfterOpen&&(a=e.y-h/2)}let s=A.overlayX==="start"&&!n||A.overlayX==="end"&&n,l=A.overlayX==="end"&&!n||A.overlayX==="start"&&n,g,C,I;if(l)I=i.width-e.x+this._getViewportMarginStart()+this._getViewportMarginEnd(),g=e.x-this._getViewportMarginStart();else if(s)C=e.x,g=i.right-e.x-this._getViewportMarginEnd();else{let d=Math.min(i.right-e.x+i.left,e.x),h=this._lastBoundingBoxSize.width;g=d*2,C=e.x-d,g>h&&!this._isInitialRender&&!this._growAfterOpen&&(C=e.x-h/2)}return{top:a,left:C,bottom:r,right:I,width:g,height:o}}_setBoundingBoxStyles(e,A){let i=this._calculateBoundingBoxRect(e,A);!this._isInitialRender&&!this._growAfterOpen&&(i.height=Math.min(i.height,this._lastBoundingBoxSize.height),i.width=Math.min(i.width,this._lastBoundingBoxSize.width));let n={};if(this._hasExactPosition())n.top=n.left="0",n.bottom=n.right="auto",n.maxHeight=n.maxWidth="",n.width=n.height="100%";else{let o=this._overlayRef.getConfig().maxHeight,a=this._overlayRef.getConfig().maxWidth;n.width=Oa(i.width),n.height=Oa(i.height),n.top=Oa(i.top)||"auto",n.bottom=Oa(i.bottom)||"auto",n.left=Oa(i.left)||"auto",n.right=Oa(i.right)||"auto",A.overlayX==="center"?n.alignItems="center":n.alignItems=A.overlayX==="end"?"flex-end":"flex-start",A.overlayY==="center"?n.justifyContent="center":n.justifyContent=A.overlayY==="bottom"?"flex-end":"flex-start",o&&(n.maxHeight=Oa(o)),a&&(n.maxWidth=Oa(a))}this._lastBoundingBoxSize=i,D1(this._boundingBox.style,n)}_resetBoundingBoxStyles(){D1(this._boundingBox.style,{top:"0",left:"0",right:"0",bottom:"0",height:"",width:"",alignItems:"",justifyContent:""})}_resetOverlayElementStyles(){D1(this._pane.style,{top:"",left:"",bottom:"",right:"",position:"",transform:""})}_setOverlayElementStyles(e,A){let i={},n=this._hasExactPosition(),o=this._hasFlexibleDimensions,a=this._overlayRef.getConfig();if(n){let g=this._viewportRuler.getViewportScrollPosition();D1(i,this._getExactOverlayY(A,e,g)),D1(i,this._getExactOverlayX(A,e,g))}else i.position="static";let r="",s=this._getOffset(A,"x"),l=this._getOffset(A,"y");s&&(r+=`translateX(${s}px) `),l&&(r+=`translateY(${l}px)`),i.transform=r.trim(),a.maxHeight&&(n?i.maxHeight=Oa(a.maxHeight):o&&(i.maxHeight="")),a.maxWidth&&(n?i.maxWidth=Oa(a.maxWidth):o&&(i.maxWidth="")),D1(this._pane.style,i)}_getExactOverlayY(e,A,i){let n={top:"",bottom:""},o=this._getOverlayPoint(A,this._overlayRect,e);if(this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,i)),e.overlayY==="bottom"){let a=this._document.documentElement.clientHeight;n.bottom=`${a-(o.y+this._overlayRect.height)}px`}else n.top=Oa(o.y);return n}_getExactOverlayX(e,A,i){let n={left:"",right:""},o=this._getOverlayPoint(A,this._overlayRect,e);this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,i));let a;if(this._isRtl()?a=e.overlayX==="end"?"left":"right":a=e.overlayX==="end"?"right":"left",a==="right"){let r=this._document.documentElement.clientWidth;n.right=`${r-(o.x+this._overlayRect.width)}px`}else n.left=Oa(o.x);return n}_getScrollVisibility(){let e=this._getOriginRect(),A=this._pane.getBoundingClientRect(),i=this._scrollables.map(n=>n.getElementRef().nativeElement.getBoundingClientRect());return{isOriginClipped:uT(e,i),isOriginOutsideView:cM(e,i),isOverlayClipped:uT(A,i),isOverlayOutsideView:cM(A,i)}}_subtractOverflows(e,...A){return A.reduce((i,n)=>i-Math.max(n,0),e)}_getNarrowedViewportRect(){let e=this._document.documentElement.clientWidth,A=this._document.documentElement.clientHeight,i=this._viewportRuler.getViewportScrollPosition();return{top:i.top+this._getViewportMarginTop(),left:i.left+this._getViewportMarginStart(),right:i.left+e-this._getViewportMarginEnd(),bottom:i.top+A-this._getViewportMarginBottom(),width:e-this._getViewportMarginStart()-this._getViewportMarginEnd(),height:A-this._getViewportMarginTop()-this._getViewportMarginBottom()}}_isRtl(){return this._overlayRef.getDirection()==="rtl"}_hasExactPosition(){return!this._hasFlexibleDimensions||this._isPushed}_getOffset(e,A){return A==="x"?e.offsetX==null?this._offsetX:e.offsetX:e.offsetY==null?this._offsetY:e.offsetY}_validatePositions(){}_addPanelClasses(e){this._pane&&iB(e).forEach(A=>{A!==""&&this._appliedPanelClasses.indexOf(A)===-1&&(this._appliedPanelClasses.push(A),this._pane.classList.add(A))})}_clearPanelClasses(){this._pane&&(this._appliedPanelClasses.forEach(e=>{this._pane.classList.remove(e)}),this._appliedPanelClasses=[])}_getViewportMarginStart(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.start??0}_getViewportMarginEnd(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.end??0}_getViewportMarginTop(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.top??0}_getViewportMarginBottom(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.bottom??0}_getOriginRect(){let e=this._origin;if(e instanceof ce)return e.nativeElement.getBoundingClientRect();if(e instanceof Element)return e.getBoundingClientRect();let A=e.width||0,i=e.height||0;return{top:e.y,bottom:e.y+i,left:e.x,right:e.x+A,height:i,width:A}}_getContainerRect(){let e=this._overlayRef.getConfig().usePopover&&this._popoverLocation!=="global",A=this._overlayContainer.getContainerElement();e&&(A.style.display="block");let i=A.getBoundingClientRect();return e&&(A.style.display=""),i}};function D1(t,e){for(let A in e)e.hasOwnProperty(A)&&(t[A]=e[A]);return t}function mT(t){if(typeof t!="number"&&t!=null){let[e,A]=t.split(vlA);return!A||A==="px"?parseFloat(e):null}return t||null}function wT(t){return{top:Math.floor(t.top),right:Math.floor(t.right),bottom:Math.floor(t.bottom),left:Math.floor(t.left),width:Math.floor(t.width),height:Math.floor(t.height)}}function blA(t,e){return t===e?!0:t.isOriginClipped===e.isOriginClipped&&t.isOriginOutsideView===e.isOriginOutsideView&&t.isOverlayClipped===e.isOverlayClipped&&t.isOverlayOutsideView===e.isOverlayOutsideView}var DT="cdk-global-overlay-wrapper";function I2(t){return new Pm}var Pm=class{_overlayRef;_cssPosition="static";_topOffset="";_bottomOffset="";_alignItems="";_xPosition="";_xOffset="";_width="";_height="";_isDisposed=!1;attach(e){let A=e.getConfig();this._overlayRef=e,this._width&&!A.width&&e.updateSize({width:this._width}),this._height&&!A.height&&e.updateSize({height:this._height}),e.hostElement.classList.add(DT),this._isDisposed=!1}top(e=""){return this._bottomOffset="",this._topOffset=e,this._alignItems="flex-start",this}left(e=""){return this._xOffset=e,this._xPosition="left",this}bottom(e=""){return this._topOffset="",this._bottomOffset=e,this._alignItems="flex-end",this}right(e=""){return this._xOffset=e,this._xPosition="right",this}start(e=""){return this._xOffset=e,this._xPosition="start",this}end(e=""){return this._xOffset=e,this._xPosition="end",this}width(e=""){return this._overlayRef?this._overlayRef.updateSize({width:e}):this._width=e,this}height(e=""){return this._overlayRef?this._overlayRef.updateSize({height:e}):this._height=e,this}centerHorizontally(e=""){return this.left(e),this._xPosition="center",this}centerVertically(e=""){return this.top(e),this._alignItems="center",this}apply(){if(!this._overlayRef||!this._overlayRef.hasAttached())return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement.style,i=this._overlayRef.getConfig(),{width:n,height:o,maxWidth:a,maxHeight:r}=i,s=(n==="100%"||n==="100vw")&&(!a||a==="100%"||a==="100vw"),l=(o==="100%"||o==="100vh")&&(!r||r==="100%"||r==="100vh"),g=this._xPosition,C=this._xOffset,I=this._overlayRef.getConfig().direction==="rtl",d="",h="",E="";s?E="flex-start":g==="center"?(E="center",I?h=C:d=C):I?g==="left"||g==="end"?(E="flex-end",d=C):(g==="right"||g==="start")&&(E="flex-start",h=C):g==="left"||g==="start"?(E="flex-start",d=C):(g==="right"||g==="end")&&(E="flex-end",h=C),e.position=this._cssPosition,e.marginLeft=s?"0":d,e.marginTop=l?"0":this._topOffset,e.marginBottom=this._bottomOffset,e.marginRight=s?"0":h,A.justifyContent=E,A.alignItems=l?"flex-start":this._alignItems}dispose(){if(this._isDisposed||!this._overlayRef)return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement,i=A.style;A.classList.remove(DT),i.justifyContent=i.alignItems=e.marginTop=e.marginBottom=e.marginLeft=e.marginRight=e.position="",this._overlayRef=null,this._isDisposed=!0}},qm=(()=>{class t{_injector=w(Dt);constructor(){}global(){return I2()}flexibleConnectedTo(A){return y1(this._injector,A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Gu=new kA("OVERLAY_DEFAULT_CONFIG");function Yg(t,e){t.get(eo).load(kT);let A=t.get(jm),i=t.get(ti),n=t.get(In),o=t.get(K0),a=t.get(fo),r=t.get(Pi,null,{optional:!0})||t.get(Kr).createRenderer(null,null),s=new Jg(e),l=t.get(Gu,null,{optional:!0})?.usePopover??!0;s.direction=s.direction||a.value,"showPopover"in i.body?s.usePopover=e?.usePopover??l:s.usePopover=!1;let g=i.createElement("div"),C=i.createElement("div");g.id=n.getId("cdk-overlay-"),g.classList.add("cdk-overlay-pane"),C.appendChild(g),s.usePopover&&(C.setAttribute("popover","manual"),C.classList.add("cdk-overlay-popover"));let I=s.usePopover?s.positionStrategy?.getPopoverInsertionPoint?.():null;return IM(I)?I.after(C):I?.type==="parent"?I.element.appendChild(C):A.getContainerElement().appendChild(C),new _B(new Fu(g,o,t),C,g,s,t.get(qe),t.get(MT),i,t.get(Uc),t.get(ST),e?.disableAnimations??t.get(qI,null,{optional:!0})==="NoopAnimations",t.get(Gr),r)}var v1=(()=>{class t{scrollStrategies=w(vT);_positionBuilder=w(qm);_injector=w(Dt);constructor(){}create(A){return Yg(this._injector,A)}position(){return this._positionBuilder}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),MlA=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],SlA=new kA("cdk-connected-overlay-scroll-strategy",{providedIn:"root",factory:()=>{let t=w(Dt);return()=>Z0(t)}}),RB=(()=>{class t{elementRef=w(ce);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdk-overlay-origin",""],["","overlay-origin",""],["","cdkOverlayOrigin",""]],exportAs:["cdkOverlayOrigin"]})}return t})(),xT=new kA("cdk-connected-overlay-default-config"),Vm=(()=>{class t{_dir=w(fo,{optional:!0});_injector=w(Dt);_overlayRef;_templatePortal;_backdropSubscription=bo.EMPTY;_attachSubscription=bo.EMPTY;_detachSubscription=bo.EMPTY;_positionSubscription=bo.EMPTY;_offsetX;_offsetY;_position;_scrollStrategyFactory=w(SlA);_ngZone=w(qe);origin;positions;positionStrategy;get offsetX(){return this._offsetX}set offsetX(A){this._offsetX=A,this._position&&this._updatePositionStrategy(this._position)}get offsetY(){return this._offsetY}set offsetY(A){this._offsetY=A,this._position&&this._updatePositionStrategy(this._position)}width;height;minWidth;minHeight;backdropClass;panelClass;viewportMargin=0;scrollStrategy;open=!1;disableClose=!1;transformOriginSelector;hasBackdrop=!1;lockPosition=!1;flexibleDimensions=!1;growAfterOpen=!1;push=!1;disposeOnNavigation=!1;usePopover;matchWidth=!1;set _config(A){typeof A!="string"&&this._assignConfig(A)}backdropClick=new LA;positionChange=new LA;attach=new LA;detach=new LA;overlayKeydown=new LA;overlayOutsideClick=new LA;constructor(){let A=w(ao),i=w(Mo),n=w(xT,{optional:!0}),o=w(Gu,{optional:!0});this.usePopover=o?.usePopover===!1?null:"global",this._templatePortal=new Jr(A,i),this.scrollStrategy=this._scrollStrategyFactory(),n&&this._assignConfig(n)}get overlayRef(){return this._overlayRef}get dir(){return this._dir?this._dir.value:"ltr"}ngOnDestroy(){this._attachSubscription.unsubscribe(),this._detachSubscription.unsubscribe(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._overlayRef?.dispose()}ngOnChanges(A){this._position&&(this._updatePositionStrategy(this._position),this._overlayRef?.updateSize({width:this._getWidth(),minWidth:this.minWidth,height:this.height,minHeight:this.minHeight}),A.origin&&this.open&&this._position.apply()),A.open&&(this.open?this.attachOverlay():this.detachOverlay())}_createOverlay(){(!this.positions||!this.positions.length)&&(this.positions=MlA);let A=this._overlayRef=Yg(this._injector,this._buildConfig());this._attachSubscription=A.attachments().subscribe(()=>this.attach.emit()),this._detachSubscription=A.detachments().subscribe(()=>this.detach.emit()),A.keydownEvents().subscribe(i=>{this.overlayKeydown.next(i),i.keyCode===27&&!this.disableClose&&!Qa(i)&&(i.preventDefault(),this.detachOverlay())}),this._overlayRef.outsidePointerEvents().subscribe(i=>{let n=this._getOriginElement(),o=Ur(i);(!n||n!==o&&!n.contains(o))&&this.overlayOutsideClick.next(i)})}_buildConfig(){let A=this._position=this.positionStrategy||this._createPositionStrategy(),i=new Jg({direction:this._dir||"ltr",positionStrategy:A,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop,disposeOnNavigation:this.disposeOnNavigation,usePopover:!!this.usePopover});return(this.height||this.height===0)&&(i.height=this.height),(this.minWidth||this.minWidth===0)&&(i.minWidth=this.minWidth),(this.minHeight||this.minHeight===0)&&(i.minHeight=this.minHeight),this.backdropClass&&(i.backdropClass=this.backdropClass),this.panelClass&&(i.panelClass=this.panelClass),i}_updatePositionStrategy(A){let i=this.positions.map(n=>({originX:n.originX,originY:n.originY,overlayX:n.overlayX,overlayY:n.overlayY,offsetX:n.offsetX||this.offsetX,offsetY:n.offsetY||this.offsetY,panelClass:n.panelClass||void 0}));return A.setOrigin(this._getOrigin()).withPositions(i).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector).withPopoverLocation(this.usePopover===null?"global":this.usePopover)}_createPositionStrategy(){let A=y1(this._injector,this._getOrigin());return this._updatePositionStrategy(A),A}_getOrigin(){return this.origin instanceof RB?this.origin.elementRef:this.origin}_getOriginElement(){return this.origin instanceof RB?this.origin.elementRef.nativeElement:this.origin instanceof ce?this.origin.nativeElement:typeof Element<"u"&&this.origin instanceof Element?this.origin:null}_getWidth(){return this.width?this.width:this.matchWidth?this._getOriginElement()?.getBoundingClientRect?.().width:void 0}attachOverlay(){this._overlayRef||this._createOverlay();let A=this._overlayRef;A.getConfig().hasBackdrop=this.hasBackdrop,A.updateSize({width:this._getWidth()}),A.hasAttached()||A.attach(this._templatePortal),this.hasBackdrop?this._backdropSubscription=A.backdropClick().subscribe(i=>this.backdropClick.emit(i)):this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.positionChange.observers.length>0&&(this._positionSubscription=this._position.positionChanges.pipe(NF(()=>this.positionChange.observers.length>0)).subscribe(i=>{this._ngZone.run(()=>this.positionChange.emit(i)),this.positionChange.observers.length===0&&this._positionSubscription.unsubscribe()})),this.open=!0}detachOverlay(){this._overlayRef?.detach(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.open=!1}_assignConfig(A){this.origin=A.origin??this.origin,this.positions=A.positions??this.positions,this.positionStrategy=A.positionStrategy??this.positionStrategy,this.offsetX=A.offsetX??this.offsetX,this.offsetY=A.offsetY??this.offsetY,this.width=A.width??this.width,this.height=A.height??this.height,this.minWidth=A.minWidth??this.minWidth,this.minHeight=A.minHeight??this.minHeight,this.backdropClass=A.backdropClass??this.backdropClass,this.panelClass=A.panelClass??this.panelClass,this.viewportMargin=A.viewportMargin??this.viewportMargin,this.scrollStrategy=A.scrollStrategy??this.scrollStrategy,this.disableClose=A.disableClose??this.disableClose,this.transformOriginSelector=A.transformOriginSelector??this.transformOriginSelector,this.hasBackdrop=A.hasBackdrop??this.hasBackdrop,this.lockPosition=A.lockPosition??this.lockPosition,this.flexibleDimensions=A.flexibleDimensions??this.flexibleDimensions,this.growAfterOpen=A.growAfterOpen??this.growAfterOpen,this.push=A.push??this.push,this.disposeOnNavigation=A.disposeOnNavigation??this.disposeOnNavigation,this.usePopover=A.usePopover??this.usePopover,this.matchWidth=A.matchWidth??this.matchWidth}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdk-connected-overlay",""],["","connected-overlay",""],["","cdkConnectedOverlay",""]],inputs:{origin:[0,"cdkConnectedOverlayOrigin","origin"],positions:[0,"cdkConnectedOverlayPositions","positions"],positionStrategy:[0,"cdkConnectedOverlayPositionStrategy","positionStrategy"],offsetX:[0,"cdkConnectedOverlayOffsetX","offsetX"],offsetY:[0,"cdkConnectedOverlayOffsetY","offsetY"],width:[0,"cdkConnectedOverlayWidth","width"],height:[0,"cdkConnectedOverlayHeight","height"],minWidth:[0,"cdkConnectedOverlayMinWidth","minWidth"],minHeight:[0,"cdkConnectedOverlayMinHeight","minHeight"],backdropClass:[0,"cdkConnectedOverlayBackdropClass","backdropClass"],panelClass:[0,"cdkConnectedOverlayPanelClass","panelClass"],viewportMargin:[0,"cdkConnectedOverlayViewportMargin","viewportMargin"],scrollStrategy:[0,"cdkConnectedOverlayScrollStrategy","scrollStrategy"],open:[0,"cdkConnectedOverlayOpen","open"],disableClose:[0,"cdkConnectedOverlayDisableClose","disableClose"],transformOriginSelector:[0,"cdkConnectedOverlayTransformOriginOn","transformOriginSelector"],hasBackdrop:[2,"cdkConnectedOverlayHasBackdrop","hasBackdrop",Be],lockPosition:[2,"cdkConnectedOverlayLockPosition","lockPosition",Be],flexibleDimensions:[2,"cdkConnectedOverlayFlexibleDimensions","flexibleDimensions",Be],growAfterOpen:[2,"cdkConnectedOverlayGrowAfterOpen","growAfterOpen",Be],push:[2,"cdkConnectedOverlayPush","push",Be],disposeOnNavigation:[2,"cdkConnectedOverlayDisposeOnNavigation","disposeOnNavigation",Be],usePopover:[0,"cdkConnectedOverlayUsePopover","usePopover"],matchWidth:[2,"cdkConnectedOverlayMatchWidth","matchWidth",Be],_config:[0,"cdkConnectedOverlay","_config"]},outputs:{backdropClick:"backdropClick",positionChange:"positionChange",attach:"attach",detach:"detach",overlayKeydown:"overlayKeydown",overlayOutsideClick:"overlayOutsideClick"},exportAs:["cdkConnectedOverlay"],features:[Yt]})}return t})(),Zl=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({providers:[v1],imports:[fi,Zc,Tm,Tm]})}return t})();function klA(t,e){}var d2=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;closePredicate;width="";height="";minWidth;minHeight;maxWidth;maxHeight;positionStrategy;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;scrollStrategy;closeOnNavigation=!0;closeOnDestroy=!0;closeOnOverlayDetachments=!0;disableAnimations=!1;providers;container;templateContext};var BM=(()=>{class t extends C2{_elementRef=w(ce);_focusTrapFactory=w(qQ);_config;_interactivityChecker=w(oB);_ngZone=w(qe);_focusMonitor=w($a);_renderer=w(Pi);_changeDetectorRef=w(wt);_injector=w(Dt);_platform=w(gi);_document=w(ti);_portalOutlet;_focusTrapped=new ie;_focusTrap=null;_elementFocusedBeforeDialogWasOpened=null;_closeInteractionType=null;_ariaLabelledByQueue=[];_isDestroyed=!1;constructor(){super(),this._config=w(d2,{optional:!0})||new d2,this._config.ariaLabelledBy&&this._ariaLabelledByQueue.push(this._config.ariaLabelledBy)}_addAriaLabelledBy(A){this._ariaLabelledByQueue.push(A),this._changeDetectorRef.markForCheck()}_removeAriaLabelledBy(A){let i=this._ariaLabelledByQueue.indexOf(A);i>-1&&(this._ariaLabelledByQueue.splice(i,1),this._changeDetectorRef.markForCheck())}_contentAttached(){this._initializeFocusTrap(),this._captureInitialFocus()}_captureInitialFocus(){this._trapFocus()}ngOnDestroy(){this._focusTrapped.complete(),this._isDestroyed=!0,this._restoreFocus()}attachComponentPortal(A){this._portalOutlet.hasAttached();let i=this._portalOutlet.attachComponentPortal(A);return this._contentAttached(),i}attachTemplatePortal(A){this._portalOutlet.hasAttached();let i=this._portalOutlet.attachTemplatePortal(A);return this._contentAttached(),i}attachDomPortal=A=>{this._portalOutlet.hasAttached();let i=this._portalOutlet.attachDomPortal(A);return this._contentAttached(),i};_recaptureFocus(){this._containsFocus()||this._trapFocus()}_forceFocus(A,i){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),a(),A.removeAttribute("tabindex")},o=this._renderer.listen(A,"blur",n),a=this._renderer.listen(A,"mousedown",n)})),A.focus(i)}_focusByCssSelector(A,i){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,i)}_trapFocus(A){this._isDestroyed||Hn(()=>{let i=this._elementRef.nativeElement;switch(this._config.autoFocus){case!1:case"dialog":this._containsFocus()||i.focus(A);break;case!0:case"first-tabbable":this._focusTrap?.focusInitialElement(A)||this._focusDialogContainer(A);break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]',A);break;default:this._focusByCssSelector(this._config.autoFocus,A);break}this._focusTrapped.next()},{injector:this._injector})}_restoreFocus(){let A=this._config.restoreFocus,i=null;if(typeof A=="string"?i=this._document.querySelector(A):typeof A=="boolean"?i=A?this._elementFocusedBeforeDialogWasOpened:null:A&&(i=A),this._config.restoreFocus&&i&&typeof i.focus=="function"){let n=HQ(),o=this._elementRef.nativeElement;(!n||n===this._document.body||n===o||o.contains(n))&&(this._focusMonitor?(this._focusMonitor.focusVia(i,this._closeInteractionType),this._closeInteractionType=null):i.focus())}this._focusTrap&&this._focusTrap.destroy()}_focusDialogContainer(A){this._elementRef.nativeElement.focus?.(A)}_containsFocus(){let A=this._elementRef.nativeElement,i=HQ();return A===i||A.contains(i)}_initializeFocusTrap(){this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._document&&(this._elementFocusedBeforeDialogWasOpened=HQ()))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["cdk-dialog-container"]],viewQuery:function(i,n){if(i&1&&Jt(Wl,7),i&2){let o;ae(o=re())&&(n._portalOutlet=o.first)}},hostAttrs:["tabindex","-1",1,"cdk-dialog-container"],hostVars:6,hostBindings:function(i,n){i&2&&te("id",n._config.id||null)("role",n._config.role)("aria-modal",n._config.ariaModal)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null)},features:[mt],decls:1,vars:0,consts:[["cdkPortalOutlet",""]],template:function(i,n){i&1&&Et(0,klA,0,0,"ng-template",0)},dependencies:[Wl],styles:[`.cdk-dialog-container{display:block;width:100%;height:100%;min-height:inherit;max-height:inherit} +`],encapsulation:2})}return t})(),Ku=class{overlayRef;config;componentInstance=null;componentRef=null;containerInstance;disableClose;closed=new ie;backdropClick;keydownEvents;outsidePointerEvents;id;_detachSubscription;constructor(e,A){this.overlayRef=e,this.config=A,this.disableClose=A.disableClose,this.backdropClick=e.backdropClick(),this.keydownEvents=e.keydownEvents(),this.outsidePointerEvents=e.outsidePointerEvents(),this.id=A.id,this.keydownEvents.subscribe(i=>{i.keyCode===27&&!this.disableClose&&!Qa(i)&&(i.preventDefault(),this.close(void 0,{focusOrigin:"keyboard"}))}),this.backdropClick.subscribe(()=>{!this.disableClose&&this._canClose()?this.close(void 0,{focusOrigin:"mouse"}):this.containerInstance._recaptureFocus?.()}),this._detachSubscription=e.detachments().subscribe(()=>{A.closeOnOverlayDetachments!==!1&&this.close()})}close(e,A){if(this._canClose(e)){let i=this.closed;this.containerInstance._closeInteractionType=A?.focusOrigin||"program",this._detachSubscription.unsubscribe(),this.overlayRef.dispose(),i.next(e),i.complete(),this.componentInstance=this.containerInstance=null}}updatePosition(){return this.overlayRef.updatePosition(),this}updateSize(e="",A=""){return this.overlayRef.updateSize({width:e,height:A}),this}addPanelClass(e){return this.overlayRef.addPanelClass(e),this}removePanelClass(e){return this.overlayRef.removePanelClass(e),this}_canClose(e){let A=this.config;return!!this.containerInstance&&(!A.closePredicate||A.closePredicate(e,A,this.componentInstance))}},xlA=new kA("DialogScrollStrategy",{providedIn:"root",factory:()=>{let t=w(Dt);return()=>NB(t)}}),_lA=new kA("DialogData"),RlA=new kA("DefaultDialogConfig");function NlA(t){let e=bA(t),A=new LA;return{valueSignal:e,get value(){return e()},change:A,ngOnDestroy(){A.complete()}}}var EM=(()=>{class t{_injector=w(Dt);_defaultOptions=w(RlA,{optional:!0});_parentDialog=w(t,{optional:!0,skipSelf:!0});_overlayContainer=w(jm);_idGenerator=w(In);_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new ie;_afterOpenedAtThisLevel=new ie;_ariaHiddenElements=new Map;_scrollStrategy=w(xlA);get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}afterAllClosed=Fc(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(Sn(void 0)));constructor(){}open(A,i){let n=this._defaultOptions||new d2;i=gA(gA({},n),i),i.id=i.id||this._idGenerator.getId("cdk-dialog-"),i.id&&this.getDialogById(i.id);let o=this._getOverlayConfig(i),a=Yg(this._injector,o),r=new Ku(a,i),s=this._attachContainer(a,r,i);if(r.containerInstance=s,!this.openDialogs.length){let l=this._overlayContainer.getContainerElement();s._focusTrapped?s._focusTrapped.pipe(uo(1)).subscribe(()=>{this._hideNonDialogContentFromAssistiveTechnology(l)}):this._hideNonDialogContentFromAssistiveTechnology(l)}return this._attachDialogContent(A,r,s,i),this.openDialogs.push(r),r.closed.subscribe(()=>this._removeOpenDialog(r,!0)),this.afterOpened.next(r),r}closeAll(){dM(this.openDialogs,A=>A.close())}getDialogById(A){return this.openDialogs.find(i=>i.id===A)}ngOnDestroy(){dM(this._openDialogsAtThisLevel,A=>{A.config.closeOnDestroy===!1&&this._removeOpenDialog(A,!1)}),dM(this._openDialogsAtThisLevel,A=>A.close()),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete(),this._openDialogsAtThisLevel=[]}_getOverlayConfig(A){let i=new Jg({positionStrategy:A.positionStrategy||I2().centerHorizontally().centerVertically(),scrollStrategy:A.scrollStrategy||this._scrollStrategy(),panelClass:A.panelClass,hasBackdrop:A.hasBackdrop,direction:A.direction,minWidth:A.minWidth,minHeight:A.minHeight,maxWidth:A.maxWidth,maxHeight:A.maxHeight,width:A.width,height:A.height,disposeOnNavigation:A.closeOnNavigation,disableAnimations:A.disableAnimations});return A.backdropClass&&(i.backdropClass=A.backdropClass),i}_attachContainer(A,i,n){let o=n.injector||n.viewContainerRef?.injector,a=[{provide:d2,useValue:n},{provide:Ku,useValue:i},{provide:_B,useValue:A}],r;n.container?typeof n.container=="function"?r=n.container:(r=n.container.type,a.push(...n.container.providers(n))):r=BM;let s=new Ss(r,n.viewContainerRef,Dt.create({parent:o||this._injector,providers:a}));return A.attach(s).instance}_attachDialogContent(A,i,n,o){if(A instanceof ao){let a=this._createInjector(o,i,n,void 0),r={$implicit:o.data,dialogRef:i};o.templateContext&&(r=gA(gA({},r),typeof o.templateContext=="function"?o.templateContext():o.templateContext)),n.attachTemplatePortal(new Jr(A,null,r,a))}else{let a=this._createInjector(o,i,n,this._injector),r=n.attachComponentPortal(new Ss(A,o.viewContainerRef,a));i.componentRef=r,i.componentInstance=r.instance}}_createInjector(A,i,n,o){let a=A.injector||A.viewContainerRef?.injector,r=[{provide:_lA,useValue:A.data},{provide:Ku,useValue:i}];return A.providers&&(typeof A.providers=="function"?r.push(...A.providers(i,A,n)):r.push(...A.providers)),A.direction&&(!a||!a.get(fo,null,{optional:!0}))&&r.push({provide:fo,useValue:NlA(A.direction)}),Dt.create({parent:a||o,providers:r})}_removeOpenDialog(A,i){let n=this.openDialogs.indexOf(A);n>-1&&(this.openDialogs.splice(n,1),this.openDialogs.length||(this._ariaHiddenElements.forEach((o,a)=>{o?a.setAttribute("aria-hidden",o):a.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),i&&this._getAfterAllClosed().next()))}_hideNonDialogContentFromAssistiveTechnology(A){if(A.parentElement){let i=A.parentElement.children;for(let n=i.length-1;n>-1;n--){let o=i[n];o!==A&&o.nodeName!=="SCRIPT"&&o.nodeName!=="STYLE"&&!o.hasAttribute("aria-live")&&!o.hasAttribute("popover")&&(this._ariaHiddenElements.set(o,o.getAttribute("aria-hidden")),o.setAttribute("aria-hidden","true"))}}}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function dM(t,e){let A=t.length;for(;A--;)e(t[A])}var _T=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({providers:[EM],imports:[Zl,Zc,WQ,Zc]})}return t})();function FlA(t,e){}var Zm=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;closePredicate;width="";height="";minWidth;minHeight;maxWidth;maxHeight;position;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;delayFocusTrap=!0;scrollStrategy;closeOnNavigation=!0;enterAnimationDuration;exitAnimationDuration},hM="mdc-dialog--open",RT="mdc-dialog--opening",NT="mdc-dialog--closing",LlA=150,GlA=75,KlA=(()=>{class t extends BM{_animationStateChanged=new LA;_animationsEnabled=!An();_actionSectionCount=0;_hostElement=this._elementRef.nativeElement;_enterAnimationDuration=this._animationsEnabled?LT(this._config.enterAnimationDuration)??LlA:0;_exitAnimationDuration=this._animationsEnabled?LT(this._config.exitAnimationDuration)??GlA:0;_animationTimer=null;_contentAttached(){super._contentAttached(),this._startOpenAnimation()}_startOpenAnimation(){this._animationStateChanged.emit({state:"opening",totalTime:this._enterAnimationDuration}),this._animationsEnabled?(this._hostElement.style.setProperty(FT,`${this._enterAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(RT,hM)),this._waitForAnimationToComplete(this._enterAnimationDuration,this._finishDialogOpen)):(this._hostElement.classList.add(hM),Promise.resolve().then(()=>this._finishDialogOpen()))}_startExitAnimation(){this._animationStateChanged.emit({state:"closing",totalTime:this._exitAnimationDuration}),this._hostElement.classList.remove(hM),this._animationsEnabled?(this._hostElement.style.setProperty(FT,`${this._exitAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(NT)),this._waitForAnimationToComplete(this._exitAnimationDuration,this._finishDialogClose)):Promise.resolve().then(()=>this._finishDialogClose())}_updateActionSectionCount(A){this._actionSectionCount+=A,this._changeDetectorRef.markForCheck()}_finishDialogOpen=()=>{this._clearAnimationClasses(),this._openAnimationDone(this._enterAnimationDuration)};_finishDialogClose=()=>{this._clearAnimationClasses(),this._animationStateChanged.emit({state:"closed",totalTime:this._exitAnimationDuration})};_clearAnimationClasses(){this._hostElement.classList.remove(RT,NT)}_waitForAnimationToComplete(A,i){this._animationTimer!==null&&clearTimeout(this._animationTimer),this._animationTimer=setTimeout(i,A)}_requestAnimationFrame(A){this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(A):A()})}_captureInitialFocus(){this._config.delayFocusTrap||this._trapFocus()}_openAnimationDone(A){this._config.delayFocusTrap&&this._trapFocus(),this._animationStateChanged.next({state:"opened",totalTime:A})}ngOnDestroy(){super.ngOnDestroy(),this._animationTimer!==null&&clearTimeout(this._animationTimer)}attachComponentPortal(A){let i=super.attachComponentPortal(A);return i.location.nativeElement.classList.add("mat-mdc-dialog-component-host"),i}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275cmp=SA({type:t,selectors:[["mat-dialog-container"]],hostAttrs:["tabindex","-1",1,"mat-mdc-dialog-container","mdc-dialog"],hostVars:10,hostBindings:function(i,n){i&2&&(ha("id",n._config.id),te("aria-modal",n._config.ariaModal)("role",n._config.role)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null),RA("_mat-animation-noopable",!n._animationsEnabled)("mat-mdc-dialog-container-with-actions",n._actionSectionCount>0))},features:[mt],decls:3,vars:0,consts:[[1,"mat-mdc-dialog-inner-container","mdc-dialog__container"],[1,"mat-mdc-dialog-surface","mdc-dialog__surface"],["cdkPortalOutlet",""]],template:function(i,n){i&1&&(B(0,"div",0)(1,"div",1),Et(2,FlA,0,0,"ng-template",2),Q()())},dependencies:[Wl],styles:[`.mat-mdc-dialog-container{width:100%;height:100%;display:block;box-sizing:border-box;max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;outline:0}.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-max-width, 560px);min-width:var(--mat-dialog-container-min-width, 280px)}@media(max-width: 599px){.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-small-max-width, calc(100vw - 32px))}}.mat-mdc-dialog-inner-container{display:flex;flex-direction:row;align-items:center;justify-content:space-around;box-sizing:border-box;height:100%;opacity:0;transition:opacity linear var(--mat-dialog-transition-duration, 0ms);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit}.mdc-dialog--closing .mat-mdc-dialog-inner-container{transition:opacity 75ms linear;transform:none}.mdc-dialog--open .mat-mdc-dialog-inner-container{opacity:1}._mat-animation-noopable .mat-mdc-dialog-inner-container{transition:none}.mat-mdc-dialog-surface{display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;box-sizing:border-box;width:100%;height:100%;position:relative;overflow-y:auto;outline:0;transform:scale(0.8);transition:transform var(--mat-dialog-transition-duration, 0ms) cubic-bezier(0, 0, 0.2, 1);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;box-shadow:var(--mat-dialog-container-elevation-shadow, none);border-radius:var(--mat-dialog-container-shape, var(--mat-sys-corner-extra-large, 4px));background-color:var(--mat-dialog-container-color, var(--mat-sys-surface, white))}[dir=rtl] .mat-mdc-dialog-surface{text-align:right}.mdc-dialog--open .mat-mdc-dialog-surface,.mdc-dialog--closing .mat-mdc-dialog-surface{transform:none}._mat-animation-noopable .mat-mdc-dialog-surface{transition:none}.mat-mdc-dialog-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:2px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mat-mdc-dialog-title{display:block;position:relative;flex-shrink:0;box-sizing:border-box;margin:0 0 1px;padding:var(--mat-dialog-headline-padding, 6px 24px 13px)}.mat-mdc-dialog-title::before{display:inline-block;width:0;height:40px;content:"";vertical-align:0}[dir=rtl] .mat-mdc-dialog-title{text-align:right}.mat-mdc-dialog-container .mat-mdc-dialog-title{color:var(--mat-dialog-subhead-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-dialog-subhead-font, var(--mat-sys-headline-small-font, inherit));line-height:var(--mat-dialog-subhead-line-height, var(--mat-sys-headline-small-line-height, 1.5rem));font-size:var(--mat-dialog-subhead-size, var(--mat-sys-headline-small-size, 1rem));font-weight:var(--mat-dialog-subhead-weight, var(--mat-sys-headline-small-weight, 400));letter-spacing:var(--mat-dialog-subhead-tracking, var(--mat-sys-headline-small-tracking, 0.03125em))}.mat-mdc-dialog-content{display:block;flex-grow:1;box-sizing:border-box;margin:0;overflow:auto;max-height:65vh}.mat-mdc-dialog-content>:first-child{margin-top:0}.mat-mdc-dialog-content>:last-child{margin-bottom:0}.mat-mdc-dialog-container .mat-mdc-dialog-content{color:var(--mat-dialog-supporting-text-color, var(--mat-sys-on-surface-variant, rgba(0, 0, 0, 0.6)));font-family:var(--mat-dialog-supporting-text-font, var(--mat-sys-body-medium-font, inherit));line-height:var(--mat-dialog-supporting-text-line-height, var(--mat-sys-body-medium-line-height, 1.5rem));font-size:var(--mat-dialog-supporting-text-size, var(--mat-sys-body-medium-size, 1rem));font-weight:var(--mat-dialog-supporting-text-weight, var(--mat-sys-body-medium-weight, 400));letter-spacing:var(--mat-dialog-supporting-text-tracking, var(--mat-sys-body-medium-tracking, 0.03125em))}.mat-mdc-dialog-container .mat-mdc-dialog-content{padding:var(--mat-dialog-content-padding, 20px 24px)}.mat-mdc-dialog-container-with-actions .mat-mdc-dialog-content{padding:var(--mat-dialog-with-actions-content-padding, 20px 24px 0)}.mat-mdc-dialog-container .mat-mdc-dialog-title+.mat-mdc-dialog-content{padding-top:0}.mat-mdc-dialog-actions{display:flex;position:relative;flex-shrink:0;flex-wrap:wrap;align-items:center;box-sizing:border-box;min-height:52px;margin:0;border-top:1px solid rgba(0,0,0,0);padding:var(--mat-dialog-actions-padding, 16px 24px);justify-content:var(--mat-dialog-actions-alignment, flex-end)}@media(forced-colors: active){.mat-mdc-dialog-actions{border-top-color:CanvasText}}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-start,.mat-mdc-dialog-actions[align=start]{justify-content:start}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-center,.mat-mdc-dialog-actions[align=center]{justify-content:center}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-end,.mat-mdc-dialog-actions[align=end]{justify-content:flex-end}.mat-mdc-dialog-actions .mat-button-base+.mat-button-base,.mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-mdc-dialog-actions .mat-button-base+.mat-button-base,[dir=rtl] .mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}.mat-mdc-dialog-component-host{display:contents} +`],encapsulation:2})}return t})(),FT="--mat-dialog-transition-duration";function LT(t){return t==null?null:typeof t=="number"?t:t.endsWith("ms")?zs(t.substring(0,t.length-2)):t.endsWith("s")?zs(t.substring(0,t.length-1))*1e3:t==="0"?0:null}var Wm=(function(t){return t[t.OPEN=0]="OPEN",t[t.CLOSING=1]="CLOSING",t[t.CLOSED=2]="CLOSED",t})(Wm||{}),lo=class{_ref;_config;_containerInstance;componentInstance;componentRef=null;disableClose;id;_afterOpened=new Sg(1);_beforeClosed=new Sg(1);_result;_closeFallbackTimeout;_state=Wm.OPEN;_closeInteractionType;constructor(e,A,i){this._ref=e,this._config=A,this._containerInstance=i,this.disableClose=A.disableClose,this.id=e.id,e.addPanelClass("mat-mdc-dialog-panel"),i._animationStateChanged.pipe(gt(n=>n.state==="opened"),uo(1)).subscribe(()=>{this._afterOpened.next(),this._afterOpened.complete()}),i._animationStateChanged.pipe(gt(n=>n.state==="closed"),uo(1)).subscribe(()=>{clearTimeout(this._closeFallbackTimeout),this._finishDialogClose()}),e.overlayRef.detachments().subscribe(()=>{this._beforeClosed.next(this._result),this._beforeClosed.complete(),this._finishDialogClose()}),Ki(this.backdropClick(),this.keydownEvents().pipe(gt(n=>n.keyCode===27&&!this.disableClose&&!Qa(n)))).subscribe(n=>{this.disableClose||(n.preventDefault(),GT(this,n.type==="keydown"?"keyboard":"mouse"))})}close(e){let A=this._config.closePredicate;A&&!A(e,this._config,this.componentInstance)||(this._result=e,this._containerInstance._animationStateChanged.pipe(gt(i=>i.state==="closing"),uo(1)).subscribe(i=>{this._beforeClosed.next(e),this._beforeClosed.complete(),this._ref.overlayRef.detachBackdrop(),this._closeFallbackTimeout=setTimeout(()=>this._finishDialogClose(),i.totalTime+100)}),this._state=Wm.CLOSING,this._containerInstance._startExitAnimation())}afterOpened(){return this._afterOpened}afterClosed(){return this._ref.closed}beforeClosed(){return this._beforeClosed}backdropClick(){return this._ref.backdropClick}keydownEvents(){return this._ref.keydownEvents}updatePosition(e){let A=this._ref.config.positionStrategy;return e&&(e.left||e.right)?e.left?A.left(e.left):A.right(e.right):A.centerHorizontally(),e&&(e.top||e.bottom)?e.top?A.top(e.top):A.bottom(e.bottom):A.centerVertically(),this._ref.updatePosition(),this}updateSize(e="",A=""){return this._ref.updateSize(e,A),this}addPanelClass(e){return this._ref.addPanelClass(e),this}removePanelClass(e){return this._ref.removePanelClass(e),this}getState(){return this._state}_finishDialogClose(){this._state=Wm.CLOSED,this._ref.close(this._result,{focusOrigin:this._closeInteractionType}),this.componentInstance=null}};function GT(t,e,A){return t._closeInteractionType=e,t.close(A)}var qo=new kA("MatMdcDialogData"),UlA=new kA("mat-mdc-dialog-default-options"),TlA=new kA("mat-mdc-dialog-scroll-strategy",{providedIn:"root",factory:()=>{let t=w(Dt);return()=>NB(t)}}),Or=(()=>{class t{_defaultOptions=w(UlA,{optional:!0});_scrollStrategy=w(TlA);_parentDialog=w(t,{optional:!0,skipSelf:!0});_idGenerator=w(In);_injector=w(Dt);_dialog=w(EM);_animationsDisabled=An();_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new ie;_afterOpenedAtThisLevel=new ie;dialogConfigClass=Zm;_dialogRefConstructor;_dialogContainerType;_dialogDataToken;get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}afterAllClosed=Fc(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(Sn(void 0)));constructor(){this._dialogRefConstructor=lo,this._dialogContainerType=KlA,this._dialogDataToken=qo}open(A,i){let n;i=gA(gA({},this._defaultOptions||new Zm),i),i.id=i.id||this._idGenerator.getId("mat-mdc-dialog-"),i.scrollStrategy=i.scrollStrategy||this._scrollStrategy();let o=this._dialog.open(A,Ye(gA({},i),{positionStrategy:I2(this._injector).centerHorizontally().centerVertically(),disableClose:!0,closePredicate:void 0,closeOnDestroy:!1,closeOnOverlayDetachments:!1,disableAnimations:this._animationsDisabled||i.enterAnimationDuration?.toLocaleString()==="0"||i.exitAnimationDuration?.toString()==="0",container:{type:this._dialogContainerType,providers:()=>[{provide:this.dialogConfigClass,useValue:i},{provide:d2,useValue:i}]},templateContext:()=>({dialogRef:n}),providers:(a,r,s)=>(n=new this._dialogRefConstructor(a,i,s),n.updatePosition(i?.position),[{provide:this._dialogContainerType,useValue:s},{provide:this._dialogDataToken,useValue:r.data},{provide:this._dialogRefConstructor,useValue:n}])}));return n.componentRef=o.componentRef,n.componentInstance=o.componentInstance,this.openDialogs.push(n),this.afterOpened.next(n),n.afterClosed().subscribe(()=>{let a=this.openDialogs.indexOf(n);a>-1&&(this.openDialogs.splice(a,1),this.openDialogs.length||this._getAfterAllClosed().next())}),n}closeAll(){this._closeDialogs(this.openDialogs)}getDialogById(A){return this.openDialogs.find(i=>i.id===A)}ngOnDestroy(){this._closeDialogs(this._openDialogsAtThisLevel),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete()}_closeDialogs(A){let i=A.length;for(;i--;)A[i].close()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),B2=(()=>{class t{dialogRef=w(lo,{optional:!0});_elementRef=w(ce);_dialog=w(Or);ariaLabel;type="button";dialogResult;_matDialogClose;constructor(){}ngOnInit(){this.dialogRef||(this.dialogRef=UT(this._elementRef,this._dialog.openDialogs))}ngOnChanges(A){let i=A._matDialogClose||A._matDialogCloseResult;i&&(this.dialogResult=i.currentValue)}_onButtonClick(A){GT(this.dialogRef,A.screenX===0&&A.screenY===0?"keyboard":"mouse",this.dialogResult)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","mat-dialog-close",""],["","matDialogClose",""]],hostVars:2,hostBindings:function(i,n){i&1&&U("click",function(a){return n._onButtonClick(a)}),i&2&&te("aria-label",n.ariaLabel||null)("type",n.type)},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],type:"type",dialogResult:[0,"mat-dialog-close","dialogResult"],_matDialogClose:[0,"matDialogClose","_matDialogClose"]},exportAs:["matDialogClose"],features:[Yt]})}return t})(),KT=(()=>{class t{_dialogRef=w(lo,{optional:!0});_elementRef=w(ce);_dialog=w(Or);constructor(){}ngOnInit(){this._dialogRef||(this._dialogRef=UT(this._elementRef,this._dialog.openDialogs)),this._dialogRef&&Promise.resolve().then(()=>{this._onAdd()})}ngOnDestroy(){this._dialogRef?._containerInstance&&Promise.resolve().then(()=>{this._onRemove()})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t})}return t})(),fa=(()=>{class t extends KT{id=w(In).getId("mat-mdc-dialog-title-");_onAdd(){this._dialogRef._containerInstance?._addAriaLabelledBy?.(this.id)}_onRemove(){this._dialogRef?._containerInstance?._removeAriaLabelledBy?.(this.id)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","mat-dialog-title",""],["","matDialogTitle",""]],hostAttrs:[1,"mat-mdc-dialog-title","mdc-dialog__title"],hostVars:1,hostBindings:function(i,n){i&2&&ha("id",n.id)},inputs:{id:"id"},exportAs:["matDialogTitle"],features:[mt]})}return t})(),Na=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","mat-dialog-content",""],["mat-dialog-content"],["","matDialogContent",""]],hostAttrs:[1,"mat-mdc-dialog-content","mdc-dialog__content"],features:[Z3([W0])]})}return t})(),pa=(()=>{class t extends KT{align;_onAdd(){this._dialogRef._containerInstance?._updateActionSectionCount?.(1)}_onRemove(){this._dialogRef._containerInstance?._updateActionSectionCount?.(-1)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","mat-dialog-actions",""],["mat-dialog-actions"],["","matDialogActions",""]],hostAttrs:[1,"mat-mdc-dialog-actions","mdc-dialog__actions"],hostVars:6,hostBindings:function(i,n){i&2&&RA("mat-mdc-dialog-actions-align-start",n.align==="start")("mat-mdc-dialog-actions-align-center",n.align==="center")("mat-mdc-dialog-actions-align-end",n.align==="end")},inputs:{align:"align"},features:[mt]})}return t})();function UT(t,e){let A=t.nativeElement.parentElement;for(;A&&!A.classList.contains("mat-mdc-dialog-container");)A=A.parentElement;return A?e.find(i=>i.id===A.id):null}var Xc=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({providers:[Or],imports:[_T,Zl,Zc,fi]})}return t})();function TT(t){return Error(`Unable to find icon with the name "${t}"`)}function JlA(){return Error("Could not find HttpClient for use with Angular Material icons. Please add provideHttpClient() to your providers.")}function JT(t){return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was "${t}".`)}function OT(t){return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by Angular's DomSanitizer. Attempted literal was "${t}".`)}var X0=class{url;svgText;options;svgElement=null;constructor(e,A,i){this.url=e,this.svgText=A,this.options=i}},HT=(()=>{class t{_httpClient;_sanitizer;_errorHandler;_document;_svgIconConfigs=new Map;_iconSetConfigs=new Map;_cachedIconsByUrl=new Map;_inProgressUrlFetches=new Map;_fontCssClassesByAlias=new Map;_resolvers=[];_defaultFontSetClass=["material-icons","mat-ligature-font"];constructor(A,i,n,o){this._httpClient=A,this._sanitizer=i,this._errorHandler=o,this._document=n}addSvgIcon(A,i,n){return this.addSvgIconInNamespace("",A,i,n)}addSvgIconLiteral(A,i,n){return this.addSvgIconLiteralInNamespace("",A,i,n)}addSvgIconInNamespace(A,i,n,o){return this._addSvgIconConfig(A,i,new X0(n,null,o))}addSvgIconResolver(A){return this._resolvers.push(A),this}addSvgIconLiteralInNamespace(A,i,n,o){let a=this._sanitizer.sanitize(_g.HTML,n);if(!a)throw OT(n);let r=e1(a);return this._addSvgIconConfig(A,i,new X0("",r,o))}addSvgIconSet(A,i){return this.addSvgIconSetInNamespace("",A,i)}addSvgIconSetLiteral(A,i){return this.addSvgIconSetLiteralInNamespace("",A,i)}addSvgIconSetInNamespace(A,i,n){return this._addSvgIconSetConfig(A,new X0(i,null,n))}addSvgIconSetLiteralInNamespace(A,i,n){let o=this._sanitizer.sanitize(_g.HTML,i);if(!o)throw OT(i);let a=e1(o);return this._addSvgIconSetConfig(A,new X0("",a,n))}registerFontClassAlias(A,i=A){return this._fontCssClassesByAlias.set(A,i),this}classNameForFontAlias(A){return this._fontCssClassesByAlias.get(A)||A}setDefaultFontSetClass(...A){return this._defaultFontSetClass=A,this}getDefaultFontSetClass(){return this._defaultFontSetClass}getSvgIconFromUrl(A){let i=this._sanitizer.sanitize(_g.RESOURCE_URL,A);if(!i)throw JT(A);let n=this._cachedIconsByUrl.get(i);return n?ne(Xm(n)):this._loadSvgIconFromConfig(new X0(A,null)).pipe(di(o=>this._cachedIconsByUrl.set(i,o)),we(o=>Xm(o)))}getNamedSvgIcon(A,i=""){let n=YT(i,A),o=this._svgIconConfigs.get(n);if(o)return this._getSvgFromConfig(o);if(o=this._getIconConfigFromResolvers(i,A),o)return this._svgIconConfigs.set(n,o),this._getSvgFromConfig(o);let a=this._iconSetConfigs.get(i);return a?this._getSvgFromIconSetConfigs(A,a):T3(TT(n))}ngOnDestroy(){this._resolvers=[],this._svgIconConfigs.clear(),this._iconSetConfigs.clear(),this._cachedIconsByUrl.clear()}_getSvgFromConfig(A){return A.svgText?ne(Xm(this._svgElementFromConfig(A))):this._loadSvgIconFromConfig(A).pipe(we(i=>Xm(i)))}_getSvgFromIconSetConfigs(A,i){let n=this._extractIconWithNameFromAnySet(A,i);if(n)return ne(n);let o=i.filter(a=>!a.svgText).map(a=>this._loadSvgIconSetFromConfig(a).pipe(Po(r=>{let l=`Loading icon set URL: ${this._sanitizer.sanitize(_g.RESOURCE_URL,a.url)} failed: ${r.message}`;return this._errorHandler.handleError(new Error(l)),ne(null)})));return qC(o).pipe(we(()=>{let a=this._extractIconWithNameFromAnySet(A,i);if(!a)throw TT(A);return a}))}_extractIconWithNameFromAnySet(A,i){for(let n=i.length-1;n>=0;n--){let o=i[n];if(o.svgText&&o.svgText.toString().indexOf(A)>-1){let a=this._svgElementFromConfig(o),r=this._extractSvgIconFromSet(a,A,o.options);if(r)return r}}return null}_loadSvgIconFromConfig(A){return this._fetchIcon(A).pipe(di(i=>A.svgText=i),we(()=>this._svgElementFromConfig(A)))}_loadSvgIconSetFromConfig(A){return A.svgText?ne(null):this._fetchIcon(A).pipe(di(i=>A.svgText=i))}_extractSvgIconFromSet(A,i,n){let o=A.querySelector(`[id="${i}"]`);if(!o)return null;let a=o.cloneNode(!0);if(a.removeAttribute("id"),a.nodeName.toLowerCase()==="svg")return this._setSvgAttributes(a,n);if(a.nodeName.toLowerCase()==="symbol")return this._setSvgAttributes(this._toSvgElement(a),n);let r=this._svgElementFromString(e1(""));return r.appendChild(a),this._setSvgAttributes(r,n)}_svgElementFromString(A){let i=this._document.createElement("DIV");i.innerHTML=A;let n=i.querySelector("svg");if(!n)throw Error(" tag not found");return n}_toSvgElement(A){let i=this._svgElementFromString(e1("")),n=A.attributes;for(let o=0;oe1(l)),H3(()=>this._inProgressUrlFetches.delete(a)),WC());return this._inProgressUrlFetches.set(a,s),s}_addSvgIconConfig(A,i,n){return this._svgIconConfigs.set(YT(A,i),n),this}_addSvgIconSetConfig(A,i){let n=this._iconSetConfigs.get(A);return n?n.push(i):this._iconSetConfigs.set(A,[i]),this}_svgElementFromConfig(A){if(!A.svgElement){let i=this._svgElementFromString(A.svgText);this._setSvgAttributes(i,A.options),A.svgElement=i}return A.svgElement}_getIconConfigFromResolvers(A,i){for(let n=0;n{let t=w(ti),e=t?t.location:null;return{getPathname:()=>e?e.pathname+e.search:""}}}),zT=["clip-path","color-profile","src","cursor","fill","filter","marker","marker-start","marker-mid","marker-end","mask","stroke"],PlA=zT.map(t=>`[${t}]`).join(", "),jlA=/^url\(['"]?#(.*?)['"]?\)$/,Wt=(()=>{class t{_elementRef=w(ce);_iconRegistry=w(HT);_location=w(zlA);_errorHandler=w(z3);_defaultColor;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;inline=!1;get svgIcon(){return this._svgIcon}set svgIcon(A){A!==this._svgIcon&&(A?this._updateSvgIcon(A):this._svgIcon&&this._clearSvgElement(),this._svgIcon=A)}_svgIcon;get fontSet(){return this._fontSet}set fontSet(A){let i=this._cleanupFontValue(A);i!==this._fontSet&&(this._fontSet=i,this._updateFontIconClasses())}_fontSet;get fontIcon(){return this._fontIcon}set fontIcon(A){let i=this._cleanupFontValue(A);i!==this._fontIcon&&(this._fontIcon=i,this._updateFontIconClasses())}_fontIcon;_previousFontSetClass=[];_previousFontIconClass;_svgName=null;_svgNamespace=null;_previousPath;_elementsWithExternalReferences;_currentIconFetch=bo.EMPTY;constructor(){let A=w(new Us("aria-hidden"),{optional:!0}),i=w(HlA,{optional:!0});i&&(i.color&&(this.color=this._defaultColor=i.color),i.fontSet&&(this.fontSet=i.fontSet)),A||this._elementRef.nativeElement.setAttribute("aria-hidden","true")}_splitIconName(A){if(!A)return["",""];let i=A.split(":");switch(i.length){case 1:return["",i[0]];case 2:return i;default:throw Error(`Invalid icon name: "${A}"`)}}ngOnInit(){this._updateFontIconClasses()}ngAfterViewChecked(){let A=this._elementsWithExternalReferences;if(A&&A.size){let i=this._location.getPathname();i!==this._previousPath&&(this._previousPath=i,this._prependPathToReferences(i))}}ngOnDestroy(){this._currentIconFetch.unsubscribe(),this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear()}_usingFontIcon(){return!this.svgIcon}_setSvgElement(A){this._clearSvgElement();let i=this._location.getPathname();this._previousPath=i,this._cacheChildrenWithExternalReferences(A),this._prependPathToReferences(i),this._elementRef.nativeElement.appendChild(A)}_clearSvgElement(){let A=this._elementRef.nativeElement,i=A.childNodes.length;for(this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear();i--;){let n=A.childNodes[i];(n.nodeType!==1||n.nodeName.toLowerCase()==="svg")&&n.remove()}}_updateFontIconClasses(){if(!this._usingFontIcon())return;let A=this._elementRef.nativeElement,i=(this.fontSet?this._iconRegistry.classNameForFontAlias(this.fontSet).split(/ +/):this._iconRegistry.getDefaultFontSetClass()).filter(n=>n.length>0);this._previousFontSetClass.forEach(n=>A.classList.remove(n)),i.forEach(n=>A.classList.add(n)),this._previousFontSetClass=i,this.fontIcon!==this._previousFontIconClass&&!i.includes("mat-ligature-font")&&(this._previousFontIconClass&&A.classList.remove(this._previousFontIconClass),this.fontIcon&&A.classList.add(this.fontIcon),this._previousFontIconClass=this.fontIcon)}_cleanupFontValue(A){return typeof A=="string"?A.trim().split(" ")[0]:A}_prependPathToReferences(A){let i=this._elementsWithExternalReferences;i&&i.forEach((n,o)=>{n.forEach(a=>{o.setAttribute(a.name,`url('${A}#${a.value}')`)})})}_cacheChildrenWithExternalReferences(A){let i=A.querySelectorAll(PlA),n=this._elementsWithExternalReferences=this._elementsWithExternalReferences||new Map;for(let o=0;o{let r=i[o],s=r.getAttribute(a),l=s?s.match(jlA):null;if(l){let g=n.get(r);g||(g=[],n.set(r,g)),g.push({name:a,value:l[1]})}})}_updateSvgIcon(A){if(this._svgNamespace=null,this._svgName=null,this._currentIconFetch.unsubscribe(),A){let[i,n]=this._splitIconName(A);i&&(this._svgNamespace=i),n&&(this._svgName=n),this._currentIconFetch=this._iconRegistry.getNamedSvgIcon(n,i).pipe(uo(1)).subscribe(o=>this._setSvgElement(o),o=>{let a=`Error retrieving icon ${i}:${n}! ${o.message}`;this._errorHandler.handleError(new Error(a))})}}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-icon"]],hostAttrs:["role","img",1,"mat-icon","notranslate"],hostVars:10,hostBindings:function(i,n){i&2&&(te("data-mat-icon-type",n._usingFontIcon()?"font":"svg")("data-mat-icon-name",n._svgName||n.fontIcon)("data-mat-icon-namespace",n._svgNamespace||n.fontSet)("fontIcon",n._usingFontIcon()?n.fontIcon:null),ro(n.color?"mat-"+n.color:""),RA("mat-icon-inline",n.inline)("mat-icon-no-color",n.color!=="primary"&&n.color!=="accent"&&n.color!=="warn"))},inputs:{color:"color",inline:[2,"inline","inline",Be],svgIcon:"svgIcon",fontSet:"fontSet",fontIcon:"fontIcon"},exportAs:["matIcon"],ngContentSelectors:YlA,decls:1,vars:0,template:function(i,n){i&1&&(Rt(),Ve(0))},styles:[`mat-icon,mat-icon.mat-primary,mat-icon.mat-accent,mat-icon.mat-warn{color:var(--mat-icon-color, inherit)}.mat-icon{-webkit-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px;overflow:hidden}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}.mat-icon.mat-ligature-font[fontIcon]::before{content:attr(fontIcon)}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto} +`],encapsulation:2,changeDetection:0})}return t})(),Tn=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();var qlA=["mat-menu-item",""],VlA=[[["mat-icon"],["","matMenuItemIcon",""]],"*"],WlA=["mat-icon, [matMenuItemIcon]","*"];function ZlA(t,e){t&1&&(Ct(),B(0,"svg",2),hA(1,"polygon",3),Q())}var XlA=["*"];function $lA(t,e){if(t&1){let A=QA();wn(0,"div",0),qd("click",function(){T(A);let n=p();return J(n.closed.emit("click"))})("animationstart",function(n){T(A);let o=p();return J(o._onAnimationStart(n.animationName))})("animationend",function(n){T(A);let o=p();return J(o._onAnimationDone(n.animationName))})("animationcancel",function(n){T(A);let o=p();return J(o._onAnimationDone(n.animationName))}),wn(1,"div",1),Ve(2),Gn()()}if(t&2){let A=p();ro(A._classList),RA("mat-menu-panel-animations-disabled",A._animationsDisabled)("mat-menu-panel-exit-animation",A._panelAnimationState==="void")("mat-menu-panel-animating",A._isAnimating()),ha("id",A.panelId),te("aria-label",A.ariaLabel||null)("aria-labelledby",A.ariaLabelledby||null)("aria-describedby",A.ariaDescribedby||null)}}var uM=new kA("MAT_MENU_PANEL"),Ml=(()=>{class t{_elementRef=w(ce);_document=w(ti);_focusMonitor=w($a);_parentMenu=w(uM,{optional:!0});_changeDetectorRef=w(wt);role="menuitem";disabled=!1;disableRipple=!1;_hovered=new ie;_focused=new ie;_highlighted=!1;_triggersSubmenu=!1;constructor(){w(eo).load(lr),this._parentMenu?.addItem?.(this)}focus(A,i){this._focusMonitor&&A?this._focusMonitor.focusVia(this._getHostElement(),A,i):this._getHostElement().focus(i),this._focused.next(this)}ngAfterViewInit(){this._focusMonitor&&this._focusMonitor.monitor(this._elementRef,!1)}ngOnDestroy(){this._focusMonitor&&this._focusMonitor.stopMonitoring(this._elementRef),this._parentMenu&&this._parentMenu.removeItem&&this._parentMenu.removeItem(this),this._hovered.complete(),this._focused.complete()}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._elementRef.nativeElement}_checkDisabled(A){this.disabled&&(A.preventDefault(),A.stopPropagation())}_handleMouseEnter(){this._hovered.next(this)}getLabel(){let A=this._elementRef.nativeElement.cloneNode(!0),i=A.querySelectorAll("mat-icon, .material-icons");for(let n=0;n({overlapTrigger:!1,xPosition:"after",yPosition:"below",backdropClass:"cdk-overlay-transparent-backdrop"})}),QM="_mat-menu-enter",A6="_mat-menu-exit",Zs=(()=>{class t{_elementRef=w(ce);_changeDetectorRef=w(wt);_injector=w(Dt);_keyManager;_xPosition;_yPosition;_firstItemFocusRef;_exitFallbackTimeout;_animationsDisabled=An();_allItems;_directDescendantItems=new xg;_classList={};_panelAnimationState="void";_animationDone=new ie;_isAnimating=bA(!1);parentMenu;direction;overlayPanelClass;backdropClass;ariaLabel;ariaLabelledby;ariaDescribedby;get xPosition(){return this._xPosition}set xPosition(A){this._xPosition=A,this.setPositionClasses()}get yPosition(){return this._yPosition}set yPosition(A){this._yPosition=A,this.setPositionClasses()}templateRef;items;lazyContent;overlapTrigger=!1;hasBackdrop;set panelClass(A){let i=this._previousPanelClass,n=gA({},this._classList);i&&i.length&&i.split(" ").forEach(o=>{n[o]=!1}),this._previousPanelClass=A,A&&A.length&&(A.split(" ").forEach(o=>{n[o]=!0}),this._elementRef.nativeElement.className=""),this._classList=n}_previousPanelClass;get classList(){return this.panelClass}set classList(A){this.panelClass=A}closed=new LA;close=this.closed;panelId=w(In).getId("mat-menu-panel-");constructor(){let A=w(egA);this.overlayPanelClass=A.overlayPanelClass||"",this._xPosition=A.xPosition,this._yPosition=A.yPosition,this.backdropClass=A.backdropClass,this.overlapTrigger=A.overlapTrigger,this.hasBackdrop=A.hasBackdrop}ngOnInit(){this.setPositionClasses()}ngAfterContentInit(){this._updateDirectDescendants(),this._keyManager=new H0(this._directDescendantItems).withWrap().withTypeAhead().withHomeAndEnd(),this._keyManager.tabOut.subscribe(()=>this.closed.emit("tab")),this._directDescendantItems.changes.pipe(Sn(this._directDescendantItems),hi(A=>Ki(...A.map(i=>i._focused)))).subscribe(A=>this._keyManager.updateActiveItem(A)),this._directDescendantItems.changes.subscribe(A=>{let i=this._keyManager;if(this._panelAnimationState==="enter"&&i.activeItem?._hasFocus()){let n=A.toArray(),o=Math.max(0,Math.min(n.length-1,i.activeItemIndex||0));n[o]&&!n[o].disabled?i.setActiveItem(o):i.setNextItemActive()}})}ngOnDestroy(){this._keyManager?.destroy(),this._directDescendantItems.destroy(),this.closed.complete(),this._firstItemFocusRef?.destroy(),clearTimeout(this._exitFallbackTimeout)}_hovered(){return this._directDescendantItems.changes.pipe(Sn(this._directDescendantItems),hi(i=>Ki(...i.map(n=>n._hovered))))}addItem(A){}removeItem(A){}_handleKeydown(A){let i=A.keyCode,n=this._keyManager;switch(i){case 27:Qa(A)||(A.preventDefault(),this.closed.emit("keydown"));break;case 37:this.parentMenu&&this.direction==="ltr"&&this.closed.emit("keydown");break;case 39:this.parentMenu&&this.direction==="rtl"&&this.closed.emit("keydown");break;default:(i===38||i===40)&&n.setFocusOrigin("keyboard"),n.onKeydown(A);return}}focusFirstItem(A="program"){this._firstItemFocusRef?.destroy(),this._firstItemFocusRef=Hn(()=>{let i=this._resolvePanel();if(!i||!i.contains(document.activeElement)){let n=this._keyManager;n.setFocusOrigin(A).setFirstItemActive(),!n.activeItem&&i&&i.focus()}},{injector:this._injector})}resetActiveItem(){this._keyManager.setActiveItem(-1)}setElevation(A){}setPositionClasses(A=this.xPosition,i=this.yPosition){this._classList=Ye(gA({},this._classList),{"mat-menu-before":A==="before","mat-menu-after":A==="after","mat-menu-above":i==="above","mat-menu-below":i==="below"}),this._changeDetectorRef.markForCheck()}_onAnimationDone(A){let i=A===A6;(i||A===QM)&&(i&&(clearTimeout(this._exitFallbackTimeout),this._exitFallbackTimeout=void 0),this._animationDone.next(i?"void":"enter"),this._isAnimating.set(!1))}_onAnimationStart(A){(A===QM||A===A6)&&this._isAnimating.set(!0)}_setIsOpen(A){if(this._panelAnimationState=A?"enter":"void",A){if(this._keyManager.activeItemIndex===0){let i=this._resolvePanel();i&&(i.scrollTop=0)}}else this._animationsDisabled||(this._exitFallbackTimeout=setTimeout(()=>this._onAnimationDone(A6),200));this._animationsDisabled&&setTimeout(()=>{this._onAnimationDone(A?QM:A6)}),this._changeDetectorRef.markForCheck()}_updateDirectDescendants(){this._allItems.changes.pipe(Sn(this._allItems)).subscribe(A=>{this._directDescendantItems.reset(A.filter(i=>i._parentMenu===this)),this._directDescendantItems.notifyOnChanges()})}_resolvePanel(){let A=null;return this._directDescendantItems.length&&(A=this._directDescendantItems.first._getHostElement().closest('[role="menu"]')),A}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-menu"]],contentQueries:function(i,n,o){if(i&1&&jo(o,AgA,5)(o,Ml,5)(o,Ml,4),i&2){let a;ae(a=re())&&(n.lazyContent=a.first),ae(a=re())&&(n._allItems=a),ae(a=re())&&(n.items=a)}},viewQuery:function(i,n){if(i&1&&Jt(ao,5),i&2){let o;ae(o=re())&&(n.templateRef=o.first)}},hostVars:3,hostBindings:function(i,n){i&2&&te("aria-label",null)("aria-labelledby",null)("aria-describedby",null)},inputs:{backdropClass:"backdropClass",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],xPosition:"xPosition",yPosition:"yPosition",overlapTrigger:[2,"overlapTrigger","overlapTrigger",Be],hasBackdrop:[2,"hasBackdrop","hasBackdrop",A=>A==null?null:Be(A)],panelClass:[0,"class","panelClass"],classList:"classList"},outputs:{closed:"closed",close:"close"},exportAs:["matMenu"],features:[Bt([{provide:uM,useExisting:t}])],ngContentSelectors:XlA,decls:1,vars:0,consts:[["tabindex","-1","role","menu",1,"mat-mdc-menu-panel",3,"click","animationstart","animationend","animationcancel","id"],[1,"mat-mdc-menu-content"]],template:function(i,n){i&1&&(Rt(),X3(0,$lA,3,12,"ng-template"))},styles:[`mat-menu{display:none}.mat-mdc-menu-content{margin:0;padding:8px 0;outline:0}.mat-mdc-menu-content,.mat-mdc-menu-content .mat-mdc-menu-item .mat-mdc-menu-item-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;flex:1;white-space:normal;font-family:var(--mat-menu-item-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-menu-item-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-menu-item-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-menu-item-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-menu-item-label-text-weight, var(--mat-sys-label-large-weight))}@keyframes _mat-menu-enter{from{opacity:0;transform:scale(0.8)}to{opacity:1;transform:none}}@keyframes _mat-menu-exit{from{opacity:1}to{opacity:0}}.mat-mdc-menu-panel{min-width:112px;max-width:280px;overflow:auto;box-sizing:border-box;outline:0;animation:_mat-menu-enter 120ms cubic-bezier(0, 0, 0.2, 1);border-radius:var(--mat-menu-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-menu-container-color, var(--mat-sys-surface-container));box-shadow:var(--mat-menu-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));will-change:transform,opacity}.mat-mdc-menu-panel.mat-menu-panel-exit-animation{animation:_mat-menu-exit 100ms 25ms linear forwards}.mat-mdc-menu-panel.mat-menu-panel-animations-disabled{animation:none}.mat-mdc-menu-panel.mat-menu-panel-animating{pointer-events:none}.mat-mdc-menu-panel.mat-menu-panel-animating:has(.mat-mdc-menu-content:empty){display:none}@media(forced-colors: active){.mat-mdc-menu-panel{outline:solid 1px}}.mat-mdc-menu-panel .mat-divider{border-top-color:var(--mat-menu-divider-color, var(--mat-sys-surface-variant));margin-bottom:var(--mat-menu-divider-bottom-spacing, 8px);margin-top:var(--mat-menu-divider-top-spacing, 8px)}.mat-mdc-menu-item{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;cursor:pointer;width:100%;text-align:left;box-sizing:border-box;color:inherit;font-size:inherit;background:none;text-decoration:none;margin:0;min-height:48px;padding-left:var(--mat-menu-item-leading-spacing, 12px);padding-right:var(--mat-menu-item-trailing-spacing, 12px);-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-menu-item::-moz-focus-inner{border:0}[dir=rtl] .mat-mdc-menu-item{padding-left:var(--mat-menu-item-trailing-spacing, 12px);padding-right:var(--mat-menu-item-leading-spacing, 12px)}.mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-leading-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-trailing-spacing, 12px)}[dir=rtl] .mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-trailing-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-leading-spacing, 12px)}.mat-mdc-menu-item,.mat-mdc-menu-item:visited,.mat-mdc-menu-item:link{color:var(--mat-menu-item-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-menu-item .mat-icon-no-color,.mat-mdc-menu-item .mat-mdc-menu-submenu-icon{color:var(--mat-menu-item-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-menu-item[disabled]{cursor:default;opacity:.38}.mat-mdc-menu-item[disabled]::after{display:block;position:absolute;content:"";top:0;left:0;bottom:0;right:0}.mat-mdc-menu-item:focus{outline:0}.mat-mdc-menu-item .mat-icon{flex-shrink:0;margin-right:var(--mat-menu-item-spacing, 12px);height:var(--mat-menu-item-icon-size, 24px);width:var(--mat-menu-item-icon-size, 24px)}[dir=rtl] .mat-mdc-menu-item{text-align:right}[dir=rtl] .mat-mdc-menu-item .mat-icon{margin-right:0;margin-left:var(--mat-menu-item-spacing, 12px)}.mat-mdc-menu-item:not([disabled]):hover{background-color:var(--mat-menu-item-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-menu-item:not([disabled]).cdk-program-focused,.mat-mdc-menu-item:not([disabled]).cdk-keyboard-focused,.mat-mdc-menu-item:not([disabled]).mat-mdc-menu-item-highlighted{background-color:var(--mat-menu-item-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}@media(forced-colors: active){.mat-mdc-menu-item{margin-top:1px}}.mat-mdc-menu-submenu-icon{width:var(--mat-menu-item-icon-size, 24px);height:10px;fill:currentColor;padding-left:var(--mat-menu-item-spacing, 12px)}[dir=rtl] .mat-mdc-menu-submenu-icon{padding-right:var(--mat-menu-item-spacing, 12px);padding-left:0}[dir=rtl] .mat-mdc-menu-submenu-icon polygon{transform:scaleX(-1);transform-origin:center}@media(forced-colors: active){.mat-mdc-menu-submenu-icon{fill:CanvasText}}.mat-mdc-menu-item .mat-mdc-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none} +`],encapsulation:2,changeDetection:0})}return t})(),tgA=new kA("mat-menu-scroll-strategy",{providedIn:"root",factory:()=>{let t=w(Dt);return()=>Z0(t)}});var FB=new WeakMap,igA=(()=>{class t{_canHaveBackdrop;_element=w(ce);_viewContainerRef=w(Mo);_menuItemInstance=w(Ml,{optional:!0,self:!0});_dir=w(fo,{optional:!0});_focusMonitor=w($a);_ngZone=w(qe);_injector=w(Dt);_scrollStrategy=w(tgA);_changeDetectorRef=w(wt);_animationsDisabled=An();_portal;_overlayRef=null;_menuOpen=!1;_closingActionsSubscription=bo.EMPTY;_menuCloseSubscription=bo.EMPTY;_pendingRemoval;_parentMaterialMenu;_parentInnerPadding;_openedBy=void 0;get _menu(){return this._menuInternal}set _menu(A){A!==this._menuInternal&&(this._menuInternal=A,this._menuCloseSubscription.unsubscribe(),A&&(this._parentMaterialMenu,this._menuCloseSubscription=A.close.subscribe(i=>{this._destroyMenu(i),(i==="click"||i==="tab")&&this._parentMaterialMenu&&this._parentMaterialMenu.closed.emit(i)})),this._menuItemInstance?._setTriggersSubmenu(this._triggersSubmenu()))}_menuInternal=null;constructor(A){this._canHaveBackdrop=A;let i=w(uM,{optional:!0});this._parentMaterialMenu=i instanceof Zs?i:void 0}ngOnDestroy(){this._menu&&this._ownsMenu(this._menu)&&FB.delete(this._menu),this._pendingRemoval?.unsubscribe(),this._menuCloseSubscription.unsubscribe(),this._closingActionsSubscription.unsubscribe(),this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null)}get menuOpen(){return this._menuOpen}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_triggersSubmenu(){return!!(this._menuItemInstance&&this._parentMaterialMenu&&this._menu)}_closeMenu(){this._menu?.close.emit()}_openMenu(A){if(this._triggerIsAriaDisabled())return;let i=this._menu;if(this._menuOpen||!i)return;this._pendingRemoval?.unsubscribe();let n=FB.get(i);FB.set(i,this),n&&n!==this&&n._closeMenu();let o=this._createOverlay(i),a=o.getConfig(),r=a.positionStrategy;this._setPosition(i,r),this._canHaveBackdrop?a.hasBackdrop=i.hasBackdrop==null?!this._triggersSubmenu():i.hasBackdrop:a.hasBackdrop=i.hasBackdrop??!1,o.hasAttached()||(o.attach(this._getPortal(i)),i.lazyContent?.attach(this.menuData)),this._closingActionsSubscription=this._menuClosingActions().subscribe(()=>this._closeMenu()),i.parentMenu=this._triggersSubmenu()?this._parentMaterialMenu:void 0,i.direction=this.dir,A&&i.focusFirstItem(this._openedBy||"program"),this._setIsMenuOpen(!0),i instanceof Zs&&(i._setIsOpen(!0),i._directDescendantItems.changes.pipe(Qt(i.close)).subscribe(()=>{r.withLockedPosition(!1).reapplyLastPosition(),r.withLockedPosition(!0)}))}focus(A,i){this._focusMonitor&&A?this._focusMonitor.focusVia(this._element,A,i):this._element.nativeElement.focus(i)}_destroyMenu(A){let i=this._overlayRef,n=this._menu;!i||!this.menuOpen||(this._closingActionsSubscription.unsubscribe(),this._pendingRemoval?.unsubscribe(),n instanceof Zs&&this._ownsMenu(n)?(this._pendingRemoval=n._animationDone.pipe(uo(1)).subscribe(()=>{i.detach(),FB.has(n)||n.lazyContent?.detach()}),n._setIsOpen(!1)):(i.detach(),n?.lazyContent?.detach()),n&&this._ownsMenu(n)&&FB.delete(n),this.restoreFocus&&(A==="keydown"||!this._openedBy||!this._triggersSubmenu())&&this.focus(this._openedBy),this._openedBy=void 0,this._setIsMenuOpen(!1))}_setIsMenuOpen(A){A!==this._menuOpen&&(this._menuOpen=A,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this._triggersSubmenu()&&this._menuItemInstance._setHighlighted(A),this._changeDetectorRef.markForCheck())}_createOverlay(A){if(!this._overlayRef){let i=this._getOverlayConfig(A);this._subscribeToPositions(A,i.positionStrategy),this._overlayRef=Yg(this._injector,i),this._overlayRef.keydownEvents().subscribe(n=>{this._menu instanceof Zs&&this._menu._handleKeydown(n)})}return this._overlayRef}_getOverlayConfig(A){return new Jg({positionStrategy:y1(this._injector,this._getOverlayOrigin()).withLockedPosition().withGrowAfterOpen().withTransformOriginOn(".mat-menu-panel, .mat-mdc-menu-panel"),backdropClass:A.backdropClass||"cdk-overlay-transparent-backdrop",panelClass:A.overlayPanelClass,scrollStrategy:this._scrollStrategy(),direction:this._dir||"ltr",disableAnimations:this._animationsDisabled})}_subscribeToPositions(A,i){A.setPositionClasses&&i.positionChanges.subscribe(n=>{this._ngZone.run(()=>{let o=n.connectionPair.overlayX==="start"?"after":"before",a=n.connectionPair.overlayY==="top"?"below":"above";A.setPositionClasses(o,a)})})}_setPosition(A,i){let[n,o]=A.xPosition==="before"?["end","start"]:["start","end"],[a,r]=A.yPosition==="above"?["bottom","top"]:["top","bottom"],[s,l]=[a,r],[g,C]=[n,o],I=0;if(this._triggersSubmenu()){if(C=n=A.xPosition==="before"?"start":"end",o=g=n==="end"?"start":"end",this._parentMaterialMenu){if(this._parentInnerPadding==null){let d=this._parentMaterialMenu.items.first;this._parentInnerPadding=d?d._getHostElement().offsetTop:0}I=a==="bottom"?this._parentInnerPadding:-this._parentInnerPadding}}else A.overlapTrigger||(s=a==="top"?"bottom":"top",l=r==="top"?"bottom":"top");i.withPositions([{originX:n,originY:s,overlayX:g,overlayY:a,offsetY:I},{originX:o,originY:s,overlayX:C,overlayY:a,offsetY:I},{originX:n,originY:l,overlayX:g,overlayY:r,offsetY:-I},{originX:o,originY:l,overlayX:C,overlayY:r,offsetY:-I}])}_menuClosingActions(){let A=this._getOutsideClickStream(this._overlayRef),i=this._overlayRef.detachments(),n=this._parentMaterialMenu?this._parentMaterialMenu.closed:ne(),o=this._parentMaterialMenu?this._parentMaterialMenu._hovered().pipe(gt(a=>this._menuOpen&&a!==this._menuItemInstance)):ne();return Ki(A,n,o,i)}_getPortal(A){return(!this._portal||this._portal.templateRef!==A.templateRef)&&(this._portal=new Jr(A.templateRef,this._viewContainerRef)),this._portal}_ownsMenu(A){return FB.get(A)===this}_triggerIsAriaDisabled(){return Be(this._element.nativeElement.getAttribute("aria-disabled"))}static \u0275fac=function(i){V3()};static \u0275dir=VA({type:t})}return t})(),$c=(()=>{class t extends igA{_cleanupTouchstart;_hoverSubscription=bo.EMPTY;get _deprecatedMatMenuTriggerFor(){return this.menu}set _deprecatedMatMenuTriggerFor(A){this.menu=A}get menu(){return this._menu}set menu(A){this._menu=A}menuData;restoreFocus=!0;menuOpened=new LA;onMenuOpen=this.menuOpened;menuClosed=new LA;onMenuClose=this.menuClosed;constructor(){super(!0);let A=w(Pi);this._cleanupTouchstart=A.listen(this._element.nativeElement,"touchstart",i=>{A1(i)||(this._openedBy="touch")},{passive:!0})}triggersSubmenu(){return super._triggersSubmenu()}toggleMenu(){return this.menuOpen?this.closeMenu():this.openMenu()}openMenu(){this._openMenu(!0)}closeMenu(){this._closeMenu()}updatePosition(){this._overlayRef?.updatePosition()}ngAfterContentInit(){this._handleHover()}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTouchstart(),this._hoverSubscription.unsubscribe()}_getOverlayOrigin(){return this._element}_getOutsideClickStream(A){return A.backdropClick()}_handleMousedown(A){$I(A)||(this._openedBy=A.button===0?"mouse":void 0,this.triggersSubmenu()&&A.preventDefault())}_handleKeydown(A){let i=A.keyCode;(i===13||i===32)&&(this._openedBy="keyboard"),this.triggersSubmenu()&&(i===39&&this.dir==="ltr"||i===37&&this.dir==="rtl")&&(this._openedBy="keyboard",this.openMenu())}_handleClick(A){this.triggersSubmenu()?(A.stopPropagation(),this.openMenu()):this.toggleMenu()}_handleHover(){this.triggersSubmenu()&&this._parentMaterialMenu&&(this._hoverSubscription=this._parentMaterialMenu._hovered().subscribe(A=>{A===this._menuItemInstance&&!A.disabled&&this._parentMaterialMenu?._panelAnimationState!=="void"&&(this._openedBy="mouse",this._openMenu(!1))}))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","mat-menu-trigger-for",""],["","matMenuTriggerFor",""]],hostAttrs:[1,"mat-mdc-menu-trigger"],hostVars:3,hostBindings:function(i,n){i&1&&U("click",function(a){return n._handleClick(a)})("mousedown",function(a){return n._handleMousedown(a)})("keydown",function(a){return n._handleKeydown(a)}),i&2&&te("aria-haspopup",n.menu?"menu":null)("aria-expanded",n.menuOpen)("aria-controls",n.menuOpen?n.menu==null?null:n.menu.panelId:null)},inputs:{_deprecatedMatMenuTriggerFor:[0,"mat-menu-trigger-for","_deprecatedMatMenuTriggerFor"],menu:[0,"matMenuTriggerFor","menu"],menuData:[0,"matMenuTriggerData","menuData"],restoreFocus:[0,"matMenuTriggerRestoreFocus","restoreFocus"]},outputs:{menuOpened:"menuOpened",onMenuOpen:"onMenuOpen",menuClosed:"menuClosed",onMenuClose:"onMenuClose"},exportAs:["matMenuTrigger"],features:[mt]})}return t})();var LB=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Yc,Zl,fi,Vc]})}return t})();var ngA=["text"],ogA=[[["mat-icon"]],"*"],agA=["mat-icon","*"];function rgA(t,e){if(t&1&&hA(0,"mat-pseudo-checkbox",1),t&2){let A=p();H("disabled",A.disabled)("state",A.selected?"checked":"unchecked")}}function sgA(t,e){if(t&1&&hA(0,"mat-pseudo-checkbox",3),t&2){let A=p();H("disabled",A.disabled)}}function lgA(t,e){if(t&1&&(B(0,"span",4),y(1),Q()),t&2){let A=p();u(),ue("(",A.group.label,")")}}var t6=new kA("MAT_OPTION_PARENT_COMPONENT"),i6=new kA("MatOptgroup");var e6=class{source;isUserInput;constructor(e,A=!1){this.source=e,this.isUserInput=A}},Yr=(()=>{class t{_element=w(ce);_changeDetectorRef=w(wt);_parent=w(t6,{optional:!0});group=w(i6,{optional:!0});_signalDisableRipple=!1;_selected=!1;_active=!1;_mostRecentViewValue="";get multiple(){return this._parent&&this._parent.multiple}get selected(){return this._selected}value;id=w(In).getId("mat-option-");get disabled(){return this.group&&this.group.disabled||this._disabled()}set disabled(A){this._disabled.set(A)}_disabled=bA(!1);get disableRipple(){return this._signalDisableRipple?this._parent.disableRipple():!!this._parent?.disableRipple}get hideSingleSelectionIndicator(){return!!(this._parent&&this._parent.hideSingleSelectionIndicator)}onSelectionChange=new LA;_text;_stateChanges=new ie;constructor(){let A=w(eo);A.load(lr),A.load(o2),this._signalDisableRipple=!!this._parent&&VI(this._parent.disableRipple)}get active(){return this._active}get viewValue(){return(this._text?.nativeElement.textContent||"").trim()}select(A=!0){this._selected||(this._selected=!0,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}deselect(A=!0){this._selected&&(this._selected=!1,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}focus(A,i){let n=this._getHostElement();typeof n.focus=="function"&&n.focus(i)}setActiveStyles(){this._active||(this._active=!0,this._changeDetectorRef.markForCheck())}setInactiveStyles(){this._active&&(this._active=!1,this._changeDetectorRef.markForCheck())}getLabel(){return this.viewValue}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!Qa(A)&&(this._selectViaInteraction(),A.preventDefault())}_selectViaInteraction(){this.disabled||(this._selected=this.multiple?!this._selected:!0,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent(!0))}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._element.nativeElement}ngAfterViewChecked(){if(this._selected){let A=this.viewValue;A!==this._mostRecentViewValue&&(this._mostRecentViewValue&&this._stateChanges.next(),this._mostRecentViewValue=A)}}ngOnDestroy(){this._stateChanges.complete()}_emitSelectionChangeEvent(A=!1){this.onSelectionChange.emit(new e6(this,A))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-option"]],viewQuery:function(i,n){if(i&1&&Jt(ngA,7),i&2){let o;ae(o=re())&&(n._text=o.first)}},hostAttrs:["role","option",1,"mat-mdc-option","mdc-list-item"],hostVars:11,hostBindings:function(i,n){i&1&&U("click",function(){return n._selectViaInteraction()})("keydown",function(a){return n._handleKeydown(a)}),i&2&&(ha("id",n.id),te("aria-selected",n.selected)("aria-disabled",n.disabled.toString()),RA("mdc-list-item--selected",n.selected)("mat-mdc-option-multiple",n.multiple)("mat-mdc-option-active",n.active)("mdc-list-item--disabled",n.disabled))},inputs:{value:"value",id:"id",disabled:[2,"disabled","disabled",Be]},outputs:{onSelectionChange:"onSelectionChange"},exportAs:["matOption"],ngContentSelectors:agA,decls:8,vars:5,consts:[["text",""],["aria-hidden","true",1,"mat-mdc-option-pseudo-checkbox",3,"disabled","state"],[1,"mdc-list-item__primary-text"],["state","checked","aria-hidden","true","appearance","minimal",1,"mat-mdc-option-pseudo-checkbox",3,"disabled"],[1,"cdk-visually-hidden"],["aria-hidden","true","mat-ripple","",1,"mat-mdc-option-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled"]],template:function(i,n){i&1&&(Rt(ogA),O(0,rgA,1,2,"mat-pseudo-checkbox",1),Ve(1),B(2,"span",2,0),Ve(4,1),Q(),O(5,sgA,1,1,"mat-pseudo-checkbox",3),O(6,lgA,2,1,"span",4),hA(7,"div",5)),i&2&&(Y(n.multiple?0:-1),u(5),Y(!n.multiple&&n.selected&&!n.hideSingleSelectionIndicator?5:-1),u(),Y(n.group&&n.group._inert?6:-1),u(),H("matRippleTrigger",n._getHostElement())("matRippleDisabled",n.disabled||n.disableRipple))},dependencies:[Gm,rs],styles:[`.mat-mdc-option{-webkit-user-select:none;user-select:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;min-height:48px;padding:0 16px;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0);color:var(--mat-option-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-option-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-option-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-option-label-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-option-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-option-label-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-option:hover:not(.mdc-list-item--disabled){background-color:var(--mat-option-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:var(--mat-option-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent));outline:0}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-active,.mat-mdc-option-multiple,:focus,:hover){background-color:var(--mat-option-selected-state-layer-color, var(--mat-sys-secondary-container))}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-active,.mat-mdc-option-multiple,:focus,:hover) .mdc-list-item__primary-text{color:var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option.mdc-list-item{align-items:center;background:rgba(0,0,0,0)}.mat-mdc-option.mdc-list-item--disabled{cursor:default;pointer-events:none}.mat-mdc-option.mdc-list-item--disabled .mat-mdc-option-pseudo-checkbox,.mat-mdc-option.mdc-list-item--disabled .mdc-list-item__primary-text,.mat-mdc-option.mdc-list-item--disabled>mat-icon{opacity:.38}.mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:32px}[dir=rtl] .mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:16px;padding-right:32px}.mat-mdc-option .mat-icon,.mat-mdc-option .mat-pseudo-checkbox-full{margin-right:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-icon,[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:0;margin-left:16px}.mat-mdc-option .mat-pseudo-checkbox-minimal{margin-left:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-minimal{margin-right:16px;margin-left:0}.mat-mdc-option .mat-mdc-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-option .mdc-list-item__primary-text{white-space:normal;font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;margin-right:auto}[dir=rtl] .mat-mdc-option .mdc-list-item__primary-text{margin-right:0;margin-left:auto}@media(forced-colors: active){.mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{content:"";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}[dir=rtl] .mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{right:auto;left:16px}}.mat-mdc-option-multiple{--mat-list-list-item-selected-container-color: var(--mat-list-list-item-container-color, transparent)}.mat-mdc-option-active .mat-focus-indicator::before{content:""} +`],encapsulation:2,changeDetection:0})}return t})();function pM(t,e,A){if(A.length){let i=e.toArray(),n=A.toArray(),o=0;for(let a=0;aA+i?Math.max(0,t-i+e):A}var PT=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();var wM=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Yc,PT,Yr,fi]})}return t})();var ggA=["trigger"],cgA=["panel"],CgA=[[["mat-select-trigger"]],"*"],IgA=["mat-select-trigger","*"];function dgA(t,e){if(t&1&&(B(0,"span",4),y(1),Q()),t&2){let A=p();u(),lA(A.placeholder)}}function BgA(t,e){t&1&&Ve(0)}function EgA(t,e){if(t&1&&(B(0,"span",11),y(1),Q()),t&2){let A=p(2);u(),lA(A.triggerValue)}}function hgA(t,e){if(t&1&&(B(0,"span",5),O(1,BgA,1,0)(2,EgA,2,1,"span",11),Q()),t&2){let A=p();u(),Y(A.customTrigger?1:2)}}function QgA(t,e){if(t&1){let A=QA();B(0,"div",12,1),U("keydown",function(n){T(A);let o=p();return J(o._handleKeydown(n))}),Ve(2,1),Q()}if(t&2){let A=p();ro(A.panelClass),RA("mat-select-panel-animations-enabled",!A._animationsDisabled)("mat-primary",(A._parentFormField==null?null:A._parentFormField.color)==="primary")("mat-accent",(A._parentFormField==null?null:A._parentFormField.color)==="accent")("mat-warn",(A._parentFormField==null?null:A._parentFormField.color)==="warn")("mat-undefined",!(A._parentFormField!=null&&A._parentFormField.color)),te("id",A.id+"-panel")("aria-multiselectable",A.multiple)("aria-label",A.ariaLabel||null)("aria-labelledby",A._getPanelAriaLabelledby())}}var ugA=new kA("mat-select-scroll-strategy",{providedIn:"root",factory:()=>{let t=w(Dt);return()=>Z0(t)}}),fgA=new kA("MAT_SELECT_CONFIG"),pgA=new kA("MatSelectTrigger"),DM=class{source;value;constructor(e,A){this.source=e,this.value=A}},Xl=(()=>{class t{_viewportRuler=w(Ms);_changeDetectorRef=w(wt);_elementRef=w(ce);_dir=w(fo,{optional:!0});_idGenerator=w(In);_renderer=w(Pi);_parentFormField=w(tu,{optional:!0});ngControl=w(Hs,{self:!0,optional:!0});_liveAnnouncer=w(VQ);_defaultOptions=w(fgA,{optional:!0});_animationsDisabled=An();_popoverLocation;_initialized=new ie;_cleanupDetach;options;optionGroups;customTrigger;_positions=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"}];_scrollOptionIntoView(A){let i=this.options.toArray()[A];if(i){let n=this.panel.nativeElement,o=pM(A,this.options,this.optionGroups),a=i._getHostElement();A===0&&o===1?n.scrollTop=0:n.scrollTop=mM(a.offsetTop,a.offsetHeight,n.scrollTop,n.offsetHeight)}}_positioningSettled(){this._scrollOptionIntoView(this._keyManager.activeItemIndex||0)}_getChangeEvent(A){return new DM(this,A)}_scrollStrategyFactory=w(ugA);_panelOpen=!1;_compareWith=(A,i)=>A===i;_uid=this._idGenerator.getId("mat-select-");_triggerAriaLabelledBy=null;_previousControl;_destroy=new ie;_errorStateTracker;stateChanges=new ie;disableAutomaticLabeling=!0;userAriaDescribedBy;_selectionModel;_keyManager;_preferredOverlayOrigin;_overlayWidth;_onChange=()=>{};_onTouched=()=>{};_valueId=this._idGenerator.getId("mat-select-value-");_scrollStrategy;_overlayPanelClass=this._defaultOptions?.overlayPanelClass||"";get focused(){return this._focused||this._panelOpen}_focused=!1;controlType="mat-select";trigger;panel;_overlayDir;panelClass;disabled=!1;get disableRipple(){return this._disableRipple()}set disableRipple(A){this._disableRipple.set(A)}_disableRipple=bA(!1);tabIndex=0;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncParentProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get placeholder(){return this._placeholder}set placeholder(A){this._placeholder=A,this.stateChanges.next()}_placeholder;get required(){return this._required??this.ngControl?.control?.hasValidator(Ys.required)??!1}set required(A){this._required=A,this.stateChanges.next()}_required;get multiple(){return this._multiple}set multiple(A){this._selectionModel,this._multiple=A}_multiple=!1;disableOptionCentering=this._defaultOptions?.disableOptionCentering??!1;get compareWith(){return this._compareWith}set compareWith(A){this._compareWith=A,this._selectionModel&&this._initializeSelection()}get value(){return this._value}set value(A){this._assignValue(A)&&this._onChange(A)}_value;ariaLabel="";ariaLabelledby;get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}typeaheadDebounceInterval;sortComparator;get id(){return this._id}set id(A){this._id=A||this._uid,this.stateChanges.next()}_id;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}panelWidth=this._defaultOptions&&typeof this._defaultOptions.panelWidth<"u"?this._defaultOptions.panelWidth:"auto";canSelectNullableOptions=this._defaultOptions?.canSelectNullableOptions??!1;optionSelectionChanges=Fc(()=>{let A=this.options;return A?A.changes.pipe(Sn(A),hi(()=>Ki(...A.map(i=>i.onSelectionChange)))):this._initialized.pipe(hi(()=>this.optionSelectionChanges))});openedChange=new LA;_openedStream=this.openedChange.pipe(gt(A=>A),we(()=>{}));_closedStream=this.openedChange.pipe(gt(A=>!A),we(()=>{}));selectionChange=new LA;valueChange=new LA;constructor(){let A=w(gB),i=w(eB,{optional:!0}),n=w(i2,{optional:!0}),o=w(new Us("tabindex"),{optional:!0}),a=w(Gu,{optional:!0});this.ngControl&&(this.ngControl.valueAccessor=this),this._defaultOptions?.typeaheadDebounceInterval!=null&&(this.typeaheadDebounceInterval=this._defaultOptions.typeaheadDebounceInterval),this._errorStateTracker=new cB(A,this.ngControl,n,i,this.stateChanges),this._scrollStrategy=this._scrollStrategyFactory(),this.tabIndex=o==null?0:parseInt(o)||0,this._popoverLocation=a?.usePopover===!1?null:"inline",this.id=this.id}ngOnInit(){this._selectionModel=new V0(this.multiple),this.stateChanges.next(),this._viewportRuler.change().pipe(Qt(this._destroy)).subscribe(()=>{this.panelOpen&&(this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._changeDetectorRef.detectChanges())})}ngAfterContentInit(){this._initialized.next(),this._initialized.complete(),this._initKeyManager(),this._selectionModel.changed.pipe(Qt(this._destroy)).subscribe(A=>{A.added.forEach(i=>i.select()),A.removed.forEach(i=>i.deselect())}),this.options.changes.pipe(Sn(null),Qt(this._destroy)).subscribe(()=>{this._resetOptions(),this._initializeSelection()})}ngDoCheck(){let A=this._getTriggerAriaLabelledby(),i=this.ngControl;if(A!==this._triggerAriaLabelledBy){let n=this._elementRef.nativeElement;this._triggerAriaLabelledBy=A,A?n.setAttribute("aria-labelledby",A):n.removeAttribute("aria-labelledby")}i&&(this._previousControl!==i.control&&(this._previousControl!==void 0&&i.disabled!==null&&i.disabled!==this.disabled&&(this.disabled=i.disabled),this._previousControl=i.control),this.updateErrorState())}ngOnChanges(A){(A.disabled||A.userAriaDescribedBy)&&this.stateChanges.next(),A.typeaheadDebounceInterval&&this._keyManager&&this._keyManager.withTypeAhead(this.typeaheadDebounceInterval),A.panelClass&&this.panelClass instanceof Set&&(this.panelClass=Array.from(this.panelClass))}ngOnDestroy(){this._cleanupDetach?.(),this._keyManager?.destroy(),this._destroy.next(),this._destroy.complete(),this.stateChanges.complete(),this._clearFromModal()}toggle(){this.panelOpen?this.close():this.open()}open(){this._canOpen()&&(this._parentFormField&&(this._preferredOverlayOrigin=this._parentFormField.getConnectedOverlayOrigin()),this._cleanupDetach?.(),this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._applyModalPanelOwnership(),this._panelOpen=!0,this._overlayDir.positionChange.pipe(uo(1)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this._positioningSettled()}),this._overlayDir.attachOverlay(),this._keyManager.withHorizontalOrientation(null),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this.stateChanges.next(),Promise.resolve().then(()=>this.openedChange.emit(!0)))}_trackedModal=null;_applyModalPanelOwnership(){let A=this._elementRef.nativeElement.closest('body > .cdk-overlay-container [aria-modal="true"]');if(!A)return;let i=`${this.id}-panel`;this._trackedModal&&yp(this._trackedModal,"aria-owns",i),Sb(A,"aria-owns",i),this._trackedModal=A}_clearFromModal(){if(!this._trackedModal)return;let A=`${this.id}-panel`;yp(this._trackedModal,"aria-owns",A),this._trackedModal=null}close(){this._panelOpen&&(this._panelOpen=!1,this._exitAndDetach(),this._keyManager.withHorizontalOrientation(this._isRtl()?"rtl":"ltr"),this._changeDetectorRef.markForCheck(),this._onTouched(),this.stateChanges.next(),Promise.resolve().then(()=>this.openedChange.emit(!1)))}_exitAndDetach(){if(this._animationsDisabled||!this.panel){this._detachOverlay();return}this._cleanupDetach?.(),this._cleanupDetach=()=>{i(),clearTimeout(n),this._cleanupDetach=void 0};let A=this.panel.nativeElement,i=this._renderer.listen(A,"animationend",o=>{o.animationName==="_mat-select-exit"&&(this._cleanupDetach?.(),this._detachOverlay())}),n=setTimeout(()=>{this._cleanupDetach?.(),this._detachOverlay()},200);A.classList.add("mat-select-panel-exit")}_detachOverlay(){this._overlayDir.detachOverlay(),this._changeDetectorRef.markForCheck()}writeValue(A){this._assignValue(A)}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck(),this.stateChanges.next()}get panelOpen(){return this._panelOpen}get selected(){return this.multiple?this._selectionModel?.selected||[]:this._selectionModel?.selected[0]}get triggerValue(){if(this.empty)return"";if(this._multiple){let A=this._selectionModel.selected.map(i=>i.viewValue);return this._isRtl()&&A.reverse(),A.join(", ")}return this._selectionModel.selected[0].viewValue}updateErrorState(){this._errorStateTracker.updateErrorState()}_isRtl(){return this._dir?this._dir.value==="rtl":!1}_handleKeydown(A){this.disabled||(this.panelOpen?this._handleOpenKeydown(A):this._handleClosedKeydown(A))}_handleClosedKeydown(A){let i=A.keyCode,n=i===40||i===38||i===37||i===39,o=i===13||i===32,a=this._keyManager;if(!a.isTyping()&&o&&!Qa(A)||(this.multiple||A.altKey)&&n)A.preventDefault(),this.open();else if(!this.multiple){let r=this.selected;a.onKeydown(A);let s=this.selected;s&&r!==s&&this._liveAnnouncer.announce(s.viewValue,1e4)}}_handleOpenKeydown(A){let i=this._keyManager,n=A.keyCode,o=n===40||n===38,a=i.isTyping();if(o&&A.altKey)A.preventDefault(),this.close();else if(!a&&(n===13||n===32)&&i.activeItem&&!Qa(A))A.preventDefault(),i.activeItem._selectViaInteraction();else if(!a&&this._multiple&&n===65&&A.ctrlKey){A.preventDefault();let r=this.options.some(s=>!s.disabled&&!s.selected);this.options.forEach(s=>{s.disabled||(r?s.select():s.deselect())})}else{let r=i.activeItemIndex;i.onKeydown(A),this._multiple&&o&&A.shiftKey&&i.activeItem&&i.activeItemIndex!==r&&i.activeItem._selectViaInteraction()}}_handleOverlayKeydown(A){A.keyCode===27&&!Qa(A)&&(A.preventDefault(),this.close())}_onFocus(){this.disabled||(this._focused=!0,this.stateChanges.next())}_onBlur(){this._focused=!1,this._keyManager?.cancelTypeahead(),!this.disabled&&!this.panelOpen&&(this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}get empty(){return!this._selectionModel||this._selectionModel.isEmpty()}_initializeSelection(){Promise.resolve().then(()=>{this.ngControl&&(this._value=this.ngControl.value),this._setSelectionByValue(this._value),this.stateChanges.next()})}_setSelectionByValue(A){if(this.options.forEach(i=>i.setInactiveStyles()),this._selectionModel.clear(),this.multiple&&A)Array.isArray(A),A.forEach(i=>this._selectOptionByValue(i)),this._sortValues();else{let i=this._selectOptionByValue(A);i?this._keyManager.updateActiveItem(i):this.panelOpen||this._keyManager.updateActiveItem(-1)}this._changeDetectorRef.markForCheck()}_selectOptionByValue(A){let i=this.options.find(n=>{if(this._selectionModel.isSelected(n))return!1;try{return(n.value!=null||this.canSelectNullableOptions)&&this._compareWith(n.value,A)}catch(o){return!1}});return i&&this._selectionModel.select(i),i}_assignValue(A){return A!==this._value||this._multiple&&Array.isArray(A)?(this.options&&this._setSelectionByValue(A),this._value=A,!0):!1}_skipPredicate=A=>this.panelOpen?!1:A.disabled;_getOverlayWidth(A){return this.panelWidth==="auto"?(A instanceof RB?A.elementRef:A||this._elementRef).nativeElement.getBoundingClientRect().width:this.panelWidth===null?"":this.panelWidth}_syncParentProperties(){if(this.options)for(let A of this.options)A._changeDetectorRef.markForCheck()}_initKeyManager(){this._keyManager=new ZQ(this.options).withTypeAhead(this.typeaheadDebounceInterval).withVerticalOrientation().withHorizontalOrientation(this._isRtl()?"rtl":"ltr").withHomeAndEnd().withPageUpDown().withAllowedModifierKeys(["shiftKey"]).skipPredicate(this._skipPredicate),this._keyManager.tabOut.subscribe(()=>{this.panelOpen&&(!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction(),this.focus(),this.close())}),this._keyManager.change.subscribe(()=>{this._panelOpen&&this.panel?this._scrollOptionIntoView(this._keyManager.activeItemIndex||0):!this._panelOpen&&!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction()})}_resetOptions(){let A=Ki(this.options.changes,this._destroy);this.optionSelectionChanges.pipe(Qt(A)).subscribe(i=>{this._onSelect(i.source,i.isUserInput),i.isUserInput&&!this.multiple&&this._panelOpen&&(this.close(),this.focus())}),Ki(...this.options.map(i=>i._stateChanges)).pipe(Qt(A)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this.stateChanges.next()})}_onSelect(A,i){let n=this._selectionModel.isSelected(A);!this.canSelectNullableOptions&&A.value==null&&!this._multiple?(A.deselect(),this._selectionModel.clear(),this.value!=null&&this._propagateChanges(A.value)):(n!==A.selected&&(A.selected?this._selectionModel.select(A):this._selectionModel.deselect(A)),i&&this._keyManager.setActiveItem(A),this.multiple&&(this._sortValues(),i&&this.focus())),n!==this._selectionModel.isSelected(A)&&this._propagateChanges(),this.stateChanges.next()}_sortValues(){if(this.multiple){let A=this.options.toArray();this._selectionModel.sort((i,n)=>this.sortComparator?this.sortComparator(i,n,A):A.indexOf(i)-A.indexOf(n)),this.stateChanges.next()}}_propagateChanges(A){let i;this.multiple?i=this.selected.map(n=>n.value):i=this.selected?this.selected.value:A,this._value=i,this.valueChange.emit(i),this._onChange(i),this.selectionChange.emit(this._getChangeEvent(i)),this._changeDetectorRef.markForCheck()}_highlightCorrectOption(){if(this._keyManager)if(this.empty){let A=-1;for(let i=0;i0&&!!this._overlayDir}focus(A){this._elementRef.nativeElement.focus(A)}_getPanelAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||null,i=A?A+" ":"";return this.ariaLabelledby?i+this.ariaLabelledby:A}_getAriaActiveDescendant(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null}_getTriggerAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||"";return this.ariaLabelledby&&(A+=" "+this.ariaLabelledby),A||(A=this._valueId),A}get describedByIds(){return this._elementRef.nativeElement.getAttribute("aria-describedby")?.split(" ")||[]}setDescribedByIds(A){let i=this._elementRef.nativeElement;A.length?i.setAttribute("aria-describedby",A.join(" ")):i.removeAttribute("aria-describedby")}onContainerClick(A){let i=Ur(A);i&&(i.tagName==="MAT-OPTION"||i.classList.contains("cdk-overlay-backdrop")||i.closest(".mat-mdc-select-panel"))||(this.focus(),this.open())}get shouldLabelFloat(){return this.panelOpen||!this.empty||this.focused&&!!this.placeholder}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-select"]],contentQueries:function(i,n,o){if(i&1&&jo(o,pgA,5)(o,Yr,5)(o,i6,5),i&2){let a;ae(a=re())&&(n.customTrigger=a.first),ae(a=re())&&(n.options=a),ae(a=re())&&(n.optionGroups=a)}},viewQuery:function(i,n){if(i&1&&Jt(ggA,5)(cgA,5)(Vm,5),i&2){let o;ae(o=re())&&(n.trigger=o.first),ae(o=re())&&(n.panel=o.first),ae(o=re())&&(n._overlayDir=o.first)}},hostAttrs:["role","combobox","aria-haspopup","listbox",1,"mat-mdc-select"],hostVars:21,hostBindings:function(i,n){i&1&&U("keydown",function(a){return n._handleKeydown(a)})("focus",function(){return n._onFocus()})("blur",function(){return n._onBlur()}),i&2&&(te("id",n.id)("tabindex",n.disabled?-1:n.tabIndex)("aria-controls",n.panelOpen?n.id+"-panel":null)("aria-expanded",n.panelOpen)("aria-label",n.ariaLabel||null)("aria-required",n.required.toString())("aria-disabled",n.disabled.toString())("aria-invalid",n.errorState)("aria-activedescendant",n._getAriaActiveDescendant()),RA("mat-mdc-select-disabled",n.disabled)("mat-mdc-select-invalid",n.errorState)("mat-mdc-select-required",n.required)("mat-mdc-select-empty",n.empty)("mat-mdc-select-multiple",n.multiple)("mat-select-open",n.panelOpen))},inputs:{userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],panelClass:"panelClass",disabled:[2,"disabled","disabled",Be],disableRipple:[2,"disableRipple","disableRipple",Be],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:Cn(A)],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",Be],placeholder:"placeholder",required:[2,"required","required",Be],multiple:[2,"multiple","multiple",Be],disableOptionCentering:[2,"disableOptionCentering","disableOptionCentering",Be],compareWith:"compareWith",value:"value",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],errorStateMatcher:"errorStateMatcher",typeaheadDebounceInterval:[2,"typeaheadDebounceInterval","typeaheadDebounceInterval",Cn],sortComparator:"sortComparator",id:"id",panelWidth:"panelWidth",canSelectNullableOptions:[2,"canSelectNullableOptions","canSelectNullableOptions",Be]},outputs:{openedChange:"openedChange",_openedStream:"opened",_closedStream:"closed",selectionChange:"selectionChange",valueChange:"valueChange"},exportAs:["matSelect"],features:[Bt([{provide:eu,useExisting:t},{provide:t6,useExisting:t}]),Yt],ngContentSelectors:IgA,decls:11,vars:10,consts:[["fallbackOverlayOrigin","cdkOverlayOrigin","trigger",""],["panel",""],["cdk-overlay-origin","",1,"mat-mdc-select-trigger",3,"click"],[1,"mat-mdc-select-value"],[1,"mat-mdc-select-placeholder","mat-mdc-select-min-line"],[1,"mat-mdc-select-value-text"],[1,"mat-mdc-select-arrow-wrapper"],[1,"mat-mdc-select-arrow"],["viewBox","0 0 24 24","width","24px","height","24px","focusable","false","aria-hidden","true"],["d","M7 10l5 5 5-5z"],["cdk-connected-overlay","","cdkConnectedOverlayHasBackdrop","","cdkConnectedOverlayBackdropClass","cdk-overlay-transparent-backdrop",3,"detach","backdropClick","overlayKeydown","cdkConnectedOverlayDisableClose","cdkConnectedOverlayPanelClass","cdkConnectedOverlayScrollStrategy","cdkConnectedOverlayOrigin","cdkConnectedOverlayPositions","cdkConnectedOverlayWidth","cdkConnectedOverlayFlexibleDimensions","cdkConnectedOverlayUsePopover"],[1,"mat-mdc-select-min-line"],["role","listbox","tabindex","-1",1,"mat-mdc-select-panel","mdc-menu-surface","mdc-menu-surface--open",3,"keydown"]],template:function(i,n){if(i&1&&(Rt(CgA),B(0,"div",2,0),U("click",function(){return n.open()}),B(3,"div",3),O(4,dgA,2,1,"span",4)(5,hgA,3,1,"span",5),Q(),B(6,"div",6)(7,"div",7),Ct(),B(8,"svg",8),hA(9,"path",9),Q()()()(),Et(10,QgA,3,16,"ng-template",10),U("detach",function(){return n.close()})("backdropClick",function(){return n.close()})("overlayKeydown",function(a){return n._handleOverlayKeydown(a)})),i&2){let o=Qi(1);u(3),te("id",n._valueId),u(),Y(n.empty?4:5),u(6),H("cdkConnectedOverlayDisableClose",!0)("cdkConnectedOverlayPanelClass",n._overlayPanelClass)("cdkConnectedOverlayScrollStrategy",n._scrollStrategy)("cdkConnectedOverlayOrigin",n._preferredOverlayOrigin||o)("cdkConnectedOverlayPositions",n._positions)("cdkConnectedOverlayWidth",n._overlayWidth)("cdkConnectedOverlayFlexibleDimensions",!0)("cdkConnectedOverlayUsePopover",n._popoverLocation)}},dependencies:[RB,Vm],styles:[`@keyframes _mat-select-enter{from{opacity:0;transform:scaleY(0.8)}to{opacity:1;transform:none}}@keyframes _mat-select-exit{from{opacity:1}to{opacity:0}}.mat-mdc-select{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-sys-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-sys-body-large-tracking))}div.mat-mdc-select-panel{box-shadow:var(--mat-select-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12))}.mat-mdc-select-disabled{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-disabled .mat-mdc-select-placeholder{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-trigger{display:inline-flex;align-items:center;cursor:pointer;position:relative;box-sizing:border-box;width:100%}.mat-mdc-select-disabled .mat-mdc-select-trigger{-webkit-user-select:none;user-select:none;cursor:default}.mat-mdc-select-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-mdc-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-mdc-select-arrow-wrapper{height:24px;flex-shrink:0;display:inline-flex;align-items:center}.mat-form-field-appearance-fill .mdc-text-field--no-label .mat-mdc-select-arrow-wrapper{transform:none}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-invalid .mat-mdc-select-arrow,.mat-form-field-invalid:not(.mat-form-field-disabled) .mat-mdc-form-field-infix::after{color:var(--mat-select-invalid-arrow-color, var(--mat-sys-error))}.mat-mdc-select-arrow{width:10px;height:5px;position:relative;color:var(--mat-select-enabled-arrow-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field.mat-focused .mat-mdc-select-arrow{color:var(--mat-select-focused-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-disabled .mat-mdc-select-arrow{color:var(--mat-select-disabled-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-select-open .mat-mdc-select-arrow{transform:rotate(180deg)}.mat-form-field-animations-enabled .mat-mdc-select-arrow{transition:transform 80ms linear}.mat-mdc-select-arrow svg{fill:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}@media(forced-colors: active){.mat-mdc-select-arrow svg{fill:CanvasText}.mat-mdc-select-disabled .mat-mdc-select-arrow svg{fill:GrayText}}div.mat-mdc-select-panel{width:100%;max-height:275px;outline:0;overflow:auto;padding:8px 0;border-radius:4px;box-sizing:border-box;position:relative;background-color:var(--mat-select-panel-background-color, var(--mat-sys-surface-container))}@media(forced-colors: active){div.mat-mdc-select-panel{outline:solid 1px}}.cdk-overlay-pane:not(.mat-mdc-select-panel-above) div.mat-mdc-select-panel{border-top-left-radius:0;border-top-right-radius:0;transform-origin:top center}.mat-mdc-select-panel-above div.mat-mdc-select-panel{border-bottom-left-radius:0;border-bottom-right-radius:0;transform-origin:bottom center}.mat-select-panel-animations-enabled{animation:_mat-select-enter 120ms cubic-bezier(0, 0, 0.2, 1)}.mat-select-panel-animations-enabled.mat-select-panel-exit{animation:_mat-select-exit 100ms linear}.mat-mdc-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1);color:var(--mat-select-placeholder-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field:not(.mat-form-field-animations-enabled) .mat-mdc-select-placeholder,._mat-animation-noopable .mat-mdc-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-mdc-select-placeholder{color:rgba(0,0,0,0);-webkit-text-fill-color:rgba(0,0,0,0);transition:none;display:block}.mat-mdc-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mat-mdc-floating-label{max-width:calc(100% - 18px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mdc-floating-label--float-above{max-width:calc(100%/0.75 - 24px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-text-field--label-floating .mdc-notched-outline__notch{max-width:calc(100% - 24px)}.mat-mdc-select-min-line:empty::before{content:" ";white-space:pre;width:1px;display:inline-block;visibility:hidden}.mat-form-field-appearance-fill .mat-mdc-select-arrow-wrapper{transform:var(--mat-select-arrow-transform, translateY(-8px))} +`],encapsulation:2,changeDetection:0})}return t})();var $0=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Zl,wM,fi,Vc,Ya,wM]})}return t})();var mgA=["tooltip"],wgA=20;var DgA=new kA("mat-tooltip-scroll-strategy",{providedIn:"root",factory:()=>{let t=w(Dt);return()=>Z0(t,{scrollThrottle:wgA})}}),ygA=new kA("mat-tooltip-default-options",{providedIn:"root",factory:()=>({showDelay:0,hideDelay:0,touchendHideDelay:1500})});var qT="tooltip-panel",vgA={passive:!0},bgA=8,MgA=8,SgA=24,kgA=200,dn=(()=>{class t{_elementRef=w(ce);_ngZone=w(qe);_platform=w(gi);_ariaDescriber=w(dG);_focusMonitor=w($a);_dir=w(fo);_injector=w(Dt);_viewContainerRef=w(Mo);_mediaMatcher=w(nB);_document=w(ti);_renderer=w(Pi);_animationsDisabled=An();_defaultOptions=w(ygA,{optional:!0});_overlayRef=null;_tooltipInstance=null;_overlayPanelClass;_portal;_position="below";_positionAtOrigin=!1;_disabled=!1;_tooltipClass;_viewInitialized=!1;_pointerExitEventsInitialized=!1;_tooltipComponent=VT;_viewportMargin=8;_currentPosition;_cssClassPrefix="mat-mdc";_ariaDescriptionPending=!1;_dirSubscribed=!1;get position(){return this._position}set position(A){A!==this._position&&(this._position=A,this._overlayRef&&(this._updatePosition(this._overlayRef),this._tooltipInstance?.show(0),this._overlayRef.updatePosition()))}get positionAtOrigin(){return this._positionAtOrigin}set positionAtOrigin(A){this._positionAtOrigin=mr(A),this._detach(),this._overlayRef=null}get disabled(){return this._disabled}set disabled(A){let i=mr(A);this._disabled!==i&&(this._disabled=i,i?this.hide(0):this._setupPointerEnterEventsIfNeeded(),this._syncAriaDescription(this.message))}get showDelay(){return this._showDelay}set showDelay(A){this._showDelay=zs(A)}_showDelay;get hideDelay(){return this._hideDelay}set hideDelay(A){this._hideDelay=zs(A),this._tooltipInstance&&(this._tooltipInstance._mouseLeaveHideDelay=this._hideDelay)}_hideDelay;touchGestures="auto";get message(){return this._message}set message(A){let i=this._message;this._message=A!=null?String(A).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._setupPointerEnterEventsIfNeeded(),this._updateTooltipMessage()),this._syncAriaDescription(i)}_message="";get tooltipClass(){return this._tooltipClass}set tooltipClass(A){this._tooltipClass=A,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)}_eventCleanups=[];_touchstartTimeout=null;_destroyed=new ie;_isDestroyed=!1;constructor(){let A=this._defaultOptions;A&&(this._showDelay=A.showDelay,this._hideDelay=A.hideDelay,A.position&&(this.position=A.position),A.positionAtOrigin&&(this.positionAtOrigin=A.positionAtOrigin),A.touchGestures&&(this.touchGestures=A.touchGestures),A.tooltipClass&&(this.tooltipClass=A.tooltipClass)),this._viewportMargin=bgA}ngAfterViewInit(){this._viewInitialized=!0,this._setupPointerEnterEventsIfNeeded(),this._focusMonitor.monitor(this._elementRef).pipe(Qt(this._destroyed)).subscribe(A=>{A?A==="keyboard"&&this._ngZone.run(()=>this.show()):this._ngZone.run(()=>this.hide(0))})}ngOnDestroy(){let A=this._elementRef.nativeElement;this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this._overlayRef&&(this._overlayRef.dispose(),this._tooltipInstance=null),this._eventCleanups.forEach(i=>i()),this._eventCleanups.length=0,this._destroyed.next(),this._destroyed.complete(),this._isDestroyed=!0,this._ariaDescriber.removeDescription(A,this.message,"tooltip"),this._focusMonitor.stopMonitoring(A)}show(A=this.showDelay,i){if(this.disabled||!this.message||this._isTooltipVisible()){this._tooltipInstance?._cancelPendingAnimations();return}let n=this._createOverlay(i);this._detach(),this._portal=this._portal||new Ss(this._tooltipComponent,this._viewContainerRef);let o=this._tooltipInstance=n.attach(this._portal).instance;o._triggerElement=this._elementRef.nativeElement,o._mouseLeaveHideDelay=this._hideDelay,o.afterHidden().pipe(Qt(this._destroyed)).subscribe(()=>this._detach()),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),o.show(A)}hide(A=this.hideDelay){let i=this._tooltipInstance;i&&(i.isVisible()?i.hide(A):(i._cancelPendingAnimations(),this._detach()))}toggle(A){this._isTooltipVisible()?this.hide():this.show(void 0,A)}_isTooltipVisible(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()}_createOverlay(A){if(this._overlayRef){let a=this._overlayRef.getConfig().positionStrategy;if((!this.positionAtOrigin||!A)&&a._origin instanceof ce)return this._overlayRef;this._detach()}let i=this._injector.get(Wc).getAncestorScrollContainers(this._elementRef),n=`${this._cssClassPrefix}-${qT}`,o=y1(this._injector,this.positionAtOrigin?A||this._elementRef:this._elementRef).withTransformOriginOn(`.${this._cssClassPrefix}-tooltip`).withFlexibleDimensions(!1).withViewportMargin(this._viewportMargin).withScrollableContainers(i).withPopoverLocation("global");return o.positionChanges.pipe(Qt(this._destroyed)).subscribe(a=>{this._updateCurrentPositionClass(a.connectionPair),this._tooltipInstance&&a.scrollableViewProperties.isOverlayClipped&&this._tooltipInstance.isVisible()&&this._ngZone.run(()=>this.hide(0))}),this._overlayRef=Yg(this._injector,{direction:this._dir,positionStrategy:o,panelClass:this._overlayPanelClass?[...this._overlayPanelClass,n]:n,scrollStrategy:this._injector.get(DgA)(),disableAnimations:this._animationsDisabled,eventPredicate:this._overlayEventPredicate}),this._updatePosition(this._overlayRef),this._overlayRef.detachments().pipe(Qt(this._destroyed)).subscribe(()=>this._detach()),this._overlayRef.outsidePointerEvents().pipe(Qt(this._destroyed)).subscribe(()=>this._tooltipInstance?._handleBodyInteraction()),this._overlayRef.keydownEvents().pipe(Qt(this._destroyed)).subscribe(a=>{a.preventDefault(),a.stopPropagation(),this._ngZone.run(()=>this.hide(0))}),this._defaultOptions?.disableTooltipInteractivity&&this._overlayRef.addPanelClass(`${this._cssClassPrefix}-tooltip-panel-non-interactive`),this._dirSubscribed||(this._dirSubscribed=!0,this._dir.change.pipe(Qt(this._destroyed)).subscribe(()=>{this._overlayRef&&this._updatePosition(this._overlayRef)})),this._overlayRef}_detach(){this._overlayRef&&this._overlayRef.hasAttached()&&this._overlayRef.detach(),this._tooltipInstance=null}_updatePosition(A){let i=A.getConfig().positionStrategy,n=this._getOrigin(),o=this._getOverlayPosition();i.withPositions([this._addOffset(gA(gA({},n.main),o.main)),this._addOffset(gA(gA({},n.fallback),o.fallback))])}_addOffset(A){let i=MgA,n=!this._dir||this._dir.value=="ltr";return A.originY==="top"?A.offsetY=-i:A.originY==="bottom"?A.offsetY=i:A.originX==="start"?A.offsetX=n?-i:i:A.originX==="end"&&(A.offsetX=n?i:-i),A}_getOrigin(){let A=!this._dir||this._dir.value=="ltr",i=this.position,n;i=="above"||i=="below"?n={originX:"center",originY:i=="above"?"top":"bottom"}:i=="before"||i=="left"&&A||i=="right"&&!A?n={originX:"start",originY:"center"}:(i=="after"||i=="right"&&A||i=="left"&&!A)&&(n={originX:"end",originY:"center"});let{x:o,y:a}=this._invertPosition(n.originX,n.originY);return{main:n,fallback:{originX:o,originY:a}}}_getOverlayPosition(){let A=!this._dir||this._dir.value=="ltr",i=this.position,n;i=="above"?n={overlayX:"center",overlayY:"bottom"}:i=="below"?n={overlayX:"center",overlayY:"top"}:i=="before"||i=="left"&&A||i=="right"&&!A?n={overlayX:"end",overlayY:"center"}:(i=="after"||i=="right"&&A||i=="left"&&!A)&&(n={overlayX:"start",overlayY:"center"});let{x:o,y:a}=this._invertPosition(n.overlayX,n.overlayY);return{main:n,fallback:{overlayX:o,overlayY:a}}}_updateTooltipMessage(){this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),Hn(()=>{this._tooltipInstance&&this._overlayRef.updatePosition()},{injector:this._injector}))}_setTooltipClass(A){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=A instanceof Set?Array.from(A):A,this._tooltipInstance._markForCheck())}_invertPosition(A,i){return this.position==="above"||this.position==="below"?i==="top"?i="bottom":i==="bottom"&&(i="top"):A==="end"?A="start":A==="start"&&(A="end"),{x:A,y:i}}_updateCurrentPositionClass(A){let{overlayY:i,originX:n,originY:o}=A,a;if(i==="center"?this._dir&&this._dir.value==="rtl"?a=n==="end"?"left":"right":a=n==="start"?"left":"right":a=i==="bottom"&&o==="top"?"above":"below",a!==this._currentPosition){let r=this._overlayRef;if(r){let s=`${this._cssClassPrefix}-${qT}-`;r.removePanelClass(s+this._currentPosition),r.addPanelClass(s+a)}this._currentPosition=a}}_setupPointerEnterEventsIfNeeded(){this._disabled||!this.message||!this._viewInitialized||this._eventCleanups.length||(this._isTouchPlatform()?this.touchGestures!=="off"&&(this._disableNativeGesturesIfNecessary(),this._addListener("touchstart",A=>{let i=A.targetTouches?.[0],n=i?{x:i.clientX,y:i.clientY}:void 0;this._setupPointerExitEventsIfNeeded(),this._touchstartTimeout&&clearTimeout(this._touchstartTimeout);let o=500;this._touchstartTimeout=setTimeout(()=>{this._touchstartTimeout=null,this.show(void 0,n)},this._defaultOptions?.touchLongPressShowDelay??o)})):this._addListener("mouseenter",A=>{this._setupPointerExitEventsIfNeeded();let i;A.x!==void 0&&A.y!==void 0&&(i=A),this.show(void 0,i)}))}_setupPointerExitEventsIfNeeded(){if(!this._pointerExitEventsInitialized){if(this._pointerExitEventsInitialized=!0,!this._isTouchPlatform())this._addListener("mouseleave",A=>{let i=A.relatedTarget;(!i||!this._overlayRef?.overlayElement.contains(i))&&this.hide()}),this._addListener("wheel",A=>{if(this._isTooltipVisible()){let i=this._document.elementFromPoint(A.clientX,A.clientY),n=this._elementRef.nativeElement;i!==n&&!n.contains(i)&&this.hide()}});else if(this.touchGestures!=="off"){this._disableNativeGesturesIfNecessary();let A=()=>{this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this.hide(this._defaultOptions?.touchendHideDelay)};this._addListener("touchend",A),this._addListener("touchcancel",A)}}}_addListener(A,i){this._eventCleanups.push(this._renderer.listen(this._elementRef.nativeElement,A,i,vgA))}_isTouchPlatform(){return this._platform.IOS||this._platform.ANDROID?!0:this._platform.isBrowser?!!this._defaultOptions?.detectHoverCapability&&this._mediaMatcher.matchMedia("(any-hover: none)").matches:!1}_disableNativeGesturesIfNecessary(){let A=this.touchGestures;if(A!=="off"){let i=this._elementRef.nativeElement,n=i.style;(A==="on"||i.nodeName!=="INPUT"&&i.nodeName!=="TEXTAREA")&&(n.userSelect=n.msUserSelect=n.webkitUserSelect=n.MozUserSelect="none"),(A==="on"||!i.draggable)&&(n.webkitUserDrag="none"),n.touchAction="none",n.webkitTapHighlightColor="transparent"}}_syncAriaDescription(A){this._ariaDescriptionPending||(this._ariaDescriptionPending=!0,this._ariaDescriber.removeDescription(this._elementRef.nativeElement,A,"tooltip"),this._isDestroyed||Hn({write:()=>{this._ariaDescriptionPending=!1,this.message&&!this.disabled&&this._ariaDescriber.describe(this._elementRef.nativeElement,this.message,"tooltip")}},{injector:this._injector}))}_overlayEventPredicate=A=>A.type==="keydown"?this._isTooltipVisible()&&A.keyCode===27&&!Qa(A):!0;static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matTooltip",""]],hostAttrs:[1,"mat-mdc-tooltip-trigger"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mat-mdc-tooltip-disabled",n.disabled)},inputs:{position:[0,"matTooltipPosition","position"],positionAtOrigin:[0,"matTooltipPositionAtOrigin","positionAtOrigin"],disabled:[0,"matTooltipDisabled","disabled"],showDelay:[0,"matTooltipShowDelay","showDelay"],hideDelay:[0,"matTooltipHideDelay","hideDelay"],touchGestures:[0,"matTooltipTouchGestures","touchGestures"],message:[0,"matTooltip","message"],tooltipClass:[0,"matTooltipClass","tooltipClass"]},exportAs:["matTooltip"]})}return t})(),VT=(()=>{class t{_changeDetectorRef=w(wt);_elementRef=w(ce);_isMultiline=!1;message;tooltipClass;_showTimeoutId;_hideTimeoutId;_triggerElement;_mouseLeaveHideDelay;_animationsDisabled=An();_tooltip;_closeOnInteraction=!1;_isVisible=!1;_onHide=new ie;_showAnimation="mat-mdc-tooltip-show";_hideAnimation="mat-mdc-tooltip-hide";constructor(){}show(A){this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=setTimeout(()=>{this._toggleVisibility(!0),this._showTimeoutId=void 0},A)}hide(A){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(()=>{this._toggleVisibility(!1),this._hideTimeoutId=void 0},A)}afterHidden(){return this._onHide}isVisible(){return this._isVisible}ngOnDestroy(){this._cancelPendingAnimations(),this._onHide.complete(),this._triggerElement=null}_handleBodyInteraction(){this._closeOnInteraction&&this.hide(0)}_markForCheck(){this._changeDetectorRef.markForCheck()}_handleMouseLeave({relatedTarget:A}){(!A||!this._triggerElement.contains(A))&&(this.isVisible()?this.hide(this._mouseLeaveHideDelay):this._finalizeAnimation(!1))}_onShow(){this._isMultiline=this._isTooltipMultiline(),this._markForCheck()}_isTooltipMultiline(){let A=this._elementRef.nativeElement.getBoundingClientRect();return A.height>SgA&&A.width>=kgA}_handleAnimationEnd({animationName:A}){(A===this._showAnimation||A===this._hideAnimation)&&this._finalizeAnimation(A===this._showAnimation)}_cancelPendingAnimations(){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=this._hideTimeoutId=void 0}_finalizeAnimation(A){A?this._closeOnInteraction=!0:this.isVisible()||this._onHide.next()}_toggleVisibility(A){let i=this._tooltip.nativeElement,n=this._showAnimation,o=this._hideAnimation;if(i.classList.remove(A?o:n),i.classList.add(A?n:o),this._isVisible!==A&&(this._isVisible=A,this._changeDetectorRef.markForCheck()),A&&!this._animationsDisabled&&typeof getComputedStyle=="function"){let a=getComputedStyle(i);(a.getPropertyValue("animation-duration")==="0s"||a.getPropertyValue("animation-name")==="none")&&(this._animationsDisabled=!0)}A&&this._onShow(),this._animationsDisabled&&(i.classList.add("_mat-animation-noopable"),this._finalizeAnimation(A))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-tooltip-component"]],viewQuery:function(i,n){if(i&1&&Jt(mgA,7),i&2){let o;ae(o=re())&&(n._tooltip=o.first)}},hostAttrs:["aria-hidden","true"],hostBindings:function(i,n){i&1&&U("mouseleave",function(a){return n._handleMouseLeave(a)})},decls:4,vars:5,consts:[["tooltip",""],[1,"mdc-tooltip","mat-mdc-tooltip",3,"animationend"],[1,"mat-mdc-tooltip-surface","mdc-tooltip__surface"]],template:function(i,n){i&1&&(wn(0,"div",1,0),qd("animationend",function(a){return n._handleAnimationEnd(a)}),wn(2,"div",2),y(3),Gn()()),i&2&&(ro(n.tooltipClass),RA("mdc-tooltip--multiline",n._isMultiline),u(3),lA(n.message))},styles:[`.mat-mdc-tooltip{position:relative;transform:scale(0);display:inline-flex}.mat-mdc-tooltip::before{content:"";top:0;right:0;bottom:0;left:0;z-index:-1;position:absolute}.mat-mdc-tooltip-panel-below .mat-mdc-tooltip::before{top:-8px}.mat-mdc-tooltip-panel-above .mat-mdc-tooltip::before{bottom:-8px}.mat-mdc-tooltip-panel-right .mat-mdc-tooltip::before{left:-8px}.mat-mdc-tooltip-panel-left .mat-mdc-tooltip::before{right:-8px}.mat-mdc-tooltip._mat-animation-noopable{animation:none;transform:scale(1)}.mat-mdc-tooltip-surface{word-break:normal;overflow-wrap:anywhere;padding:4px 8px;min-width:40px;max-width:200px;min-height:24px;max-height:40vh;box-sizing:border-box;overflow:hidden;text-align:center;will-change:transform,opacity;background-color:var(--mat-tooltip-container-color, var(--mat-sys-inverse-surface));color:var(--mat-tooltip-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mat-tooltip-container-shape, var(--mat-sys-corner-extra-small));font-family:var(--mat-tooltip-supporting-text-font, var(--mat-sys-body-small-font));font-size:var(--mat-tooltip-supporting-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-tooltip-supporting-text-weight, var(--mat-sys-body-small-weight));line-height:var(--mat-tooltip-supporting-text-line-height, var(--mat-sys-body-small-line-height));letter-spacing:var(--mat-tooltip-supporting-text-tracking, var(--mat-sys-body-small-tracking))}.mat-mdc-tooltip-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:left}[dir=rtl] .mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:right}.mat-mdc-tooltip-panel{line-height:normal}.mat-mdc-tooltip-panel.mat-mdc-tooltip-panel-non-interactive{pointer-events:none}@keyframes mat-mdc-tooltip-show{0%{opacity:0;transform:scale(0.8)}100%{opacity:1;transform:scale(1)}}@keyframes mat-mdc-tooltip-hide{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(0.8)}}.mat-mdc-tooltip-show{animation:mat-mdc-tooltip-show 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-mdc-tooltip-hide{animation:mat-mdc-tooltip-hide 75ms cubic-bezier(0.4, 0, 1, 1) forwards} +`],encapsulation:2,changeDetection:0})}return t})();var Fa=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[WQ,Zl,fi,Vc]})}return t})();function xgA(t,e){if(t&1&&(B(0,"mat-option",17),y(1),Q()),t&2){let A=e.$implicit;H("value",A),u(),ue(" ",A," ")}}function _gA(t,e){if(t&1){let A=QA();B(0,"mat-form-field",14)(1,"mat-select",16,0),U("selectionChange",function(n){T(A);let o=p(2);return J(o._changePageSize(n.value))}),Ue(3,xgA,2,2,"mat-option",17,ri),Q(),B(5,"div",18),U("click",function(){T(A);let n=Qi(2);return J(n.open())}),Q()()}if(t&2){let A=p(2);H("appearance",A._formFieldAppearance)("color",A.color),u(),H("value",A.pageSize)("disabled",A.disabled),Ap("aria-labelledby",A._pageSizeLabelId),H("panelClass",A.selectConfig.panelClass||"")("disableOptionCentering",A.selectConfig.disableOptionCentering),u(2),Te(A._displayedPageSizeOptions)}}function RgA(t,e){if(t&1&&(B(0,"div",15),y(1),Q()),t&2){let A=p(2);u(),lA(A.pageSize)}}function NgA(t,e){if(t&1&&(B(0,"div",3)(1,"div",13),y(2),Q(),O(3,_gA,6,7,"mat-form-field",14),O(4,RgA,2,1,"div",15),Q()),t&2){let A=p();u(),te("id",A._pageSizeLabelId),u(),ue(" ",A._intl.itemsPerPageLabel," "),u(),Y(A._displayedPageSizeOptions.length>1?3:-1),u(),Y(A._displayedPageSizeOptions.length<=1?4:-1)}}function FgA(t,e){if(t&1){let A=QA();B(0,"button",19),U("click",function(){T(A);let n=p();return J(n._buttonClicked(0,n._previousButtonsDisabled()))}),Ct(),B(1,"svg",8),hA(2,"path",20),Q()()}if(t&2){let A=p();H("matTooltip",A._intl.firstPageLabel)("matTooltipDisabled",A._previousButtonsDisabled())("disabled",A._previousButtonsDisabled())("tabindex",A._previousButtonsDisabled()?-1:null),te("aria-label",A._intl.firstPageLabel)}}function LgA(t,e){if(t&1){let A=QA();B(0,"button",21),U("click",function(){T(A);let n=p();return J(n._buttonClicked(n.getNumberOfPages()-1,n._nextButtonsDisabled()))}),Ct(),B(1,"svg",8),hA(2,"path",22),Q()()}if(t&2){let A=p();H("matTooltip",A._intl.lastPageLabel)("matTooltipDisabled",A._nextButtonsDisabled())("disabled",A._nextButtonsDisabled())("tabindex",A._nextButtonsDisabled()?-1:null),te("aria-label",A._intl.lastPageLabel)}}var b1=(()=>{class t{changes=new ie;itemsPerPageLabel="Items per page:";nextPageLabel="Next page";previousPageLabel="Previous page";firstPageLabel="First page";lastPageLabel="Last page";getRangeLabel=(A,i,n)=>{if(n==0||i==0)return`0 of ${n}`;n=Math.max(n,0);let o=A*i,a=o{class t{_intl=w(b1);_changeDetectorRef=w(wt);_formFieldAppearance;_pageSizeLabelId=w(In).getId("mat-paginator-page-size-label-");_intlChanges;_isInitialized=!1;_initializedStream=new Sg(1);color;get pageIndex(){return this._pageIndex}set pageIndex(A){this._pageIndex=Math.max(A||0,0),this._changeDetectorRef.markForCheck()}_pageIndex=0;get length(){return this._length}set length(A){this._length=A||0,this._changeDetectorRef.markForCheck()}_length=0;get pageSize(){return this._pageSize}set pageSize(A){this._pageSize=Math.max(A||0,0),this._updateDisplayedPageSizeOptions()}_pageSize;get pageSizeOptions(){return this._pageSizeOptions}set pageSizeOptions(A){this._pageSizeOptions=(A||[]).map(i=>Cn(i,0)),this._updateDisplayedPageSizeOptions()}_pageSizeOptions=[];hidePageSize=!1;showFirstLastButtons=!1;selectConfig={};disabled=!1;page=new LA;_displayedPageSizeOptions;initialized=this._initializedStream;constructor(){let A=this._intl,i=w(KgA,{optional:!0});if(this._intlChanges=A.changes.subscribe(()=>this._changeDetectorRef.markForCheck()),i){let{pageSize:n,pageSizeOptions:o,hidePageSize:a,showFirstLastButtons:r}=i;n!=null&&(this._pageSize=n),o!=null&&(this._pageSizeOptions=o),a!=null&&(this.hidePageSize=a),r!=null&&(this.showFirstLastButtons=r)}this._formFieldAppearance=i?.formFieldAppearance||"outline"}ngOnInit(){this._isInitialized=!0,this._updateDisplayedPageSizeOptions(),this._initializedStream.next()}ngOnDestroy(){this._initializedStream.complete(),this._intlChanges.unsubscribe()}nextPage(){this.hasNextPage()&&this._navigate(this.pageIndex+1)}previousPage(){this.hasPreviousPage()&&this._navigate(this.pageIndex-1)}firstPage(){this.hasPreviousPage()&&this._navigate(0)}lastPage(){this.hasNextPage()&&this._navigate(this.getNumberOfPages()-1)}hasPreviousPage(){return this.pageIndex>=1&&this.pageSize!=0}hasNextPage(){let A=this.getNumberOfPages()-1;return this.pageIndexA-i),this._changeDetectorRef.markForCheck())}_emitPageEvent(A){this.page.emit({previousPageIndex:A,pageIndex:this.pageIndex,pageSize:this.pageSize,length:this.length})}_navigate(A){let i=this.pageIndex;A!==i&&(this.pageIndex=A,this._emitPageEvent(i))}_buttonClicked(A,i){i||this._navigate(A)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-paginator"]],hostAttrs:["role","group",1,"mat-mdc-paginator"],inputs:{color:"color",pageIndex:[2,"pageIndex","pageIndex",Cn],length:[2,"length","length",Cn],pageSize:[2,"pageSize","pageSize",Cn],pageSizeOptions:"pageSizeOptions",hidePageSize:[2,"hidePageSize","hidePageSize",Be],showFirstLastButtons:[2,"showFirstLastButtons","showFirstLastButtons",Be],selectConfig:"selectConfig",disabled:[2,"disabled","disabled",Be]},outputs:{page:"page"},exportAs:["matPaginator"],decls:14,vars:14,consts:[["selectRef",""],[1,"mat-mdc-paginator-outer-container"],[1,"mat-mdc-paginator-container"],[1,"mat-mdc-paginator-page-size"],[1,"mat-mdc-paginator-range-actions"],["aria-atomic","true","aria-live","polite","role","status",1,"mat-mdc-paginator-range-label"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"matTooltip","matTooltipDisabled","disabled","tabindex"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-previous",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["viewBox","0 0 24 24","focusable","false","aria-hidden","true",1,"mat-mdc-paginator-icon"],["d","M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-next",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"matTooltip","matTooltipDisabled","disabled","tabindex"],["aria-hidden","true",1,"mat-mdc-paginator-page-size-label"],[1,"mat-mdc-paginator-page-size-select",3,"appearance","color"],[1,"mat-mdc-paginator-page-size-value"],["hideSingleSelectionIndicator","",3,"selectionChange","value","disabled","aria-labelledby","panelClass","disableOptionCentering"],[3,"value"],[1,"mat-mdc-paginator-touch-target",3,"click"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"]],template:function(i,n){i&1&&(B(0,"div",1)(1,"div",2),O(2,NgA,5,4,"div",3),B(3,"div",4)(4,"div",5),y(5),Q(),O(6,FgA,3,5,"button",6),B(7,"button",7),U("click",function(){return n._buttonClicked(n.pageIndex-1,n._previousButtonsDisabled())}),Ct(),B(8,"svg",8),hA(9,"path",9),Q()(),rr(),B(10,"button",10),U("click",function(){return n._buttonClicked(n.pageIndex+1,n._nextButtonsDisabled())}),Ct(),B(11,"svg",8),hA(12,"path",11),Q()(),O(13,LgA,3,5,"button",12),Q()()()),i&2&&(u(2),Y(n.hidePageSize?-1:2),u(3),ue(" ",n._intl.getRangeLabel(n.pageIndex,n.pageSize,n.length)," "),u(),Y(n.showFirstLastButtons?6:-1),u(),H("matTooltip",n._intl.previousPageLabel)("matTooltipDisabled",n._previousButtonsDisabled())("disabled",n._previousButtonsDisabled())("tabindex",n._previousButtonsDisabled()?-1:null),te("aria-label",n._intl.previousPageLabel),u(3),H("matTooltip",n._intl.nextPageLabel)("matTooltipDisabled",n._nextButtonsDisabled())("disabled",n._nextButtonsDisabled())("tabindex",n._nextButtonsDisabled()?-1:null),te("aria-label",n._intl.nextPageLabel),u(3),Y(n.showFirstLastButtons?13:-1))},dependencies:[Ko,Xl,Yr,ji,dn],styles:[`.mat-mdc-paginator{display:block;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-paginator-container-text-color, var(--mat-sys-on-surface));background-color:var(--mat-paginator-container-background-color, var(--mat-sys-surface));font-family:var(--mat-paginator-container-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-paginator-container-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-paginator-container-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-paginator-container-text-weight, var(--mat-sys-body-small-weight));letter-spacing:var(--mat-paginator-container-text-tracking, var(--mat-sys-body-small-tracking));--mat-form-field-container-height: var(--mat-paginator-form-field-container-height, 40px);--mat-form-field-container-vertical-padding: var(--mat-paginator-form-field-container-vertical-padding, 8px)}.mat-mdc-paginator .mat-mdc-select-value{font-size:var(--mat-paginator-select-trigger-text-size, var(--mat-sys-body-small-size))}.mat-mdc-paginator .mat-mdc-form-field-subscript-wrapper{display:none}.mat-mdc-paginator .mat-mdc-select{line-height:1.5}.mat-mdc-paginator-outer-container{display:flex}.mat-mdc-paginator-container{display:flex;align-items:center;justify-content:flex-end;padding:0 8px;flex-wrap:wrap;width:100%;min-height:var(--mat-paginator-container-size, 56px)}.mat-mdc-paginator-page-size{display:flex;align-items:baseline;margin-right:8px}[dir=rtl] .mat-mdc-paginator-page-size{margin-right:0;margin-left:8px}.mat-mdc-paginator-page-size-label{margin:0 4px}.mat-mdc-paginator-page-size-select{margin:0 4px;width:var(--mat-paginator-page-size-select-width, 84px)}.mat-mdc-paginator-range-label{margin:0 32px 0 24px}.mat-mdc-paginator-range-actions{display:flex;align-items:center}.mat-mdc-paginator-icon{display:inline-block;width:28px;fill:var(--mat-paginator-enabled-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon{fill:var(--mat-paginator-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}[dir=rtl] .mat-mdc-paginator-icon{transform:rotate(180deg)}@media(forced-colors: active){.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon,.mat-mdc-paginator-icon{fill:currentColor}.mat-mdc-paginator-range-actions .mat-mdc-icon-button{outline:solid 1px}.mat-mdc-paginator-range-actions .mat-mdc-icon-button[aria-disabled]{color:GrayText}}.mat-mdc-paginator-touch-target{display:var(--mat-paginator-touch-target-display, block);position:absolute;top:50%;left:50%;width:var(--mat-paginator-page-size-select-width, 84px);height:var(--mat-paginator-page-size-select-touch-target-height, 48px);background-color:rgba(0,0,0,0);transform:translate(-50%, -50%);cursor:pointer} +`],encapsulation:2,changeDetection:0})}return t})();var WT=["*"],UgA=["content"],TgA=[[["mat-drawer"]],[["mat-drawer-content"]],"*"],JgA=["mat-drawer","mat-drawer-content","*"];function OgA(t,e){if(t&1){let A=QA();B(0,"div",1),U("click",function(){T(A);let n=p();return J(n._onBackdropClicked())}),Q()}if(t&2){let A=p();RA("mat-drawer-shown",A._isShowingBackdrop())}}function YgA(t,e){t&1&&(B(0,"mat-drawer-content"),Ve(1,2),Q())}var HgA=new kA("MAT_DRAWER_DEFAULT_AUTOSIZE",{providedIn:"root",factory:()=>!1}),ZT=new kA("MAT_DRAWER_CONTAINER"),yM=(()=>{class t extends W0{_platform=w(gi);_changeDetectorRef=w(wt);_container=w(bM);constructor(){let A=w(ce),i=w(Wc),n=w(qe);super(A,i,n)}ngAfterContentInit(){this._container._contentMarginChanges.subscribe(()=>{this._changeDetectorRef.markForCheck()})}_shouldBeHidden(){if(this._platform.isBrowser)return!1;let{start:A,end:i}=this._container;return A!=null&&A.mode!=="over"&&A.opened||i!=null&&i.mode!=="over"&&i.opened}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-drawer-content"]],hostAttrs:[1,"mat-drawer-content"],hostVars:6,hostBindings:function(i,n){i&2&&(ut("margin-left",n._container._contentMargins.left,"px")("margin-right",n._container._contentMargins.right,"px"),RA("mat-drawer-content-hidden",n._shouldBeHidden()))},features:[Bt([{provide:W0,useExisting:t}]),mt],ngContentSelectors:WT,decls:1,vars:0,template:function(i,n){i&1&&(Rt(),Ve(0))},encapsulation:2,changeDetection:0})}return t})(),vM=(()=>{class t{_elementRef=w(ce);_focusTrapFactory=w(qQ);_focusMonitor=w($a);_platform=w(gi);_ngZone=w(qe);_renderer=w(Pi);_interactivityChecker=w(oB);_doc=w(ti);_container=w(ZT,{optional:!0});_focusTrap=null;_elementFocusedBeforeDrawerWasOpened=null;_eventCleanups;_isAttached=!1;_anchor=null;get position(){return this._position}set position(A){A=A==="end"?"end":"start",A!==this._position&&(this._isAttached&&this._updatePositionInParent(A),this._position=A,this.onPositionChanged.emit())}_position="start";get mode(){return this._mode}set mode(A){this._mode=A,this._updateFocusTrapState(),this._modeChanged.next()}_mode="over";get disableClose(){return this._disableClose}set disableClose(A){this._disableClose=mr(A)}_disableClose=!1;get autoFocus(){let A=this._autoFocus;return A??(this.mode==="side"?"dialog":"first-tabbable")}set autoFocus(A){(A==="true"||A==="false"||A==null)&&(A=mr(A)),this._autoFocus=A}_autoFocus;get opened(){return this._opened()}set opened(A){this.toggle(mr(A))}_opened=bA(!1);_openedVia=null;_animationStarted=new ie;_animationEnd=new ie;openedChange=new LA(!0);_openedStream=this.openedChange.pipe(gt(A=>A),we(()=>{}));openedStart=this._animationStarted.pipe(gt(()=>this.opened),_Q(void 0));_closedStream=this.openedChange.pipe(gt(A=>!A),we(()=>{}));closedStart=this._animationStarted.pipe(gt(()=>!this.opened),_Q(void 0));_destroyed=new ie;onPositionChanged=new LA;_content;_modeChanged=new ie;_injector=w(Dt);_changeDetectorRef=w(wt);constructor(){this.openedChange.pipe(Qt(this._destroyed)).subscribe(A=>{A?(this._elementFocusedBeforeDrawerWasOpened=this._doc.activeElement,this._takeFocus()):this._isFocusWithinDrawer()&&this._restoreFocus(this._openedVia||"program")}),this._eventCleanups=this._ngZone.runOutsideAngular(()=>{let A=this._renderer,i=this._elementRef.nativeElement;return[A.listen(i,"keydown",n=>{n.keyCode===27&&!this.disableClose&&!Qa(n)&&this._ngZone.run(()=>{this.close(),n.stopPropagation(),n.preventDefault()})}),A.listen(i,"transitionrun",this._handleTransitionEvent),A.listen(i,"transitionend",this._handleTransitionEvent),A.listen(i,"transitioncancel",this._handleTransitionEvent)]}),this._animationEnd.subscribe(()=>{this.openedChange.emit(this.opened)})}_forceFocus(A,i){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),a(),A.removeAttribute("tabindex")},o=this._renderer.listen(A,"blur",n),a=this._renderer.listen(A,"mousedown",n)})),A.focus(i)}_focusByCssSelector(A,i){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,i)}_takeFocus(){if(!this._focusTrap)return;let A=this._elementRef.nativeElement;switch(this.autoFocus){case!1:case"dialog":return;case!0:case"first-tabbable":Hn(()=>{!this._focusTrap.focusInitialElement()&&typeof A.focus=="function"&&A.focus()},{injector:this._injector});break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]');break;default:this._focusByCssSelector(this.autoFocus);break}}_restoreFocus(A){this.autoFocus!=="dialog"&&(this._elementFocusedBeforeDrawerWasOpened?this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened,A):this._elementRef.nativeElement.blur(),this._elementFocusedBeforeDrawerWasOpened=null)}_isFocusWithinDrawer(){let A=this._doc.activeElement;return!!A&&this._elementRef.nativeElement.contains(A)}ngAfterViewInit(){this._isAttached=!0,this._position==="end"&&this._updatePositionInParent("end"),this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._updateFocusTrapState())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._focusTrap?.destroy(),this._anchor?.remove(),this._anchor=null,this._animationStarted.complete(),this._animationEnd.complete(),this._modeChanged.complete(),this._destroyed.next(),this._destroyed.complete()}open(A){return this.toggle(!0,A)}close(){return this.toggle(!1)}_closeViaBackdropClick(){return this._setOpen(!1,!0,"mouse")}toggle(A=!this.opened,i){A&&i&&(this._openedVia=i);let n=this._setOpen(A,!A&&this._isFocusWithinDrawer(),this._openedVia||"program");return A||(this._openedVia=null),n}_setOpen(A,i,n){return A===this.opened?Promise.resolve(A?"open":"close"):(this._opened.set(A),this._container?._transitionsEnabled?this._setIsAnimating(!0):setTimeout(()=>{this._animationStarted.next(),this._animationEnd.next()}),this._elementRef.nativeElement.classList.toggle("mat-drawer-opened",A),!A&&i&&this._restoreFocus(n),this._changeDetectorRef.markForCheck(),this._updateFocusTrapState(),new Promise(o=>{this.openedChange.pipe(uo(1)).subscribe(a=>o(a?"open":"close"))}))}_setIsAnimating(A){this._elementRef.nativeElement.classList.toggle("mat-drawer-animating",A)}_getWidth(){return this._elementRef.nativeElement.offsetWidth||0}_updateFocusTrapState(){this._focusTrap&&(this._focusTrap.enabled=this.opened&&!!this._container?._isShowingBackdrop())}_updatePositionInParent(A){if(!this._platform.isBrowser)return;let i=this._elementRef.nativeElement,n=i.parentNode;A==="end"?(this._anchor||(this._anchor=this._doc.createComment("mat-drawer-anchor"),n.insertBefore(this._anchor,i)),n.appendChild(i)):this._anchor&&this._anchor.parentNode.insertBefore(i,this._anchor)}_handleTransitionEvent=A=>{let i=this._elementRef.nativeElement;A.target===i&&this._ngZone.run(()=>{A.type==="transitionrun"?this._animationStarted.next(A):(A.type==="transitionend"&&this._setIsAnimating(!1),this._animationEnd.next(A))})};static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-drawer"]],viewQuery:function(i,n){if(i&1&&Jt(UgA,5),i&2){let o;ae(o=re())&&(n._content=o.first)}},hostAttrs:[1,"mat-drawer"],hostVars:12,hostBindings:function(i,n){i&2&&(te("align",null)("tabIndex",n.mode!=="side"?"-1":null),ut("visibility",!n._container&&!n.opened?"hidden":null),RA("mat-drawer-end",n.position==="end")("mat-drawer-over",n.mode==="over")("mat-drawer-push",n.mode==="push")("mat-drawer-side",n.mode==="side"))},inputs:{position:"position",mode:"mode",disableClose:"disableClose",autoFocus:"autoFocus",opened:"opened"},outputs:{openedChange:"openedChange",_openedStream:"opened",openedStart:"openedStart",_closedStream:"closed",closedStart:"closedStart",onPositionChanged:"positionChanged"},exportAs:["matDrawer"],ngContentSelectors:WT,decls:3,vars:0,consts:[["content",""],["cdkScrollable","",1,"mat-drawer-inner-container"]],template:function(i,n){i&1&&(Rt(),B(0,"div",1,0),Ve(2),Q())},dependencies:[W0],encapsulation:2,changeDetection:0})}return t})(),bM=(()=>{class t{_dir=w(fo,{optional:!0});_element=w(ce);_ngZone=w(qe);_changeDetectorRef=w(wt);_animationDisabled=An();_transitionsEnabled=!1;_allDrawers;_drawers=new xg;_content;_userContent;get start(){return this._start}get end(){return this._end}get autosize(){return this._autosize}set autosize(A){this._autosize=mr(A)}_autosize=w(HgA);get hasBackdrop(){return this._drawerHasBackdrop(this._start)||this._drawerHasBackdrop(this._end)}set hasBackdrop(A){this._backdropOverride=A==null?null:mr(A)}_backdropOverride=null;backdropClick=new LA;_start=null;_end=null;_left=null;_right=null;_destroyed=new ie;_doCheckSubject=new ie;_contentMargins={left:null,right:null};_contentMarginChanges=new ie;get scrollable(){return this._userContent||this._content}_injector=w(Dt);constructor(){let A=w(gi),i=w(Ms);this._dir?.change.pipe(Qt(this._destroyed)).subscribe(()=>{this._validateDrawers(),this.updateContentMargins()}),i.change().pipe(Qt(this._destroyed)).subscribe(()=>this.updateContentMargins()),!this._animationDisabled&&A.isBrowser&&this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._element.nativeElement.classList.add("mat-drawer-transition"),this._transitionsEnabled=!0},200)})}ngAfterContentInit(){this._allDrawers.changes.pipe(Sn(this._allDrawers),Qt(this._destroyed)).subscribe(A=>{this._drawers.reset(A.filter(i=>!i._container||i._container===this)),this._drawers.notifyOnChanges()}),this._drawers.changes.pipe(Sn(null)).subscribe(()=>{this._validateDrawers(),this._drawers.forEach(A=>{this._watchDrawerToggle(A),this._watchDrawerPosition(A),this._watchDrawerMode(A)}),(!this._drawers.length||this._isDrawerOpen(this._start)||this._isDrawerOpen(this._end))&&this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),this._ngZone.runOutsideAngular(()=>{this._doCheckSubject.pipe(Ls(10),Qt(this._destroyed)).subscribe(()=>this.updateContentMargins())})}ngOnDestroy(){this._contentMarginChanges.complete(),this._doCheckSubject.complete(),this._drawers.destroy(),this._destroyed.next(),this._destroyed.complete()}open(){this._drawers.forEach(A=>A.open())}close(){this._drawers.forEach(A=>A.close())}updateContentMargins(){let A=0,i=0;if(this._left&&this._left.opened){if(this._left.mode=="side")A+=this._left._getWidth();else if(this._left.mode=="push"){let n=this._left._getWidth();A+=n,i-=n}}if(this._right&&this._right.opened){if(this._right.mode=="side")i+=this._right._getWidth();else if(this._right.mode=="push"){let n=this._right._getWidth();i+=n,A-=n}}A=A||null,i=i||null,(A!==this._contentMargins.left||i!==this._contentMargins.right)&&(this._contentMargins={left:A,right:i},this._ngZone.run(()=>this._contentMarginChanges.next(this._contentMargins)))}ngDoCheck(){this._autosize&&this._isPushed()&&this._ngZone.runOutsideAngular(()=>this._doCheckSubject.next())}_watchDrawerToggle(A){A._animationStarted.pipe(Qt(this._drawers.changes)).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),A.mode!=="side"&&A.openedChange.pipe(Qt(this._drawers.changes)).subscribe(()=>this._setContainerClass(A.opened))}_watchDrawerPosition(A){A.onPositionChanged.pipe(Qt(this._drawers.changes)).subscribe(()=>{Hn({read:()=>this._validateDrawers()},{injector:this._injector})})}_watchDrawerMode(A){A._modeChanged.pipe(Qt(Ki(this._drawers.changes,this._destroyed))).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()})}_setContainerClass(A){let i=this._element.nativeElement.classList,n="mat-drawer-container-has-open";A?i.add(n):i.remove(n)}_validateDrawers(){this._start=this._end=null,this._drawers.forEach(A=>{A.position=="end"?(this._end!=null,this._end=A):(this._start!=null,this._start=A)}),this._right=this._left=null,this._dir&&this._dir.value==="rtl"?(this._left=this._end,this._right=this._start):(this._left=this._start,this._right=this._end)}_isPushed(){return this._isDrawerOpen(this._start)&&this._start.mode!="over"||this._isDrawerOpen(this._end)&&this._end.mode!="over"}_onBackdropClicked(){this.backdropClick.emit(),this._closeModalDrawersViaBackdrop()}_closeModalDrawersViaBackdrop(){[this._start,this._end].filter(A=>A&&!A.disableClose&&this._drawerHasBackdrop(A)).forEach(A=>A._closeViaBackdropClick())}_isShowingBackdrop(){return this._isDrawerOpen(this._start)&&this._drawerHasBackdrop(this._start)||this._isDrawerOpen(this._end)&&this._drawerHasBackdrop(this._end)}_isDrawerOpen(A){return A!=null&&A.opened}_drawerHasBackdrop(A){return this._backdropOverride==null?!!A&&A.mode!=="side":this._backdropOverride}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-drawer-container"]],contentQueries:function(i,n,o){if(i&1&&jo(o,yM,5)(o,vM,5),i&2){let a;ae(a=re())&&(n._content=a.first),ae(a=re())&&(n._allDrawers=a)}},viewQuery:function(i,n){if(i&1&&Jt(yM,5),i&2){let o;ae(o=re())&&(n._userContent=o.first)}},hostAttrs:[1,"mat-drawer-container"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mat-drawer-container-explicit-backdrop",n._backdropOverride)},inputs:{autosize:"autosize",hasBackdrop:"hasBackdrop"},outputs:{backdropClick:"backdropClick"},exportAs:["matDrawerContainer"],features:[Bt([{provide:ZT,useExisting:t}])],ngContentSelectors:JgA,decls:4,vars:2,consts:[[1,"mat-drawer-backdrop",3,"mat-drawer-shown"],[1,"mat-drawer-backdrop",3,"click"]],template:function(i,n){i&1&&(Rt(TgA),O(0,OgA,1,2,"div",0),Ve(1),Ve(2,1),O(3,YgA,2,0,"mat-drawer-content")),i&2&&(Y(n.hasBackdrop?0:-1),u(3),Y(n._content?-1:3))},dependencies:[yM],styles:[`.mat-drawer-container{position:relative;z-index:1;color:var(--mat-sidenav-content-text-color, var(--mat-sys-on-background));background-color:var(--mat-sidenav-content-background-color, var(--mat-sys-background));box-sizing:border-box;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible;background-color:var(--mat-sidenav-scrim-color, color-mix(in srgb, var(--mat-sys-neutral-variant20) 40%, transparent))}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}@media(forced-colors: active){.mat-drawer-backdrop{opacity:.5}}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-content.mat-drawer-content-hidden{opacity:0}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;color:var(--mat-sidenav-container-text-color, var(--mat-sys-on-surface-variant));box-shadow:var(--mat-sidenav-container-elevation-shadow, none);background-color:var(--mat-sidenav-container-background-color, var(--mat-sys-surface));border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));width:var(--mat-sidenav-container-width, 360px);display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}@media(forced-colors: active){.mat-drawer,[dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}}@media(forced-colors: active){[dir=rtl] .mat-drawer,.mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0);border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .mat-drawer{border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-left-radius:0;border-bottom-left-radius:0;left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-transition .mat-drawer{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating){visibility:hidden;box-shadow:none}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container{display:none}.mat-drawer.mat-drawer-opened.mat-drawer-opened{transform:none}.mat-drawer-side{box-shadow:none;border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid}.mat-drawer-side.mat-drawer-end{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid;border-left:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto}.mat-sidenav-fixed{position:fixed} +`],encapsulation:2,changeDetection:0})}return t})();var zgA=["determinateSpinner"];function PgA(t,e){if(t&1&&(Ct(),B(0,"svg",11),hA(1,"circle",12),Q()),t&2){let A=p();te("viewBox",A._viewBox()),u(),ut("stroke-dasharray",A._strokeCircumference(),"px")("stroke-dashoffset",A._strokeCircumference()/2,"px")("stroke-width",A._circleStrokeWidth(),"%"),te("r",A._circleRadius())}}var jgA=new kA("mat-progress-spinner-default-options",{providedIn:"root",factory:()=>({diameter:XT})}),XT=100,qgA=10,gs=(()=>{class t{_elementRef=w(ce);_noopAnimations;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor="primary";_determinateCircle;constructor(){let A=w(jgA),i=XQ(),n=this._elementRef.nativeElement;this._noopAnimations=i==="di-disabled"&&!!A&&!A._forceAnimations,this.mode=n.nodeName.toLowerCase()==="mat-spinner"?"indeterminate":"determinate",!this._noopAnimations&&i==="reduced-motion"&&n.classList.add("mat-progress-spinner-reduced-motion"),A&&(A.color&&(this.color=this._defaultColor=A.color),A.diameter&&(this.diameter=A.diameter),A.strokeWidth&&(this.strokeWidth=A.strokeWidth))}mode;get value(){return this.mode==="determinate"?this._value:0}set value(A){this._value=Math.max(0,Math.min(100,A||0))}_value=0;get diameter(){return this._diameter}set diameter(A){this._diameter=A||0}_diameter=XT;get strokeWidth(){return this._strokeWidth??this.diameter/10}set strokeWidth(A){this._strokeWidth=A||0}_strokeWidth;_circleRadius(){return(this.diameter-qgA)/2}_viewBox(){let A=this._circleRadius()*2+this.strokeWidth;return`0 0 ${A} ${A}`}_strokeCircumference(){return 2*Math.PI*this._circleRadius()}_strokeDashOffset(){return this.mode==="determinate"?this._strokeCircumference()*(100-this._value)/100:null}_circleStrokeWidth(){return this.strokeWidth/this.diameter*100}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-progress-spinner"],["mat-spinner"]],viewQuery:function(i,n){if(i&1&&Jt(zgA,5),i&2){let o;ae(o=re())&&(n._determinateCircle=o.first)}},hostAttrs:["role","progressbar","tabindex","-1",1,"mat-mdc-progress-spinner","mdc-circular-progress"],hostVars:18,hostBindings:function(i,n){i&2&&(te("aria-valuemin",0)("aria-valuemax",100)("aria-valuenow",n.mode==="determinate"?n.value:null)("mode",n.mode),ro("mat-"+n.color),ut("width",n.diameter,"px")("height",n.diameter,"px")("--mat-progress-spinner-size",n.diameter+"px")("--mat-progress-spinner-active-indicator-width",n.diameter+"px"),RA("_mat-animation-noopable",n._noopAnimations)("mdc-circular-progress--indeterminate",n.mode==="indeterminate"))},inputs:{color:"color",mode:"mode",value:[2,"value","value",Cn],diameter:[2,"diameter","diameter",Cn],strokeWidth:[2,"strokeWidth","strokeWidth",Cn]},exportAs:["matProgressSpinner"],decls:14,vars:11,consts:[["circle",""],["determinateSpinner",""],["aria-hidden","true",1,"mdc-circular-progress__determinate-container"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__determinate-circle-graphic"],["cx","50%","cy","50%",1,"mdc-circular-progress__determinate-circle"],["aria-hidden","true",1,"mdc-circular-progress__indeterminate-container"],[1,"mdc-circular-progress__spinner-layer"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-left"],[3,"ngTemplateOutlet"],[1,"mdc-circular-progress__gap-patch"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-right"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__indeterminate-circle-graphic"],["cx","50%","cy","50%"]],template:function(i,n){if(i&1&&(Et(0,PgA,2,8,"ng-template",null,0,$C),B(2,"div",2,1),Ct(),B(4,"svg",3),hA(5,"circle",4),Q()(),rr(),B(6,"div",5)(7,"div",6)(8,"div",7),sn(9,8),Q(),B(10,"div",9),sn(11,8),Q(),B(12,"div",10),sn(13,8),Q()()()),i&2){let o=Qi(1);u(4),te("viewBox",n._viewBox()),u(),ut("stroke-dasharray",n._strokeCircumference(),"px")("stroke-dashoffset",n._strokeDashOffset(),"px")("stroke-width",n._circleStrokeWidth(),"%"),te("r",n._circleRadius()),u(4),H("ngTemplateOutlet",o),u(2),H("ngTemplateOutlet",o),u(2),H("ngTemplateOutlet",o)}},dependencies:[Jc],styles:[`.mat-mdc-progress-spinner{--mat-progress-spinner-animation-multiplier: 1;display:block;overflow:hidden;line-height:0;position:relative;direction:ltr;transition:opacity 250ms cubic-bezier(0.4, 0, 0.6, 1)}.mat-mdc-progress-spinner circle{stroke-width:var(--mat-progress-spinner-active-indicator-width, 4px)}.mat-mdc-progress-spinner._mat-animation-noopable,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__determinate-circle{transition:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__spinner-layer,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container{animation:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container circle{stroke-dasharray:0 !important}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle{stroke:currentColor;stroke:CanvasText}}.mat-progress-spinner-reduced-motion{--mat-progress-spinner-animation-multiplier: 1.25}.mdc-circular-progress__determinate-container,.mdc-circular-progress__indeterminate-circle-graphic,.mdc-circular-progress__indeterminate-container,.mdc-circular-progress__spinner-layer{position:absolute;width:100%;height:100%}.mdc-circular-progress__determinate-container{transform:rotate(-90deg)}.mdc-circular-progress--indeterminate .mdc-circular-progress__determinate-container{opacity:0}.mdc-circular-progress__indeterminate-container{font-size:0;letter-spacing:0;white-space:nowrap;opacity:0}.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container{opacity:1;animation:mdc-circular-progress-container-rotate calc(1568.2352941176ms*var(--mat-progress-spinner-animation-multiplier)) linear infinite}.mdc-circular-progress__determinate-circle-graphic,.mdc-circular-progress__indeterminate-circle-graphic{fill:rgba(0,0,0,0)}.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:var(--mat-progress-spinner-active-indicator-color, var(--mat-sys-primary))}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:CanvasText}}.mdc-circular-progress__determinate-circle{transition:stroke-dashoffset 500ms cubic-bezier(0, 0, 0.2, 1)}.mdc-circular-progress__gap-patch{position:absolute;top:0;left:47.5%;box-sizing:border-box;width:5%;height:100%;overflow:hidden}.mdc-circular-progress__gap-patch .mdc-circular-progress__indeterminate-circle-graphic{left:-900%;width:2000%;transform:rotate(180deg)}.mdc-circular-progress__circle-clipper .mdc-circular-progress__indeterminate-circle-graphic{width:200%}.mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{left:-100%}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-left .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-left-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-right-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress__circle-clipper{display:inline-flex;position:relative;width:50%;height:100%;overflow:hidden}.mdc-circular-progress--indeterminate .mdc-circular-progress__spinner-layer{animation:mdc-circular-progress-spinner-layer-rotate calc(5332ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}@keyframes mdc-circular-progress-container-rotate{to{transform:rotate(360deg)}}@keyframes mdc-circular-progress-spinner-layer-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}100%{transform:rotate(1080deg)}}@keyframes mdc-circular-progress-left-spin{from{transform:rotate(265deg)}50%{transform:rotate(130deg)}to{transform:rotate(265deg)}}@keyframes mdc-circular-progress-right-spin{from{transform:rotate(-265deg)}50%{transform:rotate(-130deg)}to{transform:rotate(-265deg)}} +`],encapsulation:2,changeDetection:0})}return t})();var E2=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();function VgA(t,e){if(t&1){let A=QA();B(0,"div",1)(1,"button",2),U("click",function(){T(A);let n=p();return J(n.action())}),y(2),Q()()}if(t&2){let A=p();u(2),ue(" ",A.data.action," ")}}var WgA=["label"];function ZgA(t,e){}var XgA=Math.pow(2,31)-1,Uu=class{_overlayRef;instance;containerInstance;_afterDismissed=new ie;_afterOpened=new ie;_onAction=new ie;_durationTimeoutId;_dismissedByAction=!1;constructor(e,A){this._overlayRef=A,this.containerInstance=e,e._onExit.subscribe(()=>this._finishDismiss())}dismiss(){this._afterDismissed.closed||this.containerInstance.exit(),clearTimeout(this._durationTimeoutId)}dismissWithAction(){this._onAction.closed||(this._dismissedByAction=!0,this._onAction.next(),this._onAction.complete(),this.dismiss()),clearTimeout(this._durationTimeoutId)}closeWithAction(){this.dismissWithAction()}_dismissAfter(e){this._durationTimeoutId=setTimeout(()=>this.dismiss(),Math.min(e,XgA))}_open(){this._afterOpened.closed||(this._afterOpened.next(),this._afterOpened.complete())}_finishDismiss(){this._overlayRef.dispose(),this._onAction.closed||this._onAction.complete(),this._afterDismissed.next({dismissedByAction:this._dismissedByAction}),this._afterDismissed.complete(),this._dismissedByAction=!1}afterDismissed(){return this._afterDismissed}afterOpened(){return this.containerInstance._onEnter}onAction(){return this._onAction}},$T=new kA("MatSnackBarData"),GB=class{politeness="polite";announcementMessage="";viewContainerRef;duration=0;panelClass;direction;data=null;horizontalPosition="center";verticalPosition="bottom"},$gA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matSnackBarLabel",""]],hostAttrs:[1,"mat-mdc-snack-bar-label","mdc-snackbar__label"]})}return t})(),AcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matSnackBarActions",""]],hostAttrs:[1,"mat-mdc-snack-bar-actions","mdc-snackbar__actions"]})}return t})(),ecA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matSnackBarAction",""]],hostAttrs:[1,"mat-mdc-snack-bar-action","mdc-snackbar__action"]})}return t})(),tcA=(()=>{class t{snackBarRef=w(Uu);data=w($T);constructor(){}action(){this.snackBarRef.dismissWithAction()}get hasAction(){return!!this.data.action}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["simple-snack-bar"]],hostAttrs:[1,"mat-mdc-simple-snack-bar"],exportAs:["matSnackBar"],decls:3,vars:2,consts:[["matSnackBarLabel",""],["matSnackBarActions",""],["matButton","","matSnackBarAction","",3,"click"]],template:function(i,n){i&1&&(B(0,"div",0),y(1),Q(),O(2,VgA,3,1,"div",1)),i&2&&(u(),ue(" ",n.data.message,` +`),u(),Y(n.hasAction?2:-1))},dependencies:[pi,$gA,AcA,ecA],styles:[`.mat-mdc-simple-snack-bar{display:flex}.mat-mdc-simple-snack-bar .mat-mdc-snack-bar-label{max-height:50vh;overflow:auto} +`],encapsulation:2,changeDetection:0})}return t})(),SM="_mat-snack-bar-enter",kM="_mat-snack-bar-exit",icA=(()=>{class t extends C2{_ngZone=w(qe);_elementRef=w(ce);_changeDetectorRef=w(wt);_platform=w(gi);_animationsDisabled=An();snackBarConfig=w(GB);_document=w(ti);_trackedModals=new Set;_enterFallback;_exitFallback;_injector=w(Dt);_announceDelay=150;_announceTimeoutId;_destroyed=!1;_portalOutlet;_onAnnounce=new ie;_onExit=new ie;_onEnter=new ie;_animationState="void";_live;_label;_role;_liveElementId=w(In).getId("mat-snack-bar-container-live-");constructor(){super();let A=this.snackBarConfig;A.politeness==="assertive"&&!A.announcementMessage?this._live="assertive":A.politeness==="off"?this._live="off":this._live="polite",this._platform.FIREFOX&&(this._live==="polite"&&(this._role="status"),this._live==="assertive"&&(this._role="alert"))}attachComponentPortal(A){this._assertNotAttached();let i=this._portalOutlet.attachComponentPortal(A);return this._afterPortalAttached(),i}attachTemplatePortal(A){this._assertNotAttached();let i=this._portalOutlet.attachTemplatePortal(A);return this._afterPortalAttached(),i}attachDomPortal=A=>{this._assertNotAttached();let i=this._portalOutlet.attachDomPortal(A);return this._afterPortalAttached(),i};onAnimationEnd(A){A===kM?this._completeExit():A===SM&&(clearTimeout(this._enterFallback),this._ngZone.run(()=>{this._onEnter.next(),this._onEnter.complete()}))}enter(){this._destroyed||(this._animationState="visible",this._changeDetectorRef.markForCheck(),this._changeDetectorRef.detectChanges(),this._screenReaderAnnounce(),this._animationsDisabled?Hn(()=>{this._ngZone.run(()=>queueMicrotask(()=>this.onAnimationEnd(SM)))},{injector:this._injector}):(clearTimeout(this._enterFallback),this._enterFallback=setTimeout(()=>{this._elementRef.nativeElement.classList.add("mat-snack-bar-fallback-visible"),this.onAnimationEnd(SM)},200)))}exit(){return this._destroyed?ne(void 0):(this._ngZone.run(()=>{this._animationState="hidden",this._changeDetectorRef.markForCheck(),this._elementRef.nativeElement.setAttribute("mat-exit",""),clearTimeout(this._announceTimeoutId),this._animationsDisabled?Hn(()=>{this._ngZone.run(()=>queueMicrotask(()=>this.onAnimationEnd(kM)))},{injector:this._injector}):(clearTimeout(this._exitFallback),this._exitFallback=setTimeout(()=>this.onAnimationEnd(kM),200))}),this._onExit)}ngOnDestroy(){this._destroyed=!0,this._clearFromModals(),this._completeExit()}_completeExit(){clearTimeout(this._exitFallback),queueMicrotask(()=>{this._onExit.next(),this._onExit.complete()})}_afterPortalAttached(){let A=this._elementRef.nativeElement,i=this.snackBarConfig.panelClass;i&&(Array.isArray(i)?i.forEach(a=>A.classList.add(a)):A.classList.add(i)),this._exposeToModals();let n=this._label.nativeElement,o="mdc-snackbar__label";n.classList.toggle(o,!n.querySelector(`.${o}`))}_exposeToModals(){let A=this._liveElementId,i=this._document.querySelectorAll('body > .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{let i=A.getAttribute("aria-owns");if(i){let n=i.replace(this._liveElementId,"").trim();n.length>0?A.setAttribute("aria-owns",n):A.removeAttribute("aria-owns")}}),this._trackedModals.clear()}_assertNotAttached(){this._portalOutlet.hasAttached()}_screenReaderAnnounce(){this._announceTimeoutId||this._ngZone.runOutsideAngular(()=>{this._announceTimeoutId=setTimeout(()=>{if(this._destroyed)return;let A=this._elementRef.nativeElement,i=A.querySelector("[aria-hidden]"),n=A.querySelector("[aria-live]");if(i&&n){let o=null;this._platform.isBrowser&&document.activeElement instanceof HTMLElement&&i.contains(document.activeElement)&&(o=document.activeElement),i.removeAttribute("aria-hidden"),n.appendChild(i),o?.focus(),this._onAnnounce.next(),this._onAnnounce.complete()}},this._announceDelay)})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-snack-bar-container"]],viewQuery:function(i,n){if(i&1&&Jt(Wl,7)(WgA,7),i&2){let o;ae(o=re())&&(n._portalOutlet=o.first),ae(o=re())&&(n._label=o.first)}},hostAttrs:[1,"mdc-snackbar","mat-mdc-snack-bar-container"],hostVars:6,hostBindings:function(i,n){i&1&&U("animationend",function(a){return n.onAnimationEnd(a.animationName)})("animationcancel",function(a){return n.onAnimationEnd(a.animationName)}),i&2&&RA("mat-snack-bar-container-enter",n._animationState==="visible")("mat-snack-bar-container-exit",n._animationState==="hidden")("mat-snack-bar-container-animations-enabled",!n._animationsDisabled)},features:[mt],decls:6,vars:3,consts:[["label",""],[1,"mdc-snackbar__surface","mat-mdc-snackbar-surface"],[1,"mat-mdc-snack-bar-label"],["aria-hidden","true"],["cdkPortalOutlet",""]],template:function(i,n){i&1&&(B(0,"div",1)(1,"div",2,0)(3,"div",3),Et(4,ZgA,0,0,"ng-template",4),Q(),hA(5,"div"),Q()()),i&2&&(u(5),te("aria-live",n._live)("role",n._role)("id",n._liveElementId))},dependencies:[Wl],styles:[`@keyframes _mat-snack-bar-enter{from{transform:scale(0.8);opacity:0}to{transform:scale(1);opacity:1}}@keyframes _mat-snack-bar-exit{from{opacity:1}to{opacity:0}}.mat-mdc-snack-bar-container{display:flex;align-items:center;justify-content:center;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);margin:8px}.mat-mdc-snack-bar-handset .mat-mdc-snack-bar-container{width:100vw}.mat-snack-bar-container-animations-enabled{opacity:0}.mat-snack-bar-container-animations-enabled.mat-snack-bar-fallback-visible{opacity:1}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-enter{animation:_mat-snack-bar-enter 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-exit{animation:_mat-snack-bar-exit 75ms cubic-bezier(0.4, 0, 1, 1) forwards}.mat-mdc-snackbar-surface{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);display:flex;align-items:center;justify-content:flex-start;box-sizing:border-box;padding-left:0;padding-right:8px}[dir=rtl] .mat-mdc-snackbar-surface{padding-right:0;padding-left:8px}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{min-width:344px;max-width:672px}.mat-mdc-snack-bar-handset .mat-mdc-snackbar-surface{width:100%;min-width:0}@media(forced-colors: active){.mat-mdc-snackbar-surface{outline:solid 1px}}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{color:var(--mat-snack-bar-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mat-snack-bar-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-snack-bar-container-color, var(--mat-sys-inverse-surface))}.mdc-snackbar__label{width:100%;flex-grow:1;box-sizing:border-box;margin:0;padding:14px 8px 14px 16px}[dir=rtl] .mdc-snackbar__label{padding-left:8px;padding-right:16px}.mat-mdc-snack-bar-container .mdc-snackbar__label{font-family:var(--mat-snack-bar-supporting-text-font, var(--mat-sys-body-medium-font));font-size:var(--mat-snack-bar-supporting-text-size, var(--mat-sys-body-medium-size));font-weight:var(--mat-snack-bar-supporting-text-weight, var(--mat-sys-body-medium-weight));line-height:var(--mat-snack-bar-supporting-text-line-height, var(--mat-sys-body-medium-line-height))}.mat-mdc-snack-bar-actions{display:flex;flex-shrink:0;align-items:center;box-sizing:border-box}.mat-mdc-snack-bar-handset,.mat-mdc-snack-bar-container,.mat-mdc-snack-bar-label{flex:1 1 auto}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled).mat-unthemed{color:var(--mat-snack-bar-button-color, var(--mat-sys-inverse-primary))}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled){--mat-button-text-state-layer-color: currentColor;--mat-button-text-ripple-color: currentColor}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled) .mat-ripple-element{opacity:.1} +`],encapsulation:2})}return t})(),ncA=new kA("mat-snack-bar-default-options",{providedIn:"root",factory:()=>new GB}),h2=(()=>{class t{_live=w(VQ);_injector=w(Dt);_breakpointObserver=w(jQ);_parentSnackBar=w(t,{optional:!0,skipSelf:!0});_defaultConfig=w(ncA);_animationsDisabled=An();_snackBarRefAtThisLevel=null;simpleSnackBarComponent=tcA;snackBarContainerComponent=icA;handsetCssClass="mat-mdc-snack-bar-handset";get _openedSnackBarRef(){let A=this._parentSnackBar;return A?A._openedSnackBarRef:this._snackBarRefAtThisLevel}set _openedSnackBarRef(A){this._parentSnackBar?this._parentSnackBar._openedSnackBarRef=A:this._snackBarRefAtThisLevel=A}constructor(){}openFromComponent(A,i){return this._attach(A,i)}openFromTemplate(A,i){return this._attach(A,i)}open(A,i="",n){let o=gA(gA({},this._defaultConfig),n);return o.data={message:A,action:i},o.announcementMessage===A&&(o.announcementMessage=void 0),this.openFromComponent(this.simpleSnackBarComponent,o)}dismiss(){this._openedSnackBarRef&&this._openedSnackBarRef.dismiss()}ngOnDestroy(){this._snackBarRefAtThisLevel&&this._snackBarRefAtThisLevel.dismiss()}_attachSnackBarContainer(A,i){let n=i&&i.viewContainerRef&&i.viewContainerRef.injector,o=Dt.create({parent:n||this._injector,providers:[{provide:GB,useValue:i}]}),a=new Ss(this.snackBarContainerComponent,i.viewContainerRef,o),r=A.attach(a);return r.instance.snackBarConfig=i,r.instance}_attach(A,i){let n=gA(gA(gA({},new GB),this._defaultConfig),i),o=this._createOverlay(n),a=this._attachSnackBarContainer(o,n),r=new Uu(a,o);if(A instanceof ao){let s=new Jr(A,null,{$implicit:n.data,snackBarRef:r});r.instance=a.attachTemplatePortal(s)}else{let s=this._createInjector(n,r),l=new Ss(A,void 0,s),g=a.attachComponentPortal(l);r.instance=g.instance}return this._breakpointObserver.observe(EG.HandsetPortrait).pipe(Qt(o.detachments())).subscribe(s=>{o.overlayElement.classList.toggle(this.handsetCssClass,s.matches)}),n.announcementMessage&&a._onAnnounce.subscribe(()=>{this._live.announce(n.announcementMessage,n.politeness)}),this._animateSnackBar(r,n),this._openedSnackBarRef=r,this._openedSnackBarRef}_animateSnackBar(A,i){A.afterDismissed().subscribe(()=>{this._openedSnackBarRef==A&&(this._openedSnackBarRef=null),i.announcementMessage&&this._live.clear()}),i.duration&&i.duration>0&&A.afterOpened().subscribe(()=>A._dismissAfter(i.duration)),this._openedSnackBarRef?(this._openedSnackBarRef.afterDismissed().subscribe(()=>{A.containerInstance.enter()}),this._openedSnackBarRef.dismiss()):A.containerInstance.enter()}_createOverlay(A){let i=new Jg;i.direction=A.direction;let n=I2(this._injector),o=A.direction==="rtl",a=A.horizontalPosition==="left"||A.horizontalPosition==="start"&&!o||A.horizontalPosition==="end"&&o,r=!a&&A.horizontalPosition!=="center";return a?n.left("0"):r?n.right("0"):n.centerHorizontally(),A.verticalPosition==="top"?n.top("0"):n.bottom("0"),i.positionStrategy=n,i.disableAnimations=this._animationsDisabled,Yg(this._injector,i)}_createInjector(A,i){let n=A&&A.viewContainerRef&&A.viewContainerRef.injector;return Dt.create({parent:n||this._injector,providers:[{provide:Uu,useValue:i},{provide:$T,useValue:A.data}]})}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var ocA=["*",[["mat-toolbar-row"]]],acA=["*","mat-toolbar-row"],rcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["mat-toolbar-row"]],hostAttrs:[1,"mat-toolbar-row"],exportAs:["matToolbarRow"]})}return t})(),AJ=(()=>{class t{_elementRef=w(ce);_platform=w(gi);_document=w(ti);color;_toolbarRows;constructor(){}ngAfterViewInit(){this._platform.isBrowser&&(this._checkToolbarMixedModes(),this._toolbarRows.changes.subscribe(()=>this._checkToolbarMixedModes()))}_checkToolbarMixedModes(){this._toolbarRows.length}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-toolbar"]],contentQueries:function(i,n,o){if(i&1&&jo(o,rcA,5),i&2){let a;ae(a=re())&&(n._toolbarRows=a)}},hostAttrs:[1,"mat-toolbar"],hostVars:6,hostBindings:function(i,n){i&2&&(ro(n.color?"mat-"+n.color:""),RA("mat-toolbar-multiple-rows",n._toolbarRows.length>0)("mat-toolbar-single-row",n._toolbarRows.length===0))},inputs:{color:"color"},exportAs:["matToolbar"],ngContentSelectors:acA,decls:2,vars:0,template:function(i,n){i&1&&(Rt(ocA),Ve(0),Ve(1,1))},styles:[`.mat-toolbar{background:var(--mat-toolbar-container-background-color, var(--mat-sys-surface));color:var(--mat-toolbar-container-text-color, var(--mat-sys-on-surface))}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font-family:var(--mat-toolbar-title-text-font, var(--mat-sys-title-large-font));font-size:var(--mat-toolbar-title-text-size, var(--mat-sys-title-large-size));line-height:var(--mat-toolbar-title-text-line-height, var(--mat-sys-title-large-line-height));font-weight:var(--mat-toolbar-title-text-weight, var(--mat-sys-title-large-weight));letter-spacing:var(--mat-toolbar-title-text-tracking, var(--mat-sys-title-large-tracking));margin:0}@media(forced-colors: active){.mat-toolbar{outline:solid 1px}}.mat-toolbar .mat-form-field-underline,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-focused .mat-form-field-ripple{background-color:currentColor}.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-select-value,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow{color:inherit}.mat-toolbar .mat-input-element{caret-color:currentColor}.mat-toolbar .mat-mdc-button-base.mat-mdc-button-base.mat-unthemed{--mat-button-text-label-text-color: var(--mat-toolbar-container-text-color, var(--mat-sys-on-surface));--mat-button-outlined-label-text-color: var(--mat-toolbar-container-text-color, var(--mat-sys-on-surface))}.mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap;height:var(--mat-toolbar-standard-height, 64px)}@media(max-width: 599px){.mat-toolbar-row,.mat-toolbar-single-row{height:var(--mat-toolbar-mobile-height, 56px)}}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%;min-height:var(--mat-toolbar-standard-height, 64px)}@media(max-width: 599px){.mat-toolbar-multiple-rows{min-height:var(--mat-toolbar-mobile-height, 56px)}} +`],encapsulation:2,changeDetection:0})}return t})();var scA=t=>["segment",t],lcA=(t,e)=>({"segment-main":!0,expandable:t,expanded:e});function gcA(t,e){t&1&&hA(0,"div",9)}function ccA(t,e){if(t&1&&(B(0,"span",10),y(1),Q()),t&2){let A=p().$implicit;u(),lA(A.description)}}function CcA(t,e){if(t&1&&(B(0,"section",11),hA(1,"ngx-json-viewer",12),Q()),t&2){let A=p().$implicit,i=p();u(),H("json",A.value)("expanded",i.expanded)("depth",i.depth)("_currentDepth",i._currentDepth+1)}}function IcA(t,e){if(t&1){let A=QA();B(0,"section",2)(1,"section",3),U("click",function(){let n=T(A).$implicit,o=p();return J(o.toggle(n))}),Et(2,gcA,1,0,"div",4),B(3,"span",5),y(4),Q(),B(5,"span",6),y(6,": "),Q(),Et(7,ccA,2,1,"span",7),Q(),Et(8,CcA,2,4,"section",8),Q()}if(t&2){let A=e.$implicit,i=p();H("ngClass",Ks(6,scA,"segment-type-"+A.type)),u(),H("ngClass",U0(8,lcA,i.isExpandable(A),A.expanded)),u(),H("ngIf",i.isExpandable(A)),u(2),lA(A.key),u(3),H("ngIf",!A.expanded||!i.isExpandable(A)),u(),H("ngIf",A.expanded&&i.isExpandable(A))}}var $l=(()=>{class t{constructor(){this.expanded=!0,this.depth=-1,this._currentDepth=0,this.segments=[]}ngOnChanges(){this.segments=[],this.json=this.decycle(this.json),typeof this.json=="object"?Object.keys(this.json).forEach(A=>{this.segments.push(this.parseKeyValue(A,this.json[A]))}):this.segments.push(this.parseKeyValue(`(${typeof this.json})`,this.json))}isExpandable(A){return A.type==="object"||A.type==="array"}toggle(A){this.isExpandable(A)&&(A.expanded=!A.expanded)}parseKeyValue(A,i){let n={key:A,value:i,type:void 0,description:""+i,expanded:this.isExpanded()};switch(typeof n.value){case"number":{n.type="number";break}case"boolean":{n.type="boolean";break}case"function":{n.type="function";break}case"string":{n.type="string",n.description='"'+n.value+'"';break}case"undefined":{n.type="undefined",n.description="undefined";break}case"object":{n.value===null?(n.type="null",n.description="null"):Array.isArray(n.value)?(n.type="array",n.description="Array["+n.value.length+"] "+JSON.stringify(n.value)):n.value instanceof Date?n.type="date":(n.type="object",n.description="Object "+JSON.stringify(n.value));break}}return n}isExpanded(){return this.expanded&&!(this.depth>-1&&this._currentDepth>=this.depth)}decycle(A){let i=new WeakMap;return(function n(o,a){let r,s;return typeof o=="object"&&o!==null&&!(o instanceof Boolean)&&!(o instanceof Date)&&!(o instanceof Number)&&!(o instanceof RegExp)&&!(o instanceof String)?(r=i.get(o),r!==void 0?{$ref:r}:(i.set(o,a),Array.isArray(o)?(s=[],o.forEach(function(l,g){s[g]=n(l,a+"["+g+"]")})):(s={},Object.keys(o).forEach(function(l){s[l]=n(o[l],a+"["+JSON.stringify(l)+"]")})),s)):o})(A,"$")}}return t.\u0275fac=function(A){return new(A||t)},t.\u0275cmp=SA({type:t,selectors:[["ngx-json-viewer"]],inputs:{json:"json",expanded:"expanded",depth:"depth",_currentDepth:"_currentDepth"},standalone:!1,features:[Yt],decls:2,vars:1,consts:[[1,"ngx-json-viewer"],[3,"ngClass",4,"ngFor","ngForOf"],[3,"ngClass"],[3,"click","ngClass"],["class","toggler",4,"ngIf"],[1,"segment-key"],[1,"segment-separator"],["class","segment-value",4,"ngIf"],["class","children",4,"ngIf"],[1,"toggler"],[1,"segment-value"],[1,"children"],[3,"json","expanded","depth","_currentDepth"]],template:function(A,i){A&1&&(B(0,"section",0),Et(1,IcA,9,11,"section",1),Q()),A&2&&(u(),H("ngForOf",i.segments))},dependencies:[zl,A2,Js,t],styles:['@charset "UTF-8";.ngx-json-viewer[_ngcontent-%COMP%]{font-family:var(--ngx-json-font-family, monospace);font-size:var(--ngx-json-font-size, 1em);width:100%;height:100%;overflow:hidden;position:relative}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%]{padding:2px;margin:1px 1px 1px 12px}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%]{word-wrap:break-word}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .toggler[_ngcontent-%COMP%]{position:absolute;margin-left:-14px;margin-top:3px;font-size:.8em;line-height:1.2em;vertical-align:middle;color:var(--ngx-json-toggler, #787878)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .toggler[_ngcontent-%COMP%]:after{display:inline-block;content:"\\25ba";transition:transform .1s ease-in}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-key[_ngcontent-%COMP%]{color:var(--ngx-json-key, #4E187C)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-separator[_ngcontent-%COMP%]{color:var(--ngx-json-separator, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-value, #000)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .children[_ngcontent-%COMP%]{margin-left:12px}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-string[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-string, #FF6B6B)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-number[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-number, #009688)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-boolean[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-boolean, #B938A4)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-date[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-date, #05668D)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-array[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-array, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-object[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-object, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-function[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-function, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-null[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-null, #fff)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-undefined, #fff)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-null[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{background-color:var(--ngx-json-null-bg, red)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-key[_ngcontent-%COMP%]{color:var(--ngx-json-undefined-key, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{background-color:var(--ngx-json-undefined-key, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-object[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%], .ngx-json-viewer[_ngcontent-%COMP%] .segment-type-array[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%]{white-space:nowrap}.ngx-json-viewer[_ngcontent-%COMP%] .expanded[_ngcontent-%COMP%] > .toggler[_ngcontent-%COMP%]:after{transform:rotate(90deg)}.ngx-json-viewer[_ngcontent-%COMP%] .expandable[_ngcontent-%COMP%], .ngx-json-viewer[_ngcontent-%COMP%] .expandable[_ngcontent-%COMP%] > .toggler[_ngcontent-%COMP%]{cursor:pointer}']}),t})(),cs=(()=>{class t{}return t.\u0275fac=function(A){return new(A||t)},t.\u0275mod=Ze({type:t}),t.\u0275inj=We({imports:[li]}),t})();var Dr=class t{static getBaseUrlWithoutPath(){let e=window.location.href;return new URL(e).origin+"/dev-ui/"}static getApiServerBaseUrl(){return window.runtimeConfig?.backendUrl||""}static getWSServerUrl(){let e=t.getApiServerBaseUrl();return!e||e==""?window.location.host:e.startsWith("http://")?e.slice(7):e.startsWith("https://")?e.slice(8):e}};var UB=class{role;text;thought;isLoading;isEditing;evalStatus;failedMetric;attachments;renderedContent;a2uiData;executableCode;codeExecutionResult;event;inlineData;functionCalls;functionResponses;actualInvocationToolUses;expectedInvocationToolUses;actualFinalResponse;expectedFinalResponse;evalScore;evalThreshold;invocationIndex;finalResponsePartIndex;toolUseIndex;error;constructor(e){if(Object.assign(this,e),this.event?.actions)for(let[A,i]of Object.entries(this.event.actions))i!==null&&typeof i=="object"&&Object.keys(i).length===0&&delete this.event.actions[A]}get stateDelta(){return this.event?.actions?.stateDelta}get artifactDelta(){return this.event?.actions?.artifactDelta}get route(){return this.event?.actions?.route}get nodePath(){return this.event?.nodeInfo?.path||null}get bareNodePath(){let e=this.nodePath;return e?e.split("/").map(A=>A.split("@")[0]).join("/"):null}get author(){return this.event?.author??"root_agent"}};var $s=new kA("AgentService");var e0=new kA("AgentBuilderService");var TB=new kA("ArtifactService");var JB=new kA("DownloadService");var t0=new kA("EvalService");var o6=new kA("EventService");var eJ="edit_function_args";var tJ="a2a_card",iJ="tests",nJ="eval_v2",yr=new kA("FeatureFlagService");var OB=new kA("GraphService");var a6=new kA("LocalFileService");var Cs=new kA("SafeValuesService"),r6=class{openBase64InNewTab(e,A){try{if(!e)return;let i=e;if(e.startsWith("data:")&&e.includes(";base64,")&&(i=i.substring(i.indexOf(";base64,")+8)),!A||!i)return;let n=atob(i),o=new Array(n.length);for(let l=0;l{fetch(i,{method:"POST"}).then(o=>{if(!o.body){n.error("No response body");return}let a=o.body.getReader(),r=new TextDecoder("utf-8"),s=()=>{a.read().then(({done:l,value:g})=>{if(l){this.zone.run(()=>n.complete());return}let C=r.decode(g,{stream:!0});this.zone.run(()=>n.next(C)),s()}).catch(l=>{this.zone.run(()=>n.error(l))})};s()}).catch(o=>{this.zone.run(()=>n.error(o))})})}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var c6=class t{constructor(e,A){this.el=e;this.renderer=A}sideDrawerMinWidth=360;sideDrawerMaxWidth=window.innerWidth/2;resizeHandle=null;resizingEvent={isResizing:!1,startingCursorX:0,startingWidth:0};ngAfterViewInit(){this.sideDrawerMaxWidth=window.innerWidth/2,this.resizeHandle=document.getElementsByClassName("resize-handler")[0],this.resizeHandle&&this.renderer.listen(this.resizeHandle,"mousedown",e=>this.onResizeHandleMouseDown(e)),document.documentElement.style.setProperty("--side-drawer-width","570px"),this.renderer.setStyle(this.el.nativeElement,"width","var(--side-drawer-width)")}onResizeHandleMouseDown(e){this.resizingEvent={isResizing:!0,startingCursorX:e.clientX,startingWidth:this.sideDrawerWidth},e.preventDefault()}onMouseMove(e){if(!this.resizingEvent.isResizing)return;let A=e.clientX-this.resizingEvent.startingCursorX,i=this.resizingEvent.startingWidth+A;this.sideDrawerWidth=i,this.renderer.addClass(document.body,"resizing")}onMouseUp(){this.resizingEvent.isResizing=!1,this.renderer.removeClass(document.body,"resizing")}onResize(){this.sideDrawerMaxWidth=window.innerWidth/2,this.sideDrawerWidth=this.sideDrawerWidth}set sideDrawerWidth(e){let A=Math.min(Math.max(e,this.sideDrawerMinWidth),this.sideDrawerMaxWidth);document.documentElement.style.setProperty("--side-drawer-width",`${A}px`)}get sideDrawerWidth(){let e=getComputedStyle(document.documentElement).getPropertyValue("--side-drawer-width"),A=parseFloat(e);return isNaN(A)?500:A}static \u0275fac=function(A){return new(A||t)(ct(ce),ct(Pi))};static \u0275dir=VA({type:t,selectors:[["","appResizableDrawer",""]],hostBindings:function(A,i){A&1&&U("mousemove",function(o){return i.onMouseMove(o)},Pd)("mouseup",function(){return i.onMouseUp()},Pd)("resize",function(){return i.onResize()},ZC)}})};var C6=Symbol.for("yaml.alias"),I6=Symbol.for("yaml.document"),zg=Symbol.for("yaml.map"),xM=Symbol.for("yaml.pair"),Sl=Symbol.for("yaml.scalar"),AC=Symbol.for("yaml.seq"),xs=Symbol.for("yaml.node.type"),ig=t=>!!t&&typeof t=="object"&&t[xs]===C6,Pg=t=>!!t&&typeof t=="object"&&t[xs]===I6,jg=t=>!!t&&typeof t=="object"&&t[xs]===zg,vn=t=>!!t&&typeof t=="object"&&t[xs]===xM,Vi=t=>!!t&&typeof t=="object"&&t[xs]===Sl,qg=t=>!!t&&typeof t=="object"&&t[xs]===AC;function go(t){if(t&&typeof t=="object")switch(t[xs]){case zg:case AC:return!0}return!1}function xn(t){if(t&&typeof t=="object")switch(t[xs]){case C6:case zg:case Sl:case AC:return!0}return!1}var d6=t=>(Vi(t)||go(t))&&!!t.anchor;var el=Symbol("break visit"),oJ=Symbol("skip children"),i0=Symbol("remove node");function n0(t,e){let A=aJ(e);Pg(t)?jB(null,t.contents,A,Object.freeze([t]))===i0&&(t.contents=null):jB(null,t,A,Object.freeze([]))}n0.BREAK=el;n0.SKIP=oJ;n0.REMOVE=i0;function jB(t,e,A,i){let n=rJ(t,e,A,i);if(xn(n)||vn(n))return sJ(t,i,n),jB(t,n,A,i);if(typeof n!="symbol"){if(go(e)){i=Object.freeze(i.concat(e));for(let o=0;ot.replace(/[!,[\]{}]/g,e=>dcA[e]),VB=(()=>{class t{constructor(A,i){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},t.defaultYaml,A),this.tags=Object.assign({},t.defaultTags,i)}clone(){let A=new t(this.yaml,this.tags);return A.docStart=this.docStart,A}atDocument(){let A=new t(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:t.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},t.defaultTags);break}return A}add(A,i){this.atNextDocument&&(this.yaml={explicit:t.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},t.defaultTags),this.atNextDocument=!1);let n=A.trim().split(/[ \t]+/),o=n.shift();switch(o){case"%TAG":{if(n.length!==2&&(i(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;let[a,r]=n;return this.tags[a]=r,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return i(0,"%YAML directive should contain exactly one part"),!1;let[a]=n;if(a==="1.1"||a==="1.2")return this.yaml.version=a,!0;{let r=/^\d+\.\d+$/.test(a);return i(6,`Unsupported YAML version ${a}`,r),!1}}default:return i(0,`Unknown directive ${o}`,!0),!1}}tagName(A,i){if(A==="!")return"!";if(A[0]!=="!")return i(`Not a valid tag: ${A}`),null;if(A[1]==="<"){let r=A.slice(2,-1);return r==="!"||r==="!!"?(i(`Verbatim tags aren't resolved, so ${A} is invalid.`),null):(A[A.length-1]!==">"&&i("Verbatim tags must end with a >"),r)}let[,n,o]=A.match(/^(.*!)([^!]*)$/s);o||i(`The ${A} tag has no suffix`);let a=this.tags[n];if(a)try{return a+decodeURIComponent(o)}catch(r){return i(String(r)),null}return n==="!"?A:(i(`Could not resolve tag: ${A}`),null)}tagString(A){for(let[i,n]of Object.entries(this.tags))if(A.startsWith(n))return i+BcA(A.substring(n.length));return A[0]==="!"?A:`!<${A}>`}toString(A){let i=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],n=Object.entries(this.tags),o;if(A&&n.length>0&&xn(A.contents)){let a={};n0(A.contents,(r,s)=>{xn(s)&&s.tag&&(a[s.tag]=!0)}),o=Object.keys(a)}else o=[];for(let[a,r]of n)a==="!!"&&r==="tag:yaml.org,2002:"||(!A||o.some(s=>s.startsWith(r)))&&i.push(`%TAG ${a} ${r}`);return i.join(` +`)}}return t.defaultYaml={explicit:!1,version:"1.2"},t.defaultTags={"!!":"tag:yaml.org,2002:"},t})();function E6(t){if(/[\x00-\x19\s,[\]{}]/.test(t)){let A=`Anchor must not contain whitespace or control characters: ${JSON.stringify(t)}`;throw new Error(A)}return!0}function _M(t){let e=new Set;return n0(t,{Value(A,i){i.anchor&&e.add(i.anchor)}}),e}function RM(t,e){for(let A=1;;++A){let i=`${t}${A}`;if(!e.has(i))return i}}function lJ(t,e){let A=[],i=new Map,n=null;return{onAnchor:o=>{A.push(o),n??(n=_M(t));let a=RM(e,n);return n.add(a),a},setAnchors:()=>{for(let o of A){let a=i.get(o);if(typeof a=="object"&&a.anchor&&(Vi(a.node)||go(a.node)))a.node.anchor=a.anchor;else{let r=new Error("Failed to resolve repeated object (this should not happen)");throw r.source=o,r}}},sourceObjects:i}}function f2(t,e,A,i){if(i&&typeof i=="object")if(Array.isArray(i))for(let n=0,o=i.length;ncr(i,String(n),A));if(t&&typeof t.toJSON=="function"){if(!A||!d6(t))return t.toJSON(e,A);let i={aliasCount:0,count:1,res:void 0};A.anchors.set(t,i),A.onCreate=o=>{i.res=o,delete A.onCreate};let n=t.toJSON(e,A);return A.onCreate&&A.onCreate(n),n}return typeof t=="bigint"&&!A?.keep?Number(t):t}var p2=class{constructor(e){Object.defineProperty(this,xs,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:A,maxAliasCount:i,onAnchor:n,reviver:o}={}){if(!Pg(e))throw new TypeError("A document argument is required");let a={anchors:new Map,doc:e,keep:!0,mapAsMap:A===!0,mapKeyWarned:!1,maxAliasCount:typeof i=="number"?i:100},r=cr(this,"",a);if(typeof n=="function")for(let{count:s,res:l}of a.anchors.values())n(l,s);return typeof o=="function"?f2(o,{"":r},"",r):r}};var eC=class extends p2{constructor(e){super(C6),this.source=e,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(e,A){let i;A?.aliasResolveCache?i=A.aliasResolveCache:(i=[],n0(e,{Node:(o,a)=>{(ig(a)||d6(a))&&i.push(a)}}),A&&(A.aliasResolveCache=i));let n;for(let o of i){if(o===this)break;o.anchor===this.source&&(n=o)}return n}toJSON(e,A){if(!A)return{source:this.source};let{anchors:i,doc:n,maxAliasCount:o}=A,a=this.resolve(n,A);if(!a){let s=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(s)}let r=i.get(a);if(r||(cr(a,null,A),r=i.get(a)),r?.res===void 0){let s="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(s)}if(o>=0&&(r.count+=1,r.aliasCount===0&&(r.aliasCount=h6(n,a,i)),r.count*r.aliasCount>o)){let s="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(s)}return r.res}toString(e,A,i){let n=`*${this.source}`;if(e){if(E6(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let o=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(o)}if(e.implicitKey)return`${n} `}return n}};function h6(t,e,A){if(ig(e)){let i=e.resolve(t),n=A&&i&&A.get(i);return n?n.count*n.aliasCount:0}else if(go(e)){let i=0;for(let n of e.items){let o=h6(t,n,A);o>i&&(i=o)}return i}else if(vn(e)){let i=h6(t,e.key,A),n=h6(t,e.value,A);return Math.max(i,n)}return 1}var Q6=t=>!t||typeof t!="function"&&typeof t!="object",Pt=(()=>{class t extends p2{constructor(A){super(Sl),this.value=A}toJSON(A,i){return i?.keep?this.value:cr(this.value,A,i)}toString(){return String(this.value)}}return t.BLOCK_FOLDED="BLOCK_FOLDED",t.BLOCK_LITERAL="BLOCK_LITERAL",t.PLAIN="PLAIN",t.QUOTE_DOUBLE="QUOTE_DOUBLE",t.QUOTE_SINGLE="QUOTE_SINGLE",t})();var EcA="tag:yaml.org,2002:";function hcA(t,e,A){if(e){let i=A.filter(o=>o.tag===e),n=i.find(o=>!o.format)??i[0];if(!n)throw new Error(`Tag ${e} not found`);return n}return A.find(i=>i.identify?.(t)&&!i.format)}function tC(t,e,A){if(Pg(t)&&(t=t.contents),xn(t))return t;if(vn(t)){let C=A.schema[zg].createNode?.(A.schema,null,A);return C.items.push(t),C}(t instanceof String||t instanceof Number||t instanceof Boolean||typeof BigInt<"u"&&t instanceof BigInt)&&(t=t.valueOf());let{aliasDuplicateObjects:i,onAnchor:n,onTagObj:o,schema:a,sourceObjects:r}=A,s;if(i&&t&&typeof t=="object"){if(s=r.get(t),s)return s.anchor??(s.anchor=n(t)),new eC(s.anchor);s={anchor:null,node:null},r.set(t,s)}e?.startsWith("!!")&&(e=EcA+e.slice(2));let l=hcA(t,e,a.tags);if(!l){if(t&&typeof t.toJSON=="function"&&(t=t.toJSON()),!t||typeof t!="object"){let C=new Pt(t);return s&&(s.node=C),C}l=t instanceof Map?a[zg]:Symbol.iterator in Object(t)?a[AC]:a[zg]}o&&(o(l),delete A.onTagObj);let g=l?.createNode?l.createNode(A.schema,t,A):typeof l?.nodeClass?.from=="function"?l.nodeClass.from(A.schema,t,A):new Pt(t);return e?g.tag=e:l.default||(g.tag=l.tag),s&&(s.node=g),g}function Tu(t,e,A){let i=A;for(let n=e.length-1;n>=0;--n){let o=e[n];if(typeof o=="number"&&Number.isInteger(o)&&o>=0){let a=[];a[o]=i,i=a}else i=new Map([[o,i]])}return tC(i,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:t,sourceObjects:new Map})}var ZB=t=>t==null||typeof t=="object"&&!!t[Symbol.iterator]().next().done,WB=class extends p2{constructor(e,A){super(e),Object.defineProperty(this,"schema",{value:A,configurable:!0,enumerable:!1,writable:!0})}clone(e){let A=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(A.schema=e),A.items=A.items.map(i=>xn(i)||vn(i)?i.clone(e):i),this.range&&(A.range=this.range.slice()),A}addIn(e,A){if(ZB(e))this.add(A);else{let[i,...n]=e,o=this.get(i,!0);if(go(o))o.addIn(n,A);else if(o===void 0&&this.schema)this.set(i,Tu(this.schema,n,A));else throw new Error(`Expected YAML collection at ${i}. Remaining path: ${n}`)}}deleteIn(e){let[A,...i]=e;if(i.length===0)return this.delete(A);let n=this.get(A,!0);if(go(n))return n.deleteIn(i);throw new Error(`Expected YAML collection at ${A}. Remaining path: ${i}`)}getIn(e,A){let[i,...n]=e,o=this.get(i,!0);return n.length===0?!A&&Vi(o)?o.value:o:go(o)?o.getIn(n,A):void 0}hasAllNullValues(e){return this.items.every(A=>{if(!vn(A))return!1;let i=A.value;return i==null||e&&Vi(i)&&i.value==null&&!i.commentBefore&&!i.comment&&!i.tag})}hasIn(e){let[A,...i]=e;if(i.length===0)return this.has(A);let n=this.get(A,!0);return go(n)?n.hasIn(i):!1}setIn(e,A){let[i,...n]=e;if(n.length===0)this.set(i,A);else{let o=this.get(i,!0);if(go(o))o.setIn(n,A);else if(o===void 0&&this.schema)this.set(i,Tu(this.schema,n,A));else throw new Error(`Expected YAML collection at ${i}. Remaining path: ${n}`)}}};var gJ=t=>t.replace(/^(?!$)(?: $)?/gm,"#");function ng(t,e){return/^\n+$/.test(t)?t.substring(1):e?t.replace(/^(?! *$)/gm,e):t}var o0=(t,e,A)=>t.endsWith(` +`)?ng(A,e):A.includes(` +`)?` +`+ng(A,e):(t.endsWith(" ")?"":" ")+A;var NM="flow",u6="block",Ju="quoted";function Ou(t,e,A="flow",{indentAtStart:i,lineWidth:n=80,minContentWidth:o=20,onFold:a,onOverflow:r}={}){if(!n||n<0)return t;nn-Math.max(2,o)?l.push(0):C=n-i);let I,d,h=!1,E=-1,f=-1,m=-1;A===u6&&(E=cJ(t,E,e.length),E!==-1&&(C=E+s));for(let k;k=t[E+=1];){if(A===Ju&&k==="\\"){switch(f=E,t[E+1]){case"x":E+=3;break;case"u":E+=5;break;case"U":E+=9;break;default:E+=1}m=E}if(k===` +`)A===u6&&(E=cJ(t,E,e.length)),C=E+e.length+s,I=void 0;else{if(k===" "&&d&&d!==" "&&d!==` +`&&d!==" "){let S=t[E+1];S&&S!==" "&&S!==` +`&&S!==" "&&(I=E)}if(E>=C)if(I)l.push(I),C=I+s,I=void 0;else if(A===Ju){for(;d===" "||d===" ";)d=k,k=t[E+=1],h=!0;let S=E>m+1?E-2:f-1;if(g[S])return t;l.push(S),g[S]=!0,C=S+s,I=void 0}else h=!0}d=k}if(h&&r&&r(),l.length===0)return t;a&&a();let v=t.slice(0,l[0]);for(let k=0;k({indentAtStart:e?t.indent.length:t.indentAtStart,lineWidth:t.options.lineWidth,minContentWidth:t.options.minContentWidth}),m6=t=>/^(%|---|\.\.\.)/m.test(t);function QcA(t,e,A){if(!e||e<0)return!1;let i=e-A,n=t.length;if(n<=i)return!1;for(let o=0,a=0;oi)return!0;if(a=o+1,n-a<=i)return!1}return!0}function Yu(t,e){let A=JSON.stringify(t);if(e.options.doubleQuotedAsJSON)return A;let{implicitKey:i}=e,n=e.options.doubleQuotedMinMultiLineLength,o=e.indent||(m6(t)?" ":""),a="",r=0;for(let s=0,l=A[s];l;l=A[++s])if(l===" "&&A[s+1]==="\\"&&A[s+2]==="n"&&(a+=A.slice(r,s)+"\\ ",s+=1,r=s,l="\\"),l==="\\")switch(A[s+1]){case"u":{a+=A.slice(r,s);let g=A.substr(s+2,4);switch(g){case"0000":a+="\\0";break;case"0007":a+="\\a";break;case"000b":a+="\\v";break;case"001b":a+="\\e";break;case"0085":a+="\\N";break;case"00a0":a+="\\_";break;case"2028":a+="\\L";break;case"2029":a+="\\P";break;default:g.substr(0,2)==="00"?a+="\\x"+g.substr(2):a+=A.substr(s,6)}s+=5,r=s+1}break;case"n":if(i||A[s+2]==='"'||A.length +`;let C,I;for(I=A.length;I>0;--I){let b=A[I-1];if(b!==` +`&&b!==" "&&b!==" ")break}let d=A.substring(I),h=d.indexOf(` +`);h===-1?C="-":A===d||h!==d.length-1?(C="+",o&&o()):C="",d&&(A=A.slice(0,-d.length),d[d.length-1]===` +`&&(d=d.slice(0,-1)),d=d.replace(LM,`$&${l}`));let E=!1,f,m=-1;for(f=0;f{x=!0});let z=Ou(`${v}${b}${d}`,l,u6,F);if(!x)return`>${S} +${l}${z}`}return A=A.replace(/\n+/g,`$&${l}`),`|${S} +${l}${v}${A}${d}`}function ucA(t,e,A,i){let{type:n,value:o}=t,{actualString:a,implicitKey:r,indent:s,indentStep:l,inFlow:g}=e;if(r&&o.includes(` +`)||g&&/[[\]{},]/.test(o))return XB(o,e);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(o))return r||g||!o.includes(` +`)?XB(o,e):f6(t,e,A,i);if(!r&&!g&&n!==Pt.PLAIN&&o.includes(` +`))return f6(t,e,A,i);if(m6(o)){if(s==="")return e.forceBlockIndent=!0,f6(t,e,A,i);if(r&&s===l)return XB(o,e)}let C=o.replace(/\n+/g,`$& +${s}`);if(a){let I=E=>E.default&&E.tag!=="tag:yaml.org,2002:str"&&E.test?.test(C),{compat:d,tags:h}=e.doc.schema;if(h.some(I)||d?.some(I))return XB(o,e)}return r?C:Ou(C,s,NM,p6(e,!1))}function M1(t,e,A,i){let{implicitKey:n,inFlow:o}=e,a=typeof t.value=="string"?t:Object.assign({},t,{value:String(t.value)}),{type:r}=t;r!==Pt.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(a.value)&&(r=Pt.QUOTE_DOUBLE);let s=g=>{switch(g){case Pt.BLOCK_FOLDED:case Pt.BLOCK_LITERAL:return n||o?XB(a.value,e):f6(a,e,A,i);case Pt.QUOTE_DOUBLE:return Yu(a.value,e);case Pt.QUOTE_SINGLE:return FM(a.value,e);case Pt.PLAIN:return ucA(a,e,A,i);default:return null}},l=s(r);if(l===null){let{defaultKeyType:g,defaultStringType:C}=e.options,I=n&&g||C;if(l=s(I),l===null)throw new Error(`Unsupported default string type ${I}`)}return l}function w6(t,e){let A=Object.assign({blockQuote:!0,commentString:gJ,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trueStr:"true",verifyAliasOrder:!0},t.schema.toStringOptions,e),i;switch(A.collectionStyle){case"block":i=!1;break;case"flow":i=!0;break;default:i=null}return{anchors:new Set,doc:t,flowCollectionPadding:A.flowCollectionPadding?" ":"",indent:"",indentStep:typeof A.indent=="number"?" ".repeat(A.indent):" ",inFlow:i,options:A}}function fcA(t,e){if(e.tag){let n=t.filter(o=>o.tag===e.tag);if(n.length>0)return n.find(o=>o.format===e.format)??n[0]}let A,i;if(Vi(e)){i=e.value;let n=t.filter(o=>o.identify?.(i));if(n.length>1){let o=n.filter(a=>a.test);o.length>0&&(n=o)}A=n.find(o=>o.format===e.format)??n.find(o=>!o.format)}else i=e,A=t.find(n=>n.nodeClass&&i instanceof n.nodeClass);if(!A){let n=i?.constructor?.name??(i===null?"null":typeof i);throw new Error(`Tag not resolved for ${n} value`)}return A}function pcA(t,e,{anchors:A,doc:i}){if(!i.directives)return"";let n=[],o=(Vi(t)||go(t))&&t.anchor;o&&E6(o)&&(A.add(o),n.push(`&${o}`));let a=t.tag??(e.default?null:e.tag);return a&&n.push(i.directives.tagString(a)),n.join(" ")}function iC(t,e,A,i){if(vn(t))return t.toString(e,A,i);if(ig(t)){if(e.doc.directives)return t.toString(e);if(e.resolvedAliases?.has(t))throw new TypeError("Cannot stringify circular structure without alias nodes");e.resolvedAliases?e.resolvedAliases.add(t):e.resolvedAliases=new Set([t]),t=t.resolve(e.doc)}let n,o=xn(t)?t:e.doc.createNode(t,{onTagObj:s=>n=s});n??(n=fcA(e.doc.schema.tags,o));let a=pcA(o,n,e);a.length>0&&(e.indentAtStart=(e.indentAtStart??0)+a.length+1);let r=typeof n.stringify=="function"?n.stringify(o,e,A,i):Vi(o)?M1(o,e,A,i):o.toString(e,A,i);return a?Vi(o)||r[0]==="{"||r[0]==="["?`${a} ${r}`:`${a} +${e.indent}${r}`:r}function CJ({key:t,value:e},A,i,n){let{allNullValues:o,doc:a,indent:r,indentStep:s,options:{commentString:l,indentSeq:g,simpleKeys:C}}=A,I=xn(t)&&t.comment||null;if(C){if(I)throw new Error("With simple keys, key nodes cannot have comments");if(go(t)||!xn(t)&&typeof t=="object"){let F="With simple keys, collection cannot be used as a key value";throw new Error(F)}}let d=!C&&(!t||I&&e==null&&!A.inFlow||go(t)||(Vi(t)?t.type===Pt.BLOCK_FOLDED||t.type===Pt.BLOCK_LITERAL:typeof t=="object"));A=Object.assign({},A,{allNullValues:!1,implicitKey:!d&&(C||!o),indent:r+s});let h=!1,E=!1,f=iC(t,A,()=>h=!0,()=>E=!0);if(!d&&!A.inFlow&&f.length>1024){if(C)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");d=!0}if(A.inFlow){if(o||e==null)return h&&i&&i(),f===""?"?":d?`? ${f}`:f}else if(o&&!C||e==null&&d)return f=`? ${f}`,I&&!h?f+=o0(f,A.indent,l(I)):E&&n&&n(),f;h&&(I=null),d?(I&&(f+=o0(f,A.indent,l(I))),f=`? ${f} +${r}:`):(f=`${f}:`,I&&(f+=o0(f,A.indent,l(I))));let m,v,k;xn(e)?(m=!!e.spaceBefore,v=e.commentBefore,k=e.comment):(m=!1,v=null,k=null,e&&typeof e=="object"&&(e=a.createNode(e))),A.implicitKey=!1,!d&&!I&&Vi(e)&&(A.indentAtStart=f.length+1),E=!1,!g&&s.length>=2&&!A.inFlow&&!d&&qg(e)&&!e.flow&&!e.tag&&!e.anchor&&(A.indent=A.indent.substring(2));let S=!1,b=iC(e,A,()=>S=!0,()=>E=!0),x=" ";if(I||m||v){if(x=m?` +`:"",v){let F=l(v);x+=` +${ng(F,A.indent)}`}b===""&&!A.inFlow?x===` +`&&k&&(x=` + +`):x+=` +${A.indent}`}else if(!d&&go(e)){let F=b[0],z=b.indexOf(` +`),P=z!==-1,Z=A.inFlow??e.flow??e.items.length===0;if(P||!Z){let tA=!1;if(P&&(F==="&"||F==="!")){let W=b.indexOf(" ");F==="&"&&W!==-1&&Wt===y6||typeof t=="symbol"&&t.description===y6,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new Pt(Symbol(y6)),{addToJSMap:KM}),stringify:()=>y6},IJ=(t,e)=>(Vg.identify(e)||Vi(e)&&(!e.type||e.type===Pt.PLAIN)&&Vg.identify(e.value))&&t?.doc.schema.tags.some(A=>A.tag===Vg.tag&&A.default);function KM(t,e,A){if(A=t&&ig(A)?A.resolve(t.doc):A,qg(A))for(let i of A.items)GM(t,e,i);else if(Array.isArray(A))for(let i of A)GM(t,e,i);else GM(t,e,A)}function GM(t,e,A){let i=t&&ig(A)?A.resolve(t.doc):A;if(!jg(i))throw new Error("Merge sources must be maps or map aliases");let n=i.toJSON(null,t,Map);for(let[o,a]of n)e instanceof Map?e.has(o)||e.set(o,a):e instanceof Set?e.add(o):Object.prototype.hasOwnProperty.call(e,o)||Object.defineProperty(e,o,{value:a,writable:!0,enumerable:!0,configurable:!0});return e}function v6(t,e,{key:A,value:i}){if(xn(A)&&A.addToJSMap)A.addToJSMap(t,e,i);else if(IJ(t,A))KM(t,e,i);else{let n=cr(A,"",t);if(e instanceof Map)e.set(n,cr(i,n,t));else if(e instanceof Set)e.add(n);else{let o=mcA(A,n,t),a=cr(i,o,t);o in e?Object.defineProperty(e,o,{value:a,writable:!0,enumerable:!0,configurable:!0}):e[o]=a}}return e}function mcA(t,e,A){if(e===null)return"";if(typeof e!="object")return String(e);if(xn(t)&&A?.doc){let i=w6(A.doc,{});i.anchors=new Set;for(let o of A.anchors.keys())i.anchors.add(o.anchor);i.inFlow=!0,i.inStringifyKey=!0;let n=t.toString(i);if(!A.mapKeyWarned){let o=JSON.stringify(n);o.length>40&&(o=o.substring(0,36)+'..."'),D6(A.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${o}. Set mapAsMap: true to use object keys.`),A.mapKeyWarned=!0}return n}return JSON.stringify(e)}function $B(t,e,A){let i=tC(t,void 0,A),n=tC(e,void 0,A);return new La(i,n)}var La=class t{constructor(e,A=null){Object.defineProperty(this,xs,{value:xM}),this.key=e,this.value=A}clone(e){let{key:A,value:i}=this;return xn(A)&&(A=A.clone(e)),xn(i)&&(i=i.clone(e)),new t(A,i)}toJSON(e,A){let i=A?.mapAsMap?new Map:{};return v6(A,i,this)}toString(e,A,i){return e?.doc?CJ(this,e,A,i):JSON.stringify(this)}};function M6(t,e,A){return(e.inFlow??t.flow?DcA:wcA)(t,e,A)}function wcA({comment:t,items:e},A,{blockItemPrefix:i,flowChars:n,itemIndent:o,onChompKeep:a,onComment:r}){let{indent:s,options:{commentString:l}}=A,g=Object.assign({},A,{indent:o,type:null}),C=!1,I=[];for(let h=0;hf=null,()=>C=!0);f&&(m+=o0(m,o,l(f))),C&&f&&(C=!1),I.push(i+m)}let d;if(I.length===0)d=n.start+n.end;else{d=I[0];for(let h=1;hf=null);hg||m.includes(` +`))&&(l=!0),C.push(m),g=C.length}let{start:I,end:d}=A;if(C.length===0)return I+d;if(!l){let h=C.reduce((E,f)=>E+f.length+2,2);l=e.options.lineWidth>0&&h>e.options.lineWidth}if(l){let h=I;for(let E of C)h+=E?` +${o}${n}${E}`:` +`;return`${h} +${n}${d}`}else return`${I}${a}${C.join(" ")}${a}${d}`}function b6({indent:t,options:{commentString:e}},A,i,n){if(i&&n&&(i=i.replace(/^\n+/,"")),i){let o=ng(e(i),t);A.push(o.trimStart())}}function m2(t,e){let A=Vi(e)?e.value:e;for(let i of t)if(vn(i)&&(i.key===e||i.key===A||Vi(i.key)&&i.key.value===A))return i}var Ha=class extends WB{static get tagName(){return"tag:yaml.org,2002:map"}constructor(e){super(zg,e),this.items=[]}static from(e,A,i){let{keepUndefined:n,replacer:o}=i,a=new this(e),r=(s,l)=>{if(typeof o=="function")l=o.call(A,s,l);else if(Array.isArray(o)&&!o.includes(s))return;(l!==void 0||n)&&a.items.push($B(s,l,i))};if(A instanceof Map)for(let[s,l]of A)r(s,l);else if(A&&typeof A=="object")for(let s of Object.keys(A))r(s,A[s]);return typeof e.sortMapEntries=="function"&&a.items.sort(e.sortMapEntries),a}add(e,A){let i;vn(e)?i=e:!e||typeof e!="object"||!("key"in e)?i=new La(e,e?.value):i=new La(e.key,e.value);let n=m2(this.items,i.key),o=this.schema?.sortMapEntries;if(n){if(!A)throw new Error(`Key ${i.key} already set`);Vi(n.value)&&Q6(i.value)?n.value.value=i.value:n.value=i.value}else if(o){let a=this.items.findIndex(r=>o(i,r)<0);a===-1?this.items.push(i):this.items.splice(a,0,i)}else this.items.push(i)}delete(e){let A=m2(this.items,e);return A?this.items.splice(this.items.indexOf(A),1).length>0:!1}get(e,A){let n=m2(this.items,e)?.value;return(!A&&Vi(n)?n.value:n)??void 0}has(e){return!!m2(this.items,e)}set(e,A){this.add(new La(e,A),!0)}toJSON(e,A,i){let n=i?new i:A?.mapAsMap?new Map:{};A?.onCreate&&A.onCreate(n);for(let o of this.items)v6(A,n,o);return n}toString(e,A,i){if(!e)return JSON.stringify(this);for(let n of this.items)if(!vn(n))throw new Error(`Map items must all be pairs; found ${JSON.stringify(n)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),M6(this,e,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:e.indent||"",onChompKeep:i,onComment:A})}};var Wg={collection:"map",default:!0,nodeClass:Ha,tag:"tag:yaml.org,2002:map",resolve(t,e){return jg(t)||e("Expected a mapping for this tag"),t},createNode:(t,e,A)=>Ha.from(t,e,A)};var Is=class extends WB{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(e){super(AC,e),this.items=[]}add(e){this.items.push(e)}delete(e){let A=S6(e);return typeof A!="number"?!1:this.items.splice(A,1).length>0}get(e,A){let i=S6(e);if(typeof i!="number")return;let n=this.items[i];return!A&&Vi(n)?n.value:n}has(e){let A=S6(e);return typeof A=="number"&&A=0?e:null}var Zg={collection:"seq",default:!0,nodeClass:Is,tag:"tag:yaml.org,2002:seq",resolve(t,e){return qg(t)||e("Expected a sequence for this tag"),t},createNode:(t,e,A)=>Is.from(t,e,A)};var w2={identify:t=>typeof t=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:t=>t,stringify(t,e,A,i){return e=Object.assign({actualString:!0},e),M1(t,e,A,i)}};var S1={identify:t=>t==null,createNode:()=>new Pt(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new Pt(null),stringify:({source:t},e)=>typeof t=="string"&&S1.test.test(t)?t:e.options.nullStr};var Hu={identify:t=>typeof t=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:t=>new Pt(t[0]==="t"||t[0]==="T"),stringify({source:t,value:e},A){if(t&&Hu.test.test(t)){let i=t[0]==="t"||t[0]==="T";if(e===i)return t}return e?A.options.trueStr:A.options.falseStr}};function ds({format:t,minFractionDigits:e,tag:A,value:i}){if(typeof i=="bigint")return String(i);let n=typeof i=="number"?i:Number(i);if(!isFinite(n))return isNaN(n)?".nan":n<0?"-.inf":".inf";let o=Object.is(i,-0)?"-0":JSON.stringify(i);if(!t&&e&&(!A||A==="tag:yaml.org,2002:float")&&/^\d/.test(o)){let a=o.indexOf(".");a<0&&(a=o.length,o+=".");let r=e-(o.length-a-1);for(;r-- >0;)o+="0"}return o}var k6={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()==="nan"?NaN:t[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:ds},x6={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t),stringify(t){let e=Number(t.value);return isFinite(e)?e.toExponential():ds(t)}},_6={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(t){let e=new Pt(parseFloat(t)),A=t.indexOf(".");return A!==-1&&t[t.length-1]==="0"&&(e.minFractionDigits=t.length-A-1),e},stringify:ds};var R6=t=>typeof t=="bigint"||Number.isInteger(t),UM=(t,e,A,{intAsBigInt:i})=>i?BigInt(t):parseInt(t.substring(e),A);function dJ(t,e,A){let{value:i}=t;return R6(i)&&i>=0?A+i.toString(e):ds(t)}var N6={identify:t=>R6(t)&&t>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(t,e,A)=>UM(t,2,8,A),stringify:t=>dJ(t,8,"0o")},F6={identify:R6,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(t,e,A)=>UM(t,0,10,A),stringify:ds},L6={identify:t=>R6(t)&&t>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(t,e,A)=>UM(t,2,16,A),stringify:t=>dJ(t,16,"0x")};var BJ=[Wg,Zg,w2,S1,Hu,N6,F6,L6,k6,x6,_6];function EJ(t){return typeof t=="bigint"||Number.isInteger(t)}var G6=({value:t})=>JSON.stringify(t),ycA=[{identify:t=>typeof t=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:t=>t,stringify:G6},{identify:t=>t==null,createNode:()=>new Pt(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:G6},{identify:t=>typeof t=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:t=>t==="true",stringify:G6},{identify:EJ,default:!0,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(t,e,{intAsBigInt:A})=>A?BigInt(t):parseInt(t,10),stringify:({value:t})=>EJ(t)?t.toString():JSON.stringify(t)},{identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:t=>parseFloat(t),stringify:G6}],vcA={default:!0,tag:"",test:/^/,resolve(t,e){return e(`Unresolved plain scalar ${JSON.stringify(t)}`),t}},hJ=[Wg,Zg].concat(ycA,vcA);var zu={identify:t=>t instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(t,e){if(typeof atob=="function"){let A=atob(t.replace(/[\n\r]/g,"")),i=new Uint8Array(A.length);for(let n=0;n1&&e("Each pair must have its own sequence indicator");let n=i.items[0]||new La(new Pt(null));if(i.commentBefore&&(n.key.commentBefore=n.key.commentBefore?`${i.commentBefore} +${n.key.commentBefore}`:i.commentBefore),i.comment){let o=n.value??n.key;o.comment=o.comment?`${i.comment} +${o.comment}`:i.comment}i=n}t.items[A]=vn(i)?i:new La(i)}}else e("Expected a sequence for this tag");return t}function JM(t,e,A){let{replacer:i}=A,n=new Is(t);n.tag="tag:yaml.org,2002:pairs";let o=0;if(e&&Symbol.iterator in Object(e))for(let a of e){typeof i=="function"&&(a=i.call(e,String(o++),a));let r,s;if(Array.isArray(a))if(a.length===2)r=a[0],s=a[1];else throw new TypeError(`Expected [key, value] tuple: ${a}`);else if(a&&a instanceof Object){let l=Object.keys(a);if(l.length===1)r=l[0],s=a[r];else throw new TypeError(`Expected tuple with one key, not ${l.length} keys`)}else r=a;n.items.push($B(r,s,A))}return n}var Pu={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:TM,createNode:JM};var OM=(()=>{class t extends Is{constructor(){super(),this.add=Ha.prototype.add.bind(this),this.delete=Ha.prototype.delete.bind(this),this.get=Ha.prototype.get.bind(this),this.has=Ha.prototype.has.bind(this),this.set=Ha.prototype.set.bind(this),this.tag=t.tag}toJSON(A,i){if(!i)return super.toJSON(A);let n=new Map;i?.onCreate&&i.onCreate(n);for(let o of this.items){let a,r;if(vn(o)?(a=cr(o.key,"",i),r=cr(o.value,a,i)):a=cr(o,"",i),n.has(a))throw new Error("Ordered maps must not include duplicate keys");n.set(a,r)}return n}static from(A,i,n){let o=JM(A,i,n),a=new this;return a.items=o.items,a}}return t.tag="tag:yaml.org,2002:omap",t})(),ju={collection:"seq",identify:t=>t instanceof Map,nodeClass:OM,default:!1,tag:"tag:yaml.org,2002:omap",resolve(t,e){let A=TM(t,e),i=[];for(let{key:n}of A.items)Vi(n)&&(i.includes(n.value)?e(`Ordered maps must not include duplicate keys: ${n.value}`):i.push(n.value));return Object.assign(new OM,A)},createNode:(t,e,A)=>OM.from(t,e,A)};function QJ({value:t,source:e},A){return e&&(t?YM:HM).test.test(e)?e:t?A.options.trueStr:A.options.falseStr}var YM={identify:t=>t===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new Pt(!0),stringify:QJ},HM={identify:t=>t===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new Pt(!1),stringify:QJ};var uJ={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()==="nan"?NaN:t[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:ds},fJ={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t.replace(/_/g,"")),stringify(t){let e=Number(t.value);return isFinite(e)?e.toExponential():ds(t)}},pJ={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(t){let e=new Pt(parseFloat(t.replace(/_/g,""))),A=t.indexOf(".");if(A!==-1){let i=t.substring(A+1).replace(/_/g,"");i[i.length-1]==="0"&&(e.minFractionDigits=i.length)}return e},stringify:ds};var qu=t=>typeof t=="bigint"||Number.isInteger(t);function K6(t,e,A,{intAsBigInt:i}){let n=t[0];if((n==="-"||n==="+")&&(e+=1),t=t.substring(e).replace(/_/g,""),i){switch(A){case 2:t=`0b${t}`;break;case 8:t=`0o${t}`;break;case 16:t=`0x${t}`;break}let a=BigInt(t);return n==="-"?BigInt(-1)*a:a}let o=parseInt(t,A);return n==="-"?-1*o:o}function zM(t,e,A){let{value:i}=t;if(qu(i)){let n=i.toString(e);return i<0?"-"+A+n.substr(1):A+n}return ds(t)}var mJ={identify:qu,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(t,e,A)=>K6(t,2,2,A),stringify:t=>zM(t,2,"0b")},wJ={identify:qu,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(t,e,A)=>K6(t,1,8,A),stringify:t=>zM(t,8,"0")},DJ={identify:qu,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(t,e,A)=>K6(t,0,10,A),stringify:ds},yJ={identify:qu,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(t,e,A)=>K6(t,2,16,A),stringify:t=>zM(t,16,"0x")};var PM=(()=>{class t extends Ha{constructor(A){super(A),this.tag=t.tag}add(A){let i;vn(A)?i=A:A&&typeof A=="object"&&"key"in A&&"value"in A&&A.value===null?i=new La(A.key,null):i=new La(A,null),m2(this.items,i.key)||this.items.push(i)}get(A,i){let n=m2(this.items,A);return!i&&vn(n)?Vi(n.key)?n.key.value:n.key:n}set(A,i){if(typeof i!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof i}`);let n=m2(this.items,A);n&&!i?this.items.splice(this.items.indexOf(n),1):!n&&i&&this.items.push(new La(A))}toJSON(A,i){return super.toJSON(A,i,Set)}toString(A,i,n){if(!A)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},A,{allNullValues:!0}),i,n);throw new Error("Set items must all have null values")}static from(A,i,n){let{replacer:o}=n,a=new this(A);if(i&&Symbol.iterator in Object(i))for(let r of i)typeof o=="function"&&(r=o.call(i,r,r)),a.items.push($B(r,null,n));return a}}return t.tag="tag:yaml.org,2002:set",t})(),Vu={collection:"map",identify:t=>t instanceof Set,nodeClass:PM,default:!1,tag:"tag:yaml.org,2002:set",createNode:(t,e,A)=>PM.from(t,e,A),resolve(t,e){if(jg(t)){if(t.hasAllNullValues(!0))return Object.assign(new PM,t);e("Set items must all have null values")}else e("Expected a mapping for this tag");return t}};function jM(t,e){let A=t[0],i=A==="-"||A==="+"?t.substring(1):t,n=a=>e?BigInt(a):Number(a),o=i.replace(/_/g,"").split(":").reduce((a,r)=>a*n(60)+n(r),n(0));return A==="-"?n(-1)*o:o}function vJ(t){let{value:e}=t,A=a=>a;if(typeof e=="bigint")A=a=>BigInt(a);else if(isNaN(e)||!isFinite(e))return ds(t);let i="";e<0&&(i="-",e*=A(-1));let n=A(60),o=[e%n];return e<60?o.unshift(0):(e=(e-o[0])/n,o.unshift(e%n),e>=60&&(e=(e-o[0])/n,o.unshift(e))),i+o.map(a=>String(a).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var U6={identify:t=>typeof t=="bigint"||Number.isInteger(t),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(t,e,{intAsBigInt:A})=>jM(t,A),stringify:vJ},T6={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:t=>jM(t,!1),stringify:vJ},AE={identify:t=>t instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(t){let e=t.match(AE.test);if(!e)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,A,i,n,o,a,r]=e.map(Number),s=e[7]?Number((e[7]+"00").substr(1,3)):0,l=Date.UTC(A,i-1,n,o||0,a||0,r||0,s),g=e[8];if(g&&g!=="Z"){let C=jM(g,!1);Math.abs(C)<30&&(C*=60),l-=6e4*C}return new Date(l)},stringify:({value:t})=>t?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};var qM=[Wg,Zg,w2,S1,YM,HM,mJ,wJ,DJ,yJ,uJ,fJ,pJ,zu,Vg,ju,Pu,Vu,U6,T6,AE];var bJ=new Map([["core",BJ],["failsafe",[Wg,Zg,w2]],["json",hJ],["yaml11",qM],["yaml-1.1",qM]]),MJ={binary:zu,bool:Hu,float:_6,floatExp:x6,floatNaN:k6,floatTime:T6,int:F6,intHex:L6,intOct:N6,intTime:U6,map:Wg,merge:Vg,null:S1,omap:ju,pairs:Pu,seq:Zg,set:Vu,timestamp:AE},SJ={"tag:yaml.org,2002:binary":zu,"tag:yaml.org,2002:merge":Vg,"tag:yaml.org,2002:omap":ju,"tag:yaml.org,2002:pairs":Pu,"tag:yaml.org,2002:set":Vu,"tag:yaml.org,2002:timestamp":AE};function J6(t,e,A){let i=bJ.get(e);if(i&&!t)return A&&!i.includes(Vg)?i.concat(Vg):i.slice();let n=i;if(!n)if(Array.isArray(t))n=[];else{let o=Array.from(bJ.keys()).filter(a=>a!=="yaml11").map(a=>JSON.stringify(a)).join(", ");throw new Error(`Unknown schema "${e}"; use one of ${o} or define customTags array`)}if(Array.isArray(t))for(let o of t)n=n.concat(o);else typeof t=="function"&&(n=t(n.slice()));return A&&(n=n.concat(Vg)),n.reduce((o,a)=>{let r=typeof a=="string"?MJ[a]:a;if(!r){let s=JSON.stringify(a),l=Object.keys(MJ).map(g=>JSON.stringify(g)).join(", ");throw new Error(`Unknown custom tag ${s}; use one of ${l}`)}return o.includes(r)||o.push(r),o},[])}var bcA=(t,e)=>t.keye.key?1:0,Wu=class t{constructor({compat:e,customTags:A,merge:i,resolveKnownTags:n,schema:o,sortMapEntries:a,toStringDefaults:r}){this.compat=Array.isArray(e)?J6(e,"compat"):e?J6(null,e):null,this.name=typeof o=="string"&&o||"core",this.knownTags=n?SJ:{},this.tags=J6(A,this.name,i),this.toStringOptions=r??null,Object.defineProperty(this,zg,{value:Wg}),Object.defineProperty(this,Sl,{value:w2}),Object.defineProperty(this,AC,{value:Zg}),this.sortMapEntries=typeof a=="function"?a:a===!0?bcA:null}clone(){let e=Object.create(t.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}};function kJ(t,e){let A=[],i=e.directives===!0;if(e.directives!==!1&&t.directives){let s=t.directives.toString(t);s?(A.push(s),i=!0):t.directives.docStart&&(i=!0)}i&&A.push("---");let n=w6(t,e),{commentString:o}=n.options;if(t.commentBefore){A.length!==1&&A.unshift("");let s=o(t.commentBefore);A.unshift(ng(s,""))}let a=!1,r=null;if(t.contents){if(xn(t.contents)){if(t.contents.spaceBefore&&i&&A.push(""),t.contents.commentBefore){let g=o(t.contents.commentBefore);A.push(ng(g,""))}n.forceBlockIndent=!!t.comment,r=t.contents.comment}let s=r?void 0:()=>a=!0,l=iC(t.contents,n,()=>r=null,s);r&&(l+=o0(l,"",o(r))),(l[0]==="|"||l[0]===">")&&A[A.length-1]==="---"?A[A.length-1]=`--- ${l}`:A.push(l)}else A.push(iC(t.contents,n));if(t.directives?.docEnd)if(t.comment){let s=o(t.comment);s.includes(` +`)?(A.push("..."),A.push(ng(s,""))):A.push(`... ${s}`)}else A.push("...");else{let s=t.comment;s&&a&&(s=s.replace(/^\n+/,"")),s&&((!a||r)&&A[A.length-1]!==""&&A.push(""),A.push(ng(o(s),"")))}return A.join(` +`)+` +`}var nC=class t{constructor(e,A,i){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,xs,{value:I6});let n=null;typeof A=="function"||Array.isArray(A)?n=A:i===void 0&&A&&(i=A,A=void 0);let o=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:"1.2"},i);this.options=o;let{version:a}=o;i?._directives?(this.directives=i._directives.atDocument(),this.directives.yaml.explicit&&(a=this.directives.yaml.version)):this.directives=new VB({version:a}),this.setSchema(a,i),this.contents=e===void 0?null:this.createNode(e,n,i)}clone(){let e=Object.create(t.prototype,{[xs]:{value:I6}});return e.commentBefore=this.commentBefore,e.comment=this.comment,e.errors=this.errors.slice(),e.warnings=this.warnings.slice(),e.options=Object.assign({},this.options),this.directives&&(e.directives=this.directives.clone()),e.schema=this.schema.clone(),e.contents=xn(this.contents)?this.contents.clone(e.schema):this.contents,this.range&&(e.range=this.range.slice()),e}add(e){eE(this.contents)&&this.contents.add(e)}addIn(e,A){eE(this.contents)&&this.contents.addIn(e,A)}createAlias(e,A){if(!e.anchor){let i=_M(this);e.anchor=!A||i.has(A)?RM(A||"a",i):A}return new eC(e.anchor)}createNode(e,A,i){let n;if(typeof A=="function")e=A.call({"":e},"",e),n=A;else if(Array.isArray(A)){let f=v=>typeof v=="number"||v instanceof String||v instanceof Number,m=A.filter(f).map(String);m.length>0&&(A=A.concat(m)),n=A}else i===void 0&&A&&(i=A,A=void 0);let{aliasDuplicateObjects:o,anchorPrefix:a,flow:r,keepUndefined:s,onTagObj:l,tag:g}=i??{},{onAnchor:C,setAnchors:I,sourceObjects:d}=lJ(this,a||"a"),h={aliasDuplicateObjects:o??!0,keepUndefined:s??!1,onAnchor:C,onTagObj:l,replacer:n,schema:this.schema,sourceObjects:d},E=tC(e,g,h);return r&&go(E)&&(E.flow=!0),I(),E}createPair(e,A,i={}){let n=this.createNode(e,null,i),o=this.createNode(A,null,i);return new La(n,o)}delete(e){return eE(this.contents)?this.contents.delete(e):!1}deleteIn(e){return ZB(e)?this.contents==null?!1:(this.contents=null,!0):eE(this.contents)?this.contents.deleteIn(e):!1}get(e,A){return go(this.contents)?this.contents.get(e,A):void 0}getIn(e,A){return ZB(e)?!A&&Vi(this.contents)?this.contents.value:this.contents:go(this.contents)?this.contents.getIn(e,A):void 0}has(e){return go(this.contents)?this.contents.has(e):!1}hasIn(e){return ZB(e)?this.contents!==void 0:go(this.contents)?this.contents.hasIn(e):!1}set(e,A){this.contents==null?this.contents=Tu(this.schema,[e],A):eE(this.contents)&&this.contents.set(e,A)}setIn(e,A){ZB(e)?this.contents=A:this.contents==null?this.contents=Tu(this.schema,Array.from(e),A):eE(this.contents)&&this.contents.setIn(e,A)}setSchema(e,A={}){typeof e=="number"&&(e=String(e));let i;switch(e){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new VB({version:"1.1"}),i={resolveKnownTags:!1,schema:"yaml-1.1"};break;case"1.2":case"next":this.directives?this.directives.yaml.version=e:this.directives=new VB({version:e}),i={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,i=null;break;default:{let n=JSON.stringify(e);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${n}`)}}if(A.schema instanceof Object)this.schema=A.schema;else if(i)this.schema=new Wu(Object.assign(i,A));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:e,jsonArg:A,mapAsMap:i,maxAliasCount:n,onAnchor:o,reviver:a}={}){let r={anchors:new Map,doc:this,keep:!e,mapAsMap:i===!0,mapKeyWarned:!1,maxAliasCount:typeof n=="number"?n:100},s=cr(this.contents,A??"",r);if(typeof o=="function")for(let{count:l,res:g}of r.anchors.values())o(g,l);return typeof a=="function"?f2(a,{"":s},"",s):s}toJSON(e,A){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:A})}toString(e={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){let A=JSON.stringify(e.indent);throw new Error(`"indent" option must be a positive integer, not ${A}`)}return kJ(this,e)}};function eE(t){if(go(t))return!0;throw new Error("Expected a YAML collection as document contents")}var Zu=class extends Error{constructor(e,A,i,n){super(),this.name=e,this.code=i,this.message=n,this.pos=A}},Xg=class extends Zu{constructor(e,A,i){super("YAMLParseError",e,A,i)}},Xu=class extends Zu{constructor(e,A,i){super("YAMLWarning",e,A,i)}},VM=(t,e)=>A=>{if(A.pos[0]===-1)return;A.linePos=A.pos.map(r=>e.linePos(r));let{line:i,col:n}=A.linePos[0];A.message+=` at line ${i}, column ${n}`;let o=n-1,a=t.substring(e.lineStarts[i-1],e.lineStarts[i]).replace(/[\n\r]+$/,"");if(o>=60&&a.length>80){let r=Math.min(o-39,a.length-79);a="\u2026"+a.substring(r),o-=r-1}if(a.length>80&&(a=a.substring(0,79)+"\u2026"),i>1&&/^ *$/.test(a.substring(0,o))){let r=t.substring(e.lineStarts[i-2],e.lineStarts[i-1]);r.length>80&&(r=r.substring(0,79)+`\u2026 +`),a=r+a}if(/[^ ]/.test(a)){let r=1,s=A.linePos[1];s?.line===i&&s.col>n&&(r=Math.max(1,Math.min(s.col-n,80-o)));let l=" ".repeat(o)+"^".repeat(r);A.message+=`: + +${a} +${l} +`}};function a0(t,{flow:e,indicator:A,next:i,offset:n,onError:o,parentIndent:a,startOnNewline:r}){let s=!1,l=r,g=r,C="",I="",d=!1,h=!1,E=null,f=null,m=null,v=null,k=null,S=null,b=null;for(let z of t)switch(h&&(z.type!=="space"&&z.type!=="newline"&&z.type!=="comma"&&o(z.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),h=!1),E&&(l&&z.type!=="comment"&&z.type!=="newline"&&o(E,"TAB_AS_INDENT","Tabs are not allowed as indentation"),E=null),z.type){case"space":!e&&(A!=="doc-start"||i?.type!=="flow-collection")&&z.source.includes(" ")&&(E=z),g=!0;break;case"comment":{g||o(z,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let P=z.source.substring(1)||" ";C?C+=I+P:C=P,I="",l=!1;break}case"newline":l?C?C+=z.source:(!S||A!=="seq-item-ind")&&(s=!0):I+=z.source,l=!0,d=!0,(f||m)&&(v=z),g=!0;break;case"anchor":f&&o(z,"MULTIPLE_ANCHORS","A node can have at most one anchor"),z.source.endsWith(":")&&o(z.offset+z.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),f=z,b??(b=z.offset),l=!1,g=!1,h=!0;break;case"tag":{m&&o(z,"MULTIPLE_TAGS","A node can have at most one tag"),m=z,b??(b=z.offset),l=!1,g=!1,h=!0;break}case A:(f||m)&&o(z,"BAD_PROP_ORDER",`Anchors and tags must be after the ${z.source} indicator`),S&&o(z,"UNEXPECTED_TOKEN",`Unexpected ${z.source} in ${e??"collection"}`),S=z,l=A==="seq-item-ind"||A==="explicit-key-ind",g=!1;break;case"comma":if(e){k&&o(z,"UNEXPECTED_TOKEN",`Unexpected , in ${e}`),k=z,l=!1,g=!1;break}default:o(z,"UNEXPECTED_TOKEN",`Unexpected ${z.type} token`),l=!1,g=!1}let x=t[t.length-1],F=x?x.offset+x.source.length:n;return h&&i&&i.type!=="space"&&i.type!=="newline"&&i.type!=="comma"&&(i.type!=="scalar"||i.source!=="")&&o(i.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),E&&(l&&E.indent<=a||i?.type==="block-map"||i?.type==="block-seq")&&o(E,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:k,found:S,spaceBefore:s,comment:C,hasNewline:d,anchor:f,tag:m,newlineAfterProp:v,end:F,start:b??F}}function D2(t){if(!t)return null;switch(t.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(t.source.includes(` +`))return!0;if(t.end){for(let e of t.end)if(e.type==="newline")return!0}return!1;case"flow-collection":for(let e of t.items){for(let A of e.start)if(A.type==="newline")return!0;if(e.sep){for(let A of e.sep)if(A.type==="newline")return!0}if(D2(e.key)||D2(e.value))return!0}return!1;default:return!0}}function $u(t,e,A){if(e?.type==="flow-collection"){let i=e.end[0];i.indent===t&&(i.source==="]"||i.source==="}")&&D2(e)&&A(i,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function O6(t,e,A){let{uniqueKeys:i}=t.options;if(i===!1)return!1;let n=typeof i=="function"?i:(o,a)=>o===a||Vi(o)&&Vi(a)&&o.value===a.value;return e.some(o=>n(o.key,A))}var xJ="All mapping items must start at the same column";function _J({composeNode:t,composeEmptyNode:e},A,i,n,o){let a=o?.nodeClass??Ha,r=new a(A.schema);A.atRoot&&(A.atRoot=!1);let s=i.offset,l=null;for(let g of i.items){let{start:C,key:I,sep:d,value:h}=g,E=a0(C,{indicator:"explicit-key-ind",next:I??d?.[0],offset:s,onError:n,parentIndent:i.indent,startOnNewline:!0}),f=!E.found;if(f){if(I&&(I.type==="block-seq"?n(s,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in I&&I.indent!==i.indent&&n(s,"BAD_INDENT",xJ)),!E.anchor&&!E.tag&&!d){l=E.end,E.comment&&(r.comment?r.comment+=` +`+E.comment:r.comment=E.comment);continue}(E.newlineAfterProp||D2(I))&&n(I??C[C.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else E.found?.indent!==i.indent&&n(s,"BAD_INDENT",xJ);A.atKey=!0;let m=E.end,v=I?t(A,I,E,n):e(A,m,C,null,E,n);A.schema.compat&&$u(i.indent,I,n),A.atKey=!1,O6(A,r.items,v)&&n(m,"DUPLICATE_KEY","Map keys must be unique");let k=a0(d??[],{indicator:"map-value-ind",next:h,offset:v.range[2],onError:n,parentIndent:i.indent,startOnNewline:!I||I.type==="block-scalar"});if(s=k.end,k.found){f&&(h?.type==="block-map"&&!k.hasNewline&&n(s,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),A.options.strict&&E.startt&&(t.type==="block-map"||t.type==="block-seq");function NJ({composeNode:t,composeEmptyNode:e},A,i,n,o){let a=i.start.source==="{",r=a?"flow map":"flow sequence",s=o?.nodeClass??(a?Ha:Is),l=new s(A.schema);l.flow=!0;let g=A.atRoot;g&&(A.atRoot=!1),A.atKey&&(A.atKey=!1);let C=i.offset+i.start.source.length;for(let f=0;f0){let f=r0(h,E,A.options.strict,n);f.comment&&(l.comment?l.comment+=` +`+f.comment:l.comment=f.comment),l.range=[i.offset,E,f.offset]}else l.range=[i.offset,E,E];return l}function XM(t,e,A,i,n,o){let a=A.type==="block-map"?_J(t,e,A,i,o):A.type==="block-seq"?RJ(t,e,A,i,o):NJ(t,e,A,i,o),r=a.constructor;return n==="!"||n===r.tagName?(a.tag=r.tagName,a):(n&&(a.tag=n),a)}function FJ(t,e,A,i,n){let o=i.tag,a=o?e.directives.tagName(o.source,I=>n(o,"TAG_RESOLVE_FAILED",I)):null;if(A.type==="block-seq"){let{anchor:I,newlineAfterProp:d}=i,h=I&&o?I.offset>o.offset?I:o:I??o;h&&(!d||d.offsetI.tag===a&&I.collection===r);if(!s){let I=e.schema.knownTags[a];if(I?.collection===r)e.schema.tags.push(Object.assign({},I,{default:!1})),s=I;else return I?n(o,"BAD_COLLECTION_TYPE",`${I.tag} used for ${r} collection, but expects ${I.collection??"scalar"}`,!0):n(o,"TAG_RESOLVE_FAILED",`Unresolved tag: ${a}`,!0),XM(t,e,A,n,a)}let l=XM(t,e,A,n,a,s),g=s.resolve?.(l,I=>n(o,"TAG_RESOLVE_FAILED",I),e.options)??l,C=xn(g)?g:new Pt(g);return C.range=l.range,C.tag=a,s?.format&&(C.format=s.format),C}function $M(t,e,A){let i=e.offset,n=McA(e,t.options.strict,A);if(!n)return{value:"",type:null,comment:"",range:[i,i,i]};let o=n.mode===">"?Pt.BLOCK_FOLDED:Pt.BLOCK_LITERAL,a=e.source?ScA(e.source):[],r=a.length;for(let E=a.length-1;E>=0;--E){let f=a[E][1];if(f===""||f==="\r")r=E;else break}if(r===0){let E=n.chomp==="+"&&a.length>0?` +`.repeat(Math.max(1,a.length-1)):"",f=i+n.length;return e.source&&(f+=e.source.length),{value:E,type:o,comment:n.comment,range:[i,f,f]}}let s=e.indent+n.indent,l=e.offset+n.length,g=0;for(let E=0;Es&&(s=f.length);else{f.length=r;--E)a[E][0].length>s&&(r=E+1);let C="",I="",d=!1;for(let E=0;Es||m[0]===" "?(I===" "?I=` +`:!d&&I===` +`&&(I=` + +`),C+=I+f.slice(s)+m,I=` +`,d=!0):m===""?I===` +`?C+=` +`:I=` +`:(C+=I+m,I=" ",d=!1)}switch(n.chomp){case"-":break;case"+":for(let E=r;EA(i+I,d,h);switch(n){case"scalar":r=Pt.PLAIN,s=kcA(o,l);break;case"single-quoted-scalar":r=Pt.QUOTE_SINGLE,s=xcA(o,l);break;case"double-quoted-scalar":r=Pt.QUOTE_DOUBLE,s=_cA(o,l);break;default:return A(t,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${n}`),{value:"",type:null,comment:"",range:[i,i+o.length,i+o.length]}}let g=i+o.length,C=r0(a,g,e,A);return{value:s,type:r,comment:C.comment,range:[i,g,C.offset]}}function kcA(t,e){let A="";switch(t[0]){case" ":A="a tab character";break;case",":A="flow indicator character ,";break;case"%":A="directive indicator character %";break;case"|":case">":{A=`block scalar indicator ${t[0]}`;break}case"@":case"`":{A=`reserved character ${t[0]}`;break}}return A&&e(0,"BAD_SCALAR_START",`Plain value cannot start with ${A}`),LJ(t)}function xcA(t,e){return(t[t.length-1]!=="'"||t.length===1)&&e(t.length,"MISSING_CHAR","Missing closing 'quote"),LJ(t.slice(1,-1)).replace(/''/g,"'")}function LJ(t){let e,A;try{e=new RegExp(`(.*?)(?o?t.slice(o,i+1):n)}else A+=n}return(t[t.length-1]!=='"'||t.length===1)&&e(t.length,"MISSING_CHAR",'Missing closing "quote'),A}function RcA(t,e){let A="",i=t[e+1];for(;(i===" "||i===" "||i===` +`||i==="\r")&&!(i==="\r"&&t[e+2]!==` +`);)i===` +`&&(A+=` +`),e+=1,i=t[e+1];return A||(A=" "),{fold:A,offset:e}}var NcA={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:` +`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function FcA(t,e,A,i){let n=t.substr(e,A),a=n.length===A&&/^[0-9a-fA-F]+$/.test(n)?parseInt(n,16):NaN;if(isNaN(a)){let r=t.substr(e-2,A+2);return i(e-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${r}`),r}return String.fromCodePoint(a)}function e9(t,e,A,i){let{value:n,type:o,comment:a,range:r}=e.type==="block-scalar"?$M(t,e,i):A9(e,t.options.strict,i),s=A?t.directives.tagName(A.source,C=>i(A,"TAG_RESOLVE_FAILED",C)):null,l;t.options.stringKeys&&t.atKey?l=t.schema[Sl]:s?l=LcA(t.schema,n,s,A,i):e.type==="scalar"?l=GcA(t,n,e,i):l=t.schema[Sl];let g;try{let C=l.resolve(n,I=>i(A??e,"TAG_RESOLVE_FAILED",I),t.options);g=Vi(C)?C:new Pt(C)}catch(C){let I=C instanceof Error?C.message:String(C);i(A??e,"TAG_RESOLVE_FAILED",I),g=new Pt(n)}return g.range=r,g.source=n,o&&(g.type=o),s&&(g.tag=s),l.format&&(g.format=l.format),a&&(g.comment=a),g}function LcA(t,e,A,i,n){if(A==="!")return t[Sl];let o=[];for(let r of t.tags)if(!r.collection&&r.tag===A)if(r.default&&r.test)o.push(r);else return r;for(let r of o)if(r.test?.test(e))return r;let a=t.knownTags[A];return a&&!a.collection?(t.tags.push(Object.assign({},a,{default:!1,test:void 0})),a):(n(i,"TAG_RESOLVE_FAILED",`Unresolved tag: ${A}`,A!=="tag:yaml.org,2002:str"),t[Sl])}function GcA({atKey:t,directives:e,schema:A},i,n,o){let a=A.tags.find(r=>(r.default===!0||t&&r.default==="key")&&r.test?.test(i))||A[Sl];if(A.compat){let r=A.compat.find(s=>s.default&&s.test?.test(i))??A[Sl];if(a.tag!==r.tag){let s=e.tagString(a.tag),l=e.tagString(r.tag),g=`Value may be parsed as either ${s} or ${l}`;o(n,"TAG_RESOLVE_FAILED",g,!0)}}return a}function GJ(t,e,A){if(e){A??(A=e.length);for(let i=A-1;i>=0;--i){let n=e[i];switch(n.type){case"space":case"comment":case"newline":t-=n.source.length;continue}for(n=e[++i];n?.type==="space";)t+=n.source.length,n=e[++i];break}}return t}var KcA={composeNode:t9,composeEmptyNode:Y6};function t9(t,e,A,i){let n=t.atKey,{spaceBefore:o,comment:a,anchor:r,tag:s}=A,l,g=!0;switch(e.type){case"alias":l=UcA(t,e,i),(r||s)&&i(e,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":l=e9(t,e,s,i),r&&(l.anchor=r.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":l=FJ(KcA,t,e,A,i),r&&(l.anchor=r.source.substring(1));break;default:{let C=e.type==="error"?e.message:`Unsupported token (type: ${e.type})`;i(e,"UNEXPECTED_TOKEN",C),l=Y6(t,e.offset,void 0,null,A,i),g=!1}}return r&&l.anchor===""&&i(r,"BAD_ALIAS","Anchor cannot be an empty string"),n&&t.options.stringKeys&&(!Vi(l)||typeof l.value!="string"||l.tag&&l.tag!=="tag:yaml.org,2002:str")&&i(s??e,"NON_STRING_KEY","With stringKeys, all keys must be strings"),o&&(l.spaceBefore=!0),a&&(e.type==="scalar"&&e.source===""?l.comment=a:l.commentBefore=a),t.options.keepSourceTokens&&g&&(l.srcToken=e),l}function Y6(t,e,A,i,{spaceBefore:n,comment:o,anchor:a,tag:r,end:s},l){let g={type:"scalar",offset:GJ(e,A,i),indent:-1,source:""},C=e9(t,g,r,l);return a&&(C.anchor=a.source.substring(1),C.anchor===""&&l(a,"BAD_ALIAS","Anchor cannot be an empty string")),n&&(C.spaceBefore=!0),o&&(C.comment=o,C.range[2]=s),C}function UcA({options:t},{offset:e,source:A,end:i},n){let o=new eC(A.substring(1));o.source===""&&n(e,"BAD_ALIAS","Alias cannot be an empty string"),o.source.endsWith(":")&&n(e+A.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let a=e+A.length,r=r0(i,a,t.strict,n);return o.range=[e,a,r.offset],r.comment&&(o.comment=r.comment),o}function KJ(t,e,{offset:A,start:i,value:n,end:o},a){let r=Object.assign({_directives:e},t),s=new nC(void 0,r),l={atKey:!1,atRoot:!0,directives:s.directives,options:s.options,schema:s.schema},g=a0(i,{indicator:"doc-start",next:n??o?.[0],offset:A,onError:a,parentIndent:0,startOnNewline:!0});g.found&&(s.directives.docStart=!0,n&&(n.type==="block-map"||n.type==="block-seq")&&!g.hasNewline&&a(g.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),s.contents=n?t9(l,n,g,a):Y6(l,g.end,i,null,g,a);let C=s.contents.range[2],I=r0(o,C,!1,a);return I.comment&&(s.comment=I.comment),s.range=[A,C,I.offset],s}function A4(t){if(typeof t=="number")return[t,t+1];if(Array.isArray(t))return t.length===2?t:[t[0],t[1]];let{offset:e,source:A}=t;return[e,e+(typeof A=="string"?A.length:1)]}function UJ(t){let e="",A=!1,i=!1;for(let n=0;n{let a=A4(A);o?this.warnings.push(new Xu(a,i,n)):this.errors.push(new Xg(a,i,n))},this.directives=new VB({version:e.version||"1.2"}),this.options=e}decorate(e,A){let{comment:i,afterEmptyLine:n}=UJ(this.prelude);if(i){let o=e.contents;if(A)e.comment=e.comment?`${e.comment} +${i}`:i;else if(n||e.directives.docStart||!o)e.commentBefore=i;else if(go(o)&&!o.flow&&o.items.length>0){let a=o.items[0];vn(a)&&(a=a.key);let r=a.commentBefore;a.commentBefore=r?`${i} +${r}`:i}else{let a=o.commentBefore;o.commentBefore=a?`${i} +${a}`:i}}A?(Array.prototype.push.apply(e.errors,this.errors),Array.prototype.push.apply(e.warnings,this.warnings)):(e.errors=this.errors,e.warnings=this.warnings),this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:UJ(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,A=!1,i=-1){for(let n of e)yield*Ce(this.next(n));yield*Ce(this.end(A,i))}*next(e){switch(e.type){case"directive":this.directives.add(e.source,(A,i,n)=>{let o=A4(e);o[0]+=A,this.onError(o,"BAD_DIRECTIVE",i,n)}),this.prelude.push(e.source),this.atDirectives=!0;break;case"document":{let A=KJ(this.options,this.directives,e,this.onError);this.atDirectives&&!A.directives.docStart&&this.onError(e,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(A,!1),this.doc&&(yield this.doc),this.doc=A,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(e.source);break;case"error":{let A=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,i=new Xg(A4(e),"UNEXPECTED_TOKEN",A);this.atDirectives||!this.doc?this.errors.push(i):this.doc.errors.push(i);break}case"doc-end":{if(!this.doc){let i="Unexpected doc-end without preceding document";this.errors.push(new Xg(A4(e),"UNEXPECTED_TOKEN",i));break}this.doc.directives.docEnd=!0;let A=r0(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),A.comment){let i=this.doc.comment;this.doc.comment=i?`${i} +${A.comment}`:A.comment}this.doc.range[2]=A.offset;break}default:this.errors.push(new Xg(A4(e),"UNEXPECTED_TOKEN",`Unsupported token ${e.type}`))}}*end(e=!1,A=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){let i=Object.assign({_directives:this.directives},this.options),n=new nC(void 0,i);this.atDirectives&&this.onError(A,"MISSING_CHAR","Missing directives-end indicator line"),n.range=[0,A,A],this.decorate(n,!1),yield n}}};var i9=Symbol("break visit"),TcA=Symbol("skip children"),TJ=Symbol("remove item");function k1(t,e){"type"in t&&t.type==="document"&&(t={start:t.start,value:t.value}),JJ(Object.freeze([]),t,e)}k1.BREAK=i9;k1.SKIP=TcA;k1.REMOVE=TJ;k1.itemAtPath=(t,e)=>{let A=t;for(let[i,n]of e){let o=A?.[i];if(o&&"items"in o)A=o.items[n];else return}return A};k1.parentCollection=(t,e)=>{let A=k1.itemAtPath(t,e.slice(0,-1)),i=e[e.length-1][0],n=A?.[i];if(n&&"items"in n)return n;throw new Error("Parent collection not found")};function JJ(t,e,A){let i=A(e,t);if(typeof i=="symbol")return i;for(let n of["key","value"]){let o=e[n];if(o&&"items"in o){for(let a=0;a":return"block-scalar-header"}return null}function $g(t){switch(t){case void 0:case" ":case` +`:case"\r":case" ":return!0;default:return!1}}var YJ=new Set("0123456789ABCDEFabcdef"),OcA=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),z6=new Set(",[]{}"),YcA=new Set(` ,[]{} +\r `),r9=t=>!t||YcA.has(t),t4=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,A=!1){if(e){if(typeof e!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null}this.atEnd=!A;let i=this.next??"stream";for(;i&&(A||this.hasChars(1));)i=yield*Ce(this.parseNext(i))}atLineEnd(){let e=this.pos,A=this.buffer[e];for(;A===" "||A===" ";)A=this.buffer[++e];return!A||A==="#"||A===` +`?!0:A==="\r"?this.buffer[e+1]===` +`:!1}charAt(e){return this.buffer[this.pos+e]}continueScalar(e){let A=this.buffer[e];if(this.indentNext>0){let i=0;for(;A===" ";)A=this.buffer[++i+e];if(A==="\r"){let n=this.buffer[i+e+1];if(n===` +`||!n&&!this.atEnd)return e+i+1}return A===` +`||i>=this.indentNext||!A&&!this.atEnd?e+i:-1}if(A==="-"||A==="."){let i=this.buffer.substr(e,3);if((i==="---"||i==="...")&&$g(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!="number"||e!==-1&&ethis.indentValue&&!$g(this.charAt(1))&&(this.indentNext=this.indentValue),yield*Ce(this.parseBlockStart())}*parseBlockStart(){let[e,A]=this.peek(2);if(!A&&!this.atEnd)return this.setNext("block-start");if((e==="-"||e==="?"||e===":")&&$g(A)){let i=(yield*Ce(this.pushCount(1)))+(yield*Ce(this.pushSpaces(!0)));return this.indentNext=this.indentValue+1,this.indentValue+=i,yield*Ce(this.parseBlockStart())}return"doc"}*parseDocument(){yield*Ce(this.pushSpaces(!0));let e=this.getLine();if(e===null)return this.setNext("doc");let A=yield*Ce(this.pushIndicators());switch(e[A]){case"#":yield*Ce(this.pushCount(e.length-A));case void 0:return yield*Ce(this.pushNewline()),yield*Ce(this.parseLineStart());case"{":case"[":return yield*Ce(this.pushCount(1)),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*Ce(this.pushCount(1)),"doc";case"*":return yield*Ce(this.pushUntil(r9)),"doc";case'"':case"'":return yield*Ce(this.parseQuotedScalar());case"|":case">":return A+=yield*Ce(this.parseBlockScalarHeader()),A+=yield*Ce(this.pushSpaces(!0)),yield*Ce(this.pushCount(e.length-A)),yield*Ce(this.pushNewline()),yield*Ce(this.parseBlockScalar());default:return yield*Ce(this.parsePlainScalar())}}*parseFlowCollection(){let e,A,i=-1;do e=yield*Ce(this.pushNewline()),e>0?(A=yield*Ce(this.pushSpaces(!1)),this.indentValue=i=A):A=0,A+=yield*Ce(this.pushSpaces(!0));while(e+A>0);let n=this.getLine();if(n===null)return this.setNext("flow");if((i!==-1&&i"0"&&A<="9")this.blockScalarIndent=Number(A)-1;else if(A!=="-")break}return yield*Ce(this.pushUntil(A=>$g(A)||A==="#"))}*parseBlockScalar(){let e=this.pos-1,A=0,i;A:for(let o=this.pos;i=this.buffer[o];++o)switch(i){case" ":A+=1;break;case` +`:e=o,A=0;break;case"\r":{let a=this.buffer[o+1];if(!a&&!this.atEnd)return this.setNext("block-scalar");if(a===` +`)break}default:break A}if(!i&&!this.atEnd)return this.setNext("block-scalar");if(A>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=A:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let o=this.continueScalar(e+1);if(o===-1)break;e=this.buffer.indexOf(` +`,o)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext("block-scalar");e=this.buffer.length}}let n=e+1;for(i=this.buffer[n];i===" ";)i=this.buffer[++n];if(i===" "){for(;i===" "||i===" "||i==="\r"||i===` +`;)i=this.buffer[++n];e=n-1}else if(!this.blockScalarKeep)do{let o=e-1,a=this.buffer[o];a==="\r"&&(a=this.buffer[--o]);let r=o;for(;a===" ";)a=this.buffer[--o];if(a===` +`&&o>=this.pos&&o+1+A>r)e=o;else break}while(!0);return yield H6,yield*Ce(this.pushToIndex(e+1,!0)),yield*Ce(this.parseLineStart())}*parsePlainScalar(){let e=this.flowLevel>0,A=this.pos-1,i=this.pos-1,n;for(;n=this.buffer[++i];)if(n===":"){let o=this.buffer[i+1];if($g(o)||e&&z6.has(o))break;A=i}else if($g(n)){let o=this.buffer[i+1];if(n==="\r"&&(o===` +`?(i+=1,n=` +`,o=this.buffer[i+1]):A=i),o==="#"||e&&z6.has(o))break;if(n===` +`){let a=this.continueScalar(i+1);if(a===-1)break;i=Math.max(i,a-2)}}else{if(e&&z6.has(n))break;A=i}return!n&&!this.atEnd?this.setNext("plain-scalar"):(yield H6,yield*Ce(this.pushToIndex(A+1,!0)),e?"flow":"doc")}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,A){let i=this.buffer.slice(this.pos,e);return i?(yield i,this.pos+=i.length,i.length):(A&&(yield""),0)}*pushIndicators(){switch(this.charAt(0)){case"!":return(yield*Ce(this.pushTag()))+(yield*Ce(this.pushSpaces(!0)))+(yield*Ce(this.pushIndicators()));case"&":return(yield*Ce(this.pushUntil(r9)))+(yield*Ce(this.pushSpaces(!0)))+(yield*Ce(this.pushIndicators()));case"-":case"?":case":":{let e=this.flowLevel>0,A=this.charAt(1);if($g(A)||e&&z6.has(A))return e?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,(yield*Ce(this.pushCount(1)))+(yield*Ce(this.pushSpaces(!0)))+(yield*Ce(this.pushIndicators()))}}return 0}*pushTag(){if(this.charAt(1)==="<"){let e=this.pos+2,A=this.buffer[e];for(;!$g(A)&&A!==">";)A=this.buffer[++e];return yield*Ce(this.pushToIndex(A===">"?e+1:e,!1))}else{let e=this.pos+1,A=this.buffer[e];for(;A;)if(OcA.has(A))A=this.buffer[++e];else if(A==="%"&&YJ.has(this.buffer[e+1])&&YJ.has(this.buffer[e+2]))A=this.buffer[e+=3];else break;return yield*Ce(this.pushToIndex(e,!1))}}*pushNewline(){let e=this.buffer[this.pos];return e===` +`?yield*Ce(this.pushCount(1)):e==="\r"&&this.charAt(1)===` +`?yield*Ce(this.pushCount(2)):0}*pushSpaces(e){let A=this.pos-1,i;do i=this.buffer[++A];while(i===" "||e&&i===" ");let n=A-this.pos;return n>0&&(yield this.buffer.substr(this.pos,n),this.pos=A),n}*pushUntil(e){let A=this.pos,i=this.buffer[A];for(;!e(i);)i=this.buffer[++A];return yield*Ce(this.pushToIndex(A,!1))}};var i4=class{constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let A=0,i=this.lineStarts.length;for(;A>1;this.lineStarts[o]=0;)switch(t[e].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break A}for(;t[++e]?.type==="space";);return t.splice(e,t.length)}function zJ(t){if(t.start.type==="flow-seq-start")for(let e of t.items)e.sep&&!e.value&&!y2(e.start,"explicit-key-ind")&&!y2(e.sep,"map-value-ind")&&(e.key&&(e.value=e.key),delete e.key,PJ(e.value)?e.value.end?Array.prototype.push.apply(e.value.end,e.sep):e.value.end=e.sep:Array.prototype.push.apply(e.start,e.sep),delete e.sep)}var n4=class{constructor(e){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new t4,this.onNewLine=e}*parse(e,A=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let i of this.lexer.lex(e,A))yield*Ce(this.next(i));A||(yield*Ce(this.end()))}*next(e){if(this.source=e,this.atScalar){this.atScalar=!1,yield*Ce(this.step()),this.offset+=e.length;return}let A=OJ(e);if(A)if(A==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=A,yield*Ce(this.step()),A){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+e.length);break;case"space":this.atNewLine&&e[0]===" "&&(this.indent+=e.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=e.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=e.length}else{let i=`Not a YAML token: ${e}`;yield*Ce(this.pop({type:"error",offset:this.offset,message:i,source:e})),this.offset+=e.length}}*end(){for(;this.stack.length>0;)yield*Ce(this.pop())}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let e=this.peek(1);if(this.type==="doc-end"&&e?.type!=="doc-end"){for(;this.stack.length>0;)yield*Ce(this.pop());this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!e)return yield*Ce(this.stream());switch(e.type){case"document":return yield*Ce(this.document(e));case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*Ce(this.scalar(e));case"block-scalar":return yield*Ce(this.blockScalar(e));case"block-map":return yield*Ce(this.blockMap(e));case"block-seq":return yield*Ce(this.blockSequence(e));case"flow-collection":return yield*Ce(this.flowCollection(e));case"doc-end":return yield*Ce(this.documentEnd(e))}yield*Ce(this.pop())}peek(e){return this.stack[this.stack.length-e]}*pop(e){let A=e??this.stack.pop();if(!A)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield A;else{let i=this.peek(1);switch(A.type==="block-scalar"?A.indent="indent"in i?i.indent:0:A.type==="flow-collection"&&i.type==="document"&&(A.indent=0),A.type==="flow-collection"&&zJ(A),i.type){case"document":i.value=A;break;case"block-scalar":i.props.push(A);break;case"block-map":{let n=i.items[i.items.length-1];if(n.value){i.items.push({start:[],key:A,sep:[]}),this.onKeyLine=!0;return}else if(n.sep)n.value=A;else{Object.assign(n,{key:A,sep:[]}),this.onKeyLine=!n.explicitKey;return}break}case"block-seq":{let n=i.items[i.items.length-1];n.value?i.items.push({start:[],value:A}):n.value=A;break}case"flow-collection":{let n=i.items[i.items.length-1];!n||n.value?i.items.push({start:[],key:A,sep:[]}):n.sep?n.value=A:Object.assign(n,{key:A,sep:[]});return}default:yield*Ce(this.pop()),yield*Ce(this.pop(A))}if((i.type==="document"||i.type==="block-map"||i.type==="block-seq")&&(A.type==="block-map"||A.type==="block-seq")){let n=A.items[A.items.length-1];n&&!n.sep&&!n.value&&n.start.length>0&&HJ(n.start)===-1&&(A.indent===0||n.start.every(o=>o.type!=="comment"||o.indent=e.indent){let i=!this.onKeyLine&&this.indent===e.indent,n=i&&(A.sep||A.explicitKey)&&this.type!=="seq-item-ind",o=[];if(n&&A.sep&&!A.value){let a=[];for(let r=0;re.indent&&(a.length=0);break;default:a.length=0}}a.length>=2&&(o=A.sep.splice(a[1]))}switch(this.type){case"anchor":case"tag":n||A.value?(o.push(this.sourceToken),e.items.push({start:o}),this.onKeyLine=!0):A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case"explicit-key-ind":!A.sep&&!A.explicitKey?(A.start.push(this.sourceToken),A.explicitKey=!0):n||A.value?(o.push(this.sourceToken),e.items.push({start:o,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(A.explicitKey)if(A.sep)if(A.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(y2(A.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]});else if(PJ(A.key)&&!y2(A.sep,"newline")){let a=tE(A.start),r=A.key,s=A.sep;s.push(this.sourceToken),delete A.key,delete A.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:a,key:r,sep:s}]})}else o.length>0?A.sep=A.sep.concat(o,this.sourceToken):A.sep.push(this.sourceToken);else if(y2(A.start,"newline"))Object.assign(A,{key:null,sep:[this.sourceToken]});else{let a=tE(A.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:a,key:null,sep:[this.sourceToken]}]})}else A.sep?A.value||n?e.items.push({start:o,key:null,sep:[this.sourceToken]}):y2(A.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):A.sep.push(this.sourceToken):Object.assign(A,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let a=this.flowScalar(this.type);n||A.value?(e.items.push({start:o,key:a,sep:[]}),this.onKeyLine=!0):A.sep?this.stack.push(a):(Object.assign(A,{key:a,sep:[]}),this.onKeyLine=!0);return}default:{let a=this.startBlockValue(e);if(a){if(a.type==="block-seq"){if(!A.explicitKey&&A.sep&&!y2(A.sep,"newline")){yield*Ce(this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source}));return}}else i&&e.items.push({start:o});this.stack.push(a);return}}}}yield*Ce(this.pop()),yield*Ce(this.step())}*blockSequence(e){let A=e.items[e.items.length-1];switch(this.type){case"newline":if(A.value){let i="end"in A.value?A.value.end:void 0;(Array.isArray(i)?i[i.length-1]:void 0)?.type==="comment"?i?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else A.start.push(this.sourceToken);return;case"space":case"comment":if(A.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(A.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){Array.prototype.push.apply(n,A.start),n.push(this.sourceToken),e.items.pop();return}}A.start.push(this.sourceToken)}return;case"anchor":case"tag":if(A.value||this.indent<=e.indent)break;A.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;A.value||y2(A.start,"seq-item-ind")?e.items.push({start:[this.sourceToken]}):A.start.push(this.sourceToken);return}if(this.indent>e.indent){let i=this.startBlockValue(e);if(i){this.stack.push(i);return}}yield*Ce(this.pop()),yield*Ce(this.step())}*flowCollection(e){let A=e.items[e.items.length-1];if(this.type==="flow-error-end"){let i;do yield*Ce(this.pop()),i=this.peek(1);while(i?.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!A||A.sep?e.items.push({start:[this.sourceToken]}):A.start.push(this.sourceToken);return;case"map-value-ind":!A||A.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):A.sep?A.sep.push(this.sourceToken):Object.assign(A,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!A||A.value?e.items.push({start:[this.sourceToken]}):A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let n=this.flowScalar(this.type);!A||A.value?e.items.push({start:[],key:n,sep:[]}):A.sep?this.stack.push(n):Object.assign(A,{key:n,sep:[]});return}case"flow-map-end":case"flow-seq-end":e.end.push(this.sourceToken);return}let i=this.startBlockValue(e);i?this.stack.push(i):(yield*Ce(this.pop()),yield*Ce(this.step()))}else{let i=this.peek(2);if(i.type==="block-map"&&(this.type==="map-value-ind"&&i.indent===e.indent||this.type==="newline"&&!i.items[i.items.length-1].sep))yield*Ce(this.pop()),yield*Ce(this.step());else if(this.type==="map-value-ind"&&i.type!=="flow-collection"){let n=P6(i),o=tE(n);zJ(e);let a=e.end.splice(1,e.end.length);a.push(this.sourceToken);let r={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:o,key:e,sep:a}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=r}else yield*Ce(this.lineEnd(e))}}flowScalar(e){if(this.onNewLine){let A=this.source.indexOf(` +`)+1;for(;A!==0;)this.onNewLine(this.offset+A),A=this.source.indexOf(` +`,A)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let A=P6(e),i=tE(A);return i.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let A=P6(e),i=tE(A);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,A){return this.type!=="comment"||this.indent<=A?!1:e.every(i=>i.type==="newline"||i.type==="space")}*documentEnd(e){this.type!=="doc-mode"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*Ce(this.pop())))}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*Ce(this.pop()),yield*Ce(this.step());break;case"newline":this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*Ce(this.pop()))}}};function HcA(t){let e=t.prettyErrors!==!1;return{lineCounter:t.lineCounter||e&&new i4||null,prettyErrors:e}}function jJ(t,e={}){let{lineCounter:A,prettyErrors:i}=HcA(e),n=new n4(A?.addNewLine),o=new e4(e),a=null;for(let r of o.compose(n.parse(t),!0,t.length))if(!a)a=r;else if(a.options.logLevel!=="silent"){a.errors.push(new Xg(r.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return i&&A&&(a.errors.forEach(VM(t,A)),a.warnings.forEach(VM(t,A))),a}function iE(t,e,A){let i;typeof e=="function"?i=e:A===void 0&&e&&typeof e=="object"&&(A=e);let n=jJ(t,A);if(!n)return null;if(n.warnings.forEach(o=>D6(n.options.logLevel,o)),n.errors.length>0){if(n.options.logLevel!=="silent")throw n.errors[0];n.errors=[]}return n.toJS(Object.assign({reviver:i},A))}function s9(t,e,A){let i=null;if(typeof e=="function"||Array.isArray(e)?i=e:A===void 0&&e&&(A=e),typeof A=="string"&&(A=A.length),typeof A=="number"){let n=Math.round(A);A=n<1?void 0:n>8?{indent:8}:{indent:n}}if(t===void 0){let{keepUndefined:n}=A??e??{};if(!n)return}return Pg(t)&&!i?t.toString(A):new nC(t,i,A).toString(A)}var s0=class t{static generateYamlFile(e,A,i,n,o=new Set){if(o.has(e.name))return;o.add(e.name);let a=e.isRoot?"root_agent.yaml":`${e.name}.yaml`,r=`${i}/${a}`,s=e.sub_agents?e.sub_agents.map(h=>({config_path:`./${h.name}.yaml`})):[],l={name:e.name,model:e.model,agent_class:e.agent_class,description:e.description||"",instruction:e.instruction,sub_agents:s,tools:t.buildToolsConfig(e.tools,n)};(!e.description||e.description.trim()==="")&&delete l.description,e.agent_class!="LlmAgent"&&(delete l.model,delete l.instruction,delete l.tools),e.agent_class==="LoopAgent"&&e.max_iterations&&(l.max_iterations=e.max_iterations);let g=t.buildCallbacksConfig(e.callbacks);Object.keys(g).length>0&&Object.assign(l,g);let C=s9(l),I=new Blob([C],{type:"application/x-yaml"}),d=new File([I],r,{type:"application/x-yaml"});A.append("files",d);for(let h of e.sub_agents??[])t.generateYamlFile(h,A,i,n,o);if(e.tools){for(let h of e.tools)if(h.toolType==="Agent Tool"){let E=h.toolAgentName||h.name;if(!E||E==="undefined"||E.trim()==="")continue;let f=n.get(E);f&&t.generateYamlFile(f,A,i,n,o)}}}static buildToolsConfig(e,A){return!e||e.length===0?[]:e.map(i=>{let n={name:i.name};if(i.toolType==="Agent Tool"){n.name="AgentTool";let o=i.toolAgentName||i.name;if(!o||o==="undefined"||o.trim()==="")return null;let a=A.get(o);return n.args={agent:{config_path:`./${o}.yaml`},skip_summarization:a?.skip_summarization||!1},n}return i.args&&Object.keys(i.args).some(a=>{let r=i.args[a];return r!=null&&r!==""})&&(n.args=i.args),n}).filter(i=>i!==null)}static buildCallbacksConfig(e){if(!e||e.length===0)return{};let A={};return e.forEach(i=>{let n=`${i.type}_callbacks`;A[n]||(A[n]=[]),A[n].push({name:i.name})}),A}};function PcA(t,e){t&1&&(B(0,"mat-hint",3),y(1," Start with a letter or underscore, and contain only letters, digits, and underscores. "),Q())}var j6=class t{constructor(e,A){this.data=e;this.dialogRef=A}newAppName="";agentService=w($s);_snackBar=w(h2);router=w(ls);isNameValid(){let e=this.newAppName.trim();return!(!e||!/^[a-zA-Z_]/.test(e)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))}createNewApp(){let e=this.newAppName.trim();if(!this.isNameValid()){this._snackBar.open("App name must start with a letter or underscore and can only contain letters, digits, and underscores.","OK");return}if(this.data.existingAppNames.includes(e)){this._snackBar.open("App name already exists. Please choose a different name.","OK");return}let A={agent_class:"LlmAgent",instruction:"You are the root agent that coordinates other agents.",isRoot:!0,model:"gemini-2.5-flash",name:e,sub_agents:[],tools:[]},i=new FormData,n=new Map;s0.generateYamlFile(A,i,e,n),this.agentService.agentBuildTmp(i).subscribe(o=>{o?(this.router.navigate(["/"],{queryParams:{app:e,mode:"builder"}}).then(()=>{window.location.reload()}),this.dialogRef.close(!0)):this._snackBar.open("Something went wrong, please try again","OK")})}static \u0275fac=function(A){return new(A||t)(ct(qo),ct(lo))};static \u0275cmp=SA({type:t,selectors:[["app-add-item-dialog"]],decls:10,vars:3,consts:[["mat-dialog-title","",1,"new-app-title"],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],[1,"validation-hint"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click","disabled"]],template:function(A,i){A&1&&(B(0,"h2",0),y(1,"Create a new app"),Q(),B(2,"mat-form-field",1)(3,"input",2),Di("ngModelChange",function(o){return Bi(i.newAppName,o)||(i.newAppName=o),o}),U("keydown.enter",function(){return i.createNewApp()}),Q(),O(4,PcA,2,0,"mat-hint",3),Q(),B(5,"mat-dialog-actions",4)(6,"button",5),y(7,"Cancel"),Q(),B(8,"button",6),U("click",function(){return i.createNewApp()}),y(9," Create "),Q()()),A&2&&(u(3),wi("ngModel",i.newAppName),u(),Y(i.isNameValid()?-1:4),u(4),H("disabled",!i.isNameValid()))},dependencies:[fa,Ko,ua,ln,Dn,yn,ko,pa,pi,B2,s1],styles:[".new-app-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-subhead-color)!important;font-family:Google Sans;font-size:24px}.validation-hint[_ngcontent-%COMP%]{font-size:12px;color:var(--mdc-dialog-supporting-text-color)}"]})};function nE(t,e,A){let i=typeof t=="string"?document.querySelector(t):t;if(!i)return;i.querySelectorAll("g.node").forEach(o=>{let a=o,s=o.querySelector("title")?.textContent||"";s==="__LEGEND__"||s==="__START__"||s==="__END__"||a.classList.contains("unvisited-node")||A&&!A.has(s)||(a.style.cursor="pointer",a.addEventListener("mouseenter",()=>{let l=o.querySelector("ellipse, polygon, path, rect");l&&(l.style.stroke="#42A5F5",l.style.strokeWidth="3")}),a.addEventListener("mouseleave",()=>{let l=o.querySelector("ellipse, polygon, path, rect");l&&(l.style.stroke="",l.style.strokeWidth="")}),e&&a.addEventListener("click",l=>{let C=o.querySelector("title")?.textContent||"";C&&e(C,l)}))})}function VJ(t,e,A={}){let{ySpacing:i=200,xSpacing:n=350,startX:o=400,startY:a=100}=A,r=t.map(m=>m.name||m.agent?.name||""),s=new Map,l=new Map;r.forEach(m=>{s.set(m,[]),l.set(m,0)}),e.forEach(m=>{let v=m.from_node?.name||m.from_node?.agent?.name,k=m.to_node?.name||m.to_node?.agent?.name;v&&k&&(s.get(v)?.push(k),l.set(k,(l.get(k)||0)+1))});let g=new Map,C=[],I=new Map(l),d=new Set;for(r.forEach(m=>{I.get(m)===0&&(C.push(m),g.set(m,0),d.add(m))});C.length>0;){let m=C.shift(),v=g.get(m)||0;s.get(m)?.forEach(k=>{let S=g.get(k);if(S!==void 0&&S<=v)return;let b=v+1;S===void 0&&g.set(k,b);let x=I.get(k)||0;I.set(k,x-1),I.get(k)===0&&!d.has(k)&&(C.push(k),d.add(k))})}let h=Math.max(...Array.from(g.values()),0);r.forEach(m=>{g.has(m)||(g.set(m,h+1),h++)});let E=new Map;g.forEach((m,v)=>{E.has(m)||E.set(m,[]),E.get(m)?.push(v)});let f=new Map;return t.forEach(m=>{let v=m.name||m.agent?.name||"",k=g.get(v)||0,S=E.get(k)||[],b=S.indexOf(v),x=S.length,F=(b-(x-1)/2)*n;f.set(v,{x:o+F,y:a+k*i})}),{levels:g,nodesByLevel:E,positions:f}}function Ac(t,e=""){return t?.name||t?.agent?.name||e}function WJ(t){switch(t){case"start":return"play_arrow";case"function":return"code";case"tool":return"build";case"join":return"merge";default:return"smart_toy"}}function ZJ(t){switch(t){case"start":return"Start";case"function":return"Function";case"tool":return"Tool";case"join":return"Join";default:return"Agent"}}var q6={ySpacing:200,xSpacing:350,startX:400,startY:100};function XJ(t){return t.map(e=>e.name).join("/")}function oC(t){return!!(t.graph||t.nodes||t.sub_agents&&t.sub_agents.length>0)}function l9(t){return t.graph?.nodes?t.graph.nodes:t.nodes?t.nodes:[]}function oE(t,e){if(t.nodes){let A=t.nodes.find(i=>i.name===e);if(A)return A}if(t.graph?.nodes){let A=t.graph.nodes.find(i=>i.name===e);if(A)return A}if(t.sub_agents){let A=t.sub_agents.find(i=>i.name===e);if(A)return A}return null}function $J(t,e){let A=e.split("/"),i=[{name:t.name,data:t}],n=t;for(let o=1;oAc(l)===a);if(s)i.push({name:a,data:s}),n=s;else{console.warn(`Could not find node '${a}' in path '${e}'`);break}}return i}function jcA(t,e){t&1&&(B(0,"mat-icon",20),y(1,"chevron_right"),Q())}function qcA(t,e){if(t&1){let A=QA();O(0,jcA,2,0,"mat-icon",20),B(1,"button",21),U("click",function(){let n=T(A).$index,o=p(2);return J(o.navigateToLevel(n))}),y(2),Q()}if(t&2){let A=e.$implicit,i=e.$index,n=p(2);Y(i>0?0:-1),u(),RA("active",i===n.breadcrumbs().length-1),H("disabled",i===n.breadcrumbs().length-1),u(),ue(" ",A," ")}}function VcA(t,e){if(t&1&&(B(0,"div",3)(1,"span"),y(2,"Agent Structure:"),Q(),B(3,"button",19),y(4),Q(),B(5,"mat-icon",20),y(6,"chevron_right"),Q(),Ue(7,qcA,3,5,null,null,ws),Q()),t&2){let A=p();u(4),lA(A.appName),u(3),Te(A.breadcrumbs())}}function WcA(t,e){t&1&&(B(0,"div",15),hA(1,"mat-spinner",22),B(2,"p"),y(3,"Loading agent structure..."),Q()())}function ZcA(t,e){if(t&1&&(B(0,"div",16)(1,"mat-icon",23),y(2,"error_outline"),Q(),B(3,"p",24),y(4),Q()()),t&2){let A=p();u(4),lA(A.errorMessage())}}function XcA(t,e){if(t&1){let A=QA();B(0,"div",25),U("wheel",function(n){T(A);let o=p();return J(o.onWheel(n))})("mousedown",function(n){T(A);let o=p();return J(o.onMouseDown(n))})("mousemove",function(n){T(A);let o=p();return J(o.onMouseMove(n))})("mouseup",function(){T(A);let n=p();return J(n.onMouseUp())})("mouseleave",function(){T(A);let n=p();return J(n.onMouseUp())}),Q()}if(t&2){let A=p();H("innerHTML",A.renderedGraph(),Gc)}}function $cA(t,e){t&1&&(B(0,"div",18)(1,"mat-icon",26),y(2,"account_tree"),Q(),B(3,"p"),y(4,"Agent structure graph not available."),Q()())}var V6=class t{appName;preloadedAppData;preloadedLightGraphSvg;preloadedDarkGraphSvg;startPath;close=new LA;agentService=w($s);graphService=w(OB);sanitizer=w(Cs);themeService=w(eg);renderedGraph=bA(null);isLoading=bA(!0);errorMessage=bA(null);fullAppData=null;navigationStack=[];breadcrumbs=bA([]);isPanning=!1;wasDragging=!1;dragStartX=0;dragStartY=0;startPanX=0;startPanY=0;scale=1;translateX=0;translateY=0;lastMousedownTarget=null;onOverlayMouseDown(e){this.lastMousedownTarget=e.target}onBackdropClick(e){if(this.wasDragging||this.lastMousedownTarget&&(this.lastMousedownTarget.closest("svg")||this.lastMousedownTarget.closest(".overlay-header")||this.lastMousedownTarget.closest(".loading-container")||this.lastMousedownTarget.closest(".error-container")||this.lastMousedownTarget.closest(".no-graph-container")))return;let A=e.target;!A.closest("svg")&&!A.closest(".overlay-header")&&!A.closest(".loading-container")&&!A.closest(".error-container")&&!A.closest(".no-graph-container")&&this.close.emit()}ngOnInit(){this.loadAgentGraph()}loadAgentGraph(){if(this.isLoading.set(!0),this.errorMessage.set(null),this.renderedGraph.set(null),this.preloadedAppData){if(this.fullAppData=this.preloadedAppData,this.navigationStack=[{name:this.fullAppData.root_agent?.name||this.appName,data:this.fullAppData.root_agent}],this.startPath){let e=this.fullAppData.root_agent,A=this.startPath.split("/");for(let i of A){if(!i)continue;let n=oE(e,i);if(n)this.navigationStack.push({name:i,data:n}),e=n;else break}}this.updateBreadcrumbs(),this.renderCurrentLevel();return}this.agentService.getAppInfo(this.appName).subscribe({next:e=>{if(this.fullAppData=e,this.navigationStack=[{name:e.root_agent?.name||this.appName,data:e.root_agent}],this.startPath){let A=this.fullAppData.root_agent,i=this.startPath.split("/");for(let n of i){if(!n)continue;let o=oE(A,n);if(o)this.navigationStack.push({name:n,data:o}),A=o;else break}}this.updateBreadcrumbs(),this.renderCurrentLevel()},error:e=>{console.error("Error loading app data:",e),this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1)}})}renderCurrentLevel(){let e=this.themeService.currentTheme()==="dark",A=this.getCurrentPath(),i=e?this.preloadedDarkGraphSvg:this.preloadedLightGraphSvg,n=i?i[A]:null;if(n){this.renderedGraph.set(this.sanitizer.bypassSecurityTrustHtml(n)),this.isLoading.set(!1),setTimeout(()=>{let o=this.getExpandableNodes();nE(".svg-container",a=>{this.wasDragging||this.onNodeClick(a)},o),this.initializeSvgTransform()},50);return}this.agentService.getAppGraphImage(this.appName,e,A).subscribe({next:o=>lt(this,null,function*(){try{if(!o?.dotSrc){this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1);return}let a=yield this.graphService.render(o.dotSrc);this.renderedGraph.set(this.sanitizer.bypassSecurityTrustHtml(a)),this.isLoading.set(!1),setTimeout(()=>{let r=this.getExpandableNodes();nE(".svg-container",s=>{this.wasDragging||this.onNodeClick(s)},r),this.initializeSvgTransform()},50)}catch(a){console.error("Error rendering graph:",a),this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1)}}),error:o=>{console.error("Error loading agent graph:",o),this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1)}})}getCurrentPath(){return this.navigationStack.length<=1?"":this.navigationStack.slice(1).map(e=>e.name).join("/")}updateBreadcrumbs(){this.breadcrumbs.set(this.navigationStack.map(e=>e.name))}onNodeClick(e){let A=this.navigationStack[this.navigationStack.length-1].data,i=oE(A,e);i&&oC(i)&&this.navigateIntoNode(e,i)}navigateIntoNode(e,A){this.navigationStack.push({name:e,data:A}),this.updateBreadcrumbs(),this.isLoading.set(!0),this.renderCurrentLevel()}navigateToLevel(e){e>=0&&e{let a=Ac(o);a!==i&&oC(o)&&e.add(a)}),e}getSvgElement(){return document.querySelector(".svg-container svg")}applyTransform(){let e=this.getSvgElement();e&&(e.style.transform=`translate(${this.translateX}px, ${this.translateY}px) scale(${this.scale})`)}initializeSvgTransform(){let e=this.getSvgElement(),A=document.querySelector(".svg-container");if(!e||!A)return;let i=e.getBoundingClientRect(),n=A.getBoundingClientRect(),o=48,a=(n.width-o)/i.width,r=(n.height-o)/i.height;this.scale=Math.min(1,a,r);let s=i.width*this.scale,l=i.height*this.scale;this.translateX=(n.width-s)/2,this.translateY=(n.height-l)/2,this.applyTransform(),requestAnimationFrame(()=>{e.classList.add("ready")})}onWheel(e){let A=document.querySelector(".svg-container"),i=this.getSvgElement();if(!A||!i)return;e.preventDefault();let n=Math.max(-100,Math.min(100,e.deltaY)),o=Math.pow(1.002,-n),a=this.scale*o,r=A.getBoundingClientRect(),s=e.clientX-r.left,l=e.clientY-r.top,g=(s-this.translateX)/this.scale,C=(l-this.translateY)/this.scale;this.translateX=s-g*a,this.translateY=l-C*a,this.scale=a,this.applyTransform()}onMouseDown(e){if(e.button!==0||!e.target.closest("svg"))return;this.isPanning=!0,this.wasDragging=!1,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.startPanX=e.clientX,this.startPanY=e.clientY;let i=this.getSvgElement();i&&(i.style.cursor="grabbing")}onMouseMove(e){if(this.isPanning){if(!this.wasDragging){let A=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;A*A+i*i>25&&(this.wasDragging=!0)}this.translateX+=e.clientX-this.startPanX,this.translateY+=e.clientY-this.startPanY,this.startPanX=e.clientX,this.startPanY=e.clientY,this.applyTransform()}}onMouseUp(){this.isPanning=!1;let e=this.getSvgElement();e&&(e.style.cursor=""),setTimeout(()=>{this.wasDragging=!1},50)}resetZoomPan(){this.initializeSvgTransform()}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-agent-structure-graph-dialog"]],inputs:{appName:"appName",preloadedAppData:"preloadedAppData",preloadedLightGraphSvg:"preloadedLightGraphSvg",preloadedDarkGraphSvg:"preloadedDarkGraphSvg",startPath:"startPath"},outputs:{close:"close"},decls:35,vars:2,consts:[[1,"overlay-backdrop"],[1,"overlay-panel",3,"mousedown","click"],[1,"overlay-header"],[1,"breadcrumb-container"],[2,"flex","1"],[1,"graph-legend"],[1,"legend-item"],[2,"color","#42A5F5","font-size","16px"],[2,"color","#9333EA","font-size","16px"],[2,"color","#10B981","font-size","16px"],[2,"color","#F59E0B","font-size","16px"],[2,"color","#6B7280","font-size","16px"],["mat-icon-button","","aria-label","Close",3,"click"],[1,"overlay-content"],[1,"graph-container"],[1,"loading-container"],[1,"error-container"],[1,"svg-container",3,"innerHTML"],[1,"no-graph-container"],["disabled","",1,"breadcrumb-item"],[1,"breadcrumb-separator"],[1,"breadcrumb-item",3,"click","disabled"],["diameter","50"],[1,"error-icon"],[1,"error-message"],[1,"svg-container",3,"wheel","mousedown","mousemove","mouseup","mouseleave","innerHTML"],[1,"large-icon"]],template:function(A,i){A&1&&(hA(0,"div",0),B(1,"div",1),U("mousedown",function(o){return i.onOverlayMouseDown(o)})("click",function(o){return i.onBackdropClick(o)}),B(2,"div",2),O(3,VcA,9,1,"div",3),hA(4,"span",4),B(5,"div",5)(6,"span",6)(7,"span",7),y(8,"\u2726"),Q(),y(9," Agent"),Q(),B(10,"span",6)(11,"span",8),y(12,"\u22B7"),Q(),y(13," Workflow"),Q(),B(14,"span",6)(15,"span",9),y(16,"\u0192"),Q(),y(17," Function"),Q(),B(18,"span",6)(19,"span",10),y(20,"\u2335"),Q(),y(21," Join"),Q(),B(22,"span",6)(23,"span",11),y(24,"\u{1F527}"),Q(),y(25," Tool"),Q()(),B(26,"button",12),U("click",function(){return i.close.emit()}),B(27,"mat-icon"),y(28,"close"),Q()()(),B(29,"div",13)(30,"div",14),O(31,WcA,4,0,"div",15)(32,ZcA,5,1,"div",16)(33,XcA,1,1,"div",17)(34,$cA,5,0,"div",18),Q()()()),A&2&&(u(3),Y(i.renderedGraph()&&i.breadcrumbs().length>0?3:-1),u(28),Y(i.isLoading()?31:i.errorMessage()?32:i.renderedGraph()?33:34))},dependencies:[li,qi,ji,Tn,Wt,E2,gs],styles:["[_nghost-%COMP%]{display:block;position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center}.overlay-backdrop[_ngcontent-%COMP%]{position:absolute;inset:0;background-color:#000000b3}.overlay-panel[_ngcontent-%COMP%]{position:relative;width:100vw;height:100vh;display:flex;flex-direction:column;background-color:transparent;color:var(--mat-sys-on-surface);border-radius:0;overflow:hidden;box-shadow:none}.overlay-header[_ngcontent-%COMP%]{display:flex;align-items:center;height:48px;padding:0 16px;box-sizing:border-box;border-bottom:1px solid var(--mat-sys-outline-variant);background-color:var(--mat-sys-surface-container)}.overlay-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden}.graph-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-height:0}.agent-info[_ngcontent-%COMP%]{margin:0 0 8px;font-size:14px;color:var(--mdc-dialog-supporting-text-color)}.agent-info[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{font-weight:600;color:var(--mdc-dialog-supporting-text-color)}.svg-container[_ngcontent-%COMP%]{flex:1;position:relative;overflow:hidden;background-color:transparent}.svg-container[_ngcontent-%COMP%] svg{position:absolute;top:0;left:0;transform-origin:0 0;cursor:grab;border-radius:16px;box-shadow:0 4px 12px #0000004d}.svg-container[_ngcontent-%COMP%] svg>g.graph>polygon:first-child{fill:transparent!important;stroke:transparent!important}.svg-container[_ngcontent-%COMP%] svg{opacity:0;transition:opacity .1s ease-in-out}.svg-container[_ngcontent-%COMP%] svg.ready{opacity:1}.svg-container[_ngcontent-%COMP%] svg:active{cursor:grabbing}.dark-theme[_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg, .dark-theme [_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg{background-color:#0e172a}.light-theme[_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg, .light-theme [_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg{background-color:#f9fafc}.loading-container[_ngcontent-%COMP%], .error-container[_ngcontent-%COMP%], .no-graph-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:400px;padding:40px}.loading-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .error-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .no-graph-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-top:16px;font-size:14px;color:var(--mdc-dialog-supporting-text-color)}.error-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;color:#f44336}.error-message[_ngcontent-%COMP%]{color:#f44336!important}.large-icon[_ngcontent-%COMP%]{font-size:64px;width:64px;height:64px;color:var(--mdc-dialog-supporting-text-color);opacity:.6}.breadcrumb-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;margin-left:8px;padding:0;background-color:transparent;flex-wrap:wrap}.breadcrumb-item[_ngcontent-%COMP%]{background:none;border:none;padding:4px 8px;cursor:pointer;color:var(--mat-sys-primary);font-size:13px;border-radius:4px;transition:background-color .2s}.breadcrumb-item[_ngcontent-%COMP%]:hover:not(:disabled){background-color:var(--mat-sys-surface-container-high)}.breadcrumb-item[_ngcontent-%COMP%]:disabled, .breadcrumb-item.active[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);cursor:default;font-weight:600}.breadcrumb-separator[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:var(--mat-sys-on-surface-variant)}.graph-legend[_ngcontent-%COMP%]{display:flex;align-items:center;gap:16px;margin-right:16px;font-size:13px;color:var(--mat-sys-on-surface-variant);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:6px 16px;background-color:var(--mat-sys-surface-container-lowest)}.graph-legend[_ngcontent-%COMP%] .legend-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;font-weight:500}"]})};var A0A=["mat-internal-form-field",""],e0A=["*"],W6=(()=>{class t{labelPosition="after";static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["div","mat-internal-form-field",""]],hostAttrs:[1,"mdc-form-field","mat-internal-form-field"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mdc-form-field--align-end",n.labelPosition==="before")},inputs:{labelPosition:"labelPosition"},attrs:A0A,ngContentSelectors:e0A,decls:1,vars:0,template:function(i,n){i&1&&(Rt(),Ve(0))},styles:[`.mat-internal-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-flex;align-items:center;vertical-align:middle}.mat-internal-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mat-internal-form-field>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end .mdc-form-field--align-end label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0} +`],encapsulation:2,changeDetection:0})}return t})();var t0A=["audioPlayer"],aE=class t{base64data=me("");audioPlayerRef=So("audioPlayer");audioSrc="";constructor(){}ngOnChanges(e){e.base64data&&this.base64data()&&this.setAudioSource(this.base64data())}setAudioSource(e){e.startsWith("data:")||e.startsWith("http")||e.startsWith("blob:")?this.audioSrc=e:this.audioSrc=`data:audio/mpeg;base64,${e}`,this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.load()}play(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.play()}pause(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.pause()}stop(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&(this.audioPlayerRef().nativeElement.pause(),this.audioPlayerRef().nativeElement.currentTime=0)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-audio-player"]],viewQuery:function(A,i){A&1&&ns(i.audioPlayerRef,t0A,5),A&2&&ur()},inputs:{base64data:[1,"base64data"]},features:[Yt],decls:3,vars:1,consts:[["audioPlayer",""],["controls","",3,"src"]],template:function(A,i){A&1&&(wn(0,"div"),Kn(1,"audio",1,0),Gn()),A&2&&(u(),ha("src",i.audioSrc))},styles:[".audio-player-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;padding:15px;border-radius:8px;box-shadow:0 2px 5px var(--audio-player-container-box-shadow-color);margin:20px auto;max-width:350px}audio[_ngcontent-%COMP%]{outline:none;border-radius:5px;width:350px}.custom-controls[_ngcontent-%COMP%]{margin-top:10px;display:flex;gap:10px}.custom-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:8px 15px;border:none;border-radius:5px;color:var(--audio-player-custom-controls-button-color);cursor:pointer;font-size:14px;transition:background-color .2s ease}"]})};function i0A(t,e){if(t&1){let A=QA();B(0,"div",0)(1,"div",4),y(2),Q(),B(3,"button",5),U("click",function(){T(A);let n=p();return J(n.close())}),Ct(),B(4,"svg",6),hA(5,"path",7),Q()()()}if(t&2){let A=p();u(),H("title",A.currentUrl),u(),lA(A.currentUrl)}}function n0A(t,e){if(t&1){let A=QA();B(0,"button",5),U("click",function(){T(A);let n=p();return J(n.close())}),Ct(),B(1,"svg",6),hA(2,"path",7),Q()()}}function o0A(t,e){if(t&1){let A=QA();B(0,"button",8),U("click",function(){T(A);let n=p();return J(n.prevImage())}),Ct(),B(1,"svg",6),hA(2,"path",9),Q()(),rr(),B(3,"button",10),U("click",function(){T(A);let n=p();return J(n.nextImage())}),Ct(),B(4,"svg",6),hA(5,"path",11),Q()(),rr(),B(6,"div",12),y(7),Q()}if(t&2){let A=p();H("disabled",A.currentIndex===0),u(3),H("disabled",A.currentIndex===A.images.length-1),u(4),ba("",A.currentIndex+1," / ",A.images.length)}}function a0A(t,e){if(t&1&&hA(0,"div",16),t&2){let A=p(3);H("ngStyle",A.getHighlightStyle())}}function r0A(t,e){if(t&1&&(B(0,"div",13),hA(1,"img",15),O(2,a0A,1,1,"div",16),Q()),t&2){let A=p(2);u(),H("src",A.displayContent,Go),u(),Y(A.shouldShowHighlight()?2:-1)}}function s0A(t,e){t&1&&(B(0,"div",14),y(1," No image data provided. "),Q())}function l0A(t,e){if(t&1&&(B(0,"div",2),O(1,r0A,3,2,"div",13),O(2,s0A,2,0,"div",14),Q()),t&2){let A=p();u(),Y(A.displayContent?1:-1),u(),Y(A.displayContent?-1:2)}}function g0A(t,e){if(t&1&&hA(0,"div",3),t&2){let A=p();H("innerHTML",A.displayContent,Gc)}}var rE=class t{displayContent=null;isSvgContent=!1;images=[];currentIndex=0;currentUrl=null;urls=[];coordinates=[];dialogRef=w(lo);data=w(qo);safeValuesService=w(Cs);ngOnInit(){this.images=this.data.images||[],this.currentIndex=this.data.currentIndex||0,this.urls=this.data.urls||[],this.coordinates=this.data.coordinates||[],this.updateImage()}updateImage(){let e=this.data.imageData,A="";this.images.length>0&&(e=this.images[this.currentIndex],A=this.urls[this.currentIndex]||""),this.currentUrl=A,this.processImageData(e)}getHighlightStyle(){let e=this.coordinates[this.currentIndex];return e?{left:`${e.x/1e3*100}%`,top:`${e.y/1e3*100}%`}:{}}shouldShowHighlight(){return!!this.coordinates[this.currentIndex]}processImageData(e){if(!e){this.displayContent=null,this.isSvgContent=!1;return}if(e.trim().includes("0&&(this.currentIndex--,this.updateImage())}close(){this.dialogRef.close()}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-view-image-dialog"]],decls:6,vars:4,consts:[[1,"header-bar"],[1,"close-button"],[1,"image-wrapper"],[3,"innerHTML"],[1,"image-title",3,"title"],[1,"close-button",3,"click"],["xmlns","http://www.w3.org/2000/svg","viewBox","0 0 24 24","fill","currentColor","width","24px","height","24px"],["d","M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"],[1,"nav-button","prev-button",3,"click","disabled"],["d","M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"],[1,"nav-button","next-button",3,"click","disabled"],["d","M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"],[1,"image-counter"],[1,"image-container",2,"position","relative","display","inline-block"],[1,"no-image-placeholder"],["alt","Viewed Image",3,"src"],[1,"highlight-circle",3,"ngStyle"]],template:function(A,i){A&1&&(B(0,"div"),O(1,i0A,6,2,"div",0)(2,n0A,3,0,"button",1),O(3,o0A,8,4),O(4,l0A,3,2,"div",2),O(5,g0A,1,1,"div",3),Q()),A&2&&(u(),Y(i.currentUrl?1:2),u(2),Y(i.images.length>1?3:-1),u(),Y(i.isSvgContent?-1:4),u(),Y(i.isSvgContent?5:-1))},dependencies:[Vd],styles:["[_nghost-%COMP%]{display:block;padding:16px}.close-button[_ngcontent-%COMP%]{position:absolute;top:5px;right:10px;border:none;cursor:pointer;padding:8px;border-radius:50%;transition:background-color .2s ease;color:var(--mdc-dialog-supporting-text-color);display:flex;align-items:center;justify-content:center;margin-bottom:15px}.close-button[_ngcontent-%COMP%]:hover{background-color:#0000000d}.close-button[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{width:24px;height:24px;fill:currentColor}.image-wrapper[_ngcontent-%COMP%]{flex-grow:1;display:flex;justify-content:center;align-items:center;overflow:auto}.image-wrapper[_ngcontent-%COMP%] img[_ngcontent-%COMP%], .image-wrapper[_ngcontent-%COMP%] .svg-container[_ngcontent-%COMP%]{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:8px}.no-image-placeholder[_ngcontent-%COMP%]{color:var(--trace-chart-trace-duration-color);font-style:italic;text-align:center;padding:20px}@media(max-width:1768px){.close-button[_ngcontent-%COMP%]{top:5px;right:5px;padding:5px}}.nav-button[_ngcontent-%COMP%]{position:absolute;top:50%;transform:translateY(-50%);background:#00000080;color:#fff;border:none;border-radius:50%;width:40px;height:40px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background-color .2s ease;z-index:10}.nav-button[_ngcontent-%COMP%]:hover:not(:disabled){background:#000000b3}.nav-button[_ngcontent-%COMP%]:disabled{opacity:.3;cursor:default}.nav-button[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{width:24px;height:24px;fill:currentColor}.prev-button[_ngcontent-%COMP%]{left:20px}.next-button[_ngcontent-%COMP%]{right:20px}.image-counter[_ngcontent-%COMP%]{position:absolute;bottom:20px;left:50%;transform:translate(-50%);background:#00000080;color:#fff;padding:4px 12px;border-radius:12px;font-size:14px;z-index:10}.header-bar[_ngcontent-%COMP%]{position:absolute;top:0;left:0;width:100%;background:#000000b3;color:#fff;z-index:20;display:flex;align-items:center;justify-content:center;padding:8px 40px;box-sizing:border-box}.image-title[_ngcontent-%COMP%]{font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:90%}.header-bar[_ngcontent-%COMP%] .close-button[_ngcontent-%COMP%]{position:absolute;top:50%;right:10px;transform:translateY(-50%);color:#fff;margin-bottom:0}.header-bar[_ngcontent-%COMP%] .close-button[_ngcontent-%COMP%]:hover{background-color:#ffffff1a}.highlight-circle[_ngcontent-%COMP%]{position:absolute;width:30px;height:30px;border-radius:50%;background-color:#ff000080;border:2px solid red;transform:translate(-50%,-50%);pointer-events:none;z-index:5}"]})};function c0A(t,e){t&1&&hA(0,"hr",2)}function C0A(t,e){if(t&1&&(B(0,"mat-option",7),y(1),Q()),t&2){let A=e.$implicit;H("value",A),u(),lA(A.versionId)}}function I0A(t,e){if(t&1){let A=QA();B(0,"div")(1,"img",9),U("click",function(){T(A);let n=p().$index,o=p();return J(o.openViewImageDialog(o.selectedArtifacts[n].data))}),Q()()}if(t&2){let A=p().$index,i=p();u(),H("src",i.selectedArtifacts[A].data??"",Go)}}function d0A(t,e){if(t&1&&(B(0,"div"),hA(1,"app-audio-player",10),Q()),t&2){let A=p().$index,i=p();u(),H("base64data",i.selectedArtifacts[A].data)}}function B0A(t,e){if(t&1){let A=QA();B(0,"div",1),O(1,c0A,1,0,"hr",2),B(2,"div",3)(3,"button",4),U("click",function(){let n=T(A).$index,o=p();return J(o.openArtifact(o.selectedArtifacts[n].data,o.selectedArtifacts[n].mimeType))}),y(4),Q()(),B(5,"div",3)(6,"span"),y(7," Version: "),Q(),B(8,"div",5)(9,"mat-select",6),Di("ngModelChange",function(n){let o=T(A).$index,a=p();return Bi(a.selectedArtifacts[o],n)||(a.selectedArtifacts[o]=n),J(n)}),U("selectionChange",function(n){let o=T(A).$index,a=p();return J(a.onArtifactVersionChange(n,o))}),Ue(10,C0A,2,2,"mat-option",7,ri),Q()(),B(12,"button",8),U("click",function(){let n=T(A).$index,o=p();return J(o.downloadArtifact(o.selectedArtifacts[n]))}),B(13,"mat-icon"),y(14,"file_download"),Q(),y(15," Download "),Q()(),B(16,"div"),O(17,I0A,2,1,"div")(18,d0A,2,1,"div"),Q()()}if(t&2){let A,i=e.$implicit,n=e.$index,o=p();u(),Y(n>0?1:-1),u(3),ue(" ",o.getArtifactName(i)," "),u(5),wi("ngModel",o.selectedArtifacts[n]),u(),Te(o.getSortedArtifactsFromId(i)),u(7),Y((A=o.selectedArtifacts[n].mediaType)===o.MediaType.IMAGE?17:A===o.MediaType.AUDIO?18:-1)}}var E0A="default_artifact_name",aC=(n=>(n.IMAGE="image",n.AUDIO="audio",n.TEXT="text",n.UNSPECIFIED="unspecified",n))(aC||{});function X6(t){let e=t.toLowerCase();for(let A of Object.values(aC))if(A!=="unspecified"&&e.startsWith(A+"/"))return A;return"unspecified"}function h0A(t){return t?t.startsWith("image/"):!1}function Q0A(t){return t?t.startsWith("audio/"):!1}var Z6=class t{artifacts=me([]);selectedArtifacts=[];isArtifactAudio=Q0A;isArtifactImage=h0A;MediaType=aC;downloadService=w(JB);dialog=w(Or);safeValuesService=w(Cs);ngOnChanges(e){if(e.artifacts){this.selectedArtifacts=[];for(let A of this.getDistinctArtifactIds())this.selectedArtifacts.push(this.getSortedArtifactsFromId(A)[0])}}downloadArtifact(e){this.downloadService.downloadBase64Data(e.data,e.mimeType,e.id)}getArtifactName(e){return e??E0A}getDistinctArtifactIds(){return[...new Set(this.artifacts().map(e=>e.id))]}getSortedArtifactsFromId(e){return this.artifacts().filter(A=>A.id===e).sort((A,i)=>i.versionId-A.versionId)}onArtifactVersionChange(e,A){this.selectedArtifacts[A]=e.value}openViewImageDialog(e){if(!e||!e.startsWith("data:")||e.indexOf(";base64,")===-1)return;let A=this.dialog.open(rE,{maxWidth:"90vw",maxHeight:"90vh",data:{imageData:e}})}openArtifact(e,A){if(this.isArtifactImage(A)){this.openViewImageDialog(e);return}this.openBase64InNewTab(e,A)}openBase64InNewTab(e,A){}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-artifact-tab"]],inputs:{artifacts:[1,"artifacts"]},features:[Yt],decls:3,vars:0,consts:[[1,"artifact-container"],[1,"artifact-box"],[1,"white-separator"],[1,"artifact-metadata"],[1,"link-style-button",3,"click"],[1,"version-select-container"],[3,"ngModelChange","selectionChange","ngModel"],[3,"value"],["mat-flat-button","",1,"download-button",3,"click"],["alt","artifact.id",1,"generated-image",3,"click","src"],[3,"base64data"]],template:function(A,i){A&1&&(B(0,"div",0),Ue(1,B0A,19,4,"div",1,ri),Q()),A&2&&(u(),Te(i.getDistinctArtifactIds()))},dependencies:[Xl,ln,yn,ko,Yr,pi,Wt,aE],styles:[".artifact-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap}.artifact-box[_ngcontent-%COMP%]{padding:10px;max-width:100%;margin-left:26px;display:flex;flex-direction:column}.artifact-metadata[_ngcontent-%COMP%]{display:flex;align-items:center;margin-bottom:15px;flex-wrap:wrap;gap:5px}.download-button[_ngcontent-%COMP%]{margin-left:35px;width:130px;height:28px;font-size:14px}.generated-image[_ngcontent-%COMP%]{max-width:60%;border-radius:8px;cursor:pointer}hr.white-separator[_ngcontent-%COMP%]{border:none;border-top:1px solid var(--artifact-tab-white-separator-border-top-color);margin-bottom:1.2em;margin-right:15px}.version-select-container[_ngcontent-%COMP%]{width:80px;margin-left:15px}.link-style-button[_ngcontent-%COMP%]{border:none;padding:0;font:inherit;color:var(--artifact-tab-link-style-button-color)!important;text-decoration:underline;cursor:pointer;outline:none}.link-style-button[_ngcontent-%COMP%]:hover{color:var(--artifact-tab-link-style-button-hover-color);text-decoration:underline}.link-style-button[_ngcontent-%COMP%]:focus{outline:1px dotted var(--artifact-tab-link-style-button-focus-outline-color)}.link-style-button[_ngcontent-%COMP%]:active{color:var(--artifact-tab-link-style-button-active-color)}.link-style-button[_ngcontent-%COMP%]:disabled{color:var(--artifact-tab-link-style-button-disabled-color);text-decoration:none;cursor:not-allowed}"]})};var u0A=["input"],f0A=["label"],p0A=["*"],g9={color:"accent",clickAction:"check-indeterminate",disabledInteractive:!1},m0A=new kA("mat-checkbox-default-options",{providedIn:"root",factory:()=>g9}),Bs=(function(t){return t[t.Init=0]="Init",t[t.Checked=1]="Checked",t[t.Unchecked=2]="Unchecked",t[t.Indeterminate=3]="Indeterminate",t})(Bs||{}),c9=class{source;checked},ec=(()=>{class t{_elementRef=w(ce);_changeDetectorRef=w(wt);_ngZone=w(qe);_animationsDisabled=An();_options=w(m0A,{optional:!0});focus(){this._inputElement.nativeElement.focus()}_createChangeEvent(A){let i=new c9;return i.source=this,i.checked=A,i}_getAnimationTargetElement(){return this._inputElement?.nativeElement}_animationClasses={uncheckedToChecked:"mdc-checkbox--anim-unchecked-checked",uncheckedToIndeterminate:"mdc-checkbox--anim-unchecked-indeterminate",checkedToUnchecked:"mdc-checkbox--anim-checked-unchecked",checkedToIndeterminate:"mdc-checkbox--anim-checked-indeterminate",indeterminateToChecked:"mdc-checkbox--anim-indeterminate-checked",indeterminateToUnchecked:"mdc-checkbox--anim-indeterminate-unchecked"};ariaLabel="";ariaLabelledby=null;ariaDescribedby;ariaExpanded;ariaControls;ariaOwns;_uniqueId;id;get inputId(){return`${this.id||this._uniqueId}-input`}required=!1;labelPosition="after";name=null;change=new LA;indeterminateChange=new LA;value;disableRipple=!1;_inputElement;_labelElement;tabIndex;color;disabledInteractive;_onTouched=()=>{};_currentAnimationClass="";_currentCheckState=Bs.Init;_controlValueAccessorChangeFn=()=>{};_validatorChangeFn=()=>{};constructor(){w(eo).load(lr);let A=w(new Us("tabindex"),{optional:!0});this._options=this._options||g9,this.color=this._options.color||g9.color,this.tabIndex=A==null?0:parseInt(A)||0,this.id=this._uniqueId=w(In).getId("mat-mdc-checkbox-"),this.disabledInteractive=this._options?.disabledInteractive??!1}ngOnChanges(A){A.required&&this._validatorChangeFn()}ngAfterViewInit(){this._syncIndeterminate(this.indeterminate)}get checked(){return this._checked}set checked(A){A!=this.checked&&(this._checked=A,this._changeDetectorRef.markForCheck())}_checked=!1;get disabled(){return this._disabled}set disabled(A){A!==this.disabled&&(this._disabled=A,this._changeDetectorRef.markForCheck())}_disabled=!1;get indeterminate(){return this._indeterminate()}set indeterminate(A){let i=A!=this._indeterminate();this._indeterminate.set(A),i&&(A?this._transitionCheckState(Bs.Indeterminate):this._transitionCheckState(this.checked?Bs.Checked:Bs.Unchecked),this.indeterminateChange.emit(A)),this._syncIndeterminate(A)}_indeterminate=bA(!1);_isRippleDisabled(){return this.disableRipple||this.disabled}_onLabelTextChange(){this._changeDetectorRef.detectChanges()}writeValue(A){this.checked=!!A}registerOnChange(A){this._controlValueAccessorChangeFn=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorChangeFn=A}_transitionCheckState(A){let i=this._currentCheckState,n=this._getAnimationTargetElement();if(!(i===A||!n)&&(this._currentAnimationClass&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(i,A),this._currentCheckState=A,this._currentAnimationClass.length>0)){n.classList.add(this._currentAnimationClass);let o=this._currentAnimationClass;this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{n.classList.remove(o)},1e3)})}}_emitChangeEvent(){this._controlValueAccessorChangeFn(this.checked),this.change.emit(this._createChangeEvent(this.checked)),this._inputElement&&(this._inputElement.nativeElement.checked=this.checked)}toggle(){this.checked=!this.checked,this._controlValueAccessorChangeFn(this.checked)}_handleInputClick(){let A=this._options?.clickAction;!this.disabled&&A!=="noop"?(this.indeterminate&&A!=="check"&&Promise.resolve().then(()=>{this._indeterminate.set(!1),this.indeterminateChange.emit(!1)}),this._checked=!this._checked,this._transitionCheckState(this._checked?Bs.Checked:Bs.Unchecked),this._emitChangeEvent()):(this.disabled&&this.disabledInteractive||!this.disabled&&A==="noop")&&(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate)}_onInteractionEvent(A){A.stopPropagation()}_onBlur(){Promise.resolve().then(()=>{this._onTouched(),this._changeDetectorRef.markForCheck()})}_getAnimationClassForCheckStateTransition(A,i){if(this._animationsDisabled)return"";switch(A){case Bs.Init:if(i===Bs.Checked)return this._animationClasses.uncheckedToChecked;if(i==Bs.Indeterminate)return this._checked?this._animationClasses.checkedToIndeterminate:this._animationClasses.uncheckedToIndeterminate;break;case Bs.Unchecked:return i===Bs.Checked?this._animationClasses.uncheckedToChecked:this._animationClasses.uncheckedToIndeterminate;case Bs.Checked:return i===Bs.Unchecked?this._animationClasses.checkedToUnchecked:this._animationClasses.checkedToIndeterminate;case Bs.Indeterminate:return i===Bs.Checked?this._animationClasses.indeterminateToChecked:this._animationClasses.indeterminateToUnchecked}return""}_syncIndeterminate(A){let i=this._inputElement;i&&(i.nativeElement.indeterminate=A)}_onInputClick(){this._handleInputClick()}_onTouchTargetClick(){this._handleInputClick(),this.disabled||this._inputElement.nativeElement.focus()}_preventBubblingFromLabel(A){A.target&&this._labelElement.nativeElement.contains(A.target)&&A.stopPropagation()}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-checkbox"]],viewQuery:function(i,n){if(i&1&&Jt(u0A,5)(f0A,5),i&2){let o;ae(o=re())&&(n._inputElement=o.first),ae(o=re())&&(n._labelElement=o.first)}},hostAttrs:[1,"mat-mdc-checkbox"],hostVars:16,hostBindings:function(i,n){i&2&&(ha("id",n.id),te("tabindex",null)("aria-label",null)("aria-labelledby",null),ro(n.color?"mat-"+n.color:"mat-accent"),RA("_mat-animation-noopable",n._animationsDisabled)("mdc-checkbox--disabled",n.disabled)("mat-mdc-checkbox-disabled",n.disabled)("mat-mdc-checkbox-checked",n.checked)("mat-mdc-checkbox-disabled-interactive",n.disabledInteractive))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],ariaExpanded:[2,"aria-expanded","ariaExpanded",Be],ariaControls:[0,"aria-controls","ariaControls"],ariaOwns:[0,"aria-owns","ariaOwns"],id:"id",required:[2,"required","required",Be],labelPosition:"labelPosition",name:"name",value:"value",disableRipple:[2,"disableRipple","disableRipple",Be],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?void 0:Cn(A)],color:"color",disabledInteractive:[2,"disabledInteractive","disabledInteractive",Be],checked:[2,"checked","checked",Be],disabled:[2,"disabled","disabled",Be],indeterminate:[2,"indeterminate","indeterminate",Be]},outputs:{change:"change",indeterminateChange:"indeterminateChange"},exportAs:["matCheckbox"],features:[Bt([{provide:as,useExisting:Ja(()=>t),multi:!0},{provide:Oc,useExisting:t,multi:!0}]),Yt],ngContentSelectors:p0A,decls:15,vars:23,consts:[["checkbox",""],["input",""],["label",""],["mat-internal-form-field","",3,"click","labelPosition"],[1,"mdc-checkbox"],["aria-hidden","true",1,"mat-mdc-checkbox-touch-target",3,"click"],["type","checkbox",1,"mdc-checkbox__native-control",3,"blur","click","change","checked","indeterminate","disabled","id","required","tabIndex"],["aria-hidden","true",1,"mdc-checkbox__ripple"],["aria-hidden","true",1,"mdc-checkbox__background"],["focusable","false","viewBox","0 0 24 24",1,"mdc-checkbox__checkmark"],["fill","none","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-checkbox__checkmark-path"],[1,"mdc-checkbox__mixedmark"],["mat-ripple","","aria-hidden","true",1,"mat-mdc-checkbox-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-label",3,"for"]],template:function(i,n){if(i&1&&(Rt(),B(0,"div",3),U("click",function(a){return n._preventBubblingFromLabel(a)}),B(1,"div",4,0)(3,"div",5),U("click",function(){return n._onTouchTargetClick()}),Q(),B(4,"input",6,1),U("blur",function(){return n._onBlur()})("click",function(){return n._onInputClick()})("change",function(a){return n._onInteractionEvent(a)}),Q(),hA(6,"div",7),B(7,"div",8),Ct(),B(8,"svg",9),hA(9,"path",10),Q(),rr(),hA(10,"div",11),Q(),hA(11,"div",12),Q(),B(12,"label",13,2),Ve(14),Q()()),i&2){let o=Qi(2);H("labelPosition",n.labelPosition),u(4),RA("mdc-checkbox--selected",n.checked),H("checked",n.checked)("indeterminate",n.indeterminate)("disabled",n.disabled&&!n.disabledInteractive)("id",n.inputId)("required",n.required)("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex),te("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby)("aria-describedby",n.ariaDescribedby)("aria-checked",n.indeterminate?"mixed":null)("aria-controls",n.ariaControls)("aria-disabled",n.disabled&&n.disabledInteractive?!0:null)("aria-expanded",n.ariaExpanded)("aria-owns",n.ariaOwns)("name",n.name)("value",n.value),u(7),H("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),u(),H("for",n.inputId)}},dependencies:[rs,W6],styles:[`.mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:18px;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2);margin:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox:hover>.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:hover>.mat-mdc-checkbox-ripple>.mat-ripple-element{background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mat-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mat-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mat-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mat-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mat-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control+.mdc-checkbox__ripple{background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control{position:absolute;margin:0;padding:0;opacity:0;cursor:inherit;z-index:1;width:var(--mat-checkbox-state-layer-size, 40px);height:var(--mat-checkbox-state-layer-size, 40px);top:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2);right:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2);left:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox--disabled{cursor:default;pointer-events:none}.mdc-checkbox__background{display:inline-flex;position:absolute;align-items:center;justify-content:center;box-sizing:border-box;width:18px;height:18px;border:2px solid currentColor;border-radius:2px;background-color:rgba(0,0,0,0);pointer-events:none;will-change:background-color,border-color;transition:background-color 90ms cubic-bezier(0.4, 0, 0.6, 1),border-color 90ms cubic-bezier(0.4, 0, 0.6, 1);-webkit-print-color-adjust:exact;color-adjust:exact;border-color:var(--mat-checkbox-unselected-icon-color, var(--mat-sys-on-surface-variant));top:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2);left:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2)}.mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled .mdc-checkbox__background{border-color:var(--mat-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{background-color:var(--mat-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}@media(forced-colors: active){.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:checked)~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mat-checkbox-unselected-hover-icon-color, var(--mat-sys-on-surface));background-color:rgba(0,0,0,0)}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-hover-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-hover-icon-color, var(--mat-sys-primary))}.mdc-checkbox__native-control:focus:focus:not(:checked)~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mat-checkbox-unselected-focus-icon-color, var(--mat-sys-on-surface))}.mdc-checkbox__native-control:focus:focus:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-focus-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-focus-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:var(--mat-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{background-color:var(--mat-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}.mdc-checkbox__checkmark{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;opacity:0;transition:opacity 180ms cubic-bezier(0.4, 0, 0.6, 1);color:var(--mat-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__checkmark{color:CanvasText}}.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:var(--mat-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:GrayText}}.mdc-checkbox__checkmark-path{transition:stroke-dashoffset 180ms cubic-bezier(0.4, 0, 0.6, 1);stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.7833385;stroke-dasharray:29.7833385}.mdc-checkbox__mixedmark{width:100%;height:0;transform:scaleX(0) rotate(0deg);border-width:1px;border-style:solid;opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1);border-color:var(--mat-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__mixedmark{margin:0 1px}}.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:var(--mat-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:GrayText}}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background,.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background,.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background,.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background{animation-duration:180ms;animation-timing-function:linear}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-unchecked-checked-checkmark-path 180ms linear;transition:none}.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-checked-unchecked-checkmark-path 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark{animation:mdc-checkbox-checked-indeterminate-checkmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-checked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark{animation:mdc-checkbox-indeterminate-checked-checkmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-checked-mixedmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear;transition:none}.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{transition:border-color 90ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path{stroke-dashoffset:0}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark{transition:opacity 180ms cubic-bezier(0, 0, 0.2, 1),transform 180ms cubic-bezier(0, 0, 0.2, 1);opacity:1}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(-45deg)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark{transform:rotate(45deg);opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(0deg);opacity:1}@keyframes mdc-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:29.7833385}50%{animation-timing-function:cubic-bezier(0, 0, 0.2, 1)}100%{stroke-dashoffset:0}}@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{transform:scaleX(1)}}@keyframes mdc-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(0.4, 0, 1, 1);opacity:1;stroke-dashoffset:0}to{opacity:0;stroke-dashoffset:-29.7833385}}@keyframes mdc-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(45deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(45deg);opacity:0}to{transform:rotate(360deg);opacity:1}}@keyframes mdc-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(-45deg);opacity:0}to{transform:rotate(0deg);opacity:1}}@keyframes mdc-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(315deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;transform:scaleX(1);opacity:1}32.8%,100%{transform:scaleX(0);opacity:0}}.mat-mdc-checkbox{display:inline-block;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-touch-target,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__native-control,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__ripple,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-ripple::before,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__mixedmark{transition:none !important;animation:none !important}.mat-mdc-checkbox label{cursor:pointer}.mat-mdc-checkbox .mat-internal-form-field{color:var(--mat-checkbox-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-checkbox-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-checkbox-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-checkbox-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-checkbox-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-checkbox-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive{pointer-events:auto}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive input{cursor:default}.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{cursor:default;color:var(--mat-checkbox-disabled-label-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{color:GrayText}}.mat-mdc-checkbox label:empty{display:none}.mat-mdc-checkbox .mdc-checkbox__ripple{opacity:0}.mat-mdc-checkbox .mat-mdc-checkbox-ripple,.mdc-checkbox__ripple{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-checkbox .mat-mdc-checkbox-ripple:not(:empty),.mdc-checkbox__ripple:not(:empty){transform:translateZ(0)}.mat-mdc-checkbox-ripple .mat-ripple-element{opacity:.1}.mat-mdc-checkbox-touch-target{position:absolute;top:50%;left:50%;height:var(--mat-checkbox-touch-target-size, 48px);width:var(--mat-checkbox-touch-target-size, 48px);transform:translate(-50%, -50%);display:var(--mat-checkbox-touch-target-display, block)}.mat-mdc-checkbox .mat-mdc-checkbox-ripple::before{border-radius:50%}.mdc-checkbox__native-control:focus-visible~.mat-focus-indicator::before{content:""} +`],encapsulation:2,changeDetection:0})}return t})(),AO=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[ec,fi]})}return t})();var eO=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})();var tO=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[eO,Zc,fi]})}return t})();var D0A={google_search:"search",EnterpriseWebSearchTool:"web",VertexAiSearchTool:"search",FilesRetrieval:"find_in_page",load_memory:"memory",preload_memory:"memory",url_context:"link",VertexAiRagRetrieval:"find_in_page",exit_loop:"sync",get_user_choice:"how_to_reg",load_artifacts:"image",LongRunningFunctionTool:"data_object"};function sE(t,e){return e==="Agent Tool"?"smart_toy":e==="Built-in tool"?D0A[t]||"build":e==="Function tool"?"data_object":"build"}var tc=class t{static toolMenuTooltips=new Map([["Function tool","Build custom tools for your specific ADK agent needs."],["Built-in tool","Ready-to-use functionality such as Google Search or code executors that provide agents with common capabilities. "],["Agent tool","A sub-agent that can be invoked as a tool by another agent."]]);static toolDetailedInfo=new Map([["Function tool",{shortDescription:"Build custom tools for your specific ADK agent needs.",detailedDescription:"The ADK framework automatically inspects your Python function's signature\u2014including its name, docstring, parameters, type hints, and default values\u2014to generate a schema. This schema is what the LLM uses to understand the tool's purpose, when to use it, and what arguments it requires.",docLink:"https://google.github.io/adk-docs/tools/function-tools/"}],["Agent tool",{shortDescription:"Wraps a sub-agent as a callable tool, enabling modular and hierarchical agent architectures.",detailedDescription:"Agent tools allow you to use one agent as a tool within another agent, creating powerful multi-agent workflows.",docLink:"https://google.github.io/adk-docs/agents/multi-agents/#c-explicit-invocation-agenttool"}]]);static callbackMenuTooltips=new Map([["before_agent","Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed."],["after_agent","Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes."],["before_model","Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow."],["after_model","Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent."],["before_tool","Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it."],["after_tool","Called just after the tool's run_async method completes successfully."]]);static callbackDialogTooltips=new Map([["before_agent","Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed."],["after_agent","Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes."],["before_model","Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow."],["after_model","Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent."],["before_tool","Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it."],["after_tool","Called just after the tool's run_async method completes successfully."]]);static callbackDetailedInfo=new Map([["before_agent",{shortDescription:"Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed. It runs after the agent's InvocationContext is created but before its core logic begins.",detailedDescription:" Ideal for setting up resources or state needed only for this specific agent's run, performing validation checks on the session state (callback_context.state) before execution starts, logging the entry point of the agent's activity, or potentially modifying the invocation context before the core logic uses it.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-agent-callback"}],["after_agent",{shortDescription:"Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes.",detailedDescription:"Useful for cleanup tasks, post-execution validation, logging the completion of an agent's activity, modifying final state, or augmenting/replacing the agent's final output.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-agent-callback"}],["before_model",{shortDescription:"Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow.",detailedDescription:"Allows inspection and modification of the request going to the LLM. Use cases include adding dynamic instructions, injecting few-shot examples based on state, modifying model config, implementing guardrails (like profanity filters), or implementing request-level caching.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-model-callback"}],["after_model",{shortDescription:"Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent.",detailedDescription:"Allows inspection or modification of the raw LLM response.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-model-callback"}],["before_tool",{shortDescription:"Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it.",detailedDescription:"Allows inspection and modification of tool arguments, performing authorization checks before execution, logging tool usage attempts, or implementing tool-level caching.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-tool-callback"}],["after_tool",{shortDescription:"Called just after the tool's run_async method completes successfully.",detailedDescription:"Allows inspection and modification of the tool's result before it's sent back to the LLM (potentially after summarization). Useful for logging tool results, post-processing or formatting results, or saving specific parts of the result to the session state.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-tool-callback"}]]);static getToolMenuTooltips(e){return t.toolMenuTooltips.get(e)}static getToolDetailedInfo(e){return t.toolDetailedInfo.get(e)}static getCallbackMenuTooltips(e){return t.callbackMenuTooltips.get(e)}static getCallbackDialogTooltips(e){return t.callbackDialogTooltips.get(e)}static getCallbackDetailedInfo(e){return t.callbackDetailedInfo.get(e)}};var y0A=["callbackNameInput"];function v0A(t,e){if(t&1){let A=QA();Dl(0),B(1,"div",8)(2,"div",9),U("click",function(){T(A);let n=p();return J(n.toggleCallbackInfo())}),B(3,"mat-icon",10),y(4,"info"),Q(),B(5,"div",11)(6,"span"),y(7,"Callback Information"),Q()(),B(8,"button",12)(9,"mat-icon"),y(10),Q()()(),B(11,"div",13)(12,"div",14)(13,"div",15),y(14),Q(),B(15,"div",16),y(16),Q()(),B(17,"div",17)(18,"a",18)(19,"mat-icon"),y(20,"open_in_new"),Q(),B(21,"span"),y(22,"View Official Documentation"),Q()()()()(),yl()}if(t&2){let A,i,n,o=p();u(10),lA(o.isCallbackInfoExpanded?"expand_less":"expand_more"),u(),RA("expanded",o.isCallbackInfoExpanded),u(3),lA((A=o.getCallbackInfo())==null?null:A.shortDescription),u(2),lA((i=o.getCallbackInfo())==null?null:i.detailedDescription),u(2),H("href",(n=o.getCallbackInfo())==null?null:n.docLink,Go)}}function b0A(t,e){if(t&1&&(B(0,"mat-option",21),y(1),Q()),t&2){let A=e.$implicit;H("value",A),u(),lA(A)}}function M0A(t,e){if(t&1){let A=QA();Dl(0),B(1,"mat-form-field",3)(2,"mat-label"),y(3,"Callback Type"),Q(),B(4,"mat-select",19),Di("ngModelChange",function(n){T(A);let o=p();return Bi(o.callbackType,n)||(o.callbackType=n),J(n)}),Et(5,b0A,2,2,"mat-option",20),Q()(),yl()}if(t&2){let A=p();u(4),wi("ngModel",A.callbackType),u(),H("ngForOf",A.availableCallbackTypes)}}function S0A(t,e){t&1&&(B(0,"mat-error"),y(1,"Same callback name has been used"),Q())}function k0A(t,e){t&1&&(B(0,"mat-error"),y(1,"Cannot have callback consist of two words"),Q())}function x0A(t,e){t&1&&(B(0,"mat-error"),y(1,"Callback function names cannot have spaces"),Q())}var C9=class{isErrorState(e){return!!(e&&e.invalid)}},o4=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.callbackType=A?.callbackType??"",this.existingCallbackNames=A?.existingCallbackNames??[],this.isEditMode=!!A?.isEditMode,this.availableCallbackTypes=A?.availableCallbackTypes??[],this.isEditMode&&A?.callback&&(this.callbackName=A.callback.name,this.callbackType=A.callback.type,this.originalCallbackName=A.callback.name,this.existingCallbackNames=this.existingCallbackNames.filter(i=>i!==this.originalCallbackName))}callbackNameInput;callbackName="";callbackType="";existingCallbackNames=[];matcher=new C9;isEditMode=!1;availableCallbackTypes=[];originalCallbackName="";isCallbackInfoExpanded=!1;addCallback(){if(!this.callbackName.trim()||this.hasSpaces()||this.isDuplicateName())return;let e={name:this.callbackName.trim(),type:this.callbackType,isEditMode:this.isEditMode,originalName:this.originalCallbackName||this.callbackName.trim()};this.dialogRef.close(e)}cancel(){this.dialogRef.close()}isDuplicateName(){if(!Array.isArray(this.existingCallbackNames))return!1;let e=(this.callbackName||"").trim();return this.existingCallbackNames.includes(e)}hasSpaces(){return/\s/.test(this.callbackName||"")}createDisabled(){return!this.callbackName.trim()||this.isDuplicateName()||this.hasSpaces()}validate(){this.hasSpaces()?this.callbackNameInput.control.setErrors({hasSpaces:!0}):this.isDuplicateName()?this.callbackNameInput.control.setErrors({duplicateName:!0}):this.callbackNameInput.control.setErrors(null)}getCallbackInfo(){return tc.getCallbackDetailedInfo(this.callbackType)}toggleCallbackInfo(){this.isCallbackInfoExpanded=!this.isCallbackInfoExpanded}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-add-callback-dialog"]],viewQuery:function(A,i){if(A&1&&Jt(y0A,5),A&2){let n;ae(n=re())&&(i.callbackNameInput=n.first)}},decls:18,vars:10,consts:[["callbackNameInput","ngModel"],["mat-dialog-title",""],[4,"ngIf"],[2,"width","100%"],["matInput","",3,"ngModelChange","keydown.enter","ngModel","errorStateMatcher"],["align","end"],["mat-button","",3,"click"],["mat-raised-button","","color","secondary",3,"click","disabled"],[1,"callback-info-container"],[1,"callback-info-header",3,"click"],[1,"callback-info-icon"],[1,"callback-info-title"],["mat-icon-button","","type","button","aria-label","Toggle callback information",1,"callback-info-toggle"],[1,"callback-info-body"],[1,"callback-info-content"],[1,"callback-info-short"],[1,"callback-info-detailed"],[1,"callback-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"callback-info-link",3,"href"],[3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]],template:function(A,i){if(A&1){let n=QA();B(0,"h2",1),y(1),Q(),B(2,"mat-dialog-content"),Et(3,v0A,23,6,"ng-container",2)(4,M0A,6,2,"ng-container",2),B(5,"mat-form-field",3)(6,"mat-label"),y(7,"Callback Name"),Q(),B(8,"input",4,0),Di("ngModelChange",function(a){return T(n),Bi(i.callbackName,a)||(i.callbackName=a),J(a)}),U("ngModelChange",function(){return i.validate()})("keydown.enter",function(){return i.addCallback()}),Q(),Et(10,S0A,2,0,"mat-error",2)(11,k0A,2,0,"mat-error",2)(12,x0A,2,0,"mat-error",2),Q()(),B(13,"mat-dialog-actions",5)(14,"button",6),U("click",function(){return i.cancel()}),y(15,"Cancel"),Q(),B(16,"button",7),U("click",function(){return i.addCallback()}),y(17),Q()()}if(A&2){let n=Qi(9);u(),lA(i.isEditMode?"Edit Callback":"Add "+i.callbackType+" Callback"),u(2),H("ngIf",i.getCallbackInfo()),u(),H("ngIf",i.isEditMode),u(4),wi("ngModel",i.callbackName),H("errorStateMatcher",i.matcher),u(2),H("ngIf",n.hasError("duplicateName")),u(),H("ngIf",n.hasError("hasSpaces")),u(),H("ngIf",n.hasError("hasSpaces")),u(4),H("disabled",i.createDisabled()),u(),ue(" ",i.isEditMode?"Save":"Add"," ")}},dependencies:[li,A2,Js,ln,Dn,yn,ko,Xc,fa,pa,Na,qi,pi,ji,Ya,Ko,vs,Kb,Ps,ua,$0,Xl,Yr,Tn,Wt],styles:[".callback-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;min-width:400px;max-width:600px}.full-width[_ngcontent-%COMP%]{width:100%}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}mat-dialog-actions[_ngcontent-%COMP%]{padding:16px 24px;margin:0}mat-form-field[_ngcontent-%COMP%]{margin-top:8px!important}.callback-info-container[_ngcontent-%COMP%]{border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.callback-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.callback-info-header[_ngcontent-%COMP%]:hover .callback-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.callback-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.callback-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.callback-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.callback-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.callback-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.callback-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.callback-info-content[_ngcontent-%COMP%]{flex:1}.callback-info-short[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-dialog-content-text-color);margin-bottom:8px;line-height:1.4}.callback-info-detailed[_ngcontent-%COMP%]{color:var(--mat-dialog-content-text-color);font-size:14px;line-height:1.5;opacity:.8}.callback-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.callback-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.callback-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.callback-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};function _0A(t,e){if(t&1){let A=QA();Dl(0),B(1,"div",6)(2,"div",7),U("click",function(){T(A);let n=p();return J(n.toggleToolInfo())}),B(3,"mat-icon",8),y(4,"info"),Q(),B(5,"div",9)(6,"span"),y(7,"Tool Information"),Q()(),B(8,"button",10)(9,"mat-icon"),y(10),Q()()(),B(11,"div",11)(12,"div",12)(13,"div",13),y(14),Q(),B(15,"div",14),y(16),Q()(),B(17,"div",15)(18,"a",16)(19,"mat-icon"),y(20,"open_in_new"),Q(),B(21,"span"),y(22,"View Official Documentation"),Q()()()()(),yl()}if(t&2){let A,i,n,o=p();u(10),lA(o.isToolInfoExpanded?"expand_less":"expand_more"),u(),RA("expanded",o.isToolInfoExpanded),u(3),lA((A=o.getToolInfo())==null?null:A.shortDescription),u(2),lA((i=o.getToolInfo())==null?null:i.detailedDescription),u(2),H("href",(n=o.getToolInfo())==null?null:n.docLink,Go)}}function R0A(t,e){if(t&1){let A=QA();B(0,"mat-form-field",2)(1,"input",17),Di("ngModelChange",function(n){T(A);let o=p();return Bi(o.toolName,n)||(o.toolName=n),J(n)}),U("keydown.enter",function(){T(A);let n=p();return J(n.addTool())}),Q()()}if(t&2){let A=p();u(),wi("ngModel",A.toolName)}}function N0A(t,e){if(t&1&&(B(0,"mat-option",20),y(1),Q()),t&2){let A=e.$implicit;H("value",A),u(),ue(" ",A," ")}}function F0A(t,e){if(t&1){let A=QA();B(0,"mat-form-field",2)(1,"mat-select",18),Di("ngModelChange",function(n){T(A);let o=p();return Bi(o.selectedBuiltInTool,n)||(o.selectedBuiltInTool=n),J(n)}),Et(2,N0A,2,2,"mat-option",19),Q()()}if(t&2){let A=p();u(),wi("ngModel",A.selectedBuiltInTool),u(),H("ngForOf",A.builtInTools)}}var v2=class t{constructor(e,A){this.data=e;this.dialogRef=A}toolName="";toolType="Function tool";selectedBuiltInTool="google_search";builtInTools=["EnterpriseWebSearchTool","exit_loop","FilesRetrieval","get_user_choice","google_search","load_artifacts","load_memory","LongRunningFunctionTool","preload_memory","url_context","VertexAiRagRetrieval","VertexAiSearchTool"];isEditMode=!1;isToolInfoExpanded=!1;ngOnInit(){this.toolType=this.data.toolType,this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName&&(this.toolType==="Function tool"?this.toolName=this.data.toolName:this.toolType==="Built-in tool"&&(this.selectedBuiltInTool=this.data.toolName))}addTool(){if(this.toolType==="Function tool"&&!this.toolName.trim())return;let e={toolType:this.toolType,isEditMode:this.isEditMode};this.toolType==="Function tool"?e.name=this.toolName.trim():this.toolType==="Built-in tool"&&(e.name=this.selectedBuiltInTool),this.dialogRef.close(e)}cancel(){this.dialogRef.close()}createDisabled(){return this.toolType==="Function tool"&&!this.toolName.trim()}getToolInfo(){return tc.getToolDetailedInfo(this.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \u0275fac=function(A){return new(A||t)(ct(qo),ct(lo))};static \u0275cmp=SA({type:t,selectors:[["app-add-tool-dialog"]],decls:11,vars:6,consts:[["mat-dialog-title","",1,"dialog-title"],[4,"ngIf"],[2,"width","100%"],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click","disabled"],[1,"tool-info-container"],[1,"tool-info-header",3,"click"],[1,"tool-info-icon"],[1,"tool-info-title"],["mat-icon-button","","type","button","aria-label","Toggle tool information",1,"tool-info-toggle"],[1,"tool-info-body"],[1,"tool-info-content"],[1,"tool-info-short"],[1,"tool-info-detailed"],[1,"tool-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"tool-info-link",3,"href"],["matInput","","placeholder","Enter full function name",3,"ngModelChange","keydown.enter","ngModel"],["placeholder","Select built-in tool",3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]],template:function(A,i){A&1&&(B(0,"h2",0),y(1),Q(),B(2,"mat-dialog-content"),Et(3,_0A,23,6,"ng-container",1),O(4,R0A,2,1,"mat-form-field",2),O(5,F0A,3,2,"mat-form-field",2),Q(),B(6,"mat-dialog-actions",3)(7,"button",4),U("click",function(){return i.cancel()}),y(8,"Cancel"),Q(),B(9,"button",5),U("click",function(){return i.addTool()}),y(10),Q()()),A&2&&(u(),lA(i.isEditMode?"Editing Tool":"Add New Tool"),u(2),H("ngIf",i.getToolInfo()),u(),Y(i.toolType==="Function tool"?4:-1),u(),Y(i.toolType==="Built-in tool"?5:-1),u(4),H("disabled",i.createDisabled()),u(),ue(" ",i.isEditMode?"Save":"Create"," "))},dependencies:[li,A2,Js,ln,Dn,yn,ko,fa,Na,Ko,ua,Xl,Yr,pa,pi,ji,Wt],styles:[".dialog-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;font-family:Google Sans;font-size:24px}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}.tool-info-container[_ngcontent-%COMP%]{border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:#e3e3e3;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:#c4c7ca;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};function Vo(t){return Array.isArray(t)}function ia(t){return t!==null&&typeof t=="object"&&(t.constructor===void 0||t.constructor.name==="Object")}function I9(t){return t&&typeof t=="object"?t.op==="add":!1}function d9(t){return t&&typeof t=="object"?t.op==="remove":!1}function $6(t){return t&&typeof t=="object"?t.op==="replace":!1}function A8(t){return t&&typeof t=="object"?t.op==="copy":!1}function b2(t){return t&&typeof t=="object"?t.op==="move":!1}function iO(t,e){return JSON.stringify(t)===JSON.stringify(e)}function L0A(t,e){return t===e}function B9(t){return t.slice(0,t.length-1)}function nO(t){return t[t.length-1]}function oO(t,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:L0A;if(t.length{e[A]=t[A]}),e}if(ia(t)){let e=gA({},t);return Object.getOwnPropertySymbols(t).forEach(A=>{e[A]=t[A]}),e}return t}function Q9(t,e,A){if(t[e]===A)return t;let i=h9(t);return i[e]=A,i}function Xe(t,e){let A=t,i=0;for(;i3&&arguments[3]!==void 0?arguments[3]:!1;if(e.length===0)return A;let n=e[0],o=Hr(t?t[n]:void 0,e.slice(1),A,i);if(ia(t)||Vo(t))return Q9(t,n,o);if(i){let a=G0A.test(n)?[]:{};return a[n]=o,a}throw new Error("Path does not exist")}var G0A=/^\d+$/;function a4(t,e,A){if(e.length===0)return A(t);if(!E9(t))throw new Error("Path doesn't exist");let i=e[0],n=a4(t[i],e.slice(1),A);return Q9(t,i,n)}function x1(t,e){if(e.length===0)return t;if(!E9(t))throw new Error("Path does not exist");if(e.length===1){let n=e[0];if(!(n in t))return t;let o=h9(t);return Vo(o)&&o.splice(Number.parseInt(n),1),ia(o)&&delete o[n],o}let A=e[0],i=x1(t[A],e.slice(1));return Q9(t,A,i)}function r4(t,e,A){let i=e.slice(0,e.length-1),n=e[e.length-1];return a4(t,i,o=>{if(!Array.isArray(o))throw new TypeError(`Array expected at path ${JSON.stringify(i)}`);let a=h9(o);return a.splice(Number.parseInt(n),0,A),a})}function vr(t,e){return t===void 0?!1:e.length===0?!0:t===null?!1:vr(t[e[0]],e.slice(1))}function Es(t){let e=t.split("/");return e.shift(),e.map(A=>A.replace(/~1/g,"/").replace(/~0/g,"~"))}function vt(t){return t.map(aO).join("")}function aO(t){return`/${String(t).replace(/~/g,"~0").replace(/\//g,"~1")}`}function s4(t,e){return t+aO(e)}function tl(t,e,A){let i=t;for(let n=0;n{let r,s=il(o,a.path);if(a.op==="add")r=lO(o,s);else if(a.op==="remove")r=sO(o,s);else if(a.op==="replace")r=rO(o,s);else if(a.op==="copy")r=P0A(o,s);else if(a.op==="move")r=j0A(o,s,l4(a.from));else if(a.op==="test")r=[];else throw new Error(`Unknown JSONPatch operation ${JSON.stringify(a)}`);let l;if(A?.before){let g=A.before(o,a,r);if(g?.revertOperations&&(r=g.revertOperations),g?.document&&(l=g.document),g?.json)throw new Error('Deprecation warning: returned object property ".json" has been renamed to ".document"')}if(i=r.concat(i),l!==void 0)return{document:l}}}),i}function rO(t,e){return vr(t,e)?[{op:"replace",path:vt(e),value:Xe(t,e)}]:[]}function sO(t,e){return[{op:"add",path:vt(e),value:Xe(t,e)}]}function lO(t,e){return lE(t,e)||!vr(t,e)?[{op:"remove",path:vt(e)}]:rO(t,e)}function P0A(t,e){return lO(t,e)}function j0A(t,e,A){if(e.length="0"&&t<="9"}function IO(t){return t>=" "}function g4(t){return`,:[]/{}() ++`.includes(t)}function p9(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"||t==="_"||t==="$"}function m9(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"||t==="_"||t==="$"||t>="0"&&t<="9"}var w9=/^(http|https|ftp|mailto|file|data|irc):\/\/$/,D9=/^[A-Za-z0-9-._~:/?#@!$&'()*+;=]$/;function y9(t){return`,[]/{} ++`.includes(t)}function v9(t){return c4(t)||nCA.test(t)}var nCA=/^[[{\w-]$/;function dO(t){return t===` +`||t==="\r"||t===" "||t==="\b"||t==="\f"}function M2(t,e){let A=t.charCodeAt(e);return A===32||A===10||A===9||A===13}function BO(t,e){let A=t.charCodeAt(e);return A===32||A===9||A===13}function EO(t,e){let A=t.charCodeAt(e);return A===160||A===6158||A>=8192&&A<=8203||A===8239||A===8287||A===12288||A===65279}function c4(t){return b9(t)||n8(t)}function b9(t){return t==='"'||t==="\u201C"||t==="\u201D"}function M9(t){return t==='"'}function n8(t){return t==="'"||t==="\u2018"||t==="\u2019"||t==="`"||t==="\xB4"}function S9(t){return t==="'"}function gE(t,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=t.lastIndexOf(e);return i!==-1?t.substring(0,i)+(A?"":t.substring(i+1)):t}function og(t,e){let A=t.length;if(!M2(t,A-1))return t+e;for(;M2(t,A-1);)A--;return t.substring(0,A)+e+t.substring(A)}function hO(t,e,A){return t.substring(0,e)+t.substring(e+A)}function QO(t){return/[,\n][ \t\r]*$/.test(t)}var oCA={"\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},aCA={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:` +`,r:"\r",t:" "};function ag(t){let e=0,A="";l(["```","[```","{```"]),o()||X(),l(["```","```]","```}"]);let n=C(",");for(n&&a(),v9(t[e])&&QO(A)?(n||(A=og(A,",")),m()):n&&(A=gE(A,","));t[e]==="}"||t[e]==="]";)e++,a();if(e>=t.length)return A;BA();function o(){a();let aA=E()||f()||v()||S()||b()||F(!1)||z();return a(),aA}function a(){let aA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,rA=e,uA=r(aA);do uA=s(),uA&&(uA=r(aA));while(uA);return e>rA}function r(aA){let rA=aA?M2:BO,uA="";for(;;)if(rA(t,e))uA+=t[e],e++;else if(EO(t,e))uA+=" ",e++;else break;return uA.length>0?(A+=uA,!0):!1}function s(){if(t[e]==="/"&&t[e+1]==="*"){for(;e=t.length;UA||(v9(t[e])||$A?A=og(A,":"):AA()),o()||(UA||$A?A+="null":AA())}return t[e]==="}"?(A+="}",e++):A=og(A,"}"),!0}return!1}function f(){if(t[e]==="["){A+="[",e++,a(),I(",")&&a();let aA=!0;for(;e0&&arguments[0]!==void 0?arguments[0]:!1,rA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:-1,uA=t[e]==="\\";if(uA&&(e++,uA=!0),c4(t[e])){let UA=M9(t[e])?M9:S9(t[e])?S9:n8(t[e])?n8:b9,$A=e,zA=A.length,pA='"';for(e++;;){if(e>=t.length){let PA=P(e-1);return!aA&&g4(t.charAt(PA))?(e=$A,A=A.substring(0,zA),v(!0)):(pA=og(pA,'"'),A+=pA,!0)}if(e===rA)return pA=og(pA,'"'),A+=pA,!0;if(UA(t[e])){let PA=e,Je=pA.length;if(pA+='"',e++,A+=pA,a(!1),aA||e>=t.length||g4(t[e])||c4(t[e])||S2(t[e]))return k(),!0;let _e=P(PA-1),YA=t.charAt(_e);if(YA===",")return e=$A,A=A.substring(0,zA),v(!1,_e);if(g4(YA))return e=$A,A=A.substring(0,zA),v(!0);A=A.substring(0,zA),e=PA+1,pA=`${pA.substring(0,Je)}\\${pA.substring(Je)}`}else if(aA&&y9(t[e])){if(t[e-1]===":"&&w9.test(t.substring($A+1,e+2)))for(;e=t.length?e=t.length:IA()}else pA+=PA,e+=2}else{let PA=t.charAt(e);PA==='"'&&t[e-1]!=="\\"?(pA+=`\\${PA}`,e++):dO(PA)?(pA+=oCA[PA],e++):(IO(PA)||W(PA),pA+=PA,e++)}uA&&d()}}return!1}function k(){let aA=!1;for(a();t[e]==="+";){aA=!0,e++,a(),A=gE(A,'"',!0);let rA=A.length;v()?A=hO(A,rA,1):A=og(A,'"')}return aA}function S(){let aA=e;if(t[e]==="-"){if(e++,Z())return tA(aA),!0;if(!S2(t[e]))return e=aA,!1}for(;S2(t[e]);)e++;if(t[e]==="."){if(e++,Z())return tA(aA),!0;if(!S2(t[e]))return e=aA,!1;for(;S2(t[e]);)e++}if(t[e]==="e"||t[e]==="E"){if(e++,(t[e]==="-"||t[e]==="+")&&e++,Z())return tA(aA),!0;if(!S2(t[e]))return e=aA,!1;for(;S2(t[e]);)e++}if(!Z())return e=aA,!1;if(e>aA){let rA=t.slice(aA,e),uA=/^0\d/.test(rA);return A+=uA?`"${rA}"`:rA,!0}return!1}function b(){return x("true","true")||x("false","false")||x("null","null")||x("True","true")||x("False","false")||x("None","null")}function x(aA,rA){return t.slice(e,e+aA.length)===aA?(A+=rA,e+=aA.length,!0):!1}function F(aA){let rA=e;if(p9(t[e])){for(;erA){for(;M2(t,e-1)&&e>0;)e--;let uA=t.slice(rA,e);return A+=uA==="undefined"?"null":JSON.stringify(uA),t[e]==='"'&&e++,!0}}function z(){if(t[e]==="/"){let aA=e;for(e++;e0&&M2(t,rA);)rA--;return rA}function Z(){return e>=t.length||g4(t[e])||M2(t,e)}function tA(aA){A+=`${t.slice(aA,e)}0`}function W(aA){throw new rC(`Invalid character ${JSON.stringify(aA)}`,e)}function BA(){throw new rC(`Unexpected character ${JSON.stringify(t[e])}`,e)}function X(){throw new rC("Unexpected end of json string",t.length)}function iA(){throw new rC("Object key expected",e)}function AA(){throw new rC("Colon expected",e)}function IA(){let aA=t.slice(e,e+6);throw new rC(`Invalid unicode character "${aA}"`,e)}}function rCA(t,e){return t[e]==="*"&&t[e+1]==="/"}var sCA=typeof global=="object"&&global&&global.Object===Object&&global,o8=sCA;var lCA=typeof self=="object"&&self&&self.Object===Object&&self,gCA=o8||lCA||Function("return this")(),Ga=gCA;var cCA=Ga.Symbol,br=cCA;var uO=Object.prototype,CCA=uO.hasOwnProperty,ICA=uO.toString,C4=br?br.toStringTag:void 0;function dCA(t){var e=CCA.call(t,C4),A=t[C4];try{t[C4]=void 0;var i=!0}catch(o){}var n=ICA.call(t);return i&&(e?t[C4]=A:delete t[C4]),n}var fO=dCA;var BCA=Object.prototype,ECA=BCA.toString;function hCA(t){return ECA.call(t)}var pO=hCA;var QCA="[object Null]",uCA="[object Undefined]",mO=br?br.toStringTag:void 0;function fCA(t){return t==null?t===void 0?uCA:QCA:mO&&mO in Object(t)?fO(t):pO(t)}var ic=fCA;function pCA(t){return t!=null&&typeof t=="object"}var _s=pCA;var mCA="[object Symbol]";function wCA(t){return typeof t=="symbol"||_s(t)&&ic(t)==mCA}var kl=wCA;function DCA(t,e){for(var A=-1,i=t==null?0:t.length,n=Array(i);++A0){if(++e>=C2A)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var TO=B2A;function E2A(t){return function(){return t}}var JO=E2A;var h2A=(function(){try{var t=nl(Object,"defineProperty");return t({},"",{}),t}catch(e){}})(),CE=h2A;var Q2A=CE?function(t,e){return CE(t,"toString",{configurable:!0,enumerable:!1,value:JO(e),writable:!0})}:l0,OO=Q2A;var u2A=TO(OO),YO=u2A;function f2A(t,e){for(var A=-1,i=t==null?0:t.length;++A-1&&t%1==0&&t-1&&t%1==0&&t<=_2A}var dE=R2A;function N2A(t){return t!=null&&dE(t.length)&&!a8(t)}var rg=N2A;function F2A(t,e,A){if(!Cr(A))return!1;var i=typeof e;return(i=="number"?rg(A)&&IE(e,A.length):i=="string"&&e in A)?_2(A[e],t):!1}var d4=F2A;var L2A=Object.prototype;function G2A(t){var e=t&&t.constructor,A=typeof e=="function"&&e.prototype||L2A;return t===A}var N2=G2A;function K2A(t,e){for(var A=-1,i=Array(t);++A-1}var IY=n1A;function o1A(t,e){var A=this.__data__,i=G2(A,t);return i<0?(++this.size,A.push([t,e])):A[i][1]=e,this}var dY=o1A;function uE(t){var e=-1,A=t==null?0:t.length;for(this.clear();++e0&&A(r)?e>1?bY(r,e-1,A,i,n):mE(n,r):i||(n[n.length]=r)}return n}var MY=bY;var M1A=C8(Object.getPrototypeOf,Object),E8=M1A;function S1A(t,e,A){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),A=A>n?n:A,A<0&&(A+=n),n=e>A?0:A-e>>>0,e>>>=0;for(var o=Array(n);++ir))return!1;var l=o.get(t),g=o.get(e);if(l&&g)return l==e&&g==t;var C=-1,I=!0,d=A&MBA?new QH:void 0;for(o.set(t,e),o.set(e,t);++C=e||F<0||C&&z>=o}function m(){var x=F8();if(f(x))return v(x);r=setTimeout(m,E(x))}function v(x){return r=void 0,I&&i?d(x):(i=n=void 0,a)}function k(){r!==void 0&&clearTimeout(r),l=0,i=s=n=r=void 0}function S(){return r===void 0?a:v(F8())}function b(){var x=F8(),F=f(x);if(i=arguments,n=this,s=x,F){if(r===void 0)return h(s);if(C)return clearTimeout(r),r=setTimeout(m,e),d(s)}return r===void 0&&(r=setTimeout(m,e)),a}return b.cancel=k,b.flush=S,b}var ME=MEA;function SEA(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}var ki=SEA;function kEA(t){return typeof t=="function"?t:l0}var L8=kEA;function xEA(t,e){for(var A=t==null?0:t.length;A--&&e(t[A],A,t)!==!1;);return t}var HH=xEA;var _EA=k8(!0),zH=_EA;function REA(t,e){return t&&zH(t,e,sg)}var PH=REA;var NEA=_8(PH,!0),jH=NEA;function FEA(t,e){var A=co(t)?HH:jH;return A(t,L8(e))}var L9=FEA;function LEA(t){return t&&t.length?t[0]:void 0}var lg=LEA;function GEA(t,e){var A=-1,i=rg(t)?Array(t.length):[];return R8(t,function(n,o,a){i[++A]=e(n,o,a)}),i}var G8=GEA;function KEA(t,e){var A=co(t)?k2:G8;return A(t,g0(e,3))}var G9=KEA;var UEA=Object.prototype,TEA=UEA.hasOwnProperty,JEA=N8(function(t,e,A){TEA.call(t,A)?t[A].push(e):x2(t,A,[e])}),K9=JEA;function OEA(t){var e=t==null?0:t.length;return e?SY(t,0,-1):[]}var Yi=OEA;var YEA="[object Map]",HEA="[object Set]",zEA=Object.prototype,PEA=zEA.hasOwnProperty;function jEA(t){if(t==null)return!0;if(rg(t)&&(co(t)||typeof t=="string"||typeof t.splice=="function"||lC(t)||BE(t)||F2(t)))return!t.length;var e=nc(t);if(e==YEA||e==HEA)return!t.size;if(N2(t))return!I8(t).length;for(var A in t)if(PEA.call(t,A))return!1;return!0}var en=jEA;function qEA(t,e){return bE(t,e)}var Mi=qEA;function VEA(t,e){return te||o&&a&&s&&!r&&!l||i&&a&&s||!A&&s||!n)return 1;if(!i&&!o&&!l&&t=r)return s;var l=A[i];return s*(l=="desc"?-1:1)}}return t.index-e.index}var XH=ehA;function thA(t,e,A){e.length?e=k2(e,function(o){return co(o)?function(a){return pE(a,o.length===1?o[0]:o)}:o}):e=[l0];var i=-1;e=k2(e,L2(g0));var n=G8(t,function(o,a,r){var s=k2(e,function(l){return l(o)});return{criteria:s,index:++i,value:o}});return WH(n,function(o,a){return XH(o,a,A)})}var $H=thA;var ihA=N8(function(t,e,A){t[A?0:1].push(e)},function(){return[[],[]]}),T9=ihA;var nhA=Math.ceil,ohA=Math.max;function ahA(t,e,A,i){for(var n=-1,o=ohA(nhA((e-t)/(A||1)),0),a=Array(o);o--;)a[i?o:++n]=t,t+=A;return a}var Az=ahA;function rhA(t){return function(e,A,i){return i&&typeof i!="number"&&d4(e,A,i)&&(A=i=void 0),e=cE(e),A===void 0?(A=e,e=0):A=cE(A),i=i===void 0?e1&&d4(t,e[0],e[1])?e=[]:A>2&&d4(e[0],e[1],e[2])&&(e=[e[0]]),$H(t,MY(e,1),[])}),J9=lhA;var ghA=9007199254740991,O9=4294967295,chA=Math.min;function ChA(t,e){if(t=xO(t),t<1||t>ghA)return[];var A=O9,i=chA(t,O9);e=L8(e),t-=O9;for(var n=g8(i,e);++AArray.isArray(t),BhA=t=>t!==null&&typeof t=="object"&&!H2(t),EhA=t=>typeof t=="string",N1=(t,e)=>t===e?!0:t!==null&&e!==null&&typeof t=="object"&&typeof e=="object"&&Object.keys(t).length===Object.keys(e).length&&Object.entries(t).every(([A,i])=>N1(i,e[A])),tz=(t,e)=>{let A=t?.[e];if(A!==void 0){if(!Object.hasOwn(t,e)||Array.isArray(t)&&!/^\d+$/.test(e)||typeof t!="object")throw new TypeError(`Unsupported property "${e}"`);return A}};function za(t){return(...e)=>{let A=e.map(o=>Pa(o)),i=A[0],n=A[1];return A.length===1?o=>t(i(o)):A.length===2?o=>t(i(o),n(o)):o=>t(...A.map(a=>a(o)))}}var f4={boolean:0,number:1,string:2},iz=3,az=(t,e)=>typeof t==typeof e&&typeof t in f4?t>e:!1,hhA=(t,e)=>N1(t,e)||az(t,e),rz=(t,e)=>typeof t==typeof e&&typeof t in f4?tN1(t,e)||rz(t,e),u4={pipe:(...t)=>{let e=t.map(A=>Pa(A));return A=>e.reduce((i,n)=>n(i),A)},object:t=>{let e=Object.keys(t).map(A=>[A,Pa(t[A])]);return A=>{let i={};for(let[n,o]of e)i[n]=o(A);return i}},array:(...t)=>{let e=t.map(A=>Pa(A));return A=>e.map(i=>i(A))},get:(...t)=>{if(t.length===0)return e=>e??null;if(t.length===1){let e=t[0];return A=>tz(A,e)??null}return e=>{let A=e;for(let i of t)A=tz(A,i);return A??null}},map:t=>{let e=Pa(t);return A=>A.map(e)},mapObject:t=>{let e=Pa(t);return A=>{let i={};for(let n of Object.keys(A)){let o=e({key:n,value:A[n]});i[o.key]=o.value}return i}},mapKeys:t=>{let e=Pa(t);return A=>{let i={};for(let n of Object.keys(A)){let o=e(n);i[o]=A[n]}return i}},mapValues:t=>{let e=Pa(t);return A=>{let i={};for(let n of Object.keys(A))i[n]=e(A[n]);return i}},filter:t=>{let e=Pa(t);return A=>A.filter(i=>nz(e(i)))},sort:(t=["get"],e)=>{let A=Pa(t),i=e==="desc"?-1:1;function n(o,a){let r=A(o),s=A(a);if(typeof r!=typeof s){let l=f4[typeof r]??iz,g=f4[typeof s]??iz;return l>g?i:ls?i:ro.slice().sort(n)},reverse:()=>t=>t.toReversed(),pick:(...t)=>{let e=t.map(([i,...n])=>[n[n.length-1],u4.get(...n)]),A=(i,n)=>{let o={};for(let[a,r]of n)o[a]=r(i);return o};return i=>H2(i)?i.map(n=>A(n,e)):A(i,e)},groupBy:t=>{let e=Pa(t);return A=>{let i={};for(let n of A){let o=e(n);i[o]?i[o].push(n):i[o]=[n]}return i}},keyBy:t=>{let e=Pa(t);return A=>{let i={};for(let n of A){let o=e(n);o in i||(i[o]=n)}return i}},flatten:()=>t=>t.flat(),join:(t="")=>e=>e.join(t),split:za((t,e)=>e!==void 0?t.split(e):t.trim().split(/\s+/)),substring:za((t,e,A)=>t.slice(Math.max(e,0),A)),uniq:()=>t=>{let e=[];for(let A of t)e.findIndex(i=>N1(i,A))===-1&&e.push(A);return e},uniqBy:t=>e=>Object.values(u4.keyBy(t)(e)),limit:t=>e=>e.slice(0,Math.max(t,0)),size:()=>t=>t.length,keys:()=>Object.keys,values:()=>Object.values,prod:()=>t=>Q4(t,(e,A)=>e*A),sum:()=>t=>H2(t)?t.reduce((e,A)=>e+A,0):H9(),average:()=>t=>H2(t)?t.length>0?t.reduce((e,A)=>e+A)/t.length:null:H9(),min:()=>t=>Q4(t,(e,A)=>Math.min(e,A)),max:()=>t=>Q4(t,(e,A)=>Math.max(e,A)),and:za((...t)=>Q4(t,(e,A)=>!!(e&&A))),or:za((...t)=>Q4(t,(e,A)=>!!(e||A))),not:za(t=>!t),exists:t=>{let e=t.slice(1),A=e.pop(),i=u4.get(...e);return n=>{let o=i(n);return!!o&&Object.hasOwnProperty.call(o,A)}},if:(t,e,A)=>{let i=Pa(t),n=Pa(e),o=Pa(A);return a=>nz(i(a))?n(a):o(a)},in:(t,e)=>{let A=Pa(t),i=Pa(e);return n=>{let o=A(n);return i(n).findIndex(a=>N1(a,o))!==-1}},"not in":(t,e)=>{let A=u4.in(t,e);return i=>!A(i)},regex:(t,e,A)=>{let i=new RegExp(e,A),n=Pa(t);return o=>i.test(n(o))},match:(t,e,A)=>{let i=new RegExp(e,A),n=Pa(t);return o=>{let a=n(o).match(i);return a?oz(a):null}},matchAll:(t,e,A)=>{let i=new RegExp(e,`${A??""}g`),n=Pa(t);return o=>Array.from(n(o).matchAll(i)).map(oz)},eq:za(N1),gt:za(az),gte:za(hhA),lt:za(rz),lte:za(QhA),ne:za((t,e)=>!N1(t,e)),add:za((t,e)=>t+e),subtract:za((t,e)=>t-e),multiply:za((t,e)=>t*e),divide:za((t,e)=>t/e),mod:za((t,e)=>t%e),pow:za((t,e)=>t**e),abs:za(Math.abs),round:za((t,e=0)=>+`${Math.round(+`${t}e${e}`)}e${-e}`),number:za(t=>{let e=Number(t);return Number.isNaN(Number(t))?null:e}),string:za(String)},nz=t=>t!==null&&t!==0&&t!==!1,Q4=(t,e)=>(H2(t)||H9(),t.length===0?null:t.reduce(e)),oz=t=>{let[e,...A]=t,i=t.groups;return A.length?i?{value:e,groups:A,namedGroups:i}:{value:e,groups:A}:{value:e}},H9=()=>{z9("Array expected")},z9=t=>{throw new TypeError(t)},U8=[];function Pa(t,e){U8.unshift(gA(gA(gA({},u4),U8[0]),e?.functions));try{let A=H2(t)?uhA(t,U8[0]):BhA(t)?z9(`Function notation ["object", {...}] expected but got ${JSON.stringify(t)}`):()=>t;return i=>{try{return A(i)}catch(n){throw n.jsonquery=[{data:i,query:t},...n.jsonquery??[]],n}}}finally{U8.shift()}}function uhA(t,e){let[A,...i]=t,n=e[A];return n||z9(`Unknown function '${A}'`),n(...i)}var sz=[{pow:"^"},{multiply:"*",divide:"/",mod:"%"},{add:"+",subtract:"-"},{gt:">",gte:">=",lt:"<",lte:"<=",in:"in","not in":"not in"},{eq:"==",ne:"!="},{and:"and"},{or:"or"},{pipe:"|"}],fhA=["|","and","or"],lz=["|","and","or","*","/","%","+","-"];function gz(t,e){if(!H2(e))throw new Error("Invalid custom operators");return e.reduce(phA,t)}function phA(t,{name:e,op:A,at:i,after:n,before:o}){if(i)return t.map(s=>Object.values(s).includes(i)?Ye(gA({},s),{[e]:A}):s);let a=n??o,r=t.findIndex(s=>Object.values(s).includes(a));if(r!==-1)return t.toSpliced(r+(n?1:0),0,{[e]:A});throw new Error("Invalid custom operator")}var mhA=/^[a-zA-Z_$][a-zA-Z\d_$]*$/,whA=/^[a-zA-Z_$][a-zA-Z\d_$]*/,DhA=/^"(?:[^"\\]|\\.)*"/,yhA=/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/,vhA=/^(0|[1-9][0-9]*)/,bhA=/^(true|false|null)/,MhA=/^[ \n\t\r]+/;function P9(t,e){let A=e?.operators??[],i=gz(sz,A),n=Object.assign({},...i),o=fhA.concat(A.filter(Z=>Z.vararg).map(Z=>Z.op)),a=lz.concat(A.filter(Z=>Z.leftAssociative).map(Z=>Z.op)),r=(Z=i.length-1)=>{let tA=i[Z];if(!tA)return l();let W=t[z]==="(",BA=r(Z-1);for(;;){if(b(),t[z]==="."&&"pipe"in tA){let rA=g();BA=BA[0]==="pipe"?[...BA,rA]:["pipe",BA,rA];continue}let X=z,iA=s(tA);if(!iA)break;let AA=r(Z-1),IA=BA[0],aA=iA===IA&&!W;if(aA&&!a.includes(n[iA])){z=X;break}BA=aA&&o.includes(n[iA])?[...BA,AA]:[iA,BA,AA]}return BA},s=Z=>{let tA=Object.keys(Z).sort((W,BA)=>BA.length-W.length);for(let W of tA){let BA=Z[W];if(t.substring(z,z+BA.length)===BA)return z+=BA.length,b(),W}},l=()=>{if(b(),t[z]==="("){z++;let Z=r();return x(")"),Z}return g()},g=()=>{if(t[z]==="."){let Z=[];for(;t[z]===".";)z++,Z.push(h()??E()??m()??F("Property expected")),b();return["get",...Z]}return C()},C=()=>{let Z=z,tA=E();if(b(),!tA||t[z]!=="(")return z=Z,I();z++,b();let W=t[z]!==")"?[r()]:[];for(;z{if(t[z]==="{"){z++,b();let Z={},tA=!0;for(;z{if(t[z]==="["){z++,b();let Z=[],tA=!0;for(;zS(DhA,JSON.parse),E=()=>S(whA,Z=>Z),f=()=>S(yhA,JSON.parse),m=()=>S(vhA,JSON.parse),v=()=>{let Z=S(bhA,JSON.parse);if(Z!==void 0)return Z;F("Value expected")},k=()=>{b(),z{let W=t.substring(z).match(Z);if(W)return z+=W[0].length,tA(W[0])},b=()=>S(MhA,Z=>Z),x=Z=>{t[z]!==Z&&F(`Character '${Z}' expected`),z++},F=(Z,tA=z)=>{throw new SyntaxError(`${Z} (pos: ${tA})`)},z=0,P=r();return k(),P}var ShA=40,khA=" ",cz=(t,e)=>{let A=e?.indentation??khA,i=e?.operators??[],n=gz(sz,i),o=Object.assign({},...n),a=lz.concat(i.filter(d=>d.leftAssociative).map(d=>d.op)),r=(d,h,E=!1)=>H2(d)?s(d,h,E):JSON.stringify(d),s=(d,h,E)=>{let[f,...m]=d;if(f==="get"&&m.length>0)return g(m);if(f==="object")return l(m[0],h);if(f==="array"){let b=m.map(x=>r(x,h));return I(b,["[",", ","]"],[`[ +${h+A}`,`, +${h+A}`,` +${h}]`])}let v=o[f];if(v){let b=E?"(":"",x=E?")":"",F=m.map((z,P)=>{let Z=z?.[0],tA=n.findIndex(X=>f in X),W=n.findIndex(X=>Z in X),BA=tA0||f===Z&&!a.includes(v);return r(z,h+A,BA)});return I(F,[b,` ${v} `,x],[b,` +${h+A}${v} `,x])}let k=m.length===1?h:h+A,S=m.map(b=>r(b,k));return I(S,[`${f}(`,", ",")"],m.length===1?[`${f}(`,`, +${h}`,")"]:[`${f}( +${k}`,`, +${k}`,` +${h})`])},l=(d,h)=>{let E=h+A,f=Object.entries(d).map(([m,v])=>`${C(m)}: ${r(v,E)}`);return I(f,["{ ",", "," }"],[`{ +${E}`,`, +${E}`,` +${h}}`])},g=d=>d.map(h=>`.${C(h)}`).join(""),C=d=>mhA.test(d)?d:JSON.stringify(d),I=(d,[h,E,f],[m,v,k])=>h.length+d.reduce((S,b)=>S+b.length+E.length,0)-E.length+f.length<=(e?.maxLineLength??ShA)?h+d.join(E)+f:m+d.join(v)+k;return r(t,"")};function Cz(t,e,A){return Pa(EhA(e)?P9(e,A):e,A)(t)}var Iz={prefix:"far",iconName:"clock",icon:[512,512,[128339,"clock-four"],"f017","M464 256a208 208 0 1 1 -416 0 208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0 256 256 0 1 0 -512 0zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"]};var xhA={prefix:"far",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M384 32c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0zM64 80c-8.8 0-16 7.2-16 16l0 320c0 8.8 7.2 16 16 16l320 0c8.8 0 16-7.2 16-16l0-320c0-8.8-7.2-16-16-16L64 80zm230.7 89.9c7.8-10.7 22.8-13.1 33.5-5.3 10.7 7.8 13.1 22.8 5.3 33.5L211.4 366.1c-4.1 5.7-10.5 9.3-17.5 9.8-7 .5-13.9-2-18.8-6.9l-55.9-55.9c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l36 36 105.6-145.2z"]},j9=xhA;var dz={prefix:"far",iconName:"lightbulb",icon:[384,512,[128161],"f0eb","M296.5 291.1C321 265.2 336 230.4 336 192 336 112.5 271.5 48 192 48S48 112.5 48 192c0 38.4 15 73.2 39.5 99.1 21.3 22.4 44.9 54 53.3 92.9l102.4 0c8.4-39 32-70.5 53.3-92.9zm34.8 33C307.7 349 288 379.4 288 413.7l0 18.3c0 44.2-35.8 80-80 80l-32 0c-44.2 0-80-35.8-80-80l0-18.3C96 379.4 76.3 349 52.7 324.1 20 289.7 0 243.2 0 192 0 86 86 0 192 0S384 86 384 192c0 51.2-20 97.7-52.7 132.1zM144 184c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-48.6 39.4-88 88-88 13.3 0 24 10.7 24 24s-10.7 24-24 24c-22.1 0-40 17.9-40 40z"]};var q9={prefix:"far",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M384 80c8.8 0 16 7.2 16 16l0 320c0 8.8-7.2 16-16 16L64 432c-8.8 0-16-7.2-16-16L48 96c0-8.8 7.2-16 16-16l320 0zM64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32z"]};var Bz={prefix:"fas",iconName:"rotate",icon:[512,512,[128260,"sync-alt"],"f2f1","M480.1 192l7.9 0c13.3 0 24-10.7 24-24l0-144c0-9.7-5.8-18.5-14.8-22.2S477.9 .2 471 7L419.3 58.8C375 22.1 318 0 256 0 127 0 20.3 95.4 2.6 219.5 .1 237 12.2 253.2 29.7 255.7s33.7-9.7 36.2-27.1C79.2 135.5 159.3 64 256 64 300.4 64 341.2 79 373.7 104.3L327 151c-6.9 6.9-8.9 17.2-5.2 26.2S334.3 192 344 192l136.1 0zm29.4 100.5c2.5-17.5-9.7-33.7-27.1-36.2s-33.7 9.7-36.2 27.1c-13.3 93-93.4 164.5-190.1 164.5-44.4 0-85.2-15-117.7-40.3L185 361c6.9-6.9 8.9-17.2 5.2-26.2S177.7 320 168 320L24 320c-13.3 0-24 10.7-24 24L0 488c0 9.7 5.8 18.5 14.8 22.2S34.1 511.8 41 505l51.8-51.8C137 489.9 194 512 256 512 385 512 491.7 416.6 509.4 292.5z"]};var V9={prefix:"fas",iconName:"paste",icon:[512,512,["file-clipboard"],"f0ea","M64 0C28.7 0 0 28.7 0 64L0 384c0 35.3 28.7 64 64 64l112 0 0-224c0-61.9 50.1-112 112-112l64 0 0-48c0-35.3-28.7-64-64-64L64 0zM248 112l-144 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l144 0c13.3 0 24 10.7 24 24s-10.7 24-24 24zm40 48c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64l160 0c35.3 0 64-28.7 64-64l0-165.5c0-17-6.7-33.3-18.7-45.3l-58.5-58.5c-12-12-28.3-18.7-45.3-18.7L288 160z"]};var _hA={prefix:"fas",iconName:"crop-simple",icon:[512,512,["crop-alt"],"f565","M128 32c0-17.7-14.3-32-32-32S64 14.3 64 32l0 32-32 0C14.3 64 0 78.3 0 96s14.3 32 32 32l32 0 0 256c0 35.3 28.7 64 64 64l208 0 0-64-208 0 0-352zM384 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-32 32 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-32 0 0-256c0-35.3-28.7-64-64-64l-208 0 0 64 208 0 0 352z"]},Ez=_hA;var p4={prefix:"fas",iconName:"filter",icon:[512,512,[],"f0b0","M32 64C19.1 64 7.4 71.8 2.4 83.8S.2 109.5 9.4 118.6L192 301.3 192 416c0 8.5 3.4 16.6 9.4 22.6l64 64c9.2 9.2 22.9 11.9 34.9 6.9S320 492.9 320 480l0-178.7 182.6-182.6c9.2-9.2 11.9-22.9 6.9-34.9S492.9 64 480 64L32 64z"]};var RhA={prefix:"fas",iconName:"square-caret-down",icon:[448,512,["caret-square-down"],"f150","M384 480c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0zM224 352c-6.7 0-13-2.8-17.6-7.7l-104-112c-6.5-7-8.2-17.2-4.4-25.9S110.5 192 120 192l208 0c9.5 0 18.2 5.7 22 14.4s2.1 18.9-4.4 25.9l-104 112c-4.5 4.9-10.9 7.7-17.6 7.7z"]},hz=RhA;var kE={prefix:"fas",iconName:"caret-right",icon:[256,512,[],"f0da","M249.3 235.8c10.2 12.6 9.5 31.1-2.2 42.8l-128 128c-9.2 9.2-22.9 11.9-34.9 6.9S64.5 396.9 64.5 384l0-256c0-12.9 7.8-24.6 19.8-29.6s25.7-2.2 34.9 6.9l128 128 2.2 2.4z"]};var NhA={prefix:"fas",iconName:"magnifying-glass",icon:[512,512,[128269,"search"],"f002","M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376C296.3 401.1 253.9 416 208 416 93.1 416 0 322.9 0 208S93.1 0 208 0 416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"]},m4=NhA;var Qz={prefix:"fas",iconName:"eye",icon:[576,512,[128065],"f06e","M288 32c-80.8 0-145.5 36.8-192.6 80.6-46.8 43.5-78.1 95.4-93 131.1-3.3 7.9-3.3 16.7 0 24.6 14.9 35.7 46.2 87.7 93 131.1 47.1 43.7 111.8 80.6 192.6 80.6s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1 3.3-7.9 3.3-16.7 0-24.6-14.9-35.7-46.2-87.7-93-131.1-47.1-43.7-111.8-80.6-192.6-80.6zM144 256a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-64c0 35.3-28.7 64-64 64-11.5 0-22.3-3-31.7-8.4-1 10.9-.1 22.1 2.9 33.2 13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-12.2-45.7-55.5-74.8-101.1-70.8 5.3 9.3 8.4 20.1 8.4 31.7z"]},uz={prefix:"fas",iconName:"caret-left",icon:[256,512,[],"f0d9","M7.7 235.8c-10.3 12.6-9.5 31.1 2.2 42.8l128 128c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6l0-256c0-12.9-7.8-24.6-19.8-29.6s-25.7-2.2-34.9 6.9l-128 128-2.2 2.4z"]};var fz={prefix:"fas",iconName:"chevron-up",icon:[448,512,[],"f077","M201.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L224 173.3 54.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z"]};var pz={prefix:"fas",iconName:"circle-notch",icon:[512,512,[],"f1ce","M222.7 32.1c5 16.9-4.6 34.8-21.5 39.8-79.3 23.6-137.1 97.1-137.1 184.1 0 106 86 192 192 192s192-86 192-192c0-86.9-57.8-160.4-137.1-184.1-16.9-5-26.6-22.9-21.5-39.8s22.9-26.6 39.8-21.5C434.9 42.1 512 140 512 256 512 397.4 397.4 512 256 512S0 397.4 0 256c0-116 77.1-213.9 182.9-245.4 16.9-5 34.8 4.6 39.8 21.5z"]};var FhA={prefix:"fas",iconName:"ellipsis-vertical",icon:[128,512,["ellipsis-v"],"f142","M64 144a56 56 0 1 1 0-112 56 56 0 1 1 0 112zm0 224c30.9 0 56 25.1 56 56s-25.1 56-56 56-56-25.1-56-56 25.1-56 56-56zm56-112c0 30.9-25.1 56-56 56s-56-25.1-56-56 25.1-56 56-56 56 25.1 56 56z"]},W9=FhA;var LhA={prefix:"fas",iconName:"pen-to-square",icon:[512,512,["edit"],"f044","M471.6 21.7c-21.9-21.9-57.3-21.9-79.2 0L368 46.1 465.9 144 490.3 119.6c21.9-21.9 21.9-57.3 0-79.2L471.6 21.7zm-299.2 220c-6.1 6.1-10.8 13.6-13.5 21.9l-29.6 88.8c-2.9 8.6-.6 18.1 5.8 24.6s15.9 8.7 24.6 5.8l88.8-29.6c8.2-2.7 15.7-7.4 21.9-13.5L432 177.9 334.1 80 172.4 241.7zM96 64C43 64 0 107 0 160L0 416c0 53 43 96 96 96l256 0c53 0 96-43 96-96l0-96c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 96c0 17.7-14.3 32-32 32L96 448c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L96 64z"]},mz=LhA;var Z9={prefix:"fas",iconName:"clone",icon:[512,512,[],"f24d","M288 448l-224 0 0-224 48 0 0-64-48 0c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l224 0c35.3 0 64-28.7 64-64l0-48-64 0 0 48zm-64-96l224 0c35.3 0 64-28.7 64-64l0-224c0-35.3-28.7-64-64-64L224 0c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64z"]};var GhA={prefix:"fas",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M384 32c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0zM342 145.7c-10.7-7.8-25.7-5.4-33.5 5.3L189.1 315.2 137 263.1c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l72 72c5 5 11.9 7.5 18.8 7s13.4-4.1 17.5-9.8L347.3 179.2c7.8-10.7 5.4-25.7-5.3-33.5z"]},X9=GhA;var KhA={prefix:"fas",iconName:"square-caret-up",icon:[448,512,["caret-square-up"],"f151","M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zM224 160c6.7 0 13 2.8 17.6 7.7l104 112c6.5 7 8.2 17.2 4.4 25.9S337.5 320 328 320l-208 0c-9.5 0-18.2-5.7-22-14.4s-2.1-18.9 4.4-25.9l104-112c4.5-4.9 10.9-7.7 17.6-7.7z"]},wz=KhA;var w4={prefix:"fas",iconName:"code",icon:[576,512,[],"f121","M360.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6zm64.6 136.1c-12.5 12.5-12.5 32.8 0 45.3l73.4 73.4-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0zm-274.7 0c-12.5-12.5-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256 150.6 182.6c12.5-12.5 12.5-32.8 0-45.3z"]};var $9={prefix:"fas",iconName:"angle-right",icon:[256,512,[8250],"f105","M247.1 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L179.2 256 41.9 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"]};var UhA={prefix:"fas",iconName:"gear",icon:[512,512,[9881,"cog"],"f013","M195.1 9.5C198.1-5.3 211.2-16 226.4-16l59.8 0c15.2 0 28.3 10.7 31.3 25.5L332 79.5c14.1 6 27.3 13.7 39.3 22.8l67.8-22.5c14.4-4.8 30.2 1.2 37.8 14.4l29.9 51.8c7.6 13.2 4.9 29.8-6.5 39.9L447 233.3c.9 7.4 1.3 15 1.3 22.7s-.5 15.3-1.3 22.7l53.4 47.5c11.4 10.1 14 26.8 6.5 39.9l-29.9 51.8c-7.6 13.1-23.4 19.2-37.8 14.4l-67.8-22.5c-12.1 9.1-25.3 16.7-39.3 22.8l-14.4 69.9c-3.1 14.9-16.2 25.5-31.3 25.5l-59.8 0c-15.2 0-28.3-10.7-31.3-25.5l-14.4-69.9c-14.1-6-27.2-13.7-39.3-22.8L73.5 432.3c-14.4 4.8-30.2-1.2-37.8-14.4L5.8 366.1c-7.6-13.2-4.9-29.8 6.5-39.9l53.4-47.5c-.9-7.4-1.3-15-1.3-22.7s.5-15.3 1.3-22.7L12.3 185.8c-11.4-10.1-14-26.8-6.5-39.9L35.7 94.1c7.6-13.2 23.4-19.2 37.8-14.4l67.8 22.5c12.1-9.1 25.3-16.7 39.3-22.8L195.1 9.5zM256.3 336a80 80 0 1 0 -.6-160 80 80 0 1 0 .6 160z"]},Dz=UhA;var yz={prefix:"fas",iconName:"up-right-and-down-left-from-center",icon:[512,512,["expand-alt"],"f424","M344 0L488 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S334.3 0 344 0zM168 512L24 512c-13.3 0-24-10.7-24-24L0 344c0-9.7 5.8-18.5 14.8-22.2S34.1 320.2 41 327l39 39 87-87c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S177.7 512 168 512z"]};var CC={prefix:"fas",iconName:"wrench",icon:[576,512,[128295],"f0ad","M509.4 98.6c7.6-7.6 20.3-5.7 24.1 4.3 6.8 17.7 10.5 37 10.5 57.1 0 88.4-71.6 160-160 160-17.5 0-34.4-2.8-50.2-8L146.9 498.9c-28.1 28.1-73.7 28.1-101.8 0s-28.1-73.7 0-101.8L232 210.2c-5.2-15.8-8-32.6-8-50.2 0-88.4 71.6-160 160-160 20.1 0 39.4 3.7 57.1 10.5 10 3.8 11.8 16.5 4.3 24.1l-88.7 88.7c-3 3-4.7 7.1-4.7 11.3l0 41.4c0 8.8 7.2 16 16 16l41.4 0c4.2 0 8.3-1.7 11.3-4.7l88.7-88.7z"]},T8={prefix:"fas",iconName:"trash-can",icon:[448,512,[61460,"trash-alt"],"f2ed","M136.7 5.9C141.1-7.2 153.3-16 167.1-16l113.9 0c13.8 0 26 8.8 30.4 21.9L320 32 416 32c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 96C14.3 96 0 81.7 0 64S14.3 32 32 32l96 0 8.7-26.1zM32 144l384 0 0 304c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-304zm88 64c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24z"]};var J8={prefix:"fas",iconName:"check",icon:[448,512,[10003,10004],"f00c","M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z"]};var vz={prefix:"fas",iconName:"xmark",icon:[384,512,[128473,10005,10006,10060,215,"close","multiply","remove","times"],"f00d","M55.1 73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L147.2 256 9.9 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192.5 301.3 329.9 438.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.8 256 375.1 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192.5 210.7 55.1 73.4z"]},bz=vz;var D4=vz;var F1={prefix:"fas",iconName:"pen",icon:[512,512,[128394],"f304","M352.9 21.2L308 66.1 445.9 204 490.8 159.1C504.4 145.6 512 127.2 512 108s-7.6-37.6-21.2-51.1L455.1 21.2C441.6 7.6 423.2 0 404 0s-37.6 7.6-51.1 21.2zM274.1 100L58.9 315.1c-10.7 10.7-18.5 24.1-22.6 38.7L.9 481.6c-2.3 8.3 0 17.3 6.2 23.4s15.1 8.5 23.4 6.2l127.8-35.5c14.6-4.1 27.9-11.8 38.7-22.6L412 237.9 274.1 100z"]};var Mz={prefix:"fas",iconName:"chevron-down",icon:[448,512,[],"f078","M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"]};var Sz={prefix:"fas",iconName:"angle-down",icon:[384,512,[8964],"f107","M169.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 306.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var ThA={prefix:"fas",iconName:"arrow-down-short-wide",icon:[576,512,["sort-amount-desc","sort-amount-down-alt"],"f884","M246.6 374.6l-96 96c-12.5 12.5-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L96 370.7 96 64c0-17.7 14.3-32 32-32s32 14.3 32 32l0 306.7 41.4-41.4c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3zM320 32l32 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l96 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-96 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l224 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-224 0c-17.7 0-32-14.3-32-32s14.3-32 32-32z"]};var y4=ThA;var JhA={prefix:"fas",iconName:"triangle-exclamation",icon:[512,512,[9888,"exclamation-triangle","warning"],"f071","M256 0c14.7 0 28.2 8.1 35.2 21l216 400c6.7 12.4 6.4 27.4-.8 39.5S486.1 480 472 480L40 480c-14.1 0-27.2-7.4-34.4-19.5s-7.5-27.1-.8-39.5l216-400c7-12.9 20.5-21 35.2-21zm0 352a32 32 0 1 0 0 64 32 32 0 1 0 0-64zm0-192c-18.2 0-32.7 15.5-31.4 33.7l7.4 104c.9 12.5 11.4 22.3 23.9 22.3 12.6 0 23-9.7 23.9-22.3l7.4-104c1.3-18.2-13.1-33.7-31.4-33.7z"]},z2=JhA;var OhA={prefix:"fas",iconName:"scissors",icon:[512,512,[9984,9986,9988,"cut"],"f0c4","M192 256l-39.5 39.5c-12.6-4.9-26.2-7.5-40.5-7.5-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112c0-14.3-2.7-27.9-7.5-40.5L499.2 76.8c7.1-7.1 7.1-18.5 0-25.6-28.3-28.3-74.1-28.3-102.4 0L256 192 216.5 152.5c4.9-12.6 7.5-26.2 7.5-40.5 0-61.9-50.1-112-112-112S0 50.1 0 112 50.1 224 112 224c14.3 0 27.9-2.7 40.5-7.5L192 256zm97.9 97.9L396.8 460.8c28.3 28.3 74.1 28.3 102.4 0 7.1-7.1 7.1-18.5 0-25.6l-145.3-145.3-64 64zM64 112a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm48 240a48 48 0 1 1 0 96 48 48 0 1 1 0-96z"]},L1=OhA;var v4={prefix:"fas",iconName:"arrow-right-arrow-left",icon:[512,512,[8644,"exchange"],"f0ec","M502.6 150.6l-96 96c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L402.7 160 32 160c-17.7 0-32-14.3-32-32S14.3 96 32 96l370.7 0-41.4-41.4c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l96 96c12.5 12.5 12.5 32.8 0 45.3zm-397.3 352l-96-96c-12.5-12.5-12.5-32.8 0-45.3l96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3L109.3 352 480 352c17.7 0 32 14.3 32 32s-14.3 32-32 32l-370.7 0 41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0z"]};var AS={prefix:"fas",iconName:"caret-up",icon:[320,512,[],"f0d8","M140.3 135.2c12.6-10.3 31.1-9.5 42.8 2.2l128 128c9.2 9.2 11.9 22.9 6.9 34.9S301.4 320 288.5 320l-256 0c-12.9 0-24.6-7.8-29.6-19.8S.7 274.5 9.9 265.4l128-128 2.4-2.2z"]};var kz={prefix:"fas",iconName:"down-left-and-up-right-to-center",icon:[512,512,["compress-alt"],"f422","M439.5 7c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S450.2 240 440.5 240l-144 0c-13.3 0-24-10.7-24-24l0-144c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39 87-87zM72.5 272l144 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S62.8 272 72.5 272z"]};var G1={prefix:"fas",iconName:"plus",icon:[448,512,[10133,61543,"add"],"2b","M256 64c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 160-160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l160 0 0 160c0 17.7 14.3 32 32 32s32-14.3 32-32l0-160 160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-160 0 0-160z"]};var IC={prefix:"fas",iconName:"copy",icon:[448,512,[],"f0c5","M192 0c-35.3 0-64 28.7-64 64l0 256c0 35.3 28.7 64 64 64l192 0c35.3 0 64-28.7 64-64l0-200.6c0-17.4-7.1-34.1-19.7-46.2L370.6 17.8C358.7 6.4 342.8 0 326.3 0L192 0zM64 128c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l192 0c35.3 0 64-28.7 64-64l0-16-64 0 0 16-192 0 0-256 16 0 0-64-16 0z"]};var YhA={prefix:"fas",iconName:"arrow-rotate-right",icon:[512,512,[8635,"arrow-right-rotate","arrow-rotate-forward","redo"],"f01e","M436.7 74.7L448 85.4 448 32c0-17.7 14.3-32 32-32s32 14.3 32 32l0 128c0 17.7-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l47.9 0-7.6-7.2c-.2-.2-.4-.4-.6-.6-75-75-196.5-75-271.5 0s-75 196.5 0 271.5 196.5 75 271.5 0c8.2-8.2 15.5-16.9 21.9-26.1 10.1-14.5 30.1-18 44.6-7.9s18 30.1 7.9 44.6c-8.5 12.2-18.2 23.8-29.1 34.7-100 100-262.1 100-362 0S-25 175 75 75c99.9-99.9 261.7-100 361.7-.3z"]};var O8=YhA;var c0={prefix:"fas",iconName:"caret-down",icon:[320,512,[],"f0d7","M140.3 376.8c12.6 10.2 31.1 9.5 42.8-2.2l128-128c9.2-9.2 11.9-22.9 6.9-34.9S301.4 192 288.5 192l-256 0c-12.9 0-24.6 7.8-29.6 19.8S.7 237.5 9.9 246.6l128 128 2.4 2.2z"]};var HhA={prefix:"fas",iconName:"arrow-rotate-left",icon:[512,512,[8634,"arrow-left-rotate","arrow-rotate-back","arrow-rotate-backward","undo"],"f0e2","M256 64c-56.8 0-107.9 24.7-143.1 64l47.1 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 192c-17.7 0-32-14.3-32-32L0 32C0 14.3 14.3 0 32 0S64 14.3 64 32l0 54.7C110.9 33.6 179.5 0 256 0 397.4 0 512 114.6 512 256S397.4 512 256 512c-87 0-163.9-43.4-210.1-109.7-10.1-14.5-6.6-34.4 7.9-44.6s34.4-6.6 44.6 7.9c34.8 49.8 92.4 82.3 157.6 82.3 106 0 192-86 192-192S362 64 256 64z"]};var Y8=HhA;var eS={prefix:"fas",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M64 32l320 0c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32z"]};var tS={prefix:"fas",iconName:"arrow-down",icon:[384,512,[8595],"f063","M169.4 502.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 402.7 224 32c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 370.7-105.4-105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var YZ=K3(Rz(),1);var Nz=Number.isNaN||function(e){return typeof e=="number"&&e!==e};function zhA(t,e){return!!(t===e||Nz(t)&&Nz(e))}function PhA(t,e){if(t.length!==e.length)return!1;for(var A=0;A{if(typeof n!="object"||!n.name||!n.init)throw new Error("Invalid JSEP plugin format");this.registered[n.name]||(n.init(this.jsep),this.registered[n.name]=n)})}},ol=class t{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+t.version}static addUnaryOp(e){return t.max_unop_len=Math.max(e.length,t.max_unop_len),t.unary_ops[e]=1,t}static addBinaryOp(e,A,i){return t.max_binop_len=Math.max(e.length,t.max_binop_len),t.binary_ops[e]=A,i?t.right_associative.add(e):t.right_associative.delete(e),t}static addIdentifierChar(e){return t.additional_identifier_chars.add(e),t}static addLiteral(e,A){return t.literals[e]=A,t}static removeUnaryOp(e){return delete t.unary_ops[e],e.length===t.max_unop_len&&(t.max_unop_len=t.getMaxKeyLen(t.unary_ops)),t}static removeAllUnaryOps(){return t.unary_ops={},t.max_unop_len=0,t}static removeIdentifierChar(e){return t.additional_identifier_chars.delete(e),t}static removeBinaryOp(e){return delete t.binary_ops[e],e.length===t.max_binop_len&&(t.max_binop_len=t.getMaxKeyLen(t.binary_ops)),t.right_associative.delete(e),t}static removeAllBinaryOps(){return t.binary_ops={},t.max_binop_len=0,t}static removeLiteral(e){return delete t.literals[e],t}static removeAllLiterals(){return t.literals={},t}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(e){this.expr=e,this.index=0}static parse(e){return new t(e).parse()}static getMaxKeyLen(e){return Math.max(0,...Object.keys(e).map(A=>A.length))}static isDecimalDigit(e){return e>=48&&e<=57}static binaryPrecedence(e){return t.binary_ops[e]||0}static isIdentifierStart(e){return e>=65&&e<=90||e>=97&&e<=122||e>=128&&!t.binary_ops[String.fromCharCode(e)]||t.additional_identifier_chars.has(String.fromCharCode(e))}static isIdentifierPart(e){return t.isIdentifierStart(e)||t.isDecimalDigit(e)}throwError(e){let A=new Error(e+" at character "+this.index);throw A.index=this.index,A.description=e,A}runHook(e,A){if(t.hooks[e]){let i={context:this,node:A};return t.hooks.run(e,i),i.node}return A}searchHook(e){if(t.hooks[e]){let A={context:this};return t.hooks[e].find(function(i){return i.call(A.context,A),A.node}),A.node}}gobbleSpaces(){let e=this.code;for(;e===t.SPACE_CODE||e===t.TAB_CODE||e===t.LF_CODE||e===t.CR_CODE;)e=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");let e=this.gobbleExpressions(),A=e.length===1?e[0]:{type:t.COMPOUND,body:e};return this.runHook("after-all",A)}gobbleExpressions(e){let A=[],i,n;for(;this.index0;){if(t.binary_ops.hasOwnProperty(e)&&(!t.isIdentifierStart(this.code)||this.index+e.lengtho.right_a&&C.right_a?i>C.prec:i<=C.prec;for(;n.length>2&&g(n[n.length-2]);)r=n.pop(),A=n.pop().value,a=n.pop(),e={type:t.BINARY_EXP,operator:A,left:a,right:r},n.push(e);e=this.gobbleToken(),e||this.throwError("Expected expression after "+l),n.push(o,e)}for(s=n.length-1,e=n[s];s>1;)e={type:t.BINARY_EXP,operator:n[s-1].value,left:n[s-2],right:e},s-=2;return e}gobbleToken(){let e,A,i,n;if(this.gobbleSpaces(),n=this.searchHook("gobble-token"),n)return this.runHook("after-token",n);if(e=this.code,t.isDecimalDigit(e)||e===t.PERIOD_CODE)return this.gobbleNumericLiteral();if(e===t.SQUOTE_CODE||e===t.DQUOTE_CODE)n=this.gobbleStringLiteral();else if(e===t.OBRACK_CODE)n=this.gobbleArray();else{for(A=this.expr.substr(this.index,t.max_unop_len),i=A.length;i>0;){if(t.unary_ops.hasOwnProperty(A)&&(!t.isIdentifierStart(this.code)||this.index+A.length=A.length&&this.throwError("Unexpected token "+String.fromCharCode(e));break}else if(o===t.COMMA_CODE){if(this.index++,n++,n!==A.length){if(e===t.CPAREN_CODE)this.throwError("Unexpected token ,");else if(e===t.CBRACK_CODE)for(let a=A.length;a":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"});ol.max_unop_len=ol.getMaxKeyLen(ol.unary_ops);ol.max_binop_len=ol.getMaxKeyLen(ol.binary_ops);var C0=t=>new ol(t).parse(),qhA=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(ol).filter(t=>!qhA.includes(t)&&C0[t]===void 0).forEach(t=>{C0[t]=ol[t]});C0.Jsep=ol;var VhA="ConditionalExpression",WhA={name:"ternary",init(t){t.hooks.add("after-expression",function(A){if(A.node&&this.code===t.QUMARK_CODE){this.index++;let i=A.node,n=this.gobbleExpression();if(n||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===t.COLON_CODE){this.index++;let o=this.gobbleExpression();if(o||this.throwError("Expected expression"),A.node={type:VhA,test:i,consequent:n,alternate:o},i.operator&&t.binary_ops[i.operator]<=.9){let a=i;for(;a.right.operator&&t.binary_ops[a.right.operator]<=.9;)a=a.right;A.node.test=a.right,a.right=A.node,A.node=i}}else this.throwError("Expected :")}})}};C0.plugins.register(WhA);var Lz=47,ZhA=92,XhA={name:"regex",init(t){t.hooks.add("gobble-token",function(A){if(this.code===Lz){let i=++this.index,n=!1;for(;this.index=97&&s<=122||s>=65&&s<=90||s>=48&&s<=57)a+=this.char;else break}let r;try{r=new RegExp(o,a)}catch(s){this.throwError(s.message)}return A.node={type:t.LITERAL,value:r,raw:this.expr.slice(i-1,this.index)},A.node=this.gobbleTokenProperty(A.node),A.node}this.code===t.OBRACK_CODE?n=!0:n&&this.code===t.CBRACK_CODE&&(n=!1),this.index+=this.code===ZhA?2:1}this.throwError("Unclosed Regex")}})}},iS=43,$hA=45,_E={name:"assignment",assignmentOperators:new Set(["=","*=","**=","/=","%=","+=","-=","<<=",">>=",">>>=","&=","^=","|=","||=","&&=","??="]),updateOperators:[iS,$hA],assignmentPrecedence:.9,init(t){let e=[t.IDENTIFIER,t.MEMBER_EXP];_E.assignmentOperators.forEach(i=>t.addBinaryOp(i,_E.assignmentPrecedence,!0)),t.hooks.add("gobble-token",function(n){let o=this.code;_E.updateOperators.some(a=>a===o&&a===this.expr.charCodeAt(this.index+1))&&(this.index+=2,n.node={type:"UpdateExpression",operator:o===iS?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},(!n.node.argument||!e.includes(n.node.argument.type))&&this.throwError(`Unexpected ${n.node.operator}`))}),t.hooks.add("after-token",function(n){if(n.node){let o=this.code;_E.updateOperators.some(a=>a===o&&a===this.expr.charCodeAt(this.index+1))&&(e.includes(n.node.type)||this.throwError(`Unexpected ${n.node.operator}`),this.index+=2,n.node={type:"UpdateExpression",operator:o===iS?"++":"--",argument:n.node,prefix:!1})}}),t.hooks.add("after-expression",function(n){n.node&&A(n.node)});function A(i){_E.assignmentOperators.has(i.operator)?(i.type="AssignmentExpression",A(i.left),A(i.right)):i.operator||Object.values(i).forEach(n=>{n&&typeof n=="object"&&A(n)})}}};C0.plugins.register(XhA,_E);C0.addUnaryOp("typeof");C0.addUnaryOp("void");C0.addLiteral("null",null);C0.addLiteral("undefined",void 0);var AQA=new Set(["constructor","__proto__","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"]),xo={evalAst(t,e){switch(t.type){case"BinaryExpression":case"LogicalExpression":return xo.evalBinaryExpression(t,e);case"Compound":return xo.evalCompound(t,e);case"ConditionalExpression":return xo.evalConditionalExpression(t,e);case"Identifier":return xo.evalIdentifier(t,e);case"Literal":return xo.evalLiteral(t,e);case"MemberExpression":return xo.evalMemberExpression(t,e);case"UnaryExpression":return xo.evalUnaryExpression(t,e);case"ArrayExpression":return xo.evalArrayExpression(t,e);case"CallExpression":return xo.evalCallExpression(t,e);case"AssignmentExpression":return xo.evalAssignmentExpression(t,e);default:throw SyntaxError("Unexpected expression",t)}},evalBinaryExpression(t,e){return{"||":(i,n)=>i||n(),"&&":(i,n)=>i&&n(),"|":(i,n)=>i|n(),"^":(i,n)=>i^n(),"&":(i,n)=>i&n(),"==":(i,n)=>i==n(),"!=":(i,n)=>i!=n(),"===":(i,n)=>i===n(),"!==":(i,n)=>i!==n(),"<":(i,n)=>i":(i,n)=>i>n(),"<=":(i,n)=>i<=n(),">=":(i,n)=>i>=n(),"<<":(i,n)=>i<>":(i,n)=>i>>n(),">>>":(i,n)=>i>>>n(),"+":(i,n)=>i+n(),"-":(i,n)=>i-n(),"*":(i,n)=>i*n(),"/":(i,n)=>i/n(),"%":(i,n)=>i%n()}[t.operator](xo.evalAst(t.left,e),()=>xo.evalAst(t.right,e))},evalCompound(t,e){let A;for(let i=0;i-xo.evalAst(i,e),"!":i=>!xo.evalAst(i,e),"~":i=>~xo.evalAst(i,e),"+":i=>+xo.evalAst(i,e),typeof:i=>typeof xo.evalAst(i,e),void:i=>{xo.evalAst(i,e)}}[t.operator](t.argument)},evalArrayExpression(t,e){return t.elements.map(A=>xo.evalAst(A,e))},evalCallExpression(t,e){let A=t.arguments.map(n=>xo.evalAst(n,e)),i=xo.evalAst(t.callee,e);if(i===Function)throw new Error("Function constructor is disabled");return i(...A)},evalAssignmentExpression(t,e){if(t.left.type!=="Identifier")throw SyntaxError("Invalid left-hand side in assignment");let A=t.left.name,i=xo.evalAst(t.right,e);return e[A]=i,e[A]}},aS=class{constructor(e){this.code=e,this.ast=C0(this.code)}runInNewContext(e){let A=Object.assign(Object.create(null),e);return xo.evalAst(this.ast,A)}};function P2(t,e){return t=t.slice(),t.push(e),t}function rS(t,e){return e=e.slice(),e.unshift(t),e}var sS=class extends Error{constructor(e){super('JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)'),this.avoidNew=!0,this.value=e,this.name="NewError"}};function to(t,e,A,i,n){if(!(this instanceof to))try{return new to(t,e,A,i,n)}catch(a){if(!a.avoidNew)throw a;return a.value}typeof t=="string"&&(n=i,i=A,A=e,e=t,t=null);let o=t&&typeof t=="object";if(t=t||{},this.json=t.json||A,this.path=t.path||e,this.resultType=t.resultType||"value",this.flatten=t.flatten||!1,this.wrap=Object.hasOwn(t,"wrap")?t.wrap:!0,this.sandbox=t.sandbox||{},this.eval=t.eval===void 0?"safe":t.eval,this.ignoreEvalErrors=typeof t.ignoreEvalErrors>"u"?!1:t.ignoreEvalErrors,this.parent=t.parent||null,this.parentProperty=t.parentProperty||null,this.callback=t.callback||i||null,this.otherTypeCallback=t.otherTypeCallback||n||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},t.autostart!==!1){let a={path:o?t.path:e};o?"json"in t&&(a.json=t.json):a.json=A;let r=this.evaluate(a);if(!r||typeof r!="object")throw new sS(r);return r}}to.prototype.evaluate=function(t,e,A,i){let n=this.parent,o=this.parentProperty,{flatten:a,wrap:r}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,A=A||this.callback,this.currOtherTypeCallback=i||this.otherTypeCallback,e=e||this.json,t=t||this.path,t&&typeof t=="object"&&!Array.isArray(t)){if(!t.path&&t.path!=="")throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(t,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');({json:e}=t),a=Object.hasOwn(t,"flatten")?t.flatten:a,this.currResultType=Object.hasOwn(t,"resultType")?t.resultType:this.currResultType,this.currSandbox=Object.hasOwn(t,"sandbox")?t.sandbox:this.currSandbox,r=Object.hasOwn(t,"wrap")?t.wrap:r,this.currEval=Object.hasOwn(t,"eval")?t.eval:this.currEval,A=Object.hasOwn(t,"callback")?t.callback:A,this.currOtherTypeCallback=Object.hasOwn(t,"otherTypeCallback")?t.otherTypeCallback:this.currOtherTypeCallback,n=Object.hasOwn(t,"parent")?t.parent:n,o=Object.hasOwn(t,"parentProperty")?t.parentProperty:o,t=t.path}if(n=n||null,o=o||null,Array.isArray(t)&&(t=to.toPathString(t)),!t&&t!==""||!e)return;let s=to.toPathArray(t);s[0]==="$"&&s.length>1&&s.shift(),this._hasParentSelector=null;let l=this._trace(s,e,["$"],n,o,A).filter(function(g){return g&&!g.isParentSelector});return l.length?!r&&l.length===1&&!l[0].hasArrExpr?this._getPreferredOutput(l[0]):l.reduce((g,C)=>{let I=this._getPreferredOutput(C);return a&&Array.isArray(I)?g=g.concat(I):g.push(I),g},[]):r?[]:void 0};to.prototype._getPreferredOutput=function(t){let e=this.currResultType;switch(e){case"all":{let A=Array.isArray(t.path)?t.path:to.toPathArray(t.path);return t.pointer=to.toPointer(A),t.path=typeof t.path=="string"?t.path:to.toPathString(t.path),t}case"value":case"parent":case"parentProperty":return t[e];case"path":return to.toPathString(t[e]);case"pointer":return to.toPointer(t.path);default:throw new TypeError("Unknown result type")}};to.prototype._handleCallback=function(t,e,A){if(e){let i=this._getPreferredOutput(t);t.path=typeof t.path=="string"?t.path:to.toPathString(t.path),e(i,A,t)}};to.prototype._trace=function(t,e,A,i,n,o,a,r){let s;if(!t.length)return s={path:A,value:e,parent:i,parentProperty:n,hasArrExpr:a},this._handleCallback(s,o,"value"),s;let l=t[0],g=t.slice(1),C=[];function I(d){Array.isArray(d)?d.forEach(h=>{C.push(h)}):C.push(d)}if((typeof l!="string"||r)&&e&&Object.hasOwn(e,l))I(this._trace(g,e[l],P2(A,l),e,l,o,a));else if(l==="*")this._walk(e,d=>{I(this._trace(g,e[d],P2(A,d),e,d,o,!0,!0))});else if(l==="..")I(this._trace(g,e,A,i,n,o,a)),this._walk(e,d=>{typeof e[d]=="object"&&I(this._trace(t.slice(),e[d],P2(A,d),e,d,o,!0))});else{if(l==="^")return this._hasParentSelector=!0,{path:A.slice(0,-1),expr:g,isParentSelector:!0};if(l==="~")return s={path:P2(A,l),value:n,parent:i,parentProperty:null},this._handleCallback(s,o,"property"),s;if(l==="$")I(this._trace(g,e,A,null,null,o,a));else if(/^(-?\d*):(-?\d*):?(\d*)$/u.test(l))I(this._slice(l,g,e,A,i,n,o));else if(l.indexOf("?(")===0){if(this.currEval===!1)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");let d=l.replace(/^\?\((.*?)\)$/u,"$1"),h=/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(d);h?this._walk(e,E=>{let f=[h[2]],m=h[1]?e[E][h[1]]:e[E];this._trace(f,m,A,i,n,o,!0).length>0&&I(this._trace(g,e[E],P2(A,E),e,E,o,!0))}):this._walk(e,E=>{this._eval(d,e[E],E,A,i,n)&&I(this._trace(g,e[E],P2(A,E),e,E,o,!0))})}else if(l[0]==="("){if(this.currEval===!1)throw new Error("Eval [(expr)] prevented in JSONPath expression.");I(this._trace(rS(this._eval(l,e,A.at(-1),A.slice(0,-1),i,n),g),e,A,i,n,o,a))}else if(l[0]==="@"){let d=!1,h=l.slice(1,-2);switch(h){case"scalar":(!e||!["object","function"].includes(typeof e))&&(d=!0);break;case"boolean":case"string":case"undefined":case"function":typeof e===h&&(d=!0);break;case"integer":Number.isFinite(e)&&!(e%1)&&(d=!0);break;case"number":Number.isFinite(e)&&(d=!0);break;case"nonFinite":typeof e=="number"&&!Number.isFinite(e)&&(d=!0);break;case"object":e&&typeof e===h&&(d=!0);break;case"array":Array.isArray(e)&&(d=!0);break;case"other":d=this.currOtherTypeCallback(e,A,i,n);break;case"null":e===null&&(d=!0);break;default:throw new TypeError("Unknown value type "+h)}if(d)return s={path:A,value:e,parent:i,parentProperty:n},this._handleCallback(s,o,"value"),s}else if(l[0]==="`"&&e&&Object.hasOwn(e,l.slice(1))){let d=l.slice(1);I(this._trace(g,e[d],P2(A,d),e,d,o,a,!0))}else if(l.includes(",")){let d=l.split(",");for(let h of d)I(this._trace(rS(h,g),e,A,i,n,o,!0))}else!r&&e&&Object.hasOwn(e,l)&&I(this._trace(g,e[l],P2(A,l),e,l,o,a,!0))}if(this._hasParentSelector)for(let d=0;d{e(A)})};to.prototype._slice=function(t,e,A,i,n,o,a){if(!Array.isArray(A))return;let r=A.length,s=t.split(":"),l=s[2]&&Number.parseInt(s[2])||1,g=s[0]&&Number.parseInt(s[0])||0,C=s[1]&&Number.parseInt(s[1])||r;g=g<0?Math.max(0,g+r):Math.min(r,g),C=C<0?Math.max(0,C+r):Math.min(r,C);let I=[];for(let d=g;d{I.push(E)});return I};to.prototype._eval=function(t,e,A,i,n,o){this.currSandbox._$_parentProperty=o,this.currSandbox._$_parent=n,this.currSandbox._$_property=A,this.currSandbox._$_root=this.json,this.currSandbox._$_v=e;let a=t.includes("@path");a&&(this.currSandbox._$_path=to.toPathString(i.concat([A])));let r=this.currEval+"Script:"+t;if(!to.cache[r]){let s=t.replaceAll("@parentProperty","_$_parentProperty").replaceAll("@parent","_$_parent").replaceAll("@property","_$_property").replaceAll("@root","_$_root").replaceAll(/@([.\s)[])/gu,"_$_v$1");if(a&&(s=s.replaceAll("@path","_$_path")),this.currEval==="safe"||this.currEval===!0||this.currEval===void 0)to.cache[r]=new this.safeVm.Script(s);else if(this.currEval==="native")to.cache[r]=new this.vm.Script(s);else if(typeof this.currEval=="function"&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,"runInNewContext")){let l=this.currEval;to.cache[r]=new l(s)}else if(typeof this.currEval=="function")to.cache[r]={runInNewContext:l=>this.currEval(s,l)};else throw new TypeError(`Unknown "eval" property "${this.currEval}"`)}try{return to.cache[r].runInNewContext(this.currSandbox)}catch(s){if(this.ignoreEvalErrors)return!1;throw new Error("jsonPath: "+s.message+": "+t)}};to.cache={};to.toPathString=function(t){let e=t,A=e.length,i="$";for(let n=1;ntypeof e[l]=="function");let o=i.map(l=>e[l]);A=n.reduce((l,g)=>{let C=e[g].toString();return/function/u.test(C)||(C="function "+C),"var "+g+"="+C+";"+l},"")+A,!/(['"])use strict\1/u.test(A)&&!i.includes("arguments")&&(A="var arguments = undefined;"+A),A=A.replace(/;\s*$/u,"");let r=A.lastIndexOf(";"),s=r!==-1?A.slice(0,r+1)+" return "+A.slice(r+1):" return "+A;return new Function(...i,s)(...o)}};to.prototype.vm={Script:lS};var cS=[],Tz=[];(()=>{let t="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,A=0;e>1;if(t=Tz[i])e=i+1;else return!0;if(e==A)return!1}}function Gz(t){return t>=127462&&t<=127487}var Kz=8205;function Jz(t,e,A=!0,i=!0){return(A?Oz:iQA)(t,e,i)}function Oz(t,e,A){if(e==t.length)return e;e&&Yz(t.charCodeAt(e))&&Hz(t.charCodeAt(e-1))&&e--;let i=gS(t,e);for(e+=Uz(i);e=0&&Gz(gS(t,a));)o++,a-=2;if(o%2==0)break;e+=2}else break}return e}function iQA(t,e,A){for(;e>0;){let i=Oz(t,e-2,A);if(i=56320&&t<57344}function Hz(t){return t>=55296&&t<56320}function Uz(t){return t<65536?1:2}var bn=class t{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,A,i){[e,A]=GE(this,e,A);let n=[];return this.decompose(0,e,n,2),i.length&&i.decompose(0,i.length,n,3),this.decompose(A,this.length,n,1),NE.from(n,this.length-(A-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,A=this.length){[e,A]=GE(this,e,A);let i=[];return this.decompose(e,A,i,0),NE.from(i,A-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let A=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),n=new T1(this),o=new T1(e);for(let a=A,r=A;;){if(n.next(a),o.next(a),a=0,n.lineBreak!=o.lineBreak||n.done!=o.done||n.value!=o.value)return!1;if(r+=n.value.length,n.done||r>=i)return!0}}iter(e=1){return new T1(this,e)}iterRange(e,A=this.length){return new V8(this,e,A)}iterLines(e,A){let i;if(e==null)i=this.iter();else{A==null&&(A=this.lines+1);let n=this.line(e).from;i=this.iterRange(n,Math.max(n,A==this.lines+1?this.length:A<=1?0:this.line(A-1).to))}return new W8(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?t.empty:e.length<=32?new xl(e):NE.from(xl.split(e,[]))}},xl=class t extends bn{constructor(e,A=nQA(e)){super(),this.text=e,this.length=A}get lines(){return this.text.length}get children(){return null}lineInner(e,A,i,n){for(let o=0;;o++){let a=this.text[o],r=n+a.length;if((A?i:r)>=e)return new dS(n,r,i,a);n=r+1,i++}}decompose(e,A,i,n){let o=e<=0&&A>=this.length?this:new t(zz(this.text,e,A),Math.min(A,this.length)-Math.max(0,e));if(n&1){let a=i.pop(),r=q8(o.text,a.text.slice(),0,o.length);if(r.length<=32)i.push(new t(r,a.length+o.length));else{let s=r.length>>1;i.push(new t(r.slice(0,s)),new t(r.slice(s)))}}else i.push(o)}replace(e,A,i){if(!(i instanceof t))return super.replace(e,A,i);[e,A]=GE(this,e,A);let n=q8(this.text,q8(i.text,zz(this.text,0,e)),A),o=this.length+i.length-(A-e);return n.length<=32?new t(n,o):NE.from(t.split(n,[]),o)}sliceString(e,A=this.length,i=` +`){[e,A]=GE(this,e,A);let n="";for(let o=0,a=0;o<=A&&ae&&a&&(n+=i),eo&&(n+=r.slice(Math.max(0,e-o),A-o)),o=s+1}return n}flatten(e){for(let A of this.text)e.push(A)}scanIdentical(){return 0}static split(e,A){let i=[],n=-1;for(let o of e)i.push(o),n+=o.length+1,i.length==32&&(A.push(new t(i,n)),i=[],n=-1);return n>-1&&A.push(new t(i,n)),A}},NE=class t extends bn{constructor(e,A){super(),this.children=e,this.length=A,this.lines=0;for(let i of e)this.lines+=i.lines}lineInner(e,A,i,n){for(let o=0;;o++){let a=this.children[o],r=n+a.length,s=i+a.lines-1;if((A?s:r)>=e)return a.lineInner(e,A,i,n);n=r+1,i=s+1}}decompose(e,A,i,n){for(let o=0,a=0;a<=A&&o=a){let l=n&((a<=e?1:0)|(s>=A?2:0));a>=e&&s<=A&&!l?i.push(r):r.decompose(e-a,A-a,i,l)}a=s+1}}replace(e,A,i){if([e,A]=GE(this,e,A),i.lines=o&&A<=r){let s=a.replace(e-o,A-o,i),l=this.lines-a.lines+s.lines;if(s.lines>4&&s.lines>l>>6){let g=this.children.slice();return g[n]=s,new t(g,this.length-(A-e)+i.length)}return super.replace(o,r,s)}o=r+1}return super.replace(e,A,i)}sliceString(e,A=this.length,i=` +`){[e,A]=GE(this,e,A);let n="";for(let o=0,a=0;oe&&o&&(n+=i),ea&&(n+=r.sliceString(e-a,A-a,i)),a=s+1}return n}flatten(e){for(let A of this.children)A.flatten(e)}scanIdentical(e,A){if(!(e instanceof t))return 0;let i=0,[n,o,a,r]=A>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;n+=A,o+=A){if(n==a||o==r)return i;let s=this.children[n],l=e.children[o];if(s!=l)return i+s.scanIdentical(l,A);i+=s.length+1}}static from(e,A=e.reduce((i,n)=>i+n.length+1,-1)){let i=0;for(let d of e)i+=d.lines;if(i<32){let d=[];for(let h of e)h.flatten(d);return new xl(d,A)}let n=Math.max(32,i>>5),o=n<<1,a=n>>1,r=[],s=0,l=-1,g=[];function C(d){let h;if(d.lines>o&&d instanceof t)for(let E of d.children)C(E);else d.lines>a&&(s>a||!s)?(I(),r.push(d)):d instanceof xl&&s&&(h=g[g.length-1])instanceof xl&&d.lines+h.lines<=32?(s+=d.lines,l+=d.length+1,g[g.length-1]=new xl(h.text.concat(d.text),h.length+1+d.length)):(s+d.lines>n&&I(),s+=d.lines,l+=d.length+1,g.push(d))}function I(){s!=0&&(r.push(g.length==1?g[0]:t.from(g,l)),l=-1,s=g.length=0)}for(let d of e)C(d);return I(),r.length==1?r[0]:new t(r,A)}};bn.empty=new xl([""],0);function nQA(t){let e=-1;for(let A of t)e+=A.length+1;return e}function q8(t,e,A=0,i=1e9){for(let n=0,o=0,a=!0;o=A&&(s>i&&(r=r.slice(0,i-n)),n0?1:(e instanceof xl?e.text.length:e.children.length)<<1]}nextInner(e,A){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,n=this.nodes[i],o=this.offsets[i],a=o>>1,r=n instanceof xl?n.text.length:n.children.length;if(a==(A>0?r:0)){if(i==0)return this.done=!0,this.value="",this;A>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((o&1)==(A>0?0:1)){if(this.offsets[i]+=A,e==0)return this.lineBreak=!0,this.value=` +`,this;e--}else if(n instanceof xl){let s=n.text[a+(A<0?-1:0)];if(this.offsets[i]+=A,s.length>Math.max(0,e))return this.value=e==0?s:A>0?s.slice(e):s.slice(0,s.length-e),this;e-=s.length}else{let s=n.children[a+(A<0?-1:0)];e>s.length?(e-=s.length,this.offsets[i]+=A):(A<0&&this.offsets[i]--,this.nodes.push(s),this.offsets.push(A>0?1:(s instanceof xl?s.text.length:s.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},V8=class{constructor(e,A,i){this.value="",this.done=!1,this.cursor=new T1(e,A>i?-1:1),this.pos=A>i?e.length:0,this.from=Math.min(A,i),this.to=Math.max(A,i)}nextInner(e,A){if(A<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,A<0?this.pos-this.to:this.from-this.pos);let i=A<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:n}=this.cursor.next(e);return this.pos+=(n.length+e)*A,this.value=n.length<=i?n:A<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},W8=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:A,lineBreak:i,value:n}=this.inner.next(e);return A&&this.afterBreak?(this.value="",this.afterBreak=!1):A?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<"u"&&(bn.prototype[Symbol.iterator]=function(){return this.iter()},T1.prototype[Symbol.iterator]=V8.prototype[Symbol.iterator]=W8.prototype[Symbol.iterator]=function(){return this});var dS=class{constructor(e,A,i,n){this.from=e,this.to=A,this.number=i,this.text=n}get length(){return this.to-this.from}};function GE(t,e,A){return e=Math.max(0,Math.min(t.length,e)),[e,Math.max(e,Math.min(t.length,A))]}function ja(t,e,A=!0,i=!0){return Jz(t,e,A,i)}function oQA(t){return t>=56320&&t<57344}function aQA(t){return t>=55296&&t<56320}function qr(t,e){let A=t.charCodeAt(e);if(!aQA(A)||e+1==t.length)return A;let i=t.charCodeAt(e+1);return oQA(i)?(A-55296<<10)+(i-56320)+65536:A}function _4(t){return t<=65535?String.fromCharCode(t):(t-=65536,String.fromCharCode((t>>10)+55296,(t&1023)+56320))}function _l(t){return t<65536?1:2}var BS=/\r\n?|\n/,zr=(function(t){return t[t.Simple=0]="Simple",t[t.TrackDel=1]="TrackDel",t[t.TrackBefore=2]="TrackBefore",t[t.TrackAfter=3]="TrackAfter",t})(zr||(zr={})),q2=class t{constructor(e){this.sections=e}get length(){let e=0;for(let A=0;Ae)return o+(e-n);o+=r}else{if(i!=zr.Simple&&l>=e&&(i==zr.TrackDel&&ne||i==zr.TrackBefore&&ne))return null;if(l>e||l==e&&A<0&&!r)return e==n||A<0?o:o+s;o+=s}n=l}if(e>n)throw new RangeError(`Position ${e} is out of range for changeset of length ${n}`);return o}touchesRange(e,A=e){for(let i=0,n=0;i=0&&n<=A&&r>=e)return nA?"cover":!0;n=r}return!1}toString(){let e="";for(let A=0;A=0?":"+n:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(A=>typeof A!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new t(e)}static create(e){return new t(e)}},Pr=class t extends q2{constructor(e,A){super(e),this.inserted=A}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return ES(this,(A,i,n,o,a)=>e=e.replace(n,n+(i-A),a),!1),e}mapDesc(e,A=!1){return hS(this,e,A,!0)}invert(e){let A=this.sections.slice(),i=[];for(let n=0,o=0;n=0){A[n]=r,A[n+1]=a;let s=n>>1;for(;i.length0&&j2(i,A,o.text),o.forward(g),r+=g}let l=e[a++];for(;r>1].toJSON()))}return e}static of(e,A,i){let n=[],o=[],a=0,r=null;function s(g=!1){if(!g&&!n.length)return;aI||C<0||I>A)throw new RangeError(`Invalid change range ${C} to ${I} (in doc of length ${A})`);let h=d?typeof d=="string"?bn.of(d.split(i||BS)):d:bn.empty,E=h.length;if(C==I&&E==0)return;Ca&&hs(n,C-a,-1),hs(n,I-C,E),j2(o,n,h),a=I}}return l(e),s(!r),r}static empty(e){return new t(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let A=[],i=[];for(let n=0;nr&&typeof a!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(o.length==1)A.push(o[0],0);else{for(;i.length=0&&A<=0&&A==t[n+1]?t[n]+=e:n>=0&&e==0&&t[n]==0?t[n+1]+=A:i?(t[n]+=e,t[n+1]+=A):t.push(e,A)}function j2(t,e,A){if(A.length==0)return;let i=e.length-2>>1;if(i>1])),!(A||a==t.sections.length||t.sections[a+1]<0);)r=t.sections[a++],s=t.sections[a++];e(n,l,o,g,C),n=l,o=g}}}function hS(t,e,A,i=!1){let n=[],o=i?[]:null,a=new J1(t),r=new J1(e);for(let s=-1;;){if(a.done&&r.len||r.done&&a.len)throw new Error("Mismatched change set lengths");if(a.ins==-1&&r.ins==-1){let l=Math.min(a.len,r.len);hs(n,l,-1),a.forward(l),r.forward(l)}else if(r.ins>=0&&(a.ins<0||s==a.i||a.off==0&&(r.len=0&&s=0){let l=0,g=a.len;for(;g;)if(r.ins==-1){let C=Math.min(g,r.len);l+=C,g-=C,r.forward(C)}else if(r.ins==0&&r.lens||a.ins>=0&&a.len>s)&&(r||i.length>l),o.forward2(s),a.forward(s)}}}}var J1=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return A>=e.length?bn.empty:e[A]}textBit(e){let{inserted:A}=this.set,i=this.i-2>>1;return i>=A.length&&!e?bn.empty:A[i].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},RE=class t{constructor(e,A,i){this.from=e,this.to=A,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}get goalColumn(){let e=this.flags>>6;return e==16777215?void 0:e}map(e,A=-1){let i,n;return this.empty?i=n=e.mapPos(this.from,A):(i=e.mapPos(this.from,1),n=e.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new t(i,n,this.flags)}extend(e,A=e,i=0){if(e<=this.anchor&&A>=this.anchor)return Ie.range(e,A,void 0,void 0,i);let n=Math.abs(e-this.anchor)>Math.abs(A-this.anchor)?e:A;return Ie.range(this.anchor,n,void 0,void 0,i)}eq(e,A=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!A||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return Ie.range(e.anchor,e.head)}static create(e,A,i){return new t(e,A,i)}},Ie=class t{constructor(e,A){this.ranges=e,this.mainIndex=A}map(e,A=-1){return e.empty?this:t.create(this.ranges.map(i=>i.map(e,A)),this.mainIndex)}eq(e,A=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let i=0;ie.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new t(e.ranges.map(A=>RE.fromJSON(A)),e.main)}static single(e,A=e){return new t([t.range(e,A)],0)}static create(e,A=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;nn.from-o.from),A=e.indexOf(i);for(let n=1;no.head?t.range(s,r):t.range(r,s))}}return new t(e,A)}};function $z(t,e){for(let A of t.ranges)if(A.to>e)throw new RangeError("Selection points outside of document")}var vS=0,At=class t{constructor(e,A,i,n,o){this.combine=e,this.compareInput=A,this.compare=i,this.isStatic=n,this.id=vS++,this.default=e([]),this.extensions=typeof o=="function"?o(this):o}get reader(){return this}static define(e={}){return new t(e.combine||(A=>A),e.compareInput||((A,i)=>A===i),e.compare||(e.combine?(A,i)=>A===i:bS),!!e.static,e.enables)}of(e){return new FE([],this,0,e)}compute(e,A){if(this.isStatic)throw new Error("Can't compute a static facet");return new FE(e,this,1,A)}computeN(e,A){if(this.isStatic)throw new Error("Can't compute a static facet");return new FE(e,this,2,A)}from(e,A){return A||(A=i=>i),this.compute([e],i=>A(i.field(e)))}};function bS(t,e){return t==e||t.length==e.length&&t.every((A,i)=>A===e[i])}var FE=class{constructor(e,A,i,n){this.dependencies=e,this.facet=A,this.type=i,this.value=n,this.id=vS++}dynamicSlot(e){var A;let i=this.value,n=this.facet.compareInput,o=this.id,a=e[o]>>1,r=this.type==2,s=!1,l=!1,g=[];for(let C of this.dependencies)C=="doc"?s=!0:C=="selection"?l=!0:(((A=e[C.id])!==null&&A!==void 0?A:1)&1)==0&&g.push(e[C.id]);return{create(C){return C.values[a]=i(C),1},update(C,I){if(s&&I.docChanged||l&&(I.docChanged||I.selection)||QS(C,g)){let d=i(C);if(r?!Pz(d,C.values[a],n):!n(d,C.values[a]))return C.values[a]=d,1}return 0},reconfigure:(C,I)=>{let d,h=I.config.address[o];if(h!=null){let E=$8(I,h);if(this.dependencies.every(f=>f instanceof At?I.facet(f)===C.facet(f):f instanceof Ma?I.field(f,!1)==C.field(f,!1):!0)||(r?Pz(d=i(C),E,n):n(d=i(C),E)))return C.values[a]=E,0}else d=i(C);return C.values[a]=d,1}}}};function Pz(t,e,A){if(t.length!=e.length)return!1;for(let i=0;it[s.id]),n=A.map(s=>s.type),o=i.filter(s=>!(s&1)),a=t[e.id]>>1;function r(s){let l=[];for(let g=0;gi===n),e);return e.provide&&(A.provides=e.provide(A)),A}create(e){let A=e.facet(z8).find(i=>i.field==this);return(A?.create||this.createF)(e)}slot(e){let A=e[this.id]>>1;return{create:i=>(i.values[A]=this.create(i),1),update:(i,n)=>{let o=i.values[A],a=this.updateF(o,n);return this.compareF(o,a)?0:(i.values[A]=a,1)},reconfigure:(i,n)=>{let o=i.facet(z8),a=n.facet(z8),r;return(r=o.find(s=>s.field==this))&&r!=a.find(s=>s.field==this)?(i.values[A]=r.create(i),1):n.config.address[this.id]!=null?(i.values[A]=n.field(this),0):(i.values[A]=this.create(i),1)}}}init(e){return[this,z8.of({field:this,create:e})]}get extension(){return this}},K1={lowest:4,low:3,default:2,high:1,highest:0};function b4(t){return e=>new Z8(e,t)}var oc={highest:b4(K1.highest),high:b4(K1.high),default:b4(K1.default),low:b4(K1.low),lowest:b4(K1.lowest)},Z8=class{constructor(e,A){this.inner=e,this.prec=A}},d0=class t{of(e){return new S4(this,e)}reconfigure(e){return t.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}},S4=class{constructor(e,A){this.compartment=e,this.inner=A}},X8=class t{constructor(e,A,i,n,o,a){for(this.base=e,this.compartments=A,this.dynamicSlots=i,this.address=n,this.staticValues=o,this.facets=a,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,A,i){let n=[],o=Object.create(null),a=new Map;for(let I of sQA(e,A,a))I instanceof Ma?n.push(I):(o[I.facet.id]||(o[I.facet.id]=[])).push(I);let r=Object.create(null),s=[],l=[];for(let I of n)r[I.id]=l.length<<1,l.push(d=>I.slot(d));let g=i?.config.facets;for(let I in o){let d=o[I],h=d[0].facet,E=g&&g[I]||[];if(d.every(f=>f.type==0))if(r[h.id]=s.length<<1|1,bS(E,d))s.push(i.facet(h));else{let f=h.combine(d.map(m=>m.value));s.push(i&&h.compare(f,i.facet(h))?i.facet(h):f)}else{for(let f of d)f.type==0?(r[f.id]=s.length<<1|1,s.push(f.value)):(r[f.id]=l.length<<1,l.push(m=>f.dynamicSlot(m)));r[h.id]=l.length<<1,l.push(f=>rQA(f,h,d))}}let C=l.map(I=>I(r));return new t(e,a,C,r,s,o)}};function sQA(t,e,A){let i=[[],[],[],[],[]],n=new Map;function o(a,r){let s=n.get(a);if(s!=null){if(s<=r)return;let l=i[s].indexOf(a);l>-1&&i[s].splice(l,1),a instanceof S4&&A.delete(a.compartment)}if(n.set(a,r),Array.isArray(a))for(let l of a)o(l,r);else if(a instanceof S4){if(A.has(a.compartment))throw new RangeError("Duplicate use of compartment in extensions");let l=e.get(a.compartment)||a.inner;A.set(a.compartment,l),o(l,r)}else if(a instanceof Z8)o(a.inner,a.prec);else if(a instanceof Ma)i[r].push(a),a.provides&&o(a.provides,r);else if(a instanceof FE)i[r].push(a),a.facet.extensions&&o(a.facet.extensions,K1.default);else{let l=a.extension;if(!l)throw new Error(`Unrecognized extension value in extension set (${a}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);o(l,r)}}return o(t,K1.default),i.reduce((a,r)=>a.concat(r))}function M4(t,e){if(e&1)return 2;let A=e>>1,i=t.status[A];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;t.status[A]=4;let n=t.computeSlot(t,t.config.dynamicSlots[A]);return t.status[A]=2|n}function $8(t,e){return e&1?t.config.staticValues[e>>1]:t.values[e>>1]}var jz=At.define(),CS=At.define({combine:t=>t.some(e=>e),static:!0}),AP=At.define({combine:t=>t.length?t[0]:void 0,static:!0}),eP=At.define(),tP=At.define(),iP=At.define(),qz=At.define({combine:t=>t.length?t[0]:!1}),al=class{constructor(e,A){this.type=e,this.value=A}static define(){return new uS}},uS=class{of(e){return new al(this,e)}},fS=class{constructor(e){this.map=e}of(e){return new Wi(this,e)}},Wi=(()=>{class t{constructor(A,i){this.type=A,this.value=i}map(A){let i=this.type.map(this.value,A);return i===void 0?void 0:i==this.value?this:new t(this.type,i)}is(A){return this.type==A}static define(A={}){return new fS(A.map||(i=>i))}static mapEffects(A,i){if(!A.length)return A;let n=[];for(let o of A){let a=o.map(i);a&&n.push(a)}return n}}return t.reconfigure=t.define(),t.appendConfig=t.define(),t})(),I0=(()=>{class t{constructor(A,i,n,o,a,r){this.startState=A,this.changes=i,this.selection=n,this.effects=o,this.annotations=a,this.scrollIntoView=r,this._doc=null,this._state=null,n&&$z(n,i.newLength),a.some(s=>s.type==t.time)||(this.annotations=a.concat(t.time.of(Date.now())))}static create(A,i,n,o,a,r){return new t(A,i,n,o,a,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(A){for(let i of this.annotations)if(i.type==A)return i.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(A){let i=this.annotation(t.userEvent);return!!(i&&(i==A||i.length>A.length&&i.slice(0,A.length)==A&&i[A.length]=="."))}}return t.time=al.define(),t.userEvent=al.define(),t.addToHistory=al.define(),t.remote=al.define(),t})();function lQA(t,e){let A=[];for(let i=0,n=0;;){let o,a;if(i=t[i]))o=t[i++],a=t[i++];else if(n=0;n--){let o=i[n](t);o instanceof I0?t=o:Array.isArray(o)&&o.length==1&&o[0]instanceof I0?t=o[0]:t=oP(e,LE(o),!1)}return t}function cQA(t){let e=t.startState,A=e.facet(iP),i=t;for(let n=A.length-1;n>=0;n--){let o=A[n](t);o&&Object.keys(o).length&&(i=nP(i,pS(e,o,t.changes.newLength),!0))}return i==t?t:I0.create(e,t.changes,t.selection,i.effects,i.annotations,i.scrollIntoView)}var CQA=[];function LE(t){return t==null?CQA:Array.isArray(t)?t:[t]}var Uo=(function(t){return t[t.Word=0]="Word",t[t.Space=1]="Space",t[t.Other=2]="Other",t})(Uo||(Uo={})),IQA=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,mS;try{mS=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch(t){}function dQA(t){if(mS)return mS.test(t);for(let e=0;e"\x80"&&(A.toUpperCase()!=A.toLowerCase()||IQA.test(A)))return!0}return!1}function BQA(t){return e=>{if(!/\S/.test(e))return Uo.Space;if(dQA(e))return Uo.Word;for(let A=0;A-1)return Uo.Word;return Uo.Other}}var qa=(()=>{class t{constructor(A,i,n,o,a,r){this.config=A,this.doc=i,this.selection=n,this.values=o,this.status=A.statusTemplate.slice(),this.computeSlot=a,r&&(r._state=this);for(let s=0;so.set(g,l)),i=null),o.set(s.value.compartment,s.value.extension)):s.is(Wi.reconfigure)?(i=null,n=s.value):s.is(Wi.appendConfig)&&(i=null,n=LE(n).concat(s.value));let a;i?a=A.startState.values.slice():(i=X8.resolve(n,o,this),a=new t(i,this.doc,this.selection,i.dynamicSlots.map(()=>null),(l,g)=>g.reconfigure(l,this),null).values);let r=A.startState.facet(CS)?A.newSelection:A.newSelection.asSingle();new t(i,A.newDoc,r,a,(s,l)=>l.update(s,A),A)}replaceSelection(A){return typeof A=="string"&&(A=this.toText(A)),this.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:A},range:Ie.cursor(i.from+A.length)}))}changeByRange(A){let i=this.selection,n=A(i.ranges[0]),o=this.changes(n.changes),a=[n.range],r=LE(n.effects);for(let s=1;sr.spec.fromJSON(s,l)))}}return t.create({doc:A.doc,selection:Ie.fromJSON(A.selection),extensions:i.extensions?o.concat([i.extensions]):o})}static create(A={}){let i=X8.resolve(A.extensions||[],new Map),n=A.doc instanceof bn?A.doc:bn.of((A.doc||"").split(i.staticFacet(t.lineSeparator)||BS)),o=A.selection?A.selection instanceof Ie?A.selection:Ie.single(A.selection.anchor,A.selection.head):Ie.single(0);return $z(o,n.length),i.staticFacet(CS)||(o=o.asSingle()),new t(i,n,o,i.dynamicSlots.map(()=>null),(a,r)=>r.create(a),null)}get tabSize(){return this.facet(t.tabSize)}get lineBreak(){return this.facet(t.lineSeparator)||` +`}get readOnly(){return this.facet(qz)}phrase(A,...i){for(let n of this.facet(t.phrases))if(Object.prototype.hasOwnProperty.call(n,A)){A=n[A];break}return i.length&&(A=A.replace(/\$(\$|\d*)/g,(n,o)=>{if(o=="$")return"$";let a=+(o||1);return!a||a>i.length?n:i[a-1]})),A}languageDataAt(A,i,n=-1){let o=[];for(let a of this.facet(jz))for(let r of a(this,i,n))Object.prototype.hasOwnProperty.call(r,A)&&o.push(r[A]);return o}charCategorizer(A){let i=this.languageDataAt("wordChars",A);return BQA(i.length?i[0]:"")}wordAt(A){let{text:i,from:n,length:o}=this.doc.lineAt(A),a=this.charCategorizer(A),r=A-n,s=A-n;for(;r>0;){let l=ja(i,r,!1);if(a(i.slice(l,r))!=Uo.Word)break;r=l}for(;se.length?e[0]:4}),t.lineSeparator=AP,t.readOnly=qz,t.phrases=At.define({compare(e,A){let i=Object.keys(e),n=Object.keys(A);return i.length==n.length&&i.every(o=>e[o]==A[o])}}),t.languageData=jz,t.changeFilter=eP,t.transactionFilter=tP,t.transactionExtender=iP,t})();d0.reconfigure=Wi.define();function Mr(t,e,A={}){let i={};for(let n of t)for(let o of Object.keys(n)){let a=n[o],r=i[o];if(r===void 0)i[o]=a;else if(!(r===a||a===void 0))if(Object.hasOwnProperty.call(A,o))i[o]=A[o](r,a);else throw new Error("Config merge conflict for field "+o)}for(let n in e)i[n]===void 0&&(i[n]=e[n]);return i}var gg=class{eq(e){return this==e}range(e,A=e){return k4.create(e,A,this)}};gg.prototype.startSide=gg.prototype.endSide=0;gg.prototype.point=!1;gg.prototype.mapMode=zr.TrackDel;function MS(t,e){return t==e||t.constructor==e.constructor&&t.eq(e)}var k4=class t{constructor(e,A,i){this.from=e,this.to=A,this.value=i}static create(e,A,i){return new t(e,A,i)}};function wS(t,e){return t.from-e.from||t.value.startSide-e.value.startSide}var DS=class t{constructor(e,A,i,n){this.from=e,this.to=A,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(e,A,i,n=0){let o=i?this.to:this.from;for(let a=n,r=o.length;;){if(a==r)return a;let s=a+r>>1,l=o[s]-e||(i?this.value[s].endSide:this.value[s].startSide)-A;if(s==a)return l>=0?a:r;l>=0?r=s:a=s+1}}between(e,A,i,n){for(let o=this.findIndex(A,-1e9,!0),a=this.findIndex(i,1e9,!1,o);od||I==d&&l.startSide>0&&l.endSide<=0)continue;(d-I||l.endSide-l.startSide)<0||(a<0&&(a=I),l.point&&(r=Math.max(r,d-I)),i.push(l),n.push(I-a),o.push(d-a))}return{mapped:i.length?new t(n,o,i,r):null,pos:a}}},io=(()=>{class t{constructor(A,i,n,o){this.chunkPos=A,this.chunk=i,this.nextLayer=n,this.maxPoint=o}static create(A,i,n,o){return new t(A,i,n,o)}get length(){let A=this.chunk.length-1;return A<0?0:Math.max(this.chunkEnd(A),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let A=this.nextLayer.size;for(let i of this.chunk)A+=i.value.length;return A}chunkEnd(A){return this.chunkPos[A]+this.chunk[A].length}update(A){let{add:i=[],sort:n=!1,filterFrom:o=0,filterTo:a=this.length}=A,r=A.filter;if(i.length==0&&!r)return this;if(n&&(i=i.slice().sort(wS)),this.isEmpty)return i.length?t.of(i):this;let s=new Aw(this,null,-1).goto(0),l=0,g=[],C=new jr;for(;s.value||l=0){let I=i[l++];C.addInner(I.from,I.to,I.value)||g.push(I)}else s.rangeIndex==1&&s.chunkIndexthis.chunkEnd(s.chunkIndex)||as.to||a=a&&A<=a+r.length&&r.between(a,A-a,i-a,n)===!1)return}this.nextLayer.between(A,i,n)}}iter(A=0){return x4.from([this]).goto(A)}get isEmpty(){return this.nextLayer==this}static iter(A,i=0){return x4.from(A).goto(i)}static compare(A,i,n,o,a=-1){let r=A.filter(I=>I.maxPoint>0||!I.isEmpty&&I.maxPoint>=a),s=i.filter(I=>I.maxPoint>0||!I.isEmpty&&I.maxPoint>=a),l=Vz(r,s,n),g=new U1(r,l,a),C=new U1(s,l,a);n.iterGaps((I,d,h)=>Wz(g,I,C,d,h,o)),n.empty&&n.length==0&&Wz(g,0,C,0,0,o)}static eq(A,i,n=0,o){o==null&&(o=999999999);let a=A.filter(C=>!C.isEmpty&&i.indexOf(C)<0),r=i.filter(C=>!C.isEmpty&&A.indexOf(C)<0);if(a.length!=r.length)return!1;if(!a.length)return!0;let s=Vz(a,r),l=new U1(a,s,0).goto(n),g=new U1(r,s,0).goto(n);for(;;){if(l.to!=g.to||!yS(l.active,g.active)||l.point&&(!g.point||!MS(l.point,g.point)))return!1;if(l.to>o)return!0;l.next(),g.next()}}static spans(A,i,n,o,a=-1){let r=new U1(A,null,a).goto(i),s=i,l=r.openStart;for(;;){let g=Math.min(r.to,n);if(r.point){let C=r.activeForPoint(r.to),I=r.pointFroms&&(o.span(s,g,r.active,l),l=r.openEnd(g));if(r.to>n)return l+(r.point&&r.to>n?1:0);s=r.to,r.next()}}static of(A,i=!1){let n=new jr;for(let o of A instanceof k4?[A]:i?EQA(A):A)n.add(o.from,o.to,o.value);return n.finish()}static join(A){if(!A.length)return t.empty;let i=A[A.length-1];for(let n=A.length-2;n>=0;n--)for(let o=A[n];o!=t.empty;o=o.nextLayer)i=new t(o.chunkPos,o.chunk,i,Math.max(o.maxPoint,i.maxPoint));return i}}return t.empty=new t([],[],null,-1),t})();function EQA(t){if(t.length>1)for(let e=t[0],A=1;A0)return t.slice().sort(wS);e=i}return t}io.empty.nextLayer=io.empty;var jr=class t{finishChunk(e){this.chunks.push(new DS(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,A,i){this.addInner(e,A,i)||(this.nextLayer||(this.nextLayer=new t)).add(e,A,i)}addInner(e,A,i){let n=e-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(e-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(A-this.chunkStart),this.last=i,this.lastFrom=e,this.lastTo=A,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,A-e)),!0)}addChunk(e,A){if((e-this.lastTo||A.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,A.maxPoint),this.chunks.push(A),this.chunkPos.push(e);let i=A.value.length-1;return this.last=A.value[i],this.lastFrom=A.from[i]+e,this.lastTo=A.to[i]+e,!0}finish(){return this.finishInner(io.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let A=io.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,A}};function Vz(t,e,A){let i=new Map;for(let o of t)for(let a=0;a=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new Aw(a,A,i,o));return n.length==1?n[0]:new t(n)}get startSide(){return this.value?this.value.startSide:0}goto(e,A=-1e9){for(let i of this.heap)i.goto(e,A);for(let i=this.heap.length>>1;i>=0;i--)IS(this.heap,i);return this.next(),this}forward(e,A){for(let i of this.heap)i.forward(e,A);for(let i=this.heap.length>>1;i>=0;i--)IS(this.heap,i);(this.to-e||this.value.endSide-A)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),IS(this.heap,0)}}};function IS(t,e){for(let A=t[e];;){let i=(e<<1)+1;if(i>=t.length)break;let n=t[i];if(i+1=0&&(n=t[i+1],i++),A.compare(n)<0)break;t[i]=A,t[e]=n,e=i}}var U1=class{constructor(e,A,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=x4.from(e,A,i)}goto(e,A=-1e9){return this.cursor.goto(e,A),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=A,this.openStart=-1,this.next(),this}forward(e,A){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-A)<0;)this.removeActive(this.minActive);this.cursor.forward(e,A)}removeActive(e){P8(this.active,e),P8(this.activeTo,e),P8(this.activeRank,e),this.minActive=Zz(this.active,this.activeTo)}addActive(e){let A=0,{value:i,to:n,rank:o}=this.cursor;for(;A0;)A++;j8(this.active,A,i),j8(this.activeTo,A,n),j8(this.activeRank,A,o),e&&j8(e,A,this.cursor.from),this.minActive=Zz(this.active,this.activeTo)}next(){let e=this.to,A=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>e){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&P8(i,n)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let o=this.cursor.value;if(!o.point)this.addActive(i),this.cursor.next();else if(A&&this.cursor.to==this.to&&this.cursor.from=0&&i[n]=0&&!(this.activeRank[i]e||this.activeTo[i]==e&&this.active[i].endSide>=this.point.endSide)&&A.push(this.active[i]);return A.reverse()}openEnd(e){let A=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>e;i--)A++;return A}};function Wz(t,e,A,i,n,o){t.goto(e),A.goto(i);let a=i+n,r=i,s=i-e,l=!!o.boundChange;for(let g=!1;;){let C=t.to+s-A.to,I=C||t.endSide-A.endSide,d=I<0?t.to+s:A.to,h=Math.min(d,a);if(t.point||A.point?(t.point&&A.point&&MS(t.point,A.point)&&yS(t.activeForPoint(t.to),A.activeForPoint(A.to))||o.comparePoint(r,h,t.point,A.point),g=!1):(g&&o.boundChange(r),h>r&&!yS(t.active,A.active)&&o.compareRange(r,h,t.active,A.active),l&&ha)break;r=d,I<=0&&t.next(),I>=0&&A.next()}}function yS(t,e){if(t.length!=e.length)return!1;for(let A=0;A=e;i--)t[i+1]=t[i];t[e]=A}function Zz(t,e){let A=-1,i=1e9;for(let n=0;n=e)return n;if(n==t.length)break;o+=t.charCodeAt(n)==9?A-o%A:1,n=ja(t,n)}return i===!0?-1:t.length}var aP=typeof Symbol>"u"?"__\u037C":Symbol.for("\u037C"),SS=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),rP=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{},cg=class{constructor(e,A){this.rules=[];let{finish:i}=A||{};function n(a){return/^@/.test(a)?[a]:a.split(/,\s*/)}function o(a,r,s,l){let g=[],C=/^@(\w+)\b/.exec(a[0]),I=C&&C[1]=="keyframes";if(C&&r==null)return s.push(a[0]+";");for(let d in r){let h=r[d];if(/&/.test(d))o(d.split(/,\s*/).map(E=>a.map(f=>E.replace(/&/,f))).reduce((E,f)=>E.concat(f)),h,s);else if(h&&typeof h=="object"){if(!C)throw new RangeError("The value of a property ("+d+") should be a primitive value.");o(n(d),h,g,I)}else h!=null&&g.push(d.replace(/_.*/,"").replace(/[A-Z]/g,E=>"-"+E.toLowerCase())+": "+h+";")}(g.length||I)&&s.push((i&&!C&&!l?a.map(i):a).join(", ")+" {"+g.join(" ")+"}")}for(let a in e)o(n(a),e[a],this.rules)}getRules(){return this.rules.join(` +`)}static newName(){let e=rP[aP]||1;return rP[aP]=e+1,"\u037C"+e.toString(36)}static mount(e,A,i){let n=e[SS],o=i&&i.nonce;n?o&&n.setNonce(o):n=new kS(e,o),n.mount(Array.isArray(A)?A:[A],e)}},sP=new Map,kS=class{constructor(e,A){let i=e.ownerDocument||e,n=i.defaultView;if(!e.head&&e.adoptedStyleSheets&&n.CSSStyleSheet){let o=sP.get(i);if(o)return e[SS]=o;this.sheet=new n.CSSStyleSheet,sP.set(i,this)}else this.styleTag=i.createElement("style"),A&&this.styleTag.setAttribute("nonce",A);this.modules=[],e[SS]=this}mount(e,A){let i=this.sheet,n=0,o=0;for(let a=0;a-1&&(this.modules.splice(s,1),o--,s=-1),s==-1){if(this.modules.splice(o++,0,r),i)for(let l=0;l",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},hQA=typeof navigator<"u"&&/Mac/.test(navigator.platform),QQA=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(er=0;er<10;er++)BC[48+er]=BC[96+er]=String(er);var er;for(er=1;er<=24;er++)BC[er+111]="F"+er;var er;for(er=65;er<=90;er++)BC[er]=String.fromCharCode(er+32),KE[er]=String.fromCharCode(er);var er;for(tw in BC)KE.hasOwnProperty(tw)||(KE[tw]=BC[tw]);var tw;function lP(t){var e=hQA&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||QQA&&t.shiftKey&&t.key&&t.key.length==1||t.key=="Unidentified",A=!e&&t.key||(t.shiftKey?KE:BC)[t.keyCode]||t.key||"Unidentified";return A=="Esc"&&(A="Escape"),A=="Del"&&(A="Delete"),A=="Left"&&(A="ArrowLeft"),A=="Up"&&(A="ArrowUp"),A=="Right"&&(A="ArrowRight"),A=="Down"&&(A="ArrowDown"),A}function no(){var t=arguments[0];typeof t=="string"&&(t=document.createElement(t));var e=1,A=arguments[1];if(A&&typeof A=="object"&&A.nodeType==null&&!Array.isArray(A)){for(var i in A)if(Object.prototype.hasOwnProperty.call(A,i)){var n=A[i];typeof n=="string"?t.setAttribute(i,n):n!=null&&(t[i]=n)}e++}for(;e2),at={mac:IP||/Mac/.test(Rs.platform),windows:/Win/.test(Rs.platform),linux:/Linux|X11/.test(Rs.platform),ie:Fw,ie_version:XP?OS.documentMode||6:HS?+HS[1]:YS?+YS[1]:0,gecko:cP,gecko_version:cP?+(/Firefox\/(\d+)/.exec(Rs.userAgent)||[0,0])[1]:0,chrome:!!xS,chrome_version:xS?+xS[1]:0,ios:IP,android:/Android\b/.test(Rs.userAgent),webkit:CP,webkit_version:CP?+(/\bAppleWebKit\/(\d+)/.exec(Rs.userAgent)||[0,0])[1]:0,safari:zS,safari_version:zS?+(/\bVersion\/(\d+(\.\d+)?)/.exec(Rs.userAgent)||[0,0])[1]:0,tabSize:OS.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"};function Lk(t,e){for(let A in t)A=="class"&&e.class?e.class+=" "+t.class:A=="style"&&e.style?e.style+=";"+t.style:e[A]=t[A];return e}var hw=Object.create(null);function Gk(t,e,A){if(t==e)return!0;t||(t=hw),e||(e=hw);let i=Object.keys(t),n=Object.keys(e);if(i.length-(A&&i.indexOf(A)>-1?1:0)!=n.length-(A&&n.indexOf(A)>-1?1:0))return!1;for(let o of i)if(o!=A&&(n.indexOf(o)==-1||t[o]!==e[o]))return!1;return!0}function uQA(t,e){for(let A=t.attributes.length-1;A>=0;A--){let i=t.attributes[A].name;e[i]==null&&t.removeAttribute(i)}for(let A in e){let i=e[A];A=="style"?t.style.cssText=i:t.getAttribute(A)!=i&&t.setAttribute(A,i)}}function dP(t,e,A){let i=!1;if(e)for(let n in e)A&&n in A||(i=!0,n=="style"?t.style.cssText="":t.removeAttribute(n));if(A)for(let n in A)e&&e[n]==A[n]||(i=!0,n=="style"?t.style.cssText=A[n]:t.setAttribute(n,A[n]));return i}function fQA(t){let e=Object.create(null);for(let A=0;A0?3e8:-4e8:A>0?1e8:-1e8,new z1(e,A,A,i,e.widget||null,!1)}static replace(e){let A=!!e.block,i,n;if(e.isBlockGap)i=-5e8,n=4e8;else{let{start:o,end:a}=$P(e,A);i=(o?A?-3e8:-1:5e8)-1,n=(a?A?2e8:1:-6e8)+1}return new z1(e,i,n,A,e.widget||null,!0)}static line(e){return new P4(e)}static set(e,A=!1){return io.of(e,A)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};St.none=io.empty;var z4=class t extends St{constructor(e){let{start:A,end:i}=$P(e);super(A?-1:5e8,i?1:-6e8,null,e),this.tagName=e.tagName||"span",this.attrs=e.class&&e.attributes?Lk(e.attributes,{class:e.class}):e.class?{class:e.class}:e.attributes||hw}eq(e){return this==e||e instanceof t&&this.tagName==e.tagName&&Gk(this.attrs,e.attrs)}range(e,A=e){if(e>=A)throw new RangeError("Mark decorations may not be empty");return super.range(e,A)}};z4.prototype.point=!1;var P4=class t extends St{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof t&&this.spec.class==e.spec.class&&Gk(this.spec.attributes,e.spec.attributes)}range(e,A=e){if(A!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,A)}};P4.prototype.mapMode=zr.TrackBefore;P4.prototype.point=!0;var z1=class t extends St{constructor(e,A,i,n,o,a){super(A,i,o,e),this.block=n,this.isReplace=a,this.mapMode=n?A<=0?zr.TrackBefore:zr.TrackAfter:zr.TrackDel}get type(){return this.startSide!=this.endSide?Vr.WidgetRange:this.startSide<=0?Vr.WidgetBefore:Vr.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof t&&pQA(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,A=e){if(this.isReplace&&(e>A||e==A&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&A!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,A)}};z1.prototype.point=!0;function $P(t,e=!1){let{inclusiveStart:A,inclusiveEnd:i}=t;return A==null&&(A=t.inclusive),i==null&&(i=t.inclusive),{start:A??e,end:i??e}}function pQA(t,e){return t==e||!!(t&&e&&t.compare(e))}function HE(t,e,A,i=0){let n=A.length-1;n>=0&&A[n]+i>=t?A[n]=Math.max(A[n],e):A.push(t,e)}var Qw=class t extends gg{constructor(e,A){super(),this.tagName=e,this.attributes=A}eq(e){return e==this||e instanceof t&&this.tagName==e.tagName&&Gk(this.attributes,e.attributes)}static create(e){return new t(e.tagName,e.attributes||hw)}static set(e,A=!1){return io.of(e,A)}};Qw.prototype.startSide=Qw.prototype.endSide=-1;function j4(t){let e;return t.nodeType==11?e=t.getSelection?t:t.ownerDocument:e=t,e.getSelection()}function PS(t,e){return e?t==e||t.contains(e.nodeType!=1?e.parentNode:e):!1}function L4(t,e){if(!e.anchorNode)return!1;try{return PS(t,e.anchorNode)}catch(A){return!1}}function Cw(t){return t.nodeType==3?q4(t,0,t.nodeValue.length).getClientRects():t.nodeType==1?t.getClientRects():[]}function G4(t,e,A,i){return A?BP(t,e,A,i,-1)||BP(t,e,A,i,1):!1}function Z2(t){for(var e=0;;e++)if(t=t.previousSibling,!t)return e}function uw(t){return t.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(t.nodeName)}function BP(t,e,A,i,n){for(;;){if(t==A&&e==i)return!0;if(e==(n<0?0:QC(t))){if(t.nodeName=="DIV")return!1;let o=t.parentNode;if(!o||o.nodeType!=1)return!1;e=Z2(t)+(n<0?0:1),t=o}else if(t.nodeType==1){if(t=t.childNodes[e+(n<0?-1:0)],t.nodeType==1&&t.contentEditable=="false")return!1;e=n<0?QC(t):0}else return!1}}function QC(t){return t.nodeType==3?t.nodeValue.length:t.childNodes.length}function fw(t,e){let A=e?t.left:t.right;return{left:A,right:A,top:t.top,bottom:t.bottom}}function mQA(t){let e=t.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:t.innerWidth,top:0,bottom:t.innerHeight}}function Aj(t,e){let A=e.width/t.offsetWidth,i=e.height/t.offsetHeight;return(A>.995&&A<1.005||!isFinite(A)||Math.abs(e.width-t.offsetWidth)<1)&&(A=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(e.height-t.offsetHeight)<1)&&(i=1),{scaleX:A,scaleY:i}}function wQA(t,e,A,i,n,o,a,r){let s=t.ownerDocument,l=s.defaultView||window;for(let g=t,C=!1;g&&!C;)if(g.nodeType==1){let I,d=g==s.body,h=1,E=1;if(d)I=mQA(l);else{if(/^(fixed|sticky)$/.test(getComputedStyle(g).position)&&(C=!0),g.scrollHeight<=g.clientHeight&&g.scrollWidth<=g.clientWidth){g=g.assignedSlot||g.parentNode;continue}let v=g.getBoundingClientRect();({scaleX:h,scaleY:E}=Aj(g,v)),I={left:v.left,right:v.left+g.clientWidth*h,top:v.top,bottom:v.top+g.clientHeight*E}}let f=0,m=0;if(n=="nearest")e.top0&&e.bottom>I.bottom+m&&(m=e.bottom-I.bottom+a)):e.bottom>I.bottom&&(m=e.bottom-I.bottom+a,A<0&&e.top-m0&&e.right>I.right+f&&(f=e.right-I.right+o)):e.right>I.right&&(f=e.right-I.right+o,A<0&&e.leftI.bottom||e.leftI.right)&&(e={left:Math.max(e.left,I.left),right:Math.min(e.right,I.right),top:Math.max(e.top,I.top),bottom:Math.min(e.bottom,I.bottom)}),g=g.assignedSlot||g.parentNode}else if(g.nodeType==11)g=g.host;else break}function ej(t,e=!0){let A=t.ownerDocument,i=null,n=null;for(let o=t.parentNode;o&&!(o==A.body||(!e||i)&&n);)if(o.nodeType==1)!n&&o.scrollHeight>o.clientHeight&&(n=o),e&&!i&&o.scrollWidth>o.clientWidth&&(i=o),o=o.assignedSlot||o.parentNode;else if(o.nodeType==11)o=o.host;else break;return{x:i,y:n}}var jS=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:A,focusNode:i}=e;this.set(A,Math.min(e.anchorOffset,A?QC(A):0),i,Math.min(e.focusOffset,i?QC(i):0))}set(e,A,i,n){this.anchorNode=e,this.anchorOffset=A,this.focusNode=i,this.focusOffset=n}},O1=null;at.safari&&at.safari_version>=26&&(O1=!1);function tj(t){if(t.setActive)return t.setActive();if(O1)return t.focus(O1);let e=[];for(let A=t;A&&(e.push(A,A.scrollTop,A.scrollLeft),A!=A.ownerDocument);A=A.parentNode);if(t.focus(O1==null?{get preventScroll(){return O1={preventScroll:!0},!0}}:void 0),!O1){O1=!1;for(let A=0;AMath.max(0,t.document.documentElement.scrollHeight-t.innerHeight-4):t.scrollTop>Math.max(1,t.scrollHeight-t.clientHeight-4)}function nj(t,e){for(let A=t,i=e;;){if(A.nodeType==3&&i>0)return{node:A,offset:i};if(A.nodeType==1&&i>0){if(A.contentEditable=="false")return null;A=A.childNodes[i-1],i=QC(A)}else if(A.parentNode&&!uw(A))i=Z2(A),A=A.parentNode;else return null}}function oj(t,e){for(let A=t,i=e;;){if(A.nodeType==3&&i=A){if(r.level==i)return a;(o<0||(n!=0?n<0?r.fromA:e[o].level>r.level))&&(o=a)}}if(o<0)throw new RangeError("Index out of range");return o}};function sj(t,e){if(t.length!=e.length)return!1;for(let A=0;A=0;E-=3)if(B0[E+1]==-d){let f=B0[E+2],m=f&2?n:f&4?f&1?o:n:0;m&&(Wo[C]=Wo[B0[E]]=m),r=E;break}}else{if(B0.length==189)break;B0[r++]=C,B0[r++]=I,B0[r++]=s}else if((h=Wo[C])==2||h==1){let E=h==n;s=E?0:1;for(let f=r-3;f>=0;f-=3){let m=B0[f+2];if(m&2)break;if(E)B0[f+2]|=2;else{if(m&4)break;B0[f+2]|=4}}}}}function xQA(t,e,A,i){for(let n=0,o=i;n<=A.length;n++){let a=n?A[n-1].to:t,r=ns;)h==f&&(h=A[--E].from,f=E?A[E-1].to:t),Wo[--h]=d;s=g}else o=l,s++}}}function VS(t,e,A,i,n,o,a){let r=i%2?2:1;if(i%2==n%2)for(let s=e,l=0;ss&&a.push(new dg(s,E.from,d));let f=E.direction==P1!=!(d%2);WS(t,f?i+1:i,n,E.inner,E.from,E.to,a),s=E.to}h=E.to}else{if(h==A||(g?Wo[h]!=r:Wo[h]==r))break;h++}I?VS(t,s,h,i+1,n,I,a):se;){let g=!0,C=!1;if(!l||s>o[l-1].to){let E=Wo[s-1];E!=r&&(g=!1,C=E==16)}let I=!g&&r==1?[]:null,d=g?i:i+1,h=s;A:for(;;)if(l&&h==o[l-1].to){if(C)break A;let E=o[--l];if(!g)for(let f=E.from,m=l;;){if(f==e)break A;if(m&&o[m-1].to==f)f=o[--m].from;else{if(Wo[f-1]==r)break A;break}}if(I)I.push(E);else{E.toWo.length;)Wo[Wo.length]=256;let i=[],n=e==P1?0:1;return WS(t,n,n,A,0,t.length,i),i}function lj(t){return[new dg(0,t,0)]}var gj="";function RQA(t,e,A,i,n){var o;let a=i.head-t.from,r=dg.find(e,a,(o=i.bidiLevel)!==null&&o!==void 0?o:-1,i.assoc),s=e[r],l=s.side(n,A);if(a==l){let I=r+=n?1:-1;if(I<0||I>=e.length)return null;s=e[r=I],a=s.side(!n,A),l=s.side(n,A)}let g=ja(t.text,a,s.forward(n,A));(gs.to)&&(g=l),gj=t.text.slice(Math.min(a,g),Math.max(a,g));let C=r==(n?e.length-1:0)?null:e[r+(n?1:-1)];return C&&g==l&&C.level+(n?0:1)t.some(e=>e)}),hj=At.define({combine:t=>t.some(e=>e)}),Qj=At.define(),K4=class t{constructor(e,A="nearest",i="nearest",n=5,o=5,a=!1){this.range=e,this.y=A,this.x=i,this.yMargin=n,this.xMargin=o,this.isSnapshot=a}map(e){return e.empty?this:new t(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new t(Ie.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},iw=Wi.define({map:(t,e)=>t.map(e)}),uj=Wi.define();function Sr(t,e,A){let i=t.facet(dj);i.length?i[0](e):window.onerror&&window.onerror(String(e),A,void 0,void 0,e)||(A?console.error(A+":",e):console.error(e))}var EC=At.define({combine:t=>t.length?t[0]:!0}),FQA=0,TE=At.define({combine(t){return t.filter((e,A)=>{for(let i=0;i{let s=[];return a&&s.push(Lw.of(l=>{let g=l.plugin(r);return g?a(g):St.none})),o&&s.push(o(r)),s})}static fromClass(e,A){return t.define((i,n)=>new e(i,n),A)}},U4=class{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let A=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(A)}catch(i){if(Sr(A.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(n){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(A){Sr(e.state,A,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var A;if(!((A=this.value)===null||A===void 0)&&A.destroy)try{this.value.destroy()}catch(i){Sr(e.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},QP=At.define(),ZS=At.define(),Lw=At.define(),fj=At.define(),Jk=At.define(),V4=At.define(),pj=At.define();function uP(t,e){let A=t.state.facet(pj);if(!A.length)return A;let i=A.map(o=>o instanceof Function?o(t):o),n=[];return io.spans(i,e.from,e.to,{point(){},span(o,a,r,s){let l=o-e.from,g=a-e.from,C=n;for(let I=r.length-1;I>=0;I--,s--){let d=r[I].spec.bidiIsolate,h;if(d==null&&(d=NQA(e.text,l,g)),s>0&&C.length&&(h=C[C.length-1]).to==l&&h.direction==d)h.to=g,C=h.inner;else{let E={from:l,to:g,direction:d,inner:[]};C.push(E),C=E.inner}}}}),n}var mj=At.define();function Ok(t){let e=0,A=0,i=0,n=0;for(let o of t.state.facet(mj)){let a=o(t);a&&(a.left!=null&&(e=Math.max(e,a.left)),a.right!=null&&(A=Math.max(A,a.right)),a.top!=null&&(i=Math.max(i,a.top)),a.bottom!=null&&(n=Math.max(n,a.bottom)))}return{left:e,right:A,top:i,bottom:n}}var R4=At.define(),rc=class t{constructor(e,A,i,n){this.fromA=e,this.toA=A,this.fromB=i,this.toB=n}join(e){return new t(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let A=e.length,i=this;for(;A>0;A--){let n=e[A-1];if(!(n.fromA>i.toA)){if(n.toAn.push(new rc(o,a,r,s))),this.changedRanges=n}static create(e,A,i){return new t(e,A,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},LQA=[],wa=class{constructor(e,A,i=0){this.dom=e,this.length=A,this.flags=i,this.parent=null,e.cmTile=this}get breakAfter(){return this.flags&1}get children(){return LQA}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(e){if(this.flags|=2,this.flags&4){this.flags&=-5;let A=this.domAttrs;A&&uQA(this.dom,A)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:"")+(this.breakAfter?"#":"")}destroy(){this.parent=null}setDOM(e){this.dom=e,e.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e,A=this.posAtStart){let i=A;for(let n of this.children){if(n==e)return i;i+=n.length+n.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}covers(e){return!0}coordsIn(e,A){return null}domPosFor(e,A){let i=Z2(this.dom),n=this.length?e>0:A>0;return new E0(this.parent.dom,i+(n?1:0),e==0||e==this.length)}markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&this.parent.flags&2&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let e=this;e;e=e.parent)if(e instanceof jE)return e;return null}static get(e){return e.cmTile}},PE=class extends wa{constructor(e){super(e,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(e){this.children.push(e),e.parent=this}sync(e){if(this.flags&2)return;super.sync(e);let A=this.dom,i=null,n,o=e?.node==A?e:null,a=0;for(let r of this.children){if(r.sync(e),a+=r.length+r.breakAfter,n=i?i.nextSibling:A.firstChild,o&&n!=r.dom&&(o.written=!0),r.dom.parentNode==A)for(;n&&n!=r.dom;)n=fP(n);else A.insertBefore(r.dom,n);i=r.dom}for(n=i?i.nextSibling:A.firstChild,o&&n&&(o.written=!0);n;)n=fP(n);this.length=a}};function fP(t){let e=t.nextSibling;return t.parentNode.removeChild(t),e}var jE=class extends PE{constructor(e,A){super(A),this.view=e}owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}isBlock(){return!0}nearest(e){for(;;){if(!e)return null;let A=wa.get(e);if(A&&this.owns(A))return A;e=e.parentNode}}blockTiles(e){for(let A=[],i=this,n=0,o=0;;)if(n==i.children.length){if(!A.length)return;i=i.parent,i.breakAfter&&o++,n=A.pop()}else{let a=i.children[n++];if(a instanceof hC)A.push(n),i=a,n=0;else{let r=o+a.length,s=e(a,o);if(s!==void 0)return s;o=r+a.breakAfter}}}resolveBlock(e,A){let i,n=-1,o,a=-1;if(this.blockTiles((r,s)=>{let l=s+r.length;if(e>=s&&e<=l){if(r.isWidget()&&A>=-1&&A<=1){if(r.flags&32)return!0;r.flags&16&&(i=void 0)}(se||e==s&&(A>1?r.length:r.covers(-1)))&&(!o||!r.isWidget()&&o.isWidget())&&(o=r,a=e-s)}}),!i&&!o)throw new Error("No tile at position "+e);return i&&A<0||!o?{tile:i,offset:n}:{tile:o,offset:a}}},hC=class t extends PE{constructor(e,A){super(e),this.wrapper=A}isBlock(){return!0}covers(e){return this.children.length?e<0?this.children[0].covers(-1):this.lastChild.covers(1):!1}get domAttrs(){return this.wrapper.attributes}static of(e,A){let i=new t(A||document.createElement(e.tagName),e);return A||(i.flags|=4),i}},qE=class t extends PE{constructor(e,A){super(e),this.attrs=A}isLine(){return!0}static start(e,A,i){let n=new t(A||document.createElement("div"),e);return(!A||!i)&&(n.flags|=4),n}get domAttrs(){return this.attrs}resolveInline(e,A,i){let n=null,o=-1,a=null,r=-1;function s(g,C){for(let I=0,d=0;I=C&&(h.isComposite()?s(h,C-d):(!a||a.isHidden&&(A>0||i&&KQA(a,h)))&&(E>C||h.flags&32)?(a=h,r=C-d):(di&&(e=i);let n=e,o=e,a=0;e==0&&A<0||e==i&&A>=0?at.chrome||at.gecko||(e?(n--,a=1):o=0)?0:r.length-1];return at.safari&&!a&&s.width==0&&(s=Array.prototype.find.call(r,l=>l.width)||s),a?fw(s,a<0):s||null}static of(e,A){let i=new t(A||document.createTextNode(e),e);return A||(i.flags|=2),i}},j1=class t extends wa{constructor(e,A,i,n){super(e,A,n),this.widget=i}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(e){return this.flags&48?!1:(this.flags&(e<0?64:128))>0}coordsIn(e,A){return this.coordsInWidget(e,A,!1)}coordsInWidget(e,A,i){let n=this.widget.coordsAt(this.dom,e,A);if(n)return n;if(i)return fw(this.dom.getBoundingClientRect(),this.length?e==0:A<=0);{let o=this.dom.getClientRects(),a=null;if(!o.length)return null;let r=this.flags&16?!0:this.flags&32?!1:e>0;for(let s=r?o.length-1:0;a=o[s],!(e>0?s==0:s==o.length-1||a.top0;)if(n.isComposite())if(a){if(!e)break;i&&i.break(),e--,a=!1}else if(o==n.children.length){if(!e&&!r.length)break;i&&i.leave(n),a=!!n.breakAfter,{tile:n,index:o}=r.pop(),o++}else{let s=n.children[o],l=s.breakAfter;(A>0?s.length<=e:s.length=0;r--){let s=A.marks[r],l=n.lastChild;if(l instanceof rl&&l.mark.eq(s.mark))l.dom!=s.dom&&l.setDOM(RS(s.dom)),n=l;else{if(this.cache.reused.get(s)){let C=wa.get(s.dom);C&&C.setDOM(RS(s.dom))}let g=rl.of(s.mark,s.dom);n.append(g),n=g}this.cache.reused.set(s,2)}let o=wa.get(e.text);o&&this.cache.reused.set(o,2);let a=new Y1(e.text,e.text.nodeValue);a.flags|=8,n.append(a)}addInlineWidget(e,A,i){let n=this.afterWidget&&e.flags&48&&(this.afterWidget.flags&48)==(e.flags&48);n||this.flushBuffer();let o=this.ensureMarks(A,i);!n&&!(e.flags&16)&&o.append(this.getBuffer(1)),o.append(e),this.pos+=e.length,this.afterWidget=e}addMark(e,A,i){this.flushBuffer(),this.ensureMarks(A,i).append(e),this.pos+=e.length,this.afterWidget=null}addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}continueWidget(e){let A=this.afterWidget||this.lastBlock;A.length+=e,this.pos+=e}addLineStart(e,A){var i;e||(e=wj);let n=qE.start(e,A||((i=this.cache.find(qE))===null||i===void 0?void 0:i.dom),!!A);this.getBlockPos().append(this.lastBlock=this.curLine=n)}addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}ensureLine(e){this.curLine||this.addLineStart(e)}ensureMarks(e,A){var i;let n=this.curLine;for(let o=e.length-1;o>=0;o--){let a=e[o],r;if(A>0&&(r=n.lastChild)&&r instanceof rl&&r.mark.eq(a))n=r,A--;else{let s=rl.of(a,(i=this.cache.find(rl,l=>l.mark.eq(a)))===null||i===void 0?void 0:i.dom);n.append(s),n=s,A=0}}return n}endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChild;(!e||!pP(this.curLine,!1)||e.dom.nodeName!="BR"&&e.isWidget()&&!(at.ios&&pP(this.curLine,!0)))&&this.curLine.append(this.cache.findWidget(NS,0,32)||new j1(NS.toDOM(),0,NS,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let e=this.wrappers.length-1;e>=0;e--)this.wrappers[e].to=this.pos){let A=new $S(e.from,e.to,e.value,e.rank),i=this.wrappers.length;for(;i>0&&(this.wrappers[i-1].rank-A.rank||this.wrappers[i-1].to-A.to)<0;)i--;this.wrappers.splice(i,0,A)}this.wrapperPos=this.pos}getBlockPos(){var e;this.updateBlockWrappers();let A=this.root;for(let i of this.wrappers){let n=A.lastChild;if(i.froma.wrapper.eq(i.wrapper)))===null||e===void 0?void 0:e.dom);A.append(o),A=o}}return A}blockPosCovered(){let e=this.lastBlock;return e!=null&&!e.breakAfter&&(!e.isWidget()||(e.flags&160)>0)}getBuffer(e){let A=2|(e<0?16:32),i=this.cache.find(VE,void 0,1);return i&&(i.flags=A),i||new VE(A)}flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}},ek=class{constructor(e){this.skipCount=0,this.text="",this.textOff=0,this.cursor=e.iter()}skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount+=e-(this.text.length-this.textOff),this.text="",this.textOff=0)}next(e){if(this.textOff==this.text.length){let{value:n,lineBreak:o,done:a}=this.cursor.next(this.skipCount);if(this.skipCount=0,a)throw new Error("Ran out of text content when drawing inline views");this.text=n;let r=this.textOff=Math.min(e,n.length);return o?null:n.slice(0,r)}let A=Math.min(this.text.length,this.textOff+e),i=this.text.slice(this.textOff,A);return this.textOff=A,i}},mw=[j1,qE,Y1,rl,VE,hC,jE];for(let t=0;t[]),this.index=mw.map(()=>0),this.reused=new Map}add(e){let A=e.constructor.bucket,i=this.buckets[A];i.length<6?i.push(e):i[this.index[A]=(this.index[A]+1)%6]=e}find(e,A,i=2){let n=e.bucket,o=this.buckets[n],a=this.index[n];for(let r=o.length-1;r>=0;r--){let s=(r+a)%o.length,l=o[s];if((!A||A(l))&&!this.reused.has(l))return o.splice(s,1),s{if(this.cache.add(a),a.isComposite())return!1},enter:a=>this.cache.add(a),leave:()=>{},break:()=>{}}}run(e,A){let i=A&&this.getCompositionContext(A.text);for(let n=0,o=0,a=0;;){let r=an){let l=s-n;this.preserve(l,!a,!r),n=s,o+=l}if(!r)break;A&&r.fromA<=A.range.fromA&&r.toA>=A.range.toA?(this.forward(r.fromA,A.range.fromA,A.range.fromA{if(a.isWidget())if(this.openWidget)this.builder.continueWidget(s-r);else{let l=s>0||r{a.isLine()?this.builder.addLineStart(a.attrs,this.cache.maybeReuse(a)):(this.cache.add(a),a instanceof rl&&n.unshift(a.mark)),this.openWidget=!1},leave:a=>{a.isLine()?n.length&&(n.length=o=0):a instanceof rl&&(n.shift(),o=Math.min(o,n.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(e)}emit(e,A){let i=null,n=this.builder,o=0,a=io.spans(this.decorations,e,A,{point:(r,s,l,g,C,I)=>{if(l instanceof z1){if(this.disallowBlockEffectsFor[I]){if(l.block)throw new RangeError("Block decorations may not be specified via plugins");if(s>this.view.state.doc.lineAt(r).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}if(o=g.length,C>g.length)n.continueWidget(s-r);else{let d=l.widget||(l.block?mP.block:mP.inline),h=UQA(l),E=this.cache.findWidget(d,s-r,h)||j1.of(d,this.view,s-r,h);l.block?(l.startSide>0&&n.addLineStartIfNotCovered(i),n.addBlockWidget(E)):(n.ensureLine(i),n.addInlineWidget(E,g,C))}i=null}else i=TQA(i,l);s>r&&this.text.skip(s-r)},span:(r,s,l,g)=>{for(let C=r;Co,this.openMarks=a}forward(e,A,i=1){A-e<=10?this.old.advance(A-e,i,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(A-e-10,-1),this.old.advance(5,i,this.reuseWalker))}getCompositionContext(e){let A=[],i=null;for(let n=e.parentNode;;n=n.parentNode){let o=wa.get(n);if(n==this.view.contentDOM)break;o instanceof rl?A.push(o):o?.isLine()?i=o:o instanceof hC||(n.nodeName=="DIV"&&!i&&n!=this.view.contentDOM?i=new qE(n,wj):i||A.push(rl.of(new z4({tagName:n.nodeName.toLowerCase(),attributes:fQA(n)}),n)))}return{line:i,marks:A}}};function pP(t,e){let A=i=>{for(let n of i.children)if((e?n.isText():n.length)||A(n))return!0;return!1};return A(t)}function UQA(t){let e=t.isReplace?(t.startSide<0?64:0)|(t.endSide>0?128:0):t.startSide>0?32:16;return t.block&&(e|=256),e}var wj={class:"cm-line"};function TQA(t,e){let A=e.spec.attributes,i=e.spec.class;return!A&&!i||(t||(t={class:"cm-line"}),A&&Lk(A,t),i&&(t.class+=" "+i)),t}function JQA(t){let e=[];for(let A=t.parents.length;A>1;A--){let i=A==t.parents.length?t.tile:t.parents[A].tile;i instanceof rl&&e.push(i.mark)}return e}function RS(t){let e=wa.get(t);return e&&e.setDOM(t.cloneNode()),t}var mP=(()=>{class t extends sl{constructor(A){super(),this.tag=A}eq(A){return A.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(A){return A.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}return t.inline=new t("span"),t.block=new t("div"),t})(),NS=new class extends sl{toDOM(){return document.createElement("br")}get isHidden(){return!0}get editable(){return!0}},ww=class{constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=St.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new jE(e,e.contentDOM),this.updateInner([new rc(0,0,0,e.state.doc.length)],null)}update(e){var A;let i=e.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:g,toA:C})=>Cthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((A=this.domChanged)===null||A===void 0)&&A.newSel?n=this.domChanged.newSel.head:!VQA(e.changes,this.hasComposition)&&!e.selectionSet&&(n=e.state.selection.main.head));let o=n>-1?YQA(this.view,e.changes,n):null;if(this.domChanged=null,this.hasComposition){let{from:g,to:C}=this.hasComposition;i=new rc(g,C,e.changes.mapPos(g,-1),e.changes.mapPos(C,1)).addToSet(i.slice())}this.hasComposition=o?{from:o.range.fromB,to:o.range.toB}:null,(at.ie||at.chrome)&&!o&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let a=this.decorations,r=this.blockWrappers;this.updateDeco();let s=PQA(a,this.decorations,e.changes);s.length&&(i=rc.extendWithRanges(i,s));let l=jQA(r,this.blockWrappers,e.changes);return l.length&&(i=rc.extendWithRanges(i,l)),o&&!i.some(g=>g.fromA<=o.range.fromA&&g.toA>=o.range.toA)&&(i=o.range.addToSet(i.slice())),this.tile.flags&2&&i.length==0?!1:(this.updateInner(i,o),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,A){this.view.viewState.mustMeasureContent=!0;let{observer:i}=this.view;i.ignore(()=>{if(A||e.length){let a=this.tile,r=new ik(this.view,a,this.blockWrappers,this.decorations,this.dynamicDecorationMap);A&&wa.get(A.text)&&r.cache.reused.set(wa.get(A.text),2),this.tile=r.run(e,A),nk(a,r.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=at.chrome||at.ios?{node:i.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(o),o&&(o.written||i.selectionRange.focusNode!=o.node||!this.tile.dom.contains(o.node))&&(this.forceSelection=!0),this.tile.dom.style.height=""});let n=[];if(this.view.viewport.from||this.view.viewport.to-1)&&L4(i,this.view.observer.selectionRange)&&!(n&&i.contains(n));if(!(o||A||a))return;let r=this.forceSelection;this.forceSelection=!1;let s=this.view.state.selection.main,l,g;if(s.empty?g=l=this.inlineDOMNearPos(s.anchor,s.assoc||1):(g=this.inlineDOMNearPos(s.head,s.head==s.from?1:-1),l=this.inlineDOMNearPos(s.anchor,s.anchor==s.from?1:-1)),at.gecko&&s.empty&&!this.hasComposition&&OQA(l)){let I=document.createTextNode("");this.view.observer.ignore(()=>l.node.insertBefore(I,l.node.childNodes[l.offset]||null)),l=g=new E0(I,0),r=!0}let C=this.view.observer.selectionRange;(r||!C.focusNode||(!G4(l.node,l.offset,C.anchorNode,C.anchorOffset)||!G4(g.node,g.offset,C.focusNode,C.focusOffset))&&!this.suppressWidgetCursorChange(C,s))&&(this.view.observer.ignore(()=>{at.android&&at.chrome&&i.contains(C.focusNode)&&qQA(C.focusNode,i)&&(i.blur(),i.focus({preventScroll:!0}));let I=j4(this.view.root);if(I)if(s.empty){if(at.gecko){let d=HQA(l.node,l.offset);if(d&&d!=3){let h=(d==1?nj:oj)(l.node,l.offset);h&&(l=new E0(h.node,h.offset))}}I.collapse(l.node,l.offset),s.bidiLevel!=null&&I.caretBidiLevel!==void 0&&(I.caretBidiLevel=s.bidiLevel)}else if(I.extend){I.collapse(l.node,l.offset);try{I.extend(g.node,g.offset)}catch(d){}}else{let d=document.createRange();s.anchor>s.head&&([l,g]=[g,l]),d.setEnd(g.node,g.offset),d.setStart(l.node,l.offset),I.removeAllRanges(),I.addRange(d)}a&&this.view.root.activeElement==i&&(i.blur(),n&&n.focus())}),this.view.observer.setSelectionRange(l,g)),this.impreciseAnchor=l.precise?null:new E0(C.anchorNode,C.anchorOffset),this.impreciseHead=g.precise?null:new E0(C.focusNode,C.focusOffset)}suppressWidgetCursorChange(e,A){return this.hasComposition&&A.empty&&G4(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==A.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,A=e.state.selection.main,i=j4(e.root),{anchorNode:n,anchorOffset:o}=e.observer.selectionRange;if(!i||!A.empty||!A.assoc||!i.modify)return;let a=this.lineAt(A.head,A.assoc);if(!a)return;let r=a.posAtStart;if(A.head==r||A.head==r+a.length)return;let s=this.coordsAt(A.head,-1),l=this.coordsAt(A.head,1);if(!s||!l||s.bottom>l.top)return;let g=this.domAtPos(A.head+A.assoc,A.assoc);i.collapse(g.node,g.offset),i.modify("move",A.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let C=e.observer.selectionRange;e.docView.posFromDOM(C.anchorNode,C.anchorOffset)!=A.from&&i.collapse(n,o)}posFromDOM(e,A){let i=this.tile.nearest(e);if(!i)return this.tile.dom.compareDocumentPosition(e)&2?0:this.view.state.doc.length;let n=i.posAtStart;if(i.isComposite()){let o;if(e==i.dom)o=i.dom.childNodes[A];else{let a=QC(e)==0?0:A==0?-1:1;for(;;){let r=e.parentNode;if(r==i.dom)break;a==0&&r.firstChild!=r.lastChild&&(e==r.firstChild?a=-1:a=1),e=r}a<0?o=e:o=e.nextSibling}if(o==i.dom.firstChild)return n;for(;o&&!wa.get(o);)o=o.nextSibling;if(!o)return n+i.length;for(let a=0,r=n;;a++){let s=i.children[a];if(s.dom==o)return r;r+=s.length+s.breakAfter}}else return i.isText()?e==i.dom?n+A:n+(A?i.length:0):n}domAtPos(e,A){let{tile:i,offset:n}=this.tile.resolveBlock(e,A);return i.isWidget()?i.domPosFor(e,A):i.domIn(n,A)}inlineDOMNearPos(e,A){let i,n=-1,o=!1,a,r=-1,s=!1;return this.tile.blockTiles((l,g)=>{if(l.isWidget()){if(l.flags&32&&g>=e)return!0;l.flags&16&&(o=!0)}else{let C=g+l.length;if(g<=e&&(i=l,n=e-g,o=C=e&&!a&&(a=l,r=e-g,s=g>e),g>e&&a)return!0}}),!i&&!a?this.domAtPos(e,A):(o&&a?i=null:s&&i&&(a=null),i&&A<0||!a?i.domIn(n,A):a.domIn(r,A))}coordsAt(e,A){let{tile:i,offset:n}=this.tile.resolveBlock(e,A);return i.isWidget()?i.widget instanceof T4?null:i.coordsInWidget(n,A,!0):i.coordsIn(n,A)}lineAt(e,A){let{tile:i}=this.tile.resolveBlock(e,A);return i.isLine()?i:null}coordsForChar(e){let{tile:A,offset:i}=this.tile.resolveBlock(e,1);if(!A.isLine())return null;function n(o,a){if(o.isComposite())for(let r of o.children){if(r.length>=a){let s=n(r,a);if(s)return s}if(a-=r.length,a<0)break}else if(o.isText()&&aMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,r=-1,s=this.view.textDirection==mo.LTR,l=0,g=(C,I,d)=>{for(let h=0;hn);h++){let E=C.children[h],f=I+E.length,m=E.dom.getBoundingClientRect(),{height:v}=m;if(d&&!h&&(l+=m.top-d.top),E instanceof hC)f>i&&g(E,I,m);else if(I>=i&&(l>0&&A.push(-l),A.push(v+l),l=0,a)){let k=E.dom.lastChild,S=k?Cw(k):[];if(S.length){let b=S[S.length-1],x=s?b.right-m.left:m.right-b.left;x>r&&(r=x,this.minWidth=o,this.minWidthFrom=I,this.minWidthTo=f)}}d&&h==C.children.length-1&&(l+=d.bottom-m.bottom),I=f+E.breakAfter}};return g(this.tile,0,null),A}textDirectionAt(e){let{tile:A}=this.tile.resolveBlock(e,1);return getComputedStyle(A.dom).direction=="rtl"?mo.RTL:mo.LTR}measureTextSize(){let e=this.tile.blockTiles(a=>{if(a.isLine()&&a.children.length&&a.length<=20){let r=0,s;for(let l of a.children){if(!l.isText()||/[^ -~]/.test(l.text))return;let g=Cw(l.dom);if(g.length!=1)return;r+=g[0].width,s=g[0].height}if(r)return{lineHeight:a.dom.getBoundingClientRect().height,charWidth:r/a.length,textHeight:s}}});if(e)return e;let A=document.createElement("div"),i,n,o;return A.className="cm-line",A.style.width="99999px",A.style.position="absolute",A.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.tile.dom.appendChild(A);let a=Cw(A.firstChild)[0];i=A.getBoundingClientRect().height,n=a&&a.width?a.width/27:7,o=a&&a.height?a.height:i,A.remove()}),{lineHeight:i,charWidth:n,textHeight:o}}computeBlockGapDeco(){let e=[],A=this.view.viewState;for(let i=0,n=0;;n++){let o=n==A.viewports.length?null:A.viewports[n],a=o?o.from-1:this.view.state.doc.length;if(a>i){let r=(A.lineBlockAt(a).bottom-A.lineBlockAt(i).top)/this.view.scaleY;e.push(St.replace({widget:new T4(r),block:!0,inclusive:!0,isBlockGap:!0}).range(i,a))}if(!o)break;i=o.to+1}return St.set(e)}updateDeco(){let e=1,A=this.view.state.facet(Lw).map(o=>(this.dynamicDecorationMap[e++]=typeof o=="function")?o(this.view):o),i=!1,n=this.view.state.facet(Jk).map((o,a)=>{let r=typeof o=="function";return r&&(i=!0),r?o(this.view):o});for(n.length&&(this.dynamicDecorationMap[e++]=i,A.push(io.join(n))),this.decorations=[this.editContextFormatting,...A,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];etypeof o=="function"?o(this.view):o)}scrollIntoView(e){var A;if(e.isSnapshot){let g=this.view.viewState.lineBlockAt(e.range.head);this.view.scrollDOM.scrollTop=g.top-e.yMargin,this.view.scrollDOM.scrollLeft=e.xMargin;return}for(let g of this.view.state.facet(Qj))try{if(g(this.view,e.range,e))return!0}catch(C){Sr(this.view.state,C,"scroll handler")}let{range:i}=e,n=this.coordsAt(i.head,(A=i.assoc)!==null&&A!==void 0?A:i.empty?0:i.head>i.anchor?-1:1),o;if(!n)return;!i.empty&&(o=this.coordsAt(i.anchor,i.anchor>i.head?-1:1))&&(n={left:Math.min(n.left,o.left),top:Math.min(n.top,o.top),right:Math.max(n.right,o.right),bottom:Math.max(n.bottom,o.bottom)});let a=Ok(this.view),r={left:n.left-a.left,top:n.top-a.top,right:n.right+a.right,bottom:n.bottom+a.bottom},{offsetWidth:s,offsetHeight:l}=this.view.scrollDOM;if(wQA(this.view.scrollDOM,r,i.head1&&(n.top>window.pageYOffset+window.visualViewport.offsetTop+window.visualViewport.height||n.bottomi.isWidget()||i.children.some(A);return A(this.tile.resolveBlock(e,1).tile)}destroy(){nk(this.tile)}};function nk(t,e){let A=e?.get(t);if(A!=1){A==null&&t.destroy();for(let i of t.children)nk(i,e)}}function OQA(t){return t.node.nodeType==1&&t.node.firstChild&&(t.offset==0||t.node.childNodes[t.offset-1].contentEditable=="false")&&(t.offset==t.node.childNodes.length||t.node.childNodes[t.offset].contentEditable=="false")}function Dj(t,e){let A=t.observer.selectionRange;if(!A.focusNode)return null;let i=nj(A.focusNode,A.focusOffset),n=oj(A.focusNode,A.focusOffset),o=i||n;if(n&&i&&n.node!=i.node){let r=wa.get(n.node);if(!r||r.isText()&&r.text!=n.node.nodeValue)o=n;else if(t.docView.lastCompositionAfterCursor){let s=wa.get(i.node);!s||s.isText()&&s.text!=i.node.nodeValue||(o=n)}}if(t.docView.lastCompositionAfterCursor=o!=i,!o)return null;let a=e-o.offset;return{from:a,to:a+o.node.nodeValue.length,node:o.node}}function YQA(t,e,A){let i=Dj(t,A);if(!i)return null;let{node:n,from:o,to:a}=i,r=n.nodeValue;if(/[\n\r]/.test(r)||t.state.doc.sliceString(i.from,i.to)!=r)return null;let s=e.invertedDesc;return{range:new rc(s.mapPos(o),s.mapPos(a),o,a),text:n}}function HQA(t,e){return t.nodeType!=1?0:(e&&t.childNodes[e-1].contentEditable=="false"?1:0)|(e{ie.from&&(A=!0)}),A}var T4=class extends sl{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}};function WQA(t,e,A=1){let i=t.charCategorizer(e),n=t.doc.lineAt(e),o=e-n.from;if(n.length==0)return Ie.cursor(e);o==0?A=1:o==n.length&&(A=-1);let a=o,r=o;A<0?a=ja(n.text,o,!1):r=ja(n.text,o);let s=i(n.text.slice(a,r));for(;a>0;){let l=ja(n.text,a,!1);if(i(n.text.slice(l,a))!=s)break;a=l}for(;rt.defaultLineHeight*1.5){let r=t.viewState.heightOracle.textHeight,s=Math.floor((n-A.top-(t.defaultLineHeight-r)*.5)/r);o+=s*t.viewState.heightOracle.lineLength}let a=t.state.sliceDoc(A.from,A.to);return A.from+ew(a,o,t.state.tabSize)}function ak(t,e,A){let i=t.lineBlockAt(e);if(Array.isArray(i.type)){let n;for(let o of i.type){if(o.from>e)break;if(!(o.toe)return o;(!n||o.type==Vr.Text&&(n.type!=o.type||(A<0?o.frome)))&&(n=o)}}return n||i}return i}function XQA(t,e,A,i){let n=ak(t,e.head,e.assoc||-1),o=!i||n.type!=Vr.Text||!(t.lineWrapping||n.widgetLineBreaks)?null:t.coordsAtPos(e.assoc<0&&e.head>n.from?e.head-1:e.head);if(o){let a=t.dom.getBoundingClientRect(),r=t.textDirectionAt(n.from),s=t.posAtCoords({x:A==(r==mo.LTR)?a.right-1:a.left+1,y:(o.top+o.bottom)/2});if(s!=null)return Ie.cursor(s,A?-1:1)}return Ie.cursor(A?n.to:n.from,A?-1:1)}function wP(t,e,A,i){let n=t.state.doc.lineAt(e.head),o=t.bidiSpans(n),a=t.textDirectionAt(n.from);for(let r=e,s=null;;){let l=RQA(n,o,a,r,A),g=gj;if(!l){if(n.number==(A?t.state.doc.lines:1))return r;g=` +`,n=t.state.doc.line(n.number+(A?1:-1)),o=t.bidiSpans(n),l=t.visualLineSide(n,!A)}if(s){if(!s(g))return r}else{if(!i)return l;s=i(g)}r=l}}function $QA(t,e,A){let i=t.state.charCategorizer(e),n=i(A);return o=>{let a=i(o);return n==Uo.Space&&(n=a),n==a}}function AuA(t,e,A,i){let n=e.head,o=A?1:-1;if(n==(A?t.state.doc.length:0))return Ie.cursor(n,e.assoc);let a=e.goalColumn,r,s=t.contentDOM.getBoundingClientRect(),l=t.coordsAtPos(n,e.assoc||((e.empty?A:e.head==e.from)?1:-1)),g=t.documentTop;if(l)a==null&&(a=l.left-s.left),r=o<0?l.top:l.bottom;else{let h=t.viewState.lineBlockAt(n);a==null&&(a=Math.min(s.right-s.left,t.defaultCharacterWidth*(n-h.from))),r=(o<0?h.top:h.bottom)+g}let C=s.left+a,I=t.viewState.heightOracle.textHeight>>1,d=i??I;for(let h=0;;h+=I){let E=r+(d+h)*o,f=rk(t,{x:C,y:E},!1,o);if(A?E>s.bottom:Er:v{if(e>o&&en(t)),A.from,e.head>A.from?-1:1);return i==A.from?A:Ie.cursor(i,it.viewState.docHeight)return new Ig(t.state.doc.length,-1);if(l=t.elementAtHeight(s),i==null)break;if(l.type==Vr.Text){if(i<0?l.tot.viewport.to)break;let I=t.docView.coordsAt(i<0?l.from:l.to,i>0?-1:1);if(I&&(i<0?I.top<=s+o:I.bottom>=s+o))break}let C=t.viewState.heightOracle.textHeight/2;s=i>0?l.bottom+C:l.top-C}if(t.viewport.from>=l.to||t.viewport.to<=l.from){if(A)return null;if(l.type==Vr.Text){let C=ZQA(t,n,l,a,r);return new Ig(C,C==l.from?1:-1)}}if(l.type!=Vr.Text)return s<(l.top+l.bottom)/2?new Ig(l.from,1):new Ig(l.to,-1);let g=t.docView.lineAt(l.from,2);return(!g||g.length!=l.length)&&(g=t.docView.lineAt(l.from,-2)),new sk(t,a,r,t.textDirectionAt(l.from)).scanTile(g,l.from)}var sk=class{constructor(e,A,i,n){this.view=e,this.x=A,this.y=i,this.baseDir=n,this.line=null,this.spans=null}bidiSpansAt(e){return(!this.line||this.line.from>e||this.line.to1||i.length&&(i[0].level!=this.baseDir||i[0].to+n.from>1;e:if(o.has(h)){let f=i+Math.floor(Math.random()*d);for(let m=0;m1)){if(m.bottomthis.y)(!s||s.top>m.top)&&(s=m),v=-1;else{let k=m.left>this.x?this.x-m.left:m.right(C.left+C.right)/2==I}}scanText(e,A){let i=[];for(let o=0;o{let a=i[o]-A,r=i[o+1]-A;return q4(e.dom,a,r).getClientRects()});return n.after?new Ig(i[n.i+1],-1):new Ig(i[n.i],1)}scanTile(e,A){if(!e.length)return new Ig(A,1);if(e.children.length==1){let r=e.children[0];if(r.isText())return this.scanText(r,A);if(r.isComposite())return this.scanTile(r,A)}let i=[A];for(let r=0,s=A;r{let s=e.children[r];return s.flags&48?null:(s.dom.nodeType==1?s.dom:q4(s.dom,0,s.length)).getClientRects()}),o=e.children[n.i],a=i[n.i];return o.isText()?this.scanText(o,a):o.isComposite()?this.scanTile(o,a):n.after?new Ig(i[n.i+1],-1):new Ig(a,1)}},UE="\uFFFF",lk=class{constructor(e,A){this.points=e,this.view=A,this.text="",this.lineSeparator=A.state.facet(qa.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=UE}readRange(e,A){if(!e)return this;let i=e.parentNode;for(let n=e;;){this.findPointBefore(i,n);let o=this.text.length;this.readNode(n);let a=wa.get(n),r=n.nextSibling;if(r==A){a?.breakAfter&&!r&&i!=this.view.contentDOM&&this.lineBreak();break}let s=wa.get(r);(a&&s?a.breakAfter:(a?a.breakAfter:uw(n))||uw(r)&&(n.nodeName!="BR"||a?.isWidget())&&this.text.length>o)&&!tuA(r,A)&&this.lineBreak(),n=r}return this.findPointBefore(i,A),this}readTextNode(e){let A=e.nodeValue;for(let i of this.points)i.node==e&&(i.pos=this.text.length+Math.min(i.offset,A.length));for(let i=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let o=-1,a=1,r;if(this.lineSeparator?(o=A.indexOf(this.lineSeparator,i),a=this.lineSeparator.length):(r=n.exec(A))&&(o=r.index,a=r[0].length),this.append(A.slice(i,o<0?A.length:o)),o<0)break;if(this.lineBreak(),a>1)for(let s of this.points)s.node==e&&s.pos>this.text.length&&(s.pos-=a-1);i=o+a}}readNode(e){let A=wa.get(e),i=A&&A.overrideDOMText;if(i!=null){this.findPointInside(e,i.length);for(let n=i.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else e.nodeType==3?this.readTextNode(e):e.nodeName=="BR"?e.nextSibling&&this.lineBreak():e.nodeType==1&&this.readRange(e.firstChild,null)}findPointBefore(e,A){for(let i of this.points)i.node==e&&e.childNodes[i.offset]==A&&(i.pos=this.text.length)}findPointInside(e,A){for(let i of this.points)(e.nodeType==3?i.node==e:e.contains(i.node))&&(i.pos=this.text.length+(euA(e,i.node,i.offset)?A:0))}};function euA(t,e,A){for(;;){if(!e||A-1;let{impreciseHead:o,impreciseAnchor:a}=e.docView,r=e.state.selection;if(e.state.readOnly&&A>-1)this.newSel=null;else if(A>-1&&(this.bounds=vj(e.docView.tile,A,i,0))){let s=o||a?[]:nuA(e),l=new lk(s,e);l.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=l.text,this.newSel=ouA(s,this.bounds.from)}else{let s=e.observer.selectionRange,l=o&&o.node==s.focusNode&&o.offset==s.focusOffset||!PS(e.contentDOM,s.focusNode)?r.main.head:e.docView.posFromDOM(s.focusNode,s.focusOffset),g=a&&a.node==s.anchorNode&&a.offset==s.anchorOffset||!PS(e.contentDOM,s.anchorNode)?r.main.anchor:e.docView.posFromDOM(s.anchorNode,s.anchorOffset),C=e.viewport;if((at.ios||at.chrome)&&r.main.empty&&l!=g&&(C.from>0||C.to-1&&r.ranges.length>1)this.newSel=r.replaceRange(Ie.range(g,l));else if(e.lineWrapping&&g==l&&!(r.main.empty&&r.main.head==l)&&e.inputState.lastTouchTime>Date.now()-100){let I=e.coordsAtPos(l,-1),d=0;I&&(d=e.inputState.lastTouchY<=I.bottom?-1:1),this.newSel=Ie.create([Ie.cursor(l,d)])}else this.newSel=Ie.single(g,l)}}};function vj(t,e,A,i){if(t.isComposite()){let n=-1,o=-1,a=-1,r=-1;for(let s=0,l=i,g=i;sA)return vj(C,e,A,l);if(I>=e&&n==-1&&(n=s,o=l),l>A&&C.dom.parentNode==t.dom){a=s,r=g;break}g=I,l=I+C.breakAfter}return{from:o,to:r<0?i+t.length:r,startDOM:(n?t.children[n-1].dom.nextSibling:null)||t.dom.firstChild,endDOM:a=0?t.children[a].dom:null}}else return t.isText()?{from:i,to:i+t.length,startDOM:t.dom,endDOM:t.dom.nextSibling}:null}function bj(t,e){let A,{newSel:i}=e,{state:n}=t,o=n.selection.main,a=t.inputState.lastKeyTime>Date.now()-100?t.inputState.lastKeyCode:-1;if(e.bounds){let{from:r,to:s}=e.bounds,l=o.from,g=null;(a===8||at.android&&e.text.length=r&&o.to<=s&&(e.typeOver||C!=e.text)&&C.slice(0,o.from-r)==e.text.slice(0,o.from-r)&&C.slice(o.to-r)==e.text.slice(I=e.text.length-(C.length-(o.to-r)))?A={from:o.from,to:o.to,insert:bn.of(e.text.slice(o.from-r,I).split(UE))}:(d=Mj(C,e.text,l-r,g))&&(at.chrome&&a==13&&d.toB==d.from+2&&e.text.slice(d.from,d.toB)==UE+UE&&d.toB--,A={from:r+d.from,to:r+d.toA,insert:bn.of(e.text.slice(d.from,d.toB).split(UE))})}else i&&(!t.hasFocus&&n.facet(EC)||yw(i,o))&&(i=null);if(!A&&!i)return!1;if((at.mac||at.android)&&A&&A.from==A.to&&A.from==o.head-1&&/^\. ?$/.test(A.insert.toString())&&t.contentDOM.getAttribute("autocorrect")=="off"?(i&&A.insert.length==2&&(i=Ie.single(i.main.anchor-1,i.main.head-1)),A={from:A.from,to:A.to,insert:bn.of([A.insert.toString().replace("."," ")])}):n.doc.lineAt(o.from).toDate.now()-50?A={from:o.from,to:o.to,insert:n.toText(t.inputState.insertingText)}:at.chrome&&A&&A.from==A.to&&A.from==o.head&&A.insert.toString()==` + `&&t.lineWrapping&&(i&&(i=Ie.single(i.main.anchor-1,i.main.head-1)),A={from:o.from,to:o.to,insert:bn.of([" "])}),A)return Yk(t,A,i,a);if(i&&!yw(i,o)){let r=!1,s="select";return t.inputState.lastSelectionTime>Date.now()-50&&(t.inputState.lastSelectionOrigin=="select"&&(r=!0),s=t.inputState.lastSelectionOrigin,s=="select.pointer"&&(i=yj(n.facet(V4).map(l=>l(t)),i))),t.dispatch({selection:i,scrollIntoView:r,userEvent:s}),!0}else return!1}function Yk(t,e,A,i=-1){if(at.ios&&t.inputState.flushIOSKey(e))return!0;let n=t.state.selection.main;if(at.android&&(e.to==n.to&&(e.from==n.from||e.from==n.from-1&&t.state.sliceDoc(e.from,n.from)==" ")&&e.insert.length==1&&e.insert.lines==2&&zE(t.contentDOM,"Enter",13)||(e.from==n.from-1&&e.to==n.to&&e.insert.length==0||i==8&&e.insert.lengthn.head)&&zE(t.contentDOM,"Backspace",8)||e.from==n.from&&e.to==n.to+1&&e.insert.length==0&&zE(t.contentDOM,"Delete",46)))return!0;let o=e.insert.toString();t.inputState.composing>=0&&t.inputState.composing++;let a,r=()=>a||(a=iuA(t,e,A));return t.state.facet(Bj).some(s=>s(t,e.from,e.to,o,r))||t.dispatch(r()),!0}function iuA(t,e,A){let i,n=t.state,o=n.selection.main,a=-1;if(e.from==e.to&&e.fromo.to){let s=e.fromC(t)),l,s);e.from==g&&(a=g)}if(a>-1)i={changes:e,selection:Ie.cursor(e.from+e.insert.length,-1)};else if(e.from>=o.from&&e.to<=o.to&&e.to-e.from>=(o.to-o.from)/3&&(!A||A.main.empty&&A.main.from==e.from+e.insert.length)&&t.inputState.composing<0){let s=o.frome.to?n.sliceDoc(e.to,o.to):"";i=n.replaceSelection(t.state.toText(s+e.insert.sliceString(0,void 0,t.state.lineBreak)+l))}else{let s=n.changes(e),l=A&&A.main.to<=s.newLength?A.main:void 0;if(n.selection.ranges.length>1&&(t.inputState.composing>=0||t.inputState.compositionPendingChange)&&e.to<=o.to+10&&e.to>=o.to-10){let g=t.state.sliceDoc(e.from,e.to),C,I=A&&Dj(t,A.main.head);if(I){let h=e.insert.length-(e.to-e.from);C={from:I.from,to:I.to-h}}else C=t.state.doc.lineAt(o.head);let d=o.to-e.to;i=n.changeByRange(h=>{if(h.from==o.from&&h.to==o.to)return{changes:s,range:l||h.map(s)};let E=h.to-d,f=E-g.length;if(t.state.sliceDoc(f,E)!=g||E>=C.from&&f<=C.to)return{range:h};let m=n.changes({from:f,to:E,insert:e.insert}),v=h.to-o.to;return{changes:m,range:l?Ie.range(Math.max(0,l.anchor+v),Math.max(0,l.head+v)):h.map(m)}})}else i={changes:s,selection:l&&n.selection.replaceRange(l)}}let r="input.type";return(t.composing||t.inputState.compositionPendingChange&&t.inputState.compositionEndedAt>Date.now()-50)&&(t.inputState.compositionPendingChange=!1,r+=".compose",t.inputState.compositionFirstChange&&(r+=".start",t.inputState.compositionFirstChange=!1)),n.update(i,{userEvent:r,scrollIntoView:!0})}function Mj(t,e,A,i){let n=Math.min(t.length,e.length),o=0;for(;o0&&r>0&&t.charCodeAt(a-1)==e.charCodeAt(r-1);)a--,r--;if(i=="end"){let s=Math.max(0,o-Math.min(a,r));A-=a+s-o}if(a=a?o-A:0;o-=s,r=o+(r-a),a=o}else if(r=r?o-A:0;o-=s,a=o+(a-r),r=o}return{from:o,toA:a,toB:r}}function nuA(t){let e=[];if(t.root.activeElement!=t.contentDOM)return e;let{anchorNode:A,anchorOffset:i,focusNode:n,focusOffset:o}=t.observer.selectionRange;return A&&(e.push(new Dw(A,i)),(n!=A||o!=i)&&e.push(new Dw(n,o))),e}function ouA(t,e){if(t.length==0)return null;let A=t[0].pos,i=t.length==2?t[1].pos:A;return A>-1&&i>-1?Ie.single(A+e,i+e):null}function yw(t,e){return e.head==t.main.head&&e.anchor==t.main.anchor}var ck=class{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastTouchX=0,this.lastTouchY=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.lastWheelEvent=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText="",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,at.safari&&e.contentDOM.addEventListener("input",()=>null),at.gecko&&uuA(e.contentDOM.ownerDocument)}handleEvent(e){!CuA(this.view,e)||this.ignoreDuringComposition(e)||e.type=="keydown"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,A){let i=this.handlers[e];if(i){for(let n of i.observers)n(this.view,A);for(let n of i.handlers){if(A.defaultPrevented)break;if(n(this.view,A)){A.preventDefault();break}}}}ensureHandlers(e){let A=auA(e),i=this.handlers,n=this.view.contentDOM;for(let o in A)if(o!="scroll"){let a=!A[o].handlers.length,r=i[o];r&&a!=!r.handlers.length&&(n.removeEventListener(o,this.handleEvent),r=null),r||n.addEventListener(o,this.handleEvent,{passive:a})}for(let o in i)o!="scroll"&&!A[o]&&n.removeEventListener(o,this.handleEvent);this.handlers=A}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&kj.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),at.android&&at.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;let A;return at.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&!e.shiftKey&&((A=Sj.find(i=>i.keyCode==e.keyCode))&&!e.ctrlKey||ruA.indexOf(e.key)>-1&&e.ctrlKey)?(this.pendingIOSKey=A||e,setTimeout(()=>this.flushIOSKey(),250),!0):(e.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(e){let A=this.pendingIOSKey;return!A||A.key=="Enter"&&e&&e.from0?!0:at.safari&&!at.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function DP(t,e){return(A,i)=>{try{return e.call(t,i,A)}catch(n){Sr(A.state,n)}}}function auA(t){let e=Object.create(null);function A(i){return e[i]||(e[i]={observers:[],handlers:[]})}for(let i of t){let n=i.spec,o=n&&n.plugin.domEventHandlers,a=n&&n.plugin.domEventObservers;if(o)for(let r in o){let s=o[r];s&&A(r).handlers.push(DP(i.value,s))}if(a)for(let r in a){let s=a[r];s&&A(r).observers.push(DP(i.value,s))}}for(let i in sc)A(i).handlers.push(sc[i]);for(let i in ll)A(i).observers.push(ll[i]);return e}var Sj=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],ruA="dthko",kj=[16,17,18,20,91,92,224,225],nw=6;function ow(t){return Math.max(0,t)*.7+8}function suA(t,e){return Math.max(Math.abs(t.clientX-e.clientX),Math.abs(t.clientY-e.clientY))}var Ck=class{constructor(e,A,i,n){this.view=e,this.startEvent=A,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=A,this.scrollParents=ej(e.contentDOM),this.atoms=e.state.facet(V4).map(a=>a(e));let o=e.contentDOM.ownerDocument;o.addEventListener("mousemove",this.move=this.move.bind(this)),o.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=A.shiftKey,this.multiple=e.state.facet(qa.allowMultipleSelections)&&luA(e,A),this.dragging=cuA(e,A)&&Rj(A)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&suA(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let A=0,i=0,n=0,o=0,a=this.view.win.innerWidth,r=this.view.win.innerHeight;this.scrollParents.x&&({left:n,right:a}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:o,bottom:r}=this.scrollParents.y.getBoundingClientRect());let s=Ok(this.view);e.clientX-s.left<=n+nw?A=-ow(n-e.clientX):e.clientX+s.right>=a-nw&&(A=ow(e.clientX-a)),e.clientY-s.top<=o+nw?i=-ow(o-e.clientY):e.clientY+s.bottom>=r-nw&&(i=ow(e.clientY-r)),this.setScrollSpeed(A,i)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,A){this.scrollSpeed={x:e,y:A},e||A?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:A}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),A&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=A,A=0),(e||A)&&this.view.win.scrollBy(e,A),this.dragging===!1&&this.select(this.lastEvent)}select(e){let{view:A}=this,i=yj(this.atoms,this.style.get(e,this.extend,this.multiple));(this.mustSelect||!i.eq(A.state.selection,this.dragging===!1))&&this.view.dispatch({selection:i,userEvent:"select.pointer"}),this.mustSelect=!1}update(e){e.transactions.some(A=>A.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}};function luA(t,e){let A=t.state.facet(cj);return A.length?A[0](e):at.mac?e.metaKey:e.ctrlKey}function guA(t,e){let A=t.state.facet(Cj);return A.length?A[0](e):at.mac?!e.altKey:!e.ctrlKey}function cuA(t,e){let{main:A}=t.state.selection;if(A.empty)return!1;let i=j4(t.root);if(!i||i.rangeCount==0)return!0;let n=i.getRangeAt(0).getClientRects();for(let o=0;o=e.clientX&&a.top<=e.clientY&&a.bottom>=e.clientY)return!0}return!1}function CuA(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let A=e.target,i;A!=t.contentDOM;A=A.parentNode)if(!A||A.nodeType==11||(i=wa.get(A))&&i.isWidget()&&!i.isHidden&&i.widget.ignoreEvent(e))return!1;return!0}var sc=Object.create(null),ll=Object.create(null),xj=at.ie&&at.ie_version<15||at.ios&&at.webkit_version<604;function IuA(t){let e=t.dom.parentNode;if(!e)return;let A=e.appendChild(document.createElement("textarea"));A.style.cssText="position: fixed; left: -10000px; top: 10px",A.focus(),setTimeout(()=>{t.focus(),A.remove(),_j(t,A.value)},50)}function Gw(t,e,A){for(let i of t.facet(e))A=i(A,t);return A}function _j(t,e){e=Gw(t.state,Uk,e);let{state:A}=t,i,n=1,o=A.toText(e),a=o.lines==A.selection.ranges.length;if(Ik!=null&&A.selection.ranges.every(s=>s.empty)&&Ik==o.toString()){let s=-1;i=A.changeByRange(l=>{let g=A.doc.lineAt(l.from);if(g.from==s)return{range:l};s=g.from;let C=A.toText((a?o.line(n++).text:e)+A.lineBreak);return{changes:{from:g.from,insert:C},range:Ie.cursor(l.from+C.length)}})}else a?i=A.changeByRange(s=>{let l=o.line(n++);return{changes:{from:s.from,to:s.to,insert:l.text},range:Ie.cursor(s.from+l.length)}}):i=A.replaceSelection(o);t.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}ll.scroll=t=>{t.inputState.lastScrollTop=t.scrollDOM.scrollTop,t.inputState.lastScrollLeft=t.scrollDOM.scrollLeft};ll.wheel=ll.mousewheel=t=>{t.inputState.lastWheelEvent=Date.now()};sc.keydown=(t,e)=>(t.inputState.setSelectionOrigin("select"),e.keyCode==27&&t.inputState.tabFocusMode!=0&&(t.inputState.tabFocusMode=Date.now()+2e3),!1);ll.touchstart=(t,e)=>{let A=t.inputState,i=e.targetTouches[0];A.lastTouchTime=Date.now(),i&&(A.lastTouchX=i.clientX,A.lastTouchY=i.clientY),A.setSelectionOrigin("select.pointer")};ll.touchmove=t=>{t.inputState.setSelectionOrigin("select.pointer")};sc.mousedown=(t,e)=>{if(t.observer.flush(),t.inputState.lastTouchTime>Date.now()-2e3)return!1;let A=null;for(let i of t.state.facet(Ij))if(A=i(t,e),A)break;if(!A&&e.button==0&&(A=BuA(t,e)),A){let i=!t.hasFocus;t.inputState.startMouseSelection(new Ck(t,e,A,i)),i&&t.observer.ignore(()=>{tj(t.contentDOM);let o=t.root.activeElement;o&&!o.contains(t.contentDOM)&&o.blur()});let n=t.inputState.mouseSelection;if(n)return n.start(e),n.dragging===!1}else t.inputState.setSelectionOrigin("select.pointer");return!1};function yP(t,e,A,i){if(i==1)return Ie.cursor(e,A);if(i==2)return WQA(t.state,e,A);{let n=t.docView.lineAt(e,A),o=t.state.doc.lineAt(n?n.posAtEnd:e),a=n?n.posAtStart:o.from,r=n?n.posAtEnd:o.to;return rDate.now()-400&&Math.abs(e.clientX-t.clientX)<2&&Math.abs(e.clientY-t.clientY)<2?(bP+1)%3:1}function BuA(t,e){let A=t.posAndSideAtCoords({x:e.clientX,y:e.clientY},!1),i=Rj(e),n=t.state.selection;return{update(o){o.docChanged&&(A.pos=o.changes.mapPos(A.pos),n=n.map(o.changes))},get(o,a,r){let s=t.posAndSideAtCoords({x:o.clientX,y:o.clientY},!1),l,g=yP(t,s.pos,s.assoc,i);if(A.pos!=s.pos&&!a){let C=yP(t,A.pos,A.assoc,i),I=Math.min(C.from,g.from),d=Math.max(C.to,g.to);g=I1&&(l=EuA(n,s.pos))?l:r?n.addRange(g):Ie.create([g])}}}function EuA(t,e){for(let A=0;A=e)return Ie.create(t.ranges.slice(0,A).concat(t.ranges.slice(A+1)),t.mainIndex==A?0:t.mainIndex-(t.mainIndex>A?1:0))}return null}sc.dragstart=(t,e)=>{let{selection:{main:A}}=t.state;if(e.target.draggable){let n=t.docView.tile.nearest(e.target);if(n&&n.isWidget()){let o=n.posAtStart,a=o+n.length;(o>=A.to||a<=A.from)&&(A=Ie.range(o,a))}}let{inputState:i}=t;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=A,e.dataTransfer&&(e.dataTransfer.setData("Text",Gw(t.state,Tk,t.state.sliceDoc(A.from,A.to))),e.dataTransfer.effectAllowed="copyMove"),!1};sc.dragend=t=>(t.inputState.draggedContent=null,!1);function SP(t,e,A,i){if(A=Gw(t.state,Uk,A),!A)return;let n=t.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:o}=t.inputState,a=i&&o&&guA(t,e)?{from:o.from,to:o.to}:null,r={from:n,insert:A},s=t.state.changes(a?[a,r]:r);t.focus(),t.dispatch({changes:s,selection:{anchor:s.mapPos(n,-1),head:s.mapPos(n,1)},userEvent:a?"move.drop":"input.drop"}),t.inputState.draggedContent=null}sc.drop=(t,e)=>{if(!e.dataTransfer)return!1;if(t.state.readOnly)return!0;let A=e.dataTransfer.files;if(A&&A.length){let i=Array(A.length),n=0,o=()=>{++n==A.length&&SP(t,e,i.filter(a=>a!=null).join(t.state.lineBreak),!1)};for(let a=0;a{/[\x00-\x08\x0e-\x1f]{2}/.test(r.result)||(i[a]=r.result),o()},r.readAsText(A[a])}return!0}else{let i=e.dataTransfer.getData("Text");if(i)return SP(t,e,i,!0),!0}return!1};sc.paste=(t,e)=>{if(t.state.readOnly)return!0;t.observer.flush();let A=xj?null:e.clipboardData;return A?(_j(t,A.getData("text/plain")||A.getData("text/uri-list")),!0):(IuA(t),!1)};function huA(t,e){let A=t.dom.parentNode;if(!A)return;let i=A.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=e,i.focus(),i.selectionEnd=e.length,i.selectionStart=0,setTimeout(()=>{i.remove(),t.focus()},50)}function QuA(t){let e=[],A=[],i=!1;for(let n of t.selection.ranges)n.empty||(e.push(t.sliceDoc(n.from,n.to)),A.push(n));if(!e.length){let n=-1;for(let{from:o}of t.selection.ranges){let a=t.doc.lineAt(o);a.number>n&&(e.push(a.text),A.push({from:a.from,to:Math.min(t.doc.length,a.to+1)})),n=a.number}i=!0}return{text:Gw(t,Tk,e.join(t.lineBreak)),ranges:A,linewise:i}}var Ik=null;sc.copy=sc.cut=(t,e)=>{if(!L4(t.contentDOM,t.observer.selectionRange))return!1;let{text:A,ranges:i,linewise:n}=QuA(t.state);if(!A&&!n)return!1;Ik=n?A:null,e.type=="cut"&&!t.state.readOnly&&t.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let o=xj?null:e.clipboardData;return o?(o.clearData(),o.setData("text/plain",A),!0):(huA(t,A),!1)};var Nj=al.define();function Fj(t,e){let A=[];for(let i of t.facet(Ej)){let n=i(t,e);n&&A.push(n)}return A.length?t.update({effects:A,annotations:Nj.of(!0)}):null}function Lj(t){setTimeout(()=>{let e=t.hasFocus;if(e!=t.inputState.notifiedFocused){let A=Fj(t.state,e);A?t.dispatch(A):t.update([])}},10)}ll.focus=t=>{t.inputState.lastFocusTime=Date.now(),!t.scrollDOM.scrollTop&&(t.inputState.lastScrollTop||t.inputState.lastScrollLeft)&&(t.scrollDOM.scrollTop=t.inputState.lastScrollTop,t.scrollDOM.scrollLeft=t.inputState.lastScrollLeft),Lj(t)};ll.blur=t=>{t.observer.clearSelectionRange(),Lj(t)};ll.compositionstart=ll.compositionupdate=t=>{t.observer.editContext||(t.inputState.compositionFirstChange==null&&(t.inputState.compositionFirstChange=!0),t.inputState.composing<0&&(t.inputState.composing=0))};ll.compositionend=t=>{t.observer.editContext||(t.inputState.composing=-1,t.inputState.compositionEndedAt=Date.now(),t.inputState.compositionPendingKey=!0,t.inputState.compositionPendingChange=t.observer.pendingRecords().length>0,t.inputState.compositionFirstChange=null,at.chrome&&at.android?t.observer.flushSoon():t.inputState.compositionPendingChange?Promise.resolve().then(()=>t.observer.flush()):setTimeout(()=>{t.inputState.composing<0&&t.docView.hasComposition&&t.update([])},50))};ll.contextmenu=t=>{t.inputState.lastContextMenu=Date.now()};sc.beforeinput=(t,e)=>{var A,i;if((e.inputType=="insertText"||e.inputType=="insertCompositionText")&&(t.inputState.insertingText=e.data,t.inputState.insertingTextAt=Date.now()),e.inputType=="insertReplacementText"&&t.observer.editContext){let o=(A=e.dataTransfer)===null||A===void 0?void 0:A.getData("text/plain"),a=e.getTargetRanges();if(o&&a.length){let r=a[0],s=t.posAtDOM(r.startContainer,r.startOffset),l=t.posAtDOM(r.endContainer,r.endOffset);return Yk(t,{from:s,to:l,insert:t.state.toText(o)},null),!0}}let n;if(at.chrome&&at.android&&(n=Sj.find(o=>o.inputType==e.inputType))&&(t.observer.delayAndroidKey(n.key,n.keyCode),n.key=="Backspace"||n.key=="Delete")){let o=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var a;(((a=window.visualViewport)===null||a===void 0?void 0:a.height)||0)>o+10&&t.hasFocus&&(t.contentDOM.blur(),t.focus())},100)}return at.ios&&e.inputType=="deleteContentForward"&&t.observer.flushSoon(),at.safari&&e.inputType=="insertText"&&t.inputState.composing>=0&&setTimeout(()=>ll.compositionend(t,e),20),!1};var kP=new Set;function uuA(t){kP.has(t)||(kP.add(t),t.addEventListener("copy",()=>{}),t.addEventListener("cut",()=>{}))}var xP=["pre-wrap","normal","pre-line","break-spaces"],WE=!1;function _P(){WE=!1}var dk=class{constructor(e){this.lineWrapping=e,this.doc=bn.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,A){let i=this.doc.lineAt(A).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((A-e-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return xP.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let A=!1;for(let i=0;i-1,s=Math.abs(A-this.lineHeight)>.3||this.lineWrapping!=r||Math.abs(i-this.charWidth)>.1;if(this.lineWrapping=r,this.lineHeight=A,this.charWidth=i,this.textHeight=n,this.lineLength=o,s){this.heightSamples={};for(let l=0;l0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>Iw&&(WE=!0),this.height=e)}replace(e,A,i){return t.of(i)}decomposeLeft(e,A){A.push(this)}decomposeRight(e,A){A.push(this)}applyChanges(e,A,i,n){let o=this,a=i.doc;for(let r=n.length-1;r>=0;r--){let{fromA:s,toA:l,fromB:g,toB:C}=n[r],I=o.lineAt(s,oa.ByPosNoHeight,i.setDoc(A),0,0),d=I.to>=l?I:o.lineAt(l,oa.ByPosNoHeight,i,0,0);for(C+=d.to-l,l=d.to;r>0&&I.from<=n[r-1].toA;)s=n[r-1].fromA,g=n[r-1].fromB,r--,so*2){let r=e[A-1];r.break?e.splice(--A,1,r.left,null,r.right):e.splice(--A,1,r.left,r.right),i+=1+r.break,n-=r.size}else if(o>n*2){let r=e[i];r.break?e.splice(i,1,r.left,null,r.right):e.splice(i,1,r.left,r.right),i+=2+r.break,o-=r.size}else break;else if(n=o&&a(this.lineAt(0,oa.ByPos,i,n,o))}setMeasuredHeight(e){let A=e.heights[e.index++];A<0?(this.spaceAbove=-A,A=e.heights[e.index++]):this.spaceAbove=0,this.setHeight(A)}updateHeight(e,A=0,i=!1,n){return n&&n.from<=A&&n.more&&this.setMeasuredHeight(n),this.outdated=!1,this}toString(){return`block(${this.length})`}},Cg=class t extends bw{constructor(e,A,i){super(e,A,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=i}mainBlock(e,A){return new ac(A,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(e,A,i){let n=i[0];return i.length==1&&(n instanceof t||n instanceof W2&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof W2?n=new t(n.length,this.height,this.spaceAbove):n.height=this.height,this.outdated||(n.outdated=!1),n):Rl.of(i)}updateHeight(e,A=0,i=!1,n){return n&&n.from<=A&&n.more?this.setMeasuredHeight(n):(i||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},W2=class t extends Rl{constructor(e){super(e,0)}heightMetrics(e,A){let i=e.doc.lineAt(A).number,n=e.doc.lineAt(A+this.length).number,o=n-i+1,a,r=0;if(e.lineWrapping){let s=Math.min(this.height,e.lineHeight*o);a=s/o,this.length>o+1&&(r=(this.height-s)/(this.length-o-1))}else a=this.height/o;return{firstLine:i,lastLine:n,perLine:a,perChar:r}}blockAt(e,A,i,n){let{firstLine:o,lastLine:a,perLine:r,perChar:s}=this.heightMetrics(A,n);if(A.lineWrapping){let l=n+(e0){let o=i[i.length-1];o instanceof t?i[i.length-1]=new t(o.length+n):i.push(null,new t(n-1))}if(e>0){let o=i[0];o instanceof t?i[0]=new t(e+o.length):i.unshift(new t(e-1),null)}return Rl.of(i)}decomposeLeft(e,A){A.push(new t(e-1),null)}decomposeRight(e,A){A.push(null,new t(this.length-e-1))}updateHeight(e,A=0,i=!1,n){let o=A+this.length;if(n&&n.from<=A+this.length&&n.more){let a=[],r=Math.max(A,n.from),s=-1;for(n.from>A&&a.push(new t(n.from-A-1).updateHeight(e,A));r<=o&&n.more;){let g=e.doc.lineAt(r).length;a.length&&a.push(null);let C=n.heights[n.index++],I=0;C<0&&(I=-C,C=n.heights[n.index++]),s==-1?s=C:Math.abs(C-s)>=Iw&&(s=-2);let d=new Cg(g,C,I);d.outdated=!1,a.push(d),r+=g+1}r<=o&&a.push(null,new t(o-r).updateHeight(e,r));let l=Rl.of(a);return(s<0||Math.abs(l.height-this.height)>=Iw||Math.abs(s-this.heightMetrics(e,A).perLine)>=Iw)&&(WE=!0),vw(this,l)}else(i||this.outdated)&&(this.setHeight(e.heightForGap(A,A+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},Ek=class extends Rl{constructor(e,A,i){super(e.length+A+i.length,e.height+i.height,A|(e.outdated||i.outdated?2:0)),this.left=e,this.right=i,this.size=e.size+i.size}get break(){return this.flags&1}blockAt(e,A,i,n){let o=i+this.left.height;return er))return l;let g=A==oa.ByPosNoHeight?oa.ByPosNoHeight:oa.ByPos;return s?l.join(this.right.lineAt(r,g,i,a,r)):this.left.lineAt(r,g,i,n,o).join(l)}forEachLine(e,A,i,n,o,a){let r=n+this.left.height,s=o+this.left.length+this.break;if(this.break)e=s&&this.right.forEachLine(e,A,i,r,s,a);else{let l=this.lineAt(s,oa.ByPos,i,n,o);e=e&&l.from<=A&&a(l),A>l.to&&this.right.forEachLine(l.to+1,A,i,r,s,a)}}replace(e,A,i){let n=this.left.length+this.break;if(Athis.left.length)return this.balanced(this.left,this.right.replace(e-n,A-n,i));let o=[];e>0&&this.decomposeLeft(e,o);let a=o.length;for(let r of i)o.push(r);if(e>0&&RP(o,a-1),A=i&&A.push(null)),e>i&&this.right.decomposeLeft(e-i,A)}decomposeRight(e,A){let i=this.left.length,n=i+this.break;if(e>=n)return this.right.decomposeRight(e-n,A);e2*A.size||A.size>2*e.size?Rl.of(this.break?[e,null,A]:[e,A]):(this.left=vw(this.left,e),this.right=vw(this.right,A),this.setHeight(e.height+A.height),this.outdated=e.outdated||A.outdated,this.size=e.size+A.size,this.length=e.length+this.break+A.length,this)}updateHeight(e,A=0,i=!1,n){let{left:o,right:a}=this,r=A+o.length+this.break,s=null;return n&&n.from<=A+o.length&&n.more?s=o=o.updateHeight(e,A,i,n):o.updateHeight(e,A,i),n&&n.from<=r+a.length&&n.more?s=a=a.updateHeight(e,r,i,n):a.updateHeight(e,r,i),s?this.balanced(o,a):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function RP(t,e){let A,i;t[e]==null&&(A=t[e-1])instanceof W2&&(i=t[e+1])instanceof W2&&t.splice(e-1,3,new W2(A.length+1+i.length))}var puA=5,hk=class t{constructor(e,A){this.pos=e,this.oracle=A,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,A){if(this.lineStart>-1){let i=Math.min(A,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof Cg?n.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new Cg(i-this.pos,-1,0)),this.writtenTo=i,A>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=A}point(e,A,i){if(e=puA)&&this.addLineDeco(n,o,a)}else A>e&&this.span(e,A);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:A}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=A,this.writtenToe&&this.nodes.push(new Cg(this.pos-e,-1,0)),this.writtenTo=this.pos}blankContent(e,A){let i=new W2(A-e);return this.oracle.doc.lineAt(e).to==A&&(i.flags|=4),i}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof Cg)return e;let A=new Cg(0,-1,0);return this.nodes.push(A),A}addBlock(e){this.enterLine();let A=e.deco;A&&A.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,A&&A.endSide>0&&(this.covering=e)}addLineDeco(e,A,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,e),n.breaks+=A,this.writtenTo=this.pos=this.pos+i}finish(e){let A=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(A instanceof Cg)&&!this.isCovered?this.nodes.push(new Cg(0,-1,0)):(this.writtenTog.clientHeight||g.scrollWidth>g.clientWidth)&&C.overflow!="visible"){let I=g.getBoundingClientRect();o=Math.max(o,I.left),a=Math.min(a,I.right),r=Math.max(r,I.top),s=Math.min(l==t.parentNode?n.innerHeight:s,I.bottom)}l=C.position=="absolute"||C.position=="fixed"?g.offsetParent:g.parentNode}else if(l.nodeType==11)l=l.host;else break;return{left:o-A.left,right:Math.max(o,a)-A.left,top:r-(A.top+e),bottom:Math.max(r,s)-(A.top+e)}}function DuA(t){let e=t.getBoundingClientRect(),A=t.ownerDocument.defaultView||window;return e.left0&&e.top0}function yuA(t,e){let A=t.getBoundingClientRect();return{left:0,right:A.right-A.left,top:e,bottom:A.bottom-(A.top+e)}}var O4=class{constructor(e,A,i,n){this.from=e,this.to=A,this.size=i,this.displaySize=n}static same(e,A){if(e.length!=A.length)return!1;for(let i=0;itypeof n!="function"&&n.class=="cm-lineWrapping");this.heightOracle=new dk(i),this.stateDeco=FP(A),this.heightMap=Rl.empty().applyChanges(this.stateDeco,bn.empty,this.heightOracle.setDoc(A.doc),[new rc(0,0,0,A.doc.length)]);for(let n=0;n<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());n++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=St.set(this.lineGaps.map(n=>n.draw(this,!1))),this.scrollParent=e.scrollDOM,this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:A}=this.state.selection;for(let i=0;i<=1;i++){let n=i?A.head:A.anchor;if(!e.some(({from:o,to:a})=>n>=o&&n<=a)){let{from:o,to:a}=this.lineBlockAt(n);e.push(new JE(o,a))}}return this.viewports=e.sort((i,n)=>i.from-n.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?NP:new fk(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(N4(e,this.scaler))})}update(e,A=null){this.state=e.state;let i=this.stateDeco;this.stateDeco=FP(this.state);let n=e.changedRanges,o=rc.extendWithRanges(n,muA(i,this.stateDeco,e?e.changes:Pr.empty(this.state.doc.length))),a=this.heightMap.height,r=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollOffset);_P(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),o),(this.heightMap.height!=a||WE)&&(e.flags|=2),r?(this.scrollAnchorPos=e.changes.mapPos(r.from,-1),this.scrollAnchorHeight=r.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=a);let s=o.length?this.mapViewport(this.viewport,e.changes):this.viewport;(A&&(A.range.heads.to)||!this.viewportIsAppropriate(s))&&(s=this.getViewport(0,A));let l=s.from!=this.viewport.from||s.to!=this.viewport.to;this.viewport=s,e.flags|=this.updateForViewport(),(l||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),A&&(this.scrollTarget=A),!this.mustEnforceCursorAssoc&&(e.selectionSet||e.focusChanged)&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(hj)&&(this.mustEnforceCursorAssoc=!0)}measure(){let{view:e}=this,A=e.contentDOM,i=window.getComputedStyle(A),n=this.heightOracle,o=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?mo.RTL:mo.LTR;let a=this.heightOracle.mustRefreshForWrapping(o)||this.mustMeasureContent==="refresh",r=A.getBoundingClientRect(),s=a||this.mustMeasureContent||this.contentDOMHeight!=r.height;this.contentDOMHeight=r.height,this.mustMeasureContent=!1;let l=0,g=0;if(r.width&&r.height){let{scaleX:b,scaleY:x}=Aj(A,r);(b>.005&&Math.abs(this.scaleX-b)>.005||x>.005&&Math.abs(this.scaleY-x)>.005)&&(this.scaleX=b,this.scaleY=x,l|=16,a=s=!0)}let C=(parseInt(i.paddingTop)||0)*this.scaleY,I=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=C||this.paddingBottom!=I)&&(this.paddingTop=C,this.paddingBottom=I,l|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(n.lineWrapping&&(s=!0),this.editorWidth=e.scrollDOM.clientWidth,l|=16);let d=ej(this.view.contentDOM,!1).y;d!=this.scrollParent&&(this.scrollParent=d,this.scrollAnchorHeight=-1,this.scrollOffset=0);let h=this.getScrollOffset();this.scrollOffset!=h&&(this.scrollAnchorHeight=-1,this.scrollOffset=h),this.scrolledToBottom=ij(this.scrollParent||e.win);let E=(this.printing?yuA:wuA)(A,this.paddingTop),f=E.top-this.pixelViewport.top,m=E.bottom-this.pixelViewport.bottom;this.pixelViewport=E;let v=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(v!=this.inView&&(this.inView=v,v&&(s=!0)),!this.inView&&!this.scrollTarget&&!DuA(e.dom))return 0;let k=r.width;if((this.contentDOMWidth!=k||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=r.width,this.editorHeight=e.scrollDOM.clientHeight,l|=16),s){let b=e.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(b)&&(a=!0),a||n.lineWrapping&&Math.abs(k-this.contentDOMWidth)>n.charWidth){let{lineHeight:x,charWidth:F,textHeight:z}=e.docView.measureTextSize();a=x>0&&n.refresh(o,x,F,z,Math.max(5,k/F),b),a&&(e.docView.minWidth=0,l|=16)}f>0&&m>0?g=Math.max(f,m):f<0&&m<0&&(g=Math.min(f,m)),_P();for(let x of this.viewports){let F=x.from==this.viewport.from?b:e.docView.measureVisibleLineHeights(x);this.heightMap=(a?Rl.empty().applyChanges(this.stateDeco,bn.empty,this.heightOracle,[new rc(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(n,0,a,new Bk(x.from,F))}WE&&(l|=2)}let S=!this.viewportIsAppropriate(this.viewport,g)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return S&&(l&2&&(l|=this.updateScaler()),this.viewport=this.getViewport(g,this.scrollTarget),l|=this.updateForViewport()),(l&2||S)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(a?[]:this.lineGaps,e)),l|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),l}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,A){let i=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),n=this.heightMap,o=this.heightOracle,{visibleTop:a,visibleBottom:r}=this,s=new JE(n.lineAt(a-i*1e3,oa.ByHeight,o,0,0).from,n.lineAt(r+(1-i)*1e3,oa.ByHeight,o,0,0).to);if(A){let{head:l}=A.range;if(ls.to){let g=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),C=n.lineAt(l,oa.ByPos,o,0,0),I;A.y=="center"?I=(C.top+C.bottom)/2-g/2:A.y=="start"||A.y=="nearest"&&l=r+Math.max(10,Math.min(i,250)))&&n>a-2*1e3&&o>1,a=n<<1;if(this.defaultTextDirection!=mo.LTR&&!i)return[];let r=[],s=(g,C,I,d)=>{if(C-gg&&mm.from>=I.from&&m.to<=I.to&&Math.abs(m.from-g)m.fromv));if(!f){if(Ck.from<=C&&k.to>=C)){let k=A.moveToLineBoundary(Ie.cursor(C),!1,!0).head;k>g&&(C=k)}let m=this.gapSize(I,g,C,d),v=i||m<2e6?m:2e6;f=new O4(g,C,m,v)}r.push(f)},l=g=>{if(g.length2e6)for(let x of e)x.from>=g.from&&x.fromg.from&&s(g.from,d,g,C),hA.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let A=this.stateDeco;this.lineGaps.length&&(A=A.concat(this.lineGapDeco));let i=[];io.spans(A,this.viewport.from,this.viewport.to,{span(o,a){i.push({from:o,to:a})},point(){}},20);let n=0;if(i.length!=this.visibleRanges.length)n=12;else for(let o=0;o=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(A=>A.from<=e&&A.to>=e)||N4(this.heightMap.lineAt(e,oa.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(A=>A.top<=e&&A.bottom>=e)||N4(this.heightMap.lineAt(this.scaler.fromDOM(e),oa.ByHeight,this.heightOracle,0,0),this.scaler)}getScrollOffset(){return(this.scrollParent==this.view.scrollDOM?this.scrollParent.scrollTop:(this.scrollParent?this.scrollParent.getBoundingClientRect().top:0)-this.view.contentDOM.getBoundingClientRect().top)*this.scaleY}scrollAnchorAt(e){let A=this.lineBlockAtHeight(e+8);return A.from>=this.viewport.from||this.viewportLines[0].top-e>200?A:this.viewportLines[0]}elementAtHeight(e){return N4(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},JE=class{constructor(e,A){this.from=e,this.to=A}};function vuA(t,e,A){let i=[],n=t,o=0;return io.spans(A,t,e,{span(){},point(a,r){a>n&&(i.push({from:n,to:a}),o+=a-n),n=r}},20),n=1)return e[e.length-1].to;let i=Math.floor(t*A);for(let n=0;;n++){let{from:o,to:a}=e[n],r=a-o;if(i<=r)return o+i;i-=r}}function rw(t,e){let A=0;for(let{from:i,to:n}of t.ranges){if(e<=n){A+=e-i;break}A+=n-i}return A/t.total}function buA(t,e){for(let A of t)if(e(A))return A}var NP={toDOM(t){return t},fromDOM(t){return t},scale:1,eq(t){return t==this}};function FP(t){let e=t.facet(Lw).filter(i=>typeof i!="function"),A=t.facet(Jk).filter(i=>typeof i!="function");return A.length&&e.push(io.join(A)),e}var fk=class t{constructor(e,A,i){let n=0,o=0,a=0;this.viewports=i.map(({from:r,to:s})=>{let l=A.lineAt(r,oa.ByPos,e,0,0).top,g=A.lineAt(s,oa.ByPos,e,0,0).bottom;return n+=g-l,{from:r,to:s,top:l,bottom:g,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(A.height-n);for(let r of this.viewports)r.domTop=a+(r.top-o)*this.scale,a=r.domBottom=r.domTop+(r.bottom-r.top),o=r.bottom}toDOM(e){for(let A=0,i=0,n=0;;A++){let o=AA.from==e.viewports[i].from&&A.to==e.viewports[i].to):!1}};function N4(t,e){if(e.scale==1)return t;let A=e.toDOM(t.top),i=e.toDOM(t.bottom);return new ac(t.from,t.length,A,i-A,Array.isArray(t._content)?t._content.map(n=>N4(n,e)):t._content)}var sw=At.define({combine:t=>t.join(" ")}),LS=At.define({combine:t=>t.indexOf(!0)>-1}),pk=cg.newName(),Gj=cg.newName(),Kj=cg.newName(),Uj={"&light":"."+Gj,"&dark":"."+Kj};function mk(t,e,A){return new cg(e,{finish(i){return/&/.test(i)?i.replace(/&\w*/,n=>{if(n=="&")return t;if(!A||!A[n])throw new RangeError(`Unsupported selector: ${n}`);return A[n]}):t+" "+i}})}var MuA=mk("."+pk,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-selectionHandle":{backgroundColor:"currentColor",width:"1.5px"},".cm-selectionHandle-start::before, .cm-selectionHandle-end::before":{content:'""',backgroundColor:"inherit",borderRadius:"50%",width:"8px",height:"8px",position:"absolute",left:"-3.25px"},".cm-selectionHandle-start::before":{top:"-8px"},".cm-selectionHandle-end::before":{bottom:"-8px"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Uj),SuA={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},GS=at.ie&&at.ie_version<=11,wk=class{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new jS,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(A=>{for(let i of A)this.queue.push(i);(at.ie&&at.ie_version<=11||at.ios&&e.composing)&&A.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&at.android&&e.constructor.EDIT_CONTEXT!==!1&&!(at.chrome&&at.chrome_version<126)&&(this.editContext=new Dk(e),e.state.facet(EC)&&(e.contentDOM.editContext=this.editContext.editContext)),GS&&(this.onCharData=A=>{this.queue.push({target:A.target,type:"characterData",oldValue:A.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var A;((A=this.view.docView)===null||A===void 0?void 0:A.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),A.length>0&&A[A.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(A=>{A.length>0&&A[A.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((A,i)=>A!=e[i]))){this.gapIntersection.disconnect();for(let A of e)this.gapIntersection.observe(A);this.gaps=e}}onSelectionChange(e){let A=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(EC)?i.root.activeElement!=this.dom:!L4(this.dom,n))return;let o=n.anchorNode&&i.docView.tile.nearest(n.anchorNode);if(o&&o.isWidget()&&o.widget.ignoreEvent(e)){A||(this.selectionChanged=!1);return}(at.ie&&at.ie_version<=11||at.android&&at.chrome)&&!i.state.selection.main.empty&&n.focusNode&&G4(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,A=j4(e.root);if(!A)return!1;let i=at.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&kuA(this.view,A)||A;if(!i||this.selectionRange.eq(i))return!1;let n=L4(this.dom,i);return n&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let o=this.delayedAndroidKey;o&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=o.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&o.force&&zE(this.dom,o.key,o.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||e=="Enter")&&(this.delayedAndroidKey={key:e,keyCode:A,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let A=-1,i=-1,n=!1;for(let o of e){let a=this.readMutation(o);a&&(a.typeOver&&(n=!0),A==-1?{from:A,to:i}=a:(A=Math.min(a.from,A),i=Math.max(a.to,i)))}return{from:A,to:i,typeOver:n}}readChange(){let{from:e,to:A,typeOver:i}=this.processRecords(),n=this.selectionChanged&&L4(this.dom,this.selectionRange);if(e<0&&!n)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let o=new gk(this.view,e,A,i);return this.view.docView.domChanged={newSel:o.newSel?o.newSel.main:null},o}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let A=this.readChange();if(!A)return this.view.requestMeasure(),!1;let i=this.view.state,n=bj(this.view,A);return this.view.state==i&&(A.domChanged||A.newSel&&!yw(this.view.state.selection,A.newSel.main))&&this.view.update([]),n}readMutation(e){let A=this.view.docView.tile.nearest(e.target);if(!A||A.isWidget())return null;if(A.markDirty(e.type=="attributes"),e.type=="childList"){let i=LP(A,e.previousSibling||e.target.previousSibling,-1),n=LP(A,e.nextSibling||e.target.nextSibling,1);return{from:i?A.posAfter(i):A.posAtStart,to:n?A.posBefore(n):A.posAtEnd,typeOver:!1}}else return e.type=="characterData"?{from:A.posAtStart,to:A.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(EC)!=e.state.facet(EC)&&(e.view.contentDOM.editContext=e.state.facet(EC)?this.editContext.editContext:null))}destroy(){var e,A,i;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(A=this.gapIntersection)===null||A===void 0||A.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function LP(t,e,A){for(;e;){let i=wa.get(e);if(i&&i.parent==t)return i;let n=e.parentNode;e=n!=t.dom?n:A>0?e.nextSibling:e.previousSibling}return null}function GP(t,e){let A=e.startContainer,i=e.startOffset,n=e.endContainer,o=e.endOffset,a=t.docView.domAtPos(t.state.selection.main.anchor,1);return G4(a.node,a.offset,n,o)&&([A,i,n,o]=[n,o,A,i]),{anchorNode:A,anchorOffset:i,focusNode:n,focusOffset:o}}function kuA(t,e){if(e.getComposedRanges){let n=e.getComposedRanges(t.root)[0];if(n)return GP(t,n)}let A=null;function i(n){n.preventDefault(),n.stopImmediatePropagation(),A=n.getTargetRanges()[0]}return t.contentDOM.addEventListener("beforeinput",i,!0),t.dom.ownerDocument.execCommand("indent"),t.contentDOM.removeEventListener("beforeinput",i,!0),A?GP(t,A):null}var Dk=class{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let A=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=i=>{let n=e.state.selection.main,{anchor:o,head:a}=n,r=this.toEditorPos(i.updateRangeStart),s=this.toEditorPos(i.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:r,drifted:!1});let l=s-r>i.text.length;r==this.from&&othis.to&&(s=o);let g=Mj(e.state.sliceDoc(r,s),i.text,(l?n.from:n.to)-r,l?"end":null);if(!g){let I=Ie.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));yw(I,n)||e.dispatch({selection:I,userEvent:"select"});return}let C={from:g.from+r,to:g.toA+r,insert:bn.of(i.text.slice(g.from,g.toB).split(` +`))};if((at.mac||at.android)&&C.from==a-1&&/^\. ?$/.test(i.text)&&e.contentDOM.getAttribute("autocorrect")=="off"&&(C={from:r,to:s,insert:bn.of([i.text.replace("."," ")])}),this.pendingContextChange=C,!e.state.readOnly){let I=this.to-this.from+(C.to-C.from+C.insert.length);Yk(e,C,Ie.single(this.toEditorPos(i.selectionStart,I),this.toEditorPos(i.selectionEnd,I)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)),C.from=0&&!/[\\p{Alphabetic}\\p{Number}_]/.test(A.text.slice(Math.max(0,i.updateRangeStart-1),Math.min(A.text.length,i.updateRangeStart+1)))&&this.handlers.compositionend(i)},this.handlers.characterboundsupdate=i=>{let n=[],o=null;for(let a=this.toEditorPos(i.rangeStart),r=this.toEditorPos(i.rangeEnd);a{let n=[];for(let o of i.getTextFormats()){let a=o.underlineStyle,r=o.underlineThickness;if(!/none/i.test(a)&&!/none/i.test(r)){let s=this.toEditorPos(o.rangeStart),l=this.toEditorPos(o.rangeEnd);if(s{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(e.state)}};for(let i in this.handlers)A.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let n=j4(i.root);n&&n.rangeCount&&this.editContext.updateSelectionBounds(n.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let A=0,i=!1,n=this.pendingContextChange;return e.changes.iterChanges((o,a,r,s,l)=>{if(i)return;let g=l.length-(a-o);if(n&&a>=n.to)if(n.from==o&&n.to==a&&n.insert.eq(l)){n=this.pendingContextChange=null,A+=g,this.to+=g;return}else n=null,this.revertPending(e.state);if(o+=A,a+=A,a<=this.from)this.from+=g,this.to+=g;else if(othis.to||this.to-this.from+l.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(o),this.toContextPos(a),l.toString()),this.to+=g}A+=g}),n&&!i&&this.revertPending(e.state),!i}update(e){let A=this.pendingContextChange,i=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(i.from,i.to)&&e.transactions.some(n=>!n.isUserEvent("input.type")&&n.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||A)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:A}=e.selection.main;this.from=Math.max(0,A-1e4),this.to=Math.min(e.doc.length,A+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let A=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(A.from),this.toContextPos(A.from+A.insert.length),e.doc.sliceString(A.from,A.to))}setSelection(e){let{main:A}=e.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,A.anchor))),n=this.toContextPos(A.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=n)&&this.editContext.updateSelection(i,n)}rangeIsValid(e){let{head:A}=e.selection.main;return!(this.from>0&&A-this.from<500||this.to1e4*3)}toEditorPos(e,A=this.to-this.from){e=Math.min(e,A);let i=this.composing;return i&&i.drifted?i.editorBase+(e-i.contextBase):e+this.from}toContextPos(e){let A=this.composing;return A&&A.drifted?A.contextBase+(e-A.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}},ci=(()=>{class t{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(A={}){var i;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),A.parent&&A.parent.appendChild(this.dom);let{dispatch:n}=A;this.dispatchTransactions=A.dispatchTransactions||n&&(o=>o.forEach(a=>n(a,this)))||(o=>this.update(o)),this.dispatch=this.dispatch.bind(this),this._root=A.root||DQA(A.parent)||document,this.viewState=new Mw(this,A.state||qa.create(A)),A.scrollTo&&A.scrollTo.is(iw)&&(this.viewState.scrollTarget=A.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(TE).map(o=>new U4(o));for(let o of this.plugins)o.update(this);this.observer=new wk(this),this.inputState=new ck(this),this.inputState.ensureHandlers(this.plugins),this.docView=new ww(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((i=document.fonts)===null||i===void 0)&&i.ready&&document.fonts.ready.then(()=>{this.viewState.mustMeasureContent="refresh",this.requestMeasure()})}dispatch(...A){let i=A.length==1&&A[0]instanceof I0?A:A.length==1&&Array.isArray(A[0])?A[0]:[this.state.update(...A)];this.dispatchTransactions(i,this)}update(A){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let i=!1,n=!1,o,a=this.state;for(let d of A){if(d.startState!=a)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");a=d.state}if(this.destroyed){this.viewState.state=a;return}let r=this.hasFocus,s=0,l=null;A.some(d=>d.annotation(Nj))?(this.inputState.notifiedFocused=r,s=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,l=Fj(a,r),l||(s=1));let g=this.observer.delayedAndroidKey,C=null;if(g?(this.observer.clearDelayedAndroidKey(),C=this.observer.readChange(),(C&&!this.state.doc.eq(a.doc)||!this.state.selection.eq(a.selection))&&(C=null)):this.observer.clear(),a.facet(qa.phrases)!=this.state.facet(qa.phrases))return this.setState(a);o=pw.create(this,a,A),o.flags|=s;let I=this.viewState.scrollTarget;try{this.updateState=2;for(let d of A){if(I&&(I=I.map(d.changes)),d.scrollIntoView){let{main:h}=d.state.selection;I=new K4(h.empty?h:Ie.cursor(h.head,h.head>h.anchor?-1:1))}for(let h of d.effects)h.is(iw)&&(I=h.value.clip(this.state))}this.viewState.update(o,I),this.bidiCache=Sw.update(this.bidiCache,o.changes),o.empty||(this.updatePlugins(o),this.inputState.update(o)),i=this.docView.update(o),this.state.facet(R4)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(A),this.docView.updateSelection(i,A.some(d=>d.isUserEvent("select.pointer")))}finally{this.updateState=0}if(o.startState.facet(sw)!=o.state.facet(sw)&&(this.viewState.mustMeasureContent=!0),(i||n||I||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),i&&this.docViewUpdate(),!o.empty)for(let d of this.state.facet(_S))try{d(o)}catch(h){Sr(this.state,h,"update listener")}(l||C)&&Promise.resolve().then(()=>{l&&this.state==l.startState&&this.dispatch(l),C&&!bj(this,C)&&g.force&&zE(this.contentDOM,g.key,g.keyCode)})}setState(A){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=A;return}this.updateState=2;let i=this.hasFocus;try{for(let n of this.plugins)n.destroy(this);this.viewState=new Mw(this,A),this.plugins=A.facet(TE).map(n=>new U4(n)),this.pluginMap.clear();for(let n of this.plugins)n.update(this);this.docView.destroy(),this.docView=new ww(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}i&&this.focus(),this.requestMeasure()}updatePlugins(A){let i=A.startState.facet(TE),n=A.state.facet(TE);if(i!=n){let o=[];for(let a of n){let r=i.indexOf(a);if(r<0)o.push(new U4(a));else{let s=this.plugins[r];s.mustUpdate=A,o.push(s)}}for(let a of this.plugins)a.mustUpdate!=A&&a.destroy(this);this.plugins=o,this.pluginMap.clear()}else for(let o of this.plugins)o.mustUpdate=A;for(let o=0;o-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,A&&this.observer.forceFlush();let i=null,n=this.viewState.scrollParent,o=this.viewState.getScrollOffset(),{scrollAnchorPos:a,scrollAnchorHeight:r}=this.viewState;Math.abs(o-this.viewState.scrollOffset)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let s=0;;s++){if(r<0)if(ij(n||this.win))a=-1,r=this.viewState.heightMap.height;else{let h=this.viewState.scrollAnchorAt(o);a=h.from,r=h.top}this.updateState=1;let l=this.viewState.measure();if(!l&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(s>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let g=[];l&4||([this.measureRequests,g]=[g,this.measureRequests]);let C=g.map(h=>{try{return h.read(this)}catch(E){return Sr(this.state,E),KP}}),I=pw.create(this,this.state,[]),d=!1;I.flags|=l,i?i.flags|=l:i=I,this.updateState=2,I.empty||(this.updatePlugins(I),this.inputState.update(I),this.updateAttrs(),d=this.docView.update(I),d&&this.docViewUpdate());for(let h=0;h1||E<-1)&&(n==this.scrollDOM||this.hasFocus||Math.max(this.inputState.lastWheelEvent,this.inputState.lastTouchTime)>Date.now()-100)){o=o+E,n?n.scrollTop+=E:this.win.scrollBy(0,E),r=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(i&&!i.empty)for(let s of this.state.facet(_S))s(i)}get themeClasses(){return pk+" "+(this.state.facet(LS)?Kj:Gj)+" "+this.state.facet(sw)}updateAttrs(){let A=UP(this,QP,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),i={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(EC)?"true":"false",class:"cm-content",style:`${at.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(i["aria-readonly"]="true"),UP(this,ZS,i);let n=this.observer.ignore(()=>{let o=dP(this.contentDOM,this.contentAttrs,i),a=dP(this.dom,this.editorAttrs,A);return o||a});return this.editorAttrs=A,this.contentAttrs=i,n}showAnnouncements(A){let i=!0;for(let n of A)for(let o of n.effects)if(o.is(t.announce)){i&&(this.announceDOM.textContent=""),i=!1;let a=this.announceDOM.appendChild(document.createElement("div"));a.textContent=o.value}}mountStyles(){this.styleModules=this.state.facet(R4);let A=this.state.facet(t.cspNonce);cg.mount(this.root,this.styleModules.concat(MuA).reverse(),A?{nonce:A}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(A){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),A){if(this.measureRequests.indexOf(A)>-1)return;if(A.key!=null){for(let i=0;in.plugin==A)||null),i&&i.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(A){return this.readMeasured(),this.viewState.elementAtHeight(A)}lineBlockAtHeight(A){return this.readMeasured(),this.viewState.lineBlockAtHeight(A)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(A){return this.viewState.lineBlockAt(A)}get contentHeight(){return this.viewState.contentHeight}moveByChar(A,i,n){return FS(this,A,wP(this,A,i,n))}moveByGroup(A,i){return FS(this,A,wP(this,A,i,n=>$QA(this,A.head,n)))}visualLineSide(A,i){let n=this.bidiSpans(A),o=this.textDirectionAt(A.from),a=n[i?n.length-1:0];return Ie.cursor(a.side(i,o)+A.from,a.forward(!i,o)?1:-1)}moveToLineBoundary(A,i,n=!0){return XQA(this,A,i,n)}moveVertically(A,i,n){return FS(this,A,AuA(this,A,i,n))}domAtPos(A,i=1){return this.docView.domAtPos(A,i)}posAtDOM(A,i=0){return this.docView.posFromDOM(A,i)}posAtCoords(A,i=!0){this.readMeasured();let n=rk(this,A,i);return n&&n.pos}posAndSideAtCoords(A,i=!0){return this.readMeasured(),rk(this,A,i)}coordsAtPos(A,i=1){this.readMeasured();let n=this.docView.coordsAt(A,i);if(!n||n.left==n.right)return n;let o=this.state.doc.lineAt(A),a=this.bidiSpans(o),r=a[dg.find(a,A-o.from,-1,i)];return fw(n,r.dir==mo.LTR==i>0)}coordsForChar(A){return this.readMeasured(),this.docView.coordsForChar(A)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(A){return!this.state.facet(hP)||Athis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(A))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(A){if(A.length>xuA)return lj(A.length);let i=this.textDirectionAt(A.from),n;for(let a of this.bidiCache)if(a.from==A.from&&a.dir==i&&(a.fresh||sj(a.isolates,n=uP(this,A))))return a.order;n||(n=uP(this,A));let o=_QA(A.text,i,n);return this.bidiCache.push(new Sw(A.from,A.to,i,n,!0,o)),o}get hasFocus(){var A;return(this.dom.ownerDocument.hasFocus()||at.safari&&((A=this.inputState)===null||A===void 0?void 0:A.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{tj(this.contentDOM),this.docView.updateSelection()})}setRoot(A){this._root!=A&&(this._root=A,this.observer.setWindow((A.nodeType==9?A:A.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let A of this.plugins)A.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(A,i={}){return iw.of(new K4(typeof A=="number"?Ie.cursor(A):A,i.y,i.x,i.yMargin,i.xMargin))}scrollSnapshot(){let{scrollTop:A,scrollLeft:i}=this.scrollDOM,n=this.viewState.scrollAnchorAt(A);return iw.of(new K4(Ie.cursor(n.from),"start","start",n.top-A,i,!0))}setTabFocusMode(A){A==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof A=="boolean"?this.inputState.tabFocusMode=A?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+A)}static domEventHandlers(A){return _o.define(()=>({}),{eventHandlers:A})}static domEventObservers(A){return _o.define(()=>({}),{eventObservers:A})}static theme(A,i){let n=cg.newName(),o=[sw.of(n),R4.of(mk(`.${n}`,A))];return i&&i.dark&&o.push(LS.of(!0)),o}static baseTheme(A){return oc.lowest(R4.of(mk("."+pk,A,Uj)))}static findFromDOM(A){var i;let n=A.querySelector(".cm-content"),o=n&&wa.get(n)||wa.get(A);return((i=o?.root)===null||i===void 0?void 0:i.view)||null}}return t.styleModule=R4,t.inputHandler=Bj,t.clipboardInputFilter=Uk,t.clipboardOutputFilter=Tk,t.scrollHandler=Qj,t.focusChangeEffect=Ej,t.perLineTextDirection=hP,t.exceptionSink=dj,t.updateListener=_S,t.editable=EC,t.mouseSelectionStyle=Ij,t.dragMovesSelection=Cj,t.clickAddsSelectionRange=cj,t.decorations=Lw,t.blockWrappers=fj,t.outerDecorations=Jk,t.atomicRanges=V4,t.bidiIsolatedRanges=pj,t.scrollMargins=mj,t.darkTheme=LS,t.cspNonce=At.define({combine:e=>e.length?e[0]:""}),t.contentAttributes=ZS,t.editorAttributes=QP,t.lineWrapping=t.contentAttributes.of({class:"cm-lineWrapping"}),t.announce=Wi.define(),t})(),xuA=4096,KP={},Sw=class t{constructor(e,A,i,n,o,a){this.from=e,this.to=A,this.dir=i,this.isolates=n,this.fresh=o,this.order=a}static update(e,A){if(A.empty&&!e.some(o=>o.fresh))return e;let i=[],n=e.length?e[e.length-1].dir:mo.LTR;for(let o=Math.max(0,e.length-10);o=0;n--){let o=i[n],a=typeof o=="function"?o(t):o;a&&Lk(a,A)}return A}var _uA=at.mac?"mac":at.windows?"win":at.linux?"linux":"key";function RuA(t,e){let A=t.split(/-(?!$)/),i=A[A.length-1];i=="Space"&&(i=" ");let n,o,a,r;for(let s=0;si.concat(n),[]))),A}function Jj(t,e,A){return Oj(Tj(t.state),e,t,A)}var V2=null,FuA=4e3;function LuA(t,e=_uA){let A=Object.create(null),i=Object.create(null),n=(a,r)=>{let s=i[a];if(s==null)i[a]=r;else if(s!=r)throw new Error("Key binding "+a+" is used both as a regular binding and as a multi-stroke prefix")},o=(a,r,s,l,g)=>{var C,I;let d=A[a]||(A[a]=Object.create(null)),h=r.split(/ (?!$)/).map(m=>RuA(m,e));for(let m=1;m{let S=V2={view:k,prefix:v,scope:a};return setTimeout(()=>{V2==S&&(V2=null)},FuA),!0}]})}let E=h.join(" ");n(E,!1);let f=d[E]||(d[E]={preventDefault:!1,stopPropagation:!1,run:((I=(C=d._any)===null||C===void 0?void 0:C.run)===null||I===void 0?void 0:I.slice())||[]});s&&f.run.push(s),l&&(f.preventDefault=!0),g&&(f.stopPropagation=!0)};for(let a of t){let r=a.scope?a.scope.split(" "):["editor"];if(a.any)for(let l of r){let g=A[l]||(A[l]=Object.create(null));g._any||(g._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:C}=a;for(let I in g)g[I].run.push(d=>C(d,yk))}let s=a[e]||a.key;if(s)for(let l of r)o(l,s,a.run,a.preventDefault,a.stopPropagation),a.shift&&o(l,"Shift-"+s,a.shift,a.preventDefault,a.stopPropagation)}return A}var yk=null;function Oj(t,e,A,i){yk=e;let n=lP(e),o=qr(n,0),a=_l(o)==n.length&&n!=" ",r="",s=!1,l=!1,g=!1;V2&&V2.view==A&&V2.scope==i&&(r=V2.prefix+" ",kj.indexOf(e.keyCode)<0&&(l=!0,V2=null));let C=new Set,I=f=>{if(f){for(let m of f.run)if(!C.has(m)&&(C.add(m),m(A)))return f.stopPropagation&&(g=!0),!0;f.preventDefault&&(f.stopPropagation&&(g=!0),l=!0)}return!1},d=t[i],h,E;return d&&(I(d[r+lw(n,e,!a)])?s=!0:a&&(e.altKey||e.metaKey||e.ctrlKey)&&!(at.windows&&e.ctrlKey&&e.altKey)&&!(at.mac&&e.altKey&&!(e.ctrlKey||e.metaKey))&&(h=BC[e.keyCode])&&h!=n?(I(d[r+lw(h,e,!0)])||e.shiftKey&&(E=KE[e.keyCode])!=n&&E!=h&&I(d[r+lw(E,e,!1)]))&&(s=!0):a&&e.shiftKey&&I(d[r+lw(n,e,!0)])&&(s=!0),!s&&I(d._any)&&(s=!0)),l&&(s=!0),s&&g&&e.stopPropagation(),yk=null,s}var H1=class t{constructor(e,A,i,n,o){this.className=e,this.left=A,this.top=i,this.width=n,this.height=o}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,A){return A.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.width!=null&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,A,i){if(i.empty){let n=e.coordsAtPos(i.head,i.assoc||1);if(!n)return[];let o=Yj(e);return[new t(A,n.left-o.left,n.top-o.top,null,n.bottom-n.top)]}else return GuA(e,A,i)}};function Yj(t){let e=t.scrollDOM.getBoundingClientRect();return{left:(t.textDirection==mo.LTR?e.left:e.right-t.scrollDOM.clientWidth*t.scaleX)-t.scrollDOM.scrollLeft*t.scaleX,top:e.top-t.scrollDOM.scrollTop*t.scaleY}}function JP(t,e,A,i){let n=t.coordsAtPos(e,A*2);if(!n)return i;let o=t.dom.getBoundingClientRect(),a=(n.top+n.bottom)/2,r=t.posAtCoords({x:o.left+1,y:a}),s=t.posAtCoords({x:o.right-1,y:a});return r==null||s==null?i:{from:Math.max(i.from,Math.min(r,s)),to:Math.min(i.to,Math.max(r,s))}}function GuA(t,e,A){if(A.to<=t.viewport.from||A.from>=t.viewport.to)return[];let i=Math.max(A.from,t.viewport.from),n=Math.min(A.to,t.viewport.to),o=t.textDirection==mo.LTR,a=t.contentDOM,r=a.getBoundingClientRect(),s=Yj(t),l=a.querySelector(".cm-line"),g=l&&window.getComputedStyle(l),C=r.left+(g?parseInt(g.paddingLeft)+Math.min(0,parseInt(g.textIndent)):0),I=r.right-(g?parseInt(g.paddingRight):0),d=ak(t,i,1),h=ak(t,n,-1),E=d.type==Vr.Text?d:null,f=h.type==Vr.Text?h:null;if(E&&(t.lineWrapping||d.widgetLineBreaks)&&(E=JP(t,i,1,E)),f&&(t.lineWrapping||h.widgetLineBreaks)&&(f=JP(t,n,-1,f)),E&&f&&E.from==f.from&&E.to==f.to)return v(k(A.from,A.to,E));{let b=E?k(A.from,null,E):S(d,!1),x=f?k(null,A.to,f):S(h,!0),F=[];return(E||d).to<(f||h).from-(E&&f?1:0)||d.widgetLineBreaks>1&&b.bottom+t.defaultLineHeight/2W&&X.from=AA)break;uA>iA&&tA(Math.max(rA,iA),b==null&&rA<=W,Math.min(uA,AA),x==null&&uA>=BA,aA.dir)}if(iA=IA.to+1,iA>=AA)break}return Z.length==0&&tA(W,b==null,BA,x==null,t.textDirection),{top:z,bottom:P,horizontal:Z}}function S(b,x){let F=r.top+(x?b.top:b.bottom);return{top:F,bottom:F,horizontal:[]}}}function KuA(t,e){return t.constructor==e.constructor&&t.eq(e)}var vk=class{constructor(e,A){this.view=e,this.layer=A,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),A.above&&this.dom.classList.add("cm-layer-above"),A.class&&this.dom.classList.add(A.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),A.mount&&A.mount(this.dom,e)}update(e){e.startState.facet(dw)!=e.state.facet(dw)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let A=0,i=e.facet(dw);for(;A!KuA(A,this.drawn[i]))){let A=this.dom.firstChild,i=0;for(let n of e)n.update&&A&&n.constructor&&this.drawn[i].constructor&&n.update(A,this.drawn[i])?(A=A.nextSibling,i++):this.dom.insertBefore(n.draw(),A);for(;A;){let n=A.nextSibling;A.remove(),A=n}this.drawn=e,at.safari&&at.safari_version>=26&&(this.dom.style.display=this.dom.firstChild?"":"none")}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}},dw=At.define();function Hj(t){return[_o.define(e=>new vk(e,t)),dw.of(t)]}var ZE=At.define({combine(t){return Mr(t,{cursorBlinkRate:1200,drawRangeCursor:!0,iosSelectionHandles:!0},{cursorBlinkRate:(e,A)=>Math.min(e,A),drawRangeCursor:(e,A)=>e||A})}});function zj(t={}){return[ZE.of(t),UuA,TuA,JuA,hj.of(!0)]}function Pj(t){return t.startState.facet(ZE)!=t.state.facet(ZE)}var UuA=Hj({above:!0,markers(t){let{state:e}=t,A=e.facet(ZE),i=[];for(let n of e.selection.ranges){let o=n==e.selection.main;if(n.empty||A.drawRangeCursor&&!(o&&at.ios&&A.iosSelectionHandles)){let a=o?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",r=n.empty?n:Ie.cursor(n.head,n.assoc);for(let s of H1.forRange(t,a,r))i.push(s)}}return i},update(t,e){t.transactions.some(i=>i.selection)&&(e.style.animationName=e.style.animationName=="cm-blink"?"cm-blink2":"cm-blink");let A=Pj(t);return A&&OP(t.state,e),t.docChanged||t.selectionSet||A},mount(t,e){OP(e.state,t)},class:"cm-cursorLayer"});function OP(t,e){e.style.animationDuration=t.facet(ZE).cursorBlinkRate+"ms"}var TuA=Hj({above:!1,markers(t){let e=[],{main:A,ranges:i}=t.state.selection;for(let n of i)if(!n.empty)for(let o of H1.forRange(t,"cm-selectionBackground",n))e.push(o);if(at.ios&&!A.empty&&t.state.facet(ZE).iosSelectionHandles){for(let n of H1.forRange(t,"cm-selectionHandle cm-selectionHandle-start",Ie.cursor(A.from,1)))e.push(n);for(let n of H1.forRange(t,"cm-selectionHandle cm-selectionHandle-end",Ie.cursor(A.to,1)))e.push(n)}return e},update(t,e){return t.docChanged||t.selectionSet||t.viewportChanged||Pj(t)},class:"cm-selectionLayer"}),JuA=oc.highest(ci.theme({".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"},caretColor:"transparent !important"},".cm-content":{caretColor:"transparent !important","& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}})),jj=Wi.define({map(t,e){return t==null?null:e.mapPos(t)}}),F4=Ma.define({create(){return null},update(t,e){return t!=null&&(t=e.changes.mapPos(t)),e.effects.reduce((A,i)=>i.is(jj)?i.value:A,t)}}),OuA=_o.fromClass(class{constructor(t){this.view=t,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(t){var e;let A=t.state.field(F4);A==null?this.cursor!=null&&((e=this.cursor)===null||e===void 0||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(t.startState.field(F4)!=A||t.docChanged||t.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:t}=this,e=t.state.field(F4),A=e!=null&&t.coordsAtPos(e);if(!A)return null;let i=t.scrollDOM.getBoundingClientRect();return{left:A.left-i.left+t.scrollDOM.scrollLeft*t.scaleX,top:A.top-i.top+t.scrollDOM.scrollTop*t.scaleY,height:A.bottom-A.top}}drawCursor(t){if(this.cursor){let{scaleX:e,scaleY:A}=this.view;t?(this.cursor.style.left=t.left/e+"px",this.cursor.style.top=t.top/A+"px",this.cursor.style.height=t.height/A+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(t){this.view.state.field(F4)!=t&&this.view.dispatch({effects:jj.of(t)})}},{eventObservers:{dragover(t){this.setDropPos(this.view.posAtCoords({x:t.clientX,y:t.clientY}))},dragleave(t){(t.target==this.view.contentDOM||!this.view.contentDOM.contains(t.relatedTarget))&&this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function qj(){return[F4,OuA]}function YP(t,e,A,i,n){e.lastIndex=0;for(let o=t.iterRange(A,i),a=A,r;!o.next().done;a+=o.value.length)if(!o.lineBreak)for(;r=e.exec(o.value);)n(a+r.index,r)}function YuA(t,e){let A=t.visibleRanges;if(A.length==1&&A[0].from==t.viewport.from&&A[0].to==t.viewport.to)return A;let i=[];for(let{from:n,to:o}of A)n=Math.max(t.state.doc.lineAt(n).from,n-e),o=Math.min(t.state.doc.lineAt(o).to,o+e),i.length&&i[i.length-1].to>=n?i[i.length-1].to=o:i.push({from:n,to:o});return i}var bk=class{constructor(e){let{regexp:A,decoration:i,decorate:n,boundary:o,maxLength:a=1e3}=e;if(!A.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=A,n)this.addMatch=(r,s,l,g)=>n(g,l,l+r[0].length,r,s);else if(typeof i=="function")this.addMatch=(r,s,l,g)=>{let C=i(r,s,l);C&&g(l,l+r[0].length,C)};else if(i)this.addMatch=(r,s,l,g)=>g(l,l+r[0].length,i);else throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.boundary=o,this.maxLength=a}createDeco(e){let A=new jr,i=A.add.bind(A);for(let{from:n,to:o}of YuA(e,this.maxLength))YP(e.state.doc,this.regexp,n,o,(a,r)=>this.addMatch(r,e,a,i));return A.finish()}updateDeco(e,A){let i=1e9,n=-1;return e.docChanged&&e.changes.iterChanges((o,a,r,s)=>{s>=e.view.viewport.from&&r<=e.view.viewport.to&&(i=Math.min(r,i),n=Math.max(s,n))}),e.viewportMoved||n-i>1e3?this.createDeco(e.view):n>-1?this.updateRange(e.view,A.map(e.changes),i,n):A}updateRange(e,A,i,n){for(let o of e.visibleRanges){let a=Math.max(o.from,i),r=Math.min(o.to,n);if(r>=a){let s=e.state.doc.lineAt(a),l=s.tos.from;a--)if(this.boundary.test(s.text[a-1-s.from])){g=a;break}for(;rI.push(m.range(E,f));if(s==l)for(this.regexp.lastIndex=g-s.from;(d=this.regexp.exec(s.text))&&d.indexthis.addMatch(f,e,E,h));A=A.update({filterFrom:g,filterTo:C,filter:(E,f)=>EC,add:I})}}return A}},Mk=/x/.unicode!=null?"gu":"g",HuA=new RegExp(`[\0-\b +-\x7F-\x9F\xAD\u061C\u200B\u200E\u200F\u2028\u2029\u202D\u202E\u2066\u2067\u2069\uFEFF\uFFF9-\uFFFC]`,Mk),zuA={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"},KS=null;function PuA(){var t;if(KS==null&&typeof document<"u"&&document.body){let e=document.body.style;KS=((t=e.tabSize)!==null&&t!==void 0?t:e.MozTabSize)!=null}return KS||!1}var Bw=At.define({combine(t){let e=Mr(t,{render:null,specialChars:HuA,addSpecialChars:null});return(e.replaceTabs=!PuA())&&(e.specialChars=new RegExp(" |"+e.specialChars.source,Mk)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,Mk)),e}});function Vj(t={}){return[Bw.of(t),juA()]}var HP=null;function juA(){return HP||(HP=_o.fromClass(class{constructor(t){this.view=t,this.decorations=St.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(t.state.facet(Bw)),this.decorations=this.decorator.createDeco(t)}makeDecorator(t){return new bk({regexp:t.specialChars,decoration:(e,A,i)=>{let{doc:n}=A.state,o=qr(e[0],0);if(o==9){let a=n.lineAt(i),r=A.state.tabSize,s=dC(a.text,r,i-a.from);return St.replace({widget:new kk((r-s%r)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[o]||(this.decorationCache[o]=St.replace({widget:new Sk(t,o)}))},boundary:t.replaceTabs?void 0:/[^]/})}update(t){let e=t.state.facet(Bw);t.startState.facet(Bw)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(t.view)):this.decorations=this.decorator.updateDeco(t,this.decorations)}},{decorations:t=>t.decorations}))}var quA="\u2022";function VuA(t){return t>=32?quA:t==10?"\u2424":String.fromCharCode(9216+t)}var Sk=class extends sl{constructor(e,A){super(),this.options=e,this.code=A}eq(e){return e.code==this.code}toDOM(e){let A=VuA(this.code),i=e.state.phrase("Control character")+" "+(zuA[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,i,A);if(n)return n;let o=document.createElement("span");return o.textContent=A,o.title=i,o.setAttribute("aria-label",i),o.className="cm-specialChar",o}ignoreEvent(){return!1}},kk=class extends sl{constructor(e){super(),this.width=e}eq(e){return e.width==this.width}toDOM(){let e=document.createElement("span");return e.textContent=" ",e.className="cm-tab",e.style.width=this.width+"px",e}ignoreEvent(){return!1}};function Wj(){return ZuA}var WuA=St.line({class:"cm-activeLine"}),ZuA=_o.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.docChanged||t.selectionSet)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=-1,A=[];for(let i of t.state.selection.ranges){let n=t.lineBlockAt(i.head);n.from>e&&(A.push(WuA.range(n.from)),e=n.from)}return St.set(A)}},{decorations:t=>t.decorations});var xk=2e3;function XuA(t,e,A){let i=Math.min(e.line,A.line),n=Math.max(e.line,A.line),o=[];if(e.off>xk||A.off>xk||e.col<0||A.col<0){let a=Math.min(e.off,A.off),r=Math.max(e.off,A.off);for(let s=i;s<=n;s++){let l=t.doc.line(s);l.length<=r&&o.push(Ie.range(l.from+a,l.to+r))}}else{let a=Math.min(e.col,A.col),r=Math.max(e.col,A.col);for(let s=i;s<=n;s++){let l=t.doc.line(s),g=ew(l.text,a,t.tabSize,!0);if(g<0)o.push(Ie.cursor(l.to));else{let C=ew(l.text,r,t.tabSize);o.push(Ie.range(l.from+g,l.from+C))}}}return o}function $uA(t,e){let A=t.coordsAtPos(t.viewport.from);return A?Math.round(Math.abs((A.left-e)/t.defaultCharacterWidth)):-1}function zP(t,e){let A=t.posAtCoords({x:e.clientX,y:e.clientY},!1),i=t.state.doc.lineAt(A),n=A-i.from,o=n>xk?-1:n==i.length?$uA(t,e.clientX):dC(i.text,t.state.tabSize,A-i.from);return{line:i.number,col:o,off:n}}function A4A(t,e){let A=zP(t,e),i=t.state.selection;return A?{update(n){if(n.docChanged){let o=n.changes.mapPos(n.startState.doc.line(A.line).from),a=n.state.doc.lineAt(o);A={line:a.number,col:A.col,off:Math.min(A.off,a.length)},i=i.map(n.changes)}},get(n,o,a){let r=zP(t,n);if(!r)return i;let s=XuA(t.state,A,r);return s.length?a?Ie.create(s.concat(i.ranges)):Ie.create(s):i}}:null}function Zj(t){let e=t?.eventFilter||(A=>A.altKey&&A.button==0);return ci.mouseSelectionStyle.of((A,i)=>e(i)?A4A(A,i):null)}var e4A={Alt:[18,t=>!!t.altKey],Control:[17,t=>!!t.ctrlKey],Shift:[16,t=>!!t.shiftKey],Meta:[91,t=>!!t.metaKey]},t4A={style:"cursor: crosshair"};function Xj(t={}){let[e,A]=e4A[t.key||"Alt"],i=_o.fromClass(class{constructor(n){this.view=n,this.isDown=!1}set(n){this.isDown!=n&&(this.isDown=n,this.view.update([]))}},{eventObservers:{keydown(n){this.set(n.keyCode==e||A(n))},keyup(n){(n.keyCode==e||!A(n))&&this.set(!1)},mousemove(n){this.set(A(n))}}});return[i,ci.contentAttributes.of(n=>{var o;return!((o=n.plugin(i))===null||o===void 0)&&o.isDown?t4A:null})]}var gw="-10000px",kw=class{constructor(e,A,i,n){this.facet=A,this.createTooltipView=i,this.removeTooltipView=n,this.input=e.state.facet(A),this.tooltips=this.input.filter(a=>a);let o=null;this.tooltipViews=this.tooltips.map(a=>o=i(a,o))}update(e,A){var i;let n=e.state.facet(this.facet),o=n.filter(s=>s);if(n===this.input){for(let s of this.tooltipViews)s.update&&s.update(e);return!1}let a=[],r=A?[]:null;for(let s=0;sA[l]=s),A.length=r.length),this.input=n,this.tooltips=o,this.tooltipViews=a,!0}};function i4A(t){let e=t.dom.ownerDocument.documentElement;return{top:0,left:0,bottom:e.clientHeight,right:e.clientWidth}}var US=At.define({combine:t=>{var e,A,i;return{position:at.ios?"absolute":((e=t.find(n=>n.position))===null||e===void 0?void 0:e.position)||"fixed",parent:((A=t.find(n=>n.parent))===null||A===void 0?void 0:A.parent)||null,tooltipSpace:((i=t.find(n=>n.tooltipSpace))===null||i===void 0?void 0:i.tooltipSpace)||i4A}}}),PP=new WeakMap,Hk=_o.fromClass(class{constructor(t){this.view=t,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=t.state.facet(US);this.position=e.position,this.parent=e.parent,this.classes=t.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new kw(t,$E,(A,i)=>this.createTooltip(A,i),A=>{this.resizeObserver&&this.resizeObserver.unobserve(A.dom),A.dom.remove()}),this.above=this.manager.tooltips.map(A=>!!A.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(A=>{Date.now()>this.lastTransaction-50&&A.length>0&&A[A.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),t.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let t of this.manager.tooltipViews)this.intersectionObserver.observe(t.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(t){t.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(t,this.above);e&&this.observeIntersection();let A=e||t.geometryChanged,i=t.state.facet(US);if(i.position!=this.position&&!this.madeAbsolute){this.position=i.position;for(let n of this.manager.tooltipViews)n.dom.style.position=this.position;A=!0}if(i.parent!=this.parent){this.parent&&this.container.remove(),this.parent=i.parent,this.createContainer();for(let n of this.manager.tooltipViews)this.container.appendChild(n.dom);A=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);A&&this.maybeMeasure()}createTooltip(t,e){let A=t.create(this.view),i=e?e.dom:null;if(A.dom.classList.add("cm-tooltip"),t.arrow&&!A.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let n=document.createElement("div");n.className="cm-tooltip-arrow",A.dom.appendChild(n)}return A.dom.style.position=this.position,A.dom.style.top=gw,A.dom.style.left="0px",this.container.insertBefore(A.dom,i),A.mount&&A.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(A.dom),A}destroy(){var t,e,A;this.view.win.removeEventListener("resize",this.measureSoon);for(let i of this.manager.tooltipViews)i.dom.remove(),(t=i.destroy)===null||t===void 0||t.call(i);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(A=this.intersectionObserver)===null||A===void 0||A.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let t=1,e=1,A=!1;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:o}=this.manager.tooltipViews[0];if(at.safari){let a=o.getBoundingClientRect();A=Math.abs(a.top+1e4)>1||Math.abs(a.left)>1}else A=!!o.offsetParent&&o.offsetParent!=this.container.ownerDocument.body}if(A||this.position=="absolute")if(this.parent){let o=this.parent.getBoundingClientRect();o.width&&o.height&&(t=o.width/this.parent.offsetWidth,e=o.height/this.parent.offsetHeight)}else({scaleX:t,scaleY:e}=this.view.viewState);let i=this.view.scrollDOM.getBoundingClientRect(),n=Ok(this.view);return{visible:{left:i.left+n.left,top:i.top+n.top,right:i.right-n.right,bottom:i.bottom-n.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((o,a)=>{let r=this.manager.tooltipViews[a];return r.getCoords?r.getCoords(o.pos):this.view.coordsAtPos(o.pos)}),size:this.manager.tooltipViews.map(({dom:o})=>o.getBoundingClientRect()),space:this.view.state.facet(US).tooltipSpace(this.view),scaleX:t,scaleY:e,makeAbsolute:A}}writeMeasure(t){var e;if(t.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let r of this.manager.tooltipViews)r.dom.style.position="absolute"}let{visible:A,space:i,scaleX:n,scaleY:o}=t,a=[];for(let r=0;r=Math.min(A.bottom,i.bottom)||C.rightMath.min(A.right,i.right)+.1)){g.style.top=gw;continue}let d=s.arrow?l.dom.querySelector(".cm-tooltip-arrow"):null,h=d?7:0,E=I.right-I.left,f=(e=PP.get(l))!==null&&e!==void 0?e:I.bottom-I.top,m=l.offset||o4A,v=this.view.textDirection==mo.LTR,k=I.width>i.right-i.left?v?i.left:i.right-I.width:v?Math.max(i.left,Math.min(C.left-(d?14:0)+m.x,i.right-E)):Math.min(Math.max(i.left,C.left-E+(d?14:0)-m.x),i.right-E),S=this.above[r];!s.strictSide&&(S?C.top-f-h-m.yi.bottom)&&S==i.bottom-C.bottom>C.top-i.top&&(S=this.above[r]=!S);let b=(S?C.top-i.top:i.bottom-C.bottom)-h;if(bk&&z.topx&&(x=S?z.top-f-2-h:z.bottom+h+2);if(this.position=="absolute"?(g.style.top=(x-t.parent.top)/o+"px",jP(g,(k-t.parent.left)/n)):(g.style.top=x/o+"px",jP(g,k/n)),d){let z=C.left+(v?m.x:-m.x)-(k+14-7);d.style.left=z/n+"px"}l.overlap!==!0&&a.push({left:k,top:x,right:F,bottom:x+f}),g.classList.toggle("cm-tooltip-above",S),g.classList.toggle("cm-tooltip-below",!S),l.positioned&&l.positioned(t.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let t of this.manager.tooltipViews)t.dom.style.top=gw}},{eventObservers:{scroll(){this.maybeMeasure()}}});function jP(t,e){let A=parseInt(t.style.left,10);(isNaN(A)||Math.abs(e-A)>1)&&(t.style.left=e+"px")}var n4A=ci.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),o4A={x:0,y:0},$E=At.define({enables:[Hk,n4A]}),xw=At.define({combine:t=>t.reduce((e,A)=>e.concat(A),[])}),_w=class t{static create(e){return new t(e)}constructor(e){this.view=e,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new kw(e,xw,(A,i)=>this.createHostedView(A,i),A=>A.dom.remove())}createHostedView(e,A){let i=e.create(this.view);return i.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(i.dom,A?A.dom.nextSibling:this.dom.firstChild),this.mounted&&i.mount&&i.mount(this.view),i}mount(e){for(let A of this.manager.tooltipViews)A.mount&&A.mount(e);this.mounted=!0}positioned(e){for(let A of this.manager.tooltipViews)A.positioned&&A.positioned(e)}update(e){this.manager.update(e)}destroy(){var e;for(let A of this.manager.tooltipViews)(e=A.destroy)===null||e===void 0||e.call(A)}passProp(e){let A;for(let i of this.manager.tooltipViews){let n=i[e];if(n!==void 0){if(A===void 0)A=n;else if(A!==n)return}}return A}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}},a4A=$E.compute([xw],t=>{let e=t.facet(xw);return e.length===0?null:{pos:Math.min(...e.map(A=>A.pos)),end:Math.max(...e.map(A=>{var i;return(i=A.end)!==null&&i!==void 0?i:A.pos})),create:_w.create,above:e[0].above,arrow:e.some(A=>A.arrow)}}),_k=class{constructor(e,A,i,n,o){this.view=e,this.source=A,this.field=i,this.setHover=n,this.hoverTime=o,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:e.dom,time:0},this.checkHover=this.checkHover.bind(this),e.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),e.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout(()=>this.startHover(),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let e=Date.now()-this.lastMove.time;er.bottom||A.xr.right+e.defaultCharacterWidth)return;let s=e.bidiSpans(e.state.doc.lineAt(n)).find(g=>g.from<=n&&g.to>=n),l=s&&s.dir==mo.RTL?-1:1;o=A.x{this.pending==r&&(this.pending=null,s&&!(Array.isArray(s)&&!s.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(s)?s:[s])}))},s=>Sr(e.state,s,"hover tooltip"))}else a&&!(Array.isArray(a)&&!a.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(a)?a:[a])})}get tooltip(){let e=this.view.plugin(Hk),A=e?e.manager.tooltips.findIndex(i=>i.create==_w.create):-1;return A>-1?e.manager.tooltipViews[A]:null}mousemove(e){var A,i;this.lastMove={x:e.clientX,y:e.clientY,target:e.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:n,tooltip:o}=this;if(n.length&&o&&!r4A(o.dom,e)||this.pending){let{pos:a}=n[0]||this.pending,r=(i=(A=n[0])===null||A===void 0?void 0:A.end)!==null&&i!==void 0?i:a;(a==r?this.view.posAtCoords(this.lastMove)!=a:!s4A(this.view,a,r,e.clientX,e.clientY))&&(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:A}=this;if(A.length){let{tooltip:i}=this;i&&i.dom.contains(e.relatedTarget)?this.watchTooltipLeave(i.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(e){let A=i=>{e.removeEventListener("mouseleave",A),this.active.length&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};e.addEventListener("mouseleave",A)}destroy(){clearTimeout(this.hoverTimeout),clearTimeout(this.restartTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}},cw=4;function r4A(t,e){let{left:A,right:i,top:n,bottom:o}=t.getBoundingClientRect(),a;if(a=t.querySelector(".cm-tooltip-arrow")){let r=a.getBoundingClientRect();n=Math.min(r.top,n),o=Math.max(r.bottom,o)}return e.clientX>=A-cw&&e.clientX<=i+cw&&e.clientY>=n-cw&&e.clientY<=o+cw}function s4A(t,e,A,i,n,o){let a=t.scrollDOM.getBoundingClientRect(),r=t.documentTop+t.documentPadding.top+t.contentHeight;if(a.left>i||a.rightn||Math.min(a.bottom,r)=e&&s<=A}function $j(t,e={}){let A=Wi.define(),i=Ma.define({create(){return[]},update(n,o){if(n.length&&(e.hideOnChange&&(o.docChanged||o.selection)?n=[]:e.hideOn&&(n=n.filter(a=>!e.hideOn(o,a))),o.docChanged)){let a=[];for(let r of n){let s=o.changes.mapPos(r.pos,-1,zr.TrackDel);if(s!=null){let l=Object.assign(Object.create(null),r);l.pos=s,l.end!=null&&(l.end=o.changes.mapPos(l.end)),a.push(l)}}n=a}for(let a of o.effects)a.is(A)&&(n=a.value),a.is(l4A)&&(n=[]);return n},provide:n=>xw.from(n)});return{active:i,extension:[i,_o.define(n=>new _k(n,t,i,A,e.hoverTime||300)),a4A]}}function zk(t,e){let A=t.plugin(Hk);if(!A)return null;let i=A.manager.tooltips.indexOf(e);return i<0?null:A.manager.tooltipViews[i]}var l4A=Wi.define();var qP=At.define({combine(t){let e,A;for(let i of t)e=e||i.topContainer,A=A||i.bottomContainer;return{topContainer:e,bottomContainer:A}}});function W4(t,e){let A=t.plugin(Aq),i=A?A.specs.indexOf(e):-1;return i>-1?A.panels[i]:null}var Aq=_o.fromClass(class{constructor(t){this.input=t.state.facet(q1),this.specs=this.input.filter(A=>A),this.panels=this.specs.map(A=>A(t));let e=t.state.facet(qP);this.top=new OE(t,!0,e.topContainer),this.bottom=new OE(t,!1,e.bottomContainer),this.top.sync(this.panels.filter(A=>A.top)),this.bottom.sync(this.panels.filter(A=>!A.top));for(let A of this.panels)A.dom.classList.add("cm-panel"),A.mount&&A.mount()}update(t){let e=t.state.facet(qP);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new OE(t.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new OE(t.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let A=t.state.facet(q1);if(A!=this.input){let i=A.filter(s=>s),n=[],o=[],a=[],r=[];for(let s of i){let l=this.specs.indexOf(s),g;l<0?(g=s(t.view),r.push(g)):(g=this.panels[l],g.update&&g.update(t)),n.push(g),(g.top?o:a).push(g)}this.specs=i,this.panels=n,this.top.sync(o),this.bottom.sync(a);for(let s of r)s.dom.classList.add("cm-panel"),s.mount&&s.mount()}else for(let i of this.panels)i.update&&i.update(t)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:t=>ci.scrollMargins.of(e=>{let A=e.plugin(t);return A&&{top:A.top.scrollMargin(),bottom:A.bottom.scrollMargin()}})}),OE=class{constructor(e,A,i){this.view=e,this.top=A,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(e){for(let A of this.panels)A.destroy&&e.indexOf(A)<0&&A.destroy();this.panels=e,this.syncDOM()}syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.dom=void 0);return}if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let A=this.container||this.view.dom;A.insertBefore(this.dom,this.top?A.firstChild:null)}let e=this.dom.firstChild;for(let A of this.panels)if(A.dom.parentNode==this.dom){for(;e!=A.dom;)e=VP(e);e=e.nextSibling}else this.dom.insertBefore(A.dom,e);for(;e;)e=VP(e)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses)){for(let e of this.classes.split(" "))e&&this.container.classList.remove(e);for(let e of(this.classes=this.view.themeClasses).split(" "))e&&this.container.classList.add(e)}}};function VP(t){let e=t.nextSibling;return t.remove(),e}var q1=At.define({enables:Aq});function eq(t,e){let A,i=new Promise(a=>A=a),n=a=>g4A(a,e,A);t.state.field(TS,!1)?t.dispatch({effects:tq.of(n)}):t.dispatch({effects:Wi.appendConfig.of(TS.init(()=>[n]))});let o=iq.of(n);return{close:o,result:i.then(a=>((t.win.queueMicrotask||(s=>t.win.setTimeout(s,10)))(()=>{t.state.field(TS).indexOf(n)>-1&&t.dispatch({effects:o})}),a))}}var TS=Ma.define({create(){return[]},update(t,e){for(let A of e.effects)A.is(tq)?t=[A.value].concat(t):A.is(iq)&&(t=t.filter(i=>i!=A.value));return t},provide:t=>q1.computeN([t],e=>e.field(t))}),tq=Wi.define(),iq=Wi.define();function g4A(t,e,A){let i=e.content?e.content(t,()=>a(null)):null;if(!i){if(i=no("form"),e.input){let r=no("input",e.input);/^(text|password|number|email|tel|url)$/.test(r.type)&&r.classList.add("cm-textfield"),r.name||(r.name="input"),i.appendChild(no("label",(e.label||"")+": ",r))}else i.appendChild(document.createTextNode(e.label||""));i.appendChild(document.createTextNode(" ")),i.appendChild(no("button",{class:"cm-button",type:"submit"},e.submitLabel||"OK"))}let n=i.nodeName=="FORM"?[i]:i.querySelectorAll("form");for(let r=0;r{l.keyCode==27?(l.preventDefault(),a(null)):l.keyCode==13&&(l.preventDefault(),a(s))}),s.addEventListener("submit",l=>{l.preventDefault(),a(s)})}let o=no("div",i,no("button",{onclick:()=>a(null),"aria-label":t.state.phrase("close"),class:"cm-dialog-close",type:"button"},["\xD7"]));e.class&&(o.className=e.class),o.classList.add("cm-dialog");function a(r){o.contains(o.ownerDocument.activeElement)&&t.focus(),A(r)}return{dom:o,top:e.top,mount:()=>{if(e.focus){let r;typeof e.focus=="string"?r=i.querySelector(e.focus):r=i.querySelector("input")||i.querySelector("button"),r&&"select"in r?r.select():r&&"focus"in r&&r.focus()}}}}var gl=class extends gg{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}};gl.prototype.elementClass="";gl.prototype.toDOM=void 0;gl.prototype.mapMode=zr.TrackBefore;gl.prototype.startSide=gl.prototype.endSide=-1;gl.prototype.point=!0;var Ew=At.define(),c4A=At.define(),C4A={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>io.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},Y4=At.define();function Kw(t){return[nq(),Y4.of(gA(gA({},C4A),t))]}var Rk=At.define({combine:t=>t.some(e=>e)});function nq(t){let e=[I4A];return t&&t.fixed===!1&&e.push(Rk.of(!0)),e}var I4A=_o.fromClass(class{constructor(t){this.view=t,this.domAfter=null,this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=t.state.facet(Y4).map(e=>new Rw(t,e)),this.fixed=!t.state.facet(Rk);for(let e of this.gutters)e.config.side=="after"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),t.scrollDOM.insertBefore(this.dom,t.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(t){if(this.updateGutters(t)){let e=this.prevViewport,A=t.view.viewport,i=Math.min(e.to,A.to)-Math.max(e.from,A.from);this.syncGutters(i<(A.to-A.from)*.8)}if(t.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(Rk)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let A=io.iter(this.view.state.facet(Ew),this.view.viewport.from),i=[],n=this.gutters.map(o=>new Fk(o,this.view.viewport,-this.view.documentPadding.top));for(let o of this.view.viewportLineBlocks)if(i.length&&(i=[]),Array.isArray(o.type)){let a=!0;for(let r of o.type)if(r.type==Vr.Text&&a){Nk(A,i,r.from);for(let s of n)s.line(this.view,r,i);a=!1}else if(r.widget)for(let s of n)s.widget(this.view,r)}else if(o.type==Vr.Text){Nk(A,i,o.from);for(let a of n)a.line(this.view,o,i)}else if(o.widget)for(let a of n)a.widget(this.view,o);for(let o of n)o.finish();t&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(t){let e=t.startState.facet(Y4),A=t.state.facet(Y4),i=t.docChanged||t.heightChanged||t.viewportChanged||!io.eq(t.startState.facet(Ew),t.state.facet(Ew),t.view.viewport.from,t.view.viewport.to);if(e==A)for(let n of this.gutters)n.update(t)&&(i=!0);else{i=!0;let n=[];for(let o of A){let a=e.indexOf(o);a<0?n.push(new Rw(this.view,o)):(this.gutters[a].update(t),n.push(this.gutters[a]))}for(let o of this.gutters)o.dom.remove(),n.indexOf(o)<0&&o.destroy();for(let o of n)o.config.side=="after"?this.getDOMAfter().appendChild(o.dom):this.dom.appendChild(o.dom);this.gutters=n}return i}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:t=>ci.scrollMargins.of(e=>{let A=e.plugin(t);if(!A||A.gutters.length==0||!A.fixed)return null;let i=A.dom.offsetWidth*e.scaleX,n=A.domAfter?A.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==mo.LTR?{left:i,right:n}:{right:i,left:n}})});function WP(t){return Array.isArray(t)?t:[t]}function Nk(t,e,A){for(;t.value&&t.from<=A;)t.from==A&&e.push(t.value),t.next()}var Fk=class{constructor(e,A,i){this.gutter=e,this.height=i,this.i=0,this.cursor=io.iter(e.markers,A.from)}addElement(e,A,i){let{gutter:n}=this,o=(A.top-this.height)/e.scaleY,a=A.height/e.scaleY;if(this.i==n.elements.length){let r=new Nw(e,a,o,i);n.elements.push(r),n.dom.appendChild(r.dom)}else n.elements[this.i].update(e,a,o,i);this.height=A.bottom,this.i++}line(e,A,i){let n=[];Nk(this.cursor,n,A.from),i.length&&(n=n.concat(i));let o=this.gutter.config.lineMarker(e,A,n);o&&n.unshift(o);let a=this.gutter;n.length==0&&!a.config.renderEmptyElements||this.addElement(e,A,n)}widget(e,A){let i=this.gutter.config.widgetMarker(e,A.widget,A),n=i?[i]:null;for(let o of e.state.facet(c4A)){let a=o(e,A.widget,A);a&&(n||(n=[])).push(a)}n&&this.addElement(e,A,n)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let A=e.elements.pop();e.dom.removeChild(A.dom),A.destroy()}}},Rw=class{constructor(e,A){this.view=e,this.config=A,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in A.domEventHandlers)this.dom.addEventListener(i,n=>{let o=n.target,a;if(o!=this.dom&&this.dom.contains(o)){for(;o.parentNode!=this.dom;)o=o.parentNode;let s=o.getBoundingClientRect();a=(s.top+s.bottom)/2}else a=n.clientY;let r=e.lineBlockAtHeight(a-e.documentTop);A.domEventHandlers[i](e,r,n)&&n.preventDefault()});this.markers=WP(A.markers(e)),A.initialSpacer&&(this.spacer=new Nw(e,0,0,[A.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let A=this.markers;if(this.markers=WP(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let n=this.config.updateSpacer(this.spacer.markers[0],e);n!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[n])}let i=e.view.viewport;return!io.eq(this.markers,A,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}},Nw=class{constructor(e,A,i,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,A,i,n)}update(e,A,i,n){this.height!=A&&(this.height=A,this.dom.style.height=A+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),d4A(this.markers,n)||this.setMarkers(e,n)}setMarkers(e,A){let i="cm-gutterElement",n=this.dom.firstChild;for(let o=0,a=0;;){let r=a,s=oo(r,s,l)||a(r,s,l):a}return i}})}}),H4=class extends gl{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}};function JS(t,e){return t.state.facet(YE).formatNumber(e,t.state)}var h4A=Y4.compute([YE],t=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(e){return e.state.facet(B4A)},lineMarker(e,A,i){return i.some(n=>n.toDOM)?null:new H4(JS(e,e.state.doc.lineAt(A.from).number))},widgetMarker:(e,A,i)=>{for(let n of e.state.facet(E4A)){let o=n(e,A,i);if(o)return o}return null},lineMarkerChange:e=>e.startState.facet(YE)!=e.state.facet(YE),initialSpacer(e){return new H4(JS(e,ZP(e.state.doc.lines)))},updateSpacer(e,A){let i=JS(A.view,ZP(A.view.state.doc.lines));return i==e.number?e:new H4(i)},domEventHandlers:t.facet(YE).domEventHandlers,side:"before"}));function oq(t={}){return[YE.of(t),nq(),h4A]}function ZP(t){let e=9;for(;e{let e=[],A=-1;for(let i of t.selection.ranges){let n=t.doc.lineAt(i.head).from;n>A&&(A=n,e.push(Q4A.range(n)))}return io.of(e)});function aq(){return u4A}var f4A=0,Z4=class{constructor(e,A){this.from=e,this.to=A}},Ni=class{constructor(e={}){this.id=f4A++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=Qs.match(e)),A=>{let i=e(A);return i===void 0?null:[this,i]}}};Ni.closedBy=new Ni({deserialize:t=>t.split(" ")});Ni.openedBy=new Ni({deserialize:t=>t.split(" ")});Ni.group=new Ni({deserialize:t=>t.split(" ")});Ni.isolate=new Ni({deserialize:t=>{if(t&&t!="rtl"&&t!="ltr"&&t!="auto")throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}});Ni.contextHash=new Ni({perNode:!0});Ni.lookAhead=new Ni({perNode:!0});Ni.mounted=new Ni({perNode:!0});var V1=class{constructor(e,A,i,n=!1){this.tree=e,this.overlay=A,this.parser=i,this.bracketed=n}static get(e){return e&&e.props&&e.props[Ni.mounted.id]}},p4A=Object.create(null),Qs=class t{constructor(e,A,i,n=0){this.name=e,this.props=A,this.id=i,this.flags=n}static define(e){let A=e.props&&e.props.length?Object.create(null):p4A,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new t(e.name||"",A,e.id,i);if(e.props){for(let o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let A=this.prop(Ni.group);return A?A.indexOf(e)>-1:!1}return this.id==e}static match(e){let A=Object.create(null);for(let i in e)for(let n of i.split(" "))A[n]=e[i];return i=>{for(let n=i.prop(Ni.group),o=-1;o<(n?n.length:0);o++){let a=A[o<0?i.name:n[o]];if(a)return a}}}};Qs.none=new Qs("",Object.create(null),0,8);var X4=class t{constructor(e){this.types=e;for(let A=0;A0;for(let s=this.cursor(a|Sa.IncludeAnonymous);;){let l=!1;if(s.from<=o&&s.to>=n&&(!r&&s.type.isAnonymous||A(s)!==!1)){if(s.firstChild())continue;l=!0}for(;l&&i&&(r||!s.type.isAnonymous)&&i(s),!s.nextSibling();){if(!s.parent())return;l=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let A in this.props)e.push([+A,this.props[A]]);return e}balance(e={}){return this.children.length<=8?this:Xk(Qs.none,this.children,this.positions,0,this.children.length,0,this.length,(A,i,n)=>new t(this.type,A,i,n,this.propValues),e.makeTree||((A,i,n)=>new t(Qs.none,A,i,n)))}static build(e){return w4A(e)}};Ka.empty=new Ka(Qs.none,[],[],0);var Pk=class t{constructor(e,A){this.buffer=e,this.index=A}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new t(this.buffer,this.index)}},X2=class t{constructor(e,A,i){this.buffer=e,this.length=A,this.set=i}get type(){return Qs.none}toString(){let e=[];for(let A=0;A0));s=a[s+3]);return r}slice(e,A,i){let n=this.buffer,o=new Uint16Array(A-e),a=0;for(let r=e,s=0;r=e&&Ae;case 1:return A<=e&&i>e;case 2:return i>e;case 4:return!0}}function $4(t,e,A,i){for(var n;t.from==t.to||(A<1?t.from>=e:t.from>e)||(A>-1?t.to<=e:t.to0?r.length:-1;e!=l;e+=A){let g=r[e],C=s[e]+a.from,I;if(!(!(o&Sa.EnterBracketed&&g instanceof Ka&&(I=V1.get(g))&&!I.overlay&&I.bracketed&&i>=C&&i<=C+g.length)&&!gq(n,i,C,C+g.length))){if(g instanceof X2){if(o&Sa.ExcludeBuffers)continue;let d=g.findChild(0,g.buffer.length,A,i-C,n);if(d>-1)return new Af(new qk(a,g,e,C),null,d)}else if(o&Sa.IncludeAnonymous||!g.type.isAnonymous||Zk(g)){let d;if(!(o&Sa.IgnoreMounts)&&(d=V1.get(g))&&!d.overlay)return new t(d.tree,C,e,a);let h=new t(g,C,e,a);return o&Sa.IncludeAnonymous||!h.type.isAnonymous?h:h.nextChild(A<0?g.children.length-1:0,A,i,n,o)}}}if(o&Sa.IncludeAnonymous||!a.type.isAnonymous||(a.index>=0?e=a.index+A:e=A<0?-1:a._parent._tree.children.length,a=a._parent,!a))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,A,i=0){let n;if(!(i&Sa.IgnoreOverlays)&&(n=V1.get(this._tree))&&n.overlay){let o=e-this.from,a=i&Sa.EnterBracketed&&n.bracketed;for(let{from:r,to:s}of n.overlay)if((A>0||a?r<=o:r=o:s>o))return new t(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,A,i)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function sq(t,e,A,i){let n=t.cursor(),o=[];if(!n.firstChild())return o;if(A!=null){for(let a=!1;!a;)if(a=n.type.is(A),!n.nextSibling())return o}for(;;){if(i!=null&&n.type.is(i))return o;if(n.type.is(e)&&o.push(n.node),!n.nextSibling())return i==null?o:[]}}function jk(t,e,A=e.length-1){for(let i=t;A>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(e[A]&&e[A]!=i.name)return!1;A--}}return!0}var qk=class{constructor(e,A,i,n){this.parent=e,this.buffer=A,this.index=i,this.start=n}},Af=class t extends Jw{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,A,i){super(),this.context=e,this._parent=A,this.index=i,this.type=e.buffer.set.types[e.buffer.buffer[i]]}child(e,A,i){let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.context.start,i);return o<0?null:new t(this.context,this,o)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,A,i=0){if(i&Sa.ExcludeBuffers)return null;let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],A>0?1:-1,e-this.context.start,A);return o<0?null:new t(this.context,this,o)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,A=e.buffer[this.index+3];return A<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new t(this.context,this._parent,A):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,A=this._parent?this._parent.index+4:0;return this.index==A?this.externalSibling(-1):new t(this.context,this._parent,e.findChild(A,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],A=[],{buffer:i}=this.context,n=this.index+4,o=i.buffer[this.index+3];if(o>n){let a=i.buffer[this.index+1];e.push(i.slice(n,o,a)),A.push(0)}return new Ka(this.type,e,A,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function cq(t){if(!t.length)return null;let e=0,A=t[0];for(let o=1;oA.from||a.to=e){let r=new h0(a.tree,a.overlay[0].from+o.from,-1,o);(n||(n=[i])).push($4(r,e,A,!1))}}return n?cq(n):i}var ef=class{get name(){return this.type.name}constructor(e,A=0){if(this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,this.mode=A&~Sa.EnterBracketed,e instanceof h0)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let i=e._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,A){this.index=e;let{start:i,buffer:n}=this.buffer;return this.type=A||n.set.types[n.buffer[e]],this.from=i+n.buffer[e+1],this.to=i+n.buffer[e+2],!0}yield(e){return e?e instanceof h0?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,A,i){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,A,i,this.mode));let{buffer:n}=this.buffer,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.buffer.start,i);return o<0?!1:(this.stack.push(this.index),this.yieldBuf(o))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,A,i=this.mode){return this.buffer?i&Sa.ExcludeBuffers?!1:this.enterChild(1,e,A):this.yield(this._tree.enter(e,A,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&Sa.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&Sa.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:A}=this.buffer,i=this.stack.length-1;if(e<0){let n=i<0?0:this.stack[i]+4;if(this.index!=n)return this.yieldBuf(A.findChild(n,this.index,-1,0,4))}else{let n=A.buffer[this.index+3];if(n<(i<0?A.buffer.length:A.buffer[this.stack[i]+3]))return this.yieldBuf(n)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let A,i,{buffer:n}=this;if(n){if(e>0){if(this.index-1)for(let o=A+e,a=e<0?-1:i._tree.children.length;o!=a;o+=e){let r=i._tree.children[o];if(this.mode&Sa.IncludeAnonymous||r instanceof X2||!r.type.isAnonymous||Zk(r))return!1}return!0}move(e,A){if(A&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,A=0){for(;(this.from==this.to||(A<1?this.from>=e:this.from>e)||(A>-1?this.to<=e:this.to=0;){for(let a=e;a;a=a._parent)if(a.index==n){if(n==this.index)return a;A=a,i=o+1;break A}n=this.stack[--o]}for(let n=i;n=0;o--){if(o<0)return jk(this._tree,e,n);let a=i[A.buffer[this.stack[o]]];if(!a.isAnonymous){if(e[n]&&e[n]!=a.name)return!1;n--}}return!0}};function Zk(t){return t.children.some(e=>e instanceof X2||!e.type.isAnonymous||Zk(e))}function w4A(t){var e;let{buffer:A,nodeSet:i,maxBufferLength:n=1024,reused:o=[],minRepeatType:a=i.types.length}=t,r=Array.isArray(A)?new Pk(A,A.length):A,s=i.types,l=0,g=0;function C(b,x,F,z,P,Z){let{id:tA,start:W,end:BA,size:X}=r,iA=g,AA=l;if(X<0)if(r.next(),X==-1){let UA=o[tA];F.push(UA),z.push(W-b);return}else if(X==-3){l=tA;return}else if(X==-4){g=tA;return}else throw new RangeError(`Unrecognized record size: ${X}`);let IA=s[tA],aA,rA,uA=W-b;if(BA-W<=n&&(rA=f(r.pos-x,P))){let UA=new Uint16Array(rA.size-rA.skip),$A=r.pos-rA.size,zA=UA.length;for(;r.pos>$A;)zA=m(rA.start,UA,zA);aA=new X2(UA,BA-rA.start,i),uA=rA.start-b}else{let UA=r.pos-X;r.next();let $A=[],zA=[],pA=tA>=a?tA:-1,PA=0,Je=BA;for(;r.pos>UA;)pA>=0&&r.id==pA&&r.size>=0?(r.end<=Je-n&&(h($A,zA,W,PA,r.end,Je,pA,iA,AA),PA=$A.length,Je=r.end),r.next()):Z>2500?I(W,UA,$A,zA):C(W,UA,$A,zA,pA,Z+1);if(pA>=0&&PA>0&&PA<$A.length&&h($A,zA,W,PA,W,Je,pA,iA,AA),$A.reverse(),zA.reverse(),pA>-1&&PA>0){let _e=d(IA,AA);aA=Xk(IA,$A,zA,0,$A.length,0,BA-W,_e,_e)}else aA=E(IA,$A,zA,BA-W,iA-BA,AA)}F.push(aA),z.push(uA)}function I(b,x,F,z){let P=[],Z=0,tA=-1;for(;r.pos>x;){let{id:W,start:BA,end:X,size:iA}=r;if(iA>4)r.next();else{if(tA>-1&&BA=0;X-=3)W[iA++]=P[X],W[iA++]=P[X+1]-BA,W[iA++]=P[X+2]-BA,W[iA++]=iA;F.push(new X2(W,P[2]-BA,i)),z.push(BA-b)}}function d(b,x){return(F,z,P)=>{let Z=0,tA=F.length-1,W,BA;if(tA>=0&&(W=F[tA])instanceof Ka){if(!tA&&W.type==b&&W.length==P)return W;(BA=W.prop(Ni.lookAhead))&&(Z=z[tA]+W.length+BA)}return E(b,F,z,P,Z,x)}}function h(b,x,F,z,P,Z,tA,W,BA){let X=[],iA=[];for(;b.length>z;)X.push(b.pop()),iA.push(x.pop()+F-P);b.push(E(i.types[tA],X,iA,Z-P,W-Z,BA)),x.push(P-F)}function E(b,x,F,z,P,Z,tA){if(Z){let W=[Ni.contextHash,Z];tA=tA?[W].concat(tA):[W]}if(P>25){let W=[Ni.lookAhead,P];tA=tA?[W].concat(tA):[W]}return new Ka(b,x,F,z,tA)}function f(b,x){let F=r.fork(),z=0,P=0,Z=0,tA=F.end-n,W={size:0,start:0,skip:0};A:for(let BA=F.pos-b;F.pos>BA;){let X=F.size;if(F.id==x&&X>=0){W.size=z,W.start=P,W.skip=Z,Z+=4,z+=4,F.next();continue}let iA=F.pos-X;if(X<0||iA=a?4:0,IA=F.start;for(F.next();F.pos>iA;){if(F.size<0)if(F.size==-3||F.size==-4)AA+=4;else break A;else F.id>=a&&(AA+=4);F.next()}P=IA,z+=X,Z+=AA}return(x<0||z==b)&&(W.size=z,W.start=P,W.skip=Z),W.size>4?W:void 0}function m(b,x,F){let{id:z,start:P,end:Z,size:tA}=r;if(r.next(),tA>=0&&z4){let BA=r.pos-(tA-4);for(;r.pos>BA;)F=m(b,x,F)}x[--F]=W,x[--F]=Z-b,x[--F]=P-b,x[--F]=z}else tA==-3?l=z:tA==-4&&(g=z);return F}let v=[],k=[];for(;r.pos>0;)C(t.start||0,t.bufferStart||0,v,k,-1,0);let S=(e=t.length)!==null&&e!==void 0?e:v.length?k[0]+v[0].length:0;return new Ka(s[t.topID],v.reverse(),k.reverse(),S)}var lq=new WeakMap;function Tw(t,e){if(!t.isAnonymous||e instanceof X2||e.type!=t)return 1;let A=lq.get(e);if(A==null){A=1;for(let i of e.children){if(i.type!=t||!(i instanceof Ka)){A=1;break}A+=Tw(t,i)}lq.set(e,A)}return A}function Xk(t,e,A,i,n,o,a,r,s){let l=0;for(let h=i;h=g)break;x+=F}if(k==S+1){if(x>g){let F=h[S];d(F.children,F.positions,0,F.children.length,E[S]+v);continue}C.push(h[S])}else{let F=E[k-1]+h[k-1].length-b;C.push(Xk(t,h,E,S,k,b,F,null,s))}I.push(b+v-o)}}return d(e,A,i,n,0),(r||s)(C,I,a)}var W1=class t{constructor(e,A,i,n,o=!1,a=!1){this.from=e,this.to=A,this.tree=i,this.offset=n,this.open=(o?1:0)|(a?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,A=[],i=!1){let n=[new t(0,e.length,e,0,!1,i)];for(let o of A)o.to>e.length&&n.push(o);return n}static applyChanges(e,A,i=128){if(!A.length)return e;let n=[],o=1,a=e.length?e[0]:null;for(let r=0,s=0,l=0;;r++){let g=r=i)for(;a&&a.from=I.from||C<=I.to||l){let d=Math.max(I.from,s)-l,h=Math.min(I.to,C)-l;I=d>=h?null:new t(d,h,I.tree,I.offset+l,r>0,!!g)}if(I&&n.push(I),a.to>C)break;a=onew Z4(n.from,n.to)):[new Z4(0,0)]:[new Z4(0,e.length)],this.createParse(e,A||[],i)}parse(e,A,i){let n=this.startParse(e,A,i);for(;;){let o=n.advance();if(o)return o}}},Wk=class{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,A){return this.string.slice(e,A)}};var NBe=new Ni({perNode:!0});var D4A=0,lc=class t{constructor(e,A,i,n){this.name=e,this.set=A,this.base=i,this.modified=n,this.id=D4A++}toString(){let{name:e}=this;for(let A of this.modified)A.name&&(e=`${A.name}(${e})`);return e}static define(e,A){let i=typeof e=="string"?e:"?";if(e instanceof t&&(A=e),A?.base)throw new Error("Can not derive from a modified tag");let n=new t(i,[],null,[]);if(n.set.push(n),A)for(let o of A.set)n.set.push(o);return n}static defineModifier(e){let A=new zw(e);return i=>i.modified.indexOf(A)>-1?i:zw.get(i.base||i,i.modified.concat(A).sort((n,o)=>n.id-o.id))}},y4A=0,zw=class t{constructor(e){this.name=e,this.instances=[],this.id=y4A++}static get(e,A){if(!A.length)return e;let i=A[0].instances.find(r=>r.base==e&&v4A(A,r.modified));if(i)return i;let n=[],o=new lc(e.name,n,e,A);for(let r of A)r.instances.push(o);let a=b4A(A);for(let r of e.set)if(!r.modified.length)for(let s of a)n.push(t.get(r,s));return o}};function v4A(t,e){return t.length==e.length&&t.every((A,i)=>A==e[i])}function b4A(t){let e=[[]];for(let A=0;Ai.length-A.length)}function Pw(t){let e=Object.create(null);for(let A in t){let i=t[A];Array.isArray(i)||(i=[i]);for(let n of A.split(" "))if(n){let o=[],a=2,r=n;for(let C=0;;){if(r=="..."&&C>0&&C+3==n.length){a=1;break}let I=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(r);if(!I)throw new RangeError("Invalid path: "+n);if(o.push(I[0]=="*"?"":I[0][0]=='"'?JSON.parse(I[0]):I[0]),C+=I[0].length,C==n.length)break;let d=n[C++];if(C==n.length&&d=="!"){a=0;break}if(d!="/")throw new RangeError("Invalid path: "+n);r=n.slice(C)}let s=o.length-1,l=o[s];if(!l)throw new RangeError("Invalid path: "+n);let g=new X1(i,a,s>0?o.slice(0,s):null);e[l]=g.sort(e[l])}}return dq.add(e)}var dq=new Ni({combine(t,e){let A,i,n;for(;t||e;){if(!t||e&&t.depth>=e.depth?(n=e,e=e.next):(n=t,t=t.next),A&&A.mode==n.mode&&!n.context&&!A.context)continue;let o=new X1(n.tags,n.mode,n.context);A?A.next=o:i=o,A=o}return i}}),X1=class{constructor(e,A,i,n){this.tags=e,this.mode=A,this.context=i,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let a=n;for(let r of o)for(let s of r.set){let l=A[s.id];if(l){a=a?a+" "+l:l;break}}return a},scope:i}}function M4A(t,e){let A=null;for(let i of t){let n=i.style(e);n&&(A=A?A+" "+n:n)}return A}function Bq(t,e,A,i=0,n=t.length){let o=new Ax(i,Array.isArray(e)?e:[e],A);o.highlightRange(t.cursor(),i,n,"",o.highlighters),o.flush(n)}var Ax=class{constructor(e,A,i){this.at=e,this.highlighters=A,this.span=i,this.class=""}startSpan(e,A){A!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=A)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,A,i,n,o){let{type:a,from:r,to:s}=e;if(r>=i||s<=A)return;a.isTop&&(o=this.highlighters.filter(d=>!d.scope||d.scope(a)));let l=n,g=S4A(e)||X1.empty,C=M4A(o,g.tags);if(C&&(l&&(l+=" "),l+=C,g.mode==1&&(n+=(n?" ":"")+C)),this.startSpan(Math.max(A,r),l),g.opaque)return;let I=e.tree&&e.tree.prop(Ni.mounted);if(I&&I.overlay){let d=e.node.enter(I.overlay[0].from+r,1),h=this.highlighters.filter(f=>!f.scope||f.scope(I.tree.type)),E=e.firstChild();for(let f=0,m=r;;f++){let v=f=k||!e.nextSibling())););if(!v||k>i)break;m=v.to+r,m>A&&(this.highlightRange(d.cursor(),Math.max(A,v.from+r),Math.min(i,m),"",h),this.startSpan(Math.min(i,m),l))}E&&e.parent()}else if(e.firstChild()){I&&(n="");do if(!(e.to<=A)){if(e.from>=i)break;this.highlightRange(e,A,i,n,o),this.startSpan(Math.min(i,e.to),l)}while(e.nextSibling());e.parent()}}};function S4A(t){let e=t.type.prop(dq);for(;e&&e.context&&!t.matchContext(e.context);)e=e.next;return e||null}var $e=lc.define,Ow=$e(),$2=$e(),Cq=$e($2),Iq=$e($2),AI=$e(),Yw=$e(AI),$k=$e(AI),f0=$e(),Z1=$e(f0),Q0=$e(),u0=$e(),ex=$e(),tf=$e(ex),Hw=$e(),Fe={comment:Ow,lineComment:$e(Ow),blockComment:$e(Ow),docComment:$e(Ow),name:$2,variableName:$e($2),typeName:Cq,tagName:$e(Cq),propertyName:Iq,attributeName:$e(Iq),className:$e($2),labelName:$e($2),namespace:$e($2),macroName:$e($2),literal:AI,string:Yw,docString:$e(Yw),character:$e(Yw),attributeValue:$e(Yw),number:$k,integer:$e($k),float:$e($k),bool:$e(AI),regexp:$e(AI),escape:$e(AI),color:$e(AI),url:$e(AI),keyword:Q0,self:$e(Q0),null:$e(Q0),atom:$e(Q0),unit:$e(Q0),modifier:$e(Q0),operatorKeyword:$e(Q0),controlKeyword:$e(Q0),definitionKeyword:$e(Q0),moduleKeyword:$e(Q0),operator:u0,derefOperator:$e(u0),arithmeticOperator:$e(u0),logicOperator:$e(u0),bitwiseOperator:$e(u0),compareOperator:$e(u0),updateOperator:$e(u0),definitionOperator:$e(u0),typeOperator:$e(u0),controlOperator:$e(u0),punctuation:ex,separator:$e(ex),bracket:tf,angleBracket:$e(tf),squareBracket:$e(tf),paren:$e(tf),brace:$e(tf),content:f0,heading:Z1,heading1:$e(Z1),heading2:$e(Z1),heading3:$e(Z1),heading4:$e(Z1),heading5:$e(Z1),heading6:$e(Z1),contentSeparator:$e(f0),list:$e(f0),quote:$e(f0),emphasis:$e(f0),strong:$e(f0),link:$e(f0),monospace:$e(f0),strikethrough:$e(f0),inserted:$e(),deleted:$e(),changed:$e(),invalid:$e(),meta:Hw,documentMeta:$e(Hw),annotation:$e(Hw),processingInstruction:$e(Hw),definition:lc.defineModifier("definition"),constant:lc.defineModifier("constant"),function:lc.defineModifier("function"),standard:lc.defineModifier("standard"),local:lc.defineModifier("local"),special:lc.defineModifier("special")};for(let t in Fe){let e=Fe[t];e instanceof lc&&(e.name=t)}var GBe=tx([{tag:Fe.link,class:"tok-link"},{tag:Fe.heading,class:"tok-heading"},{tag:Fe.emphasis,class:"tok-emphasis"},{tag:Fe.strong,class:"tok-strong"},{tag:Fe.keyword,class:"tok-keyword"},{tag:Fe.atom,class:"tok-atom"},{tag:Fe.bool,class:"tok-bool"},{tag:Fe.url,class:"tok-url"},{tag:Fe.labelName,class:"tok-labelName"},{tag:Fe.inserted,class:"tok-inserted"},{tag:Fe.deleted,class:"tok-deleted"},{tag:Fe.literal,class:"tok-literal"},{tag:Fe.string,class:"tok-string"},{tag:Fe.number,class:"tok-number"},{tag:[Fe.regexp,Fe.escape,Fe.special(Fe.string)],class:"tok-string2"},{tag:Fe.variableName,class:"tok-variableName"},{tag:Fe.local(Fe.variableName),class:"tok-variableName tok-local"},{tag:Fe.definition(Fe.variableName),class:"tok-variableName tok-definition"},{tag:Fe.special(Fe.variableName),class:"tok-variableName2"},{tag:Fe.definition(Fe.propertyName),class:"tok-propertyName tok-definition"},{tag:Fe.typeName,class:"tok-typeName"},{tag:Fe.namespace,class:"tok-namespace"},{tag:Fe.className,class:"tok-className"},{tag:Fe.macroName,class:"tok-macroName"},{tag:Fe.propertyName,class:"tok-propertyName"},{tag:Fe.operator,class:"tok-operator"},{tag:Fe.comment,class:"tok-comment"},{tag:Fe.meta,class:"tok-meta"},{tag:Fe.invalid,class:"tok-invalid"},{tag:Fe.punctuation,class:"tok-punctuation"}]);var ix,eh=new Ni;function k4A(t){return At.define({combine:t?e=>e.concat(t):void 0})}var x4A=new Ni,gc=(()=>{class t{constructor(A,i,n=[],o=""){this.data=A,this.name=o,qa.prototype.hasOwnProperty("tree")||Object.defineProperty(qa.prototype,"tree",{get(){return kr(this)}}),this.parser=i,this.extension=[eI.of(this),qa.languageData.of((a,r,s)=>{let l=Eq(a,r,s),g=l.type.prop(eh);if(!g)return[];let C=a.facet(g),I=l.type.prop(x4A);if(I){let d=l.resolve(r-l.from,s);for(let h of I)if(h.test(d,a)){let E=a.facet(h.facet);return h.type=="replace"?E:E.concat(C)}}return C})].concat(n)}isActiveAt(A,i,n=-1){return Eq(A,i,n).type.prop(eh)==this.data}findRegions(A){let i=A.facet(eI);if(i?.data==this.data)return[{from:0,to:A.doc.length}];if(!i||!i.allowsNesting)return[];let n=[],o=(a,r)=>{if(a.prop(eh)==this.data){n.push({from:r,to:r+a.length});return}let s=a.prop(Ni.mounted);if(s){if(s.tree.prop(eh)==this.data){if(s.overlay)for(let l of s.overlay)n.push({from:l.from+r,to:l.to+r});else n.push({from:r,to:r+a.length});return}else if(s.overlay){let l=n.length;if(o(s.tree,s.overlay[0].from+r),n.length>l)return}}for(let l=0;li.isTop?A:void 0)]}),e.name)}configure(e,A){return new t(this.data,this.parser.configure(e),A||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function kr(t){let e=t.field(gc.state,!1);return e?e.tree:Ka.empty}function Bx(t,e,A=50){var i;let n=(i=t.field(gc.state,!1))===null||i===void 0?void 0:i.context;if(!n)return null;let o=n.viewport;n.updateViewport({from:0,to:e});let a=n.isDone(e)||n.work(A,e)?n.tree:null;return n.updateViewport(o),a}var rx=class{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,A){let i=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,A):this.string.slice(e-i,A-i)}},nf=null,sx=class t{constructor(e,A,i=[],n,o,a,r,s){this.parser=e,this.state=A,this.fragments=i,this.tree=n,this.treeLen=o,this.viewport=a,this.skipped=r,this.scheduleOn=s,this.parse=null,this.tempSkipped=[]}static create(e,A,i){return new t(e,A,[],Ka.empty,0,i,[],null)}startParse(){return this.parser.startParse(new rx(this.state.doc),this.fragments)}work(e,A){return A!=null&&A>=this.state.doc.length&&(A=void 0),this.tree!=Ka.empty&&this.isDone(A??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof e=="number"){let n=Date.now()+e;e=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),A!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>A)&&A=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(A=this.parse.advance()););}),this.treeLen=e,this.tree=A,this.fragments=this.withoutTempSkipped(W1.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let A=nf;nf=this;try{return e()}finally{nf=A}}withoutTempSkipped(e){for(let A;A=this.tempSkipped.pop();)e=hq(e,A.from,A.to);return e}changes(e,A){let{fragments:i,tree:n,treeLen:o,viewport:a,skipped:r}=this;if(this.takeTree(),!e.empty){let s=[];if(e.iterChangedRanges((l,g,C,I)=>s.push({fromA:l,toA:g,fromB:C,toB:I})),i=W1.applyChanges(i,s),n=Ka.empty,o=0,a={from:e.mapPos(a.from,-1),to:e.mapPos(a.to,1)},this.skipped.length){r=[];for(let l of this.skipped){let g=e.mapPos(l.from,1),C=e.mapPos(l.to,-1);ge.from&&(this.fragments=hq(this.fragments,n,o),this.skipped.splice(i--,1))}return this.skipped.length>=A?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,A){this.skipped.push({from:e,to:A})}static getSkippingParser(e){return new class extends Ah{createParse(A,i,n){let o=n[0].from,a=n[n.length-1].to;return{parsedPos:o,advance(){let s=nf;if(s){for(let l of n)s.tempSkipped.push(l);e&&(s.scheduleOn=s.scheduleOn?Promise.all([s.scheduleOn,e]):e)}return this.parsedPos=a,new Ka(Qs.none,[],[],a-o)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let A=this.fragments;return this.treeLen>=e&&A.length&&A[0].from==0&&A[0].to>=e}static get(){return nf}};function hq(t,e,A){return W1.applyChanges(t,[{fromA:e,toA:A,fromB:e,toB:A}])}var af=class t{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let A=this.context.changes(e.changes,e.state),i=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),A.viewport.to);return A.work(20,i)||A.takeTree(),new t(A)}static init(e){let A=Math.min(3e3,e.doc.length),i=sx.create(e.facet(eI).parser,e,{from:0,to:A});return i.work(20,A)||i.takeTree(),new t(i)}};gc.state=Ma.define({create:af.init,update(t,e){for(let A of e.effects)if(A.is(gc.setState))return A.value;return e.startState.facet(eI)!=e.state.facet(eI)?af.init(e.state):t.apply(e)}});var Dq=t=>{let e=setTimeout(()=>t(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(Dq=t=>{let e=-1,A=setTimeout(()=>{e=requestIdleCallback(t,{timeout:400})},100);return()=>e<0?clearTimeout(A):cancelIdleCallback(e)});var nx=typeof navigator<"u"&&(!((ix=navigator.scheduling)===null||ix===void 0)&&ix.isInputPending)?()=>navigator.scheduling.isInputPending():null,_4A=_o.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let A=this.view.state.field(gc.state).context;(A.updateViewport(e.view.viewport)||this.view.viewport.to>A.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(A)}scheduleWork(){if(this.working)return;let{state:e}=this.view,A=e.field(gc.state);(A.tree!=A.context.tree||!A.context.isDone(e.doc.length))&&(this.working=Dq(this.work))}work(e){this.working=null;let A=Date.now();if(this.chunkEndn+1e3,s=o.context.work(()=>nx&&nx()||Date.now()>a,n+(r?0:1e5));this.chunkBudget-=Date.now()-A,(s||this.chunkBudget<=0)&&(o.context.takeTree(),this.view.dispatch({effects:gc.setState.of(new af(o.context))})),this.chunkBudget>0&&!(s&&!r)&&this.scheduleWork(),this.checkAsyncSchedule(o.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(A=>Sr(this.view.state,A)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),eI=At.define({combine(t){return t.length?t[0]:null},enables:t=>[gc.state,_4A,ci.contentAttributes.compute([t],e=>{let A=e.facet(t);return A&&A.name?{"data-language":A.name}:{}})]}),qw=class{constructor(e,A=[]){this.language=e,this.support=A,this.extension=[e,A]}};var R4A=At.define(),ed=At.define({combine:t=>{if(!t.length)return" ";let e=t[0];if(!e||/\S/.test(e)||Array.from(e).some(A=>A!=e[0]))throw new Error("Invalid indent unit: "+JSON.stringify(t[0]));return e}});function Cc(t){let e=t.facet(ed);return e.charCodeAt(0)==9?t.tabSize*e.length:e.length}function nh(t,e){let A="",i=t.tabSize,n=t.facet(ed)[0];if(n==" "){for(;e>=i;)A+=" ",e-=i;n=" "}for(let o=0;o=e?N4A(t,A,e):null}var $1=class{constructor(e,A={}){this.state=e,this.options=A,this.unit=Cc(e)}lineAt(e,A=1){let i=this.state.doc.lineAt(e),{simulateBreak:n,simulateDoubleBreak:o}=this.options;return n!=null&&n>=i.from&&n<=i.to?o&&n==e?{text:"",from:e}:(A<0?n-1&&(o+=a-this.countColumn(i,i.search(/\S|$/))),o}countColumn(e,A=e.length){return dC(e,this.state.tabSize,A)}lineIndent(e,A=1){let{text:i,from:n}=this.lineAt(e,A),o=this.options.overrideIndentation;if(o){let a=o(n);if(a>-1)return a}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}},Ex=new Ni;function N4A(t,e,A){let i=e.resolveStack(A),n=e.resolveInner(A,-1).resolve(A,0).enterUnfinishedNodesBefore(A);if(n!=i.node){let o=[];for(let a=n;a&&!(a.fromi.node.to||a.from==i.node.from&&a.type==i.node.type);a=a.parent)o.push(a);for(let a=o.length-1;a>=0;a--)i={node:o[a],next:i}}return yq(i,t,A)}function yq(t,e,A){for(let i=t;i;i=i.next){let n=L4A(i.node);if(n)return n(lx.create(e,A,i))}return 0}function F4A(t){return t.pos==t.options.simulateBreak&&t.options.simulateDoubleBreak}function L4A(t){let e=t.type.prop(Ex);if(e)return e;let A=t.firstChild,i;if(A&&(i=A.type.prop(Ni.closedBy))){let n=t.lastChild,o=n&&i.indexOf(n.name)>-1;return a=>T4A(a,!0,1,void 0,o&&!F4A(a)?n.from:void 0)}return t.parent==null?G4A:null}function G4A(){return 0}var lx=class t extends $1{constructor(e,A,i){super(e.state,e.options),this.base=e,this.pos=A,this.context=i}get node(){return this.context.node}static create(e,A,i){return new t(e,A,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let A=this.state.doc.lineAt(e.from);for(;;){let i=e.resolve(A.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(K4A(i,e))break;A=this.state.doc.lineAt(i.from)}return this.lineIndent(A.from)}continue(){return yq(this.context.next,this.base,this.pos)}};function K4A(t,e){for(let A=e;A;A=A.parent)if(t==A)return!0;return!1}function U4A(t){let e=t.node,A=e.childAfter(e.from),i=e.lastChild;if(!A)return null;let n=t.options.simulateBreak,o=t.state.doc.lineAt(A.from),a=n==null||n<=o.from?o.to:Math.min(o.to,n);for(let r=A.to;;){let s=e.childAfter(r);if(!s||s==i)return null;if(!s.type.isSkipped){if(s.from>=a)return null;let l=/^ */.exec(o.text.slice(A.to-o.from))[0].length;return{from:A.from,to:A.to+l}}r=s.to}}function T4A(t,e,A,i,n){let o=t.textAfter,a=o.match(/^\s*/)[0].length,r=i&&o.slice(a,a+i.length)==i||n==t.pos+a,s=e?U4A(t):null;return s?r?t.column(s.from):t.column(s.to):t.baseIndent+(r?0:t.unit*A)}function hx({except:t,units:e=1}={}){return A=>{let i=t&&t.test(A.textAfter);return A.baseIndent+(i?0:e*A.unit)}}var J4A=200;function vq(){return qa.transactionFilter.of(t=>{if(!t.docChanged||!t.isUserEvent("input.type")&&!t.isUserEvent("input.complete"))return t;let e=t.startState.languageDataAt("indentOnInput",t.startState.selection.main.head);if(!e.length)return t;let A=t.newDoc,{head:i}=t.newSelection.main,n=A.lineAt(i);if(i>n.from+J4A)return t;let o=A.sliceString(n.from,i);if(!e.some(l=>l.test(o)))return t;let{state:a}=t,r=-1,s=[];for(let{head:l}of a.selection.ranges){let g=a.doc.lineAt(l);if(g.from==r)continue;r=g.from;let C=Ww(a,g.from);if(C==null)continue;let I=/^\s*/.exec(g.text)[0],d=nh(a,C);I!=d&&s.push({from:g.from,to:g.from+I.length,insert:d})}return s.length?[t,{changes:s,sequential:!0}]:t})}var Qx=At.define(),rf=new Ni;function bq(t){let e=t.firstChild,A=t.lastChild;return e&&e.toA)continue;if(o&&r.from=e&&l.to>A&&(o=l)}}return o}function Y4A(t){let e=t.lastChild;return e&&e.to==t.to&&e.type.isError}function th(t,e,A){for(let i of t.facet(Qx)){let n=i(t,e,A);if(n)return n}return O4A(t,e,A)}function Mq(t,e){let A=e.mapPos(t.from,1),i=e.mapPos(t.to,-1);return A>=i?void 0:{from:A,to:i}}var oh=Wi.define({map:Mq}),sf=Wi.define({map:Mq});function Sq(t){let e=[];for(let{head:A}of t.state.selection.ranges)e.some(i=>i.from<=A&&i.to>=A)||e.push(t.lineBlockAt(A));return e}var Ad=Ma.define({create(){return St.none},update(t,e){e.isUserEvent("delete")&&e.changes.iterChangedRanges((A,i)=>t=Qq(t,A,i)),t=t.map(e.changes);for(let A of e.effects)if(A.is(oh)&&!H4A(t,A.value.from,A.value.to)){let{preparePlaceholder:i}=e.state.facet(px),n=i?St.replace({widget:new gx(i(e.state,A.value))}):uq;t=t.update({add:[n.range(A.value.from,A.value.to)]})}else A.is(sf)&&(t=t.update({filter:(i,n)=>A.value.from!=i||A.value.to!=n,filterFrom:A.value.from,filterTo:A.value.to}));return e.selection&&(t=Qq(t,e.selection.main.head)),t},provide:t=>ci.decorations.from(t),toJSON(t,e){let A=[];return t.between(0,e.doc.length,(i,n)=>{A.push(i,n)}),A},fromJSON(t){if(!Array.isArray(t)||t.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let A=0;A{ne&&(i=!0)}),i?t.update({filterFrom:e,filterTo:A,filter:(n,o)=>n>=A||o<=e}):t}function Vw(t,e,A){var i;let n=null;return(i=t.field(Ad,!1))===null||i===void 0||i.between(e,A,(o,a)=>{(!n||n.from>o)&&(n={from:o,to:a})}),n}function H4A(t,e,A){let i=!1;return t.between(e,e,(n,o)=>{n==e&&o==A&&(i=!0)}),i}function kq(t,e){return t.field(Ad,!1)?e:e.concat(Wi.appendConfig.of(Rq()))}var z4A=t=>{for(let e of Sq(t)){let A=th(t.state,e.from,e.to);if(A)return t.dispatch({effects:kq(t.state,[oh.of(A),xq(t,A)])}),!0}return!1},ux=t=>{if(!t.state.field(Ad,!1))return!1;let e=[];for(let A of Sq(t)){let i=Vw(t.state,A.from,A.to);i&&e.push(sf.of(i),xq(t,i,!1))}return e.length&&t.dispatch({effects:e}),e.length>0};function xq(t,e,A=!0){let i=t.state.doc.lineAt(e.from).number,n=t.state.doc.lineAt(e.to).number;return ci.announce.of(`${t.state.phrase(A?"Folded lines":"Unfolded lines")} ${i} ${t.state.phrase("to")} ${n}.`)}var P4A=t=>{let{state:e}=t,A=[];for(let i=0;i{let e=t.state.field(Ad,!1);if(!e||!e.size)return!1;let A=[];return e.between(0,t.state.doc.length,(i,n)=>{A.push(sf.of({from:i,to:n}))}),t.dispatch({effects:A}),!0};var _q=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:z4A},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:ux},{key:"Ctrl-Alt-[",run:P4A},{key:"Ctrl-Alt-]",run:fx}],j4A={placeholderDOM:null,preparePlaceholder:null,placeholderText:"\u2026"},px=At.define({combine(t){return Mr(t,j4A)}});function Rq(t){let e=[Ad,V4A];return t&&e.push(px.of(t)),e}function Nq(t,e){let{state:A}=t,i=A.facet(px),n=a=>{let r=t.lineBlockAt(t.posAtDOM(a.target)),s=Vw(t.state,r.from,r.to);s&&t.dispatch({effects:sf.of(s)}),a.preventDefault()};if(i.placeholderDOM)return i.placeholderDOM(t,n,e);let o=document.createElement("span");return o.textContent=i.placeholderText,o.setAttribute("aria-label",A.phrase("folded code")),o.title=A.phrase("unfold"),o.className="cm-foldPlaceholder",o.onclick=n,o}var uq=St.replace({widget:new class extends sl{toDOM(t){return Nq(t,null)}}}),gx=class extends sl{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return Nq(e,this.value)}},q4A={openText:"\u2304",closedText:"\u203A",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1},of=class extends gl{constructor(e,A){super(),this.config=e,this.open=A}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let A=document.createElement("span");return A.textContent=this.open?this.config.openText:this.config.closedText,A.title=e.state.phrase(this.open?"Fold line":"Unfold line"),A}};function Fq(t={}){let e=gA(gA({},q4A),t),A=new of(e,!0),i=new of(e,!1),n=_o.fromClass(class{constructor(a){this.from=a.viewport.from,this.markers=this.buildMarkers(a)}update(a){(a.docChanged||a.viewportChanged||a.startState.facet(eI)!=a.state.facet(eI)||a.startState.field(Ad,!1)!=a.state.field(Ad,!1)||kr(a.startState)!=kr(a.state)||e.foldingChanged(a))&&(this.markers=this.buildMarkers(a.view))}buildMarkers(a){let r=new jr;for(let s of a.viewportLineBlocks){let l=Vw(a.state,s.from,s.to)?i:th(a.state,s.from,s.to)?A:null;l&&r.add(s.from,s.from,l)}return r.finish()}}),{domEventHandlers:o}=e;return[n,Kw({class:"cm-foldGutter",markers(a){var r;return((r=a.plugin(n))===null||r===void 0?void 0:r.markers)||io.empty},initialSpacer(){return new of(e,!1)},domEventHandlers:Ye(gA({},o),{click:(a,r,s)=>{if(o.click&&o.click(a,r,s))return!0;let l=Vw(a.state,r.from,r.to);if(l)return a.dispatch({effects:sf.of(l)}),!0;let g=th(a.state,r.from,r.to);return g?(a.dispatch({effects:oh.of(g)}),!0):!1}})}),Rq()]}var V4A=ci.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}}),ih=class t{constructor(e,A){this.specs=e;let i;function n(r){let s=cg.newName();return(i||(i=Object.create(null)))["."+s]=r,s}let o=typeof A.all=="string"?A.all:A.all?n(A.all):void 0,a=A.scope;this.scope=a instanceof gc?r=>r.prop(eh)==a.data:a?r=>r==a:void 0,this.style=tx(e.map(r=>({tag:r.tag,class:r.class||n(Object.assign({},r,{tag:null}))})),{all:o}).style,this.module=i?new cg(i):null,this.themeType=A.themeType}static define(e,A){return new t(e,A||{})}},cx=At.define(),Lq=At.define({combine(t){return t.length?[t[0]]:null}});function ox(t){let e=t.facet(cx);return e.length?e:t.facet(Lq)}function mx(t,e){let A=[W4A],i;return t instanceof ih&&(t.module&&A.push(ci.styleModule.of(t.module)),i=t.themeType),e?.fallback?A.push(Lq.of(t)):i?A.push(cx.computeN([ci.darkTheme],n=>n.facet(ci.darkTheme)==(i=="dark")?[t]:[])):A.push(cx.of(t)),A}var Cx=class{constructor(e){this.markCache=Object.create(null),this.tree=kr(e.state),this.decorations=this.buildDeco(e,ox(e.state)),this.decoratedTo=e.viewport.to}update(e){let A=kr(e.state),i=ox(e.state),n=i!=ox(e.startState),{viewport:o}=e.view,a=e.changes.mapPos(this.decoratedTo,1);A.length=o.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=a):(A!=this.tree||e.viewportChanged||n)&&(this.tree=A,this.decorations=this.buildDeco(e.view,i),this.decoratedTo=o.to)}buildDeco(e,A){if(!A||!this.tree.length)return St.none;let i=new jr;for(let{from:n,to:o}of e.visibleRanges)Bq(this.tree,A,(a,r,s)=>{i.add(a,r,this.markCache[s]||(this.markCache[s]=St.mark({class:s})))},n,o);return i.finish()}},W4A=oc.high(_o.fromClass(Cx,{decorations:t=>t.decorations})),Gq=ih.define([{tag:Fe.meta,color:"#404740"},{tag:Fe.link,textDecoration:"underline"},{tag:Fe.heading,textDecoration:"underline",fontWeight:"bold"},{tag:Fe.emphasis,fontStyle:"italic"},{tag:Fe.strong,fontWeight:"bold"},{tag:Fe.strikethrough,textDecoration:"line-through"},{tag:Fe.keyword,color:"#708"},{tag:[Fe.atom,Fe.bool,Fe.url,Fe.contentSeparator,Fe.labelName],color:"#219"},{tag:[Fe.literal,Fe.inserted],color:"#164"},{tag:[Fe.string,Fe.deleted],color:"#a11"},{tag:[Fe.regexp,Fe.escape,Fe.special(Fe.string)],color:"#e40"},{tag:Fe.definition(Fe.variableName),color:"#00f"},{tag:Fe.local(Fe.variableName),color:"#30a"},{tag:[Fe.typeName,Fe.namespace],color:"#085"},{tag:Fe.className,color:"#167"},{tag:[Fe.special(Fe.variableName),Fe.macroName],color:"#256"},{tag:Fe.definition(Fe.propertyName),color:"#00c"},{tag:Fe.comment,color:"#940"},{tag:Fe.invalid,color:"#f00"}]),Z4A=ci.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),Kq=1e4,Uq="()[]{}",Tq=At.define({combine(t){return Mr(t,{afterCursor:!0,brackets:Uq,maxScanDistance:Kq,renderMatch:AfA})}}),X4A=St.mark({class:"cm-matchingBracket"}),$4A=St.mark({class:"cm-nonmatchingBracket"});function AfA(t){let e=[],A=t.matched?X4A:$4A;return e.push(A.range(t.start.from,t.start.to)),t.end&&e.push(A.range(t.end.from,t.end.to)),e}function fq(t){let e=[],A=t.facet(Tq);for(let i of t.selection.ranges){if(!i.empty)continue;let n=cc(t,i.head,-1,A)||i.head>0&&cc(t,i.head-1,1,A)||A.afterCursor&&(cc(t,i.head,1,A)||i.headt.decorations}),tfA=[efA,Z4A];function Jq(t={}){return[Tq.of(t),tfA]}var ifA=new Ni;function Ix(t,e,A){let i=t.prop(e<0?Ni.openedBy:Ni.closedBy);if(i)return i;if(t.name.length==1){let n=A.indexOf(t.name);if(n>-1&&n%2==(e<0?1:0))return[A[n+e]]}return null}function dx(t){let e=t.type.prop(ifA);return e?e(t.node):t}function cc(t,e,A,i={}){let n=i.maxScanDistance||Kq,o=i.brackets||Uq,a=kr(t),r=a.resolveInner(e,A);for(let s=r;s;s=s.parent){let l=Ix(s.type,A,o);if(l&&s.from0?e>=g.from&&eg.from&&e<=g.to))return nfA(t,e,A,s,g,l,o)}}return ofA(t,e,A,a,r.type,n,o)}function nfA(t,e,A,i,n,o,a){let r=i.parent,s={from:n.from,to:n.to},l=0,g=r?.cursor();if(g&&(A<0?g.childBefore(i.from):g.childAfter(i.to)))do if(A<0?g.to<=i.from:g.from>=i.to){if(l==0&&o.indexOf(g.type.name)>-1&&g.from0)return null;let l={from:A<0?e-1:e,to:A>0?e+1:e},g=t.doc.iterRange(e,A>0?t.doc.length:0),C=0;for(let I=0;!g.next().done&&I<=o;){let d=g.value;A<0&&(I+=d.length);let h=e+I*A;for(let E=A>0?0:d.length-1,f=A>0?d.length:-1;E!=f;E+=A){let m=a.indexOf(d[E]);if(!(m<0||i.resolveInner(h+E,1).type!=n))if(m%2==0==A>0)C++;else{if(C==1)return{start:l,end:{from:h+E,to:h+E+1},matched:m>>1==s>>1};C--}}A>0&&(I+=d.length)}return g.done?{start:l,matched:!1}:null}var afA=Object.create(null),pq=[Qs.none];var mq=[],wq=Object.create(null),rfA=Object.create(null);for(let[t,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])rfA[t]=sfA(afA,e);function ax(t,e){mq.indexOf(t)>-1||(mq.push(t),console.warn(e))}function sfA(t,e){let A=[];for(let r of e.split(" ")){let s=[];for(let l of r.split(".")){let g=t[l]||Fe[l];g?typeof g=="function"?s.length?s=s.map(g):ax(l,`Modifier ${l} used at start of tag`):s.length?ax(l,`Tag ${l} used as modifier`):s=Array.isArray(g)?g:[g]:ax(l,`Unknown highlighting tag ${l}`)}for(let l of s)A.push(l)}if(!A.length)return 0;let i=e.replace(/ /g,"_"),n=i+" "+A.map(r=>r.id),o=wq[n];if(o)return o.id;let a=wq[n]=Qs.define({id:pq.length,name:i,props:[Pw({[i]:A})]});return pq.push(a),a.id}var zBe={rtl:St.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:mo.RTL}),ltr:St.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:mo.LTR}),auto:St.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var lfA=t=>{let{state:e}=t,A=e.doc.lineAt(e.selection.main.from),i=vx(t.state,A.from);return i.line?gfA(t):i.block?CfA(t):!1};function yx(t,e){return({state:A,dispatch:i})=>{if(A.readOnly)return!1;let n=t(e,A);return n?(i(A.update(n)),!0):!1}}var gfA=yx(BfA,0);var cfA=yx(Wq,0);var CfA=yx((t,e)=>Wq(t,e,dfA(e)),0);function vx(t,e){let A=t.languageDataAt("commentTokens",e,1);return A.length?A[0]:{}}var lf=50;function IfA(t,{open:e,close:A},i,n){let o=t.sliceDoc(i-lf,i),a=t.sliceDoc(n,n+lf),r=/\s*$/.exec(o)[0].length,s=/^\s*/.exec(a)[0].length,l=o.length-r;if(o.slice(l-e.length,l)==e&&a.slice(s,s+A.length)==A)return{open:{pos:i-r,margin:r&&1},close:{pos:n+s,margin:s&&1}};let g,C;n-i<=2*lf?g=C=t.sliceDoc(i,n):(g=t.sliceDoc(i,i+lf),C=t.sliceDoc(n-lf,n));let I=/^\s*/.exec(g)[0].length,d=/\s*$/.exec(C)[0].length,h=C.length-d-A.length;return g.slice(I,I+e.length)==e&&C.slice(h,h+A.length)==A?{open:{pos:i+I+e.length,margin:/\s/.test(g.charAt(I+e.length))?1:0},close:{pos:n-d-A.length,margin:/\s/.test(C.charAt(h-1))?1:0}}:null}function dfA(t){let e=[];for(let A of t.selection.ranges){let i=t.doc.lineAt(A.from),n=A.to<=i.to?i:t.doc.lineAt(A.to);n.from>i.from&&n.from==A.to&&(n=A.to==i.to+1?i:t.doc.lineAt(A.to-1));let o=e.length-1;o>=0&&e[o].to>i.from?e[o].to=n.to:e.push({from:i.from+/^\s*/.exec(i.text)[0].length,to:n.to})}return e}function Wq(t,e,A=e.selection.ranges){let i=A.map(o=>vx(e,o.from).block);if(!i.every(o=>o))return null;let n=A.map((o,a)=>IfA(e,i[a],o.from,o.to));if(t!=2&&!n.every(o=>o))return{changes:e.changes(A.map((o,a)=>n[a]?[]:[{from:o.from,insert:i[a].open+" "},{from:o.to,insert:" "+i[a].close}]))};if(t!=1&&n.some(o=>o)){let o=[];for(let a=0,r;an&&(o==a||a>C.from)){n=C.from;let I=/^\s*/.exec(C.text)[0].length,d=I==C.length,h=C.text.slice(I,I+l.length)==l?I:-1;Io.comment<0&&(!o.empty||o.single))){let o=[];for(let{line:r,token:s,indent:l,empty:g,single:C}of i)(C||!g)&&o.push({from:r.from+l,insert:s+" "});let a=e.changes(o);return{changes:a,selection:e.selection.map(a,1)}}else if(t!=1&&i.some(o=>o.comment>=0)){let o=[];for(let{line:a,comment:r,token:s}of i)if(r>=0){let l=a.from+r,g=l+s.length;a.text[g-a.from]==" "&&g++,o.push({from:l,to:g})}return{changes:o}}return null}function ah(t,e){return Ie.create(t.ranges.map(e),t.mainIndex)}function Ic(t,e){return t.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function dc({state:t,dispatch:e},A){let i=ah(t.selection,A);return i.eq(t.selection,!0)?!1:(e(Ic(t,i)),!0)}function Xw(t,e){return Ie.cursor(e?t.to:t.from)}function Zq(t,e){return dc(t,A=>A.empty?t.moveByChar(A,e):Xw(A,e))}function us(t){return t.textDirectionAt(t.state.selection.main.head)==mo.LTR}var Xq=t=>Zq(t,!us(t)),$q=t=>Zq(t,us(t));function AV(t,e){return dc(t,A=>A.empty?t.moveByGroup(A,e):Xw(A,e))}var EfA=t=>AV(t,!us(t)),hfA=t=>AV(t,us(t));var tEe=typeof Intl<"u"&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null;function QfA(t,e,A){if(e.type.prop(A))return!0;let i=e.to-e.from;return i&&(i>2||/[^\s,.;:]/.test(t.sliceDoc(e.from,e.to)))||e.firstChild}function $w(t,e,A){let i=kr(t).resolveInner(e.head),n=A?Ni.closedBy:Ni.openedBy;for(let s=e.head;;){let l=A?i.childAfter(s):i.childBefore(s);if(!l)break;QfA(t,l,n)?i=l:s=A?l.to:l.from}let o=i.type.prop(n),a,r;return o&&(a=A?cc(t,i.from,1):cc(t,i.to,-1))&&a.matched?r=A?a.end.to:a.end.from:r=A?i.to:i.from,Ie.cursor(r,A?-1:1)}var ufA=t=>dc(t,e=>$w(t.state,e,!us(t))),ffA=t=>dc(t,e=>$w(t.state,e,us(t)));function eV(t,e){return dc(t,A=>{if(!A.empty)return Xw(A,e);let i=t.moveVertically(A,e);return i.head!=A.head?i:t.moveToLineBoundary(A,e)})}var tV=t=>eV(t,!1),iV=t=>eV(t,!0);function nV(t){let e=t.scrollDOM.clientHeighta.empty?t.moveVertically(a,e,A.height):Xw(a,e));if(n.eq(i.selection))return!1;let o;if(A.selfScroll){let a=t.coordsAtPos(i.selection.main.head),r=t.scrollDOM.getBoundingClientRect(),s=r.top+A.marginTop,l=r.bottom-A.marginBottom;a&&a.top>s&&a.bottomoV(t,!1),wx=t=>oV(t,!0);function tI(t,e,A){let i=t.lineBlockAt(e.head),n=t.moveToLineBoundary(e,A);if(n.head==e.head&&n.head!=(A?i.to:i.from)&&(n=t.moveToLineBoundary(e,A,!1)),!A&&n.head==i.from&&i.length){let o=/^\s*/.exec(t.state.sliceDoc(i.from,Math.min(i.from+100,i.to)))[0].length;o&&e.head!=i.from+o&&(n=Ie.cursor(i.from+o))}return n}var pfA=t=>dc(t,e=>tI(t,e,!0)),mfA=t=>dc(t,e=>tI(t,e,!1)),wfA=t=>dc(t,e=>tI(t,e,!us(t))),DfA=t=>dc(t,e=>tI(t,e,us(t))),yfA=t=>dc(t,e=>Ie.cursor(t.lineBlockAt(e.head).from,1)),vfA=t=>dc(t,e=>Ie.cursor(t.lineBlockAt(e.head).to,-1));function bfA(t,e,A){let i=!1,n=ah(t.selection,o=>{let a=cc(t,o.head,-1)||cc(t,o.head,1)||o.head>0&&cc(t,o.head-1,1)||o.headbfA(t,e,!1);function Bg(t,e){let A=ah(t.state.selection,i=>{let n=e(i);return Ie.range(i.anchor,n.head,n.goalColumn,n.bidiLevel||void 0,n.assoc)});return A.eq(t.state.selection)?!1:(t.dispatch(Ic(t.state,A)),!0)}function aV(t,e){return Bg(t,A=>t.moveByChar(A,e))}var rV=t=>aV(t,!us(t)),sV=t=>aV(t,us(t));function lV(t,e){return Bg(t,A=>t.moveByGroup(A,e))}var SfA=t=>lV(t,!us(t)),kfA=t=>lV(t,us(t));var xfA=t=>Bg(t,e=>$w(t.state,e,!us(t))),_fA=t=>Bg(t,e=>$w(t.state,e,us(t)));function gV(t,e){return Bg(t,A=>t.moveVertically(A,e))}var cV=t=>gV(t,!1),CV=t=>gV(t,!0);function IV(t,e){return Bg(t,A=>t.moveVertically(A,e,nV(t).height))}var Yq=t=>IV(t,!1),Hq=t=>IV(t,!0),RfA=t=>Bg(t,e=>tI(t,e,!0)),NfA=t=>Bg(t,e=>tI(t,e,!1)),FfA=t=>Bg(t,e=>tI(t,e,!us(t))),LfA=t=>Bg(t,e=>tI(t,e,us(t))),GfA=t=>Bg(t,e=>Ie.cursor(t.lineBlockAt(e.head).from)),KfA=t=>Bg(t,e=>Ie.cursor(t.lineBlockAt(e.head).to)),zq=({state:t,dispatch:e})=>(e(Ic(t,{anchor:0})),!0),Pq=({state:t,dispatch:e})=>(e(Ic(t,{anchor:t.doc.length})),!0),jq=({state:t,dispatch:e})=>(e(Ic(t,{anchor:t.selection.main.anchor,head:0})),!0),qq=({state:t,dispatch:e})=>(e(Ic(t,{anchor:t.selection.main.anchor,head:t.doc.length})),!0),UfA=({state:t,dispatch:e})=>(e(t.update({selection:{anchor:0,head:t.doc.length},userEvent:"select"})),!0),TfA=({state:t,dispatch:e})=>{let A=A5(t).map(({from:i,to:n})=>Ie.range(i,Math.min(n+1,t.doc.length)));return e(t.update({selection:Ie.create(A),userEvent:"select"})),!0},JfA=({state:t,dispatch:e})=>{let A=ah(t.selection,i=>{let n=kr(t),o=n.resolveStack(i.from,1);if(i.empty){let a=n.resolveStack(i.from,-1);a.node.from>=o.node.from&&a.node.to<=o.node.to&&(o=a)}for(let a=o;a;a=a.next){let{node:r}=a;if((r.from=i.to||r.to>i.to&&r.from<=i.from)&&a.next)return Ie.range(r.to,r.from)}return i});return A.eq(t.selection)?!1:(e(Ic(t,A)),!0)};function dV(t,e){let{state:A}=t,i=A.selection,n=A.selection.ranges.slice();for(let o of A.selection.ranges){let a=A.doc.lineAt(o.head);if(e?a.to0)for(let r=o;;){let s=t.moveVertically(r,e);if(s.heada.to){n.some(l=>l.head==s.head)||n.push(s);break}else{if(s.head==r.head)break;r=s}}}return n.length==i.ranges.length?!1:(t.dispatch(Ic(A,Ie.create(n,n.length-1))),!0)}var OfA=t=>dV(t,!1),YfA=t=>dV(t,!0),HfA=({state:t,dispatch:e})=>{let A=t.selection,i=null;return A.ranges.length>1?i=Ie.create([A.main]):A.main.empty||(i=Ie.create([Ie.cursor(A.main.head)])),i?(e(Ic(t,i)),!0):!1};function gf(t,e){if(t.state.readOnly)return!1;let A="delete.selection",{state:i}=t,n=i.changeByRange(o=>{let{from:a,to:r}=o;if(a==r){let s=e(o);sa&&(A="delete.forward",s=Zw(t,s,!0)),a=Math.min(a,s),r=Math.max(r,s)}else a=Zw(t,a,!1),r=Zw(t,r,!0);return a==r?{range:o}:{changes:{from:a,to:r},range:Ie.cursor(a,an(t)))i.between(e,e,(n,o)=>{ne&&(e=A?o:n)});return e}var BV=(t,e,A)=>gf(t,i=>{let n=i.from,{state:o}=t,a=o.doc.lineAt(n),r,s;if(A&&!e&&n>a.from&&nBV(t,!1,!0);var EV=t=>BV(t,!0,!1),hV=(t,e)=>gf(t,A=>{let i=A.head,{state:n}=t,o=n.doc.lineAt(i),a=n.charCategorizer(i);for(let r=null;;){if(i==(e?o.to:o.from)){i==A.head&&o.number!=(e?n.doc.lines:1)&&(i+=e?1:-1);break}let s=ja(o.text,i-o.from,e)+o.from,l=o.text.slice(Math.min(i,s)-o.from,Math.max(i,s)-o.from),g=a(l);if(r!=null&&g!=r)break;(l!=" "||i!=A.head)&&(r=g),i=s}return i}),QV=t=>hV(t,!1),zfA=t=>hV(t,!0);var PfA=t=>gf(t,e=>{let A=t.lineBlockAt(e.head).to;return e.headgf(t,e=>{let A=t.moveToLineBoundary(e,!1).head;return e.head>A?A:Math.max(0,e.head-1)}),qfA=t=>gf(t,e=>{let A=t.moveToLineBoundary(e,!0).head;return e.head{if(t.readOnly)return!1;let A=t.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:bn.of(["",""])},range:Ie.cursor(i.from)}));return e(t.update(A,{scrollIntoView:!0,userEvent:"input"})),!0},WfA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let A=t.changeByRange(i=>{if(!i.empty||i.from==0||i.from==t.doc.length)return{range:i};let n=i.from,o=t.doc.lineAt(n),a=n==o.from?n-1:ja(o.text,n-o.from,!1)+o.from,r=n==o.to?n+1:ja(o.text,n-o.from,!0)+o.from;return{changes:{from:a,to:r,insert:t.doc.slice(n,r).append(t.doc.slice(a,n))},range:Ie.cursor(r)}});return A.changes.empty?!1:(e(t.update(A,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function A5(t){let e=[],A=-1;for(let i of t.selection.ranges){let n=t.doc.lineAt(i.from),o=t.doc.lineAt(i.to);if(!i.empty&&i.to==o.from&&(o=t.doc.lineAt(i.to-1)),A>=n.number){let a=e[e.length-1];a.to=o.to,a.ranges.push(i)}else e.push({from:n.from,to:o.to,ranges:[i]});A=o.number+1}return e}function uV(t,e,A){if(t.readOnly)return!1;let i=[],n=[];for(let o of A5(t)){if(A?o.to==t.doc.length:o.from==0)continue;let a=t.doc.lineAt(A?o.to+1:o.from-1),r=a.length+1;if(A){i.push({from:o.to,to:a.to},{from:o.from,insert:a.text+t.lineBreak});for(let s of o.ranges)n.push(Ie.range(Math.min(t.doc.length,s.anchor+r),Math.min(t.doc.length,s.head+r)))}else{i.push({from:a.from,to:o.from},{from:o.to,insert:t.lineBreak+a.text});for(let s of o.ranges)n.push(Ie.range(s.anchor-r,s.head-r))}}return i.length?(e(t.update({changes:i,scrollIntoView:!0,selection:Ie.create(n,t.selection.mainIndex),userEvent:"move.line"})),!0):!1}var ZfA=({state:t,dispatch:e})=>uV(t,e,!1),XfA=({state:t,dispatch:e})=>uV(t,e,!0);function fV(t,e,A){if(t.readOnly)return!1;let i=[];for(let o of A5(t))A?i.push({from:o.from,insert:t.doc.slice(o.from,o.to)+t.lineBreak}):i.push({from:o.to,insert:t.lineBreak+t.doc.slice(o.from,o.to)});let n=t.changes(i);return e(t.update({changes:n,selection:t.selection.map(n,A?1:-1),scrollIntoView:!0,userEvent:"input.copyline"})),!0}var $fA=({state:t,dispatch:e})=>fV(t,e,!1),A3A=({state:t,dispatch:e})=>fV(t,e,!0),e3A=t=>{if(t.state.readOnly)return!1;let{state:e}=t,A=e.changes(A5(e).map(({from:n,to:o})=>(n>0?n--:o{let o;if(t.lineWrapping){let a=t.lineBlockAt(n.head),r=t.coordsAtPos(n.head,n.assoc||1);r&&(o=a.bottom+t.documentTop-r.bottom+t.defaultLineHeight/2)}return t.moveVertically(n,!0,o)}).map(A);return t.dispatch({changes:A,selection:i,scrollIntoView:!0,userEvent:"delete.line"}),!0};function t3A(t,e){if(/\(\)|\[\]|\{\}/.test(t.sliceDoc(e-1,e+1)))return{from:e,to:e};let A=kr(t).resolveInner(e),i=A.childBefore(e),n=A.childAfter(e),o;return i&&n&&i.to<=e&&n.from>=e&&(o=i.type.prop(Ni.closedBy))&&o.indexOf(n.name)>-1&&t.doc.lineAt(i.to).from==t.doc.lineAt(n.from).from&&!/\S/.test(t.sliceDoc(i.to,n.from))?{from:i.to,to:n.from}:null}var Vq=pV(!1),i3A=pV(!0);function pV(t){return({state:e,dispatch:A})=>{if(e.readOnly)return!1;let i=e.changeByRange(n=>{let{from:o,to:a}=n,r=e.doc.lineAt(o),s=!t&&o==a&&t3A(e,o);t&&(o=a=(a<=r.to?r:e.doc.lineAt(a)).to);let l=new $1(e,{simulateBreak:o,simulateDoubleBreak:!!s}),g=Ww(l,o);for(g==null&&(g=dC(/^\s*/.exec(e.doc.lineAt(o).text)[0],e.tabSize));ar.from&&o{let n=[];for(let a=i.from;a<=i.to;){let r=t.doc.lineAt(a);r.number>A&&(i.empty||i.to>r.from)&&(e(r,n,i),A=r.number),a=r.to+1}let o=t.changes(n);return{changes:n,range:Ie.range(o.mapPos(i.anchor,1),o.mapPos(i.head,1))}})}var n3A=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let A=Object.create(null),i=new $1(t,{overrideIndentation:o=>{let a=A[o];return a??-1}}),n=bx(t,(o,a,r)=>{let s=Ww(i,o.from);if(s==null)return;/\S/.test(o.text)||(s=0);let l=/^\s*/.exec(o.text)[0],g=nh(t,s);(l!=g||r.fromt.readOnly?!1:(e(t.update(bx(t,(A,i)=>{i.push({from:A.from,insert:t.facet(ed)})}),{userEvent:"input.indent"})),!0),wV=({state:t,dispatch:e})=>t.readOnly?!1:(e(t.update(bx(t,(A,i)=>{let n=/^\s*/.exec(A.text)[0];if(!n)return;let o=dC(n,t.tabSize),a=0,r=nh(t,Math.max(0,o-Cc(t)));for(;a(t.setTabFocusMode(),!0);var a3A=[{key:"Ctrl-b",run:Xq,shift:rV,preventDefault:!0},{key:"Ctrl-f",run:$q,shift:sV},{key:"Ctrl-p",run:tV,shift:cV},{key:"Ctrl-n",run:iV,shift:CV},{key:"Ctrl-a",run:yfA,shift:GfA},{key:"Ctrl-e",run:vfA,shift:KfA},{key:"Ctrl-d",run:EV},{key:"Ctrl-h",run:Dx},{key:"Ctrl-k",run:PfA},{key:"Ctrl-Alt-h",run:QV},{key:"Ctrl-o",run:VfA},{key:"Ctrl-t",run:WfA},{key:"Ctrl-v",run:wx}],r3A=[{key:"ArrowLeft",run:Xq,shift:rV,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:EfA,shift:SfA,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:wfA,shift:FfA,preventDefault:!0},{key:"ArrowRight",run:$q,shift:sV,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:hfA,shift:kfA,preventDefault:!0},{mac:"Cmd-ArrowRight",run:DfA,shift:LfA,preventDefault:!0},{key:"ArrowUp",run:tV,shift:cV,preventDefault:!0},{mac:"Cmd-ArrowUp",run:zq,shift:jq},{mac:"Ctrl-ArrowUp",run:Oq,shift:Yq},{key:"ArrowDown",run:iV,shift:CV,preventDefault:!0},{mac:"Cmd-ArrowDown",run:Pq,shift:qq},{mac:"Ctrl-ArrowDown",run:wx,shift:Hq},{key:"PageUp",run:Oq,shift:Yq},{key:"PageDown",run:wx,shift:Hq},{key:"Home",run:mfA,shift:NfA,preventDefault:!0},{key:"Mod-Home",run:zq,shift:jq},{key:"End",run:pfA,shift:RfA,preventDefault:!0},{key:"Mod-End",run:Pq,shift:qq},{key:"Enter",run:Vq,shift:Vq},{key:"Mod-a",run:UfA},{key:"Backspace",run:Dx,shift:Dx,preventDefault:!0},{key:"Delete",run:EV,preventDefault:!0},{key:"Mod-Backspace",mac:"Alt-Backspace",run:QV,preventDefault:!0},{key:"Mod-Delete",mac:"Alt-Delete",run:zfA,preventDefault:!0},{mac:"Mod-Backspace",run:jfA,preventDefault:!0},{mac:"Mod-Delete",run:qfA,preventDefault:!0}].concat(a3A.map(t=>({mac:t.key,run:t.run,shift:t.shift}))),DV=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:ufA,shift:xfA},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:ffA,shift:_fA},{key:"Alt-ArrowUp",run:ZfA},{key:"Shift-Alt-ArrowUp",run:$fA},{key:"Alt-ArrowDown",run:XfA},{key:"Shift-Alt-ArrowDown",run:A3A},{key:"Mod-Alt-ArrowUp",run:OfA},{key:"Mod-Alt-ArrowDown",run:YfA},{key:"Escape",run:HfA},{key:"Mod-Enter",run:i3A},{key:"Alt-l",mac:"Ctrl-l",run:TfA},{key:"Mod-i",run:JfA,preventDefault:!0},{key:"Mod-[",run:wV},{key:"Mod-]",run:mV},{key:"Mod-Alt-\\",run:n3A},{key:"Shift-Mod-k",run:e3A},{key:"Shift-Mod-\\",run:MfA},{key:"Mod-/",run:lfA},{key:"Alt-A",run:cfA},{key:"Ctrl-m",mac:"Shift-Alt-m",run:o3A}].concat(r3A),yV={key:"Tab",run:mV,shift:wV};var i5=class{constructor(e,A,i){this.from=e,this.to=A,this.diagnostic=i}},td=class t{constructor(e,A,i){this.diagnostics=e,this.panel=A,this.selected=i}static init(e,A,i){let n=i.facet(p0).markerFilter;n&&(e=n(e,i));let o=e.slice().sort((d,h)=>d.from-h.from||d.to-h.to),a=new jr,r=[],s=0,l=i.doc.iter(),g=0,C=i.doc.length;for(let d=0;;){let h=d==o.length?null:o[d];if(!h&&!r.length)break;let E,f;if(r.length)E=s,f=r.reduce((k,S)=>Math.min(k,S.to),h&&h.from>E?h.from:1e8);else{if(E=h.from,E>C)break;f=h.to,r.push(h),d++}for(;dk.from||k.to==E))r.push(k),d++,f=Math.min(k.to,f);else{f=Math.min(k.from,f);break}}f=Math.min(f,C);let m=!1;if(r.some(k=>k.from==E&&(k.to==f||f==C))&&(m=E==f,!m&&f-E<10)){let k=E-(g+l.value.length);k>0&&(l.next(k),g=E);for(let S=E;;){if(S>=f){m=!0;break}if(!l.lineBreak&&g+l.value.length>S)break;S=g+l.value.length,g+=l.value.length,l.next()}}let v=LV(r);if(m)a.add(E,E,St.widget({widget:new Mx(v),diagnostics:r.slice()}));else{let k=r.reduce((S,b)=>b.markClass?S+" "+b.markClass:S,"");a.add(E,f,St.mark({class:"cm-lintRange cm-lintRange-"+v+k,diagnostics:r.slice(),inclusiveEnd:r.some(S=>S.to>f)}))}if(s=f,s==C)break;for(let k=0;k{if(!(e&&a.diagnostics.indexOf(e)<0))if(!i)i=new i5(n,o,e||a.diagnostics[0]);else{if(a.diagnostics.indexOf(i.diagnostic)<0)return!1;i=new i5(i.from,o,i.diagnostic)}}),i}function MV(t,e){let A=e.pos,i=e.end||A,n=t.state.facet(p0).hideOn(t,A,i);if(n!=null)return n;let o=t.startState.doc.lineAt(e.pos);return!!(t.effects.some(a=>a.is(a5))||t.changes.touchesRange(o.from,Math.max(o.to,i)))}function SV(t,e){return t.field(Nl,!1)?e:e.concat(Wi.appendConfig.of(KV))}function s3A(t,e){return{effects:SV(t,[a5.of(e)])}}var a5=Wi.define(),kx=Wi.define(),kV=Wi.define(),Nl=Ma.define({create(){return new td(St.none,null,null)},update(t,e){if(e.docChanged&&t.diagnostics.size){let A=t.diagnostics.map(e.changes),i=null,n=t.panel;if(t.selected){let o=e.changes.mapPos(t.selected.from,1);i=iI(A,t.selected.diagnostic,o)||iI(A,null,o)}!A.size&&n&&e.state.facet(p0).autoPanel&&(n=null),t=new td(A,n,i)}for(let A of e.effects)if(A.is(a5)){let i=e.state.facet(p0).autoPanel?A.value.length?cf.open:null:t.panel;t=td.init(A.value,i,e.state)}else A.is(kx)?t=new td(t.diagnostics,A.value?cf.open:null,t.selected):A.is(kV)&&(t=new td(t.diagnostics,t.panel,A.value));return t},provide:t=>[q1.from(t,e=>e.panel),ci.decorations.from(t,e=>e.diagnostics)]});var l3A=St.mark({class:"cm-lintRange cm-lintRange-active"});function g3A(t,e,A){let{diagnostics:i}=t.state.field(Nl),n,o=-1,a=-1;i.between(e-(A<0?1:0),e+(A>0?1:0),(s,l,{spec:g})=>{if(e>=s&&e<=l&&(s==l||(e>s||A>0)&&(eFV(t,A,!1)))}var c3A=t=>{let e=t.state.field(Nl,!1);(!e||!e.panel)&&t.dispatch({effects:SV(t.state,[kx.of(!0)])});let A=W4(t,cf.open);return A&&A.dom.querySelector(".cm-panel-lint ul").focus(),!0},vV=t=>{let e=t.state.field(Nl,!1);return!e||!e.panel?!1:(t.dispatch({effects:kx.of(!1)}),!0)},C3A=t=>{let e=t.state.field(Nl,!1);if(!e)return!1;let A=t.state.selection.main,i=iI(e.diagnostics,null,A.to+1);return!i&&(i=iI(e.diagnostics,null,0),!i||i.from==A.from&&i.to==A.to)?!1:(t.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0}),!0)};var _V=[{key:"Mod-Shift-m",run:c3A,preventDefault:!0},{key:"F8",run:C3A}],I3A=_o.fromClass(class{constructor(t){this.view=t,this.timeout=-1,this.set=!0;let{delay:e}=t.state.facet(p0);this.lintTime=Date.now()+e,this.run=this.run.bind(this),this.timeout=setTimeout(this.run,e)}run(){clearTimeout(this.timeout);let t=Date.now();if(tPromise.resolve(i(this.view))),i=>{this.view.state.doc==e.doc&&this.view.dispatch(s3A(this.view.state,i.reduce((n,o)=>n.concat(o))))},i=>{Sr(this.view.state,i)})}}update(t){let e=t.state.facet(p0);(t.docChanged||e!=t.startState.facet(p0)||e.needsRefresh&&e.needsRefresh(t))&&(this.lintTime=Date.now()+e.delay,this.set||(this.set=!0,this.timeout=setTimeout(this.run,e.delay)))}force(){this.set&&(this.lintTime=Date.now(),this.run())}destroy(){clearTimeout(this.timeout)}});function d3A(t,e,A){let i=[],n=-1;for(let o of t)o.then(a=>{i.push(a),clearTimeout(n),i.length==t.length?e(i):n=setTimeout(()=>e(i),200)},A)}var p0=At.define({combine(t){return gA({sources:t.map(e=>e.source).filter(e=>e!=null)},Mr(t.map(e=>e.config),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{delay:Math.max,markerFilter:bV,tooltipFilter:bV,needsRefresh:(e,A)=>e?A?i=>e(i)||A(i):e:A,hideOn:(e,A)=>e?A?(i,n,o)=>e(i,n,o)||A(i,n,o):e:A,autoPanel:(e,A)=>e||A}))}});function bV(t,e){return t?e?(A,i)=>e(t(A,i),i):t:e}function RV(t,e={}){return[p0.of({source:t,config:e}),I3A,KV]}function NV(t){let e=[];if(t)A:for(let{name:A}of t){for(let i=0;io.toLowerCase()==n.toLowerCase())){e.push(n);continue A}}e.push("")}return e}function FV(t,e,A){var i;let n=A?NV(e.actions):[];return no("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},no("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage(t):e.message),(i=e.actions)===null||i===void 0?void 0:i.map((o,a)=>{let r=!1,s=d=>{if(d.preventDefault(),r)return;r=!0;let h=iI(t.state.field(Nl).diagnostics,e);h&&o.apply(t,h.from,h.to)},{name:l}=o,g=n[a]?l.indexOf(n[a]):-1,C=g<0?l:[l.slice(0,g),no("u",l.slice(g,g+1)),l.slice(g+1)],I=o.markClass?" "+o.markClass:"";return no("button",{type:"button",class:"cm-diagnosticAction"+I,onclick:s,onmousedown:s,"aria-label":` Action: ${l}${g<0?"":` (access key "${n[a]})"`}.`},C)}),e.source&&no("div",{class:"cm-diagnosticSource"},e.source))}var Mx=class extends sl{constructor(e){super(),this.sev=e}eq(e){return e.sev==this.sev}toDOM(){return no("span",{class:"cm-lintPoint cm-lintPoint-"+this.sev})}},n5=class{constructor(e,A){this.diagnostic=A,this.id="item_"+Math.floor(Math.random()*4294967295).toString(16),this.dom=FV(e,A,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}},cf=class t{constructor(e){this.view=e,this.items=[];let A=n=>{if(!(n.ctrlKey||n.altKey||n.metaKey)){if(n.keyCode==27)vV(this.view),this.view.focus();else if(n.keyCode==38||n.keyCode==33)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(n.keyCode==40||n.keyCode==34)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(n.keyCode==36)this.moveSelection(0);else if(n.keyCode==35)this.moveSelection(this.items.length-1);else if(n.keyCode==13)this.view.focus();else if(n.keyCode>=65&&n.keyCode<=90&&this.selectedIndex>=0){let{diagnostic:o}=this.items[this.selectedIndex],a=NV(o.actions);for(let r=0;r{for(let o=0;ovV(this.view)},"\xD7")),this.update()}get selectedIndex(){let e=this.view.state.field(Nl).selected;if(!e)return-1;for(let A=0;A{for(let g of l.diagnostics){if(a.has(g))continue;a.add(g);let C=-1,I;for(let d=i;di&&(this.items.splice(i,C-i),n=!0)),A&&I.diagnostic==A.diagnostic?I.dom.hasAttribute("aria-selected")||(I.dom.setAttribute("aria-selected","true"),o=I):I.dom.hasAttribute("aria-selected")&&I.dom.removeAttribute("aria-selected"),i++}});i({sel:o.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:r,panel:s})=>{let l=s.height/this.list.offsetHeight;r.tops.bottom&&(this.list.scrollTop+=(r.bottom-s.bottom)/l)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let e=this.list.firstChild;function A(){let i=e;e=i.nextSibling,i.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;e!=i.dom;)A();e=i.dom.nextSibling}else this.list.insertBefore(i.dom,e);for(;e;)A()}moveSelection(e){if(this.selectedIndex<0)return;let A=this.view.state.field(Nl),i=iI(A.diagnostics,this.items[e].diagnostic);i&&this.view.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0,effects:kV.of(i)})}static open(e){return new t(e)}};function t5(t,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(t)}')`}function e5(t){return t5(``,'width="6" height="3"')}var B3A=ci.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:e5("#d11")},".cm-lintRange-warning":{backgroundImage:e5("orange")},".cm-lintRange-info":{backgroundImage:e5("#999")},".cm-lintRange-hint":{backgroundImage:e5("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}},"&dark .cm-lintRange-active":{backgroundColor:"#86714a80"},"&dark .cm-panel.cm-panel-lint ul":{"& [aria-selected]":{backgroundColor:"#2e343e"}}});function E3A(t){return t=="error"?4:t=="warning"?3:t=="info"?2:1}function LV(t){let e="hint",A=1;for(let i of t){let n=E3A(i.severity);n>A&&(A=n,e=i.severity)}return e}var o5=class extends gl{constructor(e){super(),this.diagnostics=e,this.severity=LV(e)}toDOM(e){let A=document.createElement("div");A.className="cm-lint-marker cm-lint-marker-"+this.severity;let i=this.diagnostics,n=e.state.facet(r5).tooltipFilter;return n&&(i=n(i,e.state)),i.length&&(A.onmouseover=()=>Q3A(e,A,i)),A}};function h3A(t,e){let A=i=>{let n=e.getBoundingClientRect();if(!(i.clientX>n.left-10&&i.clientXn.top-10&&i.clientYe.getBoundingClientRect()}}})}),e.onmouseout=e.onmousemove=null,h3A(t,e)}let{hoverTime:n}=t.state.facet(r5),o=setTimeout(i,n);e.onmouseout=()=>{clearTimeout(o),e.onmouseout=e.onmousemove=null},e.onmousemove=()=>{clearTimeout(o),o=setTimeout(i,n)}}function u3A(t,e){let A=Object.create(null);for(let n of e){let o=t.lineAt(n.from);(A[o.from]||(A[o.from]=[])).push(n)}let i=[];for(let n in A)i.push(new o5(A[n]).range(+n));return io.of(i,!0)}var f3A=Kw({class:"cm-gutter-lint",markers:t=>t.state.field(Sx),widgetMarker:(t,e,A)=>{let i=[];return t.state.field(Sx).between(A.from,A.to,(n,o,a)=>{n>A.from&&ni.is(xx)?i.value:A,t)},provide:t=>$E.from(t)}),p3A=ci.baseTheme({".cm-gutter-lint":{width:"1.4em","& .cm-gutterElement":{padding:".2em"}},".cm-lint-marker":{width:"1em",height:"1em"},".cm-lint-marker-info":{content:t5('')},".cm-lint-marker-warning":{content:t5('')},".cm-lint-marker-error":{content:t5('')}}),KV=[Nl,ci.decorations.compute([Nl],t=>{let{selected:e,panel:A}=t.field(Nl);return!e||!A||e.from==e.to?St.none:St.set([l3A.range(e.from,e.to)])}),$j(g3A,{hideOn:MV}),B3A],r5=At.define({combine(t){return Mr(t,{hoverTime:300,markerFilter:null,tooltipFilter:null})}});function UV(t={}){return[r5.of(t),Sx,f3A,p3A,GV]}var Rx=class t{constructor(e,A,i,n,o,a,r,s,l,g=0,C){this.p=e,this.stack=A,this.state=i,this.reducePos=n,this.pos=o,this.score=a,this.buffer=r,this.bufferBase=s,this.curContext=l,this.lookAhead=g,this.parent=C}toString(){return`[${this.stack.filter((e,A)=>A%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,A,i=0){let n=e.parser.context;return new t(e,[],A,i,i,0,[],0,n?new s5(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,A){this.stack.push(this.state,A,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var A;let i=e>>19,n=e&65535,{parser:o}=this.p,a=this.reducePos=2e3&&!(!((A=this.p.parser.nodeSet.types[n])===null||A===void 0)&&A.isAnonymous)&&(l==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=g):this.p.lastBigReductionSizes;)this.stack.pop();this.reduceContext(n,l)}storeNode(e,A,i,n=4,o=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&a.buffer[r-4]==0&&a.buffer[r-1]>-1){if(A==i)return;if(a.buffer[r-2]>=A){a.buffer[r-2]=i;return}}}if(!o||this.pos==i)this.buffer.push(e,A,i,n);else{let a=this.buffer.length;if(a>0&&(this.buffer[a-4]!=0||this.buffer[a-1]<0)){let r=!1;for(let s=a;s>0&&this.buffer[s-2]>i;s-=4)if(this.buffer[s-1]>=0){r=!0;break}if(r)for(;a>0&&this.buffer[a-2]>i;)this.buffer[a]=this.buffer[a-4],this.buffer[a+1]=this.buffer[a-3],this.buffer[a+2]=this.buffer[a-2],this.buffer[a+3]=this.buffer[a-1],a-=4,n>4&&(n-=4)}this.buffer[a]=e,this.buffer[a+1]=A,this.buffer[a+2]=i,this.buffer[a+3]=n}}shift(e,A,i,n){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let o=e,{parser:a}=this.p;this.pos=n;let r=a.stateFlag(o,1);!r&&(n>i||A<=a.maxNode)&&(this.reducePos=n),this.pushState(o,r?i:Math.min(i,this.reducePos)),this.shiftContext(A,i),A<=a.maxNode&&this.buffer.push(A,i,n,4)}else this.pos=n,this.shiftContext(A,i),A<=this.p.parser.maxNode&&this.buffer.push(A,i,n,4)}apply(e,A,i,n){e&65536?this.reduce(e):this.shift(e,A,i,n)}useNode(e,A){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=e)&&(this.p.reused.push(e),i++);let n=this.pos;this.reducePos=this.pos=n+e.length,this.pushState(A,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,A=e.buffer.length;for(;A>0&&e.buffer[A-2]>e.reducePos;)A-=4;let i=e.buffer.slice(A),n=e.bufferBase+A;for(;e&&n==e.bufferBase;)e=e.parent;return new t(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,e)}recoverByDelete(e,A){let i=e<=this.p.parser.maxNode;i&&this.storeNode(e,this.pos,A,4),this.storeNode(0,this.pos,A,i?8:4),this.pos=this.reducePos=A,this.score-=190}canShift(e){for(let A=new Nx(this);;){let i=this.p.parser.stateSlot(A.state,4)||this.p.parser.hasAction(A.state,e);if(i==0)return!1;if((i&65536)==0)return!0;A.reduce(i)}}recoverByInsert(e){if(this.stack.length>=300)return[];let A=this.p.parser.nextStates(this.state);if(A.length>8||this.stack.length>=120){let n=[];for(let o=0,a;os&1&&r==a)||n.push(A[o],a)}A=n}let i=[];for(let n=0;n>19,n=A&65535,o=this.stack.length-i*3;if(o<0||e.getGoto(this.stack[o],n,!1)<0){let a=this.findForcedReduction();if(a==null)return!1;A=a}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(A),!0}findForcedReduction(){let{parser:e}=this.p,A=[],i=(n,o)=>{if(!A.includes(n))return A.push(n),e.allActions(n,a=>{if(!(a&393216))if(a&65536){let r=(a>>19)-o;if(r>1){let s=a&65535,l=this.stack.length-r*3;if(l>=0&&e.getGoto(this.stack[l],s,!1)>=0)return r<<19|65536|s}}else{let r=i(a,o+1);if(r!=null)return r}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let A=0;A0&&this.emitLookAhead()}},s5=class{constructor(e,A){this.tracker=e,this.context=A,this.hash=e.strict?e.hash(A):0}},Nx=class{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let A=e&65535,i=e>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let n=this.start.p.parser.getGoto(this.stack[this.base-3],A,!0);this.state=n}},Fx=class t{constructor(e,A,i){this.stack=e,this.pos=A,this.index=i,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,A=e.bufferBase+e.buffer.length){return new t(e,A,A-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new t(this.stack,this.pos,this.index)}};function Cf(t,e=Uint16Array){if(typeof t!="string")return t;let A=null;for(let i=0,n=0;i=92&&a--,a>=34&&a--;let s=a-32;if(s>=46&&(s-=46,r=!0),o+=s,r)break;o*=46}A?A[n++]=o:A=new e(o)}return A}var rh=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},TV=new rh,Lx=class{constructor(e,A){this.input=e,this.ranges=A,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=TV,this.rangeIndex=0,this.pos=this.chunkPos=A[0].from,this.range=A[0],this.end=A[A.length-1].to,this.readNext()}resolveOffset(e,A){let i=this.range,n=this.rangeIndex,o=this.pos+e;for(;oi.to:o>=i.to;){if(n==this.ranges.length-1)return null;let a=this.ranges[++n];o+=a.from-i.to,i=a}return o}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,A.from);return this.end}peek(e){let A=this.chunkOff+e,i,n;if(A>=0&&A=this.chunk2Pos&&ir.to&&(this.chunk2=this.chunk2.slice(0,r.to-i)),n=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),n}acceptToken(e,A=0){let i=A?this.resolveOffset(A,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,A){if(A?(this.token=A,A.start=e,A.lookAhead=e+1,A.value=A.extended=-1):this.token=TV,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&A<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,A-this.chunkPos);if(e>=this.chunk2Pos&&A<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,A-this.chunk2Pos);if(e>=this.range.from&&A<=this.range.to)return this.input.read(e,A);let i="";for(let n of this.ranges){if(n.from>=A)break;n.to>e&&(i+=this.input.read(Math.max(n.from,e),Math.min(n.to,A)))}return i}},nI=class{constructor(e,A){this.data=e,this.id=A}token(e,A){let{parser:i}=A.p;zV(this.data,e,A,this.id,i.data,i.tokenPrecTable)}};nI.prototype.contextual=nI.prototype.fallback=nI.prototype.extend=!1;var Gx=class{constructor(e,A,i){this.precTable=A,this.elseToken=i,this.data=typeof e=="string"?Cf(e):e}token(e,A){let i=e.pos,n=0;for(;;){let o=e.next<0,a=e.resolveOffset(1,1);if(zV(this.data,e,A,0,this.data,this.precTable),e.token.value>-1)break;if(this.elseToken==null)return;if(o||n++,a==null)break;e.reset(a,e.token)}n&&(e.reset(i,e.token),e.acceptToken(this.elseToken,n))}};Gx.prototype.contextual=nI.prototype.fallback=nI.prototype.extend=!1;function zV(t,e,A,i,n,o){let a=0,r=1<0){let h=t[d];if(s.allows(h)&&(e.token.value==-1||e.token.value==h||w3A(h,e.token.value,n,o))){e.acceptToken(h);break}}let g=e.next,C=0,I=t[a+2];if(e.next<0&&I>C&&t[l+I*3-3]==65535){a=t[l+I*3-1];continue A}for(;C>1,h=l+d+(d<<1),E=t[h],f=t[h+1]||65536;if(g=f)C=d+1;else{a=t[h+2],e.advance();continue A}}break}}function JV(t,e,A){for(let i=e,n;(n=t[i])!=65535;i++)if(n==A)return i-e;return-1}function w3A(t,e,A,i){let n=JV(A,i,e);return n<0||JV(A,i,t)e)&&!i.type.isError)return A<0?Math.max(0,Math.min(i.to-1,e-25)):Math.min(t.length,Math.max(i.from+1,e+25));if(A<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return A<0?0:t.length}}var Kx=class{constructor(e,A){this.fragments=e,this.nodeSet=A,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?OV(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?OV(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=a,null;if(o instanceof Ka){if(a==e){if(a=Math.max(this.safeFrom,e)&&(this.trees.push(o),this.start.push(a),this.index.push(0))}else this.index[A]++,this.nextStart=a+o.length}}},Ux=class{constructor(e,A){this.stream=A,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(i=>new rh)}getActions(e){let A=0,i=null,{parser:n}=e.p,{tokenizers:o}=n,a=n.stateSlot(e.state,3),r=e.curContext?e.curContext.hash:0,s=0;for(let l=0;lC.end+25&&(s=Math.max(C.lookAhead,s)),C.value!=0)){let I=A;if(C.extended>-1&&(A=this.addActions(e,C.extended,C.end,A)),A=this.addActions(e,C.value,C.end,A),!g.extend&&(i=C,A>I))break}}for(;this.actions.length>A;)this.actions.pop();return s&&e.setLookAhead(s),!i&&e.pos==this.stream.end&&(i=new rh,i.value=e.p.parser.eofTerm,i.start=i.end=e.pos,A=this.addActions(e,i.value,i.end,A)),this.mainToken=i,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let A=new rh,{pos:i,p:n}=e;return A.start=i,A.end=Math.min(i+1,n.stream.end),A.value=i==n.stream.end?n.parser.eofTerm:0,A}updateCachedToken(e,A,i){let n=this.stream.clipPos(i.pos);if(A.token(this.stream.reset(n,e),i),e.value>-1){let{parser:o}=i.p;for(let a=0;a=0&&i.p.parser.dialect.allows(r>>1)){(r&1)==0?e.value=r>>1:e.extended=r>>1;break}}}else e.value=0,e.end=this.stream.clipPos(n+1)}putAction(e,A,i,n){for(let o=0;oe.bufferLength*4?new Kx(i,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,A=this.minStackPos,i=this.stacks=[],n,o;if(this.bigReductionCount>300&&e.length==1){let[a]=e;for(;a.forceReduce()&&a.stack.length&&a.stack[a.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let a=0;aA)i.push(r);else{if(this.advanceStack(r,i,e))continue;{n||(n=[],o=[]),n.push(r);let s=this.tokens.getMainToken(r);o.push(s.value,s.end)}}break}}if(!i.length){let a=n&&D3A(n);if(a)return Fl&&console.log("Finish with "+this.stackID(a)),this.stackToTree(a);if(this.parser.strict)throw Fl&&n&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+A);this.recovering||(this.recovering=5)}if(this.recovering&&n){let a=this.stoppedAt!=null&&n[0].pos>this.stoppedAt?n[0]:this.runRecovery(n,o,i);if(a)return Fl&&console.log("Force-finish "+this.stackID(a)),this.stackToTree(a.forceAll())}if(this.recovering){let a=this.recovering==1?1:this.recovering*3;if(i.length>a)for(i.sort((r,s)=>s.score-r.score);i.length>a;)i.pop();i.some(r=>r.reducePos>A)&&this.recovering--}else if(i.length>1){A:for(let a=0;a500&&l.buffer.length>500)if((r.score-l.score||r.buffer.length-l.buffer.length)>0)i.splice(s--,1);else{i.splice(a--,1);continue A}}}i.length>12&&(i.sort((a,r)=>r.score-a.score),i.splice(12,i.length-12))}this.minStackPos=i[0].pos;for(let a=1;a ":"";if(this.stoppedAt!=null&&n>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let l=e.curContext&&e.curContext.tracker.strict,g=l?e.curContext.hash:0;for(let C=this.fragments.nodeAt(n);C;){let I=this.parser.nodeSet.types[C.type.id]==C.type?o.getGoto(e.state,C.type.id):-1;if(I>-1&&C.length&&(!l||(C.prop(Ni.contextHash)||0)==g))return e.useNode(C,I),Fl&&console.log(a+this.stackID(e)+` (via reuse of ${o.getName(C.type.id)})`),!0;if(!(C instanceof Ka)||C.children.length==0||C.positions[0]>0)break;let d=C.children[0];if(d instanceof Ka&&C.positions[0]==0)C=d;else break}}let r=o.stateSlot(e.state,4);if(r>0)return e.reduce(r),Fl&&console.log(a+this.stackID(e)+` (via always-reduce ${o.getName(r&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let s=this.tokens.getActions(e);for(let l=0;ln?A.push(h):i.push(h)}return!1}advanceFully(e,A){let i=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>i)return YV(e,A),!0}}runRecovery(e,A,i){let n=null,o=!1;for(let a=0;a ":"";if(r.deadEnd&&(o||(o=!0,r.restart(),Fl&&console.log(g+this.stackID(r)+" (restarted)"),this.advanceFully(r,i))))continue;let C=r.split(),I=g;for(let d=0;d<10&&C.forceReduce()&&(Fl&&console.log(I+this.stackID(C)+" (via force-reduce)"),!this.advanceFully(C,i));d++)Fl&&(I=this.stackID(C)+" -> ");for(let d of r.recoverByInsert(s))Fl&&console.log(g+this.stackID(d)+" (via recover-insert)"),this.advanceFully(d,i);this.stream.end>r.pos?(l==r.pos&&(l++,s=0),r.recoverByDelete(s,l),Fl&&console.log(g+this.stackID(r)+` (via recover-delete ${this.parser.getName(s)})`),YV(r,i)):(!n||n.scoree.topRules[r][1]),n=[];for(let r=0;r=0)o(g,s,r[l++]);else{let C=r[l+-g];for(let I=-g;I>0;I--)o(r[l++],s,C);l++}}}this.nodeSet=new X4(A.map((r,s)=>Qs.define({name:s>=this.minRepeatTerm?void 0:r,id:s,props:n[s],top:i.indexOf(s)>-1,error:s==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(s)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=1024;let a=Cf(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let r=0;rtypeof r=="number"?new nI(a,r):r),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,A,i){let n=new Tx(this,e,A,i);for(let o of this.wrappers)n=o(n,e,A,i);return n}getGoto(e,A,i=!1){let n=this.goto;if(A>=n[0])return-1;for(let o=n[A+1];;){let a=n[o++],r=a&1,s=n[o++];if(r&&i)return s;for(let l=o+(a>>1);o0}validAction(e,A){return!!this.allActions(e,i=>i==A?!0:null)}allActions(e,A){let i=this.stateSlot(e,4),n=i?A(i):void 0;for(let o=this.stateSlot(e,1);n==null;o+=3){if(this.data[o]==65535)if(this.data[o+1]==1)o=uC(this.data,o+2);else break;n=A(uC(this.data,o+1))}return n}nextStates(e){let A=[];for(let i=this.stateSlot(e,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=uC(this.data,i+2);else break;if((this.data[i+2]&1)==0){let n=this.data[i+1];A.some((o,a)=>a&1&&o==n)||A.push(this.data[i],n)}}return A}configure(e){let A=Object.assign(Object.create(t.prototype),this);if(e.props&&(A.nodeSet=this.nodeSet.extend(...e.props)),e.top){let i=this.topRules[e.top];if(!i)throw new RangeError(`Invalid top rule name ${e.top}`);A.top=i}return e.tokenizers&&(A.tokenizers=this.tokenizers.map(i=>{let n=e.tokenizers.find(o=>o.from==i);return n?n.to:i})),e.specializers&&(A.specializers=this.specializers.slice(),A.specializerSpecs=this.specializerSpecs.map((i,n)=>{let o=e.specializers.find(r=>r.from==i.external);if(!o)return i;let a=Object.assign(Object.assign({},i),{external:o.to});return A.specializers[n]=HV(a),a})),e.contextTracker&&(A.context=e.contextTracker),e.dialect&&(A.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(A.strict=e.strict),e.wrap&&(A.wrappers=A.wrappers.concat(e.wrap)),e.bufferLength!=null&&(A.bufferLength=e.bufferLength),A}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let A=this.dynamicPrecedences;return A==null?0:A[e]||0}parseDialect(e){let A=Object.keys(this.dialects),i=A.map(()=>!1);if(e)for(let o of e.split(" ")){let a=A.indexOf(o);a>=0&&(i[a]=!0)}let n=null;for(let o=0;oi)&&A.p.parser.stateFlag(A.state,2)&&(!e||e.scoret.external(A,i)<<1|e}return t.get}var y3A=Pw({String:Fe.string,Number:Fe.number,"True False":Fe.bool,PropertyName:Fe.propertyName,Null:Fe.null,", :":Fe.separator,"[ ]":Fe.squareBracket,"{ }":Fe.brace}),PV=l5.deserialize({version:14,states:"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l",stateData:"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O",goto:"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R",nodeNames:"\u26A0 JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array",maxTerm:25,nodeProps:[["isolate",-2,6,11,""],["openedBy",7,"{",14,"["],["closedBy",8,"}",15,"]"]],propSources:[y3A],skippedNodes:[0],repeatNodeCount:2,tokenData:"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~",tokenizers:[0],topRules:{JsonText:[0,1]},tokenPrec:0});var v3A=jw.define({name:"json",parser:PV.configure({props:[Ex.add({Object:hx({except:/^\s*\}/}),Array:hx({except:/^\s*\]/})}),rf.add({"Object Array":bq})]}),languageData:{closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/}});function jV(){return new qw(v3A)}var qV=typeof String.prototype.normalize=="function"?t=>t.normalize("NFKD"):t=>t,aI=class{constructor(e,A,i=0,n=e.length,o,a){this.test=a,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(i,n),this.bufferStart=i,this.normalize=o?r=>o(qV(r)):qV,this.query=this.normalize(A)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return qr(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let A=_4(e),i=this.bufferStart+this.bufferPos;this.bufferPos+=_l(e);let n=this.normalize(A);if(n.length)for(let o=0,a=i;;o++){let r=n.charCodeAt(o),s=this.match(r,a,this.bufferPos+this.bufferStart);if(o==n.length-1){if(s)return this.value=s,this;break}a==i&&othis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let A=this.matchPos<=this.to&&this.re.exec(this.curLine);if(A){let i=this.curLineStart+A.index,n=i+A[0].length;if(this.matchPos=B5(this.text,n+(i==n?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,n,A)))return this.value={from:i,to:n,match:A},this;e=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length=i||n.to<=A){let r=new t(A,e.sliceString(A,i));return Ox.set(e,r),r}if(n.from==A&&n.to==i)return n;let{text:o,from:a}=n;return a>A&&(o=e.sliceString(A,a)+o,a=A),n.to=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,A=this.re.exec(this.flat.text);if(A&&!A[0]&&A.index==e&&(this.re.lastIndex=e+1,A=this.re.exec(this.flat.text)),A){let i=this.flat.from+A.index,n=i+A[0].length;if((this.flat.to>=this.to||A.index+A[0].length<=this.flat.text.length-10)&&(!this.test||this.test(i,n,A)))return this.value={from:i,to:n,match:A},this.matchPos=B5(this.text,n+(i==n?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=I5.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}};typeof Symbol<"u"&&(C5.prototype[Symbol.iterator]=d5.prototype[Symbol.iterator]=function(){return this});function b3A(t){try{return new RegExp(t,qx),!0}catch(e){return!1}}function B5(t,e){if(e>=t.length)return e;let A=t.lineAt(e),i;for(;e=56320&&i<57344;)e++;return e}var M3A=t=>{let{state:e}=t,A=String(e.doc.lineAt(t.state.selection.main.head).number),{close:i,result:n}=eq(t,{label:e.phrase("Go to line"),input:{type:"text",name:"line",value:A},focus:!0,submitLabel:e.phrase("go")});return n.then(o=>{let a=o&&/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(o.elements.line.value);if(!a){t.dispatch({effects:i});return}let r=e.doc.lineAt(e.selection.main.head),[,s,l,g,C]=a,I=g?+g.slice(1):0,d=l?+l:r.number;if(l&&C){let f=d/100;s&&(f=f*(s=="-"?-1:1)+r.number/e.doc.lines),d=Math.round(e.doc.lines*f)}else l&&s&&(d=d*(s=="-"?-1:1)+r.number);let h=e.doc.line(Math.max(1,Math.min(e.doc.lines,d))),E=Ie.cursor(h.from+Math.max(0,Math.min(I,h.length)));t.dispatch({effects:[i,ci.scrollIntoView(E.from,{y:"center"})],selection:E})}),!0},S3A={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},XV=At.define({combine(t){return Mr(t,S3A,{highlightWordAroundCursor:(e,A)=>e||A,minSelectionLength:Math.min,maxMatches:Math.min})}});function $V(t){let e=[N3A,R3A];return t&&e.push(XV.of(t)),e}var k3A=St.mark({class:"cm-selectionMatch"}),x3A=St.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function VV(t,e,A,i){return(A==0||t(e.sliceDoc(A-1,A))!=Uo.Word)&&(i==e.doc.length||t(e.sliceDoc(i,i+1))!=Uo.Word)}function _3A(t,e,A,i){return t(e.sliceDoc(A,A+1))==Uo.Word&&t(e.sliceDoc(i-1,i))==Uo.Word}var R3A=_o.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.selectionSet||t.docChanged||t.viewportChanged)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=t.state.facet(XV),{state:A}=t,i=A.selection;if(i.ranges.length>1)return St.none;let n=i.main,o,a=null;if(n.empty){if(!e.highlightWordAroundCursor)return St.none;let s=A.wordAt(n.head);if(!s)return St.none;a=A.charCategorizer(n.head),o=A.sliceDoc(s.from,s.to)}else{let s=n.to-n.from;if(s200)return St.none;if(e.wholeWords){if(o=A.sliceDoc(n.from,n.to),a=A.charCategorizer(n.head),!(VV(a,A,n.from,n.to)&&_3A(a,A,n.from,n.to)))return St.none}else if(o=A.sliceDoc(n.from,n.to),!o)return St.none}let r=[];for(let s of t.visibleRanges){let l=new aI(A.doc,o,s.from,s.to);for(;!l.next().done;){let{from:g,to:C}=l.value;if((!a||VV(a,A,g,C))&&(n.empty&&g<=n.from&&C>=n.to?r.push(x3A.range(g,C)):(g>=n.to||C<=n.from)&&r.push(k3A.range(g,C)),r.length>e.maxMatches))return St.none}}return St.set(r)}},{decorations:t=>t.decorations}),N3A=ci.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),F3A=({state:t,dispatch:e})=>{let{selection:A}=t,i=Ie.create(A.ranges.map(n=>t.wordAt(n.head)||Ie.cursor(n.head)),A.mainIndex);return i.eq(A)?!1:(e(t.update({selection:i})),!0)};function L3A(t,e){let{main:A,ranges:i}=t.selection,n=t.wordAt(A.head),o=n&&n.from==A.from&&n.to==A.to;for(let a=!1,r=new aI(t.doc,e,i[i.length-1].to);;)if(r.next(),r.done){if(a)return null;r=new aI(t.doc,e,0,Math.max(0,i[i.length-1].from-1)),a=!0}else{if(a&&i.some(s=>s.from==r.value.from))continue;if(o){let s=t.wordAt(r.value.from);if(!s||s.from!=r.value.from||s.to!=r.value.to)continue}return r.value}}var G3A=({state:t,dispatch:e})=>{let{ranges:A}=t.selection;if(A.some(o=>o.from===o.to))return F3A({state:t,dispatch:e});let i=t.sliceDoc(A[0].from,A[0].to);if(t.selection.ranges.some(o=>t.sliceDoc(o.from,o.to)!=i))return!1;let n=L3A(t,i);return n?(e(t.update({selection:t.selection.addRange(Ie.range(n.from,n.to),!1),effects:ci.scrollIntoView(n.to)})),!0):!1},id=At.define({combine(t){return Mr(t,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new Px(e),scrollToMatch:e=>ci.scrollIntoView(e)})}});function AW(t){return t?[id.of(t),jx]:jx}var E5=class{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||b3A(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord,this.test=e.test}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,(A,i)=>i=="n"?` +`:i=="r"?"\r":i=="t"?" ":"\\")}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord&&this.test==e.test}create(){return this.regexp?new Hx(this):new Yx(this)}getCursor(e,A=0,i){let n=e.doc?e:qa.create({doc:e});return i==null&&(i=n.doc.length),this.regexp?lh(this,n,A,i):sh(this,n,A,i)}},h5=class{constructor(e){this.spec=e}};function K3A(t,e,A){return(i,n,o,a)=>{if(A&&!A(i,n,o,a))return!1;let r=i>=a&&n<=a+o.length?o.slice(i-a,n-a):e.doc.sliceString(i,n);return t(r,e,i,n)}}function sh(t,e,A,i){let n;return t.wholeWord&&(n=U3A(e.doc,e.charCategorizer(e.selection.main.head))),t.test&&(n=K3A(t.test,e,n)),new aI(e.doc,t.unquoted,A,i,t.caseSensitive?void 0:o=>o.toLowerCase(),n)}function U3A(t,e){return(A,i,n,o)=>((o>A||o+n.length=A)return null;n.push(i.value)}return n}highlight(e,A,i,n){let o=sh(this.spec,e,Math.max(0,A-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}};function T3A(t,e,A){return(i,n,o)=>(!A||A(i,n,o))&&t(o[0],e,i,n)}function lh(t,e,A,i){let n;return t.wholeWord&&(n=J3A(e.charCategorizer(e.selection.main.head))),t.test&&(n=T3A(t.test,e,n)),new C5(e.doc,t.search,{ignoreCase:!t.caseSensitive,test:n},A,i)}function Q5(t,e){return t.slice(ja(t,e,!1),e)}function u5(t,e){return t.slice(e,ja(t,e))}function J3A(t){return(e,A,i)=>!i[0].length||(t(Q5(i.input,i.index))!=Uo.Word||t(u5(i.input,i.index))!=Uo.Word)&&(t(u5(i.input,i.index+i[0].length))!=Uo.Word||t(Q5(i.input,i.index+i[0].length))!=Uo.Word)}var Hx=class extends h5{nextMatch(e,A,i){let n=lh(this.spec,e,i,e.doc.length).next();return n.done&&(n=lh(this.spec,e,0,A).next()),n.done?null:n.value}prevMatchInRange(e,A,i){for(let n=1;;n++){let o=Math.max(A,i-n*1e4),a=lh(this.spec,e,o,i),r=null;for(;!a.next().done;)r=a.value;if(r&&(o==A||r.from>o+10))return r;if(o==A)return null}}prevMatch(e,A,i){return this.prevMatchInRange(e,0,A)||this.prevMatchInRange(e,i,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(A,i)=>{if(i=="&")return e.match[0];if(i=="$")return"$";for(let n=i.length;n>0;n--){let o=+i.slice(0,n);if(o>0&&o=A)return null;n.push(i.value)}return n}highlight(e,A,i,n){let o=lh(this.spec,e,Math.max(0,A-250),Math.min(i+250,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}},df=Wi.define(),Vx=Wi.define(),oI=Ma.define({create(t){return new If(zx(t).create(),null)},update(t,e){for(let A of e.effects)A.is(df)?t=new If(A.value.create(),t.panel):A.is(Vx)&&(t=new If(t.query,A.value?Wx:null));return t},provide:t=>q1.from(t,e=>e.panel)});var If=class{constructor(e,A){this.query=e,this.panel=A}},O3A=St.mark({class:"cm-searchMatch"}),Y3A=St.mark({class:"cm-searchMatch cm-searchMatch-selected"}),H3A=_o.fromClass(class{constructor(t){this.view=t,this.decorations=this.highlight(t.state.field(oI))}update(t){let e=t.state.field(oI);(e!=t.startState.field(oI)||t.docChanged||t.selectionSet||t.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:t,panel:e}){if(!e||!t.spec.valid)return St.none;let{view:A}=this,i=new jr;for(let n=0,o=A.visibleRanges,a=o.length;no[n+1].from-500;)s=o[++n].to;t.highlight(A.state,r,s,(l,g)=>{let C=A.state.selection.ranges.some(I=>I.from==l&&I.to==g);i.add(l,g,C?Y3A:O3A)})}return i.finish()}},{decorations:t=>t.decorations});function Bf(t){return e=>{let A=e.state.field(oI,!1);return A&&A.query.spec.valid?t(e,A):m5(e)}}var f5=Bf((t,{query:e})=>{let{to:A}=t.state.selection.main,i=e.nextMatch(t.state,A,A);if(!i)return!1;let n=Ie.single(i.from,i.to),o=t.state.facet(id);return t.dispatch({selection:n,effects:[Zx(t,i),o.scrollToMatch(n.main,t)],userEvent:"select.search"}),tW(t),!0}),p5=Bf((t,{query:e})=>{let{state:A}=t,{from:i}=A.selection.main,n=e.prevMatch(A,i,i);if(!n)return!1;let o=Ie.single(n.from,n.to),a=t.state.facet(id);return t.dispatch({selection:o,effects:[Zx(t,n),a.scrollToMatch(o.main,t)],userEvent:"select.search"}),tW(t),!0}),z3A=Bf((t,{query:e})=>{let A=e.matchAll(t.state,1e3);return!A||!A.length?!1:(t.dispatch({selection:Ie.create(A.map(i=>Ie.range(i.from,i.to))),userEvent:"select.search.matches"}),!0)}),P3A=({state:t,dispatch:e})=>{let A=t.selection;if(A.ranges.length>1||A.main.empty)return!1;let{from:i,to:n}=A.main,o=[],a=0;for(let r=new aI(t.doc,t.sliceDoc(i,n));!r.next().done;){if(o.length>1e3)return!1;r.value.from==i&&(a=o.length),o.push(Ie.range(r.value.from,r.value.to))}return e(t.update({selection:Ie.create(o,a),userEvent:"select.search.matches"})),!0},WV=Bf((t,{query:e})=>{let{state:A}=t,{from:i,to:n}=A.selection.main;if(A.readOnly)return!1;let o=e.nextMatch(A,i,i);if(!o)return!1;let a=o,r=[],s,l,g=[];a.from==i&&a.to==n&&(l=A.toText(e.getReplacement(a)),r.push({from:a.from,to:a.to,insert:l}),a=e.nextMatch(A,a.from,a.to),g.push(ci.announce.of(A.phrase("replaced match on line $",A.doc.lineAt(i).number)+".")));let C=t.state.changes(r);return a&&(s=Ie.single(a.from,a.to).map(C),g.push(Zx(t,a)),g.push(A.facet(id).scrollToMatch(s.main,t))),t.dispatch({changes:C,selection:s,effects:g,userEvent:"input.replace"}),!0}),j3A=Bf((t,{query:e})=>{if(t.state.readOnly)return!1;let A=e.matchAll(t.state,1e9).map(n=>{let{from:o,to:a}=n;return{from:o,to:a,insert:e.getReplacement(n)}});if(!A.length)return!1;let i=t.state.phrase("replaced $ matches",A.length)+".";return t.dispatch({changes:A,effects:ci.announce.of(i),userEvent:"input.replace.all"}),!0});function Wx(t){return t.state.facet(id).createPanel(t)}function zx(t,e){var A,i,n,o,a;let r=t.selection.main,s=r.empty||r.to>r.from+100?"":t.sliceDoc(r.from,r.to);if(e&&!s)return e;let l=t.facet(id);return new E5({search:((A=e?.literal)!==null&&A!==void 0?A:l.literal)?s:s.replace(/\n/g,"\\n"),caseSensitive:(i=e?.caseSensitive)!==null&&i!==void 0?i:l.caseSensitive,literal:(n=e?.literal)!==null&&n!==void 0?n:l.literal,regexp:(o=e?.regexp)!==null&&o!==void 0?o:l.regexp,wholeWord:(a=e?.wholeWord)!==null&&a!==void 0?a:l.wholeWord})}function eW(t){let e=W4(t,Wx);return e&&e.dom.querySelector("[main-field]")}function tW(t){let e=eW(t);e&&e==t.root.activeElement&&e.select()}var m5=t=>{let e=t.state.field(oI,!1);if(e&&e.panel){let A=eW(t);if(A&&A!=t.root.activeElement){let i=zx(t.state,e.query.spec);i.valid&&t.dispatch({effects:df.of(i)}),A.focus(),A.select()}}else t.dispatch({effects:[Vx.of(!0),e?df.of(zx(t.state,e.query.spec)):Wi.appendConfig.of(jx)]});return!0},w5=t=>{let e=t.state.field(oI,!1);if(!e||!e.panel)return!1;let A=W4(t,Wx);return A&&A.dom.contains(t.root.activeElement)&&t.focus(),t.dispatch({effects:Vx.of(!1)}),!0},iW=[{key:"Mod-f",run:m5,scope:"editor search-panel"},{key:"F3",run:f5,shift:p5,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:f5,shift:p5,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:w5,scope:"editor search-panel"},{key:"Mod-Shift-l",run:P3A},{key:"Mod-Alt-g",run:M3A},{key:"Mod-d",run:G3A,preventDefault:!0}],Px=class{constructor(e){this.view=e;let A=this.query=e.state.field(oI).query.spec;this.commit=this.commit.bind(this),this.searchField=no("input",{value:A.search,placeholder:Ll(e,"Find"),"aria-label":Ll(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=no("input",{value:A.replace,placeholder:Ll(e,"Replace"),"aria-label":Ll(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=no("input",{type:"checkbox",name:"case",form:"",checked:A.caseSensitive,onchange:this.commit}),this.reField=no("input",{type:"checkbox",name:"re",form:"",checked:A.regexp,onchange:this.commit}),this.wordField=no("input",{type:"checkbox",name:"word",form:"",checked:A.wholeWord,onchange:this.commit});function i(n,o,a){return no("button",{class:"cm-button",name:n,onclick:o,type:"button"},a)}this.dom=no("div",{onkeydown:n=>this.keydown(n),class:"cm-search"},[this.searchField,i("next",()=>f5(e),[Ll(e,"next")]),i("prev",()=>p5(e),[Ll(e,"previous")]),i("select",()=>z3A(e),[Ll(e,"all")]),no("label",null,[this.caseField,Ll(e,"match case")]),no("label",null,[this.reField,Ll(e,"regexp")]),no("label",null,[this.wordField,Ll(e,"by word")]),...e.state.readOnly?[]:[no("br"),this.replaceField,i("replace",()=>WV(e),[Ll(e,"replace")]),i("replaceAll",()=>j3A(e),[Ll(e,"replace all")])],no("button",{name:"close",onclick:()=>w5(e),"aria-label":Ll(e,"close"),type:"button"},["\xD7"])])}commit(){let e=new E5({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:df.of(e)}))}keydown(e){Jj(this.view,e,"search-panel")?e.preventDefault():e.keyCode==13&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?p5:f5)(this.view)):e.keyCode==13&&e.target==this.replaceField&&(e.preventDefault(),WV(this.view))}update(e){for(let A of e.transactions)for(let i of A.effects)i.is(df)&&!i.value.eq(this.query)&&this.setQuery(i.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(id).top}};function Ll(t,e){return t.state.phrase(e)}var g5=30,c5=/[\s\.,:;?!]/;function Zx(t,{from:e,to:A}){let i=t.state.doc.lineAt(e),n=t.state.doc.lineAt(A).to,o=Math.max(i.from,e-g5),a=Math.min(n,A+g5),r=t.state.sliceDoc(o,a);if(o!=i.from){for(let s=0;sr.length-g5;s--)if(!c5.test(r[s-1])&&c5.test(r[s])){r=r.slice(0,s);break}}return ci.announce.of(`${t.state.phrase("current match")}. ${r} ${t.state.phrase("on line")} ${i.number}.`)}var q3A=ci.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),jx=[oI,oc.low(H3A),q3A];var y5=class{constructor(e,A,i,n){this.state=e,this.pos=A,this.explicit=i,this.view=n,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let A=kr(this.state).resolveInner(this.pos,-1);for(;A&&e.indexOf(A.name)<0;)A=A.parent;return A?{from:A.from,to:this.pos,text:this.state.sliceDoc(A.from,this.pos),type:A.type}:null}matchBefore(e){let A=this.state.doc.lineAt(this.pos),i=Math.max(A.from,this.pos-250),n=A.text.slice(i-A.from,this.pos-A.from),o=n.search(cW(e,!1));return o<0?null:{from:i+o,to:this.pos,text:n.slice(o)}}get aborted(){return this.abortListeners==null}addEventListener(e,A,i){e=="abort"&&this.abortListeners&&(this.abortListeners.push(A),i&&i.onDocChange&&(this.abortOnDocChange=!0))}};function nW(t){let e=Object.keys(t).join(""),A=/\w/.test(e);return A&&(e=e.replace(/\w/g,"")),`[${A?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function V3A(t){let e=Object.create(null),A=Object.create(null);for(let{label:n}of t){e[n[0]]=!0;for(let o=1;otypeof n=="string"?{label:n}:n),[A,i]=e.every(n=>/^\w+$/.test(n.label))?[/\w*$/,/\w+$/]:V3A(e);return n=>{let o=n.matchBefore(i);return o||n.explicit?{from:o?o.from:n.pos,options:e,validFor:A}:null}}var v5=class{constructor(e,A,i,n){this.completion=e,this.source=A,this.match=i,this.score=n}};function od(t){return t.selection.main.from}function cW(t,e){var A;let{source:i}=t,n=e&&i[0]!="^",o=i[i.length-1]!="$";return!n&&!o?t:new RegExp(`${n?"^":""}(?:${i})${o?"$":""}`,(A=t.flags)!==null&&A!==void 0?A:t.ignoreCase?"i":"")}var CW=al.define();function Z3A(t,e,A,i){let{main:n}=t.selection,o=A-n.from,a=i-n.from;return Ye(gA({},t.changeByRange(r=>{if(r!=n&&A!=i&&t.sliceDoc(r.from+o,r.from+a)!=t.sliceDoc(A,i))return{range:r};let s=t.toText(e);return{changes:{from:r.from+o,to:i==n.from?r.to:r.from+a,insert:s},range:Ie.cursor(r.from+o+s.length)}})),{scrollIntoView:!0,userEvent:"input.complete"})}var oW=new WeakMap;function X3A(t){if(!Array.isArray(t))return t;let e=oW.get(t);return e||oW.set(t,e=W3A(t)),e}var b5=Wi.define(),Ef=Wi.define(),e_=class{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let A=0;A=48&&b<=57||b>=97&&b<=122?2:b>=65&&b<=90?1:0:(x=_4(b))!=x.toLowerCase()?1:x!=x.toUpperCase()?2:0;(!v||F==1&&f||S==0&&F!=0)&&(A[C]==b||i[C]==b&&(I=!0)?a[C++]=v:a.length&&(m=!1)),S=F,v+=_l(b)}return C==s&&a[0]==0&&m?this.result(-100+(I?-200:0),a,e):d==s&&h==0?this.ret(-200-e.length+(E==e.length?0:-100),[0,E]):r>-1?this.ret(-700-e.length,[r,r+this.pattern.length]):d==s?this.ret(-900-e.length,[h,E]):C==s?this.result(-100+(I?-200:0)+-700+(m?0:-1100),a,e):A.length==2?null:this.result((n[0]?-700:0)+-200+-1100,n,e)}result(e,A,i){let n=[],o=0;for(let a of A){let r=a+(this.astral?_l(qr(i,a)):1);o&&n[o-1]==a?n[o-1]=r:(n[o++]=a,n[o++]=r)}return this.ret(e-i.length,n)}},t_=class{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:$3A,filterStrict:!1,compareCompletions:(e,A)=>(e.sortText||e.label).localeCompare(A.sortText||A.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,A)=>e&&A,closeOnBlur:(e,A)=>e&&A,icons:(e,A)=>e&&A,tooltipClass:(e,A)=>i=>aW(e(i),A(i)),optionClass:(e,A)=>i=>aW(e(i),A(i)),addToOptions:(e,A)=>e.concat(A),filterStrict:(e,A)=>e||A})}});function aW(t,e){return t?e?t+" "+e:t:e}function $3A(t,e,A,i,n,o){let a=t.textDirection==mo.RTL,r=a,s=!1,l="top",g,C,I=e.left-n.left,d=n.right-e.right,h=i.right-i.left,E=i.bottom-i.top;if(r&&I=E||v>e.top?g=A.bottom-e.top:(l="bottom",g=e.bottom-A.top)}let f=(e.bottom-e.top)/o.offsetHeight,m=(e.right-e.left)/o.offsetWidth;return{style:`${l}: ${g/f}px; max-width: ${C/m}px`,class:"cm-completionInfo-"+(s?a?"left-narrow":"right-narrow":r?"left":"right")}}var r_=Wi.define();function ApA(t){let e=t.addToOptions.slice();return t.icons&&e.push({render(A){let i=document.createElement("div");return i.classList.add("cm-completionIcon"),A.type&&i.classList.add(...A.type.split(/\s+/g).map(n=>"cm-completionIcon-"+n)),i.setAttribute("aria-hidden","true"),i},position:20}),e.push({render(A,i,n,o){let a=document.createElement("span");a.className="cm-completionLabel";let r=A.displayLabel||A.label,s=0;for(let l=0;ls&&a.appendChild(document.createTextNode(r.slice(s,g)));let I=a.appendChild(document.createElement("span"));I.appendChild(document.createTextNode(r.slice(g,C))),I.className="cm-completionMatchedText",s=C}return sA.position-i.position).map(A=>A.render)}function Xx(t,e,A){if(t<=A)return{from:0,to:t};if(e<0&&(e=0),e<=t>>1){let n=Math.floor(e/A);return{from:n*A,to:(n+1)*A}}let i=Math.floor((t-e)/A);return{from:t-(i+1)*A,to:t-i*A}}var i_=class{constructor(e,A,i){this.view=e,this.stateField=A,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:s=>this.placeInfo(s),key:this},this.space=null,this.currentClass="";let n=e.state.field(A),{options:o,selected:a}=n.open,r=e.state.facet(xr);this.optionContent=ApA(r),this.optionClass=r.optionClass,this.tooltipClass=r.tooltipClass,this.range=Xx(o.length,a,r.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",s=>{let{options:l}=e.state.field(A).open;for(let g=s.target,C;g&&g!=this.dom;g=g.parentNode)if(g.nodeName=="LI"&&(C=/-(\d+)$/.exec(g.id))&&+C[1]this.list.lastChild.getBoundingClientRect().bottom?this.range.to:null;g!=null&&(e.dispatch({effects:r_.of(g)}),s.preventDefault())}}),this.dom.addEventListener("focusout",s=>{let l=e.state.field(this.stateField,!1);l&&l.tooltip&&e.state.facet(xr).closeOnBlur&&s.relatedTarget!=e.contentDOM&&e.dispatch({effects:Ef.of(null)})}),this.showOptions(o,n.id)}mount(){this.updateSel()}showOptions(e,A){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,A,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var A;let i=e.state.field(this.stateField),n=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),i!=n){let{options:o,selected:a,disabled:r}=i.open;(!n.open||n.open.options!=o)&&(this.range=Xx(o.length,a,e.state.facet(xr).maxRenderedOptions),this.showOptions(o,i.id)),this.updateSel(),r!=((A=n.open)===null||A===void 0?void 0:A.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!r)}}updateTooltipClass(e){let A=this.tooltipClass(e);if(A!=this.currentClass){for(let i of this.currentClass.split(" "))i&&this.dom.classList.remove(i);for(let i of A.split(" "))i&&this.dom.classList.add(i);this.currentClass=A}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),A=e.open;(A.selected>-1&&A.selected=this.range.to)&&(this.range=Xx(A.options.length,A.selected,this.view.state.facet(xr).maxRenderedOptions),this.showOptions(A.options,e.id));let i=this.updateSelectedOption(A.selected);if(i){this.destroyInfo();let{completion:n}=A.options[A.selected],{info:o}=n;if(!o)return;let a=typeof o=="string"?document.createTextNode(o):o(n);if(!a)return;"then"in a?a.then(r=>{r&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(r,n)}).catch(r=>Sr(this.view.state,r,"completion info")):(this.addInfoPane(a,n),i.setAttribute("aria-describedby",this.info.id))}}addInfoPane(e,A){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",i.id="cm-completionInfo-"+Math.floor(Math.random()*65535).toString(16),e.nodeType!=null)i.appendChild(e),this.infoDestroy=null;else{let{dom:n,destroy:o}=e;i.appendChild(n),this.infoDestroy=o||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let A=null;for(let i=this.list.firstChild,n=this.range.from;i;i=i.nextSibling,n++)i.nodeName!="LI"||!i.id?n--:n==e?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),A=i):i.hasAttribute("aria-selected")&&(i.removeAttribute("aria-selected"),i.removeAttribute("aria-describedby"));return A&&tpA(this.list,A),A}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let A=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),n=e.getBoundingClientRect(),o=this.space;if(!o){let a=this.dom.ownerDocument.documentElement;o={left:0,top:0,right:a.clientWidth,bottom:a.clientHeight}}return n.top>Math.min(o.bottom,A.bottom)-10||n.bottom{a.target==n&&a.preventDefault()});let o=null;for(let a=i.from;ai.from||i.from==0))if(o=I,typeof l!="string"&&l.header)n.appendChild(l.header(l));else{let d=n.appendChild(document.createElement("completion-section"));d.textContent=I}}let g=n.appendChild(document.createElement("li"));g.id=A+"-"+a,g.setAttribute("role","option");let C=this.optionClass(r);C&&(g.className=C);for(let I of this.optionContent){let d=I(r,this.view.state,this.view,s);d&&g.appendChild(d)}}return i.from&&n.classList.add("cm-completionListIncompleteTop"),i.tonew i_(A,t,e)}function tpA(t,e){let A=t.getBoundingClientRect(),i=e.getBoundingClientRect(),n=A.height/t.offsetHeight;i.topA.bottom&&(t.scrollTop+=(i.bottom-A.bottom)/n)}function rW(t){return(t.boost||0)*100+(t.apply?10:0)+(t.info?5:0)+(t.type?1:0)}function ipA(t,e){let A=[],i=null,n=null,o=g=>{A.push(g);let{section:C}=g.completion;if(C){i||(i=[]);let I=typeof C=="string"?C:C.name;i.some(d=>d.name==I)||i.push(typeof C=="string"?{name:I}:C)}},a=e.facet(xr);for(let g of t)if(g.hasResult()){let C=g.result.getMatch;if(g.result.filter===!1)for(let I of g.result.options)o(new v5(I,g.source,C?C(I):[],1e9-A.length));else{let I=e.sliceDoc(g.from,g.to),d,h=a.filterStrict?new t_(I):new e_(I);for(let E of g.result.options)if(d=h.match(E.label)){let f=E.displayLabel?C?C(E,d.matched):[]:d.matched,m=d.score+(E.boost||0);if(o(new v5(E,g.source,f,m)),typeof E.section=="object"&&E.section.rank==="dynamic"){let{name:v}=E.section;n||(n=Object.create(null)),n[v]=Math.max(m,n[v]||-1e9)}}}}if(i){let g=Object.create(null),C=0,I=(d,h)=>(d.rank==="dynamic"&&h.rank==="dynamic"?n[h.name]-n[d.name]:0)||(typeof d.rank=="number"?d.rank:1e9)-(typeof h.rank=="number"?h.rank:1e9)||(d.nameI.score-C.score||l(C.completion,I.completion))){let C=g.completion;!s||s.label!=C.label||s.detail!=C.detail||s.type!=null&&C.type!=null&&s.type!=C.type||s.apply!=C.apply||s.boost!=C.boost?r.push(g):rW(g.completion)>rW(s)&&(r[r.length-1]=g),s=g.completion}return r}var n_=class t{constructor(e,A,i,n,o,a){this.options=e,this.attrs=A,this.tooltip=i,this.timestamp=n,this.selected=o,this.disabled=a}setSelected(e,A){return e==this.selected||e>=this.options.length?this:new t(this.options,sW(A,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,A,i,n,o,a){if(n&&!a&&e.some(l=>l.isPending))return n.setDisabled();let r=ipA(e,A);if(!r.length)return n&&e.some(l=>l.isPending)?n.setDisabled():null;let s=A.facet(xr).selectOnOpen?0:-1;if(n&&n.selected!=s&&n.selected!=-1){let l=n.options[n.selected].completion;for(let g=0;gg.hasResult()?Math.min(l,g.from):l,1e8),create:lpA,above:o.aboveCursor},n?n.timestamp:Date.now(),s,!1)}map(e){return new t(this.options,this.attrs,Ye(gA({},this.tooltip),{pos:e.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}setDisabled(){return new t(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}},o_=class t{constructor(e,A,i){this.active=e,this.id=A,this.open=i}static start(){return new t(rpA,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:A}=e,i=A.facet(xr),o=(i.override||A.languageDataAt("autocomplete",od(A)).map(X3A)).map(s=>(this.active.find(g=>g.source==s)||new fC(s,this.active.some(g=>g.state!=0)?1:0)).update(e,i));o.length==this.active.length&&o.every((s,l)=>s==this.active[l])&&(o=this.active);let a=this.open,r=e.effects.some(s=>s.is(s_));a&&e.docChanged&&(a=a.map(e.changes)),e.selection||o.some(s=>s.hasResult()&&e.changes.touchesRange(s.from,s.to))||!npA(o,this.active)||r?a=n_.build(o,A,this.id,a,i,r):a&&a.disabled&&!o.some(s=>s.isPending)&&(a=null),!a&&o.every(s=>!s.isPending)&&o.some(s=>s.hasResult())&&(o=o.map(s=>s.hasResult()?new fC(s.source,0):s));for(let s of e.effects)s.is(r_)&&(a=a&&a.setSelected(s.value,this.id));return o==this.active&&a==this.open?this:new t(o,this.id,a)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?opA:apA}};function npA(t,e){if(t==e)return!0;for(let A=0,i=0;;){for(;A-1&&(A["aria-activedescendant"]=t+"-"+e),A}var rpA=[];function IW(t,e){if(t.isUserEvent("input.complete")){let i=t.annotation(CW);if(i&&e.activateOnCompletion(i))return 12}let A=t.isUserEvent("input.type");return A&&e.activateOnTyping?5:A?1:t.isUserEvent("delete.backward")?2:t.selection?8:t.docChanged?16:0}var fC=class t{constructor(e,A,i=!1){this.source=e,this.state=A,this.explicit=i}hasResult(){return!1}get isPending(){return this.state==1}update(e,A){let i=IW(e,A),n=this;(i&8||i&16&&this.touches(e))&&(n=new t(n.source,0)),i&4&&n.state==0&&(n=new t(this.source,1)),n=n.updateFor(e,i);for(let o of e.effects)if(o.is(b5))n=new t(n.source,1,o.value);else if(o.is(Ef))n=new t(n.source,0);else if(o.is(s_))for(let a of o.value)a.source==n.source&&(n=a);return n}updateFor(e,A){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(od(e.state))}},M5=class t extends fC{constructor(e,A,i,n,o,a){super(e,3,A),this.limit=i,this.result=n,this.from=o,this.to=a}hasResult(){return!0}updateFor(e,A){var i;if(!(A&3))return this.map(e.changes);let n=this.result;n.map&&!e.changes.empty&&(n=n.map(n,e.changes));let o=e.changes.mapPos(this.from),a=e.changes.mapPos(this.to,1),r=od(e.state);if(r>a||!n||A&2&&(od(e.startState)==this.from||rA.map(e))}}),cl=Ma.define({create(){return o_.start()},update(t,e){return t.update(e)},provide:t=>[$E.from(t,e=>e.tooltip),ci.contentAttributes.from(t,e=>e.attrs)]});function l_(t,e){let A=e.completion.apply||e.completion.label,i=t.state.field(cl).active.find(n=>n.source==e.source);return i instanceof M5?(typeof A=="string"?t.dispatch(Ye(gA({},Z3A(t.state,A,i.from,i.to)),{annotations:CW.of(e.completion)})):A(t,e.completion,i.from,i.to),!0):!1}var lpA=epA(cl,l_);function D5(t,e="option"){return A=>{let i=A.state.field(cl,!1);if(!i||!i.open||i.open.disabled||Date.now()-i.open.timestamp-1?i.open.selected+n*(t?1:-1):t?0:a-1;return r<0?r=e=="page"?0:a-1:r>=a&&(r=e=="page"?a-1:0),A.dispatch({effects:r_.of(r)}),!0}}var gpA=t=>{let e=t.state.field(cl,!1);return t.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampt.state.field(cl,!1)?(t.dispatch({effects:b5.of(!0)}),!0):!1,cpA=t=>{let e=t.state.field(cl,!1);return!e||!e.active.some(A=>A.state!=0)?!1:(t.dispatch({effects:Ef.of(null)}),!0)},a_=class{constructor(e,A){this.active=e,this.context=A,this.time=Date.now(),this.updates=[],this.done=void 0}},CpA=50,IpA=1e3,dpA=_o.fromClass(class{constructor(t){this.view=t,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of t.state.field(cl).active)e.isPending&&this.startQuery(e)}update(t){let e=t.state.field(cl),A=t.state.facet(xr);if(!t.selectionSet&&!t.docChanged&&t.startState.field(cl)==e)return;let i=t.transactions.some(o=>{let a=IW(o,A);return a&8||(o.selection||o.docChanged)&&!(a&3)});for(let o=0;oCpA&&Date.now()-a.time>IpA){for(let r of a.context.abortListeners)try{r()}catch(s){Sr(this.view.state,s)}a.context.abortListeners=null,this.running.splice(o--,1)}else a.updates.push(...t.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),t.transactions.some(o=>o.effects.some(a=>a.is(b5)))&&(this.pendingStart=!0);let n=this.pendingStart?50:A.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(o=>o.isPending&&!this.running.some(a=>a.active.source==o.source))?setTimeout(()=>this.startUpdate(),n):-1,this.composing!=0)for(let o of t.transactions)o.isUserEvent("input.type")?this.composing=2:this.composing==2&&o.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:t}=this.view,e=t.field(cl);for(let A of e.active)A.isPending&&!this.running.some(i=>i.active.source==A.source)&&this.startQuery(A);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(xr).updateSyncTime))}startQuery(t){let{state:e}=this.view,A=od(e),i=new y5(e,A,t.explicit,this.view),n=new a_(t,i);this.running.push(n),Promise.resolve(t.source(i)).then(o=>{n.context.aborted||(n.done=o||null,this.scheduleAccept())},o=>{this.view.dispatch({effects:Ef.of(null)}),Sr(this.view.state,o)})}scheduleAccept(){this.running.every(t=>t.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(xr).updateSyncTime))}accept(){var t;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],A=this.view.state.facet(xr),i=this.view.state.field(cl);for(let n=0;nr.source==o.active.source);if(a&&a.isPending)if(o.done==null){let r=new fC(o.active.source,0);for(let s of o.updates)r=r.update(s,A);r.isPending||e.push(r)}else this.startQuery(a)}(e.length||i.open&&i.open.disabled)&&this.view.dispatch({effects:s_.of(e)})}},{eventHandlers:{blur(t){let e=this.view.state.field(cl,!1);if(e&&e.tooltip&&this.view.state.facet(xr).closeOnBlur){let A=e.open&&zk(this.view,e.open.tooltip);(!A||!A.dom.contains(t.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:Ef.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:b5.of(!1)}),20),this.composing=0}}}),BpA=typeof navigator=="object"&&/Win/.test(navigator.platform),EpA=oc.highest(ci.domEventHandlers({keydown(t,e){let A=e.state.field(cl,!1);if(!A||!A.open||A.open.disabled||A.open.selected<0||t.key.length>1||t.ctrlKey&&!(BpA&&t.altKey)||t.metaKey)return!1;let i=A.open.options[A.open.selected],n=A.active.find(a=>a.source==i.source),o=i.completion.commitCharacters||n.result.commitCharacters;return o&&o.indexOf(t.key)>-1&&l_(e,i),!1}})),hpA=ci.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"\xB7\xB7\xB7"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'\u0192'"}},".cm-completionIcon-class":{"&:after":{content:"'\u25CB'"}},".cm-completionIcon-interface":{"&:after":{content:"'\u25CC'"}},".cm-completionIcon-variable":{"&:after":{content:"'\u{1D465}'"}},".cm-completionIcon-constant":{"&:after":{content:"'\u{1D436}'"}},".cm-completionIcon-type":{"&:after":{content:"'\u{1D461}'"}},".cm-completionIcon-enum":{"&:after":{content:"'\u222A'"}},".cm-completionIcon-property":{"&:after":{content:"'\u25A1'"}},".cm-completionIcon-keyword":{"&:after":{content:"'\u{1F511}\uFE0E'"}},".cm-completionIcon-namespace":{"&:after":{content:"'\u25A2'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});var hf={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},nd=Wi.define({map(t,e){let A=e.mapPos(t,-1,zr.TrackAfter);return A??void 0}}),g_=new class extends gg{};g_.startSide=1;g_.endSide=-1;var dW=Ma.define({create(){return io.empty},update(t,e){if(t=t.map(e.changes),e.selection){let A=e.state.doc.lineAt(e.selection.main.head);t=t.update({filter:i=>i>=A.from&&i<=A.to})}for(let A of e.effects)A.is(nd)&&(t=t.update({add:[g_.range(A.value,A.value+1)]}));return t}});function BW(){return[upA,dW]}var A_="()[]{}<>\xAB\xBB\xBB\xAB\uFF3B\uFF3D\uFF5B\uFF5D";function EW(t){for(let e=0;e{if((QpA?t.composing:t.compositionStarted)||t.state.readOnly)return!1;let n=t.state.selection.main;if(i.length>2||i.length==2&&_l(qr(i,0))==1||e!=n.from||A!=n.to)return!1;let o=ppA(t.state,i);return o?(t.dispatch(o),!0):!1}),fpA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=hW(t,t.selection.main.head).brackets||hf.brackets,n=null,o=t.changeByRange(a=>{if(a.empty){let r=mpA(t.doc,a.head);for(let s of i)if(s==r&&S5(t.doc,a.head)==EW(qr(s,0)))return{changes:{from:a.head-s.length,to:a.head+s.length},range:Ie.cursor(a.head-s.length)}}return{range:n=a}});return n||e(t.update(o,{scrollIntoView:!0,userEvent:"delete.backward"})),!n},QW=[{key:"Backspace",run:fpA}];function ppA(t,e){let A=hW(t,t.selection.main.head),i=A.brackets||hf.brackets;for(let n of i){let o=EW(qr(n,0));if(e==n)return o==n?ypA(t,n,i.indexOf(n+n+n)>-1,A):wpA(t,n,o,A.before||hf.before);if(e==o&&uW(t,t.selection.main.from))return DpA(t,n,o)}return null}function uW(t,e){let A=!1;return t.field(dW).between(0,t.doc.length,i=>{i==e&&(A=!0)}),A}function S5(t,e){let A=t.sliceString(e,e+2);return A.slice(0,_l(qr(A,0)))}function mpA(t,e){let A=t.sliceString(e-2,e);return _l(qr(A,0))==A.length?A:A.slice(1)}function wpA(t,e,A,i){let n=null,o=t.changeByRange(a=>{if(!a.empty)return{changes:[{insert:e,from:a.from},{insert:A,from:a.to}],effects:nd.of(a.to+e.length),range:Ie.range(a.anchor+e.length,a.head+e.length)};let r=S5(t.doc,a.head);return!r||/\s/.test(r)||i.indexOf(r)>-1?{changes:{insert:e+A,from:a.head},effects:nd.of(a.head+e.length),range:Ie.cursor(a.head+e.length)}:{range:n=a}});return n?null:t.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function DpA(t,e,A){let i=null,n=t.changeByRange(o=>o.empty&&S5(t.doc,o.head)==A?{changes:{from:o.head,to:o.head+A.length,insert:A},range:Ie.cursor(o.head+A.length)}:i={range:o});return i?null:t.update(n,{scrollIntoView:!0,userEvent:"input.type"})}function ypA(t,e,A,i){let n=i.stringPrefixes||hf.stringPrefixes,o=null,a=t.changeByRange(r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:e,from:r.to}],effects:nd.of(r.to+e.length),range:Ie.range(r.anchor+e.length,r.head+e.length)};let s=r.head,l=S5(t.doc,s),g;if(l==e){if(lW(t,s))return{changes:{insert:e+e,from:s},effects:nd.of(s+e.length),range:Ie.cursor(s+e.length)};if(uW(t,s)){let I=A&&t.sliceDoc(s,s+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:s,to:s+I.length,insert:I},range:Ie.cursor(s+I.length)}}}else{if(A&&t.sliceDoc(s-2*e.length,s)==e+e&&(g=gW(t,s-2*e.length,n))>-1&&lW(t,g))return{changes:{insert:e+e+e+e,from:s},effects:nd.of(s+e.length),range:Ie.cursor(s+e.length)};if(t.charCategorizer(s)(l)!=Uo.Word&&gW(t,s,n)>-1&&!vpA(t,s,e,n))return{changes:{insert:e+e,from:s},effects:nd.of(s+e.length),range:Ie.cursor(s+e.length)}}return{range:o=r}});return o?null:t.update(a,{scrollIntoView:!0,userEvent:"input.type"})}function lW(t,e){let A=kr(t).resolveInner(e+1);return A.parent&&A.from==e}function vpA(t,e,A,i){let n=kr(t).resolveInner(e,-1),o=i.reduce((a,r)=>Math.max(a,r.length),0);for(let a=0;a<5;a++){let r=t.sliceDoc(n.from,Math.min(n.to,n.from+A.length+o)),s=r.indexOf(A);if(!s||s>-1&&i.indexOf(r.slice(0,s))>-1){let g=n.firstChild;for(;g&&g.from==n.from&&g.to-g.from>A.length+s;){if(t.sliceDoc(g.to-A.length,g.to)==A)return!1;g=g.firstChild}return!0}let l=n.to==e&&n.parent;if(!l)break;n=l}return!1}function gW(t,e,A){let i=t.charCategorizer(e);if(i(t.sliceDoc(e-1,e))!=Uo.Word)return e;for(let n of A){let o=e-n.length;if(t.sliceDoc(o,e)==n&&i(t.sliceDoc(o-1,o))!=Uo.Word)return o}return-1}function fW(t={}){return[EpA,cl,xr.of(t),dpA,bpA,hpA]}var c_=[{key:"Ctrl-Space",run:$x},{mac:"Alt-`",run:$x},{mac:"Alt-i",run:$x},{key:"Escape",run:cpA},{key:"ArrowDown",run:D5(!0)},{key:"ArrowUp",run:D5(!1)},{key:"PageDown",run:D5(!0,"page")},{key:"PageUp",run:D5(!1,"page")},{key:"Enter",run:gpA}],bpA=oc.highest(XE.computeN([xr],t=>t.facet(xr).defaultKeymap?[c_]:[]));function MpA(t,e=t.state){let A=new Set;for(let{from:i,to:n}of t.visibleRanges){let o=i;for(;o<=n;){let a=e.doc.lineAt(o);A.has(a)||A.add(a),o=a.to+1}}return A}function C_(t){let e=t.selection.main.head;return t.doc.lineAt(e)}function pW(t,e){let A=0;A:for(let i=0;i=o.level&&this.markerType!=="codeOnly"?this.set(e,0,n.level):n.empty&&n.level===0&&o.level!==0?this.set(e,0,0):o.level>n.level?this.set(e,0,n.level+1):this.set(e,0,o.level)}let A=pW(e.text,this.state.tabSize),i=Math.floor(A/this.unitWidth);return this.set(e,A,i)}closestNonEmpty(e,A){let i=e.number+A;for(;A===-1?i>=1:i<=this.state.doc.lines;){if(this.has(i)){let a=this.get(i);if(!a.empty)return a}let o=this.state.doc.line(i);if(o.text.trim().length){let a=pW(o.text,this.state.tabSize),r=Math.floor(a/this.unitWidth);return this.set(o,a,r)}i+=A}let n=this.state.doc.line(A===-1?1:this.state.doc.lines);return this.set(n,0,0)}findAndSetActiveLines(){let e=C_(this.state);if(!this.has(e))return;let A=this.get(e);if(this.has(A.line.number+1)){let o=this.get(A.line.number+1);o.level>A.level&&(A=o)}if(this.has(A.line.number-1)){let o=this.get(A.line.number-1);o.level>A.level&&(A=o)}if(A.level===0)return;A.active=A.level;let i,n;for(i=A.line.number;i>1;i--){if(!this.has(i-1))continue;let o=this.get(i-1);if(o.level0&&s.push(k5("--indent-marker-bg-color",i,e,r,l)),s.push(k5("--indent-marker-active-bg-color",n,e,a-1,1)),a!==o&&s.push(k5("--indent-marker-bg-color",i,e,a,o-a))}else s.push(k5("--indent-marker-bg-color",i,e,r,o-r));return s.join(",")}var d_=class{constructor(e){this.view=e,this.unitWidth=Cc(e.state),this.currentLineNumber=C_(e.state).number,this.generate(e.state)}update(e){let A=Cc(e.state),i=A!==this.unitWidth;i&&(this.unitWidth=A);let n=C_(e.state).number,o=n!==this.currentLineNumber;this.currentLineNumber=n;let a=e.state.facet(x5).highlightActiveBlock&&o;(e.docChanged||e.viewportChanged||i||a)&&this.generate(e.state)}generate(e){let A=new jr,i=MpA(this.view,e),{hideFirstIndent:n,markerType:o,thickness:a,activeThickness:r}=e.facet(x5),s=new I_(i,e,this.unitWidth,o);for(let l of i){let g=s.get(l.number);if(!g?.level)continue;let C=kpA(g,this.unitWidth,n,a,r);A.add(l.from,l.from,St.line({class:"cm-indent-markers",attributes:{style:`--indent-markers: ${C}`}}))}this.decorations=A.finish()}};function mW(t={}){return[x5.of(t),SpA(t.colors),_o.fromClass(d_,{decorations:e=>e.decorations})]}var xpA=["mainAxis","crossAxis","fallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment"],_pA=["mainAxis","crossAxis","limiter"];function TZ(t,e){if(t==null)return{};var A,i,n=(function(a,r){if(a==null)return{};var s={};for(var l in a)if({}.hasOwnProperty.call(a,l)){if(r.indexOf(l)!==-1)continue;s[l]=a[l]}return s})(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(i=0;i{};function TpA(t){return t()}function Y_(t){for(var e=0;e{t=A,e=i}),resolve:t,reject:e}}var JpA=1<<24,jh=16,vD=32,PZ=64,DR=128,pc=512,Zr=1024,mc=2048,KC=4096,b0=8192,qh=16384,yR=32768,ud=65536,OpA=1<<17,jZ=1<<18,qZ=1<<19,wC=1<<25,oD=32768,H_=1<<21,pI=1<<23,M0=Symbol("$state"),VZ=Symbol("legacy props"),YpA=Symbol(""),ph=new class extends Error{constructor(){super(...arguments),w0(this,"name","StaleReactionError"),w0(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};function Pf(t){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function WZ(t){return t===this.v}function ZZ(t,e){return t!=t?e==e:t!==e||t!==null&&typeof t=="object"||typeof t=="function"}function XZ(t){return!ZZ(t,this.v)}var Io=null;function Nh(t){Io=t}function kI(t){return $Z().get(t)}function Nt(t){Io={p:Io,i:!1,c:null,e:null,s:t,x:null,l:Ph&&!(arguments.length>1&&arguments[1]!==void 0&&arguments[1])?{s:null,u:null,$:[]}:null}}function Ft(t){var e=Io,A=e.e;if(A!==null)for(var i of(e.e=null,A))EX(i);return t!==void 0&&(e.x=t),e.i=!0,Io=e.p,t??{}}function Vh(){return!Ph||Io!==null&&Io.l===null}function $Z(t){var e,A;return Io===null&&Pf(),(A=(e=Io).c)!==null&&A!==void 0?A:e.c=new Map((function(i){for(var n=i.p;n!==null;){var o=n.c;if(o!==null)return o;n=n.p}return null})(Io)||void 0)}var Id=[];function AX(){var t=Id;Id=[],Y_(t)}function fd(t){if(Id.length===0&&!Sf){var e=Id;queueMicrotask(()=>{e===Id&&AX()})}Id.push(t)}function HpA(){for(;Id.length>0;)AX()}function eX(t){var e=qn;if(e===null)return jn.f|=pI,t;if((e.f&yR)===0){if((e.f&DR)===0)throw t;e.b.error(t)}else Fh(t,e)}function Fh(t,e){for(;e!==null;){if((e.f&DR)!==0)try{return void e.b.error(t)}catch(A){t=A}e=e.parent}throw t}var Z5=new Set,Jo=null,Mf=null,pg=null,fg=[],bD=null,z_=!1,Sf=!1,aD=new WeakMap,_5=new WeakMap,ld=new WeakMap,gd=new WeakMap,R5=new WeakMap,X5=new WeakMap,$5=new WeakMap,Kl=new WeakSet,pd=class t{constructor(){JZ(this,Kl),w0(this,"committed",!1),w0(this,"current",new Map),w0(this,"previous",new Map),wo(this,aD,new Set),wo(this,_5,new Set),wo(this,ld,0),wo(this,gd,0),wo(this,R5,null),wo(this,X5,[]),wo(this,$5,[]),w0(this,"skipped_effects",new Set),w0(this,"is_fork",!1)}is_deferred(){return this.is_fork||ve(gd,this)>0}process(e){fg=[],Mf=null,this.apply();var A,i={parent:null,effect:null,effects:[],render_effects:[],block_effects:[]};for(var n of e)Wa(Kl,this,tX).call(this,n,i);this.is_fork||Wa(Kl,this,zpA).call(this),this.is_deferred()?(Wa(Kl,this,bh).call(this,i.effects),Wa(Kl,this,bh).call(this,i.render_effects),Wa(Kl,this,bh).call(this,i.block_effects)):(Mf=this,Jo=null,MW(i.render_effects),MW(i.effects),Mf=null,(A=ve(R5,this))===null||A===void 0||A.resolve()),pg=null}capture(e,A){var i;this.previous.has(e)||this.previous.set(e,A),(e.f&pI)===0&&(this.current.set(e,e.v),(i=pg)===null||i===void 0||i.set(e,e.v))}activate(){Jo=this,this.apply()}deactivate(){Jo===this&&(Jo=null,pg=null)}flush(){if(this.activate(),fg.length>0){if(nX(),Jo!==null&&Jo!==this)return}else ve(ld,this)===0&&this.process([]);this.deactivate()}discard(){for(var e of ve(_5,this))e(this);ve(_5,this).clear()}increment(e){Bn(ld,this,ve(ld,this)+1),e&&Bn(gd,this,ve(gd,this)+1)}decrement(e){Bn(ld,this,ve(ld,this)-1),e&&Bn(gd,this,ve(gd,this)-1),this.revive()}revive(){for(var e of ve(X5,this))$r(e,mc),md(e);for(var A of ve($5,this))$r(A,KC),md(A);Bn(X5,this,[]),Bn($5,this,[]),this.flush()}oncommit(e){ve(aD,this).add(e)}ondiscard(e){ve(_5,this).add(e)}settled(){var e;return((e=ve(R5,this))!==null&&e!==void 0?e:Bn(R5,this,zZ())).promise}static ensure(){if(Jo===null){var e=Jo=new t;Z5.add(Jo),Sf||t.enqueue(()=>{Jo===e&&e.flush()})}return Jo}static enqueue(e){fd(e)}apply(){}};function tX(t,e){t.f^=Zr;for(var A=t.first;A!==null;){var i,n=A.f,o=!!(96&n),a=o&&(n&Zr)!==0||(n&b0)!==0||this.skipped_effects.has(A);if((A.f&DR)!==0&&(i=A.b)!==null&&i!==void 0&&i.is_pending()&&(e={parent:e,effect:A,effects:[],render_effects:[],block_effects:[]}),!a&&A.fn!==null){o?A.f^=Zr:4&n?e.effects.push(A):Xh(A)&&((A.f&jh)!==0&&e.block_effects.push(A),Kh(A));var r=A.first;if(r!==null){A=r;continue}}var s=A.parent;for(A=A.next;A===null&&s!==null;)s===e.effect&&(Wa(Kl,this,bh).call(this,e.effects),Wa(Kl,this,bh).call(this,e.render_effects),Wa(Kl,this,bh).call(this,e.block_effects),e=e.parent),A=s.next,s=s.parent}}function bh(t){for(var e of t)((e.f&mc)!==0?ve(X5,this):ve($5,this)).push(e),Wa(Kl,this,iX).call(this,e.deps),$r(e,Zr)}function iX(t){if(t!==null)for(var e of t)2&e.f&&(e.f&oD)!==0&&(e.f^=oD,Wa(Kl,this,iX).call(this,e.deps))}function zpA(){if(ve(gd,this)===0){for(var t of ve(aD,this))t();ve(aD,this).clear()}ve(ld,this)===0&&Wa(Kl,this,PpA).call(this)}function PpA(){if(Z5.size>1){this.previous.clear();var t=pg,e=!0,A={parent:null,effect:null,effects:[],render_effects:[],block_effects:[]};for(var i of Z5)if(i!==this){var n=[];for(var[o,a]of this.current){if(i.current.has(o)){if(!e||a===i.current.get(o))continue;i.current.set(o,a)}n.push(o)}if(n.length!==0){var r=[...i.current.keys()].filter(d=>!this.current.has(d));if(r.length>0){var s=fg;fg=[];var l=new Set,g=new Map;for(var C of n)oX(C,r,l,g);if(fg.length>0){for(var I of(Jo=i,i.apply(),fg))Wa(Kl,i,tX).call(i,I,A);i.deactivate()}fg=s}}}else e=!1;Jo=null,pg=t}this.committed=!0,Z5.delete(this)}function Ro(t){var e=Sf;Sf=!0;try{for(;;){var A;if(HpA(),fg.length===0&&((A=Jo)===null||A===void 0||A.flush(),fg.length===0))return void(bD=null);nX()}}finally{Sf=e}}function nX(){var t=Bd;z_=!0;try{var e=0;for(rD(!0);fg.length>0;){var A=pd.ensure();e++>1e3&&jpA(),A.process(fg),mI.clear()}}finally{z_=!1,rD(t),bD=null}}function jpA(){try{(function(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")})()}catch(t){Fh(t,bD)}}var yC=null;function MW(t){var e=t.length;if(e!==0){for(var A=0;A0)){for(var o of(mI.clear(),yC))if(!(24576&o.f)){for(var a=[o],r=o.parent;r!==null;)yC.has(r)&&(yC.delete(r),a.push(r)),r=r.parent;for(var s=a.length-1;s>=0;s--){var l=a[s];24576&l.f||Kh(l)}}yC.clear()}}yC=null}}function oX(t,e,A,i){if(!A.has(t)&&(A.add(t),t.reactions!==null))for(var n of t.reactions){var o=n.f;2&o?oX(n,e,A,i):4194320&o&&(o&mc)===0&&aX(n,e,i)&&($r(n,mc),md(n))}}function aX(t,e,A){var i=A.get(t);if(i!==void 0)return i;if(t.deps!==null)for(var n of t.deps){if(e.includes(n))return!0;if(2&n.f&&aX(n,e,A))return A.set(n,!0),!0}return A.set(t,!1),!1}function md(t){for(var e=bD=t;e.parent!==null;){var A=(e=e.parent).f;if(z_&&e===qn&&(A&jh)!==0&&(A&jZ)===0)return;if(96&A){if((A&Zr)===0)return;e.f^=Zr}}fg.push(e)}var CI=new WeakMap,hI=new WeakMap,qpA=new WeakMap,cd=new WeakMap,h_=new WeakMap,EI=new WeakMap,II=new WeakMap,MC=new WeakMap,rI=new WeakMap,dd=new WeakMap,Mh=new WeakMap,gh=new WeakMap,Sh=new WeakMap,uf=new WeakMap,ch=new WeakMap,SW=new WeakMap,lI=new WeakSet,P_=class{constructor(e,A,i){var n,o,a,r;JZ(this,lI),w0(this,"parent",void 0),wo(this,CI,!1),wo(this,hI,void 0),wo(this,qpA,null),wo(this,cd,void 0),wo(this,h_,void 0),wo(this,EI,void 0),wo(this,II,null),wo(this,MC,null),wo(this,rI,null),wo(this,dd,null),wo(this,Mh,null),wo(this,gh,0),wo(this,Sh,0),wo(this,uf,!1),wo(this,ch,null),wo(this,SW,(n=()=>(Bn(ch,this,UC(ve(gh,this))),()=>{Bn(ch,this,null)}),a=0,r=UC(0),()=>{xf()&&(c(r),Wh(()=>(a===0&&(o=wA(()=>n(()=>kf(r)))),a+=1,()=>{fd(()=>{var s;(a-=1)==0&&((s=o)===null||s===void 0||s(),o=void 0,kf(r))})})))})),Bn(hI,this,e),Bn(cd,this,A),Bn(h_,this,i),this.parent=qn.b,Bn(CI,this,!!ve(cd,this).pending),Bn(EI,this,Zh(()=>{qn.b=this;var s=Wa(lI,this,VpA).call(this);try{Bn(II,this,S0(()=>i(s)))}catch(l){this.error(l)}return ve(Sh,this)>0?Wa(lI,this,xW).call(this):Bn(CI,this,!1),()=>{var l;(l=ve(Mh,this))===null||l===void 0||l.remove()}},589952))}is_pending(){return ve(CI,this)||!!this.parent&&this.parent.is_pending()}has_pending_snippet(){return!!ve(cd,this).pending}update_pending_count(e){Wa(lI,this,rX).call(this,e),Bn(gh,this,ve(gh,this)+e),ve(ch,this)&&Lh(ve(ch,this),ve(gh,this))}get_effect_pending(){return ve(SW,this).call(this),c(ve(ch,this))}error(e){var A=ve(cd,this).onerror,i=ve(cd,this).failed;if(ve(uf,this)||!A&&!i)throw e;ve(II,this)&&(Xr(ve(II,this)),Bn(II,this,null)),ve(MC,this)&&(Xr(ve(MC,this)),Bn(MC,this,null)),ve(rI,this)&&(Xr(ve(rI,this)),Bn(rI,this,null));var n=!1,o=!1,a=()=>{n?console.warn("https://svelte.dev/e/svelte_boundary_reset_noop"):(n=!0,o&&(function(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")})(),pd.ensure(),Bn(gh,this,0),ve(rI,this)!==null&&Gh(ve(rI,this),()=>{Bn(rI,this,null)}),Bn(CI,this,this.has_pending_snippet()),Bn(II,this,Wa(lI,this,kW).call(this,()=>(Bn(uf,this,!1),S0(()=>ve(h_,this).call(this,ve(hI,this)))))),ve(Sh,this)>0?Wa(lI,this,xW).call(this):Bn(CI,this,!1))},r=jn;try{El(null),o=!0,A?.(e,a),o=!1}catch(s){Fh(s,ve(EI,this)&&ve(EI,this).parent)}finally{El(r)}i&&fd(()=>{Bn(rI,this,Wa(lI,this,kW).call(this,()=>{pd.ensure(),Bn(uf,this,!0);try{return S0(()=>{i(ve(hI,this),()=>e,()=>a)})}catch(s){return Fh(s,ve(EI,this).parent),null}finally{Bn(uf,this,!1)}}))})}};function VpA(){var t=ve(hI,this);return ve(CI,this)&&(Bn(Mh,this,wI()),ve(hI,this).before(ve(Mh,this)),t=ve(Mh,this)),t}function kW(t){var e=qn,A=jn,i=Io;wg(ve(EI,this)),El(ve(EI,this)),Nh(ve(EI,this).ctx);try{return t()}catch(n){return eX(n),null}finally{wg(e),El(A),Nh(i)}}function xW(){var t=ve(cd,this).pending;ve(II,this)!==null&&(Bn(dd,this,document.createDocumentFragment()),ve(dd,this).append(ve(Mh,this)),DX(ve(II,this),ve(dd,this))),ve(MC,this)===null&&Bn(MC,this,S0(()=>t(ve(hI,this))))}function rX(t){var e;this.has_pending_snippet()?(Bn(Sh,this,ve(Sh,this)+t),ve(Sh,this)===0&&(Bn(CI,this,!1),ve(MC,this)&&Gh(ve(MC,this),()=>{Bn(MC,this,null)}),ve(dd,this)&&(ve(hI,this).before(ve(dd,this)),Bn(dd,this,null)))):this.parent&&Wa(lI,e=this.parent,rX).call(e,t)}function sX(t,e,A,i){var n=Vh()?jf:it;if(A.length!==0||t.length!==0){var o=Jo,a=qn,r=(function(){var l=qn,g=jn,C=Io,I=Jo;return function(){var d=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];wg(l),El(g),Nh(C),d&&I?.activate()}})();t.length>0?Promise.all(t).then(()=>{r();try{return s()}finally{o?.deactivate(),N5()}}):s()}else i(e.map(n));function s(){Promise.all(A.map(l=>(function(g){var C=qn;C===null&&(function(){throw new Error("https://svelte.dev/e/async_derived_orphan")})();var I=C.b,d=void 0,h=UC(Wr),E=!jn,f=new Map;return(function(m){Dc(4718592,m,!0)})(()=>{var m=zZ();d=m.promise;try{Promise.resolve(g()).then(m.resolve,m.reject).then(()=>{v===Jo&&v.committed&&v.deactivate(),N5()})}catch(x){m.reject(x),N5()}var v=Jo;if(E){var k,S=!I.is_pending();I.update_pending_count(1),v.increment(S),(k=f.get(v))===null||k===void 0||k.reject(ph),f.delete(v),f.set(v,m)}var b=function(x){var F=arguments.length>1&&arguments[1]!==void 0?arguments[1]:void 0;if(v.activate(),F)F!==ph&&(h.f|=pI,Lh(h,F));else for(var[z,P]of((h.f&pI)!==0&&(h.f^=pI),Lh(h,x),f)){if(f.delete(z),z===v)break;P.reject(ph)}E&&(I.update_pending_count(-1),v.decrement(S))};m.promise.then(b,x=>b(null,x||"unknown"))}),SD(()=>{for(var m of f.values())m.reject(ph)}),new Promise(m=>{function v(k){function S(){k===d?m(h):v(d)}k.then(S,S)}v(d)})})(l))).then(l=>{r();try{i([...e.map(n),...l])}catch(g){(a.f&qh)===0&&Fh(g,a)}o?.deactivate(),N5()}).catch(l=>{Fh(l,a)})}}function N5(){wg(null),El(null),Nh(null)}function jf(t){var e=jn!==null&&2&jn.f?jn:null;return qn!==null&&(qn.f|=qZ),{ctx:Io,deps:null,effects:null,equals:WZ,f:2050,fn:t,reactions:null,rv:0,v:Wr,wv:0,parent:e??qn,ac:null}}function Il(t){var e=jf(t);return yX(e),e}function it(t){var e=jf(t);return e.equals=XZ,e}function lX(t){var e=t.effects;if(e!==null){t.effects=null;for(var A=0;A1&&arguments[1]!==void 0&&arguments[1],n=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],o=UC(t);return i||(o.equals=XZ),Ph&&n&&Io!==null&&Io.l!==null&&((A=(e=Io.l).s)!==null&&A!==void 0?A:e.s=[]).push(o),o}function Tl(t,e){return N(t,wA(()=>c(t))),e}function N(t,e){var A,i=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return jn===null||y0&&(jn.f&OpA)===0||!Vh()||!(4325394&jn.f)||(A=FC)!==null&&A!==void 0&&A.includes(t)||(function(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")})(),Lh(t,i?mh(e):e)}function Lh(t,e){if(!t.equals(e)){var A=t.v;Sd?mI.set(t,e):mI.set(t,A),t.v=e;var i=pd.ensure();i.capture(t,A),2&t.f&&((t.f&mc)!==0&&vR(t),$r(t,(t.f&pc)!==0?Zr:KC)),t.wv=bX(),dX(t,mc),!Vh()||qn===null||(qn.f&Zr)===0||96&qn.f||(Eg===null?(function(n){Eg=n})([t]):Eg.push(t)),!i.is_fork&&Q_.size>0&&!_W&&(function(){_W=!1;var n=Bd;rD(!0);var o=Array.from(Q_);try{for(var a of o)(a.f&Zr)!==0&&$r(a,KC),Xh(a)&&Kh(a)}finally{rD(n)}Q_.clear()})()}return e}function RW(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=c(t),i=e===1?A++:A--;return N(t,A),i}function kf(t){N(t,t.v+1)}function dX(t,e){var A=t.reactions;if(A!==null)for(var i=Vh(),n=A.length,o=0;o{if(Ed===o)return r();var s=jn,l=Ed;El(null),GW(o);var g=r();return El(s),GW(l),g};return i&&A.set("length",DC(t.length)),new Proxy(t,{defineProperty(r,s,l){"value"in l&&l.configurable!==!1&&l.enumerable!==!1&&l.writable!==!1||(function(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")})();var g=A.get(s);return g===void 0?g=a(()=>{var C=DC(l.value);return A.set(s,C),C}):N(g,l.value,!0),!0},deleteProperty(r,s){var l=A.get(s);if(l===void 0){if(s in r){var g=a(()=>DC(Wr));A.set(s,g),kf(n)}}else N(l,Wr),kf(n);return!0},get(r,s,l){var g;if(s===M0)return t;var C=A.get(s),I=s in r;if(C===void 0&&(!I||(g=RC(r,s))!==null&&g!==void 0&&g.writable)&&(C=a(()=>DC(mh(I?r[s]:Wr))),A.set(s,C)),C!==void 0){var d=c(C);return d===Wr?void 0:d}return Reflect.get(r,s,l)},getOwnPropertyDescriptor(r,s){var l=Reflect.getOwnPropertyDescriptor(r,s);if(l&&"value"in l){var g=A.get(s);g&&(l.value=c(g))}else if(l===void 0){var C=A.get(s),I=C?.v;if(C!==void 0&&I!==Wr)return{enumerable:!0,configurable:!0,value:I,writable:!0}}return l},has(r,s){var l;if(s===M0)return!0;var g=A.get(s),C=g!==void 0&&g.v!==Wr||Reflect.has(r,s);return(g!==void 0||qn!==null&&(!C||(l=RC(r,s))!==null&&l!==void 0&&l.writable))&&(g===void 0&&(g=a(()=>DC(C?mh(r[s]):Wr)),A.set(s,g)),c(g)===Wr)?!1:C},set(r,s,l,g){var C,I=A.get(s),d=s in r;if(i&&s==="length")for(var h=l;hDC(Wr)),A.set(h+"",E))}I===void 0?(!d||(C=RC(r,s))!==null&&C!==void 0&&C.writable)&&(N(I=a(()=>DC(void 0)),mh(l)),A.set(s,I)):(d=I.v!==Wr,N(I,a(()=>mh(l))));var f=Reflect.getOwnPropertyDescriptor(r,s);if(f!=null&&f.set&&f.set.call(g,l),!d){if(i&&typeof s=="string"){var m=A.get("length"),v=Number(s);Number.isInteger(v)&&v>=m.v&&N(m,v+1)}kf(n)}return!0},ownKeys(r){c(n);var s=Reflect.ownKeys(r).filter(C=>{var I=A.get(C);return I===void 0||I.v!==Wr});for(var[l,g]of A)g.v===Wr||l in r||s.push(l);return s},setPrototypeOf(){(function(){throw new Error("https://svelte.dev/e/state_prototype_fixed")})()}})}function NW(t){try{if(t!==null&&typeof t=="object"&&M0 in t)return t[M0]}catch(e){}return t}function WpA(t,e){return Object.is(NW(t),NW(e))}function wI(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";return document.createTextNode(t)}function Jl(t){return CX.call(t)}function qf(t){return IX.call(t)}function dA(t,e){return Jl(t)}function et(t){var e=Jl(t);return e instanceof Comment&&e.data===""?qf(e):e}function _A(t){for(var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=t;e--;)A=qf(A);return A}var FW=!1;function MD(t){var e=jn,A=qn;El(null),wg(null);try{return t()}finally{El(e),wg(A)}}function ZpA(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:A;t.addEventListener(e,()=>MD(A));var n=t.__on_r;t.__on_r=n?()=>{n(),i(!0)}:()=>i(!0),FW||(FW=!0,document.addEventListener("reset",o=>{Promise.resolve().then(()=>{if(!o.defaultPrevented)for(var a of o.target.elements){var r;(r=a.__on_r)===null||r===void 0||r.call(a)}})},{capture:!0}))}function BX(t){qn===null&&(jn===null&&(function(){throw new Error("https://svelte.dev/e/effect_orphan")})(),(function(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")})()),Sd&&(function(){throw new Error("https://svelte.dev/e/effect_in_teardown")})()}function Dc(t,e,A){var i=qn;i!==null&&(i.f&b0)!==0&&(t|=b0);var n={ctx:Io,deps:null,nodes:null,f:t|mc|pc,first:null,fn:e,last:null,next:null,parent:i,b:i&&i.b,prev:null,teardown:null,wv:0,ac:null};if(A)try{Kh(n),n.f|=yR}catch(s){throw Xr(n),s}else e!==null&&md(n);var o=n;if(A&&o.deps===null&&o.teardown===null&&o.nodes===null&&o.first===o.last&&(o.f&qZ)===0&&(o=o.first,(t&jh)!==0&&(t&ud)!==0&&o!==null&&(o.f|=ud)),o!==null&&(o.parent=i,i!==null&&(function(s,l){var g=l.last;g===null?l.last=l.first=s:(g.next=s,s.prev=g,l.last=s)})(o,i),jn!==null&&2&jn.f&&(t&PZ)===0)){var a,r=jn;((a=r.effects)!==null&&a!==void 0?a:r.effects=[]).push(o)}return n}function xf(){return jn!==null&&!y0}function SD(t){var e=Dc(8,null,!1);return $r(e,Zr),e.teardown=t,e}function j_(t){BX();var e=qn.f;if(!(!jn&&(e&vD)!==0&&(e&yR)===0))return EX(t);var A,i=Io;((A=i.e)!==null&&A!==void 0?A:i.e=[]).push(t)}function EX(t){return Dc(1048580,t,!1)}function _r(t){return Dc(4,t,!1)}function KA(t,e){var A={effect:null,ran:!1,deps:t};Io.l.$.push(A),A.effect=Wh(()=>{t(),A.ran||(A.ran=!0,wA(e))})}function Rn(){var t=Io;Wh(()=>{for(var e of t.l.$){e.deps();var A=e.effect;(A.f&Zr)!==0&&$r(A,KC),Xh(A)&&Kh(A),e.ran=!1}})}function Wh(t){return Dc(8|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function Se(t){sX(arguments.length>3&&arguments[3]!==void 0?arguments[3]:[],arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],e=>{Dc(8,()=>t(...e.map(c)),!0)})}function Zh(t){return Dc(jh|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function hX(t){return Dc(JpA|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function S0(t){return Dc(524320,t,!0)}function QX(t){var e=t.teardown;if(e!==null){var A=Sd,i=jn;LW(!0),El(null);try{e.call(null)}finally{LW(A),El(i)}}}function uX(t){var e=arguments.length>1&&arguments[1]!==void 0&&arguments[1],A=t.first;t.first=t.last=null;for(var i,n=function(){var o=A.ac;o!==null&&MD(()=>{o.abort(ph)}),i=A.next,(A.f&PZ)!==0?A.parent=null:Xr(A,e),A=i};A!==null;)n()}function Xr(t){var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=!1;!e&&(t.f&jZ)===0||t.nodes===null||t.nodes.end===null||(fX(t.nodes.start,t.nodes.end),A=!0),uX(t,e&&!A),sD(t,0),$r(t,qh);var i=t.nodes&&t.nodes.t;if(i!==null)for(var n of i)n.stop();QX(t);var o=t.parent;o!==null&&o.first!==null&&pX(t),t.next=t.prev=t.teardown=t.ctx=t.deps=t.fn=t.nodes=t.ac=null}function fX(t,e){for(;t!==null;){var A=t===e?null:qf(t);t.remove(),t=A}}function pX(t){var e=t.parent,A=t.prev,i=t.next;A!==null&&(A.next=i),i!==null&&(i.prev=A),e!==null&&(e.first===t&&(e.first=i),e.last===t&&(e.last=A))}function Gh(t,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],i=[];mX(t,i,!0);var n=()=>{A&&Xr(t),e&&e()},o=i.length;if(o>0){var a=()=>--o||n();for(var r of i)r.out(a)}else n()}function mX(t,e,A){if((t.f&b0)===0){t.f^=b0;var i=t.nodes&&t.nodes.t;if(i!==null)for(var n of i)(n.is_global||A)&&e.push(n);for(var o=t.first;o!==null;){var a=o.next;mX(o,e,((o.f&ud)!==0||(o.f&vD)!==0&&(t.f&jh)!==0)&&A),o=a}}}function q_(t){wX(t,!0)}function wX(t,e){if((t.f&b0)!==0){t.f^=b0,(t.f&Zr)===0&&($r(t,mc),md(t));for(var A=t.first;A!==null;){var i=A.next;wX(A,((A.f&ud)!==0||(A.f&vD)!==0)&&e),A=i}var n=t.nodes&&t.nodes.t;if(n!==null)for(var o of n)(o.is_global||e)&&o.in()}}function DX(t,e){if(t.nodes)for(var A=t.nodes.start,i=t.nodes.end;A!==null;){var n=A===i?null:qf(A);e.append(A),A=n}}var XpA=null;var Bd=!1;function rD(t){Bd=t}var Sd=!1;function LW(t){Sd=t}var jn=null,y0=!1;function El(t){jn=t}var qn=null;function wg(t){qn=t}var FC=null;function yX(t){jn!==null&&(FC===null?FC=[t]:FC.push(t))}var Ns=null,Gl=0,Eg=null,vX=1,_f=0,Ed=_f;function GW(t){Ed=t}function bX(){return++vX}function Xh(t){var e=t.f;if((e&mc)!==0)return!0;if(2&e&&(t.f&=-32769),(e&KC)!==0){var A=t.deps;if(A!==null)for(var i=A.length,n=0;nt.wv)return!0}(e&pc)!==0&&pg===null&&$r(t,Zr)}return!1}function MX(t,e){var A,i=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],n=t.reactions;if(n!==null&&((A=FC)===null||A===void 0||!A.includes(t)))for(var o=0;o{t.ac.abort(ph)}),t.ac=null);try{t.f|=H_;var g=(0,t.fn)(),C=t.deps;if(Ns!==null){var I;if(sD(t,Gl),C!==null&&Gl>0)for(C.length=Gl+Ns.length,I=0;I1&&arguments[1]!==void 0?arguments[1]:new Set;if(!(typeof t!="object"||t===null||t instanceof EventTarget||e.has(t))){for(var A in e.add(t),t instanceof Date&&t.getTime(),t)try{V_(t[A],e)}catch(r){}var i=wR(t);if(i!==Object.prototype&&i!==Array.prototype&&i!==Map.prototype&&i!==Set.prototype&&i!==Date.prototype){var n=HZ(i);for(var o in n){var a=n[o].get;if(a)try{a.call(t)}catch(r){}}}}}var NX=new Set,W_=new Set;function FX(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};function n(o){if(i.capture||Df.call(e,o),!o.cancelBubble)return MD(()=>A?.call(this,o))}return t.startsWith("pointer")||t.startsWith("touch")||t==="wheel"?fd(()=>{e.addEventListener(t,n,i)}):e.addEventListener(t,n,i),n}function fe(t,e,A,i,n){var o={capture:i,passive:n},a=FX(t,e,A,o);(e===document.body||e===window||e===document||e instanceof HTMLMediaElement)&&SD(()=>{e.removeEventListener(t,a,o)})}function Vf(t){for(var e=0;ea||i});var C=jn,I=qn;El(null),wg(null);try{for(var d,h=[];a!==null;){var E=a.assignedSlot||a.parentNode||a.host||null;try{var f=a["__"+n];f==null||a.disabled&&t.target!==a||f.call(a,t)}catch(k){d?h.push(k):d=k}if(t.cancelBubble||E===A||E===null)break;a=E}if(d){var m=function(k){queueMicrotask(()=>{throw k})};for(var v of h)m(v);throw d}}finally{t.__root=A,delete t.currentTarget,El(C),wg(I)}}}function bR(t){var e=document.createElement("template");return e.innerHTML=t.replaceAll("",""),e.content}function wd(t,e){var A=qn;A.nodes===null&&(A.nodes={start:t,end:e,a:null,t:null})}function JA(t,e){var A,i=!!(1&e),n=!!(2&e),o=!t.startsWith("");return()=>{A===void 0&&(A=bR(o?t:""+t),i||(A=Jl(A)));var a=n||cX?document.importNode(A,!0):A.cloneNode(!0);return i?wd(Jl(a),a.lastChild):wd(a,a),a}}function xI(t,e){return(function(A,i){var n,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"svg",a=!A.startsWith(""),r=!!(1&i),s="<".concat(o,">").concat(a?A:""+A,"");return()=>{if(!n){var l=Jl(bR(s));if(r)for(n=document.createDocumentFragment();Jl(l);)n.appendChild(Jl(l));else n=Jl(l)}var g=n.cloneNode(!0);return r?wd(Jl(g),g.lastChild):wd(g,g),g}})(t,e,"svg")}function dr(){var t=wI((arguments.length>0&&arguments[0]!==void 0?arguments[0]:"")+"");return wd(t,t),t}function Fi(){var t=document.createDocumentFragment(),e=document.createComment(""),A=wI();return t.append(e,A),wd(e,A),t}function CA(t,e){t!==null&&t.before(e)}var emA=["beforeinput","click","change","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"],tmA={formnovalidate:"formNoValidate",ismap:"isMap",nomodule:"noModule",playsinline:"playsInline",readonly:"readOnly",defaultvalue:"defaultValue",defaultchecked:"defaultChecked",srcobject:"srcObject",novalidate:"noValidate",allowfullscreen:"allowFullscreen",disablepictureinpicture:"disablePictureInPicture",disableremoteplayback:"disableRemotePlayback"},imA=["touchstart","touchmove"];function nmA(t){return imA.includes(t)}function Lt(t,e){var A,i=e==null?"":typeof e=="object"?e+"":e;i!==((A=t.__t)!==null&&A!==void 0?A:t.__t=t.nodeValue)&&(t.__t=i,t.nodeValue=i+"")}function omA(t,e){return(function(A,i){var{target:n,anchor:o,props:a={},events:r,context:s,intro:l=!0}=i;(function(){if(NC===void 0){NC=window,cX=/Firefox/.test(navigator.userAgent);var h=Element.prototype,E=Node.prototype,f=Text.prototype;CX=RC(E,"firstChild").get,IX=RC(E,"nextSibling").get,bW(h)&&(h.__click=void 0,h.__className=void 0,h.__attributes=null,h.__style=void 0,h.__e=void 0),bW(f)&&(f.__t=void 0)}})();var g=new Set,C=h=>{for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};return new Promise(m=>{f.outro?Gh(E,()=>{Xr(E),m(void 0)}):(Xr(E),m(void 0))})}})(()=>{var h=o??n.appendChild(wI());return(function(E,f,m){new P_(E,f,m)})(h,{pending:()=>{}},E=>{s&&(Nt({}),Io.c=s),r&&(a.$$events=r),I=A(E,a)||{},s&&Ft()}),()=>{for(var E of g){n.removeEventListener(E,Df);var f=Ch.get(E);--f===0?(document.removeEventListener(E,Df),Ch.delete(E)):Ch.set(E,f)}var m;W_.delete(C),h!==o&&((m=h.parentNode)===null||m===void 0||m.removeChild(h))}});return Z_.set(I,d),I})(t,e)}var Ch=new Map,Z_=new WeakMap,Ih,pC=new WeakMap,ad=new WeakMap,mC=new WeakMap,ff=new WeakMap,u_=new WeakMap,KW=new WeakMap,amA=new WeakMap,Uh=class{constructor(e){var A=this,i=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];w0(this,"anchor",void 0),wo(this,pC,new Map),wo(this,ad,new Map),wo(this,mC,new Map),wo(this,ff,new Set),wo(this,u_,!0),wo(this,KW,()=>{var n=Jo;if(ve(pC,this).has(n)){var o=ve(pC,this).get(n),a=ve(ad,this).get(o);if(a)q_(a),ve(ff,this).delete(o);else{var r=ve(mC,this).get(o);r&&(ve(ad,this).set(o,r.effect),ve(mC,this).delete(o),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),a=r.effect)}for(var[s,l]of ve(pC,this)){if(ve(pC,this).delete(s),s===n)break;var g=ve(mC,this).get(l);g&&(Xr(g.effect),ve(mC,this).delete(l))}var C=function(h,E){if(h===o||ve(ff,A).has(h))return 1;var f=()=>{if(Array.from(ve(pC,A).values()).includes(h)){var m=document.createDocumentFragment();DX(E,m),m.append(wI()),ve(mC,A).set(h,{effect:E,fragment:m})}else Xr(E);ve(ff,A).delete(h),ve(ad,A).delete(h)};ve(u_,A)||!a?(ve(ff,A).add(h),Gh(E,f,!1)):f()};for(var[I,d]of ve(ad,this))C(I,d)}}),wo(this,amA,n=>{ve(pC,this).delete(n);var o=Array.from(ve(pC,this).values());for(var[a,r]of ve(mC,this))o.includes(a)||(Xr(r.effect),ve(mC,this).delete(a))}),this.anchor=e,Bn(u_,this,i)}ensure(e,A){var i=Jo;!A||ve(ad,this).has(e)||ve(mC,this).has(e)||ve(ad,this).set(e,S0(()=>A(this.anchor))),ve(pC,this).set(i,e),ve(KW,this).call(this)}};function As(t){Io===null&&Pf(),Ph&&Io.l!==null?LX(Io).m.push(t):j_(()=>{var e=wA(t);if(typeof e=="function")return e})}function Dg(t){Io===null&&Pf(),As(()=>()=>wA(t))}function rmA(){var t=Io;return t===null&&Pf(),(e,A,i)=>{var n,o=(n=t.s.$$events)===null||n===void 0?void 0:n[e];if(o){var a=zf(o)?o.slice():[o],r=(function(l,g){var{bubbles:C=!1,cancelable:I=!1}=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return new CustomEvent(l,{detail:g,bubbles:C,cancelable:I})})(e,A,i);for(var s of a)s.call(t.x,r);return!r.defaultPrevented}return!0}}function smA(t){Io===null&&Pf(),Io.l===null&&(function(){throw new Error("https://svelte.dev/e/lifecycle_legacy_only")})(),LX(Io).b.push(t)}function LX(t){var e,A=t.l;return(e=A.u)!==null&&e!==void 0?e:A.u={a:[],b:[],m:[]}}function jA(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=new Uh(t);function n(o,a){i.ensure(o,a)}Zh(()=>{var o=!1;e(function(a){o=!0,n(!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],a)}),o||n(!1,null)},A?ud:0)}function GX(t,e,A){var i=new Uh(t),n=!Vh();Zh(()=>{var o=e();n&&o!==null&&typeof o=="object"&&(o={}),i.ensure(o,A)})}function ka(t,e){return e}function f_(t){for(var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=0;A5&&arguments[5]!==void 0?arguments[5]:null,a=t,r=new Map;!(4&e)||(a=t.appendChild(wI()));var s,l=null,g=it(()=>{var E=A();return zf(E)?E:E==null?[]:W5(E)}),C=!0;function I(){h.fallback=l,(function(E,f,m,v,k){var S,b,x,F,z,P=!!(8&v),Z=f.length,tA=E.items,W=E.effect.first,BA=null,X=[],iA=[];if(P)for(z=0;z0){var YA=4&v&&Z===0?m:null;if(P){for(z=0;z<_e;z+=1){var fA;(fA=Je[z].nodes)===null||fA===void 0||(fA=fA.a)===null||fA===void 0||fA.measure()}for(z=0;z<_e;z+=1){var XA;(XA=Je[z].nodes)===null||XA===void 0||(XA=XA.a)===null||XA===void 0||XA.fix()}}(function(DA,ee,NA){for(var ke,HA=ee.length,vA=ee.length,Gt=function(){var pt=ee[ft];Gh(pt,()=>{if(ke){if(ke.pending.delete(pt),ke.done.add(pt),ke.pending.size===0){var xe=DA.outrogroups;f_(W5(ke.done)),xe.delete(ke),xe.size===0&&(DA.outrogroups=null)}}else vA-=1},!1)},ft=0;ft{if(b!==void 0)for(F of b){var DA;(DA=F.nodes)===null||DA===void 0||(DA=DA.a)===null||DA===void 0||DA.apply()}})})(h,s,a,e,i),l!==null&&(s.length===0?(l.f&wC)===0?q_(l):(l.f^=wC,pf(l,null,a)):Gh(l,()=>{l=null}))}var d=Zh(()=>{for(var E=(s=c(g)).length,f=new Set,m=0;mo(a)):(l=S0(()=>o(Ih??(Ih=wI())))).f|=wC),C||I(),c(g)}),h={effect:d,items:r,outrogroups:null,fallback:l};C=!1}function lmA(t,e,A,i,n,o,a,r){var s=1&a?16&a?UC(A):EA(A,!1,!1):null,l=2&a?UC(n):null;return{v:s,i:l,e:S0(()=>(o(e,s??A,l??n,r),()=>{t.delete(i)}))}}function pf(t,e,A){if(t.nodes)for(var i=t.nodes.start,n=t.nodes.end,o=e&&(e.f&wC)===0?e.nodes.start:A;i!==null;){var a=qf(i);if(o.before(i),i===n)return;i=a}}function sI(t,e,A){e===null?t.effect.first=A:e.next=A,A===null?t.effect.last=e:A.prev=e}function KX(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=arguments.length>3&&arguments[3]!==void 0&&arguments[3],n=t,o="";Se(()=>{var a,r=qn;if(o!==(o=(a=e())!==null&&a!==void 0?a:"")&&(r.nodes!==null&&(fX(r.nodes.start,r.nodes.end),r.nodes=null),o!=="")){var s=o+"";A?s="".concat(s,""):i&&(s="".concat(s,""));var l=bR(s);if((A||i)&&(l=Jl(l)),wd(Jl(l),l.lastChild),A||i)for(;Jl(l);)n.before(Jl(l));else n.before(l)}})}function Ia(t,e,A,i,n){var o,a=(o=e.$$slots)===null||o===void 0?void 0:o[A],r=!1;a===!0&&(a=e[A==="default"?"children":A],r=!0),a===void 0?n!==null&&n(t):a(t,r?()=>i:i)}function UX(t,e,A){var i=new Uh(t);Zh(()=>{var n,o=(n=e())!==null&&n!==void 0?n:null;i.ensure(o,o&&(a=>A(a,o)))},ud)}function ms(t,e,A){_r(()=>{var i=wA(()=>e(t,A?.())||{});if(A&&i!=null&&i.update){var n=!1,o={};Wh(()=>{var a=A();K(a),n&&ZZ(o,a)&&(o=a,i.update(a))}),n=!0}if(i!=null&&i.destroy)return()=>i.destroy()})}function gmA(t,e){var A,i=void 0;hX(()=>{i!==(i=e())&&(A&&(Xr(A),A=null),i&&(A=S0(()=>{_r(()=>i(t))})))})}function TX(t){var e,A,i="";if(typeof t=="string"||typeof t=="number")i+=t;else if(typeof t=="object")if(Array.isArray(t)){var n=t.length;for(e=0;e1&&arguments[1]!==void 0&&arguments[1]?" !important;":";",A="";for(var i in t){var n=t[i];n!=null&&n!==""&&(A+=" "+i+": "+n+e)}return A}function p_(t){return t[0]!=="-"||t[1]!=="-"?t.toLowerCase():t}function ii(t,e,A,i,n,o){var a=t.__className;if(a!==A||a===void 0){var r=(function(g,C,I){var d=g==null?"":""+g;if(C&&(d=d?d+" "+C:C),I){for(var h in I)if(I[h])d=d?d+" "+h:h;else if(d.length)for(var E=h.length,f=0;(f=d.indexOf(h,f))>=0;){var m=f+E;f!==0&&!UW.includes(d[f-1])||m!==d.length&&!UW.includes(d[m])?f=m:d=(f===0?"":d.substring(0,f))+d.substring(m+1)}}return d===""?null:d})(A,i,o);r==null?t.removeAttribute("class"):e?t.className=r:t.setAttribute("class",r),t.__className=A}else if(o&&n!==o)for(var s in o){var l=!!o[s];n!=null&&l===!!n[s]||t.classList.toggle(s,l)}return o}function m_(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},A=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0;for(var n in A){var o=A[n];e[n]!==o&&(A[n]==null?t.style.removeProperty(n):t.style.setProperty(n,o,i))}}function mg(t,e,A,i){if(t.__style!==e){var n=(function(o,a){if(a){var r,s,l="";if(Array.isArray(a)?(r=a[0],s=a[1]):r=a,o){o=String(o).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var g=!1,C=0,I=!1,d=[];r&&d.push(...Object.keys(r).map(p_)),s&&d.push(...Object.keys(s).map(p_));for(var h=0,E=-1,f=o.length,m=0;m2&&arguments[2]!==void 0&&arguments[2];if(t.multiple){if(e==null)return;if(!zf(e))return void console.warn("https://svelte.dev/e/select_multiple_invalid_value");for(var i of t.options)i.selected=e.includes(JW(i))}else{for(i of t.options)if(WpA(JW(i),e))return void(i.selected=!0);A&&e===void 0||(t.selectedIndex=-1)}}function cmA(t){var e=new MutationObserver(()=>{X_(t,t.__value)});e.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),SD(()=>{e.disconnect()})}function JW(t){return"__value"in t?t.__value:t.value}var uh=Symbol("class"),mf=Symbol("style"),JX=Symbol("is custom element"),OX=Symbol("is html");function Dd(t,e){var A=MR(t);A.value!==(A.value=e??void 0)&&(t.value!==e||e===0&&t.nodeName==="PROGRESS")&&(t.value=e??"")}function _n(t,e,A,i){var n=MR(t);n[e]!==(n[e]=A)&&(e==="loading"&&(t[YpA]=A),A==null?t.removeAttribute(e):typeof A!="string"&&YX(t).includes(e)?t[e]=A:t.setAttribute(e,A))}function CmA(t,e,A,i){var n,o=MR(t),a=o[JX],r=!o[OX],s=e||{},l=t.tagName==="OPTION";for(var g in e)g in A||(A[g]=null);A.class?A.class=bI(A.class):(i||A[uh])&&(A.class=null),A[mf]&&((n=A.style)!==null&&n!==void 0||(A.style=null));var C,I,d,h,E,f,m=YX(t),v=function(S){var b=A[S];if(l&&S==="value"&&b==null)return t.value=t.__value="",s[S]=b,0;if(S==="class")return C=t.namespaceURI==="http://www.w3.org/1999/xhtml",ii(t,C,b,i,e?.[uh],A[uh]),s[S]=b,s[uh]=A[uh],0;if(S==="style")return mg(t,b,e?.[mf],A[mf]),s[S]=b,s[mf]=A[mf],0;if(b===(I=s[S])&&(b!==void 0||!t.hasAttribute(S))||(s[S]=b,(d=S[0]+S[1])==="$$"))return 0;if(d==="on"){var x={},F="$$"+S,z=S.slice(2);if(h=(function(X){return emA.includes(X)})(z),(function(X){return X.endsWith("capture")&&X!=="gotpointercapture"&&X!=="lostpointercapture"})(z)&&(z=z.slice(0,-7),x.capture=!0),!h&&I){if(b!=null)return 0;t.removeEventListener(z,s[F],x),s[F]=null}if(b!=null)if(h)t["__".concat(z)]=b,Vf([z]);else{let X=function(iA){s[S].call(this,iA)};var BA=X;s[F]=FX(z,t,X,x)}else h&&(t["__".concat(z)]=void 0)}else if(S==="style")_n(t,S,b);else if(S==="autofocus")(function(X,iA){if(iA){var AA=document.body;X.autofocus=!0,fd(()=>{document.activeElement===AA&&X.focus()})}})(t,!!b);else if(a||S!=="__value"&&(S!=="value"||b==null))if(S==="selected"&&l)(function(X,iA){iA?X.hasAttribute("selected")||X.setAttribute("selected",""):X.removeAttribute("selected")})(t,b);else if(E=S,r||(E=(function(X){var iA;return X=X.toLowerCase(),(iA=tmA[X])!==null&&iA!==void 0?iA:X})(E)),f=E==="defaultValue"||E==="defaultChecked",b!=null||a||f)f||m.includes(E)&&(a||typeof b!="string")?(t[E]=b,E in o&&(o[E]=Wr)):typeof b!="function"&&_n(t,E,b);else if(o[S]=null,E==="value"||E==="checked"){var P=t,Z=e===void 0;if(E==="value"){var tA=P.defaultValue;P.removeAttribute(E),P.defaultValue=tA,P.value=P.__value=Z?tA:null}else{var W=P.defaultChecked;P.removeAttribute(E),P.defaultChecked=W,P.checked=!!Z&&W}}else t.removeAttribute(S);else t.value=t.__value=b};for(var k in A)v(k);return s}function AD(t,e){var A=arguments.length>5?arguments[5]:void 0,i=arguments.length>6&&arguments[6]!==void 0&&arguments[6],n=arguments.length>7&&arguments[7]!==void 0&&arguments[7];sX(arguments.length>4&&arguments[4]!==void 0?arguments[4]:[],arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],arguments.length>3&&arguments[3]!==void 0?arguments[3]:[],o=>{var a=void 0,r={},s=t.nodeName==="SELECT",l=!1;if(hX(()=>{var C=e(...o.map(c)),I=CmA(t,a,C,A,i,n);for(var d of(l&&s&&"value"in C&&X_(t,C.value),Object.getOwnPropertySymbols(r)))C[d]||Xr(r[d]);for(var h of Object.getOwnPropertySymbols(C)){var E=C[h];h.description!=="@attach"||a&&E===a[h]||(r[h]&&Xr(r[h]),r[h]=S0(()=>gmA(t,()=>E))),I[h]=E}a=I}),s){var g=t;_r(()=>{X_(g,a.value,!0),cmA(g)})}l=!0})}function MR(t){var e;return(e=t.__attributes)!==null&&e!==void 0?e:t.__attributes={[JX]:t.nodeName.includes("-"),[OX]:t.namespaceURI==="http://www.w3.org/1999/xhtml"}}var OW=new Map;function YX(t){var e,A=t.getAttribute("is")||t.nodeName,i=OW.get(A);if(i)return i;OW.set(A,i=[]);for(var n=t,o=Element.prototype;o!==n;){for(var a in e=HZ(n))e[a].set&&i.push(a);n=wR(n)}return i}function lD(t,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e,i=new WeakSet;ZpA(t,"input",(function(){var n=zt(function*(o){var a=o?t.defaultValue:t.value;if(a=w_(t)?D_(a):a,A(a),Jo!==null&&i.add(Jo),yield kX(),a!==(a=e())){var r=t.selectionStart,s=t.selectionEnd,l=t.value.length;if(t.value=a??"",s!==null){var g=t.value.length;r===s&&s===l&&g>l?(t.selectionStart=g,t.selectionEnd=g):(t.selectionStart=r,t.selectionEnd=Math.min(s,g))}}});return function(o){return n.apply(this,arguments)}})()),wA(e)==null&&t.value&&(A(w_(t)?D_(t.value):t.value),Jo!==null&&i.add(Jo)),Wh(()=>{var n=e();if(t===document.activeElement){var o=Mf??Jo;if(i.has(o))return}w_(t)&&n===D_(t.value)||(t.type!=="date"||n||t.value)&&n!==t.value&&(t.value=n??"")})}function w_(t){var e=t.type;return e==="number"||e==="range"}function D_(t){return t===""?null:+t}function jt(t,e,A){var i=RC(t,e);i&&i.set&&(t[e]=A,SD(()=>{t[e]=null}))}function YW(t,e){return t===e||t?.[M0]===e}function Oo(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,A=arguments.length>2?arguments[2]:void 0;return _r(()=>{var i,n;return Wh(()=>{i=n,n=[],wA(()=>{t!==A(...n)&&(e(t,...n),i&&YW(A(...i),t)&&e(null,...i))})}),()=>{fd(()=>{n&&YW(A(...n),t)&&e(null,...n)})}}),t}function vC(t){return function(){for(var e=arguments.length,A=new Array(e),i=0;i0&&arguments[0]!==void 0&&arguments[0],e=Io,A=e.l.u;if(A){var i,n=()=>K(e.s);if(t){var o=0,a={},r=jf(()=>{var s=!1,l=e.s;for(var g in l)l[g]!==a[g]&&(a[g]=l[g],s=!0);return s&&o++,o});n=()=>c(r)}A.b.length&&(i=()=>{HW(e,n),Y_(A.b)},BX(),Dc(1048584,i,!0)),j_(()=>{var s=wA(()=>A.m.map(TpA));return()=>{for(var l of s)typeof l=="function"&&l()}}),A.a.length&&j_(()=>{HW(e,n),Y_(A.a)})}}function HW(t,e){if(t.l.s)for(var A of t.l.s)c(A);e()}function kD(t){var e=UC(0);return function(){return arguments.length===1?(N(e,c(e)+1),arguments[0]):(c(e),t())}}function yf(t,e){var A,i=(A=t.$$events)===null||A===void 0?void 0:A[e.type],n=zf(i)?i.slice():i==null?[]:[i];for(var o of n)o.call(this,e)}var F5=!1,ImA={get(t,e){if(!t.exclude.includes(e))return c(t.version),e in t.special?t.special[e]():t.props[e]},set(t,e,A){if(!(e in t.special)){var i=qn;try{wg(t.parent_effect),t.special[e]=L({get[e](){return t.props[e]}},e,4)}finally{wg(i)}}return t.special[e](A),RW(t.version),!0},getOwnPropertyDescriptor(t,e){if(!t.exclude.includes(e))return e in t.props?{enumerable:!0,configurable:!0,value:t.props[e]}:void 0},deleteProperty:(t,e)=>(t.exclude.includes(e)||(t.exclude.push(e),RW(t.version)),!0),has:(t,e)=>!t.exclude.includes(e)&&e in t.props,ownKeys:t=>Reflect.ownKeys(t.props).filter(e=>!t.exclude.includes(e))};function L5(t,e){return new Proxy({props:t,exclude:e,special:{},version:UC(0),parent_effect:qn},ImA)}var dmA={get(t,e){for(var A=t.props.length;A--;){var i=t.props[A];if(Qf(i)&&(i=i()),typeof i=="object"&&i!==null&&e in i)return i[e]}},set(t,e,A){for(var i=t.props.length;i--;){var n=t.props[i];Qf(n)&&(n=n());var o=RC(n,e);if(o&&o.set)return o.set(A),!0}return!1},getOwnPropertyDescriptor(t,e){for(var A=t.props.length;A--;){var i=t.props[A];if(Qf(i)&&(i=i()),typeof i=="object"&&i!==null&&e in i){var n=RC(i,e);return n&&!n.configurable&&(n.configurable=!0),n}}},has(t,e){if(e===M0||e===VZ)return!1;for(var A of t.props)if(Qf(A)&&(A=A()),A!=null&&e in A)return!0;return!1},ownKeys(t){var e=[];for(var A of t.props)if(Qf(A)&&(A=A()),A){for(var i in A)e.includes(i)||e.push(i);for(var n of Object.getOwnPropertySymbols(A))e.includes(n)||e.push(n)}return e}};function DI(){for(var t=arguments.length,e=new Array(t),A=0;A(g&&(g=!1,l=s?wA(i):i),l);if(r){var I,d,h=M0 in t||VZ in t;n=(I=(d=RC(t,e))===null||d===void 0?void 0:d.set)!==null&&I!==void 0?I:h&&e in t?b=>t[e]=b:void 0}var E,f=!1;if(r?[o,f]=(function(b){var x=F5;try{return F5=!1,[b(),F5]}finally{F5=x}})(()=>t[e]):o=t[e],o===void 0&&i!==void 0&&(o=C(),n&&(a&&(function(){throw new Error("https://svelte.dev/e/props_invalid_value")})(),n(o))),E=a?()=>{var b=t[e];return b===void 0?C():(g=!0,b)}:()=>{var b=t[e];return b!==void 0&&(l=void 0),b===void 0?l:b},a&&!(4&A))return E;if(n){var m=t.$$legacy;return function(b,x){return arguments.length>0?(a&&x&&!m&&!f||n(x?E():b),b):E()}}var v=!1,k=(1&A?jf:it)(()=>(v=!1,E()));r&&c(k);var S=qn;return function(b,x){if(arguments.length>0){var F=x?c(k):a&&r?mh(b):b;return N(k,F),v=!0,l!==void 0&&(l=F),b}return Sd&&v||(S.f&qh)!==0?k.v:c(k)}}function or(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:(function(i){var n=(function(o){try{if(typeof window<"u"&&window.localStorage!==void 0)return window.localStorage[o]}catch(a){}})("debug");return n!=null&&n.endsWith("*")?i.startsWith(n.slice(0,-1)):i===n})(t);if(!e)return BmA;var A=(function(i){for(var n=0,o=0;o9466848e5&&isFinite(t)&&Math.floor(t)===t&&!isNaN(new Date(t).valueOf());if(typeof t=="bigint")return $_(Number(t));try{var e=t&&t.valueOf();if(e!==t)return $_(e)}catch(A){return!1}return!1}function HX(t){(G5=G5||window.document.createElement("div")).style.color="",G5.style.color=t;var e=G5.style.color;return e!==""?e.replace(/\s+/g,"").toLowerCase():void 0}var G5=void 0;function umA(t){return typeof t=="string"&&t.length<99&&!!HX(t)}function kR(t,e){if(typeof t=="number"||typeof t=="string"||typeof t=="boolean"||t===void 0)return typeof t;if(typeof t=="bigint")return"number";if(t===null)return"null";if(Array.isArray(t))return"array";if(Mn(t))return"object";var A=e.stringify(t);return A&&SR(A)?"number":A==="true"||A==="false"?"boolean":A==="null"?"null":"unknown"}var fmA=/^https?:\/\/\S+$/;function xD(t){return typeof t=="string"&&fmA.test(t)}function $h(t,e){if(t==="")return"";var A=t.trim();return A==="null"?null:A==="true"||A!=="false"&&(SR(A)?e.parse(A):t)}var pmA=[];function PW(t,e){if(t.length!==e.length)return!1;for(var A=0;A1&&arguments[1]!==void 0&&arguments[1],A={};if(!Array.isArray(t))throw new TypeError("Array expected");function i(a,r){(!Array.isArray(a)&&!Mn(a)||e&&r.length>0)&&(A[vt(r)]=!0),Mn(a)&&Object.keys(a).forEach(s=>{i(a[s],r.concat(s))})}for(var n=Math.min(t.length,1e4),o=0;oe?t.slice(0,e):t}function jW(t){return Me({},t)}function qW(t){return Object.values(t)}function VW(t,e,A,i){var n=t.slice(0),o=n.splice(e,A);return n.splice.apply(n,[e+i,0,...o]),n}function mmA(t,e,A){return t.slice(0,e).concat(A).concat(t.slice(e))}function Wf(t,e){try{return e.parse(t)}catch(A){return e.parse(ag(t))}}function PX(t,e){try{return Wf(t,e)}catch(A){return}}function Zf(t,e){t=t.replace(qX,"");try{return e(t)}catch(A){}try{return e("{"+t+"}")}catch(A){}try{return e("["+t+"]")}catch(A){}throw new Error("Failed to parse partial JSON")}function jX(t){t=t.replace(qX,"");try{return ag(t)}catch(i){}try{var e=ag("["+t+"]");return e.substring(1,e.length-1)}catch(i){}try{var A=ag("{"+t+"}");return A.substring(1,A.length-1)}catch(i){}throw new Error("Failed to repair partial JSON")}var qX=/,\s*$/;function Th(t,e){var A=ZW.exec(e);if(A){var i=Rr(A[2]),n=(function(d,h){for(var E=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:d.length,m=0,v=E;v"line ".concat(n+1," column ").concat(o+1))}}var a=vmA.exec(e),r=a?Rr(a[1]):void 0,s=r!==void 0?r-1:void 0,l=bmA.exec(e),g=l?Rr(l[1]):void 0,C=g!==void 0?g-1:void 0,I=s!==void 0&&C!==void 0?(function(d,h,E){for(var f=d.indexOf(` +`),m=1;m1&&arguments[1]!==void 0?arguments[1]:void 0,A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:JSON;return Rf(t)?t:{text:A.stringify(t.json,null,e)}}function WW(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:JSON;return Nf(t)?t:{json:e.parse(t.text)}}function eR(t,e,A){return wmA(t,e,A).text}function DmA(t,e){return ymA(t,e)>e}function ymA(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1/0;if(Rf(t))return t.text.length;var A=t.json,i=0;return(function n(o){if(Array.isArray(o)){if((i+=o.length-1+2)>e)return;for(var a=0;ae)return}else if(Mn(o)){var r=Object.keys(o);i+=2+r.length+(r.length-1);for(var s=0;sWX($X(String(t))),unescapeValue:t=>A$(ZX(t))},kmA={escapeValue:t=>$X(String(t)),unescapeValue:t=>A$(t)},xmA={escapeValue:t=>WX(String(t)),unescapeValue:t=>ZX(t)},_mA={escapeValue:t=>String(t),unescapeValue:t=>t};function WX(t){return t.replace(/[^\x20-\x7F]/g,e=>{var A;return e==="\b"||e==="\f"||e===` +`||e==="\r"||e===" "?e:"\\u"+("000"+((A=e.codePointAt(0))===null||A===void 0?void 0:A.toString(16))).slice(-4)})}function ZX(t){return t.replace(/\\u[a-fA-F0-9]{4}/g,e=>{try{var A=JSON.parse('"'+e+'"');return XX[A]||A}catch(i){return e}})}var XX={'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},RmA={'\\"':'"',"\\\\":"\\","\\/":"/","\\b":"\b","\\f":"\f","\\n":` +`,"\\r":"\r","\\t":" "};function $X(t){return t.replace(/["\b\f\n\r\t\\]/g,e=>XX[e]||e)}function A$(t){return t.replace(/\\["bfnrt\\]/g,e=>RmA[e]||e)}function Jh(t){return typeof t!="string"?String(t):t.endsWith(` +`)?t+` +`:t}function e$(t,e){return AQ(t,A=>A.nodeName.toUpperCase()===e.toUpperCase())}function QI(t,e,A){return AQ(t,i=>(function(n,o,a){return typeof n.getAttribute=="function"&&n.getAttribute(o)===a})(i,e,A))}function AQ(t,e){return!!_R(t,e)}function _R(t,e){for(var A=t;A&&!e(A);)A=A.parentNode;return A}function Xf(t){var e,A;return(e=t==null||(A=t.ownerDocument)===null||A===void 0?void 0:A.defaultView)!==null&&e!==void 0?e:void 0}function RR(t){var e=Xf(t),A=e?.document.activeElement;return!!A&&AQ(A,i=>i===t)}function t$(t,e){return _R(t,A=>A.nodeName===e)}function b_(t){return QI(t,"data-type","selectable-key")?oo.key:QI(t,"data-type","selectable-value")?oo.value:QI(t,"data-type","insert-selection-area-inside")?oo.inside:QI(t,"data-type","insert-selection-area-after")?oo.after:oo.multi}function eD(t){return encodeURIComponent(vt(t))}function i$(t){var e,A=_R(t,n=>!(n==null||!n.hasAttribute)&&n.hasAttribute("data-path")),i=(e=A?.getAttribute("data-path"))!==null&&e!==void 0?e:void 0;return i?Es(decodeURIComponent(i)):void 0}function NmA(t){var{allElements:e,currentElement:A,direction:i,hasPrio:n=()=>!0,margin:o=10}=t,a=G9(e.filter(function(m){var v=m.getBoundingClientRect();return v.width>0&&v.height>0}),s),r=s(A);function s(m){var v=m.getBoundingClientRect();return{x:v.left+v.width/2,y:v.top+v.height/2,rect:v,element:m}}function l(m,v){var k=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,S=m.x-v.x,b=(m.y-v.y)*k;return Math.sqrt(S*S+b*b)}var g=m=>l(m,r);if(i==="Left"||i==="Right"){var C=i==="Left"?a.filter(m=>{return v=r,m.rect.left+o{return v=r,m.rect.right>v.rect.right+o;var v}),I=C.filter(m=>{return v=m,k=r,Math.abs(v.y-k.y)l(m,r,10));return d?.element}if(i==="Up"||i==="Down"){var h=i==="Up"?a.filter(m=>{return v=r,m.y+o{return v=r,m.y>v.y+o;var v}),E=h.filter(m=>n(m.element)),f=SE(E,g)||SE(h,g);return f?.element}}function NR(){var t,e,A,i;return typeof navigator<"u"&&(t=(e=(A=navigator)===null||A===void 0||(A=A.platform)===null||A===void 0?void 0:A.toUpperCase().includes("MAC"))!==null&&e!==void 0?e:(i=navigator)===null||i===void 0||(i=i.userAgentData)===null||i===void 0||(i=i.platform)===null||i===void 0?void 0:i.toUpperCase().includes("MAC"))!==null&&t!==void 0&&t}function TC(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"+",A=[];FR(t,arguments.length>2&&arguments[2]!==void 0?arguments[2]:NR)&&A.push("Ctrl"),t.altKey&&A.push("Alt"),t.shiftKey&&A.push("Shift");var i=t.key.length===1?t.key.toUpperCase():t.key;return i in FmA||A.push(i),A.join(e)}function FR(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:NR;return t.ctrlKey||t.metaKey&&e()}var FmA={Ctrl:!0,Command:!0,Control:!0,Alt:!0,Option:!0,Shift:!0};function Zt(t,e){e===void 0&&(e={});var A=e.insertAt;if(t&&typeof document<"u"){var i=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",A==="top"&&i.firstChild?i.insertBefore(n,i.firstChild):i.appendChild(n),n.styleSheet?n.styleSheet.cssText=t:n.appendChild(document.createTextNode(t))}}Zt(`.jse-absolute-popup.svelte-enkkpn { + position: relative; + left: 0; + top: 0; + width: 0; + height: 0; + z-index: 1001; +} +.jse-absolute-popup.svelte-enkkpn .jse-hidden-input:where(.svelte-enkkpn) { + position: fixed; + left: 0; + top: 0; + width: 0; + height: 0; + padding: 0; + margin: 0; + border: none; + outline: none; + overflow: hidden; +} +.jse-absolute-popup.svelte-enkkpn .jse-absolute-popup-content:where(.svelte-enkkpn) { + position: absolute; +}`);var LmA=JA('
      '),GmA=JA('
      ');function KmA(t,e){Nt(e,!1);var A=L(e,"popup",8),i=L(e,"closeAbsolutePopup",8),n=EA(),o=EA();function a(C){A().options&&A().options.closeOnOuterClick&&!AQ(C.target,I=>I===c(n))&&i()(A().id)}function r(C){TC(C)==="Escape"&&(C.preventDefault(),C.stopPropagation(),i()(A().id))}As(function(){c(o)&&c(o).focus()}),ni();var s=GmA();fe("mousedown",NC,function(C){a(C)},!0),fe("keydown",NC,r,!0),fe("wheel",NC,function(C){a(C)},!0);var l=dA(s),g=C=>{var I=LmA(),d=dA(I);Oo(d,h=>N(o,h),()=>c(o)),UX(_A(d,2),()=>A().component,(h,E)=>{E(h,DI(()=>A().props))}),Se(h=>mg(I,h),[()=>(c(n),K(A()),wA(()=>(function(h,E){var f=h.getBoundingClientRect(),{left:m,top:v,positionAbove:k,positionLeft:S}=(function(){if(E.anchor){var{anchor:b,width:x=0,height:F=0,offsetTop:z=0,offsetLeft:P=0,position:Z}=E,{left:tA,top:W,bottom:BA,right:X}=b.getBoundingClientRect(),iA=Z==="top"||W+F>window.innerHeight&&W>F,AA=Z==="left"||tA+x>window.innerWidth&&tA>x;return{left:AA?X-P:tA+P,top:iA?W-z:BA+z,positionAbove:iA,positionLeft:AA}}if(typeof E.left=="number"&&typeof E.top=="number"){var{left:IA,top:aA,width:rA=0,height:uA=0}=E;return{left:IA,top:aA,positionAbove:aA+uA>window.innerHeight&&aA>uA,positionLeft:IA+rA>window.innerWidth&&IA>rA}}throw new Error('Invalid config: pass either "left" and "top", or pass "anchor"')})();return(k?"bottom: ".concat(f.top-v,"px;"):"top: ".concat(v-f.top,"px;"))+(S?"right: ".concat(f.left-m,"px;"):"left: ".concat(m-f.left,"px;"))})(c(n),A().options)))]),CA(C,I)};jA(l,C=>{c(n)&&C(g)}),Oo(s,C=>N(n,C),()=>c(n)),fe("mousedown",s,function(C){C.stopPropagation()}),fe("keydown",s,r),CA(t,s),Ft()}var UmA=JA(" ",1);function tR(t,e){Nt(e,!1);var A=or("jsoneditor:AbsolutePopup"),i=EA([],!0);function n(r){var s=c(i).findIndex(g=>g.id===r);if(s!==-1){var l=c(i)[s];l.options.onClose&&l.options.onClose(),N(i,c(i).filter(g=>g.id!==r))}}(function(r,s){$Z().set(r,s)})("absolute-popup",{openAbsolutePopup:function(r,s,l){A("open...",s,l);var g={id:wh(),component:r,props:s||{},options:l||{}};return N(i,[...c(i),g]),g.id},closeAbsolutePopup:n}),KA(()=>c(i),()=>{A("popups",c(i))}),Rn(),ni(!0);var o=UmA(),a=et(o);da(a,1,()=>c(i),ka,(r,s)=>{KmA(r,{get popup(){return c(s)},closeAbsolutePopup:n})}),Ia(_A(a,2),e,"default",{},null),CA(t,o),Ft()}function $f(t,e){for(var A=new Set(e),i=t.replace(/ \(copy( \d+)?\)$/,""),n=t,o=1;A.has(n);){var a="copy"+(o>1?" "+o:"");n="".concat(i," (").concat(a,")"),o++}return n}function SC(t,e){var A=e-3;return t.length>e?t.substring(0,A)+"...":t}function TmA(t){if(t==="")return"";var e=t.toLowerCase();if(e==="null")return null;if(e==="true")return!0;if(e==="false")return!1;if(e!=="undefined"){var A=Number(t),i=parseFloat(t);return isNaN(A)||isNaN(i)?t:A}}var JmA={id:"jsonquery",name:"JSONQuery",description:` +

      + Enter a JSON Query function to filter, sort, or transform the data. + You can use functions like get, filter, + sort, pick, groupBy, uniq, etcetera. + Example query: filter(.age >= 18) +

      +`,createQuery:function(t,e){var{filter:A,sort:i,projection:n}=e,o=[];A&&A.path&&A.relation&&A.value&&o.push(["filter",[(a=A.relation,P9("1 ".concat(a," 1"))[0]),K5(A.path),TmA(A.value)]]);var a;return i&&i.path&&i.direction&&o.push(["sort",K5(i.path),i.direction==="desc"?"desc":"asc"]),n&&n.paths&&(n.paths.length>1?o.push(["pick",...n.paths.map(K5)]):o.push(["map",K5(n.paths[0])])),cz(["pipe",...o])},executeQuery:function(t,e,A){var i=VX(A,JSON)?t:(function(n){var o=A.stringify(n);return o!==void 0?JSON.parse(o):void 0})(t);return e.trim()!==""?Cz(i,e):i}};function K5(t){return["get",...t]}var OmA=xI("");function YmA(t,e){Nt(e,!1);var A=870711,i=EA(""),n=L(e,"data",8);function o(r){if(!r||!r.raw)return"";var s=r.raw,l={};return s=s.replace(/\s(?:xml:)?id=["']?([^"')\s]+)/g,(g,C)=>{var I="fa-".concat((A+=1).toString(16));return l[C]=I,' id="'.concat(I,'"')}),s=s.replace(/#(?:([^'")\s]+)|xpointer\(id\((['"]?)([^')]+)\2\)\))/g,(g,C,I,d)=>{var h=C||d;return h&&l[h]?"#".concat(l[h]):g}),s}KA(()=>K(n()),()=>{N(i,o(n()))}),Rn();var a=OmA();KX(dA(a),()=>c(i),!0),CA(t,a),Ft()}Zt(` + .fa-icon.svelte-v67cny { + display: inline-block; + fill: currentColor; + } + .fa-flip-horizontal.svelte-v67cny { + transform: scale(-1, 1); + } + .fa-flip-vertical.svelte-v67cny { + transform: scale(1, -1); + } + .fa-spin.svelte-v67cny { + animation: svelte-v67cny-fa-spin 1s 0s infinite linear; + } + .fa-inverse.svelte-v67cny { + color: #fff; + } + .fa-pulse.svelte-v67cny { + animation: svelte-v67cny-fa-spin 1s infinite steps(8); + } + @keyframes svelte-v67cny-fa-spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } + } +`);var HmA=xI(""),zmA=xI(""),PmA=xI(""),jmA=xI("",1);function tn(t,e){var A=L5(e,["children","$$slots","$$events","$$legacy"]),i=L5(A,["class","data","scale","spin","inverse","pulse","flip","label","style"]);Nt(e,!1);var n=L(e,"class",8,""),o=L(e,"data",8),a=EA(),r=L(e,"scale",8,1),s=L(e,"spin",8,!1),l=L(e,"inverse",8,!1),g=L(e,"pulse",8,!1),C=L(e,"flip",8,void 0),I=L(e,"label",8,""),d=L(e,"style",8,""),h=EA(10),E=EA(10),f=EA(),m=EA();function v(){var S=1;return r()!==void 0&&(S=Number(r())),isNaN(S)||S<=0?(console.warn('Invalid prop: prop "scale" should be a number over 0.'),1):1*S}function k(){return c(a)?Math.max(c(a).width,c(a).height)/16:1}KA(()=>(K(o()),K(d()),K(r())),()=>{N(a,(function(S){var b;if(S){if(!("definition"in S)){if("iconName"in S&&"icon"in S){S.iconName;var[x,F,,,z]=S.icon;b={width:x,height:F,paths:(Array.isArray(z)?z:[z]).map(P=>({d:P}))}}else b=S[Object.keys(S)[0]];return b}console.error("`import faIconName from '@fortawesome/package-name/faIconName` not supported - Please use `import { faIconName } from '@fortawesome/package-name/faIconName'` instead")}})(o())),d(),r(),N(h,c(a)?c(a).width/k()*v():0),N(E,c(a)?c(a).height/k()*v():0),N(f,(function(){var S="";d()!==null&&(S+=d());var b=v();return b===1?S.length===0?"":S:(S===""||S.endsWith(";")||(S+="; "),"".concat(S,"font-size: ").concat(b,"em"))})()),N(m,c(a)?"0 0 ".concat(c(a).width," ").concat(c(a).height):"0 0 ".concat(c(h)," ").concat(c(E)))}),Rn(),ni(),(function(S,b){var x=L5(b,["children","$$slots","$$events","$$legacy"]),F=L5(x,["class","width","height","box","spin","inverse","pulse","flip","style","label"]),z=L(b,"class",8,""),P=L(b,"width",8),Z=L(b,"height",8),tA=L(b,"box",8,"0 0 0 0"),W=L(b,"spin",8,!1),BA=L(b,"inverse",8,!1),X=L(b,"pulse",8,!1),iA=L(b,"flip",8,"none"),AA=L(b,"style",8,""),IA=L(b,"label",8,""),aA=HmA();AD(aA,()=>{var rA;return Me(Me({version:"1.1",class:"fa-icon ".concat((rA=z())!==null&&rA!==void 0?rA:""),width:P(),height:Z(),"aria-label":IA(),role:IA()?"img":"presentation",viewBox:tA(),style:AA()},F),{},{[uh]:{"fa-spin":W(),"fa-pulse":X(),"fa-inverse":BA(),"fa-flip-horizontal":iA()==="horizontal","fa-flip-vertical":iA()==="vertical"}})},void 0,void 0,void 0,"svelte-v67cny"),Ia(dA(aA),b,"default",{},null),CA(S,aA)})(t,DI({get label(){return I()},get width(){return c(h)},get height(){return c(E)},get box(){return c(m)},get style(){return c(f)},get spin(){return s()},get flip(){return C()},get inverse(){return l()},get pulse(){return g()},get class(){return n()}},()=>i,{children:(S,b)=>{var x=Fi();Ia(et(x),e,"default",{},F=>{var z=jmA(),P=et(z);da(P,1,()=>(c(a),wA(()=>{var BA;return((BA=c(a))===null||BA===void 0?void 0:BA.paths)||[]})),ka,(BA,X)=>{var iA=zmA();AD(iA,()=>Me({},c(X))),CA(BA,iA)});var Z=_A(P);da(Z,1,()=>(c(a),wA(()=>{var BA;return((BA=c(a))===null||BA===void 0?void 0:BA.polygons)||[]})),ka,(BA,X)=>{var iA=PmA();AD(iA,()=>Me({},c(X))),CA(BA,iA)});var tA=_A(Z),W=BA=>{YmA(BA,{get data(){return c(a)},set data(X){N(a,X)},$$legacy:!0})};jA(tA,BA=>{c(a),wA(()=>{var X;return(X=c(a))===null||X===void 0?void 0:X.raw})&&BA(W)}),CA(F,z)}),CA(S,x)},$$slots:{default:!0}})),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-boolean-toggle.svelte-eli4ob { + padding: 0; + margin: 1px 0 0; + vertical-align: top; + display: inline-flex; + color: var(--jse-value-color-boolean, #ff8c00); +} + +.jse-boolean-toggle.svelte-eli4ob:not(.jse-readonly) { + cursor: pointer; +}`);var qmA=JA('
      ');function VmA(t,e){Nt(e,!1);var A=L(e,"path",9),i=L(e,"value",9),n=L(e,"readOnly",9),o=L(e,"onPatch",9),a=L(e,"focus",9);ni(!0);var r,s=qmA(),l=dA(s),g=it(()=>i()===!0?j9:q9);tn(l,{get data(){return c(g)}}),Se(()=>{_n(s,"aria-checked",i()===!0),r=ii(s,1,"jse-boolean-toggle svelte-eli4ob",null,r,{"jse-readonly":n()}),_n(s,"title",n()?"Boolean value ".concat(i()):"Click to toggle this boolean value")}),fe("mousedown",s,function(C){C.stopPropagation(),n()||(o()([{op:"replace",path:vt(A()),value:!i()}]),a()())}),CA(t,s),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup, +.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup .picker_arrow::before, +.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup .picker_arrow::after { + background: var(--jse-color-picker-background, var(--jse-panel-background, #ebebeb)); + line-height: normal; +} +.jse-color-picker-popup.svelte-v77py2 .picker_slider, +.jse-color-picker-popup.svelte-v77py2 .picker_sl, +.jse-color-picker-popup.svelte-v77py2 .picker_editor input, +.jse-color-picker-popup.svelte-v77py2 .picker_sample, +.jse-color-picker-popup.svelte-v77py2 .picker_done button { + box-shadow: var(--jse-color-picker-border-box-shadow, #cbcbcb 0 0 0 1px); +} +.jse-color-picker-popup.svelte-v77py2 .picker_editor input { + background: var(--jse-background-color, #fff); + color: var(--jse-text-color, #4d4d4d); +} +.jse-color-picker-popup.svelte-v77py2 .picker_done button { + background: var(--jse-button-background, #e0e0e0); + color: var(--jse-button-color, var(--jse-text-color, #4d4d4d)); +} +.jse-color-picker-popup.svelte-v77py2 .picker_done button:hover { + background: var(--jse-button-background-highlight, #e7e7e7); +}`);var WmA=JA('
      ');function ZmA(t,e){Nt(e,!1);var A=L(e,"color",8),i=L(e,"onChange",8),n=L(e,"showOnTop",8),o=EA(),a=()=>{};As(zt(function*(){var s,l=new((s=yield import("./chunk-GLGRLUIJ.js"))===null||s===void 0?void 0:s.default)({parent:c(o),color:A(),popup:n()?"top":"bottom",onDone(g){var C=g.rgba[3]===1?g.hex.substring(0,7):g.hex;i()(C)}});l.show(),a=()=>{l.destroy()}})),Dg(()=>{a()}),ni();var r=WmA();Oo(r,s=>N(o,s),()=>c(o)),CA(t,r),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-color-picker-button.svelte-13mgyo6 { + font-size: var(--jse-font-size-mono, 14px); + width: var(--jse-color-picker-button-size, 1em); + height: var(--jse-color-picker-button-size, 1em); + box-sizing: border-box; + padding: 0; + margin: 2px 0 0 calc(0.5 * var(--jse-padding, 10px)); + display: inline-flex; + vertical-align: top; + border: 1px solid var(--jse-text-color, #4d4d4d); + border-radius: 2px; + background: inherit; + outline: none; +} + +.jse-color-picker-button.svelte-13mgyo6:not(.jse-readonly) { + cursor: pointer; +}`);var XmA=JA('');function $mA(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),{openAbsolutePopup:n}=kI("absolute-popup"),o=L(e,"path",9),a=L(e,"value",9),r=L(e,"readOnly",9),s=L(e,"onPatch",9),l=L(e,"focus",9);function g(h){s()([{op:"replace",path:vt(o()),value:h}]),C()}function C(){l()()}KA(()=>K(a()),()=>{N(A,HX(a()))}),KA(()=>(K(r()),K(a())),()=>{N(i,r()?"Color ".concat(a()):"Click to open a color picker")}),Rn(),ni(!0);var I,d=XmA();Se(()=>{var h;I=ii(d,1,"jse-color-picker-button svelte-13mgyo6",null,I,{"jse-readonly":r()}),mg(d,"background: ".concat((h=c(A))!==null&&h!==void 0?h:"")),_n(d,"title",c(i)),_n(d,"aria-label",c(i))}),fe("click",d,function(h){var E,f;if(!r()){var m=h.target,v=m.getBoundingClientRect().top,k=((E=(f=Xf(m))===null||f===void 0?void 0:f.innerHeight)!==null&&E!==void 0?E:0)-v<300&&v>300,S={color:a(),onChange:g,showOnTop:k};n(ZmA,S,{anchor:m,closeOnOuterClick:!0,onClose:C,offsetTop:18,offsetLeft:-8,height:300})}}),CA(t,d),Ft()}var M_=1e3,Ff=100,U5=100,cD=2e4,kh=[{start:0,end:Ff}],A6A=1048576,e6A=1048576,S_=10485760,k_="Insert or paste contents, enter [ insert a new array, enter { to insert a new object, or start typing to insert a new value",LR="Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)",rd="hover-insert-inside",T5="hover-insert-after",$W="hover-collection",x_="valid",AZ="repairable",kC=336,xC=260,vf=100,eZ={[ug.asc]:"ascending",[ug.desc]:"descending"};function n$(t){for(var e=J9(t,r=>r.start),A=[e[0]],i=0;i0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"array",expanded:t,visibleSections:kh,items:[]}}function UR(){var{expanded:t}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"object",expanded:t,properties:{}}}var TR={createObjectDocumentState:UR,createArrayDocumentState:KR,createValueDocumentState:function(){return{type:"value"}}};function a$(t,e,A,i){var{createObjectDocumentState:n,createArrayDocumentState:o,createValueDocumentState:a}=i;return(function r(s,l,g){if(Array.isArray(s)){var C=ir(l)?l:o();if(g.length===0)return C;var I=Rr(g[0]),d=r(s[I],C.items[I],g.slice(1));return Hr(C,["items",g[0]],d)}if(Mn(s)){var h=Cl(l)?l:n();if(g.length===0)return h;var E=g[0],f=r(s[E],h.properties[E],g.slice(1));return Hr(h,["properties",E],f)}return GR(l)?l:a()})(t,e,A)}function Ul(t,e){return Lf(t,e,arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],(A,i)=>{if(A!==void 0&&i!==void 0)return Array.isArray(A)?ir(i)?i:KR({expanded:!!yd(i)&&i.expanded}):Mn(A)?Cl(i)?i:UR({expanded:!!yd(i)&&i.expanded}):GR(i)?i:void 0},()=>!0)}function Lf(t,e,A,i,n){var o=i(t,e,A);if(Array.isArray(t)&&ir(o)&&n(o)){var a=[];return JR(t,o.visibleSections,s=>{var l=A.concat(String(s)),g=Lf(t[s],o.items[s],l,i,n);g!==void 0&&(a[s]=g)}),PW(a,o.items)?o:Me(Me({},o),{},{items:a})}if(Mn(t)&&Cl(o)&&n(o)){var r={};return Object.keys(t).forEach(s=>{var l=A.concat(s),g=Lf(t[s],o.properties[s],l,i,n);g!==void 0&&(r[s]=g)}),PW(Object.values(r),Object.values(o.properties))?o:Me(Me({},o),{},{properties:r})}return o}function JR(t,e,A){e.forEach(i=>{var{start:n,end:o}=i;zX(n,Math.min(t.length,o),A)})}function Gf(t,e){for(var A=t,i=[],n=0;n{var C=yd(g)&&!g.expanded?Me(Me({},g),{},{expanded:!0}):g;return ir(C)?(function(I,d){if((function(f,m){return f.some(v=>m>=v.start&&m(function(l,g,C,I){return Lf(l,g,C,(d,h,E)=>Array.isArray(d)&&I(E)?ir(h)?h.expanded?h:Me(Me({},h),{},{expanded:!0}):KR({expanded:!0}):Mn(d)&&I(E)?Cl(h)?h.expanded?h:Me(Me({},h),{},{expanded:!0}):UR({expanded:!0}):h,d=>yd(d)&&d.expanded)})(r,s,[],i))}function sZ(t,e,A,i){return Oh(t,e,A,(n,o)=>i?(function(a,r,s){return Lf(a,r,s,(l,g)=>lZ(g),()=>!0)})(n,o,A):lZ(o))}function lZ(t){return ir(t)&&t.expanded?Me(Me({},t),{},{expanded:!1,visibleSections:kh}):Cl(t)&&t.expanded?Me(Me({},t),{},{expanded:!1}):t}function r$(t,e,A){var i={json:t,documentState:e},n=A.reduce((o,a)=>({json:tl(o.json,[a]),documentState:a6A(o.json,o.documentState,a)}),i);return{json:n.json,documentState:Ul(n.json,n.documentState)}}function a6A(t,e,A){if(I9(A))return gZ(t,e,A,void 0);if(d9(A))return cZ(t,e,A);if($6(A)){var i=il(t,A.path),n=v0(t,e,i);return n?_D(t,e,i,{type:"value",enforceString:n}):e}return A8(A)||b2(A)?(function(o,a,r){if(b2(r)&&r.from===r.path)return a;var s=a,l=il(o,r.from),g=m0(o,s,l);return b2(r)&&(s=cZ(o,s,{path:r.from})),s=gZ(o,s,{path:r.path},g),s})(t,e,A):e}function m0(t,e,A){try{return Xe(e,Gf(t,A))}catch(i){return}}function OR(t,e,A,i,n){var o=a$(t,e,A,n);return a4(o,Gf(t,A),a=>{var r=Xe(t,A);return i(r,a)})}function _D(t,e,A,i){return(function(n,o,a,r,s){var l=a$(n,o,a,s);return Hr(l,Gf(n,a),r)})(t,e,A,i,TR)}function Oh(t,e,A,i){return OR(t,e,A,i,TR)}function gZ(t,e,A,i){var n=il(t,A.path),o=e;return o=Oh(t,o,Yi(n),(a,r)=>{if(!ir(r))return r;var s=Rr(ki(n)),{items:l,visibleSections:g}=r;return Me(Me({},r),{},{items:s{if(!ir(r))return r;var s=Rr(ki(i)),{items:l,visibleSections:g}=r;return Me(Me({},r),{},{items:l.slice(0,s).concat(l.slice(s+1)),visibleSections:s$(g,s,-1)})}):(function(a,r,s){var l=Gf(a,s);return vr(r,l)?x1(r,Gf(a,s)):r})(t,e,i)}function s$(t,e,A){return(function(i){for(var n=i.slice(0),o=1;o({start:i.start>e?i.start+A:i.start,end:i.end>e?i.end+A:i.end})))}function v0(t,e,A){var i,n=Xe(t,A),o=m0(t,e,A),a=GR(o)?o.enforceString:void 0;return typeof a=="boolean"?a:typeof(i=n)=="string"&&typeof $h(i,JSON)!="string"}function A3(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=t.indexOf(e);return i!==-1?A?t.slice(i):t.slice(i+1):[]}function YR(t,e){var A=[];return(function i(n,o,a){A.push(a),Vo(n)&&ir(o)&&o.expanded&&JR(n,o.visibleSections,r=>{i(n[r],o.items[r],a.concat(String(r)))}),ia(n)&&Cl(o)&&o.expanded&&Object.keys(n).forEach(r=>{i(n[r],o.properties[r],a.concat(r))})})(t,e,[]),A}function l$(t,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],i=[];return(function n(o,a){i.push({path:a,type:Ec.value});var r=m0(t,e,a);if(o&&yd(r)&&r.expanded){if(A&&i.push({path:a,type:Ec.inside}),Vo(o)){var s=ir(r)?r.visibleSections:kh;JR(o,s,l=>{var g=a.concat(String(l));n(o[l],g),A&&i.push({path:g,type:Ec.after})})}ia(o)&&Object.keys(o).forEach(l=>{var g=a.concat(l);i.push({path:g,type:Ec.key}),n(o[l],g),A&&i.push({path:g,type:Ec.after})})}})(t,[]),i}function __(t,e,A){var i=YR(t,e),n=i.map(vt).indexOf(vt(A));if(n!==-1&&n3&&arguments[3]!==void 0?arguments[3]:10240;return Bc(t,e,A,DmA({json:Xe(t,A)},i)?bf:HR)}function R_(t,e,A){var i=m0(t,e,A);return yd(i)&&i.expanded?e:vd(t,e,A)}function bf(t){return t.length===0||t.length===1&&t[0]==="0"}function aR(t){return t.length===0}function HR(){return!0}function tD(){return!1}function dl(t){return t&&t.type===oo.after||!1}function Va(t){return t&&t.type===oo.inside||!1}function nr(t){return t&&t.type===oo.key||!1}function En(t){return t&&t.type===oo.value||!1}function Co(t){return t&&t.type===oo.multi||!1}function RD(t){return Co(t)&&Mi(t.focusPath,t.anchorPath)}function Kf(t){return Co(t)||dl(t)||Va(t)||nr(t)||En(t)}function N_(t){return t&&t.type===oo.text||!1}function MI(t,e){var A=[];return(function(i,n,o){if(n){var a=hd(n),r=It(n);if(Mi(a,r))return o(a);if(i!==void 0){var s=c$(a,r);if(a.length===s.length||r.length===s.length)return o(s);var l=fs(a,r),g=_C(i,l),C=vI(i,l),I=GC(i,l,g),d=GC(i,l,C);if(!(I===-1||d===-1)){var h=Xe(i,s);if(ia(h)){for(var E=Object.keys(h),f=I;f<=d;f++){var m=o(s.concat(E[f]));if(m!==void 0)return m}return}if(Vo(h)){for(var v=I;v<=d;v++){var k=o(s.concat(String(v)));if(k!==void 0)return k}return}throw new Error("Failed to create selection")}}}})(t,e,i=>{A.push(i)}),A}function g$(t){return Va(t)?t.path:Yi(It(t))}function _C(t,e){if(!Co(e))return e.path;var A=GC(t,e,e.anchorPath);return GC(t,e,e.focusPath)A?e.focusPath:e.anchorPath}function CZ(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(A){var n=i?It(A):_C(t,A),o=(function(s,l,g){var C=YR(s,l),I=C.map(vt),d=vt(g),h=I.indexOf(d);if(h!==-1&&h>0)return C[h-1]})(t,e,n);if(i)return Va(A)||dl(A)?o!==void 0?fs(n,n):void 0:o!==void 0?fs(hd(A),o):void 0;if(dl(A)||Va(A))return Hi(n);if(nr(A)){if(o===void 0||o.length===0)return;var a=Yi(o),r=Xe(t,a);return Array.isArray(r)||en(o)?Hi(o):JC(o)}return En(A),o!==void 0?Hi(o):void 0}}function IZ(t,e,A,i){if(!A)return{caret:void 0,previous:void 0,next:void 0};var n=l$(t,e,i),o=n.findIndex(a=>Mi(a.path,It(A))&&String(a.type)===String(A.type));return{caret:o!==-1?n[o]:void 0,previous:o!==-1&&o>0?n[o-1]:void 0,next:o!==-1&&oA[i].length;)i++;var n=A[i];return n===void 0||n.length===0||Array.isArray(Xe(t,Yi(n)))?Hi(n):JC(n)}function Yh(t,e){if(e.length===1){var A=lg(e);if(A.op==="replace")return Hi(il(t,A.path))}if(!en(e)&&e.every(a=>a.op==="move")){var i=lg(e),n=e.slice(1);if((A8(i)||b2(i))&&i.from!==i.path&&n.every(a=>(A8(a)||b2(a))&&a.from===a.path))return JC(il(t,i.path))}var o=e.filter(a=>a.op!=="test"&&a.op!=="remove"&&(a.op!=="move"||a.from!==a.path)&&typeof a.path=="string").map(a=>il(t,a.path));if(!en(o))return{type:oo.multi,anchorPath:lg(o),focusPath:ki(o)}}function c$(t,e){for(var A=0;AA.length&&e.length>A.length;return{type:oo.multi,anchorPath:i?A.concat(t[A.length]):A,focusPath:i?A.concat(e[A.length]):A}}function C$(t,e,A,i){if(nr(e))return String(ki(e.path));if(En(e)){var n=Xe(t,e.path);return typeof n=="string"?n:i.stringify(n,null,A)}if(Co(e)){if(en(e.focusPath))return i.stringify(t,null,A);var o=g$(e),a=Xe(t,o);if(Array.isArray(a)){if(RD(e)){var r=Xe(t,e.focusPath);return i.stringify(r,null,A)}return MI(t,e).map(s=>{var l=Xe(t,s);return"".concat(i.stringify(l,null,A),",")}).join(` +`)}return MI(t,e).map(s=>{var l=ki(s),g=Xe(t,s);return"".concat(i.stringify(l),": ").concat(i.stringify(g,null,A),",")}).join(` +`)}}function tr(t){return(nr(t)||En(t))&&t.edit===!0}function Dh(t){return nr(t)||En(t)||Co(t)}function J5(t){return nr(t)||En(t)||RD(t)}function rR(t){switch(t.type){case Ec.key:return JC(t.path);case Ec.value:return Hi(t.path);case Ec.after:return LC(t.path);case Ec.inside:return OC(t.path)}}function BZ(t,e){switch(t){case oo.key:return JC(e);case oo.value:return Hi(e);case oo.after:return LC(e);case oo.inside:return OC(e);case oo.multi:case oo.text:return fs(e,e)}}function O5(t,e,A){if(e)return Uf(t,e,A)||k0(Co(e)?Yi(e.focusPath):e.path,A)?e:void 0}function Uf(t,e,A){if(t===void 0||!e)return!1;if(nr(e)||Va(e)||dl(e))return Mi(e.path,A);if(En(e))return k0(A,e.path);if(Co(e)){var i=_C(t,e),n=vI(t,e),o=Yi(e.focusPath);if(!k0(A,o)||A.length<=o.length)return!1;var a=GC(t,e,i),r=GC(t,e,n),s=GC(t,e,A);return s!==-1&&s>=a&&s<=r}return!1}function GC(t,e,A){var i=Yi(e.focusPath);if(!k0(A,i)||A.length<=i.length)return-1;var n=A[i.length],o=Xe(t,i);if(ia(o))return Object.keys(o).indexOf(n);if(Vo(o)){var a=Rr(n);if(a');function d$(t,e){Nt(e,!1);var A=or("jsoneditor:EditableDiv"),i=L(e,"value",9),n=L(e,"initialValue",9),o=L(e,"shortText",9,!1),a=L(e,"label",9),r=L(e,"onChange",9),s=L(e,"onCancel",9),l=L(e,"onFind",9),g=L(e,"onPaste",9,ma),C=L(e,"onValueClass",9,()=>""),I=EA(void 0,!0),d=EA(void 0,!0),h=!1;function E(){return c(I)?(function(v){return v.replace(/\n$/,"")})(c(I).innerText):""}function f(v){c(I)&&Tl(I,c(I).innerText=Jh(v))}As(()=>{A("onMount",{value:i(),initialValue:n()}),f(n()!==void 0?n():i()),c(I)&&(function(v){if(v.firstChild!=null){var k=document.createRange(),S=window.getSelection();k.setStart(v,1),k.collapse(!0),S?.removeAllRanges(),S?.addRange(k)}else v.focus()})(c(I))}),Dg(()=>{var v=E();A("onDestroy",{closed:h,value:i(),newValue:v}),h||v===i()||r()(v,yI.no)}),KA(()=>(K(C()),K(i())),()=>{N(d,C()(i()))}),Rn(),ni(!0);var m=r6A();Oo(m,v=>N(I,v),()=>c(I)),Se(v=>{_n(m,"aria-label",a()),ii(m,1,v,"svelte-1r0oryi")},[()=>bI((K(wc),c(d),K(o()),wA(()=>wc("jse-editable-div",c(d),{"jse-short-text":o()}))))]),fe("input",m,function(){var v=E();v===""&&f(""),N(d,C()(v))}),fe("keydown",m,function(v){v.stopPropagation();var k=TC(v);if(k==="Escape"&&(v.preventDefault(),h=!0,s()()),k==="Enter"||k==="Tab"){v.preventDefault(),h=!0;var S=E();r()(S,yI.nextInside)}k==="Ctrl+F"&&(v.preventDefault(),l()(!1)),k==="Ctrl+H"&&(v.preventDefault(),l()(!0))}),fe("paste",m,function(v){if(v.stopPropagation(),g()&&v.clipboardData){var k=v.clipboardData.getData("text/plain");g()(k)}}),fe("blur",m,function(){var v=document.hasFocus(),k=E();A("handleBlur",{hasFocus:v,closed:h,value:i(),newValue:k}),document.hasFocus()&&!h&&(h=!0,k!==i()&&r()(k,yI.self))}),CA(t,m),Ft()}function s6A(t,e){Nt(e,!1);var A=L(e,"path",9),i=L(e,"value",9),n=L(e,"selection",9),o=L(e,"mode",9),a=L(e,"parser",9),r=L(e,"normalization",9),s=L(e,"enforceString",9),l=L(e,"onPatch",9),g=L(e,"onPasteJson",9),C=L(e,"onSelect",9),I=L(e,"onFind",9),d=L(e,"focus",9),h=L(e,"findNextInside",9);function E(k){return s()?k:$h(k,a())}function f(){C()(Hi(A())),d()()}ni(!0);var m=it(()=>(K(r()),K(i()),wA(()=>r().escapeValue(i())))),v=it(()=>(K(tr),K(n()),wA(()=>tr(n())?n().initialValue:void 0)));d$(t,{get value(){return c(m)},get initialValue(){return c(v)},label:"Edit value",onChange:function(k,S){l()([{op:"replace",path:vt(A()),value:E(r().unescapeValue(k))}],(b,x,F)=>{if(!F||Mi(A(),It(F)))return{state:x,selection:S===yI.nextInside?h()(A()):Hi(A())}}),d()()},onCancel:f,onPaste:function(k){try{var S=a().parse(k);aa(S)&&g()({path:A(),contents:S,onPasteAsJson:()=>{f();var b=[{op:"replace",path:vt(A()),value:S}];l()(b,(x,F)=>({state:vd(x,F,A())}))}})}catch(b){}},get onFind(){return I()},onValueClass:function(k){return I$(E(r().unescapeValue(k)),o(),a())}}),Ft()}function yh(t,e,A){var i=Yi(e),n=Xe(t,i);if(Vo(n)){var o=Rr(ki(e));return A.map((l,g)=>({op:"add",path:vt(i.concat(String(o+g))),value:l.value}))}if(ia(n)){var a=ki(e),r=Object.keys(n),s=a!==void 0?A3(r,a,!0):[];return[...A.map(l=>{var g=$f(l.key,r);return{op:"add",path:vt(i.concat(g)),value:l.value}}),...s.map(l=>SI(i,l))]}throw new Error("Cannot create insert operations: parent must be an Object or Array")}function sR(t,e,A){var i=Xe(t,e);if(Array.isArray(i)){var n=i.length;return A.map((o,a)=>({op:"add",path:vt(e.concat(String(n+a))),value:o.value}))}return A.map(o=>{var a=$f(o.key,Object.keys(i));return{op:"add",path:vt(e.concat(a)),value:o.value}})}function e3(t,e,A,i){var n=e.filter(r=>r!==A),o=$f(i,n),a=A3(e,A,!1);return[{op:"move",from:vt(t.concat(A)),path:vt(t.concat(o))},...a.map(r=>SI(t,r))]}function B$(t,e){var A=ki(e);if(en(A))throw new Error("Cannot duplicate root object");var i=Yi(A),n=ki(A),o=Xe(t,i);if(Vo(o)){var a=ki(e),r=a?Rr(ki(a))+1:0;return[...e.map((g,C)=>({op:"copy",from:vt(g),path:vt(i.concat(String(C+r)))}))]}if(ia(o)){var s=Object.keys(o),l=n!==void 0?A3(s,n,!1):[];return[...e.map(g=>{var C=$f(ki(g),s);return{op:"copy",from:vt(g),path:vt(i.concat(C))}}),...l.map(g=>SI(i,g))]}throw new Error("Cannot create duplicate operations: parent must be an Object or Array")}function E$(t,e){if(En(e))return[{op:"move",from:vt(e.path),path:""}];if(!Co(e))throw new Error("Cannot create extract operations: parent must be an Object or Array");var A=Yi(e.focusPath),i=Xe(t,A);if(Vo(i)){var n=MI(t,e).map(a=>{var r=Rr(ki(a));return i[r]});return[{op:"replace",path:"",value:n}]}if(ia(i)){var o={};return MI(t,e).forEach(a=>{var r=String(ki(a));o[r]=i[r]}),[{op:"replace",path:"",value:o}]}throw new Error("Cannot extract: unsupported type of selection "+JSON.stringify(e))}function h$(t,e,A,i){if(nr(e)){var n=PX(A,i),o=Yi(e.path),a=Xe(t,o);return e3(o,Object.keys(a),ki(e.path),typeof n=="string"?n:A)}if(En(e)||Co(e)&&en(e.focusPath))try{return[{op:"replace",path:vt(It(e)),value:Zf(A,x=>Wf(x,i))}]}catch(x){return[{op:"replace",path:vt(It(e)),value:A}]}if(Co(e)){var r=F_(A,i);return(function(x,F,z){var P=lg(F),Z=Yi(P),tA=Xe(x,Z);if(Vo(tA)){var W=lg(F),BA=W?Rr(ki(W)):0;return[...ED(F),...z.map((UA,$A)=>({op:"add",path:vt(Z.concat(String($A+BA))),value:UA.value}))]}if(ia(tA)){var X=ki(F),iA=Yi(X),AA=ki(X),IA=Object.keys(tA),aA=AA!==void 0?A3(IA,AA,!1):[],rA=new Set(F.map(UA=>ki(UA))),uA=IA.filter(UA=>!rA.has(UA));return[...ED(F),...z.map(UA=>{var $A=$f(UA.key,uA);return{op:"add",path:vt(iA.concat($A)),value:UA.value}}),...aA.map(UA=>SI(iA,UA))]}throw new Error("Cannot create replace operations: parent must be an Object or Array")})(t,MI(t,e),r)}if(dl(e)){var s=F_(A,i),l=e.path,g=Yi(l),C=Xe(t,g);if(Vo(C)){var I=Rr(ki(l));return yh(t,g.concat(String(I+1)),s)}if(ia(C)){var d=String(ki(l)),h=Object.keys(C);if(en(h)||ki(h)===d)return sR(t,g,s);var E=h.indexOf(d),f=h[E+1];return yh(t,g.concat(f),s)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}if(Va(e)){var m=F_(A,i),v=e.path,k=Xe(t,v);if(Vo(k))return yh(t,v.concat("0"),m);if(ia(k)){var S=Object.keys(k);if(en(S))return sR(t,v,m);var b=lg(S);return yh(t,v.concat(b),m)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}throw new Error("Cannot insert: unsupported type of selection "+JSON.stringify(e))}function ED(t){return t.map(e=>({op:"remove",path:vt(e)})).reverse()}function SI(t,e){return{op:"move",from:vt(t.concat(e)),path:vt(t.concat(e))}}function F_(t,e){var A=/^\s*{/.test(t),i=/^\s*\[/.test(t),n=PX(t,e),o=n!==void 0?n:Zf(t,a=>Wf(a,e));return A&&Mn(o)||i&&Array.isArray(o)?[{key:"New item",value:o}]:Array.isArray(o)?o.map((a,r)=>({key:"New item "+r,value:a})):Mn(o)?Object.keys(o).map(a=>({key:a,value:o[a]})):[{key:"New item",value:o}]}function Q$(t,e){if(nr(e)){var A=Yi(e.path),i=Xe(t,A),n=e3(A,Object.keys(i),ki(e.path),"");return{operations:n,newSelection:Yh(t,n)}}if(En(e))return{operations:[{op:"replace",path:vt(e.path),value:""}],newSelection:e};if(Co(e)){var o=MI(t,e),a=ED(o),r=ki(o);if(en(r))return{operations:[{op:"replace",path:"",value:""}],newSelection:Hi([])};var s=Yi(r),l=Xe(t,s);if(Vo(l)){var g=lg(o),C=Rr(ki(g));return{operations:a,newSelection:C===0?OC(s):LC(s.concat(String(C-1)))}}if(ia(l)){var I=Object.keys(l),d=lg(o),h=ki(d),E=I.indexOf(h),f=I[E-1];return{operations:a,newSelection:E===0?OC(s):LC(s.concat(f))}}throw new Error("Cannot create remove operations: parent must be an Object or Array")}throw new Error("Cannot remove: unsupported type of selection "+JSON.stringify(e))}function u$(t,e){var A=(function(i,n){if(en(n)||!n.every(b2))return n;var o=[];for(var a of n){var r=EZ(Es(a.from)),s=EZ(Es(a.path));if(!r||!s)return n;o.push({from:r,path:s,operation:a})}var l=o[0].path.parent,g=Xe(i,l);if(!ia(g)||!o.every(h=>(function(E,f){return Mi(E.from.parent,f)&&Mi(E.path.parent,f)})(h,l)))return n;var C=(function(h,E){var f=Object.keys(E),m=f.slice();for(var v of h){var k=m.indexOf(v.from.key);k!==-1&&(m.splice(k,1),m.push(v.path.key))}for(var S=0;Sh.operation,d=o.filter(h=>h.operation.from!==h.operation.path);return d.some(h=>h.path.key===C)?d.map(I):[SI(l,C),...d.map(I)]})(t,e);return e8(t,A,{before:(i,n,o)=>{if(d9(n)){var a=Es(n.path);return{revertOperations:[...o,...L_(i,a)]}}if(b2(n)){var r=Es(n.from);return{revertOperations:n.from===n.path?[n,...L_(i,r)]:[...o,...L_(i,r)]}}return{document:i}}})}function EZ(t){return t.length>0?{parent:Yi(t),key:ki(t)}:void 0}function L_(t,e){var A=Yi(e),i=ki(e),n=Xe(t,A);return ia(n)?A3(Object.keys(n),i,!1).map(o=>SI(A,o)):[]}function hZ(t){var e=t.activeIndex0?0:-1,A=t.items[e],i=t.items.map((n,o)=>Me(Me({},n),{},{active:o===e}));return Me(Me({},t),{},{items:i,activeItem:A,activeIndex:e})}function QZ(t,e){var A,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=t.toLowerCase(),o=(A=i?.maxResults)!==null&&A!==void 0?A:1/0,a=i?.columns,r=[],s=[];function l(f){r.length>=o||r.push(f)}function g(f,m){if(Vo(m)){var v=s.length;s.push("0");for(var k=0;k=o)return;s.pop()}else if(ia(m)){var S=Object.keys(m),b=s.length;for(var x of(s.push(""),S))if(s[b]=x,uZ(x,f,s,Qc.key,l),g(f,m[x]),r.length>=o)return;s.pop()}else uZ(String(m),f,s,Qc.value,l)}if(t==="")return[];if(a){if(!Array.isArray(e))throw new Error("json must be an Array when option columns is defined");for(var C=0;Ch.length+1;)s.pop();g(n,Xe(I,h))}if(r.length>=o)break}return r}return g(n,e),r}function uZ(t,e,A,i,n){var o=t.toLowerCase(),a=0,r=-1,s=-1;do(s=o.indexOf(e,r))!==-1&&(r=s+e.length,n({path:A.slice(0),field:i,fieldIndex:a,start:s,end:r}),a++);while(s!==-1)}function lR(t,e,A,i){return t.substring(0,A)+e+t.substring(i)}function fZ(t,e,A){var i=t;return L9(A,n=>{i=lR(i,e,n.start,n.end)}),i}function l6A(t,e,A,i,n){var{field:o,path:a,start:r,end:s}=i;if(o===Qc.key){var l=Yi(a),g=Xe(t,l),C=ki(a),I=e3(l,Object.keys(g),C,lR(C,A,r,s));return{newSelection:Yh(t,I),operations:I}}if(o===Qc.value){var d=Xe(t,a);if(d===void 0)throw new Error("Cannot replace: path not found ".concat(vt(a)));var h=typeof d=="string"?d:String(d),E=v0(t,e,a),f=lR(h,A,r,s),m=[{op:"replace",path:vt(a),value:E?f:$h(f,n)}];return{newSelection:Yh(t,m),operations:m}}throw new Error("Cannot replace: unknown type of search result field ".concat(o))}function pZ(t){return t.path.concat(t.field,String(t.fieldIndex))}function mZ(t){var e=o$(t)?t.searchResults.filter(A=>A.field===Qc.key):void 0;return e&&e.length>0?e:void 0}function wZ(t){var e=o$(t)?t.searchResults.filter(A=>A.field===Qc.value):void 0;return e&&e.length>0?e:void 0}var g6A={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function f$(t,e){return e.reduce((A,i)=>(function(n,o,a,r){return OR(n,o,a,r,g6A)})(t,A,i.path,(n,o)=>Me(Me({},o),{},{searchResults:o.searchResults?o.searchResults.concat(i):[i]})),void 0)}function hD(t){var e,A=(e=t?.searchResults)!==null&&e!==void 0?e:[],i=Cl(t)?Object.values(t.properties).flatMap(hD):ir(t)?t.items.flatMap(hD):[];return A.concat(i)}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-highlight.svelte-19qyvy6 { + background-color: var(--jse-search-match-color, #ffe665); + outline: var(--jse-search-match-outline, none); +} +.jse-highlight.jse-active.svelte-19qyvy6 { + background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); + outline: var(--jse-search-match-outline, 2px solid #e0be00); +}`);var c6A=JA(" ");function p$(t,e){Nt(e,!1);var A=EA(),i=L(e,"text",8),n=L(e,"searchResultItems",8);KA(()=>(K(i()),K(n())),()=>{N(A,(function(a,r){var s=[],l=0;for(var g of r){var C=a.slice(l,g.start);C!==""&&s.push({resultIndex:void 0,type:"normal",text:C,active:!1});var I=a.slice(g.start,g.end);s.push({resultIndex:g.resultIndex,type:"highlight",text:I,active:g.active}),l=g.end}var d=ki(r);return d&&d.endc(A),ka,(a,r)=>{var s=Fi(),l=et(s),g=I=>{var d=dr();Se(()=>Lt(d,(c(r),wA(()=>c(r).text)))),CA(I,d)},C=I=>{var d,h=c6A(),E=dA(h);Se((f,m)=>{d=ii(h,1,"jse-highlight svelte-19qyvy6",null,d,{"jse-active":c(r).active}),_n(h,"data-search-result-index",f),Lt(E,m)},[()=>(c(r),wA(()=>String(c(r).resultIndex))),()=>(K(Jh),c(r),wA(()=>Jh(c(r).text)))]),CA(I,h)};jA(l,I=>{c(r),wA(()=>c(r).type==="normal")?I(g):I(C,!1)}),CA(a,s)}),CA(t,o),Ft()}function iD(t){var e=1e3;if(t<900)return t.toFixed()+" B";var A=t/e;if(A<900)return A.toFixed(1)+" KB";var i=A/e;if(i<900)return i.toFixed(1)+" MB";var n=i/e;return n<900?n.toFixed(1)+" GB":(n/e).toFixed(1)+" TB"}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-tag.svelte-ubve9r { + border: none; + font-size: 80%; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); + background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + border-radius: 2px; + cursor: pointer; + display: inline-block; + padding: 0 4px; + line-height: normal; + margin: 1px 0; +} +.jse-tag.svelte-ubve9r:hover { + opacity: 0.8; +} +.jse-tag.disabled.svelte-ubve9r { + opacity: 0.7; + cursor: inherit; +}`);var C6A=JA('');function nD(t,e){Nt(e,!0);var A,i=Il(()=>e.onclick?o=>{o.preventDefault(),o.stopPropagation(),e.onclick()}:void 0),n=C6A();n.__click=function(){for(var o,a=arguments.length,r=new Array(a),s=0;s2?r-2:0),l=2;l{var C,I=(C=a())!==null&&C!==void 0?C:null;g.ensure(I,I&&(d=>I(d,...s)))},ud)})(dA(n),()=>{var o;return(o=e.children)!==null&&o!==void 0?o:UpA}),Se(()=>A=ii(n,1,"jse-tag svelte-ubve9r",null,A,{disabled:!e.onclick})),CA(t,n),Ft()}Vf(["click"]);Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-value.jse-string.svelte-1saqp8c { + color: var(--jse-value-color-string, #008000); +} +.jse-value.jse-object.svelte-1saqp8c, .jse-value.jse-array.svelte-1saqp8c { + min-width: 16px; + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); +} +.jse-value.jse-number.svelte-1saqp8c { + color: var(--jse-value-color-number, #ee422e); +} +.jse-value.jse-boolean.svelte-1saqp8c { + color: var(--jse-value-color-boolean, #ff8c00); +} +.jse-value.jse-null.svelte-1saqp8c { + color: var(--jse-value-color-null, #004ed0); +} +.jse-value.jse-invalid.svelte-1saqp8c { + color: var(--jse-text-color, #4d4d4d); +} +.jse-value.jse-url.svelte-1saqp8c { + color: var(--jse-value-color-url, #008000); + text-decoration: underline; +} + +.jse-value.svelte-1saqp8c { + display: inline-block; + min-width: 2em; + padding: 0 5px; + box-sizing: border-box; + outline: none; + border-radius: 1px; + vertical-align: top; + word-break: normal; + overflow-wrap: anywhere; + white-space: pre-wrap; +} +.jse-value.jse-table-cell.svelte-1saqp8c { + overflow-wrap: normal; + white-space: nowrap; +} +.jse-value.jse-empty.svelte-1saqp8c { + min-width: 4em; + outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + -moz-outline-radius: 2px; +} +.jse-value.jse-empty.svelte-1saqp8c::after { + pointer-events: none; + color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + content: "value"; +}`);var I6A=JA('
      ');function d6A(t,e){Nt(e,!0);var A=DC(!0),i=Il(()=>c(A)&&typeof e.value=="string"&&e.value.length>e.truncateTextSize&&(!e.searchResultItems||!e.searchResultItems.some(d=>d.active&&d.end>e.truncateTextSize))),n=Il(()=>c(i)&&typeof e.value=="string"?e.value.substring(0,e.truncateTextSize).trim():e.value),o=Il(()=>xD(e.value));function a(){N(A,!1)}var r=I6A();r.__click=function(d){typeof e.value=="string"&&c(o)&&FR(d)&&(d.preventDefault(),d.stopPropagation(),window.open(e.value,"_blank"))},r.__dblclick=function(d){e.readOnly||(d.preventDefault(),e.onSelect(BD(e.path)))};var s=dA(r),l=d=>{var h=Il(()=>e.normalization.escapeValue(c(n)));p$(d,{get text(){return c(h)},get searchResultItems(){return e.searchResultItems}})},g=d=>{var h=dr();Se(E=>Lt(h,E),[()=>Jh(e.normalization.escapeValue(c(n)))]),CA(d,h)};jA(s,d=>{e.searchResultItems?d(l):d(g,!1)});var C=_A(s,2),I=d=>{nD(d,{onclick:a,children:(h,E)=>{var f=dr();Se(m=>Lt(f,"Show more (".concat(m??"",")")),[()=>iD(e.value.length)]),CA(h,f)},$$slots:{default:!0}})};jA(C,d=>{c(i)&&typeof e.value=="string"&&d(I)}),Se(d=>{ii(r,1,d,"svelte-1saqp8c"),_n(r,"title",c(o)?"Ctrl+Click or Ctrl+Enter to open url in new window":void 0)},[()=>bI(I$(e.value,e.mode,e.parser))]),CA(t,r),Ft()}Vf(["click","dblclick"]);Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-tooltip.svelte-brt1mq { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + line-height: normal; + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); + border-radius: 3px; + background: var(--jse-context-menu-background, #656565); + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); + white-space: nowrap; + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); +}`);var B6A=JA('
      ');function E6A(t,e){var A=L(e,"text",8),i=B6A(),n=dA(i);Se(()=>Lt(n,A())),CA(t,i)}function Hh(t,e){var A,{text:i,openAbsolutePopup:n,closeAbsolutePopup:o}=e;function a(){A=n(E6A,{text:i},{position:"top",width:10*i.length,offsetTop:3,anchor:t,closeOnOuterClick:!0})}function r(){o(A)}return t.addEventListener("mouseenter",a),t.addEventListener("mouseleave",r),{destroy(){t.removeEventListener("mouseenter",a),t.removeEventListener("mouseleave",r)}}}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-timestamp.svelte-1jcpman { + padding: 0; + margin: 0; + vertical-align: middle; + display: inline-flex; + color: var(--jse-value-color-number, #ee422e); +}`);var h6A=JA('
      ');function Q6A(t,e){Nt(e,!1);var A=EA(void 0,!0),i=kI("absolute-popup"),n=L(e,"value",9);KA(()=>K(n()),()=>{N(A,"Time: ".concat(new Date(n()).toString()))}),Rn(),ni(!0);var o=h6A();tn(dA(o),{get data(){return Iz}}),ms(o,(a,r)=>Hh?.(a,r),()=>Me({text:c(A)},i)),CA(t,o),Ft()}function u6A(t){var e=[];return!t.isEditing&&QmA(t.value)&&e.push({component:VmA,props:t}),!t.isEditing&&umA(t.value)&&e.push({component:$mA,props:t}),t.isEditing&&e.push({component:s6A,props:t}),t.isEditing||e.push({component:d6A,props:t}),!t.isEditing&&$_(t.value)&&e.push({component:Q6A,props:t}),e}function Bl(t){return t.map((e,A)=>p6A.test(e)?"["+e+"]":/[.[\]]/.test(e)||e===""?'["'+(function(i){return i.replace(/"/g,'\\"')})(e)+'"]':(A>0?".":"")+e).join("")}function f6A(t){for(var e=[],A=0;Ao==='"',!0)),n('"')):e.push(i(o=>o==="]")),n("]")):e.push(i(o=>o==="."||o==="["));function i(o){for(var a=arguments.length>1&&arguments[1]!==void 0&&arguments[1],r="";A({x:t,y:t}),D6A={left:"right",right:"left",bottom:"top",top:"bottom"},y6A={start:"end",end:"start"};function DZ(t,e,A){return Qd(t,QD(e,A))}function ND(t,e){return typeof t=="function"?t(e):t}function bd(t){return t.split("-")[0]}function FD(t){return t.split("-")[1]}function m$(t){return t==="x"?"y":"x"}function w$(t){return t==="y"?"height":"width"}var v6A=new Set(["top","bottom"]);function uI(t){return v6A.has(bd(t))?"y":"x"}function D$(t){return m$(uI(t))}function gR(t){return t.replace(/start|end/g,e=>y6A[e])}var yZ=["left","right"],vZ=["right","left"],b6A=["top","bottom"],M6A=["bottom","top"];function S6A(t,e,A,i){var n=FD(t),o=(function(a,r,s){switch(a){case"top":case"bottom":return s?r?vZ:yZ:r?yZ:vZ;case"left":case"right":return r?b6A:M6A;default:return[]}})(bd(t),A==="start",i);return n&&(o=o.map(a=>a+"-"+n),e&&(o=o.concat(o.map(gR)))),o}function H5(t){return t.replace(/left|right|bottom|top/g,e=>D6A[e])}function k6A(t){return typeof t!="number"?(function(e){return Me({top:0,right:0,bottom:0,left:0},e)})(t):{top:t,right:t,bottom:t,left:t}}function fD(t){var{x:e,y:A,width:i,height:n}=t;return{width:i,height:n,top:A,left:e,right:e+i,bottom:A+n,x:e,y:A}}function bZ(t,e,A){var i,{reference:n,floating:o}=t,a=uI(e),r=D$(e),s=w$(r),l=bd(e),g=a==="y",C=n.x+n.width/2-o.width/2,I=n.y+n.height/2-o.height/2,d=n[s]/2-o[s]/2;switch(l){case"top":i={x:C,y:n.y-o.height};break;case"bottom":i={x:C,y:n.y+n.height};break;case"right":i={x:n.x+n.width,y:I};break;case"left":i={x:n.x-o.width,y:I};break;default:i={x:n.x,y:n.y}}switch(FD(e)){case"start":i[r]-=d*(A&&g?-1:1);break;case"end":i[r]+=d*(A&&g?-1:1)}return i}var x6A=(function(){var t=zt(function*(e,A,i){for(var{placement:n="bottom",strategy:o="absolute",middleware:a=[],platform:r}=i,s=a.filter(Boolean),l=yield r.isRTL==null?void 0:r.isRTL(A),g=yield r.getElementRects({reference:e,floating:A,strategy:o}),{x:C,y:I}=bZ(g,n,l),d=n,h={},E=0,f=0;f"u")&&(t instanceof ShadowRoot||t instanceof Ol(t).ShadowRoot)}var R6A=new Set(["inline","contents"]);function Tf(t){var{overflow:e,overflowX:A,overflowY:i,display:n}=fc(t);return/auto|scroll|overlay|hidden|clip/.test(e+i+A)&&!R6A.has(n)}var N6A=new Set(["table","td","th"]);function F6A(t){return N6A.has(zh(t))}var L6A=[":popover-open",":modal"];function pD(t){return L6A.some(e=>{try{return t.matches(e)}catch(A){return!1}})}var G6A=["transform","translate","scale","rotate","perspective"],K6A=["transform","translate","scale","rotate","perspective","filter"],U6A=["paint","layout","strict","content"];function IR(t){var e=PR(),A=uc(t)?fc(t):t;return G6A.some(i=>!!A[i]&&A[i]!=="none")||!!A.containerType&&A.containerType!=="normal"||!e&&!!A.backdropFilter&&A.backdropFilter!=="none"||!e&&!!A.filter&&A.filter!=="none"||K6A.some(i=>(A.willChange||"").includes(i))||U6A.some(i=>(A.contain||"").includes(i))}function PR(){return!(typeof CSS>"u"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}var T6A=new Set(["html","body","#document"]);function xh(t){return T6A.has(zh(t))}function fc(t){return Ol(t).getComputedStyle(t)}function GD(t){return uc(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.scrollX,scrollTop:t.scrollY}}function fI(t){if(zh(t)==="html")return t;var e=t.assignedSlot||t.parentNode||MZ(t)&&t.host||_0(t);return MZ(e)?e.host:e}function b$(t){var e=fI(t);return xh(e)?t.ownerDocument?t.ownerDocument.body:t.body:R0(e)&&Tf(e)?e:b$(e)}function Jf(t,e,A){var i;e===void 0&&(e=[]),A===void 0&&(A=!0);var n=b$(t),o=n===((i=t.ownerDocument)==null?void 0:i.body),a=Ol(n);if(o){var r=dR(a);return e.concat(a,a.visualViewport||[],Tf(n)?n:[],r&&A?Jf(r):[])}return e.concat(n,Jf(n,[],A))}function dR(t){return t.parent&&Object.getPrototypeOf(t.parent)?t.frameElement:null}function M$(t){var e=fc(t),A=parseFloat(e.width)||0,i=parseFloat(e.height)||0,n=R0(t),o=n?t.offsetWidth:A,a=n?t.offsetHeight:i,r=uD(A)!==o||uD(i)!==a;return r&&(A=o,i=a),{width:A,height:i,$:r}}function jR(t){return uc(t)?t:t.contextElement}function _h(t){var e=jR(t);if(!R0(e))return x0(1);var A=e.getBoundingClientRect(),{width:i,height:n,$:o}=M$(e),a=(o?uD(A.width):A.width)/i,r=(o?uD(A.height):A.height)/n;return a&&Number.isFinite(a)||(a=1),r&&Number.isFinite(r)||(r=1),{x:a,y:r}}var J6A=x0(0);function S$(t){var e=Ol(t);return PR()&&e.visualViewport?{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}:J6A}function Md(t,e,A,i){e===void 0&&(e=!1),A===void 0&&(A=!1);var n=t.getBoundingClientRect(),o=jR(t),a=x0(1);e&&(i?uc(i)&&(a=_h(i)):a=_h(t));var r=(function(b,x,F){return x===void 0&&(x=!1),!(!F||x&&F!==Ol(b))&&x})(o,A,i)?S$(o):x0(0),s=(n.left+r.x)/a.x,l=(n.top+r.y)/a.y,g=n.width/a.x,C=n.height/a.y;if(o)for(var I=Ol(o),d=i&&uc(i)?Ol(i):i,h=I,E=dR(h);E&&i&&d!==h;){var f=_h(E),m=E.getBoundingClientRect(),v=fc(E),k=m.left+(E.clientLeft+parseFloat(v.paddingLeft))*f.x,S=m.top+(E.clientTop+parseFloat(v.paddingTop))*f.y;s*=f.x,l*=f.y,g*=f.x,C*=f.y,s+=k,l+=S,E=dR(h=Ol(E))}return fD({width:g,height:C,x:s,y:l})}function mD(t,e){var A=GD(t).scrollLeft;return e?e.left+A:Md(_0(t)).left+A}function k$(t,e){var A=t.getBoundingClientRect();return{x:A.left+e.scrollLeft-mD(t,A),y:A.top+e.scrollTop}}var O6A=new Set(["absolute","fixed"]);function SZ(t,e,A){var i;if(e==="viewport")i=(function(o,a){var r=Ol(o),s=_0(o),l=r.visualViewport,g=s.clientWidth,C=s.clientHeight,I=0,d=0;if(l){g=l.width,C=l.height;var h=PR();(!h||h&&a==="fixed")&&(I=l.offsetLeft,d=l.offsetTop)}var E=mD(s);if(E<=0){var f=s.ownerDocument,m=f.body,v=getComputedStyle(m),k=f.compatMode==="CSS1Compat"&&parseFloat(v.marginLeft)+parseFloat(v.marginRight)||0,S=Math.abs(s.clientWidth-m.clientWidth-k);S<=25&&(g-=S)}else E<=25&&(g+=E);return{width:g,height:C,x:I,y:d}})(t,A);else if(e==="document")i=(function(o){var a=_0(o),r=GD(o),s=o.ownerDocument.body,l=Qd(a.scrollWidth,a.clientWidth,s.scrollWidth,s.clientWidth),g=Qd(a.scrollHeight,a.clientHeight,s.scrollHeight,s.clientHeight),C=-r.scrollLeft+mD(o),I=-r.scrollTop;return fc(s).direction==="rtl"&&(C+=Qd(a.clientWidth,s.clientWidth)-l),{width:l,height:g,x:C,y:I}})(_0(t));else if(uc(e))i=(function(o,a){var r=Md(o,!0,a==="fixed"),s=r.top+o.clientTop,l=r.left+o.clientLeft,g=R0(o)?_h(o):x0(1);return{width:o.clientWidth*g.x,height:o.clientHeight*g.y,x:l*g.x,y:s*g.y}})(e,A);else{var n=S$(t);i={x:e.x-n.x,y:e.y-n.y,width:e.width,height:e.height}}return fD(i)}function x$(t,e){var A=fI(t);return!(A===e||!uc(A)||xh(A))&&(fc(A).position==="fixed"||x$(A,e))}function Y6A(t,e,A){var i=R0(e),n=_0(e),o=A==="fixed",a=Md(t,!0,o,e),r={scrollLeft:0,scrollTop:0},s=x0(0);function l(){s.x=mD(n)}if(i||!i&&!o)if((zh(e)!=="body"||Tf(n))&&(r=GD(e)),i){var g=Md(e,!0,o,e);s.x=g.x+e.clientLeft,s.y=g.y+e.clientTop}else n&&l();o&&!i&&n&&l();var C=!n||i||o?x0(0):k$(n,r);return{x:a.left+r.scrollLeft-s.x-C.x,y:a.top+r.scrollTop-s.y-C.y,width:a.width,height:a.height}}function G_(t){return fc(t).position==="static"}function kZ(t,e){if(!R0(t)||fc(t).position==="fixed")return null;if(e)return e(t);var A=t.offsetParent;return _0(t)===A&&(A=A.ownerDocument.body),A}function xZ(t,e){var A=Ol(t);if(pD(t))return A;if(!R0(t)){for(var i=fI(t);i&&!xh(i);){if(uc(i)&&!G_(i))return i;i=fI(i)}return A}for(var n=kZ(t,e);n&&F6A(n)&&G_(n);)n=kZ(n,e);return n&&xh(n)&&G_(n)&&!IR(n)?A:n||(function(o){for(var a=fI(o);R0(a)&&!xh(a);){if(IR(a))return a;if(pD(a))return null;a=fI(a)}return null})(t)||A}var H6A={convertOffsetParentRelativeRectToViewportRelativeRect:function(t){var{elements:e,rect:A,offsetParent:i,strategy:n}=t,o=n==="fixed",a=_0(i),r=!!e&&pD(e.floating);if(i===a||r&&o)return A;var s={scrollLeft:0,scrollTop:0},l=x0(1),g=x0(0),C=R0(i);if((C||!C&&!o)&&((zh(i)!=="body"||Tf(a))&&(s=GD(i)),R0(i))){var I=Md(i);l=_h(i),g.x=I.x+i.clientLeft,g.y=I.y+i.clientTop}var d=!a||C||o?x0(0):k$(a,s);return{width:A.width*l.x,height:A.height*l.y,x:A.x*l.x-s.scrollLeft*l.x+g.x+d.x,y:A.y*l.y-s.scrollTop*l.y+g.y+d.y}},getDocumentElement:_0,getClippingRect:function(t){var{element:e,boundary:A,rootBoundary:i,strategy:n}=t,o=A==="clippingAncestors"?pD(e)?[]:(function(l,g){var C=g.get(l);if(C)return C;for(var I=Jf(l,[],!1).filter(v=>uc(v)&&zh(v)!=="body"),d=null,h=fc(l).position==="fixed",E=h?fI(l):l;uc(E)&&!xh(E);){var f=fc(E),m=IR(E);m||f.position!=="fixed"||(d=null),(h?!m&&!d:!m&&f.position==="static"&&d&&O6A.has(d.position)||Tf(E)&&!m&&x$(l,E))?I=I.filter(v=>v!==E):d=f,E=fI(E)}return g.set(l,I),I})(e,this._c):[].concat(A),a=[...o,i],r=a[0],s=a.reduce((l,g)=>{var C=SZ(e,g,n);return l.top=Qd(C.top,l.top),l.right=QD(C.right,l.right),l.bottom=QD(C.bottom,l.bottom),l.left=Qd(C.left,l.left),l},SZ(e,r,n));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}},getOffsetParent:xZ,getElementRects:(function(){var t=zt(function*(e){var A=this.getOffsetParent||xZ,i=this.getDimensions,n=yield i(e.floating);return{reference:Y6A(e.reference,yield A(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}});return function(e){return t.apply(this,arguments)}})(),getClientRects:function(t){return Array.from(t.getClientRects())},getDimensions:function(t){var{width:e,height:A}=M$(t);return{width:e,height:A}},getScale:_h,isElement:uc,isRTL:function(t){return fc(t).direction==="rtl"}};function _Z(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}function z6A(t,e,A,i){i===void 0&&(i={});var{ancestorScroll:n=!0,ancestorResize:o=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:r=typeof IntersectionObserver=="function",animationFrame:s=!1}=i,l=jR(t),g=n||o?[...l?Jf(l):[],...Jf(e)]:[];g.forEach(f=>{n&&f.addEventListener("scroll",A,{passive:!0}),o&&f.addEventListener("resize",A)});var C,I=l&&r?(function(f,m){var v,k=null,S=_0(f);function b(){var x;clearTimeout(v),(x=k)==null||x.disconnect(),k=null}return(function x(F,z){F===void 0&&(F=!1),z===void 0&&(z=1),b();var P=f.getBoundingClientRect(),{left:Z,top:tA,width:W,height:BA}=P;if(F||m(),W&&BA){var X={rootMargin:-Y5(tA)+"px "+-Y5(S.clientWidth-(Z+W))+"px "+-Y5(S.clientHeight-(tA+BA))+"px "+-Y5(Z)+"px",threshold:Qd(0,QD(1,z))||1},iA=!0;try{k=new IntersectionObserver(AA,Me(Me({},X),{},{root:S.ownerDocument}))}catch(IA){k=new IntersectionObserver(AA,X)}k.observe(f)}function AA(IA){var aA=IA[0].intersectionRatio;if(aA!==z){if(!iA)return x();aA?x(!1,aA):v=setTimeout(()=>{x(!1,1e-7)},1e3)}aA!==1||_Z(P,f.getBoundingClientRect())||x(),iA=!1}})(!0),b})(l,A):null,d=-1,h=null;a&&(h=new ResizeObserver(f=>{var[m]=f;m&&m.target===l&&h&&(h.unobserve(e),cancelAnimationFrame(d),d=requestAnimationFrame(()=>{var v;(v=h)==null||v.observe(e)})),A()}),l&&!s&&h.observe(l),h.observe(e));var E=s?Md(t):null;return s&&(function f(){var m=Md(t);E&&!_Z(E,m)&&A(),E=m,C=requestAnimationFrame(f)})(),A(),()=>{var f;g.forEach(m=>{n&&m.removeEventListener("scroll",A),o&&m.removeEventListener("resize",A)}),I?.(),(f=h)==null||f.disconnect(),h=null,s&&cancelAnimationFrame(C)}}var P6A=function(t){return t===void 0&&(t=0),{name:"offset",options:t,fn:e=>zt(function*(){var A,i,{x:n,y:o,placement:a,middlewareData:r}=e,s=yield(function(l,g){return CR.apply(this,arguments)})(e,t);return a===((A=r.offset)==null?void 0:A.placement)&&(i=r.arrow)!=null&&i.alignmentOffset?{}:{x:n+s.x,y:o+s.y,data:Me(Me({},s),{},{placement:a})}})()}},j6A=function(t){return t===void 0&&(t={}),{name:"shift",options:t,fn:e=>zt(function*(){var{x:A,y:i,placement:n}=e,o=ND(t,e),{mainAxis:a=!0,crossAxis:r=!1,limiter:s={fn:k=>{var{x:S,y:b}=k;return{x:S,y:b}}}}=o,l=TZ(o,_pA),g={x:A,y:i},C=yield y$(e,l),I=uI(bd(n)),d=m$(I),h=g[d],E=g[I];if(a){var f=d==="y"?"bottom":"right";h=DZ(h+C[d==="y"?"top":"left"],h,h-C[f])}if(r){var m=I==="y"?"bottom":"right";E=DZ(E+C[I==="y"?"top":"left"],E,E-C[m])}var v=s.fn(Me(Me({},e),{},{[d]:h,[I]:E}));return Me(Me({},v),{},{data:{x:v.x-A,y:v.y-i,enabled:{[d]:a,[I]:r}}})})()}},q6A=function(t){return t===void 0&&(t={}),{name:"flip",options:t,fn:e=>zt(function*(){var A,i,{placement:n,middlewareData:o,rects:a,initialPlacement:r,platform:s,elements:l}=e,g=ND(t,e),{mainAxis:C=!0,crossAxis:I=!0,fallbackPlacements:d,fallbackStrategy:h="bestFit",fallbackAxisSideDirection:E="none",flipAlignment:f=!0}=g,m=TZ(g,xpA);if((A=o.arrow)!=null&&A.alignmentOffset)return{};var v=bd(n),k=uI(r),S=bd(r)===r,b=yield s.isRTL==null?void 0:s.isRTL(l.floating),x=d||(S||!f?[H5(r)]:(function(uA){var UA=H5(uA);return[gR(uA),UA,gR(UA)]})(r)),F=E!=="none";!d&&F&&x.push(...S6A(r,f,E,b));var z=[r,...x],P=yield y$(e,m),Z=[],tA=((i=o.flip)==null?void 0:i.overflows)||[];if(C&&Z.push(P[v]),I){var W=(function(uA,UA,$A){$A===void 0&&($A=!1);var zA=FD(uA),pA=D$(uA),PA=w$(pA),Je=pA==="x"?zA===($A?"end":"start")?"right":"left":zA==="start"?"bottom":"top";return UA.reference[PA]>UA.floating[PA]&&(Je=H5(Je)),[Je,H5(Je)]})(n,a,b);Z.push(P[W[0]],P[W[1]])}if(tA=[...tA,{placement:n,overflows:Z}],!Z.every(uA=>uA<=0)){var BA,X,iA=(((BA=o.flip)==null?void 0:BA.index)||0)+1,AA=z[iA];if(AA&&(!(I==="alignment"&&k!==uI(AA))||tA.every(uA=>uI(uA.placement)!==k||uA.overflows[0]>0)))return{data:{index:iA,overflows:tA},reset:{placement:AA}};var IA=(X=tA.filter(uA=>uA.overflows[0]<=0).sort((uA,UA)=>uA.overflows[1]-UA.overflows[1])[0])==null?void 0:X.placement;if(!IA)switch(h){case"bestFit":var aA,rA=(aA=tA.filter(uA=>{if(F){var UA=uI(uA.placement);return UA===k||UA==="y"}return!0}).map(uA=>[uA.placement,uA.overflows.filter(UA=>UA>0).reduce((UA,$A)=>UA+$A,0)]).sort((uA,UA)=>uA[1]-UA[1])[0])==null?void 0:aA[0];rA&&(IA=rA);break;case"initialPlacement":IA=r}if(n!==IA)return{reset:{placement:IA}}}return{}})()}};function V6A(t){var e,A,i={autoUpdate:!0},n=t,o=s=>Me(Me(Me({},i),t||{}),s||{}),a=s=>{e&&A&&(n=o(s),((l,g,C)=>{var I=new Map,d=Me({platform:H6A},C),h=Me(Me({},d.platform),{},{_c:I});return x6A(l,g,Me(Me({},d),{},{platform:h}))})(e,A,n).then(l=>{var g;Object.assign(A.style,{position:l.strategy,left:"".concat(l.x,"px"),top:"".concat(l.y,"px")}),!((g=n)===null||g===void 0)&&g.onComputed&&n.onComputed(l)}))},r=s=>{Dg(s.subscribe(l=>{e===void 0?(e=l,a()):(Object.assign(e,l),a())}))};return[s=>{if("subscribe"in s)return r(s),{};e=s,a()},(s,l)=>{var g;A=s,n=o(l),setTimeout(()=>a(l),0),a(l);var C=()=>{g&&(g(),g=void 0)},I=function(){var{autoUpdate:d}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:n||{};C(),d!==!1&&kX().then(()=>z6A(e,A,()=>a(n),d===!0?{}:d))};return g=I(),{update(d){a(d),g=I(d)},destroy(){C()}}},a]}function W6A(t){var{loadOptions:e,filterText:A,items:i,multiple:n,value:o,itemId:a,groupBy:r,filterSelectedItems:s,itemFilter:l,convertStringItemsToObjects:g,filterGroupedItems:C,label:I}=t;if(i&&e)return i;if(!i)return[];i&&i.length>0&&typeof i[0]!="object"&&(i=g(i));var d=i.filter(h=>{var E=l(h[I],A,h);return E&&n&&o!=null&&o.length&&(E=!o.some(f=>!!s&&f[a]===h[a])),E});return r&&(d=C(d)),d}function Z6A(t){return _$.apply(this,arguments)}function _$(){return(_$=zt(function*(t){var{dispatch:e,loadOptions:A,convertStringItemsToObjects:i,filterText:n}=t,o=yield A(n).catch(a=>{console.warn("svelte-select loadOptions error :>> ",a),e("error",{type:"loadOptions",details:a})});if(o&&!o.cancelled)return o?(o&&o.length>0&&typeof o[0]!="object"&&(o=i(o)),e("loaded",{items:o})):o=[],{filteredItems:o,loading:!1,focused:!0,listOpen:!0}})).apply(this,arguments)}Zt(` + svg.svelte-1kxu7be { + width: var(--chevron-icon-width, 20px); + height: var(--chevron-icon-width, 20px); + color: var(--chevron-icon-colour, currentColor); + } +`);var X6A=xI(``);Zt(` + svg.svelte-1hraxrc { + width: var(--clear-icon-width, 20px); + height: var(--clear-icon-width, 20px); + color: var(--clear-icon-color, currentColor); + } +`);var $6A=xI(``);function K_(t){CA(t,$6A())}Zt(` + .loading.svelte-y9fi5p { + width: var(--spinner-width, 20px); + height: var(--spinner-height, 20px); + color: var(--spinner-color, var(--icons-color)); + animation: svelte-y9fi5p-rotate 0.75s linear infinite; + transform-origin: center center; + transform: none; + } + + .circle_path.svelte-y9fi5p { + stroke-dasharray: 90; + stroke-linecap: round; + } + + @keyframes svelte-y9fi5p-rotate { + 100% { + transform: rotate(360deg); + } + } +`);var A8A=xI('');Zt(` + .svelte-select.svelte-1ul7oo4 { + /* deprecating camelCase custom props in favour of kebab-case for v5 */ + --borderRadius: var(--border-radius); + --clearSelectColor: var(--clear-select-color); + --clearSelectWidth: var(--clear-select-width); + --disabledBackground: var(--disabled-background); + --disabledBorderColor: var(--disabled-border-color); + --disabledColor: var(--disabled-color); + --disabledPlaceholderColor: var(--disabled-placeholder-color); + --disabledPlaceholderOpacity: var(--disabled-placeholder-opacity); + --errorBackground: var(--error-background); + --errorBorder: var(--error-border); + --groupItemPaddingLeft: var(--group-item-padding-left); + --groupTitleColor: var(--group-title-color); + --groupTitleFontSize: var(--group-title-font-size); + --groupTitleFontWeight: var(--group-title-font-weight); + --groupTitlePadding: var(--group-title-padding); + --groupTitleTextTransform: var(--group-title-text-transform); + --groupTitleBorderColor: var(--group-title-border-color); + --groupTitleBorderWidth: var(--group-title-border-width); + --groupTitleBorderStyle: var(--group-title-border-style); + --indicatorColor: var(--chevron-color); + --indicatorHeight: var(--chevron-height); + --indicatorWidth: var(--chevron-width); + --inputColor: var(--input-color); + --inputLeft: var(--input-left); + --inputLetterSpacing: var(--input-letter-spacing); + --inputMargin: var(--input-margin); + --inputPadding: var(--input-padding); + --itemActiveBackground: var(--item-active-background); + --itemColor: var(--item-color); + --itemFirstBorderRadius: var(--item-first-border-radius); + --itemHoverBG: var(--item-hover-bg); + --itemHoverColor: var(--item-hover-color); + --itemIsActiveBG: var(--item-is-active-bg); + --itemIsActiveColor: var(--item-is-active-color); + --itemIsNotSelectableColor: var(--item-is-not-selectable-color); + --itemPadding: var(--item-padding); + --listBackground: var(--list-background); + --listBorder: var(--list-border); + --listBorderRadius: var(--list-border-radius); + --listEmptyColor: var(--list-empty-color); + --listEmptyPadding: var(--list-empty-padding); + --listEmptyTextAlign: var(--list-empty-text-align); + --listMaxHeight: var(--list-max-height); + --listPosition: var(--list-position); + --listShadow: var(--list-shadow); + --listZIndex: var(--list-z-index); + --multiItemBG: var(--multi-item-bg); + --multiItemBorderRadius: var(--multi-item-border-radius); + --multiItemDisabledHoverBg: var(--multi-item-disabled-hover-bg); + --multiItemDisabledHoverColor: var(--multi-item-disabled-hover-color); + --multiItemHeight: var(--multi-item-height); + --multiItemMargin: var(--multi-item-margin); + --multiItemPadding: var(--multi-item-padding); + --multiSelectInputMargin: var(--multi-select-input-margin); + --multiSelectInputPadding: var(--multi-select-input-padding); + --multiSelectPadding: var(--multi-select-padding); + --placeholderColor: var(--placeholder-color); + --placeholderOpacity: var(--placeholder-opacity); + --selectedItemPadding: var(--selected-item-padding); + --spinnerColor: var(--spinner-color); + --spinnerHeight: var(--spinner-height); + --spinnerWidth: var(--spinner-width); + + --internal-padding: 0 0 0 16px; + + border: var(--border, 1px solid #d8dbdf); + border-radius: var(--border-radius, 6px); + min-height: var(--height, 42px); + position: relative; + display: flex; + align-items: stretch; + padding: var(--padding, var(--internal-padding)); + background: var(--background, #fff); + margin: var(--margin, 0); + width: var(--width, 100%); + font-size: var(--font-size, 16px); + max-height: var(--max-height); + } + + .svelte-1ul7oo4 { + box-sizing: var(--box-sizing, border-box); + } + + .svelte-select.svelte-1ul7oo4:hover { + border: var(--border-hover, 1px solid #b2b8bf); + } + + .value-container.svelte-1ul7oo4 { + display: flex; + flex: 1 1 0%; + flex-wrap: wrap; + align-items: center; + gap: 5px 10px; + padding: var(--value-container-padding, 5px 0); + position: relative; + overflow: var(--value-container-overflow, hidden); + align-self: stretch; + } + + .prepend.svelte-1ul7oo4, + .indicators.svelte-1ul7oo4 { + display: flex; + flex-shrink: 0; + align-items: center; + } + + .indicators.svelte-1ul7oo4 { + position: var(--indicators-position); + top: var(--indicators-top); + right: var(--indicators-right); + bottom: var(--indicators-bottom); + } + + input.svelte-1ul7oo4 { + position: absolute; + cursor: default; + border: none; + color: var(--input-color, var(--item-color)); + padding: var(--input-padding, 0); + letter-spacing: var(--input-letter-spacing, inherit); + margin: var(--input-margin, 0); + min-width: 10px; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: transparent; + font-size: var(--font-size, 16px); + } + + .svelte-1ul7oo4:not(.multi) > .value-container:where(.svelte-1ul7oo4) > input:where(.svelte-1ul7oo4) { + width: 100%; + height: 100%; + } + + input.svelte-1ul7oo4::placeholder { + color: var(--placeholder-color, #78848f); + opacity: var(--placeholder-opacity, 1); + } + + input.svelte-1ul7oo4:focus { + outline: none; + } + + .svelte-select.focused.svelte-1ul7oo4 { + border: var(--border-focused, 1px solid #006fe8); + border-radius: var(--border-radius-focused, var(--border-radius, 6px)); + } + + .disabled.svelte-1ul7oo4 { + background: var(--disabled-background, #ebedef); + border-color: var(--disabled-border-color, #ebedef); + color: var(--disabled-color, #c1c6cc); + } + + .disabled.svelte-1ul7oo4 input:where(.svelte-1ul7oo4)::placeholder { + color: var(--disabled-placeholder-color, #c1c6cc); + opacity: var(--disabled-placeholder-opacity, 1); + } + + .selected-item.svelte-1ul7oo4 { + position: relative; + overflow: var(--selected-item-overflow, hidden); + padding: var(--selected-item-padding, 0 20px 0 0); + text-overflow: ellipsis; + white-space: nowrap; + color: var(--selected-item-color, inherit); + font-size: var(--font-size, 16px); + } + + .multi.svelte-1ul7oo4 .selected-item:where(.svelte-1ul7oo4) { + position: absolute; + line-height: var(--height, 42px); + height: var(--height, 42px); + } + + .selected-item.svelte-1ul7oo4:focus { + outline: none; + } + + .hide-selected-item.svelte-1ul7oo4 { + opacity: 0; + } + + .icon.svelte-1ul7oo4 { + display: flex; + align-items: center; + justify-content: center; + } + + .clear-select.svelte-1ul7oo4 { + all: unset; + display: flex; + align-items: center; + justify-content: center; + width: var(--clear-select-width, 40px); + height: var(--clear-select-height, 100%); + color: var(--clear-select-color, var(--icons-color)); + margin: var(--clear-select-margin, 0); + pointer-events: all; + flex-shrink: 0; + } + + .clear-select.svelte-1ul7oo4:focus { + outline: var(--clear-select-focus-outline, 1px solid #006fe8); + } + + .loading.svelte-1ul7oo4 { + width: var(--loading-width, 40px); + height: var(--loading-height); + color: var(--loading-color, var(--icons-color)); + margin: var(--loading--margin, 0); + flex-shrink: 0; + } + + .chevron.svelte-1ul7oo4 { + width: var(--chevron-width, 40px); + height: var(--chevron-height, 40px); + background: var(--chevron-background, transparent); + pointer-events: var(--chevron-pointer-events, none); + color: var(--chevron-color, var(--icons-color)); + border: var(--chevron-border, 0 0 0 1px solid #d8dbdf); + flex-shrink: 0; + } + + .multi.svelte-1ul7oo4 { + padding: var(--multi-select-padding, var(--internal-padding)); + } + + .multi.svelte-1ul7oo4 input:where(.svelte-1ul7oo4) { + padding: var(--multi-select-input-padding, 0); + position: relative; + margin: var(--multi-select-input-margin, 5px 0); + flex: 1 1 40px; + } + + .svelte-select.error.svelte-1ul7oo4 { + border: var(--error-border, 1px solid #ff2d55); + background: var(--error-background, #fff); + } + + .a11y-text.svelte-1ul7oo4 { + z-index: 9999; + border: 0px; + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + width: 1px; + position: absolute; + overflow: hidden; + padding: 0px; + white-space: nowrap; + } + + .multi-item.svelte-1ul7oo4 { + background: var(--multi-item-bg, #ebedef); + margin: var(--multi-item-margin, 0); + outline: var(--multi-item-outline, 1px solid #ddd); + border-radius: var(--multi-item-border-radius, 4px); + height: var(--multi-item-height, 25px); + line-height: var(--multi-item-height, 25px); + display: flex; + cursor: default; + padding: var(--multi-item-padding, 0 5px); + overflow: hidden; + gap: var(--multi-item-gap, 4px); + outline-offset: -1px; + max-width: var(--multi-max-width, none); + color: var(--multi-item-color, var(--item-color)); + } + + .multi-item.disabled.svelte-1ul7oo4:hover { + background: var(--multi-item-disabled-hover-bg, #ebedef); + color: var(--multi-item-disabled-hover-color, #c1c6cc); + } + + .multi-item-text.svelte-1ul7oo4 { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .multi-item-clear.svelte-1ul7oo4 { + display: flex; + align-items: center; + justify-content: center; + --clear-icon-color: var(--multi-item-clear-icon-color, #000); + } + + .multi-item.active.svelte-1ul7oo4 { + outline: var(--multi-item-active-outline, 1px solid #006fe8); + } + + .svelte-select-list.svelte-1ul7oo4 { + box-shadow: var(--list-shadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24)); + border-radius: var(--list-border-radius, 4px); + max-height: var(--list-max-height, 252px); + overflow-y: auto; + background: var(--list-background, #fff); + position: var(--list-position, absolute); + z-index: var(--list-z-index, 2); + border: var(--list-border); + } + + .prefloat.svelte-1ul7oo4 { + opacity: 0; + pointer-events: none; + } + + .list-group-title.svelte-1ul7oo4 { + color: var(--group-title-color, #8f8f8f); + cursor: default; + font-size: var(--group-title-font-size, 16px); + font-weight: var(--group-title-font-weight, 600); + height: var(--height, 42px); + line-height: var(--height, 42px); + padding: var(--group-title-padding, 0 20px); + text-overflow: ellipsis; + overflow-x: hidden; + white-space: nowrap; + text-transform: var(--group-title-text-transform, uppercase); + border-width: var(--group-title-border-width, medium); + border-style: var(--group-title-border-style, none); + border-color: var(--group-title-border-color, color); + } + + .empty.svelte-1ul7oo4 { + text-align: var(--list-empty-text-align, center); + padding: var(--list-empty-padding, 20px 0); + color: var(--list-empty-color, #78848f); + } + + .item.svelte-1ul7oo4 { + cursor: default; + height: var(--item-height, var(--height, 42px)); + line-height: var(--item-line-height, var(--height, 42px)); + padding: var(--item-padding, 0 20px); + color: var(--item-color, inherit); + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + transition: var(--item-transition, all 0.2s); + align-items: center; + width: 100%; + } + + .item.group-item.svelte-1ul7oo4 { + padding-left: var(--group-item-padding-left, 40px); + } + + .item.svelte-1ul7oo4:active { + background: var(--item-active-background, #b9daff); + } + + .item.active.svelte-1ul7oo4 { + background: var(--item-is-active-bg, #007aff); + color: var(--item-is-active-color, #fff); + } + + .item.first.svelte-1ul7oo4 { + border-radius: var(--item-first-border-radius, 4px 4px 0 0); + } + + .item.hover.svelte-1ul7oo4:not(.active) { + background: var(--item-hover-bg, #e7f2ff); + color: var(--item-hover-color, inherit); + } + + .item.not-selectable.svelte-1ul7oo4, + .item.hover.item.not-selectable.svelte-1ul7oo4, + .item.active.item.not-selectable.svelte-1ul7oo4, + .item.not-selectable.svelte-1ul7oo4:active { + color: var(--item-is-not-selectable-color, #999); + background: transparent; + } + + .required.svelte-1ul7oo4 { + opacity: 0; + z-index: -1; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + } +`);var e8A=JA('
      '),t8A=JA('
      No options
      '),i8A=JA('
      '),n8A=JA(' ',1),o8A=JA('
      '),a8A=JA('
      '),r8A=JA("
      "),s8A=JA(''),l8A=JA(''),g8A=JA(''),c8A=JA(''),C8A=JA(''),I8A=JA('
      ');function Cd(t,e){var A=(function(mA){var FA={};for(var le in mA.children&&(FA.default=!0),mA.$$slots)FA[le]=!0;return FA})(e);Nt(e,!1);var i,n=EA(),o=EA(),a=EA(),r=EA(),s=EA(),l=EA(),g=EA(),C=EA(),I=EA(),d=rmA(),h=L(e,"justValue",12,null),E=L(e,"filter",8,W6A),f=L(e,"getItems",8,Z6A),m=L(e,"id",8,null),v=L(e,"name",8,null),k=L(e,"container",12,void 0),S=L(e,"input",12,void 0),b=L(e,"multiple",8,!1),x=L(e,"multiFullItemClearable",8,!1),F=L(e,"disabled",8,!1),z=L(e,"focused",12,!1),P=L(e,"value",12,null),Z=L(e,"filterText",12,""),tA=L(e,"placeholder",8,"Please select"),W=L(e,"placeholderAlwaysShow",8,!1),BA=L(e,"items",12,null),X=L(e,"label",8,"label"),iA=L(e,"itemFilter",8,(mA,FA,le)=>"".concat(mA).toLowerCase().includes(FA.toLowerCase())),AA=L(e,"groupBy",8,void 0),IA=L(e,"groupFilter",8,mA=>mA),aA=L(e,"groupHeaderSelectable",8,!1),rA=L(e,"itemId",8,"value"),uA=L(e,"loadOptions",8,void 0),UA=L(e,"containerStyles",8,""),$A=L(e,"hasError",8,!1),zA=L(e,"filterSelectedItems",8,!0),pA=L(e,"required",8,!1),PA=L(e,"closeListOnChange",8,!0),Je=L(e,"clearFilterTextOnBlur",8,!0),_e=L(e,"createGroupHeaderItem",8,(mA,FA)=>({value:mA,[X()]:mA})),YA=()=>c(g),fA=L(e,"searchable",8,!0),XA=L(e,"inputStyles",8,""),DA=L(e,"clearable",8,!0),ee=L(e,"loading",12,!1),NA=L(e,"listOpen",12,!1),ke=L(e,"debounce",8,function(mA){var FA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1;clearTimeout(i),i=setTimeout(mA,FA)}),HA=L(e,"debounceWait",8,300),vA=L(e,"hideEmptyState",8,!1),Gt=L(e,"inputAttributes",24,()=>({})),ft=L(e,"listAutoWidth",8,!0),he=L(e,"showChevron",8,!1),Ot=L(e,"listOffset",8,5),He=L(e,"hoverItemIndex",12,0),je=L(e,"floatingConfig",24,()=>({})),pt=L(e,"class",8,""),xe=EA(),oi=EA(),j=EA(),$=EA(),oA=EA();function sA(mA){return mA.map((FA,le)=>({index:le,value:FA,label:"".concat(FA)}))}function TA(mA){var FA=[],le={};mA.forEach(nt=>{var rt=AA()(nt);FA.includes(rt)||(FA.push(rt),le[rt]=[],rt&&le[rt].push(Object.assign(_e()(rt,nt),{id:rt,groupHeader:!0,selectable:aA()}))),le[rt].push(Object.assign({groupItem:!!rt},nt))});var Ne=[];return IA()(FA).forEach(nt=>{le[nt]&&Ne.push(...le[nt])}),Ne}function de(){var mA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0,FA=arguments.length>1?arguments[1]:void 0;He(mA<0?0:mA),!FA&&AA()&&c(g)[He()]&&!c(g)[He()].selectable&&Ei(1)}function Qe(){var mA=!0;if(P()){var FA=[],le=[];P().forEach(Ne=>{FA.includes(Ne[rA()])?mA=!1:(FA.push(Ne[rA()]),le.push(Ne))}),mA||P(le)}return mA}function GA(mA){var FA=mA?mA[rA()]:P()[rA()];return BA().find(le=>le[rA()]===FA)}function OA(mA){return ht.apply(this,arguments)}function ht(){return(ht=zt(function*(mA){var FA=P()[mA];P().length===1?P(void 0):P(P().filter(le=>le!==FA)),d("clear",FA)})).apply(this,arguments)}function tt(mA){if(z())switch(mA.stopPropagation(),mA.key){case"Escape":mA.preventDefault(),Ke();break;case"Enter":if(mA.preventDefault(),NA()){if(c(g).length===0)break;var FA=c(g)[He()];if(P()&&!b()&&P()[rA()]===FA[rA()]){Ke();break}G(c(g)[He()])}break;case"ArrowDown":mA.preventDefault(),NA()?Ei(1):(NA(!0),N(xe,void 0));break;case"ArrowUp":mA.preventDefault(),NA()?Ei(-1):(NA(!0),N(xe,void 0));break;case"Tab":if(NA()&&z()){if(c(g).length===0||P()&&P()[rA()]===c(g)[He()][rA()])return Ke();mA.preventDefault(),G(c(g)[He()]),Ke()}break;case"Backspace":if(!b()||Z().length>0)return;if(b()&&P()&&P().length>0){if(OA(c(xe)!==void 0?c(xe):P().length-1),c(xe)===0||c(xe)===void 0)break;N(xe,P().length>c(xe)?c(xe)-1:void 0)}break;case"ArrowLeft":if(!P()||!b()||Z().length>0)return;c(xe)===void 0?N(xe,P().length-1):P().length>c(xe)&&c(xe)!==0&&N(xe,c(xe)-1);break;case"ArrowRight":if(!P()||!b()||Z().length>0||c(xe)===void 0)return;c(xe)===P().length-1?N(xe,void 0):c(xe)0?NA(!0):void NA(!NA())}function hn(){d("clear",P()),P(void 0),Ke(),ze()}function Ke(){Je()&&Z(""),NA(!1)}smA(zt(function*(){N(oi,P()),N(j,Z()),N($,b())})),As(()=>{NA()&&z(!0),z()&&S()&&S().focus()});var nn=L(e,"ariaValues",8,mA=>"Option ".concat(mA,", selected.")),Si=L(e,"ariaListOpen",8,(mA,FA)=>"You are currently focused on option ".concat(mA,". There are ").concat(FA," results available.")),Li=L(e,"ariaFocused",8,()=>"Select is focused, type to refine list, press down to open the menu."),Zi,bt=EA(null);function on(){clearTimeout(Zi),Zi=setTimeout(()=>{Kt=!1},100)}Dg(()=>{var mA;(mA=c(bt))===null||mA===void 0||mA.remove()});var Kt=!1;function G(mA){mA&&mA.selectable!==!1&&(function(FA){if(FA){Z("");var le=Object.assign({},FA);if(le.groupHeader&&!le.selectable)return;P(b()?P()?P().concat([le]):[le]:P(le)),setTimeout(()=>{PA()&&Ke(),N(xe,void 0),d("change",P()),d("select",FA)})}})(mA)}function dt(mA){Kt||He(mA)}function Ei(mA){if(c(g).filter(le=>!Object.hasOwn(le,"selectable")||le.selectable===!0).length===0)return He(0);mA>0&&He()===c(g).length-1?He(0):mA<0&&He()===0?He(c(g).length-1):He(He()+mA);var FA=c(g)[He()];FA&&FA.selectable===!1&&(mA!==1&&mA!==-1||Ei(mA))}function Qn(mA,FA,le){if(!b())return FA&&FA[le]===mA[le]}var un=Yo,Vn=Yo;function Yo(mA){return{update(FA){FA.scroll&&(on(),mA.scrollIntoView({behavior:"auto",block:"nearest"}))}}}var Bo=EA({strategy:"absolute",placement:"bottom-start",middleware:[P6A(Ot()),q6A(),j6A()],autoUpdate:!1}),[No,Zo,Do]=V6A(c(Bo)),Ba=EA(!0);KA(()=>(K(BA()),K(P())),()=>{BA(),P()&&(function(){if(typeof P()=="string"){var mA=(BA()||[]).find(FA=>FA[rA()]===P());P(mA||{[rA()]:P(),label:P()})}else b()&&Array.isArray(P())&&P().length>0&&P(P().map(FA=>typeof FA=="string"?{value:FA,label:FA}:FA))})()}),KA(()=>(K(Gt()),K(fA())),()=>{!Gt()&&fA()||(N(oA,Object.assign({autocapitalize:"none",autocomplete:"off",autocorrect:"off",spellcheck:!1,tabindex:0,type:"text","aria-autocomplete":"list"},Gt())),m()&&Tl(oA,c(oA).id=m()),fA()||Tl(oA,c(oA).readonly=!0))}),KA(()=>K(b()),()=>{b()&&P()&&(Array.isArray(P())?P([...P()]):P([P()]))}),KA(()=>(c($),K(b())),()=>{c($)&&!b()&&P()&&P(null)}),KA(()=>(K(b()),K(P())),()=>{b()&&P()&&P().length>1&&Qe()}),KA(()=>K(P()),()=>{P()&&(b()?JSON.stringify(P())!==JSON.stringify(c(oi))&&Qe()&&d("input",P()):c(oi)&&JSON.stringify(P()[rA()])===JSON.stringify(c(oi)[rA()])||d("input",P()))}),KA(()=>(K(P()),K(b()),c(oi)),()=>{!P()&&b()&&c(oi)&&d("input",P())}),KA(()=>(K(z()),K(S())),()=>{!z()&&S()&&Ke()}),KA(()=>(K(Z()),c(j)),()=>{Z()!==c(j)&&(uA()||Z().length!==0)&&(uA()?ke()(zt(function*(){ee(!0);var mA=yield f()({dispatch:d,loadOptions:uA(),convertStringItemsToObjects:sA,filterText:Z()});mA?(ee(mA.loading),NA(NA()?mA.listOpen:Z().length>0),z(NA()&&mA.focused),BA(AA()?TA(mA.filteredItems):mA.filteredItems)):(ee(!1),z(!0),NA(!0))}),HA()):(NA(!0),b()&&N(xe,void 0)))}),KA(()=>(K(E()),K(uA()),K(Z()),K(BA()),K(b()),K(P()),K(rA()),K(AA()),K(X()),K(zA()),K(iA())),()=>{N(g,E()({loadOptions:uA(),filterText:Z(),items:BA(),multiple:b(),value:P(),itemId:rA(),groupBy:AA(),label:X(),filterSelectedItems:zA(),itemFilter:iA(),convertStringItemsToObjects:sA,filterGroupedItems:TA}))}),KA(()=>(K(b()),K(NA()),K(P()),c(g)),()=>{!b()&&NA()&&P()&&c(g)&&de(c(g).findIndex(mA=>mA[rA()]===P()[rA()]),!0)}),KA(()=>(K(NA()),K(b())),()=>{NA()&&b()&&He(0)}),KA(()=>K(Z()),()=>{Z()&&He(0)}),KA(()=>K(He()),()=>{var mA;mA=He(),d("hoverItem",mA)}),KA(()=>(K(b()),K(P())),()=>{N(n,b()?P()&&P().length>0:P())}),KA(()=>(c(n),K(Z())),()=>{N(o,c(n)&&Z().length>0)}),KA(()=>(c(n),K(DA()),K(F()),K(ee())),()=>{N(a,c(n)&&DA()&&!F()&&!ee())}),KA(()=>(K(W()),K(b()),K(tA()),K(P())),()=>{var mA;N(r,W()&&b()||b()&&((mA=P())===null||mA===void 0?void 0:mA.length)===0?tA():P()?"":tA())}),KA(()=>(K(P()),K(b())),()=>{var mA,FA;N(s,P()?(mA=b(),FA=void 0,FA=mA&&P().length>0?P().map(le=>le[X()]).join(", "):P()[X()],nn()(FA)):"")}),KA(()=>(c(g),K(He()),K(z()),K(NA())),()=>{N(l,(function(){if(!c(g)||c(g).length===0)return"";var mA=c(g)[He()];if(NA()&&mA){var FA=c(g)?c(g).length:0;return Si()(mA[X()],FA)}return Li()()})((c(g),He(),z(),NA())))}),KA(()=>K(BA()),()=>{(function(mA){mA&&mA.length!==0&&!mA.some(FA=>typeof FA!="object")&&P()&&(b()?!P().some(FA=>!FA||!FA[rA()]):P()[rA()])&&(Array.isArray(P())?P(P().map(FA=>GA(FA)||FA)):P(GA()||P()))})(BA())}),KA(()=>(K(b()),K(P()),K(rA())),()=>{h((b(),P(),rA(),b()?P()?P().map(mA=>mA[rA()]):null:P()?P()[rA()]:P()))}),KA(()=>(K(b()),c(oi),K(P())),()=>{b()||!c(oi)||P()||d("input",P())}),KA(()=>(K(NA()),c(g),K(b()),K(P())),()=>{NA()&&c(g)&&!b()&&!P()&&de()}),KA(()=>c(g),()=>{(function(mA){NA()&&d("filter",mA)})(c(g))}),KA(()=>(K(k()),K(je()),c(Bo)),()=>{k()&&je()&&Do(Object.assign(c(Bo),je()))}),KA(()=>c(bt),()=>{N(C,!!c(bt))}),KA(()=>(c(bt),K(NA())),()=>{(function(mA,FA){if(!mA||!FA)return N(Ba,!0);setTimeout(()=>{N(Ba,!1)},0)})(c(bt),NA())}),KA(()=>(K(NA()),K(k()),c(bt)),()=>{NA()&&k()&&c(bt)&&(function(){var{width:mA}=k().getBoundingClientRect();Tl(bt,c(bt).style.width=ft()?mA+"px":"auto")})()}),KA(()=>K(He()),()=>{N(I,He())}),KA(()=>(K(S()),K(NA()),K(z())),()=>{S()&&NA()&&!z()&&ze()}),KA(()=>(K(k()),K(je())),()=>{var mA;k()&&((mA=je())===null||mA===void 0?void 0:mA.autoUpdate)===void 0&&Tl(Bo,c(Bo).autoUpdate=!0)}),Rn();var Xo={getFilteredItems:YA,handleClear:hn};ni();var ra,yo=I8A();fe("click",NC,function(mA){var FA;NA()||z()||!k()||k().contains(mA.target)||(FA=c(bt))!==null&&FA!==void 0&&FA.contains(mA.target)||Oe()}),fe("keydown",NC,tt);var ge=dA(yo),mi=mA=>{var FA,le=i8A(),Ne=dA(le),nt=Xt=>{var Ji=Fi();Ia(et(Ji),e,"list-prepend",{},null),CA(Xt,Ji)};jA(Ne,Xt=>{wA(()=>A["list-prepend"])&&Xt(nt)});var rt=_A(Ne,2),xt=Xt=>{var Ji=Fi();Ia(et(Ji),e,"list",{get filteredItems(){return c(g)}},null),CA(Xt,Ji)},On=Xt=>{var Ji=Fi(),va=et(Ji),Ut=Oi=>{var Xi=Fi();da(et(Xi),1,()=>c(g),ka,(Wn,pn,_t)=>{var sa,zo=e8A(),D=dA(zo);Ia(dA(D),e,"item",{get item(){return c(pn)},index:_t},M=>{var R=dr();Se(()=>Lt(R,(c(pn),K(X()),wA(()=>{var V;return(V=c(pn))===null||V===void 0?void 0:V[X()]})))),CA(M,R)}),ms(D,(M,R)=>un?.(M),()=>({scroll:Qn(c(pn),P(),rA()),listDom:c(C)})),ms(D,(M,R)=>Vn?.(M),()=>({scroll:c(I)===_t,listDom:c(C)})),Se(M=>sa=ii(D,1,"item svelte-1ul7oo4",null,sa,M),[()=>{var M,R;return{"list-group-title":c(pn).groupHeader,active:Qn(c(pn),P(),rA()),first:(R=_t,R===0),hover:He()===_t,"group-item":c(pn).groupItem,"not-selectable":((M=c(pn))===null||M===void 0?void 0:M.selectable)===!1}}]),fe("mouseover",zo,()=>dt(_t)),fe("focus",zo,()=>dt(_t)),fe("click",zo,vC(()=>(function(M){var{item:R,i:V}=M;if(R?.selectable!==!1)return P()&&!b()&&P()[rA()]===R[rA()]?Ke():void((function(_){return _.groupHeader&&_.selectable||_.selectable||!_.hasOwnProperty("selectable")})(R)&&(He(V),G(R)))})({item:c(pn),i:_t}))),fe("keydown",zo,gI(vC(function(M){yf.call(this,e,M)}))),CA(Wn,zo)}),CA(Oi,Xi)},st=Oi=>{var Xi=Fi(),Wn=et(Xi),pn=_t=>{var sa=Fi();Ia(et(sa),e,"empty",{},zo=>{CA(zo,t8A())}),CA(_t,sa)};jA(Wn,_t=>{vA()||_t(pn)},!0),CA(Oi,Xi)};jA(va,Oi=>{c(g),wA(()=>c(g).length>0)?Oi(Ut):Oi(st,!1)},!0),CA(Xt,Ji)};jA(rt,Xt=>{wA(()=>A.list)?Xt(xt):Xt(On,!1)});var Ti=_A(rt,2),zi=Xt=>{var Ji=Fi();Ia(et(Ji),e,"list-append",{},null),CA(Xt,Ji)};jA(Ti,Xt=>{wA(()=>A["list-append"])&&Xt(zi)}),ms(le,Xt=>Zo?.(Xt)),Oo(le,Xt=>N(bt,Xt),()=>c(bt)),_r(()=>fe("scroll",le,on)),_r(()=>fe("pointerup",le,gI(vC(function(Xt){yf.call(this,e,Xt)})))),_r(()=>fe("mousedown",le,gI(vC(function(Xt){yf.call(this,e,Xt)})))),Se(()=>FA=ii(le,1,"svelte-select-list svelte-1ul7oo4",null,FA,{prefloat:c(Ba)})),CA(mA,le)};jA(ge,mA=>{NA()&&mA(mi)});var cn=_A(ge,2),fn=dA(cn),Ho=mA=>{var FA=n8A(),le=et(FA),Ne=dA(le),nt=dA(_A(le,2));Se(()=>{Lt(Ne,c(s)),Lt(nt,c(l))}),CA(mA,FA)};jA(fn,mA=>{z()&&mA(Ho)});var ya=_A(cn,2);Ia(dA(ya),e,"prepend",{},null);var _i=_A(ya,2),Eo=dA(_i),Za=mA=>{var FA=Fi(),le=et(FA),Ne=rt=>{var xt=Fi();da(et(xt),1,P,ka,(On,Ti,zi)=>{var Xt,Ji=a8A(),va=dA(Ji);Ia(dA(va),e,"selection",{get selection(){return c(Ti)},index:zi},Oi=>{var Xi=dr();Se(()=>Lt(Xi,(c(Ti),K(X()),wA(()=>c(Ti)[X()])))),CA(Oi,Xi)});var Ut=_A(va,2),st=Oi=>{var Xi=o8A();Ia(dA(Xi),e,"multi-clear-icon",{},Wn=>{K_(Wn)}),fe("pointerup",Xi,gI(vC(()=>OA(zi)))),CA(Oi,Xi)};jA(Ut,Oi=>{F()||x()||!K_||Oi(st)}),Se(()=>Xt=ii(Ji,1,"multi-item svelte-1ul7oo4",null,Xt,{active:c(xe)===zi,disabled:F()})),fe("click",Ji,gI(()=>x()?OA(zi):{})),fe("keydown",Ji,gI(vC(function(Oi){yf.call(this,e,Oi)}))),CA(On,Ji)}),CA(rt,xt)},nt=rt=>{var xt,On=r8A();Ia(dA(On),e,"selection",{get selection(){return P()}},Ti=>{var zi=dr();Se(()=>Lt(zi,(K(P()),K(X()),wA(()=>P()[X()])))),CA(Ti,zi)}),Se(()=>xt=ii(On,1,"selected-item svelte-1ul7oo4",null,xt,{"hide-selected-item":c(o)})),CA(rt,On)};jA(le,rt=>{b()?rt(Ne):rt(nt,!1)}),CA(mA,FA)};jA(Eo,mA=>{c(n)&&mA(Za)});var vo=_A(Eo,2);AD(vo,()=>Me(Me({readOnly:!fA()},c(oA)),{},{placeholder:c(r),style:XA(),disabled:F()}),void 0,void 0,void 0,"svelte-1ul7oo4",!0),Oo(vo,mA=>S(mA),()=>S());var Ta=_A(_i,2),Jn=dA(Ta),Ui=mA=>{var FA=s8A();Ia(dA(FA),e,"loading-icon",{},le=>{(function(Ne){CA(Ne,A8A())})(le)}),CA(mA,FA)};jA(Jn,mA=>{ee()&&mA(Ui)});var qt=_A(Jn,2),Nn=mA=>{var FA=l8A();Ia(dA(FA),e,"clear-icon",{},le=>{K_(le)}),fe("click",FA,hn),CA(mA,FA)};jA(qt,mA=>{c(a)&&mA(Nn)});var ho=_A(qt,2),Fo=mA=>{var FA=g8A();Ia(dA(FA),e,"chevron-icon",{get listOpen(){return NA()}},le=>{(function(Ne){CA(Ne,X6A())})(le)}),CA(mA,FA)};jA(ho,mA=>{he()&&mA(Fo)});var xA=_A(Ta,2);Ia(xA,e,"input-hidden",{get value(){return P()}},mA=>{var FA=c8A();Se(le=>{_n(FA,"name",v()),Dd(FA,le)},[()=>(K(P()),wA(()=>P()?JSON.stringify(P()):null))]),CA(mA,FA)});var Ae=_A(xA,2),De=mA=>{var FA=Fi();Ia(et(FA),e,"required",{get value(){return P()}},le=>{CA(le,C8A())}),CA(mA,FA)};return jA(Ae,mA=>{K(pA()),K(P()),wA(()=>pA()&&(!P()||P().length===0))&&mA(De)}),_r(()=>fe("pointerup",yo,gI(gn))),Oo(yo,mA=>k(mA),()=>k()),ms(yo,mA=>No?.(mA)),Se(()=>{var mA;ra=ii(yo,1,"svelte-select ".concat((mA=pt())!==null&&mA!==void 0?mA:""),"svelte-1ul7oo4",ra,{multi:b(),disabled:F(),focused:z(),"list-open":NA(),"show-chevron":he(),error:$A()}),mg(yo,UA())}),fe("keydown",vo,tt),fe("blur",vo,Oe),fe("focus",vo,ze),lD(vo,Z),CA(t,yo),jt(e,"getFilteredItems",YA),jt(e,"handleClear",hn),Ft(Xo)}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +table.jse-transform-wizard.svelte-9wqi8y { + border-collapse: collapse; + border-spacing: 0; + width: 100%; +} +table.jse-transform-wizard.svelte-9wqi8y input:where(.svelte-9wqi8y) { + font-family: inherit; + font-size: inherit; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) th:where(.svelte-9wqi8y) { + font-weight: normal; + text-align: left; + width: 60px; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) { + width: 100%; + display: flex; + flex-direction: row; + margin-bottom: calc(0.5 * var(--jse-padding, 10px)); +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select .multi-item { + align-items: center; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select .value-container { + gap: 0 !important; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-filter-path { + flex: 4; + margin-right: calc(0.5 * var(--jse-padding, 10px)); +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-filter-relation { + flex: 1.5; + margin-right: calc(0.5 * var(--jse-padding, 10px)); +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-sort-path { + flex: 3; + margin-right: calc(0.5 * var(--jse-padding, 10px)); +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-sort-direction { + flex: 1; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-projection-paths { + flex: 1; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select input { + box-sizing: border-box; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .jse-filter-value:where(.svelte-9wqi8y) { + flex: 4; + padding: 4px 8px; + border: var(--jse-input-border, 1px solid #d8dbdf); + border-radius: var(--jse-input-radius, 3px); + outline: none; + background: var(--jse-input-background, var(--jse-background-color, #fff)); + color: inherit; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .jse-filter-value:where(.svelte-9wqi8y):focus { + border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); +}`);var d8A=JA('
      Filter
      Sort
      Pick
      ');function B8A(t,e){var A,i,n,o,a;Nt(e,!1);var r=EA(void 0,!0),s=EA(void 0,!0),l=EA(void 0,!0),g=EA(void 0,!0),C=EA(void 0,!0),I=EA(void 0,!0),d=or("jsoneditor:TransformWizard"),h=L(e,"json",9),E=L(e,"queryOptions",29,()=>({})),f=L(e,"onChange",9),m=["==","!=","<","<=",">",">="].map(zA=>({value:zA,label:zA})),v=[{value:"asc",label:"ascending"},{value:"desc",label:"descending"}],k=EA((A=E())!==null&&A!==void 0&&(A=A.filter)!==null&&A!==void 0&&A.path?BI(E().filter.path):void 0,!0),S=EA((i=m.find(zA=>{var pA;return zA.value===((pA=E().filter)===null||pA===void 0?void 0:pA.relation)}))!==null&&i!==void 0?i:m[0],!0),b=EA(((n=E())===null||n===void 0||(n=n.filter)===null||n===void 0?void 0:n.value)||"",!0),x=EA((o=E())!==null&&o!==void 0&&(o=o.sort)!==null&&o!==void 0&&o.path?BI(E().sort.path):void 0,!0),F=EA((a=v.find(zA=>{var pA;return zA.value===((pA=E().sort)===null||pA===void 0?void 0:pA.direction)}))!==null&&a!==void 0?a:v[0],!0);KA(()=>K(h()),()=>{N(r,Array.isArray(h()))}),KA(()=>(c(r),K(h())),()=>{N(s,c(r)?AR(h()):[])}),KA(()=>(c(r),K(h())),()=>{N(l,c(r)?AR(h(),!0):[])}),KA(()=>(c(s),BI),()=>{N(g,c(s).map(BI))}),KA(()=>(c(l),BI),()=>{N(C,c(l)?c(l).map(BI):[])}),KA(()=>(K(E()),c(C),Mi),()=>{var zA;N(I,(zA=E())!==null&&zA!==void 0&&(zA=zA.projection)!==null&&zA!==void 0&&zA.paths&&c(C)?E().projection.paths.map(pA=>c(C).find(PA=>Mi(PA.value,pA))).filter(pA=>!!pA):void 0)}),KA(()=>c(k),()=>{var zA,pA,PA;pA=(zA=c(k))===null||zA===void 0?void 0:zA.value,Mi((PA=E())===null||PA===void 0||(PA=PA.filter)===null||PA===void 0?void 0:PA.path,pA)||(d("changeFilterPath",pA),E(Hr(E(),["filter","path"],pA,!0)),f()(E()))}),KA(()=>c(S),()=>{var zA,pA,PA;pA=(zA=c(S))===null||zA===void 0?void 0:zA.value,Mi((PA=E())===null||PA===void 0||(PA=PA.filter)===null||PA===void 0?void 0:PA.relation,pA)||(d("changeFilterRelation",pA),E(Hr(E(),["filter","relation"],pA,!0)),f()(E()))}),KA(()=>c(b),()=>{var zA,pA;zA=c(b),Mi((pA=E())===null||pA===void 0||(pA=pA.filter)===null||pA===void 0?void 0:pA.value,zA)||(d("changeFilterValue",zA),E(Hr(E(),["filter","value"],zA,!0)),f()(E()))}),KA(()=>c(x),()=>{var zA,pA,PA;pA=(zA=c(x))===null||zA===void 0?void 0:zA.value,Mi((PA=E())===null||PA===void 0||(PA=PA.sort)===null||PA===void 0?void 0:PA.path,pA)||(d("changeSortPath",pA),E(Hr(E(),["sort","path"],pA,!0)),f()(E()))}),KA(()=>c(F),()=>{var zA,pA,PA;pA=(zA=c(F))===null||zA===void 0?void 0:zA.value,Mi((PA=E())===null||PA===void 0||(PA=PA.sort)===null||PA===void 0?void 0:PA.direction,pA)||(d("changeSortDirection",pA),E(Hr(E(),["sort","direction"],pA,!0)),f()(E()))}),KA(()=>c(I),()=>{(function(zA){var pA;Mi((pA=E())===null||pA===void 0||(pA=pA.projection)===null||pA===void 0?void 0:pA.paths,zA)||(d("changeProjectionPaths",zA),E(Hr(E(),["projection","paths"],zA,!0)),f()(E()))})(c(I)?c(I).map(zA=>zA.value):void 0)}),Rn(),ni(!0);var z=d8A(),P=dA(z),Z=dA(P),tA=_A(dA(Z)),W=dA(tA),BA=dA(W);Cd(BA,{class:"jse-filter-path",showChevron:!0,get items(){return c(g)},get value(){return c(k)},set value(zA){N(k,zA)},$$legacy:!0});var X=_A(BA,2);Cd(X,{class:"jse-filter-relation",showChevron:!0,clearable:!1,get items(){return m},get value(){return c(S)},set value(zA){N(S,zA)},$$legacy:!0});var iA=_A(X,2),AA=_A(Z),IA=_A(dA(AA)),aA=dA(IA),rA=dA(aA);Cd(rA,{class:"jse-sort-path",showChevron:!0,get items(){return c(g)},get value(){return c(x)},set value(zA){N(x,zA)},$$legacy:!0}),Cd(_A(rA,2),{class:"jse-sort-direction",showChevron:!0,clearable:!1,get items(){return v},get value(){return c(F)},set value(zA){N(F,zA)},$$legacy:!0});var uA=_A(AA),UA=_A(dA(uA)),$A=dA(UA);Cd(dA($A),{class:"jse-projection-paths",multiple:!0,showChevron:!0,get items(){return c(C)},get value(){return c(I)},set value(zA){N(I,zA)},$$legacy:!0}),lD(iA,()=>c(b),zA=>N(b,zA)),CA(t,z),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-select-query-language.svelte-jrd4q2 { + position: relative; + width: 32px; +} +.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) { + position: absolute; + top: 0; + right: 0; + display: flex; + flex-direction: column; + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); +} +.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) .jse-query-language:where(.svelte-jrd4q2) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + text-align: left; + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + white-space: nowrap; + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); + background: var(--jse-context-menu-background, #656565); +} +.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) .jse-query-language:where(.svelte-jrd4q2):hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +}`);var E8A=JA(''),h8A=JA('
      ');function Q8A(t,e){Nt(e,!1);var A=L(e,"queryLanguages",8),i=L(e,"queryLanguageId",12),n=L(e,"onChangeQueryLanguage",8);ni();var o=h8A();da(dA(o),5,A,ka,(a,r)=>{var s,l=E8A(),g=dA(l),C=h=>{tn(h,{get data(){return j9}})},I=h=>{tn(h,{get data(){return q9}})};jA(g,h=>{c(r),K(i()),wA(()=>c(r).id===i())?h(C):h(I,!1)});var d=_A(g);Se(()=>{var h;s=ii(l,1,"jse-query-language svelte-jrd4q2",null,s,{selected:c(r).id===i()}),_n(l,"title",(c(r),wA(()=>"Select ".concat(c(r).name," as query language")))),Lt(d," ".concat((c(r),(h=wA(()=>c(r).name))!==null&&h!==void 0?h:"")))}),fe("click",l,()=>{return h=c(r).id,i(h),void n()(h);var h}),CA(a,l)}),CA(t,o),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-header.svelte-1k211ye { + display: flex; + background: var(--jse-theme-color, #3883fa); + color: var(--jse-menu-color, var(--jse-text-color-inverse, #fff)); +} +.jse-header.svelte-1k211ye .jse-title:where(.svelte-1k211ye) { + flex: 1; + padding: 5px; + vertical-align: middle; +} +.jse-header.svelte-1k211ye button:where(.svelte-1k211ye) { + border: none; + background: transparent; + min-width: 32px; + color: inherit; + cursor: pointer; +} +.jse-header.svelte-1k211ye button:where(.svelte-1k211ye):hover { + background: rgba(255, 255, 255, 0.1); +}`);var u8A=JA(''),f8A=JA('
      ');function wD(t,e){Nt(e,!1);var A=L(e,"title",9,"Modal"),i=L(e,"fullScreenButton",9,!1),n=L(e,"fullscreen",13,!1),o=L(e,"onClose",9,void 0);ni(!0);var a=f8A(),r=dA(a),s=dA(r),l=_A(r,2);Ia(l,e,"actions",{},null);var g=_A(l,2),C=d=>{var h=u8A(),E=dA(h),f=it(()=>n()?kz:yz);tn(E,{get data(){return c(f)}}),fe("click",h,()=>n(!n())),CA(d,h)};jA(g,d=>{i()&&d(C)});var I=_A(g,2);tn(dA(I),{get data(){return D4}}),Se(()=>Lt(s,A())),fe("click",I,()=>{var d;return(d=o())===null||d===void 0?void 0:d()}),CA(t,a),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-config.svelte-5gkegr { + border: none; + background: transparent; + min-width: 32px; + color: inherit; + cursor: pointer; +} +.jse-config.svelte-5gkegr:hover { + background: rgba(255, 255, 255, 0.1); +} +.jse-config.hide.svelte-5gkegr { + display: none; +}`);var p8A=JA(''),U_=or("jsoneditor:AutoScrollHandler");function RZ(t){var e,A;function i(r){return r<20?200:r<50?400:1200}function n(){if(t){var r=.05*(e||0);t.scrollTop+=r}}function o(r){A&&r===e||(a(),U_("startAutoScroll",r),e=r,A=setInterval(n,50))}function a(){A&&(U_("stopAutoScroll"),clearInterval(A),A=void 0,e=void 0)}return U_("createAutoScrollHandler",t),{onDrag:function(r){if(t){var s=r.clientY,{top:l,bottom:g}=t.getBoundingClientRect();sg?o(i(s-g)):a()}},onDragEnd:function(){a()}}}var m8A=(t,e,A,i)=>(t/=i/2)<1?A/2*t*t+e:-A/2*(--t*(t-2)-1)+e,R$=()=>{var t,e,A,i,n,o,a,r,s,l,g,C,I;function d(f){return f.getBoundingClientRect().top-(t.getBoundingClientRect?t.getBoundingClientRect().top:0)+A}function h(f){t.scrollTo?t.scrollTo(t.scrollLeft,f):t.scrollTop=f}function E(f){l||(l=f),h(o(g=f-l,A,r,s)),I=!0,g1&&arguments[1]!==void 0?arguments[1]:{};switch(s=1e3,n=m.offset||0,C=m.callback,o=m.easing||m8A,a=m.a11y||!1,typeof m.container){case"object":t=m.container;break;case"string":t=document.querySelector(m.container);break;default:t=window.document.documentElement}switch(A=t.scrollTop,typeof f){case"number":e=void 0,a=!1,i=A+f;break;case"object":i=d(e=f);break;case"string":e=document.querySelector(f),i=d(e)}switch(r=i-A+n,typeof m.duration){case"number":s=m.duration;break;case"function":s=m.duration(r)}I?l=0:requestAnimationFrame(E)}};function vh(t,e){var A=Date.now(),i=t();return e(Date.now()-A),i}var fh=or("validation"),w8A={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function NZ(t,e,A,i){return OR(t,e,A,i,w8A)}function N$(t,e,A,i){if(fh("validateJSON"),!e)return[];if(A!==i){var n=A.stringify(t);return e(n!==void 0?i.parse(n):void 0)}return e(t)}function D8A(t,e,A,i){if(fh("validateText"),t.length>104857600)return{validationErrors:[{path:[],message:"Validation turned off: the document is too large",severity:hc.info}]};if(t.length!==0)try{var n=vh(()=>A.parse(t),s=>fh("validate: parsed json in ".concat(s," ms")));if(!e)return;var o=A===i?n:vh(()=>i.parse(t),s=>fh("validate: parsed json with the validationParser in ".concat(s," ms"))),a=vh(()=>e(o),s=>fh("validate: validated json in ".concat(s," ms")));return en(a)?void 0:{validationErrors:a}}catch(s){var r=vh(()=>(function(l,g){if(l.length>A6A)return!1;try{return g.parse(ag(l)),!0}catch(C){return!1}})(t,A),l=>fh("validate: checked whether repairable in ".concat(l," ms")));return{parseError:Th(t,s.message||s.toString()),isRepairable:r}}}var z5=or("jsoneditor:FocusTracker");function qR(t){var e,{onMount:A,onDestroy:i,getWindow:n,hasFocus:o,onFocus:a,onBlur:r}=t,s=!1;function l(){var C=o();C&&(clearTimeout(e),s||(z5("focus"),a(),s=C))}function g(){s&&(clearTimeout(e),e=setTimeout(()=>{o()||(z5("blur"),s=!1,r())}))}A(()=>{z5("mount FocusTracker");var C=n();C&&(C.addEventListener("focusin",l,!0),C.addEventListener("focusout",g,!0))}),i(()=>{z5("destroy FocusTracker");var C=n();C&&(C.removeEventListener("focusin",l,!0),C.removeEventListener("focusout",g,!0))})}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-message.svelte-cbvd26 { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + padding: var(--jse-padding, 10px); + display: flex; + gap: var(--jse-padding, 10px); + flex-wrap: wrap; + align-items: stretch; +} +.jse-message.jse-success.svelte-cbvd26 { + background: var(--message-success-background, #9ac45d); + color: var(--jse-message-success-color, #fff); +} +.jse-message.svelte-cbvd26 .jse-text:where(.svelte-cbvd26) { + display: flex; + flex: 1; + min-width: 60%; + align-items: center; +} +.jse-message.svelte-cbvd26 .jse-text.jse-clickable:where(.svelte-cbvd26) { + cursor: pointer; +} +.jse-message.svelte-cbvd26 .jse-text.jse-clickable:where(.svelte-cbvd26):hover { + background-color: rgba(255, 255, 255, 0.1); +} +.jse-message.jse-error.svelte-cbvd26 { + background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); + color: var(--jse-message-error-color, #fff); +} +.jse-message.jse-warning.svelte-cbvd26 { + background: var(--jse-message-warning-background, #ffde5c); + color: var(--jse-message-warning-color, #4d4d4d); +} +.jse-message.jse-info.svelte-cbvd26 { + background: var(--jse-message-info-background, #4f91ff); + color: var(--jse-message-info-color, #fff); +} +.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) { + display: flex; + gap: var(--jse-padding, 10px); +} +.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) button.jse-action:where(.svelte-cbvd26) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-message-action-background, rgba(255, 255, 255, 0.2)); + color: inherit; + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); +} +.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) button.jse-action:where(.svelte-cbvd26):hover { + background: var(--jse-message-action-background-highlight, rgba(255, 255, 255, 0.3)); +}`);var y8A=JA(''),v8A=JA('
      ');function Yl(t,e){Nt(e,!1);var A=L(e,"type",9,"success"),i=L(e,"icon",9,void 0),n=L(e,"message",9,void 0),o=L(e,"actions",25,()=>[]),a=L(e,"onClick",9,void 0),r=L(e,"onClose",9,void 0);r()&&Dg(r()),ni(!0);var s,l=v8A(),g=dA(l),C=dA(g),I=dA(C),d=E=>{tn(E,{get data(){return i()}})};jA(I,E=>{i()&&E(d)});var h=_A(I);da(_A(g,2),5,o,ka,(E,f)=>{var m=y8A(),v=dA(m),k=b=>{tn(b,{get data(){return c(f),wA(()=>c(f).icon)}})};jA(v,b=>{c(f),wA(()=>c(f).icon)&&b(k)});var S=_A(v);Se(()=>{var b;_n(m,"title",(c(f),wA(()=>c(f).title))),m.disabled=(c(f),wA(()=>c(f).disabled)),Lt(S," ".concat((c(f),(b=wA(()=>c(f).text))!==null&&b!==void 0?b:"")))}),fe("click",m,()=>{c(f).onClick&&c(f).onClick()}),fe("mousedown",m,()=>{c(f).onMouseDown&&c(f).onMouseDown()}),CA(E,m)}),Se(()=>{var E,f;ii(l,1,"jse-message jse-".concat((E=A())!==null&&E!==void 0?E:""),"svelte-cbvd26"),s=ii(g,1,"jse-text svelte-cbvd26",null,s,{"jse-clickable":!!a()}),Lt(h," ".concat((f=n())!==null&&f!==void 0?f:""))}),fe("click",g,function(){a()&&a()()}),CA(t,l),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-validation-errors-overview.svelte-1342rh4 { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + overflow: auto; + max-height: 25%; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) { + border-collapse: collapse; + width: 100%; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) { + cursor: pointer; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-error:where(.svelte-1342rh4) { + background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); + color: var(--jse-message-error-color, #fff); +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-warning:where(.svelte-1342rh4) { + background: var(--jse-message-warning-background, #ffde5c); + color: var(--jse-message-warning-color, #4d4d4d); +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-warning:where(.svelte-1342rh4):hover { + filter: brightness(105%); +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-info:where(.svelte-1342rh4) { + background: var(--jse-message-info-background, #4f91ff); + color: var(--jse-message-info-color, #fff); +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4):hover { + filter: brightness(110%); +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td:where(.svelte-1342rh4) { + padding: 4px var(--jse-padding, 10px); + vertical-align: middle; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-icon:where(.svelte-1342rh4) { + width: 36px; + box-sizing: border-box; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) { + width: 36px; + box-sizing: border-box; + padding: 0; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) button.jse-validation-errors-collapse:where(.svelte-1342rh4) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + width: 36px; + height: 26px; + cursor: pointer; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) button.jse-validation-errors-collapse:where(.svelte-1342rh4):hover { + background-color: rgba(255, 255, 255, 0.2); +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td:where(.svelte-1342rh4) div.jse-validation-errors-expand:where(.svelte-1342rh4) { + display: inline-block; + position: relative; + top: 3px; +}`);var b8A=JA(''),M8A=JA(' '),S8A=JA(' '),k8A=JA('
      '),x8A=JA('
      '),_8A=JA('
      ');function VR(t,e){Nt(e,!1);var A=EA(void 0,!0),i=L(e,"validationErrors",9),n=L(e,"selectError",9),o=EA(!0,!0);function a(){N(o,!1)}function r(){N(o,!0)}KA(()=>K(i()),()=>{N(A,i().length)}),Rn(),ni(!0);var s=Fi(),l=et(s),g=C=>{var I=_8A(),d=dA(I),h=f=>{var m=k8A(),v=dA(m),k=dA(v);da(k,1,()=>(K(gD),K(i()),K(U5),wA(()=>gD(i(),U5))),ka,(x,F,z)=>{var P=M8A(),Z=dA(P);tn(dA(Z),{get data(){return z2}});var tA=_A(Z),W=dA(tA),BA=_A(tA),X=dA(BA),iA=dA(_A(BA)),AA=IA=>{var aA=b8A();tn(dA(aA),{get data(){return Sz}}),fe("click",aA,vC(a)),CA(IA,aA)};jA(iA,IA=>{K(i()),wA(()=>z===0&&i().length>1)&&IA(AA)}),Se(IA=>{var aA;ii(P,1,"jse-validation-".concat((c(F),(aA=wA(()=>c(F).severity))!==null&&aA!==void 0?aA:"")),"svelte-1342rh4"),Lt(W,IA),Lt(X,(c(F),wA(()=>c(F).message)))},[()=>(K(Bl),c(F),wA(()=>Bl(c(F).path)))]),fe("click",P,()=>{setTimeout(()=>n()(c(F)))}),CA(x,P)});var S=_A(k),b=x=>{var F=S8A(),z=_A(dA(F),2),P=dA(z);Se(()=>Lt(P,"(and ".concat(c(A)-U5," more errors)"))),CA(x,F)};jA(S,x=>{c(A)>U5&&x(b)}),CA(f,m)},E=f=>{var m=x8A(),v=dA(m),k=dA(v),S=dA(k);tn(dA(S),{get data(){return z2}});var b=dA(_A(S));tn(dA(_A(b)),{get data(){return $9}}),Se(x=>{var F;ii(k,1,"jse-validation-".concat(x??""),"svelte-1342rh4"),Lt(b,"".concat((F=c(A))!==null&&F!==void 0?F:""," validation errors "))},[()=>(K(i()),wA(()=>{return x=i(),[hc.error,hc.warning,hc.info].find(F=>x.some(z=>z.severity===F));var x}))]),fe("click",k,r),CA(f,m)};jA(d,f=>{c(o)||c(A)===1?f(h):f(E,!1)}),CA(C,I)};jA(l,C=>{K(en),K(i()),wA(()=>!en(i()))&&C(g)}),CA(t,s),Ft()}function DD(t,e){if(t)return t.addEventListener("keydown",A),{destroy(){t.removeEventListener("keydown",A)}};function A(i){i.key==="Escape"&&(i.preventDefault(),i.stopPropagation(),e())}}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +dialog.jse-modal.svelte-2aoco4 { + border-radius: 3px; + font-size: var(--jse-padding, 10px); + border: none; + padding: 0; + display: flex; + min-width: 0; + margin: auto; + overflow: visible; + transition: width 0.1s ease-in-out, height 0.1s ease-in-out; +} +dialog.jse-modal.jse-sort-modal.svelte-2aoco4 { + width: 400px; +} +dialog.jse-modal.jse-repair-modal.svelte-2aoco4 { + width: 600px; + height: 500px; +} +dialog.jse-modal.jse-jsoneditor-modal.svelte-2aoco4 { + width: 800px; + height: 600px; +} +dialog.jse-modal.jse-transform-modal.svelte-2aoco4 { + width: 1200px; + height: 800px; +} +dialog.jse-modal.jse-fullscreen.svelte-2aoco4 { + width: 100%; + height: 100%; +} +dialog.jse-modal.svelte-2aoco4::backdrop { + background: var(--jse-overlay-background, rgba(0, 0, 0, 0.3)); +} +dialog.jse-modal[open].svelte-2aoco4 { + animation: svelte-2aoco4-zoom 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); +} +dialog.jse-modal[open].svelte-2aoco4::backdrop { + animation: svelte-2aoco4-fade 0.2s ease-out; +} +dialog.jse-modal.svelte-2aoco4 .jse-modal-inner:where(.svelte-2aoco4) { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; + min-height: 0; + padding: 0; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + line-height: normal; + background: var(--jse-modal-background, #f5f5f5); + color: var(--jse-text-color, #4d4d4d); +} +@keyframes svelte-2aoco4-zoom { + from { + transform: scale(0.95); + } + to { + transform: scale(1); + } +} +@keyframes svelte-2aoco4-fade { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +dialog.jse-modal.svelte-2aoco4 .svelte-select { + --border: var(--jse-svelte-select-border, 1px solid #d8dbdf); + --item-is-active-bg: var(--jse-item-is-active-bg, #3883fa); + --border-radius: var(--jse-svelte-select-border-radius, 3px); + --background: var(--jse-svelte-select-background, #fff); + --padding: var(--jse-svelte-select-padding, 0 10px); + --multi-select-padding: var(--jse-svelte-select-multi-select-padding, 0 10px); + --font-size: var(--jse-svelte-select-font-size, var(--jse-font-size, 16px)); + --height: 36px; + --multi-item-height: 28px; + --multi-item-margin: 2px; + --multi-item-padding: 2px 8px; + --multi-item-border-radius: 6px; + --indicator-top: 8px; +}`);var R8A=JA('
      ');function Of(t,e){Nt(e,!1);var A=L(e,"className",8,void 0),i=L(e,"fullscreen",8,!1),n=L(e,"onClose",8),o=EA();function a(){n()()}As(()=>c(o).showModal()),Dg(()=>c(o).close()),ni();var r,s=R8A(),l=dA(s);Ia(dA(l),e,"default",{},null),Oo(s,g=>N(o,g),()=>c(o)),_r(()=>fe("close",s,a)),_r(()=>{return fe("pointerdown",s,(g=a,function(){for(var C=arguments.length,I=new Array(C),d=0;dfe("cancel",s,gI(function(g){yf.call(this,e,g)}))),ms(s,(g,C)=>DD?.(g,C),()=>a),Se(g=>r=ii(s,1,g,"svelte-2aoco4",r,{"jse-fullscreen":i()}),[()=>bI((K(wc),K(A()),wA(()=>wc("jse-modal",A()))))]),CA(t,s),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-modal-contents.svelte-10a6ob6 { + flex: 1; + display: flex; + flex-direction: column; + padding: 20px; + overflow: auto; + min-width: 0; + min-height: 0; +} +.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding-top: var(--jse-padding, 10px); +} +.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} + +.jse-shortcuts.svelte-10a6ob6 { + display: flex; + flex-wrap: wrap; + justify-content: space-around; + margin: calc(2 * var(--jse-padding, 10px)) 0; +} +.jse-shortcuts.svelte-10a6ob6 .jse-shortcut:where(.svelte-10a6ob6) .jse-key:where(.svelte-10a6ob6) { + font-size: 200%; + color: var(--jse-theme-color, #3883fa); +}`);var N8A=JA('
      Clipboard permission is disabled by your browser. You can use:
      for copy
      for cut
      for paste
      ',1);function F$(t,e){Nt(e,!1);var A=L(e,"onClose",9),i=NR()?"\u2318":"Ctrl";ni(!0),Of(t,{get onClose(){return A()},className:"jse-copy-paste",children:(n,o)=>{var a=N8A(),r=et(a);wD(r,{title:"Copying and pasting",get onClose(){return A()}});var s=_A(r,2),l=_A(dA(s),2),g=dA(l),C=dA(g),I=dA(C),d=_A(g,2),h=dA(d),E=dA(h),f=dA(_A(d,2)),m=dA(f),v=dA(_A(l,2));Se(()=>{Lt(I,"".concat(i,"+C")),Lt(E,"".concat(i,"+X")),Lt(m,"".concat(i,"+V"))}),fe("click",v,function(){for(var k,S=arguments.length,b=new Array(S),x=0;x'),L8A=JA('
      '),G8A=JA(''),K8A=JA('
      ');function KD(t,e){Nt(e,!1);var A=L(e,"items",25,()=>[]);ni(!0);var i=K8A(),n=dA(i);Ia(n,e,"left",{},null);var o=_A(n,2);da(o,1,A,ka,(a,r)=>{var s=Fi(),l=et(s),g=I=>{CA(I,F8A())},C=I=>{var d=Fi(),h=et(d),E=m=>{CA(m,L8A())},f=m=>{var v=Fi(),k=et(v),S=x=>{var F=G8A(),z=dA(F),P=W=>{tn(W,{get data(){return c(r),wA(()=>c(r).icon)}})};jA(z,W=>{c(r),wA(()=>c(r).icon)&&W(P)});var Z=_A(z,2),tA=W=>{var BA=dr();Se(()=>Lt(BA,(c(r),wA(()=>c(r).text)))),CA(W,BA)};jA(Z,W=>{c(r),wA(()=>c(r).text)&&W(tA)}),Se(()=>{var W;ii(F,1,"jse-button ".concat((c(r),(W=wA(()=>c(r).className))!==null&&W!==void 0?W:"")),"svelte-3erbu0"),_n(F,"title",(c(r),wA(()=>c(r).title))),F.disabled=(c(r),wA(()=>c(r).disabled||!1))}),fe("click",F,function(){for(var W,BA=arguments.length,X=new Array(BA),iA=0;iA{var F=dr();Se(z=>Lt(F,z),[()=>(c(r),wA(()=>(function(z){return console.error("Unknown type of menu item",z),"???"})(c(r))))]),CA(x,F)};jA(k,x=>{K(bC),c(r),wA(()=>bC(c(r)))?x(S):x(b,!1)},!0),CA(m,v)};jA(h,m=>{K(nR),c(r),wA(()=>nR(c(r)))?m(E):m(f,!1)},!0),CA(I,d)};jA(l,I=>{K(dI),c(r),wA(()=>dI(c(r)))?I(g):I(C,!1)}),CA(a,s)}),Ia(_A(o,2),e,"right",{},null),CA(t,i),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-json-repair-component.svelte-16jv58j { + flex: 1; + display: flex; + flex-direction: column; + background: var(--jse-background-color, #fff); + color: var(--jse-text-color, #4d4d4d); +} +.jse-json-repair-component.svelte-16jv58j .jse-info:where(.svelte-16jv58j) { + padding: calc(0.5 * var(--jse-padding, 10px)); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + vertical-align: center; +} +.jse-json-repair-component.svelte-16jv58j .jse-json-text:where(.svelte-16jv58j) { + flex: 1; + border: none; + padding: 2px; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + background: var(--jse-input-background, var(--jse-background-color, #fff)); + color: var(--jse-text-color, #4d4d4d); + resize: none; + outline: none; +}`);var U8A=JA('
      Repair invalid JSON, then click apply
      '),T8A=JA('
      ');function J8A(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=EA(void 0,!0),o=EA(void 0,!0),a=EA(void 0,!0),r=EA(void 0,!0),s=L(e,"text",13,""),l=L(e,"readOnly",9,!1),g=L(e,"onParse",9),C=L(e,"onRepair",9),I=L(e,"onChange",9,void 0),d=L(e,"onApply",9),h=L(e,"onCancel",9),E=or("jsoneditor:JSONRepair"),f=EA(void 0,!0);function m(){if(c(f)&&c(A)){var tA=c(A).position!==void 0?c(A).position:0;c(f).setSelectionRange(tA,tA),c(f).focus()}}function v(){d()(s())}function k(){try{s(C()(s())),I()&&I()(s())}catch(tA){}}var S=EA(void 0,!0);KA(()=>K(s()),()=>{N(A,(function(tA){try{return void g()(tA)}catch(W){return Th(tA,W.message)}})(s()))}),KA(()=>K(s()),()=>{N(i,(function(tA){try{return C()(tA),!0}catch(W){return!1}})(s()))}),KA(()=>c(A),()=>{E("error",c(A))}),KA(()=>K(h()),()=>{N(S,[{type:"space"},{type:"button",icon:D4,title:"Cancel repair",className:"jse-cancel",onClick:h()}])}),KA(()=>tS,()=>{N(n,{icon:tS,text:"Show me",title:"Scroll to the error location",onClick:m})}),KA(()=>CC,()=>{N(o,{icon:CC,text:"Auto repair",title:"Automatically repair JSON",onClick:k})}),KA(()=>(c(i),c(n),c(o)),()=>{N(a,c(i)?[c(n),c(o)]:[c(n)])}),KA(()=>K(l()),()=>{N(r,[{icon:J8,text:"Apply",title:"Apply fixed JSON",disabled:l(),onClick:v}])}),Rn(),ni(!0);var b=T8A(),x=dA(b);KD(x,{get items(){return c(S)},$$slots:{left:(tA,W)=>{CA(tA,U8A())}}});var F=_A(x,2),z=tA=>{var W=it(()=>(c(A),wA(()=>"Cannot parse JSON: ".concat(c(A).message))));Yl(tA,{type:"error",get icon(){return z2},get message(){return c(W)},get actions(){return c(a)}})},P=tA=>{Yl(tA,{type:"success",message:"JSON is valid now and can be parsed.",get actions(){return c(r)}})};jA(F,tA=>{c(A)?tA(z):tA(P,!1)});var Z=_A(F,2);Oo(Z,tA=>N(f,tA),()=>c(f)),Se(()=>{Z.readOnly=l(),Dd(Z,s())}),fe("input",Z,function(tA){E("handleChange");var W=tA.target.value;s()!==W&&(s(W),I()&&I()(s()))}),CA(t,b),Ft()}function L$(t,e){Nt(e,!1);var A=L(e,"text",13),i=L(e,"onParse",9),n=L(e,"onRepair",9),o=L(e,"onApply",9),a=L(e,"onClose",9);function r(l){o()(l),a()()}function s(){a()()}ni(!0),Of(t,{get onClose(){return a()},className:"jse-repair-modal",children:(l,g)=>{J8A(l,{get onParse(){return i()},get onRepair(){return n()},onApply:r,onCancel:s,get text(){return A()},set text(C){A(C)},$$legacy:!0})},$$slots:{default:!0}}),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +div.jse-collapsed-items.svelte-1v6dhm4 { + margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); + padding: calc(0.5 * var(--jse-padding, 10px)); + border: 8px solid transparent; + border-width: 8px 0; + background-color: var(--jse-contents-background-color, transparent); + background-image: linear-gradient(var(--jse-collapsed-items-background-color, #f5f5f5), var(--jse-collapsed-items-background-color, #f5f5f5)), linear-gradient(to bottom right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to bottom left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%); + background-repeat: repeat, repeat-x, repeat-x, repeat-x, repeat-x; + background-position: 0 0, 8px 0, 8px 0, 8px 100%, 8px 100%; + background-size: auto auto, 16px 16px, 16px 16px, 16px 16px, 16px 16px; + background-clip: padding-box, border-box, border-box, border-box, border-box; + background-origin: padding-box, border-box, border-box, border-box, border-box; + display: flex; +} +div.jse-collapsed-items.jse-selected.svelte-1v6dhm4 { + background-color: var(--jse-selection-background-color, #d3d3d3); + --jse-collapsed-items-background-color: var(--jse-collapsed-items-selected-background-color, #c2c2c2); +} +div.jse-collapsed-items.svelte-1v6dhm4 div.jse-text:where(.svelte-1v6dhm4), +div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4) { + margin: 0 calc(0.5 * var(--jse-padding, 10px)); +} +div.jse-collapsed-items.svelte-1v6dhm4 div.jse-text:where(.svelte-1v6dhm4) { + display: inline; +} +div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4) { + font-family: inherit; + font-size: inherit; + color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); + background: none; + border: none; + padding: 0; + text-decoration: underline; + cursor: pointer; +} +div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4):hover, div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4):focus { + color: var(--jse-collapsed-items-link-color-highlight, #ee5341); +}`);var O8A=JA(''),Y8A=JA('
      ');function H8A(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=EA(void 0,!0),o=EA(void 0,!0),a=EA(void 0,!0),r=L(e,"visibleSections",9),s=L(e,"sectionIndex",9),l=L(e,"total",9),g=L(e,"path",9),C=L(e,"selection",9),I=L(e,"onExpandSection",9),d=L(e,"context",9);KA(()=>(K(r()),K(s())),()=>{N(A,r()[s()])}),KA(()=>c(A),()=>{N(i,c(A).end)}),KA(()=>(K(r()),K(s()),K(l())),()=>{N(n,r()[s()+1]?r()[s()+1].start:l())}),KA(()=>(K(d()),K(C()),K(g()),c(i)),()=>{N(o,Uf(d().getJson(),C(),g().concat(String(c(i)))))}),KA(()=>(c(i),c(n)),()=>{N(a,(function(S,b){var x={start:S,end:Math.min(iR(S),b)},F=Math.max(CD((S+b)/2),S),z={start:F,end:Math.min(iR(F),b)},P=CD(b),Z=P===b?P-Ff:P,tA={start:Math.max(Z,S),end:b},W=[x],BA=z.start>=x.end&&z.end<=tA.start;return BA&&W.push(z),tA.start>=(BA?z.end:x.end)&&W.push(tA),W})(c(i),c(n)))}),Rn(),ni(!0);var h,E,f=Y8A(),m=dA(f),v=dA(m),k=dA(v);da(_A(v,2),1,()=>c(a),ka,(S,b)=>{var x=O8A(),F=dA(x);Se(()=>{var z,P;return Lt(F,"show ".concat((c(b),(z=wA(()=>c(b).start))!==null&&z!==void 0?z:""),"-").concat((c(b),(P=wA(()=>c(b).end))!==null&&P!==void 0?P:"")))}),fe("click",x,()=>I()(g(),c(b))),CA(S,x)}),Se(()=>{var S,b;h=ii(f,1,"jse-collapsed-items svelte-1v6dhm4",null,h,{"jse-selected":c(o)}),E=mg(f,"",E,{"--level":(K(g()),wA(()=>g().length+2))}),Lt(k,"Items ".concat((S=c(i))!==null&&S!==void 0?S:"","-").concat((b=c(n))!==null&&b!==void 0?b:""))}),fe("mousemove",f,function(S){S.stopPropagation()}),CA(t,f),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-context-menu-pointer.svelte-10ijtzr { + position: absolute; + top: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); + right: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); + width: var(--jse-context-menu-pointer-size, calc(1em + 4px)); + height: var(--jse-context-menu-pointer-size, calc(1em + 4px)); + padding: 0; + margin: 0; + cursor: pointer; + background: transparent; + border-radius: 2px; + background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); + color: var(--jse-context-menu-pointer-color, var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff))); + border: none; + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); +} +.jse-context-menu-pointer.jse-root.svelte-10ijtzr { + top: 0; + right: calc(-2px - var(--jse-context-menu-pointer-size, calc(1em + 4px))); +} +.jse-context-menu-pointer.jse-insert.svelte-10ijtzr { + right: -1px; +} +.jse-context-menu-pointer.svelte-10ijtzr:hover { + background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); +} +.jse-context-menu-pointer.jse-selected.svelte-10ijtzr { + background: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); +} +.jse-context-menu-pointer.jse-selected.svelte-10ijtzr:hover { + background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); +}`);var z8A=JA('');function cI(t,e){Nt(e,!1);var A=L(e,"root",9,!1),i=L(e,"insert",9,!1),n=L(e,"selected",9),o=L(e,"onContextMenu",9);ni(!0);var a,r=z8A();tn(dA(r),{get data(){return c0}}),Se(()=>{a=ii(r,1,"jse-context-menu-pointer svelte-10ijtzr",null,a,{"jse-root":A(),"jse-insert":i(),"jse-selected":n()}),_n(r,"title",LR)}),fe("click",r,function(s){for(var l=s.target;l&&l.nodeName!=="BUTTON";)l=l.parentNode;l&&o()({anchor:l,left:0,top:0,width:xC,height:kC,offsetTop:2,offsetLeft:0,showTip:!0})}),CA(t,r),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-key.svelte-1n4cez4 { + display: inline-block; + min-width: 2em; + padding: 0 5px; + box-sizing: border-box; + outline: none; + border-radius: 1px; + vertical-align: top; + color: var(--jse-key-color, #1a1a1a); + word-break: normal; + overflow-wrap: normal; + white-space: pre-wrap; +} +.jse-key.jse-empty.svelte-1n4cez4 { + min-width: 3em; + outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + -moz-outline-radius: 2px; +} +.jse-key.jse-empty.svelte-1n4cez4::after { + pointer-events: none; + color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + content: "key"; +}`);var P8A=JA('
      '),j8A=JA(" ",1),q8A=JA('
      ');function G$(t,e){Nt(e,!0);var A=Il(()=>En(e.selection)&&tr(e.selection)),i=Il(()=>e.context.onRenderValue({path:e.path,value:e.value,mode:e.context.mode,truncateTextSize:e.context.truncateTextSize,readOnly:e.context.readOnly,enforceString:e.enforceString,isEditing:c(A),parser:e.context.parser,normalization:e.context.normalization,selection:e.selection,searchResultItems:e.searchResultItems,onPatch:e.context.onPatch,onPasteJson:e.context.onPasteJson,onSelect:e.context.onSelect,onFind:e.context.onFind,findNextInside:e.context.findNextInside,focus:e.context.focus})),n=Fi();da(et(n),17,()=>c(i),ka,(o,a)=>{var r=Fi(),s=et(r),l=C=>{var I=Il(()=>c(a).action),d=q8A();ms(d,(h,E)=>{var f;return(f=c(I))===null||f===void 0?void 0:f(h,E)},()=>c(a).props),CA(C,d)},g=C=>{var I=Il(()=>c(a).component),d=Fi();UX(et(d),()=>c(I),(h,E)=>{E(h,DI(()=>c(a).props))}),CA(C,d)};jA(s,C=>{o6A(c(a))?C(l):C(g,!1)}),CA(o,r)}),CA(t,n),Ft()}var V8A={selecting:!1,selectionAnchor:void 0,selectionAnchorType:void 0,selectionFocus:void 0,dragging:!1};function T_(t){var{json:e,selection:A,deltaY:i,items:n}=t;if(!A)return{operations:void 0,updatedSelection:void 0,offset:0};var o=i<0?(function(g){for(var{json:C,items:I,selection:d,deltaY:h}=g,E=_C(C,d),f=I.findIndex(x=>Mi(x.path,E)),m=()=>{var x;return(x=I[v-1])===null||x===void 0?void 0:x.height},v=f,k=0;m()!==void 0&&Math.abs(h)>k+m()/2;)k+=m(),v-=1;var S=I[v].path,b=v-f;return v!==f&&I[v]!==void 0?{beforePath:S,offset:b}:void 0})({json:e,selection:A,deltaY:i,items:n}):(function(g){for(var C,{json:I,items:d,selection:h,deltaY:E}=g,f=vI(I,h),m=d.findIndex(Z=>Mi(Z.path,f)),v=0,k=m,S=()=>{var Z;return(Z=d[k+1])===null||Z===void 0?void 0:Z.height};S()!==void 0&&Math.abs(E)>v+S()/2;)v+=S(),k+=1;var b=Yi(f),x=Xe(I,b),F=Array.isArray(x)?k:k+1,z=(C=d[F])===null||C===void 0?void 0:C.path,P=k-m;return z?{beforePath:z,offset:P}:{append:!0,offset:P}})({json:e,selection:A,deltaY:i,items:n});if(!o||o.offset===0)return{operations:void 0,updatedSelection:void 0,offset:0};var a=(function(g,C,I){if(!C)return[];var d="beforePath"in I?I.beforePath:void 0,h="append"in I?I.append:void 0,E=Yi(It(C)),f=Xe(g,E);if(!(h||d&&k0(d,E)&&d.length>E.length))return[];var m=_C(g,C),v=vI(g,C),k=ki(m),S=ki(v),b=d?d[E.length]:void 0;if(!ia(f)){if(Vo(f)){var x=Rr(k),F=Rr(S),z=b!==void 0?Rr(b):f.length;return Y9(F-x+1,z({op:"move",from:vt(E.concat(String(x+BA))),path:vt(E.concat(String(z+BA)))}):()=>({op:"move",from:vt(E.concat(String(x))),path:vt(E.concat(String(z)))}))}throw new Error("Cannot create move operations: parent must be an Object or Array")}var P=Object.keys(f),Z=P.indexOf(k),tA=P.indexOf(S),W=h?P.length:b!==void 0?P.indexOf(b):-1;return Z!==-1&&tA!==-1&&W!==-1?W>Z?[...P.slice(Z,tA+1),...P.slice(W,P.length)].map(BA=>SI(E,BA)):[...P.slice(W,Z),...P.slice(tA+1,P.length)].map(BA=>SI(E,BA)):[]})(e,A,o),r=Yi(_C(e,A)),s=Xe(e,r);if(Array.isArray(s)){var l=(function(g){var C,I,{items:d,json:h,selection:E,offset:f}=g,m=_C(h,E),v=vI(h,E),k=d.findIndex(F=>Mi(F.path,m)),S=d.findIndex(F=>Mi(F.path,v)),b=(C=d[k+f])===null||C===void 0?void 0:C.path,x=(I=d[S+f])===null||I===void 0?void 0:I.path;return fs(b,x)})({items:n,json:e,selection:A,offset:o.offset});return{operations:a,updatedSelection:l,offset:o.offset}}return{operations:a,updatedSelection:void 0,offset:o.offset}}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +button.jse-validation-error.svelte-q6a061 { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + padding: 0; + margin: 0; + vertical-align: top; + display: inline-flex; + color: var(--jse-error-color, #ee5341); +} + +button.jse-validation-info.svelte-q6a061 { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + padding: 0; + margin: 0; + vertical-align: top; + display: inline-flex; + color: var(--jse-info-color, #4f91ff); +} + +button.jse-validation-warning.svelte-q6a061 { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + padding: 0; + margin: 0; + vertical-align: top; + display: inline-flex; + color: var(--jse-warning-color, #fdc539); +}`);var W8A=JA('');function Rh(t,e){Nt(e,!1);var A=EA(),i=kI("absolute-popup"),n=L(e,"validationError",8),o=L(e,"onExpand",8);KA(()=>K(n()),()=>{N(A,n6A(n())&&n().isChildError?"Contains invalid data":n().message)}),Rn(),ni();var a=W8A();tn(dA(a),{get data(){return z2}}),_r(()=>fe("click",a,function(){for(var r,s=arguments.length,l=new Array(s),g=0;gHh?.(r,s),()=>Me({text:c(A)},i)),Se(()=>{var r;return ii(a,1,"jse-validation-".concat((K(n()),(r=wA(()=>n().severity))!==null&&r!==void 0?r:"")),"svelte-q6a061")}),CA(t,a),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-expand.svelte-1qi6rc1 { + width: var(--jse-indent-size, calc(1em + 4px)); + padding: 0; + margin: 0; + border: none; + cursor: pointer; + background: transparent; + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); + font-size: var(--jse-font-size-mono, 14px); + height: var(--jse-line-height, calc(1em + 4px)); +} +.jse-expand.svelte-1qi6rc1:hover { + opacity: 0.8; +} + +.jse-meta.svelte-1qi6rc1, +.jse-separator.svelte-1qi6rc1, +.jse-index.svelte-1qi6rc1, +.jse-bracket.svelte-1qi6rc1 { + vertical-align: top; + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); +} + +.jse-index.svelte-1qi6rc1 { + padding: 0 calc(0.5 * var(--jse-padding, 10px)); +} + +.jse-bracket.svelte-1qi6rc1 { + padding: 0 2px; +} +.jse-bracket.jse-expanded.svelte-1qi6rc1 { + padding-right: var(--jse-padding, 10px); +} + +.jse-identifier.svelte-1qi6rc1 { + vertical-align: top; + position: relative; +} + +.jse-json-node.svelte-1qi6rc1 { + position: relative; + color: var(--jse-text-color, #4d4d4d); +} +.jse-json-node.jse-root.svelte-1qi6rc1 { + min-height: 100%; + padding-bottom: 2px; + box-sizing: border-box; +} +.jse-json-node.jse-root.svelte-1qi6rc1 > .jse-contents-outer:where(.svelte-1qi6rc1) > .jse-contents:where(.svelte-1qi6rc1) { + padding-left: 0; +} +.jse-json-node.svelte-1qi6rc1 .jse-props:where(.svelte-1qi6rc1), +.jse-json-node.svelte-1qi6rc1 .jse-items:where(.svelte-1qi6rc1) { + position: relative; +} +.jse-json-node.svelte-1qi6rc1 .jse-header-outer:where(.svelte-1qi6rc1), +.jse-json-node.svelte-1qi6rc1 .jse-footer-outer:where(.svelte-1qi6rc1) { + display: flex; + margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); +} +.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1) { + position: relative; +} +.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1) .jse-meta:where(.svelte-1qi6rc1) > .jse-meta-inner:where(.svelte-1qi6rc1) { + display: flex; + justify-content: center; +} +.jse-json-node.svelte-1qi6rc1 .jse-contents-outer:where(.svelte-1qi6rc1) { + display: flex; + margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); +} +.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), +.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) { + display: flex; + flex-direction: row; + align-items: flex-start; +} +.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) { + padding-left: var(--jse-indent-size, calc(1em + 4px)); + cursor: var(--jse-contents-cursor, pointer); +} +.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) .jse-value-outer:where(.svelte-1qi6rc1) { + display: inline-flex; +} +.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { + display: inline-flex; + padding-left: calc(var(--jse-indent-size, calc(1em + 4px)) + 5px); +} +.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), +.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1), +.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { + background: var(--jse-contents-background-color, transparent); +} +.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area:where(.svelte-1qi6rc1) { + padding: 0 calc(0.5 * var(--jse-padding, 10px)); + flex: 1; +} +.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area.jse-inside:where(.svelte-1qi6rc1) { + display: inline-flex; + align-items: center; +} +.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area.jse-after:where(.svelte-1qi6rc1) { + display: flex; + align-items: flex-end; +} +.jse-json-node.svelte-1qi6rc1 .jse-context-menu-pointer-anchor:where(.svelte-1qi6rc1) { + position: relative; +} +.jse-json-node.svelte-1qi6rc1 .jse-insert-area:where(.svelte-1qi6rc1) { + display: flex; + position: relative; + z-index: 1; + margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); + max-width: 250px; + min-width: 100px; + height: 0; + margin-right: calc(0.5 * var(--jse-padding, 10px)); + outline: 1px solid; +} +.jse-json-node.svelte-1qi6rc1 .jse-insert-area.jse-hovered:where(.svelte-1qi6rc1) { + outline-color: var(--jse-context-menu-pointer-hover-background, #b2b2b2); +} +.jse-json-node.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1) { + position: relative; +} +.jse-json-node.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1):hover, +.jse-json-node.svelte-1qi6rc1 .jse-value-outer:where(.svelte-1qi6rc1):hover, +.jse-json-node.svelte-1qi6rc1 .jse-meta:where(.svelte-1qi6rc1):hover, +.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1):hover { + background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); + cursor: var(--jse-contents-cursor, pointer); +} +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer { + background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); + cursor: var(--jse-contents-cursor, pointer); +} +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-meta { + background: none; +} +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1), +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { + background: var(--jse-selection-background-color, #d3d3d3); + cursor: var(--jse-contents-selected-cursor, grab); +} +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1):hover, +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-value-outer:where(.svelte-1qi6rc1):hover, +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-meta:where(.svelte-1qi6rc1):hover, +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1):hover { + background: inherit; + cursor: inherit; +} +.jse-json-node.svelte-1qi6rc1 .jse-key-outer.jse-selected-key:where(.svelte-1qi6rc1) { + background: var(--jse-selection-background-color, #d3d3d3); + cursor: var(--jse-contents-selected-cursor, grab); +} +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-value-outer, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-meta, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-header, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-contents, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-header, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-contents, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-footer { + background: var(--jse-selection-background-color, #d3d3d3); + cursor: var(--jse-contents-selected-cursor, grab); +} +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-value-outer .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-meta .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-header .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-contents .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-header .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-contents .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-footer .jse-key-outer:hover { + background: inherit; + cursor: inherit; +} +.jse-json-node.jse-readonly.svelte-1qi6rc1 { + --jse-contents-selected-cursor: pointer; +} +.jse-json-node.svelte-1qi6rc1 .jse-insert-area.jse-selected:where(.svelte-1qi6rc1) { + outline-color: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); +}`);var To=kD(()=>V8A),Z8A=JA('
      :
      '),X8A=JA('
      [
       ',1),$8A=JA('
      [
      ]
      ',1),AwA=JA('
      '),ewA=JA('
      '),twA=JA('
      '),iwA=JA('
      '),nwA=JA('
      '),owA=JA(" ",1),awA=JA('
      '),rwA=JA('
      ',1),swA=JA('
      ',1),lwA=JA('
      :
      '),gwA=JA('
      {
      '),cwA=JA('
      {
      }
      ',1),CwA=JA('
      '),IwA=JA('
      '),dwA=JA('
      '),BwA=JA('
      '),EwA=JA('
      '),hwA=JA('
      '),QwA=JA('
      ',1),uwA=JA('
      ',1),fwA=JA('
      :
      '),pwA=JA('
      '),mwA=JA('
      '),wwA=JA('
      '),DwA=JA('
      '),ywA=JA('
      ');function BR(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=L(e,"pointer",9),o=L(e,"value",9),a=L(e,"state",9),r=L(e,"validationErrors",9),s=L(e,"searchResults",9),l=L(e,"selection",9),g=L(e,"context",9),C=L(e,"onDragSelectionStart",9),I=or("jsoneditor:JSONNode"),d=EA(void 0,!0),h=void 0,E=EA(void 0,!0),f=EA(void 0,!0),m=EA(void 0,!0),v=EA(void 0,!0),k=EA(void 0,!0),S=EA(void 0,!0),b=EA(void 0,!0);function x(YA){YA.stopPropagation();var fA=FR(YA);g().onExpand(c(f),!c(m),fA)}function F(){g().onExpand(c(f),!0)}function z(YA,fA){var XA=e3(c(f),Object.keys(o()),YA,fA);return g().onPatch(XA),ki(Es(XA[0].path))}function P(YA){g().onDrag(YA)}function Z(YA){To().selecting&&(To(To().selecting=!1),YA.stopPropagation()),g().onDragEnd(),document.removeEventListener("mousemove",P,!0),document.removeEventListener("mouseup",Z)}function tA(){var YA;return((YA=g().findElement([]))===null||YA===void 0||(YA=YA.getBoundingClientRect())===null||YA===void 0?void 0:YA.top)||0}function W(YA,fA){var XA=tA()-YA.initialContentTop;return fA.clientY-YA.initialClientY-XA}function BA(YA){if(!g().readOnly&&l()){var fA=Yi(It(l()));if(Mi(c(f),fA)){var XA=(function(HA,vA){var Gt=[];function ft($){var oA=c(f).concat($),sA=g().findElement(oA);sA!==void 0&&Gt.push({path:oA,height:sA.clientHeight})}if(Array.isArray(o())){var he=g().getJson();if(he===void 0)return;var Ot=_C(he,HA),He=vI(he,HA),je=parseInt(ki(Ot),10),pt=parseInt(ki(He),10),xe=vA.find($=>je>=$.start&&pt<=$.end);if(!xe)return;var{start:oi,end:j}=xe;zX(oi,Math.min(o().length,j),$=>ft(String($)))}else Object.keys(o()).forEach(ft);return Gt})(l(),c(k)||kh);if(I("dragSelectionStart",{selection:l(),items:XA}),XA){var DA=g().getJson();if(DA!==void 0){var ee=_C(DA,l()),NA=XA.findIndex(HA=>Mi(HA.path,ee)),{offset:ke}=T_({json:DA,selection:g().getSelection(),deltaY:0,items:XA});N(E,{initialTarget:YA.target,initialClientY:YA.clientY,initialContentTop:tA(),selectionStartIndex:NA,selectionItemsCount:MI(DA,l()).length,items:XA,offset:ke,didMoveItems:!1}),To(To().dragging=!0),document.addEventListener("mousemove",X,!0),document.addEventListener("mouseup",iA)}}else I("Cannot drag the current selection (probably spread over multiple sections)")}else C()(YA)}}function X(YA){if(c(E)){var fA=g().getJson();if(fA===void 0)return;var XA=W(c(E),YA),{offset:DA}=T_({json:fA,selection:g().getSelection(),deltaY:XA,items:c(E).items});DA!==c(E).offset&&(I("drag selection",DA,XA),N(E,Me(Me({},c(E)),{},{offset:DA,didMoveItems:!0})))}}function iA(YA){if(c(E)){var fA=g().getJson();if(fA===void 0)return;var XA=W(c(E),YA),{operations:DA,updatedSelection:ee}=T_({json:fA,selection:g().getSelection(),deltaY:XA,items:c(E).items});if(DA)g().onPatch(DA,(HA,vA)=>({state:vA,selection:ee??l()}));else if(YA.target===c(E).initialTarget&&!c(E).didMoveItems){var NA=b_(YA.target),ke=i$(YA.target);ke&&g().onSelect(BZ(NA,ke))}N(E,void 0),To(To().dragging=!1),document.removeEventListener("mousemove",X,!0),document.removeEventListener("mouseup",iA)}}function AA(YA){YA.shiftKey||(YA.stopPropagation(),YA.preventDefault(),g().onSelect(OC(c(f))))}function IA(YA){YA.shiftKey||(YA.stopPropagation(),YA.preventDefault(),g().onSelect(LC(c(f))))}function aA(YA){g().onSelect(OC(c(f))),Ro(),g().onContextMenu(YA)}function rA(YA){g().onSelect(LC(c(f))),Ro(),g().onContextMenu(YA)}KA(()=>K(n()),()=>{N(f,Es(n()))}),KA(()=>K(n()),()=>{N(A,encodeURIComponent(n()))}),KA(()=>K(a()),()=>{N(m,!!yd(a())&&a().expanded)}),KA(()=>(K(o()),K(a())),()=>{N(v,v0(o(),a(),[]))}),KA(()=>K(a()),()=>{N(k,ir(a())?a().visibleSections:void 0)}),KA(()=>K(r()),()=>{var YA;N(S,(YA=r())===null||YA===void 0?void 0:YA.validationError)}),KA(()=>(K(g()),K(l()),c(f)),()=>{N(b,Uf(g().getJson(),l(),c(f)))}),KA(()=>c(f),()=>{N(i,c(f).length===0)}),Rn(),ni(!0);var uA,UA,$A=ywA(),zA=dA($A),pA=YA=>{var fA=swA(),XA=et(fA),DA=dA(XA),ee=dA(DA),NA=dA(ee),ke=GA=>{tn(GA,{get data(){return c0}})},HA=GA=>{tn(GA,{get data(){return kE}})};jA(NA,GA=>{c(m)?GA(ke):GA(HA,!1)});var vA=_A(ee,2);Ia(vA,e,"identifier",{},null);var Gt=_A(vA,2),ft=GA=>{CA(GA,Z8A())};jA(Gt,GA=>{c(i)||GA(ft)});var he=_A(Gt,2),Ot=dA(he),He=dA(Ot),je=GA=>{var OA=X8A();nD(_A(et(OA),2),{children:(ht,tt)=>{var ze=dr();Se(()=>{var Oe,Ci;return Lt(ze,"".concat((K(o()),(Oe=wA(()=>o().length))!==null&&Oe!==void 0?Oe:""),` + `).concat((K(o()),(Ci=wA(()=>o().length===1?"item":"items"))!==null&&Ci!==void 0?Ci:"")))}),CA(ht,ze)},$$slots:{default:!0}}),CA(GA,OA)},pt=GA=>{var OA=$8A();nD(_A(et(OA),2),{onclick:F,children:(ht,tt)=>{var ze=dr();Se(()=>{var Oe,Ci;return Lt(ze,"".concat((K(o()),(Oe=wA(()=>o().length))!==null&&Oe!==void 0?Oe:""),` + `).concat((K(o()),(Ci=wA(()=>o().length===1?"item":"items"))!==null&&Ci!==void 0?Ci:"")))}),CA(ht,ze)},$$slots:{default:!0}}),CA(GA,OA)};jA(He,GA=>{c(m)?GA(je):GA(pt,!1)});var xe=_A(he,2),oi=GA=>{var OA=AwA();cI(dA(OA),{get root(){return c(i)},selected:!0,get onContextMenu(){return K(g()),wA(()=>g().onContextMenu)}}),CA(GA,OA)};jA(xe,GA=>{K(g()),c(b),K(l()),K(En),K(Co),K(tr),K(Mi),K(It),c(f),wA(()=>!g().readOnly&&c(b)&&l()&&(En(l())||Co(l()))&&!tr(l())&&Mi(It(l()),c(f)))&&GA(oi)});var j=_A(DA,2),$=GA=>{Rh(GA,{get validationError(){return c(S)},onExpand:F})};jA(j,GA=>{c(S),c(m),wA(()=>c(S)&&(!c(m)||!c(S).isChildError))&&GA($)});var oA=_A(j,2),sA=GA=>{var OA=ewA();fe("click",OA,AA),CA(GA,OA)},TA=GA=>{var OA=twA();fe("click",OA,IA),CA(GA,OA)};jA(oA,GA=>{c(m)?GA(sA):GA(TA,!1)});var de=_A(XA,2),Qe=GA=>{var OA=rwA(),ht=et(OA),tt=dA(ht),ze=hn=>{var Ke,nn,Si=iwA(),Li=dA(Si),Zi=it(()=>(c(b),K(Va),K(l()),wA(()=>c(b)&&Va(l()))));cI(Li,{insert:!0,get selected(){return c(Zi)},onContextMenu:aA}),Se(bt=>{Ke=ii(Si,1,"jse-insert-area jse-inside svelte-1qi6rc1",null,Ke,bt),_n(Si,"title",k_),nn=mg(Si,"",nn,{"--level":(c(f),wA(()=>c(f).length+1))})},[()=>({"jse-hovered":c(d)===rd,"jse-selected":c(b)&&Va(l())})]),CA(hn,Si)};jA(tt,hn=>{K(g()),c(d),K(rd),c(b),K(Va),K(l()),wA(()=>!g().readOnly&&(c(d)===rd||c(b)&&Va(l())))&&hn(ze)}),da(_A(tt,2),1,()=>c(k)||kh,ka,(hn,Ke,nn)=>{var Si=owA(),Li=et(Si);da(Li,1,()=>(K(o()),c(Ke),c(E),wA(()=>(function(on,Kt,G){var dt=Kt.start,Ei=Math.min(Kt.end,on.length),Qn=K8(dt,Ei);return G&&G.offset!==0?VW(Qn,G.selectionStartIndex,G.selectionItemsCount,G.offset).map((un,Vn)=>({index:un,gutterIndex:Vn})):Qn.map(un=>({index:un,gutterIndex:un}))})(o(),c(Ke),c(E)))),on=>on.index,(on,Kt)=>{var G=it(()=>(K(ir),K(r()),c(Kt),wA(()=>ir(r())?r().items[c(Kt).index]:void 0))),dt=it(()=>(K(O5),K(g()),K(l()),c(f),c(Kt),wA(()=>O5(g().getJson(),l(),c(f).concat(String(c(Kt).index)))))),Ei=Fi(),Qn=et(Ei),un=it(()=>(K(s4),K(n()),c(Kt),wA(()=>s4(n(),c(Kt).index)))),Vn=it(()=>(K(ir),K(a()),c(Kt),wA(()=>ir(a())?a().items[c(Kt).index]:void 0))),Yo=it(()=>(K(ir),K(s()),c(Kt),wA(()=>ir(s())?s().items[c(Kt).index]:void 0)));BR(Qn,{get value(){return K(o()),c(Kt),wA(()=>o()[c(Kt).index])},get pointer(){return c(un)},get state(){return c(Vn)},get validationErrors(){return c(G)},get searchResults(){return c(Yo)},get selection(){return c(dt)},get context(){return g()},onDragSelectionStart:BA,$$slots:{identifier:(Bo,No)=>{var Zo=nwA(),Do=dA(Zo),Ba=dA(Do);Se(()=>Lt(Ba,(c(Kt),wA(()=>c(Kt).gutterIndex)))),CA(Bo,Zo)}}}),CA(on,Ei)});var Zi=_A(Li,2),bt=on=>{var Kt=it(()=>c(k)||kh);H8A(on,{get visibleSections(){return c(Kt)},sectionIndex:nn,get total(){return K(o()),wA(()=>o().length)},get path(){return c(f)},get onExpandSection(){return K(g()),wA(()=>g().onExpandSection)},get selection(){return l()},get context(){return g()}})};jA(Zi,on=>{c(Ke),K(o()),wA(()=>c(Ke).end{var Ke=awA();fe("click",Ke,IA),CA(hn,Ke)};jA(Ci,hn=>{c(i)||hn(gn)}),CA(GA,OA)};jA(de,GA=>{c(m)&&GA(Qe)}),fe("click",ee,x),CA(YA,fA)},PA=YA=>{var fA=Fi(),XA=et(fA),DA=NA=>{var ke=uwA(),HA=et(ke),vA=dA(HA),Gt=dA(vA),ft=dA(Gt),he=Oe=>{tn(Oe,{get data(){return c0}})},Ot=Oe=>{tn(Oe,{get data(){return kE}})};jA(ft,Oe=>{c(m)?Oe(he):Oe(Ot,!1)});var He=_A(Gt,2);Ia(He,e,"identifier",{},null);var je=_A(He,2),pt=Oe=>{CA(Oe,lwA())};jA(je,Oe=>{c(i)||Oe(pt)});var xe=_A(je,2),oi=dA(xe),j=dA(oi),$=Oe=>{CA(Oe,gwA())},oA=Oe=>{var Ci=cwA();nD(_A(et(Ci),2),{onclick:F,children:(gn,hn)=>{var Ke=dr();Se((nn,Si)=>Lt(Ke,"".concat(nn??"",` + `).concat(Si??"")),[()=>(K(o()),wA(()=>Object.keys(o()).length)),()=>(K(o()),wA(()=>Object.keys(o()).length===1?"prop":"props"))]),CA(gn,Ke)},$$slots:{default:!0}}),CA(Oe,Ci)};jA(j,Oe=>{c(m)?Oe($):Oe(oA,!1)});var sA=_A(xe,2),TA=Oe=>{var Ci=CwA();cI(dA(Ci),{get root(){return c(i)},selected:!0,get onContextMenu(){return K(g()),wA(()=>g().onContextMenu)}}),CA(Oe,Ci)};jA(sA,Oe=>{K(g()),c(b),K(l()),K(En),K(Co),K(tr),K(Mi),K(It),c(f),wA(()=>!g().readOnly&&c(b)&&l()&&(En(l())||Co(l()))&&!tr(l())&&Mi(It(l()),c(f)))&&Oe(TA)});var de=_A(vA,2),Qe=Oe=>{Rh(Oe,{get validationError(){return c(S)},onExpand:F})};jA(de,Oe=>{c(S),c(m),wA(()=>c(S)&&(!c(m)||!c(S).isChildError))&&Oe(Qe)});var GA=_A(de,2),OA=Oe=>{var Ci=IwA();fe("click",Ci,AA),CA(Oe,Ci)},ht=Oe=>{var Ci=Fi(),gn=et(Ci),hn=Ke=>{var nn=dwA();fe("click",nn,IA),CA(Ke,nn)};jA(gn,Ke=>{c(i)||Ke(hn)},!0),CA(Oe,Ci)};jA(GA,Oe=>{c(m)?Oe(OA):Oe(ht,!1)});var tt=_A(HA,2),ze=Oe=>{var Ci=QwA(),gn=et(Ci),hn=dA(gn),Ke=Zi=>{var bt,on,Kt=BwA(),G=dA(Kt),dt=it(()=>(c(b),K(Va),K(l()),wA(()=>c(b)&&Va(l()))));cI(G,{insert:!0,get selected(){return c(dt)},onContextMenu:aA}),Se(Ei=>{bt=ii(Kt,1,"jse-insert-area jse-inside svelte-1qi6rc1",null,bt,Ei),_n(Kt,"title",k_),on=mg(Kt,"",on,{"--level":(c(f),wA(()=>c(f).length+1))})},[()=>({"jse-hovered":c(d)===rd,"jse-selected":c(b)&&Va(l())})]),CA(Zi,Kt)};jA(hn,Zi=>{K(g()),c(d),K(rd),c(b),K(Va),K(l()),wA(()=>!g().readOnly&&(c(d)===rd||c(b)&&Va(l())))&&Zi(Ke)}),da(_A(hn,2),1,()=>(K(o()),c(E),wA(()=>(function(Zi,bt){var on=Object.keys(Zi);return bt&&bt.offset!==0?VW(on,bt.selectionStartIndex,bt.selectionItemsCount,bt.offset):on})(o(),c(E)))),ka,(Zi,bt)=>{var on=it(()=>(K(s4),K(n()),c(bt),wA(()=>s4(n(),c(bt))))),Kt=it(()=>(K(Cl),K(s()),c(bt),wA(()=>Cl(s())?s().properties[c(bt)]:void 0))),G=it(()=>(K(Cl),K(r()),c(bt),wA(()=>Cl(r())?r().properties[c(bt)]:void 0))),dt=it(()=>(c(f),c(bt),wA(()=>c(f).concat(c(bt))))),Ei=it(()=>(K(O5),K(g()),K(l()),K(c(dt)),wA(()=>O5(g().getJson(),l(),c(dt))))),Qn=Fi(),un=et(Qn),Vn=it(()=>(K(Cl),K(a()),c(bt),wA(()=>Cl(a())?a().properties[c(bt)]:void 0)));BR(un,{get value(){return K(o()),c(bt),wA(()=>o()[c(bt)])},get pointer(){return c(on)},get state(){return c(Vn)},get validationErrors(){return c(G)},get searchResults(){return c(Kt)},get selection(){return c(Ei)},get context(){return g()},onDragSelectionStart:BA,$$slots:{identifier:(Yo,Bo)=>{var No,Zo=EwA(),Do=dA(Zo),Ba=it(()=>(K(mZ),K(c(Kt)),wA(()=>mZ(c(Kt)))));(function(Xo,ra){Nt(ra,!1);var yo=EA(void 0,!0),ge=EA(void 0,!0),mi=L(ra,"pointer",9),cn=L(ra,"key",9),fn=L(ra,"selection",9),Ho=L(ra,"searchResultItems",9),ya=L(ra,"onUpdateKey",9),_i=L(ra,"context",9),Eo=EA(void 0,!0);function Za(xA){c(ge)||_i().readOnly||(xA.preventDefault(),_i().onSelect(zR(c(Eo))))}function vo(xA,Ae){var De=ya()(cn(),_i().normalization.unescapeValue(xA)),mA=Yi(c(Eo)).concat(De);_i().onSelect(Ae===yI.nextInside?Hi(mA):JC(mA)),Ae!==yI.self&&_i().focus()}function Ta(){_i().onSelect(JC(c(Eo))),_i().focus()}KA(()=>K(mi()),()=>{N(Eo,Es(mi()))}),KA(()=>(K(fn()),c(Eo)),()=>{N(yo,nr(fn())&&Mi(fn().path,c(Eo)))}),KA(()=>(c(yo),K(fn())),()=>{N(ge,c(yo)&&tr(fn()))}),Rn(),ni(!0);var Jn=j8A(),Ui=et(Jn),qt=xA=>{var Ae=it(()=>(K(_i()),K(cn()),wA(()=>_i().normalization.escapeValue(cn())))),De=it(()=>(K(tr),K(fn()),wA(()=>tr(fn())?fn().initialValue:void 0)));d$(xA,{get value(){return c(Ae)},get initialValue(){return c(De)},label:"Edit key",shortText:!0,onChange:vo,onCancel:Ta,get onFind(){return K(_i()),wA(()=>_i().onFind)}})},Nn=xA=>{var Ae,De=P8A(),mA=dA(De),FA=Ne=>{var nt=it(()=>(K(_i()),K(cn()),wA(()=>_i().normalization.escapeValue(cn()))));p$(Ne,{get text(){return c(nt)},get searchResultItems(){return Ho()}})},le=Ne=>{var nt=dr();Se(rt=>Lt(nt,rt),[()=>(K(Jh),K(_i()),K(cn()),wA(()=>Jh(_i().normalization.escapeValue(cn()))))]),CA(Ne,nt)};jA(mA,Ne=>{Ho()?Ne(FA):Ne(le,!1)}),Se(()=>Ae=ii(De,1,"jse-key svelte-1n4cez4",null,Ae,{"jse-empty":cn()===""})),fe("dblclick",De,Za),CA(xA,De)};jA(Ui,xA=>{K(_i()),c(ge),wA(()=>!_i().readOnly&&c(ge))?xA(qt):xA(Nn,!1)});var ho=_A(Ui,2),Fo=xA=>{cI(xA,{selected:!0,get onContextMenu(){return K(_i()),wA(()=>_i().onContextMenu)}})};jA(ho,xA=>{K(_i()),c(yo),c(ge),wA(()=>!_i().readOnly&&c(yo)&&!c(ge))&&xA(Fo)}),CA(Xo,Jn),Ft()})(Do,{get pointer(){return c(on)},get key(){return c(bt)},get selection(){return c(Ei)},get searchResultItems(){return c(Ba)},get context(){return g()},onUpdateKey:z}),Se(Xo=>No=ii(Zo,1,"jse-key-outer svelte-1qi6rc1",null,No,Xo),[()=>({"jse-selected-key":nr(c(Ei))&&Mi(c(Ei).path,c(dt))})]),CA(Yo,Zo)}}}),CA(Zi,Qn)});var nn=_A(gn,2),Si=_A(dA(nn),2),Li=Zi=>{var bt=hwA();fe("click",bt,IA),CA(Zi,bt)};jA(Si,Zi=>{c(i)||Zi(Li)}),CA(Oe,Ci)};jA(tt,Oe=>{c(m)&&Oe(ze)}),fe("click",Gt,x),CA(NA,ke)},ee=NA=>{var ke=wwA(),HA=dA(ke),vA=dA(HA);Ia(vA,e,"identifier",{},null);var Gt=_A(vA,2),ft=sA=>{CA(sA,fwA())};jA(Gt,sA=>{c(i)||sA(ft)});var he=_A(Gt,2),Ot=dA(he),He=it(()=>c(b)?l():void 0),je=it(()=>(K(wZ),K(s()),wA(()=>wZ(s()))));G$(Ot,{get path(){return c(f)},get value(){return o()},get enforceString(){return c(v)},get selection(){return c(He)},get searchResultItems(){return c(je)},get context(){return g()}});var pt=_A(he,2),xe=sA=>{var TA=pwA();cI(dA(TA),{get root(){return c(i)},selected:!0,get onContextMenu(){return K(g()),wA(()=>g().onContextMenu)}}),CA(sA,TA)};jA(pt,sA=>{K(g()),c(b),K(l()),K(En),K(Co),K(tr),K(Mi),K(It),c(f),wA(()=>!g().readOnly&&c(b)&&l()&&(En(l())||Co(l()))&&!tr(l())&&Mi(It(l()),c(f)))&&sA(xe)});var oi=_A(HA,2),j=sA=>{Rh(sA,{get validationError(){return c(S)},onExpand:F})};jA(oi,sA=>{c(S)&&sA(j)});var $=_A(oi,2),oA=sA=>{var TA=mwA();fe("click",TA,IA),CA(sA,TA)};jA($,sA=>{c(i)||sA(oA)}),CA(NA,ke)};jA(XA,NA=>{K(Mn),K(o()),wA(()=>Mn(o()))?NA(DA):NA(ee,!1)},!0),CA(YA,fA)};jA(zA,YA=>{K(o()),wA(()=>Array.isArray(o()))?YA(pA):YA(PA,!1)});var Je=_A(zA,2),_e=YA=>{var fA,XA=DwA(),DA=dA(XA),ee=it(()=>(c(b),K(dl),K(l()),wA(()=>c(b)&&dl(l()))));cI(DA,{insert:!0,get selected(){return c(ee)},onContextMenu:rA}),Se(NA=>{fA=ii(XA,1,"jse-insert-area jse-after svelte-1qi6rc1",null,fA,NA),_n(XA,"title",k_)},[()=>({"jse-hovered":c(d)===T5,"jse-selected":c(b)&&dl(l())})]),CA(YA,XA)};jA(Je,YA=>{K(g()),c(d),K(T5),c(b),K(dl),K(l()),wA(()=>!g().readOnly&&(c(d)===T5||c(b)&&dl(l())))&&YA(_e)}),Se((YA,fA)=>{uA=ii($A,1,YA,"svelte-1qi6rc1",uA,fA),_n($A,"data-path",c(A)),_n($A,"aria-selected",c(b)),UA=mg($A,"",UA,{"--level":(c(f),wA(()=>c(f).length))})},[()=>bI((K(wc),c(m),K(g()),c(f),K(o()),wA(()=>wc("jse-json-node",{"jse-expanded":c(m)},g().onClassName(c(f),o()))))),()=>({"jse-root":c(i),"jse-selected":c(b)&&Co(l()),"jse-selected-value":c(b)&&En(l()),"jse-readonly":g().readOnly,"jse-hovered":c(d)===$W})]),fe("mousedown",$A,function(YA){if((YA.buttons===1||YA.buttons===2)&&!((fA=YA.target).nodeName==="DIV"&&fA.contentEditable==="true"||YA.buttons===1&&e$(YA.target,"BUTTON"))){var fA;YA.stopPropagation(),YA.preventDefault(),g().focus(),document.addEventListener("mousemove",P,!0),document.addEventListener("mouseup",Z);var XA=b_(YA.target),DA=g().getJson(),ee=g().getDocumentState();if(!l()||XA===oo.after||XA===oo.inside||l().type!==XA&&l().type!==oo.multi||!Uf(DA,l(),c(f)))if(To(To().selecting=!0),To(To().selectionAnchor=c(f)),To(To().selectionAnchorType=XA),To(To().selectionFocus=c(f)),YA.shiftKey){var NA=g().getSelection();NA&&g().onSelect(fs(hd(NA),c(f)))}else if(XA===oo.multi)if(c(i)&&YA.target.hasAttribute("data-path")){var ke=ki(l$(o(),ee));g().onSelect(rR(ke))}else g().onSelect(fs(c(f),c(f)));else DA!==void 0&&g().onSelect(BZ(XA,c(f)));else YA.button===0&&C()(YA)}}),fe("mousemove",$A,function(YA){if(To().selecting){YA.preventDefault(),YA.stopPropagation(),To().selectionFocus===void 0&&window.getSelection&&window.getSelection().empty();var fA=b_(YA.target);Mi(c(f),To().selectionFocus)&&fA===To().selectionAnchorType||(To(To().selectionFocus=c(f)),To(To().selectionAnchorType=fA),g().onSelect(fs(To().selectionAnchor||To().selectionFocus,To().selectionFocus)))}}),fe("mouseover",$A,function(YA){To().selecting||To().dragging||(YA.stopPropagation(),QI(YA.target,"data-type","selectable-value")?N(d,$W):QI(YA.target,"data-type","selectable-key")?N(d,void 0):QI(YA.target,"data-type","insert-selection-area-inside")?N(d,rd):QI(YA.target,"data-type","insert-selection-area-after")&&N(d,T5),clearTimeout(h))}),fe("mouseout",$A,function(YA){YA.stopPropagation(),h=window.setTimeout(()=>N(d,void 0))}),CA(t,$A),Ft()}var K$={prefix:"fas",iconName:"jsoneditor-expand",icon:[512,512,[],"","M 0,448 V 512 h 512 v -64 z M 0,0 V 64 H 512 V 0 Z M 256,96 128,224 h 256 z M 256,416 384,288 H 128 Z"]},U$={prefix:"fas",iconName:"jsoneditor-collapse",icon:[512,512,[],"","m 0,224 v 64 h 512 v -64 z M 256,192 384,64 H 128 Z M 256,320 128,448 h 256 z"]},FZ={prefix:"fas",iconName:"jsoneditor-format",icon:[512,512,[],"","M 0,32 v 64 h 416 v -64 z M 160,160 v 64 h 352 v -64 z M 160,288 v 64 h 288 v -64 z M 0,416 v 64 h 320 v -64 z"]},vwA={prefix:"fas",iconName:"jsoneditor-compact",icon:[512,512,[],"","M 0,32 v 64 h 512 v -64 z M 0,160 v 64 h 512 v -64 z M 0,288 v 64 h 352 v -64 z"]};Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-welcome.svelte-1lhnan { + flex: 1; + overflow: auto; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + display: flex; + flex-direction: column; + align-items: center; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-welcome.svelte-1lhnan:last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-welcome.svelte-1lhnan .jse-space.jse-before:where(.svelte-1lhnan) { + flex: 1; +} +.jse-welcome.svelte-1lhnan .jse-space.jse-after:where(.svelte-1lhnan) { + flex: 2; +} +.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) { + display: flex; + flex-direction: column; + max-width: 300px; + margin: 2em var(--jse-padding, 10px); + gap: var(--jse-padding, 10px); +} +.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) .jse-welcome-info:where(.svelte-1lhnan) { + color: var(--jse-panel-color-readonly, #b2b2b2); +} +.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +}`);var bwA=JA('
      You can paste clipboard data using Ctrl+V, or use the following options:
      ',1),MwA=JA('
      Empty document
      ');function ER(t,e){var A=typeof t=="string"?t.toLowerCase():t,i=typeof e=="string"?e.toLowerCase():e;return(0,YZ.default)(A,i)}function T$(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,n=Xe(t,e);if(Vo(n)){if(A===void 0)throw new Error("Cannot sort: no property selected by which to sort the array");return(function(o){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,l=(function(C,I){var d={boolean:0,number:1,string:2,undefined:4},h=3;return function(E,f){var m=Xe(E,C),v=Xe(f,C);if(typeof m!=typeof v){var k,S,b=(k=d[typeof m])!==null&&k!==void 0?k:h,x=(S=d[typeof v])!==null&&S!==void 0?S:h;return b>x?I:bv?I:m1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,s=Xe(o,a),l=Object.keys(s).slice();l.sort((C,I)=>r*ER(C,I));var g={};return l.forEach(C=>g[C]=s[C]),[{op:"replace",path:vt(a),value:g}]})(t,e,i);throw new Error("Cannot sort: no array or object")}Vf(["click"]);Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-navigation-bar-dropdown.svelte-1k47orx { + position: absolute; + top: 100%; + left: 0; + z-index: 3; + background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); + color: var(--jse-navigation-bar-dropdown-color, #656565); + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); + display: flex; + flex-direction: column; + max-height: 300px; + overflow: auto; + min-width: 80px; +} +.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx) { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + border: none; + background: transparent; + color: inherit; + cursor: pointer; + outline: none; + text-align: left; + white-space: nowrap; + box-sizing: border-box; + padding: calc(0.5 * var(--jse-padding, 10px)) 36px; +} +.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx):focus, .jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx):hover { + background: var(--jse-navigation-bar-background-highlight, #e5e5e5); +} +.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item.jse-selected:where(.svelte-1k47orx) { + background: var(--jse-navigation-bar-dropdown-color, #656565); + color: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); +}`);var SwA=JA(''),kwA=JA(''),xwA=JA('
      ');function _wA(t,e){Nt(e,!1);var A=L(e,"items",9),i=L(e,"selectedItem",9),n=L(e,"onSelect",9);ni(!0);var o=xwA(),a=dA(o);da(a,1,()=>(K(gD),K(A()),wA(()=>gD(A(),100))),l=>l,(l,g)=>{var C,I=SwA(),d=dA(I);Se((h,E)=>{C=ii(I,1,"jse-navigation-bar-dropdown-item svelte-1k47orx",null,C,{"jse-selected":c(g)===i()}),_n(I,"title",h),Lt(d,E)},[()=>(c(g),wA(()=>c(g).toString())),()=>(K(SC),c(g),wA(()=>SC(c(g).toString(),30)))]),fe("click",I,vC(()=>n()(c(g)))),CA(l,I)});var r=_A(a,2),s=l=>{var g=kwA();_n(g,"title","Limited to 100 items"),CA(l,g)};jA(r,l=>{K(A()),wA(()=>A().length>100)&&l(s)}),CA(t,o),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-navigation-bar-item.svelte-13sijxb { + position: relative; + display: flex; +} +.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb) { + font-family: inherit; + font-size: inherit; + padding: calc(0.5 * var(--jse-padding, 10px)) 2px; + border: none; + background: transparent; + color: inherit; + cursor: pointer; + outline: none; + min-width: 2em; + white-space: nowrap; +} +.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb):focus, .jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb):hover { + background: var(--jse-panel-button-background-highlight, #e0e0e0); + color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); +} +.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button.jse-navigation-bar-arrow:where(.svelte-13sijxb) { + padding: 2px var(--jse-padding, 10px) 0; +} +.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button.jse-navigation-bar-arrow.jse-open:where(.svelte-13sijxb) { + background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); + color: var(--jse-navigation-bar-dropdown-color, #656565); +} +.jse-navigation-bar-item.svelte-13sijxb:last-child { + padding-right: var(--jse-padding, 10px); +}`);var RwA=JA(''),NwA=JA('
      ');function LZ(t,e){Nt(e,!1);var A,i=EA(void 0,!0),n=EA(void 0,!0),{openAbsolutePopup:o,closeAbsolutePopup:a}=kI("absolute-popup"),r=L(e,"path",9),s=L(e,"index",9),l=L(e,"onSelect",9),g=L(e,"getItems",9),C=EA(void 0,!0),I=EA(!1,!0);function d(k){a(A),l()(c(i).concat(k))}KA(()=>(K(r()),K(s())),()=>{N(i,r().slice(0,s()))}),KA(()=>(K(r()),K(s())),()=>{N(n,r()[s()])}),Rn(),ni(!0);var h,E=NwA(),f=dA(E);tn(dA(f),{get data(){return $9}});var m=_A(f,2),v=k=>{var S=RwA(),b=dA(S);Se(()=>Lt(b,c(n))),fe("click",S,()=>d(c(n))),CA(k,S)};jA(m,k=>{c(n)!==void 0&&k(v)}),Oo(E,k=>N(C,k),()=>c(C)),Se(()=>h=ii(f,1,"jse-navigation-bar-button jse-navigation-bar-arrow svelte-13sijxb",null,h,{"jse-open":c(I)})),fe("click",f,function(){if(c(C)){N(I,!0);var k={items:g()(c(i)),selectedItem:c(n),onSelect:d};A=o(_wA,k,{anchor:c(C),closeOnOuterClick:!0,onClose:()=>{N(I,!1)}})}}),CA(t,E),Ft()}function WR(t){var e,A;if(navigator.clipboard)return navigator.clipboard.writeText(t);if((e=(A=document).queryCommandSupported)!==null&&e!==void 0&&e.call(A,"copy")){var i=document.createElement("textarea");i.value=t,i.style.position="fixed",i.style.opacity="0",document.body.appendChild(i),i.select();try{document.execCommand("copy")}catch(n){console.error(n)}finally{document.body.removeChild(i)}return Promise.resolve()}return console.error("Copy failed."),Promise.resolve()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-navigation-bar-path-editor.svelte-uyexy4 { + flex: 1; + display: flex; + border: var(--jse-edit-outline, 2px solid #656565); + background: var(--jse-background-color, #fff); +} +.jse-navigation-bar-path-editor.svelte-uyexy4 input.jse-navigation-bar-text:where(.svelte-uyexy4) { + flex: 1; + font-family: inherit; + font-size: inherit; + padding: 0 5px 1px; + background: var(--jse-background-color, #fff); + color: var(--jse-text-color, #4d4d4d); + border: none; + outline: none; +} +.jse-navigation-bar-path-editor.svelte-uyexy4 button:where(.svelte-uyexy4) { + border: none; + background: var(--jse-background-color, #fff); + cursor: pointer; + font-family: inherit; + font-size: 80%; + color: inherit; +} +.jse-navigation-bar-path-editor.svelte-uyexy4 button.jse-navigation-bar-copy.copied:where(.svelte-uyexy4) { + color: var(--message-success-background, #9ac45d); +} +.jse-navigation-bar-path-editor.svelte-uyexy4 button.jse-navigation-bar-validation-error:where(.svelte-uyexy4) { + color: var(--jse-error-color, #ee5341); +} +.jse-navigation-bar-path-editor.error.svelte-uyexy4 { + border-color: var(--jse-error-color, #ee5341); +} +.jse-navigation-bar-path-editor.error.svelte-uyexy4 input.jse-navigation-bar-text:where(.svelte-uyexy4) { + color: var(--jse-error-color, #ee5341); +} +.jse-navigation-bar-path-editor.svelte-uyexy4 .jse-copied-text:where(.svelte-uyexy4) { + background: var(--message-success-background, #9ac45d); + color: var(--jse-message-success-color, #fff); + position: relative; + margin: 2px; + padding: 0 5px; + border-radius: 3px; +}`);var FwA=JA(''),LwA=JA('
      Copied!
      '),GwA=JA('
      ');function KwA(t,e){Nt(e,!1);var A=EA(),i=kI("absolute-popup"),n=L(e,"path",8),o=L(e,"pathParser",8),a=L(e,"onChange",8),r=L(e,"onClose",8),s=L(e,"onError",8),l=L(e,"pathExists",8),g=EA(),C=EA(),I=EA(!1),d=void 0,h=EA(!1);function E(){c(g).focus()}function f(Z){try{var tA=o().parse(Z);return(function(W){if(!l()(W))throw new Error("Path does not exist in current document")})(tA),{path:tA,error:void 0}}catch(W){return{path:void 0,error:W}}}As(()=>{E()}),Dg(()=>{clearTimeout(d)}),KA(()=>(K(o()),K(n())),()=>{N(C,o().stringify(n()))}),KA(()=>(c(I),c(C)),()=>{N(A,c(I)?f(c(C)).error:void 0)}),Rn(),ni();var m,v=GwA(),k=dA(v);Oo(k,Z=>N(g,Z),()=>c(g));var S=_A(k,2),b=Z=>{var tA=FwA();tn(dA(tA),{get data(){return z2}}),ms(tA,(W,BA)=>Hh?.(W,BA),()=>Me({text:String(c(A)||"")},i)),CA(Z,tA)};jA(S,Z=>{c(A)&&Z(b)});var x=_A(S,2),F=Z=>{CA(Z,LwA())};jA(x,Z=>{c(h)&&Z(F)});var z,P=_A(x,2);tn(dA(P),{get data(){return IC}}),Se(()=>{m=ii(v,1,"jse-navigation-bar-path-editor svelte-uyexy4",null,m,{error:c(A)}),Dd(k,c(C)),z=ii(P,1,"jse-navigation-bar-copy svelte-uyexy4",null,z,{copied:c(h)})}),fe("keydown",k,vC(function(Z){var tA=TC(Z);if(tA==="Escape"&&(Z.preventDefault(),r()()),tA==="Enter"){Z.preventDefault(),N(I,!0);var W=f(c(C));W.path!==void 0?a()(W.path):s()(W.error)}})),fe("input",k,function(Z){N(C,Z.currentTarget.value)}),fe("click",P,function(){WR(c(C)),N(h,!0),d=window.setTimeout(()=>N(h,!1),1e3),E()}),CA(t,v),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-navigation-bar.svelte-hjhal6 { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-button-color, inherit); + padding: 0; + margin: 0; + display: flex; + overflow: auto; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6) { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); + color: var(--jse-panel-color-readonly, #b2b2b2); + background: transparent; + border: none; + display: flex; + cursor: pointer; + outline: none; + align-items: center; +} +.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit.flex:where(.svelte-hjhal6) { + flex: 1; +} +.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6):focus, .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6):hover, .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit.editing:where(.svelte-hjhal6) { + background: var(--jse-panel-button-background-highlight, #e0e0e0); + color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); + transition: color 0.2s ease-in, background 0.2s ease-in; +} +.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6) .jse-navigation-bar-space:where(.svelte-hjhal6) { + flex: 1; + text-align: left; +}`);var UwA=JA(" ",1),TwA=JA('
      ');function JwA(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=or("jsoneditor:NavigationBar"),o=L(e,"json",9),a=L(e,"selection",9),r=L(e,"onSelect",9),s=L(e,"onError",9),l=L(e,"pathParser",9),g=EA(void 0,!0),C=EA(!1,!0);function I(tA){n("get items for path",tA);var W=Xe(o(),tA);if(Array.isArray(W))return K8(0,W.length).map(String);if(Mn(W)){var BA=Object.keys(W).slice(0);return BA.sort(ER),BA}return[]}function d(tA){return vr(o(),tA)}function h(tA){n("select path",JSON.stringify(tA)),r()(fs(tA,tA))}function E(){N(C,!1)}function f(tA){E(),h(tA)}KA(()=>(K(a()),It),()=>{N(A,a()?It(a()):[])}),KA(()=>(K(o()),c(A)),()=>{N(i,aa(Xe(o(),c(A))))}),KA(()=>c(A),()=>{c(A),setTimeout(()=>{if(c(g)&&c(g).scrollTo){var tA=c(g).scrollWidth-c(g).clientWidth;tA>0&&(n("scrollTo ",tA),c(g).scrollTo({left:tA,behavior:"smooth"}))}})}),Rn(),ni(!0);var m=TwA(),v=dA(m),k=tA=>{var W=UwA(),BA=et(W);da(BA,1,()=>c(A),ka,(AA,IA,aA)=>{LZ(AA,{getItems:I,get path(){return c(A)},index:aA,onSelect:h})});var X=_A(BA,2),iA=AA=>{LZ(AA,{getItems:I,get path(){return c(A)},get index(){return c(A),wA(()=>c(A).length)},onSelect:h})};jA(X,AA=>{c(i)&&AA(iA)}),CA(tA,W)},S=tA=>{KwA(tA,{get path(){return c(A)},onClose:E,onChange:f,get onError(){return s()},pathExists:d,get pathParser(){return l()}})};jA(v,tA=>{c(C)?tA(S,!1):tA(k)});var b,x=_A(v,2),F=dA(x),z=dA(F),P=_A(F,2),Z=it(()=>c(C)?bz:mz);tn(P,{get data(){return c(Z)}}),Oo(m,tA=>N(g,tA),()=>c(g)),Se(tA=>{b=ii(x,1,"jse-navigation-bar-edit svelte-hjhal6",null,b,{flex:!c(C),editing:c(C)}),_n(x,"title",c(C)?"Cancel editing the selected path":"Edit the selected path"),Lt(z,tA)},[()=>(K(aa),K(o()),c(C),wA(()=>aa(o())||c(C)?"\xA0":"Navigation bar"))]),fe("click",x,function(){N(C,!c(C))}),CA(t,m),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-search-box.svelte-1x1x8q0 { + border: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); + border-radius: 3px; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-color-readonly, #b2b2b2); + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); + display: inline-block; + width: 400px; + max-width: 100%; + overflow: auto; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) { + display: flex; + align-items: stretch; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0), +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) input:where(.svelte-1x1x8q0) { + font-family: inherit; + font-size: inherit; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0) { + display: block; + text-align: center; + border: none; + padding: 0 5px; + margin: 0; + cursor: pointer; + color: var(--jse-panel-button-color, inherit); + background: var(--jse-panel-button-background, transparent); +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0):hover { + color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); + background: var(--jse-panel-button-background-highlight, #e0e0e0); +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) input:where(.svelte-1x1x8q0) { + color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); + border: var(--jse-input-border, 1px solid #d8dbdf); + border-radius: 3px; + background: var(--jse-input-background, var(--jse-background-color, #fff)); + height: 28px; + padding: 0 5px; + margin: 0; + flex: 1; + width: 0; + min-width: 50px; + outline: none; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-replace-toggle:where(.svelte-1x1x8q0) { + padding: var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)); + min-width: 20px; + background: var(--jse-panel-button-background-highlight, #e0e0e0); +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) { + flex: 1; + display: flex; + flex-direction: column; + padding: calc(0.5 * var(--jse-padding, 10px)); + gap: calc(0.5 * var(--jse-padding, 10px)); +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) { + flex: 1; + display: flex; + align-items: center; + position: relative; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-icon:where(.svelte-1x1x8q0) { + color: inherit; + cursor: inherit; + background: inherit; + width: 32px; + text-align: center; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) label.jse-search-input-label:where(.svelte-1x1x8q0) { + flex: 1; + display: flex; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-count:where(.svelte-1x1x8q0) { + color: inherit; + font-size: 80%; + visibility: hidden; + padding: 0 5px; + min-width: 36px; + text-align: center; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-count.jse-visible:where(.svelte-1x1x8q0) { + visibility: visible; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-replace-section:where(.svelte-1x1x8q0) { + flex: 1; + display: flex; + padding-left: 32px; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-replace-section:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0) { + width: auto; +}`);var OwA=JA(''),YwA=JA('
      '),HwA=JA('');function J$(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=EA(void 0,!0),o=or("jsoneditor:SearchBox"),a=L(e,"json",9),r=L(e,"documentState",9),s=L(e,"parser",9),l=L(e,"showSearch",9),g=L(e,"showReplace",13),C=L(e,"readOnly",9),I=L(e,"columns",9),d=L(e,"onSearch",9),h=L(e,"onFocus",9),E=L(e,"onPatch",9),f=L(e,"onClose",9),m=EA("",!0),v="",k=EA("",!0),S=EA(!1,!0),b=EA(void 0,!0),x=ME(function(NA){return PA.apply(this,arguments)},300),F=ME(function(NA){return Je.apply(this,arguments)},300);function z(){g(!g()&&!C())}function P(NA){NA.stopPropagation();var ke=TC(NA);ke==="Enter"&&(NA.preventDefault(),c(m)!==v?x.flush():aA()),ke==="Shift+Enter"&&(NA.preventDefault(),uA()),ke==="Ctrl+Enter"&&(NA.preventDefault(),g()?BA():aA()),ke==="Ctrl+H"&&(NA.preventDefault(),z()),ke==="Escape"&&(NA.preventDefault(),fA())}function Z(NA){TC(NA)==="Enter"&&(NA.preventDefault(),NA.stopPropagation(),BA())}function tA(){return W.apply(this,arguments)}function W(){return(W=zt(function*(){Ro(),yield x.flush()})).apply(this,arguments)}function BA(){return X.apply(this,arguments)}function X(){return(X=zt(function*(){var NA;if(!C()){var ke=(NA=c(b))===null||NA===void 0?void 0:NA.activeItem;if(o("handleReplace",{replaceText:c(k),activeItem:ke}),c(b)&&ke&&a()!==void 0){N(b,Me(Me({},hZ(c(b))),{},{activeIndex:c(i)}));var{operations:HA,newSelection:vA}=l6A(a(),r(),c(k),ke,s());E()(HA,(Gt,ft)=>({state:ft,selection:vA})),Ro(),yield F.flush(),yield $A()}}})).apply(this,arguments)}function iA(){return AA.apply(this,arguments)}function AA(){return(AA=zt(function*(){if(!C()){o("handleReplaceAll",{text:c(m),replaceText:c(k)});var{operations:NA,newSelection:ke}=(function(HA,vA,Gt,ft,he){for(var Ot=QZ(Gt,HA,{maxResults:1/0}),He=[],je=0;je$.field!==oA.field?$.field===Qc.key?1:-1:oA.path.length-$.path.length);var oi,j=[];return He.forEach($=>{var{field:oA,path:sA,items:TA}=$;if(oA===Qc.key){var de=Yi(sA),Qe=Xe(HA,de),GA=ki(sA),OA=e3(de,Object.keys(Qe),GA,fZ(GA,ft,TA));j=j.concat(OA),oi=Yh(HA,OA)}else{if(oA!==Qc.value)throw new Error("Cannot replace: unknown type of search result field ".concat(oA));var ht=Xe(HA,sA);if(ht===void 0)throw new Error("Cannot replace: path not found ".concat(vt(sA)));var tt=typeof ht=="string"?ht:String(ht),ze=v0(HA,vA,sA),Oe=fZ(tt,ft,TA),Ci=[{op:"replace",path:vt(sA),value:ze?Oe:$h(Oe,he)}];j=j.concat(Ci),oi=Yh(HA,Ci)}}),{operations:j,newSelection:oi}})(a(),r(),c(m),c(k),s());E()(NA,(HA,vA)=>({state:vA,selection:ke})),yield $A()}})).apply(this,arguments)}function IA(NA){NA.select()}function aA(){return rA.apply(this,arguments)}function rA(){return(rA=zt(function*(){N(b,c(b)?hZ(c(b)):void 0),yield $A()})).apply(this,arguments)}function uA(){return UA.apply(this,arguments)}function UA(){return UA=zt(function*(){N(b,c(b)?(function(NA){var ke=NA.activeIndex>0?NA.activeIndex-1:NA.items.length-1,HA=NA.items[ke],vA=NA.items.map((Gt,ft)=>Me(Me({},Gt),{},{active:ft===ke}));return Me(Me({},NA),{},{items:vA,activeItem:HA,activeIndex:ke})})(c(b)):void 0),yield $A()}),UA.apply(this,arguments)}function $A(){return zA.apply(this,arguments)}function zA(){return(zA=zt(function*(){var NA;o("handleFocus",c(b));var ke=(NA=c(b))===null||NA===void 0?void 0:NA.activeItem;ke&&a()!==void 0&&(yield h()(ke.path,ke.resultIndex))})).apply(this,arguments)}function pA(){return pA=zt(function*(NA){yield _e(NA,c(m),a())}),pA.apply(this,arguments)}function PA(){return PA=zt(function*(NA){yield _e(l(),NA,a()),yield $A()}),PA.apply(this,arguments)}function Je(){return Je=zt(function*(NA){yield _e(l(),c(m),NA)}),Je.apply(this,arguments)}function _e(NA,ke,HA){return YA.apply(this,arguments)}function YA(){return YA=zt(function*(NA,ke,HA){return NA?(o("applySearch",{showSearch:NA,text:ke}),ke===""?(o("clearing search result"),c(b)!==void 0&&N(b,void 0),Promise.resolve()):(v=ke,N(S,!0),new Promise(vA=>{setTimeout(()=>{var Gt=QZ(ke,HA,{maxResults:M_,columns:I()});N(b,(function(ft,he){var Ot=he!=null&&he.activeItem?pZ(he.activeItem):void 0,He=ft.findIndex(xe=>Mi(Ot,pZ(xe))),je=He!==-1?He:he?.activeIndex!==void 0&&he?.activeIndex0?0:-1,pt=ft.map((xe,oi)=>Me(Me({resultIndex:oi},xe),{},{active:oi===je}));return{items:pt,activeItem:pt[je],activeIndex:je}})(Gt,c(b))),N(S,!1),vA()})}))):(c(b)&&N(b,void 0),Promise.resolve())}),YA.apply(this,arguments)}function fA(){o("handleClose"),x.cancel(),F.cancel(),_e(!1,c(m),a()),f()()}KA(()=>c(b),()=>{var NA;N(A,((NA=c(b))===null||NA===void 0||(NA=NA.items)===null||NA===void 0?void 0:NA.length)||0)}),KA(()=>c(b),()=>{var NA;N(i,((NA=c(b))===null||NA===void 0?void 0:NA.activeIndex)||0)}),KA(()=>(c(A),M_),()=>{N(n,c(A)>=M_?"".concat(999,"+"):String(c(A)))}),KA(()=>(K(d()),c(b)),()=>{d()(c(b))}),KA(()=>K(l()),()=>{(function(NA){pA.apply(this,arguments)})(l())}),KA(()=>c(m),()=>{x(c(m))}),KA(()=>K(a()),()=>{F(a())}),Rn(),ni(!0);var XA=Fi(),DA=et(XA),ee=NA=>{var ke=HwA(),HA=dA(ke),vA=dA(HA),Gt=GA=>{var OA=OwA(),ht=dA(OA),tt=it(()=>g()?c0:kE);tn(ht,{get data(){return c(tt)}}),fe("click",OA,z),CA(GA,OA)};jA(vA,GA=>{C()||GA(Gt)});var ft=dA(_A(vA,2)),he=dA(ft),Ot=dA(he),He=GA=>{tn(GA,{get data(){return pz},spin:!0})},je=GA=>{tn(GA,{get data(){return m4}})};jA(Ot,GA=>{c(S)?GA(He):GA(je,!1)});var pt=_A(he,2),xe=dA(pt);_r(()=>lD(xe,()=>c(m),GA=>N(m,GA))),ms(xe,GA=>IA?.(GA)),_r(()=>fe("paste",xe,tA));var oi,j=_A(pt,2),$=dA(j),oA=_A(j,2);tn(dA(oA),{get data(){return Mz}});var sA=_A(oA,2);tn(dA(sA),{get data(){return fz}});var TA=_A(sA,2);tn(dA(TA),{get data(){return D4}});var de=_A(ft,2),Qe=GA=>{var OA=YwA(),ht=dA(OA),tt=_A(ht,2),ze=_A(tt,2);lD(ht,()=>c(k),Oe=>N(k,Oe)),fe("keydown",ht,Z),fe("click",tt,BA),fe("click",ze,iA),CA(GA,OA)};jA(de,GA=>{g()&&!C()&&GA(Qe)}),Se(()=>{var GA;oi=ii(j,1,"jse-search-count svelte-1x1x8q0",null,oi,{"jse-visible":c(m)!==""}),Lt($,"".concat(c(i)!==-1&&c(i){l()&&NA(ee)}),CA(t,XA),Ft()}var Yf=Symbol("path");function zwA(t,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1/0,i={};Array.isArray(t)&&(function(o,a,r){if(o.length1?(o.length-1)/(a-1):o.length,l=0;l{Mn(o)?O$(o,i,e):i[Yf]=!0});var n=[];return Yf in i&&n.push([]),Y$(i,[],n,e),n}function O$(t,e,A){for(var i in t){var n=t[i],o=e[i]||(e[i]={});Mn(n)&&A?O$(n,o,A):o[Yf]===void 0&&(o[Yf]=!0)}}function Y$(t,e,A,i){for(var n in t){var o=e.concat(n),a=t[n];a&&a[Yf]===!0&&A.push(o),ia(a)&&i&&Y$(a,o,A,i)}}function PwA(t,e,A,i,n,o){for(var a=arguments.length>6&&arguments[6]!==void 0?arguments[6]:80,r=Vo(A)?A.length:0,s=(function(v,k){var S=Object.values(v);if(en(S))return k;var b=(x,F)=>x+F;return S.reduce(b)/S.length})(i,n),l=t-a,g=e+2*a,C=v=>i[v]||n,I=0,d=o;d0&&(d-=C(--I));for(var h=I,E=0;Ek0(i,o))}}function sd(t,e){var{rowIndex:A,columnIndex:i}=t;return[String(A),...e[i]]}function jwA(t,e){var[A,i]=T9(t,a=>SR(a.path[0])),n=K9(A,qwA),o=U9(n,a=>{var r={row:[],columns:{}};return a.forEach(s=>{var l=(function(g,C){var I=hg(g.path,C);return I.columnIndex!==-1?I.columnIndex:-1})(s,e);l!==-1?(r.columns[l]===void 0&&(r.columns[l]=[]),r.columns[l].push(s)):r.row.push(s)}),r});return{root:i,rows:o}}function Eh(t,e){if(e&&e.length!==0)return e.length===1?e[0]:{path:t,message:"Multiple validation issues: "+e.map(A=>Bl(A.path)+" "+A.message).join(", "),severity:hc.warning}}function qwA(t){return parseInt(t.path[0],10)}function VwA(t,e,A){var i=e.some(n=>(function(o,a,r){if(!o)return!1;if(a.op==="replace"){var s=Es(a.path),{rowIndex:l,columnIndex:g}=hg(s,r),C=r.findIndex(I=>Mi(I,o.path));if(l!==-1&&g!==-1&&g!==C)return!1}return!0})(t,n,A));return i?void 0:t}var ps=or("jsoneditor:actions");function H$(t){return hR.apply(this,arguments)}function hR(){return hR=zt(function*(t){var{json:e,selection:A,indentation:i,readOnly:n,parser:o,onPatch:a}=t;if(!n&&e!==void 0&&A&&Dh(A)){var r=C$(e,A,i,o);if(r!==void 0){ps("cut",{selection:A,clipboard:r,indentation:i}),yield WR(r);var{operations:s,newSelection:l}=Q$(e,A);a(s,(g,C)=>({state:C,selection:l}))}}}),hR.apply(this,arguments)}function z$(t){return QR.apply(this,arguments)}function QR(){return QR=zt(function*(t){var{json:e,selection:A,indentation:i,parser:n}=t,o=C$(e,A,i,n);o!==void 0&&(ps("copy",{clipboard:o,indentation:i}),yield WR(o))}),QR.apply(this,arguments)}function P$(t){var{clipboardText:e,json:A,selection:i,readOnly:n,parser:o,onPatch:a,onChangeText:r,onPasteMultilineText:s,openRepairModal:l}=t;if(!n)try{g(e)}catch(C){l(e,I=>{ps("repaired pasted text: ",I),g(I)})}function g(C){if(A!==void 0){var I=i||Hi([]),d=h$(A,I,C,o),h=(function(E,f,m){var v=arguments.length>3&&arguments[3]!==void 0?arguments[3]:e6A;if(E.length>v)return!1;var k=/\n/.test(E);if(!k)return!1;var S=f.some(x=>x.op==="replace"&&Array.isArray(x.value)),b=f.filter(x=>x.op==="add").length>1;if(!S&&!b)return!1;try{return Zf(E,m.parse),!1}catch(x){return!0}})(e,d,o);ps("paste",{pastedText:C,operations:d,ensureSelection:I,pasteMultilineText:h}),a(d,(E,f)=>{var m=f;return d.filter(v=>(I9(v)||$6(v))&&aa(v.value)).forEach(v=>{var k=il(A,v.path);m=vd(E,m,k)}),{state:m}}),h&&s(C)}else ps("paste text",{pastedText:C}),r(e,(E,f)=>{if(E)return{state:vd(E,f,[])}})}}function j$(t){var{json:e,text:A,selection:i,keepSelection:n,readOnly:o,onChange:a,onPatch:r}=t;if(!o&&i){var s=e!==void 0&&(nr(i)||En(i))?fs(i.path,i.path):i;if(en(It(i)))ps("remove root",{selection:i}),a&&a({text:"",json:void 0},e!==void 0?{text:void 0,json:e}:{text:A||"",json:e},{contentErrors:void 0,patchResult:void 0});else if(e!==void 0){var{operations:l,newSelection:g}=Q$(e,s);ps("remove",{operations:l,selection:i,newSelection:g}),r(l,(C,I)=>({state:I,selection:n?i:g}))}}}function yD(t){var{insertType:e,selectInside:A,initialValue:i,json:n,selection:o,readOnly:a,parser:r,onPatch:s,onReplaceJson:l}=t;if(!a){var g=(function(E,f,m){if(m==="object")return{};if(m==="array")return[];if(m==="structure"&&E!==void 0){var v=f?g$(f):[],k=Xe(E,v);if(Array.isArray(k)&&!en(k)){var S=lg(k);return aa(S)?N9(S,b=>Array.isArray(b)?[]:Mn(b)?void 0:""):""}}return""})(n,o,e);if(n!==void 0){var C=r.stringify(g),I=h$(n,o,C,r);ps("onInsert",{insertType:e,operations:I,newValue:g,data:C});var d=ki(I.filter(E=>E.op==="add"||E.op==="replace"));s(I,(E,f,m)=>{if(d){var v=il(E,d.path);if(aa(g))return{state:Bc(E,f,v,HR),selection:A?OC(v):m};if(g===""){var k=en(v)?void 0:Xe(E,Yi(v));return{state:Bc(E,f,v,tD),selection:Mn(k)?zR(v,i):BD(v,i)}}}}),ps("after patch")}else{ps("onInsert",{insertType:e,newValue:g});var h=[];l(g,(E,f)=>({state:vd(E,f,h),selection:aa(g)?OC(h):BD(h)}))}}}function q$(t){return uR.apply(this,arguments)}function uR(){return uR=zt(function*(t){var{char:e,selectInside:A,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s,onSelect:l}=t;o||(nr(n)?l(Me(Me({},n),{},{edit:!0,initialValue:e})):e==="{"?yD({insertType:"object",selectInside:A,initialValue:void 0,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s}):e==="["?yD({insertType:"array",selectInside:A,initialValue:void 0,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s}):En(n)&&i!==void 0?aa(Xe(i,n.path))||l(Me(Me({},n),{},{edit:!0,initialValue:e})):(ps("onInsertValueWithCharacter",{char:e}),yield(function(g){return fR.apply(this,arguments)})({char:e,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s})))}),uR.apply(this,arguments)}function fR(){return fR=zt(function*(t){var{char:e,json:A,selection:i,readOnly:n,parser:o,onPatch:a,onReplaceJson:r}=t;n||yD({insertType:"value",selectInside:!1,initialValue:e,json:A,selection:i,readOnly:n,parser:o,onPatch:a,onReplaceJson:r})}),fR.apply(this,arguments)}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-json-preview.svelte-25xmyd { + flex: 1; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-panel-color-readonly, #b2b2b2); + overflow: auto; + white-space: pre-wrap; + padding: 2px; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +}`);var WwA=JA('
      ');function V$(t,e){Nt(e,!1);var A=EA(),i=EA(),n=L(e,"text",8),o=L(e,"json",8),a=L(e,"indentation",8),r=L(e,"parser",8);KA(()=>(K(o()),K(n())),()=>{N(A,o()!==void 0?{json:o()}:{text:n()||""})}),KA(()=>(c(A),K(a()),K(r()),cD),()=>{N(i,SC(eR(c(A),a(),r()),cD))}),Rn(),ni();var s=WwA(),l=dA(s);Se(()=>Lt(l,c(i))),CA(t,s),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +button.jse-context-menu-button.svelte-16jz6ui { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + flex: 1; + white-space: nowrap; + padding: var(--jse-padding, 10px); + color: inherit; +} +button.jse-context-menu-button.svelte-16jz6ui:hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +} +button.jse-context-menu-button.svelte-16jz6ui:focus { + background: var(--jse-context-menu-background-highlight, #7a7a7a); + z-index: 1; +} +button.jse-context-menu-button.svelte-16jz6ui:disabled { + color: var(--jse-context-menu-color-disabled, #9d9d9d); + background: unset; +} +button.jse-context-menu-button.left.svelte-16jz6ui { + text-align: left; +} +button.jse-context-menu-button.svelte-16jz6ui svg { + width: 16px; +}`);var ZwA=JA('');function J_(t,e){Nt(e,!1);var A=L(e,"item",8),i=L(e,"className",8,void 0),n=L(e,"onRequestClose",8);ni();var o=ZwA(),a=dA(o),r=g=>{tn(g,{get data(){return K(A()),wA(()=>A().icon)}})};jA(a,g=>{K(A()),wA(()=>A().icon)&&g(r)});var s=_A(a,2),l=g=>{var C=dr();Se(()=>Lt(C,(K(A()),wA(()=>A().text)))),CA(g,C)};jA(s,g=>{K(A()),wA(()=>A().text)&&g(l)}),Se(g=>{ii(o,1,g,"svelte-16jz6ui"),_n(o,"title",(K(A()),wA(()=>A().title))),o.disabled=(K(A()),wA(()=>A().disabled||!1))},[()=>bI((K(wc),K(i()),K(A()),wA(()=>wc("jse-context-menu-button",i(),A().className))))]),fe("click",o,g=>{n()(),A().onClick(g)}),CA(t,o),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-dropdown-button.svelte-bov1j6 { + flex: 1; + line-height: normal; + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + position: relative; + padding: 0; + display: flex; +} +.jse-dropdown-button.svelte-bov1j6 ul:where(.svelte-bov1j6) { + margin: 0; + padding: 0; +} +.jse-dropdown-button.svelte-bov1j6 ul:where(.svelte-bov1j6) li:where(.svelte-bov1j6) { + margin: 0; + padding: 0; + list-style-type: none; +} +.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + width: 2em; + background: var(--jse-context-menu-background, #656565); + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); + border-radius: 0; +} +.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown.jse-visible:where(.svelte-bov1j6) { + background: var(--jse-context-menu-background, #656565); +} +.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +} +.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):focus { + z-index: 1; +} +.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):disabled { + color: var(--jse-context-menu-color-disabled, #9d9d9d); + background: unset; +} +.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) { + display: none; + position: absolute; + top: 100%; + left: 0; + z-index: 1; + background: var(--jse-context-menu-background, #656565); + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); +} +.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items.jse-visible:where(.svelte-bov1j6) { + display: block; +} +.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + width: 100%; + text-align: left; + padding: var(--jse-padding, 10px); + margin: 0; +} +.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6):hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +} +.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6):disabled { + color: var(--jse-context-menu-color-disabled, #9d9d9d); + background: unset; +}`);var XwA=JA('
    • '),$wA=JA('
        ');Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +button.jse-context-menu-button.svelte-1y5l9l1 { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + flex: 1; + white-space: nowrap; + padding: var(--jse-padding, 10px); + color: inherit; +} +button.jse-context-menu-button.svelte-1y5l9l1:hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +} +button.jse-context-menu-button.svelte-1y5l9l1:focus { + background: var(--jse-context-menu-background-highlight, #7a7a7a); + z-index: 1; +} +button.jse-context-menu-button.svelte-1y5l9l1:disabled { + color: var(--jse-context-menu-color-disabled, #9d9d9d); + background: unset; +} +button.jse-context-menu-button.left.svelte-1y5l9l1 { + text-align: left; +} +button.jse-context-menu-button.svelte-1y5l9l1 svg { + width: 16px; +}`);var A5A=JA('');function O_(t,e){Nt(e,!1);var A=EA(),i=L(e,"item",8),n=L(e,"className",8,void 0),o=L(e,"onRequestClose",8);KA(()=>(K(i()),K(o())),()=>{N(A,i().items.map(a=>Me(Me({},a),{},{onClick:r=>{o()(),a.onClick(r)}})))}),Rn(),ni(),(function(a,r){Nt(r,!1);var s=EA(void 0,!0),l=L(r,"items",25,()=>[]),g=L(r,"title",9,void 0),C=L(r,"width",9,"120px"),I=EA(!1,!0);function d(){N(I,!1)}function h(b){TC(b)==="Escape"&&(b.preventDefault(),N(I,!1))}As(()=>{document.addEventListener("click",d),document.addEventListener("keydown",h)}),Dg(()=>{document.removeEventListener("click",d),document.removeEventListener("keydown",h)}),KA(()=>K(l()),()=>{N(s,l().every(b=>b.disabled===!0))}),Rn(),ni(!0);var E=$wA(),f=dA(E);Ia(f,r,"defaultItem",{},null);var m,v=_A(f,2);tn(dA(v),{get data(){return c0}});var k,S=_A(v,2);da(dA(S),5,l,ka,(b,x)=>{var F=XwA(),z=dA(F),P=dA(z),Z=W=>{tn(W,{get data(){return c(x),wA(()=>c(x).icon)}})};jA(P,W=>{c(x),wA(()=>c(x).icon)&&W(Z)});var tA=_A(P);Se(()=>{var W;_n(z,"title",(c(x),wA(()=>c(x).title))),z.disabled=(c(x),wA(()=>c(x).disabled)),ii(z,1,bI((c(x),wA(()=>c(x).className))),"svelte-bov1j6"),Lt(tA," ".concat((c(x),(W=wA(()=>c(x).text))!==null&&W!==void 0?W:"")))}),fe("click",z,W=>c(x).onClick(W)),CA(b,F)}),Se(()=>{var b;_n(E,"title",g()),m=ii(v,1,"jse-open-dropdown svelte-bov1j6",null,m,{"jse-visible":c(I)}),v.disabled=c(s),k=ii(S,1,"jse-dropdown-items svelte-bov1j6",null,k,{"jse-visible":c(I)}),mg(S,"width: ".concat((b=C())!==null&&b!==void 0?b:"",";"))}),fe("click",v,function(){var b=c(I);setTimeout(()=>N(I,!b))}),fe("click",E,d),CA(a,E),Ft()})(t,{get width(){return K(i()),wA(()=>i().width)},get items(){return c(A)},$$slots:{defaultItem:(a,r)=>{var s=A5A(),l=dA(s),g=I=>{tn(I,{get data(){return K(i()),wA(()=>i().main.icon)}})};jA(l,I=>{K(i()),wA(()=>i().main.icon)&&I(g)});var C=_A(l);Se(I=>{var d;ii(s,1,I,"svelte-1y5l9l1"),_n(s,"title",(K(i()),wA(()=>i().main.title))),s.disabled=(K(i()),wA(()=>i().main.disabled||!1)),Lt(C," ".concat((K(i()),(d=wA(()=>i().main.text))!==null&&d!==void 0?d:"")))},[()=>bI((K(wc),K(n()),K(i()),wA(()=>wc("jse-context-menu-button",n(),i().main.className))))]),fe("click",s,I=>{o()(),i().main.onClick(I)}),CA(a,s)}}}),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-contextmenu.svelte-1shjn02 { + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + background: var(--jse-context-menu-background, #656565); + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); +} +.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) { + display: flex; + flex-direction: row; + align-items: flex-start; + justify-content: stretch; +} +.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-label:where(.svelte-1shjn02) { + flex: 1; + white-space: nowrap; + padding: var(--jse-padding, 10px); + color: var(--jse-context-menu-color-disabled, #9d9d9d); + line-height: normal; +} +.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-tip:where(.svelte-1shjn02) { + flex: 1; + background: var(--jse-context-menu-tip-background, rgba(255, 255, 255, 0.2)); + color: var(--context-menu-tip-color, inherit); + margin: calc(0.5 * var(--jse-padding, 10px)); + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); + font-size: 80%; + line-height: 1.3em; + display: flex; + flex-direction: row; + align-items: flex-start; + gap: var(--jse-padding, 10px); + border-radius: 3px; +} +.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-tip:where(.svelte-1shjn02) div.jse-tip-icon:where(.svelte-1shjn02) { + padding-top: calc(0.5 * var(--jse-padding, 10px)); +} +.jse-contextmenu.svelte-1shjn02 .jse-column:where(.svelte-1shjn02) { + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; +} +.jse-contextmenu.svelte-1shjn02 .jse-column:where(.svelte-1shjn02):not(:last-child) { + border-right: 1px solid var(--jse-context-menu-separator-color, #7a7a7a); +} +.jse-contextmenu.svelte-1shjn02 .jse-separator:where(.svelte-1shjn02) { + width: 100%; + height: 1px; + background: var(--jse-context-menu-separator-color, #7a7a7a); +}`);var e5A=JA('
        '),t5A=JA('
        '),i5A=JA('
        '),n5A=JA('
        '),o5A=JA('
        '),a5A=JA('
        '),r5A=JA('
        '),s5A=JA('');function W$(t,e){Nt(e,!1);var A=L(e,"items",9),i=L(e,"onRequestClose",9),n=L(e,"tip",9),o=EA(void 0,!0);As(()=>{var I=Array.from(c(o).querySelectorAll("button")).find(d=>!d.disabled);I&&I.focus()});var a={ArrowUp:"Up",ArrowDown:"Down",ArrowLeft:"Left",ArrowRight:"Right"};function r(I){return console.error("Unknown type of context menu item",I),"???"}ni(!0);var s=s5A(),l=dA(s);da(l,1,A,ka,(I,d)=>{var h=Fi(),E=et(h),f=v=>{J_(v,{get item(){return c(d)},get onRequestClose(){return i()}})},m=v=>{var k=Fi(),S=et(k),b=F=>{O_(F,{get item(){return c(d)},get onRequestClose(){return i()}})},x=F=>{var z=Fi(),P=et(z),Z=W=>{var BA=o5A();da(BA,5,()=>(c(d),wA(()=>c(d).items)),ka,(X,iA)=>{var AA=Fi(),IA=et(AA),aA=uA=>{J_(uA,{get item(){return c(iA)},get onRequestClose(){return i()}})},rA=uA=>{var UA=Fi(),$A=et(UA),zA=PA=>{O_(PA,{get item(){return c(iA)},get onRequestClose(){return i()}})},pA=PA=>{var Je=Fi(),_e=et(Je),YA=XA=>{var DA=i5A();da(DA,5,()=>(c(iA),wA(()=>c(iA).items)),ka,(ee,NA)=>{var ke=Fi(),HA=et(ke),vA=ft=>{J_(ft,{className:"left",get item(){return c(NA)},get onRequestClose(){return i()}})},Gt=ft=>{var he=Fi(),Ot=et(he),He=pt=>{O_(pt,{className:"left",get item(){return c(NA)},get onRequestClose(){return i()}})},je=pt=>{var xe=Fi(),oi=et(xe),j=oA=>{CA(oA,e5A())},$=oA=>{var sA=Fi(),TA=et(sA),de=GA=>{var OA=t5A(),ht=dA(OA);Se(()=>Lt(ht,(c(NA),wA(()=>c(NA).text)))),CA(GA,OA)},Qe=GA=>{var OA=dr();Se(ht=>Lt(OA,ht),[()=>(c(NA),wA(()=>r(c(NA))))]),CA(GA,OA)};jA(TA,GA=>{K(tZ),c(NA),wA(()=>tZ(c(NA)))?GA(de):GA(Qe,!1)},!0),CA(oA,sA)};jA(oi,oA=>{K(dI),c(NA),wA(()=>dI(c(NA)))?oA(j):oA($,!1)},!0),CA(pt,xe)};jA(Ot,pt=>{K(dh),c(NA),wA(()=>dh(c(NA)))?pt(He):pt(je,!1)},!0),CA(ft,he)};jA(HA,ft=>{K(bC),c(NA),wA(()=>bC(c(NA)))?ft(vA):ft(Gt,!1)}),CA(ee,ke)}),CA(XA,DA)},fA=XA=>{var DA=Fi(),ee=et(DA),NA=HA=>{CA(HA,n5A())},ke=HA=>{var vA=dr();Se(Gt=>Lt(vA,Gt),[()=>(c(iA),wA(()=>r(c(iA))))]),CA(HA,vA)};jA(ee,HA=>{K(dI),c(iA),wA(()=>dI(c(iA)))?HA(NA):HA(ke,!1)},!0),CA(XA,DA)};jA(_e,XA=>{K(nZ),c(iA),wA(()=>nZ(c(iA)))?XA(YA):XA(fA,!1)},!0),CA(PA,Je)};jA($A,PA=>{K(dh),c(iA),wA(()=>dh(c(iA)))?PA(zA):PA(pA,!1)},!0),CA(uA,UA)};jA(IA,uA=>{K(bC),c(iA),wA(()=>bC(c(iA)))?uA(aA):uA(rA,!1)}),CA(X,AA)}),CA(W,BA)},tA=W=>{var BA=Fi(),X=et(BA),iA=IA=>{CA(IA,a5A())},AA=IA=>{var aA=dr();Se(rA=>Lt(aA,rA),[()=>(c(d),wA(()=>r(c(d))))]),CA(IA,aA)};jA(X,IA=>{K(dI),c(d),wA(()=>dI(c(d)))?IA(iA):IA(AA,!1)},!0),CA(W,BA)};jA(P,W=>{K(iZ),c(d),wA(()=>iZ(c(d)))?W(Z):W(tA,!1)},!0),CA(F,z)};jA(S,F=>{K(dh),c(d),wA(()=>dh(c(d)))?F(b):F(x,!1)},!0),CA(v,k)};jA(E,v=>{K(bC),c(d),wA(()=>bC(c(d)))?v(f):v(m,!1)}),CA(I,h)});var g=_A(l,2),C=I=>{var d=r5A(),h=dA(d),E=dA(h);tn(dA(E),{get data(){return dz}});var f=dA(_A(E,2));Se(()=>Lt(f,n())),CA(I,d)};jA(g,I=>{n()&&I(C)}),Oo(s,I=>N(o,I),()=>c(o)),fe("keydown",s,function(I){var d=TC(I),h=a[d];if(h&&I.target){I.preventDefault();var E=NmA({allElements:Array.from(c(o).querySelectorAll("button:not([disabled])")),currentElement:I.target,direction:h,hasPrio:f=>f.getAttribute("data-type")!=="jse-open-dropdown"});E&&E.focus()}}),CA(t,s),Ft()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-value.jse-string.svelte-1htmvf1 { + color: var(--jse-value-color-string, #008000); +} +.jse-value.jse-object.svelte-1htmvf1, .jse-value.jse-array.svelte-1htmvf1 { + min-width: 16px; + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); +} +.jse-value.jse-number.svelte-1htmvf1 { + color: var(--jse-value-color-number, #ee422e); +} +.jse-value.jse-boolean.svelte-1htmvf1 { + color: var(--jse-value-color-boolean, #ff8c00); +} +.jse-value.jse-null.svelte-1htmvf1 { + color: var(--jse-value-color-null, #004ed0); +} +.jse-value.jse-invalid.svelte-1htmvf1 { + color: var(--jse-text-color, #4d4d4d); +} +.jse-value.jse-url.svelte-1htmvf1 { + color: var(--jse-value-color-url, #008000); + text-decoration: underline; +} + +.jse-enum-value.svelte-1htmvf1 { + background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); + border: none; + padding: 0; + font-family: inherit; + font-size: inherit; + cursor: pointer; + outline: none; +} +.jse-enum-value.jse-selected.svelte-1htmvf1 { + background: var(--jse-selection-background-color, #d3d3d3); + color: inherit; +} +.jse-enum-value.jse-value.svelte-1htmvf1:focus { + color: var(--jse-text-color, #4d4d4d); +}`);var $Ee=JA(""),Ahe=JA("");var P5,j5;function q5(t,e){return P5||(j5=new WeakMap,P5=new ResizeObserver(A=>{for(var i of A){var n=j5.get(i.target);n&&n(i.target)}})),j5.set(t,e),P5.observe(t),{destroy:()=>{j5.delete(t),P5.unobserve(t)}}}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-tree-mode.svelte-10mlrw4 { + flex: 1; + display: flex; + flex-direction: column; + position: relative; + background: var(--jse-background-color, #fff); + min-width: 0; + min-height: 0; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-text-color, #4d4d4d); + line-height: var(--jse-line-height, calc(1em + 4px)); +} +.jse-tree-mode.svelte-10mlrw4 .jse-hidden-input-label:where(.svelte-10mlrw4) .jse-hidden-input:where(.svelte-10mlrw4) { + position: fixed; + top: -10px; + left: -10px; + width: 1px; + height: 1px; + padding: 0; + border: 0; + outline: none; +} +.jse-tree-mode.no-main-menu.svelte-10mlrw4 { + border-top: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-tree-mode.svelte-10mlrw4 .jse-search-box-container:where(.svelte-10mlrw4) { + position: relative; + height: 0; + top: var(--jse-padding, 10px); + margin-right: calc(var(--jse-padding, 10px) + 20px); + margin-left: var(--jse-padding, 10px); + text-align: right; + z-index: 3; +} +.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) { + flex: 1; + overflow: auto; + position: relative; + padding: 2px; + display: flex; + flex-direction: column; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4):last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-loading-space:where(.svelte-10mlrw4) { + flex: 1; +} +.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-loading:where(.svelte-10mlrw4) { + flex: 2; + text-align: center; + color: var(--jse-panel-color-readonly, #b2b2b2); + box-sizing: border-box; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +} +.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-search-box-background:where(.svelte-10mlrw4) { + border: 50px solid var(--jse-modal-background, #f5f5f5); + margin: -2px; + margin-bottom: 2px; + display: inline-block; +}`);var l5A=JA(" ",1),g5A=JA('
        '),c5A=JA('
        ',1),C5A=JA(' ',1),I5A=JA('
        loading...
        '),d5A=JA('
        ',1);function pR(t,e){Nt(e,!1);var A=EA(void 0,!0),i=or("jsoneditor:TreeMode"),n=typeof window>"u";i("isSSR:",n);var o=Y2(),a=Y2(),{openAbsolutePopup:r,closeAbsolutePopup:s}=kI("absolute-popup"),l=EA(void 0,!0),g=EA(void 0,!0),C=EA(void 0,!0),I=!1,d=R$(),h=L(e,"readOnly",9),E=L(e,"externalContent",9),f=L(e,"externalSelection",9),m=L(e,"history",9),v=L(e,"truncateTextSize",9),k=L(e,"mainMenuBar",9),S=L(e,"navigationBar",9),b=L(e,"escapeControlCharacters",9),x=L(e,"escapeUnicodeCharacters",9),F=L(e,"parser",9),z=L(e,"parseMemoizeOne",9),P=L(e,"validator",9),Z=L(e,"validationParser",9),tA=L(e,"pathParser",9),W=L(e,"indentation",9),BA=L(e,"onError",9),X=L(e,"onChange",9),iA=L(e,"onChangeMode",9),AA=L(e,"onSelect",9),IA=L(e,"onUndo",9),aA=L(e,"onRedo",9),rA=L(e,"onRenderValue",9),uA=L(e,"onRenderMenu",9),UA=L(e,"onRenderContextMenu",9),$A=L(e,"onClassName",9),zA=L(e,"onFocus",9),pA=L(e,"onBlur",9),PA=L(e,"onSortModal",9),Je=L(e,"onTransformModal",9),_e=L(e,"onJSONEditorModal",9),YA=!1,fA=EA(!1,!0),XA=EA(void 0,!0);qR({onMount:As,onDestroy:Dg,getWindow:()=>Xf(c(C)),hasFocus:()=>YA&&document.hasFocus()||RR(c(C)),onFocus:()=>{I=!0,zA()&&zA()()},onBlur:()=>{I=!1,pA()&&pA()()}});var DA=EA(void 0,!0),ee=EA(void 0,!0),NA=void 0,ke=!1,HA=EA(oR({json:c(DA)}),!0),vA=EA(Kf(f())?f():void 0,!0);function Gt(eA){N(vA,eA)}As(()=>{if(c(vA)){var eA=It(c(vA));N(HA,Bc(c(DA),c(HA),eA,tD)),setTimeout(()=>Fo(eA))}});var ft,he=EA(void 0,!0),Ot=EA(void 0,!0),He=EA(void 0,!0),je=EA(void 0,!0),pt=EA(!1,!0),xe=EA(!1,!0);function oi(eA){N(je,(ft=eA)?f$(c(DA),ft.items):void 0)}function j(eA,yA){return $.apply(this,arguments)}function $(){return($=zt(function*(eA,yA){N(HA,Bc(c(DA),c(HA),eA,tD));var WA=ho(yA);yield Ui(eA,{element:WA})})).apply(this,arguments)}function oA(){N(pt,!1),N(xe,!1),_t()}function sA(eA){i("select validation error",eA),N(vA,Hi(eA.path)),Ui(eA.path)}function TA(eA){var yA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:aR;i("expand"),N(HA,Bc(c(DA),c(HA),eA,yA))}function de(eA,yA){N(HA,sZ(c(DA),c(HA),eA,yA)),c(vA)&&(function(WA,Ge){return k0(It(WA),Ge)&&(It(WA).length>Ge.length||Va(WA))})(c(vA),eA)&&N(vA,void 0)}var Qe=EA(!1,!0),GA=EA([],!0),OA=EA(void 0,!0),ht=xE(N$);function tt(eA,yA,WA,Ge){vh(()=>{var ye;try{ye=ht(eA,yA,WA,Ge)}catch(be){ye=[{path:[],message:"Failed to validate: "+be.message,severity:hc.warning}]}Mi(ye,c(GA))||(i("validationErrors changed:",ye),N(GA,ye),N(OA,(function(be,ot){var Vt;return ot.forEach(Gi=>{Vt=NZ(be,Vt,Gi.path,(Fn,$i)=>Me(Me({},$i),{},{validationError:Gi}))}),ot.forEach(Gi=>{for(var Fn=Gi.path;Fn.length>0;)Fn=Yi(Fn),Vt=NZ(be,Vt,Fn,($i,Qo)=>Qo.validationError?Qo:Me(Me({},Qo),{},{validationError:{isChildError:!0,path:Fn,message:"Contains invalid data",severity:hc.warning}}))}),Vt})(eA,c(GA))))},ye=>i("validationErrors updated in ".concat(ye," ms")))}function ze(){return i("validate"),NA?{parseError:NA,isRepairable:!1}:(tt(c(DA),P(),F(),Z()),en(c(GA))?void 0:{validationErrors:c(GA)})}function Oe(){return c(DA)}function Ci(){return c(HA)}function gn(){return c(vA)}function hn(eA){i("applyExternalContent",{updatedContent:eA}),Nf(eA)?(function(yA){if(yA!==void 0){var WA=!Mi(c(DA),yA);if(i("update external json",{isChanged:WA,currentlyText:c(DA)===void 0}),!!WA){var Ge={documentState:c(HA),selection:c(vA),json:c(DA),text:c(ee),textIsRepaired:c(Qe)};N(DA,yA),N(HA,Ul(yA,c(HA))),Ke(c(DA)),N(ee,void 0),N(Qe,!1),NA=void 0,nn(c(DA)),Si(Ge)}}})(eA.json):Rf(eA)&&(function(yA){if(!(yA===void 0||Nf(E()))){var WA=yA!==c(ee);if(i("update external text",{isChanged:WA}),!!WA){var Ge={documentState:c(HA),selection:c(vA),json:c(DA),text:c(ee),textIsRepaired:c(Qe)};try{N(DA,z()(yA)),N(HA,Ul(c(DA),c(HA))),Ke(c(DA)),N(ee,yA),N(Qe,!1),NA=void 0}catch(ye){try{N(DA,z()(ag(yA))),N(HA,Ul(c(DA),c(HA))),Ke(c(DA)),N(ee,yA),N(Qe,!0),NA=void 0,nn(c(DA))}catch(be){N(DA,void 0),N(HA,void 0),N(ee,E().text),N(Qe,!1),NA=c(ee)!==void 0&&c(ee)!==""?Th(c(ee),ye.message||String(ye)):void 0}}nn(c(DA)),Si(Ge)}}})(eA.text)}function Ke(eA){ke||(ke=!0,N(HA,vd(eA,c(HA),[])))}function nn(eA){c(vA)&&(vr(eA,hd(c(vA)))&&vr(eA,It(c(vA)))||(i("clearing selection: path does not exist anymore",c(vA)),N(vA,Bh(eA,c(HA)))))}function Si(eA){if(eA.json!==void 0||eA.text!==void 0){var yA=c(DA)!==void 0&&eA.json!==void 0;m().add({type:"tree",undo:{patch:yA?[{op:"replace",path:"",value:eA.json}]:void 0,json:eA.json,text:eA.text,documentState:eA.documentState,textIsRepaired:eA.textIsRepaired,selection:D0(eA.selection),sortedColumn:void 0},redo:{patch:yA?[{op:"replace",path:"",value:c(DA)}]:void 0,json:c(DA),text:c(ee),documentState:c(HA),textIsRepaired:c(Qe),selection:D0(c(vA)),sortedColumn:void 0}})}}function Li(eA,yA){var WA;if(i("patch",eA,yA),c(DA)===void 0)throw new Error("Cannot apply patch: no JSON");var Ge=c(DA),ye={json:void 0,text:c(ee),documentState:c(HA),selection:D0(c(vA)),textIsRepaired:c(Qe),sortedColumn:void 0},be=u$(c(DA),eA),ot=r$(c(DA),c(HA),eA),Vt=(WA=Yh(c(DA),eA))!==null&&WA!==void 0?WA:c(vA),Gi=typeof yA=="function"?yA(ot.json,ot.documentState,Vt):void 0;return N(DA,Gi?.json!==void 0?Gi.json:ot.json),N(HA,Gi?.state!==void 0?Gi.state:ot.documentState),N(vA,Gi?.selection!==void 0?Gi.selection:Vt),N(ee,void 0),N(Qe,!1),N(Ot,void 0),N(He,void 0),NA=void 0,nn(c(DA)),m().add({type:"tree",undo:Me({patch:be},ye),redo:{patch:eA,json:void 0,text:c(ee),documentState:c(HA),selection:D0(c(vA)),sortedColumn:void 0,textIsRepaired:c(Qe)}}),{json:c(DA),previousJson:Ge,undo:be,redo:eA}}function Zi(){!h()&&c(vA)&&N(vA,zR(It(c(vA))))}function bt(){if(!h()&&c(vA)){var eA=It(c(vA)),yA=Xe(c(DA),eA);aa(yA)?(function(WA,Ge){i("openJSONEditorModal",{path:WA,value:Ge}),YA=!0,_e()({content:{json:Ge},path:WA,onPatch:c(M).onPatch,onClose:()=>{YA=!1,setTimeout(_t)}})})(eA,yA):N(vA,BD(eA))}}function on(){if(!h()&&En(c(vA))){var eA=It(c(vA)),yA=vt(eA),WA=Xe(c(DA),eA),Ge=!v0(c(DA),c(HA),eA),ye=Ge?String(WA):$h(String(WA),F());i("handleToggleEnforceString",{enforceString:Ge,value:WA,updatedValue:ye}),Ae([{op:"replace",path:yA,value:ye}],(be,ot)=>({state:_D(c(DA),ot,eA,{type:"value",enforceString:Ge})}))}}function Kt(){return c(Qe)&&c(DA)!==void 0&&De(c(DA)),c(DA)!==void 0?{json:c(DA)}:{text:c(ee)||""}}function G(){return dt.apply(this,arguments)}function dt(){return dt=zt(function*(){var eA=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];yield H$({json:c(DA),selection:c(vA),indentation:eA?W():void 0,readOnly:h(),parser:F(),onPatch:Ae})}),dt.apply(this,arguments)}function Ei(){return Qn.apply(this,arguments)}function Qn(){return Qn=zt(function*(){var eA=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];c(DA)!==void 0&&(yield z$({json:c(DA),selection:c(vA),indentation:eA?W():void 0,parser:F()}))}),Qn.apply(this,arguments)}function un(eA){var yA;eA.preventDefault(),Bo((yA=eA.clipboardData)===null||yA===void 0?void 0:yA.getData("text/plain"))}function Vn(){return Yo.apply(this,arguments)}function Yo(){return(Yo=zt(function*(){try{Bo(yield navigator.clipboard.readText())}catch(eA){console.error(eA),N(fA,!0)}})).apply(this,arguments)}function Bo(eA){eA!==void 0&&P$({clipboardText:eA,json:c(DA),selection:c(vA),readOnly:h(),parser:F(),onPatch:Ae,onChangeText:mA,onPasteMultilineText:On,openRepairModal:No})}function No(eA,yA){N(XA,{text:eA,onParse:WA=>Zf(WA,Ge=>Wf(Ge,F())),onRepair:jX,onApply:yA,onClose:_t})}function Zo(){j$({json:c(DA),text:c(ee),selection:c(vA),keepSelection:!1,readOnly:h(),onChange:X(),onPatch:Ae})}function Do(){!h()&&c(DA)!==void 0&&c(vA)&&Dh&&!en(It(c(vA)))&&(i("duplicate",{selection:c(vA)}),Ae(B$(c(DA),MI(c(DA),c(vA)))))}function Ba(){h()||!c(vA)||!Co(c(vA))&&!En(c(vA))||en(It(c(vA)))||(i("extract",{selection:c(vA)}),Ae(E$(c(DA),c(vA)),(eA,yA)=>{if(aa(eA))return{state:R_(eA,yA,[])}}))}function Xo(eA){yD({insertType:eA,selectInside:!0,initialValue:void 0,json:c(DA),selection:c(vA),readOnly:h(),parser:F(),onPatch:Ae,onReplaceJson:De})}function ra(eA){nr(c(vA))&&N(vA,Hi(c(vA).path)),c(vA)||N(vA,Bh(c(DA),c(HA))),Xo(eA)}function yo(eA){if(!h()&&c(vA))if(J5(c(vA)))try{var yA=hd(c(vA)),WA=Xe(c(DA),yA),Ge=(function(be,ot,Vt){if(ot==="array"){if(Array.isArray(be))return be;if(Mn(be))return qW(be);if(typeof be=="string")try{var Gi=Vt.parse(be);if(Array.isArray(Gi))return Gi;if(Mn(Gi))return qW(Gi)}catch($i){return[be]}return[be]}if(ot==="object"){if(Array.isArray(be))return jW(be);if(Mn(be))return be;if(typeof be=="string")try{var Fn=Vt.parse(be);if(Mn(Fn))return Fn;if(Array.isArray(Fn))return jW(Fn)}catch($i){return{value:be}}return{value:be}}if(ot==="value")return aa(be)?Vt.stringify(be):be;throw new Error("Cannot convert ".concat(kR(be,Vt)," to ").concat(ot))})(WA,eA,F());if(Ge===WA)return;var ye=[{op:"replace",path:vt(yA),value:Ge}];i("handleConvert",{selection:c(vA),path:yA,type:eA,operations:ye}),Ae(ye,(be,ot)=>({state:c(vA)?vd(be,ot,It(c(vA))):c(HA)}))}catch(be){BA()(be)}else BA()(new Error("Cannot convert current selection to ".concat(eA)))}function ge(){if(c(vA)){var eA=CZ(c(DA),c(HA),c(vA),!1),yA=Yi(It(c(vA)));eA&&!en(It(eA))&&Mi(yA,Yi(It(eA)))?N(vA,LC(It(eA))):N(vA,OC(yA)),i("insert before",{selection:c(vA),selectionBefore:eA,parentPath:yA}),Ro(),zi()}}function mi(){if(c(vA)){var eA=vI(c(DA),c(vA));i("insert after",eA),N(vA,LC(eA)),Ro(),zi()}}function cn(eA){return fn.apply(this,arguments)}function fn(){return(fn=zt(function*(eA){yield q$({char:eA,selectInside:!0,json:c(DA),selection:c(vA),readOnly:h(),parser:F(),onPatch:Ae,onReplaceJson:De,onSelect:Gt})})).apply(this,arguments)}function Ho(){if(!h()&&m().canUndo){var eA=m().undo();if(ID(eA)){var yA={json:c(DA),text:c(ee)};N(DA,eA.undo.patch?tl(c(DA),eA.undo.patch):eA.undo.json),N(HA,eA.undo.documentState),N(vA,eA.undo.selection),N(ee,eA.undo.text),N(Qe,eA.undo.textIsRepaired),NA=void 0,i("undo",{item:eA,json:c(DA),documentState:c(HA),selection:c(vA)}),xA(yA,eA.undo.patch&&eA.redo.patch?{json:c(DA),previousJson:yA.json,redo:eA.undo.patch,undo:eA.redo.patch}:void 0),_t(),c(vA)&&Ui(It(c(vA)),{scrollToWhenVisible:!1})}else IA()(eA)}}function ya(){if(!h()&&m().canRedo){var eA=m().redo();if(ID(eA)){var yA={json:c(DA),text:c(ee)};N(DA,eA.redo.patch?tl(c(DA),eA.redo.patch):eA.redo.json),N(HA,eA.redo.documentState),N(vA,eA.redo.selection),N(ee,eA.redo.text),N(Qe,eA.redo.textIsRepaired),NA=void 0,i("redo",{item:eA,json:c(DA),documentState:c(HA),selection:c(vA)}),xA(yA,eA.undo.patch&&eA.redo.patch?{json:c(DA),previousJson:yA.json,redo:eA.redo.patch,undo:eA.undo.patch}:void 0),_t(),c(vA)&&Ui(It(c(vA)),{scrollToWhenVisible:!1})}else aA()(eA)}}function _i(eA){var yA;h()||c(DA)===void 0||(YA=!0,PA()({id:o,json:c(DA),rootPath:eA,onSort:(yA=zt(function*(WA){var{operations:Ge}=WA;i("onSort",eA,Ge),Ae(Ge,(ye,be)=>({state:R_(ye,be,eA),selection:Hi(eA)}))}),function(WA){return yA.apply(this,arguments)}),onClose:()=>{YA=!1,setTimeout(_t)}}))}function Eo(){c(vA)&&_i(dZ(c(DA),c(vA)))}function Za(){_i([])}function vo(eA){if(c(DA)!==void 0){var{id:yA,onTransform:WA,onClose:Ge}=eA,ye=eA.rootPath||[];YA=!0,Je()({id:yA||a,json:c(DA),rootPath:ye,onTransform:be=>{WA?WA({operations:be,json:c(DA),transformedJson:tl(c(DA),be)}):(i("onTransform",ye,be),Ae(be,(ot,Vt)=>({state:R_(ot,Vt,ye),selection:Hi(ye)})))},onClose:()=>{YA=!1,setTimeout(_t),Ge&&Ge()}})}}function Ta(){c(vA)&&vo({rootPath:dZ(c(DA),c(vA))})}function Jn(){vo({rootPath:[]})}function Ui(eA){return qt.apply(this,arguments)}function qt(){return qt=zt(function*(eA){var{scrollToWhenVisible:yA=!0,element:WA}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};N(HA,Bc(c(DA),c(HA),eA,tD));var Ge=WA??Nn(eA);if(i("scrollTo",{path:eA,elem:Ge,refContents:c(l)}),!Ge||!c(l))return Promise.resolve();var ye=c(l).getBoundingClientRect(),be=Ge.getBoundingClientRect();if(!yA&&be.bottom>ye.top&&be.top{d(Ge,{container:c(l),offset:ot,duration:300,callback:()=>Vt()})})}),qt.apply(this,arguments)}function Nn(eA){var yA,WA;return Ro(),(yA=(WA=c(l))===null||WA===void 0?void 0:WA.querySelector('div[data-path="'.concat(eD(eA),'"]')))!==null&&yA!==void 0?yA:void 0}function ho(eA){var yA,WA;return Ro(),(yA=(WA=c(l))===null||WA===void 0?void 0:WA.querySelector('span[data-search-result-index="'.concat(eA,'"]')))!==null&&yA!==void 0?yA:void 0}function Fo(eA){var yA=Nn(eA);if(yA&&c(l)){var WA=c(l).getBoundingClientRect(),Ge=yA.getBoundingClientRect(),ye=aa(Xe(c(DA),eA))?20:Ge.height;Ge.topWA.bottom-20&&d(yA,{container:c(l),offset:-(WA.height-ye-20),duration:0})}}function xA(eA,yA){if(eA.json!==void 0||eA?.text!==void 0){if(c(ee)!==void 0){var WA,Ge={text:c(ee),json:void 0};(WA=X())===null||WA===void 0||WA(Ge,eA,{contentErrors:ze(),patchResult:yA})}else if(c(DA)!==void 0){var ye,be={text:void 0,json:c(DA)};(ye=X())===null||ye===void 0||ye(be,eA,{contentErrors:ze(),patchResult:yA})}}}function Ae(eA,yA){i("handlePatch",eA,yA);var WA={json:c(DA),text:c(ee)},Ge=Li(eA,yA);return xA(WA,Ge),Ge}function De(eA,yA){var WA={json:c(DA),text:c(ee)},Ge={documentState:c(HA),selection:c(vA),json:c(DA),text:c(ee),textIsRepaired:c(Qe)},ye=Bc(c(DA),Ul(eA,c(HA)),[],bf),be=typeof yA=="function"?yA(eA,ye,c(vA)):void 0;N(DA,be?.json!==void 0?be.json:eA),N(HA,be?.state!==void 0?be.state:ye),N(vA,be?.selection!==void 0?be.selection:c(vA)),N(ee,void 0),N(Qe,!1),NA=void 0,nn(c(DA)),Si(Ge),xA(WA,void 0)}function mA(eA,yA){i("handleChangeText");var WA={json:c(DA),text:c(ee)},Ge={documentState:c(HA),selection:c(vA),json:c(DA),text:c(ee),textIsRepaired:c(Qe)};try{N(DA,z()(eA)),N(HA,Bc(c(DA),Ul(c(DA),c(HA)),[],bf)),N(ee,void 0),N(Qe,!1),NA=void 0}catch(be){try{N(DA,z()(ag(eA))),N(HA,Bc(c(DA),Ul(c(DA),c(HA)),[],bf)),N(ee,eA),N(Qe,!0),NA=void 0}catch(ot){N(DA,void 0),N(HA,oR({json:c(DA),expand:bf})),N(ee,eA),N(Qe,!1),NA=c(ee)!==""?Th(c(ee),be.message||String(be)):void 0}}if(typeof yA=="function"){var ye=yA(c(DA),c(HA),c(vA));N(DA,ye?.json!==void 0?ye.json:c(DA)),N(HA,ye?.state!==void 0?ye.state:c(HA)),N(vA,ye?.selection!==void 0?ye.selection:c(vA))}nn(c(DA)),Si(Ge),xA(WA,void 0)}function FA(eA,yA){var WA=arguments.length>2&&arguments[2]!==void 0&&arguments[2];i("handleExpand",{path:eA,expanded:yA,recursive:WA}),yA?TA(eA,WA?HR:aR):de(eA,WA),_t()}function le(){FA([],!0,!0)}function Ne(){FA([],!1,!0)}function nt(eA){i("openFind",{findAndReplace:eA}),N(pt,!1),N(xe,!1),Ro(),N(pt,!0),N(xe,eA)}function rt(eA,yA){i("handleExpandSection",eA,yA),N(HA,(function(WA,Ge,ye,be){return Oh(WA,Ge,ye,(ot,Vt)=>{if(!ir(Vt))return Vt;var Gi=n$(Vt.visibleSections.concat(be));return Me(Me({},Vt),{},{visibleSections:Gi})})})(c(DA),c(HA),eA,yA))}function xt(eA){i("pasted json as text",eA),N(Ot,eA)}function On(eA){i("pasted multiline text",{pastedText:eA}),N(He,eA)}function Ti(eA){var yA,{anchor:WA,left:Ge,top:ye,width:be,height:ot,offsetTop:Vt,offsetLeft:Gi,showTip:Fn}=eA,$i=(function(Zn){var{json:Aa,documentState:mn,selection:Tt,readOnly:an,onEditKey:Ai,onEditValue:yt,onToggleEnforceString:Ii,onCut:la,onCopy:Xn,onPaste:ea,onRemove:Ea,onDuplicate:Er,onExtract:L0,onInsertBefore:fl,onInsert:bg,onConvert:_c,onInsertAfter:Mg,onSort:is,onTransform:hr}=Zn,pl=Aa!==void 0,G0=!!Tt,ml=!!Tt&&en(It(Tt)),Ln=Tt?Xe(Aa,It(Tt)):void 0,xa=Array.isArray(Ln)?"Edit array":Mn(Ln)?"Edit object":"Edit value",_a=pl&&(Co(Tt)||nr(Tt)||En(Tt)),YI=Tt&&!ml?Xe(Aa,Yi(It(Tt))):void 0,Jd=!an&&pl&&dD(Tt)&&!ml&&!Array.isArray(YI),HI=!an&&pl&&Tt!==void 0&&dD(Tt),DQ=HI&&!aa(Ln),Od=!an&&_a,yQ=_a,Hv=!an&&G0,zv=!an&&pl&&_a&&!ml,Pv=!an&&pl&&Tt!==void 0&&(Co(Tt)||En(Tt))&&!ml,Rc=_a,zI=Rc?"Convert to:":"Insert:",Ra=!an&&(Va(Tt)&&Array.isArray(Ln)||dl(Tt)&&Array.isArray(YI)),Hl=!an&&(Rc?J5(Tt)&&!Mn(Ln):G0),vQ=!an&&(Rc?J5(Tt)&&!Array.isArray(Ln):G0),bQ=!an&&(Rc?J5(Tt)&&aa(Ln):G0),PI=Tt!==void 0&&v0(Aa,mn,It(Tt));function Fr(MQ){_a?MQ!=="structure"&&_c(MQ):bg(MQ)}return[{type:"row",items:[{type:"button",onClick:()=>Ai(),icon:F1,text:"Edit key",title:"Edit the key (Double-click on the key)",disabled:!Jd},{type:"dropdown-button",main:{type:"button",onClick:()=>yt(),icon:F1,text:xa,title:"Edit the value (Double-click on the value)",disabled:!HI},width:"11em",items:[{type:"button",icon:F1,text:xa,title:"Edit the value (Double-click on the value)",onClick:()=>yt(),disabled:!HI},{type:"button",icon:PI?X9:eS,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>Ii(),disabled:!DQ}]}]},{type:"separator"},{type:"row",items:[{type:"dropdown-button",main:{type:"button",onClick:()=>la(!0),icon:L1,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!Od},width:"10em",items:[{type:"button",icon:L1,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>la(!0),disabled:!Od},{type:"button",icon:L1,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>la(!1),disabled:!Od}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Xn(!0),icon:IC,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!yQ},width:"12em",items:[{type:"button",icon:IC,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>Xn(!0),disabled:!yQ},{type:"button",icon:IC,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>Xn(!1),disabled:!yQ}]},{type:"button",onClick:()=>ea(),icon:V9,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:!Hv}]},{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"button",onClick:()=>Er(),icon:Z9,text:"Duplicate",title:"Duplicate selected contents (Ctrl+D)",disabled:!zv},{type:"button",onClick:()=>L0(),icon:Ez,text:"Extract",title:"Extract selected contents",disabled:!Pv},{type:"button",onClick:()=>is(),icon:y4,text:"Sort",title:"Sort array or object contents",disabled:an||!_a},{type:"button",onClick:()=>hr(),icon:p4,text:"Transform",title:"Transform array or object contents (filter, sort, project)",disabled:an||!_a},{type:"button",onClick:()=>Ea(),icon:T8,text:"Remove",title:"Remove selected contents (Delete)",disabled:an||!_a}]},{type:"column",items:[{type:"label",text:zI},{type:"button",onClick:()=>Fr("structure"),icon:Rc?v4:G1,text:"Structure",title:zI+" structure like the first item in the array",disabled:!Ra},{type:"button",onClick:()=>Fr("object"),icon:Rc?v4:G1,text:"Object",title:zI+" object",disabled:!Hl},{type:"button",onClick:()=>Fr("array"),icon:Rc?v4:G1,text:"Array",title:zI+" array",disabled:!vQ},{type:"button",onClick:()=>Fr("value"),icon:Rc?v4:G1,text:"Value",title:zI+" value",disabled:!bQ}]}]},{type:"separator"},{type:"row",items:[{type:"button",onClick:()=>fl(),icon:wz,text:"Insert before",title:"Select area before current entry to insert or paste contents",disabled:an||!_a||ml},{type:"button",onClick:()=>Mg(),icon:hz,text:"Insert after",title:"Select area after current entry to insert or paste contents",disabled:an||!_a||ml}]}]})({json:c(DA),documentState:c(HA),selection:c(vA),readOnly:h(),onEditKey:Zi,onEditValue:bt,onToggleEnforceString:on,onCut:G,onCopy:Ei,onPaste:Vn,onRemove:Zo,onDuplicate:Do,onExtract:Ba,onInsertBefore:ge,onInsert:ra,onInsertAfter:mi,onConvert:yo,onSort:Eo,onTransform:Ta}),Qo=(yA=UA()($i))!==null&&yA!==void 0?yA:$i;if(Qo!==!1){var $t={left:Ge,top:ye,offsetTop:Vt,offsetLeft:Gi,width:be,height:ot,anchor:WA,closeOnOuterClick:!0,onClose:()=>{YA=!1,_t()}};YA=!0;var $o=r(W$,{tip:Fn?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:Qo,onRequestClose:()=>s($o)},$t)}}function zi(eA){if(!tr(c(vA)))if(eA&&(eA.stopPropagation(),eA.preventDefault()),eA&&eA.type==="contextmenu"&&eA.target!==c(g))Ti({left:eA.clientX,top:eA.clientY,width:xC,height:kC,showTip:!1});else{var yA,WA=(yA=c(l))===null||yA===void 0?void 0:yA.querySelector(".jse-context-menu-pointer.jse-selected");if(WA)Ti({anchor:WA,offsetTop:2,width:xC,height:kC,showTip:!1});else{var Ge,ye=(Ge=c(l))===null||Ge===void 0?void 0:Ge.getBoundingClientRect();ye&&Ti({top:ye.top+2,left:ye.left+2,width:xC,height:kC,showTip:!1})}}}function Xt(eA){Ti({anchor:t$(eA.target,"BUTTON"),offsetTop:0,width:xC,height:kC,showTip:!0})}function Ji(){return va.apply(this,arguments)}function va(){return(va=zt(function*(){if(i("apply pasted json",c(Ot)),c(Ot)){var{onPasteAsJson:eA}=c(Ot);N(Ot,void 0),eA(),setTimeout(_t)}})).apply(this,arguments)}function Ut(){return st.apply(this,arguments)}function st(){return(st=zt(function*(){i("apply pasted multiline text",c(He)),c(He)&&(Bo(JSON.stringify(c(He))),setTimeout(_t))})).apply(this,arguments)}function Oi(){i("clear pasted json"),N(Ot,void 0),_t()}function Xi(){i("clear pasted multiline text"),N(He,void 0),_t()}function Wn(){iA()(Da.text)}function pn(eA){N(vA,eA),_t(),Ui(It(eA))}function _t(){i("focus"),c(g)&&(c(g).focus(),c(g).select())}function sa(eA){return(function(yA,WA,Ge){var ye=Yi(Ge),be=[ki(Ge)],ot=Xe(yA,ye),Vt=ot?__(ot,WA,be):void 0;return Vt?Hi(ye.concat(Vt)):LC(Ge)})(c(DA),c(HA),eA)}function zo(eA){c(A)&&c(A).onDrag(eA)}function D(){c(A)&&c(A).onDragEnd()}var M=EA(void 0,!0);KA(()=>c(vA),()=>{var eA;eA=c(vA),Mi(eA,f())||(i("onSelect",eA),AA()(eA))}),KA(()=>(K(b()),K(x())),()=>{N(he,xR({escapeControlCharacters:b(),escapeUnicodeCharacters:x()}))}),KA(()=>c(pt),()=>{(function(eA){c(l)&&eA&&c(l).scrollTop===0&&(Tl(l,c(l).style.overflowAnchor="none"),Tl(l,c(l).scrollTop+=vf),setTimeout(()=>{c(l)&&Tl(l,c(l).style.overflowAnchor="")}))})(c(pt))}),KA(()=>K(E()),()=>{hn(E())}),KA(()=>K(f()),()=>{(function(eA){Mi(c(vA),eA)||(i("applyExternalSelection",{selection:c(vA),externalSelection:eA}),Kf(eA)&&N(vA,eA))})(f())}),KA(()=>(c(DA),K(P()),K(F()),K(Z())),()=>{tt(c(DA),P(),F(),Z())}),KA(()=>(c(l),RZ),()=>{N(A,c(l)?RZ(c(l)):void 0)}),KA(()=>(K(h()),K(v()),K(F()),c(he),K(rA()),K($A())),()=>{N(M,{mode:Da.tree,readOnly:h(),truncateTextSize:v(),parser:F(),normalization:c(he),getJson:Oe,getDocumentState:Ci,getSelection:gn,findElement:Nn,findNextInside:sa,focus:_t,onPatch:Ae,onInsert:Xo,onExpand:FA,onSelect:Gt,onFind:nt,onExpandSection:rt,onPasteJson:xt,onRenderValue:rA(),onContextMenu:Ti,onClassName:$A()||(()=>{}),onDrag:zo,onDragEnd:D})}),KA(()=>c(M),()=>{i("context changed",c(M))}),Rn();var R={expand:TA,collapse:de,validate:ze,getJson:Oe,patch:Li,acceptAutoRepair:Kt,openTransformModal:vo,scrollTo:Ui,findElement:Nn,findSearchResult:ho,focus:_t};ni(!0);var V=d5A();fe("mousedown",NC,function(eA){!AQ(eA.target,yA=>yA===c(C))&&tr(c(vA))&&(i("click outside the editor, exit edit mode"),N(vA,D0(c(vA))),I&&c(g)&&(c(g).focus(),c(g).blur()),i("blur (outside editor)"),c(g)&&c(g).blur())});var _,q=et(V),nA=dA(q),cA=eA=>{(function(yA,WA){Nt(WA,!1);var Ge=EA(void 0,!0),ye=EA(void 0,!0),be=EA(void 0,!0),ot=L(WA,"json",9),Vt=L(WA,"selection",9),Gi=L(WA,"readOnly",9),Fn=L(WA,"showSearch",13,!1),$i=L(WA,"history",9),Qo=L(WA,"onExpandAll",9),$t=L(WA,"onCollapseAll",9),$o=L(WA,"onUndo",9),Zn=L(WA,"onRedo",9),Aa=L(WA,"onSort",9),mn=L(WA,"onTransform",9),Tt=L(WA,"onContextMenu",9),an=L(WA,"onCopy",9),Ai=L(WA,"onRenderMenu",9);function yt(){Fn(!Fn())}var Ii=EA(void 0,!0),la=EA(void 0,!0),Xn=EA(void 0,!0),ea=EA(void 0,!0);KA(()=>K(ot()),()=>{N(Ge,ot()!==void 0)}),KA(()=>(c(Ge),K(Vt()),En),()=>{N(ye,c(Ge)&&(Co(Vt())||nr(Vt())||En(Vt())))}),KA(()=>(K(Qo()),K(ot())),()=>{N(Ii,{type:"button",icon:K$,title:"Expand all",className:"jse-expand-all",onClick:Qo(),disabled:!aa(ot())})}),KA(()=>(K($t()),K(ot())),()=>{N(la,{type:"button",icon:U$,title:"Collapse all",className:"jse-collapse-all",onClick:$t(),disabled:!aa(ot())})}),KA(()=>K(ot()),()=>{N(Xn,{type:"button",icon:m4,title:"Search (Ctrl+F)",className:"jse-search",onClick:yt,disabled:ot()===void 0})}),KA(()=>(K(Gi()),c(Ii),c(la),K(Aa()),K(ot()),K(mn()),c(Xn),K(Tt()),K($o()),K($i()),K(Zn()),K(an()),c(ye)),()=>{N(ea,Gi()?[c(Ii),c(la),{type:"separator"},{type:"button",icon:IC,title:"Copy (Ctrl+C)",className:"jse-copy",onClick:an(),disabled:!c(ye)},{type:"separator"},c(Xn),{type:"space"}]:[c(Ii),c(la),{type:"separator"},{type:"button",icon:y4,title:"Sort",className:"jse-sort",onClick:Aa(),disabled:Gi()||ot()===void 0},{type:"button",icon:p4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:mn(),disabled:Gi()||ot()===void 0},c(Xn),{type:"button",icon:W9,title:LR,className:"jse-contextmenu",onClick:Tt()},{type:"separator"},{type:"button",icon:Y8,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:$o(),disabled:!$i().canUndo},{type:"button",icon:O8,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Zn(),disabled:!$i().canRedo},{type:"space"}])}),KA(()=>(K(Ai()),c(ea)),()=>{N(be,Ai()(c(ea))||c(ea))}),Rn(),ni(!0),KD(yA,{get items(){return c(be)}}),Ft()})(eA,{get json(){return c(DA)},get selection(){return c(vA)},get readOnly(){return h()},get history(){return m()},onExpandAll:le,onCollapseAll:Ne,onUndo:Ho,onRedo:ya,onSort:Za,onTransform:Jn,onContextMenu:Xt,onCopy:Ei,get onRenderMenu(){return uA()},get showSearch(){return c(pt)},set showSearch(yA){N(pt,yA)},$$legacy:!0})};jA(nA,eA=>{k()&&eA(cA)});var MA=_A(nA,2),oe=eA=>{JwA(eA,{get json(){return c(DA)},get selection(){return c(vA)},onSelect:pn,get onError(){return BA()},get pathParser(){return tA()}})};jA(MA,eA=>{S()&&eA(oe)});var se=_A(MA,2),Ee=eA=>{var yA=C5A(),WA=et(yA),Ge=dA(WA);Ge.readOnly=!0,Oo(Ge,Vt=>N(g,Vt),()=>c(g));var ye=_A(WA,2),be=Vt=>{var Gi=Fi(),Fn=et(Gi),$i=$t=>{(function($o,Zn){function Aa(Ii){Ii.stopPropagation(),Zn.onCreateObject()}function mn(Ii){Ii.stopPropagation(),Zn.onCreateArray()}Nt(Zn,!0);var Tt=MwA();Tt.__click=()=>Zn.onClick();var an=_A(dA(Tt),2),Ai=_A(dA(an),2),yt=Ii=>{var la=bwA(),Xn=_A(et(la),2);_n(Xn,"title","Create an empty JSON object (press '{')"),Xn.__click=Aa;var ea=_A(Xn,2);_n(ea,"title","Create an empty JSON array (press '[')"),ea.__click=mn,CA(Ii,la)};jA(Ai,Ii=>{Zn.readOnly||Ii(yt)}),CA($o,Tt),Ft()})($t,{get readOnly(){return h()},onCreateObject:()=>{_t(),cn("{")},onCreateArray:()=>{_t(),cn("[")},onClick:()=>{_t()}})},Qo=$t=>{var $o=l5A(),Zn=et($o),Aa=it(()=>h()?[]:[{icon:w4,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:Wn}]);Yl(Zn,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return c(Aa)}}),V$(_A(Zn,2),{get text(){return c(ee)},get json(){return c(DA)},get indentation(){return W()},get parser(){return F()}}),CA($t,$o)};jA(Fn,$t=>{c(ee)===""||c(ee)===void 0?$t($i):$t(Qo,!1)}),CA(Vt,Gi)},ot=Vt=>{var Gi=c5A(),Fn=et(Gi);J$(dA(Fn),{get json(){return c(DA)},get documentState(){return c(HA)},get parser(){return F()},get showSearch(){return c(pt)},get showReplace(){return c(xe)},get readOnly(){return h()},columns:void 0,onSearch:oi,onFocus:j,onPatch:Ae,onClose:oA});var $i=_A(Fn,2);_n($i,"data-jsoneditor-scrollable-contents",!0);var Qo=dA($i),$t=Ai=>{CA(Ai,g5A())};jA(Qo,Ai=>{c(pt)&&Ai($t)}),BR(_A(Qo,2),{get value(){return c(DA)},pointer:"",get state(){return c(HA)},get validationErrors(){return c(OA)},get searchResults(){return c(je)},get selection(){return c(vA)},get context(){return c(M)},get onDragSelectionStart(){return ma}}),Oo($i,Ai=>N(l,Ai),()=>c(l));var $o=_A($i,2),Zn=Ai=>{var yt=it(()=>(c(Ot),wA(()=>"You pasted a JSON ".concat(Array.isArray(c(Ot).contents)?"array":"object"," as text")))),Ii=it(()=>[{icon:CC,text:"Paste as JSON instead",title:"Replace the value with the pasted JSON",onMouseDown:Ji},{text:"Leave as is",title:"Keep the JSON embedded in the value",onClick:Oi}]);Yl(Ai,{type:"info",get message(){return c(yt)},get actions(){return c(Ii)}})};jA($o,Ai=>{c(Ot)&&Ai(Zn)});var Aa=_A($o,2),mn=Ai=>{var yt=it(()=>[{icon:CC,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:Ut},{text:"Leave as is",title:"Keep the pasted array",onClick:Xi}]);Yl(Ai,{type:"info",message:"Multiline text was pasted as array",get actions(){return c(yt)}})};jA(Aa,Ai=>{c(He)&&Ai(mn)});var Tt=_A(Aa,2),an=Ai=>{var yt=it(()=>h()?[]:[{icon:J8,text:"Ok",title:"Accept the repaired document",onClick:Kt},{icon:w4,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:Wn}]);Yl(Ai,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return c(yt)},onClose:_t})};jA(Tt,Ai=>{c(Qe)&&Ai(an)}),VR(_A(Tt,2),{get validationErrors(){return c(GA)},selectError:sA}),CA(Vt,Gi)};jA(ye,Vt=>{c(DA)===void 0?Vt(be):Vt(ot,!1)}),fe("paste",Ge,un),CA(eA,yA)},Pe=eA=>{CA(eA,I5A())};jA(se,eA=>{n?eA(Pe,!1):eA(Ee)}),Oo(q,eA=>N(C,eA),()=>c(C));var Re=_A(q,2),Le=eA=>{F$(eA,{onClose:()=>N(fA,!1)})};jA(Re,eA=>{c(fA)&&eA(Le)});var ai=_A(Re,2),Yn=eA=>{L$(eA,DI(()=>c(XA),{onClose:()=>{var yA;(yA=c(XA))===null||yA===void 0||yA.onClose(),N(XA,void 0)}}))};return jA(ai,eA=>{c(XA)&&eA(Yn)}),Se(()=>_=ii(q,1,"jse-tree-mode svelte-10mlrw4",null,_,{"no-main-menu":!k()})),fe("keydown",q,function(eA){var yA=TC(eA),WA=eA.shiftKey;if(i("keydown",{combo:yA,key:eA.key}),yA==="Ctrl+X"&&(eA.preventDefault(),G(!0)),yA==="Ctrl+Shift+X"&&(eA.preventDefault(),G(!1)),yA==="Ctrl+C"&&(eA.preventDefault(),Ei(!0)),yA==="Ctrl+Shift+C"&&(eA.preventDefault(),Ei(!1)),yA==="Ctrl+D"&&(eA.preventDefault(),Do()),yA!=="Delete"&&yA!=="Backspace"||(eA.preventDefault(),Zo()),yA==="Insert"&&(eA.preventDefault(),Xo("structure")),yA==="Ctrl+A"&&(eA.preventDefault(),N(vA,Hi([]))),yA==="Ctrl+Q"&&zi(eA),yA==="ArrowUp"||yA==="Shift+ArrowUp"){eA.preventDefault();var Ge=c(vA)?CZ(c(DA),c(HA),c(vA),WA)||c(vA):Bh(c(DA),c(HA));N(vA,Ge),Fo(It(Ge))}if(yA==="ArrowDown"||yA==="Shift+ArrowDown"){eA.preventDefault();var ye=c(vA)?(function($i,Qo,$t){var $o=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if($t){var Zn=$o?It($t):vI($i,$t),Aa=aa(Xe($i,Zn))?sZ($i,Qo,Zn,!0):Qo,mn=__($i,Qo,Zn),Tt=__($i,Aa,Zn);if($o)return Va($t)?mn!==void 0?fs(mn,mn):void 0:dl($t)?Tt!==void 0?fs(Tt,Tt):void 0:Tt!==void 0?fs(hd($t),Tt):void 0;if(dl($t))return Tt!==void 0?Hi(Tt):void 0;if(Va($t)||En($t))return mn!==void 0?Hi(mn):void 0;if(nr($t)){if(mn===void 0||mn.length===0)return;var an=Yi(mn),Ai=Xe($i,an);return Array.isArray(Ai)?Hi(mn):JC(mn)}return Co($t)?Tt!==void 0?Hi(Tt):mn!==void 0?Hi(mn):void 0:void 0}})(c(DA),c(HA),c(vA),WA)||c(vA):Bh(c(DA),c(HA));N(vA,ye),Fo(It(ye))}if(yA==="ArrowLeft"||yA==="Shift+ArrowLeft"){eA.preventDefault();var be=c(vA)?(function($i,Qo,$t){var $o=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Zn=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if($t){var{caret:Aa,previous:mn}=IZ($i,Qo,$t,Zn);if($o)return Co($t)?void 0:fs($t.path,$t.path);if(Aa&&mn)return rR(mn);var Tt=Yi(It($t)),an=Xe($i,Tt);return En($t)&&Array.isArray(an)?fs($t.path,$t.path):Co($t)&&!Array.isArray(an)?JC($t.focusPath):void 0}})(c(DA),c(HA),c(vA),WA,!h())||c(vA):Bh(c(DA),c(HA));N(vA,be),Fo(It(be))}if(yA==="ArrowRight"||yA==="Shift+ArrowRight"){eA.preventDefault();var ot=c(vA)&&c(DA)!==void 0?(function($i,Qo,$t){var $o=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Zn=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if($t){var{caret:Aa,next:mn}=IZ($i,Qo,$t,Zn);return $o?Co($t)?void 0:fs($t.path,$t.path):Aa&&mn?rR(mn):Co($t)?Hi($t.focusPath):void 0}})(c(DA),c(HA),c(vA),WA,!h())||c(vA):Bh(c(DA),c(HA));N(vA,ot),Fo(It(ot))}if(yA==="Enter"&&c(vA)){if(RD(c(vA))){var Vt=c(vA).focusPath,Gi=Xe(c(DA),Yi(Vt));Array.isArray(Gi)&&(eA.preventDefault(),N(vA,Hi(Vt)))}nr(c(vA))&&(eA.preventDefault(),N(vA,Me(Me({},c(vA)),{},{edit:!0}))),En(c(vA))&&(eA.preventDefault(),aa(Xe(c(DA),c(vA).path))?FA(c(vA).path,!0):N(vA,Me(Me({},c(vA)),{},{edit:!0})))}if(yA.replace(/^Shift\+/,"").length===1&&c(vA))return eA.preventDefault(),void cn(eA.key);if(yA==="Enter"&&(dl(c(vA))||Va(c(vA))))return eA.preventDefault(),void cn("");if(yA==="Ctrl+Enter"&&En(c(vA))){var Fn=Xe(c(DA),c(vA).path);xD(Fn)&&window.open(String(Fn),"_blank")}yA==="Escape"&&c(vA)&&(eA.preventDefault(),N(vA,void 0)),yA==="Ctrl+F"&&(eA.preventDefault(),nt(!1)),yA==="Ctrl+H"&&(eA.preventDefault(),nt(!0)),yA==="Ctrl+Z"&&(eA.preventDefault(),Ho()),yA==="Ctrl+Shift+Z"&&(eA.preventDefault(),ya())}),fe("mousedown",q,function(eA){i("handleMouseDown",eA);var yA=eA.target;e$(yA,"BUTTON")||yA.isContentEditable||(_t(),c(vA)||c(DA)!==void 0||c(ee)!==""&&c(ee)!==void 0||(i("createDefaultSelection"),N(vA,Hi([]))))}),fe("contextmenu",q,zi),CA(t,V),jt(e,"expand",TA),jt(e,"collapse",de),jt(e,"validate",ze),jt(e,"getJson",Oe),jt(e,"patch",Li),jt(e,"acceptAutoRepair",Kt),jt(e,"openTransformModal",vo),jt(e,"scrollTo",Ui),jt(e,"findElement",Nn),jt(e,"findSearchResult",ho),jt(e,"focus",_t),Ft(R)}function Z$(t){return typeof(e=t)!="object"||e===null?t:new Proxy(t,{get:(A,i,n)=>Z$(Reflect.get(A,i,n)),set:()=>!1,deleteProperty:()=>!1});var e}var V5=or("jsoneditor:History");function X$(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=t.maxItems||1e3,A=[],i=0;function n(){return i0}function a(){return{canUndo:n(),canRedo:o(),items:()=>A.slice().reverse(),add:s,undo:g,redo:C,clear:l}}function r(){t.onChange&&t.onChange(a())}function s(I){V5("add",I),A=[I].concat(A.slice(i)).slice(0,e),i=0,r()}function l(){V5("clear"),A=[],i=0,r()}function g(){if(n()){var I=A[i];return i+=1,V5("undo",I),r(),I}}function C(){if(o())return V5("redo",A[i-=1]),r(),A[i]}return{get:a}}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-transform-modal-inner.svelte-lta8xm { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; + min-height: 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) { + color: inherit; + flex: 1; + display: flex; + flex-direction: column; + padding: 0; + overflow: auto; + min-width: 0; + min-height: 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding-top: var(--jse-padding, 10px); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) { + flex: 1; + display: flex; + gap: calc(2 * var(--jse-padding, 10px)); + min-height: 0; + box-sizing: border-box; + padding: 0 calc(2 * var(--jse-padding, 10px)) var(--jse-padding, 10px); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) { + flex: 1; + display: flex; + flex-direction: column; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p { + margin: var(--jse-padding, 10px) 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p:first-child { + margin-top: 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p:last-child { + margin-bottom: 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) code { + background: var(--jse-modal-code-background, rgba(0, 0, 0, 0.05)); + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .query-error:where(.svelte-lta8xm) { + color: var(--jse-error-color, #ee5341); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) textarea.jse-query:where(.svelte-lta8xm) { + flex: 1; + outline: none; + resize: vertical; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) { + flex: 1; + display: flex; + flex-direction: column; + gap: calc(2 * var(--jse-padding, 10px)); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data:where(.svelte-lta8xm) { + flex: 1; + display: flex; + flex-direction: column; + min-height: 0; + box-sizing: border-box; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data.jse-hide:where(.svelte-lta8xm) { + flex: none; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-preview-data:where(.svelte-lta8xm) { + flex: 1; + display: flex; + flex-direction: column; + min-height: 0; + box-sizing: border-box; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents.jse-hide-original-data:where(.svelte-lta8xm) { + flex-direction: column; + gap: 0; + margin-bottom: 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) { + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)) calc(2 * var(--jse-padding, 10px)); +} +@media screen and (max-width: 1200px) { + .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) { + flex-direction: column; + overflow: auto; + } + .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) textarea.jse-query:where(.svelte-lta8xm) { + min-height: 150px; + flex: none; + } + .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-tree-mode { + height: 300px; + flex: none; + } + .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data:where(.svelte-lta8xm), + .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-preview-data:where(.svelte-lta8xm) { + flex: unset; + } +} +.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) { + font-weight: bold; + display: block; + box-sizing: border-box; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) .jse-label-inner:where(.svelte-lta8xm) { + margin-top: calc(2 * var(--jse-padding, 10px)); + margin-bottom: calc(0.5 * var(--jse-padding, 10px)); + box-sizing: border-box; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) .jse-label-inner:where(.svelte-lta8xm) button:where(.svelte-lta8xm) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + font-weight: bold; + padding: 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-tree-mode { + flex: 1; + background: var(--jse-input-background-readonly, transparent); + box-shadow: none; + box-sizing: border-box; + --jse-main-border: var(--jse-input-border, 1px solid #d8dbdf); +} +.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm), +.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm) { + border: var(--jse-input-border, 1px solid #d8dbdf); + outline: none; + box-sizing: border-box; + padding: calc(0.5 * var(--jse-padding, 10px)); + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: inherit; + background: var(--jse-input-background, var(--jse-background-color, #fff)); +} +.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm):focus, +.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm):focus { + border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); +} +.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm):read-only, +.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm):read-only { + background: var(--jse-input-background-readonly, transparent); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-preview.jse-error:where(.svelte-lta8xm) { + flex: 1; + background: var(--jse-input-background-readonly, transparent); + border: var(--jse-input-border, 1px solid #d8dbdf); + color: var(--jse-error-color, #ee5341); + padding: calc(0.5 * var(--jse-padding, 10px)); +} +.jse-transform-modal-inner.svelte-lta8xm a { + color: var(--jse-a-color, #156fc5); +} +.jse-transform-modal-inner.svelte-lta8xm a:hover { + color: var(--jse-a-color-highlight, #0f508d); +}`);var wf=kD(()=>m6A),hh=kD(()=>w6A),B5A=JA('
        '),E5A=JA(" ",1),h5A=JA('
        '),Q5A=JA('
        Language
        Path
        Query
        Preview
        ',1),u5A=JA('
        ');function f5A(t,e){var A,i,n;Nt(e,!1);var o=or("jsoneditor:TransformModal"),a=L(e,"id",25,()=>"transform-modal-"+wh()),r=L(e,"json",9),s=L(e,"rootPath",25,()=>[]),l=L(e,"indentation",9),g=L(e,"truncateTextSize",9),C=L(e,"escapeControlCharacters",9),I=L(e,"escapeUnicodeCharacters",9),d=L(e,"parser",9),h=L(e,"parseMemoizeOne",9),E=L(e,"validationParser",9),f=L(e,"pathParser",9),m=L(e,"queryLanguages",9),v=L(e,"queryLanguageId",13),k=L(e,"onChangeQueryLanguage",9),S=L(e,"onRenderValue",9),b=L(e,"onRenderMenu",9),x=L(e,"onRenderContextMenu",9),F=L(e,"onClassName",9),z=L(e,"onTransform",9),P=L(e,"onClose",9),Z=EA(void 0,!0),tA=EA(X$({onChange:HA=>N(tA,HA)}).get(),!0),W=EA(void 0,!0),BA=EA(void 0,!0),X=EA(!1,!0),iA="".concat(a(),":").concat(vt(s())),AA=(A=wf()[iA])!==null&&A!==void 0?A:{},IA=EA(hh().showWizard!==!1,!0),aA=EA(hh().showOriginal!==!1,!0),rA=EA((i=AA.queryOptions)!==null&&i!==void 0?i:{},!0),uA=EA(v()===AA.queryLanguageId&&AA.query?AA.query:"",!0),UA=EA((n=AA.isManual)!==null&&n!==void 0&&n,!0),$A=EA(void 0,!0),zA=EA(void 0,!0),pA=EA({text:""},!0);function PA(HA){var vA;return(vA=m().find(Gt=>Gt.id===HA))!==null&&vA!==void 0?vA:m()[0]}function Je(HA){try{N(rA,HA),N(uA,PA(v()).createQuery(c(W),HA)),N($A,void 0),N(UA,!1),o("updateQueryByWizard",{queryOptions:c(rA),query:c(uA),isManual:c(UA)})}catch(vA){N($A,String(vA))}}function _e(HA){N(uA,HA.target.value),N(UA,!0),o("handleChangeQuery",{query:c(uA),isManual:c(UA)})}c(UA)||Je(c(rA)),As(()=>{var HA;(HA=c(Z))===null||HA===void 0||HA.focus()});var YA=ME(function(HA,vA){if(HA===void 0)return N(pA,{text:""}),void N(zA,"Error: No JSON");if(vA.trim()!=="")try{o("previewTransform",{query:vA});var Gt=PA(v()).executeQuery(HA,vA,d());N(pA,{json:Gt}),N(zA,void 0)}catch(ft){N(pA,{text:""}),N(zA,String(ft))}else N(pA,{json:HA})},300);function fA(){if(c(W)===void 0)return N(pA,{text:""}),void N(zA,"Error: No JSON");try{o("handleTransform",{query:c(uA)});var HA=PA(v()).executeQuery(c(W),c(uA),d());z()([{op:"replace",path:vt(s()),value:HA}]),P()()}catch(vA){console.error(vA),N(pA,{text:""}),N(zA,String(vA))}}function XA(){N(IA,!c(IA)),hh(hh().showWizard=c(IA))}function DA(){N(aA,!c(aA)),hh(hh().showOriginal=c(aA))}function ee(HA){HA.focus()}function NA(HA){o("handleChangeQueryLanguage",HA),v(HA),k()(HA),Je(c(rA))}function ke(){c(X)?N(X,!c(X)):P()()}KA(()=>(K(r()),K(s())),()=>{N(W,Z$(Xe(r(),s())))}),KA(()=>c(W),()=>{N(BA,c(W)?{json:c(W)}:{text:""})}),KA(()=>(c(W),c(uA)),()=>{YA(c(W),c(uA))}),KA(()=>(wf(),c(rA),c(uA),K(v()),c(UA)),()=>{wf(wf()[iA]={queryOptions:c(rA),query:c(uA),queryLanguageId:v(),isManual:c(UA)}),o("store state in memory",iA,wf()[iA])}),Rn(),ni(!0),Of(t,{get onClose(){return P()},className:"jse-transform-modal",get fullscreen(){return c(X)},children:(HA,vA)=>{var Gt=u5A();tR(dA(Gt),{children:(ft,he)=>{var Ot=Q5A(),He=et(Ot);(function(G,dt){Nt(dt,!1);var Ei,Qn=L(dt,"queryLanguages",9),un=L(dt,"queryLanguageId",9),Vn=L(dt,"fullscreen",13),Yo=L(dt,"onChangeQueryLanguage",9),Bo=L(dt,"onClose",9),No=EA(void 0,!0),{openAbsolutePopup:Zo,closeAbsolutePopup:Do}=kI("absolute-popup");function Ba(){var Xo={queryLanguages:Qn(),queryLanguageId:un(),onChangeQueryLanguage:ra=>{Do(Ei),Yo()(ra)}};Ei=Zo(Q8A,Xo,{offsetTop:-2,offsetLeft:0,anchor:c(No),closeOnOuterClick:!0})}ni(!0),wD(G,{title:"Transform",fullScreenButton:!0,get onClose(){return Bo()},get fullscreen(){return Vn()},set fullscreen(Xo){Vn(Xo)},$$slots:{actions:(Xo,ra)=>{var yo,ge=p8A();tn(dA(ge),{get data(){return Dz}}),Oo(ge,mi=>N(No,mi),()=>c(No)),Se(()=>yo=ii(ge,1,"jse-config svelte-5gkegr",null,yo,{hide:Qn().length<=1})),fe("click",ge,Ba),CA(Xo,ge)}},$$legacy:!0}),Ft()})(He,{get queryLanguages(){return m()},get queryLanguageId(){return v()},onChangeQueryLanguage:NA,get onClose(){return P()},get fullscreen(){return c(X)},set fullscreen(G){N(X,G)},$$legacy:!0});var je=dA(_A(He,2)),pt=dA(je),xe=_A(dA(pt),2);KX(dA(xe),()=>(K(v()),wA(()=>PA(v()).description)));var oi=_A(xe,4),j=_A(oi,2),$=dA(j),oA=dA($),sA=dA(oA),TA=it(()=>c(IA)?c0:kE);tn(sA,{get data(){return c(TA)}});var de=_A(j,2),Qe=G=>{var dt=Fi(),Ei=et(dt),Qn=Vn=>{var Yo=E5A(),Bo=et(Yo);B8A(Bo,{get queryOptions(){return c(rA)},get json(){return c(W)},onChange:Je});var No=_A(Bo,2),Zo=Do=>{var Ba=B5A(),Xo=dA(Ba);Se(()=>Lt(Xo,c($A))),CA(Do,Ba)};jA(No,Do=>{c($A)&&Do(Zo)}),CA(Vn,Yo)},un=Vn=>{CA(Vn,dr("(Only available for arrays, not for objects)"))};jA(Ei,Vn=>{c(W),wA(()=>Array.isArray(c(W)))?Vn(Qn):Vn(un,!1)}),CA(G,dt)};jA(de,G=>{c(IA)&&G(Qe)});var GA=_A(de,4);Oo(GA,G=>N(Z,G),()=>c(Z));var OA,ht,tt=_A(pt,2),ze=dA(tt),Oe=dA(ze),Ci=dA(Oe),gn=dA(Ci),hn=dA(gn),Ke=it(()=>c(aA)?c0:kE);tn(hn,{get data(){return c(Ke)}});var nn=_A(Oe,2),Si=G=>{pR(G,{get externalContent(){return c(BA)},externalSelection:void 0,get history(){return c(tA)},readOnly:!0,get truncateTextSize(){return g()},mainMenuBar:!1,navigationBar:!1,get indentation(){return l()},get escapeControlCharacters(){return C()},get escapeUnicodeCharacters(){return I()},get parser(){return d()},get parseMemoizeOne(){return h()},get onRenderValue(){return S()},get onRenderMenu(){return b()},get onRenderContextMenu(){return x()},onError:wA(()=>console.error),get onChange(){return ma},get onChangeMode(){return ma},get onSelect(){return ma},get onUndo(){return ma},get onRedo(){return ma},get onFocus(){return ma},get onBlur(){return ma},get onSortModal(){return ma},get onTransformModal(){return ma},get onJSONEditorModal(){return ma},get onClassName(){return F()},validator:void 0,get validationParser(){return E()},get pathParser(){return f()}})};jA(nn,G=>{c(aA)&&G(Si)});var Li=_A(ze,2),Zi=_A(dA(Li),2),bt=G=>{pR(G,{get externalContent(){return c(pA)},externalSelection:void 0,get history(){return c(tA)},readOnly:!0,get truncateTextSize(){return g()},mainMenuBar:!1,navigationBar:!1,get indentation(){return l()},get escapeControlCharacters(){return C()},get escapeUnicodeCharacters(){return I()},get parser(){return d()},get parseMemoizeOne(){return h()},get onRenderValue(){return S()},get onRenderMenu(){return b()},get onRenderContextMenu(){return x()},onError:wA(()=>console.error),get onChange(){return ma},get onChangeMode(){return ma},get onSelect(){return ma},get onUndo(){return ma},get onRedo(){return ma},get onFocus(){return ma},get onBlur(){return ma},get onSortModal(){return ma},get onTransformModal(){return ma},get onJSONEditorModal(){return ma},get onClassName(){return F()},validator:void 0,get validationParser(){return E()},get pathParser(){return f()}})},on=G=>{var dt=h5A(),Ei=dA(dt);Se(()=>Lt(Ei,c(zA))),CA(G,dt)};jA(Zi,G=>{c(zA)?G(on,!1):G(bt)});var Kt=dA(_A(je,2));_r(()=>fe("click",Kt,fA)),ms(Kt,G=>ee?.(G)),Se(G=>{Dd(oi,G),Dd(GA,c(uA)),OA=ii(tt,1,"jse-data-contents svelte-lta8xm",null,OA,{"jse-hide-original-data":!c(aA)}),ht=ii(ze,1,"jse-original-data svelte-lta8xm",null,ht,{"jse-hide":!c(aA)}),Kt.disabled=!!c(zA)},[()=>(K(en),K(s()),K(Bl),wA(()=>en(s())?"(document root)":Bl(s())))]),fe("click",oA,XA),fe("input",GA,_e),fe("click",gn,DA),CA(ft,Ot)},$$slots:{default:!0}}),ms(Gt,(ft,he)=>DD?.(ft,he),()=>ke),CA(HA,Gt)},$$slots:{default:!0}}),Ft()}function Qg(){}var p5A=0,Ir=class{constructor(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.id=p5A++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=Hf.match(e)),A=>{var i=e(A);return i===void 0?null:[this,i]}}};Ir.closedBy=new Ir({deserialize:t=>t.split(" ")}),Ir.openedBy=new Ir({deserialize:t=>t.split(" ")}),Ir.group=new Ir({deserialize:t=>t.split(" ")}),Ir.isolate=new Ir({deserialize:t=>{if(t&&t!="rtl"&&t!="ltr"&&t!="auto")throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}}),Ir.contextHash=new Ir({perNode:!0}),Ir.lookAhead=new Ir({perNode:!0}),Ir.mounted=new Ir({perNode:!0});var KZ,m5A=Object.create(null),Hf=class t{constructor(e,A,i){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;this.name=e,this.props=A,this.id=i,this.flags=n}static define(e){var A=e.props&&e.props.length?Object.create(null):m5A,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new t(e.name||"",A,e.id,i);if(e.props){for(var o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;var A=this.prop(Ir.group);return!!A&&A.indexOf(e)>-1}return this.id==e}static match(e){var A=Object.create(null);for(var i in e)for(var n of i.split(" "))A[n]=e[i];return o=>{for(var a=o.prop(Ir.group),r=-1;r<(a?a.length:0);r++){var s=A[r<0?o.name:a[r]];if(s)return s}}}};Hf.none=new Hf("",Object.create(null),0,8),(function(t){t[t.ExcludeBuffers=1]="ExcludeBuffers",t[t.IncludeAnonymous=2]="IncludeAnonymous",t[t.IgnoreMounts=4]="IgnoreMounts",t[t.IgnoreOverlays=8]="IgnoreOverlays"})(KZ||(KZ={})),new Ir({perNode:!0});Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-status-bar.svelte-1pmgv9j { + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-color-readonly, #b2b2b2); + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + margin: 0; + border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); + display: flex; + gap: var(--jse-padding, 10px); +} +.jse-status-bar.svelte-1pmgv9j:last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-status-bar.svelte-1pmgv9j .jse-status-bar-info:where(.svelte-1pmgv9j) { + padding: 2px; +}`);var w5A=JA('
        '),D5A=JA('
        '),y5A=JA('
        '),v5A=JA('
        '),ZR=ih.define([{tag:Fe.propertyName,color:"var(--internal-key-color)"},{tag:Fe.number,color:"var(--internal-value-color-number)"},{tag:Fe.bool,color:"var(--internal-value-color-boolean)"},{tag:Fe.string,color:"var(--internal-value-color-string)"},{tag:Fe.keyword,color:"var(--internal-value-color-null)"}]),b5A=mx(ZR),M5A=ZR.style;ZR.style=t=>M5A(t||[]);var S5A=[_o.fromClass(class{constructor(t){this.view=t,this.indentUnit=Cc(t.state),this.initialPaddingLeft=null,this.isChrome=window?.navigator.userAgent.includes("Chrome"),this.generate(t.state)}update(t){var e=Cc(t.state);(e!==this.indentUnit||t.docChanged||t.viewportChanged)&&(this.indentUnit=e,this.generate(t.state))}generate(t){var e=new jr;this.initialPaddingLeft?this.addStyleToBuilder(e,t,this.initialPaddingLeft):this.view.requestMeasure({read:A=>{var i=A.contentDOM.querySelector(".cm-line");i&&(this.initialPaddingLeft=window.getComputedStyle(i).getPropertyValue("padding-left"),this.addStyleToBuilder(e,A.state,this.initialPaddingLeft)),this.decorations=e.finish()}}),this.decorations=e.finish()}addStyleToBuilder(t,e,A){var i=this.getVisibleLines(e);for(var n of i){var{numColumns:o,containsTab:a}=this.numColumns(n.text,e.tabSize),r="calc(".concat(o+this.indentUnit,"ch + ").concat(A,")"),s=this.isChrome?"calc(-".concat(o+this.indentUnit,"ch - ").concat(a?1:0,"px)"):"-".concat(o+this.indentUnit,"ch");t.add(n.from,n.from,St.line({attributes:{style:"padding-left: ".concat(r,"; text-indent: ").concat(s,";")}}))}}getVisibleLines(t){var e=new Set,A=null;for(var{from:i,to:n}of this.view.visibleRanges)for(var o=i;o<=n;){var a=t.doc.lineAt(o);A!==a&&(e.add(a),A=a),o=a.to+1}return e}numColumns(t,e){var A=0,i=!1;A:for(var n=0;nt.decorations})];Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-text-mode.svelte-k2b9e6 { + --internal-key-color: var(--jse-key-color, #1a1a1a); + --internal-value-color-number: var(--jse-value-color-number, #ee422e); + --internal-value-color-boolean: var(--jse-value-color-boolean, #ff8c00); + --internal-value-color-string: var(--jse-value-color-string, #008000); + --internal-value-color-null: var(--jse-value-color-null, #004ed0); + flex: 1; + box-sizing: border-box; + display: flex; + flex-direction: column; + background: var(--jse-background-color, #fff); +} +.jse-text-mode.no-main-menu.svelte-k2b9e6 { + border-top: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) { + flex: 1; + display: flex; + position: relative; + flex-direction: column; + overflow: hidden; + min-width: 0; + min-height: 0; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6):last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents.jse-hidden:where(.svelte-k2b9e6) { + visibility: hidden; + position: absolute; + top: 0; + left: 0; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor { + flex: 1; + overflow: hidden; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-scroller { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + line-height: var(--jse-line-height, calc(1em + 4px)); + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-gutters { + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-color-readonly, #b2b2b2); + border-right: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-activeLine, +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-activeLineGutter { + background: var(--jse-active-line-background-color, rgba(0, 0, 0, 0.06)); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-selectionBackground { + background: var(--jse-selection-background-color, #d3d3d3); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-searchMatch { + background-color: var(--jse-search-match-color, #ffe665); + outline: var(--jse-search-match-outline, none); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-searchMatch.cm-searchMatch-selected { + background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); + outline: var(--jse-search-match-outline, 2px solid #e0be00); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-selectionMatch { + background-color: var(--jse-search-match-background-color, rgba(153, 255, 119, 0.5019607843)); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-foldPlaceholder { + background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); + border: none; + padding: 0 var(--jse-padding, 10px); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-tooltip { + font-size: var(--jse-font-size, 16px); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + color: var(--jse-tooltip-color, var(--jse-text-color, #4d4d4d)); + background: var(--jse-tooltip-background, var(--jse-modal-background, #f5f5f5)); + border: var(--jse-tooltip-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-diagnosticAction { + background: var(--jse-tooltip-action-button-color, var(--jse-text-color-inverse, #fff)); + background: var(--jse-tooltip-action-button-background, #4d4d4d); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-panels { + border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search { + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search input { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size-text-mode-search, 80%); + color: var(--jse-input-color, var(--jse-text-color, #4d4d4d)); + border: var(--jse-input-border, 1px solid #d8dbdf); + background: var(--jse-input-background, var(--jse-background-color, #fff)); + margin-right: 2px; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size-text-mode-search, 80%); + color: var(--jse-panel-button-color, inherit); + background: var(--jse-panel-button-background, transparent); + border: none; + cursor: pointer; + text-transform: capitalize; + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); + margin: 0; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button:hover { + color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); + background: var(--jse-panel-button-background-highlight, #e0e0e0); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search label { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size-text-mode-search, 80%); + padding-left: var(--jse-padding, 10px); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search label input { + margin-right: 2px; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button[name='close'] { + width: 32px; + height: 32px; + font-size: 24px; + line-height: 24px; + padding: 0; + right: 0; + top: -4px; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-cursor-primary { + border-color: var(--jse-text-color, #4d4d4d); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .jse-loading-space:where(.svelte-k2b9e6) { + flex: 1; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .jse-loading:where(.svelte-k2b9e6) { + flex: 2; + text-align: center; + color: var(--jse-panel-color-readonly, #b2b2b2); + box-sizing: border-box; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents.jse-preview:where(.svelte-k2b9e6) { + flex: 1; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-panel-color-readonly, #b2b2b2); + overflow: auto; + white-space: pre-wrap; + word-break: break-word; + padding: 2px; +} +.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + background: var(--jse-background-color, #fff); + border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); + border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-tip:where(.svelte-k2b9e6) { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-panel-color-readonly, #b2b2b2); +} +.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-progress-track:where(.svelte-k2b9e6) { + flex: 1; + height: 6px; + background: var(--jse-panel-background, #ebebeb); + border-radius: 3px; + overflow: hidden; + border: 1px solid var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-progress-fill:where(.svelte-k2b9e6) { + height: 100%; + background: linear-gradient(90deg, var(--jse-theme-color, #3883fa), var(--jse-theme-color-highlight, #5f9dff)); + border-radius: 2px; + transition: width 0.1s ease; + min-width: 2px; +} +.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-cancel-button:where(.svelte-k2b9e6) { + padding: 4px 12px; + font-size: 12px; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + background: var(--jse-theme-color, #3883fa); + color: #fff; + border-radius: 3px; + cursor: pointer; + transition: background-color 0.2s ease; + flex-shrink: 0; + border: 1px solid var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-cancel-button:where(.svelte-k2b9e6):hover { + background: var(--jse-theme-color-highlight, #5f9dff); + color: #fff; +}`);var k5A=JA('
        Collapsing
        '),x5A=JA('
        ',1),_5A=JA(" ",1),R5A=JA("
        ",1),N5A=JA('
        loading...
        '),F5A=JA("
        ");function L5A(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=L(e,"readOnly",9),o=L(e,"mainMenuBar",9),a=L(e,"statusBar",9),r=L(e,"askToFormat",9),s=L(e,"externalContent",9),l=L(e,"externalSelection",9),g=L(e,"history",9),C=L(e,"indentation",9),I=L(e,"tabSize",9),d=L(e,"escapeUnicodeCharacters",9),h=L(e,"parser",9),E=L(e,"validator",9),f=L(e,"validationParser",9),m=L(e,"onChange",9),v=L(e,"onChangeMode",9),k=L(e,"onSelect",9),S=L(e,"onUndo",9),b=L(e,"onRedo",9),x=L(e,"onError",9),F=L(e,"onFocus",9),z=L(e,"onBlur",9),P=L(e,"onRenderMenu",9),Z=L(e,"onSortModal",9),tA=L(e,"onTransformModal",9),W=or("jsoneditor:TextMode"),BA={key:"Mod-i",run:Qe,shift:GA,preventDefault:!0},X=typeof window>"u";W("isSSR:",X);var iA,AA=EA(void 0,!0),IA=EA(void 0,!0),aA=EA(void 0,!0),rA=EA(!1,!0),uA=EA(r(),!0),UA=EA([],!0),$A=EA(!1,!0),zA=EA(0,!0),pA=EA(0,!0),PA=null,Je=new d0,_e=new d0,YA=new d0,fA=new d0,XA=new d0,DA=s(),ee=EA(eR(DA,C(),h()),!0),NA=al.define(),ke=null;function HA(){if(!ke||ke.length===0)return!1;var xA=ke[0].startState,Ae=ke[ke.length-1].state,De=ke.map(FA=>FA.changes).reduce((FA,le)=>FA.compose(le)),mA={type:"text",undo:{changes:De.invert(xA.doc).toJSON(),selection:ra(xA.selection)},redo:{changes:De.toJSON(),selection:ra(Ae.selection)}};return W("add history item",mA),g().add(mA),ke=null,!0}var vA=EA(d(),!0);As(zt(function*(){if(!X)try{iA=(function(xA){var{target:Ae,initialText:De,readOnly:mA,indentation:FA}=xA;W("Create CodeMirror editor",{readOnly:mA,indentation:FA});var le=(function(nt,rt){return N_(nt)?nt.ranges.every(xt=>xt.anchor{N(aA,nt.state),nt.docChanged&&(nt.transactions.some(rt=>!!rt.annotation(NA))||(ke=[...ke??[],nt]),Zo()),nt.selectionSet&&Xo()}),jV(),AW({top:!0}),ci.lineWrapping,_e.of(qa.readOnly.of(mA)),fA.of(qa.tabSize.of(I())),YA.of(No(FA)),XA.of(ci.theme({},{dark:on()}))]});return iA=new ci({state:Ne,parent:Ae}),le&&iA.dispatch(iA.state.update({selection:le.main,scrollIntoView:!0})),iA})({target:c(AA),initialText:yo(c(ee),c(rA))?"":c(A).escapeValue(c(ee)),readOnly:n(),indentation:C()})}catch(xA){console.error(xA)}})),Dg(()=>{Do(),iA&&(W("Destroy CodeMirror editor"),iA.destroy()),oi()});var Gt=Y2(),ft=Y2();function he(){iA&&(W("focus"),iA.focus())}function Ot(xA,Ae){if(iA)try{(function(){var De=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],mA=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],FA=iA.state,le=FA.doc.length,Ne=Bx(FA,le,1/0);if(Ne){var nt=[];if(De.length===0)nt=pt(Ne,FA,void 0,mA);else{var{from:rt}=y_(c(A).escapeValue(c(ee)),De);rt!==void 0&&rt!==0&&(nt=pt(Ne,FA,rt,mA))}nt.length>0&&(function(xt){xe.apply(this,arguments)})(nt)}})(xA,Ae)}catch(De){x()(De)}}function He(){return Qx.of((xA,Ae,De)=>{var mA=Bx(xA,xA.doc.length,1/0);if(!mA||mA.lengthDe)){if(FA&&Ne.from=Ae&&rt.to>De&&(FA=rt)}}}return FA})}function je(xA){var Ae=xA.lastChild;return Ae&&Ae.to==xA.to&&Ae.type.isError}function pt(xA,Ae,De){var mA=!(arguments.length>3&&arguments[3]!==void 0)||arguments[3],FA=[],le=new Set;return xA.iterate({enter(Ne){if(De===void 0||Ne.from>=De){var nt=th(Ae,Ne.from,Ne.to);if(nt){var rt="".concat(nt.from,"-").concat(nt.to);if(!le.has(rt))if(mA)FA.push({from:nt.from,to:nt.to}),le.add(rt);else{var xt=FA.some(On=>On.from<=nt.from&&On.to>=nt.to);xt||(FA.push({from:nt.from,to:nt.to}),le.add(rt))}}}}}),FA}function xe(){return xe=zt(function*(xA){if(xA.length!==0){var Ae=xA.length>5e3;Ae&&(N($A,!0),N(zA,0),N(pA,xA.length),PA=new AbortController);var De=mA=>new Promise(FA=>{var le;Ae&&(le=PA)!==null&&le!==void 0&&le.signal.aborted?FA():requestAnimationFrame(()=>{var Ne=Math.min(mA+100,xA.length),nt=xA.slice(mA,Ne);iA.dispatch({effects:nt.map(rt=>oh.of({from:rt.from,to:rt.to}))}),Ae&&N(zA,Ne),Ne1&&arguments[1]!==void 0?arguments[1]:aR;if(iA)try{if(xA&&xA.length>0){var{from:De}=y_(c(A).escapeValue(c(ee)),xA);De!==void 0&&(iA.dispatch({selection:{anchor:De,head:De}}),ux(iA))}else fx(iA);Ae?.(xA)}catch(mA){x()(mA)}}function $(){j([],()=>!0)}function oA(){Ot([],!0)}var sA=!1;function TA(xA){return de(xA,!1)}function de(xA,Ae){W("handlePatch",xA,Ae);var De=h().parse(c(ee)),mA=tl(De,xA),FA=e8(De,xA);return Ei({text:h().stringify(mA,null,C())},Ae,!1),{json:mA,previousJson:De,undo:FA,redo:xA}}function Qe(){if(W("format"),n())return!1;try{var xA=h().parse(c(ee));return Ei({text:h().stringify(xA,null,C())},!0,!1),N(uA,r()),!0}catch(Ae){x()(Ae)}return!1}function GA(){if(W("compact"),n())return!1;try{var xA=h().parse(c(ee));return Ei({text:h().stringify(xA)},!0,!1),N(uA,!1),!0}catch(Ae){x()(Ae)}return!1}function OA(){if(W("repair"),!n())try{Ei({text:ag(c(ee))},!0,!1),N(ge,x_),N(mi,void 0)}catch(xA){x()(xA)}}function ht(){var xA;if(!n())try{var Ae=h().parse(c(ee));sA=!0,Z()({id:Gt,json:Ae,rootPath:[],onSort:(xA=zt(function*(De){var{operations:mA}=De;W("onSort",mA),de(mA,!0)}),function(De){return xA.apply(this,arguments)}),onClose:()=>{sA=!1,he()}})}catch(De){x()(De)}}function tt(xA){var{id:Ae,rootPath:De,onTransform:mA,onClose:FA}=xA;try{var le=h().parse(c(ee));sA=!0,tA()({id:Ae||ft,json:le,rootPath:De||[],onTransform:Ne=>{mA?mA({operations:Ne,json:le,transformedJson:tl(le,Ne)}):(W("onTransform",Ne),de(Ne,!0))},onClose:()=>{sA=!1,he(),FA&&FA()}})}catch(Ne){x()(Ne)}}function ze(){n()||tt({rootPath:[]})}function Oe(){iA&&(c(AA)&&c(AA).querySelector(".cm-search")?w5(iA):m5(iA))}function Ci(){if(n())return!1;Do();var xA=g().undo();return W("undo",xA),aZ(xA)?(iA.dispatch({annotations:NA.of("undo"),changes:Pr.fromJSON(xA.undo.changes),selection:Ie.fromJSON(xA.undo.selection),scrollIntoView:!0}),!0):(S()(xA),!1)}function gn(){if(n())return!1;Do();var xA=g().redo();return W("redo",xA),aZ(xA)?(iA.dispatch({annotations:NA.of("redo"),changes:Pr.fromJSON(xA.redo.changes),selection:Ie.fromJSON(xA.redo.selection),scrollIntoView:!0}),!0):(b()(xA),!1)}function hn(){N(rA,!0),Ei(s(),!0,!0)}function Ke(){v()(Da.tree)}function nn(){Yo()}function Si(xA){W("select validation error",xA);var{from:Ae,to:De}=Kt(xA);Ae!==void 0&&De!==void 0&&(Li(Ae,De),he())}function Li(xA,Ae){W("setSelection",{anchor:xA,head:Ae}),iA&&iA.dispatch(iA.state.update({selection:{anchor:xA,head:Ae},scrollIntoView:!0}))}function Zi(xA,Ae){if(Ae.state.selection.ranges.length===1){var De=Ae.state.selection.ranges[0],mA=c(ee).slice(De.from,De.to);if(mA==="{"||mA==="["){var FA=mR.default.parse(c(ee)),le=Object.keys(FA.pointers).find(nt=>{var rt;return((rt=FA.pointers[nt].value)===null||rt===void 0?void 0:rt.pos)===De.from}),Ne=FA.pointers[le];le&&Ne&&Ne.value&&Ne.valueEnd&&(W("pointer found, selecting inner contents of path:",le,Ne),Li(Ne.value.pos+1,Ne.valueEnd.pos-1))}}}function bt(){return RV(cn,{delay:300})}function on(){return!!c(AA)&&getComputedStyle(c(AA)).getPropertyValue("--jse-theme").includes("dark")}function Kt(xA){var{path:Ae,message:De,severity:mA}=xA,{line:FA,column:le,from:Ne,to:nt}=y_(c(A).escapeValue(c(ee)),Ae);return{path:Ae,line:FA,column:le,from:Ne,to:nt,message:De,severity:mA,actions:[]}}function G(xA,Ae){var{line:De,column:mA,position:FA,message:le}=xA;return{path:[],line:De,column:mA,from:FA,to:FA,severity:hc.error,message:le,actions:Ae&&!n()?[{name:"Auto repair",apply:()=>OA()}]:void 0}}function dt(xA){return{from:xA.from||0,to:xA.to||0,message:xA.message||"",actions:xA.actions,severity:xA.severity}}function Ei(xA,Ae,De){var mA=eR(xA,C(),h()),FA=!Mi(xA,DA),le=DA;W("setCodeMirrorContent",{isChanged:FA,emitChange:Ae,forceUpdate:De}),iA&&(FA||De)&&(DA=xA,N(ee,mA),yo(c(ee),c(rA))||iA.dispatch({changes:{from:0,to:iA.state.doc.length,insert:c(A).escapeValue(c(ee))}}),HA(),FA&&Ae&&Ba(DA,le))}function Qn(xA){return N_(xA)?Ie.fromJSON(xA):void 0}function un(){return Vn.apply(this,arguments)}function Vn(){return Vn=zt(function*(){W("refresh"),yield(function(){return Bo.apply(this,arguments)})()}),Vn.apply(this,arguments)}function Yo(){if(iA){var xA=iA?c(A).unescapeValue(iA.state.doc.toString()):"",Ae=xA!==c(ee);if(W("onChangeCodeMirrorValue",{isChanged:Ae}),Ae){var De=DA;N(ee,xA),DA={text:c(ee)},HA(),Ba(DA,De),Ro(),Xo()}}}function Bo(){return(Bo=zt(function*(){if(Ro(),iA){var xA=on();return W("updateTheme",{dark:xA}),iA.dispatch({effects:[XA.reconfigure(ci.theme({},{dark:xA}))]}),new Promise(Ae=>setTimeout(Ae))}return Promise.resolve()})).apply(this,arguments)}function No(xA){var Ae=ed.of(typeof xA=="number"?" ".repeat(xA):xA);return xA===" "?[Ae]:[Ae,S5A]}qR({onMount:As,onDestroy:Dg,getWindow:()=>Xf(c(IA)),hasFocus:()=>sA&&document.hasFocus()||RR(c(IA)),onFocus:F(),onBlur:()=>{Do(),z()()}});var Zo=ME(Yo,300);function Do(){Zo.flush()}function Ba(xA,Ae){m()&&m()(xA,Ae,{contentErrors:fn(),patchResult:void 0})}function Xo(){k()(ra(c(aA).selection))}function ra(xA){return Me({type:oo.text},xA.toJSON())}function yo(xA,Ae){return!!xA&&xA.length>S_&&!Ae}var ge=EA(x_,!0),mi=EA(void 0,!0);function cn(){if(yo(c(ee),c(rA)))return[];var xA=fn();if(oZ(xA)){var{parseError:Ae,isRepairable:De}=xA;return[dt(G(Ae,De))]}return t6A(xA)?xA.validationErrors.map(Kt).map(dt):[]}function fn(){W("validate:start"),Do();var xA=Ho(c(A).escapeValue(c(ee)),E(),h(),f());return oZ(xA)?(N(ge,xA.isRepairable?AZ:"invalid"),N(mi,xA.parseError),N(UA,[])):(N(ge,x_),N(mi,void 0),N(UA,xA?.validationErrors||[])),W("validate:end"),xA}var Ho=xE(D8A);function ya(){c(mi)&&(function(xA){W("select parse error",xA);var Ae=G(xA,!1);Li(Ae.from!=null?Ae.from:0,Ae.to!=null?Ae.to:0),he()})(c(mi))}var _i={icon:Qz,text:"Show me",title:"Move to the parse error location",onClick:ya};KA(()=>K(d()),()=>{N(A,xR({escapeControlCharacters:!1,escapeUnicodeCharacters:d()}))}),KA(()=>K(s()),()=>{Ei(s(),!1,!1)}),KA(()=>K(l()),()=>{(function(xA){if(N_(xA)){var Ae=Qn(xA);!iA||!Ae||c(aA)&&c(aA).selection.eq(Ae)||(W("applyExternalSelection",Ae),iA.dispatch({selection:Ae}))}})(l())}),KA(()=>K(E()),()=>{(function(xA){W("updateLinter",xA),iA&&iA.dispatch({effects:Je.reconfigure(bt())})})(E())}),KA(()=>K(C()),()=>{(function(xA){iA&&(W("updateIndentation",xA),iA.dispatch({effects:YA.reconfigure(No(xA))}))})(C())}),KA(()=>K(I()),()=>{(function(xA){iA&&(W("updateTabSize",xA),iA.dispatch({effects:fA.reconfigure(qa.tabSize.of(xA))}))})(I())}),KA(()=>K(n()),()=>{(function(xA){iA&&(W("updateReadOnly",xA),iA.dispatch({effects:[_e.reconfigure(qa.readOnly.of(xA))]}))})(n())}),KA(()=>(c(vA),K(d())),()=>{c(vA)!==d()&&(N(vA,d()),W("forceUpdateText",{escapeUnicodeCharacters:d()}),iA&&iA.dispatch({changes:{from:0,to:iA.state.doc.length,insert:c(A).escapeValue(c(ee))}}))}),KA(()=>(c(ge),K(n()),CC),()=>{N(i,c(ge)!==AZ||n()?[_i]:[{icon:CC,text:"Auto repair",title:"Automatically repair JSON",onClick:OA},_i])}),Rn();var Eo={focus:he,collapse:Ot,expand:j,patch:TA,handlePatch:de,openTransformModal:tt,refresh:un,flush:Do,validate:fn};ni(!0);var Za,vo=F5A(),Ta=dA(vo),Jn=xA=>{var Ae=it(()=>(c(ee),wA(()=>c(ee).length===0))),De=it(()=>!c(Ae)),mA=it(()=>!c(Ae)),FA=it(()=>!c(Ae)),le=it(()=>!c(Ae)),Ne=it(()=>!c(Ae)),nt=it(()=>!c(Ae));(function(rt,xt){Nt(xt,!1);var On=EA(void 0,!0),Ti=L(xt,"readOnly",9,!1),zi=L(xt,"onExpandAll",9),Xt=L(xt,"onCollapseAll",9),Ji=L(xt,"onFormat",9),va=L(xt,"onCompact",9),Ut=L(xt,"onSort",9),st=L(xt,"onTransform",9),Oi=L(xt,"onToggleSearch",9),Xi=L(xt,"onUndo",9),Wn=L(xt,"onRedo",9),pn=L(xt,"canExpandAll",9),_t=L(xt,"canCollapseAll",9),sa=L(xt,"canUndo",9),zo=L(xt,"canRedo",9),D=L(xt,"canFormat",9),M=L(xt,"canCompact",9),R=L(xt,"canSort",9),V=L(xt,"canTransform",9),_=L(xt,"onRenderMenu",9),q=EA(void 0,!0),nA=EA(void 0,!0),cA={type:"button",icon:m4,title:"Search (Ctrl+F)",className:"jse-search",onClick:Oi()},MA=EA(void 0,!0);KA(()=>(K(zi()),K(pn())),()=>{N(q,{type:"button",icon:K$,title:"Expand all",className:"jse-expand-all",onClick:zi(),disabled:!pn()})}),KA(()=>(K(Xt()),K(_t())),()=>{N(nA,{type:"button",icon:U$,title:"Collapse all",className:"jse-collapse-all",onClick:Xt(),disabled:!_t()})}),KA(()=>(K(Ti()),c(q),c(nA),K(Ji()),K(D()),K(va()),K(M()),K(Ut()),K(R()),K(st()),K(V()),K(Xi()),K(sa()),K(Wn()),K(zo())),()=>{N(MA,Ti()?[c(q),c(nA),{type:"separator"},cA,{type:"space"}]:[c(q),c(nA),{type:"separator"},{type:"button",icon:FZ,title:"Format JSON: add proper indentation and new lines (Ctrl+I)",className:"jse-format",onClick:Ji(),disabled:Ti()||!D()},{type:"button",icon:vwA,title:"Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)",className:"jse-compact",onClick:va(),disabled:Ti()||!M()},{type:"separator"},{type:"button",icon:y4,title:"Sort",className:"jse-sort",onClick:Ut(),disabled:Ti()||!R()},{type:"button",icon:p4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:st(),disabled:Ti()||!V()},cA,{type:"separator"},{type:"button",icon:Y8,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:Xi(),disabled:!sa()},{type:"button",icon:O8,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Wn(),disabled:!zo()},{type:"space"}])}),KA(()=>(K(_()),c(MA)),()=>{N(On,_()(c(MA))||c(MA))}),Rn(),ni(!0),KD(rt,{get items(){return c(On)}}),Ft()})(xA,{get readOnly(){return n()},onExpandAll:$,onCollapseAll:oA,onFormat:Qe,onCompact:GA,onSort:ht,onTransform:ze,onToggleSearch:Oe,onUndo:Ci,onRedo:gn,get canExpandAll(){return c(De)},get canCollapseAll(){return c(mA)},get canFormat(){return c(FA)},get canCompact(){return c(le)},get canSort(){return c(Ne)},get canTransform(){return c(nt)},get canUndo(){return K(g()),wA(()=>g().canUndo)},get canRedo(){return K(g()),wA(()=>g().canRedo)},get onRenderMenu(){return P()}})};jA(Ta,xA=>{o()&&xA(Jn)});var Ui=_A(Ta,2),qt=xA=>{var Ae=k5A(),De=_A(dA(Ae),2),mA=dA(De),FA=_A(De,2);Se(()=>mg(mA,"width: ".concat(c(pA)>0?c(zA)/c(pA)*100:0,"%"))),fe("click",FA,oi),CA(xA,Ae)};jA(Ui,xA=>{c($A)&&xA(qt)});var Nn=_A(Ui,2),ho=xA=>{var Ae,De=it(()=>(c(ee),c(rA),wA(()=>yo(c(ee),c(rA))))),mA=R5A(),FA=et(mA);Oo(FA,xt=>N(AA,xt),()=>c(AA));var le=_A(FA,2),Ne=xt=>{var On=x5A(),Ti=et(On),zi=it(()=>(K(iD),K(S_),c(ee),wA(()=>"The JSON document is larger than ".concat(iD(S_),", ")+"and may crash your browser when loading it in text mode. Actual size: ".concat(iD(c(ee).length),"."))));Yl(Ti,{get icon(){return z2},type:"error",get message(){return c(zi)},actions:[{text:"Open anyway",title:"Open the document in text mode. This may freeze or crash your browser.",onClick:hn},{text:"Open in tree mode",title:"Open the document in tree mode. Tree mode can handle large documents.",onClick:Ke},{text:"Cancel",title:"Cancel opening this large document.",onClick:nn}],onClose:he});var Xt=dA(_A(Ti,2));Se(Ji=>Lt(Xt,Ji),[()=>(K(SC),c(ee),K(cD),wA(()=>SC(c(ee)||"",cD)))]),CA(xt,On)};jA(le,xt=>{c(De)&&xt(Ne)});var nt=_A(le,2),rt=xt=>{var On=_5A(),Ti=et(On),zi=st=>{(function(Oi,Xi){Nt(Xi,!1);var Wn=L(Xi,"editorState",8),pn=EA(),_t=EA(),sa=EA(),zo=EA(),D=EA();KA(()=>K(Wn()),()=>{var MA;N(pn,(MA=Wn())===null||MA===void 0||(MA=MA.selection)===null||MA===void 0||(MA=MA.main)===null||MA===void 0?void 0:MA.head)}),KA(()=>(c(pn),K(Wn())),()=>{var MA;N(_t,c(pn)!==void 0?(MA=Wn())===null||MA===void 0||(MA=MA.doc)===null||MA===void 0?void 0:MA.lineAt(c(pn)):void 0)}),KA(()=>c(_t),()=>{N(sa,c(_t)!==void 0?c(_t).number:void 0)}),KA(()=>(c(_t),c(pn)),()=>{N(zo,c(_t)!==void 0&&c(pn)!==void 0?c(pn)-c(_t).from+1:void 0)}),KA(()=>K(Wn()),()=>{var MA;N(D,(MA=Wn())===null||MA===void 0||(MA=MA.selection)===null||MA===void 0||(MA=MA.ranges)===null||MA===void 0?void 0:MA.reduce((oe,se)=>oe+se.to-se.from,0))}),Rn(),ni();var M=v5A(),R=dA(M),V=MA=>{var oe=w5A(),se=dA(oe);Se(()=>{var Ee;return Lt(se,"Line: ".concat((Ee=c(sa))!==null&&Ee!==void 0?Ee:""))}),CA(MA,oe)};jA(R,MA=>{c(sa)!==void 0&&MA(V)});var _=_A(R,2),q=MA=>{var oe=D5A(),se=dA(oe);Se(()=>{var Ee;return Lt(se,"Column: ".concat((Ee=c(zo))!==null&&Ee!==void 0?Ee:""))}),CA(MA,oe)};jA(_,MA=>{c(zo)!==void 0&&MA(q)});var nA=_A(_,2),cA=MA=>{var oe=y5A(),se=dA(oe);Se(()=>{var Ee;return Lt(se,"Selection: ".concat((Ee=c(D))!==null&&Ee!==void 0?Ee:""," characters"))}),CA(MA,oe)};jA(nA,MA=>{c(D)!==void 0&&c(D)>0&&MA(cA)}),CA(Oi,M),Ft()})(st,{get editorState(){return c(aA)}})};jA(Ti,st=>{a()&&st(zi)});var Xt=_A(Ti,2),Ji=st=>{Yl(st,{type:"error",get icon(){return z2},get message(){return c(mi),wA(()=>c(mi).message)},get actions(){return c(i)},onClick:ya,onClose:he})};jA(Xt,st=>{c(mi)&&st(Ji)});var va=_A(Xt,2),Ut=st=>{var Oi=it(()=>[{icon:FZ,text:"Format",title:"Format JSON: add proper indentation and new lines (Ctrl+I)",onClick:Qe},{icon:D4,text:"No thanks",title:"Close this message",onClick:()=>N(uA,!1)}]);Yl(st,{type:"success",message:"Do you want to format the JSON?",get actions(){return c(Oi)},onClose:he})};jA(va,st=>{c(mi),c(uA),K(XW),c(ee),wA(()=>!c(mi)&&c(uA)&&XW(c(ee)))&&st(Ut)}),VR(_A(va,2),{get validationErrors(){return c(UA)},selectError:Si}),CA(xt,On)};jA(nt,xt=>{c(De)||xt(rt)}),Se(()=>Ae=ii(FA,1,"jse-contents svelte-k2b9e6",null,Ae,{"jse-hidden":c(De)})),CA(xA,mA)},Fo=xA=>{CA(xA,N5A())};return jA(Nn,xA=>{X?xA(Fo,!1):xA(ho)}),Oo(vo,xA=>N(IA,xA),()=>c(IA)),Se(()=>Za=ii(vo,1,"jse-text-mode svelte-k2b9e6",null,Za,{"no-main-menu":!o()})),CA(t,vo),jt(e,"focus",he),jt(e,"collapse",Ot),jt(e,"expand",j),jt(e,"patch",TA),jt(e,"handlePatch",de),jt(e,"openTransformModal",tt),jt(e,"refresh",un),jt(e,"flush",Do),jt(e,"validate",fn),Ft(Eo)}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-inline-value.svelte-1jv89ui { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + line-height: var(--jse-line-height, calc(1em + 4px)); + border: none; + padding: 0 calc(0.5 * var(--jse-padding, 10px)); + background: transparent; + color: inherit; + cursor: inherit; +} +.jse-inline-value.jse-highlight.svelte-1jv89ui { + background-color: var(--jse-search-match-color, #ffe665); + outline: var(--jse-search-match-outline, none); +} +.jse-inline-value.jse-highlight.jse-active.svelte-1jv89ui { + background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); + outline: var(--jse-search-match-outline, 2px solid #e0be00); +}`);var G5A=JA('');Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-column-header.svelte-5pxwfq { + background: none; + border: none; + font-family: inherit; + font-size: inherit; + color: inherit; + display: flex; + gap: var(--jse-padding, 10px); + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); + width: 100%; +} +.jse-column-header.svelte-5pxwfq:hover { + background: var(--jse-table-header-background-highlight, #e8e8e8); +} +.jse-column-header.svelte-5pxwfq:not(.jse-column-header.jse-readonly) { + cursor: pointer; +} +.jse-column-header.svelte-5pxwfq span.jse-column-sort-icon:where(.svelte-5pxwfq) { + height: 1em; +}`);var K5A=JA(''),U5A=JA('');Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-table-mode-welcome.svelte-1b9gnk8 { + flex: 1; + display: flex; + flex-direction: column; + overflow: auto; + align-items: center; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode-welcome.svelte-1b9gnk8:last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-space.jse-before:where(.svelte-1b9gnk8) { + flex: 1; +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) { + display: flex; + flex-direction: column; + gap: var(--jse-padding, 10px); + max-width: 400px; + margin: 2em var(--jse-padding, 10px); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-arrays-info:where(.svelte-1b9gnk8) { + color: var(--jse-panel-color-readonly, #b2b2b2); +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) { + display: flex; + align-items: center; + gap: var(--jse-padding, 10px); +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) .jse-nested-property-path:where(.svelte-1b9gnk8) { + flex: 1; +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) .jse-nested-property-path:where(.svelte-1b9gnk8) .jse-nested-property-count:where(.svelte-1b9gnk8) { + opacity: 0.5; + white-space: nowrap; +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8) { + text-align: left; + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-space.jse-after:where(.svelte-1b9gnk8) { + flex: 2; +}`);var T5A=JA(`An empty document cannot be opened in table mode. You can go to tree mode instead, or paste + a JSON Array using Ctrl+V.`,1),J5A=JA(''),O5A=JA('
        '),Y5A=JA('
        ');function H5A(t,e){Nt(e,!0);var A=Il(()=>e.json?(function(E){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:2,m=[];return(function v(k,S){ia(k)&&S.length{v(k[b],S.concat(b))}),Vo(k)&&m.push(S)})(E,[]),m})(e.json).slice(0,99).filter(E=>E.length>0):[]),i=Il(()=>!en(c(A))),n=Il(()=>e.json===void 0&&(e.text===""||e.text===void 0)),o=Il(()=>c(i)?"Object with nested arrays":c(n)?"An empty document":ia(e.json)?"An object":Vo(e.json)?"An empty array":"A ".concat(kR(e.json,e.parser))),a=Y5A();a.__click=()=>e.onClick();var r=_A(dA(a),2),s=dA(r),l=dA(s),g=_A(s,2),C=dA(g),I=E=>{CA(E,dr(`An object cannot be opened in table mode. You can open a nested array instead, or open the + document in tree mode.`))},d=E=>{var f=Fi(),m=et(f),v=S=>{CA(S,T5A())},k=S=>{var b=dr();Se(()=>{var x;return Lt(b,"".concat((x=c(o))!==null&&x!==void 0?x:""," cannot be opened in table mode. You can open the document in tree mode instead."))}),CA(S,b)};jA(m,S=>{c(n)&&!e.readOnly?S(v):S(k,!1)},!0),CA(E,f)};jA(C,E=>{c(i)?E(I):E(d,!1)});var h=_A(g,2);da(h,17,()=>c(A),ka,(E,f)=>{var m=Il(()=>(function(Z){return Xe(e.json,Z).length})(c(f))),v=O5A(),k=dA(v),S=dA(k),b=dA(_A(S)),x=_A(k,2);x.__click=()=>e.openJSONEditorModal(c(f));var F=dA(x),z=_A(x,2),P=Z=>{var tA=J5A();tA.__click=()=>e.extractPath(c(f)),CA(Z,tA)};jA(z,Z=>{e.readOnly||Z(P)}),Se(Z=>{var tA;Lt(S,'"'.concat(Z??"",'" ')),Lt(b,"(".concat((tA=c(m))!==null&&tA!==void 0?tA:""," ").concat(c(m)!==1?"items":"item",")")),Lt(F,e.readOnly?"View":"Edit")},[()=>Bl(c(f))]),CA(E,v)}),_A(h,2).__click=()=>e.onChangeMode(Da.tree),Se(()=>Lt(l,c(o))),CA(t,a),Ft()}Vf(["click"]);Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-column-header.svelte-1wgrwv3 { + background: none; + border: none; + font-family: inherit; + font-size: inherit; + color: inherit; + display: flex; + gap: var(--jse-padding, 10px); + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); + width: 100%; +} +.jse-column-header.svelte-1wgrwv3:hover { + background: var(--jse-table-header-background-highlight, #e8e8e8); +} +.jse-column-header.svelte-1wgrwv3:not(.jse-column-header.jse-readonly) { + cursor: pointer; +}`);var z5A=JA('');Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-table-mode.svelte-1p86y3c { + flex: 1; + display: flex; + flex-direction: column; + position: relative; + background: var(--jse-background-color, #fff); + min-width: 0; + min-height: 0; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-text-color, #4d4d4d); + line-height: var(--jse-line-height, calc(1em + 4px)); +} +.jse-table-mode.no-main-menu.svelte-1p86y3c { + border-top: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode.svelte-1p86y3c .jse-search-box-container:where(.svelte-1p86y3c) { + position: relative; + height: 0; + top: calc(var(--jse-line-height, calc(1em + 4px)) + 2 * var(--jse-padding, 10px)); + margin-right: calc(var(--jse-padding, 10px) + 20px); + margin-left: var(--jse-padding, 10px); + text-align: right; + z-index: 3; +} +.jse-table-mode.svelte-1p86y3c .jse-hidden-input-label:where(.svelte-1p86y3c) { + position: fixed; + right: 0; + top: 0; + width: 0; + height: 0; +} +.jse-table-mode.svelte-1p86y3c .jse-hidden-input-label:where(.svelte-1p86y3c) .jse-hidden-input:where(.svelte-1p86y3c) { + width: 0; + height: 0; + padding: 0; + border: 0; + outline: none; +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) { + flex: 1; + align-items: flex-start; + flex-direction: column; + display: flex; + overflow: auto; + overflow-anchor: none; + scrollbar-gutter: stable; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c):last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) { + border-collapse: collapse; + border-spacing: 0; +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-start-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c), +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-end-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c) { + margin: 0; + padding: 0; +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-search-box-background:where(.svelte-1p86y3c) { + background: var(--jse-table-header-background, #f5f5f5); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-end-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c) { + padding-bottom: var(--jse-padding, 10px); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c):hover { + background-color: var(--jse-table-row-odd-background, rgba(0, 0, 0, 0.05)); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) { + padding: 0 var(--jse-padding, 10px) 0 0; + vertical-align: top; + white-space: nowrap; + height: var(--jse-line-height, calc(1em + 4px)); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c), .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-gutter:where(.svelte-1p86y3c) { + font-weight: normal; + text-align: left; + color: var(--jse-text-readonly, #8d8d8d); + background: var(--jse-table-header-background, #f5f5f5); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c) { + padding: 0; + position: sticky; + top: 0; +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c) .jse-table-root-error:where(.svelte-1p86y3c) { + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-gutter:where(.svelte-1p86y3c) { + padding: 0 var(--jse-padding, 10px) 0 calc(0.5 * var(--jse-padding, 10px)); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer:where(.svelte-1p86y3c) { + display: inline-block; + cursor: var(--jse-contents-cursor, pointer); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer:where(.svelte-1p86y3c):hover { + background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer.jse-selected-value:where(.svelte-1p86y3c) { + background: var(--jse-selection-background-color, #d3d3d3); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-context-menu-anchor:where(.svelte-1p86y3c) { + display: inline-flex; + position: relative; + vertical-align: top; +} +.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) { + align-items: unset; +} +.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) .jse-loading-space:where(.svelte-1p86y3c) { + flex: 1; +} +.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) .jse-loading:where(.svelte-1p86y3c) { + flex: 2; + text-align: center; + color: var(--jse-panel-color-readonly, #b2b2b2); + box-sizing: border-box; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +}`);var P5A=JA('
        '),j5A=JA(''),q5A=JA(''),V5A=JA(' '),W5A=JA('
        '),Z5A=JA('
        '),X5A=JA(''),$5A=JA(''),ADA=JA('
        ',1),eDA=JA(" ",1),tDA=JA(' ',1),iDA=JA('
        loading...
        '),nDA=JA('
        ',1);function oDA(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=EA(void 0,!0),o=or("jsoneditor:TableMode"),{openAbsolutePopup:a,closeAbsolutePopup:r}=kI("absolute-popup"),s=R$(),l=Y2(),g=Y2(),C=typeof window>"u";o("isSSR:",C);var I=L(e,"readOnly",9),d=L(e,"externalContent",9),h=L(e,"externalSelection",9),E=L(e,"history",9),f=L(e,"truncateTextSize",9),m=L(e,"mainMenuBar",9),v=L(e,"escapeControlCharacters",9),k=L(e,"escapeUnicodeCharacters",9),S=L(e,"flattenColumns",9),b=L(e,"parser",9),x=L(e,"parseMemoizeOne",9),F=L(e,"validator",9),z=L(e,"validationParser",9),P=L(e,"indentation",9),Z=L(e,"onChange",9),tA=L(e,"onChangeMode",9),W=L(e,"onSelect",9),BA=L(e,"onUndo",9),X=L(e,"onRedo",9),iA=L(e,"onRenderValue",9),AA=L(e,"onRenderMenu",9),IA=L(e,"onRenderContextMenu",9),aA=L(e,"onFocus",9),rA=L(e,"onBlur",9),uA=L(e,"onSortModal",9),UA=L(e,"onTransformModal",9),$A=L(e,"onJSONEditorModal",9),zA=EA(void 0,!0),pA=EA(void 0,!0),PA=EA(void 0,!0),Je=EA(void 0,!0),_e=EA(void 0,!0);qR({onMount:As,onDestroy:Dg,getWindow:()=>Xf(c(pA)),hasFocus:()=>xe&&document.hasFocus()||RR(c(pA)),onFocus:()=>{oi=!0,aA()&&aA()()},onBlur:()=>{oi=!1,rA()&&rA()()}});var YA,fA=EA(void 0,!0),XA=EA(void 0,!0),DA=EA(void 0,!0),ee=EA(void 0,!0),NA=EA(void 0,!0),ke=EA(void 0,!0),HA=EA(!1,!0),vA=EA(!1,!0);function Gt(_){N(ke,(YA=_)?f$(c(fA),YA.items):void 0)}function ft(_){return he.apply(this,arguments)}function he(){return(he=zt(function*(_){N(OA,void 0),yield un(_)})).apply(this,arguments)}function Ot(){N(HA,!1),N(vA,!1),G()}var He=EA(1e4,!0),je=EA([],!0),pt=EA(void 0,!0),xe=!1,oi=!1,j=EA(!1,!0),$=EA({},!0),oA=EA(600,!0),sA=EA(0,!0),TA=18;function de(_){N(OA,_)}function Qe(_){c(OA)&&_!==void 0&&(vr(_,hd(c(OA)))&&vr(_,It(c(OA)))||(o("clearing selection: path does not exist anymore",c(OA)),N(OA,void 0)))}var GA=EA(c(fA)!==void 0?oR({json:c(fA)}):void 0,!0),OA=EA(Kf(h())?h():void 0,!0),ht=EA(void 0,!0),tt=EA(!1,!0);function ze(_){if(!I()){o("onSortByHeader",_);var q=_.sortDirection===ug.desc?-1:1;Li(T$(c(fA),[],_.path,q),(nA,cA)=>({state:cA,sortedColumn:_}))}}As(()=>{c(OA)&&Yo(It(c(OA)))});var Oe=EA(void 0,!0);function Ci(_){if(_.json!==void 0||_.text!==void 0){var q=c(fA)!==void 0&&_.json!==void 0;E().add({type:"tree",undo:{patch:q?[{op:"replace",path:"",value:_.json}]:void 0,json:_.json,text:_.text,documentState:_.documentState,textIsRepaired:_.textIsRepaired,selection:D0(_.selection),sortedColumn:_.sortedColumn},redo:{patch:q?[{op:"replace",path:"",value:c(fA)}]:void 0,json:c(fA),text:c(XA),documentState:c(GA),textIsRepaired:c(tt),selection:D0(c(OA)),sortedColumn:c(ht)}})}}var gn=EA([],!0),hn=xE(N$);function Ke(_,q,nA,cA){vh(()=>{var MA;try{MA=hn(_,q,nA,cA)}catch(oe){MA=[{path:[],message:"Failed to validate: "+oe.message,severity:hc.warning}]}Mi(MA,c(gn))||(o("validationErrors changed:",MA),N(gn,MA))},MA=>o("validationErrors updated in ".concat(MA," ms")))}function nn(){return o("validate"),c(DA)?{parseError:c(DA),isRepairable:!1}:(Ke(c(fA),F(),b(),z()),en(c(gn))?void 0:{validationErrors:c(gn)})}function Si(_,q){if(o("patch",_,q),c(fA)===void 0)throw new Error("Cannot apply patch: no JSON");var nA=c(fA),cA={json:void 0,text:c(XA),documentState:c(GA),selection:D0(c(OA)),sortedColumn:c(ht),textIsRepaired:c(tt)},MA=u$(c(fA),_),oe=r$(c(fA),c(GA),_),se=VwA(c(ht),_,c(je)),Ee=typeof q=="function"?q(oe.json,oe.documentState,c(OA)):void 0;return N(fA,Ee?.json!==void 0?Ee.json:oe.json),N(GA,Ee?.state!==void 0?Ee.state:oe.documentState),N(OA,Ee?.selection!==void 0?Ee.selection:c(OA)),N(ht,Ee?.sortedColumn!==void 0?Ee.sortedColumn:se),N(XA,void 0),N(tt,!1),N(ee,void 0),N(NA,void 0),N(DA,void 0),E().add({type:"tree",undo:Me({patch:MA},cA),redo:{patch:_,json:void 0,text:void 0,documentState:c(GA),selection:D0(c(OA)),sortedColumn:c(ht),textIsRepaired:c(tt)}}),{json:c(fA),previousJson:nA,undo:MA,redo:_}}function Li(_,q){o("handlePatch",_,q);var nA={json:c(fA),text:c(XA)},cA=Si(_,q);return Zi(nA,cA),cA}function Zi(_,q){if((_.json!==void 0||_?.text!==void 0)&&Z()){if(c(XA)!==void 0){var nA={text:c(XA),json:void 0};Z()(nA,_,{contentErrors:nn(),patchResult:q})}else if(c(fA)!==void 0){var cA={text:void 0,json:c(fA)};Z()(cA,_,{contentErrors:nn(),patchResult:q})}}}function bt(_){o("pasted json as text",_),N(ee,_)}function on(_){o("pasted multiline text",{pastedText:_}),N(NA,_)}function Kt(_){var q=parseInt(_[0],10),nA=[String(q+1),..._.slice(1)];return vr(c(fA),nA)?Hi(nA):Hi(_)}function G(){o("focus"),c(Je)&&(c(Je).focus(),c(Je).select())}function dt(_){N(sA,_.target.scrollTop)}function Ei(){c(OA)||N(OA,(function(){if(Vo(c(fA))&&!en(c(fA))&&!en(c(je)))return Hi(["0",...c(je)[0]])})())}function Qn(){if(c(tt)&&c(fA)!==void 0){var _={json:c(fA),text:c(XA)},q={json:c(fA),documentState:c(GA),selection:c(OA),sortedColumn:c(ht),text:c(XA),textIsRepaired:c(tt)};N(XA,void 0),N(tt,!1),Qe(c(fA)),Ci(q),Zi(_,void 0)}return{json:c(fA),text:c(XA)}}function un(_){var{scrollToWhenVisible:q=!0}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},nA=c(HA)?vf:0,cA=GZ(_,c(je),$,TA),MA=cA-c(sA)+nA+TA,oe=Bo(_);if(o("scrollTo",{path:_,top:cA,scrollTop:c(sA),elem:oe}),!c(PA))return Promise.resolve();var se=c(PA).getBoundingClientRect();if(oe&&!q){var Ee=oe.getBoundingClientRect();if(Ee.bottom>se.top&&Ee.top{s(oe,{container:c(PA),offset:Pe,duration:300,callback:()=>{Vn(_),Re()}})}:Re=>{s(MA,{container:c(PA),offset:Pe,duration:300,callback:()=>{Ro(),Vn(_),Re()}})})}function Vn(_){var q=Bo(_);if(q&&c(PA)){var nA=c(PA).getBoundingClientRect(),cA=q.getBoundingClientRect();if(cA.right>nA.right){var MA=cA.right-nA.right;Tl(PA,c(PA).scrollLeft+=MA)}if(cA.leftPe){var Re=MA-Pe;Tl(PA,c(PA).scrollTop+=Re)}if(cAk0(_.slice(1),oe)),MA=cA?_.slice(0,1).concat(cA):_;return(q=(nA=c(PA))===null||nA===void 0?void 0:nA.querySelector('td[data-path="'.concat(eD(MA),'"]')))!==null&&q!==void 0?q:void 0}function No(_){var q,{anchor:nA,left:cA,top:MA,width:oe,height:se,offsetTop:Ee,offsetLeft:Pe,showTip:Re}=_,Le=(function(yA){var{json:WA,documentState:Ge,selection:ye,readOnly:be,onEditValue:ot,onEditRow:Vt,onToggleEnforceString:Gi,onCut:Fn,onCopy:$i,onPaste:Qo,onRemove:$t,onDuplicateRow:$o,onInsertBeforeRow:Zn,onInsertAfterRow:Aa,onRemoveRow:mn}=yA,Tt=WA!==void 0,an=!!ye,Ai=WA!==void 0&&ye?Xe(WA,It(ye)):void 0,yt=Tt&&(Co(ye)||nr(ye)||En(ye)),Ii=!be&&Tt&&ye!==void 0&&dD(ye),la=Ii&&!aa(Ai),Xn=!be&&yt,ea=ye!==void 0&&v0(WA,Ge,It(ye));return[{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"label",text:"Table cell:"},{type:"dropdown-button",main:{type:"button",onClick:()=>ot(),icon:F1,text:"Edit",title:"Edit the value (Double-click on the value)",disabled:!Ii},width:"11em",items:[{type:"button",icon:F1,text:"Edit",title:"Edit the value (Double-click on the value)",onClick:()=>ot(),disabled:!Ii},{type:"button",icon:ea?X9:eS,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>Gi(),disabled:!la}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Fn(!0),icon:L1,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!Xn},width:"10em",items:[{type:"button",icon:L1,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>Fn(!0),disabled:be||!yt},{type:"button",icon:L1,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>Fn(!1),disabled:be||!yt}]},{type:"dropdown-button",main:{type:"button",onClick:()=>$i(!0),icon:IC,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!yt},width:"12em",items:[{type:"button",icon:IC,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>$i(!1),disabled:!yt},{type:"button",icon:IC,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>$i(!1),disabled:!yt}]},{type:"button",onClick:()=>Qo(),icon:V9,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:be||!an},{type:"button",onClick:()=>$t(),icon:T8,text:"Remove",title:"Remove selected contents (Delete)",disabled:be||!yt}]},{type:"column",items:[{type:"label",text:"Table row:"},{type:"button",onClick:()=>Vt(),icon:F1,text:"Edit row",title:"Edit the current row",disabled:be||!an||!Tt},{type:"button",onClick:()=>$o(),icon:Z9,text:"Duplicate row",title:"Duplicate the current row (Ctrl+D)",disabled:be||!an||!Tt},{type:"button",onClick:()=>Zn(),icon:G1,text:"Insert before",title:"Insert a row before the current row",disabled:be||!an||!Tt},{type:"button",onClick:()=>Aa(),icon:G1,text:"Insert after",title:"Insert a row after the current row",disabled:be||!an||!Tt},{type:"button",onClick:()=>mn(),icon:T8,text:"Remove row",title:"Remove current row",disabled:be||!an||!Tt}]}]}]})({json:c(fA),documentState:c(GA),selection:c(OA),readOnly:I(),onEditValue:Ba,onEditRow:Xo,onToggleEnforceString:ra,onCut:Za,onCopy:Ta,onPaste:mi,onRemove:Ui,onDuplicateRow:Nn,onInsertBeforeRow:ho,onInsertAfterRow:Fo,onRemoveRow:xA}),ai=(q=IA()(Le))!==null&&q!==void 0?q:Le;if(ai!==!1){var Yn={left:cA,top:MA,offsetTop:Ee,offsetLeft:Pe,width:oe,height:se,anchor:nA,closeOnOuterClick:!0,onClose:()=>{xe=!1,G()}};xe=!0;var eA=a(W$,{tip:Re?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:ai,onRequestClose(){r(eA),G()}},Yn)}}function Zo(_){if(!tr(c(OA)))if(_&&(_.stopPropagation(),_.preventDefault()),_&&_.type==="contextmenu"&&_.target!==c(Je))No({left:_.clientX,top:_.clientY,width:xC,height:kC,showTip:!1});else{var q,nA=(q=c(PA))===null||q===void 0?void 0:q.querySelector(".jse-table-cell.jse-selected-value");if(nA)No({anchor:nA,offsetTop:2,width:xC,height:kC,showTip:!1});else{var cA,MA=(cA=c(PA))===null||cA===void 0?void 0:cA.getBoundingClientRect();MA&&No({top:MA.top+2,left:MA.left+2,width:xC,height:kC,showTip:!1})}}}function Do(_){No({anchor:t$(_.target,"BUTTON"),offsetTop:0,width:xC,height:kC,showTip:!0})}function Ba(){if(!I()&&c(OA)){var _=It(c(OA));aa(Xe(c(fA),_))?rt(_):N(OA,Hi(_))}}function Xo(){!I()&&c(OA)&&rt(It(c(OA)).slice(0,1))}function ra(){if(!I()&&En(c(OA))){var _=c(OA).path,q=vt(_),nA=Xe(c(fA),_),cA=!v0(c(fA),c(GA),_),MA=cA?String(nA):$h(String(nA),b());o("handleToggleEnforceString",{enforceString:cA,value:nA,updatedValue:MA}),Li([{op:"replace",path:q,value:MA}],(oe,se)=>({state:_D(c(fA),se,_,{type:"value",enforceString:cA})}))}}function yo(){return ge.apply(this,arguments)}function ge(){return(ge=zt(function*(){if(o("apply pasted json",c(ee)),c(ee)){var{onPasteAsJson:_}=c(ee);_(),setTimeout(G)}})).apply(this,arguments)}function mi(){return cn.apply(this,arguments)}function cn(){return(cn=zt(function*(){try{mA(yield navigator.clipboard.readText())}catch(_){console.error(_),N(j,!0)}})).apply(this,arguments)}function fn(){return Ho.apply(this,arguments)}function Ho(){return(Ho=zt(function*(){o("apply pasted multiline text",c(NA)),c(NA)&&(mA(JSON.stringify(c(NA))),setTimeout(G))})).apply(this,arguments)}function ya(){o("clear pasted json"),N(ee,void 0),G()}function _i(){o("clear pasted multiline text"),N(NA,void 0),G()}function Eo(){tA()(Da.text)}function Za(_){return vo.apply(this,arguments)}function vo(){return(vo=zt(function*(_){yield H$({json:c(fA),selection:c(OA),indentation:_?P():void 0,readOnly:I(),parser:b(),onPatch:Li})})).apply(this,arguments)}function Ta(){return Jn.apply(this,arguments)}function Jn(){return Jn=zt(function*(){var _=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];c(fA)!==void 0&&(yield z$({json:c(fA),selection:c(OA),indentation:_?P():void 0,parser:b()}))}),Jn.apply(this,arguments)}function Ui(){j$({json:c(fA),text:c(XA),selection:c(OA),keepSelection:!0,readOnly:I(),onChange:Z(),onPatch:Li})}function qt(_){I()||(o("extract",{path:_}),Li(E$(c(fA),Hi(_))))}function Nn(){(function(_){var{json:q,selection:nA,columns:cA,readOnly:MA,onPatch:oe}=_;if(!MA&&q!==void 0&&nA&&Dh(nA)){var{rowIndex:se,columnIndex:Ee}=hg(It(nA),cA);ps("duplicate row",{rowIndex:se});var Pe=[String(se)];oe(B$(q,[Pe]),(Re,Le)=>({state:Le,selection:Hi(sd({rowIndex:se({state:Yn,selection:Hi(sd({rowIndex:Pe,columnIndex:Ee},cA))}))}})({json:c(fA),selection:c(OA),columns:c(je),readOnly:I(),onPatch:Li})}function xA(){(function(_){var{json:q,selection:nA,columns:cA,readOnly:MA,onPatch:oe}=_;if(!MA&&q!==void 0&&nA&&Dh(nA)){var{rowIndex:se,columnIndex:Ee}=hg(It(nA),cA);ps("remove row",{rowIndex:se}),oe(ED([[String(se)]]),(Pe,Re)=>{var Le=se0?se-1:void 0,ai=Le!==void 0?Hi(sd({rowIndex:Le,columnIndex:Ee},cA)):void 0;return ps("remove row new selection",{rowIndex:se,newRowIndex:Le,newSelection:ai}),{state:Re,selection:ai}})}})({json:c(fA),selection:c(OA),columns:c(je),readOnly:I(),onPatch:Li})}function Ae(){return(Ae=zt(function*(_){yield q$({char:_,selectInside:!1,json:c(fA),selection:c(OA),readOnly:I(),parser:b(),onPatch:Li,onReplaceJson:FA,onSelect:de})})).apply(this,arguments)}function De(_){var q;_.preventDefault(),mA((q=_.clipboardData)===null||q===void 0?void 0:q.getData("text/plain"))}function mA(_){_!==void 0&&P$({clipboardText:_,json:c(fA),selection:c(OA),readOnly:I(),parser:b(),onPatch:Li,onChangeText:le,onPasteMultilineText:on,openRepairModal:xt})}function FA(_,q){var nA={json:c(fA),text:c(XA)},cA={json:c(fA),documentState:c(GA),selection:c(OA),sortedColumn:c(ht),text:c(XA),textIsRepaired:c(tt)},MA=Ul(_,c(GA)),oe=typeof q=="function"?q(_,MA,c(OA)):void 0;N(fA,oe?.json!==void 0?oe.json:_),N(GA,oe?.state!==void 0?oe.state:MA),N(OA,oe?.selection!==void 0?oe.selection:c(OA)),N(ht,void 0),N(XA,void 0),N(tt,!1),N(DA,void 0),Qe(c(fA)),Ci(cA),Zi(nA,void 0)}function le(_,q){o("handleChangeText");var nA={json:c(fA),text:c(XA)},cA={json:c(fA),documentState:c(GA),selection:c(OA),sortedColumn:c(ht),text:c(XA),textIsRepaired:c(tt)};try{N(fA,x()(_)),N(GA,Ul(c(fA),c(GA))),N(XA,void 0),N(tt,!1),N(DA,void 0)}catch(oe){try{N(fA,x()(ag(_))),N(GA,Ul(c(fA),c(GA))),N(XA,_),N(tt,!0),N(DA,void 0)}catch(se){N(fA,void 0),N(GA,void 0),N(XA,_),N(tt,!1),N(DA,c(XA)!==""?Th(c(XA),oe.message||String(oe)):void 0)}}if(typeof q=="function"){var MA=q(c(fA),c(GA),c(OA));N(fA,MA?.json!==void 0?MA.json:c(fA)),N(GA,MA?.state!==void 0?MA.state:c(GA)),N(OA,MA?.selection!==void 0?MA.selection:c(OA))}Qe(c(fA)),Ci(cA),Zi(nA,void 0)}function Ne(_){o("select validation error",_),N(OA,Hi(_.path)),un(_.path)}function nt(_){if(c(fA)!==void 0){var{id:q,onTransform:nA,onClose:cA}=_,MA=_.rootPath||[];xe=!0,UA()({id:q||g,json:c(fA),rootPath:MA||[],onTransform:oe=>{nA?nA({operations:oe,json:c(fA),transformedJson:tl(c(fA),oe)}):(o("onTransform",MA,oe),Li(oe))},onClose:()=>{xe=!1,setTimeout(G),cA&&cA()}})}}function rt(_){o("openJSONEditorModal",{path:_}),xe=!0,$A()({content:{json:Xe(c(fA),_)},path:_,onPatch:Li,onClose:()=>{xe=!1,setTimeout(G)}})}function xt(_,q){N(_e,{text:_,onParse:nA=>Zf(nA,cA=>Wf(cA,b())),onRepair:jX,onApply:q,onClose:G})}function On(){(function(_){I()||c(fA)===void 0||(xe=!0,uA()({id:l,json:c(fA),rootPath:_,onSort:q=>{var{operations:nA,itemPath:cA,direction:MA}=q;o("onSort",nA,_,cA,MA),Li(nA,(oe,se)=>({state:se,sortedColumn:{path:cA,sortDirection:MA===-1?ug.desc:ug.asc}}))},onClose:()=>{xe=!1,setTimeout(G)}}))})([])}function Ti(){nt({rootPath:[]})}function zi(_){o("openFind",{findAndReplace:_}),N(HA,!1),N(vA,!1),Ro(),N(HA,!0),N(vA,_)}function Xt(){if(!I()&&E().canUndo){var _=E().undo();if(ID(_)){var q={json:c(fA),text:c(XA)};N(fA,_.undo.patch?tl(c(fA),_.undo.patch):_.undo.json),N(GA,_.undo.documentState),N(OA,_.undo.selection),N(ht,_.undo.sortedColumn),N(XA,_.undo.text),N(tt,_.undo.textIsRepaired),N(DA,void 0),o("undo",{item:_,json:c(fA)}),Zi(q,_.undo.patch&&_.redo.patch?{json:c(fA),previousJson:q.json,redo:_.undo.patch,undo:_.redo.patch}:void 0),G(),c(OA)&&un(It(c(OA)),{scrollToWhenVisible:!1})}else BA()(_)}}function Ji(){if(!I()&&E().canRedo){var _=E().redo();if(ID(_)){var q={json:c(fA),text:c(XA)};N(fA,_.redo.patch?tl(c(fA),_.redo.patch):_.redo.json),N(GA,_.redo.documentState),N(OA,_.redo.selection),N(ht,_.redo.sortedColumn),N(XA,_.redo.text),N(tt,_.redo.textIsRepaired),N(DA,void 0),o("redo",{item:_,json:c(fA)}),Zi(q,_.undo.patch&&_.redo.patch?{json:c(fA),previousJson:q.json,redo:_.redo.patch,undo:_.undo.patch}:void 0),G(),c(OA)&&un(It(c(OA)),{scrollToWhenVisible:!1})}else X()(_)}}function va(_){N(oA,_.getBoundingClientRect().height)}KA(()=>(K(v()),K(k())),()=>{N(zA,xR({escapeControlCharacters:v(),escapeUnicodeCharacters:k()}))}),KA(()=>c(HA),()=>{(function(_){if(c(PA)){var q=_?vf:-100;c(PA).scrollTo({top:Tl(PA,c(PA).scrollTop+=q),left:c(PA).scrollLeft})}})(c(HA))}),KA(()=>K(d()),()=>{(function(_){var q={json:c(fA)},nA=Rf(_)?_.text!==c(XA):!Mi(q.json,_.json);if(o("update external content",{isChanged:nA}),nA){var cA={json:c(fA),documentState:c(GA),selection:c(OA),sortedColumn:c(ht),text:c(XA),textIsRepaired:c(tt)};if(Rf(_))try{N(fA,x()(_.text)),N(GA,Ul(c(fA),c(GA))),N(XA,_.text),N(tt,!1),N(DA,void 0)}catch(MA){try{N(fA,x()(ag(_.text))),N(GA,Ul(c(fA),c(GA))),N(XA,_.text),N(tt,!0),N(DA,void 0)}catch(oe){N(fA,void 0),N(GA,void 0),N(XA,_.text),N(tt,!1),N(DA,c(XA)!==""?Th(c(XA),MA.message||String(MA)):void 0)}}else N(fA,_.json),N(GA,Ul(c(fA),c(GA))),N(XA,void 0),N(tt,!1),N(DA,void 0);Qe(c(fA)),N(ht,void 0),Ci(cA)}})(d())}),KA(()=>K(h()),()=>{(function(_){Mi(c(OA),_)||(o("applyExternalSelection",{selection:c(OA),externalSelection:_}),Kf(_)&&N(OA,_))})(h())}),KA(()=>(c(je),c(fA),K(S()),c(He)),()=>{N(je,Vo(c(fA))?(function(_,q){var nA=new Set(q.map(vt)),cA=new Set(_.map(vt));for(var MA of nA)cA.has(MA)||nA.delete(MA);for(var oe of cA)nA.has(oe)||nA.add(oe);return[...nA].map(Es)})(zwA(c(fA),S(),c(He)),c(je)):[])}),KA(()=>(c(fA),c(je)),()=>{N(pt,!(!c(fA)||en(c(je))))}),KA(()=>(c(fA),c(He)),()=>{N(A,Array.isArray(c(fA))&&c(fA).length>c(He))}),KA(()=>(c(sA),c(oA),c(fA),c(HA),vf),()=>{N(i,PwA(c(sA),c(oA),c(fA),$,TA,c(HA)?vf:0))}),KA(()=>c(fA),()=>{c(fA),c(PA)&&c(PA).scrollTo({top:c(PA).scrollTop,left:c(PA).scrollLeft})}),KA(()=>c(OA),()=>{var _;_=c(OA),Mi(_,h())||(o("onSelect",_),W()(_))}),KA(()=>(K(I()),K(f()),K(b()),c(zA),c(fA),c(GA),K(iA())),()=>{N(Oe,{mode:Da.table,readOnly:I(),truncateTextSize:f(),parser:b(),normalization:c(zA),getJson:()=>c(fA),getDocumentState:()=>c(GA),findElement:Bo,findNextInside:Kt,focus:G,onPatch:(_,q)=>Li((function(nA,cA){return nA.flatMap(MA=>{if($6(MA)){var oe=Es(MA.path);if(oe.length>0){for(var se=[MA],Ee=Yi(oe);Ee.length>0&&!vr(cA,Ee);)se.unshift({op:"add",path:vt(Ee),value:{}}),Ee=Yi(Ee);return se}}return MA})})(_,c(fA)),q),onSelect:de,onFind:zi,onPasteJson:bt,onRenderValue:iA()})}),KA(()=>(c(fA),K(F()),K(b()),K(z())),()=>{Ke(c(fA),F(),b(),z())}),KA(()=>(c(gn),c(je)),()=>{N(n,jwA(c(gn),c(je)))}),Rn();var Ut={validate:nn,patch:Si,focus:G,acceptAutoRepair:Qn,scrollTo:un,findElement:Bo,openTransformModal:nt};ni(!0);var st=nDA();fe("mousedown",NC,function(_){!AQ(_.target,q=>q===c(pA))&&tr(c(OA))&&(o("click outside the editor, exit edit mode"),N(OA,D0(c(OA))),oi&&c(Je)&&(c(Je).focus(),c(Je).blur()),o("blur (outside editor)"),c(Je)&&c(Je).blur())});var Oi,Xi=et(st),Wn=dA(Xi),pn=_=>{(function(q,nA){Nt(nA,!1);var cA=L(nA,"containsValidArray",9),MA=L(nA,"readOnly",9),oe=L(nA,"showSearch",13,!1),se=L(nA,"history",9),Ee=L(nA,"onSort",9),Pe=L(nA,"onTransform",9),Re=L(nA,"onContextMenu",9),Le=L(nA,"onUndo",9),ai=L(nA,"onRedo",9),Yn=L(nA,"onRenderMenu",9);function eA(){oe(!oe())}var yA=EA(void 0,!0),WA=EA(void 0,!0);KA(()=>(K(MA()),K(Ee()),K(cA()),K(Pe()),K(Re()),K(Le()),K(se()),K(ai())),()=>{N(yA,MA()?[{type:"space"}]:[{type:"button",icon:y4,title:"Sort",className:"jse-sort",onClick:Ee(),disabled:MA()||!cA()},{type:"button",icon:p4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:Pe(),disabled:MA()||!cA()},{type:"button",icon:m4,title:"Search (Ctrl+F)",className:"jse-search",onClick:eA,disabled:!cA()},{type:"button",icon:W9,title:LR,className:"jse-contextmenu",onClick:Re()},{type:"separator"},{type:"button",icon:Y8,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:Le(),disabled:!se().canUndo},{type:"button",icon:O8,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:ai(),disabled:!se().canRedo},{type:"space"}])}),KA(()=>(K(Yn()),c(yA)),()=>{N(WA,Yn()(c(yA))||c(yA))}),Rn(),ni(!0),KD(q,{get items(){return c(WA)}}),Ft()})(_,{get containsValidArray(){return c(pt)},get readOnly(){return I()},get history(){return E()},onSort:On,onTransform:Ti,onUndo:Xt,onRedo:Ji,onContextMenu:Do,get onRenderMenu(){return AA()},get showSearch(){return c(HA)},set showSearch(q){N(HA,q)},$$legacy:!0})};jA(Wn,_=>{m()&&_(pn)});var _t=_A(Wn,2),sa=_=>{var q=tDA(),nA=et(q),cA=dA(nA);cA.readOnly=!0,Oo(cA,Ee=>N(Je,Ee),()=>c(Je));var MA=_A(nA,2),oe=Ee=>{var Pe=ADA(),Re=et(Pe);J$(dA(Re),{get json(){return c(fA)},get documentState(){return c(GA)},get parser(){return b()},get showSearch(){return c(HA)},get showReplace(){return c(vA)},get readOnly(){return I()},get columns(){return c(je)},onSearch:Gt,onFocus:ft,onPatch:Li,onClose:Ot});var Le=_A(Re,2),ai=dA(Le),Yn=dA(ai),eA=dA(Yn),yA=dA(eA),WA=dA(yA),Ge=yt=>{var Ii=it(()=>(K(Eh),c(n),wA(()=>{var Ea;return Eh([],(Ea=c(n))===null||Ea===void 0?void 0:Ea.root)}))),la=Fi(),Xn=et(la),ea=Ea=>{var Er=P5A();Rh(dA(Er),{get validationError(){return c(Ii)},get onExpand(){return Qg}}),CA(Ea,Er)};jA(Xn,Ea=>{c(Ii)&&Ea(ea)}),CA(yt,la)};jA(WA,yt=>{K(en),c(n),wA(()=>{var Ii;return!en((Ii=c(n))===null||Ii===void 0?void 0:Ii.root)})&&yt(Ge)});var ye=_A(yA);da(ye,1,()=>c(je),ka,(yt,Ii)=>{var la=j5A();(function(Xn,ea){Nt(ea,!1);var Ea=EA(void 0,!0),Er=EA(void 0,!0),L0=EA(void 0,!0),fl=L(ea,"path",9),bg=L(ea,"sortedColumn",9),_c=L(ea,"readOnly",9),Mg=L(ea,"onSort",9);KA(()=>(K(fl()),Bl),()=>{N(Ea,en(fl())?"values":Bl(fl()))}),KA(()=>(K(bg()),K(fl())),()=>{var xa;N(Er,bg()&&Mi(fl(),(xa=bg())===null||xa===void 0?void 0:xa.path)?bg().sortDirection:void 0)}),KA(()=>(c(Er),eZ),()=>{N(L0,c(Er)?eZ[c(Er)]:void 0)}),Rn(),ni(!0);var is,hr=U5A(),pl=dA(hr),G0=dA(pl),ml=_A(pl,2),Ln=xa=>{var _a=K5A(),YI=dA(_a),Jd=it(()=>(c(Er),K(ug),K(c0),K(AS),wA(()=>c(Er)===ug.asc?c0:AS)));tn(YI,{get data(){return c(Jd)}}),Se(()=>_n(_a,"title","Currently sorted in ".concat(c(L0)," order"))),CA(xa,_a)};jA(ml,xa=>{c(Er)!==void 0&&xa(Ln)}),Se(xa=>{is=ii(hr,1,"jse-column-header svelte-5pxwfq",null,is,{"jse-readonly":_c()}),_n(hr,"title",_c()?c(Ea):c(Ea)+" (Click to sort the data by this column)"),Lt(G0,xa)},[()=>(K(SC),c(Ea),K(50),wA(()=>SC(c(Ea),50)))]),fe("click",hr,function(){_c()||Mg()({path:fl(),sortDirection:c(Er)===ug.asc?ug.desc:ug.asc})}),CA(Xn,hr),Ft()})(dA(la),{get path(){return c(Ii)},get sortedColumn(){return c(ht)},get readOnly(){return I()},onSort:ze}),CA(yt,la)});var be=_A(ye),ot=yt=>{var Ii=q5A(),la=dA(Ii),Xn=it(()=>(c(fA),wA(()=>Array.isArray(c(fA))?c(fA).length:0)));(function(ea,Ea){Nt(Ea,!1);var Er=L(Ea,"count",9),L0=L(Ea,"maxSampleCount",9),fl=L(Ea,"readOnly",9),bg=L(Ea,"onRefresh",9);ni(!0);var _c,Mg=z5A();tn(dA(Mg),{get data(){return Bz}}),Se(()=>{_c=ii(Mg,1,"jse-column-header svelte-1wgrwv3",null,_c,{"jse-readonly":fl()}),_n(Mg,"title","The Columns are created by sampling ".concat(L0()," items out of ").concat(Er(),". ")+"If you're missing a column, click here to sample all of the items instead of a subset. This is slower.")}),fe("click",Mg,()=>bg()()),CA(ea,Mg),Ft()})(la,{get count(){return c(Xn)},get maxSampleCount(){return c(He)},get readOnly(){return I()},onRefresh:()=>N(He,1/0)}),CA(yt,Ii)};jA(be,yt=>{c(A)&&yt(ot)});var Vt,Gi,Fn=_A(eA),$i=dA(Fn),Qo=_A(Fn);da(Qo,1,()=>(c(i),wA(()=>c(i).visibleItems)),ka,(yt,Ii,la)=>{var Xn=it(()=>(c(i),wA(()=>c(i).startIndex+la))),ea=it(()=>(c(n),K(c(Xn)),wA(()=>c(n).rows[c(Xn)]))),Ea=it(()=>(K(Eh),K(c(Xn)),K(c(ea)),wA(()=>{var is;return Eh([String(c(Xn))],(is=c(ea))===null||is===void 0?void 0:is.row)}))),Er=it(()=>(K(m0),c(fA),c(ke),K(c(Xn)),wA(()=>m0(c(fA),c(ke),[String(c(Xn))])))),L0=$5A(),fl=dA(L0);GX(fl,()=>c(Xn),is=>{var hr=V5A(),pl=dA(hr),G0=_A(pl),ml=Ln=>{Rh(Ln,{get validationError(){return c(Ea)},get onExpand(){return Qg}})};jA(G0,Ln=>{c(Ea)&&Ln(ml)}),ms(hr,(Ln,xa)=>q5?.(Ln,xa),()=>Ln=>(function(xa,_a){$[_a]=xa.getBoundingClientRect().height})(Ln,c(Xn))),Se(()=>{var Ln;return Lt(pl,"".concat((Ln=c(Xn))!==null&&Ln!==void 0?Ln:""," "))}),CA(is,hr)});var bg=_A(fl);da(bg,1,()=>c(je),ka,(is,hr,pl,G0)=>{var ml,Ln=it(()=>(K(c(Xn)),c(hr),wA(()=>[String(c(Xn))].concat(c(hr))))),xa=it(()=>(K(Xe),c(Ii),c(hr),wA(()=>Xe(c(Ii),c(hr))))),_a=it(()=>(K(En),c(OA),K(k0),K(c(Ln)),wA(()=>En(c(OA))&&k0(c(OA).path,c(Ln))))),YI=it(()=>(K(c(ea)),wA(()=>{var Ra;return(Ra=c(ea))===null||Ra===void 0?void 0:Ra.columns[pl]}))),Jd=it(()=>(K(Eh),K(c(Ln)),K(c(YI)),wA(()=>Eh(c(Ln),c(YI))))),HI=Z5A(),DQ=dA(HI),Od=dA(DQ),yQ=Ra=>{var Hl=it(()=>(K(hD),K(m0),c(Ii),K(c(Er)),c(hr),wA(()=>hD(m0(c(Ii),c(Er),c(hr)))))),vQ=it(()=>(K(c(Hl)),wA(()=>!!c(Hl)&&c(Hl).some(PI=>PI.active)))),bQ=it(()=>(K(en),K(c(Hl)),wA(()=>!en(c(Hl)))));(function(PI,Fr){Nt(Fr,!1);var MQ=L(Fr,"path",9),wF=L(Fr,"value",9),DF=L(Fr,"parser",9),xiA=L(Fr,"isSelected",9),_iA=L(Fr,"containsSearchResult",9),RiA=L(Fr,"containsActiveSearchResult",9),NiA=L(Fr,"onEdit",9);ni(!0);var yF,L3=G5A(),FiA=dA(L3);Se(SQ=>{yF=ii(L3,1,"jse-inline-value svelte-1jv89ui",null,yF,{"jse-selected":xiA(),"jse-highlight":_iA(),"jse-active":RiA()}),Lt(FiA,SQ)},[()=>(K(SC),K(DF()),K(wF()),K(50),wA(()=>{var SQ;return SC((SQ=DF().stringify(wF()))!==null&&SQ!==void 0?SQ:"",50)}))]),fe("dblclick",L3,()=>NiA()(MQ())),CA(PI,L3),Ft()})(Ra,{get path(){return c(Ln)},get value(){return c(xa)},get parser(){return b()},get isSelected(){return c(_a)},get containsSearchResult(){return c(bQ)},get containsActiveSearchResult(){return c(vQ)},onEdit:rt})},Hv=Ra=>{var Hl=it(()=>(K(m0),c(fA),c(ke),K(c(Ln)),wA(()=>{var Fr;return(Fr=m0(c(fA),c(ke),c(Ln)))===null||Fr===void 0?void 0:Fr.searchResults}))),vQ=it(()=>c(xa)!==void 0?c(xa):""),bQ=it(()=>(K(v0),c(fA),c(GA),K(c(Ln)),wA(()=>v0(c(fA),c(GA),c(Ln))))),PI=it(()=>c(_a)?c(OA):void 0);G$(Ra,{get path(){return c(Ln)},get value(){return c(vQ)},get enforceString(){return c(bQ)},get selection(){return c(PI)},get searchResultItems(){return c(Hl)},get context(){return c(Oe)}})};jA(Od,Ra=>{K(aa),K(c(xa)),wA(()=>aa(c(xa)))?Ra(yQ):Ra(Hv,!1)});var zv=_A(Od),Pv=Ra=>{var Hl=W5A();cI(dA(Hl),{selected:!0,onContextMenu:No}),CA(Ra,Hl)};jA(zv,Ra=>{K(I()),K(c(_a)),K(tr),c(OA),wA(()=>!I()&&c(_a)&&!tr(c(OA)))&&Ra(Pv)});var Rc=_A(DQ,2),zI=Ra=>{Rh(Ra,{get validationError(){return c(Jd)},get onExpand(){return Qg}})};jA(Rc,Ra=>{c(Jd)&&Ra(zI)}),Se(Ra=>{_n(HI,"data-path",Ra),ml=ii(DQ,1,"jse-value-outer svelte-1p86y3c",null,ml,{"jse-selected-value":c(_a)})},[()=>(K(eD),K(c(Ln)),wA(()=>eD(c(Ln))))]),CA(is,HI)});var _c=_A(bg),Mg=is=>{CA(is,X5A())};jA(_c,is=>{c(A)&&is(Mg)}),CA(yt,L0)});var $t,$o=dA(_A(Qo));Oo(Le,yt=>N(PA,yt),()=>c(PA)),ms(Le,(yt,Ii)=>q5?.(yt,Ii),()=>va),_r(()=>fe("scroll",Le,dt));var Zn=_A(Le,2),Aa=yt=>{var Ii=it(()=>(c(ee),wA(()=>"You pasted a JSON ".concat(Array.isArray(c(ee).contents)?"array":"object"," as text")))),la=it(()=>[{icon:CC,text:"Paste as JSON instead",title:"Paste the text as JSON instead of a single value",onMouseDown:yo},{text:"Leave as is",title:"Keep the pasted content as a single value",onClick:ya}]);Yl(yt,{type:"info",get message(){return c(Ii)},get actions(){return c(la)}})};jA(Zn,yt=>{c(ee)&&yt(Aa)});var mn=_A(Zn,2),Tt=yt=>{var Ii=it(()=>[{icon:CC,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:fn},{text:"Leave as is",title:"Keep the pasted array",onClick:_i}]);Yl(yt,{type:"info",message:"Multiline text was pasted as array",get actions(){return c(Ii)}})};jA(mn,yt=>{c(NA)&&yt(Tt)});var an=_A(mn,2),Ai=yt=>{var Ii=it(()=>I()?[]:[{icon:J8,text:"Ok",title:"Accept the repaired document",onClick:Qn},{icon:w4,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:Eo}]);Yl(yt,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return c(Ii)},onClose:G})};jA(an,yt=>{c(tt)&&yt(Ai)}),VR(_A(an,2),{get validationErrors(){return c(gn)},selectError:Ne}),Se(()=>{Vt=ii(Fn,1,"jse-table-invisible-start-section svelte-1p86y3c",null,Vt,{"jse-search-box-background":c(HA)}),_n($i,"colspan",(c(je),wA(()=>c(je).length))),Gi=mg($i,"",Gi,{height:(c(i),wA(()=>c(i).startHeight+"px"))}),_n($o,"colspan",(c(je),wA(()=>c(je).length))),$t=mg($o,"",$t,{height:(c(i),wA(()=>c(i).endHeight+"px"))})}),CA(Ee,Pe)},se=Ee=>{var Pe=Fi(),Re=et(Pe),Le=Yn=>{var eA=eDA(),yA=et(eA),WA=it(()=>I()?[]:[{icon:w4,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:Eo}]);Yl(yA,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return c(WA)}}),V$(_A(yA,2),{get text(){return c(XA)},get json(){return c(fA)},get indentation(){return P()},get parser(){return b()}}),CA(Yn,eA)},ai=Yn=>{H5A(Yn,{get text(){return c(XA)},get json(){return c(fA)},get readOnly(){return I()},get parser(){return b()},openJSONEditorModal:rt,extractPath:qt,get onChangeMode(){return tA()},onClick:()=>{G()}})};jA(Re,Yn=>{c(DA)&&c(XA)!==void 0&&c(XA)!==""?Yn(Le):Yn(ai,!1)},!0),CA(Ee,Pe)};jA(MA,Ee=>{c(pt)?Ee(oe):Ee(se,!1)}),fe("paste",cA,De),CA(_,q)},zo=_=>{CA(_,iDA())};jA(_t,_=>{C?_(zo,!1):_(sa)}),Oo(Xi,_=>N(pA,_),()=>c(pA));var D=_A(Xi,2),M=_=>{F$(_,{onClose:()=>N(j,!1)})};jA(D,_=>{c(j)&&_(M)});var R=_A(D,2),V=_=>{L$(_,DI(()=>c(_e),{onClose:()=>{var q;(q=c(_e))===null||q===void 0||q.onClose(),N(_e,void 0)}}))};return jA(R,_=>{c(_e)&&_(V)}),Se(()=>Oi=ii(Xi,1,"jse-table-mode svelte-1p86y3c",null,Oi,{"no-main-menu":!m()})),fe("mousedown",Xi,function(_){if(_.buttons===1||_.buttons===2){var q=_.target;q.isContentEditable||G();var nA=i$(q);if(nA){if(tr(c(OA))&&Uf(c(fA),c(OA),nA))return;N(OA,Hi(nA)),_.preventDefault()}}}),fe("keydown",Xi,function(_){var q=TC(_);if(o("keydown",{combo:q,key:_.key}),q==="Ctrl+X"&&(_.preventDefault(),Za(!0)),q==="Ctrl+Shift+X"&&(_.preventDefault(),Za(!1)),q==="Ctrl+C"&&(_.preventDefault(),Ta(!0)),q==="Ctrl+Shift+C"&&(_.preventDefault(),Ta(!1)),q==="Ctrl+D"&&(_.preventDefault(),Nn()),q!=="Delete"&&q!=="Backspace"||(_.preventDefault(),Ui()),q==="Insert"&&_.preventDefault(),q==="Ctrl+A"&&_.preventDefault(),q==="Ctrl+Q"&&Zo(_),q==="ArrowLeft"&&(_.preventDefault(),Ei(),c(OA))){var nA=(function(Pe,Re){var{rowIndex:Le,columnIndex:ai}=hg(It(Re),Pe);return ai>0?Hi(sd({rowIndex:Le,columnIndex:ai-1},Pe)):Re})(c(je),c(OA));N(OA,nA),Yo(It(nA))}if(q==="ArrowRight"&&(_.preventDefault(),Ei(),c(OA))){var cA=(function(Pe,Re){var{rowIndex:Le,columnIndex:ai}=hg(It(Re),Pe);return ai0?Hi(sd({rowIndex:Le-1,columnIndex:ai},Pe)):Re})(c(je),c(OA));N(OA,MA),Yo(It(MA))}if(q==="ArrowDown"&&(_.preventDefault(),Ei(),c(OA))){var oe=(function(Pe,Re,Le){var{rowIndex:ai,columnIndex:Yn}=hg(It(Le),Re);return aiN(zA,$)}).get()),pA=EA(s());function PA($){if(rZ($)){N(pA,$.undo.mode);var oA=c(zA).items(),sA=oA.findIndex(de=>de===$),TA=sA!==-1?oA[sA-1]:void 0;$A("handleUndo",{index:sA,item:$,items:oA,prevItem:TA}),TA&&i(TA.redo.selection),F()(c(pA))}}function Je($){if(rZ($)){N(pA,$.redo.mode);var oA=c(zA).items(),sA=oA.findIndex(de=>de===$),TA=sA!==-1?oA[sA+1]:void 0;$A("handleRedo",{index:sA,item:$,items:oA,nextItem:TA}),TA&&i(TA.undo.selection),F()(c(pA))}}var _e=EA(),YA={type:"separator"},fA=EA(),XA=EA();function DA($){if(c(rA))return c(rA).patch($);if(c(uA))return c(uA).patch($);if(c(UA))return c(UA).patch($);throw new Error('Method patch is not available in mode "'.concat(c(pA),'"'))}function ee($,oA){if(c(rA))return c(rA).expand($,oA);if(c(UA))return c(UA).expand($,oA);throw new Error('Method expand is not available in mode "'.concat(c(pA),'"'))}function NA($,oA){if(c(rA))return c(rA).collapse($,oA);if(c(UA))return c(UA).collapse($,oA);throw new Error('Method collapse is not available in mode "'.concat(c(pA),'"'))}function ke($){if(c(UA))c(UA).openTransformModal($);else if(c(rA))c(rA).openTransformModal($);else{if(!c(uA))throw new Error('Method transform is not available in mode "'.concat(c(pA),'"'));c(uA).openTransformModal($)}}function HA(){if(c(UA))return c(UA).validate();if(c(rA))return c(rA).validate();if(c(uA))return c(uA).validate();throw new Error('Method validate is not available in mode "'.concat(c(pA),'"'))}function vA(){return c(rA)?c(rA).acceptAutoRepair():A()}function Gt($){if(c(rA))return c(rA).scrollTo($);if(c(uA))return c(uA).scrollTo($);throw new Error('Method scrollTo is not available in mode "'.concat(c(pA),'"'))}function ft($){if(c(rA))return c(rA).findElement($);if(c(uA))return c(uA).findElement($);throw new Error('Method findElement is not available in mode "'.concat(c(pA),'"'))}function he(){c(UA)?c(UA).focus():c(rA)?c(rA).focus():c(uA)&&c(uA).focus()}function Ot(){return He.apply(this,arguments)}function He(){return(He=zt(function*(){c(UA)&&(yield c(UA).refresh())})).apply(this,arguments)}KA(()=>K(s()),()=>{(function($){if($!==c(pA)){var oA={type:"mode",undo:{mode:c(pA),selection:void 0},redo:{mode:$,selection:void 0}};c(pA)==="text"&&c(UA)&&c(UA).flush(),$A("add history item",oA),c(zA).add(oA),N(pA,$)}})(s())}),KA(()=>(c(pA),K(F())),()=>{N(_e,[{type:"button",text:"text",title:"Switch to text mode (current mode: ".concat(c(pA),")"),className:"jse-group-button jse-first"+(c(pA)===Da.text?" jse-selected":""),onClick:()=>F()(Da.text)},{type:"button",text:"tree",title:"Switch to tree mode (current mode: ".concat(c(pA),")"),className:"jse-group-button "+(c(pA)===Da.tree?" jse-selected":""),onClick:()=>F()(Da.tree)},{type:"button",text:"table",title:"Switch to table mode (current mode: ".concat(c(pA),")"),className:"jse-group-button jse-last"+(c(pA)===Da.table?" jse-selected":""),onClick:()=>F()(Da.table)}])}),KA(()=>(c(_e),K(tA()),c(pA),K(b()),K(n())),()=>{N(fA,$=>{var oA=nR($[0])?c(_e).concat($):c(_e).concat(YA,$),sA=h4(oA);return tA()(oA,{mode:c(pA),modal:b(),readOnly:n()})||sA})}),KA(()=>(K(W()),c(pA),K(b()),K(n()),K(i())),()=>{N(XA,$=>{var oA,sA=h4($);return(oA=W()($,{mode:c(pA),modal:b(),readOnly:n(),selection:i()}))!==null&&oA!==void 0?oA:!n()&&sA})}),Rn();var je={patch:DA,expand:ee,collapse:NA,transform:ke,validate:HA,acceptAutoRepair:vA,scrollTo:Gt,findElement:ft,focus:he,refresh:Ot};ni();var pt=Fi(),xe=et(pt),oi=$=>{Oo(L5A($,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return c(zA)},get readOnly(){return n()},get indentation(){return o()},get tabSize(){return a()},get mainMenuBar(){return l()},get statusBar(){return C()},get askToFormat(){return I()},get escapeUnicodeCharacters(){return h()},get parser(){return f()},get validator(){return v()},get validationParser(){return k()},get onChange(){return x()},get onChangeMode(){return F()},get onSelect(){return z()},onUndo:PA,onRedo:Je,get onError(){return BA()},get onFocus(){return X()},get onBlur(){return iA()},get onRenderMenu(){return c(fA)},get onSortModal(){return AA()},get onTransformModal(){return IA()},$$legacy:!0}),oA=>N(UA,oA),()=>c(UA))},j=$=>{var oA=Fi(),sA=et(oA),TA=Qe=>{Oo(oDA(Qe,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return c(zA)},get readOnly(){return n()},get truncateTextSize(){return r()},get mainMenuBar(){return l()},get escapeControlCharacters(){return d()},get escapeUnicodeCharacters(){return h()},get flattenColumns(){return E()},get parser(){return f()},get parseMemoizeOne(){return m()},get validator(){return v()},get validationParser(){return k()},get indentation(){return o()},get onChange(){return x()},get onChangeMode(){return F()},get onSelect(){return z()},onUndo:PA,onRedo:Je,get onRenderValue(){return P()},get onFocus(){return X()},get onBlur(){return iA()},get onRenderMenu(){return c(fA)},get onRenderContextMenu(){return c(XA)},get onSortModal(){return AA()},get onTransformModal(){return IA()},get onJSONEditorModal(){return aA()},$$legacy:!0}),GA=>N(uA,GA),()=>c(uA))},de=Qe=>{Oo(pR(Qe,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return c(zA)},get readOnly(){return n()},get indentation(){return o()},get truncateTextSize(){return r()},get mainMenuBar(){return l()},get navigationBar(){return g()},get escapeControlCharacters(){return d()},get escapeUnicodeCharacters(){return h()},get parser(){return f()},get parseMemoizeOne(){return m()},get validator(){return v()},get validationParser(){return k()},get pathParser(){return S()},get onError(){return BA()},get onChange(){return x()},get onChangeMode(){return F()},get onSelect(){return z()},onUndo:PA,onRedo:Je,get onRenderValue(){return P()},get onClassName(){return Z()},get onFocus(){return X()},get onBlur(){return iA()},get onRenderMenu(){return c(fA)},get onRenderContextMenu(){return c(XA)},get onSortModal(){return AA()},get onTransformModal(){return IA()},get onJSONEditorModal(){return aA()},$$legacy:!0}),GA=>N(rA,GA),()=>c(rA))};jA(sA,Qe=>{c(pA),K(Da),wA(()=>c(pA)===Da.table)?Qe(TA):Qe(de,!1)},!0),CA($,oA)};return jA(xe,$=>{c(pA),K(Da),wA(()=>c(pA)===Da.text||String(c(pA))==="code")?$(oi):$(j,!1)}),CA(t,pt),jt(e,"patch",DA),jt(e,"expand",ee),jt(e,"collapse",NA),jt(e,"transform",ke),jt(e,"validate",HA),jt(e,"acceptAutoRepair",vA),jt(e,"scrollTo",Gt),jt(e,"findElement",ft),jt(e,"focus",he),jt(e,"refresh",Ot),Ft(je)}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-modal-wrapper.svelte-t4zsk3 { + flex: 1; + display: flex; + min-width: 0; + min-height: 0; + flex-direction: column; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) { + flex: 1; + display: flex; + flex-direction: column; + padding: 20px; + overflow: auto; + min-width: 0; + min-height: 0; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding-top: var(--jse-padding, 10px); +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-label:where(.svelte-t4zsk3) { + font-weight: bold; + display: block; + box-sizing: border-box; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-label:where(.svelte-t4zsk3) .jse-label-inner:where(.svelte-t4zsk3) { + margin-top: calc(2 * var(--jse-padding, 10px)); + margin-bottom: calc(0.5 * var(--jse-padding, 10px)); + box-sizing: border-box; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-modal-inline-editor:where(.svelte-t4zsk3) { + flex: 1; + min-height: 150px; + min-width: 0; + max-width: 100%; + display: flex; + --jse-theme-color: var(--jse-modal-editor-theme-color, #707070); + --jse-theme-color-highlight: var(--jse-modal-editor-theme-color-highlight, #646464); +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) { + gap: var(--jse-padding, 10px); + align-items: center; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) .jse-error:where(.svelte-t4zsk3) { + flex: 1; + color: var(--jse-error-color, #ee5341); +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-secondary-background, #d3d3d3); + color: var(--jse-button-secondary-color, var(--jse-text-color, #4d4d4d)); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3):hover { + background: var(--jse-button-secondary-background-highlight, #e1e1e1); +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3):disabled { + background: var(--jse-button-secondary-background-disabled, #9d9d9d); +} +.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3) { + border: var(--jse-input-border, 1px solid #d8dbdf); + outline: none; + box-sizing: border-box; + padding: calc(0.5 * var(--jse-padding, 10px)); + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: inherit; + background: var(--jse-input-background, var(--jse-background-color, #fff)); +} +.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3):focus { + border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); +} +.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3):read-only { + background: var(--jse-input-background-readonly, transparent); +}`);var aDA=JA('
        '),rDA=JA(''),sDA=JA(''),lDA=JA(''),gDA=JA('
        Path
        Contents
        ',1),cDA=JA('
        '),CDA={};Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-modal-contents.svelte-lwzlls { + flex: 1; + display: flex; + flex-direction: column; + padding: 20px; + overflow: auto; + min-width: 0; + min-height: 0; +} +.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding-top: var(--jse-padding, 10px); +} +.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} +.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} +.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) th:where(.svelte-lwzlls), +.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) td:where(.svelte-lwzlls) { + text-align: left; + vertical-align: middle; + font-weight: normal; + padding-bottom: var(--jse-padding, 10px); +} +.jse-modal-contents.svelte-lwzlls input.jse-path:where(.svelte-lwzlls) { + width: 100%; + box-sizing: border-box; + padding: 5px 10px; + border: var(--jse-input-border, 1px solid #d8dbdf); + border-radius: var(--jse-input-radius, 3px); + font-family: inherit; + font-size: inherit; + background: inherit; + background: var(--jse-input-background-readonly, transparent); + color: inherit; + outline: none; +} +.jse-modal-contents.svelte-lwzlls .svelte-select input { + box-sizing: border-box; +} +.jse-modal-contents.svelte-lwzlls .jse-space:where(.svelte-lwzlls) { + height: 200px; +} +.jse-modal-contents.svelte-lwzlls .jse-space:where(.svelte-lwzlls) .jse-error:where(.svelte-lwzlls) { + color: var(--jse-error-color, #ee5341); +}`);var Qh=kD(()=>CDA),IDA=JA('Property'),dDA=JA('
        '),BDA=JA('
        Path
        Direction
        ',1);Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-main.svelte-1l55585 { + width: 100%; + height: 100%; + min-width: 0; + min-height: 150px; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + line-height: normal; + position: relative; + display: flex; + flex-direction: row; +} +.jse-main.svelte-1l55585:not(.jse-focus) { + --jse-selection-background-color: var(--jse-selection-background-inactive-color, #e8e8e8); + --jse-context-menu-pointer-background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); +}`);var EDA=JA('
        ',1);function hDA(t,e){Nt(e,!1);var A=EA(void 0,!0),i=or("jsoneditor:JSONEditor"),n={text:""},o=void 0,a=!1,r=Da.tree,s=!0,l=!0,g=!0,C=!0,I=!1,d=!1,h=!0,E=JSON,f=void 0,m=JSON,v={parse:f6A,stringify:Bl},k=[JmA],S=k[0].id,b=Qg,x=void 0,F=void 0,z=u6A,P=Qg,Z=Qg,tA=Qg,W=Qg,BA=ge=>{console.error(ge),alert(ge.toString())},X=Qg,iA=Qg,AA=L(e,"content",13,n),IA=L(e,"selection",13,o),aA=L(e,"readOnly",13,a),rA=L(e,"indentation",13,2),uA=L(e,"tabSize",13,4),UA=L(e,"truncateTextSize",13,1e3),$A=L(e,"mode",13,r),zA=L(e,"mainMenuBar",13,s),pA=L(e,"navigationBar",13,l),PA=L(e,"statusBar",13,g),Je=L(e,"askToFormat",13,C),_e=L(e,"escapeControlCharacters",13,I),YA=L(e,"escapeUnicodeCharacters",13,d),fA=L(e,"flattenColumns",13,h),XA=L(e,"parser",13,E),DA=L(e,"validator",13,f),ee=L(e,"validationParser",13,m),NA=L(e,"pathParser",13,v),ke=L(e,"queryLanguages",13,k),HA=L(e,"queryLanguageId",13,S),vA=L(e,"onChangeQueryLanguage",13,b),Gt=L(e,"onChange",13,x),ft=L(e,"onSelect",13,F),he=L(e,"onRenderValue",13,z),Ot=L(e,"onClassName",13,P),He=L(e,"onRenderMenu",13,Z),je=L(e,"onRenderContextMenu",13,tA),pt=L(e,"onChangeMode",13,W),xe=L(e,"onError",13,BA),oi=L(e,"onFocus",13,X),j=L(e,"onBlur",13,iA),$=EA(wh(),!0),oA=EA(!1,!0),sA=EA(void 0,!0),TA=EA(void 0,!0),de=EA(void 0,!0),Qe=EA(void 0,!0),GA=EA(XA(),!0);function OA(){return AA()}function ht(ge){i("set");var mi=v_(ge);if(mi)throw new Error(mi);N($,wh()),AA(ge),Ro()}function tt(ge){i("update");var mi=v_(ge);if(mi)throw new Error(mi);AA(ge),Ro()}function ze(ge){var mi=c(sA).patch(ge);return Ro(),mi}function Oe(ge){IA(ge),Ro()}function Ci(ge,mi){c(sA).expand(ge,mi),Ro()}function gn(ge){var mi=arguments.length>1&&arguments[1]!==void 0&&arguments[1];c(sA).collapse(ge,mi),Ro()}function hn(){var ge=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};c(sA).transform(ge),Ro()}function Ke(){return c(sA).validate()}function nn(){var ge=c(sA).acceptAutoRepair();return Ro(),ge}function Si(ge){return Li.apply(this,arguments)}function Li(){return(Li=zt(function*(ge){yield c(sA).scrollTo(ge)})).apply(this,arguments)}function Zi(ge){return c(sA).findElement(ge)}function bt(){c(sA).focus(),Ro()}function on(){return Kt.apply(this,arguments)}function Kt(){return(Kt=zt(function*(){yield c(sA).refresh()})).apply(this,arguments)}function G(ge){var mi,cn,fn,Ho,ya,_i,Eo,Za,vo,Ta,Jn,Ui,qt,Nn,ho,Fo,xA,Ae,De,mA,FA,le,Ne,nt,rt,xt,On,Ti,zi,Xt,Ji,va=Object.keys(ge);for(var Ut of va)switch(Ut){case"content":AA((mi=ge[Ut])!==null&&mi!==void 0?mi:n);break;case"selection":IA((cn=ge[Ut])!==null&&cn!==void 0?cn:o);break;case"readOnly":aA((fn=ge[Ut])!==null&&fn!==void 0?fn:a);break;case"indentation":rA((Ho=ge[Ut])!==null&&Ho!==void 0?Ho:2);break;case"tabSize":uA((ya=ge[Ut])!==null&&ya!==void 0?ya:4);break;case"truncateTextSize":UA((_i=ge[Ut])!==null&&_i!==void 0?_i:1e3);break;case"mode":$A((Eo=ge[Ut])!==null&&Eo!==void 0?Eo:r);break;case"mainMenuBar":zA((Za=ge[Ut])!==null&&Za!==void 0?Za:s);break;case"navigationBar":pA((vo=ge[Ut])!==null&&vo!==void 0?vo:l);break;case"statusBar":PA((Ta=ge[Ut])!==null&&Ta!==void 0?Ta:g);break;case"askToFormat":Je((Jn=ge[Ut])!==null&&Jn!==void 0?Jn:C);break;case"escapeControlCharacters":_e((Ui=ge[Ut])!==null&&Ui!==void 0?Ui:I);break;case"escapeUnicodeCharacters":YA((qt=ge[Ut])!==null&&qt!==void 0?qt:d);break;case"flattenColumns":fA((Nn=ge[Ut])!==null&&Nn!==void 0?Nn:h);break;case"parser":XA((ho=ge[Ut])!==null&&ho!==void 0?ho:E);break;case"validator":DA((Fo=ge[Ut])!==null&&Fo!==void 0?Fo:f);break;case"validationParser":ee((xA=ge[Ut])!==null&&xA!==void 0?xA:m);break;case"pathParser":NA((Ae=ge[Ut])!==null&&Ae!==void 0?Ae:v);break;case"queryLanguages":ke((De=ge[Ut])!==null&&De!==void 0?De:k);break;case"queryLanguageId":HA((mA=ge[Ut])!==null&&mA!==void 0?mA:S);break;case"onChangeQueryLanguage":vA((FA=ge[Ut])!==null&&FA!==void 0?FA:b);break;case"onChange":Gt((le=ge[Ut])!==null&&le!==void 0?le:x);break;case"onRenderValue":he((Ne=ge[Ut])!==null&&Ne!==void 0?Ne:z);break;case"onClassName":Ot((nt=ge[Ut])!==null&&nt!==void 0?nt:P);break;case"onRenderMenu":He((rt=ge[Ut])!==null&&rt!==void 0?rt:Z);break;case"onRenderContextMenu":je((xt=ge[Ut])!==null&&xt!==void 0?xt:tA);break;case"onChangeMode":pt((On=ge[Ut])!==null&&On!==void 0?On:W);break;case"onSelect":ft((Ti=ge[Ut])!==null&&Ti!==void 0?Ti:F);break;case"onError":xe((zi=ge[Ut])!==null&&zi!==void 0?zi:BA);break;case"onFocus":oi((Xt=ge[Ut])!==null&&Xt!==void 0?Xt:X);break;case"onBlur":j((Ji=ge[Ut])!==null&&Ji!==void 0?Ji:iA);break;default:st(Ut)}function st(Oi){i('Unknown property "'.concat(Oi,'"'))}ke().some(Oi=>Oi.id===HA())||HA(ke()[0].id),Ro()}function dt(){return Ei.apply(this,arguments)}function Ei(){return(Ei=zt(function*(){throw new Error("class method destroy() is deprecated. It is replaced with a method destroy() in the vanilla library.")})).apply(this,arguments)}function Qn(ge,mi,cn){AA(ge),Gt()&&Gt()(ge,mi,cn)}function un(ge){IA(ge),ft()&&ft()(h4(ge))}function Vn(){N(oA,!0),oi()&&oi()()}function Yo(){N(oA,!1),j()&&j()()}function Bo(ge){return No.apply(this,arguments)}function No(){return(No=zt(function*(ge){$A()!==ge&&($A(ge),Ro(),bt(),pt()(ge))})).apply(this,arguments)}function Zo(ge){i("handleChangeQueryLanguage",ge),HA(ge),vA()(ge)}function Do(ge){var{id:mi,json:cn,rootPath:fn,onTransform:Ho,onClose:ya}=ge;aA()||N(Qe,{id:mi,json:cn,rootPath:fn,indentation:rA(),truncateTextSize:UA(),escapeControlCharacters:_e(),escapeUnicodeCharacters:YA(),parser:XA(),parseMemoizeOne:c(A),validationParser:ee(),pathParser:NA(),queryLanguages:ke(),queryLanguageId:HA(),onChangeQueryLanguage:Zo,onRenderValue:he(),onRenderMenu:_i=>He()(_i,{mode:$A(),modal:!0,readOnly:aA()}),onRenderContextMenu:_i=>je()(_i,{mode:$A(),modal:!0,readOnly:aA(),selection:IA()}),onClassName:Ot(),onTransform:Ho,onClose:ya})}function Ba(ge){aA()||N(de,ge)}function Xo(ge){var{content:mi,path:cn,onPatch:fn,onClose:Ho}=ge;i("onJSONEditorModal",{content:mi,path:cn}),N(TA,{content:mi,path:cn,onPatch:fn,readOnly:aA(),indentation:rA(),tabSize:uA(),truncateTextSize:UA(),mainMenuBar:zA(),navigationBar:pA(),statusBar:PA(),askToFormat:Je(),escapeControlCharacters:_e(),escapeUnicodeCharacters:YA(),flattenColumns:fA(),parser:XA(),validator:void 0,validationParser:ee(),pathParser:NA(),onRenderValue:he(),onClassName:Ot(),onRenderMenu:He(),onRenderContextMenu:je(),onSortModal:Ba,onTransformModal:Do,onClose:Ho})}function ra(ge){ge.stopPropagation()}KA(()=>(K(XA()),c(GA),K(AA()),wh),()=>{if(!VX(XA(),c(GA))){if(i("parser changed, recreate editor"),Nf(AA())){var ge=c(GA).stringify(AA().json);AA({json:ge!==void 0?XA().parse(ge):void 0})}N(GA,XA()),N($,wh())}}),KA(()=>K(AA()),()=>{var ge=v_(AA());ge&&console.error("Error: "+ge)}),KA(()=>K(IA()),()=>{IA()===null&&console.warn("selection is invalid: it is null but should be undefined")}),KA(()=>K(XA()),()=>{N(A,xE(XA().parse))}),KA(()=>K($A()),()=>{i("mode changed to",$A())}),Rn();var yo={get:OA,set:ht,update:tt,patch:ze,select:Oe,expand:Ci,collapse:gn,transform:hn,validate:Ke,acceptAutoRepair:nn,scrollTo:Si,findElement:Zi,focus:bt,refresh:on,updateProps:G,destroy:dt};return ni(!0),tR(t,{children:(ge,mi)=>{var cn,fn=EDA(),Ho=et(fn);GX(dA(Ho),()=>c($),Jn=>{Oo(UZ(Jn,{get externalMode(){return $A()},get content(){return AA()},get selection(){return IA()},get readOnly(){return aA()},get indentation(){return rA()},get tabSize(){return uA()},get truncateTextSize(){return UA()},get statusBar(){return PA()},get askToFormat(){return Je()},get mainMenuBar(){return zA()},get navigationBar(){return pA()},get escapeControlCharacters(){return _e()},get escapeUnicodeCharacters(){return YA()},get flattenColumns(){return fA()},get parser(){return XA()},get parseMemoizeOne(){return c(A)},get validator(){return DA()},get validationParser(){return ee()},get pathParser(){return NA()},insideModal:!1,get onError(){return xe()},onChange:Qn,onChangeMode:Bo,onSelect:un,get onRenderValue(){return he()},get onClassName(){return Ot()},onFocus:Vn,onBlur:Yo,get onRenderMenu(){return He()},get onRenderContextMenu(){return je()},onSortModal:Ba,onTransformModal:Do,onJSONEditorModal:Xo,$$legacy:!0}),Ui=>N(sA,Ui),()=>c(sA))});var ya=_A(Ho,2),_i=Jn=>{(function(Ui,qt){var Nn,ho;Nt(qt,!1);var Fo=EA(void 0,!0),xA=EA(void 0,!0),Ae=EA(void 0,!0),De=EA(void 0,!0),mA=or("jsoneditor:SortModal"),FA=L(qt,"id",9),le=L(qt,"json",9),Ne=L(qt,"rootPath",9),nt=L(qt,"onSort",9),rt=L(qt,"onClose",9),xt={value:1,label:"ascending"},On=[xt,{value:-1,label:"descending"}],Ti="".concat(FA(),":").concat(vt(Ne())),zi=EA((Nn=Qh()[Ti])===null||Nn===void 0?void 0:Nn.selectedProperty,!0),Xt=EA(((ho=Qh()[Ti])===null||ho===void 0?void 0:ho.selectedDirection)||xt,!0),Ji=EA(void 0,!0);function va(){try{var st,Oi,Xi;N(Ji,void 0);var Wn=((st=c(zi))===null||st===void 0?void 0:st.value)||((Oi=c(De))===null||Oi===void 0||(Oi=Oi[0])===null||Oi===void 0?void 0:Oi.value)||[],pn=(Xi=c(Xt))===null||Xi===void 0?void 0:Xi.value,_t=T$(le(),Ne(),Wn,pn);nt()!==void 0&&Ne()!==void 0&&nt()({operations:_t,rootPath:Ne(),itemPath:Wn,direction:pn}),rt()()}catch(sa){N(Ji,String(sa))}}function Ut(st){st.focus()}KA(()=>(K(le()),K(Ne())),()=>{N(Fo,Xe(le(),Ne()))}),KA(()=>c(Fo),()=>{N(xA,Array.isArray(c(Fo)))}),KA(()=>(c(xA),c(Fo)),()=>{N(Ae,c(xA)?AR(c(Fo)):void 0)}),KA(()=>(c(Ae),BI),()=>{N(De,c(Ae)?c(Ae).map(BI):void 0)}),KA(()=>(Qh(),c(zi),c(Xt)),()=>{Qh(Qh()[Ti]={selectedProperty:c(zi),selectedDirection:c(Xt)}),mA("store state in memory",Ti,Qh()[Ti])}),Rn(),ni(!0),Of(Ui,{get onClose(){return rt()},className:"jse-sort-modal",children:(st,Oi)=>{var Xi=BDA(),Wn=et(Xi),pn=it(()=>c(xA)?"Sort array items":"Sort object keys");wD(Wn,{get title(){return c(pn)},get onClose(){return rt()}});var _t=dA(_A(Wn,2)),sa=_A(dA(_t)),zo=dA(sa),D=_A(dA(zo)),M=dA(D),R=_A(zo),V=se=>{var Ee=IDA(),Pe=_A(dA(Ee));Cd(dA(Pe),{showChevron:!0,get items(){return c(De)},get value(){return c(zi)},set value(Re){N(zi,Re)},$$legacy:!0}),CA(se,Ee)};jA(R,se=>{c(xA),c(De),wA(()=>{var Ee;return c(xA)&&c(De)&&((Ee=c(De))===null||Ee===void 0?void 0:Ee.length)>1})&&se(V)});var _=_A(R),q=_A(dA(_));Cd(dA(q),{showChevron:!0,clearable:!1,get items(){return On},get value(){return c(Xt)},set value(se){N(Xt,se)},$$legacy:!0});var nA=_A(_t,2),cA=dA(nA),MA=se=>{var Ee=dDA(),Pe=dA(Ee);Se(()=>Lt(Pe,c(Ji))),CA(se,Ee)};jA(cA,se=>{c(Ji)&&se(MA)});var oe=dA(_A(nA,2));_r(()=>fe("click",oe,va)),ms(oe,se=>Ut?.(se)),Se(se=>{Dd(M,se),oe.disabled=(c(xA),c(De),c(zi),wA(()=>{var Ee;return!!(c(xA)&&c(De)&&((Ee=c(De))===null||Ee===void 0?void 0:Ee.length)>1)&&!c(zi)}))},[()=>(K(Ne()),K(en),K(Bl),wA(()=>Ne()&&!en(Ne())?Bl(Ne()):"(document root)"))]),CA(st,Xi)},$$slots:{default:!0}}),Ft()})(Jn,DI(()=>c(de),{onClose:()=>{var Ui;(Ui=c(de))===null||Ui===void 0||Ui.onClose(),N(de,void 0)}}))};jA(ya,Jn=>{c(de)&&Jn(_i)});var Eo=_A(ya,2),Za=Jn=>{f5A(Jn,DI(()=>c(Qe),{onClose:()=>{var Ui;(Ui=c(Qe))===null||Ui===void 0||Ui.onClose(),N(Qe,void 0)}}))};jA(Eo,Jn=>{c(Qe)&&Jn(Za)});var vo=_A(Eo,2),Ta=Jn=>{(function(Ui,qt){Nt(qt,!1);var Nn=EA(void 0,!0),ho=EA(void 0,!0),Fo=EA(void 0,!0),xA=EA(void 0,!0),Ae=or("jsoneditor:JSONEditorModal"),De=L(qt,"content",9),mA=L(qt,"path",9),FA=L(qt,"onPatch",9),le=L(qt,"readOnly",9),Ne=L(qt,"indentation",9),nt=L(qt,"tabSize",9),rt=L(qt,"truncateTextSize",9),xt=L(qt,"mainMenuBar",9),On=L(qt,"navigationBar",9),Ti=L(qt,"statusBar",9),zi=L(qt,"askToFormat",9),Xt=L(qt,"escapeControlCharacters",9),Ji=L(qt,"escapeUnicodeCharacters",9),va=L(qt,"flattenColumns",9),Ut=L(qt,"parser",9),st=L(qt,"validator",9),Oi=L(qt,"validationParser",9),Xi=L(qt,"pathParser",9),Wn=L(qt,"onRenderValue",9),pn=L(qt,"onClassName",9),_t=L(qt,"onRenderMenu",9),sa=L(qt,"onRenderContextMenu",9),zo=L(qt,"onSortModal",9),D=L(qt,"onTransformModal",9),M=L(qt,"onClose",9),R=EA(void 0,!0),V=EA(void 0,!0),_={mode:cA(De()),content:De(),selection:void 0,relativePath:mA()},q=EA([_],!0),nA=EA(void 0,!0);function cA(yA){return Nf(yA)&&Vo(yA.json)?Da.table:Da.tree}function MA(){var yA,WA=(yA=ki(c(q)))===null||yA===void 0?void 0:yA.selection;Kf(WA)&&c(R).scrollTo(It(WA))}function oe(){if(Ae("handleApply"),!le())try{N(nA,void 0);var yA=c(Nn).relativePath,WA=c(Nn).content,Ge=[{op:"replace",path:vt(yA),value:WW(WA,Ut()).json}];if(c(q).length>1){var ye=WW(c(q)[c(q).length-2].content,Ut()).json,be={json:tl(ye,Ge)},ot=Me(Me({},c(q)[c(q).length-2]||_),{},{content:be});N(q,[...c(q).slice(0,c(q).length-2),ot]),Ro(),MA()}else FA()(Ge),M()()}catch(Vt){N(nA,String(Vt))}}function se(){if(Ae("handleClose"),c(V))N(V,!1);else if(c(q).length>1){var yA;N(q,Yi(c(q))),Ro(),(yA=c(R))===null||yA===void 0||yA.focus(),MA(),N(nA,void 0)}else M()()}function Ee(yA){Ae("handleChange",yA),Le(WA=>Me(Me({},WA),{},{content:yA}))}function Pe(yA){Ae("handleChangeSelection",yA),Le(WA=>Me(Me({},WA),{},{selection:yA}))}function Re(yA){Ae("handleChangeMode",yA),Le(WA=>Me(Me({},WA),{},{mode:yA}))}function Le(yA){var WA=yA(ki(c(q)));N(q,[...Yi(c(q)),WA])}function ai(yA){N(nA,yA.toString()),console.error(yA)}function Yn(yA){var WA,{content:Ge,path:ye}=yA;Ae("handleJSONEditorModal",{content:Ge,path:ye});var be={mode:cA(Ge),content:Ge,selection:void 0,relativePath:ye};N(q,[...c(q),be]),Ro(),(WA=c(R))===null||WA===void 0||WA.focus()}function eA(yA){yA.focus()}As(()=>{var yA;(yA=c(R))===null||yA===void 0||yA.focus()}),KA(()=>c(q),()=>{N(Nn,ki(c(q))||_)}),KA(()=>c(q),()=>{N(ho,c(q).flatMap(yA=>yA.relativePath))}),KA(()=>(c(ho),Bl),()=>{N(Fo,en(c(ho))?"(document root)":Bl(c(ho)))}),KA(()=>K(Ut()),()=>{N(xA,xE(Ut().parse))}),Rn(),ni(!0),Of(Ui,{onClose:se,className:"jse-jsoneditor-modal",get fullscreen(){return c(V)},children:(yA,WA)=>{var Ge=cDA();tR(dA(Ge),{children:(ye,be)=>{var ot=gDA(),Vt=et(ot),Gi=it(()=>(c(q),wA(()=>c(q).length>1?" (".concat(c(q).length,")"):"")));wD(Vt,{get title(){var Ai;return"Edit nested content ".concat((Ai=c(Gi))!==null&&Ai!==void 0?Ai:"")},fullScreenButton:!0,onClose:se,get fullscreen(){return c(V)},set fullscreen(Ai){N(V,Ai)},$$legacy:!0});var Fn=_A(Vt,2),$i=_A(dA(Fn),2),Qo=_A($i,4);Oo(UZ(dA(Qo),{get externalMode(){return c(Nn),wA(()=>c(Nn).mode)},get content(){return c(Nn),wA(()=>c(Nn).content)},get selection(){return c(Nn),wA(()=>c(Nn).selection)},get readOnly(){return le()},get indentation(){return Ne()},get tabSize(){return nt()},get truncateTextSize(){return rt()},get statusBar(){return Ti()},get askToFormat(){return zi()},get mainMenuBar(){return xt()},get navigationBar(){return On()},get escapeControlCharacters(){return Xt()},get escapeUnicodeCharacters(){return Ji()},get flattenColumns(){return va()},get parser(){return Ut()},get parseMemoizeOne(){return c(xA)},get validator(){return st()},get validationParser(){return Oi()},get pathParser(){return Xi()},insideModal:!0,onError:ai,onChange:Ee,onChangeMode:Re,onSelect:Pe,get onRenderValue(){return Wn()},get onClassName(){return pn()},get onFocus(){return Qg},get onBlur(){return Qg},get onRenderMenu(){return _t()},get onRenderContextMenu(){return sa()},get onSortModal(){return zo()},get onTransformModal(){return D()},onJSONEditorModal:Yn,$$legacy:!0}),Ai=>N(R,Ai),()=>c(R));var $t=dA(_A(Qo,2)),$o=Ai=>{var yt=aDA(),Ii=dA(yt);Se(()=>Lt(Ii,c(nA))),CA(Ai,yt)};jA($t,Ai=>{c(nA)&&Ai($o)});var Zn=_A($t,2),Aa=Ai=>{var yt=rDA();tn(dA(yt),{get data(){return uz}}),fe("click",yt,se),CA(Ai,yt)};jA(Zn,Ai=>{c(q),wA(()=>c(q).length>1)&&Ai(Aa)});var mn=_A(Zn,2),Tt=Ai=>{var yt=sDA();_r(()=>fe("click",yt,oe)),ms(yt,Ii=>eA?.(Ii)),CA(Ai,yt)},an=Ai=>{var yt=lDA();fe("click",yt,se),CA(Ai,yt)};jA(mn,Ai=>{le()?Ai(an,!1):Ai(Tt)}),Se(()=>Dd($i,c(Fo))),CA(ye,ot)},$$slots:{default:!0}}),CA(yA,Ge)},$$slots:{default:!0}}),Ft()})(Jn,DI(()=>c(TA),{onClose:()=>{var Ui;(Ui=c(TA))===null||Ui===void 0||Ui.onClose(),N(TA,void 0)}}))};jA(vo,Jn=>{c(TA)&&Jn(Ta)}),Se(()=>cn=ii(Ho,1,"jse-main svelte-1l55585",null,cn,{"jse-focus":c(oA)})),fe("keydown",Ho,ra),CA(ge,fn)},$$slots:{default:!0}}),jt(e,"get",OA),jt(e,"set",ht),jt(e,"update",tt),jt(e,"patch",ze),jt(e,"select",Oe),jt(e,"expand",Ci),jt(e,"collapse",gn),jt(e,"transform",hn),jt(e,"validate",Ke),jt(e,"acceptAutoRepair",nn),jt(e,"scrollTo",Si),jt(e,"findElement",Zi),jt(e,"focus",bt),jt(e,"refresh",on),jt(e,"updateProps",G),jt(e,"destroy",dt),Ft(yo)}function $$(t){var{target:e,props:A}=t,i=omA(hDA,{target:e,props:A});return i.destroy=zt(function*(){return(function(n,o){var a=Z_.get(n);return a?(Z_.delete(n),a(o)):Promise.resolve()})(i)}),Ro(),i}var yc=class t{constructor(e){this.el=e}jsonString;editor=null;ngAfterViewInit(){let e={text:this.jsonString};setTimeout(()=>{this.editor=$$({target:document.getElementById("json-editor"),props:{content:e,mode:Da.text,mainMenuBar:!1,statusBar:!1}})})}getJsonString(){return this.editor?.get().text}static \u0275fac=function(A){return new(A||t)(ct(ce))};static \u0275cmp=SA({type:t,selectors:[["app-json-editor"]],inputs:{jsonString:"jsonString"},decls:1,vars:0,consts:[["id","json-editor",1,"json-editor-container","jse-theme-dark"]],template:function(A,i){A&1&&Kn(0,"div",0)},styles:[".jse-theme-dark[_ngcontent-%COMP%]{--jse-theme: dark;--jse-theme-color: #2f6dd0;--jse-theme-color-highlight: #467cd2;--jse-background-color: #1e1e1e;--jse-text-color: #d4d4d4;--jse-text-color-inverse: #4d4d4d;--jse-main-border: 1px solid #4f4f4f;--jse-menu-color: #fff;--jse-modal-background: #2f2f2f;--jse-modal-overlay-background: rgba(0, 0, 0, .5);--jse-modal-code-background: #2f2f2f;--jse-tooltip-color: var(--jse-text-color);--jse-tooltip-background: #4b4b4b;--jse-tooltip-border: 1px solid #737373;--jse-tooltip-action-button-color: inherit;--jse-tooltip-action-button-background: #737373;--jse-panel-background: #333333;--jse-panel-background-border: 1px solid #464646;--jse-panel-color: var(--jse-text-color);--jse-panel-color-readonly: #737373;--jse-panel-border: 1px solid #3c3c3c;--jse-panel-button-color-highlight: #e5e5e5;--jse-panel-button-background-highlight: #464646;--jse-navigation-bar-background: #656565;--jse-navigation-bar-background-highlight: #7e7e7e;--jse-navigation-bar-dropdown-color: var(--jse-text-color);--jse-context-menu-background: #4b4b4b;--jse-context-menu-background-highlight: #595959;--jse-context-menu-separator-color: #595959;--jse-context-menu-color: var(--jse-text-color);--jse-context-menu-pointer-background: #737373;--jse-context-menu-pointer-background-highlight: #818181;--jse-context-menu-pointer-color: var(--jse-context-menu-color);--jse-key-color: #9cdcfe;--jse-value-color: var(--jse-text-color);--jse-value-color-number: #b5cea8;--jse-value-color-boolean: #569cd6;--jse-value-color-null: #569cd6;--jse-value-color-string: #ce9178;--jse-value-color-url: #ce9178;--jse-delimiter-color: #949494;--jse-edit-outline: 2px solid var(--jse-text-color);--jse-selection-background-color: #464646;--jse-selection-background-inactive-color: #333333;--jse-hover-background-color: #343434;--jse-active-line-background-color: rgba(255, 255, 255, .06);--jse-search-match-background-color: #343434;--jse-collapsed-items-background-color: #333333;--jse-collapsed-items-selected-background-color: #565656;--jse-collapsed-items-link-color: #b2b2b2;--jse-collapsed-items-link-color-highlight: #ec8477;--jse-search-match-color: #724c27;--jse-search-match-outline: 1px solid #966535;--jse-search-match-active-color: #9f6c39;--jse-search-match-active-outline: 1px solid #bb7f43;--jse-tag-background: #444444;--jse-tag-color: #bdbdbd;--jse-table-header-background: #333333;--jse-table-header-background-highlight: #424242;--jse-table-row-odd-background: rgba(255, 255, 255, .1);--jse-input-background: #3d3d3d;--jse-input-border: var(--jse-main-border);--jse-button-background: #808080;--jse-button-background-highlight: #7a7a7a;--jse-button-color: #e0e0e0;--jse-button-secondary-background: #494949;--jse-button-secondary-background-highlight: #5d5d5d;--jse-button-secondary-background-disabled: #9d9d9d;--jse-button-secondary-color: var(--jse-text-color);--jse-a-color: #55abff;--jse-a-color-highlight: #4387c9;--jse-svelte-select-background: #3d3d3d;--jse-svelte-select-border: 1px solid #4f4f4f;--list-background: #3d3d3d;--item-hover-bg: #505050;--multi-item-bg: #5b5b5b;--input-color: #d4d4d4;--multi-clear-bg: #8a8a8a;--multi-item-clear-icon-color: #d4d4d4;--multi-item-outline: 1px solid #696969;--list-shadow: 0 2px 8px 0 rgba(0, 0, 0, .4);--jse-color-picker-background: #656565;--jse-color-picker-border-box-shadow: #8c8c8c 0 0 0 1px}.json-editor-container[_ngcontent-%COMP%]{height:100%} .jse-message.jse-error{display:none} .cm-gutters.cm-gutters-before{display:none} .jse-text-mode{border-radius:10px} .jse-contents{border-radius:10px;border-bottom:1px solid #4f4f4f}"]})};var QDA=(t,e)=>e.name;function uDA(t,e){if(t&1&&y(0),t&2){let A=p();ue(" Configure ",A.selectedBuiltInTool," ")}}function fDA(t,e){if(t&1&&y(0),t&2){let A=p();ue(" ",A.isEditMode?"Edit Built-in Tool":"Add Built-in Tool"," ")}}function pDA(t,e){if(t&1){let A=QA();B(0,"div",8),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.onToolSelected(n))}),B(1,"mat-icon",9),y(2),Q(),B(3,"span",10),y(4),Q()()}if(t&2){let A=e.$implicit,i=p(3);RA("selected",i.selectedBuiltInTool===A),u(2),lA(i.getToolIcon(A)),u(2),lA(A)}}function mDA(t,e){if(t&1&&(B(0,"div",4)(1,"h3",5),y(2),Q(),B(3,"div",6),Ue(4,pDA,5,4,"div",7,ri),Q()()),t&2){let A=e.$implicit;u(2),lA(A.name),u(2),Te(A.tools)}}function wDA(t,e){if(t&1&&(B(0,"div",1),Ue(1,mDA,6,1,"div",4,QDA),Q()),t&2){let A=p();u(),Te(A.toolCategories)}}function DDA(t,e){if(t&1&&(B(0,"div",2)(1,"h3",11),y(2,"Configure Tool Arguments"),Q(),hA(3,"app-json-editor",12),Q()),t&2){let A=p();u(3),H("jsonString",A.toolArgsString)}}function yDA(t,e){if(t&1){let A=QA();B(0,"button",14),U("click",function(){T(A);let n=p(2);return J(n.backToToolSelection())}),y(1,"Back"),Q()}}function vDA(t,e){if(t&1){let A=QA();O(0,yDA,2,0,"button",13),B(1,"button",14),U("click",function(){T(A);let n=p();return J(n.saveArgs())}),y(2),Q()}if(t&2){let A=p();Y(A.isEditMode?-1:0),u(2),lA(A.isEditMode?"Save":"Create")}}function bDA(t,e){if(t&1){let A=QA();B(0,"button",14),U("click",function(){T(A);let n=p();return J(n.cancel())}),y(1,"Cancel"),Q(),B(2,"button",15),U("click",function(){T(A);let n=p();return J(n.addTool())}),y(3),Q()}if(t&2){let A=p();u(3),ue(" ",A.isEditMode?"Save":"Create"," ")}}var kd=class t{constructor(e,A){this.data=e;this.dialogRef=A}jsonEditorComponent;selectedBuiltInTool="google_search";toolCategories=[{name:"Search Tools",tools:["google_search","EnterpriseWebSearchTool","VertexAiSearchTool"]},{name:"Context Tools",tools:["FilesRetrieval","load_memory","preload_memory","url_context","VertexAiRagRetrieval"]},{name:"Agent Function Tools",tools:["exit_loop","get_user_choice","load_artifacts","LongRunningFunctionTool"]}];builtInToolArgs=new Map([["EnterpriseWebSearchTool",[]],["exit_loop",[]],["FilesRetrieval",["name","description","input_dir"]],["get_user_choice",[]],["google_search",[]],["load_artifacts",[]],["load_memory",[]],["LongRunningFunctionTool",["func"]],["preload_memory",[]],["url_context",[]],["VertexAiRagRetrieval",["name","description","rag_corpora","rag_resources","similarity_top_k","vector_distance_threshold"]],["VertexAiSearchTool",["data_store_id","data_store_specs","search_engine_id","filter","max_results"]]]);isEditMode=!1;showArgsEditor=!1;toolArgs={};toolArgsString="";ngOnInit(){if(this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName){this.selectedBuiltInTool=this.data.toolName;let e=this.builtInToolArgs.get(this.data.toolName);if(e&&e.length>0){if(this.data.toolArgs)this.toolArgs=gA({},this.data.toolArgs),delete this.toolArgs.skip_summarization;else{this.toolArgs={};for(let A of e)this.toolArgs[A]=""}this.toolArgsString=JSON.stringify(this.toolArgs,null,2),this.showArgsEditor=!0}}}onToolSelected(e){this.selectedBuiltInTool=e;let A=this.builtInToolArgs.get(e);A&&A.length>0&&(this.initializeToolArgs(e,A),this.showArgsEditor=!0)}initializeToolArgs(e,A){this.toolArgs={};for(let i of A)this.toolArgs[i]="";this.toolArgsString=JSON.stringify(this.toolArgs,null,2)}backToToolSelection(){this.showArgsEditor=!1,this.toolArgs={},this.toolArgsString=""}saveArgs(){if(this.jsonEditorComponent)try{this.toolArgsString=this.jsonEditorComponent.getJsonString(),this.toolArgs=JSON.parse(this.toolArgsString)}catch(e){alert("Invalid JSON: "+e);return}this.addTool()}addTool(){let e={toolType:"Built-in tool",name:this.selectedBuiltInTool,isEditMode:this.isEditMode};Object.keys(this.toolArgs).length>0&&(e.args=this.toolArgs),this.dialogRef.close(e)}cancel(){this.dialogRef.close()}getToolIcon(e){return sE(e,"Built-in tool")}static \u0275fac=function(A){return new(A||t)(ct(qo),ct(lo))};static \u0275cmp=SA({type:t,selectors:[["app-built-in-tool-dialog"]],viewQuery:function(A,i){if(A&1&&Jt(yc,5),A&2){let n;ae(n=re())&&(i.jsonEditorComponent=n.first)}},decls:9,vars:3,consts:[["mat-dialog-title","",1,"dialog-title"],[1,"tool-categories-container"],[1,"args-editor-container"],["align","end"],[1,"tool-category"],[1,"category-title"],[1,"tool-list"],[1,"tool-item",3,"selected"],[1,"tool-item",3,"click"],[1,"tool-icon"],[1,"tool-name"],[1,"args-editor-title"],[3,"jsonString"],["mat-button",""],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(B(0,"h2",0),O(1,uDA,1,1)(2,fDA,1,1),Q(),B(3,"mat-dialog-content"),O(4,wDA,3,0,"div",1)(5,DDA,4,1,"div",2),Q(),B(6,"mat-dialog-actions",3),O(7,vDA,3,2)(8,bDA,4,1),Q()),A&2&&(u(),Y(i.showArgsEditor?1:2),u(3),Y(i.showArgsEditor?5:4),u(3),Y(i.showArgsEditor?7:8))},dependencies:[li,ln,fa,Na,Wt,pa,pi,yc],styles:[".dialog-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-subhead-color)!important;font-family:Google Sans;font-size:24px}.tool-categories-container[_ngcontent-%COMP%]{padding:16px 0}.tool-category[_ngcontent-%COMP%]{margin-bottom:24px}.tool-category[_ngcontent-%COMP%]:last-child{margin-bottom:0}.category-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin:0 0 12px;padding-left:8px}.tool-list[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;padding:12px 16px;border-radius:8px;cursor:pointer;transition:all .2s ease;border:1px solid var(--builder-tool-item-border-color);min-width:0}.tool-item.selected[_ngcontent-%COMP%]{border:1px solid #8ab4f8}.tool-item[_ngcontent-%COMP%] .tool-icon[_ngcontent-%COMP%]{color:#8ab4f8;margin-right:12px;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-item[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%]{font-family:Google Sans;font-size:14px;color:var(--mdc-dialog-supporting-text-color)!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.args-editor-container[_ngcontent-%COMP%]{padding:16px 0}.args-editor-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin:0 0 16px}"]})};function MDA(t,e){if(t&1){let A=QA();Dl(0),B(1,"div",6)(2,"div",7),U("click",function(){T(A);let n=p();return J(n.toggleToolInfo())}),B(3,"mat-icon",8),y(4,"info"),Q(),B(5,"div",9)(6,"span"),y(7,"Tool Information"),Q()(),B(8,"button",10)(9,"mat-icon"),y(10),Q()()(),B(11,"div",11)(12,"div",12)(13,"div",13),y(14),Q(),B(15,"div",14),y(16),Q()(),B(17,"div",15)(18,"a",16)(19,"mat-icon"),y(20,"open_in_new"),Q(),B(21,"span"),y(22,"View Official Documentation"),Q()()()()(),yl()}if(t&2){let A,i,n,o=p();u(10),lA(o.isToolInfoExpanded?"expand_less":"expand_more"),u(),RA("expanded",o.isToolInfoExpanded),u(3),lA((A=o.getToolInfo())==null?null:A.shortDescription),u(2),lA((i=o.getToolInfo())==null?null:i.detailedDescription),u(2),H("href",(n=o.getToolInfo())==null?null:n.docLink,Go)}}function SDA(t,e){t&1&&(B(0,"mat-hint",19),y(1," Start with a letter or underscore, and contain only letters, digits, and underscores. "),Q())}function kDA(t,e){if(t&1){let A=QA();B(0,"mat-form-field",2)(1,"mat-label"),y(2),Q(),B(3,"input",17),Di("ngModelChange",function(n){T(A);let o=p();return Bi(o.inputValue,n)||(o.inputValue=n),J(n)}),U("keydown",function(n){T(A);let o=p();return J(o.onKeyDown(n))}),Q(),Et(4,SDA,2,0,"mat-hint",18),Q()}if(t&2){let A=p();u(2),lA(A.data.inputLabel||"Input"),u(),wi("ngModel",A.inputValue),H("placeholder",A.data.inputPlaceholder||"Enter value"),u(),H("ngIf",!A.isInputValid())}}var vc=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.inputValue=A.inputValue||""}inputValue="";isToolInfoExpanded=!1;isInputValid(){let e=this.inputValue.trim();return!(!e||!/^[a-zA-Z_]/.test(e)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))}onCancel(){this.dialogRef.close()}onConfirm(){if(this.data.showInput){let e=this.inputValue.trim();if(!this.isInputValid())return;this.dialogRef.close(e)}else this.dialogRef.close("confirm")}onKeyDown(e){e.key==="Enter"&&this.data.showInput&&this.onConfirm()}getToolInfo(){if(this.data.toolType)return tc.getToolDetailedInfo(this.data.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-confirmation-dialog"]],decls:12,vars:6,consts:[["mat-dialog-title",""],[4,"ngIf"],[2,"width","100%","margin-top","16px"],["align","end"],["mat-button","",3,"click"],["mat-button","","color","primary","cdkFocusInitial","",3,"click","disabled"],[1,"tool-info-container"],[1,"tool-info-header",3,"click"],[1,"tool-info-icon"],[1,"tool-info-title"],["mat-icon-button","","type","button","aria-label","Toggle tool information",1,"tool-info-toggle"],[1,"tool-info-body"],[1,"tool-info-content"],[1,"tool-info-short"],[1,"tool-info-detailed"],[1,"tool-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"tool-info-link",3,"href"],["matInput","","cdkFocusInitial","",3,"ngModelChange","keydown","ngModel","placeholder"],["style","font-size: 11px; color: #666;",4,"ngIf"],[2,"font-size","11px","color","#666"]],template:function(A,i){A&1&&(B(0,"h2",0),y(1),Q(),B(2,"mat-dialog-content"),Et(3,MDA,23,6,"ng-container",1),B(4,"p"),y(5),Q(),O(6,kDA,5,4,"mat-form-field",2),Q(),B(7,"mat-dialog-actions",3)(8,"button",4),U("click",function(){return i.onCancel()}),y(9,"Cancel"),Q(),B(10,"button",5),U("click",function(){return i.onConfirm()}),y(11),Q()()),A&2&&(u(),lA(i.data.title),u(2),H("ngIf",i.data.showToolInfo&&i.getToolInfo()),u(2),lA(i.data.message),u(),Y(i.data.showInput?6:-1),u(4),H("disabled",i.data.showInput&&!i.isInputValid()),u(),ue(" ",i.data.confirmButtonText||"Confirm"," "))},dependencies:[li,Js,qi,pi,ji,Wt,fa,Na,pa,Ya,Ko,vs,s1,Ps,ua,ln,Dn,yn,ko],styles:["mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px;color:var(--mdc-dialog-supporting-text-color)}mat-dialog-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)}.tool-info-container[_ngcontent-%COMP%]{border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:var(--mdc-dialog-supporting-text-color)!important;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};var tAA=["*",[["mat-chip-avatar"],["","matChipAvatar",""]],[["mat-chip-trailing-icon"],["","matChipRemove",""],["","matChipTrailingIcon",""]]],iAA=["*","mat-chip-avatar, [matChipAvatar]","mat-chip-trailing-icon,[matChipRemove],[matChipTrailingIcon]"];function xDA(t,e){t&1&&(B(0,"span",3),Ve(1,1),Q())}function _DA(t,e){t&1&&(B(0,"span",6),Ve(1,2),Q())}function RDA(t,e){t&1&&(B(0,"span",3),Ve(1,1),B(2,"span",7),Ct(),B(3,"svg",8),hA(4,"path",9),Q()()())}function NDA(t,e){t&1&&(B(0,"span",6),Ve(1,2),Q())}var FDA=`.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}@media(forced-colors: active){.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{forced-color-adjust:none}}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-outline-width, 1px);border-radius:var(--mat-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mat-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--secondary{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mat-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mat-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mat-chip-with-avatar-avatar-size, 24px);height:var(--mat-chip-with-avatar-avatar-size, 24px);font-size:var(--mat-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__graphic{padding-left:0}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mat-chip-container-shape-radius, 8px);height:var(--mat-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mat-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mat-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mat-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mat-chip-with-icon-icon-size, 18px);height:var(--mat-chip-with-icon-icon-size, 18px);font-size:var(--mat-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mat-chip-with-icon-icon-color: var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mat-chip-elevated-container-color: var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mat-chip-label-text-color: var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mat-chip-outline-width: var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mat-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mat-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-edit,.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-edit:focus,.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-edit:hover::after,.mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-chip-edit:focus::after,.mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:focus::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:hover::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mat-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-edit::before,.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus-visible .mat-focus-indicator::before{content:""}.mdc-evolution-chip__icon,.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{min-height:fit-content}img.mdc-evolution-chip__icon{min-height:0} +`;var nAA=["*"],LDA=`.mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-moz-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-webkit-input-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input:-ms-input-placeholder{opacity:1}.mat-mdc-chip-set+input.mat-mdc-chip-input{margin-left:0;margin-right:0} +`,eN=new kA("mat-chips-default-options",{providedIn:"root",factory:()=>({separatorKeyCodes:[13]})}),XR=new kA("MatChipAvatar"),AAA=new kA("MatChipTrailingIcon"),eAA=new kA("MatChipEdit"),$R=new kA("MatChipRemove"),tN=new kA("MatChip"),oAA=(()=>{class t{_elementRef=w(ce);_parentChip=w(tN);_isPrimary=!0;_isLeading=!1;get disabled(){return this._disabled||this._parentChip?.disabled||!1}set disabled(A){this._disabled=A}_disabled=!1;tabIndex=-1;_allowFocusWhenDisabled=!1;_getDisabledAttribute(){return this.disabled&&!this._allowFocusWhenDisabled?"":null}constructor(){w(eo).load(lr),this._elementRef.nativeElement.nodeName==="BUTTON"&&this._elementRef.nativeElement.setAttribute("type","button")}focus(){this._elementRef.nativeElement.focus()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matChipContent",""]],hostAttrs:[1,"mat-mdc-chip-action","mdc-evolution-chip__action","mdc-evolution-chip__action--presentational"],hostVars:8,hostBindings:function(i,n){i&2&&(te("disabled",n._getDisabledAttribute())("aria-disabled",n.disabled),RA("mdc-evolution-chip__action--primary",n._isPrimary)("mdc-evolution-chip__action--secondary",!n._isPrimary)("mdc-evolution-chip__action--trailing",!n._isPrimary&&!n._isLeading))},inputs:{disabled:[2,"disabled","disabled",Be],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?-1:Cn(A)],_allowFocusWhenDisabled:"_allowFocusWhenDisabled"}})}return t})(),iN=(()=>{class t extends oAA{_getTabindex(){return this.disabled&&!this._allowFocusWhenDisabled?null:this.tabIndex.toString()}_handleClick(A){!this.disabled&&this._isPrimary&&(A.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!this.disabled&&this._isPrimary&&!this._parentChip._isEditing&&(A.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matChipAction",""]],hostVars:3,hostBindings:function(i,n){i&1&&U("click",function(a){return n._handleClick(a)})("keydown",function(a){return n._handleKeydown(a)}),i&2&&(te("tabindex",n._getTabindex()),RA("mdc-evolution-chip__action--presentational",!1))},features:[mt]})}return t})(),aAA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["mat-chip-avatar"],["","matChipAvatar",""]],hostAttrs:["role","img",1,"mat-mdc-chip-avatar","mdc-evolution-chip__icon","mdc-evolution-chip__icon--primary"],features:[Bt([{provide:XR,useExisting:t}])]})}return t})();var rAA=(()=>{class t extends iN{_isPrimary=!1;_handleClick(A){this.disabled||(A.stopPropagation(),A.preventDefault(),this._parentChip.remove())}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!this.disabled&&(A.stopPropagation(),A.preventDefault(),this._parentChip.remove())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matChipRemove",""]],hostAttrs:["role","button",1,"mat-mdc-chip-remove","mat-mdc-chip-trailing-icon","mat-focus-indicator","mdc-evolution-chip__icon","mdc-evolution-chip__icon--trailing"],hostVars:1,hostBindings:function(i,n){i&2&&te("aria-hidden",null)},features:[Bt([{provide:$R,useExisting:t}]),mt]})}return t})(),t3=(()=>{class t{_changeDetectorRef=w(wt);_elementRef=w(ce);_tagName=w(ZF);_ngZone=w(qe);_focusMonitor=w($a);_globalRippleOptions=w(r2,{optional:!0});_document=w(ti);_onFocus=new ie;_onBlur=new ie;_isBasicChip=!1;role=null;_hasFocusInternal=!1;_pendingFocus=!1;_actionChanges;_animationsDisabled=An();_allLeadingIcons;_allTrailingIcons;_allEditIcons;_allRemoveIcons;_hasFocus(){return this._hasFocusInternal}id=w(In).getId("mat-mdc-chip-");ariaLabel=null;ariaDescription=null;_chipListDisabled=!1;_hadFocusOnRemove=!1;_textElement;get value(){return this._value!==void 0?this._value:this._textElement.textContent.trim()}set value(A){this._value=A}_value;color;removable=!0;highlighted=!1;disableRipple=!1;get disabled(){return this._disabled||this._chipListDisabled}set disabled(A){this._disabled=A}_disabled=!1;removed=new LA;destroyed=new LA;basicChipAttrName="mat-basic-chip";leadingIcon;editIcon;trailingIcon;removeIcon;primaryAction;_rippleLoader=w(Sp);_injector=w(Dt);constructor(){let A=w(eo);A.load(lr),A.load(o2),this._monitorFocus(),this._rippleLoader?.configureRipple(this._elementRef.nativeElement,{className:"mat-mdc-chip-ripple",disabled:this._isRippleDisabled()})}ngOnInit(){this._isBasicChip=this._elementRef.nativeElement.hasAttribute(this.basicChipAttrName)||this._tagName.toLowerCase()===this.basicChipAttrName}ngAfterViewInit(){this._textElement=this._elementRef.nativeElement.querySelector(".mat-mdc-chip-action-label"),this._pendingFocus&&(this._pendingFocus=!1,this.focus())}ngAfterContentInit(){this._actionChanges=Ki(this._allLeadingIcons.changes,this._allTrailingIcons.changes,this._allEditIcons.changes,this._allRemoveIcons.changes).subscribe(()=>this._changeDetectorRef.markForCheck())}ngDoCheck(){this._rippleLoader.setDisabled(this._elementRef.nativeElement,this._isRippleDisabled())}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement),this._actionChanges?.unsubscribe(),this.destroyed.emit({chip:this}),this.destroyed.complete()}remove(){this.removable&&(this._hadFocusOnRemove=this._hasFocus(),this.removed.emit({chip:this}))}_isRippleDisabled(){return this.disabled||this.disableRipple||this._animationsDisabled||this._isBasicChip||!this._hasInteractiveActions()||!!this._globalRippleOptions?.disabled}_hasTrailingIcon(){return!!(this.trailingIcon||this.removeIcon)}_handleKeydown(A){(A.keyCode===8&&!A.repeat||A.keyCode===46)&&(A.preventDefault(),this.remove())}focus(){this.disabled||(this.primaryAction?this.primaryAction.focus():this._pendingFocus=!0)}_getSourceAction(A){return this._getActions().find(i=>{let n=i._elementRef.nativeElement;return n===A||n.contains(A)})}_getActions(){let A=[];return this.editIcon&&A.push(this.editIcon),this.primaryAction&&A.push(this.primaryAction),this.removeIcon&&A.push(this.removeIcon),A}_handlePrimaryActionInteraction(){}_hasInteractiveActions(){return this._getActions().length>0}_edit(A){}_monitorFocus(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{let i=A!==null;i!==this._hasFocusInternal&&(this._hasFocusInternal=i,i?this._onFocus.next({chip:this}):(this._changeDetectorRef.markForCheck(),setTimeout(()=>this._ngZone.run(()=>this._onBlur.next({chip:this})))))})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-basic-chip"],["","mat-basic-chip",""],["mat-chip"],["","mat-chip",""]],contentQueries:function(i,n,o){if(i&1&&jo(o,XR,5)(o,eAA,5)(o,AAA,5)(o,$R,5)(o,XR,5)(o,AAA,5)(o,eAA,5)(o,$R,5),i&2){let a;ae(a=re())&&(n.leadingIcon=a.first),ae(a=re())&&(n.editIcon=a.first),ae(a=re())&&(n.trailingIcon=a.first),ae(a=re())&&(n.removeIcon=a.first),ae(a=re())&&(n._allLeadingIcons=a),ae(a=re())&&(n._allTrailingIcons=a),ae(a=re())&&(n._allEditIcons=a),ae(a=re())&&(n._allRemoveIcons=a)}},viewQuery:function(i,n){if(i&1&&Jt(iN,5),i&2){let o;ae(o=re())&&(n.primaryAction=o.first)}},hostAttrs:[1,"mat-mdc-chip"],hostVars:31,hostBindings:function(i,n){i&1&&U("keydown",function(a){return n._handleKeydown(a)}),i&2&&(ha("id",n.id),te("role",n.role)("aria-label",n.ariaLabel),ro("mat-"+(n.color||"primary")),RA("mdc-evolution-chip",!n._isBasicChip)("mdc-evolution-chip--disabled",n.disabled)("mdc-evolution-chip--with-trailing-action",n._hasTrailingIcon())("mdc-evolution-chip--with-primary-graphic",n.leadingIcon)("mdc-evolution-chip--with-primary-icon",n.leadingIcon)("mdc-evolution-chip--with-avatar",n.leadingIcon)("mat-mdc-chip-with-avatar",n.leadingIcon)("mat-mdc-chip-highlighted",n.highlighted)("mat-mdc-chip-disabled",n.disabled)("mat-mdc-basic-chip",n._isBasicChip)("mat-mdc-standard-chip",!n._isBasicChip)("mat-mdc-chip-with-trailing-icon",n._hasTrailingIcon())("_mat-animation-noopable",n._animationsDisabled))},inputs:{role:"role",id:"id",ariaLabel:[0,"aria-label","ariaLabel"],ariaDescription:[0,"aria-description","ariaDescription"],value:"value",color:"color",removable:[2,"removable","removable",Be],highlighted:[2,"highlighted","highlighted",Be],disableRipple:[2,"disableRipple","disableRipple",Be],disabled:[2,"disabled","disabled",Be]},outputs:{removed:"removed",destroyed:"destroyed"},exportAs:["matChip"],features:[Bt([{provide:tN,useExisting:t}])],ngContentSelectors:iAA,decls:8,vars:2,consts:[[1,"mat-mdc-chip-focus-overlay"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary"],["matChipContent",""],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],[1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"]],template:function(i,n){i&1&&(Rt(tAA),hA(0,"span",0),B(1,"span",1)(2,"span",2),O(3,xDA,2,0,"span",3),B(4,"span",4),Ve(5),hA(6,"span",5),Q()()(),O(7,_DA,2,0,"span",6)),i&2&&(u(3),Y(n.leadingIcon?3:-1),u(4),Y(n._hasTrailingIcon()?7:-1))},dependencies:[oAA],styles:[`.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}@media(forced-colors: active){.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{forced-color-adjust:none}}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-outline-width, 1px);border-radius:var(--mat-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mat-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--secondary{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mat-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mat-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mat-chip-with-avatar-avatar-size, 24px);height:var(--mat-chip-with-avatar-avatar-size, 24px);font-size:var(--mat-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__graphic{padding-left:0}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mat-chip-container-shape-radius, 8px);height:var(--mat-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mat-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mat-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mat-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mat-chip-with-icon-icon-size, 18px);height:var(--mat-chip-with-icon-icon-size, 18px);font-size:var(--mat-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mat-chip-with-icon-icon-color: var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mat-chip-elevated-container-color: var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mat-chip-label-text-color: var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mat-chip-outline-width: var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mat-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mat-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-edit,.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-edit:focus,.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-edit:hover::after,.mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-chip-edit:focus::after,.mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:focus::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:hover::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mat-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-edit::before,.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus-visible .mat-focus-indicator::before{content:""}.mdc-evolution-chip__icon,.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{min-height:fit-content}img.mdc-evolution-chip__icon{min-height:0} +`],encapsulation:2,changeDetection:0})}return t})();var nN=(()=>{class t extends t3{_defaultOptions=w(eN,{optional:!0});chipListSelectable=!0;_chipListMultiple=!1;_chipListHideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get selectable(){return this._selectable&&this.chipListSelectable}set selectable(A){this._selectable=A,this._changeDetectorRef.markForCheck()}_selectable=!0;get selected(){return this._selected}set selected(A){this._setSelectedState(A,!1,!0)}_selected=!1;get ariaSelected(){return this.selectable?this.selected.toString():null}basicChipAttrName="mat-basic-chip-option";selectionChange=new LA;ngOnInit(){super.ngOnInit(),this.role="presentation"}select(){this._setSelectedState(!0,!1,!0)}deselect(){this._setSelectedState(!1,!1,!0)}selectViaInteraction(){this._setSelectedState(!0,!0,!0)}toggleSelected(A=!1){return this._setSelectedState(!this.selected,A,!0),this.selected}_handlePrimaryActionInteraction(){this.disabled||(this.focus(),this.selectable&&this.toggleSelected(!0))}_hasLeadingGraphic(){return this.leadingIcon?!0:!this._chipListHideSingleSelectionIndicator||this._chipListMultiple}_setSelectedState(A,i,n){A!==this.selected&&(this._selected=A,n&&this.selectionChange.emit({source:this,isUserInput:i,selected:this.selected}),this._changeDetectorRef.markForCheck())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275cmp=SA({type:t,selectors:[["mat-basic-chip-option"],["","mat-basic-chip-option",""],["mat-chip-option"],["","mat-chip-option",""]],hostAttrs:[1,"mat-mdc-chip","mat-mdc-chip-option"],hostVars:37,hostBindings:function(i,n){i&2&&(ha("id",n.id),te("tabindex",null)("aria-label",null)("aria-description",null)("role",n.role),RA("mdc-evolution-chip",!n._isBasicChip)("mdc-evolution-chip--filter",!n._isBasicChip)("mdc-evolution-chip--selectable",!n._isBasicChip)("mat-mdc-chip-selected",n.selected)("mat-mdc-chip-multiple",n._chipListMultiple)("mat-mdc-chip-disabled",n.disabled)("mat-mdc-chip-with-avatar",n.leadingIcon)("mdc-evolution-chip--disabled",n.disabled)("mdc-evolution-chip--selected",n.selected)("mdc-evolution-chip--selecting",!n._animationsDisabled)("mdc-evolution-chip--with-trailing-action",n._hasTrailingIcon())("mdc-evolution-chip--with-primary-icon",n.leadingIcon)("mdc-evolution-chip--with-primary-graphic",n._hasLeadingGraphic())("mdc-evolution-chip--with-avatar",n.leadingIcon)("mat-mdc-chip-highlighted",n.highlighted)("mat-mdc-chip-with-trailing-icon",n._hasTrailingIcon()))},inputs:{selectable:[2,"selectable","selectable",Be],selected:[2,"selected","selected",Be]},outputs:{selectionChange:"selectionChange"},features:[Bt([{provide:t3,useExisting:t},{provide:tN,useExisting:t}]),mt],ngContentSelectors:iAA,decls:8,vars:6,consts:[[1,"mat-mdc-chip-focus-overlay"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary"],["matChipAction","","role","option",3,"_allowFocusWhenDisabled"],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],[1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"],[1,"mdc-evolution-chip__checkmark"],["viewBox","-2 -3 30 30","focusable","false","aria-hidden","true",1,"mdc-evolution-chip__checkmark-svg"],["fill","none","stroke","currentColor","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-evolution-chip__checkmark-path"]],template:function(i,n){i&1&&(Rt(tAA),hA(0,"span",0),B(1,"span",1)(2,"button",2),O(3,RDA,5,0,"span",3),B(4,"span",4),Ve(5),hA(6,"span",5),Q()()(),O(7,NDA,2,0,"span",6)),i&2&&(u(2),H("_allowFocusWhenDisabled",!0),te("aria-description",n.ariaDescription)("aria-label",n.ariaLabel)("aria-selected",n.ariaSelected),u(),Y(n._hasLeadingGraphic()?3:-1),u(4),Y(n._hasTrailingIcon()?7:-1))},dependencies:[iN],styles:[FDA],encapsulation:2,changeDetection:0})}return t})();var oN=(()=>{class t{_elementRef=w(ce);_changeDetectorRef=w(wt);_dir=w(fo,{optional:!0});_lastDestroyedFocusedChipIndex=null;_keyManager;_destroyed=new ie;_defaultRole="presentation";get chipFocusChanges(){return this._getChipStream(A=>A._onFocus)}get chipDestroyedChanges(){return this._getChipStream(A=>A.destroyed)}get chipRemovedChanges(){return this._getChipStream(A=>A.removed)}get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._syncChipsState()}_disabled=!1;get empty(){return!this._chips||this._chips.length===0}get role(){return this._explicitRole?this._explicitRole:this.empty?null:this._defaultRole}tabIndex=0;set role(A){this._explicitRole=A}_explicitRole=null;get focused(){return this._hasFocusedChip()}_chips;_chipActions=new xg;constructor(){}ngAfterViewInit(){this._setUpFocusManagement(),this._trackChipSetChanges(),this._trackDestroyedFocusedChip()}ngOnDestroy(){this._keyManager?.destroy(),this._chipActions.destroy(),this._destroyed.next(),this._destroyed.complete()}_hasFocusedChip(){return this._chips&&this._chips.some(A=>A._hasFocus())}_syncChipsState(){this._chips?.forEach(A=>{A._chipListDisabled=this._disabled,A._changeDetectorRef.markForCheck()})}focus(){}_handleKeydown(A){this._originatesFromChip(A)&&this._keyManager.onKeydown(A)}_isValidIndex(A){return A>=0&&Athis._elementRef.nativeElement.tabIndex=A))}_getChipStream(A){return this._chips.changes.pipe(Sn(null),hi(()=>Ki(...this._chips.map(A))))}_originatesFromChip(A){let i=A.target;for(;i&&i!==this._elementRef.nativeElement;){if(i.classList.contains("mat-mdc-chip"))return!0;i=i.parentElement}return!1}_setUpFocusManagement(){this._chips.changes.pipe(Sn(this._chips)).subscribe(A=>{let i=[];A.forEach(n=>n._getActions().forEach(o=>i.push(o))),this._chipActions.reset(i),this._chipActions.notifyOnChanges()}),this._keyManager=new H0(this._chipActions).withVerticalOrientation().withHorizontalOrientation(this._dir?this._dir.value:"ltr").withHomeAndEnd().skipPredicate(A=>this._skipPredicate(A)),this.chipFocusChanges.pipe(Qt(this._destroyed)).subscribe(({chip:A})=>{let i=A._getSourceAction(document.activeElement);i&&this._keyManager.updateActiveItem(i)}),this._dir?.change.pipe(Qt(this._destroyed)).subscribe(A=>this._keyManager.withHorizontalOrientation(A))}_skipPredicate(A){return A.disabled}_trackChipSetChanges(){this._chips.changes.pipe(Sn(null),Qt(this._destroyed)).subscribe(()=>{this.disabled&&Promise.resolve().then(()=>this._syncChipsState()),this._redirectDestroyedChipFocus()})}_trackDestroyedFocusedChip(){this.chipDestroyedChanges.pipe(Qt(this._destroyed)).subscribe(A=>{let n=this._chips.toArray().indexOf(A.chip),o=A.chip._hasFocus(),a=A.chip._hadFocusOnRemove&&this._keyManager.activeItem&&A.chip._getActions().includes(this._keyManager.activeItem),r=o||a;this._isValidIndex(n)&&r&&(this._lastDestroyedFocusedChipIndex=n)})}_redirectDestroyedChipFocus(){if(this._lastDestroyedFocusedChipIndex!=null){if(this._chips.length){let A=Math.min(this._lastDestroyedFocusedChipIndex,this._chips.length-1),i=this._chips.toArray()[A];i.disabled?this._chips.length===1?this.focus():this._keyManager.setPreviousItemActive():i.focus()}else this.focus();this._lastDestroyedFocusedChipIndex=null}}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-chip-set"]],contentQueries:function(i,n,o){if(i&1&&jo(o,t3,5),i&2){let a;ae(a=re())&&(n._chips=a)}},hostAttrs:[1,"mat-mdc-chip-set","mdc-evolution-chip-set"],hostVars:1,hostBindings:function(i,n){i&1&&U("keydown",function(a){return n._handleKeydown(a)}),i&2&&te("role",n.role)},inputs:{disabled:[2,"disabled","disabled",Be],role:"role",tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:Cn(A)]},ngContentSelectors:nAA,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(i,n){i&1&&(Rt(),wn(0,"div",0),Ve(1),Gn())},styles:[`.mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-moz-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-webkit-input-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input:-ms-input-placeholder{opacity:1}.mat-mdc-chip-set+input.mat-mdc-chip-input{margin-left:0;margin-right:0} +`],encapsulation:2,changeDetection:0})}return t})(),AN=class{source;value;constructor(e,A){this.source=e,this.value=A}},GDA={provide:as,useExisting:Ja(()=>aN),multi:!0},aN=(()=>{class t extends oN{_onTouched=()=>{};_onChange=()=>{};_defaultRole="listbox";_defaultOptions=w(eN,{optional:!0});get multiple(){return this._multiple}set multiple(A){this._multiple=A,this._syncListboxProperties()}_multiple=!1;get selected(){let A=this._chips.toArray().filter(i=>i.selected);return this.multiple?A:A[0]}ariaOrientation="horizontal";get selectable(){return this._selectable}set selectable(A){this._selectable=A,this._syncListboxProperties()}_selectable=!0;compareWith=(A,i)=>A===i;required=!1;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncListboxProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get chipSelectionChanges(){return this._getChipStream(A=>A.selectionChange)}get chipBlurChanges(){return this._getChipStream(A=>A._onBlur)}get value(){return this._value}set value(A){this._chips&&this._chips.length&&this._setSelectionByValue(A,!1),this._value=A}_value;change=new LA;_chips=void 0;ngAfterContentInit(){this._chips.changes.pipe(Sn(null),Qt(this._destroyed)).subscribe(()=>{this.value!==void 0&&Promise.resolve().then(()=>{this._setSelectionByValue(this.value,!1)}),this._syncListboxProperties()}),this.chipBlurChanges.pipe(Qt(this._destroyed)).subscribe(()=>this._blur()),this.chipSelectionChanges.pipe(Qt(this._destroyed)).subscribe(A=>{this.multiple||this._chips.forEach(i=>{i!==A.source&&i._setSelectedState(!1,!1,!1)}),A.isUserInput&&this._propagateChanges()})}focus(){if(this.disabled)return;let A=this._getFirstSelectedChip();A&&!A.disabled?A.focus():this._chips.length>0?this._keyManager.setFirstItemActive():this._elementRef.nativeElement.focus()}writeValue(A){A!=null?this.value=A:this.value=void 0}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}_setSelectionByValue(A,i=!0){this._clearSelection(),Array.isArray(A)?A.forEach(n=>this._selectValue(n,i)):this._selectValue(A,i)}_blur(){this.disabled||setTimeout(()=>{this.focused||this._markAsTouched()})}_keydown(A){A.keyCode===9&&super._allowFocusEscape()}_markAsTouched(){this._onTouched(),this._changeDetectorRef.markForCheck()}_propagateChanges(){let A=null;Array.isArray(this.selected)?A=this.selected.map(i=>i.value):A=this.selected?this.selected.value:void 0,this._value=A,this.change.emit(new AN(this,A)),this._onChange(A),this._changeDetectorRef.markForCheck()}_clearSelection(A){this._chips.forEach(i=>{i!==A&&i.deselect()})}_selectValue(A,i){let n=this._chips.find(o=>o.value!=null&&this.compareWith(o.value,A));return n&&(i?n.selectViaInteraction():n.select()),n}_syncListboxProperties(){this._chips&&Promise.resolve().then(()=>{this._chips.forEach(A=>{A._chipListMultiple=this.multiple,A.chipListSelectable=this._selectable,A._chipListHideSingleSelectionIndicator=this.hideSingleSelectionIndicator,A._changeDetectorRef.markForCheck()})})}_getFirstSelectedChip(){return Array.isArray(this.selected)?this.selected.length?this.selected[0]:void 0:this.selected}_skipPredicate(A){return!1}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275cmp=SA({type:t,selectors:[["mat-chip-listbox"]],contentQueries:function(i,n,o){if(i&1&&jo(o,nN,5),i&2){let a;ae(a=re())&&(n._chips=a)}},hostAttrs:[1,"mdc-evolution-chip-set","mat-mdc-chip-listbox"],hostVars:10,hostBindings:function(i,n){i&1&&U("focus",function(){return n.focus()})("blur",function(){return n._blur()})("keydown",function(a){return n._keydown(a)}),i&2&&(ha("tabIndex",n.disabled||n.empty?-1:n.tabIndex),te("role",n.role)("aria-required",n.role?n.required:null)("aria-disabled",n.disabled.toString())("aria-multiselectable",n.multiple)("aria-orientation",n.ariaOrientation),RA("mat-mdc-chip-list-disabled",n.disabled)("mat-mdc-chip-list-required",n.required))},inputs:{multiple:[2,"multiple","multiple",Be],ariaOrientation:[0,"aria-orientation","ariaOrientation"],selectable:[2,"selectable","selectable",Be],compareWith:"compareWith",required:[2,"required","required",Be],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",Be],value:"value"},outputs:{change:"change"},features:[Bt([GDA]),mt],ngContentSelectors:nAA,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(i,n){i&1&&(Rt(),wn(0,"div",0),Ve(1),Gn())},styles:[LDA],encapsulation:2,changeDetection:0})}return t})();var UD=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({providers:[gB,{provide:eN,useValue:{separatorKeyCodes:[13]}}],imports:[Yc,fi]})}return t})();var lAA=(()=>{class t{get vertical(){return this._vertical}set vertical(A){this._vertical=mr(A)}_vertical=!1;get inset(){return this._inset}set inset(A){this._inset=mr(A)}_inset=!1;static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-divider"]],hostAttrs:["role","separator",1,"mat-divider"],hostVars:7,hostBindings:function(i,n){i&2&&(te("aria-orientation",n.vertical?"vertical":"horizontal"),RA("mat-divider-vertical",n.vertical)("mat-divider-horizontal",!n.vertical)("mat-divider-inset",n.inset))},inputs:{vertical:"vertical",inset:"inset"},decls:0,vars:0,template:function(i,n){},styles:[`.mat-divider{display:block;margin:0;border-top-style:solid;border-top-color:var(--mat-divider-color, var(--mat-sys-outline-variant));border-top-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-vertical{border-top:0;border-right-style:solid;border-right-color:var(--mat-divider-color, var(--mat-sys-outline-variant));border-right-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-inset{margin-left:80px}[dir=rtl] .mat-divider.mat-divider-inset{margin-left:auto;margin-right:80px} +`],encapsulation:2,changeDetection:0})}return t})(),gAA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();var TD=class t{themeService=w(eg);get currentTheme(){return this.themeService.currentTheme()}get themeIcon(){return this.currentTheme==="light"?"dark_mode":"light_mode"}get themeTooltip(){return this.currentTheme==="light"?"Switch to dark mode":"Switch to light mode"}toggleTheme(){this.themeService.toggleTheme()}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-theme-toggle"]],decls:3,vars:2,consts:[["mat-icon-button","","aria-label","Toggle theme",1,"theme-toggle-button",3,"click","matTooltip"]],template:function(A,i){A&1&&(B(0,"button",0),U("click",function(){return i.toggleTheme()}),B(1,"mat-icon"),y(2),Q()()),A&2&&(H("matTooltip",i.themeTooltip),u(2),lA(i.themeIcon))},dependencies:[Tn,Wt,qi,ji,Fa,dn],styles:[".theme-toggle-button[_ngcontent-%COMP%]{color:var(--side-panel-mat-icon-color);width:24px;height:24px;padding:0}.theme-toggle-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.theme-toggle-button[_ngcontent-%COMP%]:hover{opacity:.8}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color);border-radius:50%;transition:all .2s ease;margin-right:0!important}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);opacity:1}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}"]})};var cAA=(t,e)=>e.name;function UDA(t,e){if(t&1&&y(0),t&2){let A=p().$implicit;ue(" AgentTool: ",A.name," ")}}function TDA(t,e){if(t&1&&y(0),t&2){let A=p().$implicit;ue(" ",A.name," ")}}function JDA(t,e){t&1&&(B(0,"mat-icon",28),y(1,"chevron_right"),Q())}function ODA(t,e){if(t&1){let A=QA();B(0,"div",27),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.selectAgentFromBreadcrumb(n))}),O(1,UDA,1,1)(2,TDA,1,1),Q(),O(3,JDA,2,0,"mat-icon",28)}if(t&2){let A=e.$implicit,i=e.$index,n=p(2);RA("current-agent",(n.currentSelectedAgent==null?null:n.currentSelectedAgent.name)===A.name),u(),Y(i===0&&n.isInAgentToolContext()?1:2),u(2),Y(i0?0:-1)}}function AyA(t,e){if(t&1){let A=QA();B(0,"div",15)(1,"div",16)(2,"div"),y(3," Tools "),Q(),B(4,"div")(5,"button",40,2)(7,"mat-icon"),y(8,"add"),Q()(),B(9,"mat-menu",null,3)(11,"button",23),U("click",function(){T(A);let n=p();return J(n.addTool("Function tool"))}),B(12,"span"),y(13,"Function tool"),Q()(),B(14,"button",23),U("click",function(){T(A);let n=p();return J(n.addTool("Built-in tool"))}),B(15,"span"),y(16,"Built-in tool"),Q()(),B(17,"button",23),U("click",function(){T(A);let n=p();return J(n.createAgentTool())}),B(18,"span"),y(19,"Agent tool"),Q()()()()(),O(20,$DA,1,1),Ht(21,"async"),Q()}if(t&2){let A,i=Qi(10),n=p();u(5),H("matMenuTriggerFor",i),u(6),H("matTooltip",n.toolMenuTooltips("Function tool")),u(3),H("matTooltip",n.toolMenuTooltips("Built-in tool")),u(3),H("matTooltip",n.toolMenuTooltips("Agent tool")),u(3),Y((A=si(21,5,n.toolsMap$))?20:-1,A)}}function eyA(t,e){if(t&1){let A=QA();B(0,"mat-chip",43),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.selectAgent(n))}),B(1,"mat-icon",44),y(2),Q(),B(3,"span",45),y(4),Q(),B(5,"button",48),U("click",function(n){let o=T(A).$implicit;return p(2).deleteSubAgent(o.name),J(n.stopPropagation())}),B(6,"mat-icon"),y(7,"cancel"),Q()()()}if(t&2){let A=e.$implicit,i=p(2);u(2),lA(i.getAgentIcon(A.agent_class)),u(2),lA(A.name)}}function tyA(t,e){if(t&1&&(B(0,"div",20)(1,"mat-chip-set",47),Ue(2,eyA,8,2,"mat-chip",42,cAA),Q()()),t&2){let A=p();u(2),Te(A.agentConfig.sub_agents)}}function iyA(t,e){if(t&1){let A=QA();hA(0,"mat-divider"),B(1,"div",22),y(2,"Model (LLM) Interaction"),Q(),B(3,"button",23),U("click",function(){T(A);let n=p();return J(n.addCallback("before_model"))}),B(4,"span"),y(5,"Before Model"),Q()(),B(6,"button",23),U("click",function(){T(A);let n=p();return J(n.addCallback("after_model"))}),B(7,"span"),y(8,"After Model"),Q()(),hA(9,"mat-divider"),B(10,"div",22),y(11,"Tool Execution"),Q(),B(12,"button",23),U("click",function(){T(A);let n=p();return J(n.addCallback("before_tool"))}),B(13,"span"),y(14,"Before Tool"),Q()(),B(15,"button",23),U("click",function(){T(A);let n=p();return J(n.addCallback("after_tool"))}),B(16,"span"),y(17,"After Tool"),Q()()}if(t&2){let A=p();u(3),H("matTooltip",A.callbackMenuTooltips("before_model")),u(3),H("matTooltip",A.callbackMenuTooltips("after_model")),u(6),H("matTooltip",A.callbackMenuTooltips("before_tool")),u(3),H("matTooltip",A.callbackMenuTooltips("after_tool"))}}function nyA(t,e){if(t&1){let A=QA();B(0,"div",52),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.editCallback(n))}),B(1,"mat-chip",53)(2,"span",54)(3,"span",55),y(4),Q(),B(5,"span",56),y(6),Q()()(),B(7,"button",57),U("click",function(n){let o=T(A).$implicit,a=p(3);return a.deleteCallback(a.agentConfig.name,o),J(n.stopPropagation())}),B(8,"mat-icon"),y(9,"remove"),Q()()()}if(t&2){let A=e.$implicit;u(4),lA(A.type),u(2),lA(A.name)}}function oyA(t,e){if(t&1&&(B(0,"div",49)(1,"mat-chip-set",50),Ue(2,nyA,10,2,"div",51,ri),Q()()),t&2){let A=p(),i=p();u(2),Te(A.get(i.agentConfig.name))}}function ayA(t,e){if(t&1&&O(0,oyA,4,0,"div",49),t&2){let A=e,i=p();Y(i.agentConfig&&A.get(i.agentConfig.name)&&A.get(i.agentConfig.name).length>0?0:-1)}}var JD=class t{CALLBACKS_TAB_INDEX=3;jsonEditorComponent;appNameInput="";exitBuilderMode=new LA;closePanel=new LA;featureFlagService=w(yr);isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();toolArgsString=bA("");editingToolArgs=bA(!1);editingTool=null;selectedTabIndex=0;agentConfig={isRoot:!1,name:"",agent_class:"",model:"",instruction:"",sub_agents:[],tools:[],callbacks:[]};hierarchyPath=[];currentSelectedAgent=void 0;isRootAgentEditable=!0;models=["gemini-2.5-flash","gemini-2.5-pro"];agentTypes=["LlmAgent","LoopAgent","ParallelAgent","SequentialAgent"];agentBuilderService=w(e0);dialog=w(Or);agentService=w($s);snackBar=w(h2);router=w(ls);cdr=w(wt);selectedTool=void 0;toolAgentName="";toolTypes=["Custom tool","Function tool","Built-in tool","Agent Tool"];editingCallback=null;selectedCallback=void 0;callbackTypes=["before_agent","before_model","before_tool","after_tool","after_model","after_agent"];builtInTools=["EnterpriseWebSearchTool","exit_loop","FilesRetrieval","get_user_choice","google_search","load_artifacts","load_memory","LongRunningFunctionTool","preload_memory","url_context","VertexAiRagRetrieval","VertexAiSearchTool"];builtInToolArgs=new Map([["EnterpriseWebSearchTool",[]],["exit_loop",[]],["FilesRetrieval",["name","description","input_dir"]],["get_user_choice",[]],["google_search",[]],["load_artifacts",[]],["load_memory",[]],["LongRunningFunctionTool",["func"]],["preload_memory",[]],["url_context",[]],["VertexAiRagRetrieval",["name","description","rag_corpora","rag_resources","similarity_top_k","vector_distance_threshold"]],["VertexAiSearchTool",["data_store_id","data_store_specs","search_engine_id","filter","max_results"]]]);header="Select an agent or tool to edit";toolsMap$;callbacksMap$;getJsonStringForEditor(e){if(!e)return"{}";let A=gA({},e);return delete A.skip_summarization,JSON.stringify(A,null,2)}constructor(){this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.callbacksMap$=this.agentBuilderService.getAgentCallbacksMap(),this.agentBuilderService.getSelectedNode().subscribe(e=>{this.agentConfig=e,this.currentSelectedAgent=e,e&&(this.editingTool=null,this.editingCallback=null,this.header="Agent configuration",this.updateBreadcrumb(e)),this.cdr.markForCheck()}),this.agentBuilderService.getSelectedTool().subscribe(e=>{this.selectedTool=e,!(e&&e.toolType==="Agent Tool")&&(e?(this.editingTool=e,this.editingToolArgs.set(!1),setTimeout(()=>{let A=e.toolType=="Function tool"?"Function tool":e.name;if(e.toolType=="Function tool"&&!e.name&&(e.name="Function tool"),e.toolType==="Custom tool")e.args||(e.args={}),this.toolArgsString.set(this.getJsonStringForEditor(e.args)),this.editingToolArgs.set(!0);else{let i=this.builtInToolArgs.get(A);if(i){e.args||(e.args={});for(let n of i)e.args&&(e.args[n]="")}this.toolArgsString.set(this.getJsonStringForEditor(e.args)),e.args&&this.getObjectKeys(e.args).length>0&&this.editingToolArgs.set(!0)}this.cdr.markForCheck()}),this.selectedTabIndex=2):this.editingTool=null,this.cdr.markForCheck())}),this.agentBuilderService.getSelectedCallback().subscribe(e=>{this.selectedCallback=e,e?(this.selectCallback(e),this.selectedTabIndex=this.CALLBACKS_TAB_INDEX):this.editingCallback=null,this.cdr.markForCheck()}),this.agentBuilderService.getAgentCallbacks().subscribe(e=>{this.agentConfig&&e&&this.agentConfig.name===e.agentName&&(this.agentConfig=Ye(gA({},this.agentConfig),{callbacks:e.callbacks}),this.cdr.markForCheck())}),this.agentBuilderService.getSideTabChangeRequest().subscribe(e=>{e==="tools"?this.selectedTabIndex=2:e==="config"&&(this.selectedTabIndex=0)})}getObjectKeys(e){return e?Object.keys(e).filter(A=>A!=="skip_summarization"):[]}getCallbacksByType(){let e=new Map;return this.callbackTypes.forEach(A=>{e.set(A,[])}),this.agentConfig?.callbacks&&this.agentConfig.callbacks.forEach(A=>{let i=e.get(A.type);i&&i.push(A)}),e}updateBreadcrumb(e){this.hierarchyPath=this.buildHierarchyPath(e)}buildHierarchyPath(e){let A=[],i=this.findContextualRoot(e);return i?e.name===i.name?[i]:this.findPathToAgent(i,e,[i])||[e]:[e]}isInAgentToolContext(){return!this.hierarchyPath||this.hierarchyPath.length===0?!1:this.hierarchyPath[0]?.isAgentTool===!0}findContextualRoot(e){if(e.isAgentTool)return e;let A=this.agentBuilderService.getNodes();for(let n of A)if(n.isAgentTool&&this.findPathToAgent(n,e,[n]))return n;let i=this.agentBuilderService.getRootNode();if(i&&this.findPathToAgent(i,e,[i]))return i;if(e.isRoot)return e;for(let n of A)if(n.isRoot&&this.findPathToAgent(n,e,[n]))return n;return i}findPathToAgent(e,A,i){if(e.name===A.name)return i;for(let n of e.sub_agents){let o=[...i,n],a=this.findPathToAgent(n,A,o);if(a)return a}return null}selectAgentFromBreadcrumb(e){this.agentBuilderService.setSelectedNode(e),this.selectedTabIndex=0}selectAgent(e){this.agentBuilderService.setSelectedNode(e),this.selectedTabIndex=0}selectTool(e){if(e.toolType==="Agent Tool"){let A=e.name;this.agentBuilderService.requestNewTab(A);return}if(e.toolType==="Function tool"||e.toolType==="Built-in tool"){this.editTool(e);return}this.agentBuilderService.setSelectedTool(e)}editTool(e){if(!this.agentConfig)return;let A;e.toolType==="Built-in tool"?A=this.dialog.open(kd,{width:"700px",maxWidth:"90vw",data:{toolName:e.name,isEditMode:!0,toolArgs:e.args}}):A=this.dialog.open(v2,{width:"500px",data:{toolType:e.toolType,toolName:e.name,isEditMode:!0}}),A.afterClosed().subscribe(i=>{if(i&&i.isEditMode){let n=this.agentConfig.tools?.findIndex(o=>o.name===e.name);n!==void 0&&n!==-1&&this.agentConfig.tools&&(this.agentConfig.tools[n].name=i.name,i.args&&(this.agentConfig.tools[n].args=i.args),this.agentBuilderService.setAgentTools(this.agentConfig.name,this.agentConfig.tools))}})}addTool(e){if(this.agentConfig){let A;e==="Built-in tool"?A=this.dialog.open(kd,{width:"700px",maxWidth:"90vw",data:{}}):A=this.dialog.open(v2,{width:"500px",data:{toolType:e}}),A.afterClosed().subscribe(i=>{if(i){let n={toolType:i.toolType,name:i.name};this.agentBuilderService.addTool(this.agentConfig.name,n),this.agentBuilderService.setSelectedTool(n)}})}}addCallback(e){if(this.agentConfig){let A=this.agentConfig?.callbacks?.map(n=>n.name)??[];this.dialog.open(o4,{width:"500px",data:{callbackType:e,existingCallbackNames:A}}).afterClosed().subscribe(n=>{if(n){let o={name:n.name,type:n.type};this.agentBuilderService.addCallback(this.agentConfig.name,o)}})}}editCallback(e){if(!this.agentConfig)return;let A=this.agentConfig.callbacks?.map(n=>n.name)??[];this.dialog.open(o4,{width:"500px",data:{callbackType:e.type,existingCallbackNames:A,isEditMode:!0,callback:e,availableCallbackTypes:this.callbackTypes}}).afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=this.agentBuilderService.updateCallback(this.agentConfig.name,e.name,Ye(gA({},e),{name:n.name,type:n.type}));o.success?this.cdr.markForCheck():console.error("Failed to update callback:",o.error)}})}deleteCallback(e,A){this.dialog.open(vc,{data:{title:"Delete Callback",message:`Are you sure you want to delete ${A.name}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(n=>{if(n==="confirm"){let o=this.agentBuilderService.deleteCallback(e,A);o.success?this.cdr.markForCheck():console.error("Failed to delete callback:",o.error)}})}addSubAgent(e){e&&this.agentBuilderService.setAddSubAgentSubject(e)}deleteSubAgent(e){this.agentBuilderService.setDeleteSubAgentSubject(e)}deleteTool(e,A){let i=A.toolType==="Agent Tool",n=i&&A.toolAgentName||A.name;this.dialog.open(vc,{data:{title:i?"Delete Agent Tool":"Delete Tool",message:i?`Are you sure you want to delete the agent tool "${n}"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(a=>{if(a==="confirm")if(A.toolType==="Agent Tool"){let r=A.toolAgentName||A.name;this.deleteAgentToolAndBoard(e,A,r)}else this.agentBuilderService.deleteTool(e,A)})}deleteAgentToolAndBoard(e,A,i){this.agentBuilderService.deleteTool(e,A),this.agentBuilderService.requestTabDeletion(i)}backToToolList(){this.editingTool=null,this.agentBuilderService.setSelectedTool(void 0)}editToolArgs(){this.editingToolArgs.set(!0)}cancelEditToolArgs(e){this.editingToolArgs.set(!1),this.toolArgsString.set(this.getJsonStringForEditor(e?.args))}saveToolArgs(e){if(this.jsonEditorComponent&&e)try{let A=JSON.parse(this.jsonEditorComponent.getJsonString()),i=e.args?e.args.skip_summarization:!1;e.args=A,e.args.skip_summarization=i,this.toolArgsString.set(JSON.stringify(e.args,null,2)),this.editingToolArgs.set(!1)}catch(A){console.error("Error parsing tool arguments JSON",A)}}onToolTypeSelectionChange(e){e?.toolType==="Built-in tool"?(e.name="google_search",this.onBuiltInToolSelectionChange(e)):e?.toolType==="Custom tool"?(e.args={},this.toolArgsString.set(this.getJsonStringForEditor(e.args)),this.editingToolArgs.set(!0)):e&&(e.name="",e.args={skip_summarization:!1},this.toolArgsString.set("{}"),this.editingToolArgs.set(!1))}onBuiltInToolSelectionChange(e){e&&(this.editingToolArgs.set(!1),setTimeout(()=>{e.args={skip_summarization:!1};let A=this.builtInToolArgs.get(e.name);if(A)for(let i of A)e.args&&(e.args[i]="");this.toolArgsString.set(this.getJsonStringForEditor(e.args)),e.args&&this.getObjectKeys(e.args).length>0&&this.editingToolArgs.set(!0),this.cdr.markForCheck()}))}selectCallback(e){this.editingCallback=e}backToCallbackList(){this.editingCallback=null}onCallbackTypeChange(e){}createAgentTool(){this.dialog.open(vc,{width:"750px",height:"450px",data:{title:"Create Agent Tool",message:"Please enter a name for the agent tool:",confirmButtonText:"Create",showInput:!0,inputLabel:"Agent Tool Name",inputPlaceholder:"Enter agent tool name",showToolInfo:!0,toolType:"Agent tool"}}).afterClosed().subscribe(A=>{if(A&&typeof A=="string"){let i=this.agentConfig?.name||"root_agent";this.agentBuilderService.requestNewTab(A,i)}})}saveChanges(){if(!this.agentBuilderService.getRootNode()){this.snackBar.open("Please create an agent first.","OK");return}this.appNameInput?this.saveAgent(this.appNameInput):this.agentService.getApp().subscribe(A=>{A?this.saveAgent(A):this.snackBar.open("No agent selected. Please select an agent first.","OK")})}cancelChanges(){this.agentService.agentChangeCancel(this.appNameInput).subscribe(e=>{}),this.exitBuilderMode.emit()}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A){this.snackBar.open("Please create an agent first.","OK");return}let i=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();s0.generateYamlFile(A,i,e,n),this.agentService.agentBuildTmp(i).subscribe(o=>{o&&this.agentService.agentBuild(i).subscribe(a=>{a?this.router.navigate(["/"],{queryParams:{app:e}}).then(()=>{window.location.reload()}):this.snackBar.open("Something went wrong, please try again","OK")})})}getToolIcon(e){return sE(e.name,e.toolType)}getAgentIcon(e){switch(e){case"SequentialAgent":return"more_horiz";case"LoopAgent":return"sync";case"ParallelAgent":return"density_medium";default:return"psychology"}}addSubAgentWithType(e){if(!this.agentConfig?.name)return;let A=this.agentConfig.agent_class!=="LlmAgent";this.agentBuilderService.setAddSubAgentSubject(this.agentConfig.name,e,A)}callbackMenuTooltips(e){return tc.getCallbackMenuTooltips(e)}toolMenuTooltips(e){return tc.getToolMenuTooltips(e)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-builder-tabs"]],viewQuery:function(A,i){if(A&1&&Jt(yc,5),A&2){let n;ae(n=re())&&(i.jsonEditorComponent=n.first)}},inputs:{appNameInput:"appNameInput"},outputs:{exitBuilderMode:"exitBuilderMode",closePanel:"closePanel"},decls:77,vars:12,consts:[["subAgentMenu","matMenu"],["callbacksMenu","matMenu"],["agentMenuTrigger","matMenuTrigger"],["toolsMenu","matMenu"],[2,"margin-top","20px","margin-left","20px","display","flex"],[2,"width","100%"],[1,"drawer-header"],[1,"drawer-logo"],["src","assets/ADK-512-color.svg","width","32px","height","32px"],[2,"display","flex","align-items","center","gap","8px","margin-right","15px"],["matTooltip","Collapse panel",1,"material-symbols-outlined",2,"color","#c4c7c5","cursor","pointer",3,"click"],[1,"builder-tabs-container"],[1,"builder-tab-content"],[1,"agent-breadcrumb-container"],[1,"content-wrapper"],[1,"builder-panel-wrapper"],[1,"panel-title"],[1,"config-form"],["mat-icon-button","","type","button","aria-label","Add sub agent",1,"panel-action-button",3,"matMenuTriggerFor"],["mat-menu-item","",3,"click"],[1,"tools-chips-container"],["mat-icon-button","","type","button","aria-label","Add callback",1,"panel-action-button",3,"matMenuTriggerFor"],[1,"menu-header"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[1,"action-buttons"],["mat-raised-button","","color","secondary",1,"save-button",3,"click"],["mat-button","",1,"cancel-button",3,"click"],[1,"breadcrumb-chip",3,"click"],[1,"breadcrumb-arrow"],[1,"form-row"],[1,"agent-name-field"],["matInput","",3,"ngModelChange","ngModel","disabled"],[1,"agent-type-field"],["disabled","",3,"ngModelChange","ngModel"],[3,"value"],[3,"ngModel"],[3,"ngModelChange","ngModel"],["matInput","","rows","5",3,"ngModelChange","ngModel"],["matInput","","rows","3",3,"ngModelChange","ngModel"],["matInput","","type","number","min","1",3,"ngModelChange","ngModel"],["mat-icon-button","","type","button","aria-label","Add tool",1,"panel-action-button",3,"matMenuTriggerFor"],["aria-label","Tools"],[1,"tool-chip"],[1,"tool-chip",3,"click"],["matChipAvatar","",1,"tool-icon"],[1,"tool-chip-name"],["matChipRemove","","aria-label","Remove tool",3,"click"],["aria-label","Sub Agents"],["matChipRemove","","aria-label","Remove sub agent",3,"click"],[1,"tools-chips-container","callbacks-list"],["aria-label","Callbacks"],[1,"callback-row"],[1,"callback-row",3,"click"],[1,"callback-chip"],[1,"chip-content"],[1,"chip-type"],[1,"chip-name"],["mat-icon-button","","aria-label","Remove callback",1,"callback-remove",3,"click"]],template:function(A,i){if(A&1&&(B(0,"div",4)(1,"div",5)(2,"div",6)(3,"div",7),hA(4,"img",8),y(5," Agent Development Kit "),Q(),B(6,"div",9),hA(7,"app-theme-toggle"),B(8,"span",10),U("click",function(){return i.closePanel.emit()}),y(9,"left_panel_close"),Q()()()()(),B(10,"div",11)(11,"div",12),O(12,YDA,3,0,"div",13),B(13,"div",14)(14,"div",15)(15,"div",16),y(16," Configuration "),Q(),B(17,"div"),O(18,WDA,16,7,"div",17),Q()(),O(19,AyA,22,7,"div",15),B(20,"div",15)(21,"div",16)(22,"div"),y(23," Sub Agents "),Q(),B(24,"div")(25,"button",18)(26,"mat-icon"),y(27,"add"),Q()(),B(28,"mat-menu",null,0)(30,"button",19),U("click",function(){return i.addSubAgentWithType("LlmAgent")}),B(31,"mat-icon"),y(32,"psychology"),Q(),B(33,"span"),y(34,"LLM Agent"),Q()(),B(35,"button",19),U("click",function(){return i.addSubAgentWithType("SequentialAgent")}),B(36,"mat-icon"),y(37,"more_horiz"),Q(),B(38,"span"),y(39,"Sequential Agent"),Q()(),B(40,"button",19),U("click",function(){return i.addSubAgentWithType("LoopAgent")}),B(41,"mat-icon"),y(42,"sync"),Q(),B(43,"span"),y(44,"Loop Agent"),Q()(),B(45,"button",19),U("click",function(){return i.addSubAgentWithType("ParallelAgent")}),B(46,"mat-icon"),y(47,"density_medium"),Q(),B(48,"span"),y(49,"Parallel Agent"),Q()()()()(),O(50,tyA,4,0,"div",20),Q(),B(51,"div",15)(52,"div",16)(53,"div"),y(54," Callbacks "),Q(),B(55,"div")(56,"button",21)(57,"mat-icon"),y(58,"add"),Q()(),B(59,"mat-menu",null,1)(61,"div",22),y(62,"Agent Lifecycle"),Q(),B(63,"button",23),U("click",function(){return i.addCallback("before_agent")}),B(64,"span"),y(65,"Before Agent"),Q()(),B(66,"button",23),U("click",function(){return i.addCallback("after_agent")}),B(67,"span"),y(68,"After Agent"),Q()(),O(69,iyA,18,4),Q()()(),O(70,ayA,1,1),Ht(71,"async"),Q()(),B(72,"div",24)(73,"button",25),U("click",function(){return i.saveChanges()}),y(74," Save "),Q(),B(75,"button",26),U("click",function(){return i.cancelChanges()}),y(76," Cancel "),Q()()()()),A&2){let n,o=Qi(29),a=Qi(60);u(12),Y(i.hierarchyPath.length>0?12:-1),u(6),Y(i.agentConfig?18:-1),u(),Y((i.agentConfig==null?null:i.agentConfig.agent_class)==="LlmAgent"?19:-1),u(6),H("matMenuTriggerFor",o),u(25),Y(i.agentConfig&&i.agentConfig.sub_agents&&i.agentConfig.sub_agents.length>0?50:-1),u(6),H("matMenuTriggerFor",a),u(7),H("matTooltip",i.callbackMenuTooltips("before_agent")),u(3),H("matTooltip",i.callbackMenuTooltips("after_agent")),u(3),Y((i.agentConfig==null?null:i.agentConfig.agent_class)==="LlmAgent"?69:-1),u(),Y((n=si(71,10,i.callbacksMap$))?70:-1,n)}},dependencies:[li,ln,Dn,YQ,yn,ub,ko,pi,ec,tO,Ko,Wt,ua,ji,vs,Yr,Xl,dn,Zs,$c,Ml,UD,t3,aAA,rAA,oN,gAA,lAA,TD,os],styles:[".builder-tabs-container[_ngcontent-%COMP%]{width:100%;margin-top:40px;height:calc(95vh - 20px);display:flex;flex-direction:column}.agent-breadcrumb-container[_ngcontent-%COMP%]{padding:2px 20px 8px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;border-bottom:1px solid var(--builder-border-color)}.breadcrumb-chip[_ngcontent-%COMP%]{color:var(--builder-text-muted-color);font-family:Google Sans;font-size:16px;font-weight:500;border:none;cursor:pointer;transition:all .2s ease;padding:4px 8px;border-radius:4px;display:inline-block;-webkit-user-select:none;user-select:none}.breadcrumb-chip[_ngcontent-%COMP%]:hover{color:var(--builder-text-link-color)}.breadcrumb-chip.current-agent[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-weight:500}.breadcrumb-arrow[_ngcontent-%COMP%]{color:var(--builder-breadcrumb-separator-color);font-size:16px;width:16px;height:16px}.builder-tab-content[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);display:flex;flex-direction:column;flex:1;overflow:hidden}.builder-tab-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:8px 0;font-size:14px;line-height:1.5}.components-section[_ngcontent-%COMP%]{margin-bottom:32px}.components-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:14px;font-weight:500;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.config-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;margin-top:20px}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%]{display:flex;gap:16px;align-items:flex-start}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%] .agent-name-field[_ngcontent-%COMP%]{flex:1}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%] .agent-type-field[_ngcontent-%COMP%]{width:32%}.config-form[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.config-form[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{margin-bottom:8px}.config-form[_ngcontent-%COMP%] .tool-code-section[_ngcontent-%COMP%]{margin-top:16px}.config-form[_ngcontent-%COMP%] .tool-code-section[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0 0 8px;color:var(--builder-text-secondary-color);font-size:14px;font-weight:500}.config-form[_ngcontent-%COMP%] .tool-args-header[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:14px;font-weight:500;letter-spacing:.5px;text-transform:uppercase}.json-editor-wrapper[_ngcontent-%COMP%]{height:300px;max-height:300px}.tab-content-container[_ngcontent-%COMP%]{margin-top:20px;overflow-y:auto}.agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px}.sub-agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px;margin-left:16px}.tree-view[_ngcontent-%COMP%] expand-button[_ngcontent-%COMP%]{border:0}.node-item[_ngcontent-%COMP%]{display:flex;align-items:center}.node-icon[_ngcontent-%COMP%]{margin-right:14px}.node-name[_ngcontent-%COMP%]{margin-top:2px;display:flex;align-items:center}.no-tools-message[_ngcontent-%COMP%]{display:block;color:var(--builder-text-secondary-color);font-size:16px;margin-top:16px;margin-bottom:16px;text-align:center}.tools-list[_ngcontent-%COMP%]{list-style:none;padding:0}.tool-name[_ngcontent-%COMP%]{cursor:pointer;padding:11px;border-radius:8px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;color:var(--builder-text-primary-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.tool-name[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{visibility:hidden}.tool-name[_ngcontent-%COMP%]:hover button[_ngcontent-%COMP%]{visibility:visible}.tool-list-item-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px}.tools-chips-container[_ngcontent-%COMP%]{margin-top:12px;padding:0 4px}.tools-chips-container.callbacks-list[_ngcontent-%COMP%]{padding-right:0;padding-left:0}.callback-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;width:100%;cursor:pointer}.callback-remove[_ngcontent-%COMP%]{color:var(--builder-icon-color);cursor:pointer;width:32px;height:32px;min-width:32px;min-height:32px;display:inline-flex;align-items:center;justify-content:center;padding:0}.callback-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center;transform:translateY(.5px)}.back-button[_ngcontent-%COMP%]{margin-bottom:16px}.add-tool-button[_ngcontent-%COMP%]{width:100%;border:none;border-radius:4px;margin-top:12px;cursor:pointer}.add-tool-button-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.add-tool-button-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--builder-add-button-text-color);font-family:Google Sans;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.agent-tool-section[_ngcontent-%COMP%]{margin-top:16px;padding:16px;border:1px solid var(--builder-border-color);border-radius:8px}.agent-tool-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:16px;font-weight:500;margin:0 0 8px}.agent-tool-section[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;margin:0 0 16px;line-height:1.5}.agent-tool-section[_ngcontent-%COMP%] .create-agent-tool-btn[_ngcontent-%COMP%]{color:var(--builder-button-primary-text-color);font-weight:500}.no-callbacks-message[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:16px;margin-top:16px;text-align:center}.callback-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px}.callback-section[_ngcontent-%COMP%]{margin-top:16px}.callback-section[_ngcontent-%COMP%] .callback-section-label[_ngcontent-%COMP%]{margin:0 0 8px;color:var(--builder-text-secondary-color);font-size:14px;font-weight:500;text-transform:none}.callback-groups-wrapper[_ngcontent-%COMP%]{margin-top:16px}.callback-group[_ngcontent-%COMP%]{margin-top:5px}.callback-list[_ngcontent-%COMP%]{padding:8px 0}.no-callbacks-in-type[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;font-style:italic;padding:12px;text-align:center}.callback-item[_ngcontent-%COMP%]{cursor:pointer;padding:8px 12px;border-radius:4px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;color:var(--builder-text-primary-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.callback-item[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{visibility:hidden}.callback-item[_ngcontent-%COMP%]:hover button[_ngcontent-%COMP%]{visibility:visible}.add-callback-icon[_ngcontent-%COMP%]{color:var(--builder-button-primary-background-color)}mat-tab-group[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;padding:16px 20px 0;min-height:0}mat-tab-group[_ngcontent-%COMP%]{flex:1;padding-bottom:0;display:flex;flex-direction:column;overflow:hidden}.action-buttons[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;padding:16px 20px;border-top:1px solid var(--builder-border-color);flex-shrink:0;margin-top:auto}.action-buttons[_ngcontent-%COMP%] .save-button[_ngcontent-%COMP%]{color:var(--builder-button-primary-text-color);font-weight:500}.action-buttons[_ngcontent-%COMP%] .cancel-button[_ngcontent-%COMP%]{color:var(--builder-button-secondary-text-color);border:1px solid var(--builder-button-secondary-border-color)}.action-buttons[_ngcontent-%COMP%] .cancel-button[_ngcontent-%COMP%]:hover{color:var(--builder-button-secondary-hover-text-color)}.builder-panel-wrapper[_ngcontent-%COMP%]{border-bottom:1px solid var(--builder-border-color);padding:12px 24px}.panel-title[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color);font-family:Google Sans;font-size:16px;font-style:normal;font-weight:500;line-height:24px;display:flex;justify-content:space-between}.panel-title[_ngcontent-%COMP%] .panel-action-button[_ngcontent-%COMP%]{color:var(--builder-icon-color);width:32px;height:32px;min-width:32px;min-height:32px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;padding:0}.panel-title[_ngcontent-%COMP%] .panel-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center}.content-wrapper[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:9px}.drawer-logo[_ngcontent-%COMP%]{font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center}"],changeDetection:0})};var _I=new kA("MARKDOWN_COMPONENT");var ryA=["chatMessages"],syA=(t,e)=>({"user-message":t,"bot-message":e}),lyA=t=>({text:t,thought:!1});function gyA(t,e){t&1&&(B(0,"div",7)(1,"mat-icon",12),y(2,"smart_toy"),Q(),B(3,"h3"),y(4,"Assistant Ready"),Q(),B(5,"p"),y(6,"Your builder assistant is ready to help you build agents."),Q()())}function cyA(t,e){t&1&&(B(0,"div",15)(1,"span",16),y(2,"\u30FB\u30FB\u30FB"),Q()())}function CyA(t,e){if(t&1&&(B(0,"div",19),y(1),Q()),t&2){let A=p(3).$implicit;u(),lA(A.text)}}function IyA(t,e){if(t&1&&sn(0,20),t&2){let A=p(3).$implicit,i=p(2);H("ngComponentOutlet",i.markdownComponent)("ngComponentOutletInputs",Ks(2,lyA,A.text))}}function dyA(t,e){if(t&1&&(B(0,"div",18),y(1,"Assistant"),Q(),O(2,CyA,2,1,"div",19)(3,IyA,1,4,"ng-container",20)),t&2){let A=p(2).$implicit;u(2),Y(A.isError?2:3)}}function ByA(t,e){if(t&1&&(B(0,"div",17),y(1),Q()),t&2){let A=p(2).$implicit;u(),lA(A.text)}}function EyA(t,e){if(t&1&&O(0,dyA,4,1)(1,ByA,2,1,"div",17),t&2){let A=p().$implicit;Y(A.role==="bot"?0:1)}}function hyA(t,e){if(t&1&&(B(0,"div",13)(1,"mat-card",14),O(2,cyA,3,0,"div",15)(3,EyA,2,1),Q()()),t&2){let A=e.$implicit;H("ngClass",U0(2,syA,A.role==="user",A.role==="bot")),u(2),Y(A.isLoading?2:3)}}function QyA(t,e){if(t&1&&Ue(0,hyA,4,5,"div",13,ri),t&2){let A=p();Te(A.messages)}}var OD=class t{isVisible=!0;appName="";closePanel=new LA;reloadCanvas=new LA;assistantAppName="__adk_agent_builder_assistant";userId="user";currentSession="";userMessage="";messages=[];shouldAutoScroll=!1;isGenerating=!1;chatMessages;markdownComponent=w(_I);agentService=w($s);sessionService=w(Al);agentBuilderService=w(e0);constructor(){}ngOnInit(){this.sessionService.createSession(this.userId,this.assistantAppName).subscribe(e=>{this.currentSession=e.id;let A={appName:this.assistantAppName,userId:this.userId,sessionId:e.id,newMessage:{role:"user",parts:[{text:"hello"}]},streaming:!1,stateDelta:{root_directory:`${this.appName}/tmp/${this.appName}`}};this.messages.push({role:"bot",text:"",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0,this.agentService.runSse(A).subscribe({next:i=>lt(this,null,function*(){if(i.errorCode){let n=this.messages[this.messages.length-1];n.role==="bot"&&n.isLoading&&(n.text=`Error Code: ${i.errorCode}`,n.isLoading=!1,n.isError=!0,this.shouldAutoScroll=!0),this.isGenerating=!1;return}if(i.content){let n="";for(let o of i.content.parts)o.text&&(n+=o.text);if(n){let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text=n,o.isLoading=!1,this.shouldAutoScroll=!0)}}}),error:i=>{console.error("SSE error:",i);let n=this.messages[this.messages.length-1];n.role==="bot"&&n.isLoading&&(n.text="Sorry, I encountered an error. Please try again.",n.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})})}onClosePanel(){this.closePanel.emit()}sendMessage(e){if(e.trim()){this.saveAgent(this.appName),e!="____Something went wrong, please try again"&&this.messages.push({role:"user",text:e});let A=e;this.userMessage="",this.messages.push({role:"bot",text:"",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0;let i={appName:this.assistantAppName,userId:this.userId,sessionId:this.currentSession,newMessage:{role:"user",parts:[{text:A}]},streaming:!1};this.agentService.runSse(i).subscribe({next:n=>lt(this,null,function*(){if(n.errorCode){let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text=`Error Code: ${n.errorCode}`,o.isLoading=!1,o.isError=!0,this.shouldAutoScroll=!0),this.isGenerating=!1;return}if(n.content){let o="";for(let a of n.content.parts)a.text&&(o+=a.text);if(o){let a=this.messages[this.messages.length-1];a.role==="bot"&&a.isLoading&&(a.text=o,a.isLoading=!1,this.shouldAutoScroll=!0,this.reloadCanvas.emit())}}}),error:n=>{console.error("SSE error:",n);let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text="Sorry, I encountered an error. Please try again.",o.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})}}ngAfterViewChecked(){this.shouldAutoScroll&&(this.scrollToBottom(),this.shouldAutoScroll=!1)}scrollToBottom(){try{this.chatMessages&&setTimeout(()=>{this.chatMessages.nativeElement.scrollTop=this.chatMessages.nativeElement.scrollHeight},50)}catch(e){console.error("Error scrolling to bottom:",e)}}onKeyDown(e){if(e.key==="Enter"){if(e.shiftKey)return;this.userMessage?.trim()&&this.currentSession&&(e.preventDefault(),this.sendMessage(this.userMessage))}}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A)return;let i=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();s0.generateYamlFile(A,i,e,n),this.agentService.agentBuildTmp(i).subscribe(o=>{console.log(o?"save to tmp":"something went wrong")})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-builder-assistant"]],viewQuery:function(A,i){if(A&1&&Jt(ryA,5),A&2){let n;ae(n=re())&&(i.chatMessages=n.first)}},inputs:{isVisible:"isVisible",appName:"appName"},outputs:{closePanel:"closePanel",reloadCanvas:"reloadCanvas"},decls:21,vars:6,consts:[["chatMessages",""],[1,"builder-assistant-panel"],[1,"panel-header"],[1,"panel-title"],["mat-icon-button","","matTooltip","Close assistant panel",1,"close-btn",3,"click"],[1,"panel-content"],[1,"chat-messages"],[1,"assistant-placeholder"],[1,"chat-input-container"],[1,"input-wrapper"],["cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","5","placeholder","Ask Gemini to build your agent",1,"assistant-input-box",3,"ngModelChange","keydown","ngModel","disabled"],["mat-icon-button","","matTooltip","Send message",1,"send-button",3,"click","disabled"],[1,"large-icon"],[3,"ngClass"],[1,"message-card"],[1,"loading-message"],[1,"dots"],[1,"message-text"],[1,"bot-label"],[1,"error-message"],[3,"ngComponentOutlet","ngComponentOutletInputs"]],template:function(A,i){if(A&1){let n=QA();B(0,"div",1)(1,"div",2)(2,"div",3)(3,"mat-icon"),y(4,"auto_awesome"),Q(),B(5,"span"),y(6,"Assistant"),Q()(),B(7,"button",4),U("click",function(){return i.onClosePanel()}),B(8,"mat-icon"),y(9,"close"),Q()()(),B(10,"div",5)(11,"div",6,0),O(13,gyA,7,0,"div",7)(14,QyA,2,0),Q(),B(15,"div",8)(16,"div",9)(17,"textarea",10),Di("ngModelChange",function(a){return T(n),Bi(i.userMessage,a)||(i.userMessage=a),J(a)}),U("keydown",function(a){return i.onKeyDown(a)}),Q(),B(18,"button",11),U("click",function(){return i.sendMessage(i.userMessage.trim())}),B(19,"mat-icon"),y(20,"send"),Q()()()()()()}A&2&&(RA("hidden",!i.isVisible),u(13),Y(i.messages.length===0?13:14),u(4),wi("ngModel",i.userMessage),H("disabled",i.isGenerating),u(),H("disabled",!i.userMessage.trim()||i.isGenerating))},dependencies:[li,zl,Tc,ln,Dn,yn,ko,Wt,ji,dn,Nm,lB,_p],styles:[".builder-assistant-panel[_ngcontent-%COMP%]{position:fixed;right:0;top:72px;width:400px;height:calc(100vh - 72px);background-color:var(--mat-sys-surface-container);border-left:1px solid var(--mat-sys-outline-variant);box-shadow:-2px 0 10px #0006;display:flex;flex-direction:column;transition:transform .3s ease}.builder-assistant-panel.hidden[_ngcontent-%COMP%]{transform:translate(100%)}.panel-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mat-sys-outline-variant)}.panel-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-weight:400;font-size:16px;color:var(--mat-sys-on-surface);font-family:Google Sans,Helvetica Neue,sans-serif}.panel-title[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);font-size:20px;width:20px;height:20px}.close-btn[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)}.close-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.panel-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden}.assistant-placeholder[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;height:300px;color:var(--mat-sys-on-surface-variant)}.assistant-placeholder[_ngcontent-%COMP%] .large-icon[_ngcontent-%COMP%]{font-size:64px;width:64px;height:64px;margin-bottom:16px;color:var(--mat-sys-primary)}.assistant-placeholder[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0 0 8px;font-size:20px;font-weight:500;color:var(--mat-sys-on-surface);font-family:Google Sans,Helvetica Neue,sans-serif}.assistant-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5;color:var(--mat-sys-on-surface-variant)}.chat-messages[_ngcontent-%COMP%]{flex:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column}.chat-input-container[_ngcontent-%COMP%]{padding:16px 20px 20px;border-top:none}.input-wrapper[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:50px;padding:10px 6px 10px 18px;gap:8px}.assistant-input-box[_ngcontent-%COMP%]{flex:1;color:var(--mat-sys-on-surface);background-color:transparent;border:none;padding:0;resize:none;overflow:hidden;font-family:Google Sans,Helvetica Neue,sans-serif;font-size:14px;line-height:20px;min-height:20px;max-height:120px}.assistant-input-box[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant);font-size:14px}.assistant-input-box[_ngcontent-%COMP%]:focus{outline:none}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar{width:4px}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background-color:var(--mat-sys-outline);border-radius:4px}.send-button[_ngcontent-%COMP%]{color:var(--mat-sys-primary);width:36px;height:36px;min-width:36px;flex-shrink:0;margin:0;padding:0}.send-button[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-outline)}.send-button[_ngcontent-%COMP%]:hover:not(:disabled){color:var(--mat-sys-primary);border-radius:50%}.send-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.message-card[_ngcontent-%COMP%]{padding:10px 16px;margin:6px 0;font-size:14px;font-weight:400;position:relative;display:block;box-shadow:none;line-height:1.5;width:100%}.user-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:12px}.user-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{border:1px solid var(--mat-sys-outline-variant);border-radius:4px;color:var(--mat-sys-on-surface);padding:8px 12px}.bot-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:0}.bot-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{border:none;border-radius:0;color:var(--mat-sys-on-surface);padding:0;margin:0}.bot-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;font-family:Google Sans,Helvetica Neue,sans-serif}.error-message[_ngcontent-%COMP%]{color:var(--mat-app-warn, #d32f2f);font-family:Google Sans,Helvetica Neue,sans-serif;font-size:14px;white-space:pre-line;word-break:break-word;padding:8px 12px}.message-text[_ngcontent-%COMP%]{white-space:pre-line;word-break:break-word;overflow-wrap:break-word;font-family:Google Sans,Helvetica Neue,sans-serif}.message-text[_ngcontent-%COMP%] p{margin:0;line-height:1.4}.message-text[_ngcontent-%COMP%] p:first-child{margin-top:0}.message-text[_ngcontent-%COMP%] p:last-child{margin-bottom:0}.message-text[_ngcontent-%COMP%] ul, .message-text[_ngcontent-%COMP%] ol{margin:0;padding-left:1.5em}.message-text[_ngcontent-%COMP%] li{margin:0}.message-text[_ngcontent-%COMP%] code{padding:2px 4px;border-radius:3px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.9em}.message-text[_ngcontent-%COMP%] pre{padding:8px 12px;border-radius:6px;overflow-x:auto;margin:.5em 0}.message-text[_ngcontent-%COMP%] pre code{padding:0}.message-text[_ngcontent-%COMP%] blockquote{border-left:3px solid var(--mat-sys-primary);padding-left:12px;margin:.5em 0;font-style:italic;color:var(--mat-sys-on-surface-variant)}.message-text[_ngcontent-%COMP%] strong{font-weight:600}.message-text[_ngcontent-%COMP%] em{font-style:italic}.loading-message[_ngcontent-%COMP%]{display:flex;align-items:center;color:var(--mat-sys-on-surface-variant);font-family:Google Sans,Helvetica Neue,sans-serif;padding:0;margin:0}.loading-message[_ngcontent-%COMP%] .dots[_ngcontent-%COMP%]{font-size:24px;letter-spacing:-12px;animation:_ngcontent-%COMP%_pulse 1.4s ease-in-out infinite;display:inline-block;line-height:1}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:.3}50%{opacity:1}}"]})};var eQ=class t{constructor(e,A){this.http=e;this.zone=A}apiServerDomain=Dr.getApiServerBaseUrl();_currentApp=new ei("");currentApp=this._currentApp.asObservable();isLoading=new ei(!1);getApp(){return this.currentApp}setApp(e){this._currentApp.next(e)}getLoadingState(){return this.isLoading}runSse(e){let A=this.apiServerDomain+"/run_sse";return this.isLoading.next(!0),new vi(i=>{let n=this;fetch(A,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream"},body:JSON.stringify(e)}).then(o=>{let a=o.body?.getReader(),r=new TextDecoder("utf-8"),s="",l=()=>{a?.read().then(({done:g,value:C})=>{if(this.isLoading.next(!0),g)return this.isLoading.next(!1),i.complete();let I=r.decode(C,{stream:!0});s+=I;try{s.split(/\r?\n/).filter(h=>h.startsWith("data:")).forEach(h=>{let E=h.replace(/^data:\s*/,""),f=JSON.parse(E);n.zone.run(()=>i.next(f))}),s=""}catch(d){d instanceof SyntaxError&&l()}l()}).catch(g=>{n.zone.run(()=>i.error(g))})};l()}).catch(o=>{n.zone.run(()=>i.error(o))})})}listApps(){if(this.apiServerDomain!=null){let e=this.apiServerDomain+"/list-apps?relative_path=./";return this.http.get(e)}return new vi}getVersion(){if(this.apiServerDomain!=null){let e=this.apiServerDomain+"/version";return this.http.get(e)}return new vi}agentBuild(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+"/builder/save";return this.http.post(A,e)}return new vi}agentBuildTmp(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+"/builder/save?tmp=true";return this.http.post(A,e)}return new vi}getAgentBuilder(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/builder/app/${e}?ts=${Date.now()}`;return this.http.get(A,{responseType:"text"})}return new vi}getAgentBuilderTmp(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/builder/app/${e}?ts=${Date.now()}&tmp=true`;return this.http.get(A,{responseType:"text"})}return new vi}getSubAgentBuilder(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/builder/app/${e}?ts=${Date.now()}&file_path=${A}&tmp=true`;return this.http.get(i,{responseType:"text"})}return new vi}agentChangeCancel(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/builder/app/${e}/cancel`;return this.http.post(A,{})}return new vi}getAppInfo(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/build_graph/${e}`;return this.http.get(A)}return new vi}getAppGraphImage(e,A,i){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/dev/build_graph_image/${e}`,o={dark_mode:A};return i&&(o.node=i),this.http.get(n,{params:o})}return new vi}static \u0275fac=function(A){return new(A||t)(Lo(fr),Lo(qe))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var YD="http://www.w3.org/1999/xhtml",rN={svg:"http://www.w3.org/2000/svg",xhtml:YD,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function YC(t){var e=t+="",A=e.indexOf(":");return A>=0&&(e=t.slice(0,A))!=="xmlns"&&(t=t.slice(A+1)),rN.hasOwnProperty(e)?{space:rN[e],local:t}:t}function fyA(t){return function(){var e=this.ownerDocument,A=this.namespaceURI;return A===YD&&e.documentElement.namespaceURI===YD?e.createElement(t):e.createElementNS(A,t)}}function pyA(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function HD(t){var e=YC(t);return(e.local?pyA:fyA)(e)}function myA(){}function xd(t){return t==null?myA:function(){return this.querySelector(t)}}function CAA(t){typeof t!="function"&&(t=xd(t));for(var e=this._groups,A=e.length,i=new Array(A),n=0;n=k&&(k=v+1);!(b=f[k])&&++k=0;)(a=i[n])&&(o&&a.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(a,o),o=a);return this}function DAA(t){t||(t=FyA);function e(C,I){return C&&I?t(C.__data__,I.__data__):!C-!I}for(var A=this._groups,i=A.length,n=new Array(i),o=0;oe?1:t>=e?0:NaN}function yAA(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function vAA(){return Array.from(this)}function bAA(){for(var t=this._groups,e=0,A=t.length;e1?this.each((e==null?OyA:typeof e=="function"?HyA:YyA)(t,e,A??"")):RI(this.node(),t)}function RI(t,e){return t.style.getPropertyValue(e)||jD(t).getComputedStyle(t,null).getPropertyValue(e)}function zyA(t){return function(){delete this[t]}}function PyA(t,e){return function(){this[t]=e}}function jyA(t,e){return function(){var A=e.apply(this,arguments);A==null?delete this[t]:this[t]=A}}function RAA(t,e){return arguments.length>1?this.each((e==null?zyA:typeof e=="function"?jyA:PyA)(t,e)):this.node()[t]}function NAA(t){return t.trim().split(/^|\s+/)}function lN(t){return t.classList||new FAA(t)}function FAA(t){this._node=t,this._names=NAA(t.getAttribute("class")||"")}FAA.prototype={add:function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function LAA(t,e){for(var A=lN(t),i=-1,n=e.length;++i=0&&(A=e.slice(i+1),e=e.slice(0,i)),{type:e,name:A}})}function cvA(t){return function(){var e=this.__on;if(e){for(var A=0,i=-1,n=e.length,o;A{}};function eeA(){for(var t=0,e=arguments.length,A={},i;t=0&&(i=A.slice(n+1),A=A.slice(0,n)),A&&!e.hasOwnProperty(A))throw new Error("unknown type: "+A);return{type:A,name:i}})}qD.prototype=eeA.prototype={constructor:qD,on:function(t,e){var A=this._,i=hvA(t+"",A),n,o=-1,a=i.length;if(arguments.length<2){for(;++o0)for(var A=new Array(n),i=0,n,o;i()=>t;function l3(t,{sourceEvent:e,subject:A,target:i,identifier:n,active:o,x:a,y:r,dx:s,dy:l,dispatch:g}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:A,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},identifier:{value:n,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:r,enumerable:!0,configurable:!0},dx:{value:s,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:g}})}l3.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function uvA(t){return!t.ctrlKey&&!t.button}function fvA(){return this.parentNode}function pvA(t,e){return e??{x:t.x,y:t.y}}function mvA(){return navigator.maxTouchPoints||"ontouchstart"in this}function WD(){var t=uvA,e=fvA,A=pvA,i=mvA,n={},o=_d("start","drag","end"),a=0,r,s,l,g,C=0;function I(S){S.on("mousedown.drag",d).filter(i).on("touchstart.drag",f).on("touchmove.drag",m,teA).on("touchend.drag touchcancel.drag",v).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(S,b){if(!(g||!t.call(this,S,b))){var x=k(this,e.call(this,S,b),S,b,"mouse");x&&(Nr(S.view).on("mousemove.drag",h,Rd).on("mouseup.drag",E,Rd),a3(S.view),VD(S),l=!1,r=S.clientX,s=S.clientY,x("start",S))}}function h(S){if(NI(S),!l){var b=S.clientX-r,x=S.clientY-s;l=b*b+x*x>C}n.mouse("drag",S)}function E(S){Nr(S.view).on("mousemove.drag mouseup.drag",null),r3(S.view,l),NI(S),n.mouse("end",S)}function f(S,b){if(t.call(this,S,b)){var x=S.changedTouches,F=e.call(this,S,b),z=x.length,P,Z;for(P=0;P>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):A===8?XD(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):A===4?XD(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=DvA.exec(t))?new hl(e[1],e[2],e[3],1):(e=yvA.exec(t))?new hl(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=vvA.exec(t))?XD(e[1],e[2],e[3],e[4]):(e=bvA.exec(t))?XD(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=MvA.exec(t))?leA(e[1],e[2]/100,e[3]/100,1):(e=SvA.exec(t))?leA(e[1],e[2]/100,e[3]/100,e[4]):ieA.hasOwnProperty(t)?aeA(ieA[t]):t==="transparent"?new hl(NaN,NaN,NaN,0):null}function aeA(t){return new hl(t>>16&255,t>>8&255,t&255,1)}function XD(t,e,A,i){return i<=0&&(t=e=A=NaN),new hl(t,e,A,i)}function _vA(t){return t instanceof C3||(t=FI(t)),t?(t=t.rgb(),new hl(t.r,t.g,t.b,t.opacity)):new hl}function iQ(t,e,A,i){return arguments.length===1?_vA(t):new hl(t,e,A,i??1)}function hl(t,e,A,i){this.r=+t,this.g=+e,this.b=+A,this.opacity=+i}ZD(hl,iQ,cN(C3,{brighter(t){return t=t==null?Ay:Math.pow(Ay,t),new hl(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?g3:Math.pow(g3,t),new hl(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new hl(Fd(this.r),Fd(this.g),Fd(this.b),ey(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:reA,formatHex:reA,formatHex8:RvA,formatRgb:seA,toString:seA}));function reA(){return`#${Nd(this.r)}${Nd(this.g)}${Nd(this.b)}`}function RvA(){return`#${Nd(this.r)}${Nd(this.g)}${Nd(this.b)}${Nd((isNaN(this.opacity)?1:this.opacity)*255)}`}function seA(){let t=ey(this.opacity);return`${t===1?"rgb(":"rgba("}${Fd(this.r)}, ${Fd(this.g)}, ${Fd(this.b)}${t===1?")":`, ${t})`}`}function ey(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Fd(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Nd(t){return t=Fd(t),(t<16?"0":"")+t.toString(16)}function leA(t,e,A,i){return i<=0?t=e=A=NaN:A<=0||A>=1?t=e=NaN:e<=0&&(t=NaN),new bc(t,e,A,i)}function ceA(t){if(t instanceof bc)return new bc(t.h,t.s,t.l,t.opacity);if(t instanceof C3||(t=FI(t)),!t)return new bc;if(t instanceof bc)return t;t=t.rgb();var e=t.r/255,A=t.g/255,i=t.b/255,n=Math.min(e,A,i),o=Math.max(e,A,i),a=NaN,r=o-n,s=(o+n)/2;return r?(e===o?a=(A-i)/r+(A0&&s<1?0:a,new bc(a,r,s,t.opacity)}function CeA(t,e,A,i){return arguments.length===1?ceA(t):new bc(t,e,A,i??1)}function bc(t,e,A,i){this.h=+t,this.s=+e,this.l=+A,this.opacity=+i}ZD(bc,CeA,cN(C3,{brighter(t){return t=t==null?Ay:Math.pow(Ay,t),new bc(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?g3:Math.pow(g3,t),new bc(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,A=this.l,i=A+(A<.5?A:1-A)*e,n=2*A-i;return new hl(CN(t>=240?t-240:t+120,n,i),CN(t,n,i),CN(t<120?t+240:t-120,n,i),this.opacity)},clamp(){return new bc(geA(this.h),$D(this.s),$D(this.l),ey(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=ey(this.opacity);return`${t===1?"hsl(":"hsla("}${geA(this.h)}, ${$D(this.s)*100}%, ${$D(this.l)*100}%${t===1?")":`, ${t})`}`}}));function geA(t){return t=(t||0)%360,t<0?t+360:t}function $D(t){return Math.max(0,Math.min(1,t||0))}function CN(t,e,A){return(t<60?e+(A-e)*t/60:t<180?A:t<240?e+(A-e)*(240-t)/60:e)*255}function IN(t,e,A,i,n){var o=t*t,a=o*t;return((1-3*t+3*o-a)*e+(4-6*o+3*a)*A+(1+3*t+3*o-3*a)*i+a*n)/6}function IeA(t){var e=t.length-1;return function(A){var i=A<=0?A=0:A>=1?(A=1,e-1):Math.floor(A*e),n=t[i],o=t[i+1],a=i>0?t[i-1]:2*n-o,r=i()=>t;function NvA(t,e){return function(A){return t+A*e}}function FvA(t,e,A){return t=Math.pow(t,A),e=Math.pow(e,A)-t,A=1/A,function(i){return Math.pow(t+i*e,A)}}function BeA(t){return(t=+t)==1?ty:function(e,A){return A-e?FvA(e,A,t):dN(isNaN(e)?A:e)}}function ty(t,e){var A=e-t;return A?NvA(t,A):dN(isNaN(t)?e:t)}var iy=(function t(e){var A=BeA(e);function i(n,o){var a=A((n=iQ(n)).r,(o=iQ(o)).r),r=A(n.g,o.g),s=A(n.b,o.b),l=ty(n.opacity,o.opacity);return function(g){return n.r=a(g),n.g=r(g),n.b=s(g),n.opacity=l(g),n+""}}return i.gamma=t,i})(1);function EeA(t){return function(e){var A=e.length,i=new Array(A),n=new Array(A),o=new Array(A),a,r;for(a=0;aA&&(o=e.slice(A,o),r[a]?r[a]+=o:r[++a]=o),(i=i[0])===(n=n[0])?r[a]?r[a]+=n:r[++a]=n:(r[++a]=null,s.push({i:a,x:vg(i,n)})),A=BN.lastIndex;return A180?g+=360:g-l>180&&(l+=360),I.push({i:C.push(n(C)+"rotate(",null,i)-2,x:vg(l,g)})):g&&C.push(n(C)+"rotate("+g+i)}function r(l,g,C,I){l!==g?I.push({i:C.push(n(C)+"skewX(",null,i)-2,x:vg(l,g)}):g&&C.push(n(C)+"skewX("+g+i)}function s(l,g,C,I,d,h){if(l!==C||g!==I){var E=d.push(n(d)+"scale(",null,",",null,")");h.push({i:E-4,x:vg(l,C)},{i:E-2,x:vg(g,I)})}else(C!==1||I!==1)&&d.push(n(d)+"scale("+C+","+I+")")}return function(l,g){var C=[],I=[];return l=t(l),g=t(g),o(l.translateX,l.translateY,g.translateX,g.translateY,C,I),a(l.rotate,g.rotate,C,I),r(l.skewX,g.skewX,C,I),s(l.scaleX,l.scaleY,g.scaleX,g.scaleY,C,I),l=g=null,function(d){for(var h=-1,E=I.length,f;++h=0&&t._call.call(void 0,e),t=t._next;--nQ}function meA(){Ld=(ry=E3.now())+sy,nQ=d3=0;try{yeA()}finally{nQ=0,zvA(),Ld=0}}function HvA(){var t=E3.now(),e=t-ry;e>weA&&(sy-=e,ry=t)}function zvA(){for(var t,e=ay,A,i=1/0;e;)e._call?(i>e._time&&(i=e._time),t=e,e=e._next):(A=e._next,e._next=null,e=t?t._next=A:ay=A);B3=t,mN(i)}function mN(t){if(!nQ){d3&&(d3=clearTimeout(d3));var e=t-Ld;e>24?(t<1/0&&(d3=setTimeout(meA,t-E3.now()-sy)),I3&&(I3=clearInterval(I3))):(I3||(ry=E3.now(),I3=setInterval(HvA,weA)),nQ=1,DeA(meA))}}function gy(t,e,A){var i=new h3;return e=e==null?0:+e,i.restart(n=>{i.stop(),t(n+e)},e,A),i}var PvA=_d("start","end","cancel","interrupt"),jvA=[],MeA=0,veA=1,Cy=2,cy=3,beA=4,Iy=5,u3=6;function LI(t,e,A,i,n,o){var a=t.__transition;if(!a)t.__transition={};else if(A in a)return;qvA(t,A,{name:e,index:i,group:n,on:PvA,tween:jvA,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:MeA})}function f3(t,e){var A=Br(t,e);if(A.state>MeA)throw new Error("too late; already scheduled");return A}function es(t,e){var A=Br(t,e);if(A.state>cy)throw new Error("too late; already running");return A}function Br(t,e){var A=t.__transition;if(!A||!(A=A[e]))throw new Error("transition not found");return A}function qvA(t,e,A){var i=t.__transition,n;i[e]=A,A.timer=ly(o,0,A.time);function o(l){A.state=veA,A.timer.restart(a,A.delay,A.time),A.delay<=l&&a(l-A.delay)}function a(l){var g,C,I,d;if(A.state!==veA)return s();for(g in i)if(d=i[g],d.name===A.name){if(d.state===cy)return gy(a);d.state===beA?(d.state=u3,d.timer.stop(),d.on.call("interrupt",t,t.__data__,d.index,d.group),delete i[g]):+gCy&&i.state=0&&(e=e.slice(0,A)),!e||e==="start"})}function dbA(t,e,A){var i,n,o=IbA(e)?f3:es;return function(){var a=o(this,t),r=a.on;r!==i&&(n=(i=r).copy()).on(e,A),a.on=n}}function UeA(t,e){var A=this._id;return arguments.length<2?Br(this.node(),A).on.on(t):this.each(dbA(A,t,e))}function BbA(t){return function(){var e=this.parentNode;for(var A in this.__transition)if(+A!==t)return;e&&e.removeChild(this)}}function TeA(){return this.on("end.remove",BbA(this._id))}function JeA(t){var e=this._name,A=this._id;typeof t!="function"&&(t=xd(t));for(var i=this._groups,n=i.length,o=new Array(n),a=0;a()=>t;function wN(t,{sourceEvent:e,target:A,transform:i,dispatch:n}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:A,enumerable:!0,configurable:!0},transform:{value:i,enumerable:!0,configurable:!0},_:{value:n}})}function Mc(t,e,A){this.k=t,this.x=e,this.y=A}Mc.prototype={constructor:Mc,scale:function(t){return t===1?this:new Mc(this.k*t,this.x,this.y)},translate:function(t,e){return t===0&e===0?this:new Mc(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var GI=new Mc(1,0,0);DN.prototype=Mc.prototype;function DN(t){for(;!t.__zoom;)if(!(t=t.parentNode))return GI;return t.__zoom}function hy(t){t.stopImmediatePropagation()}function aQ(t){t.preventDefault(),t.stopImmediatePropagation()}function kbA(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function xbA(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function $eA(){return this.__zoom||GI}function _bA(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function RbA(){return navigator.maxTouchPoints||"ontouchstart"in this}function NbA(t,e,A){var i=t.invertX(e[0][0])-A[0][0],n=t.invertX(e[1][0])-A[1][0],o=t.invertY(e[0][1])-A[0][1],a=t.invertY(e[1][1])-A[1][1];return t.translate(n>i?(i+n)/2:Math.min(0,i)||Math.max(0,n),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}function yN(){var t=kbA,e=xbA,A=NbA,i=_bA,n=RbA,o=[0,1/0],a=[[-1/0,-1/0],[1/0,1/0]],r=250,s=pN,l=_d("start","zoom","end"),g,C,I,d=500,h=150,E=0,f=10;function m(X){X.property("__zoom",$eA).on("wheel.zoom",z,{passive:!1}).on("mousedown.zoom",P).on("dblclick.zoom",Z).filter(n).on("touchstart.zoom",tA).on("touchmove.zoom",W).on("touchend.zoom touchcancel.zoom",BA).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}m.transform=function(X,iA,AA,IA){var aA=X.selection?X.selection():X;aA.property("__zoom",$eA),X!==aA?b(X,iA,AA,IA):aA.interrupt().each(function(){x(this,arguments).event(IA).start().zoom(null,typeof iA=="function"?iA.apply(this,arguments):iA).end()})},m.scaleBy=function(X,iA,AA,IA){m.scaleTo(X,function(){var aA=this.__zoom.k,rA=typeof iA=="function"?iA.apply(this,arguments):iA;return aA*rA},AA,IA)},m.scaleTo=function(X,iA,AA,IA){m.transform(X,function(){var aA=e.apply(this,arguments),rA=this.__zoom,uA=AA==null?S(aA):typeof AA=="function"?AA.apply(this,arguments):AA,UA=rA.invert(uA),$A=typeof iA=="function"?iA.apply(this,arguments):iA;return A(k(v(rA,$A),uA,UA),aA,a)},AA,IA)},m.translateBy=function(X,iA,AA,IA){m.transform(X,function(){return A(this.__zoom.translate(typeof iA=="function"?iA.apply(this,arguments):iA,typeof AA=="function"?AA.apply(this,arguments):AA),e.apply(this,arguments),a)},null,IA)},m.translateTo=function(X,iA,AA,IA,aA){m.transform(X,function(){var rA=e.apply(this,arguments),uA=this.__zoom,UA=IA==null?S(rA):typeof IA=="function"?IA.apply(this,arguments):IA;return A(GI.translate(UA[0],UA[1]).scale(uA.k).translate(typeof iA=="function"?-iA.apply(this,arguments):-iA,typeof AA=="function"?-AA.apply(this,arguments):-AA),rA,a)},IA,aA)};function v(X,iA){return iA=Math.max(o[0],Math.min(o[1],iA)),iA===X.k?X:new Mc(iA,X.x,X.y)}function k(X,iA,AA){var IA=iA[0]-AA[0]*X.k,aA=iA[1]-AA[1]*X.k;return IA===X.x&&aA===X.y?X:new Mc(X.k,IA,aA)}function S(X){return[(+X[0][0]+ +X[1][0])/2,(+X[0][1]+ +X[1][1])/2]}function b(X,iA,AA,IA){X.on("start.zoom",function(){x(this,arguments).event(IA).start()}).on("interrupt.zoom end.zoom",function(){x(this,arguments).event(IA).end()}).tween("zoom",function(){var aA=this,rA=arguments,uA=x(aA,rA).event(IA),UA=e.apply(aA,rA),$A=AA==null?S(UA):typeof AA=="function"?AA.apply(aA,rA):AA,zA=Math.max(UA[1][0]-UA[0][0],UA[1][1]-UA[0][1]),pA=aA.__zoom,PA=typeof iA=="function"?iA.apply(aA,rA):iA,Je=s(pA.invert($A).concat(zA/pA.k),PA.invert($A).concat(zA/PA.k));return function(_e){if(_e===1)_e=PA;else{var YA=Je(_e),fA=zA/YA[2];_e=new Mc(fA,$A[0]-YA[0]*fA,$A[1]-YA[1]*fA)}uA.zoom(null,_e)}})}function x(X,iA,AA){return!AA&&X.__zooming||new F(X,iA)}function F(X,iA){this.that=X,this.args=iA,this.active=0,this.sourceEvent=null,this.extent=e.apply(X,iA),this.taps=0}F.prototype={event:function(X){return X&&(this.sourceEvent=X),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(X,iA){return this.mouse&&X!=="mouse"&&(this.mouse[1]=iA.invert(this.mouse[0])),this.touch0&&X!=="touch"&&(this.touch0[1]=iA.invert(this.touch0[0])),this.touch1&&X!=="touch"&&(this.touch1[1]=iA.invert(this.touch1[0])),this.that.__zoom=iA,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(X){var iA=Nr(this.that).datum();l.call(X,this.that,new wN(X,{sourceEvent:this.sourceEvent,target:m,type:X,transform:this.that.__zoom,dispatch:l}),iA)}};function z(X,...iA){if(!t.apply(this,arguments))return;var AA=x(this,iA).event(X),IA=this.__zoom,aA=Math.max(o[0],Math.min(o[1],IA.k*Math.pow(2,i.apply(this,arguments)))),rA=yg(X);if(AA.wheel)(AA.mouse[0][0]!==rA[0]||AA.mouse[0][1]!==rA[1])&&(AA.mouse[1]=IA.invert(AA.mouse[0]=rA)),clearTimeout(AA.wheel);else{if(IA.k===aA)return;AA.mouse=[rA,IA.invert(rA)],Gd(this),AA.start()}aQ(X),AA.wheel=setTimeout(uA,h),AA.zoom("mouse",A(k(v(IA,aA),AA.mouse[0],AA.mouse[1]),AA.extent,a));function uA(){AA.wheel=null,AA.end()}}function P(X,...iA){if(I||!t.apply(this,arguments))return;var AA=X.currentTarget,IA=x(this,iA,!0).event(X),aA=Nr(X.view).on("mousemove.zoom",$A,!0).on("mouseup.zoom",zA,!0),rA=yg(X,AA),uA=X.clientX,UA=X.clientY;a3(X.view),hy(X),IA.mouse=[rA,this.__zoom.invert(rA)],Gd(this),IA.start();function $A(pA){if(aQ(pA),!IA.moved){var PA=pA.clientX-uA,Je=pA.clientY-UA;IA.moved=PA*PA+Je*Je>E}IA.event(pA).zoom("mouse",A(k(IA.that.__zoom,IA.mouse[0]=yg(pA,AA),IA.mouse[1]),IA.extent,a))}function zA(pA){aA.on("mousemove.zoom mouseup.zoom",null),r3(pA.view,IA.moved),aQ(pA),IA.event(pA).end()}}function Z(X,...iA){if(t.apply(this,arguments)){var AA=this.__zoom,IA=yg(X.changedTouches?X.changedTouches[0]:X,this),aA=AA.invert(IA),rA=AA.k*(X.shiftKey?.5:2),uA=A(k(v(AA,rA),IA,aA),e.apply(this,iA),a);aQ(X),r>0?Nr(this).transition().duration(r).call(b,uA,IA,X):Nr(this).call(m.transform,uA,IA,X)}}function tA(X,...iA){if(t.apply(this,arguments)){var AA=X.touches,IA=AA.length,aA=x(this,iA,X.changedTouches.length===IA).event(X),rA,uA,UA,$A;for(hy(X),uA=0;uA{let A=Math.max(0,Math.min(t.x+t.width,e.x+e.width)-Math.max(t.x,e.x)),i=Math.max(0,Math.min(t.y+t.height,e.y+e.height)-Math.max(t.y,e.y));return Math.ceil(A*i)};function dtA(t){if(t.length===0)return{x:0,y:0,width:0,height:0};let e={x:1/0,y:1/0,x2:-1/0,y2:-1/0};return t.forEach(A=>{let i=iMA(A);e=oMA(e,i)}),nMA(e)}function tMA(t,e,A){let i=e.find(o=>o.rawNode.id===t);if(!i)return[];let n=uy(i);return e.filter(o=>{if(o.rawNode.id===t)return!1;let a=eMA(uy(o),n);return A?.partially?a>0:a>=n.width*n.height})}function iMA(t){return{x:t.point().x,y:t.point().y,x2:t.point().x+t.size().width,y2:t.point().y+t.size().height}}function uy(t){return{x:t.globalPoint().x,y:t.globalPoint().y,width:t.width(),height:t.height()}}function nMA({x:t,y:e,x2:A,y2:i}){return{x:t,y:e,width:A-t,height:i-e}}function oMA(t,e){return{x:Math.min(t.x,e.x),y:Math.min(t.y,e.y),x2:Math.max(t.x2,e.x2),y2:Math.max(t.y2,e.y2)}}var fy=class{constructor(e){this.settings=e,this.curve=e.curve??"bezier",this.type=e.type??"default",this.mode=e.mode??"strict";let A=this.getValidators(e);this.validator=i=>A.every(n=>n(i))}getValidators(e){let A=[];return A.push(aMA),this.mode==="loose"&&A.push(rMA),e.validator&&A.push(e.validator),A}},aMA=t=>t.source!==t.target,rMA=t=>t.sourceHandle!==void 0&&t.targetHandle!==void 0;function sQ(t){return t.split("").reduce((e,A)=>(e=(e<<5)-e+A.charCodeAt(0),e&e),0)}var ul=(()=>{class t{constructor(){this.nodes=bA([],{equal:(A,i)=>!A.length&&!i.length?!0:A===i}),this.rawNodes=pe(()=>this.nodes().map(A=>A.rawNode)),this.edges=bA([],{equal:(A,i)=>!A.length&&!i.length?!0:A===i}),this.rawEdges=pe(()=>this.edges().map(A=>A.edge)),this.validEdges=pe(()=>{let A=this.nodes();return this.edges().filter(i=>A.includes(i.source())&&A.includes(i.target()))}),this.connection=bA(new fy({})),this.markers=pe(()=>{let A=new Map;this.validEdges().forEach(n=>{if(n.edge.markers?.start){let o=sQ(JSON.stringify(n.edge.markers.start));A.set(o,n.edge.markers.start)}if(n.edge.markers?.end){let o=sQ(JSON.stringify(n.edge.markers.end));A.set(o,n.edge.markers.end)}});let i=this.connection().settings.marker;if(i){let n=sQ(JSON.stringify(i));A.set(n,i)}return A}),this.entities=pe(()=>[...this.nodes(),...this.edges()]),this.minimap=bA(null)}getNode(A){return this.nodes().find(({rawNode:i})=>i.id===A)}getDetachedEdges(){return this.edges().filter(A=>A.detached())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function sMA(t,e,A,i,n,o){let a=e/(t.width*(1+o)),r=A/(t.height*(1+o)),s=Math.min(a,r),l=lMA(s,i,n),g=t.x+t.width/2,C=t.y+t.height/2,I=e/2-g*l,d=A/2-C*l;return{x:I,y:d,zoom:l}}function lMA(t,e=0,A=1){return Math.min(Math.max(t,e),A)}function gMA(t,e,A){let i=t.zoom;return{x:-t.x/i,y:-t.y/i,width:e/i,height:A/i}}function cMA(t,e,A,i){let n=gMA(e,A,i);return!(t.x+t.widthn.x+n.width||t.y+t.heightn.y+n.height)}var CMA={detachedGroupsLayer:!1,virtualization:!1,virtualizationZoomThreshold:.5,lazyLoadTrigger:"immediate"},ts=(()=>{class t{constructor(){this.entitiesSelectable=bA(!0),this.elevateNodesOnSelect=bA(!0),this.elevateEdgesOnSelect=bA(!0),this.view=bA([400,400]),this.computedFlowWidth=bA(0),this.computedFlowHeight=bA(0),this.minZoom=bA(.5),this.maxZoom=bA(3),this.background=bA({type:"solid",color:"#fff"}),this.snapGrid=bA([1,1]),this.optimization=bA(CMA)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),Kd=(()=>{class t{constructor(){this.entitiesService=w(ul),this.flowSettingsService=w(ts),this.writableViewport=bA({changeType:"initial",state:t.getDefaultViewport(),duration:0}),this.readableViewport=bA(t.getDefaultViewport()),this.viewportChangeEnd$=new ie}static getDefaultViewport(){return{zoom:1,x:0,y:0}}fitView(A={padding:.1,duration:0,nodes:[]}){let i=this.getBoundsNodes(A.nodes??[]),n=sMA(dtA(i),this.flowSettingsService.computedFlowWidth(),this.flowSettingsService.computedFlowHeight(),this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom(),A.padding??.1),o=A.duration??0;this.writableViewport.set({changeType:"absolute",state:n,duration:o})}triggerViewportChangeEvent(A){A==="end"&&this.viewportChangeEnd$.next()}getBoundsNodes(A){return A?.length?A.map(i=>this.entitiesService.nodes().find(({rawNode:n})=>n.id===i)).filter(i=>!!i):this.entitiesService.nodes()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function PC(t){return t!==void 0}var My=(()=>{class t{constructor(){this.element=w(ce).nativeElement}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["svg","rootSvgRef",""]]})}}return t})();function AtA(){let t=window.navigator.userAgent.toLowerCase(),e=/(macintosh|macintel|macppc|mac68k|macos)/i,A=/(win32|win64|windows|wince)/i,i=/(iphone|ipad|ipod)/i,n=null;return e.test(t)?n="macos":i.test(t)?n="ios":A.test(t)?n="windows":/android/.test(t)?n="android":!n&&/linux/.test(t)&&(n="linux"),n}var SN=(()=>{class t{constructor(){this.actions=bA({multiSelection:[AtA()==="macos"?"MetaLeft":"ControlLeft",AtA()==="macos"?"MetaRight":"ControlRight"]}),this.actionsActive={multiSelection:!1},po(this.actions).pipe(hi(()=>Ki(Lc(document,"keydown").pipe(di(A=>{for(let i in this.actions())(this.actions()[i]??[]).includes(A.code)&&(this.actionsActive[i]=!0)})),Lc(document,"keyup").pipe(di(A=>{for(let i in this.actions())(this.actions()[i]??[]).includes(A.code)&&(this.actionsActive[i]=!1)})))),wr()).subscribe()}setShortcuts(A){this.actions.update(i=>gA(gA({},i),A))}isActiveAction(A){return this.actionsActive[A]}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),b3=(()=>{class t{constructor(){this.flowEntitiesService=w(ul),this.keyboardService=w(SN),this.viewport$=new ie,this.resetSelection=this.viewport$.pipe(di(({start:A,end:i,target:n})=>{if(A&&i&&n){let o=t.delta,a=Math.abs(i.x-A.x),r=Math.abs(i.y-A.y),s=ai.selected.set(!1)),A&&A.selected.set(!0))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),vN=(()=>{class t{constructor(){this.rootSvg=w(My).element,this.host=w(ce).nativeElement,this.selectionService=w(b3),this.viewportService=w(Kd),this.flowSettingsService=w(ts),this.zone=w(qe),this.rootSvgSelection=Nr(this.rootSvg),this.transform=bA(""),this.viewportForSelection={},this.manualViewportChangeEffect=Ao(()=>{let A=this.viewportService.writableViewport(),i=A.state;if(A.changeType!=="initial"){if(PC(i.zoom)&&!PC(i.x)&&!PC(i.y)){this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.scaleTo,i.zoom);return}if(PC(i.x)&&PC(i.y)&&!PC(i.zoom)){let n=ca(this.viewportService.readableViewport).zoom;this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.transform,GI.translate(i.x,i.y).scale(n));return}if(PC(i.x)&&PC(i.y)&&PC(i.zoom)){this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.transform,GI.translate(i.x,i.y).scale(i.zoom));return}}},{allowSignalWrites:!0}),this.handleZoom=({transform:A})=>{this.viewportService.readableViewport.set(bN(A)),this.transform.set(A.toString())},this.handleZoomStart=({transform:A})=>{this.viewportForSelection={start:bN(A)}},this.handleZoomEnd=({transform:A,sourceEvent:i})=>{this.zone.run(()=>{this.viewportForSelection=Ye(gA({},this.viewportForSelection),{end:bN(A),target:IMA(i)}),this.viewportService.triggerViewportChangeEvent("end"),this.selectionService.setViewport(this.viewportForSelection)})},this.filterCondition=A=>A.type==="mousedown"||A.type==="touchstart"?A.target.closest(".vflow-node")===null:!0}ngOnInit(){this.zone.runOutsideAngular(()=>{this.zoomBehavior=yN().scaleExtent([this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom()]).filter(this.filterCondition).on("start",this.handleZoomStart).on("zoom",this.handleZoom).on("end",this.handleZoomEnd),this.rootSvgSelection.call(this.zoomBehavior).on("dblclick.zoom",null)})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["g","mapContext",""]],hostVars:1,hostBindings:function(i,n){i&2&&te("transform",n.transform())}})}}return t})(),bN=t=>({zoom:t.k,x:t.x,y:t.y}),IMA=t=>{if(t instanceof Event&&t.target instanceof Element)return t.target},py=t=>Math.round(t*100)/100;function Ql(t,e){return Math.ceil(t/e)*e}var KI=(()=>{class t{constructor(){this.status=bA({state:"idle",payload:null})}setIdleStatus(){this.status.set({state:"idle",payload:null})}setConnectionStartStatus(A,i){this.status.set({state:"connection-start",payload:{source:A,sourceHandle:i}})}setReconnectionStartStatus(A,i,n){this.status.set({state:"reconnection-start",payload:{source:A,sourceHandle:i,oldEdge:n}})}setConnectionValidationStatus(A,i,n,o,a){this.status.set({state:"connection-validation",payload:{source:i,target:n,sourceHandle:o,targetHandle:a,valid:A}})}setReconnectionValidationStatus(A,i,n,o,a,r){this.status.set({state:"reconnection-validation",payload:{source:i,target:n,sourceHandle:o,targetHandle:a,valid:A,oldEdge:r}})}setConnectionEndStatus(A,i,n,o){this.status.set({state:"connection-end",payload:{source:A,target:i,sourceHandle:n,targetHandle:o}})}setReconnectionEndStatus(A,i,n,o,a){this.status.set({state:"reconnection-end",payload:{source:A,target:i,sourceHandle:n,targetHandle:o,oldEdge:a}})}setNodeDragStartStatus(A){this.status.set({state:"node-drag-start",payload:{node:A}})}setNodeDragEndStatus(A){this.status.set({state:"node-drag-end",payload:{node:A}})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function etA(t){return t.state==="node-drag-start"}function dMA(t){return t.state==="node-drag-end"}var BtA=(()=>{class t{constructor(){this.entitiesService=w(ul),this.settingsService=w(ts),this.flowStatusService=w(KI)}enable(A,i){Nr(A).call(this.getDragBehavior(i))}disable(A){Nr(A).call(WD().on("drag",null))}destroy(A){Nr(A).on(".drag",null)}getDragBehavior(A){let i=[],n=[],o=a=>A.dragHandlesCount()?!!a.target.closest(".vflow-drag-handle"):!0;return WD().filter(o).on("start",a=>{i=this.getDragNodes(A),this.flowStatusService.setNodeDragStartStatus(A),n=i.map(r=>({x:r.point().x-a.x,y:r.point().y-a.y}))}).on("drag",a=>{i.forEach((r,s)=>{let l={x:py(a.x+n[s].x),y:py(a.y+n[s].y)};this.moveNode(r,l)})}).on("end",()=>{this.flowStatusService.setNodeDragEndStatus(A)})}getDragNodes(A){return A.selected()?this.entitiesService.nodes().filter(i=>i.selected()&&i.draggable()):[A]}moveNode(A,i){i=this.alignToGrid(i);let n=A.parent();n&&(i.x=Math.min(n.width()-A.width(),i.x),i.x=Math.max(0,i.x),i.y=Math.min(n.height()-A.height(),i.y),i.y=Math.max(0,i.y)),A.setPoint(i)}alignToGrid(A){let[i,n]=this.settingsService.snapGrid();return i>1&&(A.x=Ql(A.x,i)),n>1&&(A.y=Ql(A.y,n)),A}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),my=(()=>{class t{constructor(){this.templateRef=w(ao)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["ng-template","edge",""]]})}}return t})(),ttA=(()=>{class t{constructor(){this.templateRef=w(ao)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["ng-template","connection",""]]})}}return t})(),itA=(()=>{class t{constructor(){this.templateRef=w(ao)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["ng-template","edgeLabelHtml",""]]})}}return t})(),lQ=(()=>{class t{constructor(){this.templateRef=w(ao)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["ng-template","nodeHtml",""]]})}}return t})(),ntA=(()=>{class t{constructor(){this.templateRef=w(ao)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["ng-template","nodeSvg",""]]})}}return t})(),wy=(()=>{class t{constructor(){this.templateRef=w(ao)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["ng-template","groupNode",""]]})}}return t})();function otA(t,e){let A=t.reduce((i,n)=>(i[n.rawNode.id]=n,i),{});e.forEach(i=>{i.source.set(A[i.edge.source]),i.target.set(A[i.edge.target])})}function D3(t){try{return new Proxy(t,{apply:()=>{}})(),!0}catch(e){return!1}}var kN=(()=>{class t{constructor(){this._event$=new ie,this.event$=this._event$.asObservable()}pushEvent(A){this._event$.next(A)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),gQ=(()=>{class t{constructor(){this.model=bA(null)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),EtA=(()=>{class t{constructor(){this.eventBus=w(kN),this.nodeService=w(gQ),this.destroyRef=w(sr),this.selected=this.nodeService.model().selected,this.data=bA(void 0)}ngOnInit(){this.trackEvents().pipe(wr(this.destroyRef)).subscribe()}trackEvents(){let A=Object.getOwnPropertyNames(this),i=new Map;for(let n of A){let o=this[n];o instanceof LA&&i.set(o,n),o instanceof qF&&i.set(BMA(o),n)}return Ki(...Array.from(i.keys()).map(n=>n.pipe(di(o=>{this.eventBus.pushEvent({nodeId:this.nodeService.model()?.rawNode.id??"",eventName:i.get(n),eventPayload:o})}))))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,standalone:!1})}}return t})();function BMA(t){return new vi(e=>{let A=t.subscribe(i=>{e.next(i)});return()=>{A.unsubscribe()}})}var EMA=(()=>{class t extends EtA{constructor(){super(...arguments),this.node=me.required()}ngOnInit(){let A=this.node().data;A&&(this.data=A),super.ngOnInit()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})()}static{this.\u0275dir=VA({type:t,inputs:{node:[1,"node"]},standalone:!1,features:[mt]})}}return t})(),hMA=(()=>{class t extends EtA{constructor(){super(...arguments),this.node=me.required()}ngOnInit(){this.node().data&&this.data.set(this.node().data),super.ngOnInit()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})()}static{this.\u0275dir=VA({type:t,inputs:{node:[1,"node"]},standalone:!1,features:[mt]})}}return t})();function htA(t){return Object.prototype.isPrototypeOf.call(hMA,t)}function QtA(t){return Object.prototype.isPrototypeOf.call(EMA,t)}function QMA(t){return typeof t.point=="function"}function uMA(t){return htA(t.type)?!0:D3(t.type)&&!D3(t.point)}function fMA(t){return QtA(t.type)?!0:D3(t.type)&&D3(t.point)}var Dy=2;function pMA(t){return QMA(t)?t:Ye(gA({},mMA(t)),{id:t.id,type:t.type})}function mMA(t){let e={};for(let A in t)Object.prototype.hasOwnProperty.call(t,A)&&(e[A]=bA(t[A]));return e}function wMA(t,e,A){!e&&KF(t);let i=e??w(Dt);return A?Xa(i,A):i}function y3(t,e){let A=wMA(y3,e?.injector),i;return pe(()=>(i||(i=ca(()=>Ar(t,Ye(gA({},e),{injector:A})))),i()))}function DMA(t){return t.rawNode.type==="default-group"||t.rawNode.type==="template-group"}var Ud=(()=>{class t{constructor(){this.flowEntitiesService=w(ul),this.flowSettingsService=w(ts),this.viewportService=w(Kd),this.nodes=pe(()=>this.flowSettingsService.optimization().virtualization?this.viewportNodesAfterInteraction().sort((A,i)=>A.renderOrder()-i.renderOrder()):[...this.flowEntitiesService.nodes()].sort((A,i)=>A.renderOrder()-i.renderOrder())),this.groups=pe(()=>this.nodes().filter(A=>!!A.children().length||DMA(A))),this.nonGroups=pe(()=>this.nodes().filter(A=>!this.groups().includes(A))),this.viewportNodes=pe(()=>{let A=this.flowEntitiesService.nodes(),i=this.viewportService.readableViewport(),n=this.flowSettingsService.computedFlowWidth(),o=this.flowSettingsService.computedFlowHeight();return A.filter(a=>{let{x:r,y:s}=a.globalPoint(),l=a.width(),g=a.height();return cMA({x:r,y:s,width:l,height:g},i,n,o)})}),this.viewportNodesAfterInteraction=y3(Ki(po(this.flowEntitiesService.nodes).pipe(Hd(U3),gt(A=>!!A.length)),this.viewportService.viewportChangeEnd$.pipe(Ls(300))).pipe(we(()=>{let A=this.viewportService.readableViewport(),i=this.flowSettingsService.optimization().virtualizationZoomThreshold;return A.zoomMath.max(...this.flowEntitiesService.nodes().map(A=>A.renderOrder())))}pullNode(A){A.renderOrder.set(this.maxOrder()+1),A.children().forEach(i=>this.pullNode(i))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function yy(t,e){e||(e={equal:Object.is});let A;return pe(()=>A=t(A),e)}var yMA=(()=>{class t{static{this.defaultWidth=100}static{this.defaultHeight=50}static{this.defaultColor="#1b262c"}constructor(A){this.rawNode=A,this.entitiesService=w(ul),this.settingsService=w(ts),this.nodeRenderingService=w(Ud),this.isVisible=bA(!1),this.point=bA({x:0,y:0}),this.width=bA(t.defaultWidth),this.height=bA(t.defaultHeight),this.size=pe(()=>({width:this.width(),height:this.height()})),this.styleWidth=pe(()=>this.controlledByResizer()?`${this.width()}px`:"100%"),this.styleHeight=pe(()=>this.controlledByResizer()?`${this.height()}px`:"100%"),this.foWidth=pe(()=>this.width()+Dy),this.foHeight=pe(()=>this.height()+Dy),this.renderOrder=bA(0),this.selected=bA(!1),this.preview=bA({style:{}}),this.globalPoint=pe(()=>{let n=this.parent(),o=this.point().x,a=this.point().y;for(;n!==null;)o+=n.point().x,a+=n.point().y,n=n.parent();return{x:o,y:a}}),this.pointTransform=pe(()=>`translate(${this.globalPoint().x}, ${this.globalPoint().y})`),this.handles=bA([]),this.draggable=bA(!0),this.dragHandlesCount=bA(0),this.magnetRadius=20,this.isComponentType=uMA(this.rawNode)||fMA(this.rawNode),this.shouldLoad=yy(n=>{if(n||this.settingsService.optimization().lazyLoadTrigger==="immediate")return!0;if(this.settingsService.optimization().lazyLoadTrigger==="viewport"){if(htA(this.rawNode.type)||QtA(this.rawNode.type))return!0;if(D3(this.rawNode.type)||this.rawNode.type==="html-template"||this.rawNode.type==="svg-template"||this.rawNode.type==="template-group")return this.nodeRenderingService.viewportNodes().includes(this)}return!0}),this.componentInstance$=po(this.shouldLoad).pipe(gt(Boolean),hi(()=>this.rawNode.type()),Po(()=>ne(this.rawNode.type)),Gs(1)),this.text=bA(""),this.componentTypeInputs={node:this.rawNode},this.parent=pe(()=>this.entitiesService.nodes().find(n=>n.rawNode.id===this.parentId())??null),this.children=pe(()=>this.entitiesService.nodes().filter(n=>n.parentId()===this.rawNode.id)),this.color=bA(t.defaultColor),this.controlledByResizer=bA(!1),this.resizable=bA(!1),this.resizing=bA(!1),this.resizerTemplate=bA(null),this.context={$implicit:{}},this.parentId=bA(null);let i=pMA(A);i.point&&(this.point=i.point),i.width&&(this.width=i.width),i.height&&(this.height=i.height),i.draggable&&(this.draggable=i.draggable),i.parentId&&(this.parentId=i.parentId),i.preview&&(this.preview=i.preview),i.type==="default-group"&&i.color&&(this.color=i.color),i.type==="default-group"&&i.resizable&&(this.resizable=i.resizable),i.type==="default"&&i.text&&(this.text=i.text),i.type==="html-template"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}}),i.type==="svg-template"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),i.type==="template-group"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),this.point$=po(this.point),this.width$=po(this.width),this.height$=po(this.height),this.size$=po(this.size),this.selected$=po(this.selected),this.handles$=po(this.handles)}setPoint(A){this.point.set(A)}}return t})(),m3=class{constructor(e){this.edgeLabel=e,this.size=bA({width:0,height:0})}};function jC(t,e,A){return{x:(1-A)*t.x+A*e.x,y:(1-A)*t.y+A*e.y}}function xN({sourcePoint:t,targetPoint:e}){return{path:`M ${t.x},${t.y}L ${e.x},${e.y}`,labelPoints:{start:jC(t,e,.15),center:jC(t,e,.5),end:jC(t,e,.85)}}}function _N({sourcePoint:t,targetPoint:e,sourcePosition:A,targetPosition:i}){let n={x:t.x-e.x,y:t.y-e.y},o=atA(t,A,n),a=atA(e,i,n),r=`M${t.x},${t.y} C${o.x},${o.y} ${a.x},${a.y} ${e.x},${e.y}`;return vMA(r,t,e,o,a)}function atA(t,e,A){let i={x:0,y:0};switch(e){case"top":i.y=1;break;case"bottom":i.y=-1;break;case"right":i.x=1;break;case"left":i.x=-1;break}let n={x:A.x*Math.abs(i.x),y:A.y*Math.abs(i.y)},a=.25*25*Math.sqrt(Math.abs(n.x+n.y));return{x:t.x+i.x*a,y:t.y-i.y*a}}function vMA(t,e,A,i,n){return{path:t,labelPoints:{start:MN(e,A,i,n,.1),center:MN(e,A,i,n,.5),end:MN(e,A,i,n,.9)}}}function MN(t,e,A,i,n){let o=jC(t,A,n),a=jC(A,i,n),r=jC(i,e,n);return jC(jC(o,a,n),jC(a,r,n),n)}var rtA={left:{x:-1,y:0},right:{x:1,y:0},top:{x:0,y:-1},bottom:{x:0,y:1}};function bMA(t,e){let A=Math.abs(e.x-t.x)/2,i=e.xe==="left"||e==="right"?t.xMath.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2));function SMA({source:t,sourcePosition:e="bottom",target:A,targetPosition:i="top",offset:n}){let o=rtA[e],a=rtA[i],r={x:t.x+o.x*n,y:t.y+o.y*n},s={x:A.x+a.x*n,y:A.y+a.y*n},l=MMA({source:r,sourcePosition:e,target:s}),g=l.x!==0?"x":"y",C=l[g],I=[],d,h,E={x:0,y:0},f={x:0,y:0},[m,v]=bMA(t,A);if(o[g]*a[g]===-1){d=m,h=v;let S=[{x:d,y:r.y},{x:d,y:s.y}],b=[{x:r.x,y:h},{x:s.x,y:h}];o[g]===C?I=g==="x"?S:b:I=g==="x"?b:S}else{let S=[{x:r.x,y:s.y}],b=[{x:s.x,y:r.y}];if(g==="x"?I=o.x===C?b:S:I=o.y===C?S:b,e===i){let Z=Math.abs(t[g]-A[g]);if(Z<=n){let tA=Math.min(n-1,n-Z);o[g]===C?E[g]=(r[g]>t[g]?-1:1)*tA:f[g]=(s[g]>A[g]?-1:1)*tA}}if(e!==i){let Z=g==="x"?"y":"x",tA=o[g]===a[Z],W=r[Z]>s[Z],BA=r[Z]=P?(d=(x.x+F.x)/2,h=I[0].y):(d=I[0].x,h=(x.y+F.y)/2)}return[[t,{x:r.x+E.x,y:r.y+E.y},...I,{x:s.x+f.x,y:s.y+f.y},A],d,h]}function kMA(t,e,A,i){let n=Math.min(stA(t,e)/2,stA(e,A)/2,i),{x:o,y:a}=e;if(t.x===o&&o===A.x||t.y===a&&a===A.y)return`L${o} ${a}`;if(t.y===a){let l=t.x{let m="";return f>0&&f{let E=I*h;if(E<=0)return o[0];if(E>=I)return o[l-1];let f=0,m=l-1;for(;f>>1;C[F](this.source()?.shouldLoad()??!1)&&(this.target()?.shouldLoad()??!1)),this.renderOrder=bA(0),this.detached=pe(()=>{let A=this.source(),i=this.target();if(!A||!i)return!0;let n=!1,o=!1;return this.edge.sourceHandle?n=!!A.handles().find(a=>a.rawHandle.id===this.edge.sourceHandle):n=!!A.handles().find(a=>a.rawHandle.type==="source"),this.edge.targetHandle?o=!!i.handles().find(a=>a.rawHandle.id===this.edge.targetHandle):o=!!i.handles().find(a=>a.rawHandle.type==="target"),!n||!o}),this.detached$=po(this.detached),this.path=pe(()=>{let A=this.sourceHandle(),i=this.targetHandle();if(!A||!i)return{path:""};let n=this.getPathFactoryParams(A,i);switch(this.curve){case"straight":return xN(n);case"bezier":return _N(n);case"smooth-step":return rQ(n);case"step":return rQ(n,0);default:return this.curve(n)}}),this.sourceHandle=yy(A=>{let i=null;return this.floating?i=this.closestHandles().sourceHandle:this.edge.sourceHandle?i=this.source()?.handles().find(n=>n.rawHandle.id===this.edge.sourceHandle)??null:i=this.source()?.handles().find(n=>n.rawHandle.type==="source")??null,i===null?A:i}),this.targetHandle=yy(A=>{let i=null;return this.floating?i=this.closestHandles().targetHandle:this.edge.targetHandle?i=this.target()?.handles().find(n=>n.rawHandle.id===this.edge.targetHandle)??null:i=this.target()?.handles().find(n=>n.rawHandle.type==="target")??null,i===null?A:i}),this.closestHandles=pe(()=>{let A=this.source(),i=this.target();if(!A||!i)return{sourceHandle:null,targetHandle:null};let n=this.flowEntitiesService.connection().mode==="strict"?A.handles().filter(l=>l.rawHandle.type==="source"):A.handles(),o=this.flowEntitiesService.connection().mode==="strict"?i.handles().filter(l=>l.rawHandle.type==="target"):i.handles();if(n.length===0||o.length===0)return{sourceHandle:null,targetHandle:null};let a=1/0,r=null,s=null;for(let l of n)for(let g of o){let C=l.pointAbsolute(),I=g.pointAbsolute(),d=Math.sqrt(Math.pow(C.x-I.x,2)+Math.pow(C.y-I.y,2));d{let A=this.edge.markers?.start;return A?`url(#${sQ(JSON.stringify(A))})`:""}),this.markerEndUrl=pe(()=>{let A=this.edge.markers?.end;return A?`url(#${sQ(JSON.stringify(A))})`:""}),this.context={$implicit:{edge:this.edge,path:pe(()=>this.path().path),markerStart:this.markerStartUrl,markerEnd:this.markerEndUrl,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}},this.edgeLabels={},this.type=e.type??"default",this.curve=e.curve??"bezier",this.reconnectable=e.reconnectable??!1,this.floating=e.floating??!1,e.edgeLabels?.start&&(this.edgeLabels.start=new m3(e.edgeLabels.start)),e.edgeLabels?.center&&(this.edgeLabels.center=new m3(e.edgeLabels.center)),e.edgeLabels?.end&&(this.edgeLabels.end=new m3(e.edgeLabels.end))}getPathFactoryParams(e,A){return{mode:"edge",edge:this.edge,sourcePoint:e.pointAbsolute(),targetPoint:A.pointAbsolute(),sourcePosition:e.rawHandle.position,targetPosition:A.rawHandle.position,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}},vy=class{static nodes(e,A){let i=new Map;return A.forEach(n=>i.set(n.rawNode,n)),e.map(n=>i.get(n)??new yMA(n))}static edges(e,A){let i=new Map;return A.forEach(n=>i.set(n.edge,n)),e.map(n=>i.has(n)?i.get(n):new RN(n))}},xMA=25,NN=(()=>{class t{constructor(){this.entitiesService=w(ul),this.nodesPositionChange$=po(this.entitiesService.nodes).pipe(hi(A=>Ki(...A.map(i=>i.point$.pipe(wl(1),we(()=>i))))),we(A=>[{type:"position",id:A.rawNode.id,point:A.point()},...this.entitiesService.nodes().filter(i=>i!==A&&i.selected()).map(i=>({type:"position",id:i.rawNode.id,point:i.point()}))])),this.nodeSizeChange$=po(this.entitiesService.nodes).pipe(hi(A=>Ki(...A.map(i=>i.size$.pipe(wl(1),we(()=>i))))),we(A=>[{type:"size",id:A.rawNode.id,size:A.size()}])),this.nodeAddChange$=po(this.entitiesService.nodes).pipe(VC(),we(([A,i])=>i.filter(n=>!A.includes(n))),gt(A=>!!A.length),we(A=>A.map(i=>({type:"add",id:i.rawNode.id})))),this.nodeRemoveChange$=po(this.entitiesService.nodes).pipe(VC(),we(([A,i])=>A.filter(n=>!i.includes(n))),gt(A=>!!A.length),we(A=>A.map(i=>({type:"remove",id:i.rawNode.id})))),this.nodeSelectedChange$=po(this.entitiesService.nodes).pipe(hi(A=>Ki(...A.map(i=>i.selected$.pipe(kg(),wl(1),we(()=>i))))),we(A=>[{type:"select",id:A.rawNode.id,selected:A.selected()}])),this.changes$=Ki(this.nodesPositionChange$,this.nodeSizeChange$,this.nodeAddChange$,this.nodeRemoveChange$,this.nodeSelectedChange$).pipe(Hd(U3,xMA))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),_MA=(t,e)=>t.length===e.length&&[...new Set([...t,...e])].every(A=>t.filter(i=>i===A).length===e.filter(i=>i===A).length),FN=(()=>{class t{constructor(){this.entitiesService=w(ul),this.edgeDetachedChange$=Ki(po(pe(()=>{let A=this.entitiesService.nodes();return ca(this.entitiesService.edges).filter(({source:n,target:o})=>!A.includes(n())||!A.includes(o()))})),po(this.entitiesService.edges).pipe(hi(A=>RF(...A.map(i=>i.detached$.pipe(we(()=>i))))),we(A=>A.filter(i=>i.detached())),wl(2))).pipe(kg(_MA),gt(A=>!!A.length),we(A=>A.map(({edge:i})=>({type:"detached",id:i.id})))),this.edgeAddChange$=po(this.entitiesService.edges).pipe(VC(),we(([A,i])=>i.filter(n=>!A.includes(n))),gt(A=>!!A.length),we(A=>A.map(({edge:i})=>({type:"add",id:i.id})))),this.edgeRemoveChange$=po(this.entitiesService.edges).pipe(VC(),we(([A,i])=>A.filter(n=>!i.includes(n))),gt(A=>!!A.length),we(A=>A.map(({edge:i})=>({type:"remove",id:i.id})))),this.edgeSelectChange$=po(this.entitiesService.edges).pipe(hi(A=>Ki(...A.map(i=>i.selected$.pipe(kg(),wl(1),we(()=>i))))),we(A=>[{type:"select",id:A.edge.id,selected:A.selected()}])),this.changes$=Ki(this.edgeDetachedChange$,this.edgeAddChange$,this.edgeRemoveChange$,this.edgeSelectChange$).pipe(Hd(U3))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),RMA=(()=>{class t{constructor(){this.nodesChangeService=w(NN),this.edgesChangeService=w(FN),this.onNodesChange=kn(this.nodesChangeService.changes$),this.onNodesChangePosition=kn(this.nodeChangesOfType("position"),{alias:"onNodesChange.position"}),this.onNodesChangePositionSignle=kn(this.singleChange(this.nodeChangesOfType("position")),{alias:"onNodesChange.position.single"}),this.onNodesChangePositionMany=kn(this.manyChanges(this.nodeChangesOfType("position")),{alias:"onNodesChange.position.many"}),this.onNodesChangeSize=kn(this.nodeChangesOfType("size"),{alias:"onNodesChange.size"}),this.onNodesChangeSizeSingle=kn(this.singleChange(this.nodeChangesOfType("size")),{alias:"onNodesChange.size.single"}),this.onNodesChangeSizeMany=kn(this.manyChanges(this.nodeChangesOfType("size")),{alias:"onNodesChange.size.many"}),this.onNodesChangeAdd=kn(this.nodeChangesOfType("add"),{alias:"onNodesChange.add"}),this.onNodesChangeAddSingle=kn(this.singleChange(this.nodeChangesOfType("add")),{alias:"onNodesChange.add.single"}),this.onNodesChangeAddMany=kn(this.manyChanges(this.nodeChangesOfType("add")),{alias:"onNodesChange.add.many"}),this.onNodesChangeRemove=kn(this.nodeChangesOfType("remove"),{alias:"onNodesChange.remove"}),this.onNodesChangeRemoveSingle=kn(this.singleChange(this.nodeChangesOfType("remove")),{alias:"onNodesChange.remove.single"}),this.onNodesChangeRemoveMany=kn(this.manyChanges(this.nodeChangesOfType("remove")),{alias:"onNodesChange.remove.many"}),this.onNodesChangeSelect=kn(this.nodeChangesOfType("select"),{alias:"onNodesChange.select"}),this.onNodesChangeSelectSingle=kn(this.singleChange(this.nodeChangesOfType("select")),{alias:"onNodesChange.select.single"}),this.onNodesChangeSelectMany=kn(this.manyChanges(this.nodeChangesOfType("select")),{alias:"onNodesChange.select.many"}),this.onEdgesChange=kn(this.edgesChangeService.changes$),this.onNodesChangeDetached=kn(this.edgeChangesOfType("detached"),{alias:"onEdgesChange.detached"}),this.onNodesChangeDetachedSingle=kn(this.singleChange(this.edgeChangesOfType("detached")),{alias:"onEdgesChange.detached.single"}),this.onNodesChangeDetachedMany=kn(this.manyChanges(this.edgeChangesOfType("detached")),{alias:"onEdgesChange.detached.many"}),this.onEdgesChangeAdd=kn(this.edgeChangesOfType("add"),{alias:"onEdgesChange.add"}),this.onEdgeChangeAddSingle=kn(this.singleChange(this.edgeChangesOfType("add")),{alias:"onEdgesChange.add.single"}),this.onEdgeChangeAddMany=kn(this.manyChanges(this.edgeChangesOfType("add")),{alias:"onEdgesChange.add.many"}),this.onEdgeChangeRemove=kn(this.edgeChangesOfType("remove"),{alias:"onEdgesChange.remove"}),this.onEdgeChangeRemoveSingle=kn(this.singleChange(this.edgeChangesOfType("remove")),{alias:"onEdgesChange.remove.single"}),this.onEdgeChangeRemoveMany=kn(this.manyChanges(this.edgeChangesOfType("remove")),{alias:"onEdgesChange.remove.many"}),this.onEdgeChangeSelect=kn(this.edgeChangesOfType("select"),{alias:"onEdgesChange.select"}),this.onEdgeChangeSelectSingle=kn(this.singleChange(this.edgeChangesOfType("select")),{alias:"onEdgesChange.select.single"}),this.onEdgeChangeSelectMany=kn(this.manyChanges(this.edgeChangesOfType("select")),{alias:"onEdgesChange.select.many"})}nodeChangesOfType(A){return this.nodesChangeService.changes$.pipe(we(i=>i.filter(n=>n.type===A)),gt(i=>!!i.length))}edgeChangesOfType(A){return this.edgesChangeService.changes$.pipe(we(i=>i.filter(n=>n.type===A)),gt(i=>!!i.length))}singleChange(A){return A.pipe(gt(i=>i.length===1),we(([i])=>i))}manyChanges(A){return A.pipe(gt(i=>i.length>1))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","changesController",""]],outputs:{onNodesChange:"onNodesChange",onNodesChangePosition:"onNodesChange.position",onNodesChangePositionSignle:"onNodesChange.position.single",onNodesChangePositionMany:"onNodesChange.position.many",onNodesChangeSize:"onNodesChange.size",onNodesChangeSizeSingle:"onNodesChange.size.single",onNodesChangeSizeMany:"onNodesChange.size.many",onNodesChangeAdd:"onNodesChange.add",onNodesChangeAddSingle:"onNodesChange.add.single",onNodesChangeAddMany:"onNodesChange.add.many",onNodesChangeRemove:"onNodesChange.remove",onNodesChangeRemoveSingle:"onNodesChange.remove.single",onNodesChangeRemoveMany:"onNodesChange.remove.many",onNodesChangeSelect:"onNodesChange.select",onNodesChangeSelectSingle:"onNodesChange.select.single",onNodesChangeSelectMany:"onNodesChange.select.many",onEdgesChange:"onEdgesChange",onNodesChangeDetached:"onEdgesChange.detached",onNodesChangeDetachedSingle:"onEdgesChange.detached.single",onNodesChangeDetachedMany:"onEdgesChange.detached.many",onEdgesChangeAdd:"onEdgesChange.add",onEdgeChangeAddSingle:"onEdgesChange.add.single",onEdgeChangeAddMany:"onEdgesChange.add.many",onEdgeChangeRemove:"onEdgesChange.remove",onEdgeChangeRemoveSingle:"onEdgesChange.remove.single",onEdgeChangeRemoveMany:"onEdgesChange.remove.many",onEdgeChangeSelect:"onEdgesChange.select",onEdgeChangeSelectSingle:"onEdgesChange.select.single",onEdgeChangeSelectMany:"onEdgesChange.select.many"}})}}return t})(),Sy=(()=>{class t{constructor(){this.host=w(ce).nativeElement,this.initialTouch$=new ie,this.prevTouchEvent=null,this.mouseMovement$=Lc(this.host,"mousemove").pipe(we(A=>({x:A.clientX,y:A.clientY,movementX:A.movementX,movementY:A.movementY,target:A.target,originalEvent:A})),Hd(Yd),WC()),this.touchMovement$=Ki(this.initialTouch$,Lc(this.host,"touchmove")).pipe(di(A=>A.preventDefault()),we(A=>{let i=A.touches[0]?.clientX??0,n=A.touches[0]?.clientY??0,o=this.prevTouchEvent?A.touches[0].pageX-this.prevTouchEvent.touches[0].pageX:0,a=this.prevTouchEvent?A.touches[0].pageY-this.prevTouchEvent.touches[0].pageY:0,r=document.elementFromPoint(i,n);return{x:i,y:n,movementX:o,movementY:a,target:r,originalEvent:A}}),di(A=>this.prevTouchEvent=A.originalEvent),Hd(Yd),WC()),this.pointerMovement$=Ki(this.mouseMovement$,this.touchMovement$),this.touchEnd$=Lc(this.host,"touchend").pipe(we(A=>{let i=A.changedTouches[0]?.clientX??0,n=A.changedTouches[0]?.clientY??0,o=document.elementFromPoint(i,n);return{x:i,y:n,target:o,originalEvent:A}}),di(()=>this.prevTouchEvent=null),WC()),this.mouseUp$=Lc(this.host,"mouseup").pipe(we(A=>{let i=A.clientX,n=A.clientY,o=A.target;return{x:i,y:n,target:o,originalEvent:A}}),WC()),this.documentPointerEnd$=Ki(Lc(document,"mouseup"),Lc(document,"touchend")).pipe(WC())}setInitialTouch(A){this.initialTouch$.next(A)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["svg","rootPointer",""]]})}}return t})(),w3=(()=>{class t{constructor(){this.pointerMovementDirective=w(Sy),this.rootSvg=w(My).element,this.host=w(ce).nativeElement,this.svgCurrentSpacePoint=pe(()=>{let A=this.pointerMovement();return A?this.documentPointToFlowPoint({x:A.x,y:A.y}):{x:0,y:0}}),this.pointerMovement=Ar(this.pointerMovementDirective.pointerMovement$)}documentPointToFlowPoint(A){let i=this.rootSvg.createSVGPoint();return i.x=A.x,i.y=A.y,i.matrixTransform(this.host.getScreenCTM().inverse())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["g","spacePointContext",""]]})}}return t})();function NMA(t){return typeof t=="string"?{type:"solid",color:t}:t}function by(t,e,A){let i=A.value;return A.value=function(...n){queueMicrotask(()=>{i?.apply(this,n)})},A}var utA=(()=>{class t{constructor(){this.toolbars=bA([]),this.nodeToolbarsMap=pe(()=>{let A=new Map;return this.toolbars().forEach(i=>{let n=A.get(i.node)??[];A.set(i.node,[...n,i])}),A})}addToolbar(A){this.toolbars.update(i=>[...i,A])}removeToolbar(A){this.toolbars.update(i=>i.filter(n=>n!==A))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return kQ([by],t.prototype,"addToolbar",null),kQ([by],t.prototype,"removeToolbar",null),t})();function ky(t,e){return new vi(A=>{let i=new ResizeObserver(n=>{e.run(()=>A.next(n))});return t.forEach(n=>i.observe(n)),()=>i.disconnect()})}var FMA=(()=>{class t{constructor(){this.zone=w(qe),this.destroyRef=w(sr),this.settingsService=w(ts),this.model=me.required(),this.edgeModel=me.required(),this.point=me({x:0,y:0}),this.htmlTemplate=me(),this.edgeLabelWrapperRef=So.required("edgeLabelWrapper"),this.edgeLabelPoint=pe(()=>{let A=this.point(),{width:i,height:n}=this.model().size();return{x:A.x-i/2,y:A.y-n/2}}),this.edgeLabelStyle=pe(()=>{let A=this.model().edgeLabel;if(A.type==="default"&&A.style){let i=this.settingsService.background(),n="transparent";return i.type==="dots"&&(n=i.backgroundColor??"#fff"),i.type==="solid"&&(n=i.color),A.style.backgroundColor=A.style.backgroundColor??n,A.style}return null})}ngAfterViewInit(){let A=this.edgeLabelWrapperRef().nativeElement;ky([A],this.zone).pipe(Sn(null),di(()=>{let i=A.clientWidth+Dy,n=A.clientHeight+Dy;this.model().size.set({width:i,height:n})}),wr(this.destroyRef)).subscribe()}getLabelContext(){return{$implicit:{edge:this.edgeModel().edge,label:this.model().edgeLabel}}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","edgeLabel",""]],viewQuery:function(i,n){i&1&&ns(n.edgeLabelWrapperRef,FbA,5),i&2&&ur()},inputs:{model:[1,"model"],edgeModel:[1,"edgeModel"],point:[1,"point"],htmlTemplate:[1,"htmlTemplate"]},attrs:LbA,decls:1,vars:1,consts:[["edgeLabelWrapper",""],[1,"edge-label-wrapper"],[4,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(i,n){if(i&1&&O(0,JbA,2,2),i&2){let o;Y((o=n.model())?0:-1,o)}},dependencies:[Jc],styles:[".edge-label-wrapper[_ngcontent-%COMP%]{width:max-content;margin-top:1px;margin-left:1px}"],changeDetection:0})}}return t})();function ftA(t){let e={};return t.sourceHandle.rawHandle.type==="source"?(e.source=t.source,e.sourceHandle=t.sourceHandle):(e.source=t.target,e.sourceHandle=t.targetHandle),t.targetHandle.rawHandle.type==="target"?(e.target=t.target,e.targetHandle=t.targetHandle):(e.target=t.source,e.targetHandle=t.sourceHandle),e}var ptA=(()=>{class t{constructor(){this.statusService=w(KI),this.flowEntitiesService=w(ul),this.onConnect=kn(po(this.statusService.status).pipe(gt(A=>A.state==="connection-end"),we(A=>Qy(A,this.isStrictMode())),di(()=>this.statusService.setIdleStatus()),gt(A=>this.flowEntitiesService.connection().validator(A)))),this.connect=kn(po(this.statusService.status).pipe(gt(A=>A.state==="connection-end"),we(A=>Qy(A,this.isStrictMode())),di(()=>this.statusService.setIdleStatus()),gt(A=>this.flowEntitiesService.connection().validator(A)))),this.onReconnect=kn(po(this.statusService.status).pipe(gt(A=>A.state==="reconnection-end"),we(A=>{let i=Qy(A,this.isStrictMode()),n=A.payload.oldEdge.edge;return{connection:i,oldEdge:n}}),di(()=>this.statusService.setIdleStatus()),gt(({connection:A})=>this.flowEntitiesService.connection().validator(A)))),this.reconnect=kn(po(this.statusService.status).pipe(gt(A=>A.state==="reconnection-end"),we(A=>{let i=Qy(A,this.isStrictMode()),n=A.payload.oldEdge.edge;return{connection:i,oldEdge:n}}),di(()=>this.statusService.setIdleStatus()),gt(({connection:A})=>this.flowEntitiesService.connection().validator(A)))),this.isStrictMode=pe(()=>this.flowEntitiesService.connection().mode==="strict")}startConnection(A){this.statusService.setConnectionStartStatus(A.parentNode,A)}startReconnection(A,i){this.statusService.setReconnectionStartStatus(A.parentNode,A,i)}validateConnection(A){let i=this.statusService.status();if(i.state==="connection-start"||i.state==="reconnection-start"){let n=i.state==="reconnection-start",o=i.payload.source,a=A.parentNode,r=i.payload.sourceHandle,s=A;if(this.isStrictMode()){let g=ftA({source:i.payload.source,sourceHandle:i.payload.sourceHandle,target:A.parentNode,targetHandle:A});o=g.source,a=g.target,r=g.sourceHandle,s=g.targetHandle}let l=this.flowEntitiesService.connection().validator({source:o.rawNode.id,target:a.rawNode.id,sourceHandle:r.rawHandle.id,targetHandle:s.rawHandle.id});A.state.set(l?"valid":"invalid"),n?this.statusService.setReconnectionValidationStatus(l,i.payload.source,A.parentNode,i.payload.sourceHandle,A,i.payload.oldEdge):this.statusService.setConnectionValidationStatus(l,i.payload.source,A.parentNode,i.payload.sourceHandle,A)}}resetValidateConnection(A){A.state.set("idle");let i=this.statusService.status();(i.state==="connection-validation"||i.state==="reconnection-validation")&&(i.state==="reconnection-validation"?this.statusService.setReconnectionStartStatus(i.payload.source,i.payload.sourceHandle,i.payload.oldEdge):this.statusService.setConnectionStartStatus(i.payload.source,i.payload.sourceHandle))}endConnection(){let A=this.statusService.status();if(A.state==="connection-validation"||A.state==="reconnection-validation"){let i=A.state==="reconnection-validation",n=A.payload.source,o=A.payload.sourceHandle,a=A.payload.target,r=A.payload.targetHandle;i?this.statusService.setReconnectionEndStatus(n,a,o,r,A.payload.oldEdge):this.statusService.setConnectionEndStatus(n,a,o,r)}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","onConnect",""],["","onReconnect",""],["","connect",""],["","reconnect",""]],outputs:{onConnect:"onConnect",connect:"connect",onReconnect:"onReconnect",reconnect:"reconnect"}})}}return t})();function Qy(t,e){let A=t.payload.source,i=t.payload.target,n=t.payload.sourceHandle,o=t.payload.targetHandle;if(e){let g=ftA({source:t.payload.source,sourceHandle:t.payload.sourceHandle,target:t.payload.target,targetHandle:t.payload.targetHandle});A=g.source,i=g.target,n=g.sourceHandle,o=g.targetHandle}let a=A.rawNode.id,r=i.rawNode.id,s=n.rawHandle.id,l=o.rawHandle.id;return{source:a,target:r,sourceHandle:s,targetHandle:l}}var v3=(()=>{class t{constructor(){this.flowEntitiesService=w(ul),this.flowSettingsService=w(ts),this.edges=pe(()=>this.flowSettingsService.optimization().virtualization?this.viewportEdges().sort((A,i)=>A.renderOrder()-i.renderOrder()):[...this.flowEntitiesService.validEdges()].sort((A,i)=>A.renderOrder()-i.renderOrder())),this.viewportEdges=pe(()=>this.flowEntitiesService.validEdges().filter(A=>{let i=A.sourceHandle(),n=A.targetHandle();return i&&n})),this.maxOrder=pe(()=>Math.max(...this.flowEntitiesService.validEdges().map(A=>A.renderOrder())))}pull(A){A.renderOrder()!==0&&this.maxOrder()===A.renderOrder()||A.renderOrder.set(this.maxOrder()+1)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function LMA(t){return window.TouchEvent&&t instanceof TouchEvent}var TN=(()=>{class t{constructor(){this.hostElement=w(ce).nativeElement,this.pointerMovementDirective=w(Sy),this.pointerOver=ui(),this.pointerOut=ui(),this.pointerStart=ui(),this.pointerEnd=ui(),this.wasPointerOver=!1,this.touchEnd=this.pointerMovementDirective.touchEnd$.pipe(gt(({target:A})=>A===this.hostElement),di(({originalEvent:A})=>this.pointerEnd.emit(A)),wr()).subscribe(),this.touchOverOut=this.pointerMovementDirective.touchMovement$.pipe(di(({target:A,originalEvent:i})=>{this.handleTouchOverAndOut(A,i)}),wr()).subscribe()}onPointerStart(A){this.pointerStart.emit(A),LMA(A)&&this.pointerMovementDirective.setInitialTouch(A)}onPointerEnd(A){this.pointerEnd.emit(A)}onMouseOver(A){this.pointerOver.emit(A)}onMouseOut(A){this.pointerOut.emit(A)}handleTouchOverAndOut(A,i){A===this.hostElement?(this.pointerOver.emit(i),this.wasPointerOver=!0):(this.wasPointerOver&&this.pointerOut.emit(i),this.wasPointerOver=!1)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","pointerStart",""],["","pointerEnd",""],["","pointerOver",""],["","pointerOut",""]],hostBindings:function(i,n){i&1&&U("mousedown",function(a){return n.onPointerStart(a)})("touchstart",function(a){return n.onPointerStart(a)})("mouseup",function(a){return n.onPointerEnd(a)})("mouseover",function(a){return n.onMouseOver(a)})("mouseout",function(a){return n.onMouseOut(a)})},outputs:{pointerOver:"pointerOver",pointerOut:"pointerOut",pointerStart:"pointerStart",pointerEnd:"pointerEnd"}})}}return t})(),JN=(()=>{class t{constructor(){this.injector=w(Dt),this.selectionService=w(b3),this.flowSettingsService=w(ts),this.flowStatusService=w(KI),this.edgeRenderingService=w(v3),this.connectionController=w(ptA,{optional:!0}),this.model=me.required(),this.edgeTemplate=me(),this.edgeLabelHtmlTemplate=me(),this.isReconnecting=pe(()=>{let A=this.flowStatusService.status();return(A.state==="reconnection-start"||A.state==="reconnection-validation")&&A.payload.oldEdge===this.model()})}select(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}pull(){this.flowSettingsService.elevateEdgesOnSelect()&&this.edgeRenderingService.pull(this.model())}startReconnection(A,i){A.stopPropagation(),this.connectionController?.startReconnection(i,this.model())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","edge",""]],hostAttrs:[1,"selectable"],hostVars:2,hostBindings:function(i,n){i&2&&ut("visibility",n.isReconnecting()?"hidden":"visible")},inputs:{model:[1,"model"],edgeTemplate:[1,"edgeTemplate"],edgeLabelHtmlTemplate:[1,"edgeLabelHtmlTemplate"]},attrs:ObA,decls:6,vars:6,consts:[[1,"edge"],[1,"interactive-edge",3,"click"],[3,"ngTemplateOutlet","ngTemplateOutletContext","ngTemplateOutletInjector"],["edgeLabel","",3,"model","point","edgeModel","htmlTemplate"],["r","10",1,"reconnect-handle"],["r","10",1,"reconnect-handle",3,"pointerStart"]],template:function(i,n){if(i&1&&(O(0,YbA,2,6),O(1,zbA,1,1),O(2,jbA,1,1),O(3,VbA,1,1),O(4,ZbA,1,1),O(5,A7A,2,2)),i&2){let o,a,r;Y(n.model().type==="default"?0:-1),u(),Y(n.model().type==="template"&&n.edgeTemplate()?1:-1),u(),Y((o=n.model().edgeLabels.start)?2:-1,o),u(),Y((a=n.model().edgeLabels.center)?3:-1,a),u(),Y((r=n.model().edgeLabels.end)?4:-1,r),u(),Y(n.model().sourceHandle()&&n.model().targetHandle()?5:-1)}},dependencies:[Jc,FMA,TN],styles:[".edge[_ngcontent-%COMP%]{fill:none;stroke-width:2;stroke:#b1b1b7}.edge_selected[_ngcontent-%COMP%]{stroke-width:2.5;stroke:#0f4c75}.interactive-edge[_ngcontent-%COMP%]{fill:none;stroke-width:20;stroke:transparent}.reconnect-handle[_ngcontent-%COMP%]{fill:transparent;cursor:move}"],changeDetection:0})}}return t})(),LN=(()=>{class t{constructor(){this.node=bA(null)}createHandle(A){let i=this.node();i&&i.handles.update(n=>[...n,A])}destroyHandle(A){let i=this.node();i&&i.handles.update(n=>n.filter(o=>o!==A))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return kQ([by],t.prototype,"createHandle",null),t})(),GMA=(()=>{class t{constructor(){this.handleModel=me.required({alias:"handleSizeController"}),this.handleWrapper=w(ce)}ngAfterViewInit(){let A=this.handleWrapper.nativeElement,i=A.getBBox(),n=KMA(A);this.handleModel().size.set({width:i.width+n,height:i.height+n})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","handleSizeController",""]],inputs:{handleModel:[1,"handleSizeController","handleModel"]}})}}return t})();function KMA(t){let e=t.firstElementChild;if(e){let A=getComputedStyle(e).strokeWidth,i=Number(A.replace("px",""));return isNaN(i)?0:i}return 0}var UMA=(()=>{class t{constructor(){this.selected=me(!1)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["default-node"]],hostVars:2,hostBindings:function(i,n){i&2&&RA("selected",n.selected())},inputs:{selected:[1,"selected"]},ngContentSelectors:UN,decls:1,vars:0,template:function(i,n){i&1&&(Rt(),Ve(0))},styles:["[_nghost-%COMP%]{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}.selected[_nghost-%COMP%]{border-width:2px}"],changeDetection:0})}}return t})(),TMA=(()=>{class t{get model(){return this.nodeAccessor.model()}constructor(){this.nodeAccessor=w(gQ),this.rootPointer=w(Sy),this.viewportService=w(Kd),this.spacePointContext=w(w3),this.settingsService=w(ts),this.hostRef=w(ce),this.resizable=me(),this.resizerColor=me("#2e414c"),this.gap=me(1.5),this.resizer=So.required("resizer"),this.lineGap=3,this.handleSize=6,this.resizeSide=null,this.zoom=pe(()=>this.viewportService.readableViewport().zoom??0),this.minWidth=0,this.minHeight=0,this.maxWidth=1/0,this.maxHeight=1/0,this.resizeOnGlobalMouseMove=this.rootPointer.pointerMovement$.pipe(gt(()=>this.resizeSide!==null),gt(A=>A.movementX!==0||A.movementY!==0),di(A=>this.resize(A)),wr()).subscribe(),this.endResizeOnGlobalMouseUp=this.rootPointer.documentPointerEnd$.pipe(di(()=>this.endResize()),wr()).subscribe(),Ao(()=>{let A=this.resizable();typeof A=="boolean"?this.model.resizable.set(A):this.model.resizable.set(!0)},{allowSignalWrites:!0})}ngOnInit(){this.model.controlledByResizer.set(!0),this.model.resizerTemplate.set(this.resizer())}ngOnDestroy(){this.model.controlledByResizer.set(!1)}ngAfterViewInit(){this.minWidth=+getComputedStyle(this.hostRef.nativeElement).minWidth.replace("px","")||0,this.minHeight=+getComputedStyle(this.hostRef.nativeElement).minHeight.replace("px","")||0,this.maxWidth=+getComputedStyle(this.hostRef.nativeElement).maxWidth.replace("px","")||1/0,this.maxHeight=+getComputedStyle(this.hostRef.nativeElement).maxHeight.replace("px","")||1/0}startResize(A,i){i.stopPropagation(),this.resizeSide=A,this.model.resizing.set(!0)}resize(A){if(!this.resizeSide)return;let i=JMA(A.movementX,A.movementY,this.zoom()),n=this.applyResize(this.resizeSide,this.model,i,this.getDistanceToEdge(A)),{x:o,y:a,width:r,height:s}=OMA(n,this.model,this.resizeSide,this.minWidth,this.minHeight,this.maxWidth,this.maxHeight);this.model.setPoint({x:o,y:a}),this.model.width.set(r),this.model.height.set(s)}endResize(){this.resizeSide=null,this.model.resizing.set(!1)}getDistanceToEdge(A){let i=this.spacePointContext.documentPointToFlowPoint({x:A.x,y:A.y}),{x:n,y:o}=this.model.globalPoint();return{left:i.x-n,right:i.x-(n+this.model.width()),top:i.y-o,bottom:i.y-(o+this.model.height())}}applyResize(A,i,n,o){let{x:a,y:r}=i.point(),s=i.width(),l=i.height(),[g,C]=this.settingsService.snapGrid();switch(A){case"left":{let I=n.x+o.left,d=Ql(a+I,g),h=d-a;return{x:d,y:r,width:s-h,height:l}}case"right":{let I=n.x+o.right,d=Ql(s+I,g);return{x:a,y:r,width:d,height:l}}case"top":{let I=n.y+o.top,d=Ql(r+I,C),h=d-r;return{x:a,y:d,width:s,height:l-h}}case"bottom":{let I=n.y+o.bottom,d=Ql(l+I,C);return{x:a,y:r,width:s,height:d}}case"top-left":{let I=n.x+o.left,d=n.y+o.top,h=Ql(a+I,g),E=Ql(r+d,C),f=h-a,m=E-r;return{x:h,y:E,width:s-f,height:l-m}}case"top-right":{let I=n.x+o.right,d=n.y+o.top,h=Ql(r+d,C),E=h-r;return{x:a,y:h,width:Ql(s+I,g),height:l-E}}case"bottom-left":{let I=n.x+o.left,d=n.y+o.bottom,h=Ql(a+I,g),E=h-a;return{x:h,y:r,width:s-E,height:Ql(l+d,C)}}case"bottom-right":{let I=n.x+o.right,d=n.y+o.bottom;return{x:a,y:r,width:Ql(s+I,g),height:Ql(l+d,C)}}}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["","resizable",""]],viewQuery:function(i,n){i&1&&ns(n.resizer,e7A,5),i&2&&ur()},inputs:{resizable:[1,"resizable"],resizerColor:[1,"resizerColor"],gap:[1,"gap"]},attrs:t7A,ngContentSelectors:UN,decls:3,vars:0,consts:[["resizer",""],["stroke-width","2",1,"top",3,"pointerStart"],["stroke-width","2",1,"left",3,"pointerStart"],["stroke-width","2",1,"bottom",3,"pointerStart"],["stroke-width","2",1,"right",3,"pointerStart"],[1,"top-left",3,"pointerStart"],[1,"top-right",3,"pointerStart"],[1,"bottom-left",3,"pointerStart"],[1,"bottom-right",3,"pointerStart"]],template:function(i,n){i&1&&(Rt(),Et(0,i7A,9,40,"ng-template",null,0,$C),Ve(2))},dependencies:[TN],styles:[".top[_ngcontent-%COMP%]{cursor:n-resize}.left[_ngcontent-%COMP%]{cursor:w-resize}.right[_ngcontent-%COMP%]{cursor:e-resize}.bottom[_ngcontent-%COMP%]{cursor:s-resize}.top-left[_ngcontent-%COMP%]{cursor:nw-resize}.top-right[_ngcontent-%COMP%]{cursor:ne-resize}.bottom-left[_ngcontent-%COMP%]{cursor:sw-resize}.bottom-right[_ngcontent-%COMP%]{cursor:se-resize}"],changeDetection:0})}}return kQ([by],t.prototype,"ngAfterViewInit",null),t})();function JMA(t,e,A){return{x:py(t/A),y:py(e/A)}}function OMA(t,e,A,i,n,o,a){let{x:r,y:s,width:l,height:g}=t;l=Math.max(l,0),g=Math.max(g,0),l=Math.max(i,l),g=Math.max(n,g),l=Math.min(o,l),g=Math.min(a,g),r=Math.min(r,e.point().x+e.width()-i),s=Math.min(s,e.point().y+e.height()-n),r=Math.max(r,e.point().x+e.width()-o),s=Math.max(s,e.point().y+e.height()-a);let C=e.parent();if(C){let d=C.width(),h=C.height(),E=e.point().x,f=e.point().y;r=Math.max(r,0),s=Math.max(s,0),A.includes("left")&&r===0&&(l=Math.min(l,E+e.width())),A.includes("top")&&s===0&&(g=Math.min(g,f+e.height())),l=Math.min(l,d-r),g=Math.min(g,h-s)}let I=dtA(e.children());return I&&(A.includes("left")&&(r=Math.min(r,e.point().x+e.width()-(I.x+I.width)),l=Math.max(l,I.x+I.width)),A.includes("right")&&(l=Math.max(l,I.x+I.width)),A.includes("bottom")&&(g=Math.max(g,I.y+I.height)),A.includes("top")&&(s=Math.min(s,e.point().y+e.height()-(I.y+I.height)),g=Math.max(g,I.y+I.height))),{x:r,y:s,width:l,height:g}}var GN=class{constructor(e,A){this.rawHandle=e,this.parentNode=A,this.strokeWidth=2,this.size=bA({width:10+2*this.strokeWidth,height:10+2*this.strokeWidth}),this.pointAbsolute=pe(()=>({x:this.parentNode.globalPoint().x+this.hostOffset().x+this.sizeOffset().x,y:this.parentNode.globalPoint().y+this.hostOffset().y+this.sizeOffset().y})),this.state=bA("idle"),this.updateHostSizeAndPosition$=new ie,this.hostSize=Ar(this.updateHostSizeAndPosition$.pipe(we(()=>this.getHostSize())),{initialValue:{width:0,height:0}}),this.hostPosition=Ar(this.updateHostSizeAndPosition$.pipe(we(()=>({x:this.hostReference instanceof HTMLElement?this.hostReference.offsetLeft:0,y:this.hostReference instanceof HTMLElement?this.hostReference.offsetTop:0}))),{initialValue:{x:0,y:0}}),this.hostOffset=pe(()=>{switch(this.rawHandle.position){case"left":return{x:-this.rawHandle.userOffsetX,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case"right":return{x:-this.rawHandle.userOffsetX+this.parentNode.size().width,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case"top":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY};case"bottom":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY+this.parentNode.size().height}}}),this.sizeOffset=pe(()=>{switch(this.rawHandle.position){case"left":return{x:-(this.size().width/2),y:0};case"right":return{x:this.size().width/2,y:0};case"top":return{x:0,y:-(this.size().height/2)};case"bottom":return{x:0,y:this.size().height/2}}}),this.hostReference=this.rawHandle.hostReference,this.template=this.rawHandle.template,this.templateContext={$implicit:{point:this.hostOffset,state:this.state,node:this.parentNode.rawNode}}}updateHost(){this.updateHostSizeAndPosition$.next()}getHostSize(){return this.hostReference instanceof HTMLElement?{width:this.hostReference.offsetWidth,height:this.hostReference.offsetHeight}:this.hostReference instanceof SVGGraphicsElement?this.hostReference.getBBox():{width:0,height:0}}},M3=(()=>{class t{constructor(){this.injector=w(Dt),this.handleService=w(LN),this.element=w(ce).nativeElement,this.destroyRef=w(sr),this.position=me.required(),this.type=me.required(),this.id=me(),this.template=me(),this.offsetX=me(0),this.offsetY=me(0)}ngOnInit(){Xa(this.injector,()=>{let A=this.handleService.node();if(A){let i=new GN({position:this.position(),type:this.type(),id:this.id(),hostReference:this.element.parentElement,template:this.template(),userOffsetX:this.offsetX(),userOffsetY:this.offsetY()},A);this.handleService.createHandle(i),requestAnimationFrame(()=>i.updateHost()),this.destroyRef.onDestroy(()=>this.handleService.destroyHandle(i))}})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["handle"]],inputs:{position:[1,"position"],type:[1,"type"],id:[1,"id"],template:[1,"template"],offsetX:[1,"offsetX"],offsetY:[1,"offsetY"]},decls:0,vars:0,template:function(i,n){},encapsulation:2,changeDetection:0})}}return t})(),YMA=(()=>{class t{constructor(){this.nodeAccessor=w(gQ),this.zone=w(qe),this.destroyRef=w(sr),this.hostElementRef=w(ce)}ngOnInit(){this.nodeAccessor.model().handles$.pipe(hi(i=>ky([...i.map(n=>n.hostReference),this.hostElementRef.nativeElement],this.zone).pipe(we(()=>i))),di(i=>{i.forEach(n=>n.updateHost())}),wr(this.destroyRef)).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","nodeHandlesController",""]]})}}return t})(),HMA=(()=>{class t{constructor(){this.nodeAccessor=w(gQ),this.zone=w(qe),this.destroyRef=w(sr),this.hostElementRef=w(ce)}ngOnInit(){let A=this.nodeAccessor.model(),i=this.hostElementRef.nativeElement;Ki(ky([i],this.zone)).pipe(Sn(null),gt(()=>!A.resizing()),di(()=>{A.width.set(i.clientWidth),A.height.set(i.clientHeight)}),wr(this.destroyRef)).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","nodeResizeController",""]]})}}return t})(),mtA=(()=>{class t{constructor(){this.injector=w(Dt),this.handleService=w(LN),this.draggableService=w(BtA),this.flowStatusService=w(KI),this.nodeRenderingService=w(Ud),this.flowSettingsService=w(ts),this.selectionService=w(b3),this.hostRef=w(ce),this.nodeAccessor=w(gQ),this.overlaysService=w(utA),this.connectionController=w(ptA,{optional:!0}),this.model=me.required(),this.nodeTemplate=me(),this.nodeSvgTemplate=me(),this.groupNodeTemplate=me(),this.showMagnet=pe(()=>this.flowStatusService.status().state==="connection-start"||this.flowStatusService.status().state==="connection-validation"||this.flowStatusService.status().state==="reconnection-start"||this.flowStatusService.status().state==="reconnection-validation"),this.toolbars=pe(()=>this.overlaysService.nodeToolbarsMap().get(this.model()))}ngOnInit(){this.model().isVisible.set(!0),this.nodeAccessor.model.set(this.model()),this.handleService.node.set(this.model()),Ao(()=>{this.model().draggable()?this.draggableService.enable(this.hostRef.nativeElement,this.model()):this.draggableService.disable(this.hostRef.nativeElement)},{injector:this.injector})}ngOnDestroy(){this.model().isVisible.set(!1),this.draggableService.destroy(this.hostRef.nativeElement)}startConnection(A,i){A.stopPropagation(),this.connectionController?.startConnection(i)}validateConnection(A){this.connectionController?.validateConnection(A)}resetValidateConnection(A){this.connectionController?.resetValidateConnection(A)}endConnection(){this.connectionController?.endConnection()}pullNode(){this.flowSettingsService.elevateNodesOnSelect()&&this.nodeRenderingService.pullNode(this.model())}selectNode(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","node",""]],hostAttrs:[1,"vflow-node"],inputs:{model:[1,"model"],nodeTemplate:[1,"nodeTemplate"],nodeSvgTemplate:[1,"nodeSvgTemplate"],groupNodeTemplate:[1,"groupNodeTemplate"]},features:[Bt([LN,gQ])],attrs:n7A,decls:11,vars:7,consts:[[1,"selectable"],["nodeHandlesController","",1,"selectable"],["rx","5","ry","5",1,"default-group-node",3,"resizable","gap","resizerColor","default-group-node_selected","stroke","fill"],[1,"selectable",3,"click"],["nodeHandlesController","",3,"selected"],[3,"outerHTML"],["type","source","position","right"],["type","target","position","left"],["nodeHandlesController","","nodeResizeController","",1,"wrapper"],[3,"ngTemplateOutlet","ngTemplateOutletContext","ngTemplateOutletInjector"],["nodeHandlesController","",1,"selectable",3,"click"],[3,"ngComponentOutlet","ngComponentOutletInputs","ngComponentOutletInjector"],["rx","5","ry","5",1,"default-group-node",3,"click","resizable","gap","resizerColor"],[3,"ngTemplateOutlet"],["r","5",1,"default-handle"],[3,"handleSizeController"],[1,"magnet"],["r","5",1,"default-handle",3,"pointerStart","pointerEnd"],[3,"pointerStart","pointerEnd","handleSizeController"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"magnet",3,"pointerEnd","pointerOver","pointerOut"]],template:function(i,n){if(i&1&&(O(0,o7A,5,12,":svg:foreignObject",0),O(1,a7A,3,9,":svg:foreignObject",0),O(2,r7A,2,3,":svg:g",1),O(3,l7A,2,3),O(4,g7A,1,11,":svg:rect",2),O(5,c7A,2,3,":svg:g",1),O(6,d7A,1,1),Ue(7,f7A,4,4,null,null,ri),Ue(9,p7A,2,4,":svg:foreignObject",null,ri)),i&2){let o;Y(n.model().rawNode.type==="default"?0:-1),u(),Y(n.model().rawNode.type==="html-template"&&n.nodeTemplate()?1:-1),u(),Y(n.model().rawNode.type==="svg-template"&&n.nodeSvgTemplate()?2:-1),u(),Y(n.model().isComponentType?3:-1),u(),Y(n.model().rawNode.type==="default-group"?4:-1),u(),Y(n.model().rawNode.type==="template-group"&&n.groupNodeTemplate()?5:-1),u(),Y((o=n.model().resizerTemplate())?6:-1,o),u(),Te(n.model().handles()),u(2),Te(n.toolbars())}},dependencies:[TN,UMA,M3,Jc,Tc,TMA,GMA,YMA,HMA,os],styles:[".magnet[_ngcontent-%COMP%]{opacity:0}.wrapper[_ngcontent-%COMP%]{display:table-cell}.default-group-node[_ngcontent-%COMP%]{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected[_ngcontent-%COMP%]{stroke-width:2px}.default-handle[_ngcontent-%COMP%]{stroke:#fff;fill:#1b262c}"],changeDetection:0})}}return t})(),zMA=(()=>{class t{constructor(){this.flowStatusService=w(KI),this.spacePointContext=w(w3),this.flowEntitiesService=w(ul),this.model=me.required(),this.template=me(),this.path=pe(()=>{let A=this.flowStatusService.status(),i=this.model().curve;if(A.state==="connection-start"||A.state==="reconnection-start"){let n=A.payload.sourceHandle,o=n.pointAbsolute(),a=n.rawHandle.position,r=this.spacePointContext.svgCurrentSpacePoint(),s=ltA(n.rawHandle.position),l=this.getPathFactoryParams(o,r,a,s);switch(i){case"straight":return xN(l).path;case"bezier":return _N(l).path;case"smooth-step":return rQ(l).path;case"step":return rQ(l,0).path;default:return i(l).path}}if(A.state==="connection-validation"||A.state==="reconnection-validation"){let n=A.payload.sourceHandle,o=n.pointAbsolute(),a=n.rawHandle.position,r=A.payload.targetHandle,s=A.payload.valid?r.pointAbsolute():this.spacePointContext.svgCurrentSpacePoint(),l=A.payload.valid?r.rawHandle.position:ltA(n.rawHandle.position),g=this.getPathFactoryParams(o,s,a,l);switch(i){case"straight":return xN(g).path;case"bezier":return _N(g).path;case"smooth-step":return rQ(g).path;case"step":return rQ(g,0).path;default:return i(g).path}}return null}),this.markerUrl=pe(()=>{let A=this.model().settings.marker;return A?`url(#${sQ(JSON.stringify(A))})`:""}),this.defaultColor="rgb(177, 177, 183)"}getContext(){return{$implicit:{path:this.path,marker:this.markerUrl}}}getPathFactoryParams(A,i,n,o){return{mode:"connection",sourcePoint:A,targetPoint:i,sourcePosition:n,targetPosition:o,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","connection",""]],inputs:{model:[1,"model"],template:[1,"template"]},attrs:m7A,decls:2,vars:2,consts:[["fill","none","stroke-width","2"],[4,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(i,n){i&1&&(O(0,D7A,1,1),O(1,b7A,1,1)),i&2&&(Y(n.model().type==="default"?0:-1),u(),Y(n.model().type==="template"?1:-1))},dependencies:[Jc],encapsulation:2,changeDetection:0})}}return t})();function ltA(t){switch(t){case"top":return"bottom";case"bottom":return"top";case"left":return"right";case"right":return"left"}}function PMA(){return String.fromCharCode(65+Math.floor(Math.random()*26))+Date.now()}var jMA="#fff",qMA=20,VMA=2,gtA="rgb(177, 177, 183)",ctA=.1,WMA=!0,ZMA=(()=>{class t{constructor(){this.viewportService=w(Kd),this.rootSvg=w(My).element,this.settingsService=w(ts),this.backgroundSignal=this.settingsService.background,this.scaledGap=pe(()=>{let A=this.backgroundSignal();return A.type==="dots"?this.viewportService.readableViewport().zoom*(A.gap??qMA):0}),this.x=pe(()=>this.viewportService.readableViewport().x%this.scaledGap()),this.y=pe(()=>this.viewportService.readableViewport().y%this.scaledGap()),this.patternColor=pe(()=>{let A=this.backgroundSignal();return A.type==="dots"?A.color??gtA:gtA}),this.patternSize=pe(()=>{let A=this.backgroundSignal();return A.type==="dots"?this.viewportService.readableViewport().zoom*(A.size??VMA)/2:0}),this.bgImageSrc=pe(()=>{let A=this.backgroundSignal();return A.type==="image"?A.src:""}),this.imageSize=y3(po(this.backgroundSignal).pipe(hi(()=>XMA(this.bgImageSrc())),we(A=>({width:A.naturalWidth,height:A.naturalHeight}))),{initialValue:{width:0,height:0}}),this.scaledImageWidth=pe(()=>{let A=this.backgroundSignal();if(A.type==="image"){let i=A.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().width*i*(A.scale??ctA)}return 0}),this.scaledImageHeight=pe(()=>{let A=this.backgroundSignal();if(A.type==="image"){let i=A.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().height*i*(A.scale??ctA)}return 0}),this.imageX=pe(()=>{let A=this.backgroundSignal();return A.type==="image"?A.repeat?A.fixed?0:this.viewportService.readableViewport().x%this.scaledImageWidth():A.fixed?0:this.viewportService.readableViewport().x:0}),this.imageY=pe(()=>{let A=this.backgroundSignal();return A.type==="image"?A.repeat?A.fixed?0:this.viewportService.readableViewport().y%this.scaledImageHeight():A.fixed?0:this.viewportService.readableViewport().y:0}),this.repeated=pe(()=>{let A=this.backgroundSignal();return A.type==="image"&&(A.repeat??WMA)}),this.patternId=PMA(),this.patternUrl=`url(#${this.patternId})`,Ao(()=>{let A=this.backgroundSignal();A.type==="dots"&&(this.rootSvg.style.backgroundColor=A.backgroundColor??jMA),A.type==="solid"&&(this.rootSvg.style.backgroundColor=A.color)})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","background",""]],attrs:M7A,decls:2,vars:2,consts:[["patternUnits","userSpaceOnUse"],["x","0","y","0","width","100%","height","100%"]],template:function(i,n){i&1&&(O(0,S7A,3,10),O(1,_7A,2,2)),i&2&&(Y(n.backgroundSignal().type==="dots"?0:-1),u(),Y(n.backgroundSignal().type==="image"?1:-1))},encapsulation:2,changeDetection:0})}}return t})();function XMA(t){let e=new Image;return e.src=t,new Promise(A=>{e.onload=()=>A(e)})}var $MA=(()=>{class t{constructor(){this.markers=me.required(),this.defaultColor="rgb(177, 177, 183)"}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["defs","flowDefs",""]],inputs:{markers:[1,"markers"]},attrs:R7A,decls:3,vars:2,consts:[["viewBox","-10 -10 20 20","refX","0","refY","0"],["points","-5,-4 1,0 -5,4 -5,-4",1,"marker__arrow_closed",3,"stroke","stroke-width","fill"],["points","-5,-4 0,0 -5,4",1,"marker__arrow_default",3,"stroke","stroke-width"],["points","-5,-4 1,0 -5,4 -5,-4",1,"marker__arrow_closed"],["points","-5,-4 0,0 -5,4",1,"marker__arrow_default"]],template:function(i,n){i&1&&(Ue(0,L7A,3,7,":svg:marker",0,ri),Ht(2,"keyvalue")),i&2&&Te(si(2,0,n.markers()))},dependencies:[oL],styles:[".marker__arrow_default[_ngcontent-%COMP%]{stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;fill:none}.marker__arrow_closed[_ngcontent-%COMP%]{stroke-linecap:round;stroke-linejoin:round}"],changeDetection:0})}}return t})(),A9A=(()=>{class t{constructor(){this.host=w(ce),this.flowSettingsService=w(ts),this.flowWidth=pe(()=>{let A=this.flowSettingsService.view();return A==="auto"?"100%":A[0]}),this.flowHeight=pe(()=>{let A=this.flowSettingsService.view();return A==="auto"?"100%":A[1]}),ky([this.host.nativeElement],w(qe)).pipe(di(([A])=>{this.flowSettingsService.computedFlowWidth.set(A.contentRect.width),this.flowSettingsService.computedFlowHeight.set(A.contentRect.height)}),wr()).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["svg","flowSizeController",""]],hostVars:2,hostBindings:function(i,n){i&2&&te("width",n.flowWidth())("height",n.flowHeight())}})}}return t})(),e9A=(()=>{class t{constructor(){this.flowStatusService=w(KI)}resetConnection(){let A=this.flowStatusService.status();(A.state==="connection-start"||A.state==="reconnection-start")&&this.flowStatusService.setIdleStatus()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["svg","rootSvgContext",""]],hostBindings:function(i,n){i&1&&U("mouseup",function(){return n.resetConnection()},Pd)("touchend",function(){return n.resetConnection()},Pd)("contextmenu",function(){return n.resetConnection()})}})}}return t})();function KN(t,e){let A=[];for(let i of e){let{x:n,y:o}=i.globalPoint();t.x>=n&&t.x<=n+i.width()&&t.y>=o&&t.y<=o+i.height()&&A.push({x:t.x-n,y:t.y-o,spaceNodeId:i.rawNode.id})}return A.reverse(),A.push({spaceNodeId:null,x:t.x,y:t.y}),A}var ON=(()=>{class t{static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),t9A=(()=>{class t extends ON{shouldRenderNode(A){return!A.isVisible()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})()}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function i9A(t,e){if(Object.keys(e.preview().style).length){a9A(t,e);return}if(e.rawNode.type==="default"){n9A(t,e);return}if(e.rawNode.type==="default-group"){o9A(t,e);return}r9A(t,e)}function n9A(t,e){let A=e.globalPoint(),i=e.width(),n=e.height();wtA(t,e,5),t.fillStyle="white",t.fill(),t.strokeStyle="#1b262c",t.lineWidth=1.5,t.stroke(),t.fillStyle="black",t.font="14px Arial",t.textAlign="center",t.textBaseline="middle";let o=A.x+i/2,a=A.y+n/2;t.fillText(e.text(),o,a)}function o9A(t,e){let A=e.globalPoint(),i=e.width(),n=e.height();t.globalAlpha=.05,t.fillStyle=e.color(),t.fillRect(A.x,A.y,i,n),t.globalAlpha=1,t.strokeStyle=e.color(),t.lineWidth=1.5,t.strokeRect(A.x,A.y,i,n)}function a9A(t,e){let A=e.globalPoint(),i=e.width(),n=e.height(),o=e.preview().style;if(o.borderRadius){let a=parseFloat(o.borderRadius);wtA(t,e,a)}else t.beginPath(),t.rect(A.x,A.y,i,n),t.closePath();o.backgroundColor&&(t.fillStyle=o.backgroundColor),o.borderColor&&(t.strokeStyle=o.borderColor),o.borderWidth&&(t.lineWidth=parseFloat(o.borderWidth)),t.fill(),t.stroke()}function r9A(t,e){let A=e.globalPoint(),i=e.width(),n=e.height();t.fillStyle="rgb(0 0 0 / 10%)",t.fillRect(A.x,A.y,i,n)}function wtA(t,e,A){let i=e.globalPoint(),n=e.width(),o=e.height();t.beginPath(),t.moveTo(i.x+A,i.y),t.lineTo(i.x+n-A,i.y),t.quadraticCurveTo(i.x+n,i.y,i.x+n,i.y+A),t.lineTo(i.x+n,i.y+o-A),t.quadraticCurveTo(i.x+n,i.y+o,i.x+n-A,i.y+o),t.lineTo(i.x+A,i.y+o),t.quadraticCurveTo(i.x,i.y+o,i.x,i.y+o-A),t.lineTo(i.x,i.y+A),t.quadraticCurveTo(i.x,i.y,i.x+A,i.y),t.closePath()}var s9A=(()=>{class t{constructor(){this.viewportService=w(Kd),this.renderStrategy=w(ON),this.nodeRenderingService=w(Ud),this.renderer2=w(Pi),this.element=w(ce).nativeElement,this.ctx=this.element.getContext("2d"),this.width=me(0),this.height=me(0),this.dpr=window.devicePixelRatio,Ao(()=>{this.renderer2.setProperty(this.element,"width",this.width()*this.dpr),this.renderer2.setProperty(this.element,"height",this.height()*this.dpr),this.renderer2.setStyle(this.element,"width",`${this.width()}px`),this.renderer2.setStyle(this.element,"height",`${this.height()}px`),this.ctx.scale(this.dpr,this.dpr)}),Ao(()=>{let A=this.viewportService.readableViewport();this.ctx.clearRect(0,0,this.width(),this.height()),this.ctx.save(),this.ctx.setTransform(A.zoom*this.dpr,0,0,A.zoom*this.dpr,A.x*this.dpr,A.y*this.dpr);for(let i=0;i{class t{constructor(){this.nodeRenderingService=w(Ud),this.edgeRenderingService=w(v3),this.flowEntitiesService=w(ul),this.settingsService=w(ts),this.flowInitialized=bA(!1),w(qe).runOutsideAngular(()=>lt(this,null,function*(){yield l9A(2),this.flowInitialized.set(!0)}))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function l9A(t){return new Promise(e=>{let A=0;function i(){A++,A{class t{constructor(){this.nodeRenderingService=w(Ud),this.flowStatus=w(KI),this.tolerance=me(10),this.lineColor=me("#1b262c"),this.isNodeDragging=pe(()=>etA(this.flowStatus.status())),this.intersections=yy(A=>{let i=this.flowStatus.status();if(etA(i)){let n=i.payload.node,o=ItA(uy(n)),a=this.nodeRenderingService.viewportNodes().filter(I=>I!==n).filter(I=>!n.children().includes(I)).map(I=>ItA(uy(I))),r=[],s=o.x,l=o.y,g=1/0,C=1/0;return a.forEach(I=>{let d=o.left+o.width/2,h=I.left+I.width/2;for(let[m,v,k,S]of[[d,h,h-o.width/2,!0],[o.left,I.left,I.left,!1],[o.left,I.right,I.right,!1],[o.right,I.left,I.left-o.width,!1],[o.right,I.right,I.right-o.width,!1]]){let b=Math.abs(m-v);if(b<=this.tolerance()){let x=Math.min(o.top,I.top),F=Math.max(o.bottom,I.bottom);if(r.push({x:v,y:x,x2:v,y2:F,isCenter:S}),bA.payload.node),we(A=>[A,this.intersections()]),di(([A,i])=>{if(i){let n={x:i.snappedX,y:i.snappedY},o=A.parent()?[A.parent()]:[];A.setPoint(KN(n,o)[0])}}),wr()).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","alignmentHelper",""]],inputs:{tolerance:[1,"tolerance"],lineColor:[1,"lineColor"]},attrs:K7A,decls:1,vars:1,template:function(i,n){i&1&&O(0,J7A,1,1),i&2&&Y(n.isNodeDragging()?0:-1)},encapsulation:2,changeDetection:0})}}return t})();var xy=(()=>{class t{constructor(){this.viewportService=w(Kd),this.flowEntitiesService=w(ul),this.nodesChangeService=w(NN),this.edgesChangeService=w(FN),this.nodeRenderingService=w(Ud),this.edgeRenderingService=w(v3),this.flowSettingsService=w(ts),this.componentEventBusService=w(kN),this.keyboardService=w(SN),this.injector=w(Dt),this.flowRenderingService=w(CtA),this.alignmentHelper=me(!1),this.nodeModels=this.nodeRenderingService.nodes,this.groups=this.nodeRenderingService.groups,this.nonGroups=this.nodeRenderingService.nonGroups,this.edgeModels=this.edgeRenderingService.edges,this.onComponentNodeEvent=kn(this.componentEventBusService.event$),this.nodeTemplateDirective=J0(lQ),this.nodeSvgTemplateDirective=J0(ntA),this.groupNodeTemplateDirective=J0(wy),this.edgeTemplateDirective=J0(my),this.edgeLabelHtmlDirective=J0(itA),this.connectionTemplateDirective=J0(ttA),this.mapContext=So(vN),this.spacePointContext=So.required(w3),this.viewport=this.viewportService.readableViewport.asReadonly(),this.nodesChange=y3(this.nodesChangeService.changes$,{initialValue:[]}),this.edgesChange=y3(this.edgesChangeService.changes$,{initialValue:[]}),this.initialized=this.flowRenderingService.flowInitialized.asReadonly(),this.viewportChange$=po(this.viewportService.readableViewport).pipe(wl(1)),this.nodesChange$=this.nodesChangeService.changes$,this.edgesChange$=this.edgesChangeService.changes$,this.initialized$=po(this.flowRenderingService.flowInitialized),this.markers=this.flowEntitiesService.markers,this.minimap=this.flowEntitiesService.minimap,this.flowOptimization=this.flowSettingsService.optimization,this.flowWidth=this.flowSettingsService.computedFlowWidth,this.flowHeight=this.flowSettingsService.computedFlowHeight}set view(A){this.flowSettingsService.view.set(A)}set minZoom(A){this.flowSettingsService.minZoom.set(A)}set maxZoom(A){this.flowSettingsService.maxZoom.set(A)}set background(A){this.flowSettingsService.background.set(NMA(A))}set optimization(A){this.flowSettingsService.optimization.update(i=>gA(gA({},i),A))}set entitiesSelectable(A){this.flowSettingsService.entitiesSelectable.set(A)}set keyboardShortcuts(A){this.keyboardService.setShortcuts(A)}set connection(A){this.flowEntitiesService.connection.set(A)}get connection(){return this.flowEntitiesService.connection()}set snapGrid(A){this.flowSettingsService.snapGrid.set(A)}set elevateNodesOnSelect(A){this.flowSettingsService.elevateNodesOnSelect.set(A)}set elevateEdgesOnSelect(A){this.flowSettingsService.elevateEdgesOnSelect.set(A)}set nodes(A){let i=Xa(this.injector,()=>vy.nodes(A,this.flowEntitiesService.nodes()));otA(i,this.flowEntitiesService.edges()),this.flowEntitiesService.nodes.set(i),i.forEach(n=>this.nodeRenderingService.pullNode(n))}set edges(A){let i=Xa(this.injector,()=>vy.edges(A,this.flowEntitiesService.edges()));otA(this.flowEntitiesService.nodes(),i),this.flowEntitiesService.edges.set(i)}viewportTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:A,duration:0})}zoomTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:{zoom:A},duration:0})}panTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:A,duration:0})}fitView(A){this.viewportService.fitView(A)}getNode(A){return this.flowEntitiesService.getNode(A)?.rawNode}getDetachedEdges(){return this.flowEntitiesService.getDetachedEdges().map(A=>A.edge)}documentPointToFlowPoint(A,i){let n=this.spacePointContext().documentPointToFlowPoint(A);return i?.spaces?KN(n,this.nodeRenderingService.groups()):n}getIntesectingNodes(A,i={partially:!0}){return tMA(A,this.nodeModels(),i).map(n=>n.rawNode)}toNodeSpace(A,i){let n=this.nodeModels().find(a=>a.rawNode.id===A);if(!n)return{x:1/0,y:1/0};if(i===null)return n.globalPoint();let o=this.nodeModels().find(a=>a.rawNode.id===i);return o?KN(n.globalPoint(),[o])[0]:{x:1/0,y:1/0}}trackNodes(A,{rawNode:i}){return i}trackEdges(A,{edge:i}){return i}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["vflow"]],contentQueries:function(i,n,o){i&1&&ep(o,n.nodeTemplateDirective,lQ,5)(o,n.nodeSvgTemplateDirective,ntA,5)(o,n.groupNodeTemplateDirective,wy,5)(o,n.edgeTemplateDirective,my,5)(o,n.edgeLabelHtmlDirective,itA,5)(o,n.connectionTemplateDirective,ttA,5),i&2&&ur(6)},viewQuery:function(i,n){i&1&&ns(n.mapContext,vN,5)(n.spacePointContext,w3,5),i&2&&ur(2)},inputs:{view:"view",minZoom:"minZoom",maxZoom:"maxZoom",background:"background",optimization:"optimization",entitiesSelectable:"entitiesSelectable",keyboardShortcuts:"keyboardShortcuts",connection:[2,"connection","connection",A=>new fy(A)],snapGrid:"snapGrid",elevateNodesOnSelect:"elevateNodesOnSelect",elevateEdgesOnSelect:"elevateEdgesOnSelect",nodes:"nodes",alignmentHelper:[1,"alignmentHelper"],edges:"edges"},outputs:{onComponentNodeEvent:"onComponentNodeEvent"},features:[Bt([BtA,Kd,KI,ul,NN,FN,Ud,v3,b3,ts,kN,SN,utA,{provide:ON,useClass:t9A},CtA]),Z3([{directive:RMA,outputs:["onNodesChange","onNodesChange","onNodesChange.position","onNodesChange.position","onNodesChange.position.single","onNodesChange.position.single","onNodesChange.position.many","onNodesChange.position.many","onNodesChange.size","onNodesChange.size","onNodesChange.size.single","onNodesChange.size.single","onNodesChange.size.many","onNodesChange.size.many","onNodesChange.add","onNodesChange.add","onNodesChange.add.single","onNodesChange.add.single","onNodesChange.add.many","onNodesChange.add.many","onNodesChange.remove","onNodesChange.remove","onNodesChange.remove.single","onNodesChange.remove.single","onNodesChange.remove.many","onNodesChange.remove.many","onNodesChange.select","onNodesChange.select","onNodesChange.select.single","onNodesChange.select.single","onNodesChange.select.many","onNodesChange.select.many","onEdgesChange","onEdgesChange","onEdgesChange.detached","onEdgesChange.detached","onEdgesChange.detached.single","onEdgesChange.detached.single","onEdgesChange.detached.many","onEdgesChange.detached.many","onEdgesChange.add","onEdgesChange.add","onEdgesChange.add.single","onEdgesChange.add.single","onEdgesChange.add.many","onEdgesChange.add.many","onEdgesChange.remove","onEdgesChange.remove","onEdgesChange.remove.single","onEdgesChange.remove.single","onEdgesChange.remove.many","onEdgesChange.remove.many","onEdgesChange.select","onEdgesChange.select","onEdgesChange.select.single","onEdgesChange.select.single","onEdgesChange.select.many","onEdgesChange.select.many"]}])],decls:11,vars:8,consts:[["flow",""],["rootSvgRef","","rootSvgContext","","rootPointer","","flowSizeController","",1,"root-svg"],["flowDefs","",3,"markers"],["background",""],["mapContext","","spacePointContext",""],["connection","",3,"model","template"],[3,"ngTemplateOutlet"],["previewFlow","",1,"preview-flow",3,"width","height"],["alignmentHelper",""],["alignmentHelper","",3,"tolerance","lineColor"],["node","",3,"model","groupNodeTemplate"],["edge","",3,"model","edgeTemplate","edgeLabelHtmlTemplate"],["node","",3,"model","nodeTemplate","nodeSvgTemplate"],["node","",3,"model","nodeTemplate","nodeSvgTemplate","groupNodeTemplate"]],template:function(i,n){if(i&1&&(Ct(),B(0,"svg",1,0),hA(2,"defs",2)(3,"g",3),B(4,"g",4),O(5,H7A,2,1),hA(6,"g",5),O(7,q7A,6,0),O(8,Z7A,4,0),Q(),O(9,X7A,1,1,":svg:ng-container",6),Q(),O(10,$7A,1,2,"canvas",7)),i&2){let o,a,r;u(2),H("markers",n.markers()),u(3),Y((o=n.alignmentHelper())?5:-1,o),u(),H("model",n.connection)("template",(a=n.connectionTemplateDirective())==null?null:a.templateRef),u(),Y(n.flowOptimization().detachedGroupsLayer?7:-1),u(),Y(n.flowOptimization().detachedGroupsLayer?-1:8),u(),Y((r=n.minimap())?9:-1,r),u(),Y(n.flowOptimization().virtualization?10:-1)}},dependencies:[My,e9A,Sy,A9A,$MA,ZMA,vN,w3,zMA,mtA,JN,Jc,s9A,g9A],styles:["[_nghost-%COMP%]{display:grid;grid-template-columns:1fr;width:100%;height:100%;-webkit-user-select:none;user-select:none}[_nghost-%COMP%] *{box-sizing:border-box}.root-svg[_ngcontent-%COMP%]{grid-row-start:1;grid-column-start:1}.preview-flow[_ngcontent-%COMP%]{pointer-events:none;grid-row-start:1;grid-column-start:1}"],changeDetection:0})}}return t})();var _y=(()=>{class t{constructor(){this.flowSettingsService=w(ts),this.selectionService=w(b3),this.parentEdge=w(JN,{optional:!0}),this.parentNode=w(mtA,{optional:!0}),this.host=w(ce),this.selectOnEvent=this.getEvent$().pipe(di(()=>this.select()),wr()).subscribe()}select(){let A=this.entity();A&&this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(A)}entity(){return this.parentNode?this.parentNode.model():this.parentEdge?this.parentEdge.model():null}getEvent$(){return Lc(this.host.nativeElement,"click")}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","selectable",""]]})}}return t})();var DtA=(()=>{class t{constructor(){this.edge=w(JN),this.flowSettingsService=w(ts),this.edgeRenderingService=w(v3),this.model=this.edge.model(),this.context=this.model.context.$implicit}pull(){this.flowSettingsService.elevateEdgesOnSelect()&&this.edgeRenderingService.pull(this.model)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","customTemplateEdge",""]],hostBindings:function(i,n){i&1&&U("mousedown",function(){return n.pull()})("touchstart",function(){return n.pull()})},attrs:AMA,ngContentSelectors:UN,decls:3,vars:1,consts:[["interactiveEdge",""],[1,"interactive-edge"]],template:function(i,n){i&1&&(Rt(),Ve(0),Ct(),Kn(1,"path",1,0)),i&2&&(u(),te("d",n.context.path()))},styles:[".interactive-edge[_ngcontent-%COMP%]{fill:none;stroke-width:20;stroke:transparent}"],changeDetection:0})}}return t})();var c9A=["canvas"],C9A=["svgCanvas"],I9A=()=>({type:"dots",color:"#424242",size:1,gap:12}),d9A=()=>[12,12],B9A=(t,e)=>e.name;function E9A(t,e){if(t&1){let A=QA();B(0,"div",6)(1,"div",11)(2,"button",12),U("click",function(){T(A);let n=p();return J(n.backToMainCanvas())}),B(3,"mat-icon"),y(4,"arrow_back"),Q()(),B(5,"div",13)(6,"span",14),y(7,"smart_toy"),Q(),B(8,"div",15)(9,"h3",16),y(10),Q(),B(11,"p",17),y(12,"Agent Tool"),Q()()()()()}if(t&2){let A=p();u(2),H("matTooltip",A.getBackButtonTooltip()),u(8),lA(A.currentAgentTool())}}function h9A(t,e){if(t&1){let A=QA();B(0,"span",18),U("click",function(){T(A);let n=p();return J(n.toggleSidePanelRequest.emit())}),y(1,"left_panel_open"),Q()}}function Q9A(t,e){if(t&1){let A=QA();Ct(),B(0,"foreignObject"),rr(),B(1,"div",27),U("click",function(n){return n.stopPropagation()}),B(2,"button",28,0),U("click",function(n){return n.stopPropagation()}),B(4,"mat-icon"),y(5,"add"),Q()(),B(6,"span",29),y(7,"Add sub-agent"),Q(),B(8,"mat-menu",null,1)(10,"button",30),U("click",function(n){let o;T(A);let a=Qi(3),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("LlmAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),B(11,"mat-icon"),y(12,"psychology"),Q(),B(13,"span"),y(14,"LLM Agent"),Q()(),B(15,"button",30),U("click",function(n){let o;T(A);let a=Qi(3),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("SequentialAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),B(16,"mat-icon"),y(17,"more_horiz"),Q(),B(18,"span"),y(19,"Sequential Agent"),Q()(),B(20,"button",30),U("click",function(n){let o;T(A);let a=Qi(3),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("LoopAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),B(21,"mat-icon"),y(22,"sync"),Q(),B(23,"span"),y(24,"Loop Agent"),Q()(),B(25,"button",30),U("click",function(n){let o;T(A);let a=Qi(3),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("ParallelAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),B(26,"mat-icon"),y(27,"density_medium"),Q(),B(28,"span"),y(29,"Parallel Agent"),Q()()()()()}if(t&2){let A=Qi(9),i=p().$implicit;te("width",200)("height",100)("x",i.width()/2-100)("y",i.height()/2-40),u(2),H("matMenuTriggerFor",A)}}function u9A(t,e){t&1&&(Ct(),hA(0,"handle",26))}function f9A(t,e){if(t&1){let A=QA();Ct(),B(0,"g")(1,"rect",21),U("click",function(n){let o=T(A).$implicit,a=p(2);return J(a.onGroupClick(o.node,n))})("pointerdown",function(n){let o=T(A).$implicit,a=p(2);return J(a.onGroupPointerDown(o.node,n))}),Q(),B(2,"foreignObject",22),rr(),B(3,"div",23)(4,"mat-icon",24),y(5),Q(),B(6,"span",25),y(7),Q()()(),O(8,Q9A,30,5,":svg:foreignObject"),O(9,u9A,1,0,":svg:handle",26),Q()}if(t&2){let A,i,n=e.$implicit,o=p(2);u(),ut("stroke",o.isGroupSelected(n.node)?"rgba(0, 187, 234, 0.8)":"rgba(0, 187, 234, 0.3)")("fill",o.isGroupSelected(n.node)?"rgba(0, 187, 234, 0.1)":"rgba(0, 187, 234, 0.03)")("stroke-width",o.isGroupSelected(n.node)?3:2),te("width",n.width())("height",n.height()),u(),te("width",200)("height",32),u(3),lA(o.getAgentIcon(n.node.data==null||(A=n.node.data())==null?null:A.agent_class)),u(2),lA(n.node.data==null||(i=n.node.data())==null?null:i.agent_class),u(),Y(o.isGroupEmpty(n.node.id)?8:-1),u(),Y(o.shouldShowTopHandle(n.node)?9:-1)}}function p9A(t,e){t&1&&(B(0,"span",35),y(1,"Root"),Q())}function m9A(t,e){if(t&1){let A=QA();B(0,"button",43),U("click",function(n){T(A),p();let o=zn(0);return p(2).openDeleteSubAgentDialog(o),J(n.stopPropagation())}),B(1,"mat-icon"),y(2,"delete"),Q()()}}function w9A(t,e){if(t&1){let A=QA();B(0,"div",46),U("click",function(n){let o=T(A).$implicit,a=p(2).$implicit;return p(2).selectTool(o,a.node),J(n.stopPropagation())}),B(1,"mat-icon",47),y(2),Q(),B(3,"span",48),y(4),Q()()}if(t&2){let A=e.$implicit,i=p(4);u(2),lA(i.getToolIcon(A)),u(2),lA(A.name)}}function D9A(t,e){if(t&1&&(B(0,"div",38)(1,"div",44),Ue(2,w9A,5,2,"div",45,B9A),Q()()),t&2){p();let A=zn(3);u(2),Te(A)}}function y9A(t,e){if(t&1){let A=QA();B(0,"div",39)(1,"button",49,2),U("click",function(n){return n.stopPropagation()}),B(3,"span",50),y(4,"+"),Q()(),B(5,"mat-menu",null,3)(7,"button",30),U("click",function(n){let o;T(A);let a=Qi(2),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("LlmAgent",(o=r.node.data())==null?null:o.name,a,n))}),B(8,"mat-icon"),y(9,"psychology"),Q(),B(10,"span"),y(11,"LLM Agent"),Q()(),B(12,"button",30),U("click",function(n){let o;T(A);let a=Qi(2),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("SequentialAgent",(o=r.node.data())==null?null:o.name,a,n))}),B(13,"mat-icon"),y(14,"more_horiz"),Q(),B(15,"span"),y(16,"Sequential Agent"),Q()(),B(17,"button",30),U("click",function(n){let o;T(A);let a=Qi(2),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("LoopAgent",(o=r.node.data())==null?null:o.name,a,n))}),B(18,"mat-icon"),y(19,"sync"),Q(),B(20,"span"),y(21,"Loop Agent"),Q()(),B(22,"button",30),U("click",function(n){let o;T(A);let a=Qi(2),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("ParallelAgent",(o=r.node.data())==null?null:o.name,a,n))}),B(23,"mat-icon"),y(24,"density_medium"),Q(),B(25,"span"),y(26,"Parallel Agent"),Q()()()()}if(t&2){let A=Qi(6);u(),H("matMenuTriggerFor",A)}}function v9A(t,e){t&1&&hA(0,"handle",40)}function b9A(t,e){t&1&&hA(0,"handle",26)}function M9A(t,e){t&1&&hA(0,"handle",41)}function S9A(t,e){t&1&&hA(0,"handle",42)}function k9A(t,e){if(t&1){let A=QA();ta(0)(1),Ht(2,"async"),ta(3),B(4,"div",31),U("click",function(n){let o=T(A).$implicit,a=p(2);return J(a.onCustomTemplateNodeClick(o.node,n))})("pointerdown",function(n){let o=T(A).$implicit,a=p(2);return J(a.onNodePointerDown(o.node,n))}),B(5,"div",32)(6,"div",33)(7,"mat-icon",34),y(8),Q(),y(9),O(10,p9A,2,0,"span",35),Q(),B(11,"div",36),O(12,m9A,3,0,"button",37),Q()(),O(13,D9A,4,0,"div",38),O(14,y9A,27,1,"div",39),O(15,v9A,1,0,"handle",40),O(16,b9A,1,0,"handle",26),O(17,M9A,1,0,"handle",41),O(18,S9A,1,0,"handle",42),Q()}if(t&2){let A=e.$implicit,i=p(2),n=A.node.data==null?null:A.node.data(),o=ga((n==null?null:n.name)||"root_agent"),a=si(2,17,i.toolsMap$);u(3);let s=ga(i.getToolsForNode(o,a)).length>0;u(),RA("custom-node_selected",i.isNodeSelected(A.node))("custom-node_has-tools",s)("in-group",A.node.parentId&&A.node.parentId()),u(4),lA(i.getAgentIcon(n==null?null:n.agent_class)),u(),ue(" ",o," "),u(),Y(i.isRootAgent(o)?10:-1),u(2),Y(i.isRootAgentForCurrentTab(o)?-1:12),u(),Y(s?13:-1),u(),Y(i.shouldShowAddButton(A.node)?14:-1),u(),Y(i.shouldShowLeftHandle(A.node)?15:-1),u(),Y(i.shouldShowTopHandle(A.node)?16:-1),u(),Y(i.shouldShowRightHandle(A.node)?17:-1),u(),Y(i.shouldShowBottomHandle(A.node)?18:-1)}}function x9A(t,e){if(t&1&&(B(0,"vflow",8),Et(1,f9A,10,14,"ng-template",19)(2,k9A,19,20,"ng-template",20),Q()),t&2){let A=p();H("nodes",A.vflowNodes())("edges",A.edges())("background",Kc(4,I9A))("snapGrid",Kc(5,d9A))}}function _9A(t,e){t&1&&(B(0,"div",9)(1,"div",51)(2,"mat-icon",52),y(3,"touch_app"),Q(),B(4,"h4"),y(5,"Start Building Your ADK"),Q(),B(6,"p"),y(7,"Drag components from the left panel to create your workflow"),Q(),B(8,"div",53)(9,"div",54)(10,"mat-icon"),y(11,"drag_indicator"),Q(),B(12,"span"),y(13,"Drag to move nodes"),Q()(),B(14,"div",54)(15,"mat-icon"),y(16,"link"),Q(),B(17,"span"),y(18,"Shift + Click to connect nodes"),Q()()()()())}var cQ=class t{constructor(e,A,i){this.dialog=e;this.agentService=A;this.router=i;this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.agentBuilderService.getSelectedTool().subscribe(n=>{this.selectedTool=n})}_snackBar=w(h2);canvasRef;svgCanvasRef;agentBuilderService=w(e0);cdr=w(wt);showSidePanel=!0;showBuilderAssistant=!1;appNameInput="";toggleSidePanelRequest=new LA;builderAssistantCloseRequest=new LA;ctx;connections=bA([]);nodeId=1;edgeId=1;callbackId=1;toolId=1;appName="";nodes=bA([]);edges=bA([]);workflowShellWidth=340;workflowGroupWidth=420;workflowGroupHeight=220;workflowGroupYOffset=180;workflowGroupXOffset=-40;workflowInnerNodePoint={x:40,y:80};groupNodes=bA([]);vflowNodes=pe(()=>[...this.groupNodes(),...this.nodes()]);selectedAgents=[];selectedTool;selectedCallback;currentAgentTool=bA(null);agentToolBoards=bA(new Map);isAgentToolMode=!1;navigationStack=[];existingAgent=void 0;toolsMap$;nodePositions=new Map;ngOnInit(){this.agentService.getApp().subscribe(e=>{e&&(this.appName=e)}),this.appNameInput&&(this.appName=this.appNameInput),this.agentBuilderService.getNewTabRequest().subscribe(e=>{if(e){let{tabName:A,currentAgentName:i}=e;this.switchToAgentToolBoard(A,i)}}),this.agentBuilderService.getTabDeletionRequest().subscribe(e=>{e&&this.deleteAgentToolBoard(e)}),this.agentBuilderService.getSelectedCallback().subscribe(e=>{this.selectedCallback=e}),this.agentBuilderService.getAgentCallbacks().subscribe(e=>{if(e){let A=this.nodes().find(i=>i.data?i.data().name===e.agentName:void 0);if(A&&A.data){let i=A.data();i.callbacks=e.callbacks,A.data.set(i)}}}),this.agentBuilderService.getDeleteSubAgentSubject().subscribe(e=>{e&&this.openDeleteSubAgentDialog(e)}),this.agentBuilderService.getAddSubAgentSubject().subscribe(e=>{e.parentAgentName&&this.addSubAgent(e.parentAgentName,e.agentClass,e.isFromEmptyGroup)}),this.agentBuilderService.getSelectedNode().subscribe(e=>{this.selectedAgents=this.nodes().filter(A=>A.data&&A.data().name===e?.name)}),this.toolsMap$.subscribe(e=>{this.nodes().some(i=>i.parentId&&i.parentId())&&this.groupNodes().length>0&&this.updateGroupDimensions()})}ngOnChanges(e){e.appNameInput&&e.appNameInput.currentValue&&(this.appName=e.appNameInput.currentValue)}ngAfterViewInit(){}onCustomTemplateNodeClick(e,A){this.shouldIgnoreNodeInteraction(A.target)||this.selectAgentNode(e,{openConfig:!0})}onNodePointerDown(e,A){this.shouldIgnoreNodeInteraction(A.target)||this.selectAgentNode(e,{openConfig:!1})}onGroupClick(e,A){if(A.stopPropagation(),!e?.data)return;let i=e.data().name,n=this.nodes().find(o=>o.data&&o.data().name===i);n&&this.selectAgentNode(n,{openConfig:!0})}onGroupPointerDown(e,A){if(A.stopPropagation(),!e?.data)return;let i=e.data().name,n=this.nodes().find(o=>o.data&&o.data().name===i);n&&this.selectAgentNode(n,{openConfig:!1})}onCanvasClick(e){let A=e.target;if(!A)return;let i=[".custom-node",".action-button-bar",".add-subagent-btn",".open-panel-btn",".agent-tool-banner",".mat-mdc-menu-panel"];A.closest(i.join(","))||this.clearCanvasSelection()}shouldIgnoreNodeInteraction(e){return e?!!e.closest("mat-chip, .add-subagent-btn, .mat-mdc-menu-panel"):!1}selectAgentNode(e,A={}){if(!e?.data)return;let i=this.agentBuilderService.getNode(e.data().name);i&&(this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedNode(i),this.nodePositions.set(i.name,gA({},e.point())),A.openConfig&&this.agentBuilderService.requestSideTabChange("config"))}handleAgentTypeSelection(e,A,i,n,o=!1){n.stopPropagation(),i?.closeMenu(),this.onAgentTypeSelected(e,A,o)}clearCanvasSelection(){!this.selectedAgents.length&&!this.selectedTool&&!this.selectedCallback||(this.selectedAgents=[],this.selectedTool=void 0,this.selectedCallback=void 0,this.agentBuilderService.setSelectedNode(void 0),this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedCallback(void 0),this.cdr.markForCheck())}onAddResource(e){}onAgentTypeSelected(e,A,i=!1){A&&this.addSubAgent(A,e,i)}generateNodeId(){return this.nodeId+=1,this.nodeId.toString()}generateEdgeId(){return this.edgeId+=1,this.edgeId.toString()}createNode(e,A,i){let n=bA(e),a={id:this.generateNodeId(),point:bA(gA({},A)),type:"html-template",data:n};return i&&(a.parentId=bA(i)),this.nodePositions.set(e.name,gA({},a.point())),a}createWorkflowGroup(e,A,i,n,o,a){let r,s=null;if(n){let d=(o||this.groupNodes()).find(h=>h.id===n);if(d){let h=d.point(),E=d.height?d.height():this.workflowGroupHeight;if(a&&o){let f=a.filter(m=>m.parentId&&m.parentId()===d.id);if(f.length>0){let z=0;for(let P of f){let Z=P.data?P.data():void 0,tA=120;Z&&Z.tools&&Z.tools.length>0&&(tA+=20+Z.tools.length*36),z=Math.max(z,tA)}E=Math.max(220,80+z+40)}}r={x:h.x,y:h.y+E+60},s=null}else r={x:i.x+this.workflowGroupXOffset,y:i.y+this.workflowGroupYOffset}}else r={x:i.x+this.workflowGroupXOffset,y:i.y+this.workflowGroupYOffset};let l=this.generateNodeId(),g={id:l,point:bA(r),type:"template-group",data:bA(e),parentId:bA(s),width:bA(this.workflowGroupWidth),height:bA(this.workflowGroupHeight)},C=e.agent_class==="SequentialAgent"?{id:this.generateEdgeId(),source:A.id,sourceHandle:"source-bottom",target:l,targetHandle:"target-top"}:null;return{groupNode:g,edge:C}}calculateWorkflowChildPosition(e,A){let r=(A-20)/2;return{x:45+e*428,y:r}}createAgentNodeWithGroup(e,A,i,n,o){let a=this.createNode(e,A,i),r=null,s=null;if(this.isWorkflowAgent(e.agent_class)){let l=this.createWorkflowGroup(e,a,A,i,n,o);r=l.groupNode,s=l.edge}return{shellNode:a,groupNode:r,groupEdge:s}}createWorkflowChildEdge(e,A){return this.createWorkflowChildEdgeFromArrays(e,A,this.nodes(),this.groupNodes())}createWorkflowChildEdgeFromArrays(e,A,i,n){if(!A)return null;let o=n.find(r=>r.id===A);if(!o||!o.data)return null;let a=o.data().agent_class;if(a==="LoopAgent"||a==="ParallelAgent"){let r=i.find(s=>s.data&&s.data().name===o.data().name);if(r)return{id:this.generateEdgeId(),source:r.id,sourceHandle:"source-bottom",target:e.id,targetHandle:"target-top"}}if(a==="SequentialAgent"){let r=i.filter(g=>g.parentId&&g.parentId()===A);if(r.length===0)return null;r.sort((g,C)=>g.point().x-C.point().x);let s=r.findIndex(g=>g.id===e.id);if(s<=0)return null;let l=r[s-1];return{id:this.generateEdgeId(),source:l.id,sourceHandle:"source-right",target:e.id,targetHandle:"target-left"}}return null}isWorkflowAgent(e){return e?e==="SequentialAgent"||e==="ParallelAgent"||e==="LoopAgent":!1}addSubAgent(e,A="LlmAgent",i=!1){let n=this.nodes().find(C=>C.data&&C.data().name===e);if(!n||!n.data)return;let a={name:this.agentBuilderService.getNextSubAgentName(),agent_class:A,model:"gemini-2.5-flash",instruction:"You are a sub-agent that performs specialized tasks.",isRoot:!1,sub_agents:[],tools:[]},r=this.isWorkflowAgent(n.data().agent_class),s=n.parentId&&n.parentId()&&this.groupNodes().some(C=>C.id===n.parentId()),l,g=null;if(i&&r){let C=n.data();if(!C)return;let I=this.groupNodes().find(v=>v.data&&v.data()?.name===C.name);if(!I){console.error("Could not find group for workflow node");return}let d=this.agentBuilderService.getNode(n.data().name);if(!d){console.error("Could not find clicked agent data");return}let h=d.sub_agents.length,E=I.height?I.height():this.workflowGroupHeight,f=this.calculateWorkflowChildPosition(h,E),m=this.createAgentNodeWithGroup(a,f,I.id);l=m.shellNode,g=m.groupNode,d.sub_agents.push(a),g&&this.groupNodes.set([...this.groupNodes(),g]),m.groupEdge&&this.edges.set([...this.edges(),m.groupEdge])}else if(s){let C=n.parentId()??void 0,I=this.groupNodes().find(k=>k.id===C);if(!I||!I.data){console.error("Could not find parent group node");return}let d=I.data().name,h=this.agentBuilderService.getNode(d);if(!h){console.error("Could not find workflow parent agent");return}let E=h.sub_agents.length,f=I.height?I.height():this.workflowGroupHeight,m=this.calculateWorkflowChildPosition(E,f),v=this.createAgentNodeWithGroup(a,m,C);l=v.shellNode,g=v.groupNode,h.sub_agents.push(a),g&&this.groupNodes.set([...this.groupNodes(),g]),v.groupEdge&&this.edges.set([...this.edges(),v.groupEdge])}else{let C=n.data().sub_agents.length,I={x:n.point().x+C*400,y:n.point().y+300},d=this.createAgentNodeWithGroup(a,I);l=d.shellNode,g=d.groupNode;let h=this.agentBuilderService.getNode(n.data().name);h&&h.sub_agents.push(a),g&&this.groupNodes.set([...this.groupNodes(),g]),d.groupEdge&&this.edges.set([...this.edges(),d.groupEdge])}if(this.agentBuilderService.addNode(a),this.nodes.set([...this.nodes(),l]),this.selectedAgents=[l],(s||r)&&this.updateGroupDimensions(),r||s){let C=l.parentId?l.parentId()??void 0:void 0,I=this.createWorkflowChildEdge(l,C);I&&this.edges.set([...this.edges(),I])}else{let C={id:this.generateEdgeId(),source:n.id,sourceHandle:"source-bottom",target:l.id,targetHandle:"target-top"};this.edges.set([...this.edges(),C])}this.agentBuilderService.setSelectedNode(a),this.agentBuilderService.requestSideTabChange("config")}addTool(e){let A=this.nodes().find(o=>o.id===e);if(!A||!A.data)return;let i=A.data();if(!i)return;this.dialog.open(v2,{width:"500px"}).afterClosed().subscribe(o=>{if(o)if(o.toolType==="Agent Tool")this.createAgentTool(i.name);else{let a={toolType:o.toolType,name:o.name};this.agentBuilderService.addTool(i.name,a),this.agentBuilderService.setSelectedTool(a)}})}addCallback(e){let A=this.nodes().find(o=>o.id===e);if(!A||!A.data)return;let i={name:`callback_${this.callbackId}`,type:"before_agent",code:`def callback_function(callback_context): + # Add your callback logic here + return None`,description:"Auto-generated callback"};this.callbackId++;let n=this.agentBuilderService.addCallback(A.data().name,i);n.success||this._snackBar.open(n.error||"Failed to add callback","Close",{duration:3e3,panelClass:["error-snackbar"]})}createAgentTool(e){this.dialog.open(vc,{width:"750px",height:"310px",data:{title:"Create Agent Tool",message:"Please enter a name for the agent tool:",confirmButtonText:"Create",showInput:!0,inputLabel:"Agent Tool Name",inputPlaceholder:"Enter agent tool name"}}).afterClosed().subscribe(i=>{i&&typeof i=="string"&&this.agentBuilderService.requestNewTab(i,e)})}deleteTool(e,A){let i=A.toolType==="Agent Tool",n=i&&A.toolAgentName||A.name;this.dialog.open(vc,{data:{title:i?"Delete Agent Tool":"Delete Tool",message:i?`Are you sure you want to delete the agent tool "${n}"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(a=>{a==="confirm"&&this.deleteToolWithoutDialog(e,A)})}deleteToolWithoutDialog(e,A){if(A.toolType==="Agent Tool"){let i=A.toolAgentName||A.name;this.deleteAgentToolAndBoard(e,A,i)}else this.agentBuilderService.deleteTool(e,A)}deleteAgentToolAndBoard(e,A,i){this.agentBuilderService.deleteTool(e,A),this.agentBuilderService.requestTabDeletion(i)}deleteCallback(e,A){this.dialog.open(vc,{data:{title:"Delete Callback",message:`Are you sure you want to delete ${A.name}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(n=>{if(n==="confirm"){let o=this.agentBuilderService.deleteCallback(e,A);o.success||this._snackBar.open(o.error||"Failed to delete callback","Close",{duration:3e3,panelClass:["error-snackbar"]}),this.cdr.detectChanges()}})}openDeleteSubAgentDialog(e){this.dialog.open(vc,{data:{title:"Delete sub agent",message:`Are you sure you want to delete ${e}? This will also delete all the underlying sub agents and tools.`,confirmButtonText:"Delete"}}).afterClosed().subscribe(i=>{i==="confirm"&&this.deleteSubAgent(e)})}deleteSubAgent(e){let A=this.agentBuilderService.getNode(e);if(!A)return;let i=this.agentBuilderService.getParentNode(this.agentBuilderService.getRootNode(),A,void 0,this.agentToolBoards());i&&(this.deleteSubAgentHelper(A,i),this.agentBuilderService.getSelectedNode().pipe(uo(1),gt(n=>!!n)).subscribe(n=>{this.agentBuilderService.getNodes().includes(n)||this.agentBuilderService.setSelectedNode(i)}))}isNodeInSequentialWorkflow(e){if(!e.parentId||!e.parentId())return!1;let A=e.parentId(),i=this.groupNodes().find(n=>n.id===A);return!i||!i.data?!1:i.data().agent_class==="SequentialAgent"}getSequentialSiblings(e){if(!e.parentId||!e.parentId())return{previous:void 0,next:void 0};let A=e.parentId(),i=this.nodes().filter(o=>o.parentId&&o.parentId()===A);i.sort((o,a)=>o.point().x-a.point().x);let n=i.findIndex(o=>o.id===e.id);return n===-1?{previous:void 0,next:void 0}:{previous:n>0?i[n-1]:void 0,next:nn.data&&n.data().name===e.name);if(i){let n=this.isNodeInSequentialWorkflow(i),o,a;if(n){let s=this.getSequentialSiblings(i);o=s.previous,a=s.next}this.nodes.set(this.nodes().filter(s=>s.id!==i.id));let r=this.groupNodes().find(s=>s.data&&s.data().name===e.name);if(r){this.groupNodes.set(this.groupNodes().filter(l=>l.id!==r.id));let s=this.edges().filter(l=>l.target!==i.id&&l.source!==i.id&&l.target!==r.id&&l.source!==r.id);this.edges.set(s)}else{let s=this.edges().filter(l=>l.target!==i.id&&l.source!==i.id);this.edges.set(s)}if(n&&o&&a){let s={id:this.generateEdgeId(),source:o.id,sourceHandle:"source-right",target:a.id,targetHandle:"target-left"};this.edges.set([...this.edges(),s])}}this.nodePositions.delete(e.name),A.sub_agents=A.sub_agents.filter(n=>n.name!==e.name),this.agentBuilderService.deleteNode(e),i&&i.parentId&&i.parentId()&&this.updateGroupDimensions()}selectTool(e,A){if(e.toolType==="Agent Tool"){let i=e.name;this.switchToAgentToolBoard(i);return}if(e.toolType==="Function tool"||e.toolType==="Built-in tool"){if(A.data){let i=this.agentBuilderService.getNode(A.data().name);i&&this.editTool(e,i)}return}if(A.data){let i=this.agentBuilderService.getNode(A.data().name);i&&this.agentBuilderService.setSelectedNode(i)}this.agentBuilderService.setSelectedTool(e)}editTool(e,A){let i;e.toolType==="Built-in tool"?i=this.dialog.open(kd,{width:"700px",maxWidth:"90vw",data:{toolName:e.name,isEditMode:!0,toolArgs:e.args}}):i=this.dialog.open(v2,{width:"500px",data:{toolType:e.toolType,toolName:e.name,isEditMode:!0}}),i.afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=A.tools?.findIndex(a=>a.name===e.name);o!==void 0&&o!==-1&&A.tools&&(A.tools[o].name=n.name,n.args&&(A.tools[o].args=n.args),this.agentBuilderService.setAgentTools(A.name,A.tools))}})}selectCallback(e,A){if(A.data){let i=this.agentBuilderService.getNode(A.data().name);i&&this.agentBuilderService.setSelectedNode(i)}this.agentBuilderService.setSelectedCallback(e)}openToolsTab(e){if(e.data){let A=this.agentBuilderService.getNode(e.data().name);A&&this.agentBuilderService.setSelectedNode(A)}this.agentBuilderService.requestSideTabChange("tools")}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A){this._snackBar.open("Please create an agent first.","OK");return}let i=new FormData,n=this.agentToolBoards();s0.generateYamlFile(A,i,e,n),this.agentService.agentBuild(i).subscribe(o=>{o?this.router.navigate(["/"],{queryParams:{app:e}}).then(()=>{window.location.reload()}):this._snackBar.open("Something went wrong, please try again","OK")})}isRootAgent(e){let A=this.agentBuilderService.getRootNode();return A?A.name===e:!1}isRootAgentForCurrentTab(e){return this.isAgentToolMode&&this.currentAgentTool()?e===this.currentAgentTool():this.isRootAgent(e)}shouldShowHorizontalHandle(e,A){if(!e.parentId||!e.parentId())return!1;let i=e.parentId(),n=this.groupNodes().find(s=>s.id===i);if(!n||!n.data||n.data().agent_class!=="SequentialAgent")return!1;let a=this.nodes().filter(s=>s.parentId&&s.parentId()===i);if(a.length<=1)return!1;a.sort((s,l)=>s.point().x-l.point().x);let r=a.findIndex(s=>s.id===e.id);return A==="left"?r>0:r0):!1}shouldShowTopHandle(e){let A=e.data?e.data():void 0,i=A?.name,n=i?this.isRootAgent(i):!1;if(e.type==="template-group")return A?.agent_class==="SequentialAgent";if(n)return!1;if(e.parentId&&e.parentId()){let a=e.parentId(),r=this.groupNodes().find(s=>s.id===a);if(r&&r.data){let s=r.data().agent_class;if(s==="LoopAgent"||s==="ParallelAgent")return!0}return!1}return!0}getToolsForNode(e,A){return!e||!A?[]:A.get(e)??[]}loadFromYaml(e,A){try{let i=iE(e);this.agentBuilderService.clear(),this.nodePositions.clear(),this.agentToolBoards.set(new Map),this.agentBuilderService.setAgentToolBoards(new Map),this.currentAgentTool.set(null),this.isAgentToolMode=!1,this.navigationStack=[];let n=Ye(gA({name:i.name||"root_agent",agent_class:i.agent_class||"LlmAgent",model:i.model||"gemini-2.5-flash",instruction:i.instruction||"",description:i.description||""},i.max_iterations&&{max_iterations:i.max_iterations}),{isRoot:!0,sub_agents:i.sub_agents||[],tools:this.parseToolsFromYaml(i.tools||[]),callbacks:this.parseCallbacksFromYaml(i)});this.agentBuilderService.addNode(n),this.agentBuilderService.setSelectedNode(n),this.processAgentToolsFromYaml(n.tools||[],A),this.loadAgentBoard(n)}catch(i){console.error("Error parsing YAML:",i)}}parseToolsFromYaml(e){return e.map(A=>{let i={name:A.name,toolType:this.determineToolType(A),toolAgentName:A.name};if(A.name==="AgentTool"&&A.args&&A.args.agent&&A.args.agent.config_path){i.toolType="Agent Tool";let o=A.args.agent.config_path.replace("./","").replace(".yaml","");i.name=o,i.toolAgentName=o,i.args=A.args}else A.args&&(i.args=A.args);return i})}parseCallbacksFromYaml(e){let A=[];return Object.keys(e).forEach(i=>{if(i.endsWith("_callback")&&Array.isArray(e[i])){let n=i.replace("_callback","");e[i].forEach(o=>{o.name&&A.push({name:o.name,type:n})})}}),A}determineToolType(e){return e.name==="AgentTool"&&e.args&&e.args.agent?"Agent Tool":e.name&&e.name.includes(".")&&e.args?"Custom tool":e.name&&e.name.includes(".")&&!e.args?"Function tool":"Built-in tool"}processAgentToolsFromYaml(e,A){let i=e.filter(n=>n.toolType==="Agent Tool");for(let n of i)this.agentToolBoards().has(n.name)||this.loadAgentToolConfiguration(n,A)}loadAgentToolConfiguration(e,A){let i=e.name;this.agentService.getSubAgentBuilder(A,`${i}.yaml`).subscribe({next:n=>{if(n)try{let o=iE(n),a=Ye(gA({name:o.name||i,agent_class:o.agent_class||"LlmAgent",model:o.model||"gemini-2.5-flash",instruction:o.instruction||`You are the ${i} agent that can be used as a tool by other agents.`,description:o.description||""},o.max_iterations&&{max_iterations:o.max_iterations}),{isRoot:!1,sub_agents:o.sub_agents||[],tools:this.parseToolsFromYaml(o.tools||[]),callbacks:this.parseCallbacksFromYaml(o),isAgentTool:!0,skip_summarization:!!e.args?.skip_summarization}),r=this.agentToolBoards();if(r.set(i,a),this.agentToolBoards.set(r),this.agentBuilderService.setAgentToolBoards(r),this.agentBuilderService.addNode(a),this.processAgentToolsFromYaml(a.tools||[],A),a.sub_agents&&a.sub_agents.length>0)for(let s of a.sub_agents)s.config_path&&this.agentService.getSubAgentBuilder(A,s.config_path).subscribe(l=>{if(l){let g=iE(l);this.processAgentToolsFromYaml(this.parseToolsFromYaml(g.tools||[]),A)}})}catch(o){console.error(`Error parsing YAML for agent tool ${i}:`,o),this.createDefaultAgentToolConfiguration(e)}else this.createDefaultAgentToolConfiguration(e)},error:n=>{console.error(`Error loading agent tool configuration for ${i}:`,n),this.createDefaultAgentToolConfiguration(e)}})}createDefaultAgentToolConfiguration(e){let A=e.name,i={name:A,agent_class:"LlmAgent",model:"gemini-2.5-flash",instruction:`You are the ${A} agent that can be used as a tool by other agents.`,isRoot:!1,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!!e.args?.skip_summarization},n=this.agentToolBoards();n.set(A,i),this.agentToolBoards.set(n),this.agentBuilderService.setAgentToolBoards(n),this.agentBuilderService.addNode(i)}loadAgentTools(e){e.tools?(e.tools=e.tools.filter(A=>A.name&&A.name.trim()!==""),e.tools.forEach(A=>{A.toolType!=="Agent Tool"&&(A.name.includes(".")&&A.args?A.toolType="Custom tool":A.name.includes(".")&&!A.args?A.toolType="Function tool":A.toolType="Built-in tool")})):e.tools=[]}isNodeSelected(e){return this.selectedAgents.includes(e)}isGroupSelected(e){if(!e.data)return!1;let A=e.data().name,i=this.nodes().find(n=>n.data&&n.data().name===A);return i?this.isNodeSelected(i):!1}loadSubAgents(e,A){return lt(this,null,function*(){let i=[{node:A,depth:1,index:1,parentShellId:void 0,parentAgent:void 0,parentGroupId:void 0}],n=[],o=[],a=[];for(;i.length>0;){let{node:r,depth:s,index:l,parentShellId:g,parentAgent:C,parentGroupId:I}=i.shift(),d=r;if(r.config_path)try{let S=yield J3(this.agentService.getSubAgentBuilder(e,r.config_path));d=iE(S),d.tools&&(d.tools=this.parseToolsFromYaml(d.tools||[])),this.processAgentToolsFromYaml(d.tools||[],e)}catch(S){console.error(`Failed to load agent from ${r.config_path}`,S);continue}if(C&&C.sub_agents){let S=C.sub_agents.indexOf(r);S!==-1&&(C.sub_agents[S]=d,this.agentBuilderService.addNode(C))}this.agentBuilderService.addNode(d);let h=this.nodePositions.get(d.name),E=this.isWorkflowAgent(d.agent_class),f=C?this.isWorkflowAgent(C.agent_class):!1,m,v,k=null;if(f&&!d.isRoot){let S=C?.sub_agents.indexOf(d)??l,b=o.find(z=>z.id===I),x=b?.height?b.height():this.workflowGroupHeight;m=h??this.calculateWorkflowChildPosition(S,x);let F=this.createAgentNodeWithGroup(d,m,I??void 0,o,n);v=F.shellNode,k=F.groupNode,n.push(v),k&&o.push(k),F.groupEdge&&a.push(F.groupEdge)}else{if(h)m=h;else if(!g)m={x:100,y:150};else{let b=n.find(x=>x.id===g);b?m={x:b.point().x+(l-1)*400,y:b.point().y+300}:m={x:100,y:s*150+50}}let S=this.createAgentNodeWithGroup(d,m,void 0,o,n);v=S.shellNode,k=S.groupNode,n.push(v),E&&!d.isRoot&&(k&&o.push(k),S.groupEdge&&a.push(S.groupEdge))}if(g)if(I){let S=this.createWorkflowChildEdgeFromArrays(v,I,n,o);S&&a.push(S)}else{let S={id:this.generateEdgeId(),source:g,sourceHandle:"source-bottom",target:v.id,targetHandle:"target-top"};a.push(S)}if(d.sub_agents&&d.sub_agents.length>0){let S=1,b=E&&k?k.id:I;for(let x of d.sub_agents)i.push({node:x,parentShellId:v.id,depth:s+1,index:S,parentAgent:d,parentGroupId:b}),S++}}this.nodes.set(n),this.groupNodes.set(o),this.edges.set(a),this.updateGroupDimensions()})}switchToAgentToolBoard(e,A){let i=this.currentAgentTool()||"main";i!==e&&this.navigationStack.push(i);let n=this.agentToolBoards(),o=n.get(e);if(!o){o={isRoot:!1,name:e,agent_class:"LlmAgent",model:"gemini-2.5-flash",instruction:`You are the ${e} agent that can be used as a tool by other agents.`,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!1};let a=new Map(n);a.set(e,o),this.agentToolBoards.set(a),this.agentBuilderService.setAgentToolBoards(a),A?this.addAgentToolToAgent(e,A):this.addAgentToolToRoot(e)}this.currentAgentTool.set(e),this.isAgentToolMode=!0,this.loadAgentBoard(o),this.agentBuilderService.setSelectedNode(o),this.agentBuilderService.requestSideTabChange("config")}backToMainCanvas(){if(this.navigationStack.length>0){let e=this.navigationStack.pop();if(e==="main"){this.currentAgentTool.set(null),this.isAgentToolMode=!1;let A=this.agentBuilderService.getRootNode();A&&(this.loadAgentBoard(A),this.agentBuilderService.setSelectedNode(A),this.agentBuilderService.requestSideTabChange("config"))}else{let i=this.agentToolBoards().get(e);i&&(this.currentAgentTool.set(e),this.isAgentToolMode=!0,this.loadAgentBoard(i),this.agentBuilderService.setSelectedNode(i),this.agentBuilderService.requestSideTabChange("config"))}}else{this.currentAgentTool.set(null),this.isAgentToolMode=!1;let e=this.agentBuilderService.getRootNode();e&&(this.loadAgentBoard(e),this.agentBuilderService.setSelectedNode(e),this.agentBuilderService.requestSideTabChange("config"))}}loadAgentBoard(e){return lt(this,null,function*(){if(this.captureCurrentNodePositions(),this.nodes.set([]),this.groupNodes.set([]),this.edges.set([]),this.nodeId=0,this.edgeId=0,this.loadAgentTools(e),this.agentBuilderService.addNode(e),e.tools&&e.tools.length>0?this.agentBuilderService.setAgentTools(e.name,e.tools):this.agentBuilderService.setAgentTools(e.name,[]),e.sub_agents&&e.sub_agents.length>0)yield this.loadSubAgents(this.appName,e);else{let A=this.nodePositions.get(e.name)??{x:100,y:150},i=this.createNode(e,A);if(this.nodes.set([i]),this.isWorkflowAgent(e.agent_class)){let{groupNode:n,edge:o}=this.createWorkflowGroup(e,i,A);this.groupNodes.set([n]),o&&this.edges.set([o])}}this.agentBuilderService.setSelectedNode(e)})}addAgentToolToAgent(e,A){let i=this.agentBuilderService.getNode(A);if(i){if(i.tools&&i.tools.some(o=>o.name===e))return;let n={name:e,toolType:"Agent Tool",toolAgentName:e};i.tools||(i.tools=[]),i.tools.push(n),i.tools=i.tools.filter(o=>o.name&&o.name.trim()!==""),this.agentBuilderService.setAgentTools(A,i.tools)}}addAgentToolToRoot(e){let A=this.agentBuilderService.getRootNode();if(A){if(A.tools&&A.tools.some(n=>n.name===e))return;let i={name:e,toolType:"Agent Tool",toolAgentName:e};A.tools||(A.tools=[]),A.tools.push(i),this.agentBuilderService.setAgentTools("root_agent",A.tools)}}deleteAgentToolBoard(e){let A=this.agentToolBoards(),i=new Map(A);i.delete(e),this.agentToolBoards.set(i),this.agentBuilderService.setAgentToolBoards(i);let n=this.agentBuilderService.getNodes();for(let o of n)o.tools&&(o.tools=o.tools.filter(a=>!(a.toolType==="Agent Tool"&&(a.toolAgentName===e||a.name===e))),this.agentBuilderService.setAgentTools(o.name,o.tools));this.navigationStack=this.navigationStack.filter(o=>o!==e),this.currentAgentTool()===e&&this.backToMainCanvas()}getBackButtonTooltip(){if(this.navigationStack.length>0){let e=this.navigationStack[this.navigationStack.length-1];return e==="main"?"Back to Main Canvas":`Back to ${e}`}return"Back to Main Canvas"}onBuilderAssistantClose(){this.builderAssistantCloseRequest.emit()}reloadCanvasFromYaml(){this.appNameInput&&this.agentService.getAgentBuilderTmp(this.appNameInput).subscribe({next:e=>{e&&this.loadFromYaml(e,this.appNameInput)},error:e=>{console.error("Error reloading canvas:",e)}})}captureCurrentNodePositions(){for(let e of this.nodes()){if(!e?.data)continue;let A=e.data();A&&this.nodePositions.set(A.name,gA({},e.point()))}}updateGroupDimensions(){for(let s of this.groupNodes()){if(!s.data)continue;let l=s.data().name,g=this.nodes().filter(m=>m.parentId&&m.parentId()===s.id);if(g.length===0){s.width&&s.width.set(480),s.height&&s.height.set(220);continue}g.sort((m,v)=>m.point().x-v.point().x),g.forEach((m,v)=>{let F={x:45+v*428,y:80};if(m.point.set(F),m.data){let z=m.data();z&&this.nodePositions.set(z.name,F)}});let C=1/0,I=1/0,d=-1/0,h=-1/0;for(let m of g){let v=m.point(),k=m.data?m.data():void 0,S=120;k&&k.tools&&k.tools.length>0&&(S+=20+k.tools.length*36),C=Math.min(C,v.x),I=Math.min(I,v.y),d=Math.max(d,v.x+340+68),h=Math.max(h,v.y+S)}let E=d-C+80,f=h-I+80;s.width&&s.width.set(Math.max(480,E)),s.height&&s.height.set(Math.max(220,f))}}getToolIcon(e){return sE(e.name,e.toolType)}getAgentIcon(e){switch(e){case"SequentialAgent":return"more_horiz";case"LoopAgent":return"sync";case"ParallelAgent":return"density_medium";default:return"psychology"}}isGroupEmpty(e){return!this.nodes().some(i=>i.parentId&&i.parentId()===e)}shouldShowAddButton(e){let A=e.data?e.data():void 0;if(!A)return!1;let i=this.isWorkflowAgent(A.agent_class),n=e.parentId&&e.parentId();if(i&&!n||!this.isNodeSelected(e))return!1;if(n&&e.parentId){let o=e.parentId(),a=this.nodes().filter(s=>s.parentId&&s.parentId()===o);if(a.length===0)return!0;let r=a.reduce((s,l)=>l.point().x>s.point().x?l:s,a[0]);return e.id===r.id}return!0}static \u0275fac=function(A){return new(A||t)(ct(Or),ct(eQ),ct(ls))};static \u0275cmp=SA({type:t,selectors:[["app-canvas"]],viewQuery:function(A,i){if(A&1&&Jt(c9A,5)(C9A,5),A&2){let n;ae(n=re())&&(i.canvasRef=n.first),ae(n=re())&&(i.svgCanvasRef=n.first)}},inputs:{showSidePanel:"showSidePanel",showBuilderAssistant:"showBuilderAssistant",appNameInput:"appNameInput"},outputs:{toggleSidePanelRequest:"toggleSidePanelRequest",builderAssistantCloseRequest:"builderAssistantCloseRequest"},features:[Yt],decls:7,vars:8,consts:[["emptyGroupMenuTrigger","matMenuTrigger"],["emptyGroupMenu","matMenu"],["agentMenuTrigger","matMenuTrigger"],["agentMenu","matMenu"],[1,"canvas-container"],[1,"canvas-workspace",3,"click"],[1,"agent-tool-banner"],["matTooltip","Open panel",1,"material-symbols-outlined","open-panel-btn"],["view","auto",3,"nodes","edges","background","snapGrid"],[1,"canvas-instructions"],[3,"closePanel","reloadCanvas","isVisible","appName"],[1,"banner-content"],["mat-icon-button","",1,"back-to-main-btn",3,"click","matTooltip"],[1,"banner-info"],[1,"material-symbols-outlined","banner-icon"],[1,"banner-text"],[1,"agent-tool-name"],[1,"banner-subtitle"],["matTooltip","Open panel",1,"material-symbols-outlined","open-panel-btn",3,"click"],["groupNode",""],["nodeHtml",""],["selectable","","rx","12","ry","12",3,"click","pointerdown"],["x","12","y","12"],[1,"workflow-group-chip"],[1,"workflow-chip-icon"],[1,"workflow-chip-label"],["type","target","position","top","id","target-top"],[1,"empty-group-placeholder",3,"click"],["mat-icon-button","","matTooltip","Add sub-agent","aria-label","Add sub-agent",3,"click","matMenuTriggerFor"],[1,"empty-group-label"],["mat-menu-item","",3,"click"],["selectable","",1,"custom-node",3,"click","pointerdown"],[1,"node-title-wrapper"],[1,"node-title"],[2,"margin-right","5px"],[1,"node-badge"],[1,"action-button-bar"],["matIconButton","","matTooltip","Delete sub-agent","aria-label","Delete sub-agent",1,"action-btn","delete-subagent-btn"],[1,"tools-container"],[1,"add-subagent-container"],["type","target","position","left","id","target-left"],["type","source","position","right","id","source-right"],["type","source","position","bottom","id","source-bottom"],["matIconButton","","matTooltip","Delete sub-agent","aria-label","Delete sub-agent",1,"action-btn","delete-subagent-btn",3,"click"],[1,"tools-list"],[1,"tool-item"],[1,"tool-item",3,"click"],[1,"tool-item-icon"],[1,"tool-item-name"],["matIconButton","","matTooltip","Add sub-agent","aria-label","Add sub-agent",1,"add-subagent-btn",3,"click","matMenuTriggerFor"],[1,"add-subagent-symbol"],[1,"instruction-content"],[1,"instruction-icon"],[1,"instruction-tips"],[1,"tip"]],template:function(A,i){A&1&&(B(0,"div",4)(1,"div",5),U("click",function(o){return i.onCanvasClick(o)}),O(2,E9A,13,2,"div",6),O(3,h9A,2,0,"span",7),O(4,x9A,3,6,"vflow",8),O(5,_9A,19,0,"div",9),Q(),B(6,"app-builder-assistant",10),U("closePanel",function(){return i.onBuilderAssistantClose()})("reloadCanvas",function(){return i.reloadCanvasFromYaml()}),Q()()),A&2&&(u(),RA("has-banner",i.currentAgentTool()),u(),Y(i.currentAgentTool()?2:-1),u(),Y(i.showSidePanel?-1:3),u(),Y(i.vflowNodes().length>0?4:-1),u(),Y(i.vflowNodes().length===0?5:-1),u(),H("isVisible",i.showBuilderAssistant)("appName",i.appName))},dependencies:[xy,M3,_y,lQ,wy,Wt,dn,Zs,Ml,$c,OD,os],styles:['[_nghost-%COMP%]{width:100%;height:100%;display:flex;flex-direction:column;flex:1;min-height:0}.canvas-container[_ngcontent-%COMP%]{width:100%;height:100%;display:flex;flex-direction:column;border-radius:8px;overflow:hidden;box-shadow:var(--builder-canvas-shadow);flex:1;min-height:0;position:relative}.canvas-header[_ngcontent-%COMP%]{padding:16px 24px;border-bottom:2px solid var(--builder-border-color);display:flex;justify-content:space-between;align-items:center}.canvas-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--builder-text-primary-color);font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.canvas-controls[_ngcontent-%COMP%]{display:flex;gap:8px}.canvas-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid var(--builder-button-border-color);color:var(--builder-button-text-color);transition:all .3s ease}.canvas-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{border-color:var(--builder-button-hover-border-color);transform:translateY(-1px)}.canvas-workspace[_ngcontent-%COMP%]{flex:1;position:relative;overflow:hidden;min-height:0;width:100%;height:100%}.agent-tool-banner[_ngcontent-%COMP%]{position:absolute;top:0;left:0;right:0;border-bottom:2px solid rgba(59,130,246,.3);box-shadow:0 4px 16px #0000004d}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%]{padding:12px 20px;display:flex;align-items:center;gap:16px}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%]{color:#fff;border:1px solid rgba(255,255,255,.2);transition:all .2s ease}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05)}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;flex:1}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-icon[_ngcontent-%COMP%]{font-size:28px;width:28px;height:28px;color:#ffffffe6}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] .agent-tool-name[_ngcontent-%COMP%]{margin:0;color:#fff;font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;line-height:1.2}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] .banner-subtitle[_ngcontent-%COMP%]{margin:0;color:#fffc;font-size:12px;font-weight:400;line-height:1}.canvas-workspace[_ngcontent-%COMP%]:has(.agent-tool-banner) vflow[_ngcontent-%COMP%]{padding-top:68px}.canvas-workspace.has-banner[_ngcontent-%COMP%] vflow{padding-top:68px!important} vflow{width:100%!important;height:100%!important;display:block!important} vflow .root-svg{color:var(--builder-text-primary-color)!important;width:100%!important;height:100%!important;min-width:100%!important;min-height:100%!important}.diagram-canvas[_ngcontent-%COMP%]{display:block;width:100%;height:100%;cursor:crosshair;transition:cursor .2s ease;object-fit:contain;image-rendering:pixelated}.diagram-canvas[_ngcontent-%COMP%]:active{cursor:grabbing}.canvas-instructions[_ngcontent-%COMP%]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none}.instruction-content[_ngcontent-%COMP%]{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:2px solid var(--builder-canvas-instruction-border);border-radius:16px;padding:32px;box-shadow:var(--builder-canvas-shadow)}.instruction-content[_ngcontent-%COMP%] .instruction-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;color:var(--builder-button-text-color);margin-bottom:16px;animation:_ngcontent-%COMP%_pulse 2s infinite}.instruction-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:20px;font-weight:600;margin:0 0 12px;font-family:Google Sans,Helvetica Neue,sans-serif}.instruction-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;margin:0 0 24px;line-height:1.5}.instruction-tips[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;align-items:flex-start}.tip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;color:var(--builder-accent-color);font-size:13px}.tip[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.connection-mode-indicator[_ngcontent-%COMP%]{position:absolute;top:20px;left:50%;transform:translate(-50%);animation:_ngcontent-%COMP%_slideDown .3s ease-out}.connection-indicator-content[_ngcontent-%COMP%]{color:#fff;padding:12px 20px;border-radius:24px;display:flex;align-items:center;gap:12px;box-shadow:0 4px 16px #1b73e866;border:1px solid rgba(255,255,255,.2)}.connection-indicator-content[_ngcontent-%COMP%] .connection-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;animation:_ngcontent-%COMP%_pulse 1.5s infinite}.connection-indicator-content[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:14px;font-weight:500;white-space:nowrap}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:#fff;border:1px solid rgba(255,255,255,.3);width:32px;height:32px;min-width:32px}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{transform:scale(1.1)}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}@keyframes _ngcontent-%COMP%_slideDown{0%{opacity:0;transform:translate(-50%) translateY(-20px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.canvas-footer[_ngcontent-%COMP%]{padding:12px 24px;border-top:1px solid var(--builder-border-color);display:flex;justify-content:space-between;align-items:center}.node-count[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;color:var(--builder-text-secondary-color);font-size:13px;font-weight:500}.node-count[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:var(--builder-accent-color)}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}.canvas-workspace.drag-over[_ngcontent-%COMP%]:before{content:"";position:absolute;inset:0;border:2px dashed #00bbea;border-radius:8px;margin:16px;animation:_ngcontent-%COMP%_dashMove 1s linear infinite}@keyframes _ngcontent-%COMP%_dashMove{0%{border-color:#8ab4f84d}50%{border-color:#8ab4f8cc}to{border-color:#8ab4f84d}}@media(max-width:768px){.canvas-header[_ngcontent-%COMP%]{padding:12px 16px}.canvas-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:16px}.instruction-content[_ngcontent-%COMP%]{padding:24px;margin:16px}.instruction-content[_ngcontent-%COMP%] .instruction-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px}.instruction-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{font-size:18px}.canvas-footer[_ngcontent-%COMP%]{padding:8px 16px;flex-direction:column;gap:8px}}.custom-node[_ngcontent-%COMP%]{width:340px;border:1px solid var(--builder-canvas-node-border);border-radius:8px;align-items:center;position:relative;max-height:none;padding-bottom:0;overflow:visible}.custom-node[_ngcontent-%COMP%]:hover{border-color:var(--builder-canvas-node-hover-border)}.custom-node_selected[_ngcontent-%COMP%]{border:2px solid;border-color:var(--builder-accent-color)}.custom-node_selected[_ngcontent-%COMP%] mat-chip[_ngcontent-%COMP%]{--mdc-chip-outline-color: var(--builder-canvas-node-chip-outline)}.custom-node_selected[_ngcontent-%COMP%]:hover{border-color:var(--builder-accent-color)}[_nghost-%COMP%] .default-group-node{border:2px solid var(--builder-canvas-group-border)!important}.node-title-wrapper[_ngcontent-%COMP%]{padding-top:12px;padding-bottom:12px;border-radius:8px 8px 0 0;display:flex;justify-content:space-between;align-items:center}.node-title[_ngcontent-%COMP%]{padding-left:12px;padding-right:12px;display:flex;align-items:center;color:var(--builder-text-primary-color);font-weight:500}.node-badge[_ngcontent-%COMP%]{margin-left:8px;padding:2px 6px;border-radius:999px;color:var(--builder-accent-color);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.tools-container[_ngcontent-%COMP%]{padding:8px 12px;border-top:1px solid var(--builder-border-color)}.tools-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:4px;cursor:pointer;transition:background-color .2s ease;color:var(--builder-text-primary-color)}.tool-item[_ngcontent-%COMP%] .tool-item-icon[_ngcontent-%COMP%]{font-size:22px;width:22px;height:22px;color:var(--builder-text-primary-color);flex-shrink:0}.tool-item[_ngcontent-%COMP%] .tool-item-name[_ngcontent-%COMP%]{font-family:Google Sans,sans-serif;font-size:15px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-item.more-tools[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-style:italic}.tool-item.more-tools[_ngcontent-%COMP%] .tool-item-icon[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color)}.custom-node_selected[_ngcontent-%COMP%] .node-title-wrapper[_ngcontent-%COMP%]{border-bottom-color:var(--builder-canvas-node-chip-outline)}.custom-node_selected[_ngcontent-%COMP%] .node-title-wrapper[_ngcontent-%COMP%] .node-title[_ngcontent-%COMP%]{color:var(--builder-accent-color)}.tools-header[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callbacks-container[_ngcontent-%COMP%]{padding:12px 6px 12px 12px}.callbacks-header[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callback-type[_ngcontent-%COMP%]{font-size:11px;color:var(--builder-accent-color);padding:2px 6px;border-radius:4px;margin-left:4px;font-weight:500}.add-callback-btn[_ngcontent-%COMP%]{border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-callback-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-callback-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);transform:scale(1.1)}.instruction-title[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px}.instructions[_ngcontent-%COMP%]{font-family:Google Sans;margin-bottom:10px}.agent-resources[_ngcontent-%COMP%]{padding:8px 12px}.empty-resource[_ngcontent-%COMP%]{margin-top:8px;color:var(--builder-text-secondary-color);margin-bottom:8px;display:flex;font-size:13px}.empty-resource[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:none}.action-button-bar[_ngcontent-%COMP%]{display:flex;gap:8px;margin-right:4px}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);border:none;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;pointer-events:auto;border-radius:4px}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);transform:scale(1.1)}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.action-button-bar[_ngcontent-%COMP%] .delete-subagent-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color)}.add-tool-btn[_ngcontent-%COMP%]{border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-tool-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-tool-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);transform:scale(1.1)}.add-subagent-container[_ngcontent-%COMP%]{position:absolute;left:50%;bottom:-68px;transform:translate(-50%);display:flex;justify-content:center;pointer-events:none}.custom-node.in-group[_ngcontent-%COMP%] .add-subagent-container[_ngcontent-%COMP%]{left:auto;right:-68px;bottom:50%;transform:translateY(50%)}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]{width:48px;height:48px;border-radius:50%;border:2px solid var(--builder-accent-color);color:var(--builder-accent-color);display:flex;align-items:center;justify-content:center;padding:0;box-sizing:border-box;transition:transform .2s ease,box-shadow .2s ease,background .2s ease;pointer-events:auto}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%] .add-subagent-symbol[_ngcontent-%COMP%]{font-size:28px;line-height:1;font-weight:400}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05);box-shadow:var(--builder-canvas-add-btn-shadow)}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]:focus-visible{outline:none;box-shadow:var(--builder-canvas-add-btn-shadow)}.open-panel-btn[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;color:var(--builder-text-tertiary-color);cursor:pointer;margin-left:20px;margin-top:20px}.custom-node[_ngcontent-%COMP%]:hover .action-button-bar[_ngcontent-%COMP%], .custom-node.custom-node_selected[_ngcontent-%COMP%] .action-button-bar[_ngcontent-%COMP%]{opacity:1;pointer-events:auto}[_nghost-%COMP%] div[nodehandlescontroller][noderesizecontroller].wrapper{height:0px!important;overflow:visible!important}[_nghost-%COMP%] foreignObject.selectable, [_nghost-%COMP%] foreignObject.selectable>div{overflow:visible!important}[_nghost-%COMP%] .interactive-edge{stroke:var(--builder-accent-color)!important;stroke-width:2!important}[_nghost-%COMP%] .default-handle{stroke:var(--builder-accent-color)!important;stroke-width:1!important;fill:var(--builder-canvas-handle-fill)!important}[_nghost-%COMP%] .reconnect-handle{stroke:var(--builder-accent-color)!important;stroke-width:2!important;fill:var(--builder-canvas-reconnect-handle-fill)!important}[_nghost-%COMP%] .workflow-group-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--builder-canvas-workflow-chip-border);border-radius:16px;color:var(--builder-accent-color);font-family:Google Sans,sans-serif;font-size:12px;font-weight:500;height:32px;box-sizing:border-box;white-space:nowrap;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}[_nghost-%COMP%] .workflow-group-chip .workflow-chip-icon{font-size:16px;width:16px;height:16px;line-height:16px}[_nghost-%COMP%] .workflow-group-chip .workflow-chip-label{color:var(--builder-text-primary-color);font-weight:500;font-size:12px;line-height:1}[_nghost-%COMP%] .empty-group-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;border-radius:8px;text-align:center;border:2px dashed var(--builder-canvas-empty-group-border);transition:all .3s ease}[_nghost-%COMP%] .empty-group-placeholder:hover{border-color:var(--builder-canvas-empty-group-hover-border)}[_nghost-%COMP%] .empty-group-placeholder button{border:2px solid var(--builder-accent-color);color:var(--builder-accent-color);width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;transition:all .2s ease}[_nghost-%COMP%] .empty-group-placeholder button:hover{transform:scale(1.1);box-shadow:var(--builder-canvas-add-btn-shadow)}[_nghost-%COMP%] .empty-group-placeholder button mat-icon{font-size:24px;width:24px;height:24px}[_nghost-%COMP%] .empty-group-placeholder .empty-group-label{font-size:13px;font-weight:500;color:var(--builder-text-secondary-color);font-family:Google Sans,sans-serif}']})};function R9A(t,e){t&1&&Kn(0,"div",2)}var N9A=new kA("MAT_PROGRESS_BAR_DEFAULT_OPTIONS");var CQ=(()=>{class t{_elementRef=w(ce);_ngZone=w(qe);_changeDetectorRef=w(wt);_renderer=w(Pi);_cleanupTransitionEnd;constructor(){let A=XQ(),i=w(N9A,{optional:!0});this._isNoopAnimation=A==="di-disabled",A==="reduced-motion"&&this._elementRef.nativeElement.classList.add("mat-progress-bar-reduced-motion"),i&&(i.color&&(this.color=this._defaultColor=i.color),this.mode=i.mode||this.mode)}_isNoopAnimation;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor="primary";get value(){return this._value}set value(A){this._value=vtA(A||0),this._changeDetectorRef.markForCheck()}_value=0;get bufferValue(){return this._bufferValue||0}set bufferValue(A){this._bufferValue=vtA(A||0),this._changeDetectorRef.markForCheck()}_bufferValue=0;animationEnd=new LA;get mode(){return this._mode}set mode(A){this._mode=A,this._changeDetectorRef.markForCheck()}_mode="determinate";ngAfterViewInit(){this._ngZone.runOutsideAngular(()=>{this._cleanupTransitionEnd=this._renderer.listen(this._elementRef.nativeElement,"transitionend",this._transitionendHandler)})}ngOnDestroy(){this._cleanupTransitionEnd?.()}_getPrimaryBarTransform(){return`scaleX(${this._isIndeterminate()?1:this.value/100})`}_getBufferBarFlexBasis(){return`${this.mode==="buffer"?this.bufferValue:100}%`}_isIndeterminate(){return this.mode==="indeterminate"||this.mode==="query"}_transitionendHandler=A=>{this.animationEnd.observers.length===0||!A.target||!A.target.classList.contains("mdc-linear-progress__primary-bar")||(this.mode==="determinate"||this.mode==="buffer")&&this._ngZone.run(()=>this.animationEnd.next({value:this.value}))};static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-progress-bar"]],hostAttrs:["role","progressbar","aria-valuemin","0","aria-valuemax","100","tabindex","-1",1,"mat-mdc-progress-bar","mdc-linear-progress"],hostVars:10,hostBindings:function(i,n){i&2&&(te("aria-valuenow",n._isIndeterminate()?null:n.value)("mode",n.mode),ro("mat-"+n.color),RA("_mat-animation-noopable",n._isNoopAnimation)("mdc-linear-progress--animation-ready",!n._isNoopAnimation)("mdc-linear-progress--indeterminate",n._isIndeterminate()))},inputs:{color:"color",value:[2,"value","value",Cn],bufferValue:[2,"bufferValue","bufferValue",Cn],mode:"mode"},outputs:{animationEnd:"animationEnd"},exportAs:["matProgressBar"],decls:7,vars:5,consts:[["aria-hidden","true",1,"mdc-linear-progress__buffer"],[1,"mdc-linear-progress__buffer-bar"],[1,"mdc-linear-progress__buffer-dots"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__primary-bar"],[1,"mdc-linear-progress__bar-inner"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__secondary-bar"]],template:function(i,n){i&1&&(wn(0,"div",0),Kn(1,"div",1),O(2,R9A,1,0,"div",2),Gn(),wn(3,"div",3),Kn(4,"span",4),Gn(),wn(5,"div",5),Kn(6,"span",4),Gn()),i&2&&(u(),ut("flex-basis",n._getBufferBarFlexBasis()),u(),Y(n.mode==="buffer"?2:-1),u(),ut("transform",n._getPrimaryBarTransform()))},styles:[`.mat-mdc-progress-bar{--mat-progress-bar-animation-multiplier: 1;display:block;text-align:start}.mat-mdc-progress-bar[mode=query]{transform:scaleX(-1)}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-dots,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__secondary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__bar-inner.mdc-linear-progress__bar-inner{animation:none}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-bar{transition:transform 1ms}.mat-progress-bar-reduced-motion{--mat-progress-bar-animation-multiplier: 2}.mdc-linear-progress{position:relative;width:100%;transform:translateZ(0);outline:1px solid rgba(0,0,0,0);overflow-x:hidden;transition:opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:max(var(--mat-progress-bar-track-height, 4px),var(--mat-progress-bar-active-indicator-height, 4px))}@media(forced-colors: active){.mdc-linear-progress{outline-color:CanvasText}}.mdc-linear-progress__bar{position:absolute;top:0;bottom:0;margin:auto 0;width:100%;animation:none;transform-origin:top left;transition:transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:var(--mat-progress-bar-active-indicator-height, 4px)}.mdc-linear-progress--indeterminate .mdc-linear-progress__bar{transition:none}[dir=rtl] .mdc-linear-progress__bar{right:0;transform-origin:center right}.mdc-linear-progress__bar-inner{display:inline-block;position:absolute;width:100%;animation:none;border-top-style:solid;border-color:var(--mat-progress-bar-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-progress-bar-active-indicator-height, 4px)}.mdc-linear-progress__buffer{display:flex;position:absolute;top:0;bottom:0;margin:auto 0;width:100%;overflow:hidden;height:var(--mat-progress-bar-track-height, 4px);border-radius:var(--mat-progress-bar-track-shape, var(--mat-sys-corner-none))}.mdc-linear-progress__buffer-dots{background-image:radial-gradient(circle, var(--mat-progress-bar-track-color, var(--mat-sys-surface-variant)) calc(var(--mat-progress-bar-track-height, 4px) / 2), transparent 0);background-repeat:repeat-x;background-size:calc(calc(var(--mat-progress-bar-track-height, 4px) / 2)*5);background-position:left;flex:auto;transform:rotate(180deg);animation:mdc-linear-progress-buffering calc(250ms*var(--mat-progress-bar-animation-multiplier)) infinite linear}@media(forced-colors: active){.mdc-linear-progress__buffer-dots{background-color:ButtonBorder}}[dir=rtl] .mdc-linear-progress__buffer-dots{animation:mdc-linear-progress-buffering-reverse calc(250ms*var(--mat-progress-bar-animation-multiplier)) infinite linear;transform:rotate(0)}.mdc-linear-progress__buffer-bar{flex:0 1 100%;transition:flex-basis 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);background-color:var(--mat-progress-bar-track-color, var(--mat-sys-surface-variant))}.mdc-linear-progress__primary-bar{transform:scaleX(0)}.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{left:-145.166611%}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation:mdc-linear-progress-primary-indeterminate-translate calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-primary-indeterminate-scale calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation-name:mdc-linear-progress-primary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{right:-145.166611%;left:auto}.mdc-linear-progress__secondary-bar{display:none}.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{left:-54.888891%;display:block}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation:mdc-linear-progress-secondary-indeterminate-translate calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-secondary-indeterminate-scale calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation-name:mdc-linear-progress-secondary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{right:-54.888891%;left:auto}@keyframes mdc-linear-progress-buffering{from{transform:rotate(180deg) translateX(calc(var(--mat-progress-bar-track-height, 4px) * -2.5))}}@keyframes mdc-linear-progress-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(83.67142%)}100%{transform:translateX(200.611057%)}}@keyframes mdc-linear-progress-primary-indeterminate-scale{0%{transform:scaleX(0.08)}36.65%{animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);transform:scaleX(0.08)}69.15%{animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);transform:scaleX(0.661479)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(84.386165%)}100%{transform:translateX(160.277782%)}}@keyframes mdc-linear-progress-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);transform:scaleX(0.08)}19.15%{animation-timing-function:cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);transform:scaleX(0.457104)}44.15%{animation-timing-function:cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);transform:scaleX(0.72796)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-primary-indeterminate-translate-reverse{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(-83.67142%)}100%{transform:translateX(-200.611057%)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate-reverse{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(-37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(-84.386165%)}100%{transform:translateX(-160.277782%)}}@keyframes mdc-linear-progress-buffering-reverse{from{transform:translateX(-10px)}} +`],encapsulation:2,changeDetection:0})}return t})();function vtA(t,e=0,A=100){return Math.max(e,Math.min(A,t))}var IQ=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();var F9A=["switch"],L9A=["*"];function G9A(t,e){t&1&&(B(0,"span",11),Ct(),B(1,"svg",13),hA(2,"path",14),Q(),B(3,"svg",15),hA(4,"path",16),Q()())}var K9A=new kA("mat-slide-toggle-default-options",{providedIn:"root",factory:()=>({disableToggleValue:!1,hideIcon:!1,disabledInteractive:!1})}),Ry=class{source;checked;constructor(e,A){this.source=e,this.checked=A}},U9A=(()=>{class t{_elementRef=w(ce);_focusMonitor=w($a);_changeDetectorRef=w(wt);defaults=w(K9A);_onChange=A=>{};_onTouched=()=>{};_validatorOnChange=()=>{};_uniqueId;_checked=!1;_createChangeEvent(A){return new Ry(this,A)}_labelId;get buttonId(){return`${this.id||this._uniqueId}-button`}_switchElement;focus(){this._switchElement.nativeElement.focus()}_noopAnimations=An();_focused=!1;name=null;id;labelPosition="after";ariaLabel=null;ariaLabelledby=null;ariaDescribedby;required=!1;color;disabled=!1;disableRipple=!1;tabIndex=0;get checked(){return this._checked}set checked(A){this._checked=A,this._changeDetectorRef.markForCheck()}hideIcon;disabledInteractive;change=new LA;toggleChange=new LA;get inputId(){return`${this.id||this._uniqueId}-input`}constructor(){w(eo).load(lr);let A=w(new Us("tabindex"),{optional:!0}),i=this.defaults;this.tabIndex=A==null?0:parseInt(A)||0,this.color=i.color||"accent",this.id=this._uniqueId=w(In).getId("mat-mdc-slide-toggle-"),this.hideIcon=i.hideIcon??!1,this.disabledInteractive=i.disabledInteractive??!1,this._labelId=this._uniqueId+"-label"}ngAfterContentInit(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{A==="keyboard"||A==="program"?(this._focused=!0,this._changeDetectorRef.markForCheck()):A||Promise.resolve().then(()=>{this._focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck()})})}ngOnChanges(A){A.required&&this._validatorOnChange()}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef)}writeValue(A){this.checked=!!A}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorOnChange=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck()}toggle(){this.checked=!this.checked,this._onChange(this.checked)}_emitChangeEvent(){this._onChange(this.checked),this.change.emit(this._createChangeEvent(this.checked))}_handleClick(){this.disabled||(this.toggleChange.emit(),this.defaults.disableToggleValue||(this.checked=!this.checked,this._onChange(this.checked),this.change.emit(new Ry(this,this.checked))))}_getAriaLabelledBy(){return this.ariaLabelledby?this.ariaLabelledby:this.ariaLabel?null:this._labelId}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-slide-toggle"]],viewQuery:function(i,n){if(i&1&&Jt(F9A,5),i&2){let o;ae(o=re())&&(n._switchElement=o.first)}},hostAttrs:[1,"mat-mdc-slide-toggle"],hostVars:13,hostBindings:function(i,n){i&2&&(ha("id",n.id),te("tabindex",null)("aria-label",null)("name",null)("aria-labelledby",null),ro(n.color?"mat-"+n.color:""),RA("mat-mdc-slide-toggle-focused",n._focused)("mat-mdc-slide-toggle-checked",n.checked)("_mat-animation-noopable",n._noopAnimations))},inputs:{name:"name",id:"id",labelPosition:"labelPosition",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],required:[2,"required","required",Be],color:"color",disabled:[2,"disabled","disabled",Be],disableRipple:[2,"disableRipple","disableRipple",Be],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:Cn(A)],checked:[2,"checked","checked",Be],hideIcon:[2,"hideIcon","hideIcon",Be],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Be]},outputs:{change:"change",toggleChange:"toggleChange"},exportAs:["matSlideToggle"],features:[Bt([{provide:as,useExisting:Ja(()=>t),multi:!0},{provide:Oc,useExisting:t,multi:!0}]),Yt],ngContentSelectors:L9A,decls:14,vars:27,consts:[["switch",""],["mat-internal-form-field","",3,"labelPosition"],["role","switch","type","button",1,"mdc-switch",3,"click","tabIndex","disabled"],[1,"mat-mdc-slide-toggle-touch-target"],[1,"mdc-switch__track"],[1,"mdc-switch__handle-track"],[1,"mdc-switch__handle"],[1,"mdc-switch__shadow"],[1,"mdc-elevation-overlay"],[1,"mdc-switch__ripple"],["mat-ripple","",1,"mat-mdc-slide-toggle-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-switch__icons"],[1,"mdc-label",3,"click","for"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--on"],["d","M19.69,5.23L8.96,15.96l-4.23-4.23L2.96,13.5l6,6L21.46,7L19.69,5.23z"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--off"],["d","M20 13H4v-2h16v2z"]],template:function(i,n){if(i&1&&(Rt(),B(0,"div",1)(1,"button",2,0),U("click",function(){return n._handleClick()}),hA(3,"div",3)(4,"span",4),B(5,"span",5)(6,"span",6)(7,"span",7),hA(8,"span",8),Q(),B(9,"span",9),hA(10,"span",10),Q(),O(11,G9A,5,0,"span",11),Q()()(),B(12,"label",12),U("click",function(a){return a.stopPropagation()}),Ve(13),Q()()),i&2){let o=Qi(2);H("labelPosition",n.labelPosition),u(),RA("mdc-switch--selected",n.checked)("mdc-switch--unselected",!n.checked)("mdc-switch--checked",n.checked)("mdc-switch--disabled",n.disabled)("mat-mdc-slide-toggle-disabled-interactive",n.disabledInteractive),H("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("disabled",n.disabled&&!n.disabledInteractive),te("id",n.buttonId)("name",n.name)("aria-label",n.ariaLabel)("aria-labelledby",n._getAriaLabelledBy())("aria-describedby",n.ariaDescribedby)("aria-required",n.required||null)("aria-checked",n.checked)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),u(9),H("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),u(),Y(n.hideIcon?-1:11),u(),H("for",n.buttonId),te("id",n._labelId)}},dependencies:[rs,W6],styles:[`.mdc-switch{align-items:center;background:none;border:none;cursor:pointer;display:inline-flex;flex-shrink:0;margin:0;outline:none;overflow:visible;padding:0;position:relative;width:var(--mat-slide-toggle-track-width, 52px)}.mdc-switch.mdc-switch--disabled{cursor:default;pointer-events:none}.mdc-switch.mat-mdc-slide-toggle-disabled-interactive{pointer-events:auto}.mdc-switch__track{overflow:hidden;position:relative;width:100%;height:var(--mat-slide-toggle-track-height, 32px);border-radius:var(--mat-slide-toggle-track-shape, var(--mat-sys-corner-full))}.mdc-switch--disabled.mdc-switch .mdc-switch__track{opacity:var(--mat-slide-toggle-disabled-track-opacity, 0.12)}.mdc-switch__track::before,.mdc-switch__track::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";height:100%;left:0;position:absolute;width:100%;border-width:var(--mat-slide-toggle-track-outline-width, 2px);border-color:var(--mat-slide-toggle-track-outline-color, var(--mat-sys-outline))}.mdc-switch--selected .mdc-switch__track::before,.mdc-switch--selected .mdc-switch__track::after{border-width:var(--mat-slide-toggle-selected-track-outline-width, 2px);border-color:var(--mat-slide-toggle-selected-track-outline-color, transparent)}.mdc-switch--disabled .mdc-switch__track::before,.mdc-switch--disabled .mdc-switch__track::after{border-width:var(--mat-slide-toggle-disabled-unselected-track-outline-width, 2px);border-color:var(--mat-slide-toggle-disabled-unselected-track-outline-color, var(--mat-sys-on-surface))}@media(forced-colors: active){.mdc-switch__track{border-color:currentColor}}.mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0, 0, 0.2, 1);transform:translateX(0);background:var(--mat-slide-toggle-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch--selected .mdc-switch__track::before{transform:translateX(-100%)}.mdc-switch--selected .mdc-switch__track::before{opacity:var(--mat-slide-toggle-hidden-track-opacity, 0);transition:var(--mat-slide-toggle-hidden-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::before{opacity:var(--mat-slide-toggle-visible-track-opacity, 1);transition:var(--mat-slide-toggle-visible-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-hover-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-focus-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:active .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-pressed-track-color, var(--mat-sys-surface-variant))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::before,.mdc-switch.mdc-switch--disabled .mdc-switch__track::before{background:var(--mat-slide-toggle-disabled-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch__track::after{transform:translateX(-100%);background:var(--mat-slide-toggle-selected-track-color, var(--mat-sys-primary))}[dir=rtl] .mdc-switch__track::after{transform:translateX(100%)}.mdc-switch--selected .mdc-switch__track::after{transform:translateX(0)}.mdc-switch--selected .mdc-switch__track::after{opacity:var(--mat-slide-toggle-visible-track-opacity, 1);transition:var(--mat-slide-toggle-visible-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::after{opacity:var(--mat-slide-toggle-hidden-track-opacity, 0);transition:var(--mat-slide-toggle-hidden-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-hover-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-focus-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:active .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-pressed-track-color, var(--mat-sys-primary))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::after,.mdc-switch.mdc-switch--disabled .mdc-switch__track::after{background:var(--mat-slide-toggle-disabled-selected-track-color, var(--mat-sys-on-surface))}.mdc-switch__handle-track{height:100%;pointer-events:none;position:absolute;top:0;transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);left:0;right:auto;transform:translateX(0);width:calc(100% - var(--mat-slide-toggle-handle-width))}[dir=rtl] .mdc-switch__handle-track{left:auto;right:0}.mdc-switch--selected .mdc-switch__handle-track{transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch__handle-track{transform:translateX(-100%)}.mdc-switch__handle{display:flex;pointer-events:auto;position:absolute;top:50%;transform:translateY(-50%);left:0;right:auto;transition:width 75ms cubic-bezier(0.4, 0, 0.2, 1),height 75ms cubic-bezier(0.4, 0, 0.2, 1),margin 75ms cubic-bezier(0.4, 0, 0.2, 1);width:var(--mat-slide-toggle-handle-width);height:var(--mat-slide-toggle-handle-height);border-radius:var(--mat-slide-toggle-handle-shape, var(--mat-sys-corner-full))}[dir=rtl] .mdc-switch__handle{left:auto;right:0}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle{width:var(--mat-slide-toggle-unselected-handle-size, 16px);height:var(--mat-slide-toggle-unselected-handle-size, 16px);margin:var(--mat-slide-toggle-unselected-handle-horizontal-margin, 0 8px)}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-slide-toggle-unselected-with-icon-handle-horizontal-margin, 0 4px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle{width:var(--mat-slide-toggle-selected-handle-size, 24px);height:var(--mat-slide-toggle-selected-handle-size, 24px);margin:var(--mat-slide-toggle-selected-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-slide-toggle-selected-with-icon-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch__handle:has(.mdc-switch__icons){width:var(--mat-slide-toggle-with-icon-handle-size, 24px);height:var(--mat-slide-toggle-with-icon-handle-size, 24px)}.mat-mdc-slide-toggle .mdc-switch:active:not(.mdc-switch--disabled) .mdc-switch__handle{width:var(--mat-slide-toggle-pressed-handle-size, 28px);height:var(--mat-slide-toggle-pressed-handle-size, 28px)}.mat-mdc-slide-toggle .mdc-switch--selected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-slide-toggle-selected-pressed-handle-horizontal-margin, 0 22px)}.mat-mdc-slide-toggle .mdc-switch--unselected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-slide-toggle-unselected-pressed-handle-horizontal-margin, 0 2px)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__handle::after{opacity:var(--mat-slide-toggle-disabled-selected-handle-opacity, 1)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__handle::after{opacity:var(--mat-slide-toggle-disabled-unselected-handle-opacity, 0.38)}.mdc-switch__handle::before,.mdc-switch__handle::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";width:100%;height:100%;left:0;position:absolute;top:0;transition:background-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1),border-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);z-index:-1}@media(forced-colors: active){.mdc-switch__handle::before,.mdc-switch__handle::after{border-color:currentColor}}.mdc-switch--selected:enabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-handle-color, var(--mat-sys-on-primary))}.mdc-switch--selected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-hover-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-focus-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:active .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-pressed-handle-color, var(--mat-sys-primary-container))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:hover:not(:focus):not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:focus:not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:active .mdc-switch__handle::after,.mdc-switch--selected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-disabled-selected-handle-color, var(--mat-sys-surface))}.mdc-switch--unselected:enabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-handle-color, var(--mat-sys-outline))}.mdc-switch--unselected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-hover-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-focus-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:active .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-pressed-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-disabled-unselected-handle-color, var(--mat-sys-on-surface))}.mdc-switch__handle::before{background:var(--mat-slide-toggle-handle-surface-color)}.mdc-switch__shadow{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0}.mdc-switch:enabled .mdc-switch__shadow{box-shadow:var(--mat-slide-toggle-handle-elevation-shadow)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__shadow,.mdc-switch.mdc-switch--disabled .mdc-switch__shadow{box-shadow:var(--mat-slide-toggle-disabled-handle-elevation-shadow)}.mdc-switch__ripple{left:50%;position:absolute;top:50%;transform:translate(-50%, -50%);z-index:-1;width:var(--mat-slide-toggle-state-layer-size, 40px);height:var(--mat-slide-toggle-state-layer-size, 40px)}.mdc-switch__ripple::after{content:"";opacity:0}.mdc-switch--disabled .mdc-switch__ripple::after{display:none}.mat-mdc-slide-toggle-disabled-interactive .mdc-switch__ripple::after{display:block}.mdc-switch:hover .mdc-switch__ripple::after{transition:75ms opacity cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:focus .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:active .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:hover:not(:focus) .mdc-switch__ripple::after,.mdc-switch--unselected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-hover-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-switch--unselected:enabled:focus .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-focus-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-switch--unselected:enabled:active .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-pressed-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch--selected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-hover-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-switch--selected:enabled:focus .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-focus-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-switch--selected:enabled:active .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-pressed-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch__icons{position:relative;height:100%;width:100%;z-index:1;transform:translateZ(0)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__icons{opacity:var(--mat-slide-toggle-disabled-unselected-icon-opacity, 0.38)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__icons{opacity:var(--mat-slide-toggle-disabled-selected-icon-opacity, 0.38)}.mdc-switch__icon{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;opacity:0;transition:opacity 30ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-switch--unselected .mdc-switch__icon{width:var(--mat-slide-toggle-unselected-icon-size, 16px);height:var(--mat-slide-toggle-unselected-icon-size, 16px);fill:var(--mat-slide-toggle-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mat-slide-toggle-disabled-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__icon{width:var(--mat-slide-toggle-selected-icon-size, 16px);height:var(--mat-slide-toggle-selected-icon-size, 16px);fill:var(--mat-slide-toggle-selected-icon-color, var(--mat-sys-on-primary-container))}.mdc-switch--selected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mat-slide-toggle-disabled-selected-icon-color, var(--mat-sys-on-surface))}.mdc-switch--selected .mdc-switch__icon--on,.mdc-switch--unselected .mdc-switch__icon--off{opacity:1;transition:opacity 45ms 30ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle{-webkit-user-select:none;user-select:none;display:inline-block;-webkit-tap-highlight-color:rgba(0,0,0,0);outline:0}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple,.mat-mdc-slide-toggle .mdc-switch__ripple::after{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple:not(:empty),.mat-mdc-slide-toggle .mdc-switch__ripple::after:not(:empty){transform:translateZ(0)}.mat-mdc-slide-toggle.mat-mdc-slide-toggle-focused .mat-focus-indicator::before{content:""}.mat-mdc-slide-toggle .mat-internal-form-field{color:var(--mat-slide-toggle-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-slide-toggle-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-slide-toggle-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-slide-toggle-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-slide-toggle-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-slide-toggle-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-slide-toggle .mat-ripple-element{opacity:.12}.mat-mdc-slide-toggle .mat-focus-indicator::before{border-radius:50%}.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle-track,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__icon,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::after,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::after{transition:none}.mat-mdc-slide-toggle .mdc-switch:enabled+.mdc-label{cursor:pointer}.mat-mdc-slide-toggle .mdc-switch--disabled+label{color:var(--mat-slide-toggle-disabled-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-slide-toggle label:empty{display:none}.mat-mdc-slide-toggle-touch-target{position:absolute;top:50%;left:50%;height:var(--mat-slide-toggle-touch-target-size, 48px);width:100%;transform:translate(-50%, -50%);display:var(--mat-slide-toggle-touch-target-display, block)}[dir=rtl] .mat-mdc-slide-toggle-touch-target{left:auto;right:50%;transform:translate(50%, -50%)} +`],encapsulation:2,changeDetection:0})}return t})(),MtA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[U9A,fi]})}return t})();var T9A={cancelEditingTooltip:"Cancel editing",saveEvalMessageTooltip:"Save eval case message",thoughtChipLabel:"Thought",outcomeLabel:"Outcome",outputLabel:"Output",actualToolUsesLabel:"Actual tool uses:",expectedToolUsesLabel:"Expected tool uses:",actualResponseLabel:"Actual response:",expectedResponseLabel:"Expected response:",matchScoreLabel:"Match score",thresholdLabel:"Threshold",evalPassLabel:"PASS",evalFailLabel:"FAIL",editEvalMessageTooltip:"Edit eval case message",deleteEvalMessageTooltip:"Delete eval case message",editFunctionArgsTooltip:"Edit function arguments",typeMessagePlaceholder:"Type a message...",sendMessageTooltip:"Send message",uploadFileTooltip:"Upload local file",moreOptionsTooltip:"More options",updateStateMenuLabel:"Update state",updateStateMenuTooltip:"Update the session state",turnOffMicTooltip:"Hang up",useMicTooltip:"Call",turnOffCamTooltip:"Turn off camera",useCamTooltip:"Use camera",updatedSessionStateChipLabel:"Updated session state",proactiveAudioTooltip:"Enable the model to speak spontaneously without waiting for user input",affectiveDialogTooltip:"Enable the model to respond with emotional expression",sessionResumptionTooltip:"Allow the session to resume from a previous state",saveLiveBlobTooltip:"Save the recorded live stream data"},UI=new kA("Chat Panel Messages",{factory:()=>T9A});function J9A(t,e){if(t&1&&(B(0,"div",1),y(1),Q()),t&2){let A=p();u(),lA(A.title)}}var Ny=class t{title="";set json(e){if(typeof e=="string")try{this.parsedJson=JSON.parse(e)}catch(A){this.parsedJson=e}else this.parsedJson=e}parsedJson={};static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-json-tooltip"]],inputs:{title:"title",json:"json"},decls:4,vars:3,consts:[[1,"tooltip-shell"],[1,"tooltip-title"],[1,"tooltip-content"],[3,"json","expanded"]],template:function(A,i){A&1&&(B(0,"div",0),O(1,J9A,2,1,"div",1),B(2,"div",2),hA(3,"ngx-json-viewer",3),Q()()),A&2&&(u(),Y(i.title?1:-1),u(2),H("json",i.parsedJson)("expanded",!0))},dependencies:[cs,$l],styles:["[_nghost-%COMP%]{display:block;font-size:12px;line-height:1.4;word-break:break-word;overflow:hidden}.tooltip-shell[_ngcontent-%COMP%]{display:flex;flex-direction:column;max-width:800px;max-height:80vh;overflow:hidden}.tooltip-content[_ngcontent-%COMP%]{min-height:0;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable}.tooltip-title[_ngcontent-%COMP%]{font-weight:600;font-size:9px;color:var(--mat-sys-primary);opacity:.5;margin-bottom:4px;text-transform:uppercase;letter-spacing:.5px;position:sticky;top:0;background:inherit;z-index:1}ngx-json-viewer[_ngcontent-%COMP%]{display:block;height:auto!important;min-width:0}"]})};var TI=class t{json="";title="";overlayRef=null;overlay=w(v1);elementRef=w(ce);show(){if(!this.json)return;let e=this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8},{originX:"center",originY:"bottom",overlayX:"center",overlayY:"top",offsetY:8},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",offsetY:-8},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",offsetY:-8}]).withViewportMargin(16).withPush(!1);this.overlayRef=this.overlay.create({positionStrategy:e,scrollStrategy:this.overlay.scrollStrategies.close(),panelClass:"json-tooltip-panel",maxWidth:"90vw"});let A=new Ss(Ny),i=this.overlayRef.attach(A);i.instance.json=this.json,i.instance.title=this.title,i.changeDetectorRef.detectChanges(),this.overlayRef.updatePosition()}hide(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}ngOnDestroy(){this.hide()}static \u0275fac=function(A){return new(A||t)};static \u0275dir=VA({type:t,selectors:[["","appJsonTooltip",""]],hostBindings:function(A,i){A&1&&U("mouseenter",function(){return i.show()})("mouseleave",function(){return i.hide()})},inputs:{json:[0,"appJsonTooltip","json"],title:[0,"appJsonTooltipTitle","title"]}})},Fy=class t{tooltipTemplate;context={};disabled=!1;overlayRef=null;overlay=w(v1);elementRef=w(ce);viewContainerRef=w(Mo);show(){if(this.disabled||!this.tooltipTemplate)return;let e=this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8},{originX:"center",originY:"bottom",overlayX:"center",overlayY:"top",offsetY:8},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",offsetY:-8},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",offsetY:-8}]).withViewportMargin(16).withPush(!1);this.overlayRef=this.overlay.create({positionStrategy:e,scrollStrategy:this.overlay.scrollStrategies.close(),panelClass:"html-tooltip-panel",maxWidth:"90vw"});let A=new Jr(this.tooltipTemplate,this.viewContainerRef,this.context);this.overlayRef.attach(A)}hide(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}ngOnDestroy(){this.hide()}static \u0275fac=function(A){return new(A||t)};static \u0275dir=VA({type:t,selectors:[["","appHtmlTooltip",""]],hostBindings:function(A,i){A&1&&U("mouseenter",function(){return i.show()})("mouseleave",function(){return i.hide()})},inputs:{tooltipTemplate:[0,"appHtmlTooltip","tooltipTemplate"],context:[0,"appHtmlTooltipContext","context"],disabled:[0,"appHtmlTooltipDisabled","disabled"]}})};function O9A(t,e){if(t&1&&(B(0,"div",3)(1,"mat-icon",4),y(2,"robot_2"),Q()()),t&2){let A=p();ut("background-color",A.color),RA("hidden",!A.author),H("appJsonTooltip",A.tooltip)}}function Y9A(t,e){if(t&1&&(B(0,"div",5),y(1),Q()),t&2){let A=p();ut("background-color",A.color),RA("hidden",!A.author),H("appJsonTooltip",A.tooltip),u(),ue(" ",A.initial," ")}}function H9A(t,e){t&1&&(B(0,"div",2)(1,"mat-icon"),y(2,"person"),Q()())}var Ly=class t{role="user";author="";nodePath="";themeService=w(eg);stringToColorService=w(Q2);get tooltip(){if(this.role==="user")return"";let e={author:this.author,nodePath:this.nodePath||""};return JSON.stringify(e,null,2)}get color(){let e=this.getNodeName(this.nodePath||""),A=this.themeService.currentTheme();return this.stringToColorService.stc(e,A)}get initial(){let A=this.getNodeName(this.nodePath||"").match(/[A-Za-z0-9]/);return A?A[0].toUpperCase():"N"}getNodeName(e){return e.split(/[/.>]/).filter(Boolean).pop()||e}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-chat-avatar"]],inputs:{role:"role",author:"author",nodePath:"nodePath"},decls:3,vars:1,consts:[[1,"bot-avatar",3,"appJsonTooltip","hidden","background-color"],[1,"node-circle-icon",3,"background-color","appJsonTooltip","hidden"],[1,"user-avatar"],[1,"bot-avatar",3,"appJsonTooltip"],["fontSet","material-symbols-outlined"],[1,"node-circle-icon",3,"appJsonTooltip"]],template:function(A,i){A&1&&O(0,O9A,3,5,"div",0)(1,Y9A,2,6,"div",1)(2,H9A,3,0,"div",2),A&2&&Y(i.role==="bot"?0:i.role==="node"?1:i.role==="user"?2:-1)},dependencies:[li,Tn,Wt,qi,TI],styles:["[_nghost-%COMP%]{display:contents}.node-circle-icon[_ngcontent-%COMP%]{width:32px;height:32px;border-radius:50%;margin-left:4px;margin-right:16px;margin-top:2px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;align-self:flex-start;color:#fff;font-size:14px;font-weight:600;line-height:1;text-transform:uppercase}.bot-avatar[_ngcontent-%COMP%], .user-avatar[_ngcontent-%COMP%]{width:40px;height:40px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.bot-avatar[_ngcontent-%COMP%]{margin-right:12px;color:#fff}.user-avatar[_ngcontent-%COMP%]{background-color:var(--mat-sys-primary);color:var(--mat-sys-on-primary)}.hidden[_ngcontent-%COMP%]{visibility:hidden}"]})};var Gy=new kA("FeedbackService");var z9A={goodResponseTooltip:"Good response",badResponseTooltip:"Bad response",feedbackAdditionalLabel:"Additional feedback (Optional)",feedbackCommentPlaceholderDown:"Share what could be improved in the response",feedbackCommentPlaceholderUp:"Share what you liked about the response",feedbackCancelButton:"Cancel",feedbackSubmitButton:"Submit",feedbackDialogTitle:"Reasons for feedback (Select all that apply)",feedbackReasonHallucination:"Hallucinated libraries / APIs etc",feedbackReasonIncomplete:"Incomplete answer",feedbackReasonFollowup:"Didn't understand followup",feedbackReasonFactual:"Factual errors",feedbackReasonLinks:"Broken/incorrect links",feedbackReasonIrrelevant:"Irrelevant information",feedbackReasonRepetitive:"Repetitive",feedbackReasonAccurate:"Accurate info",feedbackReasonHelpful:"Helpful",feedbackReasonConcise:"Concise",feedbackReasonUnderstanding:"Good understanding",feedbackReasonClear:"Clear and easy to follow"},StA=new kA("Message Feedback Messages",{factory:()=>z9A});function P9A(t,e){t&1&&(B(0,"mat-icon"),y(1,"thumb_up_filled"),Q())}function j9A(t,e){t&1&&(B(0,"mat-icon"),y(1,"thumb_up"),Q())}function q9A(t,e){t&1&&(B(0,"mat-icon"),y(1,"thumb_down_filled"),Q())}function V9A(t,e){t&1&&(B(0,"mat-icon"),y(1,"thumb_down"),Q())}function W9A(t,e){if(t&1&&(B(0,"mat-chip-option",7),y(1),Q()),t&2){let A=e.$implicit;H("value",A),u(),ue(" ",A," ")}}function Z9A(t,e){if(t&1){let A=QA();B(0,"div",4)(1,"div",5)(2,"h3"),y(3),Q(),B(4,"mat-chip-listbox",6),Ue(5,W9A,2,2,"mat-chip-option",7,ri),Q()(),B(7,"div",8)(8,"h3"),y(9),Q(),B(10,"mat-form-field",9)(11,"textarea",10),y(12," "),Q()()(),B(13,"div",11)(14,"button",12),U("click",function(){T(A);let n=p();return J(n.onDetailedFeedbackCancelled())}),y(15),Q(),B(16,"button",13),U("click",function(){T(A);let n=p();return J(n.onDetailedFeedbackSubmitted())}),y(17),Q()()()}if(t&2){let A=p();u(3),lA(A.i18n.feedbackDialogTitle),u(),H("formControl",A.selectedReasons),u(),Te(A.reasons()),u(4),lA(A.i18n.feedbackAdditionalLabel),u(2),H("formControl",A.comment)("placeholder",A.feedbackPlaceholder()),u(4),ue(" ",A.i18n.feedbackCancelButton," "),u(2),ue(" ",A.i18n.feedbackSubmitButton," ")}}var Ky=class t{sessionName=me.required();eventId=me.required();i18n=w(StA);feedbackService=w(Gy);existingFeedback=$p({params:()=>({sessionName:this.sessionName(),eventId:this.eventId()}),stream:({params:e})=>this.feedbackService.getFeedback(e.sessionName,e.eventId)});selectedFeedbackDirection=bA(void 0);feedbackDirection=pe(()=>this.selectedFeedbackDirection()??this.existingFeedback.value()?.direction);isDetailedFeedbackVisible=bA(!1);feedbackPlaceholder=pe(()=>this.feedbackDirection()==="up"?this.i18n.feedbackCommentPlaceholderUp:this.i18n.feedbackCommentPlaceholderDown);positiveReasonsResource=$p({stream:()=>this.feedbackService.getPositiveFeedbackReasons()});negativeReasonsResource=$p({stream:()=>this.feedbackService.getNegativeFeedbackReasons()});reasons=pe(()=>this.feedbackDirection()==="up"?this.positiveReasonsResource.value():this.negativeReasonsResource.value());selectedReasons=new Os([]);comment=new Os("");isLoading=bA(!1);sendFeedback(e){this.feedbackDirection()===e?(this.isLoading.set(!0),this.feedbackService.deleteFeedback(this.sessionName(),this.eventId()).subscribe(()=>{this.isLoading.set(!1),this.selectedFeedbackDirection.set(void 0),this.resetDetailedFeedback()})):(this.selectedReasons.reset(),this.isLoading.set(!0),this.feedbackService.sendFeedback(this.sessionName(),this.eventId(),{direction:e}).subscribe(()=>{this.isLoading.set(!1),this.isDetailedFeedbackVisible.set(!0),this.selectedFeedbackDirection.set(e)}))}onDetailedFeedbackSubmitted(){let e=this.feedbackDirection();e&&(this.isLoading.set(!0),this.feedbackService.sendFeedback(this.sessionName(),this.eventId(),{direction:e,reasons:this.selectedReasons.value??[],comment:this.comment.value??void 0}).subscribe(()=>{this.isLoading.set(!1),this.resetDetailedFeedback()}))}onDetailedFeedbackCancelled(){this.selectedFeedbackDirection.set(void 0),this.resetDetailedFeedback()}resetDetailedFeedback(){this.isDetailedFeedbackVisible.set(!1),this.comment.reset(),this.selectedReasons.reset([])}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-message-feedback"]],inputs:{sessionName:[1,"sessionName"],eventId:[1,"eventId"]},decls:9,vars:7,consts:[[1,"message-feedback-container"],[1,"feedback-buttons"],["mat-icon-button","",3,"click","matTooltip","disabled"],["class","feedback-details-container",4,"ngIf"],[1,"feedback-details-container"],[1,"reasons-chips"],["multiple","",3,"formControl"],[3,"value"],[1,"additional-feedback"],["appearance","outline"],["matInput","",3,"formControl","placeholder"],[1,"actions"],["mat-stroked-button","",3,"click"],["mat-flat-button","","color","primary",3,"click"]],template:function(A,i){A&1&&(B(0,"div",0)(1,"div",1)(2,"button",2),U("click",function(){return i.sendFeedback("up")}),O(3,P9A,2,0,"mat-icon")(4,j9A,2,0,"mat-icon"),Q(),B(5,"button",2),U("click",function(){return i.sendFeedback("down")}),O(6,q9A,2,0,"mat-icon")(7,V9A,2,0,"mat-icon"),Q()(),Et(8,Z9A,18,7,"div",3),Q()),A&2&&(u(2),H("matTooltip",i.i18n.goodResponseTooltip)("disabled",i.isLoading()),u(),Y(i.feedbackDirection()==="up"?3:4),u(2),H("matTooltip",i.i18n.badResponseTooltip)("disabled",i.isLoading()),u(),Y(i.feedbackDirection()==="down"?6:7),u(2),H("ngIf",i.isDetailedFeedbackVisible()))},dependencies:[li,Js,n2,Dn,yn,XI,qi,pi,ji,UD,aN,nN,Ya,Ko,Tn,Wt,Ps,ua,Fa,dn],styles:[".message-feedback-container[_ngcontent-%COMP%]{display:block}.feedback-buttons[_ngcontent-%COMP%]{--mat-icon-button-touch-target-size: 32px;--button-size: 32px;--icon-size: 12px;margin-left:96px;display:flex}.feedback-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:var(--button-size);height:var(--button-size);transition:all .2s ease}.feedback-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:var(--icon-size);height:var(--icon-size);width:var(--icon-size);transition:all .2s ease}.feedback-buttons[_ngcontent-%COMP%] button.selected[_ngcontent-%COMP%]{color:var(--side-panel-button-filled-label-text-color, white)}.feedback-buttons[_ngcontent-%COMP%] button.selected[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:inherit}.reasons-chips[_ngcontent-%COMP%]{margin-bottom:20px}.feedback-details-container[_ngcontent-%COMP%]{margin-left:54px;max-width:500px;padding:16px;border-radius:8px;margin-top:8px;border:1px solid var(--builder-border-color)}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-weight:500;margin-bottom:8px;margin-top:0;color:var(--builder-text-secondary-color)}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{min-height:60px;resize:vertical}.feedback-details-container[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}.feedback-details-container[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:18px;padding:0 16px;height:32px;line-height:32px;font-weight:500}"]})};function dQ(t){if(!t)return!1;if(t.name==="computer"){let i=t.args?.action,n=t.args?.coordinate;return["left_click","right_click","middle_click","double_click"].includes(i)&&Array.isArray(n)&&n.length===2}let e=["click_at","hover_at","type_text_at","scroll_at","drag_and_drop","mouse_move","scroll_document","wait_5_seconds","navigate","open_web_browser"].includes(t.name),A=t.args?.x!=null&&t.args?.y!=null||Array.isArray(t.args?.coordinate)&&t.args?.coordinate.length===2;return e}function F0(t){return t?!!t.response?.image?.data:!1}var YN=(a=>(a[a.INACTIVE=0]="INACTIVE",a[a.PENDING=1]="PENDING",a[a.RUNNING=2]="RUNNING",a[a.COMPLETED=3]="COMPLETED",a[a.INTERRUPTED=4]="INTERRUPTED",a[a.FAILED=5]="FAILED",a))(YN||{});var X9A=()=>({type:"dots",color:"#424242",size:1,gap:10});function $9A(t,e){t&1&&(B(0,"span",2),y(1,"(Pinned - Click X to close)"),Q())}function ASA(t,e){t&1&&(B(0,"span",2),y(1,"(Click to pin)"),Q())}function eSA(t,e){t&1&&(B(0,"mat-icon",10),y(1,"chevron_right"),Q())}function tSA(t,e){if(t&1){let A=QA();B(0,"span",9),U("click",function(){let n=T(A).$index,o=p(2);return J(o.navigateToLevel(n))}),y(1),Q(),O(2,eSA,2,0,"mat-icon",10)}if(t&2){let A=e.$implicit,i=e.$index,n=p(2);RA("active",i===n.breadcrumbs().length-1),u(),ue(" ",A," "),u(),Y(i0?17:-1)}}function rSA(t,e){if(t&1&&(Ct(),B(0,"g",24),hA(1,"path",25),Q()),t&2){let A=e.$implicit;u(),te("d",A.path())("stroke",A.edge.data!=null&&A.edge.data.isActive?"#42A5F5":"rgba(138, 180, 248, 0.8)")("stroke-width",A.edge.data!=null&&A.edge.data.isActive?"3":"2")("class",A.edge.data!=null&&A.edge.data.isActive?"active-edge":"")("marker-end",A.markerEnd())}}var Uy=class t{nodes=null;agentGraphData=null;nodePath=null;allNodes=null;isPinned=!1;onClose;graphNodes=bA([]);graphEdges=bA([]);NodeStatus=YN;connection={mode:"loose"};fullAgentData=null;navigationStack=[];breadcrumbs=bA([]);close(){this.onClose&&this.onClose()}ngOnInit(){this.buildGraph()}buildGraph(){if(this.agentGraphData?.root_agent){this.fullAgentData=this.agentGraphData.root_agent,this.navigationStack=[{name:this.agentGraphData.root_agent.name,data:this.agentGraphData.root_agent}],this.nodePath&&this.navigateToNodePath(this.nodePath),this.updateBreadcrumbs();let e=this.navigationStack[this.navigationStack.length-1].data;this.buildGraphFromStructure(e)}else this.buildGraphFromStateOnly()}buildGraphFromStructure(e){let A=[],i=[];if(e.nodes&&Array.isArray(e.nodes))this.buildMeshGraph(e.nodes,A,i);else if(e.graph&&e.graph.nodes){let n=VJ(e.graph.nodes,e.graph.edges||[],q6);e.graph.nodes.forEach((o,a)=>{let r=Ac(o,`node_${a}`),s=this.nodes?this.nodes[r]:null,l=o.type||"agent",g=n.positions.get(r)||{x:q6.startX,y:q6.startY},C=oC(o),I=this.getNodeStatusAtLevel(r,o);A.push({id:r,type:"html-template",point:bA({x:g.x,y:g.y}),width:bA(180),height:bA(80),data:bA({name:r,type:l,status:I,input:s?.input,triggeredBy:s?.triggered_by,retryCount:s?.retry_count,runId:s?.run_id,hasNestedStructure:C,nodeData:o})})}),e.graph.edges&&e.graph.edges.forEach((o,a)=>{let r=Ac(o.from_node),s=Ac(o.to_node);if(r&&s){let l=this.getNodeStatusAtLevel(r,o.from_node),g=this.getNodeStatusAtLevel(s,o.to_node),C=l===2||l===3&&(g===2||g===1);i.push({id:`${r}_to_${s}_${a}`,source:r,target:s,type:"template",floating:!0,data:{isActive:C},markers:{end:{type:"arrow-closed",width:15,height:15,color:C?"#42A5F5":"rgba(138, 180, 248, 0.8)"}}})}})}this.graphNodes.set(A),this.graphEdges.set(i)}buildMeshGraph(e,A,i){let n=e.findIndex(I=>I.name===e[0]?.name||I.type==="coordinator"),o=n>=0?e[n]:null,a=e.filter((I,d)=>d!==n),r=100,s=200,l=300,C=400-(a.length-1)*l/2;if(o){let I=oC(o),d=Ac(o),h=this.getNodeStatusAtLevel(d,o);A.push({id:d,type:"html-template",point:bA({x:400,y:r}),width:bA(180),height:bA(80),data:bA({name:d,type:"agent",status:h,hasNestedStructure:I,nodeData:o})})}a.forEach((I,d)=>{let h=C+d*l,E=r+s,f=oC(I),m=Ac(I),v=this.getNodeStatusAtLevel(m,I);if(A.push({id:m,type:"html-template",point:bA({x:h,y:E}),width:bA(180),height:bA(80),data:bA({name:m,type:"agent",status:v,hasNestedStructure:f,nodeData:I})}),o){let k=Ac(o),S=this.getNodeStatusAtLevel(k,o),b=S===2||S===3&&(v===2||v===1);i.push({id:`${k}_to_${m}`,source:k,target:m,type:"template",floating:!0,data:{isActive:b},markers:{end:{type:"arrow-closed",width:15,height:15,color:b?"#42A5F5":"rgba(138, 180, 248, 0.8)"}}})}})}buildGraphFromStateOnly(){let e=[],A=[];if(!this.nodes){this.graphNodes.set(e),this.graphEdges.set(A);return}let a=Object.keys(this.nodes);a.forEach((r,s)=>{let l=this.nodes[r];e.push({id:r,type:"html-template",point:bA({x:200,y:50+s*120}),width:bA(180),height:bA(80),data:bA({name:r,type:r==="__START__"?"start":"agent",status:l.status,input:l.input,triggeredBy:l.triggered_by,retryCount:l.retry_count,runId:l.run_id})})}),a.forEach(r=>{let s=this.nodes[r];if(s.triggered_by&&a.includes(s.triggered_by)){let g=this.nodes[s.triggered_by]?.status===2;A.push({id:`${s.triggered_by}_to_${r}`,source:s.triggered_by,target:r,type:"template",floating:!0,data:{isActive:g},markers:{end:{type:"arrow-closed",width:15,height:15,color:g?"#42A5F5":"rgba(138, 180, 248, 0.8)"}}})}}),this.graphNodes.set(e),this.graphEdges.set(A)}getStatusColor(e){switch(e){case 0:return"#757575";case 1:return"#FFA726";case 2:return"#42A5F5";case 3:return"#66BB6A";case 4:return"#FFCA28";case 5:return"#EF5350";default:return"#757575"}}getStatusLabel(e){switch(e){case 0:return"INACTIVE";case 1:return"PENDING";case 2:return"RUNNING";case 3:return"COMPLETED";case 4:return"INTERRUPTED";case 5:return"FAILED";default:return"UNKNOWN"}}getStatusIcon(e){switch(e){case 0:return"radio_button_unchecked";case 1:return"schedule";case 2:return"play_circle";case 3:return"check_circle";case 4:return"pause_circle";case 5:return"error";default:return"help"}}updateBreadcrumbs(){this.breadcrumbs.set(this.navigationStack.map(e=>e.name))}navigateIntoNode(e){let A=this.navigationStack[this.navigationStack.length-1].data,i=oE(A,e);i&&oC(i)&&(this.navigationStack.push({name:e,data:i}),this.updateBreadcrumbs(),this.buildGraphFromStructure(i))}navigateToLevel(e){if(e>=0&&e1?9:-1),u(2),H("nodes",i.graphNodes())("edges",i.graphEdges())("connection",i.connection)("background",Kc(8,X9A)))},dependencies:[li,Tn,Wt,qi,ji,xy,M3,_y,DtA,lQ,my],styles:[".workflow-graph-tooltip[_ngcontent-%COMP%]{width:500px;height:400px;border-radius:8px;padding:12px;display:flex;flex-direction:column;box-shadow:0 4px 16px #0006}.tooltip-header[_ngcontent-%COMP%]{font-size:14px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid rgba(255,255,255,.1);display:flex;align-items:center;gap:8px}.pinned-hint[_ngcontent-%COMP%]{font-size:12px;font-weight:400;opacity:.7;font-style:italic;flex:1}.close-button[_ngcontent-%COMP%]{width:24px;height:24px;line-height:24px;margin-left:auto}.close-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:18px}.breadcrumb-nav[_ngcontent-%COMP%]{display:flex;align-items:center;margin-bottom:8px;font-size:12px;color:var(--mdc-dialog-supporting-text-color)}.breadcrumb-item[_ngcontent-%COMP%]{cursor:pointer;padding:3px 6px;border-radius:3px;transition:background-color .2s}.breadcrumb-item.active[_ngcontent-%COMP%]{font-weight:500;cursor:default}.breadcrumb-separator[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;opacity:.5;margin:0 2px}.vflow-container[_ngcontent-%COMP%]{flex:1;min-height:0;border:1px solid rgba(255,255,255,.1);border-radius:4px;overflow:hidden;position:relative}.vflow-container[_ngcontent-%COMP%] vflow[_ngcontent-%COMP%]{width:100%;height:100%;display:block}.workflow-node[_ngcontent-%COMP%]{border:2px solid;border-radius:6px;padding:8px 12px;min-width:160px;box-shadow:0 2px 6px #0000004d;transition:all .2s}.workflow-node.expandable[_ngcontent-%COMP%]{cursor:pointer}.workflow-node.expandable[_ngcontent-%COMP%]:hover{box-shadow:0 4px 12px #8ab4f84d;transform:scale(1.02)}.node-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.node-type-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:#8ab4f8e6}.status-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;margin-left:auto}.node-label[_ngcontent-%COMP%]{font-weight:500;font-size:13px;color:var(--mdc-dialog-supporting-text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.node-type[_ngcontent-%COMP%]{font-size:10px;color:#8ab4f8cc;font-weight:500;text-transform:uppercase;letter-spacing:.5px;margin-top:2px}.node-status[_ngcontent-%COMP%]{font-size:11px;font-weight:600;margin-top:2px}.node-retry[_ngcontent-%COMP%]{font-size:10px;color:var(--mdc-dialog-supporting-text-color);opacity:.7;margin-top:2px}[_nghost-%COMP%] .active-edge{animation:_ngcontent-%COMP%_dash 1.5s linear infinite;stroke-dasharray:8 4}@keyframes _ngcontent-%COMP%_dash{to{stroke-dashoffset:-12}}"]})};var Ty=class t{appWorkflowGraphTooltip=null;agentGraphData=null;nodePath=null;allNodes=null;overlay=w(v1);overlayPositionBuilder=w(qm);viewContainerRef=w(Mo);overlayRef=null;isPinned=!1;onClick(e){e.stopPropagation(),!(!this.appWorkflowGraphTooltip||Object.keys(this.appWorkflowGraphTooltip).length===0)&&(this.isPinned?this.hide():this.showPinned())}show(){this.isPinned||!this.appWorkflowGraphTooltip||Object.keys(this.appWorkflowGraphTooltip).length===0||this.overlayRef||this.showTooltip(!1)}hide(){this.isPinned||this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}showPinned(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null),this.isPinned=!0,this.showTooltip(!0)}showTooltip(e){if(this.overlayRef)return;let A=this.overlayPositionBuilder.flexibleConnectedTo(this.viewContainerRef.element).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8},{originX:"center",originY:"bottom",overlayX:"center",overlayY:"top",offsetY:8}]);this.overlayRef=this.overlay.create({positionStrategy:A,scrollStrategy:this.overlay.scrollStrategies.close(),hasBackdrop:e,backdropClass:e?"cdk-overlay-transparent-backdrop":void 0}),e&&this.overlayRef&&this.overlayRef.backdropClick().subscribe(()=>{this.isPinned=!1,this.hide()});let i=new Ss(Uy),n=this.overlayRef.attach(i);n.instance.nodes=this.appWorkflowGraphTooltip,n.instance.agentGraphData=this.agentGraphData,n.instance.nodePath=this.nodePath,n.instance.allNodes=this.allNodes,n.instance.isPinned=e,n.instance.onClose=()=>{this.isPinned=!1,this.hide()}}ngOnDestroy(){this.isPinned=!1,this.hide()}static \u0275fac=function(A){return new(A||t)};static \u0275dir=VA({type:t,selectors:[["","appWorkflowGraphTooltip",""]],hostBindings:function(A,i){A&1&&U("click",function(o){return i.onClick(o)})("mouseenter",function(){return i.show()})("mouseleave",function(){return i.hide()})},inputs:{appWorkflowGraphTooltip:"appWorkflowGraphTooltip",agentGraphData:"agentGraphData",nodePath:"nodePath",allNodes:"allNodes"}})};function sSA(t,e){if(t&1){let A=QA();B(0,"div",5)(1,"img",10),U("load",function(n){T(A);let o=p(4);return J(o.onImageLoad(n))})("click",function(n){T(A),p(3);let o=zn(0);return p().openImageViewer(o),J(n.stopPropagation())}),Q(),hA(2,"div",11),Q()}if(t&2){p(3);let A=zn(0),i=p();u(),H("src",A,Go),u(),H("ngStyle",i.getClickBoxStyle())}}function lSA(t,e){t&1&&(B(0,"div",6)(1,"mat-icon",12),y(2,"image_not_supported"),Q(),B(3,"span",13),y(4,"No screenshot"),Q()())}function gSA(t,e){if(t&1){let A=QA();O(0,sSA,3,2,"div",5)(1,lSA,5,0,"div",6),B(2,"div",7)(3,"span",8),y(4),Q(),B(5,"mat-icon"),y(6,"arrow_forward"),Q()(),B(7,"div",5)(8,"img",9),U("click",function(n){T(A),p(2);let o=zn(1);return p().openImageViewer(o),J(n.stopPropagation())}),Q()()}if(t&2){p(2);let A=zn(0),i=zn(1),n=p();Y(A?0:1),u(4),lA(n.getActionName()),u(4),H("src",i,Go)}}function cSA(t,e){if(t&1){let A=QA();B(0,"div",5)(1,"img",10),U("load",function(n){T(A);let o=p(3);return J(o.onImageLoad(n))})("click",function(n){T(A),p(2);let o=zn(0);return p().openImageViewer(o),J(n.stopPropagation())}),Q(),hA(2,"div",11),Q()}if(t&2){p(2);let A=zn(0),i=p();u(),H("src",A,Go),u(),H("ngStyle",i.getClickBoxStyle())}}function CSA(t,e){if(t&1){let A=QA();B(0,"div",3),U("click",function(){T(A);let n=p(2);return J(n.clickEvent.emit(n.index))}),B(1,"div",4),O(2,gSA,9,3)(3,cSA,3,2,"div",5),Q()()}if(t&2){p();let A=zn(1);RA("dual-images",!!A),u(2),Y(A?2:3)}}function ISA(t,e){if(t&1){let A=QA();B(0,"div",14),U("click",function(){T(A);let n=p(2);return J(n.clickEvent.emit(n.index))}),B(1,"div",6)(2,"mat-icon",12),y(3,"image_not_supported"),Q(),B(4,"span",13),y(5,"No screenshot"),Q()()()}}function dSA(t,e){if(t&1&&(ta(0)(1),O(2,CSA,4,3,"div",1)(3,ISA,6,0,"div",2)),t&2){let A=p(),i=ga(A.getPreviousComputerUseScreenshot());u();let n=ga(A.getNextComputerUseScreenshot());u(),Y(i||n?2:3)}}function BSA(t,e){if(t&1){let A=QA();B(0,"div",15),U("click",function(){T(A);let n=p();return J(n.clickEvent.emit(n.index))}),B(1,"div",16)(2,"span",17),y(3),Q()(),hA(4,"img",18),B(5,"div",19)(6,"mat-icon",20),y(7,"computer"),Q(),B(8,"span",21),y(9),Q()()()}if(t&2){let A=p();u(3),lA(A.functionResponse.name),u(),H("src",A.getComputerUseScreenshot(),Go),u(5),lA(A.getComputerUseUrl())}}var Jy=class t{functionCall;functionResponse;allMessages=[];index=0;clickEvent=new LA;openImage=new LA;imageDimensions=new Map;VIRTUAL_WIDTH=1e3;VIRTUAL_HEIGHT=1e3;isComputerUseResponse(){return!!this.functionResponse&&F0(this.functionResponse)}isComputerUseClick(){return!!this.functionCall&&dQ(this.functionCall)}getComputerUseScreenshot(){return this.getScreenshotFromPayload(this.functionResponse?.response)}getComputerUseUrl(){return this.isComputerUseResponse()&&(this.functionResponse?.response).url||""}getPreviousComputerUseScreenshot(){for(let e=this.index-1;e>=0;e--){let A=this.allMessages[e];if(this.isMsgComputerUseResponse(A)&&A.functionResponses&&A.functionResponses.length>0)for(let i=A.functionResponses.length-1;i>=0;i--){let n=A.functionResponses[i];if(F0(n)){let a=n.response;return this.getScreenshotFromPayload(a)}let o=n.parts;if(Array.isArray(o))for(let a=o.length-1;a>=0;a--){let r=o[a];if(r.inlineData?.mimeType?.startsWith("image/")&&r.inlineData.data){let s=r.inlineData.mimeType,l=r.inlineData.data.replace(/-/g,"+").replace(/_/g,"/");return`data:${s};base64,${l}`}}}}return""}getNextComputerUseScreenshot(){for(let e=this.index+1;e0)for(let i=0;i0?e.functionResponses.some(A=>{if(F0(A))return!0;let i=A.parts;return Array.isArray(i)?i.some(n=>n.inlineData?.mimeType?.startsWith("image/")):!1}):!1}getScreenshotFromPayload(e){let A=e?.image;if(!A?.data)return"";let i=A.data;return i.startsWith("data:")?i:`data:${A.mimetype||"image/png"};base64,${i}`}getAllComputerUseScreenshots(){let e=[];for(let A of this.allMessages)if(this.isMsgComputerUseResponse(A)&&A.functionResponses)for(let i of A.functionResponses){if(F0(i)){let o=i.response;e.push(this.getScreenshotFromPayload(o))}let n=i.parts;if(Array.isArray(n)){for(let o of n)if(o.inlineData?.mimeType?.startsWith("image/")&&o.inlineData.data){let a=o.inlineData.mimeType,r=o.inlineData.data.replace(/-/g,"+").replace(/_/g,"/");e.push(`data:${a};base64,${r}`)}}}return e}getAllComputerUseUrls(){let e=[],A="";for(let i of this.allMessages)if(this.isMsgComputerUseResponse(i)&&i.functionResponses)for(let n of i.functionResponses){let o=n.response?.url;o&&(A=o),F0(n)&&e.push(A);let a=n.parts;if(Array.isArray(a))for(let r of a)r.inlineData?.mimeType?.startsWith("image/")&&r.inlineData.data&&e.push(A)}return e}getAllComputerUseCoordinates(){let e=[],A=null;for(let i of this.allMessages){let n=i.functionCalls;if(Array.isArray(n))for(let o of n)dQ(o)?A=o:o.name==="computer"&&(A=null);if(this.isMsgComputerUseResponse(i)&&i.functionResponses)for(let o of i.functionResponses){let a=!1;F0(o)&&(a=!0);let r=o.parts;if(Array.isArray(r))for(let s of r)s.inlineData?.mimeType?.startsWith("image/")&&s.inlineData.data&&(a=!0);a&&(A&&e.length>0&&(e[e.length-1]=this.getClickCoordinates(A)),e.push(null))}}return e}openImageViewer(e){let A=this.getAllComputerUseScreenshots(),i=this.getAllComputerUseUrls(),n=this.getAllComputerUseCoordinates(),o=A.indexOf(e);this.openImage.emit({images:A,currentIndex:o,urls:i,coordinates:n})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-computer-action"]],inputs:{functionCall:"functionCall",functionResponse:"functionResponse",allMessages:"allMessages",index:"index"},outputs:{clickEvent:"clickEvent",openImage:"openImage"},decls:2,vars:1,consts:[[1,"computer-use-container"],[1,"computer-use-container","click-visualization-container",3,"dual-images"],[1,"computer-use-container","click-visualization-container","fallback"],[1,"computer-use-container","click-visualization-container",3,"click"],[1,"images-wrapper-flex"],[1,"image-wrapper"],[1,"image-wrapper","fallback-image"],[1,"arrow-container"],[1,"action-name-above"],["alt","Next Screenshot",1,"computer-use-screenshot",3,"click","src"],["alt","Computer Use Screenshot",1,"computer-use-screenshot",3,"load","click","src"],[1,"click-overlay-box",3,"ngStyle"],[1,"missing-icon"],[1,"fallback-text"],[1,"computer-use-container","click-visualization-container","fallback",3,"click"],[1,"computer-use-container",3,"click"],[1,"computer-use-header"],[1,"computer-use-tool-name"],["alt","Computer Use Screenshot",1,"computer-use-screenshot",3,"src"],[1,"computer-use-footprint"],[1,"computer-icon"],[1,"url-text"]],template:function(A,i){A&1&&O(0,dSA,4,3)(1,BSA,10,3,"div",0),A&2&&Y(i.isComputerUseClick()?0:i.isComputerUseResponse()?1:-1)},dependencies:[li,Vd,Tn,Wt,Fa],styles:['[_nghost-%COMP%]{display:block}.computer-use-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;border-radius:12px;border:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color);overflow:hidden;cursor:pointer;margin:5px 5px 10px;transition:opacity .2s}.computer-use-container[_ngcontent-%COMP%]:hover{opacity:.9}.computer-use-tool-name[_ngcontent-%COMP%]{font-size:12px;font-family:monospace;font-weight:600;color:var(--chat-panel-input-field-textarea-color);opacity:.9;padding:12px}.computer-use-tool-name[_ngcontent-%COMP%] .actual-pixels[_ngcontent-%COMP%]{opacity:.6;margin-left:8px;font-weight:400}.computer-use-screenshot[_ngcontent-%COMP%]{width:100%;height:auto;display:block;border-bottom:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color)}.computer-use-footprint[_ngcontent-%COMP%]{display:flex;align-items:center;padding:8px 12px;gap:8px}.computer-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0}.url-text[_ngcontent-%COMP%]{font-size:11px;font-family:monospace;white-space:normal;word-break:break-all;color:var(--chat-panel-input-field-textarea-color);opacity:.8;min-width:0}.image-wrapper[_ngcontent-%COMP%]{position:relative;width:100%}.images-wrapper-flex[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:580px;gap:12px}.images-wrapper-flex[_ngcontent-%COMP%] .image-wrapper[_ngcontent-%COMP%]{flex:1;min-width:0}.images-wrapper-flex[_ngcontent-%COMP%] .image-wrapper[_ngcontent-%COMP%] .computer-use-screenshot[_ngcontent-%COMP%]{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;border-radius:8px}.arrow-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--chat-panel-input-field-textarea-color);opacity:.8;gap:4px}.arrow-container[_ngcontent-%COMP%] .action-name-above[_ngcontent-%COMP%]{font-size:11px;font-family:monospace;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:80px}.arrow-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:32px;width:32px;height:32px}.fallback-image[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high, #e0e0e0);width:240px;height:120px;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--chat-panel-input-field-textarea-color);opacity:.7}.fallback-image[_ngcontent-%COMP%] .missing-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px}.fallback-image[_ngcontent-%COMP%] .fallback-text[_ngcontent-%COMP%]{font-size:14px;font-weight:500}.click-overlay-box[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;border:1px solid rgba(255,255,255,.8);border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 4px #00000080;pointer-events:none;display:flex;align-items:center;justify-content:center}.click-overlay-box[_ngcontent-%COMP%]:before{content:"";width:2px;height:2px;border-radius:50%;box-shadow:0 0 2px #fff}.click-overlay-box[_ngcontent-%COMP%]:after{content:"";position:absolute;width:100%;height:100%;border-radius:50%}']})};function ESA(t,e){if(t&1&&(B(0,"mat-icon"),y(1),Q()),t&2){let A=p();u(),lA(A.icon)}}var Oy=class t{icon="";text="";tooltipContent=null;tooltipTitle="";disabled=!1;buttonClick=new LA;handleClick(e){this.buttonClick.emit(e)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-hover-info-button"]],inputs:{icon:"icon",text:"text",tooltipContent:"tooltipContent",tooltipTitle:"tooltipTitle",disabled:"disabled"},outputs:{buttonClick:"buttonClick"},decls:3,vars:7,consts:[["mat-stroked-button","",1,"hover-info-button",3,"click","appJsonTooltip","appJsonTooltipTitle","disabled"]],template:function(A,i){A&1&&(B(0,"button",0),U("click",function(o){return i.handleClick(o)}),O(1,ESA,2,1,"mat-icon"),y(2),Q()),A&2&&(RA("icon-only",!i.text),H("appJsonTooltip",i.tooltipContent)("appJsonTooltipTitle",i.tooltipTitle)("disabled",i.disabled),u(),Y(i.icon?1:-1),u(),ue(" ",i.text,` +`))},dependencies:[li,qi,pi,Tn,Wt,TI],styles:[`.hover-info-button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)!important;background-color:var(--mat-sys-surface-container-high)!important;border-color:transparent!important;margin:5px 5px 5px 0;font-size:11px!important;padding:6px 12px!important;min-height:24px!important;height:24px!important;border-radius:8px!important;font-family:Roboto Mono,monospace!important;max-width:300px;text-align:left;display:inline-flex;align-items:center}.hover-info-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px!important;width:18px!important;height:18px!important;margin-right:6px!important;color:var(--mat-sys-on-surface)!important}.hover-info-button.icon-only[_ngcontent-%COMP%]{padding:0!important;min-width:24px!important;width:24px!important;justify-content:center}.hover-info-button.icon-only[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:-8px!important}.hover-info-button.icon-only[_ngcontent-%COMP%] .mdc-button__label[_ngcontent-%COMP%]{display:none!important}[_nghost-%COMP%] .hover-info-button{background-color:var(--mat-sys-surface-container-high)!important;color:var(--mat-sys-on-surface)!important}[_nghost-%COMP%] .hover-info-button .mdc-button__label{overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important} + + + + + + + + + + + + + + + + +`]})};var n5e=K3(ktA());Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));Prism.languages.js=Prism.languages.javascript;(function(t){t.languages.typescript=t.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),t.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete t.languages.typescript.parameter,delete t.languages.typescript["literal-property"];var e=t.languages.extend("typescript",{});delete e["class-name"],t.languages.typescript["class-name"].inside=e,t.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e}}}}),t.languages.ts=t.languages.typescript})(Prism);(function(t){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;t.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},t.languages.css.atrule.inside.rest=t.languages.css;var A=t.languages.markup;A&&(A.tag.addInlined("style","css"),A.tag.addAttribute("style","css"))})(Prism);Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}};Prism.languages.webmanifest=Prism.languages.json;(function(t){var e="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",A={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},i={bash:A,environment:{pattern:RegExp("\\$"+e),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+e),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};t.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+e),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:i},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:A}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:i},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:i.entity}}],environment:{pattern:RegExp("\\$?"+e),alias:"constant"},variable:i.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},A.inside=t.languages.bash;for(var n=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=i.variable[1].inside,a=0;a]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/};Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python;Prism.languages.py=Prism.languages.python;(function(t){var e=/[*&][^\s[\]{},]+/,A=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,i="(?:"+A.source+"(?:[ ]+"+e.source+")?|"+e.source+"(?:[ ]+"+A.source+")?)",n=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function a(r,s){s=(s||"").replace(/m/g,"")+"m";var l=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return i}).replace(/<>/g,function(){return r});return RegExp(l,s)}t.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return i})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return i}).replace(/<>/g,function(){return"(?:"+n+"|"+o+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:a(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:a(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:a(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:a(o),lookbehind:!0,greedy:!0},number:{pattern:a(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:A,important:e,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},t.languages.yml=t.languages.yaml})(Prism);var QSA=t=>({color:t}),BQ=class t{text=me("");thought=me(!1);static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-markdown"]],inputs:{text:[1,"text"],thought:[1,"thought"]},features:[Bt([Bu()])],decls:1,vars:4,consts:[[3,"data","ngStyle"]],template:function(A,i){A&1&&hA(0,"markdown",0),A&2&&H("data",i.text())("ngStyle",Ks(2,QSA,i.thought()?"#9aa0a6":"inherit"))},dependencies:[li,Vd,sU,rU],encapsulation:2})};var xtA=(t,e)=>e.key;function uSA(t,e){if(t&1){let A=QA();B(0,"div",7)(1,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("form"))}),y(2,"Form"),Q(),B(3,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("json"))}),y(4,"JSON"),Q(),B(5,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("payload"))}),y(6,"Payload"),Q(),B(7,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("response schema"))}),y(8,"Schema"),Q()()}if(t&2){let A=p(3);u(),RA("active",A.activeTab==="form"),u(2),RA("active",A.activeTab==="json"),u(2),RA("active",A.activeTab==="payload"),u(2),RA("active",A.activeTab==="response schema")}}function fSA(t,e){if(t&1){let A=QA();B(0,"div",9)(1,"div",12),y(2),Q(),B(3,"div",13)(4,"div",14),y(5,"Payload"),Q(),hA(6,"ngx-json-viewer",15),Q(),B(7,"div",16)(8,"div",17)(9,"label",18)(10,"input",19),Di("ngModelChange",function(n){T(A);let o=p(3);return Bi(o.confirmationModel.confirmed,n)||(o.confirmationModel.confirmed=n),J(n)}),Q(),B(11,"span"),y(12,"Confirmed"),Q()()(),B(13,"button",20),U("click",function(){T(A);let n=p(3);return J(n.onSend())}),y(14," Submit "),Q()()()}if(t&2){let A=p(3);u(2),ue(" ",A.functionCall.args==null||A.functionCall.args.toolConfirmation==null?null:A.functionCall.args.toolConfirmation.hint," "),u(4),H("json",A.functionCall.args==null||A.functionCall.args.originalFunctionCall==null?null:A.functionCall.args.originalFunctionCall.args),u(4),H("id",NQ("confirmed-checkbox-",A.functionCall.id)),wi("ngModel",A.confirmationModel.confirmed)}}function pSA(t,e){t&1&&y(0," *")}function mSA(t,e){if(t&1&&(B(0,"div",28),y(1),Q()),t&2){let A=p(2).$implicit;u(),lA(A.description)}}function wSA(t,e){if(t&1){let A=QA();B(0,"input",27),Di("ngModelChange",function(n){T(A);let o=p().$implicit,a=p(5);return Bi(a.formModel[o.key],n)||(a.formModel[o.key]=n),J(n)}),Q(),O(1,mSA,2,1,"div",28)}if(t&2){let A=p().$implicit,i=p(5);H("id",A.key),wi("ngModel",i.formModel[A.key]),u(),Y(A.description?1:-1)}}function DSA(t,e){if(t&1){let A=QA();B(0,"input",31),Di("ngModelChange",function(n){T(A);let o=p(2).$implicit,a=p(5);return Bi(a.formModel[o.key],n)||(a.formModel[o.key]=n),J(n)}),Q()}if(t&2){let A=p(2).$implicit,i=p(5);H("id",A.key),wi("ngModel",i.formModel[A.key])}}function ySA(t,e){if(t&1){let A=QA();B(0,"input",32),Di("ngModelChange",function(n){T(A);let o=p(2).$implicit,a=p(5);return Bi(a.formModel[o.key],n)||(a.formModel[o.key]=n),J(n)}),Q()}if(t&2){let A=p(2).$implicit,i=p(5);H("id",A.key),wi("ngModel",i.formModel[A.key])}}function vSA(t,e){if(t&1&&(B(0,"div",28),y(1),Q()),t&2){let A=p(2).$implicit;u(),lA(A.description)}}function bSA(t,e){if(t&1&&(O(0,DSA,1,2,"input",29)(1,ySA,1,2,"input",30),O(2,vSA,2,1,"div",28)),t&2){let A=p().$implicit;Y(A.type==="number"||A.type==="integer"?0:1),u(2),Y(A.description?2:-1)}}function MSA(t,e){if(t&1&&(B(0,"div",25),y(1),O(2,pSA,1,0),Q(),B(3,"div",26),O(4,wSA,2,3)(5,bSA,3,2),Q()),t&2){let A=e.$implicit;u(),ue(" ",A.title),u(),Y(A.required?2:-1),u(2),Y(A.type==="boolean"?4:5)}}function SSA(t,e){if(t&1){let A=QA();B(0,"div",21),Ue(1,MSA,6,3,null,null,xtA),B(3,"div",23)(4,"button",24),U("click",function(){T(A);let n=p(4);return J(n.onSend())}),y(5," Submit "),Q()()()}if(t&2){let A=p(4);u(),Te(A.formFields)}}function kSA(t,e){if(t&1){let A=QA();B(0,"div",22)(1,"textarea",33),Di("ngModelChange",function(n){T(A);let o=p(4);return Bi(o.formModelJson,n)||(o.formModelJson=n),J(n)}),U("ngModelChange",function(n){T(A);let o=p(4);return J(o.onJsonInputChange(n))}),Q()(),B(2,"div",23)(3,"button",24),U("click",function(){T(A);let n=p(4);return J(n.onSend())}),y(4," Submit "),Q()()}if(t&2){let A=p(4);u(),wi("ngModel",A.formModelJson)}}function xSA(t,e){if(t&1&&(B(0,"div",22)(1,"pre"),y(2),Q()()),t&2){let A=p(4);u(2),lA(A.getPayloadJson())}}function _SA(t,e){if(t&1&&(B(0,"div",22)(1,"pre"),y(2),Q()()),t&2){let A=p(4);u(2),lA(A.getResponseSchemaJson())}}function RSA(t,e){if(t&1&&(B(0,"div",10),O(1,SSA,6,0,"div",21)(2,kSA,5,1)(3,xSA,3,1,"div",22)(4,_SA,3,1,"div",22),Q()),t&2){let A=p(3);u(),Y(A.activeTab==="form"?1:A.activeTab==="json"?2:A.activeTab==="payload"?3:A.activeTab==="response schema"?4:-1)}}function NSA(t,e){if(t&1){let A=QA();B(0,"input",34),Di("ngModelChange",function(n){T(A);let o=p(3);return Bi(o.functionCall.userResponse,n)||(o.functionCall.userResponse=n),J(n)}),U("keydown.enter",function(){T(A);let n=p(3);return J(n.onSend())}),Q(),B(1,"button",35),U("click",function(){T(A);let n=p(3);return J(n.onSend())}),B(2,"mat-icon"),y(3,"send"),Q()()}if(t&2){let A=p(3);wi("ngModel",A.functionCall.userResponse),u(),H("disabled",!A.functionCall.userResponse)}}function FSA(t,e){if(t&1&&(B(0,"div",2)(1,"div",4),hA(2,"app-markdown",5),Q(),B(3,"div",6),O(4,uSA,9,8,"div",7),B(5,"div",8),O(6,fSA,15,5,"div",9)(7,RSA,5,1,"div",10)(8,NSA,4,2),Q()()()),t&2){let A=p(2);u(2),H("text",A.getPromptText()),u(2),Y(A.formFields.length>0?4:-1),u(2),Y(A.isConfirmationRequest?6:A.formFields.length>0?7:8)}}function LSA(t,e){if(t&1){let A=QA();B(0,"div",7)(1,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("form"))}),y(2,"Form"),Q(),B(3,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("json"))}),y(4,"JSON"),Q(),B(5,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("payload"))}),y(6,"Payload"),Q(),B(7,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("response schema"))}),y(8,"Schema"),Q()()}if(t&2){let A=p(3);u(),RA("active",A.activeTab==="form"),u(2),RA("active",A.activeTab==="json"),u(2),RA("active",A.activeTab==="payload"),u(2),RA("active",A.activeTab==="response schema")}}function GSA(t,e){if(t&1){let A=QA();B(0,"div",9)(1,"div",12),y(2),Q(),B(3,"div",13)(4,"div",14),y(5,"Payload"),Q(),hA(6,"ngx-json-viewer",15),Q(),B(7,"div",16)(8,"div",17)(9,"label",18)(10,"input",19),Di("ngModelChange",function(n){T(A);let o=p(3);return Bi(o.confirmationModel.confirmed,n)||(o.confirmationModel.confirmed=n),J(n)}),Q(),B(11,"span"),y(12,"Confirmed"),Q()()(),B(13,"button",20),U("click",function(){T(A);let n=p(3);return J(n.onSend())}),y(14," Submit "),Q()()()}if(t&2){let A=p(3);u(2),ue(" ",A.functionCall.args==null||A.functionCall.args.toolConfirmation==null?null:A.functionCall.args.toolConfirmation.hint," "),u(4),H("json",A.functionCall.args==null||A.functionCall.args.originalFunctionCall==null?null:A.functionCall.args.originalFunctionCall.args),u(4),H("id",NQ("confirmed-checkbox-standalone-",A.functionCall.id)),wi("ngModel",A.confirmationModel.confirmed)}}function KSA(t,e){t&1&&y(0," *")}function USA(t,e){if(t&1&&(B(0,"div",28),y(1),Q()),t&2){let A=p(2).$implicit;u(),lA(A.description)}}function TSA(t,e){if(t&1){let A=QA();B(0,"input",27),Di("ngModelChange",function(n){T(A);let o=p().$implicit,a=p(5);return Bi(a.formModel[o.key],n)||(a.formModel[o.key]=n),J(n)}),Q(),O(1,USA,2,1,"div",28)}if(t&2){let A=p().$implicit,i=p(5);H("id",A.key),wi("ngModel",i.formModel[A.key]),u(),Y(A.description?1:-1)}}function JSA(t,e){if(t&1){let A=QA();B(0,"input",31),Di("ngModelChange",function(n){T(A);let o=p(2).$implicit,a=p(5);return Bi(a.formModel[o.key],n)||(a.formModel[o.key]=n),J(n)}),Q()}if(t&2){let A=p(2).$implicit,i=p(5);H("id",A.key),wi("ngModel",i.formModel[A.key])}}function OSA(t,e){if(t&1){let A=QA();B(0,"input",32),Di("ngModelChange",function(n){T(A);let o=p(2).$implicit,a=p(5);return Bi(a.formModel[o.key],n)||(a.formModel[o.key]=n),J(n)}),Q()}if(t&2){let A=p(2).$implicit,i=p(5);H("id",A.key),wi("ngModel",i.formModel[A.key])}}function YSA(t,e){if(t&1&&(B(0,"div",28),y(1),Q()),t&2){let A=p(2).$implicit;u(),lA(A.description)}}function HSA(t,e){if(t&1&&(O(0,JSA,1,2,"input",29)(1,OSA,1,2,"input",30),O(2,YSA,2,1,"div",28)),t&2){let A=p().$implicit;Y(A.type==="number"||A.type==="integer"?0:1),u(2),Y(A.description?2:-1)}}function zSA(t,e){if(t&1&&(B(0,"div",25),y(1),O(2,KSA,1,0),Q(),B(3,"div",26),O(4,TSA,2,3)(5,HSA,3,2),Q()),t&2){let A=e.$implicit;u(),ue(" ",A.title),u(),Y(A.required?2:-1),u(2),Y(A.type==="boolean"?4:5)}}function PSA(t,e){if(t&1){let A=QA();B(0,"div",21),Ue(1,zSA,6,3,null,null,xtA),B(3,"div",23)(4,"button",24),U("click",function(){T(A);let n=p(4);return J(n.onSend())}),y(5," Submit "),Q()()()}if(t&2){let A=p(4);u(),Te(A.formFields)}}function jSA(t,e){if(t&1){let A=QA();B(0,"div",22)(1,"textarea",33),Di("ngModelChange",function(n){T(A);let o=p(4);return Bi(o.formModelJson,n)||(o.formModelJson=n),J(n)}),U("ngModelChange",function(n){T(A);let o=p(4);return J(o.onJsonInputChange(n))}),Q()(),B(2,"div",23)(3,"button",24),U("click",function(){T(A);let n=p(4);return J(n.onSend())}),y(4," Submit "),Q()()}if(t&2){let A=p(4);u(),wi("ngModel",A.formModelJson)}}function qSA(t,e){if(t&1&&(B(0,"div",22)(1,"pre"),y(2),Q()()),t&2){let A=p(4);u(2),lA(A.getPayloadJson())}}function VSA(t,e){if(t&1&&(B(0,"div",22)(1,"pre"),y(2),Q()()),t&2){let A=p(4);u(2),lA(A.getResponseSchemaJson())}}function WSA(t,e){if(t&1&&(B(0,"div",10),O(1,PSA,6,0,"div",21)(2,jSA,5,1)(3,qSA,3,1,"div",22)(4,VSA,3,1,"div",22),Q()),t&2){let A=p(3);u(),Y(A.activeTab==="form"?1:A.activeTab==="json"?2:A.activeTab==="payload"?3:A.activeTab==="response schema"?4:-1)}}function ZSA(t,e){if(t&1){let A=QA();B(0,"input",34),Di("ngModelChange",function(n){T(A);let o=p(3);return Bi(o.functionCall.userResponse,n)||(o.functionCall.userResponse=n),J(n)}),U("keydown.enter",function(){T(A);let n=p(3);return J(n.onSend())}),Q(),B(1,"button",35),U("click",function(){T(A);let n=p(3);return J(n.onSend())}),B(2,"mat-icon"),y(3,"send"),Q()()}if(t&2){let A=p(3);wi("ngModel",A.functionCall.userResponse),u(),H("disabled",!A.functionCall.userResponse)}}function XSA(t,e){if(t&1&&(B(0,"div",3),O(1,LSA,9,8,"div",7),B(2,"div",8),O(3,GSA,15,5,"div",9)(4,WSA,5,1,"div",10)(5,ZSA,4,2),Q()()),t&2){let A=p(2);u(),Y(A.formFields.length>0?1:-1),u(2),Y(A.isConfirmationRequest?3:A.formFields.length>0?4:5)}}function $SA(t,e){if(t&1&&(B(0,"div",1),U("click",function(i){return i.stopPropagation()}),O(1,FSA,9,3,"div",2)(2,XSA,6,2,"div",3),Q()),t&2){let A=p();u(),Y(A.hasMessage()?1:2)}}var Hy=class t{functionCall;appName;userId;sessionId;responseComplete=new LA;formModel={};formFields=[];activeTab="form";formModelJson="";confirmationModel={confirmed:!1,payload:""};get isConfirmationRequest(){return this.functionCall?.name==="adk_request_confirmation"}cdr=w(wt);ngOnChanges(e){e.functionCall&&this.initForm()}initForm(){if(this.formModel={},this.formFields=[],this.isConfirmationRequest){this.confirmationModel.confirmed=this.functionCall.args?.toolConfirmation?.confirmed||!1,this.confirmationModel.payload=JSON.stringify(this.functionCall.args?.originalFunctionCall?.args||{},null,2);return}let e=this.functionCall?.args?.response_schema;if(e&&e.type==="object"&&e.properties)for(let A of Object.keys(e.properties)){let i=e.properties[A],n=i.type;if(!n&&i.anyOf){let o=i.anyOf.find(a=>a.type!=="null");o&&(n=o.type)}this.formFields.push({key:A,type:n,title:i.title||A,description:i.description||"",required:e.required?.includes(A)||!1}),n==="boolean"?this.formModel[A]=!1:n==="number"||n==="integer"?this.formModel[A]=null:this.formModel[A]=""}}getCleanedFormModel(){let e=this.functionCall?.args?.response_schema;if(!e||e.type!=="object"||!e.properties)return this.formModel;let A=gA({},this.formModel);for(let i of Object.keys(e.properties)){let n=e.properties[i],o=A[i];if(o!=null&&o!==""){let a=n.type;if(!a&&n.anyOf){let r=n.anyOf.find(s=>s.type!=="null");r&&(a=r.type)}a==="integer"?A[i]=parseInt(o,10):a==="number"&&(A[i]=parseFloat(o))}else A[i]=null}return A}updateFormModelJson(){this.formModelJson=JSON.stringify(this.getCleanedFormModel(),null,2)}onJsonInputChange(e){try{let A=JSON.parse(e);this.formModel=A}catch(A){}}setActiveTab(e){this.activeTab=e,e==="json"&&this.updateFormModelJson()}hasMessage(){return!!(this.functionCall.args?.prompt||this.functionCall.args?.message)}getPromptText(){return this.functionCall.args?.prompt||this.functionCall.args?.message||"Please provide your response"}hasPayload(){return this.functionCall.args?.payload!==void 0&&this.functionCall.args?.payload!==null}getPayloadJson(){try{return JSON.stringify(this.functionCall.args?.payload||{},null,2)}catch(e){return""}}hasResponseSchema(){return!!this.functionCall.args?.response_schema}getResponseSchemaJson(){try{return JSON.stringify(this.functionCall.args?.response_schema||{},null,2)}catch(e){return""}}onSend(){if(this.isConfirmationRequest){let o={};try{o=JSON.parse(this.confirmationModel.payload)}catch(s){o=this.functionCall.args?.originalFunctionCall?.args||{}}let a={confirmed:this.confirmationModel.confirmed,payload:o};this.functionCall.responseStatus="sent",this.cdr.detectChanges();let r={role:"user",parts:[{functionResponse:{id:this.functionCall.id,name:this.functionCall.name,response:a}}],functionCallEventId:this.functionCall.functionCallEventId};this.responseComplete.emit(r);return}let e,A=this.functionCall?.args?.response_schema;if(A&&A.type==="object"&&A.properties&&this.formFields.length>0){let o=this.getCleanedFormModel();e=o,this.functionCall.userResponse=JSON.stringify(o),this.functionCall.sentUserResponse=this.functionCall.userResponse}else{if(!this.functionCall.userResponse||!this.functionCall.userResponse.trim())return;this.functionCall.sentUserResponse=this.functionCall.userResponse;try{let o=JSON.parse(this.functionCall.userResponse);typeof o=="object"&&o!==null?e=o:e={result:this.functionCall.userResponse}}catch(o){e={result:this.functionCall.userResponse}}}this.functionCall.responseStatus="sent",this.cdr.detectChanges();let n={role:"user",parts:[{functionResponse:{id:this.functionCall.id,name:this.functionCall.name,response:e}}],functionCallEventId:this.functionCall.functionCallEventId};this.responseComplete.emit(n)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-long-running-response"]],inputs:{functionCall:"functionCall",appName:"appName",userId:"userId",sessionId:"sessionId"},outputs:{responseComplete:"responseComplete"},features:[Yt],decls:1,vars:1,consts:[[1,"response-chip-container"],[1,"response-chip-container",3,"click"],[1,"message-box"],[1,"request-card-standalone"],[1,"message-content"],[3,"text"],[1,"request-card"],[1,"tabs-header"],[1,"input-container"],[1,"confirmation-container",2,"width","100%"],[1,"tabs-content"],[1,"tab-link",3,"click"],[1,"confirmation-hint",2,"margin-bottom","10px","font-size","13px","font-weight","600","color","var(--mat-sys-on-surface)"],[1,"confirmation-payload",2,"margin-bottom","10px"],[1,"field-label",2,"margin-bottom","5px","font-size","12px","font-weight","500","color","var(--mat-sys-on-surface-variant)"],[3,"json"],[1,"confirmation-footer",2,"display","flex","justify-content","space-between","align-items","center","margin-top","10px"],[1,"confirmation-checkbox",2,"font-size","12px"],[2,"display","flex","align-items","center","gap","6px","cursor","pointer"],["type","checkbox",2,"cursor","pointer",3,"ngModelChange","id","ngModel"],["mat-raised-button","","color","primary",1,"form-submit-button",2,"margin-top","0",3,"click"],[1,"schema-form","grid-layout"],[1,"json-view"],[1,"grid-submit"],["mat-raised-button","","color","primary",1,"form-submit-button",3,"click"],[1,"grid-label"],[1,"grid-value"],["type","checkbox",3,"ngModelChange","id","ngModel"],[1,"field-description"],["type","number",1,"form-input",3,"id","ngModel"],["type","text",1,"form-input",3,"id","ngModel"],["type","number",1,"form-input",3,"ngModelChange","id","ngModel"],["type","text",1,"form-input",3,"ngModelChange","id","ngModel"],[1,"json-textarea",3,"ngModelChange","ngModel"],["placeholder","Enter your response...",1,"response-input",3,"ngModelChange","keydown.enter","ngModel"],["mat-icon-button","",1,"send-button",3,"click","disabled"]],template:function(A,i){A&1&&O(0,$SA,3,1,"div",0),A&2&&Y(i.functionCall.responseStatus!=="sent"&&i.functionCall.responseStatus!=="sending"?0:-1)},dependencies:[ln,Dn,YQ,rb,yn,ko,ji,pi,Wt,BQ,cs,$l],styles:["[_nghost-%COMP%]{display:block}.response-chip-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;margin:5px 5px 5px 0}.message-box[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high);border:1px solid var(--mat-sys-outline-variant);border-radius:20px;padding:12px 16px;box-shadow:none;display:flex;flex-direction:column;gap:12px}.message-content[_ngcontent-%COMP%]{flex:1;font-size:12px}.request-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;width:100%}.request-card-standalone[_ngcontent-%COMP%]{background:color-mix(in srgb,var(--mat-sys-surface-container-high) 70%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid color-mix(in srgb,var(--mat-sys-outline-variant) 30%,transparent);border-radius:12px;padding:12px;box-shadow:0 4px 16px #0003;display:flex;flex-direction:column;gap:8px;max-width:400px}.data-buttons[_ngcontent-%COMP%]{display:flex;gap:8px}.input-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;width:100%}.input-container[_ngcontent-%COMP%] .response-input[_ngcontent-%COMP%]{flex:1;border:1px solid var(--mat-sys-outline-variant);border-radius:4px;padding:4px 8px;background:var(--mat-sys-surface-container);outline:none;font-size:12px;font-family:inherit;color:var(--mat-sys-on-surface);caret-color:var(--mat-sys-primary)}.input-container[_ngcontent-%COMP%] .response-input[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant);opacity:.6}.input-container[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%]{color:var(--mat-sys-primary);width:24px;height:24px;min-width:24px;padding:0;line-height:24px;box-sizing:border-box}.input-container[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-on-surface-variant);opacity:.3}.input-container[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}.tabs-header[_ngcontent-%COMP%]{display:flex;gap:8px;border-bottom:1px solid var(--mat-sys-outline-variant);margin-bottom:8px;padding-bottom:4px}.tab-link[_ngcontent-%COMP%]{font-size:11px;font-weight:500;color:var(--mat-sys-on-surface-variant);cursor:pointer;padding:2px 6px;border-radius:4px}.tab-link[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-high)}.tab-link.active[_ngcontent-%COMP%]{color:var(--mat-sys-primary);background:var(--mat-sys-primary-container)}.tabs-content[_ngcontent-%COMP%]{width:100%}.json-view[_ngcontent-%COMP%]{padding:4px 0;max-height:200px;overflow:auto}.json-view[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{margin:0;font-size:10px;font-family:monospace;color:var(--mat-sys-on-surface)}.json-view[_ngcontent-%COMP%] .json-textarea[_ngcontent-%COMP%]{width:100%;height:150px;margin:0;font-size:10px;font-family:monospace;color:var(--mat-sys-on-surface);background:transparent;border:1px solid var(--mat-sys-outline-variant);border-radius:4px;padding:4px;resize:vertical;box-sizing:border-box}.json-view[_ngcontent-%COMP%] .json-textarea[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--mat-sys-primary)}.schema-form.grid-layout[_ngcontent-%COMP%]{display:grid;grid-template-columns:max-content 1fr;gap:4px 8px;align-items:start;width:100%;padding:4px 2px}.grid-label[_ngcontent-%COMP%]{font-size:11px;font-weight:500;color:var(--mat-sys-on-surface);text-align:right;white-space:nowrap;padding-top:6px}.grid-value[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px;width:100%}.grid-value[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%]{width:100%;border:1px solid var(--mat-sys-outline-variant);border-radius:4px;padding:4px 6px;font-size:11px;background:var(--mat-sys-surface-container);color:var(--mat-sys-on-surface);box-sizing:border-box;height:28px}.grid-value[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--mat-sys-primary)}.grid-value[_ngcontent-%COMP%] input[type=checkbox][_ngcontent-%COMP%]{margin:4px 0;align-self:flex-start}.field-description[_ngcontent-%COMP%]{font-size:10px;color:var(--mat-sys-on-surface-variant);opacity:.8}.grid-submit[_ngcontent-%COMP%]{grid-column:1/-1;display:flex;justify-content:flex-end;margin-top:4px}.form-submit-button[_ngcontent-%COMP%]{align-self:flex-end;margin-top:2px;height:28px!important;line-height:28px!important;font-size:11px!important}"]})};function AkA(t,e){if(t&1&&hA(0,"a2ui-surface",0),t&2){let A=p();H("surfaceId",A.surfaceId())("surface",A.surface())}}var zy=class t{processor=w(CL);beginRendering=null;surfaceUpdate=null;dataModelUpdate=null;surfaceId=bA(null);activeSurface=bA(null);surface=pe(()=>this.activeSurface());constructor(){}ngOnChanges(e){let A=[],i=null;e.beginRendering&&this.beginRendering&&Object.keys(this.beginRendering).length>0&&(A.push(this.beginRendering),i=this.beginRendering?.beginRendering?.surfaceId??i),e.surfaceUpdate&&this.surfaceUpdate&&Object.keys(this.surfaceUpdate).length>0&&(A.push(this.surfaceUpdate),i=this.surfaceUpdate?.surfaceUpdate?.surfaceId??i),e.dataModelUpdate&&this.dataModelUpdate&&Object.keys(this.dataModelUpdate).length>0&&(A.push(this.dataModelUpdate),i=this.dataModelUpdate?.dataModelUpdate?.surfaceId??i),A.length>0&&this.processor.processMessages(A),i&&this.surfaceId.set(i);let n=this.surfaceId();if(n){let o=this.processor.getSurfaces();o.has(n)&&this.activeSurface.set(o.get(n))}}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-a2ui-canvas"]],inputs:{beginRendering:"beginRendering",surfaceUpdate:"surfaceUpdate",dataModelUpdate:"dataModelUpdate"},features:[Yt],decls:1,vars:1,consts:[[3,"surfaceId","surface"]],template:function(A,i){A&1&&O(0,AkA,1,2,"a2ui-surface",0),A&2&&Y(i.surface()?0:-1)},dependencies:[li,BL],styles:["[_nghost-%COMP%]{display:block;height:100%;width:100%;overflow:auto}[_nghost-%COMP%] *{box-sizing:border-box}.canvas[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;padding:16px;box-sizing:border-box;min-height:100%}"],changeDetection:0})};var _tA=(t,e)=>({text:t,thought:e});function ekA(t,e){if(t&1&&(B(0,"div",1),y(1),Q()),t&2){let A=p();u(),lA(A.type)}}function tkA(t,e){if(t&1&&hA(0,"img",8),t&2){let A=p().$implicit;H("src",A.url,Go)}}function ikA(t,e){if(t&1&&(B(0,"a",9),y(1),Q()),t&2){let A=p(2).$implicit;H("href",A.url,Go),u(),lA(A.file.name)}}function nkA(t,e){if(t&1&&y(0),t&2){let A=p(2).$implicit;ue(" ",A.file.name," ")}}function okA(t,e){if(t&1&&(B(0,"mat-icon"),y(1,"insert_drive_file"),Q(),O(2,ikA,2,2,"a",9)(3,nkA,1,1)),t&2){let A=p().$implicit;u(2),Y(A.url?2:3)}}function akA(t,e){if(t&1&&(B(0,"div",7),O(1,tkA,1,1,"img",8),O(2,okA,4,1),Q()),t&2){let A=e.$implicit;u(),Y(A.file.type.startsWith("image/")?1:-1),u(),Y(A.file.type.startsWith("image/")?-1:2)}}function rkA(t,e){if(t&1&&(B(0,"div",4),Ue(1,akA,3,2,"div",7,ri),Q()),t&2){let A=p(2);u(),Te(A.uiEvent.attachments)}}function skA(t,e){if(t&1&&(B(0,"div",5),sn(1,10),Q()),t&2){let A=p(2);H("appJsonTooltip",A.jsonOutputData),u(),H("ngComponentOutlet",A.markdownComponent)("ngComponentOutletInputs",U0(3,_tA,A.uiEvent.text||A.rawMessageText,A.uiEvent.thought))}}function lkA(t,e){if(t&1){let A=QA();B(0,"div",12)(1,"textarea",13,0),U("ngModelChange",function(n){T(A);let o=p(4);return J(o.userEditEvalCaseMessageChange.emit(n))})("keydown",function(n){T(A);let o=p(4);return J(o.handleKeydown.emit({event:n,message:o.uiEvent}))}),Q(),B(3,"div",14)(4,"span",15),U("click",function(){T(A);let n=p(4);return J(n.cancelEditMessage.emit(n.uiEvent))}),y(5," close "),Q(),B(6,"span",16),U("click",function(){T(A);let n=p(4);return J(n.saveEditMessage.emit(n.uiEvent))}),y(7," check "),Q()()()}if(t&2){let A=p(4);u(),H("ngModel",A.userEditEvalCaseMessage),u(3),H("matTooltip",A.i18n.cancelEditingTooltip),u(2),H("matTooltip",A.i18n.saveEvalMessageTooltip)}}function gkA(t,e){if(t&1&&sn(0,10),t&2){let A=p(4);H("ngComponentOutlet",A.markdownComponent)("ngComponentOutletInputs",U0(2,_tA,A.uiEvent.text,A.uiEvent.thought))}}function ckA(t,e){if(t&1&&O(0,lkA,8,3,"div",12)(1,gkA,1,5,"ng-container",10),t&2){let A=p(3);Y(A.uiEvent.isEditing?0:1)}}function CkA(t,e){if(t&1&&(B(0,"div"),hA(1,"div",17),Q()),t&2){let A=p(3);u(),H("innerHTML",A.renderGooglerSearch(A.uiEvent.renderedContent),Gc)}}function IkA(t,e){if(t&1&&hA(0,"app-a2ui-canvas",11),t&2){let A=p(3);H("beginRendering",A.uiEvent.a2uiData.beginRendering)("surfaceUpdate",A.uiEvent.a2uiData.surfaceUpdate)("dataModelUpdate",A.uiEvent.a2uiData.dataModelUpdate)}}function dkA(t,e){if(t&1&&(B(0,"div")(1,"div"),O(2,ckA,2,1),Q(),O(3,CkA,2,1,"div"),O(4,IkA,1,3,"app-a2ui-canvas",11),Q()),t&2){let A=p(2);u(2),Y(A.uiEvent.text?2:-1),u(),Y(A.uiEvent.renderedContent?3:-1),u(),Y(A.uiEvent.a2uiData?4:-1)}}function BkA(t,e){if(t&1&&(B(0,"code"),y(1),Q()),t&2){let A=p(2);u(),ue(" ",A.uiEvent.executableCode.code," ")}}function EkA(t,e){if(t&1&&(B(0,"div")(1,"div"),y(2),Q(),B(3,"div"),y(4),Q()()),t&2){let A=p(2);u(2),ba("",A.i18n.outcomeLabel,": ",A.uiEvent.codeExecutionResult.outcome),u(2),ba("",A.i18n.outputLabel,": ",A.uiEvent.codeExecutionResult.output)}}function hkA(t,e){if(t&1){let A=QA();B(0,"div",18)(1,"img",19),U("click",function(){T(A);let n=p(4);return J(n.openViewImageDialog.emit(n.uiEvent.inlineData.data))}),Q()()}if(t&2){let A=p(4);u(),H("src",A.uiEvent.inlineData.data,Go)}}function QkA(t,e){if(t&1&&(B(0,"div"),hA(1,"app-audio-player",20),Q()),t&2){let A=p(4);u(),H("base64data",A.uiEvent.inlineData.data)}}function ukA(t,e){if(t&1){let A=QA();B(0,"div")(1,"div",21)(2,"mat-icon"),y(3,"description"),Q(),B(4,"button",22),U("click",function(){T(A);let n=p(4);return J(n.openBase64InNewTab.emit({data:n.uiEvent.inlineData.data,mimeType:n.uiEvent.inlineData.mimeType}))}),y(5),Q()()()}if(t&2){let A=p(4);u(5),ue(" ",A.uiEvent.inlineData.name," ")}}function fkA(t,e){if(t&1){let A=QA();B(0,"div")(1,"button",22),U("click",function(){T(A);let n=p(4);return J(n.openBase64InNewTab.emit({data:n.uiEvent.inlineData.data,mimeType:n.uiEvent.inlineData.mimeType}))}),y(2),Q()()}if(t&2){let A=p(4);u(2),ue(" ",A.uiEvent.inlineData.name," ")}}function pkA(t,e){if(t&1&&(B(0,"div")(1,"div"),O(2,hkA,2,1,"div",18)(3,QkA,2,1,"div")(4,ukA,6,1,"div")(5,fkA,3,1,"div"),Q()()),t&2){let A,i=p(3);u(2),Y((A=i.uiEvent.inlineData.mediaType)===i.MediaType.IMAGE?2:A===i.MediaType.AUDIO?3:A===i.MediaType.TEXT?4:5)}}function mkA(t,e){if(t&1){let A=QA();B(0,"div")(1,"img",23),U("click",function(){T(A);let n=p(4);return J(n.openViewImageDialog.emit(n.uiEvent.inlineData.data))}),Q()()}if(t&2){let A=p(4);u(),H("src",A.uiEvent.inlineData.data,Go)}}function wkA(t,e){if(t&1&&(B(0,"div",7)(1,"mat-icon"),y(2,"insert_drive_file"),Q(),B(3,"a",9),y(4),Q()()),t&2){let A=p(4);u(3),H("href",A.uiEvent.inlineData.data,Go),u(),lA(A.uiEvent.inlineData.displayName)}}function DkA(t,e){if(t&1&&(B(0,"div"),O(1,mkA,2,1,"div")(2,wkA,5,2,"div",7),Q()),t&2){let A=p(3);u(),Y(A.uiEvent.inlineData.mimeType.startsWith("image/")?1:2)}}function ykA(t,e){if(t&1&&O(0,pkA,6,1,"div")(1,DkA,3,1,"div"),t&2){let A=p(2);Y(A.uiEvent.role==="bot"?0:1)}}function vkA(t,e){if(t&1&&(B(0,"div",24),hA(1,"app-audio-player",20),Q()),t&2){let A=p(4);u(),H("base64data",A.audioUrl||"")}}function bkA(t,e){if(t&1&&O(0,vkA,2,1,"div",24),t&2){let A=e.$implicit;Y(A.fileData&&A.fileData.mimeType.startsWith("audio/")?0:-1)}}function MkA(t,e){if(t&1&&Ue(0,bkA,1,1,null,null,ri),t&2){let A=p(2);Te(A.uiEvent.event==null||A.uiEvent.event.content==null?null:A.uiEvent.event.content.parts)}}function SkA(t,e){if(t&1&&(B(0,"div",27)(1,"div",28),y(2),Q(),hA(3,"ngx-json-viewer",29),Q(),B(4,"div",30)(5,"div",31),y(6),Q(),hA(7,"ngx-json-viewer",29),Q()),t&2){let A=p(3);u(2),lA(A.i18n.actualToolUsesLabel),u(),H("json",A.uiEvent.actualInvocationToolUses),u(3),lA(A.i18n.expectedToolUsesLabel),u(),H("json",A.uiEvent.expectedInvocationToolUses)}}function kkA(t,e){if(t&1&&(B(0,"div",27)(1,"div",28),y(2),Q(),B(3,"div"),y(4),Q()(),B(5,"div",30)(6,"div",31),y(7),Q(),B(8,"div"),y(9),Q()()),t&2){let A=p(3);u(2),lA(A.i18n.actualResponseLabel),u(2),lA(A.uiEvent.actualFinalResponse),u(3),lA(A.i18n.expectedResponseLabel),u(2),lA(A.uiEvent.expectedFinalResponse)}}function xkA(t,e){if(t&1&&(B(0,"div",26)(1,"span",32),y(2),Q(),B(3,"span",33),y(4),Q()()),t&2){let A=p(3);u(2),ba("",A.i18n.matchScoreLabel,": ",A.uiEvent.evalScore),u(2),ba("",A.i18n.thresholdLabel,": ",A.uiEvent.evalThreshold)}}function _kA(t,e){if(t&1&&(B(0,"div",6)(1,"div",25),O(2,SkA,8,4)(3,kkA,10,4),Q(),O(4,xkA,5,4,"div",26),Q()),t&2){let A=p(2);u(2),Y(A.uiEvent.actualInvocationToolUses?2:A.uiEvent.actualFinalResponse?3:-1),u(2),Y(A.uiEvent.evalScore!==void 0&&A.uiEvent.evalThreshold!==void 0?4:-1)}}function RkA(t,e){if(t&1&&(O(0,rkA,3,0,"div",4),O(1,skA,2,6,"div",5)(2,dkA,5,3,"div"),O(3,BkA,2,1,"code"),O(4,EkA,5,4,"div"),O(5,ykA,2,1),O(6,MkA,2,0),O(7,_kA,5,2,"div",6)),t&2){let A=p();Y(A.uiEvent.attachments?0:-1),u(),Y(A.uiEvent.event.nodeInfo!=null&&A.uiEvent.event.nodeInfo.messageAsOutput?1:A.uiEvent.thought||A.uiEvent.text||A.uiEvent.renderedContent||A.uiEvent.a2uiData||A.uiEvent.event.inputTranscription||A.uiEvent.event.outputTranscription?2:-1),u(2),Y(A.uiEvent.executableCode?3:-1),u(),Y(A.uiEvent.codeExecutionResult?4:-1),u(),Y(A.uiEvent.inlineData?5:-1),u(),Y(!(A.uiEvent.event==null||A.uiEvent.event.content==null)&&A.uiEvent.event.content.parts?6:-1),u(),Y(A.uiEvent.failedMetric&&A.uiEvent.evalStatus===2?7:-1)}}function NkA(t,e){if(t&1&&hA(0,"ngx-json-viewer",2),t&2){let A=p();H("json",A.uiEvent.event.output)("appJsonTooltip",(A.uiEvent.event.nodeInfo==null?null:A.uiEvent.event.nodeInfo.outputFor)||A.uiEvent.nodePath)}}function FkA(t,e){if(t&1&&hA(0,"ngx-json-viewer",3),t&2){let A=p();H("json",A.uiEvent.error)("appJsonTooltip",A.uiEvent.error)}}function LkA(t,e){if(t&1&&y(0),t&2){let A=p(2);ue(" ",A.uiEvent.event.inputTranscription.text," ")}}function GkA(t,e){if(t&1&&y(0),t&2){let A=p(2);ue(" ",A.uiEvent.event.outputTranscription.text," ")}}function KkA(t,e){if(t&1&&O(0,LkA,1,1)(1,GkA,1,1),t&2){let A=p();Y(A.role==="user"&&A.uiEvent.event.inputTranscription?0:A.role==="bot"&&A.uiEvent.event.outputTranscription?1:-1)}}var Py=class t{uiEvent;type="message";role="bot";evalStatus;userEditEvalCaseMessage="";userEditEvalCaseMessageChange=new LA;handleKeydown=new LA;cancelEditMessage=new LA;saveEditMessage=new LA;openViewImageDialog=new LA;openBase64InNewTab=new LA;i18n=w(UI);sanitizer=w(Cs);markdownComponent=w(_I);MediaType=aC;renderGooglerSearch(e){return this.sanitizer.bypassSecurityTrustHtml(e)}get rawMessageText(){let e=this.uiEvent.event?.content?.parts;return e?e.filter(A=>A.text).map(A=>A.text).join(""):""}get jsonOutputData(){if(this.uiEvent.event?.nodeInfo?.messageAsOutput===!0){let e=this.rawMessageText;if(e)try{return JSON.parse(e)}catch(A){return null}}return null}get hasAudio(){if(this.uiEvent.inlineData?.mediaType==="audio")return!0;let e=this.uiEvent.event?.content?.parts;return e?e.some(A=>A.fileData&&A.fileData.mimeType&&A.fileData.mimeType.startsWith("audio/")):!1}audioUrl=null;ngOnChanges(e){e.uiEvent&&this.uiEvent&&this.checkAndLoadAudio()}http=w(fr);artifactService=w(TB);changeDetectorRef=w(wt);checkAndLoadAudio(){let e=this.uiEvent.event?.content?.parts;if(e){let A=e.find(i=>i.fileData&&i.fileData.mimeType&&i.fileData.mimeType.startsWith("audio/pcm"));A&&A.fileData&&this.loadAudio(A.fileData.fileUri)}}loadAudio(e){if(!e||!e.startsWith("artifact://"))return;let A=e.substring(11).split("/"),i=A[0],n=A[1],o=A[2],a=A.slice(3).join("/"),r=a.indexOf("#"),s=r!==-1?a.substring(0,r):a,l=r!==-1?a.substring(r+1):"0",g=s.lastIndexOf("/"),C=g!==-1?s.substring(g+1):s;this.artifactService.getLatestArtifact(n,i,o,C).subscribe(I=>{let d="";if(I.inlineData&&I.inlineData.data?d=I.inlineData.data:I.data&&(d=I.data),d){let h=this.base64ToArrayBuffer(d),E=h.byteLength-h.byteLength%2,f=h.slice(0,E),v=this.pcmToWav(f,24e3,1),k=new FileReader;k.onloadend=()=>{this.audioUrl=k.result,this.changeDetectorRef.detectChanges()},k.readAsDataURL(v)}})}base64ToArrayBuffer(e){let A=e.replace(/\s/g,""),i=A.indexOf(",");for(i!==-1&&(A=A.substring(i+1)),A=A.replace(/-/g,"+").replace(/_/g,"/");A.length%4!==0;)A+="=";let n=window.atob(A),o=n.length,a=new Uint8Array(o);for(let r=0;rA.toString(16).padStart(2,"0")).join(" ")}pcmToWav(e,A,i){let n=new ArrayBuffer(44),o=new DataView(n);return this.writeString(o,0,"RIFF"),o.setUint32(4,36+e.byteLength,!0),this.writeString(o,8,"WAVE"),this.writeString(o,12,"fmt "),o.setUint32(16,16,!0),o.setUint16(20,1,!0),o.setUint16(22,i,!0),o.setUint32(24,A,!0),o.setUint32(28,A*i*2,!0),o.setUint16(32,i*2,!0),o.setUint16(34,16,!0),this.writeString(o,36,"data"),o.setUint32(40,e.byteLength,!0),new Blob([n,e],{type:"audio/wav"})}writeString(e,A,i){for(let n=0;n({"eval-pass":t,"eval-fail":e}),HN=t=>({hidden:t}),zN=(t,e)=>e.id;function TkA(t,e){if(t&1){let A=QA();B(0,"app-content-bubble",10),U("userEditEvalCaseMessageChange",function(n){T(A);let o=p();return J(o.userEditEvalCaseMessageChange.emit(n))})("handleKeydown",function(n){T(A);let o=p();return J(o.handleKeydown.emit(n))})("cancelEditMessage",function(n){T(A);let o=p();return J(o.cancelEditMessage.emit(n))})("saveEditMessage",function(n){T(A);let o=p();return J(o.saveEditMessage.emit(n))})("openViewImageDialog",function(n){T(A);let o=p();return J(o.openViewImageDialog.emit({images:[n],currentIndex:0}))})("openBase64InNewTab",function(n){T(A);let o=p();return J(o.openBase64InNewTab.emit(n))}),Q()}if(t&2){let A=p();H("type",A.uiEvent.thought?"thought":"message")("role",A.uiEvent.role)("evalStatus",A.uiEvent.evalStatus)("uiEvent",A.uiEvent)("userEditEvalCaseMessage",A.userEditEvalCaseMessage)}}function JkA(t,e){if(t&1&&hA(0,"app-content-bubble",1),t&2){let A=p();H("uiEvent",A.uiEvent)}}function OkA(t,e){if(t&1&&hA(0,"app-content-bubble",2),t&2){let A=p();H("uiEvent",A.uiEvent)}}function YkA(t,e){if(t&1&&hA(0,"app-content-bubble",3),t&2){let A=p();H("uiEvent",A.uiEvent)}}function HkA(t,e){t&1&&hA(0,"app-hover-info-button",5),t&2&&H("icon","stop_circle")("text","Turn Complete")("tooltipContent","The agent has completed this turn")("tooltipTitle","Turn Complete")}function zkA(t,e){t&1&&hA(0,"app-hover-info-button",5),t&2&&H("icon","report")("text","Interrupted")("tooltipContent","The stream was interrupted")("tooltipTitle","Interrupted")}function PkA(t,e){if(t&1&&hA(0,"app-hover-info-button",5),t&2){let A=e.$implicit;H("icon","bolt")("text",A.name)("tooltipContent",A.args||"")("tooltipTitle","Function Call")}}function jkA(t,e){if(t&1){let A=QA();B(0,"app-computer-action",14),U("clickEvent",function(n){T(A);let o=p(3);return J(o.clickEvent.emit(n))})("openImage",function(n){T(A);let o=p(3);return J(o.openViewImageDialog.emit(n))}),Q()}if(t&2){let A=p().$implicit,i=p(2);H("functionCall",A)("allMessages",i.uiEvents)("index",i.index)}}function qkA(t,e){if(t&1&&O(0,jkA,1,3,"app-computer-action",13),t&2){let A=e.$implicit,i=p(2);Y(i.isComputerUseClick(A)?0:-1)}}function VkA(t,e){if(t&1&&(B(0,"div",11),Ue(1,PkA,1,4,"app-hover-info-button",5,zN),Q(),B(3,"div",12),Ue(4,qkA,1,1,null,null,zN),Q()),t&2){let A=p();u(),Te(A.uiEvent.functionCalls),u(3),Te(A.uiEvent.functionCalls)}}function WkA(t,e){if(t&1){let A=QA();B(0,"app-computer-action",16),U("clickEvent",function(n){T(A);let o=p(3);return J(o.clickEvent.emit(n))}),Q()}if(t&2){let A=p().$implicit,i=p(2);H("functionResponse",A)("allMessages",i.uiEvents)("index",i.index)}}function ZkA(t,e){if(t&1&&hA(0,"app-hover-info-button",5),t&2){let A=p().$implicit;H("icon","check")("text",A.name)("tooltipContent",A.response||"")("tooltipTitle","Function Response")}}function XkA(t,e){if(t&1&&O(0,WkA,1,3,"app-computer-action",15)(1,ZkA,1,4,"app-hover-info-button",5),t&2){let A=e.$implicit,i=p(2);Y(i.isComputerUseResponse(A)?0:1)}}function $kA(t,e){if(t&1&&Ue(0,XkA,2,1,null,null,ri),t&2){let A=p();Te(A.uiEvent.functionResponses)}}function AxA(t,e){if(t&1&&hA(0,"app-hover-info-button",5),t&2){let A=p(),i=zn(9);H("icon","data_object")("text","State: "+i.join(", "))("tooltipContent",A.getFilteredStateDelta(A.uiEvent.stateDelta))("tooltipTitle","State Update")}}function exA(t,e){if(t&1&&hA(0,"app-hover-info-button",5),t&2){let A=p();H("icon","attachment")("text","Artifact")("tooltipContent",A.uiEvent.artifactDelta)("tooltipTitle","Artifact")}}function txA(t,e){if(t&1&&hA(0,"app-content-bubble",6),t&2){let A=p();H("uiEvent",A.uiEvent)}}function ixA(t,e){if(t&1&&hA(0,"app-hover-info-button",5),t&2){let A=p();H("icon","route")("text","route: "+A.String(A.uiEvent.route))("tooltipContent",A.uiEvent.route)("tooltipTitle","Route")}}function nxA(t,e){if(t&1){let A=QA();B(0,"button",17),U("click",function(n){T(A);let o=p();return J(o.agentStateClick.emit({event:n,index:o.index}))}),B(1,"mat-icon"),y(2,"account_tree"),Q(),y(3," Agent State "),Q()}if(t&2){let A=p();H("appWorkflowGraphTooltip",A.getWorkflowNodes())("agentGraphData",A.agentGraphData)("nodePath",A.uiEvent.nodePath)("allNodes",A.allWorkflowNodes)}}function oxA(t,e){if(t&1&&hA(0,"app-hover-info-button",8),t&2){let A=p();H("icon","check_circle")("text",A.getEndOfAgentAuthor()+" completed!")}}function axA(t,e){if(t&1){let A=QA();B(0,"app-long-running-response",19),U("responseComplete",function(n){T(A);let o=p(3);return J(o.longRunningResponseComplete.emit(n))}),Q()}if(t&2){let A=p().$implicit,i=p(2);H("functionCall",A)("appName",i.appName)("userId",i.userId)("sessionId",i.sessionId)}}function rxA(t,e){if(t&1&&O(0,axA,1,4,"app-long-running-response",18),t&2){let A=e.$implicit,i=p(2);Y(A.needsResponse&&!i.hasFunctionResponse(A.id)?0:-1)}}function sxA(t,e){if(t&1&&Ue(0,rxA,1,1,null,null,zN),t&2){let A=p();Te(A.uiEvent.functionCalls)}}function lxA(t,e){if(t&1&&(B(0,"div",9)(1,"span",20),y(2),Q()()),t&2){let A=p();H("ngClass",U0(2,UkA,A.uiEvent.evalStatus===1,A.uiEvent.evalStatus===2)),u(2),lA(A.uiEvent.evalStatus===1?A.i18n.evalPassLabel:A.uiEvent.evalStatus===2?A.i18n.evalFailLabel:"")}}function gxA(t,e){if(t&1){let A=QA();B(0,"div")(1,"span",21),U("click",function(){T(A);let n=p(2);return J(n.editEvalCaseMessage.emit(n.uiEvent))}),y(2," edit "),Q(),B(3,"span",21),U("click",function(){T(A);let n=p(2);return J(n.deleteEvalCaseMessage.emit({message:n.uiEvent,index:n.index}))}),y(4," delete "),Q()()}if(t&2){let A=p(2);u(),H("ngClass",Ks(4,HN,A.isEvalCaseEditing))("matTooltip",A.i18n.editEvalMessageTooltip),u(2),H("ngClass",Ks(6,HN,A.isEvalCaseEditing))("matTooltip",A.i18n.deleteEvalMessageTooltip)}}function cxA(t,e){if(t&1){let A=QA();B(0,"div")(1,"span",21),U("click",function(){T(A);let n=p(2);return J(n.editFunctionArgs.emit(n.uiEvent))}),y(2," edit "),Q()()}if(t&2){let A=p(2);u(),H("ngClass",Ks(2,HN,A.isEvalCaseEditing))("matTooltip",A.i18n.editFunctionArgsTooltip)}}function CxA(t,e){if(t&1&&O(0,gxA,5,8,"div")(1,cxA,3,4,"div"),t&2){let A=p();Y(A.uiEvent.text?0:A.isEditFunctionArgsEnabled&&A.uiEvent.functionCalls&&A.uiEvent.functionCalls.length>0?1:-1)}}var EQ=class t{uiEvent;index;uiEvents=[];appName="";userId="";sessionId="";sessionName="";evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;isEditFunctionArgsEnabled=!1;userEditEvalCaseMessage="";agentGraphData=null;allWorkflowNodes=null;handleKeydown=new LA;cancelEditMessage=new LA;saveEditMessage=new LA;userEditEvalCaseMessageChange=new LA;openViewImageDialog=new LA;openBase64InNewTab=new LA;editEvalCaseMessage=new LA;deleteEvalCaseMessage=new LA;editFunctionArgs=new LA;clickEvent=new LA;longRunningResponseComplete=new LA;agentStateClick=new LA;i18n=w(UI);Object=Object;String=String;shouldShowMessageCard(e){return!!(e.text||e.attachments||e.inlineData||e.executableCode||e.codeExecutionResult||e.a2uiData||e.renderedContent||e.isLoading||e.failedMetric&&e.evalStatus===2||e.event?.content?.parts?.some(A=>A.fileData))}isComputerUseClick(e){return dQ(e)}isComputerUseResponse(e){return F0(e)}getFilteredStateKeys(e){return e?Object.keys(e).filter(A=>A!=="__llm_request_key__"):[]}getFilteredStateDelta(e){if(!e)return null;let A=gA({},e);return delete A.__llm_request_key__,A}hasWorkflowNodes(){let e=this.uiEvent.event?.actions?.agentState?.nodes;return!!e&&Object.keys(e).length>0}getWorkflowNodes(){return this.uiEvent.event?.actions?.agentState?.nodes||null}hasEndOfAgent(){return this.uiEvent.event?.actions?.endOfAgent===!0}getEndOfAgentAuthor(){return this.uiEvent.event?.author||"Agent"}hasFunctionResponse(e){return e?this.uiEvents.some(A=>A.functionResponses?.some(i=>i.id===e&&i.response?.status!=="pending")):!1}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-event-content"]],inputs:{uiEvent:"uiEvent",index:"index",uiEvents:"uiEvents",appName:"appName",userId:"userId",sessionId:"sessionId",sessionName:"sessionName",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",userEditEvalCaseMessage:"userEditEvalCaseMessage",agentGraphData:"agentGraphData",allWorkflowNodes:"allWorkflowNodes"},outputs:{handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",clickEvent:"clickEvent",longRunningResponseComplete:"longRunningResponseComplete",agentStateClick:"agentStateClick"},decls:19,vars:18,consts:[[3,"type","role","evalStatus","uiEvent","userEditEvalCaseMessage"],["type","output",3,"uiEvent"],["type","transcription","role","user",3,"uiEvent"],["type","transcription","role","bot",3,"uiEvent"],[1,"event-chips-container"],[3,"icon","text","tooltipContent","tooltipTitle"],["type","error",3,"uiEvent"],["mat-stroked-button","",1,"event-action-button",3,"appWorkflowGraphTooltip","agentGraphData","nodePath","allNodes"],[3,"icon","text"],[3,"ngClass"],[3,"userEditEvalCaseMessageChange","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","type","role","evalStatus","uiEvent","userEditEvalCaseMessage"],[1,"function-calls-buttons"],[1,"function-calls-previews"],[3,"functionCall","allMessages","index"],[3,"clickEvent","openImage","functionCall","allMessages","index"],[3,"functionResponse","allMessages","index"],[3,"clickEvent","functionResponse","allMessages","index"],["mat-stroked-button","",1,"event-action-button",3,"click","appWorkflowGraphTooltip","agentGraphData","nodePath","allNodes"],[3,"functionCall","appName","userId","sessionId"],[3,"responseComplete","functionCall","appName","userId","sessionId"],[2,"font-family","monospace"],[1,"material-symbols-outlined","eval-case-edit-button",3,"click","ngClass","matTooltip"]],template:function(A,i){if(A&1&&(O(0,TkA,1,5,"app-content-bubble",0),O(1,JkA,1,1,"app-content-bubble",1),O(2,OkA,1,1,"app-content-bubble",2),O(3,YkA,1,1,"app-content-bubble",3),B(4,"div",4),O(5,HkA,1,4,"app-hover-info-button",5),O(6,zkA,1,4,"app-hover-info-button",5),O(7,VkA,6,0),O(8,$kA,2,0),ta(9),O(10,AxA,1,4,"app-hover-info-button",5),O(11,exA,1,4,"app-hover-info-button",5),O(12,txA,1,1,"app-content-bubble",6),O(13,ixA,1,4,"app-hover-info-button",5),O(14,nxA,4,4,"button",7),O(15,oxA,1,2,"app-hover-info-button",8),Q(),O(16,sxA,2,0),O(17,lxA,3,5,"div",9),O(18,CxA,2,1)),A&2){Y(i.shouldShowMessageCard(i.uiEvent)?0:-1),u(),Y(i.uiEvent.event.output?1:-1),u(),Y(i.uiEvent.event.inputTranscription?2:-1),u(),Y(i.uiEvent.event.outputTranscription?3:-1),u(2),Y(i.uiEvent.event.turnComplete?5:-1),u(),Y(i.uiEvent.event.interrupted?6:-1),u(),Y(i.uiEvent.functionCalls&&i.uiEvent.functionCalls.length>0?7:-1),u(),Y(i.uiEvent.functionResponses&&i.uiEvent.functionResponses.length>0?8:-1),u();let n=ga(i.getFilteredStateKeys(i.uiEvent.stateDelta));u(),Y(n.length>0?10:-1),u(),Y(i.uiEvent.artifactDelta?11:-1),u(),Y(i.uiEvent.error?12:-1),u(),Y(i.uiEvent.route?13:-1),u(),Y(i.hasWorkflowNodes()?14:-1),u(),Y(i.hasEndOfAgent()?15:-1),u(),Y(i.uiEvent.functionCalls&&i.uiEvent.functionCalls.length>0?16:-1),u(),Y(i.uiEvent.evalStatus===1||i.uiEvent.evalStatus===2?17:-1),u(),Y(i.evalCase&&i.isEvalEditMode?18:-1)}},dependencies:[li,zl,Tn,Wt,qi,pi,Fa,dn,Ty,Jy,Hy,Oy,Py],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;width:100%}app-content-bubble[_ngcontent-%COMP%] + app-content-bubble[_ngcontent-%COMP%]{margin-top:5px}.event-chips-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;width:100%}.user[_nghost-%COMP%] .event-chips-container[_ngcontent-%COMP%], .user [_nghost-%COMP%] .event-chips-container[_ngcontent-%COMP%]{justify-content:flex-end}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#2e7d32}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--mat-sys-error)}.hidden[_ngcontent-%COMP%]{visibility:hidden}.event-action-button[_ngcontent-%COMP%]{margin:5px}.function-calls-previews[_ngcontent-%COMP%]{width:100%}"]})};function IxA(t,e){if(t&1&&hA(0,"app-chat-avatar",1),t&2){let A=p();H("role",A.uiEvent.event.content?"bot":"node")("author",A.uiEvent.author)("nodePath",A.uiEvent.nodePath)}}function dxA(t,e){t&1&&hA(0,"div",5)}function BxA(t,e){if(t&1&&Ue(0,dxA,1,0,"div",5,ri),t&2){let A=p();Te(A.indentationArray)}}function ExA(t,e){t&1&&hA(0,"app-chat-avatar",3)}function hxA(t,e){if(t&1&&hA(0,"app-message-feedback",4),t&2){let A=p();H("sessionName",A.sessionName)("eventId",A.uiEvent.event.id||"")}}var jy=class t{uiEvent;index;uiEvents=[];isSelected=!1;isSelectable=!0;appName="";userId="";sessionId="";sessionName="";evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;isEditFunctionArgsEnabled=!1;userEditEvalCaseMessage="";agentGraphData=null;allWorkflowNodes=null;isUserFeedbackEnabled=!1;isLoadingAgentResponse=!1;rowClick=new LA;handleKeydown=new LA;cancelEditMessage=new LA;saveEditMessage=new LA;userEditEvalCaseMessageChange=new LA;openViewImageDialog=new LA;openBase64InNewTab=new LA;editEvalCaseMessage=new LA;deleteEvalCaseMessage=new LA;editFunctionArgs=new LA;clickEvent=new LA;longRunningResponseComplete=new LA;agentStateClick=new LA;onRowClick(e){this.isSelectable&&this.rowClick.emit({event:e,uiEvent:this.uiEvent,index:this.index})}get indentationDepth(){if(!this.uiEvent.nodePath)return 0;let A=this.uiEvent.nodePath.split("/").filter(Boolean).length;return A>2?A-2:0}get indentationArray(){let e=this.indentationDepth;return e>0?Array.from({length:e},(A,i)=>i):[]}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-event-row"]],hostAttrs:[1,"message-row-container"],hostVars:8,hostBindings:function(A,i){A&1&&U("click",function(o){return i.onRowClick(o)}),A&2&&RA("selected",i.isSelected)("user",i.uiEvent.role==="user")("bot",i.uiEvent.role==="bot")("selectable",i.isSelectable)},inputs:{uiEvent:"uiEvent",index:"index",uiEvents:"uiEvents",isSelected:"isSelected",isSelectable:"isSelectable",appName:"appName",userId:"userId",sessionId:"sessionId",sessionName:"sessionName",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",userEditEvalCaseMessage:"userEditEvalCaseMessage",agentGraphData:"agentGraphData",allWorkflowNodes:"allWorkflowNodes",isUserFeedbackEnabled:"isUserFeedbackEnabled",isLoadingAgentResponse:"isLoadingAgentResponse"},outputs:{rowClick:"rowClick",handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",clickEvent:"clickEvent",longRunningResponseComplete:"longRunningResponseComplete",agentStateClick:"agentStateClick"},decls:7,vars:21,consts:[[1,"event-number-container"],[3,"role","author","nodePath"],[1,"message-content",3,"userEditEvalCaseMessageChange","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","clickEvent","longRunningResponseComplete","agentStateClick","uiEvent","index","uiEvents","appName","userId","sessionId","sessionName","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userEditEvalCaseMessage","agentGraphData","allWorkflowNodes"],["role","user"],[3,"sessionName","eventId"],[1,"indentation-line"]],template:function(A,i){A&1&&(B(0,"div",0),y(1),Q(),O(2,IxA,1,3,"app-chat-avatar",1),O(3,BxA,2,0),B(4,"app-event-content",2),U("userEditEvalCaseMessageChange",function(o){return i.userEditEvalCaseMessageChange.emit(o)})("handleKeydown",function(o){return i.handleKeydown.emit(o)})("cancelEditMessage",function(o){return i.cancelEditMessage.emit(o)})("saveEditMessage",function(o){return i.saveEditMessage.emit(o)})("openViewImageDialog",function(o){return i.openViewImageDialog.emit(o)})("openBase64InNewTab",function(o){return i.openBase64InNewTab.emit(o)})("editEvalCaseMessage",function(o){return i.editEvalCaseMessage.emit(o)})("deleteEvalCaseMessage",function(o){return i.deleteEvalCaseMessage.emit(o)})("editFunctionArgs",function(o){return i.editFunctionArgs.emit(o)})("clickEvent",function(o){return i.clickEvent.emit(o)})("longRunningResponseComplete",function(o){return i.longRunningResponseComplete.emit(o)})("agentStateClick",function(o){return i.agentStateClick.emit(o)}),Q(),O(5,ExA,1,0,"app-chat-avatar",3),O(6,hxA,1,2,"app-message-feedback",4)),A&2&&(RA("hidden",!i.isSelectable),u(),ue(" #",i.index+1," "),u(),Y(i.uiEvent.role==="bot"&&!i.uiEvent.isLoading?2:-1),u(),Y(i.uiEvent.role==="bot"?3:-1),u(),H("uiEvent",i.uiEvent)("index",i.index)("uiEvents",i.uiEvents)("appName",i.appName)("userId",i.userId)("sessionId",i.sessionId)("sessionName",i.sessionName)("evalCase",i.evalCase)("isEvalEditMode",i.isEvalEditMode)("isEvalCaseEditing",i.isEvalCaseEditing)("isEditFunctionArgsEnabled",i.isEditFunctionArgsEnabled)("userEditEvalCaseMessage",i.userEditEvalCaseMessage)("agentGraphData",i.agentGraphData)("allWorkflowNodes",i.allWorkflowNodes),u(),Y(i.uiEvent.role==="user"?5:-1),u(),Y(i.isUserFeedbackEnabled&&!i.isLoadingAgentResponse&&i.uiEvent.role==="bot"?6:-1))},dependencies:[li,Ky,Ly,EQ],styles:[".generated-image-container[_ngcontent-%COMP%]{max-width:400px;margin-left:20px}.generated-image[_ngcontent-%COMP%]{max-width:100%;min-width:40px;border-radius:8px}.html-artifact-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:flex-start;align-items:center}app-content-bubble[_ngcontent-%COMP%] + app-content-bubble[_ngcontent-%COMP%]{margin-top:5px}.event-chips-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;width:100%}[_nghost-%COMP%]{display:flex;flex-direction:row;flex-wrap:nowrap;margin-left:-20px;margin-right:-20px;padding:4px 20px;border-radius:4px;transition:all .2s ease}.selectable[_nghost-%COMP%]:hover{box-shadow:inset 0 0 0 2px var(--mat-sys-outline-variant, rgba(0, 0, 0, .12))}.selected[_nghost-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))!important}app-message-feedback[_ngcontent-%COMP%]{width:100%}.user[_nghost-%COMP%]{justify-content:flex-end;align-items:flex-start;gap:15px}.bot[_nghost-%COMP%]{align-items:flex-start;padding-right:48px}.bot[_nghost-%COMP%] app-chat-avatar[_ngcontent-%COMP%]{align-self:flex-start}.message-content[_ngcontent-%COMP%]{display:contents}.bot[_nghost-%COMP%] > .message-content[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-width:0;align-items:flex-start}.user[_nghost-%COMP%] > .message-content[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-width:0;align-items:flex-end}.bot[_nghost-%COMP%]:focus-within app-content-bubble[_ngcontent-%COMP%] .content-bubble{border:1px solid var(--mat-sys-outline)}.message-textarea[_ngcontent-%COMP%]{max-width:100%;border:none;background-color:transparent;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}app-content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}app-content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--mat-sys-outline-variant);padding-right:8px;min-width:350px;max-width:350px}app-content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}app-content-bubble[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--mat-sys-outline-variant);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--mat-sys-tertiary)}.header-actual[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#2e7d32}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--mat-sys-error)}.hidden[_ngcontent-%COMP%]{visibility:hidden}.image-preview-chat[_ngcontent-%COMP%]{max-width:90%;max-height:70vh;width:auto;height:auto;border-radius:8px;cursor:pointer;transition:transform .2s ease-in-out}.attachment[_ngcontent-%COMP%]{display:flex;align-items:center}[_nghost-%COMP%] .message-text p{white-space:pre-line;word-break:break-word;overflow-wrap:break-word}.event-number-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-self:flex-start;min-width:30px;margin-top:10px;margin-right:8px;font-size:12px;font-weight:600;text-align:center;color:var(--mat-sys-on-surface-variant)}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.link-style-button[_ngcontent-%COMP%]{border:none;padding:0;font:inherit;color:var(--mat-sys-primary)!important;text-decoration:underline;cursor:pointer;outline:none;font-size:14px}.cancel-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--mat-sys-outline-variant);cursor:pointer;margin-right:16px}.save-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--mat-sys-primary);cursor:pointer;margin-right:16px}.indentation-line[_ngcontent-%COMP%]{width:20px;border-left:1px solid var(--mat-sys-outline-variant);align-self:stretch;opacity:.5;margin-top:-4px;margin-bottom:-4px}"]})};function QxA(t,e){if(t&1){let A=QA();B(0,"button",3),U("click",function(){T(A);let n=p();return J(n.toggleVideoRecording.emit())}),B(1,"mat-icon"),y(2,"videocam"),Q()(),B(3,"div",4),hA(4,"div",5)(5,"div",5)(6,"div",5)(7,"div",5),Q()}if(t&2){let A=p();RA("recording",A.isVideoRecording),H("matTooltip",A.isVideoRecording?A.i18n.turnOffCamTooltip:A.i18n.useCamTooltip)("disabled",!A.isBidiStreamingEnabled),u(4),ut("height",4+A.micVolume*16,"px"),u(),ut("height",4+A.micVolume*24,"px"),u(),ut("height",4+A.micVolume*18,"px"),u(),ut("height",4+A.micVolume*14,"px")}}function uxA(t,e){if(t&1){let A=QA();B(0,"div",2)(1,"div",6),y(2,"Live Flags"),Q(),B(3,"div",7)(4,"mat-checkbox",8),U("change",function(n){T(A);let o=p();return J(o.flags.proactiveAudio=n.checked)}),y(5,"Proactive Audio"),Q()(),B(6,"div",7)(7,"mat-checkbox",8),U("change",function(n){T(A);let o=p();return J(o.flags.enableAffectiveDialog=n.checked)}),y(8,"Affective Dialog"),Q()(),B(9,"div",7)(10,"mat-checkbox",8),U("change",function(n){T(A);let o=p();return J(o.flags.enableSessionResumption=n.checked)}),y(11,"Session Resumption"),Q()(),B(12,"div",7)(13,"mat-checkbox",8),U("change",function(n){T(A);let o=p();return J(o.flags.saveLiveBlob=n.checked)}),y(14,"Save Live Blob"),Q()()()}if(t&2){let A=p();u(4),H("checked",A.flags.proactiveAudio)("matTooltip",A.i18n.proactiveAudioTooltip),u(3),H("checked",A.flags.enableAffectiveDialog)("matTooltip",A.i18n.affectiveDialogTooltip),u(3),H("checked",A.flags.enableSessionResumption)("matTooltip",A.i18n.sessionResumptionTooltip),u(3),H("checked",A.flags.saveLiveBlob)("matTooltip",A.i18n.saveLiveBlobTooltip)}}var qy=class t{get inCall(){return this.isAudioRecording}isAudioRecording=!1;isVideoRecording=!1;micVolume=0;isBidiStreamingEnabled=!1;toggleAudioRecording=new LA;toggleVideoRecording=new LA;i18n=w(UI);showFlags=!1;flags={proactiveAudio:!1,enableAffectiveDialog:!1,enableSessionResumption:!1,saveLiveBlob:!1};onCallClick(){this.showFlags=!1,this.toggleAudioRecording.emit(this.flags)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-call-controls"]],hostVars:2,hostBindings:function(A,i){A&2&&RA("in-call",i.inCall)},inputs:{isAudioRecording:"isAudioRecording",isVideoRecording:"isVideoRecording",micVolume:"micVolume",isBidiStreamingEnabled:"isBidiStreamingEnabled"},outputs:{toggleAudioRecording:"toggleAudioRecording",toggleVideoRecording:"toggleVideoRecording"},decls:6,vars:6,consts:[[1,"call-btn-container",3,"mouseenter","mouseleave"],["mat-icon-button","",1,"audio-rec-btn",3,"click","disabled"],[1,"flags-panel"],["mat-icon-button","",1,"video-rec-btn",3,"click","matTooltip","disabled"],[1,"mic-visualizer"],[1,"bar"],[1,"flags-title"],[1,"flag-item"],["matTooltipPosition","left",3,"change","checked","matTooltip"]],template:function(A,i){A&1&&(O(0,QxA,8,12),B(1,"div",0),U("mouseenter",function(){return i.showFlags=!0})("mouseleave",function(){return i.showFlags=!1}),B(2,"button",1),U("click",function(){return i.onCallClick()}),B(3,"mat-icon"),y(4),Q()(),O(5,uxA,15,8,"div",2),Q()),A&2&&(Y(i.isAudioRecording?0:-1),u(2),RA("recording",i.isAudioRecording),H("disabled",!i.isBidiStreamingEnabled),u(2),lA(i.isAudioRecording?"call_end":"call"),u(),Y(i.showFlags&&!i.isAudioRecording?5:-1))},dependencies:[li,qi,ji,Tn,Wt,Fa,dn,AO,ec],styles:['[_nghost-%COMP%]{display:flex;align-items:center;gap:4px;border-radius:28px;transition:all .2s ease}.in-call[_nghost-%COMP%]{background-color:var(--mat-sys-surface-variant)}button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)!important}button.recording[_ngcontent-%COMP%]{background-color:var(--mat-sys-error)!important;color:var(--mat-sys-on-error, #ffffff)!important}button.audio-rec-btn[_ngcontent-%COMP%]:not(.recording){color:#34a853!important}.mic-visualizer[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;gap:3px;height:24px;margin-right:8px;width:24px}.mic-visualizer[_ngcontent-%COMP%] .bar[_ngcontent-%COMP%]{width:4px;background-color:#34a853;border-radius:2px;transition:height .1s ease-out}.call-btn-container[_ngcontent-%COMP%]{position:relative;display:inline-block}.flags-panel[_ngcontent-%COMP%]{position:absolute;bottom:100%;left:50%;transform:translate(-50%);margin-bottom:8px;background:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:12px;padding:12px;box-shadow:0 4px 20px #00000026;z-index:100;width:250px;display:flex;flex-direction:column;gap:8px;animation:_ngcontent-%COMP%_fadeIn .2s ease-out}.flags-panel[_ngcontent-%COMP%]:before{content:"";position:absolute;bottom:-8px;left:0;right:0;height:8px;background:transparent}.flags-panel[_ngcontent-%COMP%] .flags-title[_ngcontent-%COMP%]{font-weight:600;font-size:14px;color:var(--mat-sys-on-surface);margin-bottom:4px}.flags-panel[_ngcontent-%COMP%] .flag-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--mat-sys-on-surface-variant)}.flags-panel[_ngcontent-%COMP%] .flag-item[_ngcontent-%COMP%] .flag-label[_ngcontent-%COMP%]{font-weight:500}.flags-panel[_ngcontent-%COMP%] .flag-item[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{--mdc-checkbox-state-layer-size: 30px}@keyframes _ngcontent-%COMP%_fadeIn{0%{opacity:0;transform:translate(-50%) translateY(10px)}to{opacity:1;transform:translate(-50%) translateY(0)}}']})};var fxA=t=>({$implicit:t});function pxA(t,e){t&1&&hA(0,"div",9)}function mxA(t,e){if(t&1&&(B(0,"span",15),y(1),Q()),t&2){let A=p(2).$implicit,i=p();ut("right",100-i.getRelativeStart(A.span),"%"),u(),lA(i.formatDuration(A.span.end_time-A.span.start_time))}}function wxA(t,e){if(t&1){let A=QA();B(0,"div",6),U("click",function(){T(A);let n=p().$implicit,o=p();return J(o.selectRow(n))}),B(1,"div",7)(2,"div",8),Ue(3,pxA,1,0,"div",9,ws),Q(),B(5,"span",10),y(6),Q(),B(7,"div",11),y(8),Q()(),B(9,"div",12)(10,"div",13),y(11),Q(),O(12,mxA,2,3,"span",14),Q()()}if(t&2){let A=p().$implicit,i=p(),n=Qi(12);RA("selected",i.rowSelected(A)),H("id",NQ("trace-node-",A.span.span_id))("appHtmlTooltip",n)("appHtmlTooltipContext",Ks(19,fxA,i.getUiEvent(A)))("appHtmlTooltipDisabled",!i.getUiEvent(A)),u(3),Te(i.getArray(A.level)),u(2),RA("is-event-row",i.isEventRow(A)),u(),ue(" ",i.getSpanIcon(A.span.name)," "),u(),RA("is-event-row",i.isEventRow(A)),u(),ue(" ",i.formatSpanName(A.span.name)," "),u(2),ut("left",i.getRelativeStart(A.span),"%")("width",i.getRelativeWidth(A.span),"%"),u(),ue(" ",i.formatDuration(A.span.end_time-A.span.start_time)," "),u(),Y(i.getRelativeWidth(A.span)<10?12:-1)}}function DxA(t,e){if(t&1&&O(0,wxA,13,21,"div",5),t&2){let A=e.$implicit,i=p();Y(i.shouldShowNode(A)?0:-1)}}function yxA(t,e){if(t&1&&(B(0,"div",16),hA(1,"app-event-content",17),Q()),t&2){let A=p().$implicit;u(),H("uiEvent",A)("index",0)}}function vxA(t,e){if(t&1&&O(0,yxA,2,2,"div",16),t&2){let A=e.$implicit;Y(A?0:-1)}}var Vy=class t{spans=[];invocationId="";uiEvents=[];shouldShowEvent;tree=[];baseStartTimeMs=0;totalDurationMs=1;rootLatencyNanos=0;flatTree=[];shouldShowNode(e){let A=this.getUiEvent(e);return A&&this.shouldShowEvent?this.shouldShowEvent(A):!0}traceLabelIconMap=new Map([["Invocation","start"],["agent_run","robot"],["invoke_agent","robot_2"],["tool","build"],["execute_tool","build"],["call_llm","chat"]]);selectedRow=void 0;traceService=w(Ag);constructor(){}selectRootSpan(){if(this.tree&&this.tree.length>0){if(this.selectedRow&&this.selectedRow.span_id===this.tree[0].span_id)return;this.traceService.selectedRow(this.tree[0])}}isRootSpanSelected(){return!this.selectedRow||!this.tree||this.tree.length===0?!1:String(this.selectedRow.span_id)===String(this.tree[0].span_id)}ngOnInit(){this.rebuildTree(),this.traceService.selectedTraceRow$.subscribe(e=>{this.selectedRow=e,e&&setTimeout(()=>{let A=document.getElementById("trace-node-"+e.span_id);A&&A.scrollIntoView({behavior:"smooth",block:"nearest"})},50)})}ngOnChanges(e){e.spans&&!e.spans.isFirstChange()&&this.rebuildTree()}rebuildTree(){if(!this.spans||this.spans.length===0){this.tree=[],this.flatTree=[],this.rootLatencyNanos=0;return}this.tree=this.buildSpanTree(this.spans),this.flatTree=[],this.tree.forEach(A=>{A.children&&this.flatTree.push(...this.flattenTree(A.children,0))});let e=this.getGlobalTimes(this.spans);this.baseStartTimeMs=e.start,this.totalDurationMs=e.duration,this.tree&&this.tree.length>0?this.rootLatencyNanos=this.tree[0].end_time-this.tree[0].start_time:this.rootLatencyNanos=0}buildSpanTree(e){let A=e.map(o=>gA({},o)),i=new Map,n=[];return A.forEach(o=>i.set(o.span_id,o)),A.forEach(o=>{if(o.parent_span_id&&i.has(o.parent_span_id)){let a=i.get(o.parent_span_id);a.children=a.children||[],a.children.push(o)}else n.push(o)}),n}getGlobalTimes(e){let A=Math.min(...e.map(n=>this.toMs(n.start_time))),i=Math.max(...e.map(n=>this.toMs(n.end_time)));return{start:A,duration:i-A}}toMs(e){return e/1e6}formatDuration(e){if(e===0)return"0us";if(e<1e3)return`${e}ns`;if(e<1e6)return`${(e/1e3).toFixed(2)}us`;if(e<1e9)return`${(e/1e6).toFixed(2)}ms`;if(e<6e10)return`${(e/1e9).toFixed(2)}s`;let A=Math.floor(e/6e10),i=(e%6e10/1e9).toFixed(2);return`${A}m ${i}s`}getRelativeStart(e){return(this.toMs(e.start_time)-this.baseStartTimeMs)/this.totalDurationMs*100}getRelativeWidth(e){return(this.toMs(e.end_time)-this.toMs(e.start_time))/this.totalDurationMs*100}flattenTree(e,A=0){return e.flatMap(n=>[{span:n,level:A},...n.children?this.flattenTree(n.children,A+1):[]])}getSpanIcon(e){for(let[A,i]of this.traceLabelIconMap.entries())if(e.startsWith(A))return i;return"start"}formatSpanName(e){return e.startsWith("invoke_agent ")||e.startsWith("execute_tool ")?e.substring(13):e.startsWith("invoke_node ")?e.substring(12):e}getArray(e){return Array.from({length:e})}selectRow(e){this.selectedRow&&this.selectedRow.span_id==e.span.span_id||this.traceService.selectedRow(e.span)}rowSelected(e){return!this.selectedRow||!e?.span?!1:String(this.selectedRow.span_id)===String(e.span.span_id)}isEventRow(e){if(!e.span.attributes)return!1;let A=e?.span.attributes["gcp.vertex.agent.event_id"];return A&&this.uiEvents&&this.uiEvents.length>0?this.uiEvents.some(i=>i.event?.id===A):!1}getEventId(e){return e?.span?.attributes?.["gcp.vertex.agent.event_id"]??""}getUiEvent(e){let A=this.getEventId(e);return A&&this.uiEvents&&this.uiEvents.length>0&&this.uiEvents.find(i=>i.event?.id===A)||null}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-trace-tree"]],inputs:{spans:"spans",invocationId:"invocationId",uiEvents:"uiEvents",shouldShowEvent:"shouldShowEvent"},features:[Yt],decls:13,vars:6,consts:[["eventTooltip",""],[1,"invocation-id-container",3,"click"],[1,"invocation-id",3,"matTooltip"],[1,"total-latency"],[1,"trace-container"],[1,"trace-row",3,"selected","id","appHtmlTooltip","appHtmlTooltipContext","appHtmlTooltipDisabled"],[1,"trace-row",3,"click","id","appHtmlTooltip","appHtmlTooltipContext","appHtmlTooltipDisabled"],[1,"trace-row-left"],[1,"trace-indent"],[1,"indent-connector"],[1,"material-symbols-outlined",2,"margin-right","8px"],[1,"trace-label"],[1,"trace-bar-container"],[1,"trace-bar"],[1,"short-trace-bar-duration",3,"right"],[1,"short-trace-bar-duration"],[1,"event-tooltip-container"],[3,"uiEvent","index"]],template:function(A,i){A&1&&(B(0,"div")(1,"div",1),U("click",function(){return i.selectRootSpan()}),B(2,"span"),y(3,"Invocation ID: "),Q(),B(4,"div",2),y(5),Q(),B(6,"span",3),y(7),Q()(),B(8,"div",4),Ue(9,DxA,1,1,null,null,ri),Q()(),Et(11,vxA,1,1,"ng-template",null,0,$C)),A&2&&(u(),RA("selected",i.isRootSpanSelected()),te("id",i.tree&&i.tree.length>0?"trace-node-"+i.tree[0].span_id:null),u(3),H("matTooltip",i.invocationId),u(),lA(i.invocationId),u(2),ue("Total latency: ",i.formatDuration(i.rootLatencyNanos)),u(2),Te(i.flatTree))},dependencies:[qi,Tn,Fa,dn,Fy,EQ],styles:[".trace-container[_ngcontent-%COMP%]{white-space:nowrap;font-size:12px;overflow-x:auto;padding:8px}.trace-label[_ngcontent-%COMP%]{color:var(--trace-label-color, #e3e3e3);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;font-size:12px}.trace-bar-container[_ngcontent-%COMP%]{position:relative;height:18px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:var(--mat-sys-primary);border-radius:4px;padding-left:6px;box-sizing:border-box;overflow:hidden;font-size:11px;line-height:18px;color:var(--mat-sys-on-primary);font-family:Google Sans;transition:background-color .2s,color .2s}.trace-duration[_ngcontent-%COMP%]{color:var(--trace-duration-color, #888);font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;position:relative;height:32px}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:#ccc}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:#ccc}.trace-label[_ngcontent-%COMP%]{flex:1;min-width:0;font-size:13px}.trace-bar-container[_ngcontent-%COMP%]{flex:1;min-width:0}.short-trace-bar-duration[_ngcontent-%COMP%]{position:absolute;color:var(--trace-tree-short-trace-bar-duration-color);padding-right:6px}.trace-row[_ngcontent-%COMP%]{align-items:center;cursor:pointer;scroll-margin-top:40px}.trace-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant, rgba(0, 0, 0, .04))}.trace-row.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))}.trace-row-left[_ngcontent-%COMP%]{display:flex;min-width:250px;width:20%;max-width:350px}.invocation-id-container[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:11px;font-weight:600;letter-spacing:.3px;margin-bottom:6px;padding:8px 12px;border-radius:12px 12px 0 0;background-color:var(--mat-sys-surface);display:flex;width:100%;box-sizing:border-box;align-items:center;position:sticky;top:-20px;z-index:10;box-shadow:0 2px 4px #0000000d;cursor:pointer}.invocation-id-container[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant)}.invocation-id-container.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))}.invocation-id-container[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:first-child{opacity:.8;margin-right:6px;text-transform:uppercase}.invocation-id[_ngcontent-%COMP%]{font-family:Google Sans Mono,Roboto Mono,monospace;padding:2px 6px;border-radius:4px;color:var(--mat-sys-on-surface)}.total-latency[_ngcontent-%COMP%]{margin-left:auto;background:transparent;color:var(--mat-sys-on-surface);padding:2px 8px;font-size:11px;font-weight:600;letter-spacing:.2px}.trace-row-left[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .trace-row-left[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-span-div-color)}.trace-row-left[_ngcontent-%COMP%] .is-event-row[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-is-event-row-color)}.event-tooltip-container[_ngcontent-%COMP%]{max-width:800px;max-height:200px;overflow:auto;padding:8px;background:var(--mat-sys-surface-container-low, #202124);color:var(--mat-sys-on-surface, #e8eaed);border-radius:8px;box-shadow:0 4px 16px #00000080;border:1px solid var(--mat-sys-outline-variant, rgba(255, 255, 255, .1))}.event-tooltip-container[_ngcontent-%COMP%] app-content-bubble{max-height:160px;overflow-y:auto;display:block}"]})};var bxA=["videoContainer"],MxA=["autoScroll"],SxA=["messageTextarea"],kxA=t=>({text:t,thought:!1}),xxA=()=>[],_xA=(t,e)=>e.metricName;function RxA(t,e){t&1&&(B(0,"span",14),y(1,"PASS"),Q())}function NxA(t,e){t&1&&(B(0,"span",15),y(1,"FAIL"),Q())}function FxA(t,e){if(t&1&&(B(0,"span",21),y(1),Q()),t&2){let A=e.$implicit;ut("color",A.evalStatus==1?"var(--app-color-success)":"var(--app-color-error)"),u(),ba(" ",A.metricName,": ",A.score," ")}}function LxA(t,e){if(t&1&&(B(0,"div")(1,"span",17),y(2,"Metrics"),Q(),B(3,"div",19),Ue(4,FxA,2,4,"span",20,_xA),Q()()),t&2){p();let A=zn(0);u(4),Te(A.overallEvalMetricResults)}}function GxA(t,e){if(t&1&&(ta(0),B(1,"div",8)(2,"div",11)(3,"h3",12),y(4,"Evaluation Result"),Q(),B(5,"div",13),O(6,RxA,2,0,"span",14)(7,NxA,2,0,"span",15),Q()(),B(8,"div",16)(9,"div")(10,"span",17),y(11,"Case ID"),Q(),B(12,"div",18),y(13),Q()(),B(14,"div")(15,"span",17),y(16,"Set ID"),Q(),B(17,"div",18),y(18),Q()(),O(19,LxA,6,0,"div"),Q()()),t&2){let A=ga(p(2).evalCaseResult());u(6),Y(A.finalEvalStatus==1?6:7),u(7),lA(A.evalId),u(5),lA(A.setId),u(),Y(A.overallEvalMetricResults!=null&&A.overallEvalMetricResults.length?19:-1)}}function KxA(t,e){if(t&1&&(B(0,"div",9),sn(1,22),Q()),t&2){let A=p(2);u(),H("ngComponentOutlet",A.markdownComponent)("ngComponentOutletInputs",Ks(2,kxA,A.agentReadme))}}function UxA(t,e){if(t&1&&(B(0,"div",25),hA(1,"app-trace-tree",26),Q()),t&2){let A=p().$implicit,i=p(2);ut("display",i.viewMode==="traces"?"":"none"),u(),H("spans",i.spansByInvocationId.get(A.event.id)||i.spansByInvocationId.get(A.event.invocationId)||Kc(6,xxA))("invocationId",A.event.invocationId||A.event.id||"")("uiEvents",i.uiEvents)("shouldShowEvent",i.shouldShowEvent)}}function TxA(t,e){if(t&1){let A=QA();B(0,"app-event-row",23),U("rowClick",function(n){T(A);let o=p(2);return J(o.handleRowClick(n.event,n.uiEvent,n.index))})("handleKeydown",function(n){T(A);let o=p(2);return J(o.handleKeydown.emit(n))})("cancelEditMessage",function(n){T(A);let o=p(2);return J(o.cancelEditMessage.emit(n))})("saveEditMessage",function(n){T(A);let o=p(2);return J(o.saveEditMessage.emit(n))})("userEditEvalCaseMessageChange",function(n){T(A);let o=p(2);return J(o.userEditEvalCaseMessageChange.emit(n))})("openViewImageDialog",function(n){T(A);let o=p(2);return J(o.openViewImageDialog.emit(n))})("openBase64InNewTab",function(n){T(A);let o=p(2);return J(o.openBase64InNewTab.emit(n))})("editEvalCaseMessage",function(n){T(A);let o=p(2);return J(o.editEvalCaseMessage.emit(n))})("deleteEvalCaseMessage",function(n){T(A);let o=p(2);return J(o.deleteEvalCaseMessage.emit(n))})("editFunctionArgs",function(n){T(A);let o=p(2);return J(o.editFunctionArgs.emit(n))})("clickEvent",function(n){T(A);let o=p(2);return J(o.clickEvent.emit(n))})("longRunningResponseComplete",function(n){T(A);let o=p(2);return J(o.longRunningResponseComplete.emit(n))})("agentStateClick",function(n){T(A);let o=p(2);return J(o.handleAgentStateClick(n.event,n.index))}),Q(),O(1,UxA,2,7,"div",24)}if(t&2){let A=e.$implicit,i=e.$index,n=p(2),o=n.shouldShowEvent?n.shouldShowEvent(A):!0;ut("display",n.viewMode==="events"&&o||n.viewMode==="traces"&&A.role==="user"&&o?"":"none"),H("isSelectable",n.viewMode!=="traces")("uiEvent",A)("index",i)("uiEvents",n.uiEvents)("isSelected",n.isMessageEventSelected(i))("appName",n.appName)("userId",n.userId)("sessionId",n.sessionId)("sessionName",n.sessionName())("evalCase",n.evalCase)("isEvalEditMode",n.isEvalEditMode)("isEvalCaseEditing",n.isEvalCaseEditing)("isEditFunctionArgsEnabled",n.isEditFunctionArgsEnabled)("userEditEvalCaseMessage",n.userEditEvalCaseMessage)("agentGraphData",n.agentGraphData)("allWorkflowNodes",n.getAllWorkflowNodes(i))("isUserFeedbackEnabled",n.isUserFeedbackEnabled()??!1)("isLoadingAgentResponse",n.isLoadingAgentResponse()??!1),u(),Y(A.role==="bot"&&n.isFirstEventForInvocation(A,i)?1:-1)}}function JxA(t,e){t&1&&(B(0,"div",10),hA(1,"mat-progress-bar",27),Q())}function OxA(t,e){if(t&1){let A=QA();B(0,"div",7,0),U("scroll",function(n){T(A);let o=p();return J(o.onScroll.next(n))}),O(2,GxA,20,5,"div",8),O(3,KxA,2,4,"div",9),Ue(4,TxA,2,21,null,null,ri),O(6,JxA,2,0,"div",10),Q()}if(t&2){let A=p();u(2),Y(A.showEvalSummary()&&A.evalCaseResult()?2:-1),u(),Y(A.uiEvents.length===0&&A.agentReadme?3:-1),u(),Te(A.uiEvents),u(2),Y(A.isLoadingAgentResponse()?6:-1)}}function YxA(t,e){if(t&1){let A=QA();B(0,"div",45),hA(1,"img",46),B(2,"button",47),U("click",function(){T(A);let n=p().$index,o=p(4);return J(o.removeFile.emit(n))}),B(3,"mat-icon",48),y(4,"close"),Q()()()}if(t&2){let A=p().$implicit;u(),H("src",A.url,Go)}}function HxA(t,e){if(t&1){let A=QA();B(0,"div",44)(1,"button",47),U("click",function(){T(A);let n=p().$index,o=p(4);return J(o.removeFile.emit(n))}),B(2,"mat-icon",48),y(3,"close"),Q()(),B(4,"div",49)(5,"mat-icon"),y(6,"insert_drive_file"),Q(),B(7,"span"),y(8),Q()()()}if(t&2){let A=p().$implicit;u(8),lA(A.file.name)}}function zxA(t,e){if(t&1&&(B(0,"div"),O(1,YxA,5,1,"div",45)(2,HxA,9,1,"div",44),Q()),t&2){let A=e.$implicit;u(),Y(A.file.type.startsWith("image/")?1:A.file.type.startsWith("image/")?-1:2)}}function PxA(t,e){if(t&1){let A=QA();B(0,"div",44)(1,"button",47),U("click",function(){T(A);let n=p(4);return J(n.removeStateUpdate.emit())}),B(2,"mat-icon",48),y(3,"close"),Q()(),B(4,"div",49)(5,"span"),y(6),Q()()()}if(t&2){let A=p(4);u(6),lA(A.i18n.updatedSessionStateChipLabel)}}function jxA(t,e){if(t&1&&(B(0,"div",33),Ue(1,zxA,3,1,"div",null,ri),O(3,PxA,7,1,"div",44),Q()),t&2){let A=p(3);u(),Te(A.selectedFiles),u(2),Y(A.updatedSessionState?3:-1)}}function qxA(t,e){if(t&1){let A=QA();B(0,"div",29)(1,"input",30,1),U("change",function(n){T(A);let o=p(2);return J(o.fileSelect.emit(n))}),Q(),B(3,"div",31)(4,"mat-form-field",32),O(5,jxA,4,1,"div",33),B(6,"textarea",34,2),U("ngModelChange",function(n){T(A);let o=p(2);return J(o.userInputChange.emit(n))})("keydown.enter",function(n){T(A);let o=p(2);return J(o.sendMessage.emit(n))}),Q(),B(8,"button",35),U("click",function(n){T(A);let o=p(2);return J(o.sendMessage.emit(n))}),B(9,"mat-icon"),y(10,"send"),Q()()(),hA(11,"div",36,3),Q(),B(13,"div",37)(14,"div",38)(15,"button",39),Ht(16,"async"),U("click",function(){T(A);let n=Qi(2);return J(n.click())}),B(17,"mat-icon"),y(18,"attach_file"),Q()(),B(19,"button",40),Ht(20,"async"),B(21,"mat-icon"),y(22,"more_vert"),Q()(),B(23,"mat-menu",null,4)(25,"span",41),U("click",function(){T(A);let n=p(2);return J(n.updateState.emit())}),y(26),Q()()(),B(27,"div",42)(28,"app-call-controls",43),Ht(29,"async"),U("toggleAudioRecording",function(n){T(A);let o=p(2);return J(o.toggleAudioRecording.emit(n))})("toggleVideoRecording",function(){T(A);let n=p(2);return J(n.toggleVideoRecording.emit())}),Q()()()()}if(t&2){let A=Qi(24),i=p(2);RA("video-streaming",i.isVideoRecording),u(5),Y(i.selectedFiles.length&&i.appName!=""||i.updatedSessionState?5:-1),u(),H("ngModel",i.userInput)("placeholder",i.i18n.typeMessagePlaceholder),u(2),H("matTooltip",i.i18n.sendMessageTooltip),u(3),RA("visible",i.isVideoRecording),u(4),H("matTooltip",i.i18n.uploadFileTooltip)("disabled",!si(16,19,i.isMessageFileUploadEnabledObs)),u(4),H("matMenuTriggerFor",A)("matTooltip",i.i18n.moreOptionsTooltip)("disabled",!si(20,21,i.isManualStateUpdateEnabledObs)),u(6),H("matTooltip",i.i18n.updateStateMenuTooltip),u(),ue(" ",i.i18n.updateStateMenuLabel," "),u(2),H("isAudioRecording",i.isAudioRecording)("isVideoRecording",i.isVideoRecording)("micVolume",i.micVolume)("isBidiStreamingEnabled",si(29,23,i.isBidiStreamingEnabledObs)??!1)}}function VxA(t,e){if(t&1&&O(0,qxA,30,25,"div",28),t&2){let A=p();Y(A.canEditSession()?0:-1)}}function WxA(t,e){t&1&&(B(0,"div",6),hA(1,"mat-progress-spinner",50),Q())}var hQ=class t{appName="";agentReadme="";sessionName=me("");uiEvents=[];traceData=[];isChatMode=!0;evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;agentGraphData=null;isEditFunctionArgsEnabled=!1;isTokenStreamingEnabled=!1;useSse=!1;userInput="";userEditEvalCaseMessage="";selectedFiles=[];updatedSessionState=null;selectedMessageIndex=void 0;isAudioRecording=!1;micVolume=0;isVideoRecording=!1;userId="";sessionId="";viewMode="events";shouldShowEvent;spansByInvocationId=new Map;eventsScrollTop=-1;tracesScrollTop=-1;userInputChange=new LA;userEditEvalCaseMessageChange=new LA;clickEvent=new LA;handleKeydown=new LA;cancelEditMessage=new LA;saveEditMessage=new LA;openViewImageDialog=new LA;openBase64InNewTab=new LA;editEvalCaseMessage=new LA;deleteEvalCaseMessage=new LA;editFunctionArgs=new LA;fileSelect=new LA;removeFile=new LA;removeStateUpdate=new LA;sendMessage=new LA;updateState=new LA;toggleAudioRecording=new LA;toggleVideoRecording=new LA;longRunningResponseComplete=new LA;toggleHideIntermediateEvents=new LA;toggleSse=new LA;videoContainer;scrollContainer;textarea;scrollInterrupted=!1;scrollHeight=0;lastMessageRef=null;nextPageToken="";scrollTimeout=null;mutationObserver=null;i18n=w(UI);uiStateService=w(tg);themeService=w(eg);stringToColorService=w(Q2);markdownComponent=w(_I);featureFlagService=w(yr);agentService=w($s);sessionService=w(Al);destroyRef=w(sr);MediaType=aC;JSON=JSON;Object=Object;String=String;isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled();canEditSession=bA(!0);isUserFeedbackEnabled=Ar(this.featureFlagService.isFeedbackServiceEnabled());isLoadingAgentResponse=Ar(this.agentService.getLoadingState());hideMoreOptionsButton=Ar(this.featureFlagService.isMoreOptionsButtonHidden());onScroll=new ie;sanitizer=w(Cs);hideIntermediateEvents=me(!1);invocationDisplayMap=me(new Map);evalCaseResult=me(null);showEvalSummary=me(!1);constructor(){Ao(()=>{let e=this.sessionName();e&&(this.nextPageToken="",this.featureFlagService.isInfinityMessageScrollingEnabled().pipe($n(),gt(A=>A)).subscribe(()=>{this.uiStateService.lazyLoadMessages(e,{pageSize:100,pageToken:this.nextPageToken}).pipe($n()).subscribe()}))})}ngOnInit(){this.uiStateService.isSessionLoading().pipe(wr(this.destroyRef)).subscribe(e=>{e||this.focusInput()}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe($n(),gt(e=>e),hi(()=>Ki(this.uiStateService.onNewMessagesLoaded().pipe(di(e=>{this.nextPageToken=e.nextPageToken??"",e.isBackground||this.restoreScrollPosition()})),this.onScroll.pipe(hi(e=>{let A=e.target;return A.scrollTop!==0?ar:this.nextPageToken?(this.scrollHeight=A.scrollHeight,this.uiStateService.lazyLoadMessages(this.sessionName(),{pageSize:100,pageToken:this.nextPageToken}).pipe($n(),Po(()=>_F))):ar})))),wr(this.destroyRef)).subscribe()}ngAfterViewInit(){if(this.scrollContainer?.nativeElement){let e=this.scrollContainer.nativeElement;e.addEventListener("scroll",()=>{let A=Math.abs(e.scrollHeight-e.scrollTop-e.clientHeight)<50;this.scrollInterrupted=!A}),this.mutationObserver=new MutationObserver(()=>{this.scrollInterrupted||this.scrollToBottom()}),this.mutationObserver.observe(e,{childList:!0,subtree:!0,characterData:!0}),this.destroyRef.onDestroy(()=>{this.mutationObserver?.disconnect()})}}ngOnChanges(e){if(e.viewMode){let A=e.viewMode.previousValue,i=e.viewMode.currentValue;this.scrollContainer?.nativeElement&&(A==="events"?this.eventsScrollTop=this.scrollContainer.nativeElement.scrollTop:A==="traces"&&(this.tracesScrollTop=this.scrollContainer.nativeElement.scrollTop)),setTimeout(()=>{this.scrollContainer?.nativeElement&&(i==="events"&&this.eventsScrollTop!==-1?this.scrollContainer.nativeElement.scrollTop=this.eventsScrollTop:i==="traces"&&this.tracesScrollTop!==-1?this.scrollContainer.nativeElement.scrollTop=this.tracesScrollTop:this.scrollToBottom())})}if(e.appName&&this.focusInput(),(e.appName||e.uiEvents)&&this.uiEvents.length===0&&this.agentReadme&&setTimeout(()=>this.scrollToTop(),0),e.uiEvents){let A=this.uiEvents[this.uiEvents.length-1];A!==this.lastMessageRef&&((A?.role==="user"||A?.isLoading===!0)&&(this.scrollInterrupted=!1),this.scrollToBottom()),this.lastMessageRef=A}e.traceData&&this.traceData&&this.rebuildTrace()}rebuildTrace(){let e=this.traceData.reduce((A,i)=>{let n=i.trace_id,o=A.get(n);return o?(o.push(i),o.sort((a,r)=>a.start_time-r.start_time)):A.set(n,[i]),A},new Map);this.spansByInvocationId=new Map;for(let[A,i]of e){let n=i.find(o=>o.attributes!==void 0&&"gcp.vertex.agent.invocation_id"in o.attributes)?.attributes["gcp.vertex.agent.invocation_id"];if(!n){let o=i.find(a=>a.attributes!==void 0&&"gcp.vertex.agent.associated_event_ids"in a.attributes)?.attributes["gcp.vertex.agent.associated_event_ids"];o&&o.length>0&&(n=o[0])}n||(n=A),n&&this.spansByInvocationId.set(n,i)}}isFirstEventForInvocation(e,A){let i=e.event?.invocationId||e.event?.id;if(!i)return!1;for(let n=A-1;n>=0;n--){let o=this.uiEvents[n],a=o.event?.invocationId||o.event?.id;if(o.role==="bot"&&a===i)return!1}return!0}scrollToBottom(){this.sessionId&&(this.scrollInterrupted||(this.scrollTimeout&&clearTimeout(this.scrollTimeout),this.scrollTimeout=setTimeout(()=>{this.scrollContainer?.nativeElement.scrollTo({top:this.scrollContainer.nativeElement.scrollHeight,behavior:"auto"}),this.scrollTimeout=null},50)))}scrollToTop(){setTimeout(()=>{this.scrollContainer?.nativeElement.scrollTo({top:0,behavior:"smooth"})},50)}focusInput(){setTimeout(()=>{this.textarea?.nativeElement?.focus()},50)}isMessageEventSelected(e){return e===this.selectedMessageIndex}restoreScrollPosition(){if(!this.scrollHeight){this.scrollInterrupted=!1,this.scrollToBottom();return}let e=this.scrollContainer?.nativeElement;e&&(e.scrollTop=e.scrollHeight-this.scrollHeight,this.scrollHeight=0)}getAllWorkflowNodes(e){let A={};for(let i=0;i<=e;i++){let o=this.uiEvents[i].event,a=o?.actions?.agentState?.nodes,r=o?.nodeInfo?.path;a&&r&&(A[r]||(A[r]={}),Object.assign(A[r],a))}return Object.keys(A).length>0?A:null}handleAgentStateClick(e,A){e.stopPropagation(),A===this.selectedMessageIndex||this.clickEvent.emit(A)}handleRowClick(e,A,i){let n=window.getSelection();n&&n.toString().length>0||this.clickEvent.emit(i)}handleKeyboardNavigation(e){if(this.selectedMessageIndex===void 0)return;let A=document.activeElement;if(A&&(A.tagName==="INPUT"||A.tagName==="TEXTAREA"||A.isContentEditable)||e.key!=="ArrowUp"&&e.key!=="ArrowDown")return;e.preventDefault();let i;e.key==="ArrowDown"?i=this.selectedMessageIndex+1>=this.uiEvents.length?0:this.selectedMessageIndex+1:i=this.selectedMessageIndex-1<0?this.uiEvents.length-1:this.selectedMessageIndex-1,this.clickEvent.emit(i),this.scrollToSelectedMessage(i)}scrollToSelectedMessage(e){let A=e!==void 0?e:this.selectedMessageIndex;A!==void 0&&setTimeout(()=>{if(!this.scrollContainer?.nativeElement)return;let i=this.scrollContainer.nativeElement.querySelectorAll(".message-row-container");i&&i[A]&&i[A].scrollIntoView({behavior:"smooth",block:"nearest",inline:"nearest"})},50)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-chat-panel"]],viewQuery:function(A,i){if(A&1&&Jt(bxA,5,ce)(MxA,5)(SxA,5),A&2){let n;ae(n=re())&&(i.videoContainer=n.first),ae(n=re())&&(i.scrollContainer=n.first),ae(n=re())&&(i.textarea=n.first)}},hostBindings:function(A,i){A&1&&U("keydown",function(o){return i.handleKeyboardNavigation(o)},ZC)},inputs:{appName:"appName",agentReadme:"agentReadme",sessionName:[1,"sessionName"],uiEvents:"uiEvents",traceData:"traceData",isChatMode:"isChatMode",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",agentGraphData:"agentGraphData",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",isTokenStreamingEnabled:"isTokenStreamingEnabled",useSse:"useSse",userInput:"userInput",userEditEvalCaseMessage:"userEditEvalCaseMessage",selectedFiles:"selectedFiles",updatedSessionState:"updatedSessionState",selectedMessageIndex:"selectedMessageIndex",isAudioRecording:"isAudioRecording",micVolume:"micVolume",isVideoRecording:"isVideoRecording",userId:"userId",sessionId:"sessionId",viewMode:"viewMode",shouldShowEvent:"shouldShowEvent",hideIntermediateEvents:[1,"hideIntermediateEvents"],invocationDisplayMap:[1,"invocationDisplayMap"],evalCaseResult:[1,"evalCaseResult"],showEvalSummary:[1,"showEvalSummary"]},outputs:{userInputChange:"userInputChange",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",clickEvent:"clickEvent",handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",fileSelect:"fileSelect",removeFile:"removeFile",removeStateUpdate:"removeStateUpdate",sendMessage:"sendMessage",updateState:"updateState",toggleAudioRecording:"toggleAudioRecording",toggleVideoRecording:"toggleVideoRecording",longRunningResponseComplete:"longRunningResponseComplete",toggleHideIntermediateEvents:"toggleHideIntermediateEvents",toggleSse:"toggleSse"},features:[Yt],decls:5,vars:5,consts:[["autoScroll",""],["fileInput",""],["messageTextarea",""],["videoContainer",""],["moreMenu","matMenu"],[1,"chat-messages"],[1,"loading-spinner-container"],[1,"chat-messages",3,"scroll"],[1,"eval-result-summary",2,"margin","16px","padding","16px","border-radius","8px","background","var(--mat-sys-surface-container)","border","1px solid var(--mat-sys-outline-variant)"],[1,"readme-content"],[1,"agent-loading-indicator"],[2,"display","flex","justify-content","space-between","align-items","center"],[2,"margin","0","color","var(--mat-sys-primary)"],[1,"status-card__summary"],[1,"status-card__passed",2,"font-size","16px","font-weight","600","font-family","monospace"],[1,"status-card__failed",2,"font-size","16px","font-weight","600","font-family","monospace"],[2,"margin-top","12px","display","flex","gap","24px"],[2,"color","var(--mat-sys-on-surface-variant)","font-size","13px"],[2,"font-weight","500"],[2,"display","flex","gap","8px","margin-top","4px"],[2,"font-size","13px","font-weight","500",3,"color"],[2,"font-size","13px","font-weight","500"],[3,"ngComponentOutlet","ngComponentOutletInputs"],[3,"rowClick","handleKeydown","cancelEditMessage","saveEditMessage","userEditEvalCaseMessageChange","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","clickEvent","longRunningResponseComplete","agentStateClick","isSelectable","uiEvent","index","uiEvents","isSelected","appName","userId","sessionId","sessionName","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userEditEvalCaseMessage","agentGraphData","allWorkflowNodes","isUserFeedbackEnabled","isLoadingAgentResponse"],[1,"trace-tree-container",3,"display"],[1,"trace-tree-container"],[3,"spans","invocationId","uiEvents","shouldShowEvent"],["mode","indeterminate"],[1,"chat-input",3,"video-streaming"],[1,"chat-input"],["type","file","multiple","","hidden","",3,"change"],[1,"chat-input-content-row"],["appearance","outline","subscriptSizing","dynamic",1,"input-field"],[1,"file-preview"],["matInput","","cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","10",1,"chat-input-box",3,"ngModelChange","keydown.enter","ngModel","placeholder"],["mat-icon-button","","matSuffix","",1,"send-message-btn",3,"click","matTooltip"],[1,"video-container"],[1,"chat-input-actions"],[1,"chat-input-actions-left"],["mat-icon-button","",1,"chat-action-button",3,"click","matTooltip","disabled"],["mat-icon-button","",1,"chat-action-button",3,"matMenuTriggerFor","matTooltip","disabled"],["mat-menu-item","",3,"click","matTooltip"],[1,"chat-input-actions-right"],[3,"toggleAudioRecording","toggleVideoRecording","isAudioRecording","isVideoRecording","micVolume","isBidiStreamingEnabled"],[1,"file-container"],[1,"image-container"],["alt","preview",1,"image-preview",3,"src"],["mat-icon-button","",1,"delete-button",3,"click"],["color","warn"],[1,"file-info"],["mode","indeterminate","diameter","50"]],template:function(A,i){if(A&1&&(ta(0),Ht(1,"async"),O(2,OxA,7,3,"div",5),O(3,VxA,1,1),O(4,WxA,2,0,"div",6)),A&2){let n=si(1,3,i.uiStateService.isSessionLoading());u(2),Y(i.appName!=""&&!n?2:-1),u(),Y(i.appName!=""&&i.isChatMode&&!n?3:-1),u(),Y(n?4:-1)}},dependencies:[li,Tc,ln,Dn,yn,ko,Tn,Wt,CT,IQ,CQ,qi,ji,Ps,ua,Ko,Tb,_p,lB,Ya,LB,Zs,Ml,$c,E2,gs,MtA,cs,Fa,dn,BT,$0,jy,qy,Vy,os],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%}.generated-image-container[_ngcontent-%COMP%]{max-width:400px;margin-left:20px}.generated-image[_ngcontent-%COMP%]{max-width:100%;min-width:40px;border-radius:8px}.html-artifact-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:flex-start;align-items:center}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;position:relative}.chat-sub-toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 20px;background-color:var(--mat-sys-surface-container);border-bottom:1px solid var(--mat-sys-outline-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{border-radius:16px;height:28px;align-items:center}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] .mat-button-toggle-label-content{line-height:28px;padding:0 12px;font-size:13px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-bar-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;background-color:transparent;border:none;margin-left:16px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;height:28px;cursor:pointer;transition:background-color .2s ease}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-label[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;color:var(--mat-sys-on-surface-variant);padding:0;margin-left:4px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:transparent;border:1px dashed var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;font-weight:500;height:28px;cursor:pointer;transition:all .2s ease;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant);border-color:var(--mat-sys-outline);color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;margin-right:4px} .filter-panel{min-width:max-content!important;max-width:50vw} .filter-panel .mat-mdc-menu-item{min-height:32px!important;font-size:12px!important} .filter-panel .mat-mdc-menu-item .mat-mdc-menu-item-text, .filter-panel .mat-mdc-menu-item .mdc-list-item__primary-text{font-size:12px!important;line-height:normal}.trace-tree-container[_ngcontent-%COMP%]{margin:12px 48px 12px 12px;border-radius:12px;border:none;background:var(--mat-sys-surface-container-lowest, #fff);box-shadow:0 4px 20px #0000000d,0 1px 3px #0000000a}.chat-input[_ngcontent-%COMP%]{display:flex;flex-direction:column;padding:10px;width:min(960px,88%);margin:0 auto;position:relative;transition:all .3s ease}.chat-input[_ngcontent-%COMP%] .chat-input-content-row[_ngcontent-%COMP%]{display:flex;gap:16px;align-items:flex-end;width:100%}.video-container[_ngcontent-%COMP%]{display:none;border-radius:12px;overflow:hidden;background:var(--mat-sys-surface-variant);border:1px solid var(--mat-sys-outline-variant);width:200px}.video-container.visible[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;flex-shrink:0;box-shadow:0 8px 24px #00000026}.video-container[_ngcontent-%COMP%] video{width:100%!important;height:auto!important;max-height:280px;object-fit:cover;border-radius:12px;transform:scaleX(-1)}.input-field[_ngcontent-%COMP%]{flex-grow:1;position:relative}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);border:none;box-sizing:content-box;caret-color:var(--mat-sys-primary)}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant)}.input-field[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--mat-sys-primary)!important}.chat-input-actions[_ngcontent-%COMP%]{width:100%;margin-top:10px;display:flex;justify-content:space-between;align-items:center}.chat-input-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)!important}.chat-input-actions[_ngcontent-%COMP%] button.recording[_ngcontent-%COMP%]{background-color:var(--mat-sys-error)!important;color:var(--mat-sys-on-error, #ffffff)!important}.chat-input-actions-left[_ngcontent-%COMP%], .chat-input-actions-right[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.image-container[_ngcontent-%COMP%]{position:relative;display:inline-block;border-radius:12px;overflow:hidden}.image-preview[_ngcontent-%COMP%]{display:block;width:100%;height:auto;border-radius:12px;width:80px;height:80px}.delete-button[_ngcontent-%COMP%]{position:absolute;top:1px;right:1px;border:none;border-radius:50%;padding:8px;cursor:pointer;color:var(--mat-sys-error);display:flex;align-items:center;justify-content:center;scale:.7}.delete-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}.file-container[_ngcontent-%COMP%]{position:relative;display:flex;flex-direction:column;gap:8px;height:80px;border-radius:12px}.file-info[_ngcontent-%COMP%]{margin-right:60px;padding-top:20px;padding-left:16px}.chat-input-box[_ngcontent-%COMP%]{caret-color:#fff}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}.messages-loading-container[_ngcontent-%COMP%]{margin-top:1em;margin-bottom:1em}.agent-loading-indicator[_ngcontent-%COMP%]{margin-top:16px;margin-bottom:8px;padding:0 20px;width:240px}.readme-content[_ngcontent-%COMP%]{padding:0 20px;font-size:14px;line-height:1.8;color:var(--mat-sys-on-surface)}"]})};var ZxA={cancelButton:"Cancel",saveButton:"Save",invalidJsonAlert:"Invalid JSON: "},RtA=new kA("Edit Json Dialog Messages",{factory:()=>ZxA});var S3=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.jsonString=JSON.stringify(A.jsonContent,null,2),this.functionName=A.functionName||""}jsonEditorComponent=So(yc);jsonString="";functionName="";i18n=w(RtA);ngOnInit(){}onSave(){try{this.jsonString=this.jsonEditorComponent().getJsonString();let e=JSON.parse(this.jsonString);this.dialogRef.close(e)}catch(e){alert(this.i18n.invalidJsonAlert+e)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-edit-json-dialog"]],viewQuery:function(A,i){A&1&&ns(i.jsonEditorComponent,yc,5),A&2&&ur()},decls:11,vars:5,consts:[[1,"dialog-container"],["mat-dialog-title",""],[1,"editor"],[3,"jsonString"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(B(0,"div",0)(1,"h2",1),y(2),Q(),B(3,"mat-dialog-content",2),y(4),hA(5,"app-json-editor",3),Q(),B(6,"mat-dialog-actions",4)(7,"button",5),y(8),Q(),B(9,"button",6),U("click",function(){return i.onSave()}),y(10),Q()()()),A&2&&(u(2),lA(i.data.dialogHeader),u(2),ue(" ",i.functionName," "),u(),H("jsonString",i.jsonString),u(3),lA(i.i18n.cancelButton),u(2),lA(i.i18n.saveButton))},dependencies:[fa,Na,yc,pa,pi,B2],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:18px;width:500px;box-shadow:0 8px 16px var(--edit-json-dialog-container-box-shadow-color)}.editor[_ngcontent-%COMP%]{padding-top:12px;height:300px}"]})};var XxA=[[["caption"]],[["colgroup"],["col"]],"*"],$xA=["caption","colgroup, col","*"];function A_A(t,e){t&1&&Ve(0,2)}function e_A(t,e){t&1&&(B(0,"thead",0),sn(1,1),Q(),B(2,"tbody",0),sn(3,2)(4,3),Q(),B(5,"tfoot",0),sn(6,4),Q())}function t_A(t,e){t&1&&sn(0,1)(1,2)(2,3)(3,4)}var Sc=new kA("CDK_TABLE");var Xy=(()=>{class t{template=w(ao);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkCellDef",""]]})}return t})(),$y=(()=>{class t{template=w(ao);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkHeaderCellDef",""]]})}return t})(),LtA=(()=>{class t{template=w(ao);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkFooterCellDef",""]]})}return t})(),QQ=(()=>{class t{_table=w(Sc,{optional:!0});_hasStickyChanged=!1;get name(){return this._name}set name(A){this._setNameInput(A)}_name;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;get stickyEnd(){return this._stickyEnd}set stickyEnd(A){A!==this._stickyEnd&&(this._stickyEnd=A,this._hasStickyChanged=!0)}_stickyEnd=!1;cell;headerCell;footerCell;cssClassFriendlyName;_columnCssClassName;constructor(){}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}_updateColumnCssClassName(){this._columnCssClassName=[`cdk-column-${this.cssClassFriendlyName}`]}_setNameInput(A){A&&(this._name=A,this.cssClassFriendlyName=A.replace(/[^a-z0-9_-]/gi,"-"),this._updateColumnCssClassName())}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkColumnDef",""]],contentQueries:function(i,n,o){if(i&1&&jo(o,Xy,5)(o,$y,5)(o,LtA,5),i&2){let a;ae(a=re())&&(n.cell=a.first),ae(a=re())&&(n.headerCell=a.first),ae(a=re())&&(n.footerCell=a.first)}},inputs:{name:[0,"cdkColumnDef","name"],sticky:[2,"sticky","sticky",Be],stickyEnd:[2,"stickyEnd","stickyEnd",Be]}})}return t})(),Zy=class{constructor(e,A){A.nativeElement.classList.add(...e._columnCssClassName)}},GtA=(()=>{class t extends Zy{constructor(){super(w(QQ),w(ce))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["cdk-header-cell"],["th","cdk-header-cell",""]],hostAttrs:["role","columnheader",1,"cdk-header-cell"],features:[mt]})}return t})();var KtA=(()=>{class t extends Zy{constructor(){let A=w(QQ),i=w(ce);super(A,i);let n=A._table?._getCellRole();n&&i.nativeElement.setAttribute("role",n)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["cdk-cell"],["td","cdk-cell",""]],hostAttrs:[1,"cdk-cell"],features:[mt]})}return t})();var jN=(()=>{class t{template=w(ao);_differs=w(ZI);columns;_columnsDiffer;constructor(){}ngOnChanges(A){if(!this._columnsDiffer){let i=A.columns&&A.columns.currentValue||[];this._columnsDiffer=this._differs.find(i).create(),this._columnsDiffer.diff(i)}}getColumnsDiff(){return this._columnsDiffer.diff(this.columns)}extractCellTemplate(A){return this instanceof qN?A.headerCell.template:this instanceof VN?A.footerCell.template:A.cell.template}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,features:[Yt]})}return t})(),qN=(()=>{class t extends jN{_table=w(Sc,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(w(ao),w(ZI))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkHeaderRowDef",""]],inputs:{columns:[0,"cdkHeaderRowDef","columns"],sticky:[2,"cdkHeaderRowDefSticky","sticky",Be]},features:[mt,Yt]})}return t})(),VN=(()=>{class t extends jN{_table=w(Sc,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(w(ao),w(ZI))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkFooterRowDef",""]],inputs:{columns:[0,"cdkFooterRowDef","columns"],sticky:[2,"cdkFooterRowDefSticky","sticky",Be]},features:[mt,Yt]})}return t})(),Av=(()=>{class t extends jN{_table=w(Sc,{optional:!0});when;constructor(){super(w(ao),w(ZI))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkRowDef",""]],inputs:{columns:[0,"cdkRowDefColumns","columns"],when:[0,"cdkRowDefWhen","when"]},features:[mt]})}return t})(),x3=(()=>{class t{_viewContainer=w(Mo);cells;context;static mostRecentCellOutlet=null;constructor(){t.mostRecentCellOutlet=this}ngOnDestroy(){t.mostRecentCellOutlet===this&&(t.mostRecentCellOutlet=null)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkCellOutlet",""]]})}return t})();var WN=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["cdk-row"],["tr","cdk-row",""]],hostAttrs:["role","row",1,"cdk-row"],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&sn(0,0)},dependencies:[x3],encapsulation:2})}return t})(),UtA=(()=>{class t{templateRef=w(ao);_contentClassNames=["cdk-no-data-row","cdk-row"];_cellClassNames=["cdk-cell","cdk-no-data-cell"];_cellSelector="td, cdk-cell, [cdk-cell], .cdk-cell";constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["ng-template","cdkNoDataRow",""]]})}return t})(),NtA=["top","bottom","left","right"],PN=class{_isNativeHtmlTable;_stickCellCss;_isBrowser;_needsPositionStickyOnElement;direction;_positionListener;_tableInjector;_elemSizeCache=new WeakMap;_resizeObserver=globalThis?.ResizeObserver?new globalThis.ResizeObserver(e=>this._updateCachedSizes(e)):null;_updatedStickyColumnsParamsToReplay=[];_stickyColumnsReplayTimeout=null;_cachedCellWidths=[];_borderCellCss;_destroyed=!1;constructor(e,A,i=!0,n=!0,o,a,r){this._isNativeHtmlTable=e,this._stickCellCss=A,this._isBrowser=i,this._needsPositionStickyOnElement=n,this.direction=o,this._positionListener=a,this._tableInjector=r,this._borderCellCss={top:`${A}-border-elem-top`,bottom:`${A}-border-elem-bottom`,left:`${A}-border-elem-left`,right:`${A}-border-elem-right`}}clearStickyPositioning(e,A){(A.includes("left")||A.includes("right"))&&this._removeFromStickyColumnReplayQueue(e);let i=[];for(let n of e)n.nodeType===n.ELEMENT_NODE&&i.push(n,...Array.from(n.children));Hn({write:()=>{for(let n of i)this._removeStickyStyle(n,A)}},{injector:this._tableInjector})}updateStickyColumns(e,A,i,n=!0,o=!0){if(!e.length||!this._isBrowser||!(A.some(f=>f)||i.some(f=>f))){this._positionListener?.stickyColumnsUpdated({sizes:[]}),this._positionListener?.stickyEndColumnsUpdated({sizes:[]});return}let a=e[0],r=a.children.length,s=this.direction==="rtl",l=s?"right":"left",g=s?"left":"right",C=A.lastIndexOf(!0),I=i.indexOf(!0),d,h,E;o&&this._updateStickyColumnReplayQueue({rows:[...e],stickyStartStates:[...A],stickyEndStates:[...i]}),Hn({earlyRead:()=>{d=this._getCellWidths(a,n),h=this._getStickyStartColumnPositions(d,A),E=this._getStickyEndColumnPositions(d,i)},write:()=>{for(let f of e)for(let m=0;m!!f)&&(this._positionListener.stickyColumnsUpdated({sizes:C===-1?[]:d.slice(0,C+1).map((f,m)=>A[m]?f:null)}),this._positionListener.stickyEndColumnsUpdated({sizes:I===-1?[]:d.slice(I).map((f,m)=>i[m+I]?f:null).reverse()}))}},{injector:this._tableInjector})}stickRows(e,A,i){if(!this._isBrowser)return;let n=i==="bottom"?e.slice().reverse():e,o=i==="bottom"?A.slice().reverse():A,a=[],r=[],s=[];Hn({earlyRead:()=>{for(let l=0,g=0;l{let l=o.lastIndexOf(!0);for(let g=0;g{let i=e.querySelector("tfoot");i&&(A.some(n=>!n)?this._removeStickyStyle(i,["bottom"]):this._addStickyStyle(i,"bottom",0,!1))}},{injector:this._tableInjector})}destroy(){this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._resizeObserver?.disconnect(),this._destroyed=!0}_removeStickyStyle(e,A){if(!e.classList.contains(this._stickCellCss))return;for(let n of A)e.style[n]="",e.classList.remove(this._borderCellCss[n]);NtA.some(n=>A.indexOf(n)===-1&&e.style[n])?e.style.zIndex=this._getCalculatedZIndex(e):(e.style.zIndex="",this._needsPositionStickyOnElement&&(e.style.position=""),e.classList.remove(this._stickCellCss))}_addStickyStyle(e,A,i,n){e.classList.add(this._stickCellCss),n&&e.classList.add(this._borderCellCss[A]),e.style[A]=`${i}px`,e.style.zIndex=this._getCalculatedZIndex(e),this._needsPositionStickyOnElement&&(e.style.cssText+="position: -webkit-sticky; position: sticky; ")}_getCalculatedZIndex(e){let A={top:100,bottom:10,left:1,right:1},i=0;for(let n of NtA)e.style[n]&&(i+=A[n]);return i?`${i}`:""}_getCellWidths(e,A=!0){if(!A&&this._cachedCellWidths.length)return this._cachedCellWidths;let i=[],n=e.children;for(let o=0;o0;o--)A[o]&&(i[o]=n,n+=e[o]);return i}_retrieveElementSize(e){let A=this._elemSizeCache.get(e);if(A)return A;let i=e.getBoundingClientRect(),n={width:i.width,height:i.height};return this._resizeObserver&&(this._elemSizeCache.set(e,n),this._resizeObserver.observe(e,{box:"border-box"})),n}_updateStickyColumnReplayQueue(e){this._removeFromStickyColumnReplayQueue(e.rows),this._stickyColumnsReplayTimeout||this._updatedStickyColumnsParamsToReplay.push(e)}_removeFromStickyColumnReplayQueue(e){let A=new Set(e);for(let i of this._updatedStickyColumnsParamsToReplay)i.rows=i.rows.filter(n=>!A.has(n));this._updatedStickyColumnsParamsToReplay=this._updatedStickyColumnsParamsToReplay.filter(i=>!!i.rows.length)}_updateCachedSizes(e){let A=!1;for(let i of e){let n=i.borderBoxSize?.length?{width:i.borderBoxSize[0].inlineSize,height:i.borderBoxSize[0].blockSize}:{width:i.contentRect.width,height:i.contentRect.height};n.width!==this._elemSizeCache.get(i.target)?.width&&i_A(i.target)&&(A=!0),this._elemSizeCache.set(i.target,n)}A&&this._updatedStickyColumnsParamsToReplay.length&&(this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._stickyColumnsReplayTimeout=setTimeout(()=>{if(!this._destroyed){for(let i of this._updatedStickyColumnsParamsToReplay)this.updateStickyColumns(i.rows,i.stickyStartStates,i.stickyEndStates,!0,!1);this._updatedStickyColumnsParamsToReplay=[],this._stickyColumnsReplayTimeout=null}},0))}};function i_A(t){return["cdk-cell","cdk-header-cell","cdk-footer-cell"].some(e=>t.classList.contains(e))}var k3=new kA("STICKY_POSITIONING_LISTENER");var ZN=(()=>{class t{viewContainer=w(Mo);elementRef=w(ce);constructor(){let A=w(Sc);A._rowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","rowOutlet",""]]})}return t})(),XN=(()=>{class t{viewContainer=w(Mo);elementRef=w(ce);constructor(){let A=w(Sc);A._headerRowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","headerRowOutlet",""]]})}return t})(),$N=(()=>{class t{viewContainer=w(Mo);elementRef=w(ce);constructor(){let A=w(Sc);A._footerRowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","footerRowOutlet",""]]})}return t})(),AF=(()=>{class t{viewContainer=w(Mo);elementRef=w(ce);constructor(){let A=w(Sc);A._noDataRowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","noDataRowOutlet",""]]})}return t})(),eF=(()=>{class t{_differs=w(ZI);_changeDetectorRef=w(wt);_elementRef=w(ce);_dir=w(fo,{optional:!0});_platform=w(gi);_viewRepeater;_viewportRuler=w(Ms);_injector=w(Dt);_virtualScrollViewport=w(ET,{optional:!0,host:!0});_positionListener=w(k3,{optional:!0})||w(k3,{optional:!0,skipSelf:!0});_document=w(ti);_data;_renderedRange;_onDestroy=new ie;_renderRows;_renderChangeSubscription=null;_columnDefsByName=new Map;_rowDefs;_headerRowDefs;_footerRowDefs;_dataDiffer;_defaultRowDef=null;_customColumnDefs=new Set;_customRowDefs=new Set;_customHeaderRowDefs=new Set;_customFooterRowDefs=new Set;_customNoDataRow=null;_headerRowDefChanged=!0;_footerRowDefChanged=!0;_stickyColumnStylesNeedReset=!0;_forceRecalculateCellWidths=!0;_cachedRenderRowsMap=new Map;_isNativeHtmlTable;_stickyStyler;stickyCssClass="cdk-table-sticky";needsPositionStickyOnElement=!0;_isServer;_isShowingNoDataRow=!1;_hasAllOutlets=!1;_hasInitialized=!1;_headerRowStickyUpdates=new ie;_footerRowStickyUpdates=new ie;_disableVirtualScrolling=!1;_getCellRole(){if(this._cellRoleInternal===void 0){let A=this._elementRef.nativeElement.getAttribute("role");return A==="grid"||A==="treegrid"?"gridcell":"cell"}return this._cellRoleInternal}_cellRoleInternal=void 0;get trackBy(){return this._trackByFn}set trackBy(A){this._trackByFn=A}_trackByFn;get dataSource(){return this._dataSource}set dataSource(A){this._dataSource!==A&&(this._switchDataSource(A),this._changeDetectorRef.markForCheck())}_dataSource;_dataSourceChanges=new ie;_dataStream=new ie;get multiTemplateDataRows(){return this._multiTemplateDataRows}set multiTemplateDataRows(A){this._multiTemplateDataRows=A,this._rowOutlet&&this._rowOutlet.viewContainer.length&&(this._forceRenderDataRows(),this.updateStickyColumnStyles())}_multiTemplateDataRows=!1;get fixedLayout(){return this._virtualScrollEnabled()?!0:this._fixedLayout}set fixedLayout(A){this._fixedLayout=A,this._forceRecalculateCellWidths=!0,this._stickyColumnStylesNeedReset=!0}_fixedLayout=!1;recycleRows=!1;contentChanged=new LA;viewChange=new ei({start:0,end:Number.MAX_VALUE});_rowOutlet;_headerRowOutlet;_footerRowOutlet;_noDataRowOutlet;_contentColumnDefs;_contentRowDefs;_contentHeaderRowDefs;_contentFooterRowDefs;_noDataRow;constructor(){w(new Us("role"),{optional:!0})||this._elementRef.nativeElement.setAttribute("role","table"),this._isServer=!this._platform.isBrowser,this._isNativeHtmlTable=this._elementRef.nativeElement.nodeName==="TABLE",this._dataDiffer=this._differs.find([]).create((i,n)=>this.trackBy?this.trackBy(n.dataIndex,n.data):n)}ngOnInit(){this._setupStickyStyler(),this._viewportRuler.change().pipe(Qt(this._onDestroy)).subscribe(()=>{this._forceRecalculateCellWidths=!0})}ngAfterContentInit(){this._viewRepeater=this.recycleRows||this._virtualScrollEnabled()?new Fm:new Lm,this._virtualScrollEnabled()&&this._setupVirtualScrolling(this._virtualScrollViewport),this._hasInitialized=!0}ngAfterContentChecked(){this._canRender()&&this._render()}ngOnDestroy(){this._stickyStyler?.destroy(),[this._rowOutlet?.viewContainer,this._headerRowOutlet?.viewContainer,this._footerRowOutlet?.viewContainer,this._cachedRenderRowsMap,this._customColumnDefs,this._customRowDefs,this._customHeaderRowDefs,this._customFooterRowDefs,this._columnDefsByName].forEach(A=>{A?.clear()}),this._headerRowDefs=[],this._footerRowDefs=[],this._defaultRowDef=null,this._headerRowStickyUpdates.complete(),this._footerRowStickyUpdates.complete(),this._onDestroy.next(),this._onDestroy.complete(),Ru(this.dataSource)&&this.dataSource.disconnect(this)}renderRows(){this._renderRows=this._getAllRenderRows();let A=this._dataDiffer.diff(this._renderRows);if(!A){this._updateNoDataRow(),this.contentChanged.next();return}let i=this._rowOutlet.viewContainer;this._viewRepeater.applyChanges(A,i,(n,o,a)=>this._getEmbeddedViewArgs(n.item,a),n=>n.item.data,n=>{n.operation===Tg.INSERTED&&n.context&&this._renderCellTemplateForItem(n.record.item.rowDef,n.context)}),this._updateRowIndexContext(),A.forEachIdentityChange(n=>{let o=i.get(n.currentIndex);o.context.$implicit=n.item.data}),this._updateNoDataRow(),this.contentChanged.next(),this.updateStickyColumnStyles()}addColumnDef(A){this._customColumnDefs.add(A)}removeColumnDef(A){this._customColumnDefs.delete(A)}addRowDef(A){this._customRowDefs.add(A)}removeRowDef(A){this._customRowDefs.delete(A)}addHeaderRowDef(A){this._customHeaderRowDefs.add(A),this._headerRowDefChanged=!0}removeHeaderRowDef(A){this._customHeaderRowDefs.delete(A),this._headerRowDefChanged=!0}addFooterRowDef(A){this._customFooterRowDefs.add(A),this._footerRowDefChanged=!0}removeFooterRowDef(A){this._customFooterRowDefs.delete(A),this._footerRowDefChanged=!0}setNoDataRow(A){this._customNoDataRow=A}updateStickyHeaderRowStyles(){let A=this._getRenderedRows(this._headerRowOutlet);if(this._isNativeHtmlTable){let n=FtA(this._headerRowOutlet,"thead");n&&(n.style.display=A.length?"":"none")}let i=this._headerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,["top"]),this._stickyStyler.stickRows(A,i,"top"),this._headerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyFooterRowStyles(){let A=this._getRenderedRows(this._footerRowOutlet);if(this._isNativeHtmlTable){let n=FtA(this._footerRowOutlet,"tfoot");n&&(n.style.display=A.length?"":"none")}let i=this._footerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,["bottom"]),this._stickyStyler.stickRows(A,i,"bottom"),this._stickyStyler.updateStickyFooterContainer(this._elementRef.nativeElement,i),this._footerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyColumnStyles(){let A=this._getRenderedRows(this._headerRowOutlet),i=this._getRenderedRows(this._rowOutlet),n=this._getRenderedRows(this._footerRowOutlet);(this._isNativeHtmlTable&&!this.fixedLayout||this._stickyColumnStylesNeedReset)&&(this._stickyStyler.clearStickyPositioning([...A,...i,...n],["left","right"]),this._stickyColumnStylesNeedReset=!1),A.forEach((o,a)=>{this._addStickyColumnStyles([o],this._headerRowDefs[a])}),this._rowDefs.forEach(o=>{let a=[];for(let r=0;r{this._addStickyColumnStyles([o],this._footerRowDefs[a])}),Array.from(this._columnDefsByName.values()).forEach(o=>o.resetStickyChanged())}stickyColumnsUpdated(A){this._positionListener?.stickyColumnsUpdated(A)}stickyEndColumnsUpdated(A){this._positionListener?.stickyEndColumnsUpdated(A)}stickyHeaderRowsUpdated(A){this._headerRowStickyUpdates.next(A),this._positionListener?.stickyHeaderRowsUpdated(A)}stickyFooterRowsUpdated(A){this._footerRowStickyUpdates.next(A),this._positionListener?.stickyFooterRowsUpdated(A)}_outletAssigned(){!this._hasAllOutlets&&this._rowOutlet&&this._headerRowOutlet&&this._footerRowOutlet&&this._noDataRowOutlet&&(this._hasAllOutlets=!0,this._canRender()&&this._render())}_canRender(){return this._hasAllOutlets&&this._hasInitialized}_render(){this._cacheRowDefs(),this._cacheColumnDefs(),!this._headerRowDefs.length&&!this._footerRowDefs.length&&this._rowDefs.length;let i=this._renderUpdatedColumns()||this._headerRowDefChanged||this._footerRowDefChanged;this._stickyColumnStylesNeedReset=this._stickyColumnStylesNeedReset||i,this._forceRecalculateCellWidths=i,this._headerRowDefChanged&&(this._forceRenderHeaderRows(),this._headerRowDefChanged=!1),this._footerRowDefChanged&&(this._forceRenderFooterRows(),this._footerRowDefChanged=!1),this.dataSource&&this._rowDefs.length>0&&!this._renderChangeSubscription?this._observeRenderChanges():this._stickyColumnStylesNeedReset&&this.updateStickyColumnStyles(),this._checkStickyStates()}_getAllRenderRows(){if(!Array.isArray(this._data)||!this._renderedRange)return[];let A=[],i=Math.min(this._data.length,this._renderedRange.end),n=this._cachedRenderRowsMap;this._cachedRenderRowsMap=new Map;for(let o=this._renderedRange.start;o{let r=n&&n.has(a)?n.get(a):[];if(r.length){let s=r.shift();return s.dataIndex=i,s}else return{data:A,rowDef:a,dataIndex:i}})}_cacheColumnDefs(){this._columnDefsByName.clear(),Wy(this._getOwnDefs(this._contentColumnDefs),this._customColumnDefs).forEach(i=>{this._columnDefsByName.has(i.name),this._columnDefsByName.set(i.name,i)})}_cacheRowDefs(){this._headerRowDefs=Wy(this._getOwnDefs(this._contentHeaderRowDefs),this._customHeaderRowDefs),this._footerRowDefs=Wy(this._getOwnDefs(this._contentFooterRowDefs),this._customFooterRowDefs),this._rowDefs=Wy(this._getOwnDefs(this._contentRowDefs),this._customRowDefs);let A=this._rowDefs.filter(i=>!i.when);this._defaultRowDef=A[0]}_renderUpdatedColumns(){let A=(a,r)=>{let s=!!r.getColumnsDiff();return a||s},i=this._rowDefs.reduce(A,!1);i&&this._forceRenderDataRows();let n=this._headerRowDefs.reduce(A,!1);n&&this._forceRenderHeaderRows();let o=this._footerRowDefs.reduce(A,!1);return o&&this._forceRenderFooterRows(),i||n||o}_switchDataSource(A){this._data=[],Ru(this.dataSource)&&this.dataSource.disconnect(this),this._renderChangeSubscription&&(this._renderChangeSubscription.unsubscribe(),this._renderChangeSubscription=null),A||(this._dataDiffer&&this._dataDiffer.diff([]),this._rowOutlet&&this._rowOutlet.viewContainer.clear()),this._dataSource=A}_observeRenderChanges(){if(!this.dataSource)return;let A;Ru(this.dataSource)?A=this.dataSource.connect(this):zd(this.dataSource)?A=this.dataSource:Array.isArray(this.dataSource)&&(A=ne(this.dataSource)),this._renderChangeSubscription=Qr([A,this.viewChange]).pipe(Qt(this._onDestroy)).subscribe(([i,n])=>{this._data=i||[],this._renderedRange=n,this._dataStream.next(i),this.renderRows()})}_forceRenderHeaderRows(){this._headerRowOutlet.viewContainer.length>0&&this._headerRowOutlet.viewContainer.clear(),this._headerRowDefs.forEach((A,i)=>this._renderRow(this._headerRowOutlet,A,i)),this.updateStickyHeaderRowStyles()}_forceRenderFooterRows(){this._footerRowOutlet.viewContainer.length>0&&this._footerRowOutlet.viewContainer.clear(),this._footerRowDefs.forEach((A,i)=>this._renderRow(this._footerRowOutlet,A,i)),this.updateStickyFooterRowStyles()}_addStickyColumnStyles(A,i){let n=Array.from(i?.columns||[]).map(r=>{let s=this._columnDefsByName.get(r);return s}),o=n.map(r=>r.sticky),a=n.map(r=>r.stickyEnd);this._stickyStyler.updateStickyColumns(A,o,a,!this.fixedLayout||this._forceRecalculateCellWidths)}_getRenderedRows(A){let i=[];for(let n=0;n!o.when||o.when(i,A));else{let o=this._rowDefs.find(a=>a.when&&a.when(i,A))||this._defaultRowDef;o&&n.push(o)}return n.length,n}_getEmbeddedViewArgs(A,i){let n=A.rowDef,o={$implicit:A.data};return{templateRef:n.template,context:o,index:i}}_renderRow(A,i,n,o={}){let a=A.viewContainer.createEmbeddedView(i.template,o,n);return this._renderCellTemplateForItem(i,o),a}_renderCellTemplateForItem(A,i){for(let n of this._getCellTemplates(A))x3.mostRecentCellOutlet&&x3.mostRecentCellOutlet._viewContainer.createEmbeddedView(n,i);this._changeDetectorRef.markForCheck()}_updateRowIndexContext(){let A=this._rowOutlet.viewContainer;for(let i=0,n=A.length;i{let n=this._columnDefsByName.get(i);return A.extractCellTemplate(n)})}_forceRenderDataRows(){this._dataDiffer.diff([]),this._rowOutlet.viewContainer.clear(),this.renderRows()}_checkStickyStates(){let A=(i,n)=>i||n.hasStickyChanged();this._headerRowDefs.reduce(A,!1)&&this.updateStickyHeaderRowStyles(),this._footerRowDefs.reduce(A,!1)&&this.updateStickyFooterRowStyles(),Array.from(this._columnDefsByName.values()).reduce(A,!1)&&(this._stickyColumnStylesNeedReset=!0,this.updateStickyColumnStyles())}_setupStickyStyler(){let A=this._dir?this._dir.value:"ltr",i=this._injector;this._stickyStyler=new PN(this._isNativeHtmlTable,this.stickyCssClass,this._platform.isBrowser,this.needsPositionStickyOnElement,A,this,i),(this._dir?this._dir.change:ne()).pipe(Qt(this._onDestroy)).subscribe(n=>{this._stickyStyler.direction=n,this.updateStickyColumnStyles()})}_setupVirtualScrolling(A){let i=typeof requestAnimationFrame<"u"?Yd:jv;this.viewChange.next({start:0,end:0}),A.renderedRangeStream.pipe(jI(0,i),Qt(this._onDestroy)).subscribe(this.viewChange),A.attach({dataStream:this._dataStream,measureRangeSize:(n,o)=>this._measureRangeSize(n,o)}),Qr([A.renderedContentOffset,this._headerRowStickyUpdates]).pipe(Qt(this._onDestroy)).subscribe(([n,o])=>{if(!(!o.sizes||!o.offsets||!o.elements))for(let a=0;a{if(!(!o.sizes||!o.offsets||!o.elements))for(let a=0;a!i._table||i._table===this)}_updateNoDataRow(){let A=this._customNoDataRow||this._noDataRow;if(!A)return;let i=this._rowOutlet.viewContainer.length===0;if(i===this._isShowingNoDataRow)return;let n=this._noDataRowOutlet.viewContainer;if(i){let o=n.createEmbeddedView(A.templateRef),a=o.rootNodes[0];if(o.rootNodes.length===1&&a?.nodeType===this._document.ELEMENT_NODE){a.setAttribute("role","row"),a.classList.add(...A._contentClassNames);let r=a.querySelectorAll(A._cellSelector);for(let s=0;s=A.end||i!=="vertical")return 0;let n=this.viewChange.value,o=this._rowOutlet.viewContainer;A.startn.end;let a=A.start-n.start,r=A.end-A.start,s,l;for(let I=0;I-1;I--){let d=o.get(I+a);if(d&&d.rootNodes.length){l=d.rootNodes[d.rootNodes.length-1];break}}let g=s?.getBoundingClientRect?.(),C=l?.getBoundingClientRect?.();return g&&C?C.bottom-g.top:0}_virtualScrollEnabled(){return!this._disableVirtualScrolling&&this._virtualScrollViewport!=null}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["cdk-table"],["table","cdk-table",""]],contentQueries:function(i,n,o){if(i&1&&jo(o,UtA,5)(o,QQ,5)(o,Av,5)(o,qN,5)(o,VN,5),i&2){let a;ae(a=re())&&(n._noDataRow=a.first),ae(a=re())&&(n._contentColumnDefs=a),ae(a=re())&&(n._contentRowDefs=a),ae(a=re())&&(n._contentHeaderRowDefs=a),ae(a=re())&&(n._contentFooterRowDefs=a)}},hostAttrs:[1,"cdk-table"],hostVars:2,hostBindings:function(i,n){i&2&&RA("cdk-table-fixed-layout",n.fixedLayout)},inputs:{trackBy:"trackBy",dataSource:"dataSource",multiTemplateDataRows:[2,"multiTemplateDataRows","multiTemplateDataRows",Be],fixedLayout:[2,"fixedLayout","fixedLayout",Be],recycleRows:[2,"recycleRows","recycleRows",Be]},outputs:{contentChanged:"contentChanged"},exportAs:["cdkTable"],features:[Bt([{provide:Sc,useExisting:t},{provide:k3,useValue:null}])],ngContentSelectors:$xA,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(i,n){i&1&&(Rt(XxA),Ve(0),Ve(1,1),O(2,A_A,1,0),O(3,e_A,7,0)(4,t_A,4,0)),i&2&&(u(2),Y(n._isServer?2:-1),u(),Y(n._isNativeHtmlTable?3:4))},dependencies:[XN,ZN,AF,$N],styles:[`.cdk-table-fixed-layout{table-layout:fixed} +`],encapsulation:2})}return t})();function Wy(t,e){return t.concat(Array.from(e))}function FtA(t,e){let A=e.toUpperCase(),i=t.viewContainer.element.nativeElement;for(;i;){let n=i.nodeType===1?i.nodeName:null;if(n===A)return i;if(n==="TABLE")break;i=i.parentNode}return null}var n_A=[[["caption"]],[["colgroup"],["col"]],"*"],o_A=["caption","colgroup, col","*"];function a_A(t,e){t&1&&Ve(0,2)}function r_A(t,e){t&1&&(B(0,"thead",0),sn(1,1),Q(),B(2,"tbody",2),sn(3,3)(4,4),Q(),B(5,"tfoot",0),sn(6,5),Q())}function s_A(t,e){t&1&&sn(0,1)(1,3)(2,4)(3,5)}var TtA=(()=>{class t extends eF{stickyCssClass="mat-mdc-table-sticky";needsPositionStickyOnElement=!1;static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275cmp=SA({type:t,selectors:[["mat-table"],["table","mat-table",""]],hostAttrs:[1,"mat-mdc-table","mdc-data-table__table"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mat-table-fixed-layout",n.fixedLayout)},exportAs:["matTable"],features:[Bt([{provide:eF,useExisting:t},{provide:Sc,useExisting:t},{provide:k3,useValue:null}]),mt],ngContentSelectors:o_A,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["role","rowgroup",1,"mdc-data-table__content"],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(i,n){i&1&&(Rt(n_A),Ve(0),Ve(1,1),O(2,a_A,1,0),O(3,r_A,7,0)(4,s_A,4,0)),i&2&&(u(2),Y(n._isServer?2:-1),u(),Y(n._isNativeHtmlTable?3:4))},dependencies:[XN,ZN,AF,$N],styles:[`.mat-mdc-table-sticky{position:sticky !important}mat-table{display:block}mat-header-row{min-height:var(--mat-table-header-container-height, 56px)}mat-row{min-height:var(--mat-table-row-item-container-height, 52px)}mat-footer-row{min-height:var(--mat-table-footer-container-height, 52px)}mat-row,mat-header-row,mat-footer-row{display:flex;border-width:0;border-bottom-width:1px;border-style:solid;align-items:center;box-sizing:border-box}mat-cell:first-of-type,mat-header-cell:first-of-type,mat-footer-cell:first-of-type{padding-left:24px}[dir=rtl] mat-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:first-of-type:not(:only-of-type){padding-left:0;padding-right:24px}mat-cell:last-of-type,mat-header-cell:last-of-type,mat-footer-cell:last-of-type{padding-right:24px}[dir=rtl] mat-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:last-of-type:not(:only-of-type){padding-right:0;padding-left:24px}mat-cell,mat-header-cell,mat-footer-cell{flex:1;display:flex;align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit}.mat-mdc-table{min-width:100%;border:0;border-spacing:0;table-layout:auto;white-space:normal;background-color:var(--mat-table-background-color, var(--mat-sys-surface))}.mat-table-fixed-layout{table-layout:fixed}.mdc-data-table__cell{box-sizing:border-box;overflow:hidden;text-align:start;text-overflow:ellipsis}.mdc-data-table__cell,.mdc-data-table__header-cell{padding:0 16px}.mat-mdc-header-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-header-container-height, 56px);color:var(--mat-table-header-headline-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-header-headline-font, var(--mat-sys-title-small-font, Roboto, sans-serif));line-height:var(--mat-table-header-headline-line-height, var(--mat-sys-title-small-line-height));font-size:var(--mat-table-header-headline-size, var(--mat-sys-title-small-size, 14px));font-weight:var(--mat-table-header-headline-weight, var(--mat-sys-title-small-weight, 500))}.mat-mdc-row{height:var(--mat-table-row-item-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)))}.mat-mdc-row,.mdc-data-table__content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-table-row-item-label-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-row-item-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-row-item-label-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-row-item-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-footer-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-footer-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-footer-supporting-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-footer-supporting-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-footer-supporting-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-footer-supporting-text-weight, var(--mat-sys-body-medium-weight));letter-spacing:var(--mat-table-footer-supporting-text-tracking, var(--mat-sys-body-medium-tracking))}.mat-mdc-header-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-header-headline-tracking, var(--mat-sys-title-small-tracking));font-weight:inherit;line-height:inherit;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;outline:none;text-align:start}.mdc-data-table__row:last-child>.mat-mdc-header-cell{border-bottom:none}.mat-mdc-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking));line-height:inherit}.mdc-data-table__row:last-child>.mat-mdc-cell{border-bottom:none}.mat-mdc-footer-cell{letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking))}mat-row.mat-mdc-row,mat-header-row.mat-mdc-header-row,mat-footer-row.mat-mdc-footer-row{border-bottom:none}.mat-mdc-table tbody,.mat-mdc-table tfoot,.mat-mdc-table thead,.mat-mdc-cell,.mat-mdc-footer-cell,.mat-mdc-header-row,.mat-mdc-row,.mat-mdc-footer-row,.mat-mdc-table .mat-mdc-header-cell{background:inherit}.mat-mdc-table mat-header-row.mat-mdc-header-row,.mat-mdc-table mat-row.mat-mdc-row,.mat-mdc-table mat-footer-row.mat-mdc-footer-cell{height:unset}mat-header-cell.mat-mdc-header-cell,mat-cell.mat-mdc-cell,mat-footer-cell.mat-mdc-footer-cell{align-self:stretch} +`],encapsulation:2})}return t})(),JtA=(()=>{class t extends Xy{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matCellDef",""]],features:[Bt([{provide:Xy,useExisting:t}]),mt]})}return t})(),OtA=(()=>{class t extends $y{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matHeaderCellDef",""]],features:[Bt([{provide:$y,useExisting:t}]),mt]})}return t})();var YtA=(()=>{class t extends QQ{get name(){return this._name}set name(A){this._setNameInput(A)}_updateColumnCssClassName(){super._updateColumnCssClassName(),this._columnCssClassName.push(`mat-column-${this.cssClassFriendlyName}`)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matColumnDef",""]],inputs:{name:[0,"matColumnDef","name"]},features:[Bt([{provide:QQ,useExisting:t}]),mt]})}return t})(),HtA=(()=>{class t extends GtA{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["mat-header-cell"],["th","mat-header-cell",""]],hostAttrs:["role","columnheader",1,"mat-mdc-header-cell","mdc-data-table__header-cell"],features:[mt]})}return t})();var ztA=(()=>{class t extends KtA{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["mat-cell"],["td","mat-cell",""]],hostAttrs:[1,"mat-mdc-cell","mdc-data-table__cell"],features:[mt]})}return t})();var PtA=(()=>{class t extends Av{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matRowDef",""]],inputs:{columns:[0,"matRowDefColumns","columns"],when:[0,"matRowDefWhen","when"]},features:[Bt([{provide:Av,useExisting:t}]),mt]})}return t})();var jtA=(()=>{class t extends WN{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275cmp=SA({type:t,selectors:[["mat-row"],["tr","mat-row",""]],hostAttrs:["role","row",1,"mat-mdc-row","mdc-data-table__row"],exportAs:["matRow"],features:[Bt([{provide:WN,useExisting:t}]),mt],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&sn(0,0)},dependencies:[x3],encapsulation:2})}return t})();var l_A=9007199254740991,Td=class extends _u{_data;_renderData=new ei([]);_filter=new ei("");_internalPageChanges=new ie;_renderChangesSubscription=null;filteredData;get data(){return this._data.value}set data(e){e=Array.isArray(e)?e:[],this._data.next(e),this._renderChangesSubscription||this._filterData(e)}get filter(){return this._filter.value}set filter(e){this._filter.next(e),this._renderChangesSubscription||this._filterData(this.data)}get sort(){return this._sort}set sort(e){this._sort=e,this._updateChangeSubscription()}_sort;get paginator(){return this._paginator}set paginator(e){this._paginator=e,this._updateChangeSubscription()}_paginator;sortingDataAccessor=(e,A)=>{let i=e[A];if(Ep(i)){let n=Number(i);return n{let i=A.active,n=A.direction;return!i||n==""?e:e.sort((o,a)=>{let r=this.sortingDataAccessor(o,i),s=this.sortingDataAccessor(a,i),l=typeof r,g=typeof s;l!==g&&(l==="number"&&(r+=""),g==="number"&&(s+=""));let C=0;return r!=null&&s!=null?r>s?C=1:r{let i=A.trim().toLowerCase();return Object.values(e).some(n=>`${n}`.toLowerCase().includes(i))};constructor(e=[]){super(),this._data=new ei(e),this._updateChangeSubscription()}_updateChangeSubscription(){let e=this._sort?Ki(this._sort.sortChange,this._sort.initialized):ne(null),A=this._paginator?Ki(this._paginator.page,this._internalPageChanges,this._paginator.initialized):ne(null),i=this._data,n=Qr([i,this._filter]).pipe(we(([r])=>this._filterData(r))),o=Qr([n,e]).pipe(we(([r])=>this._orderData(r))),a=Qr([o,A]).pipe(we(([r])=>this._pageData(r)));this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=a.subscribe(r=>this._renderData.next(r))}_filterData(e){return this.filteredData=this.filter==null||this.filter===""?e:e.filter(A=>this.filterPredicate(A,this.filter)),this.paginator&&this._updatePaginator(this.filteredData.length),this.filteredData}_orderData(e){return this.sort?this.sortData(e.slice(),this.sort):e}_pageData(e){if(!this.paginator)return e;let A=this.paginator.pageIndex*this.paginator.pageSize;return e.slice(A,A+this.paginator.pageSize)}_updatePaginator(e){Promise.resolve().then(()=>{let A=this.paginator;if(A&&(A.length=e,A.pageIndex>0)){let i=Math.ceil(A.length/A.pageSize)-1||0,n=Math.min(A.pageIndex,i);n!==A.pageIndex&&(A.pageIndex=n,this._internalPageChanges.next())}})}connect(){return this._renderChangesSubscription||this._updateChangeSubscription(),this._renderData}disconnect(){this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=null}};var uQ=[{metricName:"tool_trajectory_avg_score",threshold:1},{metricName:"response_match_score",threshold:.7}];var ev="0123456789abcdef",tv=class t{constructor(e){this.bytes=e}static ofInner(e){if(e.length!==16)throw new TypeError("not 128-bit length");return new t(e)}static fromFieldsV7(e,A,i,n){if(!Number.isInteger(e)||!Number.isInteger(A)||!Number.isInteger(i)||!Number.isInteger(n)||e<0||A<0||i<0||n<0||e>0xffffffffffff||A>4095||i>1073741823||n>4294967295)throw new RangeError("invalid field value");let o=new Uint8Array(16);return o[0]=e/2**40,o[1]=e/2**32,o[2]=e/2**24,o[3]=e/2**16,o[4]=e/2**8,o[5]=e,o[6]=112|A>>>8,o[7]=A,o[8]=128|i>>>24,o[9]=i>>>16,o[10]=i>>>8,o[11]=i,o[12]=n>>>24,o[13]=n>>>16,o[14]=n>>>8,o[15]=n,new t(o)}static parse(e){var A,i,n,o;let a;switch(e.length){case 32:a=(A=/^[0-9a-f]{32}$/i.exec(e))===null||A===void 0?void 0:A[0];break;case 36:a=(i=/^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(e))===null||i===void 0?void 0:i.slice(1,6).join("");break;case 38:a=(n=/^\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\}$/i.exec(e))===null||n===void 0?void 0:n.slice(1,6).join("");break;case 45:a=(o=/^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(e))===null||o===void 0?void 0:o.slice(1,6).join("");break;default:break}if(a){let r=new Uint8Array(16);for(let s=0;s<16;s+=4){let l=parseInt(a.substring(2*s,2*s+8),16);r[s+0]=l>>>24,r[s+1]=l>>>16,r[s+2]=l>>>8,r[s+3]=l}return new t(r)}else throw new SyntaxError("could not parse UUID string")}toString(){let e="";for(let A=0;A>>4),e+=ev.charAt(this.bytes[A]&15),(A===3||A===5||A===7||A===9)&&(e+="-");return e}toHex(){let e="";for(let A=0;A>>4),e+=ev.charAt(this.bytes[A]&15);return e}toJSON(){return this.toString()}getVariant(){let e=this.bytes[8]>>>4;if(e<0)throw new Error("unreachable");if(e<=7)return this.bytes.every(A=>A===0)?"NIL":"VAR_0";if(e<=11)return"VAR_10";if(e<=13)return"VAR_110";if(e<=15)return this.bytes.every(A=>A===255)?"MAX":"VAR_RESERVED";throw new Error("unreachable")}getVersion(){return this.getVariant()==="VAR_10"?this.bytes[6]>>>4:void 0}clone(){return new t(this.bytes.slice(0))}equals(e){return this.compareTo(e)===0}compareTo(e){for(let A=0;A<16;A++){let i=this.bytes[A]-e.bytes[A];if(i!==0)return Math.sign(i)}return 0}},tF=class{constructor(e){this.timestamp_biased=0,this.counter=0,this.random=e??g_A()}generate(){return this.generateOrResetCore(Date.now(),1e4)}generateOrAbort(){return this.generateOrAbortCore(Date.now(),1e4)}generateOrResetCore(e,A){let i=this.generateOrAbortCore(e,A);return i===void 0&&(this.timestamp_biased=0,i=this.generateOrAbortCore(e,A)),i}generateOrAbortCore(e,A){if(!Number.isInteger(e)||e<0||e>0xffffffffffff)throw new RangeError("`unixTsMs` must be a 48-bit unsigned integer");if(A<0||A>0xffffffffffff)throw new RangeError("`rollbackAllowance` out of reasonable range");if(e++,e>this.timestamp_biased)this.timestamp_biased=e,this.resetCounter();else if(e+A>=this.timestamp_biased)this.counter++,this.counter>4398046511103&&(this.timestamp_biased++,this.resetCounter());else return;return tv.fromFieldsV7(this.timestamp_biased-1,Math.trunc(this.counter/2**30),this.counter&2**30-1,this.random.nextUint32())}resetCounter(){this.counter=this.random.nextUint32()*1024+(this.random.nextUint32()&1023)}generateV4(){let e=new Uint8Array(Uint32Array.of(this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32()).buffer);return e[6]=64|e[6]>>>4,e[8]=128|e[8]>>>2,tv.ofInner(e)}},g_A=()=>{if(typeof crypto<"u"&&typeof crypto.getRandomValues<"u")return new iF;if(typeof UUIDV7_DENY_WEAK_RNG<"u"&&UUIDV7_DENY_WEAK_RNG)throw new Error("no cryptographically strong RNG available");return{nextUint32:()=>Math.trunc(Math.random()*65536)*65536+Math.trunc(Math.random()*65536)}},iF=class{constructor(){this.buffer=new Uint32Array(8),this.cursor=65535}nextUint32(){return this.cursor>=this.buffer.length&&(crypto.getRandomValues(this.buffer),this.cursor=0),this.buffer[this.cursor++]}},qtA;var iv=()=>c_A().toString(),c_A=()=>(qtA||(qtA=new tF)).generateV4();function C_A(t,e){t&1&&(B(0,"div",1),hA(1,"mat-progress-spinner",6),Q()),t&2&&(u(),H("diameter",28)("strokeWidth",3))}function I_A(t,e){if(t&1){let A=QA();B(0,"mat-form-field",2)(1,"input",7),Di("ngModelChange",function(n){T(A);let o=p();return Bi(o.newCaseId,n)||(o.newCaseId=n),J(n)}),U("keydown.enter",function(){T(A);let n=p();return J(n.createNewEvalCase())}),Q()()}if(t&2){let A=p();u(),wi("ngModel",A.newCaseId)}}var nv=class t{evalService=w(t0);data=w(qo);dialogRef=w(lo);newCaseId=this.data.defaultName||"case_"+iv().slice(0,6);loading=!1;constructor(){}createNewEvalCase(){if(!this.newCaseId||this.newCaseId=="")alert("Cannot create eval set with empty id!");else{if(this.data.existingCases?.includes(this.newCaseId)&&!confirm(`Eval case "${this.newCaseId}" already exists. Do you want to overwrite it?`))return;this.loading=!0,this.evalService.addCurrentSession(this.data.appName,this.data.evalSetId,this.newCaseId,this.data.sessionId,this.data.userId).subscribe({next:e=>{this.dialogRef.close(!0)},error:e=>{this.loading=!1,alert("Failed to add session to eval set!")}})}}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-add-eval-session-dialog"]],decls:11,vars:3,consts:[["mat-dialog-title",""],[2,"display","flex","justify-content","center","padding","20px"],[2,"padding-left","20px","padding-right","24px"],["align","end"],["mat-button","","mat-dialog-close","",3,"disabled"],["mat-button","","cdkFocusInitial","",3,"click","disabled"],["mode","indeterminate",3,"diameter","strokeWidth"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"]],template:function(A,i){A&1&&(B(0,"h2",0),y(1,"Add Current Session To Eval Set"),Q(),B(2,"mat-dialog-content"),y(3,` Please enter the eval case name +`),Q(),O(4,C_A,2,2,"div",1)(5,I_A,2,1,"mat-form-field",2),B(6,"mat-dialog-actions",3)(7,"button",4),y(8,"Cancel"),Q(),B(9,"button",5),U("click",function(){return i.createNewEvalCase()}),y(10,"Create"),Q()()),A&2&&(u(4),Y(i.loading?4:5),u(3),H("disabled",i.loading),u(2),H("disabled",i.loading))},dependencies:[fa,Na,Ko,ua,ln,Dn,yn,ko,pa,pi,B2,gs],styles:["h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important}"]})};var d_A={allEvalSetsHeader:"Eval sets",createNewEvalSetTooltip:"Create new evaluation set",createNewEvalSetTitle:"Create New Evaluation Set",evalSetDescription:"An evaluation set is a curated collection of evaluation cases, where each case includes input-output examples for assessing agent performance.",createEvalSetButton:"Create Evaluation Set",runEvaluationButton:"Run All",runSelectedEvaluationButton:"Run Selected",viewEvalRunHistoryTooltip:"View eval run history",caseIdHeader:"Case ID",resultHeader:"Result",viewEvalRunResultTooltip:"View eval run result",passStatus:"Pass",failStatus:"Fail",passStatusCaps:"PASS",failStatusCaps:"FAIL",passedSuffix:"Passed",failedSuffix:"Failed",addSessionToSetButtonPrefix:"From Current Session",deleteEvalCaseTooltip:"Delete eval case",editEvalCaseTooltip:"Edit eval case",deleteEvalSetTooltip:"Delete eval set"},VtA=new kA("Eval Tab Messages",{factory:()=>d_A});function B_A(t,e){if(t&1){let A=QA();B(0,"mat-form-field",1)(1,"mat-label"),y(2,"Execution Mode"),Q(),B(3,"mat-select",6),U("selectionChange",function(n){T(A);let o=p();return J(o.executionMode=n.value)}),B(4,"mat-option",7),y(5,"Live"),Q(),B(6,"mat-option",8),y(7,"Replay"),Q()()()}if(t&2){let A=p();u(3),H("value",A.executionMode)}}var ov=class t{evalService=w(t0);featureFlagService=w(yr);data=w(qo);dialogRef=w(lo);newSetId=this.data.defaultName||"evalset_"+iv().slice(0,6);executionMode="live";isEvalV2Enabled=!1;constructor(){this.featureFlagService.isEvalV2Enabled().subscribe(e=>{this.isEvalV2Enabled=e})}createNewEvalSet(){if(!this.newSetId||this.newSetId=="")alert("Cannot create eval set with empty id!");else{let e=this.isEvalV2Enabled?this.executionMode:void 0;this.evalService.createNewEvalSet(this.data.appName,this.newSetId,e).subscribe(A=>{this.dialogRef.close(!0)})}}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-new-eval-set-dialog-component"]],decls:14,vars:2,consts:[["mat-dialog-title",""],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"],[3,"selectionChange","value"],["value","live"],["value","replay"]],template:function(A,i){A&1&&(B(0,"h2",0),y(1,"Create New Eval Set"),Q(),B(2,"mat-dialog-content"),y(3,` Please enter the eval set name +`),Q(),B(4,"mat-form-field",1)(5,"mat-label"),y(6,"Eval Set Name"),Q(),B(7,"input",2),Di("ngModelChange",function(o){return Bi(i.newSetId,o)||(i.newSetId=o),o}),U("keydown.enter",function(){return i.createNewEvalSet()}),Q()(),O(8,B_A,8,1,"mat-form-field",1),B(9,"mat-dialog-actions",3)(10,"button",4),y(11,"Cancel"),Q(),B(12,"button",5),U("click",function(){return i.createNewEvalSet()}),y(13,"Create"),Q()()),A&2&&(u(7),wi("ngModel",i.newSetId),u(),Y(i.isEvalV2Enabled?8:-1))},dependencies:[fa,Na,Ko,ua,ln,Dn,yn,ko,pa,pi,B2,$0,vs,Xl,Yr],styles:["h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important}"]})};var E_A=["knob"],h_A=["valueIndicatorContainer"];function Q_A(t,e){if(t&1&&(B(0,"div",2,1)(2,"div",5)(3,"span",6),y(4),Q()()()),t&2){let A=p();u(4),lA(A.valueIndicatorText)}}var u_A=["trackActive"],f_A=["*"];function p_A(t,e){if(t&1&&hA(0,"div"),t&2){let A=e.$implicit,i=e.$index,n=p(3);ro(A===0?"mdc-slider__tick-mark--active":"mdc-slider__tick-mark--inactive"),ut("transform",n._calcTickMarkTransform(i))}}function m_A(t,e){if(t&1&&Ue(0,p_A,1,4,"div",8,ws),t&2){let A=p(2);Te(A._tickMarks)}}function w_A(t,e){if(t&1&&(B(0,"div",6,1),O(2,m_A,2,0),Q()),t&2){let A=p();u(2),Y(A._cachedWidth?2:-1)}}function D_A(t,e){if(t&1&&hA(0,"mat-slider-visual-thumb",7),t&2){let A=p();H("discrete",A.discrete)("thumbPosition",1)("valueIndicatorText",A.startValueIndicatorText)}}var xi=(function(t){return t[t.START=1]="START",t[t.END=2]="END",t})(xi||{}),fQ=(function(t){return t[t.ACTIVE=0]="ACTIVE",t[t.INACTIVE=1]="INACTIVE",t})(fQ||{}),nF=new kA("_MatSlider"),WtA=new kA("_MatSliderThumb"),y_A=new kA("_MatSliderRangeThumb"),ZtA=new kA("_MatSliderVisualThumb");var v_A=(()=>{class t{_cdr=w(wt);_ngZone=w(qe);_slider=w(nF);_renderer=w(Pi);_listenerCleanups;discrete=!1;thumbPosition;valueIndicatorText;_ripple;_knob;_valueIndicatorContainer;_sliderInput;_sliderInputEl;_hoverRippleRef;_focusRippleRef;_activeRippleRef;_isHovered=!1;_isActive=!1;_isValueIndicatorVisible=!1;_hostElement=w(ce).nativeElement;_platform=w(gi);constructor(){}ngAfterViewInit(){let A=this._slider._getInput(this.thumbPosition);A&&(this._ripple.radius=24,this._sliderInput=A,this._sliderInputEl=this._sliderInput._hostElement,this._ngZone.runOutsideAngular(()=>{let i=this._sliderInputEl,n=this._renderer;this._listenerCleanups=[n.listen(i,"pointermove",this._onPointerMove),n.listen(i,"pointerdown",this._onDragStart),n.listen(i,"pointerup",this._onDragEnd),n.listen(i,"pointerleave",this._onMouseLeave),n.listen(i,"focus",this._onFocus),n.listen(i,"blur",this._onBlur)]}))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A())}_onPointerMove=A=>{if(this._sliderInput._isFocused)return;let i=this._hostElement.getBoundingClientRect(),n=this._slider._isCursorOnSliderThumb(A,i);this._isHovered=n,n?this._showHoverRipple():this._hideRipple(this._hoverRippleRef)};_onMouseLeave=()=>{this._isHovered=!1,this._hideRipple(this._hoverRippleRef)};_onFocus=()=>{this._hideRipple(this._hoverRippleRef),this._showFocusRipple(),this._hostElement.classList.add("mdc-slider__thumb--focused")};_onBlur=()=>{this._isActive||this._hideRipple(this._focusRippleRef),this._isHovered&&this._showHoverRipple(),this._hostElement.classList.remove("mdc-slider__thumb--focused")};_onDragStart=A=>{A.button===0&&(this._isActive=!0,this._showActiveRipple())};_onDragEnd=()=>{this._isActive=!1,this._hideRipple(this._activeRippleRef),this._sliderInput._isFocused||this._hideRipple(this._focusRippleRef),this._platform.SAFARI&&this._showHoverRipple()};_showHoverRipple(){this._isShowingRipple(this._hoverRippleRef)||(this._hoverRippleRef=this._showRipple({enterDuration:0,exitDuration:0}),this._hoverRippleRef?.element.classList.add("mat-mdc-slider-hover-ripple"))}_showFocusRipple(){this._isShowingRipple(this._focusRippleRef)||(this._focusRippleRef=this._showRipple({enterDuration:0,exitDuration:0},!0),this._focusRippleRef?.element.classList.add("mat-mdc-slider-focus-ripple"))}_showActiveRipple(){this._isShowingRipple(this._activeRippleRef)||(this._activeRippleRef=this._showRipple({enterDuration:225,exitDuration:400}),this._activeRippleRef?.element.classList.add("mat-mdc-slider-active-ripple"))}_isShowingRipple(A){return A?.state===ys.FADING_IN||A?.state===ys.VISIBLE}_showRipple(A,i){if(!this._slider.disabled&&(this._showValueIndicator(),this._slider._isRange&&this._slider._getThumb(this.thumbPosition===xi.START?xi.END:xi.START)._showValueIndicator(),!(this._slider._globalRippleOptions?.disabled&&!i)))return this._ripple.launch({animation:this._slider._noopAnimations?{enterDuration:0,exitDuration:0}:A,centered:!0,persistent:!0})}_hideRipple(A){if(A?.fadeOut(),this._isShowingAnyRipple())return;this._slider._isRange||this._hideValueIndicator();let i=this._getSibling();i._isShowingAnyRipple()||(this._hideValueIndicator(),i._hideValueIndicator())}_showValueIndicator(){this._hostElement.classList.add("mdc-slider__thumb--with-indicator")}_hideValueIndicator(){this._hostElement.classList.remove("mdc-slider__thumb--with-indicator")}_getSibling(){return this._slider._getThumb(this.thumbPosition===xi.START?xi.END:xi.START)}_getValueIndicatorContainer(){return this._valueIndicatorContainer?.nativeElement}_getKnob(){return this._knob.nativeElement}_isShowingAnyRipple(){return this._isShowingRipple(this._hoverRippleRef)||this._isShowingRipple(this._focusRippleRef)||this._isShowingRipple(this._activeRippleRef)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-slider-visual-thumb"]],viewQuery:function(i,n){if(i&1&&Jt(rs,5)(E_A,5)(h_A,5),i&2){let o;ae(o=re())&&(n._ripple=o.first),ae(o=re())&&(n._knob=o.first),ae(o=re())&&(n._valueIndicatorContainer=o.first)}},hostAttrs:[1,"mdc-slider__thumb","mat-mdc-slider-visual-thumb"],inputs:{discrete:"discrete",thumbPosition:"thumbPosition",valueIndicatorText:"valueIndicatorText"},features:[Bt([{provide:ZtA,useExisting:t}])],decls:4,vars:2,consts:[["knob",""],["valueIndicatorContainer",""],[1,"mdc-slider__value-indicator-container"],[1,"mdc-slider__thumb-knob"],["matRipple","",1,"mat-focus-indicator",3,"matRippleDisabled"],[1,"mdc-slider__value-indicator"],[1,"mdc-slider__value-indicator-text"]],template:function(i,n){i&1&&(O(0,Q_A,5,1,"div",2),hA(1,"div",3,0)(3,"div",4)),i&2&&(Y(n.discrete?0:-1),u(3),H("matRippleDisabled",!0))},dependencies:[rs],styles:[`.mat-mdc-slider-visual-thumb .mat-ripple{height:100%;width:100%}.mat-mdc-slider .mdc-slider__tick-marks{justify-content:start}.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--active,.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--inactive{position:absolute;left:2px} +`],encapsulation:2,changeDetection:0})}return t})(),XtA=(()=>{class t{_ngZone=w(qe);_cdr=w(wt);_elementRef=w(ce);_dir=w(fo,{optional:!0});_globalRippleOptions=w(r2,{optional:!0});_trackActive;_thumbs;_input;_inputs;get disabled(){return this._disabled}set disabled(A){this._disabled=A;let i=this._getInput(xi.END),n=this._getInput(xi.START);i&&(i.disabled=this._disabled),n&&(n.disabled=this._disabled)}_disabled=!1;get discrete(){return this._discrete}set discrete(A){this._discrete=A,this._updateValueIndicatorUIs()}_discrete=!1;get showTickMarks(){return this._showTickMarks}set showTickMarks(A){this._showTickMarks=A,this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI())}_showTickMarks=!1;get min(){return this._min}set min(A){let i=A==null||isNaN(A)?this._min:A;this._min!==i&&this._updateMin(i)}_min=0;color;disableRipple=!1;_updateMin(A){let i=this._min;this._min=A,this._isRange?this._updateMinRange({old:i,new:A}):this._updateMinNonRange(A),this._onMinMaxOrStepChange()}_updateMinRange(A){let i=this._getInput(xi.END),n=this._getInput(xi.START),o=i.value,a=n.value;n.min=A.new,i.min=Math.max(A.new,n.value),n.max=Math.min(i.max,i.value),n._updateWidthInactive(),i._updateWidthInactive(),A.newA.old?this._onTranslateXChangeBySideEffect(n,i):this._onTranslateXChangeBySideEffect(i,n),o!==i.value&&this._onValueChange(i),a!==n.value&&this._onValueChange(n)}_updateMaxNonRange(A){let i=this._getInput(xi.END);if(i){let n=i.value;i.max=A,i._updateThumbUIByValue(),this._updateTrackUI(i),n!==i.value&&this._onValueChange(i)}}get step(){return this._step}set step(A){let i=isNaN(A)?this._step:A;this._step!==i&&this._updateStep(i)}_step=1;_updateStep(A){this._step=A,this._isRange?this._updateStepRange():this._updateStepNonRange(),this._onMinMaxOrStepChange()}_updateStepRange(){let A=this._getInput(xi.END),i=this._getInput(xi.START),n=A.value,o=i.value,a=i.value;A.min=this._min,i.max=this._max,A.step=this._step,i.step=this._step,this._platform.SAFARI&&(A.value=A.value,i.value=i.value),A.min=Math.max(this._min,i.value),i.max=Math.min(this._max,A.value),i._updateWidthInactive(),A._updateWidthInactive(),A.value`${A}`;_tickMarks;_noopAnimations=An();_dirChangeSubscription;_resizeObserver=null;_cachedWidth;_cachedLeft;_rippleRadius=24;startValueIndicatorText="";endValueIndicatorText="";_endThumbTransform;_startThumbTransform;_isRange=!1;_isRtl=!1;_hasViewInitialized=!1;_tickMarkTrackWidth=0;_hasAnimation=!1;_resizeTimer=null;_platform=w(gi);constructor(){w(eo).load(lr),this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe(()=>this._onDirChange()),this._isRtl=this._dir.value==="rtl")}_knobRadius=8;_inputPadding;ngAfterViewInit(){this._platform.isBrowser&&this._updateDimensions();let A=this._getInput(xi.END),i=this._getInput(xi.START);this._isRange=!!A&&!!i,this._cdr.detectChanges();let n=this._getThumb(xi.END);this._rippleRadius=n._ripple.radius,this._inputPadding=this._rippleRadius-this._knobRadius,this._isRange?this._initUIRange(A,i):this._initUINonRange(A),this._updateTrackUI(A),this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._observeHostResize(),this._cdr.detectChanges()}_initUINonRange(A){A.initProps(),A.initUI(),this._updateValueIndicatorUI(A),this._hasViewInitialized=!0,A._updateThumbUIByValue()}_initUIRange(A,i){A.initProps(),A.initUI(),i.initProps(),i.initUI(),A._updateMinMax(),i._updateMinMax(),A._updateStaticStyles(),i._updateStaticStyles(),this._updateValueIndicatorUIs(),this._hasViewInitialized=!0,A._updateThumbUIByValue(),i._updateThumbUIByValue()}ngOnDestroy(){this._dirChangeSubscription?.unsubscribe(),this._resizeObserver?.disconnect(),this._resizeObserver=null}_onDirChange(){this._isRtl=this._dir?.value==="rtl",this._isRange?this._onDirChangeRange():this._onDirChangeNonRange(),this._updateTickMarkUI()}_onDirChangeRange(){let A=this._getInput(xi.END),i=this._getInput(xi.START);A._setIsLeftThumb(),i._setIsLeftThumb(),A.translateX=A._calcTranslateXByValue(),i.translateX=i._calcTranslateXByValue(),A._updateStaticStyles(),i._updateStaticStyles(),A._updateWidthInactive(),i._updateWidthInactive(),A._updateThumbUIByValue(),i._updateThumbUIByValue()}_onDirChangeNonRange(){this._getInput(xi.END)._updateThumbUIByValue()}_observeHostResize(){typeof ResizeObserver>"u"||!ResizeObserver||this._ngZone.runOutsideAngular(()=>{this._resizeObserver=new ResizeObserver(()=>{this._isActive()||(this._resizeTimer&&clearTimeout(this._resizeTimer),this._onResize())}),this._resizeObserver.observe(this._elementRef.nativeElement)})}_isActive(){return this._getThumb(xi.START)._isActive||this._getThumb(xi.END)._isActive}_getValue(A=xi.END){let i=this._getInput(A);return i?i.value:this.min}_skipUpdate(){return!!(this._getInput(xi.START)?._skipUIUpdate||this._getInput(xi.END)?._skipUIUpdate)}_updateDimensions(){this._cachedWidth=this._elementRef.nativeElement.offsetWidth,this._cachedLeft=this._elementRef.nativeElement.getBoundingClientRect().left}_setTrackActiveStyles(A){let i=this._trackActive.nativeElement.style;i.left=A.left,i.right=A.right,i.transformOrigin=A.transformOrigin,i.transform=A.transform}_calcTickMarkTransform(A){let i=A*(this._tickMarkTrackWidth/(this._tickMarks.length-1));return`translateX(${this._isRtl?this._cachedWidth-6-i:i}px)`}_onTranslateXChange(A){this._hasViewInitialized&&(this._updateThumbUI(A),this._updateTrackUI(A),this._updateOverlappingThumbUI(A))}_onTranslateXChangeBySideEffect(A,i){this._hasViewInitialized&&(A._updateThumbUIByValue(),i._updateThumbUIByValue())}_onValueChange(A){this._hasViewInitialized&&(this._updateValueIndicatorUI(A),this._updateTickMarkUI(),this._cdr.detectChanges())}_onMinMaxOrStepChange(){this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.markForCheck())}_onResize(){if(this._hasViewInitialized){if(this._updateDimensions(),this._isRange){let A=this._getInput(xi.END),i=this._getInput(xi.START);A._updateThumbUIByValue(),i._updateThumbUIByValue(),A._updateStaticStyles(),i._updateStaticStyles(),A._updateMinMax(),i._updateMinMax(),A._updateWidthInactive(),i._updateWidthInactive()}else{let A=this._getInput(xi.END);A&&A._updateThumbUIByValue()}this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.detectChanges()}}_thumbsOverlap=!1;_areThumbsOverlapping(){let A=this._getInput(xi.START),i=this._getInput(xi.END);return!A||!i?!1:i.translateX-A.translateX<20}_updateOverlappingThumbClassNames(A){let i=A.getSibling(),n=this._getThumb(A.thumbPosition);this._getThumb(i.thumbPosition)._hostElement.classList.remove("mdc-slider__thumb--top"),n._hostElement.classList.toggle("mdc-slider__thumb--top",this._thumbsOverlap)}_updateOverlappingThumbUI(A){!this._isRange||this._skipUpdate()||this._thumbsOverlap!==this._areThumbsOverlapping()&&(this._thumbsOverlap=!this._thumbsOverlap,this._updateOverlappingThumbClassNames(A))}_updateThumbUI(A){if(this._skipUpdate())return;let i=this._getThumb(A.thumbPosition===xi.END?xi.END:xi.START);i._hostElement.style.transform=`translateX(${A.translateX}px)`}_updateValueIndicatorUI(A){if(this._skipUpdate())return;let i=this.displayWith(A.value);if(this._hasViewInitialized?A._valuetext.set(i):A._hostElement.setAttribute("aria-valuetext",i),this.discrete){A.thumbPosition===xi.START?this.startValueIndicatorText=i:this.endValueIndicatorText=i;let n=this._getThumb(A.thumbPosition);i.length<3?n._hostElement.classList.add("mdc-slider__thumb--short-value"):n._hostElement.classList.remove("mdc-slider__thumb--short-value")}}_updateValueIndicatorUIs(){let A=this._getInput(xi.END),i=this._getInput(xi.START);A&&this._updateValueIndicatorUI(A),i&&this._updateValueIndicatorUI(i)}_updateTickMarkTrackUI(){if(!this.showTickMarks||this._skipUpdate())return;let A=this._step&&this._step>0?this._step:1,n=(Math.floor(this.max/A)*A-this.min)/(this.max-this.min);this._tickMarkTrackWidth=(this._cachedWidth-6)*n}_updateTrackUI(A){this._skipUpdate()||(this._isRange?this._updateTrackUIRange(A):this._updateTrackUINonRange(A))}_updateTrackUIRange(A){let i=A.getSibling();if(!i||!this._cachedWidth)return;let n=Math.abs(i.translateX-A.translateX)/this._cachedWidth;A._isLeftThumb&&this._cachedWidth?this._setTrackActiveStyles({left:"auto",right:`${this._cachedWidth-i.translateX}px`,transformOrigin:"right",transform:`scaleX(${n})`}):this._setTrackActiveStyles({left:`${i.translateX}px`,right:"auto",transformOrigin:"left",transform:`scaleX(${n})`})}_updateTrackUINonRange(A){this._isRtl?this._setTrackActiveStyles({left:"auto",right:"0px",transformOrigin:"right",transform:`scaleX(${1-A.fillPercentage})`}):this._setTrackActiveStyles({left:"0px",right:"auto",transformOrigin:"left",transform:`scaleX(${A.fillPercentage})`})}_updateTickMarkUI(){if(!this.showTickMarks||this.step===void 0||this.min===void 0||this.max===void 0)return;let A=this.step>0?this.step:1;this._isRange?this._updateTickMarkUIRange(A):this._updateTickMarkUINonRange(A)}_updateTickMarkUINonRange(A){let i=this._getValue(),n=Math.max(Math.round((i-this.min)/A),0)+1,o=Math.max(Math.round((this.max-i)/A),0)-1;this._isRtl?n++:o++,this._tickMarks=Array(n).fill(fQ.ACTIVE).concat(Array(o).fill(fQ.INACTIVE))}_updateTickMarkUIRange(A){let i=this._getValue(),n=this._getValue(xi.START),o=Math.max(Math.round((n-this.min)/A),0),a=Math.max(Math.round((i-n)/A)+1,0),r=Math.max(Math.round((this.max-i)/A),0);this._tickMarks=Array(o).fill(fQ.INACTIVE).concat(Array(a).fill(fQ.ACTIVE),Array(r).fill(fQ.INACTIVE))}_getInput(A){if(A===xi.END&&this._input)return this._input;if(this._inputs?.length)return A===xi.START?this._inputs.first:this._inputs.last}_getThumb(A){return A===xi.END?this._thumbs?.last:this._thumbs?.first}_setTransition(A){this._hasAnimation=!this._platform.IOS&&A&&!this._noopAnimations,this._elementRef.nativeElement.classList.toggle("mat-mdc-slider-with-animation",this._hasAnimation)}_isCursorOnSliderThumb(A,i){let n=i.width/2,o=i.x+n,a=i.y+n,r=A.clientX-o,s=A.clientY-a;return Math.pow(r,2)+Math.pow(s,2)oF),multi:!0};var oF=(()=>{class t{_ngZone=w(qe);_elementRef=w(ce);_cdr=w(wt);_slider=w(nF);_platform=w(gi);_listenerCleanups;get value(){return Cn(this._hostElement.value,0)}set value(A){A===null&&(A=this._getDefaultValue()),A=isNaN(A)?0:A;let i=A+"";if(!this._hasSetInitialValue){this._initialValue=i;return}this._isActive||this._setValue(i)}_setValue(A){this._hostElement.value=A,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges(),this._slider._cdr.markForCheck()}valueChange=new LA;dragStart=new LA;dragEnd=new LA;get translateX(){return this._slider.min>=this._slider.max?(this._translateX=this._tickMarkOffset,this._translateX):(this._translateX===void 0&&(this._translateX=this._calcTranslateXByValue()),this._translateX)}set translateX(A){this._translateX=A}_translateX;thumbPosition=xi.END;get min(){return Cn(this._hostElement.min,0)}set min(A){this._hostElement.min=A+"",this._cdr.detectChanges()}get max(){return Cn(this._hostElement.max,0)}set max(A){this._hostElement.max=A+"",this._cdr.detectChanges()}get step(){return Cn(this._hostElement.step,0)}set step(A){this._hostElement.step=A+"",this._cdr.detectChanges()}get disabled(){return Be(this._hostElement.disabled)}set disabled(A){this._hostElement.disabled=A,this._cdr.detectChanges(),this._slider.disabled!==this.disabled&&(this._slider.disabled=this.disabled)}get percentage(){return this._slider.min>=this._slider.max?this._slider._isRtl?1:0:(this.value-this._slider.min)/(this._slider.max-this._slider.min)}get fillPercentage(){return this._slider._cachedWidth?this._translateX===0?0:this.translateX/this._slider._cachedWidth:this._slider._isRtl?1:0}_hostElement=this._elementRef.nativeElement;_valuetext=bA("");_knobRadius=8;_tickMarkOffset=3;_isActive=!1;_isFocused=!1;_setIsFocused(A){this._isFocused=A}_hasSetInitialValue=!1;_initialValue;_formControl;_destroyed=new ie;_skipUIUpdate=!1;_onChangeFn;_onTouchedFn=()=>{};_isControlInitialized=!1;constructor(){let A=w(Pi);this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[A.listen(this._hostElement,"pointerdown",this._onPointerDown.bind(this)),A.listen(this._hostElement,"pointermove",this._onPointerMove.bind(this)),A.listen(this._hostElement,"pointerup",this._onPointerUp.bind(this))]})}ngOnDestroy(){this._listenerCleanups.forEach(A=>A()),this._destroyed.next(),this._destroyed.complete(),this.dragStart.complete(),this.dragEnd.complete()}initProps(){this._updateWidthInactive(),this.disabled!==this._slider.disabled&&(this._slider.disabled=!0),this.step=this._slider.step,this.min=this._slider.min,this.max=this._slider.max,this._initValue()}initUI(){this._updateThumbUIByValue()}_initValue(){this._hasSetInitialValue=!0,this._initialValue===void 0?this.value=this._getDefaultValue():(this._hostElement.value=this._initialValue,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges())}_getDefaultValue(){return this.min}_onBlur(){this._setIsFocused(!1),this._onTouchedFn()}_onFocus(){this._slider._setTransition(!1),this._slider._updateTrackUI(this),this._setIsFocused(!0)}_onChange(){this.valueChange.emit(this.value),this._isActive&&this._updateThumbUIByValue({withAnimation:!0})}_onInput(){this._onChangeFn?.(this.value),(this._slider.step||!this._isActive)&&this._updateThumbUIByValue({withAnimation:!0}),this._slider._onValueChange(this)}_onNgControlValueChange(){(!this._isActive||!this._isFocused)&&(this._slider._onValueChange(this),this._updateThumbUIByValue()),this._slider.disabled=this._formControl.disabled}_onPointerDown(A){if(!(this.disabled||A.button!==0)){if(this._platform.IOS){let i=this._slider._isCursorOnSliderThumb(A,this._slider._getThumb(this.thumbPosition)._hostElement.getBoundingClientRect());this._isActive=i,this._updateWidthActive(),this._slider._updateDimensions();return}this._isActive=!0,this._setIsFocused(!0),this._updateWidthActive(),this._slider._updateDimensions(),this._slider.step||this._updateThumbUIByPointerEvent(A,{withAnimation:!0}),this.disabled||(this._handleValueCorrection(A),this.dragStart.emit({source:this,parent:this._slider,value:this.value}))}}_handleValueCorrection(A){this._skipUIUpdate=!0,setTimeout(()=>{this._skipUIUpdate=!1,this._fixValue(A)},0)}_fixValue(A){let i=A.clientX-this._slider._cachedLeft,n=this._slider._cachedWidth,o=this._slider.step===0?1:this._slider.step,a=Math.floor((this._slider.max-this._slider.min)/o),r=this._slider._isRtl?1-i/n:i/n,l=Math.round(r*a)/a*(this._slider.max-this._slider.min)+this._slider.min,g=Math.round(l/o)*o,C=this.value;if(g===C){this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation});return}this.value=g,this.valueChange.emit(this.value),this._onChangeFn?.(this.value),this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation})}_onPointerMove(A){!this._slider.step&&this._isActive&&this._updateThumbUIByPointerEvent(A)}_onPointerUp(){this._isActive&&(this._isActive=!1,this._platform.SAFARI&&this._setIsFocused(!1),this.dragEnd.emit({source:this,parent:this._slider,value:this.value}),setTimeout(()=>this._updateWidthInactive(),this._platform.IOS?10:0))}_clamp(A){let i=this._tickMarkOffset,n=this._slider._cachedWidth-this._tickMarkOffset;return Math.max(Math.min(A,n),i)}_calcTranslateXByValue(){return this._slider._isRtl?(1-this.percentage)*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset:this.percentage*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset}_calcTranslateXByPointerEvent(A){return A.clientX-this._slider._cachedLeft}_updateWidthActive(){}_updateWidthInactive(){this._hostElement.style.padding=`0 ${this._slider._inputPadding}px`,this._hostElement.style.width=`calc(100% + ${this._slider._inputPadding-this._tickMarkOffset*2}px)`,this._hostElement.style.left=`-${this._slider._rippleRadius-this._tickMarkOffset}px`}_updateThumbUIByValue(A){this.translateX=this._clamp(this._calcTranslateXByValue()),this._updateThumbUI(A)}_updateThumbUIByPointerEvent(A,i){this.translateX=this._clamp(this._calcTranslateXByPointerEvent(A)),this._updateThumbUI(i)}_updateThumbUI(A){this._slider._setTransition(!!A?.withAnimation),this._slider._onTranslateXChange(this)}writeValue(A){(this._isControlInitialized||A!==null)&&(this.value=A)}registerOnChange(A){this._onChangeFn=A,this._isControlInitialized=!0}registerOnTouched(A){this._onTouchedFn=A}setDisabledState(A){this.disabled=A}focus(){this._hostElement.focus()}blur(){this._hostElement.blur()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["input","matSliderThumb",""]],hostAttrs:["type","range",1,"mdc-slider__input"],hostVars:1,hostBindings:function(i,n){i&1&&U("change",function(){return n._onChange()})("input",function(){return n._onInput()})("blur",function(){return n._onBlur()})("focus",function(){return n._onFocus()}),i&2&&te("aria-valuetext",n._valuetext())},inputs:{value:[2,"value","value",Cn]},outputs:{valueChange:"valueChange",dragStart:"dragStart",dragEnd:"dragEnd"},exportAs:["matSliderThumb"],features:[Bt([b_A,{provide:WtA,useExisting:t}])]})}return t})();var JI=class t{transform(e){if(!e)return"";let A=e.replace(/(_avg_score|_score|avg_score)$/,"");return A=A.replace(/_/g," "),A.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" ")}static \u0275fac=function(A){return new(A||t)};static \u0275pipe=Xv({name:"formatMetricName",type:t,pure:!0})};function M_A(t,e){if(t&1&&(B(0,"div",9)(1,"div",10)(2,"mat-checkbox",11)(3,"div",12)(4,"span",13),y(5),Ht(6,"formatMetricName"),Q(),B(7,"span",14),y(8),Q()()(),B(9,"div",15)(10,"div",16)(11,"span",17),y(12,"Threshold"),Q(),B(13,"div",18)(14,"mat-slider",19),hA(15,"input",20),Q(),B(16,"span",21),y(17),Q()()()()()()),t&2){let A,i=e.$implicit,n=p(2);u(2),H("formControlName",i.metricName+"_selected"),u(2),H("matTooltip",i.metricName),u(),lA(si(6,10,i.metricName)),u(3),lA(i.description),u(),ut("visibility",(A=n.evalForm.get(i.metricName+"_selected"))!=null&&A.value?"visible":"hidden"),u(5),H("min",i.metricValueInfo.interval.minValue)("max",i.metricValueInfo.interval.maxValue),u(),H("formControlName",i.metricName+"_threshold"),u(2),ue(" ",n.evalForm.controls[i.metricName+"_threshold"].value," ")}}function S_A(t,e){if(t&1&&(B(0,"div"),Et(1,M_A,18,12,"div",8),Q()),t&2){let A=p();u(),H("ngForOf",A.metricsInfo)}}function k_A(t,e){if(t&1&&(B(0,"div")(1,"div",9)(2,"div",10)(3,"mat-checkbox",22)(4,"span",13),y(5),Ht(6,"formatMetricName"),Q()(),B(7,"div",15)(8,"div",16)(9,"span",17),y(10,"Threshold"),Q(),B(11,"div",18)(12,"mat-slider",23),hA(13,"input",24),Q(),B(14,"span",21),y(15),Q()()()()()(),B(16,"div",9)(17,"div",10)(18,"mat-checkbox",25)(19,"span",13),y(20),Ht(21,"formatMetricName"),Q()(),B(22,"div",15)(23,"div",16)(24,"span",17),y(25,"Threshold"),Q(),B(26,"div",18)(27,"mat-slider",23),hA(28,"input",26),Q(),B(29,"span",21),y(30),Q()()()()()()()),t&2){let A,i,n=p();u(4),H("matTooltip","tool_trajectory_avg_score"),u(),lA(si(6,10,"tool_trajectory_avg_score")),u(2),ut("visibility",(A=n.evalForm.get("tool_trajectory_avg_score_selected"))!=null&&A.value?"visible":"hidden"),u(8),ue(" ",n.evalForm.controls.tool_trajectory_avg_score_threshold.value," "),u(4),H("matTooltip","response_match_score"),u(),lA(si(21,12,"response_match_score")),u(2),ut("visibility",(i=n.evalForm.get("response_match_score_selected"))!=null&&i.value?"visible":"hidden"),u(8),ue(" ",n.evalForm.controls.response_match_score_threshold.value," ")}}var av=class t{constructor(e,A,i){this.dialogRef=e;this.fb=A;this.data=i;this.evalMetrics=this.data.evalMetrics||[],this.metricsInfo=this.data.metricsInfo||[],this.evalForm=this.fb.group({}),this.metricsInfo.forEach(n=>{let o=this.evalMetrics.find(l=>l.metricName===n.metricName),a=!!o,r=o?o.threshold:this.getDefaultThreshold(n);this.evalForm.addControl(`${n.metricName}_selected`,this.fb.control(a));let s=n.metricValueInfo.interval;this.evalForm.addControl(`${n.metricName}_threshold`,this.fb.control(r,[Ys.required,Ys.min(s.minValue),Ys.max(s.maxValue)]))}),this.metricsInfo.length===0&&this.addDefaultControls()}evalForm;evalMetrics=[];metricsInfo=[];addDefaultControls(){[{name:"tool_trajectory_avg_score",min:0,max:1,default:1},{name:"response_match_score",min:0,max:1,default:.7}].forEach(A=>{let i=this.evalMetrics.find(a=>a.metricName===A.name),n=!!i,o=i?i.threshold:A.default;this.evalForm.addControl(`${A.name}_selected`,this.fb.control(n)),this.evalForm.addControl(`${A.name}_threshold`,this.fb.control(o,[Ys.required,Ys.min(A.min),Ys.max(A.max)]))})}getDefaultThreshold(e){return e.metricName==="tool_trajectory_avg_score"?1:e.metricName==="response_match_score"?.7:e.metricValueInfo.interval.maxValue}onReset(){this.metricsInfo.forEach(e=>{let A=uQ.find(o=>o.metricName===e.metricName),i=!!A,n=A?A.threshold:this.getDefaultThreshold(e);this.evalForm.get(`${e.metricName}_selected`)?.setValue(i),this.evalForm.get(`${e.metricName}_threshold`)?.setValue(n)}),this.metricsInfo.length===0&&uQ.forEach(e=>{this.evalForm.get(`${e.metricName}_selected`)?.setValue(!0),this.evalForm.get(`${e.metricName}_threshold`)?.setValue(e.threshold)})}onStart(){if(this.evalForm.valid){let e=[];this.metricsInfo.length>0?this.metricsInfo.forEach(A=>{if(this.evalForm.get(`${A.metricName}_selected`)?.value){let n=this.evalForm.get(`${A.metricName}_threshold`)?.value;e.push({metricName:A.metricName,threshold:n})}}):["tool_trajectory_avg_score","response_match_score"].forEach(i=>{if(this.evalForm.get(`${i}_selected`)?.value){let o=this.evalForm.get(`${i}_threshold`)?.value;e.push({metricName:i,threshold:o})}}),this.dialogRef.close(e)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(YL),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-run-eval-config-dialog"]],decls:14,vars:3,consts:[[1,"dialog-container"],["mat-dialog-title","",1,"dialog-title"],[1,"eval-form",3,"formGroup"],[4,"ngIf"],["align","end",1,"dialog-actions"],["mat-button","",1,"reset-button",3,"click"],["mat-button","",1,"cancel-button",3,"click"],["mat-button","",1,"save-button",3,"click"],["class","metric-container",4,"ngFor","ngForOf"],[1,"metric-container"],[1,"metric-header"],[3,"formControlName"],[2,"display","flex","flex-direction","column"],[1,"metric-title",3,"matTooltip"],[1,"metric-description"],[1,"metric-slider-container","inline-slider"],[2,"display","flex","flex-direction","column","align-items","flex-start"],[1,"slider-label",2,"margin-right","0","font-size","11px","color","var(--mat-sys-on-surface-variant)"],[2,"display","flex","align-items","center"],["step","0.1","thumbLabel","",1,"threshold-slider",3,"min","max"],["matSliderThumb","",3,"formControlName"],[1,"threshold-value"],["formControlName","tool_trajectory_avg_score_selected"],["min","0","max","1","step","0.1","thumbLabel","",1,"threshold-slider"],["matSliderThumb","","formControlName","tool_trajectory_avg_score_threshold"],["formControlName","response_match_score_selected"],["matSliderThumb","","formControlName","response_match_score_threshold"]],template:function(A,i){A&1&&(B(0,"div",0)(1,"h2",1),y(2,"EVALUATION METRICS"),Q(),B(3,"mat-dialog-content")(4,"form",2),Et(5,S_A,2,1,"div",3)(6,k_A,31,14,"div",3),Q()(),B(7,"mat-dialog-actions",4)(8,"button",5),U("click",function(){return i.onReset()}),y(9,"Reset to Default"),Q(),B(10,"button",6),U("click",function(){return i.onCancel()}),y(11,"Cancel"),Q(),B(12,"button",7),U("click",function(){return i.onStart()}),y(13,"Start"),Q()()()),A&2&&(u(4),H("formGroup",i.evalForm),u(),H("ngIf",i.metricsInfo.length>0),u(),H("ngIf",i.metricsInfo.length===0))},dependencies:[fa,Na,ln,JL,Dn,yn,NL,n2,i2,Qb,XtA,oF,pa,pi,ec,li,A2,Js,dn,JI],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:12px;width:680px;box-shadow:0 8px 16px var(--run-eval-config-dialog-container-box-shadow-color)}.metric-container[_ngcontent-%COMP%]{margin-bottom:6px;padding-bottom:4px;border-bottom:1px solid var(--run-eval-config-dialog-border-color, #e0e0e0)}.metric-container[_ngcontent-%COMP%]:last-child{border-bottom:none}.metric-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;margin-bottom:2px}.metric-title[_ngcontent-%COMP%]{font-weight:600;font-size:1em}.metric-description[_ngcontent-%COMP%]{font-size:.85em;color:var(--run-eval-config-dialog-description-color, #666);margin-top:2px;white-space:normal}.metric-slider-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-left:28px}.inline-slider[_ngcontent-%COMP%]{margin-left:20px;flex:1;display:flex;justify-content:flex-end;align-items:center}.slider-label[_ngcontent-%COMP%]{margin-right:10px;font-size:.9em}.threshold-slider[_ngcontent-%COMP%]{max-width:80px;flex:1}.threshold-value[_ngcontent-%COMP%]{margin-left:10px;min-width:30px;text-align:right}h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}"]})};var kc=class t{constructor(e,A){this.dialogRef=e;this.data=A}onConfirm(){this.dialogRef.close(!0)}onCancel(){this.dialogRef.close(!1)}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-delete-session-dialog"]],decls:11,vars:4,consts:[[1,"confirm-delete-wrapper"],["mat-dialog-title",""],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(B(0,"div",0)(1,"h2",1),y(2),Q(),B(3,"mat-dialog-content")(4,"p"),y(5),Q()(),B(6,"mat-dialog-actions",2)(7,"button",3),U("click",function(){return i.onCancel()}),y(8),Q(),B(9,"button",4),U("click",function(){return i.onConfirm()}),y(10),Q()()()),A&2&&(u(2),lA(i.data.title),u(3),lA(i.data.message),u(3),lA(i.data.cancelButtonText),u(2),lA(i.data.confirmButtonText))},dependencies:[fa,Na,pa,pi],encapsulation:2})};var x_A=["app-info-table",""],__A=["*"];function R_A(t,e){if(t&1&&(wn(0,"thead")(1,"tr")(2,"th",2),y(3),Gn()()()),t&2){let A=p();u(3),lA(A.title())}}var OI=class t{title=me();static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["table","app-info-table",""]],hostAttrs:[1,"info-table"],inputs:{title:[1,"title"]},attrs:x_A,ngContentSelectors:__A,decls:6,vars:1,consts:[[1,"label-col"],[1,"value-col"],["colspan","2"]],template:function(A,i){A&1&&(Rt(),wn(0,"colgroup"),Kn(1,"col",0)(2,"col",1),Gn(),O(3,R_A,4,1,"thead"),wn(4,"tbody"),Ve(5),Gn()),A&2&&(u(3),Y(i.title()?3:-1))},styles:["[_nghost-%COMP%]{display:table;width:100%;border-collapse:separate;border-spacing:0;font-family:inherit;font-size:13px;background-color:var(--mat-sys-surface);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;overflow:hidden;table-layout:fixed}[_nghost-%COMP%] thead[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-low)}[_nghost-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{text-align:left;padding:12px 16px;font-weight:500;color:var(--mat-sys-on-surface);border-bottom:1px solid var(--mat-sys-outline-variant)}[_nghost-%COMP%] .label-col[_ngcontent-%COMP%]{width:30%}[_nghost-%COMP%] tbody tr td{padding:10px 16px;color:var(--mat-sys-on-surface-variant);border-bottom:1px solid var(--mat-sys-outline-variant);overflow:hidden;overflow-wrap:anywhere}[_nghost-%COMP%] tbody tr td:first-child{font-weight:500;color:var(--mat-sys-on-surface);background-color:var(--mat-sys-surface-container-lowest);border-right:1px solid var(--mat-sys-outline-variant)}[_nghost-%COMP%] tbody tr:last-child td{border-bottom:none}"]})};var $tA=(t,e)=>e.timestamp,N_A=(t,e)=>e.evalId;function F_A(t,e){t&1&&(B(0,"span",3),y(1,"Eval Sets"),Q())}function L_A(t,e){if(t&1){let A=QA();B(0,"span",9),U("click",function(){T(A);let n=p(2);return J(n.goToEvalSet())}),y(1),Q()}if(t&2){let A=p(2);u(),lA(A.selectedEvalSet())}}function G_A(t,e){if(t&1&&(B(0,"span",8),y(1),Q()),t&2){let A=p(2);u(),lA(A.selectedEvalSet())}}function K_A(t,e){if(t&1&&(B(0,"span",6),y(1,">"),Q(),O(2,L_A,2,1,"span",7)(3,G_A,2,1,"span",8)),t&2){let A=p();u(2),Y(A.selectedEvalTab()==="history"||A.selectedHistoryRun()||A.selectedEvalCase()?2:3)}}function U_A(t,e){t&1&&(B(0,"span",6),y(1,">"),Q(),B(2,"span",10),y(3,"Eval Cases"),Q())}function T_A(t,e){t&1&&(B(0,"span",6),y(1,">"),Q(),B(2,"span",11),y(3,"Runs"),Q())}function J_A(t,e){if(t&1&&(B(0,"span",6),y(1,">"),Q(),B(2,"span",12),y(3),Q()),t&2){let A=p();u(3),lA(A.formatTimestamp(A.selectedHistoryRun()))}}function O_A(t,e){if(t&1&&(B(0,"span",6),y(1,">"),Q(),B(2,"span",13),y(3),Q()),t&2){let A,i=p();u(3),lA((A=i.selectedEvalCase())==null?null:A.evalId)}}function Y_A(t,e){if(t&1){let A=QA();B(0,"button",14),U("click",function(){T(A);let n=p();return J(n.openNewEvalSetDialog())}),B(1,"mat-icon"),y(2,"add"),Q(),y(3," New "),Q(),B(4,"button",15),U("click",function(){T(A);let n=p();return J(n.getEvalSet())}),B(5,"mat-icon"),y(6,"refresh"),Q()()}if(t&2){let A=p();H("matTooltip",A.i18n.createNewEvalSetTooltip)}}function H_A(t,e){}function z_A(t,e){if(t&1){let A=QA();B(0,"div")(1,"div",16)(2,"div",17),y(3),Q(),B(4,"div",18),y(5),Q(),B(6,"div",19),U("click",function(){T(A);let n=p();return J(n.openNewEvalSetDialog())}),y(7),Q()()()}if(t&2){let A=p();u(3),ue(" ",A.i18n.createNewEvalSetTitle," "),u(2),ue(" ",A.i18n.evalSetDescription," "),u(2),ue(" ",A.i18n.createEvalSetButton," ")}}function P_A(t,e){if(t&1){let A=QA();B(0,"div",21),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.selectEvalSet(n))}),B(1,"div",22)(2,"span",23),y(3,"folder"),Q(),B(4,"div",24),y(5),Q()(),B(6,"div",25)(7,"button",26),U("click",function(n){let o=T(A).$implicit,a=p(2);return J(a.confirmDeleteEvalSet(n,o))}),B(8,"mat-icon"),y(9,"delete"),Q()()()()}if(t&2){let A=e.$implicit,i=p(2);u(5),lA(A),u(2),H("matTooltip",i.i18n.deleteEvalSetTooltip)}}function j_A(t,e){if(t&1&&(B(0,"div"),Ue(1,P_A,10,2,"div",20,ri),Q()),t&2){let A=p();u(),Te(A.evalsets)}}function q_A(t,e){t&1&&(B(0,"div",33),hA(1,"mat-progress-spinner",34),Q()),t&2&&(u(),H("diameter",28)("strokeWidth",3))}function V_A(t,e){if(t&1&&(B(0,"tr")(1,"td"),y(2,"Execution Mode"),Q(),B(3,"td")(4,"span",37),y(5),Q()()()),t&2){let A,i,n=p(4);u(4),H("matTooltip",((A=n.currentEvalSet())==null?null:A.model_execution_mode)||"N/A"),u(),lA(((i=n.currentEvalSet())==null?null:i.model_execution_mode)||"N/A")}}function W_A(t,e){if(t&1&&(B(0,"div",35)(1,"table",36)(2,"tr")(3,"td"),y(4,"Name"),Q(),B(5,"td")(6,"span",37),y(7),Q()()(),O(8,V_A,6,2,"tr"),B(9,"tr")(10,"td"),y(11,"Total Cases"),Q(),B(12,"td")(13,"span",37),y(14),Q()()(),B(15,"tr")(16,"td"),y(17,"Total Runs"),Q(),B(18,"td")(19,"span",37),y(20),Q()()()()()),t&2){let A=p(3);u(6),H("matTooltip",A.selectedEvalSet()),u(),lA(A.selectedEvalSet()),u(),Y(A.isEvalV2Enabled()?8:-1),u(5),H("matTooltip",A.evalCases.length.toString()),u(),lA(A.evalCases.length),u(5),H("matTooltip",A.getEvalHistoryOfCurrentSetSorted().length.toString()),u(),lA(A.getEvalHistoryOfCurrentSetSorted().length)}}function Z_A(t,e){if(t&1){let A=QA();B(0,"div",45),U("click",function(){let n=T(A).$implicit,o=p(6);return J(o.getEvalCase(n))}),B(1,"mat-checkbox",46),U("click",function(n){return n.stopPropagation()})("change",function(n){let o=T(A).$implicit,a=p(6);return J(n?a.selection.toggle(o):null)}),Q(),B(2,"div",47),y(3),Q(),B(4,"button",48),U("click",function(n){let o=T(A).$implicit,a=p(6);return J(a.requestEditEvalCase(n,o))}),B(5,"mat-icon"),y(6,"edit"),Q()(),B(7,"button",26),U("click",function(n){let o=T(A).$implicit,a=p(6);return J(a.confirmDeleteEvalCase(n,o))}),B(8,"mat-icon"),y(9,"delete"),Q()()()}if(t&2){let A,i=e.$implicit,n=p(6);RA("selected-row",i===((A=n.selectedEvalCase())==null?null:A.evalId)),u(),H("checked",n.selection.isSelected(i)),u(2),ue(" ",i," "),u(),H("matTooltip",n.i18n.editEvalCaseTooltip),u(3),H("matTooltip",n.i18n.deleteEvalCaseTooltip)}}function X_A(t,e){if(t&1&&(B(0,"div",43),Ue(1,Z_A,10,6,"div",44,ri),Q()),t&2){let A=p(5);u(),Te(A.evalCases)}}function $_A(t,e){if(t&1){let A=QA();B(0,"div",39)(1,"mat-checkbox",40),U("change",function(n){T(A);let o=p(4);return J(n?o.toggleAllRows():null)}),Q(),B(2,"button",41),U("click",function(){T(A);let n=p(4);return J(n.openEvalConfigDialog())}),B(3,"mat-icon"),y(4,"play_arrow"),Q(),y(5),Q(),B(6,"button",42),U("click",function(){T(A);let n=p(4);return J(n.openNewEvalCaseDialog())}),B(7,"mat-icon"),y(8,"add"),Q(),y(9),Q(),hA(10,"span",4),B(11,"button",15),U("click",function(){T(A);let n=p(4);return J(n.listEvalCases())}),B(12,"mat-icon"),y(13,"refresh"),Q()()(),O(14,X_A,3,0,"div",43)}if(t&2){let A=p(4);u(),H("checked",A.selection.hasValue()&&A.isAllSelected())("indeterminate",A.selection.hasValue()&&!A.isAllSelected()),u(),H("disabled",A.evalCases.length==0),u(3),ue(" ",A.isAllSelected()||A.selection.isEmpty()?A.i18n.runEvaluationButton:A.i18n.runSelectedEvaluationButton," "),u(4),ue(" ",A.i18n.addSessionToSetButtonPrefix," "),u(5),Y(A.evalCases.length>0?14:-1)}}function ARA(t,e){if(t&1){let A=QA();B(0,"div",54),U("click",function(){let n=T(A).$implicit,o=p(5);return J(o.getHistorySession(n.result,n.timestamp))}),B(1,"div",47),y(2),Q(),hA(3,"div",4),B(4,"div",55)(5,"span",56),y(6),Q()()()}if(t&2){let A=e.$implicit,i=e.$index;p();let n=zn(7),o=p(4);RA("selected-row",A.timestamp==o.selectedHistoryRun()),u(2),ba(" #",n.length-i," ",o.formatTimestamp(A.timestamp)," "),u(3),H("ngClass",o.isMetricsSucceed(A.result)?"status-card__passed":"status-card__failed"),u(),ue(" ",o.getMetricsScore(A.result)," ")}}function eRA(t,e){t&1&&(B(0,"div",53),y(1," No runs found for this case. "),Q())}function tRA(t,e){if(t&1&&(B(0,"div",38)(1,"div",49)(2,"h3",50),y(3),Q()(),B(4,"h4",51),y(5,"Past Runs"),Q(),B(6,"div",43),ta(7),Ue(8,ARA,7,6,"div",52,$tA),O(10,eRA,2,0,"div",53),Q()()),t&2){let A=p(4),i=A.selectedEvalCase();u(3),ue("Case: ",i.evalId),u(4);let n=ga(A.caseHistory());u(),Te(n),u(2),Y(n.length===0?10:-1)}}function iRA(t,e){t&1&&(B(0,"div",16)(1,"div",17),y(2,"No Eval Cases"),Q(),B(3,"div",18),y(4,"Add a session to this set to get started."),Q()())}function nRA(t,e){if(t&1&&(B(0,"div"),O(1,$_A,15,6)(2,tRA,11,3,"div",38),O(3,iRA,5,0,"div",16),Q()),t&2){let A=p(3);u(),Y(A.selectedEvalCase()?2:1),u(2),Y(A.evalCases.length===0?3:-1)}}function oRA(t,e){t&1&&(B(0,"div",16)(1,"div",17),y(2,"No Runs"),Q(),B(3,"div",18),y(4,"Run an evaluation to see results here."),Q()())}function aRA(t,e){if(t&1){let A=QA();B(0,"div",45),U("click",function(){let n=T(A).$implicit,o=p(6);return J(o.selectedHistoryRun.set(n.timestamp))}),B(1,"div",47),y(2),Q(),hA(3,"div",4),B(4,"div",59)(5,"span",60),y(6),Q(),B(7,"span",61),y(8,"|"),Q(),B(9,"span",62),y(10),Q()()()}if(t&2){let A=e.$implicit,i=e.$index;p(3);let n=zn(0),o=p(3);u(2),ba(" #",n.length-i," ",o.formatTimestamp(A.timestamp)," "),u(4),ba("",o.getPassCountForCurrentResult(A.evaluationResults.evaluationResults)," ",o.i18n.passStatusCaps),u(3),ut("color",o.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)===0?"gray":""),u(),ba("",o.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)," ",o.i18n.failStatusCaps)}}function rRA(t,e){if(t&1&&(B(0,"div",43),Ue(1,aRA,11,8,"div",58,$tA),Q()),t&2){p(2);let A=zn(0);u(),Te(A)}}function sRA(t,e){if(t&1&&(B(0,"span",61),y(1,"|"),Q(),B(2,"span",62),y(3),Q()),t&2){p(2);let A=zn(1),i=p(5);u(3),ba("",i.getFailCountForCurrentResult(A.evaluationResults)," ",i.i18n.failStatusCaps)}}function lRA(t,e){if(t&1&&(B(0,"span",69)(1,"span",70),y(2),Ht(3,"formatMetricName"),Q(),y(4,": "),B(5,"span",71),y(6),Ht(7,"number"),Q()()),t&2){let A=e.$implicit;u(),H("matTooltip",A.metricName),u(),lA(si(3,3,A.metricName)),u(4),lA(T0(7,5,A.threshold,"1.2-2"))}}function gRA(t,e){if(t&1&&(B(0,"div",66),Ue(1,lRA,8,8,"span",69,ri),Q()),t&2){let A=p(7);u(),Te(A.currentHistoryMetrics())}}function cRA(t,e){if(t&1){let A=QA();B(0,"div",72),U("click",function(){let n=T(A).$implicit;p(2);let o=zn(0),a=p(5);return J(a.getHistorySession(n,o))}),B(1,"span"),y(2),Q(),B(3,"span",73),y(4),Q()()}if(t&2){let A=e.$implicit,i=p(7);u(2),ue(" ",A.evalId," "),u(),H("ngClass",i.isMetricsSucceed(A)?"status-card__passed":"status-card__failed"),u(),ue(" ",i.getMetricsScore(A)," ")}}function CRA(t,e){if(t&1&&(B(0,"div",63)(1,"div",64)(2,"div",65)(3,"div",59)(4,"span",60),y(5),Q(),O(6,sRA,4,2),Q(),O(7,gRA,3,0,"div",66),Q()()(),B(8,"div",67),Ue(9,cRA,5,3,"div",68,N_A),Q()),t&2){p();let A=zn(1),i=p(5);u(5),ba("",i.getPassCountForCurrentResult(A.evaluationResults)," ",i.i18n.passStatusCaps),u(),Y(i.getFailCountForCurrentResult(A.evaluationResults)>0?6:-1),u(),Y(i.currentHistoryMetrics().length>0?7:-1),u(2),Te(A.evaluationResults)}}function IRA(t,e){if(t&1&&(ta(0)(1),O(2,CRA,11,4)),t&2){let A=p(5),i=ga(A.selectedHistoryRun());u();let n=ga(A.getEvalHistoryOfCurrentSet()[i]);u(),Y(n?2:-1)}}function dRA(t,e){if(t&1&&(B(0,"div",57),O(1,rRA,3,0,"div",43)(2,IRA,3,3),Q()),t&2){let A=p(4);u(),Y(A.selectedHistoryRun()?2:1)}}function BRA(t,e){if(t&1&&(ta(0),O(1,oRA,5,0,"div",16)(2,dRA,3,1,"div",57)),t&2){let A=ga(p(3).evalHistorySorted());u(),Y(A.length===0?1:2)}}function ERA(t,e){if(t&1&&(O(0,W_A,21,7,"div",35),O(1,nRA,4,2,"div"),O(2,BRA,3,2)),t&2){let A=p(2);Y(A.selectedEvalTab()==="info"?0:-1),u(),Y(A.selectedEvalTab()==="cases"?1:-1),u(),Y(A.selectedEvalTab()==="history"?2:-1)}}function hRA(t,e){if(t&1){let A=QA();B(0,"div",5)(1,"div",27)(2,"div",28)(3,"button",29),U("click",function(){T(A);let n=p();return n.selectedEvalTab.set("info"),n.selectedEvalCase.set(null),J(n.selectedHistoryRun.set(null))}),B(4,"mat-icon"),y(5,"info"),Q()(),B(6,"button",30),U("click",function(){T(A);let n=p();return n.selectedEvalTab.set("cases"),n.selectedEvalCase.set(null),J(n.selectedHistoryRun.set(null))}),B(7,"mat-icon"),y(8,"list"),Q()(),B(9,"button",31),U("click",function(){T(A);let n=p();return n.selectedEvalTab.set("history"),n.selectedEvalCase.set(null),n.selectedHistoryRun.set(null),J(n.getEvaluationResult())}),B(10,"mat-icon"),y(11,"history"),Q()()(),B(12,"div",32),O(13,q_A,2,2,"div",33)(14,ERA,3,3),Q()()()}if(t&2){let A=p();u(3),RA("active",A.selectedEvalTab()==="info"),u(3),RA("active",A.selectedEvalTab()==="cases"),u(3),RA("active",A.selectedEvalTab()==="history"),u(4),Y(A.evalRunning()?13:14)}}var rv=new kA("EVAL_TAB_COMPONENT"),xc=class t{checkboxes=XF(ec);appName=me("");userId=me("");sessionId=me("");sessionSelected=ui();shouldShowTab=ui();evalNotInstalledMsg=ui();evalCaseSelected=ui();evalSetIdSelected=ui();shouldReturnToSession=ui();editEvalCaseRequested=ui();evalCasesSubject=new ei([]);changeDetectorRef=w(wt);flagService=w(yr);i18n=w(VtA);displayedColumns=["select","evalId"];evalsets=[];selectedEvalSet=bA("");currentEvalSet=bA(null);evalHistorySorted=pe(()=>{let e=this.appEvaluationResults[this.appName()]?.[this.selectedEvalSet()]||{};return Object.keys(e).sort((i,n)=>n.localeCompare(i)).map(i=>({timestamp:i,evaluationResults:e[i]}))});currentHistoryMetrics=pe(()=>{let e=this.selectedHistoryRun()||this.evalHistorySorted()[0]?.timestamp;if(!e)return this.evalMetrics;let A=this.evalHistorySorted().find(i=>i.timestamp===e);return A?this.getEvalMetrics(A):this.evalMetrics});caseHistory=pe(()=>{let e=this.selectedEvalCase();if(!e)return[];let A=e.evalId,i=this.evalHistorySorted();return console.log("[DEBUG] caseHistory history:",i.map(n=>n.timestamp),"selectedHistoryRun:",this.selectedHistoryRun()),i.map(n=>{let o=n.evaluationResults.evaluationResults.find(a=>a.evalId===A);return{timestamp:n.timestamp,result:o}}).filter(n=>n.result!==void 0)});evalCases=[];selectedEvalCase=bA(null);deletedEvalCaseIndex=-1;dataSource=new Td(this.evalCases);selection=new V0(!0,[]);showEvalHistory=bA(!1);selectedEvalTab=bA("cases");selectedHistoryRun=bA(null);evalRunning=bA(!1);evalMetrics=uQ;isEvalV2Enabled=bA(!1);currentEvalResultBySet=new Map;dialog=w(Or);appEvaluationResults={};evalService=w(t0);sessionService=w(Al);constructor(){this.evalCasesSubject.subscribe(e=>{!this.selectedEvalCase()&&this.deletedEvalCaseIndex>=0&&e.length>0?(this.selectNewEvalCase(e),this.deletedEvalCaseIndex=-1):e.length===0&&this.shouldReturnToSession.emit(!0)})}ngOnChanges(e){e.appName&&(this.selectedEvalSet.set(""),this.evalCases=[],this.getEvalSet(),this.getEvaluationResult())}ngOnInit(){this.flagService.isEvalV2Enabled().pipe($n()).subscribe(A=>this.isEvalV2Enabled.set(A));let e=localStorage.getItem("adk_eval_metrics_selection");if(e)try{this.evalMetrics=JSON.parse(e)}catch(A){console.error("Error parsing saved eval metrics",A),this.evalMetrics=uQ}}selectNewEvalCase(e){let A=this.deletedEvalCaseIndex;this.deletedEvalCaseIndex===e.length&&(A=0),this.getEvalCase(e[A])}getEvalSet(){this.appName()!==""&&this.evalService.getEvalSets(this.appName()).pipe(Po(e=>e.status===404&&e.statusText==="Not Found"?(this.shouldShowTab.emit(!1),ne(null)):ne([]))).subscribe(e=>{e!==null&&(this.shouldShowTab.emit(!0),this.evalsets=e,this.changeDetectorRef.detectChanges())})}getNextDefaultEvalSetName(){let e=/^eval_set_(\d+)$/,A=0;for(let i of this.evalsets)if(typeof i=="string"){let n=i.match(e);if(n){let o=parseInt(n[1],10);o>A&&(A=o)}}return`eval_set_${A+1}`}openNewEvalSetDialog(){let e=this.getNextDefaultEvalSetName();this.dialog.open(ov,{width:"600px",data:{appName:this.appName(),defaultName:e}}).afterClosed().subscribe(i=>{i&&(this.getEvalSet(),this.changeDetectorRef.detectChanges())})}openNewEvalCaseDialog(){this.sessionId()&&this.sessionService.getSession(this.userId(),this.appName(),this.sessionId()).subscribe(e=>{let i=(e.state?.__session_metadata__?.displayName||this.sessionId()).replace(/ /g,"_").replace(/[^a-zA-Z0-9_-]/g,"");this.dialog.open(nv,{width:"600px",data:{appName:this.appName(),userId:this.userId(),sessionId:this.sessionId(),evalSetId:this.selectedEvalSet(),defaultName:i,existingCases:this.evalCases}}).afterClosed().subscribe(o=>{o&&(this.listEvalCases(),this.changeDetectorRef.detectChanges())})})}listEvalCases(){this.evalCases=[],this.evalService.listEvalCases(this.appName(),this.selectedEvalSet()).subscribe(e=>{this.evalCases=e,this.dataSource=new Td(this.evalCases),this.evalCasesSubject.next(this.evalCases),this.changeDetectorRef.detectChanges()})}runEval(){this.evalRunning.set(!0),this.evalService.runEval(this.appName(),this.selectedEvalSet(),this.selection.selected.length===0?this.dataSource.data:this.selection.selected,this.evalMetrics).pipe(Po(e=>(e.error?.detail?.includes("not installed")&&this.evalNotInstalledMsg.emit(e.error.detail),ne([])))).subscribe(e=>{this.currentEvalResultBySet.set(this.selectedEvalSet(),e),this.getEvaluationResult(!0),this.changeDetectorRef.detectChanges()})}selectEvalSet(e){this.selectedEvalSet.set(e),this.listEvalCases(),this.isEvalV2Enabled()&&this.evalService.getEvalSet(this.appName(),e).pipe(Po(A=>(console.error("Error fetching eval set details",A),ne(null)))).subscribe(A=>{this.currentEvalSet.set(A),this.changeDetectorRef.detectChanges()})}clearSelectedEvalSet(){if(this.selectedEvalTab()!=="cases"){this.selectedEvalTab.set("cases");return}this.selectedEvalSet.set(""),this.currentEvalSet.set(null)}clearAllNavigation(){this.selectedEvalSet.set(""),this.selectedHistoryRun.set(null),this.selectedEvalCase.set(null),this.currentEvalSet.set(null)}goToEvalSet(){this.selectedHistoryRun.set(null),this.selectedEvalCase.set(null)}isAllSelected(){let e=this.selection.selected.length,A=this.dataSource.data.length;return e===A}toggleAllRows(){if(this.isAllSelected()){this.selection.clear();return}this.selection.select(...this.dataSource.data)}getEvalResultForCase(e){let A=this.currentEvalResultBySet.get(this.selectedEvalSet())?.filter(i=>i.evalId==e);if(!(!A||A.length==0))return A[0].finalEvalStatus}formatToolUses(e){if(!e||!Array.isArray(e))return[];let A=[];for(let i of e)A.push({name:i.name,args:i.args});return A}addEvalCaseResultToEvents(e,A){let i=A.evalMetricResultPerInvocation,n=-1;if(i)for(let o=0;on.evalId==e)[0],i=A.sessionId;this.sessionService.getSession(this.userId(),this.appName(),i).subscribe(n=>{this.addEvalCaseResultToEvents(n,A);let o=this.fromApiResultToSession(n);this.sessionSelected.emit(o)})}toggleEvalHistoryButton(){this.showEvalHistory.set(!this.showEvalHistory())}getEvalHistoryOfCurrentSet(){return this.appEvaluationResults[this.appName()]?this.appEvaluationResults[this.appName()][this.selectedEvalSet()]||{}:{}}getEvalHistoryOfCurrentSetSorted(){let e=this.getEvalHistoryOfCurrentSet();return e?Object.keys(e).sort((n,o)=>o.localeCompare(n)).map(n=>({timestamp:n,evaluationResults:e[n]})):[]}getPassCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==1).length}getFailCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==2).length}getMetricsCounts(e){if(!e)return{passed:0,total:0};let A=0,i=0;if(e.evalMetricResults&&e.evalMetricResults.length>0)A=e.evalMetricResults.filter(n=>n.evalStatus===1).length,i=e.evalMetricResults.length;else if(e.evalMetricResultPerInvocation)for(let n of e.evalMetricResultPerInvocation)n.evalMetricResults&&(A+=n.evalMetricResults.filter(o=>o.evalStatus===1).length,i+=n.evalMetricResults.length);return{passed:A,total:i}}getMetricsScore(e){let{passed:A,total:i}=this.getMetricsCounts(e);return`${A}/${i}`}isMetricsSucceed(e){let{passed:A,total:i}=this.getMetricsCounts(e);return A===i}formatTimestamp(e){let A=Number(e);if(isNaN(A))return"Invalid timestamp provided";let i=new Date(A*1e3);if(isNaN(i.getTime()))return"Invalid date created from timestamp";let n={month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0};return new Intl.DateTimeFormat("en-US",n).format(i)}getEvaluationStatusCardActionButtonIcon(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled?"keyboard_arrow_up":"keyboard_arrow_down"}toggleHistoryStatusCard(e){this.getEvalHistoryOfCurrentSet()[e].isToggled=!this.getEvalHistoryOfCurrentSet()[e].isToggled}isEvaluationStatusCardToggled(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled}generateHistoryEvaluationDatasource(e){return this.getEvalHistoryOfCurrentSet()[e].evaluationResults}getHistorySession(e,A){let i=e.sessionId,n=e.evalId;this.selectedHistoryRun.set(A),this.evalService.getEvalCase(this.appName(),this.selectedEvalSet(),n).subscribe(o=>{this.sessionService.getSession(this.userId(),this.appName(),i).subscribe(a=>{this.addEvalCaseResultToEvents(a,e);let r=this.fromApiResultToSession(a);r.evalCase=o,r.evalCaseResult=e,r.timestamp=A,this.sessionSelected.emit(r)})})}getEvalCase(e){this.evalService.getEvalCase(this.appName(),this.selectedEvalSet(),e).subscribe(A=>{this.selectedEvalCase.set(A),this.evalCaseSelected.emit(A),this.evalSetIdSelected.emit(this.selectedEvalSet())})}resetEvalCase(){this.selectedEvalCase.set(null)}resetEvalResults(){this.currentEvalResultBySet.clear()}confirmDeleteEvalCase(e,A){e.stopPropagation();let i={title:"Confirm delete",message:`Are you sure you want to delete ${A}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(kc,{width:"600px",data:i}).afterClosed().subscribe(o=>{o&&this.deleteEvalCase(A)})}requestEditEvalCase(e,A){e.stopPropagation(),this.evalService.getEvalCase(this.appName(),this.selectedEvalSet(),A).subscribe(i=>{this.selectedEvalCase.set(i),this.evalCaseSelected.emit(i),this.evalSetIdSelected.emit(this.selectedEvalSet()),this.editEvalCaseRequested.emit(i)})}deleteEvalCase(e){this.evalService.deleteEvalCase(this.appName(),this.selectedEvalSet(),e).subscribe(A=>{this.deletedEvalCaseIndex=this.evalCases.indexOf(e),this.selectedEvalCase.set(null),this.listEvalCases(),this.changeDetectorRef.detectChanges()})}confirmDeleteEvalSet(e,A){e.stopPropagation();let i={title:"Confirm delete",message:`Are you sure you want to delete eval set ${A}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(kc,{width:"600px",data:i}).afterClosed().subscribe(o=>{o&&this.deleteEvalSet(A)})}deleteEvalSet(e){this.evalService.deleteEvalSet(this.appName(),e).subscribe(A=>{this.getEvalSet(),this.changeDetectorRef.detectChanges()})}getEvaluationResult(e=!1){this.evalService.listEvalResults(this.appName()).pipe(Po(A=>A.status===404&&A.statusText==="Not Found"?(this.shouldShowTab.emit(!1),ne(null)):ne([])),hi(A=>{if(!A||A.length===0)return ne([]);let i=A.map(n=>this.evalService.getEvalResult(this.appName(),n));return qC(i)})).subscribe(A=>{if(A.length===0)return;let i="";for(let n of A){this.appEvaluationResults[this.appName()]||(this.appEvaluationResults[this.appName()]={}),this.appEvaluationResults[this.appName()][n.evalSetId]||(this.appEvaluationResults[this.appName()][n.evalSetId]={});let o=n.creationTimestamp;(!i||o>i)&&(i=o);let a={isToggled:!1,evaluationResults:n.evalCaseResults.map(r=>({setId:r.id,evalId:r.evalId,finalEvalStatus:r.finalEvalStatus,evalMetricResults:r.evalMetricResults,evalMetricResultPerInvocation:r.evalMetricResultPerInvocation,sessionId:r.sessionId,sessionDetails:r.sessionDetails,overallEvalMetricResults:r.overallEvalMetricResults??[]}))};this.appEvaluationResults[this.appName()][n.evalSetId][o]=a}this.changeDetectorRef.detectChanges(),e&&i&&(this.selectedEvalTab.set("history"),this.selectedHistoryRun.set(i)),this.evalRunning.set(!1)})}openEvalConfigDialog(){this.evalService.getMetricsInfo(this.appName()).pipe(Po(e=>(console.error("Error fetching metrics info",e),ne({metricsInfo:[]})))).subscribe(e=>{this.dialog.open(av,{maxWidth:"90vw",maxHeight:"90vh",data:{evalMetrics:this.evalMetrics,metricsInfo:e.metricsInfo||[]}}).afterClosed().subscribe(i=>{i&&(this.evalMetrics=i,localStorage.setItem("adk_eval_metrics_selection",JSON.stringify(i)),this.runEval())})})}getEvalMetrics(e){if(!e||!e.evaluationResults||!e.evaluationResults.evaluationResults)return this.evalMetrics;let A=e.evaluationResults.evaluationResults;return A.length===0?this.evalMetrics:typeof A[0].overallEvalMetricResults>"u"||!A[0].overallEvalMetricResults||A[0].overallEvalMetricResults.length===0?this.evalMetrics:A[0].overallEvalMetricResults.map(n=>({metricName:n.metricName,threshold:n.threshold}))}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-eval-tab"]],viewQuery:function(A,i){A&1&&ns(i.checkboxes,ec,5),A&2&&ur()},inputs:{appName:[1,"appName"],userId:[1,"userId"],sessionId:[1,"sessionId"]},outputs:{sessionSelected:"sessionSelected",shouldShowTab:"shouldShowTab",evalNotInstalledMsg:"evalNotInstalledMsg",evalCaseSelected:"evalCaseSelected",evalSetIdSelected:"evalSetIdSelected",shouldReturnToSession:"shouldReturnToSession",editEvalCaseRequested:"editEvalCaseRequested"},features:[Yt],decls:17,vars:11,consts:[[1,"eval-container"],[1,"eval-detail-header"],["mat-icon-button","","matTooltip","All Eval Sets",3,"click"],[1,"breadcrumb-item",2,"font-weight","500","color","var(--mat-sys-on-surface)"],[1,"spacer"],[1,"eval-details-container"],[1,"breadcrumb-separator"],["matTooltip","Eval Set",1,"breadcrumb-item","clickable"],["matTooltip","Eval Set",1,"breadcrumb-item"],["matTooltip","Eval Set",1,"breadcrumb-item","clickable",3,"click"],["matTooltip","Eval Cases",1,"breadcrumb-item"],["matTooltip","Runs",1,"breadcrumb-item"],["matTooltip","Run",1,"breadcrumb-item"],["matTooltip","Eval Case",1,"breadcrumb-item"],["mat-button","",3,"click","matTooltip"],["mat-icon-button","","matTooltip","Refresh",3,"click"],[1,"empty-eval-info"],[1,"info-title"],[1,"info-detail"],[1,"info-create",3,"click"],[1,"eval-set-row"],[1,"eval-set-row",3,"click"],[1,"eval-set-left"],[1,"material-symbols-outlined"],[1,"eval-set-name"],[1,"eval-set-right"],["mat-icon-button","",1,"delete-btn",3,"click","matTooltip"],[1,"eval-details-content"],[1,"vertical-tabs-sidebar"],["mat-icon-button","","matTooltip","Info","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Eval Cases","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Runs","matTooltipPosition","right",3,"click"],[1,"vertical-tabs-content"],[2,"display","flex","justify-content","center","align-items","center","padding","20px"],["mode","indeterminate",3,"diameter","strokeWidth"],[1,"info-tables-container"],["app-info-table",""],[3,"matTooltip"],[1,"eval-case-details",2,"padding","16px"],[1,"toolbar",2,"position","sticky","top","0","z-index","1"],[2,"margin-left","6px",3,"change","checked","indeterminate"],["mat-button","","color","primary",3,"click","disabled"],["mat-button","","color","accent",3,"click"],[1,"eval-cases-list"],[1,"eval-case-row",3,"selected-row"],[1,"eval-case-row",3,"click"],[3,"click","change","checked"],[1,"eval-case-id"],["mat-icon-button","",1,"edit-btn",3,"click","matTooltip"],[2,"margin-bottom","16px"],[2,"margin-top","0"],[2,"margin-bottom","8px"],[1,"eval-case-row","clickable",3,"selected-row"],[2,"padding","16px","text-align","center","color","var(--app-color-text-secondary)"],[1,"eval-case-row","clickable",3,"click"],[1,"status-card__summary",2,"width","50px","text-align","center"],[2,"font-family","monospace",3,"ngClass"],[2,"padding","16px"],[1,"eval-case-row"],[1,"status-card__summary"],[1,"status-card__passed",2,"font-family","monospace"],[1,"status-card__separator"],[1,"status-card__failed",2,"font-family","monospace"],[1,"status-card",2,"margin-top","0"],[1,"status-card__overview"],[1,"status-card__info"],[1,"status-card__metrics"],[1,"status-card__history-cases"],[1,"status-card__history-case",2,"display","flex","justify-content","space-between","align-items","center"],[1,"status-card__metric"],[1,"status-card__metric-name",3,"matTooltip"],[1,"status-card__metric-value"],[1,"status-card__history-case",2,"display","flex","justify-content","space-between","align-items","center",3,"click"],[2,"font-family","monospace","width","50px","text-align","center",3,"ngClass"]],template:function(A,i){A&1&&(B(0,"div",0)(1,"div",1)(2,"button",2),U("click",function(){return i.clearAllNavigation()}),B(3,"mat-icon"),y(4,"home"),Q()(),O(5,F_A,2,0,"span",3),O(6,K_A,4,1),O(7,U_A,4,0),O(8,T_A,4,0),O(9,J_A,4,1),O(10,O_A,4,1),hA(11,"span",4),O(12,Y_A,7,1),Q(),O(13,H_A,0,0),O(14,z_A,8,3,"div"),O(15,j_A,3,0,"div"),O(16,hRA,15,7,"div",5),Q()),A&2&&(u(5),Y(i.selectedEvalSet()===""?5:-1),u(),Y(i.selectedEvalSet()!==""?6:-1),u(),Y(i.selectedEvalSet()!==""&&i.selectedEvalTab()==="cases"&&!i.selectedEvalCase()?7:-1),u(),Y(i.selectedEvalSet()!==""&&i.selectedEvalTab()==="history"&&!i.selectedHistoryRun()?8:-1),u(),Y(i.selectedHistoryRun()&&!i.selectedEvalCase()?9:-1),u(),Y(i.selectedEvalCase()?10:-1),u(2),Y(i.selectedEvalSet()===""?12:-1),u(),Y(i.selectedEvalSet()==""?13:-1),u(),Y(i.evalsets.length==0?14:-1),u(),Y(i.evalsets.length>0&&i.selectedEvalSet()==""?15:-1),u(),Y(i.selectedEvalSet()!=""?16:-1))},dependencies:[Wt,pi,ji,dn,ec,zl,gs,OI,$0,Ya,ip,JI],styles:[".eval-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;box-sizing:border-box}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 10px;background-color:var(--mat-sys-surface-container, #f5f5f5);border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0);gap:8px}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%]{flex:1 1 auto}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{height:32px!important;line-height:normal!important;border-radius:16px!important;font-size:13px!important;font-weight:500!important;display:inline-flex!important;align-items:center;justify-content:center}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%]{padding:0 12px!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:4px!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%]{width:32px!important;min-width:32px!important;padding:0!important;border-radius:50%!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:0!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple{width:32px!important;height:32px!important;border-radius:50%!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important;vertical-align:middle}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{vertical-align:middle}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%]{width:100%;background:transparent;border-top:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{font-weight:600}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:middle;padding:6px 16px;border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr.mat-header-row[_ngcontent-%COMP%]{display:none}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]{cursor:pointer;background:transparent}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr.selected-row[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high, #e0e0e0)}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%]{display:flex;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant);height:48px;flex-shrink:0;padding:0 16px;gap:8px}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%]{flex:1 1 auto}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-separator[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);margin:0 4px}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]{font-size:14px;color:var(--mat-sys-on-surface-variant)}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item.clickable[_ngcontent-%COMP%]{color:var(--mat-sys-primary);cursor:pointer}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item.clickable[_ngcontent-%COMP%]:hover{text-decoration:underline}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]:last-child{color:var(--mat-sys-on-surface);font-weight:500}.eval-container[_ngcontent-%COMP%] .eval-set-title[_ngcontent-%COMP%]{font-size:14px;font-weight:500;color:var(--mat-sys-on-surface);margin-right:16px}.eval-case-id[_ngcontent-%COMP%]{cursor:pointer}.eval-set-actions[_ngcontent-%COMP%]{display:flex;justify-content:space-between;color:var(--mat-sys-on-surface);font-style:normal;font-weight:700;font-size:14px}.empty-eval-info[_ngcontent-%COMP%]{margin-top:12px}.info-title[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);font-size:14px;font-weight:500;padding-top:13px;padding-right:16px;padding-left:16px}.info-detail[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:14px;font-weight:400;padding-top:13px;padding-right:16px;padding-left:16px;letter-spacing:.2px}.info-create[_ngcontent-%COMP%]{color:var(--mat-sys-primary);font-size:14px;font-style:normal;font-weight:500;padding-right:16px;padding-left:16px;margin-top:19px;padding-bottom:16px;cursor:pointer}.eval-set-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;cursor:pointer;padding:6px 16px;min-height:44px;border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0);background:transparent}.eval-set-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.eval-set-row[_ngcontent-%COMP%]:hover .delete-btn[_ngcontent-%COMP%]{opacity:1}.eval-set-row[_ngcontent-%COMP%] .eval-set-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px}.eval-set-row[_ngcontent-%COMP%] .eval-set-left[_ngcontent-%COMP%] span.material-symbols-outlined[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:20px}.eval-set-row[_ngcontent-%COMP%] .eval-set-name[_ngcontent-%COMP%]{font-size:14px;color:var(--mat-sys-on-surface)}.eval-set-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out;color:var(--mat-sys-outline)}.eval-set-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-error)}.eval-set-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important}.selected-eval-case[_ngcontent-%COMP%]{font-weight:900;color:var(--mat-sys-primary)}.save-session-btn[_ngcontent-%COMP%]{width:100%;border:none;border-radius:4px;margin-top:12px;cursor:pointer}.save-session-btn-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.save-session-btn-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--mat-sys-on-primary);font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.run-eval-btn[_ngcontent-%COMP%]{border-radius:4px;border:1px solid var(--mat-sys-outline);padding:8px 24px;margin-top:16px;color:var(--mat-sys-primary);cursor:pointer}.run-eval-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-high)}.result-btn[_ngcontent-%COMP%]{display:flex;border-radius:4px;border:1px solid var(--mat-sys-outline-variant);margin-top:4px;cursor:pointer}.result-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-high)}.result-btn.pass[_ngcontent-%COMP%]{color:var(--mat-sys-tertiary)}.result-btn.fail[_ngcontent-%COMP%]{color:var(--mat-sys-error)}.evaluation-tab-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.evaluation-history-icon[_ngcontent-%COMP%]{cursor:pointer;margin-top:4px}.status-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;border-radius:8px;padding:12px 16px;margin-top:12px;background-color:var(--mat-sys-surface-container)}.status-card__overview[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.status-card__info[_ngcontent-%COMP%]{display:flex;flex-direction:column}.status-card__timestamp[_ngcontent-%COMP%]{font-size:.9em;color:var(--mat-sys-on-surface-variant);margin-bottom:5px}.status-card__summary[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:.95em;font-weight:500;color:var(--mat-sys-on-surface)}.status-card__metrics[_ngcontent-%COMP%]{display:flex;align-items:center;flex-wrap:wrap;font-size:.75em;margin-top:3px}.status-card__metric[_ngcontent-%COMP%]{width:160px;display:flex;align-items:center;color:var(--mat-sys-on-surface);margin-right:12px;margin-bottom:4px}.status-card__metric-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.status-card__metric-value[_ngcontent-%COMP%]{margin-left:4px;flex-shrink:0}.status-card__failed[_ngcontent-%COMP%]{color:var(--mat-sys-error)}.status-card__separator[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);margin:0 8px}.status-card__passed[_ngcontent-%COMP%]{color:#2e7d32}.status-card__action[_ngcontent-%COMP%]{display:flex;align-items:center}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);cursor:pointer;transition:transform .2s ease-in-out}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:1.2em;cursor:pointer}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__history-cases[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin-top:3px;justify-content:flex-start;width:100%}.status-card__history-case[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%;margin-top:4px;padding:8px 12px;border-radius:4px;cursor:pointer;box-sizing:border-box}.status-card__history-case[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.eval-spinner[_ngcontent-%COMP%]{margin-top:12px}.eval-details-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;overflow:hidden}.eval-details-content[_ngcontent-%COMP%]{display:flex;flex:1;overflow:hidden}.vertical-tabs-sidebar[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:48px;border-right:1px solid var(--mat-sys-outline-variant);padding-top:8px;align-items:center;gap:8px}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.vertical-tabs-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto}.eval-cases-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:100%}.eval-case-row[_ngcontent-%COMP%]{display:flex;align-items:center;cursor:pointer;padding:8px 16px;gap:12px;border-bottom:1px solid var(--mat-sys-outline-variant);background:transparent}.eval-case-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low)}.eval-case-row[_ngcontent-%COMP%]:hover .delete-btn[_ngcontent-%COMP%], .eval-case-row[_ngcontent-%COMP%]:hover .edit-btn[_ngcontent-%COMP%]{opacity:1}.eval-case-row.selected-row[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high)}.eval-case-row[_ngcontent-%COMP%] .eval-case-id[_ngcontent-%COMP%]{font-size:14px;color:var(--mat-sys-on-surface);font-family:Google Sans Mono,monospace;flex:1}.eval-case-row[_ngcontent-%COMP%] .edit-btn[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out;color:var(--mat-sys-on-surface-variant)}.eval-case-row[_ngcontent-%COMP%] .edit-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-primary)}.eval-case-row[_ngcontent-%COMP%] .edit-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important}.eval-case-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out;color:var(--mat-sys-on-surface-variant)}.eval-case-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-error)}.eval-case-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important}.eval-case-row.header-row[_ngcontent-%COMP%]{cursor:default;background-color:var(--mat-sys-surface-container-lowest)}.eval-case-row.header-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-lowest)}.info-tables-container[_ngcontent-%COMP%]{padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:24px}"]})};var QRA={noSessionsFound:"No sessions found",readonlyChip:"Read-only",filterSessionsLabel:"Search using session ID"},AiA=new kA("Session Tab Messages",{factory:()=>QRA});function uRA(t,e){if(t&1&&(B(0,"div",1)(1,"mat-form-field",4)(2,"mat-label"),y(3),Q(),B(4,"mat-icon",5),y(5,"filter_list"),Q(),hA(6,"input",6),Q()()),t&2){let A=p();u(3),lA(A.i18n.filterSessionsLabel),u(3),H("formControl",A.filterControl)}}function fRA(t,e){t&1&&(B(0,"div",2),hA(1,"mat-progress-bar",7),Q())}function pRA(t,e){if(t&1&&(B(0,"div",3),y(1),Q()),t&2){let A=p();u(),ba("",A.i18n.noSessionsFound," for user '",A.userId,"'")}}function mRA(t,e){if(t&1&&(B(0,"div",18),y(1),Q()),t&2){let A=p().$implicit;H("title",A.id),u(),lA(A.id)}}function wRA(t,e){if(t&1&&(B(0,"div",19)(1,"mat-icon"),y(2,"visibility"),Q(),y(3),Q()),t&2){let A=p(3);u(3),ue(" ",A.i18n.readonlyChip," ")}}function DRA(t,e){if(t&1){let A=QA();B(0,"div",10),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.getSession(n.id))}),B(1,"div",11)(2,"div",12)(3,"div",13),y(4),Q(),B(5,"button",14),U("click",function(n){let o=T(A).$implicit,a=p(2);return J(a.promoteToTest(n,o))}),B(6,"mat-icon"),y(7,"fact_check"),Q()(),B(8,"button",15),U("click",function(n){let o=T(A).$implicit,a=p(2);return J(a.deleteSession(n,o))}),B(9,"mat-icon"),y(10,"delete"),Q()()(),B(11,"div",16)(12,"div",17),y(13),Q(),O(14,mRA,2,2,"div",18),Q()(),O(15,wRA,4,1,"div",19),Ht(16,"async"),Q()}if(t&2){let A=e.$implicit,i=p(2);H("ngClass",A.id===i.sessionId?"session-item current":"session-item"),u(3),RA("is-monospace",!i.hasDisplayName(A)),H("title",A.id),u(),lA(i.getSessionDisplayName(A)),u(9),lA(i.getDate(A)),u(),Y(i.hasDisplayName(A)?14:-1),u(),Y(si(16,8,i.sessionService.canEdit(i.userId,A))===!1?15:-1)}}function yRA(t,e){t&1&&(B(0,"div",2),hA(1,"mat-progress-bar",7),Q())}function vRA(t,e){if(t&1){let A=QA();O(0,yRA,2,0,"div",2),B(1,"div",20)(2,"button",21),U("click",function(){T(A);let n=p(2);return J(n.loadMoreSessions())}),y(3,"Load more"),Q()()}if(t&2){p(2);let A=zn(3);Y(A?0:-1)}}function bRA(t,e){if(t&1&&(B(0,"div",8),Ue(1,DRA,17,10,"div",9,ri),Q(),O(3,vRA,4,1),Ht(4,"async")),t&2){let A=p();u(),Te(A.sessionList),u(2),Y(si(4,1,A.isSessionFilteringEnabled)&&A.canLoadMoreSessions?3:-1)}}var sv=class t{userId="";appName="";sessionId="";sessionSelected=new LA;sessionReloaded=new LA;SESSIONS_PAGE_LIMIT=100;sessionList=[];canLoadMoreSessions=!1;pageToken="";filterControl=new Os("");editingSessionId=null;sessionNameControl=new Os("");refreshSessionsSubject=new ie;route=w(Vs);changeDetectorRef=w(wt);sessionService=w(Al);uiStateService=w(tg);i18n=w(AiA);featureFlagService=w(yr);dialog=w(Or);testsService=w(u2);isSessionFilteringEnabled=this.featureFlagService.isSessionFilteringEnabled();isLoadingMoreInProgress=bA(!1);isInitialized=bA(!1);constructor(){this.filterControl.valueChanges.pipe(Ls(300)).subscribe(()=>{this.pageToken="",this.sessionList=[],this.refreshSessionsSubject.next()}),this.refreshSessionsSubject.pipe(di(()=>{this.uiStateService.setIsSessionListLoading(!0)}),hi(()=>{let e=this.filterControl.value||void 0;return this.isSessionFilteringEnabled?this.sessionService.listSessions(this.userId,this.appName,{filter:e,pageToken:this.pageToken,pageSize:this.SESSIONS_PAGE_LIMIT}).pipe(Po(()=>ne({items:[],nextPageToken:""}))):this.sessionService.listSessions(this.userId,this.appName).pipe(Po(()=>ne({items:[],nextPageToken:""})))}),di(({items:e,nextPageToken:A})=>{this.isInitialized.set(!0),this.sessionList=Array.from(new Map([...this.sessionList,...e].map(i=>[i.id,i])).values()).sort((i,n)=>Number(n.lastUpdateTime)-Number(i.lastUpdateTime)),this.pageToken=A??"",this.canLoadMoreSessions=!!A,this.changeDetectorRef.markForCheck()})).subscribe(()=>{this.isLoadingMoreInProgress.set(!1),this.uiStateService.setIsSessionListLoading(!1)},()=>{this.isLoadingMoreInProgress.set(!1),this.uiStateService.setIsSessionListLoading(!1)})}ngOnInit(){this.featureFlagService.isSessionFilteringEnabled().subscribe(e=>{if(e){let A=this.route.snapshot.queryParams.session;A&&this.filterControl.setValue(A)}}),setTimeout(()=>{this.refreshSessionsSubject.next()},500)}getSession(e){e&&this.sessionSelected.emit(e)}loadMoreSessions(){this.isLoadingMoreInProgress.set(!0),this.refreshSessionsSubject.next()}getSessionDisplayName(e){return e.state?.__session_metadata__?.displayName||e.id}hasDisplayName(e){return!!e.state?.__session_metadata__?.displayName}startEditSessionName(e){this.editingSessionId=e.id,this.sessionNameControl.setValue(this.getSessionDisplayName(e))}cancelEditSessionName(){this.editingSessionId=null,this.sessionNameControl.setValue("")}saveSessionName(e){if(!this.editingSessionId||!e.id)return;let A=this.sessionNameControl.value,i=e.state||{},n=Ye(gA({},i),{__session_metadata__:Ye(gA({},i.__session_metadata__||{}),{displayName:A})});e.state=n,this.editingSessionId=null,this.sessionService.updateSession(this.userId,this.appName,e.id,{stateDelta:n}).subscribe({error:()=>{}})}deleteSession(e,A){e.stopPropagation();let i=A.id,n=this.getSessionDisplayName(A),o=`Are you sure you want to delete session ${i}?`;n!==i&&(o=`Are you sure you want to delete session "${n}" (${i})?`);let a={title:"Confirm delete",message:o,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(kc,{width:"600px",data:a}).afterClosed().subscribe(s=>{s&&this.sessionService.deleteSession(this.userId,this.appName,i).subscribe(()=>{this.refreshSession(i)})})}promoteToTest(e,A){e.stopPropagation();let i=window.prompt("Enter test name (e.g., test1):");i&&this.sessionService.getSession(this.userId,this.appName,A.id).subscribe(n=>{let o={events:n.events};this.testsService.createTest(this.appName,i,o).subscribe({next:()=>{alert(`Test ${i} created successfully.`)},error:a=>{alert(`Error creating test: ${a.message||a}`)}})})}getDate(e){let A=e.lastUpdateTime||0;return new Date(A*1e3).toLocaleString()}fromApiResultToSession(e){return{id:e.id??"",appName:e.appName??"",userId:e.userId??"",state:e.state??{},events:e.events??[]}}reloadSession(e){this.sessionReloaded.emit(e)}refreshSession(e){let A=null;if(this.sessionList.length>0){let i=this.sessionList.findIndex(n=>n.id===e);i===this.sessionList.length-1&&(i=-1),A=this.sessionList[i+1]}return this.isSessionFilteringEnabled?this.filterControl.setValue(""):(this.sessionList=[],this.refreshSessionsSubject.next()),A}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-session-tab"]],inputs:{userId:"userId",appName:"appName",sessionId:"sessionId"},outputs:{sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded"},decls:8,vars:7,consts:[[1,"session-wrapper"],[1,"session-filter-container"],[1,"loading-spinner-container"],[1,"empty-state"],["appearance","outline",1,"session-filter"],["matPrefix",""],["matInput","",3,"formControl"],["mode","indeterminate"],[1,"session-tab-container",2,"margin-top","16px"],[3,"ngClass"],[3,"click","ngClass"],[1,"session-info"],[1,"session-header"],[1,"session-id",3,"title"],["mat-icon-button","","title","Promote to test",1,"action-btn","promote-btn",3,"click"],["mat-icon-button","","title","Delete session",1,"action-btn","delete-btn",3,"click"],[1,"session-sub-row"],[1,"session-date"],[1,"session-real-id",3,"title"],[1,"readonly-badge"],[1,"load-more"],["mat-button","","color","primary",3,"click"]],template:function(A,i){if(A&1&&(B(0,"div",0),O(1,uRA,7,2,"div",1),Ht(2,"async"),ta(3),Ht(4,"async"),O(5,fRA,2,0,"div",2)(6,pRA,2,2,"div",3)(7,bRA,5,3),Q()),A&2){u(),Y(si(2,2,i.isSessionFilteringEnabled)?1:-1),u(2);let n=ga(si(4,4,i.uiStateService.isSessionListLoading()));u(2),Y((n||!i.isInitialized())&&!i.isLoadingMoreInProgress()?5:!n&&i.isInitialized()&&i.sessionList.length===0?6:7)}},dependencies:[zl,CQ,Wt,Ya,Ko,vs,Ub,Ps,ua,ln,Dn,yn,n2,XI,qi,pi,ji,Tn,Xc,os],styles:[".session-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;font-size:14px;font-weight:700;color:var(--session-tab-session-wrapper-color);display:flex;flex-direction:column;overflow:hidden;height:100%}.session-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{color:initial;padding-top:1em;text-align:center;font-weight:400;font-style:italic}.session-wrapper[_ngcontent-%COMP%] .session-filter-container[_ngcontent-%COMP%]{border-radius:8px;padding:16px;margin-bottom:16px;margin-top:16px}.session-wrapper[_ngcontent-%COMP%] .session-filter[_ngcontent-%COMP%]{width:100%}.session-tab-container[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.session-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;border:none;border-radius:8px;margin-bottom:4px;cursor:pointer}.session-item[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant, rgba(0, 0, 0, .04))}.session-item.current[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))}.session-item[_ngcontent-%COMP%] mat-chip[_ngcontent-%COMP%]{margin-right:11px}.session-id[_ngcontent-%COMP%]{color:var(--session-tab-session-id-color);font-family:Roboto,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.session-id.is-monospace[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.session-sub-row[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:8px}.session-date[_ngcontent-%COMP%]{color:var(--session-tab-session-date-color);font-family:Roboto;font-size:12px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.3px;white-space:nowrap}.session-real-id[_ngcontent-%COMP%]{color:var(--session-tab-session-id-color);font-family:Google Sans Mono,monospace;font-size:12px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.3px;opacity:.7;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;text-align:right}.session-info[_ngcontent-%COMP%]{padding:11px;flex:1;min-width:0}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;height:24px;margin-bottom:2px}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .session-id[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .session-name-input[_ngcontent-%COMP%]{flex:1;height:20px;padding:0 4px;font-family:inherit;font-size:14px;border:1px solid var(--mat-sys-outline, #ccc);border-radius:4px;background:var(--mat-sys-surface, #fff);color:var(--mat-sys-on-surface, #000);outline:none;min-width:0;margin-right:4px}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .session-name-input[_ngcontent-%COMP%]:focus{border-color:var(--mat-sys-primary, #1976d2)}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]{width:24px;height:24px;padding:0;display:none}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] .mat-icon{font-size:16px;width:16px;height:16px;line-height:16px}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .save-btn[_ngcontent-%COMP%], .session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .cancel-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;margin-left:2px}.session-item[_ngcontent-%COMP%]:hover .action-btn.edit-btn[_ngcontent-%COMP%], .session-item[_ngcontent-%COMP%]:hover .action-btn.delete-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center}.loading-spinner-container[_ngcontent-%COMP%]{margin-left:auto;margin-right:auto;margin-top:2em;width:100%}.load-more[_ngcontent-%COMP%]{display:flex;justify-content:center;margin-top:1em}.readonly-badge[_ngcontent-%COMP%]{color:var(--chat-readonly-badge-color);border-radius:4px;padding:1px 6px;display:flex;align-items:center;margin-right:8px;font-size:12px;line-height:16px;gap:4px;white-space:nowrap}.readonly-badge[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;padding-top:1px;flex-shrink:0}"]})};var gF=["*"];function MRA(t,e){t&1&&Ve(0)}var SRA=["tabListContainer"],kRA=["tabList"],xRA=["tabListInner"],_RA=["nextPaginator"],RRA=["previousPaginator"],NRA=["content"];function FRA(t,e){}var LRA=["tabBodyWrapper"],GRA=["tabHeader"];function KRA(t,e){}function URA(t,e){if(t&1&&Et(0,KRA,0,0,"ng-template",12),t&2){let A=p().$implicit;H("cdkPortalOutlet",A.templateLabel)}}function TRA(t,e){if(t&1&&y(0),t&2){let A=p().$implicit;lA(A.textLabel)}}function JRA(t,e){if(t&1){let A=QA();B(0,"div",7,2),U("click",function(){let n=T(A),o=n.$implicit,a=n.$index,r=p(),s=Qi(1);return J(r._handleClick(o,s,a))})("cdkFocusChange",function(n){let o=T(A).$index,a=p();return J(a._tabFocusChanged(n,o))}),hA(2,"span",8)(3,"div",9),B(4,"span",10)(5,"span",11),O(6,URA,1,1,null,12)(7,TRA,1,1),Q()()()}if(t&2){let A=e.$implicit,i=e.$index,n=Qi(1),o=p();ro(A.labelClass),RA("mdc-tab--active",o.selectedIndex===i),H("id",o._getTabLabelId(A,i))("disabled",A.disabled)("fitInkBarToContent",o.fitInkBarToContent),te("tabIndex",o._getTabIndex(i))("aria-posinset",i+1)("aria-setsize",o._tabs.length)("aria-controls",o._getTabContentId(i))("aria-selected",o.selectedIndex===i)("aria-label",A.ariaLabel||null)("aria-labelledby",!A.ariaLabel&&A.ariaLabelledby?A.ariaLabelledby:null),u(3),H("matRippleTrigger",n)("matRippleDisabled",A.disabled||o.disableRipple),u(3),Y(A.templateLabel?6:7)}}function ORA(t,e){t&1&&Ve(0)}function YRA(t,e){if(t&1){let A=QA();B(0,"mat-tab-body",13),U("_onCentered",function(){T(A);let n=p();return J(n._removeTabBodyWrapperHeight())})("_onCentering",function(n){T(A);let o=p();return J(o._setTabBodyWrapperHeight(n))})("_beforeCentering",function(n){T(A);let o=p();return J(o._bodyCentered(n))}),Q()}if(t&2){let A=e.$implicit,i=e.$index,n=p();ro(A.bodyClass),H("id",n._getTabContentId(i))("content",A.content)("position",A.position)("animationDuration",n.animationDuration)("preserveContent",n.preserveContent),te("tabindex",n.contentTabIndex!=null&&n.selectedIndex===i?n.contentTabIndex:null)("aria-labelledby",n._getTabLabelId(A,i))("aria-hidden",n.selectedIndex!==i)}}var HRA=new kA("MatTabContent"),zRA=(()=>{class t{template=w(ao);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matTabContent",""]],features:[Bt([{provide:HRA,useExisting:t}])]})}return t})(),PRA=new kA("MatTabLabel"),niA=new kA("MAT_TAB"),cF=(()=>{class t extends hT{_closestTab=w(niA,{optional:!0});static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","mat-tab-label",""],["","matTabLabel",""]],features:[Bt([{provide:PRA,useExisting:t}]),mt]})}return t})(),oiA=new kA("MAT_TAB_GROUP"),CF=(()=>{class t{_viewContainerRef=w(Mo);_closestTabGroup=w(oiA,{optional:!0});disabled=!1;get templateLabel(){return this._templateLabel}set templateLabel(A){this._setTemplateLabelInput(A)}_templateLabel;_explicitContent=void 0;_implicitContent;textLabel="";ariaLabel;ariaLabelledby;labelClass;bodyClass;id=null;_contentPortal=null;get content(){return this._contentPortal}_stateChanges=new ie;position=null;origin=null;isActive=!1;constructor(){w(eo).load(lr)}ngOnChanges(A){(A.hasOwnProperty("textLabel")||A.hasOwnProperty("disabled"))&&this._stateChanges.next()}ngOnDestroy(){this._stateChanges.complete()}ngOnInit(){this._contentPortal=new Jr(this._explicitContent||this._implicitContent,this._viewContainerRef)}_setTemplateLabelInput(A){A&&A._closestTab===this&&(this._templateLabel=A)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-tab"]],contentQueries:function(i,n,o){if(i&1&&jo(o,cF,5)(o,zRA,7,ao),i&2){let a;ae(a=re())&&(n.templateLabel=a.first),ae(a=re())&&(n._explicitContent=a.first)}},viewQuery:function(i,n){if(i&1&&Jt(ao,7),i&2){let o;ae(o=re())&&(n._implicitContent=o.first)}},hostAttrs:["hidden",""],hostVars:1,hostBindings:function(i,n){i&2&&te("id",null)},inputs:{disabled:[2,"disabled","disabled",Be],textLabel:[0,"label","textLabel"],ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],labelClass:"labelClass",bodyClass:"bodyClass",id:"id"},exportAs:["matTab"],features:[Bt([{provide:niA,useExisting:t}]),Yt],ngContentSelectors:gF,decls:1,vars:0,template:function(i,n){i&1&&(Rt(),X3(0,MRA,1,0,"ng-template"))},encapsulation:2})}return t})(),aF="mdc-tab-indicator--active",eiA="mdc-tab-indicator--no-transition",rF=class{_items;_currentItem;constructor(e){this._items=e}hide(){this._items.forEach(e=>e.deactivateInkBar()),this._currentItem=void 0}alignToElement(e){let A=this._items.find(n=>n.elementRef.nativeElement===e),i=this._currentItem;if(A!==i&&(i?.deactivateInkBar(),A)){let n=i?.elementRef.nativeElement.getBoundingClientRect?.();A.activateInkBar(n),this._currentItem=A}}},jRA=(()=>{class t{_elementRef=w(ce);_inkBarElement=null;_inkBarContentElement=null;_fitToContent=!1;get fitInkBarToContent(){return this._fitToContent}set fitInkBarToContent(A){this._fitToContent!==A&&(this._fitToContent=A,this._inkBarElement&&this._appendInkBarElement())}activateInkBar(A){let i=this._elementRef.nativeElement;if(!A||!i.getBoundingClientRect||!this._inkBarContentElement){i.classList.add(aF);return}let n=i.getBoundingClientRect(),o=A.width/n.width,a=A.left-n.left;i.classList.add(eiA),this._inkBarContentElement.style.setProperty("transform",`translateX(${a}px) scaleX(${o})`),i.getBoundingClientRect(),i.classList.remove(eiA),i.classList.add(aF),this._inkBarContentElement.style.setProperty("transform","")}deactivateInkBar(){this._elementRef.nativeElement.classList.remove(aF)}ngOnInit(){this._createInkBarElement()}ngOnDestroy(){this._inkBarElement?.remove(),this._inkBarElement=this._inkBarContentElement=null}_createInkBarElement(){let A=this._elementRef.nativeElement.ownerDocument||document,i=this._inkBarElement=A.createElement("span"),n=this._inkBarContentElement=A.createElement("span");i.className="mdc-tab-indicator",n.className="mdc-tab-indicator__content mdc-tab-indicator__content--underline",i.appendChild(this._inkBarContentElement),this._appendInkBarElement()}_appendInkBarElement(){this._inkBarElement;let A=this._fitToContent?this._elementRef.nativeElement.querySelector(".mdc-tab__content"):this._elementRef.nativeElement;A.appendChild(this._inkBarElement)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,inputs:{fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",Be]}})}return t})();var aiA=(()=>{class t extends jRA{elementRef=w(ce);disabled=!1;focus(){this.elementRef.nativeElement.focus()}getOffsetLeft(){return this.elementRef.nativeElement.offsetLeft}getOffsetWidth(){return this.elementRef.nativeElement.offsetWidth}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matTabLabelWrapper",""]],hostVars:3,hostBindings:function(i,n){i&2&&(te("aria-disabled",!!n.disabled),RA("mat-mdc-tab-disabled",n.disabled))},inputs:{disabled:[2,"disabled","disabled",Be]},features:[mt]})}return t})(),tiA={passive:!0},qRA=650,VRA=100,WRA=(()=>{class t{_elementRef=w(ce);_changeDetectorRef=w(wt);_viewportRuler=w(Ms);_dir=w(fo,{optional:!0});_ngZone=w(qe);_platform=w(gi);_sharedResizeObserver=w(kp);_injector=w(Dt);_renderer=w(Pi);_animationsDisabled=An();_eventCleanups;_scrollDistance=0;_selectedIndexChanged=!1;_destroyed=new ie;_showPaginationControls=!1;_disableScrollAfter=!0;_disableScrollBefore=!0;_tabLabelCount;_scrollDistanceChanged=!1;_keyManager;_currentTextContent;_stopScrolling=new ie;disablePagination=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){let i=isNaN(A)?0:A;this._selectedIndex!=i&&(this._selectedIndexChanged=!0,this._selectedIndex=i,this._keyManager&&this._keyManager.updateActiveItem(i))}_selectedIndex=0;selectFocusedIndex=new LA;indexFocused=new LA;constructor(){this._eventCleanups=this._ngZone.runOutsideAngular(()=>[this._renderer.listen(this._elementRef.nativeElement,"mouseleave",()=>this._stopInterval())])}ngAfterViewInit(){this._eventCleanups.push(this._renderer.listen(this._previousPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("before"),tiA),this._renderer.listen(this._nextPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("after"),tiA))}ngAfterContentInit(){let A=this._dir?this._dir.change:ne("ltr"),i=this._sharedResizeObserver.observe(this._elementRef.nativeElement).pipe(Ls(32),Qt(this._destroyed)),n=this._viewportRuler.change(150).pipe(Qt(this._destroyed)),o=()=>{this.updatePagination(),this._alignInkBarToSelectedTab()};this._keyManager=new H0(this._items).withHorizontalOrientation(this._getLayoutDirection()).withHomeAndEnd().withWrap().skipPredicate(()=>!1),this._keyManager.updateActiveItem(Math.max(this._selectedIndex,0)),Hn(o,{injector:this._injector}),Ki(A,n,i,this._items.changes,this._itemsResized()).pipe(Qt(this._destroyed)).subscribe(()=>{this._ngZone.run(()=>{Promise.resolve().then(()=>{this._scrollDistance=Math.max(0,Math.min(this._getMaxScrollDistance(),this._scrollDistance)),o()})}),this._keyManager?.withHorizontalOrientation(this._getLayoutDirection())}),this._keyManager.change.subscribe(a=>{this.indexFocused.emit(a),this._setTabFocus(a)})}_itemsResized(){return typeof ResizeObserver!="function"?ar:this._items.changes.pipe(Sn(this._items),hi(A=>new vi(i=>this._ngZone.runOutsideAngular(()=>{let n=new ResizeObserver(o=>i.next(o));return A.forEach(o=>n.observe(o.elementRef.nativeElement)),()=>{n.disconnect()}}))),wl(1),gt(A=>A.some(i=>i.contentRect.width>0&&i.contentRect.height>0)))}ngAfterContentChecked(){this._tabLabelCount!=this._items.length&&(this.updatePagination(),this._tabLabelCount=this._items.length,this._changeDetectorRef.markForCheck()),this._selectedIndexChanged&&(this._scrollToLabel(this._selectedIndex),this._checkScrollingControls(),this._alignInkBarToSelectedTab(),this._selectedIndexChanged=!1,this._changeDetectorRef.markForCheck()),this._scrollDistanceChanged&&(this._updateTabScrollPosition(),this._scrollDistanceChanged=!1,this._changeDetectorRef.markForCheck())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._keyManager?.destroy(),this._destroyed.next(),this._destroyed.complete(),this._stopScrolling.complete()}_handleKeydown(A){if(!Qa(A))switch(A.keyCode){case 13:case 32:if(this.focusIndex!==this.selectedIndex){let i=this._items.get(this.focusIndex);i&&!i.disabled&&(this.selectFocusedIndex.emit(this.focusIndex),this._itemSelected(A))}break;default:this._keyManager?.onKeydown(A)}}_onContentChanges(){let A=this._elementRef.nativeElement.textContent;A!==this._currentTextContent&&(this._currentTextContent=A||"",this._ngZone.run(()=>{this.updatePagination(),this._alignInkBarToSelectedTab(),this._changeDetectorRef.markForCheck()}))}updatePagination(){this._checkPaginationEnabled(),this._checkScrollingControls(),this._updateTabScrollPosition()}get focusIndex(){return this._keyManager?this._keyManager.activeItemIndex:0}set focusIndex(A){!this._isValidIndex(A)||this.focusIndex===A||!this._keyManager||this._keyManager.setActiveItem(A)}_isValidIndex(A){return this._items?!!this._items.toArray()[A]:!0}_setTabFocus(A){if(this._showPaginationControls&&this._scrollToLabel(A),this._items&&this._items.length){this._items.toArray()[A].focus();let i=this._tabListContainer.nativeElement;this._getLayoutDirection()=="ltr"?i.scrollLeft=0:i.scrollLeft=i.scrollWidth-i.offsetWidth}}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_updateTabScrollPosition(){if(this.disablePagination)return;let A=this.scrollDistance,i=this._getLayoutDirection()==="ltr"?-A:A;this._tabList.nativeElement.style.transform=`translateX(${Math.round(i)}px)`,(this._platform.TRIDENT||this._platform.EDGE)&&(this._tabListContainer.nativeElement.scrollLeft=0)}get scrollDistance(){return this._scrollDistance}set scrollDistance(A){this._scrollTo(A)}_scrollHeader(A){let i=this._tabListContainer.nativeElement.offsetWidth,n=(A=="before"?-1:1)*i/3;return this._scrollTo(this._scrollDistance+n)}_handlePaginatorClick(A){this._stopInterval(),this._scrollHeader(A)}_scrollToLabel(A){if(this.disablePagination)return;let i=this._items?this._items.toArray()[A]:null;if(!i)return;let n=this._tabListContainer.nativeElement.offsetWidth,{offsetLeft:o,offsetWidth:a}=i.elementRef.nativeElement,r,s;this._getLayoutDirection()=="ltr"?(r=o,s=r+a):(s=this._tabListInner.nativeElement.offsetWidth-o,r=s-a);let l=this.scrollDistance,g=this.scrollDistance+n;rg&&(this.scrollDistance+=Math.min(s-g,r-l))}_checkPaginationEnabled(){if(this.disablePagination)this._showPaginationControls=!1;else{let A=this._tabListInner.nativeElement.scrollWidth,i=this._elementRef.nativeElement.offsetWidth,n=A-i>=5;n||(this.scrollDistance=0),n!==this._showPaginationControls&&(this._showPaginationControls=n,this._changeDetectorRef.markForCheck())}}_checkScrollingControls(){this.disablePagination?this._disableScrollAfter=this._disableScrollBefore=!0:(this._disableScrollBefore=this.scrollDistance==0,this._disableScrollAfter=this.scrollDistance==this._getMaxScrollDistance(),this._changeDetectorRef.markForCheck())}_getMaxScrollDistance(){let A=this._tabListInner.nativeElement.scrollWidth,i=this._tabListContainer.nativeElement.offsetWidth;return A-i||0}_alignInkBarToSelectedTab(){let A=this._items&&this._items.length?this._items.toArray()[this.selectedIndex]:null,i=A?A.elementRef.nativeElement:null;i?this._inkBar.alignToElement(i):this._inkBar.hide()}_stopInterval(){this._stopScrolling.next()}_handlePaginatorPress(A,i){i&&i.button!=null&&i.button!==0||(this._stopInterval(),Y3(qRA,VRA).pipe(Qt(Ki(this._stopScrolling,this._destroyed))).subscribe(()=>{let{maxScrollDistance:n,distance:o}=this._scrollHeader(A);(o===0||o>=n)&&this._stopInterval()}))}_scrollTo(A){if(this.disablePagination)return{maxScrollDistance:0,distance:0};let i=this._getMaxScrollDistance();return this._scrollDistance=Math.max(0,Math.min(i,A)),this._scrollDistanceChanged=!0,this._checkScrollingControls(),{maxScrollDistance:i,distance:this._scrollDistance}}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,inputs:{disablePagination:[2,"disablePagination","disablePagination",Be],selectedIndex:[2,"selectedIndex","selectedIndex",Cn]},outputs:{selectFocusedIndex:"selectFocusedIndex",indexFocused:"indexFocused"}})}return t})(),ZRA=(()=>{class t extends WRA{_items;_tabListContainer;_tabList;_tabListInner;_nextPaginator;_previousPaginator;_inkBar;ariaLabel;ariaLabelledby;disableRipple=!1;ngAfterContentInit(){this._inkBar=new rF(this._items),super.ngAfterContentInit()}_itemSelected(A){A.preventDefault()}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275cmp=SA({type:t,selectors:[["mat-tab-header"]],contentQueries:function(i,n,o){if(i&1&&jo(o,aiA,4),i&2){let a;ae(a=re())&&(n._items=a)}},viewQuery:function(i,n){if(i&1&&Jt(SRA,7)(kRA,7)(xRA,7)(_RA,5)(RRA,5),i&2){let o;ae(o=re())&&(n._tabListContainer=o.first),ae(o=re())&&(n._tabList=o.first),ae(o=re())&&(n._tabListInner=o.first),ae(o=re())&&(n._nextPaginator=o.first),ae(o=re())&&(n._previousPaginator=o.first)}},hostAttrs:[1,"mat-mdc-tab-header"],hostVars:4,hostBindings:function(i,n){i&2&&RA("mat-mdc-tab-header-pagination-controls-enabled",n._showPaginationControls)("mat-mdc-tab-header-rtl",n._getLayoutDirection()=="rtl")},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],disableRipple:[2,"disableRipple","disableRipple",Be]},features:[mt],ngContentSelectors:gF,decls:13,vars:10,consts:[["previousPaginator",""],["tabListContainer",""],["tabList",""],["tabListInner",""],["nextPaginator",""],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-before",3,"click","mousedown","touchend","matRippleDisabled"],[1,"mat-mdc-tab-header-pagination-chevron"],[1,"mat-mdc-tab-label-container",3,"keydown"],["role","tablist",1,"mat-mdc-tab-list",3,"cdkObserveContent"],[1,"mat-mdc-tab-labels"],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-after",3,"mousedown","click","touchend","matRippleDisabled"]],template:function(i,n){i&1&&(Rt(),B(0,"div",5,0),U("click",function(){return n._handlePaginatorClick("before")})("mousedown",function(a){return n._handlePaginatorPress("before",a)})("touchend",function(){return n._stopInterval()}),hA(2,"div",6),Q(),B(3,"div",7,1),U("keydown",function(a){return n._handleKeydown(a)}),B(5,"div",8,2),U("cdkObserveContent",function(){return n._onContentChanges()}),B(7,"div",9,3),Ve(9),Q()()(),B(10,"div",10,4),U("mousedown",function(a){return n._handlePaginatorPress("after",a)})("click",function(){return n._handlePaginatorClick("after")})("touchend",function(){return n._stopInterval()}),hA(12,"div",6),Q()),i&2&&(RA("mat-mdc-tab-header-pagination-disabled",n._disableScrollBefore),H("matRippleDisabled",n._disableScrollBefore||n.disableRipple),u(3),RA("_mat-animation-noopable",n._animationsDisabled),u(2),te("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby||null),u(5),RA("mat-mdc-tab-header-pagination-disabled",n._disableScrollAfter),H("matRippleDisabled",n._disableScrollAfter||n.disableRipple))},dependencies:[rs,tG],styles:[`.mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mdc-tab-indicator .mdc-tab-indicator__content{transition-duration:var(--mat-tab-animation-duration, 250ms)}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;outline:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-pagination-icon-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1;border-bottom-style:solid;border-bottom-width:var(--mat-tab-divider-height, 1px);border-bottom-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-group-inverted-header .mat-mdc-tab-label-container{border-bottom:none;border-top-style:solid;border-top-width:var(--mat-tab-divider-height, 1px);border-top-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.cdk-drop-list .mat-mdc-tab-labels,.mat-mdc-tab-labels.cdk-drop-list{min-height:var(--mat-tab-container-height, 48px)}.mat-mdc-tab::before{margin:5px}@media(forced-colors: active){.mat-mdc-tab[aria-disabled=true]{color:GrayText}} +`],encapsulation:2})}return t})(),XRA=new kA("MAT_TABS_CONFIG"),iiA=(()=>{class t extends Wl{_host=w(sF);_ngZone=w(qe);_centeringSub=bo.EMPTY;_leavingSub=bo.EMPTY;constructor(){super()}ngOnInit(){super.ngOnInit(),this._centeringSub=this._host._beforeCentering.pipe(Sn(this._host._isCenterPosition())).subscribe(A=>{this._host._content&&A&&!this.hasAttached()&&this._ngZone.run(()=>{Promise.resolve().then(),this.attach(this._host._content)})}),this._leavingSub=this._host._afterLeavingCenter.subscribe(()=>{this._host.preserveContent||this._ngZone.run(()=>this.detach())})}ngOnDestroy(){super.ngOnDestroy(),this._centeringSub.unsubscribe(),this._leavingSub.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matTabBodyHost",""]],features:[mt]})}return t})(),sF=(()=>{class t{_elementRef=w(ce);_dir=w(fo,{optional:!0});_ngZone=w(qe);_injector=w(Dt);_renderer=w(Pi);_diAnimationsDisabled=An();_eventCleanups;_initialized=!1;_fallbackTimer;_positionIndex;_dirChangeSubscription=bo.EMPTY;_position;_previousPosition;_onCentering=new LA;_beforeCentering=new LA;_afterLeavingCenter=new LA;_onCentered=new LA(!0);_portalHost;_contentElement;_content;animationDuration="500ms";preserveContent=!1;set position(A){this._positionIndex=A,this._computePositionAnimationState()}constructor(){if(this._dir){let A=w(wt);this._dirChangeSubscription=this._dir.change.subscribe(i=>{this._computePositionAnimationState(i),A.markForCheck()})}}ngOnInit(){this._bindTransitionEvents(),this._position==="center"&&(this._setActiveClass(!0),Hn(()=>this._onCentering.emit(this._elementRef.nativeElement.clientHeight),{injector:this._injector})),this._initialized=!0}ngOnDestroy(){clearTimeout(this._fallbackTimer),this._eventCleanups?.forEach(A=>A()),this._dirChangeSubscription.unsubscribe()}_bindTransitionEvents(){this._ngZone.runOutsideAngular(()=>{let A=this._elementRef.nativeElement,i=n=>{n.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.remove("mat-tab-body-animating"),n.type==="transitionend"&&this._transitionDone())};this._eventCleanups=[this._renderer.listen(A,"transitionstart",n=>{n.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.add("mat-tab-body-animating"),this._transitionStarted())}),this._renderer.listen(A,"transitionend",i),this._renderer.listen(A,"transitioncancel",i)]})}_transitionStarted(){clearTimeout(this._fallbackTimer);let A=this._position==="center";this._beforeCentering.emit(A),A&&this._onCentering.emit(this._elementRef.nativeElement.clientHeight)}_transitionDone(){this._position==="center"?this._onCentered.emit():this._previousPosition==="center"&&this._afterLeavingCenter.emit()}_setActiveClass(A){this._elementRef.nativeElement.classList.toggle("mat-mdc-tab-body-active",A)}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_isCenterPosition(){return this._positionIndex===0}_computePositionAnimationState(A=this._getLayoutDirection()){this._previousPosition=this._position,this._positionIndex<0?this._position=A=="ltr"?"left":"right":this._positionIndex>0?this._position=A=="ltr"?"right":"left":this._position="center",this._animationsDisabled()?this._simulateTransitionEvents():this._initialized&&(this._position==="center"||this._previousPosition==="center")&&(clearTimeout(this._fallbackTimer),this._fallbackTimer=this._ngZone.runOutsideAngular(()=>setTimeout(()=>this._simulateTransitionEvents(),100)))}_simulateTransitionEvents(){this._transitionStarted(),Hn(()=>this._transitionDone(),{injector:this._injector})}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration==="0ms"||this.animationDuration==="0s"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-tab-body"]],viewQuery:function(i,n){if(i&1&&Jt(iiA,5)(NRA,5),i&2){let o;ae(o=re())&&(n._portalHost=o.first),ae(o=re())&&(n._contentElement=o.first)}},hostAttrs:[1,"mat-mdc-tab-body"],hostVars:1,hostBindings:function(i,n){i&2&&te("inert",n._position==="center"?null:"")},inputs:{_content:[0,"content","_content"],animationDuration:"animationDuration",preserveContent:"preserveContent",position:"position"},outputs:{_onCentering:"_onCentering",_beforeCentering:"_beforeCentering",_onCentered:"_onCentered"},decls:3,vars:6,consts:[["content",""],["cdkScrollable","",1,"mat-mdc-tab-body-content"],["matTabBodyHost",""]],template:function(i,n){i&1&&(B(0,"div",1,0),Et(2,FRA,0,0,"ng-template",2),Q()),i&2&&RA("mat-tab-body-content-left",n._position==="left")("mat-tab-body-content-right",n._position==="right")("mat-tab-body-content-can-animate",n._position==="center"||n._previousPosition==="center")},dependencies:[iiA,W0],styles:[`.mat-mdc-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-mdc-tab-body.mat-mdc-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-mdc-tab-group.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body.mat-mdc-tab-body-active{overflow-y:hidden}.mat-mdc-tab-body-content{height:100%;overflow:auto;transform:none;visibility:hidden}.mat-tab-body-animating>.mat-mdc-tab-body-content,.mat-mdc-tab-body-active>.mat-mdc-tab-body-content{visibility:visible}.mat-tab-body-animating>.mat-mdc-tab-body-content{min-height:1px}.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body-content{overflow:hidden}.mat-tab-body-content-can-animate{transition:transform var(--mat-tab-animation-duration) 1ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable .mat-tab-body-content-can-animate{transition:none}.mat-tab-body-content-left{transform:translate3d(-100%, 0, 0)}.mat-tab-body-content-right{transform:translate3d(100%, 0, 0)} +`],encapsulation:2})}return t})(),lv=(()=>{class t{_elementRef=w(ce);_changeDetectorRef=w(wt);_ngZone=w(qe);_tabsSubscription=bo.EMPTY;_tabLabelSubscription=bo.EMPTY;_tabBodySubscription=bo.EMPTY;_diAnimationsDisabled=An();_allTabs;_tabBodies;_tabBodyWrapper;_tabHeader;_tabs=new xg;_indexToSelect=0;_lastFocusedTabIndex=null;_tabBodyWrapperHeight=0;color;get fitInkBarToContent(){return this._fitInkBarToContent}set fitInkBarToContent(A){this._fitInkBarToContent=A,this._changeDetectorRef.markForCheck()}_fitInkBarToContent=!1;stretchTabs=!0;alignTabs=null;dynamicHeight=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){this._indexToSelect=isNaN(A)?null:A}_selectedIndex=null;headerPosition="above";get animationDuration(){return this._animationDuration}set animationDuration(A){let i=A+"";this._animationDuration=/^\d+$/.test(i)?A+"ms":i}_animationDuration;get contentTabIndex(){return this._contentTabIndex}set contentTabIndex(A){this._contentTabIndex=isNaN(A)?null:A}_contentTabIndex=null;disablePagination=!1;disableRipple=!1;preserveContent=!1;get backgroundColor(){return this._backgroundColor}set backgroundColor(A){let i=this._elementRef.nativeElement.classList;i.remove("mat-tabs-with-background",`mat-background-${this.backgroundColor}`),A&&i.add("mat-tabs-with-background",`mat-background-${A}`),this._backgroundColor=A}_backgroundColor;ariaLabel;ariaLabelledby;selectedIndexChange=new LA;focusChange=new LA;animationDone=new LA;selectedTabChange=new LA(!0);_groupId;_isServer=!w(gi).isBrowser;constructor(){let A=w(XRA,{optional:!0});this._groupId=w(In).getId("mat-tab-group-"),this.animationDuration=A&&A.animationDuration?A.animationDuration:"500ms",this.disablePagination=A&&A.disablePagination!=null?A.disablePagination:!1,this.dynamicHeight=A&&A.dynamicHeight!=null?A.dynamicHeight:!1,A?.contentTabIndex!=null&&(this.contentTabIndex=A.contentTabIndex),this.preserveContent=!!A?.preserveContent,this.fitInkBarToContent=A&&A.fitInkBarToContent!=null?A.fitInkBarToContent:!1,this.stretchTabs=A&&A.stretchTabs!=null?A.stretchTabs:!0,this.alignTabs=A&&A.alignTabs!=null?A.alignTabs:null}ngAfterContentChecked(){let A=this._indexToSelect=this._clampTabIndex(this._indexToSelect);if(this._selectedIndex!=A){let i=this._selectedIndex==null;if(!i){this.selectedTabChange.emit(this._createChangeEvent(A));let n=this._tabBodyWrapper.nativeElement;n.style.minHeight=n.clientHeight+"px"}Promise.resolve().then(()=>{this._tabs.forEach((n,o)=>n.isActive=o===A),i||(this.selectedIndexChange.emit(A),this._tabBodyWrapper.nativeElement.style.minHeight="")})}this._tabs.forEach((i,n)=>{i.position=n-A,this._selectedIndex!=null&&i.position==0&&!i.origin&&(i.origin=A-this._selectedIndex)}),this._selectedIndex!==A&&(this._selectedIndex=A,this._lastFocusedTabIndex=null,this._changeDetectorRef.markForCheck())}ngAfterContentInit(){this._subscribeToAllTabChanges(),this._subscribeToTabLabels(),this._tabsSubscription=this._tabs.changes.subscribe(()=>{let A=this._clampTabIndex(this._indexToSelect);if(A===this._selectedIndex){let i=this._tabs.toArray(),n;for(let o=0;o{i[A].isActive=!0,this.selectedTabChange.emit(this._createChangeEvent(A))})}this._changeDetectorRef.markForCheck()})}ngAfterViewInit(){this._tabBodySubscription=this._tabBodies.changes.subscribe(()=>this._bodyCentered(!0))}_subscribeToAllTabChanges(){this._allTabs.changes.pipe(Sn(this._allTabs)).subscribe(A=>{this._tabs.reset(A.filter(i=>i._closestTabGroup===this||!i._closestTabGroup)),this._tabs.notifyOnChanges()})}ngOnDestroy(){this._tabs.destroy(),this._tabsSubscription.unsubscribe(),this._tabLabelSubscription.unsubscribe(),this._tabBodySubscription.unsubscribe()}realignInkBar(){this._tabHeader&&this._tabHeader._alignInkBarToSelectedTab()}updatePagination(){this._tabHeader&&this._tabHeader.updatePagination()}focusTab(A){let i=this._tabHeader;i&&(i.focusIndex=A)}_focusChanged(A){this._lastFocusedTabIndex=A,this.focusChange.emit(this._createChangeEvent(A))}_createChangeEvent(A){let i=new lF;return i.index=A,this._tabs&&this._tabs.length&&(i.tab=this._tabs.toArray()[A]),i}_subscribeToTabLabels(){this._tabLabelSubscription&&this._tabLabelSubscription.unsubscribe(),this._tabLabelSubscription=Ki(...this._tabs.map(A=>A._stateChanges)).subscribe(()=>this._changeDetectorRef.markForCheck())}_clampTabIndex(A){return Math.min(this._tabs.length-1,Math.max(A||0,0))}_getTabLabelId(A,i){return A.id||`${this._groupId}-label-${i}`}_getTabContentId(A){return`${this._groupId}-content-${A}`}_setTabBodyWrapperHeight(A){if(!this.dynamicHeight||!this._tabBodyWrapperHeight){this._tabBodyWrapperHeight=A;return}let i=this._tabBodyWrapper.nativeElement;i.style.height=this._tabBodyWrapperHeight+"px",this._tabBodyWrapper.nativeElement.offsetHeight&&(i.style.height=A+"px")}_removeTabBodyWrapperHeight(){let A=this._tabBodyWrapper.nativeElement;this._tabBodyWrapperHeight=A.clientHeight,A.style.height="",this._ngZone.run(()=>this.animationDone.emit())}_handleClick(A,i,n){i.focusIndex=n,A.disabled||(this.selectedIndex=n)}_getTabIndex(A){let i=this._lastFocusedTabIndex??this.selectedIndex;return A===i?0:-1}_tabFocusChanged(A,i){A&&A!=="mouse"&&A!=="touch"&&(this._tabHeader.focusIndex=i)}_bodyCentered(A){A&&this._tabBodies?.forEach((i,n)=>i._setActiveClass(n===this._selectedIndex))}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration==="0"||this.animationDuration==="0ms"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-tab-group"]],contentQueries:function(i,n,o){if(i&1&&jo(o,CF,5),i&2){let a;ae(a=re())&&(n._allTabs=a)}},viewQuery:function(i,n){if(i&1&&Jt(LRA,5)(GRA,5)(sF,5),i&2){let o;ae(o=re())&&(n._tabBodyWrapper=o.first),ae(o=re())&&(n._tabHeader=o.first),ae(o=re())&&(n._tabBodies=o)}},hostAttrs:[1,"mat-mdc-tab-group"],hostVars:11,hostBindings:function(i,n){i&2&&(te("mat-align-tabs",n.alignTabs),ro("mat-"+(n.color||"primary")),ut("--mat-tab-animation-duration",n.animationDuration),RA("mat-mdc-tab-group-dynamic-height",n.dynamicHeight)("mat-mdc-tab-group-inverted-header",n.headerPosition==="below")("mat-mdc-tab-group-stretch-tabs",n.stretchTabs))},inputs:{color:"color",fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",Be],stretchTabs:[2,"mat-stretch-tabs","stretchTabs",Be],alignTabs:[0,"mat-align-tabs","alignTabs"],dynamicHeight:[2,"dynamicHeight","dynamicHeight",Be],selectedIndex:[2,"selectedIndex","selectedIndex",Cn],headerPosition:"headerPosition",animationDuration:"animationDuration",contentTabIndex:[2,"contentTabIndex","contentTabIndex",Cn],disablePagination:[2,"disablePagination","disablePagination",Be],disableRipple:[2,"disableRipple","disableRipple",Be],preserveContent:[2,"preserveContent","preserveContent",Be],backgroundColor:"backgroundColor",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"]},outputs:{selectedIndexChange:"selectedIndexChange",focusChange:"focusChange",animationDone:"animationDone",selectedTabChange:"selectedTabChange"},exportAs:["matTabGroup"],features:[Bt([{provide:oiA,useExisting:t}])],ngContentSelectors:gF,decls:9,vars:8,consts:[["tabHeader",""],["tabBodyWrapper",""],["tabNode",""],[3,"indexFocused","selectFocusedIndex","selectedIndex","disableRipple","disablePagination","aria-label","aria-labelledby"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"id","mdc-tab--active","class","disabled","fitInkBarToContent"],[1,"mat-mdc-tab-body-wrapper"],["role","tabpanel",3,"id","class","content","position","animationDuration","preserveContent"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"click","cdkFocusChange","id","disabled","fitInkBarToContent"],[1,"mdc-tab__ripple"],["mat-ripple","",1,"mat-mdc-tab-ripple",3,"matRippleTrigger","matRippleDisabled"],[1,"mdc-tab__content"],[1,"mdc-tab__text-label"],[3,"cdkPortalOutlet"],["role","tabpanel",3,"_onCentered","_onCentering","_beforeCentering","id","content","position","animationDuration","preserveContent"]],template:function(i,n){i&1&&(Rt(),B(0,"mat-tab-header",3,0),U("indexFocused",function(a){return n._focusChanged(a)})("selectFocusedIndex",function(a){return n.selectedIndex=a}),Ue(2,JRA,8,17,"div",4,ri),Q(),O(4,ORA,1,0),B(5,"div",5,1),Ue(7,YRA,1,10,"mat-tab-body",6,ri),Q()),i&2&&(H("selectedIndex",n.selectedIndex||0)("disableRipple",n.disableRipple)("disablePagination",n.disablePagination),Ap("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby),u(2),Te(n._tabs),u(2),Y(n._isServer?4:-1),u(),RA("_mat-animation-noopable",n._animationsDisabled()),u(2),Te(n._tabs))},dependencies:[ZRA,aiA,Db,rs,Wl,sF],styles:[`.mdc-tab{min-width:90px;padding:0 24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;z-index:1;touch-action:manipulation}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab--active .mdc-tab__text-label{transition-delay:100ms}._mat-animation-noopable .mdc-tab__text-label{transition:none}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transition:var(--mat-tab-animation-duration, 250ms) transform cubic-bezier(0.4, 0, 0.2, 1);transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}._mat-animation-noopable .mdc-tab-indicator__content,.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mat-mdc-tab-ripple.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;height:var(--mat-tab-container-height, 48px);font-family:var(--mat-tab-label-text-font, var(--mat-sys-title-small-font));font-size:var(--mat-tab-label-text-size, var(--mat-sys-title-small-size));letter-spacing:var(--mat-tab-label-text-tracking, var(--mat-sys-title-small-tracking));line-height:var(--mat-tab-label-text-line-height, var(--mat-sys-title-small-line-height));font-weight:var(--mat-tab-label-text-weight, var(--mat-sys-title-small-weight))}.mat-mdc-tab.mdc-tab{flex-grow:0}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-tab-active-indicator-height, 2px);border-radius:var(--mat-tab-active-indicator-shape, 0)}.mat-mdc-tab:hover .mdc-tab__text-label{color:var(--mat-tab-inactive-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab:focus .mdc-tab__text-label{color:var(--mat-tab-inactive-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-active-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-active-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-active-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-hover-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-active-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-focus-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-disabled-ripple-color, var(--mat-sys-on-surface-variant))}.mat-mdc-tab .mdc-tab__ripple::before{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-inactive-label-text-color, var(--mat-sys-on-surface));display:inline-flex;align-items:center}.mat-mdc-tab .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-group.mat-mdc-tab-group-stretch-tabs>.mat-mdc-tab-header .mat-mdc-tab{flex-grow:1}.mat-mdc-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-background-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-focus-indicator::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-focus-indicator::before{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mdc-tab__ripple::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header{flex-direction:column-reverse}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header .mdc-tab-indicator__content--underline{align-self:flex-start}.mat-mdc-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important} +`],encapsulation:2})}return t})(),lF=class{index;tab};var $RA=["consoleArea"];function ANA(t,e){t&1&&hA(0,"mat-progress-bar",3)}var _3=class t{constructor(e,A){this.dialogRef=e;this.data=A}consoleOutput=bA("");isLoading=bA(!0);subscription;consoleArea;ngOnInit(){this.subscription=this.data.output$.subscribe({next:e=>{this.consoleOutput.update(A=>A+e),this.scrollToBottom()},complete:()=>{this.isLoading.set(!1)}})}ngOnDestroy(){this.subscription?.unsubscribe()}scrollToBottom(){setTimeout(()=>{if(this.consoleArea){let e=this.consoleArea.nativeElement;e.scrollTop=e.scrollHeight}},0)}close(){this.dialogRef.close()}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-console-dialog"]],viewQuery:function(A,i){if(A&1&&Jt($RA,5),A&2){let n;ae(n=re())&&(i.consoleArea=n.first)}},decls:11,vars:3,consts:[["consoleArea",""],["mat-dialog-title",""],[1,"mat-typography"],["mode","indeterminate",2,"margin-bottom","8px"],[1,"console-box"],["align","end"],["mat-button","",3,"click"]],template:function(A,i){A&1&&(B(0,"h2",1),y(1),Q(),B(2,"mat-dialog-content",2),O(3,ANA,1,0,"mat-progress-bar",3),B(4,"div",4,0)(6,"pre"),y(7),Q()()(),B(8,"mat-dialog-actions",5)(9,"button",6),U("click",function(){return i.close()}),y(10,"Close"),Q()()),A&2&&(u(),lA(i.data.title),u(2),Y(i.isLoading()?3:-1),u(4),lA(i.consoleOutput()))},dependencies:[li,qi,pi,Xc,fa,pa,Na,IQ,CQ],styles:[".console-box[_ngcontent-%COMP%]{background-color:#1e1e1e;color:#dcdcdc;padding:16px;border-radius:4px;min-height:200px;flex:1;overflow-y:auto;font-family:Roboto Mono,monospace;font-size:12px}.console-box[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{margin:0;white-space:pre-wrap;word-wrap:break-word} .mat-mdc-dialog-content{max-height:70vh!important;overflow:hidden!important;display:flex;flex-direction:column}"]})};function eNA(t,e){t&1&&(B(0,"div",7),hA(1,"mat-spinner",8),Q())}var R3=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.inputValue=A.value}inputValue;loading=bA(!1);onCancel(){this.dialogRef.close()}onSubmitClick(){this.inputValue&&(this.loading.set(!0),this.data.onSubmit(this.inputValue).subscribe({next:()=>{this.loading.set(!1),this.dialogRef.close(!0)},error:e=>{this.loading.set(!1),window.alert(`Operation failed: ${e.message||e}`)}}))}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-prompt-dialog"]],decls:13,vars:7,consts:[["mat-dialog-title",""],[1,"full-width"],["matInput","",3,"ngModelChange","ngModel","disabled"],["class","spinner-container",4,"ngIf"],["align","end"],["mat-button","",3,"click","disabled"],["mat-button","","color","primary",3,"click","disabled"],[1,"spinner-container"],["diameter","40"]],template:function(A,i){A&1&&(B(0,"h2",0),y(1),Q(),B(2,"mat-dialog-content")(3,"mat-form-field",1)(4,"mat-label"),y(5),Q(),B(6,"input",2),Di("ngModelChange",function(o){return Bi(i.inputValue,o)||(i.inputValue=o),o}),Q()(),Et(7,eNA,2,0,"div",3),Q(),B(8,"mat-dialog-actions",4)(9,"button",5),U("click",function(){return i.onCancel()}),y(10,"Cancel"),Q(),B(11,"button",6),U("click",function(){return i.onSubmitClick()}),y(12,"Submit"),Q()()),A&2&&(u(),lA(i.data.title),u(4),lA(i.data.label),u(),wi("ngModel",i.inputValue),H("disabled",i.loading()),u(),H("ngIf",i.loading()),u(2),H("disabled",i.loading()),u(2),H("disabled",i.loading()||!i.inputValue))},dependencies:[li,Js,Xc,fa,pa,Na,qi,pi,Ya,Ko,vs,Ps,ua,E2,gs,ln,Dn,yn,ko],styles:[".full-width[_ngcontent-%COMP%]{width:100%}.spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:16px}"]})};function tNA(t,e){t&1&&(B(0,"div",6)(1,"mat-icon"),y(2,"assignment_late"),Q(),B(3,"span"),y(4,"No tests found for this agent."),Q()())}function iNA(t,e){t&1&&(B(0,"th",13),y(1," Test Name "),Q())}function nNA(t,e){if(t&1&&(B(0,"td",14),y(1),Q()),t&2){let A=e.$implicit;u(),ue(" ",A.replace(".json","")," ")}}function oNA(t,e){t&1&&(B(0,"th",13),y(1," Actions "),Q())}function aNA(t,e){if(t&1){let A=QA();B(0,"td",14)(1,"button",15),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.runTest(n))}),B(2,"mat-icon"),y(3,"play_arrow"),Q()(),B(4,"button",16),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.rebuildTest(n))}),B(5,"mat-icon"),y(6,"sync"),Q()(),B(7,"button",17),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.renameTest(n))}),B(8,"mat-icon"),y(9,"edit"),Q()(),B(10,"button",18),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.deleteTest(n))}),B(11,"mat-icon"),y(12,"delete"),Q()()()}if(t&2){let A=p(2);u(),H("disabled",A.isRunning()||A.isRebuilding()),u(3),H("disabled",A.isRunning()||A.isRebuilding()),u(3),H("disabled",A.isRunning()||A.isRebuilding()),u(3),H("disabled",A.isRunning()||A.isRebuilding())}}function rNA(t,e){if(t&1){let A=QA();B(0,"tr",19),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.selectTest(n))}),Q()}if(t&2){let A=e.$implicit,i=p(2);RA("selected-row",A===i.selectedTest())}}function sNA(t,e){if(t&1&&(B(0,"table",7),Dl(1,8),Et(2,iNA,2,0,"th",9)(3,nNA,2,1,"td",10),yl(),Dl(4,11),Et(5,oNA,2,0,"th",9)(6,aNA,13,4,"td",10),yl(),Et(7,rNA,1,2,"tr",12),Q()),t&2){let A=p();H("dataSource",A.dataSource),u(7),H("matRowDefColumns",A.displayedColumns)}}var gv=class t{appName=me("");sessionId=me("");userId=me("");isViewOnlySession=me(!1);testsService=w(u2);dialog=w(Or);sessionService=w(Al);dataSource=new Td([]);consoleOutput=bA("");selectedTest=bA(null);testSelected=ui();isRunning=bA(!1);isRebuilding=bA(!1);displayedColumns=["name","actions"];ngOnInit(){this.loadTests()}ngOnChanges(e){e.appName&&!e.appName.isFirstChange()&&this.loadTests()}loadTests(){this.appName()&&this.testsService.listTests(this.appName()).subscribe(e=>{this.dataSource.data=e})}selectTest(e){this.selectedTest.set(e),this.testsService.getTest(this.appName(),e).subscribe(A=>{this.testSelected.emit({testName:e,events:A.events||[]})})}promoteCurrentSessionToTest(){this.sessionId()&&this.sessionService.getSession(this.userId(),this.appName(),this.sessionId()).subscribe(e=>{let i=(e.state?.__session_metadata__?.displayName||this.sessionId()).replace(/ /g,"_").replace(/[^a-zA-Z0-9_-]/g,""),n={events:e.events};this.dialog.open(R3,{data:{title:"Add Current Session as Test",label:"Test Name",value:i,onSubmit:o=>this.testsService.createTest(this.appName(),o,n).pipe(hi(()=>this.testsService.rebuildTests(this.appName(),o)))}}).afterClosed().subscribe(o=>{o&&this.loadTests()})})}renameTest(e){this.dialog.open(R3,{data:{title:"Rename Test",label:"New Name",value:e.replace(".json",""),onSubmit:A=>{let i=A.replace(/ /g,"_").replace(/[^a-zA-Z0-9_-]/g,"");return this.testsService.getTest(this.appName(),e).pipe(hi(n=>this.testsService.createTest(this.appName(),i,n)),hi(()=>this.testsService.deleteTest(this.appName(),e)))}}}).afterClosed().subscribe(A=>{A&&this.loadTests()})}runAllTests(){this.runTest()}runTest(e){this.isRunning.set(!0);let A=new ie;this.dialog.open(_3,{width:"90vw",maxWidth:"1200px",height:"80vh",data:{title:`Running ${e||"all tests"}`,output$:A.asObservable()}}),this.testsService.runTests(this.appName(),e).subscribe({next:i=>{A.next(i)},error:i=>{A.next(` +Error: ${i.message||i}`),this.isRunning.set(!1),A.complete()},complete:()=>{this.isRunning.set(!1),A.complete()}})}deleteTest(e){confirm(`Are you sure you want to delete test ${e}?`)&&this.testsService.deleteTest(this.appName(),e).subscribe(()=>{this.loadTests()})}rebuildAllTests(){this.rebuildTest()}rebuildTest(e){this.isRebuilding.set(!0);let A=new ie;this.dialog.open(_3,{width:"90vw",maxWidth:"1200px",height:"80vh",data:{title:`Rebuilding ${e||"all tests"}`,output$:A.asObservable()}}),A.next(`Rebuilding tests... +`),this.testsService.rebuildTests(this.appName(),e).subscribe({next:()=>{A.next(`Successfully rebuilt tests. +`),this.isRebuilding.set(!1),this.loadTests(),A.complete()},error:i=>{A.next(`Error rebuilding tests: ${i.message||i} +`),this.isRebuilding.set(!1),A.complete()}})}clearConsole(){this.consoleOutput.set("")}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-tests-tab"]],inputs:{appName:[1,"appName"],sessionId:[1,"sessionId"],userId:[1,"userId"],isViewOnlySession:[1,"isViewOnlySession"]},outputs:{testSelected:"testSelected"},features:[Yt],decls:20,vars:4,consts:[[1,"tests-container"],[1,"toolbar"],["mat-button","","color","primary",3,"click","disabled"],["mat-button","","color","accent",3,"click","disabled"],[1,"spacer"],["mat-icon-button","","matTooltip","Refresh",3,"click"],[1,"empty-state"],["mat-table","",1,"tests-table",3,"dataSource"],["matColumnDef","name"],["mat-header-cell","",4,"matHeaderCellDef"],["mat-cell","",4,"matCellDef"],["matColumnDef","actions"],["mat-row","",3,"selected-row","click",4,"matRowDef","matRowDefColumns"],["mat-header-cell",""],["mat-cell",""],["mat-icon-button","","color","primary","matTooltip","Run Test",3,"click","disabled"],["mat-icon-button","","color","accent","matTooltip","Rebuild Test",3,"click","disabled"],["mat-icon-button","","color","primary","matTooltip","Rename Test",3,"click","disabled"],["mat-icon-button","","color","warn","matTooltip","Delete Test",3,"click","disabled"],["mat-row","",3,"click"]],template:function(A,i){A&1&&(B(0,"div",0)(1,"div",1)(2,"button",2),U("click",function(){return i.promoteCurrentSessionToTest()}),B(3,"mat-icon"),y(4,"add"),Q(),y(5," From Current Session "),Q(),B(6,"button",2),U("click",function(){return i.runAllTests()}),B(7,"mat-icon"),y(8,"playlist_play"),Q(),y(9," Run All "),Q(),B(10,"button",3),U("click",function(){return i.rebuildAllTests()}),B(11,"mat-icon"),y(12,"sync"),Q(),y(13," Rebuild All "),Q(),hA(14,"span",4),B(15,"button",5),U("click",function(){return i.loadTests()}),B(16,"mat-icon"),y(17,"refresh"),Q()()(),O(18,tNA,5,0,"div",6)(19,sNA,8,2,"table",7),Q()),A&2&&(u(2),H("disabled",!i.sessionId()||i.isViewOnlySession()),u(4),H("disabled",i.isRunning()||i.isRebuilding()||i.dataSource.data.length===0),u(4),H("disabled",i.isRunning()||i.isRebuilding()||i.dataSource.data.length===0),u(8),Y(i.dataSource.data.length===0?18:19))},dependencies:[li,qi,pi,ji,Tn,Wt,TtA,YtA,OtA,HtA,JtA,ztA,PtA,jtA,Fa,dn,E2,IQ,Xc],styles:[".tests-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;box-sizing:border-box}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 10px;background-color:var(--mat-sys-surface-container);border-bottom:1px solid var(--mat-sys-outline-variant);gap:8px}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%]{flex:1 1 auto}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{height:32px!important;line-height:normal!important;border-radius:16px!important;font-size:13px!important;font-weight:500!important;display:inline-flex!important;align-items:center;justify-content:center}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%]{padding:0 12px!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:4px!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%]{width:32px!important;min-width:32px!important;padding:0!important;border-radius:50%!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:0!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple{width:32px!important;height:32px!important;border-radius:50%!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important;vertical-align:middle}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{vertical-align:middle}.tests-container[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px;color:var(--mat-sys-on-surface-variant);font-style:italic;gap:8px}.tests-container[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%]{width:100%;background:transparent;border-top:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{font-weight:600}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:middle;padding:6px 16px;border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr.mat-header-row[_ngcontent-%COMP%]{display:none}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]{cursor:pointer;background:transparent}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover td.mat-column-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{opacity:1}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr.selected-row[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high, #e0e0e0)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] td.mat-column-actions[_ngcontent-%COMP%]{text-align:right}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] td.mat-column-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%]{margin-top:16px;display:flex;flex-direction:column;gap:8px;flex:1;min-height:200px}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;font-size:1.1rem;font-weight:600}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-size:.9rem;color:var(--mat-sys-on-surface-variant)}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-actions[_ngcontent-%COMP%] .running-status[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_pulse 1.5s infinite}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]{background-color:#1e1e1e;color:#d4d4d4;padding:12px;border-radius:4px;font-family:Courier New,Courier,monospace;font-size:.85rem;overflow:auto;flex:1;margin:0;white-space:pre-wrap;word-break:break-all;border:1px solid #333}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar{width:8px;height:8px}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover{background:#777}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:#1e1e1e}@keyframes _ngcontent-%COMP%_pulse{0%{opacity:.6}50%{opacity:1}to{opacity:.6}}"]})};var lNA={stateIsEmpty:"State is empty"},riA=new kA("State Tab Messages",{factory:()=>lNA});function gNA(t,e){if(t&1&&(B(0,"div",1),y(1),Q()),t&2){let A=p();u(),lA(A.i18n.stateIsEmpty)}}function cNA(t,e){if(t&1&&(B(0,"div"),hA(1,"ngx-json-viewer",2),Q()),t&2){let A=p();u(),H("json",A.sessionState)}}var cv=class t{sessionState;i18n=w(riA);get isEmptyState(){return!this.sessionState||Object.keys(this.sessionState).length===0}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-state-tab"]],inputs:{sessionState:"sessionState"},decls:3,vars:1,consts:[[1,"state-wrapper"],[1,"empty-state"],[3,"json"]],template:function(A,i){A&1&&(B(0,"div",0),O(1,gNA,2,1,"div",1)(2,cNA,2,1,"div"),Q()),A&2&&(u(),Y(i.isEmptyState?1:2))},dependencies:[cs,$l],styles:[".state-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;margin-top:16px}.state-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{text-align:center;font-style:italic}"]})};var CNA=(t,e)=>e.span_id;function INA(t,e){if(t&1){let A=QA();B(0,"span",20)(1,"a",24),U("click",function(){let n;T(A);let o=p(3);return J(o.selectSpanById((n=o.selectedSpan())==null?null:n.parent_span_id))}),y(2),Q(),B(3,"button",21),U("click",function(){let n;T(A);let o=p(3);return J(o.copyToClipboard((n=o.selectedSpan())==null?null:n.parent_span_id))}),B(4,"mat-icon"),y(5),Q()()()}if(t&2){let A,i,n,o=p(3);u(),H("matTooltip",((A=o.selectedSpan())==null?null:A.parent_span_id)||""),u(),lA((i=o.selectedSpan())==null?null:i.parent_span_id),u(3),lA(o.copiedId===((n=o.selectedSpan())==null?null:n.parent_span_id)?"check":"content_copy")}}function dNA(t,e){t&1&&y(0," None ")}function BNA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2),Q(),B(3,"td")(4,"span",20)(5,"a",24),U("click",function(){let n=T(A).$implicit,o=p(4);return J(o.selectSpanById(n.span_id))}),y(6),Q(),B(7,"button",21),U("click",function(){let n=T(A).$implicit,o=p(4);return J(o.copyToClipboard(n.span_id))}),B(8,"mat-icon"),y(9),Q()()()()()}if(t&2){let A=e.$implicit,i=p(4);u(2),lA(A.name),u(3),H("matTooltip",A.span_id),u(),lA(A.span_id),u(3),lA(i.copiedId===A.span_id?"check":"content_copy")}}function ENA(t,e){if(t&1&&(B(0,"table",22),Ue(1,BNA,10,4,"tr",null,CNA),Q()),t&2){let A=p(3);u(),Te(A.selectedSpanChildren)}}function hNA(t,e){if(t&1){let A=QA();B(0,"table",23)(1,"tr")(2,"td"),y(3,"Event ID"),Q(),B(4,"td")(5,"span",20)(6,"a",24),U("click",function(){T(A);let n=p(3);return J(n.switchToEvent.emit(n.selectedSpan().attributes["gcp.vertex.agent.event_id"]))}),y(7),Q(),B(8,"button",21),U("click",function(){T(A);let n=p(3);return J(n.copyToClipboard(n.selectedSpan().attributes["gcp.vertex.agent.event_id"]))}),B(9,"mat-icon"),y(10),Q()()()()()()}if(t&2){let A=p(3);u(6),H("matTooltip",A.selectedSpan().attributes["gcp.vertex.agent.event_id"]||""),u(),lA(A.selectedSpan().attributes["gcp.vertex.agent.event_id"]),u(3),lA(A.copiedId===A.selectedSpan().attributes["gcp.vertex.agent.event_id"]?"check":"content_copy")}}function QNA(t,e){if(t&1){let A=QA();B(0,"div",13)(1,"table",15)(2,"tr")(3,"td"),y(4,"Name"),Q(),B(5,"td")(6,"span",16)(7,"span",17),y(8),Q(),B(9,"button",18),U("click",function(){let n;T(A);let o=p(2);return J(o.copyToClipboard((n=o.selectedSpan())==null?null:n.name))}),B(10,"mat-icon"),y(11),Q()()()()(),B(12,"tr")(13,"td"),y(14,"Span ID"),Q(),B(15,"td",19)(16,"span",20)(17,"span",17),y(18),Q(),B(19,"button",21),U("click",function(){let n;T(A);let o=p(2);return J(o.copyToClipboard((n=o.selectedSpan())==null?null:n.span_id))}),B(20,"mat-icon"),y(21),Q()()()()(),B(22,"tr")(23,"td"),y(24,"Parent ID"),Q(),B(25,"td"),O(26,INA,6,3,"span",20)(27,dNA,1,0),Q()(),B(28,"tr")(29,"td"),y(30,"Trace ID"),Q(),B(31,"td",19)(32,"span",20)(33,"span",17),y(34),Q(),B(35,"button",21),U("click",function(){let n;T(A);let o=p(2);return J(o.copyToClipboard((n=o.selectedSpan())==null?null:n.trace_id))}),B(36,"mat-icon"),y(37),Q()()()()(),B(38,"tr")(39,"td"),y(40,"Start Time"),Q(),B(41,"td")(42,"span",16)(43,"span",17),y(44),Q(),B(45,"button",18),U("click",function(){let n;T(A);let o=p(2);return J(o.copyToClipboard(o.formatTime((n=o.selectedSpan())==null?null:n.start_time),"startTime"))}),B(46,"mat-icon"),y(47),Q()()()()(),B(48,"tr")(49,"td"),y(50,"End Time"),Q(),B(51,"td")(52,"span",16)(53,"span",17),y(54),Q(),B(55,"button",18),U("click",function(){let n;T(A);let o=p(2);return J(o.copyToClipboard(o.formatTime((n=o.selectedSpan())==null?null:n.end_time),"endTime"))}),B(56,"mat-icon"),y(57),Q()()()()()(),O(58,ENA,3,0,"table",22),O(59,hNA,11,3,"table",23),Q()}if(t&2){let A,i,n,o,a,r,s,l,g,C,I,d,h,E,f,m=p(2);u(7),H("matTooltip",((A=m.selectedSpan())==null?null:A.name)||""),u(),lA((i=m.selectedSpan())==null?null:i.name),u(3),lA(m.copiedId===((n=m.selectedSpan())==null?null:n.name)?"check":"content_copy"),u(6),H("matTooltip",((o=m.selectedSpan())==null?null:o.span_id)||""),u(),lA((a=m.selectedSpan())==null?null:a.span_id),u(3),lA(m.copiedId===((r=m.selectedSpan())==null?null:r.span_id)?"check":"content_copy"),u(5),Y((s=m.selectedSpan())!=null&&s.parent_span_id?26:27),u(7),H("matTooltip",((l=m.selectedSpan())==null?null:l.trace_id)||""),u(),lA((g=m.selectedSpan())==null?null:g.trace_id),u(3),lA(m.copiedId===((C=m.selectedSpan())==null?null:C.trace_id)?"check":"content_copy"),u(6),H("matTooltip",m.formatTime((I=m.selectedSpan())==null?null:I.start_time)),u(),lA(m.formatTime((d=m.selectedSpan())==null?null:d.start_time)),u(3),lA(m.copiedId==="startTime"?"check":"content_copy"),u(6),H("matTooltip",m.formatTime((h=m.selectedSpan())==null?null:h.end_time)),u(),lA(m.formatTime((E=m.selectedSpan())==null?null:E.end_time)),u(3),lA(m.copiedId==="endTime"?"check":"content_copy"),u(),Y(m.selectedSpanChildren.length>0?58:-1),u(),Y((f=m.selectedSpan())!=null&&f.attributes&&m.selectedSpan().attributes["gcp.vertex.agent.event_id"]?59:-1)}}function uNA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2),Q(),B(3,"td")(4,"span",16)(5,"span"),y(6),Q(),B(7,"button",18),U("click",function(){let n,o=T(A).$implicit,a=p(4);return J(a.copyToClipboard((n=a.selectedSpan().attributes[o])==null?null:n.toString()))}),B(8,"mat-icon"),y(9),Q()()()()()}if(t&2){let A,i=e.$implicit,n=p(4);u(2),lA(i),u(4),lA(n.selectedSpan().attributes[i]),u(3),lA(n.copiedId===((A=n.selectedSpan().attributes[i])==null?null:A.toString())?"check":"content_copy")}}function fNA(t,e){if(t&1&&(B(0,"table",15),Ue(1,uNA,10,3,"tr",null,ri),Q()),t&2){let A=p(3);u(),Te(A.Object.keys(A.selectedSpan().attributes))}}function pNA(t,e){t&1&&(B(0,"div",1),y(1,"No attributes available"),Q())}function mNA(t,e){if(t&1&&(B(0,"div",13),O(1,fNA,3,0,"table",15)(2,pNA,2,0,"div",1),Q()),t&2){let A,i=p(2);u(),Y((A=i.selectedSpan())!=null&&A.attributes&&i.Object.keys(i.selectedSpan().attributes).length>0?1:2)}}function wNA(t,e){if(t&1){let A=QA();B(0,"div",14),hA(1,"ngx-json-viewer",25),B(2,"button",26),U("click",function(){T(A);let n=p(2);return J(n.copyJsonToClipboard(n.selectedSpan(),"raw"))}),B(3,"mat-icon"),y(4),Q()()()}if(t&2){let A=p(2);u(),H("json",A.selectedSpan()),u(3),lA(A.copiedId==="raw"?"check":"content_copy")}}function DNA(t,e){if(t&1){let A=QA();B(0,"div",0)(1,"div",2)(2,"mat-paginator",3),U("page",function(n){T(A);let o=p();return J(o.onPage(n))}),Q(),B(3,"div",4),y(4),Q(),hA(5,"div",5),B(6,"button",6),U("click",function(){T(A);let n=p();return J(n.traceService.selectedRow(void 0))}),B(7,"mat-icon"),y(8,"remove_selection"),Q()()(),B(9,"div",7)(10,"div",8)(11,"button",9),U("click",function(){T(A);let n=p();return J(n.selectedDetailTab.set("info"))}),B(12,"mat-icon"),y(13,"info"),Q()(),B(14,"button",10),U("click",function(){T(A);let n=p();return J(n.selectedDetailTab.set("attributes"))}),B(15,"mat-icon"),y(16,"list_alt"),Q()(),B(17,"button",11),U("click",function(){T(A);let n=p();return J(n.selectedDetailTab.set("raw"))}),B(18,"mat-icon"),y(19,"data_object"),Q()()(),B(20,"div",12),O(21,QNA,60,18,"div",13),O(22,mNA,3,1,"div",13),O(23,wNA,5,2,"div",14),Q()()()}if(t&2){let A,i=p();u(2),H("length",i.orderedTraceData.length)("pageSize",1)("pageIndex",i.selectedSpanIndex),u(2),ue(" ",(A=i.selectedSpan())==null?null:A.name," "),u(7),RA("active",i.selectedDetailTab()==="info"),u(3),RA("active",i.selectedDetailTab()==="attributes"),u(3),RA("active",i.selectedDetailTab()==="raw"),u(4),Y(i.selectedDetailTab()==="info"?21:-1),u(),Y(i.selectedDetailTab()==="attributes"?22:-1),u(),Y(i.selectedDetailTab()==="raw"?23:-1)}}function yNA(t,e){t&1&&(B(0,"div",1),y(1,"Select a trace span to view its details"),Q())}var IF=class t extends b1{nextPageLabel="Next Span";previousPageLabel="Previous Span";firstPageLabel="First Span";lastPageLabel="Last Span";getRangeLabel=(e,A,i)=>i===0?"Span 0 of 0":(i=Math.max(i,0),`Span ${e*A+1} of ${i}`);static \u0275fac=(()=>{let e;return function(i){return(e||(e=bi(t)))(i||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac})},Cv=class t{_traceData=[];orderedTraceData=[];set traceData(e){this._traceData=e||[],this.orderedTraceData=this.computeOrdered(this._traceData)}get traceData(){return this._traceData}computeOrdered(e){let A=e.map(a=>gA({},a)),i=new Map,n=[];A.forEach(a=>i.set(a.span_id,a)),A.forEach(a=>{if(a.parent_span_id&&i.has(a.parent_span_id)){let r=i.get(a.parent_span_id);r.children=r.children||[],r.children.push(a)}else n.push(a)});let o=a=>a.flatMap(r=>[r,...r.children?o(r.children):[]]);return o(n)}traceService=w(Ag);selectedSpan=Ar(this.traceService.selectedTraceRow$);static getValidTraceTab(e){return e==="info"||e==="attributes"||e==="raw"?e:"info"}selectedDetailTab=bA(t.getValidTraceTab(localStorage.getItem("adk-trace-tab-selected-tab")));switchToEvent=ui();constructor(){Ao(()=>{localStorage.setItem("adk-trace-tab-selected-tab",this.selectedDetailTab())})}formatTime(e){return e?new Date(e/1e6).toLocaleString():"N/A"}get selectedSpanChildren(){let e=this.selectedSpan();return e?e.children&&e.children.length>0?e.children:this.traceData.filter(A=>A.parent_span_id===e.span_id):[]}selectSpanById(e){if(!e)return;let A=this.traceData.find(i=>String(i.span_id)===String(e));A&&this.traceService.selectedRow(A)}get selectedSpanIndex(){let e=this.selectedSpan();if(!e)return;let A=this.orderedTraceData.findIndex(i=>i.span_id===e.span_id);return A===-1?void 0:A}onPage(e){e.pageIndex>=0&&e.pageIndex=this.orderedTraceData.length?0:this.selectedSpanIndex+1:i=this.selectedSpanIndex-1<0?this.orderedTraceData.length-1:this.selectedSpanIndex-1,this.traceService.selectedRow(this.orderedTraceData[i])}Object=Object;copiedId=null;copyToClipboard(e,A){e&&navigator.clipboard.writeText(e).then(()=>{this.copiedId=A||e,setTimeout(()=>this.copiedId=null,2e3)})}copyJsonToClipboard(e,A){if(!e)return;let i=JSON.stringify(e,null,2);navigator.clipboard.writeText(i).then(()=>{this.copiedId=A,setTimeout(()=>this.copiedId=null,2e3)})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-trace-tab"]],hostBindings:function(A,i){A&1&&U("keydown",function(o){return i.handleKeyboardNavigation(o)},ZC)},inputs:{traceData:"traceData"},outputs:{switchToEvent:"switchToEvent"},features:[Bt([{provide:b1,useClass:IF}])],decls:2,vars:1,consts:[[1,"event-details-container"],[1,"empty-state"],[1,"event-details-header"],["hidePageSize","","aria-label","Select span",1,"event-paginator",3,"page","length","pageSize","pageIndex"],[1,"span-title"],[2,"flex-grow","1"],["mat-icon-button","","matTooltip","Clear selection",3,"click"],[1,"event-details-content"],[1,"vertical-tabs-sidebar"],["mat-icon-button","","matTooltip","Info","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Attributes","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Raw JSON","matTooltipPosition","right",3,"click"],[1,"vertical-tabs-content"],[1,"info-tables-container"],[1,"json-viewer-container","json-viewer-wrapper"],["app-info-table",""],[1,"value-cell"],[3,"matTooltip"],["mat-icon-button","","matTooltip","Copy",1,"copy-value-button",3,"click"],[1,"id-text"],[1,"id-cell"],["mat-icon-button","","matTooltip","Copy",1,"copy-id-button",3,"click"],["app-info-table","","title","Children"],["app-info-table","","title","Events"],["href","javascript:void(0)",1,"span-link","id-text",3,"click","matTooltip"],[3,"json"],["mat-icon-button","","matTooltip","Copy JSON",1,"floating-copy-button",3,"click"]],template:function(A,i){A&1&&O(0,DNA,24,13,"div",0)(1,yNA,2,0,"div",1),A&2&&Y(i.selectedSpan()!==void 0?0:1)},dependencies:[qi,ji,Tn,Wt,Fa,dn,cs,$l,n6,OI],styles:["[_nghost-%COMP%]{display:block;height:100%}.json-viewer-container[_ngcontent-%COMP%]{margin:10px}.event-paginator[_ngcontent-%COMP%]{display:flex;justify-content:center;background-color:transparent}.event-paginator[_ngcontent-%COMP%] .mat-mdc-paginator-range-label{order:2;margin:0 0 0 8px}.span-title[_ngcontent-%COMP%]{font-weight:500;font-family:Google Sans Mono,monospace;font-size:13px;color:var(--mat-sys-on-surface);text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:300px;margin-left:16px}.event-details-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.event-details-content[_ngcontent-%COMP%]{display:flex;flex:1;overflow:hidden}.vertical-tabs-sidebar[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:48px;border-right:1px solid var(--mat-sys-outline-variant);padding-top:8px;align-items:center;gap:8px}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.vertical-tabs-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto}.event-details-header[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant);height:48px;flex-shrink:0}.empty-state[_ngcontent-%COMP%]{padding:16px;text-align:center;color:var(--mat-sys-on-surface-variant);font-style:italic;font-size:14px}.info-tables-container[_ngcontent-%COMP%]{padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:24px}.span-link[_ngcontent-%COMP%]{color:var(--mat-sys-primary);text-decoration:none;cursor:pointer}.span-link[_ngcontent-%COMP%]:hover{text-decoration:underline}.id-text[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:11px}.id-cell[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;overflow:hidden}.id-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child, .value-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.id-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .id-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%]{opacity:1}.copy-id-button[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%]{width:28px!important;height:28px!important;padding:0!important;line-height:28px!important;flex-shrink:0;margin:-4px 0!important;opacity:0;transition:opacity .2s ease-in-out;border-radius:4px!important;overflow:hidden!important}.copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.copy-id-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.json-viewer-wrapper[_ngcontent-%COMP%]{position:relative}.json-viewer-wrapper[_ngcontent-%COMP%]:hover .floating-copy-button[_ngcontent-%COMP%]{opacity:1}.floating-copy-button[_ngcontent-%COMP%]{position:absolute;top:4px;right:4px;z-index:10;opacity:0;transition:opacity .2s ease-in-out;background-color:var(--mat-sys-surface-container-high)!important;border-radius:4px!important;overflow:hidden!important;width:28px!important;height:28px!important;line-height:28px!important;padding:0!important}.floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.floating-copy-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.floating-copy-button[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}"]})};var vNA={agentDevelopmentKitLabel:"Agent Development Kit",disclosureTooltip:"ADK Web is for development purposes. It has access to all the data and should not be used in production.",collapsePanelTooltip:"Collapse panel",eventsTabLabel:"Events",stateTabLabel:"State",artifactsTabLabel:"Artifacts",sessionsTabLabel:"Sessions",evalTabLabel:"Evals",testsTabLabel:"Tests",selectEventAriaLabel:"Select event",infoTabLabel:"Info",graphTabLabel:"Graph",requestDetailsTabLabel:"Request",responseDetailsTabLabel:"Response",responseIsNotAvailable:"Response is not available",requestIsNotAvailable:"Request is not available",clearSelectionButtonLabel:"Remove selection"},pQ=new kA("Side Panel Messages",{factory:()=>vNA});var bNA=["eventMenuTrigger"],MNA=["graphContainer"],SNA=(t,e)=>e.span_id,kNA=(t,e)=>e.modality,xNA=(t,e)=>e.id,_NA=(t,e)=>e.key;function RNA(t,e){if(t&1){let A=QA();B(0,"button",10),U("click",function(){T(A);let n=p();return J(n.selectedDetailTab="graph")}),B(1,"mat-icon"),y(2,"account_tree"),Q()()}if(t&2){let A=p();RA("active",A.selectedDetailTab==="graph"),H("matTooltip",XC(A.i18n.graphTabLabel))}}function NNA(t,e){if(t&1){let A=QA();B(0,"div",30),hA(1,"ngx-json-viewer",31),B(2,"button",32),U("click",function(){T(A);let n=p(3);return J(n.copyJsonToClipboard(n.selectedEvent().nodeInfo.outputFor,"nodeInfo.outputFor"))}),B(3,"mat-icon"),y(4),Q()()()}if(t&2){let A=p(3);u(),H("json",A.selectedEvent().nodeInfo.outputFor),u(3),lA(A.copiedId==="nodeInfo.outputFor"?"check":"content_copy")}}function FNA(t,e){t&1&&y(0," N/A ")}function LNA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2,"Message As Output"),Q(),B(3,"td")(4,"span",23)(5,"span",21),y(6),Q(),B(7,"button",24),U("click",function(){T(A);let n=p(3);return J(n.copyToClipboard(n.selectedEvent().nodeInfo.messageAsOutput))}),B(8,"mat-icon"),y(9),Q()()()()()}if(t&2){let A,i=p(3);u(5),H("matTooltip",((A=i.selectedEvent().nodeInfo.messageAsOutput)==null?null:A.toString())||""),u(),lA(i.selectedEvent().nodeInfo.messageAsOutput),u(3),lA(i.copiedId===i.selectedEvent().nodeInfo.messageAsOutput?"check":"content_copy")}}function GNA(t,e){if(t&1){let A=QA();B(0,"table",25)(1,"tr")(2,"td"),y(3,"Node Path"),Q(),B(4,"td")(5,"span",23)(6,"span",21),y(7),Q(),B(8,"button",24),U("click",function(){T(A);let n=p(2);return J(n.copyToClipboard(n.selectedEvent().nodeInfo.path))}),B(9,"mat-icon"),y(10),Q()()()()(),B(11,"tr")(12,"td"),y(13,"Output For"),Q(),B(14,"td"),O(15,NNA,5,2,"div",30)(16,FNA,1,0),Q()(),O(17,LNA,10,3,"tr"),Q()}if(t&2){let A=p(2);u(6),H("matTooltip",A.selectedEvent().nodeInfo.path||""),u(),lA(A.selectedEvent().nodeInfo.path||"N/A"),u(3),lA(A.copiedId===A.selectedEvent().nodeInfo.path?"check":"content_copy"),u(5),Y(A.selectedEvent().nodeInfo.outputFor?15:16),u(2),Y(A.selectedEvent().nodeInfo.messageAsOutput!==void 0?17:-1)}}function KNA(t,e){if(t&1){let A=QA();B(0,"div",30),hA(1,"ngx-json-viewer",31),B(2,"button",32),U("click",function(){T(A);let n=p().$implicit,o=p(3);return J(o.copyJsonToClipboard(o.selectedEvent().actions[n],"action."+n))}),B(3,"mat-icon"),y(4),Q()()()}if(t&2){let A=p().$implicit,i=p(3);u(),H("json",i.selectedEvent().actions[A]),u(3),lA(i.copiedId==="action."+A?"check":"content_copy")}}function UNA(t,e){if(t&1){let A=QA();B(0,"span",23)(1,"span",21),y(2),Q(),B(3,"button",24),U("click",function(){let n;T(A);let o=p().$implicit,a=p(3);return J(a.copyToClipboard((n=a.selectedEvent().actions[o])==null?null:n.toString()))}),B(4,"mat-icon"),y(5),Q()()()}if(t&2){let A,i,n=p().$implicit,o=p(3);u(),H("matTooltip",((A=o.selectedEvent().actions[n])==null?null:A.toString())||""),u(),lA(o.selectedEvent().actions[n]),u(3),lA(o.copiedId===((i=o.selectedEvent().actions[n])==null?null:i.toString())?"check":"content_copy")}}function TNA(t,e){if(t&1&&(B(0,"tr")(1,"td"),y(2),Q(),B(3,"td"),O(4,KNA,5,2,"div",30)(5,UNA,6,3,"span",23),Q()()),t&2){let A=e.$implicit,i=p(3);u(2),lA(A),u(2),Y(i.isObject(i.selectedEvent().actions[A])?4:5)}}function JNA(t,e){if(t&1&&(B(0,"table",26),Ue(1,TNA,6,2,"tr",null,ri),Q()),t&2){let A=p(2);u(),Te(A.Object.keys(A.selectedEvent().actions))}}function ONA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2),Q(),B(3,"td")(4,"div",30),hA(5,"ngx-json-viewer",31),B(6,"button",32),U("click",function(){let n=T(A),o=n.$implicit,a=n.$index,r=p(3);return J(r.copyJsonToClipboard(o,"fc."+a))}),B(7,"mat-icon"),y(8),Q()()()()()}if(t&2){let A=e.$implicit,i=e.$index,n=p(3);u(2),lA(A==null?null:A.name),u(3),H("json",A),u(3),lA(n.copiedId==="fc."+i?"check":"content_copy")}}function YNA(t,e){if(t&1&&(B(0,"table",27),Ue(1,ONA,9,3,"tr",null,ws),Q()),t&2){let A=p(2);u(),Te(A.functionCalls())}}function HNA(t,e){if(t&1&&(B(0,"div",34),hA(1,"img",35),Q()),t&2){let A=p().$implicit;u(),H("src","data:"+A.inlineData.mimeType+";base64,"+A.inlineData.data,Go)}}function zNA(t,e){if(t&1&&(B(0,"div"),hA(1,"audio",36),Q()),t&2){let A=p().$implicit;u(),H("src","data:"+A.inlineData.mimeType+";base64,"+A.inlineData.data)}}function PNA(t,e){if(t&1&&(B(0,"div"),hA(1,"video",36),Q()),t&2){let A=p().$implicit;u(),H("src","data:"+A.inlineData.mimeType+";base64,"+A.inlineData.data,Go)}}function jNA(t,e){if(t&1&&(B(0,"div"),y(1),Q()),t&2){let A=p().$implicit;u(),ue(" Unsupported media type: ",A.inlineData==null?null:A.inlineData.mimeType," ")}}function qNA(t,e){if(t&1&&O(0,HNA,2,1,"div",34)(1,zNA,2,1,"div")(2,PNA,2,1,"div")(3,jNA,2,1,"div"),t&2){let A=e.$implicit;Y(!(A.inlineData==null||A.inlineData.mimeType==null)&&A.inlineData.mimeType.startsWith("image/")?0:!(A.inlineData==null||A.inlineData.mimeType==null)&&A.inlineData.mimeType.startsWith("audio/")?1:!(A.inlineData==null||A.inlineData.mimeType==null)&&A.inlineData.mimeType.startsWith("video/")?2:3)}}function VNA(t,e){if(t&1&&(B(0,"div",33),Ue(1,qNA,4,1,null,null,ws),Q()),t&2){let A=p().$implicit;u(),Te(A.mediaParts)}}function WNA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2),Q(),B(3,"td"),O(4,VNA,3,0,"div",33),B(5,"div",30),hA(6,"ngx-json-viewer",31),B(7,"button",32),U("click",function(){let n=T(A),o=n.$implicit,a=n.$index,r=p(3);return J(r.copyJsonToClipboard(o.cleanedFr,"pfr."+a))}),B(8,"mat-icon"),y(9),Q()()()()()}if(t&2){let A=e.$implicit,i=e.$index,n=p(3);u(2),lA(A.name),u(2),Y(A.hasMedia?4:-1),u(2),H("json",A.cleanedFr),u(3),lA(n.copiedId==="pfr."+i?"check":"content_copy")}}function ZNA(t,e){if(t&1&&(B(0,"table",28),Ue(1,WNA,10,4,"tr",null,ws),Q()),t&2){let A=p(2);u(),Te(A.processedFunctionResponses())}}function XNA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2),Q(),B(3,"td")(4,"span",20)(5,"a",37),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.switchToSpan(n))}),y(6),Q(),B(7,"button",22),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.copyToClipboard(n.span_id))}),B(8,"mat-icon"),y(9),Q()()()()()}if(t&2){let A=e.$implicit,i=p(3);u(2),lA(A.name),u(3),H("matTooltip",A.span_id),u(),lA(A.span_id),u(3),lA(i.copiedId===A.span_id?"check":"content_copy")}}function $NA(t,e){if(t&1&&(B(0,"table",29),Ue(1,XNA,10,4,"tr",null,SNA),Q()),t&2){let A=p(2);u(),Te(A.associatedSpans())}}function AFA(t,e){if(t&1){let A=QA();B(0,"div",15)(1,"table",18)(2,"tr")(3,"td"),y(4,"Event ID"),Q(),B(5,"td",19)(6,"span",20)(7,"span",21),y(8),Q(),B(9,"button",22),U("click",function(){let n;T(A);let o=p();return J(o.copyToClipboard((n=o.selectedEvent())==null?null:n.id))}),B(10,"mat-icon"),y(11),Q()()()()(),B(12,"tr")(13,"td"),y(14,"Invocation ID"),Q(),B(15,"td",19)(16,"span",20)(17,"span",21),y(18),Q(),B(19,"button",22),U("click",function(){let n;T(A);let o=p();return J(o.copyToClipboard((n=o.selectedEvent())==null?null:n.invocationId))}),B(20,"mat-icon"),y(21),Q()()()()(),B(22,"tr")(23,"td"),y(24,"Branch"),Q(),B(25,"td")(26,"span",23)(27,"span",21),y(28),Q(),B(29,"button",24),U("click",function(){let n;T(A);let o=p();return J(o.copyToClipboard((n=o.selectedEvent())==null?null:n.branch))}),B(30,"mat-icon"),y(31),Q()()()()(),B(32,"tr")(33,"td"),y(34,"Timestamp"),Q(),B(35,"td")(36,"span",23)(37,"span",21),y(38),Q(),B(39,"button",24),U("click",function(){let n;T(A);let o=p();return J(o.copyToClipboard(o.formatTime((n=o.selectedEvent())==null?null:n.timestamp),"timestamp"))}),B(40,"mat-icon"),y(41),Q()()()()(),B(42,"tr")(43,"td"),y(44,"Author"),Q(),B(45,"td")(46,"span",23)(47,"span",21),y(48),Q(),B(49,"button",24),U("click",function(){let n;T(A);let o=p();return J(o.copyToClipboard((n=o.selectedEvent())==null?null:n.author))}),B(50,"mat-icon"),y(51),Q()()()()()(),O(52,GNA,18,5,"table",25),O(53,JNA,3,0,"table",26),O(54,YNA,3,0,"table",27),O(55,ZNA,3,0,"table",28),O(56,$NA,3,0,"table",29),Q()}if(t&2){let A,i,n,o,a,r,s,l,g,C,I,d,h,E,f,m,v=p();u(7),H("matTooltip",((A=v.selectedEvent())==null?null:A.id)||""),u(),lA((i=v.selectedEvent())==null?null:i.id),u(3),lA(v.copiedId===((n=v.selectedEvent())==null?null:n.id)?"check":"content_copy"),u(6),H("matTooltip",((o=v.selectedEvent())==null?null:o.invocationId)||""),u(),lA(((a=v.selectedEvent())==null?null:a.invocationId)||"N/A"),u(3),lA(v.copiedId===((r=v.selectedEvent())==null?null:r.invocationId)?"check":"content_copy"),u(6),H("matTooltip",((s=v.selectedEvent())==null?null:s.branch)||""),u(),lA(((l=v.selectedEvent())==null?null:l.branch)||"N/A"),u(3),lA(v.copiedId===((g=v.selectedEvent())==null?null:g.branch)?"check":"content_copy"),u(6),H("matTooltip",v.formatTime((C=v.selectedEvent())==null?null:C.timestamp)),u(),lA(v.formatTime((I=v.selectedEvent())==null?null:I.timestamp)),u(3),lA(v.copiedId==="timestamp"?"check":"content_copy"),u(6),H("matTooltip",((d=v.selectedEvent())==null?null:d.author)||""),u(),lA((h=v.selectedEvent())==null?null:h.author),u(3),lA(v.copiedId===((E=v.selectedEvent())==null?null:E.author)?"check":"content_copy"),u(),Y((f=v.selectedEvent())!=null&&f.nodeInfo?52:-1),u(),Y((m=v.selectedEvent())!=null&&m.actions&&v.Object.keys(v.selectedEvent().actions).length>0?53:-1),u(),Y(v.functionCalls().length>0?54:-1),u(),Y(v.processedFunctionResponses().length>0?55:-1),u(),Y(v.associatedSpans().length>0?56:-1)}}function eFA(t,e){if(t&1&&(B(0,"div",21),y(1),Q()),t&2){let A=e.$implicit;H("matTooltip",A.modality+": "+A.tokenCount),u(),ba("",A.modality,": ",A.tokenCount)}}function tFA(t,e){if(t&1&&Ue(0,eFA,2,3,"div",21,kNA),t&2){let A=p().$implicit,i=p(3);Te(i.selectedEvent().usageMetadata[A])}}function iFA(t,e){if(t&1&&(B(0,"span",21),y(1),Q()),t&2){let A,i=p().$implicit,n=p(3);H("matTooltip",((A=n.selectedEvent().usageMetadata[i])==null?null:A.toString())||""),u(),lA(n.selectedEvent().usageMetadata[i])}}function nFA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2),Q(),B(3,"td")(4,"span",23)(5,"span"),O(6,tFA,2,0)(7,iFA,2,2,"span",21),Q(),B(8,"button",24),U("click",function(){let n,o=T(A).$implicit,a=p(3);return J(a.isObject(a.selectedEvent().usageMetadata[o])?a.copyJsonToClipboard(a.selectedEvent().usageMetadata[o],"usage."+o):a.copyToClipboard((n=a.selectedEvent().usageMetadata[o])==null?null:n.toString(),"usage."+o))}),B(9,"mat-icon"),y(10),Q()()()()()}if(t&2){let A=e.$implicit,i=p(3);u(2),lA(A),u(4),Y(A==="promptTokensDetails"||A==="promptTokenDetails"||A==="candidatesTokenDetails"||A==="candidatesTokensDetails"||A==="cacheTokensDetails"?6:7),u(4),lA(i.copiedId==="usage."+A?"check":"content_copy")}}function oFA(t,e){if(t&1&&(B(0,"table",38),Ue(1,nFA,11,3,"tr",null,ri),Q()),t&2){let A=p(2);u(),Te(A.Object.keys(A.selectedEvent().usageMetadata))}}function aFA(t,e){t&1&&(B(0,"div",39),y(1,"Select an LLM response to see usage metadata."),Q())}function rFA(t,e){if(t&1&&(B(0,"div",15),O(1,oFA,3,0,"table",38)(2,aFA,2,0,"div",39),Q()),t&2){let A,i=p();u(),Y((A=i.selectedEvent())!=null&&A.usageMetadata&&i.Object.keys(i.selectedEvent().usageMetadata).length>0?1:2)}}function sFA(t,e){if(t&1){let A=QA();B(0,"div",16),hA(1,"ngx-json-viewer",31),B(2,"button",32),U("click",function(){T(A);let n=p();return J(n.copyJsonToClipboard(n.filteredSelectedEvent(),"raw"))}),B(3,"mat-icon"),y(4),Q()()()}if(t&2){let A=p();u(),H("json",A.filteredSelectedEvent()),u(3),lA(A.copiedId==="raw"?"check":"content_copy")}}function lFA(t,e){t&1&&(B(0,"div",40)(1,"mat-icon",52),y(2,"warning"),Q(),B(3,"span"),y(4,"The loaded session file was for a different app. The graph may not be accurate."),Q()())}function gFA(t,e){if(t&1){let A=QA();B(0,"button",58),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.onInvocationSelected(n.key))}),B(1,"mat-icon",59),y(2,"check"),Q(),y(3),Q()}if(t&2){let A,i=e.$implicit,n=p(3);H("matTooltip",i.key),u(),ut("visibility",((A=n.selectedEvent())==null?null:A.invocationId)===i.key?"visible":"hidden"),u(2),ue(" ",i.value," ")}}function cFA(t,e){if(t&1&&(B(0,"button",53)(1,"div",54)(2,"span",55),y(3),Q(),B(4,"mat-icon",56),y(5,"arrow_drop_down"),Q()()(),B(6,"mat-menu",null,3),Ue(8,gFA,4,4,"button",57,_NA),Q()),t&2){let A,i=Qi(7),n=p(2);H("matMenuTriggerFor",i),u(2),H("matTooltip",((A=n.selectedEvent())==null?null:A.invocationId)||""),u(),ue(" ",n.invocationDisplayMap().get(n.selectedEvent().invocationId)||n.selectedEvent().invocationId," "),u(5),Te(n.invocationDisplayEntries())}}function CFA(t,e){if(t&1&&(B(0,"span",44),y(1),Q()),t&2){let A,i,n=p(2);H("matTooltip",((A=n.selectedEvent())==null?null:A.invocationId)||""),u(),lA((i=n.selectedEvent())!=null&&i.invocationId?n.invocationDisplayMap().get(n.selectedEvent().invocationId)||n.selectedEvent().invocationId:"N/A")}}function IFA(t,e){t&1&&(B(0,"mat-icon",61),y(1,"chevron_right"),Q())}function dFA(t,e){t&1&&(B(0,"mat-icon",61),y(1,"chevron_right"),Q())}function BFA(t,e){if(t&1&&(O(0,dFA,2,0,"mat-icon",61),B(1,"button",60),y(2),Q()),t&2){let A=e.$implicit,i=e.$index,n=p(3);Y(i>0?0:-1),u(),RA("active",i===n.breadcrumbs().length-1),u(),ue(" ",A," ")}}function EFA(t,e){if(t&1&&(B(0,"div",45)(1,"button",60),y(2),Q(),O(3,IFA,2,0,"mat-icon",61),Ue(4,BFA,3,4,null,null,ws),Q()),t&2){let A=p(2);u(2),lA(A.appName()),u(),Y(A.breadcrumbs().length>0?3:-1),u(),Te(A.breadcrumbs())}}function hFA(t,e){if(t&1){let A=QA();B(0,"button",62),U("click",function(){T(A);let n=p(2);return J(n.showAgentStructureGraph.emit(!0))}),B(1,"mat-icon"),y(2,"fullscreen"),Q()()}}function QFA(t,e){t&1&&(B(0,"div",39),y(1," Graph is not available for this agent. "),Q())}function uFA(t,e){t&1&&(B(0,"div",48),hA(1,"mat-progress-spinner",63),Q())}function fFA(t,e){if(t&1&&hA(0,"div",49),t&2){let A=p(2);H("innerHtml",A.renderedEventGraph(),Gc)}}function pFA(t,e){if(t&1){let A=QA();B(0,"button",64),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.handleMenuSelection(n))}),B(1,"span"),y(2),Ht(3,"date"),Q()()}if(t&2){let A=e.$implicit;u(2),ba("Run ",A.runIndex," (",T0(3,2,A.timestamp,"mediumTime"),")")}}function mFA(t,e){if(t&1&&(B(0,"div",17),O(1,lFA,5,0,"div",40),B(2,"div",41)(3,"div",42)(4,"span",43),y(5,"Invocation:"),Q(),O(6,cFA,10,3)(7,CFA,2,2,"span",44),Q()(),O(8,EFA,6,2,"div",45),B(9,"div",46,0),O(11,hFA,3,0,"button",47),O(12,QFA,2,0,"div",39)(13,uFA,2,0,"div",48)(14,fFA,1,1,"div",49),Q(),hA(15,"div",50,1),B(17,"mat-menu",null,2),Ue(19,pFA,4,5,"button",51,xNA),Q()()),t&2){let A,i=Qi(18),n=p();u(),Y(n.isViewOnlyAppNameMismatch()?1:-1),u(5),Y(n.invocationDisplayMap().size>0&&((A=n.selectedEvent())!=null&&A.invocationId)?6:7),u(2),Y(n.hasSubWorkflows()&&(n.breadcrumbs().length>0||n.appName())?8:-1),u(3),Y(n.graphsAvailable()?11:-1),u(),Y(n.graphsAvailable()?n.renderedEventGraph()?14:13:12),u(3),ut("left",n.menuPos.x+"px")("top",n.menuPos.y+"px"),H("matMenuTriggerFor",i),u(4),Te(n.menuEvents)}}function wFA(t,e){t&1&&(B(0,"div",48),hA(1,"mat-progress-spinner",63),Q())}function DFA(t,e){t&1&&(B(0,"div",39),y(1,"Select an LLM response to see request details."),Q())}function yFA(t,e){if(t&1){let A=QA();B(0,"div",16),hA(1,"ngx-json-viewer",31),B(2,"button",32),U("click",function(){T(A);let n=p(2);return J(n.copyJsonToClipboard(n.llmRequest(),"request"))}),B(3,"mat-icon"),y(4),Q()()()}if(t&2){let A=p(2);u(),H("json",A.llmRequest()),u(3),lA(A.copiedId==="request"?"check":"content_copy")}}function vFA(t,e){if(t&1&&(O(0,wFA,2,0,"div",48),Ht(1,"async"),WI(2,DFA,2,0,"div",39)(3,yFA,5,2,"div",16)),t&2){let A=p();Y(si(1,1,A.uiStateService.isEventRequestResponseLoading())===!0?0:A.llmRequest()?3:2)}}function bFA(t,e){t&1&&(B(0,"div",48),hA(1,"mat-progress-spinner",63),Q())}function MFA(t,e){t&1&&(B(0,"div",39),y(1,"Select an LLM response to see response details."),Q())}function SFA(t,e){if(t&1){let A=QA();B(0,"div",16),hA(1,"ngx-json-viewer",31),B(2,"button",32),U("click",function(){T(A);let n=p(2);return J(n.copyJsonToClipboard(n.llmResponse(),"response"))}),B(3,"mat-icon"),y(4),Q()()()}if(t&2){let A=p(2);u(),H("json",A.llmResponse()),u(3),lA(A.copiedId==="response"?"check":"content_copy")}}function kFA(t,e){if(t&1&&(O(0,bFA,2,0,"div",48),Ht(1,"async"),WI(2,MFA,2,0,"div",39)(3,SFA,5,2,"div",16)),t&2){let A=p();Y(si(1,1,A.uiStateService.isEventRequestResponseLoading())===!0?0:A.llmResponse()?3:2)}}var Iv=class t{eventDataSize=me.required();eventDataMap=me(new Map);selectedEventIndex=me();selectedEvent=me.required();filteredSelectedEvent=me();renderedEventGraph=me();rawSvgString=me(null);llmRequest=me();llmResponse=me();traceData=me([]);appName=me("");selectedEventGraphPath=me("");hasSubWorkflows=me(!1);graphsAvailable=me(!0);invocationDisplayMap=me(new Map);forceGraphTab=me(!1);isViewOnlySession=me(!1);isViewOnlyAppNameMismatch=me(!1);invocationDisplayEntries=pe(()=>Array.from(this.invocationDisplayMap().entries()).map(([e,A])=>({key:e,value:A})));breadcrumbs=pe(()=>{let e=this.selectedEventGraphPath();return e?e.split("/").filter(A=>A):[]});functionCalls=pe(()=>(this.selectedEvent()?.content?.parts||[]).filter(A=>!!A.functionCall).map(A=>A.functionCall));functionResponses=pe(()=>(this.selectedEvent()?.content?.parts||[]).filter(A=>!!A.functionResponse).map(A=>A.functionResponse));processedFunctionResponses=pe(()=>this.functionResponses().map(A=>{if(!A)return null;if(A&&Array.isArray(A.parts)){let n=A.parts.filter(a=>!!a.inlineData).map(a=>a.inlineData&&a.inlineData.data?Ye(gA({},a),{inlineData:Ye(gA({},a.inlineData),{data:a.inlineData.data.replace(/-/g,"+").replace(/_/g,"/")})}):a),o=gA({},A);return delete o.parts,{name:A.name,cleanedFr:o,mediaParts:n,hasMedia:n.length>0}}return{name:A.name,cleanedFr:A,mediaParts:[],hasMedia:!1}}).filter(A=>A!==null));page=ui();closeSelectedEvent=ui();openImageDialog=ui();switchToTraceView=ui();showAgentStructureGraph=ui();drillDownNodePath=ui();selectEventById=ui();jumpToInvocation=ui();onInvocationSelected(e){this.jumpToInvocation.emit(e)}eventMenuTrigger;graphContainer;menuEvents=[];menuPos={x:0,y:0};uiStateService=w(tg);traceService=w(Ag);i18n=w(pQ);isEventRequestResponseLoadingSignal=Ar(this.uiStateService.isEventRequestResponseLoading(),{initialValue:!1});associatedSpans=pe(()=>{let e=this.selectedEvent();if(!e||!e.id)return[];let A=this.traceData();if(!A)return[];let i=o=>{let a=[];for(let r of o)a.push(r),r.children&&(a=a.concat(i(r.children)));return a};return i(A).filter(o=>o.attributes&&o.attributes["gcp.vertex.agent.event_id"]===e.id)});_selectedDetailTab="event";get selectedDetailTab(){return this._selectedDetailTab}set selectedDetailTab(e){this._selectedDetailTab=e,localStorage.setItem("adk-event-tab-selected-tab",e),e==="graph"&&setTimeout(()=>{this.graphContainer?.nativeElement&&nE(this.graphContainer.nativeElement,(A,i)=>{this.handleNodeClick(A,i)})},50)}copiedId=null;copyToClipboard(e,A){e&&navigator.clipboard.writeText(e).then(()=>{this.copiedId=A||e,setTimeout(()=>this.copiedId=null,2e3)})}copyJsonToClipboard(e,A){if(!e)return;let i=JSON.stringify(e,null,2);navigator.clipboard.writeText(i).then(()=>{this.copiedId=A,setTimeout(()=>this.copiedId=null,2e3)})}switchToSpan(e){this.switchToTraceView.emit(),this.traceService.selectedRow(e)}constructor(){let e=localStorage.getItem("adk-event-tab-selected-tab");e&&["event","raw","request","response","graph","metadata"].includes(e)&&(this._selectedDetailTab=e),Ao(()=>{let A=this.renderedEventGraph(),i=this._selectedDetailTab;A&&i==="graph"&&setTimeout(()=>{this.graphContainer?.nativeElement&&nE(this.graphContainer.nativeElement,(n,o)=>{this.handleNodeClick(n,o)})},50)}),Ao(()=>{let A=this.selectedEvent();this.forceGraphTab()&&(this.selectedDetailTab=this.graphsAvailable()?"graph":"event")})}formatTime(e){if(!e)return"N/A";let A=e<1e10?e*1e3:e;return new Date(A).toLocaleString()}isObject(e){return e!==null&&typeof e=="object"}handleNodeClick(e,A){let i=Array.from(this.eventDataMap().values()),o=this.selectedEvent()?.invocationId;o&&(i=i.filter(l=>l.invocationId===o));let a=[],r=[],s="";i.forEach(l=>{let g=l.nodeInfo?.path;if(l.author==="user"&&(g="__START__"),!g)return;let C=g;g!=="__START__"&&(C=g.split("/").map(E=>E.split("@")[0]).join("/"));let I=C.split("/"),d=I[I.length-1],h="";if(I.length>=2&&I[I.length-1]==="call_llm"&&I[I.length-2]===l.author?(d=I[I.length-2],h=I.slice(1,-2).join("/")):h=I.slice(1,-1).join("/"),h===this.selectedEventGraphPath()){let E=g.split("/"),f=E[E.length-1],m=e.includes("@")?f:d;m!==s&&(s===e&&r.length>0&&a.push(r),s=m,r=[]),m===e&&r.push(l)}}),s===e&&r.length>0&&a.push(r),a.length!==0&&(a.length===1?this.selectEventById.emit(a[0][0].id):(this.menuEvents=a.map((l,g)=>({id:l[0].id,runIndex:g+1,timestamp:l[0].timestamp})),A&&(this.menuPos={x:A.clientX,y:A.clientY}),this.eventMenuTrigger.openMenu()))}handleMenuSelection(e){this.selectEventById.emit(e.id)}Object=Object;static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-event-tab"]],viewQuery:function(A,i){if(A&1&&Jt(bNA,5)(MNA,5),A&2){let n;ae(n=re())&&(i.eventMenuTrigger=n.first),ae(n=re())&&(i.graphContainer=n.first)}},inputs:{eventDataSize:[1,"eventDataSize"],eventDataMap:[1,"eventDataMap"],selectedEventIndex:[1,"selectedEventIndex"],selectedEvent:[1,"selectedEvent"],filteredSelectedEvent:[1,"filteredSelectedEvent"],renderedEventGraph:[1,"renderedEventGraph"],rawSvgString:[1,"rawSvgString"],llmRequest:[1,"llmRequest"],llmResponse:[1,"llmResponse"],traceData:[1,"traceData"],appName:[1,"appName"],selectedEventGraphPath:[1,"selectedEventGraphPath"],hasSubWorkflows:[1,"hasSubWorkflows"],graphsAvailable:[1,"graphsAvailable"],invocationDisplayMap:[1,"invocationDisplayMap"],forceGraphTab:[1,"forceGraphTab"],isViewOnlySession:[1,"isViewOnlySession"],isViewOnlyAppNameMismatch:[1,"isViewOnlyAppNameMismatch"]},outputs:{page:"page",closeSelectedEvent:"closeSelectedEvent",openImageDialog:"openImageDialog",switchToTraceView:"switchToTraceView",showAgentStructureGraph:"showAgentStructureGraph",drillDownNodePath:"drillDownNodePath",selectEventById:"selectEventById",jumpToInvocation:"jumpToInvocation"},decls:31,vars:29,consts:[["graphContainer",""],["eventMenuTrigger","matMenuTrigger"],["eventMenu","matMenu"],["invocationSelectorMenu","matMenu"],[1,"event-details-container"],[1,"event-details-header"],["hidePageSize","",1,"event-paginator",3,"page","length","pageSize","pageIndex"],["mat-icon-button","",3,"click","matTooltip"],[1,"event-details-content"],[1,"vertical-tabs-sidebar"],["mat-icon-button","","matTooltipPosition","right",3,"click","matTooltip"],["mat-icon-button","","matTooltipPosition","right",3,"active","matTooltip"],["mat-icon-button","","matTooltip","Usage Metadata","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Raw JSON","matTooltipPosition","right",3,"click"],[1,"vertical-tabs-content"],[1,"info-tables-container"],[1,"json-viewer-container","json-viewer-wrapper"],[1,"event-graph-wrapper"],["app-info-table",""],[1,"id-text"],[1,"id-cell"],[3,"matTooltip"],["mat-icon-button","","matTooltip","Copy",1,"copy-id-button",3,"click"],[1,"value-cell"],["mat-icon-button","","matTooltip","Copy",1,"copy-value-button",3,"click"],["app-info-table","","title","Node Info"],["app-info-table","","title","Actions"],["app-info-table","","title","Function Calls"],["app-info-table","","title","Function Responses"],["app-info-table","","title","Associated Spans"],[1,"json-viewer-wrapper"],[3,"json"],["mat-icon-button","","matTooltip","Copy JSON",1,"floating-copy-button",3,"click"],[1,"media-container"],[1,"generated-image-container"],["alt","image",3,"src"],["controls","",3,"src"],["href","javascript:void(0)",1,"span-link","id-text",3,"click","matTooltip"],["app-info-table","","title","Usage Metadata"],[1,"request-response-empty-state"],[1,"warning-banner",2,"background-color","#fff3cd","color","#856404","padding","8px","margin-bottom","8px","border-radius","4px","display","flex","align-items","center"],[1,"graph-header",2,"justify-content","space-between"],[2,"display","flex","align-items","center","min-width","0","flex","1","width","100%"],[2,"white-space","nowrap","flex-shrink","0"],[2,"margin-left","8px","font-weight","normal",3,"matTooltip"],[1,"breadcrumb-container"],[1,"event-graph-container"],["mat-icon-button","","matTooltip","Full Screen",1,"fullscreen-graph-button"],[1,"request-response-loading-spinner-container"],[1,"svg-graph-wrapper",3,"innerHtml"],[2,"visibility","hidden","position","fixed",3,"matMenuTriggerFor"],["mat-menu-item",""],[2,"margin-right","8px"],["mat-button","",1,"invocation-selector-button",2,"margin-left","8px","padding","0 8px","min-width","0","flex","1","height","24px","line-height","24px","width","100%",3,"matMenuTriggerFor"],[2,"display","flex","align-items","center","width","100%","min-width","0","justify-content","space-between"],[2,"font-weight","normal","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","flex","1","text-align","left",3,"matTooltip"],[2,"margin-left","4px","font-size","18px","width","18px","height","18px","flex-shrink","0"],["mat-menu-item","","matTooltipPosition","right",3,"matTooltip"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[2,"font-size","16px","width","16px","height","16px","margin-right","8px","color","var(--mat-sys-primary)"],["disabled","",1,"breadcrumb-item"],[1,"breadcrumb-separator"],["mat-icon-button","","matTooltip","Full Screen",1,"fullscreen-graph-button",3,"click"],["mode","indeterminate","diameter","50"],["mat-menu-item","",3,"click"]],template:function(A,i){A&1&&(B(0,"div",4)(1,"div",5)(2,"mat-paginator",6),U("page",function(o){return i.page.emit(o)}),Q(),B(3,"button",7),U("click",function(){return i.closeSelectedEvent.emit()}),B(4,"mat-icon"),y(5,"remove_selection"),Q()()(),B(6,"div",8)(7,"div",9)(8,"button",10),U("click",function(){return i.selectedDetailTab="event"}),B(9,"mat-icon"),y(10,"info"),Q()(),O(11,RNA,3,4,"button",11),B(12,"button",10),U("click",function(){return i.selectedDetailTab="request"}),B(13,"mat-icon"),y(14,"input"),Q()(),B(15,"button",10),U("click",function(){return i.selectedDetailTab="response"}),B(16,"mat-icon"),y(17,"output"),Q()(),B(18,"button",12),U("click",function(){return i.selectedDetailTab="metadata"}),B(19,"mat-icon"),y(20,"analytics"),Q()(),B(21,"button",13),U("click",function(){return i.selectedDetailTab="raw"}),B(22,"mat-icon"),y(23,"data_object"),Q()()(),B(24,"div",14),O(25,AFA,57,20,"div",15),O(26,rFA,3,1,"div",15),O(27,sFA,5,2,"div",16),O(28,mFA,21,10,"div",17),O(29,vFA,4,3),O(30,kFA,4,3),Q()()()),A&2&&(u(2),H("length",i.eventDataSize())("pageSize",1)("pageIndex",i.selectedEventIndex()),te("aria-label",i.i18n.selectEventAriaLabel),u(),H("matTooltip",XC(i.i18n.clearSelectionButtonLabel)),u(5),RA("active",i.selectedDetailTab==="event"),H("matTooltip",XC(i.i18n.infoTabLabel)),u(3),Y(i.graphsAvailable()?11:-1),u(),RA("active",i.selectedDetailTab==="request"),H("matTooltip",XC(i.i18n.requestDetailsTabLabel)),u(3),RA("active",i.selectedDetailTab==="response"),H("matTooltip",XC(i.i18n.responseDetailsTabLabel)),u(3),RA("active",i.selectedDetailTab==="metadata"),u(3),RA("active",i.selectedDetailTab==="raw"),u(4),Y(i.selectedDetailTab==="event"?25:-1),u(),Y(i.selectedDetailTab==="metadata"?26:-1),u(),Y(i.selectedDetailTab==="raw"?27:-1),u(),Y(i.selectedDetailTab==="graph"?28:-1),u(),Y(i.selectedDetailTab==="request"?29:-1),u(),Y(i.selectedDetailTab==="response"?30:-1))},dependencies:[qi,pi,ji,Wt,n6,gs,dn,LB,Zs,Ml,$c,cs,$l,OI,os,nL],styles:["[_nghost-%COMP%]{display:block;height:100%}.json-viewer-container[_ngcontent-%COMP%]{margin:10px}.event-paginator[_ngcontent-%COMP%]{margin-right:auto;display:flex;justify-content:center;background-color:transparent}.event-paginator[_ngcontent-%COMP%] .mat-mdc-paginator-range-label{order:2;margin:0 0 0 8px}.event-details-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.event-details-content[_ngcontent-%COMP%]{display:flex;flex:1;overflow:hidden}.vertical-tabs-sidebar[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:48px;border-right:1px solid var(--mat-sys-outline-variant);padding-top:8px;align-items:center;gap:8px}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.vertical-tabs-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto}.event-details-header[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant);height:48px;flex-shrink:0}.empty-state[_ngcontent-%COMP%]{padding:16px;text-align:center;color:var(--mat-sys-on-surface-variant);font-style:italic}.details-content[_ngcontent-%COMP%]{color:var(--side-panel-details-content-color);font-size:14px}.event-graph-wrapper[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;width:100%}.breadcrumb-container[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:13px;color:var(--mat-sys-on-surface-variant);padding:8px 12px}.breadcrumb-container[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-weight:500;margin-right:8px;color:var(--mat-sys-on-surface)}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]{background:none;border:none;color:var(--mat-sys-primary);font-size:13px;padding:2px 4px}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-item.active[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface)}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-on-surface);font-weight:500}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-separator[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;color:var(--mat-sys-on-surface-variant);margin:0 4px}.graph-header[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:13px;color:var(--mat-sys-on-surface-variant);background-color:var(--mat-sys-surface-container-lowest);padding:8px 16px;border-bottom:1px solid var(--mat-sys-outline-variant)}.graph-header[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-weight:500;margin-right:8px;color:var(--mat-sys-on-surface)}.event-graph-container[_ngcontent-%COMP%]{flex:1;overflow:hidden;padding:16px;position:relative}.fullscreen-graph-button[_ngcontent-%COMP%]{position:absolute;top:4px;right:4px;z-index:10;width:48px!important;height:48px!important;padding:0!important;display:flex!important;justify-content:center!important;align-items:center!important}.fullscreen-graph-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:28px!important;width:28px!important;height:28px!important;line-height:28px!important;margin:0!important;padding:0!important}.event-graph-container[_ngcontent-%COMP%] .svg-graph-wrapper[_ngcontent-%COMP%]{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.event-graph-container[_ngcontent-%COMP%] svg{max-width:100%;max-height:100%;width:auto;height:auto;display:block}.event-graph-container[_ngcontent-%COMP%] svg>g.graph>polygon:first-child{fill:transparent!important}.request-response-loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em}.request-response-empty-state[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em;font-style:italic}.id-text[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:12px}.id-cell[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;overflow:hidden}.id-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child, .value-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.id-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .id-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%]{opacity:1}.copy-id-button[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%]{width:28px!important;height:28px!important;padding:0!important;line-height:28px!important;flex-shrink:0;margin:-4px 0!important;opacity:0;transition:opacity .2s ease-in-out;border-radius:4px!important;overflow:hidden!important}.copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.copy-id-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.info-tables-container[_ngcontent-%COMP%]{padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:24px}.invocation-selector-button[_ngcontent-%COMP%] .mdc-button__label{width:100%;flex:1;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;justify-content:space-between}.media-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;margin-top:8px;margin-bottom:12px}.generated-image-container[_ngcontent-%COMP%]{max-width:100%;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a;border:1px solid var(--mat-sys-outline-variant)}.generated-image-container[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:100%;height:auto;display:block}audio[_ngcontent-%COMP%], video[_ngcontent-%COMP%]{max-width:100%;border-radius:4px}.json-viewer-wrapper[_ngcontent-%COMP%]{position:relative}.json-viewer-wrapper[_ngcontent-%COMP%]:hover .floating-copy-button[_ngcontent-%COMP%]{opacity:1}.floating-copy-button[_ngcontent-%COMP%]{position:absolute;top:4px;right:4px;z-index:10;opacity:0;transition:opacity .2s ease-in-out;background-color:var(--mat-sys-surface-container-high)!important;border-radius:4px!important;overflow:hidden!important;width:28px!important;height:28px!important;line-height:28px!important;padding:0!important}.floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.floating-copy-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.floating-copy-button[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}"],changeDetection:0})};var xFA=["evalTabContainer"];function _FA(t,e){}function RFA(t,e){t&1&&(B(0,"div",1),hA(1,"mat-progress-spinner",4),Q())}function NFA(t,e){if(t&1&&(B(0,"span",11),y(1),Q()),t&2){let A=p(2);u(),lA(A.i18n.infoTabLabel)}}function FFA(t,e){if(t&1){let A=QA();B(0,"app-trace-tab",12),U("switchToEvent",function(n){T(A);let o=p(2);return J(o.switchToEvent.emit(n))}),Q()}if(t&2){let A=p(2);H("traceData",A.traceData())}}function LFA(t,e){if(t&1){let A=QA();B(0,"app-event-tab",13),U("page",function(n){T(A);let o=p(2);return J(o.page.emit(n))})("closeSelectedEvent",function(){T(A);let n=p(2);return J(n.closeSelectedEvent.emit())})("openImageDialog",function(n){T(A);let o=p(2);return J(o.openImageDialog.emit(n))})("switchToTraceView",function(){T(A);let n=p(2);return J(n.switchToTraceView.emit())})("showAgentStructureGraph",function(n){T(A);let o=p(2);return J(o.showAgentStructureGraph.emit(n))})("drillDownNodePath",function(n){T(A);let o=p(2);return J(o.drillDownNodePath.emit(n))})("selectEventById",function(n){T(A);let o=p(2);return J(o.selectEventById.emit(n))})("jumpToInvocation",function(n){T(A);let o=p(2);return J(o.jumpToInvocation.emit(n))}),Q()}if(t&2){let A=p(2);H("eventDataSize",A.eventData().size)("eventDataMap",A.eventData())("selectedEventIndex",A.selectedEventIndex())("selectedEvent",A.selectedEvent())("traceData",A.traceData())("filteredSelectedEvent",A.filteredSelectedEvent())("renderedEventGraph",A.renderedEventGraph())("rawSvgString",A.rawSvgString())("appName",A.appName())("selectedEventGraphPath",A.selectedEventGraphPath())("llmRequest",A.llmRequest())("llmResponse",A.llmResponse())("hasSubWorkflows",A.hasSubWorkflows())("graphsAvailable",A.graphsAvailable())("invocationDisplayMap",A.invocationDisplayMap())("forceGraphTab",A.forceGraphTab())("isViewOnlySession",A.isViewOnlySession())("isViewOnlyAppNameMismatch",A.isViewOnlyAppNameMismatch())}}function GFA(t,e){t&1&&(B(0,"div",9),y(1,"Select an event or trace span to view details"),Q())}function KFA(t,e){if(t&1&&(B(0,"span",11),y(1),Q()),t&2){let A=p(2);u(),lA(A.i18n.stateTabLabel)}}function UFA(t,e){if(t&1&&(B(0,"span",11),y(1),Q()),t&2){let A=p(3);u(),lA(A.i18n.artifactsTabLabel)}}function TFA(t,e){if(t&1&&(B(0,"mat-tab"),Et(1,UFA,2,1,"ng-template",6),hA(2,"app-artifact-tab",14),Q()),t&2){let A=p(2);u(2),H("artifacts",A.artifacts())}}function JFA(t,e){if(t&1&&(B(0,"span",11),y(1),Q()),t&2){let A=p(3);u(),lA(A.i18n.testsTabLabel)}}function OFA(t,e){if(t&1){let A=QA();B(0,"mat-tab"),Et(1,JFA,2,1,"ng-template",6),B(2,"app-tests-tab",15),U("testSelected",function(n){T(A);let o=p(2);return J(o.testSelected.emit(n))}),Q()()}if(t&2){let A=p(2);u(2),H("appName",A.appName())("sessionId",A.sessionId())("userId",A.userId())("isViewOnlySession",A.isViewOnlySession())}}function YFA(t,e){if(t&1&&(B(0,"span",11),y(1),Q()),t&2){let A=p(3);u(),lA(A.i18n.evalTabLabel)}}function HFA(t,e){t&1&&(B(0,"mat-tab"),Et(1,YFA,2,1,"ng-template",6),sn(2,null,0),Q())}function zFA(t,e){if(t&1){let A=QA();B(0,"div",2)(1,"mat-tab-group",5),Di("selectedIndexChange",function(n){T(A);let o=p();return Bi(o.selectedIndex,n)||(o.selectedIndex=n),J(n)}),U("selectedTabChange",function(n){T(A);let o=p();return J(o.onTabChange(n))}),B(2,"mat-tab"),Et(3,NFA,2,1,"ng-template",6),O(4,FFA,1,1,"app-trace-tab",7)(5,LFA,1,18,"app-event-tab",8)(6,GFA,2,0,"div",9),Q(),B(7,"mat-tab"),Et(8,KFA,2,1,"ng-template",6),hA(9,"app-state-tab",10),Q(),O(10,TFA,3,1,"mat-tab"),Ht(11,"async"),O(12,OFA,3,4,"mat-tab"),Ht(13,"async"),O(14,HFA,4,0,"mat-tab"),Ht(15,"async"),Q()()}if(t&2){let A=p(),i=zn(2);H("hidden",i||!A.showSidePanel()),u(),wi("selectedIndex",A.selectedIndex),u(3),Y(A.selectedSpan()?4:A.selectedEvent()?5:6),u(5),H("sessionState",A.currentSessionState()),u(),Y(si(11,7,A.isArtifactsTabEnabledObs)?10:-1),u(2),Y(si(13,9,A.isTestsEnabledObs)?12:-1),u(2),Y(si(15,11,A.isEvalEnabledObs)?14:-1)}}var mQ=class t{Object=Object;appName=me("");userId=me("");sessionId=me("");traceData=me([]);eventData=me(new Map);currentSessionState=me();artifacts=me([]);selectedEvent=me();selectedEventIndex=me();renderedEventGraph=me();rawSvgString=me(null);selectedEventGraphPath=me("");llmRequest=me();llmResponse=me();showSidePanel=me(!1);isApplicationSelectorEnabledObs=me(ne(!1));isBuilderMode=me(!1);disableBuilderIcon=me(!1);hasSubWorkflows=me(!1);graphsAvailable=me(!0);invocationDisplayMap=me(new Map);forceGraphTab=me(!1);isViewOnlySession=me(!1);isViewOnlyAppNameMismatch=me(!1);closePanel=ui();tabChange=ui();sessionSelected=ui();sessionReloaded=ui();evalCaseSelected=ui();editEvalCaseRequested=ui();testSelected=ui();evalSetIdSelected=ui();returnToSession=ui();evalNotInstalled=ui();page=ui();switchToEvent=ui();closeSelectedEvent=ui();openImageDialog=ui();openAddItemDialog=ui();enterBuilderMode=ui();showAgentStructureGraph=ui();switchToTraceView=ui();drillDownNodePath=ui();selectEventById=ui();jumpToInvocation=ui();sessionTabComponent=void 0;evalTabComponent=So(xc);evalTabContainer=So("evalTabContainer",{read:Mo});tabGroup=So(lv);logoComponent=w(PB,{optional:!0});i18n=w(pQ);featureFlagService=w(yr);evalTabComponentClass=w(rv,{optional:!0});environmentInjector=w(Gr);uiStateService=w(tg);traceService=w(Ag);selectedSpan=Ar(this.traceService.selectedTraceRow$);selectedIndex=0;pendingEvalCaseSelection=bA(void 0);pendingEvalResultSelection=bA(void 0);constructor(){Ao(()=>{let e=this.selectedEvent(),A=this.selectedSpan(),i=this.tabGroup();(e||A)&&i&&i.selectedIndex!==0&&(this.selectedIndex=0,window.localStorage.setItem("adk-side-panel-selected-tab","0"))})}ngOnInit(){let e=window.localStorage.getItem("adk-side-panel-selected-tab");e!==null&&(this.selectedIndex=parseInt(e,10))}onTabChange(e){this.tabChange.emit(e),this.selectedIndex=e.index,window.localStorage.setItem("adk-side-panel-selected-tab",e.index.toString())}switchToEvalTab(){this.isEvalEnabledObs.pipe($n()).subscribe(e=>{e&&qC([this.isArtifactsTabEnabledObs.pipe($n()),this.isTestsEnabledObs.pipe($n())]).subscribe(([A,i])=>{let n=2;A&&n++,i&&n++,this.selectedIndex=n,window.localStorage.setItem("adk-side-panel-selected-tab",n.toString())})})}selectEvalCase(e,A){let i=this.evalTabComponent();i?(i.selectEvalSet(e),i.selectedEvalTab.set("cases"),i.selectedEvalCase.set(A)):this.pendingEvalCaseSelection.set({evalSetId:e,evalCase:A})}selectEvalResult(e,A,i){let n=this.evalTabComponent();console.log("selectEvalResult tab available:",!!n,"evalCase:",i),n?(n.selectEvalSet(e),n.selectedHistoryRun.set(A),i?(console.log("selectEvalResult setting cases tab and case"),n.selectedEvalTab.set("cases"),n.selectedEvalCase.set(i)):(console.log("selectEvalResult setting history tab and run"),n.selectedEvalTab.set("history"))):(console.log("selectEvalResult deferred to pending"),this.pendingEvalResultSelection.set({evalSetId:e,timestamp:A,evalCase:i}))}isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();isTraceEnabledObs=this.featureFlagService.isTraceEnabled();isArtifactsTabEnabledObs=this.featureFlagService.isArtifactsTabEnabled();isEvalEnabledObs=this.featureFlagService.isEvalEnabled();isTestsEnabledObs=this.featureFlagService.isTestsEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled;filteredSelectedEvent=pe(()=>this.selectedEvent());ngAfterViewInit(){setTimeout(()=>{this.initEvalTab()},500)}initEvalTab(){this.isEvalEnabledObs.pipe($n()).subscribe(e=>{if(e){let A=this.evalTabContainer()?.createComponent(this.evalTabComponentClass??xc,{environmentInjector:this.environmentInjector});if(!A)return;Xa(this.environmentInjector,()=>{Ao(()=>{A.setInput("appName",this.appName()),A.setInput("userId",this.userId()),A.setInput("sessionId",this.sessionId())}),Ao(()=>{let i=this.pendingEvalCaseSelection();i&&(console.log("initEvalTab applying pendingEvalCaseSelection:",i),A.instance.selectEvalSet(i.evalSetId),A.instance.selectedEvalTab.set("cases"),A.instance.selectedEvalCase.set(i.evalCase),this.pendingEvalCaseSelection.set(void 0))}),Ao(()=>{let i=this.pendingEvalResultSelection();i&&(console.log("initEvalTab applying pendingEvalResultSelection:",i),A.instance.selectEvalSet(i.evalSetId),A.instance.selectedHistoryRun.set(i.timestamp),i.evalCase?(console.log("initEvalTab setting cases tab and case"),A.instance.selectedEvalTab.set("cases"),A.instance.selectedEvalCase.set(i.evalCase)):(console.log("initEvalTab setting history tab and run"),A.instance.selectedEvalTab.set("history")),this.pendingEvalResultSelection.set(void 0))})}),A.instance.sessionSelected.subscribe(i=>{this.sessionSelected.emit(i)}),A.instance.evalCaseSelected.subscribe(i=>{this.evalCaseSelected.emit(i)}),A.instance.editEvalCaseRequested.subscribe(i=>{this.editEvalCaseRequested.emit(i)}),A.instance.evalSetIdSelected.subscribe(i=>{this.evalSetIdSelected.emit(i)}),A.instance.shouldReturnToSession.subscribe(i=>{this.returnToSession.emit(i)}),A.instance.evalNotInstalledMsg.subscribe(i=>{this.evalNotInstalled.emit(i)})}})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-side-panel"]],viewQuery:function(A,i){A&1&&ns(i.evalTabComponent,xc,5)(i.evalTabContainer,xFA,5,Mo)(i.tabGroup,lv,5),A&2&&ur(3)},inputs:{appName:[1,"appName"],userId:[1,"userId"],sessionId:[1,"sessionId"],traceData:[1,"traceData"],eventData:[1,"eventData"],currentSessionState:[1,"currentSessionState"],artifacts:[1,"artifacts"],selectedEvent:[1,"selectedEvent"],selectedEventIndex:[1,"selectedEventIndex"],renderedEventGraph:[1,"renderedEventGraph"],rawSvgString:[1,"rawSvgString"],selectedEventGraphPath:[1,"selectedEventGraphPath"],llmRequest:[1,"llmRequest"],llmResponse:[1,"llmResponse"],showSidePanel:[1,"showSidePanel"],isApplicationSelectorEnabledObs:[1,"isApplicationSelectorEnabledObs"],isBuilderMode:[1,"isBuilderMode"],disableBuilderIcon:[1,"disableBuilderIcon"],hasSubWorkflows:[1,"hasSubWorkflows"],graphsAvailable:[1,"graphsAvailable"],invocationDisplayMap:[1,"invocationDisplayMap"],forceGraphTab:[1,"forceGraphTab"],isViewOnlySession:[1,"isViewOnlySession"],isViewOnlyAppNameMismatch:[1,"isViewOnlyAppNameMismatch"]},outputs:{closePanel:"closePanel",tabChange:"tabChange",sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded",evalCaseSelected:"evalCaseSelected",editEvalCaseRequested:"editEvalCaseRequested",testSelected:"testSelected",evalSetIdSelected:"evalSetIdSelected",returnToSession:"returnToSession",evalNotInstalled:"evalNotInstalled",page:"page",switchToEvent:"switchToEvent",closeSelectedEvent:"closeSelectedEvent",openImageDialog:"openImageDialog",openAddItemDialog:"openAddItemDialog",enterBuilderMode:"enterBuilderMode",showAgentStructureGraph:"showAgentStructureGraph",switchToTraceView:"switchToTraceView",drillDownNodePath:"drillDownNodePath",selectEventById:"selectEventById",jumpToInvocation:"jumpToInvocation"},decls:7,vars:8,consts:[["evalTabContainer",""],[1,"loading-spinner-container"],[1,"tabs-container",3,"hidden"],[1,"resize-handler"],["mode","indeterminate","diameter","50"],["animationDuration","0ms",3,"selectedIndexChange","selectedTabChange","selectedIndex"],["mat-tab-label",""],[3,"traceData"],[3,"eventDataSize","eventDataMap","selectedEventIndex","selectedEvent","traceData","filteredSelectedEvent","renderedEventGraph","rawSvgString","appName","selectedEventGraphPath","llmRequest","llmResponse","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab","isViewOnlySession","isViewOnlyAppNameMismatch"],[1,"empty-state"],[3,"sessionState"],[1,"tab-label"],[3,"switchToEvent","traceData"],[3,"page","closeSelectedEvent","openImageDialog","switchToTraceView","showAgentStructureGraph","drillDownNodePath","selectEventById","jumpToInvocation","eventDataSize","eventDataMap","selectedEventIndex","selectedEvent","traceData","filteredSelectedEvent","renderedEventGraph","rawSvgString","appName","selectedEventGraphPath","llmRequest","llmResponse","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab","isViewOnlySession","isViewOnlyAppNameMismatch"],[3,"artifacts"],[3,"testSelected","appName","sessionId","userId","isViewOnlySession"]],template:function(A,i){if(A&1&&(O(0,_FA,0,0),Ht(1,"async"),ta(2),Ht(3,"async"),O(4,RFA,2,0,"div",1),O(5,zFA,16,13,"div",2),hA(6,"div",3)),A&2){Y(si(1,3,i.isAlwaysOnSidePanelEnabledObs)===!1?0:-1),u(2);let n=ga(si(3,5,i.uiStateService.isSessionLoading()));u(2),Y(n?4:-1),u(),Y(i.appName()!=""?5:-1)}},dependencies:[lv,CF,cF,Cv,cv,Z6,Iv,gs,gv,os],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;position:relative}.drawer-header-wrapper[_ngcontent-%COMP%]{display:flex;height:48px;align-items:center;padding-left:20px}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center}.tabs-container[_ngcontent-%COMP%]{width:100%;flex:1;overflow:hidden;display:flex;flex-direction:column}.tab-label[_ngcontent-%COMP%]{font-size:14px}.resize-handler[_ngcontent-%COMP%]{width:6px;border-radius:4px;position:absolute;display:block;top:20px;bottom:20px;right:0;z-index:100;cursor:ew-resize}.resize-handler[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-outline-variant)}.empty-state[_ngcontent-%COMP%]{padding:16px;text-align:center;color:var(--mat-sys-on-surface-variant);font-style:italic}mat-tab-group[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;min-height:0}mat-tab-group[_ngcontent-%COMP%] .mdc-tab{padding:0 12px;min-width:48px} .mat-mdc-tab-body-wrapper{flex:1;min-height:0} .mat-mdc-tab-body-wrapper .mat-mdc-tab-body-content{overflow-x:hidden}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:6px}.drawer-logo[_ngcontent-%COMP%]{font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.1px}.drawer-header-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.panel-toggle-icon[_ngcontent-%COMP%]{font-size:20px;width:24px;height:24px;color:var(--side-panel-mat-icon-color, #c4c7c5);cursor:pointer;display:flex;align-items:center;justify-content:center}.powered-by-adk[_ngcontent-%COMP%]{font-size:10px;color:var(--side-panel-powered-by-adk-color);text-align:right;margin-top:-5px}.adk-info-icon[_ngcontent-%COMP%]{font-size:14px;color:var(--side-panel-mat-icon-color, #bdc1c6);cursor:pointer;margin-left:4px;vertical-align:middle}.mode-toggle-container[_ngcontent-%COMP%]{display:flex;align-items:center}.build-mode-button[_ngcontent-%COMP%]{margin:0 4px}.app-actions[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}"]})};var PFA=["editInput"];function jFA(t,e){if(t&1){let A=QA();B(0,"button",5),U("click",function(){T(A);let n=p();return J(n.startEdit())}),B(1,"mat-icon"),y(2,"edit"),Q()()}}function qFA(t,e){if(t&1){let A=QA();B(0,"button",6),U("click",function(){T(A);let n=p();return J(n.saveEdit())}),B(1,"mat-icon"),y(2,"check"),Q()(),B(3,"button",7),U("click",function(){T(A);let n=p();return J(n.cancelEdit())}),B(4,"mat-icon"),y(5,"close"),Q()()}}var dv=class t{value="";displayValue="";tooltip="";placeholder="";textClass="";save=new LA;isEditing=!1;draftValue="";editInput;startEdit(){this.draftValue=this.value,this.isEditing=!0,setTimeout(()=>{this.editInput.nativeElement.focus()})}cancelEdit(){this.isEditing=!1,this.draftValue=""}saveEdit(){this.save.emit(this.draftValue),this.isEditing=!1}handleKeydown(e){e.key==="Enter"?this.saveEdit():e.key==="Escape"&&this.cancelEdit()}get effectiveDisplayValue(){return this.displayValue||this.value}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-inline-edit"]],viewQuery:function(A,i){if(A&1&&Jt(PFA,5),A&2){let n;ae(n=re())&&(i.editInput=n.first)}},inputs:{value:"value",displayValue:"displayValue",tooltip:"tooltip",placeholder:"placeholder",textClass:"textClass"},outputs:{save:"save"},decls:6,vars:10,consts:[["editInput",""],[1,"inline-edit-container"],[1,"inline-edit-text-wrapper"],[1,"inline-edit-input",3,"ngModelChange","keydown","readonly","ngClass","matTooltip","ngModel"],["mat-icon-button","","aria-label","Edit",1,"inline-edit-action-button"],["mat-icon-button","","aria-label","Edit",1,"inline-edit-action-button",3,"click"],["mat-icon-button","","aria-label","Save",1,"inline-edit-action-button",3,"click"],["mat-icon-button","","aria-label","Cancel",1,"inline-edit-action-button",3,"click"]],template:function(A,i){A&1&&(B(0,"div",1)(1,"div",2)(2,"input",3,0),U("ngModelChange",function(o){return i.draftValue=o})("keydown",function(o){return i.handleKeydown(o)}),Q()(),O(4,jFA,3,0,"button",4)(5,qFA,6,0),Q()),A&2&&(u(2),RA("readonly",!i.isEditing),H("readonly",!i.isEditing)("ngClass",i.textClass)("matTooltip",i.isEditing?"":i.tooltip)("ngModel",i.isEditing?i.draftValue:i.effectiveDisplayValue),te("placeholder",i.isEditing?i.placeholder:"")("aria-label",i.placeholder)("size",((i.isEditing?i.draftValue:i.effectiveDisplayValue)==null?null:(i.isEditing?i.draftValue:i.effectiveDisplayValue).length)||1),u(2),Y(i.isEditing?5:4))},dependencies:[li,zl,ln,Dn,yn,ko,qi,ji,Tn,Wt,Fa,dn],styles:["[_nghost-%COMP%]{display:block;max-width:100%;min-width:0;width:100%}.inline-edit-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;max-width:100%;min-width:0;box-sizing:border-box}.inline-edit-text-wrapper[_ngcontent-%COMP%]{flex:0 1 auto;min-width:0;display:flex;align-items:center}.inline-edit-input[_ngcontent-%COMP%]{min-width:48px;max-width:100%;padding:2px 6px;margin:-3px -7px;border:1px solid var(--chat-toolbar-session-text-color, #ccc);border-radius:4px;color:var(--chat-toolbar-session-id-color, inherit);font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;background:transparent;field-sizing:content;transition:all .2s ease}.inline-edit-input[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--primary-color, #1a73e8)}.inline-edit-input.readonly[_ngcontent-%COMP%]{min-width:0;border-color:transparent;cursor:inherit}.inline-edit-input.readonly[_ngcontent-%COMP%]:focus{outline:none;border-color:transparent}.inline-edit-action-button[_ngcontent-%COMP%]{flex-shrink:0;width:28px!important;height:28px!important;padding:0!important;display:flex;align-items:center;justify-content:center}.inline-edit-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}"]})};var VFA={openPanelTooltip:"Open panel",evalCaseIdLabel:"Eval Case ID",cancelButton:"Cancel",saveButton:"Save",editEvalCaseTooltip:"Edit current eval case",deleteEvalCaseTooltip:"Delete current eval case",sessionIdLabel:"Session",copySessionIdTooltip:"Copy session ID",sessionIdCopiedMessage:"Session ID copied",copySessionIdFailedMessage:"Failed to copy session ID",userIdLabel:"User ID",editUserIdTooltip:"Edit user ID",userIdInputPlaceholder:"Enter user ID",saveUserIdTooltip:"Save user ID",cancelUserIdEditTooltip:"Cancel editing user ID",invalidUserIdMessage:"User ID cannot be empty",loadingSessionLabel:"Loading session...",tokenStreamingLabel:"Token Streaming",moreOptionsTooltip:"More options",createNewSessionTooltip:"Create a new Session",newSessionButton:"New Session",deleteSessionTooltip:"Delete session",exportSessionTooltip:"Export session",importSessionTooltip:"Import session",viewSessionTooltip:"View session",loadingAgentsLabel:"Loading agents, please wait...",welcomeMessage:"Welcome to ADK!",selectAgentMessage:"Select an agent on the left to begin with.",failedToLoadAgentsMessage:"Failed to load agents. To get started, run",errorMessageLabel:"Error message:",noAgentsFoundWarning:"Warning: No agents found in current folder.",cannotEditSessionMessage:"Chat is disabled to prevent changes to the end user's session.",viewSessionReadOnlyMessage:'This is a read-only view of a session file. Use "Import Session" if you want to continue this session.',readOnlyBadgeLabel:"Read-only"},siA=new kA("Chat Messages",{factory:()=>VFA});var WFA=["sideDrawer"],ZFA=["drawerSessionTab"],XFA=["appSearchInput"],$FA=["invChipMenuTrigger"],ALA=["nodeChipMenuTrigger"],eLA=["addMenuTrigger"],tLA=[[["","adk-web-chat-container-top",""]]],iLA=["[adk-web-chat-container-top]"],giA=()=>[],nLA=(t,e)=>e.metricName;function oLA(t,e){t&1&&sn(0)}function aLA(t,e){if(t&1&&Et(0,oLA,1,0,"ng-container",39),t&2){let A=p();H("ngComponentOutlet",A.logoComponent)}}function rLA(t,e){if(t&1&&(B(0,"span",42),y(1),Q()),t&2){let A=p(2);u(),lA(A.adkVersion())}}function sLA(t,e){if(t&1&&(B(0,"div",48)(1,"div",49)(2,"span",50),y(3,"Version:"),Q(),B(4,"span",51),y(5),Q()(),B(6,"div",49)(7,"span",50),y(8,"Language:"),Q(),B(9,"span",51),y(10),Q()(),B(11,"div",49)(12,"span",50),y(13,"Lang Version:"),Q(),B(14,"span",51),y(15),Q()()()),t&2){let A=p(2);u(5),lA(A.versionInfo().version),u(5),lA(A.versionInfo().language),u(5),lA(A.versionInfo().language_version)}}function lLA(t,e){if(t&1&&(hA(0,"img",40),B(1,"span",41),y(2,"Agent Development Kit"),O(3,rLA,2,1,"span",42),Q(),B(4,"span",43),y(5,"ADK"),Q(),B(6,"div",44)(7,"mat-icon",45),y(8,"info_outline"),Q(),B(9,"div",46)(10,"div",47),y(11),Q(),O(12,sLA,16,3,"div",48),Q()()),t&2){let A=p();u(3),Y(A.adkVersion()?3:-1),u(8),lA(A.sidePanelI18n.disclosureTooltip),u(),Y(A.versionInfo()?12:-1)}}function gLA(t,e){t&1&&(B(0,"mat-icon",19),y(1,"warning"),Q())}function cLA(t,e){if(t&1){let A=QA();B(0,"span",53)(1,"button",55),U("click",function(){T(A);let n=p(2);return J(n.openAgentStructureGraphDialog())}),B(2,"mat-icon"),y(3,"account_tree"),Q()()()}if(t&2){let A=p(2);H("matTooltip",A.graphsAvailable()?"View Agent Structure Graph":"Agent structure graph is not available for this agent"),u(),H("disabled",!A.graphsAvailable())}}function CLA(t,e){if(t&1){let A=QA();hA(0,"div",52),O(1,cLA,4,2,"span",53),B(2,"span",53)(3,"button",54),U("click",function(){T(A);let n=p();return J(n.enterBuilderMode())}),B(4,"mat-icon"),y(5,"edit"),Q()()()}if(t&2){let A=p();u(),Y(A.graphsAvailable()?1:-1),u(),H("matTooltip",A.disableBuilderSwitch?"Editing is not available for this agent because it was not built by the builder":"Edit in Builder Mode"),u(),H("disabled",A.disableBuilderSwitch)}}function ILA(t,e){if(t&1){let A=QA();B(0,"div",56)(1,"mat-icon",61),y(2,"visibility"),Q(),B(3,"span",62),y(4),Q(),B(5,"button",63),U("click",function(){T(A);let n=p(2);return J(n.closeReadonlySession())}),B(6,"mat-icon",64),y(7,"close"),Q()()()}if(t&2){let A=p(2);u(4),ba("",A.readonlySessionType(),": ",A.readonlySessionName())}}function dLA(t,e){if(t&1){let A=QA();B(0,"button",68),U("click",function(){T(A);let n=p(6);return J(n.onNewSessionClick())}),B(1,"mat-icon",17),y(2,"add_comment"),Q(),B(3,"span"),y(4),Q()()}if(t&2){let A=p(6);H("matTooltip",A.i18n.createNewSessionTooltip),u(4),lA(A.i18n.newSessionButton)}}function BLA(t,e){if(t&1){let A=QA();B(0,"button",69),U("click",function(){T(A);let n=p(6);return J(n.onNewSessionClick())}),B(1,"mat-icon",17),y(2,"add_comment"),Q()()}if(t&2){let A=p(6);H("matTooltip",A.i18n.createNewSessionTooltip)}}function ELA(t,e){if(t&1&&(hA(0,"div",52),O(1,dLA,5,2,"button",66)(2,BLA,3,1,"button",67)),t&2){let A=p(5);u(),Y(A.uiEvents().length>0?1:2)}}function hLA(t,e){if(t&1&&O(0,ELA,3,1),t&2){let A=p(4);Y(A.sessionId?0:-1)}}function QLA(t,e){if(t&1&&(ta(0),Ht(1,"async"),O(2,hLA,1,1)),t&2){let A=si(1,1,p(3).uiStateService.isSessionLoading());u(2),Y(A===!1?2:-1)}}function uLA(t,e){if(t&1){let A=QA();B(0,"div",15)(1,"button",65),U("click",function(){T(A);let n=p(2);return J(n.toggleSessionSelectorDrawer())}),B(2,"mat-icon",17),y(3,"chat"),Q(),B(4,"span",18),y(5),Q(),B(6,"mat-icon",20),y(7,"arrow_drop_down"),Q()(),O(8,QLA,3,3),Q()}if(t&2){let A=p(2);u(5),lA(A.getToolbarSessionId()),u(3),Y(A.evalCase?-1:8)}}function fLA(t,e){if(t&1&&(B(0,"div",56)(1,"span",62),y(2),Q(),B(3,"span",70),y(4),Q()()),t&2){let A=p(3);u(2),lA(A.i18n.evalCaseIdLabel),u(2),lA(A.evalCase.evalId)}}function pLA(t,e){if(t&1){let A=QA();B(0,"button",71),U("click",function(){T(A);let n=p(3);return J(n.cancelEditEvalCase())}),y(1),Q(),B(2,"button",72),U("click",function(){T(A);let n=p(3);return J(n.saveEvalCase())}),y(3),Q()}if(t&2){let A=p(3);u(),ue(" ",A.i18n.cancelButton," "),u(),H("disabled",!A.hasEvalCaseChanged()||A.isEvalCaseEditing()),u(),ue(" ",A.i18n.saveButton," ")}}function mLA(t,e){}function wLA(t,e){if(t&1&&(O(0,fLA,5,2,"div",56),B(1,"div",59),O(2,pLA,4,3)(3,mLA,0,0),Q()),t&2){let A=p(2);Y(A.isViewOnlySession()?-1:0),u(2),Y(A.isEvalEditMode()?2:3)}}function DLA(t,e){}function yLA(t,e){if(t&1&&(B(0,"div",73),y(1),Q()),t&2){let A=p(3);u(),lA(A.i18n.loadingSessionLabel)}}function vLA(t,e){if(t&1&&(B(0,"div",58),ta(1),Ht(2,"async"),O(3,DLA,0,0)(4,yLA,2,1,"div",73),Q()),t&2){let A=si(2,1,p(2).uiStateService.isSessionLoading());u(3),Y(A===!1?3:4)}}function bLA(t,e){if(t&1){let A=QA();B(0,"button",74),U("click",function(){T(A);let n=p(2);return J(n.themeService.toggleTheme())}),B(1,"mat-icon"),y(2),Q()()}if(t&2){let A=p(2);H("matTooltip",A.themeService.currentTheme()==="dark"?"Switch to Light Mode":"Switch to Dark Mode"),u(2),lA(A.themeService.currentTheme()==="dark"?"light_mode":"dark_mode")}}function MLA(t,e){if(t&1&&(B(0,"div",21),O(1,ILA,8,2,"div",56)(2,uLA,9,2,"div",15),B(3,"div",57),O(4,wLA,4,2)(5,vLA,5,3,"div",58),Q(),B(6,"div",59),ta(7),Ht(8,"async"),O(9,bLA,3,2,"button",60),Q()()),t&2){let A=p();u(),Y(A.isViewOnlySession()?1:2),u(3),Y(A.evalCase?4:5);let i=si(8,3,A.uiStateService.isSessionLoading());u(5),Y(i===!1?9:-1)}}function SLA(t,e){t&1&&(B(0,"div",84),hA(1,"mat-progress-spinner",85),Q())}function kLA(t,e){t&1&&(B(0,"mat-icon",91),y(1,"check"),Q())}function xLA(t,e){if(t&1){let A=QA();B(0,"button",88),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.selectAppFromDrawer(n))}),B(1,"mat-icon",89),y(2,"robot_2"),Q(),B(3,"span",90),y(4),Q(),O(5,kLA,2,0,"mat-icon",91),Q()}if(t&2){let A=e.$implicit,i=p(3);RA("selected",A===i.appName),u(4),lA(A),u(),Y(A===i.appName?5:-1)}}function _LA(t,e){t&1&&(B(0,"div",87),y(1,"No apps found"),Q())}function RLA(t,e){t&1&&Ue(0,xLA,6,4,"button",86,ri,!1,_LA,2,0,"div",87),t&2&&Te(e)}function NLA(t,e){if(t&1){let A=QA();B(0,"div",75)(1,"span",76),y(2,"Select an App"),Q(),B(3,"div")(4,"button",77),U("click",function(){T(A);let n=p();return J(n.openAddItemDialog())}),B(5,"mat-icon"),y(6,"add"),Q()(),B(7,"button",78),U("click",function(){T(A);let n=p();return J(n.toggleAppSelectorDrawer())}),B(8,"mat-icon"),y(9,"close"),Q()()()(),B(10,"div",79)(11,"mat-form-field",80)(12,"mat-icon",81),y(13,"search"),Q(),B(14,"input",82,3),U("keydown",function(n){T(A);let o=p();return J(o.handleAppSearchKeydown(n))}),Q()()(),B(16,"div",83),U("keydown",function(n){T(A);let o=p();return J(o.handleAppListKeydown(n))}),O(17,SLA,2,0,"div",84),Ht(18,"async"),WI(19,RLA,3,1),Q()}if(t&2){let A,i=p();u(14),H("formControl",i.appDrawerSearchControl),u(3),Y(i.isLoadingApps()?17:(A=si(18,2,i.filteredDrawerApps$))?19:-1,A)}}function FLA(t,e){if(t&1){let A=QA();B(0,"button",94),U("click",function(){T(A);let n=p(2);return J(n.importSession())}),B(1,"mat-icon"),y(2,"upload"),Q(),B(3,"span"),y(4,"Import"),Q()()}if(t&2){let A=p(2);H("matTooltip",A.i18n.importSessionTooltip)}}function LLA(t,e){if(t&1){let A=QA();B(0,"button",107),U("click",function(){T(A);let n=p(3);return J(n.exportSession())}),B(1,"mat-icon"),y(2,"download"),Q(),B(3,"span"),y(4,"Export"),Q()()}if(t&2){let A=p(3);H("matTooltip",A.i18n.exportSessionTooltip)}}function GLA(t,e){if(t&1){let A=QA();B(0,"button",108),U("click",function(){T(A);let n=p(3);return J(n.deleteSession(n.sessionId))}),B(1,"mat-icon"),y(2,"delete"),Q(),B(3,"span"),y(4,"Delete"),Q()()}if(t&2){let A=p(3);H("matTooltip",A.i18n.deleteSessionTooltip)}}function KLA(t,e){if(t&1){let A=QA();B(0,"div",96)(1,"span",99),y(2,"Current Session"),Q(),B(3,"div",100)(4,"app-inline-edit",101),U("save",function(n){T(A);let o=p(2);return J(o.saveSessionName(n))}),Q()(),B(5,"div",102)(6,"span",103),y(7),Q(),B(8,"button",104),U("click",function(){T(A);let n=p(2);return J(n.copySessionId())}),B(9,"mat-icon"),y(10,"content_copy"),Q()(),O(11,LLA,5,1,"button",105),Ht(12,"async"),O(13,GLA,5,1,"button",106),Ht(14,"async"),Q()()}if(t&2){let A=p(2);u(4),H("value",A.sessionDisplayNameDraft)("displayValue",A.getCurrentSessionDisplayName())("tooltip",A.sessionId),u(2),H("title",A.sessionId),u(),lA(A.sessionId),u(4),Y(si(12,7,A.isExportSessionEnabledObs)?11:-1),u(2),Y(si(14,9,A.isDeleteSessionEnabledObs)?13:-1)}}function ULA(t,e){if(t&1){let A=QA();B(0,"div",75)(1,"span",76),y(2,"Select a Session"),Q(),B(3,"div",92),O(4,FLA,5,1,"button",93),Ht(5,"async"),B(6,"button",94),U("click",function(){T(A);let n=p();return J(n.viewSession())}),B(7,"mat-icon"),y(8,"visibility"),Q(),B(9,"span"),y(10,"View"),Q()(),B(11,"button",95),U("click",function(){T(A);let n=p();return J(n.toggleSessionSelectorDrawer())}),B(12,"mat-icon"),y(13,"close"),Q()()()(),O(14,KLA,15,11,"div",96),B(15,"div",97)(16,"app-session-tab",98,4),U("sessionSelected",function(n){T(A);let o=p();return J(o.onSessionSelectedFromDrawer(n))})("sessionReloaded",function(n){T(A);let o=p();return J(o.onSessionReloadedFromDrawer(n))}),Q()()}if(t&2){let A=p();u(4),Y(si(5,6,A.importSessionEnabledObs)?4:-1),u(2),H("matTooltip",A.i18n.viewSessionTooltip),u(8),Y(A.sessionId?14:-1),u(2),H("userId",A.userId)("appName",A.appName)("sessionId",A.sessionId)}}function TLA(t,e){if(t&1){let A=QA();B(0,"app-side-panel",109),U("jumpToInvocation",function(n){T(A);let o=p();return J(o.handleJumpToInvocation(n))})("closePanel",function(){T(A);let n=p();return J(n.toggleSidePanel())})("tabChange",function(n){T(A);let o=p();return J(o.handleTabChange(n))})("sessionSelected",function(n){T(A);let o=p();return J(o.updateWithSelectedSession(n))})("evalCaseSelected",function(n){T(A);let o=p();return J(o.updateWithSelectedEvalCase(n))})("editEvalCaseRequested",function(n){T(A);let o=p();return J(o.handleEditEvalCaseRequested(n))})("testSelected",function(n){T(A);let o=p();return J(o.updateWithSelectedTest(n.testName,n.events))})("evalSetIdSelected",function(n){T(A);let o=p();return J(o.updateSelectedEvalSetId(n))})("returnToSession",function(n){T(A);let o=p();return J(o.handleReturnToSession(n))})("evalNotInstalled",function(n){T(A);let o=p();return J(o.handleEvalNotInstalled(n))})("page",function(n){T(A);let o=p();return J(o.handlePageEvent(n))})("closeSelectedEvent",function(){T(A);let n=p();return J(n.closeSelectedEvent())})("openImageDialog",function(n){T(A);let o=p();return J(o.openViewImageDialog(n))})("openAddItemDialog",function(){T(A);let n=p();return J(n.openAddItemDialog())})("enterBuilderMode",function(){T(A);let n=p();return J(n.enterBuilderMode())})("showAgentStructureGraph",function(){T(A);let n=p();return J(n.openAgentStructureGraphDialog("event"))})("switchToEvent",function(n){T(A);let o=p();return J(o.selectEvent(n))})("switchToTraceView",function(){T(A);let n=p();return J(n.switchToTraceView())})("drillDownNodePath",function(n){T(A);let o=p();return J(o.onEventTabDrillDown(n))})("selectEventById",function(n){T(A);let o=p();return J(o.selectEvent(n))}),Q()}if(t&2){let A=p();H("isApplicationSelectorEnabledObs",A.isApplicationSelectorEnabledObs)("showSidePanel",A.showSidePanel)("appName",A.appName)("userId",A.userId)("sessionId",A.sessionId)("isViewOnlySession",A.isViewOnlySession())("isViewOnlyAppNameMismatch",A.isViewOnlyAppNameMismatch())("traceData",A.traceData)("eventData",A.eventData)("currentSessionState",A.currentSessionState)("artifacts",A.artifacts)("selectedEvent",A.selectedEvent)("selectedEventIndex",A.selectedEventIndex)("renderedEventGraph",A.renderedEventGraph)("rawSvgString",A.rawSvgString)("selectedEventGraphPath",A.selectedEventGraphPath)("llmRequest",A.llmRequest)("llmResponse",A.llmResponse)("disableBuilderIcon",A.disableBuilderSwitch)("hasSubWorkflows",A.hasSubWorkflows)("graphsAvailable",A.graphsAvailable())("invocationDisplayMap",A.invocationDisplayMap())("forceGraphTab",A.autoSelectLatestEvent)}}function JLA(t,e){if(t&1){let A=QA();B(0,"app-builder-tabs",110),U("exitBuilderMode",function(){T(A);let n=p();return J(n.exitBuilderMode())})("closePanel",function(){T(A);let n=p();return J(n.toggleSidePanel())}),Q(),hA(1,"div",111)}if(t&2){let A=p();H("appNameInput",A.appName)}}function OLA(t,e){if(t&1){let A=QA();B(0,"div",36)(1,"div",112)(2,"button",113),U("click",function(){T(A);let n=p();return J(n.saveAgentBuilder())}),B(3,"mat-icon"),y(4,"check"),Q()(),B(5,"button",114),U("click",function(){T(A);let n=p();return J(n.exitBuilderMode())}),B(6,"mat-icon"),y(7,"close"),Q()(),B(8,"button",115),U("click",function(){T(A);let n=p();return J(n.toggleBuilderAssistant())}),B(9,"mat-icon"),y(10,"assistant"),Q()()(),B(11,"app-canvas",116),U("toggleSidePanelRequest",function(){T(A);let n=p();return J(n.toggleSidePanel())})("builderAssistantCloseRequest",function(){T(A);let n=p();return J(n.toggleBuilderAssistant())}),Q()()}if(t&2){let A=p();u(8),RA("active",A.showBuilderAssistant),u(3),H("showSidePanel",A.showSidePanel)("showBuilderAssistant",A.showBuilderAssistant)("appNameInput",A.appName)}}function YLA(t,e){if(t&1&&(B(0,"div",118)(1,"span"),y(2),Q()()),t&2){let A=p(3);u(2),lA(A.i18n.loadingAgentsLabel)}}function HLA(t,e){if(t&1&&(B(0,"span"),y(1),hA(2,"br"),y(3),Q()),t&2){let A=p(4);u(),lA(A.i18n.welcomeMessage),u(2),ue(" ",A.i18n.selectAgentMessage)}}function zLA(t,e){if(t&1&&(y(0),hA(1,"br"),B(2,"pre",120),y(3),Q()),t&2){let A=p(5);ue(" ",A.i18n.errorMessageLabel," "),u(3),lA(A.loadingError())}}function PLA(t,e){if(t&1&&(B(0,"pre",119),y(1),Q()),t&2){let A=p(5);u(),lA(A.i18n.noAgentsFoundWarning)}}function jLA(t,e){if(t&1&&(B(0,"div"),y(1),B(2,"pre"),y(3,"adk web"),Q(),y(4," in the folder that contains the agents."),hA(5,"br"),O(6,zLA,4,2)(7,PLA,2,1,"pre",119),Q()),t&2){let A=p(4);u(),ue(" ",A.i18n.failedToLoadAgentsMessage," "),u(5),Y(A.loadingError()?6:7)}}function qLA(t,e){if(t&1&&(B(0,"div",118),O(1,HLA,4,2,"span"),Ht(2,"async"),WI(3,jLA,8,2,"div"),Q()),t&2){let A=p(3);u(),Y((si(2,1,A.apps$)||Kc(3,giA)).length>0?1:3)}}function VLA(t,e){if(t&1&&(O(0,YLA,3,1,"div",118),Ht(1,"async"),WI(2,qLA,4,4,"div",118)),t&2){let A=p(2);Y(A.isLoadingApps()?0:si(1,1,A.isApplicationSelectorEnabledObs)?2:-1)}}function WLA(t,e){if(t&1){let A=QA();B(0,"div",143,8),U("click",function(n){return n.stopPropagation()}),B(2,"span",144),y(3),Q(),B(4,"button",145),U("click",function(n){T(A);let o=p(3);return J(o.removeInvocationIdFilter(n))}),B(5,"mat-icon"),y(6,"close"),Q()()()}if(t&2){p();let A=Qi(18),i=p(2);H("matMenuTriggerFor",A)("matTooltip",i.invocationIdFilter()?"Invocation: "+(i.invocationDisplayMap().get(i.invocationIdFilter())||i.invocationIdFilter()):"Filter events by a specific invocation"),u(2),H("title",i.invocationIdFilter()?i.invocationDisplayMap().get(i.invocationIdFilter())||i.invocationIdFilter():"Invocation"),u(),lA(i.invocationIdFilter()?i.invocationDisplayMap().get(i.invocationIdFilter())||i.invocationIdFilter():"Invocation")}}function ZLA(t,e){if(t&1){let A=QA();B(0,"div",143,9),U("click",function(n){return n.stopPropagation()}),B(2,"span",62),y(3,"Node"),Q(),B(4,"button",145),U("click",function(n){T(A);let o=p(3);return J(o.removeNodePathFilter(n))}),B(5,"mat-icon"),y(6,"close"),Q()()()}if(t&2){p();let A=Qi(22),i=p(2);H("matMenuTriggerFor",A)("matTooltip",i.nodePathFilter()?"Node: "+i.nodePathFilter():"Filter events generated by a specific node")}}function XLA(t,e){if(t&1){let A=QA();B(0,"div",146),U("click",function(n){return n.stopPropagation()}),B(1,"span",62),y(2,"Final"),Q(),B(3,"button",145),U("click",function(n){return T(A),p(3).toggleHideIntermediateEvents(),J(n.stopPropagation())}),B(4,"mat-icon"),y(5,"close"),Q()()()}}function $LA(t,e){if(t&1&&(B(0,"div",147,10),U("click",function(i){return i.stopPropagation()}),B(2,"mat-icon"),y(3,"add"),Q(),B(4,"span"),y(5,"Filter"),Q()()),t&2){p();let A=Qi(13);H("matMenuTriggerFor",A)}}function AGA(t,e){if(t&1){let A=QA();B(0,"div",148),U("click",function(n){T(A);let o=p(3);return J(o.clearAllFilters(n))}),B(1,"mat-icon"),y(2,"clear_all"),Q(),B(3,"span"),y(4,"Clear"),Q()()}}function eGA(t,e){if(t&1){let A=QA();B(0,"button",149),U("click",function(){T(A);let n=p(3);return J(n.addInvocationIdFilter())}),y(1,"Invocation"),Q()}}function tGA(t,e){if(t&1){let A=QA();B(0,"button",150),U("click",function(){T(A);let n=p(3);return J(n.addNodePathFilter())}),y(1,"Node"),Q()}}function iGA(t,e){if(t&1){let A=QA();B(0,"button",151),U("click",function(){T(A);let n=p(3);return J(n.toggleHideIntermediateEvents())}),y(1,"Final"),Q()}}function nGA(t,e){if(t&1){let A=QA();B(0,"button",152),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.setInvocationIdFilter(n))}),B(1,"mat-icon",153),y(2,"check"),Q(),y(3),Q()}if(t&2){let A=e.$implicit,i=p(3);H("matTooltip",A),u(),ut("visibility",i.invocationIdFilter()===A?"visible":"hidden"),u(2),ue(" ",i.invocationDisplayMap().get(A)||A," ")}}function oGA(t,e){if(t&1){let A=QA();B(0,"button",154),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.setNodePathFilter(n))}),B(1,"mat-icon",153),y(2,"check"),Q(),y(3),Q()}if(t&2){let A=e.$implicit,i=p(3);u(),ut("visibility",i.nodePathFilter()===A?"visible":"hidden"),u(2),ue(" ",A," ")}}function aGA(t,e){if(t&1){let A=QA();B(0,"button",155),U("click",function(){T(A);let n=p(3);return J(n.isSideBySide.set(!n.isSideBySide()))}),B(1,"mat-icon",156),y(2),Q(),B(3,"span",157),y(4,"Compare"),Q()()}if(t&2){let A=p(3);ut("color",A.isSideBySide()?"var(--mat-sys-primary)":"var(--mat-sys-on-surface-variant)"),u(2),lA(A.isSideBySide()?"check_circle":"radio_button_unchecked")}}function rGA(t,e){if(t&1){let A=QA();B(0,"button",158),U("click",function(){T(A);let n=p(3);return J(n.toggleSse())}),B(1,"mat-icon",156),y(2),Q(),B(3,"span",157),y(4,"Streaming"),Q()()}if(t&2){let A=p(3);ut("color",A.useSse()?"var(--mat-sys-primary)":"var(--mat-sys-on-surface-variant)"),u(2),lA(A.useSse()?"check_circle":"radio_button_unchecked")}}function sGA(t,e){if(t&1){let A=QA();B(0,"app-chat-panel",159),Ht(1,"async"),Di("userInputChange",function(n){T(A);let o=p(3);return Bi(o.userInput,n)||(o.userInput=n),J(n)}),U("toggleHideIntermediateEvents",function(){T(A);let n=p(3);return J(n.toggleHideIntermediateEvents())})("toggleSse",function(){T(A);let n=p(3);return J(n.toggleSse())})("clickEvent",function(n){T(A);let o=p(3);return J(o.clickEvent(n))})("handleKeydown",function(n){T(A);let o=p(3);return J(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){T(A);let o=p(3);return J(o.cancelEditMessage(n))})("saveEditMessage",function(n){T(A);let o=p(3);return J(o.saveEditMessage(n))})("openViewImageDialog",function(n){T(A);let o=p(3);return J(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){T(A);let o=p(3);return J(o.openBase64InNewTab(n.data,n.mimeType))})("fileSelect",function(n){T(A);let o=p(3);return J(o.onFileSelect(n))})("removeFile",function(n){T(A);let o=p(3);return J(o.removeFile(n))})("removeStateUpdate",function(){T(A);let n=p(3);return J(n.removeStateUpdate())})("sendMessage",function(n){T(A);let o=p(3);return J(o.handleChatInput(n))})("updateState",function(){T(A);let n=p(3);return J(n.updateState())})("toggleAudioRecording",function(n){T(A);let o=p(3);return J(o.toggleAudioRecording(n))})("toggleVideoRecording",function(){T(A);let n=p(3);return J(n.toggleVideoRecording())})("longRunningResponseComplete",function(n){T(A);let o=p(3);return J(o.sendMessage(n))}),Q()}if(t&2){let A=p(3);H("appName",A.appName)("agentReadme",A.agentReadme),wi("userInput",A.userInput),H("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("traceData",A.traceData)("isTokenStreamingEnabled",si(1,22,A.isTokenStreamingEnabledObs)??!1)("useSse",A.useSse())("isChatMode",!0)("selectedFiles",A.selectedFiles)("updatedSessionState",A.updatedSessionState())("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("isAudioRecording",A.isAudioRecording)("micVolume",A.micVolume())("isVideoRecording",A.isVideoRecording)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function lGA(t,e){if(t&1){let A=QA();B(0,"app-chat-panel",160),Ht(1,"async"),Di("userInputChange",function(n){T(A);let o=p(3);return Bi(o.userInput,n)||(o.userInput=n),J(n)})("userEditEvalCaseMessageChange",function(n){T(A);let o=p(3);return Bi(o.userEditEvalCaseMessage,n)||(o.userEditEvalCaseMessage=n),J(n)}),U("clickEvent",function(n){T(A);let o=p(3);return J(o.clickEvent(n))})("handleKeydown",function(n){T(A);let o=p(3);return J(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){T(A);let o=p(3);return J(o.cancelEditMessage(n))})("saveEditMessage",function(n){T(A);let o=p(3);return J(o.saveEditMessage(n))})("openViewImageDialog",function(n){T(A);let o=p(3);return J(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){T(A);let o=p(3);return J(o.openBase64InNewTab(n.data,n.mimeType))})("editEvalCaseMessage",function(n){T(A);let o=p(3);return J(o.editEvalCaseMessage(n))})("deleteEvalCaseMessage",function(n){T(A);let o=p(3);return J(o.deleteEvalCaseMessage(n.message,n.index))})("editFunctionArgs",function(n){T(A);let o=p(3);return J(o.editFunctionArgs(n))}),Q()}if(t&2){let A=p(3);H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("isChatMode",!1)("evalCase",A.evalCase)("isEvalEditMode",A.isEvalEditMode())("isEvalCaseEditing",A.isEvalCaseEditing())("isEditFunctionArgsEnabled",si(1,19,A.isEditFunctionArgsEnabledObs)??!1),wi("userInput",A.userInput)("userEditEvalCaseMessage",A.userEditEvalCaseMessage),H("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function gGA(t,e){if(t&1&&(B(0,"div",174),y(1),Q()),t&2){p();let A=zn(40);u(),ue(" ",A)}}function cGA(t,e){if(t&1&&(B(0,"div",166)(1,"span",167),y(2),Ht(3,"formatMetricName"),Q(),B(4,"div",168)(5,"span",169),y(6),Ht(7,"number"),Q(),B(8,"span",170),y(9),Ht(10,"number"),Q()(),B(11,"div",171)(12,"div",172),y(13),Ht(14,"formatMetricName"),Q(),B(15,"div",173),y(16),Q(),B(17,"div",48)(18,"div",49)(19,"span",50),y(20,"Actual:"),Q(),B(21,"span",51),y(22),Ht(23,"number"),Q()(),B(24,"div",49)(25,"span",50),y(26,"Threshold:"),Q(),B(27,"span",51),y(28),Ht(29,"number"),Q()(),B(30,"div",49)(31,"span",50),y(32,"Min:"),Q(),B(33,"span",51),y(34),Q()(),B(35,"div",49)(36,"span",50),y(37,"Max:"),Q(),B(38,"span",51),y(39),Q()()(),ta(40),O(41,gGA,2,1,"div",174),Q()()),t&2){let A=e.$implicit,i=p(6);ut("border",A.evalStatus==1?"1px solid #2e7d32":"1px solid var(--mat-sys-error)"),u(2),lA(si(3,16,A.metricName)),u(3),ut("color",A.evalStatus==1?"#2e7d32":"var(--mat-sys-error)"),u(),ue(" ",A.score!=null?T0(7,18,A.score,"1.2-2"):"?"," "),u(3),ue(" / ",T0(10,21,A.threshold,"1.2-2")," "),u(4),lA(si(14,24,A.metricName)),u(3),lA(A.metricName),u(5),ut("color",A.evalStatus==1?"#2e7d32":"var(--mat-sys-error)"),u(),lA(A.score!=null?T0(23,26,A.score,"1.2-2"):"?"),u(6),lA(T0(29,29,A.threshold,"1.2-2")),u(6),lA(i.getMetricMin(A.metricName)),u(5),lA(i.getMetricMax(A.metricName)),u();let n=ga(i.getMetricDescription(A.metricName));u(),Y(n?41:-1)}}function CGA(t,e){if(t&1&&(B(0,"div",164),Ue(1,cGA,42,33,"div",165,nLA),Q()),t&2){p();let A=zn(0);u(),Te(A.overallEvalMetricResults)}}function IGA(t,e){if(t&1&&(ta(0),B(1,"div",161),O(2,CGA,3,0,"div",164),Q()),t&2){let A=ga(p(4).evalCaseResult());u(2),Y(A.overallEvalMetricResults!=null&&A.overallEvalMetricResults.length?2:-1)}}function dGA(t,e){if(t&1){let A=QA();B(0,"div",162)(1,"div",175)(2,"div",176),y(3,"Expected"),Q(),hA(4,"app-chat-panel",177),Q(),B(5,"div",175)(6,"div",176),y(7,"Actual"),Q(),B(8,"app-chat-panel",178),Ht(9,"async"),Ht(10,"async"),U("toggleHideIntermediateEvents",function(){T(A);let n=p(4);return J(n.toggleHideIntermediateEvents())})("toggleSse",function(){T(A);let n=p(4);return J(n.toggleSse())}),Di("userInputChange",function(n){T(A);let o=p(4);return Bi(o.userInput,n)||(o.userInput=n),J(n)})("userEditEvalCaseMessageChange",function(n){T(A);let o=p(4);return Bi(o.userEditEvalCaseMessage,n)||(o.userEditEvalCaseMessage=n),J(n)}),U("clickEvent",function(n){T(A);let o=p(4);return J(o.clickEvent(n))})("handleKeydown",function(n){T(A);let o=p(4);return J(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){T(A);let o=p(4);return J(o.cancelEditMessage(n))})("saveEditMessage",function(n){T(A);let o=p(4);return J(o.saveEditMessage(n))})("openViewImageDialog",function(n){T(A);let o=p(4);return J(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){T(A);let o=p(4);return J(o.openBase64InNewTab(n.data,n.mimeType))})("editEvalCaseMessage",function(n){T(A);let o=p(4);return J(o.editEvalCaseMessage(n))})("deleteEvalCaseMessage",function(n){T(A);let o=p(4);return J(o.deleteEvalCaseMessage(n.message,n.index))})("editFunctionArgs",function(n){T(A);let o=p(4);return J(o.editFunctionArgs(n))})("fileSelect",function(n){T(A);let o=p(4);return J(o.onFileSelect(n))})("removeFile",function(n){T(A);let o=p(4);return J(o.removeFile(n))})("removeStateUpdate",function(){T(A);let n=p(4);return J(n.removeStateUpdate())})("sendMessage",function(n){T(A);let o=p(4);return J(o.handleChatInput(n))})("updateState",function(){T(A);let n=p(4);return J(n.updateState())})("toggleAudioRecording",function(n){T(A);let o=p(4);return J(o.toggleAudioRecording(n))})("toggleVideoRecording",function(){T(A);let n=p(4);return J(n.toggleVideoRecording())})("longRunningResponseComplete",function(n){T(A);let o=p(4);return J(o.sendMessage(n))}),Q()()()}if(t&2){let A=p(4);u(4),H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredExpectedUiEvents())("isChatMode",!1)("evalCase",A.evalCase)("isEvalEditMode",!1)("isEvalCaseEditing",!1)("isEditFunctionArgsEnabled",!1)("userInput","")("selectedFiles",Kc(54,giA))("updatedSessionState",null)("agentGraphData",A.agentGraphData())("selectedMessageIndex",-1)("isAudioRecording",!1)("micVolume",0)("isVideoRecording",!1)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn),u(4),H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("traceData",A.traceData)("isTokenStreamingEnabled",si(9,50,A.isTokenStreamingEnabledObs)??!1)("useSse",A.useSse())("isChatMode",!1)("evalCase",A.evalCase)("isEvalEditMode",A.isEvalEditMode())("isEvalCaseEditing",A.isEvalCaseEditing())("isEditFunctionArgsEnabled",si(10,52,A.isEditFunctionArgsEnabledObs)??!1),wi("userInput",A.userInput)("userEditEvalCaseMessage",A.userEditEvalCaseMessage),H("selectedFiles",A.selectedFiles)("updatedSessionState",A.updatedSessionState())("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("isAudioRecording",A.isAudioRecording)("micVolume",A.micVolume())("isVideoRecording",A.isVideoRecording)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function BGA(t,e){if(t&1&&hA(0,"app-chat-panel",163),t&2){let A=p(4);H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("traceData",A.traceData)("isChatMode",!1)("evalCase",A.evalCase)("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function EGA(t,e){if(t&1&&(O(0,IGA,3,2,"div",161),O(1,dGA,11,55,"div",162)(2,BGA,1,15,"app-chat-panel",163)),t&2){let A=p(3);Y(A.evalCaseResult()?0:-1),u(),Y(A.isSideBySide()?1:2)}}function hGA(t,e){t&1&&(B(0,"div",142)(1,"mat-icon",179),y(2,"insert_drive_file"),Q(),B(3,"h3",180),y(4,"File View"),Q(),B(5,"p",181),y(6,"File content lost on refresh. Please re-upload the file to view or use it."),Q()())}function QGA(t,e){if(t&1){let A=QA();B(0,"div",121)(1,"mat-button-toggle-group",122),U("change",function(n){T(A);let o=p(2);return J(o.onViewModeChange(n.value))}),B(2,"mat-button-toggle",123),y(3,"Events"),Q(),B(4,"mat-button-toggle",124),y(5,"Traces"),Q()(),B(6,"div",125),U("click",function(n){T(A);let o=p(2);return J(o.openAddFilterMenu(n))}),O(7,WLA,7,4,"div",126),O(8,ZLA,7,2,"div",126),O(9,XLA,6,0,"div",127),O(10,$LA,6,1,"div",128),O(11,AGA,5,0,"div",129),Q(),B(12,"mat-menu",130,5),O(14,eGA,2,0,"button",131),O(15,tGA,2,0,"button",132),O(16,iGA,2,0,"button",133),Q(),B(17,"mat-menu",134,6),U("closed",function(){T(A);let n=p(2);return J(n.onInvocationMenuClosed())}),Ue(19,nGA,4,4,"button",135,ri),Q(),B(21,"mat-menu",134,7),U("closed",function(){T(A);let n=p(2);return J(n.onNodePathMenuClosed())}),Ue(23,oGA,4,3,"button",136,ri),Q(),hA(25,"div",137),O(26,aGA,5,3,"button",138),O(27,rGA,5,3,"button",139),Ht(28,"async"),Q(),O(29,sGA,2,24,"app-chat-panel",140)(30,lGA,2,21,"app-chat-panel",141)(31,EGA,3,2)(32,hGA,7,0,"div",142)}if(t&2){let A,i=p(2);u(),H("value",i.viewMode()),u(6),Y(i.invocationIdFilterActive()?7:-1),u(),Y(i.nodePathFilterActive()?8:-1),u(),Y(i.hideIntermediateEvents()?9:-1),u(),Y(!i.invocationIdFilterActive()||!i.nodePathFilterActive()||!i.hideIntermediateEvents()?10:-1),u(),Y(i.invocationIdFilterActive()||i.nodePathFilterActive()||i.hideIntermediateEvents()?11:-1),u(3),Y(i.invocationIdFilterActive()?-1:14),u(),Y(i.nodePathFilterActive()?-1:15),u(),Y(i.hideIntermediateEvents()?-1:16),u(3),Te(i.invocationIdOptions()),u(4),Te(i.nodePathOptions()),u(3),Y(i.chatType()==="eval-result"?26:-1),u(),Y(si(28,12,i.isTokenStreamingEnabledObs)&&i.canEditSession()?27:-1),u(2),Y((A=i.chatType())==="session"?29:A==="eval-case"?30:A==="eval-result"?31:A==="file"?32:-1)}}function uGA(t,e){if(t&1&&(B(0,"div",37),Ve(1),B(2,"mat-card",117),O(3,VLA,3,3),O(4,QGA,33,14),Q()()),t&2){let A=p();u(2),RA("no-side-panel",!A.showSidePanel),u(),Y(A.selectedAppControl.value?-1:3),u(),Y(A.appName!=""?4:-1)}}function fGA(t,e){if(t&1){let A=QA();B(0,"app-agent-structure-graph-dialog",182),U("close",function(){T(A);let n=p();return J(n.showAgentStructureOverlay=!1)}),Q()}if(t&2){let A=p();H("appName",A.appName)("preloadedAppData",A.agentGraphData())("preloadedLightGraphSvg",A.agentStructureOverlayMode==="event"?A.eventGraphSvgLight:A.sessionGraphSvgLight)("preloadedDarkGraphSvg",A.agentStructureOverlayMode==="event"?A.eventGraphSvgDark:A.sessionGraphSvgDark)("startPath",A.agentStructureOverlayMode==="event"?A.selectedEventGraphPath:"")}}var pGA="root_agent",Bv="q",mGA="hideSidePanel",dF="",BF="",liA="application/json+a2ui";function EF(t){for(t=t.replace(/-/g,"+").replace(/_/g,"/");t.length%4!==0;)t+="=";return t}var hF=class t extends b1{nextPageLabel="Next Event";previousPageLabel="Previous Event";firstPageLabel="First Event";lastPageLabel="Last Event";getRangeLabel=(e,A,i)=>i===0?`Event 0 of ${i}`:(i=Math.max(i,0),`Event ${e*A+1} of ${i}`);static \u0275fac=(()=>{let e;return function(i){return(e||(e=bi(t)))(i||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac})},wGA="Restarting bidirectional streaming is not currently supported. Please refresh the page or start a new session.",Ev=class t{i18n=w(siA);sidePanelI18n=w(pQ);_snackBar=w(h2);activatedRoute=w(Vs);agentService=w($s);artifactService=w(TB);changeDetectorRef=w(wt);dialog=w(Or);document=w(ti);downloadService=w(JB);evalService=w(t0);eventService=w(o6);featureFlagService=w(yr);graphService=w(OB);localFileService=w(a6);location=w(g6);renderer=w(Pi);router=w(ls);safeValuesService=w(Cs);testsService=w(u2);sessionService=w(Al);streamChatService=w(s6);webSocketService=w(zB);audioRecordingService=w(YB);audioPlayingService=w(HB);stringToColorService=w(Q2);traceService=w(Ag);uiStateService=w(tg);agentBuilderService=w(e0);themeService=w(eg);logoComponent=w(PB,{optional:!0});chatPanel=So(hQ);canvasComponent=So.required(cQ);sideDrawer=So.required("sideDrawer");sidePanel=So.required(mQ);drawerSessionTab=So("drawerSessionTab");evalTab=So(xc);appSearchInput=So("appSearchInput");canChat=pe(()=>this.chatType()==="session");isEvalCaseEditing=bA(!1);hasEvalCaseChanged=bA(!1);isEvalEditMode=bA(!1);isBuilderMode=bA(!1);chatType=bA("session");currentEvalCaseId=null;currentEvalTimestamp=null;videoElement;currentMessage="";uiEvents=bA([]);invocationDisplayMap=pe(()=>{let e=new Map,A=1,i="";for(let n of this.uiEvents()){if(n.role==="user")if(n.text)i=n.text;else if(n.event?.content?.parts?.length){let o=n.event.content.parts.find(a=>a.text);o&&o.text&&(i=o.text)}else i="User Message";if(n.event?.invocationId){let o=n.event.invocationId;if(!e.has(o)){let a=i||"User Message";a.length>50&&(a=a.substring(0,47)+"..."),e.set(o,`#${A} (${a})`),A++}}}return e});artifacts=[];userInput="";userEditEvalCaseMessage="";userId="user";appName="";sessionId="";sessionIdOfLoadedMessages="";evalCase=null;evalCaseResult=bA(null);metricsInfo=this.evalService.metricsInfo;updatedEvalCase=null;adkVersion=bA("");versionInfo=bA(null);evalSetId="";isAudioRecording=!1;micVolume=this.audioRecordingService.volumeLevel;isVideoRecording=!1;longRunningEvents=[];functionCallEventId="";redirectUri=Dr.getBaseUrlWithoutPath();showSidePanel=window.localStorage.getItem("adk-side-panel-visible")!=="false";showBuilderAssistant=!0;showAppSelectorDrawer=!1;showSessionSelectorDrawer=!1;useSse=bA(window.localStorage.getItem("adk-use-sse")==="true");currentSessionState={};root_agent=pGA;updatedSessionState=bA(null);canEditSession=bA(!0);isViewOnlySession=bA(!1);isViewOnlyAppNameMismatch=bA(!1);isLoadedAppUnavailable=bA(!1);unavailableAppName=bA("");readonlySessionType=bA("");readonlySessionName=bA("");isSideBySide=bA(!1);expectedUiEvents=bA([]);viewMode=bA(localStorage.getItem("chat-view-mode")||"events");invocationIdFilterActive=bA(!1);nodePathFilterActive=bA(!1);invocationIdFilter=bA("");nodePathFilter=bA("");invocationIdOptions=pe(()=>{let e=new Set;for(let A of this.uiEvents())A.event?.invocationId&&e.add(A.event.invocationId);return Array.from(e)});nodePathOptions=pe(()=>{let e=new Set;for(let A of this.uiEvents()){let i=A.bareNodePath;i&&e.add(i)}return Array.from(e)});invChipMenuTrigger=So("invChipMenuTrigger");nodeChipMenuTrigger=So("nodeChipMenuTrigger");addMenuTrigger=So("addMenuTrigger");openAddFilterMenu(e){e.stopPropagation(),this.addMenuTrigger()?.openMenu()}addInvocationIdFilter(){this.invocationIdFilterActive.set(!0),setTimeout(()=>{this.invChipMenuTrigger()?.openMenu()})}addNodePathFilter(){this.nodePathFilterActive.set(!0),setTimeout(()=>{this.nodeChipMenuTrigger()?.openMenu()})}removeInvocationIdFilter(e){e.stopPropagation(),this.invocationIdFilterActive.set(!1),this.invocationIdFilter.set("")}removeNodePathFilter(e){e.stopPropagation(),this.nodePathFilterActive.set(!1),this.nodePathFilter.set("")}setInvocationIdFilter(e){this.invocationIdFilter.set(e)}setNodePathFilter(e){this.nodePathFilter.set(e)}onInvocationMenuClosed(){this.invocationIdFilter()||this.invocationIdFilterActive.set(!1)}onNodePathMenuClosed(){this.nodePathFilter()||this.nodePathFilterActive.set(!1)}clearAllFilters(e){e.stopPropagation(),this.invocationIdFilterActive()&&(this.invocationIdFilterActive.set(!1),this.invocationIdFilter.set("")),this.nodePathFilterActive()&&(this.nodePathFilterActive.set(!1),this.nodePathFilter.set("")),this.hideIntermediateEvents()&&this.toggleHideIntermediateEvents()}shouldShowEvent(e){let A=this.invocationIdFilter();if(A&&!(e.event?.invocationId||"").includes(A))return!1;let i=this.nodePathFilter();if(i&&!(e.bareNodePath||"").includes(i))return!1;if(!this.hideIntermediateEvents()||e.role==="user")return!0;if(e.event?.content!==void 0){let n=e.event.content.parts||[];if(n.length>0&&n.every(a=>a.functionCall||a.functionResponse)){if(n.some(r=>{let s=r.functionCall?.id||r.functionResponse?.id;return s&&e.event?.longRunningToolIds?.includes(s)}))return!0}else return!0}if(e.event?.output!==void 0){let n=e.event?.nodeInfo,o=!1,a=n?.outputFor;if(Array.isArray(a)?o=a.some(r=>!r.includes("/")):typeof a=="string"?o=!a.includes("/"):n?.path&&(o=!n.path.includes("/")),o)return!0}return!1}shouldShowEventFn=this.shouldShowEvent.bind(this);getMetricTooltip(e,A,i){let n=this.metricsInfo().find(g=>g.metricName===e),o=n?.description||"",a=n?.metricValueInfo?.interval?.minValue??"?",r=n?.metricValueInfo?.interval?.maxValue??"?",s=A!=null?parseFloat(A).toFixed(2):"?",l=i!=null?parseFloat(i).toFixed(2):"?";return`${o?o+" | ":""}Actual: ${s} | Threshold: ${l} | Min: ${a} | Max: ${r}`}getMetricDescription(e){return this.metricsInfo().find(i=>i.metricName===e)?.description||""}getMetricMin(e){let i=this.metricsInfo().find(n=>n.metricName===e)?.metricValueInfo?.interval?.minValue;return i!=null?i.toFixed(2):"?"}getMetricMax(e){let i=this.metricsInfo().find(n=>n.metricName===e)?.metricValueInfo?.interval?.maxValue;return i!=null?i.toFixed(2):"?"}getVersionTooltip(){let e=this.versionInfo();return e?`Version: ${e.version} | Language: ${e.language} | Language Version: ${e.language_version}`:""}getMergedTooltip(){let e=this.sidePanelI18n.disclosureTooltip||"",A=this.getVersionTooltip();return A?`${e} | ${A}`:e}filteredUiEvents=pe(()=>this.uiEvents().filter(e=>this.shouldShowEvent(e)));filteredExpectedUiEvents=pe(()=>this.expectedUiEvents().filter(e=>this.shouldShowEvent(e)));onViewModeChange(e){this.viewMode.set(e);try{localStorage.setItem("chat-view-mode",e)}catch(A){}}originalSessionId="";hideIntermediateEvents=bA(window.localStorage.getItem("adk-hide-intermediate-events")==="true");toggleHideIntermediateEvents(){let e=!this.hideIntermediateEvents();this.hideIntermediateEvents.set(e),window.localStorage.setItem("adk-hide-intermediate-events",String(e))}sessionHasUsedBidi=new Set;eventData=new Map;traceData=[];renderedEventGraph;rawSvgString=null;agentGraphData=bA(null);sessionGraphSvgLight={};sessionGraphSvgDark={};sessionGraphDot={};dynamicGraphDot={};agentReadme="";graphsAvailable=bA(!0);get hasSubWorkflows(){return Object.keys(this.sessionGraphSvgLight).length>1}selectedEvent=void 0;selectedEventIndex=void 0;selectedMessageIndex=void 0;llmRequest=void 0;llmResponse=void 0;llmRequestKey="gcp.vertex.agent.llm_request";llmResponseKey="gcp.vertex.agent.llm_response";getMediaTypeFromMimetype=X6;selectedFiles=[];MediaType=aC;selectedAppControl=new Os("",{nonNullable:!0});appDrawerSearchControl=new Os("",{nonNullable:!0});openBase64InNewTab(e,A){this.safeValuesService.openBase64InNewTab(e,A)}isLoadingApps=bA(!1);loadingError=bA("");apps$=ne([]).pipe(di(()=>{this.isLoadingApps.set(!0),this.selectedAppControl.disable()}),hi(()=>this.agentService.listApps().pipe(Po(e=>(this.loadingError.set(e.message),ne(void 0))))),uo(1),di(e=>{this.isLoadingApps.set(!1),this.selectedAppControl.enable(),e?.length==1&&this.router.navigate([],{relativeTo:this.activatedRoute,queryParams:{app:e[0]},queryParamsHandling:"merge"})}),Gs());filteredDrawerApps$=this.apps$.pipe(hi(e=>Qr([ne(e),this.appDrawerSearchControl.valueChanges.pipe(Sn(""))])),we(([e,A])=>{if(!e||!A||A.trim()==="")return e;let i=A.toLowerCase().trim();return e.filter(n=>n.toLowerCase().includes(i))}));importSessionEnabledObs=this.featureFlagService.isImportSessionEnabled();isEditFunctionArgsEnabledObs=this.featureFlagService.isEditFunctionArgsEnabled();isSessionUrlEnabledObs=this.featureFlagService.isSessionUrlEnabled();isApplicationSelectorEnabledObs=this.featureFlagService.isApplicationSelectorEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isExportSessionEnabledObs=this.featureFlagService.isExportSessionEnabled();isEventFilteringEnabled=Ar(this.featureFlagService.isEventFilteringEnabled());isApplicationSelectorEnabled=Ar(this.featureFlagService.isApplicationSelectorEnabled());isDeleteSessionEnabledObs=this.featureFlagService.isDeleteSessionEnabled();isUserIdOnToolbarEnabledObs=this.featureFlagService.isUserIdOnToolbarEnabled();isDeveloperUiDisclaimerEnabledObs=this.featureFlagService.isDeveloperUiDisclaimerEnabled();disableBuilderSwitch=!1;autoSelectLatestEvent=!1;constructor(){Ao(()=>{this.themeService.currentTheme()&&this.updateRenderedGraph()})}ngOnInit(){if(this.syncSelectedAppFromUrl(),this.updateSelectedAppUrl(),this.hideSidePanelIfNeeded(),this.agentService.getVersion().subscribe(i=>{this.adkVersion.set(i.version||""),this.versionInfo.set(i)}),Qr([this.agentService.getApp(),this.activatedRoute.queryParams]).pipe(gt(([i,n])=>!!i&&!!n[Bv]),$n(),we(([,i])=>i[Bv])).subscribe(i=>{setTimeout(()=>{this.userInput=i})}),this.streamChatService.onStreamClose().subscribe(i=>{let n=`Please check server log for full details: +`+i;this.openSnackBar(n,"OK")}),this.webSocketService.getMessages().subscribe(i=>{if(i)try{let n=JSON.parse(i);(n.interrupted||n.inputTranscription!==void 0&&n.partial)&&this.audioPlayingService.stopAudio(),this.appendEventRow(n),this.changeDetectorRef.detectChanges()}catch(n){}}),new URL(window.location.href).searchParams.has("code")){let i=window.location.href;window.opener?.postMessage({authResponseUrl:i},window.origin),window.close()}this.agentService.getApp().subscribe(i=>{this.appName=i,this.evalService.metricsInfo.set([])}),this.traceService.selectedTraceRow$.subscribe(i=>{i&&(this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0,this.showSidePanel||(this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true"),this.sideDrawer()?.open()),this.changeDetectorRef.detectChanges())}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe($n()).subscribe(i=>{i&&(this.uiStateService.onNewMessagesLoaded().subscribe(n=>{this.populateMessages(n.items,!0,!n.isBackground),this.loadTraceData()}),this.uiStateService.onNewMessagesLoadingFailed().subscribe(n=>{this.openSnackBar(n.message,"OK")}))})}get sessionTab(){return this.drawerSessionTab()}switchToTraceView(){this.onViewModeChange("traces")}ngAfterViewInit(){this.showSidePanel&&this.sideDrawer()?.open(),this.isApplicationSelectorEnabled()||this.loadSessionByUrlOrReset()}selectApp(e){if(this.isLoadedAppUnavailable.set(!1),e!=this.appName){let A=!this.appName;this.agentService.setApp(e),A?this.loadSessionByUrlOrReset():this.createSessionAndReset()}}loadSessionByUrlOrReset(){this.isSessionUrlEnabledObs.subscribe(e=>{let A=this.activatedRoute.snapshot.queryParams,i=A.session,n=A.userId,o=A.evalCase,a=A.evalResult,r=A.file;if(n&&(this.userId=n),o){this.chatType.set("eval-case");let s=o.split("/");if(s.length===2){let l=s[0],g=s[1];this.evalSetId=l,this.evalService.getEvalCase(this.appName,l,g).subscribe(C=>{C&&(this.updateWithSelectedEvalCase(C),setTimeout(()=>{let I=this.sidePanel();I.switchToEvalTab(),I.selectEvalCase(l,C)},600))})}return}if(a){this.chatType.set("eval-result");let s=a.split("/");if(console.log("loadSessionByUrlOrReset evalResultUrl parts:",s),s.length===3){let l=s[0],g=s[1],C=s[2];this.evalSetId=l;let I=`${this.appName}_${l}_${C}`;console.log("loadSessionByUrlOrReset runId:",I),this.evalService.getEvalResult(this.appName,I).subscribe(d=>{if(console.log("loadSessionByUrlOrReset runResult:",d),d){let h=d.evalCaseResults?.find(E=>E.evalId===g);if(console.log("loadSessionByUrlOrReset evalCaseResult:",h),h){let E=h.sessionId;this.evalService.getEvalCase(this.appName,l,g).subscribe(f=>{this.sessionService.getSession(this.userId,this.appName,E).subscribe(m=>{this.addEvalCaseResultToEvents(m,h);let v={id:m?.id??"",appName:m?.appName??"",userId:m?.userId??"",state:m?.state??[],events:m?.events??[],isEvalResult:!0,evalCase:f,evalCaseResult:h,timestamp:C};this.updateWithSelectedSession(v),setTimeout(()=>{let k=this.sidePanel();k.switchToEvalTab(),k.selectEvalResult(l,C,f)},600)})})}}})}return}if(r){this.chatType.set("file");return}if(!e||!i){this.chatType.set("session"),this.createSessionAndReset();return}i&&(this.chatType.set("session"),this.sessionId=i,this.loadSession(i,!0))})}loadSession(e,A=!1){this.uiStateService.setIsSessionLoading(!0),this.isViewOnlySession.set(!1),this.isViewOnlyAppNameMismatch.set(!1),Qr([this.sessionService.getSession(this.userId,this.appName,e).pipe(Po(i=>(A&&(this.openSnackBar("Cannot find specified session. Creating a new one.",void 0,3e3),this.createSessionAndReset()),ne(null)))),this.featureFlagService.isInfinityMessageScrollingEnabled()]).pipe($n()).subscribe(([i,n])=>{this.uiStateService.setIsSessionLoading(!1),i&&(n&&i.id&&this.uiStateService.lazyLoadMessages(i.id,{pageSize:100,pageToken:""}).pipe($n()).subscribe(),this.updateWithSelectedSession(i))})}hideSidePanelIfNeeded(){this.activatedRoute.queryParams.pipe(gt(e=>e[mGA]==="true"),uo(1)).subscribe(()=>{this.showSidePanel=!1,this.sideDrawer()?.close()})}createSessionAndReset(){this.resetToNewSession(),this.chatType.set("session"),this.isViewOnlySession.set(!1),this.isViewOnlyAppNameMismatch.set(!1),this.canEditSession.set(!0),this.chatPanel()?.canEditSession?.set(!0),this.eventData=new Map,this.uiEvents.set([]),this.artifacts=[],this.userInput="",this.longRunningEvents=[],this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0,this.traceService.resetTraceService()}resetToNewSession(){this.sessionId="",this.currentSessionState={},this.sessionTab?.refreshSession(),this.clearSessionUrl()}createSession(){this.uiStateService.setIsSessionListLoading(!0),this.sessionService.createSession(this.userId,this.appName).subscribe(e=>{this.currentSessionState=e.state,this.sessionId=e.id??"",this.sessionTab?.refreshSession(),this.sessionTab?.reloadSession(this.sessionId),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()})},()=>{this.uiStateService.setIsSessionListLoading(!1)})}handleChatInput(e){return lt(this,null,function*(){if(e.preventDefault(),!this.userInput.trim()&&this.selectedFiles.length<=0||e instanceof KeyboardEvent&&(e.isComposing||e.keyCode===229))return;let A={role:"user",parts:yield this.getUserMessageParts()};this.userInput="",this.selectedFiles=[];let i=this.router.parseUrl(this.location.path());i.queryParams[Bv]&&(delete i.queryParams[Bv],this.location.replaceState(i.toString())),yield this.sendMessage(A)})}ensureSessionActive(e){return lt(this,null,function*(){if(this.sessionId)return!0;try{let A="";e?.parts&&e.parts[0]?.text&&(A=e.parts[0].text,A.length>50&&(A=A.substring(0,47)+"..."));let i=A?{__session_metadata__:{displayName:A}}:void 0,n=yield J3(this.sessionService.createSession(this.userId,this.appName,i));return this.currentSessionState=n.state||i||{},this.sessionId=n.id??"",this.sessionTab?.refreshSession(),this.sessionTab?.reloadSession(this.sessionId),this.drawerSessionTab()?.refreshSession(),this.drawerSessionTab()?.reloadSession(this.sessionId),this.isSessionUrlEnabledObs.pipe($n()).subscribe(o=>{o&&this.updateSelectedSessionUrl()}),!0}catch(A){return this.openSnackBar("Failed to create session","OK"),!1}})}sendMessage(e){return lt(this,null,function*(){if(!(yield this.ensureSessionActive(e)))return;let i=e.functionCallEventId;i&&delete e.functionCallEventId;let n=`user_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,o={id:n,author:e.role||"user",content:e},a=this.buildUiEventFromEvent(o);this.uiEvents.update(s=>[...s,a]),setTimeout(()=>this.changeDetectorRef.detectChanges(),0),this.eventData.set(n,o),this.eventData=new Map(this.eventData);let r={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:e,streaming:this.useSse(),stateDelta:this.updatedSessionState()};i&&(r.functionCallEventId=i),this.submitAgentRunRequest(r),this.changeDetectorRef.detectChanges()})}submitAgentRunRequest(e){this.autoSelectLatestEvent=!0,this.agentService.runSse(e).subscribe({next:A=>lt(this,null,function*(){if(A.error){this.openSnackBar(A.error,"OK");return}this.appendEventRow(A),this.autoSelectLatestEvent&&A.id&&this.selectEvent(A.id,void 0,!1),A.actions&&(this.processActionArtifact(A),this.processActionStateDelta(A)),this.changeDetectorRef.detectChanges()}),error:A=>{console.error("Send message error:",A),this.openSnackBar(A,"OK")},complete:()=>{this.updatedSessionState()&&(this.currentSessionState=this.updatedSessionState(),this.updatedSessionState.set(null)),this.featureFlagService.isSessionReloadOnNewMessageEnabled().pipe($n()).subscribe(A=>{A&&this.sessionTab?.reloadSession(this.sessionId)}),this.loadTraceData()}})}appendEventRow(e,A=!1){if(e.inputTranscription!==void 0?e.author="user":e.outputTranscription!==void 0&&(e.author="bot"),e.errorMessage&&e.id&&!this.eventData.has(e.id)&&(this.eventData.set(e.id,e),this.eventData=new Map(this.eventData)),e.id&&!this.eventData.has(e.id)&&(this.eventData.set(e.id,e),this.eventData=new Map(this.eventData)),this.traceService.setEventData(this.eventData),e?.longRunningToolIds&&e.longRunningToolIds.length>0){let i=this.longRunningEvents.length;this.getAsyncFunctionsFromParts(e.longRunningToolIds,e.content.parts,e.invocationId),this.functionCallEventId=e.id;for(let n=i;n{this.sendOAuthResponse(o,s,this.redirectUri)}).catch(s=>{console.error("OAuth Error:",s)});break}}}if(e.partial)this.uiEvents.update(i=>{if(i.length>0){let o=i.length-1,a=i[o],r=!!(a.event?.inputTranscription||a.event?.outputTranscription),s=!!(e.inputTranscription||e.outputTranscription);if(a.event?.partial&&a.role===(e.author==="user"?"user":"bot")&&r===s){let l=this.mergePartialEvent(a,e),g=[...i];return g[o]=l,g}}let n=this.buildUiEventFromEvent(e,A);return A?[n,...i]:[...i,n]});else{let i=this.buildUiEventFromEvent(e,A);this.uiEvents.update(n=>{let o=n.findIndex(a=>a.event?.id===e.id&&e.id);if(o<0&&n.length>0){let a=e.inputTranscription!==void 0,r=e.outputTranscription!==void 0,s=e.content?.parts?.some(l=>l.thought);if(a||r||s)if(A)for(let l=0;lC.thought))){o=l;break}}}else for(let l=n.length-1;l>=0;l--){let g=n[l].event;if(g?.partial){if(a&&g.inputTranscription!==void 0){o=l;break}if(r&&g.outputTranscription!==void 0){o=l;break}if(s&&(n[l].thought||g.content?.parts?.some(C=>C.thought))){o=l;break}}}else{let l=A?0:n.length-1,g=n[l];if(g.event?.partial){let C=!!(g.event?.inputTranscription||g.event?.outputTranscription),I=!!(e.inputTranscription||e.outputTranscription);C===I&&(o=l)}}}if(o>=0){let a=[...n];return a[o]=i,a}else return A?[i,...n]:[...n,i]})}if(e.actions?.artifactDelta)for(let i in e.actions.artifactDelta)e.actions.artifactDelta.hasOwnProperty(i)&&this.renderArtifact(i,e.actions.artifactDelta[i],A)}mergePartialEvent(e,A){let i=new UB(Ye(gA({},e),{event:A})),n=A.content?.parts||[];if(this.isEventA2aResponse(A)&&(n=this.combineA2uiDataParts(n)),n=this.combineTextParts(n),n.forEach(o=>{o.text!==void 0&&o.text!==null?(i.text=(i.text||"")+o.text,o.thought&&(i.thought=!0,i.text=this.processThoughtText(i.text||""))):this.processPartIntoMessage(o,A,i)}),A.inputTranscription){let o=e.event?.inputTranscription?.text||"";i.event.inputTranscription={text:o+(A.inputTranscription.text||"")}}if(A.outputTranscription){let o=e.event?.outputTranscription?.text||"";i.event.outputTranscription={text:o+(A.outputTranscription.text||"")}}return i}getUserMessageParts(){return lt(this,null,function*(){let e=[];if(this.userInput.trim()&&e.push({text:`${this.userInput}`}),this.selectedFiles.length>0)for(let A of this.selectedFiles)e.push(yield this.localFileService.createMessagePartFromFile(A.file));return e})}processActionArtifact(e){e.actions&&e.actions.artifactDelta&&Object.keys(e.actions.artifactDelta).length>0&&(this.storeEvents(null,e),this.storeMessage(null,e,"bot"))}processActionStateDelta(e){e.actions&&e.actions.stateDelta&&Object.keys(e.actions.stateDelta).length>0&&(this.currentSessionState=gA(gA({},this.currentSessionState||{}),e.actions.stateDelta))}combineTextParts(e){let A=[],i;for(let n of e)n.text&&!n.thought?i?i.text+=n.text:(i={text:n.text},A.push(i)):(i=void 0,A.push(n));return A}isEventA2aResponse(e){return!!e?.customMetadata?.["a2a:response"]}isA2aDataPart(e){if(!e.inlineData||e.inlineData.mimeType!=="text/plain")return!1;let A=atob(EF(e.inlineData.data));return A.startsWith(dF)&&A.endsWith(BF)}isA2uiDataPart(e){let A=this.extractA2aDataPartJson(e);return A&&A.kind==="data"&&A.metadata?.mimeType===liA}extractA2aDataPartJson(e){if(!this.isA2aDataPart(e))return null;let A=atob(EF(e.inlineData.data)),i=A.substring(dF.length,A.length-BF.length),n;try{n=JSON.parse(i)}catch(o){return null}return n}combineA2uiDataParts(e){let A=[],i=[],n;for(let o of e)this.isA2uiDataPart(o)?(i.push(this.extractA2aDataPartJson(o)),n||(n={inlineData:{mimeType:"text/plain",data:o.inlineData.data}},A.push(n))):A.push(o);if(n?.inlineData){let a=dF+JSON.stringify({kind:"data",metadata:{mimeType:liA},data:i})+BF;n.inlineData.data=btoa(a)}return A}processA2uiPartIntoMessage(e){let A={};return e.a2ui.forEach(i=>{i.data.beginRendering?A.beginRendering=i.data:i.data.surfaceUpdate?A.surfaceUpdate=i.data:i.data.dataModelUpdate&&(A.dataModelUpdate=i.data)}),A}updateRedirectUri(e,A){try{let i=new URL(e);return i.searchParams.set("redirect_uri",A),i.toString()}catch(i){return console.warn("Failed to update redirect URI: ",i),e}}storeMessage(e,A,i,n,o,a=!1){if(A?.actions&&A.actions.artifactDelta)for(let s in A.actions.artifactDelta)A.actions.artifactDelta.hasOwnProperty(s)&&this.renderArtifact(s,A.actions.artifactDelta[s],a);let r={role:i,evalStatus:A?.evalStatus,failedMetric:A?.failedMetric,evalScore:A?.evalScore,evalThreshold:A?.evalThreshold,actualInvocationToolUses:A?.actualInvocationToolUses,expectedInvocationToolUses:A?.expectedInvocationToolUses,actualFinalResponse:A?.actualFinalResponse,expectedFinalResponse:A?.expectedFinalResponse,invocationIndex:n!==void 0?n:void 0,finalResponsePartIndex:o?.finalResponsePartIndex!==void 0?o.finalResponsePartIndex:void 0,toolUseIndex:o?.toolUseIndex!==void 0?o.toolUseIndex:void 0};if(e){if(e.inlineData){let s=this.formatBase64Data(e.inlineData.data,e.inlineData.mimeType);r.inlineData={displayName:e.inlineData.displayName,data:s,mimeType:e.inlineData.mimeType}}else if(e.a2ui)r.a2uiData=this.processA2uiPartIntoMessage(e);else if(e.text)r.text=e.text,r.thought=!!e.thought,A?.groundingMetadata&&A.groundingMetadata.searchEntryPoint&&A.groundingMetadata.searchEntryPoint.renderedContent&&(r.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),r.event=A;else if(e.functionCall){let s=A?.longRunningToolIds?.includes(e.functionCall.id),l=gA(gA({},e.functionCall),s&&{isLongRunning:!0,invocationId:A.invocationId,functionCallEventId:A.id,needsResponse:!0,responseStatus:"pending",userResponse:""});r.functionCalls=[l],r.event=A}else if(e.functionResponse)r.functionResponses=[e.functionResponse],r.event=A;else if(e.executableCode)r.executableCode=e.executableCode;else if(e.codeExecutionResult&&(r.codeExecutionResult=e.codeExecutionResult,A.actions&&A.actions.artifact_delta))for(let s in A.actions.artifact_delta)A.actions.artifact_delta.hasOwnProperty(s)&&this.renderArtifact(s,A.actions.artifact_delta[s],a)}e&&Object.keys(e).length>0&&(a?this.uiEvents.update(s=>[r,...s]):this.insertOrUpdateMessage(r))}insertOrUpdateMessage(e){this.uiEvents.update(A=>{if(this.useSse()&&e.text&&e.event.id&&e.role==="bot"&&A.length>0){let i=A.length-1,n=A[i];if(n.event.id===e.event.id&&n.role==="bot"){let o=[...A];return o[i]=e,o}}return[...A,e]})}formatBase64Data(e,A){let i=EF(e);return`data:${A};base64,${i}`}processPartIntoMessage(e,A,i){if(e)if(A&&(i.event=A,A.invocationIndex!==void 0&&(i.invocationIndex=A.invocationIndex),A.toolUseIndex!==void 0&&(i.toolUseIndex=A.toolUseIndex),A.finalResponsePartIndex!==void 0&&(i.finalResponsePartIndex=A.finalResponsePartIndex)),e.text)i.text=(i.text||"")+e.text,i.thought=!!e.thought,A?.groundingMetadata&&A.groundingMetadata.searchEntryPoint&&A.groundingMetadata.searchEntryPoint.renderedContent&&(i.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),A?.id&&(i.event=A);else if(e.inlineData){let n=this.formatBase64Data(e.inlineData.data,e.inlineData.mimeType),o=X6(e.inlineData.mimeType);i.inlineData={displayName:e.inlineData.displayName,data:n,mimeType:e.inlineData.mimeType,mediaType:o},i.role==="user"&&A?.id&&(i.event=A)}else if(e.functionCall){i.functionCalls||(i.functionCalls=[]);let n=A?.longRunningToolIds?.includes(e.functionCall.id),o=e.functionCall;n&&(o=Ye(gA({},e.functionCall),{isLongRunning:!0,invocationId:A.invocationId,functionCallEventId:A.id,needsResponse:!0,responseStatus:e.functionCall.responseStatus||"pending",userResponse:e.functionCall.userResponse||""}));let a=i.functionCalls.findIndex(r=>r.id===e.functionCall.id);a>=0?i.functionCalls[a]=gA(gA({},i.functionCalls[a]),o):i.functionCalls.push(o),A?.id&&(i.event=A)}else e.functionResponse?(i.functionResponses||(i.functionResponses=[]),i.functionResponses.push(e.functionResponse),A?.id&&(i.event=A)):e.executableCode?i.executableCode=e.executableCode:e.codeExecutionResult?i.codeExecutionResult=e.codeExecutionResult:e.a2ui&&(i.a2uiData=this.processA2uiPartIntoMessage(e))}handleArtifactFetchFailure(e,A,i){this.openSnackBar("Failed to fetch artifact data","OK"),e.error={errorMessage:"Failed to fetch artifact data"},this.changeDetectorRef.detectChanges(),this.artifacts=this.artifacts.filter(n=>n.id!==A||n.versionId!==i)}renderArtifact(e,A,i=!1){if(this.artifacts.some(r=>r.id===e&&r.versionId===A))return;let o=new UB({role:"bot",event:{id:"artifact-"+e},inlineData:{data:"",mimeType:"image/png"}});i?this.uiEvents.update(r=>[o,...r]):this.insertOrUpdateMessage(o);let a={id:e,versionId:A,data:"",mimeType:"image/png",mediaType:"image"};this.artifacts=[...this.artifacts,a],this.artifactService.getArtifactVersion(this.userId,this.appName,this.sessionId,e,A).subscribe({next:r=>{let{mimeType:s,data:l}=r.inlineData??{};if(!s||!l){this.handleArtifactFetchFailure(o,e,A);return}let g=this.formatBase64Data(l,s),C=X6(s),I={name:this.createDefaultArtifactName(s),data:g,mimeType:s,mediaType:C};o.inlineData=I,this.changeDetectorRef.detectChanges(),this.artifacts=this.artifacts.map(d=>d.id===e&&d.versionId===A?{id:e,versionId:A,data:g,mimeType:s,mediaType:C}:d)},error:r=>{this.handleArtifactFetchFailure(o,e,A)}})}storeEvents(e,A){let i="";e==null&&A.actions.artifactDelta?i+="eventAction: artifact":e&&(e.text?i+="text:"+e.text:e.functionCall?i+="functionCall:"+e.functionCall.name:e.functionResponse?i+="functionResponse:"+e.functionResponse.name:e.executableCode?i+="executableCode:"+e.executableCode.code.slice(0,10):e.codeExecutionResult?i+="codeExecutionResult:"+e.codeExecutionResult.outcome:e.errorMessage&&(i+="errorMessage:"+e.errorMessage)),A.title=i,this.eventData.set(A.id,A),this.eventData=new Map(this.eventData)}sendOAuthResponse(e,A,i){this.longRunningEvents.pop();var n=structuredClone(e.args.authConfig);n.exchangedAuthCredential.oauth2.authResponseUri=A,n.exchangedAuthCredential.oauth2.redirectUri=i;let o={role:"user",parts:[{functionResponse:{id:e.id,name:e.name,response:n}}],functionCallEventId:this.functionCallEventId};this.sendMessage(o)}clickEvent(e){let A=this.uiEvents()[e],i=A.event.id;if(i){if(this.selectedMessageIndex===e){this.sideDrawer()?.open(),this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true");return}if(A.role==="user"){this.selectedEvent=this.eventData.get(i),this.selectedEventIndex=this.getIndexOfKeyInMap(i),this.selectedMessageIndex=e,this.llmRequest=void 0,this.llmResponse=void 0,this.sideDrawer()?.open(),this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true"),this.updateRenderedGraph(),this.viewMode()!=="events"&&this.onViewModeChange("events");return}this.sideDrawer()?.open(),this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true"),this.selectEvent(i,e)}}handleJumpToInvocation(e){let A=this.uiEvents(),i=-1,n=-1;for(let o=0;o{this.chatPanel()?.scrollToSelectedMessage(i)},100))}ngOnDestroy(){this.streamChatService.closeStream()}onAppSelection(e){this.isAudioRecording&&(this.stopAudioRecording(),this.isAudioRecording=!1),this.isVideoRecording&&(this.stopVideoRecording(),this.isVideoRecording=!1),this.evalTab()?.resetEvalResults(),this.traceData=[]}toggleAudioRecording(e){return lt(this,null,function*(){this.isAudioRecording?this.stopAudioRecording():yield this.startAudioRecording(e)})}startAudioRecording(e){return lt(this,null,function*(){if(this.sessionId&&this.sessionHasUsedBidi.has(this.sessionId)){this.openSnackBar(wGA,"OK");return}(yield this.ensureSessionActive())&&(this.isAudioRecording=!0,this.streamChatService.startAudioChat({appName:this.appName,userId:this.userId,sessionId:this.sessionId,flags:e}),this.sessionHasUsedBidi.add(this.sessionId))})}stopAudioRecording(){this.audioPlayingService.stopAudio(),this.streamChatService.stopAudioChat(),this.isAudioRecording=!1,this.isVideoRecording&&this.stopVideoRecording()}toggleVideoRecording(){this.isVideoRecording?this.stopVideoRecording():this.startVideoRecording()}startVideoRecording(){let e=this.chatPanel()?.videoContainer;e&&(this.isVideoRecording=!0,this.streamChatService.startVideoStreaming(e))}stopVideoRecording(){let e=this.chatPanel()?.videoContainer;e&&(this.streamChatService.stopVideoStreaming(e),this.isVideoRecording=!1)}getAsyncFunctionsFromParts(e,A,i){for(let n of A)n.functionCall&&e.includes(n.functionCall.id)&&this.longRunningEvents.push({function:n.functionCall,invocationId:i})}openOAuthPopup(e){return new Promise((A,i)=>{if(!this.safeValuesService.windowOpen(window,e,"oauthPopup","width=600,height=700")){i("Popup blocked!");return}let o=a=>{if(a.origin!==window.location.origin)return;let{authResponseUrl:r}=a.data;r?(A(r),window.removeEventListener("message",o)):console.log("OAuth failed",a)};window.addEventListener("message",o)})}toggleSidePanel(){this.showSidePanel?(this.sideDrawer()?.close(),this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0):this.sideDrawer()?.open(),this.showSidePanel=!this.showSidePanel,window.localStorage.setItem("adk-side-panel-visible",this.showSidePanel.toString())}toggleAppSelectorDrawer(){this.showSessionSelectorDrawer=!1,this.showAppSelectorDrawer=!this.showAppSelectorDrawer,this.showAppSelectorDrawer&&this.appDrawerSearchControl.setValue("")}onSelectorDrawerOpened(){this.showAppSelectorDrawer&&this.appSearchInput()?.nativeElement.focus()}handleAppSearchKeydown(e){if(e.key==="ArrowDown"){e.preventDefault(),e.stopPropagation();let A=this.document.querySelector(".app-selector-list .app-selector-item");A&&A.focus()}}handleAppListKeydown(e){if(e.key!=="ArrowDown"&&e.key!=="ArrowUp")return;e.stopPropagation();let A=Array.from(this.document.querySelectorAll(".app-selector-list .app-selector-item")),i=A.indexOf(this.document.activeElement);if(i>-1){if(e.preventDefault(),e.key==="ArrowDown"){let n=i+1;n=0?A[n].focus():this.appSearchInput()?.nativeElement.focus()}}}onAppSelectorDrawerClosed(){this.showAppSelectorDrawer=!1}toggleSessionSelectorDrawer(){this.showAppSelectorDrawer=!1,this.showSessionSelectorDrawer=!this.showSessionSelectorDrawer}onSessionSelectorDrawerClosed(){this.showSessionSelectorDrawer=!1}onSelectorDrawerClosed(){this.showAppSelectorDrawer=!1,this.showSessionSelectorDrawer=!1}onSessionSelectedFromDrawer(e){this.showSessionSelectorDrawer=!1,this.loadSession(e)}onSessionReloadedFromDrawer(e){this.loadSession(e)}selectAppFromDrawer(e){this.selectedAppControl.setValue(e),this.showAppSelectorDrawer=!1}handleTabChange(e){this.canChat()||(this.resetEditEvalCaseVars(),this.handleReturnToSession(!0))}handleReturnToSession(e){this.sessionTab?.getSession(this.sessionId),this.evalTab()?.resetEvalCase(),this.chatType.set("session")}handleEvalNotInstalled(e){e&&this.openSnackBar(e,"OK")}resetEventsAndMessages({keepMessages:e}={}){e||(this.eventData.clear(),this.uiEvents.set([]),this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0),this.artifacts=[]}loadTraceData(){this.sessionId&&(this.uiStateService.setIsEventRequestResponseLoading(!0),this.eventService.getTrace(this.sessionId).pipe($n(),Po(e=>(console.error("[DEBUG] getTrace error:",e),ne([])))).subscribe(e=>{this.traceData=e,this.traceService.setEventData(this.eventData),this.traceService.setMessages(this.uiEvents()),this.selectedEvent&&this.populateLlmRequestResponse(),this.uiStateService.setIsEventRequestResponseLoading(!1),this.changeDetectorRef.detectChanges()}),this.changeDetectorRef.detectChanges())}buildUiEventFromEvent(e,A=!1){let i=this.isEventA2aResponse(e),n=i?this.combineA2uiDataParts(e.content?.parts):e.content?.parts||[],o=A?[...n].reverse():n,a=e.author==="user"?"user":"bot",r=new UB({role:a,event:e});return(e.errorCode||e.errorMessage)&&(r.error={errorCode:e.errorCode,errorMessage:e.errorMessage}),e.inputTranscription!==void 0&&typeof e.inputTranscription=="string"&&(r.event.inputTranscription={text:e.inputTranscription}),e.outputTranscription!==void 0&&typeof e.outputTranscription=="string"&&(r.event.outputTranscription={text:e.outputTranscription}),o.forEach(s=>{a==="bot"&&i&&this.isA2uiDataPart(s)&&(s={a2ui:this.extractA2aDataPartJson(s).data}),this.processPartIntoMessage(s,e,r)}),r}populateMessages(e,A=!1,i=!1){this.resetEventsAndMessages({keepMessages:i&&this.sessionIdOfLoadedMessages===this.sessionId}),e.forEach(n=>{this.appendEventRow(n,A)}),this.sessionIdOfLoadedMessages=this.sessionId}restorePendingLongRunningCalls(){let e=this.uiEvents(),A=new Set;this.uiEvents().forEach(i=>{i.functionResponses&&i.functionResponses.forEach(n=>{n.id&&A.add(n.id)})}),this.uiEvents().forEach(i=>{i.functionCalls&&i.functionCalls.forEach(n=>{let o=i.event.id?this.eventData.get(i.event.id):null;(n.isLongRunning||o?.longRunningToolIds?.includes(n.id))&&!A.has(n.id)&&(n.isLongRunning=!0,n.invocationId=o?.invocationId,n.functionCallEventId=i.event.id||"",n.needsResponse=!0,n.responseStatus="pending",n.userResponse=n.userResponse||"")})})}updateWithSelectedSession(e){if(!(!e||!e.id)){if(this.traceService.resetTraceService(),this.traceData=[],this.sessionId=e.id,this.currentSessionState=e.state||{},this.evalCase=null,this.resetEventsAndMessages(),e.isEvalResult){this.isViewOnlySession.set(!0),this.readonlySessionType.set("Eval Result");let A=e.evalCase?.evalId,i=e.timestamp;this.currentEvalCaseId=A,this.currentEvalTimestamp=i;let n=i;if(i){let o=Number(i);isNaN(o)||(n=new Date(o*1e3).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0}))}this.readonlySessionName.set(A&&n?`${n} > ${A}`:e.id),this.canEditSession.set(!1),this.chatPanel()?.canEditSession?.set(!1)}else this.isViewOnlySession.set(!1);e.evalCase?this.expectedUiEvents.set(this.buildUiEventsFromEvalCase(e.evalCase)):this.expectedUiEvents.set([]),e.evalCaseResult?this.evalCaseResult.set(e.evalCaseResult):this.evalCaseResult.set(null),e.isEvalResult?this.chatType.set("eval-result"):(this.chatType.set("session"),this.isSideBySide.set(!1)),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()}),e.events&&e.state&&(e.events.forEach(A=>{if(this.appendEventRow(A,!1),A.author!=="user"&&A.actions?.artifactDelta)for(let n in A.actions.artifactDelta)A.actions.artifactDelta.hasOwnProperty(n)&&this.renderArtifact(n,A.actions.artifactDelta[n])}),this.restorePendingLongRunningCalls()),this.changeDetectorRef.detectChanges(),this.loadTraceData(),e.isEvalResult||this.sessionService.canEdit(this.userId,e).pipe($n(),Po(()=>ne(!0))).subscribe(A=>{this.chatPanel()?.canEditSession?.set(A),this.canEditSession.set(A)}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe($n()).subscribe(A=>{A||this.populateMessages(e.events||[]),this.loadTraceData()})}}formatToolUses(e){if(!e||!Array.isArray(e))return[];let A=[];for(let i of e)A.push({name:i.name,args:i.args});return A}addEvalCaseResultToEvents(e,A){let i=A.evalMetricResultPerInvocation,n=-1;if(i)for(let o=0;o{this.appendEventRow(i,!1)}),this.canEditSession.set(!1),this.chatPanel()?.canEditSession?.set(!1),this.isViewOnlySession.set(!0),this.changeDetectorRef.detectChanges()}buildUiEventsFromEvalCase(e){let A=this.uiEvents(),i=this.eventData,n=this.chatType(),o=this.isViewOnlySession(),a=this.readonlySessionType(),r=this.readonlySessionName();this.uiEvents.set([]),this.eventData=new Map,this.updateWithSelectedEvalCase(e);let s=this.uiEvents();return this.uiEvents.set(A),this.eventData=i,this.chatType.set(n),this.isViewOnlySession.set(o),this.readonlySessionType.set(a),this.readonlySessionName.set(r),s}updateWithSelectedEvalCase(e){if(this.evalCase=e,this.chatType.set("eval-case"),this.isViewOnlySession.set(!0),this.readonlySessionType.set("Eval Case"),this.readonlySessionName.set(e.evalId),this.chatType.set("eval-case"),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()}),this.resetEventsAndMessages(),e.events&&e.events.length>0)for(let A of e.events)this.appendEventRow(A,!1);else{e.events=[];let A=0;for(let i of e.conversation){if(i.userContent?.parts&&e.events.push({author:"user",content:i.userContent,invocationIndex:A}),i.intermediateData?.invocationEvents){let n=0;for(let o of i.intermediateData.invocationEvents)o.invocationIndex=A,o.content?.parts?.[0]?.functionCall&&(o.toolUseIndex=n,n++),e.events.push(o)}else if(i.intermediateData?.toolUses){let n=0;for(let o of i.intermediateData.toolUses)e.events.push({author:"bot",content:{parts:[{functionCall:{name:o.name,args:o.args}}]},invocationIndex:A,toolUseIndex:n}),n++,e.events.push({author:"bot",content:{parts:[{functionResponse:{name:o.name}}]},invocationIndex:A})}i.finalResponse?.parts&&e.events.push({author:"bot",content:i.finalResponse,invocationIndex:A}),A++}for(let i of e.events)this.appendEventRow(i,!1)}}handleEditEvalCaseRequested(e){this.updateWithSelectedEvalCase(e),this.editEvalCase()}updateSelectedEvalSetId(e){this.evalSetId=e}editEvalCaseMessage(e){this.isEvalCaseEditing.set(!0),this.userEditEvalCaseMessage=e.text,e.isEditing=!0,setTimeout(()=>{let A=this.chatPanel()?.textarea?.nativeElement;if(!A)return;A.focus();let i=A.value.length;e.text.charAt(i-1)===` +`&&i--,A.setSelectionRange(i,i)},0)}editFunctionArgs(e){this.isEvalCaseEditing.set(!0),this.dialog.open(S3,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Edit function arguments",functionName:e.functionCall.name,jsonContent:e.functionCall.args}}).afterClosed().subscribe(i=>{this.isEvalCaseEditing.set(!1),i&&(this.hasEvalCaseChanged.set(!0),e.functionCall.args=i,this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].intermediateData.toolUses[e.toolUseIndex].args=i)})}saveEvalCase(){this.evalService.updateEvalCase(this.appName,this.evalSetId,this.updatedEvalCase.evalId,this.updatedEvalCase).subscribe(e=>{this.openSnackBar("Eval case updated","OK"),this.resetEditEvalCaseVars()})}cancelEditEvalCase(){this.resetEditEvalCaseVars(),this.updateWithSelectedEvalCase(this.evalCase)}resetEditEvalCaseVars(){this.hasEvalCaseChanged.set(!1),this.isEvalCaseEditing.set(!1),this.isEvalEditMode.set(!1),this.updatedEvalCase=null}cancelEditMessage(e){e.isEditing=!1,this.isEvalCaseEditing.set(!1)}saveEditMessage(e){this.hasEvalCaseChanged.set(!0),this.isEvalCaseEditing.set(!1),e.isEditing=!1,e.text=this.userEditEvalCaseMessage?this.userEditEvalCaseMessage:" ",this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts[e.finalResponsePartIndex]={text:this.userEditEvalCaseMessage},this.userEditEvalCaseMessage=""}handleKeydown(e,A){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),this.saveEditMessage(A)):e.key==="Escape"&&this.cancelEditMessage(A)}deleteEvalCaseMessage(e,A){this.hasEvalCaseChanged.set(!0),this.uiEvents.update(i=>i.filter((n,o)=>o!==A)),this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts.splice(e.finalResponsePartIndex,1)}editEvalCase(){this.isEvalEditMode.set(!0),this.isViewOnlySession.set(!1)}deleteEvalCase(){let e={title:"Confirm delete",message:`Are you sure you want to delete ${this.evalCase.evalId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(kc,{width:"600px",data:e}).afterClosed().subscribe(i=>{i&&(this.evalTab()?.deleteEvalCase(this.evalCase.evalId),this.openSnackBar("Eval case deleted","OK"))})}onNewSessionClick(){this.resetToNewSession(),this.eventData.clear(),this.uiEvents.set([]),this.artifacts=[],this.traceData=[],this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0,this.traceService.resetTraceService(),this.chatPanel()?.focusInput(),this.evalTab()?.showEvalHistory&&this.evalTab()?.toggleEvalHistoryButton()}getToolbarSessionId(){if(!this.sessionId)return"NEW SESSION";if(this.isViewOnlySession())return this.sessionId;let e=this.currentSessionState?.__session_metadata__;return e?.displayName?`[${this.sessionId.substring(0,4)}] ${e.displayName}`:this.sessionId}getCurrentSessionDisplayName(){return this.sessionId?this.currentSessionState?.__session_metadata__?.displayName||this.sessionId:"NEW SESSION"}copySessionId(){return lt(this,null,function*(){if(this.sessionId)try{yield navigator.clipboard.writeText(this.sessionId),this.openSnackBar(this.i18n.sessionIdCopiedMessage,"OK")}catch(e){this.openSnackBar(this.i18n.copySessionIdFailedMessage,"OK")}})}saveSessionName(e){if(!this.sessionId)return;let A={__session_metadata__:Ye(gA({},this.currentSessionState?.__session_metadata__||{}),{displayName:e})};this.currentSessionState=gA(gA({},this.currentSessionState),A),this.updatedSessionState.set(gA(gA({},this.updatedSessionState()),A)),this.sessionService.updateSession(this.userId,this.appName,this.sessionId,{stateDelta:A}).subscribe({next:()=>{this.sessionTab&&this.sessionTab.reloadSession(this.sessionId),this.drawerSessionTab()&&this.drawerSessionTab().reloadSession(this.sessionId)}})}get sessionDisplayNameDraft(){return this.currentSessionState?.__session_metadata__?.displayName||""}saveUserId(e){if(e=e.trim(),!e){this.openSnackBar(this.i18n.invalidUserIdMessage,"OK");return}this.userId=e,this.isSessionUrlEnabledObs.pipe(uo(1)).subscribe(A=>{A&&this.updateSelectedSessionUrl()})}onFileSelect(e){let A=e.target;if(A.files)for(let i=0;i{e&&this.canvasComponent()?.loadFromYaml(e,this.appName)},error:e=>{console.error("Error loading agent configuration:",e),this._snackBar.open("Error loading agent configuration","OK")}})}exitBuilderMode(){let e=this.router.createUrlTree([],{queryParams:{mode:null},queryParamsHandling:"merge"}).toString();this.location.replaceState(e),this.isBuilderMode.set(!1),this.agentBuilderService.clear()}toggleBuilderAssistant(){this.showBuilderAssistant=!this.showBuilderAssistant}openAddItemDialog(){this.apps$.pipe(uo(1)).subscribe(e=>{let A=this.dialog.open(j6,{width:"600px",data:{existingAppNames:e??[]}})})}eventGraphSvgLight={};eventGraphSvgDark={};selectedEventGraphPath="";showAgentStructureOverlay=!1;agentStructureOverlayMode="session";openAgentStructureGraphDialog(e="session"){this.agentStructureOverlayMode=e,this.showAgentStructureOverlay=!0}saveAgentBuilder(){this.canvasComponent()?.saveAgent(this.appName)}onEventTabDrillDown(e){this.updateRenderedGraph(void 0,e)}updateRenderedGraph(e,A){return lt(this,null,function*(){let i=this.sessionGraphSvgLight,n=this.sessionGraphSvgDark;if(Object.keys(i).length===0||Object.keys(n).length===0){this.renderedEventGraph=void 0;return}let o=e||this.selectedEvent?.nodeInfo?.path;!e&&this.selectedEvent?.author==="user"&&(o="__START__");let a=o;o&&o!=="__START__"&&(a=o.split("/").map(m=>m.split("@")[0]).join("/"));let r=A!==void 0?A:"",s="";if(a&&A===void 0){let m=a.split("/");if(s=m[m.length-1],m.length>=2&&m[m.length-1]==="call_llm"&&m[m.length-2]===this.selectedEvent?.author?(s=m[m.length-2],r=m.slice(1,-2).join("/")):r=m.slice(1,-1).join("/"),r&&!(r in i&&!(r in this.dynamicGraphDot))){let k=this.tryGenerateDynamicGraph(r);if(k&&this.dynamicGraphDot[r]!==k)try{let S=yield this.graphService.render(k);this.sessionGraphSvgLight[r]=S,this.sessionGraphSvgDark[r]=S,this.dynamicGraphDot[r]=k}catch(S){console.error("Failed to render dynamic graph",S)}}for(;r&&!(r in i);){let v=r.split("/");v.pop(),r=v.join("/")}}let l=this.sessionGraphDot[r]||this.sessionGraphDot[""]||"",g=l,C=!1;if(this.selectedEvent){let m=this.getV1HighlightPairs(this.selectedEvent);for(let[v,k]of m)if(v&&k&&k===this.selectedEvent.author){let S=new RegExp(`("${k}"|${k})\\s*->\\s*("${v}"|${v})`,"g");S.test(l)&&(g=l.replace(S,"$& [dir=back]"),C=!0)}}let I="",d="";if(C)try{I=yield this.graphService.render(g),d=I}catch(m){console.error("Failed to render modified graph",m),I=i[r]||i[""]||"",d=n[r]||n[""]||""}else I=i[r]||i[""]||"",d=n[r]||n[""]||"";if(this.selectedEvent){let m=this.getV1HighlightPairs(this.selectedEvent);m.length>0&&(I=this.applyV1Highlighting(I,m,!1),d=this.applyV1Highlighting(d,m,!0))}let h=[],E=[];if(this.selectedEventIndex!==void 0){let m=Array.from(this.eventData.values()),k=m[this.selectedEventIndex]?.invocationId;for(let S=0;Sz.split("@")[0]).join("/")),F){let z=F.split("/"),P=z[z.length-1],Z="";z.length>=2&&z[z.length-1]==="call_llm"&&z[z.length-2]===b.author?(P=z[z.length-2],Z=z.slice(1,-2).join("/")):Z=z.slice(1,-1).join("/");let tA=r in this.dynamicGraphDot,W=x?x.split("/"):[],BA=W.length>0?W[W.length-1]:"",X=tA?BA:P;Z===r&&(S<=this.selectedEventIndex&&(h.length===0||h[h.length-1]!==X)&&h.push(X),(E.length===0||E[E.length-1]!==X)&&E.push(X))}}}if(this.selectedEvent){let m=this.getV1HighlightPairs(this.selectedEvent);for(let[v,k]of m)k&&k!==""&&(E.includes(k)||E.push(k),h.includes(k)||h.push(k)),v&&v!==""&&(E.includes(v)||E.push(v),h.includes(v)||h.push(v))}E.length>0&&I&&d&&(I=this.highlightExecutionPathInSvg(I,h,E,"light"),d=this.highlightExecutionPathInSvg(d,h,E,"dark")),this.selectedEventGraphPath=r,this.eventGraphSvgLight=Ye(gA({},i),{[r]:I}),this.eventGraphSvgDark=Ye(gA({},n),{[r]:d});let f=this.themeService.currentTheme()==="dark"?d:I;this.rawSvgString=f,this.renderedEventGraph=this.safeValuesService.bypassSecurityTrustHtml(f),this.changeDetectorRef.detectChanges()})}tryGenerateDynamicGraph(e){let A=Array.from(this.eventData.values()),i=[];for(let l of A){let g=l.nodeInfo?.path;if(!g)continue;let C=g.split("/"),I=C.map(h=>h.split("@")[0]),d="";if(I.length>=2&&I[I.length-1]==="call_llm"&&I[I.length-2]===l.author?d=I.slice(1,-2).join("/"):d=I.slice(1,-1).join("/"),d===e){let h=C[C.length-1];i.push({run:h,branch:l.branch})}}if(i.length===0)return null;let n=new Set,o=new Map;for(let l of i)n.add(l.run),l.branch&&o.set(l.run,l.branch);if(n.size===0)return null;let a=`digraph G { +`;a+=` rankdir=TB; +`,a+=` node [shape=box, style=filled, fillcolor="#e6f4ea", color="#34a853"]; +`,a+=` "START" [shape=ellipse, style=filled, fillcolor="#fce8e6", color="#ea4335"]; +`;let r=new Map;for(let l of n){let g=l.split("@")[0];r.has(g)||r.set(g,[]),r.get(g).push(l)}for(let[l,g]of Array.from(r.entries())){a+=` subgraph cluster_${l} { +`,a+=` label="${l}"; +`,a+=` style=dashed; +`,a+=` color="#b0b0b0"; +`;for(let C of g){let I=C.split("@")[1]||"";a+=` "${C}" [label="@${I}"]; +`}a+=` } +`}let s=new Set;for(let l of n){let g=o.get(l);if(g){let C=g.split(".");if(C.length>=2){let I=C[C.length-2],d=C[C.length-1];s.add(`"${I}" -> "${d}"`)}else C.length===1&&s.add(`"START" -> "${C[0]}"`)}else s.add(`"START" -> "${l}"`)}for(let l of s)a+=` ${l}; +`;return a+="}",a}highlightExecutionPathInSvg(e,A,i,n="light"){if(!i||i.length===0)return e;let a=new DOMParser().parseFromString(e,"image/svg+xml"),r=new Map,s=new Map,l=a.querySelectorAll("g.edge");l.forEach(Z=>{let W=Z.querySelector("title")?.textContent?.trim()||"";if(W.includes("->")){let BA=W.split("->"),X=BA[0].trim().replace(/^"|"$/g,""),iA=BA[1].trim().replace(/^"|"$/g,"");r.has(iA)||r.set(iA,[]),r.get(iA).push(X),s.has(X)||s.set(X,[]),s.get(X).push(iA)}});let g=new Map,C=a.querySelectorAll("g.node");C.forEach(Z=>{let W=Array.from(Z.querySelectorAll("text")).map(AA=>AA.textContent?.trim()||"").join(""),X=Z.querySelector("title")?.textContent?.trim()||"",iA=X.replace(/^"|"$/g,"");g.set(W,iA),X&&g.set(X,iA)});let I=Z=>{let tA=Z.toLowerCase();for(let[W,BA]of g.entries()){let X=W.toLowerCase().replace(/\s+/g,"_");if(X===tA||X===`"${tA}"`)return BA}for(let[W,BA]of g.entries())if(W.toLowerCase().replace(/\s+/g,"_").includes(tA))return BA;return null},d=A.map(Z=>I(Z)).filter(Z=>Z),h=i.map(Z=>I(Z)).filter(Z=>Z),{visitedNodes:E,visitedEdges:f}=this.calculateVisitedPath(d,r),{visitedNodes:m}=this.calculateVisitedPath(h,r),v=this.calculateEdgeCounts(d,E,f,s),k=n==="dark"?"#34a853":"#a1c2a1",S=n==="dark"?"#ceead6":"#0d652d",b=n==="dark"?"#137333":"#a6d8b5",x=n==="dark"?"#34a853":"#a1c2a1",F=n==="dark"?"#0d652d":"#e6f4ea",z=null,P=d[d.length-1];if(d.length>0&&P){let Z=[...d],tA=Array.from(E).find(BA=>BA.toLowerCase()==="__start__");Z.length>0&&Z[0].toLowerCase()!=="__start__"&&tA&&Z.unshift(tA);let W=Z.lastIndexOf(P);if(W>0){let BA=Z[W-1],X=Z[W],iA=[],AA=new Set,IA=s.get(BA)||[];for(let aA of IA){let rA=`${BA}->${aA}`;f.has(rA)&&(iA.push({node:aA,path:[rA]}),AA.add(aA))}for(;iA.length>0;){let aA=iA.shift();if(aA.node===X){aA.path.length>0&&(z=aA.path[aA.path.length-1]);break}let rA=s.get(aA.node)||[];for(let uA of rA){let UA=`${aA.node}->${uA}`;f.has(UA)&&!AA.has(uA)&&(AA.add(uA),iA.push({node:uA,path:[...aA.path,UA]}))}}}}return l.forEach(Z=>{let W=Z.querySelector("title")?.textContent?.trim()||"";if(W.includes("->")){let BA=W.split("->"),X=BA[0].trim().replace(/^"|"$/g,""),iA=BA[1].trim().replace(/^"|"$/g,""),AA=`${X}->${iA}`;if(f.has(AA)){let IA=AA===z,aA=Z.querySelector("path");aA&&(aA.setAttribute("stroke",IA?S:k),aA.setAttribute("stroke-width",IA?"4":"2"));let rA=Z.querySelector("polygon");rA&&(rA.setAttribute("fill",IA?S:k),rA.setAttribute("stroke",IA?S:k));let uA=v.get(AA)||0;if(uA>1){let UA=Z.querySelector("text");if(UA)UA.textContent=`${UA.textContent} (${uA}x)`,UA.setAttribute("fill",n==="dark"?"#ffffff":"#000000"),UA.setAttribute("font-weight","bold");else if(aA){let zA=[...(aA.getAttribute("d")||"").matchAll(/[-+]?[0-9]*\.?[0-9]+/g)];if(zA.length>=4){let pA=zA.map(XA=>parseFloat(XA[0])),PA=(pA[0]+pA[pA.length-2])/2,Je=(pA[1]+pA[pA.length-1])/2,_e=a.createElementNS("http://www.w3.org/2000/svg","g"),YA=a.createElementNS("http://www.w3.org/2000/svg","rect");YA.setAttribute("x",(PA-14).toString()),YA.setAttribute("y",(Je-10).toString()),YA.setAttribute("width","28"),YA.setAttribute("height","20"),YA.setAttribute("rx","4"),YA.setAttribute("fill",n==="dark"?"#0d652d":"#e6f4ea"),YA.setAttribute("stroke",k),YA.setAttribute("stroke-width","1"),_e.appendChild(YA);let fA=a.createElementNS("http://www.w3.org/2000/svg","text");fA.setAttribute("x",PA.toString()),fA.setAttribute("y",(Je+4).toString()),fA.setAttribute("text-anchor","middle"),fA.setAttribute("fill",n==="dark"?"#ffffff":"#000000"),fA.setAttribute("font-size","12px"),fA.setAttribute("font-weight","bold"),fA.textContent=uA.toString()+"x",_e.appendChild(fA),Z.appendChild(_e)}}}}}}),C.forEach(Z=>{let tA=Z.querySelector("title"),W=tA?.textContent?.trim().replace(/^"|"$/g,"")||"";if(E.has(W)){let BA=Z.querySelector("ellipse, polygon, path, rect");if(BA){let X=W===P||W.toLowerCase()==="__end__";BA.setAttribute("stroke",X?S:x),BA.setAttribute("fill",X?b:F),BA.setAttribute("stroke-width",X?"4":"2")}}if(!m.has(W)){Z.classList.add("unvisited-node");let BA=Z.querySelector("ellipse, polygon, path, rect");if(BA){BA.setAttribute("stroke",n==="dark"?"#666666":"#b0b0b0"),BA.setAttribute("fill",n==="dark"?"#424242":"#e0e0e0");let AA=a.createElementNS("http://www.w3.org/2000/svg","title");AA.textContent="Not run in this invocation",BA.appendChild(AA)}if(Z.querySelectorAll("text").forEach(AA=>{AA.setAttribute("fill",n==="dark"?"#888888":"#757575");let IA=a.createElementNS("http://www.w3.org/2000/svg","title");IA.textContent="Not run in this invocation",AA.appendChild(IA)}),tA)tA.textContent="Not run in this invocation";else{let AA=a.createElementNS("http://www.w3.org/2000/svg","title");AA.textContent="Not run in this invocation",Z.appendChild(AA)}Z.querySelectorAll("a").forEach(AA=>{AA.setAttribute("title","Not run in this invocation"),AA.setAttributeNS("http://www.w3.org/1999/xlink","title","Not run in this invocation")})}}),new XMLSerializer().serializeToString(a)}getV1HighlightPairs(e){let A=[],i=e.content?.parts?.filter(o=>o.functionCall)||[],n=e.content?.parts?.filter(o=>o.functionResponse)||[];if(i.length>0)for(let o of i)o.functionCall?.name&&e.author&&A.push([e.author,o.functionCall.name]);else if(n.length>0)for(let o of n)o.functionResponse?.name&&e.author&&A.push([o.functionResponse.name,e.author]);else e.author&&A.push([e.author,""]);return A}applyV1Highlighting(e,A,i){let o=new DOMParser().parseFromString(e,"image/svg+xml"),a="#0F5223",r="#69CB87",s=i?"#cccccc":"#000000",l=new Set;for(let[I,d]of A)I&&l.add(I),d&&l.add(d);return o.querySelectorAll("g.node").forEach(I=>{let h=I.querySelector("title")?.textContent?.trim().replace(/^"|"$/g,"")||"",E=Array.from(I.querySelectorAll("text")),f=E.map(v=>v.textContent?.trim()||"").join("").toLowerCase().replace(/\s+/g,"_"),m=l.has(h);if(!m)for(let v of l){let k=v.toLowerCase().replace(/\s+/g,"_");if(f.includes(k)){m=!0;break}}if(m){let v=I.querySelector("ellipse, polygon, path, rect");v&&(v.setAttribute("fill",a),v.setAttribute("stroke",a)),E.forEach(k=>k.setAttribute("fill",s))}else E.forEach(v=>v.setAttribute("fill",s))}),o.querySelectorAll("g.edge").forEach(I=>{let h=I.querySelector("title")?.textContent?.trim()||"";if(h.includes("->")){let[E,f]=h.split("->"),m=E.trim().replace(/^"|"$/g,""),v=f.trim().replace(/^"|"$/g,"");for(let[k,S]of A)if(m===k&&v===S||m===S&&v===k){let b=I.querySelector("path");b&&b.setAttribute("stroke",r);let x=I.querySelector("polygon");x&&(x.setAttribute("stroke",r),x.setAttribute("fill",r));break}}}),new XMLSerializer().serializeToString(o)}calculateVisitedPath(e,A){let i=new Set(e),n=!0;for(;n;){n=!1;let a=Array.from(i);for(let r of a){let s=A.get(r)||[];if(s.length===1){let l=s[0];i.has(l)||(i.add(l),n=!0)}}}for(let[a,r]of A.entries())if(a.toLowerCase()==="__end__"){for(let s of r)if(i.has(s)){i.add(a);break}}let o=new Set;for(let a of i){if(a==="__start__")continue;let r=A.get(a)||[];if(r.length===1)o.add(`${r[0]}->${a}`);else if(r.length>1)for(let s of r)(i.has(s)||s==="__start__")&&o.add(`${s}->${a}`)}return{visitedNodes:i,visitedEdges:o}}calculateEdgeCounts(e,A,i,n){let o=new Map,a=[...e],r=Array.from(A).find(l=>l.toLowerCase()==="__start__"),s=Array.from(A).find(l=>l.toLowerCase()==="__end__");a.length>0&&a[0].toLowerCase()!=="__start__"&&r&&a.unshift(r),a.length>0&&s&&a[a.length-1].toLowerCase()!=="__end__"&&a.push(s);for(let l=0;l${f}`;i.has(m)&&(d.push({node:f,path:[m]}),h.add(f))}for(;d.length>0;){let f=d.shift();if(f.node===C){I=f.path;break}let m=n.get(f.node)||[];for(let v of m){let k=`${f.node}->${v}`;i.has(k)&&!h.has(v)&&(h.add(v),d.push({node:v,path:[...f.path,k]}))}}if(I)for(let f of I)o.set(f,(o.get(f)||0)+1)}return o}selectEvent(e,A,i=!0){i&&(this.autoSelectLatestEvent=!1),this.traceService.selectedRow(void 0),this.selectedEvent=this.eventData.get(e),this.selectedEventIndex=this.getIndexOfKeyInMap(e),this.selectedMessageIndex=A!==void 0?A:this.uiEvents().findIndex(n=>n.event.id===e),this.viewMode()!=="events"&&this.onViewModeChange("events"),this.chatPanel()?.scrollToSelectedMessage(this.selectedMessageIndex),this.populateLlmRequestResponse(),this.updateRenderedGraph()}populateLlmRequestResponse(){if(this.llmRequest=void 0,this.llmResponse=void 0,!this.selectedEvent)return;let e=this.traceData?.find(A=>A?.attributes?.["gcp.vertex.agent.event_id"]===this.selectedEvent.id&&A?.name==="call_llm");if(e){let A=e.attributes?.[this.llmRequestKey],i=e.attributes?.[this.llmResponseKey];if(A)try{this.llmRequest=typeof A=="string"?JSON.parse(A):A}catch(n){console.warn("Failed to parse LLM request",n)}if(i)try{this.llmResponse=typeof i=="string"?JSON.parse(i):i}catch(n){console.warn("Failed to parse LLM response",n)}}}deleteSession(e){let A={title:"Confirm delete",message:`Are you sure you want to delete this session ${this.sessionId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(kc,{width:"600px",data:A}).afterClosed().subscribe(n=>{n&&this.sessionService.deleteSession(this.userId,this.appName,e).subscribe(o=>{let a=this.sessionTab?.refreshSession(e);a?this.sessionTab?.getSession(a.id):window.location.reload()})})}syncSelectedAppFromUrl(){let e=this.activatedRoute.snapshot.queryParams.app;e&&(this.selectedAppControl.setValue(e,{emitEvent:!1}),this.selectApp(e)),Qr([this.activatedRoute.queryParams,this.apps$]).subscribe(([A,i])=>{let n=A.app;if(i&&i.length&&n){if(!i.includes(n)){this.openSnackBar(`Agent '${n}' not found`,"OK");return}n!==this.appName&&(this.selectedAppControl.setValue(n,{emitEvent:!1}),this.selectApp(n)),this.agentService.getAppInfo(n).subscribe(o=>{setTimeout(()=>{this.agentGraphData.set(o),this.agentReadme=o?.readme||""})}),this.sessionGraphSvgLight={},this.sessionGraphSvgDark={},this.dynamicGraphDot={},setTimeout(()=>this.graphsAvailable.set(!0)),this.agentService.getAppGraphImage(n,!1).pipe(Po(o=>(console.error("Error fetching light mode graphs:",o),this.graphsAvailable.set(!1),ne(null)))).subscribe({next:o=>lt(this,null,function*(){try{if(o){console.log("Light mode graph response:",o),this.sessionGraphSvgLight={},this.dynamicGraphDot={};for(let[a,r]of Object.entries(o))if(r?.dotSrc){let l=a.split("/").map(C=>C.split("@")[0]).join("/").split("/"),g=l.length>1?l.slice(1).join("/"):l[0]==="root_agent"||l[0]===n?"":l[0];this.sessionGraphDot[g]=r.dotSrc,this.sessionGraphSvgLight[g]=yield this.graphService.render(r.dotSrc)}console.log("sessionGraphSvgLight after rendering:",Object.keys(this.sessionGraphSvgLight)),console.log("graphsAvailable:",this.graphsAvailable()),this.selectedEvent&&this.selectedEventIndex!==void 0&&this.updateRenderedGraph()}}catch(a){console.error("Error rendering light mode graphs:",a),setTimeout(()=>this.graphsAvailable.set(!1))}}),error:o=>{console.error("Error fetching light mode graphs:",o),setTimeout(()=>this.graphsAvailable.set(!1))}}),this.agentService.getAppGraphImage(n,!0).pipe(Po(o=>(console.error("Error fetching dark mode graphs:",o),ne(null)))).subscribe({next:o=>lt(this,null,function*(){try{if(o){this.sessionGraphSvgDark={};for(let[a,r]of Object.entries(o))if(r?.dotSrc){let l=a.split("/").map(C=>C.split("@")[0]).join("/").split("/"),g=l.length>1?l.slice(1).join("/"):l[0]==="root_agent"||l[0]===n?"":l[0];this.sessionGraphSvgDark[g]=yield this.graphService.render(r.dotSrc)}this.selectedEvent&&this.selectedEventIndex!==void 0&&this.updateRenderedGraph()}}catch(a){console.error("Error rendering dark mode graphs:",a),setTimeout(()=>this.graphsAvailable.set(!1))}}),error:o=>{console.error("Error fetching dark mode graphs:",o),setTimeout(()=>this.graphsAvailable.set(!1))}}),this.agentService.getAgentBuilder(n).pipe(Po(o=>(setTimeout(()=>this.disableBuilderSwitch=!0),this.agentBuilderService.setLoadedAgentData(void 0),ne("")))).subscribe(o=>{!o||o==""?(setTimeout(()=>this.disableBuilderSwitch=!0),this.agentBuilderService.setLoadedAgentData(void 0)):(setTimeout(()=>this.disableBuilderSwitch=!1),this.agentBuilderService.setLoadedAgentData(o))}),this.isBuilderMode.set(!1)}A.mode==="builder"&&this.enterBuilderMode()})}updateSelectedAppUrl(){this.selectedAppControl.valueChanges.pipe(kg(),gt(Boolean)).subscribe(e=>{this.selectApp(e);let A=this.activatedRoute.snapshot.queryParams.app;e!==A&&this.router.navigate([],{queryParams:{app:e,mode:null},queryParamsHandling:"merge"})})}updateSelectedSessionUrl(){let e=this.chatType(),A={userId:this.userId};switch(A.session=null,A.evalCase=null,A.evalResult=null,A.file=null,e){case"session":A.session=this.sessionId;break;case"eval-case":A.evalCase=`${this.evalSetId}/${this.evalCase?.evalId}`;break;case"eval-result":A.evalResult=`${this.evalSetId}/${this.currentEvalCaseId}/${this.currentEvalTimestamp}`;break;case"file":A.file=this.readonlySessionName();break}let i=this.router.createUrlTree([],{queryParams:A,queryParamsHandling:"merge"}).toString();this.location.replaceState(i)}clearSessionUrl(){this.isSessionUrlEnabledObs.pipe($n()).subscribe(e=>{if(e){let A=this.router.createUrlTree([],{queryParams:{session:null},queryParamsHandling:"merge"}).toString();this.location.replaceState(A)}})}handlePageEvent(e){if(e.pageIndex>=0){let A=this.getKeyAtIndexInMap(e.pageIndex);A&&(this.selectEvent(A),setTimeout(()=>{let i=this.uiEvents().findIndex(n=>n.event.id===A);if(i!==-1){let n=this.chatPanel()?.scrollContainer?.nativeElement;if(!n)return;let o=n.querySelectorAll(".message-row-container");o&&o[i]&&o[i].scrollIntoView({behavior:"smooth",block:"nearest",inline:"nearest"})}},0))}}closeSelectedEvent(){this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0}handleEscapeKey(e){e.key==="Escape"&&this.selectedEvent&&(e.preventDefault(),this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0)}getIndexOfKeyInMap(e){let A=0,i=(o,a)=>0,n=Array.from(this.eventData.keys()).sort(i);for(let o of n){if(o===e)return A;A++}}getKeyAtIndexInMap(e){let A=(n,o)=>0,i=Array.from(this.eventData.keys()).sort(A);if(e>=0&&e{console.log(e);let i=(e.state?.__session_metadata__||this.currentSessionState?.__session_metadata__)?.displayName,n=i&&i.trim()?`${i.trim().replace(/[/\\?%*:|"<>]/g,"_")}.json`:`session-${this.sessionId}.json`;this.downloadService.downloadObjectAsJson(e,n)})}updateState(){this.dialog.open(S3,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Update state",jsonContent:this.currentSessionState}}).afterClosed().subscribe(A=>{A&&this.updatedSessionState.set(A)})}removeStateUpdate(){this.updatedSessionState.set(null)}importSession(){let e=document.createElement("input");e.type="file",e.accept="application/json",e.onchange=()=>{if(!e.files||e.files.length===0)return;let A=e.files[0],i=new FileReader;i.onload=n=>{if(n.target?.result)try{let o=JSON.parse(n.target.result);if(!o.events||o.events.length===0){this.openSnackBar("Invalid session file: no events found","OK");return}if(o.appName&&o.appName!==this.appName){let a={title:"App name mismatch",message:`The session file was exported from app "${o.appName}" but the current app is "${this.appName}". Do you want to import it anyway?`,confirmButtonText:"Import",cancelButtonText:"Cancel"};this.dialog.open(kc,{width:"600px",data:a}).afterClosed().subscribe(s=>{s&&this.doImportSession(o)})}else this.doImportSession(o)}catch(o){this.openSnackBar("Error parsing session file","OK")}},i.readAsText(A)},e.click()}viewSession(){let e=document.createElement("input");e.type="file",e.accept="application/json",e.onchange=()=>{if(!e.files||e.files.length===0)return;let A=e.files[0],i=new FileReader;i.onload=n=>{if(n.target?.result)try{let o=JSON.parse(n.target.result);if(!o.events||o.events.length===0){this.openSnackBar("Invalid session file: no events found","OK");return}this.doViewSession(o,A.name)}catch(o){this.openSnackBar("Error parsing session file","OK")}},i.readAsText(A)},e.click()}doViewSession(e,A){let i=e.appName;i&&i!==this.appName?this.apps$.pipe(uo(1)).subscribe(n=>{n?.includes(i)?this.router.navigate([],{queryParams:{app:i},queryParamsHandling:"merge"}).then(()=>{this.openSnackBar(`Switched to app '${i}'`,"OK"),this.performViewSessionLoading(e,A)}):(this.isLoadedAppUnavailable.set(!0),this.unavailableAppName.set(i),this.performViewSessionLoading(e,A))}):this.performViewSessionLoading(e,A)}performViewSessionLoading(e,A){this.traceService.resetTraceService(),this.traceData=[],this.isViewOnlySession()||(this.originalSessionId=this.sessionId),this.readonlySessionType.set("File"),this.readonlySessionName.set(A),this.sessionId=`File: ${A}`,this.currentSessionState=e.state||{},this.evalCase=null,this.chatType.set("session"),this.updateSelectedSessionUrl(),this.showSessionSelectorDrawer=!1,this.resetEventsAndMessages(),this.isViewOnlySession.set(!0),this.canEditSession.set(!1),this.chatPanel()?.canEditSession?.set(!1);let i=!!(e.appName&&e.appName!==this.appName);this.isViewOnlyAppNameMismatch.set(i),e.events&&e.events.forEach(n=>{if(this.appendEventRow(n,!1),n.author!=="user"&&n.actions?.artifactDelta)for(let a in n.actions.artifactDelta)n.actions.artifactDelta.hasOwnProperty(a)&&this.renderArtifact(a,n.actions.artifactDelta[a])}),this.changeDetectorRef.detectChanges()}closeReadonlySession(){this.isViewOnlySession.set(!1),this.readonlySessionType.set(""),this.readonlySessionName.set(""),this.evalCase=null,this.router.navigate([],{queryParams:{session:null,evalCase:null,evalResult:null,file:null},queryParamsHandling:"merge"}),this.createSessionAndReset(),this.originalSessionId=""}doImportSession(e){let A=Date.now()/1e3,i=e.events.map(n=>Ye(gA({},n),{timestamp:A}));this.sessionService.importSession(this.userId,this.appName,i,e.state).subscribe(n=>{this.openSnackBar(`Session imported successfully (ID: ${n.id})`,"OK"),this.sessionTab?.refreshSession(),this.showSessionSelectorDrawer=!1,this.updateWithSelectedSession(n)})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-chat"]],viewQuery:function(A,i){A&1&&ns(i.chatPanel,hQ,5)(i.canvasComponent,cQ,5)(i.sideDrawer,WFA,5)(i.sidePanel,mQ,5)(i.drawerSessionTab,ZFA,5)(i.evalTab,xc,5)(i.appSearchInput,XFA,5)(i.invChipMenuTrigger,$FA,5)(i.nodeChipMenuTrigger,ALA,5)(i.addMenuTrigger,eLA,5),A&2&&ur(10)},hostBindings:function(A,i){A&1&&U("keydown",function(o){return i.handleEscapeKey(o)},ZC)},features:[Bt([{provide:b1,useClass:hF}])],ngContentSelectors:iLA,decls:47,vars:16,consts:[["userMenu","matMenu"],["selectorDrawer",""],["sideDrawer",""],["appSearchInput",""],["drawerSessionTab",""],["addFilterMenu","matMenu"],["invocationMenu","matMenu"],["nodePathMenu","matMenu"],["invChipMenuTrigger","matMenuTrigger"],["nodeChipMenuTrigger","matMenuTrigger"],["addMenuTrigger","matMenuTrigger"],[1,"app-toolbar"],[1,"toolbar-group","toolbar-agent-group"],["mat-icon-button","","aria-label","Toggle side panel",1,"toolbar-icon-button",3,"click"],[1,"toolbar-logo"],[1,"selector-group"],["matTooltip","Select an app",1,"selector-button",3,"click"],["fontSet","material-symbols-outlined"],[1,"selector-label"],["color","warn","matTooltip","The app for the loaded file is not available",2,"margin-left","4px"],["fontSet","material-symbols-outlined",1,"selector-caret"],[1,"toolbar-group","toolbar-session-group"],["mat-icon-button","","matTooltip","User","aria-label","User menu",1,"toolbar-icon-button","user-avatar-button",3,"matMenuTriggerFor"],["xPosition","before","panelClass","user-avatar-menu"],[1,"user-menu-panel",3,"click"],[1,"user-menu-header"],[1,"user-menu-label"],[2,"flex","1"],["mat-icon-button","","matTooltip","Reset to default user",1,"small-icon-button",3,"click"],[1,"user-menu-content"],["textClass","user-menu-id",3,"save","value","placeholder"],["autosize","",1,"drawer-container"],["mode","over","position","start",1,"selector-drawer",3,"closedStart","opened","autoFocus"],["autosize","",1,"side-panel-container"],["mode","side","appResizableDrawer","",1,"side-drawer"],[3,"isApplicationSelectorEnabledObs","showSidePanel","appName","userId","sessionId","isViewOnlySession","isViewOnlyAppNameMismatch","traceData","eventData","currentSessionState","artifacts","selectedEvent","selectedEventIndex","renderedEventGraph","rawSvgString","selectedEventGraphPath","llmRequest","llmResponse","disableBuilderIcon","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab"],[1,"builder-mode-container"],[1,"chat-container"],[3,"appName","preloadedAppData","preloadedLightGraphSvg","preloadedDarkGraphSvg","startPath"],[4,"ngComponentOutlet"],["src","assets/ADK-512-color.svg","width","20px","height","20px"],[1,"toolbar-logo-text","logo-wide"],[2,"color","var(--mat-sys-on-surface-variant)","margin-left","8px","opacity","0.6"],[1,"toolbar-logo-text","logo-narrow"],[1,"info-icon-container"],[1,"disclosure-info-icon"],[1,"custom-tooltip"],[1,"tooltip-desc"],[1,"tooltip-grid"],[1,"tooltip-item"],[1,"tooltip-label"],[1,"tooltip-value"],[1,"selector-group-divider"],["matTooltipPosition","below",3,"matTooltip"],["mat-icon-button","",1,"toolbar-icon-button",3,"click","disabled"],["mat-icon-button","","matTooltipPosition","below",1,"toolbar-icon-button",3,"click","disabled"],[1,"readonly-chip"],[1,"toolbar-content"],[2,"display","flex","align-items","center"],[1,"toolbar-actions"],["mat-icon-button","",1,"toolbar-icon-button",3,"matTooltip"],["fontSet","material-symbols-outlined",2,"font-size","18px","width","18px","height","18px","line-height","18px"],[1,"chip-label"],["mat-icon-button","","aria-label","Close readonly view",1,"chip-close-button",3,"click"],[2,"font-size","16px","width","16px","height","16px"],["matTooltip","Select a session",1,"selector-button",3,"click"],["id","toolbar-new-session-button",1,"selector-button","new-session-button",3,"matTooltip"],["id","toolbar-new-session-button",1,"selector-button","new-session-button","icon-only",3,"matTooltip"],["id","toolbar-new-session-button",1,"selector-button","new-session-button",3,"click","matTooltip"],["id","toolbar-new-session-button",1,"selector-button","new-session-button","icon-only",3,"click","matTooltip"],[1,"chip-value"],["mat-button","",2,"height","30px",3,"click"],["mat-flat-button","",2,"height","30px",3,"click","disabled"],[1,"toolbar-session-text"],["mat-icon-button","",1,"toolbar-icon-button",3,"click","matTooltip"],[1,"selector-drawer-header"],[1,"selector-drawer-title"],["mat-icon-button","","matTooltip","Create new agent","matTooltipPosition","below","aria-label","Create new agent",1,"toolbar-icon-button",3,"click"],["mat-icon-button","","aria-label","Close app selector",1,"toolbar-icon-button",3,"click"],[1,"app-selector-search"],["subscriptSizing","dynamic","appearance","outline",1,"app-selector-search-field"],["matPrefix",""],["matInput","","placeholder","Search apps...",3,"keydown","formControl"],[1,"app-selector-list",3,"keydown"],[1,"app-selector-loading"],["mode","indeterminate","diameter","32"],[1,"app-selector-item",3,"selected"],[1,"app-selector-empty"],[1,"app-selector-item",3,"click"],["fontSet","material-symbols-outlined",1,"app-selector-item-icon"],[1,"app-selector-item-name"],[1,"app-selector-check"],[2,"display","flex","gap","4px"],["mat-button","",1,"toolbar-button",3,"matTooltip"],["mat-button","",1,"toolbar-button",3,"click","matTooltip"],["mat-icon-button","","aria-label","Close session selector",1,"toolbar-icon-button",3,"click"],[1,"session-selector-current-id"],[1,"session-selector-drawer-content"],[3,"sessionSelected","sessionReloaded","userId","appName","sessionId"],[1,"session-selector-current-id-label"],[1,"session-selector-current-id-row"],["textClass","session-selector-current-id-value",3,"save","value","displayValue","tooltip"],[1,"session-selector-current-real-id-row",2,"display","flex","align-items","center","gap","4px"],[1,"session-selector-current-real-id-value",3,"title"],["mat-icon-button","","matTooltip","Copy session ID","aria-label","Copy session ID",1,"session-selector-action-button",3,"click"],["mat-button","",3,"matTooltip"],["mat-button","","color","warn",3,"matTooltip"],["mat-button","",3,"click","matTooltip"],["mat-button","","color","warn",3,"click","matTooltip"],[3,"jumpToInvocation","closePanel","tabChange","sessionSelected","evalCaseSelected","editEvalCaseRequested","testSelected","evalSetIdSelected","returnToSession","evalNotInstalled","page","closeSelectedEvent","openImageDialog","openAddItemDialog","enterBuilderMode","showAgentStructureGraph","switchToEvent","switchToTraceView","drillDownNodePath","selectEventById","isApplicationSelectorEnabledObs","showSidePanel","appName","userId","sessionId","isViewOnlySession","isViewOnlyAppNameMismatch","traceData","eventData","currentSessionState","artifacts","selectedEvent","selectedEventIndex","renderedEventGraph","rawSvgString","selectedEventGraphPath","llmRequest","llmResponse","disableBuilderIcon","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab"],[3,"exitBuilderMode","closePanel","appNameInput"],[1,"resize-handler"],[1,"builder-exit-button"],["mat-icon-button","","matTooltip","Accept",1,"builder-mode-action-button",3,"click"],["mat-icon-button","","matTooltip","Exit Builder Mode",1,"builder-mode-action-button",3,"click"],["mat-icon-button","","matTooltip","Builder Assistant",1,"builder-mode-action-button",3,"click"],[3,"toggleSidePanelRequest","builderAssistantCloseRequest","showSidePanel","showBuilderAssistant","appNameInput"],[1,"chat-card"],[1,"empty-state-container"],[1,"warning"],[1,"error"],[1,"chat-sub-toolbar"],["hideSingleSelectionIndicator","",3,"change","value"],["value","events"],["value","traces"],[1,"filter-bar-container",3,"click"],[1,"filter-chip",3,"matMenuTriggerFor","matTooltip"],["matTooltip","Hide intermediate events to only show final results",1,"filter-chip"],["matTooltip","Add a filter",1,"add-filter-btn",3,"matMenuTriggerFor"],["matTooltip","Clear all filters",1,"add-filter-btn"],[1,"filter-panel"],["mat-menu-item","","matTooltip","Filter events by a specific invocation","matTooltipPosition","right"],["mat-menu-item","","matTooltip","Filter events generated by a specific node","matTooltipPosition","right"],["mat-menu-item","","matTooltip","Hide intermediate events to only show final results","matTooltipPosition","right"],[1,"filter-panel",3,"closed"],["mat-menu-item","","matTooltipPosition","right",3,"matTooltip"],["mat-menu-item",""],[2,"flex-grow","1"],["mat-button","","matTooltip","Compare with expected",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"color"],["mat-button","","matTooltip","Enable real-time token streaming from the server",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"color"],[3,"appName","agentReadme","userInput","hideIntermediateEvents","uiEvents","traceData","isTokenStreamingEnabled","useSse","isChatMode","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"appName","agentReadme","hideIntermediateEvents","uiEvents","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[1,"file-view-container",2,"padding","20px","display","flex","flex-direction","column","align-items","center","justify-content","center","height","100%"],[1,"filter-chip",3,"click","matMenuTriggerFor","matTooltip"],[1,"chip-label",3,"title"],[1,"chip-remove",3,"click"],["matTooltip","Hide intermediate events to only show final results",1,"filter-chip",3,"click"],["matTooltip","Add a filter",1,"add-filter-btn",3,"click","matMenuTriggerFor"],["matTooltip","Clear all filters",1,"add-filter-btn",3,"click"],["mat-menu-item","","matTooltip","Filter events by a specific invocation","matTooltipPosition","right",3,"click"],["mat-menu-item","","matTooltip","Filter events generated by a specific node","matTooltipPosition","right",3,"click"],["mat-menu-item","","matTooltip","Hide intermediate events to only show final results","matTooltipPosition","right",3,"click"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[2,"font-size","16px","width","16px","height","16px","margin-right","8px","color","var(--mat-sys-primary)"],["mat-menu-item","",3,"click"],["mat-button","","matTooltip","Compare with expected",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"click"],[2,"font-size","20px","width","20px","height","20px","line-height","20px","margin-right","4px","vertical-align","middle"],[2,"font-size","13px","font-weight","500","vertical-align","middle"],["mat-button","","matTooltip","Enable real-time token streaming from the server",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"click"],[3,"userInputChange","toggleHideIntermediateEvents","toggleSse","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","fileSelect","removeFile","removeStateUpdate","sendMessage","updateState","toggleAudioRecording","toggleVideoRecording","longRunningResponseComplete","appName","agentReadme","userInput","hideIntermediateEvents","uiEvents","traceData","isTokenStreamingEnabled","useSse","isChatMode","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"userInputChange","userEditEvalCaseMessageChange","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","appName","agentReadme","hideIntermediateEvents","uiEvents","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[1,"eval-result-summary",2,"margin","0","padding","8px 24px","background","var(--mat-sys-surface-container)","border-bottom","1px solid var(--mat-sys-outline-variant)","display","flex","align-items","center"],[1,"side-by-side-layout"],[3,"appName","agentReadme","hideIntermediateEvents","uiEvents","traceData","isChatMode","evalCase","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[2,"display","flex","gap","12px","align-items","center","flex-wrap","wrap"],[1,"metric-block",2,"position","relative","display","flex","flex-direction","column","gap","2px","background","var(--mat-sys-surface-container-high)","padding","6px 12px","border-radius","6px","flex-shrink","0","cursor","pointer",3,"border"],[1,"metric-block",2,"position","relative","display","flex","flex-direction","column","gap","2px","background","var(--mat-sys-surface-container-high)","padding","6px 12px","border-radius","6px","flex-shrink","0","cursor","pointer"],[2,"color","var(--mat-sys-on-surface-variant)","font-size","11px","font-weight","500"],[2,"display","flex","align-items","baseline","gap","4px"],[2,"font-size","16px","font-weight","600"],[2,"color","var(--mat-sys-on-surface-variant)","font-size","14px","font-weight","500"],[1,"metric-tooltip"],[1,"tooltip-title"],[1,"tooltip-subtitle",2,"font-size","10px","color","var(--mat-sys-on-surface-variant)","margin-bottom","4px"],[1,"tooltip-desc",2,"margin-top","8px","border-top","1px solid var(--mat-sys-outline-variant)","padding-top","6px","margin-bottom","0"],[1,"side-panel-half"],[1,"panel-header"],[3,"appName","agentReadme","hideIntermediateEvents","uiEvents","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"toggleHideIntermediateEvents","toggleSse","userInputChange","userEditEvalCaseMessageChange","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","fileSelect","removeFile","removeStateUpdate","sendMessage","updateState","toggleAudioRecording","toggleVideoRecording","longRunningResponseComplete","appName","agentReadme","hideIntermediateEvents","uiEvents","traceData","isTokenStreamingEnabled","useSse","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[2,"font-size","48px","width","48px","height","48px","color","var(--mat-sys-on-surface-variant)"],[2,"margin-top","16px"],[2,"color","var(--mat-sys-on-surface-variant)"],[3,"close","appName","preloadedAppData","preloadedLightGraphSvg","preloadedDarkGraphSvg","startPath"]],template:function(A,i){if(A&1&&(Rt(tLA),B(0,"mat-toolbar",11)(1,"div",12)(2,"button",13),U("click",function(){return i.toggleSidePanel()}),B(3,"mat-icon"),y(4,"menu"),Q()(),B(5,"div",14),O(6,aLA,1,1,"ng-container")(7,lLA,13,3),Q(),B(8,"div",15)(9,"button",16),U("click",function(){return i.toggleAppSelectorDrawer()}),B(10,"mat-icon",17),y(11,"robot_2"),Q(),B(12,"span",18),y(13),Q(),O(14,gLA,2,0,"mat-icon",19),B(15,"mat-icon",20),y(16,"arrow_drop_down"),Q()(),O(17,CLA,6,3),Q()(),O(18,MLA,10,5,"div",21),B(19,"button",22)(20,"mat-icon"),y(21,"account_circle"),Q()(),B(22,"mat-menu",23,0)(24,"div",24),U("click",function(o){return o.stopPropagation()}),B(25,"div",25)(26,"span",26),y(27,"User ID"),Q(),hA(28,"span",27),B(29,"button",28),U("click",function(){return i.saveUserId("user")}),B(30,"mat-icon"),y(31,"restart_alt"),Q()()(),B(32,"div",29)(33,"app-inline-edit",30),U("save",function(o){return i.saveUserId(o)}),Q()()()()(),B(34,"mat-drawer-container",31)(35,"mat-drawer",32,1),U("closedStart",function(){return i.onSelectorDrawerClosed()})("opened",function(){return i.onSelectorDrawerOpened()}),O(37,NLA,20,4)(38,ULA,18,8),Q(),B(39,"mat-drawer-container",33)(40,"mat-drawer",34,2),O(42,TLA,1,23,"app-side-panel",35)(43,JLA,2,1),Q(),O(44,OLA,12,5,"div",36)(45,uGA,5,4,"div",37),Q()(),O(46,fGA,1,5,"app-agent-structure-graph-dialog",38)),A&2){let n=Qi(23);u(6),Y(i.logoComponent?6:7),u(7),lA(i.isLoadedAppUnavailable()?i.unavailableAppName():i.appName||"Select an app"),u(),Y(i.isLoadedAppUnavailable()?14:-1),u(3),Y(i.isBuilderMode()?-1:17),u(),Y(i.appName?18:-1),u(),H("matMenuTriggerFor",n),u(14),H("value",i.userId)("placeholder",i.i18n.userIdInputPlaceholder),u(2),RA("match-side-panel-width",i.showSidePanel),H("opened",i.showAppSelectorDrawer||i.showSessionSelectorDrawer)("autoFocus",!1),u(2),Y(i.showAppSelectorDrawer?37:i.showSessionSelectorDrawer?38:-1),u(5),Y(i.isBuilderMode()?43:42),u(2),Y(i.isBuilderMode()?44:45),u(2),Y(i.showAgentStructureOverlay?46:-1)}},dependencies:[bM,lM,Um,dn,vM,c6,ln,Dn,yn,n2,XI,Wt,cs,pi,ji,LB,Zs,Ml,$c,Nm,AJ,Tc,Ko,ua,gs,hQ,V6,mQ,cQ,JD,sv,dv,os,ip,JI],styles:['.expand-side-drawer[_ngcontent-%COMP%]{position:relative;top:4%;left:1%}.chat-container[_ngcontent-%COMP%]{width:100%;height:100%;max-width:100%;margin:auto;display:flex;flex-direction:column;flex:1}.chat-container.side-by-side[_ngcontent-%COMP%]{max-width:100%}.side-by-side-layout[_ngcontent-%COMP%]{display:flex;flex-direction:row;width:100%;height:100%;flex:1;overflow:hidden;gap:16px;padding:16px;box-sizing:border-box}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;height:100%;min-width:0;background-color:var(--mat-sys-surface-container-low);border-radius:8px;overflow:hidden}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%] .panel-header[_ngcontent-%COMP%]{padding:6px 16px;font-size:14px;font-weight:600;color:var(--mat-sys-on-surface);border-bottom:1px solid var(--mat-sys-outline-variant)}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%] app-chat-panel[_ngcontent-%COMP%]{flex:1;overflow:hidden;display:flex;flex-direction:column}.event-container[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)}.chat-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;overflow:hidden;flex:1;min-height:12%;min-width:500px;box-shadow:none;border-radius:12px 0 0}.chat-card[_ngcontent-%COMP%] app-chat-panel[_ngcontent-%COMP%]{flex:1;min-height:0}.chat-card.no-side-panel[_ngcontent-%COMP%]{border-radius:0}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;margin-top:16px}.content-bubble[_ngcontent-%COMP%]{padding:5px 20px;margin:5px;border-radius:20px;max-width:80%;font-size:14px;font-weight:400;position:relative;display:inline-block}.function-event-button[_ngcontent-%COMP%]{margin:5px 5px 10px}.function-event-button-highlight[_ngcontent-%COMP%]{border-color:var(--mat-sys-primary)!important;color:var(--mat-sys-on-primary)!important}.role-user[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center}.role-user[_ngcontent-%COMP%] .content-bubble[_ngcontent-%COMP%]{align-self:flex-end;color:var(--mat-sys-on-primary-container);background-color:var(--mat-sys-primary-container);box-shadow:none}.role-bot[_ngcontent-%COMP%]{display:flex;align-items:center}.role-bot[_ngcontent-%COMP%] .content-bubble[_ngcontent-%COMP%]{align-self:flex-start;color:var(--mat-sys-on-surface);background-color:var(--mat-sys-surface-container-high);box-shadow:none}.role-bot[_ngcontent-%COMP%]:focus-within .content-bubble[_ngcontent-%COMP%]{border:1px solid var(--mat-sys-outline)}.message-textarea[_ngcontent-%COMP%]{max-width:100%;border:none;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}.content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--mat-sys-outline-variant);padding-right:8px;min-width:350px;max-width:350px}.content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}.content-bubble[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--mat-sys-outline-variant);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--mat-sys-tertiary)}.header-actual[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#2e7d32}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--mat-sys-error)}.navigation-button-sidepanel[_ngcontent-%COMP%]{margin-left:auto;margin-right:20px}.fab-button[_ngcontent-%COMP%]{position:fixed;bottom:200px;right:100px}.sidepanel-toggle[_ngcontent-%COMP%]{position:relative;top:100px}.side-drawer[_ngcontent-%COMP%]{color:var(--chat-side-drawer-color);border-radius:0}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.file-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:5px;padding:5px;border-radius:4px}.empty-state-container[_ngcontent-%COMP%]{color:var(--chat-empty-state-container-color);height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Google Sans,sans-serif;font-weight:400;letter-spacing:normal;line-height:24px;font-size:18px}.empty-state-container[_ngcontent-%COMP%] pre.warning[_ngcontent-%COMP%]{color:var(--chat-warning-color)}.empty-state-container[_ngcontent-%COMP%] pre.error[_ngcontent-%COMP%]{color:var(--chat-error-color)}.new-session-button[_ngcontent-%COMP%]{margin-top:0;width:130px;height:28px;font-size:14px}.adk-checkbox[_ngcontent-%COMP%]{position:fixed;bottom:0;left:0;right:0;margin-bottom:20px;margin-left:20px}.app-toolbar[_ngcontent-%COMP%]{height:48px;min-height:48px!important;display:flex;align-items:center;font-family:Google Sans,sans-serif;font-size:13px;padding:0 8px!important;z-index:1}.toolbar-group[_ngcontent-%COMP%]{display:flex;align-items:center;flex-shrink:0}.toolbar-agent-group[_ngcontent-%COMP%]{margin-right:6px}.toolbar-session-group[_ngcontent-%COMP%]{flex-shrink:1;min-width:0;flex:1}.toolbar-logo[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;margin-right:16px;flex-shrink:0}.toolbar-logo-text[_ngcontent-%COMP%]{font-family:Google Sans,sans-serif;font-size:14px;font-weight:500;white-space:nowrap}.disclosure-info-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;opacity:.7;cursor:pointer;margin-right:16px;color:var(--chat-toolbar-icon-color)}.toolbar-content[_ngcontent-%COMP%]{display:flex;align-items:center;flex:1;min-width:0}.drawer-container[_ngcontent-%COMP%]{height:calc(100% - 48px)}.side-panel-container[_ngcontent-%COMP%]{width:100%;height:100%}.toolbar-actions[_ngcontent-%COMP%]{margin-left:auto;display:flex;align-items:center;flex-shrink:0}.toolbar-session-text[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-text-color);font-family:Google Sans,sans-serif;font-size:13px;font-style:normal;font-weight:500;text-transform:uppercase;flex-shrink:0}.toolbar-session-id[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-id-color);font-family:Google Sans Mono,monospace;font-size:13px;margin-left:5px}.readonly-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;background-color:var(--mat-sys-primary-container)!important;color:var(--mat-sys-on-primary-container)!important;padding:4px 12px;border-radius:16px;font-size:13px;font-weight:500;gap:6px}.readonly-chip[_ngcontent-%COMP%] .chip-label[_ngcontent-%COMP%]{text-transform:uppercase;font-size:11px;font-weight:700;opacity:.9}.readonly-chip[_ngcontent-%COMP%] .chip-value[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.readonly-chip[_ngcontent-%COMP%] .chip-close-button[_ngcontent-%COMP%]{width:24px!important;height:24px!important;min-width:24px!important;padding:0!important;display:flex!important;align-items:center;justify-content:center;color:inherit!important;opacity:.8;margin-left:4px}.readonly-chip[_ngcontent-%COMP%] .chip-close-button[_ngcontent-%COMP%]:hover{opacity:1;background-color:#fff3!important}.toolbar-session-id-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-left:5px}.toolbar-session-id-container[_ngcontent-%COMP%] .toolbar-session-id[_ngcontent-%COMP%]{margin-left:0}.toolbar-icon-button[_ngcontent-%COMP%]{color:var(--chat-toolbar-icon-color);background:transparent!important;border:none!important;box-shadow:none!important}.toolbar-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.small-icon-button[_ngcontent-%COMP%]{width:28px!important;height:28px!important;min-width:28px!important;min-height:28px!important;padding:0!important}.small-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px!important;width:18px!important;height:18px!important}.toolbar-user-id-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-left:5px}.toolbar-user-id-input[_ngcontent-%COMP%]{width:140px;height:24px;border:1px solid var(--chat-toolbar-session-text-color);border-radius:4px;color:var(--chat-toolbar-session-id-color);padding:0 6px;font-family:Google Sans Mono,monospace;font-size:12px}.toolbar-user-id-input[_ngcontent-%COMP%]:focus{outline:1px solid var(--chat-toolbar-icon-color)}.user-avatar-button[_ngcontent-%COMP%]{margin-left:auto;flex-shrink:0}.user-avatar-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:24px;width:24px;height:24px}.user-menu-panel[_ngcontent-%COMP%]{padding:16px;min-width:240px}.user-menu-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin-bottom:12px}.user-menu-avatar-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px;color:var(--chat-toolbar-icon-color)}.user-menu-label[_ngcontent-%COMP%]{font-size:14px;font-weight:500;color:var(--chat-toolbar-session-text-color);text-transform:uppercase}.user-menu-content[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.user-menu-id[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:14px;color:var(--chat-toolbar-session-id-color);word-break:break-all}.user-menu-input[_ngcontent-%COMP%]{flex:1;height:28px;border:1px solid var(--chat-toolbar-session-text-color);border-radius:4px;color:var(--chat-toolbar-session-id-color);padding:0 8px;font-family:Google Sans Mono,monospace;font-size:13px;background:transparent}.user-menu-input[_ngcontent-%COMP%]:focus{outline:1px solid var(--chat-toolbar-icon-color)}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.readonly-badge[_ngcontent-%COMP%]{color:var(--mat-sys-on-primary-container)!important;background-color:var(--mat-sys-primary-container)!important;border-radius:16px;padding:4px 12px;display:flex;align-items:center;margin-left:8px;font-family:Google Sans,sans-serif;font-size:13px;line-height:18px;gap:4px;white-space:nowrap}.readonly-badge[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;flex-shrink:0}.readonly-session-message[_ngcontent-%COMP%]{display:block;color:var(--chat-toolbar-session-text-color);font-family:Google Sans,sans-serif;font-size:13px;margin-left:1em;font-weight:400;line-height:18px;letter-spacing:.3px;flex-shrink:1}.builder-mode-container[_ngcontent-%COMP%]{position:relative;width:100%;height:100vh;display:flex;flex-direction:column}.builder-exit-button[_ngcontent-%COMP%]{position:absolute;top:20px;right:20px;display:flex;gap:8px}.builder-mode-action-button[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color)!important;border-radius:50%!important;transition:all .2s ease!important;margin:0!important;padding:0!important;width:40px!important;height:40px!important;min-width:40px!important;min-height:40px!important;border:1px solid var(--builder-tool-item-border-color)!important;box-shadow:0 2px 4px #0000001a!important;display:flex!important;align-items:center!important;justify-content:center!important}.builder-mode-action-button[_ngcontent-%COMP%]:hover{box-shadow:0 4px 8px #00000026!important}.builder-mode-action-button.active[_ngcontent-%COMP%]{color:#fff!important;border-color:var(--builder-button-primary-background-color)!important}.builder-mode-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}app-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;flex:1!important;display:flex!important;flex-direction:column!important;min-height:0!important}.build-mode-container[_ngcontent-%COMP%]{display:flex;width:100%;height:100%}.build-left-panel[_ngcontent-%COMP%], .build-right-panel[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;border:1px solid var(--builder-border-color);margin:10px;border-radius:8px}.selector-group[_ngcontent-%COMP%]{display:flex;align-items:center;border-radius:6px;border:1px solid var(--mat-sys-outline-variant, #c4c7c5);margin-right:8px;flex-shrink:0;height:32px;overflow:hidden}.selector-group[_ngcontent-%COMP%] .toolbar-icon-button[_ngcontent-%COMP%]{width:32px;height:32px;padding:0;display:flex;align-items:center;justify-content:center;flex-shrink:0}.selector-group[_ngcontent-%COMP%] .toolbar-icon-button[_ngcontent-%COMP%] .mdc-icon-button__ripple{border-radius:4px;inset:1px}.selector-group[_ngcontent-%COMP%] .toolbar-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.selector-group-divider[_ngcontent-%COMP%]{width:1px;height:16px;background-color:var(--mat-sys-outline-variant, #c4c7c5);flex-shrink:0}.selector-button[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;padding:4px 12px;margin-right:1px;border-radius:6px;border:none;background:transparent;cursor:pointer;color:var(--chat-toolbar-icon-color);font-family:Google Sans,sans-serif;font-size:13px;font-weight:500;height:100%;flex-shrink:0;white-space:nowrap;width:auto;max-width:220px;overflow:hidden;transition:background-color .15s ease;position:relative;z-index:0}.selector-button[_ngcontent-%COMP%]:before{content:"";position:absolute;inset:1px;border-radius:4px;background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant));opacity:0;pointer-events:none;z-index:-1;transition:opacity .15s ease}.selector-button[_ngcontent-%COMP%]:hover:before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.selector-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0}.new-session-button[_ngcontent-%COMP%]{width:auto!important}.new-session-button.icon-only[_ngcontent-%COMP%]{width:32px!important;padding:0!important;justify-content:center}.selector-label[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;flex:1;text-align:left}.selector-caret[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0;margin-left:auto;opacity:.7}.selector-drawer-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:8px 8px 8px 20px;height:48px;flex-shrink:0}.selector-drawer-title[_ngcontent-%COMP%]{font-size:16px;font-weight:500;font-family:Google Sans,sans-serif}.selector-drawer[_ngcontent-%COMP%]{width:320px;background-color:var(--mat-sys-surface, #fff)}.selector-drawer[_ngcontent-%COMP%] .mat-drawer-inner-container{display:flex;flex-direction:column;height:100%;overflow:hidden}.selector-drawer.match-side-panel-width[_ngcontent-%COMP%]{width:var(--side-drawer-width)}.app-selector-search[_ngcontent-%COMP%]{padding:0 12px 4px;flex-shrink:0}.app-selector-search-field[_ngcontent-%COMP%]{width:100%;font-size:13px}.app-selector-search-field[_ngcontent-%COMP%] .mat-mdc-form-field-infix[_ngcontent-%COMP%]{min-height:36px;padding-top:6px!important;padding-bottom:6px!important}.app-selector-search-field[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-text-color);font-size:18px;width:18px;height:18px}.app-selector-list[_ngcontent-%COMP%]{flex:1;overflow-y:auto;padding:0 8px}.app-selector-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;border:none;background:transparent;cursor:pointer;border-radius:8px;font-family:Google Sans Mono,monospace;font-size:13px;color:var(--chat-toolbar-icon-color);text-align:left;transition:background-color .15s ease}.app-selector-item[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant, rgba(0, 0, 0, .04))}.app-selector-item.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, #d7e3f7);font-weight:500}.app-selector-item-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;flex-shrink:0;color:var(--chat-toolbar-session-text-color)}.app-selector-check[_ngcontent-%COMP%]{margin-left:auto;font-size:18px;width:18px;height:18px}.app-selector-item-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-selector-loading[_ngcontent-%COMP%]{display:flex;justify-content:center;padding:24px}.app-selector-empty[_ngcontent-%COMP%]{text-align:center;padding:24px;color:var(--chat-toolbar-session-text-color);font-style:italic}.session-selector-current-id[_ngcontent-%COMP%]{padding:8px 20px;border-bottom:1px solid var(--mat-sys-outline-variant, #c4c7c5)}.session-selector-current-id-label[_ngcontent-%COMP%]{font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.5px;color:var(--mat-sys-on-surface-variant, #444746)}.session-selector-current-id-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.session-selector-current-id-value[_ngcontent-%COMP%]{font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px;font-family:Google Sans,sans-serif;color:var(--mat-sys-on-surface, #1a1c20);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:0 1 auto;min-width:0}.session-selector-current-real-id-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.session-selector-current-real-id-value[_ngcontent-%COMP%]{font-size:11px;font-family:Google Sans Mono,monospace;color:var(--chat-toolbar-session-id-color);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:0 1 auto;min-width:0;opacity:.7}.session-selector-action-button[_ngcontent-%COMP%]{flex-shrink:0;width:28px!important;height:28px!important;padding:0!important}.session-selector-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}.session-selector-drawer-content[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.build-panel-header[_ngcontent-%COMP%]{padding:16px 20px;border-bottom:1px solid var(--builder-border-color);border-radius:8px 8px 0 0}.build-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--builder-text-primary-color);font-size:16px;font-weight:500;font-family:Google Sans,Helvetica Neue,sans-serif}.build-panel-content[_ngcontent-%COMP%]{flex:1;padding:20px;color:var(--builder-text-secondary-color);overflow-y:auto}.build-panel-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5}.app-name-option[_ngcontent-%COMP%], .app-select[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:unset}.adk-web-developer-ui-disclaimer[_ngcontent-%COMP%]{padding-left:4px;padding-bottom:4px;font-size:10px;color:var(--adk-web-text-color-light-gray)}.menu-check-icon.inactive[_ngcontent-%COMP%]{visibility:hidden}.logo-narrow[_ngcontent-%COMP%]{display:none}@media(max-width:900px){.logo-wide[_ngcontent-%COMP%]{display:none}.logo-narrow[_ngcontent-%COMP%]{display:inline}}@media(max-width:750px){.toolbar-agent-group[_ngcontent-%COMP%] .selector-button[_ngcontent-%COMP%]{width:auto;padding:4px 8px}.toolbar-agent-group[_ngcontent-%COMP%] .selector-label[_ngcontent-%COMP%]{display:none}}@media(max-width:600px){.toolbar-session-group[_ngcontent-%COMP%] .selector-button[_ngcontent-%COMP%]{width:auto;padding:4px 8px}.toolbar-session-group[_ngcontent-%COMP%] .selector-label[_ngcontent-%COMP%]{display:none}}.chat-sub-toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 20px;background-color:var(--mat-sys-surface-container);border-bottom:1px solid var(--mat-sys-outline-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{border-radius:16px;height:28px;align-items:center}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] .mat-button-toggle-label-content{line-height:28px;padding:0 12px;font-size:13px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-bar-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;background-color:transparent;border:none;margin-left:16px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;height:28px;cursor:pointer;transition:background-color .2s ease}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-label[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;color:var(--mat-sys-on-surface-variant);padding:0;margin-left:4px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:transparent;border:1px dashed var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;font-weight:500;height:28px;cursor:pointer;transition:all .2s ease;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant);border-color:var(--mat-sys-outline);color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;margin-right:4px} .filter-panel{min-width:max-content!important;max-width:50vw} .filter-panel .mat-mdc-menu-item{min-height:32px!important;font-size:12px!important} .filter-panel .mat-mdc-menu-item .mat-mdc-menu-item-text, .filter-panel .mat-mdc-menu-item .mdc-list-item__primary-text{font-size:12px!important;line-height:normal}.metric-block[_ngcontent-%COMP%]:hover .metric-tooltip[_ngcontent-%COMP%]{visibility:visible!important;opacity:1!important}.metric-tooltip[_ngcontent-%COMP%]{visibility:hidden;opacity:0;position:absolute;z-index:100;top:110%;left:0;background:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:12px;width:220px;box-shadow:0 4px 12px #00000026;transition:opacity .15s ease,visibility .15s ease;pointer-events:none}.metric-tooltip[_ngcontent-%COMP%] .tooltip-title[_ngcontent-%COMP%]{font-weight:600;font-size:13px;margin-bottom:4px;color:var(--mat-sys-on-surface)}.metric-tooltip[_ngcontent-%COMP%] .tooltip-desc[_ngcontent-%COMP%]{font-size:11px;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;white-space:normal;line-height:1.4}.metric-tooltip[_ngcontent-%COMP%] .tooltip-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:6px;font-size:11px;border-top:1px solid var(--mat-sys-outline-variant);padding-top:6px}.metric-tooltip[_ngcontent-%COMP%] .tooltip-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:4px}.metric-tooltip[_ngcontent-%COMP%] .tooltip-label[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-weight:400}.metric-tooltip[_ngcontent-%COMP%] .tooltip-value[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface)}.info-icon-container[_ngcontent-%COMP%]{position:relative;display:inline-flex;align-items:center;cursor:pointer}.info-icon-container[_ngcontent-%COMP%]:hover .custom-tooltip[_ngcontent-%COMP%]{visibility:visible;opacity:1}.custom-tooltip[_ngcontent-%COMP%]{visibility:hidden;opacity:0;position:absolute;z-index:100;top:110%;left:50%;transform:translate(-50%);background:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:12px;width:250px;box-shadow:0 4px 12px #00000026;transition:opacity .15s ease,visibility .15s ease;pointer-events:none;white-space:normal}.custom-tooltip[_ngcontent-%COMP%] .tooltip-title[_ngcontent-%COMP%]{font-weight:600;font-size:13px;margin-bottom:4px;color:var(--mat-sys-on-surface)}.custom-tooltip[_ngcontent-%COMP%] .tooltip-desc[_ngcontent-%COMP%]{font-size:11px;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;line-height:1.4}.custom-tooltip[_ngcontent-%COMP%] .tooltip-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr;gap:4px;font-size:11px;border-top:1px solid var(--mat-sys-outline-variant);padding-top:6px}.custom-tooltip[_ngcontent-%COMP%] .tooltip-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:4px}.custom-tooltip[_ngcontent-%COMP%] .tooltip-label[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-weight:400}.custom-tooltip[_ngcontent-%COMP%] .tooltip-value[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface)}']})};var wQ=class t{static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-root"]],decls:1,vars:0,template:function(A,i){A&1&&hA(0,"app-chat")},dependencies:[Ev],encapsulation:2})};var DGA=[{path:"",component:wQ}],hv=class t{static \u0275fac=function(A){return new(A||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Rm.forRoot(DGA),Rm]})};var Qv=class{static getRuntimeConfig(){return window.runtimeConfig}};function yGA(t,e){if(t&1&&(wn(0,"a",0),Kn(1,"img",1),y(2),Gn()),t&2){p();let A=zn(0),i=zn(1);u(),ha("src",XC(A),Go),u(),ue(" ",i," ")}}function vGA(t,e){t&1&&(wn(0,"div"),y(1," Invalid custom logo config. Make sure that your runtime config specifies both imgUrl and text in the logo field. "),Gn())}var uv=class t{logoConfig=Qv.getRuntimeConfig().logo;static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-custom-logo"]],decls:4,vars:3,consts:[["href","/"],["width","32px","height","32px",1,"orcas-logo",3,"src"]],template:function(A,i){if(A&1&&(ta(0)(1),O(2,yGA,3,3,"a",0)(3,vGA,2,0,"div")),A&2){let n=ga(i.logoConfig==null?null:i.logoConfig.imageUrl);u();let o=ga(i.logoConfig==null?null:i.logoConfig.text);u(),Y(n&&o?2:3)}},styles:[`a[_ngcontent-%COMP%]{color:inherit;text-decoration:none;display:flex;align-items:center;gap:8px} + + + + + + + + + + + + + + + + +`]})};var bGA={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-as-n":!0,"layout-dis-iflx":!0,"layout-al-c":!0},MGA={"layout-w-100":!0},SGA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-mt-0":!0,"layout-mb-2":!0,"typography-sz-bm":!0,"color-c-n10":!0},kGA={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-pt-3":!0,"layout-pb-3":!0,"layout-pl-5":!0,"layout-pr-5":!0,"layout-mb-1":!0,"border-br-16":!0,"border-bw-0":!0,"border-c-n70":!0,"border-bs-s":!0,"color-bgc-s30":!0,"color-c-n100":!0,"behavior-ho-80":!0},QF={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mb-2":!0,"color-c-n10":!0},xGA=Ye(gA({},QF),{"typography-sz-tl":!0}),_GA=Ye(gA({},QF),{"typography-sz-tm":!0}),RGA=Ye(gA({},QF),{"typography-sz-ts":!0}),NGA={"behavior-sw-n":!0},EiA={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-pl-4":!0,"layout-pr-4":!0,"layout-pt-2":!0,"layout-pb-2":!0,"border-br-6":!0,"border-bw-1":!0,"color-bc-s70":!0,"border-bs-s":!0,"layout-as-n":!0,"color-c-n10":!0},FGA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0,"color-c-n10":!0},LGA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},GGA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},KGA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},UGA={"typography-f-c":!0,"typography-fs-n":!0,"typography-w-400":!0,"typography-sz-bm":!0,"typography-ws-p":!0,"layout-as-n":!0},TGA=Ye(gA({},EiA),{"layout-r-none":!0,"layout-fs-c":!0}),JGA={"layout-el-cv":!0},ciA=Ts.merge(bGA,{"color-c-p30":!0}),OGA=Ts.merge(EiA,{"color-c-n5":!0}),YGA=Ts.merge(TGA,{"color-c-n5":!0}),HGA=Ts.merge(kGA,{"color-c-n100":!0}),CiA=Ts.merge(xGA,{"color-c-n5":!0}),IiA=Ts.merge(_GA,{"color-c-n5":!0}),diA=Ts.merge(RGA,{"color-c-n5":!0}),zGA=Ts.merge(SGA,{"color-c-n5":!0}),BiA=Ts.merge(FGA,{"color-c-n60":!0}),PGA=Ts.merge(UGA,{"color-c-n35":!0}),jGA=Ts.merge(LGA,{"color-c-n35":!0}),qGA=Ts.merge(GGA,{"color-c-n35":!0}),VGA=Ts.merge(KGA,{"color-c-n35":!0}),hiA={additionalStyles:{Card:{},Button:{"--n-60":"var(--n-100)"},Image:{"max-width":"120px","max-height":"120px",marginLeft:"auto",marginRight:"auto"}},components:{AudioPlayer:{},Button:{"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-5":!0,"layout-pr-5":!0,"border-br-2":!0,"border-bw-0":!0,"border-bs-s":!0,"color-bgc-p30":!0,"color-c-n100":!0,"behavior-ho-70":!0},Card:{"border-br-4":!0,"color-bgc-p100":!0,"color-bc-n90":!0,"border-bw-1":!0,"border-bs-s":!0,"layout-pt-4":!0,"layout-pb-4":!0,"layout-pl-4":!0,"layout-pr-4":!0},CheckBox:{element:{"layout-m-0":!0,"layout-mr-2":!0,"layout-p-2":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0,"color-c-p30":!0},label:{"color-c-p30":!0,"typography-f-sf":!0,"typography-v-r":!0,"typography-w-400":!0,"layout-flx-1":!0,"typography-sz-ll":!0},container:{"layout-dsp-iflex":!0,"layout-al-c":!0}},Column:{},DateTimeInput:{container:{},label:{},element:{"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-3":!0,"layout-pr-3":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0}},Divider:{"color-bgc-n90":!0,"layout-mt-6":!0,"layout-mb-6":!0},Image:{all:{"border-br-50pc":!0,"layout-el-cv":!0,"layout-w-100":!0,"layout-h-100":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0,"layout-sp-c":!0,"layout-mb-3":!0},avatar:{},header:{},icon:{},largeFeature:{},mediumFeature:{},smallFeature:{}},Icon:{"border-br-1":!0,"layout-p-2":!0,"color-bgc-n98":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0,"layout-sp-c":!0},List:{"layout-g-4":!0,"layout-p-2":!0},Modal:{backdrop:{"color-bbgc-p60_20":!0},element:{"border-br-2":!0,"color-bgc-p100":!0,"layout-p-4":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bc-p80":!0}},MultipleChoice:{container:{},label:{},element:{}},Row:{"layout-g-4":!0},Slider:{container:{},label:{},element:{}},Tabs:{container:{},controls:{all:{},selected:{}},element:{}},Text:{all:{"layout-w-100":!0,"layout-g-2":!0,"color-c-p30":!0},h1:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-2":!0,"layout-p-0":!0,"typography-sz-tl":!0},h2:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-2":!0,"layout-p-0":!0,"typography-sz-tl":!0},h3:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"typography-sz-ts":!0},h4:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"typography-sz-bl":!0},h5:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"color-c-n30":!0,"typography-sz-bm":!0,"layout-mb-1":!0},body:{},caption:{}},TextField:{container:{"typography-sz-bm":!0,"layout-w-100":!0,"layout-g-2":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0},label:{"layout-flx-0":!0},element:{"typography-sz-bm":!0,"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-3":!0,"layout-pr-3":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0,"color-c-p30":!0}},Video:{"border-br-5":!0,"layout-el-cv":!0}},elements:{a:ciA,audio:MGA,body:zGA,button:HGA,h1:CiA,h2:IiA,h3:diA,h4:{},h5:{},iframe:NGA,input:OGA,p:BiA,pre:PGA,textarea:YGA,video:JGA},markdown:{p:[...Object.keys(BiA)],h1:[...Object.keys(CiA)],h2:[...Object.keys(IiA)],h3:[...Object.keys(diA)],h4:[],h5:[],ul:[...Object.keys(qGA)],ol:[...Object.keys(jGA)],li:[...Object.keys(VGA)],a:[...Object.keys(ciA)],strong:[],em:[]}};var fv=class t{nodes=[];subAgentIdCounter=1;selectedToolSubject=new ei(void 0);selectedNodeSubject=new ei(void 0);selectedCallbackSubject=new ei(void 0);loadedAgentDataSubject=new ei(void 0);agentToolsMapSubject=new ei(new Map);agentToolsSubject=new ei(void 0);newAgentToolBoardSubject=new ei(void 0);agentCallbacksMapSubject=new ei(new Map);agentCallbacksSubject=new ei(void 0);agentToolDeletionSubject=new ei(void 0);deleteSubAgentSubject=new ei("");addSubAgentSubject=new ei({parentAgentName:""});tabChangeSubject=new ei(void 0);agentToolBoardsSubject=new ei(new Map);constructor(){}getNode(e){return this.nodes.find(i=>i.name===e)}getRootNode(){return this.nodes.find(A=>!!A.isRoot)}addNode(e){let A=this.nodes.findIndex(l=>l.name===e.name);A!==-1?this.nodes[A]=e:this.nodes.push(e);let i=/^sub_agent_(\d+)$/,n=e.name.match(i);if(n){let l=parseInt(n[1],10);l>=this.subAgentIdCounter&&(this.subAgentIdCounter=l+1)}let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e.name,e.tools||[]),this.agentToolsMapSubject.next(a);let r=this.agentCallbacksMapSubject.value,s=new Map(r);s.set(e.name,e.callbacks||[]),this.agentCallbacksMapSubject.next(s),this.setSelectedNode(this.selectedNodeSubject.value)}getNodes(){return this.nodes}clear(){this.nodes=[],this.subAgentIdCounter=1,this.setSelectedNode(void 0),this.setSelectedTool(void 0),this.agentToolsMapSubject.next(new Map),this.agentCallbacksMapSubject.next(new Map),this.setSelectedCallback(void 0),this.setAgentTools(),this.setAgentCallbacks()}getSelectedNode(){return this.selectedNodeSubject.asObservable()}setSelectedNode(e){this.selectedNodeSubject.next(e)}getSelectedTool(){return this.selectedToolSubject.asObservable()}setSelectedTool(e){this.selectedToolSubject.next(e)}getSelectedCallback(){return this.selectedCallbackSubject.asObservable()}setSelectedCallback(e){this.selectedCallbackSubject.next(e)}getNextSubAgentName(){return`sub_agent_${this.subAgentIdCounter++}`}addTool(e,A){let i=this.getNode(e);if(i){let n=i.tools||[];i.tools=[A,...n];let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e,i.tools),this.agentToolsMapSubject.next(a)}}deleteTool(e,A){let i=this.getNode(e);if(i&&i.tools){let n=i.tools.length;if(i.tools=i.tools.filter(o=>o.name!==A.name),i.tools.lengthr.name===A.name))return{success:!1,error:`Callback with name '${A.name}' already exists`};i.callbacks.push(A),this.agentCallbacksSubject.next({agentName:e,callbacks:i.callbacks});let o=this.agentCallbacksMapSubject.value,a=new Map(o);return a.set(e,i.callbacks),this.agentCallbacksMapSubject.next(a),{success:!0}}catch(i){return{success:!1,error:"Failed to add callback: "+i.message}}}updateCallback(e,A,i){try{let n=this.getNode(e);if(!n)return{success:!1,error:"Agent not found"};if(!n.callbacks)return{success:!1,error:"No callbacks found for this agent"};let o=n.callbacks.findIndex(g=>g.name===A);if(o===-1)return{success:!1,error:"Callback not found"};if(n.callbacks.some((g,C)=>C!==o&&g.name===i.name))return{success:!1,error:`Callback with name '${i.name}' already exists`};let r=gA(gA({},n.callbacks[o]),i);n.callbacks[o]=r,this.agentCallbacksSubject.next({agentName:e,callbacks:n.callbacks});let s=this.agentCallbacksMapSubject.value,l=new Map(s);return l.set(e,n.callbacks),this.agentCallbacksMapSubject.next(l),this.selectedCallbackSubject.value?.name===A&&this.setSelectedCallback(r),{success:!0}}catch(n){return{success:!1,error:"Failed to update callback: "+n.message}}}deleteCallback(e,A){try{let i=this.getNode(e);if(!i)return{success:!1,error:"Agent not found"};if(!i.callbacks)return{success:!1,error:"No callbacks found for this agent"};let n=i.callbacks.findIndex(r=>r.name===A.name);if(n===-1)return{success:!1,error:"Callback not found"};i.callbacks.splice(n,1),this.agentCallbacksSubject.next({agentName:e,callbacks:i.callbacks});let o=this.agentCallbacksMapSubject.value,a=new Map(o);return a.set(e,i.callbacks),this.agentCallbacksMapSubject.next(a),this.selectedCallbackSubject.value?.name===A.name&&this.setSelectedCallback(void 0),{success:!0}}catch(i){return{success:!1,error:"Failed to delete callback: "+i.message}}}setLoadedAgentData(e){this.loadedAgentDataSubject.next(e)}getLoadedAgentData(){return this.loadedAgentDataSubject.asObservable()}getAgentToolsMap(){return this.agentToolsMapSubject.asObservable()}getAgentCallbacksMap(){return this.agentCallbacksMapSubject.asObservable()}requestSideTabChange(e){this.tabChangeSubject.next(e)}getSideTabChangeRequest(){return this.tabChangeSubject.asObservable()}requestNewTab(e,A){this.newAgentToolBoardSubject.next({toolName:e,currentAgentName:A})}getNewTabRequest(){return this.newAgentToolBoardSubject.asObservable().pipe(we(A=>A?{tabName:A.toolName,currentAgentName:A.currentAgentName}:void 0))}requestTabDeletion(e){this.agentToolDeletionSubject.next(e)}getTabDeletionRequest(){return this.agentToolDeletionSubject.asObservable()}setAgentToolBoards(e){this.agentToolBoardsSubject.next(e)}getAgentToolBoards(){return this.agentToolBoardsSubject.asObservable()}getCurrentAgentToolBoards(){return this.agentToolBoardsSubject.value}getAgentTools(){return this.agentToolsSubject.asObservable()}getDeleteSubAgentSubject(){return this.deleteSubAgentSubject.asObservable()}setDeleteSubAgentSubject(e){this.deleteSubAgentSubject.next(e)}getAddSubAgentSubject(){return this.addSubAgentSubject.asObservable()}setAddSubAgentSubject(e,A,i){this.addSubAgentSubject.next({parentAgentName:e,agentClass:A,isFromEmptyGroup:i})}setAgentTools(e,A){if(e&&A){this.agentToolsSubject.next({agentName:e,tools:A});let i=this.agentToolsMapSubject.value,n=new Map(i);n.set(e,A),this.agentToolsMapSubject.next(n)}else this.agentToolsSubject.next(void 0)}getAgentCallbacks(){return this.agentCallbacksSubject.asObservable()}setAgentCallbacks(e,A){e&&A?this.agentCallbacksSubject.next({agentName:e,callbacks:A}):this.agentCallbacksSubject.next(void 0)}getParentNode(e,A,i,n){if(e){if(e.name===A.name)return i;for(let o of e.sub_agents){let a=this.getParentNode(o,A,e,n);if(a)return a}if(e.tools){for(let o of e.tools)if(o.toolType==="Agent Tool"){let a=n.get(o.toolAgentName||o.name);if(a){let r=this.getParentNode(a,A,e,n);if(r)return r}}}}}deleteNode(e){this.nodes=this.nodes.filter(A=>A.name!==e.name),this.setSelectedNode(this.selectedNodeSubject.value)}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var pv=class t{constructor(e){this.http=e}apiServerDomain=Dr.getApiServerBaseUrl();getLatestArtifact(e,A,i,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/artifacts/${n}`;return this.http.get(o)}getArtifactVersion(e,A,i,n,o){let a=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/artifacts/${n}/versions/${o}`;return this.http.get(a)}static \u0275fac=function(A){return new(A||t)(Lo(fr))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var mv=class t{audioContext=new AudioContext({sampleRate:22e3});lastAudioTime=0;scheduledAudioSources=new Set;playAudio(e){let A=this.combineAudioBuffer(e);A&&this.playPCM(A)}stopAudio(){for(let e of this.scheduledAudioSources)e.onended=null,e.stop();this.scheduledAudioSources.clear(),this.lastAudioTime=this.audioContext.currentTime}combineAudioBuffer(e){if(e.length===0)return;let A=e.reduce((o,a)=>o+a.length,0),i=new Uint8Array(A),n=0;for(let o of e)i.set(o,n),n+=o.length;return i}playPCM(e){let A=new Float32Array(e.length/2);for(let r=0;r=32768&&(s-=65536),A[r]=s/32768}let i=this.audioContext.createBuffer(1,A.length,22e3);i.copyToChannel(A,0);let n=this.audioContext.createBufferSource();n.buffer=i,n.connect(this.audioContext.destination),n.onended=()=>{this.scheduledAudioSources.delete(n)},this.scheduledAudioSources.add(n);let o=this.audioContext.currentTime,a=Math.max(this.lastAudioTime,o);n.start(a),this.lastAudioTime=a+i.duration}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var wv=class t{audioWorkletModulePath=w(l6);stream;audioContext;source;audioBuffer=[];volumeLevel=bA(0);lastVolumeUpdate=0;startRecording(){return lt(this,null,function*(){try{this.stream=yield navigator.mediaDevices.getUserMedia({audio:!0}),this.audioContext=new AudioContext,yield this.audioContext.audioWorklet.addModule(this.audioWorkletModulePath),this.source=this.audioContext.createMediaStreamSource(this.stream);let e=new AudioWorkletNode(this.audioContext,"audio-processor");e.port.onmessage=A=>{let i=A.data,n=Date.now();if(n-this.lastVolumeUpdate>100){let a=0;for(let l=0;le.stop()),this.volumeLevel.set(0)}getCombinedAudioBuffer(){if(this.audioBuffer.length===0)return;let e=this.audioBuffer.reduce((n,o)=>n+o.length,0),A=new Uint8Array(e),i=0;for(let n of this.audioBuffer)A.set(n,i),i+=n.length;return A}cleanAudioBuffer(){this.audioBuffer=[]}float32ToPCM(e){let A=new ArrayBuffer(e.length*2),i=new DataView(A);for(let n=0;n{let n=i.metricsInfo||[];this.metricsInfoCache.set(e,n),this.metricsInfo.set(n)}))}return new vi}createNewEvalSet(e,A,i="live"){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${e}/eval-sets`;return this.http.post(n,{eval_set:{eval_set_id:A,model_execution_mode:i,tool_execution_mode:i,eval_cases:[]}})}return new vi}getEvalSet(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/eval_sets/${A}`;return this.http.get(i,{})}return new vi}listEvalCases(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals`;return this.http.get(i,{})}return new vi}addCurrentSession(e,A,i,n,o){let a=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/add_session`;return this.http.post(a,{evalId:i,sessionId:n,userId:o})}runEval(e,A,i,n){let o=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/run_eval`;return this.http.post(o,{evalIds:i,evalMetrics:n})}listEvalResults(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/apps/${e}/eval_results`;return this.http.get(A,{})}return new vi}getEvalResult(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/eval_results/${encodeURIComponent(A)}`;return this.http.get(i,{})}return new vi}getEvalCase(e,A,i){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals/${i}`;return this.http.get(n,{})}return new vi}updateEvalCase(e,A,i,n){let o=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals/${i}`;return this.http.put(o,{evalId:i,conversation:n.conversation,sessionInput:n.sessionInput,creationTimestamp:n.creationTimestamp})}deleteEvalCase(e,A,i){let n=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals/${i}`;return this.http.delete(n,{})}deleteEvalSet(e,A){let i=this.apiServerDomain+`/apps/${e}/eval_sets/${A}`;return this.http.delete(i,{})}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var uF="gcp.vertex.agent.tool_call_args",fF="gcp.vertex.agent.tool_response",vv="gcp.vertex.agent.llm_request",bv="gcp.vertex.agent.llm_response",QiA="execute_tool",uiA="generate_content",WGA="content",ZGA="parts",XGA="functionResponse",fiA=t=>{let e=Ye(gA({},t),{attributes:gA({},t.attributes)}),A=t?.attributes?.[vv]??$GA(t),i=t?.attributes?.[bv]??iKA(t);return A!==void 0&&(e.attributes[vv]=A),i!==void 0&&(e.attributes[bv]=i),e},$GA=t=>t.name.startsWith(QiA)?t.attributes?.[uF]:t.name.startsWith(uiA)?piA(t.logs):void 0,AKA=t=>{let e=eKA(t),A=piA(t);return JSON.stringify({system_message:e,user_message:pF(A)})},piA=t=>{if(!t)return;let e=t.reverse().find(tKA);if(!e)return;let A=typeof e.body=="string"?pF(e.body):e.body;return typeof A=="string"?A:(A.content.role="user",A.contents=[A.content],delete A.content,JSON.stringify(A))},eKA=t=>{if(!t)return;let e=t.reverse().find(A=>A.event_name==="gen_ai.system.message");if(e)return typeof e.body=="string"?pF(e.body):e.body},tKA=t=>{if(t.event_name!=="gen_ai.user.message")return!1;try{let A=(typeof t.body=="string"?JSON.parse(t.body):t.body)[WGA]?.[ZGA];return Array.isArray(A)?A.every(i=>!i[XGA]):!1}catch(e){return!1}},iKA=t=>t.name.startsWith(QiA)?t.attributes?.[fF]:t.name.startsWith(uiA)?miA(t.logs):void 0,miA=t=>{if(!t)return;let e=t.reverse().find(A=>A.event_name==="gen_ai.choice");if(e)return nKA(e)},pF=t=>{try{return JSON.parse(t)}catch(e){return t}},nKA=t=>typeof t.body=="string"?t.body:JSON.stringify(t.body),wiA=t=>{let e=t[vv]??oKA(t),A=t[bv]??aKA(t),i=gA({},t);return e!==void 0&&(i[vv]=e),A!==void 0&&(i[bv]=A),i},oKA=t=>{if(uF in t)return`${t[uF]}`;if(t.logs)return AKA(t.logs)},aKA=t=>{if(fF in t)return`${t[fF]}`;if(t.logs)return miA(t.logs)};var Mv=class t{constructor(e){this.http=e}apiServerDomain=Dr.getApiServerBaseUrl();getEventTrace(e){let A=this.apiServerDomain+`/debug/trace/${e.id}`;return this.http.get(A).pipe(we(n=>wiA(n)))}getTrace(e){let A=this.apiServerDomain+`/debug/trace/session/${e}`;return this.http.get(A).pipe(we(n=>Array.isArray(n)?n.map(fiA):n))}getEvent(e,A,i,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/events/${n}/graph`;return this.http.get(o)}static \u0275fac=function(A){return new(A||t)(Lo(fr))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Sv=class t{route=w(Vs);constructor(){}isImportSessionEnabled(){return ne(!0)}isEditFunctionArgsEnabled(){return this.route.queryParams.pipe(we(e=>e[eJ]==="true"))}isSessionUrlEnabled(){return ne(!0)}isA2ACardEnabled(){return this.route.queryParams.pipe(we(e=>e[tJ]==="true"))}isApplicationSelectorEnabled(){return ne(!0)}isAlwaysOnSidePanelEnabled(){return ne(!1)}isTraceEnabled(){return ne(!0)}isArtifactsTabEnabled(){return ne(!0)}isEvalEnabled(){return ne(!0)}isEvalV2Enabled(){return this.route.queryParams.pipe(we(e=>e[nJ]==="true"))}isTestsEnabled(){return this.route.queryParams.pipe(we(e=>e[iJ]==="true"))}isTokenStreamingEnabled(){return ne(!0)}isMessageFileUploadEnabled(){return ne(!0)}isManualStateUpdateEnabled(){return ne(!0)}isBidiStreamingEnabled(){return ne(!0)}isExportSessionEnabled(){return ne(!0)}isEventFilteringEnabled(){return ne(!1)}isDeleteSessionEnabled(){return ne(!0)}isLoadingAnimationsEnabled(){return ne(!0)}isSessionsTabReorderingEnabled(){return ne(!1)}isSessionFilteringEnabled(){return ne(!1)}isSessionReloadOnNewMessageEnabled(){return ne(!1)}isUserIdOnToolbarEnabled(){return ne(!0)}isDeveloperUiDisclaimerEnabled(){return ne(!0)}isFeedbackServiceEnabled(){return ne(!1)}isInfinityMessageScrollingEnabled(){return ne(!1)}isMoreOptionsButtonHidden(){return ne(!1)}isNewSessionButtonEnabled(){return ne(!0)}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var kv=class t{sendFeedback(e,A,i){return ne(void 0)}getFeedback(e,A){return ne(void 0)}deleteFeedback(e,A){return ne(void 0)}getPositiveFeedbackReasons(){return ne([])}getNegativeFeedbackReasons(){return ne([])}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var rKA=(()=>{var t=import.meta.url;return function(e={}){var A,i=e,n,o,a=new Promise((D,M)=>{n=D,o=M});i.agerrMessages=[],i.stderrMessages=[],h=D=>i.stderrMessages.push(D);var r=Object.assign({},i),s="./this.program",l=(D,M)=>{throw M},g="",C,I;typeof document<"u"&&document.currentScript&&(g=document.currentScript.src),t&&(g=t),g.startsWith("blob:")?g="":g=g.substr(0,g.replace(/[?#].*/,"").lastIndexOf("/")+1),C=D=>fetch(D,{credentials:"same-origin"}).then(M=>M.ok?M.arrayBuffer():Promise.reject(new Error(M.status+" : "+M.url)));var d=console.log.bind(console),h=console.error.bind(console);Object.assign(i,r),r=null;var E;function f(D){for(var M=atob(D),R=new Uint8Array(M.length),V=0;VD.startsWith(Je);function YA(){var D="data:application/octet-stream;base64,AGFzbQEAAAABmAd0YAJ/fwF/YAF/AGABfwF/YAN/f38Bf2ACf38AYAN/f38AYAR/f39/AX9gBH9/f38AYAV/f39/fwF/YAZ/f39/f38Bf2AFf39/f38AYAZ/f39/f38AYAh/f39/f39/fwF/YAAAYAABf2AHf39/f39/fwF/YAF8AXxgAn9/AXxgAX8BfGAHf39/f39/fwBgA39/fwF8YAd/f39/fHx/AGACf3wAYAR8fHx/AXxgAnx8AXxgA398fABgBX9+fn5+AGAEf39/fABgCn9/f39/f39/f38Bf2ADf35/AX5gBH9/fHwBf2ADfHx8AXxgCX9/f39/f39/fwBgA39/fgBgAAF8YAR/f39/AXxgAn9/AX5gBX9/f39+AX9gA39/fgF/YAp/f39/f39/f39/AGAEf35+fwBgBH9/fH8AYAJ/fgBgAnx/AXxgBH9/f3wBf2ABfwF+YAJ/fgF/YAJ/fAF/YAN8fH8BfGADf3x/AGAIf39/f39/f38AYAV/f39/fAF/YAt/f39/f39/f39/fwF/YAN/f3wAYAV/f35/fwBgBH9/fH8Bf2AAAX5gB39/f398f38Bf2AFf39/f3wAYAN/f3wBf2ADf35/AX9gAn19AX1gBH9/fX8AYAZ/fHx8fHwBfGADf39/AX5gDH9/f39/f39/f39/fwF/YAV/f3x/fwF/YAd/f398fH9/AGAGf39/fH9/AGAGf39/f35/AX9gD39/f39/f39/f39/f39/fwBgBH9/f38BfmAGf3x/f39/AX9gB39/f39/fn4Bf2AGf39/f35+AX9gB39/f39+f38Bf2AGf39/f39+AX9gAn5/AGAEf35/fwF/YAR/f3x8AXxgBX9/fH9/AGAJf39/f39/f39/AX9gBH9/fHwAYAR+fn5+AX9gAn99AX9gAn5/AX9gCH9/f398fHx/AGADf31/AGAGf39+fn5/AGABfAF/YAJ+fgF9YAJ/fQBgBH9/f34BfmAGf31/f39/AGADf3x8AX9gBX9/f3x/AGAFf398fH8AYAZ8fHx/f38AYAJ+fgF8YAJ8fwF/YAR/fHx8AGAGf39/f398AGAEf3x/fwBgBnx8f3x8fwBgB398fHx8fHwAYAV/fHx8fAF/YAF/AX1gA39/fwF9YAN+fn4Bf2AEf35+fgBgBH98f38Bf2AKf3x/f39/f39/fwBg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AgBB9ekDIAJBEGoQIBoQLwALFwBBAUF/IAAgASABEEAiABChAiAARhsLJQEBfyAAKAIsIgBBAEGAASAAKAIAEQMAIgAEfyAAKAIQBUEACws0AQF/AkAgACABEOYBIgFFDQAgACgCLCIAIAFBCCAAKAIAEQMAIgBFDQAgACgCECECCyACC28BAX8jAEEgayIDJAAgA0IANwMYIANCADcDECADIAI2AgwCQCADQRBqIAEgAhCzCiIBQQBIBEAgA0H8gAsoAgAQswU2AgBBioAEIAMQNwwBCyAAIANBEGoiABCNBSABEKECGiAAEFwLIANBIGokAAszAQF/IAIEQCAAIQMDQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQQFrIgINAAsLIAALJAEBfyMAQRBrIgMkACADIAI2AgwgACABIAIQzQsgA0EQaiQAC6QBAQN/IwBBEGsiAiQAAkAgABAtIgMgACgCAEEDcSAAKQMIEOgJIgEEfyABKAIYBUEACyIBDQAgAygCTCIBKAIAKAIMIgMEQCABKAIIIAAoAgBBA3EgACkDCCADESYAIgENAQtBACEBIAAoAgBBA3FBAkYNACACIAApAwg3AwggAkElNgIAQfDdCiEBQfDdCkEgQeAXIAIQtAEaCyACQRBqJAAgAQsPACAAIAEgAiADQQAQ8QsLQwAgACAAIAGlIAG9Qv///////////wCDQoCAgICAgID4/wBWGyABIAC9Qv///////////wCDQoCAgICAgID4/wBYGwsUACAAECgEQCAALQAPDwsgACgCBAsVACAAEKMBBEAgACgCBA8LIAAQpQMLowEBAn8CQAJAIAAEQCAAKAIIIgMgACgCDCICRgRAIAAgA0EBdEEBIAMbIAEQ/AEgACgCDCECCyACRQ0BIAAoAggiAyACTw0CIAAgACgCBCADaiACcCICIAEQ3wEaIAAgACgCCEEBajYCCCACDwtB0dMBQYm4AUE7QdbDARAAAAtBr5UDQYm4AUHDAEHWwwEQAAALQZoMQYm4AUHEAEHWwwEQAAALJgAgACABEK4HIgFFBEBBAA8LIAAQ7AEoAgwgASgCEEECdGooAgALLgAgAC0ADyIAQQFqQf8BcUERTwRAQbS7A0Gg/ABB3ABB6ZcBEAAACyAAQf8BRwtDACAAIAAgAaQgAb1C////////////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AkHYmQshASAAQdiZC0EYEM4BRQ0CQRgQTyIBRQ0BCyABIAIpAgg3AgAgASACKQIYNwIQIAEgAikCEDcCCAwBC0EAIQELIAJBIGokAEHkmwtBAToAAEHgmwsgATYCACABC60BAgF/An4CQAJAIAAEQCABBEAgAEEAEL8CIgMoAvQDDQIgAykDsAQiBCABQQhrIgEoAgBBCGqtIgVUDQMgAyAEIAV9IgQ3A7AEIAMoAsAEQQJPBEAgA0EtIAUgBCADKQO4BCACEJEECyABIAAoAhQRAQALDwtBsdQBQZ+9AUGKB0GonwEQAAALQbDSAUGfvQFBkQdBqJ8BEAAAC0HjqAFBn70BQZoHQaifARAAAAsJACAAQQAQ2AYLvwoCBX8PfiMAQeAAayIFJAAgBEL///////8/gyEMIAIgBIVCgICAgICAgICAf4MhCiACQv///////z+DIg1CIIghDiAEQjCIp0H//wFxIQcCQAJAIAJCMIinQf//AXEiCUH//wFrQYKAfk8EQCAHQf//AWtBgYB+Sw0BCyABUCACQv///////////wCDIgtCgICAgICAwP//AFQgC0KAgICAgIDA//8AURtFBEAgAkKAgICAgIAghCEKDAILIANQIARC////////////AIMiAkKAgICAgIDA//8AVCACQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQogAyEBDAILIAEgC0KAgICAgIDA//8AhYRQBEAgAiADhFAEQEKAgICAgIDg//8AIQpCACEBDAMLIApCgICAgICAwP//AIQhCkIAIQEMAgsgAyACQoCAgICAgMD//wCFhFAEQCABIAuEQgAhAVAEQEKAgICAgIDg//8AIQoMAwsgCkKAgICAgIDA//8AhCEKDAILIAEgC4RQBEBCACEBDAILIAIgA4RQBEBCACEBDAILIAtC////////P1gEQCAFQdAAaiABIA0gASANIA1QIgYbeSAGQQZ0rXynIgZBD2sQsQFBECAGayEGIAUpA1giDUIgiCEOIAUpA1AhAQsgAkL///////8/Vg0AIAVBQGsgAyAMIAMgDCAMUCIIG3kgCEEGdK18pyIIQQ9rELEBIAYgCGtBEGohBiAFKQNIIQwgBSkDQCEDCyADQg+GIgtCgID+/w+DIgIgAUIgiCIEfiIQIAtCIIgiEyABQv////8P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AQRAIAEoAgQiAkUNAQNAIAEgAigCADYCBCACIAE2AgAgAiIBKAIEIgINAAsgBCABNgIADAELCyAAKAIIIQULIAAgAzYCDCAAIAVBgCByNgIIIAMLoQEBAn8CQCAAECVFIAIgAWtBBUhyDQAgASACEJYFIAJBBGshBCAAEEYiAiAAECVqIQUCQANAAkAgAiwAACEAIAEgBE8NACAAQQBMIABB/wBOckUEQCABKAIAIAIsAABHDQMLIAFBBGohASACIAUgAmtBAUpqIQIMAQsLIABBAEwgAEH/AE5yDQEgAiwAACAEKAIAQQFrSw0BCyADQQQ2AgALC4QBAQJ/IwBBEGsiAiQAIAAQowEEQCAAKAIAIAAQ9gIaEKEFCyABECUaIAEQowEhAyAAIAEoAgg2AgggACABKQIANwIAIAFBABDTASACQQA6AA8gASACQQ9qENIBAkAgACABRiIBIANyRQ0ACyAAEKMBIAFyRQRAIAAQpQMaCyACQRBqJAALUAEBfgJAIANBwABxBEAgASADQUBqrYYhAkIAIQEMAQsgA0UNACACIAOtIgSGIAFBwAAgA2utiIQhAiABIASGIQELIAAgATcDACAAIAI3AwgLzgkCBH8EfiMAQfAAayIGJAAgBEL///////////8AgyEJAkACQCABUCIFIAJC////////////AIMiCkKAgICAgIDA//8AfUKAgICAgIDAgIB/VCAKUBtFBEAgA0IAUiAJQoCAgICAgMD//wB9IgtCgICAgICAwICAf1YgC0KAgICAgIDAgIB/URsNAQsgBSAKQoCAgICAgMD//wBUIApCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhBCABIQMMAgsgA1AgCUKAgICAgIDA//8AVCAJQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQQMAgsgASAKQoCAgICAgMD//wCFhFAEQEKAgICAgIDg//8AIAIgASADhSACIASFQoCAgICAgICAgH+FhFAiBRshBEIAIAEgBRshAwwCCyADIAlCgICAgICAwP//AIWEUA0BIAEgCoRQBEAgAyAJhEIAUg0CIAEgA4MhAyACIASDIQQMAgsgAyAJhFBFDQAgASEDIAIhBAwBCyADIAEgASADVCAJIApWIAkgClEbIggbIQogBCACIAgbIgxC////////P4Mh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9ANFBEAgAykDsAQiIkKAgICAEH1CkHtaDQEgAyAiQvAEfCIiNwOwBCADKALABEECTwRAIANBK0LwBCAiIAMpA7gEIiMgIlQEfiADICI3A7gEICIFICMLQZ8LEJEECyACQRA2ApwDIAJBADYCKCACQQA2AhAgAiABQYACQakLEJgBIgM2AqgDIANFBEAgASABQasLEGdBAAwFCyACIAFBgAhBtgsQmAEiAzYCQCADRQRAIAEgAigCqANBuAsQZyABIAFBvAsQZwwECyACIANBgAhqNgJEQQAiBkUEQCABQbwBQcw6EJgBIgZFDQMgBkIANwJQIAZCADcCaCAGIAE2AmQgBiABNgJ8IAZCADcCCCAGQQA6AAQgBkIANwIcIAZBADoAGCAGIAE2AhAgBkEANgIAIAZCADcCMCAGQQA6ACwgBiABNgIkIAZBADYCFCAGQQA2AmAgBkIANwJYIAZCADcCcCAGQQA2AnggBkIANwJEIAZBADoAQCAGIAE2AjggBkEANgIoIAZBADYCPCAGIAE2AkwgBkIANwKMASAGQQA6AIgBIAZCATcCgAEgBiABNgKUASAGQgA3ApgBIAZBADoAoAEgBkIANwKkASAGQgA3AqwBIAZCADcCtAELIAJBADYCmAMgAiAGNgKEAyACQQA2ApADIAJBADYC0AIgAkEANgLIAiACQQA2AsACIAJCADcD8AMgAkEhOgD4AyACQQA2AogCIAJBADYCkAEgAkEAOwH8ASACQgA3AsADIAJBADYC+AEgAkIANwKsAyACIAE2AtQDIAJCADcCyAMgAkEANgLQAyACQQA6ALQDIAJBADYC6AMgAkIANwLgAyACQgA3AtgDIAIgATYC7AMgAUHPATYCoAIgAUGbATYCiAIgAUEANgKcAiABQoCAgIAQNwKUAiAFBEBBACEGA0AgBSAGaiAGQQFqIQYtAAANAAsgASAGQYjCABCYASIDBEAgAyAFIAYQHxoLIAEgAzYC8AELIAFBADYCgAMgAUGgAWogAUGcAWpBABDBBhogAUIANwMAIAFBQGtBAEHAABA4GiABQgA3AowBIAFBADYChAEgAUIANwKUASABQgA3A7ADIAFBADYCNCABQQE6ADAgAUEANgIsIAFCADcCJCABQQA2AsQCIAFBADYCvAIgAUIANwKkAiABQgA3AqwCIAFBADYCtAIg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akECED0MGgUgESADQQR0IhJqIhQgASASaiISKQMANwMAIBQgEikDCDcDCCADQQFqIQMMAQsACwALIAJBAmoiA0EQEBoiAiABKQMINwMIIAIgASkDADcDACACIBApAyA3AxAgAiAQKQMoNwMYIAIgECsDICAQKwMwIgYgECsDQKFEAAAAAAAACECjIgegOQMgIBArAyghCCAQKwNIIQkgECsDOCEFIAIgBiAHoDkDMCACIAUgBSAJoUQAAAAAAAAIQKMiBaA5AzggAiAIIAWgOQMoQQQgAyADQQRNGyERIAFBIGshE0EEIQEDQCABIBFGBEAgACACIAMgBBBIIAIQGCAPIBApAzg3AyggDyAQKQMwNwMgIA8gECkDKDcDOCAPIBApAyA3AzAgACAPQSBqQQIQPQwZBSACIAFBBHQiEmoiFCASIBNqIhIpAwA3AwAgFCASKQMINwMIIAFBAWohAQwBCwALAAsgAkEDaiIDQRAQGiICIAFBCGopAwA3AwggAiABKQMANwMAIAIgASsDACIFIAUgECsDEKEiBkQAAAAAAADQv6KgOQMQIAErAwghCCAQKwNIIQkgAiAQKwM4Igc5AzggAiAFIAZEAAAAAAAAAsCioDkDMCACIAUgBiAGoKE5AyAgAiAIIAcgCaFEAAAAAAAACECjoCIFOQMoIAIgBTkDGCAQKwMwIQUgAiAHOQNIIAIgBTkDQEEEIAMgA0EETRshESABQTBrIRNBBCEBA0AgASARRgRAIAAgAiADIAQQSCACEBgMGAUgAiABQQR0IhJqIhQgEiATaiISKQMANwMAIBQgEikDCDcDCCABQQFqIQEMAQsACwALIAJBBEcNG0EGQRAQGiICIAEpAwg3AwggAiABKQMANwMAIAIgECkDKDcDGCACIBApAyA3AxAgAiAQKQNINwMoIAIgECkDQDcDICACIAEpAyg3AzggAiABKQMgNwMwIAIgECkDgAE3A0AgAiAQKQOIATcDSCACIBApA6ABNwNQIAIgECkDqAE3A1ggACACQQYgBBBIIAIQGCAPIBArAxAgECsDsAEgECsDAKGgOQMgIA8gECsDGCAQKwO4ASAQKwMIoaA5AyggDyAQKQNINwM4IA8gECkDQDcDMCAAIA9BIGoiAUECED0gDyAQKQOIATcDOCAPIBApA4ABNwMwIAAgAUECED0gDyAQ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AgsgACABNwMAIAAgAjcDCAvbAQIBfwJ+QQEhBAJAIABCAFIgAUL///////////8AgyIFQoCAgICAgMD//wBWIAVCgICAgICAwP//AFEbDQAgAkIAUiADQv///////////wCDIgZCgICAgICAwP//AFYgBkKAgICAgIDA//8AURsNACAAIAKEIAUgBoSEUARAQQAPCyABIAODQgBZBEAgACACVCABIANTIAEgA1EbBEBBfw8LIAAgAoUgASADhYRCAFIPCyAAIAJWIAEgA1UgASADURsEQEF/DwsgACAChSABIAOFhEIAUiEECyAECxYAIABFBEBBAA8LQfyACyAANgIAQX8LCwAgACABIAIRAAALZAECfyMAQRBrIgMkAAJAIABBABCxAiIARQ0AAkACQAJAAkAgAQ4EAAECAgMLIAAoAhAhAgwDCyAAKAIIIQIMAgsgACgCDCECDAELIAMgATYCAEHExQQgAxA3CyADQRBqJAAgAgukAQIDfwJ8IwBBEGsiAiQAIAAQwQIgACgCECIBKwMYRAAAAAAAAFJAoyEEIAErAxBEAAAAAAAAUkCjIQUgABAcIQEDQCABBEAgASgCECgClAEiAyADKwMAIAWhOQMAIAMgAysDCCAEoTkDCCAAIAEQHSEBDAELCyACIAAoAhAiASkDGDcDCCACIAEpAxA3AwAgACACEMAMIABBARDKBSACQRBqJAALDwAgAUEBaiAAIAAQqgGfC6gBAgR/AnwgASgCACECIABBBGoiAyEAIAMhAQNAIAAoAgAiAARAIAAoAhAiBCsDCCIGIAIrAwgiB2MEQCAAQQRqIQAMAgUgACABIAAgAiAESyIEGyAGIAdkIgUbIQEgACAAIARBAnRqIAUbIQAMAgsACwsCQAJAIAEgA0YNACACKwMIIgYgASgCECIAKwMIIgdjDQAgACACTSAGIAdkcg0BCyADIQELIAELZAEBfyMAQRBrIgQkACAAQQA7ARwgAEEANgIYIAAgAzkDCCAAIAI2AgQgACABNgIAIAQgADYCDCABQTRqIARBDGoQwAEgACgCBCAEIAA2AghBKGogBEEIahDAASAEQRBqJAAgAAs8ACAAIAEQ0gIEQCAAEMMEDwsgABD9ByIBRQRAQQAPCyAAIAEQ/AchACABEG0gACAALQAkQQNyOgAkIAALrAEBAX8CQCAAECgE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IAUgBCsDCDkDECAFQShqIAMgFiAUIAsRHgBFBEAgBUIANwNYIAUgAzYCACAFIAc2AhggB0EBaiEHIAAgAxAdIQMMAQsLQZj/CigCABAYQZj/CkEANgIAENcMDAILQQAhByACQbADakEAQdAAEDgaIAUEQEGY/wooAgAhBET////////vfyEURP///////+//IRhE////////7/8hG0T////////vfyEZA0AgBSAHRgRARJqZmZmZmak/IRYCQCAAQdLkABAnIgBFDQAgAC0AAEUNACAAEK4CIRYLQbD/CiAbIBsgGaEgFqIiE6AiFzkDAEG4/wogGSAToSIVOQMAQaj/CiAUIBggFKEgFqIiE6EiFDkDAEGg/wogGCAToCITOQMAIAIgFTkD2AMgAiAXOQPoAyACIBU5A7gDIAIgEzkD0AMgAiAXOQPIAyACIBQ5A/ADIAIgEzkDwAMgAiAUOQPgAyABKAIAIQBBABDQByELAkACQCAAQQJGBEAgC0UNAiACQbADahDWDEEAIQMDQEGY/wooAgAhAUHk/gooAgAhAEEAIQQDQCAAIARHBEAgASAEQeAAbGoiCyALKwMIRM3MzMzMzPA/ojkDCCALIAsrAxBEzczMzMzM8D+iOQMQIARBAWohBAwBCwsgA0EBaiIDENAHDQALQezaCi0AAEUNASACIAM2AhBBiPYIKAIAQezdAyACQRBqECAaDAELIAtFDQEgAkGwA2oQ1gxBACEHQQAhBANAIAJBsANqIgEhACAHBEAgABDUDAtB+P4KQv////////93NwMAQfD+CkL/////////9/8ANwMAAkBB5P4KKAIAIgUEQCAAKAIAIQZE////////738hFET////////v/yEWQQAhAANAIAAgBUYNAkHw/gogFCAGIABBAnRqKAIAIgMrAwAQKSIUOQMAQfj+CiAWIAMrAwAQIyIWOQMAIABBAWohAAwACwALQeGVA0H8twFBzwFBzJIBEAAAC0GA/wogBigCACsDCDkDACAGIAVBAnRqQQRrKAIAKwMIIRNBkP8KIBYgFKE5AwBBiP8KIBM5AwBEAAAAAAAAAAAhFUQAAAAAAAAAACEUIwBBMGsiDiQAQQFBEBAaIg9B6P4KKAIAQQJ0IgA2AgQgDyAAQSgQGjYCAEHA/wogARDNBTYCACAOQgA3AyggDkIANwMgIA5CADcDGCMAQSBrIgUkAAJAAkACQCAOQRhqIgYEQCAGQgA3AgAgBkIANwIQIAZCADcCCCAGQej+CigCACIDQQF0IgA2AgggAEGAgICABE8NAUEAIAMgAEEEEE4iABsNAiAGIAA2AgwgBiAGQQBBABC3BDYCECAGIAZBAEEAELcEIgM2AhQgBigCECIAIAM2AgQgAEEANgIAIANBADYCBCADIAA2AgAgBigCDCAANgIAIAYoAgwgBigCCEECdGpBBGsgBigCFDYCACAFQSBqJAAMAwtB09MBQZK6AUEdQfaIARAAAAsgBUEENgIEIAUgADYCAEGI9ggoAgBBpuoDIAUQIBoQLwALIAUgA0EDdDYCEEGI9ggoAgBB9ekDIAVBEGoQIBoQLwALIAEQzQUhEANAIA8Q1AdFBEAgDygCDCEGIA8oAgAhAANAIAAgBkEobGooAiAiA0UEQCAPIAZBAWoiBjYCDAwBCwsgDiADKAIQKwMAOQMIIA4gAysDGDkDECAOKwMQIRUgDisDCCEUCwJAIBBFDQACQCAPENQHDQAgECsDCCITIBVjDQAgEyAVYg0BIBArAwAgFGNFDQELAn9BACEFAkAgDkEYaiIIBEAgCCgCCCIAQQBMDQECQCAQKwMAQfD+CisDAKFBkP8KKwMAoyAAt6IiE0QAAAAAAAAAAGMNACATIABBAWsiBbhkDQAgE5lEAAAAAAAA4EFjBEAgE6ohBQwBC0GAgICAeCEFCwJAIAggBRDSByIGDQBBASEDA0AgCCAFIANrENIHIgYNASADIAVqIQAgA0EBaiEDIAggABDSByIGRQ0ACwsgCCgCFCEDAkACQCAIKAIQIgAgBkcEQCADIAZGDQEgBiAQENEHRQ0BCwNAIAMgBigCBCIGRwRAIAYgEBDRBw0BCwsgBigCACEGDAELA0AgBigCACIGIABGDQEgBiAQENEHRQ0ACwsCQCAFQQBMDQAgBSAIKAIIQQFrTg0AIAgoAgwgBUECdGogBjYCAAsgBgwCC0HT0wFBkroBQbcBQZClARAAAAtBvTdBkroBQawBQdTZABAAAAsiDSgCBCEFIA0gCCANEN0MIBAgCBDjDCIDQQAQtwQiBhDTByANIAYgCBDOBSIABEAgDyANENUHIA8gDSAAIAAgEBDPBRDQBQsgBiAOQRhqIgAgA0EBELcEIgMQ0wcgAyAFIAAQzgUiAARAIA8gAyAAIAAgEBDPBRDQBQsgARDNBSEQDAELIA8Q1AdFBEAgDygCACAPKAIMQShsaiIAIAAoAiAiCCgCIDYCICAPIA8oAghBAWs2AgggCCgCACEKIAgoAgQiBSgCBCEDIAgoAggiAAR/IABBJEEgIAgtAAwbagVBwP8KCygCACENIAUQ3QwhACAIKAIIIAgsAAwgCCgCECIGIA5BGGoiBxDWByAFKAIIIAUsAAwgBiAHENYHIAgQ3wwgDyAFENUHIAUQ3wwgCiAHIAAgDSANKwMIIAArAwhkIggbIgUgDSAAIAgbIAcQ4wwiACAIELcEIg0Q0wcgACAIRSAGIAcQ1gcgCiANIAcQzgUiAARAIA8gChDVByAPIAogACAAIAUQzwUQ0AULIA0gAyAOQRhqEM4FIgBFDQEgDyANIAAgACAFEM8FENAFDAELCyAOKAIoKAIEIQADQCAOKAIsIABHBEAgACgCCBDiDCAAKAIEIQAMAQsLAkAgDkEYagRAIA4oAhghAQNAIAEEQCABKAIAIQAgARAYIA4gADYCGCAAIQEMAQsLIA5CADcCGAwBC0HQ1gFB4b4BQacBQckhEAAACyAOKAIkEBggDxCOCCAOQTBqJAAgAkGY/wooAgAiACkDEDcD+AIgAiAAKQMINwPwAiACIAIpA+ADNwPoAiACIAIpA9gDNwPgAiACQfACaiACQeACahD/AiEWIAIgACkDEDcD2AIgAiAAKQMINwPQAiACIAIpA8ADNwPIAiACIAIpA7gDNwPAAiACQdACaiACQcACahD/AiEUIAIgACkDEDcDuAIgAiAAKQMINwOwAiACIAIpA/ADNwOoAiACIAIpA+gDNwOgAiACQbACaiACQaACahD/AiEZIAIgACkDEDcDmAIgAiAAKQMINwOQAiACIAIpA9ADNwOIAiACIAIpA8gDNwOAAkEBIQcgAkGQAmogAkGAAmoQ/wIhGCAAIgMiCiEBA0BB5P4KKAIAIAdLBEAgAkGY/wooAgAgB0HgAGxqIgUpAxA3A5gBIAIgBSkDCDcDkAEgAiACKQPgAzcDiAEgAiACKQPYAzcDgAEgAkGQAWogAkGAAWoQ/wIhGiACIAUpAxA3A3ggAiAFKQMINwNwIAIgAikD8AM3A2ggAiACKQPoAzcDYCACQfAAaiACQeAAahD/AiEXIAIgBSkDEDcDWCACIAUpAwg3A1AgAiACKQPAAzcDSCACIAIpA7gDNwNAIAJB0ABqIAJBQGsQ/wIhFSACIAUpAxA3AzggAiAFKQMINwMwIAIgAikD0AM3AyggAiACKQPIAzcDICAFIAAgFiAaZCIIGyEAIAUgCiAXIBljIg0bIQogBSADIBQgFWQiBhshAyAFIAEgAkEwaiACQSBqEP8CIhMgGGMiBRshASAaIBYgCBshFiAXIBkgDRshGSAVIBQgBhshFCATIBggBRshGCAHQQFqIQcMAQsLIABBCGogAisD2AMgAisD4AMQ/gIgCkEIaiACKwPoAyACKwPwAxD+AiADQQhqIAIrA7gDIAIrA8ADEP4CIAFBCGogAisDyAMgAisD0AMQ/gJBACEBQZj/CigCACEIQeT+CigCACENIAQhAwNAIAEgDUcEQCAIIAFB4ABsaiEHAkAgA0UEQCAHLQAgQQFHDQELQQIgBygCXCIAIABBAk0bQQFrIQYgBygCWCIKKwMIIRkgCisDACEcQQEhBEQAAAAAAAAAACEWRAAAAAAAAAAAIRhEAAAAAAAAAAAhGwNAIAQgBkcEQCAbIAogBEEBaiIAQQR0aiIFKwMAIhQgGSAKIARBBHRqIgQrAwgiGqGiIBwgGiAFKwMIIhehoiAEKwMAIhMgFyAZoaKgoJlEAAAAAAAA4D+iIhWgIRsgFSAZIBqgIBegRAAAAAAAAAhAo6IgGKAhGCAVIBwgE6AgFKBEAAAAAAAACECjoiAWoCEWIAAhBAwBCwsgByAYIBujOQMQIAcgFiAbozkDCAsgAUEBaiEBDAELCyAMQQFqIgwQ0AciAARAIAAgC0khAUEBIQdBASEEIAAhC0EAIAlBAWogARsiCUUNAUG4/wpBuP8KKwMAIhNBsP8KKwMAIhQgE6FEmpmZmZmZqT+iIhOhIho5AwBBsP8KIBQgE6AiFzkDAEGo/wpBqP8KKwMAIhNBoP8KKwMAIhQgE6FEmpmZmZmZqT+iIhOhIhU5AwBBoP8KIBQgE6AiEzkDACACIBo5A9gDIAIgFzkD6AMgAiAaOQO4AyACIBM5A9ADIAIgFzkDyAMgAiAVOQPwAyACIBM5A8ADIAIgFTkD4AMgEUEBaiERDAELC0Hs2gotAABFDQBBiPYIKAIAIgYQ1QEgAhDWATcDgAQgAkGABGoiCRDrASIFKAIUIQsgBSgCECEDIAUoAgwhBCAFKAIIIQEgBSgCBCEAIAIgBSgCADYC/AEgAiAANgL4ASACIAE2AvQBIAIgBDYC8AEgAkHIAzYC5AEgAkH8twE2AuABIAIgA0EBajYC7AEgAiALQewOajYC6AEgBkHGygMgAkHgAWoQIBogAiAMNgLQASAGQY8YIAJB0AFqECAaQQogBhCnARogBhDUAUHs2gotAABFDQAgBhDVASACENYBNwOABCAJEOsBIgkoAhQhCyAJKAIQIQMgCSgCDCEEIAkoAgghASAJKAIEIQAgAiAJKAIANgLMASACIAA2AsgBIAIgATYCxAEgAiAENgLAASACQckDNgK0ASACQfy3ATYCsAEgAiADQQFqNgK8ASACIAtB7A5qNgK4ASAGQcbKAyACQbABahAgGiACIBE2AqABIAZBqRggAkGgAWoQIBpBCiAGEKcBGiAGENQBC0EAIQRBmP8KKAIAIQNB5P4KKAIAIQFBASEKA0AgASAERg0BIAMgBEHgAGxqIgsoAgAoAhAoApQBIgAgCysDCDkDACAAIAsrAxA5AwggBEEBaiEEDAALAAsQ1wwgAigCsAMQGCAKIBJqIRIMBAUgBCAHQeAAbGoiAysDKCEaIAMrAwghHCADKwMwIRcgAysDOCEVIAdBAWohByAYIAMrAxAiEyADKwNAoBAjIRggGyAcIBWgECMhGyAUIBMgF6AQKSEUIBkgHCAaoBApIRkMAQsACwALQeGVA0H8twFB3gBBphIQAAALQYuaA0H8twFB/QBBj98AEAAACyACQaAEaiQAIBILsgMCB38BfSMAQSBrIgQkACACQQAgAkEAShshBwNAIAUgB0YEQCADIABBAnRqQQA2AgAgBEEANgIYIARCADcDECAEQgA3AwggBCAANgIcIARBCGpBBBAmIQAgBCgCCCAAQQJ0aiAEKAIcNgIAIARBHGohCEH/////ByEAA0ACQCAEKAIQRQRAIABBCmohAEEAIQUDQCAFIAdGDQIgAyAFQQJ0aiIBKAIAQQBIBEAgASAANgIACyAFQQFqIQUMAAsACyAEQQhqIAgQoQQgASAEKAIcIgBBFGxqIQIgAyAAQQJ0aigCACEAQQEhBQNAIAUgAigCAE8NAiADIAVBAnQiBiACKAIEaigCACIJQQJ0aiIKKAIAQQBIBEAgCgJ/QQEgASgCCEUNABogAigCCCAGaioCACILi0MAAABPXQRAIAuoDAELQYCAgIB4CyAAajYCACAEIAk2AhwgBEEIakEEECYhBiAEKAIIIAZBAnRqIAQoAhw2AgALIAVBAWohBQwACwALCyAEQQhqIgBBBBAxIAAQNCAEQSBqJAAFIAMgBUECdGpBfzYCACAFQQFqIQUMAQsLCzIBAX8gAEEAIABBAEobIQADQCAAIANGRQRAIAIgA0ECdGogATgCACADQQFqIQMMAQsLC0gBAn8gAEEAIABBAEobIQMDQCACIANGBEAgAQRAIAEQGAsPCyABIAJBAnRqKAIAIgAEQCAAELUNCyAAEBggAkEBaiECDAALAAsQAEEgEIkBIAAgASACEK8DCwoAIAAoAgQQvQQLhAIBBn8jAEEQayIEJAAjAEEQayIDJAAgASIHQQRqIQUCQCABKAIEIgZFBEAgBSEBDAELIAIoAgAhCANAIAYiASgCECIGIAhLBEAgASEFIAEoAgAiBg0BDAILIAYgCE8NASABQQRqIQUgASgCBCIGDQALCyADIAE2AgwgBCAFKAIAIgEEf0EABUEUEIkBIQEgAyAHQQRqNgIEIAEgAigCADYCECADQQE6AAggByADKAIMIAUgARDdBSADQQA2AgAgAygCACECIANBADYCACACBEAgAhAYC0EBCzoADCAEIAE2AgggA0EQaiQAIAAgBCgCCDYCACAAIAQtAAw6AAQgBEEQaiQAC5QQAQh/IwBBQGoiCyQAAkACQAJAAkACQCABQQBMIAJBAExyRQRAIAEgAiAAIAYgB0EAEL8NIgkoAhghDCAJKAIUIQggAUEBaiEKQQAhBwNAIAcgCkYEQAJAIAZBBGsOBQAFBQUGBAsFIAggB0ECdGpBADYCACAHQQFqIQcMAQsLIAhBBGohCiAJKAIcIQ1BACEHQQAhBgNAIAAgBkYEQANAIAEgB0YEQEEAIQcDQCAAIAdGBEADQCABQQBMDQwgCCABQQJ0aiICIAJBBGsoAgA2AgAgAUEBayEBDAALAAUgDSAIIAMgB0ECdCICaiIGKAIAQQJ0aigCAEECdGogAiAFaigCADYCACACIARqKAIAIQIgCCAGKAIAQQJ0aiIGIAYoAgAiBkEBajYCACAMIAZBAnRqIAI2AgAgB0EBaiEHDAELAAsABSAHQQJ0IQIgCCAHQQFqIgdBAnRqIgYgBigCACACIAhqKAIAajYCAAwBCwALAAsCQCADIAZBAnQiDmooAgAiDyABTw0AIAQgDmooAgAgAk8NACAKIA9BAnRqIg4gDigCAEEBajYCACAGQQFqIQYMAQsLIAtB1wM2AiQgC0GWtwE2AiBBiPYIKAIAQdi/BCALQSBqECAaEDsAC0HOlgNBlrcBQbQDQYXxABAAAAsgBkEBRg0CCyALQfMDNgIEIAtBlrcBNgIAQYj2CCgCAEHYvwQgCxAgGhA7AAsgCEEEaiEFQQAhB0EAIQYDQCAAIAZGBEADQCABIAdGBEBBACEHA0AgACAHRgRAA0AgAUEATA0IIAggAUECdGoiAiACQQRrKAIANgIAIAFBAWshAQwACwAFIAQgB0ECdCICaigCACEFIAggAiADaigCAEECdGoiAiACKAIAIgJBAWo2AgAgDCACQQJ0aiAFNgIAIAdBAWohBwwBCwALAAUgB0ECdCECIAggB0EBaiIHQQJ0aiIFIAUoAgAgAiAIaigCAGo2AgAMAQsACwALAkAgAyAGQQJ0IgpqKAIAIg0gAU8NACAEIApqKAIAIAJPDQAgBSANQQJ0aiIKIAooAgBBAWo2AgAgBkEBaiEGDAELCyALQecDNgI0IAtBlrcBNgIwQYj2CCgCAEHYvwQgC0EwahAgGhA7AAsgCEEEaiEKIAkoAhwhDUEAIQdBACEGA0AgACAGRgRAA0AgASAHRgRAQQAhBwNAIAAgB0YEQANAIAFBAEwNByAIIAFBAnRqIgIgAkEEaygCADYCACABQQFrIQEMAAsABSANIAggAyAHQQJ0IgZqKAIAQQJ0aiIKKAIAIgJBA3RqIAUgB0EDdGorAwA5AwAgBCAGaigCACEGIAogAkEBajYCACAMIAJBAnRqIAY2AgAgB0EBaiEHDAELAAsABSAHQQJ0IQIgCCAHQQFqIgdBAnRqIgYgBigCACACIAhqKAIAajYCAAwBCwALAAsCQCADIAZBAnQiDmooAgAiDyABTw0AIAQgDmooAgAgAk8NACAKIA9BAnRqIg4gDigCAEEBajYCACAGQQFqIQYMAQsLIAtBxQM2AhQgC0GWtwE2AhBBiPYIKAIAQdi/BCALQRBqECAaEDsACyAIQQA2AgAgCSAANgIIAn9BACEDQQAhBiAJIgEoAgQiAEEAIABBAEobIQkgASgCECECIAEoAhghBCABKAIUIQUgAEEEED8hBwJAAkACQAJAAkACQAJAA0AgAyAJRgRAAkBBACEDIAJBBGsOBQMGBgYEAAsFIAcgA0ECdGpBfzYCACADQQFqIQMMAQsLIAJBAUcNAyAFKAIAIQAgASgCHCEJA0AgBiABKAIATg0DIAUgBkECdGohCiAFIAZBAWoiBkECdGohCANAIAgoAgAiAiAASgRAAkAgByAEIABBAnRqIg0oAgAiAkECdGooAgAiDCAKKAIASARAIAQgA0ECdGogAjYCACAJIANBA3RqIAkgAEEDdGorAwA5AwAgByANKAIAQQJ0aiADNgIAIANBAWohAwwBCyAEIAxBAnRqKAIAIAJHDQggCSAMQQN0aiICIAkgAEEDdGorAwAgAisDAKA5AwALIABBAWohAAwBCwsgCCADNgIAIAIhAAwACwALIAUoAgAhACABKAIcIQkDQCAGIAEoAgBODQIgBSAGQQJ0aiEKIAUgBkEBaiIGQQJ0aiEIA0AgCCgCACICIABKBEACQCAHIAQgAEECdCICaiINKAIAIgxBAnRqKAIAIg4gCigCAEgEQCAEIANBAnQiDmogDDYCACAJIA5qIAIgCWooAgA2AgAgByANKAIAQQJ0aiADNgIAIANBAWohAwwBCyAMIAQgDkECdCINaigCAEcNCCAJIA1qIgwgDCgCACACIAlqKAIAajYCAAsgAEEBaiEADAELCyAIIAM2AgAgAiEADAALAAsgBSgCACEAA0AgBiABKAIATg0BIAUgBkECdGohCCAFIAZBAWoiBkECdGohCQNAIAkoAgAiAiAASgRAAkAgByAEIABBAnRqIgwoAgAiAkECdGooAgAiCiAIKAIASARAIAQgA0ECdGogAjYCACAHIAwoAgBBAnRqIAM2AgAgA0EBaiEDDAELIAQgCkECdGooAgAgAkcNCAsgAEEBaiEADAELCyAJIAM2AgAgAiEADAALAAsgASADNgIIIAEhAwsgBxAYIAMMAwtBtscBQZa3AUG4B0G8LxAAAAtBtscBQZa3AUHMB0G8LxAAAAtBtscBQZa3AUHeB0G8LxAAAAsgC0FAayQACzwBAn8jAEEQayIBJABBASAAEE4iAkUEQCABIAA2AgBBiPYIKAIAQfXpAyABECAaEC8ACyABQRBqJAAgAgt6AQF/IwBBEGsiBCQAIAMEQCADIAAgAiACEOoFIgI2AghB7NoKLQAABEAgBCACNgIAQYj2CCgCAEHf3QMgBBAgGgsgA0EANgIUIANBADoADCAAIAEgAxCFCBogAygCECAEQRBqJAAPC0HY3gBBo7wBQYYKQYPfABAAAAspAQF/A0AgACIBKAIQKAKwASIADQALA0AgASIAKAIQKAJ4IgENAAsgAAtJAQF8IAEoAhQgABC1AyEBRAAAAAAAAPA/IAAoAiy3IAEoACC4RAAAAAAAAPA/oKOhIAEoAjQiACsDQCAAKwMwIgKhoiACoBAyCz0BAXwgASgCGCAAELUDIQEgACgCLLcgASgAILhEAAAAAAAA8D+goyABKAI0IgArADggACsAKCICoaIgAqALdwECfyMAQRBrIgMkAAJAAkAgAkEATgRAIAIgASgACEkNAQsgAEIANwIAIABCADcCCAwBCyABKAIAIQQgAyABKQIINwMIIAMgASkCADcDACAAIAQgAyACEBlBBHRqIgEpAgA3AgAgACABKQIINwIICyADQRBqJAAL4AECCHwBfyABQSBBGEGE/gotAAAiDBtqKwMAIQQgAiABQRhBICAMG2orAwAiBTkDGCACIAQ5AxAgAiABKQM4NwMAIAIgAUFAaykDADcDCCACIAIrAwAgBEQAAAAAAADgP6KhIgY5AwAgAiACKwMIIAVEAAAAAAAA4D+ioSIHOQMIIAMrAwAhCCADKwMIIQkgAysDECEKIAAgAysDGCILIAUgB6AiBSAFIAtjGzkDGCAAIAogBCAGoCIEIAQgCmMbOQMQIAAgCSAHIAcgCWQbOQMIIAAgCCAGIAYgCGQbOQMAC3wBAXwgAEEATgRAIAFEAAAAAAAAAABjBEBBAA8LIAFEAAAAAAAA8D9kRSAAuCICRAAAwP///99BIAGjZEVyRQRAQf////8HDwsgASACoiIBmUQAAAAAAADgQWMEQCABqg8LQYCAgIB4DwtBz5gDQYf8AEHNAEHO2QAQAAALUQECfEECQQFBAyAAKwMIIAErAwgiA6EgAisDACABKwMAIgShoiACKwMIIAOhIAArAwAgBKGioSIDRAAAAAAAAAAAYxsgA0QAAAAAAAAAAGQbCwsAIABBgdMEEBsaC3EBAX8jAEEQayIFJAAgAEG1xQMQGxogACABEIoBIAIEQCAAQd8AEGUgACACEIoBCyAFIAM2AgAgAEHbMyAFEB4CQCAEQf0oECciAUUNACABLQAARQ0AIABBIBBlIAAgARCKAQsgAEEiEGUgBUEQaiQAC9IBAQZ/IwBBIGsiAiQAIAAoAhAiASgCqAEhAyAAIAErA6ABEHsgAEH0kwQQGxoDQAJAIANFDQAgAygCACIFRQ0AIANBBGohAyAFIgFB8fcAEE1FDQEDQCABIgRBAWohASAELQAADQALA0AgBC0AAQRAIAIgBEEBaiIBNgIQIABBvMgDIAJBEGoQHgNAIAEtAAAgASIEQQFqIQENAAsMAQsLIAVBsy0QTUUEQCAAKAIQQgA3A6ABCyACIAU2AgAgAEGsgwQgAhAeDAELCyACQSBqJAALEABBASAAEEBBAXRBA2oQPwsxAQF/AkAgAUUNACABLQAARQ0AIAAoAjwiAkUNACACKAJwIgJFDQAgACABIAIRBAALC60BAgJ/AnwjAEEgayIDJAACQCAAKAI8IgRFDQAgBCgCYCIERQ0AIAAoAhAoApgBRQ0AIAErABghBSABKwAIIQYgAyABKwAQIAErAACgRAAAAAAAAOA/ojkDACADIAUgBqBEAAAAAAAA4D+iOQMIIAMgASkDGDcDGCADIAEpAxA3AxAgAC0AmQFBIHFFBEAgACADIANBAhCYAhoLIAAgAyACIAQRBQALIANBIGokAAsxAQF/AkAgACgCPCIBRQ0AIAEoAgQiAUUNACAAIAERAQALIAAoAgBBADYCGCAAELEKC68BAQN/An8gARA5IgEoAhAtAHNBAUYEQCAAEJoEDAELIAAgARDSBgsiACIDIQEDQEEAIQICQAJAA0AgAS0AACIERQ0BIAFBAWohASACQQFxBEBBCiECAkACQAJAIARB7ABrDgcCAQIBAQEAAQtBDSECDAELIAQhAgsgAyACOgAADAMLQQEhAiAEQdwARg0ACyADIAQ6AAAMAQsgA0EAOgAAIAAPCyADQQFqIQMMAAsACxgAIAAoAgAgACgCoAEgACgCnAEgARDfCAviawIZfw98IwBB4BVrIgIkACACQbgOaiAAKQCYAjcDACACQbAOaiAAKQCQAjcDACACQagOaiAAKQCIAjcDACACIAApAIACNwOgDgJAAkACQAJAIAEoAhAiBCgCCCIDRQ0AIAMrABggAisDoA5mRQ0AIAIrA7AOIAMrAAhmRQ0AIAMrACAgAisDqA5mRQ0AIAIrA7gOIAMrABBmDQELIAQoAmAiAwR/IAIgAkG4DmopAwA3A9AHIAIgAkGwDmopAwA3A8gHIAIgAkGoDmopAwA3A8AHIAIgAikDoA43A7gHIAMgAkG4B2oQ7wkNASABKAIQBSAECygCbCIDRQ0BIAMtAFFBAUcNASACIAJBuA5qKQMANwOwByACIAJBsA5qKQMANwOoByACIAJBqA5qKQMANwOgByACIAIpA6AONwOYByADIAJBmAdqEO8JRQ0BCwJAIAAoApwBQQJIDQAgACABQYDdCigCAEHx/wQQeiIDEIkEDQAgA0Hx/wQQPkUNASABQShqIQlBACEDA0BBMCEFQQMhCAJAAkAgAw4DAQAEAAtBUCEFQQIhCAsgCSAFQQAgASgCAEEDcSAIRxtqKAIAQajcCigCAEHx/wQQeiIEQfH/BBA+DQEgA0EBaiEDIAAgBBCJBEUNAAsLIAJCADcD4AcgAkIANwPYByACQdgHaiIEIAFBMEEAIAEoAgBBA3FBA0cbaigCKBAhEMUDIARByuABQbagAyABIAFBMGsiAyABKAIAQQNxQQJGGygCKBAtEIICGxDFAyAEIAEgAyABKAIAQQNxQQJGGygCKBAhEMUDIAAgBBDEAxCFBCAEEFwgAUGE3QooAgBB8f8EEHoiAy0AAARAIAAgAxCFBAsCQCABQezcCigCAEHx/wQQeiIDLQAAIhdFDQAgAxDDAxpBsOAKIQ1BsOAKIQMDQCADKAIAIgRFDQEgA0EEaiEDIARBsy0QPkUNAAsMAQsgAUGimAEQJxDsAiEaIAAoApgBIQ8gABCNBCIGQQk2AgwgBiABNgIIIAZBAzYCBAJAIAEoAhAoAmAiA0UNACADLQBSDQAgAUHerAEQJxBoRQ0AIAYgBi8BjAJBgARyOwGMAgsCQCAXRQ0AIAEoAhAoAghFDQAgACANEOUBCwJAQbjdCigCACIDRQ0AIAEgAxBFIgNFDQAgAy0AAEUNACAAIAFBuN0KKAIARAAAAAAAAPA/RAAAAAAAAAAAEEwQhwILAkAgD0GAgIAIcUUNACABIAFBMGoiAyABKAIAQQNxQQNGGygCKBAtKAIQLwGyAUEDTwRAIAYCfyABIAMgASgCAEEDcUEDRhsoAigoAhAoApQBKwMQRAAAAAAAAFJAoiIbRAAAAAAAAOA/RAAAAAAAAOC/IBtEAAAAAAAAAABmG6AiG5lEAAAAAAAA4EFjBEAgG6oMAQtBgICAgHgLtzkDuAEgBgJ/IAFBUEEAIAEoAgBBA3FBAkcbaigCKCgCECgClAErAxBEAAAAAAAAUkCiIhtEAAAAAAAA4D9EAAAAAAAA4L8gG0QAAAAAAAAAAGYboCIbmUQAAAAAAADgQWMEQCAbqgwBC0GAgICAeAu3OQPAAQwBCyAGQgA3A7gBIAZCADcDwAELAkAgD0GAgAJxRQ0AAkAgASgCECIEKAJgIgNFBEAgBigCyAEhBQwBCyAGIAMoAgAiBTYCyAELIAYgBTYC1AEgBiAFNgLMASAGIAU2AtABIAQoAmwiAwRAIAYgAygCADYCzAELIAQoAmgiAwRAIAYgAygCADYC0AELIAQoAmQiA0UNACAGIAMoAgA2AtQBC0EAIQNBACEFAkAgD0GAgARxRQ0AIAJBqA5qQgA3AwAgAkIANwOgDiAGIAAgASACQaAOaiIEEKcGIAEQgQE2AtwBIAQQXAJAAkAgAUGuhQEQJyIIBEAgCC0AAA0BCyABQZ/SARAnIghFDQEgCC0AAEUNAQsgCCABEIEBIQULAkAgBgJ/AkACQCABQaGFARAnIggEQCAILQAADQELIAFBk9IBECciCEUNASAILQAARQ0BCyAIIAEQgQEMAQsgBUUNASAFEGQLNgLYAQsCQCAGAn8CQAJAIAFBl4UBECciCARAIAgtAAANAQsgAUGK0gEQJyIIRQ0BIAgtAABFDQELIAggARCBAQwBCyAFRQ0BIAUQZAs2AuABCwJAAkACQCABQY6FARAnIggEQCAILQAADQELIAFBgtIBECciCEUNASAILQAARQ0BCyAGIAggARCBATYC5AEgBiAGLwGMAkGAAXI7AYwCDAELIAVFDQAgBiAFEGQ2AuQBCwJAAkAgAUGqhQEQJyIIBEAgCC0AAA0BCyABQZvSARAnIghFDQEgCC0AAEUNAQsgBiAIIAEQgQE2AugBIAYgBi8BjAJBgAJyOwGMAgwBCyAFRQ0AIAYgBRBkNgLoAQsCQCAPQYCAgARxRQ0AAkAgAUHiIhAnIgRFDQAgBC0AAEUNACAEIAEQgQEhAwsCQCAGAn8CQCABQdMiECciBEUNACAELQAARQ0AIAYgBi8BjAJBwAByOwGMAiAEIAEQgQEMAQsgA0UNASADEGQLNgL8AQsCQCAGAn8CQCABQcciECciBEUNACAELQAARQ0AIAQgARCBAQwBCyADRQ0BIAMQZAs2AoACCwJAAkAgAUG8IhAnIgRFDQAgBC0AAEUNACAGIAQgARCBATYChAIgBiAGLwGMAkEQcjsBjAIMAQsgA0UNACAGIAMQZDYChAILIAYCfwJAIAFB3iIQJyIERQ0AIAQtAABFDQAgBiAGLwGMAkEgcjsBjAIgBCABEIEBDAELIANFBEBBACEDDAILIAMQZAs2AogCCwJAIA9BgICAAnFFDQACQAJAAkAgAUGh2gAQJyIIBEAgCC0AAA0BCyABQZHaABAnIghFDQEgCC0AAEUNAQsgBiAIIAEQiAQiBCABEIEBNgLsASAEEBggBiAGLwGMAkEBcjsBjAIMAQsgBigCyAEiBEUNACAGIAQQZDYC7AELAkACQCABQYTaABAnIgRFDQAgBC0AAEUNACAGIAQgARCIBCIEIAEQgQE2AvABIAQQGCAGIAYvAYwCQQhyOwGMAgwBCyAGKALIASIERQ0AIAYgBBBkNgLwAQsCQAJAIAFB+NkAECciBEUNACAELQAARQ0AIAYgBCABEIgEIgQgARCBATYC9AEgBBAYIAYgBi8BjAJBAnI7AYwCDAELIAYoAtABIgRFDQAgBiAEEGQ2AvQBCwJAIAFBndoAECciBEUNACAELQAARQ0AIAYgBCABEIgEIgQgARCBATYC+AEgBBAYIAYgBi8BjAJBBHI7AYwCDAELIAYoAtQBIgRFDQAgBiAEEGQ2AvgBCyAFEBggAxAYAkAgD0GAgIQCcUUNACABKAIQKAIIIhFFDQACQCAGKALYAUUEQCAGKALsAUUNAiAPQYCAIHENAQwCCyAPQYCAIHFFDQELIBEoAgQhEiAAKAIQKwOgASACQYAVakEAQSgQOBogAkIANwP4ByACQgA3A/AHIAJCADcD6AcgAkGYFWohCkQAAAAAAADgP6JEAAAAAAAAAEAQIyElAkADQAJAIBAgEkYEQCAPQYDAAHENA0EAIQVBACEDDAELIBEoAgBBACEEIAJBsBVqQQBBKBA4GiAQQTBsaiIOKAIEQQFrQQNuIQhBACEMA0AgCCAMRgRAQQAhAwNAIAIoArgVIgggA00EQEEAIQMDQCADIAhJBEAgAiACQbgVaikDADcDkAcgAiACKQOwFTcDiAcgAkGIB2ogAxAZIQQCQAJAIAIoAsAVIgUOAgENAAsgAiACKAKwFSAEQQR0aiIEKQMINwOAByACIAQpAwA3A/gGIAJB+AZqIAURAQALIANBAWohAyACKAK4FSEIDAELCyACQbAVaiIDQRAQMSAQQQFqIRAgAxA0DAULQQAhByACKAKwFSELAkAgA0UEQEEAIQUMAQsgAiACQbgVaiIJKQMANwPwBiACIAIpA7AVNwPoBiALIAJB6AZqIANBAWsQGUEEdGohBSAJKAIAIQggAigCsBUhCwsgCCADQQFqIglLBEAgAiACQbgVaikDADcD4AYgAiACKQOwFTcD2AYgCyACQdgGaiAJEBlBBHRqIQcgAigCsBUhCwsgAiACQbgVaikDADcD0AYgAiACKQOwFTcDyAYgBEEEdCIIIAJBgAhqaiEOIAJBoA5qIAhqIQggCyACQcgGaiADEBlBBHRqIgMrAAghJCADKwAAISICQCAFBEAgBSsDCCEdIAUrAwAhISAHBEAgBysDCCEeIAcrAwAhIAwCCyAkIB2hIhsgG6AhHiAiICGhIhsgG6AhIAwBCyAkIAcrAwgiHqEiGyAboCEdICIgBysDACIgoSIbIBugISELIB4gJKEgICAioRCoASEcIAggJCAlIB0gJKEgISAioRCoASIbIBwgG6EiG0QYLURU+yEZwKAgGyAbRAAAAAAAAAAAZBtEAAAAAAAA4D+ioCIbEFeiIhygOQMIIAggIiAlIBsQSqIiG6A5AwAgDiAkIByhOQMIIA4gIiAboTkDACAEQQFqIQQgAigCuBUgCUcEQCAJIQMgBEEyRw0BCyACIARBAXQ2AvwHIAJB6AdqQQQQJiEDIAIoAugHIANBAnRqIAIoAvwHNgIAQQAhAwNAIAMgBEYEQCACQYAIaiAEQQR0aiEHQQAhAwNAIAMgBEcEQCAKIAcgA0F/c0EEdGoiBSkDADcDACAKIAUpAwg3AwggAkGAFWpBEBAmIQUgAigCgBUgBUEEdGoiBSAKKQMANwMAIAUgCikDCDcDCCADQQFqIQMMAQsLIAIgCCkDADcDoA4gAiAIKQMINwOoDiACIA4pAwA3A4AIIAIgDikDCDcDiAhBASEEIAkhAwwCBSAKIAJBoA5qIANBBHRqIgUpAwg3AwggCiAFKQMANwMAIAJBgBVqQRAQJiEFIAIoAoAVIAVBBHRqIgUgCikDADcDACAFIAopAwg3AwggA0EBaiEDDAELAAsACwALIA4oAgAgDEEwbGohB0EAIQMDQCADQQRGBEAgDEEBaiEMIAJBwBRqIAJBsBVqEKAGDAIFIANBBHQiBSACQcAUamoiCSAFIAdqIgUpAwA3AwAgCSAFKQMINwMIIANBAWohAwwBCwALAAsACwsDQCACKALwByADSwRAIAIgAikD8Ac3A4AGIAIgAikD6Ac3A/gFIAIoAugHIAJB+AVqIAMQGUECdGooAgAgBWohBSADQQFqIQMMAQsLIAIgAkGIFWoiCSkDADcDwAYgAiACKQOAFTcDuAYgAigCgBUhBCACQbgGakEAEBkhAyACIAkpAwA3A7AGIAIgAikDgBU3A6gGIAAgBCADQQR0aiACKAKAFSACQagGakEAEBlBBHRqIAUQmAIaCyACIAJBiBVqKQMANwOgBiACIAIpA4AVNwOYBiACKAKAFSEEIAJBmAZqQQAQGSEDIAZBAjYCkAIgBiAEIANBBHRqNgKkAiACQYAVaiAGQZgCakEAQRAQxwEgAiACKQPwBzcDkAYgAiACKQPoBzcDiAYgBiACKALoByACQYgGakEAEBlBAnRqKAIANgKUAiACQegHaiAGQaACaiAGQZwCakEEEMcBCwJAIAAoAjwiA0UNACADKAJAIgNFDQAgACADEQEACwJAIAYoAtgBIgNFBEAgBi0AjAJBAXFFDQELIAAgAyAGKALsASAGKAL8ASAGKALcARDEAQsgACgCECsDoAEhJSACQgA3A/AHIAJCADcD6AcCQCABKAIQKAIIRQ0AQQAhCCABQfjcCigCAEQAAAAAAADwP0QAAAAAAAAAABBMISggAUHM3AooAgBB8f8EEHohB0EAIQQCQCAXRQ0AIA0hAwNAIAMoAgAiBUEARyEEIAVFDQEgA0EEaiEDIAVB0asBED5FDQALCyAHIQNBACELAkACQAJAA0ACQAJAAkACQAJAIAMtAAAiBUE6aw4CAQIACyAFDQIgC0UgCEVyDQcgByACQYAVahDeBCIJQQJJDQMgASABQTBqIgUgASgCAEEDcUEDRhsoAigQLSABIAUgASgCAEEDcUEDRhsoAigQISEFEIICIQMgAiABQVBBACABKAIAQQNxQQJHG2ooAigQITYC6AUgAkHBywNBn80DIAMbNgLkBSACIAU2AuAFQfLvAyACQeAFahCAASAJQQJHDQUMBgsgCEEBaiEIDAELIAtBAWohCwsgA0EBaiEDDAELCyAJQQFGDQELIAJBwA5qIQ4gAkGwDmohCEEAIQdBACEFA0AgASgCECgCCCIDKAIEIAdNBEBBACEDA0AgAigCiBUgA0sEQCACIAJBiBVqKQMANwPYBSACIAIpA4AVNwPQBSACQdAFaiADEBkhBAJAAkAgAigCkBUiAQ4CAQoACyACIAIoAoAVIARBGGxqIgQpAwg3A8AFIAIgBCkDEDcDyAUgAiAEKQMANwO4BSACQbgFaiABEQEACyADQQFqIQMMAQsLIAJBgBVqIgFBGBAxIAEQNAwECyACQaAOaiADKAIAIAdBMGxqQTAQHxpEAAAAAAAA8D8hHEEBIQtBACEDIAUhBAJAAkADQCADIAIoAogVTw0BIAIgAkGIFWopAwA3A7AFIAIgAikDgBU3A6gFIAIoAoAVIAJBqAVqIAMQGUEYbGoiCSgCACIFRQ0BAkAgCSsDCCIbmUTxaOOItfjkPmNFBEAgACAFEEkgHCAboSEcAn8gCwRAIAJBoA5qIBsgAkHAFGogAkGwFWoQ4gggACACKALAFCIEIAIoAsQUQQAQ8AEgBBAYQQAgHJlE8WjjiLX45D5jRQ0BGiACKAKwFSEDDAMLIByZRPFo44i1+OQ+YwRAIAAgAigCsBUiAyACKAK0FUEAEPABDAMLIAJBgAhqIgkgAkGwFWoiBEEwEB8aIAkgGyAbIBygoyACQcAUaiAEEOIIIAIoAoAIEBggACACKALAFCIEIAIoAsQUQQAQ8AEgBBAYQQALIQsgBSEECyADQQFqIQMMAQsLIAMQGAwBCyAEIQULIAIoAqgOBEAgAiACQYgVaiIDKQMANwOgBSACIAIpA4AVNwOYBSAAIAIoAoAVIAJBmAVqQQAQGUEYbGooAgAQSSACIAMpAwA3A5AFIAIgAikDgBU3A4gFIAAgAigCgBUgAkGIBWpBABAZQRhsaigCABBdIAIgCCkDCDcDgAUgAiAIKQMANwP4BCACIAIoAqAOIgMpAwg3A/AEIAIgAykDADcD6AQgAEECIAJB+ARqIAJB6ARqICggJSACKAKoDhDqAgsgAigCrA4iBARAIAAgBRBJIAAgBRBdIAIgDikDCDcD4AQgAiAOKQMANwPYBCACIAIoAqAOIAIoAqQOQQR0akEQayIDKQMINwPQBCACIAMpAwA3A8gEIABBAyACQdgEaiACQcgEaiAoICUgBBDqAgsCQCAXRSABKAIQKAIIKAIEQQJJcg0AIAIoAqgOIAIoAqwOckUNACAAIA0Q5QELIAdBAWohBwwACwALQYX1ACEHCwJAAkACfyABKAIQLQB0IgNBAXEEQEHPkAMhC0GBtgEMAQsgA0ECcQRAQaSSAyELQZjpAQwBCyADQQhxBEBB2o8DIQtB0o8DDAELIANBBHFFDQFBzZIDIQtBkOkBCyEMIAJB6AdqIAsQxQMgByEDA0ACQCADLQAAIgVBOkcEQCAFDQEgAkHoB2oQxAMiCSAHRg0EIAAgCRBJDAQLIAIgCzYCwAQgAkHoB2pBnjMgAkHABGoQfgsgA0EBaiEDDAALAAsgAUHQ3AooAgAgBxCPASEMIAchCQsgByAMRwRAIAAgDBBdCwJAAkAgBARAIAwtAAAhEiAJLQAAIQMgAEG7HxBJIAAgCUGF9QAgAxsiERBdIAJBwBRqIgQgASgCECgCCCgCAEEwEB8aIAJBoA5qIQ8CfwJAQejcCigCACIDRQ0AIAEgAxBFIgMtAABFDQBBmAIgA0HLogEQPg0BGkGZAiADQZH1ABA+DQEaQZoCIANBmfcAED4NARogA0HAlgEQPkUNAEGbAgwBC0GYAkGbAiABQVBBACABKAIAQQNxQQJHG2ooAigQLRCCAhsLIQ5EAAAAAAAAAAAhHSMAQbABayIGJAAgBkIANwMYIAZCADcDECAGQgA3AwggBCgCBCEIIAQoAgAiCisAACEbIAYgCisACDkDKCAGIBs5AyAgBkEwakEAQTAQOBogBkEIakHAABAmIQEgBigCCCABQQZ0aiAGQSBqIg1BwAAQHxogBiAKKQMINwOoASAGIAopAwA3A6ABIAZBOGohB0EAIQMDQCAIIANBA2oiAUsEQCAGIAYpA6ABNwNwIAYgBikDqAE3A3ggCiADQQR0aiEJQQEhAwNAIANBBEYEQEEBIQMgBisDeCEbIAYrA3AhHgNAIANBFUYEQCABIQMMBQUgBkHgAGogBkHwAGogA7hEAAAAAAAANECjQQBBABChASAGKwNgISAgBiAGKwNoIhw5AyggBiAgOQMgIAYgHSAeICChIBsgHKEQR6AiHTkDMCAHQQBBKBA4GiAGQQhqQcAAECYhBCAGKAIIIARBBnRqIA1BwAAQHxogA0EBaiEDICAhHiAcIRsMAQsACwAFIANBBHQiBCAGQfAAamoiBSAEIAlqIgQpAwA3AwAgBSAEKQMINwMIIANBAWohAwwBCwALAAsLIAZBCGogBkHgAGogBkHwAGpBwAAQxwEgBigCYCIHIAYoAnAiDUEGdGpBMGsrAwAhJEQAAAAAAAAAACEeRAAAAAAAAAAAIRxBACEBRAAAAAAAAAAAIRsDQCANIAEiA00EQCAPQgA3AgBBACEHA0ACQCAHIA1PBEAgG0QYLURU+yEJQKAiIBBXIRsgDyAgEEogHKIgHqAgGyAcoiAmoBDhBCAGKAJwIgENAUHLlQNBvroBQacCQfo4EAAACyAGKAJgIAdBBnRqIgMrAyghHCADKwMgIhsQVyEdIAMrAwghJiAbEEohHiADKwM4ISAgAy0AMCAPIB4gHKIgAysDACIeoCAmIB0gHKKgEOEEQQFxBEAgHiAcQQEgGyAgIA8Q8QgLIAdBAWohByAGKAJwIQ0MAQsLIAFBAmshDQNAAkAgBigCYCEBIA1Bf0YNACABIA1BBnRqIgMrAyghIiADKwM4RBgtRFT7IQlAoCIdEFchHiADKwMIISAgHRBKIRsgAysDICEcIAMtADAgDyAbICKiIAMrAwAiG6AgICAeICKioBDhBEEBcQRAIBsgIkEAIBxEGC1EVPshCUCgIB0gDxDxCAsgDUEBayENDAELCyABEBggBkGwAWokAAUgByADQQFqIgFBACABIA1HG0EGdGoiBCsDCCAHIANBBnQiBWoiCSsDCCImoSAEKwMAIAkrAwAiHqEQ8AghGyAHIAMgDSADG0EGdGoiBEE4aysDACAmoSAEQUBqKwMAIB6hEPAIIScgCSsDECIiICQgJSAOER8AIRwCQAJ/AkACfCADBEAgAyAGKAJwQQFrRw0CICdEGC1EVPsh+b+gDAELIBtEGC1EVPsh+T+gCyEdQQAMAQsgG0QYLURU+yH5P6AhHUQAAAAAAAAAACAcIBsgJ6EiG0QYLURU+yEZQKAgGyAbRAAAAAAAAAAAYxtEAAAAAAAA4L+iRBgtRFT7Ifk/oCIgEEoiG6MgG0QAAAAAAAAAAGEbIhsgHEQAAAAAAAAkQKJkBEAgJ0QYLURU+yH5v6AiG0QAAAAAAAAAAGMgG0QYLURU+yEZQGZyBEAgGyAbRBgtRFT7IRlAo5xEGC1EVPshGUCioSEbC0EBIQ0gHUQAAAAAAAAAAGMgHUQYLURU+yEZQGZyRQ0CIB0gHUQYLURU+yEZQKOcRBgtRFT7IRlAoqEhHQwCCyAdICCgIR0gGyEcQQALIQ0gHSEbCyAGKAJgIgcgBWoiAyAdOQM4IAMgDToAMCADIBw5AyggAyAbOQMgIANB7AA6ABggAyAiOQMQIAMgJjkDCCADIB45AwAgBigCcCENDAELCyACKAKgDiIBQQBIDQEgACACKAKkDiABQQEQSCACKAKkDhAYIAAgERBJIBEgDEGF9QAgEhsiAUcEQCAAIAEQXQsgAigCyBQiAwRAIAIgAkHYFGopAwA3A2AgAiACKQPQFDcDWCACIAIoAsAUIgEpAwg3A1AgAiABKQMANwNIIABBAiACQdgAaiACQcgAaiAoICUgAxDqAgsgAigCzBQiA0UNAyACQUBrIAJB6BRqKQMANwMAIAIgAikD4BQ3AzggAiACKALAFCACKALEFEEEdGpBEGsiASkDCDcDMCACIAEpAwA3AyggAEEDIAJBOGogAkEoaiAoICUgAxDqAgwDCyABKAIQIQMgCEUNASAIuEQAAAAAAAAAQKBEAAAAAAAA4L+iIR9BACEMIAMoAggoAgQiFUEwED8hBiAVQTAQPyEPA0AgDCAVRgRAIAkQZCIIIQMgCSIFIRADQCADQfviARCxBSIDBEACQCADQYX1ACADLQAAGyIEIAlGDQAgBCEJIAEoAhAtAHRBA3ENACAAIAQQSSAAIAQQXQtBACEMA0AgDCAVRgRAIBAgBCAWGyEQIAQgBSAWQQJJGyEFIBZBAWohFkEAIQMMAwsgDyAMQTBsIgdqIgMoAgQhEiAGIAdqKAIAIQ0gAygCACEOQQAhAwNAIAMgEkYEQCAAIA4gEkEAEPABIAxBAWohDAwCBSAOIANBBHQiB2oiESAHIA1qIgcrAwAgESsDAKA5AwAgESAHKwMIIBErAwigOQMIIANBAWohAwwBCwALAAsACwsCQCACKALIFCIDRQRAQQAhBQwBCwJAIAVFDQAgASgCEC0AdEEDcQ0AIAAgBRBJIAAgBRBdIAIoAsgUIQMLIAIgAkHYFGopAwA3A6ABIAIgAikD0BQ3A5gBIAIgAigCwBQiBCkDCDcDkAEgAiAEKQMANwOIASAAQQIgAkGYAWogAkGIAWogKCAlIAMQ6gILIAIoAswUIgMEQAJAIAUgEEYNACABKAIQLQB0QQNxDQAgACAQEEkgACAQEF0gAigCzBQhAwsgAiACQegUaikDADcDgAEgAiACKQPgFDcDeCACIAIoAsAUIAIoAsQUQQR0akEQayIBKQMINwNwIAIgASkDADcDaCAAQQMgAkH4AGogAkHoAGogKCAlIAMQ6gILIAgQGEEAIQMDQCADIBVGBEAgBhAYIA8QGAwGBSAGIANBMGwiAWooAgAQGCABIA9qKAIAEBggA0EBaiEDDAELAAsABSACQcAUaiAMQTBsIgMgASgCECgCCCgCAGpBMBAfGiADIAZqIgQgAigCxBQiBTYCBCADIA9qIgMgBTYCBCAEIAVBEBA/IhA2AgAgAyACKALEFEEQED8iCjYCACACKALEFEEBayEHIAIoAsAUIhErAwghHiARKwMAISBBACEDA0AgAyAHSQRAIBEgA0EBakEEdCIIaiIEKwMIISMgBCsDACEpAkAgA0UEQCAQRAAAAAAAAABAICAgKaEiHSAdoiAeICOhIhwgHKKgRC1DHOviNho/oJ+jIhsgHZqiOQMIIBAgHCAbojkDAAwBCyAQIANBBHRqIgREAAAAAAAAAEAgJiApoSIdIB2iICcgI6EiHCAcoqBELUMc6+I2Gj+gn6MiGyAdmqI5AwggBCAcIBuiOQMACyARIANBA2oiBEEEdGoiBSsDCCEcIAUrAwAhGyAQIANBAmpBBHQiDWoiEkQAAAAAAAAAQCApIA0gEWoiBSsDACImoSIhICMgBSsDCCInoSIkEEciHUQtQxzr4jYaP2MEfCAgIBuhIiEgIaIgHiAcoSIkICSioEQtQxzr4jYaP6CfBSAdC6MiHSAhmqIiIjkDCCASIB0gJKIiHTkDACAIIBBqIg4gEikDCDcDCCAOIBIpAwA3AwAgCiADQQR0IgNqIgUgHyADIBBqIgMrAwCiICCgOQMAIAUgHyADKwMIoiAeoDkDCCAIIApqIgMgHyAOKwMAoiApoDkDACADIB8gDisDCKIgI6A5AwggCiANaiIDIB8gIqIgJ6A5AwggAyAfIB2iICagOQMAIBshICAcIR4gBCEDDAELCyAQIANBBHQiBGoiA0QAAAAAAAAAQCAmICChIhwgHKIgJyAeoSIdIB2ioEQtQxzr4jYaP6CfoyIbIByaoiIcOQMIIAMgHSAboiIbOQMAIAQgCmoiAyAfIByiIB6gOQMIIAMgHyAboiAgoDkDACAMQQFqIQwMAQsACwALQZ/LAUGEuQFB/BJB2TEQAAALIAMtAHRBA3FFBEACQCAJLQAABEAgACAJEEkMAQsgAEGF9QAQSSAMQYX1ACAMLQAAGyEMCyAAIAwQXQsgAUEoaiERIAJB4BRqIRAgAkHQFGohFSACQcgVaiEYIAJBqAhqIQYgAkGYCGohEyACQbgOaiESICVEAAAAAAAAIECiRAAAAAAAAChAECMhHQNAIBkgASgCECgCCCIDKAIETw0BIAJBwBRqIAMoAgAgGUEwbGpBMBAfGkEAIQhBACELIBFBUEEAIAEoAgBBA3FBAkcbaigCABAtQb4uECciAwRAIANBvt4AED4hCwsgDSEDAkAgF0UNAANAIAMoAgAiBEEARyEIIARFDQEgA0EEaiEDIARB2a4BED5FDQALC0QAAAAAAAAAACEbAkAgAUGoJhAnIgNFDQAgAy0AAEUNACADEK4CIhtEAAAAAAAAAABkIQgLAkACQAJAAkAgCCALcUEBRw0AIB0gGyAbRAAAAAAAAAAAYRsgGyAIGyIfRAAAAAAAAAAAZEUNAEEAIQQgAkGgDmoiA0EAQeAAEDgaIAMgAigCxBRByAAQ/AEgAigCxBQhDiACKALAFCEKA0AgBCAORwRAIAogBEEEdGohByAEIQUDQAJAIAVFBEBBfyEFDAELIAogBUEBayIFQQR0aiIDKwMAIAcrAwChIAMrAwggBysDCKEQR0R7FK5H4XqEP2RFDQELCyAEIQgCQANAIAhBAWoiCCAOTw0BIAogCEEEdGoiAysDACAHKwMAIiGhIikgAysDCCAHKwMIIiOhIiYQRyInRHsUrkfheoQ/ZEUNAAsgBUF/Rg0AQQAhAyApmSIeRJqZmZmZmbk/YyAmmSIgRJqZmZmZmbk/ZHEgIyAKIAVBBHRqIgUrAwihIiSZIhxEmpmZmZmZuT9jICEgBSsDAKEiIpkiG0SamZmZmZm5P2RxcSIIIBtEmpmZmZmZuT9jICBEmpmZmZmZuT9jcSAcRJqZmZmZmbk/ZHEgHkSamZmZmZm5P2RxckUNAANAIAIoAqgOIANLBEAgAiACQagOaikDADcDqAQgAiACKQOgDjcDoAQgAigCoA4hByACQaAEaiADEBkhBSADQQFqIQMgISAKIAcgBUHIAGxqKAIAQQR0aiIFKwMAoSAjIAUrAwihEEdEexSuR+F6hD9jRQ0BDAILCyASQQBByAAQOCEFIAJBoA5qQcgAECYhAyACKAKgDiADQcgAbGogBUHIABAfGiACIAJBqA5qIgMpAwA3A7gEIAIgAikDoA43A7AEIAIoAqAOIAJBsARqIAMoAgBBAWsQGUHIAGxqIgUgBDYCACAFICYgJ6MiICAfoiAjoDkDICAFICkgJ6MiHCAfoiAhoDkDGCAFICMgJCAiICQQRyIboyIeIB+ioTkDECAFICEgIiAboyIbIB+ioTkDCCAIBEAgIEQAAAAAAAAAAGMiA0UgG0QAAAAAAAAAAGRFckUEQCAFQpjakKK1v8j8PzcDQCAFQgA3AzggBSAjIB+hOQMwIAUgISAfoTkDKAwCCyAgRAAAAAAAAAAAZEUgG0QAAAAAAAAAAGRFckUEQCAFQgA3A0AgBUKY2pCitb/I/L9/NwM4IAUgHyAjoDkDMCAFICEgH6E5AygMAgsgBSAfICGgOQMoIANFIBtEAAAAAAAAAABjRXJFBEAgBUKY2pCitb/IhMAANwNAIAVCmNqQorW/yPw/NwM4IAUgIyAfoTkDMAwCCyAFQtLDzPnHr7aJwAA3A0AgBUKY2pCitb/IhMAANwM4IAUgHyAjoDkDMAwBCyAcRAAAAAAAAAAAZCIDRSAeRAAAAAAAAAAAY0VyRQRAIAVC0sPM+cevtonAADcDQCAFQpjakKK1v8iEwAA3AzggBSAfICOgOQMwIAUgHyAhoDkDKAwBCyAcRAAAAAAAAAAAY0UgHkQAAAAAAAAAAGNFckUEQCAFQpjakKK1v8iMwAA3A0AgBULSw8z5x6+2icAANwM4IAUgHyAjoDkDMCAFICEgH6E5AygMAQsgIyAfoSEbIANFIB5EAAAAAAAAAABkRXJFBEAgBUKY2pCitb/IhMAANwNAIAVCmNqQorW/yPw/NwM4IAUgGzkDMCAFIB8gIaA5AygMAQsgBUKY2pCitb/I/D83A0AgBUIANwM4IAUgGzkDMCAFICEgH6E5AygLIARBAWohBAwBCwsgAigCqA5FDQEgAkGgDmpBnAJByAAQogMgAkGIFWoiDyACKALAFCIDKQMINwMAIAIgAykDADcDgBVBACEMQQAhBUEAIRQDQCACKAKoDiIDIBRJBEADQCADIAxNDQUgAiACQagOaikDADcDiAMgAiACKQOgDjcDgAMgAkGACGogAigCoA4gAkGAA2ogDBAZQcgAbGpByAAQHxogAiAGKQMINwP4AiACIAYpAwA3A/ACAkAgAkHwAmogHyAfIAIrA7gIIAIrA8AIEPQIIghFDQAgCCgCBCIDQQVJDQAgA0EGa0EAIANBB2tBfUkbIgVBAk8EQEEAIQMgAkGwFWoiBEEAQSgQOBogBCAFQRAQ/AEDQCADIAVGBEACQCAJBEAgCSIDLQAADQELQYX1ACEDCyAAIAMQSSACIAJBuBVqIgcpAwA3A+gCIAIgAikDsBU3A+ACQQAhAyAAIAIoArAVIAJB4AJqQQAQGUEEdGogBRA9A0AgAigCuBUgA0sEQCACIAcpAwA3A9gCIAIgAikDsBU3A9ACIAJB0AJqIAMQGSEEAkACQCACKALAFSIFDgIBEgALIAIgAigCsBUgBEEEdGoiBCkDCDcDyAIgAiAEKQMANwPAAiACQcACaiAFEQEACyADQQFqIQMMAQsLIAJBsBVqIgNBEBAxIAMQNAUgGCAIKAIAIANBBHRqIgQpAzg3AwggGCAEKQMwNwMAIAJBsBVqQRAQJiEEIAIoArAVIARBBHRqIgQgGCkDADcDACAEIBgpAwg3AwggA0EBaiEDDAELCwsgCCgCABAYIAgQGAsgDEEBaiEMIAIoAqgOIQMMAAsABSACQbgVaiIOAn8gAyAUSwRAIAIgAkGoDmoiAykDADcDmAQgAiACKQOgDjcDkAQgAigCoA4gAkGQBGogFBAZQcgAbGooAgAhFiACIAMpAwA3A4gEIAIgAikDoA43A4AEIAIoAqAOIAJBgARqIBQQGUHIAGxqQQhqDAELIAIoAsAUIAIoAsQUQQFrIhZBBHRqCyIDKQMINwMAIAIgAykDADcDsBUgAkGQCGpCADcDACACQYgIaiILQgA3AwAgAkIANwOACCATIA8pAwA3AwggEyACKQOAFTcDACACQYAIakEQECYhAyACKAKACCADQQR0aiIDIBMpAwA3AwAgAyATKQMINwMIIAUhBANAIBYgBEEBaiIESwRAQQAhAyACKALAFCEIA0AgAigCqA4gA0sEQCACIAJBqA5qKQMANwOYAyACIAIpA6AONwOQAyAIIAIoAqAOIAJBkANqIAMQGUHIAGxqKAIAQQR0aiEKIANBAWohAyACKALAFCIHIQggByAEQQR0aiIHKwMAIAorAwChIAcrAwggCisDCKEQR0R7FK5H4XqEP2NFDQEMAwsLIBMgCCAEQQR0aiIDKQMANwMAIBMgAykDCDcDCCACQYAIakEQECYhAyACKAKACCADQQR0aiIDIBMpAwA3AwAgAyATKQMINwMIDAELCyATIAIpA7AVNwMAIBMgDikDADcDCCACQYAIakEQECYhAyACKAKACCADQQR0aiIDIBMpAwA3AwAgAyATKQMINwMIIAIgCykDADcD+AMgAiACKQOACDcD8ANBACEDIAAgAigCgAggAkHwA2pBABAZQQR0aiALKAIAED0CQANAAkAgAigCiAggA00EQCACQYAIaiIDQRAQMSADEDQgFCACKAKoDk8NAyACIAJBqA5qIgopAwA3A+gDIAIgAikDoA43A+ADIAIoAqAOIAJB4ANqIBQQGUHIAGxqKAIAIQUDQEEAIQMgBUEBaiIFIAIoAsQUTw0CA0AgAyACKAKoDk8NAyACIAopAwA3A8gDIAIgAikDoA43A8ADIAIoAsAUIQ4gAigCoA4hCCACQcADaiADEBkhBCADQQFqIQMgAigCwBQgBUEEdGoiBysDACAOIAggBEHIAGxqKAIAQQR0aiIEKwMAoSAHKwMIIAQrAwihEEdEexSuR+F6hD9jRQ0ACwwACwALIAIgCykDADcDuAMgAiACKQOACDcDsAMgAkGwA2ogAxAZIQQCQAJAIAIoApAIIgcOAgEOAAsgAiACKAKACCAEQQR0aiIEKQMINwOoAyACIAQpAwA3A6ADIAJBoANqIAcRAQALIANBAWohAwwBCwsgAiAKKQMANwPYAyACIAIpA6AONwPQAyAPIAIoAqAOIAJB0ANqIBQQGUHIAGxqIgMpAyA3AwAgAiADKQMYNwOAFQsgFEEBaiEUDAELAAsACyAAIAIoAsAUIAIoAsQUQQAQ8AEMAgsgACACKALAFCACKALEFEEAEPABC0EAIQMDQCACKAKoDiADTQRAIAJBoA5qIgNByAAQMSADEDQFIAIgAkGoDmopAwA3A/gBIAIgAikDoA43A/ABIAJB8AFqIAMQGSEHAkACQCACKAKwDiIFDgIBCAALIAJBqAFqIgQgAigCoA4gB0HIAGxqQcgAEB8aIAQgBREBAAsgA0EBaiEDDAELCwsgAigCyBQiBARAIAIgFSkDCDcDuAIgAiAVKQMANwOwAiACIAIoAsAUIgMpAwg3A6gCIAIgAykDADcDoAIgAEECIAJBsAJqIAJBoAJqICggJSAEEOoCCyACKALMFCIEBEAgAiAQKQMINwOYAiACIBApAwA3A5ACIAIgAigCwBQgAigCxBRBBHRqQRBrIgMpAwg3A4gCIAIgAykDADcDgAIgAEEDIAJBkAJqIAJBgAJqICggJSAEEOoCCwJAIBdFIAEoAhAoAggoAgRBAklyDQAgAigCyBQgAigCzBRyRQ0AIAAgDRDlAQsgGUEBaiEZDAALAAsgAkHoB2oQXCAAKAIQIgcoAgghCQJAIAcoAtgBRQRAIActAIwCQQFxRQ0BCyAAEJcCIAcoApwCIgtFDQAgBygCoAIiBCgCACEIQQEhBQNAIAUgC08NASAHIAQgBUECdCIBaigCADYClAIgByAHKAKkAiAIQQR0ajYCmAIgACAHKALYASAHKALsASAHKAL8ASAHKALcARDEASAAEJcCIAVBAWohBSABIAcoAqACIgRqKAIAIAhqIQggBygCnAIhCwwACwALIAdCADcClAIgACAJKAIQIgMoAggiAQR/IAcoAuQBIQMgBy8BjAIhBCACIAEoAgAiAUEQaiABKAIAIAEoAggbIgEpAwg3AyAgAiABKQMANwMYIAAgAkEYaiAEQYABcUEHdiADIARBAnFBAXYQ4QggBygC6AEhAyAHLwGMAiEEIAIgCSgCECgCCCIBKAIAIAEoAgRBMGxqIgEgAUEwaygCACABQSxrKAIAQQR0aiABQSRrKAIAG0EQayIBKQMINwMQIAIgASkDADcDCCAAIAJBCGogBEGAAnFBCHYgAyAEQQRxQQJ2EOEIIAkoAhAFIAMLKAJgQQsgBy8BjAJBA3ZBAXEgBygC4AEgBygC8AEgBygCgAIgBygC3AEgCUHw3AooAgBB+pMBEHoQaAR/IAkoAhAoAggFQQALENoEIAAgCSgCECgCbEELIAcvAYwCQQN2QQFxIAcoAuABIAcoAvABIAcoAoACIAcoAtwBIAlB8NwKKAIAQfqTARB6EGgEfyAJKAIQKAIIBUEACxDaBCAAIAkoAhAoAmRBByAHLwGMAkECdkEBcSAHKALoASAHKAL4ASAHKAKIAiAHKALcAUEAENoEIAAgCSgCECgCaEEGIAcvAYwCQQF2QQFxIAcoAuQBIAcoAvQBIAcoAoQCIAcoAtwBQQAQ2gQCQCAAKAI8IgFFDQAgASgCRCIBRQ0AIAAgAREBAAsgABCMBCAaEOwCIBoQGBAYCyACQeAVaiQADwtBsIMEQcIAQQFBiPYIKAIAEDoaEDsAC84GAQJ/IwBBgAJrIgMkACADQdABaiIEQYi/CEEwEB8aIAFCADcCAAJAAkACQAJAIAAgBBDeBA0AIAMoAtgBQQJJDQAgAyADKQPYATcDyAEgAyADKQPQATcDwAEgAygC0AEgA0HAAWpBABAZQRhsaigCAA0BC0EAIQBBACEBA0AgASADKALYAU8NAiADIAMpA9gBNwMgIAMgAykD0AE3AxggA0EYaiABEBkhAgJAAkAgAygC4AEiBA4CAQUACyADIAMoAtABIAJBGGxqIgIpAwg3AwggAyACKQMQNwMQIAMgAikDADcDACADIAQRAQALIAFBAWohAQwACwALIAMoAtgBQQNPBEBB95gEQQAQKgsgAyADKQPYATcDuAEgAyADKQPQATcDsAEgASADKALQASADQbABakEAEBlBGGxqKAIAEGQ2AgAgAyADKQPYATcDqAEgAyADKQPQATcDoAEgAygC0AEgA0GgAWpBARAZQRhsaigCAARAIAMgAykD2AE3A5gBIAMgAykD0AE3A5ABIAEgAygC0AEgA0GQAWpBARAZQRhsaigCABBkNgIECyADIAMpA9gBNwOIASADIAMpA9ABNwOAASADKALQASEBIANBgAFqQQAQGSEEIAMoAtABIQAgAgJ8IAEgBEEYbGotABBBAUYEQCADIAMpA9gBNwNYIAMgAykD0AE3A1AgACADQdAAakEAEBlBGGxqKwMIDAELIAMgAykD2AE3A3ggAyADKQPQATcDcEQAAAAAAAAAACAAIANB8ABqQQEQGUEYbGotABBBAUcNABogAyADKQPYATcDaCADIAMpA9ABNwNgRAAAAAAAAPA/IAMoAtABIANB4ABqQQEQGUEYbGorAwihCzkDAEEAIQFBASEAA0AgASADKALYAU8NASADIAMpA9gBNwNIIAMgAykD0AE3A0AgA0FAayABEBkhAgJAAkAgAygC4AEiBA4CAQQACyADIAMoAtABIAJBGGxqIgIpAwg3AzAgAyACKQMQNwM4IAMgAikDADcDKCADQShqIAQRAQALIAFBAWohAQwACwALIANB0AFqIgFBGBAxIAEQNCADQYACaiQAIAAPC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALrwEBAX8gACgCECIBRQRAQaT1AEGEuQFBiAFB0pEBEAAACyABKALcARAYIAEoAtgBEBggASgC4AEQGCABKALkARAYIAEoAugBEBggASgC7AEQGCABKALwARAYIAEoAvQBEBggASgC+AEQGCABKAL8ARAYIAEoAoACEBggASgChAIQGCABKAKIAhAYIAEoApgCEBggASgCpAIQGCABKAKgAhAYIAAgASgCADYCECABEBgLngEBAn9BuAIQxgMiASAAKAIQIgI2AgAgACABNgIQIAIEQCABQRBqIAJBEGpBKBAfGiABQThqIAJBOGpBKBAfGiABIAIoApgBNgKYASABIAIoApwBNgKcASABIAIrA6ABOQOgASABIAIoAogBNgKIASABQeAAaiACQeAAakEoEB8aIAEPCyABQoCAgICAgID4PzcDoAEgAUIDNwOYASABC6AGAQV/IwBBMGsiAyQAA0BBgOAKKAIAIAJNBEACQEH43wpBEBAxQZDgCiAAKAIAIgQpAwA3AwBBmOAKIAQpAwg3AwBB+N8KQRAQJiECQfjfCigCACACQQR0aiICQZDgCikDADcDACACQZjgCikDADcDCEGQ4AogBCkDADcDAEGY4AogBCkDCDcDAEH43wpBEBAmIQJB+N8KKAIAIAJBBHRqIgJBkOAKKQMANwMAIAJBmOAKKQMANwMIQQIgACgCBCIAIABBAk0bQQFrIQZBASECA0AgAiAGRg0BQZDgCiAEIAJBBHRqIgApAwA3AwBBmOAKIAApAwg3AwBB+N8KQRAQJiEFQfjfCigCACAFQQR0aiIFQZDgCikDADcDACAFQZjgCikDADcDCEGQ4AogACkDADcDAEGY4AogACkDCDcDAEH43wpBEBAmIQVB+N8KKAIAIAVBBHRqIgVBkOAKKQMANwMAIAVBmOAKKQMANwMIQZDgCiAAKQMANwMAQZjgCiAAKQMINwMAQfjfCkEQECYhAEH43wooAgAgAEEEdGoiAEGQ4AopAwA3AwAgAEGY4AopAwA3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qgIgA0EAOgAHIAIgBGogA0EHahDSASADQRBqJAAMAQsQygEACyAFQRBqJAALFwAgACADNgIQIAAgAjYCDCAAIAE2AggLDQAgACABIAJBARCiBwsSACAAIAEgAkL/////DxCwBacLzAEBA38jAEEgayIDQgA3AxggA0IANwMQIANCADcDCCADQgA3AwAgAS0AACICRQRAQQAPCyABLQABRQRAIAAhAQNAIAEiA0EBaiEBIAMtAAAgAkYNAAsgAyAAaw8LA0AgAyACQQN2QRxxaiIEIAQoAgBBASACdHI2AgAgAS0AASECIAFBAWohASACDQALAkAgACIBLQAAIgJFDQADQCADIAJBA3ZBHHFqKAIAIAJ2QQFxRQ0BIAEtAAEhAiABQQFqIQEgAg0ACwsgASAAawuAAQEEfyAAIABBPRC0BSIBRgRAQQAPCwJAIAAgASAAayIEai0AAA0AQYiBCygCACIBRQ0AIAEoAgAiAkUNAANAAkAgACACIAQQ6gFFBEAgASgCACAEaiICLQAAQT1GDQELIAEoAgQhAiABQQRqIQEgAg0BDAILCyACQQFqIQMLIAMLTgEBf0EBQRwQGiIGIAU6ABQgBiAAIAEQrAE2AggCfyADBEAgACACENUCDAELIAAgAhCsAQshBSAGIAA2AhggBiAENgIQIAYgBTYCDCAGCwkAIAC9QjSIpwuZAQEDfCAAIACiIgMgAyADoqIgA0R81c9aOtnlPaJE65wriublWr6goiADIANEff6xV+Mdxz6iRNVhwRmgASq/oKJEpvgQERERgT+goCEFIAAgA6IhBCACRQRAIAQgAyAFokRJVVVVVVXFv6CiIACgDwsgACADIAFEAAAAAAAA4D+iIAQgBaKhoiABoSAERElVVVVVVcU/oqChC5IBAQN8RAAAAAAAAPA/IAAgAKIiAkQAAAAAAADgP6IiA6EiBEQAAAAAAADwPyAEoSADoSACIAIgAiACRJAVyxmgAfo+okR3UcEWbMFWv6CiRExVVVVVVaU/oKIgAiACoiIDIAOiIAIgAkTUOIi+6fqovaJExLG0vZ7uIT6gokStUpyAT36SvqCioKIgACABoqGgoAuNAQAgACAAIAAgACAAIABECff9DeE9Aj+iRIiyAXXg70k/oKJEO49otSiCpL+gokRVRIgOVcHJP6CiRH1v6wMS1tS/oKJE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EC4BmgFsrHwhEAwBCwsgAkEBaiECDAALAAtBACEAA0AgDCAAQQJ0aigCACICBEAgCCACQVBBACACKAIAQQNxQQJHG2ooAigoAhAoAvgBIgVBAnRqIgogCigCACACKAIQLgGaAWo2AgAgBSABIAEgBUgbIQEgAEEBaiEADAELCyADQQFqIQMMAQsACwALIAZBEGokACARDwsgECARfCERDAALAAuDAQECfyAAIAFBARCNASIBKAIQQQA2AsQBQQUQnwghAiABKAIQIgNBADYCzAEgAyACNgLAAUEFEJ8IIQIgASgCECIDIAI2AsgBQdz9CigCACICIAAgAhsoAhBBuAFBwAEgAhtqIAE2AgAgAyACNgK8AUHc/QogATYCACADQQA2ArgBIAELuQEBA38gACAAQTBqIgIgACgCAEEDcUEDRhsoAigoAhAiASgC4AEgASgC5AEiAUEBaiABQQJqENoBIQEgACACIAAoAgBBA3FBA0YbKAIoKAIQIAE2AuABIAAgAiAAKAIAQQNxQQNGGygCKCgCECIBIAEoAuQBIgNBAWo2AuQBIAEoAuABIANBAnRqIAA2AgAgACACIAAoAgBBA3FBA0YbKAIoKAIQIgAoAuABIAAoAuQBQQJ0akEANgIACyAAIAAgASACIABBp4cBECciAAR/IAAQkQIFQR4LEP8OC00AIAEoAhBBwAFqIQEDQCABKAIAIgEEQCABKAIQKAKYAhAYIAEoAhAoAqACEBggASgCECIBQQA2ArABIAFBuAFqIQEMAQUgABD4DgsLCz8BAn8gACgCECgCqAIhAANAIAAiASgCDCIARSAAIAFGckUEQCAAKAIMIgJFDQEgASACNgIMIAIhAAwBCwsgAQsLACAAIAFBARCFDwsLACAAIAFBABCFDwuGAQECfwJAIAAgASkDCBC/A0UNACAAEDkgAEYEQCAAIAEQbiECA0AgAgRAIAAgAiABEHIgACACEI0GIQIMAQsLIAAtABhBIHEEQCABEMcLCyAAIAEQzwcgARCzByAAQQEgASkDCBC/BgsgACABQRJBAEEAEMgDDQAgABA5IABGBEAgARAYCwsLgwEBA38jAEEgayIBJAAgACgCECICKAIMIgNBDE8EQCABQeQANgIUIAFBibwBNgIQQYj2CCgCAEHYvwQgAUEQahAgGhA7AAsgASACKAIINgII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ACAAIAEQRSIBRQ0AIAEtAABFDQAgACABIAEQdkEAR0EAIAcgAiADENsCIQEgACgCECABNgJ8IAAQLSgCECIBIAEtAHFBEHI6AHELIABBgNwKKAIAQQBBABBiIQEgACgCECICQf8BIAEgAUH/AU4bOgCgASAAIAIoAggoAgQoAgARAQALRAACQCAAECgEQCAAECRBD0YNAQsgAEEAEH8LAkAgABAoBEAgAEEAOgAPDAELIABBADYCBAsgABAoBH8gAAUgACgCAAsLlAYBBH8jAEGQAWsiASQAAkACQCAARQ0AIAAtAABFDQBB8NoKKAIAIgMEQEG+3gotAAANASABIAM2AnBB/vkEIAFB8ABqECpBvt4KQQE6AAAMAQtBwN4KKAIAIQMCQEHk2gooAgAEQCADDQEDQEHM3gooAgAgAk0EQEHE3gpBCBAxQcTeChA0QcDeCkHk2gooAgAiAjYCACABQfQAaiACEP4JQdzeCiABKAKMATYCAEHU3gogASkChAE3AgBBzN4KIAEpAnw3AgBBxN4KIAEpAnQ3AgAMAwUgAUHM3gopAgA3A0ggAUHE3gopAgA3A0AgAUFAayACEBkhAwJAAkBB1N4KKAIAIgQOAgEHAAsgAUHE3gooAgAgA0EDdGopAgA3AzggAUE4aiAEEQEACyACQQFqIQIMAQsACwALAkAgA0Ho2gooAgBGDQADQEHM3gooAgAgAk0EQEHE3gpBCBAxQcTeChA0QcDeCkHo2gooAgAiAjYCACACRQ0CIAItAABFDQIgAUH0AGogAhD+CUHc3gogASgCjAE2AgBB1N4KIAEpAoQBNwIAQczeCiABKQJ8NwIAQcTeCiABKQJ0NwIABSABQczeCikCADcDMCABQcTeCikCADcDKCABQShqIAIQGSEDAkACQEHU3gooAgAiBA4CAQcACyABQcTeCigCACADQQN0aikCADcDICABQSBqIAQRAQALIAJBAWohAgwBCwsLAkAgAC0AAEEvRg0AQczeCigCAEUNACABQdzeCigCADYCGCABQdTeCikCADcDECABQczeCikCADcDCCABQcTeCikCADcDACABIAAQ/QkhAgwCCyAAIQIMAQtBACECA0AgAkEDRwRAIAAgAkH54gFqLAAAIAAQQEEBahDkCyIDQQFqIAAgAxshACACQQFqIQIMAQsLIAFB3N4K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AUEHcXRyOgAADwtBl7IDQe/6AEHRAEHfIRAAAAtQAQF/IAEoAhAoApwBRQRAQQAPCyAAIAFBMEEAIAEoAgBBA3FBA0cbaigCKBDDDgR/IAAgAUFQQQAgASgCAEEDcUECRxtqKAIoEMMOBUEACws1AQJ/AkAgABAcIgFFBEAMAQsgARCGAiECA0AgACABEB0iAUUNASACIAEQnggaDAALAAsgAguGAwEDfyABIAFBMGoiAyABKAIAQQNxQQNGGygCKCgCECICKALQASACKALUASICQQFqIAJBAmoQ2gEhAiABIAMgASgCAEEDcUEDRhsoAigoAhAgAjYC0AEgASADIAEoAgBBA3FBA0YbKAIoKAIQIgIgAigC1AEiBEEBajYC1AEgAigC0AEgBEECdGogATYCACABIAMgASgCAEEDcUEDRhsoAigoAhAiAygC0AEgAygC1AFBAnRqQQA2AgAgASABQTBrIgMgASgCAEEDcUECRhsoAigoAhAiAigC2AEgAigC3AEiAkEBaiACQQJqENoBIQIgASADIAEoAgBBA3FBAkYbKAIoKAIQIAI2AtgBIAEgAyABKAIAQQNxQQJGGygCKCgCECICIAIoAtwBIgRBAWo2AtwBIAIoAtgBIARBAnRqIAE2AgAgASADIAEoAgBBA3FBAkYbKAIoKAIQIgEoAtgBIAEoAtwBQQJ0akEANgIAIAAoAhBBAToA8AEgABBhKAIQQQE6APABC4ABAQJ/QcABIQMgACECA0AgAigCECADaigCACICBEBBuAEhAyABIAJHDQELCyACBEAgASgCECICKAK8ASEBIAIoArgBIgIEQCACKAIQIAE2ArwBCyABIAAgARsoAhBBuAFBwAEgARtqIAI2AgAPC0GbpANBq7oBQb8BQdyfARAAAAsJAEEBIAAQ1AILYQEEfyAAKAIEIQQCQANAIAIgBEYNASACQQJ0IAJBAWohAiAAKAIAIgVqIgMoAgAgAUcNAAsgACAEQQFrIgE2AgQgAyAFIAFBAnQiAWooAgA2AgAgACgCACABakEANgIACwtDAAJAIAAQKARAIAAQJEEPRg0BCyAAEI4PCwJAIAAQKARAIABBADoADwwBCyAAQQA2AgQLIAAQKAR/IAAFIAAoAgALC3QBAn8jAEEgayICJAACQCAArSABrX5CIIhQBEAgACABEE4iA0UNASACQSBqJAAgAw8LIAIgATYCBCACIAA2AgBBiPYIKAIAQabqAyACECAaEC8ACyACIAAgAWw2AhBBiPYIKAIAQfXpAyACQRBqECAaEC8AC7cNAgh/A3wjAEHAAmsiBCQAAkAgABA5IgkgACgCAEEDcSIKQQAQ5QMiBUUNAANAIAVFDQECQCAAIAUQRSIDRQ0AIAMtAABFBEAgBSgCCEHC8AAQPkUNAQsgAUG57QQQGxogASACKAIAEEQgBSgCCCACIAEQuwIgAUGTzQMQGxoCQCACLQAFQQFHDQACQCAFKAIIIgNBwcMBED4NACADQbHDARA+DQAgA0G5wwEQPg0AIANBl8MBED4NACADQajDARA+DQAgA0GfwwEQPkUNAQsgACAFEEUiA0UNASADLQAARQ0BIANBABCQCiIIRQRAIAQgAzYCAEHK+gQgBBAqDAILIAFB7v8EEBsaIAIgAigCACIDQQFqNgIAIAEgAxBEIAFB/s0EEBsaQQAhBwNAIAgoAgAgB00EQCACIAIoAgBBAWs2AgAgAUHu/wQQGxogASACKAIAEEQgAUH+yAEQGxogCBCOCgwDCyAHBEAgAUG57QQQGxoLIAgoAgghAyACIAIoAgAiBkEBajYCACABIAYQRCABQfDYAxAbGiABIAIoAgAQRAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADIAdB0ABsaiIDKAIAIgYOEAoKAAABAQIDBAQGBwsFBQgJCyAEQdAAQfAAIAZBAkYbNgJQIAFB7+wEIARB0ABqEB4gASACKAIAEEQgASADQQhqELQIDAoLIARBwgBB4gAgBkEERhs2AmAgAUHv7AQgBEHgAGoQHiABIAIoAgAQRCABIANBCGoQtAgMCQsgAUGk7QRBABAeIAEgAigCABBEIAEgA0EIahC0CAwICyABQYztBEEAEB4gASACKAIAEEQgAysDCCELIAQgAysDEDkDmAEgBCALOQOQASABQffqBCAEQZABahAeIAEgAigCABBEIARB4wBB8gAgAygCGCIGQQFGG0HsACAGGzYCgAEgAUH87AQgBEGAAWoQHiABIAIoAgAQRCAEIAMrAyA5A3AgAUG76gQgBEHwAGoQHiABIAIoAgAQRCABQdfMAxAbGiADKAIoIAIgARC7AiABQQoQZQwHCyAEQcMAQeMAIAZBCEYbNgKgASABQe/sBCAEQaABahAeIAEgAigCABBEIAFBo+wEQQAQHiABIAIoAgAQRCABQfDMAxAbGiADKAIIIAIgARC7AiABQQoQZQwGCyAEQcMAQeMAIAZBDUYbNgKQAiABQe/sBCAEQZACahAeIAEgAigCABBEAkACQAJAIAMoAggOAgABAgsgAUGj7ARBABAeIAEgAigCABBEIAFB8MwDEBsaIAMoAhAgAiABELsCIAFBChBlDAcLIAFB/esEQQAQHiABIAIoAgAQRCABIAIoAgAQRCADKwMQIQsgBCADKwMYOQOIAiAEIAs5A4ACIAFBo+sEIARBgAJqEB4gASACKAIAEEQgAysDICELIAQgAysDKDkD+AEgBCALOQPwASABQY3rBCAEQfABahAeIAEgAigCABBEIAEgAygCMCADKAI0IAIQkA8MBgsgAUGQ7ARBABAeIAEgAigCABBEIAEgAigCABBEIAMrAxAhCyADKwMYIQwgBCADKwMgOQPgASAEIAw5A9gBIAQgCzkD0AEgAUHV6wQgBEHQAWoQHiABIAIoAgAQRCADKwMoIQsgAysDMCEMIAQgAysDODkDwAEgBCAMOQO4ASAEIAs5A7ABIAFBuesEIARBsAFqEB4gASACKAIAEEQgASADKAJAIAMoAkQgAhCQDwwFCyABQbDtBEEAEB4gASACKAIAEEQgBCADKwMIOQOgAiABQczqBCAEQaACahAeIAEgAigCABBEIAFBjc0DEBsaIAMoAhAgAiABELsCIAFBChBlDAQLIAFBmO0EQQAQHiABIAIoAgAQRCABQYPNAxAbGiADKAIIIAIgARC7AiABQQoQZQwDCyABQfHrBEEAEB4gASACKAIAEEQgBCADKAIINgKwAiABQe7HBCAEQbACahAeDAILIARBsgI2AhQgBEGFuwE2AhBBiPYIKAIAQdi/BCAEQRBqECAaEDsACyAEQeUAQcUAIAYbNgJAIAFB7+wEIARBQGsQHiABIAIoAgAQRCADKwMIIQsgAysDECEMIAMrAxghDSAEIAMrAyA5AzggBCANOQMwIAQgDDkDKCAEIAs5AyAgAUHJygQgBEEgahAeCyACIAIoAgBBAWsiAzYCACABIAMQRCABQa8IEBsaIAdBAWohBwwACwALIAAgBRBFIAIgARC7AgsgCSAKIAUQ5QMhBQwACwALIARBwAJqJAAL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IAM2AgAgAUEgakG4MiABEIQBA0AgAi0AACACQQFqIQINAAtBuqADIQMMAQUgAUEgakEpEH8LCwsgAEGsywMgAUEgahDCARDAAwwACwALIAFBIGoQXCABQTBqJAALaQECfyMAQRBrIgMkACADQgA3AwggA0IANwMAA0ACQCACLQAAIgRB3ABHBEAgBA0BIAAgASADEMIBEHEgAxBcIANBEGokAA8LIANB3AAQfyACLQAAIQQLIAMgBMAQfyACQQFqIQIMAAsAC5ICAQV/IAAQhwUhAyAAECQhAQJAAkACQANAIAEiAkUNASADIAFBAWsiAWotAABBLkcNAAsgABAkIQEDQCABQQFrIQUgASACRwRAIAMgBWotAABBMEcNAgsCQCAAECgEQCAALQAPIgRFDQQgACAEQQFrOgAPDAELIAAgACgCBEEBazYCBAsgASACRyAFIQENAAsgABAkIgFBAkkNACABIANqIgFBAmsiAi0AAEEtRw0AIAFBAWstAABBMEcNACACQTA6AAAgABAoBEAgAC0ADyIBRQ0DIAAgAUEBazoADw8LIAAgACgCBEEBazYCBAsPC0HijwNBoPwAQZIDQegqEAAAC0HijwNBoPwAQagDQegqEAAAC8cBAQN/IwBBEGsiAiQAIAFBUEEAIAEoAgBBA3FBAkcbaiIBQVBBACABKAIAQQNxIgNBAkcbaigCKCEEIAFBMEEAIANBA0cbaigCKCEDIAIgASkDCDcDCCACIAEpAwA3AwACQCAAIAMgBCACENkCRQ0AIAAQOSAARgRAIAAtABhBIHEEQCABEMcLCyAAIAEQzwcgARCzByAAQQIgASkDCBC/BgsgACABQQ9BAEEAEMgDDQAgABA5IABGBEAgARAYCwsgAkEQaiQACxoAIAAgARCsASIBIAIQwQMgACABQQAQjAEaC0UAIAAgAUG+zgMgAisDAEQAAAAAAABSQKMQjQMgACABQb7OAyADIAIrAwgiA6EgA0G42wotAAAbRAAAAAAAAFJAoxCNAwt9AQN/IwBBMGsiAiQAIAAQISEDIAAQLSEEAkACQCADBEBBfyEAIAQgASADEJIGQX9HDQEMAgsgAiAAKQMINwMAIAJBEGoiA0EeQdTPASACELQBGkF/IQAgASADIAQoAkwoAgQoAgQRAABBf0YNAQtBACEACyACQTBqJAAgAAvN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ABCPATYCuAJBAEHk2wooAgBEAAAAAAAALEBEAAAAAAAA8D8QTCEOIABBnKAKNgLIAiAAIA45A8ACIAAgARAhNgK0ASAAKAKoAhAYIABBADYCqAIgACgCrAIQGCAAQQA2AqwCIAAoArQCEBggAEEANgK0AgJAAkAgAUGqKRAnIgUEQCAAIAFB/doAECciAkG8zgMgAhs2AqACIAAgAUHw2gAQJyICQbqgAyACGyIENgKkAiAAKAKgAiICIAQQyQIgAmoiAkEAIAItAAAbIgIEQCADIAIsAAA2AtACQYLkBCADQdACahAqIABB8f8ENgKkAgsgACAFEGQ2AqgCIANCADcD0AQgA0IANwPIBCADQgA3A8AEIANBwARqQQQQJiECIAMoAsAEIAJBAnRqIAMoAtQENgIAIAAoAqgCIQIDQCACIAAoAqACELEFIgIEQCADIAI2AtQEIANBwARqQQQQJiECIAMoAsAEIAJBAnRqIAMoAtQENgIAQQAhAgwBCwsgAygCyAQiAkEBayIFQQBIDQIgAkECTwRAIANBADYC1AQgA0HABGoiBEEEECYhAiADKALABCACQQJ0aiADKALUBDYCACAEIABBrAJqQQBBBBDHAQtBACECA0AgAygCyAQgAksEQCADIAMpA8gENwO4AiADIAMpA8AENwOwAiADQbACaiACEBkhCQJAAkACQCADKALQBCIEDgICAAELIAMoAsAEIAlBAnRqKAIAEBgMAQsgAygCwAQgCUECdGooAgAgBBEBAAsgAkEBaiECDAELCyADQcAEaiICQQQQMSACEDQgACAFNgKwAiABQZEkECciBUUNASAFLQAARQ0BQQAhBiAAKAKwAkECakEEED8hB0EBIQIDQCAAKAKwAiIEIAJOBEAgACACIAQgBRDfCARAIAcgBkEBaiIGQQJ0aiACNgIACyACQQFqIQIMAQsLAkAgBgRAIAcgBjYCACAHIAZBAnRqIARBAWo2AgQMAQsgAyAFNgLAAkHA5QQgA0HAAmoQKiAHEBhBACEHCyAAIAc2ArQCDAELIABBATYCsAILQQEQ2gIgA0GoBGohDCADQcgEaiENQYC/CCgCACEIIAAgACgCmAEiAjYCnAEDQAJAAkACQCACBEACfyAAKAI8IgRFBEBBACEGQQAMAQsgBCgCDCEGIAQoAggLIQQgAiAGNgIYIAIg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/////////w+DhCICQoGAgICAgICACFoEQCAAQgF8IQAMAQsgAkKAgICAgICAgAhSDQAgAEIBgyAAfCEACyAAQoCAgICAgIAIhSAAIABC/////////wdWIgQbIQAgBK0LIQIgBUEgaiQAIAFCgICAgICAgICAf4MgAkI0hoQgAIS/C4kCAAJAIAAEfyABQf8ATQ0BAkBBxIMLKAIAKAIARQRAIAFBgH9xQYC/A0YNAwwBCyABQf8PTQRAIAAgAUE/cUGAAXI6AAEgACABQQZ2QcABcjoAAEECDwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCABGtB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LC0H8gAtBGTYCAEF/BUEBCw8LIAAgAToAAEEBC8ICAQR/IwBB0AFrIgUkACAFIAI2AswBIAVBoAFqIgJBAEEoEDgaIAUgBSgCzAE2AsgBAkBBACABIAVByAFqIAVB0ABqIAIgAyAEENELQQBIBEBBfyEEDAELIAAoAkxBAEggACAAKAIAIghBX3E2AgACfwJAAkAgACgCMEUEQCAAQdAANgIwIABBADYCHCAAQgA3AxAgACgCLCEGIAAgBTYCLAwBCyAAKAIQDQELQX8gABCmBw0BGgsgACABIAVByAFqIAVB0ABqIAVBoAFqIAMgBBDRCwshAiAGBEAgAEEAQQAgACgCJBEDABogAEEANgIwIAAgBjYCLCAAQQA2AhwgACgCFCEBIABCADcDECACQX8gARshAgsgACAAKAIAIgAgCEEgcXI2AgBBfyACIABBIHEbIQQNAAsgBUHQAWokACAECxIAIAAgAUEKQoCAgIAIELAFpwthAAJAIAANACACKAIAIgANAEEADwsgACABEKoEIABqIgAtAABFBEAgAkEANgIAQQAPCyAAIAEQyQIgAGoiAS0AAARAIAIgAUEBajYCACABQQA6AAAgAA8LIAJBADYCACAAC38CAn8CfiMAQaABayIEJAAgBCABNgI8IAQgATYCFCAEQX82AhggBEEQaiIFQgAQjwIgBCAFIANBARDYCyAE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IABCADcCBCAAIAAoAiwiATYCHCAAIAE2AhQgACABIAAoAjBqNgIQQQALlAMCA34CfwJAIAC9IgJCNIinQf8PcSIEQf8PRw0AIABEAAAAAACAVkCiIgAgAKMPCyACQgGGIgFCgICAgICAwNaAf1gEQCAARAAAAAAAAAAAoiAAIAFCgICAgICAwNaAf1EbDwsCfiAERQRAQQAhBCACQgyGIgFCAFkEQANAIARBAWshBCABQgGGIgFCAFkNAAsLIAJBASAEa62GDAELIAJC/////////weDQoCAgICAgIAIhAshASAEQYUISgRAA0ACQCABQoCAgICAgKALfSIDQgBTDQAgAyIBQgBSDQAgAEQAAAAAAAAAAKIPCyABQgGGIQEgBEEBayIEQYUISg0AC0GFCCEECwJAIAFCgICAgICAoAt9IgNCAFMNACADIgFCAFINACAARAAAAAAAAAAAog8LIAFC/////////wdYBEADQCAEQQFrIQQgAUKAgICAgICABFQgAUIBhiEBDQALCyACQoCAgICAgICAgH+DIAFCgICAgICAgAh9IAStQjSGhCABQQEgBGutiCAEQQBKG4S/C+ICAQV/AkACQAJAIAIoAkxBAE4EQCABQQJIDQEMAgtBASEGIAFBAUoNAQsgAiACKAJIIgJBAWsgAnI2AkggAUEBRw0BIABBADoAACAADwsgAUEBayEEIAAhAQJAA0ACQAJAAkAgAigCBCIDIAIoAggiBUYNAAJ/IANBCiAFIANrEPoCIgcEQCAHIAIoAgQiA2tBAWoMAQsgAigCCCACKAIEIgNrCyEFIAEgAyAFIAQgBCAFSxsiAxAfGiACIAIoAgQgA2oiBTYCBCABIANqIQEgBw0CIAQgA2siBEUNAiAFIAIoAghGDQAgAiAFQQFqNgIEIAUtAAAhAwwBCyACEL0FIgNBAE4NAEEAIQQgACABRg0DIAItAABBEHENAQwDCyABIAM6AAAgAUEBaiEBIANB/wFxQQpGDQAgBEEBayIEDQELCyAARQRAQQAhBAwBCyABQQA6AAAgACEECyAGDQALIAQLpBgDE38EfAF+IwBBMGsiCSQAAkACQAJAIAC9IhlCIIinIgNB/////wdxIgZB+tS9gARNBEAgA0H//z9xQfvDJEYNASAGQfyyi4AETQRAIBlCAFkEQCABIABEAABAVPsh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IABEAAAAAAAA4D+ioiIDob1CgICAgHCDvyIERAAAIGVHFfc/oiIBIAkgCEEUdmq3IgKgIgUgASACIAWhoCAAIABEAAAAAAAAAECgoyIBIAMgASABoiICIAKiIgEgASABRJ/GeNAJmsM/okSveI4dxXHMP6CiRAT6l5mZmdk/oKIgAiABIAEgAUREUj7fEvHCP6JE3gPLlmRGxz+gokRZkyKUJEnSP6CiRJNVVVVVVeU/oKKgoKIgACAEoSADoaAiACAEoEQAou8u/AXnPaIgAEQAACBlRxX3P6KgoKAhAAsgAAtZAQF/IwBBIGsiAiQAIAAQ7AEiAAR/IAAoAgghACACQgA3AwggAkEANgIYIAJCADcDECACIAE2AgggAkIANwMAIAAgAkEEIAAoAgARAwAFQQALIAJBIGokAAuVAQIDfwV8IAMQVyIImiEJIAAoAgghBiADEEohByAGEBwhBANAIAQEQCAEKAIQKAKUASIFIAIgBSsDACIKIAiiIAcgBSsDCCILoqCgOQMIIAUgASAKIAeiIAsgCaKgoDkDACAGIAQQHSEEDAELCyAAQThqIQQDQCAEKAIAIgAEQCAAIAEgAiADEK8HIABBBGohBAwBCwsLtQIBBX8jAEEwayIDJAAgACgACCABTwRAIABBADYCFCAAQQQQJiEEIAAoAgAgBEECdGogACgCFDYCACAAQQQQjAIgACgACCABQX9zakECdCIEBEAgACgCACADIAApAgg3AyggAyAAKQIANwMgIANBIGogAUEBahAZIAAoAgAhByADIAApAgg3AxggAyAAKQIANwMQQQJ0aiAHIANBEGogARAZQQJ0aiAEELYBGgsgACACNgIUIAMgACkCCDcDCCADIAApAgA3AwAgAyABEBkhAQJAAkACQCAAKAIQIgIOAgIAAQsgACgCACABQQJ0aigCABAYDAELIAAoAgAgAUECdGooAgAgAhEBAAsgACgCACABQQJ0aiAAKAIUNgIAIANBMGokAA8LQfGhA0GFuAFBFkGhGhAAAAsdACAAKAIIIAFBARCFARogASgCECgCgAEgADYCDAtEAQF/IAAEQCAAKAIEIgEEQCABEG0LIAAoAggiAQRAIAEQbQsgACgCDBAYIAAoAhQiAQRAIAEgACgCEBEBAAsgABAYCws+AQN/IAAQLSECIAAoAhAiAQRAA0Ag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/wotAABB1P8KQQE6AABBAXFFBEAgCkEwQQAgCigCAEEDcUEDRxtqKAIoECEhACAEIApBUEEAIAooAgBBA3FBAkcbaigCKBAhNgIEIAQgADYCAEHo7QQgBBAqCyAGEBggChCZBAwFBSAEKAKMASENIAQrA1ghEyAFIAQrA4ABOQMIIAUgEzkDACABQQFrIQEgBUEQaiEFIAIgDWohAgwCCwALCwNAIAItAAAiBUEJayIBQRdLQQEgAXRBn4CABHFFckUEQCACQQFqIQIMAQsLIAogABDeBiEJIBIEQCAEKAJ8IQEgCSAVOQMYIAkgFjkDECAJIAE2AggLIAgEQCAEKAJ4IQEgCSAXOQMoIAkgFDkDICAJIAE2AgwLIAIgBUEARyIRaiECQQAhBQNAIAAgBUcEQCAFQQR0IgEgCSgCAGoiDSABIAZqIgEpAwA3AwAgDSABKQMINwMIIAVBAWohBQwBCwsgBhAYDAELCyAKKAIQIgUoAmAiAARAIAogAEH12QAQsQQgCigCECEFCyAFKAJsIgAEQCAKIABB2tkAELEEIAooAhAhBQsgBSgCZCIABH8gCiAAQfDZABCxBCAKKAIQBSAFCygCaCIABEAgCiAAQejZABCxBAsgC0EBaiELCyADIAoQMCEKDAELCyADIA8QHSEPDAELCyALRQRAQQAhAQwBC0ECQQEgAxC0AiALRhshAQtBACEAQQAhCiADKAIQKAIIIgIoAlgiCARAIAJBADYCVEEBIQoLAkAgCA0AQfjaCigCAEEBRw0AIAMQtgRFDQBBASEAIAMoAhAoAgwiAkUNACACQQA6AFELIAMQwQIgCARAIAMoAhAhD0QAAAAAAAAAACEVRAAAAAAAAAAAIRZBACERQQAhEkEAIQ4jAEFAaiILJAAgAygCECICKAKQASENIARB2ABqIgkgAikDEDcDACAJIAIpAyg3AxggCSACKQMgNwMQIAkgAikDGDcDCAJAIAIoAggoAlgiBkUNAAJAIAkrAwAgCSsDEGINACAJKwMIIAkrAxhiDQAgCUL/////////dzcDGCAJQv/////////3/wA3AwAgCUL/////////9/8ANwMIIAlC/////////3c3AxALIAYoAgghBwNAIBEgBigCAE8NASALQgA3AzggC0IANwMwIAtCADcDKCALQgA3AyACQAJAAkACQAJA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AisDAKEiGyAboiACKwMYIAIrAwihIhsgG6KgIAUrAxAgBSsDAKEgBCsDOKAgBCsDKKEiGyAbokQAAAAAAADQP6JlIQMMAQsgBSgCICEDIAUoAiQgASACKQMYNwPIAiABIAIpAxA3A8ACIAMgAUHAAmoQ5gwhBiAEKAJIIQMgBCgCTCABIAIpAwg3A7gCIAEgAikDADcDsAIgAyABQbACahDmDCEHIAQoAkgiEUEBdCEXIAUoAiAiDkEBdCEYIBFBAWshGSAOQQFrIRpBACEDQQAhCAJAA0AgASAGIAhBBHRqIgkpAwg3A6gCIAEgCSkDADcDoAIgASAGIAggGmogDm9BBHRqIhIpAwg3A5gCIAEgEikDADcDkAIgAUHABGogAUGgAmogAUGQAmoQ6wwgASAHIAxBBHRqIgspAwg3A4gCIAEgCykDADcDgAIgASAHIAwgGWogEW9BBHRqIhMpAwg3A/gBIAEgEykDADcD8AEgAUGwBGogAUGAAmogAUHwAWoQ6wwgAUIANwOYBCABQgA3A+gBIAEgASkDyAQ3A9gBIAEgASkDuAQ3A8gBIAFCADcDkAQgAUIANwPgASABIAEpA8AENwPQASABIAEpA7AENwPAASABKwPoASABKwPYASIboSABKwPAASABKwPQASIcoaIgASsDyAEgG6EgASsD4AEgHKGioSEfIAEgEikDCDcDuAEgASASKQMANwOwASABIAkpAwg3A6gBIAEgCSkDADcDoAEgASALKQMINwOYASABIAspAwA3A5ABIAFBsAFqIAFBoAFqIAFBkAFqEOoMIRUgASATKQMINwOIASABIBMpAwA3A4ABIAEgCykDCDcDeCABIAspAwA3A3AgASAJKQMINwNoIAEgCSkDADcDYCABQYABaiABQfAAaiABQeAAahDqDCEWIAEgEikDCDcDWCABIBIpAwA3A1AgASAJKQMINwNIIAEgCSkDADcDQCABIBMpAwg3AzggASATKQMANwMwIAEgCykDCDcDKCABIAspAwA3AyAgASsDMCIgIAErA1giGyABQUBrIgkrAwgiIaGiIAErAyAiJSAhIBuhIiKiIAErA1AiHiABKwMoIh0gASsDOCIcoaIiJiAJKwMAIiMgHCAdoaKgoKAiJEQAAAAAAAAAAGIEfyABICUgHCAboaIgJiAgIBsgHaGioKAgJKMi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AgAiESAKKAIASARAIBAgAkECdCIRaiAMNgIAIAMgEWogBCAFaigCADYCACACQQFqIQIMAQsgAyARQQJ0aiIMIAwoAgAgBCAFaigCAGo2AgALIABBAWohAAwBCwsgByAJaiACNgIAIAEhAAwACwALIANBACADQQBKGyEJQQAhAANAIAAgCUYNByAPIABBAWoiAUECdCIDaiEEIA8gAEECdCIFaigCACEAA0AgACAEKAIATkUEQCAGIBQgAEECdGooAgAiCEECdGogAjYCACAQIAJBAnRqIAg2AgAgAEEBaiEAIAJBAWohAgwBCwsgBSAHaiEEIAMgDmohCCAFIA5qKAIAIQADQCAAIAgoAgBORQRAIAYgEyAAQQJ0aigCACIFQQJ0aigCACAEKAIASARAIBAgAkECdGogBTYCACACQQFqIQILIABBAWohAAwBCwsgAyAHaiACNgIAIAEhAAwACwALIAVBAUYNBAsgEkHqBDYCBCASQZa3ATYCAEGI9ggoAgBB2L8EIBIQIBoQOwALQcLeAUGWtwFBlQRBr7ABEAAAC0GH0AFBlrcBQZYEQa+wARAAAAtB2pUBQZa3AUGXBEGvsAEQAAALIANBACADQQBKGyEIIA0oAhwhAyABKAIcIQUgACgCHCEVQQAhAANAIAAgCEYNASAPIABBAWoiAUECdCIJaiEKIA8gAEECdCIEaigCACEAA0AgACAKKAIATkUEQCAGIBQgAEECdGooAgAiC0ECdGogAjYCACAQIAJBAnRqIAs2AgAgAyACQQN0aiAVIABBA3RqKwMAOQMAIABBAWohACACQQFqIQIMAQsLIAQgB2ohCiAJIA5qIQsgBCAOaigCACEAA0AgACALKAIATkUEQAJAIAYgEyAAQQJ0aigCACIEQQJ0aigCACIMIAooAgBIBEAgECACQQJ0aiAENgIAIAMgAkEDdGogBSAAQQN0aisDADkDACACQQFqIQIMAQsgAyAMQQN0aiIEIAUgAEEDdGorAwAgBCsDAKA5AwALIABBAWohAAwBCwsgByAJaiACNgIAIAEhAAwACwALIA0gAjYCCCAGEBgLIBJBEGokACANC8sHAg9/AXwjAEEQayINJAACQCAARQRADAELAkACQCAAKAIgRQRAIAAoAhghDiAAKAIUIQcgACgCBCIIIAAoAgAiAiAAKAIIIgEgACgCEEEAELYCIgkgATYCCCAJKAIYIQ8gCSgCFCEDQX8gCCAIQQBIG0EBaiEKQQAhAQNAIAEgCkYEQEEAIQEgAkEAIAJBAEobIQogA0EEaiEFA0ACQCABIApGBEBBACEBIAhBACAIQQBKGyECDAELIAcgAUEBaiICQQJ0aiEEIAcgAUECdGooAgAhAQNAIAQoAgAgAUwEQCACIQEMAwUgBSAOIAFBAnRqKAIAQQJ0aiILIAsoAgBBAWo2AgAgAUEBaiEBDAELAAsACwsDQCABIAJGRQRAIAFBAnQhBSADIAFBAWoiAUECdGoiBCAEKAIAIAMgBWooAgBqNgIADAELC0EAIQICQAJAAkACQCAAKAIQIgFBBGsOBQADAwMBAgsgCSgCHCEFIAAoAhwhBEEAIQADQCAAIApGDQggByAAQQFqIgJBAnRqIQsgByAAQQJ0aigCACEBA0AgCygCACABTARAIAIhAAwCBSAPIAMgDiABQQJ0IgZqIgwoAgBBAnRqKAIAQQJ0aiAANgIAIAQgBmooAgAhBiADIAwoAgBBAnRqIgwgDCgCACIMQQFqNgIAIAUgDEECdGogBjYCACABQQFqIQEMAQsACwALAAsDQCACIApGDQcgByACQQFqIgBBAnRqIQUgByACQQJ0aigCACEBA0AgBSgCACABTARAIAAhAgwCBSADIA4gAUECdGooAgBBAnRqIgQgBCgCACIEQQFqNgIAIA8gBEECdGogAjYCACABQQFqIQEMAQsACwALAAsgAUEBRg0ECyANQfQANgIEIA1BlrcBNgIAQYj2CCgCAEHYvwQgDRAgGhA7AAUgAyABQQJ0akEANgIAIAFBAWohAQwBCwALAAtBodABQZa3AUHFAEGckwEQAAALIAkoAhwhBSAAKAIcIQQDQCACIApGDQEgByACQQFqIgBBAnRqIQsgByACQQJ0aigCACEBA0AgCygCACABTARAIAAhAgwCBSAPIAMgDiABQQJ0aiIGKAIAQQJ0aigCAEECdGogAjYCACAEIAFBA3RqKwMAIRAgAyAGKAIAQQJ0aiIGIAYoAgAiBkEBajYCACAFIAZBA3RqIBA5AwAgAUEBaiEBDAELAAsACwALA0AgCEEATEUEQCADIAhBAnRqIAMgCEEBayIIQQJ0aigCADYCAAwBCwsgA0EANgIACyANQRBqJAAgCQsLACAAIAFBAhD/Bws+AQJ8IAG3IQMDQEGc2wovAQAgAkoEQBDXASEEIAAoAhAoApQBIAJBA3RqIAQgA6I5AwAgAkEBaiECDAELCwv3AQICfwJ8IwBBMGsiAyQAIAAgARAsIQEDQCABBEACQAJAIAJFDQAgASACEEUiBC0AAEUNACADIANBKGo2AiACQCAEQfCDASADQSBqEFFBAEwNACADKwMoIgVEAAAAAAAAAABjDQAgBUQAAAAAAAAAAGINAkH42gooAgANAgsgAyAENgIQQem1AyADQRBqECogABAhIQQgA0KAgICAgICA+D83AwggAyAENgIAQbGmBCADEIABCyADQoCAgICAgID4PzcDKEQAAAAAAADwPyEFCyABKAIQIAU5A4gBIAYgBaAhBiAAIAEQMCEBDAELCyADQTBqJAAgBguQAQEFfyMAQeAAayIDJAAgAEEBQab0AEHx/wQQIiEFIABBAUHlOUHx/wQQIiEGIAAQHCECIAFBAkkhAQNAIAIEQCADQTdqIgQgAigCEDQC9AEQzA0gAiAFIAQQcSABRQRAIANBDmoiBCACKAIQNAL4ARDMDSACIAYgBBBxCyAAIAIQHSECDAELCyADQeAAaiQAC9gBAQJ/IAAQeSEBA0AgAQRAIAEQggggARB4IQEMAQsLAkAgAEHiJUEAQQEQNkUNACAAKAIQKAIIEBggACgCECIBQQA2AgggASgCuAEQGCAAKAIQKAKMAhAYIAAoAhAoAtgBEBggACgCECICKALEAQRAIAIoAugBIQEDQCABIAIoAuwBSkUEQCACKALEASABQcgAbGooAgwQGCABQQFqIQEgACgCECECDAELCyACKALEAUG4f0EAIAIoAugBQX9GG2oQGAsgABA5IABGDQAgACgCECgCDBC8AQsLzgIBA38jAEHQAGsiAiQAIAJCADcDSCACQgA3A0ACfyAAEDxFBEAgAUEANgIAQQAMAQsgAkIANwM4IAJCADcDMCACQgA3AyggAkIANwMYIAJCADcDECACQgA3AwggAkG6AzYCJCACQbsDNgIgIAAQHCEDA0AgAwRAIAMoAhBBADYCsAEgACADEB0hAwwBCwsgABAcIQMDQCADBEAgA0F/IAIoAiQRAABFBEAgAkFAayIEQQAQ6AUgAiACKAIwNgIAIAQgAhDnBSAAIAQQsQNBARCSASIEQeIl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AigCACAFIAIpAgg3A7gGIAUgAikCADcDsAYgBUGwBmogAxAZQcgAbGooAixBAWtBfUsNACACKAIAIAUgAikCCDcD+AMgBSACKQIANwPwAyAFQfADaiADEBlByABsaigCPCACKAIAIQAgBSACKQIINwPoAyAFIAIpAgA3A+ADIAVB4ANqIAMQGSEBQQFrQX1NBEAgAigCACEGAn8gACABQcgAbGooAkBBAUYEQCAFIAIpAgg3A8gBIAUgAikCADcDwAEgBiAFQcABaiADEBlByABsaigCLCEAIAIoAgAgBSACKQIINwO4ASAFIAIpAgA3A7ABIAVBsAFqIAQQGUHIAGxqIAA2AiggAigCACAFIAIpAgg3A6gBIAUgAikCADcDoAEgBUGgAWogAxAZQcgAbGpBfzYCLCACKAIAIAUgAikCCDcDmAEgBSACKQIANwOQASAFQZABaiADEBlByABsaigCPCEAIAIoAgAgBSACKQIINwOIASAFIAIpAgA3A4ABIAVBgAFqIAQQGUHIAGxqIAA2AiwgAigCACEAIAUgAikCCDcDeCAFIAIpAgA3A3AgACAFQfAAaiADEBlByABsaigCKCEBIAUgAikCCDcDaCAFIAIpAgA3A2AgACAFQeAAaiABEBlByABsaiADNgIwIAIoAgAhACAFIAIpAgg3A1ggBSACKQIANwNQIAAgBUHQAGogBBAZQcgAbGooAighASAFIAIpAgg3A0ggBSACKQIANwNAIAAgBUFAayABEBlByABsaiAENgIwIAIoAgAhACAFIAIpAgg3AzggBSACKQIANwMwIAAgBUEwaiAEEBlByABsakEsagwBCyAFIAIpAgg3A4gDIAUgAikCADcDgAMgBiAFQYADaiAEEBlByABsakF/NgIsIAIoAgAgBSACKQIINwP4AiAFIAIpAgA3A/ACIAVB8AJqIAMQGUHIAGxqKAIsIQAgAigCACAFIAIpAgg3A+gCIAUgAikCADcD4AIgBUHgAmogBBAZQcgAbGogADYCKCACKAIAIAUgAikCCDcD2AIgBSACKQIANwPQAiAFQdACaiADEBlByABsaigCKCEAIAIoAgAgBSACKQIINwPIAiAFIAIpAgA3A8ACIAVBwAJqIAMQGUHIAGxqIAA2AiwgAigCACAFIAIpAgg3A7gCIAUgAikCADcDsAIgBUGwAmogAxAZQcgAbGooAjwhACACKAIAIAUgAikCCDcDqAIgBSACKQIANwOgAiAFQaACaiADEBlByABsaiAANgIoIAIoAgAhACAFIAIpAgg3A5gCIAUgAikCADcDkAIgACAFQZACaiADEBlByABsaigCKCEBIAUgAikCCDcDiAIgBSACKQIANwOAAiAAIAVBgAJqIAEQGUHIAGxqIAM2AjAgAigCACEAIAUgAikCCDcD+AEgBSACKQIANwPwASAAIAVB8AFqIAMQGUHIAGxqKAIsIQEgBSACKQIINwPoASAFIAIpAgA3A+ABIAAgBUHgAWogARAZQcgAbGogAzYCMCACKAIAIQAgBSACKQIINwPYASAFIAIpAgA3A9ABIAAgBUHQAWogBBAZQcgAbGpBKGoLKAIAIQEgBSACKQIINwMoIAUgAikCADcDICAAIAVBIGogARAZQcgAbGogBDYCMCACKAIAIAUgAikCCDcDGCAFIAIpAgA3AxAgBUEQaiADEBlByABsakEANgI8IAIoAgAgBSACKQIINwMIIAUgAikCADcDACAFIAQQGUHIAGxqQQA2AjwMAgsgACABQcgAbGooAiwhACACKAIAIAUgAikCCDcD2AMgBSACKQIANwPQAyAFQdADaiAEEBlByABsaiAANgIoIAIoAgAgBSACKQIINwPIAyAFIAIpAgA3A8ADIAVBwANqIAMQGUHIAGxqQX82AiwgAigCACAFIAIpAgg3A7gDIAUgAikCADcDsAMgBUGwA2ogBBAZQcgAbGpBfzYCLCACKAIAIQAgBSACKQIINwOoAyAFIAIpAgA3A6ADIAAgBUGgA2ogBBAZQcgAbGooAighASAFIAIpAgg3A5gDIAUgAikCADcDkAMgACAFQZADaiABEBlByABsaiAENgIwDAELIAIoAgAgBSACKQIINwOoBiAFIAIpAgA3A6AGIAVBoAZqIAMQGUHIAGxqKAIoIQYgAigCACEHIAUgAikCCDcDmAYgBSACKQIANwOQBgJAIAcgBUGQBmogBhAZQcgAbGooAjAiB0EBa0F9Sw0AIAIoAgAgBSACKQIINwOIBiAFIAIpAgA3A4AGIAVBgAZqIAYQGUHIAGxqKAI0QQFrQX1LDQAgAigCACEGIAUgAikCCDcDuAUgBSACKQIANwOwBQJAIAYgBUGwBWogBxAZQcgAbGooAgRBAEwNACACKAIAIAUgAikCCDcDqAUgBSACKQIANwOgBSAFQaAFaiAHEBlByABsaigCBCABIABBEGoQxwQNACACKAIAIAUgAikCCDcDmAUgBSACKQIANwOQBSAFQZAFaiADEBlByABsakF/NgIoIAIoAgAgBSACKQIINwOIBSAFIAIpAgA3A4AFIAVBgAVqIAMQGUHIAGxqQX82AiwgAigCACAFIAIpAgg3A/gEIAUgAikCADcD8AQgBUHwBGogBBAZQcgAbGpBfzYCLCACKAIAIQAgBSACKQIINwPoBCAFIAIpAgA3A+AEIAAgBUHgBGogBBAZQcgAbGooAighASAFIAIpAgg3A9gEIAUgAikCADcD0AQgACAFQdAEaiABEBlByABsaiAENgI0DAILIAIoAgAgBSACKQIINwPIBCAFIAIpAgA3A8AEIAVBwARqIAQQGUHIAGxqQX82AiggAigCACAFIAIpAgg3A7gEIAUgAikCADcDsAQgBUGwBGogBBAZQcgAbGpBfzYCLCACKAIAIAUgAikCCDcDqAQgBSACKQIANwOgBCAFQaAEaiADEBlByABsakF/NgIsIAIoAgAhACAFIAIpAgg3A5gEIAUgAikCADcDkAQgACAFQZAEaiADEBlByABsaigCKCEBIAUgAikCCDcDiAQgBSACKQIANwOABCAAIAVBgARqIAEQGUHIAGxqIAM2AjAMAQsgAigCACEAIAUgAikCCDcD+AUgBSACKQIANwPwBSAAIAVB8AVqIAMQGUHIAGxqKAIoIQEgBSACKQIINwPoBSAFIAIpAgA3A+AFIAAgBUHgBWogARAZQcgAbGogAzYCMCACKAIAIQAgBSACKQIINwPYBSAFIAIpAgA3A9AFIAAgBUHQBWogAxAZQcgAbGooAighASAFIAIpAgg3A8gFIAUgAikCADcDwAUgACAFQcAFaiABEBlByABsaiAENgI0CyAFQdAGaiQAC1UCAnwBfyABQQAgAUEAShshASAAtyIDIQIDfyABIARGBH8gAyACo5siAplEAAAAAAAA4EFjBEAgAqoPC0GAgICAeAUgBEEBaiEEIAIQrQchAgwBCwsLPgECfCAAIAErAwAiAhAyOQMAIAAgASsDCCIDEDI5AwggACACIAErAxCgEDI5AxAgACADIAErAxigEDI5AxgLLAEBfyAAKAIEIgIEQCACIAE2AgwLIAAgATYCBCAAKAIARQRAIAAgATYCAAsLQwECfyMAQRBrIgAkAEEBQYgUEE4iAUUEQCAAQYgUNgIAQYj2CCgCAEH16QMgABAgGhAvAAsgARC+DiAAQRBqJAAgAQvbAgEFfwJAIAEoAhAiBSgC6AENAEHs/QooAgAhBgJAIAIEQANAIAUoAsgBIARBAnRqKAIAIgdFDQIgBxDGDkUEQCAGIANBAnRqIAc2AgAgASgCECEFIANBAWohAwsgBEEBaiEEDAALAAsDQCAFKALAASAEQQJ0aigCACIHRQ0BIAcQxg5FBEAgBiADQQJ0aiAHNgIAIAEoAhAhBSADQQFqIQMLIARBAWohBAwACwALIANBAkgNACAGIANBAnRqQQA2AgAgBiADQQRBpgMQtQFBUEEwIAIbIQFBAkEDIAIbIQJBASEEA0AgBiAEQQJ0aiIFKAIAIgNFDQEgBUEEaygCACIFIAFBACAFKAIAQQNxIAJHG2ooAigiBSADIAFBACADKAIAQQNxIAJHG2ooAigiAxD2Dg0BIAUgA0EAEKgIIgMoAhBBBDoAcCAAIAMQ+wUgBEEBaiEEDAALAAsLqwEBBH8jAEEgayIEJAAgACgCACIAKAIQIQYgACgCCCEFAkAgA0UEQCACIQAMAQsgBEIANwMYIARCADcDECAEIAI2AgAgBCADNgIEIARBEGoiB0GUMyAEEIQBIAUgBxDTAhCsASEAIAUgAkEAEIwBGiAFIANBABCMARogBxBcCyAGQQhqQYMCIAYoAgAgAUEBEI0BIAAQ9wUQkgggBSABQQAQjAEaIARBIGokAAunBAINfwR+IAAoAhAiBCgC7AEhBiAEKALoASECA0AgAiAGSgRAAkADQCAEKALoASECQgAhEQNAIAQoAuwBIQMCQANAIAIgA0oNASAEKALEASIFIAJByABsIglqIgYtADBFBEAgAkEBaiECDAELC0EAIQggBkEAOgAwIAJBAWohBkHo/QooAgAhDEIAIRIgAkEBa0HIAGwhCgNAIAUgBkHIAGwiC2ohDSAFIAlqIg4oAgBBAWshBQJAA0AgBSAITA0BIA4oAgQiAyAIQQJ0aigCACIHKAIQKAL4ASADIAhBAWoiCEECdGooAgAiAygCECgC+AFODQYgACAHIAMQ1g4NAAJ+IAJBAEwEQEIAIQ9CAAwBCyAHIAMQzQ4hDyADIAcQzQ4LIRAgDSgCAEEASgRAIA8gByADEMwOrHwhDyAQIAMgBxDMDqx8IRALIAFFIA9CAFdyIA8gEFJyIA8gEFdxDQALIAcgAxCXCCAMKAIQKALEASIDIAlqQQA6ADEgACgCECIEKALEASIFIAlqQQE6ADAgBCgC6AEgAkgEQCADIApqQQA6ADEgBSAKakEBOgAwCyAPIBB9IBJ8IRIgAiAEKALsAU4NASADIAtqQQA6ADEgBSALakEBOgAwDAELCyARIBJ8IREgBiECDAELCyARQgBVDQALDwsFIAQoAsQBIAJByABsakEBOgAwIAJBAWohAgwBCwtBk6EDQZu5AUGABUHV2gAQAAALcgEEfyAAKAIQIgIoAvgBIQMgAiABKAIQKAL4ASIENgL4ASACKAL0AUHIAGwiAkHo/QooAgAiBSgCECgCxAFqKAIEIARBAnRqIAA2AgAgASgCECADNgL4ASAFKAIQKALEASACaigCBCADQQJ0aiABNgIAC4IBAQZ/IAAoAhAiAygC7AEhBCADKALoASEBA0AgASAESkUEQEEAIQAgAygCxAEgAUHIAGxqIgUoAgAiAkEAIAJBAEobIQIDQCAAIAJGRQRAIAUoAgQgAEECdGooAgAoAhAiBiAGKAL4Abc5AxAgAEEBaiEADAELCyABQQFqIQEMAQsLC/IBAQd/QQEhAQNAIAAoAhAiAigCtAEgAUgEQAJAIAIoAowCRQ0AIAIoAugBIQEDQCABIAIoAuwBSg0BIAFBAnQiBSACKAKMAmooAgAiAwRAIAAgA0F/ENMOIQQgACADQQEQ0w4hAyAAKAIQKAKMAiAFaiAENgIAIAAQYSEFIAFByABsIgYgACgCECICKALEAWoiByAFKAIQKALEASAGaigCBCAEKAIQKAL4ASIEQQJ0ajYCBCAHIAMoAhAoAvgBIARrQQFqNgIACyABQQFqIQEMAAsACwUgAigCuAEgAUECdGooAgAQmQggAUEBaiEBDAELCwvZDgMWfwN+AnwjAEEgayIJJABC////////////ACEZIAFBAk8EQBDJBCEZIAAQmAgLQYj2CCgCACEUIBkhGAJAA0ACQCAZIRoCQAJAAkAgAUECaw4CAQMAC0GY2wooAgAhAgJAIAAQYSAARw0AIAAgARDbDkUNAEJ/IRgMBQsgAUUEQCAAENoOC0EEIAIgAkEEThshAiAAENkOEMkEIhkgGFUNASAAEJgIIBkhGAwBC0GY2wooAgAhAiAYIBpTBEAgABDXDgsgGCEZC0EAIQ0gAkEAIAJBAEobIRVBACEOA0ACQAJAIA0gFUYNAEHs2gotAAAEQCAJIBg3AxggCSAZNwMQIAkgDjYCCCAJIA02AgQgCSABNgIAIBRBubYEIAkQIBoLIBlQIA5B8P0KKAIATnINACAAKAIQIQICfyANQQFxIhZFBEAgAkHsAWohA0EBIREgAigC6AEiAiACQej9CigCACgCECgC6AFMagwBCyACQegBaiEDQX8hESACKALsASICIAJB6P0KKAIAKAIQKALsAU5rCyEQIA5BAWohDiANQQJxIRIgAygCACARaiEXA0AgECAXRg0CQQAhCEH0/QooAgAiBEEEayEHIAAoAhAoAsQBIgIgEEHIAGwiE2ooAgQhCgNAIAIgE2oiDygCACIGIAhMBEBBACEIIAZBACAGQQBKGyELQQAhBQNAAkACfwJAIAUgC0cEQCAKIAVBAnRqKAIAKAIQIgQoAswBDQMgBCgCxAENAyAEAnwgBCgC3AEEQCAEKALYASIMKAIAIgJBMEEAIAIoAgBBA3FBA0cbaigCKCECQQEhAwNAIAwgA0ECdGooAgAiBwRAIAdBMEEAIAcoAgBBA3FBA0cbaigCKCIHIAIgBygCECgC+AEgAigCECgC+AFKGyECIANBAWohAwwBCwsgAigCECsDgAIiG0QAAAAAAAAAAGZFDQMgG0QAAAAAAADwP6AMAQsgBCgC1AFFDQIgBCgC0AEiDCgCACICQVBBACACKAIAQQNxQQJHG2ooAighAkEBIQMDQCAMIANBAnRqKAIAIgcEQCAHQVBBACAHKAIAQQNxQQJHG2ooAigiByACIAcoAhAoAvgBIAIoAhAoAvgBSBshAiADQQFqIQMMAQsLIAIoAhArA4ACIhtEAAAAAAAAAABkRQ0CIBtEAAAAAAAA8L+gCzkDgAJBAAwCC0EAIQdBAEF8IAhBAXEbQQAgEhshCyAPKAIEIgUgBkECdGohAwNAAkAgBkEASgRAIAZBAWshBiAFIQIDQCACIANPDQIDQCACIANPDQMgAigCACIPKAIQKwOAAiIbRAAAAAAAAAAAYwRAIAJBBGohAgwBBUEAIQQDQCACQQRqIgIgA08NBSACKAIAIQogBCIIQQFxBEBBASEEIAooAhAoAugBDQELIAAgDyAKENYODQMgCigCECIEKwOAAiIcRAAAAAAAAAAAZkUEQCAEKALoAUEARyAIciEEDAELCyAbIBxkIBJFIBsgHGZxckUNAiAPIAoQlwggB0EBaiEHDAILAAsACwALAkAgB0UNAEHo/QooAgAoAhAoAsQBIBNqIgJBADoAMSAQQQBMDQAgAkEXa0EAOgAACyAQIBFqIRAMCAsgAyALaiEDDAALAAtBAQsgCHIhCAsgBUEBaiEFDAALAAUgCiAIQQJ0aigCACIPKAIQIQYCQCAWRQRAIAYoAsABIQtBACECQQAhBQNAIAsgBUECdGooAgAiA0UNAiADKAIQIgwuAZoBQQBKBEAgBCACQQJ0aiAMLQAwIANBMEEAIAMoAgBBA3FBA0cbaigCKCgCECgC+AFBCHRyNgIAIAJBAWohAgsgBUEBaiEFDAALAAsgBigCyAEhC0EAIQJBACEFA0AgCyAFQQJ0aigCACIDRQ0BIAMoAhAiDC4BmgFBAEoEQCAEIAJBAnRqIAwtAFggA0FQQQAgAygCAEEDcUECRxtqKAIoKAIQKAL4AUEIdHI2AgAgAkEBaiECCyAFQQFqIQUMAAsAC0QAAAAAAADwvyEbAkACQAJAAkAgAg4DAwABAgsgBCgCALchGwwCCyAEKAIEIAQoAgBqQQJttyEbDAELIAQgAkEEQaQDELUBIAJBAXYhBQJ8IAJBAXEEQCAEIAVBAnRqKAIAtwwBCyAEIAVBAnRqIgZBBGsoAgAiBSAEKAIAayIDIAcgAkECdGooAgAgBigCACICayIGRgRAIAIgBWpBAm23DAELIAW3IAa3oiACtyADt6KgIAMgBmq3owshGyAPKAIQIQYLIAYgGzkDgAIgCEEBaiEIIAAoAhAoAsQBIQIMAQsACwALAAsgAUEBaiEBQgAhGiAZQgBSDQMMAgsgACASQQBHEJYIIBgQyQQiGVkEQCAAEJgIQQAgDiAZuSAYuUTXo3A9CtfvP6JjGyEOIBkhGAsgDUEBaiENDAALAAsLIBggGlMEQCAAENcOCyAYQgBXDQAgAEEAEJYIEMkEIRgLIAlBIGokACAYC6ICAQN/IwBBIGsiAiQAAkBBvNsKKAIAIgFBjNwKKAIAckUNACAAIAFBABB6IgEEQCABQYUZEGMEQCAAQQEQyw4MAgsgAUGl5QAQYwRAIABBABDLDgwCCyABLQAARQ0BIAIgATYCEEGE4wQgAkEQahA3DAELIAAQeSEBA0AgAQRAIAEQxQFFBEAgARCbCAsgARB4IQEMAQsLQYzcCigCAEUNACAAEBwhAQNAIAFFDQECQCABQYzcCigCAEEAEHoiA0UNACADQYUZEGMEQCAAIAFBARCUCAwBCyADQaXlABBjBEAgACABQQAQlAgMAQsgAy0AAEUNACACIAEQITYCBCACIAM2AgBBzekEIAIQNwsgACABEB0hAQwACwALIAJBIGokAAsXACAAKAIAIgAgASgCACIBSiAAIAFIawu5AgEFfyABKAIQIgRBATYCCCAEKAIUKAIQKAL4ASEEIAMgAhA8QQJ0aiAENgIAIAIgAUEBEIUBGiAAIAEQLCEEA0AgBARAIAUgBEFQQQAgBCgCAEEDcSIGQQJHG2ooAigiBygCECIIKAIUKAIQKAL4ASAEQTBBACAGQQNHG2ooAigoAhAoAhQoAhAoAvgBSmohBSAIKAIIRQRAIAAgByACIAMQnQggBWohBQsgACAEEDAhBAwBCwsgACABEL0CIQQDQCAEBEAgBSAEQVBBACAEKAIAQQNxIgFBAkcbaigCKCgCECgCFCgCECgC+AEgBEEwQQAgAUEDRxtqKAIoIgEoAhAiBigCFCgCECgC+AFKaiEFIAYoAghFBEAgACABIAIgAxCdCCAFaiEFCyAAIAQQjwMhBAwBCwsgBQseACABBEAgABCGAiEAIAEQhgIoAhAgADYCqAELIAALcgECfyMAQSBrIgEkAAJAIABBgICAgARJBEAgAEEEEE4iAkUNASABQSBqJAAgAg8LIAFBBDYCBCABIAA2AgBBiPYIKAIAQabqAyABECAaEC8ACyABIABBAnQ2AhBBiPYIKAIAQfXpAyABQRBqECAaEC8AC40BAQF/AkAgASgCECIDKAKQAQ0AIAMgAjYCkAEgACABECwhAwNAIAMEQCAAIANBUEEAIAMoAgBBA3FBAkcbaigCKCACEKAIIAAgAxAwIQMMAQsLIAAgARC9AiEDA0AgA0UNASAAIANBMEEAIAMoAgBBA3FBA0cbaigCKCACEKAIIAAgAxCPAyEDDAALAAsLIQAgAEUEQEHU1gFB1PsAQQxB5TsQAAALIABBkZYFEE1FCwsAIABByyQQJxBoC6oBAQR/IAAoAhBBGGohAiABQQJHIQQCQANAIAIoAgAiAgRAIAIoAgBBiwJHDQIgAigCBCEDAkAgBEUEQCADEKEIDQELIAIgACgCECgCACABIANBABAiIgU2AgQgBUUEQCACIAAoAhAoAgAgASADQfH/BBAiNgIECyACQYoCNgIAIAAoAgggA0EAEIwBGgsgAkEMaiECDAELCw8LQaTsAEHcEUG5AkGaKRAAAAvTBgEKfyMAQdAAayICJAAgAkIANwMoIAJCADcDIEHU/QpBAUHU/QooAgBBAWoiBSAFQQFNGzYCACACQgA3AxggACgCEEEANgLcASACQSxqIQggABAcIQUgAUEATCEJAkADQCAFRQRAQQAhAQNAIAEgAigCIE9FBEAgAiACKQMgNwMIIAIgAikDGDcDACACIAEQGSEAAkACQAJAIAIoAigiBQ4CAgABCyACKAIYIABBAnRqKAIAEBgMAQsgAigCGCAAQQJ0aigCACAFEQEACyABQQFqIQEMAQsLIAJBGGoiAEEEEDEgABA0IAJB0ABqJAAPCwJAAkACQAJAIAkNACAFKAIQIgEoAugBIgRFDQAgBCgCECgCjAIgASgC9AFBAnRqKAIAIQEMAQsgBSIBEKIBIAFHDQELIAEoAhAoArABQdT9CigCAEYNACAAKAIQQQA2AsABQdj9CkEANgIAIAJBGGogARDwDgNAAkAgAigCIEUNACACQRhqIAhBBBC+ASACKAIsIgRFDQBB1P0KKAIAIgMgBCgCECIBKAKwAUYNASABIAM2ArABQQAhA0HY/QooAgAiBiAAIAYbKAIQQbgBQcABIAYbaiAENgIAIAEgBjYCvAFB2P0KIAQ2AgAgAUEANgK4ASACIAQoAhAiASkD2AE3AzAgAiABKQPQATcDOCACIAEpA8ABNwNAIAIgASkDyAE3A0gDQCADQQRGDQICQCACQTBqIANBA3RqIgEoAgAiCkUNACABKAIEIgZFDQADQCAGRQ0BIAQgCiAGQQFrIgZBAnRqKAIAIgdBUEEAIAcoAgBBA3EiC0ECRxtqKAIoIgFGBEAgB0EwQQAgC0EDRxtqKAIoIQELIAEoAhAoArABQdT9CigCAEYNACABEKIBIAFHDQAgAkEYaiABEPAODAALAAsgA0EBaiEDDAALAAsLIAAoAhAiASABKALcASIEQQFqIgM2AtwBIARB/////wNPDQEgASgC2AEgA0ECdCIDEGoiAUUNAyAAKAIQIgMgATYC2AEgASAEQQJ0aiADKALAATYCAAsgACAFEB0hBQwBCwtBjsADQdL8AEHNAEG9swEQAAALIAIgAzYCEEGI9ggoAgBB9ekDIAJBEGoQIBoQLwALbQEDfyAAEJQCIAAgAEEwayIBIAAoAgBBA3EiAkECRhsoAiggACAAQTBqIgMgAkEDRhsoAigQuQMiAgRAIAAgAhCMAw8LIAAgASAAKAIAQQNxIgFBAkYbKAIoIAAgAyABQQNGGygCKCAAEOQBGguIAQEBfyAABEACQCAAKAIQKAJ4IgFFDQAgASgCECIBKAKwASAARw0AIAFBADYCsAELIABBMEEAIAAoAgBBA3FBA0cbaigCKCgCEEHQAWogABD+BSAAQVBBACAAKAIAQQNxQQJHG2ooAigoAhBB2AFqIAAQ/gUPC0Ht1QFBq7oBQeABQaedARAAAAtWAQJ/IAEoAhAiAiAAKAIQIgMoAsABIgA2ArgBIAAEQCAAKAIQIAE2ArwBCyADIAE2AsABIAJBADYCvAEgACABRgRAQYukA0GrugFBugFB458BEAAACwvxAgEFf0HgABD9BSIEIAQoAjBBA3IiBTYCMCAEIAQoAgBBfHFBAnIiBjYCAEG4ARD9BSEDIAQgADYCWCAEIAM2AhAgBCABNgIoIANBAToAcCACBEAgBCACKAIAIgdBcHEiASAFQQ9xcjYCMCAEIAZBDnEgAXI2AgAgAyACKAIQIgEvAagBOwGoASADIAEvAZoBOwGaASADIAEoApwBNgKcASADIAEoAqwBNgKsAUEQIQUCQCADQRBqIAJBMEEAIAdBA3EiBkEDRxtqKAIoIgcgAEcEfyAAIAJBUEEAIAZBAkcbaigCKEcNAUE4BUEQCyABakEoEB8aC0E4IQACQCADQThqIAQoAigiBSACQVBBACAGQQJHG2ooAihHBH8gBSAHRw0BQRAFQTgLIAFqQSgQHxoLIAEoArABRQRAIAEgBDYCsAELIAMgAjYCeCAEDwsgA0EBNgKsASADQQE7AagBIANBATsBmgEgA0EBNgKcASAEC7gBAQR/IAAoAhAiBCAEKAL0ASACajYC9AEDQCAEKAKYAiADQQJ0aigCACIFBEAgASAFQTBBACAFKAIAQQNxQQNHG2ooAigiBUcEQCAFIAAgAhCpCCAAKAIQIQQLIANBAWohAwwBBQNAAkAgBCgCoAIgBkECdGooAgAiA0UNACABIANBUEEAIAMoAgBBA3FBAkcbaigCKCIDRwRAIAMgACACEKkIIAAoAhAhBAsgBkEBaiEGDAELCwsLC/IEAQZ/IAAQzgQhBwJAIAIEQCACQVBBACACKAIAQQNxIgNBAkcbaigCKCgCECgC9AEgAigCECgCrAEgAkEwQQAgA0EDRxtqKAIoKAIQKAL0AWpGDQELA0AgACgCECIEKALIASAFQQJ0aigCACIDBEAgAygCAEEDcSEEAkAgAygCECgCpAFBAE4EQCADQVBBACAEQQJHG2ooAigiAyABRg0BIAMgACACEKoIIQIMAQsgAyADQTBrIgggBEECRhsoAigQzgQgB0YNACACBEAgAyAIIAMoAgBBA3EiBEECRhsoAigoAhAoAvQBIANBMEEAIARBA0cbaigCKCgCECgC9AEgAygCECgCrAFqayACQVBBACACKAIAQQNxIgRBAkcbaigCKCgCECgC9AEgAkEwQQAgBEEDRxtqKAIoKAIQKAL0ASACKAIQKAKsAWprTg0BCyADIQILIAVBAWohBQwBBQNAIAQoAsABIAZBAnRqKAIAIgNFDQMgAygCAEEDcSEFAkAgAygCECgCpAFBAE4EQCADQTBBACAFQQNHG2ooAigiAyABRg0BIAMgACACEKoIIQIMAQsgAyADQTBqIgQgBUEDRhsoAigQzgQgB0YNACACBEAgA0FQQQAgAygCAEEDcSIFQQJHG2ooAigoAhAoAvQBIAMgBCAFQQNGGygCKCgCECgC9AEgAygCECgCrAFqayACQVBBACACKAIAQQNxIgVBAkcbaigCKCgCECgC9AEgAkEwQQAgBUEDRxtqKAIoKAIQKAL0ASACKAIQKAKsAWprTg0BCyADIQILIAZBAWohBiAAKAIQIQQMAAsACwALAAsgAgvRAQEFfyAAKAIEIQMgACgCACEEIAEhAgNAIAFBAXQiBUECaiEGIAMgBUEBciIFSwRAIAUgASAEIAVBAnRqKAIAKAIEIAQgAUECdGooAgAoAgRIGyECCyADIAZLBEAgBiACIAQgBkECdGooAgAoAgQgBCACQQJ0aigCACgCBEgbIQILIAEgAkcEQCAEIAFBAnRqIgMoAgAhBiADIAQgAkECdGoiBSgCADYCACAFIAY2AgAgAygCACABNgIIIAYgAjYCCCAAKAIEIgMgAiIBSw0BCwsL/QIBA38CQAJAAn9B3LIEIAEoAhAiAigCpAFBAE4NABogACgADCIDQQBIDQIgAiADNgKkASAAIAE2AhggAEEEakEEECYhAiAAKAIEIAJBAnRqIAAoAhg2AgBBACEAIAFBMEEAIAEoAgBBA3FBA0cbaigCKCIDKAIQIgJBATYCsAEgAiACKAKkAiIEQQFqNgKkAiACKAKgAiAEQQJ0aiABNgIAIAMoAhAiAigCoAIgAigCpAJBAnRqQQA2AgBBzt4DIAMoAhAiAigCyAEgAigCpAJBAnRqQQRrKAIARQ0AGiABQVBBACABKAIAQQNxQQJHG2ooAigiAygCECICQQE2ArABIAIgAigCnAIiBEEBajYCnAIgAigCmAIgBEECdGogATYCACADKAIQIgEoApgCIAEoApwCQQJ0akEANgIAIAMoAhAiASgCwAEgASgCnAJBAnRqQQRrKAIADQFB8d4DC0EAEDdBfyEACyAADwtBpc0BQce5AUE/QbidARAAAAu4AgIEfwN8IwBBgAFrIgEkACABIAAoAlA2AnBBiPYIKAIAIgNBjNkEIAFB8ABqECAaA0AgACgCUCACTQRAIAArAwAhBSAAKwMIIQYgAC0AHSECIAEgACsDEDkDYCABQdKsAUHOrAEgAhs2AmggASAGOQNYIAEgBTkDUCADQYGCBCABQdAAahAzIAArAyghBSAAKwMwIQYgAC0ARSECIAFBQGsgACsDODkDACABQdKsAUHOrAEgAhs2AkggASAGOQM4IAEgBTkDMCADQbSCBCABQTBqEDMgAUGAAWokAAUgACgCVCACQQV0aiIEKwMAIQUgBCsDCCEGIAQrAxAhByABIAQrAxg5AyAgASAHOQMYIAEgBjkDECABIAU5AwggASACNgIAIANBw/AEIAEQMyACQQFqIQIMAQsLC7EbAwp/HXwBfiMAQYACayIIJAACQAJAAkACQAJAIANBAEoEQEF/IQsgA0EoEE4iCkUNBUEBIQYDQCADIAZGBEAgCiADQShsakEoayEHQQEhBgNAIAMgBkYEQCAFKwMIIR4gBSsDACEfIAQrAwghICAEKwMAISFBACEHA0AgAyAHRgRAIAIgA0EEdGoiBkEIaysAACEYIAZBEGsrAAAhHCACKwAIIRMgAisAACEVQQAhBgNAIAMgBkZFBEAgFiAKIAZBKGxqIgcrABgiECACIAZBBHRqIgkrAAAgHCAHKwMAIhEgEaJEAAAAAAAA8D8gEaEiFkQAAAAAAAAIQKIgEaCiIheiIBUgFiAWoiARRAAAAAAAAAhAoiAWoKIiFqKgoSIZoiAHKwAgIhEgCSsACCATIBaiIBggF6KgoSIioqCgIRYgEiAHKwAIIhcgGaIgBysAECIZICKioKAhEiAUIBcgEKIgGSARoqCgIRQgGyAQIBCiIBEgEaKgoCEbIBogFyAXoiAZIBmioKAhGiAGQQFqIQYMAQsLRAAAAAAAAAAAIRFEAAAAAAAAAAAhECAaIBuiIBQgFKKhIheZIhlEje21oPfGsD5mBEAgGiAWoiAUIBKioSAXoyEQIBIgG6IgFiAUmqKgIBejIRELIBlEje21oPfGsD5jIBFEAAAAAAAAAABlciAQRAAAAAAAAAAAZXIEQCAcIBWhIBggE6EQR0QAAAAAAAAIQKMiESEQCyAeIBCiIR4gHyAQoiEfICAgEaIhICAhIBGiISFBACEGRAAAAAAAABBAIREDQCAIIBg5A3ggCCAYIB4gEaJEAAAAAAAACECjoSIXOQNoIAggHDkDcCAIIBwgHyARokQAAAAAAAAIQKOhIhk5A2AgCCATOQNIIAggEyAgIBGiRAAAAAAAAAhAo6AiFDkDWCAIIBU5A0AgCCAVICEgEaJEAAAAAAAACECjoCIWOQNQIAZBAXFFBEAgCEFAa0EEEIcPIAIgAxCHD0T8qfHSTWJQv6BjDQwLIBREAAAAAAAAGMCiIBNEAAAAAAAACECiIBdEAAAAAAAACECiIhCgoCEiIBREAAAAAAAACECiIBigIBAgE6ChISUgFkQAAAAAAAAYwKIgFUQAAAAAAAAIQKIgGUQAAAAAAAAIQKIiEKCgISYgFkQAAAAAAAAIQKIgHKAgECAVoKEhJyAUIBOhRAAAAAAAAAhAoiEoIBYgFaFEAAAAAAAACECiISlBACEMA0AgASAMRgRAQbz9CigCAEEEahCvCEEASA0MQbz9CigCACEHQcD9CigCACEAQQEhBgNAIAZBBEYNDCAAIAdBBHRqIgEgCEFAayAGQQR0aiICKwMAOQMAIAEgAisDCDkDCCAGQQFqIQYgB0EBaiEHDAALAAsgACAMQQV0aiIGKwMYIiogBisDCCIaoSESAkACQAJAAkAgBisDECIrIAYrAwAiG6EiHUQAAAAAAAAAAGEEQCAIICY5A/ABIAggJzkD+AEgCCApOQPoASAIIBUgG6E5A+ABIAhB4AFqIgcgCEHAAWoQsQghBiASRAAAAAAAAAAAYQRAIAggIjkD8AEgCCAlOQP4ASAIICg5A+gBIAggEyAaoTkD4AEgByAIQaABahCxCCEJIAZBBEYEQCAJQQRGDQVBACEHIAlBACAJQQBKGyEJQQAhBgNAIAYgCUYNBSAIQaABaiAGQQN0aisDACIQRAAAAAAAAAAAZkUgEEQAAAAAAADwP2VFckUEQCAIQYABaiAHQQN0aiAQOQMAIAdBAWohBwsgBkEBaiEGDAALAAsgCUEERg0CQQAhByAGQQAgBkEAShshDSAJQQAgCUEAShshDkEAIQkDQCAJIA1GDQQgCEHAAWogCUEDdGohD0EAIQYDQCAGIA5GRQRAIA8rAwAiECAIQaABaiAGQQN0aisDAGIgEEQAAAAAAAAAAGZFciAQRAAAAAAAAPA/ZUVyRQRAIAhBgAFqIAdBA3RqIBA5AwAgB0EBaiEHCyAGQQFqIQYMAQsLIAlBAWohCQwACwALIAZBBEYNA0EAIQcgBkEAIAZBAEobIQlBACEGA0AgBiAJRg0DAkAgCEHAAWogBkEDdGorAwAiEEQAAAAAAAAAAGZFIBBEAAAAAAAA8D9lRXINACAQIBAgECAloiAioKIgKKCiIBOgIBqhIBKjIh1EAAAAAAAAAABmRSAdRAAAAAAAAPA/ZUVyDQAgCEGAAWogB0EDdGogEDkDACAHQQFqIQcLIAZBAWohBgwACwALIAggEiAdoyIQIBuiIBqhIBMgECAVoqEiEqA5A+ABIAggFCAQIBaioSIjIBKhRAAAAAAAAAhAojkD6AEgCCAjRAAAAAAAABjAoiASRAAAAAAAAAhAoiAXIBAgGaKhRAAAAAAAAAhAoiIkoKA5A/ABIAggI0QAAAAAAAAIQKIgGCAQIByioaAgJCASoKE5A/gBIAhB4AFqIAhBwAFqELEIIgZBBEYNAkEAIQcgBkEAIAZBAEobIQlBACEGA0AgBiAJRg0CAkAgCEHAAWogBkEDdGorAwAiEEQAAAAAAAAAAGZFIBBEAAAAAAAA8D9lRXINACAQIBAgECAnoiAmoKIgKaCiIBWgIBuhIB2jIhJEAAAAAAAAAABmRSASRAAAAAAAAPA/ZUVyDQAgCEGAAWogB0EDdGogEDkDACAHQQFqIQcLIAZBAWohBgwACwALQQAhByAGQQAgBkEAShshCUEAIQYDQCAGIAlGDQEgCEHAAWogBkEDdGorAwAiEEQAAAAAAAAAAGZFIBBEAAAAAAAA8D9lRXJFBEAgCEGAAWogB0EDdGogEDkDACAHQQFqIQcLIAZBAWohBgwACwALIAdBBEYNAEEAIQYgB0EAIAdBAEobIQcDQCAGIAdGDQECQCAIQYABaiAGQQN0aisDACIQRI3ttaD3xrA+YyAQROkLIef9/+8/ZHINACAQIBAgEKKiIh0gHKJEAAAAAAAA8D8gEKEiEiAQIBBEAAAAAAAACECiIhCioiIjIBmiIBIgEiASoqIiJCAVoiAWIBIgECASoqIiEKKgoKAiEiAboSIsICyiIB0gGKIgIyAXoiAkIBOiIBQgEKKgoKAiECAaoSIdIB2ioET8qfHSTWJQP2MNACASICuhIhIgEqIgECAqoSIQIBCioET8qfHSTWJQP2NFDQMLIAZBAWohBgwACwALIAxBAWohDAwBCwsgEUR7FK5H4Xp0P2MNCCARRAAAAAAAAOA/okQAAAAAAAAAACARRHsUrkfheoQ/ZBshEUEBIQYMAAsABSAKIAdBKGxqIgZEAAAAAAAA8D8gBisDACIRoSIQIBEgEUQAAAAAAAAIQKIiEaKiIhMgHqI5AyAgBiATIB+iOQMYIAYgICAQIBEgEKKiIhGiOQMQIAYgISARojkDCCAHQQFqIQcMAQsACwAFIAogBkEobGoiCSAJKwMAIAcrAwCjOQMAIAZBAWohBgwBCwALAAUgCiAGQShsaiARIAIgBkEEdGoiB0EQaysAACAHKwAAoSAHQQhrKwAAIAcrAAihEEegIhE5AwAgBkEBaiEGDAELAAsAC0GklgNBhL0BQecAQa2XARAAAAsgA0ECRw0CQbz9CigCAEEEahCvCEEASA0BQbz9CigCACEHQcD9CigCACEAQQEhBgNAIAZBBEYNASAAIAdBBHRqIgEgCEFAayAGQQR0aiICKwMAOQMAIAEgAisDCDkDCCAGQQFqIQYgB0EBaiEHDAALAAtBACELQbz9CiAHNgIACyAKEBgMAQsgGCAeRFVVVVVVVdU/oqEhFiAcIB9EVVVVVVVV1T+ioSESIBMgIERVVVVVVVXVP6KgIRogFSAhRFVVVVVVVdU/oqAhG0F/IQdBAiADIANBAkwbQQFrIQlEAAAAAAAA8L8hFEEBIQYDQCAGIAlGBEACQCAKEBggAiAHQQR0aiIGKwAAIhMgBkEQaysAAKEiESARoiAGKwAIIhUgBkEIaysAAKEiECAQoqAiGESN7bWg98awPmQEfCAQIBifIhijIRAgESAYowUgEQsgAiAHQQFqIgpBBHRqIgkrAAAgE6EiEyAToiAJKwAIIBWhIhQgFKKgIhVEje21oPfGsD5kBHwgFCAVnyIVoyEUIBMgFaMFIBMLoCIRIBGiIBAgFKAiECAQoqAiE0SN7bWg98awPmQEQCAQIBOfIhOjIRAgESAToyERCyAIIBA5A0ggCCAROQNAIAggBCkDCDcDOCAEKQMAIS0gCCAIKQNINwMoIAggLTcDMCAIIAgpA0A3AyAgACABIAIgCiAIQTBqIAhBIGoQrghBAE4NAEF/IQsMAwsFIAIgBkEEdGoiCysAACAKIAZBKGxqKwMAIhEgESARoqIiFyAcokQAAAAAAADwPyARoSIQIBEgEUQAAAAAAAAIQKIiEaKiIhkgEqIgECAQIBCioiIeIBWiIBsgECARIBCioiIRoqCgoKEgCysACCAXIBiiIBkgFqIgHiAToiAaIBGioKCgoRBHIhEgFCARIBRkIgsbIRQgBiAHIAsbIQcgBkEBaiEGDAELCyAIIAgpA0g3AxggCCAIKQNANwMQIAggBSkDCDcDCCAIIAUpAwA3AwAgACABIAYgAyAHayAIQRBqIAgQrgghCwsgCEGAAmokACALCzwBAX9BxP0KKAIAIABJBEBBwP0KQcD9CigCACAAQQR0EGoiATYCACABRQRAQX8PC0HE/QogADYCAAtBAAvvAgIDfAN/IwBBIGsiCCQAIAIoAgQiCkEATgRAIAMrAAAiBSAFoiADKwAIIgYgBqKgIgdEje21oPfGsD5kBEAgBiAHnyIHoyEGIAUgB6MhBQsgAigCACECIAMgBjkDCCADIAU5AwAgAysAECIFIAWiIAMrABgiBiAGoqAiB0SN7bWg98awPmQEQCAGIAefIgejIQYgBSAHoyEFCyADIAY5AxggAyAFOQMQQbz9CkEANgIAAn9Bf0EEEK8IQQBIDQAaQbz9CkG8/QooAgAiCUEBajYCAEHA/QooAgAgCUEEdGoiCSACKQMINwMIIAkgAikDADcDACAIIAMpAwg3AxggCCADKQMANwMQIAggA0EQaikDCDcDCCAIIAMpAxA3AwBBfyAAIAEgAiAKIAhBEGogCBCuCEF/Rg0AGiAEQbz9CigCADYCBCAEQcD9CigCADYCAEEACyAIQSBqJAAPC0HTywFBhL0BQc0AQb+XARAAAAvjBAIFfAJ/AkACQAJAIAArAxgiAplESK+8mvLXej5jBEAgACsDECICmURIr7ya8td6PmMEQCAAKwMAIQQgACsDCCICmURIr7ya8td6PmNFDQIgBJlESK+8mvLXej5jQQJ0DwsgACsDCCACIAKgoyIEIASiIAArAwAgAqOhIgJEAAAAAAAAAABjDQMgAkQAAAAAAAAAAGQEQCABIAKfIAShIgI5AwAgASAERAAAAAAAAADAoiACoTkDCEECDwsgASAEmjkDAAwCCwJ/An8gACsDACACoyAAKwMQIAJEAAAAAAAACECioyIEIASgIAQgBKIiA6IgBCAAKwMIIAKjIgWioaAiAiACoiIGIAVEAAAAAAAACECjIAOhIgMgAyADRAAAAAAAABBAoqKioCIDRAAAAAAAAAAAYwRAIAOanyACmhCoASECIAEgBiADoZ9EAAAAAAAA4D+iEKsHIgMgA6AiAyACRAAAAAAAAAhAoxBKojkDACABIAMgAkQYLURU+yEJQKBEGC1EVPshCUCgRAAAAAAAAAhAoxBKojkDCCADIAJEGC1EVPshCcCgRBgtRFT7IQnAoEQAAAAAAAAIQKMQSqIhAkEQDAELIAEgA58gAqFEAAAAAAAA4D+iIgUQqwcgApogBaEQqwegIgI5AwBBASADRAAAAAAAAAAAZA0BGiABIAJEAAAAAAAA4L+iIgI5AxBBCAsgAWogAjkDAEEDCyEHQQAhAANAIAAgB0YNAyABIABBA3RqIgggCCsDACAEoTkDACAAQQFqIQAMAAsACyABIASaIAKjOQMAC0EBIQcLIAcLegEDfyMAQRBrIgEkAAJAIABBuP0KKAIATQ0AQbT9CigCACAAQQR0EGoiA0UEQCABQYUqNgIIIAFBuQM2AgQgAUGQuAE2AgBBiPYIKAIAQbKBBCABECAaQX8hAgwBC0G4/QogADYCAEG0/QogAzYCAAsgAUEQaiQAIAILDQAgACgCCBAYIAAQGAuJAQIEfwF8IwBBEGsiAiQAIAEoAgQhAyABKAIAIQQgAEGDyQFBABAeQQAhAQNAIAEgBEcEQCABBEAgAEG6oANBABAeCyADIAFBGGxqIgUrAwAhBiACIAUrAwg5AwggAiAGOQMAIABBpsgBIAIQHiABQQFqIQEMAQsLIABBwM0EQQAQHiACQRBqJAALsQICBH8CfCMAQfAAayIBJABBvPwKQbz8CigCACIEQQFqNgIAAnwgACgCECIDKAKIASICRQRARAAAAAAAAElAIQVEAAAAAAAASUAMAQsgArdEGC1EVPshCUCiRAAAAAAAgGZAoyIFEEpEAAAAAAAA8D8gBRBXoUQAAAAAAABJQKIQMiEFRAAAAAAAAPA/oEQAAAAAAABJQKIQMgshBiAAQY/FAxAbGiADKALcASICBEAgACACEIoBIABB3wAQZQsgASAFOQNgIAEgBjkDWCABIAQ2AlAgAEHY1QQgAUHQAGoQHiABQShqIgIgA0E4akEoEB8aIABEAAAAAAAAAAAgAhCCBiAARAAAAAAAAPA/IAEgA0HgAGpBKBAfIgEQggYgAEHR0gQQGxogAUHwAGokACAEC4wBAQJ/IwBBEGsiACQAAkAgAEEMaiAAQQhqEBMNAEGIgQsgACgCDEECdEEEahBPIgE2AgAgAUUNACAAKAIIEE8iAQRAQYiBCygCACAAKAIMQQJ0akEANgIAQYiBCygCACABEBJFDQELQYiBC0EANgIACyAAQRBqJABBxIMLQayBCzYCAEH8ggtBKjYCAAuuAQEGfwJAAkAgAARAIAAtAAxBAUYEQCABIAApAxBUDQILIAEgACkDGFYNASABpyEEIAAoAgAiBQRAQQEgACgCCHQhAwsgA0EBayEGA0BBACEAIAIgA0YNAwJAAkAgBSACIARqIAZxQQJ0aigCACIHQQFqDgIBBQALIAciACgCECkDCCABUQ0ECyACQQFqIQIMAAsAC0Gl1QFBjL4BQeQDQeSkARAAAAtBACEACyAACwsAIABB3awEEBsaCzEBAX8jAEEQayICJAAgAkEANgIIIAJBADYCDCABIAJBCGpBugIgABCeBCACQRBqJAALJQEBfyMAQRBrIgIkACACIAE2AgAgAEGdgwQgAhAeIAJBEGokAAsNACAAIAFBx4YBEOgGC4gBAgN/AXwjAEEgayIEJAADQCACIAVGBEAgAwRAIAErAwAhByAEIAErAwg5AwggBCAHOQMAIABBx4YBIAQQHgsgAEHu/wQQGxogBEEgaiQABSABIAVBBHRqIgYrAwAhByAEIAYrAwg5AxggBCAHOQMQIABBx4YBIARBEGoQHiAFQQFqIQUMAQsLC7MBAQR/IwBBQGoiAyQAAkAgAi0AAyIEQf8BRgRAIAItAAAhBCACLQABIQUgAyACLQACNgIQIAMgBTYCDCADIAQ2AgggA0EHNgIEIAMgATYCACAAQenHAyADEIQBDAELIAItAAAhBSACLQABIQYgAi0AAiECIAMgBDYCNCADIAI2AjAgAyAGNgIsIAMgBTYCKCADQQk2AiQgAyABNgIgIABBz8cDIANBIGoQhAELIANBQGskAAscACAAKAIQKAIMQQJ0QfC/CGooAgAgASACEL0IC38BAn8jAEEgayIEJAAgACgCECgCDCAEIAM2AhQgBCABNgIQQQJ0QfC/CGooAgAiAUH/xwMgBEEQahCEAUEAIQADQCAAIANGBEAgBEEgaiQABSAEIAIgAEEEdGoiBSkDCDcDCCAEIAUpAwA3AwAgASAEENcCIABBAWohAAwBCwsLigUCA38GfCMAQZABayIEJAACQAJAQeDjCigCAC8BKEENTQRAIAAQiQYMAQsgACgCECIFKAKIAbdEGC1EVPshCUCiRAAAAAAAgGZAoyEHIARCADcDSCAEQgA3A0ACQCABQQJGBEAgAiAEQfAAaiADIAdBAhDQBiAEQUBrIgJB2wAQfyAEIAQpA3g3AxggBCAEKQNwNwMQIAIgBEEQahDXAiAEIAQpA4gBNwMIIAQgBCkDgAE3AwAgAiAEENcCDAELIAIgBEHwAGogA0QAAAAAAAAAAEEDENAGIAQrA3AhCCAEKwOIASEJAnwgBSgCiAFFBEAgCUQAAAAAAADQP6IhCiAEKwN4IgshDCAIDAELIAlEAAAAAAAA0D+iIgogBxBXoiAEKwN4IgugIQwgCiAHEEqiIAigCyEHIAQgDDkDaCAEIAs5A1ggBCAHOQNgIAQgCDkDUCAEQUBrIgJBKBB/IAQgBCkDaDcDOCAEIAQpA2A3AzAgAiAEQTBqENcCIAIgChCWAiAEIAQpA1g3AyggBCAEKQNQNwMgIAIgBEEgahDXAiACIAkQlgILIARBQGsiBkGWzQMQ8gEgBUE4aiECIARBQGsiAwJ8IAUrA5ABIgdEAAAAAAAAAABkBEAgBiAHIAIQiAYgBSsDkAEMAQsgBEFAa0QAAAAAAAAAACACEIgGRAAAAAAAAPA/CyAFQeAAahCIBgJAIAMQJEUNACADECgEQCAELQBPIgJFDQMgBCACQQFrOgBPDAELIAQgBCgCREEBazYCRAsgBEFAayICQd0AQSkgAUECRhsQfyAAQb7LAyACEMIBEMADIAIQXAsgBEGQAWokAA8LQeKPA0Gg/ABBigFBqdkAEAAAC4QBAQZ/IwBBEGsiASQAA0ACQAJAIAAgAmotAAAiBARAIATAIgVBMGtBCUsNAiADQf//A3EiBiAEQX9zQfEBckH//wNxQQpuTQ0BIAEgADYCAEGH/gAgARAqCyABQRBqJAAgA0H//wNxDwsgBSAGQQpsakHQ/wNqIQMLIAJBAWohAgwACwALDAAgAEEAQQAQxQgaC5YDAgN/A3wjAEHgAGsiBiQAIAZCADcDWCAGQgA3A1AgACgCECIHKwMYIQkgBysDECELIAcrAyghCiAGQUBrIAcrAyA5AwAgBiAFIAqhIApBuNsKLQAAIgcbOQNIIAYgCzkDMCAGIAUgCaEgCSAHGzkDOCAGQdAAaiIIQd+CASAGQTBqEH4gACABIAgQuwEQcQJAIAAoAhAoAgwiB0UNACAHKAIALQAARQ0AIAcrA0AhCSAGIAcrAzg5AyAgBiAFIAmhIAlBuNsKLQAAGzkDKCAIQemCASAGQSBqEH4gACACIAgQuwEQcSAAKAIQKAIMIgcrAyAhCSAGIAcrAxhEAAAAAAAAUkCjOQMQIAhBmoYBIAZBEGoQfiAAIAMgCBC7ARBxIAYgCUQAAAAAAABSQKM5AwAgCEGahgEgBhB+IAAgBCAIELsBEHELQQEhBwNAIAcgACgCECIIKAK0AUpFBEAgCCgCuAEgB0ECdGooAgAgASACIAMgBCAFEMMIIAdBAWohBwwBCwsgBkHQAGoQXCAGQeAAaiQAC8gBAgJ/BXwjAEEgayIFJAAgASgCMEUEQCABKwMYIQggASsDECEJIAErAyghByAAKAIQIgQrAxghBiAFIAQrAxAiCiABKwMgoDkDECAFIAMgBiAHoCIHoSAHQbjbCi0AACIEGzkDGCAFIAkgCqA5AwAgBSADIAggBqAiBqEgBiAEGzkDCCACQbzJAyAFEH4LQQAhBANAIAQgASgCME5FBEAgACABKAI4IARBAnRqKAIAIAIgAxDECCAEQQFqIQQMAQsLIAVBIGokAAu0EQIPfwZ8IwBBgAJrIgQkACAAKAIQLwGyAUEBENoCQbjbCi0AAEEBRgRAIAAoAhAiAysDKCADKwMYoCITRAAAAAAAAFJAoyEWCyAEQgA3A/gBIARCADcD8AEgAEEBQYwrEIgBGiAAQQFBiCgQiAEaQdTbCiAAQQFB+PcAEIgBNgIAQdDbCiAAQQFBgyEQiAE2AgAgAEECQYwrEIgBGiAAKAIQLQBxIgNBEHEEQCAAQQFB2tkAEIgBGiAAKAIQLQBxIQMLIANBAXEEQCAAQQJB9dkAEIgBGiAAKAIQLQBxIQMLIANBIHEEQCAAQQJB2tkAEIgBGiAAKAIQLQBxIQMLIANBAnEEQCAAQQJB8NkAEIgBGiAAKAIQLQBxIQMLIANBBHEEfyAAQQJB6NkAEIgBGiAAKAIQLQBxBSADC0EIcQRAIABBAEH12QAQiAEhDCAAQQBB6vcAEIgBIQ0gAEEAQYIhEIgBIQoLIABBAEH8vwEQiAEhDiAAEBwhB0EDSSEPA0ACQAJAIAcEQCATIAcoAhAiAysDGCISoSASQbjbCi0AABshEiADKwMQIRQCQCAPRQRAIAQgAygClAErAxBEAAAAAAAAUkCiOQPQASAEIBI5A8gBIAQgFDkDwAEgBEHwAWpB5IIBIARBwAFqEH5BAyEDA0AgAyAAKAIQLwGyAU8NAiAEIAcoAhAoApQBIANBA3RqKwMARAAAAAAAAFJAojkDACAEQfABakHtggEgBBB+IANBAWohAwwACwALIAQgEjkD6AEgBCAUOQPgASAEQfABakHpggEgBEHgAWoQfgsgB0GMKyAEQfABaiIFELsBEOkBIAQgBygCECsDUEQAAAAAAABSQKM5A7ABIAVB+IIBIARBsAFqEH4gB0HQ2wooAgAgBRC7ARBxIAQgBygCECIDKwNYIAMrA2CgRAAAAAAAAFJAozkDoAEgBUH4ggEgBEGgAWoQfiAHQdTbCigCACAFELsBEHECQCAHKAIQIgMoAnwiBkUNACAGLQBRQQFHDQAgBisDQCESIAQgBisDODkDkAEgBCATIBKhIBJBuNsKLQAAGzkDmAEgBUHpggEgBEGQAWoQfiAHQdrZACAFELsBEOkBIAcoAhAhAwsgAygCCCgCAEHEogEQTUUEQCAHIAMoAgwgBEHwAWoiAyATEMQIAkAgAxAkRQ0AIAMQKARAIAQtAP8BIgNFDQQgBCADQQFrOgD/AQwBCyAEIAQoAvQBQQFrNgL0AQsgB0GIKCAEQfABahC7ARDpAQwDC0G03AooAgBFDQIgBygCECgCCCIDBH8gAygCBCgCAEE8RgVBAAtFDQICQCAHKAIQKAIMIgYoAggiBUECSw0AIAdBtiYQJyIDRQRAQQghBQwBC0EIIANBAEEAEKkEIgMgA0EDSRshBQsgBbghFEEAIQMDQCADIAVGBEAgB0G03AooAgAgBEHwAWoQuwEQcQwECyADBEAgBEHwAWpBIBDWBAsgBAJ8IAYoAghBA08EQCAGKAIsIANBBHRqIggrAwhEAAAAAAAAUkCjIRIgCCsDAEQAAAAAAABSQKMMAQsgBygCECIIKwMoIRIgA7ggFKNEGC1EVPshCUCiIhUgFaAiFRBXIBJEAAAAAAAA4D+ioiESIAgrAyAhFyAVEEogF0QAAAAAAADgP6KiCzkDgAEgBCAWIBKhIBJBuNsKLQAAGzkDiAEgBEHwAWpB84IBIARBgAFqEH4gA0EBaiEDDAALAAsgACAOIAwgDSAKIBMQwwggBEHwAWoQXCAAQfbeAEEAEGsEQCAAEPMJCyABBEAgASAQOgAACyACBEAgAiALOgAAC0EAENoCIARBgAJqJAAgEw8LQeKPA0Gg/ABBigFBqdkAEAAACwJAQaDbCigCAEEATA0AIAAgBxAsIQUDQCAFRQ0BAkAgBSgCECIDLQBwQQZGDQBBACEGIAMoAggiCEUNAANAIAgoAgQgBk0EQCAFQYwrIARB8AFqIgYQuwEQ6QEgBSgCECIDKAJgIggEQCAIKwNAIRIgBCAIKwM4OQNwIAQgEyASoSASQbjbCi0AABs5A3ggBkHpggEgBEHwAGoQfiAFQfXZACAGELsBEOkBIAUoAhAhAwsCQCADKAJsIgZFDQAgBi0AUUEBRw0AIAYrA0AhEiAEIAYrAzg5A2AgBCATIBKhIBJBuNsKLQAAGzkDaCAEQfABaiIDQemCASAEQeAAahB+IAVB2tkAIAMQuwEQ6QEgBSgCECEDCyADKAJkIgYEfyAGKwNAIRIgBCAGKwM4OQNQIAQgEyASoSASQbjbCi0AABs5A1ggBEHwAWoiA0HpggEgBEHQAGoQfiAFQfDZACADELsBEOkBIAUoAhAFIAMLKAJoIgNFDQIgAysDQCESIAQgAysDODkDQCAEIBMgEqEgEkG42wotAAAbOQNIIARB8AFqIgNB6YIBIARBQGsQfiAFQejZACADELsBEOkBDAILIAYEfyAEQfABakE7ENYEIAUoAhAoAggFIAgLKAIAIgggBkEwbCIJaiIDKAIIBH8gAysDGCESIAQgAysDEDkDMCAEIBMgEqEgEkG42wotAAAbOQM4IARB8AFqQa/JAyAEQTBqEH5BASEQIAUoAhAoAggoAgAFIAgLIAlqIgMoAgwEQCADKwMoIRIgBCADKwMgOQMgIAQgEyASoSASQbjbCi0AABs5AyggBEHwAWpB0ckDIARBIGoQfkEBIQsLQQAhAwNAIAUoAhAoAggiCCgCACIRIAlqKAIEIANNBEAgBkEBaiEGDAIFIAMEfyAEQfABakEgENYEIAUoAhAoAggoAgAFIBELIAlqKAIAIANBBHRqIggrAwghEiAEIAgrAwA5AxAgBCATIBKhIBJBuNsKLQAAGzkDGCAEQfABakHpggEgBEEQahB+IANBAWohAwwBCwALAAsACyAAIAUQMCEFDAALAAsgACAHEB0hBwwACwALpgEBAn8gAigCEC0AhgEgAhAhIQVBAUYEQCAFQToQzQFBAWohBQsgBRCEBCEEAn8gAigCEC0AhgFBAUYEQCACEC0gBSAEEI4GDAELIAUgBBDBAwshAiABQb7OAyAAEQAAGiABIAIgABEAABogBBAYAkAgA0UNACADLQAARQ0AIAMgAxCEBCICEMEDIQMgAUH74gEgABEAABogASADIAARAAAaIAIQGAsLsQoCCX8DfCMAQdAAayIHJAAgASgCECIEKwMoIQ4gASgCTCgCBCgCBCEFQbjbCi0AAEEBRgRAIA4gBCsDGKAhDQsgBCsDICEPIAUgAkGoyQMgACsD4AIQjQMgBSACQb7OAyAPRAAAAAAAAFJAoxCNAyAFIAJBvs4DIA5EAAAAAAAAUkCjEI0DIAdBCjsAQCACIAdBQGsgBREAABogARAcIQQDQCAEBEAgBCgCEC0AhgFFBEAgBBAhEIQEIQAgBBAhIAAQwQMhBiACQcDKAyAFEQAAGiACIAYgBREAABogABAYIAcgBCgCECIAKQMYNwM4IAcgACkDEDcDMCAFIAIgB0EwaiANEI8GAn8gBCgCECgCeCIALQBSQQFGBEAgBEHw2wooAgAQRQwBCyAAKAIACyIAEIQEIQYCfyAEKAIQKAJ4LQBSQQFGBEAgACAGEMEDDAELIAQQLSAAIAYQjgYLIQAgBSACQb7OAyAEKAIQKwMgEI0DIAUgAkG+zgMgBCgCECsDKBCNAyACQb7OAyAFEQAAGiACIAAgBREAABogBhAYIARB/NsKKAIAQeKmARCPASEAIAJBvs4DIAURAAAaIAIgACAFEQAAGiAEKAIQKAIIKAIAIQAgAkG+zgMgBREAABogAiAAIAURAAAaIARB3NsKKAIAQYX1ABCPASEAIAJBvs4DIAURAAAaIAIgACAFEQAAGiAEQeDbCigCAEHx/wQQjwEiAC0AAEUEQCAEQdzbCigCAEHfDhCPASEACyACQb7OAyAFEQAAGiACIAAgBREAABogB0EKOwBAIAIgB0FAayAFEQAAGgsgASAEEB0hBAwBCwsgARAcIQoDQCAKBEAgASAKECwhBgNAAkAgBgRAQfH/BCEJQfH/BCELIAMEQCAGQdMbECciAEHx/wQgABshCyAGQY8cECciAEHx/wQgABshCQsgBigCECIAKAIIIghFDQEgCCgCBCEMQQAhAEEAIQQDQCAEIAxGBEAgAkHvnQEgBREAABpBACEIIAUgAiAGQTBBACAGKAIAQQNxQQNHG2ooAiggCxDGCCAFIAIgBkFQQQAgBigCAEEDcUECRxtqKAIoIAkQxgggB0IANwNIIAdCADcDQCACQb7OAyAFEQAAGiAHIAA2AiAgB0FAayIAQcwXIAdBIGoQfiACIAAQuwEgBREAABogABBcA0AgCCAGKAIQIgAoAggiBCgCBE8NBCAEKAIAIAhBMGxqIgAoAgQhCSAAKAIAIQBBACEEA0AgBCAJRgRAIAhBAWohCAwCBSAHIAAgBEEEdGoiCykDCDcDGCAHIAspAwA3AxAgBSACIAdBEGogDRCPBiAEQQFqIQQMAQsACwALAAUgCCgCACAEQTBsaigCBCAAaiEAIARBAWohBAwBCwALAAsgASAKEB0hCgwDCyAAKAJgIgAEQCAAKAIAEIQEIQAgBkEwQQAgBigCAEEDcUEDRxtqKAIoEC0gBigCECgCYCgCACAAEI4GIQQgAkG+zgMgBREAABogAiAEIAURAAAaIAAQGCAHIAYoAhAoAmAiAEFAaykDADcDCCAHIAApAzg3AwAgBSACIAcgDRCPBgsgBkHs3AooAgBB4qYBEI8BIQAgAkG+zgMgBREAABogAiAAIAURAAAaIAZBzNwKKAIAQYX1ABCPASEAIAJBvs4DIAURAAAaIAIgACAFEQAAGiAHQQo7AEAgAiAHQUBrIAURAAAaIAEgBhAwIQYMAAsACwsgAkH4iQQgBREAABogB0HQAGokAAuCAQECfyAAECEhBSAAEC0hAAJAIAVFDQAgBS0AAEUNACACRQRAIAMgAygCDEEBajYCDAtBfyEEIAFB0OABIAAoAkwoAgQoAgQRAABBf0YNACAAIAEgBRCSBkF/Rg0AIAIEQCABQf7IASAAKAJMKAIEKAIEEQAAQX9GDQELQQEhBAsgBAvvAwEHfyMAQRBrIgckAAJAAkAgAC0AAEECcUUNAAJAIAAgAUEAIAMQyAgiBEEBag4CAgEAC0EBIQQLIAAQ7AEhCSAAEC0hBgJAIAlFDQAgAkEAQYABIAIoAgARAwAhBSAEIQgDQCAFRQRAIAghBAwCCwJAAkAgAC0AAEECcUUNAEHU4gooAgAiBARAIAUoAhAgBCgCEEYNAgtB2OIKKAIAIgRFDQAgBSgCECAEKAIQRg0BCyAJKAIMIAUoAhBBAnRqKAIAIAUoAgxGDQAgBigCTCgCBCgCBCEKAkAgCEUEQEF/IQQgAUGayQEgChEAAEF/Rg0FIAMgAygCDEEBajYCDAwBC0F/IQQgAUG57QQgChEAAEF/Rg0EIAcgAykCCDcDCCAHIAMpAgA3AwAgBiABIAcQ2AJBf0YNBAsgBiABIAUoAghBARC8AkF/Rg0DIAFB2OABIAYoAkwoAgQoAgQRAABBf0YNAyAGIAEgCSgCDCAFKAIQQQJ0aigCAEEBELwCQX9GDQMgCEEBaiEICyACIAVBCCACKAIAEQMAIQUMAAsACyAEQQBKBEBBfyEEIAFB/sgBIAYoAkwoAgQoAgQRAABBf0YNASADIAMoAgxBAWs2AgwLIAAgACgCAEEIcjYCAEEAIQQLIAdBEGokACAEC8cBAQJ/AkAgAkUNACAAEC0hBCAAIAIQRSIALQAARQ0AQX8hAyABQfviASAEKAJMKAIEKAIEEQAAQX9GDQACQCAAEHYEQCAEIAEgAEEBELwCQX9HDQEMAgsgAEE6EM0BIgIEQCACQQA6AAAgBCABIABBABC8AkF/Rg0CIAFB++IBIAQoAkwoAgQoAgQRAABBf0YNAiAEIAEgAkEBakEAELwCQX9GDQIgAkE6OgAADAELIAQgASAAQQAQvAJBf0YNAQtBACEDCyADC7oBAQN/IwBBEGsiBiQAIAEQLSEHIAYgBCkCCDcDCCAGIAQpAgA3AwACf0F/IAcgAiAGENgCQX9GDQAaQX8gASACEJAGQX9GDQAaIAEoAgAiBUEIcUUEQEF/IAEgAiADIAQQyQhBf0YNARogASgCACEFCyAEKAIEIAVBAXZB+P///wdxaiAEKAIAIAAoAgBBAXZB+P///wdxaikDADcDACACQffYBCAHKAJMKAIEKAIEEQAACyAGQRBqJAALtgEBAX8CQCACKAIEIAEoAgBBAXZB+P///wdxaikDACACKAIAIAAoAgBBAXZB+P///wdxaikDAFoNAAJAIAAgARC9Ag0AIAAgARAsDQBBASEDDAELIAEQ7AEiAEUNACAAKAIIIgFBAEGAASABKAIAEQMAIQEDQCABQQBHIQMgAUUNASAAKAIMIAEoAhBBAnRqKAIAIAEoAgxHDQEgACgCCCICIAFBCCACKAIAEQMAIQEMAAsACyADC8ICAQZ/IAAQeSEDA0ACQCADRQRAQQAhAAwBCwJAAkACQAJAIAMoAkwoAgBB4O4JRgRAIAMpAwinIgBBAXFFDQEMAgsgAxAhIgBFDQELIAAtAABBJUcNAQsCQCADEOwBIgZFDQAgAygCRBDsASIHRQ0AQQAhACADEDkQ7AEoAggQmgEiBEEAIARBAEobIQQDQCAAIARGDQECQCAAQQJ0IgUgBigCDGooAgAiCEUNACAHKAIMIAVqKAIAIgVFDQAgCCAFEE0NAwsgAEEBaiEADAALAAsgA0EAELECIgAEQCAAKAIIEJoBQQBKDQEgACgCDBCaAUEASg0BCyADIAEgAhDNCBoMAQtBfyEAIAMgAUEAIAIQ0ghBf0YNASADIAEgAhDRCEF/Rg0BIAMgASACENAIQX9GDQELIAMQeCEDDAELCyAAC3sBAn8gAUFQQQAgASgCAEEDcUEDRiIDG2oiAigCKCEEIAAgAUEAQTAgAxtqIgEoAigQ5gEhAyAAKAI0IANBIGogAhDXBCAAKAI4IANBGGogAhDXBCAAIAQQ5gEhAiAAKAI0IAJBHGogARDXBCAAKAI4IAJBFGogARDXBAutAQIEfwF+AkAgAUUNAAJAIAAQvgMoAgAiBSABIAIQlwQiAwRAIAMgAykDACIHQgF8Qv///////////wCDIAdCgICAgICAgICAf4OENwMADAELIAEQQCIGQQlqIQMCQCAABEAgA0EBEBohAwwBCyADEE8iA0UNAgsgA0KBgICAgICAgIB/QgEgAhs3AwAgA0EIaiABIAZBAWoQHxogBSADEJgPCyADQQhqIQQLIAQLaAECfyMAQRBrIgMkAEF/IQQgAiACKAIMQQFrNgIMIAMgAikCCDcDCCADIAIpAgA3AwAgACABIAMQ2AJBf0cEQEF/QQAgAUGW2AMgACgCTCgCBCgCBBEAAEF/RhshBAsgA0EQaiQAIAQLjAUBCn8jAEEQayIJJABBfyEDAkAgACABIAIQzQhBf0YNACAAQQAQsQIhByAAEBwhBQNAIAVFBEBBACEDDAILIAAgBSACEMwIBEBBfyEDIAAgBSABIAcEfyAHKAIIBUEACyACEMsIQX9GDQILIAAgBRAsIQQgBSEKA0AgBARAAkAgCiAEIARBMGsiCCAEKAIAIgNBA3FBAkYbKAIoIgZGDQAgACAGIAIQzAggBCgCACEDRQ0AIAQgCCADQQNxQQJGGygCKCEGQX8hAyAAIAYgASAHBH8gBygCCAVBAAsgAhDLCEF/Rg0EIAQgCCAEKAIAIgNBA3FBAkYbKAIoIQoLIAIoAgggA0EBdkH4////B3FqKQMAIAIoAgAgACgCAEEBdkH4////B3FqKQMAVARAIAcEfyAHKAIMBUEACyEGIARBUEEAIANBA3EiA0ECRxtqKAIoIARBMEEAIANBA0cbaigCKCILEC0hCCAJIAIpAgg3AwggCSACKQIANwMAQX8hAyAIIAEgCRDYAkF/Rg0EIAsgARCQBkF/Rg0EIAQgAUHU4gooAgAQyghBf0YNBCABQcHLA0GfzQMgCxAtEIICGyAIKAJMKAIEKAIEEQAAQX9GDQQgARCQBkF/Rg0EIAQgAUHY4gooAgAQyghBf0YNBAJAIAQtAABBCHFFBEAgBCABIAYgAhDJCEF/Rw0BDAYLIAQgAUEBIAIQyAhBf0YNBQsgAigCCCAEKAIAQQF2Qfj///8HcWogAigCACAAKAIAQQF2Qfj///8HcWopAwA3AwAgAUH32AQgCCgCTCgCBCgCBBEAAEF/Rg0ECyAAIAQQMCEEDAELCyAAIAUQHSEFDAALAAsgCUEQaiQAIAMLhAQBB38jAEEQayIFJAACfwJAIAINACAAKAJERQ0AQfH/BCEGQam/ASEHQQAMAQsgAC0AGCEEIAAQ3AUhBkHU4gogAEECQdMbQQAQIjYCAEHY4gogAEECQY8cQQAQIjYCAEGtyANB8f8EIAYbIQZBs/YAQfH/BCAEQQFxGyEHQQELIQoCfwJAIAAQISIERQ0AIAQtAABBJUYNAEG+zgMhCEEBDAELQfH/BCEEQfH/BCEIQQALIQkgBSADKQIINwMIIAUgAykCADcDAAJ/QX8gACABIAUQ2AJBf0YNABpBfyABIAYgACgCTCgCBCgCBBEAAEF/Rg0AGiAJIApyBEBBfyABIAcgACgCTCgCBCgCBBEAAEF/Rg0BGkF/IAFBqMkDIAAoAkwoAgQoAgQRAABBf0YNARoLIAkEQEF/IAAgASAEEJIGQX9GDQEaC0F/IAEgCCAAKAJMKAIEKAIEEQAAQX9GDQAaQX8gAUHw2AMgACgCTCgCBCgCBBEAAEF/Rg0AGiADIAMoAgxBAWo2AgwgAEEAELECIgQEQEF/IAAgAUGI+gAgBCgCECACIAMQkQZBf0YNARpBfyAAIAFB6J8BIAQoAgggAiADEJEGQX9GDQEaQX8gACABQe+dASAEKAIMIAIgAxCRBkF/Rg0BGgsgACAAKAIAQQhyNgIAQQALIAVBEGokAAtCACACKAIAIAAoAgBBAXZB+P///wdxaiABNwMAIAAQeSEAA0AgAARAIAAgASACENMIIQEgABB4IQAMAQsLIAFCAXwLgwEBAX8gACAAKAIAQXdxNgIAIAAQeSECA0AgAgRAIAJBABDUCCACEHghAgwBCwsCQCABRQ0AIAAQHCEBA0AgAUUNASABIAEoAgBBd3E2AgAgACABECwhAgNAIAIEQCACIAIoAgBBd3E2AgAgACACEDAhAgwBCwsgACABEB0hAQwACwALC9ACAQJ/IwBBQGoiAiQAAkAgAEGp9wAQJyIDRQ0AIAMsAABBMGtBCUsNACADQQBBChCpBCIDQQBIIANBPGtBREtyDQBBtKAKIAM2AgALIAJBADYCPCAAQQEQ1AggAiAAKAJMKAIQQQFqEMMBNgIwIAIgACgCTCgCGEEBahDDATYCNCACIAAoAkwoAiBBAWoQwwE2AjggAEIBIAJBMGoiAxDTCBoCQCAAIAFBASADENIIQX9GBEAgAiACKQI4NwMIIAIgAikCMDcDACACEJMGDAELIAAgASACQTBqENEIQX9GBEAgAiACKQI4NwMYIAIgAikCMDcDECACQRBqEJMGDAELIAAgASACQTBqENAIIAIgAikCODcDKCACIAIpAjA3AyAgAkEgahCTBkF/Rg0AQbSgCkGAATYCACABIAAoAkwoAgQoAggRAgAaCyACQUBrJAALjQUBD39BjscDIQICQCAARQ0AIAAtAABFDQAgAUEiOgAAIAAsAAAiAkEta0H/AXFBAkkgAkEwa0EKSXIhCSABQQFqIQNBtKAKKAIAIQ8gACEMA0AgCiIQQQFzIQoCQANAIAwhBQJ/AkACQAJAAkACQAJAAkAgAkH/AXEiCwRAIAVBAWohDCACwCEIIAYgC0EiR3JFBEAgA0HcADoAAEEBIQRBACEGIANBAWoMCQsgBg0CIAUtAABB3ABHDQJBASEGIAwtAAAiBUHFAGsiDkEXS0EBIA50QY2FggRxRXINAQwDCyADQSI7AAACQCAEQQFxDQAgB0EBRgRAIAAtAABBLWtB/wFxQQJJDQELQdC/CCECA0AgAigCACIDRQRAIAAPCyACQQRqIQIgAyAAEC4NAAsLIAEhAgwLCyAFQSJGIAVB7ABrIg5BBk1BAEEBIA50QcUAcRtyDQELIAlFDQQgC0Etaw4CAQIDC0EBIQQgAwwEC0EAIQYgB0EARyAEciEEIAdFIQkgAwwDC0EAIQYgDUEARyAEciEEIA1FIQkgDUEBaiENIAMMAgsgCEEwayIFQQpJIQkgBUEJSyAEciEEQQAhBiADDAELIAhBX3FB2wBrQWZJIAhBOmtBdklxIAtB3wBHcSAIQQBOcSAEciEEQQAhBkEAIQkgAwsiBSACOgAAIAdBAWohByAFQQFqIQMgDCwAACECIA9FDQACQCACRSAKckEBcQ0AIAgQ2AQgC0HcAEZyDQAgAhDYBEUNAEEAIRAMAgsgAkUgByAPSHINAAtBASEKIAgQ2AQgC0HcAEZyDQEgAhDYBEUNAQsgBUHcFDsAASAFQQNqIQNBASEEQQAhByAQIQoMAAsACyACCwgAQYADEKQKC4gQAgZ/CnwjAEGAAWsiByQAAkAgAQRAIAEtAAAEQCAAKAI8IQkgARDsCSIIRQRAIAEQxwZFIAlFcg0DIAkoAnQiBUUNAyAAIAEgAiADIAQgBREKAAwDCyAHIAApA7gDNwNIIAcgACkDsAM3A0AgB0HgAGogCCAHQUBrEOoJIAcoAmAiCkEATCAHKAJkIgtBAExxDQIgByACKQMINwN4IAcgAikDADcDcCAHIAIpAwg3A2ggByACKQMANwNgQQEgAyADQQFNGyEDIAcrA3ghESAHKwNoIRIgBysDcCEQIAcrA2AhD0EBIQEDQCABIANGBEAgByASOQNoIAcgETkDeCARIBKhIRUgC7chDSAHIA85A2AgByAQOQNwIBAgD6EhFCAKtyEOAkAgBS0AAEUNACAUIA6jIRYCQCAFQfj3ABAuRQ0AIBUgDaMhEwJAIAVBgyEQLgRAIAVBmfcAEC5FDQEgBRBoRQ0DIBMgFmQEQCAWIA2iIQ0MAwsgEyANoiENIBMgDqIhDgwDCyATIA2iIQ0MAgsgEyANoiENCyAWIA6iIQ4LQQQhAQJAIAYtAABFDQAgBkGS7QAQLkUEQEEAIQEMAQsgBkHKsgEQLkUEQEEBIQEMAQsgBkGONRAuRQRAQQIhAQwBCyAGQavuABAuRQRAQQMhAQwBCyAGQYC0ARAuRQ0AIAZBpDcQLkUEQEEFIQEMAQsgBkHV8AAQLkUEQEEGIQEMAQsgBkGGtwEQLkUEQEEHIQEMAQtBBEEIIAZBnjsQLhshAQsgDiAUYwRAIAcCfAJAIAFBCEsNAEEBIAF0IgJByQBxRQRAIAJBpAJxRQ0BIAcgFCAOoSAPoCIPOQNgCyAOIA+gDAELIAcgFCAOoUQAAAAAAADgP6IiDiAPoCIPOQNgIBAgDqELIhA5A3ALAkAgDSAVY0UNAAJAAkACQCABDgkAAAACAgIBAQECCyAHIBEgDaE5A2gMAgsgByANIBKgIg45A2ggByAOIA2hOQN4DAELIAcgESAVIA2hRAAAAAAAAOA/oiINoTkDeCAHIA0gEqA5A2gLIAAtAJkBQSBxRQRAIAcgBykDaDcDOCAHIAcpA2A3AzAgB0HQAGoiASAAIAdBMGoQnQYgByAHKQNYNwNoIAcgBykDUDcDYCAHIAcpA3g3AyggByAHKQNwNwMgIAEgACAHQSBqEJ0GIAcgBykDWDcDeCAHIAcpA1A3A3AgBysDcCEQIAcrA2AhDwsgDyAQZARAIAcgDzkDcCAHIBA5A2ALIAcrA2giDSAHKwN4Ig9kBEAgByANOQN4IAcgDzkDaAsgCUUNBCAAKAJIIQMgByAHKQN4NwMYIAcgBykDcDcDECAHIAcpA2g3AwggByAHKQNgNwMAIAghAUEAIQYjAEHQAGsiAiQAIAJCADcDSCACQgA3A0ACQAJAAkACQCAABEAgAUUNASABKAIIIgVFDQIgBS0AAEUNAyABKAIcIQUgAiADNgI0IAIgBTYCMCACQUBrIQMjAEEwayIFJAAgBSACQTBqIgg2AgwgBSAINgIsIAUgCDYCEAJAAkACQAJAAkACQEEAQQBBlDMgCBBgIglBAEgNACAJQQFqIQgCQCADEEsgAxAkayIKIAlLDQAgCCAKayEKIAMQKARAQQEhBiAKQQFGDQELIAMgChC9AUEAIQYLIAVCADcDGCAFQgA3AxAgBiAJQRBPcQ0BIAVBEGohCiAJIAYEfyAKBSADEHMLIAhBlDMgBSgCLBBgIghHIAhBAE5xDQIgCEEATA0AIAMQKARAIAhBgAJPDQQgBgRAIAMQcyAFQRBqIAgQHxoLIAMgAy0ADyAIajoADyADECRBEEkNAUGTtgNBoPwAQeoBQfgeEAAACyAGDQQgAyADKAIEIAhqNgIECyAFQTBqJAAMBAtBxqYDQaD8AEHdAUH4HhAAAAtBrZ4DQaD8AEHiAUH4HhAAAAtB+c0BQaD8AEHlAUH4HhAAAAtBo54BQaD8AEHsAUH4HhAAAAsCQCADECgEQCADECRBD0YNAQsgAkFAayIDECQgAxBLTwRAIANBARC9AQsgAkFAayIDECQhBSADECgEQCADIAVqQQA6AAAgAiACLQBPQQFqOgBPIAMQJEEQSQ0BQZO2A0Gg/ABBrwJBxLIBEAAACyACKAJAIAVqQQA6AAAgAiACKAJEQQFqNgJECwJAIAJBQGsQKARAIAJBADoATwwBCyACQQA2AkQLIAJBQGsiAxAoIQUCQCAAKAIAQQQgAyACKAJAIAUbIgNBABDSAyIFBEAgACAFKAIQIgUoAgwiAzYCXCAAIAUoAgA2AmAMAQsgAiADNgIgQeX6BCACQSBqECogACgCXCEDCwJAIANFDQAgAygCACIDRQ0AIAIgBykDGDcDGCACIAcpAxA3AxAgAiAHKQMINwMIIAIgBykDADcDACAAIAEgAiAEIAMRBwALIAItAE9B/wFGBEAgAigCQBAYCyACQdAAaiQADAQLQcS/AUHnvQFBMUG5ngEQAAALQawmQee9AUEyQbmeARAAAAtB7pgBQee9AUEzQbmeARAAAAtB5MgBQee9AUE0QbmeARAAAAsMBAUgAiABQQR0aiIMKwAAIQ0gESAMKwAIIg4QIyERIBAgDRAjIRAgEiAOECkhEiAPIA0QKSEPIAFBAWohAQwBCwALAAtB6MgBQca6AUGqBUGIlgEQAAALQcKZAUHGugFBqQVBiJYBEAAACyAHQYABaiQAC8UaAwd/CXwBfiMAQTBrIgYkACACQQQ2AiAgAiABNgIAAkAgACgCECIEBEAgASAEIAAoAhRBBEGeAhDsAw0BCyABIQQgACgCGCEHIwBB0AFrIgMkACACIAc2AiADQCAEIgBBAWohBCAALQAAQSBGDQALIANB/wE2AnggAyADQYQBaiIFNgJgIAMgA0GAAWoiCDYCZCADIANB/ABqIgk2AmggAyADQfgAajYCbAJAAkACQAJAAkAgAEGrEyADQeAAahBRQQJMBEAgABBAQQRHDQEgAyAJNgJYIAMgCDYCVCADIAU2AlAgAEG5EyADQdAAahBRQQNHDQEgAyADKAKEASIAQQR0IAByNgKEASADIAMoAoABIgBBBHQgAHI2AoABIAMgAygCfCIAQQR0IAByNgJ8C0EAIQACQAJAAkACQCAHDgYABQECCAgDCyADKAKEAbhEAAAAAADgb0CjIgwgAygCgAG4RAAAAAAA4G9AoyINIAMoAny4RAAAAAAA4G9AoyIOECMQIyEKIAMoAni4RAAAAAAA4G9AoyERAkAgCkQAAAAAAAAAAGRFDQAgCiAMIA0gDhApECmhIg8gCqMiEEQAAAAAAAAAAGRFDQACfCAKIA6hIA+jIgsgCiANoSAPoyISoSAKvSITIAy9UQ0AGiAKIAyhIA+jIgxEAAAAAAAAAECgIAuhIBMgDb1RDQAaRAAAAAAAAAAAIA69IBNSDQAaIBJEAAAAAAAAEECgIAyhC0QAAAAAAABOQKIiC0QAAAAAAAAAAGNFDQAgC0QAAAAAAIB2QKAhCwsgAiAROQMYIAIgCjkDECACIBA5AwggAiALRAAAAAAAgHZAozkDAAwHCyACIAMoAoQBQf//A2xB/wFuNgIAIAIgAygCgAFB//8DbEH/AW42AgQgAiADKAJ8Qf//A2xB/wFuNgIIIAIgAygCeEH//wNsQf8BbjYCDAwGCyACIAMoAoQBuEQAAAAAAOBvQKM5AwAgAiADKAKAAbhEAAAAAADgb0CjOQMIIAIgAygCfLhEAAAAAADgb0CjOQMQIAIgAygCeLhEAAAAAADgb0CjOQMYDAULIANBiAI2AgQgA0GUvQE2AgBBiPYIKAIAQdi/BCADECAaEDsACyAALAAAIghB/wFxQS5HIAhBMGtBCUtxRQRAIANCADcDyAEgA0IANwPAASAAIQUDQCAIQf8BcSIJBEAgA0HAAWpBICAIIAlBLEYbwBDKAyAFLQABIQggBUEBaiEFDAELCyADQoCAgICAgID4PzcDoAEgA0HAAWoQ4gIgAyADQaABajYCTCADIANBqAFqNgJIIAMgA0GwAWo2AkQgAyADQbgBajYCQEHDgwEgA0FAaxBRQQNOBEAgAyADKwO4AUQAAAAAAADwPxApRAAAAAAAAAAAECMiCjkDuAEgAyADKwOwAUQAAAAAAADwPxApRAAAAAAAAAAAECMiCzkDsAEgAyADKwOoAUQAAAAAAADwPxApRAAAAAAAAAAAECMiDDkDqAEgAyADKwOgAUQAAAAAAADwPxApRAAAAAAAAAAAECMiDTkDoAECQAJAAkACQAJAAkAgBw4GBAABAgUFAwsgCiALIAwgA0GYAWogA0GQAWogA0GIAWoQ4gYgAgJ/IAMrA5gBRAAAAAAA4G9AoiIKRAAAAAAAAPBBYyAKRAAAAAAAAAAAZnEEQCAKqwwBC0EACzoAACACAn8gAysDkAFEAAAAAADgb0CiIgpEAAAAAAAA8EFjIApEAAAAAAAAAABmcQRAIAqrDAELQQALOgABIAICfyADKwOIAUQAAAAAAOBvQKIiCkQAAAAAAADwQWMgCkQAAAAAAAAAAGZxBEAgCqsMAQtBAAs6AAIgAgJ/IAMrA6ABRAAAAAAA4G9AoiIKRAAAAAAAAPBBYyAKRAAAAAAAAAAAZnEEQCAKqwwBC0EACzoAAwwECyAKIAsgDCADQZgBaiADQZABaiADQYgBahDiBiACAn8gAysDmAFEAAAAAOD/70CiIgqZRAAAAAAAAOBBYwRAIAqqDAELQYCAgIB4CzYCACACAn8gAysDkAFEAAAAAOD/70CiIgqZRAAAAAAAAOBBYwRAIAqqDAELQYCAgIB4CzYCBCACAn8gAysDiAFEAAAAAOD/70CiIgqZRAAAAAAAAOBBYwRAIAqqDAELQYCAgIB4CzYCCCACAn8gAysDoAFEAAAAAOD/70CiIgqZRAAAAAAAAOBBYwRAIAqqDAELQYCAgIB4CzYCDAwDCyAKIAsgDCADQZgBaiADQZABaiADQYgBahDiBiACIAMrA5gBOQMAIAIgAysDkAE5AwggAiADKwOIATkDECACIAMrA6ABOQMYDAILIANBvAI2AjQgA0GUvQE2AjBBiPYIKAIAQdi/BCADQTBqECAaEDsACyACIA05AxggAiAMOQMQIAIgCzkDCCACIAo5AwALIANBwAFqEFxBACEADAULIANBwAFqEFwLIABBhfUAEE1FDQEgAEHGkQEQTUUNASAAQd8OEE1FDQEgA0IANwPIASADQgA3A8ABAkAgAC0AAEEvRgRAIARBLxDNASIFRQRAIAQhAAwCCyAELQAAQS9GBEACQEG43gooAgAiBEUNACAELQAARQ0AQfmeAyAEQQMQgAJFDQAgA0HAAWogBCAAQQJqEJUKIQAMAwsgAEECaiEADAILIAAgBUEBakH5ngMgBEEEEIACGyEADAELQbjeCigCACIERQ0AIAQtAABFDQBB+Z4DIARBAxCAAkUNACADQcABaiAEIAAQlQohAAsgABClASEAIANBwAFqEFwMAgsgAiADKAKEAToAACACIAMoAoABOgABIAIgAygCfDoAAiACIAMoAng6AAMMAgsgABClASEACyAARQRAQX8hAAwBCyAAQdCWBUHTE0EMQSEQ7AMhBCAAEBggBARAQQAhAAJAAkACQAJAAkAgBw4GAAECAwYGBAsgAiAELQAEuEQAAAAAAOBvQKM5AwAgAiAELQAFuEQAAAAAAOBvQKM5AwggAiAELQAGuEQAAAAAAOBvQKM5AxAgAiAELQAKuEQAAAAAAOBvQKM5AxgMBQsgAiAELQAHOgAAIAIgBC0ACDoAASACIAQtAAk6AAIgAiAELQAKOgADDAQLIAIgBC0AB0GBAmw2AgAgAiAELQAIQYECbDYCBCACIAQtAAlBgQJsNgIIIAIgBC0ACkGBAmw2AgwMAwsgAiAELQAHuEQAAAAAAOBvQKM5AwAgAiAELQAIuEQAAAAAAOBvQKM5AwggAiAELQAJuEQAAAAAAOBvQKM5AxAgAiAELQAKuEQAAAAAAOBvQKM5AxgMAgsgA0HrAjYCJCADQZS9ATYCIEGI9ggoAgBB2L8EIANBIGoQIBoQOwALQQEhAAJAAkACQAJAAkAgBw4GAAECAwUFBAsgAkIANwMAIAJCgICAgICAgPg/NwMYIAJCADcDECACQgA3AwgMBAsgAkGAgIB4NgIADAMLIAJCgICAgPD/PzcDCCACQgA3AwAMAgsgAkIANwMAIAJCgICAgICAgPg/NwMYIAJCADcDECACQgA3AwgMAQsgA0GIAzYCFCADQZS9ATYCEEGI9ggoAgBB2L8EIANBEGoQIBoQOwALIANB0AFqJAACQAJAIAAOAgIAAQsgBkIANwMoIAZCADcDICAGIAE2AhAgBkEgaiEAQQAhBCMAQTBrIgIkACACIAZBEGoiBTYCDCACIAU2AiwgAiAFNgIQAkACQAJAAkACQAJAQQBBAEGHNCAFEGAiA0EASA0AIANBAWohBQJAIAAQSyAAECRrIgcgA0sNACAFIAdrIQcgABAoBEBBASEEIAdBAUYNAQsgACAHELcCQQAhBAsgAkIANwMYIAJCADcDECAEIANBEE9xDQEgAkEQaiEHIAMgBAR/IAcFIAAQcwsgBUGHNCACKAIsEGAiBUcgBUEATnENAiAFQQBMDQAgABAoBEAgBUGAAk8NBCAEBEAgABBzIAJBEGogBRAfGgsgACAALQAPIAVqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABB6gFB+B4QAAALIAQNBCAAIAAoAgQgBWo2AgQLIAJBMGokAAwEC0HGpgNBoPwAQd0BQfgeEAAAC0GtngNBoPwAQeIBQfgeEAAAC0H5zQFBoPwAQeUBQfgeEAAAC0GjngFBoPwAQewBQfgeEAAACwJAIAAQKARAIAAQJEEPRg0BCyAGQSBqIgAQJCAAEEtPBEAgAEEBELcCCyAGQSBqIgAQJCECIAAQKARAIAAgAmpBADoAACAGIAYtAC9BAWo6AC8gABAkQRBJDQFBk7YDQaD8AEGvAkHEsgEQAAALIAYoAiAgAmpBADoAACAGIAYoAiRBAWo2AiQLAkAgBkEgahAoBEAgBkEAOgAvDAELIAZBADYCJAsgBkEgaiIAECghAiAAIAYoAiAgAhsQoQYEQCAGIAE2AgBB4eAEIAYQKgsgBi0AL0H/AUcNASAGKAIgEBgMAQtB9/YEQQAQNwsgBkEwaiQACyIBAX8CQCAAKAI8IgFFDQAgASgCVCIBRQ0AIAAgAREBAAsLJAEBfwJAIAAoAjwiAkUNACACKAJQIgJFDQAgACABIAIRBAALCyIBAX8CQCAAKAI8IgFFDQAgASgCNCIBRQ0AIAAgAREBAAsL0QECA38EfAJAIAAoApgBIgNBgICEAnFFDQAgACgCECICQQJBBCADQYCACHEiBBs2ApQCIAIgBEEQdkECczYCkAIgAigCmAIQGCACIAIoApQCQRAQPyICNgKYAiACIAErAzgiBSABKwMYRAAAAAAAAOA/oiIHoTkDACABKwNAIQYgASsDICEIIAIgBSAHoDkDECACIAYgCEQAAAAAAADgP6IiBaA5AxggAiAGIAWhOQMIIANBgMAAcUUEQCAAIAIgAkECEJgCGgsgBA0AIAIQgwULC2sAIABCADcCAAJAAkACQAJAAkAgAkHCAGtBH3cOCgEEBAQEAgQEAwAECyABIAEoAqgBQQFrNgKwASAAQX82AgQPCyAAQQE2AgQPCyAAQQE2AgAPCyABIAEoAqQBQQFrNgKsASAAQX82AgALC9oBAQV/IwBBEGsiByQAIAdBADYCDCAHQQA2AgggAxBkIgghAwNAAkAgBQ0AIAMgACgCpAIgB0EMahCbByIERQ0AQQAhA0EAIQUgBCAAKAKgAiAHQQhqIgYQmwciBEUNAUEAIAAoAqACIAYQmwciBQRAIAAgBEEAEJ4GIQQgACAFIAIQngYhBiAEQQBIBEBBACEFIAZBAEgNAwsgBCAGIAQgBkgbIAFMIAEgBCAGIAQgBkobTHEhBQwCBSAAIAQgARCeBiABRiEFDAILAAsLIAgQGCAHQRBqJAAgBQu5AgIDfwl8AkACQCABKAIEIgQEQEEBIQIgBEEDcEEBRw0BIAAgASgCACIDKQMANwMQIAAgAykDCDcDGCAAIAMpAwg3AwggACADKQMANwMAIAArAxghBSAAKwMIIQYgACsDECEHIAArAwAhCANAIAIgBE8NAyADIAJBBHRqIgErAwAhCSABKwMQIQwgAkEDaiECIAErAyAhCiABKwMoIQsgBSABKwMIIAErAxigRAAAAAAAAOA/oiINECMgCxAjIQUgByAJIAygRAAAAAAAAOA/oiIJECMgChAjIQcgBiANECkgCxApIQYgCCAJECkgChApIQgMAAsAC0GvlwNBhLkBQewfQfW/ARAAAAtB3o0DQYS5AUHtH0H1vwEQAAALIAAgBTkDGCAAIAY5AwggACAHOQMQIAAgCDkDAAvwAQIBfwJ8IAAoAhAhBQJAIAIEfyADBSAFKALYAQsgBHJFBEAgBS8BjAJBAXFFDQELIAAoApgBIgJBgICEAnFFDQAgASsDACEGIAErAwghByAFQQJBBCACQYCACHEiAxs2ApQCIAUgA0EQdkECczYCkAIgBSgCmAIQGCAFIAUoApQCQRAQPyIBNgKYAiABIAdEAAAAAAAACECgOQMYIAEgBkQAAAAAAAAIQKA5AxAgASAHRAAAAAAAAAjAoDkDCCABIAZEAAAAAAAACMCgOQMAIAJBgMAAcUUEQCAAIAEgAUECEJgCGgsgAw0AIAEQgwULC+UEAgh/BHwjAEEQayIJJAAgACgCBCIGQQFrQQNuIQUCQCAGQQRrQQJNBEAgAkEENgIEIAJBBEEQED82AgAgA0EENgIEIANBBEEQED8iAzYCACAJIAAoAgAgASACKAIAIAMQoQEMAQsgBUEIED8hCCAAKAIAIQQDQCAFIAdGBEACQCABIA2iIQFEAAAAAAAAAAAhDUEAIQYDQCAFIAZGBEAgBSEGDAILIA0gCCAGQQN0aisDAKAiDSABZg0BIAZBAWohBgwACwALBSAIIAdBA3RqIAQrAwAgBCsDECIMoSIOIA6iIAQrAwggBCsDGCIOoSIPIA+ioJ8gDCAEKwMgIgyhIg8gD6IgDiAEKwMoIg6hIg8gD6Kgn6AgDCAEKwMwoSIMIAyiIA4gBCsDOKEiDCAMoqCfoCIMOQMAIA0gDKAhDSAHQQFqIQcgBEEwaiEEDAELCyACIAZBA2wiCkEEaiIENgIEIAIgBEEQED82AgAgAyAFIAZrQQNsQQFqIgU2AgQgAyAFQRAQPzYCAEEAIQQDQCAEIAIoAgRPRQRAIARBBHQiBSACKAIAaiIHIAAoAgAgBWoiBSkDADcDACAHIAUpAwg3AwggBEEBaiEEDAELCyAEQQRrIQdBACEEA0AgBCADKAIET0UEQCADKAIAIARBBHRqIgUgACgCACAHQQR0aiILKQMANwMAIAUgCykDCDcDCCAEQQFqIQQgB0EBaiEHDAELCyAJIApBBHQiBSAAKAIAaiABIA0gCCAGQQN0aisDACIBoaEgAaMgAigCACAFaiADKAIAEKEBIAgQGAsgCUEQaiQAC5EBAQN/AkACQCAAKAKcAUECSA0AIAAgAkGo3AooAgBB8f8EEHoiAxCJBA0AIANB8f8EED5FDQFBASEEIAEgAhBuRQ0BIAEgAhBuIQMDQCADQQBHIQQgA0UNAiADQYDdCigCAEHx/wQQeiIFQfH/BBA+DQIgACAFEIkEDQIgASADIAIQciEDDAALAAtBASEECyAEC4QCAQN/An8CQCAAQceZARAnIgBFDQAgAC0AAEUNACAAEMMDGkGw4AohAwNAQbDgCiADKAIAIgBFDQIaIABBrq0BEE1FBEAgA0EEaiEDIAJBAXIhAgwBCyAAQf7xABBNRQRAIAMhAANAIAAgACgCBCIENgIAIABBBGohACAEDQALIAJBA3IhAgwBCyAAQaysARBNRQRAIAMhAANAIAAgACgCBCIENgIAIABBBGohACAEDQALIAJBwAByIQIMAQsgAEHZrgEQTQRAIANBBGohAwUgAyEAA0AgACAAKAIEIgQ2AgAgAEEEaiEAIAQNAAsgAkEEciECCwwACwALQQALIAEgAjYCAAs5AQJ/AkAgACgCxAEiAkEASA0AIAIgACgCpAFODQAgACgCyAEiAkEASA0AIAIgACgCqAFIIQELIAELzQEBA39BASEEA0AgBCABKAIQIgMoArQBSkUEQCAAIAMoArgBIARBAnRqKAIAIgMQ5ggCQCADQfU2ECciAkUNACACLQAARQ0AIAAgAhBJCwJAIANB4DYQJyICRQ0AIAItAABFDQAgACACEEkLAkAgA0HzNhAnIgJFDQAgAi0AAEUNACAAIAIQSQsCQCADQek2ECciAkUNACACLQAARQ0AIAAgAhBdCwJAIANB1jYQJyIDRQ0AIAMtAABFDQAgACADEEkLIARBAWohBAwBCwsLjSYDEX8GfAV+IwBB4AFrIgQkACAAIAArA7gDIhNEAAAAAAAAUkCjIhQ5A5AEIAAgACsDsAMiFUQAAAAAAABSQKM5A4gEIAAgFSAAKwPgAiIVokQAAAAAAABSQKMiFjkD6AMgACAVIBOiRAAAAAAAAFJAoyITOQPwAwJAIAAoApgBIgNBgCBxRQRAQbjbCi0AAEEBRw0BCyAAIBSaOQOQBAsgAEHEA0HAAyAAKALoAiICG2ooAgAhBSAAIABBwANBxAMgAhtqKAIAuCATozkD+AIgACAFuCAWozkD8AIgACABIAFBAEHiH0EAECJB8f8EEHoQhQQgAEEANgKgASAAEI0EIgJBADYCDCACIAE2AgggAkEANgIEIAAgASgCECgCDCABEKMGAkAgACgCPCICRQ0AIAIoAggiAkUNACAAIAIRAQALAkAgA0ECcUUNACAAQd8OEF0CQCABQfM2ECciAkUNACACLQAARQ0AIAAgAhBdCwJAIAFB1jYQJyICRQ0AIAItAABFDQAgACACEEkLIAAgARDmCCABEBwhBgNAIAZFDQECQCAGQfU2ECciAkUNACACLQAARQ0AIAAgAhBJCwJAIAZB4DYQJyICRQ0AIAItAABFDQAgACACEF0LAkAgBkHpNhAnIgJFDQAgAi0AAEUNACACQToQzQEEQCACEGQiBSEDA0AgA0H74gEQsQUiAgRAQQAhAyACLQAARQ0BIAAgAhBJDAELCyAFEBgMAQsgACACEEkLAkAgBkHWNhAnIgJFDQAgAi0AAEUNACAAIAIQSQsgASAGECwhBQNAIAUEQAJAIAVB9TYQJyICRQ0AIAItAABFDQAgAkE6EM0BBEAgAhBkIgchAwNAIANB++IBELEFIgIEQEEAIQMgAi0AAEUNASAAIAIQSQwBCwsgBxAYDAELIAAgAhBJCwJAIAVB1jYQJyICRQ0AIAItAABFDQAgACACEEkLIAEgBRAwIQUMAQsLIAEgBhAdIQYMAAsACyABEBwhAgNAIAIEQCACKAIQQQA6AIQBIAEgAhAdIQIMAQsLIAAgACgCACICKAKwAiIDNgKcAQJAIAIoArQCIgIEQAJAIAIoAgBBAkgNACAALQCYAUHAAHENACAEIAAoAjQ2ApABQaveAyAEQZABahAqIAIgACgCnAFBAWo2AggLIAJBCGohCiACKAIEIQIMAQtBASECIANBAkgNACAALQCYAUHAAHENACAEIAAoAjQ2AoABQaveAyAEQYABahAqIABBATYCnAELIABBnAFqIQ4DQAJAIAAgAjYCoAEgAiAAKAKcAUoNACAAKAIAKAK0AiICIA4gAhsoAgBBAk4EQAJAIAAoAjwiAkUNACACKAIQIgJFDQAgACAAKAIAKAKsAiAAKAKgASIDQQJ0aigCACADIAAoApwBIAIRBwALCyAAIAApAqwBIhk3AsQBIBmnIQIDQAJAAkAgABDlCARAIAAoApgBIQkgACgCECEHIARCADcDqAEgBEIANwOgAUEAIQsgACgCoAFBAUogAkEASnIiEgRAIAcoAtwBIQsgACAEQaABaiICEOsIIAIgC0G3NyALGxDFAyAHIAIQxAM2AtwBCyABQaKYARAnEOwCIQ8gACkCpAEiGUIgiCEaIAApAsQBIhtCIIghHAJAIAAoAugCIgNFBEAgGSEdIBohGSAbIRogHCEbDAELIBohHSAcIRoLIAAgGqe3IhcgACsDwAIiFKIgACsD8AGhIhU5A6ACIAAgG6e3IhggACsDyAIiE6IgACsD+AGhIhY5A6gCIAAgEyAWoDkDuAIgACAUIBWgOQOwAgJAIAAoAgwoAhxFBEAgACAAKQPIAzcD2AMgACAAKQPQAzcD4AMMAQsgACAAKALYAyICIAAoAMgDIgUgAiAFSBs2AtgDIAAgACgC3AMiAiAAKADMAyIFIAIgBUgbNgLcAyAAIAAoAuADIgIgACgA0AMiBSACIAVKGzYC4AMgACAAKALkAyICIAAoANQDIgUgAiAFShs2AuQDCyAAKwPYAiEVIAArA9ACIRYCQCAAKAKYASICQYABcQRAIBUgACsD+AJEAAAAAAAA4D+iIhSgIRMgFiAAKwPwAkQAAAAAAADgP6IiGKAhFyAVIBShIRUgFiAYoSEUDAELIBMgEyAYIBmnt0QAAAAAAADgP6KhoiAVoCIVoCETIBQgFCAXIB2nt0QAAAAAAADgP6KhoiAWoCIUoCEXCyAAIBM5A5gCIAAgFzkDkAIgACAVOQOIAiAAIBQ5A4ACAkAgAwRAIAAgE5ogACsDiAMgACsD4AIiE6OhOQOABAJAIAJBgCBxRQRAQbjbCi0AAEEBRw0BCyAAIBeaIAArA4ADIBOjoTkD+AMMAgsgACAAKwOAAyAToyAUoTkD+AMMAQsgACAAKwOAAyAAKwPgAiIWoyAUoTkD+AMCQCACQYAgcUUEQEG42wotAABBAUcNAQsgACATmiAAKwOIAyAWo6E5A4AEDAELIAAgACsDiAMgFqMgFaE5A4AECwJAIAAoAjwiAkUNACACKAIYIgJFDQAgACACEQEACyAAQYX1ABBJIABB3w4QXQJAIAlBgICEAnFFDQAgBygC2AFFBEAgBy0AjAJBAXFFDQELAn8gCUGAgChxRQRAQQAhAkEADAELIAcgCUGAgAhxIgNBEHZBAnM2ApACQQJBBCADG0EQED8iAiAAKQOoAjcDCCACIAApA6ACNwMAIAIgACkDsAI3AxAgAiAAKQO4AjcDGEECIAMNABogAhCDBUEECyEDIAlBgMAAcUUEQCAAIAIgAiADEJgCGgsgByADNgKUAiAHIAI2ApgCCwJAIAlBgIACcUUNACABKAIQKAIMIgJFDQAgByACKAIANgLIAQsCQCAJQQRxIhANACAHKALYAUUEQCAHLQCMAkEBcUUNAQsgBCAAKQOYAjcDeCAEIAApA5ACNwNwIAQgACkDiAI3A2ggBCAAKQOAAjcDYCAAIARB4ABqEN0EIAAgBygC2AEgBygC7AEgBygC/AEgBygC3AEQxAELAn8gAUHzNhAnIgJFBEBBxpEBIQJBAQwBCyACQcaRASACLQAAIgMbIQIgA0ULIQMCQAJAIAAtAJkBQQFxRQRAQQEgAyACQbsfED4iBRshA0HGkQEgAiAFGyECIAAoApgBIgVBgAJxRQ0BCyACQbsfED4NASAAKAKYASEFCyADQQAgBUGAgIAQcRsNACAEQgA3A8ABIAIgBEHAAWogBEG4AWoQiwQEQCAEQQA2ArQBIAAgBCgCwAEiAxBdIABBux8QSSABIARBtAFqEOQIGiAAIAQoAsQBIgJBhfUAIAIbIAFByNsKKAIAQQBBABBiIAQrA7gBEI4DIAQgACkDiAI3AyggBCAAKQOQAjcDMCAEIAApA5gCNwM4IAQgACkDgAI3AyAgACAEQSBqQQNBAiAEKAK0AUECcRsQiAIgAxAYIAIQGAwBCyAAIAIQXSAAQbsfEEkgBCAAKQOYAjcDWCAEIAApA5ACNwNQIAQgACkDiAI3A0ggBCAAKQOAAjcDQCAAIARBQGtBARCIAgsgASgCECgCCCgCWCIMRQ0CIAwoAgghAkEAIQNBASEGQQAhEUEBIQUDQCAMKAIAIANNBEAgEUUNBCAAIAAoAgAoAsgCEOUBDAQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACKAIAIggOEAAAAQECAgMECwUNCAkGBw0KCyACKwBgIAArAIACZkUNDCAAKwCQAiACKwBQZkUNDCACKwBoIAArAIgCZkUNDCAAKwCYAiACKwBYZkUNDCAEIAIrAwgiFSACKwMYIhahOQPAASACKwMgIRMgAisDECEUIAQgFSAWoDkD0AEgBCAUIBOgOQPYASAEIBQgE6E5A8gBIAAgBEHAAWpBACAGIAgbEIYEDAwLIAIrAGAgACsAgAJmRQ0LIAArAJACIAIrAFBmRQ0LIAIrAGggACsAiAJmRQ0LIAArAJgCIAIrAFhmRQ0LIAIoAgwgAigCCBCiBiEIIAIoAggiDUEASA0OIAAgCCANIAZBACACKAIAQQJGGxBIIAgQGAwLCyACKwBgIAArAIACZkUNCiAAKwCQAiACKwBQZkUNCiACKwBoIAArAIgCZkUNCiAAKwCYAiACKwBYZkUNCiAAIAIoAgwgAigCCBCiBiIIIAIoAgggBkEAIAIoAgBBBEYbEPABIAgQGAwKCyACKwBgIAArAIACZkUNCSAAKwCQAiACKwBQZkUNCSACKwBoIAArAIgCZkUNCSAAKwCYAiACKwBYZkUNCSAAIAIoAgwgAigCCBCiBiIIIAIoAggQPSAIEBgMCQsgAisAYCAAKwCAAmZFDQggACsAkAIgAisAUGZFDQggAisAaCAAKwCIAmZFDQggACsAmAIgAisAWGZFDQggBCACKwMIOQPAASAEIAIrAxA5A8gBIAIoAnAhCCAEIAQpA8gBNwMYIAQgBCkDwAE3AxAgACAEQRBqIAgQmQYMCAsgACACKAIIEEkMBgsgAisDKCETIAIoAghBAkYEQCACKAJEIgYrAxAhFCAGKAIYIQggBigCCCEGAn8gAisDECIVIBNhBEBBACACKwMwIAIrAxhhDQEaCyAVIBOhIAIrAyCjEK8CRAAAAAAAgGZAokQYLURU+yEJQKMiE5lEAAAAAAAA4EFjBEAgE6oMAQtBgICAgHgLIQ0gACAGEF0gACAIIA0gFBCOA0EDIQYMBwsgAigCNCIGKwMQIRQgBigCGCEIIBMgAisDGKEgAisDICACKwMQoRCoASETIAAgBigCCBBdIAAgCAJ/IBNEAAAAAACAZkCiRBgtRFT7IQlAoyITmUQAAAAAAADgQWMEQCATqgwBC0GAgICAeAsgFBCOA0ECIQYMBgtBo+MEQQAQKgwFCyAAIAIoAggQwwMQ5QFBsOAKIREMBAsgBUUEQEEAIQUMBAtBACEFQa2tBEEAECoMAwsgBEG7CzYCBCAEQYS5ATYCAEGI9ggoAgBB2L8EIAQQIBoQOwALIAAgAigCCBBdC0EBIQYLIANBAWohAyACQfgAaiECDAALAAsgACgCACgCtAIiAiAOIAIbKAIAQQJOBEACQCAAKAI8IgJFDQAgAigCFCICRQ0AIAAgAhEBAAsLIAoEQCAKKAIAIQIgCkEEaiEKDAULIAAoAqABQQFqIQJBACEKDAQLQcevA0GEuQFB6gpB/hwQAAALIAEoAhAoAgwiAgRAIABBBCACEJADCwJAIBBFBEACQCAHKALYAUUEQCAHLQCMAkEBcUUNAQsgABCXAgsgACgCACICIAIoAhxBAWo2AhwgACABIAkQ2wQMAQsgACgCACICIAIoAhxBAWo2AhwLAkACQAJAAkAgCUEBcQRAIAAQnAYgARAcIQIDQCACBEAgACACEMIDIAEgAhAdIQIMAQsLIAAQmwYgABCaBiABEBwhAwNAIANFDQIgASADECwhAgNAIAIEQCAAIAIQigQgASACEDAhAgwBCwsgASADEB0hAwwACwALIAlBEHEEQCAAEJoGIAEQHCEDA0AgAwRAIAEgAxAsIQIDQCACBEAgACACEIoEIAEgAhAwIQIMAQsLIAEgAxAdIQMMAQsLIAAQ3AggABCcBiABEBwhAgNAIAJFDQQgACACEMIDIAEgAhAdIQIMAAsACyAJQQhxRQ0BIAAQnAYgARAcIQUDQEEBIQIgBQRAAkADQCABKAIQIgMoArQBIAJOBEAgAkECdCACQQFqIQIgAygCuAFqKAIAIAUQqQFFDQEMAgsLIAAgBRDCAwsgASAFEB0hBQwBCwsgABCbBiAAEJoGIAEQHCEGA0AgBkUNASABIAYQLCEFA0BBASECIAUEQAJAA0AgASgCECIDKAK0ASACTgRAIAJBAnQgAkEBaiECIAMoArgBaigCACAFEKkBRQ0BDAILCyAAIAUQigQLIAEgBRAwIQUMAQsLIAEgBhAdIQYMAAsACyAAENwIDAILIAEQHCEDA0AgA0UNAiAAIAMQwgMgASADECwhAgNAIAIEQCAAIAJBUEEAIAIoAgBBA3FBAkcbaigCKBDCAyAAIAIQigQgASACEDAhAgwBCwsgASADEB0hAwwACwALIAAQmwYLIBAEQCAAIAEgCRDbBAsCQCAAKAI8IgJFDQAgAigCHCICRQ0AIAAgAhEBAAsgEgRAIAcgCzYC3AELIARBoAFqEFwgDxDsAhAYIA8QGCAAIAAoAMQBIAAoALwBaiICrSAAKADIASAAKADAAWoiA61CIIaENwLEASAAEOUIDQACQCAAKAK4ASIFBEAgACgCrAEhAgwBCyAAKAKwASEDCyAAIAAoALQBIAJqIgKtIAMgBWqtQiCGhDcCxAEMAAsACwsCQCAAKAI8IgFFDQAgASgCDCIBRQ0AIAAgAREBAAsCQCAAKAJMIgFFDQAgASgCBCIBRQ0AIAAgAREBAAsgABDrBhogABCMBCAEQeABaiQAC8sBAgF/AnwjAEHgAGsiASQAIAEgACkDCDcDWCABIAApAwA3A1AgASAAKQM4NwNIIAEgACkDMDcDQCABIAApAxg3AzggASAAKQMQNwMwIAFB0ABqIAFBQGsgAUEwahCLCiABIAApAwg3AyggASAAKQMANwMgIAEgACkDODcDGCABIAApAzA3AxAgASAAKQMoNwMIIAEgACkDIDcDACABQSBqIAFBEGogARCLCiEDIAFB4ABqJABEAAAAAAAAEEBjIANEAAAAAAAAEEBjcQvABAIDfwV8IwBBkAFrIgMkACAAKAIQKwOgASEIIAIgA0HgAGoQ3gQiBEEBa0ECTwRAIAErAAAhByABKwAQIQYgAyABKwAYIgkgASsACKBEAAAAAAAA4D+iIgo5A1ggAyAGIAegRAAAAAAAAOA/oiIHOQNQIAhEAAAAAAAA4D9kBEAgAEQAAAAAAADgPxCHAgsgCSAKoSEJIAYgB6EhB0EAIQFEAAAAAAAAAAAhBgNAAkAgASADKAJoTw0AIAMgAykDaDcDSCADIAMpA2A3A0AgAygCYCADQUBrIAEQGUEYbGoiAigCACIFRQ0AIAIrAwgiCkQAAAAAAAAAAGUEQCABQQFqIQEFIAAgBRBdIAMgAykDWDcDOCADIAMpA1A3AzAgACADQTBqIAcgCSAGRBgtRFT7IRlAIApEGC1EVPshGUCiIAagIAFBAWoiASADKAJoRhsiBhD0CCICKAIAIAIoAgRBARDwASACKAIAEBggAhAYCwwBCwsgCEQAAAAAAADgP2QEQCAAIAgQhwILQQAhAQNAIAMoAmggAU0EQCADQeAAaiIAQRgQMSAAEDQFIAMgAykDaDcDKCADIAMpA2A3AyAgA0EgaiABEBkhAAJAAkACQCADKAJwIgIOAgIAAQtBsIMEQcIAQQFBiPYIKAIAEDoaEDsACyADIAMoAmAgAEEYbGoiACkDCDcDECADIAApAxA3AxggAyAAKQMANwMIIANBCGogAhEBAAsgAUEBaiEBDAELCwsgA0GQAWokACAEC50BAQF/AkACQCACRQ0AIAAQSyAAECRrIAJJBEAgACACEN8ECyAAECQhAyAAECgEQCAAIANqIAEgAhAfGiACQYACTw0CIAAgAC0ADyACajoADyAAECRBEEkNAUGTtgNBoPwAQZcCQcTqABAAAAsgACgCACADaiABIAIQHxogACAAKAIEIAJqNgIECw8LQZLOAUGg/ABBlQJBxOoAEAAAC3sBAn8jAEEgayICJAAgACgCoAEiA0ECTgRAIAIgACgCACgCrAIgA0ECdGooAgA2AhAgAUHNxAEgAkEQahB+CyAAKALIASEDIAAoAsQBIgBBAEwgA0EATHFFBEAgAiADNgIEIAIgADYCACABQcXFASACEH4LIAJBIGokAAvsAQEBfyAAKAIQIQcgAUUgACgCmAEiAEGAgAJxRXJFBEAgByABNgLIAQsCQCAAQYCABHEiAUUNACAHIAUgBhCBATYC3AEgAkUNACACLQAARQ0AIAcgAiAGEIEBNgLYAQsgAUEQdiEBAkAgAEGAgIACcUUNAAJAIANFDQAgAy0AAEUNACAHIAMgBhCBATYC7AFBASEBIAcgBy8BjAJBAXI7AYwCDAELIAcoAsgBIgJFDQAgByACEGQ2AuwBQQEhAQsCQCAERSAAQYCAgARxRXINACAELQAARQ0AIAcgBCAGEIEBNgL8AUEBIQELIAELzgEBBX8jAEEgayIDJAAgACgCECIEKAK0ASICQQAgAkEAShtBAWohBkEBIQUCQANAIAUgBkcEQCAEKAK4ASAFQQJ0aigCACADIAEpAxg3AxggAyABKQMQNwMQIAMgASkDCDcDCCADIAEpAwA3AwAgBUEBaiEFIAMQ7QgiAkUNAQwCCwsCQCABKwMQIAQrAxBmRQ0AIAQrAyAgASsDAGZFDQAgASsDGCAEKwMYZkUNACAAIQIgBCsDKCABKwMIZg0BC0EAIQILIANBIGokACACCxUAIAAgASACEJcEIgBBCGpBACAAGws7AQF/AkAgAUEAQa6FAUEAECIiAkUEQCABQQBBn9IBQQAQIiICRQ0BCyAAIAEgAhBFIAEQgQE2AswECwtHAQF8AkAgAEQAAAAAAAAAAGEgAUQAAAAAAAAAAGFxDQAgACABEKgBIgJEAAAAAAAAAABmDQAgAkQYLURU+yEZQKAhAgsgAgsmACAEIAMgAhsiAxBXIQQgBSABIAMQSqIgAKAgASAEoiAAoBDhBAujAQEBfyAAIAE5AxggACACOQMgIABBEBAmIQcgACgCACAHQQR0aiIHIAApAxg3AwAgByAAKQMgNwMIIAAgBDkDICAAIAM5AxggAEEQECYhByAAKAIAIAdBBHRqIgcgACkDGDcDACAHIAApAyA3AwggACAGOQMgIAAgBTkDGCAAQRAQJiEHIAAoAgAgB0EEdGoiByAAKQMYNwMAIAcgACkDIDcDCAtcAQN/IwBBEGsiAyQAIAAoAAghBCAAKAIAIQUgAyAAKQIINwMIIAMgACkCADcDACAAIAUgAyAEQQFrEBlBBHRqIgArAwAgACsDCCABIAIgASACEPIIIANBEGokAAuRDQIRfAV/IwBBQGoiFiQAIAMQSiEFIAMQVyAAKwMIIQsgACsDACEMIAKjIAUgAaMQqAEhB0EBQQgQTiIZBEAgBBBKIQUgBBBXIAKjIAUgAaMQqAEiBSAHoUQYLURU+yEZQKOcRBgtRFT7IRnAoiAFoCIFRBgtRFT7IRlAoCAFIAUgB6FEGC1EVPshCUBjGyAFIAQgA6FEGC1EVPshCUBkGyAHoSEKIAIgAaMiAyADRObHBKFh1qC/RH6w58ZPPpi/IANEAAAAAAAA0D9jIgAbokTHaWccE/eCv0QHI5tQLcekPyAAG6CiRCp/a+UtcFy/RD4YwntYuZG/IAAboCADRORXYlQImnU/RC18fa1LjcY/IAAboKMhDSADIANE5alYRjTLsb9EoHiEifX8jz8gABuiRI8Ayc+hZ6a/RGk1JO6x9JG/IAAboKJEXLXG+8y0iD9EuM0zel6/aj8gABugIANETaSPVDqzkD9Ekj6toj80zb8gABugoyEOIAMgA0T6RJ4kXTPQv0S7tIb3wZ6TPyAAG6JEAfCZNi3CXj9EF6h7U0d9oL8gABugokQNnH0vz5SXP0QhK67gbZSLPyAAG6AgA0SJtfgUAOOJP0Qzc9yE1h61vyAAG6CjIQ8gAyADRByWBn5Uw8S/RB+tILws3JA/IAAbokSlSSno9uIjQEQoLPGAsskjQCAAG6CiRKnZA63AkME/RCNa4UwCirc/IAAboCADRAjEkEGTaYk/REijZVGWKX8/IAAboKMhECADIANEgczOoncq5L9EtoE7UKc8rj8gABuiRNGt1/SgoMg/RFFM3gAz37m/IAAboKJEat83GbA/hD9E9XaV/9oLpj8gABugIANEvsqQGV7/hD9E1KU1vA/2lD8gABugoyERIAMgA0Sw479AECDtv0RNLsbAOo7NPyAAG6JEraHUXkTb2D9EWWsotRfR3L8gABugokQ7oXzmUZZ2P0QDP6phvyfMPyAAG6AgA0TTbnD5eoR7P0SmR1M9mX/aPyAAG6CjIRIgAyADRJ/leXB31vm/RNr/AGvVrsE/IAAbokR+/RAbLJzmP0ROKETAIVT3vyAAG6CiRJbs2AjE68w/RKpIhbGFIPU/IAAboCADRM3Ooncq4NA/RJ1oVyHlJ/Y/IAAboKMhEyADIANEUaBP5EnSDkBE0fGHVXIEtz8gABuiRLTIdr6fOjXARJXUCWgiPDPAIAAboKJEOiLfpdQl1b9EZCMQr+t3EMAgABugIANE84I+R5ouij9EpyGq8Gd4xz8gABugoyEUIAEgAyADRPyp8dJNYlA/okTsUbgehesTQKCiROXQItv5fso/oCADRFOWIY51cXs/oKOiIRVBASEYA0AgCiAYuKMhCAJAIBdBAXEgGEH/B0tyRQRAQQEhAEEAIRogByEDQQAhFyAIRBgtRFT7Ifk/ZUUNAQNAIABBAXFFBEAgACEXDAMLIAAhFyAYIBpNDQIgAyAIIAOgIgSgRAAAAAAAAOA/oiIFRAAAAAAAABBAohBKIQYgBSAFoBBKIQkgFSAFRAAAAAAAABhAohBKIgUgDaIgBiAOoiAJIA+iIBCgoKAgBCADoaIgBSARoiAGIBKiIAkgE6IgFKCgoKAQ7QuiRPFo44i1+OQ+ZSEAIBpBAWohGiAEIQMMAAsACyAWQgA3AyggFkIANwMgIBYgCzkDOCAWQgA3AxggFiAMOQMwIBZBGGoiF0EQECYhACAWKAIYIABBBHRqIgAgFikDMDcDACAAIBYpAzg3AwggBxBXIQYgFyAMIAEgBxBKIg2ioCIDIAsgAiAGoqAiBBDzCCAIRAAAAAAAAOA/ohDUCyEFIAgQVyAFIAVEAAAAAAAACECiokQAAAAAAAAQQKCfRAAAAAAAAPC/oKJEAAAAAAAACECjIgmaIQogAiANoiEFIAEgBpqiIQZBACEAA0AgACAYRkUEQCAWQRhqIAkgBqIgA6AgCSAFoiAEoCAKIAEgCCAHoCIHEFciBJqiIgaiIAwgASAHEEoiBaKgIgOgIAogAiAFoiIFoiALIAIgBKKgIgSgIAMgBBDyCCAAQQFqIQAMAQsLIBYgFikDIDcDECAWIBYpAxg3AwggFkEYaiIXIBYoAhggFkEIakEAEBlBBHRqIgArAwAgACsDCBDzCCAXIBkgGUEEakEQEMcBIBZBQGskACAZDwsgGEEBdCEYDAALAAsgFkEINgIAQYj2CCgCAEH16QMgFhAgGhAvAAtSAQR/IAAEQCAAIQIDQCABIANGBEAgABAYBSACKAIAEBgCQCACKAIIIgRFDQAgAigCDCIFRQ0AIAQgBREBAAsgA0EBaiEDIAJBOGohAgwBCwsLC84FAQ9/IwBB0ABrIgMkAEH/0QEhBEHMzgEhCkHc2AEhC0Ho2gEhDkG90QEhD0GP2QEhCEHx/wQhDEHx/wQhCUEBIQUCQAJAAkACQAJAIAEQkgIOAwABAgQLIAEQISEIIAEoAhAoAgwiAUUNAiABKAIAIQQMAgsgARAtECEhCCABECEhDyABKAIQKAJ4IgFFDQEgASgCACEEDAELIAEgAUEwaiIFIAEoAgBBA3FBA0YbKAIoEC0QORAhIQggASAFIAEoAgBBA3FBA0YbKAIoECEhCiABKAIQKAI0IgwEQCAMLQAAQQBHIQYLIAFBUEEAIAEoAgBBA3FBAkcbaigCKBAhIQsgASgCECIEKAJcIgkEQCAJLQAAQQBHIQcLIAQoAmAiBAR/IAQoAgAFQf/RAQshBEHK4AFBtqADIAEgBSABKAIAQQNxQQNGGygCKBAtEDkQggIbIQ5BACEFDAELCyADQgA3A0ggA0IANwNAA0AgAEEBaiEBAkACQCAALQAAIhBB3ABHBEAgEEUNAQwCCyABLAAAIhFB/wFxIg1FDQEgAEECaiEAAkACQAJAAkACQAJAAkACQCANQcUAaw4KAwcBBQcHBwYHAgALIA1B1ABGDQMgAkUgDUHcAEdyDQYgA0FAa0HcABCSAwwJCyADQUBrIAgQxwMMCAsgA0FAayAPEMcDDAcLIAUNBiADQUBrIgEgChDHAyAGBEAgAyAMNgIwIAFBnjMgA0EwahDiBAsgAyALNgIkIAMgDjYCICADQUBrIgFBuDIgA0EgahDiBCAHRQ0GIAMgCTYCECABQZ4zIANBEGoQ4gQMBgsgA0FAayAKEMcDDAULIANBQGsgCxDHAwwECyADQUBrIAQQxwMMAwsgAyARNgIAIANBQGtBnr8BIAMQ4gQMAgsgA0FAaxDjBCADQdAAaiQADwsgA0FAayAQwBCSAyABIQAMAAsAC9gCAQV/IwBBEGsiAiQAIAFCADcDGCABQgA3AyAgASgCACIELQAAIgMEQCACQgA3AwggAkIANwMAA0ACQCADRQ0AAn8CQCADQd8AakH/AXFB3QBNBEAgASgCDEECRg0BCyAEQQFqIQUCQCADQQpGBEAgACABIAIQ4wRB7gAQqQYMAQsgA0HcAEYEQAJAIAUtAAAiBkHsAGsiA0EGS0EBIAN0QcUAcUVyRQRAIAAgASACEOMEIAUsAAAQqQYMAQsgAiAGwBCSAwsgBEECaiAFIAQtAAEbDAMLIAIgA8AQkgMLIAUMAQsgAiADwBCSAyACIAQsAAEiAxCSAyADRQ0BIARBAmoLIgQtAAAhAwwBCwsgAhAkBEAgACABIAIQ4wRB7gAQqQYLIAItAA9B/wFGBEAgAigCABAYCyABIAFBGGoiACkDADcDKCABIAApAwg3AzALIAJBEGokAAuPCAIJfwp8IwBB8ABrIgMkACADQgA3AzAgA0IANwMoIANCADcDICADQgA3AxggASgCBCEERAAAAAAAAPC/IQ0DQAJAIAQgB0YNACABKAIAIAdBBXRqIgYoAgRBAUsNAAJAAkAgBigCACgCBCIGBEAgBi0AGEH/AHENAyAGKwMQIgxEAAAAAAAAAABkRQRAIAIrAyAhDAsgAyAMOQMoIAYoAgAiBkUNAQwCCyADIAIrAyAiDDkDKAsgAigCECEGCyADIAY2AhgCQCAHRQRAIAwhDQwBCyAMIA1iDQELAkAgBUUEQCAGIQUMAQsgBiAFEE0NAQsgB0EBaiEHDAELCyABIAQgB00iCjoACEEAIQZEAAAAAAAAAAAhDQNAIAQgBk1FBEAgASgCACEFQQAhB0QAAAAAAAAAACEMIAZBBXQhCEQAAAAAAAAAACEQRAAAAAAAAAAAIQ9EAAAAAAAAAAAhE0QAAAAAAAAAACENAkACQANAIAUgCGoiBCgCBCAHTQRAAkAgBCAQOQMQIApFDQMgBg0AIAUgDyAToDkDGCANIQwMBAsFIAMgB0E4bCIJIAQoAgBqKAIAIAIoAjAQgQE2AjgCQCABKAIAIAhqIgQoAgAgCWooAgQiBQRAIAMgBSgCGEH/AHEiBQR/IAUFIAIoAihB/wBxCyADKAIwQYB/cXI2AjAgAyAEKAIAIAlqKAIEIgQrAxAiDkQAAAAAAAAAAGQEfCAOBSACKwMgCzkDKCADIAQoAgAiBQR/IAUFIAIoAhALNgIYIAQoAgQiBQRAIAMgBTYCHAwCCyADIAIoAhQ2AhwMAQsgAyACKwMgOQMoIAMgAigCEDYCGCADIAIoAhQ2AhwgAyADKAIwQYB/cSACKAIoQf8AcXI2AjALIAMgACgCiAEiBSADQRhqQQEgBSgCABEDADYCPCADQQhqIAAgA0E4ahDgBiADKwMQIQ4gAysDCCEVIAEoAgAgCGooAgAgCWooAgAQGCADKAI4IQsgASgCACIFIAhqKAIAIAlqIgQgFTkDICAEIAs2AgAgBCADKwNIOQMQIAQgAysDUDkDGCAEIAMoAjw2AgQgBCADKAJANgIIIAQgAygCRDYCDCAOIA0gDSAOYxshDSADKwNIIg4gEyAOIBNkGyETIAMrA1AiDiAPIA4gD2QbIQ8gAysDKCIOIAwgDCAOYxshDCAHQQFqIQcgECAVoCEQDAELCyAEIA05AxggDSEMDAELIAZFBEAgBSAMIA+hOQMYDAELIAQgESAMoCAUoSAPoTkDGAsgECASIBAgEmQbIRIgBkEBaiEGIBEgDKAhESAUIAQrAxigIRQgASgCBCEEDAELCyABIBI5AyAgASANIBEgBEEBRhs5AyggA0HwAGokAAvqDwIIfwd8IwBBQGoiBCQAIAAoAlQhCQJAIAAoAlAiA0UNACADKAIYIgNFDQAgACgCGA0AIAAgAxBkNgIYCyAALwEkIQMgASsDACEOIAErAxAhDSAAKwNAIQsgASsDGCIPIAErAwgiEKEgACsDSCIRoUQAAAAAAAAAABAjIQwgDSAOoSALoUQAAAAAAAAAABAjIQsCQCADQQFxRQ0AIAtEAAAAAAAAAABkBEACQAJAAkACQCADQQZxQQJrDgMBAgACCyABIA4gEaA5AxAMAgsgASAOIAugIg45AwAgASANIAugOQMQDAELIAEgDSALRAAAAAAAAOA/oiILoTkDECABIA4gC6AiDjkDAAtEAAAAAAAAAAAhCwsgDEQAAAAAAAAAAGRFDQAgAQJ8AkAgA0EYcSIDQQhHBEAgA0EQRw0BIBEgEKAMAgsgASAQIAygIgw5AwggESAMoAwBCyABIBAgDEQAAAAAAADgP6IiDKA5AwggDyAMoQsiDzkDGEQAAAAAAAAAACEMCwJ/IAsgCyAAKAJ8IgO4IgujIg0gC6KhIgtEAAAAAAAA4D9EAAAAAAAA4L8gC0QAAAAAAAAAAGYboCILmUQAAAAAAADgQWMEQCALqgwBC0GAgICAeAshBSADQQFqIQYgDiAALQAhuCIQoCAALAAgtyIOoCELIAAoAnQhB0EAIQMDQCADIAZGBEACfyAMIAwgACgCeCIDuCIMoyINIAyioSIMRAAAAAAAAOA/RAAAAAAAAOC/IAxEAAAAAAAAAABmG6AiDJlEAAAAAAAA4EFjBEAgDKoMAQtBgICAgHgLIQUgA0EBaiEGIA8gEKEgDqEhCyAAKAJwIQdBACEDA0AgAyAGRgRAA0AgCSgCACIDBEAgAy8BViEGIAMvAVQhBwJ/IAJFBEAgAy8BUiEFIAMvAVAhCEEADAELIAAoAnggAy8BUiIFIAZqRiAHRUEDdCIIIAhBBHIgBhsiCEECciAIIAAoAnwgAy8BUCIIIAdqRhtyCyEKIAAoAnAgBkEDdGoiBiAFQQN0aisDACAALAAgtyEPIAAoAnQgB0EDdGoiBSAIQQN0aisDACENIAYrAwAhDiAFKwMAIQwCQCADKAIYDQAgAygCYCgCGCIFRQ0AIAMgBRBkNgIYCyAPoCELIA0gD6EhDyACIApxIQcCQCADLwEkIgZBAXFFDQACQCAPIAyhIAMrA0AiEKEiDUQAAAAAAAAAAGRFDQACQAJAAkAgBkEGcUECaw4DAQIAAgsgDCAQoCEPDAILIAwgDaAhDCAPIA2gIQ8MAQsgDyANRAAAAAAAAOA/oiINoSEPIAwgDaAhDAsgDiALoSADKwNIIhChIg1EAAAAAAAAAABkRQ0AAkAgBkEYcSIFQQhHBEAgBUEQRw0BIAsgEKAhDgwCCyALIA2gIQsgDiANoCEODAELIA4gDUQAAAAAAADgP6IiDaEhDiALIA2gIQsLIAlBBGohCSADIA45A0ggAyAPOQNAIAMgCzkDOCADIAw5AzAgAyAHOgAjIAQgDiADLQAhuCINoSADLQAiuCIQoSIOOQM4IAQgDyANoSAQoSIPOQMwIAQgCyANoCAQoCILOQMoIAQgDCANoCAQoCIMOQMgIAMoAlghBQJAAkACQCADKAJcQQFrDgMAAgECCyAEIAQpAzg3AxggBCAEKQMwNwMQIAQgBCkDKDcDCCAEIAQpAyA3AwAgBSAEIAcQ+QgMAwsCQCAPIAyhIAUrAxChIg1EAAAAAAAAAABkRQ0AAkACQCAGQQZxQQJrDgMBAgACCyAEIA8gDaE5AzAMAQsgBCAMIA2gOQMgCwJAIA4gC6EgBSsDGKEiDEQAAAAAAAAAAGRFDQAgBkEYcSIDQQhHBEAgA0EQRw0BIAQgDiAMoTkDOAwBCyAEIAsgDKA5AygLIAUgBCkDIDcDACAFIAQpAzg3AxggBSAEKQMwNwMQIAUgBCkDKDcDCAwCCyAFKwMoIRACQCAPIAyhIAUrAyChIg1EAAAAAAAAAABkRQ0AAkACQAJAAkAgBkEGcUEBaw4GAgECAAIEAwsgBCAPIA2hOQMwDAMLIAQgDCANoDkDIAwCCwALIAQgDyANRAAAAAAAAOA/oiIPoTkDMCAEIAwgD6A5AyALAkAgDiALoSAQoSIMRAAAAAAAAAAAZEUNAAJAIAZBGHEiBkEIRwRAIAZBEEcNASAEIA4gDKE5AzgMAgsgBCALIAygOQMoDAELIAQgDiAMRAAAAAAAAOA/oiIOoTkDOCAEIAsgDqA5AygLIAUgBCkDIDcDECAFIAQpAzg3AyggBSAEKQMwNwMgIAUgBCkDKDcDGEHsAEHyAEHuACADLwEkQYAGcSIFQYACRhsgBUGABEYbIQUgAygCWCIGKAIEIQdBACEDA0AgAyAHRg0CIAYoAgAgA0EFdGoiCC0ACEUEQCAIIAU6AAgLIANBAWohAwwACwALCyAAIAI6ACMgACABKQMANwMwIAAgASkDCDcDOCAAQUBrIAEpAxA3AwAgACABKQMYNwNIIARBQGskAAUgByADQQN0aiIIKwMAIQwgCCALOQMAIAsgDSAMoCADIAVIIANBAE5xuKAgDqChIQsgA0EBaiEDDAELCwUgByADQQN0aiIIKwMAIREgCCALOQMAIAsgDSARoCADIAVIIANBAE5xuKAgDqCgIQsgA0EBaiEDDAELCwu6FwMPfwR8AX4jAEHwAGsiBiQAIAEoAoABIgQEQCADIARB2N8KEIIJCyABIAI2AlAgBiABKQJkNwNgIAYgASkCXDcDWCAGIAEpAlQ3A1AQyQMhECAGQYCABDYCTCAGQYDAAEEBEBo2AkhBACEEA0AgBigCWCICIAVB//8DcSIITQRAIAEgBEEBakEEEBoiETYCVANAIApB//8DcSIIIAJPBEAgASALNgJ8IAEgDDYCeEEAIQUDQCACIAVNRQRAIAZBQGsgBikDWDcDACAGIAYpA1A3AzggBkE4aiAFEBkhAAJAAkACQCAGKAJgIgIOAgIAAQsgBigCUCAAQQJ0aigCABAYDAELIAYoAlAgAEECdGooAgAgAhEBAAsgBUEBaiEFIAYoAlghAgwBCwsgBkHQAGoiAEEEEDEgABA0IAYoAkxBIU8EQCAGKAJIEBgLIBAQ3QIgAS8BJCIAQYABcUUEQCABQQI6ACALIABBIHFFBEAgAUEBOgAhCyABKAJ0RQRAIAEgASgCfEEBakEIEBoiCDYCdCABKAJUIgQhAgNAIAIoAgAiAEUEQCAEIQUDQCAFKAIAIgIEQAJAIAIvAVAiAEEBRg0AIAEoAnwgAi8BVCIHIABqTwRAIAIrA0AhEyAIIAdBA3RqIQdEAAAAAAAAAAAhFEEAIQIDQCAAIAJGBEAgFCABLAAgIABBAWtstyIVoCATY0UNAyATIBWhIBShIAC4oyETQQAhAgNAIAAgAkYNBCAHIAJBA3RqIgkgEyAJKwMAoDkDACACQQFqIQIMAAsABSAUIAcgAkEDdGorAwCgIRQgAkEBaiECDAELAAsAC0GzvwNB1L0BQYkKQc0tEAAACyAFQQRqIQUMAQUCQANAIAQoAgAiAARAIAEoAnwgAC8BUCIFIAAvAVQiAmpJDQIgCCACQQN0aiEHQQAhAkQAAAAAAAAAACEUA0AgAiAFRgRAIAAgACsDQCAUIAEsACAgBUEBa2y3oBAjOQNAIARBBGohBAwDBSAUIAcgAkEDdGorAwCgIRQgAkEBaiECDAELAAsACwsgASgCcEUEQCABIAEoAnhBAWpBCBAaIgg2AnAgASgCVCIEIQIDQCACKAIAIgBFBEAgBCEFA0AgBSgCACICBEACQCACLwFSIgBBAUYNACABKAJ4IAIvAVYiByAAak8EQCACKwNIIRMgCCAHQQN0aiEHRAAAAAAAAAAAIRRBACECA0AgACACRgRAIBQgASwAICAAQQFrbLciFaAgE2NFDQMgEyAVoSAUoSAAuKMhE0EAIQIDQCAAIAJGDQQgByACQQN0aiIJIBMgCSsDAKA5AwAgAkEBaiECDAALAAUgFCAHIAJBA3RqKwMAoCEUIAJBAWohAgwBCwALAAtB/b0DQdS9AUHHCkH3JxAAAAsgBUEEaiEFDAEFAkADQCAEKAIAIgAEQCABKAJ4IAAvAVIiBSAALwFWIgJqSQ0CIAggAkEDdGohB0EAIQJEAAAAAAAAAAAhFANAIAIgBUYEQCAAIAArA0ggFCABLAAgIAVBAWtst6AQIzkDSCAEQQRqIQQMAwUgFCAHIAJBA3RqKwMAoCEUIAJBAWohAgwBCwALAAsLIAEoAnwiALhEAAAAAAAA8D+gIAEsACC3IhOiIAEtACFBAXS4IhWgIRQgASgCeCIEuEQAAAAAAADwP6AhFkEAIQIDQCAAIAJGBEAgFiAToiAVoCETQQAhAgNAIAIgBEYEQAJAIAEtACRBAXFFDQBBp+MDIQICQCABLwEmIgBFDQAgAS8BKCIERQ0AIBQgALhkRAAAAAAAAAAAIRRB/+EDIQIEQEQAAAAAAAAAACETDAELIBMgBLhkRAAAAAAAAAAAIRNFDQELIAJBABAqQQEhDQsgASAUIAEvASa4ECM5A0AgASATIAEvASi4ECM5A0ggASgCgAEEQCADQdjfChD/CAsgBkHwAGokACANDwUgEyAIIAJBA3RqKwMAoCETIAJBAWohAgwBCwALAAUgFCABKAJ0IAJBA3RqKwMAoCEUIAJBAWohAgwBCwALAAtBor0DQdS9AUHbCkH3JxAAAAsACwALAkAgAC8BUkEBTQRAIAAvAVYiBSABKAJ4Tw0BIAggBUEDdGoiBSAFKwMAIAArA0gQIzkDAAsgAkEEaiECDAELC0HLtgNB1L0BQboKQfcnEAAAC0GIwQNB1L0BQbIKQfcnEAAAC0HWvgNB1L0BQaAKQc0tEAAACwALAAsCQCAALwFQQQFNBEAgAC8BVCIFIAEoAnxPDQEgCCAFQQN0aiIFIAUrAwAgACsDQBAjOQMACyACQQRqIQIMAQsLQf62A0HUvQFB+AlBzS0QAAALQcHBA0HUvQFB6wlBzS0QAAALIAYgBikDWDcDMCAGIAYpA1A3AyggCLghFSAGKAJQIAZBKGogCBAZQQJ0aigCACEOQQAhAkEAIQ8DQCAOKAAIIA9NBEAgCkEBaiEKIAYoAlghAgwCCyAOKAIAIQQgBiAOKQIINwMgIAYgDikCADcDGCARIAQgBkEYaiAPEBlBAnRqKAIAIgc2AgAgByABNgJgIAcvASQiBEHAAHFFBEBBAiEFIAcgAS0AJEHAAHEEfyABLQAiBUECCzoAIgsgBEEgcUUEQAJAIAEsAGwiBEEATg0AQQEhBCABLQAkQSBxRQ0AIAEtACEhBAsgByAEOgAhCwJ/AkACQAJAIAcoAlxBAWsOAwACAQILQcAAIQUgACAHKAJYIAcgAxD6CCEJQcgADAILIAZB6ABqIAMoAjQgBygCWCIEKAIgEMwGAnwgBigCaCIFIAYoAmwiCXFBf0YEQCAGIAQoAiA2AhBB3vkEIAZBEGoQN0EBIQlEAAAAAAAAAAAhE0QAAAAAAAAAAAwBCyADKAI0KAIQQQE6AHIgCbchE0EAIQkgBbcLIRQgBEIANwMAIAQgEzkDGCAEIBQ5AxAgBEIANwMIQRAhBUEYDAELIAAoAhAoApABIAcoAlggAxD4CEEAIQlBICEFQSgLIAcoAlgiBGorAwAgBy0AISAHLQAiakEBdLgiE6AhFCAEIAVqKwMAIBOgIRMCQCAHLQAkQQFxBEBB9eIDIQQCQCAHLwEmIgVFDQAgBy8BKCISRQ0AAkAgEyAFuGQNAEQAAAAAAAAAACETIBQgErhkDQBEAAAAAAAAAAAhFAwDC0He4QMhBEQAAAAAAAAAACEURAAAAAAAAAAAIRMgBygCXEEDRg0CCyAEQQAQKkEBIQkLCyARQQRqIREgByATIAcvASa4IhYgEyAWZBs5A0AgByAUIAcvASi4IhMgEyAUYxs5A0ggAkH//wNxIQUgBy8BUEEBayEEA0AgBCAFaiECAkADQCACIAVIBEAgBSEEDAILIBAgArcgFRCrBkUEQCACQQFrIQIMAQsLIAJBAWohBQwBCwsDQAJAIAUgBy8BUGoiAiAESgRAIAS3IRMgCCECA0AgAiAHLwFSIAhqTw0CIBAgEyACuBC+AiACQQFqIQIMAAsACwJAIAVBgIAESQRAIAcgBTsBVCAHIAo7AVYgBy8BUiAGIAYpA0giFzcDaCAIaiIEIBdCIIinTw0BIAJB//8DcSIFIAtLIRIgBEEDdiAGQegAaiAXpyAXQoCAgICQBFQbai0AACAEQQdxdkEBcQRAIAcgBy0AZEECcjoAZAsgCSANciENIAUgCyASGyELIAQgDCAEIAxLGyEMIA9BAWohDwwEC0GjzgFB1L0BQZwJQaLtABAAAAtBybIDQe/6AEHCAEHpIhAAAAsgBEEBaiEEDAALAAsACwALIAYgBikDWDcDCCAGIAYpA1A3AwAgBigCUCAGIAgQGUECdGooAgAiAigACCEHAkAgAi0AGEEBRgRAIAhBAWoiAiAGKAJMIghPDQEgAkEDdiAGQcgAaiAGKAJIIAhBIUkbaiIIIAgtAABBASACQQdxdHI6AAALIAQgB2ohBCAFQQFqIQUMAQsLQZeyA0Hv+gBB0QBB3yEQAAALMwEBfwJAIABB4DYQJyIBBEAgAS0AAA0BCyAAQfU2ECciAQRAIAEtAAANAQtBACEBCyABC1gBAn8gBQRAIAAgASADIAIRBQALIAAQeSEGA0AgBgRAIAYgASAEEQAAIgcEQCAGIAcgAiADIAQgBRD8CAsgBhB4IQYMAQsLIAVFBEAgACABIAMgAhEFAAsLcwECfwJAIAAoAgQiAgRAIAIgARAuRQ0BCyAAKAJUIQMDQCADKAIAIgJFBEBBAA8LAkAgAigCBCIARQ0AIAAgARAuDQAgAg8LQQAhACADQQRqIQMgAigCXEEBRgRAIAIoAlggARD9CCEACyAARQ0ACwsgAAuTAQEHfwJAIABFDQAgACgCACEEA0AgACgCBCABTQRAIAQQGCAAEBgMAgsgBCABQQV0aiIGKAIAIQVBACECA0AgBigCBCACTQRAIAUQGCABQQFqIQEMAgUgBSACQThsaiIDKAIAEBgCQCADKAIIIgdFDQAgAygCDCIDRQ0AIAcgAxEBAAsgAkEBaiECDAELAAsACwALC0MCAX8BfCABKAIAIgIEQCAAIAI2AhALIAEoAgQiAgRAIAAgAjYCFAsgASsDECIDRAAAAAAAAAAAZgRAIAAgAzkDIAsL4AgCBH8EfCMAQaABayIDJAAgACABKAIYIgRBhfUAIAQbEEkCQCABLQAqIgRBGHEiBQRAIANBADYCLCADQfitAUHapwEgBEEQcRtBACAFGzYCKCAAIANBKGoQ5QEMAQsgACAAKAIAKALIAhDlAQsgACABLQAhuBCHAgJAIAEtACpBAnEEQCABLQAhIQEgAyACKQMANwMwIAMgAikDCDcDOCADIAIpAxg3A1ggAyACKQMQNwNQIAMrAzAhCCADKwNQIQkCQCABQQFNBEAgAysDWCEHIAMrAzghCgwBCyADIAG4RAAAAAAAAOA/oiIHIAigIgg5AzAgAyAHIAMrAzigIgo5AzggAyAJIAehIgk5A1AgAyADKwNYIAehIgc5A1gLIAMgBzkDaCADIAg5A2AgAyAKOQNIIAMgCTkDQCADQQQ2AiQgA0EENgIgIAAgA0EwakEEIANBIGpBABCWAwwBCyABLwEkQYD4AHEiBgRAIAEtACEhASADIAIpAwg3A0ggAyACKQMANwNAIAMgAikDGDcDaCADIAIpAxA3A2AgAysDQCEIIAMrA2AhCQJAIAFBAU0EQCADKwNoIQcgAysDSCEKDAELIAMgAbhEAAAAAAAA4D+iIgcgCKAiCDkDQCADIAcgAysDSKAiCjkDSCADIAkgB6EiCTkDYCADIAMrA2ggB6EiBzkDaAsgA0HgAGohBSADQUBrIQEgAyAHOQN4IAMgCDkDcCADIAo5A1ggAyAJOQNQIANB8ABqIQIgA0HQAGohBAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBkGACGtBCnYODgMCBgENBQkABwwKBAsIDwsgACABQQIQPQwOCyAAIARBAhA9DA0LIAAgBUECED0MDAsgAyACKQMANwMwIAMgAikDCDcDOCAAIANBMGpBAhA9DAsLIAAgAUEDED0MCgsgACAEQQMQPQwJCyADIAEpAwg3A4gBIAMgASkDADcDgAEgACAFQQMQPQwICyADIAIpAwA3AzAgAyACKQMINwM4IAAgA0EwakEDED0MBwsgACABQQQQPQwGCyADIAEpAwg3A4gBIAMgASkDADcDgAEgACAEQQQQPQwFCyADIAEpAwg3A4gBIAMgASkDADcDgAEgAyAEKQMINwOYASADIAQpAwA3A5ABIAAgBUEEED0MBAsgAyACKQMANwMwIAMgAikDCDcDOCAAIANBMGpBBBA9DAMLIAAgAUECED0gACAFQQIQPQwCCyADIAIpAwA3AzAgAyACKQMINwM4IAAgA0EwakECED0gACAEQQIQPQwBCyABLQAhIgFBAk8EQCACIAG4RAAAAAAAAOA/oiIIIAIrAwCgOQMAIAIgCCACKwMIoDkDCCACIAIrAxAgCKE5AxAgAiACKwMYIAihOQMYCyADIAIpAxg3AxggAyACKQMQNwMQIAMgAikDCDcDCCADIAIpAwA3AwAgACADQQAQiAILIANBoAFqJAALZwEBfyMAQRBrIgUkAAJ/IAEgBCAFQQhqEIsEBEAgACAEKAIAEF0gACAEKAIEIgFBhfUAIAEbIAIgBSsDCBCOA0EDQQIgAy0AAEEBcRsMAQsgACABEF1BAQsgAEG7HxBJIAVBEGokAAusAQIBfwF8AkAgACgCECIDRQ0AIAEoAgAEQCACIAM2AgAgACABKAIANgIQDAELIAJBADYCAAsCQCAAKAIUIgNFDQAgASgCBARAIAIgAzYCBCAAIAEoAgQ2AhQMAQsgAkEANgIECyAAKwMgIgREAAAAAAAAAABmBEAgASsDEEQAAAAAAAAAAGYEQCACIAQ5AxAgACABKwMQOQMgDwsgAkKAgICAgICA+L9/NwMQCwuwBQIMfwd8IwBBgAFrIgMkACABKAIEIgwEQCACKwAgIRQgAigAFCEHIAIoABAhCiABLQAIIQ0gASgCACEOIAIrAwAhECABKwMQIRUgASsDICERIAIrAwghEiABKwMYIRMgASsDKCEPIANCADcDGCADIBIgDyAToEQAAAAAAADgP6KgIA8gE6FEAAAAAAAA4D+ioDkDICAAQQEQ2wggESAVoUQAAAAAAADgP6IiEiAQIBEgFaBEAAAAAAAA4D+ioCIRoCETIBEgEqEhEgNAIAUgDEcEQAJ8IBIgDiAFQQV0aiIELQAIIgFB7ABGDQAaIAFB8gBGBEAgEyAEKwMQoQwBCyARIAQrAxBEAAAAAAAA4L+ioAshECADIAMrAyAgBCsDGKE5AyAgBCgCACEBQQAhCANAIAQoAgQgCE0EQCAFQQFqIQUMAwUgAwJ/AkAgASgCBCIGRQRAIAMgBzYCLCADIAo2AiggAyAUOQM4IAMoAkAhCSAHIQsMAQsgAyAGKwMQIg8gFCAPRAAAAAAAAAAAZBs5AzggAyAGKAIAIgIgCiACGzYCKCADIAYoAgQiAiAHIAIbIgs2AiwgAygCQCEJIAYoAhhB/wBxIgJFDQAgCUGAf3EgAnIMAQsgCUGAf3ELNgJAIAAgCxBJIAMgASgCADYCSCADIANBKGo2AkwgAyABKwMQOQNYIAMgDQR8IAErAxgFRAAAAAAAAPA/CzkDYCADIAEoAgQoAgg2AjAgAyABKAIINgJQIAMgASsDIDkDaCAEKwMYIQ8gAyADKQMgNwMQIANB7AA6AHggAyAPOQNwIAMgEDkDGCADIAMpAxg3AwggACADQQhqIANByABqEJkGIAhBAWohCCAQIAErAyCgIRAgAUE4aiEBDAELAAsACwsgABDaCAsgA0GAAWokAAubFgIKfwh8IwBBwAVrIgMkACADIAEpA0g3A+ADIAMgAUFAaykDADcD2AMgAyABKQM4NwPQAyADIAEpAzA3A8gDQQEhCgJAIAEoAgANACABKAIIDQAgASgCDEEARyEKCyACKwMAIQ0gAisDCCEOIAEoAlQhBiABKAKAASIEBEAgAiAEQbDfChCCCQsgAyANIAMrA8gDoDkDyAMgAyANIAMrA9gDoDkD2AMgAyAOIAMrA9ADoDkD0AMgAyAOIAMrA+ADoDkD4ANBASELAkAgCkUNACAALQCYAUEEcQ0AIAMgAykD4AM3A9ACIAMgAykD2AM3A8gCIAMgAykD0AM3A8ACIAMgAykDyAM3A7gCIAAgAiABIANBuAJqIANBpANqEOYERSELCwJAAkACQCABLQAqQQRxDQAgASgCFCIEBEAgA0IANwOABSABKAIcIQggAyABLQAqOgC3AiAAIAQgCCADQbcCaiADQYAFahCBCSEEAkAgAS0AKkECcQRAIAEtACEhCCADIAMpA+ADNwOIAyADIAMpA8gDNwPgAiADIAMpA9gDNwOAAyADIAMpA9ADNwPoAiADKwPgAiEOIAMrA4ADIQ0CQCAIQQFNBEAgAysDiAMhDyADKwPoAiEQDAELIAMgCLhEAAAAAAAA4D+iIg8gDqAiDjkD4AIgAyAPIAMrA+gCoCIQOQPoAiADIA0gD6EiDTkDgAMgAyADKwOIAyAPoSIPOQOIAwsgAyAPOQOYAyADIA45A5ADIAMgEDkD+AIgAyANOQPwAiADQQQ2AtwCIANBBDYCsAIgACADQeACakEEIANBsAJqIAQQlgMMAQsgAyADKQPgAzcDqAIgAyADKQPYAzcDoAIgAyADKQPQAzcDmAIgAyADKQPIAzcDkAIgACADQZACaiAEEIgCCyADKAKABRAYIAMoAoQFEBgLA0AgBigCACIEBEAgAyAEKQNINwPQBCADIARBQGspAwA3A8gEIAMgBCkDODcDwAQgAyAEKQMwNwO4BEEBIQkCf0EBIAQoAgANABpBASAEKAIIDQAaIAQoAgxBAEcLIQggAisDCCENIAMgAisDACIOIAMrA7gEoDkDuAQgAyAOIAMrA8gEoDkDyAQgAyANIAMrA8AEoDkDwAQgAyANIAMrA9AEoDkD0AQCQCAIRQ0AIAAtAJgBQQRxDQAgAyADKQPQBDcDiAIgAyADKQPIBDcDgAIgAyADKQPABDcD+AEgAyADKQO4BDcD8AEgACACIAQgA0HwAWogA0HcBGoQ5gRFIQkLAkAgBC0AKkEEcQ0AIAQoAhQiBQRAIAQoAhwhByADIAQtACo6AO8BIAAgBSAHIANB7wFqIANBgAVqEIEJIQUCQCAELQAqQQJxBEAgBC0AISEHIAMgAykDuAQ3A/ADIAMgAykDwAQ3A/gDIAMgAykD0AQ3A5gEIAMgAykDyAQ3A5AEIAMrA/ADIQ4gAysDkAQhDQJAIAdBAU0EQCADKwOYBCEPIAMrA/gDIRAMAQsgAyAHuEQAAAAAAADgP6IiDyAOoCIOOQPwAyADIA8gAysD+AOgIhA5A/gDIAMgDSAPoSINOQOQBCADIAMrA5gEIA+hIg85A5gECyADIA85A6gEIAMgDjkDoAQgAyAQOQOIBCADIA05A4AEIANBBDYC7AMgA0EENgLoASAAIANB8ANqQQQgA0HoAWogBRCWAwwBCyADIAMpA9AENwPgASADIAMpA8gENwPYASADIAMpA8AENwPQASADIAMpA7gENwPIASAAIANByAFqIAUQiAILIAMoAoAFEBgLIAQtACEEQCADIAMpA9AENwPAASADIAMpA8gENwO4ASADIAMpA8AENwOwASADIAMpA7gENwOoASAAIAQgA0GoAWoQgAkLIAQoAlghBQJAAkACQCAEKAJcQQFrDgMAAgECCyAAIAUgAhCECQwCCyAFKwMQIQ4gBSsDGCEPIAIrAwAhDSAFKwMAIRAgAyAFKwMIIAIrAwgiEqAiETkDqAUgAyAQIA2gIhA5A6AFIAMgDyASoCIPOQOIBSADIA4gDaAiDTkDgAUgAyAROQO4BSADIA05A7AFIAMgDzkDmAUgAyAQOQOQBSAFKAIkIgdFBEAgAigCOCEHCyAFKAIgIgVFDQUgBS0AAEUNBiAAIAUgA0GABWpBBEEBIAdBgLQBENgIDAELIAAgBSACEIMJCyAJRQRAIAAgA0HcBGoQ5QQLAkAgCEUNACAALQCYAUEEcUUNACADIAMpA9AENwOgASADIAMpA8gENwOYASADIAMpA8AENwOQASADIAMpA7gENwOIASAAIAIgBCADQYgBaiADQdwEaiIHEOYERQ0AIAAgBxDlBAsgBkEEaiEGDAELCyABKAJUIQggAEQAAAAAAADwPxCHAgNAIAgoAgAiBARAIAhBBGohCCAELQBkIgZBAnEgBkEBcXJFDQEgCCgCACEJIAIrAwAhECACKwMIIQ0gACABKAIYIgZBhfUAIAYbIgYQXSAAIAYQSSANIAQrAzigIQ8gECAEKwNAoCESIAQrAzAhEwJAIAQtAGQiBkEBcUUNACAEKAJgIgUoAnwgBC8BUCAELwFUak0NACANIAQrA0igIRQCQCAELwFWIgZFBEAgDyAFLAAgIgZBAm3AIge3Ig6hIQ0gByAFLQAharchEQwBCyAFKAJ4IAQvAVIgBmpGBEAgDyAFLAAgIgZBAm3AIge3Ig6hIAcgBS0AIWq3IhGhIQ0MAQsgDyAFLAAgIgZBAm3AtyIOoSENRAAAAAAAAAAAIRELIAMgDTkDiAUgAyASIA6gIg45A5AFIAMgDSAUIBGgIA+hIAa3oKA5A5gFIAMgAykDiAU3A3AgAyADKQOQBTcDeCADIAMpA5gFNwOAASADIA45A4AFIAMgAykDgAU3A2ggACADQegAakEBEIgCIAQtAGQhBgsgBkECcUUNASAEKAJgIgYoAnggBC8BViIHIAQvAVJqTQ0BIBAgE6AhEQJAIAQvAVQiBUUEQCARIAYsACAiBUECbcAiDCAGLQAharciDaEgDLciDqEhEyAGKAJ8IAQvAVBGBEAgDSANoCENDAILIAlFDQEgCS8BViAHRg0BIBAgBisDQKAgEiAOoKEgDaAhDQwBCyAGKAJ8IAQvAVAgBWpGBEAgESAGLAAgIgVBAm3AIgS3Ig6hIRMgBCAGLQAharchDQwBCyARIAYsACAiBUECbcC3Ig6hIRNEAAAAAAAAAAAhDSAJRQ0AIAkvAVYgB0YNACAQIAYrA0CgIBIgDqChRAAAAAAAAAAAoCENCyADIA8gDqEiDjkDiAUgAyAORAAAAAAAAAAAoDkDmAUgAyATOQOABSADIBMgEiANoCARoSAFt6CgOQOQBSADIAMpA4gFNwNQIAMgAykDmAU3A2AgAyADKQOQBTcDWCADIAMpA4AFNwNIIAAgA0HIAGpBARCIAgwBCwsgAS0AIUUNACADQUBrIAMpA+ADNwMAIAMgAykD2AM3AzggAyADKQPQAzcDMCADIAMpA8gDNwMoIAAgASADQShqEIAJCyALRQRAIAAgA0GkA2oQ5QQLAkAgCkUNACAALQCYAUEEcUUNACADIAMpA+ADNwMgIAMgAykD2AM3AxggAyADKQPQAzcDECADIAMpA8gDNwMIIAAgAiABIANBCGogA0GkA2oiBxDmBEUNACAAIAcQ5QQLIAEoAoABBEAgAkGw3woQ/wgLIANBwAVqJAAPC0HSsgFB1L0BQesEQYOBARAAAAtB8MgBQdS9AUHsBEGDgQEQAAALeQICfwJ8IwBBEGsiASQAIAAoAgRBAWsiAkEDTwRAIAFB5AU2AgQgAUHUvQE2AgBBiPYIKAIAQdi/BCABECAaEDsACyAAKAIAIgAgAkECdCICQfS+CGooAgBqKwMAIQMgACACQei+CGooAgBqKwMAIAFBEGokACADoQtIAQJ/IAAQmgFBEBAaIQIgABCuASEAIAIhAQNAIAAEQCABIAApAwg3AwAgASAAKQMQNwMIIAFBEGohASAAKAIAIQAMAQsLIAILNAEBf0EYEFIiAiABKQMINwMQIAIgASkDADcDCCAAIAJBASAAKAIAEQMAIAJHBEAgAhAYCwsJACAAKAIAEBgL5wIBBn8jAEEwayICJAAgAEHUAGohAwNAIAAoAFwiASAETQRAQQAhBANAIAEgBE1FBEAgAiADKQIINwMoIAIgAykCADcDICACQSBqIAQQGSEBAkACQAJAIAAoAmQiBQ4CAgABCyADKAIAIAFBAnRqKAIAEBgMAQsgAygCACABQQJ0aigCACAFEQEACyAEQQFqIQQgACgAXCEBDAELCyADQQQQMSADEDQgABDkBCAAEBggAkEwaiQADwsgAygCACACIAMpAgg3AxggAiADKQIANwMQIAJBEGogBBAZQQJ0aigCACEFQQAhAQNAIAUoAAggAU0EQCAEQQFqIQQMAgUgBSgCACEGIAIgBSkCCDcDCCACIAUpAgA3AwACQAJAAkAgBiACIAEQGUECdGooAgAiBigCXEEBaw4CAAECCyAGKAJYEIkJDAELIAYoAlgQ/ggLIAYQ5AQgBhAYIAFBAWohAQwBCwALAAsACyEBAX8DQCAALQAAIQEgAEEBaiEAIAFBIEYNAAsgAUEARwtDAAJAIAAQKARAIAAQJEEPRg0BCyAAEI0JCwJAIAAQKARAIABBADoADwwBCyAAQQA2AgQLIAAQKAR/IAAFIAAoAgALC4AEAQh/IwBB8ABrIgMkACAAQQhqIQQCQAJAAkAgACgAECIFBEAgBUE4EBohBgNAIAIgACgAEE8NAiAEKAIAIQcgAyAEKQIINwNoIAMgBCkCADcDYCAGIAJBOGxqIAcgA0HgAGogAhAZQThsaiIHQTgQHxogB0EAQTgQOBogAkEBaiECDAALAAtBOBBSIQZB8f8EEKUBIgJFDQEgBiACNgIAIAAoAJwBIQIgACgClAEhBSADIAApApwBNwNYIAMgACkClAE3A1AgBiAFIANB0ABqIAJBAWsQGUECdGooAgA2AgRBASEFC0EAIQIDQCACIAAoABBPDQIgAyAEKQIINwNIIAMgBCkCADcDQCADQUBrIAIQGSEHAkACQAJAIAAoAhgiCA4CAgABC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALIANBCGoiCSAEKAIAIAdBOGxqQTgQHxogCSAIEQEACyACQQFqIQIMAAsACyADQQE2AgBBiPYIKAIAQfXpAyADECAaEC8ACyAEQTgQMSAAQgA3AHkgACABOgB4IAAgBTYCdCAAIAY2AnAgAEIANwCBASAAQgA3AIgBIABB2ABqQSAQJiEBIAAoAlggAUEFdGoiASAAKQNwNwMAIAEgACkDiAE3AxggASAAKQOAATcDECABIAApA3g3AwggA0HwAGokAAvRAgEFfyMAQRBrIgQkAAJAAkAgABAkIAAQS08EQCAAEEsiA0EBaiIBIANBAXRBgAggAxsiAiABIAJLGyEBIAAQJCEFAkAgAC0AD0H/AUYEQCADQX9GDQMgACgCACECIAFFBEAgAhAYQQAhAgwCCyACIAEQaiICRQ0EIAEgA00NASACIANqQQAgASADaxA4GgwBCyABQQEQGiICIAAgBRAfGiAAIAU2AgQLIABB/wE6AA8gACABNgIIIAAgAjYCAAsgABAkIQECQCAAECgEQCAAIAFqQQA6AAAgACAALQAPQQFqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABBrwJBxLIBEAAACyAAKAIAIAFqQQA6AAAgACAAKAIEQQFqNgIECyAEQRBqJAAPC0GOwANB0vwAQc0AQb2zARAAAAsgBCABNgIAQYj2CCgCAEH16QMgBBAgGhAvAAuMAwEHfyMAQUBqIgIkAEEwEFIhBiAAKAAQBEAgAEEAEIwJCyAGIAAoAGAiAzYCBCAGIANBIBAaIgc2AgAgAEHYAGohBEEAIQMDQCAAKABgIgEgA00EQAJAQQAhAwNAIAEgA00NASACIAQpAgg3AzggAiAEKQIANwMwIAJBMGogAxAZIQECQAJAAkAgACgCaCIFDgICAAELQbCDBEHCAEEBQYj2CCgCABA6GhA7AAsgAiAEKAIAIAFBBXRqIgEpAxg3AyggAiABKQMQNwMgIAIgASkDCDcDGCACIAEpAwA3AxAgAkEQaiAFEQEACyADQQFqIQMgACgAYCEBDAALAAsFIAQoAgAhASACIAQpAgg3AwggAiAEKQIANwMAIAcgA0EFdGoiBSABIAIgAxAZQQV0aiIBKQMANwMAIAUgASkDGDcDGCAFIAEpAxA3AxAgBSABKQMINwMIIAFCADcDACABQgA3AwggAUIANwMQIAFCADcDGCADQQFqIQMMAQsLIARBIBAxIAJBQGskACAGCxgBAX9BCBBSIgIgADYCACACIAE2AgQgAgsfAQF/IAIpAwBCAFkgAUcEfyAAIAJBCGoQTQVBAQtFC0kBAn8jAEEQayICJAAgARClASIDRQRAIAIgARBAQQFqNgIAQYj2CCgCAEH16QMgAhAgGhAvAAsgACADEPIBIAMQGCACQRBqJAALPAEBfyMAQRBrIgIkACAAQQE2AiQgAEGMAjYCCCACIAAQrAY2AgQgAiABNgIAQd/+BCACEDcgAkEQaiQAC5ABAQR/IwBBEGsiASQAA0AgAiAAKAAIT0UEQCABIAApAgg3AwggASAAKQIANwMAIAEgAhAZIQMCQAJAAkAgACgCECIEDgICAAELIAAoAgAgA0ECdGooAgAQGAwBCyAAKAIAIANBAnRqKAIAIAQRAQALIAJBAWohAgwBCwsgAEEEEDEgABA0IAAQGCABQRBqJAALPQIBfwF+IwBBEGsiASQAIAApAjQhAiABIAApAixCIIk3AwggASACQiCJNwMAQe/oBCABEIABIAFBEGokAAs7AQF/QQEhBAJAIABBASAAKAKcASABIAIgAyAALQD8A0VBARCwBiIBRQRAIAAQoQlFDQELIAEhBAsgBAu9BQEGfyMAQRBrIgckACAHIAIoAgAiCDYCDAJ/IAAoApwBIAFGBEAgACAINgKoAiAAQagCaiEJIABBrAJqDAELIAAoArQCIglBBGoLIQwgCSAINgIAIAJBADYCAAJ/A0AgByAHKAIMIgg2AgggACABIAggAyAHQQhqIAEoAggRBgAiCiAHKAIMIAcoAghBiyQgBhCbAkUEQCAAEOACQSsMAgsgDCAHKAIIIgg2AgACQAJAAkACQAJAAkACQAJAAkACQAJAIApBBGoODAQFAwQKBQUFBQUCAQALIApBKEcNBAJAIAAoAlgiAwRAIAAoAgQgAxEBAAwBCyAAKAJcRQ0AIAAgASAHKAIMIAgQhwELIAIgBygCCCIBNgIAIAQgATYCAEEjQQAgACgC+ANBAkYbDAsLIAAoAkgiCgRAIAdBCjoAByAAKAIEIAdBB2pBASAKEQUADAYLIAAoAlxFDQUgACABIAcoAgwgCBCHAQwFCyAAKAJIIgoEQCABLQBEDQQDQCAHIAAoAjg2AgAgASAHQQxqIAggByAAKAI8IAEoAjgRCAAgDCAHKAIINgIAIAAoAgQgACgCOCILIAcoAgAgC2sgChEFAEEBTQ0GIAkgBygCDDYCACAHKAIIIQgMAAsACyAAKAJcRQ0EIAAgASAHKAIMIAgQhwEMBAtBBiAFRQ0IGiAEIAcoAgw2AgBBAAwIC0EUIAVFDQcaIAQgBygCDDYCAEEADAcLIAkgCDYCAAwCCyAAKAIEIAcoAgwiCyAIIAtrIAoRBQALAkACQAJAIAAoAvgDQQFrDgMCAQAECyAJIAcoAggiADYCACAEIAA2AgBBAAwGCyAJIAcoAgg2AgBBIwwFCyAALQDgBEUNAQtBFwwDCyAHIAcoAggiCDYCDCAJIAg2AgAMAQsLIAkgCDYCAEEECyAHQRBqJAALUQEBfwNAIAEEQCAAKAJ0IgIEQCAAKAIEIAEoAgAoAgAgAhEEAAsgASgCBCABIAAoApADNgIEIAAgATYCkAMgASgCACABKAIINgIEIQEMAQsLC6YVAhd/An4jAEHQAGsiDCQAAkACQCAAIAAoAvwCIhRBFGoiBiADKAIAQQAQlwEiDQ0AQQEhCCAUQdAAaiADKAIAELMJIgdFDQEgACAGIAdBGBCXASINRQ0BIAAtAPQBRQ0AIAAgDRCgCUUNAQsgDSgCDCEGQQEhCCABIAIgACgClAMgACgCoAMgASgCJBEGACIHIAZB/////wdzSg0AAkACQCAGIAdqIgogACgClAMiCUwNACAHQe////8HIAZrSiAGQe////8HSnINAiAAIApBEGoiCjYClAMgCkGAgICAAU8NASAAIAAoAqADIApBBHRBth4QmgIiCkUNASAAIAo2AqADIAcgCUwNACABIAIgByAKIAEoAiQRBgAaC0EAIQogB0EAIAdBAEobIRMgBkEAIAZBAEobIREgAEG4A2ohEiAAKAKgAyEPQQAhCUEAIQcDQCAJIBNHBEBBASEIIAAgASAJQQR0IgYgACgCoANqKAIAIgIgASACIAEoAhwRAAAgAmoQqwkiAkUNAyACKAIAQQFrIg4tAAAEQEEIIQggASAAKAKcAUcNBCAAIAYgACgCoANqKAIANgKoAgwECyAOQQE6AAAgDyAHQQJ0aiACKAIANgIAIAdBAWohCwJAIAAoAqADIAZqIg4tAAxFBEBBACEGAkAgAi0ACEUNAANAIAYgEUYNASAGQQxsIRAgBkEBaiEGIAIgECANKAIUaiIQKAIARw0ACyAQLQAEIQgLIAAgASAIIA4oAgQgDigCCCASIAUQqAkiCA0FIA8gC0ECdGogACgCyAM2AgAMAQsgDyALQQJ0aiASIAEgDigCBCAOKAIIEIYBIgY2AgAgBkUNBAsgACAAKALEAzYCyAMCQAJAIAIoAgQiBgRAIAItAAkNASACKAIAQQFrQQI6AAAgCkEBaiEKCyAHQQJqIQcMAQsgACAGIAIgDyALQQJ0aigCACAEELsGIggNBAsgCUEBaiEJDAELCyAAIAc2ApgDAkACQCANKAIIIgFFBEBBfyEGDAELQX8hBiABKAIAIgFBAWstAABFDQBBACEGA0AgBiAHTg0CIA8gBkECdGooAgAgAUYNASAGQQJqIQYMAAsACyAAIAY2ApwDC0EAIQYDQCAGIBFHBEACQCANKAIUIAZBDGxqIgEoAgAiAigCAEEBayIFLQAADQAgASgCCCIIRQ0AAkAgAigCBCIJBEAgAi0ACUUEQCAFQQI6AAAgCkEBaiEKDAILIAAgCSACIAggBBC7BiIIRQ0CDAYLIAVBAToAAAsgDyAHQQJ0aiICIAEoAgAoAgA2AgAgAiABKAIINgIEIAdBAmohBwsgBkEBaiEGDAELCyAPIAdBAnRqQQA2AgBBACEJAkACQAJAAkAgCkUNACAALQCsAyIBQR9LDQMCQAJAAkAgCkEBdCABdQRAIAEhBgNAIAZB/wFxIQUgBkEBaiICIQYgCiAFdQ0ACyAAIAI6AKwDAn8gAkH/AXEiBUECTQRAQQMhBiAAQQM6AKwDQQgMAQsgBUEgTw0HQQEhCCACQf8BcSIGQR1PDQRBASAGdAshBSAAIAAoAqQDQQwgBnRB+R8QmgIiAkUNBiAAIAI2AqQDDAELQQEgAXQhBSAAKAKoAyIIDQELIAAoAqQDIQFBfyEIIAUhBgNAIAZFDQEgASAGQQFrIgZBDGxqQX82AgAMAAsACyAAIAhBAWsiEzYCqANBACAFayEVIBRBKGohFiAFQQFrIhdBAnYhGCAMQThqIRkDQCAHIAlMDQICQCAPIAlBAnRqIhooAgAiAUEBayICLQAAQQJGBEAgACAMQQhqEJsJIAxCADcDSCAMIBk2AkAgDCAMKQMIIh1C9crNg9es27fzAIU3AxggDCAMKQMQIh5C88rRy6eM2bL0AIU3AzAgDCAdQuHklfPW7Nm87ACFNwMoIAwgHkLt3pHzlszct+QAhTcDICACQQA6AABBASEIIAAgFiABQQAQlwEiAkUNCSACKAIEIgJFDQkgAigCBCIORQ0FQQAhBgNAAkAgDigCECECIAYgDigCFCILTw0AIAIgBmotAAAhCyAAKALEAyICIAAoAsADRgRAIBIQX0UNDCAAKALEAyECCyAAIAJBAWo2AsQDIAIgCzoAACAGQQFqIQYMAQsLIAxBGGogAiALEK8GA0AgAS0AACABQQFqIgYhAUE6Rw0ACyAGIAYQmgkQrwYDQCAAKALEAyICIAAoAsADRgRAIBIQX0UNCyAAKALEAyECCyAGLQAAIQsgACACQQFqNgLEAyACIAs6AAAgBi0AACAGQQFqIQYNAAsQmQmnIgsgFXEhGyALIBdxIQEgACgCpAMhHEEAIREDQCATIBwgAUEMbCIQaiICKAIARgRAAkAgAigCBCALRw0AIAIoAgghAiAAKALIAyEGA0ACQCAGLQAAIhBFDQAgECACLQAARw0AIAJBAWohAiAGQQFqIQYMAQsLIBANAEEIIQgMDAsgEUH/AXFFBEAgGyAALQCsA0EBa3YgGHFBAXIhEQsgASARQf8BcSICayAFQQAgASACSRtqIQEMAQsLIAAtAPUBBEAgACgCxANBAWsgAC0A8AM6AAAgDigCACgCACEGA0AgACgCxAMiAiAAKALAA0YEQCASEF9FDQwgACgCxAMhAgsgBi0AACEBIAAgAkEBajYCxAMgAiABOgAAIAYtAAAgBkEBaiEGDQALCyAAKALIAyEBIAAgACgCxAM2AsgDIBogATYCACAAKAKkAyAQaiICIAE2AgggAiALNgIEIAIgEzYCACAKQQFrIgoNASAJQQJqIQkMBAsgAkEAOgAACyAJQQJqIQkMAAsACyAAIAE6AKwDDAULA0AgByAJTARAA0ACQCAEKAIAIgFFDQAgASgCDCgCAEEBa0EAOgAAIAFBBGohBAwBCwsFIA8gCUECdGooAgBBAWtBADoAACAJQQJqIQkMAQsLQQAhCCAALQD0AUUNBAJAIA0oAgQiAQRAIAEoAgQiB0UNAiADKAIAIQYDQCAGLQAAIAZBAWoiDSEGQTpHDQALDAELIBQoApwBIgdFDQUgAygCACENCyAHKAIAKAIAIQRBACEGQQAhAQJAIAAtAPUBRQ0AIARFDQBBACECA0AgAiAEaiACQQFqIgEhAi0AAA0ACwsgAyANNgIEIAcoAhQhCSADIAE2AhQgAyAENgIIIAMgCTYCEANAIAYiAkEBaiEGIAIgDWotAAANAAtBASEIIAkgAUH/////B3NKDQQgAiABIAlqIgRB/////wdzTw0EAkAgBCAGaiIEIAcoAhhMBEAgBygCECEEDAELIARB5////wdKDQUgACAEQRhqIgVBriEQmAEiBEUNBSAHIAU2AhggBCAHKAIQIAcoAhQQHyEFIABBhANqIQgDQCAIKAIAIggEQCAIKAIMIAcoAhBHDQEgCCAFNgIMDAELCyAAIAcoAhBBtiEQZyAHIAU2AhAgBygCFCEJCyAEIAlqIA0gBhAfIQQgAQRAIAIgBGoiAiAALQDwAzoAACACQQFqIAcoAgAoAgAgARAfGgsgAyAHKAIQNgIAQQAhCAwEC0EbIQgMAwsgACABOgCsAwtBASEIDAELIAAgCTYClAMLIAxB0ABqJAAgCAvsAQIBfgF/IAApAzAgACgCKCAAQSBqayICrXxCOIYhAQJAAkACQAJAAkACQAJAAkAgAsBBAWsOBwYFBAMCAQAHCyAAMQAmQjCGIAGEIQELIAAxACVCKIYgAYQhAQsgADEAJEIghiABhCEBCyAAMQAjQhiGIAGEIQELIAAxACJCEIYgAYQhAQsgADEAIUIIhiABhCEBCyABIAAxACCEIQELIAAgACkDGCABhTcDGCAAQQIQrgYgACAAKQMAIAGFNwMAIAAgACkDEEL/AYU3AxAgAEEEEK4GIAApAxggACkDECAAKQMIIAApAwCFhYULIQEBfwNAIAAtAAAEQCABQQFqIQEgAEEBaiEADAELCyABCzQAIAFCADcDACAAQQAQvwIiACgC9AMEQEGtOEGfvQFB4wlBnSAQAAALIAEgADUCiAQ3AwgLeQECfwNAAkAgAC0AACICBEAgAkENRw0BIAAhAQNAAn8gAkENRgRAIAFBCjoAACAAQQJqIABBAWogAC0AAUEKRhsMAQsgASACOgAAIABBAWoLIQAgAUEBaiEBIAAtAAAiAg0ACyABQQA6AAALDwsgAEEBaiEADAALAAuhAwEDfyMAQaABayICJAAgAkIANwOYASACQgA3A5ABIAIgACgCACIDKAIcIgQEfyACIAQ2AoABIAJBkAFqQY/MAyACQYABahB0IAAoAgAFIAMLKAIUNgJ0IAIgATYCcCACQZABaiIDQe6xASACQfAAahB0AkAgACgCUCIBLQAABEAgAiABNgJgIANB1awDIAJB4ABqEHQMAQsCQAJAAkAgACgCLEEBa0ECbUEBaw4DAgABAwsgAkGAgAE2AiAgAkGQAWoiAUGyqAMgAkEgahB0IAAoAgBBNGoQJEUNAiACIAAoAgBBNGoQ4gI2AhAgAUGaMiACQRBqEHQMAgsgAkGAgAE2AkAgAkGQAWoiAUHupwMgAkFAaxB0IAAoAgBBNGoQJEUNASACIAAoAgBBNGoQ4gI2AjAgAUGCMiACQTBqEHQMAQsgAkGAgAE2AlAgAkGQAWpB8KgDIAJB0ABqEHQLIAJBkAFqIgFBChDKAyACIAEQ4gI2AgBBrzQgAhA3IAItAJ8BQf8BRgRAIAIoApABEBgLIABBATYCLCACQaABaiQAC9QBAQZ/IwBBMGsiBCQAIAAoAvQDRQRAIAAoAtwEBEAgACgC0AQhBiAAKALYBCEHIAAoAtQEIQUgAS0AIiEIIAEoAgAhCSABKAIIIQEgBCADNgIoIAQgATYCJCAEIAI2AiAgBCAJNgIcIARB8f8ENgIUIARBuK0DQbatAyAIGzYCGCAEIAVBAXRBAms2AhAgBCAHNgIMIAQgBTYCCCAEIAY2AgQgBCAANgIAQYj2CCgCAEHD9QQgBBAgGgsgBEEwaiQADwtBrThBn70BQanDAEGkKBAAAAvBBwEIfyMAQRBrIgkkACAAQdADaiELIAlBCGohDCAFIAAoAvwCIgpB0ABqRyENAkACQANAIAkgAzYCDCAAIAEgAyAEIAlBDGogASgCEBEGACIIIAMgCSgCDEG/MyAGEJsCRQRAIAAQ4AJBKyEFDAMLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAIQQRqDg8KBAcBAAcHBwcHAwsHBQIGC0EEIQUgASAAKAKcAUcNDyAAIAkoAgw2AqgCDA8LQQQhBSABIAAoApwBRw0ODA0LIAEgAyABKAIoEQAAIghBAEgEQEEOIQUgASAAKAKcAUYNDQwOCyACIAhBIEdyRQRAIAUoAgwiAyAFKAIQRg0KIANBAWstAABBIEYNCgtBACEDIAggCUEIahCTBCIIQQAgCEEAShshDgNAIAMgDkYNCiAFKAIMIgggBSgCCEYEQCAFEF9FDQwgBSgCDCEICyAJQQhqIANqLQAAIQ8gBSAIQQFqNgIMIAggDzoAACADQQFqIQMMAAsACyAFIAEgAyAJKAIMEOoERQ0JDAgLIAkgAyABKAJAajYCDAwGCyAJIAEgAyABKAJAIghqIAkoAgwgCGsgASgCLBEDACIIOgAHIAhB/wFxBEAgAEEJIAlBB2ogDEGHNEEBEJsCGiAFKAIMIgMgBSgCCEYEQCAFEF9FDQkgBSgCDCEDCyAJLQAHIQggBSADQQFqNgIMIAMgCDoAAAwHCyALIAEgAyABKAJAIghqIAkoAgwgCGsQhgEiCEUNByAAIAogCEEAEJcBIQggACAAKALgAzYC3AMCQAJAIA1FBEAgACgCmAJFDQIgCi0AggFFDQEgACgCtAJFDQUMAgsgCi0AgQFFDQQgCi0AggFFDQEMBAsgCi0AgQFFDQMLIAhFDQYMAwsgCEEnRg0EC0EXIQUgASAAKAKcAUYNBwwICyAIRQRAQQshBQwICyAILQAjDQBBGCEFDAcLIAgtACAEQEEMIQUgASAAKAKcAUYNBgwHCyAIKAIcBEBBDyEFIAEgACgCnAFGDQYMBwsgCCgCBEUEQEEQIQUgASAAKAKcAUYNBgwHC0EBIQUgACAIQQBBARDpBA0GCyAHIAkoAgw2AgBBACEFDAULIAUoAgwhAyACRQRAIAMgBSgCEEYNASADQQFrLQAAQSBGDQELIAUoAgggA0YEQCAFEF9FDQIgBSgCDCEDCyAFIANBAWo2AgwgA0EgOgAACyAJKAIMIQMMAQsLQQEhBQwBCyAAIAM2AqgCCyAJQRBqJAAgBQuQAgEGfyAAKAL8AiECQQEhBCABKAIAIgUhBgNAAkACQAJAIAYtAAAiA0UNACADQTpHDQEgAkHQAGohBANAAkAgAigCWCEHIAIoAlwhAyAFIAZGDQAgAyAHRgRAIAQQX0UNBSACKAJcIQMLIAUtAAAhByACIANBAWo2AlwgAyAHOgAAIAVBAWohBQwBCwsgAyAHRgRAIAQQX0UNAyACKAJcIQMLIAIgA0EBajYCXEEAIQQgA0EAOgAAIAAgAkE8aiACKAJgQQgQlwEiAEUNAAJAIAIoAmAiAyAAKAIARgRAIAIgAigCXDYCYAwBCyACIAM2AlwLIAEgADYCBEEBIQQLIAQPCyAGQQFqIQYMAQsLQQAL5wEBCH8gAEGEA2ohAQNAAkAgASgCACIBRQRAQQEhAwwBC0EBIQMgASgCBCIEIAEoAiQiBiABKAIYIgVBAWoiB2oiCEYNAEEAIQMgASgCCCICQf7///8HIAVrSw0AIAIgB2oiBSABKAIoIAZrSwRAIAAgBiAFQc8YEJoCIgJFDQEgASgCJCIDIAEoAgxGBEAgASACNgIMCyABKAIQIgQEQCABIAIgBCADa2o2AhALIAEgAjYCJCABIAIgBWo2AiggAiAHaiEIIAEoAgQhBCABKAIIIQILIAEgCCAEIAIQHzYCBAwBCwsgAwuNAQMBfwF9An4jAEEwayICJAAgAEEAEL8CIgAoAvQDRQRAIAAoAqAEBEAgABCjCSEDIAApA5AEIQQgACkDmAQhBSACIAE2AiAgAiADuzkDGCACIAU3AxAgAiAENwMIIAIgADYCAEGI9ggoAgBBvTIgAhAzCyACQTBqJAAPC0GtOEGfvQFBp8IAQY4oEAAAC1ECAn4BfSAAKQOYBCEBAn0gACkDkAQiAlBFBEAgASACfLUgArWVDAELIAFCFny1QwAAsEGVCyAAKAL0AwRAQa04QZ+9AUGgwgBBnOMAEAAACwtFAQF/IAAEQAJAIAEoAhQiAkUNACAAIAIgASgCDEECdGoiASgCAEcNACABQQA2AgALIAAoAhQEQCAAKAIEEBgLIAAQGAsL1wIBBX8CQCAAKAL8AiICKAK4AUUEQEF/IQQgACgC7AMiAUH/////A0sNASACIAAgAUECdEGowAAQmAEiATYCuAEgAUUNASABQQA2AgALQX8hBCACKAKwASIBQQBIDQAgAigCpAEhAyACIAIoAqwBIgUgAUsEfyABBQJAIAMEQCAFQaSSySRLDQMgACADIAVBOGxBxcAAEJoCIgNFDQMgAigCrAFBAXQhAQwBC0EgIQEgAEGAB0HKwAAQmAEiA0UNAgsgAiADNgKkASACIAE2AqwBIAIoArABCyIEQQFqNgKwASACKAK0ASIABEAgAyACKAK4ASAAQQJ0akEEaygCAEEcbGoiACgCECIBBEAgAyABQRxsaiAENgIYCyAAKAIUIgFFBEAgACAENgIMCyAAIAQ2AhAgACABQQFqNgIUCyADIARBHGxqIgBCADcCDCAAQgA3AhQLIAQLwQIBBX8jAEEQayIHJAAgByACKAIAIgg2AgwCfyAAKAKcASABRgRAIAAgCDYCqAIgAEGoAmohCSAAQawCagwBCyAAKAK0AiIJQQRqCyEGIAkgCDYCACACQQA2AgACQCAAIAEgCCADIAdBDGogASgCDBEGACIKIAggBygCDEGqJUEAEJsCRQRAIAAQ4AJBKyEDDAELIAYgBygCDCIGNgIAQQQhAwJAAkACQAJAAkACQCAKQQRqDgUDBQIDAQALIApBKkcNBCAAKAJcBEAgACABIAggBhCHASAHKAIMIQYLIAIgBjYCACAEIAY2AgBBI0EAIAAoAvgDQQJGGyEDDAULIAkgBjYCAAwECyAFDQFBBiEDDAMLIAUNAEECIQMMAgsgBCAINgIAQQAhAwwBCyAJIAY2AgBBFyEDCyAHQRBqJAAgAwvyBgEJfyMAQRBrIgkkACAAKAKcAiELIABBATYCnAIgACgC/AIiB0HoAGohCgJAAkAgBygCaA0AIAoQXw0AQQEhCAwBCyAHQYQBaiEMIABBuANqIQ0CQAJAAkADQCAJIAI2AgwgACABIAIgAyAJQQxqIAEoAhQRBgAiBiACIAkoAgxBjjUgBBCbAkUEQCAAEOACQSshCAwEC0EAIQgCQAJAAkACQAJAAkACQAJAAkACQAJAIAZBBGoODw4CBwUGBwcHBwcBAwcBBAALIAZBHEcNBgJAIAAtAIAERQRAIAEgACgCnAFGDQELIA0gASACIAEoAkAiBmogCSgCDCAGaxCGASIGRQ0NIAAgDCAGQQAQlwEhBiAAIAAoAsgDNgLEAyAGRQRAIAcgBy0AggE6AIABDA8LAkAgBi0AIEUEQCAGIAAoAtQCRw0BC0EMIQggASAAKAKcAUcNDwwNCyAGKAIQRQ0KIAAoAnxFDQggB0EAOgCDASAGQQE6ACAgACAGQbg1ELIGIAAoAoABQQAgBigCFCAGKAIQIAYoAhggACgCfBEIAEUEQCAAIAZBvDUQlAMgBkEAOgAgQRUhCAwPCyAAIAZBwTUQlAMgBkEAOgAgIActAIMBDQkgByAHLQCCAToAgAEMCQsgACACNgKoAkEKIQgMDQsgCiABIAIgCSgCDBDqBEUNCwwHCyAJIAIgASgCQGo2AgwLIAcoAnQiAiAHKAJwRgRAIAoQX0UNCiAHKAJ0IQILIAcgAkEBajYCdCACQQo6AAAMBQsgASACIAEoAigRAAAiBkEASARAQQ4hCCABIAAoApwBRg0IDAoLQQAhAiAGIAlBCGoQkwQiBkEAIAZBAEobIQgDQCACIAhGDQUgBygCdCIGIAcoAnBGBEAgChBfRQ0KIAcoAnQhBgsgCUEIaiACai0AACEOIAcgBkEBajYCdCAGIA46AAAgAkEBaiECDAALAAtBBCEIIAEgACgCnAFGDQYMCAtBBCEIIAEgACgCnAFHDQcgACAJKAIMNgKoAgwHC0EXIQggASAAKAKcAUYNBAwGCyAHIActAIIBOgCAAQsgCSgCDCECDAELCyAAIAZBAEECEOkEIQgMAgsgACACNgKoAgwBC0EBIQgLIAAgCzYCnAIgBUUNACAFIAkoAgw2AgALIAlBEGokACAIC5ADAQZ/IwBBEGsiCSQAIAkgAzYCDAJAAkADQAJAIAAoArwCIggEQCAIKAIMIgcoAgghCiAJIAcoAgQiCyAHKAIMaiIMNgIIIActACEEQCAAIAAoAuwBIAIgDCAKIAtqIgogBUEBIAlBCGoQnwkiCA0EIAkoAggiCCAKRwRAIAcgCCAHKAIEazYCDAwECyAHQQA6ACEMAwsgACAHQZMzEJQDIAAoArwCIgogCEcNBCAHQQA6ACAgACAKKAIIIgc2ArwCIAggACgCwAI2AgggACAINgLAAgwBCyAAIAEgAiADIAQgBSAGIAlBDGoQnwkiCA0CIAAoArwCIQcgCSgCDCEDCyAHIAMgBEdyDQALIAUoAgwhBwJAIAINACAHIAUoAhBGDQAgB0EBayIALQAAQSBHDQAgBSAANgIMIAAhBwsgBSgCCCAHRgRAIAUQX0UEQEEBIQgMAgsgBSgCDCEHCyAFIAdBAWo2AgxBACEIIAdBADoAAAsgCUEQaiQAIAgPC0HjC0GfvQFBmTNBio8BEAAAC2EBAX8CQCAARQ0AIABBADYCECAAKAIEQQA6AAAgACgCBEEAOgABIABBADYCLCAAQQE2AhwgACAAKAIENgIIIAEoAhQiAkUNACAAIAIgASgCDEECdGooAgBHDQAgARDtBAsLtQIBBX8gACgCDCEHAkACQCADIARyRQ0AIAdBACAHQQBKGyEJA0AgBiAJRwRAQQEhCCAGQQxsIQogBkEBaiEGIAEgCiAAKAIUaigCAEcNAQwDCwsgA0UNACAAKAIIDQAgAS0ACQ0AIAAgATYCCAsCQCAAKAIQIAdHBEAgACgCFCEGDAELIAdFBEAgAEEINgIQIAAgBUHgAEGOOBCYASIGNgIUIAYNASAAQQA2AhBBAA8LQQAhCCAHQf////8DSg0BIAdBAXQiA0HVqtWqAUsNASAFIAAoAhQgB0EYbEGoOBCaAiIGRQ0BIAAgBjYCFCAAIAM2AhALIAYgACgCDCIFQQxsaiIDIAQ2AgggAyABNgIAIAMgAjoABCACRQRAIAFBAToACAtBASEIIAAgBUEBajYCDAsgCAuFBAEFfyAAKAL8AiIEQdAAaiEHAkAgBCgCXCIFIAQoAlhGBEAgBxBfRQ0BIAQoAlwhBQsgBCAFQQFqNgJcIAVBADoAACAHIAEgAiADEIYBIgFFDQAgACAEQShqIAFBAWoiCEEMEJcBIgZFDQACQCAIIAYoAgBHBEAgBCAEKAJgNgJcDAELIAQgBCgCXDYCYCAALQD0AUUNAAJAIAgtAAAiBUH4AEcNACABLQACQe0ARw0AIAEtAANB7ABHDQAgAS0ABEHuAEcNACABLQAFQfMARw0AAn8gAS0ABiICQTpHBEAgAg0CIARBmAFqDAELIAAgBEE8aiABQQdqQQgQlwELIQAgBkEBOgAJIAYgADYCBAwBC0EAIQNBACECA0AgBUH/AXEiAUUNASABQTpGBEADQAJAIAQoAlghASAEKAJcIQUgAiADRg0AIAEgBUYEQCAHEF9FDQYgBCgCXCEFCyADIAhqLQAAIQEgBCAFQQFqNgJcIAUgAToAACADQQFqIQMMAQsLIAEgBUYEQCAHEF9FDQQgBCgCXCEFCyAEIAVBAWo2AlwgBUEAOgAAIAYgACAEQTxqIAQoAmBBCBCXASIANgIEIABFDQMgBCgCYCIBIAAoAgBGBEAgBCAEKAJcNgJgDAMLIAQgATYCXAUgCCACQQFqIgJqLQAAIQUMAQsLCyAGDwtBAAugBQENfyMAQSBrIgQkACAEQQA2AhwgBEEANgIYIARBADYCFCAEQQA2AhAgBEF/NgIMAkAgAEEMIAIgA0GGJkEAEJsCRQRAIAAQ4AJBKyEDDAELIAEhByAAKAKcASEIIAIhCSADIQogAEGoAmohCyAEQRRqIQwgBEEQaiENIARBHGohDiAEQRhqIQ8gBEEMaiEQIAAtAPQBBH8gByAIIAkgCiALIAwgDSAOIA8gEBDMCQUgByAIIAkgCiALIAwgDSAOIA8gEBDPCQtFBEBBH0EeIAEbIQMMAQsCQCABDQAgBCgCDEEBRw0AIAAoAvwCQQE6AIIBIAAoAoQEQQFHDQAgAEEANgKEBAsCQAJ/IAAoApgBBEBBACEBQQAhAiAEKAIcIgMEQCAAQdADaiAAKAKcASICIAMgAiADIAIoAhwRAAAgA2oQhgEiAkUNAyAAIAAoAtwDNgLgAwsgBCgCFCIDBEAgAEHQA2ogACgCnAEiASADIAQoAhAgASgCQGsQhgEiAUUNAwsgACgCBCABIAIgBCgCDCAAKAKYAREHACABQQBHDAELIAAoAlwEQCAAIAAoApwBIAIgAxCHAQtBACECQQALIQECQCAAKALwAQ0AAkAgBCgCGCIDBEAgAygCQCIFIAAoApwBIgYoAkBGIAMgBkYgBUECR3JxDQEgACAEKAIcNgKoAkETIQMMBAsgBCgCHCIDRQ0BIAJFBEAgAEHQA2ogACgCnAEiASADIAEgAyABKAIcEQAAIANqEIYBIgJFDQMLIAAgAhCuCSEDIABB0ANqEJwCIANBEkcNAyAAIAQoAhw2AqgCQRIhAwwDCyAAIAM2ApwBC0EAIQMgAkUgAUEBc3ENASAAQdADahCcAgwBC0EBIQMLIARBIGokACADC80yARF/IwBBEGsiDCQAIAwgBTYCBCAAKAL8AiEKAn8gACgCnAEgAUYEQCAAQagCaiEVIABBrAJqDAELIAAoArQCIhVBBGoLIREgAEG4A2ohDyAKQYQBaiEWIApB0ABqIRMgAEGIAmohFwJAAkADQAJAIBUgAjYCACARIAwoAgQiDTYCAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIARBAEoNACAHQQAgBBsNSyAEQXFGBEBBDyEEDAELQQYhBQJAAkACQCAEQQRqDgUBAk80AAILIBUgDTYCAAwDCyAAKAKcASABRwRAIAAoArQCLQAURQ1NDEsLIAAtAIAEDUpBAyEFDE0LIAwgAzYCBEEAIARrIQQgAyENCwJAIBcgBCACIA0gASAXKAIAEQgAIgtBAWtBAkkgC0E5RnINACAAIAQgAiAMKAIEQbUpIAkQmwINACAAEOACQSshBQxMC0EBIQ5BACEFAkACQAJAAkACQAJAAkACQCALQQFqDj4kPwAKPgEaBAIHHh89GRsFHB08ICIjIQwNDg8QERITFBYWOwsXFxgYOiorKywmNTMyNCgnMC0vLkFAAyUpKUkLIABBACACIAwoAgQQrAkiBQ1SDE0LIAAoAmAEfyAAIA8gASACIAwoAgQQhgEiBDYC2AIgBEUNTCAAQQA2AuACIAAgACgCxAM2AsgDQQAFQQELIQ4gAEEANgLcAgxGCyAAKAJgIgRFDUYgACgCBCAAKALYAiAAKALcAiAAKALgAkEBIAQRCgAgAEEANgLYAiAPEJwCDEwLIABBASACIAwoAgQQrAkiBUUNSgxPCyAAQQA6AIEEIAAgACAWQZioCEEkEJcBIgQ2AtQCIARFDUggCkEBOgCBASAAKAJgRQ0AIAEgAiAMKAIEIBUgASgCNBEGAEUNRyAPIAEgAiABKAJAIgRqIAwoAgQgBGsQhgEiBEUNSCAEELcGIAAgBDYC4AIgACAAKALEAzYCyANBACEODAELIAEgAiAMKAIEIBUgASgCNBEGAEUNRgsgCi0AgAFFDUEgACgC1AJFDUEgEyABIAIgASgCQCIEaiAMKAIEIARrEIYBIgRFDUYgBBC3BiAAKALUAiAENgIYIAogCigCXDYCYCALQQ5HDUEgACgClAFFDUEMSAsgCA0BC0EEIQUMSgsgACgC2AIiBAR/IAAoAgQgBCAAKALcAiAAKALgAkEAIAAoAmARCgAgDxCcAkEABUEBCyEOAkAgACgC3AJFBEAgAC0AgQRFDQELIAotAIEBIQUgCkEBOgCBAQJAIAAoAoQERQ0AIAAoAnxFDQAgACAWQZioCEEkEJcBIgRFDUUCQCAALQCBBEUEQCAEKAIUIQ0MAQsgBCAAKAKAAyINNgIUCyAKQQA6AIMBIAAoAoABQQAgDSAEKAIQIAQoAhggACgCfBEIAEUNQyAKLQCDAQRAIAotAIIBDQEgACgCeCIERQ0BIAAoAgQgBBECAA0BDEMLIAAoAtwCDQAgCiAFOgCBAQsgAEEAOgCBBAsgACgCZCIERQ0+IAAoAgQgBBEBAAxFCwJAIAAtAIEERQ0AIAotAIEBIQQgCkEBOgCBASAAKAKEBEUNACAAKAJ8RQ0AIAAgFkGYqAhBJBCXASIBRQ1DIAEgACgCgAMiBTYCFCAKQQA6AIMBIAAoAoABQQAgBSABKAIQIAEoAhggACgCfBEIAEUNQSAKLQCDAQRAIAotAIIBDQEgACgCeCIBRQ0BIAAoAgQgARECAEUNQQwBCyAKIAQ6AIEBCyAAQdYBNgKgAiAAIAIgAyAGELYGIQUMSAsgACAAIAEgAiAMKAIEELUGIgQ2AvACIARFDUEMCQsgACAAIAEgAiAMKAIEEKsJIgQ2AvQCIARFDUAgAEEANgLkAiAAQQA7AfgCDAgLIABBmqgINgLkAiAAQQE6APgCDAcLIABBoKgINgLkAiAAQQE6APkCDAYLIABBo6gINgLkAgwFCyAAQamoCDYC5AIMBAsgAEGwqAg2AuQCDAMLIABBt6gINgLkAgwCCyAAQcCoCDYC5AIMAQsgAEHIqAg2AuQCCyAKLQCAAUUNMyAAKAKQAUUNMww5CyAKLQCAAUUNMiAAKAKQAUUNMkG7CEHIrANB06wDIAtBIEYbIAAoAuQCGyEFA0AgBS0AACILBEAgACgCxAMiBCAAKALAA0YEQCAPEF9FDTkgACgCxAMhBAsgACAEQQFqNgLEAyAEIAs6AAAgBUEBaiEFDAELC0EBIQUgACgCyANFDTwgDyABIAIgDCgCBBDqBEUNPCAAIAAoAsgDNgLkAgw4CyAKLQCAAUUEQAwwCyAAKALwAiAAKAL0AiAALQD4AiAALQD5AkEAIAAQqglFDTUgACgCkAFFDS8gACgC5AIiBEUNLwJAIAQtAAAiBUEoRwRAIAVBzgBHDQEgBC0AAUHPAEcNAQsgACgCxAMiBCAAKALAA0YEQCAPEF9FDTcgACgCxAMhBAtBASEFIAAgBEEBajYCxAMgBEEpOgAAIAAoAsQDIgQgACgCwANGBEAgDxBfRQ09IAAoAsQDIQQLIAAgBEEBajYCxAMgBEEAOgAAIAAgACgCyAM2AuQCIAAgACgCxAM2AsgDCyARIAI2AgBBACEOIAAoAgQgACgC8AIoAgAgACgC9AIoAgAgACgC5AJBACALQSRGIAAoApABEQsADC8LIAotAIABRQ0wIAAgASAALQD4AiACIAEoAkAiBGogDCgCBCAEayATQQIQqAkiBQ06IAooAmAhBCAKIAooAlw2AmBBASEFIAAoAvACIAAoAvQCIAAtAPgCQQAgBCAAEKoJRQ06IAAoApABRQ0wIAAoAuQCIg1FDTACQCANLQAAIhJBKEcEQCASQc4ARw0BIA0tAAFBzwBHDQELIAAoAsQDIhAgACgCwANGBEAgDxBfRQ08IAAoAsQDIRALIAAgEEEBajYCxAMgEEEpOgAAIAAoAsQDIhAgACgCwANGBEAgDxBfRQ08IAAoAsQDIRALIAAgEEEBajYCxAMgEEEAOgAAIAAgACgCyAM2AuQCIAAgACgCxAM2AsgDCyARIAI2AgAgACgCBCAAKALwAigCACAAKAL0AigCACAAKALkAiAEIAtBJkYgACgCkAERCwAgDxCcAgw2CyAKLQCAAUUNLyAMKAIEIAwgAiABKAJAIgVqNgIMIAVrIQsCQANAAkAgACgCxAIiBQRAIAUoAgwiBCgCCCENIAwgBCgCBCISIAQoAgxqIg42AgggBC0AIQRAIAAgACgC7AEgDiANIBJqIg1BASAMQQhqEKcJIgUNBCAMKAIIIgUgDUcEQCAEIAUgBCgCBGs2AgwMBAsgBEEAOgAhDAMLIAAgBEHWNhCUAyAAKALEAiINIAVHDSEgBEEAOgAgIAAgDSgCCCIENgLEAiAFIAAoAsgCNgIIIAAgBTYCyAIMAQsgACABIAwoAgwgC0ECIAxBDGoQpwkiBQ0CIAAoAsQCIQQLIAQNACALIAwoAgxHDQALQQAhBQsgCigCeCEEAn8CQCAAKALUAiILBEAgCyAENgIEIAsgCigCdCILIARrNgIIIAogCzYCeCAAKAKUAUUNASARIAI2AgAgACgCBCAAKALUAiIEKAIAIAQtACIgBCgCBCAEKAIIIAAoAoADQQBBAEEAIAAoApQBESAAQQAMAgsgCiAENgJ0C0EBCyEOIAVFDS4MOQsgAEEAOgCBBEEBIQUgCkEBOgCBAQJ/IAAoAmAEQCAAIA8gASACIAEoAkAiBGogDCgCBCAEaxCGASIENgLcAiAERQ06IAAgACgCxAM2AsgDQQAMAQsgAEGYqAg2AtwCQQELIQ4CQCAKLQCCAQ0AIAAoAoQEDQAgACgCeCIERQ0AIAAoAgQgBBECAEUNMAsgACgC1AINACAAIAAgFkGYqAhBJBCXASIENgLUAiAERQ04IARBADYCGAsgCi0AgAFFDSwgACgC1AJFDSwgEyABIAIgASgCQCIEaiAMKAIEIARrEIYBIQQgACgC1AIiBSAENgIQIARFDTEgBSAAKAKAAzYCFCAKIAooAlw2AmAgC0ENRw0sIAAoApQBRQ0sDDMLIAotAIABRQ0sIAAoAtQCRQ0sIAAoApQBRQ0sIBEgAjYCACAAKAIEIAAoAtQCIgIoAgAgAi0AIkEAQQAgAigCFCACKAIQIAIoAhhBACAAKAKUAREgAAwyCyAKLQCAAUUNKyAAKALUAkUNKyATIAEgAiAMKAIEEIYBIQQgACgC1AIgBDYCHCAERQ0vIAogCigCXDYCYCAAKAJoBEAgESACNgIAIAAoAgQgACgC1AIiAigCACACKAIUIAIoAhAgAigCGCACKAIcIAAoAmgRCwAMMgsgACgClAFFDSsgESACNgIAIAAoAgQgACgC1AIiAigCAEEAQQBBACACKAIUIAIoAhAgAigCGCACKAIcIAAoApQBESAADDELIAEgAiAMKAIEIAEoAiwRAwAEQCAAQQA2AtQCDCsLIAotAIABRQ0aQQEhBSATIAEgAiAMKAIEEIYBIgtFDTQgACAAIAogC0EkEJcBIgQ2AtQCIARFDTQgCyAEKAIARwRAIAogCigCYDYCXCAAQQA2AtQCDCsLIAogCigCXDYCYEEAIQUgBEEAOgAiIARBADYCGCAEIAAoAvQDBH9BAQUgACgCtAILRToAIyAAKAKUAUUNKgwwCyAKLQCAAQRAQQEhBSATIAEgAiAMKAIEEIYBIgtFDTQgACAAIBYgC0EkEJcBIgQ2AtQCIARFDTQgCyAEKAIARwRAIAogCigCYDYCXCAAQQA2AtQCDCsLIAogCigCXDYCYCAEQQE6ACJBACEFIARBADYCGCAEIAAoAvQDBH9BAQUgACgCtAILRToAIyAAKAKUAUUNKgwwCyAKIAooAmA2AlwgAEEANgLUAgwpCyAAQgA3A+gCIAAoAmxFDSggACAPIAEgAiAMKAIEEIYBIgI2AugCIAJFDSwgACAAKALEAzYCyAMMLgsgASACIAwoAgQgFSABKAI0EQYARQ0qIAAoAugCRQ0nIA8gASACIAEoAkAiBGogDCgCBCAEaxCGASICRQ0rIAIQtwYgACACNgLsAiAAIAAoAsQDNgLIAwwtCyAAKALoAkUNJCAAKAJsRQ0kIA8gASACIAEoAkAiBGogDCgCBCAEaxCGASIERQ0qIBEgAjYCACAAKAIEIAAoAugCIAAoAoADIAQgACgC7AIgACgCbBEKAEEAIQ4MJAsgACgC7AJFDSMgACgCbEUNIyARIAI2AgBBACEOIAAoAgQgACgC6AIgACgCgANBACAAKALsAiAAKAJsEQoADCMLQQpBEUECIARBDEYbIARBHEYbIQUMLgsgACgCXARAIAAgASACIAwoAgQQhwELIAAgASAMQQRqIAMgBiAHEKYJIgUNLSAMKAIEDSkgAEHXATYCoAJBACEFDC0LAkAgACgC7AMiBCAAKAKMAksNAAJAIAQEQCAEQQBIDSlBASEFIAAgBEEBdCIENgLsAyAAIAAoAugDIARBmy4QmgIiBEUEQCAAIAAoAuwDQQF2NgLsAwwwCyAAIAQ2AugDIAooArgBIgVFDQIgACgC7AMiBEGAgICABE8EQEEBIQUgACAEQQF2NgLsAwwwCyAAIAUgBEECdEGwLhCaAiIEDQFBASEFIAAgACgC7ANBAXY2AuwDDC8LIABBIDYC7AMgACAAQSBBuC4QmAEiBDYC6AMgBA0BIABBADYC7AMMKAsgCiAENgK4AQsgACgC6AMgACgCjAJqQQA6AAAgCi0AoAFFDSIgABClCSIEQQBIDSYgCigCuAEiBUUNDyAFIAooArQBQQJ0aiAENgIAIAogCigCtAFBAWo2ArQBIAooAqQBIARBHGxqQQY2AgAgACgCjAFFDSIMKAsgACgC6AMgACgCjAJqIgQtAABB/ABGDR4gBEEsOgAAIAotAKABRQ0hIAAoAowBRQ0hDCcLIAAoAugDIAAoAowCaiIELQAAIgVBLEYNHQJAIAUNACAKLQCgAUUNACAKKAKkASAKKAK4ASAKKAK0AUECdGpBBGsoAgBBHGxqIgUoAgBBA0YNACAFQQU2AgAgACgCjAFFIQ4LIARB/AA6AAAMHwtBASEFIApBAToAgQEgACgChARFBEAgCiAKLQCCASIEOgCAAQwcCyATIAEgAiABKAJAIgRqIAwoAgQgBGsQhgEiDUUNKSAAIBYgDUEAEJcBIQQgCiAKKAJgNgJcIAAoApgCRQ0ZAkAgCi0AggEEQCAAKAK0AkUNAQwbCyAKLQCBAQ0aCyAERQRAQQshBQwqCyAELQAjDRpBGCEFDCkLIAAoAowBRQ0eIAAgACABIAIgDCgCBBC1BiICNgLwAiACRQ0iIApCADcCsAEgCkEBOgCgAQwkCyAKLQCgAUUNHSAAKAKMAQR/QRQgACgCDBECACIERQ0iIARCADcCBCAEQgA3AgwgBEECQQEgC0EpRhs2AgAgESACNgIAIAAoAgQgACgC8AIoAgAgBCAAKAKMAREFAEEABUEBCyEOIApBADoAoAEMHAsgCi0AoAFFDRwgCigCpAEgCigCuAEgCigCtAFBAnRqQQRrKAIAQRxsakEDNgIAIAAoAowBRQ0cDCILQQIhDgwBC0EDIQ4LIAotAKABRQ0ZIAwoAgQgASgCQGsMAQsgCi0AoAFFDRhBACEOIAwoAgQLIQRBASEFIAAQpQkiC0EASA0hIAtBHGwiCyAKKAKkAWoiDSAONgIEIA1BBDYCACAAIAEgAiAEELUGIgRFDSEgCigCpAEgC2ogBCgCACILNgIIQQAhBANAIAQgC2ogBEEBaiEELQAADQALIAQgCigCqAEiC0F/c0sNISAKIAQgC2o2AqgBIAAoAowBRQ0XDB0LQQEhBQwCC0ECIQUMAQtBAyEFCyAKLQCgAUUNEyAAKAKMASEEIAogCigCtAFBAWsiCzYCtAEgCigCpAEgCigCuAEgC0ECdGooAgBBHGxqIAU2AgQgBEUhDiALDRIgBEUNDEEBIQUgACgC/AIiGCgCsAEiBEHMmbPmAEsNHSAEQRRsIgQgGCgCqAEiC0F/c0sNHSAEIAtqIAAoAgwRAgAiEkUNHSAYKAKwASEEIBJBADYCDCASQRRqIQ0gEiILIARBFGxqIhkhBANAAkAgCyAZSQRAIAsgGCgCpAEiGiALKAIMQRxsaiIUKAIAIgU2AgAgCyAUKAIENgIEIAVBBEYEQCALIAQ2AgggFCgCCCEFA0AgBCAFLQAAIhA6AAAgBUEBaiEFIARBAWohBCAQDQALIAtCADcCDAwCC0EAIQUgC0EANgIIIBQoAhQhECALIA02AhAgCyAQNgIMIBRBDGohFANAIAUgEE8NAiANIBQoAgAiEDYCDCAFQQFqIQUgDUEUaiENIBogEEEcbGpBGGohFCALKAIMIRAMAAsACyARIAI2AgAgACgCBCAAKALwAigCACASIAAoAowBEQUADA4LIAtBFGohCwwACwALQZHTAUGfvQFBxC5Bxf0AEAAAC0G5C0GfvQFB3DZB9Y4BEAAAC0EFIQUMGgsgCiAKKAJgNgJcIABBADYC1AIMDwsgACgCjAFFDQ4MFAsgCi0AgAFFDQ0gACgCkAFFDQ0MEwsgACgCbEUNDAwSCyAKLQCAAUUNCyAAKAKUAUUNCwwRCyAAKAJgRQ0KDBALIARBDkcNCQwPCyAAIAEgAiAMKAIEELQGRQ0MDA4LIAAgASACIAwoAgQQswZFDQsMDQsgCkEANgKoASAKQQA6AKABDAULIAQNACAKIAotAIIBOgCAASALQTxHDQUgACgChAEiBEUNBSAAKAIEIA1BASAEEQUADAsLIAQtACAEQEEMIQUMDwsgBCgCBARAIAAgBCALQTxGQQAQ6QRFDQsMDwsgACgCfARAQQAhDiAKQQA6AIMBIARBAToAICAAIARBqS8QsgYgACgCgAFBACAEKAIUIAQoAhAgBCgCGCAAKAJ8EQgARQRAIAAgBEGtLxCUAyAEQQA6ACAMCAsgACAEQbEvEJQDIARBADoAICAKLQCCASEEIAotAIMBDQEgCiAEOgCAAQwLCyAKIAotAIIBOgCAAQwECyAEQf8BcQ0CIAAoAngiBEUNAiAAKAIEIAQRAgBFDQQMAgtBAiEFDAwLIA8QnAILIA5FDQYLIAAoAlxFDQUgACABIAIgDCgCBBCHAQwFC0EWIQUMCAtBFSEFDAcLQSAhBQwGC0EBIQUMBQsgACgCnAEhAQtBIyEFAkACQAJAAkAgACgC+ANBAWsOAwEHAAILIAYgDCgCBDYCAEEAIQUMBgsgDCgCBCECIAAtAOAEDQQMAQsgDCgCBCECCyABIAIgAyAMQQRqIAEoAgARBgAhBAwBCwsgF0F8IAMgAyABIBcoAgARCABBf0cNAEEdIQUMAQsgBiACNgIAQQAhBQsgDEEQaiQAIAULswIBB38jAEGQCGsiAiQAAkAgACgCiAEiBEUEQEESIQMMAQsDQCADQYACRwRAIAJBBGogA0ECdGpBfzYCACADQQFqIQMMAQsLIAJBADYCjAggAkIANwKECAJAIAAoAoACIAEgAkEEaiAEEQMARQ0AIAAgAEH0DkHjJhCYASIBNgL4ASABRQRAQQEhAyACKAKMCCIARQ0CIAIoAoQIIAARAQAMAgsgASEFIAJBBGohBiACKAKICCEHIAIoAoQIIQggAC0A9AEEfyAFIAYgByAIEMsJBSAFIAYgByAIEMIGCyIBRQ0AIAAgAigChAg2AvwBIAIoAowIIQMgACABNgKcASAAIAM2AoQCQQAhAwwBC0ESIQMgAigCjAgiAEUNACACKAKECCAAEQEACyACQZAIaiQAIAMLTAEBfyMAQRBrIgIkAEGl2QEQ7AQEQCACQQQ2AgwgAiABNgIIIAJBCDYCBCACIAA2AgBBiPYIKAIAQbztBCACECAaCyACQRBqJAAgAQvQBwMLfwJ8AX4jAEEgayIGJAAgACgCiARFBEAgAAJ/AkBBuOwAQQBBABDiCyIBQQBOBEADQCMAQRBrIgIkACACQQQgBGs2AgwgAiAGQQxqIARqNgIIIAEgAkEIakEBIAJBBGoQBBCpAyEFIAIoAgQhAyACQRBqJABBfyADIAUbIgUgBGohAiAFQQBMIgVFIAJBA0txDQIgBCACIAUbIQRB/IALKAIAQRtGDQALIAEQqgcLIAYCfhACIgxEAAAAAABAj0CjIg2ZRAAAAAAAAOBDYwRAIA2wDAELQoCAgICAgICAgH8LIg43AxAgBgJ/IAwgDkLoB365oUQAAAAAAECPQKIiDJlEAAAAAAAA4EFjBEAgDKoMAQtBgICAgHgLNgIYQaupAyAGKAIYQSpzQf////8HbBCvCQwBCyABEKoHQbjsACAGKAIMEK8JCzYCiAQLIAAtAPQBBH8Cf0GwqQghBCAAIgFBjANqIQkgAUG4A2ohByABKAL8AiIIQZgBaiEFIAhB0ABqIQogCEE8aiELA0ACQCAEIQADQEEBIAQtAABFDQMaAkACQCAALQAAIgMEQCADQT1GDQEgA0EMRw0CCyABKALEAyIDIAEoAsADRgRAIAcQX0UNBCABKALEAyEDCyABIANBAWo2AsQDIANBADoAACABIAggASgCyANBABCXASIEBEAgBEEBOgAgCyAALQAAIQQgASABKALIAzYCxAMgACAEQQBHaiEEDAQLIAUhBCABKALEAyICIAEoAsgDRwRAIAEoAsADIAJGBEAgBxBfRQ0EIAEoAsQDIQILIAEgAkEBajYCxAMgAkEAOgAAIAEgCyABKALIA0EIEJcBIgRFDQMgASAEKAIAIgIgASgCyAMiA0YEfyAEIAogAhCzCSICNgIAIAJFDQQgASgCyAMFIAMLNgLEAwsDQAJAIABBAWohAiAALQABIgNFIANBDEZyDQAgASgCxAMiACABKALAA0YEQCAHEF9FDQUgAi0AACEDIAEoAsQDIQALIAEgAEEBajYCxAMgACADOgAAIAIhAAwBCwsgASgCxAMiAyABKALAA0YEQCAHEF9FDQMgASgCxAMhAwsgASADQQFqNgLEAyADQQA6AAAgASAEQQAgASgCyAMgCRC7Bg0CIAEgASgCyAM2AsQDIABBAmogAiAALQABGyEEDAMLIAEoAsQDIgIgASgCwANGBEAgBxBfRQ0CIAAtAAAhAyABKALEAyECCyABIAJBAWo2AsQDIAIgAzoAACAAQQFqIQAMAAsACwtBAAsFQQELIAZBIGokAAvhCgEHfwJAAkACQCAARSACQQBIckUEQCABIAJFcg0BDAILIAANAQwCCwJAAkACQAJAIAAoAvgDDgQCAwEAAwsgAEEhNgKkAgwECyAAQSQ2AqQCDAMLIAAoAvQDDQAgABCwCQ0AIABBATYCpAIMAgsgAEEBNgL4AwJ/AkAgAARAIAJBAEgNAQJAAkACQCAAKAL4A0ECaw4CAQACCyAAQSE2AqQCQQAMBAsgAEEkNgKkAkEADAMLIAAgAjYCNAJAIAAoAiAiCEUNACAAKAIcIgRFDQAgCCAEayEFCwJAIAIgBUoNACAAKAIIRQ0AIAAoAhwMAwtBACEEAkAgACgCHCIFRQ0AIAAoAhgiBkUNACAFIAZrIQQLIAIgBGoiBkEASA0BQYAIAn9BACAAKAIYIgRFDQAaQQAgACgCCCIHRQ0AGiAEIAdrCyIHIAdBgAhOGyIHIAZB/////wdzSg0BIAYgB2ohCgJAAkACQAJAIAAoAggiCUUNACAERSAKIAggCWsiBkEAIAgbSnJFBEAgByAEIAlrTg0EIAkgBCAHayAFIARrIAdqELYBIQUgACAAKAIcIAQgBSAHamsiBGsiBTYCHCAAKAIYIARrIQQMAwsgCEUNACAGDQELQYAIIQYLA0AgCiAGQQF0IgZKIAZBAEpxDQALIAZBAEwNAyAGIAAoAgwRAgAiBEUNAyAAIAQgBmo2AiAgACgCGCIFBEBBACEGIAQgBSAHayAAKAIcIgQgBWtBACAEGyAHahAfIQQgACgCCCAAKAIUEQEAIAAgBDYCCAJAIAAoAhwiBUUNACAAKAIYIghFDQAgBSAIayEGCyAAIAQgB2oiBCAGaiIFNgIcDAELIAAgBDYCCCAAIAQ2AhwgBCEFCyAAIAQ2AhgLIABBADYCsAIgAEIANwOoAgsgBQwBCyAAQQE2AqQCQQALIgRFDQECQCACBEAgAUUNASAEIAEgAhAfGgsCf0EAIQECQCAABEAgAkEASARAIABBKTYCpAIMAgsCQAJAAkACQCAAKAL4Aw4EAgMBAAMLIABBITYCpAIMBAsgAEEkNgKkAgwDCyAAKAIYRQRAIABBKjYCpAIMAwsgACgC9AMNACAAELAJDQAgAEEBNgKkAgwCC0EBIQEgAEEBNgL4AyAAIAM6APwDIAAgACgCGCIFNgKwAiAAIAAoAhwgAmoiBDYCHCAAIAQ2AiggACAAKAIkIAJqNgIkIAACfyAAQRhqIQYgBCAFIgJrQQAgBBtBACACGyEHAkAgAC0AMEUNACAALQD8Aw0AAn9BACAAKAIYIgVFDQAaQQAgACgCCCIIRQ0AGiAFIAhrCyEFIAAoAiwhCAJ/QQAgACgCICIJRQ0AGkEAIAAoAhwiCkUNABogCSAKawshCSAHIAhBAXRPDQAgACgCNCAJIAVBgAhrIghBACAFIAhPG2pLDQAgBiACNgIAQQAMAQsgBiACNgIAAkADQAJAIAAgBigCACAEIAYgACgCoAIRBgAhBSAAKAL4A0EBRwRAIABBADoA4AQMAQsgAC0A4ARFDQAgAEEAOgDgBCAFRQ0BDAILCyAFDQAgAiAGKAIARgRAIAAgBzYCLEEADAILQQAhBSAAQQA2AiwLIAULIgI2AqQCIAIEQCAAQdMBNgKgAiAAIAAoAqgCNgKsAgwCCwJAAkACQCAAKAL4Aw4EAAACAQILIANFDQEgAEECNgL4A0EBDAQLQQIhAQsgACgCnAEiAiAAKAKwAiAAKAIYIABBsANqIAIoAjARBwAgACAAKAIYNgKwAgsgAQwBC0EACw8LQYjUAUGfvQFBjRNB8JIBEAAACyAAQSk2AqQCC0EAC2cBAn9B/IALKAIAIQMgACACEKkJIABBATYCKCAAIAE2AgACQCACKAIUIgQEQCAAIAQgAigCDEECdGooAgBGDQELIABCATcCIAsgACABQQBHQZDeCigCAEEASnE2AhhB/IALIAM2AgALXgECfwNAIAAoAgwiAiAAKAIIRgRAIAAQX0UEQEEADwsgACgCDCECCyABLQAAIQMgACACQQFqNgIMIAIgAzoAACABLQAAIAFBAWohAQ0ACyAAKAIQIAAgACgCDDYCEAv5BAEFfyMAQRBrIgMkACAABEAgACgChAMhAQNAAkAgAUUEQCAAKAKIAyIBRQ0BIABBADYCiAMLIAEoAgAgACABKAIkQZYPEGcgASgCLCAAELoGIAAgAUGYDxBnIQEMAQsLIAAoArQCIQEDQAJAIAFFBEAgACgCuAIiAUUNASAAQQA2ArgCCyABKAIIIAAgAUGmDxBnIQEMAQsLIAAoArwCIQEDQAJAIAFFBEAgACgCwAIiAUUNASAAQQA2AsACCyABKAIIIAAgAUG0DxBnIQEMAQsLIAAoAsQCIQEDQAJAIAFFBEAgACgCyAIiAUUNASAAQQA2AsgCCyABKAIIIAAgAUHCDxBnIQEMAQsLIAAoApADIAAQugYgACgCjAMgABC6BiAAQbgDahDrBCAAQdADahDrBCAAIAAoAvABQcgPEGcCQCAALQCABA0AIAAoAvwCIgJFDQAgACgC9AMgAyACKAIUIgE2AgggAkEUaiADIAEEfyABIAIoAhxBAnRqBUEACzYCDANAIANBCGoQvAYiAQRAIAEoAhBFDQEgACABKAIUQZw7EGcMAQsLIAIQkAQgAkGEAWoQkAQQkAQgAkEoahCQBCACQTxqEJAEIAJB0ABqEOsEIAJB6ABqEOsERQRAIAAgAigCuAFBqDsQZyAAIAIoAqQBQak7EGcLIAAgAkGrOxBnCyAAIAAoAqADQdIPEGcgACAAKALoA0HWDxBnIAAoAgggACgCFBEBACAAIAAoAjhB2w8QZyAAIAAoAqQDQdwPEGcgACAAKAL4AUHdDxBnIAAoAoQCIgEEQCAAKAL8ASABEQEACyAAIABB4A8QZwsgA0EQaiQAC60BAgJ+AX8CQAJAIAAEQCABUA0BAkAgACkDsAQiBEJ/hSABWgRAQQEhBSABIAR8IgMgACkDyARUDQEgA1ANBCAAKgLEBCADtSAAKQOQBLWVXUUNAQtBACEFIAAoAsAERQ0AIABBKyABIAMgAyACEJEECyAFDwtBwNQBQZ+9AUGvBkH6mwEQAAALQbuXA0GfvQFBsAZB+psBEAAAC0HdlgNBn70BQbwGQfqbARAAAAsgACAAKAIAQTRqECQEQEGdxgNByfIAQdoBQc40EAAACwuZAgEBfwJAAkACQAJAAkACQAJAAkACQCABQQtrDgYCBwMHCAEACyABQRprDgMEBgMFCyAEIAIgBCgCQEEBdGogA0HmpgggBCgCGBEGAARAIABBpQE2AgBBCw8LIAQgAiAEKAJAQQF0aiADQe2mCCAEKAIYEQYABEAgAEGmATYCAEEhDwsgBCACIAQoAkBBAXRqIANB9aYIIAQoAhgRBgAEQCAAQacBNgIAQScPCyAEIAIgBCgCQEEBdGogA0H9pgggBCgCGBEGAEUNBSAAQagBNgIAQREPC0E3DwtBOA8LQTwPCyAAQakBNgIAQQMPCyABQXxGDQELIAFBHEYEQEE7IQUgACgCEEUNAQsgAEGeATYCAEF/IQULIAULnQEBAX8CQAJAIAJFDQAgABBLIAAQJGsgAkkEQCAAIAIQvQELIAAQJCEDIAAQKARAIAAgA2ogASACEB8aIAJBgAJPDQIgACAALQAPIAJqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABBlwJBxOoAEAAACyAAKAIAIANqIAEgAhAfGiAAIAAoAgQgAmo2AgQLDwtBks4BQaD8AEGVAkHE6gAQAAALlgEBAn8gAkELNgIAQQEhAwJAIAEgAGtBBkcNACAALQAADQAgAC0AASIBQfgARgR/QQAFIAFB2ABHDQFBAQshASAALQACDQAgAC0AAyIEQe0ARwRAIARBzQBHDQFBASEBCyAALQAEDQAgAC0ABSIAQewARwRAIABBzABHDQFBAA8LQQAhAyABDQAgAkEMNgIAQQEhAwsgAwtOAQJ/AkBBMBBPIgIEQCACQYCAATYCDCACQYKAARBPIgM2AgQgA0UNASACQQE2AhQgAiAAIAEQsgkgAg8LQcCqAxCdAgALQcCqAxCdAgALgAMBBn8CQCACIAFrIgVBAkgNAAJAAkACQAJAAkACQAJAAkACfyABLQAAIgZFBEAgACABLQABIgRqLQBIDAELIAbAIAEsAAEiBBArC0H/AXEiCEEVaw4KAwIHAgcHBwcBAwALIAhBBmsOBQQDBgICBgsgBEEDdkEccSAGQaCACGotAABBBXRyQbDzB2ooAgAgBHZBAXFFDQULIABByABqIQkCQAJAA0AgAiABIgBBAmoiAWsiBUECSA0IIAAtAAMhBAJAAkACQAJ/IAAtAAIiBkUEQCAEIAlqLQAADAELIAbAIATAECsLQf8BcSIIQRJrDgwFCgoKAwoDAwMDCgEACyAIQQZrDgIBAwkLIARBA3ZBHHEgBkGggghqLQAAQQV0ckGw8wdqKAIAIAR2QQFxDQEMCAsLIAVBAkYNBQwGCyAFQQRJDQQMBQsgAEEEaiEBQRwhBwwEC0EWIQcMAwsgBUEESQ0BDAILIAVBAkcNAQtBfg8LIAMgATYCACAHDwtBfwutBQEHfyMAQRBrIggkAEF/IQkCQCACIAFrIgZBAkgNAAJAAkACQAJAAkACQAJAAn8gAS0AACIHRQRAIAAgAS0AASIFai0ASAwBCyAHwCABLAABIgUQKwtB/wFxIgRBBWsOAwUBAgALAkAgBEEWaw4DAwUDAAsgBEEdRw0EIAVBA3ZBHHEgB0GggAhqLQAAQQV0ckGw8wdqKAIAIAV2QQFxDQIMBAsgBkECRw0DDAILIAZBBE8NAgwBCyAAQcgAaiEGIAEhBAJAAkACQAJAAkADQCACIAQiAEECaiIEayIHQQJIDQkgAC0AAyEFAkACQAJ/IAAtAAIiCkUEQCAFIAZqLQAADAELIArAIAXAECsLQf8BcUEGaw4YAQMHBAQHBwcHBQcHBwcHBAIHAgICAgcABwsgBUEDdkEccSAKQaCCCGotAABBBXRyQbDzB2ooAgAgBXZBAXENAQwGCwsgB0ECRg0FDAQLIAdBBEkNBAwDCyABIAQgCEEMahC5CUUNAiAAQQRqIQADQCACIAAiAWsiBEECSA0HIAEtAAEhAAJAAkACQAJAAkACfyABLAAAIgVFBEAgACAGai0AAAwBCyAFIADAECsLQf8BcQ4QAgIEBAQEAAECBAQEBAQEAwQLIARBAkYNCCABQQNqIQAMBAsgBEEESQ0HIAFBBGohAAwDCyADIAE2AgAMCAsgAiABQQJqIgBrQQJIDQggAC0AAA0BIAEtAANBPkcNASADIAFBBGo2AgAMAwsgAUECaiEADAALAAsgASAEIAhBDGoQuQlFDQEgAiAAQQRqIgRrQQJIDQUgAC0ABA0BIAAtAAVBPkcNASADIABBBmo2AgALIAgoAgwhCQwECyADIAQ2AgAMAgtBfiEJDAILIAMgATYCAAtBACEJCyAIQRBqJAAgCQutAgEFf0F/IQQCQAJAIAIgAWtBAkgNAAJAIAEtAAANACABLQABQS1HDQAgAEHIAGohByABQQJqIQADQCACIAAiAWsiBkECSA0CIAEtAAEhAAJAAkACQAJAAkACfyABLAAAIghFBEAgACAHai0AAAwBCyAIIADAECsLQf8BcSIADgkGBgMDAwMAAQYCCyAGQQJGDQcgAUEDaiEADAQLIAZBBEkNBiABQQRqIQAMAwsgAEEbRg0BCyABQQJqIQAMAQsgAiABQQJqIgBrQQJIDQIgAC0AAA0AIAEtAANBLUcNAAsgAiABQQRqIgBrQQJIDQEgAC0AAARAIAAhAQwBCyABQQZqIAAgAS0ABUE+RiIAGyEBQQ1BACAAGyEFCyADIAE2AgAgBSEECyAEDwtBfguNAgEDfyABQcgAaiEGA0AgAyACIgFrIgJBAkgEQEF/DwsgAS0AASEFAkACQAJAAkACQAJAAkACfyABLAAAIgdFBEAgBSAGai0AAAwBCyAHIAXAECsLIgVB/wFxDg4DAwUFBQUAAQMFBQUCAgULIAJBAkYNBSABQQNqIQIMBgsgAkEESQ0EIAFBBGohAgwFCyABQQJqIQIgACAFRw0EIAMgAmtBAkgEQEFlDwsgBCACNgIAIAEtAAMhAAJ/IAEsAAIiAUUEQCAAIAZqLQAADAELIAEgAMAQKwtB/wFxIgBBHktBASAAdEGAnMCBBHFFcg0BQRsPCyAEIAE2AgALQQAPCyABQQJqIQIMAQsLQX4LlgEBAn8gAkELNgIAQQEhAwJAIAEgAGtBBkcNACAALQABDQAgAC0AACIBQfgARgR/QQAFIAFB2ABHDQFBAQshASAALQADDQAgAC0AAiIEQe0ARwRAIARBzQBHDQFBASEBCyAALQAFDQAgAC0ABCIAQewARwRAIABBzABHDQFBAA8LQQAhAyABDQAgAkEMNgIAQQEhAwsgAwukAQECfwJAAkAgACgCFCIBRQRAIABBBBBPIgE2AhQgAUUNASABQQA2AgAgAEKAgICAEDcCDA8LIAAoAgwgACgCECICQQFrTwRAIAAgASACQQhqIgJBAnQQaiIBNgIUIAFFDQIgASAAKAIQQQJ0aiIBQgA3AgAgAUIANwIYIAFCADcCECABQgA3AgggACACNgIQCw8LQeyqAxCdAgALQeyqAxCdAgALgAMBBn8CQCACIAFrIgVBAkgNAAJAAkACQAJAAkACQAJAAkACfyABLQABIgZFBEAgACABLQAAIgRqLQBIDAELIAbAIAEsAAAiBBArC0H/AXEiCEEVaw4KAwIHAgcHBwcBAwALIAhBBmsOBQQDBgICBgsgBEEDdkEccSAGQaCACGotAABBBXRyQbDzB2ooAgAgBHZBAXFFDQULIABByABqIQkCQAJAA0AgAiABIgBBAmoiAWsiBUECSA0IIAAtAAIhBAJAAkACQAJ/IAAtAAMiBkUEQCAEIAlqLQAADAELIAbAIATAECsLQf8BcSIIQRJrDgwFCgoKAwoDAwMDCgEACyAIQQZrDgIBAwkLIARBA3ZBHHEgBkGggghqLQAAQQV0ckGw8wdqKAIAIAR2QQFxDQEMCAsLIAVBAkYNBQwGCyAFQQRJDQQMBQsgAEEEaiEBQRwhBwwEC0EWIQcMAwsgBUEESQ0BDAILIAVBAkcNAQtBfg8LIAMgATYCACAHDwtBfwutBQEHfyMAQRBrIggkAEF/IQkCQCACIAFrIgZBAkgNAAJAAkACQAJAAkACQAJAAn8gAS0AASIHRQRAIAAgAS0AACIFai0ASAwBCyAHwCABLAAAIgUQKwtB/wFxIgRBBWsOAwUBAgALAkAgBEEWaw4DAwUDAAsgBEEdRw0EIAVBA3ZBHHEgB0GggAhqLQAAQQV0ckGw8wdqKAIAIAV2QQFxDQIMBAsgBkECRw0DDAILIAZBBE8NAgwBCyAAQcgAaiEGIAEhBAJAAkACQAJAAkADQCACIAQiAEECaiIEayIHQQJIDQkgAC0AAiEFAkACQAJ/IAAtAAMiCkUEQCAFIAZqLQAADAELIArAIAXAECsLQf8BcUEGaw4YAQMHBAQHBwcHBQcHBwcHBAIHAgICAgcABwsgBUEDdkEccSAKQaCCCGotAABBBXRyQbDzB2ooAgAgBXZBAXENAQwGCwsgB0ECRg0FDAQLIAdBBEkNBAwDCyABIAQgCEEMahC/CUUNAiAAQQRqIQADQCACIAAiAWsiBEECSA0HIAEtAAAhAAJAAkACQAJAAkACfyABLAABIgVFBEAgACAGai0AAAwBCyAFIADAECsLQf8BcQ4QAgIEBAQEAAECBAQEBAQEAwQLIARBAkYNCCABQQNqIQAMBAsgBEEESQ0HIAFBBGohAAwDCyADIAE2AgAMCAsgAiABQQJqIgBrQQJIDQggAS0AAw0BIAAtAABBPkcNASADIAFBBGo2AgAMAwsgAUECaiEADAALAAsgASAEIAhBDGoQvwlFDQEgAiAAQQRqIgRrQQJIDQUgAC0ABQ0BIAAtAARBPkcNASADIABBBmo2AgALIAgoAgwhCQwECyADIAQ2AgAMAgtBfiEJDAILIAMgATYCAAtBACEJCyAIQRBqJAAgCQutAgEFf0F/IQQCQAJAIAIgAWtBAkgNAAJAIAEtAAENACABLQAAQS1HDQAgAEHIAGohCCABQQJqIQADQCACIAAiAWsiBkECSA0CIAEtAAAhBwJAAkACQAJAAkACfyABLAABIgBFBEAgByAIai0AAAwBCyAAIAfAECsLQf8BcSIADgkGBgMDAwMAAQYCCyAGQQJGDQcgAUEDaiEADAQLIAZBBEkNBiABQQRqIQAMAwsgAEEbRg0BCyABQQJqIQAMAQsgAiABQQJqIgBrQQJIDQIgAS0AAw0AIAAtAABBLUcNAAsgAiABQQRqIgBrQQJIDQEgAS0ABQRAIAAhAQwBCyABQQZqIAAgAS0ABEE+RiIAGyEBQQ1BACAAGyEFCyADIAE2AgAgBSEECyAEDwtBfguNAgEDfyABQcgAaiEGA0AgAyACIgFrIgJBAkgEQEF/DwsgAS0AACEFAkACQAJAAkACQAJAAkACfyABLAABIgdFBEAgBSAGai0AAAwBCyAHIAXAECsLIgVB/wFxDg4DAwUFBQUAAQMFBQUCAgULIAJBAkYNBSABQQNqIQIMBgsgAkEESQ0EIAFBBGohAgwFCyABQQJqIQIgACAFRw0EIAMgAmtBAkgEQEFlDwsgBCACNgIAIAEtAAIhAAJ/IAEsAAMiAUUEQCAAIAZqLQAADAELIAEgAMAQKwtB/wFxIgBBHktBASAAdEGAnMCBBHFFcg0BQRsPCyAEIAE2AgALQQAPCyABQQJqIQIMAQsLQX4LBABBAAuBAQECfyACQQs2AgBBASEDAkAgASAAa0EDRw0AIAAtAAAiAUH4AEYEf0EABSABQdgARw0BQQELIQEgAC0AASIEQe0ARwRAIARBzQBHDQFBASEBCyAALQACIgBB7ABHBEAgAEHMAEcNAUEADwtBACEDIAENACACQQw2AgBBASEDCyADC+QDAQV/QQEhBAJAIAIgAWsiBUEATA0AAkACQAJAAkACQAJAAkACQCAAQcgAaiIIIAEtAABqLQAAIgdBBWsOFAIDBAYBAQYGBgYGBgYGBgYBBQYFAAsgB0EeRw0FC0EWIQYMBAsgBUEBRg0EIAAgASAAKALgAhEAAA0DIAAgASAAKALUAhEAAEUNA0ECIQQMAgsgBUEDSQ0DIAAgASAAKALkAhEAAA0CIAAgASAAKALYAhEAAEUNAkEDIQQMAQsgBUEESQ0CIAAgASAAKALoAhEAAA0BIAAgASAAKALcAhEAAEUNAUEEIQQLIAEgBGohAQNAIAIgAWsiBUEATA0DQQEhBAJAAkACQCAIIAEtAABqLQAAIgdBEmsOCgIEBAQBBAEBAQEACwJAAkACQCAHQQVrDgMAAQIGCyAFQQFGDQYgACABIAAoAuACEQAADQUgACABIAAoAsgCEQAARQ0FQQIhBAwCCyAFQQNJDQUgACABIAAoAuQCEQAADQQgACABIAAoAswCEQAARQ0EQQMhBAwBCyAFQQRJDQQgACABIAAoAugCEQAADQMgACABIAAoAtACEQAARQ0DQQQhBAsgASAEaiEBDAELCyABQQFqIQFBHCEGCyADIAE2AgAgBg8LQX4PC0F/C7QGAQd/IwBBEGsiByQAQQEhBUF/IQgCQCACIAFrIgRBAEwNAAJAAkACQAJAAkACQAJAAkAgAEHIAGoiCiABLQAAai0AACIGQQVrDgMBAgMACwJAIAZBFmsOAwQGBAALDAULIARBAUYNAyAAIAEgACgC4AIRAAANBCAAIAEgACgC1AIRAABFDQRBAiEFDAILIARBA0kNAiAAIAEgACgC5AIRAAANAyAAIAEgACgC2AIRAABFDQNBAyEFDAELIARBBEkNASAAIAEgACgC6AIRAAANAiAAIAEgACgC3AIRAABFDQJBBCEFCyABIAVqIQQDQCACIARrIglBAEwNBEEBIQUgBCEGAkACQAJAAkACQAJAAkACQAJAAkAgCiAELQAAai0AAEEFaw4ZAAECBwMDBwcHBwQHBwcHBwMJBwkJCQkHBQcLIAlBAUYNCiAAIAQgACgC4AIRAAANBCAAIAQgACgCyAIRAABFDQRBAiEFDAgLIAlBA0kNCSAAIAQgACgC5AIRAAANAyAAIAQgACgCzAIRAABFDQNBAyEFDAcLIAlBBEkNCCAAIAQgACgC6AIRAAANAiAAIAQgACgC0AIRAABFDQJBBCEFDAYLIAEgBCAHQQxqEMYJRQ0BIARBAWohBQNAIAIgBSIBayIGQQBMDQsCQAJAAkACQAJAIAogAS0AAGotAAAOEAoKBAQEAAECCgQEBAQEBAMECyAGQQFGDQwgACABIAAoAuACEQAADQkgAUECaiEFDAQLIAZBA0kNCyAAIAEgACgC5AIRAAANCCABQQNqIQUMAwsgBkEESQ0KIAAgASAAKALoAhEAAA0HIAFBBGohBQwCCyACIAFBAWoiBWtBAEwNDCAFLQAAQT5HDQEgAyABQQJqNgIAIAcoAgwhCAwMCyABQQFqIQUMAAsACyABIAQgB0EMahDGCQ0BCyADIAQ2AgAMBwsgAiAEQQFqIgZrQQBMDQcgBC0AAUE+Rw0AIAMgBEECajYCACAHKAIMIQgMBwsgAyAGNgIADAULIAMgATYCAAwECyAEIAVqIQQMAAsAC0F+IQgMAgsgAyABNgIAC0EAIQgLIAdBEGokACAIC7QCAQR/AkAgAiABa0EATA0AAkACQAJAIAEtAABBLUcNACAAQcgAaiEGIAFBAWohBANAIAIgBCIBayIEQQBMDQQCQAJAAkACQAJAAkAgBiABLQAAai0AACIHDgkHBwQEBAABAgcDCyAEQQFGDQggACABIAAoAuACEQAADQYgAUECaiEEDAULIARBA0kNByAAIAEgACgC5AIRAAANBSABQQNqIQQMBAsgBEEESQ0GIAAgASAAKALoAhEAAA0EIAFBBGohBAwDCyAHQRtGDQELIAFBAWohBAwBCyACIAFBAWoiBGtBAEwNBCAELQAAQS1HDQALQX8hBSACIAFBAmoiAGtBAEwNASABQQNqIAAgAS0AAkE+RiIAGyEBQQ1BACAAGyEFCyADIAE2AgALIAUPC0F+DwtBfwuNAgEDfyABQcgAaiEGAkACQANAIAMgAmsiBUEATARAQX8PCwJAAkACQAJAAkACQCAGIAItAABqLQAAIgcODgUFBAQEAAECBQQEBAMDBAsgBUEBRg0HIAEgAiABKALgAhEAAA0EIAJBAmohAgwFCyAFQQNJDQYgASACIAEoAuQCEQAADQMgAkEDaiECDAQLIAVBBEkNBSABIAIgASgC6AIRAAANAiACQQRqIQIMAwsgAkEBaiECIAAgB0cNAiADIAJrQQBMBEBBZQ8LIAQgAjYCACAGIAItAABqLQAAIgBBHktBASAAdEGAnMCBBHFFcg0DQRsPCyACQQFqIQIMAQsLIAQgAjYCAAtBAA8LQX4LHAAgACABIAIgAxDCBiIABEAgAEEXOgCCAQsgAAscAEHfACAAIAEgAiADIAQgBSAGIAcgCCAJEM4JCxEAIAAgASACQd4AQd0AEKsKC8QEAQJ/IwBBEGsiCyQAIAtBADYCCCALQQA2AgQgC0EANgIAIAsgAyACKAJAIgxBBWxqIgM2AgwCfwJAAkAgAiADIAQgDEEBdGsiDCALQQRqIAsgC0EIaiALQQxqEMAGRQ0AIAsoAgQiBEUNAAJAAkAgCgJ/AkACQAJAIAIgBCALKAIAIgNBtJMIIAIoAhgRBgBFBEAgAQ0BDAgLIAYEQCAGIAsoAgg2AgALIAsoAgwhAyAHBEAgByADNgIACyACIAMgDCALQQRqIAsgC0EIaiALQQxqEMAGRQ0GIAsoAgQiBEUNASALKAIAIQMLIAIgBCADQbyTCCACKAIYEQYABEAgAiALKAIIIgQgDBDjAkFfcUHBAGtBGUsNByAIBEAgCCAENgIACyALKAIMIQMgCQRAIAkgAiAEIAMgAigCQGsgABEDADYCAAsgAiADIAwgC0EEaiALIAtBCGogC0EMahDABkUNBiALKAIEIgRFDQUgCygCACEDCyABIAIgBCADQcWTCCACKAIYEQYARXINBiACIAsoAggiBCALKAIMIgMgAigCQGtB0JMIIAIoAhgRBgBFDQEgCkUNA0EBDAILIAENBAwDCyACIAQgAyACKAJAa0HUkwggAigCGBEGAEUNBCAKRQ0BQQALNgIACwNAIAIgAyAMEOMCQQlrIgBBF0tBASAAdEGTgIAEcUVyRQRAIAMgAigCQGohAwwBCwsgDCADIgRHDQILQQEMAgsgCygCDCEECyAFIAQ2AgBBAAsgC0EQaiQACxwAQdwAIAAgASACIAMgBCAFIAYgByAIIAkQzgkL/QEBAX8gAEHIAGohBANAIAIgAWtBAEoEQAJAAkACQAJAAkACQCAEIAEtAABqLQAAQQVrDgYAAQIFBAMFCyADIAMoAgRBAWo2AgQgAUECaiEBDAYLIAMgAygCBEEBajYCBCABQQNqIQEMBQsgAyADKAIEQQFqNgIEIAFBBGohAQwECyADQQA2AgQgAyADKAIAQQFqNgIAIAFBAWohAQwDCyADIAMoAgBBAWo2AgACfyACIAFBAWoiAGtBAEwEQCAADAELIAFBAmogACAEIAEtAAFqLQAAQQpGGwshASADQQA2AgQMAgsgAyADKAIEQQFqNgIEIAFBAWohAQwBCwsLeQEDfwJAA0ACQCABLQAAIQMgAC0AACECQQEhBCABQQFqIQEgAEEBaiEAQQEgAkEgayACIAJB4QBrQf8BcUEaSRtB/wFxIgJFQQF0IAIgA0EgayADIANB4QBrQf8BcUEaSRtB/wFxRxtBAWsOAgACAQsLQQAhBAsgBAtBAQF/AkAgAEUEQEEGIQEMAQsDQCABQQZGBEBBfw8LIAAgAUECdEGQhwhqKAIAENEJDQEgAUEBaiEBDAALAAsgAQtlAQJ/An9BACAAKAIQKAIIIgFFDQAaIAEoAlgiAgRAIAIQjgpBACAAKAIQKAIIIgFFDQEaCyABKAJcEBggACgCECgCCAsQGCAAKAIQIgJBADYCCCACKAIMELwBIABBAEHiJRC3Bwv3AQEEfyABIAAQSyIDaiICIANBAXRBgAggAxsiASABIAJJGyECIAAQJCEEAkAgAC0AD0H/AUYEQAJ/IAAoAgAhBCMAQSBrIgUkAAJAIAMiAUF/RwRAAkAgAkUEQCAEEBhBACEDDAELIAQgAhBqIgNFDQIgASACTw0AIAEgA2pBACACIAFrEDgaCyAFQSBqJAAgAwwCC0GOwANB0vwAQc0AQb2zARAAAAsgBSACNgIQQYj2CCgCAEH16QMgBUEQahAgGhAvAAshAQwBCyACQQEQGiIBIAAgBBAfGiAAIAQ2AgQLIABB/wE6AA8gACACNgIIIAAgATYCAAvRAwICfwJ8IwBBMGsiAyQAIANBADoAHwJAIAAgARAnIgBFDQAgAyADQR9qNgIYIAMgA0EgajYCFCADIANBKGo2AhACQAJAIABBgL8BIANBEGoQUUECSA0AIAMrAygiBUQAAAAAAAAAAGRFDQAgAysDICIGRAAAAAAAAAAAZEUNACACAn8gBUQAAAAAAABSQKIiBUQAAAAAAADgP0QAAAAAAADgvyAFRAAAAAAAAAAAZhugIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C7c5AwACfyAGRAAAAAAAAFJAoiIFRAAAAAAAAOA/RAAAAAAAAOC/IAVEAAAAAAAAAABmG6AiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLtyEFDAELIANBADoAHyADIANBKGo2AgAgAyADQR9qNgIEIABBhL8BIAMQUUEATA0BIAMrAygiBUQAAAAAAAAAAGRFDQEgAgJ/IAVEAAAAAAAAUkCiIgVEAAAAAAAA4D9EAAAAAAAA4L8gBUQAAAAAAAAAAGYboCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAu3IgU5AwALIAIgBTkDCCADLQAfQSFGIQQLIANBMGokACAEC0sAIABBASABQQAQ0gMiAUUEQEHnBw8LIAAgASgCECIBKAIENgKwASAAIAEoAgw2AqQBIAAgASgCADYCqAEgACABKAIQNgKsAUGsAgvzAgIEfwZ8IwBBIGsiAyQAIAIoAjQiBARAIAEoAhAiBSsAECEHIAIrABAhCCACKwAgIQkgBCACKwAoIAIrABigRAAAAAAAAOA/oiAFKwAYoDkDQCAEIAcgCSAIoEQAAAAAAADgP6KgOQM4IABBCiAEEJADIAAgARD0BBoLIAEoAhAiBCsDGCEHIAQrAxAhCEEAIQQDQCACKAIwIARKBEAgBARAIAIoAjggBEECdGoiBigCACEFAnwgAi0AQARAIAMgBSkDEDcDACADIAUpAxg3AwggBigCACsDKCEJIAMrAwAiCiELIAMrAwgMAQsgAyAFKQMgNwMQIAMgBSkDKDcDGCAGKAIAKwMQIQsgAysDECEKIAMrAxgiCQshDCADIAcgCaA5AxggAyAIIAqgOQMQIAMgByAMoDkDCCADIAggC6A5AwAgACADQQIQPQsgACABIAIoAjggBEECdGooAgAQ1wkgBEEBaiEEDAELCyADQSBqJAALUwECfwJAIAAoAjwiAkUNACACIAEQPkUNACAADwtBACECA0AgACgCMCACTARAQQAPCyACQQJ0IAJBAWohAiAAKAI4aigCACABENgJIgNFDQALIAMLOQEBfyAAQeDbCigCAEHx/wQQjwEiAi0AAAR/IAIFIABB3NsKKAIAQfH/BBCPASIAIAEgAC0AABsLC+sEAQZ/AkAgAEH82wooAgBB8f8EEI8BIgItAABFBEAMAQsgAhDDAyIHIQIDQCACKAIAIgZFDQEgBkGurQEQPgRAIAJBBGohAiAEQQFyIQQMAQsgAiEDIAZB2a4BED4EQANAIAMgAygCBCIFNgIAIANBBGohAyAFDQALIARBBHIhBAwBCyAGQZEtED4EQANAIAMgAygCBCIFNgIAIANBBGohAyAFDQALIARBCHIhBAwBCyAGQbMtED4EQCACQQRqIQIgBEEgciEEDAELIAZB/vEAED4EQANAIAMgAygCBCIFNgIAIANBBGohAyAFDQALIARBA3IhBAwBCwJAIAZBrKwBED5FDQAgACgCECgCCCgCCCIFRQ0AIAUoAghBBEcNACAFKwMQEKcHmUQAAAAAAADgP2NFDQAgBSkDGEIAUg0AIAUpAyBCAFINAANAIAMgAygCBCIFNgIAIANBBGohAyAFDQALIARBwAByIQQMAQsCQCAGQcSuARA+RQ0AIAAoAhAoAggoAggiBUUNACAFKAIIQQJLDQADQCADIAMoAgQiBTYCACADQQRqIQMgBQ0ACyAEQYAEciEEDAELIAJBBGohAgwACwALIAEgACgCECgCCCgCCCIABH8gBEGA4B9xRSAAKAAoIgBBgOAfcUVyRQRAQeKbA0HeuQFBvgNBmzcQAAALIAAgBHIiAkGA4B9xIABBAXEgBEEBcXJyIAJBAnFyIAJBBHFyIAJBCHFyIAJBEHFyIAJBIHFyIAJBwABxciACQYABcXIgAkGAAnFyIAJBgARxciACQYAIcXIgAkGAEHFyBSAECzYCACAHC6YBAgF/BHwjAEEgayICJAAgASgCECIBKwAQIQMgASsDYCEFIAIgASsDUEQAAAAAAADoP6JEAAAAAAAA4D+iIgQgASsAGKAiBjkDGCACIAY5AwggAiADIAVEfGEyVTAq5T+iIgOgIgU5AwAgAiAFIAMgA6ChOQMQIAAgAkECED0gAiACKwMIIAQgBKChIgQ5AxggAiAEOQMIIAAgAkECED0gAkEgaiQACwwAIABBOhDNAUEARwtgACAAQQA2AgAgAiAAENoJIgAEQCABIAAQ5QELAkBBvNwKKAIAIgBFDQAgAiAAEEUiAEUNACAALQAARQ0AIAEgAkG83AooAgBEAAAAAAAA8D9EAAAAAAAAAAAQTBCHAgsLBABBAAswAQF/IwBBEGsiAiQAIAAQISEAIAIgATYCBCACIAA2AgBB/bYEIAIQKiACQRBqJAALNwEDfwNAIAFBA0cEQCAAIAFBAnRqIgIoAgAiAwRAIAMQmQEaIAJBADYCAAsgAUEBaiEBDAELCwt8ACAAQgA3AwAgAEIANwMIAkACQAJAAkAgAkEBaw4DAgEDAAsgACABKQMANwMAIAAgASkDCDcDCA8LIAAgASsDADkDACAAIAErAwiaOQMIDwsgACABKwMAOQMIIAAgASsDCJo5AwAPCyAAIAErAwA5AwggACABKwMIOQMAC7ECAgl/AnwjAEEQayIFJAAgACACOgBBIAErAwghDCAAIAErAwAiDTkDECAAIAw5AyggACAMIAArAwihOQMYIAAgDSAAKwMAoDkDICAAKAIwIgRBACAEQQBKGyEHQQ5BDyAEQQFrIgYbIQhBDUEPIAYbIQkDQCADIAdGRQRAAn9BACACRQ0AGiAALQBABEAgCSADRQ0BGkEHQQUgAyAGRhsMAQsgCCADRQ0AGkELQQogAyAGRhsLIQQgA0ECdCIKIAAoAjhqKAIAIAUgASkDCDcDCCAFIAEpAwA3AwAgBSACIARxEOIJIAAoAjggCmooAgAhBAJAIAAtAEAEQCABIAErAwAgBCsDAKA5AwAMAQsgASABKwMIIAQrAwihOQMICyADQQFqIQMMAQsLIAVBEGokAAvzAgIFfAN/IwBBIGsiCCQAIAFBCGorAwAhBSAAKwMAIQQgASsDACEGIAAgASkDADcDACAAKwMIIQMgACABKQMINwMIIAUgA6EhAyAGIAShIQQCQCACDQAgACgCNCIBRQ0AIAEgBCABKwMooDkDKCABIAMgASsDMKA5AzALAkAgACgCMCIJRQ0AIAQgAyAALQBAGyAJt6MhB0EAIQEDQCABIAlODQECfyAHIAG4oiIDmUQAAAAAAADgQWMEQCADqgwBC0GAgICAeAshCQJ/IAcgAUEBaiIKuKIiA5lEAAAAAAAA4EFjBEAgA6oMAQtBgICAgHgLIAlrIQkgACgCOCABQQJ0aigCACEBAnwgAC0AQARAIAUhBCABKwMAIAm3oAwBCyABKwMIIAm3oCEEIAYLIQMgCCAEOQMYIAggCCkDGDcDCCAIIAM5AxAgCCAIKQMQNwMAIAEgCCACEOMJIAAoAjAhCSAKIQEMAAsACyAIQSBqJAALjAMCBHwCfyMAQSBrIgckAAJAIAIoAjQiCARAIAgrAxgiBEQAAAAAAAAAAGQgCCsDICIDRAAAAAAAAAAAZHJFDQEgAUHX5AAQJyIBBEAgByAHQRhqNgIEIAcgB0EIajYCACABQdyDASAHEFEiAUEASgRAIAcrAwhEAAAAAAAAUkCiIgUgBaAiBSAEoCEEIAFBAUcEQCAHKwMYRAAAAAAAAFJAoiIFIAWgIAOgIQMMBAsgBSADoCEDDAMLIANEAAAAAAAAIECgIQMgBEQAAAAAAAAwQKAhBAwCCyADRAAAAAAAACBAoCEDIAREAAAAAAAAMECgIQQMAQtBACEIA0AgCCACKAIwTkUEQCAHQQhqIAEgAigCOCAIQQJ0aigCABDkCSAHKwMQIQUgBysDCCEGAnwgAi0AQARAIAYgBKAhBCADIAUQIwwBCyAEIAYQIyEEIAUgA6ALIQMgCEEBaiEIDAELCwsgACADOQMIIAAgBDkDACACIAApAwA3AwAgAiAAKQMINwMIIAdBIGokAAtoAQJ/IABBAiABIAFBA0YbIgMgAhDoCSIBRQRADwsgA0ECdCIDIAAoAkxqKAIsIgQgAUECIAQoAgARAwAaIAAoAkwgA2ooAjgiAyABQQIgAygCABEDABogACABKAIYQQAQjAEaIAEQGAtAAQF/AkADQAJAAkAgACgCABCtAiIBQQFqDg8DAQEBAQEBAQEBAgICAgIACyABQSBGDQELCyABIAAoAgAQ0wsLC8ABAQF8IAFBpeUAED4EQCAARAAAAAAAAFJAohAyDwsgAUGXEhA+BEAgAEQAAAAAAABSQKJEAAAAAAAAWECjEDIPCyABQZazARA+BEAgAEQAAAAAAABSQKJEAAAAAAAAGECjEDIPCwJAIAFB3xwQPkUEQCABQY/HAxA+RQ0BCyAAEDIPCyABQe7sABA+BEAgAER8XElisVg8QKIQMg8LIAFBz+wAED4EfCAARC99B7VarQZAohAyBUQAAAAAAAAAAAsLRwEBfyMAQSBrIgMkACAAKAJMQQIgASABQQNGG0ECdGooAjgiAAR/IAMgAjcDECAAIANBBCAAKAIAEQMABUEACyADQSBqJAALRQACQCAAECgEQCAAECRBD0YNAQsgAEEAEJcDCwJAIAAQKARAIABBADoADwwBCyAAQQA2AgQLIAAQKAR/IAAFIAAoAgALC54BAgJ8An8gAUUEQCAAQn83AgAPCwJ/IAErAzBEAAAAAAAAUkCiIAEoAkAiBbciAyACKwMAIAUboyIEmUQAAAAAAADgQWMEQCAEqgwBC0GAgICAeAshBiACKwMIIQQgACAGNgIAIAACfyABKwM4RAAAAAAAAFJAoiADIAQgBRujIgOZRAAAAAAAAOBBYwRAIAOqDAELQYCAgIB4CzYCBAucAgEDfyMAQSBrIgIkAAJAAkAgAARAIAAoAggiAUUNASABLQAARQ0CAn8CQCAAKAIUIgNFBEAgARD7BCIBRQRAIAIgACgCCDYCAEHoswQgAhAqQQAMAwsgACABQbS/ARCfBCIDNgIUIANFBEBB/IALKAIAELMFIQAgAiABNgIUIAIgADYCEEH4+AMgAkEQahAqQQAMAwtBkN8KKAIAIgFBMkgNASAAQQE6ABFBAQwCCyADEOYDQQEgACgCFA0BGkHQhQFBvb0BQcQFQd8oEAAAC0GQ3wogAUEBajYCAEEBCyACQSBqJAAPC0GsJkG9vQFBrwVB3ygQAAALQe6YAUG9vQFBsAVB3ygQAAALQeTIAUG9vQFBsQVB3ygQAAALVwECfwJAIAAEQCAALQAARQ0BQYzfCigCACIBBH8gASAAQYAEIAEoAgARAwAFQQALDwtBwpkBQb29AUGhBUH/pAEQAAALQejIAUG9vQFBogVB/6QBEAAAC5kCAQJ/IAEoAkQhAQNAIAEtAAAiAgRAAkACQCABQZPaAUEFEIACRQ0AIAFBzdEBQQcQgAJFDQAgAUH73AFBBRCAAkUNACABQcrQAUEJEIACDQELAn8CQANAAkACQAJAIAJB/wFxIgJBCmsOBAQBAQIACyACRQ0DCyABLQABIQIgAUEBaiEBDAELC0EBIAEtAAFBCkcNARogAUECaiEBDAQLIAJBAEcLIQIgASACaiEBDAILAn8CQANAAkACQAJAIAJB/wFxIgNBCmsOBAQBAQIACyADRQ0DCyAAIALAEGUgAS0AASECIAFBAWohAQwBCwtBAkEBIAEtAAFBCkYbDAELIANBAEcLIQIgAEEKEGUgASACaiEBDAELCwvIAgICfwF8IwBBgAJrIgMkACACKwMQIQUgAyAAKQMINwN4IAMgACkDADcDcCADIAEpAwg3A2ggAyABKQMANwNgIANB4AFqIANB8ABqIANB4ABqEMwDAkAgBSADKwPgAWZFDQAgAyAAKQMINwNYIAMgACkDADcDUCADIAEpAwg3A0ggAyABKQMANwNAIANBwAFqIANB0ABqIANBQGsQzAMgAysD0AEgAisDAGZFDQAgAisDGCADIAApAwg3AzggAyAAKQMANwMwIAMgASkDCDcDKCADIAEpAwA3AyAgA0GgAWogA0EwaiADQSBqEMwDIAMrA6gBZkUNACADIAApAwg3AxggAyAAKQMANwMQIAMgASkDCDcDCCADIAEpAwA3AwAgA0GAAWogA0EQaiADEMwDIAMrA5gBIAIrAwhmIQQLIANBgAJqJAAgBAtqAgJ8AX8CQCABKwMQIAArADgiAiAAKwMYRAAAAAAAAOA/oiIDoWZFDQAgASsDACADIAKgZUUNACABKwMYIAArAEAiAiAAKwMgRAAAAAAAAOA/oiIDoWZFDQAgASsDCCADIAKgZSEECyAEC/oCAQZ/IwBBEGsiBiQAAkACQAJAIAAoAgAiAy0AAEEjRgRAIAMtAAEiAkHfAXFB2ABGBEBBAiEBA0AgAUEIRg0DAkAgASADai0AACICQcEAa0H/AXFBBkkEQEFJIQUMAQsgAkHhAGtB/wFxQQZJBEBBqX8hBQwBC0FQIQUgAkEwa0H/AXFBCUsNBQsgAiAFaiICIARBBHRqIQQgAUEBaiEBDAALAAtBASEBA0AgAUEIRg0CIAEgA2otAAAiAkEwa0H/AXFBCUsNAyABQQFqIQEgBEEKbCACakEwayEEDAALAAsgBiADNgIIA0AgBiABNgIMIAFBCEYNAyABIANqIgUtAAAiAkUEQCACIQQMBAsgAkE7RgRAIAZBCGpBwOEHQfwBQQhBNxDsAyICRQ0EIAVBAWohAyACKAIEIQQMBAUgAUEBaiEBDAELAAsAC0EIIQELIAJBO0cEQEEAIQQMAQsgASADakEBaiEDCyAAIAM2AgAgBkEQaiQAIAQLYgEDfyMAQRBrIgIkACACQQA6AA8gAiAAOgAOIAJBDmoQmgQiBBBAIQAgBCEDA0AgAEECSUUEQCABIAMsAAAQfyADQQFqIQMgAEEBayEADAELCyADLQAAIAQQGCACQRBqJAALrgEBAn8gABAtIQICQAJAIAAoAhAtAIYBQQFHDQAgASAAQQEQhQEaIAAQIUE6EM0BIgBFDQFBACEBIAIgAEEBaiIDQQAQjQEiAA0AIAIgA0EBEI0BIgBB/CVBwAJBARA2GiAAKAIQQQE6AIYBA0AgAkEBIAEQ5QMiAUUNASAAIAEQRSABKAIMIgNGDQAgACABIAMQcQwACwALIAAPC0HCmQFBzLkBQdgHQbjRARAAAAulAwEHfwJAAkAgAEH23gBBABBrIgJFDQAgAigCCCIDRQ0AIABB5jBBARCSASIFQeIlQZgCQQEQNhogA0EEEBohByAAEBwhAgNAIAIEQCAAIAIQLCEBA0AgAQRAIAEoAhAtAHEEQCAHIARBAnRqIAE2AgAgBEEBaiEECyAAIAEQMCEBDAELCyAAIAIQHSECDAELCyADIARHDQEgA0EAIANBAEobIQRBACEDA0AgAyAERkUEQCAHIANBAnRqKAIAIgZBUEEAIAYoAgBBA3EiAUECRxtqKAIoIQIgBiAGQTBBACABQQNHG2ooAiggBRDyCSACIAUQ8gkQmwQoAhAiAiAGKAIQIgEoAgg2AgggAUEANgIIIAIgASgCYDYCYCABQQA2AmAgAiABKAJsNgJsIAFBADYCbCACIAEoAmQ2AmQgAUEANgJkIAIgASgCaDYCaCABQQA2AmggBhDAAiADQQFqIQMMAQsLIAcQGCAFEBwhAQNAIAEEQCAFIAEQHSABEOcCIAAgARC3ASEBDAELCyAFELkBCw8LQYsgQcy5AUGZCEG7MBAAAAuXAQEFfyMAQRBrIgQkAEEBIQIDQCACIAAoAhAiAygCtAFKRQRAAkAgASADKAK4ASACQQJ0aigCACIDECEiBUGABCABKAIAEQMABEAgBCAFNgIAQaG4BCAEECoMAQtBEBBSIgYgAzYCDCAGIAU2AgggASAGQQEgASgCABEDABoLIAMgARD0CSACQQFqIQIMAQsLIARBEGokAAsoAQF/A38gAAR/IAAoAgQQ9QkgAWpBAWohASAAKAIAIQAMAQUgAQsLC00BAn8gARAhIgMEQAJAIANB4jdBBxDqAQ0AIAAgARAhQYAEIAAoAgARAwAiAEUNACAAKAIMIQILIAIPC0GI1AFB6/sAQQxBnvcAEAAACxkAIABB5PwJQZTuCSgCABCTASIAEPQJIAAL8gECA38GfCAAIAEoAiwgASgCCCIDIAEoAgQiAUEBayICQQAgASACTxtsQQR0aiICKQMANwMQIAAgAikDCDcDGCAAIAIpAwg3AwggACACKQMANwMAQQEgAyADQQFNGyEDIAArAxghBSAAKwMIIQYgACsDECEHIAArAwAhCEEBIQEDQCABIANGBEAgACAFOQMYIAAgBjkDCCAAIAc5AxAgACAIOQMABSAFIAIgAUEEdGoiBCsDCCIJIAUgCWQbIQUgByAEKwMAIgogByAKZBshByAGIAkgBiAJYxshBiAIIAogCCAKYxshCCABQQFqIQEMAQsLCyoBAX8CQCABRQ0AIAAgARBFIgBFDQAgAC0AAEUNACAAEGhBAXMhAgsgAgtRAQF/AkACQCADRQ0AIANBOhDNASIERQ0AIARBADoAACAAIAIgAyAEQQFqIgMgAREHACAEQTo6AAAMAQsgACACIANBACABEQcACyAAIAM2AiQLXAAgASgCCEUEQCAAIAEQ1QYLIAIgAEGc3QooAgAgASsDAEQAAAAAAADwPxBMOQMAIAIgAEGg3QooAgAgASgCCBCPATYCCCACIABBpN0KKAIAIAEoAgwQjwE2AgwLlwQCCHwIfyMAQUBqIgwkACABKAIAIQ8gAisDCCEGIAIrAwAhByABKAIEIRBE////////738hA0F/IQ1BfyECA0ACQCALIBBGBEAgDyANQTBsaiIBKAIAIAIgAiABKAIEQQFrRmsiASABQQNwa0EEdGohAkEAIQEMAQsgDyALQTBsaiIBKAIEIREgASgCACESQQAhAQNAIAEgEUYEQCALQQFqIQsMAwUgEiABQQR0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dSAGQRBqJAAgBUHomws2AghBhJ0LIAUoAggQogIaQYidC0EBOgAACyAFQRBqJABBjJ0LQYSdCxDcCkGQnQtBAToAAAsgAEGMnQsoAgAiADYCACAAENsKCxEAIABB6JsLRwRAIAAQ3goLCxMAIAAgASgCACIANgIAIAAQ2woLnQEBBH8gAEG4swk2AgAgAEEIaiEBA0AgARDEAiACSwRAIAEgAhCdAygCAARAIAEgAhCdAygCABCRBQsgAkEBaiECDAELCyAAQZABahA1GiMAQRBrIgIkACACQQxqIAEQogIiASgCACIDKAIABEAgAxDfCiABKAIAGiABKAIAEJwDIAEoAgAiASgCACABEL8KGhC+CgsgAkEQaiQAIAALDwAgACAAKAIEQQFqNgIECwwAIAAgACgCABDACgt7AQN/IwBBEGsiBCQAIARBBGoiAiAANgIAIAIgACgCBCIDNgIEIAIgAyABQQJ0ajYCCCACIgMoAgQhASACKAIIIQIDQCABIAJGBEAgAygCACADKAIENgIEIARBEGokAAUgABCcAxogARDBCiADIAFBBGoiATYCBAwBCwsLIAAgAEGIvAk2AgAgACgCCBBmRwRAIAAoAggQmwsLIAALBABBfwumAQEDfyMAQRBrIgQkACMAQSBrIgMkACADQRhqIAAgARDGCiADQRBqIAMoAhggAygCHCACEKsLIAMoAhAhBSMAQRBrIgEkACABIAA2AgwgAUEMaiIAIAUgABD1BmtBAnUQ+wYhACABQRBqJAAgAyAANgIMIAMgAiADKAIUEKQDNgIIIARBCGogA0EMaiADQQhqEPsBIANBIGokACAEKAIMIARBEGokAAuBBgEKfyMAQRBrIhMkACACIAA2AgBBBEEAIAcbIRUgA0GABHEhFgNAIBRBBEYEQCANECVBAUsEQCATIA0Q3gE2AgwgAiATQQxqQQEQ+wYgDRDyAiACKAIAEOMKNgIACyADQbABcSIDQRBHBEAgASADQSBGBH8gAigCAAUgAAs2AgALIBNBEGokAAUCQAJAAkACQAJAAkAgCCAUai0AAA4FAAEDAgQFCyABIAIoAgA2AgAMBAsgASACKAIANgIAIAZBIBDRASEHIAIgAigCACIPQQRqNgIAIA8gBzYCAAwDCyANEPYBDQIgDUEAEJoFKAIAIQcgAiACKAIAIg9BBGo2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QQFqIQUgAUEBaiEBDAELCyADQQA6AAcgBSADQQdqENIBIANBEGokAAwBCxDKAQALCw8AIAAgACgCGCABajYCGAsXACAAIAI2AhwgACABNgIUIAAgATYCGAtXAQJ/AkAgACgCACICRQ0AAn8gAigCGCIDIAIoAhxGBEAgAiABIAIoAgAoAjQRAAAMAQsgAiADQQRqNgIYIAMgATYCACABC0F/EMgCRQ0AIABBADYCAAsLMQEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBBGo2AgwgASgCAAsnAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEoAgALJwEBfwJAIAAoAgAiAkUNACACIAEQvQtBfxDIAkUNACAAQQA2AgALC1MBA38CQEF/IAAoAkwQyAJFBEAgACgCTCEADAELIAAjAEEQayIBJAAgAUEMaiICIAAQUyACEMwBQSAQmwEhACACEFAgAUEQaiQAIAA2AkwLIADACxoAIAAgASABKAIAQQxrKAIAaigCGDYCACAACwsAIABB4JoLEKkCCw0AIAAgASACQQAQogcLCQAgABCSBxAYCz0BAX8gACgCGCICIAAoAhxGBEAgACABEKYDIAAoAgAoAjQRAAAPCyAAIAJBAWo2AhggAiABOgAAIAEQpgMLNAEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBAWo2AgwgASwAABCmAwsqAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEsAAAQpgMLDwAgACAAKAIAKAIYEQIACwgAIAAoAhBFCwQAQX8LLAAgACABEK4HIgFFBEAPCwJAIAMEQCAAIAEgAhCoBAwBCyAAIAEgAhC7CwsLCAAgABCLBxoLvg8CBX8PfiMAQdACayIFJAAgBEL///////8/gyEKIAJC////////P4MhCyACIASFQoCAgICAgICAgH+DIQwgBEIwiKdB//8BcSEIAkACQCACQjCIp0H//wFxIglB//8Ba0GCgH5PBEAgCEH//wFrQYGAfksNAQsgAVAgAkL///////////8AgyINQoCAgICAgMD//wBUIA1CgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhDAwCCyADUCAEQv///////////wCDIgJCgICAgICAwP//AFQgAkKAgICAgIDA//8AURtFBEAgBEKAgICAgIAghCEMIAMhAQwCCyABIA1CgICAgICAwP//AIWEUARAIAMgAkKAgICAgIDA//8AhYRQBEBCACEBQoCAgICAgOD//wAhDAwDCyAMQoCAgICAgMD//wCEIQxCACEBDAILIAMgAkKAgICAgIDA//8AhYRQBEBCACEBDAILIAEgDYRQBEBCgICAgICA4P//ACAMIAIgA4RQGyEMQgAhAQwCCyACIAOEUARAIAxCgICAgICAwP//AIQhDEIAIQEMAgsgDUL///////8/WARAIAVBwAJqIAEgCyABIAsgC1AiBht5IAZBBnStfKciBkEPaxCxAUEQIAZrIQYgBSkDyAIhCyAFKQPAAiEBCyACQv///////z9WDQAgBUGwAmogAyAKIAMgCiAKUCIHG3kgB0EGdK18pyIHQQ9rELEBIAYgB2pBEGshBiAFKQO4AiEKIAUpA7ACIQMLIAVBoAJqIApCgICAgICAwACEIhJCD4YgA0IxiIQiAkIAQoCAgICw5ryC9QAgAn0iBEIAEJwBIAVBkAJqQgAgBSkDqAJ9QgAgBEIAEJwBIAVBgAJqIAUpA5gCQgGGIAUpA5ACQj+IhCIEQgAgAkIAEJwBIAVB8AFqIARCAEIAIAUpA4gCfUIAEJwBIAVB4AFqIAUpA/gBQgGGIAUpA/ABQj+IhCIEQgAgAkIAEJwBIAVB0AFqIARCAEIAIAUpA+gBfUIAEJwBIAVBwAFqIAUpA9gBQgGGIAUpA9ABQj+IhCIEQgAgAkIAEJwBIAVBsAFqIARCAEIAIAUpA8gBfUIAEJwBIAVBoAFqIAJCACAFKQO4AUIBhiAFKQOwAUI/iIRCAX0iAkIAEJwBIAVBkAFqIANCD4ZCACACQgAQnAEgBUHwAGogAkIAQgAgBSkDqAEgBSkDoAEiDSAFKQOYAXwiBCANVK18IARCAVatfH1CABCcASAFQYABakIBIAR9QgAgAkIAEJwBIAYgCSAIa2ohBgJ/IAUpA3AiE0IBhiIOIAUpA4gBIg9CAYYgBSkDgAFCP4iEfCIQQufsAH0iFEIgiCICIAtCgICAgICAwACEIhVCAYYiFkIgiCIEfiIRIAFCAYYiDUIgiCIKIBAgFFatIA4gEFatIAUpA3hCAYYgE0I/iIQgD0I/iHx8fEIBfSITQiCIIhB+fCIOIBFUrSAOIA4gE0L/////D4MiEyABQj+IIhcgC0IBhoRC/////w+DIgt+fCIOVq18IAQgEH58IAQgE34iESALIBB+fCIPIBFUrUIghiAPQiCIhHwgDiAOIA9CIIZ8Ig5WrXwgDiAOIBRC/////w+DIhQgC34iESACIAp+fCIPIBFUrSAPIA8gEyANQv7///8PgyIRfnwiD1atfHwiDlatfCAOIAQgFH4iGCAQIBF+fCIEIAIgC358IgsgCiATfnwiEEIgiCALIBBWrSAEIBhUrSAEIAtWrXx8QiCGhHwiBCAOVK18IAQgDyACIBF+IgIgCiAUfnwiCkIgiCACIApWrUIghoR8IgIgD1StIAIgEEIghnwgAlStfHwiAiAEVK18IgRC/////////wBYBEAgFiAXhCEVIAVB0ABqIAIgBCADIBIQnAEgAUIxhiAFKQNYfSAFKQNQIgFCAFKtfSEKQgAgAX0hCyAGQf7/AGoMAQsgBUHgAGogBEI/hiACQgGIhCICIARCAYgiBCADIBIQnAEgAUIwhiAFKQNofSAFKQNgIg1CAFKtfSEKQgAgDX0hCyABIQ0gBkH//wBqCyIGQf//AU4EQCAMQoCAgICAgMD//wCEIQxCACEBDAELAn4gBkEASgRAIApCAYYgC0I/iIQhASAEQv///////z+DIAatQjCGhCEKIAtCAYYMAQsgBkGPf0wEQEIAIQEMAgsgBUFAayACIARBASAGaxCnAyAFQTBqIA0gFSAGQfAAahCxASAFQSBqIAMgEiAFKQNAIgIgBSkDSCIKEJwBIAUpAzggBSkDKEIBhiAFKQMgIgFCP4iEfSAFKQMwIgQgAUIBhiINVK19IQEgBCANfQshBCAFQRBqIAMgEkIDQgAQnAEgBSADIBJCBUIAEJwBIAogAiACIAMgBCACQgGDIgR8IgNUIAEgAyAEVK18IgEgElYgASASURutfCICVq18IgQgAiACIARCgICAgICAwP//AFQgAyAFKQMQViABIAUpAxgiBFYgASAEURtxrXwiAlatfCIEIAIgBEKAgICAgIDA//8AVCADIAUpAwBWIAEgBSkDCCIDViABIANRG3GtfCIBIAJUrXwgDIQhDAsgACABNwMAIAAgDDcDCCAFQdACaiQAC8ABAgF/An5BfyEDAkAgAEIAUiABQv///////////wCDIgRCgICAgICAwP//AFYgBEKAgICAgIDA//8AURsNACACQv///////////wCDIgVCgICAgICAwP//AFYgBUKAgICAgIDA//8AUnENACAAIAQgBYSEUARAQQAPCyABIAKDQgBZBEAgASACUiABIAJTcQ0BIAAgASAChYRCAFIPCyAAQgBSIAEgAlUgASACURsNACAAIAEgAoWEQgBSIQMLIAMLHgEBfyAAEOwBIgEEQCAAIAEQygsgAEGVlgUQ4gELC58DAQV/QRAhAgJAQRAgACAAQRBNGyIDIANBAWtxRQRAIAMhAAwBCwNAIAIiAEEBdCECIAAgA0kNAAsLQUAgAGsgAU0EQEH8gAtBMDYCAEEADwtBECABQQtqQXhxIAFBC0kbIgMgAGpBDGoQTyICRQRAQQAPCyACQQhrIQECQCAAQQFrIAJxRQRAIAEhAAwBCyACQQRrIgUoAgAiBkF4cSAAIAJqQQFrQQAgAGtxQQhrIgIgAEEAIAIgAWtBD00baiIAIAFrIgJrIQQgBkEDcUUEQCABKAIAIQEgACAENgIEIAAgASACajYCAAwBCyAAIAQgACgCBEEBcXJBAnI2AgQgACAEaiIEIAQoAgRBAXI2AgQgBSACIAUoAgBBAXFyQQJyNgIAIAEgAmoiBCAEKAIEQQFyNgIEIAEgAhCtBQsCQCAAKAIEIgFBA3FFDQAgAUF4cSICIANBEGpNDQAgACADIAFBAXFyQQJyNgIEIAAgA2oiASACIANrIgNBA3I2AgQgACACaiICIAIoAgRBAXI2AgQgASADEK0FCyAAQQhqCxIAIABFBEBBAA8LIAAgARCYBwtZAQN/IAAQLSEDIAAQrwUiAEEAIABBAEobIQRBACEAA0AgASgCDCECIAAgBEYEQCACEBgFIAMgAiAAQQJ0aigCACICIAIQdkEARxCMARogAEEBaiEADAELCwvlHgIPfwV+IwBBkAFrIgUkACAFQQBBkAEQOCIFQX82AkwgBSAANgIsIAVBjAQ2AiAgBSAANgJUIAEhBCACIRBBACEAIwBBsAJrIgYkACAFIgMoAkwaAkACQCADKAIERQRAIAMQvgUaIAMoAgRFDQELIAQtAAAiAUUNAQJAAkACQAJAAkADQAJAAkAgAUH/AXEiARDKAgRAA0AgBCIBQQFqIQQgAS0AARDKAg0ACyADQgAQjwIDQAJ/IAMoAgQiAiADKAJoRwRAIAMgAkEBajYCBCACLQAADAELIAMQVgsQygINAAsgAygCBCEEIAMpA3BCAFkEQCADIARBAWsiBDYCBAsgBCADKAIsa6wgAykDeCAVfHwhFQwBCwJ/AkACQCABQSVGBEAgBC0AASIBQSpGDQEgAUElRw0CCyADQgAQjwICQCAELQAAQSVGBEADQAJ/IAMoAgQiASADKAJoRwRAIAMgAUEBajYCBCABLQAADAELIAMQVgsiARDKAg0ACyAEQQFqIQQMAQsgAygCBCIBIAMoAmhHBEAgAyABQQFqNgIEIAEtAAAhAQwBCyADEFYhAQsgBC0AACABRwRAIAMpA3BCAFkEQCADIAMoAgRBAWs2AgQLIAFBAE4gDnINDQwMCyADKAIEIAMoAixrrCADKQN4IBV8fCEVIAQhAQwDC0EAIQggBEECagwBCwJAIAFBMGsiAkEJSw0AIAQtAAJBJEcNACMAQRBrIgEgEDYCDCABIBAgAkECdGpBBGsgECACQQFLGyIBQQRqNgIIIAEoAgAhCCAEQQNqDAELIBAoAgAhCCAQQQRqIRAgBEEBagshAUEAIQ9BACEHIAEtAAAiBEEwa0EJTQRAA0AgB0EKbCAEakEwayEHIAEtAAEhBCABQQFqIQEgBEEwa0EKSQ0ACwsgBEHtAEcEfyABBUEAIQwgCEEARyEPIAEtAAEhBEEAIQAgAUEBagsiCUEBaiEBQQMhAiAPIQUCQAJAAkACQAJAAkAgBEH/AXFBwQBrDjoEDAQMBAQEDAwMDAMMDAwMDAwEDAwMDAQMDAQMDAwMDAQMBAQEBAQABAUMAQwEBAQMDAQCBAwMBAwCDAsgCUECaiABIAktAAFB6ABGIgIbIQFBfkF/IAIbIQIMBAsgCUECaiABIAktAAFB7ABGIgIbIQFBA0EBIAIbIQIMAwtBASECDAILQQIhAgwBC0EAIQIgCSEBC0EBIAIgAS0AACIFQS9xQQNGIgIbIRECQCAFQSByIAUgAhsiDUHbAEYNAAJAIA1B7gBHBEAgDUHjAEcNAUEBIAcgB0EBTBshBwwCCyAIIBEgFRDMCwwCCyADQgAQjwIDQAJ/IAMoAgQiAiADKAJoRwRAIAMgAkEBajYCBCACLQAADAELIAMQVgsQygINAAsgAygCBCEEIAMpA3BCAFkEQCADIARBAWsiBDYCBAsgBCADKAIsa6wgAykDeCAVfHwhFQsgAyAHrCIUEI8CAkAgAygCBCICIAMoAmhHBEAgAyACQQFqNgIEDAELIAMQVkEASA0GCyADKQNwQgBZBEAgAyADKAIEQQFrNgIEC0EQIQQCQAJAAkACQAJAAkACQAJAAkACQCANQdgAaw4hBgkJAgkJCQkJAQkCBAEBAQkFCQkJCQkDBgkJAgkECQkGAAsgDUHBAGsiAkEGS0EBIAJ0QfEAcUVyDQgLIAZBCGogAyARQQAQ2AsgAykDeEIAIAMoAgQgAygCLGusfVINBQwMCyANQRByQfMARgRAIAZBIGpBf0GBAhA4GiAGQQA6ACAgDUHzAEcNBiAGQQA6AEEgBkEAOgAuIAZBADYBKgwGCyAGQSBqIAEtAAEiBEHeAEYiBUGBAhA4GiAGQQA6ACAgAUECaiABQQFqIAUbIQICfwJAAkAgAUECQQEgBRtqLQAAIgFBLUcEQCABQd0ARg0BIARB3gBHIQogAgwDCyAGIARB3gBHIgo6AE4MAQsgBiAEQd4ARyIKOgB+CyACQQFqCyEBA0ACQCABLQAAIgJBLUcEQCACRQ0PIAJB3QBGDQgMAQtBLSECIAEtAAEiCUUgCUHdAEZyDQAgAUEBaiEFAkAgCSABQQFrLQAAIgRNBEAgCSECDAELA0AgBEEBaiIEIAZBIGpqIAo6AAAgBCAFLQAAIgJJDQALCyAFIQELIAIgBmogCjoAISABQQFqIQEMAAsAC0EIIQQMAgtBCiEEDAELQQAhBAtCACESQQAhC0EAIQpBACEJIwBBEGsiByQAAkAgBEEBRyAEQSRNcUUEQEH8gAtBHDYCAAwBCwNAAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICEMoCDQALAkACQCACQStrDgMAAQABC0F/QQAgAkEtRhshCSADKAIEIgIgAygCaEcEQCADIAJBAWo2AgQgAi0AACECDAELIAMQViECCwJAAkACQAJAIARBAEcgBEEQR3EgAkEwR3JFBEACfyADKAIEIgIgAygCaEcEQCADIAJBAWo2AgQgAi0AAAwBCyADEFYLIgJBX3FB2ABGBEBBECEEAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICQZGNCWotAABBEEkNAyADKQNwQgBZBEAgAyADKAIEQQFrNgIECyADQgAQjwIMBgsgBA0BQQghBAwCCyAEQQogBBsiBCACQZGNCWotAABLDQAgAykDcEIAWQRAIAMgAygCBEEBazYCBAsgA0IAEI8CQfyAC0EcNgIADAQLIARBCkcNACACQTBrIgtBCU0EQEEAIQIDQCACQQpsIAtqIgJBmbPmzAFJAn8gAygCBCIFIAMoAmhHBEAgAyAFQQFqNgIEIAUtAAAMAQsgAxBWC0EwayILQQlNcQ0ACyACrSESCyALQQlLDQIgEkIKfiEUIAutIRMDQAJAAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICQTBrIgVBCU0gEyAUfCISQpqz5syZs+bMGVRxRQRAIAVBCU0NAQwFCyASQgp+IhQgBa0iE0J/hVgNAQsLQQohBAwBCyAEIARBAWtxBEAgAkGRjQlqLQAAIgogBEkEQANAIAogBCALbGoiC0HH4/E4SQJ/IAMoAgQiAiADKAJoRwRAIAMgAkEBajYCBCACLQAADAELIAMQVgsiAkGRjQlqLQAAIgogBElxDQALIAutIRILIAQgCk0NASAErSEWA0AgEiAWfiIUIAqtQv8BgyITQn+FVg0CIBMgFHwhEiAEAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICQZGNCWotAAAiCk0NAiAHIBZCACASQgAQnAEgBykDCFANAAsMAQsgBEEXbEEFdkEHcUGRjwlqLAAAIQUgAkGRjQlqLQAAIgsgBEkEQANAIAsgCiAFdCICciEKIAJBgICAwABJAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICQZGNCWotAAAiCyAESXENAAsgCq0hEgsgBCALTQ0AQn8gBa0iFIgiEyASVA0AA0AgC61C/wGDIBIgFIaEIRIgBAJ/IAMoAgQiAiADKAJoRwRAIAMgAkEBajYCBCACLQAADAELIAMQVgsiAkGRjQlqLQAAIgtNDQEgEiATWA0ACwsgBCACQZGNCWotAABNDQADQCAEAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWC0GRjQlqLQAASw0AC0H8gAtBxAA2AgBBACEJQn8hEgsgAykDcEIAWQRAIAMgAygCBEEBazYCBAsgCUEBckUgEkJ/UXEEQEH8gAtBxAA2AgBCfiESDAELIBIgCawiE4UgE30hEgsgB0EQaiQAIAMpA3hCACADKAIEIAMoAixrrH1RDQcgCEUgDUHwAEdyRQRAIAggEj4CAAwDCyAIIBEgEhDMCwwCCyAIRQ0BIAYpAxAhFCAGKQMIIRMCQAJAAkAgEQ4DAAECBAsgCCATIBQQqwU4AgAMAwsgCCATIBQQlwc5AwAMAgsgCCATNwMAIAggFDcDCAwBC0EfIAdBAWogDUHjAEciCRshAgJAIBFBAUYEQCAIIQcgDwRAIAJBAnQQTyIHRQ0HCyAGQgA3AqgCQQAhBANAIAchAAJAA0ACfyADKAIEIgUgAygCaEcEQCADIAVBAWo2AgQgBS0AAAwBCyADEFYLIgUgBmotACFFDQEgBiAFOgAbIAZBHGogBkEbakEBIAZBqAJqEK4FIgVBfkYNACAFQX9GBEBBACEMDAwLIAAEQCAAIARBAnRqIAYoAhw2AgAgBEEBaiEECyAPRSACIARHcg0AC0EBIQVBACEMIAAgAkEBdEEBciICQQJ0EGoiBw0BDAsLC0EAIQwgACECIAZBqAJqBH8gBigCqAIFQQALDQgMAQsgDwRAQQAhBCACEE8iB0UNBgNAIAchAANAAn8gAygCBCIFIAMoAmhHBEAgAyAFQQFqNgIEIAUtAAAMAQsgAxBWCyIFIAZqLQAhRQRAQQAhAiAAIQwMBAsgACAEaiAFOgAAIARBAWoiBCACRw0AC0EBIQUgACACQQF0QQFyIgIQaiIHDQALIAAhDEEAIQAMCQtBACEEIAgEQANAAn8gAygCBCIAIAMoAmhHBEAgAyAAQQFqNgIEIAAtAAAMAQsgAxBWCyIAIAZqLQAhBEAgBCAIaiAAOgAAIARBAWohBAwBBUEAIQIgCCIAIQwMAwsACwALA0ACfyADKAIEIgAgAygCaEcEQCADIABBAWo2AgQgAC0AAAwBCyADEFYLIAZqLQAhDQALQQAhAEEAIQxBACECCyADKAIEIQcgAykDcEIAWQRAIAMgB0EBayIHNgIECyADKQN4IAcgAygCLGusfCITUCAJIBMgFFFyRXINAiAPBEAgCCAANgIACwJAIA1B4wBGDQAgAgRAIAIgBEECdGpBADYCAAsgDEUEQEEAIQwMAQsgBCAMakEAOgAACyACIQALIAMoAgQgAygCLGusIAMpA3ggFXx8IRUgDiAIQQBHaiEOCyABQQFqIQQgAS0AASIBDQEMCAsLIAIhAAwBC0EBIQVBACEMQQAhAAwCCyAPIQUMAgsgDyEFCyAOQX8gDhshDgsgBUUNASAMEBggABAYDAELQX8hDgsgBkGwAmokACADQZABaiQAIA4LQwACQCAARQ0AAkACQAJAAkAgAUECag4GAAECAgQDBAsgACACPAAADwsgACACPQEADwsgACACPgIADwsgACACNwMACwsPACAAIAEgAkEAQQAQmQcLFQEBfxDtAyEAQQ9B0N0KKAIAIAAbC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRBAALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC28BBX8gACgCACIDLAAAQTBrIgFBCUsEQEEADwsDQEF/IQQgAkHMmbPmAE0EQEF/IAEgAkEKbCIFaiABIAVB/////wdzSxshBAsgACADQQFqIgU2AgAgAywAASAEIQIgBSEDQTBrIgFBCkkNAAsgAgv1EgISfwJ+IwBBQGoiCCQAIAggATYCPCAIQSdqIRYgCEEoaiERAkACQAJAAkADQEEAIQcDQCABIQ0gByAOQf////8Hc0oNAiAHIA5qIQ4CQAJAAkACQCABIgctAAAiCwRAA0ACQAJAIAtB/wFxIgFFBEAgByEBDAELIAFBJUcNASAHIQsDQCALLQABQSVHBEAgCyEBDAILIAdBAWohByALLQACIAtBAmoiASELQSVGDQALCyAHIA1rIgcgDkH/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KQOIAyAWIAJBAE4iARshFiAEKQOAAyAXIAEbIRcgCSAGIAhHIAJBAEhycSAVIBhCAEIAEKgDQQBHcUUgFCABIA1qIg1B7gBqTnENAEH8gAtBxAA2AgALIARB8AJqIBcgFiANENoLIAQpA/gCIRUgBCkD8AILIRYgDiAVNwMoIA4gFjcDICAEQZDGAGokACAOKQMoIRUgDikDICEWDAELQgAhFQsgACAWNwMAIAAgFTcDCCAOQTBqJAALwwYCBH8DfiMAQYABayIFJAACQAJAAkAgAyAEQgBCABCoA0UNAAJ/IARC////////P4MhCgJ/IARCMIinQf//AXEiB0H//wFHBEBBBCAHDQEaQQJBAyADIAqEUBsMAgsgAyAKhFALC0UNACACQjCIpyIIQf//AXEiBkH//wFHDQELIAVBEGogASACIAMgBBBpIAUgBSkDECICIAUpAxgiASACIAEQxQsgBSkDCCECIAUpAwAhBAwBCyABIAJC////////////AIMiCiADIARC////////////AIMiCRCoA0EATARAIAEgCiADIAkQqAMEQCABIQQMAgsgBUHwAGogASACQgBCABBpIAUpA3ghAiAFKQNwIQQMAQsgBEIwiKdB//8BcSEHIAYEfiABBSAFQeAAaiABIApCAEKAgICAgIDAu8AAEGkgBSkDaCIKQjCIp0H4AGshBiAFKQNgCyEEIAdFBEAgBUHQAGogAyAJQgBCgICAgICAwLvAABBpIAUpA1giCUIwiKdB+ABrIQcgBSkDUCEDCyAJQv///////z+DQoCAgICAgMAAhCELIApC////////P4NCgICAgICAwACEIQogBiAHSgRAA0ACfiAKIAt9IAMgBFatfSIJQgBZBEAgCSAEIAN9IgSEUARAIAVBIGogASACQgBCABBpIAUpAyghAiAFKQMgIQQMBQsgCUIBhiAEQj+IhAwBCyAKQgGGIARCP4iECyEKIARCAYYhBCAGQQFrIgYgB0oNAAsgByEGCwJAIAogC30gAyAEVq19IglCAFMEQCAKIQkMAQsgCSAEIAN9IgSEQgBSDQAgBUEwaiABIAJCAEIAEGkgBSkDOCECIAUpAzAhBAwBCyAJQv///////z9YBEADQCAEQj+IIAZBAWshBiAEQgGGIQQgCUIBhoQiCUKAgICAgIDAAFQNAAsLIAhB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QfWrBCADQTBqEDMLIAAgAhAdIQIMAAsACyABQQFqIQdBASEEA0AgACgCECICKAK0ASAETgRAIAIoArgBIARBAnRqKAIAIQUgAQRAIAkgBSgCECICKwMooCEIIAogAisDIKAhCyAJIAIrAxigIQwgCiACKwMQoCENQezaCi0AAEECTwRAIAEQsAIgBRAhIQIgAyAIOQMgIAMgCzkDGCADIAw5AxAgAyANOQMIIAMgAjYCACAGQeOrBCADEDMgBSgCECECCyACIAg5AyggAiALOQMgIAIgDDkDGCACIA05AxALIAUgBxDzCyAEQQFqIQQMAQsLIANB4ABqJAALyhoDD38LfAF+IwBBwARrIgIkACAAKAJIIQpB7NoKLQAAQQJPBEAgARCwAiACIAAQITYCsANBiPYIKAIAQfDwAyACQbADahAgGgsgAUEBaiEJQQEhBANAIAAoAhAiAygCtAEgBEgEQAJAAkAgABA8IAdrIhBBACAAKAIQIgMoArQBayILRw0AIAMoAgwNACADQgA3AxAgA0KAgICAgICAmcAANwMoIANCgICAgICAgJnAADcDICADQgA3AxgMAQsCQAJ/AkAgAEEEQQQgAkGgBGoQ+QNBAk0EQCACQQM2ArAEDAELQQAgAigCsARBBEcNARpBACEJIAItALwEQQJxRQ0CIApBAEHwFkEAECIiCSAKQQFB8BZBABAiIgZyDQIgAiAAECE2AqADQcifAyACQaADahAqC0EACyEGQQAhCQsgAkHoA2pBAEE4EDgaIAJCADcD4AMgAkIANwPYAyACQgA3A9ADIAJCADcDyAMgAkIANwPAAyACQgA3A7gDQQEhBwNAAkAgACgCECIDKAK0ASAHSARAIBBBAEwNASAAEBwhBwNAIAdFDQIgBygCECIDKAKAAUUEQCADIAA2AoABIAJCADcDiAQgAkIANwOABCADKwNgIRIgAysDWCERIAIgAysDUDkDmAQgAiARIBKgOQOQBCACQegDakEgECYhAyACKALoAyADQQV0aiIDIAIpA4AENwMAIAMgAikDmAQ3AxggAyACKQOQBDcDECADIAIpA4gENwMIIAYEQCACIAcgBkEAQQAQYjYCzAMgAkG4A2pBBBAmIQMgAigCuAMgA0ECdGogAigCzAM2AgALIAIgBzYC5AMgAkHQA2pBBBAmIQMgAigC0AMg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EBwhAwNAIAMEQCADKAIQQQA2ArgBIAAgAxAdIQMMAQsLQezaCi0AAEECTwRAIAEoAhAhAyAFIAAQITYC5AEgBSADNgLgAUGI9ggoAgBBjfkDIAVB4AFqECAaCyABIAEoAhBBAWo2AhAgBUG88AkoAgA2AtwBQdKnASAFQdwBakEAEOMBIgpB4iVBmAJBARA2GkE4EFIhAyAKKAIQIAM2AowBIAAQOSEDIAooAhAgAygCEC8BsAE7AbABIAAgCkHa3AAQuQcgACAKQZjbABC5ByAAIApBsNgBELkHIAVBqAJqIQggBUGgAmohDCAFQZgCaiELQQEhDwNAIAAoAhAiAygCtAEgD04EQCADKAK4ASAPQQJ0aigCACIEEJQEIAogBBAhELgHIgYoAhAiAyAJNgKIASADIAQ2AugBAkACQCABKAIEIgdFBEBE////////738hG0T////////v/yEaDAELRP///////+9/IRtE////////7/8hGiAEIAcQRSIDLQAARQ0AIAEoAgAgBEcEQCADIAQoAkQgBxBFEE1FDQELIAVBADoA+AEgBSALNgLEASAFIAw2AsgBIAUgCDYCzAEgBSAFQfgBajYC0AEgBSAFQZACajYCwAEgA0H4vgEgBUHAAWoQUUEETgRAIAUrA6gCIRogBSsDoAIhHSAFKwOYAiEbIAUrA5ACIRxBgNsKKwMAIh5EAAAAAAAAAABkBEAgGyAeoyEbIBwgHqMhHCAdIB6jIR0gGiAeoyEaCyAGKAIQQQNBAkEBIAUtAPgBIgNBP0YbIANBIUYbOgCHAQwCCyAEECEhByAFIAM2ArQBIAUgBzYCsAFBh+sDIAVBsAFqECoLRP///////+//IR1E////////738hHAsgCUEBaiEJIAQQHCEDA0AgAwRAIAMoAhAgBjYCuAEgBCADEB0hAwwBCwsgBigCECIDLQCHAQRAIAMoApQBIgMgGiAboEQAAAAAAADgP6I5AwggAyAdIBygRAAAAAAAAOA/ojkDAAsgD0EBaiEPDAELCyAAEBwhAwJ/AkADQCADBEACQCADKAIQIgQoArgBDQACQCAEKALoASIGRQ0AIAYgACgCECgCjAEoAjBGDQAgAxAhIQEgABAhIQAgBSADKAIQKALoARAhNgKoASAFIAA2AqQBIAUgATYCoAFBiv0EIAVBoAFqEDcM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QRhqCyILKwMIIQggCysDACEHAn8gASgCECIAKAIEIAFGBEAgACgCAAwBCyABQRhqCyIAKwMIIQkgACsDACEKIAJBfyAHIAShIgcgBSADoaIgCCADoSIFIAYgBKGioSIGRAAAAAAAAAAAZCAGRAAAAAAAAAAAYxsiADYCACACQX8gByAJIAOhoiAFIAogBKGioSIDRAAAAAAAAAAAZCADRAAAAAAAAAAAYxsiATYCBCACIAAgAWw2AggLTQECfAJ/QQEgACgCACIAKwMAIgIgASgCACIBKwMAIgNkDQAaQX8gAiADYw0AGkEBIAArAwgiAiABKwMIIgNkDQAaQX9BACACIANjGwsLzg8DEH8KfAF+IwBBsAFrIgIkACABQQAgAUEAShshDyABQSgQGiENA0AgAyAPRkUEQCAAIANBAnRqKAIAKAIEIApqIQogA0EBaiEDDAELCyAKQRgQGiIOQRhrIQYDQCAIIA9HBEAgDSAIQShsaiIEIA4gB0EYbGo2AgAgACAIQQJ0aigCACILKAIEIQxBACEDRP///////+9/IRJE////////7/8hE0T////////v/yEVRP///////+9/IRQDQCADIAxGBEAgBCATOQMgIAQgFTkDGCAEIBI5AxAgBCAUOQMIIAQgBiAHQRhsajYCBCAIQQFqIQgMAwUgCygCACADQQR0aiIFKwMAIRYgBSsDCCEXIA4gB0EYbGoiBUEANgIUIAUgBDYCECAFIBc5AwggBSAWOQMAIANBAWohAyAHQQFqIQcgEyAXECMhEyAVIBYQIyEVIBIgFxApIRIgFCAWECkhFAwBCwALAAsLIAJCADcDiAEgAkIANwOAASACQgA3A3hBACEDIApBBBAaIQwCQANAIAMgCkYEQAJAIAwgCkEEQeADELUBIAJBjAFqIRBBACELA0AgCiALRg0BIAIgDCALQQJ0aiIRKAIAIgM2AnQgAgJ/IAMoAhAiBCgCACADRgRAIAQoAgQMAQsgA0EYawsiBTYCcEEAIQgDQAJAAkAgCEECRwRAAkAgAkH0AGogAkHwAGoQzQxBAWoOAwADAgMLIAVBGGohB0EAIQMDQAJAIAIoAoABIANLBEAgAiACKQOAATcDWCACIAIpA3g3A1AgAigCeCACQdAAaiADEBlBAnRqKAIAIgYgBSACQZQBaiIJEMwMIAIoApwB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dGohBAJAIAZBAkgNACAGQQJrQQF2IgkgBCAFayIAQQJ1SA0AIAUgAEEBdSIBQQFyIgJBAnRqIQAgBiABQQJqIgFKBEAgASACIAAoAgAgACgCBCADKAIMEQAAIgEbIQIgAEEEaiAAIAEbIQALIAAoAgAgBCgCACADKAIMEQAADQAgBCgCACEBA0ACQCAEIAAiBCgCADYCACACIAlKDQAgBSACQQF0IgdBAXIiAkECdGohACAGIAdBAmoiB0oEQCAHIAIgACgCACAAKAIEIAMoAgwRAAAiBxshAiAAQQRqIAAgBxshAAsgACgCACABIAMoAgwRAABFDQELCyAEIAE2AgALIAhBAWshCAwACwALIANBEGokAAtGAgF8An8gACgCBCEDIAAoAgAhAAN8IAAgA0YEfCABBSAAKAIAIgIrAwggAisDGKEgAisDEKIgAaAhASAAQQRqIQAMAQsLC2wCAX8CfCMAQRBrIgIkACACIAE2AgwgASAANgIgIAAgAkEMahDAASAAIAIoAgwiASsDECIDIAArAxigIgQ5AxggACADIAErAwggASsDGKGiIAArAyCgIgM5AyAgACADIASjOQMQIAJBEGokAAsnACAAIAAoAhhFIAAoAhAgAXJyIgE2AhAgACgCFCABcQRAEJEBAAsLMQEDfyAAKAIEIgQgAUEEaiICayEDIAIgBEcEQCABIAIgAxC2ARoLIAAgASADajYCBAt+AQN/IAAoAgAiAUE0aiABKAI4IQMgASgCNCEBA0ACQCABIANGDQAgASgCACAARg0AIAFBBGohAQwBCwsgARC0DSAAKAIEIgFBKGogASgCLCEDIAEoAighAQNAAkAgASADRg0AIAEoAgAgAEYNACABQQRqIQEMAQsLIAEQtA0L6gEBCH8gAEHTrAMQ0QIhAiABKAIAIQYjAEEQayIDJAAgA0EIaiIEIAIQqQUaAkAgBC0AAEUNACACIAIoAgBBDGsoAgBqIgUoAgQaIANBBGoiBCAFEFMgBBC6CyEFIAQQUCADIAIQuQshByACIAIoAgBBDGsoAgBqIggQuAshCSADIAUgBygCACAIIAkgBiAFKAIAKAIQEQgANgIEIAQQpwVFDQAgAiACKAIAQQxrKAIAakEFEKoFCyADQQhqEKgFIANBEGokACACQdjgARDRAiABKAIgKwMQIAErAxigEJEH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EiACQQJ0akF/NgIAIAJBAWohAgwBCwtBhscBQZa3AUGLBkGBDhAAAAtBhscBQZa3AUGkBkGBDhAAAAtBhscBQZa3AUG4BkGBDhAAAAtBh9ABQZa3AUHQBUGBDhAAAAsgFEEQaiQAIA8L2AYCCn8BfCMAQRBrIgokACAAKAIgRQRAAkACQCAAKAIQQQFrIgQOBAEAAAEAC0HU0AFBlrcBQZAFQcg1EAAACyACKAIAIQUgACgCACEDIAAoAhghBiAAKAIUIQcCQAJAAkACQCAEDgQAAgIBAgsgACgCHCEJIAEEQCAFRQRAIANBCBA/IQULQQAhBCADQQAgA0EAShshAwNAIAMgBEYNBCAFIARBA3RqIgtCADcDACAHIARBAnRqKAIAIgAgByAEQQFqIgRBAnRqKAIAIgggACAIShshCEQAAAAAAAAAACENA0AgACAIRgRADAIFIAsgCSAAQQN0aisDACABIAYgAEECdGooAgBBA3RqKwMAoiANoCINOQMAIABBAWohAAwBCwALAAsACyAFRQRAIANBCBA/IQULQQAhASADQQAgA0EAShshBANAIAEgBEYNAyAFIAFBA3RqIgNCADcDACAHIAFBAnRqKAIAIgAgByABQQFqIgFBAnRqKAIAIgYgACAGShshBkQAAAAAAAAAACENA0AgACAGRgRADAIFIAMgCSAAQQN0aisDACANoCINOQMAIABBAWohAAwBCwALAAsACyAAKAIcIQkgAQRAIAVFBEAgA0EIED8hBQtBACEEIANBACADQQBKGyEDA0AgAyAERg0DIAUgBEEDdGoiC0IANwMAIAcgBEECdGooAgAiACAHIARBAWoiBEECdGooAgAiCCAAIAhKGyEIRAAAAAAAAAAAIQ0DQCAAIAhGBEAMAgUgCyAJIABBAnQiDGooAgC3IAEgBiAMaigCAEEDdGorAwCiIA2gIg05AwAgAEEBaiEADAELAAsACwALIAVFBEAgA0EIED8hBQtBACEBIANBACADQQBKGyEEA0AgASAERg0CIAUgAUEDdGoiA0IANwMAIAcgAUECdGooAgAiACAHIAFBAWoiAUECdGooAgAiBiAAIAZKGyEGRAAAAAAAAAAAIQ0DQCAAIAZGBEAMAgUgAyANIAkgAEECdGooAgC3oCINOQMAIABBAWohAAwBCwALAAsACyAKQcMFNgIE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AxggBiAAKALsAUHIAGxqIgEgASsDECAAKwN4ECM5AxALC4kDAgZ/BHwgABBhKAIQKALEASEFIAAQYSAARgR8RAAAAAAAACBABSAAQczbCigCAEEIQQAQYrcLIQkgACgCECIBKwOAASEHIAErA3ghCEEBIQIDQCACIAEoArQBSkUEQCABKAK4ASACQQJ0aigCACIBEO0NIQYgASgCECIEKALsASAAKAIQIgEoAuwBRgRAIAggCSAEKwN4oCIKIAggCmQbIQgLIAQoAugBIAEoAugBRgRAIAcgCSAEKwOAAaAiCiAHIApkGyEHCyADIAZyIQMgAkEBaiECDAELCyAAEGEhAiAAKAIQIQECQCAAIAJGDQAgASgCDEUNACAAEDlBASEDIAAoAhAhASgCEC0AdEEBcQ0AIAcgASsDWKAhByAIIAErAzigIQgLIAEgBzkDgAEgASAIOQN4IAAQYSAARwRAIAUgACgCECIAKALoAUHIAGxqIgEgASsDGCIJIAcgByAJYxs5AxggBSAAKALsAUHIAGxqIgAgACsDECIHIAggByAIZBs5AxALIAMLcAECf0EBIQQDQCAEIAAoAhAiAygCtAFKRQRAIAMoArgBIARBAnRqKAIAIAEgAhDuDSAEQQFqIQQMAQsLIAMgASADKwMQojkDECADIAIgAysDGKI5AxggAyABIAMrAyCiOQMgIAMgAiADKwMoojkDKAvlBAIIfwR8QQEhAgNAIAIgACgCECIDKAK0AUpFBEAgAygCuAEgAkECdGooAgAgARDvDSACQQFqIQIMAQsLIAAQYSECIAAoAhAhAwJAIAAgAkYEQCADKALsASEFRAAAwP///9/BIQpEAADA////30EhCyADKALoASIIIQQDQCAEIAVKBEAgAygCtAEiAEEAIABBAEobQQFqIQBBASECA0AgACACRg0EIAogAygCuAEgAkECdGooAgAoAhAiBCsDIEQAAAAAAAAgQKAiDCAKIAxkGyEKIAsgBCsDEEQAAAAAAAAgwKAiDCALIAxjGyELIAJBAWohAgwACwAFAkAgAygCxAEgBEHIAGxqIgAoAgAiBkUNAEEBIQIgACgCBCIHKAIAIgBFDQADQCAAKAIQIgAtAKwBIglFIAIgBk5yRQRAIAcgAkECdGooAgAhACACQQFqIQIMAQsLIAkNACAGQQJrIQIgACsDECAAKwNYoSEMIAcgBkECdGpBBGshAANAIAAoAgAoAhAiAC0ArAEEQCAHIAJBAnRqIQAgAkEBayECDAELCyAKIAArAxAgACsDYKAiDSAKIA1kGyEKIAsgDCALIAxjGyELCyAEQQFqIQQMAQsACwALIAMoAugBIQggAygC7AEhBSADKAKEAigCECgC9AG3IQogAygCgAIoAhAoAvQBtyELCyABKAIQKALEASIAIAVByABsaigCBCgCACgCECsDGCEMIAAgCEHIAGxqKAIEKAIAKAIQKwMYIQ0gAyAKOQMgIAMgCzkDECADIA0gAysDgAGgOQMoIAMgDCADKwN4oTkDGAuiAQICfAF/AkACf0H/////ByAAQdQgECciA0UNABogABA8IQAgAxCuAiEBIABBAEgNAUEAIAFEAAAAAAAAAABjDQAaIAC4IQIgAUQAAAAAAADwP2QEQEH/////B0QAAMD////fQSABoyACYw0BGgsgASACoiIBmUQAAAAAAADgQWMEQCABqg8LQYCAgIB4Cw8LQc+YA0GH/ABBzQBBztkAEAAAC4gCAgd/AXwjAEEQayIEJAAgAEHM2wooAgBBCEEAEGIgABDtBbchCCAAKAIQIgEoAugBIQMgASgChAIhBSABKAKAAiEGA0AgAyABKALsAUpFBEACQCADQcgAbCIHIAEoAsQBaiICKAIARQ0AIAIoAgQoAgAiAkUEQCAAECEhASAEIAM2AgQgBCABNgIAQdu0BCAEEDcMAQsgBiACIAIoAhArA1ggCKAgASsDYKBBABCfARogACgCECIBKALEASAHaiICKAIEIAIoAgBBAnRqQQRrKAIAIgIgBSACKAIQKwNgIAigIAErA0CgQQAQnwEaCyADQQFqIQMgACgCECEBDAELCyAEQRBqJAAL2wICCn8BfCAAQczbCigCAEEIQQAQYiEHQQEhAQNAIAAoAhAiBSgCtAEiBCABSARAIAe3IQtBASEBA0AgASAESkUEQCABQQJ0IQkgAUEBaiIHIQEDQCAFKAK4ASICIAlqKAIAIQMgASAESkUEQCACIAFBAnRqKAIAIgYgAyADKAIQKALoASAGKAIQKALoAUoiAhsiCCgCECIKKALsASADIAYgAhsiAygCECIGKALoASICTgRAIAggAyACQcgAbCICIAooAsQBaigCBCgCACgCECgC+AEg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P2UNACAAEPENIAAoAhAiASgCgAIgASgChAIgEiARIAEoAnRBAXEbIhFEAAAAAOD/70AgEUQAAAAA4P/vQGMbQegHEJ8BGgsCQCAAQQIgABDwDRDMBEUNACAAKAIQIgIoAugBIQUDQAJAAkAgAigC7AEiCiAFTgRAQQAhCCACKALEASAFQcgAbGoiBygCACIJQQAgCUEAShshA0EAIQEDQCABIANGDQNBACEEAkAgBygCBCABQQJ0aigCACIIKAIQIgsoApACIg1FDQADQCANIARBAnRqKAIAIgZFDQEgBkFQQQAgBigCAEEDcSIMQQJHG2ooAigoAhAoAvQBIAVKDQQgBEEBaiEEIAZBMEEAIAxBA0cbaigCKCgCECgC9AEgBUwNAAsMAwtBACEEAkAgCygCiAIiC0UNAANAIAsgBEECdGooAgAiBkUNASAGQTBBACAGKAIAQQNxIg1BA0cbaigCKCgCECgC9AEgBUoNBCAEQQFqIQQgBSAGQVBBACANQQJHG2ooAigoAhAoAvQBTg0ACwwDCyABQQFqIQEMAAsACyAAQQIgABDwDRDMBEUNA0GImwNBprsBQY0BQbHiABAAAAsgASEDCwJAIAhFIAMgCUhyRQRAIAdBzABBvH8gBSAKSBtqKAIAKAIAIgJFDQEgBygCBCgCACEDIAAQugIiASgCEEECOgCsASABIANEAAAAAAAAAABBABCfARogASACRAAAAAAAAAAAQQAQnwEaIAEoAhAgAygCECgC9AEiASACKAIQKAL0ASICIAEgAkgbNgL0ASAAKAIQIQILIAVBAWohBQwBCwtB0toAQaa7AUH2AEGO+gAQAAALIAAoAhAiASgC7AEhBSABKALoASECIAEoAsQBIQQDQCACIAVMBEBBACEBIAQgAkHIAGxqIgcoAgAiA0EAIANBAEobIQYDQCABIAZHBEAgBygCBCABQQJ0aigCACgCECIDKAL0ASEIIAMgAjYC9AEgAyAItzkDECABQQFqIQEMAQsLIAJBAWohAgwBCwsgACAAEO8NAkAgACgCECIBKALsAUEATA0AIAEoAggiAigCVCIFRQ0AIAErACgiESABKwAYoSIUIAErACAiEiABKwAQoSIVIAEoAnRBAXEiAxshEyAVIBQgAxshFAJAAnwCQAJAAkACQAJAIAVBAWsOBQQABwEDBwsgAisD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IAJB7BxqENAEIQcgAigC7BwhAwwBCyACQegMaiACQewcahDPBCEHIBogAigC7BwiA0EFSXINACAHIAcpAwA3AxAgByAHKQMINwMYIAcgByADQQR0akEQayIDKQMANwMgIAcgAykDCDcDKCADKQMAIWUgByADKQMINwM4IAcgZTcDMCACQQQ2AuwcQQQMAQsgA0UNASADCyEGQQAhAwwBCyAHEBhBACEDA0AgAigCmB0gA00EQCACQZAdaiIDQSAQMSADEDRBACEDA0AgAigC+B0gA00EQCACQfAdaiIDQRAQMSADEDRBACEDA0AgAigC0B0gA00EQCACQcgdaiIDQRAQMSADEDQMCwUgAkHwCWogAkHQHWopAwA3AwAgAiACKQPIHTcD6AkgAkHoCWogAxAZIQUCQAJAIAIoAtgdIgQOAgETAAsgAkHgCWogAigCyB0gBUEEdGoiBSkDCDcDACACIAUpAwA3A9gJIAJB2AlqIAQRAQALIANBAWohAwwBCwALAAUgAkHQCWogAkH4HWopAwA3AwAgAiACKQPwHTcDyAkgAkHICWogAxAZIQUCQAJAIAIoAoAeIgQOAgERAAsgAkHACWogAigC8B0gBUEEdGoiBSkDCDcDACACIAUpAwA3A7gJIAJBuAlqIAQRAQALIANBAWohAwwBCwALAAUgAkGwCWogAkGYHWopAwA3AwAgAiACKQOQHTcDqAkgAkGoCWogAxAZIQUCQAJAIAIoAqAdIgQOAgEPAAsgAkGQCWogAigCkB0gBUEFdGoiBSkDCDcDACACQZgJaiAFKQMQNwMAIAJBoAlqIAUpAxg3AwAgAiAFKQMANwOICSACQYgJaiAEEQEACyADQQFqIQMMAQsACwALA0AgAyAGSQRAIAwgByADQQR0aiIGKQMANwMAIAwgBikDCDcDCCACQfAdakEQECYhBiACKALwHSAGQQR0aiIGIAwpAwA3AwAgBiAMKQMINwMIIANBAWohAyACKALsHCEGDAELCyAHEBggCiEDA0AgCCgCACgCyAEoAgAhBiADBEAgA0EBayEDIAZBUEEAIAYoAgBBA3FBAkcbaigCKEEQaiEIDAELCyACKAL4HSIHBEAgAkHoCmogAkH4HWoiAykDADcDACACIAIpA/AdNwPgCiAMIAIoAvAdIAJB4ApqIAdBAWsQGUEEdGoiBykD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Dg0FIAIoAqwEIQggAigCqAQhCwJAAkACQCAJQQFqDgMAAQIDCyADKAIAIAIgAykCCDcDYCACIAMpAgA3A1ggAkHYAGogABAZQQJ0aigCACADKAIAIAIgAykCCDcDUCACIAMpAgA3A0ggAkHIAGogBRAZQQJ0aigCACAEQQAgBiABELgCIAMoAgAgAkFAayADKQIINwMAIAIgAykCADcDOCACQThqIAAQGUECdGooAgAgAygCACACIAMpAgg3AzAgAiADKQIANwMoIAJBKGogBRAZQQJ0aigCACAHQQEgCyABELgCIAhBAUcNAiADKAIAIAIgAykCCDcDICACIAMpAgA3AxggAkEYaiAFEBlBAnRqKAIAIAMoAgAgAiADKQIINwMQIAIgAykCADcDCCACQQhqIAAQGUECdGooAgAgByABEJcODAILAkACQAJAIAhBAWoOAwABAgQLIAMoAgAgAiADKQIINwOgASACIAMpAgA3A5gBIAJBmAFqIAAQGUECdGooAgAgAygCACACIAMpAgg3A5ABIAIgAykCADcDiAEgAkGIAWogBRAZQQJ0aigCACAEQQAgBiABELgCIAMoAgAgAiADKQIINwOAASACIAMpAgA3A3ggAkH4AGogABAZQQJ0aigCACADKAIAIAIgAykCCDcDcCACIAMpAgA3A2ggAkHoAGogBRAZQQJ0aigCACAHQQEgCyABELgCDAMLIAMoAgAgAiADKQIINwPgASACIAMpAgA3A9gBIAJB2AFqIAUQGUECdGooAgAgAygCACACIAMpAgg3A9ABIAIgAykCADcDyAEgAkHIAWogABAZQQJ0aigCAEEAIAQgBiABELgCIAMoAgAgAiADKQIINwPAASACIAMpAgA3A7gBIAJBuAFqIAUQGUECdGooAgAgAygCACACIAMpAgg3A7ABIAIgAykCADcDqAEgAkGoAWogABAZQQJ0aigCAEEBIAcgCyABELgCDAILIAMoAgAgAiADKQIINwOgAiACIAMpAgA3A5gCIAJBmAJqIAUQGUECdGooAgAgAygCACACIAMpAgg3A5ACIAIgAykCADcDiAIgAkGIAmogABAZQQJ0aigCAEEAIAQgBiABELgCIAMoAgAgAiADKQIINwOAAiACIAMpAgA3A/gBIAJB+AFqIAUQGUECdGooAgAgAygCACACIAMpAgg3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QbgCakEEECYhCiAEKAK4AiAKQQJ0aiAEKALMAjYCACACKAIAIAE2AhggCSACQQggCSgCABEDACECDAELCyAIIARB0AJqQYAEIAgoAgARAwAhAgNAAkAgASsDQCEbIAJFDQAgAisDECAbY0UNACAEIAIoAgA2AswCIARBuAJqQQQQJiEKIAQoArgCIApBAnRqIAQoAswCNgIAIAIoAgAgATYCGCAIIAJBCCAIKAIAEQMAIQIMAQsLIAQgGzkD2AIgCSAEQdACakGABCAJKAIAEQMAIQIDQAJAIAErAzghGyACRQ0AIAIrAwggG2NFDQAgBCACKAIANgLMAiAEQbgCakEEECYhCiAEKAK4AiAKQQJ0aiAEKALMAjYCACACKAIAIAE2AhQgCSACQQggCSgCABEDACECDAELCyAEIBs5A9ACIAQgASsDMDkD2AIgCCAEQdACakGABCAIKAIAEQMAIQIDQAJAIAJFDQAgAisDECABKwNAY0UNACAEIAIoAgA2AswCIARBuAJqQQQQJiEKIAQoArgCIApBAnRqIAQoAswCNgIAIAIoAgAgATYCFCAIIAJBCCAIKAIAEQMAIQIMAQsLIARBuAJqIAFBJGogAUEgakEEEMcBIAEoAiAiASAMIAEgDEsbIQwgBkEBaiEGDAELCwNAIBAgEUYEQCAAKAIQIAAoAgAiAUEobGoiAyABNgIgIAMgAUEBajYCSEEAIQMgACgCAEEGbCAMQQF0akEEEBohAiAAIAAoAgBBA2wgDGpBGBAaNgIUIAAoAgAiBkEAIAZBAEobIQEDQCABIANGBEAgBkECaiEDA0AgASADSARAIAAoAhAgAUEobGogAjYCHCABQQFqIQEgAiAMQQJ0aiECDAELCwUgACgCECADQShsaiACNgIcIANBAWohAyACQRhqIQIMAQsLQQAhBgJAAkADQCAGIA9GBEACQCAIEJkBGiAJEJkBGiALEBhBACEBQYj2CCgCACECA0AgASAAKAIATg0BIAAoAhAgAUEobGoiAygCFEUEQCAEIAE2AhAgAkH4zAQgBEEQahAgGiADKAIURQ0FCyADKAIYRQRAIAQgATYCACACQeLMBCAEECAaIAMoAhhFDQYLIAFBAWohAQwACwALBSASIAZByABsaiIBKwM4IAErAyihIhsgASsDQCABKwMwoSIfoEQAAAAAAADg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EmogBhAZQcgAbGogBTYCKAsgAigCACEGIARBkBJqIAIpAgg3AwAgBCACKQIANwOIEgJAIAYgBEGIEmogBRAZQcgAbGooAjQiBkEBa0F9Sw0AIAIoAgAgBEGAEmogAikCCDcDACAEIAIpAgA3A/gRIARB+BFqIAYQGUHIAGxqKAIsIAlHDQAgAigCACAEQfARaiACKQIINwMAIAQgAikCADcD6BEgBEHoEWogBhAZQcgAbGogBTYCLAsgAxDvASEHIAMQ7wEhCiACKAIAIARB4BFqIAIpAgg3AwAgBCACKQIANwPYESAEQdgRaiAJEBlByABsaigCOCEGIAMoAgAgBEHQEWogAykCCDcDACAEIAMpAgA3A8gRIARByBFqIAYQGUEobGpBAjYCACADKAIAIARBwBFqIAMpAgg3AwAgBCADKQIANwO4ESAEQbgRaiAGEBlBKGxqIg4gCCkDADcDCCAOIAgpAwg3AxAgAygCACAEQbARaiADKQIINwMAIAQgAykCADcDqBEgBEGoEWogBhAZQShsaiAANgIEIAMoAgAgBEGgEWogAykCCDcDACAEIAMpAgA3A5gRIARBmBFqIAYQGUEobGogCjYCICADKAIAIARBkBFqIAMpAgg3AwAgBCADKQIANwOIESAEQYgRaiAGEBlBKGxqIAc2AiQgAygCACAEQYARaiADKQIINwMAIAQgAykCADcD+BAgBEH4EGogBxAZQShsakEDNgIAIAMoAgAgBEHwEGogAykCCDcDACAEIAMpAgA3A+gQIARB6BBqIAcQGUEobGogCTYCGCADKAIAIARB4BBqIAMpAgg3AwAgBCADKQIANwPYECAEQdgQaiAHEBlBKGxqIAY2AhwgAygCACAEQdAQaiADKQIINwMAIAQgAykCADcDyBAgBEHIEGogChAZQShsakEDNgIAIAMoAgAgBEHAEGogAykCCDcDACAEIAMpAgA3A7gQIARBuBBqIAoQGUEobGogBTYCGCADKAIAIARBsBBqIAMpAgg3AwAgBCADKQIANwOoECAEQagQaiAKEBlBKGxqIAY2AhwgAigCACAEQaAQaiACKQIINwMAIAQgAikCADcDmBAgBEGYEGogCRAZQcgAbGogBzYCOCACKAIAIARBkBBqIAIpAgg3AwAgBCACKQIANwOIECAEQYgQaiAFEBlByABsaiAK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IAIoAgAgBEGIDGogAikCCDcDACAEIAIpAgA3A4AMIARBgAxqIAkQGUHIAGxqKwMYoZlESK+8mvLXej5lRSALRXINAAJAIBMoAgAiBUEATA0AIAUgASAHEMcERQ0AIAIoAgAhBSAEQbgLaiACKQIINwMAIAQgAikCADcDsAsgBSAEQbALaiAIEBlByABsaigCMCEHIARBqAtqIAIpAgg3AwAgBCACKQIANwOgCyAFIARBoAtqIAcQGUHIAGxqIAg2AiggAigCACAEQZgLaiACKQIINwMAIAQgAikCADcDkAsgBEGQC2ogBhAZQcgAbGpBfzYCMCACKAIAIARBiAtqIAIpAgg3AwAgBCACKQIANwOACyAEQYALaiAGEBlByABsakF/NgI0DAILIAIoAgAhBSAEQfgLaiACKQIINwMAIAQgAikCADcD8AsgBSAEQfALaiAGEBlByABsaigCMCEHIARB6AtqIAIpAgg3AwAgBCACKQIANwPgCyAFIARB4AtqIAcQGUHIAGxqIAY2AiwgAigCACAEQdgLaiACKQIINwMAIAQgAikCADcD0AsgBEHQC2ogCBAZQcgAbGpBfzYCMCACKAIAIARByAtqIAIpAgg3AwAgBCACKQIANwPACyAEQcALaiAIEBlByABsakF/NgI0DAELIAIoAgAhBSAEQfgKaiACKQIINwMAIAQgAikCADcD8AogBSAEQfAKaiAIEBlByABsaigCMCEHIARB6ApqIAIpAgg3AwAgBCACKQIANwPgCgJAIAUgBEHgCmogBxAZQcgAbGooAihBAWtBfUsNACACKAIAIQUgBEHYCmogAikCCDcDACAEIAIpAgA3A9AKIAUgBEHQCmogCBAZQcgAbGooAjAhByAEQcgKaiACKQIINwMAIAQgAikCADcDwAogBSAEQcAKaiAHEBlByABsaigCLEEBa0F9Sw0AIAIoAgAhBSAEQbgKaiACKQIINwMAIAQgAikCADcDsAogBSAEQbAKaiAIEBlByABsaigCMCEHIARBqApqIAIpAgg3AwAgBCACKQIANwOgCiAFIARBoApqIAcQGUHIAGxqKAIoIQcgAigCACEFIARBmApqIAIpAgg3AwAgBCACKQIANwOQCiAFIARBkApqIAgQGUHIAGxqKAIwIQogBEGICmogAikCCDcDACAEIAIpAgA3A4AKIAUg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aCAEIAIpAgA3A2AgBSAEQeAAaiAHEBlByABsaiAGNgIoIAIoAgAhBSAEIAIpAgg3A1ggBCACKQIANwNQIAUgBEHQAGogCBAZQcgAbGooAjQhByAEIAIpAgg3A0ggBCACKQIANwNAIAUgBEFAayAHEBlByABsakF/NgIsIAIoAgAgBCACKQIINwM4IAQgAikCADcDMCAEQTBqIAgQGUHIAGxqQX82AjQgAigCACAEIAIpAgg3AyggBCACKQIANwMgIARBIGogCBAZQcgAbGpBMGoMAQsgB0F/NgIsIAIoAgAhBSAEIAIpAgg3A/gBIAQgAikCADcD8AEgBSAEQfABaiAIEBlByABsaigCNCEHIAQgAikCCDcD6AEgBCACKQIANwPgASAFIARB4AFqIAcQGUHIAGxqIAg2AiggAigCACEFIAQgAikCCDcD2AEgBCACKQIANwPQASAFIARB0AFqIAgQGUHIAGxqKAI0IQcgBCACKQIINwPIASAEIAIpAgA3A8ABIAUgBEHAAWogBxAZQcgAbGogBjYCLCACKAIAIAQgAikCCDcDuAEgBCACKQIANwOwASAEQbABaiAIEBlByABsaigCNCEFIAIoAgAgBCACKQIINwOoASAEIAIpAgA3A6ABIARBoAFqIAYQGUHIAGxqIAU2AjAgAigCACAEIAIpAgg3A5gBIAQgAikCADcDkAEgBEGQAWogBhAZQcgAbGpBfzYCNCACKAIAIAQgAikCCDcDiAEgBCACKQIANwOAASAEQYABaiAIEBlByABsakE0agsoAgAhBSACKAIAIAQgAikCCDcDGCAEIAIpAgA3AxAgBEEQaiAIEBlByABsaiAANgIEIAIoAgAgBCACKQIINwMIIAQgAikCADcDACAEIAYQGUHIAGxqIAA2AgAMAAsAC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALySADEH8CfAJ+IwBBkAlrIgQkACAEQaAIaiIJQQBBwAAQOBogAEEAQeAAEDgiBUHIABAmIQAgBSgCACAAQcgAbGogBUEYakHIABAfGiADKAIAIRMgCRDvASEJIARBmAhqIARBqAhqIgApAwA3AwAgBCAEKQOgCDcDkAggBCgCoAggBEGQCGogCRAZQShsakECNgIAIARBiAhqIAApAwA3AwAgBCAEKQOgCDcDgAggBCgCoAggBEGACGog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AiACKAIAQQNxIQMLIAIgBiADQQNGGygCKCAFRw0CQZDdCigCACIDRQ0CIAIgAxBFIgMtAABFDQIgAUGwAmogAiADEMAODAILA0ACQCADIARPBEAgAUHgAmpBHBAxQQAhA0EAIQIDQCACIAEoArgCIgRPDQIgASABKQK4AjcD+AEgASABKQKwAjcD8AEgASgCsAIgAUHwAWogAhAZQRxsaigADEECTwRAIAEgASkCuAI3A+gBIAEgASkCsAI3A+ABIAEgASgCsAIgAUHgAWogAhAZQRxsaiIEKQIUNwPYASABIAQpAgw3A9ABIAEgBCkCBDcDyAEgBSABQcgBahDBDgsgAkEBaiECDAALAAsgASABKQLoAjcDwAEgASABKQLgAjcDuAEgAUG4AWogAxAZIQICQAJAIAEoAvACIgQOAgEJAAsgASABKALgAiACQRxsaiICKQIINwOgASABIAIpAhA3A6gBIAEgAigCGDYCsAEgASACKQIANwOYASABQZgBaiAEEQEACyADQQFqIQMgASgC6AIhBAwBCwsDQCADIARPBEAgAUGwAmpBHBAxIAAgBRAdIQUMBQUgASABKQK4AjcDqAIgASABKQKwAjcDoAIgAUGgAmogAxAZIQICQAJAIAEoAsACIgQOAgEJAAsgASABKAKwAiACQRxsaiICKQIINwOIAiABIAIpAhA3A5ACIAEgAigCGDYCmAIgASACKQIANwOAAiABQYACaiAEEQEACyADQQFqIQMgASgCuAIhBAwBCwALAAsgAUHgAmogAiADEMAOCyAAIAIgBRByIQIMAAsACwALIAFBkANqJAAPC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALHAEBf0EBIQIgACABENIOBH9BAQUgACABENEOCwtAAQJ/AkAgASAAKAIATw0AIAIgACgCBCIETw0AIAAoAgggASAEbCACaiIAQQN2ai0AACAAQQdxdkEBcSEDCyADC84CAQp/AkACQCAABEAgACgCACIFIAFLIAAoAgQiBCACS3FFBEAgBCACQQFqIgMgAyAESRsiBCAFIAFBAWoiAyADIAVJGyIFbCIDQQN2IANBB3FBAEdqEMYDIQcgACgCACEIA0AgBiAIRwRAIAQgBmwhCSAAKAIEIQpBACEDA0AgAyAKRgRAIAZBAWohBgwDCyAAIAYgAxDEDgRAIAcg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A0HMAGohCgJAA0AgAgRAAkAgAigCECIEIAhqKAIAKAIADQAgBCgCsAENACAEQQE2ArABIAMgAjYCTCADQThqQQQQJiEEIAMoAjggBEECdGogAygCTDYCAANAIAMoAkBFDQEgA0E4aiAKEKEEIAMoAkwiBSgCEC0AtQFBB0cEQCAAIAUQ0A4EQEEAIQIDQCADKAJAIAJNBEBBfyEEDAgFIAMgA0FAaykDADcDMCADIAMpAzg3AyggA0EoaiACEBkhAAJAAkACQCADKAJIIgEOAgIAAQsgAygCOCAAQQJ0aigCABAYDAELIAMoAjggAEECdGooAgAgAREBAAsgAkEBaiECDAELAAsACyADQThqIAUgARDPDgwBCyADQThqIQtBACEEAkAgAUEBaiIMIAUoAhAoAugBIgYoAhAiBSwAkQJGDQAgBSgC6AEhBQNAIAYoAhAiBCgC7AEiByAFTgRAIAVBAnQhByAFQQFqIQUgACAHIAQoAowCaigCABDQDiIERQ0BDAILCyAEKALoASEFA0AgBSAHTARAIAsgBCgCjAIgBUECdGooAgAgARDPDiAFQQFqIQUgBigCECIEKALsASEHDAELCyAEIAw6AJECQQAhBAsgBEUNAAtBACECA0AgAiADKAJATw0EIAMgA0FAaykDADcDICADIAMpAzg3AxggA0EYaiACEBkhAAJAAkACQCADKAJIIgEOAgIAAQsgAygCOCAAQQJ0aigCABAYDAELIAMoAjggAEECdGooAgAgAREBAAsgAkEBaiECDAALAAsgAigCECAJaigCACECDAELC0Ho/QooAgAhBSAAKAIQIgIoAugBIQQDQCACKALsASAETgRAIARByABsIgEgBSgCECgCxAFqQQA6ADECQCACLQB0QQFxRQ0AIAIoAsQBIAFqIgEoAgAiBkEATA0AIAZBAWsiBkEBdkEBaiEHIAEoAgQhAUEAIQIDQCACIAdHBEAgASACQQJ0aigCACABIAYgAmtBAnRqKAIAEJcIIAJBAWohAgwBCwsgACgCECECCyAEQQFqIQQMAQsLAkAgABBhIABHDQAQyQRCAFcNACAAQQAQlggLQQAhBEEAIQIDQCACIAMoAkBPDQEgAyADQUBrKQMANwMQIAMgAykDODcDCCADQQhqIAIQGSEAAkACQAJAIAMoAkgiAQ4CAgABCyADKAI4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IQILIAMgASACIAYQ6w4gASECCyAAIAYQMCEGDAALAAsACyAAEOoODAELIAAgA0EAQQAQ6Q4gAxAcIQEDQCABBEAgASgCECICQQA6ALQBIAJBADYCsAEgAyABEB0hAQwBCwsgAxAcIQEDQCABBEAgAyABEOgOIAMgARAdIQEMAQsLIAMQHCEBA0AgAQRAIAEoAhBBADYCkAEgAyABEB0hAQwBCwtBACEJIAMQHCEBA0AgAQRAIAEoAhAoApABRQRAIAMgASAJQQFqIgkQoAgLIAMgARAdIQEMAQsLAkAgCUECSA0AIANB5xwQygQhAiADEBwhAUEBIQgDQCABRQ0BIAggASgCECgCkAFGBEAgAyACIAFBAEEBEF4aIAhBAWohCAsgAyABEB0hAQwACwALIAMQHCEHA0AgBwRAIAMgBxAsIQEDQCABBEAgBygCECICKALIASACKALMASICQQFqIAJBAmoQ2gEhBCAHKAIQIgIgBDYCyAEgAiACKALMASICQQFqNgLMASAEIAJBAnRqIAE2AgAgBygCECICKALIASACKALMAUECdGpBADYCACABIAFBMGsiBSABKAIAQQNxQQJGGygCKCgCECICKALAASACKALEASICQQFqIAJBAmoQ2gEhAiABIAUgASgCAEEDcUECRhsoAigoAhAgAjYCwAEgASAFIAEoAgBBA3FBAkYbKAIoKAIQIgQgBCgCxAEiAkEBajYCxAEgBCgCwAEgAkECdGogATYCACABIAUgASgCAEEDcUECRhsoAigoAhAiAigCwAEgAigCxAFBAnRqQQA2AgAgAyABEDAhAQwBCwsgAyAHEB0hBwwBCwsgA0EBIBAgAEGnhwEQJyICBH8gAhCRAgVBfwsQ/w4aIAAoAhBC/////3c3A+gBQQAhBwJAIAlBAkgNACAJQQFqIgIQnwghB0EBIQEDQCABIAJGDQEgByABQQJ0akH/////BzYCACABQQFqIQEMAAsACyAAEBwhCANAIAgEQCAIEIYCIQIgCCgCECIBIAIoAhAoAqQBKAIQIgIoAvQBIgU2AvQBIAUgACgCECIEKALsAUoEQCAEIAU2AuwBCyAFIAQoAugBSARAIAQgBTYC6AELIAcEQCABIAIoApABIgI2ApABIAcgAkECdGoiAiACKAIAIgIgBSACIAVIGzYCAAsgACAIEB0hCAwB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IAFCADcDECABQgA3AwggASAANgIcIAFBCGpBBBAmIQAgASgCCCAAQQJ0aiABKAIcNgIAIAFBHGohCkH/////ByEEA0AgASgCEARAIAFBCGogCkEEEL4BQQAhACABKAIcIQcDQCAHKAIQIgIoAsgBIABBAnRqKAIAIgMEQCADQVBBACADKAIAQQNxIgtBAkcbaigCKCIMKAIQIg0oArACIQYCQCADKAIQIg4oAqQBQQBIBEAgBiAITCAGIAlOcQ0BIA0oAvQBIANBMEEAIAtBA0cbaigCKCgCECgC9AEgDigCrAFqayICIAQgBUUgAiAESHIiAhshBCADIAUgAhshBQwBCyAGIAIoArACTg0AIAEgDDYCHCABQQhqQQQQJiECIAEoAgggAkECdGogASgCHDYCAAsgAEEBaiEADAEFQQAhACAEQQBMDQMDQCACKAKYAiAAQQJ0aigCACIDRQ0EIANBMEEAIAMoAgBBA3FBA0cbaigCKCIDKAIQKAKwAiACKAKwAkgEQCABIAM2AhwgAUEIakEEECYhAiABKAIIIAJBAnRqIAEoAhw2AgAgBygCECECCyAAQQFqIQAMAAsACwALAAsLDAELIAQoAhAiACgCsAIhCCAAKAKsAiEJIAFBADYCGCABQgA3AxAgAUIANwMIIAEgBDYCHCABQQhqQQQQJiEAIAEoAgggAEECdGogASgCHDYCACABQRxqIQpB/////wchBANAIAEoAhAEQCABQQhqIApBBBC+AUEAIQAgASgCHCEHA0AgBygCECICKALAASAAQQJ0aigCACIDBEAgA0EwQQAgAygCAEEDcSILQQNHG2ooAigiDCgCECINKAKwAiEGAkAgAygCECIOKAKkAUEASARAIAYgCEwgBiAJTnENASADQVBBACALQQJHG2ooAigoAhAoAvQBIA0oAvQBIA4oAqwBamsiAiAEIAVFIAIgBEhyIgIbIQQgAyAFIAIbIQUMAQsgBiACKAKwAk4NACABIAw2AhwgAUEIakEEECYhAiABKAIIIAJBAnRqIAEoAhw2AgALIABBAWohAAwBBUEAIQAgBEEATA0DA0AgAigCoAIgAEECdGooAgAiA0UNBCADQVBBACADKAIAQQNxQQJHG2ooAigiAygCECgCsAIgAigCsAJIBEAgASADNgIcIAFBCGpBBBAmIQIgASgCCCAC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4woQwgEQcQtBkOMKECQEQCAAQeDjCigCACgCFEGQ4woQwgEQcQtBsOMKECQEQCAAQeDjCigCACgCHEGw4woQwgEQiwYLQcDjChAkBEAgAEHg4wooAgAoAiRBwOMKEMIBEHELQdDjChAkBEAgAEHg4wooAgAoAiBB0OMKEMIBEHELQYilCkKAgICAgICA+D83AwBB+KQKQoCAgICAgID4PzcDAEHopApCgICAgICAgPg/NwMAQeCkCkKAgICAgICA+D83AwBByKQKQoCAgICAgID4PzcDAEHApApCgICAgICAgPg/NwMAQYjkCkIANwMAQfjjCkIANwMAQZzkCkEANgIAQZTkCkEANgIAC30AIAAoAhAoAgghAEHw4goQJARAIABB4OMKKAIAKAIIQfDiChDCARBxC0Gw4woQJARAIABB4OMKKAIAKAIMQbDjChDCARCLBgtBgKUKQoCAgICAgID4PzcDAEHwpApCgICAgICAgPg/NwMAQZjkCkEANgIAQZDkCkEANgIAC3MAIAAoAhAoAggiAEHg4wooAgAoAgBB8OIKEMIBEHEgACgCECgCDARAIABB4OMKKAIAKAIEQbDjChDCARBxC0HYpApCgICAgICAgPg/NwMAQbikCkKAgICAgICA+D83AwBBhOQKQQA2AgBB9OMKQQA2AgALxAMBBH8jAEEQayIDJAAgACgCECgCCCEBQeTjCigCAEUEQEHs4wpBoAI2AgBB6OMKQaECNgIAQeTjCkHw7wkoAgA2AgALIAEoAkwiAigCBCEEIAJB5OMKNgIEAkACQAJAAkACQAJAIAAoAkAOBwEBBAACAgIDCyAAIAEgAEEBEMcIDAQLIAAtAJsBQQhxDQMgASAAENUIDAMLQeDiChAkBEBB4OMKKAIAKAIAIgJFBEAgAUEAQcHDARCIASECQeDjCigCACACNgIACyABIAJB4OIKEMIBEHELIAEoAhAoAgwEQCABQeDjCigCACgCBEGg4woQwgEQiwYLQQAhAiABQb7jAEHg4wooAgAoAiwQkAcDQCACQQhGRQRAIAJBBHRB4OIKahBcIAJBAWohAgwBCwtB4OMKKAIAEBhB0KQKQoCAgICAgID4PzcDAEGwpApCgICAgICAgPg/NwMAQYDkCkEANgIAQfDjCkEANgIAIAAtAJsBQQhxDQIgASAAENUIDAILIANB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IAUoAggoAghB4IYKRwRAIAQgATYCGCAGIQMLIAFBACAEQegAaiACIAQtAGcgAxCWBEUNASABIAIQ3wkMAQsgASAGIARB6ABqIANB6cUBIAMbIgMgBC0AZ0EAEJYERQ0AIAEQISEBIAQgAzYCCCAEIAI2AgQgBCABNgIAQd+9BCAEECoLIARBADYCjAEgACAEQegAakEoEB8aCyAEQZABaiQACxoAIAAoAhAoAgwiAARAIAAoAiwQGCAAEBgLC6kFAgR8CH9BMBBSIQYgACgCECgCCCgCCCgCBCEKAnwgAEHU2wooAgBE////////739EexSuR+F6hD8QTCAAQdDbCigCAET////////vf0R7FK5H4XqUPxBMIgEQKSICvUL/////////9/8AUiABvUL/////////9/8AUnJFBEAgACgCECIFQpqz5syZs+bUPzcDICAFQpqz5syZs+bUPzcDKETNzMzMzMwMQAwBCyACRGEyVTAqqTM/ECMhASAAKAIQIgUgASACIAJEAAAAAAAAAABkGyIBOQMgIAUgATkDKCABRAAAAAAAAFJAogshA0EBIQtBASAAQYjcCigCACAKQQAQYiIHIAdBAU0bIAdBAEcgAEG83AooAgBEAAAAAAAA8D9EAAAAAAAAAAAQTCIERAAAAAAAAAAAZHEiCmoiBUEBdEEQEBoiCCADRAAAAAAAAOA/oiICOQMYIAggAjkDECAIIAKaIgE5AwggCCABOQMAQQIhCQJAIAdBAkkEQCACIQEMAQsgAiEBA0AgByALRkUEQCAIIAlBBHRqIgwgAUQAAAAAAAAQQKAiAZo5AwggDCACRAAAAAAAABBAoCICmjkDACAMIAI5AxAgDCABOQMYIAtBAWohCyAJQQJqIQkMAQsLIAIgAqAhAwsgCkUgBSAHTXJFBEAgCCAJQQR0aiIFIAREAAAAAAAA4D+iIgQgAaAiATkDGCAFIAQgAqAiAjkDECAFIAGaOQMIIAUgApo5AwALIAZCADcDECAGQQI2AgggBiAHNgIEIAZBATYCACAGIAg2AiwgBkIANwMYIAZCADcDICAAKAIQIgAgAiACoEQAAAAAAABSQKMiATkDcCAAIAE5A2ggACADRAAAAAAAAFJAoyIBOQMoIAAgATkDICAAIAY2AgwLwQMCBH8CfCMAQdAAayIBJAAgABAtKAIQKAJ0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IAMgBBCIBSAFQQhqIgUgBkkNAAwDCwALA0AgAS0ANg0CIAEoAiRBAUYEQCABKAIYQQFGDQMLIAUgASACIAMgBBCIBSAFQQhqIgUgBkkNAAsMAQsgASACNgIUIAEgASgCKEEBajYCKCABKAIkQQFHDQAgASgCGEECRw0AIAFBAToANgsLcAECfyAAIAEoAghBABDbAQRAIAEgAiADEO8GDwsgACgCDCEEIABBEGoiBSABIAIgAxCyCgJAIARBAkkNACAFIARBA3RqIQQgAEEYaiEAA0AgACABIAIgAxCyCiABLQA2DQEgAEEIaiIAIARJDQALCwszACAAIAEoAghBABDbAQRAIAEgAiADEO8GDwsgACgCCCIAIAEgAiADIAAoAgAoAhwRBwALGgAgACABKAIIQQAQ2wEEQCABIAIgAxDvBgsLgwUBBn8jAEFAaiIEJAACf0EBIAAgAUEAENsBDQAaQQAgAUUNABojAEEQayIGJAAgBiABKAIAIgNBCGsoAgAiBTYCDCAGIAEgBWo2AgQgBiADQQRrKAIANgIIIAYoAggiA0Ho6AlBABDbASEFIAYoAgQhBwJAIAUEQCAGKAIMIQEjAEFAaiIDJAAgA0FAayQAQQAgByABGyEDDAELIAMhBSMAQUBqIgMkACABIAdOBEAgA0IANwIcIANCADcCJCADQgA3AiwgA0IANwIUIANBADYCECADQejoCTYCDCADIAU2AgQgA0EANgI8IANCgYCAgICAgIABNwI0IAMgATYCCCAFIANBBGogByAHQQFBACAFKAIAKAIUEQsAIAFBACADKAIcGyEICyADQUBrJAAgCCIDDQAjAEFAaiIDJAAgA0EANgIQIANBuOgJNgIMIAMgATYCCCADQejoCTYCBEEAIQEgA0EUakEAQScQOBogA0EANgI8IANBAToAOyAFIANBBGogB0EBQQAgBSgCACgCGBEKAAJAAkACQCADKAIoDgIAAQILIAMoAhhBACADKAIkQQFGG0EAIAMoAiBBAUYbQQAgAygCLEEBRhshAQwBCyADKAIcQQFHBEAgAygCLA0BIAMoAiBBAUcNASADKAIkQQFHDQELIAMoAhQhAQsgA0FAayQAIAEhAwsgBkEQaiQAQQAgA0UNABogBEEIakEAQTgQOBogBEEBOgA7IARBfzYCECAEIAA2AgwgBCADNgIEIARBATYCNCADIARBBGogAigCAEEBIAMoAgAoAhwRBwAgBCgCHCIAQQFGBEAgAiAEKAIUNgIACyAAQQFGCyAEQUBrJAALAwAACwkAQeieCxB3GgslAEH0ngstAABFBEBB6J4LQci+CRDRA0H0ngtBAToAAAtB6J4LCwkAQdieCxA1GgslAEHkngstAABFBEBB2J4LQfbcABCmBEHkngtBAToAAAtB2J4LCwkAQcieCxB3GgslAEHUngstAABFBEBByJ4LQfS9CRDRA0HUngtBAToAAAtByJ4LCwkAQbieCxA1GgslAEHEngstAABFBEBBuJ4LQbPJARCmBEHEngtBAToAAAtBuJ4LCwkAQaieCxB3GgslAEG0ngstAABFBEBBqJ4LQdC9CRDRA0G0ngtBAToAAAtBqJ4LCwkAQfzZChA1GgsaAEGlngstAABFBEBBpZ4LQQE6AAALQfzZCgsJAEGYngsQdxoLJQBBpJ4LLQAARQRAQZieC0GsvQkQ0QNBpJ4LQQE6AAALQZieCwsJAEHw2QoQNRoLGgBBlZ4LLQAARQRAQZWeC0EBOgAAC0Hw2QoLGwBB+KYLIQADQCAAQQxrEHciAEHgpgtHDQALC1QAQZSeCy0AAARAQZCeCygCAA8LQfimCy0AAEUEQEH4pgtBAToAAAtB4KYLQejmCRBYQeymC0H05gkQWEGUngtBAToAAEGQngtB4KYLNgIAQeCmCwsbAEHYpgshAANAIABBDGsQNSIAQcCmC0cNAAsLVABBjJ4LLQAABEBBiJ4LKAIADwtB2KYLLQAARQRAQdimC0EBOgAAC0HApgtB9tEBEFlBzKYLQenRARBZQYyeC0EBOgAAQYieC0HApgs2AgBBwKYLCxsAQbCmCyEAA0AgAEEMaxB3IgBBkKQLRw0ACwuwAgBBhJ4LLQAABEBBgJ4LKAIADwtBsKYLLQAARQRAQbCmC0EBOgAAC0GQpAtB4OIJEFhBnKQLQYDjCRBYQaikC0Gk4wkQWEG0pAtBvOMJEFhBwKQLQdTjCRBYQcykC0Hk4wkQWEHYpAtB+OMJEFhB5KQLQYzkCRBYQfCkC0Go5AkQWEH8pAtB0OQJEFhBiKULQfDkCRBYQZSlC0GU5QkQWEGgpQtBuOUJEFhBrKULQcjlCRBYQbilC0HY5QkQWEHEpQtB6OUJEFhB0KULQdTjCRBYQdylC0H45QkQWEHopQtBiOYJEFhB9KULQZjmCRBYQYCmC0Go5gkQWEGMpgtBuOYJEFhBmKYLQcjmCRBYQaSmC0HY5gkQWEGEngtBAToAAEGAngtBkKQLNgIAQZCkCwsbAEGApAshAANAIABBDGsQNSIAQeChC0cNAAsLogIAQfydCy0AAARAQfidCygCAA8LQYCkCy0AAEUEQEGApAtBAToAAAtB4KELQfgMEFlB7KELQe8MEFlB+KELQcf6ABBZQYSiC0HN7gAQWUGQogtB2BEQWUGcogtBu5YBEFlBqKILQfwNEFlBtKILQasZEFlBwKILQYY7EFlBzKILQc86EFlB2KILQf06EFlB5KILQZA7EFlB8KILQZzqABBZQfyiC0HdvwEQWUGIowtBzjsQWUGUowtBxDUQWUGgowtB2BEQWUGsowtBvOAAEFlBuKMLQY7tABBZQcSjC0HB/QAQWUHQowtBv9sAEFlB3KMLQdMkEFlB6KMLQf4WEFlB9KMLQfi2ARBZQfydC0EBOgAAQfidC0HgoQs2AgBB4KELCxsAQdihCyEAA0AgAEEMaxB3IgBBsKALRw0ACwvMAQBB9J0LLQAABEBB8J0LKAIADwtB2KELLQAARQRAQdihC0EBOgAAC0GwoAtBjOAJEFhBvKALQajgCRBYQcigC0HE4AkQWEHUoAtB5OAJEFhB4KALQYzhCRBYQeygC0Gw4QkQWEH4oAtBzOEJEFhBhKELQfDhCRBYQZChC0GA4gkQWEGcoQtBkOIJEFhBqKELQaDiCRBYQbShC0Gw4gkQWEHAoQtBwOIJEFhBzKELQdDiCRBYQfSdC0EBOgAAQfCdC0GwoAs2AgBBsKALCxsAQaigCyEAA0AgAEEMaxA1IgBBgJ8LRw0ACwvDAQBB7J0LLQAABEBB6J0LKAIADwtBqKALLQAARQRAQaigC0EBOgAAC0GAnwtBwxEQWUGMnwtByhEQWUGYnwtBqBEQWUGknwtBsBEQWUGwnwtBnxEQWUG8nwtB0REQWUHInwtBuhEQWUHUnwtBuOAAEFlB4J8LQabkABBZQeyfC0GxjwEQWUH4nwtBp7ABEFlBhKALQecXEFlBkKALQcP1ABBZQZygC0HeJRBZQeydC0EBOgAAQeidC0GAnws2AgBBgJ8LCwsAIABBlL0JENEDCwsAIABB+pMBEKYECwsAIABBgL0JENEDCwsAIABBvooBEKYECwwAIAAgAUEQahD/BgsMACAAIAFBDGoQ/wYLBwAgACwACQsHACAALAAICwkAIAAQywoQGAsJACAAEMwKEBgLFQAgACgCCCIARQRAQQEPCyAAENMKC44BAQZ/A0ACQCACIANGIAQgCE1yDQBBASEHIAAoAgghBSMAQRBrIgYkACAGIAU2AgwgBkEIaiAGQQxqEI4CQQAgAiADIAJrIAFBvJoLIAEbEK4FIQUQjQIgBkEQaiQAAkACQCAFQQJqDgMCAgEACyAFIQcLIAhBAWohCCAHIAlqIQkgAiAHaiECDAELCyAJC0gBAn8gACgCCCECIwBBEGsiASQAIAEgAjYCDCABQQhqIAFBDGoQjgIQjQIgAUEQaiQAIAAoAggiAEUEQEEBDwsgABDTCkEBRguJAQECfyMAQRBrIgYkACAEIAI2AgACf0ECIAZBDGoiBUEAIAAoAggQ+AYiAEEBakECSQ0AGkEBIABBAWsiAiADIAQoAgBrSw0AGgN/IAIEfyAFLQAAIQAgBCAEKAIAIgFBAWo2AgAgASAAOgAAIAJBAWshAiAFQQFqIQUMAQVBAAsLCyAGQRBqJAALyAYBDX8jAEEQayIRJAAgAiEIA0ACQCADIAhGBEAgAyEIDAELIAgtAABFDQAgCEEBaiEIDAELCyAHIAU2AgAgBCACNgIAA0ACQAJ/AkAgAiADRiAFIAZGcg0AIBEgASkCADcDCCAAKAIIIQkjAEEQayIQJAAgECAJNgIMIBBBCGogEEEMahCOAiAIIAJrIQ5BACEKIwBBkAhrIgwkACAMIAQoAgAiCTYCDCAFIAxBEGogBRshDwJAAkACQCAJRSAGIAVrQQJ1QYACIAUbIg1FckUEQANAIA5BgwFLIA5BAnYiCyANT3JFBEAgCSELDAQLIA8gDEEMaiALIA0gCyANSRsgARCaCyESIAwoAgwhCyASQX9GBEBBACENQX8hCgwDCyANIBJBACAPIAxBEGpHGyIUayENIA8gFEECdGohDyAJIA5qIAtrQQAgCxshDiAKIBJqIQogC0UNAiALIQkgDQ0ADAILAAsgCSELCyALRQ0BCyANRSAORXINACAKIQkDQAJAAkAgDyALIA4gARCuBSIKQQJqQQJNBEACQAJAIApBAWoOAgYAAQsgDEEANgIMDAILIAFBADYCAAwBCyAMIAwoAgwgCmoiCzYCDCAJQQFqIQkgDUEBayINDQELIAkhCgwCCyAPQQRqIQ8gDiAKayEOIAkhCiAODQALCyAFBEAgBCAMKAIMNgIACyAMQZAIaiQAEI0CIBBBEGokAAJAAkACQAJAIApBf0YEQANAIAcgBTYCACACIAQoAgBGDQZBASEGAkACQAJAIAUgAiAIIAJrIBFBCGogACgCCBDUCiIBQQJqDgMHAAIBCyAEIAI2AgAMBAsgASEGCyACIAZqIQIgBygCAEEEaiEFDAALAAsgByAHKAIAIApBAnRqIgU2AgAgBSAGRg0DIAQoAgAhAiADIAhGBEAgAyEIDAgLIAUgAkEBIAEgACgCCBDUCkUNAQtBAgwECyAHIAcoAgBBBGo2AgAgBCAEKAIAQQFqIgI2AgAgAiEIA0AgAyAIRgRAIAMhCAwGCyAILQAARQ0FIAhBAWohCAwACwALIAQgAjYCAEEBDAILIAQoAgAhAgsgAiADRwsgEUEQaiQADwsgBygCACEFDAALAAumBQEMfyMAQRBrIg8kACACIQgDQAJAIAMgCEYEQCADIQgMAQsgCCgCAEUNACAIQQRqIQgMAQsLIAcgBTYCACAEIAI2AgACQANAAkACQCACIANGIAUgBkZyBH8gAgUgDyABKQIANwMIQQEhECAAKAIIIQkjAEEQayIOJAAgDiAJNgIMIA5BCGogDkEMahCOAiAFIQkgBiAFayEKQQAhDCMAQRBrIhEkAAJAIAQoAgAiC0UgCCACa0ECdSISRXINACAKQQAgBRshCgNAIBFBDGogCSAKQQRJGyALKAIAEJgHIg1Bf0YEQEF/IQwMAgsgCQR/IApBA00EQCAKIA1JDQMgCSARQQxqIA0QHxoLIAogDWshCiAJIA1qBUEACyEJIAsoAgBFBEBBACELDAILIAwgDWohDCALQQRqIQsgEkEBayISDQALCyAJBEAgBCALNgIACyARQRBqJAAQjQIgDkEQaiQAAkACQAJAAkAgDEEBag4CAAgBCyAHIAU2AgADQCACIAQoAgBGDQIgBSACKAIAIAAoAggQ+AYiAUF/Rg0CIAcgBygCACABaiIFNgIAIAJBBGohAgwACwALIAcgBygCACAMaiIFNgIAIAUgBkYNASADIAhGBEAgBCgCACECIAMhCAwGCyAPQQRqIgJBACAAKAIIEPgGIghBf0YNBCAGIAcoAgBrIAhJDQYDQCAIBEAgAi0AACEFIAcgBygCACIJQQFqNgIAIAkgBToAACAIQQFrIQggAkEBaiECDAELCyAEIAQoAgBBBGoiAjYCACACIQgDQCADIAhGBEAgAyEIDAULIAgoAgBFDQQgCEEEaiEIDAALAAsgBCACNgIADAMLIAQoAgALIANHIRAMAwsgBygCACEFDAELC0ECIRALIA9BEGokACAQCwkAIAAQ4QoQGAszACMAQRBrIgAkACAAIAQ2AgwgACADIAJrNgIIIABBDGogAEEIahCvCygCACAAQRBqJAALNAADQCABIAJGRQRAIAQgAyABLAAAIgAgAEEASBs6AAAgBEEBaiEEIAFBAWohAQwBCwsgAQsMACACIAEgAUEASBsLKgADQCABIAJGRQRAIAMgAS0AADoAACADQQFqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQbClCRCgCgseACABQQBOBH9BsKUJKAIAIAFBAnRqKAIABSABC8ALDwAgACABIAJBpJkJEKAKCx4AIAFBAE4Ef0GkmQkoAgAgAUECdGooAgAFIAELwAsJACAAENcKEBgLNQADQCABIAJGRQRAIAQgASgCACIAIAMgAEGAAUkbOgAAIARBAWohBCABQQRqIQEMAQsLIAELDgAgASACIAFBgAFJG8ALKgADQCABIAJGRQRAIAMgASwAADYCACADQQRqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQbClCRCfCgseACABQf8ATQR/QbClCSgCACABQQJ0aigCAAUgAQsLDwAgACABIAJBpJkJEJ8KCx4AIAFB/wBNBH9BpJkJKAIAIAFBAnRqKAIABSABCws6AANAAkAgAiADRg0AIAIoAgAiAEH/AEsNACAAQQJ0QYC0CWooAgAgAXFFDQAgAkEEaiECDAELCyACCzoAA0ACQCACIANGDQAgAigCACIAQf8ATQRAIABBAnRBgLQJaigCACABcQ0BCyACQQRqIQIMAQsLIAILSQEBfwNAIAEgAkZFBEBBACEAIAMgASgCACIEQf8ATQR/IARBAnRBgLQJaigCAAVBAAs2AgAgA0EEaiEDIAFBBGohAQwBCwsgAQslAEEAIQAgAkH/AE0EfyACQQJ0QYC0CWooAgAgAXFBAEcFQQALCwkAIAAQ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AkAgAEH8AWogAEH4AWoQWw0AIAAoArABIAEQJSACakYEQCABECUhAyABIAEQJUEBdBBBIAEgARBVEEEgACADIAFBABBDIgJqNgKwAQsgAEH8AWoiAxCDASAAQQdqIABBBmogAiAAQbABaiAALADPASAALADOASAAQcABaiAAQRBqIABBDGogAEEIaiAAQdABahCIBw0AIAMQlgEaDAELCwJAIABBwAFqECVFDQAgAC0AB0EBRw0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCsAEgBBCPCzgCACAAQcABaiAAQRBqIAAoAgwgBBCvASAAQfwBaiAAQfgBahBbBEAgBCAEKAIAQQJyNgIACyAAKAL8ASABEDUaIABBwAFqEDUaIABBgAJqJAALjwMBAX8jAEGAAmsiACQAIAAgAjYC+AEgACABNgL8ASADEKgCIQYgAEHEAWogAyAAQfcBahClBCAAQbgBahBUIgEgARBVEEEgACABQQAQQyICNgK0ASAAIABBEGo2AgwgAEEANgIIA0ACQCAAQfwBaiAAQfgBahBbDQAgACgCtAEgARAlIAJqRgRAIAEQJSEDIAEgARAlQQF0EEEgASABEFUQQSAAIAMgAUEAEEMiAmo2ArQBCyAAQfwBaiIDEIMBIAYgAiAAQbQBaiAAQQhqIAAsAPcBIABBxAFqIABBEGogAEEMakHAsQkQ2QMNACADEJYBGgwBCwsCQCAAQcQBahAlRQ0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCtAEgBCAGEJALNwMAIABBxAFqIABBEGogACgCDCAEEK8BIABB/AFqIABB+AFqEFsEQCAEIAQoAgBBAnI2AgALIAAoAvwBIAEQNRogAEHEAWoQNRogAEGAAmokAAuPAwEBfyMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIAMQqAIhBiAAQcQBaiADIABB9wFqEKUEIABBuAFqEFQiASABEFUQQSAAIAFBABBDIgI2ArQBIAAgAEEQajYCDCAAQQA2AggDQAJAIABB/AFqIABB+AFqEFsNACAAKAK0ASABECUgAmpGBEAgARAlIQMgASABECVBAXQQQSABIAEQVRBBIAAgAyABQQAQQyICajYC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AjgCQCABQeIlQQBBARA2BEAgASgCECgCCA0BCyACLQCbAUEEcQ0AQZqwBEEAEDdBfyEBDAELAkAgBQRAIAVBgCAQTyIGNgIAIAYNAQtBwf4AQQAQN0F/IQEMAQsgAkKAIDcCLCACIAY2AiggACABEJ8GIQEgAhCHBCABRQRAIAUgAigCKDYCACADIAIoAjA2AggLIAAQlQQLIARBEGokACADKAIMIQACQCABRQRAIAAhBwwBCyAAEBgLIANBEGokACAHCwsAEPYMELwMEJMKCzUAIAFB4iVBAEEBEDYEQCABKAIQKAKUASIABEAgASAAEQEAIAEoAhBBADYClAELIAEQ0wkLCwsAIAAgASACEJQGCwwAIAAQlwYgABCWBgsFABCVBgsHACAAELkBCwsAIAAgASACEJAHCw0AIAAgASACQQIQ4wYLDQAgACABIAJBARDjBgsNACAAIAEgAkEAEOMGCwsAIAAgAUEBEJIBCxwAIAAgACABQQEQjQEgACACQQEQjQFBAEEBEF4LCwAgACABQQEQjQELCwAgACABQQEQjAELCwAgACABQQAQjAELCQAgACABENUCCwkAIAAgARCsAQs2AQF/QQBBAUHC8ABBvdEBELUFGhD2DBC8DBCTCiAAENwNA0BBABDcDSIBBEAgARC5AQwBCwsLRwEBfyMAQRBrIgMkACADQQA7AA0gA0EAOgAPIANBAkEAIAIbIAFyOgAMIAMgAygCDDYCCCAAIANBCGpBABDjASADQRBqJAALsAMCBX8BfiMAQRBrIgMkACADQQA2AgwCfxCVBiEEIwBB4ABrIgEkACABQgA3A1ggAUIANwNQIAFCADcDSAJAAkACf0EAIABFDQAaAkADQCACQQVHBEAgACACQQJ0QbCWBWooAgAQLkUNAiACQQFqIQIMAQsLIAEgADYCAEHu+wQgARA3QQAMAQsgBCACQQJ0aigCQCECIAFCADcDQEEAIQADQCACBEAgAUE4aiACKAIEQToQ0AECQCAABEAgASABKQNANwMoIAEgASkDODcDICABQShqIAFBIGoQ+gYNAQsgASgCOCIARQ0EIAAgASgCPCIAEJACIgVFDQUgASAFNgJcIAFByABqQQQQJiEAIAEoAkggAEECdGogASgCXDYCAAsgASABKQM4IgY3A0AgBqchACACKAIAIQIMAQsLIAFB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iAFqQQAQGUECdGogAygCuAEQzgwEQCADIAMpA7gBNwOAASADIAMpA7ABNwN4IAchAiADKAKwASADQfgAakEAEBlBAnRqIAMoArgBENAMIgsNAUEAIQtBouwDQQAQKkEAIQIDQCACIAMoArgBTw0FIAMgAykDuAE3A1AgAyADKQOwATcDSCADQcgAaiACEBkhBAJAAkACQCADKALAASIFDgICAAELIAMoArABIARBAnRqKAIAEBgMAQsgAygCsAEgBEECdGooAgAgBREBAAsgAkEBaiECDAALAAsCQCAMDQAgA0GYAWogABD9AiAAQQhBCBDqBSECQcTtA0EAECogASsDACINIAK3Ig5mIA4gASsDCCIPZXIEQCADQUBrIA85AwAgAyANOQM4IAMgAjYCMEHj8AQgA0EwahCAAQwBCyADKwOYASIOIA1lIAMrA6ABIhAgD2VyRQ0AIAMgDzkDKCADIA05AyAgAyAQOQMYIAMgDjkDEEGV8QQgA0EQahCAAQtBACECA0AgAiADKAK4AU8NBCADIAMpA7gBNwMIIAMgAykDsAE3AwAgAyACEBkhBAJAAkACQCADKALAASIFDgICAAELIAMoArABIARBAnRqKAIAEBgMAQsgAygCsAEgBEECdGooAgAgBREBAAsgAkEBaiECDAALAAsDQCACRQRAQQAhAgNAIAIgAygCuAFPDQYgAyADKQO4ATcDYCADIAMpA7ABNwNYIANB2ABqIAIQGSEEAkACQAJAIAMoAsABIgUOAgIAAQsgAygCsAEgBEECdGooAgAQGAwBCyADKAKwASAEQQJ0aigCACAFEQEACyACQQFqIQIMAAsACyACKAIQIANBmAFqIAIgC0EAEMUMIAMpA5gBNwOQASADKAK4AUEATgRAIANBsAFqQQQQjAIgAyADKQO4ATcDcCADIAMpA7ABNwNoIAIgAygCsAEgA0HoAGpBABAZQQJ0aiADKAK4AUEAEMQMIAIoAhAoArABIQIMAQsLQYnNAUGDugFBggJBzDAQAAALQYnNAUGDugFB4QFBzDAQAAALIAAgChAdIQoMBQtBASEMCyADQbABaiICQQQQMSACEDQLIAAgBxAwIQcMAAsACwsgCwRAIAsQzwwLIANB0AFqJAAgDAtbAQJ/IAAQHCEBA0AgAQRAIAAgARAsIQIDQCACBEAgAhDAAiAA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AAAAUkCjoDkDMCAEIAUrAzhEAAAAAAAAUkCjIAOhOQM4CyAAIAQ2AiQgACAGKAIMIgE2AiAgBCABIAAgAEEQahDnDEEACyAGQRBqJAALEQAgACABQeD+CkHc/goQ5QYLLQECfUF/IAIgACgCAEECdGoqAgAiAyACIAEoAgBBAnRqKgIAIgReIAMgBF0bCxIAIABBNGoQ9QMgAEEoahD1AwsJACAAEJINEBgLGQECfiAAKQMIIgIgASkDCCIDViACIANUawsdACAAKAIAQQR2IgAgASgCAEEEdiIBSyAAIAFJawtEAgF/AnwgACgCBCgCBCABKAIEKAIERgRAIAAoAgBFIAEoAgBBAEdxDwsgACsDECIDIAErAxAiBGQEf0EABSADIARjCwsJACAAEKENEBgLCQAgABDsBxAYC4kIAgl/AnwjAEGgAWsiAyQAIAAQog0gA0EANgKcASAAQQRqIQcgAEEkaiEEAkACQAJAA0AgBCgCACECRP///////+9/IQogBCgCBCIFIQEDfCACIAVGBHwgCkRIr7ya8td6vmNFIAEgBUZyRQRAIAEgBCgCBEEEaygCADYCACAEIAQoAgRBBGs2AgQLIAoFIAogAigCACIGELUCIgtkBEAgAyAGNgKcASALIQogAiEBCyACQQRqIQIMAQsLREivvJry13q+YwRAIAMoApwBIgItABxBAUYNAiADIAIoAgAoAiAiATYCBCADIAIoAgQiBigCICIFNgKYASABIAVHBEAgASAFIAIQrw0MAgsgCEGRzgBODQMgAigCACEJIwBBEGsiBSQAIAEgASgCACgCAEEAEOAFIAUgASAGIAlBAEEAQQAQ8AcgBSgCCCEGIAVBEGokACABIANBBGoiBSADQZgBaiAGEO8HIAFBAToAKCADIAY2AhAgBCADQRBqIgEQwAEgAygCBCADKAKYASACEK8NIAEgByAFEPYDIAhBAWohCAwBCwsgBxDeBUEAIQEDQCABIAAoAhxPDQMgAUECdCABQQFqIQEgACgCGGooAgAiBBC1AkRIr7ya8td6vmNFDQALIANBEGoiAUHIlAk2AjggAUG0lAk2AgAgAUHUlAkoAgAiADYCACABIABBDGsoAgBqQdiUCSgCADYCACABIAEoAgBBDGsoAgBqIgJBADYCFCACIAFBBGoiADYCGCACQQA2AgwgAkKC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ACxBAXEEQCACQQFxRQ0CIAErABAiESADKwAQIhJjDQIgESASZA0BIAErABgiESADKwAYIhJjDQIgESASZCECCyACDQIgAS0AVCECIAMtAFRBAXEEQCACQQFxRQ0CIAErADgiESADKwA4IhJjDQIgESASZA0BIAErAEAiESADKwBAIhJjDQIgESASZCECCyACDQIgBygCECgCpAFBwAFxIgEgACgCECgCpAFBwAFxIgJJDQEgASACSw0AQX8hAiAHKAIAQQR2IgEgACgCAEEEdiIASQ0CIAAgAUkhAgwCC0EBIQIMAQtBfyECCyAFQbAEaiQAIAILQAICfAF/IAArAwAiAiABKwMAIgNkBEAgACsDCCABKwMIZUUPCyACIANjBH9BAEF/IAArAwggASsDCGYbBUEACwv0AgEJfyMAQRBrIgYkACAAKAIwIQEjAEEQayIDJAADQAJAQQAhByACIAEoAgBPDQADQCACQQV0IgUgASgCBGoiCEEIaiEEIAgoABAgB00EQCAEQQQQMSABKAIEIAVqQQhqEDQgAkEBaiECDAMFIAMgBCkCCDcDCCADIAQpAgA3AwAgAyAHEBkhBAJAAkACQCABKAIEIAVqIgUoAhgiCA4CAgABCyAFKAIIIARBAnRqKAIAEBgMAQsgBSgCCCAEQQJ0aigCACAIEQEACyAHQQFqIQcMAQsACwALCyABKAIEEBggARAYIANBEGokACAAQRhqIQEDQCAAKAAgIAlLBEAgBiABKQIINwMIIAYgASkCADcDACAGIAkQGSECAkACQAJAIAAoAigiAw4CAgABCyABKAIAIAJBAnRqKAIAEBgMAQsgASgCACACQQJ0aigCACADEQEACyAJQQFqIQkMAQsLIAFBBBAxIAEQNCAAEBggBkEQaiQACxsBAnxBfyAAKwMAIgIgASsDACIDZCACIANjGwsPACAAKAIQEJkBGiAAEBgLIAECfEEBQX9BACAAKwMAIgIgASsDACIDYxsgAiADZBsLWgIBfAF/QX8gACsDCCABKwMIoSICREivvJry13o+ZCACREivvJry13q+YxsiAwR/IAMFQX8gACsDACABKwMAoSICREivvJry13o+ZCACREivvJry13q+YxsLC1oCAXwBf0F/IAArAwAgASsDAKEiAkRIr7ya8td6PmQgAkRIr7ya8td6vmMbIgMEfyADBUF/IAArAwggASsDCKEiAkRIr7ya8td6PmQgAkRIr7ya8td6vmMbCwuTAQEFfyMAQRBrIgIkACAAQQRqIQEDQCADIAAoAgxPRQRAIAIgASkCCDcDCCACIAEpAgA3AwAgAiADEBkhBAJAAkACQCAAKAIUIgUOAgIAAQsgASgCACAEQQJ0aigCABAYDAELIAEoAgAgBEECdGooAgAgBREBAAsgA0EBaiEDDAELCyABQQQQMSABEDQgAkEQaiQACyUAIAAoAgAoAhAoAvgBIgAgASgCACgCECgC+AEiAUogACABSGsLEgAgAUHatgEgAigCCEEBEDYaCxIAIAFB6bYBIAIoAgRBARA2GgsSACABQcq2ASACKAIAQQEQNhoLGQBBfyAAKAIAIgAgASgCACIBSyAAIAFJGwslACAAKAIAKAIQKAL0ASIAIAEoAgAoAhAoAvQBIgFKIAAgAUhrCyUAIAEoAgAoAhAoAvQBIgEgACgCACgCECgC9AEiAEogACABSmsLIwAgACgCECgCAEEEdiIAIAEoAhAoAgBBBHYiAUsgACABSWsLlQEBBH8jAEEQayIBJAAgAARAA0AgACgACCACTQRAIABBBBAxIAAQNAUgASAAKQIINwMIIAEgACkCADcDACABIAIQGSEDAkACQAJAIAAoAhAiBA4CAgABCyAAKAIAIANBAnRqKAIAEBgMAQsgACgCACADQQJ0aigCACAEEQEACyACQQFqIQIMAQsLCyAAEBggAUEQaiQACxQAIAAoAhBBHGogAEcEQCAAEBgLC44BAgF/BHwjAEEwayIDJAAgAyABKAIIIgQ2AiQgAyAENgIgIABBivwEIANBIGoQHiACKwMAIQUgAisDECEGIAIrAwghByACKwMYIQggAyABKAIINgIQIAMgCCAHoEQAAAAAAADgP6I5AwggAyAGIAWgRAAAAAAAAOA/ojkDACAAQbH5BCADEB4gA0EwaiQACwIAC90DAgF/AnwjAEGgAWsiBCQAAkACQCAABEAgAUUNASABKAIIRQ0CIAEoAkQEQCAEIAIpAwA3A2AgBCACKQMINwNoIAQgAikDGDcDiAEgBCACKQMQNwOAASAEIAQrA2giBTkDmAEgBCAEKwNgIgY5A3AgBCAEKwOAATkDkAEgBCAEKwOIATkDeCADBEBBACECIABBpssDQQAQHgNAIAJBBEZFBEAgBCAEQeAAaiACQQR0aiIDKwMAOQNQIAQgAysDCDkDWCAAQd7JAyAEQdAAahAeIAJBAWohAgwBCwsgBCAFOQNIIAQgBjkDQCAAQd7JAyAEQUBrEB4gBCABKAIINgI0IARBBDYCMCAAQbn5AyAEQTBqEB4LQQAhAiAAQabLA0EAEB4DQCACQQRGRQRAIAQgBEHgAGogAkEEdGoiAysDADkDICAEIAMrAwg5AyggAEHeyQMgBEEgahAeIAJBAWohAgwBCwsgBCAFOQMYIAQgBjkDECAAQd7JAyAEQRBqEB4gBCABKAIINgIEIARBBDYCACAAQdr5AyAEEB4LIARBoAFqJAAPC0HEvwFBqr0BQc8BQci/ARAAAAtBrCZBqr0BQdABQci/ARAAAAtB7pgBQaq9AUHRAUHIvwEQAAAL/gEBBX8gACgCRCEEIAAoAkghASMAQRBrIgMkACADQQA2AgwCQCABQQACf0HYggsoAgAiAARAIANBDGohAgNAIAAgBCAAKAIARg0CGiACBEAgAiAANgIACyAAKAIkIgANAAsLQQALIgAbRQRAQWQhAQwBCyABIAAoAgRHBEBBZCEBDAELIAAoAiQhAgJAIAMoAgwiBQRAIAUgAjYCJAwBC0HYggsgAjYCAAsgACgCECICQSBxRQRAIAQgASAAKAIgIAIgACgCDCAAKQMYEA0aCyAAKAIIBEAgACgCABAYC0EAIQEgAC0AEEEgcQ0AIAAQGAsgA0EQaiQAIAEQ5AMaC4gEAgR/AnwjAEGAAWsiAyQAAkACQCAABEAgAUUNASABKAIIRQ0CAkACQCABKAJEBEAgASgCTCIEQZMDRg0BIAEgBBEBACABQQA2AkwgAUIANwJECyABEOsJRQ0BIAEoAhQQ6gshBgJAIAEoAhhBfnFBBkYEQCAGIANBIGoQ6AsgASADKAI4IgQ2AkgCfyAEQf////8HTwRAQfyAC0EwNgIAQX8MAQtBQQJ/AkAgBEEBQQIgBkIAQSgQTyIFQQhqIAUQDCIHQQBOBEAgBSAGNgIMDAELIAUQGCAHDAELIAVBATYCICAFQgA3AxggBUECNgIQIAUgBDYCBCAFQdiCCygCADYCJEHYggsgBTYCACAFKAIACyIEIARBQUYbEOQDCyEEIAFBAToAECABIARBACAEQX9HGyIENgJEDAELIAEoAkQhBAsgBARAIAFBkwM2AkwLIAEQzQYgASgCREUNAQsgASsDICEIIAIrAwAhCSADIAIrAwggASsDKKE5AxggAyAJIAihOQMQIABBq5QEIANBEGoQHgJAIAEtABBBAUYEQCAAIAEQ7QkMAQsgAyABKAIMNgIAIABBvcAEIAMQHgsgAEHurwRBABAeCyADQYABaiQADwtBxL8BQaq9AUGSAUGxKhAAAAtBrCZBqr0BQZMBQbEqEAAAC0HumAFBqr0BQZQBQbEqEAAAC4ACACMAQRBrIgIkAAJAAkACQAJAIAAEQCAAKAIQIgNFDQEgAUUNAiABKAIIRQ0DIAMoAghFDQQgAEGy2ANBABAeIABBu9gDQQAQHiAAQZnYA0EAEB4gAEHr2QRBABAeIABB0dwEQQAQHiAAQbzQA0EAEB4gAiABKAIINgIAIABBldADIAIQHiAAQb7QA0EAEB4gAEGW2ANBABAeIAJBEGokAA8LQcS/AUGqvQFB8gBB7O0AEAAAC0Gf9QBBqr0BQfMAQeztABAAAAtBrCZBqr0BQfQAQeztABAAAAtB7pgBQaq9AUH1AEHs7QAQAAALQfLqAEGqvQFB9wBB7O0AEAAAC8UCAQR8IwBBoAFrIgMkAAJAAkAgAARAIAFFDQEgASgCCCIBRQ0CIAMgATYCnAEgA0EANgKYASADQoCAgIDQADcDkAEgA0IANwOIASADQgA3A4ABIANCADcDeCADQQA2AnAgA0KBgICAcDcDaCADQoCAgIBwNwNgIANCADcDWCADQoKAgIDQADcDUCAAQdX9AyADQdAAahAeIAIrAxghBSACKwMQIQYgAisDACEEIAMgAisDCCIHOQNIIANBQGsgBDkDACADIAc5AzggAyAGOQMwIAMgBTkDKCADIAY5AyAgAyAFOQMYIAMgBDkDECADIAc5AwggAyAEOQMAIABB1qcEIAMQHiADQaABaiQADwtBxL8BQaq9AUHcAEG3gQEQAAALQawmQaq9AUHdAEG3gQEQAAALQe6YAUGqvQFB3gBBt4EBEAAAC84CAQR8IwBB4ABrIgMkAAJAAkAgAARAIAFFDQEgASgCCEUNAiACKwMIIQQgAisDGCEFIAIrAxAiBiACKwMAIgegIAYgB6EiB6FEAAAAAAAA4D+iIQYgAEGbxAMQGxogACABKAIIEBsaIAUgBKAgBSAEoSIFoEQAAAAAAADgv6IhBAJAIAAoAugCBEAgAyAEOQNYIAMgBjkDUCADIAc5A0ggAyAFOQNAIABB8rkDIANBQGsQHiAAKALoAiEBIAMgBDkDMCADIAY5AyggAyABNgIgIABB/8UDIANBIGoQHgwBCyADIAQ5AxggAyAGOQMQIAMgBTkDCCADIAc5AwAgAEGjuQMgAxAeCyAAQc3UBBAbGiADQeAAaiQADwtBxL8BQaq9AUEwQe78ABAAAAtBrCZBqr0BQTFB7vwAEAAAC0HumAFBqr0BQTJB7vwAEAAACyUBAX8jAEEQayICJAAgAiABNgIAIABB2v4DIAIQHiACQRBqJAALkgMCBH8EfCMAQcABayIDJAAgAEGvsAQQGxpB9PwKQfD8CigCAEEGazYCACADQZgBaiIFIAAoAhBBEGpBKBAfGiAFQwAAAAAQvAMhBSADIAI2ApQBIANBzJcBNgKQASAAQYrqBCADQZABahAeA0AgAiAERgRAIABBntwEEBsaIAArA+gDIQcgACsD8AMhCCADQoCAgICAgID4PzcDYCADIAg5A1ggAyAHOQNQIABBq9MEIANB0ABqEB4gA0FAayAAKALoArK7OQMAIANCADcDOCADQgA3AzAgAEGH0wQgA0EwahAeIANB9PwKKAIANgIgIANCADcDECADQgA3AxggAEGm1AQgA0EQahAeIAMgBTYCACAAQcDOAyADEB4gBRAYIANBwAFqJAAFIAEgBEEEdGoiBisDACEHIAYrAwghCCAAKwP4AyEJIAArA4AEIQogAyAAKAIQKwOgATkDiAEgA0IANwOAASADIAggCqA5A3ggAyAHIAmgOQNwIABBkKYEIANB8ABqEB4gBEEBaiEEDAELCwu9BAIEfwR8IwBBgAJrIgQkACAAQa+JBBAbGkEAIQNB9PwKQfD8CigCAEEEazYCACAEQcgBaiIFIAAoAhBBOGpBKBAfGiAFQwAAAAAQvAMhByAEQgA3A/gBIARB2pcBNgLAASAEIAJBAmo2AsQBIARCADcD8AEgBEHwAWpBiuoEIARBwAFqEHQDQCACIANHBEAgASADQQR0aiIGKwMAIQggBisDCCEJIAArA/gDIQogACsDgAQhCyAEIAAoAhArA6ABOQO4ASAEQgA3A7ABIAQgCSALoDkDqAEgBCAIIAqgOQOgASAEQfABakGQpgQgBEGgAWoQdCADQQFqIQUgAwRAIAUiAyACRw0CCyAAKwP4AyEIIAYrAwAhCSAAKwOABCEKIAYrAwghCyAEIAAoAhArA6ABOQOYASAEQgA3A5ABIAQgCyAKoDkDiAEgBCAJIAigOQOAASAEQfABakGQpgQgBEGAAWoQdCAFIQMMAQsLIAQgBEHwAWoiARD/BTYCcCAAQZjcBCAEQfAAahAeIAArA+gDIQggACsD8AMhCSAEQoCAgICAgID4PzcDYCAEIAk5A1ggBCAIOQNQIABBq9MEIARB0ABqEB4gBEFAayAAKALoArK7OQMAIARCADcDOCAEQgA3AzAgAEGH0wQgBEEwahAeIARB9PwKKAIAQQJrNgIgIARCADcDECAEQgA3AxggAEGm1AQgBEEQahAeIAQgBzYCACAAQcDOAyAEEB4gBxAYIAEQXCAEQYACaiQAC9YGAgR/BHwjAEGgA2siBCQAIABBkI0EEBsaQfT8CkHw/AooAgBBAms2AgAgBEH4AmoiBiAAKAIQQRBqQSgQHxogBkMAAAAAELwDIQYgBCACQQFqNgL0AiAEQcyXATYC8AIgAEGK6gQgBEHwAmoQHgNAIAIgBUYEQAJAIAArA/gDIQggASsDACEJIAArA4AEIQogASsDCCELIAQgACgCECsDoAE5A8gCIARCADcDwAIgBCALIAqgOQO4AiAEIAkgCKA5A7ACIABBkKYEIARBsAJqEB4gAEGy3AQQGxogACsD6AMhCCAAKwPwAyEJIARCgICAgICAgPg/NwOgAiAEIAk5A5gCIAQgCDkDkAIgAEGr0wQgBEGQAmoQHiAEIAAoAugCsrs5A4ACIARCADcD+AEgBEIANwPwASAAQYfTBCAEQfABahAeQQAhBSAEQfT8CigCAEECazYC4AEgBEIANwPQASAEQgA3A9gBIABBptQEIARB0AFqEB4gBCAGNgLAASAAQcDOAyAEQcABahAeIAYQGCADRQ0AIARBmAFqIgMgACgCEEE4akEoEB8aIANDAACAPhC8AyEDIAQgAjYCkAEgAEH66QQgBEGQAWoQHgNAIAIgBUYEQCAAQbbOAxAbGiAAKwPoAyEIIAArA/ADIQkgBEKAgICAgICA+D83A2AgBCAJOQNYIAQgCDkDUCAAQavTBCAEQdAAahAeIARBQGsgACgC6AKyuzkDACAEQgA3AzggBEIANwMwIABBh9MEIARBMGoQHiAEQfT8CigCAEECazYCICAEQgA3AxAgBEIANwMYIABBptQEIARBEGoQHiAEIAM2AgAgAEHAzgMgBBAeIAMQGAUgASAFQQR0aiIGKwMAIQggBisDCCEJIAArA/gDIQogACsDgAQhCyAEQgA3A4ABIAQgCSALoDkDeCAEIAggCqA5A3AgAEGZ3wEgBEHwAGoQHiAFQQFqIQUMAQsLCwUgASAFQQR0aiIHKwMAIQggBysDCCEJIAArA/gDIQogACsDgAQhCyAEIAAoAhArA6ABOQPoAiAEQgA3A+ACIAQgCSALoDkD2AIgBCAIIAqgOQPQAiAAQZCmBCAEQdACahAeIAVBAWohBQwBCwsgBEGgA2okAAupBQICfwl8IwBB8AJrIgMkACAAQe2uBBAbGkH0/ApB8PwKKAIAQQZrNgIAIAArA4AEIQwgACsD+AMhDSAAKAIQIgQrA6ABIQUgACsD6AMhBiABKwMAIQcgASsDECEIIAArA/ADIQogASsDCCELIAErAxghCSADQbgCaiIBIARBEGpBKBAfGiABQwAAAAAQvAMhASADQgA3A+gCIANCgICAgICAgPg/NwOgAiADQgA3A+ACIAMgBSAGIAggB6GiIgUgCiAJIAuhoiIIoCIJo0QAAAAAAADgP6JEAAAAAAAAFECiOQOoAiADQeACaiIEQfylBCADQaACahB0IAMgCDkDkAIgAyAJRAAAAAAAANA/ojkDiAIgAyAFOQOAAiAEQavTBCADQYACahB0IAMgACgC6AKyuzkD8AEgA0IANwPoASADQoCAgICAgKCrwAA3A+ABIARBh9MEIANB4AFqEHQgA0H0/AooAgA2AtABIAMgBiAHIA2goiIGOQPAASADIAogCyAMoKIiBzkDyAEgBEGm1AQgA0HAAWoQdCADIAE2ArABIARBwM4DIANBsAFqEHQgACAEEP8FEBsaIAEQGCACBEAgA0GIAWoiASAAKAIQQThqQSgQHxogAUMAAAAAELwDIQEgA0IANwOAASADQgA3A3ggA0IANwNwIABBs90EIANB8ABqEB4gA0KAgICAgICA+D83A2AgAyAIOQNYIAMgBTkDUCAAQavTBCADQdAAahAeIANBQGsgACgC6AKyuzkDACADQgA3AzggA0IANwMwIABBh9MEIANBMGoQHiADQfT8CigCADYCICADIAY5AxAgAyAHOQMYIABBptQEIANBEGoQHiADIAE2AgAgAEHAzgMgAxAeIAEQGAsgA0HgAmoQXCADQfACaiQAC+gDAgN/BnwjAEHQAWsiAyQAIAIoAgAhBCACKAIEIgUrAxAhBiADIAUoAgA2ArABIAMgBjkDqAEgAyAENgKgASAAQY/+AyADQaABahAeQfT8CkHw/AooAgBBCWs2AgACfCABKwMAIgYgAi0AMCIEQewARg0AGiAEQfIARgRAIAYgAisDIKEMAQsgBiACKwMgRAAAAAAAAOC/oqALIQYgACsD8AMhByAAKwOABCEIIAErAwghCSAAKwPoAyEKIAArA/gDIQsgA0H4AGoiASAAKAIQQRBqQSgQHxogAUMAAAAAELwDIQEgA0IANwPIASADQgA3A8ABIAIoAgQoAgAhBCACKAIAIQUgA0IANwNwIANCgICAgICAgOg/NwNoIAMgBTYCZCADIAQ2AmAgA0HAAWoiBEGX3AMgA0HgAGoQdCADIAIoAgQrAxAgACsD6AOiOQNQIARB7KUEIANB0ABqEHQgA0FAayAAKALoArK7OQMAIANCADcDOCADQgA3AzAgBEGH0wQgA0EwahB0IANB9PwKKAIANgIgIAMgCiAGIAugojkDECADIAcgCSAIoKI5AxggBEGm1AQgA0EQahB0IAMgATYCACAEQcDOAyADEHQgACAEEP8FEBsaIAQQXCABEBggA0HQAWokAAscACAAQYmyBBAbGkHw/ApB8PwKKAIAQQVqNgIACxwAIABB97EEEBsaQfD8CkHw/AooAgBBBWs2AgALCwAgAEGitAQQGxoLLQEBfyMAQRBrIgEkACABIAAoAhAoAggQITYCACAAQZyBBCABEB4gAUEQaiQACwsAIABB84cEEBsaCxwAIABB3ocEEBsaQfD8CkHw/AooAgBBAms2AgALCwAgAEHYswQQGxoLCwAgAEHGswQQGxoLpgICB38BfiMAQTBrIgQkACAEQQxqQQBBJBA4GiAEIAE2AhwgACABEG4hAgNAIAIEQCAAIAIgARByIAAgAkEAEM4IIQIMAQsLIAEpAwghCkEAIQFBACEDAkAgACgCMCICBEAgCqchBSACKAIAIgYEQEEBIAIoAgh0IQMLIANBAWshBwNAIAEgA0YNAgJAAkAgBiABIAVq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b3BlbkF0dHJpYnV0ZUVudGl0aWVzID09IG9wZW5FbnRpdHkAaW5maW5pdHkAbGlzdC0+c2l6ZSA8IGxpc3QtPmNhcGFjaXR5AHJldC5zaXplIDwgcmV0LmNhcGFjaXR5AGZhbnRhc3kAL3N2Zy9pdm9yeQBvdXQgb2YgbWVtb3J5AEZlYnJ1YXJ5AEphbnVhcnkAZ3ZwbHVnaW5fZG90X2xheW91dF9MVFhfbGlicmFyeQBndnBsdWdpbl9uZWF0b19sYXlvdXRfTFRYX2xpYnJhcnkAZ3ZwbHVnaW5fY29yZV9MVFhfbGlicmFyeQBnYXRoZXJfdGltZV9lbnRyb3B5AGNvcHkAYWxiYW55AEp1bHkAU3BhcnNlTWF0cml4X211bHRpcGx5AGVxdWFsbHkAYXNzZW1ibHkAc3VtbWVyc2t5AHNoeQBzYXRpc2Z5AGJlYXV0aWZ5AG5vanVzdGlmeQBDbGFzc2lmeQAvc3ZnL2xpZ2h0Z3JleQAvc3ZnL2RpbWdyZXkAL3N2Zy9kYXJrZ3JleQAvc3ZnL2xpZ2h0c2xhdGVncmV5AC9zdmcvZGFya3NsYXRlZ3JleQAvc3ZnL3NsYXRlZ3JleQB3ZWJncmV5AHgxMWdyZXkAL3N2Zy9ncmV5AG1vdmUgdG8gZnJvbnQgbG9jayBpbmNvbnNpc3RlbmN5AGV4dHJhY3RfYWRqYWNlbmN5AG1lcmdlX29uZXdheQBhcnJheQBhbGxvY0FycmF5AC9zdmcvbGlnaHRncmF5AC9zdmcvZGltZ3JheQAvc3ZnL2RhcmtncmF5AC9zdmcvbGlnaHRzbGF0ZWdyYXkAL3N2Zy9kYXJrc2xhdGVncmF5AC9zdmcvc2xhdGVncmF5AHdlYmdyYXkAeDExZ3JheQAvc3ZnL2dyYXkAVGh1cnNkYXkAVHVlc2RheQBXZWRuZXNkYXkAU2F0dXJkYXkAU3VuZGF5AE1vbmRheQBGcmlkYXkATWF5AC4uLy4uL2xpYi9jZ3JhcGgvZ3JhbW1hci55ACVtLyVkLyV5AHBvcnRob3l4AHBvcnRob195eAB4eHgAcHgAYm94AHZpZXdCb3gAY2hrQm91bmRCb3gAL01lZGlhQm94AGdldF9lZGdlX2xhYmVsX21hdHJpeABpZGVhbF9kaXN0YW5jZV9tYXRyaXgAbXVzdCBub3QgdW5kZWNsYXJlIHByZWZpeAB1bmJvdW5kIHByZWZpeABodG1sbGV4AG1heAAjJTAyeCUwMnglMDJ4ACMlMnglMnglMnglMngAIyUxeCUxeCUxeAAtKyAgIDBYMHgALTBYKzBYIDBYLTB4KzB4IDB4AHJhcnJvdwBsYXJyb3cASGVsdmV0aWNhLU5hcnJvdwBhcnJvd19sZW5ndGhfY3JvdwAvc3ZnL3Nub3cAc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nX3Nsb3cAL3N2Zy9saWdodHllbGxvdwAvc3ZnL2dyZWVueWVsbG93AC9zdmcvbGlnaHRnb2xkZW5yb2R5ZWxsb3cAL3N2Zy95ZWxsb3cAZmF0YWwgZXJyb3IgLSBzY2FubmVyIGlucHV0IGJ1ZmZlciBvdmVyZmxvdwBmbGV4IHNjYW5uZXIgcHVzaC1iYWNrIG92ZXJmbG93AGNvdXJpZXJuZXcAU3ByaW5nU21vb3RoZXJfbmV3AFRyaWFuZ2xlU21vb3RoZXJfbmV3AGRpYWdfcHJlY29uX25ldwBRdWFkVHJlZV9uZXcAU3RyZXNzTWFqb3JpemF0aW9uU21vb3RoZXIyX25ldwBuICYmIG5ldwBza2V3AHN0cnZpZXcAL3N2Zy9ob25leWRldwAgLWFuY2hvciB3AHNvcnR2AHBvdjpwb3YATm92AGludgBlcXVpdgBwaXYAbm9uYW1lLmd2AEdEX3JhbmsoZylbcl0uYXYgPT0gR0RfcmFuayhnKVtyXS52AGNjJXNfJXp1AGNjJXMrJXp1AC9zdmcvcGVydQBudQBtdQAlYyVsbHUAVGh1AHRhdQBUYXUATnUATXUAX3BvcnRfJXNfKCVkKV8oJWQpXyV1AE51bWJlciBvZiBpdGVyYXRpb25zID0gJXUATnVtYmVyIG9mIGluY3JlYXNlcyA9ICV1AHBsYWludGV4dABzdHJlc3N3dABpbnB1dAB0ZXh0bGF5b3V0AGRvdF9sYXlvdXQAbmVhdG9fbGF5b3V0AGluaXRMYXlvdXQAY2x1c3QAbWFwQ2x1c3QAbGFiZWxqdXN0AHNjQWRqdXN0AEF1Z3VzdABlZGdlc2ZpcnN0AG5vZGVzZmlyc3QAbWF4aW1hbF9pbmRlcGVuZGVudF9lZGdlX3NldF9oZWF2ZXN0X2VkZ2VfcGVybm9kZV9zdXBlcm5vZGVzX2ZpcnN0AGV4aXN0AHJlYWxpZ25Ob2RlbGlzdABhcHBlbmROb2RlbGlzdABzbG90X2Zyb21fY29uc3RfbGlzdABzbG90X2Zyb21fbGlzdABkZWZhdWx0ZGlzdABtaW5kaXN0AHBvd2VyX2Rpc3QAZ3JhcGhfZGlzdABhdmdfZGlzdABnZXRFZGdlTGlzdABpcXVlc3QAbG93YXN0AHNwcmluZ19lbGVjdHJpY2FsX2VtYmVkZGluZ19mYXN0AGd2X3NvcnQAdmlld3BvcnQAdGFpbHBvcnQAdW5leHBlY3RlZCBwYXJzZXIgc3RhdGUgLSBwbGVhc2Ugc2VuZCBhIGJ1ZyByZXBvcnQAaGVhZHBvcnQAaHRtbF9wb3J0AGluc2VydABSVHJlZUluc2VydABmaW5kU1ZlcnQAc3RhcnQAcGFydABlc3RpbWF0ZV90ZXh0X3dpZHRoXzFwdABxdW90AH9yb290AG5vdABtYWtlX3ZuX3Nsb3QAZW1pdF94ZG90AHhkb3Q6eGRvdABlcHM6eGRvdABzdmc6eGRvdABqcGc6eGRvdABwbmc6eGRvdABqcGVnOnhkb3QAZ2lmOnhkb3QAanBlOnhkb3QAeGRvdDEuNDp4ZG90AHhkb3QxLjI6eGRvdABzZG90AG1pZGRvdABndjpkb3QAcGxhaW4tZXh0OmRvdABkb3Q6ZG90AGVwczpkb3QAY2Fub246ZG90AHBsYWluOmRvdABzdmc6ZG90AGpwZzpkb3QAcG5nOmRvdABqcGVnOmRvdABnaWY6ZG90AGpwZTpkb3QAf2JvdABkb0RvdABzcGFuLT5mb250AHZhZ3hicHJpbnQAZW5kcG9pbnQAeGRvdF9wb2ludABkZWNpZGVfcG9pbnQAVW5zYXRpc2ZpZWQgY29uc3RyYWludAB0cmFuc3BhcmVudABjb21wb25lbnQAaW52YWxpZCBhcmd1bWVudABjb21tZW50AGp1bmsgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudABjZW50AGkgPT0gZWNudABhcmlhbG10AGdldF9oYXNoX3NlY3JldF9zYWx0AGNpcmN1aXQAcG9seV9pbml0AE11bHRpbGV2ZWxfaW5pdABuc2xpbWl0AG1jbGltaXQAUG9ydHJhaXQAbGlnaHQAdmlydHVhbF93ZWlnaHQAbGhlaWdodABLUF9SaWdodABCb29rbWFuLUxpZ2h0AGd0AEtQX0xlZnQAY2hhcnNldABpbnNldABiaXRhcnJheV9yZXNldABndl9hcmVuYV9yZXNldABzdWJzZXQAYml0YXJyYXlfc2V0AG1hdHJpeF9zZXQAc2NhcmxldAAvc3ZnL2Rhcmt2aW9sZXQAL3N2Zy9ibHVldmlvbGV0AC9zdmcvdmlvbGV0AFRyZWJ1Y2hldABhZ3hnZXQAdGFpbHRhcmdldABsYWJlbHRhcmdldABlZGdldGFyZ2V0AGhlYWR0YXJnZXQAYml0YXJyYXlfZ2V0AHN0eWxlc2hlZXQAc3RyaWN0AGFnY29weWRpY3QAYWdtYWtlZGF0YWRpY3QAcmVjLT5kaWN0ID09IGRhdGFkaWN0AHdyaXRlX2RpY3QAaGludGVyc2VjdABndmJpc2VjdABlbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIGRlY2xhcmF0aW9uIGlzIGluY29ycmVjdABhc3BlY3QAbGF5ZXJzZWxlY3QAS1BfU3VidHJhY3QAUXVhZFRyZWVfcmVwdWxzaXZlX2ZvcmNlX2ludGVyYWN0AGNvbXBhY3QAT2N0AHJlcXVlc3RlZCBmZWF0dXJlIHJlcXVpcmVzIFhNTF9EVEQgc3VwcG9ydCBpbiBFeHBhdABsYWJlbGZsb2F0AGxhYmVsX2Zsb2F0AFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfZm9ybWF0AC9zdmcvd2hlYXQAbW9uY2hhaW5zX2F0AFNhdABBZ3JhcGhpbmZvX3QAQWdlZGdlaW5mb190AEFnbm9kZWluZm9fdABcdAByb3cgPCBtZS0+bnJvd3MAbWludXMAb3BsdXMAcmFkaXVzAGhlYXJ0cwBzYW1wbGVwb2ludHMAZGlyZWRnZWNvbnN0cmFpbnRzAGxldmVsIGFzc2lnbm1lbnQgY29uc3RyYWludHMAeHkgcHNldWRvLW9ydGhvZ29uYWwgY29uc3RyYWludHMAeXggcHNldWRvLW9ydGhvZ29uYWwgY29uc3RyYWludHMAeHkgb3J0aG9nb25hbCBjb25zdHJhaW50cwB5eCBvcnRob2dvbmFsIGNvbnN0cmFpbnRzAGxpbmUgc2VnbWVudHMAc2V0X2NlbGxfaGVpZ2h0cwByZWN0cwBhY2NvdW50aW5nUmVwb3J0U3RhdHMAZW50aXR5VHJhY2tpbmdSZXBvcnRTdGF0cwBaYXBmRGluZ2JhdHMAcmVtaW5jcm9zcwBjb21wcmVzcwBndnVzZXJzaGFwZV9maWxlX2FjY2VzcwBicmFzcwBjbGFzcwBhcHBseWF0dHJzAGFnbWFrZWF0dHJzAGJpbmRhdHRycwBwYXJzZV9sYXllcnMAbWtDbHVzdGVycwByb3VuZF9jb3JuZXJzAG1ha2VfYmFycmllcnMAY2RhdGEubnRvcGxldmVsID09IGFnbm5vZGVzKGcpIC0gY2RhdGEubnZhcnMAY2Fubm90IHJlYWxsb2Mgb3BzAGNhbm5vdCByZWFsbG9jIHBubHBzAGVwcwBjb3JlX2xvYWRpbWFnZV9wcwBlcHM6cHMAcHMyOnBzAChsaWIpOnBzAGd2X3RyaW1femVyb3MAYWd4YnVmX3RyaW1femVyb3MAdGV4Z3lyZWhlcm9zAGltYWdlcG9zAHRpbm9zAHNldEVkZ2VMYWJlbFBvcwBTZXR0aW5nIGluaXRpYWwgcG9zaXRpb25zAHhsaW50ZXJzZWN0aW9ucwBjb2x1bW5zAGRlamF2dXNhbnMAbmltYnVzc2FucwBsaWJlcmF0aW9uc2FucwBmcmVlc2FucwBzZXRDaGlsZFN1YnRyZWVTcGFucwBPcGVuU2FucwBvZmZzZXQgPT0gbl90ZXJtcwBkaXRlbXMAZGlhbXMAY29sIDwgbWUtPm5jb2xzAGNhbm5vdCByZWFsbG9jIGRxLnBubHMAY2Fubm90IHJlYWxsb2MgcG5scwBsZXZlbHMAZm9yY2VsYWJlbHMAZGlhZ29uYWxzAG1lcmdlX3JhbmtzAHNwbGl0QmxvY2tzAGludmlzAGNhbm5vdCByZWFsbG9jIHRyaXMAc2V0X2NlbGxfd2lkdGhzAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzAHllcwBzaG93Ym94ZXMAYmVhdXRpZnlfbGVhdmVzAGF0dGFjaF9lZGdlX2xhYmVsX2Nvb3JkaW5hdGVzAHBvbHlsaW5lcwBzcGxpbmVzAG9ydGhvZ29uYWwgbGluZXMAdGV4Z3lyZXRlcm1lcwBvdGltZXMAVGltZXMAZm9udG5hbWVzAHByZWZpeCBtdXN0IG5vdCBiZSBib3VuZCB0byBvbmUgb2YgdGhlIHJlc2VydmVkIG5hbWVzcGFjZSBuYW1lcwBTcGFyc2VNYXRyaXhfc3VtX3JlcGVhdF9lbnRyaWVzAHBlcmlwaGVyaWVzAEdldEJyYW5jaGVzAGYgPCBncmFwaFtqXS5uZWRnZXMAbWlubWF4X2VkZ2VzAGV4Y2hhbmdlX3RyZWVfZWRnZXMAbWFrZVN0cmFpZ2h0RWRnZXMAdW5kb0NsdXN0ZXJFZGdlcwBjb21wb3VuZEVkZ2VzAG1lcmdlX3RyZWVzAF9fY2x1c3Rlcm5vZGVzAGFnbm5vZGVzAE5EX2lkKG5wKSA9PSBuX25vZGVzAExvYWROb2RlcwBzaWRlcwBzcGFkZXMAdmVydGljZXMAY29vcmRzAHNldGJvdW5kcwBtZHMAY2RzAG1ha2VTZWxmQXJjcwBlbWl0X2VkZ2VfZ3JhcGhpY3MAY2x1YnMAY29uc29sYXMAJWxmJTJzAApTdHJpbmcgc3RhcnRpbmc6PCUuODBzAApTdHJpbmcgc3RhcnRpbmc6IiUuODBzACAlLipzACVzJXMAZXhwYXQ6IEFjY291bnRpbmcoJXApOiBEaXJlY3QgJTEwbGx1LCBpbmRpcmVjdCAlMTBsbHUsIGFtcGxpZmljYXRpb24gJTguMmYlcwAlLipzJWMlcwAgJXM6JXMAX18lZDolcwAvJXMvJXMAJXMtJXMALCVzACBmb250LWZhbWlseT0iJXMAIiBzdHJva2UtZGFzaGFycmF5PSIlcwAiIGNsYXNzPSIlcwBwb2x5ICVzACgoJWYsJWYpLCglZiwlZikpICVzICVzAGNvbG9yICVzAHJvb3QgPSAlcwAgVGl0bGU6ICVzACJzdHJpY3QiOiAlcwBjb3VyAHV0cgBhcHBlbmRhdHRyAGFkZGF0dHIAYmVnaW5zdHIAZnN0cgBzdHJ2aWV3X3N0cgBwb3ZfY29sb3JfYXNfc3RyAHZwc2MhPW51bGxwdHIAYmVuZFRvU3RyAHVhcnIAY3JhcnIAbGFycgBoYXJyAGRhcnIAdUFycgByQXJyAGxBcnIAaEFycgBkQXJyAEFwcgBTcGFyc2VNYXRyaXhfbXVsdGlwbHlfdmVjdG9yAHRlcm1pbmF0b3IAaW5zdWxhdG9yAGludGVybmFsRW50aXR5UHJvY2Vzc29yAHRleGd5cmVjdXJzb3IAc3ludGF4IGVycm9yAG1vbmV5X2dldCBlcnJvcgBFcnJvcgByZmxvb3IAbGZsb29yAGxhYmVsZm9udGNvbG9yAHBlbmNvbG9yAGZpbGxjb2xvcgBiZ2NvbG9yAHJvdyBtYWpvcgBjb2x1bW4gbWFqb3IAbmVpZ2hib3IAc3R5bGVfb3IAbXIAcmFua2RpcgBwYWdlZGlyAGxheWVyAHVwcGVyID49IGxvd2VyAE5vZGVDb3ZlcgAvc3ZnL3NpbHZlcgBjbHVzdGVyAGV4cGFuZENsdXN0ZXIAcnByb21vdGVyAGxwcm9tb3RlcgBjZW50ZXIAbWF4aXRlcgBwYXJ0aWFsIGNoYXJhY3RlcgAhIHJvb3RQYXJzZXItPm1fcGFyZW50UGFyc2VyAGRrZ3JlZW5jb3BwZXIAY29vbGNvcHBlcgBndl9zb3J0X2NvbXBhcl93cmFwcGVyAHRhcGVyAG92ZXJsYXBfYmV6aWVyAGZpZ19iZXppZXIAY291cmllcgBDb3VyaWVyAGhpZXIAZGFnZ2VyAERhZ2dlcgBvdXRwdXRvcmRlcgBwb3N0b3JkZXIAZmxhdF9yZW9yZGVyAGNlbGxib3JkZXIAZml4TGFiZWxPcmRlcgBjeWxpbmRlcgAvc3ZnL2xhdmVuZGVyAHJlbmRlcgBmb2xkZXIAY2x1c3Rlcl9sZWFkZXIATkRfVUZfc2l6ZShuKSA8PSAxIHx8IG4gPT0gbGVhZGVyAE9jdG9iZXIAcmVmZXJlbmNlIHRvIGludmFsaWQgY2hhcmFjdGVyIG51bWJlcgBOb3ZlbWJlcgBTZXB0ZW1iZXIARGVjZW1iZXIAbWFjcgBicgBzdGFyAGZlbGRzcGFyAHJlZ3VsYXIAaW9zX2Jhc2U6OmNsZWFyAGJydmJhcgBNYXIAXHIATkRfcmFuayh2KSA9PSByAHN0cmVxAHN0cnZpZXdfZXEAc3Rydmlld19zdHJfZXEAc3Rydmlld19jYXNlX3N0cl9lcQBzdHJ2aWV3X2Nhc2VfZXEAdnAAJSVCZWdpblByb2xvZwovRG90RGljdCAyMDAgZGljdCBkZWYKRG90RGljdCBiZWdpbgoKL3NldHVwTGF0aW4xIHsKbWFyawovRW5jb2RpbmdWZWN0b3IgMjU2IGFycmF5IGRlZgogRW5jb2RpbmdWZWN0b3IgMAoKSVNPTGF0aW4xRW5jb2RpbmcgMCAyNTUgZ2V0aW50ZXJ2YWwgcHV0aW50ZXJ2YWwKRW5jb2RpbmdWZWN0b3IgNDUgL2h5cGhlbiBwdXQKCiUgU2V0IHVwIElTTyBMYXRpbiAxIGNoYXJhY3RlciBlbmNvZGluZwovc3Rhcm5ldElTTyB7CiAgICAgICAgZHVwIGR1cCBmaW5kZm9udCBkdXAgbGVuZ3RoIGRpY3QgYmVnaW4KICAgICAgICB7IDEgaW5kZXggL0ZJRCBuZSB7IGRlZiB9eyBwb3AgcG9wIH0gaWZlbHNlCiAgICAgICAgfSBmb3JhbGwKICAgICAgICAvRW5jb2RpbmcgRW5jb2RpbmdWZWN0b3IgZGVmCiAgICAgICAgY3VycmVudGRpY3QgZW5kIGRlZmluZWZvbnQKfSBkZWYKL1RpbWVzLVJvbWFuIHN0YXJuZXRJU08gZGVmCi9UaW1lcy1JdGFsaWMgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGQgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGRJdGFsaWMgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYSBzdGFybmV0SVNPIGRlZgovSGVsdmV0aWNhLU9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYS1Cb2xkIHN0YXJuZXRJU08gZGVmCi9IZWx2ZXRpY2EtQm9sZE9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXIgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXItT2JsaXF1ZSBzdGFybmV0SVNPIGRlZgovQ291cmllci1Cb2xkIHN0YXJuZXRJU08gZGVmCi9Db3VyaWVyLUJvbGRPYmxpcXVlIHN0YXJuZXRJU08gZGVmCmNsZWFydG9tYXJrCn0gYmluZCBkZWYKCiUlQmVnaW5SZXNvdXJjZTogcHJvY3NldCBncmFwaHZpeiAwIDAKL2Nvb3JkLWZvbnQtZmFtaWx5IC9UaW1lcy1Sb21hbiBkZWYKL2RlZmF1bHQtZm9udC1mYW1pbHkgL1RpbWVzLVJvbWFuIGRlZgovY29vcmRmb250IGNvb3JkLWZvbnQtZmFtaWx5IGZpbmRmb250IDggc2NhbGVmb250IGRlZgoKL0ludlNjYWxlRmFjdG9yIDEuMCBkZWYKL3NldF9zY2FsZSB7CiAgICAgICBkdXAgMSBleGNoIGRpdiAvSW52U2NhbGVGYWN0b3IgZXhjaCBkZWYKICAgICAgIHNjYWxlCn0gYmluZCBkZWYKCiUgc3R5bGVzCi9zb2xpZCB7IFtdIDAgc2V0ZGFzaCB9IGJpbmQgZGVmCi9kYXNoZWQgeyBbOSBJbnZTY2FsZUZhY3RvciBtdWwgZHVwIF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2RvdHRlZCB7IFsxIEludlNjYWxlRmFjdG9yIG11bCA2IEludlNjYWxlRmFjdG9yIG11bF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2ludmlzIHsvZmlsbCB7bmV3cGF0aH0gZGVmIC9zdHJva2Uge25ld3BhdGh9IGRlZiAvc2hvdyB7cG9wIG5ld3BhdGh9IGRlZn0gYmluZCBkZWYKL2JvbGQgeyAyIHNldGxpbmV3aWR0aCB9IGJpbmQgZGVmCi9maWxsZWQgeyB9IGJpbmQgZGVmCi91bmZpbGxlZCB7IH0gYmluZCBkZWYKL3JvdW5kZWQgeyB9IGJpbmQgZGVmCi9kaWFnb25hbHMgeyB9IGJpbmQgZGVmCi90YXBlcmVkIHsgfSBiaW5kIGRlZgoKJSBob29rcyBmb3Igc2V0dGluZyBjb2xvciAKL25vZGVjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2VkZ2Vjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2dyYXBoY29sb3IgeyBzZXRoc2Jjb2xvciB9IGJpbmQgZGVmCi9ub3Bjb2xvciB7cG9wIHBvcCBwb3B9IGJpbmQgZGVmCgovYmVnaW5wYWdlIHsJJSBpIGogbnBhZ2VzCgkvbnBhZ2VzIGV4Y2ggZGVmCgkvaiBleGNoIGRlZgoJL2kgZXhjaCBkZWYKCS9zdHIgMTAgc3RyaW5nIGRlZgoJbnBhZ2VzIDEgZ3QgewoJCWdzYXZlCgkJCWNvb3JkZm9udCBzZXRmb250CgkJCTAgMCBtb3ZldG8KCQkJKFwoKSBzaG93IGkgc3RyIGN2cyBzaG93ICgsKSBzaG93IGogc3RyIGN2cyBzaG93IChcKSkgc2hvdwoJCWdyZXN0b3JlCgl9IGlmCn0gYmluZCBkZWYKCi9zZXRfZm9udCB7CglmaW5kZm9udCBleGNoCglzY2FsZWZvbnQgc2V0Zm9udAp9IGRlZgoKJSBkcmF3IHRleHQgZml0dGVkIHRvIGl0cyBleHBlY3RlZCB3aWR0aAovYWxpZ25lZHRleHQgewkJCSUgd2lkdGggdGV4dAoJL3RleHQgZXhjaCBkZWYKCS93aWR0aCBleGNoIGRlZgoJZ3NhdmUKCQl3aWR0aCAwIGd0IHsKCQkJW10gMCBzZXRkYXNoCgkJCXRleHQgc3RyaW5nd2lkdGggcG9wIHdpZHRoIGV4Y2ggc3ViIHRleHQgbGVuZ3RoIGRpdiAwIHRleHQgYXNob3cKCQl9IGlmCglncmVzdG9yZQp9IGRlZgoKL2JveHByaW0gewkJCQklIHhjb3JuZXIgeWNvcm5lciB4c2l6ZSB5c2l6ZQoJCTQgMiByb2xsCgkJbW92ZXRvCgkJMiBjb3B5CgkJZXhjaCAwIHJsaW5ldG8KCQkwIGV4Y2ggcmxpbmV0bwoJCXBvcCBuZWcgMCBybGluZXRvCgkJY2xvc2VwYXRoCn0gYmluZCBkZWYKCi9lbGxpcHNlX3BhdGggewoJL3J5IGV4Y2ggZGVmCgkvcnggZXhjaCBkZWYKCS95IGV4Y2ggZGVmCgkveCBleGNoIGRlZgoJbWF0cml4IGN1cnJlbnRtYXRyaXgKCW5ld3BhdGgKCXggeSB0cmFuc2xhdGUKCXJ4IHJ5IHNjYWxlCgkwIDAgMSAwIDM2MCBhcmMKCXNldG1hdHJpeAp9IGJpbmQgZGVmCgovZW5kcGFnZSB7IHNob3dwYWdlIH0gYmluZCBkZWYKL3Nob3dwYWdlIHsgfSBkZWYKCi9sYXllcmNvbG9yc2VxCglbCSUgbGF5ZXIgY29sb3Igc2VxdWVuY2UgLSBkYXJrZXN0IHRvIGxpZ2h0ZXN0CgkJWzAgMCAwXQoJCVsuMiAuOCAuOF0KCQlbLjQgLjggLjhdCgkJWy42IC44IC44XQoJCVsuOCAuOCAuOF0KCV0KZGVmCgovbGF5ZXJsZW4gbGF5ZXJjb2xvcnNlcSBsZW5ndGggZGVmCgovc2V0bGF5ZXIgey9tYXhsYXllciBleGNoIGRlZiAvY3VybGF5ZXIgZXhjaCBkZWYKCWxheWVyY29sb3JzZXEgY3VybGF5ZXIgMSBzdWIgbGF5ZXJsZW4gbW9kIGdldAoJYWxvYWQgcG9wIHNldGhzYmNvbG9yCgkvbm9kZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZWRnZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZ3JhcGhjb2xvciB7bm9wY29sb3J9IGRlZgp9IGJpbmQgZGVmCgovb25sYXllciB7IGN1cmxheWVyIG5lIHtpbnZpc30gaWYgfSBkZWYKCi9vbmxheWVycyB7CgkvbXl1cHBlciBleGNoIGRlZgoJL215bG93ZXIgZXhjaCBkZWYKCWN1cmxheWVyIG15bG93ZXIgbHQKCWN1cmxheWVyIG15dXBwZXIgZ3QKCW9yCgl7aW52aXN9IGlmCn0gZGVmCgovY3VybGF5ZXIgMCBkZWYKCiUlRW5kUmVzb3VyY2UKJSVFbmRQcm9sb2cKJSVCZWdpblNldHVwCjE0IGRlZmF1bHQtZm9udC1mYW1pbHkgc2V0X2ZvbnQKJSAvYXJyb3dsZW5ndGggMTAgZGVmCiUgL2Fycm93d2lkdGggNSBkZWYKCiUgbWFrZSBzdXJlIHBkZm1hcmsgaXMgaGFybWxlc3MgZm9yIFBTLWludGVycHJldGVycyBvdGhlciB0aGFuIERpc3RpbGxlcgovcGRmbWFyayB3aGVyZSB7cG9wfSB7dXNlcmRpY3QgL3BkZm1hcmsgL2NsZWFydG9tYXJrIGxvYWQgcHV0fSBpZmVsc2UKJSBtYWtlICc8PCcgYW5kICc+Picgc2FmZSBvbiBQUyBMZXZlbCAxIGRldmljZXMKL2xhbmd1YWdlbGV2ZWwgd2hlcmUge3BvcCBsYW5ndWFnZWxldmVsfXsxfSBpZmVsc2UKMiBsdCB7CiAgICB1c2VyZGljdCAoPDwpIGN2biAoWykgY3ZuIGxvYWQgcHV0CiAgICB1c2VyZGljdCAoPj4pIGN2biAoWykgY3ZuIGxvYWQgcHV0Cn0gaWYKCiUlRW5kU2V0dXAAc3VwAGdyb3VwAGN1cAB0aGluc3AAZW5zcABlbXNwAG5ic3AAcGVycAB3ZWllcnAAZ2VuZXJhdGUtY29uc3RyYWludHMuY3BwAGJsb2NrLmNwcABjc29sdmVfVlBTQy5jcHAAf3RvcABwcm9wAGFneGJwb3AAbm9wAGFzeW1wAGNvbXAAZmluZENDb21wAGJtcABzY2FsZV9jbGFtcAB4bHAAbHAgIT0gY2xwAHRhaWxfbHAAaGVhZF9scAB0YWlsdG9vbHRpcABsYWJlbHRvb2x0aXAAZWRnZXRvb2x0aXAAaGVhZHRvb2x0aXAAaGVsbGlwAHRhaWxjbGlwAGhlYWRjbGlwAC9zdmcvcGFwYXlhd2hpcABocAB0cmFuc3Bvc2Vfc3RlcABjb21wdXRlU3RlcABsYXllcmxpc3RzZXAAbGF5ZXJzZXAAaXBzZXAAcmFua3NlcABub2Rlc2VwAHN1YmdyYXBocyBuZXN0ZWQgbW9yZSB0aGFuICVkIGRlZXAAU2VwAHNmZHAAY3AAd2VicABpZG1hcABjbHVzdGVyX21hcABjbWFweDptYXAAZXBzOm1hcABjbWFweF9ucDptYXAAaW1hcF9ucDptYXAAaXNtYXA6bWFwAGltYXA6bWFwAGNtYXA6bWFwAHN2ZzptYXAAanBnOm1hcABwbmc6bWFwAGpwZWc6bWFwAGdpZjptYXAAanBlOm1hcABvdmVybGFwAGxldmVsc2dhcABjYXAAS1BfVXAAJUk6JU06JVMgJXAAc3RhcnQgPD0gcAByc3F1bwBsc3F1bwByZHF1bwBsZHF1bwBiZHF1bwBzYnF1bwByc2FxdW8AbHNhcXVvAHJhcXVvAGxhcXVvAGF1dG8ATnVuaXRvAC9zdmcvdG9tYXRvAG5lYXRvAGV1cm8AL3N2Zy9nYWluc2Jvcm8ATWV0aG9kWmVybwBtaWNybwBuaW1idXNtb25vAGxpYmVyYXRpb25tb25vAGZyZWVtb25vAGFyaW1vAHJhdGlvAHBvcnRobwByaG8AUmhvAC9zdmcvaW5kaWdvAHBpbmZvAGNjZ3JhcGhpbmZvAGNjZ25vZGVpbmZvAGNsX2VkZ2VfaW5mbwBnZXRQYWNrSW5mbwBtYWtlSW5mbwBwYXJzZVBhY2tNb2RlSW5mbwBjaXJjbwBpY28AXCUwM28AL3N2Zy9yb3N5YnJvd24AL3N2Zy9zYW5keWJyb3duAHZlcnlkYXJrYnJvd24AL3N2Zy9zYWRkbGVicm93bgAvc3ZnL2Jyb3duAEtQX0Rvd24AY2Fubm90IGNoYW5nZSBzZXR0aW5nIG9uY2UgcGFyc2luZyBoYXMgYmVndW4AU3VuAEp1bgB0aG9ybgAvc3ZnL2NyaW1zb24AeGRvdF9qc29uAHhkb3RfanNvbjpqc29uAGpzb24wOmpzb24Ab21pY3JvbgBPbWljcm9uAHNjYXJvbgBTY2Fyb24Ad2VibWFyb29uAHgxMW1hcm9vbgAvc3ZnL21hcm9vbgAvc3ZnL2xpZ2h0c2FsbW9uAC9zdmcvZGFya3NhbG1vbgAvc3ZnL3NhbG1vbgB1cHNpbG9uAGVwc2lsb24AVXBzaWxvbgBFcHNpbG9uAHJlc29sdXRpb24AZGlzdG9ydGlvbgBzdGQ6OmV4Y2VwdGlvbgBwYXJ0aXRpb24AZG90X3Bvc2l0aW9uAFNldHRpbmcgdXAgc3RyZXNzIGZ1bmN0aW9uAHVuY2xvc2VkIENEQVRBIHNlY3Rpb24AcG9zdGFjdGlvbgByb3RhdGlvbgBvcmllbnRhdGlvbgBhYm9taW5hdGlvbgBhY2NvdW50aW5nR2V0Q3VycmVudEFtcGxpZmljYXRpb24AeGRvdHZlcnNpb24AU1RzZXRVbmlvbgA8cG9seWdvbgBoZXhhZ29uAHNlcHRhZ29uAHBlbnRhZ29uAHRyaXBsZW9jdGFnb24AZG91Ymxlb2N0YWdvbgAvc3ZnL2xlbW9uY2hpZmZvbgBNb24AcGx1c21uAG5vdGluAGlzaW4AL3N2Zy9tb2NjYXNpbgBwaW4AbWluAHZvcm9fbWFyZ2luAGluZmluAG9uZWRfb3B0aW1pemVyX3RyYWluAHBsYWluAG1ha2VfY2hhaW4AbWVyZ2VfY2hhaW4AZGVsZXRlTWluAGZpbmRNaW4AdmFsaWduAGJhbGlnbgB5ZW4ATXVsdGlsZXZlbF9jb2Fyc2VuAGN1cnJlbgBQb2Jzb3BlbgBndl9mb3BlbgBndnVzZXJzaGFwZV9vcGVuAGVudGl0eVRyYWNraW5nT25PcGVuAC9zdmcvbGluZW4AZGltZW4AbWlubGVuAHN0eWxlX3Rva2VuAHVuY2xvc2VkIHRva2VuAC9zdmcveWVsbG93Z3JlZW4AbWVkaXVtZm9yZXN0Z3JlZW4AL3N2Zy9mb3Jlc3RncmVlbgAvc3ZnL2xpZ2h0Z3JlZW4AaHVudGVyc2dyZWVuAC9zdmcvbGF3bmdyZWVuAC9zdmcvZGFya2dyZWVuAC9zdmcvbWVkaXVtc3ByaW5nZ3JlZW4AL3N2Zy9zcHJpbmdncmVlbgAvc3ZnL2RhcmtvbGl2ZWdyZWVuAC9zdmcvbGltZWdyZWVuAC9zdmcvcGFsZWdyZWVuAHdlYmdyZWVuAC9zdmcvbGlnaHRzZWFncmVlbgAvc3ZnL21lZGl1bXNlYWdyZWVuAC9zdmcvZGFya3NlYWdyZWVuAC9zdmcvc2VhZ3JlZW4AeDExZ3JlZW4AL3N2Zy9ncmVlbgBHcmVlbgAvc3ZnL2xpZ2h0Y3lhbgAvc3ZnL2RhcmtjeWFuAC9zdmcvY3lhbgBuZXd0YW4AZGFya3RhbgAvc3ZnL3RhbgByb3dzcGFuAGNvbHNwYW4AbmFuAHRpbWVzbmV3cm9tYW4AbmltYnVzcm9tYW4AdGltZXNyb21hbgBUaW1lcy1Sb21hbgBQYWxhdGluby1Sb21hbgBOZXdDZW50dXJ5U2NobGJrLVJvbWFuAEphbgBHRF9yYW5rKGcpW3JdLm4gPD0gR0RfcmFuayhnKVtyXS5hbgBhZ3hicHV0X24AXG4Abl9ub2RlcyA9PSBncmFwaC0+bgBBLT5tID09IEEtPm4Aam9iLT5vYmotPnUubgBuemMgPT0gKHNpemVfdCluAHMsJWxmLCVsZiVuACBlLCVsZiwlbGYlbgAlZCAlMVsiXSVuAHYgPT0gbgBiID09IG4AbmNsdXN0ZXIgPD0gbgBwc3ltAGFsZWZzeW0AdGhldGFzeW0AcXVhbnR1bQBzdW0AL3N2Zy9wbHVtAGludnRyYXBleml1bQBtZWRpdW0AOTpwcmlzbQBscm0AY3VzdG9tAGFwdHItPnRhZyA9PSBUX2F0b20AL2Rldi91cmFuZG9tAGd2X3JhbmRvbQBtbQBybG0Ac2ltAElNRFNfZ2l2ZW5fZGltAG9yZG0AY20AcGFyYWxsZWxvZ3JhbQAvc3ZnL21pbnRjcmVhbQBKdWwAdGwAZnJhc2wAU3ltYm9sAGZpbmRDb2wAPD94bWwAeXVtbAB1dW1sAG91bWwAaXVtbABldW1sAGF1bWwAWXVtbABVdW1sAE91bWwASXVtbABFdW1sAEF1bWwAY29yZV9sb2FkaW1hZ2VfdnJtbABqcGc6dnJtbABwbmc6dnJtbABqcGVnOnZybWwAZ2lmOnZybWwAanBlOnZybWwAYnVsbABmaWxsAC9zdmcvc2Vhc2hlbGwAZm9yYWxsAEFwcmlsAHBlcm1pbAByY2VpbABsY2VpbABjY2VkaWwAQ2NlZGlsAGFycm93dGFpbABsdGFpbABzYW1ldGFpbABsZXZlbCA+PSAwICYmIGxldmVsIDw9IG4tPmxldmVsAHN0cmVzc19tYWpvcml6YXRpb25fa0RfbWtlcm5lbABpc19wYXJhbGxlbABDYWxjdWxhdGluZyBjaXJjdWl0IG1vZGVsAENhbGN1bGF0aW5nIHN1YnNldCBtb2RlbABDYWxjdWxhdGluZyBNRFMgbW9kZWwAeGxhYmVsAHRhaWxsYWJlbABoZWFkbGFiZWwAZ3JhcGggbGFiZWwAaWV4Y2wAb2JqcC0+bGJsAG92YWwAbWVyZ2V2aXJ0dWFsAC9zdmcvbGlnaHRjb3JhbAAvc3ZnL2NvcmFsAFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfYXJyYXlzX2ludGVybmFsAE11bHRpbGV2ZWxfY29hcnNlbl9pbnRlcm5hbABRdWFkVHJlZV9hZGRfaW50ZXJuYWwAYXJyb3dfbGVuZ3RoX25vcm1hbABhcmlhbAByYWRpYWwAL3N2Zy90ZWFsAHJlYWwAbG9jYWwAZXN0aW1hdGVfY2hhcmFjdGVyX3dpZHRoX2Nhbm9uaWNhbABnbG9iYWwAcS0+bAAuLi8uLi9saWIvY2dyYXBoL3NjYW4ubAB0azp0awBnaWY6dGsAcGF0Y2h3b3JrAHRvawBib29rAEF2YW50R2FyZGUtQm9vawBzaW5rAG92ZXJsYXBfc2hyaW5rAHNwaWN5cGluawAvc3ZnL2hvdHBpbmsAL3N2Zy9saWdodHBpbmsAL3N2Zy9kZWVwcGluawBuZW9ucGluawAvc3ZnL3BpbmsAbmV3cmFuawBjbHVzdGVycmFuawBfbmV3X3JhbmsAaW5zdGFsbF9pbl9yYW5rAHJlbW92ZV9mcm9tX3JhbmsAL3N2Zy9jb3Juc2lsawBvbmVibG9jawB2LT5sZWZ0LT5ibG9jayA9PSB2LT5yaWdodC0+YmxvY2sAL3N2Zy9maXJlYnJpY2sAUFFjaGVjawBwYWNrAC9zdmcvYmxhY2sAQmxhY2sAYmFjawB6d2oAenduagBqb2ItPm9iagBnZXRpbnRyc3hpAHBzaQBQc2kAQ2FsaWJyaQBGcmkAdHdvcGkAZHBpAHZvcm9ub2kAVm9yb25vaQBjaGFuaQBkZW1pAEJvb2ttYW4tRGVtaQBBdmFudEdhcmRlLURlbWkAL3N2Zy9kYXJra2hha2kAL3N2Zy9raGFraQBwaGkAY2hpAFBoaQBDaGkAZGkAWGkAUGkATkRfaWQobnApID09IGkATl9JRFgocHEtPnBxW2ldKSA9PSBpAFN0cmVzc01ham9yaXphdGlvblNtb290aGVyX3Ntb290aABTcHJpbmdTbW9vdGhlcl9zbW9vdGgAYm90aABzdGFydHN3aXRoAGxpbmVsZW5ndGgAYmFkX2FycmF5X25ld19sZW5ndGgAYXZlcmFnZV9lZGdlX2xlbmd0aABldGgAcGVud2lkdGgAbHdpZHRoAHNldGxpbmV3aWR0aABzaG9ydHBhdGgAZm9udHBhdGgAUG9ic3BhdGgAYmVnaW5wYXRoAGltYWdlcGF0aABlbmRwYXRoAHN0cmFpZ2h0X3BhdGgAbWFwX3BhdGgAPHBhdGgAY2Fubm90IGZpbmQgdHJpYW5nbGUgcGF0aAAvc3ZnL2xhdmVuZGVyYmx1c2gAZmxlc2gAb3NsYXNoAE9zbGFzaABkdHN0cmhhc2gAc3RyZGljdF9oYXNoAG5kYXNoAG1kYXNoAGRpZ3JhcGgAc3ViZ3JhcGgAY29uc3RydWN0X2dyYXBoAGNoa1NncmFwaABjbG9zZXN0X3BhaXJzMmdyYXBoAGFnZGVsZXRlIG9uIHdyb25nIGdyYXBoAGNvbm5lY3RHcmFwaAB1cHNpaAAlc2xpbmUtdGhyb3VnaABjaGFuU2VhcmNoAFJUcmVlU2VhcmNoAE1hcmNoAERpc2NvbkJyYW5jaABQaWNrQnJhbmNoAEFkZEJyYW5jaAAuLi8uLi9saWIvdXRpbC9iaXRhcnJheS5oAC4uLy4uL2xpYi91dGlsL3N0cnZpZXcuaAAuLi8uLi9saWIvdXRpbC9zb3J0LmgALi4vLi4vbGliL2NncmFwaC9ub2RlX3NldC5oAC4uLy4uL2xpYi91dGlsL3N0cmVxLmgALi4vLi4vbGliL3V0aWwvc3RhcnRzd2l0aC5oAC4uLy4uL2xpYi91dGlsL2d2X21hdGguaAAuLi8uLi9saWIvdXRpbC9hZ3hidWYuaAAuLi8uLi9saWIvdXRpbC90b2tlbml6ZS5oAC4uLy4uL2xpYi91dGlsL2FsbG9jLmgAYXV4ZwBjb3JlX2xvYWRpbWFnZV9zdmcAc3ZnOnN2ZwBqcGc6c3ZnAHBuZzpzdmcAanBlZzpzdmcAZ2lmOnN2ZwBqcGU6c3ZnAHN2Z19pbmxpbmU6c3ZnAEF1ZwBkb1Byb2xvZwBwb3dlcl9pdGVyYXRpb25fb3J0aG9nAHBuZwBpZGVhbF9kaXN0X3NjaGVtZSB2YWx1ZSB3cm9uZwB4ZG90IHZlcnNpb24gIiVzIiB0b28gbG9uZwBjb25nAGxibGVuY2xvc2luZwBiYXNpY19zdHJpbmcAZmFpbHVyZSBtYWxsb2MnaW5nIGZvciByZXN1bHQgc3RyaW5nAHNwcmluZwBvcmRlcmluZwBnZW5lcmF0ZVJhbmRvbU9yZGVyaW5nAGFyaW5nAEFyaW5nAERhbXBpbmcAV2FybmluZwBvdmVybGFwX3NjYWxpbmcAeCBhbmQgeSBzY2FsaW5nAG9sZCBzY2FsaW5nAHNtb290aGluZwB1bmtub3duIGVuY29kaW5nAG11bHRpbGV2ZWxfc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nAHNwcmluZ19lbGVjdHJpY2FsX3NwcmluZ19lbWJlZGRpbmcAY2VsbHBhZGRpbmcAY2VsbHNwYWNpbmcAcmFuZwBsYW5nAGZpdmVwb3ZlcmhhbmcAdGhyZWVwb3ZlcmhhbmcAbm92ZXJoYW5nAGVtaXRfaHRtbF9pbWcAbGcAb3JpZwBzemxpZwBvZWxpZwBhZWxpZwBPRWxpZwBBRWxpZwBjb3JlX2xvYWRpbWFnZV9maWcAanBnOmZpZwBwbmc6ZmlnAGZpZzpmaWcAanBlZzpmaWcAZ2lmOmZpZwBqcGU6ZmlnAGVnZwBuZXh0X3NlZwByZWcAanBlZwBpID09IGRlZwBkZwBjZwBjbG9zZXN1YmcAbWlzbWF0Y2hlZCB0YWcAYmV6LT5zZmxhZwBiZXotPmVmbGFnACEqZmxhZwAhZmxhZwA8ZwAlLjVnLCUuNWcsJS41ZywlLjVnACUuNWcgJS41ZwAlZyAlZwBib3hJbnRlcnNlY3RmAGVwc2YAYWdlZGdlc2VxY21wZgBjY3dyb3RhdGVwZgBmbm9mAGluZgBzZWxmAGhhbGYAJWxmJWxmJWxmJWxmACVsZiwlbGYsJWxmLCVsZiwlbGYAJSpmICUqZiAlbGYgJWxmAGxpYmVyYXRpb25zZXJpZgBmcmVlc2VyaWYAc2Fucy1TZXJpZgBnaWYAL3N2Zy9wZWFjaHB1ZmYAcmlmZgBhY2NvdW50aW5nUmVwb3J0RGlmZgAoWG1sQmlnQ291bnQpLTEgLSByb290UGFyc2VyLT5tX2FsbG9jX3RyYWNrZXIuYnl0ZXNBbGxvY2F0ZWQgPj0gYWJzRGlmZgB0YWlsaHJlZgBsYWJlbGhyZWYAZWRnZWhyZWYAaGVhZGhyZWYAb3JkZgBwZGYAc2lnbWFmAFxmACUuMExmACVMZgB1cy0+ZgAlLjAzZgAlcyB0cmFuc21pdCAlLjNmAHJnYjwlOS4zZiwgJTkuM2YsICU5LjNmPiB0cmFuc21pdCAlLjNmACUuMDJmACUuMmYAJS4wZiwlLjBmLCUuMGYsJS4wZgAgJS4wZiwlLjBmACUuMGYgJS4wZiAlLjBmICUuMGYAIiBmaWxsLW9wYWNpdHk9IiVmACIgc3Ryb2tlLW9wYWNpdHk9IiVmAApmaW5hbCBlID0gJWYAYnJvbnplAGFycm93c2l6ZQBsYWJlbGZvbnRzaXplAHNlYXJjaHNpemUAZml4ZWRzaXplAG5vZGVfc2V0X3NpemUAdGV4dHNwYW5fc2l6ZQBzdmdfc2l6ZQBpbmRleCA8IGxpc3QtPnNpemUAY2FwYWNpdHkgPiBkaWN0LT5zaXplAGNhcGFjaXR5ID4gc2VsZi0+c2l6ZQBiei5zaXplAHBvaW50LXNpemUAU0laRV9NQVggLSBzaXplb2Yoc2l6ZV90KSAtIEVYUEFUX01BTExPQ19QQURESU5HID49IHNpemUAbm9ybWFsaXplAEVMaW5pdGlhbGl6ZQBta01hemUAaWN1cnZlAHRyeV9yZXNlcnZlAG5vZGVfc2V0X3JlbW92ZQBzdHJkaWN0X3JlbW92ZQBzb2x2ZQAhdi0+YWN0aXZlAC1hY3RpdmUAZm9udF9pbl9saXN0X3Blcm1pc3NpdmUAL3N2Zy9vbGl2ZQB1Z3JhdmUAb2dyYXZlAGlncmF2ZQBlZ3JhdmUAYWdyYXZlAFVncmF2ZQBPZ3JhdmUASWdyYXZlAEVncmF2ZQBBZ3JhdmUAdHJ1ZQAvc3ZnL2Jpc3F1ZQBvYmxpcXVlAEF2YW50R2FyZGUtQm9va09ibGlxdWUAQXZhbnRHYXJkZS1EZW1pT2JsaXF1ZQBIZWx2ZXRpY2EtTmFycm93LUJvbGRPYmxpcXVlAENvdXJpZXItQm9sZE9ibGlxdWUASGVsdmV0aWNhLUJvbGRPYmxpcXVlAEhlbHZldGljYS1OYXJyb3ctT2JsaXF1ZQBDb3VyaWVyLU9ibGlxdWUASGVsdmV0aWNhLU9ibGlxdWUAbmF2eWJsdWUAL3N2Zy9saWdodHNreWJsdWUAL3N2Zy9kZWVwc2t5Ymx1ZQAvc3ZnL3NreWJsdWUAbmV3bWlkbmlnaHRibHVlAC9zdmcvbWlkbmlnaHRibHVlAC9zdmcvbGlnaHRibHVlAC9zdmcvY2FkZXRibHVlAC9zdmcvY29ybmZsb3dlcmJsdWUAL3N2Zy9kb2RnZXJibHVlAC9zdmcvcG93ZGVyYmx1ZQBuZW9uYmx1ZQAvc3ZnL21lZGl1bWJsdWUAL3N2Zy9saWdodHN0ZWVsYmx1ZQAvc3ZnL3N0ZWVsYmx1ZQAvc3ZnL3JveWFsYmx1ZQAvc3ZnL2RhcmtibHVlAHJpY2hibHVlAGxpZ2h0c2xhdGVibHVlAC9zdmcvbWVkaXVtc2xhdGVibHVlAC9zdmcvZGFya3NsYXRlYmx1ZQAvc3ZnL3NsYXRlYmx1ZQAvc3ZnL2FsaWNlYmx1ZQAvc3ZnL2JsdWUAY2FsbFN0b3JlRW50aXR5VmFsdWUAc3RvcmVBdHRyaWJ1dGVWYWx1ZQBCbHVlAG5lYXRvX2VucXVldWUAVHVlAHlhY3V0ZQB1YWN1dGUAb2FjdXRlAGlhY3V0ZQBlYWN1dGUAYWFjdXRlAFlhY3V0ZQBVYWN1dGUAT2FjdXRlAElhY3V0ZQBFYWN1dGUAQWFjdXRlAHJlZmVyZW5jZSB0byBleHRlcm5hbCBlbnRpdHkgaW4gYXR0cmlidXRlAGR1cGxpY2F0ZSBhdHRyaWJ1dGUAbm90ZQBwcmltZXJzaXRlAHJpYm9zaXRlAHJlc3RyaWN0aW9uc2l0ZQBwcm90ZWFzZXNpdGUAL3N2Zy9naG9zdHdoaXRlAC9zdmcvbmF2YWpvd2hpdGUAL3N2Zy9mbG9yYWx3aGl0ZQAvc3ZnL2FudGlxdWV3aGl0ZQAvc3ZnL3doaXRlAFdoaXRlAHBvcF9vYmpfc3RhdGUAcGNwX3JvdGF0ZQBjb25jZW50cmF0ZQBkZWNvcmF0ZQBRdWFkVHJlZV9yZXB1bHNpdmVfZm9yY2VfYWNjdW11bGF0ZQBub3RyYW5zbGF0ZQAvc3ZnL2Nob2NvbGF0ZQBwYXJzZXJDcmVhdGUAZ2VvbVVwZGF0ZQBpbnZob3VzZQAvc3ZnL2NoYXJ0cmV1c2UAWE1MX1BhcnNlADxlbGxpcHNlAGR1c3R5cm9zZQAvc3ZnL21pc3R5cm9zZQBTcGFyc2VNYXRyaXhfdHJhbnNwb3NlAGx1X2RlY29tcG9zZQBhZ2Nsb3NlAGVudGl0eVRyYWNraW5nT25DbG9zZQBTcGFyc2VNYXRyaXhfbXVsdGlwbHlfZGVuc2UAZmFsc2UAL3N2Zy9tZWRpdW10dXJxdW9pc2UAL3N2Zy9kYXJrdHVycXVvaXNlAC9zdmcvcGFsZXR1cnF1b2lzZQAvc3ZnL3R1cnF1b2lzZQBwaGFzZQBTSVpFX01BWCAtIHJvb3RQYXJzZXItPm1fYWxsb2NfdHJhY2tlci5ieXRlc0FsbG9jYXRlZCA+PSBpbmNyZWFzZQBzbG90X2Zyb21fYmFzZQAvc3ZnL2F6dXJlAHNpZ25hdHVyZQBtb3JlX2NvcmUATXNxdWFyZQBQYWxhdGlubyBMaW5vdHlwZQBBLT50eXBlID09IEItPnR5cGUAc3VwZQBlbGxpcHNlX3RhbmdlbnRfc2xvcGUAZ3ZyZW5kZXJfdXNlcnNoYXBlAG1pdGVyX3NoYXBlAGxhbmRzY2FwZQBMYW5kc2NhcGUASnVuZQBub25lAGRvY3VtZW50IGlzIG5vdCBzdGFuZGFsb25lAGNvdXNpbmUAL3N2Zy9tZWRpdW1hcXVhbWFyaW5lAC9zdmcvYXF1YW1hcmluZQA8cG9seWxpbmUAJXNvdmVybGluZQB1bmRlcmxpbmUAcmVhbGx5cm91dGVzcGxpbmUAUHJvdXRlc3BsaW5lAGxpbmVhcl9zcGxpbmUAYl9zcGxpbmUAb2xpbmUAYWd4YnVmX2lzX2lubGluZQBzdmdfaW5saW5lAHJlZmluZQBwcmltZQBQcmltZQAvc3ZnL2xpbWUAY29sb3JzY2hlbWUAbGFiZWxfc2NoZW1lAHNhbWUAbGFiZWxmb250bmFtZQBVRl9zZXRuYW1lAGZvbnRfbmFtZQBmb250LT5uYW1lAHVzLT5uYW1lAHJlc2VydmVkIHByZWZpeCAoeG1sKSBtdXN0IG5vdCBiZSB1bmRlY2xhcmVkIG9yIGJvdW5kIHRvIGFub3RoZXIgbmFtZXNwYWNlIG5hbWUAc3R5bGUAL3N2Zy90aGlzdGxlAHRpdGxlAC9zdmcvbWVkaXVtcHVycGxlAGRhcmtwdXJwbGUAd2VicHVycGxlAHJlYmVjY2FwdXJwbGUAdmVyeV9saWdodF9wdXJwbGUAbWVkX3B1cnBsZQB4MTFwdXJwbGUAL3N2Zy9wdXJwbGUAc2hhcGVmaWxlAGdyYWRpZW50YW5nbGUAcmVjdGFuZ2xlAFJlY3RhbmdsZQBsYWJlbGFuZ2xlAGludnRyaWFuZ2xlAGRlc3RpbmF0aW9uIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAc291cmNlIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAZGZzQ3ljbGUAZG91YmxlY2lyY2xlAE1jaXJjbGUAaW52aXNpYmxlAGV4cGF0X2hlYXBfaW5jcmVhc2VfdG9sZXJhYmxlAHRob3JuZGFsZQBpbnB1dHNjYWxlAG9zY2FsZQBpbWFnZXNjYWxlAC9zdmcvd2hpdGVzbW9rZQBtYW5kYXJpbm9yYW5nZQAvc3ZnL2RhcmtvcmFuZ2UAL3N2Zy9vcmFuZ2UAZXhjaGFuZ2UAL3N2Zy9iZWlnZQBuZXdlZGdlAGRlbGV0ZV9mYXN0X2VkZ2UAZGVsZXRlX2ZsYXRfZWRnZQBhZGRfdHJlZV9lZGdlAHBhdGNod29ya19pbml0X25vZGVfZWRnZQB0d29waV9pbml0X25vZGVfZWRnZQBtYWtlU3RyYWlnaHRFZGdlAG1ha2VTZWxmRWRnZQBtYWtlQ29tcG91bmRFZGdlACF1c2Vfc3RhZ2UAb3NhZ2UAcGFnZQBndmxvYWRpbWFnZQB2ZWUAdGVlAFFVQURfVFJFRV9IWUJSSUQsIHNpemUgbGFyZ2VyIHRoYW4gJWQsIHN3aXRjaCB0byBmYXN0IHF1YWR0cmVlAGZlYXNpYmxlX3RyZWUAbm9kZV9zZXRfZnJlZQBleHBhdF9mcmVlAGd2X2FyZW5hX2ZyZWUAbmV3bm9kZQBpbnN0YWxsbm9kZQBhZ25vZGUAZGVsZXRlX2Zhc3Rfbm9kZQBwYWNrbW9kZQBTcGxpdE5vZGUAb3RpbGRlAG50aWxkZQBhdGlsZGUAT3RpbGRlAE50aWxkZQBBdGlsZGUAZGl2aWRlAHRyYWRlAGdyYXBodml6X25vZGVfaW5kdWNlAHNvdXJjZQByZXB1bHNpdmVmb3JjZQBpbGxlZ2FsIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlAGVycm9yIGluIHByb2Nlc3NpbmcgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZQByZWN1cnNpdmUgZW50aXR5IHJlZmVyZW5jZQBsYWJlbGRpc3RhbmNlAFRCX2JhbGFuY2UAVEJiYWxhbmNlAGRldmljZQBtb25vc3BhY2UAL3N2Zy9vbGRsYWNlAGZhY2UAc3ViZQAgLWFuY2hvciBlAHMxLT5jb21tX2Nvb3JkPT1zMi0+Y29tbV9jb29yZABNcmVjb3JkAGZvcndhcmQAcHJvZABsaWdodGdvbGRlbnJvZABtZWRpdW1nb2xkZW5yb2QAL3N2Zy9kYXJrZ29sZGVucm9kAC9zdmcvcGFsZWdvbGRlbnJvZAAvc3ZnL2dvbGRlbnJvZAAvc3ZnL2J1cmx5d29vZABsaWdodHdvb2QAbWVkaXVtd29vZABkYXJrd29vZABfYmFja2dyb3VuZABjb21wb3VuZABubyBlbGVtZW50IGZvdW5kAGZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tbm8gYWN0aW9uIGZvdW5kAC9zdmcvYmxhbmNoZWRhbG1vbmQAYXJyb3dfbGVuZ3RoX2RpYW1vbmQATWRpYW1vbmQAbm9kZV9zZXRfZmluZABzdHJkaWN0X2ZpbmQAZ3Z1c2Vyc2hhcGVfZmluZABFTGxlZnRibmQAZXhwYW5kAGN1bWJlcmxhbmQAYnJpZ2h0Z29sZABvbGRnb2xkAC9zdmcvZ29sZABib2xkAEhlbHZldGljYS1OYXJyb3ctQm9sZABUaW1lcy1Cb2xkAENvdXJpZXItQm9sZABQYWxhdGluby1Cb2xkAE5ld0NlbnR1cnlTY2hsYmstQm9sZABIZWx2ZXRpY2EtQm9sZAAlMCpsbGQAJSpsbGQAKyVsbGQAbi0+YnJhbmNoW2ldLmNoaWxkACUrLjRsZAAlcyVsZABzb2xpZAAvc3ZnL21lZGl1bW9yY2hpZAAvc3ZnL2RhcmtvcmNoaWQAL3N2Zy9vcmNoaWQAaWxsZWdhbCBjaGFyYWN0ZXIocykgaW4gcHVibGljIGlkAGRpamtzdHJhX3NnZABmaXhlZABjdXJ2ZWQAZGVyaXZlZABkb3R0ZWQAbWVtb3J5IGV4aGF1c3RlZABsb2NhbGUgbm90IHN1cHBvcnRlZABwYXJzaW5nIGFib3J0ZWQAcGFyc2VyIG5vdCBzdGFydGVkAGF0dHJpYnV0ZSBtYWNyb3Mgbm90IGltcGxlbWVudGVkAGFjY291bnRpbmdEaWZmVG9sZXJhdGVkAHJvb3RQYXJzZXItPm1fYWxsb2NfdHJhY2tlci5ieXRlc0FsbG9jYXRlZCA+PSBieXRlc0FsbG9jYXRlZABmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkAGNvbmRlbnNlZAAvc3ZnL21lZGl1bXZpb2xldHJlZAAvc3ZnL3BhbGV2aW9sZXRyZWQASW1wcm9wZXIgJXMgdmFsdWUgJXMgLSBpZ25vcmVkACVzIHZhbHVlICVzIDwgJWQgLSB0b28gc21hbGwgLSBpZ25vcmVkACVzIHZhbHVlICVzID4gJWQgLSB0b28gbGFyZ2UgLSBpZ25vcmVkAC9zdmcvaW5kaWFucmVkAC9zdmcvZGFya3JlZABhIHN1Y2Nlc3NmdWwgcHJpb3IgY2FsbCB0byBmdW5jdGlvbiBYTUxfR2V0QnVmZmVyIGlzIHJlcXVpcmVkAHRhcGVyZWQAL3N2Zy9vcmFuZ2VyZWQAcmVzZXJ2ZWQgcHJlZml4ICh4bWxucykgbXVzdCBub3QgYmUgZGVjbGFyZWQgb3IgdW5kZWNsYXJlZAAvc3ZnL3JlZABzdHJpcGVkAGlsbC1jb25kaXRpb25lZAB1bmRlZmluZWQAbm90IGNvbnN0cmFpbmVkAGxhYmVsYWxpZ25lZAB0ZXh0IGRlY2xhcmF0aW9uIG5vdCB3ZWxsLWZvcm1lZABYTUwgZGVjbGFyYXRpb24gbm90IHdlbGwtZm9ybWVkAHVuZmlsbGVkAGlucHV0IGluIGZsZXggc2Nhbm5lciBmYWlsZWQAdHJpYW5ndWxhdGlvbiBmYWlsZWQAcGFyc2luZyBmaW5pc2hlZABkYXNoZWQAbGltaXQgb24gaW5wdXQgYW1wbGlmaWNhdGlvbiBmYWN0b3IgKGZyb20gRFREIGFuZCBlbnRpdGllcykgYnJlYWNoZWQAd2VkZ2VkAHNpemUgPT0gZnJlZWQAcm91bmRlZABzcGxpbmUgWyUuMDNmLCAlLjAzZl0gLS0gWyUuMDNmLCAlLjAzZl0gaXMgaG9yaXpvbnRhbDsgd2lsbCBiZSB0cml2aWFsbHkgYm91bmRlZABzcGxpbmUgWyUuMDNmLCAlLjAzZl0gLS0gWyUuMDNmLCAlLjAzZl0gaXMgdmVydGljYWw7IHdpbGwgYmUgdHJpdmlhbGx5IGJvdW5kZWQAcGFyc2VyIG5vdCBzdXNwZW5kZWQAcGFyc2VyIHN1c3BlbmRlZABXZWQAUmVkAFNwYXJzZU1hdHJpeF9hZGQAbm9kZV9zZXRfYWRkAHN0cmRpY3RfYWRkAGRkICE9IHBhcmVudF9kZABLUF9BZGQAcGFkAHhsaGR4bG9hZAB4bGhkeHVubG9hZAByZWFkAGFycm93aGVhZABsaGVhZABzYW1laGVhZABib3gzZAAlc18lZABfc3Bhbl8lZABfYmxvY2tfJWQAX3dlYWtfJWQAX2Nsb25lXyVkAC4lZAAlWS0lbS0lZAAlbGYsJWQAJXMgaW4gbGluZSAlZAAlJSUlQm91bmRpbmdCb3g6ICVkICVkICVkICVkACJfc3ViZ3JhcGhfY250IjogJWQAIl9ndmlkIjogJWQAImhlYWQiOiAlZABhZ3hicHV0YwB2cHNjAGNwLT5zcmMAdWNpcmMAb2NpcmMAaWNpcmMAZWNpcmMAYWNpcmMAVWNpcmMAT2NpcmMASWNpcmMARWNpcmMAQWNpcmMAcGMAbGFiZWxsb2MAZXhwYXRfbWFsbG9jAGV4cGF0X3JlYWxsb2MAZ3ZfcmVjYWxsb2MAc3RkOjpiYWRfYWxsb2MAZ3ZfYXJlbmFfYWxsb2MAYmFrZXJzY2hvYwBzZW1pU3dlZXRDaG9jAG1jAFNwYXJzZU1hdHJpeF9pc19zeW1tZXRyaWMAQS0+aXNfcGF0dGVybl9zeW1tZXRyaWMAcGljOnBpYwBpdGFsaWMAQm9va21hbi1MaWdodEl0YWxpYwBaYXBmQ2hhbmNlcnktTWVkaXVtSXRhbGljAEJvb2ttYW4tRGVtaUl0YWxpYwBUaW1lcy1Cb2xkSXRhbGljAFBhbGF0aW5vLUJvbGRJdGFsaWMATmV3Q2VudHVyeVNjaGxiay1Cb2xkSXRhbGljAFRpbWVzLUl0YWxpYwBQYWxhdGluby1JdGFsaWMATmV3Q2VudHVyeVNjaGxiay1JdGFsaWMAcmFkaWMAI2ZjZmNmYwByb3V0ZXNwbGluZXM6ICVkIGVkZ2VzLCAlenUgYm94ZXMgJS4yZiBzZWMAOiAlLjJmIHNlYwBsaXN0ZGVscmVjAGxldmVsIGdyYXBoIHJlYwBsZXZlbCBlZGdlIHJlYwBsZXZlbCBub2RlIHJlYwBEZWMAX25lYXRvX2NjAGJjAHZpc2liaWxpdHkuYwBTcGFyc2VNYXRyaXguYwBodG1sbGV4LmMAaW5kZXguYwBzbWFydF9pbmlfeC5jAGd2cmVuZGVyX2NvcmVfcG92LmMAbHUuYwBjdnQuYwBsYXlvdXQuYwB0ZXh0c3Bhbl9sdXQuYwBhZGp1c3QuYwBub2RlbGlzdC5jAHNob3J0ZXN0LmMAY2xvc2VzdC5jAGd2cmVuZGVyX2NvcmVfZG90LmMAY29uc3RyYWludC5jAGRvdGluaXQuYwBuZWF0b2luaXQuYwBwYXRjaHdvcmtpbml0LmMAdHdvcGlpbml0LmMAb3NhZ2Vpbml0LmMAZW1pdC5jAGZsYXQuYwBhcnJvd3MuYwBtaW5jcm9zcy5jAHN0cmVzcy5jAHBvc3RfcHJvY2Vzcy5jAGNjb21wcy5jAG5zLmMAdXRpbHMuYwB4bGFiZWxzLmMAc2hhcGVzLmMAZG90c3BsaW5lcy5jAG5lYXRvc3BsaW5lcy5jAGNsdXN0ZXJlZGdlcy5jAGhlZGdlcy5jAGF0dHIuYwByZWZzdHIuYwBmYXN0Z3IuYwBjbHVzdGVyLmMAdGFwZXIuYwBndnJlbmRlci5jAHNwbGl0LnEuYwBjb21wLmMAZ3ZyZW5kZXJfY29yZV9tYXAuYwBoZWFwLmMAb3J0aG8uYwBndnJlbmRlcl9jb3JlX2pzb24uYwBwYXJ0aXRpb24uYwBwb3NpdGlvbi5jAGd2X2ZvcGVuLmMAdGV4dHNwYW4uYwBnZW9tLmMAcmFuZG9tLmMAcm91dGVzcGwuYwB4bWwuYwBNdWx0aWxldmVsLmMAc3ByaW5nX2VsZWN0cmljYWwuYwBndnJlbmRlcl9jb3JlX3RrLmMAcmFuay5jAHBhY2suYwBkdHN0cmhhc2guYwBncmFwaC5jAGd2cmVuZGVyX2NvcmVfc3ZnLmMAZ3ZyZW5kZXJfY29yZV9maWcuYwBzdHVmZi5jAG1hemUuYwBzcGFyc2Vfc29sdmUuYwByb3V0ZS5jAHdyaXRlLmMAY29seGxhdGUuYwB4bWxwYXJzZS5jAGd2bG9hZGltYWdlX2NvcmUuYwBndnVzZXJzaGFwZS5jAGNpcmNsZS5jAGh0bWx0YWJsZS5jAGVkZ2UuYwBndmxvYWRpbWFnZS5jAGJsb2NrdHJlZS5jAFF1YWRUcmVlLmMAbm9kZS5jAG5vZGVfaW5kdWNlLmMAZ3ZkZXZpY2UuYwBjb21wb3VuZC5jAHRyYXBlem9pZC5jAHNnZC5jAGNvbmMuYwByZWMuYwBkaWprc3RyYS5jAGFyZW5hLmMAZlBRLmMAY2xhc3MyLmMAJWxmLCVsZiwlbGYsJWxmJWMAJWxmLCVsZiwlbGYsJVteLF0lYwBcJWMAJGMAd2IAbnN1YgBzZXRoc2IAcmIAcHJvdGVjdF9yc3FiAGpvYgBjb3JlX2xvYWRpbWFnZV9wc2xpYgBGZWIAb2RiAGluaXRfc3BsaW5lc19iYgBiZXppZXJfYmIAcHJvdGVpbnN0YWIAcm5hc3RhYgAvc3ZnL29saXZlZHJhYgBcYgByd2EAL3N2Zy9hcXVhAGlvdGEASW90YQAvc3ZnL2RhcmttYWdlbnRhAC9zdmcvbWFnZW50YQBkZWx0YQBEZWx0YQB6ZXRhAHRoZXRhAFRoZXRhAGJldGEAWmV0YQBCZXRhAHByZXYgIT0gb2JqLT5kYXRhAG1ha2VHcmFwaERhdGEARXRhAG5pbWJ1c3NhbnNhAHBhcmEAa2FwcGEAS2FwcGEAL3N2Zy9zaWVubmEAVmVyZGFuYQBnYW1tYQBHYW1tYQBzaWdtYQBTaWdtYQBjb25zb2xhAG5hYmxhAC9zdmcvZnVjaHNpYQBHZW9yZ2lhAGFscGhhAEFscGhhAG9tZWdhAE9tZWdhAGFyZWEAbGFtYmRhAExhbWJkYQBoZWx2ZXRpY2EASGVsdmV0aWNhAG1pY2EAPjxhAGAAU3BhcnNlTWF0cml4X2Nvb3JkaW5hdGVfZm9ybV9hZGRfZW50cnlfAGd2X2xpc3RfY29weV8AX3RkcmF3XwBfdGxkcmF3XwBfaGxkcmF3XwBfbGRyYXdfAF9oZHJhd18AX2RyYXdfAGd2X2xpc3Rfc29ydF8AZ3ZfbGlzdF9hcHBlbmRfc2xvdF8AZ3ZfbGlzdF9wcmVwZW5kX3Nsb3RfAGd2X2xpc3RfcG9wX2Zyb250XwBndl9saXN0X3Nocmlua190b19maXRfAGFneHNldF8AZ3ZfbGlzdF9nZXRfAGRvdF9zcGxpbmVzXwAlc18AZ3ZfbGlzdF9jbGVhcl8AZ3ZfbGlzdF9wb3BfYmFja18AZ3ZfbGlzdF9kZXRhY2hfAGd2X2xpc3RfcmVtb3ZlXwBndl9saXN0X3JldmVyc2VfAGd2X2xpc3RfZnJlZV8AZ3ZfbGlzdF90cnlfYXBwZW5kXwBwYWdlJWQsJWRfAGd2X2xpc3Rfc3luY18AX2NjXwAgaWQ9ImFfAF4AU3RhcnRpbmcgcGhhc2UgMiBbZG90X21pbmNyb3NzXQBTdGFydGluZyBwaGFzZSAzIFtkb3RfcG9zaXRpb25dAG5fZWRnZXMgPT0gZ3JhcGgtPnNvdXJjZXNbZ3JhcGgtPm5dAFN0YXJ0aW5nIHBoYXNlIDEgW2RvdF9yYW5rXQBqZFttYXNrW2pjW2tdXV0gPT0gamNba10AamNbbWFza1tqYltrXV1dID09IGpiW2tdAG5lZWRsZVtpXSAhPSBuZWVkbGVbal0AamFbbWFza1tqYVtqXV1dID09IGphW2pdAHEtPnF0c1tpaV0AIXJ0cC0+c3BsaXQuUGFydGl0aW9uc1swXS50YWtlbltpXQByLmJvdW5kYXJ5W2ldIDw9IHIuYm91bmRhcnlbTlVNRElNUyArIGldAFslLjAzZiwlLjAzZl0AW2ludGVybmFsIGhhcmQtY29kZWRdAG5wLT5jZWxsc1sxXQBucC0+Y2VsbHNbMF0AdXMtPm5hbWVbMF0AY3AtPnNyY1swXQBbLi5dAFxcACJwb2ludHMiOiBbACJzdG9wcyI6IFsACVsAWgBjb21wdXRlU2NhbGVYWQB5PD1ZACVhICViICVkICVIOiVNOiVTICVZAFBPU0lYAG56IDw9IElOVF9NQVgAeSA+PSBJTlRfTUlOICYmIHkgPD0gSU5UX01BWAB4ID49IElOVF9NSU4gJiYgeCA8PSBJTlRfTUFYAHcgPj0gMCAmJiB3IDw9IElOVF9NQVgAZV9jbnQgPD0gSU5UX01BWABwYWlyLnJpZ2h0IDw9IElOVF9NQVgAcGFpci5sZWZ0IDw9IElOVF9NQVgAdGFyZ2V0IDw9IElOVF9NQVgAbnNlZ3MgPD0gSU5UX01BWABuX2VkZ2VzIDw9IElOVF9NQVgAc3RwLm52ZXJ0aWNlcyA8PSBJTlRfTUFYAG9ic1twb2x5X2ldLT5wbiA8PSBJTlRfTUFYAGlucHV0X3JvdXRlLnBuIDw9IElOVF9NQVgAZ3JhcGgtPm4gPD0gSU5UX01BWABoID49IDAgJiYgaCA8PSBJTlRfTUFYAGVfY250IC0gMSA8PSBJTlRfTUFYAExJU1RfU0laRSgmbGlzdCkgLSAxIDw9IElOVF9NQVgATElTVF9TSVpFKCZsYXllcklEcykgLSAxIDw9IElOVF9NQVgAc3RybGVuKGFyZ3MpIDw9IElOVF9NQVgATElTVF9TSVpFKCZvYmpsKSA8PSBJTlRfTUFYAExJU1RfU0laRSgmY3R4LT5UcmVlX2VkZ2UpIDw9IElOVF9NQVgAbm9kZV9zZXRfc2l6ZShnLT5uX2lkKSA8PSBJTlRfTUFYAGkgPCBJTlRfTUFYAHJlc3VsdCA8PSAoaW50KVVDSEFSX01BWABzc3ogPD0gVUNIQVJfTUFYAGNvbCA+PSAwICYmIGNvbCA8PSBVSU5UMTZfTUFYAHg8PVgAVwBWAFUAXFQAVEVYVABTVFJFU1NfTUFKT1JJWkFUSU9OX1BPV0VSX0RJU1QAU1RSRVNTX01BSk9SSVpBVElPTl9HUkFQSF9ESVNUAFNUUkVTU19NQUpPUklaQVRJT05fQVZHX0RJU1QARkFTVABGT05UAGIgPT0gQl9SSUdIVABIRUlHSFQAQl9MRUZUAF8lbGx1X1NVU1BFQ1QAQlQAVHJlYnVjaGV0IE1TAElOVklTACVIOiVNOiVTAFZSAFRSAEEtPmZvcm1hdCA9PSBCLT5mb3JtYXQgJiYgQS0+Zm9ybWF0ID09IEZPUk1BVF9DU1IATFIARElSAEhSAENFTlRFUgAlJVRSQUlMRVIAQS0+dHlwZSA9PSBNQVRSSVhfVFlQRV9SRUFMIHx8IEEtPnR5cGUgPT0gTUFUUklYX1RZUEVfSU5URUdFUgBDRUxMQk9SREVSAEJSACpSAFEARVhQAEJfVVAAU1VQAFRPUABPAG1hcE4AXE4AQl9ET1dOAFRIT1JOACUlQkVHSU4AUk9XU1BBTgBDT0xTUEFOAE5BTgBQTQBCT1RUT00AQk0AQU0AJUg6JU0AXEwAdGFpbFVSTABsYWJlbFVSTABlZGdlVVJMAGhlYWRVUkwASFRNTAB4IT1OVUxMAHJvb3RQYXJzZXItPm1fcGFyZW50UGFyc2VyID09IE5VTEwARURfdG9fdmlydChvcmlnKSA9PSBOVUxMAEVEX3RvX3ZpcnQoZSkgPT0gTlVMTABwcmVmaXggIT0gTlVMTABkdGQtPnNjYWZmSW5kZXggIT0gTlVMTABzbS0+THcgIT0gTlVMTABsdSAhPSBOVUxMAGlucHV0ICE9IE5VTEwAbGlzdCAhPSBOVUxMAHJlZmVyZW50ICE9IE5VTEwAZGljdCAhPSBOVUxMAGRpY3QtPmJ1Y2tldHMgIT0gTlVMTABhdHRyICE9IE5VTEwAYWxsb2NhdG9yICE9IE5VTEwAcGFyc2VyICE9IE5VTEwAcm9vdFBhcnNlciAhPSBOVUxMAGxlYWRlciAhPSBOVUxMAGNtcCAhPSBOVUxMAGRhdGFwICE9IE5VTEwAaW50byAhPSBOVUxMAGl0ZW0gIT0gTlVMTABvcnRob2cgIT0gTlVMTABzZWxmICE9IE5VTEwAdmFsdWUgIT0gTlVMTABmaWxlbmFtZSAhPSBOVUxMAGpvYi0+b3V0cHV0X2ZpbGUgIT0gTlVMTABtb2RlICE9IE5VTEwAeGQgIT0gTlVMTABzbS0+THdkICE9IE5VTEwAam9iICE9IE5VTEwAc291cmNlLmRhdGEgIT0gTlVMTABiLmRhdGEgIT0gTlVMTABhLmRhdGEgIT0gTlVMTABhcmVuYSAhPSBOVUxMAGxpc3QgJiYgbGlzdFswXSAhPSBOVUxMAEFGICE9IE5VTEwAc20tPkQgIT0gTlVMTABFRF90b192aXJ0KG9yaWcpICE9IE5VTEwATENfQUxMAEJMAGJlc3Rjb3N0IDwgSFVHRV9WQUwATk9STUFMAFJBRElBTABBLT50eXBlID09IE1BVFJJWF9UWVBFX1JFQUwAVVJXIENoYW5jZXJ5IEwAVVJXIEJvb2ttYW4gTABDZW50dXJ5IFNjaG9vbGJvb2sgTABVUlcgR290aGljIEwAS0sASgBpIDwgTUFYX0kAUC0+ZW5kLnRoZXRhIDwgMiAqIE1fUEkAQVNDSUkAXEgARVRIAFdJRFRIAERPVEZPTlRQQVRIAEdERk9OVFBBVEgAbWtOQ29uc3RyYWludEcAXEcARVhQQVRfRU5USVRZX0RFQlVHAEVYUEFUX0VOVFJPUFlfREVCVUcARVhQQVRfQUNDT1VOVElOR19ERUJVRwBFWFBBVF9NQUxMT0NfREVCVUcAUk5HAFNQUklORwBDRUxMUEFERElORwBDRUxMU1BBQ0lORwBMQU5HAElNRwBceEYAJSVFT0YASU5GAFx4RkYAUklGRgBkZWx0YSA8PSAweEZGRkYAXHhFRgBceERGAFx4Q0YAXHhCRgBceEFGAFx4OUYAXHg4RgBceDdGAFx4MUYAXHhFAFxFAFBPSU5ULVNJWkUAVFJVRQBDTE9TRQBGQUxTRQBrZXkgIT0gVE9NQlNUT05FAHIgIT0gVE9NQlNUT05FAE5PTkUAR1JBRElFTlRBTkdMRQBUUklBTkdMRQBNSURETEUASU5WSVNJQkxFAFRBQkxFAEFHVFlQRShvYmopID09IEFHSU5FREdFIHx8IEFHVFlQRShvYmopID09IEFHT1VURURHRQBceEZFAFx4RUUAXHhERQBCX05PREUAXHhDRQBceEJFAFx4QUUAXHg5RQBceDhFAFx4MUUAVEQAQS0+Zm9ybWF0ID09IEZPUk1BVF9DT09SRABuICYmIGkgPj0gMCAmJiBpIDwgTk9ERUNBUkQAJSVFTkQASFlCUklEAFNPTElEAFx4RkQAXHhFRABET1RURUQAREFTSEVEAFJPVU5ERUQAXHhERABceENEAFx4QkQAXHhBRABceDlEAFx4OEQAXHgxRABceEMAZGVsZXRlVlBTQwBceEZDAFx4RUMAXHhEQwBceENDAFx4QkMAXHhBQwBceDlDAFx4OEMAXHgxQwBceEIAU1VCAFx4RkIAXHhFQgBceERCAFx4Q0IAXHhCQgBceEFCAFx4OUIAXHg4QgBceDFCAEEgJiYgQgBceEZBAFx4RUEAXHhEQQBceENBAFx4QkEAXHhBQQBceDlBAFx4OEEAXHgxQQBAAD8APCVzPgA8bmlsPgA8L3RzcGFuPjwvdGV4dFBhdGg+AAogICAgPCU5LjNmLCAlOS4zZiwgJTkuM2Y+AD4KPHRpdGxlPgA8Rk9OVD4APEJSPgA8SFRNTD4APC9IVE1MPgA8SU1HPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBiZWZvcmUgPFRBQkxFPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBhZnRlciA8L1RBQkxFPgA8VEQ+AC0+ACI+AAlba2V5PQA8PQA8ACYjeCV4OwAmcXVvdDsAJmx0OwAmZ3Q7ACZhbXA7ACMlZDsAJiMzOTsAJiM0NTsAJiM5MzsAJiMxMzsAJiMxNjA7ACYjMTA7ADtzdG9wLW9wYWNpdHk6ACUlQm91bmRpbmdCb3g6AGNhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzIGFuZCBzZXR0aW5nIHVwIHN0cmVzcyB0ZXJtczoAPHN0b3Agb2Zmc2V0PSIlLjAzZiIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6AHNvbHZpbmcgbW9kZWw6AC9cOgBncmV5OQBncmF5OQBceEY5AFx4RTkAXHhEOQBceEM5AFx4QjkAXHhBOQBncmV5OTkAZ3JheTk5AFx4OTkAZ3JleTg5AGdyYXk4OQBceDg5ADAxMjM0NTY3ODkAZ3JleTc5AGdyYXk3OQBncmV5NjkAZ3JheTY5AGdyZXk1OQBncmF5NTkAZ3JleTQ5AGdyYXk0OQBncmV5MzkAZ3JheTM5AGdyZXkyOQBncmF5MjkAZ3JleTE5AGdyYXkxOQBceDE5AC9yZGd5OS85AC9idXB1OS85AC9yZHB1OS85AC9wdWJ1OS85AC95bGduYnU5LzkAL2duYnU5LzkAL3JkeWxidTkvOQAvcmRidTkvOQAvZ3JleXM5LzkAL2dyZWVuczkvOQAvYmx1ZXM5LzkAL3B1cnBsZXM5LzkAL29yYW5nZXM5LzkAL3JlZHM5LzkAL3B1b3I5LzkAL3lsb3JicjkvOQAvcHVidWduOS85AC9idWduOS85AC9wcmduOS85AC9yZHlsZ245LzkAL3lsZ245LzkAL3NwZWN0cmFsOS85AC9waXlnOS85AC9icmJnOS85AC9wdXJkOS85AC95bG9ycmQ5LzkAL29ycmQ5LzkAL3BhaXJlZDkvOQAvc2V0MzkvOQAvc2V0MTkvOQAvcGFzdGVsMTkvOQAvcGFpcmVkMTIvOQAvc2V0MzEyLzkAL3JkZ3kxMS85AC9yZHlsYnUxMS85AC9yZGJ1MTEvOQAvcHVvcjExLzkAL3ByZ24xMS85AC9yZHlsZ24xMS85AC9zcGVjdHJhbDExLzkAL3BpeWcxMS85AC9icmJnMTEvOQAvcGFpcmVkMTEvOQAvc2V0MzExLzkAL3JkZ3kxMC85AC9yZHlsYnUxMC85AC9yZGJ1MTAvOQAvcHVvcjEwLzkAL3ByZ24xMC85AC9yZHlsZ24xMC85AC9zcGVjdHJhbDEwLzkAL3BpeWcxMC85AC9icmJnMTAvOQAvcGFpcmVkMTAvOQAvc2V0MzEwLzkAZ3JleTgAZ3JheTgAXHg4AHV0ZjgAI2Y4ZjhmOAAjZThlOGU4AFx4RjgAR0lGOABceEU4AFx4RDgAXHhDOABceEI4AFx4QTgAZ3JleTk4AGdyYXk5OABceDk4AGdyZXk4OABncmF5ODgAXHg4OABncmV5NzgAZ3JheTc4AGdyZXk2OABncmF5NjgAZ3JleTU4AGdyYXk1OABncmV5NDgAZ3JheTQ4AGdyZXkzOABncmF5MzgAZ3JleTI4AGdyYXkyOABncmV5MTgAZ3JheTE4AFx4MTgAL3JkZ3k5LzgAL2J1cHU5LzgAL3JkcHU5LzgAL3B1YnU5LzgAL3lsZ25idTkvOAAvZ25idTkvOAAvcmR5bGJ1OS84AC9yZGJ1OS84AC9ncmV5czkvOAAvZ3JlZW5zOS84AC9ibHVlczkvOAAvcHVycGxlczkvOAAvb3JhbmdlczkvOAAvcmVkczkvOAAvcHVvcjkvOAAveWxvcmJyOS84AC9wdWJ1Z245LzgAL2J1Z245LzgAL3ByZ245LzgAL3JkeWxnbjkvOAAveWxnbjkvOAAvc3BlY3RyYWw5LzgAL3BpeWc5LzgAL2JyYmc5LzgAL3B1cmQ5LzgAL3lsb3JyZDkvOAAvb3JyZDkvOAAvcGFpcmVkOS84AC9zZXQzOS84AC9zZXQxOS84AC9wYXN0ZWwxOS84AC9yZGd5OC84AC9idXB1OC84AC9yZHB1OC84AC9wdWJ1OC84AC95bGduYnU4LzgAL2duYnU4LzgAL3JkeWxidTgvOAAvcmRidTgvOAAvYWNjZW50OC84AC9ncmV5czgvOAAvZ3JlZW5zOC84AC9ibHVlczgvOAAvcHVycGxlczgvOAAvb3JhbmdlczgvOAAvcmVkczgvOAAvcHVvcjgvOAAveWxvcmJyOC84AC9wdWJ1Z244LzgAL2J1Z244LzgAL3ByZ244LzgAL3JkeWxnbjgvOAAveWxnbjgvOAAvc3BlY3RyYWw4LzgAL3BpeWc4LzgAL2JyYmc4LzgAL3B1cmQ4LzgAL3lsb3JyZDgvOAAvb3JyZDgvOAAvcGFpcmVkOC84AC9zZXQzOC84AC9zZXQyOC84AC9wYXN0ZWwyOC84AC9kYXJrMjgvOAAvc2V0MTgvOAAvcGFzdGVsMTgvOAAvcGFpcmVkMTIvOAAvc2V0MzEyLzgAL3JkZ3kxMS84AC9yZHlsYnUxMS84AC9yZGJ1MTEvOAAvcHVvcjExLzgAL3ByZ24xMS84AC9yZHlsZ24xMS84AC9zcGVjdHJhbDExLzgAL3BpeWcxMS84AC9icmJnMTEvOAAvcGFpcmVkMTEvOAAvc2V0MzExLzgAL3JkZ3kxMC84AC9yZHlsYnUxMC84AC9yZGJ1MTAvOAAvcHVvcjEwLzgAL3ByZ24xMC84AC9yZHlsZ24xMC84AC9zcGVjdHJhbDEwLzgAL3BpeWcxMC84AC9icmJnMTAvOAAvcGFpcmVkMTAvOAAvc2V0MzEwLzgAdXRmLTgAQy5VVEYtOABncmV5NwBncmF5NwBceDcAXHhGNwBceEU3AFx4RDcAXHhDNwBceEI3AFx4QTcAZ3JleTk3AGdyYXk5NwBceDk3AGdyZXk4NwBncmF5ODcAXHg4NwBncmV5NzcAZ3JheTc3AGdyZXk2NwBncmF5NjcAZ3JleTU3AGdyYXk1NwBncmV5NDcAZ3JheTQ3AGdyZXkzNwBncmF5MzcAZ3JleTI3AGdyYXkyNwBncmV5MTcAZ3JheTE3AFx4MTcAL3JkZ3k5LzcAL2J1cHU5LzcAL3JkcHU5LzcAL3B1YnU5LzcAL3lsZ25idTkvNwAvZ25idTkvNwAvcmR5bGJ1OS83AC9yZGJ1OS83AC9ncmV5czkvNwAvZ3JlZW5zOS83AC9ibHVlczkvNwAvcHVycGxlczkvNwAvb3JhbmdlczkvNwAvcmVkczkvNwAvcHVvcjkvNwAveWxvcmJyOS83AC9wdWJ1Z245LzcAL2J1Z245LzcAL3ByZ245LzcAL3JkeWxnbjkvNwAveWxnbjkvNwAvc3BlY3RyYWw5LzcAL3BpeWc5LzcAL2JyYmc5LzcAL3B1cmQ5LzcAL3lsb3JyZDkvNwAvb3JyZDkvNwAvcGFpcmVkOS83AC9zZXQzOS83AC9zZXQxOS83AC9wYXN0ZWwxOS83AC9yZGd5OC83AC9idXB1OC83AC9yZHB1OC83AC9wdWJ1OC83AC95bGduYnU4LzcAL2duYnU4LzcAL3JkeWxidTgvNwAvcmRidTgvNwAvYWNjZW50OC83AC9ncmV5czgvNwAvZ3JlZW5zOC83AC9ibHVlczgvNwAvcHVycGxlczgvNwAvb3JhbmdlczgvNwAvcmVkczgvNwAvcHVvcjgvNwAveWxvcmJyOC83AC9wdWJ1Z244LzcAL2J1Z244LzcAL3ByZ244LzcAL3JkeWxnbjgvNwAveWxnbjgvNwAvc3BlY3RyYWw4LzcAL3BpeWc4LzcAL2JyYmc4LzcAL3B1cmQ4LzcAL3lsb3JyZDgvNwAvb3JyZDgvNwAvcGFpcmVkOC83AC9zZXQzOC83AC9zZXQyOC83AC9wYXN0ZWwyOC83AC9kYXJrMjgvNwAvc2V0MTgvNwAvcGFzdGVsMTgvNwAvcmRneTcvNwAvYnVwdTcvNwAvcmRwdTcvNwAvcHVidTcvNwAveWxnbmJ1Ny83AC9nbmJ1Ny83AC9yZHlsYnU3LzcAL3JkYnU3LzcAL2FjY2VudDcvNwAvZ3JleXM3LzcAL2dyZWVuczcvNwAvYmx1ZXM3LzcAL3B1cnBsZXM3LzcAL29yYW5nZXM3LzcAL3JlZHM3LzcAL3B1b3I3LzcAL3lsb3JicjcvNwAvcHVidWduNy83AC9idWduNy83AC9wcmduNy83AC9yZHlsZ243LzcAL3lsZ243LzcAL3NwZWN0cmFsNy83AC9waXlnNy83AC9icmJnNy83AC9wdXJkNy83AC95bG9ycmQ3LzcAL29ycmQ3LzcAL3BhaXJlZDcvNwAvc2V0MzcvNwAvc2V0MjcvNwAvcGFzdGVsMjcvNwAvZGFyazI3LzcAL3NldDE3LzcAL3Bhc3RlbDE3LzcAL3BhaXJlZDEyLzcAL3NldDMxMi83AC9yZGd5MTEvNwAvcmR5bGJ1MTEvNwAvcmRidTExLzcAL3B1b3IxMS83AC9wcmduMTEvNwAvcmR5bGduMTEvNwAvc3BlY3RyYWwxMS83AC9waXlnMTEvNwAvYnJiZzExLzcAL3BhaXJlZDExLzcAL3NldDMxMS83AC9yZGd5MTAvNwAvcmR5bGJ1MTAvNwAvcmRidTEwLzcAL3B1b3IxMC83AC9wcmduMTAvNwAvcmR5bGduMTAvNwAvc3BlY3RyYWwxMC83AC9waXlnMTAvNwAvYnJiZzEwLzcAL3BhaXJlZDEwLzcAL3NldDMxMC83ADEuNwBncmV5NgBncmF5NgBceDYAXHhGNgBceEU2AFx4RDYAXHhDNgBceEI2AFx4QTYAZ3JleTk2AGdyYXk5NgBceDk2AGdyZXk4NgBncmF5ODYAXHg4NgBncmV5NzYAZ3JheTc2AGdyZXk2NgBncmF5NjYAZ3JleTU2AGdyYXk1NgBncmV5NDYAZ3JheTQ2AGdyZXkzNgBncmF5MzYAZ3JleTI2AGdyYXkyNgBncmV5MTYAZ3JheTE2AFx4MTYAL3JkZ3k5LzYAL2J1cHU5LzYAL3JkcHU5LzYAL3B1YnU5LzYAL3lsZ25idTkvNgAvZ25idTkvNgAvcmR5bGJ1OS82AC9yZGJ1OS82AC9ncmV5czkvNgAvZ3JlZW5zOS82AC9ibHVlczkvNgAvcHVycGxlczkvNgAvb3JhbmdlczkvNgAvcmVkczkvNgAvcHVvcjkvNgAveWxvcmJyOS82AC9wdWJ1Z245LzYAL2J1Z245LzYAL3ByZ245LzYAL3JkeWxnbjkvNgAveWxnbjkvNgAvc3BlY3RyYWw5LzYAL3BpeWc5LzYAL2JyYmc5LzYAL3B1cmQ5LzYAL3lsb3JyZDkvNgAvb3JyZDkvNgAvcGFpcmVkOS82AC9zZXQzOS82AC9zZXQxOS82AC9wYXN0ZWwxOS82AC9yZGd5OC82AC9idXB1OC82AC9yZHB1OC82AC9wdWJ1OC82AC95bGduYnU4LzYAL2duYnU4LzYAL3JkeWxidTgvNgAvcmRidTgvNgAvYWNjZW50OC82AC9ncmV5czgvNgAvZ3JlZW5zOC82AC9ibHVlczgvNgAvcHVycGxlczgvNgAvb3JhbmdlczgvNgAvcmVkczgvNgAvcHVvcjgvNgAveWxvcmJyOC82AC9wdWJ1Z244LzYAL2J1Z244LzYAL3ByZ244LzYAL3JkeWxnbjgvNgAveWxnbjgvNgAvc3BlY3RyYWw4LzYAL3BpeWc4LzYAL2JyYmc4LzYAL3B1cmQ4LzYAL3lsb3JyZDgvNgAvb3JyZDgvNgAvcGFpcmVkOC82AC9zZXQzOC82AC9zZXQyOC82AC9wYXN0ZWwyOC82AC9kYXJrMjgvNgAvc2V0MTgvNgAvcGFzdGVsMTgvNgAvcmRneTcvNgAvYnVwdTcvNgAvcmRwdTcvNgAvcHVidTcvNgAveWxnbmJ1Ny82AC9nbmJ1Ny82AC9yZHlsYnU3LzYAL3JkYnU3LzYAL2FjY2VudDcvNgAvZ3JleXM3LzYAL2dyZWVuczcvNgAvYmx1ZXM3LzYAL3B1cnBsZXM3LzYAL29yYW5nZXM3LzYAL3JlZHM3LzYAL3B1b3I3LzYAL3lsb3JicjcvNgAvcHVidWduNy82AC9idWduNy82AC9wcmduNy82AC9yZHlsZ243LzYAL3lsZ243LzYAL3NwZWN0cmFsNy82AC9waXlnNy82AC9icmJnNy82AC9wdXJkNy82AC95bG9ycmQ3LzYAL29ycmQ3LzYAL3BhaXJlZDcvNgAvc2V0MzcvNgAvc2V0MjcvNgAvcGFzdGVsMjcvNgAvZGFyazI3LzYAL3NldDE3LzYAL3Bhc3RlbDE3LzYAL3JkZ3k2LzYAL2J1cHU2LzYAL3JkcHU2LzYAL3B1YnU2LzYAL3lsZ25idTYvNgAvZ25idTYvNgAvcmR5bGJ1Ni82AC9yZGJ1Ni82AC9hY2NlbnQ2LzYAL2dyZXlzNi82AC9ncmVlbnM2LzYAL2JsdWVzNi82AC9wdXJwbGVzNi82AC9vcmFuZ2VzNi82AC9yZWRzNi82AC9wdW9yNi82AC95bG9yYnI2LzYAL3B1YnVnbjYvNgAvYnVnbjYvNgAvcHJnbjYvNgAvcmR5bGduNi82AC95bGduNi82AC9zcGVjdHJhbDYvNgAvcGl5ZzYvNgAvYnJiZzYvNgAvcHVyZDYvNgAveWxvcnJkNi82AC9vcnJkNi82AC9wYWlyZWQ2LzYAL3NldDM2LzYAL3NldDI2LzYAL3Bhc3RlbDI2LzYAL2RhcmsyNi82AC9zZXQxNi82AC9wYXN0ZWwxNi82AC9wYWlyZWQxMi82AC9zZXQzMTIvNgAvcmRneTExLzYAL3JkeWxidTExLzYAL3JkYnUxMS82AC9wdW9yMTEvNgAvcHJnbjExLzYAL3JkeWxnbjExLzYAL3NwZWN0cmFsMTEvNgAvcGl5ZzExLzYAL2JyYmcxMS82AC9wYWlyZWQxMS82AC9zZXQzMTEvNgAvcmRneTEwLzYAL3JkeWxidTEwLzYAL3JkYnUxMC82AC9wdW9yMTAvNgAvcHJnbjEwLzYAL3JkeWxnbjEwLzYAL3NwZWN0cmFsMTAvNgAvcGl5ZzEwLzYAL2JyYmcxMC82AC9wYWlyZWQxMC82AC9zZXQzMTAvNgBncmV5NQBncmF5NQBceDUAYmlnNQBceEY1AFx4RTUAXHhENQBceEM1AFx4QjUAXHhBNQBncmV5OTUAZ3JheTk1AFx4OTUAZ3JleTg1AGdyYXk4NQBceDg1AGdyZXk3NQBncmF5NzUAZ3JleTY1AGdyYXk2NQBncmV5NTUAZ3JheTU1AGdyZXk0NQBncmF5NDUAZ3JleTM1AGdyYXkzNQBncmV5MjUAZ3JheTI1AGdyZXkxNQBncmF5MTUAXHgxNQBncmF5MDUAL3JkZ3k5LzUAL2J1cHU5LzUAL3JkcHU5LzUAL3B1YnU5LzUAL3lsZ25idTkvNQAvZ25idTkvNQAvcmR5bGJ1OS81AC9yZGJ1OS81AC9ncmV5czkvNQAvZ3JlZW5zOS81AC9ibHVlczkvNQAvcHVycGxlczkvNQAvb3JhbmdlczkvNQAvcmVkczkvNQAvcHVvcjkvNQAveWxvcmJyOS81AC9wdWJ1Z245LzUAL2J1Z245LzUAL3ByZ245LzUAL3JkeWxnbjkvNQAveWxnbjkvNQAvc3BlY3RyYWw5LzUAL3BpeWc5LzUAL2JyYmc5LzUAL3B1cmQ5LzUAL3lsb3JyZDkvNQAvb3JyZDkvNQAvcGFpcmVkOS81AC9zZXQzOS81AC9zZXQxOS81AC9wYXN0ZWwxOS81AC9yZGd5OC81AC9idXB1OC81AC9yZHB1OC81AC9wdWJ1OC81AC95bGduYnU4LzUAL2duYnU4LzUAL3JkeWxidTgvNQAvcmRidTgvNQAvYWNjZW50OC81AC9ncmV5czgvNQAvZ3JlZW5zOC81AC9ibHVlczgvNQAvcHVycGxlczgvNQAvb3JhbmdlczgvNQAvcmVkczgvNQAvcHVvcjgvNQAveWxvcmJyOC81AC9wdWJ1Z244LzUAL2J1Z244LzUAL3ByZ244LzUAL3JkeWxnbjgvNQAveWxnbjgvNQAvc3BlY3RyYWw4LzUAL3BpeWc4LzUAL2JyYmc4LzUAL3B1cmQ4LzUAL3lsb3JyZDgvNQAvb3JyZDgvNQAvcGFpcmVkOC81AC9zZXQzOC81AC9zZXQyOC81AC9wYXN0ZWwyOC81AC9kYXJrMjgvNQAvc2V0MTgvNQAvcGFzdGVsMTgvNQAvcmRneTcvNQAvYnVwdTcvNQAvcmRwdTcvNQAvcHVidTcvNQAveWxnbmJ1Ny81AC9nbmJ1Ny81AC9yZHlsYnU3LzUAL3JkYnU3LzUAL2FjY2VudDcvNQAvZ3JleXM3LzUAL2dyZWVuczcvNQAvYmx1ZXM3LzUAL3B1cnBsZXM3LzUAL29yYW5nZXM3LzUAL3JlZHM3LzUAL3B1b3I3LzUAL3lsb3JicjcvNQAvcHVidWduNy81AC9idWduNy81AC9wcmduNy81AC9yZHlsZ243LzUAL3lsZ243LzUAL3NwZWN0cmFsNy81AC9waXlnNy81AC9icmJnNy81AC9wdXJkNy81AC95bG9ycmQ3LzUAL29ycmQ3LzUAL3BhaXJlZDcvNQAvc2V0MzcvNQAvc2V0MjcvNQAvcGFzdGVsMjcvNQAvZGFyazI3LzUAL3NldDE3LzUAL3Bhc3RlbDE3LzUAL3JkZ3k2LzUAL2J1cHU2LzUAL3JkcHU2LzUAL3B1YnU2LzUAL3lsZ25idTYvNQAvZ25idTYvNQAvcmR5bGJ1Ni81AC9yZGJ1Ni81AC9hY2NlbnQ2LzUAL2dyZXlzNi81AC9ncmVlbnM2LzUAL2JsdWVzNi81AC9wdXJwbGVzNi81AC9vcmFuZ2VzNi81AC9yZWRzNi81AC9wdW9yNi81AC95bG9yYnI2LzUAL3B1YnVnbjYvNQAvYnVnbjYvNQAvcHJnbjYvNQAvcmR5bGduNi81AC95bGduNi81AC9zcGVjdHJhbDYvNQAvcGl5ZzYvNQAvYnJiZzYvNQAvcHVyZDYvNQAveWxvcnJkNi81AC9vcnJkNi81AC9wYWlyZWQ2LzUAL3NldDM2LzUAL3NldDI2LzUAL3Bhc3RlbDI2LzUAL2RhcmsyNi81AC9zZXQxNi81AC9wYXN0ZWwxNi81AC9yZGd5NS81AC9idXB1NS81AC9yZHB1NS81AC9wdWJ1NS81AC95bGduYnU1LzUAL2duYnU1LzUAL3JkeWxidTUvNQAvcmRidTUvNQAvYWNjZW50NS81AC9ncmV5czUvNQAvZ3JlZW5zNS81AC9ibHVlczUvNQAvcHVycGxlczUvNQAvb3JhbmdlczUvNQAvcmVkczUvNQAvcHVvcjUvNQAveWxvcmJyNS81AC9wdWJ1Z241LzUAL2J1Z241LzUAL3ByZ241LzUAL3JkeWxnbjUvNQAveWxnbjUvNQAvc3BlY3RyYWw1LzUAL3BpeWc1LzUAL2JyYmc1LzUAL3B1cmQ1LzUAL3lsb3JyZDUvNQAvb3JyZDUvNQAvcGFpcmVkNS81AC9zZXQzNS81AC9zZXQyNS81AC9wYXN0ZWwyNS81AC9kYXJrMjUvNQAvc2V0MTUvNQAvcGFzdGVsMTUvNQAvcGFpcmVkMTIvNQAvc2V0MzEyLzUAL3JkZ3kxMS81AC9yZHlsYnUxMS81AC9yZGJ1MTEvNQAvcHVvcjExLzUAL3ByZ24xMS81AC9yZHlsZ24xMS81AC9zcGVjdHJhbDExLzUAL3BpeWcxMS81AC9icmJnMTEvNQAvcGFpcmVkMTEvNQAvc2V0MzExLzUAL3JkZ3kxMC81AC9yZHlsYnUxMC81AC9yZGJ1MTAvNQAvcHVvcjEwLzUAL3ByZ24xMC81AC9yZHlsZ24xMC81AC9zcGVjdHJhbDEwLzUAL3BpeWcxMC81AC9icmJnMTAvNQAvcGFpcmVkMTAvNQAvc2V0MzEwLzUAYmlnLTUAQklHLTUAIC1kYXNoIDUAaXZvcnk0AGdyZXk0AGRhcmtzbGF0ZWdyYXk0AFx4NABzbm93NABsaWdodHllbGxvdzQAaG9uZXlkZXc0AHdoZWF0NAB0b21hdG80AHJvc3licm93bjQAbWFyb29uNABsaWdodHNhbG1vbjQAbGVtb25jaGlmZm9uNABzcHJpbmdncmVlbjQAZGFya29saXZlZ3JlZW40AHBhbGVncmVlbjQAZGFya3NlYWdyZWVuNABsaWdodGN5YW40AHRhbjQAcGx1bTQAc2Vhc2hlbGw0AGNvcmFsNABob3RwaW5rNABsaWdodHBpbms0AGRlZXBwaW5rNABjb3Juc2lsazQAZmlyZWJyaWNrNABraGFraTQAbGF2ZW5kZXJibHVzaDQAcGVhY2hwdWZmNABiaXNxdWU0AGxpZ2h0c2t5Ymx1ZTQAZGVlcHNreWJsdWU0AGxpZ2h0Ymx1ZTQAY2FkZXRibHVlNABkb2RnZXJibHVlNABsaWdodHN0ZWVsYmx1ZTQAcm95YWxibHVlNABzbGF0ZWJsdWU0AG5hdmFqb3doaXRlNABhbnRpcXVld2hpdGU0AGNob2NvbGF0ZTQAY2hhcnRyZXVzZTQAbWlzdHlyb3NlNABwYWxldHVycXVvaXNlNABhenVyZTQAdGhlcmU0AGFxdWFtYXJpbmU0AHRoaXN0bGU0AG1lZGl1bXB1cnBsZTQAZGFya29yYW5nZTQAbGlnaHRnb2xkZW5yb2Q0AGRhcmtnb2xkZW5yb2Q0AGJ1cmx5d29vZDQAZ29sZDQAbWVkaXVtb3JjaGlkNABkYXJrb3JjaGlkNABwYWxldmlvbGV0cmVkNABpbmRpYW5yZWQ0AG9yYW5nZXJlZDQAb2xpdmVkcmFiNABtYWdlbnRhNABzaWVubmE0AFx4RjQAXHhFNABceEQ0AFx4QzQAXHhCNABceEE0AGdyZXk5NABncmF5OTQAXHg5NABncmV5ODQAZ3JheTg0AFx4ODQAZ3JleTc0AGdyYXk3NABncmV5NjQAZ3JheTY0AGdyZXk1NABncmF5NTQAMjAyNjAzMDMuMDQ1NABncmV5NDQAZ3JheTQ0AGdyZXkzNABncmF5MzQAZnJhYzM0AGdyZXkyNABncmF5MjQAZ3JleTE0AGdyYXkxNABceDE0AGZyYWMxNAAvcmRneTkvNAAvYnVwdTkvNAAvcmRwdTkvNAAvcHVidTkvNAAveWxnbmJ1OS80AC9nbmJ1OS80AC9yZHlsYnU5LzQAL3JkYnU5LzQAL2dyZXlzOS80AC9ncmVlbnM5LzQAL2JsdWVzOS80AC9wdXJwbGVzOS80AC9vcmFuZ2VzOS80AC9yZWRzOS80AC9wdW9yOS80AC95bG9yYnI5LzQAL3B1YnVnbjkvNAAvYnVnbjkvNAAvcHJnbjkvNAAvcmR5bGduOS80AC95bGduOS80AC9zcGVjdHJhbDkvNAAvcGl5ZzkvNAAvYnJiZzkvNAAvcHVyZDkvNAAveWxvcnJkOS80AC9vcnJkOS80AC9wYWlyZWQ5LzQAL3NldDM5LzQAL3NldDE5LzQAL3Bhc3RlbDE5LzQAL3JkZ3k4LzQAL2J1cHU4LzQAL3JkcHU4LzQAL3B1YnU4LzQAL3lsZ25idTgvNAAvZ25idTgvNAAvcmR5bGJ1OC80AC9yZGJ1OC80AC9hY2NlbnQ4LzQAL2dyZXlzOC80AC9ncmVlbnM4LzQAL2JsdWVzOC80AC9wdXJwbGVzOC80AC9vcmFuZ2VzOC80AC9yZWRzOC80AC9wdW9yOC80AC95bG9yYnI4LzQAL3B1YnVnbjgvNAAvYnVnbjgvNAAvcHJnbjgvNAAvcmR5bGduOC80AC95bGduOC80AC9zcGVjdHJhbDgvNAAvcGl5ZzgvNAAvYnJiZzgvNAAvcHVyZDgvNAAveWxvcnJkOC80AC9vcnJkOC80AC9wYWlyZWQ4LzQAL3NldDM4LzQAL3NldDI4LzQAL3Bhc3RlbDI4LzQAL2RhcmsyOC80AC9zZXQxOC80AC9wYXN0ZWwxOC80AC9yZGd5Ny80AC9idXB1Ny80AC9yZHB1Ny80AC9wdWJ1Ny80AC95bGduYnU3LzQAL2duYnU3LzQAL3JkeWxidTcvNAAvcmRidTcvNAAvYWNjZW50Ny80AC9ncmV5czcvNAAvZ3JlZW5zNy80AC9ibHVlczcvNAAvcHVycGxlczcvNAAvb3JhbmdlczcvNAAvcmVkczcvNAAvcHVvcjcvNAAveWxvcmJyNy80AC9wdWJ1Z243LzQAL2J1Z243LzQAL3ByZ243LzQAL3JkeWxnbjcvNAAveWxnbjcvNAAvc3BlY3RyYWw3LzQAL3BpeWc3LzQAL2JyYmc3LzQAL3B1cmQ3LzQAL3lsb3JyZDcvNAAvb3JyZDcvNAAvcGFpcmVkNy80AC9zZXQzNy80AC9zZXQyNy80AC9wYXN0ZWwyNy80AC9kYXJrMjcvNAAvc2V0MTcvNAAvcGFzdGVsMTcvNAAvcmRneTYvNAAvYnVwdTYvNAAvcmRwdTYvNAAvcHVidTYvNAAveWxnbmJ1Ni80AC9nbmJ1Ni80AC9yZHlsYnU2LzQAL3JkYnU2LzQAL2FjY2VudDYvNAAvZ3JleXM2LzQAL2dyZWVuczYvNAAvYmx1ZXM2LzQAL3B1cnBsZXM2LzQAL29yYW5nZXM2LzQAL3JlZHM2LzQAL3B1b3I2LzQAL3lsb3JicjYvNAAvcHVidWduNi80AC9idWduNi80AC9wcmduNi80AC9yZHlsZ242LzQAL3lsZ242LzQAL3NwZWN0cmFsNi80AC9waXlnNi80AC9icmJnNi80AC9wdXJkNi80AC95bG9ycmQ2LzQAL29ycmQ2LzQAL3BhaXJlZDYvNAAvc2V0MzYvNAAvc2V0MjYvNAAvcGFzdGVsMjYvNAAvZGFyazI2LzQAL3NldDE2LzQAL3Bhc3RlbDE2LzQAL3JkZ3k1LzQAL2J1cHU1LzQAL3JkcHU1LzQAL3B1YnU1LzQAL3lsZ25idTUvNAAvZ25idTUvNAAvcmR5bGJ1NS80AC9yZGJ1NS80AC9hY2NlbnQ1LzQAL2dyZXlzNS80AC9ncmVlbnM1LzQAL2JsdWVzNS80AC9wdXJwbGVzNS80AC9vcmFuZ2VzNS80AC9yZWRzNS80AC9wdW9yNS80AC95bG9yYnI1LzQAL3B1YnVnbjUvNAAvYnVnbjUvNAAvcHJnbjUvNAAvcmR5bGduNS80AC95bGduNS80AC9zcGVjdHJhbDUvNAAvcGl5ZzUvNAAvYnJiZzUvNAAvcHVyZDUvNAAveWxvcnJkNS80AC9vcnJkNS80AC9wYWlyZWQ1LzQAL3NldDM1LzQAL3NldDI1LzQAL3Bhc3RlbDI1LzQAL2RhcmsyNS80AC9zZXQxNS80AC9wYXN0ZWwxNS80AC9yZGd5NC80AC9idXB1NC80AC9yZHB1NC80AC9wdWJ1NC80AC95bGduYnU0LzQAL2duYnU0LzQAL3JkeWxidTQvNAAvcmRidTQvNAAvYWNjZW50NC80AC9ncmV5czQvNAAvZ3JlZW5zNC80AC9ibHVlczQvNAAvcHVycGxlczQvNAAvb3JhbmdlczQvNAAvcmVkczQvNAAvcHVvcjQvNAAveWxvcmJyNC80AC9wdWJ1Z240LzQAL2J1Z240LzQAL3ByZ240LzQAL3JkeWxnbjQvNAAveWxnbjQvNAAvc3BlY3RyYWw0LzQAL3BpeWc0LzQAL2JyYmc0LzQAL3B1cmQ0LzQAL3lsb3JyZDQvNAAvb3JyZDQvNAAvcGFpcmVkNC80AC9zZXQzNC80AC9zZXQyNC80AC9wYXN0ZWwyNC80AC9kYXJrMjQvNAAvc2V0MTQvNAAvcGFzdGVsMTQvNAAvcGFpcmVkMTIvNAAvc2V0MzEyLzQAL3JkZ3kxMS80AC9yZHlsYnUxMS80AC9yZGJ1MTEvNAAvcHVvcjExLzQAL3ByZ24xMS80AC9yZHlsZ24xMS80AC9zcGVjdHJhbDExLzQAL3BpeWcxMS80AC9icmJnMTEvNAAvcGFpcmVkMTEvNAAvc2V0MzExLzQAL3JkZ3kxMC80AC9yZHlsYnUxMC80AC9yZGJ1MTAvNAAvcHVvcjEwLzQAL3ByZ24xMC80AC9yZHlsZ24xMC80AC9zcGVjdHJhbDEwLzQAL3BpeWcxMC80AC9icmJnMTAvNAAvcGFpcmVkMTAvNAAvc2V0MzEwLzQAMS40AG4gPj0gNABzaWRlcyA9PSA0AGl2b3J5MwBTcGFyc2VNYXRyaXhfbXVsdGlwbHkzAGdyZXkzAGRhcmtzbGF0ZWdyYXkzAFx4MwBzbm93MwBsaWdodHllbGxvdzMAaG9uZXlkZXczAHdoZWF0MwBzdXAzAHRvbWF0bzMAcm9zeWJyb3duMwBtYXJvb24zAGxpZ2h0c2FsbW9uMwBsZW1vbmNoaWZmb24zAHNwcmluZ2dyZWVuMwBkYXJrb2xpdmVncmVlbjMAcGFsZWdyZWVuMwBkYXJrc2VhZ3JlZW4zAGxpZ2h0Y3lhbjMAdGFuMwBwbHVtMwBzZWFzaGVsbDMAY29yYWwzAGhvdHBpbmszAGxpZ2h0cGluazMAZGVlcHBpbmszAGNvcm5zaWxrMwBmaXJlYnJpY2szAGtoYWtpMwBsYXZlbmRlcmJsdXNoMwBwZWFjaHB1ZmYzAGJpc3F1ZTMAbGlnaHRza3libHVlMwBkZWVwc2t5Ymx1ZTMAbGlnaHRibHVlMwBjYWRldGJsdWUzAGRvZGdlcmJsdWUzAGxpZ2h0c3RlZWxibHVlMwByb3lhbGJsdWUzAHNsYXRlYmx1ZTMAbmF2YWpvd2hpdGUzAGFudGlxdWV3aGl0ZTMAY2hvY29sYXRlMwBjaGFydHJldXNlMwBtaXN0eXJvc2UzAHBhbGV0dXJxdW9pc2UzAGF6dXJlMwBhcXVhbWFyaW5lMwB0aGlzdGxlMwBtZWRpdW1wdXJwbGUzAGRhcmtvcmFuZ2UzAGxpZ2h0Z29sZGVucm9kMwBkYXJrZ29sZGVucm9kMwBidXJseXdvb2QzAGdvbGQzAG1lZGl1bW9yY2hpZDMAZGFya29yY2hpZDMAcGFsZXZpb2xldHJlZDMAaW5kaWFucmVkMwBvcmFuZ2VyZWQzAG9saXZlZHJhYjMAbWFnZW50YTMAc2llbm5hMwBceEYzAFx4RTMAXHhEMwBceEMzAFx4QjMAXHhBMwBncmV5OTMAZ3JheTkzAFx4OTMAZ3JleTgzAGdyYXk4MwBceDgzAGdyZXk3MwBncmF5NzMAZ3JleTYzAGdyYXk2MwBncmV5NTMAZ3JheTUzAFNUU0laRShuZXh0KSA8PSBVSU5UNjRfQygxKSA8PCA1MwBTVFNJWkUobikgPD0gVUlOVDY0X0MoMSkgPDwgNTMAZ3JleTQzAGdyYXk0MwBncmV5MzMAZ3JheTMzAGdyZXkyMwBncmF5MjMAZ3JleTEzAGdyYXkxMwBceDEzAC9yZGd5OS8zAC9idXB1OS8zAC9yZHB1OS8zAC9wdWJ1OS8zAC95bGduYnU5LzMAL2duYnU5LzMAL3JkeWxidTkvMwAvcmRidTkvMwAvZ3JleXM5LzMAL2dyZWVuczkvMwAvYmx1ZXM5LzMAL3B1cnBsZXM5LzMAL29yYW5nZXM5LzMAL3JlZHM5LzMAL3B1b3I5LzMAL3lsb3JicjkvMwAvcHVidWduOS8zAC9idWduOS8zAC9wcmduOS8zAC9yZHlsZ245LzMAL3lsZ245LzMAL3NwZWN0cmFsOS8zAC9waXlnOS8zAC9icmJnOS8zAC9wdXJkOS8zAC95bG9ycmQ5LzMAL29ycmQ5LzMAL3BhaXJlZDkvMwAvc2V0MzkvMwAvc2V0MTkvMwAvcGFzdGVsMTkvMwAvcmRneTgvMwAvYnVwdTgvMwAvcmRwdTgvMwAvcHVidTgvMwAveWxnbmJ1OC8zAC9nbmJ1OC8zAC9yZHlsYnU4LzMAL3JkYnU4LzMAL2FjY2VudDgvMwAvZ3JleXM4LzMAL2dyZWVuczgvMwAvYmx1ZXM4LzMAL3B1cnBsZXM4LzMAL29yYW5nZXM4LzMAL3JlZHM4LzMAL3B1b3I4LzMAL3lsb3JicjgvMwAvcHVidWduOC8zAC9idWduOC8zAC9wcmduOC8zAC9yZHlsZ244LzMAL3lsZ244LzMAL3NwZWN0cmFsOC8zAC9waXlnOC8zAC9icmJnOC8zAC9wdXJkOC8zAC95bG9ycmQ4LzMAL29ycmQ4LzMAL3BhaXJlZDgvMwAvc2V0MzgvMwAvc2V0MjgvMwAvcGFzdGVsMjgvMwAvZGFyazI4LzMAL3NldDE4LzMAL3Bhc3RlbDE4LzMAL3JkZ3k3LzMAL2J1cHU3LzMAL3JkcHU3LzMAL3B1YnU3LzMAL3lsZ25idTcvMwAvZ25idTcvMwAvcmR5bGJ1Ny8zAC9yZGJ1Ny8zAC9hY2NlbnQ3LzMAL2dyZXlzNy8zAC9ncmVlbnM3LzMAL2JsdWVzNy8zAC9wdXJwbGVzNy8zAC9vcmFuZ2VzNy8zAC9yZWRzNy8zAC9wdW9yNy8zAC95bG9yYnI3LzMAL3B1YnVnbjcvMwAvYnVnbjcvMwAvcHJnbjcvMwAvcmR5bGduNy8zAC95bGduNy8zAC9zcGVjdHJhbDcvMwAvcGl5ZzcvMwAvYnJiZzcvMwAvcHVyZDcvMwAveWxvcnJkNy8zAC9vcnJkNy8zAC9wYWlyZWQ3LzMAL3NldDM3LzMAL3NldDI3LzMAL3Bhc3RlbDI3LzMAL2RhcmsyNy8zAC9zZXQxNy8zAC9wYXN0ZWwxNy8zAC9yZGd5Ni8zAC9idXB1Ni8zAC9yZHB1Ni8zAC9wdWJ1Ni8zAC95bGduYnU2LzMAL2duYnU2LzMAL3JkeWxidTYvMwAvcmRidTYvMwAvYWNjZW50Ni8zAC9ncmV5czYvMwAvZ3JlZW5zNi8zAC9ibHVlczYvMwAvcHVycGxlczYvMwAvb3JhbmdlczYvMwAvcmVkczYvMwAvcHVvcjYvMwAveWxvcmJyNi8zAC9wdWJ1Z242LzMAL2J1Z242LzMAL3ByZ242LzMAL3JkeWxnbjYvMwAveWxnbjYvMwAvc3BlY3RyYWw2LzMAL3BpeWc2LzMAL2JyYmc2LzMAL3B1cmQ2LzMAL3lsb3JyZDYvMwAvb3JyZDYvMwAvcGFpcmVkNi8zAC9zZXQzNi8zAC9zZXQyNi8zAC9wYXN0ZWwyNi8zAC9kYXJrMjYvMwAvc2V0MTYvMwAvcGFzdGVsMTYvMwAvcmRneTUvMwAvYnVwdTUvMwAvcmRwdTUvMwAvcHVidTUvMwAveWxnbmJ1NS8zAC9nbmJ1NS8zAC9yZHlsYnU1LzMAL3JkYnU1LzMAL2FjY2VudDUvMwAvZ3JleXM1LzMAL2dyZWVuczUvMwAvYmx1ZXM1LzMAL3B1cnBsZXM1LzMAL29yYW5nZXM1LzMAL3JlZHM1LzMAL3B1b3I1LzMAL3lsb3JicjUvMwAvcHVidWduNS8zAC9idWduNS8zAC9wcmduNS8zAC9yZHlsZ241LzMAL3lsZ241LzMAL3NwZWN0cmFsNS8zAC9waXlnNS8zAC9icmJnNS8zAC9wdXJkNS8zAC95bG9ycmQ1LzMAL29ycmQ1LzMAL3BhaXJlZDUvMwAvc2V0MzUvMwAvc2V0MjUvMwAvcGFzdGVsMjUvMwAvZGFyazI1LzMAL3NldDE1LzMAL3Bhc3RlbDE1LzMAL3JkZ3k0LzMAL2J1cHU0LzMAL3JkcHU0LzMAL3B1YnU0LzMAL3lsZ25idTQvMwAvZ25idTQvMwAvcmR5bGJ1NC8zAC9yZGJ1NC8zAC9hY2NlbnQ0LzMAL2dyZXlzNC8zAC9ncmVlbnM0LzMAL2JsdWVzNC8zAC9wdXJwbGVzNC8zAC9vcmFuZ2VzNC8zAC9yZWRzNC8zAC9wdW9yNC8zAC95bG9yYnI0LzMAL3B1YnVnbjQvMwAvYnVnbjQvMwAvcHJnbjQvMwAvcmR5bGduNC8zAC95bGduNC8zAC9zcGVjdHJhbDQvMwAvcGl5ZzQvMwAvYnJiZzQvMwAvcHVyZDQvMwAveWxvcnJkNC8zAC9vcnJkNC8zAC9wYWlyZWQ0LzMAL3NldDM0LzMAL3NldDI0LzMAL3Bhc3RlbDI0LzMAL2RhcmsyNC8zAC9zZXQxNC8zAC9wYXN0ZWwxNC8zAC9yZGd5My8zAC9idXB1My8zAC9yZHB1My8zAC9wdWJ1My8zAC95bGduYnUzLzMAL2duYnUzLzMAL3JkeWxidTMvMwAvcmRidTMvMwAvYWNjZW50My8zAC9ncmV5czMvMwAvZ3JlZW5zMy8zAC9ibHVlczMvMwAvcHVycGxlczMvMwAvb3JhbmdlczMvMwAvcmVkczMvMwAvcHVvcjMvMwAveWxvcmJyMy8zAC9wdWJ1Z24zLzMAL2J1Z24zLzMAL3ByZ24zLzMAL3JkeWxnbjMvMwAveWxnbjMvMwAvc3BlY3RyYWwzLzMAL3BpeWczLzMAL2JyYmczLzMAL3B1cmQzLzMAL3lsb3JyZDMvMwAvb3JyZDMvMwAvcGFpcmVkMy8zAC9zZXQzMy8zAC9zZXQyMy8zAC9wYXN0ZWwyMy8zAC9kYXJrMjMvMwAvc2V0MTMvMwAvcGFzdGVsMTMvMwAvcGFpcmVkMTIvMwAvc2V0MzEyLzMAL3JkZ3kxMS8zAC9yZHlsYnUxMS8zAC9yZGJ1MTEvMwAvcHVvcjExLzMAL3ByZ24xMS8zAC9yZHlsZ24xMS8zAC9zcGVjdHJhbDExLzMAL3BpeWcxMS8zAC9icmJnMTEvMwAvcGFpcmVkMTEvMwAvc2V0MzExLzMAL3JkZ3kxMC8zAC9yZHlsYnUxMC8zAC9yZGJ1MTAvMwAvcHVvcjEwLzMAL3ByZ24xMC8zAC9yZHlsZ24xMC8zAC9zcGVjdHJhbDEwLzMAL3BpeWcxMC8zAC9icmJnMTAvMwAvcGFpcmVkMTAvMwAvc2V0MzEwLzMAMTQuMS4zAGl2b3J5MgBncmV5MgBkYXJrc2xhdGVncmF5MgBceDIAc25vdzIAbGlnaHR5ZWxsb3cyAGhvbmV5ZGV3MgBSVHJlZUluc2VydDIAd2hlYXQyAHN1cDIAbm9wMgB0b21hdG8yAHJvc3licm93bjIAbWFyb29uMgBsaWdodHNhbG1vbjIAbGVtb25jaGlmZm9uMgBzcHJpbmdncmVlbjIAZGFya29saXZlZ3JlZW4yAHBhbGVncmVlbjIAZGFya3NlYWdyZWVuMgBsaWdodGN5YW4yAHRhbjIAcGx1bTIAc2Vhc2hlbGwyAGNvcmFsMgBob3RwaW5rMgBsaWdodHBpbmsyAGRlZXBwaW5rMgBjb3Juc2lsazIAZmlyZWJyaWNrMgBraGFraTIAbGF2ZW5kZXJibHVzaDIAcGVhY2hwdWZmMgBicm9uemUyAGJpc3F1ZTIAbGlnaHRza3libHVlMgBkZWVwc2t5Ymx1ZTIAbGlnaHRibHVlMgBjYWRldGJsdWUyAGRvZGdlcmJsdWUyAGxpZ2h0c3RlZWxibHVlMgByb3lhbGJsdWUyAHNsYXRlYmx1ZTIAbmF2YWpvd2hpdGUyAGFudGlxdWV3aGl0ZTIAY2hvY29sYXRlMgBjaGFydHJldXNlMgBtaXN0eXJvc2UyAHBhbGV0dXJxdW9pc2UyAGF6dXJlMgBhcXVhbWFyaW5lMgB0aGlzdGxlMgBtZWRpdW1wdXJwbGUyAGRhcmtvcmFuZ2UyAGxpZ2h0Z29sZGVucm9kMgBkYXJrZ29sZGVucm9kMgBidXJseXdvb2QyAGdvbGQyAG1lZGl1bW9yY2hpZDIAZGFya29yY2hpZDIAcGFsZXZpb2xldHJlZDIAaW5kaWFucmVkMgBvcmFuZ2VyZWQyAG9saXZlZHJhYjIAbWFnZW50YTIAc2llbm5hMgBceEYyAFx4RTIAXHhEMgBceEMyAFx4QjIAXHhBMgBncmV5OTIAZ3JheTkyAFx4OTIAZ3JleTgyAGdyYXk4MgBceDgyAGdyZXk3MgBncmF5NzIAZ3JleTYyAGdyYXk2MgBncmV5NTIAZ3JheTUyAGdyZXk0MgBncmF5NDIAZ3JleTMyAGdyYXkzMgBncmV5MjIAZ3JheTIyAGdyZXkxMgBncmF5MTIAXHgxMgBmcmFjMTIAL3BhaXJlZDEyLzEyAC9zZXQzMTIvMTIAL3JkZ3k5LzIAL2J1cHU5LzIAL3JkcHU5LzIAL3B1YnU5LzIAL3lsZ25idTkvMgAvZ25idTkvMgAvcmR5bGJ1OS8yAC9yZGJ1OS8yAC9ncmV5czkvMgAvZ3JlZW5zOS8yAC9ibHVlczkvMgAvcHVycGxlczkvMgAvb3JhbmdlczkvMgAvcmVkczkvMgAvcHVvcjkvMgAveWxvcmJyOS8yAC9wdWJ1Z245LzIAL2J1Z245LzIAL3ByZ245LzIAL3JkeWxnbjkvMgAveWxnbjkvMgAvc3BlY3RyYWw5LzIAL3BpeWc5LzIAL2JyYmc5LzIAL3B1cmQ5LzIAL3lsb3JyZDkvMgAvb3JyZDkvMgAvcGFpcmVkOS8yAC9zZXQzOS8yAC9zZXQxOS8yAC9wYXN0ZWwxOS8yAC9yZGd5OC8yAC9idXB1OC8yAC9yZHB1OC8yAC9wdWJ1OC8yAC95bGduYnU4LzIAL2duYnU4LzIAL3JkeWxidTgvMgAvcmRidTgvMgAvYWNjZW50OC8yAC9ncmV5czgvMgAvZ3JlZW5zOC8yAC9ibHVlczgvMgAvcHVycGxlczgvMgAvb3JhbmdlczgvMgAvcmVkczgvMgAvcHVvcjgvMgAveWxvcmJyOC8yAC9wdWJ1Z244LzIAL2J1Z244LzIAL3ByZ244LzIAL3JkeWxnbjgvMgAveWxnbjgvMgAvc3BlY3RyYWw4LzIAL3BpeWc4LzIAL2JyYmc4LzIAL3B1cmQ4LzIAL3lsb3JyZDgvMgAvb3JyZDgvMgAvcGFpcmVkOC8yAC9zZXQzOC8yAC9zZXQyOC8yAC9wYXN0ZWwyOC8yAC9kYXJrMjgvMgAvc2V0MTgvMgAvcGFzdGVsMTgvMgAvcmRneTcvMgAvYnVwdTcvMgAvcmRwdTcvMgAvcHVidTcvMgAveWxnbmJ1Ny8yAC9nbmJ1Ny8yAC9yZHlsYnU3LzIAL3JkYnU3LzIAL2FjY2VudDcvMgAvZ3JleXM3LzIAL2dyZWVuczcvMgAvYmx1ZXM3LzIAL3B1cnBsZXM3LzIAL29yYW5nZXM3LzIAL3JlZHM3LzIAL3B1b3I3LzIAL3lsb3JicjcvMgAvcHVidWduNy8yAC9idWduNy8yAC9wcmduNy8yAC9yZHlsZ243LzIAL3lsZ243LzIAL3NwZWN0cmFsNy8yAC9waXlnNy8yAC9icmJnNy8yAC9wdXJkNy8yAC95bG9ycmQ3LzIAL29ycmQ3LzIAL3BhaXJlZDcvMgAvc2V0MzcvMgAvc2V0MjcvMgAvcGFzdGVsMjcvMgAvZGFyazI3LzIAL3NldDE3LzIAL3Bhc3RlbDE3LzIAL3JkZ3k2LzIAL2J1cHU2LzIAL3JkcHU2LzIAL3B1YnU2LzIAL3lsZ25idTYvMgAvZ25idTYvMgAvcmR5bGJ1Ni8yAC9yZGJ1Ni8yAC9hY2NlbnQ2LzIAL2dyZXlzNi8yAC9ncmVlbnM2LzIAL2JsdWVzNi8yAC9wdXJwbGVzNi8yAC9vcmFuZ2VzNi8yAC9yZWRzNi8yAC9wdW9yNi8yAC95bG9yYnI2LzIAL3B1YnVnbjYvMgAvYnVnbjYvMgAvcHJnbjYvMgAvcmR5bGduNi8yAC95bGduNi8yAC9zcGVjdHJhbDYvMgAvcGl5ZzYvMgAvYnJiZzYvMgAvcHVyZDYvMgAveWxvcnJkNi8yAC9vcnJkNi8yAC9wYWlyZWQ2LzIAL3NldDM2LzIAL3NldDI2LzIAL3Bhc3RlbDI2LzIAL2RhcmsyNi8yAC9zZXQxNi8yAC9wYXN0ZWwxNi8yAC9yZGd5NS8yAC9idXB1NS8yAC9yZHB1NS8yAC9wdWJ1NS8yAC95bGduYnU1LzIAL2duYnU1LzIAL3JkeWxidTUvMgAvcmRidTUvMgAvYWNjZW50NS8yAC9ncmV5czUvMgAvZ3JlZW5zNS8yAC9ibHVlczUvMgAvcHVycGxlczUvMgAvb3JhbmdlczUvMgAvcmVkczUvMgAvcHVvcjUvMgAveWxvcmJyNS8yAC9wdWJ1Z241LzIAL2J1Z241LzIAL3ByZ241LzIAL3JkeWxnbjUvMgAveWxnbjUvMgAvc3BlY3RyYWw1LzIAL3BpeWc1LzIAL2JyYmc1LzIAL3B1cmQ1LzIAL3lsb3JyZDUvMgAvb3JyZDUvMgAvcGFpcmVkNS8yAC9zZXQzNS8yAC9zZXQyNS8yAC9wYXN0ZWwyNS8yAC9kYXJrMjUvMgAvc2V0MTUvMgAvcGFzdGVsMTUvMgAvcmRneTQvMgAvYnVwdTQvMgAvcmRwdTQvMgAvcHVidTQvMgAveWxnbmJ1NC8yAC9nbmJ1NC8yAC9yZHlsYnU0LzIAL3JkYnU0LzIAL2FjY2VudDQvMgAvZ3JleXM0LzIAL2dyZWVuczQvMgAvYmx1ZXM0LzIAL3B1cnBsZXM0LzIAL29yYW5nZXM0LzIAL3JlZHM0LzIAL3B1b3I0LzIAL3lsb3JicjQvMgAvcHVidWduNC8yAC9idWduNC8yAC9wcmduNC8yAC9yZHlsZ240LzIAL3lsZ240LzIAL3NwZWN0cmFsNC8yAC9waXlnNC8yAC9icmJnNC8yAC9wdXJkNC8yAC95bG9ycmQ0LzIAL29ycmQ0LzIAL3BhaXJlZDQvMgAvc2V0MzQvMgAvc2V0MjQvMgAvcGFzdGVsMjQvMgAvZGFyazI0LzIAL3NldDE0LzIAL3Bhc3RlbDE0LzIAL3JkZ3kzLzIAL2J1cHUzLzIAL3JkcHUzLzIAL3B1YnUzLzIAL3lsZ25idTMvMgAvZ25idTMvMgAvcmR5bGJ1My8yAC9yZGJ1My8yAC9hY2NlbnQzLzIAL2dyZXlzMy8yAC9ncmVlbnMzLzIAL2JsdWVzMy8yAC9wdXJwbGVzMy8yAC9vcmFuZ2VzMy8yAC9yZWRzMy8yAC9wdW9yMy8yAC95bG9yYnIzLzIAL3B1YnVnbjMvMgAvYnVnbjMvMgAvcHJnbjMvMgAvcmR5bGduMy8yAC95bGduMy8yAC9zcGVjdHJhbDMvMgAvcGl5ZzMvMgAvYnJiZzMvMgAvcHVyZDMvMgAveWxvcnJkMy8yAC9vcnJkMy8yAC9wYWlyZWQzLzIAL3NldDMzLzIAL3NldDIzLzIAL3Bhc3RlbDIzLzIAL2RhcmsyMy8yAC9zZXQxMy8yAC9wYXN0ZWwxMy8yAC9wYWlyZWQxMi8yAC9zZXQzMTIvMgAvcmRneTExLzIAL3JkeWxidTExLzIAL3JkYnUxMS8yAC9wdW9yMTEvMgAvcHJnbjExLzIAL3JkeWxnbjExLzIAL3NwZWN0cmFsMTEvMgAvcGl5ZzExLzIAL2JyYmcxMS8yAC9wYWlyZWQxMS8yAC9zZXQzMTEvMgAvcmRneTEwLzIAL3JkeWxidTEwLzIAL3JkYnUxMC8yAC9wdW9yMTAvMgAvcHJnbjEwLzIAL3JkeWxnbjEwLzIAL3NwZWN0cmFsMTAvMgAvcGl5ZzEwLzIAL2JyYmcxMC8yAC9wYWlyZWQxMC8yAC9zZXQzMTAvMgAxLjIAIC1kYXNoIDIAbGVuID49IDIAZXhwID09IDEgfHwgZXhwID09IDIAZGltID09IDIATkRfb3V0KHYpLnNpemUgPT0gMgBpdm9yeTEAZ3JleTEAZGFya3NsYXRlZ3JheTEAXHgxAHNub3cxAGxpZ2h0eWVsbG93MQBob25leWRldzEAbnNsaW1pdDEAd2hlYXQxAHN1cDEAbm9wMQB0b21hdG8xAHJvc3licm93bjEAbWFyb29uMQBsaWdodHNhbG1vbjEAbGVtb25jaGlmZm9uMQBsYXRpbjEAYWdvcGVuMQBzcHJpbmdncmVlbjEAZGFya29saXZlZ3JlZW4xAHBhbGVncmVlbjEAZGFya3NlYWdyZWVuMQBsaWdodGN5YW4xAHRhbjEAcGx1bTEAc2Vhc2hlbGwxAGNvcmFsMQBob3RwaW5rMQBsaWdodHBpbmsxAGRlZXBwaW5rMQBjb3Juc2lsazEAZmlyZWJyaWNrMQBqMCA8PSBpMSAmJiBpMSA8PSBqMQBraGFraTEAbGF2ZW5kZXJibHVzaDEAcGVhY2hwdWZmMQBiaXNxdWUxAGxpZ2h0c2t5Ymx1ZTEAZGVlcHNreWJsdWUxAGxpZ2h0Ymx1ZTEAY2FkZXRibHVlMQBkb2RnZXJibHVlMQBsaWdodHN0ZWVsYmx1ZTEAcm95YWxibHVlMQBzbGF0ZWJsdWUxAG5hdmFqb3doaXRlMQBhbnRpcXVld2hpdGUxAGNob2NvbGF0ZTEAY2hhcnRyZXVzZTEAbWlzdHlyb3NlMQBwYWxldHVycXVvaXNlMQBhenVyZTEAYXF1YW1hcmluZTEAdGhpc3RsZTEAbWVkaXVtcHVycGxlMQBkYXJrb3JhbmdlMQBhcmdfZTAgJiYgYXJnX2UxAGxpZ2h0Z29sZGVucm9kMQBkYXJrZ29sZGVucm9kMQBidXJseXdvb2QxAGdvbGQxAG1lZGl1bW9yY2hpZDEAZGFya29yY2hpZDEAcGFsZXZpb2xldHJlZDEAaW5kaWFucmVkMQBvcmFuZ2VyZWQxAG9saXZlZHJhYjEAbWFnZW50YTEAc2llbm5hMQBceEYxAFx4RTEAXHhEMQBceEMxAFx4QjEAXHhBMQBncmV5OTEAZ3JheTkxAFx4OTEAZ3JleTgxAGdyYXk4MQBceDgxAGdyZXk3MQBncmF5NzEAZ3JleTYxAGdyYXk2MQBncmV5NTEAZ3JheTUxAGdyZXk0MQBncmF5NDEAZ3JleTMxAGdyYXkzMQBncmV5MjEAZ3JheTIxAGdyZXkxMQBncmF5MTEAXHgxMQAvcGFpcmVkMTIvMTEAL3NldDMxMi8xMQAvcmRneTExLzExAC9yZHlsYnUxMS8xMQAvcmRidTExLzExAC9wdW9yMTEvMTEAL3ByZ24xMS8xMQAvcmR5bGduMTEvMTEAL3NwZWN0cmFsMTEvMTEAL3BpeWcxMS8xMQAvYnJiZzExLzExAC9wYWlyZWQxMS8xMQAvc2V0MzExLzExAGNzW2ldLT5zbGFjaygpPi0wLjAwMDAwMDEAL3JkZ3k5LzEAL2J1cHU5LzEAL3JkcHU5LzEAL3B1YnU5LzEAL3lsZ25idTkvMQAvZ25idTkvMQAvcmR5bGJ1OS8xAC9yZGJ1OS8xAC9ncmV5czkvMQAvZ3JlZW5zOS8xAC9ibHVlczkvMQAvcHVycGxlczkvMQAvb3JhbmdlczkvMQAvcmVkczkvMQAvcHVvcjkvMQAveWxvcmJyOS8xAC9wdWJ1Z245LzEAL2J1Z245LzEAL3ByZ245LzEAL3JkeWxnbjkvMQAveWxnbjkvMQAvc3BlY3RyYWw5LzEAL3BpeWc5LzEAL2JyYmc5LzEAL3B1cmQ5LzEAL3lsb3JyZDkvMQAvb3JyZDkvMQAvcGFpcmVkOS8xAC9zZXQzOS8xAC9zZXQxOS8xAC9wYXN0ZWwxOS8xAC9yZGd5OC8xAC9idXB1OC8xAC9yZHB1OC8xAC9wdWJ1OC8xAC95bGduYnU4LzEAL2duYnU4LzEAL3JkeWxidTgvMQAvcmRidTgvMQAvYWNjZW50OC8xAC9ncmV5czgvMQAvZ3JlZW5zOC8xAC9ibHVlczgvMQAvcHVycGxlczgvMQAvb3JhbmdlczgvMQAvcmVkczgvMQAvcHVvcjgvMQAveWxvcmJyOC8xAC9wdWJ1Z244LzEAL2J1Z244LzEAL3ByZ244LzEAL3JkeWxnbjgvMQAveWxnbjgvMQAvc3BlY3RyYWw4LzEAL3BpeWc4LzEAL2JyYmc4LzEAL3B1cmQ4LzEAL3lsb3JyZDgvMQAvb3JyZDgvMQAvcGFpcmVkOC8xAC9zZXQzOC8xAC9zZXQyOC8xAC9wYXN0ZWwyOC8xAC9kYXJrMjgvMQAvc2V0MTgvMQAvcGFzdGVsMTgvMQAvcmRneTcvMQAvYnVwdTcvMQAvcmRwdTcvMQAvcHVidTcvMQAveWxnbmJ1Ny8xAC9nbmJ1Ny8xAC9yZHlsYnU3LzEAL3JkYnU3LzEAL2FjY2VudDcvMQAvZ3JleXM3LzEAL2dyZWVuczcvMQAvYmx1ZXM3LzEAL3B1cnBsZXM3LzEAL29yYW5nZXM3LzEAL3JlZHM3LzEAL3B1b3I3LzEAL3lsb3JicjcvMQAvcHVidWduNy8xAC9idWduNy8xAC9wcmduNy8xAC9yZHlsZ243LzEAL3lsZ243LzEAL3NwZWN0cmFsNy8xAC9waXlnNy8xAC9icmJnNy8xAC9wdXJkNy8xAC95bG9ycmQ3LzEAL29ycmQ3LzEAL3BhaXJlZDcvMQAvc2V0MzcvMQAvc2V0MjcvMQAvcGFzdGVsMjcvMQAvZGFyazI3LzEAL3NldDE3LzEAL3Bhc3RlbDE3LzEAL3JkZ3k2LzEAL2J1cHU2LzEAL3JkcHU2LzEAL3B1YnU2LzEAL3lsZ25idTYvMQAvZ25idTYvMQAvcmR5bGJ1Ni8xAC9yZGJ1Ni8xAC9hY2NlbnQ2LzEAL2dyZXlzNi8xAC9ncmVlbnM2LzEAL2JsdWVzNi8xAC9wdXJwbGVzNi8xAC9vcmFuZ2VzNi8xAC9yZWRzNi8xAC9wdW9yNi8xAC95bG9yYnI2LzEAL3B1YnVnbjYvMQAvYnVnbjYvMQAvcHJnbjYvMQAvcmR5bGduNi8xAC95bGduNi8xAC9zcGVjdHJhbDYvMQAvcGl5ZzYvMQAvYnJiZzYvMQAvcHVyZDYvMQAveWxvcnJkNi8xAC9vcnJkNi8xAC9wYWlyZWQ2LzEAL3NldDM2LzEAL3NldDI2LzEAL3Bhc3RlbDI2LzEAL2RhcmsyNi8xAC9zZXQxNi8xAC9wYXN0ZWwxNi8xAC9yZGd5NS8xAC9idXB1NS8xAC9yZHB1NS8xAC9wdWJ1NS8xAC95bGduYnU1LzEAL2duYnU1LzEAL3JkeWxidTUvMQAvcmRidTUvMQAvYWNjZW50NS8xAC9ncmV5czUvMQAvZ3JlZW5zNS8xAC9ibHVlczUvMQAvcHVycGxlczUvMQAvb3JhbmdlczUvMQAvcmVkczUvMQAvcHVvcjUvMQAveWxvcmJyNS8xAC9wdWJ1Z241LzEAL2J1Z241LzEAL3ByZ241LzEAL3JkeWxnbjUvMQAveWxnbjUvMQAvc3BlY3RyYWw1LzEAL3BpeWc1LzEAL2JyYmc1LzEAL3B1cmQ1LzEAL3lsb3JyZDUvMQAvb3JyZDUvMQAvcGFpcmVkNS8xAC9zZXQzNS8xAC9zZXQyNS8xAC9wYXN0ZWwyNS8xAC9kYXJrMjUvMQAvc2V0MTUvMQAvcGFzdGVsMTUvMQAvcmRneTQvMQAvYnVwdTQvMQAvcmRwdTQvMQAvcHVidTQvMQAveWxnbmJ1NC8xAC9nbmJ1NC8xAC9yZHlsYnU0LzEAL3JkYnU0LzEAL2FjY2VudDQvMQAvZ3JleXM0LzEAL2dyZWVuczQvMQAvYmx1ZXM0LzEAL3B1cnBsZXM0LzEAL29yYW5nZXM0LzEAL3JlZHM0LzEAL3B1b3I0LzEAL3lsb3JicjQvMQAvcHVidWduNC8xAC9idWduNC8xAC9wcmduNC8xAC9yZHlsZ240LzEAL3lsZ240LzEAL3NwZWN0cmFsNC8xAC9waXlnNC8xAC9icmJnNC8xAC9wdXJkNC8xAC95bG9ycmQ0LzEAL29ycmQ0LzEAL3BhaXJlZDQvMQAvc2V0MzQvMQAvc2V0MjQvMQAvcGFzdGVsMjQvMQAvZGFyazI0LzEAL3NldDE0LzEAL3Bhc3RlbDE0LzEAL3JkZ3kzLzEAL2J1cHUzLzEAL3JkcHUzLzEAL3B1YnUzLzEAL3lsZ25idTMvMQAvZ25idTMvMQAvcmR5bGJ1My8xAC9yZGJ1My8xAC9hY2NlbnQzLzEAL2dyZXlzMy8xAC9ncmVlbnMzLzEAL2JsdWVzMy8xAC9wdXJwbGVzMy8xAC9vcmFuZ2VzMy8xAC9yZWRzMy8xAC9wdW9yMy8xAC95bG9yYnIzLzEAL3B1YnVnbjMvMQAvYnVnbjMvMQAvcHJnbjMvMQAvcmR5bGduMy8xAC95bGduMy8xAC9zcGVjdHJhbDMvMQAvcGl5ZzMvMQAvYnJiZzMvMQAvcHVyZDMvMQAveWxvcnJkMy8xAC9vcnJkMy8xAC9wYWlyZWQzLzEAL3NldDMzLzEAL3NldDIzLzEAL3Bhc3RlbDIzLzEAL2RhcmsyMy8xAC9zZXQxMy8xAC9wYXN0ZWwxMy8xAC9wYWlyZWQxMi8xAC9zZXQzMTIvMQAvcmRneTExLzEAL3JkeWxidTExLzEAL3JkYnUxMS8xAC9wdW9yMTEvMQAvcHJnbjExLzEAL3JkeWxnbjExLzEAL3NwZWN0cmFsMTEvMQAvcGl5ZzExLzEAL2JyYmcxMS8xAC9wYWlyZWQxMS8xAC9zZXQzMTEvMQAvcmRneTEwLzEAL3JkeWxidTEwLzEAL3JkYnUxMC8xAC9wdW9yMTAvMQAvcHJnbjEwLzEAL3JkeWxnbjEwLzEAL3NwZWN0cmFsMTAvMQAvcGl5ZzEwLzEAL2JyYmcxMC8xAC9wYWlyZWQxMC8xAC9zZXQzMTAvMQBsYXRpbi0xAElTT184ODU5LTEASVNPODg1OS0xAElTTy04ODU5LTEAaSA+PSAxAHEtPm4gPT0gMQBydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0ucGFydGl0aW9uW2ldID09IDAgfHwgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLnBhcnRpdGlvbltpXSA9PSAxAGJ6LnNpemUgJSAzID09IDEATElTVF9TSVpFKCZjdHgtPlRyZWVfZWRnZSkgPT0gY3R4LT5OX25vZGVzIC0gMQBub2RlX3NldF9zaXplKGctPm5faWQpID09IG9zaXplICsgMQBuLT5jb3VudCArICgqbm4pLT5jb3VudCA9PSBOT0RFQ0FSRCArIDEAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdICsgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID09IE5PREVDQVJEICsgMQBncmV5MABncmF5MABqc29uMAAjZjBmMGYwACNlMGUwZTAAeGItPmxvY2F0ZWQgPiBBR1hCVUZfSU5MSU5FX1NJWkVfMABcMABUMABceEYwAFx4RTAAXHhEMABceEMwAFx4QjAAXHhBMABncmV5OTAAZ3JheTkwAFx4OTAAZ3JleTgwAGdyYXk4MABceDgwACM4MDgwODAAZ3JleTcwAGdyYXk3MABjY3dyb3QgPT0gMCB8fCBjY3dyb3QgPT0gOTAgfHwgY2N3cm90ID09IDE4MCB8fCBjY3dyb3QgPT0gMjcwAGN3cm90ID09IDAgfHwgY3dyb3QgPT0gOTAgfHwgY3dyb3QgPT0gMTgwIHx8IGN3cm90ID09IDI3MABncmV5NjAAZ3JheTYwAGdyZXk1MABncmF5NTAAZ3JleTQwAGdyYXk0MAByLndpZHRoKCk8MWU0MABncmV5MzAAZ3JheTMwACMzMDMwMzAAZ3JleTIwAGdyYXkyMABncmV5MTAAZ3JheTEwAFx4MTAAIzEwMTAxMAAvcGFpcmVkMTIvMTAAL3NldDMxMi8xMAAvcmRneTExLzEwAC9yZHlsYnUxMS8xMAAvcmRidTExLzEwAC9wdW9yMTEvMTAAL3ByZ24xMS8xMAAvcmR5bGduMTEvMTAAL3NwZWN0cmFsMTEvMTAAL3BpeWcxMS8xMAAvYnJiZzExLzEwAC9wYWlyZWQxMS8xMAAvc2V0MzExLzEwAC9yZGd5MTAvMTAAL3JkeWxidTEwLzEwAC9yZGJ1MTAvMTAAL3B1b3IxMC8xMAAvcHJnbjEwLzEwAC9yZHlsZ24xMC8xMAAvc3BlY3RyYWwxMC8xMAAvcGl5ZzEwLzEwAC9icmJnMTAvMTAAL3BhaXJlZDEwLzEwAC9zZXQzMTAvMTAAMTIwMABncmV5MTAwAGdyYXkxMDAASVNPLUlSLTEwMAAxMDAwMAAlIVBTLUFkb2JlLTMuMABueiA+IDAAbGlzdC0+Y2FwYWNpdHkgPiAwAGRpc3QgPiAwAHBhdGhjb3VudCA+IDAAd2d0ID4gMABuc2l0ZXMgPiAwAHNpZGVzID4gMABydiA9PSAwIHx8IChORF9vcmRlcihydiktTkRfb3JkZXIodikpKmRpciA+IDAAaW5wbiA+IDAAbGVuID4gMABxdDEtPm4gPiAwICYmIHF0Mi0+biA+IDAAbSA+IDAgJiYgbiA+IDAAbmV3VG90YWwgPiAwAHdpZHRoID4gMABsaXN0LT5zaXplID4gMABkaWN0LT5zaXplID4gMABzcGwtPnNpemUgPiAwAHNlbGYtPnNpemUgPiAwAGJ6LnNpemUgPiAwAGluY3JlYXNlID4gMABib3VuZCA+IDAAZ3JhcGgtPndlaWdodHNbeF0gPiAwAGdyYXBoLT53ZWlnaHRzW25fZWRnZXNdID4gMABpbmRleCA+PSAwAHQgPj0gMABubm9kZXMgPj0gMABuX25vZGVzID49IDAAbl9vYnMgPj0gMABuID49IDAAbi0+bGV2ZWwgPj0gMABvcmlnaW5hbCA+PSAwAE1heHJhbmsgPj0gMABQYWNrID49IDAAaWkgPCAxPDxkaW0gJiYgaWkgPj0gMAB3aWR0aCA+PSAwAGpkaWFnID49IDAAaWRpYWcgPj0gMABkID49IDAAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdID49IDAgJiYgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID49IDAAViA+PSAwAGFnbm5vZGVzKGdyYXBoKSA+PSAwAGFnbm5vZGVzKGcpID49IDAARURfdHJlZV9pbmRleChlKSA+PSAwAEVEX2NvdW50KGUpID49IDAAb2JqcDEtPnN6LnggPT0gMCAmJiBvYmpwMS0+c3oueSA9PSAwAGNfY250ID09IDAAcmFua19yZXN1bHQgPT0gMABnZXR0aW1lb2ZkYXlfcmVzID09IDAAaiA9PSAwAE5EX2luKHJpZ2h0KS5zaXplICsgTkRfb3V0KHJpZ2h0KS5zaXplID09IDAAYS5zaGFwZSA9PSAwIHx8IGIuc2hhcGUgPT0gMABsaXN0LT5iYXNlICE9IE5VTEwgfHwgaW5kZXggPT0gMCB8fCBzdHJpZGUgPT0gMABkdHNpemUoZGVzdCkgPT0gMABkdHNpemUoZy0+bl9zZXEpID09IDAAZHRzaXplKGctPmdfc2VxKSA9PSAwAGR0c2l6ZShnLT5lX3NlcSkgPT0gMABHRF9taW5yYW5rKGcpID09IDAAZHRzaXplKGctPmdfaWQpID09IDAAZHRzaXplKGctPmVfaWQpID09IDAAY29zeCAhPSAwIHx8IHNpbnggIT0gMAByZXFfYWxpZ25tZW50ICE9IDAAbWVtY21wKCZzdHlsZSwgJihncmFwaHZpel9wb2x5Z29uX3N0eWxlX3QpezB9LCBzaXplb2Yoc3R5bGUpKSAhPSAwAHJlc3VsdCA9PSAoaW50KShzaXplIC0gMSkgfHwgcmVzdWx0IDwgMABtYXNrW2lpXSA8IDAATkRfaGVhcGluZGV4KHYpIDwgMABcLwBYMTEvAGd2UmVuZGVySm9icyAlczogJS4yZiBzZWNzLgAlLipzLgBzcGVjaWZpZWQgcm9vdCBub2RlICIlcyIgd2FzIG5vdCBmb3VuZC4AR3JhcGggJXMgaGFzIGFycmF5IHBhY2tpbmcgd2l0aCB1c2VyIHZhbHVlcyBidXQgbm8gInNvcnR2IiBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkLgAxLgAtMC4AJSFQUy1BZG9iZS0AJVBERi0APCEtLQAgLAArACoAc3RyZXEoYXB0ci0+dS5uYW1lLEtleSkAIWlzX2V4YWN0bHlfZXF1YWwoUi54LCBRLngpIHx8ICFpc19leGFjdGx5X2VxdWFsKFIueSwgUS55KQBORF9vcmRlcih2KSA8IE5EX29yZGVyKHcpAHUgPT0gVUZfZmluZCh1KQAhTElTVF9JU19FTVBUWShwbGlzdCkAZ3ZfbGlzdF9pc19jb250aWd1b3VzXygqbGlzdCkAb25lIDw9IExJU1RfU0laRShsaXN0KQBucCA8IExJU1RfU0laRShsaXN0KQBpc19wb3dlcl9vZl8yKGFsaWdubWVudCkAc3RkOjppc19oZWFwKGhlYXAuYmVnaW4oKSwgaGVhcC5lbmQoKSwgZ3QpACEocS0+cXRzKQAhTElTVF9JU19FTVBUWSgmbGVhdmVzKQBvbl9oZWFwKHIpAG5vZGVfc2V0X3NpemUoZy0+bl9pZCkgPT0gKHNpemVfdClkdHNpemUoZy0+bl9zZXEpAE5EX3JhbmsoZnJvbSkgPCBORF9yYW5rKHRvKQBub3Qgd2VsbC1mb3JtZWQgKGludmFsaWQgdG9rZW4pAGFnc3VicmVwKGcsbikAbiAhPSBORF9uZXh0KG4pAGZpbmRfZmFzdF9ub2RlKGcsIG4pAChudWxsKQAoIWpjbikgJiYgKCF2YWwpACEocS0+bCkAc3ltLT5pZCA+PSAwICYmIHN5bS0+aWQgPCB0b3BkaWN0c2l6ZShvYmopAExJU1RfU0laRSgmYXJyKSA9PSAoc2l6ZV90KWFnbm5vZGVzKHNnKQBtb3ZlIHRvICglLjBmLCAlLjBmKQA7IHNwbGluZSB0byAoJS4wZiwgJS4wZikAOyBsaW5lIHRvICglLjBmLCAlLjBmKQBTcGFyc2VNYXRyaXhfaXNfc3ltbWV0cmljKEEsIHRydWUpAHZhbHVlICYmIHN0cmxlbih2YWx1ZSkAU3BhcnNlTWF0cml4X2lzX3N5bW1ldHJpYyhBLCBmYWxzZSkAIXVzZV9zdGFnZSB8fCBzaXplIDw9IHNpemVvZihzdGFnZSkARURfbGFiZWwoZmUpACFUUkVFX0VER0UoZSkAIWNvbnN0cmFpbmluZ19mbGF0X2VkZ2UoZywgZSkAbm9kZV9zZXRfaXNfZW1wdHkoZy0+bl9pZCkAcl8lZCkAbF8lZCkAKGxpYikAIVNwYXJzZU1hdHJpeF9oYXNfZGlhZ29uYWwoQSkAIHNjYW5uaW5nIGEgSFRNTCBzdHJpbmcgKG1pc3NpbmcgJz4nPyBiYWQgbmVzdGluZz8gbG9uZ2VyIHRoYW4gJWQ/KQAgc2Nhbm5pbmcgYSBxdW90ZWQgc3RyaW5nIChtaXNzaW5nIGVuZHF1b3RlPyBsb25nZXIgdGhhbiAlZD8pACBzY2FubmluZyBhIC8qLi4uKi8gY29tbWVudCAobWlzc2luZyAnKi8/IGxvbmdlciB0aGFuICVkPykAZmFsbGJhY2soNCkAb25faGVhcChyMCkgfHwgb25faGVhcChyMSkAYWd0YWlsKGUpID09IFVGX2ZpbmQoYWd0YWlsKGUpKQBhZ2hlYWQoZSkgPT0gVUZfZmluZChhZ2hlYWQoZSkpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9nZXRfbmV4dF9idWZmZXIoKQBvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eWVuc3VyZV9idWZmZXJfc3RhY2soKQBzdHJlcShtb2RlLCAiciIpIHx8IHN0cmVxKG1vZGUsICJyYiIpIHx8IHN0cmVxKG1vZGUsICJ3IikgfHwgc3RyZXEobW9kZSwgIndiIikAcG5hbWUgIT0gTlVMTCAmJiAhc3RyZXEocG5hbWUsICIiKQBzZXRsaW5ld2lkdGgoACkgcm90YXRlKCVkKSB0cmFuc2xhdGUoACB0cmFuc2Zvcm09InNjYWxlKABOT1RBVElPTigAICgAIG5lYXIgJyVzJwAlbGYsJWxmLCVsZiwnJVteJ10nAGlzZGlnaXQoKGludClkb3RwWzFdKSAmJiBpc2RpZ2l0KChpbnQpZG90cFsyXSkgJiYgZG90cFszXSA9PSAnXDAnACYAJQAkAHVybCgjADx0ZXh0UGF0aCB4bGluazpocmVmPSIjADxhcmVhIHNoYXBlPSJwb2x5IgAgZmlsbD0iIyUwMnglMDJ4JTAyeCIAKHNlcSAmIFNFUV9NQVNLKSA9PSBzZXEgJiYgInNlcXVlbmNlIElEIG92ZXJmbG93IgBndl9zb3J0X2NvbXBhciA9PSBOVUxMICYmIGd2X3NvcnRfYXJnID09IE5VTEwgJiYgInVuc3VwcG9ydGVkIHJlY3Vyc2l2ZSBjYWxsIHRvIGd2X3NvcnQiAGd2X3NvcnRfY29tcGFyICE9IE5VTEwgJiYgIm5vIGNvbXBhcmF0b3Igc2V0IGluIGd2X3NvcnQiAG9wLT5vcC51LnBvbHlnb24uY250IDw9IElOVF9NQVggJiYgInBvbHlnb24gY291bnQgZXhjZWVkcyBndnJlbmRlcl9wb2x5Z29uIHN1cHBvcnQiACB0ZXh0LWFuY2hvcj0ic3RhcnQiAHAueCAhPSBhICYmICJjYW5ub3QgaGFuZGxlIGVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpbiBob3Jpem9udGFsIGV4dHJlbWUgcG9pbnQiAGZ1bGxfbGVuZ3RoX3dpdGhvdXRfc2hhZnQgPiAwICYmICJub24tcG9zaXRpdmUgZnVsbCBsZW5ndGggd2l0aG91dCBzaGFmdCIAPGFyZWEgc2hhcGU9InJlY3QiAHNpemUgPiAwICYmICJhdHRlbXB0IHRvIGFsbG9jYXRlIGFycmF5IG9mIDAtc2l6ZWQgZWxlbWVudHMiAGluZGV4IDwgc2VsZi0+c2l6ZV9iaXRzICYmICJvdXQgb2YgYm91bmRzIGFjY2VzcyIAaW5kZXggPCBzZWxmLnNpemVfYml0cyAmJiAib3V0IG9mIGJvdW5kcyBhY2Nlc3MiACpzMSAhPSAqczIgJiYgImR1cGxpY2F0ZSBzZXBhcmF0b3IgY2hhcmFjdGVycyIAR0RfbWlucmFuayhzdWJnKSA8PSBHRF9tYXhyYW5rKHN1YmcpICYmICJjb3JydXB0ZWQgcmFuayBib3VuZHMiAGluZGV4IDwgbGlzdC5zaXplICYmICJpbmRleCBvdXQgb2YgYm91bmRzIgAodWludHB0cl90KXMgJSAyID09IDAgJiYgImhlYXAgcG9pbnRlciB3aXRoIGxvdyBiaXQgc2V0IHdpbGwgY29sbGlkZSB3aXRoIGFub255bW91cyBJRHMiACAoKyU2bGQgYnl0ZXMgJXN8JXUsIHhtbHBhcnNlLmM6JWQpICUqcyIAIGZvbnQtZmFtaWx5PSIlcyIAIGZvbnQtd2VpZ2h0PSIlcyIAIGZpbGw9IiVzIgAgZm9udC1zdHJldGNoPSIlcyIAIGZvbnQtc3R5bGU9IiVzIgBiYWQgZWRnZSBsZW4gIiVzIgAgYmFzZWxpbmUtc2hpZnQ9InN1cGVyIgBhZ3hibGVuKHhiKSA8PSBzaXplb2YoeGItPnN0b3JlKSAmJiAiYWd4YnVmIGNvcnJ1cHRpb24iAGNlbGwucm93IDwgdGFibGUtPnJvd19jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiAGNlbGwuY29sIDwgdGFibGUtPmNvbHVtbl9jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiACB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgBmdWxsX2xlbmd0aCA+IDAgJiYgIm5vbi1wb3NpdGl2ZSBmdWxsIGxlbmd0aCIAZnVsbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIGZ1bGwgYmFzZSB3aWR0aCIAbm9taW5hbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIG5vbWluYWwgYmFzZSB3aWR0aCIAIiB3aWR0aD0iJWdweCIgaGVpZ2h0PSIlZ3B4IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0IiB4PSIlZyIgeT0iJWciACIgd2lkdGg9IiVncHgiIGhlaWdodD0iJWdweCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgeD0iJWciIHk9IiVnIgAgZm9udC1zaXplPSIlLjJmIgAgZmlsbC1vcGFjaXR5PSIlZiIAPHRleHQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIAaXNmaW5pdGUobSkgJiYgImVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpcyBpbmZpbml0ZSIAKHhiLT5sb2NhdGVkID09IEFHWEJVRl9PTl9IRUFQIHx8IHhiLT5sb2NhdGVkIDw9IHNpemVvZih4Yi0+c3RvcmUpKSAmJiAiY29ycnVwdGVkIGFneGJ1ZiB0eXBlIgBBLT50eXBlID09IHR5cGUgJiYgImNhbGwgdG8gU3BhcnNlTWF0cml4X2Nvb3JkaW5hdGVfZm9ybV9hZGRfZW50cnkgIiAid2l0aCBpbmNvbXBhdGlibGUgdmFsdWUgdHlwZSIAIHRleHQtYW5jaG9yPSJtaWRkbGUiADxhcmVhIHNoYXBlPSJjaXJjbGUiAGNlbGwtPnJvdyArIGNlbGwtPnJvd3NwYW4gPD0gdGFibGUtPnJvd19jb3VudCAmJiAiY2VsbCBzcGFucyBoaWdoZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBjZWxsLnJvdyArIGNlbGwucm93c3BhbiA8PSB0YWJsZS0+cm93X2NvdW50ICYmICJjZWxsIHNwYW5zIGhpZ2hlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwtPmNvbCArIGNlbGwtPmNvbHNwYW4gPD0gdGFibGUtPmNvbHVtbl9jb3VudCAmJiAiY2VsbCBzcGFucyB3aWRlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwuY29sICsgY2VsbC5jb2xzcGFuIDw9IHRhYmxlLT5jb2x1bW5fY291bnQgJiYgImNlbGwgc3BhbnMgd2lkZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBvbGRfbm1lbWIgPCBTSVpFX01BWCAvIHNpemUgJiYgImNsYWltZWQgcHJldmlvdXMgZXh0ZW50IGlzIHRvbyBsYXJnZSIAdGhldGEgPj0gMCAmJiB0aGV0YSA8PSBNX1BJICYmICJ0aGV0YSBvdXQgb2YgcmFuZ2UiAHRhYmxlLT5oZWlnaHRzID09IE5VTEwgJiYgInRhYmxlIGhlaWdodHMgY29tcHV0ZWQgdHdpY2UiAHRhYmxlLT53aWR0aHMgPT0gTlVMTCAmJiAidGFibGUgd2lkdGhzIGNvbXB1dGVkIHR3aWNlIgAgdGV4dC1hbmNob3I9ImVuZCIAIGZvbnQtd2VpZ2h0PSJib2xkIgAgZm9udC1zdHlsZT0iaXRhbGljIgAgYmFzZWxpbmUtc2hpZnQ9InN1YiIAXCIAbGxlbiA8PSBJTlRfTUFYICYmICJYTUwgdG9rZW4gdG9vIGxvbmcgZm9yIGV4cGF0IEFQSSIAIiByeT0iAF9wIiBzdGFydE9mZnNldD0iNTAlIj48dHNwYW4geD0iMCIgZHk9IgAiIGN5PSIAIiB5PSIAIiByeD0iACBjeD0iACB4PSIAIHRhcmdldD0iACBwb2ludHM9IgAgY29vcmRzPSIAIHRleHQtZGVjb3JhdGlvbj0iACBmaWxsPSIAIiBzdHJva2Utd2lkdGg9IgA8aW1hZ2UgeGxpbms6aHJlZj0iADw/eG1sLXN0eWxlc2hlZXQgaHJlZj0iACIgbmFtZT0iACB4bGluazp0aXRsZT0iACB0aXRsZT0iACIgc3Ryb2tlPSIAPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0iADxkZWZzPgo8cmFkaWFsR3JhZGllbnQgaWQ9IgA8bWFwIGlkPSIAPGcgaWQ9IgAgZD0iACIgeTI9IgAiIHgyPSIAIiB5MT0iAHgxPSIAIHZpZXdCb3g9IiVkLjAwICVkLjAwICVkLjAwICVkLjAwIgAgdHJhbnNmb3JtPSJyb3RhdGUoJWQgJWcgJWcpIgBhZ3hibGVuKCZjdHgtPlNidWYpID09IDAgJiYgInBlbmRpbmcgc3RyaW5nIGRhdGEgdGhhdCB3YXMgbm90IGNvbnN1bWVkIChtaXNzaW5nICIgImVuZHN0cigpL2VuZGh0bWxzdHIoKT8pIgAgYWx0PSIiAEN5Y2xlIEVycm9yIQBQdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbGVkIQA8IS0tIEdlbmVyYXRlZCBieSAAJXMlenUgLSMlMDJ4JTAyeCUwMnglMDJ4IAAlcyV6dSAtIyUwMnglMDJ4JTAyeCAAJWMgJXp1IAB0ICV1IAAgY3JlYXRlIHRleHQgAHhMYXlvdXQgAGRlZmF1bHQgAHN0cmljdCAAJXMlenUgLSVzIAAgLXNtb290aCBiZXppZXIgACBtb3ZldG8gACB2ZXJzaW9uIAAgY3JlYXRlIHBvbHlnb24gACAtdGV4dCB7JXN9IC1maWxsIAAgY3JlYXRlIG92YWwgACAtd2lkdGggAG5ld3BhdGggAGdyYXBoIABzLCUuNWcsJS41ZyAAJS41ZywlLjVnLCUuNWcsJS41ZyAAZSwlLjVnLCUuNWcgACVnICVnIAAlLjAzbGYgACUuM2YgACVkICVkICVkICVkICVkICVkICUuMWYgJS40ZiAlZCAlLjFmICUuMWYgJS4wZiAlLjBmIAAgLW91dGxpbmUgACBjcmVhdGUgbGluZSAAbm9kZSAAW0dyYXBodml6XSAlczolZDogJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgACVkIABUb3RhbCBzaXplID4gMSBpbiAiJXMiIGNvbG9yIHNwZWMgAFsgL1JlY3QgWyAAVCAAUyAAT1BFTiAASSAARiAARSAAQyAAIC0+IABSYW5rIHNlcGFyYXRpb24gPSAAVW5zYXRpc2ZpZWQgY29uc3RyYWludDogAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzOiAAJXM6IABTb2x2aW5nIG1vZGVsOiAAU2V0dGluZyB1cCBzcHJpbmcgbW9kZWw6IABjb252ZXJ0IGdyYXBoOiAAIFRpdGxlOiAAInRleHQiOiAAeyJmcmFjIjogJS4wM2YsICJjb2xvciI6IAAibmFtZSI6IAAic3R5bGUiOiAAImZhY2UiOiAAMiAAPCEtLSAAIC0tIAAlIABfcCIgAGxfJWQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAADSAgICAgICAgICAgICAgICBpdGVyID0gJWQsIHN0ZXAgPSAlZiBGbm9ybSA9ICVmIG56ID0gJXp1ICBLID0gJWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgAAogICAgADoJIAAgICAgJXN9CgB0cnlpbmcgdG8gYWRkIHRvIHJlY3QgeyVmICsvLSAlZiwgJWYgKy8tICVmfQoAI2RlZmF1bHQgeyBmaW5pc2ggeyBhbWJpZW50IDAuMSBkaWZmdXNlIDAuOSB9IH0KAHBpZ21lbnQgeyBjb2xvciAlcyB9CgBsaWdodF9zb3VyY2UgeyA8MTUwMCwzMDAwLC0yNTAwPiBjb2xvciBXaGl0ZSB9CgBnbG9iYWxfc2V0dGluZ3MgeyBhc3N1bWVkX2dhbW1hIDEuMCB9CgAgICAgdGV4dHVyZSBJbWFnZVRleHR1cmUgeyB1cmwgIiVzIiB9CgAgICAgfQoALy9za3kKcGxhbmUgeyA8MCwgMSwgMD4sIDEgaG9sbG93CiAgICB0ZXh0dXJlIHsKICAgICAgICBwaWdtZW50IHsgYm96byB0dXJidWxlbmNlIDAuOTUKICAgICAgICAgICAgY29sb3JfbWFwIHsKICAgICAgICAgICAgICAgIFswLjAwIHJnYiA8MC4wNSwgMC4yMCwgMC41MD5dCiAgICAgICAgICAgICAgICBbMC41MCByZ2IgPDAuMDUsIDAuMjAsIDAuNTA+XQogICAgICAgICAgICAgICAgWzAuNzUgcmdiIDwxLjAwLCAxLjAwLCAxLjAwPl0KICAgICAgICAgICAgICAgIFswLjc1IHJnYiA8MC4yNSwgMC4yNSwgMC4yNT5dCiAgICAgICAgICAgICAgICBbMS4wMCByZ2IgPDAuNTAsIDAuNTAsIDAuNTA+XQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNjYWxlIDwxLjAwLCAxLjAwLCAxLjUwPiAqIDIuNTAKICAgICAgICAgICAgdHJhbnNsYXRlIDwwLjAwLCAwLjAwLCAwLjAwPgogICAgICAgIH0KICAgICAgICBmaW5pc2ggeyBhbWJpZW50IDEgZGlmZnVzZSAwIH0KICAgIH0KICAgIHNjYWxlIDEwMDAwCn0KLy9taXN0CmZvZyB7IGZvZ190eXBlIDIKICAgIGRpc3RhbmNlIDUwCiAgICBjb2xvciByZ2IgPDEuMDAsIDEuMDAsIDEuMDA+ICogMC43NQogICAgZm9nX29mZnNldCAwLjEwCiAgICBmb2dfYWx0IDEuNTAKICAgIHR1cmJ1bGVuY2UgMS43NQp9Ci8vZ25kCnBsYW5lIHsgPDAuMDAsIDEuMDAsIDAuMDA+LCAwCiAgICB0ZXh0dXJlIHsKICAgICAgICBwaWdtZW50eyBjb2xvciByZ2IgPDAuMjUsIDAuNDUsIDAuMDA+IH0KICAgICAgICBub3JtYWwgeyBidW1wcyAwLjc1IHNjYWxlIDAuMDEgfQogICAgICAgIGZpbmlzaCB7IHBob25nIDAuMTAgfQogICAgfQp9CgBjYW1lcmEgeyBsb2NhdGlvbiA8JS4zZiAsICUuM2YgLCAtNTAwLjAwMD4KICAgICAgICAgbG9va19hdCAgPCUuM2YgLCAlLjNmICwgMC4wMDA+CiAgICAgICAgIHJpZ2h0IHggKiBpbWFnZV93aWR0aCAvIGltYWdlX2hlaWdodAogICAgICAgICBhbmdsZSAlLjNmCn0KACAgICBtYXRlcmlhbCBNYXRlcmlhbCB7CgBTaGFwZSB7CgAgIGFwcGVhcmFuY2UgQXBwZWFyYW5jZSB7CgAvdXNlcl9zaGFwZV8lZCB7CgBncmFwaCBHIHsKAGFycm93aGVhZCA9IDcgJXMgbm90IHVzZWQgYnkgZ3JhcGh2aXoKAGJveHJhZCA9IDAgJXMgbm8gcm91bmRlZCBjb3JuZXJzIGluIGdyYXBodml6CgBvdXQgb2YgbWVtb3J5CgAlczogY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeQoAR3JhcGh2aXogYnVpbHQgd2l0aG91dCBhbnkgdHJpYW5ndWxhdGlvbiBsaWJyYXJ5CgByZW1vdmVfb3ZlcmxhcDogR3JhcGh2aXogbm90IGJ1aWx0IHdpdGggdHJpYW5ndWxhdGlvbiBsaWJyYXJ5CgAlcyBmaWxsIGhhcyBubyBtZWFuaW5nIGluIERXQiAyLCBncGljIGNhbiB1c2UgZmlsbCBvciBmaWxsZWQsIDEwdGggRWRpdGlvbiB1c2VzIGZpbGwgb25seQoAYm94cmFkPTIuMCAlcyB3aWxsIGJlIHJlc2V0IHRvIDAuMCBieSBncGljIG9ubHkKACVkICVkICMlMDJ4JTAyeCUwMngKAEhlYXAgb3ZlcmZsb3cKAHRleHQgewogICAgdHRmICIlcyIsCiAgICAiJXMiLCAlLjNmLCAlLjNmCiAgICAgICAgbm9fc2hhZG93CgAlZCAlZCAlZCAlLjBmICVkICVkICVkICVkICVkICUuMWYgJWQgJWQgJWQgJWQgJWQgJXp1CgB0b3RhbCBhZGRlZCBzbyBmYXIgPSAlenUKAHJvb3QgPSAlcyBtYXggc3RlcHMgdG8gcm9vdCA9ICVsbHUKAC5wcyAlLjBmKlxuKFNGdS8lLjBmdQoAICBtYXJnaW4gJXUKAE51bWJlciBvZiBpdGVyYXRpb25zID0gJXUKAG92ZXJsYXAgWyV1XSA6ICV1CgAgJXMgYWxpZ25lZHRleHQKAGxheWVycyBub3Qgc3VwcG9ydGVkIGluICVzIG91dHB1dAoAYWRkX3RyZWVfZWRnZTogZW1wdHkgb3V0ZWRnZSBsaXN0CgBhZGRfdHJlZV9lZGdlOiBlbXB0eSBpbmVkZ2UgbGlzdAoATm8gbGlieiBzdXBwb3J0CgAlcyAuUFMgdy9vIGFyZ3MgY2F1c2VzIEdOVSBwaWMgdG8gc2NhbGUgZHJhd2luZyB0byBmaXQgOC41eDExIHBhcGVyOyBEV0IgZG9lcyBub3QKACVzIEdOVSBwaWMgc3VwcG9ydHMgYSBsaW5ldGhpY2sgdmFyaWFibGUgdG8gc2V0IGxpbmUgdGhpY2tuZXNzOyBEV0IgYW5kIDEwdGggRWQuIGRvIG5vdAoAJXMgR05VIHBpYyBzdXBwb3J0cyBhIGJveHJhZCB2YXJpYWJsZSB0byBkcmF3IGJveGVzIHdpdGggcm91bmRlZCBjb3JuZXJzOyBEV0IgYW5kIDEwdGggRWQuIGRvIG5vdAoAIC8lcyBzZXRfZm9udAoAJXMlLipzIGlzIG5vdCBhIHRyb2ZmIGZvbnQKAGNlbGwgc2l6ZSB0b28gc21hbGwgZm9yIGNvbnRlbnQKAHRhYmxlIHNpemUgdG9vIHNtYWxsIGZvciBjb250ZW50CgAlJUVuZERvY3VtZW50CgBVbmNsb3NlZCBjb21tZW50CgBMYWJlbCBjbG9zZWQgYmVmb3JlIGVuZCBvZiBIVE1MIGVsZW1lbnQKAFBvcnRyYWl0CgBmaXhlZCBjZWxsIHNpemUgd2l0aCB1bnNwZWNpZmllZCB3aWR0aCBvciBoZWlnaHQKAGZpeGVkIHRhYmxlIHNpemUgd2l0aCB1bnNwZWNpZmllZCB3aWR0aCBvciBoZWlnaHQKAHBvcyBhdHRyaWJ1dGUgZm9yIGVkZ2UgKCVzLCVzKSBkb2Vzbid0IGhhdmUgM24rMSBwb2ludHMKACAgZ2VuZXJhdGVkICVkIGNvbnN0cmFpbnRzCgBzcGxpbmVzIGFuZCBjbHVzdGVyIGVkZ2VzIG5vdCBzdXBwb3J0ZWQgLSB1c2luZyBsaW5lIHNlZ21lbnRzCgBvYmplY3RzCgBXYXJuaW5nOiBub2RlICVzLCBwb3NpdGlvbiAlcywgZXhwZWN0ZWQgdHdvIGZsb2F0cwoAZm9udCBuYW1lICVzIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBtYXkgbm90IGJlIGFjY2VwdGVkIGJ5IHNvbWUgUFMgdmlld2VycwoAZm9udCBuYW1lICVzIGlzIGxvbmdlciB0aGFuIDI5IGNoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHJlamVjdGVkIGJ5IHNvbWUgUFMgdmlld2VycwoAY2Fubm90IGFsbG9jYXRlIHBzCgBzY2FsZT0xLjAgJXMgcmVxdWlyZWQgZm9yIGNvbXBhcmlzb25zCgBTZXR0aW5nIGluaXRpYWwgcG9zaXRpb25zCgAlcyBEV0IgMiBjb21wYXRpYmlsaXR5IGRlZmluaXRpb25zCgBhcnJheSBwYWNraW5nOiAlcyAlenUgcm93cyAlenUgY29sdW1ucwoAc3ludGF4IGFtYmlndWl0eSAtIGJhZGx5IGRlbGltaXRlZCBudW1iZXIgJyVzJyBpbiBsaW5lICVkIG9mICVzIHNwbGl0cyBpbnRvIHR3byB0b2tlbnMKAGVkZ2UgbGFiZWxzIHdpdGggc3BsaW5lcz1jdXJ2ZWQgbm90IHN1cHBvcnRlZCBpbiBkb3QgLSB1c2UgeGxhYmVscwoAZmxhdCBlZGdlIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgb25lIG9mIHdoaWNoIGhhcyBhIHJlY29yZCBzaGFwZSAtIHJlcGxhY2UgcmVjb3JkcyB3aXRoIEhUTUwtbGlrZSBsYWJlbHMKAG91dCBvZiBtZW1vcnkgd2hlbiB0cnlpbmcgdG8gYWxsb2NhdGUgJXp1IGJ5dGVzCgBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gdHJ5aW5nIHRvIGFsbG9jYXRlICV6dSAqICV6dSBieXRlcwoAdXBkYXRlOiBtaXNtYXRjaGVkIGxjYSBpbiB0cmVldXBkYXRlcwoAZ3JhcGggJXMsIGNvb3JkICVzLCBleHBlY3RlZCBmb3VyIGRvdWJsZXMKAG5vZGUgJXMsIHBvc2l0aW9uICVzLCBleHBlY3RlZCB0d28gZG91YmxlcwoARm91bmQgJWQgRGlHLUNvTGEgYm91bmRhcmllcwoASW5jaGVzCgAoJTR6dSkgJTd6dSBub2RlcyAlN3p1IGVkZ2VzCgBjb21wb3VuZEVkZ2VzOiBjb3VsZCBub3QgY29uc3RydWN0IG9ic3RhY2xlcyAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgB0aGUgYm91bmRpbmcgYm94ZXMgb2Ygc29tZSBub2RlcyB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBjb21wb3VuZEVkZ2VzOiBub2RlcyB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBzb21lIG5vZGVzIHdpdGggbWFyZ2luICglLjAyZiwlLjAyZikgdG91Y2ggLSBmYWxsaW5nIGJhY2sgdG8gc3RyYWlnaHQgbGluZSBlZGdlcwoAbWVyZ2UyOiBncmFwaCAlcywgcmFuayAlZCBoYXMgb25seSAlZCA8ICVkIG5vZGVzCgBTY2FubmluZyBncmFwaCAlcywgJWQgbm9kZXMKAFdhcm5pbmc6IG5vIGhhcmQtY29kZWQgbWV0cmljcyBmb3IgJyVzJy4gIEZhbGxpbmcgYmFjayB0byAnVGltZXMnIG1ldHJpY3MKAGluIGVkZ2UgJXMlcyVzCgBVc2luZyAlczogJXM6JXMKAEZvcm1hdDogIiVzIiBub3QgcmVjb2duaXplZC4gVXNlIG9uZSBvZjolcwoATGF5b3V0IHR5cGU6ICIlcyIgbm90IHJlY29nbml6ZWQuIFVzZSBvbmUgb2Y6JXMKAGxheW91dCAlcwoALmZ0ICVzCgBiYWQgbGFiZWwgZm9ybWF0ICVzCgBpbiByb3V0ZXNwbGluZXMsIGVkZ2UgaXMgYSBsb29wIGF0ICVzCgAgICAgICAgJTdkIG5vZGVzICU3ZCBlZGdlcyAlN3p1IGNvbXBvbmVudHMgJXMKAGluIGxhYmVsIG9mIGVkZ2UgJXMgJXMgJXMKACAgRWRnZSAlcyAlcyAlcwoAb3J0aG8gJXMgJXMKAHBvbHlsaW5lICVzICVzCgBzcGxpbmUgJXMgJXMKAHJlY3RhbmdsZSAoJS4wZiwlLjBmKSAoJS4wZiwlLjBmKSAlcyAlcwoAaW4gY2x1c3RlciAlcwoAJXMgd2FzIGFscmVhZHkgaW4gYSByYW5rc2V0LCBkZWxldGVkIGZyb20gY2x1c3RlciAlcwoAJXMgLT4gJXM6IHRhaWwgbm90IGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiBoZWFkIGlzIGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKAGhlYWQgY2x1c3RlciAlcyBpbnNpZGUgdGFpbCBjbHVzdGVyICVzCgBoZWFkIG5vZGUgJXMgaW5zaWRlIHRhaWwgY2x1c3RlciAlcwoAJXMgLT4gJXM6IGhlYWQgbm90IGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiB0YWlsIGlzIGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKAHRhaWwgY2x1c3RlciAlcyBpbnNpZGUgaGVhZCBjbHVzdGVyICVzCgB0YWlsIG5vZGUgJXMgaW5zaWRlIGhlYWQgY2x1c3RlciAlcwoAVW5oYW5kbGVkIGFkanVzdCBvcHRpb24gJXMKAHJlcG9zaXRpb24gJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggeGxhYmVsICVzCgBubyBwb3NpdGlvbiBmb3IgZWRnZSB3aXRoIHRhaWwgbGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggbGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggaGVhZCBsYWJlbCAlcwoALy8qKiogYmVnaW5fZ3JhcGggJXMKAE1heC4gaXRlcmF0aW9ucyAoJWQpIHJlYWNoZWQgb24gZ3JhcGggJXMKAENvdWxkIG5vdCBwYXJzZSAiX2JhY2tncm91bmQiIGF0dHJpYnV0ZSBpbiBncmFwaCAlcwoAaW4gbGFiZWwgb2YgZ3JhcGggJXMKAENyZWF0aW5nIGVkZ2VzIHVzaW5nICVzCgBBZGp1c3RpbmcgJXMgdXNpbmcgJXMKACVzIHdoaWxlIG9wZW5pbmcgJXMKAGRlcml2ZSBncmFwaCBfZGdfJWQgb2YgJXMKACBdICAlenUgdHJ1ZSAlcwoAXSAgJWQgdHJ1ZSAlcwoAIF0gICV6dSBmYWxzZSAlcwoAXSAgJWQgZmFsc2UgJXMKAG1ha2VQb2x5OiB1bmtub3duIHNoYXBlIHR5cGUgJXMKAG1ha2VBZGRQb2x5OiB1bmtub3duIHNoYXBlIHR5cGUgJXMKAHVzaW5nICVzIGZvciB1bmtub3duIHNoYXBlICVzCgAgIG9jdHJlZSBzY2hlbWUgJXMKAGNhbid0IG9wZW4gbGlicmFyeSBmaWxlICVzCgBjYW4ndCBmaW5kIGxpYnJhcnkgZmlsZSAlcwoAQm91bmRpbmdCb3ggbm90IGZvdW5kIGluIGVwc2YgZmlsZSAlcwoAY291bGRuJ3Qgb3BlbiBlcHNmIGZpbGUgJXMKAGNvdWxkbid0IHJlYWQgZnJvbSBlcHNmIGZpbGUgJXMKAGluIG5vZGUgJXMKAHNoYXBlZmlsZSBub3Qgc2V0IG9yIG5vdCBmb3VuZCBmb3IgZXBzZiBub2RlICVzCgBpbiBsYWJlbCBvZiBub2RlICVzCgBlbmQgJXMKAHJhbmtpbmc6IGZhaWx1cmUgdG8gY3JlYXRlIHN0cm9uZyBjb25zdHJhaW50IGVkZ2UgYmV0d2VlbiBub2RlcyAlcyBhbmQgJXMKAG9vcHMsIGludGVybmFsIGVycm9yOiB1bmhhbmRsZWQgY29sb3IgdHlwZT0lZCAlcwoAJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJS4xZiAlZCAlZCAlZCAlZCAlZCAlZAogJWQgJXMKAC8vKioqIHRleHRzcGFuOiAlcywgZm9udHNpemUgPSAlLjNmLCBmb250bmFtZSA9ICVzCgB0cmllcyA9ICVkLCBtb2RlID0gJXMKAC8vKioqIGNvbW1lbnQ6ICVzCgBmYWlsZWQgdG8gcmVzZXJ2ZSAlenUgZWxlbWVudHMgb2Ygc2l6ZSAlenUgYnl0ZXM6ICVzCgBmb250bmFtZTogIiVzIiByZXNvbHZlZCB0bzogJXMKACUlJSVQYWdlT3JpZW50YXRpb246ICVzCgBkZWxhdW5heV90cmlhbmd1bGF0aW9uOiAlcwoAZGVsYXVuYXlfdHJpOiAlcwoAZ3ZwcmludGY6ICVzCgBuZXN0aW5nIG5vdCBhbGxvd2VkIGluIHN0eWxlOiAlcwoAdW5tYXRjaGVkICcpJyBpbiBzdHlsZTogJXMKAHVubWF0Y2hlZCAnKCcgaW4gc3R5bGU6ICVzCgAlJSUlVGl0bGU6ICVzCgAlcyBUaXRsZTogJXMKACMgVGl0bGU6ICVzCgAvLyoqKiBiZWdpbl9ub2RlOiAlcwoAbGliL3BhdGhwbGFuLyVzOiVkOiAlcwoAZ3JpZCglZCwlZCk6ICVzCgBDb3VsZCBub3Qgb3BlbiAiJXMiIGZvciB3cml0aW5nIDogJXMKAHN0YXJ0IHBvcnQ6ICglLjVnLCAlLjVnKSwgdGFuZ2VudCBhbmdsZTogJS41ZywgJXMKAGVuZCBwb3J0OiAoJS41ZywgJS41ZyksIHRhbmdlbnQgYW5nbGU6ICUuNWcsICVzCgAgWyV6dV0gJXAgc2V0ICVkICglLjAyZiwlLjAyZikgKCUuMDJmLCUuMDJmKSAlcwoAJSUgJXMKACMgJXMKACAgbW9kZSAgICVzCgBsaXN0IGVsZW1lbnQgdHlwZSBpcyBub3QgYSBwb2ludGVyLCBidXQgYGZyZWVgIHVzZWQgYXMgZGVzdHJ1Y3RvcgoAY29uanVnYXRlX2dyYWRpZW50OiB1bmV4cGVjdGVkIGxlbmd0aCAwIHZlY3RvcgoAJXMgdG8gY2hhbmdlIGRyYXdpbmcgc2l6ZSwgbXVsdGlwbHkgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb24gdGhlIC5QUyBsaW5lIGFib3ZlIGFuZCB0aGUgbnVtYmVyIG9uIHRoZSB0d28gbGluZXMgYmVsb3cgKHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlcikgYnkgYSBzY2FsZSBmYWN0b3IKAGFkZF9zZWdtZW50OiBlcnJvcgoAJS41ZyAlLjVnICUuNWcgJXNjb2xvcgoAMCAwIDAgZWRnZWNvbG9yCgAwLjggMC44IDAuOCBzZXRyZ2Jjb2xvcgoAMCAwIDEgc2V0cmdiY29sb3IKADEgMCAwIHNldHJnYmNvbG9yCgAwIDAgMCBzZXRyZ2Jjb2xvcgoAJWQgJWQgc2V0bGF5ZXIKAC8vKioqIGVuZF9sYXllcgoAVVRGLTggaW5wdXQgdXNlcyBub24tTGF0aW4xIGNoYXJhY3RlcnMgd2hpY2ggY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhpcyBQb3N0U2NyaXB0IGRyaXZlcgoATGV0dGVyCgAvLyoqKiBiZWdpbl9jbHVzdGVyCgAvLyoqKiBlbmRfY2x1c3RlcgoAcmVtb3ZpbmcgZW1wdHkgY2x1c3RlcgoAQ2VudGVyCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlciAldS4gRmFsbGluZyBiYWNrIHRvIHdpZHRoIG9mIHNwYWNlIGNoYXJhY3RlcgoAYmFzZSByZWZlcmVyCgAlJVBhZ2VUcmFpbGVyCgAlJVRyYWlsZXIKAC8vKioqIGJlemllcgoAIiVzIiB3YXMgbm90IGZvdW5kIGFzIGEgZmlsZSBvciBhcyBhIHNoYXBlIGxpYnJhcnkgbWVtYmVyCgBzdG9wCgAgY3VydmV0bwoAbmV3cGF0aCAlLjBmICUuMGYgbW92ZXRvCgAlLjBmICUuMGYgbGluZXRvCgAgbGF5b3V0PW5lYXRvCgBub2RlICVzIGluIGdyYXBoICVzIGhhcyBubyBwb3NpdGlvbgoAJXMgbWF4cHNodCBhbmQgbWF4cHN3aWQgaGF2ZSBubyBtZWFuaW5nIGluIERXQiAyLjAsIHNldCBwYWdlIGJvdW5kYXJpZXMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaGFzIG5vIG1lYW5pbmcgaW4gRFdCIDIsIGFycm93aGVhZCA9IDcgbWFrZXMgZmlsbGVkIGFycm93aGVhZHMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaXMgdW5kZWZpbmVkIGluIERXQiAyLCBpbml0aWFsbHkgMSBpbiBncGljLCAyIGluIDEwdGggRWRpdGlvbgoAbWFqb3JpemF0aW9uCgAvLyoqKiBwb2x5Z29uCgBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyBlZGdlIHdlaWdodCBzdW0KAHNmZHAgb25seSBzdXBwb3J0cyBzdGFydD1yYW5kb20KAG5vZGUgcG9zaXRpb25zIGFyZSBpZ25vcmVkIHVubGVzcyBzdGFydD1yYW5kb20KAGNsb3NlcGF0aCBmaWxsCgAgZWxsaXBzZV9wYXRoIGZpbGwKACAgJS4wZiAlLjBmIGNlbGwKACVmICVmICVmICVmIGNlbGwKAGdyYXBoICVzIGlzIGRpc2Nvbm5lY3RlZC4gSGVuY2UsIHRoZSBjaXJjdWl0IG1vZGVsCgBncmFwaCBpcyBkaXNjb25uZWN0ZWQuIEhlbmNlLCB0aGUgY2lyY3VpdCBtb2RlbAoAZWRnZXMgaW4gZ3JhcGggJXMgaGF2ZSBubyBsZW4gYXR0cmlidXRlLiBIZW5jZSwgdGhlIG1kcyBtb2RlbAoAY2lyY3VpdCBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG1kcyBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG5vZGUgJyVzJywgZ3JhcGggJyVzJyBzaXplIHRvbyBzbWFsbCBmb3IgbGFiZWwKACVzIERXQiAyIGRvZXNuJ3QgdXNlIGZpbGwgYW5kIGRvZXNuJ3QgZGVmaW5lIGZpbGx2YWwKAFsge0NhdGFsb2d9IDw8IC9VUkkgPDwgL0Jhc2UgJXMgPj4gPj4KL1BVVCBwZGZtYXJrCgBbIC9Dcm9wQm94IFslZCAlZCAlZCAlZF0gL1BBR0VTIHBkZm1hcmsKACAgL0JvcmRlciBbIDAgMCAwIF0KICAvQWN0aW9uIDw8IC9TdWJ0eXBlIC9VUkkgL1VSSSAlcyA+PgogIC9TdWJ0eXBlIC9MaW5rCi9BTk4gcGRmbWFyawoAdHJvdWJsZSBpbiBpbml0X3JhbmsKAGxpbmV0aGljayA9IDA7IG9sZGxpbmV0aGljayA9IGxpbmV0aGljawoAIHNldGxpbmV3aWR0aAoAZ3NhdmUKJWQgJWQgJWQgJWQgYm94cHJpbSBjbGlwIG5ld3BhdGgKAGdzYXZlICVnICVnIHRyYW5zbGF0ZSBuZXdwYXRoCgAvLyoqKiBlbmRfZ3JhcGgKAGxheW91dCBhdHRyaWJ1dGUgaXMgaW52YWxpZCBleGNlcHQgb24gdGhlIHJvb3QgZ3JhcGgKAGluIGNoZWNrcGF0aCwgYm94ZXMgJXp1IGFuZCAlenUgZG9uJ3QgdG91Y2gKAG1lcmdlX29uZXdheSBnbGl0Y2gKACVzIGRvbid0IGNoYW5nZSBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaW4gdGhpcyBkcmF3aW5nCgBOb2RlIG5vdCBhZGphY2VudCB0byBjZWxsIC0tIEFib3J0aW5nCgBpbmNvbXBhcmFibGUgc2VnbWVudHMgISEgLS0gQWJvcnRpbmcKAEFsdGVybmF0aXZlbHksIGNvbnNpZGVyIHJ1bm5pbmcgbmVhdG8gdXNpbmcgLUdwYWNrPXRydWUgb3IgZGVjb21wb3NpbmcKAGxhYmVsX3NjaGVtZSA9ICVkID4gNCA6IGlnbm9yaW5nCgBndnJlbmRlcl9zZXRfc3R5bGU6IHVuc3VwcG9ydGVkIHN0eWxlICVzIC0gaWdub3JpbmcKAEFycm93IHR5cGUgIiVzIiB1bmtub3duIC0gaWdub3JpbmcKAGZkcCBkb2VzIG5vdCBzdXBwb3J0IHN0YXJ0PXNlbGYgLSBpZ25vcmluZwoAJXMgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgMSBvciAyIC0gaWdub3JpbmcKAE1vcmUgdGhhbiAyIGNvbG9ycyBzcGVjaWZpZWQgZm9yIGEgZ3JhZGllbnQgLSBpZ25vcmluZyByZW1haW5pbmcKAGFzIHJlcXVpcmVkIGJ5IHRoZSAtbiBmbGFnCgBiYlslc10gJS41ZyAlLjVnICUuNWcgJS41ZwoAL3BhdGhib3ggewogICAgL1kgZXhjaCAlLjVnIHN1YiBkZWYKICAgIC9YIGV4Y2ggJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCAlLjVnIHN1YiBkZWYKICAgIG5ld3BhdGggeCB5IG1vdmV0bwogICAgWCB5IGxpbmV0bwogICAgWCBZIGxpbmV0bwogICAgeCBZIGxpbmV0bwogICAgY2xvc2VwYXRoIHN0cm9rZQogfSBkZWYKL2RiZ3N0YXJ0IHsgZ3NhdmUgJS41ZyAlLjVnIHRyYW5zbGF0ZSB9IGRlZgovYXJyb3dsZW5ndGggMTAgZGVmCi9hcnJvd3dpZHRoIGFycm93bGVuZ3RoIDIgZGl2IGRlZgovYXJyb3doZWFkIHsKICAgIGdzYXZlCiAgICByb3RhdGUKICAgIGN1cnJlbnRwb2ludAogICAgbmV3cGF0aAogICAgbW92ZXRvCiAgICBhcnJvd2xlbmd0aCBhcnJvd3dpZHRoIDIgZGl2IHJsaW5ldG8KICAgIDAgYXJyb3d3aWR0aCBuZWcgcmxpbmV0bwogICAgY2xvc2VwYXRoIGZpbGwKICAgIGdyZXN0b3JlCn0gYmluZCBkZWYKL21ha2VhcnJvdyB7CiAgICBjdXJyZW50cG9pbnQgZXhjaCBwb3Agc3ViIGV4Y2ggY3VycmVudHBvaW50IHBvcCBzdWIgYXRhbgogICAgYXJyb3doZWFkCn0gYmluZCBkZWYKL3BvaW50IHsgICAgbmV3cGF0aCAgICAyIDAgMzYwIGFyYyBmaWxsfSBkZWYvbWFrZXZlYyB7CiAgICAvWSBleGNoIGRlZgogICAgL1ggZXhjaCBkZWYKICAgIC95IGV4Y2ggZGVmCiAgICAveCBleGNoIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIFkgbGluZXRvIHN0cm9rZQogICAgWCBZIG1vdmV0bwogICAgeCB5IG1ha2VhcnJvdwp9IGRlZgoAL3BhdGhib3ggewogICAgL1ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAvWSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIHkgbGluZXRvCiAgICBYIFkgbGluZXRvCiAgICB4IFkgbGluZXRvCiAgICBjbG9zZXBhdGggc3Ryb2tlCn0gZGVmCgAlIVBTLUFkb2JlLTIuMAovbm9kZSB7CiAgL1kgZXhjaCBkZWYKICAvWCBleGNoIGRlZgogIC95IGV4Y2ggZGVmCiAgL3ggZXhjaCBkZWYKICBuZXdwYXRoCiAgeCB5IG1vdmV0bwogIHggWSBsaW5ldG8KICBYIFkgbGluZXRvCiAgWCB5IGxpbmV0bwogIGNsb3NlcGF0aCBmaWxsCn0gZGVmCi9jZWxsIHsKICAvWSBleGNoIGRlZgogIC9YIGV4Y2ggZGVmCiAgL3kgZXhjaCBkZWYKICAveCBleGNoIGRlZgogIG5ld3BhdGgKICB4IHkgbW92ZXRvCiAgeCBZIGxpbmV0bwogIFggWSBsaW5ldG8KICBYIHkgbGluZXRvCiAgY2xvc2VwYXRoIHN0cm9rZQp9IGRlZgoAfSBiaW5kIGRlZgoALlBTICUuNWYgJS41ZgoAb3ZlcmxhcDogJXMgdmFsdWUgJWQgc2NhbGluZyAlLjA0ZgoAICBiZWF1dGlmeV9sZWF2ZXMgJWQgbm9kZSB3ZWlnaHRzICVkIHJvdGF0aW9uICUuMDNmCgAgIHJlcHVsc2l2ZSBleHBvbmVudDogJS4wM2YKACAgSyA6ICUuMDNmIEMgOiAlLjAzZgoAJXMgJS4zZgoACmludGVyc2VjdGlvbiBhdCAlLjNmICUuM2YKACAgICBzY2FsZSAlLjNmCgB0b3J1cyB7ICUuM2YsICUuM2YKACAgICA8JTkuM2YsICU5LjNmLCAlOS4zZj4sICUuM2YKACBpbiAlcyAtIHNldHRpbmcgdG8gJS4wMmYKAGNpcmNsZSAlcyAlLjBmLCUuMGYsJS4wZgoAcmVjdCAlcyAlLjBmLCUuMGYgJS4wZiwlLjBmCgAlZCAlZCAlZCAlLjBmICVkICVkICVkICVkICVkICUuM2YgJWQgJS40ZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYKACAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmCgAlJSUlUGFnZTogMSAxCiUlJSVQYWdlQm91bmRpbmdCb3g6ICUuMGYgJS4wZiAlLjBmICUuMGYKAHBvc1slenVdICUuMGYgJS4wZgoALm5yIFNGICUuMGYKc2NhbGV0aGlja25lc3MgPSAlLjBmCgAlcyBzYXZlIHBvaW50IHNpemUgYW5kIGZvbnQKLm5yIC5TIFxuKC5zCi5uciBERiBcbiguZgoAc2hvd3BhZ2UKJSUlJVRyYWlsZXIKJSUlJUJvdW5kaW5nQm94OiAlLmYgJS5mICUuZiAlLmYKAGFkZGluZyAlenUgaXRlbXMsIHRvdGFsIGFyZWEgPSAlZiwgdyA9ICVmLCBhcmVhL3c9JWYKAGdhcD0lZiwlZgoAICBhc3BlY3QgJWYKAGEgJWYgYiAlZiBjICVmIGQgJWYgciAlZgoAbW9kZWwgJWQgc21hcnRfaW5pdCAlZCBzdHJlc3N3dCAlZCBpdGVyYXRpb25zICVkIHRvbCAlZgoAU29sdmluZyBtb2RlbCAlZCBpdGVyYXRpb25zICVkIHRvbCAlZgoAJXMgY29vcmQgJS41ZyAlLjVnIGh0ICVmIHdpZHRoICVmCgByZWMgJWYgJWYgJWYgJWYKACVzIDogJWYgJWYgJWYgJWYKACVzIDogJWYgJWYKAG1heHBzaHQgPSAlZgptYXhwc3dpZCA9ICVmCgBtZHNNb2RlbDogZGVsdGEgPSAlZgoAIHIxICVmIHIyICVmCgBQYWNraW5nOiBjb21wdXRlIGdyaWQgc2l6ZQoAZ3NhdmUKACUlRW5kQ29tbWVudHMKc2F2ZQoAVW5yZWNvZ25pemVkIGNoYXJhY3RlciAnJWMnICglZCkgaW4gc2lkZXMgYXR0cmlidXRlCgBJbWFnZXMgdW5zdXBwb3J0ZWQgaW4gImJhY2tncm91bmQiIGF0dHJpYnV0ZQoAJXMgR05VIHBpYyB2cy4gMTB0aCBFZGl0aW9uIGRcKGUndGVudGUKAHJlc2V0ICVzIHNldCB0byBrbm93biBzdGF0ZQoAJWcgJWcgc2V0X3NjYWxlICVkIHJvdGF0ZSAlZyAlZyB0cmFuc2xhdGUKACVmICVmIHRyYW5zbGF0ZQoAJWQgJWQgdHJhbnNsYXRlCgAvLyoqKiBlbGxpcHNlCgBVbnJlY29nbml6ZWQgb3ZlcmxhcCB2YWx1ZSAiJXMiIC0gdXNpbmcgZmFsc2UKAG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKACVzOiB2c25wcmludGYgZmFpbHVyZQoAZW5kcGFnZQpzaG93cGFnZQpncmVzdG9yZQoAZW5kCnJlc3RvcmUKAGxheW91dCB3YXMgbm90IGRvbmUKAExheW91dCB3YXMgbm90IGRvbmUKAC8vKioqIHBvbHlsaW5lCgB0cnlpbmcgdG8gZGVsZXRlIGEgbm9uLWxpbmUKACMgZW5kIG9mIEZJRyBmaWxlCgBTaW5nbGUKAHJlbmRlcmVyIGZvciAlcyBpcyB1bmF2YWlsYWJsZQoAZHluYW1pYyBsb2FkaW5nIG5vdCBhdmFpbGFibGUKACUuMGYgJS4wZiBsaW5ldG8gc3Ryb2tlCgBjbG9zZXBhdGggc3Ryb2tlCgAgZWxsaXBzZV9wYXRoIHN0cm9rZQoALy8qKiogYmVnaW5fZWRnZQoALy8qKiogZW5kX2VkZ2UKAGxvc3QgJXMgJXMgZWRnZQoAb3ZlcmZsb3cgd2hlbiBjYWxjdWxhdGluZyB2aXJ0dWFsIHdlaWdodCBvZiBlZGdlCgBhZGRfdHJlZV9lZGdlOiBtaXNzaW5nIHRyZWUgZWRnZQoAaW4gcm91dGVzcGxpbmVzLCBjYW5ub3QgZmluZCBOT1JNQUwgZWRnZQoAc2hvd3BhZ2UKACVkICVkICVkIGJlZ2lucGFnZQoALy8qKiogYmVnaW5fcGFnZQoALy8qKiogZW5kX3BhZ2UKAEZpbGVuYW1lICIlcyIgaXMgdW5zYWZlCgBsYWJlbDogYXJlYSB0b28gbGFyZ2UgZm9yIHJ0cmVlCgAvLyoqKiBlbmRfbm9kZQoAVXNpbmcgZGVmYXVsdCBjYWxjdWxhdGlvbiBmb3Igcm9vdCBub2RlCgBjb250YWluX25vZGVzIGNsdXN0ICVzIHJhbmsgJWQgbWlzc2luZyBub2RlCgAlZiAlZiAlZiAlZiBub2RlCgA8PCAvUGFnZVNpemUgWyVkICVkXSA+PiBzZXRwYWdlZGV2aWNlCgBpbiBjaGVja3BhdGgsIGJveCAlenUgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGluIGNoZWNrcGF0aCwgYm94IDAgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGNsdXN0ZXIgbmFtZWQgJXMgbm90IGZvdW5kCgBtaW5jcm9zczogcGFzcyAlZCBpdGVyICVkIHRyeWluZyAlZCBjdXJfY3Jvc3MgJWxsZCBiZXN0X2Nyb3NzICVsbGQKAG5vZGUgJXMsIHBvcnQgJXMgdW5yZWNvZ25pemVkCgAlcyVzIHVuc3VwcG9ydGVkCgBjbHVzdGVyIGN5Y2xlICVzIC0tICVzIG5vdCBzdXBwb3J0ZWQKACVzIC0+ICVzOiBzcGxpbmUgc2l6ZSA+IDEgbm90IHN1cHBvcnRlZAoAbGF5b3V0IGFib3J0ZWQKAHBhZ2VkaXI9JXMgaWdub3JlZAoAVHdvIGNsdXN0ZXJzIG5hbWVkICVzIC0gdGhlIHNlY29uZCB3aWxsIGJlIGlnbm9yZWQKAElsbGVnYWwgYXR0cmlidXRlICVzIGluICVzIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgYXR0cmlidXRlICJtb2RlbCIgaW4gZ3JhcGggJXMgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBhdHRyaWJ1dGUgIm1vZGUiIGluIGdyYXBoICVzIC0gaWdub3JlZAoAc3RhcnQ9MCBub3Qgc3VwcG9ydGVkIHdpdGggbW9kZT1zZWxmIC0gaWdub3JlZAoAT3ZlcmxhcCB2YWx1ZSAiJXMiIHVuc3VwcG9ydGVkIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgUk9XUyAtIGlnbm9yZWQKAFVua25vd24gdmFsdWUgJXMgZm9yIENPTFVNTlMgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBWQUxJR04gLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBBTElHTiAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJXMgZm9yIEZJWEVEU0laRSAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJS4qcyBmb3IgU1RZTEUgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBCQUxJR04gaW4gVEQgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBBTElHTiBpbiBURCAtIGlnbm9yZWQKAFJPV1NQQU4gdmFsdWUgY2Fubm90IGJlIDAgLSBpZ25vcmVkCgBDT0xTUEFOIHZhbHVlIGNhbm5vdCBiZSAwIC0gaWdub3JlZAoAbm9kZSAlcywgcG9ydCAlcywgdW5yZWNvZ25pemVkIGNvbXBhc3MgcG9pbnQgJyVzJyAtIGlnbm9yZWQKAFVua25vd24gInNwbGluZXMiIHZhbHVlOiAiJXMiIC0gaWdub3JlZAoAaW4gcm91dGVzcGxpbmVzLCBQc2hvcnRlc3RwYXRoIGZhaWxlZAoAaW4gcm91dGVzcGxpbmVzLCBQcm91dGVzcGxpbmUgZmFpbGVkCgAjIHBsdWdpbiBsb2FkaW5nIG9mIGRlcGVuZGVuY3kgIiUuKnMiIGZhaWxlZAoAUGFyc2luZyBvZiAiJXMiIGZhaWxlZAoAJXM6JWQ6IGNsYWltZWQgdW5yZWFjaGFibGUgY29kZSB3YXMgcmVhY2hlZAoAIyB1bnN1Y2Nlc3NmdWwgcGx1Z2luIGxvYWQKACUuNWcgJS41ZyB0cmFuc2xhdGUgbmV3cGF0aCB1c2VyX3NoYXBlXyVkCgBuc2l6ZXNjYWxlPSVmLGl0ZXJhdGlvbnM9JWQKAGN0cmwtPm92ZXJsYXA9JWQKACVzICV6dSBub2RlcyAlenUgZWRnZXMgbWF4aXRlcj0lZCBiYWxhbmNlPSVkCgAvLyoqKiBiZWdpbl9sYXllcjogJXMsICVkLyVkCgBkZWdlbmVyYXRlIGNvbmNlbnRyYXRlZCByYW5rICVzLCVkCgAgIG1heCBsZXZlbHMgJWQKAAklcyAlZAoAICBCYXJuZXMtSHV0dCBjb25zdGFudCAlLjAzZiB0b2xlcmFuY2UgICUuMDNmIG1heGl0ZXIgJWQKAGd2d3JpdGVfbm9feiBwcm9ibGVtICVkCgAgIHF1YWR0cmVlIHNpemUgJWQgbWF4X2xldmVsICVkCgByZWJ1aWxkX3ZsaXN0czogbGVhZCBpcyBudWxsIGZvciByYW5rICVkCgByZWJ1aWxkX3ZsaXN0czogcmFuayBsZWFkICVzIG5vdCBpbiBvcmRlciAlZCBvZiByYW5rICVkCgAgIHNtb290aGluZyAlcyBvdmVybGFwICVkIGluaXRpYWxfc2NhbGluZyAlLjAzZiBkb19zaHJpbmtpbmcgJWQKACAgY29vbGluZyAlLjAzZiBzdGVwIHNpemUgICUuMDNmIGFkYXB0aXZlICVkCgBVbnN1cHBvcnRlZCBjaGFyc2V0IHZhbHVlICVkCgBpbiByb3V0ZXNwbGluZXMsIGlsbGVnYWwgdmFsdWVzIG9mIHByZXYgJWQgYW5kIG5leHQgJWQsIGxpbmUgJWQKACAgZWRnZV9s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bWluYXRpb24sIHZlcnNpb24gMgoAJXMgZmlsbHZhbCBpcyAwLjMgaW4gMTB0aCBFZGl0aW9uIChmaWxsIDAgbWVhbnMgYmxhY2spLCAwLjUgaW4gZ3BpYyAoZmlsbCAwIG1lYW5zIHdoaXRlKSwgdW5kZWZpbmVkIGluIERXQiAyCgAlcyByZXNldCB3b3JrcyBpbiBncGljIGFuZCAxMHRoIGVkaXRpb24sIGJ1dCBpc24ndCBkZWZpbmVkIGluIERXQiAyCgBzZXR1cExhdGluMQoAXDAwMQoAJXMgICAgICAgIHRvbGVyYW5jZSAwLjAxCgAgICAgdG9sZXJhbmNlIDAuMQoAJSVQYWdlczogMQoAICAgICAgICBkaWZmdXNlQ29sb3IgMSAxIDEKADEwMC4wMAoAIEVQU0YtMy4wCgAlcyBib3hyYWQgaXMgbm93IDAuMCBpbiBncGljLCBlbHNlIGl0IHJlbWFpbnMgMi4wCgBzcGhlcmUgezwlOS4zZiwgJTkuM2YsICU5LjNmPiwgMS4wCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2YgQVNDSUkgY2hhcmFjdGVyICV1LiBGYWxsaW5nIGJhY2sgdG8gMAoAaW5zdGFsbF9pbl9yYW5rLCBsaW5lICVkOiAlcyAlcyByYW5rICVkIGkgPSAlZCBhbiA9IDAKAGNvbmNlbnRyYXRlPXRydWUgbWF5IG5vdCB3b3JrIGNvcnJlY3RseS4KAE5vIGxpYnogc3VwcG9ydC4KAHR3b3BpOiB1c2Ugb2Ygd2VpZ2h0PTAgY3JlYXRlcyBkaXNjb25uZWN0ZWQgY29tcG9uZW50LgoAdGhlIGdyYXBoIGludG8gY29ubmVjdGVkIGNvbXBvbmVudHMuCgBPcnRob2dvbmFsIGVkZ2VzIGRvIG5vdCBjdXJyZW50bHkgaGFuZGxlIGVkZ2UgbGFiZWxzLiBUcnkgdXNpbmcgeGxhYmVscy4KAG1pbmNyb3NzICVzOiAlbGxkIGNyb3NzaW5ncywgJS4yZiBzZWNzLgoAJXMgaXMgbm90IGEga25vd24gY29sb3IuCgBpcyBpbmFwcHJvcHJpYXRlLiBSZXZlcnRpbmcgdG8gdGhlIHNob3J0ZXN0IHBhdGggbW9kZWwuCgBpcyB1bmRlZmluZWQuIFJldmVydGluZyB0byB0aGUgc2hvcnRlc3QgcGF0aCBtb2RlbC4KAFVuYWJsZSB0byByZWNsYWltIGJveCBzcGFjZSBpbiBzcGxpbmUgcm91dGluZyBmb3IgZWRnZSAiJXMiIC0+ICIlcyIuIFNvbWV0aGluZyBpcyBwcm9iYWJseSBzZXJpb3VzbHkgd3JvbmcuCgBFcnJvciBkdXJpbmcgY29udmVyc2lvbiB0byAiVVRGLTgiLiBRdWl0aW5nLgoAb3JkZXJpbmcgJyVzJyBub3QgcmVjb2duaXplZC4KAGdyYWRpZW50IHBlbiBjb2xvcnMgbm90IHlldCBzdXBwb3J0ZWQuCgAgIGluaXRDTWFqVlBTQyBkb25lOiAlZCBnbG9iYWwgY29uc3RyYWludHMgZ2VuZXJhdGVkLgoAVGhlIGNoYXJhY3RlciAnJWMnIGFwcGVhcnMgaW4gYm90aCB0aGUgbGF5ZXJzZXAgYW5kIGxheWVybGlzdHNlcCBhdHRyaWJ1dGVzIC0gbGF5ZXJsaXN0c2VwIGlnbm9yZWQuCgB0aGUgYXNwZWN0IGF0dHJpYnV0ZSBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gaW1wbGVtZW50YXRpb24gZmxhd3MgLSBhdHRyaWJ1dGUgaWdub3JlZC4KAFRoZSBsYXllcnNlbGVjdCBhdHRyaWJ1dGUgIiVzIiBkb2VzIG5vdCBtYXRjaCBhbnkgbGF5ZXIgc3BlY2lmZWQgYnkgdGhlIGxheWVycyBhdHRyaWJ1dGUgLSBpZ25vcmVkLgoAZWRnZSAlcyAtPiAlcyA6IHNldCBtb3JlIHRoYW4gb25lIHNwbGluZS4gRmlyc3QgdXNlZCwgb3RoZXIgZHJvcHBlZC4KACV6dSBvdXQgb2YgJXp1IGxhYmVscyBwb3NpdGlvbmVkLgoAJXp1IG91dCBvZiAlenUgZXh0ZXJpb3IgbGFiZWxzIHBvc2l0aW9uZWQuCgAgIGdlbmVyYXRlIGVkZ2UgY29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgTm9uLW92ZXJsYXAgQ29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgRWRnZSBDb25zdHJhaW50cy4uLgoAR2VuZXJhdGluZyBEaUctQ29MYSBFZGdlIENvbnN0cmFpbnRz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c2V0dGluZyBhIGJvdW5kaW5nIGJveCBzaXplLCBzZWUgZG90KDEpKQoAZXJyb3IgaW4gY29sb3J4bGF0ZSgpCgB0cnVuY2F0aW5nIHN0eWxlICclcycKAElsbGVnYWwgdmFsdWUgaW4gIiVzIiBjb2xvciBhdHRyaWJ1dGU7IGZsb2F0IGV4cGVjdGVkIGFmdGVyICc7JwoAZGVmaW5lIGF0dHJzMCAlJSAlJTsgZGVmaW5lIHVuZmlsbGVkICUlICUlOyBkZWZpbmUgcm91bmRlZCAlJSAlJTsgZGVmaW5lIGRpYWdvbmFscyAlJSAlJQoAPHN2ZyB3aWR0aD0iJWRwdCIgaGVpZ2h0PSIlZHB0IgoAIyBkZXBlbmRlbmNpZXMgIiUuKnMiIGRpZCBub3QgbWF0Y2ggIiUuKnMiCgAjIHR5cGUgIiUuKnMiIGRpZCBub3QgbWF0Y2ggIiUuKnMiCgAkYyBjcmVhdGUgaW1hZ2UgJS4yZiAlLjJmIC1pbWFnZSAicGhvdG9fJXMiCgBObyBvciBpbXByb3BlciBpbWFnZSBmaWxlPSIlcyIKAGZpbGUgbG9hZGluZyBpcyBkaXNhYmxlZCBiZWNhdXNlIHRoZSBlbnZpcm9ubWVudCBjb250YWlucyBTRVJWRVJfTkFNRT0iJXMiCgBDb3VsZCBub3QgcGFyc2UgeGRvdCAiJXMiCgBObyBsb2FkaW1hZ2UgcGx1Z2luIGZvciAiJXMiCgAgWyV6dV0gKCUuMDJmLCUuMDJmKSAoJS4wMmYsJS4wMmYpICVwICIlcyIKAGZvbnRuYW1lOiB1bmFibGUgdG8gcmVzb2x2ZSAiJXMiCgBEdXBsaWNhdGUgY2x1c3RlciBuYW1lICIlcyIKAHVucmVjb2duaXplZCBhcGkgbmFtZSAiJXMiCgBpbWFnZSBjcmVhdGUgcGhvdG8gInBob3RvXyVzIiAtZmlsZSAiJXMiCgBObyBvciBpbXByb3BlciBzaGFwZWZpbGU9IiVzIiBmb3Igbm9kZSAiJXMiCgBObyBvciBpbXByb3BlciBpbWFnZT0iJXMiIGZvciBub2RlICIlcyIKAG5vZGUgIiVzIiBpcyBjb250YWluZWQgaW4gdHdvIG5vbi1jb21wYXJhYmxlIGNsdXN0ZXJzICIlcyIgYW5kICIlcyIKAEVycm9yOiBub2RlICIlcyIgYmVsb25ncyB0byB0d28gbm9uLW5lc3RlZCBjbHVzdGVycyAiJXMiIGFuZCAiJXMiCgAgICIlcyIKACNpbmNsdWRlICJjb2xvcnMuaW5jIgojaW5jbHVkZSAidGV4dHVyZXMuaW5jIgojaW5jbHVkZSAic2hhcGVzLmluYyIKAFVua25vd24gSFRNTCBlbGVtZW50IDwlcz4gb24gbGluZSAlbHUgCgAlcyBpbiBsaW5lICVsdSAKAHNjYWxlIGJ5ICVnLCVnIAoAY29tcHJlc3MgJWcgCgBMYXlvdXQgd2FzIG5vdCBkb25lLiAgTWlzc2luZyBsYXlvdXQgcGx1Z2lucz8gCgCJUE5HDQoaCgAJAEGBgAULtgMBAQEBAQEBAQIDAQECAQEBAQEBAQEBAQEBAQEBAQEBAgEEBQEBAQEBAQYBAQcICQoKCgoKCgoKCgoBAQsBDAENDg8QERITFBUWExMTExcYGRMaGxwdExMTExMBHgEBEwEfICEiIxMkJSYTExMTJygpEyorLC0TExMTEwEBAQEBExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMuExMTLxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTMBMTExMTExMTExMTExMTExMAAAAAAAAEAAQAHAAcACEAIQAkACIACgACABYACQAiACIAIgAVAB0AAQAUABQAFAAUABQAFAAUAAgABAAFABwAGwAXABwAIQAgAB8AHgAJABMAAAAVABIAFQADAAcAFQAVABQAFAAUABQAFAAUABQAFAAIAAQABQAFAAYAHAAaABgAGQAhAAcAFQAUABQAFAAUABQAFAALABQADQAUAAwAFAAUABQADgAUABQAFAAQABQADwAUABEAQcKDBQuVBAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMABAAHAAMABAAFAAUABgAGAAgABwAHABEAFgASABEAEgAIAAgADwAPABcADwAYAA8AGQAaABoAHgAWADQAHgAFADIABgAiACIAMwAXABgANQAZABoAGgAqADYAKgA0ADcAMgBFADsAPAAzADsAPABGADUARwBIAEwANgAiAEkASgA3AEUATgBQAGIAUQBSAFQARgBHAFUASABMAFYASQBKAFgAWgBOAEQAUABRAFIAVAA4AC8ALABVACkAVgAbABAAWABaAF0AXQBdAF0AXQBdAF0AXgBeAF4AXgBeAF4AXgBfAF8AXwBfAF8AXwBfAGAACQBgAGAAYABgAGAAYQBhAGMAAgBjAGMAYwBjAGMAZAAAAGQAAABkAGQAZABlAAAAZQBlAGUAZQBlAGYAAAAAAGYAZgBmAGYAZwAAAGcAZwBnAGcAaAAAAGgAaABoAGgAaABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAEHkhwULzQGuAC4ALwAzADUAMAA3AKoA2wDbANsA2wAAAD0AhwA3ADcA2wDbAAAAKAA1AC4AMgAvAGIAAAAAAEcAAADbANsAUQAAANsA2wDbAAAA2wCEAFUA2wCCANsAAACBANsAAAA+AEIAQQBIAEQAUgBbAAAAAABeAF8A2wAAANsA2wDbAAAAAAB7AEkAVwBSAFoAWgBdAAAAXwAAAF8AAABlAF0AXwAAAF0AbgBqAAAAaQAAAG4AAADbAJMAmgChAKgAqwBwALEAuAC/AMYAzQDTAEHCiQULzwFcAAEAXQBdAF4AXgBfAF8AXABcAFwAXABcAGAAXABcAFwAYQBcAFwAYgBiAGIAYgBiAGIAYgBjAGQAZQBmAFwAXABcAGcAXABcAFwAYABcAFwAYQBcAGEAXABoAGEAXABiAGIAYgBiAGIAYgBiAGIAYwBkAGUAZQBcAGYAXABcAFwAZwBoAGEAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAAAAXABcAFwAXABcAFwAXABcAFwAXABcAFwAQaGLBQswAQECAwEEAQUBBgcHAQYGBgYGBgYGBgYGBgYGBgYDBgYGBgYGBgYGBgYGBgYGBgYGAEHiiwULowQKAAsADAANAA4ACgAPABAAEQASABMACgAUABUAFQAVABYAFwAVABgAFQAVABkAFQAVABUAGgAVABUACgAVABUAFQAWABcAGAAVABUAGQAVABUAFQAaABUAFQAVABUAGwAMAAwAJAAeAB4AIAAhACAAIQAkACUAJgAtADIALwAuACoAJQAmACgAKQAzACoANAArADUANgA3ADwAMgBHAD0AIgBFACIAPwBAAEYAMwA0AEgANQA2ADcALwBJACoARwBKAEUATABcADwARgBcAD0ATQBIAE4ATwBSAEkAQQBQAFEASgBMAFMAVAAxAFUAVgBXAE0ATgBYAE8AUgBZAFAAUQBaAFsAUwBEAFQAVQBWAFcASwBEACwAWAAsAFkAOAAsAFoAWwAdAB0AHQAdAB0AHQAdAB8AHwAfAB8AHwAfAB8AIwAjACMAIwAjACMAIwAnAFwAJwAnACcAJwAnADAAMAA5ABwAOQA5ADkAOQA5ADoAXAA6AFwAOgA6ADoAOwBcADsAOwA7ADsAOwA+AFwAXAA+AD4APgA+AEIAXABCAEIAQgBCAEMAXABDAEMAQwBDAEMACQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAMAAAADQAAAA4AAAAOAEGQkAUL0QUR7u4TCAPu/u7u7gHu7u4B7u4J/u4SFRfuEgHu7u7uCg3u7u7u7u7u7u4B7u4WCAEBGQ4Y7u4bGBru7h3u7u7uARX77u7u7hAe7u7uAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWEQICAgICAgICAgICAgISEAITAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUAhUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4CDwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBAgMEBQYHCAkKCwwNAAAACwMEBQ8HAwwNBgwNDgwNGhUAAQADBw4GDwgM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ADekAAB7Zcx7zMT/AFqXAACMqspDosr/ABiMAACR86wIaKz/APW/AABBEfnw+ej/AOawAABNKevM68X/ANeiAABfPd2o3bX/APqVAAB7Zcx7zMT/ALiKAACMqspDosr/AJWDAACR86wIaKz/AJW+AABBEfnw+ej/AIavAABNKevM68X/AHehAABfPd2o3bX/AJqUAAB7Zcx7zMT/AFiJAACJoNNOs9P/ADWCAACNxb4rjL7/AHp8AACT8p4IWJ7/ADW9AAA8DPz3/PD/ACauAABMGfPg89v/ABegAABNKevM68X/ADqTAABfPd2o3bX/APiHAAB7Zcx7zMT/ANWAAACJoNNOs9P/ABp7AACNxb4rjL7/ALV2AACT8p4IWJ7/AP+7AAA8DPz3/PD/APCsAABMGfPg89v/AOGeAABNKevM68X/AASSAABfPd2o3bX/AMKGAAB7Zcx7zMT/AJ9/AACJoNNOs9P/AOR5AACNxb4rjL7/AH91AACR86wIaKz/AG5yAACW74EIQIH/AEfEAABKFfXl9eD/ADi1AABQSNmh2Zv/ACmnAABisqMxo1T/AOfCAABJD/jt+On/ANizAABONuS65LP/AMmlAABWaMR0xHb/AOyYAABivosji0X/AIfBAABJD/jt+On/AHiyAABONuS65LP/AGmkAABWaMR0xHb/AIyXAABisqMxo1T/AEqMAABm/20AbSz/ACfAAABJD/jt+On/ABixAABNLOnH6cD/AAmjAABQSNmh2Zv/ACyWAABWaMR0xHb/AOqKAABisqMxo1T/AMeDAABm/20AbSz/AMe+AABJD/jt+On/ALivAABNLOnH6cD/AKmhAABQSNmh2Zv/AMyUAABWaMR0xHb/AIqJAABgnqtBq13/AGeCAABivosji0X/AKx8AABs/1oAWjL/AGe9AABIB/z3/PX/AFiuAABKFfXl9eD/AEmgAABNLOnH6cD/AGyTAABQSNmh2Zv/ACqIAABWaMR0xHb/AAeBAABgnqtBq13/AEx7AABivosji0X/AOd2AABs/1oAWjL/ACa8AABIB/z3/PX/ABetAABKFfXl9eD/AAifAABNLOnH6cD/ACuSAABQSNmh2Zv/AOmGAABWaMR0xHb/AMZ/AABgnqtBq13/AAt6AABivosji0X/AKZ1AABm/20AbSz/AJVyAABl/0QARBv/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AG/DAADk3NDQHIv/AGC0AADlPvHxttr/AFGmAAA9Z+G44Yb/AHSZAABIxqxNrCb/AA/CAADk3NDQHIv/AACzAADlPvHxttr/APGkAAAAAPf39/f/ABSYAAA9Z+G44Yb/ANKMAABIxqxNrCb/AK/AAADm3MXFG33/AKCxAADnTOnpo8n/AJGjAADpHf394O//ALSWAAA7JvXm9dD/AHKLAAA/gdeh12r/AE+EAABExZJNkiH/AE+/AADm3MXFG33/AECwAADnTOnpo8n/ADGiAADpHf394O//AFSVAAAAAPf39/f/ABKKAAA7JvXm9dD/AO+CAAA/gdeh12r/ADR9AABExZJNkiH/AO+9AADm3MXFG33/AOCuAADodt7ed67/ANGgAADlPvHxttr/APSTAADpHf394O//ALKIAAA7JvXm9dD/AI+BAAA9Z+G44Yb/ANR7AAA/prx/vEH/AG93AABExZJNkiH/AK68AADm3MXFG33/AJ+tAADodt7ed67/AJCfAADlPvHxttr/ALOSAADpHf394O//AHGHAAAAAPf39/f/AE6AAAA7JvXm9dD/AJN6AAA9Z+G44Yb/AC52AAA/prx/vEH/AB1zAABExZJNkiH/AP7FAADO/0tAAEv/AB7KAABl/0QARBv/AO+2AADOrYN2KoP/AOCoAADHV6uZcKv/AKOaAADHM8/Cpc//AAGOAADSFejn1Oj/AH6FAABMHvDZ8NP/AGN+AABQRNum26D/AJ54AABYe65armH/AC10AABhxXgbeDf/AIbFAADO/0tAAEv/AJvJAABhxXgbeDf/AGG7AABl/0QARBv/AHe2AADOrYN2KoP/AGioAADHV6uZcKv/ACuaAADHM8/Cpc//AImNAADSFejn1Oj/AAaFAAAAAPf39/f/AOt9AABMHvDZ8NP/ACZ4AABQRNum26D/ALVzAABYe65armH/AKXEAADERsOvjcP/AJa1AAAAAPf39/f/AIenAABSWr9/v3v/AEXDAADJqJR7MpT/ADa0AADHM8/Cpc//ACemAABQRNum26D/AEqZAABm/4gAiDf/AOXBAADJqJR7MpT/ANayAADHM8/Cpc//AMekAAAAAPf39/f/AOqXAABQRNum26D/AKiMAABm/4gAiDf/AIXAAADOrYN2KoP/AHaxAADERsOvjcP/AGejAADSFejn1Oj/AIqWAABMHvDZ8NP/AEiLAABSWr9/v3v/ACWEAABhxXgbeDf/ACW/AADOrYN2KoP/ABawAADERsOvjcP/AAeiAADSFejn1Oj/ACqVAAAAAPf39/f/AOiJAABMHvDZ8NP/AMWCAABSWr9/v3v/AAp9AABhxXgbeDf/AMW9AADOrYN2KoP/ALauAADHV6uZcKv/AKegAADHM8/Cpc//AMqTAADSFejn1Oj/AIiIAABMHvDZ8NP/AGWBAABQRNum26D/AKp7AABYe65armH/AEV3AABhxXgbeDf/AIS8AADOrYN2KoP/AHWtAADHV6uZcKv/AGafAADHM8/Cpc//AImSAADSFejn1Oj/AEeHAAAAAPf39/f/ACSAAABMHvDZ8NP/AGl6AABQRNum26D/AAR2AABYe65armH/APNyAABhxXgbeDf/AAHEAAC9C/Ls5/L/APK0AACXPdumvdv/AOOmAACNxb4rjL7/AKHCAAC5CPbx7vb/AJKzAACbKOG9yeH/AIOlAACRcM90qc//AKaYAACP97AFcLD/AEHBAAC5CPbx7vb/ADKyAACbKOG9yeH/ACOkAACRcM90qc//AEaXAACNxb4rjL7/AASMAACP940EWo3/AOG/AAC5CPbx7vb/ANKwAACoGObQ0eb/AMOiAACXPdumvdv/AOaVAACRcM90qc//AKSKAACNxb4rjL7/AIGDAACP940EWo3/AIG+AAC5CPbx7vb/AHKvAACoGObQ0eb/AGOhAACXPdumvdv/AIaUAACRcM90qc//AESJAACOt8A2kMD/ACGCAACP97AFcLD/AGZ8AACP+HsDTnv/ACG9AADpCP//9/v/ABKuAAC9C/Ls5/L/AAOgAACoGObQ0eb/ACaTAACXPdumvdv/AOSHAACRcM90qc//AMGAAACOt8A2kMD/AAZ7AACP97AFcLD/AKF2AACP+HsDTnv/AOu7AADpCP//9/v/ANysAAC9C/Ls5/L/AM2eAACoGObQ0eb/APCRAACXPdumvdv/AK6GAACRcM90qc//AIt/AACOt8A2kMD/ANB5AACP97AFcLD/AGt1AACP940EWo3/AFpyAACP+VgCOFj/AJHEAADIDvDs4vD/AIK1AACXPdumvdv/AHOnAACC0JkckJn/ADHDAADPCPf27/f/ACK0AACbKOG9yeH/ABOmAACPgM9nqc//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ANaZAADPhKOYTqP/AHHCAAD+4eTkGhz/AGKzAACSsrg3frj/AFOlAABTk69Nr0r/AHaYAADPhKOYTqP/ADSNAAAV////fwD/ABHBAAD+4eTkGhz/AAKyAACSsrg3frj/APOjAABTk69Nr0r/ABaXAADPhKOYTqP/ANSLAAAV////fwD/ALGEAAAqzP///zP/ALG/AAD+4eTkGhz/AKKwAACSsrg3frj/AJOiAABTk69Nr0r/ALaVAADPhKOYTqP/AHSKAAAV////fwD/AFGDAAAqzP///zP/AJZ9AAAPwaamVij/AFG+AAD+4eTkGhz/AEKvAACSsrg3frj/ADOhAABTk69Nr0r/AFaUAADPhKOYTqP/ABSJAAAV////fwD/APGBAAAqzP///zP/ADZ8AAAPwaamVij/ANF3AADoeff3gb//APG8AAD+4eTkGhz/AOKtAACSsrg3frj/ANOfAABTk69Nr0r/APaSAADPhKOYTqP/ALSHAAAV////fwD/AJGAAAAqzP///zP/ANZ6AAAPwaamVij/AHF2AADoeff3gb//AGBzAAAAAJmZmZn/ABLFAAByeMJmwqX/AAO2AAALm/z8jWL/APSnAACcTcuNoMv/ALLDAAByeMJmwqX/AKO0AAALm/z8jWL/AJSmAACcTcuNoMv/ALeZAADkZufnisP/AFLCAAByeMJmwqX/AEOzAAALm/z8jWL/ADSlAACcTcuNoMv/AFeYAADkZufnisP/ABWNAAA6m9im2FT/APLAAAByeMJmwqX/AOOxAAALm/z8jWL/ANSjAACcTcuNoMv/APeWAADkZufnisP/ALWLAAA6m9im2FT/AJKEAAAi0P//2S//AJK/AAByeMJmwqX/AIOwAAALm/z8jWL/AHSiAACcTcuNoMv/AJeVAADkZufnisP/AFWKAAA6m9im2FT/ADKDAAAi0P//2S//AHd9AAAZWuXlxJT/ADK+AAByeMJmwqX/ACOvAAALm/z8jWL/ABShAACcTcuNoMv/ADeUAADkZufnisP/APWIAAA6m9im2FT/ANKBAAAi0P//2S//ABd8AAAZWuXlxJT/ALJ3AAAAALOzs7P/AELGAAB4VNON08f/AGjKAADTUr28gL3/ADO3AAAqTP///7P/ACSpAACvJdq+utr/AOeaAAAEi/v7gHL/AEWOAACQZNOAsdP/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ACs6AAAhIv//+Nz/AEYwAAD259zcFDz/AI80AAB///8A////AP9GAACq/4sAAIv/AIE0AAB//4sAi4v/AHdRAAAe77i4hgv/AEEIAAAAAKmpqan/AJ8zAABV/2QAZAD/AHYHAAAAAKmpqan/AAk7AAAnbr29t2v/AD1gAADU/4uLAIv/ANYzAAA6jmtVay//AF5OAAAX////jAD/AHpTAADGwMyZMsz/AIZVAAAA/4uLAAD/AMYwAAAKeenplnr/ADg0AABVPbyPvI//ADpHAACvj4tIPYv/AGMIAAB/Z08vT0//AJgHAAB/Z08vT0//ABVKAACA/9EAztH/AP8QAADH/9OUANP/AMs5AADo6///FJP/ACJGAACK//8Av///ADQIAAAAAGlpaWn/AGkHAAAAAGlpaWn/AJRGAACU4f8ekP//AGQ6AAAAzrKyIiL/AJ5IAAAcD///+vD/AGIzAABVwIsiiyL/AAJhAADU////AP//AO4uAAAAANzc3Nz/AH1IAACqB//4+P//AL9SAAAj////1wD/AJ1RAAAe2drapSD/AJUIAAAAAICAgID/AGE0AABV/4AAgAD/AE4KAAA70P+t/y//AMoHAAAAAICAgID/AFcLAABVD//w//D/AK85AADplv//abT/AHdVAAAAjM3NXFz/AEwvAADC/4JLAIL/AFYGAAAqD/////D/ABg7AAAmavDw5oz/AAIdAACqFPrm5vr/AG08AADwD///8PX/AJAzAABA//x8/AD/ABQyAAAmMf//+s3/AGJGAACJP+at2Ob/AGo4AAAAd/DwgID/AHI0AAB/H//g////AF8KAAAqKPr6+tL/ACUIAAAAANPT09P/AHMzAABVZO6Q7pD/AFoHAAAAANPT09P/ALw5AAD4Sf//tsH/ALUwAAAMhP//oHr/ABE0AAB90bIgsqr/ABBGAACPdfqHzvr/AE8IAACUOJl3iJn/AIQHAACUOJl3iJn/AM1GAACXNN6wxN7/AD0KAAAqH////+D/ABhMAABV//8A/wD/AOozAABVwM0yzTL/AAwzAAAVFPr68Ob/AE5gAADU////AP//AKkwAAAA/4CAAAD/AGhLAABxgM1mzar/AL1GAACq/80AAM3/AGhTAADMmNO6VdP/AOBMAAC3fNuTcNv/ACQ0AABnqbM8s3H/ACVHAACwj+57aO7/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APeqAAAXJO7u38z/AMacAAAXJM3NwLD/AAeQAAAYIouLg3j/AC5gAAB///8A////AINLAABxgP9//9T/AKW5AABxgP9//9T/AD2rAABxgO527sb/AAydAABxgM1mzar/AFSQAABxgItFi3T/AKZKAAB/D//w////AJ65AAB/D//w////ADarAAB/D+7g7u7/AAWdAAB/Ds3Bzc3/AEaQAAB/DouDi4v/AIhOAAAqGvX19dz/AEhFAAAXOv//5MT/AOe4AAAXOv//5MT/AH+qAAAXOu7u1bf/AE6cAAAWOs3Nt57/AI+PAAAXOouLfWv/AIU6AAAAAAAAAAD/ADdSAAAZMf//683/AHBHAACq//8AAP//AEy5AACq//8AAP//AOSqAACq/+4AAO7/ALOcAACq/80AAM3/APSPAACq/4sAAIv/ABQRAADAzuKKK+L/AP0vAAAAvqWlKir/AOi3AAAAv///QED/AJypAAAAv+7uOzv/AHObAAAAv83NMzP/ALSOAAAAvouLIyP/ALFRAAAXY97euIf/AAS6AAAXZP//05v/AIurAAAXY+7uxZH/AFqdAAAXY83Nqn3/AKKQAAAXY4uLc1X/AHZGAACAZ6BfnqD/ABW5AACDZ/+Y9f//AK2qAACDZu6O5e7/AHycAACDZ816xc3/AL2PAACDZotThov/AGVJAAA///9//wD/AHi5AAA///9//wD/ABCrAAA//+527gD/AN+cAAA//81mzQD/ACCQAAA//4tFiwD/ADVJAAAR2tLSaR7/AG25AAAR2///fyT/AAWrAAAR2+7udiH/ANScAAAR2s3NZh3/ABWQAAAR3IuLRRP/AH84AAALr///f1D/AHe4AAAHqf//clb/AByqAAAGqe7ualD/APObAAAGqc3NW0X/ADSPAAAGqIuLPi//AIVGAACak+1kle3/ADA6AAAhIv//+Nz/AJy4AAAhIv//+Nz/AEGqAAAiI+7u6M3/ABicAAAiIs3NyLH/AFmPAAAjIouLiHj/AEswAAD259zcFDz/AJQ0AAB///8A////AFy4AAB///8A////AAGqAAB//+4A7u7/ANibAAB//80Azc3/ABmPAAB//4sAi4v/AARHAACq/4sAAIv/AIY0AAB//4sAi4v/AHxRAAAe77i4hgv/APW5AAAe8P//uQ//AHyrAAAe8O7urQ7/AEudAAAe8M3NlQz/AJOQAAAe8IuLZQj/AEYIAAAAAKmpqan/AKQzAABV/2QAZAD/AHsHAAAAAKmpqan/AA47AAAnbr29t2v/AEJgAADU/4uLAIv/ANszAAA6jmtVay//AC64AAA6j//K/3D/ANOpAAA6j+687mj/AKqbAAA6j82izVr/AOuOAAA6j4tuiz3/AGNOAAAX////jAD/AMi5AAAV////fwD/AGCrAAAV/+7udgD/AC+dAAAV/83NZgD/AHeQAAAV/4uLRQD/AH9TAADGwMyZMsz/ACO6AADGwf+/Pv//AKqrAADGwO6yOu7/AHmdAADGwM2aMs3/AMGQAADGwItoIov/AItVAAAA/4uLAAD/AMswAAAKeenplnr/AD00AABVPbyPvI//AEm4AABVPv/B/8H/AO6pAABVPu607rT/AMWbAABVPs2bzZv/AAaPAABVPotpi2n/AD9HAACvj4tIPYv/AGgIAAB/Z08vT0//AJK3AAB/aP+X////AEKpAAB/Z+6N7u7/ACubAAB/aM15zc3/AHGOAAB/aItSi4v/AJ0HAAB/Z08vT0//ABpKAACA/9EAztH/AAQRAADH/9OUANP/ANA5AADo6///FJP/AJK4AADo6///FJP/ADeqAADo6+7uEon/AA6cAADo683NEHb/AE+PAADn7IuLClD/ACdGAACK//8Av///AP24AACK//8Av///AJWqAACK/+4Asu7/AGScAACK/80Ams3/AKWPAACK/4sAaIv/ADkIAAAAAGlpaWn/AG4HAAAAAGlpaWn/AJlGAACU4f8ekP//ACC5AACU4f8ekP//ALiqAACU4e4chu7/AIecAACU4c0YdM3/AMiPAACU4YsQTov/AGk6AAAAzrKyIiL/AKa4AAAAz///MDD/AEuqAAAAz+7uLCz/ACKcAAAAz83NJib/AGOPAAAAz4uLGhr/AKNIAAAcD///+vD/AGczAABVwIsiiyL/AAdhAADU////AP//APMuAAAAANzc3Nz/AIJIAACqB//4+P//AMRSAAAj////1wD/AA+6AAAj////1wD/AJarAAAj/+7uyQD/AGWdAAAj/83NrQD/AK2QAAAj/4uLdQD/AKJRAAAe2drapSD/APm5AAAe2v//wSX/AICrAAAe2u7utCL/AE+dAAAe2s3Nmx3/AJeQAAAe2ouLaRT/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AFEvAADC/4JLAIL/ALMWAAAqAP////4AAFsGAAAqD/////D/AIW3AAAqD/////D/ADWpAAAqD+7u7uD/AAebAAAqDs3NzcH/AGSOAAAqDouLi4P/AB07AAAmavDw5oz/AMa4AAAncP//9o//AFaqAAAncO7u5oX/AC2cAAAnb83NxnP/AG6PAAAnb4uLhk7/AAcdAACqFPrm5vr/AHI8AADwD///8PX/AM24AADwD///8PX/AF2qAADvD+7u4OX/ADScAADwDs3NwcX/AHWPAADvDouLg4b/AJUzAABA//x8/AD/ABkyAAAmMf//+s3/AAS4AAAmMf//+s3/ALipAAAlMu7u6b//AI+bAAAmMc3NyaX/ANCOAAAnMYuLiXD/AGdGAACJP+at2Ob/AAq5AACKQP+/7///AKKqAACKQO6y3+7/AHGcAACKP82awM3/ALKPAACJQItog4v/AG84AAAAd/DwgID/AHc0AAB/H//g////AFe4AAB/H//g////APypAAB/H+7R7u7/ANObAAB/H820zc3/ABSPAAB/H4t6i4v/AFhRAAAjc+7u3YL/AOW5AAAjdP//7Iv/AGyrAAAjc+7u3IL/ADudAAAjc83NvnD/AIOQAAAjc4uLgUz/AGQKAAAqKPr6+tL/ACoIAAAAANPT09P/AHgzAABVZO6Q7pD/AF8HAAAAANPT09P/AME5AAD4Sf//tsH/AIe4AAD5Uf//rrn/ACyqAAD4Ue7uoq3/AAOcAAD5UM3NjJX/AESPAAD5UIuLX2X/ALowAAAMhP//oHr/APe3AAAMhP//oHr/AKupAAALhO7ulXL/AIKbAAAMhc3NgWL/AMOOAAAMhYuLV0L/ABY0AAB90bIgsqr/ABVGAACPdfqHzvr/AO+4AACPT/+w4v//AIeqAACPT+6k0+7/AFacAACOT82Nts3/AJePAACPTotge4v/ABZHAACvj/+EcP//AFQIAACUOJl3iJn/AIkHAACUOJl3iJn/ANJGAACXNN6wxN7/ACy5AACXNf/K4f//AMSqAACXNe680u7/AJOcAACXNc2itc3/ANSPAACWNYtue4v/AEIKAAAqH////+D/AKu3AAAqH////+D/AFupAAAqH+7u7tH/AESbAAAqH83NzbT/AIqOAAAqH4uLi3r/AB1MAABV//8A/wD/AO8zAABVwM0yzTL/ABEzAAAVFPr68Ob/AFNgAADU////AP//AF+6AADU////AP//AOarAADU/+7uAO7/ALWdAADU/83NAM3/AP2QAADU/4uLAIv/AK4wAADvubCwMGD/AO+3AADky///NLP/AKOpAADky+7uMKf/AHqbAADkzM3NKZD/ALuOAADky4uLHGL/AG1LAABxgM1mzar/AMJGAACq/80AAM3/AG1TAADMmNO6VdP/ABW6AADLmf/gZv//AJyrAADLme7RX+7/AGudAADLmc20Us3/ALOQAADLmot6N4v/AOVMAAC3fNuTcNv/ALq5AAC3ff+rgv//AFKrAAC3fe6fee7/ACGdAAC3fc2JaM3/AGmQAAC3fItdR4v/ACk0AABnqbM8s3H/ACpHAACwj+57aO7/ALMzAABv//oA+pr/AAVKAAB9p9FI0cz/AOdUAADk5MfHFYX/AFVGAACqxnAZGXD/AIQ2AABqCf/1//r/AJJJAAAEHv//5OH/AIS5AAAEHv//5OH/AByrAAAEHu7u1dL/AOucAAADHc3Nt7X/ACyQAAAFHYuLfXv/AEEyAAAaSf//5LX/AJJIAAAZUf//3q3/AFK5AAAZUf//3q3/AOqqAAAZUu7uz6H/ALmcAAAZUs3Ns4v/APqPAAAZUouLeV7/AIcEAACq/4AAAID/AAdGAACq/4AAAID/AEBLAAAqAP////4AAAdRAAAbF/399eb/APJEAAAq/4CAgAD/ABhgAAA4wI5rjiP/AFS6AAA4wf/A/z7/ANurAAA4wO6z7jr/AKqdAAA4wM2azTL/APKQAAA4wItpiyL/AHNOAAAb////pQD/AMy5AAAb////pQD/AGSrAAAb/+7umgD/ADOdAAAb/83NhQD/AHuQAAAb/4uLWgD/AN5VAAAL////RQD/AEm6AAAL////RQD/ANCrAAAL/+7uQAD/AJ+dAAAL/83NNwD/AOeQAAAL/4uLJQD/AI9TAADWe9racNb/ACe6AADWfP//g/r/AK6rAADWfO7ueun/AH2dAADWfM3Nacn/AMWQAADVfIuLR4n/AI9RAAAmSO7u6Kr/AP4zAABVZPuY+5j/AD64AABVZf+a/5r/AOOpAABVZO6Q7pD/ALqbAABVZM18zXz/APuOAABVZItUi1T/AC1KAAB/Q+6v7u7/AI+5AAB/RP+7////ACerAAB/RO6u7u7/APacAAB/RM2Wzc3/ADeQAAB/Q4tmi4v/APxUAADxfNvbcJP/AC+6AADxff//gqv/ALarAADxfe7ueZ//AIWdAADxfc3NaIn/AM2QAADxfIuLR13/AEctAAAaKf//79X/ACJCAAAURv//2rn/ANy4AAAURv//2rn/AGyqAAATRe7uy63/AEOcAAATRc3Nr5X/AISPAAAURYuLd2X/ANULAAAUsM3NhT//AOc5AAD3P///wMv/AJa4AAD1Sf//tcX/ADuqAAD1Se7uqbj/ABKcAAD1Ss3NkZ7/AFOPAAD1SYuLY2z/APg1AADURt3doN3/AGe4AADURP//u///AAyqAADURO7uru7/AOObAADURM3Nls3/ACSPAADUQ4uLZov/AKlGAACEO+aw4Ob/AEFNAADE3fCgIPD/AMC5AAC/z/+bMP//AFirAADAz+6RLO7/ACedAADAz819Js3/AG+QAADAz4tVGov/AAdNAAC/qplmM5n/AChWAAAA////AAD/AE+6AAAA////AAD/ANarAAAA/+7uAAD/AKWdAAAA/83NAAD/AO2QAAAA/4uLAAD/AL8vAAAAPby8j4//AOS3AAAAPv//wcH/AJipAAAAPu7utLT/AG+bAAAAPs3Nm5v/ALCOAAAAPouLaWn/APVGAACfteFBaeH/ADy5AACft/9Idv//ANSqAACft+5Dbu7/AKOcAACfts06X83/AOSPAACft4snQIv/AOwvAAAR3IuLRRP/ANswAAAEivr6gHL/APy3AAAJlv//jGn/ALCpAAAJlu7ugmL/AIebAAAJls3NcFT/AMiOAAAJlouLTDn/AM4vAAATmvT0pGD/AE80AABnqosui1f/AE24AABnq/9U/5//APKpAABnq+5O7pT/AMmbAABnq81DzYD/AAqPAABnqosui1f/AD03AAAREP//9e7/AG24AAAREP//9e7/ABKqAAASEe7u5d7/AOmbAAASEc3Nxb//ACqPAAASEIuLhoL/AM1gAAANt6CgUi3/AGi6AAANuP//gkf/AO+rAAANuO7ueUL/AL6dAAANuM3NaDn/AAaRAAANuYuLRyb/ANsbAAAAAMDAwMD/ADhGAACLbOuHzuv/AAG5AACQeP+Hzv//AJmqAACQeO5+wO7/AGicAACQeM1sps3/AKmPAACRd4tKcIv/AFJHAACvj81qWs3/AEe5AACvkP+Db///AN+qAACvkO56Z+7/AK6cAACvkM1pWc3/AO+PAACvkItHPIv/AHsIAACUOJBwgJD/AJa3AACVOP/G4v//AEapAACVOO650+7/AC+bAACUOc2fts3/AHWOAACVOItse4v/ALAHAACUOJBwgJD/ABcKAAAABf//+vr/AKW3AAAABf//+vr/AFWpAAAABe7u6en/AD6bAAAABM3Nycn/AISOAAAAA4uLiYn/AMozAABq//8A/3//ACG4AABq//8A/3//AMapAABq/+4A7nb/AJ2bAABq/80AzWb/AN6OAABq/4sAi0X/AOZGAACSm7RGgrT/ADG5AACSnP9juP//AMmqAACSnO5crO7/AJicAACSnM1PlM3/ANmPAACTm4s2ZIv/AK00AAAYVNLStIz/AGK4AAAUsP//pU//AAeqAAAUsO7umkn/AN6bAAAUsM3NhT//AB+PAAAUsIuLWiv/AAo5AAB//4AAgID/ANJMAADUHdjYv9j/ALG5AADUHv//4f//AEmrAADUHu7u0u7/ABidAADUHc3Ntc3/AGCQAADUHYuLe4v/ANwuAAAGuP//Y0f/ANy3AAAGuP//Y0f/AJCpAAAGuO7uXEL/AGebAAAGuM3NTzn/AKiOAAAGuYuLNib/ALsPAAAqAP////4AAEBKAAB7tuBA4ND/AJO5AACB//8A9f//ACurAACB/+4A5e7/APqcAACB/80Axc3/ADuQAACB/4sAhov/ACQRAADUc+7ugu7/AABVAADj19DQIJD/ADO6AADrwf//Ppb/ALqrAADrwO7uOoz/AImdAADrwM3NMnj/ANGQAADrwIuLIlL/AIUIAAAAAICAgID/AAg0AABV/4AAgAD/ALoHAAAAAICAgID/AJUwAAAA/4CAAAD/AP1MAADU/4CAAID/AMsSAAAbRPX13rP/AMu3AAAbRf//57r/AH+pAAAbRO7u2K7/AFubAAAbRM3Nupb/AKGOAAAbQ4uLfmb/AMZIAAAAAP//////AEROAAAAAPX19fX/AI0IAAAAAL6+vr7/AFg0AABV//8A/wD/AMIHAAAAAL6+vr7/AJ8wAADvubCwMGD/ADJNAADE3fCgIPD/AH4KAAAq/////wD/ALC3AAAq/////wD/AGCpAAAq/+7u7gD/AEmbAAAq/83NzQD/AI+OAAAq/4uLiwD/AEQzAAA4wM2azTL/AEHAggcLA5R4AgBBzoIHC4UIoED/////////////////////////////////////////////////////////////////////////////////////AAKqAkQDAAQABKoGOQZxAaoCqgIABIMEAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABDkCOQKDBIMEgwSNA14HxwVWBVYFxwXjBHMExwXHBaoCHQPHBeMEHQfHBccFcwTHBVYFcwTjBMcFxwWNB8cFxwXjBKoCOQKqAsEDAASqAo0DAASNAwAEjQOqAgAEAAQ5AjkCAAQ5AjkGAAQABAAEAASqAh0DOQIABAAExwUABAAEjQPXA5oB1wNUBP///////////////////////////////////////////////////////////////////////////////////////wACqgJxBAAEAAQACKoGOQKqAqoCAASPBAACqgIAAjkCAAQABAAEAAQABAAEAAQABAAEAASqAqoCjwSPBI8EAARxB8cFVgXHBccFVgXjBDkGOQYdAwAEOQZWBY0HxwU5BuMEOQbHBXMEVgXHBccFAAjHBccFVgWqAjkCqgKmBAAEqgIABHMEjQNzBI0DqgIABHMEOQKqAnMEOQKqBnMEAARzBHMEjQMdA6oCcwQABMcFAAQABI0DJwPDAScDKQT///////////////////////////////////////////////////////////////////////////////////////8AAqoCXAMABAAEqgY5BrYBqgKqAgAEZgUAAqoCAAI5AgAEAAQABAAEAAQABAAEAAQABAAEqgKqAmYFZgVmBQAEXAfjBOMEVgXHBeME4wTHBccFqgKNA1YFcwSqBlYFxwXjBMcF4wQABHMExwXjBKoG4wRzBHMEHQM5Ah0DYAMABKoCAAQABI0DAASNAzkCAAQABDkCOQKNAzkCxwUABAAEAAQABB0DHQM5AgAEjQNWBY0DjQMdAzMDMwIzA1QE////////////////////////////////////////////////////////////////////////////////////////AAIdA3EEAAQABKoGOQY5AqoCqgIABI8EAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABKoCqgKPBI8EjwQABKgGVgVWBVYFxwVWBVYFxwU5Bh0DAARWBeMEHQfHBccF4wTHBVYFcwTjBMcFVgUdB1YF4wTjBKoCOQKqAo8EAASqAgAEAASNAwAEjQOqAgAEcwQ5AjkCAAQ5AjkGcwQABAAEAAQdAx0DOQJzBI0DVgUABI0DHQPJAsMByQKPBP//vHgCAEHeigcLhQigQP////////////////////////////////////////////////////////////////////////////////////85AjkC1wJzBHMEHQdWBYcBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEOQI5AqwErASsBHMEHwhWBVYFxwXHBVYF4wQ5BscFOQIABFYFcwSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEOQI5AjkCwQNzBKoCcwRzBAAEcwRzBDkCcwRzBMcBxwEABMcBqgZzBHMEcwRzBKoCAAQ5AnMEAATHBQAEAAQABKwCFAKsAqwE////////////////////////////////////////////////////////////////////////////////////////OQKqAssDcwRzBB0HxwXnAaoCqgIdA6wEOQKqAjkCOQJzBHMEcwRzBHMEcwRzBHMEcwRzBKoCqgKsBKwErATjBM0HxwXHBccFxwVWBeMEOQbHBTkCcwTHBeMEqgbHBTkGVgU5BscFVgXjBMcFVgWNB1YFVgXjBKoCOQKqAqwEcwSqAnME4wRzBOMEcwSqAuME4wQ5AjkCcwQ5Ah0H4wTjBOME4wQdA3MEqgLjBHMEOQZzBHMEAAQdAz0CHQOsBP///////////////////////////////////////////////////////////////////////////////////////zkCOQLXAnMEcwQdB1YFhwGqAqoCHQOsBDkCqgI5AjkCcwRzBHMEcwRzBHMEcwRzBHMEcwQ5AjkCrASsBKwEcwQfCFYFVgXHBccFVgXjBDkGxwU5AgAEVgVzBKoGxwU5BlYFOQbHBVYF4wTHBVYFjQdWBVYF4wQ5AjkCOQLBA3MEqgJzBHMEAARzBHMEOQJzBHMExwHHAQAExwGqBnMEcwRzBHMEqgIABDkCcwQABMcFAAQABAAErAIUAqwCrAT///////////////////////////////////////////////////////////////////////////////////////85AqoCywNzBHMEHQfHBecBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEqgKqAqwErASsBOMEzQfHBccFxwXHBVYF4wQ5BscFOQJzBMcF4wSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEqgI5AqoCrARzBKoCcwTjBHME4wRzBKoC4wTjBDkCOQJzBDkCHQfjBOME4wTjBB0DcwSqAuMEcwQ5BnMEcwQABB0DPQIdA6wE///weAIAQe6SBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT////////////////////////////////////////////////////////////////////////////////////////NBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0E////////////////////////////////////////////////////////////////////////////////////////zQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBP///////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT//xh5AgBB/ZoHC4YIQI9AAAD///////////////////////////////8CAf///////////////////////////////////////////////wIB5ACIAVgCWAKiA7UC3QA9AT0BwgFYAuQAqAHkABsBWAJYAlgCWAJYAlgCWAJYAlgCWALkAOQAWAJYAlgCuwGyA9kCpAKhAuYCRwIkAtYC+QIBAUQBcQIfAlcD5AL/AnkC/wKdAmcCWgLYArECTQSKAlQCTQI7ARsBOwFYAvQB9AESAkcCzwFHAhQCTQFKAjgC6ADsAPQBKAFYAzgCLAJHAkcCZgHhAV4BMQIDAkkDDQICAs8BYAEJAWABWAL//wAA////////////////////////////////DwH///////////////////////////////////////////////8PAfgAwAFYAlgCsQPWAvMAZgFmAcUBWAL4ALIB+AA5AVgCWAJYAlgCWAJYAlgCWAJYAlgC+AD4AFgCWAJYAssBtgPoArACqAL6AlUCMgLgAgUDGgFiAZkCMgJkA+wCEQOMAhEDrgJ3Am0C4gLJAlkEoAJqAl0CYgE5AWIBWAL0AfQBIwJYAtgBWAIeAmwBXAJJAv8AAwEYAj8BbQNJAkACWAJYAogB6AGAAUMCDwJVAyICDgLaAYcBIAGHAVgC//8AAP///////////////////////////////wIB////////////////////////////////////////////////AgHkAIgBWAJYAqIDtQLdAD0BPQHCAVgC5ACoAeQAGwFYAlgCWAJYAlgCWAJYAlgCWAJYAuQA5ABYAlgCWAK7AbID2QKkAqEC5gJHAiQC1gL5AgEBRAFxAh8CWAPjAv8CeQL/Ap0CZwJaAtgCsAJNBIoCVAJNAjsBGwE7AVgC9AH0ARICRwLPAUcCFAJNAUoCOALoAOwA9AEoAVgDOAIsAkcCRwJmAeEBXgExAgMCSQMNAgICzwFgAQkBYAFYAv//AAD///////////////////////////////8PAf///////////////////////////////////////////////w8B+ADAAVgCWAKxA9YC8wBmAWYBxQFYAvgAsgH4ADkBWAJYAlgCWAJYAlgCWAJYAlgCWAL4APgAWAJYAlgCywG2A+gCsAKoAvoCVQIyAuACBQMaAWIBmAIyAmUD6wIRA4wCEQOuAncCbQLiAskCWQSgAmoCXQJiATkBYgFYAvQB9AEjAlgC2AFYAh4CbAFcAkkC/wADARgCPwFtA0kCQAJYAlgCiAHoAYABQwIPAlUDIgIOAtoBhwEgAYcBWAL//yB5AgBBjqMHC4UIoED/////////////////////////////////////////////////////////////////////////////////////iwI1A64DtAYXBZoHPQYzAh8DHwMABLQGiwLjAosCsgIXBRcFFwUXBRcFFwUXBRcFFwUXBbICsgK0BrQGtAY/BAAIeQV9BZYFKQYOBZoEMwYEBlwCXAI/BXUE5wb8BUwG0wRMBo8FFAXjBNsFeQXpB3sF4wR7BR8DsgIfA7QGAAQABOcEFAVmBBQF7ATRAhQFEgU5AjkCogQ5AssHEgXlBBQFFAVKAysEIwMSBbwEiwa8BLwEMwQXBbICFwW0Bv///////////////////////////////////////////////////////////////////////////////////////8kCpgMrBLQGkQUECPoGcwKoA6gDLwS0BgoDUgMKA+wCkQWRBZEFkQWRBZEFkQWRBZEFkQUzAzMDtAa0BrQGpAQACDEGGQbfBaQGdwV3BZEGsgb6AvoCMwYZBfYHsgbNBt0FzQYpBsMFdQV/BjEG0wgrBssFzQWoA+wCqAO0BgAEAARmBboFvgS6BW0FewO6BbIFvgK+AlIFvgJWCLIFfwW6BboF8gPDBNMDsgU3BWQHKQU3BagEsgXsArIFtAb///////////////////////////////////////////////////////////////////////////////////////+LAjUDrgO0BhcFmgc9BjMCHwMfAwAEtAaLAuMCiwKyAhcFFwUXBRcFFwUXBRcFFwUXBRcFsgKyArQGtAa0Bj8EAAh5BX0FlgUpBg4FmgQzBgQGXAJcAj8FdQTnBvwFTAbTBEwGjwUUBeME2wV5BekHewXjBHsFHwOyAh8DtAYABAAE5wQUBWYEFAXsBNECFAUSBTkCOQKiBDkCywcSBeUEFAUUBUoDKwQjAxIFvASLBrwEvAQzBBcFsgIXBbQG////////////////////////////////////////////////////////////////////////////////////////yQKmAysEkQWRBQQI+gZzAqgDqAMvBLQGCgNSAwoD7AKRBZEFkQWRBZEFkQWRBZEFkQWRBTMDMwO0BrQGtAakBAAIMQYZBt8FpAZ3BXcFkQayBvoC+gIzBhkF9geyBs0G3QXNBikGwwV1BX8GMQbTCCsGywXNBagD7AKoA7QGAAQABGYFugW+BLoFbQV7A7oFsgW+Ar4CUgW+AlYIsgV/BboFugXyA8ME0wOyBTcFZAcpBTcFqASyBewCsgW0Bv//KHkCAEGeqwcLhQigQGYE////////////////////////////////AAD///////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//9mBP///////////////////////////////wAA////////////////////////////////////////////////ZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBP//ZgT///////////////////////////////8AAP///////////////////////////////////////////////2YEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgT///////////////////////////////////////////////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//80eQIAQa6zBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////2kC8AKZAjIEMgTNBKYFRwHwAvAC8AIyBPAC8ALwAjIEMgQyBDIEMgQyBDIEMgQyBDIEMgTwAvACMgQyBDIE8AIqBrgEhwTJBOgESQQzBGkFPAU6AtADmwQNBK0FGwVkBXYEaAWoBNkDpQQwBbME0QZ0BJAEZwTwAtgC8AIyBDIEMgQ0BHUE9gN1BF0E9QIEBF8ESALvAgkEXAKkBl8ESwR1BHUEHAM9AywDXwTrA/QFAgTyA8wD8AIyBPACMgT///////////////////////////////////////////////////////////////////////////////////////9pAvAC7wKwBLAEeQWmBdYB8ALwAnUDsATwAvAC8AIfA7AEsASwBLAEsASwBLAEsASwBLAE8ALwArAEsASwBIEDKgYRBcME5QQkBY0EqwRfBXgFOgJDBPAEbAT2BVcFoAWyBKwF4wQXBOUEbAX5BBIHzgToBHsENwPYAjcDsASwBLAEQwSnBBgEpQSZBPUCBAS+BGMC7wJiBFwC4Aa5BIcEqQSsBGsDcgMsA7oEOARFBmsERQQ6BHgDsAR4A7AE////////////////////////////////////////////////////////////////////////////////////////aQLwApkCMgTZA80EpgVHAfAC8ALwAjIE8ALwAvACMgQyBDIEMgQyBDIEMgQyBDIEMgQyBPAC8AIyBDIEMgTwAioG4wSHBMkE6ARJBDMEaQU8BToC0AObBA0EFwYbBWQFWQRkBagE2QOlBDAFswTRBnQEkARnBPAC2ALwAjIEMgQyBDQEdQSuA3UETAQ2AwQEdQR0Au8CCQSQAqQGXwRLBHUEdQRVAz0DXAN0BOsD9AUCBPIDzAPwAjIE8AIyBP///////////////////////////////////////////////////////////////////////////////////////2kC8AIgA7AEsATcBaYFaQLwAvACdQOwBPAC8ALwAi0DsASwBLAEsASwBLAEsASwBLAEsATwAvACsASwBLAELQMqBukEuATnBA8FvwSvBGkFbQU6Av0DMwU6BEoGSAWeBasEKAb9BAMEewVLBXcFaQdBBXgF5ATiA9ID4gOwBLAEsAS+BL8E8QO/BGoESANIBH8EnQIaA1EEjwKkBn8EjwTKBMoEkwOsA4EDdQRrBDAGmwSDBEME4gOwBOIDsAT//0B5AgBBvrsHC4UIoED/////////////////////////////////////////////////////////////////////////////////////0AImA6wDjAYWBZwI0AUmAqIDogMWBYwG6QKiA+kCogMWBRYFFgUWBRYFFgUWBRYFFgUWBaIDogOMBowGjAZdBAAIeAV8BZYFKgYPBZkENAYDBl4DowOLBXQEvgb8BUwG0wRMBpAFeAXuBNsFeAXpB3sF7AR7BaIDogOiA4wGFgUWBc4E/AQrBPwExATQAvwEEAUyAsECvAQyAsgHEAXbBPwE/ARqAysEJwMQBbwEjAa8BLwENAQUBaIDFAWMBv///////////////////////////////////////////////////////////////////////////////////////7wCOAOzBPAGsAUtCuYGqAJZBFkEsAXwBuQC1wPkAoQFsAWwBbAFsAWwBbAFsAWwBbAFsAU4AzgD8AbwBvAG7wS2BzYGGAbKBaQGdwU0BX0GswZeBHEEKwYZBZUHxgbNBt0FzQZCBq8FdAV/BhwGBwkcBuUFiQVZBIQFWQTwBrAFsAVYBZgFtQSYBVAFYQOYBbMFvAI5A14FvAJ3CLMFfgWYBZgF+gO/BKUDswUzBdYHWgU1BcYEsAVZBLAF8Ab////////////////////////////////////////////////////////////////////////////////////////QAiYDrAOMBhYFnAjQBSYCogOiAxYFjAbpAqID6QKiAxYFFgUWBRYFFgUWBRYFFgUWBRYFogOiA4wGjAaMBl0EAAh2BXwFlgUgBg8FmQQ0BgMGXgOjA4sFdAS+BvwFTAbTBEwGkAV4Be4E2wV2BewHewXsBHsFogOiA6IDjAYWBRYFzgT8BCsE/ATEBNAC+QQQBTICwQKyBDICyQcQBdsE/AT8BGoDKwQnAxAFugSMBrwEugQ0BBQFogMUBYwG////////////////////////////////////////////////////////////////////////////////////////vAI4A7ME8AawBS0K5gaoAlkEWQSwBfAG5ALXA+QChAWwBbAFsAWwBbAFsAWwBbAFsAWwBTgDOAPwBvAG8AbvBLYHNgYYBsoFpAZ3BTQFfQazBl4EcQQrBhkFlQfGBs0G3QXNBkIGrwV0BX8GHAYHCRwG5QWJBVkEhAVZBPAGsAWwBVgFmAW1BJgFUAVhA5gFswW8AjkDXgW8AncIswV8BZgFmAX6A78EpQOzBTEF1gdaBTUFxgSwBVkEsAXwBv//SHkCAEHOwwcLhQigQP////////////////////////////////////////////////////////////////////////////////////8UAiMCNQMrBZMElgbXBcUBXgJeAmoEkwT2AZMCIQLwApMEkwSTBJMEkwSTBJMEkwSTBJMEIQIhApMEkwSTBG8DMQcQBS8FDAXVBXMEIQTTBecFOwIjAukEJwQ5BwgGOwbRBDsG8gRkBG0E0wXDBGgHngR7BJEEogLwAqICVgSWA54EcwTnBM8D5wR9BLYCYgTpBAYCBgIzBAYCcQfpBNUE5wTnBEQD0QPTAukEAgQ5BjEECAS+AwgDaAQIA5ME////////////////////////////////////////////////////////////////////////////////////////FAJKAscDKwWRBDUHAAYhArYCtgJcBJEEUgKTAkgCTgORBJEEkQSRBJEEkQSRBJEEkQSRBEgCUgKRBJEEkQTRAy0HhQVgBRkF7AV7BGQEywUfBqYCpgJQBYUEiweBBl4GBgVeBkgFaASiBAwGMwW8B1YF/gSiBKYCTgOmAkIESgPbBNUEEAUdBBAFugQZA4UEQgVxAnEC9gRxAtsHQgX0BBAFEAWiA/oDeQNCBY0E2QagBI0E5wMnA2gEJwORBP///////////////////////////////////////////////////////////////////////////////////////xQCEgIXAysFaARYBlwFvAFIAkgCagRoBOwBfwIGAs0CaARoBGgEaARoBGgEaARoBGgEaAQGAgYCaARoBGgEagPHBnEEyQSuBFQFFwTHA2oFbQUvAiMCdQTLA7IGngXDBYcEwwWNBAQE/ANoBWIE0QYnBAYEPwRKAs0CSgIjBCcDbwSFBJ4EmgOeBPIDgQICBJ4ECAIIAucDCAL6Bp4EfQSeBJ4EKwNtA5gCngSyA7wF0wOyA40DywJoBMsCaAT///////////////////////////////////////////////////////////////////////////////////////8UAkoCoAMrBWgE2QaqBQoCtgK2AlwEaAQ5ApMCSAJeA2gEaARoBGgEaARoBGgEaARoBGgESAJIAmgEaARoBKwD2QYGBfYE5QRqBVYEPwSFBZoFkwKmAucEJQQKBwoG1wWkBNcF3wQ9BD8EhwW4BCcH2QSDBEoEpgJeA6YCOQQzA28EwQTDBN0DwQR1BPwCVATVBGACYAKLBGACPQfVBK4EwwTBBF4DyQNIA9UEGQROBj8EJwSkA9cCaATXAmgE//9QeQIAQd7LBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////+4BpgJLAyUF4QSKBq8FuQEAAwADxwMlBSgC/gIoAsAD6QRwA3gEagSFBDoEhwQFBMUEhwSAAoACJQUlBSUF1ANuB14FOwUjBf4FOgXLBM0FhQYeAyQEjgXUBGsHIwb0BeEE9AWdBX0E8wQNBlUFzgevBewE0AQAA8ADAAMlBSUFAAQIBHsEogOYBN4DmgITBKgEWAJWAkkESgIMB7oEUASSBHoERwN1A8MCmgT5A+YFCgTwA40DcQMAA3EDJQX///////////////////////////////////////////////////////////////////////////////////////8IAgMDFASgBSAFCQdlBicCkwOTA9sDoAWgAggDoALGA5wF6wMDBf8EMgXLBC8FbwRpBS8F8ALwAqAFoAWgBWMEvAcRBg8GuQWsBsUFXwV1Bk4HkQPDBIkGfAUwCLcGjwacBY8GYQYxBXkFqwYZBgMJeAbbBYQFkwPGA5MDoAWgBQAExAQqBUAETgWTBCUDnQRwBdQCxQIOBcECIAiFBRYFQwUwBSkEGgQuA2oFiQToBrQEfwQ0BAAEGgMABKAF////////////////////////////////////////////////////////////////////////////////////////7gGmAksDJQXhBIoGrwW5AQADAAPHAyUFKAL+AigCwAPpBHADeARqBIUEOgSHBPkDxQSHBBIDEgMlBSUFJQXUA24HXgU7BSMF/gU6BcsEzQWFBh4DJASOBdQEawcjBtgF4QTYBZ0FfQTzBA0GVQXOB68F7ATQBAADwAMAAyUFJQUABJUEbgShA5oExgOhApUEgARhAlQCOQRIAgkHuARMBKAEcQSxA3MDxwKaBE4ElAYCBHoEjQNxAwADcQMlBf///////////////////////////////////////////////////////////////////////////////////////wgCAwMUBKAFIAUJB2UGJwKTA5MD2wOgBaACCAOgAsYDnAXrAwMF/wQyBcsELwWIBGkFLwXwAvACoAWgBaAFYwS8BxEGEwa5BawGxQVfBXUGTgebA8MEiQZ8BUQIowaPBqYFjwZhBjkFeQWrBhkGAwlrBtsFhAWTA8YDkwOgBaAFAARIBTEFSQRNBXUEDAMyBWcF7QLrAiEF1gIECIUFFgVNBTMFRQQjBFYDewXmBHgHqwRbBSMEAAQaAwAEoAX//1h5AgBB7tMHC8gKoED/////////////////////////////////////////////////////////////////////////////////////zwGbAjUD/AMOBLgFdQXEAW0CbQL8A/wD/wFzAgUCFwMOBA4EDgQOBA4EDgQOBA4EDgQOBCQCJAL8A/wD/AO1AycHoQRaBEQE7AToA60DDAX8BAQCjQIoBF0D1wYqBUwFIgRiBVgErQPmAyIFigQeBycE5gO/A3QCFwN0AvwD/ANUAtUDNARiAzQE+wNxAsQDNATWAeoBowPWAWQGNAQ4BDQENATKAiEDrgI0BJ0DuAV3A58DKQOEAq8DhAL8A///AAD///////////////////////////////8AAP///////////////////////////////////////////////88BmwKCA/wDDgTVBaMF3gF+An4C/AP8AxACcwIjAnADDgQOBA4EDgQOBA4EDgQOBA4EDgQ1AjUC/AP8A/wDtQMwB9kEfAQ8BAsF5wOsAxkFDAUiAqYCYARiA/4GRQVpBUIEfQWBBMgD9gM5BbsEQAdoBCgE0wOZAnADmQL8A/wDZwLzA0sEWQNLBAcEiALLA0sE9wELAtcD9wGCBksETQRLBEsE2AIxA8YCSwTJA/YFrQPKAy4DwALNA8AC/AP////////////////////////////////////////////////////////////////////////////////////////PAZsCNQP8Aw4EuAV1BcQBbQJtAvwD/AP/AXMCBQIaAw4EDgQOBA4EDgQOBA4EDgQOBA4EJAIkAvwD/AP8A7UDJwehBFoELgTsBOgDrQMMBfwEBAKNAigEXQPXBigFPAUiBFAFWASeA+YDIgWKBB8HJwTmA78DdAITA3QC/AP8A1QCHQQdBFQDHQTSA3ECHQQdBNYB6gGjA9YBVAYdBBsEHQQdBL4CHQOuAh0EkQO4BXcDlAMpA4QCrwOEAvwD////////////////////////////////////////////////////////////////////////////////////////zwGbAoID/AMOBNUFowXeAX4CfgL8A/wDEAJzAiMCeQMOBA4EDgQOBA4EDgQOBA4EDgQOBDUCNQL8A/wD/AO1AzAH2QR8BCYECwXnA6wDGQUMBSICpgJgBGID/gZABVkFQgRrBYEEuQP2AzkFuwRBB2gEKATTA5kCZgOZAvwD/ANnAjkEOQRLAzkE7gOIAjkEOAT3AQsC1wP3AW4GOAQ4BDkEOQTRAicDxgI4BMED9gWtA8MDLgPAAs0DwAL8A///DAAAAAQAAAAGAAAAAgAAAAMAAAABAAAACQAAAAgAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAFEAAABSAAAAUwAAAFQAAABV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APUAAABlFwAAlyIAALo2AAD2AAAAt2AAALYAAABFDgAAAiIAAFM3AAAwIAAAYCwAAKUiAAAjOwAAxgMAAM46AADAAwAAjAsAANYDAAAqMgAAsQAAAOhRAACjAAAADEwAADIgAABTUQAADyIAAKQsAAAdIgAAszoAAMgDAABiDgAAIgAAALAaAADSIQAA+1oAABoiAABSQAAAKiMAAL8uAAC7AAAAlxoAAJIhAABaNwAACSMAAJkuAAAdIAAADzkAABwhAAAIQQAArgAAAEMbAAALIwAARC8AAMEDAABSNgAADyAAALEuAAA6IAAAjS4AABkgAACrLgAAGiAAAIcwAABhAQAA7A4AAMUiAADSEQAApwAAADIHAACtAAAA6GAAAMMDAAC8QgAAwgMAAFY2AAA8IgAAoxgAAGAmAACpXwAAgiIAABRRAACGIgAA7zUAABEiAAA8LAAAgyIAANK3AAC5AAAAhqkAALIAAABimwAAswAAAO1KAACHIgAAmUAAAN8AAADrCwAAxAMAAE2QAAA0IgAAbGAAALgDAADeNQAA0QMAAEosAAAJIAAAQDAAAP4AAAAkUAAA3AIAAGYXAADXAAAAMVAAACIhAACrGgAA0SEAALxHAAD6AAAAkRoAAJEhAABaWQAA+wAAAPhEAAD5AAAA6DYAAKgAAAAbPQAA0gMAAOIwAADFAwAAtTYAAPwAAABlLAAAGCEAALA6AAC+AwAAtUcAAP0AAAC2MgAApQAAALA2AAD/AAAAZ2AAALYDAACWOgAADSAAAJo6AAAMIAAA5z8BAAgAAAADAAAA5T4AACLQAAALAAAABgAAAFcVAADzaAAAAgAAAAEAAADKLAAApXQAAAQAAAACAAAAGUIAAAAEAAADAAAABAAAAAxBAAAu0AAABQAAAAUAAAC4QgAABAQAAAQAAAAHAAAALRUAAKo2AAAFAAAACQAAAKw2AAAibQAABAAAAAoAAAAsQgAAQPkBAAQAAAAMAAAAsC8AAAAAAQAAAdDR0tPU1dbX2NkAQebyBwsJ8L8AAAAAAAABAEH48gcLDWludmlzAABmaWxsZWQAQZDzBwsaMBoAACJRAADPNQAAbgsAAPR4AABpxgAAVY4AQdDzBwt5//////////////////////////////////////////8AAAAAAAAABP7//4f+//8HAAAAAAAAAAD//3////9///////////N//v3//////3///////////w/g/////zH8////AAAAAAAAAP//////////////AQD4AwBB4PQHC0FA1///+/////9/f1T9/w8A/t////////////7f/////wMA////////nxn////PPwMAAAAAAAD+////fwL+////fwBBqvUHC7MB////BwcAAAAAAP7//wf+BwAAAAD+//////////98/38vAGAAAADg////////IwAAAP8DAAAA4J/5///9xQMAAACwAwADAOCH+f///W0DAAAAXgAAHADgr/v///3tIwAAAAABAAAA4J/5///9zSMAAACwAwAAAODHPdYYx78DAAAAAAAAAADg3/3///3vAwAAAAADAAAA4N/9///97wMAAABAAwAAAODf/f///f8DAAAAAAMAQfD2BwsZ/v////9/DQA/AAAAAAAAAJYl8P6ubA0gHwBBmPcHCwb//v///wMAQcT3Bwty/////z8A/////38A7doHAAAAAFABUDGCq2IsAAAAAEAAyYD1BwAAAAAIAQL/////////////////////////D///////////////A///Pz//////Pz//qv///z/////////fX9wfzw//H9wfAAAAAEBMAEHA+AcLAQcAQdD4BwsmgAAAAP4DAAD+////////////HwD+/////////////wfg/////x8AQZD5BwsV//////////////////////////8/AEGw+QcLFf//////////////////////////DwBB1fkHC8kCYP8H/v//h/7//wcAAAAAAACAAP//f////3//////AAAAAAAAAP//////////////AQD4AwADAAAAAAD//////////z8AAAADAAAAwNf///v/////f39U/f8PAP7f///////////+3/////97AP///////58Z////zz8DAAAAAAAA/v///38C/v///38A/v/7//+7FgD///8HBwAAAAAA/v//B///BwD/A////////////3z/f+///z3/A+7////////z/z8e/8//AADun/n///3F0585gLDP/wMA5If5///9bdOHOQBewP8fAO6v+////e3zvzsAAMH/AADun/n///3N8485wLDD/wAA7Mc91hjHv8PHPYAAgP8AAO7f/f///e/D3z1gAMP/AADs3/3///3vw989YEDD/wAA7N/9///9/8PPPYAAw/8AQbD8Bws4/v////9//wf/f/8DAAAAAJYl8P6ubP87Xz//AwAAAAAAAAAD/wOgwv/+////A/7/3w+//v8//gIAQYr9Bwtn/x8CAAAAoAAAAP7/PgD+////////////H2b+/////////////3dgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAAQBBgf4HCwUVCgAACQBBmP4HC+ABFRAMExweAw0fICEiIxsaERkZGRkZGRkZGRkWEgIOCw8cGBgYGBgYFhYWFhYWFhYWFhYWFhYWFhYWFhYUHAQcFhwYGBgYGBgWFhYWFhYWFhYWFhYWFhYWFhYWFhwkHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcFhwcHBwcHBwcHBwWHBocHBYcHBwcHBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWHBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYcFhYWFhYWFhYAQaCACAsSAgMEBQYHCAAACQoLDA0ODxARAEG+gAgLBBITABQAQdCACAsCFRYAQe6ACAtSAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBFwBBzIEICywBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBGABBoIIICxIZAxobHB0eAAAfICEiIyQlEBEAQb6CCAsEEhMmFABB0IIICwInFgBB7oIIC1IBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEXAEHMgwgLLAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEYAEGghAgLRWAAAABhAAAAYgAAAGMAAABkAAAAZQAAAGYAAABnAAAAaAAAAGkAAABqAAAAawAAAGwAAABtAAAAcAAAAHEAAAABAAAAAQBB8YQICwUVCgAAFQBBiIUIC9UBFRAMExweAw0fICEiIxsaERkZGRkZGRkZGRkWEgIOCw8cGBgYGBgYFhYWFhYWFhYWFhYWFhYWFhYWFhYUHAQcFhwYGBgYGBgWFhYWFhYWFhYWFhYWFhYWFhYWFhwkHBwcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgcHBwcHAEHmhggL2wEBAXIAAABzAAAAdAAAAHUAAAB2AAAAdAAAAHcAAAB4AAAAeQAAAAAAAACoAwIAswMCALwDAgDCAwIAyQMCANIDAgBJU08tODg1OS0xAFVTLUFTQ0lJAFVURi04AFVURi0xNgBVVEYtMTZCRQBVVEYtMTZMRQAAAAAAALD+AQD8AwIAaAUCANQGAgDUBgIASAgCAGgFAgBgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAHoAAABvAAAAAQAAAAEAQc2ICAsFFQoAAAkAQeSICAtgFRAMExweAw0fICEiIxsaERkZGRkZGRkZGRkWEgIOCw8cGBgYGBgYFhYWFhYWFhYWFhYWFhYWFhYWFhYUHAQcFhwYGBgYGBgWFhYWFhYWFhYWFhYWFhYWFhYWFhwkHBwcAEHoiggLRWAAAABhAAAAYgAAAGMAAABkAAAAZQAAAGYAAABnAAAAaAAAAGkAAABqAAAAawAAAGwAAABtAAAAcAAAAHEAAAABAAAAAQBBuYsICwUVCgAACQBB0IsIC9UBFRAMExweAw0fICEiIxsaERkZGRkZGRkZGRkWEgIOCw8cGBgYGBgYFhYWFhYWFhYWFhYWFhYWFhYWFhYUHAQcFhwYGBgYGBgWFhYWFhYWFhYWFhYWFhYWFhYWFhwkHBwcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgcHBwcHAEGujQgLZwEBcgAAAHMAAAB0AAAAdQAAAHYAAAB0AAAAdwAAAHgAAAB5AAAAewAAAHwAAAB9AAAAfgAAAH8AAACAAAAAgQAAAIIAAACDAAAAhAAAAIUAAACGAAAAhwAAAIgAAACJAAAAigAAAAIAQaWOCAsFFQoAAAkAQbyOCAvgARUQDBMcHgMNHyAhIiMbGhEZGRkZGRkZGRkZFhICDgsPHBgYGBgYGBYWFhYWFhYWFhYWFhYWFhYWFhYWFBwEHBYcGBgYGBgYFhYWFhYWFhYWFhYWFhYWFhYWFhYcJBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBYcHBwcHBwcHBwcFhwaHBwWHBwcHBwWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhwWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWHBYWFhYWFhYWAEHAkAgLTkNEQVRBWwAAiwAAAIwAAACNAAAAjgAAAI8AAACQAAAAkQAAAJIAAACTAAAAlAAAAJUAAACWAAAAlwAAAJgAAACZAAAAmgAAAAIAAAAAAQBBmZEICwUVCgAACQBBsJEIC+ABFRAMExweAw0fICEiIxsaERkZGRkZGRkZGRkWEgIOCw8cGBgYGBgYFhYWFhYWFhYWFhYWFhYWFhYWFhYUHAQcFhwYGBgYGBgWFhYWFhYWFhYWFhYWFhYWFhYWFhwkHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcFhwcHBwcHBwcHBwWHBocHBYcHBwcHBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWHBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYcFhYWFhYWFhYAQbSTCAtpdmVyc2lvbgBlbmNvZGluZwBzdGFuZGFsb25lAHllcwBubwAAYAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABwAAAAcQAAAAEAAAABAEGplAgLBRUKAAAVAEHAlAgL1QEVEAwTHB4DDR8gISIjGxoRGRkZGRkZGRkZGRcSAg4LDxwYGBgYGBgWFhYWFhYWFhYWFhYWFhYWFhYWFhQcBBwWHBgYGBgYGBYWFhYWFhYWFhYWFhYWFhYWFhYWHCQcHBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUGBgYGBgYGBgYGBgYGBgYGBwcHBwcAQZ6WCAsjAQFyAAAAcwAAAHQAAAB1AAAAdgAAAHQAAAB3AAAAeAAAAHkAQdCWCAtdbAsCANgMAgBEDgIAsA8CALAPAgAcEQIARA4CAGAAAABhAAAAYgAAAGMAAABkAAAAZQAAAGYAAABnAAAAaAAAAGkAAABqAAAAawAAAGwAAABtAAAAbgAAAG8AAAABAEG9lwgLBRUKAAAJAEHUlwgL4AEVEAwTHB4DDR8gISIjGxoRGRkZGRkZGRkZGRcSAg4LDxwYGBgYGBgWFhYWFhYWFhYWFhYWFhYWFhYWFhQcBBwWHBgYGBgYGBYWFhYWFhYWFhYWFhYWFhYWFhYWHCQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwWHBwcHBwcHBwcHBYcGhwcFhwcHBwcFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYcFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhwWFhYWFhYWFgBB2JkIC0VgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAHoAAABvAAAAAQAAAAEAQamaCAsFFQoAAAkAQcCaCAtgFRAMExweAw0fICEiIxsaERkZGRkZGRkZGRkXEgIOCw8cGBgYGBgYFhYWFhYWFhYWFhYWFhYWFhYWFhYUHAQcFhwYGBgYGBgWFhYWFhYWFhYWFhYWFhYWFhYWFhwkHBwcAEHEnAgLRWAAAABhAAAAYgAAAGMAAABkAAAAZQAAAGYAAABnAAAAaAAAAGkAAABqAAAAawAAAGwAAABtAAAAcAAAAHEAAAABAAAAAQBBlZ0ICwUVCgAACQBBrJ0IC9UBFRAMExweAw0fICEiIxsaERkZGRkZGRkZGRkXEgIOCw8cGBgYGBgYFhYWFhYWFhYWFhYWFhYWFhYWFhYUHAQcFhwYGBgYGBgWFhYWFhYWFhYWFhYWFhYWFhYWFhwkHBwcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBgYGBgYGBgYGBgYGBgYGBgcHBwcHAEGKnwgLZwEBcgAAAHMAAAB0AAAAdQAAAHYAAAB0AAAAdwAAAHgAAAB5AAAAewAAAHwAAAB9AAAAfgAAAH8AAACAAAAAgQAAAIIAAACDAAAAhAAAAIUAAACGAAAAhwAAAIgAAACJAAAAigAAAAIAQYGgCAsFFQoAAAkAQZigCAvgARUQDBMcHgMNHyAhIiMbGhEZGRkZGRkZGRkZFxICDgsPHBgYGBgYGBYWFhYWFhYWFhYWFhYWFhYWFhYWFBwEHBYcGBgYGBgYFhYWFhYWFhYWFhYWFhYWFhYWFhYcJBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBYcHBwcHBwcHBwcFhwaHBwWHBwcHBwWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhwWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWHBYWFhYWFhYWAEGcoggLRosAAACMAAAAjQAAAI4AAACPAAAAkAAAAJEAAACSAAAAkwAAAJQAAACVAAAAlgAAAJcAAACYAAAAmQAAAJoAAAACAAAAAAEAQe2iCAsFFQoAAAkAQYSjCAvgARUQDBMcHgMNHyAhIiMbGhEZGRkZGRkZGRkZFxICDgsPHBgYGBgYGBYWFhYWFhYWFhYWFhYWFhYWFhYWFBwEHBYcGBgYGBgYFhYWFhYWFhYWFhYWFhYWFhYWFhYcJBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBYcHBwcHBwcHBwcFhwaHBwWHBwcHBwWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhwWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWHBYWFhYWFhYWAEGIpQgLyAMCAAAAAwAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAIAAAABAAAAAgAAAAMAAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAERPQ1RZUEUAU1lTVEVNAFBVQkxJQwBFTlRJVFkAQVRUTElTVABFTEVNRU5UAE5PVEFUSU9OAElOQ0xVREUASUdOT1JFAE5EQVRBAAAAAAAAwBMCAMYTAgDJEwIAzxMCAGYTAgDWEwIA3xMCAOcTAgBDREFUQQBJRABJRFJFRgBJRFJFRlMARU5USVRJRVMATk1UT0tFTgBOTVRPS0VOUwBJTVBMSUVEAFJFUVVJUkVEAEZJWEVEAEVNUFRZAEFOWQBQQ0RBVEEAIwBDREFUQQBJRABJRFJFRgBJRFJFRlMARU5USVRZAEVOVElUSUVTAE5NVE9LRU4ATk1UT0tFTlMAQeCoCAskaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlAEGQqQgL6AtodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLwAAAHhtbD1odHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UAAAAAYQYAACAbAADuUQAA3dEAADAzAAAbHAAAKkEAADNIAADqDwAAYlAAAHsFAACzUAAAwgQAAFcdAACnBAAACUgAAEwFAADfPwAA1xEAAFkxAACFUAAARUsAANwNAAD8BAAAVxIAAAswAACCCQAAaAkAANYEAACMVgAAa1YAAJZTAAAWWAAAAVgAAAdUAADnVgAAIAUAAHdMAADoVQAAfBcAANEPAACTVQAA/1YAABdUAABKyAAAr7oAADasAAAFngAATZEAACCGAAAEfwAASXkAAOR0AADIcQAAbG8AADhvAAADbwAAx24AADhuAABVbQAAN8gAAJy6AAAjrAAA8p0AADqRAAANhgAA8X4AADZ5AADRdAAAtXEAAGdvAAAzbwAA/m4AAMJuAAAzbgAAUG0AACTIAACJugAAEKwAAN+dAAAnkQAA+oUAAN5+AAAjeQAAvnQAAKJxAABibwAALm8AAPluAAC9bgAALm4AAEttAAAfyAAAhLoAAAusAADanQAAIpEAAPWFAADZfgAAHnkAALl0AACdcQAAXW8AAClvAAD0bgAAuG4AACluAABGbQAAGsgAAH+6AAAGrAAA1Z0AAB2RAADwhQAA1H4AABl5AAC0dAAAmHEAAFhvAAAkbwAA724AALNuAAAkbgAAQW0AABXIAAB6ugAAAawAANCdAAAYkQAA64UAAM9+AAAUeQAAr3QAAJNxAABTbwAAH28AAOpuAACubgAAGG4AADxtAAAQyAAAdboAAPyrAADLnQAAE5EAAOaFAADKfgAAD3kAAKp0AACOcQAATm8AABpvAADlbgAAk24AABNuAAA3bQAAC8gAAHC6AAD3qwAAxp0AAA6RAADhhQAAxX4AAAp5AACgdAAAiXEAAElvAAAVbwAA4G4AAI5uAAAObgAAHW0AAAXIAAChtwAAUakAADqbAACAjgAA2IUAAMF+AAAGeQAAh3QAAAkTAABONQAADW8AANFuAADSHQAAZG0AAA9tAABIyQAAFrsAAJ2sAACtngAAyZEAAIeGAABrfwAAsHkAAEt1AAA6cgAAcW8AAD1vAAAIbwAAzG4AAD1uAABfbQAAPucAALrjAABK4QAAGBQCALrWAAC41gAAttYAALTWAABT1gAADdYAAD7QAAA80AAAOtAAADfQAAAg0AAAfM8AAHTPAAC+xwAAg7cAADOpAAAFmwAAYo4AAMqFAACzfgAA+HgAAHl0AAB7cQAAonAAAFpwAABYcAAATnAAAHhvAAB2bwAAdG8AAEdvAAALbwAAz24AAEBuAABibQAADW0AAH5sAABabAAAMmwAADBsAAAtbAAA/WgAAOdoAAC2aAAAtGgAAKNoAAChaAAA/2cAAONnAABKZwAASGcAAEZnAABEZwAAxmQAAJ1kAACbZAAAgGQAAH5kAADrYgAA6WIAAF9hAABdYQAAI2AAAKNfAABCWQAAIlEAAIZDAACBQQAAZz4AAF87AACmOgAAlDoAAF85AACMNgAAzzUAALgvAACLLgAAJx4AAOMdAAAwGgAAChMAAEAMAAC8CwAAbgsAAN8JAAD+CAAAbwQAAEQEAAA7BAAALwQAAAkEAABabQAAAAAAAAgArv/RAAoArv+u/wsArv+u/67/rv+u/67/rv+u/wUA0QCu/9EA0QDRANEA0QDRANEA0QCu//v/rv8OAOz/rv+u/67/rv/RANEA0QDRANEADQAlAAwAQgAQAFAAEwBtAHsAFACYAA8ApgDDAK7/rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/xcArv93AK7/BwAuAK7/JgCu/xcAEQAjAK7/DQCu/67/rv+u/zoArv+u/zUArv+u/67/KACu/wcArv87AEUArv9IAK7/rv+u/67/rv8AQYG1CAvBBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygAAAAAAAAAAAICAgICAhAMWQEAH1AIAwcSExRXFhcIC2kMHwoFDA4pESsPLRAvMCAyBjQ1GxwdHgsMISIjJCUmJygMGBkXBAobHBogKgohIiMkJSYnKAwKDlMKLFgxWFhYWFhYDBscDy5YMyEiIyQlJicoGxz/U///ISIjJCUmJygM//8F////CRT//////wwbHP8QFRYhIiMkJSYnKBsc/////yEiIyQlJicoDP8SExQRFhf///////8MGxz///8SISIjJCUmJygbHP////8hIiMkJSYnKAz///////8T////////DBsc/////yEiIyQlJicoGxz/////ISIjJCUmJygSExQVFhcYGf///////////yMkJSYnGxITFBYXIjZoAR84ViEgAhsbG14bGzc5cDbSwk8EPCJHIj8iRCIiWCJlIiIFBl9gOQQHCAkKCwwNDgRmZ11qbQUGb1g7cQcICQoLDA0OBHI8W3M+YUYbEhMUFhcEBQY/QWJJBwgJCgsMDQ4FBgBcAAAHCAkKCwwNDgQAAE8AAABTQgAAAAAABAUGAERUVQcICQoLDA0OBQYAAAAABwgJCgsMDQ4EACosLkcxMwAAAAAAAAQFBgAAAEoHCAkKCwwNDgUGAAAAAAcICQoLDA0OBAAAAAAA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X0NUWVBFAAAAAExDX05VTUVSSUMAAExDX1RJTUUAAAAAAExDX0NPTExBVEUAAExDX01PTkVUQVJZAExDX01FU1NBR0VTAEHw9QgLB0MuVVRGLTgAQYj2CAugEDCrAgDIqwIAWKwCAE5vIGVycm9yIGluZm9ybWF0aW9uAElsbGVnYWwgYnl0ZSBzZXF1ZW5jZQBEb21haW4gZXJyb3IAUmVzdWx0IG5vdCByZXByZXNlbnRhYmxlAE5vdCBhIHR0eQBQZXJtaXNzaW9uIGRlbmllZABPcGVyYXRpb24gbm90IHBlcm1pdHRlZABObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5AE5vIHN1Y2ggcHJvY2VzcwBGaWxlIGV4aXN0cwBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRhdGEgdHlwZQBObyBzcGFjZSBsZWZ0IG9uIGRldmljZQBPdXQgb2YgbWVtb3J5AFJlc291cmNlIGJ1c3kASW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwAUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUASW52YWxpZCBzZWVrAENyb3NzLWRldmljZSBsaW5rAFJlYWQtb25seSBmaWxlIHN5c3RlbQBEaXJlY3Rvcnkgbm90IGVtcHR5AENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgBPcGVyYXRpb24gdGltZWQgb3V0AENvbm5lY3Rpb24gcmVmdXNlZABIb3N0IGlzIGRvd24ASG9zdCBpcyB1bnJlYWNoYWJsZQBBZGRyZXNzIGluIHVzZQBCcm9rZW4gcGlwZQBJL08gZXJyb3IATm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwBCbG9jayBkZXZpY2UgcmVxdWlyZWQATm8gc3VjaCBkZXZpY2UATm90IGEgZGlyZWN0b3J5AElzIGEgZGlyZWN0b3J5AFRleHQgZmlsZSBidXN5AEV4ZWMgZm9ybWF0IGVycm9yAEludmFsaWQgYXJndW1lbnQAQXJndW1lbnQgbGlzdCB0b28gbG9uZwBTeW1ib2xpYyBsaW5rIGxvb3AARmlsZW5hbWUgdG9vIGxvbmcAVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0ATm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUAQmFkIGZpbGUgZGVzY3JpcHRvcgBObyBjaGlsZCBwcm9jZXNzAEJhZCBhZGRyZXNzAEZpbGUgdG9vIGxhcmdlAFRvbyBtYW55IGxpbmtzAE5vIGxvY2tzIGF2YWlsYWJsZQBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1cgBTdGF0ZSBub3QgcmVjb3ZlcmFibGUAUHJldmlvdXMgb3duZXIgZGllZABPcGVyYXRpb24gY2FuY2VsZWQARnVuY3Rpb24gbm90IGltcGxlbWVudGVkAE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlAElkZW50aWZpZXIgcmVtb3ZlZABEZXZpY2Ugbm90IGEgc3RyZWFtAE5vIGRhdGEgYXZhaWxhYmxlAERldmljZSB0aW1lb3V0AE91dCBvZiBzdHJlYW1zIHJlc291cmNlcwBMaW5rIGhhcyBiZWVuIHNldmVyZWQAUHJvdG9jb2wgZXJyb3IAQmFkIG1lc3NhZ2UARmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZQBOb3QgYSBzb2NrZXQARGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZABNZXNzYWdlIHRvbyBsYXJnZQBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQAUHJvdG9jb2wgbm90IGF2YWlsYWJsZQBQcm90b2NvbCBub3Qgc3VwcG9ydGVkAFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQATm90IHN1cHBvcnRlZABQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZABBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sAEFkZHJlc3Mgbm90IGF2YWlsYWJsZQBOZXR3b3JrIGlzIGRvd24ATmV0d29yayB1bnJlYWNoYWJsZQBDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsAQ29ubmVjdGlvbiBhYm9ydGVkAE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUAU29ja2V0IGlzIGNvbm5lY3RlZABTb2NrZXQgbm90IGNvbm5lY3RlZABDYW5ub3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24AT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MAT3BlcmF0aW9uIGluIHByb2dyZXNzAFN0YWxlIGZpbGUgaGFuZGxlAFJlbW90ZSBJL08gZXJyb3IAUXVvdGEgZXhjZWVkZWQATm8gbWVkaXVtIGZvdW5kAFdyb25nIG1lZGl1bSB0eXBlAE11bHRpaG9wIGF0dGVtcHRlZABSZXF1aXJlZCBrZXkgbm90IGF2YWlsYWJsZQBLZXkgaGFzIGV4cGlyZWQAS2V5IGhhcyBiZWVuIHJldm9rZWQAS2V5IHdhcyByZWplY3RlZCBieSBzZXJ2aWNlAAAAAAClAlsA8AG1BYwFJQGDBh0DlAT/AMcDMQMLBrwBjwF/A8oEKwDaBq8AQgNOA9wBDgQVAKEGDQGUAgsCOAZkArwC/wJdA+cECwfPAssF7wXbBeECHgZFAoUAggJsA28E8QDzAxgF2QDaA0wGVAJ7AZ0DvQQAAFEAFQK7ALMDbQD/AYUELwX5BDgAZQFGAZ8AtwaoAXMCUwEAQdiGCQsMIQQAAAAAAAAAAC8CAEH4hgkLBjUERwRWBABBjocJCwKgBABBoocJCyJGBWAFbgVhBgAAzwEAAAAAAAAAAMkG6Qb5Bh4HOQdJB14HAEHQhwkLkQHRdJ4AV529KoBwUg///z4nCgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QUYAAAANQAAAHEAAABr////zvv//5K///8AAAAAAAAAABkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEHxiAkLIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBBq4kJCwEMAEG3iQkLFRMAAAAAEwAAAAAJDAAAAAAADAAADABB5YkJCwEQAEHxiQkLFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABBn4oJCwESAEGrigkLHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBB4ooJCw4aAAAAGhoaAAAAAAAACQBBk4sJCwEUAEGfiwkLFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABBzYsJCwEWAEHZiwkLJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBBpIwJCwILAgBBzIwJCwj//////////wBBkI0JC/UI/////////////////////////////////////////////////////////////////wABAgMEBQYHCAn/////////CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiP///////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAQIEBwMGBQAAAAAAAAACAADAAwAAwAQAAMAFAADABgAAwAcAAMAIAADACQAAwAoAAMALAADADAAAwA0AAMAOAADADwAAwBAAAMARAADAEgAAwBMAAMAUAADAFQAAwBYAAMAXAADAGAAAwBkAAMAaAADAGwAAwBwAAMAdAADAHgAAwB8AAMAAAACzAQAAwwIAAMMDAADDBAAAwwUAAMMGAADDBwAAwwgAAMMJAADDCgAAwwsAAMMMAADDDQAA0w4AAMMPAADDAAAMuwEADMMCAAzDAwAMwwQADNsAAAAAVEkCAA0CAAAOAgAADwIAABACAAARAgAAEgIAABMCAAAUAgAAFQIAABYCAAAXAgAAGAIAABkCAAAaAgAABAAAAAAAAACQSQIAGwIAABwCAAD8/////P///5BJAgAdAgAAHgIAALhIAgDMSAIAAAAAANhJAgAfAgAAIAIAAA8CAAAQAgAAIQIAACICAAATAgAAFAIAABUCAAAjAgAAFwIAACQCAAAZAgAAJQIAAMh0AgAoSQIA7EoCAE5TdDNfXzI5YmFzaWNfaW9zSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFAAAAoHQCAFxJAgBOU3QzX18yMTViYXNpY19zdHJlYW1idWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUUAAAAAJHUCAKhJAgAAAAAAAQAAABxJAgAD9P//TlN0M19fMjEzYmFzaWNfb3N0cmVhbUljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQAAyHQCAORJAgBUSQIATlN0M19fMjE1YmFzaWNfc3RyaW5nYnVmSWNOU18xMWNoYXJfdHJhaXRz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";return D}var fA;function XA(D){if(D==fA&&E)return new Uint8Array(E);var M=m(D);if(M)return M;throw"both async and sync fetching of the wasm failed"}function DA(D){return Promise.resolve().then(()=>XA(D))}function ee(D,M,R){return DA(D).then(V=>WebAssembly.instantiate(V,M)).then(R,V=>{h(`failed to asynchronously prepare wasm: ${V}`),PA(V)})}function NA(D,M,R,V){return ee(M,R,V)}function ke(){return{a:Ut}}function HA(){var D=ke();function M(V,_){return st=V.exports,v=st.y,W(),rA(st.z),pA(),st}zA();function R(V){M(V.instance)}return fA??=YA(),NA(E,fA,D,R).catch(o),{}}function vA(D){return i.agerrMessages.push(xe(D)),0}function Gt(D){this.name="ExitStatus",this.message=`Program terminated with exit(${D})`,this.status=D}var ft=D=>{D.forEach(M=>M(i))};function he(D,M="i8"){switch(M.endsWith("*")&&(M="*"),M){case"i1":return S[D];case"i8":return S[D];case"i16":return x[D>>1];case"i32":return F[D>>2];case"i64":return Z[D>>3];case"float":return P[D>>2];case"double":return tA[D>>3];case"*":return z[D>>2];default:PA(`invalid type for getValue: ${M}`)}}var Ot=D=>Xi(D),He=()=>pn(),je=typeof TextDecoder<"u"?new TextDecoder:void 0,pt=(D,M=0,R=NaN)=>{for(var V=M+R,_=M;D[_]&&!(_>=V);)++_;if(_-M>16&&D.buffer&&je)return je.decode(D.subarray(M,_));for(var q="";M<_;){var nA=D[M++];if(!(nA&128)){q+=String.fromCharCode(nA);continue}var cA=D[M++]&63;if((nA&224)==192){q+=String.fromCharCode((nA&31)<<6|cA);continue}var MA=D[M++]&63;if((nA&240)==224?nA=(nA&15)<<12|cA<<6|MA:nA=(nA&7)<<18|cA<<12|MA<<6|D[M++]&63,nA<65536)q+=String.fromCharCode(nA);else{var oe=nA-65536;q+=String.fromCharCode(55296|oe>>10,56320|oe&1023)}}return q},xe=(D,M)=>D?pt(b,D,M):"",oi=(D,M,R,V)=>{PA(`Assertion failed: ${xe(D)}, at: `+[M?xe(M):"unknown filename",R,V?xe(V):"unknown function"])};class j{constructor(M){this.excPtr=M,this.ptr=M-24}set_type(M){z[this.ptr+4>>2]=M}get_type(){return z[this.ptr+4>>2]}set_destructor(M){z[this.ptr+8>>2]=M}get_destructor(){return z[this.ptr+8>>2]}set_caught(M){M=M?1:0,S[this.ptr+12]=M}get_caught(){return S[this.ptr+12]!=0}set_rethrown(M){M=M?1:0,S[this.ptr+13]=M}get_rethrown(){return S[this.ptr+13]!=0}init(M,R){this.set_adjusted_ptr(0),this.set_type(M),this.set_destructor(R)}set_adjusted_ptr(M){z[this.ptr+16>>2]=M}get_adjusted_ptr(){return z[this.ptr+16>>2]}}var $=0,oA=(D,M,R)=>{var V=new j(D);throw V.init(M,R),$=D,$},sA={isAbs:D=>D.charAt(0)==="/",splitPath:D=>{var M=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return M.exec(D).slice(1)},normalizeArray:(D,M)=>{for(var R=0,V=D.length-1;V>=0;V--){var _=D[V];_==="."?D.splice(V,1):_===".."?(D.splice(V,1),R++):R&&(D.splice(V,1),R--)}if(M)for(;R;R--)D.unshift("..");return D},normalize:D=>{var M=sA.isAbs(D),R=D.substr(-1)==="/";return D=sA.normalizeArray(D.split("/").filter(V=>!!V),!M).join("/"),!D&&!M&&(D="."),D&&R&&(D+="/"),(M?"/":"")+D},dirname:D=>{var M=sA.splitPath(D),R=M[0],V=M[1];return!R&&!V?".":(V&&(V=V.substr(0,V.length-1)),R+V)},basename:D=>{if(D==="/")return"/";D=sA.normalize(D),D=D.replace(/\/$/,"");var M=D.lastIndexOf("/");return M===-1?D:D.substr(M+1)},join:(...D)=>sA.normalize(D.join("/")),join2:(D,M)=>sA.normalize(D+"/"+M)},TA=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return D=>crypto.getRandomValues(D);PA("initRandomDevice")},de=D=>(de=TA())(D),Qe={resolve:(...D)=>{for(var M="",R=!1,V=D.length-1;V>=-1&&!R;V--){var _=V>=0?D[V]:G.cwd();if(typeof _!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!_)return"";M=_+"/"+M,R=sA.isAbs(_)}return M=sA.normalizeArray(M.split("/").filter(q=>!!q),!R).join("/"),(R?"/":"")+M||"."},relative:(D,M)=>{D=Qe.resolve(D).substr(1),M=Qe.resolve(M).substr(1);function R(oe){for(var se=0;se=0&&oe[Ee]==="";Ee--);return se>Ee?[]:oe.slice(se,Ee-se+1)}for(var V=R(D.split("/")),_=R(M.split("/")),q=Math.min(V.length,_.length),nA=q,cA=0;cA{for(var M=0,R=0;R=55296&&V<=57343?(M+=4,++R):M+=3}return M},ht=(D,M,R,V)=>{if(!(V>0))return 0;for(var _=R,q=R+V-1,nA=0;nA=55296&&cA<=57343){var MA=D.charCodeAt(++nA);cA=65536+((cA&1023)<<10)|MA&1023}if(cA<=127){if(R>=q)break;M[R++]=cA}else if(cA<=2047){if(R+1>=q)break;M[R++]=192|cA>>6,M[R++]=128|cA&63}else if(cA<=65535){if(R+2>=q)break;M[R++]=224|cA>>12,M[R++]=128|cA>>6&63,M[R++]=128|cA&63}else{if(R+3>=q)break;M[R++]=240|cA>>18,M[R++]=128|cA>>12&63,M[R++]=128|cA>>6&63,M[R++]=128|cA&63}}return M[R]=0,R-_};function tt(D,M,R){var V=R>0?R:OA(D)+1,_=new Array(V),q=ht(D,_,0,_.length);return M&&(_.length=q),_}var ze=()=>{if(!GA.length){var D=null;if(typeof window<"u"&&typeof window.prompt=="function"&&(D=window.prompt("Input: "),D!==null&&(D+=` +`)),!D)return null;GA=tt(D,!0)}return GA.shift()},Oe={ttys:[],init(){},shutdown(){},register(D,M){Oe.ttys[D]={input:[],output:[],ops:M},G.registerDevice(D,Oe.stream_ops)},stream_ops:{open(D){var M=Oe.ttys[D.node.rdev];if(!M)throw new G.ErrnoError(43);D.tty=M,D.seekable=!1},close(D){D.tty.ops.fsync(D.tty)},fsync(D){D.tty.ops.fsync(D.tty)},read(D,M,R,V,_){if(!D.tty||!D.tty.ops.get_char)throw new G.ErrnoError(60);for(var q=0,nA=0;nA0&&(d(pt(D.output)),D.output=[])},ioctl_tcgets(D){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(D,M,R){return 0},ioctl_tiocgwinsz(D){return[24,80]}},default_tty1_ops:{put_char(D,M){M===null||M===10?(h(pt(D.output)),D.output=[]):M!=0&&D.output.push(M)},fsync(D){D.output&&D.output.length>0&&(h(pt(D.output)),D.output=[])}}},Ci=(D,M)=>{b.fill(0,D,D+M)},gn=(D,M)=>Math.ceil(D/M)*M,hn=D=>{D=gn(D,65536);var M=Oi(65536,D);return M&&Ci(M,D),M},Ke={ops_table:null,mount(D){return Ke.createNode(null,"/",16895,0)},createNode(D,M,R,V){if(G.isBlkdev(R)||G.isFIFO(R))throw new G.ErrnoError(63);Ke.ops_table||={dir:{node:{getattr:Ke.node_ops.getattr,setattr:Ke.node_ops.setattr,lookup:Ke.node_ops.lookup,mknod:Ke.node_ops.mknod,rename:Ke.node_ops.rename,unlink:Ke.node_ops.unlink,rmdir:Ke.node_ops.rmdir,readdir:Ke.node_ops.readdir,symlink:Ke.node_ops.symlink},stream:{llseek:Ke.stream_ops.llseek}},file:{node:{getattr:Ke.node_ops.getattr,setattr:Ke.node_ops.setattr},stream:{llseek:Ke.stream_ops.llseek,read:Ke.stream_ops.read,write:Ke.stream_ops.write,allocate:Ke.stream_ops.allocate,mmap:Ke.stream_ops.mmap,msync:Ke.stream_ops.msync}},link:{node:{getattr:Ke.node_ops.getattr,setattr:Ke.node_ops.setattr,readlink:Ke.node_ops.readlink},stream:{}},chrdev:{node:{getattr:Ke.node_ops.getattr,setattr:Ke.node_ops.setattr},stream:G.chrdev_stream_ops}};var _=G.createNode(D,M,R,V);return G.isDir(_.mode)?(_.node_ops=Ke.ops_table.dir.node,_.stream_ops=Ke.ops_table.dir.stream,_.contents={}):G.isFile(_.mode)?(_.node_ops=Ke.ops_table.file.node,_.stream_ops=Ke.ops_table.file.stream,_.usedBytes=0,_.contents=null):G.isLink(_.mode)?(_.node_ops=Ke.ops_table.link.node,_.stream_ops=Ke.ops_table.link.stream):G.isChrdev(_.mode)&&(_.node_ops=Ke.ops_table.chrdev.node,_.stream_ops=Ke.ops_table.chrdev.stream),_.timestamp=Date.now(),D&&(D.contents[M]=_,D.timestamp=_.timestamp),_},getFileDataAsTypedArray(D){return D.contents?D.contents.subarray?D.contents.subarray(0,D.usedBytes):new Uint8Array(D.contents):new Uint8Array(0)},expandFileStorage(D,M){var R=D.contents?D.contents.length:0;if(!(R>=M)){var V=1024*1024;M=Math.max(M,R*(R>>0),R!=0&&(M=Math.max(M,256));var _=D.contents;D.contents=new Uint8Array(M),D.usedBytes>0&&D.contents.set(_.subarray(0,D.usedBytes),0)}},resizeFileStorage(D,M){if(D.usedBytes!=M)if(M==0)D.contents=null,D.usedBytes=0;else{var R=D.contents;D.contents=new Uint8Array(M),R&&D.contents.set(R.subarray(0,Math.min(M,D.usedBytes))),D.usedBytes=M}},node_ops:{getattr(D){var M={};return M.dev=G.isChrdev(D.mode)?D.id:1,M.ino=D.id,M.mode=D.mode,M.nlink=1,M.uid=0,M.gid=0,M.rdev=D.rdev,G.isDir(D.mode)?M.size=4096:G.isFile(D.mode)?M.size=D.usedBytes:G.isLink(D.mode)?M.size=D.link.length:M.size=0,M.atime=new Date(D.timestamp),M.mtime=new Date(D.timestamp),M.ctime=new Date(D.timestamp),M.blksize=4096,M.blocks=Math.ceil(M.size/M.blksize),M},setattr(D,M){M.mode!==void 0&&(D.mode=M.mode),M.timestamp!==void 0&&(D.timestamp=M.timestamp),M.size!==void 0&&Ke.resizeFileStorage(D,M.size)},lookup(D,M){throw G.genericErrors[44]},mknod(D,M,R,V){return Ke.createNode(D,M,R,V)},rename(D,M,R){if(G.isDir(D.mode)){var V;try{V=G.lookupNode(M,R)}catch(q){}if(V)for(var _ in V.contents)throw new G.ErrnoError(55)}delete D.parent.contents[D.name],D.parent.timestamp=Date.now(),D.name=R,M.contents[R]=D,M.timestamp=D.parent.timestamp},unlink(D,M){delete D.contents[M],D.timestamp=Date.now()},rmdir(D,M){var R=G.lookupNode(D,M);for(var V in R.contents)throw new G.ErrnoError(55);delete D.contents[M],D.timestamp=Date.now()},readdir(D){var M=[".",".."];for(var R of Object.keys(D.contents))M.push(R);return M},symlink(D,M,R){var V=Ke.createNode(D,M,41471,0);return V.link=R,V},readlink(D){if(!G.isLink(D.mode))throw new G.ErrnoError(28);return D.link}},stream_ops:{read(D,M,R,V,_){var q=D.node.contents;if(_>=D.node.usedBytes)return 0;var nA=Math.min(D.node.usedBytes-_,V);if(nA>8&&q.subarray)M.set(q.subarray(_,_+nA),R);else for(var cA=0;cA0||R+M{var _=V?"":`al ${D}`;C(D).then(q=>{M(new Uint8Array(q)),_&&pA()},q=>{if(R)R();else throw`Loading data file "${D}" failed.`}),_&&zA()},Si=(D,M,R,V,_,q)=>{G.createDataFile(D,M,R,V,_,q)},Li=[],Zi=(D,M,R,V)=>{typeof Browser<"u"&&Browser.init();var _=!1;return Li.forEach(q=>{_||q.canHandle(M)&&(q.handle(D,M,R,V),_=!0)}),_},bt=(D,M,R,V,_,q,nA,cA,MA,oe)=>{var se=M?Qe.resolve(sA.join2(D,M)):D;function Ee(Pe){function Re(Le){oe?.(),cA||Si(D,M,Le,V,_,MA),q?.(),pA()}Zi(Pe,se,Re,()=>{nA?.(),pA()})||Re(Pe)}zA(),typeof R=="string"?nn(R,Ee,nA):Ee(R)},on=D=>{var M={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},R=M[D];if(typeof R>"u")throw new Error(`Unknown file open mode: ${D}`);return R},Kt=(D,M)=>{var R=0;return D&&(R|=365),M&&(R|=146),R},G={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(D){this.name="ErrnoError",this.errno=D}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(D){this.node=D}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(D){this.shared.flags=D}get position(){return this.shared.position}set position(D){this.shared.position=D}},FSNode:class{constructor(D,M,R,V){D||(D=this),this.parent=D,this.mount=D.mount,this.mounted=null,this.id=G.nextInode++,this.name=M,this.mode=R,this.node_ops={},this.stream_ops={},this.rdev=V,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(D){D?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(D){D?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return G.isDir(this.mode)}get isDevice(){return G.isChrdev(this.mode)}},lookupPath(D,M={}){if(D=Qe.resolve(D),!D)return{path:"",node:null};var R={follow_mount:!0,recurse_count:0};if(M=Object.assign(R,M),M.recurse_count>8)throw new G.ErrnoError(32);for(var V=D.split("/").filter(Ee=>!!Ee),_=G.root,q="/",nA=0;nA40)throw new G.ErrnoError(32)}}return{path:q,node:_}},getPath(D){for(var M;;){if(G.isRoot(D)){var R=D.mount.mountpoint;return M?R[R.length-1]!=="/"?`${R}/${M}`:R+M:R}M=M?`${D.name}/${M}`:D.name,D=D.parent}},hashName(D,M){for(var R=0,V=0;V>>0)%G.nameTable.length},hashAddNode(D){var M=G.hashName(D.parent.id,D.name);D.name_next=G.nameTable[M],G.nameTable[M]=D},hashRemoveNode(D){var M=G.hashName(D.parent.id,D.name);if(G.nameTable[M]===D)G.nameTable[M]=D.name_next;else for(var R=G.nameTable[M];R;){if(R.name_next===D){R.name_next=D.name_next;break}R=R.name_next}},lookupNode(D,M){var R=G.mayLookup(D);if(R)throw new G.ErrnoError(R);for(var V=G.hashName(D.id,M),_=G.nameTable[V];_;_=_.name_next){var q=_.name;if(_.parent.id===D.id&&q===M)return _}return G.lookup(D,M)},createNode(D,M,R,V){var _=new G.FSNode(D,M,R,V);return G.hashAddNode(_),_},destroyNode(D){G.hashRemoveNode(D)},isRoot(D){return D===D.parent},isMountpoint(D){return!!D.mounted},isFile(D){return(D&61440)===32768},isDir(D){return(D&61440)===16384},isLink(D){return(D&61440)===40960},isChrdev(D){return(D&61440)===8192},isBlkdev(D){return(D&61440)===24576},isFIFO(D){return(D&61440)===4096},isSocket(D){return(D&49152)===49152},flagsToPermissionString(D){var M=["r","w","rw"][D&3];return D&512&&(M+="w"),M},nodePermissions(D,M){return G.ignorePermissions?0:M.includes("r")&&!(D.mode&292)||M.includes("w")&&!(D.mode&146)||M.includes("x")&&!(D.mode&73)?2:0},mayLookup(D){if(!G.isDir(D.mode))return 54;var M=G.nodePermissions(D,"x");return M||(D.node_ops.lookup?0:2)},mayCreate(D,M){try{var R=G.lookupNode(D,M);return 20}catch(V){}return G.nodePermissions(D,"wx")},mayDelete(D,M,R){var V;try{V=G.lookupNode(D,M)}catch(q){return q.errno}var _=G.nodePermissions(D,"wx");if(_)return _;if(R){if(!G.isDir(V.mode))return 54;if(G.isRoot(V)||G.getPath(V)===G.cwd())return 10}else if(G.isDir(V.mode))return 31;return 0},mayOpen(D,M){return D?G.isLink(D.mode)?32:G.isDir(D.mode)&&(G.flagsToPermissionString(M)!=="r"||M&512)?31:G.nodePermissions(D,G.flagsToPermissionString(M)):44},MAX_OPEN_FDS:4096,nextfd(){for(var D=0;D<=G.MAX_OPEN_FDS;D++)if(!G.streams[D])return D;throw new G.ErrnoError(33)},getStreamChecked(D){var M=G.getStream(D);if(!M)throw new G.ErrnoError(8);return M},getStream:D=>G.streams[D],createStream(D,M=-1){return D=Object.assign(new G.FSStream,D),M==-1&&(M=G.nextfd()),D.fd=M,G.streams[M]=D,D},closeStream(D){G.streams[D]=null},dupStream(D,M=-1){var R=G.createStream(D,M);return R.stream_ops?.dup?.(R),R},chrdev_stream_ops:{open(D){var M=G.getDevice(D.node.rdev);D.stream_ops=M.stream_ops,D.stream_ops.open?.(D)},llseek(){throw new G.ErrnoError(70)}},major:D=>D>>8,minor:D=>D&255,makedev:(D,M)=>D<<8|M,registerDevice(D,M){G.devices[D]={stream_ops:M}},getDevice:D=>G.devices[D],getMounts(D){for(var M=[],R=[D];R.length;){var V=R.pop();M.push(V),R.push(...V.mounts)}return M},syncfs(D,M){typeof D=="function"&&(M=D,D=!1),G.syncFSRequests++,G.syncFSRequests>1&&h(`warning: ${G.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var R=G.getMounts(G.root.mount),V=0;function _(nA){return G.syncFSRequests--,M(nA)}function q(nA){if(nA)return q.errored?void 0:(q.errored=!0,_(nA));++V>=R.length&&_(null)}R.forEach(nA=>{if(!nA.type.syncfs)return q(null);nA.type.syncfs(nA,D,q)})},mount(D,M,R){var V=R==="/",_=!R,q;if(V&&G.root)throw new G.ErrnoError(10);if(!V&&!_){var nA=G.lookupPath(R,{follow_mount:!1});if(R=nA.path,q=nA.node,G.isMountpoint(q))throw new G.ErrnoError(10);if(!G.isDir(q.mode))throw new G.ErrnoError(54)}var cA={type:D,opts:M,mountpoint:R,mounts:[]},MA=D.mount(cA);return MA.mount=cA,cA.root=MA,V?G.root=MA:q&&(q.mounted=cA,q.mount&&q.mount.mounts.push(cA)),MA},unmount(D){var M=G.lookupPath(D,{follow_mount:!1});if(!G.isMountpoint(M.node))throw new G.ErrnoError(28);var R=M.node,V=R.mounted,_=G.getMounts(V);Object.keys(G.nameTable).forEach(nA=>{for(var cA=G.nameTable[nA];cA;){var MA=cA.name_next;_.includes(cA.mount)&&G.destroyNode(cA),cA=MA}}),R.mounted=null;var q=R.mount.mounts.indexOf(V);R.mount.mounts.splice(q,1)},lookup(D,M){return D.node_ops.lookup(D,M)},mknod(D,M,R){var V=G.lookupPath(D,{parent:!0}),_=V.node,q=sA.basename(D);if(!q||q==="."||q==="..")throw new G.ErrnoError(28);var nA=G.mayCreate(_,q);if(nA)throw new G.ErrnoError(nA);if(!_.node_ops.mknod)throw new G.ErrnoError(63);return _.node_ops.mknod(_,q,M,R)},create(D,M){return M=M!==void 0?M:438,M&=4095,M|=32768,G.mknod(D,M,0)},mkdir(D,M){return M=M!==void 0?M:511,M&=1023,M|=16384,G.mknod(D,M,0)},mkdirTree(D,M){for(var R=D.split("/"),V="",_=0;_"u"&&(R=M,M=438),M|=8192,G.mknod(D,M,R)},symlink(D,M){if(!Qe.resolve(D))throw new G.ErrnoError(44);var R=G.lookupPath(M,{parent:!0}),V=R.node;if(!V)throw new G.ErrnoError(44);var _=sA.basename(M),q=G.mayCreate(V,_);if(q)throw new G.ErrnoError(q);if(!V.node_ops.symlink)throw new G.ErrnoError(63);return V.node_ops.symlink(V,_,D)},rename(D,M){var R=sA.dirname(D),V=sA.dirname(M),_=sA.basename(D),q=sA.basename(M),nA,cA,MA;if(nA=G.lookupPath(D,{parent:!0}),cA=nA.node,nA=G.lookupPath(M,{parent:!0}),MA=nA.node,!cA||!MA)throw new G.ErrnoError(44);if(cA.mount!==MA.mount)throw new G.ErrnoError(75);var oe=G.lookupNode(cA,_),se=Qe.relative(D,V);if(se.charAt(0)!==".")throw new G.ErrnoError(28);if(se=Qe.relative(M,R),se.charAt(0)!==".")throw new G.ErrnoError(55);var Ee;try{Ee=G.lookupNode(MA,q)}catch(Le){}if(oe!==Ee){var Pe=G.isDir(oe.mode),Re=G.mayDelete(cA,_,Pe);if(Re)throw new G.ErrnoError(Re);if(Re=Ee?G.mayDelete(MA,q,Pe):G.mayCreate(MA,q),Re)throw new G.ErrnoError(Re);if(!cA.node_ops.rename)throw new G.ErrnoError(63);if(G.isMountpoint(oe)||Ee&&G.isMountpoint(Ee))throw new G.ErrnoError(10);if(MA!==cA&&(Re=G.nodePermissions(cA,"w"),Re))throw new G.ErrnoError(Re);G.hashRemoveNode(oe);try{cA.node_ops.rename(oe,MA,q),oe.parent=MA}catch(Le){throw Le}finally{G.hashAddNode(oe)}}},rmdir(D){var M=G.lookupPath(D,{parent:!0}),R=M.node,V=sA.basename(D),_=G.lookupNode(R,V),q=G.mayDelete(R,V,!0);if(q)throw new G.ErrnoError(q);if(!R.node_ops.rmdir)throw new G.ErrnoError(63);if(G.isMountpoint(_))throw new G.ErrnoError(10);R.node_ops.rmdir(R,V),G.destroyNode(_)},readdir(D){var M=G.lookupPath(D,{follow:!0}),R=M.node;if(!R.node_ops.readdir)throw new G.ErrnoError(54);return R.node_ops.readdir(R)},unlink(D){var M=G.lookupPath(D,{parent:!0}),R=M.node;if(!R)throw new G.ErrnoError(44);var V=sA.basename(D),_=G.lookupNode(R,V),q=G.mayDelete(R,V,!1);if(q)throw new G.ErrnoError(q);if(!R.node_ops.unlink)throw new G.ErrnoError(63);if(G.isMountpoint(_))throw new G.ErrnoError(10);R.node_ops.unlink(R,V),G.destroyNode(_)},readlink(D){var M=G.lookupPath(D),R=M.node;if(!R)throw new G.ErrnoError(44);if(!R.node_ops.readlink)throw new G.ErrnoError(28);return Qe.resolve(G.getPath(R.parent),R.node_ops.readlink(R))},stat(D,M){var R=G.lookupPath(D,{follow:!M}),V=R.node;if(!V)throw new G.ErrnoError(44);if(!V.node_ops.getattr)throw new G.ErrnoError(63);return V.node_ops.getattr(V)},lstat(D){return G.stat(D,!0)},chmod(D,M,R){var V;if(typeof D=="string"){var _=G.lookupPath(D,{follow:!R});V=_.node}else V=D;if(!V.node_ops.setattr)throw new G.ErrnoError(63);V.node_ops.setattr(V,{mode:M&4095|V.mode&-4096,timestamp:Date.now()})},lchmod(D,M){G.chmod(D,M,!0)},fchmod(D,M){var R=G.getStreamChecked(D);G.chmod(R.node,M)},chown(D,M,R,V){var _;if(typeof D=="string"){var q=G.lookupPath(D,{follow:!V});_=q.node}else _=D;if(!_.node_ops.setattr)throw new G.ErrnoError(63);_.node_ops.setattr(_,{timestamp:Date.now()})},lchown(D,M,R){G.chown(D,M,R,!0)},fchown(D,M,R){var V=G.getStreamChecked(D);G.chown(V.node,M,R)},truncate(D,M){if(M<0)throw new G.ErrnoError(28);var R;if(typeof D=="string"){var V=G.lookupPath(D,{follow:!0});R=V.node}else R=D;if(!R.node_ops.setattr)throw new G.ErrnoError(63);if(G.isDir(R.mode))throw new G.ErrnoError(31);if(!G.isFile(R.mode))throw new G.ErrnoError(28);var _=G.nodePermissions(R,"w");if(_)throw new G.ErrnoError(_);R.node_ops.setattr(R,{size:M,timestamp:Date.now()})},ftruncate(D,M){var R=G.getStreamChecked(D);if((R.flags&2097155)===0)throw new G.ErrnoError(28);G.truncate(R.node,M)},utime(D,M,R){var V=G.lookupPath(D,{follow:!0}),_=V.node;_.node_ops.setattr(_,{timestamp:Math.max(M,R)})},open(D,M,R){if(D==="")throw new G.ErrnoError(44);M=typeof M=="string"?on(M):M,M&64?(R=typeof R>"u"?438:R,R=R&4095|32768):R=0;var V;if(typeof D=="object")V=D;else{D=sA.normalize(D);try{var _=G.lookupPath(D,{follow:!(M&131072)});V=_.node}catch(MA){}}var q=!1;if(M&64)if(V){if(M&128)throw new G.ErrnoError(20)}else V=G.mknod(D,R,0),q=!0;if(!V)throw new G.ErrnoError(44);if(G.isChrdev(V.mode)&&(M&=-513),M&65536&&!G.isDir(V.mode))throw new G.ErrnoError(54);if(!q){var nA=G.mayOpen(V,M);if(nA)throw new G.ErrnoError(nA)}M&512&&!q&&G.truncate(V,0),M&=-131713;var cA=G.createStream({node:V,path:G.getPath(V),flags:M,seekable:!0,position:0,stream_ops:V.stream_ops,ungotten:[],error:!1});return cA.stream_ops.open&&cA.stream_ops.open(cA),cA},close(D){if(G.isClosed(D))throw new G.ErrnoError(8);D.getdents&&(D.getdents=null);try{D.stream_ops.close&&D.stream_ops.close(D)}catch(M){throw M}finally{G.closeStream(D.fd)}D.fd=null},isClosed(D){return D.fd===null},llseek(D,M,R){if(G.isClosed(D))throw new G.ErrnoError(8);if(!D.seekable||!D.stream_ops.llseek)throw new G.ErrnoError(70);if(R!=0&&R!=1&&R!=2)throw new G.ErrnoError(28);return D.position=D.stream_ops.llseek(D,M,R),D.ungotten=[],D.position},read(D,M,R,V,_){if(V<0||_<0)throw new G.ErrnoError(28);if(G.isClosed(D))throw new G.ErrnoError(8);if((D.flags&2097155)===1)throw new G.ErrnoError(8);if(G.isDir(D.node.mode))throw new G.ErrnoError(31);if(!D.stream_ops.read)throw new G.ErrnoError(28);var q=typeof _<"u";if(!q)_=D.position;else if(!D.seekable)throw new G.ErrnoError(70);var nA=D.stream_ops.read(D,M,R,V,_);return q||(D.position+=nA),nA},write(D,M,R,V,_,q){if(V<0||_<0)throw new G.ErrnoError(28);if(G.isClosed(D))throw new G.ErrnoError(8);if((D.flags&2097155)===0)throw new G.ErrnoError(8);if(G.isDir(D.node.mode))throw new G.ErrnoError(31);if(!D.stream_ops.write)throw new G.ErrnoError(28);D.seekable&&D.flags&1024&&G.llseek(D,0,2);var nA=typeof _<"u";if(!nA)_=D.position;else if(!D.seekable)throw new G.ErrnoError(70);var cA=D.stream_ops.write(D,M,R,V,_,q);return nA||(D.position+=cA),cA},allocate(D,M,R){if(G.isClosed(D))throw new G.ErrnoError(8);if(M<0||R<=0)throw new G.ErrnoError(28);if((D.flags&2097155)===0)throw new G.ErrnoError(8);if(!G.isFile(D.node.mode)&&!G.isDir(D.node.mode))throw new G.ErrnoError(43);if(!D.stream_ops.allocate)throw new G.ErrnoError(138);D.stream_ops.allocate(D,M,R)},mmap(D,M,R,V,_){if((V&2)!==0&&(_&2)===0&&(D.flags&2097155)!==2)throw new G.ErrnoError(2);if((D.flags&2097155)===1)throw new G.ErrnoError(2);if(!D.stream_ops.mmap)throw new G.ErrnoError(43);if(!M)throw new G.ErrnoError(28);return D.stream_ops.mmap(D,M,R,V,_)},msync(D,M,R,V,_){return D.stream_ops.msync?D.stream_ops.msync(D,M,R,V,_):0},ioctl(D,M,R){if(!D.stream_ops.ioctl)throw new G.ErrnoError(59);return D.stream_ops.ioctl(D,M,R)},readFile(D,M={}){if(M.flags=M.flags||0,M.encoding=M.encoding||"binary",M.encoding!=="utf8"&&M.encoding!=="binary")throw new Error(`Invalid encoding type "${M.encoding}"`);var R,V=G.open(D,M.flags),_=G.stat(D),q=_.size,nA=new Uint8Array(q);return G.read(V,nA,0,q,0),M.encoding==="utf8"?R=pt(nA):M.encoding==="binary"&&(R=nA),G.close(V),R},writeFile(D,M,R={}){R.flags=R.flags||577;var V=G.open(D,R.flags,R.mode);if(typeof M=="string"){var _=new Uint8Array(OA(M)+1),q=ht(M,_,0,_.length);G.write(V,_,0,q,void 0,R.canOwn)}else if(ArrayBuffer.isView(M))G.write(V,M,0,M.byteLength,void 0,R.canOwn);else throw new Error("Unsupported data type");G.close(V)},cwd:()=>G.currentPath,chdir(D){var M=G.lookupPath(D,{follow:!0});if(M.node===null)throw new G.ErrnoError(44);if(!G.isDir(M.node.mode))throw new G.ErrnoError(54);var R=G.nodePermissions(M.node,"x");if(R)throw new G.ErrnoError(R);G.currentPath=M.path},createDefaultDirectories(){G.mkdir("/tmp"),G.mkdir("/home"),G.mkdir("/home/web_user")},createDefaultDevices(){G.mkdir("/dev"),G.registerDevice(G.makedev(1,3),{read:()=>0,write:(V,_,q,nA,cA)=>nA}),G.mkdev("/dev/null",G.makedev(1,3)),Oe.register(G.makedev(5,0),Oe.default_tty_ops),Oe.register(G.makedev(6,0),Oe.default_tty1_ops),G.mkdev("/dev/tty",G.makedev(5,0)),G.mkdev("/dev/tty1",G.makedev(6,0));var D=new Uint8Array(1024),M=0,R=()=>(M===0&&(M=de(D).byteLength),D[--M]);G.createDevice("/dev","random",R),G.createDevice("/dev","urandom",R),G.mkdir("/dev/shm"),G.mkdir("/dev/shm/tmp")},createSpecialDirectories(){G.mkdir("/proc");var D=G.mkdir("/proc/self");G.mkdir("/proc/self/fd"),G.mount({mount(){var M=G.createNode(D,"fd",16895,73);return M.node_ops={lookup(R,V){var _=+V,q=G.getStreamChecked(_),nA={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>q.path}};return nA.parent=nA,nA}},M}},{},"/proc/self/fd")},createStandardStreams(D,M,R){D?G.createDevice("/dev","stdin",D):G.symlink("/dev/tty","/dev/stdin"),M?G.createDevice("/dev","stdout",null,M):G.symlink("/dev/tty","/dev/stdout"),R?G.createDevice("/dev","stderr",null,R):G.symlink("/dev/tty1","/dev/stderr"),G.open("/dev/stdin",0),G.open("/dev/stdout",1),G.open("/dev/stderr",1)},staticInit(){[44].forEach(D=>{G.genericErrors[D]=new G.ErrnoError(D),G.genericErrors[D].stack=""}),G.nameTable=new Array(4096),G.mount(Ke,{},"/"),G.createDefaultDirectories(),G.createDefaultDevices(),G.createSpecialDirectories(),G.filesystems={MEMFS:Ke}},init(D,M,R){G.initialized=!0,G.createStandardStreams(D,M,R)},quit(){G.initialized=!1;for(var D=0;Dthis.length-1||Re<0)){var Le=Re%this.chunkSize,ai=Re/this.chunkSize|0;return this.getter(ai)[Le]}}setDataGetter(Re){this.getter=Re}cacheLength(){var Re=new XMLHttpRequest;if(Re.open("HEAD",R,!1),Re.send(null),!(Re.status>=200&&Re.status<300||Re.status===304))throw new Error("Couldn't load "+R+". Status: "+Re.status);var Le=Number(Re.getResponseHeader("Content-length")),ai,Yn=(ai=Re.getResponseHeader("Accept-Ranges"))&&ai==="bytes",eA=(ai=Re.getResponseHeader("Content-Encoding"))&&ai==="gzip",yA=1024*1024;Yn||(yA=Le);var WA=(ye,be)=>{if(ye>be)throw new Error("invalid range ("+ye+", "+be+") or no bytes requested!");if(be>Le-1)throw new Error("only "+Le+" bytes available! programmer error!");var ot=new XMLHttpRequest;if(ot.open("GET",R,!1),Le!==yA&&ot.setRequestHeader("Range","bytes="+ye+"-"+be),ot.responseType="arraybuffer",ot.overrideMimeType&&ot.overrideMimeType("text/plain; charset=x-user-defined"),ot.send(null),!(ot.status>=200&&ot.status<300||ot.status===304))throw new Error("Couldn't load "+R+". Status: "+ot.status);return ot.response!==void 0?new Uint8Array(ot.response||[]):tt(ot.responseText||"",!0)},Ge=this;Ge.setDataGetter(ye=>{var be=ye*yA,ot=(ye+1)*yA-1;if(ot=Math.min(ot,Le-1),typeof Ge.chunks[ye]>"u"&&(Ge.chunks[ye]=WA(be,ot)),typeof Ge.chunks[ye]>"u")throw new Error("doXHR failed!");return Ge.chunks[ye]}),(eA||!Le)&&(yA=Le=1,Le=this.getter(0).length,yA=Le,d("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=Le,this._chunkSize=yA,this.lengthKnown=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if(typeof XMLHttpRequest<"u"){throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var nA,cA}else var cA={isDevice:!1,url:R};var MA=G.createFile(D,M,cA,V,_);cA.contents?MA.contents=cA.contents:cA.url&&(MA.contents=null,MA.url=cA.url),Object.defineProperties(MA,{usedBytes:{get:function(){return this.contents.length}}});var oe={},se=Object.keys(MA.stream_ops);se.forEach(Pe=>{var Re=MA.stream_ops[Pe];oe[Pe]=(...Le)=>(G.forceLoadFile(MA),Re(...Le))});function Ee(Pe,Re,Le,ai,Yn){var eA=Pe.node.contents;if(Yn>=eA.length)return 0;var yA=Math.min(eA.length-Yn,ai);if(eA.slice)for(var WA=0;WA(G.forceLoadFile(MA),Ee(Pe,Re,Le,ai,Yn)),oe.mmap=(Pe,Re,Le,ai,Yn)=>{G.forceLoadFile(MA);var eA=hn(Re);if(!eA)throw new G.ErrnoError(48);return Ee(Pe,S,eA,Re,Le),{ptr:eA,allocated:!0}},MA.stream_ops=oe,MA}},dt={DEFAULT_POLLMASK:5,calculateAt(D,M,R){if(sA.isAbs(M))return M;var V;if(D===-100)V=G.cwd();else{var _=dt.getStreamFromFD(D);V=_.path}if(M.length==0){if(!R)throw new G.ErrnoError(44);return V}return sA.join2(V,M)},doStat(D,M,R){var V=D(M);F[R>>2]=V.dev,F[R+4>>2]=V.mode,z[R+8>>2]=V.nlink,F[R+12>>2]=V.uid,F[R+16>>2]=V.gid,F[R+20>>2]=V.rdev,Z[R+24>>3]=BigInt(V.size),F[R+32>>2]=4096,F[R+36>>2]=V.blocks;var _=V.atime.getTime(),q=V.mtime.getTime(),nA=V.ctime.getTime();return Z[R+40>>3]=BigInt(Math.floor(_/1e3)),z[R+48>>2]=_%1e3*1e3*1e3,Z[R+56>>3]=BigInt(Math.floor(q/1e3)),z[R+64>>2]=q%1e3*1e3*1e3,Z[R+72>>3]=BigInt(Math.floor(nA/1e3)),z[R+80>>2]=nA%1e3*1e3*1e3,Z[R+88>>3]=BigInt(V.ino),0},doMsync(D,M,R,V,_){if(!G.isFile(M.node.mode))throw new G.ErrnoError(43);if(V&2)return 0;var q=b.slice(D,D+R);G.msync(M,q,_,R,V)},getStreamFromFD(D){var M=G.getStreamChecked(D);return M},varargs:void 0,getStr(D){var M=xe(D);return M}};function Ei(D,M,R,V){try{if(M=dt.getStr(M),M=dt.calculateAt(D,M),R&-8)return-28;var _=G.lookupPath(M,{follow:!0}),q=_.node;if(!q)return-44;var nA="";return R&4&&(nA+="r"),R&2&&(nA+="w"),R&1&&(nA+="x"),nA&&G.nodePermissions(q,nA)?-2:0}catch(cA){if(typeof G>"u"||cA.name!=="ErrnoError")throw cA;return-cA.errno}}function Qn(){var D=F[+dt.varargs>>2];return dt.varargs+=4,D}var un=Qn;function Vn(D,M,R){dt.varargs=R;try{var V=dt.getStreamFromFD(D);switch(M){case 0:{var _=Qn();if(_<0)return-28;for(;G.streams[_];)_++;var q;return q=G.dupStream(V,_),q.fd}case 1:case 2:return 0;case 3:return V.flags;case 4:{var _=Qn();return V.flags|=_,0}case 12:{var _=un(),nA=0;return x[_+nA>>1]=2,0}case 13:case 14:return 0}return-28}catch(cA){if(typeof G>"u"||cA.name!=="ErrnoError")throw cA;return-cA.errno}}function Yo(D,M){try{var R=dt.getStreamFromFD(D);return dt.doStat(G.stat,R.path,M)}catch(V){if(typeof G>"u"||V.name!=="ErrnoError")throw V;return-V.errno}}function Bo(D,M,R){dt.varargs=R;try{var V=dt.getStreamFromFD(D);switch(M){case 21509:return V.tty?0:-59;case 21505:{if(!V.tty)return-59;if(V.tty.ops.ioctl_tcgets){var _=V.tty.ops.ioctl_tcgets(V),q=un();F[q>>2]=_.c_iflag||0,F[q+4>>2]=_.c_oflag||0,F[q+8>>2]=_.c_cflag||0,F[q+12>>2]=_.c_lflag||0;for(var nA=0;nA<32;nA++)S[q+nA+17]=_.c_cc[nA]||0;return 0}return 0}case 21510:case 21511:case 21512:return V.tty?0:-59;case 21506:case 21507:case 21508:{if(!V.tty)return-59;if(V.tty.ops.ioctl_tcsets){for(var q=un(),cA=F[q>>2],MA=F[q+4>>2],oe=F[q+8>>2],se=F[q+12>>2],Ee=[],nA=0;nA<32;nA++)Ee.push(S[q+nA+17]);return V.tty.ops.ioctl_tcsets(V.tty,M,{c_iflag:cA,c_oflag:MA,c_cflag:oe,c_lflag:se,c_cc:Ee})}return 0}case 21519:{if(!V.tty)return-59;var q=un();return F[q>>2]=0,0}case 21520:return V.tty?-28:-59;case 21531:{var q=un();return G.ioctl(V,M,q)}case 21523:{if(!V.tty)return-59;if(V.tty.ops.ioctl_tiocgwinsz){var Pe=V.tty.ops.ioctl_tiocgwinsz(V.tty),q=un();x[q>>1]=Pe[0],x[q+2>>1]=Pe[1]}return 0}case 21524:return V.tty?0:-59;case 21515:return V.tty?0:-59;default:return-28}}catch(Re){if(typeof G>"u"||Re.name!=="ErrnoError")throw Re;return-Re.errno}}function No(D,M,R,V){try{M=dt.getStr(M);var _=V&256,q=V&4096;return V=V&-6401,M=dt.calculateAt(D,M,q),dt.doStat(_?G.lstat:G.stat,M,R)}catch(nA){if(typeof G>"u"||nA.name!=="ErrnoError")throw nA;return-nA.errno}}function Zo(D,M,R,V){dt.varargs=V;try{M=dt.getStr(M),M=dt.calculateAt(D,M);var _=V?Qn():0;return G.open(M,R,_).fd}catch(q){if(typeof G>"u"||q.name!=="ErrnoError")throw q;return-q.errno}}function Do(D,M){try{return D=dt.getStr(D),dt.doStat(G.stat,D,M)}catch(R){if(typeof G>"u"||R.name!=="ErrnoError")throw R;return-R.errno}}var Ba=()=>{PA("")},Xo=D=>D%4===0&&(D%100!==0||D%400===0),ra=[0,31,60,91,121,152,182,213,244,274,305,335],yo=[0,31,59,90,120,151,181,212,243,273,304,334],ge=D=>{var M=Xo(D.getFullYear()),R=M?ra:yo,V=R[D.getMonth()]+D.getDate()-1;return V},mi=9007199254740992,cn=-9007199254740992,fn=D=>Dmi?NaN:Number(D);function Ho(D,M){D=fn(D);var R=new Date(D*1e3);F[M>>2]=R.getSeconds(),F[M+4>>2]=R.getMinutes(),F[M+8>>2]=R.getHours(),F[M+12>>2]=R.getDate(),F[M+16>>2]=R.getMonth(),F[M+20>>2]=R.getFullYear()-1900,F[M+24>>2]=R.getDay();var V=ge(R)|0;F[M+28>>2]=V,F[M+36>>2]=-(R.getTimezoneOffset()*60);var _=new Date(R.getFullYear(),0,1),q=new Date(R.getFullYear(),6,1).getTimezoneOffset(),nA=_.getTimezoneOffset(),cA=(q!=nA&&R.getTimezoneOffset()==Math.min(nA,q))|0;F[M+32>>2]=cA}function ya(D,M,R,V,_,q,nA){_=fn(_);try{if(isNaN(_))return 61;var cA=dt.getStreamFromFD(V),MA=G.mmap(cA,D,_,M,R),oe=MA.ptr;return F[q>>2]=MA.allocated,z[nA>>2]=oe,0}catch(se){if(typeof G>"u"||se.name!=="ErrnoError")throw se;return-se.errno}}function _i(D,M,R,V,_,q){q=fn(q);try{var nA=dt.getStreamFromFD(_);R&2&&dt.doMsync(D,nA,M,V,q)}catch(cA){if(typeof G>"u"||cA.name!=="ErrnoError")throw cA;return-cA.errno}}var Eo=(D,M,R)=>ht(D,b,M,R),Za=(D,M,R,V)=>{var _=new Date().getFullYear(),q=new Date(_,0,1),nA=new Date(_,6,1),cA=q.getTimezoneOffset(),MA=nA.getTimezoneOffset(),oe=Math.max(cA,MA);z[D>>2]=oe*60,F[M>>2]=+(cA!=MA);var se=Re=>{var Le=Re>=0?"-":"+",ai=Math.abs(Re),Yn=String(Math.floor(ai/60)).padStart(2,"0"),eA=String(ai%60).padStart(2,"0");return`UTC${Le}${Yn}${eA}`},Ee=se(cA),Pe=se(MA);MADate.now(),Ta=()=>2147483648,Jn=D=>{var M=v.buffer,R=(D-M.byteLength+65535)/65536|0;try{return v.grow(R),W(),1}catch(V){}},Ui=D=>{var M=b.length;D>>>=0;var R=Ta();if(D>R)return!1;for(var V=1;V<=4;V*=2){var _=M*(1+.2/V);_=Math.min(_,D+100663296);var q=Math.min(R,gn(Math.max(D,_),65536)),nA=Jn(q);if(nA)return!0}return!1},qt={},Nn=()=>s,ho=()=>{if(!ho.strings){var D=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",M={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:D,_:Nn()};for(var R in qt)qt[R]===void 0?delete M[R]:M[R]=qt[R];var V=[];for(var R in M)V.push(`${R}=${M[R]}`);ho.strings=V}return ho.strings},Fo=(D,M)=>{for(var R=0;R{var R=0;return ho().forEach((V,_)=>{var q=M+R;z[D+_*4>>2]=q,Fo(V,q),R+=V.length+1}),0},Ae=(D,M)=>{var R=ho();z[D>>2]=R.length;var V=0;return R.forEach(_=>V+=_.length+1),z[M>>2]=V,0},De=D=>{l(D,new Gt(D))},mA=(D,M)=>{De(D)},FA=mA;function le(D){try{var M=dt.getStreamFromFD(D);return G.close(M),0}catch(R){if(typeof G>"u"||R.name!=="ErrnoError")throw R;return R.errno}}var Ne=(D,M,R,V)=>{for(var _=0,q=0;q>2],cA=z[M+4>>2];M+=8;var MA=G.read(D,S,nA,cA,V);if(MA<0)return-1;if(_+=MA,MA>2]=q,0}catch(nA){if(typeof G>"u"||nA.name!=="ErrnoError")throw nA;return nA.errno}}function rt(D,M,R,V){M=fn(M);try{if(isNaN(M))return 61;var _=dt.getStreamFromFD(D);return G.llseek(_,M,R),Z[V>>3]=BigInt(_.position),_.getdents&&M===0&&R===0&&(_.getdents=null),0}catch(q){if(typeof G>"u"||q.name!=="ErrnoError")throw q;return q.errno}}var xt=(D,M,R,V)=>{for(var _=0,q=0;q>2],cA=z[M+4>>2];M+=8;var MA=G.write(D,S,nA,cA,V);if(MA<0)return-1;if(_+=MA,MA>2]=q,0}catch(nA){if(typeof G>"u"||nA.name!=="ErrnoError")throw nA;return nA.errno}}var Ti=D=>{var M=i["_"+D];return M},zi=(D,M)=>{S.set(D,M)},Xt=D=>Wn(D),Ji=D=>{var M=OA(D)+1,R=Xt(M);return Eo(D,R,M),R},va=(D,M,R,V,_)=>{var q={string:Le=>{var ai=0;return Le!=null&&Le!==0&&(ai=Ji(Le)),ai},array:Le=>{var ai=Xt(Le.length);return zi(Le,ai),ai}};function nA(Le){return M==="string"?xe(Le):M==="boolean"?!!Le:Le}var cA=Ti(D),MA=[],oe=0;if(V)for(var se=0;se(i._viz_set_y_invert=st.A)(D),i._viz_set_reduce=D=>(i._viz_set_reduce=st.B)(D),i._viz_get_graphviz_version=()=>(i._viz_get_graphviz_version=st.C)(),i._free=D=>(i._free=st.D)(D),i._malloc=D=>(i._malloc=st.E)(D),i._viz_get_plugin_list=D=>(i._viz_get_plugin_list=st.G)(D),i._viz_create_graph=(D,M,R)=>(i._viz_create_graph=st.H)(D,M,R),i._viz_read_one_graph=D=>(i._viz_read_one_graph=st.I)(D),i._viz_string_dup=(D,M)=>(i._viz_string_dup=st.J)(D,M),i._viz_string_dup_html=(D,M)=>(i._viz_string_dup_html=st.K)(D,M),i._viz_string_free=(D,M)=>(i._viz_string_free=st.L)(D,M),i._viz_string_free_html=(D,M)=>(i._viz_string_free_html=st.M)(D,M),i._viz_add_node=(D,M)=>(i._viz_add_node=st.N)(D,M),i._viz_add_edge=(D,M,R)=>(i._viz_add_edge=st.O)(D,M,R),i._viz_add_subgraph=(D,M)=>(i._viz_add_subgraph=st.P)(D,M),i._viz_set_default_graph_attribute=(D,M,R)=>(i._viz_set_default_graph_attribute=st.Q)(D,M,R),i._viz_set_default_node_attribute=(D,M,R)=>(i._viz_set_default_node_attribute=st.R)(D,M,R),i._viz_set_default_edge_attribute=(D,M,R)=>(i._viz_set_default_edge_attribute=st.S)(D,M,R),i._viz_set_attribute=(D,M,R)=>(i._viz_set_attribute=st.T)(D,M,R),i._viz_free_graph=D=>(i._viz_free_graph=st.U)(D),i._viz_create_context=()=>(i._viz_create_context=st.V)(),i._viz_free_context=D=>(i._viz_free_context=st.W)(D),i._viz_layout=(D,M,R)=>(i._viz_layout=st.X)(D,M,R),i._viz_free_layout=(D,M)=>(i._viz_free_layout=st.Y)(D,M),i._viz_reset_errors=()=>(i._viz_reset_errors=st.Z)(),i._viz_render=(D,M,R)=>(i._viz_render=st._)(D,M,R);var Oi=(D,M)=>(Oi=st.$)(D,M),Xi=D=>(Xi=st.aa)(D),Wn=D=>(Wn=st.ba)(D),pn=()=>(pn=st.ca)();i.ccall=va,i.getValue=he,i.PATH=sA,i.UTF8ToString=xe,i.stringToUTF8=Eo,i.lengthBytesUTF8=OA,i.FS=G;var _t,sa;UA=function D(){_t||zo(),_t||(UA=D)};function zo(){if(uA>0||!sa&&(sa=1,AA(),uA>0))return;function D(){_t||(_t=1,i.calledRun=1,!k&&(IA(),n(i),aA()))}D()}return zo(),A=a,A}})(),DiA=[[/^Error: (.*)/,"error"],[/^Warning: (.*)/,"warning"]];function sKA(t){return t.map(e=>{for(let A=0;A{if(typeof A.name!="string")throw new Error("image name must be a string");if(typeof A.width!="number"&&typeof A.width!="string")throw new Error("image width must be a number or string");if(typeof A.height!="number"&&typeof A.height!="string")throw new Error("image height must be a number or string");let i=t.PATH.join("/",A.name),n=` + +`;return t.FS.createPath("/",t.PATH.dirname(i)),t.FS.writeFile(i,n),i}):[]}function CKA(t,e){for(let A of e)t.FS.analyzePath(A).exists&&t.FS.unlink(A)}function IKA(t,e,A){let i;try{let n=t.lengthBytesUTF8(e);return i=t.ccall("malloc","number",["number"],[n+1]),t.stringToUTF8(e,i,n+1),t.ccall("viz_read_one_graph","number",["number"],[i])}finally{i&&t.ccall("free","number",["number"],[i])}}function dKA(t,e,A){let i=t.ccall("viz_create_graph","number",["string","number","number"],[e.name,typeof e.directed<"u"?e.directed:!0,typeof e.strict<"u"?e.strict:!1]);return MiA(t,i,e),i}function MiA(t,e,A){SiA(t,e,A),A.nodes&&A.nodes.forEach(i=>{if(typeof i.name>"u")throw new Error("nodes must have a name");let n=t.ccall("viz_add_node","number",["number","string"],[e,String(i.name)]);i.attributes&&biA(t,e,n,i.attributes)}),A.edges&&A.edges.forEach(i=>{if(typeof i.tail>"u")throw new Error("edges must have a tail");if(typeof i.head>"u")throw new Error("edges must have a head");let n=t.ccall("viz_add_edge","number",["number","string","string"],[e,String(i.tail),String(i.head)]);i.attributes&&biA(t,e,n,i.attributes)}),A.subgraphs&&A.subgraphs.forEach(i=>{let n=t.ccall("viz_add_subgraph","number",["number","string"],[e,typeof i.name<"u"?String(i.name):0]);MiA(t,n,i)})}function SiA(t,e,A){if(A.graphAttributes)for(let[i,n]of Object.entries(A.graphAttributes))xv(t,e,n,o=>{t.ccall("viz_set_default_graph_attribute","number",["number","string","number"],[e,i,o])});if(A.nodeAttributes)for(let[i,n]of Object.entries(A.nodeAttributes))xv(t,e,n,o=>{t.ccall("viz_set_default_node_attribute","number",["number","string","number"],[e,i,o])});if(A.edgeAttributes)for(let[i,n]of Object.entries(A.edgeAttributes))xv(t,e,n,o=>{t.ccall("viz_set_default_edge_attribute","number",["number","string","number"],[e,i,o])})}function biA(t,e,A,i){for(let[n,o]of Object.entries(i))xv(t,e,o,a=>{t.ccall("viz_set_attribute","number",["number","string","number"],[A,n,a])})}function xv(t,e,A,i){let n;if(typeof A=="object"&&"html"in A?n=t.ccall("viz_string_dup_html","number",["number","string"],[e,String(A.html)]):n=t.ccall("viz_string_dup","number",["number","string"],[e,String(A)]),n==0)throw new Error("couldn't dup string");i(n),typeof A=="object"&&"html"in A?t.ccall("viz_string_free_html","number",["number","number"],[e,n]):t.ccall("viz_string_free","number",["number","number"],[e,n])}var mF=class{constructor(e){this.module=e}get graphvizVersion(){return gKA(this.module)}get formats(){return yiA(this.module,"device")}get engines(){return yiA(this.module,"layout")}renderFormats(e,A,i={}){return viA(this.module,e,A,gA({engine:"dot"},i))}render(e,A={}){let i;A.format===void 0?i="dot":i=A.format;let n=viA(this.module,e,[i],gA({engine:"dot"},A));return n.status==="success"&&(n.output=n.output[i]),n}renderString(e,A={}){let i=this.render(e,A);if(i.status!=="success")throw new Error(i.errors.find(n=>n.level=="error")?.message||"render failed");return i.output}renderSVGElement(e,A={}){let i=this.renderString(e,Ye(gA({},A),{format:"svg"})),n;return typeof A.trustedTypePolicy<"u"?n=A.trustedTypePolicy.createHTML(i):n=i,new DOMParser().parseFromString(n,"image/svg+xml").documentElement}renderJSON(e,A={}){let i=this.renderString(e,Ye(gA({},A),{format:"json"}));return JSON.parse(i)}};function kiA(){return rKA().then(t=>new mF(t))}var _v=class t{render(e){return lt(this,null,function*(){let A={format:"svg",engine:"dot"};return(yield kiA()).renderString(e,A)})}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Rv=new kA("VideoService");var Nv=class t{createMessagePartFromFile(e){return lt(this,null,function*(){return{inlineData:{displayName:e.name,data:yield this.readFileAsBytes(e),mimeType:e.type}}})}readFileAsBytes(e){return new Promise((A,i)=>{let n=new FileReader;n.onload=o=>{let a=o.target.result.split(",")[1];A(a)},n.onerror=i,n.readAsDataURL(e)})}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Fv=class t extends r6{sanitizer=w(e2);windowOpen(e,A,i,n){return e.open(A,i,n)}createObjectUrl(e){return URL.createObjectURL(e)}openBlobUrl(e){let A=this.createObjectUrl(e);return this.windowOpen(window,A,"_blank")}setAnchorHref(e,A){e.href=A}bypassSecurityTrustHtml(e){return this.sanitizer.bypassSecurityTrustHtml(e)}bypassSecurityTrustUrl(e){return this.sanitizer.bypassSecurityTrustUrl(e)}static \u0275fac=(()=>{let e;return function(i){return(e||(e=bi(t)))(i||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Lv=class t{constructor(e){this.http=e}apiServerDomain=Dr.getApiServerBaseUrl();createSession(e,A,i){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`,o={};return i?o.state=i:o.state={},this.http.post(n,i?o:null)}return new vi}updateSession(e,A,i,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}`;return this.http.patch(o,n)}listSessions(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.get(i).pipe(we(n=>({items:n,nextPageToken:""})))}return ne({items:[],nextPageToken:""})}deleteSession(e,A,i){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}`;return this.http.delete(n)}getSession(e,A,i){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}`;return this.http.get(n)}importSession(e,A,i,n){if(this.apiServerDomain!=null){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`,a={events:i};return n&&(a.state=n),this.http.post(o,a)}return new vi}canEdit(e,A){return ne(!0)}static \u0275fac=function(A){return new(A||t)(Lo(fr))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Gv=class t{audioRecordingService=w(YB);videoService=w(Rv);webSocketService=w(zB);audioIntervalId=void 0;videoIntervalId=void 0;constructor(){}getWsUrl(e,A,i,n){let a=`${window.location.protocol==="https:"?"wss":"ws"}://${Dr.getWSServerUrl()}/run_live?app_name=${e}&user_id=${A}&session_id=${i}`;return n&&(n.proactiveAudio&&(a+="&proactive_audio=true"),n.enableAffectiveDialog&&(a+="&enable_affective_dialog=true"),n.enableSessionResumption&&(a+="&enable_session_resumption=true"),n.saveLiveBlob&&(a+="&save_live_blob=true")),a}startAudioChat(o){return lt(this,arguments,function*({appName:e,userId:A,sessionId:i,flags:n}){this.webSocketService.connect(this.getWsUrl(e,A,i,n)),yield this.startAudioStreaming()})}stopAudioChat(){this.stopAudioStreaming(),this.webSocketService.closeConnection()}startAudioStreaming(){return lt(this,null,function*(){try{yield this.audioRecordingService.startRecording(),this.audioIntervalId=window.setInterval(()=>this.sendBufferedAudio(),250)}catch(e){console.error("Error accessing microphone:",e)}})}stopAudioStreaming(){clearInterval(this.audioIntervalId),this.audioIntervalId=void 0,this.audioRecordingService.stopRecording()}sendBufferedAudio(){let e=this.audioRecordingService.getCombinedAudioBuffer();if(!e)return;let A={blob:{mime_type:"audio/pcm",data:e}};this.webSocketService.sendMessage(A),this.audioRecordingService.cleanAudioBuffer()}startVideoChat(a){return lt(this,arguments,function*({appName:e,userId:A,sessionId:i,videoContainer:n,flags:o}){this.webSocketService.connect(this.getWsUrl(e,A,i,o)),yield this.startAudioStreaming(),yield this.startVideoStreaming(n)})}stopVideoChat(e){this.stopAudioStreaming(),this.stopVideoStreaming(e),this.webSocketService.closeConnection()}startVideoStreaming(e){return lt(this,null,function*(){try{yield this.videoService.startRecording(e),this.videoIntervalId=window.setInterval(()=>lt(this,null,function*(){return yield this.sendCapturedFrame()}),1e3)}catch(A){console.error("Error accessing camera:",A)}})}sendCapturedFrame(){return lt(this,null,function*(){let e=yield this.videoService.getCapturedFrame();if(!e)return;let A={blob:{mime_type:"image/jpeg",data:e}};this.webSocketService.sendMessage(A)})}stopVideoStreaming(e){clearInterval(this.videoIntervalId),this.videoIntervalId=void 0,this.videoService.stopRecording(e)}onStreamClose(){return this.webSocketService.onCloseReason()}closeStream(){this.webSocketService.closeConnection()}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Kv=class t{stc(e,A){let i=this.hashCode(e),n=Math.abs(i%360),o=60+Math.abs((i>>8)%40),a;return A==="dark"?a=15+Math.abs((i>>16)%30):a=40+Math.abs((i>>16)%30),this.hslToHex(n,o,a)}hashCode(e){let A=0;for(let i=0,n=e.length;i{let r=(a+e/30)%12,s=i-n*Math.max(Math.min(r-3,9-r,1),-1);return Math.round(255*s).toString(16).padStart(2,"0")};return`#${o(0)}${o(8)}${o(4)}ff`}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Uv=class t{THEME_STORAGE_KEY="adk-theme-preference";currentTheme=bA(this.getInitialTheme());constructor(){Ao(()=>{this.applyTheme(this.currentTheme())})}getInitialTheme(){let e=window.localStorage.getItem(this.THEME_STORAGE_KEY);return e==="light"||e==="dark"?e:"dark"}applyTheme(e){let A=document.documentElement;A.classList.remove("light-theme","dark-theme"),A.classList.add(`${e}-theme`),A.style.colorScheme=e,window.localStorage.setItem(this.THEME_STORAGE_KEY,e),this.updatePrismTheme(e)}updatePrismTheme(e){let A="prism-theme-style",i=document.getElementById(A);i||(i=document.createElement("link"),i.id=A,i.rel="stylesheet",document.head.appendChild(i)),i.href=e==="light"?"prism-light.css":"prism-dark.css"}toggleTheme(){this.currentTheme.update(e=>e==="light"?"dark":"light")}setTheme(e){this.currentTheme.set(e)}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Tv=class t{selectedTraceRowSource=new ei(void 0);selectedTraceRow$=this.selectedTraceRowSource.asObservable();eventDataSource=new ei(void 0);eventData$=this.eventDataSource.asObservable();messagesSource=new ei([]);messages$=this.messagesSource.asObservable();selectedRow(e){this.selectedTraceRowSource.next(e)}setEventData(e){this.eventDataSource.next(e)}setMessages(e){this.messagesSource.next(e)}resetTraceService(){this.selectedTraceRowSource.next(void 0),this.eventDataSource.next(void 0),this.messagesSource.next([])}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Jv=class t{_isSessionLoading=new ei(!1);_isSessionListLoading=new ei(!1);_isEventRequestResponseLoading=new ei(!1);_isMessagesLoading=new ei(!1);_newMessagesLoadedResponse=new ie;_newMessagesLoadingFailedResponse=new ie;featureFlagService=w(yr);isSessionLoading(){return this._isSessionLoading.pipe(RQ(this.featureFlagService.isLoadingAnimationsEnabled()),we(([e,A])=>e&&A),Gs({bufferSize:1,refCount:!0}))}setIsSessionLoading(e){this._isSessionLoading.next(e)}isSessionListLoading(){return this._isSessionListLoading.pipe(RQ(this.featureFlagService.isLoadingAnimationsEnabled()),we(([e,A])=>e&&A),Gs({bufferSize:1,refCount:!0}))}setIsSessionListLoading(e){this._isSessionListLoading.next(e)}isEventRequestResponseLoading(){return this._isEventRequestResponseLoading.pipe(RQ(this.featureFlagService.isLoadingAnimationsEnabled()),we(([e,A])=>e&&A),Gs({bufferSize:1,refCount:!0}))}setIsEventRequestResponseLoading(e){this._isEventRequestResponseLoading.next(e)}setIsMessagesLoading(e){this._isMessagesLoading.next(e)}isMessagesLoading(){return this._isMessagesLoading.pipe(RQ(this.featureFlagService.isLoadingAnimationsEnabled()),we(([e,A])=>e&&A),Gs({bufferSize:1,refCount:!0}))}lazyLoadMessages(e,A,i){throw new Error("Not implemented")}onNewMessagesLoaded(){return this._newMessagesLoadedResponse}onNewMessagesLoadingFailed(){return this._newMessagesLoadingFailedResponse}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Ov=class t{mediaRecorder;stream;renderer;videoElement;videoBuffer=[];constructor(e){this.renderer=e.createRenderer(null,null)}createVideoElement(e){e?.nativeElement&&(this.clearVideoElement(e),this.videoElement=this.renderer.createElement("video"),this.renderer.setAttribute(this.videoElement,"width","400"),this.renderer.setAttribute(this.videoElement,"height","300"),this.renderer.setAttribute(this.videoElement,"autoplay","true"),this.renderer.setAttribute(this.videoElement,"muted","true"),this.renderer.appendChild(e.nativeElement,this.videoElement))}startRecording(e){return lt(this,null,function*(){this.createVideoElement(e);try{this.stream=yield navigator.mediaDevices.getUserMedia({video:!0}),this.videoElement&&(this.videoElement.srcObject=this.stream),this.mediaRecorder=new MediaRecorder(this.stream,{mimeType:"video/webm"}),this.mediaRecorder.start(1e3)}catch(A){console.error("Error accessing camera/microphone:",A)}})}getCapturedFrame(){return lt(this,null,function*(){try{let e=yield this.captureFrame();return this.blobToUint8Array(e)}catch(e){console.error("Error capturing frame:",e);return}})}blobToUint8Array(e){return lt(this,null,function*(){let A=yield e.arrayBuffer();return new Uint8Array(A)})}captureFrame(){return lt(this,null,function*(){return new Promise((e,A)=>{try{if(!this.videoElement){A(new Error("Video element not available"));return}let i=document.createElement("canvas");i.width=this.videoElement.videoWidth,i.height=this.videoElement.videoHeight;let n=i.getContext("2d");if(!n){A(new Error("Canvas context not supported"));return}n.drawImage(this.videoElement,0,0,i.width,i.height),i.toBlob(o=>{o?e(o):A(new Error("Failed to create image blob"))},"image/png")}catch(i){A(i)}})})}stopRecording(e){this.mediaRecorder&&this.mediaRecorder.stop(),this.stream&&this.stream.getTracks().forEach(A=>A.stop()),this.clearVideoElement(e)}clearVideoElement(e){let A=e.nativeElement.querySelector("video");A&&this.renderer.removeChild(e.nativeElement,A)}static \u0275fac=function(A){return new(A||t)(Lo(Kr))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var BKA={url:"",deserializer:t=>JSON.parse(t.data),serializer:t=>JSON.stringify(t)},EKA="WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }",F3=class t extends kF{constructor(e,A){if(super(),this._socket=null,e instanceof vi)this.destination=A,this.source=e;else{let i=this._config=Object.assign({},BKA);if(this._output=new ie,typeof e=="string")i.url=e;else for(let n in e)e.hasOwnProperty(n)&&(i[n]=e[n]);if(!i.WebSocketCtor&&WebSocket)i.WebSocketCtor=WebSocket;else if(!i.WebSocketCtor)throw new Error("no WebSocket constructor can be found");this.destination=new Sg}}lift(e){let A=new t(this._config,this.destination);return A.operator=e,A.source=this,A}_resetState(){this._socket=null,this.source||(this.destination=new Sg),this._output=new ie}multiplex(e,A,i){let n=this;return new vi(o=>{try{n.next(e())}catch(r){o.error(r)}let a=n.subscribe({next:r=>{try{i(r)&&o.next(r)}catch(s){o.error(s)}},error:r=>o.error(r),complete:()=>o.complete()});return()=>{try{n.next(A())}catch(r){o.error(r)}a.unsubscribe()}})}_connectSocket(){let{WebSocketCtor:e,protocol:A,url:i,binaryType:n}=this._config,o=this._output,a=null;try{a=A?new e(i,A):new e(i),this._socket=a,n&&(this._socket.binaryType=n)}catch(s){o.error(s);return}let r=new bo(()=>{this._socket=null,a&&a.readyState===1&&a.close()});a.onopen=s=>{let{_socket:l}=this;if(!l){a.close(),this._resetState();return}let{openObserver:g}=this._config;g&&g.next(s);let C=this.destination;this.destination=bF.create(I=>{if(a.readyState===1)try{let{serializer:d}=this._config;a.send(d(I))}catch(d){this.destination.error(d)}},I=>{let{closingObserver:d}=this._config;d&&d.next(void 0),I&&I.code?a.close(I.code,I.reason):o.error(new TypeError(EKA)),this._resetState()},()=>{let{closingObserver:I}=this._config;I&&I.next(void 0),a.close(),this._resetState()}),C&&C instanceof Sg&&r.add(C.subscribe(this.destination))},a.onerror=s=>{this._resetState(),o.error(s)},a.onclose=s=>{a===this._socket&&this._resetState();let{closeObserver:l}=this._config;l&&l.next(s),s.wasClean?o.complete():o.error(s)},a.onmessage=s=>{try{let{deserializer:l}=this._config;o.next(l(s))}catch(l){o.error(l)}}}_subscribe(e){let{source:A}=this;return A?A.subscribe(e):(this._socket||this._connectSocket(),this._output.subscribe(e),e.add(()=>{let{_socket:i}=this;this._output.observers.length===0&&(i&&(i.readyState===1||i.readyState===0)&&i.close(),this._resetState())}),e)}unsubscribe(){let{_socket:e}=this;e&&(e.readyState===1||e.readyState===0)&&e.close(),this._resetState(),super.unsubscribe()}};var Yv=class t{audioPlayingService=w(HB);socket$;messages$=new ei("");audioBuffer=[];audioIntervalId=null;closeReasonSubject=new ie;connect(e){this.socket$=new F3({url:e,serializer:A=>JSON.stringify(A),deserializer:A=>A.data,closeObserver:{next:A=>{this.emitWsCloseReason(A.reason)}}}),this.socket$.subscribe(A=>{this.handleIncomingEvent(A)},A=>{console.error("WebSocket error:",A)}),this.audioIntervalId=setInterval(()=>this.playIncomingAudio(),250)}playIncomingAudio(){this.audioPlayingService.playAudio(this.audioBuffer),this.audioBuffer=[]}sendMessage(e){if(e.blob.data=this.arrayBufferToBase64(e.blob.data.buffer),!this.socket$||this.socket$.closed){console.error("WebSocket is not open.");return}this.socket$.next(e)}closeConnection(){clearInterval(this.audioIntervalId),this.audioIntervalId=null,this.socket$&&this.socket$.complete()}getMessages(){return this.messages$.asObservable()}arrayBufferToBase64(e){let A="",i=new Uint8Array(e),n=i.byteLength;for(let o=0;ot.json()).then(t=>{window.runtimeConfig=t,rL(wQ,{providers:[GF(sL,ln,lL,hv,Ps,Ya,qi),{provide:Al,useClass:Lv},{provide:$s,useClass:eQ},{provide:Gy,useClass:kv},{provide:zB,useClass:Yv},{provide:l6,useValue:"./assets/audio-processor.js"},{provide:YB,useClass:wv},{provide:HB,useClass:mv},{provide:Rv,useClass:Ov},{provide:s6,useClass:Gv},{provide:o6,useClass:Mv},{provide:t0,useClass:yv},{provide:TB,useClass:pv},{provide:JB,useClass:Dv},{provide:Ag,useClass:Tv},{provide:yr,useClass:Sv},{provide:OB,useClass:_v},{provide:Q2,useClass:Kv},{provide:Cs,useClass:Fv},{provide:a6,useClass:Nv},{provide:cL,useValue:dL},{provide:IL,useValue:hiA},{provide:_I,useValue:BQ},...t.logo?[{provide:PB,useValue:uv}]:[],{provide:e0,useClass:fv},{provide:rv,useValue:xc},JK(),Bu(),{provide:g6,useClass:Uc},{provide:tg,useClass:Jv},{provide:eg,useClass:Uv}]}).catch(e=>console.error(e))}); diff --git a/src/google/adk/cli/browser/prism-dark.css b/src/google/adk/cli/browser/prism-dark.css new file mode 100644 index 0000000000..df29f887f3 --- /dev/null +++ b/src/google/adk/cli/browser/prism-dark.css @@ -0,0 +1 @@ +code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.block-comment,.token.prolog,.token.doctype,.token.cdata{color:#999}.token.punctuation{color:#ccc}.token.tag,.token.attr-name,.token.namespace,.token.deleted{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.number,.token.function{color:#f08d49}.token.property,.token.class-name,.token.constant,.token.symbol{color:#f8c555}.token.selector,.token.important,.token.atrule,.token.keyword,.token.builtin{color:#cc99cd}.token.string,.token.char,.token.attr-value,.token.regex,.token.variable{color:#7ec699}.token.operator,.token.entity,.token.url{color:#67cdcc}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green} diff --git a/src/google/adk/cli/browser/prism-light.css b/src/google/adk/cli/browser/prism-light.css new file mode 100644 index 0000000000..8252e476e4 --- /dev/null +++ b/src/google/adk/cli/browser/prism-light.css @@ -0,0 +1 @@ +code[class*=language-],pre[class*=language-]{color:#000;background:none;text-shadow:0 1px white;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,code[class*=language-] ::-moz-selection{text-shadow:none;background:#b3d4fc}pre[class*=language-]::selection,pre[class*=language-] ::selection,code[class*=language-]::selection,code[class*=language-] ::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:#905}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#690}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{color:#9a6e3a;background:#ffffff80}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function,.token.class-name{color:#dd4a68}.token.regex,.token.important,.token.variable{color:#e90}.token.important,.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} diff --git a/src/google/adk/cli/browser/styles-2ORK6PRA.css b/src/google/adk/cli/browser/styles-2ORK6PRA.css new file mode 100644 index 0000000000..09d3d4823f --- /dev/null +++ b/src/google/adk/cli/browser/styles-2ORK6PRA.css @@ -0,0 +1 @@ +html{--mat-sys-background: #151316;--mat-sys-error: #ffb4ab;--mat-sys-error-container: #93000a;--mat-sys-inverse-on-surface: #323033;--mat-sys-inverse-primary: #7d00fa;--mat-sys-inverse-surface: #e6e1e6;--mat-sys-on-background: #e6e1e6;--mat-sys-on-error: #690005;--mat-sys-on-error-container: #ffdad6;--mat-sys-on-primary: #42008a;--mat-sys-on-primary-container: #ecdcff;--mat-sys-on-primary-fixed: #270057;--mat-sys-on-primary-fixed-variant: #5f00c0;--mat-sys-on-secondary: #352d40;--mat-sys-on-secondary-container: #eadef7;--mat-sys-on-secondary-fixed: #1f182a;--mat-sys-on-secondary-fixed-variant: #4b4357;--mat-sys-on-surface: #e6e1e6;--mat-sys-on-surface-variant: #e8e0eb;--mat-sys-on-tertiary: #42008a;--mat-sys-on-tertiary-container: #ecdcff;--mat-sys-on-tertiary-fixed: #270057;--mat-sys-on-tertiary-fixed-variant: #5f00c0;--mat-sys-outline: #958e99;--mat-sys-outline-variant: #49454e;--mat-sys-primary: #d5baff;--mat-sys-primary-container: #5f00c0;--mat-sys-primary-fixed: #ecdcff;--mat-sys-primary-fixed-dim: #d5baff;--mat-sys-scrim: #000000;--mat-sys-secondary: #cec2db;--mat-sys-secondary-container: #4b4357;--mat-sys-secondary-fixed: #eadef7;--mat-sys-secondary-fixed-dim: #cec2db;--mat-sys-shadow: #000000;--mat-sys-surface: #151316;--mat-sys-surface-bright: #3b383c;--mat-sys-surface-container: #211f22;--mat-sys-surface-container-high: #2b292d;--mat-sys-surface-container-highest: #363437;--mat-sys-surface-container-low: #1d1b1e;--mat-sys-surface-container-lowest: #0f0d11;--mat-sys-surface-dim: #151316;--mat-sys-surface-tint: #d5baff;--mat-sys-surface-variant: #49454e;--mat-sys-tertiary: #d5baff;--mat-sys-tertiary-container: #5f00c0;--mat-sys-tertiary-fixed: #ecdcff;--mat-sys-tertiary-fixed-dim: #d5baff;--mat-sys-neutral-variant20: #332f37;--mat-sys-neutral10: #1d1b1e;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 400 1rem / 1.5rem Google Sans;--mat-sys-body-large-font: Google Sans;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 400;--mat-sys-body-medium: 400 .875rem / 1.25rem Google Sans;--mat-sys-body-medium-font: Google Sans;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 400;--mat-sys-body-small: 400 .75rem / 1rem Google Sans;--mat-sys-body-small-font: Google Sans;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 400;--mat-sys-display-large: 400 3.562rem / 4rem Google Sans;--mat-sys-display-large-font: Google Sans;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 400;--mat-sys-display-medium: 400 2.812rem / 3.25rem Google Sans;--mat-sys-display-medium-font: Google Sans;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 400;--mat-sys-display-small: 400 2.25rem / 2.75rem Google Sans;--mat-sys-display-small-font: Google Sans;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 400;--mat-sys-headline-large: 400 2rem / 2.5rem Google Sans;--mat-sys-headline-large-font: Google Sans;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 400;--mat-sys-headline-medium: 400 1.75rem / 2.25rem Google Sans;--mat-sys-headline-medium-font: Google Sans;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 400;--mat-sys-headline-small: 400 1.5rem / 2rem Google Sans;--mat-sys-headline-small-font: Google Sans;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 400;--mat-sys-label-large: 500 .875rem / 1.25rem Google Sans;--mat-sys-label-large-font: Google Sans;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 500;--mat-sys-label-large-weight-prominent: 700;--mat-sys-label-medium: 500 .75rem / 1rem Google Sans;--mat-sys-label-medium-font: Google Sans;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 500;--mat-sys-label-medium-weight-prominent: 700;--mat-sys-label-small: 500 .688rem / 1rem Google Sans;--mat-sys-label-small-font: Google Sans;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 500;--mat-sys-title-large: 400 1.375rem / 1.75rem Google Sans;--mat-sys-title-large-font: Google Sans;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 400;--mat-sys-title-medium: 500 1rem / 1.5rem Google Sans;--mat-sys-title-medium-font: Google Sans;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 500;--mat-sys-title-small: 500 .875rem / 1.25rem Google Sans;--mat-sys-title-small-font: Google Sans;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 500;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;color-scheme:dark;--mat-sys-primary: #7cc4ff;--mat-sys-on-primary: #003366;--mat-sys-primary-container: #004b8d;--mat-sys-on-primary-container: #d1e4ff;--mat-sys-secondary: #b5c9e2;--mat-sys-on-secondary: #203246;--mat-sys-secondary-container: #3a485a;--mat-sys-on-secondary-container: #d7e3f7}html.light-theme{--mat-sys-background: #fef8fc;--mat-sys-error: #ba1a1a;--mat-sys-error-container: #ffdad6;--mat-sys-inverse-on-surface: #f5eff4;--mat-sys-inverse-primary: #d5baff;--mat-sys-inverse-surface: #323033;--mat-sys-on-background: #1d1b1e;--mat-sys-on-error: #ffffff;--mat-sys-on-error-container: #93000a;--mat-sys-on-primary-container: #5f00c0;--mat-sys-on-primary-fixed: #270057;--mat-sys-on-primary-fixed-variant: #5f00c0;--mat-sys-on-secondary-container: #4b4357;--mat-sys-on-secondary-fixed: #1f182a;--mat-sys-on-secondary-fixed-variant: #4b4357;--mat-sys-on-surface: #1d1b1e;--mat-sys-on-surface-variant: #49454e;--mat-sys-on-tertiary: #ffffff;--mat-sys-on-tertiary-container: #5f00c0;--mat-sys-on-tertiary-fixed: #270057;--mat-sys-on-tertiary-fixed-variant: #5f00c0;--mat-sys-outline: #7b757f;--mat-sys-outline-variant: #cbc4cf;--mat-sys-primary: #7d00fa;--mat-sys-primary-container: #ecdcff;--mat-sys-primary-fixed: #ecdcff;--mat-sys-primary-fixed-dim: #d5baff;--mat-sys-scrim: #000000;--mat-sys-secondary: #645b70;--mat-sys-secondary-container: #eadef7;--mat-sys-secondary-fixed: #eadef7;--mat-sys-secondary-fixed-dim: #cec2db;--mat-sys-shadow: #000000;--mat-sys-surface: #fef8fc;--mat-sys-surface-bright: #fef8fc;--mat-sys-surface-container: #f2ecf1;--mat-sys-surface-container-high: #ede6eb;--mat-sys-surface-container-highest: #e6e1e6;--mat-sys-surface-container-low: #f8f2f6;--mat-sys-surface-container-lowest: #ffffff;--mat-sys-surface-dim: #ded8dd;--mat-sys-surface-tint: #7d00fa;--mat-sys-surface-variant: #e8e0eb;--mat-sys-tertiary: #7d00fa;--mat-sys-tertiary-container: #ecdcff;--mat-sys-tertiary-fixed: #ecdcff;--mat-sys-tertiary-fixed-dim: #d5baff;--mat-sys-neutral-variant20: #332f37;--mat-sys-neutral10: #1d1b1e;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 400 1rem / 1.5rem Google Sans;--mat-sys-body-large-font: Google Sans;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 400;--mat-sys-body-medium: 400 .875rem / 1.25rem Google Sans;--mat-sys-body-medium-font: Google Sans;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 400;--mat-sys-body-small: 400 .75rem / 1rem Google Sans;--mat-sys-body-small-font: Google Sans;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 400;--mat-sys-display-large: 400 3.562rem / 4rem Google Sans;--mat-sys-display-large-font: Google Sans;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 400;--mat-sys-display-medium: 400 2.812rem / 3.25rem Google Sans;--mat-sys-display-medium-font: Google Sans;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 400;--mat-sys-display-small: 400 2.25rem / 2.75rem Google Sans;--mat-sys-display-small-font: Google Sans;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 400;--mat-sys-headline-large: 400 2rem / 2.5rem Google Sans;--mat-sys-headline-large-font: Google Sans;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 400;--mat-sys-headline-medium: 400 1.75rem / 2.25rem Google Sans;--mat-sys-headline-medium-font: Google Sans;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 400;--mat-sys-headline-small: 400 1.5rem / 2rem Google Sans;--mat-sys-headline-small-font: Google Sans;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 400;--mat-sys-label-large: 500 .875rem / 1.25rem Google Sans;--mat-sys-label-large-font: Google Sans;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 500;--mat-sys-label-large-weight-prominent: 700;--mat-sys-label-medium: 500 .75rem / 1rem Google Sans;--mat-sys-label-medium-font: Google Sans;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 500;--mat-sys-label-medium-weight-prominent: 700;--mat-sys-label-small: 500 .688rem / 1rem Google Sans;--mat-sys-label-small-font: Google Sans;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 500;--mat-sys-title-large: 400 1.375rem / 1.75rem Google Sans;--mat-sys-title-large-font: Google Sans;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 400;--mat-sys-title-medium: 500 1rem / 1.5rem Google Sans;--mat-sys-title-medium-font: Google Sans;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 500;--mat-sys-title-small: 500 .875rem / 1.25rem Google Sans;--mat-sys-title-small-font: Google Sans;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 500;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;color-scheme:light;--mat-sys-primary: #005fb7;--mat-sys-on-primary: #ffffff;--mat-sys-primary-container: #d1e4ff;--mat-sys-on-primary-container: #001c37;--mat-sys-secondary: #535f70;--mat-sys-on-secondary: #ffffff;--mat-sys-secondary-container: #d7e3f7;--mat-sys-on-secondary-container: #101c2b}html.dark-theme{--mat-sys-background: #151316;--mat-sys-error: #ffb4ab;--mat-sys-error-container: #93000a;--mat-sys-inverse-on-surface: #323033;--mat-sys-inverse-primary: #7d00fa;--mat-sys-inverse-surface: #e6e1e6;--mat-sys-on-background: #e6e1e6;--mat-sys-on-error: #690005;--mat-sys-on-error-container: #ffdad6;--mat-sys-on-primary: #42008a;--mat-sys-on-primary-container: #ecdcff;--mat-sys-on-primary-fixed: #270057;--mat-sys-on-primary-fixed-variant: #5f00c0;--mat-sys-on-secondary: #352d40;--mat-sys-on-secondary-container: #eadef7;--mat-sys-on-secondary-fixed: #1f182a;--mat-sys-on-secondary-fixed-variant: #4b4357;--mat-sys-on-surface: #e6e1e6;--mat-sys-on-surface-variant: #e8e0eb;--mat-sys-on-tertiary: #42008a;--mat-sys-on-tertiary-container: #ecdcff;--mat-sys-on-tertiary-fixed: #270057;--mat-sys-on-tertiary-fixed-variant: #5f00c0;--mat-sys-outline: #958e99;--mat-sys-outline-variant: #49454e;--mat-sys-primary: #d5baff;--mat-sys-primary-container: #5f00c0;--mat-sys-primary-fixed: #ecdcff;--mat-sys-primary-fixed-dim: #d5baff;--mat-sys-scrim: #000000;--mat-sys-secondary: #cec2db;--mat-sys-secondary-container: #4b4357;--mat-sys-secondary-fixed: #eadef7;--mat-sys-secondary-fixed-dim: #cec2db;--mat-sys-shadow: #000000;--mat-sys-surface: #151316;--mat-sys-surface-bright: #3b383c;--mat-sys-surface-container: #211f22;--mat-sys-surface-container-high: #2b292d;--mat-sys-surface-container-highest: #363437;--mat-sys-surface-container-low: #1d1b1e;--mat-sys-surface-container-lowest: #0f0d11;--mat-sys-surface-dim: #151316;--mat-sys-surface-tint: #d5baff;--mat-sys-surface-variant: #49454e;--mat-sys-tertiary: #d5baff;--mat-sys-tertiary-container: #5f00c0;--mat-sys-tertiary-fixed: #ecdcff;--mat-sys-tertiary-fixed-dim: #d5baff;--mat-sys-neutral-variant20: #332f37;--mat-sys-neutral10: #1d1b1e;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 400 1rem / 1.5rem Google Sans;--mat-sys-body-large-font: Google Sans;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 400;--mat-sys-body-medium: 400 .875rem / 1.25rem Google Sans;--mat-sys-body-medium-font: Google Sans;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 400;--mat-sys-body-small: 400 .75rem / 1rem Google Sans;--mat-sys-body-small-font: Google Sans;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 400;--mat-sys-display-large: 400 3.562rem / 4rem Google Sans;--mat-sys-display-large-font: Google Sans;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 400;--mat-sys-display-medium: 400 2.812rem / 3.25rem Google Sans;--mat-sys-display-medium-font: Google Sans;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 400;--mat-sys-display-small: 400 2.25rem / 2.75rem Google Sans;--mat-sys-display-small-font: Google Sans;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 400;--mat-sys-headline-large: 400 2rem / 2.5rem Google Sans;--mat-sys-headline-large-font: Google Sans;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 400;--mat-sys-headline-medium: 400 1.75rem / 2.25rem Google Sans;--mat-sys-headline-medium-font: Google Sans;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 400;--mat-sys-headline-small: 400 1.5rem / 2rem Google Sans;--mat-sys-headline-small-font: Google Sans;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 400;--mat-sys-label-large: 500 .875rem / 1.25rem Google Sans;--mat-sys-label-large-font: Google Sans;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 500;--mat-sys-label-large-weight-prominent: 700;--mat-sys-label-medium: 500 .75rem / 1rem Google Sans;--mat-sys-label-medium-font: Google Sans;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 500;--mat-sys-label-medium-weight-prominent: 700;--mat-sys-label-small: 500 .688rem / 1rem Google Sans;--mat-sys-label-small-font: Google Sans;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 500;--mat-sys-title-large: 400 1.375rem / 1.75rem Google Sans;--mat-sys-title-large-font: Google Sans;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 400;--mat-sys-title-medium: 500 1rem / 1.5rem Google Sans;--mat-sys-title-medium-font: Google Sans;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 500;--mat-sys-title-small: 500 .875rem / 1.25rem Google Sans;--mat-sys-title-small-font: Google Sans;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 500;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;color-scheme:dark;--mat-sys-primary: #7cc4ff;--mat-sys-on-primary: #003366;--mat-sys-primary-container: #004b8d;--mat-sys-on-primary-container: #d1e4ff;--mat-sys-secondary: #b5c9e2;--mat-sys-on-secondary: #203246;--mat-sys-secondary-container: #3a485a;--mat-sys-on-secondary-container: #d7e3f7}body{height:100vh;margin:0;font-family:Roboto,Helvetica Neue,sans-serif}markdown p{margin-block-start:.5em;margin-block-end:.5em}markdown pre{border-radius:8px!important}markdown code{border-radius:4px!important}.json-tooltip-panel{color:var(--mat-sys-on-surface)!important;border:1px solid var(--mat-sys-outline-variant)!important;border-radius:8px!important;padding:12px 16px!important;box-shadow:0 4px 12px #00000026!important;max-width:800px!important;overflow:hidden!important;background-color:var(--mat-sys-surface-container-high)!important}ngx-json-viewer .segment-key{color:var(--mat-sys-primary)!important}ngx-json-viewer .segment-value{color:inherit}ngx-json-viewer .segment-type-string{color:var(--mat-sys-tertiary)!important}ngx-json-viewer .segment-type-number{color:var(--mat-sys-error)!important}ngx-json-viewer .segment-type-boolean{color:var(--mat-sys-secondary)!important}ngx-json-viewer .segment-type-null{color:var(--mat-sys-outline)!important}.user-avatar-menu .mat-mdc-menu-content{padding:0}.html-tooltip-panel .content-bubble{max-width:100%!important}.html-tooltip-panel .message-text p{white-space:pre-line;word-break:break-word;overflow-wrap:break-word} diff --git a/src/google/adk/cli/browser/styles-LBC36Z6S.css b/src/google/adk/cli/browser/styles-LBC36Z6S.css deleted file mode 100644 index addebd5671..0000000000 --- a/src/google/adk/cli/browser/styles-LBC36Z6S.css +++ /dev/null @@ -1 +0,0 @@ -html{--mat-sys-background: #151316;--mat-sys-error: #ffb4ab;--mat-sys-error-container: #93000a;--mat-sys-inverse-on-surface: #323033;--mat-sys-inverse-primary: #7d00fa;--mat-sys-inverse-surface: #e6e1e6;--mat-sys-on-background: #e6e1e6;--mat-sys-on-error: #690005;--mat-sys-on-error-container: #ffdad6;--mat-sys-on-primary: #42008a;--mat-sys-on-primary-container: #ecdcff;--mat-sys-on-primary-fixed: #270057;--mat-sys-on-primary-fixed-variant: #5f00c0;--mat-sys-on-secondary: #352d40;--mat-sys-on-secondary-container: #eadef7;--mat-sys-on-secondary-fixed: #1f182a;--mat-sys-on-secondary-fixed-variant: #4b4357;--mat-sys-on-surface: #e6e1e6;--mat-sys-on-surface-variant: #e8e0eb;--mat-sys-on-tertiary: #42008a;--mat-sys-on-tertiary-container: #ecdcff;--mat-sys-on-tertiary-fixed: #270057;--mat-sys-on-tertiary-fixed-variant: #5f00c0;--mat-sys-outline: #958e99;--mat-sys-outline-variant: #49454e;--mat-sys-primary: #d5baff;--mat-sys-primary-container: #5f00c0;--mat-sys-primary-fixed: #ecdcff;--mat-sys-primary-fixed-dim: #d5baff;--mat-sys-scrim: #000000;--mat-sys-secondary: #cec2db;--mat-sys-secondary-container: #4b4357;--mat-sys-secondary-fixed: #eadef7;--mat-sys-secondary-fixed-dim: #cec2db;--mat-sys-shadow: #000000;--mat-sys-surface: #151316;--mat-sys-surface-bright: #3b383c;--mat-sys-surface-container: #211f22;--mat-sys-surface-container-high: #2b292d;--mat-sys-surface-container-highest: #363437;--mat-sys-surface-container-low: #1d1b1e;--mat-sys-surface-container-lowest: #0f0d11;--mat-sys-surface-dim: #151316;--mat-sys-surface-tint: #d5baff;--mat-sys-surface-variant: #49454e;--mat-sys-tertiary: #d5baff;--mat-sys-tertiary-container: #5f00c0;--mat-sys-tertiary-fixed: #ecdcff;--mat-sys-tertiary-fixed-dim: #d5baff;--mat-sys-neutral-variant20: #332f37;--mat-sys-neutral10: #1d1b1e;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 400 1rem / 1.5rem Google Sans;--mat-sys-body-large-font: Google Sans;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 400;--mat-sys-body-medium: 400 .875rem / 1.25rem Google Sans;--mat-sys-body-medium-font: Google Sans;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 400;--mat-sys-body-small: 400 .75rem / 1rem Google Sans;--mat-sys-body-small-font: Google Sans;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 400;--mat-sys-display-large: 400 3.562rem / 4rem Google Sans;--mat-sys-display-large-font: Google Sans;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 400;--mat-sys-display-medium: 400 2.812rem / 3.25rem Google Sans;--mat-sys-display-medium-font: Google Sans;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 400;--mat-sys-display-small: 400 2.25rem / 2.75rem Google Sans;--mat-sys-display-small-font: Google Sans;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 400;--mat-sys-headline-large: 400 2rem / 2.5rem Google Sans;--mat-sys-headline-large-font: Google Sans;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 400;--mat-sys-headline-medium: 400 1.75rem / 2.25rem Google Sans;--mat-sys-headline-medium-font: Google Sans;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 400;--mat-sys-headline-small: 400 1.5rem / 2rem Google Sans;--mat-sys-headline-small-font: Google Sans;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 400;--mat-sys-label-large: 500 .875rem / 1.25rem Google Sans;--mat-sys-label-large-font: Google Sans;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 500;--mat-sys-label-large-weight-prominent: 700;--mat-sys-label-medium: 500 .75rem / 1rem Google Sans;--mat-sys-label-medium-font: Google Sans;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 500;--mat-sys-label-medium-weight-prominent: 700;--mat-sys-label-small: 500 .688rem / 1rem Google Sans;--mat-sys-label-small-font: Google Sans;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 500;--mat-sys-title-large: 400 1.375rem / 1.75rem Google Sans;--mat-sys-title-large-font: Google Sans;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 400;--mat-sys-title-medium: 500 1rem / 1.5rem Google Sans;--mat-sys-title-medium-font: Google Sans;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 500;--mat-sys-title-small: 500 .875rem / 1.25rem Google Sans;--mat-sys-title-small-font: Google Sans;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 500;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;color-scheme:dark;--mat-sys-primary: #7cc4ff;--mat-sys-on-primary: #003366;--mat-sys-primary-container: #004b8d;--mat-sys-on-primary-container: #d1e4ff;--mat-sys-secondary: #b5c9e2;--mat-sys-on-secondary: #203246;--mat-sys-secondary-container: #3a485a;--mat-sys-on-secondary-container: #d7e3f7;--mat-sys-background: #121212;--mat-sys-surface: #121212;--mat-sys-surface-container: #1e1e1e;--mat-sys-surface-container-low: #1a1a1a;--mat-sys-surface-container-high: #2a2a2a;--mat-sys-surface-container-highest: #3a3a3a}html.light-theme{--mat-sys-background: #fef8fc;--mat-sys-error: #ba1a1a;--mat-sys-error-container: #ffdad6;--mat-sys-inverse-on-surface: #f5eff4;--mat-sys-inverse-primary: #d5baff;--mat-sys-inverse-surface: #323033;--mat-sys-on-background: #1d1b1e;--mat-sys-on-error: #ffffff;--mat-sys-on-error-container: #93000a;--mat-sys-on-primary-container: #5f00c0;--mat-sys-on-primary-fixed: #270057;--mat-sys-on-primary-fixed-variant: #5f00c0;--mat-sys-on-secondary-container: #4b4357;--mat-sys-on-secondary-fixed: #1f182a;--mat-sys-on-secondary-fixed-variant: #4b4357;--mat-sys-on-surface: #1d1b1e;--mat-sys-on-surface-variant: #49454e;--mat-sys-on-tertiary: #ffffff;--mat-sys-on-tertiary-container: #5f00c0;--mat-sys-on-tertiary-fixed: #270057;--mat-sys-on-tertiary-fixed-variant: #5f00c0;--mat-sys-outline: #7b757f;--mat-sys-outline-variant: #cbc4cf;--mat-sys-primary: #7d00fa;--mat-sys-primary-container: #ecdcff;--mat-sys-primary-fixed: #ecdcff;--mat-sys-primary-fixed-dim: #d5baff;--mat-sys-scrim: #000000;--mat-sys-secondary: #645b70;--mat-sys-secondary-container: #eadef7;--mat-sys-secondary-fixed: #eadef7;--mat-sys-secondary-fixed-dim: #cec2db;--mat-sys-shadow: #000000;--mat-sys-surface: #fef8fc;--mat-sys-surface-bright: #fef8fc;--mat-sys-surface-container: #f2ecf1;--mat-sys-surface-container-high: #ede6eb;--mat-sys-surface-container-highest: #e6e1e6;--mat-sys-surface-container-low: #f8f2f6;--mat-sys-surface-container-lowest: #ffffff;--mat-sys-surface-dim: #ded8dd;--mat-sys-surface-tint: #7d00fa;--mat-sys-surface-variant: #e8e0eb;--mat-sys-tertiary: #7d00fa;--mat-sys-tertiary-container: #ecdcff;--mat-sys-tertiary-fixed: #ecdcff;--mat-sys-tertiary-fixed-dim: #d5baff;--mat-sys-neutral-variant20: #332f37;--mat-sys-neutral10: #1d1b1e;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 400 1rem / 1.5rem Google Sans;--mat-sys-body-large-font: Google Sans;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 400;--mat-sys-body-medium: 400 .875rem / 1.25rem Google Sans;--mat-sys-body-medium-font: Google Sans;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 400;--mat-sys-body-small: 400 .75rem / 1rem Google Sans;--mat-sys-body-small-font: Google Sans;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 400;--mat-sys-display-large: 400 3.562rem / 4rem Google Sans;--mat-sys-display-large-font: Google Sans;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 400;--mat-sys-display-medium: 400 2.812rem / 3.25rem Google Sans;--mat-sys-display-medium-font: Google Sans;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 400;--mat-sys-display-small: 400 2.25rem / 2.75rem Google Sans;--mat-sys-display-small-font: Google Sans;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 400;--mat-sys-headline-large: 400 2rem / 2.5rem Google Sans;--mat-sys-headline-large-font: Google Sans;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 400;--mat-sys-headline-medium: 400 1.75rem / 2.25rem Google Sans;--mat-sys-headline-medium-font: Google Sans;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 400;--mat-sys-headline-small: 400 1.5rem / 2rem Google Sans;--mat-sys-headline-small-font: Google Sans;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 400;--mat-sys-label-large: 500 .875rem / 1.25rem Google Sans;--mat-sys-label-large-font: Google Sans;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 500;--mat-sys-label-large-weight-prominent: 700;--mat-sys-label-medium: 500 .75rem / 1rem Google Sans;--mat-sys-label-medium-font: Google Sans;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 500;--mat-sys-label-medium-weight-prominent: 700;--mat-sys-label-small: 500 .688rem / 1rem Google Sans;--mat-sys-label-small-font: Google Sans;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 500;--mat-sys-title-large: 400 1.375rem / 1.75rem Google Sans;--mat-sys-title-large-font: Google Sans;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 400;--mat-sys-title-medium: 500 1rem / 1.5rem Google Sans;--mat-sys-title-medium-font: Google Sans;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 500;--mat-sys-title-small: 500 .875rem / 1.25rem Google Sans;--mat-sys-title-small-font: Google Sans;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 500;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;color-scheme:light;--mat-sys-primary: #005fb7;--mat-sys-on-primary: #ffffff;--mat-sys-primary-container: #d1e4ff;--mat-sys-on-primary-container: #001c37;--mat-sys-secondary: #535f70;--mat-sys-on-secondary: #ffffff;--mat-sys-secondary-container: #d7e3f7;--mat-sys-on-secondary-container: #101c2b;--mat-sys-background: #ffffff;--mat-sys-surface: #ffffff;--mat-sys-surface-container: #f5f5f5;--mat-sys-surface-container-low: #fafafa;--mat-sys-surface-container-high: #eeeeee;--mat-sys-surface-container-highest: #e0e0e0}html.dark-theme{--mat-sys-background: #151316;--mat-sys-error: #ffb4ab;--mat-sys-error-container: #93000a;--mat-sys-inverse-on-surface: #323033;--mat-sys-inverse-primary: #7d00fa;--mat-sys-inverse-surface: #e6e1e6;--mat-sys-on-background: #e6e1e6;--mat-sys-on-error: #690005;--mat-sys-on-error-container: #ffdad6;--mat-sys-on-primary: #42008a;--mat-sys-on-primary-container: #ecdcff;--mat-sys-on-primary-fixed: #270057;--mat-sys-on-primary-fixed-variant: #5f00c0;--mat-sys-on-secondary: #352d40;--mat-sys-on-secondary-container: #eadef7;--mat-sys-on-secondary-fixed: #1f182a;--mat-sys-on-secondary-fixed-variant: #4b4357;--mat-sys-on-surface: #e6e1e6;--mat-sys-on-surface-variant: #e8e0eb;--mat-sys-on-tertiary: #42008a;--mat-sys-on-tertiary-container: #ecdcff;--mat-sys-on-tertiary-fixed: #270057;--mat-sys-on-tertiary-fixed-variant: #5f00c0;--mat-sys-outline: #958e99;--mat-sys-outline-variant: #49454e;--mat-sys-primary: #d5baff;--mat-sys-primary-container: #5f00c0;--mat-sys-primary-fixed: #ecdcff;--mat-sys-primary-fixed-dim: #d5baff;--mat-sys-scrim: #000000;--mat-sys-secondary: #cec2db;--mat-sys-secondary-container: #4b4357;--mat-sys-secondary-fixed: #eadef7;--mat-sys-secondary-fixed-dim: #cec2db;--mat-sys-shadow: #000000;--mat-sys-surface: #151316;--mat-sys-surface-bright: #3b383c;--mat-sys-surface-container: #211f22;--mat-sys-surface-container-high: #2b292d;--mat-sys-surface-container-highest: #363437;--mat-sys-surface-container-low: #1d1b1e;--mat-sys-surface-container-lowest: #0f0d11;--mat-sys-surface-dim: #151316;--mat-sys-surface-tint: #d5baff;--mat-sys-surface-variant: #49454e;--mat-sys-tertiary: #d5baff;--mat-sys-tertiary-container: #5f00c0;--mat-sys-tertiary-fixed: #ecdcff;--mat-sys-tertiary-fixed-dim: #d5baff;--mat-sys-neutral-variant20: #332f37;--mat-sys-neutral10: #1d1b1e;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 400 1rem / 1.5rem Google Sans;--mat-sys-body-large-font: Google Sans;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 400;--mat-sys-body-medium: 400 .875rem / 1.25rem Google Sans;--mat-sys-body-medium-font: Google Sans;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 400;--mat-sys-body-small: 400 .75rem / 1rem Google Sans;--mat-sys-body-small-font: Google Sans;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 400;--mat-sys-display-large: 400 3.562rem / 4rem Google Sans;--mat-sys-display-large-font: Google Sans;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 400;--mat-sys-display-medium: 400 2.812rem / 3.25rem Google Sans;--mat-sys-display-medium-font: Google Sans;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 400;--mat-sys-display-small: 400 2.25rem / 2.75rem Google Sans;--mat-sys-display-small-font: Google Sans;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 400;--mat-sys-headline-large: 400 2rem / 2.5rem Google Sans;--mat-sys-headline-large-font: Google Sans;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 400;--mat-sys-headline-medium: 400 1.75rem / 2.25rem Google Sans;--mat-sys-headline-medium-font: Google Sans;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 400;--mat-sys-headline-small: 400 1.5rem / 2rem Google Sans;--mat-sys-headline-small-font: Google Sans;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 400;--mat-sys-label-large: 500 .875rem / 1.25rem Google Sans;--mat-sys-label-large-font: Google Sans;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 500;--mat-sys-label-large-weight-prominent: 700;--mat-sys-label-medium: 500 .75rem / 1rem Google Sans;--mat-sys-label-medium-font: Google Sans;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 500;--mat-sys-label-medium-weight-prominent: 700;--mat-sys-label-small: 500 .688rem / 1rem Google Sans;--mat-sys-label-small-font: Google Sans;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 500;--mat-sys-title-large: 400 1.375rem / 1.75rem Google Sans;--mat-sys-title-large-font: Google Sans;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 400;--mat-sys-title-medium: 500 1rem / 1.5rem Google Sans;--mat-sys-title-medium-font: Google Sans;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 500;--mat-sys-title-small: 500 .875rem / 1.25rem Google Sans;--mat-sys-title-small-font: Google Sans;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 500;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;color-scheme:dark;--mat-sys-primary: #7cc4ff;--mat-sys-on-primary: #003366;--mat-sys-primary-container: #004b8d;--mat-sys-on-primary-container: #d1e4ff;--mat-sys-secondary: #b5c9e2;--mat-sys-on-secondary: #203246;--mat-sys-secondary-container: #3a485a;--mat-sys-on-secondary-container: #d7e3f7;--mat-sys-background: #121212;--mat-sys-surface: #121212;--mat-sys-surface-container: #1e1e1e;--mat-sys-surface-container-low: #1a1a1a;--mat-sys-surface-container-high: #2a2a2a;--mat-sys-surface-container-highest: #3a3a3a}body{height:100vh;margin:0;font-family:Roboto,Helvetica Neue,sans-serif;overflow:hidden}markdown p{margin-block-start:.5em;margin-block-end:.5em}markdown pre{border-radius:8px!important}markdown code{border-radius:4px!important}.json-tooltip-panel{color:var(--mat-sys-on-surface)!important;border:1px solid var(--mat-sys-outline-variant)!important;border-radius:8px!important;padding:12px 16px!important;box-shadow:0 4px 12px #00000026!important;max-width:800px!important;overflow:hidden!important;background-color:var(--mat-sys-surface-container-high)!important}.user-avatar-menu .mat-mdc-menu-content{padding:0}.html-tooltip-panel .content-bubble{max-width:100%!important}.html-tooltip-panel .message-text p{white-space:pre-line;word-break:break-word;overflow-wrap:break-word}.custom-image-dialog .mdc-dialog__surface{background-color:transparent!important;box-shadow:none!important;border-radius:0!important} diff --git a/src/google/adk/cli/built_in_agents/adk_agent_builder_assistant.py b/src/google/adk/cli/built_in_agents/adk_agent_builder_assistant.py index 3ccc45337f..8d7ddadbb3 100644 --- a/src/google/adk/cli/built_in_agents/adk_agent_builder_assistant.py +++ b/src/google/adk/cli/built_in_agents/adk_agent_builder_assistant.py @@ -55,6 +55,7 @@ class AgentBuilderAssistant: "BaseAgentConfig", "AgentRefConfig", "CodeConfig", + "ArgumentConfig", "ToolArgsConfig", "google__adk__tools__tool_configs__ToolConfig", ) @@ -255,18 +256,26 @@ def add(text: str = "", indent: int = 0) -> None: indent=2, ) add( - "args: optional ToolArgsConfig of free key-value pairs forwarded to" - " the tool's from_config().", + "args: optional object of additional keyword arguments. Use simple " + "key-value pairs (ToolArgsConfig) or structured ArgumentConfig entries " + "when a list is required by callbacks.", + indent=2, + ) + + add() + add("ArgumentConfig") + add( + "Represents a single argument. value is required and may be any JSON " + "type. name is optional (null allowed). Often used in callback args.", indent=2, ) add() add("CodeConfig") add( - "References Python code by fully qualified name (e.g." - " my_library.my_module.my_function). The referenced object must" - " already be constructed in Python; YAML cannot pass constructor" - " arguments.", + "References Python code for callbacks or dynamic tool creation." + " Requires name (dotted path). args is an optional list of" + " ArgumentConfig items executed when invoking the function.", indent=2, ) diff --git a/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py b/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py index 09027fa44b..ca7398733f 100644 --- a/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py +++ b/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py @@ -42,43 +42,33 @@ def resolve_file_path( working_directory: Working directory to use as base (defaults to cwd) Returns: - Resolved absolute Path object, guaranteed to be within the root directory. - - Raises: - ValueError: If ``file_path`` resolves outside the root directory, e.g. via - ``..`` traversal or an absolute path pointing outside the root. + Resolved absolute Path object """ normalized_path = sanitize_generated_file_path(file_path) file_path_obj = Path(normalized_path) + # If already absolute, use as-is + if file_path_obj.is_absolute(): + return file_path_obj + # Get root directory from session state, default to "./" root_directory = "./" if session_state and "root_directory" in session_state: root_directory = session_state["root_directory"] + # Use the same resolution logic as the main function root_path_obj = Path(root_directory) + if root_path_obj.is_absolute(): resolved_root = root_path_obj - elif working_directory: - resolved_root = Path(working_directory) / root_directory else: - resolved_root = Path(os.getcwd()) / root_directory - resolved_root = resolved_root.resolve() + if working_directory: + resolved_root = Path(working_directory) / root_directory + else: + resolved_root = Path(os.getcwd()) / root_directory - if file_path_obj.is_absolute(): - candidate = file_path_obj.resolve() - else: - candidate = (resolved_root / file_path_obj).resolve() - - # Keep the resolved path within the root to block path-traversal escapes. - try: - candidate.relative_to(resolved_root) - except ValueError as exc: - raise ValueError( - f"File path {file_path!r} resolves outside the root directory" - f" {resolved_root}." - ) from exc - return candidate + # Resolve file path relative to root directory + return resolved_root / file_path_obj def resolve_file_paths( diff --git a/src/google/adk/cli/cli.py b/src/google/adk/cli/cli.py index bc33bd0afb..1d49f50d79 100644 --- a/src/google/adk/cli/cli.py +++ b/src/google/adk/cli/cli.py @@ -14,14 +14,8 @@ from __future__ import annotations -import asyncio from datetime import datetime -import json -import logging from pathlib import Path -import re -import sys -from typing import Any from typing import Optional from typing import Union @@ -29,13 +23,11 @@ from google.genai import types from pydantic import BaseModel -from ..agents.base_agent import BaseAgent from ..agents.llm_agent import LlmAgent from ..apps.app import App from ..artifacts.base_artifact_service import BaseArtifactService from ..auth.credential_service.base_credential_service import BaseCredentialService from ..auth.credential_service.in_memory_credential_service import InMemoryCredentialService -from ..events.event import Event from ..memory.base_memory_service import BaseMemoryService from ..runners import Runner from ..sessions.base_session_service import BaseSessionService @@ -49,21 +41,12 @@ from .utils.service_factory import create_memory_service_from_options from .utils.service_factory import create_session_service_from_options -logger = logging.getLogger('google_adk.' + __name__) - class InputFile(BaseModel): state: dict[str, object] queries: list[str] -def _to_app(agent_or_app: Union[BaseAgent, App, Any], app_name: str) -> App: - """Wraps a BaseAgent or BaseNode in an App if not already one.""" - if isinstance(agent_or_app, App): - return agent_or_app - return App(name=app_name, root_agent=agent_or_app) - - async def run_input_file( app_name: str, user_id: str, @@ -74,7 +57,11 @@ async def run_input_file( input_path: str, memory_service: Optional[BaseMemoryService] = None, ) -> Session: - app = _to_app(agent_or_app, app_name) + app = ( + agent_or_app + if isinstance(agent_or_app, App) + else App(name=app_name, root_agent=agent_or_app) + ) runner = Runner( app=app, artifact_service=artifact_service, @@ -104,86 +91,6 @@ async def run_input_file( return session -_REQUEST_INPUT = 'adk_request_input' -_REQUEST_CONFIRMATION = 'adk_request_confirmation' - - -def _collect_pending_function_calls( - events: list[Event], -) -> list[tuple[str, str, dict[str, Any]]]: - """Collects pending HITL function calls from events. - - Returns a list of (function_call_id, function_name, args) tuples - for function calls that need user input. - """ - pending = [] - for event in events: - lr_ids = getattr(event, 'long_running_tool_ids', None) - if not lr_ids: - continue - content = getattr(event, 'content', None) - if not content or not content.parts: - continue - for part in content.parts: - fc = part.function_call - if fc and fc.id in lr_ids: - pending.append((fc.id, fc.name, fc.args or {})) - return pending - - -def _is_positive_response(s: str) -> bool: - """Returns True if the string is a positive response.""" - return s.strip().lower() in ('y', 'yes', 'true', 'confirm') - - -def _prompt_for_function_call( - fc_id: str, fc_name: str, args: dict[str, Any] -) -> types.Content: - """Prompts the user for a HITL function call and returns the response.""" - if fc_name == _REQUEST_INPUT: - message = args.get('message') or 'Input requested' - schema = args.get('response_schema') - click.echo(f'[HITL input] {message}') - if schema: - click.echo(f' Schema: {json.dumps(schema)}') - elif fc_name == _REQUEST_CONFIRMATION: - tool_confirmation = args.get('toolConfirmation', {}) - hint = tool_confirmation.get('hint', '') - original_fc = args.get('originalFunctionCall', {}) - original_name = original_fc.get('name', 'unknown') - click.echo(f'[HITL confirm] {hint or f"Confirm {original_name}?"}') - click.echo(' Type "yes" to confirm, anything else to reject.') - else: - click.echo(f'[HITL] Waiting for input for {fc_name}({args})') - - user_input = input('[user]: ') - - # Build the FunctionResponse. - if fc_name == _REQUEST_CONFIRMATION: - confirmed = _is_positive_response(user_input) - response = {'confirmed': confirmed} - else: - # Try to parse as JSON, fall back to wrapping as {"result": value}. - try: - parsed = json.loads(user_input) - response = parsed if isinstance(parsed, dict) else {'result': parsed} - except (json.JSONDecodeError, ValueError): - response = {'result': user_input} - - return types.Content( - role='user', - parts=[ - types.Part( - function_response=types.FunctionResponse( - id=fc_id, - name=fc_name, - response=response, - ) - ) - ], - ) - - async def run_interactively( root_agent_or_app: Union[LlmAgent, App], artifact_service: BaseArtifactService, @@ -191,10 +98,12 @@ async def run_interactively( session_service: BaseSessionService, credential_service: BaseCredentialService, memory_service: Optional[BaseMemoryService] = None, - timeout: Optional[str] = None, - jsonl: bool = False, ) -> None: - app = _to_app(root_agent_or_app, session.app_name) + app = ( + root_agent_or_app + if isinstance(root_agent_or_app, App) + else App(name=session.app_name, root_agent=root_agent_or_app) + ) runner = Runner( app=app, artifact_service=artifact_service, @@ -202,90 +111,58 @@ async def run_interactively( memory_service=memory_service, credential_service=credential_service, ) - - next_message = None - resume_invocation_id = None while True: - if next_message is None: - query = input('[user]: ') - if not query or not query.strip(): - continue - if query == 'exit': - break - next_message = types.Content(role='user', parts=[types.Part(text=query)]) - - collected_events = [] - invocation_id = None - - async def run_and_print(): - nonlocal invocation_id - async with Aclosing( - runner.run_async( - user_id=session.user_id, - session_id=session.id, - new_message=next_message, - invocation_id=resume_invocation_id, - ) - ) as agen: - async for event in agen: - collected_events.append(event) - if getattr(event, 'invocation_id', None): - invocation_id = event.invocation_id - _print_event(event, jsonl=jsonl, session_id=session.id) - - try: - if timeout: - seconds = _parse_timeout(timeout) - await asyncio.wait_for(run_and_print(), timeout=seconds) - else: - await run_and_print() - except asyncio.TimeoutError: - click.secho( - f'Error: Command timed out after {timeout}', fg='red', err=True - ) - next_message = None - resume_invocation_id = None + query = input('[user]: ') + if not query or not query.strip(): continue - - next_message = None - resume_invocation_id = None - - # Check for pending HITL function calls that need user input. - pending = _collect_pending_function_calls(collected_events) - if pending: - # Handle each pending function call. If there are multiple, - # collect all responses into a single Content with multiple parts. - parts = [] - for fc_id, fc_name, args in pending: - response_content = _prompt_for_function_call(fc_id, fc_name, args) - parts.extend(response_content.parts) - next_message = types.Content(role='user', parts=parts) - resume_invocation_id = invocation_id - + if query == 'exit': + break + async with Aclosing( + runner.run_async( + user_id=session.user_id, + session_id=session.id, + new_message=types.Content( + role='user', parts=[types.Part(text=query)] + ), + ) + ) as agen: + async for event in agen: + if event.content and event.content.parts: + if text := ''.join(part.text or '' for part in event.content.parts): + click.echo(f'[{event.author}]: {text}') await runner.close() -def _override_default_llm_model(default_llm_model: str): - """Overrides the default LLM model for LlmAgent.""" - logger.info('Overriding default model to %s', default_llm_model) - LlmAgent.set_default_model(default_llm_model) - - -def _setup_runner_context( +async def run_cli( *, agent_parent_dir: str, agent_folder_name: str, - in_memory: bool = False, + input_file: Optional[str] = None, + saved_session_file: Optional[str] = None, + save_session: bool, + session_id: Optional[str] = None, session_service_uri: Optional[str] = None, artifact_service_uri: Optional[str] = None, memory_service_uri: Optional[str] = None, use_local_storage: bool = True, - default_llm_model: Optional[str] = None, -): - """Sets up the agent, services, and environment for running. +) -> None: + """Runs an interactive CLI for a certain agent. - Returns a tuple containing the loaded agent/app, services, and other - contextual information needed for execution. + Args: + agent_parent_dir: str, the absolute path of the parent folder of the agent + folder. + agent_folder_name: str, the name of the agent folder. + input_file: Optional[str], the absolute path to the json file that contains + the initial session state and user queries, exclusive with + saved_session_file. + saved_session_file: Optional[str], the absolute path to the json file that + contains a previously saved session, exclusive with input_file. + save_session: bool, whether to save the session on exit. + session_id: Optional[str], the session ID to save the session to on exit. + session_service_uri: Optional[str], custom session service URI. + artifact_service_uri: Optional[str], custom artifact service URI. + memory_service_uri: Optional[str], custom memory service URI. + use_local_storage: bool, whether to use local .adk storage by default. """ agent_parent_path = Path(agent_parent_dir).resolve() agent_root = agent_parent_path / agent_folder_name @@ -295,9 +172,6 @@ def _setup_runner_context( agents_dir = str(agent_parent_path) agent_loader = AgentLoader(agents_dir=agents_dir) agent_or_app = agent_loader.load_agent(agent_folder_name) - - if default_llm_model: - _override_default_llm_model(default_llm_model) session_app_name = ( agent_or_app.name if isinstance(agent_or_app, App) else agent_folder_name ) @@ -308,11 +182,8 @@ def _setup_runner_context( if not is_env_enabled('ADK_DISABLE_LOAD_DOTENV'): envs.load_dotenv_for_agent(agent_folder_name, agents_dir) - if in_memory: - session_service_uri = 'memory://' - artifact_service_uri = 'memory://' - use_local_storage = False - + # Create session and artifact services using factory functions. + # Sessions persist under //.adk/session.db when enabled. session_service = create_session_service_from_options( base_dir=agent_parent_path, session_service_uri=session_service_uri, @@ -321,9 +192,8 @@ def _setup_runner_context( ) artifact_service = create_artifact_service_from_options( - base_dir=agent_parent_path, + base_dir=agent_root, artifact_service_uri=artifact_service_uri, - app_name_to_dir=app_name_to_dir, use_local_storage=use_local_storage, ) memory_service = create_memory_service_from_options( @@ -333,124 +203,17 @@ def _setup_runner_context( credential_service = InMemoryCredentialService() - return ( - agent_or_app, - session_service, - artifact_service, - memory_service, - credential_service, - user_id, - session_app_name, - agent_root, - ) - - -def _print_event( - event: Event, jsonl: bool = False, session_id: Optional[str] = None -): - """Prints an event to the console. - - Args: - event: The Event object to print. - jsonl: If True, outputs structured JSONL to stdout. Otherwise, outputs - human-readable text. - session_id: Optional session ID to inject into the JSONL output. - """ - if jsonl: - event_dict = event.model_dump(mode='json', by_alias=True, exclude_none=True) - if session_id: - event_dict['session_id'] = session_id - if event.node_info and event.node_info.path: - event_dict['node_path'] = event.node_info.path - - # Filter out empty dictionaries in 'actions' (e.g., empty state delta) to - # reduce noise - if 'actions' in event_dict and isinstance(event_dict['actions'], dict): - event_dict['actions'] = { - k: v for k, v in event_dict['actions'].items() if v != {} - } - if not event_dict['actions']: - del event_dict['actions'] - - # Optimize key order for human readability in JSONL viewers - ordered_dict = {} - for k in ['author', 'session_id', 'node_path', 'id']: - if k in event_dict: - ordered_dict[k] = event_dict[k] - for k, v in event_dict.items(): - if k not in ordered_dict: - ordered_dict[k] = v - click.echo(json.dumps(ordered_dict)) - else: - # Human readable mode - author = event.author or 'unknown' - text_parts = ( - [p.text for p in event.content.parts if p.text] if event.content else [] - ) - if text_parts: - text = ''.join(text_parts) - click.echo(f'[{author}]: {text}') - elif event.long_running_tool_ids: - click.secho(f'[{author}]: (Paused for input...)', fg='yellow') - - -async def run_cli( - *, - agent_parent_dir: str, - agent_folder_name: str, - input_file: Optional[str] = None, - saved_session_file: Optional[str] = None, - save_session: bool, - session_id: Optional[str] = None, - state_str: Optional[str] = None, - timeout: Optional[str] = None, - in_memory: bool = False, - jsonl: bool = False, - session_service_uri: Optional[str] = None, - artifact_service_uri: Optional[str] = None, - memory_service_uri: Optional[str] = None, - use_local_storage: bool = True, - default_llm_model: Optional[str] = None, -) -> None: - """Runs an interactive CLI for a certain agent. - - Args: - agent_parent_dir: str, the absolute path of the parent folder of the agent - folder. - agent_folder_name: str, the name of the agent folder. - input_file: Optional[str], the absolute path to the json file that contains - the initial session state and user queries, exclusive with - saved_session_file. - saved_session_file: Optional[str], the absolute path to the json file that - contains a previously saved session, exclusive with input_file. - save_session: bool, whether to save the session on exit. - session_id: Optional[str], the session ID to save the session to on exit. - session_service_uri: Optional[str], custom session service URI. - artifact_service_uri: Optional[str], custom artifact service URI. - memory_service_uri: Optional[str], custom memory service URI. - use_local_storage: bool, whether to use local .adk storage by default. - """ - ( - agent_or_app, - session_service, - artifact_service, - memory_service, - credential_service, - user_id, - session_app_name, - agent_root, - ) = _setup_runner_context( - agent_parent_dir=agent_parent_dir, - agent_folder_name=agent_folder_name, - in_memory=in_memory, - session_service_uri=session_service_uri, - artifact_service_uri=artifact_service_uri, - memory_service_uri=memory_service_uri, - use_local_storage=use_local_storage, - default_llm_model=default_llm_model, - ) - # Helper function for printing events + def _print_event(event) -> None: + content = event.content + if not content or not content.parts: + return + text_parts = [part.text for part in content.parts if part.text] + if not text_parts: + return + author = event.author or 'system' + click.echo(f'[{author}]: {"".join(text_parts)}') + if input_file: session = await run_input_file( app_name=session_app_name, @@ -478,7 +241,7 @@ async def run_cli( if loaded_session: for event in loaded_session.events: await session_service.append_event(session, event) - _print_event(event, jsonl=jsonl, session_id=session.id) + _print_event(event) await run_interactively( agent_or_app, @@ -487,19 +250,10 @@ async def run_cli( session_service, credential_service, memory_service=memory_service, - timeout=timeout, - jsonl=jsonl, ) else: - initial_state = None - if state_str: - try: - initial_state = json.loads(state_str) - except json.JSONDecodeError as e: - click.secho(f'Error: Invalid JSON for --state: {e}', fg='red', err=True) - return session = await session_service.create_session( - app_name=session_app_name, user_id=user_id, state=initial_state + app_name=session_app_name, user_id=user_id ) click.echo(f'Running agent {agent_or_app.name}, type exit to exit.') await run_interactively( @@ -509,8 +263,6 @@ async def run_cli( session_service, credential_service, memory_service=memory_service, - timeout=timeout, - jsonl=jsonl, ) if save_session: @@ -529,248 +281,3 @@ async def run_cli( ) print('Session saved to', session_path) - - -def _parse_timeout(timeout_str: str) -> float: - """Parses a timeout string like '30s', '5m' into seconds.""" - match = re.match(r'^(\d+)([sm])?$', timeout_str) - if not match: - raise ValueError(f'Invalid timeout format: {timeout_str}') - val, unit = match.groups() - seconds = float(val) - if unit == 'm': - seconds *= 60 - return seconds - - -async def run_once_cli( - *, - agent_parent_dir: str, - agent_folder_name: str, - query: Optional[str] = None, - state_str: Optional[str] = None, - session_id: Optional[str] = None, - replay: Optional[str] = None, - timeout: Optional[str] = None, - in_memory: bool = False, - jsonl: bool = False, - session_service_uri: Optional[str] = None, - artifact_service_uri: Optional[str] = None, - memory_service_uri: Optional[str] = None, - use_local_storage: bool = True, - default_llm_model: Optional[str] = None, -) -> int: - """Runs an agent in query/automated mode.""" - ( - agent_or_app, - session_service, - artifact_service, - memory_service, - credential_service, - user_id, - session_app_name, - agent_root, - ) = _setup_runner_context( - agent_parent_dir=agent_parent_dir, - agent_folder_name=agent_folder_name, - in_memory=in_memory, - session_service_uri=session_service_uri, - artifact_service_uri=artifact_service_uri, - memory_service_uri=memory_service_uri, - use_local_storage=use_local_storage, - default_llm_model=default_llm_model, - ) - - parsed_state = None - if state_str: - try: - parsed_state = json.loads(state_str) - except json.JSONDecodeError as e: - click.secho(f'Error: Invalid JSON for --state: {e}', fg='red', err=True) - return 1 - - if query and replay: - click.secho( - 'Error: Cannot provide both query and --replay.', fg='red', err=True - ) - return 1 - - if not query and not replay: - if not sys.stdin.isatty(): - query = sys.stdin.read().strip() - else: - click.secho( - 'Error: Missing query argument or stdin input.', fg='red', err=True - ) - return 1 - - app = _to_app(agent_or_app, session_app_name) - runner = Runner( - app=app, - artifact_service=artifact_service, - session_service=session_service, - memory_service=memory_service, - credential_service=credential_service, - ) - - if replay: - with open(replay, 'r', encoding='utf-8') as f: - input_file = InputFile.model_validate_json(f.read()) - session = await session_service.create_session( - app_name=session_app_name, - user_id=user_id, - state=input_file.state, - session_id=session_id, - ) - queries = input_file.queries - else: - if session_id: - session = await session_service.get_session( - app_name=session_app_name, user_id=user_id, session_id=session_id - ) - if not session: - session = await session_service.create_session( - app_name=session_app_name, - user_id=user_id, - state=parsed_state, - session_id=session_id, - ) - else: - session = await session_service.create_session( - app_name=session_app_name, user_id=user_id, state=parsed_state - ) - queries = [query] if query else [] - - # Output session ID once per run to stderr for humans - if not jsonl: - click.secho(f'Session ID: {session.id}', fg='yellow', err=True) - - exit_code = 0 - - async def execute_query(query: str): - nonlocal exit_code - - # Auto-resume magic: Check if the last event in the session indicates an - # active interrupt (Human-In-The-Loop suspension). If so, we automatically - # map the user's text query to the required function response instead of - # treating it as a new user message. - # Find the last event with active interrupts - interrupt_event = None - for e in reversed(session.events): - if e.long_running_tool_ids: - interrupt_event = e - break - - if interrupt_event: - # Assume the first active interrupt is the one we want to answer - interrupt_id = list(interrupt_event.long_running_tool_ids)[0] - if not jsonl: - click.secho( - f'Auto-resuming interrupt {interrupt_id} with input: {query}', - fg='cyan', - err=True, - ) - - # Construct a FunctionResponse pointing back to the interrupt ID. - # We check the synthetic function name to handle different interrupt types. - # TODO: We still need to handle 'adk_request_credential' (auth). - # TODO: Support batch HITL or interactive selection when multiple - # interrupts are active. - fc = next( - ( - c - for c in interrupt_event.get_function_calls() - if c.id == interrupt_id - ), - None, - ) - - if fc and fc.name == 'adk_request_confirmation': - # Try to parse as JSON to support passing custom payload or explicit confirmed flag. - try: - parsed = json.loads(query) - if isinstance(parsed, dict): - response = parsed - else: - response = {'confirmed': _is_positive_response(query)} - except (json.JSONDecodeError, ValueError): - response = {'confirmed': _is_positive_response(query)} - - content = types.Content( - role='user', - parts=[ - types.Part( - function_response=types.FunctionResponse( - id=interrupt_id, - name='adk_request_confirmation', - response=response, - ) - ) - ], - ) - else: - # Fallback to adk_request_input or default behavior - content = types.Content( - role='user', - parts=[ - types.Part( - function_response=types.FunctionResponse( - id=interrupt_id, - name='adk_request_input', - response={'result': query}, - ) - ) - ], - ) - else: - # Standard flow: Treat the query as a new text message from the user - content = types.Content(role='user', parts=[types.Part(text=query)]) - - async with Aclosing( - runner.run_async( - user_id=session.user_id, - session_id=session.id, - invocation_id=interrupt_event.invocation_id - if interrupt_event - else None, - new_message=content, - ) - ) as agen: - async for event in agen: - _print_event(event, jsonl=jsonl, session_id=session.id) - if event.long_running_tool_ids: - exit_code = 2 - - if exit_code == 2 and not jsonl: - click.secho( - '\n' - + '=' * 60 - + '\n' - '🚨 [PAUSED] Workflow is waiting for human input! 🚨\n\n' - 'To resume, run the command again with:\n' - f' --session_id {session.id}\n' - 'And provide your input as the query.\n' - + '=' * 60 - + '\n', - fg='yellow', - bold=True, - err=True, - ) - - try: - for q in queries: - if timeout: - seconds = _parse_timeout(timeout) - await asyncio.wait_for(execute_query(q), timeout=seconds) - else: - await execute_query(q) - except asyncio.TimeoutError: - click.secho(f'Error: Command timed out after {timeout}', fg='red', err=True) - return 1 - except Exception as e: - click.secho(f'Error: {e}', fg='red', err=True) - return 1 - finally: - await runner.close() - - return exit_code diff --git a/src/google/adk/cli/cli_deploy.py b/src/google/adk/cli/cli_deploy.py index 81437c668d..4350ae17ce 100644 --- a/src/google/adk/cli/cli_deploy.py +++ b/src/google/adk/cli/cli_deploy.py @@ -29,7 +29,6 @@ import click from packaging.version import parse -from ..version import __version__ from .utils import _onboarding _IS_WINDOWS = os.name == 'nt' @@ -41,7 +40,7 @@ def _ensure_agent_engine_dependency(requirements_txt_path: str) -> None: - """Ensures staged requirements include Agent Platform dependencies.""" + """Ensures staged requirements include Agent Engine dependencies.""" if not os.path.exists(requirements_txt_path): raise FileNotFoundError( f'requirements.txt not found at: {requirements_txt_path}' @@ -63,8 +62,7 @@ def _ensure_agent_engine_dependency(requirements_txt_path: str) -> None: with open(requirements_txt_path, 'a', encoding='utf-8') as f: if requirements and not requirements.endswith('\n'): f.write('\n') - f.write('google-cloud-aiplatform[agent_engines]\n') - f.write(f'google-adk=={__version__}\n') + f.write(_AGENT_ENGINE_REQUIREMENT + '\n') _DOCKERFILE_TEMPLATE: Final[str] = """ @@ -103,7 +101,33 @@ def _ensure_agent_engine_dependency(requirements_txt_path: str) -> None: EXPOSE {port} -CMD adk {command} --port={port} {host_option} {service_option} {trace_to_cloud_option} {otel_to_cloud_option} {allow_origins_option} {a2a_option} {trigger_sources_option} {gemini_enterprise_option}{express_mode_option} "/app/agents" +CMD adk {command} --port={port} {host_option} {service_option} {trace_to_cloud_option} {otel_to_cloud_option} {allow_origins_option} {a2a_option} {trigger_sources_option} "/app/agents" +""" + +_AGENT_ENGINE_APP_TEMPLATE: Final[str] = """ +import os +import vertexai +from vertexai.agent_engines import AdkApp + +if {is_config_agent}: + from google.adk.agents import config_agent_utils + config_path = os.path.join(os.path.dirname(__file__), "root_agent.yaml") + root_agent = config_agent_utils.from_config(config_path) +else: + from .agent import {adk_app_object} + +if {express_mode}: # Whether or not to use Express Mode + vertexai.init(api_key=os.environ.get("GOOGLE_API_KEY")) +else: + vertexai.init( + project=os.environ.get("GOOGLE_CLOUD_PROJECT"), + location=os.environ.get("GOOGLE_CLOUD_LOCATION"), + ) + +adk_app = AdkApp( + {adk_app_type}={adk_app_object}, + enable_tracing={trace_to_cloud_option}, +) """ _AGENT_ENGINE_CLASS_METHODS = [ @@ -386,13 +410,6 @@ def _ensure_agent_engine_dependency(requirements_txt_path: str) -> None: ] -def _resolve_adk_version() -> str: - """Returns the default ADK version.""" - from google.adk.version import __version__ - - return __version__ - - def _resolve_project(project_in_option: Optional[str]) -> str: if project_in_option: return project_in_option @@ -703,7 +720,7 @@ def to_cloud_run( gcp_region=region, app_name=app_name, port=port, - command='api_server --with_ui' if with_ui else 'api_server', + command='web' if with_ui else 'api_server', install_agent_deps=install_agent_deps, service_option=_get_service_option_by_adk_version( adk_version, @@ -719,8 +736,6 @@ def to_cloud_run( host_option=host_option, a2a_option=a2a_option, trigger_sources_option=trigger_sources_option, - gemini_enterprise_option='', - express_mode_option='', ) dockerfile_path = os.path.join(temp_folder, 'Dockerfile') os.makedirs(temp_folder, exist_ok=True) @@ -811,7 +826,7 @@ def to_agent_engine( *, agent_folder: str, temp_folder: Optional[str] = None, - adk_app: Optional[str] = None, + adk_app: str, staging_bucket: Optional[str] = None, trace_to_cloud: Optional[bool] = None, otel_to_cloud: Optional[bool] = None, @@ -827,93 +842,84 @@ def to_agent_engine( env_file: Optional[str] = None, agent_engine_config_file: Optional[str] = None, skip_agent_import_validation: bool = True, - trigger_sources: Optional[str] = None, - memory_service_uri: Optional[str] = None, - session_service_uri: Optional[str] = None, - artifact_service_uri: Optional[str] = None, - adk_version: Optional[str] = None, ): - """Deploys an agent to Gemini Enterprise Agent Platform. + """Deploys an agent to Vertex AI Agent Engine. `agent_folder` should contain the following files: - __init__.py - agent.py + - .py (optional, for customization; will be autogenerated otherwise) - requirements.txt (optional, for additional dependencies) - .env (optional, for environment variables) - ... (other required source files) + The contents of `adk_app` should look something like: + + ``` + from agent import + from vertexai.agent_engines import AdkApp + + adk_app = AdkApp( + agent=, # or `app=` + ) + ``` + Args: agent_folder (str): The folder (absolute path) containing the agent source code. - temp_folder (str): The temp folder for the generated Agent Platform source + temp_folder (str): The temp folder for the generated Agent Engine source files. It will be replaced with the generated files if it already exists. - adk_app (str): Deprecated. This argument is no longer required or used. + adk_app (str): The name of the file (without .py) containing the AdkApp + instance. staging_bucket (str): Deprecated. This argument is no longer required or used. - trace_to_cloud (bool): Deprecated. This argument is no longer required or - used. - otel_to_cloud (bool): Whether to enable exporting OpenTelemetry signals to - Google Cloud. - api_key (str): Optional. The API key to use for Express Mode. If not - provided, the API key from the GOOGLE_API_KEY environment variable will be - used. It will only be used if GOOGLE_GENAI_USE_VERTEXAI is true. - adk_app_object (str): Deprecated. This argument is no longer required or - used. - agent_engine_id (str): Optional. The ID of the Agent Runtime instance to - update. If not specified, a new Agent Runtime instance will be created. - absolutize_imports (bool): Deprecated. This argument is no longer required - or used. + trace_to_cloud (bool): Whether to enable Cloud Trace. + otel_to_cloud (bool): Whether to enable exporting OpenTelemetry signals + to Google Cloud. + api_key (str): Optional. The API key to use for Express Mode. + If not provided, the API key from the GOOGLE_API_KEY environment variable + will be used. It will only be used if GOOGLE_GENAI_USE_VERTEXAI is true. + adk_app_object (str): Optional. The Python object corresponding to the root + ADK agent or app. Defaults to `root_agent` if not specified. + agent_engine_id (str): Optional. The ID of the Agent Engine instance to + update. If not specified, a new Agent Engine instance will be created. + absolutize_imports (bool): Optional. Default is True. Whether to absolutize + imports. If True, all relative imports will be converted to absolute + import statements. project (str): Optional. Google Cloud project id for the deployed agent. If not specified, the project from the `GOOGLE_CLOUD_PROJECT` environment variable will be used. It will be ignored if `api_key` is specified. region (str): Optional. Google Cloud region for the deployed agent. If not specified, the region from the `GOOGLE_CLOUD_LOCATION` environment variable will be used. It will be ignored if `api_key` is specified. - display_name (str): Optional. The display name of the Agent Runtime. - description (str): Optional. The description of the Agent Runtime. - requirements_file (str): Deprecated. This argument is no longer required or - used. + display_name (str): Optional. The display name of the Agent Engine. + description (str): Optional. The description of the Agent Engine. + requirements_file (str): Optional. The filepath to the `requirements.txt` + file to use. If not specified, the `requirements.txt` file in the + `agent_folder` will be used. env_file (str): Optional. The filepath to the `.env` file for environment variables. If not specified, the `.env` file in the `agent_folder` will be used. The values of `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` will be overridden by `project` and `region` if they are specified. - agent_engine_config_file (str): The filepath to the agent platform config - file to use. If not specified, the `.agent_engine_config.json` file in the + agent_engine_config_file (str): The filepath to the agent engine config file + to use. If not specified, the `.agent_engine_config.json` file in the `agent_folder` will be used. - skip_agent_import_validation (bool): Deprecated. This argument is no longer - required or used. - trigger_sources (str): Optional. Comma-separated list of trigger sources to - enable (e.g., 'pubsub,eventarc'). Registers /trigger/* endpoints for batch - and event-driven agent invocations. - memory_service_uri (str): Optional. The URI of the memory service. If not - specified, the memory service will be deployed to the same parent resource - as the runtime. - session_service_uri (str): Optional. The URI of the session service. If not - specified, the session service will be deployed to the same parent - resource as the runtime. - artifact_service_uri (str): Optional. The URI of the artifact service. - adk_version (str): Optional. The ADK version to use in Agent Platform - deployment. If not specified, the version in the dev environment will be - used. + skip_agent_import_validation (bool): Optional. Default is True. If True, + skip the pre-deployment import validation of `agent.py`. This can be + useful when the local environment does not have the same dependencies as + the deployment environment. """ app_name = os.path.basename(agent_folder) display_name = display_name or app_name parent_folder = os.path.dirname(agent_folder) - if adk_app_object: - warnings.warn( - 'WARNING: `--adk_app_object` is deprecated and will be removed in the' - ' future. Please drop it from the list of arguments.', - DeprecationWarning, - stacklevel=2, - ) - if adk_app: - warnings.warn( - 'WARNING: `adk_app` is deprecated and will be removed in a future' - ' release. Please drop it from the list of arguments.', - DeprecationWarning, - stacklevel=2, + adk_app_object = adk_app_object or 'root_agent' + if adk_app_object not in ['root_agent', 'app']: + click.echo( + f'Invalid adk_app_object: {adk_app_object}. Please use "root_agent"' + ' or "app".' ) + return if staging_bucket: warnings.warn( 'WARNING: `staging_bucket` is deprecated and will be removed in a' @@ -921,28 +927,27 @@ def to_agent_engine( DeprecationWarning, stacklevel=2, ) - if not adk_version: - adk_version = _resolve_adk_version() - click.echo(f'Using default ADK version: {adk_version}') original_cwd = os.getcwd() did_change_cwd = False if parent_folder != original_cwd: click.echo( - 'Agent Runtime deployment uses relative paths; temporarily switching ' + 'Agent Engine deployment uses relative paths; temporarily switching ' f'working directory to: {parent_folder}' ) os.chdir(parent_folder) did_change_cwd = True tmp_app_name = app_name + '_tmp' + datetime.now().strftime('%Y%m%d_%H%M%S') temp_folder = temp_folder or tmp_app_name - agent_src_path = os.path.join(parent_folder, temp_folder, 'agents', app_name) - temp_folder_path = os.path.join(parent_folder, temp_folder) - if os.path.exists(temp_folder_path): + agent_src_path = os.path.join(parent_folder, temp_folder) + click.echo(f'Staging all files in: {agent_src_path}') + # remove agent_src_path if it exists + if os.path.exists(agent_src_path): click.echo('Removing existing files') - shutil.rmtree(temp_folder_path) + shutil.rmtree(agent_src_path) try: + click.echo(f'Staging all files in: {agent_src_path}') ignore_patterns = None ae_ignore_path = os.path.join(agent_folder, '.ae_ignore') if os.path.exists(ae_ignore_path): @@ -957,7 +962,6 @@ def to_agent_engine( ignore=ignore_patterns, dirs_exist_ok=True, ) - os.chdir(temp_folder_path) click.echo('Copying agent source code complete.') project = _resolve_project(project) @@ -968,59 +972,55 @@ def to_agent_engine( agent_engine_config_file ): raise click.ClickException( - 'Agent Platform config file not found: ' + 'Agent engine config file not found: ' f'{parent_folder}/{agent_engine_config_file}' ) if not agent_engine_config_file: - # Attempt to read the agent platform config from .agent_engine_config.json - # in the dir (if any). + # Attempt to read the agent engine config from .agent_engine_config.json in the dir (if any). agent_engine_config_file = os.path.join( agent_folder, '.agent_engine_config.json' ) if os.path.exists(agent_engine_config_file): - click.echo( - f'Reading agent platform config from {agent_engine_config_file}' - ) + click.echo(f'Reading agent engine config from {agent_engine_config_file}') with open(agent_engine_config_file, 'r') as f: agent_config = json.load(f) if display_name: if 'display_name' in agent_config: click.echo( - 'Overriding display_name in agent platform config with' + 'Overriding display_name in agent engine config with' f' {display_name}' ) agent_config['display_name'] = display_name if description: if 'description' in agent_config: click.echo( - 'Overriding description in agent platform config with' - f' {description}' + f'Overriding description in agent engine config with {description}' ) agent_config['description'] = description requirements_txt_path = os.path.join(agent_src_path, 'requirements.txt') if requirements_file: - warnings.warn( - 'WARNING: `--requirements_file` is deprecated and will be removed in' - ' the future. Please define `requirements.txt` in the agent folder.', - DeprecationWarning, - stacklevel=2, - ) - if trace_to_cloud: - warnings.warn( - 'WARNING: `--trace_to_cloud` is deprecated and will be removed in the' - ' future. Please use `--otel_to_cloud` instead.', - DeprecationWarning, - stacklevel=2, - ) - if not os.path.exists(requirements_txt_path): - click.echo(f'Creating {requirements_txt_path}...') - with open(requirements_txt_path, 'w', encoding='utf-8') as f: - f.write('google-cloud-aiplatform[agent_engines]\n') - f.write(f'google-adk=={__version__}\n') - click.echo(f'Using google-adk=={__version__} in requirements') - click.echo(f'Created {requirements_txt_path}') + if os.path.exists(requirements_txt_path): + click.echo( + f'Overwriting {requirements_txt_path} with {requirements_file}' + ) + shutil.copyfile(requirements_file, requirements_txt_path) + elif 'requirements_file' in agent_config: + if os.path.exists(requirements_txt_path): + click.echo( + f'Overwriting {requirements_txt_path} with' + f' {agent_config["requirements_file"]}' + ) + shutil.copyfile(agent_config['requirements_file'], requirements_txt_path) + else: + # Attempt to read requirements from requirements.txt in the dir (if any). + if not os.path.exists(requirements_txt_path): + click.echo(f'Creating {requirements_txt_path}...') + with open(requirements_txt_path, 'w', encoding='utf-8') as f: + f.write(_AGENT_ENGINE_REQUIREMENT + '\n') + click.echo(f'Created {requirements_txt_path}') _ensure_agent_engine_dependency(requirements_txt_path) + agent_config['requirements_file'] = f'{temp_folder}/requirements.txt' env_vars = {} if not env_file: @@ -1077,22 +1077,10 @@ def to_agent_engine( fg='yellow', ) env_vars['GOOGLE_CLOUD_AGENT_ENGINE_ENABLE_TELEMETRY'] = 'true' - if 'ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS' not in env_vars: - env_vars['ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS'] = 'false' - else: - enable_telemetry = env_vars.get( - 'GOOGLE_CLOUD_AGENT_ENGINE_ENABLE_TELEMETRY', - ) - if enable_telemetry in ['true', '1']: - otel_to_cloud = True - click.echo( - '`--otel_to_cloud` is set to True by' - f' GOOGLE_CLOUD_AGENT_ENGINE_ENABLE_TELEMETRY in {env_file}' - ) if env_vars: if 'env_vars' in agent_config: click.echo( - f'Overriding env_vars in agent platform config with {env_vars}' + f'Overriding env_vars in agent engine config with {env_vars}' ) agent_config['env_vars'] = env_vars # Set env_vars in agent_config to None if it is not set. @@ -1102,122 +1090,86 @@ def to_agent_engine( from ..utils._google_client_headers import get_tracking_headers - if not (api_key or project or region): - click.echo( - 'No api_key/project/region provided. Starting onboarding flow...' - ) + if not project or not region: + click.echo('No project/region provided. Starting onboarding flow...') auth_info = _onboarding.handle_login_with_google() project = auth_info.project_id region = auth_info.region - click.echo('Initializing Agent Platform client...') - if project and region: - client = vertexai.Client( - project=project, - location=region, - http_options={'headers': get_tracking_headers()}, - ) - click.echo('Agent Platform client initialized with project and region.') - elif api_key: - client = vertexai.Client( - api_key=api_key, - http_options={'headers': get_tracking_headers()}, - ) - click.echo('Agent Platform client initialized with ExpressMode API Key.') + click.echo('Initializing Vertex AI...') + client = vertexai.Client( + project=project, + location=region, + http_options={'headers': get_tracking_headers()}, + ) + click.echo('Vertex AI initialized.') + + is_config_agent = False + config_root_agent_file = os.path.join(agent_src_path, 'root_agent.yaml') + if os.path.exists(config_root_agent_file): + click.echo(f'Config agent detected: {config_root_agent_file}') + is_config_agent = True + + # Validate that the agent module can be imported before deployment. + if not skip_agent_import_validation: + click.echo('Validating agent module...') + _validate_agent_import(agent_src_path, adk_app_object, is_config_agent) + + adk_app_file = os.path.join(temp_folder, f'{adk_app}.py') + if adk_app_object == 'root_agent': + adk_app_type = 'agent' + elif adk_app_object == 'app': + adk_app_type = 'app' else: click.echo( - 'Failed to initialize Agent Platform client. Please provide an API' - 'key or project and region.' + f'Invalid adk_app_object: {adk_app_object}. Please use "root_agent"' + ' or "app".' ) return - - if skip_agent_import_validation: - warnings.warn( - 'WARNING: `--skip-agent-import-validation` is deprecated and will be' - ' removed in the future. Please drop it from the list of arguments.', - DeprecationWarning, - stacklevel=2, - ) - - def create_dockerfile_for_agent_engine(resource_name: str): - requirements_txt_path = os.path.join(agent_src_path, 'requirements.txt') - install_agent_deps = ( - f'RUN pip install -r "/app/agents/{app_name}/requirements.txt"' - if os.path.exists(requirements_txt_path) - else '# No requirements.txt found.' - ) - trigger_sources_option = ( - f'--trigger_sources={trigger_sources}' if trigger_sources else '' - ) - agent_engine_uri = f'agentengine://{resource_name}' - dockerfile_content = _DOCKERFILE_TEMPLATE.format( - gcp_project_id=project, - gcp_region=region, - app_name=app_name, - port=8080, - command='api_server', - install_agent_deps=install_agent_deps, - service_option=_get_service_option_by_adk_version( - adk_version, - session_service_uri or agent_engine_uri, - artifact_service_uri, - memory_service_uri or agent_engine_uri, - False, # use_local_storage - ), - trace_to_cloud_option='--trace_to_cloud' if trace_to_cloud else '', - otel_to_cloud_option='--otel_to_cloud' if otel_to_cloud else '', - allow_origins_option='', # Not supported for now. - adk_version=adk_version, - host_option='--host=0.0.0.0', - a2a_option='--a2a', - trigger_sources_option=trigger_sources_option, - gemini_enterprise_option=f'--gemini_enterprise_app_name={app_name}', - express_mode_option=( - ' --express_mode' if api_key and not project else '' - ), + with open(adk_app_file, 'w', encoding='utf-8') as f: + f.write( + _AGENT_ENGINE_APP_TEMPLATE.format( + app_name=app_name, + trace_to_cloud_option=trace_to_cloud, + is_config_agent=is_config_agent, + agent_folder=f'./{temp_folder}', + adk_app_object=adk_app_object, + adk_app_type=adk_app_type, + express_mode=api_key is not None, + ) ) - with open('Dockerfile', 'w', encoding='utf-8') as f: - f.write(dockerfile_content) - + click.echo(f'Created {adk_app_file}') + click.echo('Files and dependencies resolved') if absolutize_imports: - warnings.warn( - 'WARNING: `--absolutize_imports` is deprecated and will be removed' - ' in the future. Please drop it from the list of arguments.', - DeprecationWarning, - stacklevel=2, + click.echo( + 'Agent Engine deployments have switched to source-based deployment, ' + 'so it is no longer necessary to absolutize imports.' ) - click.echo('Deploying to Agent Platform...') - agent_config['source_packages'] = [f'agents/{app_name}', 'Dockerfile'] - agent_config['image_spec'] = {} # Use the Dockerfile + click.echo('Deploying to agent engine...') + agent_config['entrypoint_module'] = f'{temp_folder}.{adk_app}' + agent_config['entrypoint_object'] = 'adk_app' + agent_config['source_packages'] = [temp_folder] agent_config['class_methods'] = _AGENT_ENGINE_CLASS_METHODS agent_config['agent_framework'] = 'google-adk' - resource_name = agent_engine_id - if not resource_name: - agent_engine = client.agent_engines.create() - resource_name = agent_engine.api_resource.name - click.secho(f'Created a new instance: {resource_name}', fg='green') - elif project and region and not resource_name.startswith('projects/'): - resource_name = f'projects/{project}/locations/{region}/reasoningEngines/{agent_engine_id}' - click.echo('Creating Dockerfile...') - create_dockerfile_for_agent_engine(resource_name) - click.echo(f'Dockerfile created at {os.getcwd()}/Dockerfile.') - try: - client.agent_engines.update(name=resource_name, config=agent_config) - click.secho(f'Deployed to Agent Platform: {resource_name}', fg='green') - except Exception as e: - click.secho(f'Failed to deploy to Agent Platform: {e}', fg='red') - # Only delete the instance if it was newly created in this function. - if agent_engine_id is None: - client.agent_engines.delete(name=resource_name) - click.secho(f'Cleaned up the instance: {resource_name}', fg='green') - raise e - _print_agent_engine_url(resource_name) + if not agent_engine_id: + agent_engine = client.agent_engines.create(config=agent_config) + click.secho( + f'✅ Created agent engine: {agent_engine.api_resource.name}', + fg='green', + ) + _print_agent_engine_url(agent_engine.api_resource.name) + else: + if project and region and not agent_engine_id.startswith('projects/'): + agent_engine_id = f'projects/{project}/locations/{region}/reasoningEngines/{agent_engine_id}' + client.agent_engines.update(name=agent_engine_id, config=agent_config) + click.secho(f'✅ Updated agent engine: {agent_engine_id}', fg='green') + _print_agent_engine_url(agent_engine_id) finally: - temp_folder_path = os.path.join(parent_folder, temp_folder) - click.echo(f'Cleaning up the temp folder: {temp_folder_path}') - os.chdir(original_cwd) - shutil.rmtree(temp_folder_path) + click.echo(f'Cleaning up the temp folder: {temp_folder}') + shutil.rmtree(agent_src_path) + if did_change_cwd: + os.chdir(original_cwd) def to_gke( @@ -1324,7 +1276,7 @@ def to_gke( gcp_region=region, app_name=app_name, port=port, - command='api_server --with_ui' if with_ui else 'api_server', + command='web' if with_ui else 'api_server', install_agent_deps=install_agent_deps, service_option=_get_service_option_by_adk_version( adk_version, @@ -1342,8 +1294,6 @@ def to_gke( trigger_sources_option=( f'--trigger_sources={trigger_sources}' if trigger_sources else '' ), - gemini_enterprise_option='', - express_mode_option='', ) dockerfile_path = os.path.join(temp_folder, 'Dockerfile') os.makedirs(temp_folder, exist_ok=True) diff --git a/src/google/adk/cli/cli_tools_click.py b/src/google/adk/cli/cli_tools_click.py index 3f2fe370c8..fda251da10 100644 --- a/src/google/adk/cli/cli_tools_click.py +++ b/src/google/adk/cli/cli_tools_click.py @@ -23,22 +23,26 @@ import logging import os from pathlib import Path -import sys import tempfile import textwrap +from typing import Optional import click from click.core import ParameterSource from fastapi import FastAPI import uvicorn +from . import cli_create +from . import cli_deploy from .. import version from ..agents.run_config import StreamingMode from ..evaluation.constants import MISSING_EVAL_DEPENDENCIES_MESSAGE from ..features import FeatureName from ..features import override_feature_enabled from .cli import run_cli +from .fast_api import get_fast_api_app from .utils import envs +from .utils import evals from .utils import logs LOG_LEVELS = click.Choice( @@ -337,8 +341,8 @@ def cli_conformance_test( paths: tuple[str, ...], mode: str, generate_report: bool, - report_dir: str | None = None, - streaming_mode: StreamingMode | None = None, + report_dir: Optional[str] = None, + streaming_mode: Optional[StreamingMode] = None, ): """Run conformance tests to verify agent behavior consistency. @@ -471,11 +475,11 @@ def cli_conformance_test( @click.argument("app_name", type=str, required=True) def cli_create_cmd( app_name: str, - model: str | None, - api_key: str | None, - project: str | None, - region: str | None, - type: str | None, + model: Optional[str], + api_key: Optional[str], + project: Optional[str], + region: Optional[str], + type: Optional[str], ): """Creates a new app in the current folder with prepopulated agent template. @@ -485,8 +489,6 @@ def cli_create_cmd( adk create path/to/my_app """ - from . import cli_create - cli_create.run_cmd( app_name, model=model, @@ -570,11 +572,8 @@ def decorator(func): "--memory_service_uri", type=str, help=textwrap.dedent("""\ - Optional. The URI of the memory service. - If set, ADK uses this service. - \b - If unset, ADK chooses a default memory service. + Optional. The URI of the memory service. - Use 'rag://' to connect to Vertex AI Rag Memory Service. - Use 'agentengine://' to connect to Agent Engine sessions. can either be the full qualified resource @@ -648,207 +647,50 @@ def wrapper(*args, **kwargs): ), callback=validate_exclusive, ) -@click.option( - "--state", - type=str, - help="Optional. Initial state for the run as a JSON string.", -) -@click.option( - "--timeout", - type=str, - help="Optional. Timeout for a single turn or query (e.g., 30s, 5m).", -) -@click.option( - "--in_memory", - is_flag=True, - help="Optional. Do not persist session data (use in-memory storage).", -) -@click.option( - "--jsonl", - is_flag=True, - help="Optional. Output structured JSONL instead of human-readable text.", -) -@click.option( - "--default_llm_model", - type=str, - help=( - "Optional. Sets the default LLM model used when the agent does not set" - " a model explicitly." - ), - default=None, -) @click.argument( "agent", type=click.Path( exists=True, dir_okay=True, file_okay=False, resolve_path=True ), ) -@click.argument("query", type=str, required=False) def cli_run( agent: str, - query: Optional[str], save_session: bool, session_id: Optional[str], replay: Optional[str], resume: Optional[str], - state: Optional[str] = None, - timeout: Optional[str] = None, - in_memory: bool = False, - jsonl: bool = False, session_service_uri: Optional[str] = None, artifact_service_uri: Optional[str] = None, memory_service_uri: Optional[str] = None, use_local_storage: bool = True, - default_llm_model: Optional[str] = None, ): - """Runs an agent. If no query is provided, enters interactive mode. + """Runs an interactive CLI for a certain agent. AGENT: The path to the agent source code folder. - QUERY: Optional. The user message to send to the agent for a single-step run. Example: adk run path/to/my_agent - adk run path/to/my_agent "hello" """ logs.log_to_tmp_folder() agent_parent_folder = os.path.dirname(agent) agent_folder_name = os.path.basename(agent) - # If query is provided, we run in single-step mode (JSONL output) - if query is not None: - from .cli import run_once_cli - - exit_code = asyncio.run( - run_once_cli( - agent_parent_dir=agent_parent_folder, - agent_folder_name=agent_folder_name, - query=query, - state_str=state, - session_id=session_id, - replay=replay, - timeout=timeout, - in_memory=in_memory, - jsonl=jsonl, - session_service_uri=session_service_uri, - artifact_service_uri=artifact_service_uri, - memory_service_uri=memory_service_uri, - use_local_storage=use_local_storage, - default_llm_model=default_llm_model, - ) - ) - sys.exit(exit_code) - else: - # Legacy interactive mode - asyncio.run( - run_cli( - agent_parent_dir=agent_parent_folder, - agent_folder_name=agent_folder_name, - input_file=replay, - saved_session_file=resume, - save_session=save_session, - session_id=session_id, - state_str=state, - timeout=timeout, - in_memory=in_memory, - jsonl=jsonl, - session_service_uri=session_service_uri, - artifact_service_uri=artifact_service_uri, - memory_service_uri=memory_service_uri, - use_local_storage=use_local_storage, - default_llm_model=default_llm_model, - ) - ) - - -@main.command( - "test", - cls=HelpfulCommand, - context_settings={ - "allow_extra_args": True, - "allow_interspersed_args": True, - "ignore_unknown_options": True, - }, -) -@click.argument( - "folder", - type=click.Path( - exists=True, dir_okay=True, file_okay=False, resolve_path=True - ), - default=".", -) -@click.option( - "--rebuild", - is_flag=True, - help="Rebuild test files by running the real agent with user messages.", -) -@click.pass_context -def cli_test(ctx, folder: str, rebuild: bool): - """Runs pytest on agent test JSON files under the specified folder. - - FOLDER: The path to the folder containing agents and tests. - Defaults to the current directory if not specified. - - Example: - adk test path/to/agents - """ - import sys - - if rebuild: - from .agent_test_runner import rebuild_tests - - click.echo(f"Rebuilding tests in {folder}...") - rebuild_tests(folder) - sys.exit(0) - - # Parse arguments to separate pytest args (after --) from regular args - pytest_args = [] - if "--" in ctx.args: - separator_index = ctx.args.index("--") - pytest_args = ctx.args[separator_index + 1 :] - regular_args = ctx.args[:separator_index] - - if regular_args: - click.secho( - "Error: Unexpected arguments after folder and before '--':" - f" {' '.join(regular_args)}. \nOnly arguments after '--' are passed" - " to pytest.", - fg="red", - err=True, + asyncio.run( + run_cli( + agent_parent_dir=agent_parent_folder, + agent_folder_name=agent_folder_name, + input_file=replay, + saved_session_file=resume, + save_session=save_session, + session_id=session_id, + session_service_uri=session_service_uri, + artifact_service_uri=artifact_service_uri, + memory_service_uri=memory_service_uri, + use_local_storage=use_local_storage, ) - ctx.exit(2) - else: - # If no '--', all remaining arguments are passed to pytest - pytest_args = ctx.args - - import subprocess - - os.environ["ADK_TEST_FOLDER"] = folder - - current_dir = Path(__file__).parent - test_runner_path = current_dir / "agent_test_runner.py" - - if not test_runner_path.exists(): - click.secho( - f"Error: Test runner not found at {test_runner_path}", - fg="red", - err=True, - ) - sys.exit(1) - - click.echo(f"Running tests in {folder} using runner {test_runner_path}...") - - result = subprocess.run([ - sys.executable, - "-m", - "pytest", - str(test_runner_path), - "-v", - "-s", - *pytest_args, - ]) - sys.exit(result.returncode) + ) def eval_options(): @@ -902,7 +744,7 @@ def cli_eval( eval_set_file_path_or_id: list[str], config_file_path: str, print_detailed_results: bool, - eval_storage_uri: str | None = None, + eval_storage_uri: Optional[str] = None, log_level: str = "INFO", ): """Evaluates an agent given the eval sets. @@ -999,8 +841,6 @@ def cli_eval( eval_set_results_manager = None if eval_storage_uri: - from .utils import evals - gcs_eval_managers = evals.create_gcs_eval_managers_from_uri( eval_storage_uri ) @@ -1294,7 +1134,7 @@ def eval_set(): def cli_create_eval_set( agent_module_file_path: str, eval_set_id: str, - eval_storage_uri: str | None = None, + eval_storage_uri: Optional[str] = None, log_level: str = "INFO", ): """Creates an empty EvalSet given the agent_module_file_path and eval_set_id.""" @@ -1343,8 +1183,8 @@ def cli_add_eval_case( agent_module_file_path: str, eval_set_id: str, scenarios_file: str, - eval_storage_uri: str | None = None, - session_input_file: str | None = None, + eval_storage_uri: Optional[str] = None, + session_input_file: Optional[str] = None, log_level: str = "INFO", ): """Adds eval cases to the given eval set. @@ -1433,7 +1273,7 @@ def cli_generate_eval_cases( agent_module_file_path: str, eval_set_id: str, user_simulation_config_file: str, - eval_storage_uri: str | None = None, + eval_storage_uri: Optional[str] = None, log_level: str = "INFO", ): """Generates eval cases dynamically and adds them to the given eval set. @@ -1558,7 +1398,7 @@ def wrapper(*args, **kwargs): return decorator -def _deprecate_parameter(ctx, param, value): +def _deprecate_staging_bucket(ctx, param, value): if value: click.echo( click.style( @@ -1571,19 +1411,6 @@ def _deprecate_parameter(ctx, param, value): return value -def _deprecate_trace_to_cloud(ctx, param, value): - if value: - click.echo( - click.style( - f"WARNING: --{param} is deprecated and will be removed. Please" - " use --otel_to_cloud instead.", - fg="yellow", - ), - err=True, - ) - return value - - def fast_api_common_options(): """Decorator to add common fast api options to click commands.""" @@ -1729,34 +1556,11 @@ def wrapper(ctx, *args, **kwargs): return decorator -def _check_windows_reload(reload: bool) -> bool: - """Checks if reload is enabled on Windows and forces it to False if so.""" - if sys.platform == "win32" and reload: - click.secho( - "WARNING: The --reload flag is not supported on Windows because it" - " forces Uvicorn to use SelectorEventLoop, which does not support" - " subprocesses (needed for executing tools). Forcing --no-reload.", - fg="yellow", - err=True, - ) - return False - return reload - - @main.command("web") @feature_options() @fast_api_common_options() @web_options() @adk_services_options(default_use_local_storage=True) -@click.option( - "--default_llm_model", - type=str, - help=( - "Optional. Sets the default LLM model used when the agent does not set" - " a model explicitly." - ), - default=None, -) @click.argument( "agents_dir", type=click.Path( @@ -1766,38 +1570,35 @@ def _check_windows_reload(reload: bool) -> bool: ) def cli_web( agents_dir: str, - default_llm_model: Optional[str] = None, eval_storage_uri: Optional[str] = None, log_level: str = "INFO", - allow_origins: list[str] | None = None, + allow_origins: Optional[list[str]] = None, host: str = "127.0.0.1", port: int = 8000, - url_prefix: str | None = None, + url_prefix: Optional[str] = None, trace_to_cloud: bool = False, otel_to_cloud: bool = False, reload: bool = True, - session_service_uri: str | None = None, - artifact_service_uri: str | None = None, - memory_service_uri: str | None = None, + session_service_uri: Optional[str] = None, + artifact_service_uri: Optional[str] = None, + memory_service_uri: Optional[str] = None, use_local_storage: bool = True, a2a: bool = False, reload_agents: bool = False, - extra_plugins: list[str] | None = None, - logo_text: str | None = None, - logo_image_url: str | None = None, - trigger_sources: list[str] | None = None, + extra_plugins: Optional[list[str]] = None, + logo_text: Optional[str] = None, + logo_image_url: Optional[str] = None, + trigger_sources: Optional[list[str]] = None, ): """Starts a FastAPI server with Web UI for agents. - AGENTS_DIR: The directory of agents (where each subdirectory is a single - agent containing `agent.py` or `root_agent.yaml` files) or a path pointing - directly to a single agent folder. + AGENTS_DIR: The directory of agents, where each subdirectory is a single + agent, containing at least `__init__.py` and `agent.py` files. Example: adk web --session_service_uri=[uri] --port=[port] path/to/agents_dir """ - reload = _check_windows_reload(reload) logs.setup_adk_logger(getattr(logging, log_level.upper())) @asynccontextmanager @@ -1822,8 +1623,6 @@ async def _lifespan(app: FastAPI): fg="green", ) - from .fast_api import get_fast_api_app - app = get_fast_api_app( agents_dir=agents_dir, session_service_uri=session_service_uri, @@ -1845,7 +1644,6 @@ async def _lifespan(app: FastAPI): logo_text=logo_text, logo_image_url=logo_image_url, trigger_sources=trigger_sources, - default_llm_model=default_llm_model, ) config = uvicorn.Config( app, @@ -1879,76 +1677,38 @@ async def _lifespan(app: FastAPI): "Automatically create a session if it doesn't exist when calling /run." ), ) -@click.option( - "--with_ui", - is_flag=True, - default=False, - help="Serve ADK Web UI if set.", -) -@click.option( - "--gemini_enterprise_app_name", - type=str, - default=None, - help=( - "The app_name to register with Gemini Enterprise via" - " https://docs.cloud.google.com/gemini/enterprise/docs/register-and-manage-an-adk-agent" - ), -) -@click.option( - "--express_mode", - is_flag=True, - default=False, - help=( - "Whether or not to initialize the server in express mode. This is only" - " supported when gemini_enterprise_app_name is set. Defaults to" - " False." - ), -) def cli_api_server( agents_dir: str, - eval_storage_uri: str | None = None, + eval_storage_uri: Optional[str] = None, log_level: str = "INFO", - allow_origins: list[str] | None = None, + allow_origins: Optional[list[str]] = None, host: str = "127.0.0.1", port: int = 8000, - url_prefix: str | None = None, + url_prefix: Optional[str] = None, trace_to_cloud: bool = False, otel_to_cloud: bool = False, reload: bool = True, - session_service_uri: str | None = None, - artifact_service_uri: str | None = None, - memory_service_uri: str | None = None, + session_service_uri: Optional[str] = None, + artifact_service_uri: Optional[str] = None, + memory_service_uri: Optional[str] = None, use_local_storage: bool = True, a2a: bool = False, reload_agents: bool = False, - extra_plugins: list[str] | None = None, + extra_plugins: Optional[list[str]] = None, auto_create_session: bool = False, - trigger_sources: list[str] | None = None, - with_ui: bool = False, - gemini_enterprise_app_name: str | None = None, - express_mode: bool = False, + trigger_sources: Optional[list[str]] = None, ): """Starts a FastAPI server for agents. - AGENTS_DIR: The directory of agents (where each subdirectory is a single - agent containing `agent.py` or `root_agent.yaml` files) or a path pointing - directly to a single agent folder. + AGENTS_DIR: The directory of agents, where each subdirectory is a single + agent, containing at least `__init__.py` and `agent.py` files. Example: adk api_server --session_service_uri=[uri] --port=[port] path/to/agents_dir """ - reload = _check_windows_reload(reload) - if express_mode and not gemini_enterprise_app_name: - raise click.UsageError( - "--express_mode is only supported when --gemini_enterprise_app_name is" - " set." - ) - logs.setup_adk_logger(getattr(logging, log_level.upper())) - from .fast_api import get_fast_api_app - config = uvicorn.Config( get_fast_api_app( agents_dir=agents_dir, @@ -1958,7 +1718,7 @@ def cli_api_server( use_local_storage=use_local_storage, eval_storage_uri=eval_storage_uri, allow_origins=allow_origins, - web=with_ui, + web=False, trace_to_cloud=trace_to_cloud, otel_to_cloud=otel_to_cloud, a2a=a2a, @@ -1969,8 +1729,6 @@ def cli_api_server( extra_plugins=extra_plugins, auto_create_session=auto_create_session, trigger_sources=trigger_sources, - gemini_enterprise_app_name=gemini_enterprise_app_name, - express_mode=express_mode, ), host=host, port=port, @@ -2126,8 +1884,8 @@ def cli_api_server( def cli_deploy_cloud_run( ctx, agent: str, - project: str | None, - region: str | None, + project: Optional[str], + region: Optional[str], service_name: str, app_name: str, temp_folder: str, @@ -2143,7 +1901,7 @@ def cli_deploy_cloud_run( memory_service_uri: Optional[str] = None, use_local_storage: bool = False, a2a: bool = False, - trigger_sources: str | None = None, + trigger_sources: Optional[str] = None, ): """Deploys an agent to Cloud Run. @@ -2191,8 +1949,6 @@ def cli_deploy_cloud_run( ctx.exit(2) try: - from . import cli_deploy - cli_deploy.to_cloud_run( agent_folder=agent, project=project, @@ -2249,33 +2005,15 @@ def migrate(): default="INFO", help="Optional. Set the logging level", ) -@click.option( # type: ignore[untyped-decorator] - "--allow-unsafe-unpickling", - "--allow_unsafe_unpickling", - is_flag=True, - default=False, - help=( - "Optional. Allow unsafe pickle loading for trusted legacy session" - " databases." - ), -) def cli_migrate_session( - *, - source_db_url: str, - dest_db_url: str, - log_level: str, - allow_unsafe_unpickling: bool, + *, source_db_url: str, dest_db_url: str, log_level: str ): """Migrates a session database to the latest schema version.""" logs.setup_adk_logger(getattr(logging, log_level.upper())) try: from ..sessions.migration import migration_runner - migration_runner.upgrade( - source_db_url, - dest_db_url, - allow_unsafe_unpickling=allow_unsafe_unpickling, - ) + migration_runner.upgrade(source_db_url, dest_db_url) click.secho("Migration check and upgrade process finished.", fg="green") except Exception as e: click.secho(f"Migration failed: {e}", fg="red", err=True) @@ -2319,7 +2057,7 @@ def cli_migrate_session( type=str, default=None, help="Deprecated. This argument is no longer required or used.", - callback=_deprecate_parameter, + callback=_deprecate_staging_bucket, ) @click.option( "--agent_engine_id", @@ -2341,8 +2079,7 @@ def cli_migrate_session( is_flag=True, show_default=True, default=None, - help=" NOTE: This flag is deprecated and will be removed in the future.", - callback=_deprecate_trace_to_cloud, + help="Optional. Whether to enable Cloud Trace for Agent Engine.", ) @click.option( "--otel_to_cloud", @@ -2369,9 +2106,11 @@ def cli_migrate_session( @click.option( "--adk_app", type=str, - default=None, - help=" NOTE: This flag is deprecated and will be removed in the future.", - callback=_deprecate_parameter, + default="agent_engine_app", + help=( + "Optional. Python file for defining the ADK application" + " (default: a file named agent_engine_app.py)" + ), ) @click.option( "--temp_folder", @@ -2387,29 +2126,35 @@ def cli_migrate_session( "--adk_app_object", type=str, default=None, - help=" NOTE: This flag is deprecated and will be removed in the future.", - callback=_deprecate_parameter, + help=( + "Optional. Python object corresponding to the root ADK agent or app." + " It can only be `root_agent` or `app`. (default: `root_agent`)" + ), ) @click.option( "--env_file", type=str, default="", - help=" NOTE: This flag is deprecated and will be removed in the future.", - callback=_deprecate_parameter, + help=( + "Optional. The filepath to the `.env` file for environment variables." + " (default: the `.env` file in the `agent` directory, if any.)" + ), ) @click.option( "--requirements_file", type=str, default="", - help=" NOTE: This flag is deprecated and will be removed in the future.", - callback=_deprecate_parameter, + help=( + "Optional. The filepath to the `requirements.txt` file to use." + " (default: the `requirements.txt` file in the `agent` directory, if" + " any.)" + ), ) @click.option( "--absolutize_imports", type=bool, default=False, help=" NOTE: This flag is deprecated and will be removed in the future.", - callback=_deprecate_parameter, ) @click.option( "--agent_engine_config_file", @@ -2425,39 +2170,22 @@ def cli_migrate_session( @click.option( "--validate-agent-import/--no-validate-agent-import", default=False, - help=" NOTE: This flag is deprecated and will be removed in the future.", - callback=_deprecate_parameter, + help=( + "Optional. Validate that the agent module can be imported before" + " deployment. This requires your local environment to have the same" + " dependencies as the deployment environment. (default: disabled)" + ), ) @click.option( "--skip-agent-import-validation", "skip_agent_import_validation_alias", is_flag=True, default=False, - help=" NOTE: This flag is deprecated and will be removed in the future.", - callback=_deprecate_parameter, -) -# Kept as raw str (not parsed to list) — interpolated directly into Dockerfile CMD. -@click.option( - "--trigger_sources", - type=str, help=( - "Optional. Comma-separated list of trigger sources to enable" - " (e.g., 'pubsub,eventarc'). Registers /trigger/* endpoints" - " for batch and event-driven agent invocations." - ), - default=None, -) -@click.option( - "--adk_version", - type=str, - default=version.__version__, - show_default=True, - help=( - "Optional. The ADK version used in Agent Engine deployment. (default: " - " the version in the dev environment)" + "Optional. Skip pre-deployment import validation of `agent.py`. This is" + " the default; use --validate-agent-import to enable validation." ), ) -@adk_services_options(default_use_local_storage=False) @click.argument( "agent", type=click.Path( @@ -2466,30 +2194,24 @@ def cli_migrate_session( ) def cli_deploy_agent_engine( agent: str, - project: str | None, - region: str | None, - staging_bucket: str | None, - agent_engine_id: str | None, - trace_to_cloud: bool | None, - otel_to_cloud: bool | None, - api_key: str | None, + project: Optional[str], + region: Optional[str], + staging_bucket: Optional[str], + agent_engine_id: Optional[str], + trace_to_cloud: Optional[bool], + otel_to_cloud: Optional[bool], + api_key: Optional[str], display_name: str, description: str, - adk_app: str | None, - adk_app_object: str | None, - temp_folder: str | None, + adk_app: str, + adk_app_object: Optional[str], + temp_folder: Optional[str], env_file: str, requirements_file: str, absolutize_imports: bool, agent_engine_config_file: str, validate_agent_import: bool = False, skip_agent_import_validation_alias: bool = False, - adk_version: str | None = None, - trigger_sources: str | None = None, - artifact_service_uri: str | None = None, - memory_service_uri: str | None = None, - session_service_uri: str | None = None, - use_local_storage: bool = False, ): """Deploys an agent to Agent Engine. @@ -2511,8 +2233,6 @@ def cli_deploy_agent_engine( "Do not pass both --validate-agent-import and" " --skip-agent-import-validation." ) - from . import cli_deploy - cli_deploy.to_agent_engine( agent_folder=agent, project=project, @@ -2531,11 +2251,6 @@ def cli_deploy_agent_engine( absolutize_imports=absolutize_imports, agent_engine_config_file=agent_engine_config_file, skip_agent_import_validation=not validate_agent_import, - trigger_sources=trigger_sources, - artifact_service_uri=artifact_service_uri, - memory_service_uri=memory_service_uri, - session_service_uri=session_service_uri, - adk_version=adk_version, ) except Exception as e: click.secho(f"Deploy failed: {e}", fg="red", err=True) @@ -2672,8 +2387,8 @@ def cli_deploy_agent_engine( ) def cli_deploy_gke( agent: str, - project: str | None, - region: str | None, + project: Optional[str], + region: Optional[str], cluster_name: str, service_name: str, app_name: str, @@ -2684,12 +2399,12 @@ def cli_deploy_gke( with_ui: bool, adk_version: str, service_type: str, - log_level: str | None = None, - session_service_uri: str | None = None, - artifact_service_uri: str | None = None, - memory_service_uri: str | None = None, + log_level: Optional[str] = None, + session_service_uri: Optional[str] = None, + artifact_service_uri: Optional[str] = None, + memory_service_uri: Optional[str] = None, use_local_storage: bool = False, - trigger_sources: str | None = None, + trigger_sources: Optional[str] = None, ): """Deploys an agent to GKE. @@ -2702,8 +2417,6 @@ def cli_deploy_gke( """ try: _warn_if_with_ui(with_ui) - from . import cli_deploy - cli_deploy.to_gke( agent_folder=agent, project=project, diff --git a/src/google/adk/cli/dev_server.py b/src/google/adk/cli/dev_server.py deleted file mode 100644 index 13e4cdf234..0000000000 --- a/src/google/adk/cli/dev_server.py +++ /dev/null @@ -1,1295 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Development server with all ADK endpoints. - -This module provides the DevServer class which extends ApiServer with development-only endpoints. -All production endpoints are inherited from ApiServer. -All dev-only endpoints (eval, debug, graph, test management) are added by DevServer. - -Use this for local development with `adk web`. -For production deployments, use api_server.py instead. -""" - -from __future__ import annotations - -import asyncio -import json -import logging -import os -from pathlib import Path -import shutil -import time -from typing import Any -from typing import Optional - -from fastapi import FastAPI -from fastapi import HTTPException -from fastapi import Response -from fastapi import UploadFile -from fastapi.responses import FileResponse -from fastapi.responses import PlainTextResponse -from fastapi.responses import StreamingResponse -from fastapi.staticfiles import StaticFiles -import graphviz -from pydantic import Field -from pydantic import ValidationError -from typing_extensions import deprecated -import yaml - -from . import agent_graph -from ..agents.base_agent import BaseAgent -from ..errors.not_found_error import NotFoundError -from ..evaluation.base_eval_service import InferenceConfig -from ..evaluation.base_eval_service import InferenceRequest -from ..evaluation.eval_case import EvalCase -from ..evaluation.eval_case import SessionInput -from ..evaluation.eval_metrics import EvalMetric -from ..evaluation.eval_metrics import EvalMetricResult -from ..evaluation.eval_metrics import EvalMetricResultPerInvocation -from ..evaluation.eval_metrics import EvalStatus -from ..evaluation.eval_metrics import MetricInfo -from ..evaluation.eval_result import EvalSetResult -from ..evaluation.eval_set import EvalSet -from ..events.event import Event -from .api_server import ApiServer -from .cli_eval import EVAL_SESSION_ID_PREFIX -from .utils import common -from .utils import evals -from .utils.graph_serialization import serialize_app_info -from .utils.graph_visualization import plot_workflow_graph -from .utils.state import create_empty_state - -logger = logging.getLogger("google_adk." + __name__) - -_EVAL_SET_FILE_EXTENSION = ".evalset.json" - -TAG_DEBUG = "Debug" -TAG_EVALUATION = "Evaluation" - - -class CreateTestRequest(common.BaseModel): - session_data: dict - - -class AddSessionToEvalSetRequest(common.BaseModel): - eval_id: str - session_id: str - user_id: str - - -class RunEvalRequest(common.BaseModel): - eval_ids: list[str] = Field( - deprecated=True, - default_factory=list, - description="This field is deprecated, use eval_case_ids instead.", - ) - eval_case_ids: list[str] = Field( - default_factory=list, - description=( - "List of eval case ids to evaluate. if empty, then all eval cases in" - " the eval set are run." - ), - ) - eval_metrics: list[EvalMetric] - - -class RunEvalResult(common.BaseModel): - eval_set_file: str - eval_set_id: str - eval_id: str - final_eval_status: EvalStatus - eval_metric_results: list[tuple[EvalMetric, EvalMetricResult]] = Field( - deprecated=True, - default=[], - description=( - "This field is deprecated, use overall_eval_metric_results instead." - ), - ) - overall_eval_metric_results: list[EvalMetricResult] - eval_metric_result_per_invocation: list[EvalMetricResultPerInvocation] - user_id: str - session_id: str - - -class RunEvalResponse(common.BaseModel): - run_eval_results: list[RunEvalResult] - - -class GetEventGraphResult(common.BaseModel): - dot_src: str - - -class CreateEvalSetRequest(common.BaseModel): - eval_set: EvalSet - - -class ListEvalSetsResponse(common.BaseModel): - eval_set_ids: list[str] - - -class EvalResult(EvalSetResult): - """This class has no field intentionally. - - The goal here is to just give a new name to the class to align with the API - endpoint. - """ - - -class ListEvalResultsResponse(common.BaseModel): - eval_result_ids: list[str] - - -class ListMetricsInfoResponse(common.BaseModel): - metrics_info: list[MetricInfo] - - -class DevServer(ApiServer): - """Development server that extends ApiServer with dev-only endpoints. - - Inherits all production endpoints from ApiServer and adds development-specific - endpoints for evaluation, debugging, and developer UI features. - """ - - def _register_dev_endpoints( - self, - app: FastAPI, - trace_dict: dict, - memory_exporter: Any, - web_assets_dir: Optional[str] = None, - ): - """Register all development-only endpoints. - - This includes debug, evaluation, and graph visualization endpoints. - These endpoints should NOT be exposed in production deployments. - """ - - # Import needed for eval endpoints - from ..evaluation.constants import MISSING_EVAL_DEPENDENCIES_MESSAGE - - # ========== BUILDER / YAML EDITOR ENDPOINTS ========== - agents_base_path = (Path.cwd() / self.agents_dir).resolve() - - def _get_app_root(app_name: str) -> Path: - if app_name in ("", ".", ".."): - raise ValueError(f"Invalid app name: {app_name!r}") - if Path(app_name).name != app_name or "\\" in app_name: - raise ValueError(f"Invalid app name: {app_name!r}") - app_root = (agents_base_path / app_name).resolve() - if not app_root.is_relative_to(agents_base_path): - raise ValueError(f"Invalid app name: {app_name!r}") - return app_root - - def _normalize_relative_path(path: str) -> str: - return path.replace("\\", "/").lstrip("/") - - def _has_parent_reference(path: str) -> bool: - return any(part == ".." for part in path.split("/")) - - _ALLOWED_EXTENSIONS = frozenset({".yaml", ".yml"}) - - # --- YAML content security --- - _BLOCKED_YAML_KEYS = frozenset({"args"}) - - def _check_yaml_for_blocked_keys(content: bytes, filename: str) -> None: - """Raise if the YAML document contains any blocked keys.""" - try: - docs = list(yaml.safe_load_all(content)) - except yaml.YAMLError as exc: - raise ValueError(f"Invalid YAML in {filename!r}: {exc}") from exc - - def _walk(node: Any) -> None: - if isinstance(node, dict): - for key, value in node.items(): - if key in _BLOCKED_YAML_KEYS: - raise ValueError( - f"Blocked key {key!r} found in {filename!r}. " - f"The '{key}' field is not allowed in builder uploads " - "because it can execute arbitrary code." - ) - _walk(value) - elif isinstance(node, list): - for item in node: - _walk(item) - - for doc in docs: - _walk(doc) - - def _parse_upload_filename(app_name: str, filename: Optional[str]) -> str: - if not filename: - raise ValueError("Upload filename is missing.") - filename = _normalize_relative_path(filename) - prefix = f"{app_name}/" - if filename.startswith(prefix): - rel_path = filename[len(prefix) :] - else: - rel_path = filename - if not rel_path: - raise ValueError(f"Invalid upload filename: {filename!r}") - if rel_path.startswith("/"): - raise ValueError(f"Absolute upload path rejected: {filename!r}") - if _has_parent_reference(rel_path): - raise ValueError(f"Path traversal rejected: {filename!r}") - ext = os.path.splitext(rel_path)[1].lower() - if ext not in _ALLOWED_EXTENSIONS: - raise ValueError( - f"File type not allowed: {rel_path!r}" - f" (allowed: {', '.join(sorted(_ALLOWED_EXTENSIONS))})" - ) - return rel_path - - def _parse_file_path(file_path: str) -> str: - file_path = _normalize_relative_path(file_path) - if not file_path: - raise ValueError("file_path is missing.") - if file_path.startswith("/"): - raise ValueError(f"Absolute file_path rejected: {file_path!r}") - if _has_parent_reference(file_path): - raise ValueError(f"Path traversal rejected: {file_path!r}") - ext = os.path.splitext(file_path)[1].lower() - if ext not in _ALLOWED_EXTENSIONS: - raise ValueError( - f"File type not allowed: {file_path!r}" - f" (allowed: {', '.join(sorted(_ALLOWED_EXTENSIONS))})" - ) - return file_path - - def _resolve_under_dir(root_dir: Path, rel_path: str) -> Path: - file_path = root_dir / rel_path - resolved_root_dir = root_dir.resolve() - resolved_file_path = file_path.resolve() - if not resolved_file_path.is_relative_to(resolved_root_dir): - raise ValueError(f"Path escapes root_dir: {rel_path!r}") - return file_path - - def _get_tmp_agent_root(app_root: Path, app_name: str) -> Path: - tmp_agent_root = app_root / "tmp" / app_name - resolved_tmp_agent_root = tmp_agent_root.resolve() - if not resolved_tmp_agent_root.is_relative_to(app_root): - raise ValueError(f"Invalid tmp path for app: {app_name!r}") - return tmp_agent_root - - def copy_dir_contents(source_dir: Path, dest_dir: Path) -> None: - dest_dir.mkdir(parents=True, exist_ok=True) - for source_path in source_dir.iterdir(): - if source_path.name == "tmp": - continue - - dest_path = dest_dir / source_path.name - if source_path.is_dir(): - if dest_path.exists() and dest_path.is_file(): - dest_path.unlink() - shutil.copytree(source_path, dest_path, dirs_exist_ok=True) - elif source_path.is_file(): - if dest_path.exists() and dest_path.is_dir(): - shutil.rmtree(dest_path) - shutil.copy2(source_path, dest_path) - - def cleanup_tmp(app_name: str) -> bool: - try: - app_root = _get_app_root(app_name) - except ValueError as exc: - logger.exception("Error in cleanup_tmp: %s", exc) - return False - - try: - tmp_agent_root = _get_tmp_agent_root(app_root, app_name) - except ValueError as exc: - logger.exception("Error in cleanup_tmp: %s", exc) - return False - - try: - shutil.rmtree(tmp_agent_root) - except FileNotFoundError: - pass - except OSError as exc: - logger.exception("Error deleting tmp agent root: %s", exc) - return False - - tmp_dir = app_root / "tmp" - resolved_tmp_dir = tmp_dir.resolve() - if not resolved_tmp_dir.is_relative_to(app_root): - logger.error( - "Refusing to delete tmp outside app_root: %s", resolved_tmp_dir - ) - return False - - try: - tmp_dir.rmdir() - except OSError: - pass - - return True - - def ensure_tmp_exists(app_name: str) -> bool: - try: - app_root = _get_app_root(app_name) - except ValueError as exc: - logger.exception("Error in ensure_tmp_exists: %s", exc) - return False - - if not app_root.is_dir(): - return False - - try: - tmp_agent_root = _get_tmp_agent_root(app_root, app_name) - except ValueError as exc: - logger.exception("Error in ensure_tmp_exists: %s", exc) - return False - - if tmp_agent_root.exists(): - return True - - try: - tmp_agent_root.mkdir(parents=True, exist_ok=True) - copy_dir_contents(app_root, tmp_agent_root) - except OSError as exc: - logger.exception("Error in ensure_tmp_exists: %s", exc) - return False - - return True - - @app.post( - "/dev/apps/{app_name}/builder/save", response_model_exclude_none=True - ) - async def builder_build( - app_name: str, files: list[UploadFile], tmp: Optional[bool] = False - ) -> bool: - try: - uploads: list[tuple[str, bytes]] = [] - for file in files: - rel_path = _parse_upload_filename(app_name, file.filename) - content = await file.read() - uploads.append((rel_path, content)) - - for rel_path, content in uploads: - _check_yaml_for_blocked_keys(content, f"{app_name}/{rel_path}") - - if tmp: - app_root = _get_app_root(app_name) - tmp_agent_root = _get_tmp_agent_root(app_root, app_name) - tmp_agent_root.mkdir(parents=True, exist_ok=True) - - for rel_path, content in uploads: - destination_path = _resolve_under_dir(tmp_agent_root, rel_path) - destination_path.parent.mkdir(parents=True, exist_ok=True) - destination_path.write_bytes(content) - - return True - - app_root = _get_app_root(app_name) - app_root.mkdir(parents=True, exist_ok=True) - - tmp_agent_root = _get_tmp_agent_root(app_root, app_name) - if tmp_agent_root.is_dir(): - copy_dir_contents(tmp_agent_root, app_root) - - for rel_path, content in uploads: - destination_path = _resolve_under_dir(app_root, rel_path) - destination_path.parent.mkdir(parents=True, exist_ok=True) - destination_path.write_bytes(content) - - return cleanup_tmp(app_name) - except ValueError as exc: - logger.exception("Error in builder_build: %s", exc) - raise HTTPException(status_code=400, detail=str(exc)) - except OSError as exc: - logger.exception("Error in builder_build: %s", exc) - return False - - @app.post( - "/dev/apps/{app_name}/builder/cancel", response_model_exclude_none=True - ) - async def builder_cancel(app_name: str) -> bool: - return cleanup_tmp(app_name) - - @app.get( - "/dev/apps/{app_name}/builder", - response_model_exclude_none=True, - response_class=PlainTextResponse, - ) - async def get_agent_builder( - app_name: str, - file_path: Optional[str] = None, - tmp: Optional[bool] = False, - ): - try: - app_root = _get_app_root(app_name) - except ValueError as exc: - logger.exception("Error in get_agent_builder: %s", exc) - return "" - - agent_dir = app_root - if tmp: - if not ensure_tmp_exists(app_name): - return "" - agent_dir = app_root / "tmp" / app_name - - if not file_path: - rel_path = "root_agent.yaml" - else: - try: - rel_path = _parse_file_path(file_path) - except ValueError as exc: - logger.exception("Error in get_agent_builder: %s", exc) - return "" - - try: - agent_file_path = _resolve_under_dir(agent_dir, rel_path) - except ValueError as exc: - logger.exception("Error in get_agent_builder: %s", exc) - return "" - - if not agent_file_path.is_file(): - return "" - - return FileResponse( - path=agent_file_path, - media_type="application/x-yaml", - filename=file_path or f"{app_name}.yaml", - headers={"Cache-Control": "no-store"}, - ) - - # ========== DEBUG & GRAPH ENDPOINTS ========== - - @app.get("/dev/apps/{app_name}/debug/trace/{event_id}", tags=[TAG_DEBUG]) - async def get_trace_dict(app_name: str, event_id: str) -> Any: - event_dict = trace_dict.get(event_id, None) - if event_dict is None: - raise HTTPException(status_code=404, detail="Trace not found") - return event_dict - - @app.get( - "/dev/apps/{app_name}/debug/trace/session/{session_id}", - tags=[TAG_DEBUG], - ) - async def get_session_trace(app_name: str, session_id: str) -> Any: - spans = memory_exporter.get_finished_spans(session_id) - if not spans: - return [] - return [ - { - "name": s.name, - "span_id": s.context.span_id, - "trace_id": s.context.trace_id, - "start_time": s.start_time, - "end_time": s.end_time, - "attributes": dict(s.attributes), - "parent_span_id": s.parent.span_id if s.parent else None, - } - for s in spans - ] - - if web_assets_dir: - # TODO: remove this endpoint once build_graph_image is completed - @app.get("/dev/apps/{app_name}/build_graph") - async def get_app_info(app_name: str) -> Any: - runner = await self.get_runner_async(app_name) - - if not runner.app: - raise HTTPException( - status_code=404, detail=f"App not found: {app_name}" - ) - - # Read README.md if it exists - readme_content = None - if self.agents_dir: - import os - - readme_path = os.path.join(self.agents_dir, app_name, "README.md") - if os.path.exists(readme_path): - try: - with open(readme_path, "r", encoding="utf-8") as f: - readme_content = f.read() - except Exception as e: - print(f"Error reading README.md: {e}") - - return serialize_app_info(runner.app, readme_content) - - @app.get("/dev/apps/{app_name}/build_graph_image") - async def get_app_info_image( - app_name: str, dark_mode: bool = False, node: Optional[str] = None - ) -> dict[str, GetEventGraphResult]: - runner = await self.get_runner_async(app_name) - - if not runner.app: - raise HTTPException( - status_code=404, detail=f"App not found: {app_name}" - ) - - app_info = serialize_app_info(runner.app) - - # Navigate to specific level if node is provided - if node: - target_agent = self._navigate_to_node(app_info, node) - if not target_agent: - raise HTTPException(status_code=404, detail=f"Node not found: {node}") - # Create a temporary app_info structure for the target level - app_info = {"root_agent": target_agent} - - workflows = self._get_all_sub_workflows(app_info, node if node else "") - - # This allows plotting non-workflow agents as a tree. - target_path = node if node else "" - if target_path not in workflows: - target_agent = app_info.get("root_agent") - if target_agent: - workflows[target_path] = target_agent - - results = {} - for path, info in workflows.items(): - dot_string = plot_workflow_graph( - {"root_agent": info}, format="dot", dark_mode=dark_mode - ) - if dot_string: - results[path] = GetEventGraphResult(dot_src=dot_string) - - return results - - # ========== AGENT TESTING ENDPOINTS ========== - - @app.get("/dev/apps/{app_name}/tests") - async def list_tests(app_name: str) -> list[str]: - """Lists all test JSON files for the given app.""" - agent_dir = os.path.join(self.agents_dir, app_name) - tests_dir = os.path.join(agent_dir, "tests") - if not os.path.exists(tests_dir): - return [] - - import glob - - pattern = os.path.join(tests_dir, "*.json") - test_files = glob.glob(pattern) - return sorted([os.path.basename(f) for f in test_files]) - - @app.post("/dev/apps/{app_name}/tests/rebuild") - async def rebuild_app_tests( - app_name: str, test_name: Optional[str] = None - ) -> dict[str, str]: - """Rebuilds tests for the app.""" - agent_dir = os.path.join(self.agents_dir, app_name) - - if test_name: - if not test_name.endswith(".json"): - test_name += ".json" - path = os.path.join(agent_dir, "tests", test_name) - else: - path = agent_dir - - from .agent_test_runner import rebuild_tests - - await asyncio.to_thread(rebuild_tests, path) - return {"status": "success"} - - @app.post("/dev/apps/{app_name}/tests/run") - async def run_app_tests( - app_name: str, test_name: Optional[str] = None - ) -> StreamingResponse: - """Runs tests and streams pytest output.""" - agent_dir = os.path.join(self.agents_dir, app_name) - - import subprocess - import sys - - queue = asyncio.Queue() - - async def run_pytest_subprocess(): - cmd_args = [ - sys.executable, - "-m", - "pytest", - os.path.join(os.path.dirname(__file__), "agent_test_runner.py"), - "-s", - "-vv", - ] - if test_name: - name_to_use = ( - test_name[:-5] if test_name.endswith(".json") else test_name - ) - cmd_args.extend(["-k", name_to_use]) - - # Ensure environment variable is set - env = os.environ.copy() - env["ADK_TEST_FOLDER"] = agent_dir - - try: - process = await asyncio.create_subprocess_exec( - *cmd_args, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - env=env, - ) - - while True: - line = await process.stdout.readline() - if not line: - break - await queue.put(line.decode("utf-8")) - - await process.wait() - finally: - # Signal completion to generator - await queue.put(None) - - # Start pytest in a background task - asyncio.create_task(run_pytest_subprocess()) - - async def generate(): - while True: - item = await queue.get() - if item is None: - break - yield item.encode("utf-8") - - return StreamingResponse(generate(), media_type="text/plain") - - @app.put("/dev/apps/{app_name}/tests/{test_name}") - async def create_test( - app_name: str, test_name: str, req: CreateTestRequest - ) -> dict[str, str]: - """Creates or updates a test file from session data.""" - # Sanitize test_name to prevent directory traversal - test_name = os.path.basename(test_name) - agent_dir = os.path.join(self.agents_dir, app_name) - tests_dir = os.path.join(agent_dir, "tests") - os.makedirs(tests_dir, exist_ok=True) - - if not test_name.endswith(".json"): - test_name += ".json" - - test_file_path = os.path.join(tests_dir, test_name) - - with open(test_file_path, "w") as f: - json.dump(req.session_data, f, indent=2, sort_keys=True) - - return {"status": "success", "file": test_name} - - @app.delete("/dev/apps/{app_name}/tests/{test_name}") - async def delete_test(app_name: str, test_name: str) -> dict[str, str]: - """Deletes a specific test file.""" - agent_dir = os.path.join(self.agents_dir, app_name) - tests_dir = os.path.join(agent_dir, "tests") - - if not test_name.endswith(".json"): - test_name += ".json" - - test_file_path = os.path.join(tests_dir, test_name) - - if not os.path.exists(test_file_path): - raise HTTPException(status_code=404, detail="Test file not found") - - os.remove(test_file_path) - return {"status": "success"} - - @app.get("/dev/apps/{app_name}/tests/{test_name}") - async def get_test_content(app_name: str, test_name: str) -> dict[str, Any]: - """Fetches the content of a specific test file.""" - agent_dir = os.path.join(self.agents_dir, app_name) - tests_dir = os.path.join(agent_dir, "tests") - - if not test_name.endswith(".json"): - test_name += ".json" - - test_file_path = os.path.join(tests_dir, test_name) - - if not os.path.exists(test_file_path): - raise HTTPException(status_code=404, detail="Test file not found") - - with open(test_file_path, "r") as f: - return json.load(f) - - # ========== EVALUATION ENDPOINTS ========== - - @app.post( - "/dev/apps/{app_name}/eval-sets", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def create_eval_set( - app_name: str, create_eval_set_request: CreateEvalSetRequest - ) -> EvalSet: - try: - return self.eval_sets_manager.create_eval_set( - app_name=app_name, - eval_set_id=create_eval_set_request.eval_set.eval_set_id, - ) - except ValueError as ve: - raise HTTPException( - status_code=400, - detail=str(ve), - ) from ve - - # TODO - remove after migration - @deprecated( - "Please use create_eval_set instead. This will be removed in future" - " releases." - ) - @app.post( - "/dev/apps/{app_name}/eval_sets/{eval_set_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def create_eval_set_legacy( - app_name: str, - eval_set_id: str, - ): - """Creates an eval set, given the id.""" - await create_eval_set( - app_name=app_name, - create_eval_set_request=CreateEvalSetRequest( - eval_set=UserEvalSet(eval_set_id=eval_set_id, eval_cases=[]), - ), - ) - - # TODO - remove after migration - @deprecated( - "Please use list_eval_sets instead. This will be removed in future" - " releases." - ) - @app.get( - "/dev/apps/{app_name}/eval_sets", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_eval_sets_legacy(app_name: str) -> list[str]: - list_eval_sets_response = await list_eval_sets(app_name) - return list_eval_sets_response.eval_set_ids - - # TODO - remove after migration - @deprecated( - "Please use run_eval instead. This will be removed in future releases." - ) - @app.post( - "/dev/apps/{app_name}/eval_sets/{eval_set_id}/run_eval", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def run_eval_legacy( - app_name: str, eval_set_id: str, req: RunEvalRequest - ) -> list[RunEvalResult]: - run_eval_response = await run_eval( - app_name=app_name, eval_set_id=eval_set_id, req=req - ) - return run_eval_response.run_eval_results - - # TODO - remove after migration - @deprecated( - "Please use get_eval_result instead. This will be removed in future" - " releases." - ) - @app.get( - "/dev/apps/{app_name}/eval_results/{eval_result_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def get_eval_result_legacy( - app_name: str, - eval_result_id: str, - ) -> EvalSetResult: - try: - return self.eval_set_results_manager.get_eval_set_result( - app_name, eval_result_id - ) - except ValueError as ve: - raise HTTPException(status_code=404, detail=str(ve)) from ve - except ValidationError as ve: - raise HTTPException(status_code=500, detail=str(ve)) from ve - - # TODO - remove after migration - @deprecated( - "Please use list_eval_results instead. This will be removed in future" - " releases." - ) - @app.get( - "/dev/apps/{app_name}/eval_results", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_eval_results_legacy(app_name: str) -> list[str]: - list_eval_results_response = await list_eval_results(app_name) - return list_eval_results_response.eval_result_ids - - @app.get( - "/dev/apps/{app_name}/eval-sets", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_eval_sets(app_name: str) -> ListEvalSetsResponse: - """Lists all eval sets for the given app.""" - eval_sets = [] - try: - eval_sets = self.eval_sets_manager.list_eval_sets(app_name) - except NotFoundError as e: - logger.warning(e) - - return ListEvalSetsResponse(eval_set_ids=eval_sets) - - @app.post( - "/dev/apps/{app_name}/eval-sets/{eval_set_id}/add-session", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - @app.post( - "/dev/apps/{app_name}/eval_sets/{eval_set_id}/add_session", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def add_session_to_eval_set( - app_name: str, eval_set_id: str, req: AddSessionToEvalSetRequest - ): - # Get the session - session = await self.session_service.get_session( - app_name=app_name, user_id=req.user_id, session_id=req.session_id - ) - assert session, "Session not found." - - # Convert the session data to eval invocations - invocations = evals.convert_session_to_eval_invocations(session) - - # Populate the session with initial session state. - agent_or_app = self.agent_loader.load_agent(app_name) - root_agent = self._get_root_agent(agent_or_app) - initial_session_state = create_empty_state(root_agent) - - new_eval_case = EvalCase( - eval_id=req.eval_id, - conversation=invocations, - session_input=SessionInput( - app_name=app_name, - user_id=req.user_id, - state=initial_session_state, - ), - creation_timestamp=time.time(), - ) - - try: - self.eval_sets_manager.add_eval_case( - app_name, eval_set_id, new_eval_case - ) - except ValueError as ve: - raise HTTPException(status_code=400, detail=str(ve)) from ve - - @app.get( - "/dev/apps/{app_name}/eval_sets/{eval_set_id}/evals", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_evals_in_eval_set( - app_name: str, - eval_set_id: str, - ) -> list[str]: - """Lists all evals in an eval set.""" - eval_set_data = self.eval_sets_manager.get_eval_set(app_name, eval_set_id) - - if not eval_set_data: - raise HTTPException( - status_code=400, detail=f"Eval set `{eval_set_id}` not found." - ) - - return sorted([x.eval_id for x in eval_set_data.eval_cases]) - - @app.get( - "/dev/apps/{app_name}/eval-sets/{eval_set_id}/eval-cases/{eval_case_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - @app.get( - "/dev/apps/{app_name}/eval_sets/{eval_set_id}/evals/{eval_case_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def get_eval( - app_name: str, eval_set_id: str, eval_case_id: str - ) -> EvalCase: - """Gets an eval case in an eval set.""" - eval_case_to_find = self.eval_sets_manager.get_eval_case( - app_name, eval_set_id, eval_case_id - ) - - if eval_case_to_find: - return eval_case_to_find - - raise HTTPException( - status_code=404, - detail=( - f"Eval set `{eval_set_id}` or Eval `{eval_case_id}` not found." - ), - ) - - @app.put( - "/dev/apps/{app_name}/eval-sets/{eval_set_id}/eval-cases/{eval_case_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - @app.put( - "/dev/apps/{app_name}/eval_sets/{eval_set_id}/evals/{eval_case_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def update_eval( - app_name: str, - eval_set_id: str, - eval_case_id: str, - updated_eval_case: EvalCase, - ): - if ( - updated_eval_case.eval_id - and updated_eval_case.eval_id != eval_case_id - ): - raise HTTPException( - status_code=400, - detail=( - "Eval id in EvalCase should match the eval id in the API route." - ), - ) - - # Overwrite the value. We are either overwriting the same value or an empty - # field. - updated_eval_case.eval_id = eval_case_id - try: - self.eval_sets_manager.update_eval_case( - app_name, eval_set_id, updated_eval_case - ) - except NotFoundError as nfe: - raise HTTPException(status_code=404, detail=str(nfe)) from nfe - - @app.delete( - "/dev/apps/{app_name}/eval-sets/{eval_set_id}/eval-cases/{eval_case_id}", - tags=[TAG_EVALUATION], - ) - @app.delete( - "/dev/apps/{app_name}/eval_sets/{eval_set_id}/evals/{eval_case_id}", - tags=[TAG_EVALUATION], - ) - async def delete_eval( - app_name: str, eval_set_id: str, eval_case_id: str - ) -> None: - try: - self.eval_sets_manager.delete_eval_case( - app_name, eval_set_id, eval_case_id - ) - except NotFoundError as nfe: - raise HTTPException(status_code=404, detail=str(nfe)) from nfe - - @app.post( - "/dev/apps/{app_name}/eval-sets/{eval_set_id}/run", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def run_eval( - app_name: str, eval_set_id: str, req: RunEvalRequest - ) -> RunEvalResponse: - """Runs an eval given the details in the eval request.""" - # Create a mapping from eval set file to all the evals that needed to be - # run. - try: - from ..evaluation.local_eval_service import LocalEvalService - from .cli_eval import _collect_eval_results - from .cli_eval import _collect_inferences - - eval_set = self.eval_sets_manager.get_eval_set(app_name, eval_set_id) - - if not eval_set: - raise HTTPException( - status_code=400, detail=f"Eval set `{eval_set_id}` not found." - ) - - agent_or_app = self.agent_loader.load_agent(app_name) - root_agent = self._get_root_agent(agent_or_app) - - eval_case_results = [] - - eval_service = LocalEvalService( - root_agent=root_agent, - eval_sets_manager=self.eval_sets_manager, - eval_set_results_manager=self.eval_set_results_manager, - session_service=self.session_service, - artifact_service=self.artifact_service, - ) - inference_request = InferenceRequest( - app_name=app_name, - eval_set_id=eval_set.eval_set_id, - eval_case_ids=req.eval_case_ids or req.eval_ids, - inference_config=InferenceConfig(), - ) - inference_results = await _collect_inferences( - inference_requests=[inference_request], eval_service=eval_service - ) - - eval_case_results = await _collect_eval_results( - inference_results=inference_results, - eval_service=eval_service, - eval_metrics=req.eval_metrics, - ) - except ModuleNotFoundError as e: - logger.exception("%s", e) - raise HTTPException( - status_code=400, detail=MISSING_EVAL_DEPENDENCIES_MESSAGE - ) from e - - run_eval_results = [] - for eval_case_result in eval_case_results: - run_eval_results.append( - RunEvalResult( - eval_set_file=eval_case_result.eval_set_file, - eval_set_id=eval_set_id, - eval_id=eval_case_result.eval_id, - final_eval_status=eval_case_result.final_eval_status, - overall_eval_metric_results=eval_case_result.overall_eval_metric_results, - eval_metric_result_per_invocation=eval_case_result.eval_metric_result_per_invocation, - user_id=eval_case_result.user_id, - session_id=eval_case_result.session_id, - ) - ) - - return RunEvalResponse(run_eval_results=run_eval_results) - - @app.get( - "/dev/apps/{app_name}/eval-results/{eval_result_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def get_eval_result( - app_name: str, - eval_result_id: str, - ) -> EvalResult: - """Gets the eval result for the given eval id.""" - try: - eval_set_result = self.eval_set_results_manager.get_eval_set_result( - app_name, eval_result_id - ) - return EvalResult(**eval_set_result.model_dump()) - except ValueError as ve: - raise HTTPException(status_code=404, detail=str(ve)) from ve - except ValidationError as ve: - raise HTTPException(status_code=500, detail=str(ve)) from ve - - @app.get( - "/dev/apps/{app_name}/eval-results", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_eval_results(app_name: str) -> ListEvalResultsResponse: - """Lists all eval results for the given app.""" - eval_result_ids = self.eval_set_results_manager.list_eval_set_results( - app_name - ) - return ListEvalResultsResponse(eval_result_ids=eval_result_ids) - - @app.get( - "/dev/apps/{app_name}/metrics-info", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_metrics_info(app_name: str) -> ListMetricsInfoResponse: - """Lists all eval metrics for the given app.""" - try: - from ..evaluation.metric_evaluator_registry import DEFAULT_METRIC_EVALUATOR_REGISTRY - - # Right now we ignore the app_name as eval metrics are not tied to the - # app_name, but they could be moving forward. - metrics_info = ( - DEFAULT_METRIC_EVALUATOR_REGISTRY.get_registered_metrics() - ) - return ListMetricsInfoResponse(metrics_info=metrics_info) - except ModuleNotFoundError as e: - logger.exception("%s\n%s", MISSING_EVAL_DEPENDENCIES_MESSAGE, e) - raise HTTPException( - status_code=400, detail=MISSING_EVAL_DEPENDENCIES_MESSAGE - ) from e - - # ========== GRAPH VISUALIZATION ENDPOINTS ========== - - @app.get( - "/dev/apps/{app_name}/graph", - response_model_exclude_none=True, - tags=[TAG_DEBUG], - ) - async def get_app_graph_dot( - app_name: str, dark_mode: bool = False - ) -> GetEventGraphResult | dict: - """Returns the base agent graph in DOT format without any highlights. - - This endpoint allows the frontend to fetch the graph structure once - and compute highlights client-side for better performance. - - Args: - app_name: The name of the agent/app - dark_mode: Whether to use dark theme background color - """ - agent_or_app = self.agent_loader.load_agent(app_name) - root_agent = self._get_root_agent(agent_or_app) - - # Get graph with NO highlights (empty list) and specified theme - dot_graph = await agent_graph.get_agent_graph( - root_agent, [], dark_mode=dark_mode - ) - - if dot_graph and isinstance(dot_graph, graphviz.Digraph): - return GetEventGraphResult(dot_src=dot_graph.source) - else: - return {} - - # TODO: This endpoint can be removed once we update adk web to stop consuming it - @app.get( - "/dev/apps/{app_name}/users/{user_id}/sessions/{session_id}/events/{event_id}/graph", - response_model_exclude_none=True, - tags=[TAG_DEBUG], - ) - async def get_event_graph( - app_name: str, user_id: str, session_id: str, event_id: str - ): - session = await self.session_service.get_session( - app_name=app_name, user_id=user_id, session_id=session_id - ) - session_events = session.events if session else [] - event = next((x for x in session_events if x.id == event_id), None) - if not event: - return {} - - function_calls = event.get_function_calls() - function_responses = event.get_function_responses() - agent_or_app = self.agent_loader.load_agent(app_name) - root_agent = self._get_root_agent(agent_or_app) - dot_graph = None - if function_calls: - function_call_highlights = [] - for function_call in function_calls: - from_name = event.author - to_name = function_call.name - function_call_highlights.append((from_name, to_name)) - dot_graph = await agent_graph.get_agent_graph( - root_agent, function_call_highlights - ) - elif function_responses: - function_responses_highlights = [] - for function_response in function_responses: - from_name = function_response.name - to_name = event.author - function_responses_highlights.append((from_name, to_name)) - dot_graph = await agent_graph.get_agent_graph( - root_agent, function_responses_highlights - ) - else: - from_name = event.author - to_name = "" - dot_graph = await agent_graph.get_agent_graph( - root_agent, [(from_name, to_name)] - ) - if dot_graph and isinstance(dot_graph, graphviz.Digraph): - return GetEventGraphResult(dot_src=dot_graph.source) - else: - return {} - - def _navigate_to_node(self, app_info: dict, node_path: str) -> dict | None: - """Navigate to a specific node in the agent hierarchy. - - Args: - app_info: The full app info structure - node_path: Path like "agent1/agent2/agent3" - - Returns: - The agent data at that path, or None if not found - """ - if not node_path: - return app_info.get("root_agent") - - # Strip leading/trailing slashes and split, filter out empty strings - path_parts = [p for p in node_path.strip("/").split("/") if p] - current = app_info.get("root_agent") - - if not current: - return None - - # Navigate through each level (skip first if it's the root name) - start_idx = 0 - if path_parts[0] == current.get("name"): - start_idx = 1 - - for part in path_parts[start_idx:]: - found = None - # Check potential containers in order of preference - containers = [] - if current.get("graph") and current["graph"].get("nodes"): - containers.append(current["graph"]["nodes"]) - if current.get("nodes"): - containers.append(current["nodes"]) - if current.get("sub_agents"): - containers.append(current["sub_agents"]) - - for container in containers: - for item in container: - if item.get("name") == part: - found = item - break - if found: - break - - if not found: - return None - current = found - - return current - - def _get_all_sub_workflows( - self, app_info: dict, current_path: str = "" - ) -> dict[str, dict]: - """Recursively discover all sub-workflows within the given app info. - - Args: - app_info: Current app_info snippet or agent dict - current_path: The accumulated string path (e.g., 'agent_a/workflow_b') - - Returns: - A dictionary mapping the node path to the corresponding agent info dict. - """ - workflows = {} - - agent_info = app_info.get("root_agent", app_info) - if agent_info.get("graph"): - workflows[current_path] = agent_info - - children = list(agent_info.get("sub_agents", [])) - children.extend(agent_info.get("nodes", [])) - graph = agent_info.get("graph") - if graph: - children.extend(graph.get("nodes", [])) - - for child in children: - child_name = child.get("name") - if not child_name: - continue - child_path = ( - f"{current_path}/{child_name}" if current_path else child_name - ) - workflows.update( - self._get_all_sub_workflows({"root_agent": child}, child_path) - ) - - return workflows - - def get_fast_api_app(self, **kwargs): - """Override to add dev endpoints after production endpoints. - - Calls parent's get_fast_api_app() to get the base app with production - endpoints, then registers dev-only endpoints. - """ - app = super().get_fast_api_app(**kwargs) - - web_assets_dir = kwargs.get("web_assets_dir", None) - self._register_dev_endpoints( - app, self._trace_dict, self._memory_exporter, web_assets_dir - ) - - return app diff --git a/src/google/adk/cli/fast_api.py b/src/google/adk/cli/fast_api.py index 786161b403..89b40fe88e 100644 --- a/src/google/adk/cli/fast_api.py +++ b/src/google/adk/cli/fast_api.py @@ -20,62 +20,39 @@ import logging import os from pathlib import Path +import shutil import sys from typing import Any -from typing import AsyncIterator -from typing import Awaitable -from typing import Callable from typing import Literal from typing import Mapping -from typing import Optional import click from fastapi import FastAPI -from fastapi import File from fastapi import HTTPException -from fastapi import Request from fastapi import UploadFile -from fastapi.encoders import jsonable_encoder from fastapi.responses import FileResponse -from fastapi.responses import JSONResponse from fastapi.responses import PlainTextResponse -from fastapi.responses import StreamingResponse -from opentelemetry import context -from opentelemetry import trace from opentelemetry.sdk.trace import export from opentelemetry.sdk.trace import TracerProvider -from pydantic import BaseModel -from starlette.concurrency import run_in_threadpool from starlette.types import Lifespan from watchdog.observers import Observer from ..auth.credential_service.in_memory_credential_service import InMemoryCredentialService +from ..evaluation.local_eval_set_results_manager import LocalEvalSetResultsManager +from ..evaluation.local_eval_sets_manager import LocalEvalSetsManager from ..runners import Runner -from ..telemetry._agent_engine import get_propagated_context -from ..telemetry._agent_engine import TopSpanProcessor -from .api_server import ApiServer -from .cli_deploy import _AGENT_ENGINE_CLASS_METHODS -from .dev_server import DevServer +from .adk_web_server import AdkWebServer from .service_registry import load_services_module from .utils import envs +from .utils import evals from .utils.agent_change_handler import AgentChangeEventHandler -from .utils.agent_loader import is_single_agent_directory +from .utils.agent_loader import AgentLoader from .utils.base_agent_loader import BaseAgentLoader from .utils.service_factory import _create_task_store_from_options from .utils.service_factory import create_artifact_service_from_options from .utils.service_factory import create_memory_service_from_options from .utils.service_factory import create_session_service_from_options -_ALLOWED_AGENT_ENGINE_CLASS_METHODS = frozenset( - method["name"] for method in _AGENT_ENGINE_CLASS_METHODS -) - - -class _QueryRequest(BaseModel): - input: dict[str, Any] | None = None - class_method: str | None = None - - logger = logging.getLogger("google_adk." + __name__) _LAZY_SERVICE_IMPORTS: dict[str, str] = { @@ -96,309 +73,6 @@ def __getattr__(name: str): return attr -def _register_builder_endpoints(app: FastAPI, web: bool, agents_dir: str): - """Registers builder endpoints if web is enabled and multipart is installed.""" - if not web: - return - try: - import multipart - except ImportError: - logger.warning( - "python-multipart not installed. Builder UI endpoints will not be" - " available." - ) - return - - import shutil - - import yaml - - agents_base_path = (Path.cwd() / agents_dir).resolve() - - def _get_app_root(app_name: str) -> Path: - if app_name in ("", ".", ".."): - raise ValueError(f"Invalid app name: {app_name!r}") - if Path(app_name).name != app_name or "\\" in app_name: - raise ValueError(f"Invalid app name: {app_name!r}") - app_root = (agents_base_path / app_name).resolve() - if not app_root.is_relative_to(agents_base_path): - raise ValueError(f"Invalid app name: {app_name!r}") - return app_root - - def _normalize_relative_path(path: str) -> str: - return path.replace("\\", "/").lstrip("/") - - def _has_parent_reference(path: str) -> bool: - return any(part == ".." for part in path.split("/")) - - _ALLOWED_EXTENSIONS = frozenset({".yaml", ".yml"}) - - _BLOCKED_YAML_KEYS = frozenset({"args"}) - - def _check_yaml_for_blocked_keys(content: bytes, filename: str) -> None: - try: - docs = list(yaml.safe_load_all(content)) - except yaml.YAMLError as exc: - raise ValueError(f"Invalid YAML in {filename!r}: {exc}") from exc - - def _walk(node: Any) -> None: - if isinstance(node, dict): - for key, value in node.items(): - if key in _BLOCKED_YAML_KEYS: - raise ValueError( - f"Blocked key {key!r} found in {filename!r}. " - f"The '{key}' field is not allowed in builder uploads " - "because it can execute arbitrary code." - ) - _walk(value) - elif isinstance(node, list): - for item in node: - _walk(item) - - for doc in docs: - _walk(doc) - - def _parse_upload_filename(filename: Optional[str]) -> tuple[str, str]: - if not filename: - raise ValueError("Upload filename is missing.") - filename = _normalize_relative_path(filename) - if "/" not in filename: - raise ValueError(f"Invalid upload filename: {filename!r}") - app_name, rel_path = filename.split("/", 1) - if not app_name or not rel_path: - raise ValueError(f"Invalid upload filename: {filename!r}") - if rel_path.startswith("/"): - raise ValueError(f"Absolute upload path rejected: {filename!r}") - if _has_parent_reference(rel_path): - raise ValueError(f"Path traversal rejected: {filename!r}") - ext = os.path.splitext(rel_path)[1].lower() - if ext not in _ALLOWED_EXTENSIONS: - raise ValueError( - f"File type not allowed: {rel_path!r}" - f" (allowed: {', '.join(sorted(_ALLOWED_EXTENSIONS))})" - ) - return app_name, rel_path - - def _parse_file_path(file_path: str) -> str: - file_path = _normalize_relative_path(file_path) - if not file_path: - raise ValueError("file_path is missing.") - if file_path.startswith("/"): - raise ValueError(f"Absolute file_path rejected: {file_path!r}") - if _has_parent_reference(file_path): - raise ValueError(f"Path traversal rejected: {file_path!r}") - ext = os.path.splitext(file_path)[1].lower() - if ext not in _ALLOWED_EXTENSIONS: - raise ValueError( - f"File type not allowed: {file_path!r}" - f" (allowed: {', '.join(sorted(_ALLOWED_EXTENSIONS))})" - ) - return file_path - - def _resolve_under_dir(root_dir: Path, rel_path: str) -> Path: - file_path = root_dir / rel_path - resolved_root_dir = root_dir.resolve() - resolved_file_path = file_path.resolve() - if not resolved_file_path.is_relative_to(resolved_root_dir): - raise ValueError(f"Path escapes root_dir: {rel_path!r}") - return file_path - - def _get_tmp_agent_root(app_root: Path, app_name: str) -> Path: - tmp_agent_root = app_root / "tmp" / app_name - resolved_tmp_agent_root = tmp_agent_root.resolve() - if not resolved_tmp_agent_root.is_relative_to(app_root): - raise ValueError(f"Invalid tmp path for app: {app_name!r}") - return tmp_agent_root - - def copy_dir_contents(source_dir: Path, dest_dir: Path) -> None: - dest_dir.mkdir(parents=True, exist_ok=True) - for source_path in source_dir.iterdir(): - if source_path.name == "tmp": - continue - - dest_path = dest_dir / source_path.name - if source_path.is_dir(): - if dest_path.exists() and dest_path.is_file(): - dest_path.unlink() - shutil.copytree(source_path, dest_path, dirs_exist_ok=True) - elif source_path.is_file(): - if dest_path.exists() and dest_path.is_dir(): - shutil.rmtree(dest_path) - shutil.copy2(source_path, dest_path) - - def cleanup_tmp(app_name: str) -> bool: - try: - app_root = _get_app_root(app_name) - except ValueError as exc: - logger.exception("Error in cleanup_tmp: %s", exc) - return False - - try: - tmp_agent_root = _get_tmp_agent_root(app_root, app_name) - except ValueError as exc: - logger.exception("Error in cleanup_tmp: %s", exc) - return False - - try: - shutil.rmtree(tmp_agent_root) - except FileNotFoundError: - pass - except OSError as exc: - logger.exception("Error deleting tmp agent root: %s", exc) - return False - - tmp_dir = app_root / "tmp" - resolved_tmp_dir = tmp_dir.resolve() - if not resolved_tmp_dir.is_relative_to(app_root): - logger.error( - "Refusing to delete tmp outside app_root: %s", resolved_tmp_dir - ) - return False - - try: - tmp_dir.rmdir() - except OSError: - pass - - return True - - def ensure_tmp_exists(app_name: str) -> bool: - try: - app_root = _get_app_root(app_name) - except ValueError as exc: - logger.exception("Error in ensure_tmp_exists: %s", exc) - return False - - if not app_root.is_dir(): - return False - - try: - tmp_agent_root = _get_tmp_agent_root(app_root, app_name) - except ValueError as exc: - logger.exception("Error in ensure_tmp_exists: %s", exc) - return False - - if tmp_agent_root.exists(): - return True - - try: - tmp_agent_root.mkdir(parents=True, exist_ok=True) - copy_dir_contents(app_root, tmp_agent_root) - except OSError as exc: - logger.exception("Error in ensure_tmp_exists: %s", exc) - return False - - return True - - @app.post("/builder/save", response_model_exclude_none=True) - async def builder_build( - files: list[UploadFile] = File(...), tmp: Optional[bool] = False - ) -> bool: - try: - app_names: set[str] = set() - uploads: list[tuple[str, bytes]] = [] - for file in files: - app_name, rel_path = _parse_upload_filename(file.filename) - app_names.add(app_name) - content = await file.read() - uploads.append((rel_path, content)) - - if len(app_names) != 1: - logger.error( - "Exactly one app name is required, found: %s", - sorted(app_names), - ) - return False - - app_name = next(iter(app_names)) - - for rel_path, content in uploads: - _check_yaml_for_blocked_keys(content, f"{app_name}/{rel_path}") - - if tmp: - app_root = _get_app_root(app_name) - tmp_agent_root = _get_tmp_agent_root(app_root, app_name) - tmp_agent_root.mkdir(parents=True, exist_ok=True) - - for rel_path, content in uploads: - destination_path = _resolve_under_dir(tmp_agent_root, rel_path) - destination_path.parent.mkdir(parents=True, exist_ok=True) - destination_path.write_bytes(content) - - return True - - app_root = _get_app_root(app_name) - app_root.mkdir(parents=True, exist_ok=True) - - tmp_agent_root = _get_tmp_agent_root(app_root, app_name) - if tmp_agent_root.is_dir(): - copy_dir_contents(tmp_agent_root, app_root) - - for rel_path, content in uploads: - destination_path = _resolve_under_dir(app_root, rel_path) - destination_path.parent.mkdir(parents=True, exist_ok=True) - destination_path.write_bytes(content) - - return cleanup_tmp(app_name) - except ValueError as exc: - logger.exception("Error in builder_build: %s", exc) - raise HTTPException(status_code=400, detail=str(exc)) - except OSError as exc: - logger.exception("Error in builder_build: %s", exc) - return False - - @app.post("/builder/app/{app_name}/cancel", response_model_exclude_none=True) - async def builder_cancel(app_name: str) -> bool: - return cleanup_tmp(app_name) - - @app.get( - "/builder/app/{app_name}", - response_model_exclude_none=True, - response_class=PlainTextResponse, - ) - async def get_agent_builder( - app_name: str, - file_path: Optional[str] = None, - tmp: Optional[bool] = False, - ): - try: - app_root = _get_app_root(app_name) - except ValueError as exc: - logger.exception("Error in get_agent_builder: %s", exc) - return "" - - agent_dir = app_root - if tmp: - if not ensure_tmp_exists(app_name): - return "" - agent_dir = app_root / "tmp" / app_name - - if not file_path: - rel_path = "root_agent.yaml" - else: - try: - rel_path = _parse_file_path(file_path) - except ValueError as exc: - logger.exception("Error in get_agent_builder: %s", exc) - return "" - - try: - agent_file_path = _resolve_under_dir(agent_dir, rel_path) - except ValueError as exc: - logger.exception("Error in get_agent_builder: %s", exc) - return "" - - if not agent_file_path.is_file(): - return "" - - return FileResponse( - path=agent_file_path, - media_type="application/x-yaml", - filename=file_path or f"{app_name}.yaml", - headers={"Cache-Control": "no-store"}, - ) - - def get_fast_api_app( *, agents_dir: str, @@ -425,9 +99,6 @@ def get_fast_api_app( logo_image_url: str | None = None, auto_create_session: bool = False, trigger_sources: list[Literal["pubsub", "eventarc"]] | None = None, - default_llm_model: str | None = None, - gemini_enterprise_app_name: str | None = None, - express_mode: bool = False, ) -> FastAPI: """Constructs and returns a FastAPI application for serving ADK agents. @@ -476,47 +147,31 @@ def get_fast_api_app( trigger_sources: List of trigger sources to enable (e.g. ["pubsub", "eventarc"]). When set, registers /trigger/* endpoints for batch and event-driven agent invocations. None disables all trigger endpoints. - default_llm_model: Default LLM model to use for the agent. - gemini_enterprise_app_name: The Gemini Enterprise app name to use for the - agent. - express_mode: Whether to enable express mode. Returns: The configured FastAPI application instance. """ - # Detect single agent mode - agents_path = Path(agents_dir).resolve() - is_single_agent = is_single_agent_directory(agents_path) + # Enable denylist enforcement for config loads if web UI is enabled. + if web: + from ..agents import config_agent_utils - original_agents_dir = agents_dir - single_agent_name = None - if is_single_agent: - single_agent_name = agents_path.name - agents_dir = str(agents_path.parent) + config_agent_utils._set_enforce_denylist(True) # Set up eval managers. if eval_storage_uri: - from .utils import evals - gcs_eval_managers = evals.create_gcs_eval_managers_from_uri( eval_storage_uri ) eval_sets_manager = gcs_eval_managers.eval_sets_manager eval_set_results_manager = gcs_eval_managers.eval_set_results_manager else: - this_module = sys.modules[__name__] - eval_sets_manager = this_module.LocalEvalSetsManager(agents_dir=agents_dir) - eval_set_results_manager = this_module.LocalEvalSetResultsManager( - agents_dir=agents_dir - ) + eval_sets_manager = LocalEvalSetsManager(agents_dir=agents_dir) + eval_set_results_manager = LocalEvalSetResultsManager(agents_dir=agents_dir) # initialize Agent Loader if not passed as argument - this_module = sys.modules[__name__] if agent_loader is None: - agent_loader = this_module.AgentLoader(original_agents_dir) - elif is_single_agent and isinstance(agent_loader, this_module.AgentLoader): - agent_loader._set_single_agent_mode(single_agent_name, agents_dir) + agent_loader = AgentLoader(agents_dir) # Load services.py from agents_dir for custom service registration. load_services_module(agents_dir) @@ -552,12 +207,7 @@ def get_fast_api_app( # Build the Credential service credential_service = InMemoryCredentialService() - # Instantiate the appropriate server class based on web option - # If web=True, use DevServer (includes all endpoints: production + dev) - # If web=False, use ApiServer (production-safe endpoints only) - ServerClass = DevServer if web else ApiServer - - adk_web_server = ServerClass( + adk_web_server = AdkWebServer( agent_loader=agent_loader, session_service=session_service, artifact_service=artifact_service, @@ -572,13 +222,8 @@ def get_fast_api_app( url_prefix=url_prefix, auto_create_session=auto_create_session, trigger_sources=trigger_sources, - default_llm_model=default_llm_model, ) - # In single agent mode, use that agent as the default app. - if is_single_agent: - adk_web_server.default_app_name = single_agent_name - # Callbacks & other optional args for when constructing the FastAPI instance extra_fast_api_args = {} @@ -606,7 +251,7 @@ def register_processors(provider: TracerProvider) -> None: if reload_agents: - def setup_observer(observer: Observer, adk_web_server: ApiServer): + def setup_observer(observer: Observer, adk_web_server: AdkWebServer): agent_change_handler = AgentChangeEventHandler( agent_loader=agent_loader, runners_to_clean=adk_web_server.runners_to_clean, @@ -615,7 +260,7 @@ def setup_observer(observer: Observer, adk_web_server: ApiServer): observer.schedule(agent_change_handler, agents_dir, recursive=True) observer.start() - def tear_down_observer(observer: Observer, _: ApiServer): + def tear_down_observer(observer: Observer, _: AdkWebServer): observer.stop() observer.join() @@ -666,7 +311,309 @@ async def _a2a_lifespan(app_instance: FastAPI): ) # --- Builder endpoints (agent editor UI) --- - _register_builder_endpoints(app, web, agents_dir) + # Only register when the web UI is enabled. In headless / production + # deployments (e.g. `adk deploy cloud_run`) these endpoints are unnecessary + # and expose an attack surface that allows arbitrary file writes under the + # agents directory. + # See https://github.com/google/adk-python/issues/4947 + if web: + agents_base_path = (Path.cwd() / agents_dir).resolve() + + def _get_app_root(app_name: str) -> Path: + if app_name in ("", ".", ".."): + raise ValueError(f"Invalid app name: {app_name!r}") + if Path(app_name).name != app_name or "\\" in app_name: + raise ValueError(f"Invalid app name: {app_name!r}") + app_root = (agents_base_path / app_name).resolve() + if not app_root.is_relative_to(agents_base_path): + raise ValueError(f"Invalid app name: {app_name!r}") + return app_root + + def _normalize_relative_path(path: str) -> str: + return path.replace("\\", "/").lstrip("/") + + def _has_parent_reference(path: str) -> bool: + return any(part == ".." for part in path.split("/")) + + _ALLOWED_EXTENSIONS = frozenset({".yaml", ".yml"}) + + # --- YAML content security --- + # The `args` key in agent YAML configs (CodeConfig.args, ToolConfig.args) + # allows callers to pass arbitrary arguments to Python constructors and + # functions, which is an RCE vector when exposed through the builder UI. + # Block any upload that contains an `args` key anywhere in the document. + _BLOCKED_YAML_KEYS = frozenset({"args"}) + + def _check_yaml_for_blocked_keys(content: bytes, filename: str) -> None: + """Raise if the YAML document contains any blocked keys.""" + import yaml + + try: + docs = list(yaml.safe_load_all(content)) + except yaml.YAMLError as exc: + raise ValueError(f"Invalid YAML in {filename!r}: {exc}") from exc + + def _walk(node: Any) -> None: + if isinstance(node, dict): + for key, value in node.items(): + if key in _BLOCKED_YAML_KEYS: + raise ValueError( + f"Blocked key {key!r} found in {filename!r}. " + f"The '{key}' field is not allowed in builder uploads " + "because it can execute arbitrary code." + ) + _walk(value) + elif isinstance(node, list): + for item in node: + _walk(item) + + for doc in docs: + _walk(doc) + + def _parse_upload_filename(filename: str | None) -> tuple[str, str]: + if not filename: + raise ValueError("Upload filename is missing.") + filename = _normalize_relative_path(filename) + if "/" not in filename: + raise ValueError(f"Invalid upload filename: {filename!r}") + app_name, rel_path = filename.split("/", 1) + if not app_name or not rel_path: + raise ValueError(f"Invalid upload filename: {filename!r}") + if rel_path.startswith("/"): + raise ValueError(f"Absolute upload path rejected: {filename!r}") + if _has_parent_reference(rel_path): + raise ValueError(f"Path traversal rejected: {filename!r}") + ext = os.path.splitext(rel_path)[1].lower() + if ext not in _ALLOWED_EXTENSIONS: + raise ValueError( + f"File type not allowed: {rel_path!r}" + f" (allowed: {', '.join(sorted(_ALLOWED_EXTENSIONS))})" + ) + return app_name, rel_path + + def _parse_file_path(file_path: str) -> str: + file_path = _normalize_relative_path(file_path) + if not file_path: + raise ValueError("file_path is missing.") + if file_path.startswith("/"): + raise ValueError(f"Absolute file_path rejected: {file_path!r}") + if _has_parent_reference(file_path): + raise ValueError(f"Path traversal rejected: {file_path!r}") + ext = os.path.splitext(file_path)[1].lower() + if ext not in _ALLOWED_EXTENSIONS: + raise ValueError( + f"File type not allowed: {file_path!r}" + f" (allowed: {', '.join(sorted(_ALLOWED_EXTENSIONS))})" + ) + return file_path + + def _resolve_under_dir(root_dir: Path, rel_path: str) -> Path: + file_path = root_dir / rel_path + resolved_root_dir = root_dir.resolve() + resolved_file_path = file_path.resolve() + if not resolved_file_path.is_relative_to(resolved_root_dir): + raise ValueError(f"Path escapes root_dir: {rel_path!r}") + return file_path + + def _get_tmp_agent_root(app_root: Path, app_name: str) -> Path: + tmp_agent_root = app_root / "tmp" / app_name + resolved_tmp_agent_root = tmp_agent_root.resolve() + if not resolved_tmp_agent_root.is_relative_to(app_root): + raise ValueError(f"Invalid tmp path for app: {app_name!r}") + return tmp_agent_root + + def copy_dir_contents(source_dir: Path, dest_dir: Path) -> None: + dest_dir.mkdir(parents=True, exist_ok=True) + for source_path in source_dir.iterdir(): + if source_path.name == "tmp": + continue + + dest_path = dest_dir / source_path.name + if source_path.is_dir(): + if dest_path.exists() and dest_path.is_file(): + dest_path.unlink() + shutil.copytree(source_path, dest_path, dirs_exist_ok=True) + elif source_path.is_file(): + if dest_path.exists() and dest_path.is_dir(): + shutil.rmtree(dest_path) + shutil.copy2(source_path, dest_path) + + def cleanup_tmp(app_name: str) -> bool: + try: + app_root = _get_app_root(app_name) + except ValueError as exc: + logger.exception("Error in cleanup_tmp: %s", exc) + return False + + try: + tmp_agent_root = _get_tmp_agent_root(app_root, app_name) + except ValueError as exc: + logger.exception("Error in cleanup_tmp: %s", exc) + return False + + try: + shutil.rmtree(tmp_agent_root) + except FileNotFoundError: + pass + except OSError as exc: + logger.exception("Error deleting tmp agent root: %s", exc) + return False + + tmp_dir = app_root / "tmp" + resolved_tmp_dir = tmp_dir.resolve() + if not resolved_tmp_dir.is_relative_to(app_root): + logger.error( + "Refusing to delete tmp outside app_root: %s", resolved_tmp_dir + ) + return False + + try: + tmp_dir.rmdir() + except OSError: + pass + + return True + + def ensure_tmp_exists(app_name: str) -> bool: + try: + app_root = _get_app_root(app_name) + except ValueError as exc: + logger.exception("Error in ensure_tmp_exists: %s", exc) + return False + + if not app_root.is_dir(): + return False + + try: + tmp_agent_root = _get_tmp_agent_root(app_root, app_name) + except ValueError as exc: + logger.exception("Error in ensure_tmp_exists: %s", exc) + return False + + if tmp_agent_root.exists(): + return True + + try: + tmp_agent_root.mkdir(parents=True, exist_ok=True) + copy_dir_contents(app_root, tmp_agent_root) + except OSError as exc: + logger.exception("Error in ensure_tmp_exists: %s", exc) + return False + + return True + + @app.post("/builder/save", response_model_exclude_none=True) + async def builder_build( + files: list[UploadFile], tmp: bool | None = False + ) -> bool: + try: + # Phase 1: parse filenames and read content into memory. + app_names: set[str] = set() + uploads: list[tuple[str, bytes]] = [] + for file in files: + app_name, rel_path = _parse_upload_filename(file.filename) + app_names.add(app_name) + content = await file.read() + uploads.append((rel_path, content)) + + if len(app_names) != 1: + logger.error( + "Exactly one app name is required, found: %s", + sorted(app_names), + ) + return False + + app_name = next(iter(app_names)) + + # Phase 2: validate every file *before* writing anything to disk. + for rel_path, content in uploads: + _check_yaml_for_blocked_keys(content, f"{app_name}/{rel_path}") + + # Phase 3: write validated files to disk. + if tmp: + app_root = _get_app_root(app_name) + tmp_agent_root = _get_tmp_agent_root(app_root, app_name) + tmp_agent_root.mkdir(parents=True, exist_ok=True) + + for rel_path, content in uploads: + destination_path = _resolve_under_dir(tmp_agent_root, rel_path) + destination_path.parent.mkdir(parents=True, exist_ok=True) + destination_path.write_bytes(content) + + return True + + app_root = _get_app_root(app_name) + app_root.mkdir(parents=True, exist_ok=True) + + tmp_agent_root = _get_tmp_agent_root(app_root, app_name) + if tmp_agent_root.is_dir(): + copy_dir_contents(tmp_agent_root, app_root) + + for rel_path, content in uploads: + destination_path = _resolve_under_dir(app_root, rel_path) + destination_path.parent.mkdir(parents=True, exist_ok=True) + destination_path.write_bytes(content) + + return cleanup_tmp(app_name) + except ValueError as exc: + logger.exception("Error in builder_build: %s", exc) + raise HTTPException(status_code=400, detail=str(exc)) + except OSError as exc: + logger.exception("Error in builder_build: %s", exc) + return False + + @app.post( + "/builder/app/{app_name}/cancel", response_model_exclude_none=True + ) + async def builder_cancel(app_name: str) -> bool: + return cleanup_tmp(app_name) + + @app.get( + "/builder/app/{app_name}", + response_model_exclude_none=True, + response_class=PlainTextResponse, + ) + async def get_agent_builder( + app_name: str, + file_path: str | None = None, + tmp: bool | None = False, + ): + try: + app_root = _get_app_root(app_name) + except ValueError as exc: + logger.exception("Error in get_agent_builder: %s", exc) + return "" + + agent_dir = app_root + if tmp: + if not ensure_tmp_exists(app_name): + return "" + agent_dir = app_root / "tmp" / app_name + + if not file_path: + rel_path = "root_agent.yaml" + else: + try: + rel_path = _parse_file_path(file_path) + except ValueError as exc: + logger.exception("Error in get_agent_builder: %s", exc) + return "" + + try: + agent_file_path = _resolve_under_dir(agent_dir, rel_path) + except ValueError as exc: + logger.exception("Error in get_agent_builder: %s", exc) + return "" + + if not agent_file_path.is_file(): + return "" + + return FileResponse( + path=agent_file_path, + media_type="application/x-yaml", + filename=file_path or f"{app_name}.yaml", + headers={"Cache-Control": "no-store"}, + ) if a2a and a2a_task_store is not None: from a2a.server.apps import A2AStarletteApplication @@ -739,196 +686,4 @@ async def _get_a2a_runner_async() -> Runner: logger.error("Failed to setup A2A agent %s: %s", app_name, e) # Continue with other agents even if one fails - if gemini_enterprise_app_name: - if gemini_enterprise_app_name not in agent_loader.list_agents(): - raise ValueError( - f"App {gemini_enterprise_app_name} not found in dir: {agents_dir}" - ) - - import inspect - import json - - from google.adk.agents import Agent - import google.auth - from pydantic import ValidationError as _ValidationError - from vertexai import agent_engines - - # The tmp agent will be replaced by the adk server's runner and services. - # It is specified here because it is a required argument to AdkApp. - adk_app = agent_engines.AdkApp(agent=Agent(name="tmp")) - if express_mode: - api_key = os.environ.get("GOOGLE_API_KEY", None) - if not api_key: - raise ValueError( - "No GOOGLE_API_KEY found in environment variables for express mode." - ) - adk_app._tmpl_attrs["project"] = None - adk_app._tmpl_attrs["location"] = None - adk_app._tmpl_attrs["express_mode_api_key"] = api_key - else: - _, project_id = google.auth.default() - location = os.environ.get( - "GOOGLE_CLOUD_AGENT_ENGINE_LOCATION", - os.environ.get("GOOGLE_CLOUD_LOCATION", None), - ) - if not project_id or not location: - raise ValueError( - "No GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_LOCATION found in" - " environment variables." - ) - adk_app._tmpl_attrs["project"] = project_id - adk_app._tmpl_attrs["location"] = location - adk_app._tmpl_attrs["express_mode_api_key"] = None - adk_app._tmpl_attrs["runner"] = None - adk_app._tmpl_attrs["app_name"] = gemini_enterprise_app_name - adk_app._tmpl_attrs["session_service"] = session_service - adk_app._tmpl_attrs["memory_service"] = memory_service - adk_app._tmpl_attrs["artifact_service"] = artifact_service - - def _encode_chunk_to_json(chunk: Any) -> str | None: - """Encodes a chunk to a JSON string with a newline.""" - try: - json_chunk = jsonable_encoder(chunk) - return f"{json.dumps(json_chunk)}\n" - except Exception: - logging.exception("Failed to encode chunk") - return None - - async def json_generator(output: AsyncIterator[Any]) -> AsyncIterator[str]: - async for chunk in output: - encoded_chunk = _encode_chunk_to_json(chunk) - if encoded_chunk is None: - break - yield encoded_chunk - - async def _invoke_callable_or_raise( - invocation_callable: Callable[..., Any], - invocation_payload: dict[str, Any], - ) -> Any: - if inspect.iscoroutinefunction(invocation_callable): - return await invocation_callable(**invocation_payload) - elif inspect.isasyncgenfunction(invocation_callable): - return invocation_callable(**invocation_payload) - else: - return await run_in_threadpool( - invocation_callable, **invocation_payload - ) - - # Implement a FastAPI middleware to extract and attach OpenTelemetry trace - # context from a custom Google-Agent-Engine-Traceparent header in incoming - # requests. This enables distributed tracing. - tracer_provider = trace.get_tracer_provider() - if isinstance(tracer_provider, TracerProvider): - tracer_provider.add_span_processor(TopSpanProcessor()) - else: - logging.warning( - "OpenTelemetry tracing is not enabled. Please set the" - " `OTEL_PYTHON_TRACER_PROVIDER` environment variable to enable" - " tracing." - ) - - @app.middleware("http") - async def context_propagation( - request: Request, call_next: Callable[[Request], Awaitable[Any]] - ) -> Any: - ctx = get_propagated_context(request) - token = context.attach(ctx) - try: - response = await call_next(request) - return response - finally: - context.detach(token) - - @app.post( - "/api/reasoning_engine", - response_model_exclude_none=True, - response_class=JSONResponse, - ) - async def query(request: Request): - try: - body = await request.json() - except json.JSONDecodeError as exc: - raise HTTPException(status_code=400, detail=f"Invalid JSON: {exc}") - try: - parsed = _QueryRequest.model_validate(body) - except _ValidationError as exc: - raise HTTPException(status_code=400, detail=exc.errors()) - if not adk_app._tmpl_attrs.get("runner"): - adk_app._tmpl_attrs["runner"] = await adk_web_server.get_runner_async( - app_name=gemini_enterprise_app_name - ) - if parsed.class_method is None: - raise HTTPException( - status_code=400, detail="class_method cannot be None" - ) - if parsed.class_method not in _ALLOWED_AGENT_ENGINE_CLASS_METHODS: - raise HTTPException( - status_code=400, - detail=f"class_method {parsed.class_method} is not allowed", - ) - method = getattr(adk_app, parsed.class_method) - output = await _invoke_callable_or_raise(method, parsed.input or {}) - - try: - json_serialized_content = jsonable_encoder({"output": output}) - except ValueError as encoding_error: - logging.exception( - "FastAPI could not JSON-encode the response from invocation method" - " %s. Error: %s. Invocation method's original response: %r", - parsed.class_method, - encoding_error, - output, - ) - raise - return JSONResponse(content=json_serialized_content) - - @app.post( - "/api/stream_reasoning_engine", - response_model_exclude_none=True, - response_class=StreamingResponse, - ) - async def stream_query(request: Request): - try: - body = await request.json() - except json.JSONDecodeError as exc: - raise HTTPException(status_code=400, detail=f"Invalid JSON: {exc}") - try: - parsed = _QueryRequest.model_validate(body) - except _ValidationError as exc: - raise HTTPException(status_code=400, detail=exc.errors()) - if not adk_app._tmpl_attrs.get("runner"): - adk_app._tmpl_attrs["runner"] = await adk_web_server.get_runner_async( - app_name=gemini_enterprise_app_name - ) - if parsed.class_method is None: - raise HTTPException( - status_code=400, detail="class_method cannot be None" - ) - if parsed.class_method not in _ALLOWED_AGENT_ENGINE_CLASS_METHODS: - raise HTTPException( - status_code=400, - detail=f"class_method {parsed.class_method} is not allowed", - ) - method = getattr(adk_app, parsed.class_method) - output = await _invoke_callable_or_raise(method, parsed.input or {}) - - if inspect.isgenerator(output): - - async def _aiter_from_iter(iterator): - while True: - try: - chunk = await run_in_threadpool(next, iterator) - yield chunk - except StopIteration: - break - - content_iter = _aiter_from_iter(output) - else: - content_iter = output - - return StreamingResponse( - content=json_generator(content_iter), - media_type="application/json", - ) - return app diff --git a/src/google/adk/cli/utils/_onboarding.py b/src/google/adk/cli/utils/_onboarding.py index 428828a27f..5447ec6aad 100644 --- a/src/google/adk/cli/utils/_onboarding.py +++ b/src/google/adk/cli/utils/_onboarding.py @@ -182,12 +182,7 @@ def handle_login_with_google() -> VertexAIAuth | ExpressModeAuth: ) # Check for existing full GCP projects - try: - projects = gcp_utils.list_gcp_projects(limit=20) - except RuntimeError as e: - click.secho(str(e), fg="yellow") - projects = [] - + projects = gcp_utils.list_gcp_projects(limit=20) if projects: click.secho("Recently created Google Cloud projects found:", fg="green") click.echo("0. Enter project ID manually") diff --git a/src/google/adk/cli/utils/agent_loader.py b/src/google/adk/cli/utils/agent_loader.py index 5a8c6d4c2c..a7bbcbc2a6 100644 --- a/src/google/adk/cli/utils/agent_loader.py +++ b/src/google/adk/cli/utils/agent_loader.py @@ -39,16 +39,6 @@ logger = logging.getLogger("google_adk." + __name__) - -def is_single_agent_directory(path: Path | str) -> bool: - """Returns True if the directory contains a single agent configuration or file.""" - p = Path(path).resolve() - return ( - p.joinpath("agent.py").is_file() - or p.joinpath("root_agent.yaml").is_file() - ) - - # Special agents directory for agents with names starting with double underscore SPECIAL_AGENTS_DIR = os.path.join( os.path.dirname(__file__), "..", "built_in_agents" @@ -70,36 +60,10 @@ class AgentLoader(BaseAgentLoader): """ def __init__(self, agents_dir: str): - agents_path = Path(agents_dir).resolve() - is_single_agent = is_single_agent_directory(agents_path) - if is_single_agent: - self._is_single_agent = True - self._single_agent_name = agents_path.name - self.agents_dir = str(agents_path.parent) - else: - self._is_single_agent = False - self._single_agent_name = None - self.agents_dir = str(agents_path) - + self.agents_dir = str(Path(agents_dir)) self._original_sys_path = None self._agent_cache: dict[str, Union[BaseAgent, App]] = {} - @property - def is_single_agent(self) -> bool: - """Returns True if the loader is in single agent mode.""" - return self._is_single_agent - - @property - def single_agent_name(self) -> Optional[str]: - """Returns the name of the agent in single agent mode.""" - return self._single_agent_name - - def _set_single_agent_mode(self, name: str, agents_dir: str) -> None: - """Internal method to force single agent mode. Use with care.""" - self._is_single_agent = True - self._single_agent_name = name - self.agents_dir = agents_dir - def _load_from_module_or_package( self, agent_name: str ) -> Optional[Union[BaseAgent, App]]: @@ -118,9 +82,7 @@ def _load_from_module_or_package( # Check for "root_agent" directly in "{agent_name}" module/package elif hasattr(module_candidate, "root_agent"): logger.debug("Found root_agent directly in %s", agent_name) - from ...workflow._base_node import BaseNode - - if isinstance(module_candidate.root_agent, (BaseAgent, BaseNode)): + if isinstance(module_candidate.root_agent, BaseAgent): return module_candidate.root_agent else: logger.warning( @@ -167,9 +129,7 @@ def _load_from_submodule( return module_candidate.app elif hasattr(module_candidate, "root_agent"): logger.info("Found root_agent in %s.agent", agent_name) - from ...workflow._base_node import BaseNode - - if isinstance(module_candidate.root_agent, (BaseAgent, BaseNode)): + if isinstance(module_candidate.root_agent, BaseAgent): return module_candidate.root_agent else: logger.warning( @@ -240,13 +200,6 @@ def _validate_agent_name(self, agent_name: str) -> None: name_to_check = agent_name check_dir = self.agents_dir - if self._is_single_agent and not agent_name.startswith("__"): - if agent_name != self._single_agent_name: - raise ValueError( - f"Agent not found: {agent_name!r}. In single agent mode, only " - f"'{self._single_agent_name}' is accessible." - ) - if not self._VALID_AGENT_NAME_RE.match(name_to_check): raise ValueError( f"Invalid agent name: {agent_name!r}. Agent names must be valid" @@ -391,8 +344,7 @@ def _attach_metadata(target: Union[BaseAgent, App]) -> None: if isinstance(loaded, App): _attach_metadata(loaded) - if loaded.root_agent is not None: - _attach_metadata(loaded.root_agent) + _attach_metadata(loaded.root_agent) else: _attach_metadata(loaded) @@ -411,8 +363,6 @@ def load_agent(self, agent_name: str) -> Union[BaseAgent, App]: @override def list_agents(self) -> list[str]: """Lists all agents available in the agent loader (sorted alphabetically).""" - if self._is_single_agent: - return [self._single_agent_name] base_path = Path.cwd() / self.agents_dir agent_names = [ x diff --git a/src/google/adk/cli/utils/dot_adk_folder.py b/src/google/adk/cli/utils/dot_adk_folder.py index 5b52d72d56..97a2f48056 100644 --- a/src/google/adk/cli/utils/dot_adk_folder.py +++ b/src/google/adk/cli/utils/dot_adk_folder.py @@ -23,7 +23,7 @@ def _resolve_agent_dir(*, agents_root: Path | str, app_name: str) -> Path: """Resolves the agent directory with safety checks.""" agents_root_path = Path(agents_root).resolve() agent_dir = (agents_root_path / app_name).resolve() - if not agent_dir.is_relative_to(agents_root_path): + if not str(agent_dir).startswith(str(agents_root_path)): raise ValueError( f"Invalid app_name '{app_name}': resolves outside base directory" ) diff --git a/src/google/adk/cli/utils/evals.py b/src/google/adk/cli/utils/evals.py index 16cf82ee77..ff3c148637 100644 --- a/src/google/adk/cli/utils/evals.py +++ b/src/google/adk/cli/utils/evals.py @@ -15,8 +15,6 @@ from __future__ import annotations import os -from typing import Any -from typing import TYPE_CHECKING from pydantic import alias_generators from pydantic import BaseModel @@ -24,12 +22,10 @@ from ...evaluation.eval_case import Invocation from ...evaluation.evaluation_generator import EvaluationGenerator +from ...evaluation.gcs_eval_set_results_manager import GcsEvalSetResultsManager +from ...evaluation.gcs_eval_sets_manager import GcsEvalSetsManager from ...sessions.session import Session -if TYPE_CHECKING: - from ...evaluation.gcs_eval_set_results_manager import GcsEvalSetResultsManager - from ...evaluation.gcs_eval_sets_manager import GcsEvalSetsManager - class GcsEvalManagers(BaseModel): model_config = ConfigDict( @@ -38,9 +34,9 @@ class GcsEvalManagers(BaseModel): arbitrary_types_allowed=True, ) - eval_sets_manager: 'GcsEvalSetsManager' + eval_sets_manager: GcsEvalSetsManager - eval_set_results_manager: 'GcsEvalSetResultsManager' + eval_set_results_manager: GcsEvalSetResultsManager def convert_session_to_eval_invocations(session: Session) -> list[Invocation]: @@ -70,19 +66,8 @@ def create_gcs_eval_managers_from_uri( Raises: ValueError: If the eval_storage_uri is not supported. - RuntimeError: If GCP optional dependencies are missing. """ if eval_storage_uri.startswith('gs://'): - try: - from ...evaluation.gcs_eval_set_results_manager import GcsEvalSetResultsManager - from ...evaluation.gcs_eval_sets_manager import GcsEvalSetsManager - except ImportError as e: - raise RuntimeError( - 'GCS evaluation managers require Google Cloud optional' - ' dependencies.\nPlease install them using: pip install' - ' google-adk[gcp]\nOr: pip install google-cloud-storage>=2.18' - ) from e - gcs_bucket = eval_storage_uri.split('://')[1] eval_sets_manager = GcsEvalSetsManager( bucket_name=gcs_bucket, project=os.environ['GOOGLE_CLOUD_PROJECT'] diff --git a/src/google/adk/cli/utils/gcp_utils.py b/src/google/adk/cli/utils/gcp_utils.py index 59aaaedfba..a5a8ebb6de 100644 --- a/src/google/adk/cli/utils/gcp_utils.py +++ b/src/google/adk/cli/utils/gcp_utils.py @@ -27,6 +27,7 @@ import google.auth.exceptions from google.auth.transport.requests import AuthorizedSession from google.auth.transport.requests import Request +from google.cloud import resourcemanager_v3 import requests _VERTEX_AI_ENDPOINT = "https://{location}-aiplatform.googleapis.com/v1beta1" @@ -160,14 +161,6 @@ def list_gcp_projects(limit: int = 20) -> List[Tuple[str, str]]: Returns: A list of (project_id, name) tuples. """ - try: - from google.cloud import resourcemanager_v3 - except ImportError as e: - raise RuntimeError( - "Listing GCP projects requires the 'gcp' optional dependency. " - "Please install 'google-adk[gcp]' or 'google-cloud-resource-manager'." - ) from e - try: client = resourcemanager_v3.ProjectsClient() search_results = client.search_projects() diff --git a/src/google/adk/cli/utils/graph_serialization.py b/src/google/adk/cli/utils/graph_serialization.py deleted file mode 100644 index ebda2b7206..0000000000 --- a/src/google/adk/cli/utils/graph_serialization.py +++ /dev/null @@ -1,294 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -"""Utility functions for serializing agent graphs for the web UI.""" - -import logging -from typing import Any - -logger = logging.getLogger("google_adk." + __name__) - -from ...agents.base_agent import BaseAgent -from ...models.base_llm import BaseLlm -from ...tools.base_toolset import BaseToolset - -# Node type mapping for cleaner lookup -NODE_TYPE_MAP = { - "FunctionNode": "function", - "ToolNode": "tool", - "JoinNode": "join", -} - -# Fields to skip during agent serialization -SKIP_FIELDS = { - "parent_agent", - "before_agent_callback", - "after_agent_callback", - "before_model_callback", - "after_model_callback", - "on_model_error_callback", - "before_tool_callback", - "after_tool_callback", - "on_tool_error_callback", -} - - -def _get_node_field(node: Any, field_name: str) -> Any: - """Safely get a node field using object.__getattribute__.""" - return object.__getattribute__(node, field_name) - - -def serialize_node_like(item: Any) -> Any: - """Serialize a NodeLike object (str, BaseAgent, BaseTool, Callable, BaseNode).""" - if item == "START": - return "START" - # Handle primitives - if isinstance(item, (str, int, float, bool)): - return item - # Handle BaseAgent - class_name = type(item).__name__ - if "Agent" in class_name and hasattr(item, "model_fields"): - return serialize_agent(item) - # Handle BaseNode - if "Node" in class_name and hasattr(item, "get_name"): - return serialize_node(item) - # Handle callable - if callable(item): - return {"name": getattr(item, "__name__", str(item)), "type": "function"} - return str(item) - - -def serialize_node(node: Any) -> dict[str, Any]: - """Serialize a node (BaseNode subclasses like FunctionNode, AgentNode, etc.).""" - class_name = type(node).__name__ - node_name = _get_node_field(node, "name") - - # Handle START node - if node_name == "__START__": - return { - "name": "__START__", - "type": "start", - "rerun_on_resume": _get_node_field(node, "rerun_on_resume"), - } - - if hasattr(node, "model_fields"): - result = serialize_agent(node) - if "type" not in result: - if getattr(node, "graph", None) is not None: - result["type"] = "workflow" - else: - result["type"] = NODE_TYPE_MAP.get( - class_name, "agent" if "Agent" in class_name else "node" - ) - return result - - # Get node type from mapping or default to 'node' - node_type = NODE_TYPE_MAP.get(class_name, "node") - - return { - "name": node_name, - "type": node_type, - "rerun_on_resume": _get_node_field(node, "rerun_on_resume"), - } - - -def serialize_agent(agent: BaseAgent) -> dict[str, Any]: - """Recursively serialize an agent, excluding non-serializable fields.""" - agent_dict = {} - - for field_name, field_info in agent.__class__.model_fields.items(): - if field_name in SKIP_FIELDS: - continue - - value = getattr(agent, field_name, None) - - if value is None: - continue - - # Handle sub_agents recursively - if field_name == "sub_agents": - agent_dict[field_name] = [ - serialize_agent(sub_agent) for sub_agent in value - ] - # Handle nodes field (for _Mesh/LlmAgent) - elif field_name == "nodes": - try: - serialized_nodes = [] - for node in value: - if hasattr(node, "model_fields"): - serialized_nodes.append(serialize_agent(node)) - else: - serialized_nodes.append(serialize_node(node)) - agent_dict[field_name] = serialized_nodes - except Exception as e: - logger.warning("Error serializing nodes field: %s", e) - # Handle graph field (Graph with nodes and edges) - elif field_name == "graph": - try: - graph_dict = {} - # Serialize nodes - if hasattr(value, "nodes") and value.nodes: - graph_dict["nodes"] = [serialize_node(node) for node in value.nodes] - # Serialize edges - if hasattr(value, "edges") and value.edges: - serialized_edges = [] - for edge in value.edges: - edge_dict = {} - if hasattr(edge, "from_node"): - edge_dict["from_node"] = serialize_node(edge.from_node) - if hasattr(edge, "to_node"): - edge_dict["to_node"] = serialize_node(edge.to_node) - if hasattr(edge, "route") and edge.route is not None: - edge_dict["route"] = edge.route - serialized_edges.append(edge_dict) - graph_dict["edges"] = serialized_edges - agent_dict[field_name] = graph_dict - except Exception: - pass - # Handle edges field (list of EdgeItems) - elif field_name == "edges": - try: - serialized_edges = [] - for edge_item in value: - if isinstance(edge_item, tuple): - serialized = [] - for elem in edge_item: - if isinstance(elem, dict): - serialized.append( - {str(k): serialize_node_like(v) for k, v in elem.items()} - ) - else: - serialized.append(serialize_node_like(elem)) - serialized_edges.append(serialized) - elif hasattr(edge_item, "from_node") and hasattr( - edge_item, "to_node" - ): - edge_dict = { - "from_node": serialize_node(edge_item.from_node), - "to_node": serialize_node(edge_item.to_node), - } - if hasattr(edge_item, "route") and edge_item.route is not None: - edge_dict["route"] = edge_item.route - serialized_edges.append(edge_dict) - else: - serialized_edges.append(str(edge_item)) - agent_dict[field_name] = serialized_edges - except Exception: - pass - # Handle tools field - elif field_name == "tools": - try: - sub_agents = getattr(agent, "sub_agents", []) or [] - sub_agent_names = { - getattr(sa, "name", None) - for sa in sub_agents - if getattr(sa, "name", None) - } - - serialized_tools = [] - for tool in value: - tool_name = None - if callable(tool): - tool_name = getattr(tool, "__name__", str(tool)) - elif hasattr(tool, "name"): - tool_name = tool.name - elif isinstance(tool, BaseToolset): - tool_name = type(tool).__name__ - - if tool_name and tool_name in sub_agent_names: - continue - - if tool_name is not None: - serialized_tools.append({ - "name": tool_name, - "type": "tool", - }) - else: - serialized_tools.append(str(tool)) - agent_dict[field_name] = serialized_tools - except Exception: - pass - else: - try: - if callable(value): - continue - # Handle nested agents - if isinstance(value, BaseAgent): - agent_dict[field_name] = serialize_agent(value) - elif isinstance(value, BaseLlm): - agent_dict[field_name] = value.model - # Handle simple types and collections - elif isinstance(value, (str, int, float, bool, list, dict)): - agent_dict[field_name] = value - elif hasattr(value, "model_dump"): - agent_dict[field_name] = value.model_dump( - mode="python", exclude_none=True - ) - else: - agent_dict[field_name] = str(value) - except Exception as e: - logger.warning( - "Error serializing field '%s' of agent %s: %s", - field_name, - type(agent).__name__, - e, - ) - - return agent_dict - - -def serialize_app_info(app: Any, readme: str | None = None) -> dict[str, Any]: - """Serialize app information for the build_graph endpoint.""" - root = app.root_agent - try: - root_agent_data = serialize_agent(root) - except Exception as e: - logger.error("Error serializing root agent/node: %s", e, exc_info=True) - raise - - app_info = { - "name": app.name, - "root_agent": root_agent_data, - } - - # Add optional fields if present - if app.plugins: - app_info["plugins"] = [ - {"name": getattr(plugin, "name", type(plugin).__name__)} - for plugin in app.plugins - ] - - if app.context_cache_config: - try: - app_info["context_cache_config"] = app.context_cache_config.model_dump( - mode="python", exclude_none=True - ) - except Exception: - pass - - if app.resumability_config: - try: - app_info["resumability_config"] = app.resumability_config.model_dump( - mode="python", exclude_none=True - ) - except Exception: - pass - - # Include README content if provided - if readme: - app_info["readme"] = readme - - return app_info diff --git a/src/google/adk/cli/utils/graph_visualization.py b/src/google/adk/cli/utils/graph_visualization.py deleted file mode 100644 index e3317e97ce..0000000000 --- a/src/google/adk/cli/utils/graph_visualization.py +++ /dev/null @@ -1,346 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Utility functions for visualizing agent graphs.""" - -from __future__ import annotations - -import html -from typing import Any - -import graphviz - -from ...workflow._node_status import NodeStatus - - -def plot_workflow_graph( - app_info: dict[str, Any], - agent_state: dict[str, Any] | None = None, - format: str = "svg", - dark_mode: bool = True, -) -> str | bytes: - """Plots the workflow graph with node statuses.""" - agent_state = agent_state or {} - root_agent = app_info.get("root_agent", {}) - graph = root_agent.get("graph", {}) - is_workflow = bool(graph) - - if not graph: - root_name = root_agent.get("name", "root_agent") - sub_agents = root_agent.get("sub_agents", []) - tools = root_agent.get("tools", []) - - nodes = [{"name": root_name, "type": "agent", "tools": tools}] - edges = [] - - def _traverse_sub_agents(agent_dict, parent_name): - for sub in agent_dict.get("sub_agents", []): - sub_name = sub.get("name") - if sub_name: - nodes.append( - {"name": sub_name, "type": "agent", "tools": sub.get("tools", [])} - ) - edges.append({ - "from_node": {"name": parent_name}, - "to_node": {"name": sub_name}, - }) - _traverse_sub_agents(sub, sub_name) - - _traverse_sub_agents(root_agent, root_name) - graph = {"nodes": nodes, "edges": edges} - - nodes_state = agent_state.get("nodes", {}) - dot = graphviz.Digraph(comment="Workflow Visualization") - - if dark_mode: - graph_bgcolor = "#0F172A" - node_fillcolor = "#1E293B" - node_color = "#475569" - node_fontcolor = "#F8FAFC" - edge_color = "#94A3B8" - edge_fontcolor = "#CBD5E1" - start_fillcolor = "#059669" - start_color = "#047857" - end_fillcolor = "#DC2626" - end_color = "#B91C1C" - status_colors = { - NodeStatus.COMPLETED: "#16A34A", - NodeStatus.RUNNING: "#D97706", - NodeStatus.FAILED: "#EF4444", - NodeStatus.INACTIVE: "#1E293B", - NodeStatus.WAITING: "#9333EA", - NodeStatus.CANCELLED: "#475569", - } - else: - graph_bgcolor = "#F8FAFC" - node_fillcolor = "#FFFFFF" - node_color = "#94A3B8" - node_fontcolor = "#0F172A" - edge_color = "#64748B" - edge_fontcolor = "#475569" - start_fillcolor = "#10B981" - start_color = "#059669" - end_fillcolor = "#EF4444" - end_color = "#DC2626" - status_colors = { - NodeStatus.COMPLETED: "#69CB87", - NodeStatus.RUNNING: "#e8b589", - NodeStatus.FAILED: "salmon", - NodeStatus.INACTIVE: "#FFFFFF", - NodeStatus.WAITING: "#d2a6e0", - NodeStatus.CANCELLED: "lightgray", - } - - dot.attr( - "graph", - bgcolor=graph_bgcolor, - pad="0.5", - nodesep="0.5", - ranksep="0.8", - fontname="Helvetica", - splines="spline", - ) - - dot.attr( - "node", - shape="rect", - style="rounded,filled", - fillcolor=node_fillcolor, - color=node_color, - penwidth="1.5", - fontname="Helvetica", - fontcolor=node_fontcolor, - fontsize="12", - margin="0.25,0.15", - ) - - dot.attr( - "edge", - color=edge_color, - penwidth="1.2", - fontname="Helvetica", - fontcolor=edge_fontcolor, - fontsize="10", - arrowhead="vee", - arrowsize="0.7", - ) - - # Get nodes and edges - nodes = list(graph.get("nodes", [])) - edges = list(graph.get("edges", [])) - - # Inject tools as nodes - tool_nodes = {} - tool_edges = [] - for node in nodes: - node_name = node.get("name") - if not node_name or node_name == "__START__": - continue - - tools = node.get("tools", []) - for tool in tools: - tool_name = tool.get("name") if isinstance(tool, dict) else str(tool) - if tool_name: - if tool_name not in tool_nodes: - tool_type = ( - tool.get("type", "tool") if isinstance(tool, dict) else "tool" - ) - tool_nodes[tool_name] = {"name": tool_name, "type": tool_type} - tool_edges.append({ - "from_node": {"name": node_name}, - "to_node": {"name": tool_name}, - "is_tool_edge": True, - }) - - for n in tool_nodes.values(): - if not any(on.get("name") == n["name"] for on in nodes): - nodes.append(n) - edges.extend(tool_edges) - - for node in nodes: - node_name = node.get("name") - if not node_name or node_name == "__START__": - continue - - outgoing_edges = [ - e for e in edges if e.get("from_node", {}).get("name") == node_name - ] - is_conditional = any(e.get("route") for e in outgoing_edges) - - node_data = nodes_state.get(node_name, {}) - status_val = node_data.get("status", NodeStatus.INACTIVE.value) - if isinstance(status_val, NodeStatus): - status = status_val - else: - try: - status = NodeStatus(status_val) - except (ValueError, KeyError): - status = NodeStatus.INACTIVE - - fillcolor = status_colors.get(status, node_fillcolor) - - node_type = node.get("type", "node") - icons = { - "agent": ("✦", "#42A5F5"), - "workflow": ("⊷", "#9333EA"), - "function": ("ƒ", "#10B981"), - "join": ("⌵", "#F59E0B"), - "tool": ("🔧", "#6B7280"), - } - icon_data = icons.get(node_type) - type_display = node_type.title() - - if icon_data: - icon, color = icon_data - escaped_name = html.escape(node_name) - node_label = ( - f'<{icon}' - f" {escaped_name}>" - ) - else: - node_label = node_name - - if is_conditional: - has_default = any( - not e.get("route") or e.get("route") == "__DEFAULT__" - for e in outgoing_edges - if not e.get("is_tool_edge") - ) - if not has_default: - if icon_data: - icon, color = icon_data - escaped_name = html.escape(node_name) - node_label = ( - f'<{icon}' - f' {escaped_name}

        ⚠️ [NO' - " DEFAULT]>" - ) - else: - escaped_label = html.escape(node_label) - node_label = ( - f"<{escaped_label}

        ⚠️ [NO" - " DEFAULT]>" - ) - - dot.node( - node_name, - node_label, - tooltip=type_display, - shape="diamond", - style="filled", - fillcolor=fillcolor, - height="1.2", - width="0.8", - margin="0.0,0.0", - ) - elif node_type == "join": - dot.node( - node_name, - node_label, - tooltip=type_display, - shape="oval", - style="filled", - fillcolor=fillcolor, - margin="0.05,0.05", - ) - elif node_type == "tool": - dot.node( - node_name, - node_label, - tooltip=type_display, - style="rounded,filled,dashed", - fillcolor=fillcolor, - ) - else: - dot.node( - node_name, - node_label, - tooltip=type_display, - style="rounded,filled", - fillcolor=fillcolor, - ) - - # Add edges - for edge in edges: - from_node_obj = edge.get("from_node", {}) - to_node_obj = edge.get("to_node", {}) - - from_node = from_node_obj.get("name") - to_node = to_node_obj.get("name") - - if from_node == "__START__": - dot.node( - "__START__", - "START", - shape="oval", - style="filled", - fillcolor=start_fillcolor, - color=start_color, - fontcolor=node_fontcolor, - fontname="Helvetica-Bold", - width="0.9", - fixedsize="true", - ) - - if from_node and to_node: - if edge.get("is_tool_edge"): - dot.edge(from_node, to_node, style="dashed", color=edge_color) - else: - label = f" {edge.get('route')}" if edge.get("route") else "" - dot.edge(from_node, to_node, label=label) - - terminal_nodes = [] - for node in nodes: - node_name = node.get("name") - if not node_name or node_name in ("__START__", "__END__"): - continue - - if node.get("type") == "tool": - continue - - outgoing_edges = [ - e - for e in edges - if e.get("from_node", {}).get("name") == node_name - and not e.get("is_tool_edge") - ] - - is_terminal = False - if not outgoing_edges: - is_terminal = True - - if is_terminal: - terminal_nodes.append(node_name) - - if is_workflow and terminal_nodes: - dot.node( - "__END__", - "END", - shape="oval", - style="filled", - fillcolor=end_fillcolor, - color=end_color, - fontcolor=node_fontcolor, - fontname="Helvetica-Bold", - width="0.9", - fixedsize="true", - ) - for t_node in terminal_nodes: - dot.edge(t_node, "__END__") - - if format == "dot": - return dot.source - if format == "svg": - return dot.pipe(format="svg").decode("utf-8") - return dot.pipe(format=format) diff --git a/src/google/adk/cli/utils/local_storage.py b/src/google/adk/cli/utils/local_storage.py index 8abce51ff7..faa3eaec02 100644 --- a/src/google/adk/cli/utils/local_storage.py +++ b/src/google/adk/cli/utils/local_storage.py @@ -18,14 +18,11 @@ import asyncio import logging from pathlib import Path -from typing import Any from typing import Mapping from typing import Optional -from google.genai import types from typing_extensions import override -from ...artifacts.base_artifact_service import ArtifactVersion from ...artifacts.base_artifact_service import BaseArtifactService from ...artifacts.file_artifact_service import FileArtifactService from ...events.event import Event @@ -39,7 +36,6 @@ logger = logging.getLogger("google_adk." + __name__) _BUILT_IN_SESSION_SERVICE_KEY = "__adk_built_in_session_service__" -_BUILT_IN_ARTIFACT_SERVICE_KEY = "__adk_built_in_artifact_service__" def create_local_database_session_service( @@ -98,31 +94,16 @@ def create_local_session_service( def create_local_artifact_service( - *, - base_dir: Path | str, - per_agent: bool = False, - app_name_to_dir: Optional[Mapping[str, str]] = None, + *, base_dir: Path | str ) -> BaseArtifactService: - """Creates a file-backed artifact service that persists data in `.adk/artifacts` folders. + """Creates a file-backed artifact service rooted in `.adk/artifacts`. Args: base_dir: Directory whose `.adk` folder will store artifacts. - per_agent: If True, creates a PerAgentFileArtifactService that stores - artifacts in each agent's `.adk/artifacts` folder. If False, creates a - single FileArtifactService at base_dir/.adk/artifacts. - app_name_to_dir: Optional mapping from logical app name to on-disk agent - folder name. Only used when per_agent is True; defaults to identity. Returns: - A `BaseArtifactService` backed by the local filesystem. + A `FileArtifactService` scoped to the derived root directory. """ - if per_agent: - logger.info("Using per-agent artifact storage rooted at %s", base_dir) - return PerAgentFileArtifactService( - agents_root=base_dir, - app_name_to_dir=app_name_to_dir, - ) - manager = DotAdkFolder(base_dir) artifact_root = manager.artifacts_dir artifact_root.mkdir(parents=True, exist_ok=True) @@ -147,24 +128,26 @@ def __init__( async def _get_service(self, app_name: str) -> BaseSessionService: async with self._service_lock: if app_name.startswith("__"): - storage_key = _BUILT_IN_SESSION_SERVICE_KEY - base_dir = self._agents_root - else: - storage_key = self._app_name_to_dir.get(app_name, app_name) - folder = dot_adk_folder_for_agent( - agents_root=self._agents_root, app_name=storage_key + service = self._services.get(_BUILT_IN_SESSION_SERVICE_KEY) + if service is not None: + return service + service = create_local_database_session_service( + base_dir=self._agents_root, ) - base_dir = folder.agent_dir + self._services[_BUILT_IN_SESSION_SERVICE_KEY] = service + return service - service = self._services.get(storage_key) + storage_name = self._app_name_to_dir.get(app_name, app_name) + service = self._services.get(storage_name) if service is not None: return service - + folder = dot_adk_folder_for_agent( + agents_root=self._agents_root, app_name=storage_name + ) service = create_local_database_session_service( - base_dir=base_dir, + base_dir=folder.agent_dir, ) - - self._services[storage_key] = service + self._services[storage_name] = service return service @override @@ -224,253 +207,7 @@ async def delete_session( app_name=app_name, user_id=user_id, session_id=session_id ) - @override - async def get_user_state( - self, *, app_name: str, user_id: str - ) -> dict[str, Any]: - service = await self._get_service(app_name) - return await service.get_user_state(app_name=app_name, user_id=user_id) - @override async def append_event(self, session: Session, event: Event) -> Event: service = await self._get_service(session.app_name) return await service.append_event(session, event) - - -class PerAgentFileArtifactService(BaseArtifactService): - """Routes artifact storage to per-agent `.adk/artifacts` folders.""" - - def __init__( - self, - *, - agents_root: Path | str, - app_name_to_dir: Optional[Mapping[str, str]] = None, - ): - self._agents_root = Path(agents_root).resolve() - self._app_name_to_dir = dict(app_name_to_dir or {}) - self._services: dict[str, BaseArtifactService] = {} - self._legacy_service: Optional[BaseArtifactService] = None - self._service_lock = asyncio.Lock() - - async def _get_service(self, app_name: str) -> BaseArtifactService: - async with self._service_lock: - if app_name.startswith("__"): - storage_key = _BUILT_IN_ARTIFACT_SERVICE_KEY - base_dir = self._agents_root - else: - storage_key = self._app_name_to_dir.get(app_name, app_name) - folder = dot_adk_folder_for_agent( - agents_root=self._agents_root, app_name=storage_key - ) - base_dir = folder.agent_dir - - service = self._services.get(storage_key) - if service is not None: - return service - - service = create_local_artifact_service(base_dir=base_dir) - self._services[storage_key] = service - return service - - async def _get_legacy_service( - self, app_name: str - ) -> Optional[BaseArtifactService]: - """Returns a reader for the pre-per-agent shared `.adk/artifacts` root. - - Returns None for built-in agents (which already use that root) and when - no legacy directory exists, so reads fall back only when there is legacy - data to find. Never creates the legacy directory. - """ - if app_name.startswith("__"): - return None - if self._legacy_service is not None: - return self._legacy_service - legacy_dir = DotAdkFolder(self._agents_root).artifacts_dir - if not legacy_dir.exists(): - return None - async with self._service_lock: - if self._legacy_service is None: - self._legacy_service = FileArtifactService(root_dir=legacy_dir) - return self._legacy_service - - @override - async def save_artifact( - self, - *, - app_name: str, - user_id: str, - filename: str, - artifact: types.Part | dict[str, Any], - session_id: Optional[str] = None, - custom_metadata: Optional[dict[str, Any]] = None, - ) -> int: - service = await self._get_service(app_name) - return await service.save_artifact( - app_name=app_name, - user_id=user_id, - filename=filename, - artifact=artifact, - session_id=session_id, - custom_metadata=custom_metadata, - ) - - @override - async def load_artifact( - self, - *, - app_name: str, - user_id: str, - filename: str, - session_id: Optional[str] = None, - version: Optional[int] = None, - ) -> Optional[types.Part]: - service = await self._get_service(app_name) - result = await service.load_artifact( - app_name=app_name, - user_id=user_id, - filename=filename, - session_id=session_id, - version=version, - ) - if result is not None: - return result - legacy = await self._get_legacy_service(app_name) - if legacy is None: - return None - return await legacy.load_artifact( - app_name=app_name, - user_id=user_id, - filename=filename, - session_id=session_id, - version=version, - ) - - @override - async def list_artifact_keys( - self, *, app_name: str, user_id: str, session_id: Optional[str] = None - ) -> list[str]: - service = await self._get_service(app_name) - keys = await service.list_artifact_keys( - app_name=app_name, user_id=user_id, session_id=session_id - ) - legacy = await self._get_legacy_service(app_name) - if legacy is None: - return keys - legacy_keys = await legacy.list_artifact_keys( - app_name=app_name, user_id=user_id, session_id=session_id - ) - return sorted(set(keys) | set(legacy_keys)) - - @override - async def delete_artifact( - self, - *, - app_name: str, - user_id: str, - filename: str, - session_id: Optional[str] = None, - ) -> None: - service = await self._get_service(app_name) - await service.delete_artifact( - app_name=app_name, - user_id=user_id, - filename=filename, - session_id=session_id, - ) - # Also delete any legacy copy so a deleted artifact can't reappear via the - # read fallback. - legacy = await self._get_legacy_service(app_name) - if legacy is not None: - await legacy.delete_artifact( - app_name=app_name, - user_id=user_id, - filename=filename, - session_id=session_id, - ) - - @override - async def list_versions( - self, - *, - app_name: str, - user_id: str, - filename: str, - session_id: Optional[str] = None, - ) -> list[int]: - service = await self._get_service(app_name) - versions = await service.list_versions( - app_name=app_name, - user_id=user_id, - filename=filename, - session_id=session_id, - ) - if versions: - return versions - legacy = await self._get_legacy_service(app_name) - if legacy is None: - return versions - return await legacy.list_versions( - app_name=app_name, - user_id=user_id, - filename=filename, - session_id=session_id, - ) - - @override - async def list_artifact_versions( - self, - *, - app_name: str, - user_id: str, - filename: str, - session_id: Optional[str] = None, - ) -> list[ArtifactVersion]: - service = await self._get_service(app_name) - versions = await service.list_artifact_versions( - app_name=app_name, - user_id=user_id, - filename=filename, - session_id=session_id, - ) - if versions: - return versions - legacy = await self._get_legacy_service(app_name) - if legacy is None: - return versions - return await legacy.list_artifact_versions( - app_name=app_name, - user_id=user_id, - filename=filename, - session_id=session_id, - ) - - @override - async def get_artifact_version( - self, - *, - app_name: str, - user_id: str, - filename: str, - session_id: Optional[str] = None, - version: Optional[int] = None, - ) -> Optional[ArtifactVersion]: - service = await self._get_service(app_name) - result = await service.get_artifact_version( - app_name=app_name, - user_id=user_id, - filename=filename, - session_id=session_id, - version=version, - ) - if result is not None: - return result - legacy = await self._get_legacy_service(app_name) - if legacy is None: - return None - return await legacy.get_artifact_version( - app_name=app_name, - user_id=user_id, - filename=filename, - session_id=session_id, - version=version, - ) diff --git a/src/google/adk/cli/utils/service_factory.py b/src/google/adk/cli/utils/service_factory.py index 8b5e7610ad..72683f832a 100644 --- a/src/google/adk/cli/utils/service_factory.py +++ b/src/google/adk/cli/utils/service_factory.py @@ -27,7 +27,6 @@ from ...sessions.base_session_service import BaseSessionService from ...utils.env_utils import is_env_enabled from ..service_registry import get_service_registry -from .dot_adk_folder import DotAdkFolder from .local_storage import create_local_artifact_service from .local_storage import create_local_session_service @@ -274,7 +273,6 @@ def create_artifact_service_from_options( base_dir: Path | str, artifact_service_uri: str | None = None, strict_uri: bool = False, - app_name_to_dir: dict[str, str] | None = None, use_local_storage: bool = True, ) -> BaseArtifactService: """Creates an artifact service based on CLI/web options.""" @@ -314,22 +312,8 @@ def create_artifact_service_from_options( "Set --artifact_service_uri for production deployments." ) - # Default to per-agent local storage in //.adk/artifacts. - legacy_artifacts_dir = DotAdkFolder(base_path).artifacts_dir - if legacy_artifacts_dir.exists(): - logger.warning( - "Found legacy shared artifacts at %s. Artifacts now persist" - " per-agent under /.adk/artifacts and legacy artifacts remain" - " readable via fallback. To migrate, move the 'users' directory into" - " the agent's .adk/artifacts folder.", - legacy_artifacts_dir, - ) try: - return create_local_artifact_service( - base_dir=base_path, - per_agent=True, - app_name_to_dir=app_name_to_dir, - ) + return create_local_artifact_service(base_dir=base_path) except OSError as exc: if exc.errno not in _LOCAL_STORAGE_ERRNOS and not isinstance( exc, PermissionError diff --git a/src/google/adk/dependencies/vertexai.py b/src/google/adk/dependencies/vertexai.py index c0085f299d..80132ba505 100644 --- a/src/google/adk/dependencies/vertexai.py +++ b/src/google/adk/dependencies/vertexai.py @@ -11,18 +11,9 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""Lazy import shim for Vertex AI optional dependencies.""" from __future__ import annotations -try: - import vertexai - from vertexai.preview import example_stores - from vertexai.preview import rag -except ImportError as e: - raise ImportError( - "Vertex AI features require google-adk[gcp] or google-adk[all]. " - "Install one of those extras to use google.adk.dependencies.vertexai." - ) from e - -__all__ = ["example_stores", "rag", "vertexai"] +import vertexai +from vertexai.preview import example_stores +from vertexai.preview import rag diff --git a/src/google/adk/evaluation/custom_metric_evaluator.py b/src/google/adk/evaluation/custom_metric_evaluator.py index 08ede3520d..ccc346a674 100644 --- a/src/google/adk/evaluation/custom_metric_evaluator.py +++ b/src/google/adk/evaluation/custom_metric_evaluator.py @@ -1,4 +1,4 @@ -# Copyright 2026 Google LLC +# Copyright 2025 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/google/adk/evaluation/eval_config.py b/src/google/adk/evaluation/eval_config.py index 3bfa3f6391..ead2303ceb 100644 --- a/src/google/adk/evaluation/eval_config.py +++ b/src/google/adk/evaluation/eval_config.py @@ -23,6 +23,7 @@ from pydantic import BaseModel from pydantic import ConfigDict from pydantic import Field +from pydantic import model_validator from ..agents.common_configs import CodeConfig from ..evaluation.eval_metrics import EvalMetric @@ -57,6 +58,15 @@ class CustomMetricConfig(BaseModel): description="Description for the custom metric info.", ) + @model_validator(mode="after") + def check_code_config_args(self) -> "CustomMetricConfig": + """Checks that the code config does not have args.""" + if self.code_config.args: + raise ValueError( + "args field in CodeConfig for custom metric is not supported." + ) + return self + class EvalConfig(BaseModel): """Configurations needed to run an Eval. diff --git a/src/google/adk/evaluation/eval_metrics.py b/src/google/adk/evaluation/eval_metrics.py index e3c71bffca..50c3473c3a 100644 --- a/src/google/adk/evaluation/eval_metrics.py +++ b/src/google/adk/evaluation/eval_metrics.py @@ -67,10 +67,6 @@ class PrebuiltMetrics(Enum): MULTI_TURN_TOOL_USE_QUALITY_V1 = "multi_turn_tool_use_quality_v1" - RUBRIC_BASED_MULTI_TURN_TRAJECTORY_QUALITY_V1 = ( - "rubric_based_multi_turn_trajectory_quality_v1" - ) - MetricName: TypeAlias = Union[str, PrebuiltMetrics] Threshold: TypeAlias = float @@ -119,19 +115,6 @@ class BaseCriterion(BaseModel): description="The threshold to be used by the metric.", ) - include_intermediate_responses_in_final: bool = Field( - default=False, - description=( - "Whether to evaluate the full agent response including intermediate" - " natural language text (e.g. text emitted before tool calls) in" - " addition to the final response. By default, only the final" - " response text is sent to the judge. When True, text from all" - " intermediate invocation events is concatenated with the final" - " response before evaluation. This is useful for agents that emit" - " text both before and after tool calls within a single invocation." - ), - ) - class LlmAsAJudgeCriterion(BaseCriterion): """Criterion when using LLM-As-A-Judge metric.""" diff --git a/src/google/adk/evaluation/evaluation_generator.py b/src/google/adk/evaluation/evaluation_generator.py index 5b0100818c..d5a6629366 100644 --- a/src/google/adk/evaluation/evaluation_generator.py +++ b/src/google/adk/evaluation/evaluation_generator.py @@ -383,7 +383,6 @@ async def _generate_inferences_for_single_user_invocation_live( current_invocation_id: str, turn_complete_event: asyncio.Event, live_timeout_seconds: int, - agent_name: str = _DEFAULT_AUTHOR, ) -> AsyncGenerator[Event, None]: """Generates inferences for a single user invocation in live mode.""" yield Event( @@ -409,22 +408,6 @@ async def _generate_inferences_for_single_user_invocation_live( event = await event_queue.get() if event.invocation_id == current_invocation_id: yield event - # Emit a synthetic text event for each transcription, preserving - # the order in which events are received. - if ( - event.author != _USER_AUTHOR - and event.output_transcription - and event.output_transcription.text - and event.partial - ): - yield Event( - content=Content( - role="model", - parts=[types.Part(text=event.output_transcription.text)], - ), - author=agent_name, - invocation_id=current_invocation_id, - ) @staticmethod async def _generate_inferences_from_root_agent_live( @@ -512,10 +495,31 @@ async def _generate_inferences_from_root_agent_live( current_invocation_id=live_session.current_invocation_id, turn_complete_event=live_session.turn_complete_event, live_timeout_seconds=live_timeout_seconds, - agent_name=runner.agent.name, ): events.append(event) + turn_transcription = "" + for evt in events: + if ( + evt.invocation_id == live_session.current_invocation_id + and evt.author != _USER_AUTHOR + and evt.output_transcription + ): + if not evt.partial and evt.output_transcription.text: + turn_transcription = evt.output_transcription.text + else: + turn_transcription += evt.output_transcription.text + if turn_transcription: + synthetic_event = Event( + content=Content( + role="model", + parts=[types.Part(text=turn_transcription)], + ), + author=runner.agent.name, + invocation_id=live_session.current_invocation_id, + ) + events.append(synthetic_event) + if live_session.live_finished.is_set(): logger.info("Live session finished signal detected.") break diff --git a/src/google/adk/evaluation/final_response_match_v2.py b/src/google/adk/evaluation/final_response_match_v2.py index 445d65c13d..713b421e3d 100644 --- a/src/google/adk/evaluation/final_response_match_v2.py +++ b/src/google/adk/evaluation/final_response_match_v2.py @@ -159,22 +159,13 @@ def format_auto_rater_prompt( if expected_invocation is None: raise ValueError("expected_invocation is required for this metric.") - include_intermediate = ( - self._criterion.include_intermediate_responses_in_final - ) - reference = get_text_from_content( - expected_invocation, - include_intermediate_responses_in_final=include_intermediate, - ) - response = get_text_from_content( - actual_invocation, - include_intermediate_responses_in_final=include_intermediate, - ) + reference = get_text_from_content(expected_invocation.final_response) + response = get_text_from_content(actual_invocation.final_response) user_prompt = get_text_from_content(expected_invocation.user_content) return self._auto_rater_prompt_template.format( prompt=user_prompt, - response=response or "", - golden_response=reference or "", + response=response, + golden_response=reference, ) @override diff --git a/src/google/adk/evaluation/llm_as_judge_utils.py b/src/google/adk/evaluation/llm_as_judge_utils.py index edc057be7c..cf1309ca38 100644 --- a/src/google/adk/evaluation/llm_as_judge_utils.py +++ b/src/google/adk/evaluation/llm_as_judge_utils.py @@ -25,10 +25,7 @@ from .app_details import AppDetails from .common import EvalBaseModel from .eval_case import get_all_tool_calls_with_responses -from .eval_case import IntermediateData from .eval_case import IntermediateDataType -from .eval_case import Invocation -from .eval_case import InvocationEvents from .eval_metrics import RubricScore from .evaluator import EvalStatus @@ -47,44 +44,8 @@ class Label(enum.Enum): def get_text_from_content( - content: Optional[Union[genai_types.Content, Invocation]], - *, - include_intermediate_responses_in_final: bool = False, + content: Optional[genai_types.Content], ) -> Optional[str]: - """Extracts text from a `Content` or an `Invocation`. - - When `content` is a `Content`, returns the concatenated text of its parts. - - When `content` is an `Invocation`, returns the text of the invocation's final - response. If `include_intermediate_responses_in_final` is True, text from - intermediate invocation events (e.g. natural language emitted before tool - calls) is concatenated with the final response text. - """ - if isinstance(content, Invocation): - if not include_intermediate_responses_in_final: - # Flag off: revert to basic plain-Content behavior. - return get_text_from_content(content.final_response) - - parts: list[str] = [] - if isinstance(content.intermediate_data, InvocationEvents): - # Walk intermediate events in order; collect text parts. - for event in content.intermediate_data.invocation_events: - text = get_text_from_content(event.content) - if text: - parts.append(text) - elif isinstance(content.intermediate_data, IntermediateData): - for _, response_parts in content.intermediate_data.intermediate_responses: - text = get_text_from_content(genai_types.Content(parts=response_parts)) - if text: - parts.append(text) - - # Then fetch the final response text and append it to the end. - final_text = get_text_from_content(content.final_response) - if final_text: - parts.append(final_text) - - return "\n".join(parts) if parts else None - if content and content.parts: return "\n".join([p.text for p in content.parts if p.text]) diff --git a/src/google/adk/evaluation/local_eval_service.py b/src/google/adk/evaluation/local_eval_service.py index 1a032bad64..b749b7e8f1 100644 --- a/src/google/adk/evaluation/local_eval_service.py +++ b/src/google/adk/evaluation/local_eval_service.py @@ -217,25 +217,18 @@ async def run_evaluation(inference_result): for inference_result in evaluate_request.inference_results ] - results_by_set = {} - for evaluation_task in asyncio.as_completed(evaluation_tasks): inference_result, eval_case_result = await evaluation_task - results_by_set.setdefault(inference_result.eval_set_id, []).append( - (inference_result.app_name, eval_case_result) - ) - yield eval_case_result - if self._eval_set_results_manager: - for eval_set_id, results in results_by_set.items(): - app_name = results[0][0] - cases = [r[1] for r in results] + if self._eval_set_results_manager: self._eval_set_results_manager.save_eval_set_result( - app_name=app_name, - eval_set_id=eval_set_id, - eval_case_results=cases, + app_name=inference_result.app_name, + eval_set_id=inference_result.eval_set_id, + eval_case_results=[eval_case_result], ) + yield eval_case_result + async def _evaluate_single_inference_result( self, inference_result: InferenceResult, evaluate_config: EvaluateConfig ) -> tuple[InferenceResult, EvalCaseResult]: diff --git a/src/google/adk/evaluation/metric_evaluator_registry.py b/src/google/adk/evaluation/metric_evaluator_registry.py index 8b10172bca..b005bd36e6 100644 --- a/src/google/adk/evaluation/metric_evaluator_registry.py +++ b/src/google/adk/evaluation/metric_evaluator_registry.py @@ -33,7 +33,6 @@ from .metric_info_providers import PerTurnUserSimulatorQualityV1MetricInfoProvider from .metric_info_providers import ResponseEvaluatorMetricInfoProvider from .metric_info_providers import RubricBasedFinalResponseQualityV1EvaluatorMetricInfoProvider -from .metric_info_providers import RubricBasedMultiTurnTrajectoryMetricInfoProvider from .metric_info_providers import RubricBasedToolUseV1EvaluatorMetricInfoProvider from .metric_info_providers import SafetyEvaluatorV1MetricInfoProvider from .metric_info_providers import TrajectoryEvaluatorMetricInfoProvider @@ -42,7 +41,6 @@ from .multi_turn_trajectory_quality_evaluator import MultiTurnTrajectoryQualityV1Evaluator from .response_evaluator import ResponseEvaluator from .rubric_based_final_response_quality_v1 import RubricBasedFinalResponseQualityV1Evaluator -from .rubric_based_multi_turn_trajectory_evaluator import RubricBasedMultiTurnTrajectoryEvaluator from .rubric_based_tool_use_quality_v1 import RubricBasedToolUseV1Evaluator from .safety_evaluator import SafetyEvaluatorV1 from .simulation.per_turn_user_simulator_quality_v1 import PerTurnUserSimulatorQualityV1 @@ -166,10 +164,6 @@ def _get_default_metric_evaluator_registry() -> MetricEvaluatorRegistry: metric_info=PerTurnUserSimulatorQualityV1MetricInfoProvider().get_metric_info(), evaluator=PerTurnUserSimulatorQualityV1, ) - metric_evaluator_registry.register_evaluator( - metric_info=RubricBasedMultiTurnTrajectoryMetricInfoProvider().get_metric_info(), - evaluator=RubricBasedMultiTurnTrajectoryEvaluator, - ) return metric_evaluator_registry diff --git a/src/google/adk/evaluation/metric_info_providers.py b/src/google/adk/evaluation/metric_info_providers.py index 42c4a7a4bd..f887aacad2 100644 --- a/src/google/adk/evaluation/metric_info_providers.py +++ b/src/google/adk/evaluation/metric_info_providers.py @@ -242,21 +242,3 @@ def get_metric_info(self) -> MetricInfo: interval=Interval(min_value=0.0, max_value=1.0) ), ) - - -class RubricBasedMultiTurnTrajectoryMetricInfoProvider(MetricInfoProvider): - """Metric info provider for RubricBasedMultiTurnTrajectory.""" - - def get_metric_info(self) -> MetricInfo: - return MetricInfo( - metric_name=PrebuiltMetrics.RUBRIC_BASED_MULTI_TURN_TRAJECTORY_QUALITY_V1, - description=( - "This metric evaluates the agent's multi-turn trajectory against" - " a set of user-provided rubrics using an LLM as a judge. Value" - " range for this metric is [0,1], with values closer to 1 more" - " desirable." - ), - metric_value_info=MetricValueInfo( - interval=Interval(min_value=0.0, max_value=1.0) - ), - ) diff --git a/src/google/adk/evaluation/rubric_based_final_response_quality_v1.py b/src/google/adk/evaluation/rubric_based_final_response_quality_v1.py index 135b2b9593..df01aba4ff 100644 --- a/src/google/adk/evaluation/rubric_based_final_response_quality_v1.py +++ b/src/google/adk/evaluation/rubric_based_final_response_quality_v1.py @@ -274,18 +274,7 @@ def format_auto_rater_prompt( """Returns the autorater prompt.""" self.create_effective_rubrics_list(actual_invocation.rubrics) user_input = get_text_from_content(actual_invocation.user_content) - - criterion = self._eval_metric.criterion - include_intermediate = getattr( - criterion, "include_intermediate_responses_in_final", False - ) - final_response = ( - get_text_from_content( - actual_invocation, - include_intermediate_responses_in_final=include_intermediate, - ) - or "" - ) + final_response = get_text_from_content(actual_invocation.final_response) rubrics_text = "\n".join([ f"* {r.rubric_content.text_property}" diff --git a/src/google/adk/evaluation/rubric_based_multi_turn_trajectory_evaluator.py b/src/google/adk/evaluation/rubric_based_multi_turn_trajectory_evaluator.py deleted file mode 100644 index b366f0a3c9..0000000000 --- a/src/google/adk/evaluation/rubric_based_multi_turn_trajectory_evaluator.py +++ /dev/null @@ -1,366 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import json -import logging -from typing import ClassVar -from typing import Optional - -from typing_extensions import override - -from .eval_case import ConversationScenario -from .eval_case import Invocation -from .eval_case import InvocationEvents -from .eval_metrics import EvalMetric -from .eval_metrics import EvalStatus -from .eval_metrics import RubricsBasedCriterion -from .evaluator import EvaluationResult -from .evaluator import PerInvocationResult -from .rubric_based_evaluator import RubricBasedEvaluator - -logger = logging.getLogger("google_adk." + __name__) - -_RUBRIC_BASED_MULTI_TURN_TRAJECTORY_QUALITY_V1_PROMPT = """# Mission -Your mission is to evaluate the quality of responses generated by an AI agent in a multi-turn conversation. Your task is to analyze the entire conversation history, focusing on all assistant responses, and rate them against the provided rubric criteria. The conversation may include text-based interactions, transcribed audio interactions, and records of tool calls made by the assistant. -One turn is defined as a user and assistant response pair. - -# Instructions: -- Analyze the entire conversation: Carefully review every turn in the , paying attention to each user query and assistant response turn within . -- Evaluate ALL assistant responses cumulatively: Your assessment for each criterion should reflect the assistant's overall performance across all its turns. For instance, if an assistant made a factual error in Turn 2 but corrected it in Turn 4, the "Factual Accuracy" score should reflect this nuanced performance. -- Consider Modality and Tool Use: Take into account the different modalities presented (text, audio transcripts) and the effective or ineffective use of tools by the assistant as described in the conversation history. -- Refer to the Rubric: For each criterion listed under , determine how well the assistant's collective performance across all its turns satisfies that criterion. -- If a specific property is not fulfilled, you must provide the agent response turn number that violated the property. -- Your mission is to evaluate the quality of responses generated by an AI agent. You will be presented with the conversation history () which includes a set of user and assistant turns, and a set of properties () that you must use to objectively assess the validity of the agent's response. -- Only use the properties provided. Do not make up new properties. -- Keep the critiques across each property mutually exclusive. -- IMPORTANT: Assess all of the provided properties. Do not drop any of the properties from your response. - -# Rubric: -"yes": The agent's response fulfilled the property or the property is not applicable to the user prompt. -"no": The agent's response did not fulfill the property. - -# For each property starting with a new line, follow these steps: -STEP 1: Repeat the property, word for word, without making any changes. Keep everything including punctuation and capitalization as-is. -STEP 2: Determine the steps needed to check if all the assistant responses in the conversation history fulfill the *intent* of the property. Refer back to the `` to understand the user's original goal. -STEP 3: Follow the steps outlined in STEP 2, thinking out loud. As you think, refer to specific assistant responses and count their turn numbers within the . -STEP 4: Review the thoughts and the original property. -STEP 5: Output the final verdict. -Property: [[Repeat the property in STEP 1 again.]] -Rationale: [[Explain your reasoning for the verdict.]] -Verdict: [[yes|no]] - -# Output format (repeat this format for every property started with a new line): -STEP 1: ... -STEP 2: ... -STEP 3: ... -STEP 4: ... -STEP 5: ... -Property: ... -Rationale: ... -Verdict: ... - -# Example output 1 - -STEP 1: Does the agent run function call 'default_api.grammar_check'? -STEP 2: I need to check if any assistant response in the includes the exact function name 'default_api.grammar_check'. -STEP 3: Reviewing the , I find that in Assistant Turn 2, the agent includes the function call default_api.grammar_check(sentence="the dog walks on the a park"). This matches the required function name. -STEP 4: The assistant successfully called the specified function in Turn 2. -STEP 5: yes -Property: Does the agent run function call 'default_api.grammar_check'? -Rationale: The agent's response in Assistant Turn 2 contains the function call 'default_api.grammar_check' within a proper code block and with the correct function name. -Verdict: yes - -STEP 1: The sentence parameter in the grammar_check function call must be 'the dog walks on the a park'. -STEP 2: I need to check if the function call 'default_api.grammar_check' (if present in any assistant turn) includes the parameter 'sentence' and whether the value assigned to 'sentence' is valid according to the provided guideline in the property. The property specifies the valid value as 'the dog walks on the a park'. -STEP 3: In Assistant Turn 2, the agent's response includes the function call default_api.grammar_check(sentence="the dog walks on the a park"). The parameter 'sentence' is present, and the value assigned to it is "the dog walks on the a park", which is identical to the reference value. -STEP 4: The parameter 'sentence' is present and its value is exactly the same as the reference value in Assistant Turn 2. -STEP 5: yes -Property: The sentence parameter in the grammar_check function call must be 'the dog walks on the a park'. -Rationale: The agent's response in Assistant Turn 2 includes the 'sentence' parameter in the function call 'default_api.grammar_check', and the value assigned to it is exactly the same as the reference value. -Verdict: yes - -# Example output 2 - -STEP 1: Does the agent run function call 'default_api.search_via_perplexity'? -STEP 2: I need to check if any assistant response in the includes the exact function name 'default_api.search_via_perplexity'. -STEP 3: Reviewing the , I find that in Assistant Turn 2, the agent includes a function call default_api.get_web_search_results. This does not match the required 'default_api.search_via_perplexity'. I checked all other assistant turns and no other function call matches. -STEP 4: The agent did not use the function 'default_api.search_via_perplexity' in any turn. -STEP 5: no -Property: Does the agent run function call 'default_api.search_via_perplexity'? -Rationale: The agent called 'default_api.get_web_search_results' in Assistant Turn 2, not 'default_api.search_via_perplexity'. The correct function was not called in any turn. -Verdict: no - -STEP 1: Does the agent provide function call 'default_api.search_via_perplexity' with input parameter 'keyword' that is valid compared to the reference 'keyword'= 'GPT-4o vs GPT-3.5 cost comparison' and based on the following guideline? Guideline for 'keyword': 'The wording can differ. The agent response is valid if it conveys similar core content as the reference response. Less efficient and minor inaccurate phrasing is acceptable.' -STEP 2: I need to check if the agent runs the function call with exact function name as 'default_api.search_via_perplexity' in any turn, and if so, check if the value assigned to 'keyword' is valid according to the provided guideline in the property. -STEP 3: Based on the previous evaluation, the agent did not include a function call 'default_api.search_via_perplexity' in any of its turns. Therefore, this property cannot be fulfilled. -STEP 4: The property cannot be fulfilled because the agent did not use the specified function call. -STEP 5: no -Property: Does the agent provide function call 'default_api.search_via_perplexity' with input parameter 'keyword' that is valid compared to the reference 'keyword'= 'GPT-4o vs GPT-3.5 cost comparison' and based on the following guideline? Guideline for 'keyword': 'The wording can differ. The agent response is valid if it conveys similar core content as the reference response. Less efficient and minor inaccurate phrasing is acceptable.' -Rationale: The agent did not use the function call 'default_api.search_via_perplexity' in any of its responses throughout the conversation. -Verdict: no - - -{agent_instructions} - - - -{agent_tool_definitions} - - - -{user_agent_dialogue} - - - -{properties} - -""" - - -class RubricBasedMultiTurnTrajectoryEvaluator(RubricBasedEvaluator): - """An Evaluator for rubric based assessment of an agent's multi-turn trajectory using a LLM. - - This evaluator assesses the quality of an agent's behavior across an entire - multi-turn conversation, including intermediate tool calls, function - responses, and the final textual replies. It uses a set of rubrics (defined - as properties) to judge whether the agent's cumulative performance satisfies - each criterion. - - Unlike single-turn evaluators that assess each invocation independently, this - evaluator accumulates the full dialogue history (user turns, agent turns, and - tool interactions) and performs a single LLM-based evaluation on the last - turn using the complete conversation context. The first N-1 turns are marked - as NOT_EVALUATED, and the final turn carries the aggregate score. - - Example: For a travel-booking agent that handles multi-step itinerary - planning, one could specify the following rubrics: - - Rubric 1: The agent correctly called the flight search tool with the - user-specified origin, destination, and dates. - Rubric 2: The agent confirmed the booking details with the user before - finalizing the reservation. - Rubric 3: The agent's final response included a complete itinerary summary - with flight numbers, times, and confirmation codes. - - For each rubric, the LLM judge will produce a binary verdict ("yes" or "no") - indicating whether the agent's trajectory satisfied that property. A "yes" - verdict maps to a score of 1.0 and "no" maps to 0.0. - - A combined score using individual rubric verdicts will also be generated. - This overall score is the average of all individual rubric scores, giving a - value between 0 and 1 where values closer to 1 indicate better adherence to - the specified rubrics. - """ - - criterion_type: ClassVar[type[RubricsBasedCriterion]] = RubricsBasedCriterion - RUBRIC_TYPE: ClassVar[str] = "TRAJECTORY_QUALITY" - - def __init__(self, eval_metric: EvalMetric): - super().__init__( - eval_metric, - criterion_type=RubricBasedMultiTurnTrajectoryEvaluator.criterion_type, - rubric_type=RubricBasedMultiTurnTrajectoryEvaluator.RUBRIC_TYPE, - ) - self._auto_rater_prompt_template = ( - _RUBRIC_BASED_MULTI_TURN_TRAJECTORY_QUALITY_V1_PROMPT - ) - - def _assemble_dialogue_history( - self, actual_invocations: list[Invocation] - ) -> None: - """Assembles the dialogue history, instructions, and tools from invocations.""" - dialogue_lines = [] - for turn_index, invocation in enumerate(actual_invocations): - # USER TURN - if invocation.user_content and invocation.user_content.parts: - text_parts = [p.text for p in invocation.user_content.parts if p.text] - if text_parts: - dialogue_lines.append( - f"USER TURN {turn_index + 1}: {' '.join(text_parts)}" - ) - - # INTERMEDIATE TOOL EVENTS - if isinstance(invocation.intermediate_data, InvocationEvents): - for event in invocation.intermediate_data.invocation_events: - role = ( - "USER" - if event.author and event.author.lower() == "user" - else f"AGENT ({event.author})" - ) - if event.content and event.content.parts: - text_parts = [p.text for p in event.content.parts if p.text] - if text_parts: - dialogue_lines.append( - f"{role} TURN {turn_index + 1}: {' '.join(text_parts)}" - ) - for p in event.content.parts: - if p.function_call: - args = ( - json.dumps(dict(p.function_call.args)) - if p.function_call.args - else "{}" - ) - dialogue_lines.append( - f"{role} TURN {turn_index + 1} (tool call):" - f" {p.function_call.name}({args})" - ) - if p.function_response: - resp = ( - json.dumps(dict(p.function_response.response)) - if p.function_response.response - else "{}" - ) - dialogue_lines.append( - f"{role} TURN {turn_index + 1} (tool output):" - f" {p.function_response.name} -> {resp}" - ) - - # FINAL AGENT TURN - if invocation.final_response and invocation.final_response.parts: - try: - agent_name = invocation.intermediate_data.invocation_events[0].author - except (AttributeError, IndexError): - agent_name = "agent" - role = f"AGENT ({agent_name})" - text_parts = [p.text for p in invocation.final_response.parts if p.text] - if text_parts: - dialogue_lines.append( - f"{role} TURN {turn_index + 1}: {' '.join(text_parts)}" - ) - - self._formatted_dialogue = "\n".join(dialogue_lines) - - # Grab instructions and tools locally from Invocation - instructions_parts = [] - tools_parts = [] - for invocation in actual_invocations: - if invocation.app_details and invocation.app_details.agent_details: - for agent_id, details in invocation.app_details.agent_details.items(): - instructions_parts.append( - f"Agent {agent_id} Instructions:\n{details.instructions}" - ) - tools_parts.append(f"Agent: {agent_id}") - if details.tool_declarations: - for tool in details.tool_declarations: - for func in tool.function_declarations: - tools_parts.append(f"- {func.name}: {func.description}") - - self._formatted_instructions = "\n\n".join( - dict.fromkeys(instructions_parts) - ) - self._formatted_tools = "\n".join(dict.fromkeys(tools_parts)) - - @override - async def evaluate_invocations( - self, - actual_invocations: list[Invocation], - expected_invocations: Optional[list[Invocation]] = None, - conversation_scenario: Optional[ConversationScenario] = None, - ) -> EvaluationResult: - """Evaluates multiple turns locally, collecting full dialogue history.""" - # Parse out Pydantic types locally without server-side imports - # Re-implement dialogue parsing logic fully locally - # to have zero deps on cloud.ai. - logger.debug( - "Local evaluator start (invocations: %d)", - len(actual_invocations), - ) - self._assemble_dialogue_history(actual_invocations) - - # If expected_invocations are not supplied, provide a list of None. - expected_invocations = ( - [None] * len(actual_invocations) - if expected_invocations is None - else expected_invocations - ) - - # Mark the first N-1 turns as NOT_EVALUATED. - per_invocation_results = [] - for actual, expected in zip( - actual_invocations[:-1], expected_invocations[:-1] - ): - per_invocation_results.append( - PerInvocationResult( - actual_invocation=actual, - expected_invocation=expected, - score=None, - eval_status=EvalStatus.NOT_EVALUATED, - ) - ) - - # Conversation-level evaluation: run the LLM judge - # once on the last turn with full dialogue context. - last_expected = ( - [expected_invocations[-1]] if expected_invocations[-1] else None - ) - last_turn_result = await super().evaluate_invocations( - [actual_invocations[-1]], - last_expected, - conversation_scenario, - ) - - # Append the evaluated last-turn result. - if last_turn_result.per_invocation_results: - per_invocation_results.extend(last_turn_result.per_invocation_results) - else: - per_invocation_results.append( - PerInvocationResult( - actual_invocation=actual_invocations[-1], - expected_invocation=expected_invocations[-1], - score=last_turn_result.overall_score, - eval_status=last_turn_result.overall_eval_status, - rubric_scores=last_turn_result.overall_rubric_scores, - ) - ) - - return EvaluationResult( - overall_score=last_turn_result.overall_score, - overall_eval_status=last_turn_result.overall_eval_status, - per_invocation_results=per_invocation_results, - overall_rubric_scores=last_turn_result.overall_rubric_scores, - ) - - @override - def format_auto_rater_prompt( - self, - actual_invocation: Invocation, - _: Optional[Invocation], - ) -> str: - """Returns the fully rendered validation prompt using locally configured rubrics.""" - self.create_effective_rubrics_list(actual_invocation.rubrics) - logger.debug( - "format_auto_rater_prompt called (effective rubrics: %d)", - len(self._effective_rubrics_list), - ) - - rubrics_list = [] - for r in self._effective_rubrics_list: - rubrics_dict = { - "property": r.rubric_content.text_property, - } - if r.type: - rubrics_dict["type"] = r.type - rubrics_list.append(rubrics_dict) - formatted_rubrics = json.dumps(rubrics_list, indent=2) - - prompt = self._auto_rater_prompt_template.format( - user_agent_dialogue=self._formatted_dialogue, - properties=formatted_rubrics, - agent_instructions=self._formatted_instructions, - agent_tool_definitions=self._formatted_tools, - ) - logger.debug("Generated rubric validator prompt:\n%s", prompt) - return prompt diff --git a/src/google/adk/events/__init__.py b/src/google/adk/events/__init__.py index d027ffbe42..4b3ccc5d56 100644 --- a/src/google/adk/events/__init__.py +++ b/src/google/adk/events/__init__.py @@ -14,10 +14,8 @@ from .event import Event from .event_actions import EventActions -from .request_input import RequestInput __all__ = [ 'Event', 'EventActions', - 'RequestInput', ] diff --git a/src/google/adk/events/_node_path_builder.py b/src/google/adk/events/_node_path_builder.py deleted file mode 100644 index a07125229c..0000000000 --- a/src/google/adk/events/_node_path_builder.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Path builder for hierarchical node paths.""" - -from __future__ import annotations - - -class _NodePathBuilder: - """Represents a path to a node in a hierarchical workflow. - - A node path is a sequence of segments, each identifying a node instance, - typically in the form 'node_name@run_id' or just 'node_name'. - """ - - def __init__(self, segments: list[str]): - """Initializes a _NodePathBuilder with a list of segments.""" - self._segments = segments - - @classmethod - def from_string(cls, path_str: str) -> _NodePathBuilder: - """Parses a _NodePathBuilder from a string representation. - - Example: 'wf@1/node@2'. - """ - if not path_str: - return cls([]) - return cls(path_str.split('/')) - - def __str__(self) -> str: - """Returns the string representation of the path.""" - return '/'.join(self._segments) - - def __eq__(self, other: object) -> bool: - """Returns True if segments are equal.""" - if not isinstance(other, _NodePathBuilder): - return NotImplemented - return self._segments == other._segments - - @property - def node_name(self) -> str: - """Returns the node name of the leaf segment.""" - if not self._segments: - return '' - return self._segments[-1].rsplit('@', 1)[0] - - @property - def leaf_segment(self) -> str: - """Returns the full leaf segment.""" - if not self._segments: - return '' - return self._segments[-1] - - @property - def run_id(self) -> str | None: - """Returns the run ID of the leaf segment, if any.""" - if not self._segments: - return None - parts = self._segments[-1].rsplit('@', 1) - return parts[1] if len(parts) > 1 else None - - @property - def parent(self) -> _NodePathBuilder | None: - """Returns the parent _NodePathBuilder, or None if this is a root path.""" - if len(self._segments) <= 1: - return None - return _NodePathBuilder(self._segments[:-1]) - - def append( - self, node_name: str, run_id: str | None = None - ) -> _NodePathBuilder: - """Returns a new _NodePathBuilder with the child segment appended.""" - segment = node_name - if run_id: - segment = f'{node_name}@{run_id}' - return _NodePathBuilder(self._segments + [segment]) - - def is_descendant_of(self, ancestor: _NodePathBuilder) -> bool: # pylint: disable=protected-access - """Checks if this path is a descendant of the ancestor path.""" - if len(self._segments) <= len(ancestor._segments): - return False - return self._segments[: len(ancestor._segments)] == ancestor._segments - - def is_direct_child_of(self, parent: _NodePathBuilder) -> bool: # pylint: disable=protected-access - """Checks if this path is a direct child of the parent path.""" - if len(self._segments) != len(parent._segments) + 1: - return False - return self._segments[:-1] == parent._segments - - def get_direct_child(self, descendant: _NodePathBuilder) -> _NodePathBuilder: # pylint: disable=protected-access - """Returns a new _NodePathBuilder for the direct child towards the descendant.""" - if len(descendant._segments) <= len(self._segments): - raise ValueError('Descendant path is not longer than self path') - if descendant._segments[: len(self._segments)] != self._segments: - raise ValueError('Descendant path does not start with self path') - return _NodePathBuilder(descendant._segments[: len(self._segments) + 1]) diff --git a/src/google/adk/events/event.py b/src/google/adk/events/event.py index daa7a0bff8..fb3e9093f3 100644 --- a/src/google/adk/events/event.py +++ b/src/google/adk/events/event.py @@ -14,7 +14,6 @@ from __future__ import annotations -from typing import Any from typing import cast from typing import Optional @@ -22,74 +21,13 @@ from google.adk.platform import uuid as platform_uuid from google.genai import types from pydantic import alias_generators -from pydantic import BaseModel from pydantic import ConfigDict from pydantic import Field -from pydantic import model_validator -from pydantic import PrivateAttr from ..models.llm_response import LlmResponse from .event_actions import EventActions -class NodeInfo(BaseModel): - """Workflow node metadata attached to an Event.""" - - model_config = ConfigDict( - ser_json_bytes='base64', - val_json_bytes='base64', - alias_generator=alias_generators.to_camel, - populate_by_name=True, - ) - - path: str = '' - """The path of the node in the workflow. - In a workflow A, if node B is directly under A, and B emits an event, the - path will be "A/B". Agent state event will have path as "A". - """ - - output_for: list[str] | None = None - """Node paths whose output this event represents. - - Set on events that carry an output value. When set, the output field - of this event is also considered the output for each listed node path - in the same invocation. For example, ``["wf/A@1/B@1", "wf/A@1"]`` means - this event's output counts as the output for both. - """ - - message_as_output: bool | None = None - """When True, this event's content is the node's output. - - No separate output event is needed — the content event already - carries the output value. - """ - - @property - def run_id(self) -> str: - """The run ID of the node that generated the event.""" - from ._node_path_builder import _NodePathBuilder - - return _NodePathBuilder.from_string(self.path).run_id or '' - - @property - def parent_run_id(self) -> str | None: - """The run ID of the parent node that dynamically scheduled - this node. Used to reconstruct dynamic node state from session events.""" - from ._node_path_builder import _NodePathBuilder - - builder = _NodePathBuilder.from_string(self.path) - if builder.parent: - return builder.parent.run_id - return None - - @property - def name(self) -> str: - """The clean name of the node (without @run_id).""" - from ._node_path_builder import _NodePathBuilder - - return _NodePathBuilder.from_string(self.path).node_name - - class Event(LlmResponse): """Represents an event in a conversation between agents and users. @@ -108,24 +46,18 @@ class Event(LlmResponse): invocation_id: str = '' """The invocation ID of the event. Should be non-empty before appending to a session.""" - author: str = '' + author: str """'user' or the name of the agent, indicating who appended the event to the session.""" actions: EventActions = Field(default_factory=EventActions) """The actions taken by the agent.""" - output: Any | None = None - """Generic data output from a workflow node.""" - - node_info: NodeInfo = Field(default_factory=NodeInfo) - """Workflow node metadata (path, run_id, etc.).""" - - long_running_tool_ids: set[str] | None = None + long_running_tool_ids: Optional[set[str]] = None """Set of ids of the long running function calls. Agent client will know from this field about which function call is long running. only valid for function call event """ - branch: str | None = None + branch: Optional[str] = None """The branch of the event. The format is like agent_1.agent_2.agent_3, where agent_1 is the parent of @@ -134,20 +66,6 @@ class Event(LlmResponse): Branch is used when multiple sub-agent shouldn't see their peer agents' conversation history. """ - isolation_scope: str | None = None - """Scope tag indicating which logical context this event belongs to. - - When set, the LLM content-builder restricts session events visible to - an agent to those whose ``isolation_scope`` matches the agent's own - scope. One usage today is the Task API: a delegated task agent is - scoped under the originating function-call id (````) so it - sees only its own task's events, isolated from the chat - coordinator's broader conversation. - - ⚠️ DO NOT USE THIS FIELD DIRECTLY. It is an internal mechanism that - may change without notice. External code should not read, write, or - rely on its semantics. - """ # The following are computed fields. # Do not assign the ID. It will be assigned by the session. @@ -156,118 +74,6 @@ class Event(LlmResponse): timestamp: float = Field(default_factory=lambda: platform_time.get_time()) """The timestamp of the event.""" - @model_validator(mode='before') - @classmethod - def _accept_convenience_kwargs(cls, data: Any) -> Any: - """Routes convenience kwargs to nested fields. - - Routed kwargs: - message: ContentUnion -> content (converted via t_content) - state: dict -> actions.state_delta - route: value -> actions.route - node_path: str -> node_info.path - - Subclasses that declare any of these as real fields (or aliases of - real fields) keep normal field validation behavior. - """ - if not isinstance(data, dict): - return data - - field_names: set[str] = set(cls.model_fields.keys()) - for f in cls.model_fields.values(): - if f.alias: - field_names.add(f.alias) - message = None if 'message' in field_names else data.pop('message', None) - state = None if 'state' in field_names else data.pop('state', None) - route = None if 'route' in field_names else data.pop('route', None) - node_path = ( - None if 'node_path' in field_names else data.pop('node_path', None) - ) - - if message is not None: - if data.get('content') is not None: - raise ValueError( - "'message' and 'content' are mutually exclusive." - ' Use one or the other.' - ) - from google.genai import _transformers - - data['content'] = _transformers.t_content(message) - - if state is not None or route is not None: - actions = data.get('actions') - actions_dict: Optional[dict[str, Any]] = None - if actions is None: - actions_dict = {} - elif isinstance(actions, EventActions): - actions_dict = actions.model_dump() - elif isinstance(actions, dict): - actions_dict = dict(actions) - # If actions is an unexpected type, skip the transformation and let - # Pydantic's normal field validation report the error. - if actions_dict is not None: - if state is not None: - actions_dict['state_delta'] = state - if route is not None: - actions_dict['route'] = route - data['actions'] = actions_dict - - if node_path is not None: - node_info = data.get('node_info') - node_info_dict: Optional[dict[str, Any]] = None - if node_info is None: - node_info_dict = {} - elif isinstance(node_info, NodeInfo): - node_info_dict = node_info.model_dump() - elif isinstance(node_info, dict): - node_info_dict = dict(node_info) - # If node_info is an unexpected type, skip the transformation and let - # Pydantic's normal field validation report the error. - if node_info_dict is not None: - node_info_dict['path'] = node_path - data['node_info'] = node_info_dict - - return data - - @property - def message(self) -> Any: - """Alias for content. Returns the user-facing message of the event. - - Subclasses may declare ``message`` as a real field (see - ``_accept_convenience_kwargs``, which already routes construction kwargs to - such fields). When they do, return that field's value so reads stay - consistent with construction and serialization instead of returning the - ``content`` alias. The return type is ``Any`` because such a subclass field - may be typed differently (e.g. ``str``); for a plain ``Event`` this returns - ``Optional[types.Content]``. - """ - if 'message' in type(self).model_fields: - return self.__dict__.get('message') - return self.content - - @message.setter - def message(self, value: Any) -> None: - """Sets the content of the event (or a subclass ``message`` field).""" - if 'message' in type(self).model_fields: - # Route through Pydantic so a subclass field's validators/type are - # enforced. A direct __dict__ write would skip validation, and - # object.__setattr__/self.message would recurse through this property. - self.__pydantic_validator__.validate_assignment(self, 'message', value) - return - if value is not None: - from google.genai import _transformers - - self.content = _transformers.t_content(value) - else: - self.content = None - - @property - def node_name(self) -> str: - """The name of the node that generated the event.""" - if self.actions.agent_state or self.actions.end_of_agent: - return '' - return self.node_info.name - def model_post_init(self, __context): """Post initialization logic for the event.""" # Generates a random ID for the event. @@ -291,6 +97,24 @@ def is_final_response(self) -> bool: and not self.has_trailing_code_execution_result() ) + def get_function_calls(self) -> list[types.FunctionCall]: + """Returns the function calls in the event.""" + func_calls = [] + if self.content and self.content.parts: + for part in self.content.parts: + if part.function_call: + func_calls.append(part.function_call) + return func_calls + + def get_function_responses(self) -> list[types.FunctionResponse]: + """Returns the function responses in the event.""" + func_response = [] + if self.content and self.content.parts: + for part in self.content.parts: + if part.function_response: + func_response.append(part.function_response) + return func_response + def has_trailing_code_execution_result( self, ) -> bool: diff --git a/src/google/adk/events/event_actions.py b/src/google/adk/events/event_actions.py index 3f52cc5f81..9557664dee 100644 --- a/src/google/adk/events/event_actions.py +++ b/src/google/adk/events/event_actions.py @@ -16,7 +16,6 @@ from typing import Any from typing import Optional -from typing import Union from google.genai.types import Content from pydantic import alias_generators @@ -111,11 +110,5 @@ class EventActions(BaseModel): rewind_before_invocation_id: Optional[str] = None """The invocation id to rewind to. This is only set for rewind event.""" - route: Optional[Union[bool, int, str, list[Union[bool, int, str]]]] = None - """Route or list of routes for workflow graph edge matching.""" - render_ui_widgets: Optional[list[UiWidget]] = None """List of UI widgets to be rendered by the UI.""" - - set_model_response: Optional[Any] = None - """The model response structured output.""" diff --git a/src/google/adk/events/request_input.py b/src/google/adk/events/request_input.py deleted file mode 100644 index 8596d6f7e4..0000000000 --- a/src/google/adk/events/request_input.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -from __future__ import annotations - -from typing import Any -from typing import Optional -import uuid - -from pydantic import alias_generators -from pydantic import BaseModel -from pydantic import ConfigDict -from pydantic import Field - -from ..utils._schema_utils import SchemaType - - -class RequestInput(BaseModel): - """Represents a request for input from the user.""" - - model_config = ConfigDict( - arbitrary_types_allowed=True, - alias_generator=alias_generators.to_camel, - populate_by_name=True, - ) - - interrupt_id: str = Field( - description=( - "The ID of the interrupt, usually a function call ID. This is used" - " to identify the interrupt that the input is for." - ), - default_factory=lambda: str(uuid.uuid4()), - ) - """The ID of the interrupt, usually a function call ID. - - Reusing the same interrupt_id across loop iterations (e.g. a - rejection/retry cycle) is supported — the framework matches - function calls and responses by count. Using unique IDs per - iteration is still recommended for clarity in event logs. - """ - payload: Optional[Any] = None - """ Custom payload to be provided for resuming.""" - message: Optional[str] = Field( - None, - description="A message to display to the user when requesting input.", - ) - """A message to display to the user when requesting input.""" - response_schema: Optional[SchemaType] = Field( - None, - description=( - "The expected schema of the response. Accepts a Python type" - " (e.g. a Pydantic BaseModel class), a generic alias" - " (e.g. list[str]), or a raw JSON Schema dict." - " If None, it defaults to Any." - ), - ) - """The expected schema of the response.""" diff --git a/src/google/adk/features/_feature_registry.py b/src/google/adk/features/_feature_registry.py index d155e3b7ac..b5f51f2825 100644 --- a/src/google/adk/features/_feature_registry.py +++ b/src/google/adk/features/_feature_registry.py @@ -135,10 +135,10 @@ class FeatureConfig: FeatureStage.EXPERIMENTAL, default_on=True ), FeatureName.JSON_SCHEMA_FOR_FUNC_DECL: FeatureConfig( - FeatureStage.EXPERIMENTAL, default_on=True + FeatureStage.WIP, default_on=False ), FeatureName._MCP_GRACEFUL_ERROR_HANDLING: FeatureConfig( - FeatureStage.EXPERIMENTAL, default_on=True + FeatureStage.EXPERIMENTAL, default_on=False ), FeatureName.PROGRESSIVE_SSE_STREAMING: FeatureConfig( FeatureStage.EXPERIMENTAL, default_on=True @@ -150,7 +150,7 @@ class FeatureConfig: FeatureStage.EXPERIMENTAL, default_on=True ), FeatureName.SKILL_TOOLSET: FeatureConfig( - FeatureStage.STABLE, default_on=True + FeatureStage.EXPERIMENTAL, default_on=True ), FeatureName.SPANNER_ADMIN_TOOLSET: FeatureConfig( FeatureStage.EXPERIMENTAL, default_on=True diff --git a/src/google/adk/flows/llm_flows/_code_execution.py b/src/google/adk/flows/llm_flows/_code_execution.py index 12e56f6ca7..19ec4cc219 100644 --- a/src/google/adk/flows/llm_flows/_code_execution.py +++ b/src/google/adk/flows/llm_flows/_code_execution.py @@ -77,14 +77,6 @@ class DataFileUtil: _DATA_FILE_HELPER_LIB = ''' import pandas as pd -def crop(s: str, max_chars: int = 64) -> str: - """Crops a string to max_chars characters.""" - if len(s) <= max_chars: - return s - if max_chars >= 3: - return s[:max_chars - 3] + '...' - return s[:max_chars] - def explore_df(df: pd.DataFrame) -> None: """Prints some information about a pandas DataFrame.""" diff --git a/src/google/adk/flows/llm_flows/_output_schema_processor.py b/src/google/adk/flows/llm_flows/_output_schema_processor.py index 572236007f..284cc21383 100644 --- a/src/google/adk/flows/llm_flows/_output_schema_processor.py +++ b/src/google/adk/flows/llm_flows/_output_schema_processor.py @@ -46,7 +46,6 @@ async def run_async( not agent.output_schema or not agent.tools or can_use_output_schema_with_tools(agent.canonical_model) - or getattr(agent, 'mode', None) == 'task' ): return diff --git a/src/google/adk/flows/llm_flows/agent_transfer.py b/src/google/adk/flows/llm_flows/agent_transfer.py index 050f2ae8a3..8c734a1993 100644 --- a/src/google/adk/flows/llm_flows/agent_transfer.py +++ b/src/google/adk/flows/llm_flows/agent_transfer.py @@ -144,9 +144,6 @@ def _build_transfer_instructions( Returns: Instruction text for the LLM about agent transfers. """ - if agent.mode in ('task', 'single_turn'): - return '' - si = _build_transfer_instruction_body(tool_name, target_agents) if agent.parent_agent and not agent.disallow_transfer_to_parent: @@ -157,28 +154,8 @@ def _build_transfer_instructions( def _get_transfer_targets(agent: LlmAgent) -> list[BaseAgent]: - """Gets the list of agents that the current agent can transfer to. - - The transfer targets include: - 1. Sub-agents of the current agent, excluding those in 'single_turn' mode. - 2. The parent agent, if it exists and the current agent does not disallow - transfer to the parent. - 3. Peer agents (other sub-agents of the parent), if the current agent does - not disallow transfer to peers. - - Args: - agent: The LlmAgent for which to find transfer targets. - - Returns: - A list of BaseAgent instances that are valid transfer targets. - """ result = [] - result.extend([ - sub_agent - for sub_agent in agent.sub_agents - if not hasattr(sub_agent, 'mode') - or sub_agent.mode not in ('single_turn', 'task') - ]) + result.extend(agent.sub_agents) if not agent.parent_agent or not hasattr( agent.parent_agent, 'disallow_transfer_to_parent' @@ -193,10 +170,6 @@ def _get_transfer_targets(agent: LlmAgent) -> list[BaseAgent]: peer_agent for peer_agent in agent.parent_agent.sub_agents if peer_agent.name != agent.name - and ( - not hasattr(peer_agent, 'mode') - or peer_agent.mode not in ('single_turn', 'task') - ) ]) return result diff --git a/src/google/adk/flows/llm_flows/base_llm_flow.py b/src/google/adk/flows/llm_flows/base_llm_flow.py index b6b61fffe2..db897637c3 100644 --- a/src/google/adk/flows/llm_flows/base_llm_flow.py +++ b/src/google/adk/flows/llm_flows/base_llm_flow.py @@ -39,18 +39,14 @@ from ...auth.auth_tool import AuthConfig from ...events.event import Event from ...models.base_llm_connection import BaseLlmConnection -from ...models.google_llm import Gemini -from ...models.google_llm import GoogleLLMVariant from ...models.llm_request import LlmRequest from ...models.llm_response import LlmResponse -from ...telemetry import _instrumentation from ...telemetry import tracing from ...telemetry.tracing import trace_call_llm from ...telemetry.tracing import trace_send_data from ...telemetry.tracing import tracer from ...tools.base_toolset import BaseToolset from ...tools.tool_context import ToolContext -from ...utils import model_name_utils from ...utils.context_utils import Aclosing from .audio_cache_manager import AudioCacheManager from .functions import build_auth_request_event @@ -290,7 +286,7 @@ async def _maybe_add_grounding_metadata( # First run callbacks from the plugins. callback_response = ( await invocation_context.plugin_manager.run_after_model_callback( - callback_context=callback_context, + callback_context=CallbackContext(invocation_context), llm_response=llm_response, ) ) @@ -378,14 +374,18 @@ async def _run_on_model_error_callbacks( return None try: - async with _instrumentation.record_inference_telemetry( - llm_request, - invocation_context, - model_response_event, - ) as tel_ctx: - async with Aclosing(response_generator) as agen: + async with Aclosing(response_generator) as agen: + async with tracing.use_inference_span( + llm_request, + invocation_context, + model_response_event, + ) as gc_span: async for llm_response in agen: - tel_ctx.record_llm_response(llm_response) + if gc_span: + tracing.trace_inference_result( + gc_span, + llm_response, + ) yield llm_response except Exception as model_error: callback_context = CallbackContext( @@ -421,15 +421,6 @@ async def _process_agent_tools( instances, and calls ``process_llm_request`` on each to register tool declarations in the request. - Tool-union resolution is dispatched concurrently via ``asyncio.gather`` - to overlap I/O-bound listings (e.g. MCP ``list_tools`` over the - network). The subsequent ``process_llm_request`` calls are kept - serial in the original ``agent.tools`` order: some tools read/write - ``llm_request`` state (e.g. ``GoogleSearchTool`` writes - ``llm_request.model``; ``ComputerUseToolset`` performs an idempotency - check on ``llm_request.config.tools``) and rely on observing the - post-state of earlier tools. - After this function returns, ``llm_request.tools_dict`` maps tool names to ``BaseTool`` instances ready for function call dispatch. @@ -439,34 +430,12 @@ async def _process_agent_tools( llm_request: The LLM request to populate with tool declarations. """ agent = invocation_context.agent - if agent is None or not hasattr(agent, 'tools') or not agent.tools: + if not hasattr(agent, 'tools') or not agent.tools: return multiple_tools = len(agent.tools) > 1 model = agent.canonical_model - - from ...agents.llm_agent import _convert_tool_union_to_tools - - # Resolve tool_unions in parallel. ``asyncio.gather`` preserves - # input order in the returned list, so the serial commit phase below - # still observes ``agent.tools`` order. If any resolution raises, - # gather cancels the siblings and propagates -- same observable - # behavior as the previous serial loop, which would propagate the - # first exception and abandon the rest. - resolved_tools_per_union = await asyncio.gather(*( - _convert_tool_union_to_tools( - tool_union, - ReadonlyContext(invocation_context), - model, - multiple_tools, - ) - for tool_union in agent.tools - )) - - # Serial commit phase, in original ``agent.tools`` order. Mutations - # to ``llm_request`` and reads of its state (model, config.tools, - # tools_dict) preserve today's ordering semantics exactly. - for tool_union, tools in zip(agent.tools, resolved_tools_per_union): + for tool_union in agent.tools: tool_context = ToolContext(invocation_context) # If it's a toolset, process it first @@ -475,7 +444,15 @@ async def _process_agent_tools( tool_context=tool_context, llm_request=llm_request ) + from ...agents.llm_agent import _convert_tool_union_to_tools + # Then process all tools from this tool union + tools = await _convert_tool_union_to_tools( + tool_union, + ReadonlyContext(invocation_context), + model, + multiple_tools, + ) for tool in tools: await tool.process_llm_request( tool_context=tool_context, llm_request=llm_request @@ -514,9 +491,6 @@ async def run_live( if invocation_context.end_invocation: return - agent = invocation_context.agent - llm_request.model = agent.canonical_live_model.model - llm = self.__get_llm(invocation_context) logger.debug( 'Establishing live connection for agent: %s with llm request: %s', @@ -540,40 +514,7 @@ async def run_live( llm_request.live_connect_config.session_resumption.handle = ( invocation_context.live_session_resumption_handle ) - - # Only set transparent=True for Vertex AI backend, as the Gemini API - # backend explicitly rejects it. - if ( - isinstance(llm, Gemini) - and llm._api_backend == GoogleLLMVariant.VERTEX_AI # pylint: disable=protected-access - ): - session_resumption = ( - llm_request.live_connect_config.session_resumption - ) - if session_resumption.transparent is None: - session_resumption.transparent = True - - # When seeding a fresh connection with prior conversation history, set - # initial_history_in_client_content to True. This tells the Live server - # that the provided history already includes the model's past responses, - # preventing the server from generating duplicate responses for those replayed turns. - if ( - llm_request.contents - and not invocation_context.live_session_resumption_handle - ): - if not llm_request.live_connect_config: - llm_request.live_connect_config = types.LiveConnectConfig() - if not llm_request.live_connect_config.history_config: - llm_request.live_connect_config.history_config = ( - types.HistoryConfig() - ) - if ( - llm_request.live_connect_config.history_config.initial_history_in_client_content - is None - ): - llm_request.live_connect_config.history_config.initial_history_in_client_content = ( - True - ) + llm_request.live_connect_config.session_resumption.transparent = True logger.info( 'Establishing live connection for agent: %s', @@ -912,22 +853,20 @@ async def _run_one_step_async( # Long running tool calls should have been handled before this point. # If there are still long running tool calls, it means the agent is paused # before, and its branch hasn't been resumed yet. - if invocation_context.is_resumable and events and len(events) > 1: - pause = False - if invocation_context.should_pause_invocation(events[-1]): - pause = True - elif invocation_context.should_pause_invocation(events[-2]): - # NOTE: This only checks the last 2 events. If an LRO is followed by - # multiple text responses, this check may not trigger correctly. - # This is a known limitation of the current 2-event window. - # Check if the function call in events[-2] is resolved by events[-1] - fc_ids = {fc.id for fc in events[-2].get_function_calls()} - fr_ids = {fr.id for fr in events[-1].get_function_responses()} - if fc_ids and not fc_ids.issubset(fr_ids): - pause = True - - if pause: - return + if ( + invocation_context.is_resumable + and events + and len(events) > 1 + # TODO: here we are using the last 2 events to decide whether to pause + # the invocation. But this is just being optimistic, we should find a + # way to pause when the long running tool call is followed by more than + # one text responses. + and ( + invocation_context.should_pause_invocation(events[-1]) + or invocation_context.should_pause_invocation(events[-2]) + ) + ): + return if ( invocation_context.is_resumable @@ -1037,7 +976,6 @@ async def _postprocess_async( not llm_response.content and not llm_response.error_code and not llm_response.interrupted - and not llm_response.grounding_metadata ): return @@ -1102,7 +1040,6 @@ async def _postprocess_live( and not llm_response.output_transcription and not llm_response.usage_metadata and not llm_response.live_session_resumption_update - and not llm_response.grounding_metadata ): return @@ -1218,15 +1155,6 @@ async def _postprocess_handle_function_calls_async( ) ) yield final_event - - # NOTE: This recursive nested execution block is preserved as a backward-compatible - # fallback for deprecated execution paths (such as legacy `SequentialAgent`) that - # do not run under the modern ADK 2.0 `DynamicNodeScheduler`. - # - # In modern resumable workflow environments, this block is safely bypassed - # because the scheduler wrapper (e.g., `_llm_agent_wrapper.py`) intercepts the - # `transfer_to_agent` action at the outer execution frame and exits, returning - # control to the top-level coordinator. transfer_to_agent = function_response_event.actions.transfer_to_agent if transfer_to_agent: agent_to_run = self._get_agent_to_run( @@ -1477,9 +1405,6 @@ def __get_llm(self, invocation_context: InvocationContext) -> BaseLlm: config['_adk_replay_indexes'] = replay_indexes return model - if invocation_context.live_request_queue is not None: - return agent.canonical_live_model - if not hasattr(agent, 'canonical_model'): raise TypeError( 'Expected agent to have canonical_model attribute,' diff --git a/src/google/adk/flows/llm_flows/basic.py b/src/google/adk/flows/llm_flows/basic.py index d95c3013e1..8e9bfa514c 100644 --- a/src/google/adk/flows/llm_flows/basic.py +++ b/src/google/adk/flows/llm_flows/basic.py @@ -25,7 +25,6 @@ from ...agents.invocation_context import InvocationContext from ...events.event import Event from ...models.llm_request import LlmRequest -from ...utils import model_name_utils from ...utils.output_schema_utils import can_use_output_schema_with_tools from ._base_llm_processor import BaseLlmRequestProcessor @@ -55,11 +54,7 @@ def _build_basic_request( # support output_schema and tools together. we have a workaround to support # both output_schema and tools at the same time. see # _output_schema_processor.py for details - # - # task-mode agents skip output_schema configuration in - # the basic flow. Structured output for tasks is collected via the - # finish_task tool schema instead. - if getattr(agent, 'mode', None) != 'task' and agent.output_schema: + if agent.output_schema: if not agent.tools or can_use_output_schema_with_tools(model): llm_request.set_output_schema(agent.output_schema) @@ -83,25 +78,15 @@ def _build_basic_request( llm_request.live_connect_config.realtime_input_config = ( invocation_context.run_config.realtime_input_config ) - active_model_name = ( - getattr(getattr(agent, 'canonical_live_model', None), 'model', None) - or llm_request.model - ) - is_gemini_31 = model_name_utils.is_gemini_3_1_flash_live(active_model_name) llm_request.live_connect_config.enable_affective_dialog = ( - None - if is_gemini_31 - else invocation_context.run_config.enable_affective_dialog + invocation_context.run_config.enable_affective_dialog ) llm_request.live_connect_config.proactivity = ( - None if is_gemini_31 else invocation_context.run_config.proactivity + invocation_context.run_config.proactivity ) llm_request.live_connect_config.session_resumption = ( invocation_context.run_config.session_resumption ) - llm_request.live_connect_config.history_config = ( - invocation_context.run_config.history_config - ) llm_request.live_connect_config.context_window_compression = ( invocation_context.run_config.context_window_compression ) diff --git a/src/google/adk/flows/llm_flows/contents.py b/src/google/adk/flows/llm_flows/contents.py index fab5afd2cd..f5d706b94c 100644 --- a/src/google/adk/flows/llm_flows/contents.py +++ b/src/google/adk/flows/llm_flows/contents.py @@ -29,6 +29,7 @@ from .functions import remove_client_function_call_id from .functions import REQUEST_CONFIRMATION_FUNCTION_CALL_NAME from .functions import REQUEST_EUC_FUNCTION_CALL_NAME +from .functions import REQUEST_INPUT_FUNCTION_CALL_NAME logger = logging.getLogger('google_adk.' + __name__) @@ -67,7 +68,6 @@ async def run_async( # (since llm_request.contents will be completely reassigned below) instruction_related_contents = llm_request.contents - is_single_turn = getattr(agent, 'mode', None) == 'single_turn' if agent.include_contents == 'default': # Include full conversation history llm_request.contents = _get_contents( @@ -75,9 +75,6 @@ async def run_async( invocation_context.session.events, agent.name, preserve_function_call_ids=preserve_function_call_ids, - isolation_scope=invocation_context.isolation_scope, - is_single_turn=is_single_turn, - user_content=invocation_context.user_content, ) else: # Include current turn context only (no conversation history) @@ -86,9 +83,6 @@ async def run_async( invocation_context.session.events, agent.name, preserve_function_call_ids=preserve_function_call_ids, - isolation_scope=invocation_context.isolation_scope, - is_single_turn=is_single_turn, - user_content=invocation_context.user_content, ) # Add instruction-related contents to proper position in conversation @@ -302,70 +296,8 @@ def _contains_empty_content(event: Event) -> bool: ) and (not event.output_transcription and not event.input_transcription) -_SINGLE_TURN_NUDGE = ( - 'Important: You will not receive any user replies or clarifications.' - ' Complete the task using only the information provided above.' -) - - -def _build_task_input_user_content( - all_events: list[Event], - isolation_scope: str, - is_single_turn: bool = False, - user_content: Optional[types.Content] = None, -) -> Optional[types.Content]: - """Find the originating task-delegation FC and convert its args to user content. - - A task agent runs under ``isolation_scope=``, where ``fc_id`` - matches the function_call.id that delegated to it. The FC itself - lives on a parent event (typically the chat coordinator's), so it - is filtered out of the task agent's content by the isolation_scope - filter. This helper rebuilds it as a user-role text content so the - task agent's LLM sees its task as the first turn. - - When no matching FC is found (workflow-node task case — task agent - dispatched directly by a Workflow, not via FC delegation), falls - back to ``user_content`` (set on the InvocationContext by the - wrapper to ``_node_input_to_content(node_input)``). - - When ``is_single_turn`` is True, appends a second text part nudging - the LLM that no further user replies will arrive — single-turn - agents must complete the task from the input alone. - - Returns None if neither source yields content. - """ - for event in all_events: - if not event.content or not event.content.parts: - continue - for part in event.content.parts: - fc = part.function_call - if fc and fc.id == isolation_scope and fc.args: - # Render args as JSON string — same shape an LLM would emit. - try: - import json as _json - - text = _json.dumps(dict(fc.args)) - except (TypeError, ValueError): - text = str(fc.args) - parts = [types.Part(text=text)] - if is_single_turn: - parts.append(types.Part(text=_SINGLE_TURN_NUDGE)) - return types.Content(role='user', parts=parts) - - # Fallback: workflow-node task with no originating FC. Use the - # node_input that the wrapper stamped onto ``ic.user_content``. - if user_content and user_content.parts: - parts = list(user_content.parts) - if is_single_turn: - parts.append(types.Part(text=_SINGLE_TURN_NUDGE)) - return types.Content(role='user', parts=parts) - return None - - def _should_include_event_in_context( - current_branch: Optional[str], - event: Event, - isolation_scope: Optional[str] = None, + current_branch: Optional[str], event: Event ) -> bool: """Determines if an event should be included in the LLM context. @@ -373,29 +305,20 @@ def _should_include_event_in_context( calls, or transcriptions), do not belong to the current agent's branch, or are internal events like authentication or confirmation requests. - Events are scoped via ``isolation_scope``: an event is visible to an - agent only when their ``isolation_scope`` values match exactly. A chat - coordinator (unscoped, ``isolation_scope=None``) sees only unscoped - events; a task or single_turn agent (scoped under the originating - function-call id) sees only its own scoped events. - Args: current_branch: The current branch of the agent. event: The event to filter. - isolation_scope: The agent's isolation_scope. None means unscoped. Returns: True if the event should be included in the context, False otherwise. """ - ev_iso = getattr(event, 'isolation_scope', None) - if ev_iso != isolation_scope: - return False return not ( _contains_empty_content(event) or not _is_event_belongs_to_branch(current_branch, event) or _is_adk_framework_event(event) or _is_auth_event(event) or _is_request_confirmation_event(event) + or _is_request_input_event(event) ) @@ -501,9 +424,6 @@ def _get_contents( agent_name: str = '', *, preserve_function_call_ids: bool = False, - isolation_scope: Optional[str] = None, - is_single_turn: bool = False, - user_content: Optional[types.Content] = None, ) -> list[types.Content]: """Get the contents for the LLM request. @@ -514,11 +434,6 @@ def _get_contents( events: Events to process. agent_name: The name of the agent. preserve_function_call_ids: Whether to preserve function call ids. - isolation_scope: scope tag — when set, restricts events - to those with matching ``event.isolation_scope`` (or unscoped). - user_content: Fallback first user turn for task agents whose - originating delegation FC is not in session (workflow-node - task case). Returns: A list of processed contents. @@ -550,9 +465,7 @@ def _get_contents( raw_filtered_events = [ e for e in rewind_filtered_events - if _should_include_event_in_context( - current_branch, e, isolation_scope=isolation_scope - ) + if _should_include_event_in_context(current_branch, e) ] has_compaction_events = any( @@ -564,14 +477,6 @@ def _get_contents( else: events_to_process = raw_filtered_events - # Build mapping of function call IDs to their authors - fc_author_by_id = {} - for e in events_to_process: - if e.content and e.content.parts: - for part in e.content.parts: - if part.function_call: - fc_author_by_id[part.function_call.id] = e.author - filtered_events = [] # aggregate transcription events for i in range(len(events_to_process)): @@ -609,23 +514,7 @@ def _get_contents( ) accumulated_output_transcription = '' - is_other_reply = _is_other_agent_reply(agent_name, event) - - # Check if it's a FunctionResponse for another agent - if not is_other_reply and event.content: - for part in event.content.parts or []: - if part.function_response: - resp_id = part.function_response.id - call_author = fc_author_by_id.get(resp_id) - if ( - call_author - and call_author != agent_name - and call_author != 'user' - ): - is_other_reply = True - break - - if is_other_reply: + if _is_other_agent_reply(agent_name, event): if converted_event := _present_other_agent_message(event): filtered_events.append(converted_event) else: @@ -647,24 +536,6 @@ def _get_contents( if not preserve_function_call_ids: remove_client_function_call_id(content) contents.append(content) - - # for scoped agents (task / single_turn), prepend a - # synthetic user-role content built from the originating FC's args. - # The FC lives in an UNSCOPED parent event (e.g., the coordinator's - # task-delegation FC), which the strict isolation filter just - # excluded — so we re-derive it directly from the full session - # events here. This becomes the agent's first turn: "your task is - # X" instead of starting cold from system instruction only. - if isolation_scope is not None: - leading = _build_task_input_user_content( - events, - isolation_scope, - is_single_turn=is_single_turn, - user_content=user_content, - ) - if leading is not None: - contents.insert(0, leading) - return contents @@ -674,9 +545,6 @@ def _get_current_turn_contents( agent_name: str = '', *, preserve_function_call_ids: bool = False, - is_single_turn: bool = False, - isolation_scope: Optional[str] = None, - user_content: Optional[types.Content] = None, ) -> list[types.Content]: """Get contents for the current turn only (no conversation history). @@ -701,17 +569,14 @@ def _get_current_turn_contents( # Find the latest event that starts the current turn and process from there for i in range(len(events) - 1, -1, -1): event = events[i] - if _should_include_event_in_context( - current_branch, event, isolation_scope=isolation_scope - ) and (event.author == 'user' or _is_other_agent_reply(agent_name, event)): + if _should_include_event_in_context(current_branch, event) and ( + event.author == 'user' or _is_other_agent_reply(agent_name, event) + ): return _get_contents( current_branch, events[i:], agent_name, preserve_function_call_ids=preserve_function_call_ids, - isolation_scope=isolation_scope, - is_single_turn=is_single_turn, - user_content=user_content, ) return [] @@ -925,6 +790,11 @@ def _is_adk_framework_event(event: Event) -> bool: return _is_function_call_event(event, 'adk_framework') +def _is_request_input_event(event: Event) -> bool: + """Checks if the event is a request input event.""" + return _is_function_call_event(event, REQUEST_INPUT_FUNCTION_CALL_NAME) + + def _is_live_model_media_event_with_inline_data(event: Event) -> bool: """Check if the event is a live/bidi media event (audio, video, image) with inline data. @@ -951,7 +821,7 @@ def _is_live_model_media_event_with_inline_data(event: Event) -> bool: ], role='model' ) grounding_metadata=None partial=None turn_complete=None finish_reason=None - error_code=None error_message=None... + error_code=None error_message=None ... """ if not event.content or not event.content.parts: return False diff --git a/src/google/adk/flows/llm_flows/functions.py b/src/google/adk/flows/llm_flows/functions.py index 259d40b6b6..588126698c 100644 --- a/src/google/adk/flows/llm_flows/functions.py +++ b/src/google/adk/flows/llm_flows/functions.py @@ -68,48 +68,6 @@ _TOOL_THREAD_POOL_LOCK = threading.Lock() -def _detect_error_type_for_telemetry( - tool: BaseTool, - tool_context: ToolContext, - function_response: Any, -) -> Optional[str]: - """Detects an error type from a tool response for telemetry purposes. - - This does not modify the response. `_detect_error_in_response` is an optional - per-tool hook accessed via `getattr` to avoid adding a public API on - `BaseTool`. Any exception raised by the detector is logged and swallowed so - that telemetry logic never breaks tool execution. - - Args: - tool: The tool whose response is being inspected. - tool_context: The tool context for the current invocation. Detection is - skipped when the tool is requesting auth or confirmation. - function_response: The raw response returned by the tool. - - Returns: - The error type string reported by the tool's `_detect_error_in_response` - hook, or `None` if no error was detected, no hook is defined, or the hook - raised an exception. - """ - try: - if ( - tool_context.actions.requested_auth_configs - or tool_context.actions.requested_tool_confirmations - ): - return None - detector = getattr(tool, '_detect_error_in_response', None) - if detector is None: - return None - return detector(function_response) - except Exception: # pylint: disable=broad-exception-caught - # Never let telemetry logic break tool execution. - logger.exception( - 'Error while detecting error type for telemetry from tool %r.', - getattr(tool, 'name', tool), - ) - return None - - def _is_live_request_queue_annotation(param: inspect.Parameter) -> bool: """Check whether a parameter is annotated as LiveRequestQueue. @@ -524,7 +482,6 @@ async def _run_on_tool_error_callbacks( function_args = ( copy.deepcopy(function_call.args) if function_call.args else {} ) - detected_error_type: Optional[str] = None tool_context = _create_tool_context( invocation_context, function_call, tool_confirmation @@ -548,7 +505,7 @@ async def _run_on_tool_error_callbacks( raise tool_error async def _run_with_trace(): - nonlocal function_args, detected_error_type + nonlocal function_args # Step 1: Check if plugin before_tool_callback overrides the function # response. @@ -619,19 +576,11 @@ async def _run_with_trace(): if altered_function_response is not None: function_response = altered_function_response - if ( - tool.is_long_running or tool._defers_response - ) and not function_response: - # The tool either runs long (FR will arrive later via session - # injection) or defers its response by design (e.g., the LlmAgent - # wrapper for task delegation synthesizes the FR after the - # sub-agent completes). Either way, skip the auto-FR build when - # the tool returned nothing. - return None - - detected_error_type = _detect_error_type_for_telemetry( - tool, tool_context, function_response - ) + if tool.is_long_running: + # Allow long-running function to return None to not provide function + # response. + if not function_response: + return None # Note: State deltas are not applied here - they are collected in # tool_context.actions.state_delta and applied later when the session @@ -647,7 +596,6 @@ async def _run_with_trace(): tool, agent, function_args ) as tel_ctx: tel_ctx.function_response_event = await _run_with_trace() - tel_ctx.error_type = detected_error_type return tel_ctx.function_response_event @@ -766,7 +714,6 @@ async def _run_on_tool_error_callbacks( function_args = ( copy.deepcopy(function_call.args) if function_call.args else {} ) - detected_error_type: Optional[str] = None tool_context = _create_tool_context(invocation_context, function_call) @@ -787,7 +734,7 @@ async def _run_on_tool_error_callbacks( raise tool_error async def _run_with_trace(): - nonlocal function_args, detected_error_type + nonlocal function_args # Do not use "args" as the variable name, because it is a reserved keyword # in python debugger. @@ -868,17 +815,10 @@ async def _run_with_trace(): if altered_function_response is not None: function_response = altered_function_response - if ( - tool.is_long_running or tool._defers_response - ) and not function_response: - # The tool either runs long (FR will arrive later via session - # injection) or defers its response by design. Skip the auto-FR - # build when the tool returned nothing. - return None - - detected_error_type = _detect_error_type_for_telemetry( - tool, tool_context, function_response - ) + if tool.is_long_running: + # Allow async function to return None to not provide function response. + if not function_response: + return None # Note: State deltas are not applied here - they are collected in # tool_context.actions.state_delta and applied later when the session @@ -894,7 +834,6 @@ async def _run_with_trace(): tool, agent, function_args ) as tel_ctx: tel_ctx.function_response_event = await _run_with_trace() - tel_ctx.error_type = detected_error_type return tel_ctx.function_response_event diff --git a/src/google/adk/flows/llm_flows/identity.py b/src/google/adk/flows/llm_flows/identity.py index 7ee95932c2..76d62d8de4 100644 --- a/src/google/adk/flows/llm_flows/identity.py +++ b/src/google/adk/flows/llm_flows/identity.py @@ -34,11 +34,10 @@ async def run_async( self, invocation_context: InvocationContext, llm_request: LlmRequest ) -> AsyncGenerator[Event, None]: agent = invocation_context.agent - if getattr(agent, 'mode', None) != 'single_turn': - si = f'You are an agent. Your internal name is "{agent.name}".' - if agent.description: - si += f' The description about you is "{agent.description}".' - llm_request.append_instructions([si]) + si = f'You are an agent. Your internal name is "{agent.name}".' + if agent.description: + si += f' The description about you is "{agent.description}".' + llm_request.append_instructions([si]) # Maintain async generator behavior if False: # Ensures it behaves as a generator diff --git a/src/google/adk/integrations/bigquery/__init__.py b/src/google/adk/integrations/bigquery/__init__.py deleted file mode 100644 index 021ed08a50..0000000000 --- a/src/google/adk/integrations/bigquery/__init__.py +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""BigQuery Integration. - -This module provides tools and skills for interacting with BigQuery. -""" - -from __future__ import annotations - -import typing - -if typing.TYPE_CHECKING: - from .bigquery_credentials import BigQueryCredentialsConfig - from .bigquery_skill import get_bigquery_skill - from .bigquery_toolset import BigQueryToolset - -# Map attribute names to relative module paths -_lazy_imports = { - "BigQueryCredentialsConfig": ".bigquery_credentials", - "BigQueryToolset": ".bigquery_toolset", - "get_bigquery_skill": ".bigquery_skill", -} - - -def __getattr__(name: str) -> any: - if name in _lazy_imports: - import importlib - - module_path = _lazy_imports[name] - # __name__ is 'google.adk.integrations.bigquery' - module = importlib.import_module(module_path, __name__) - return getattr(module, name) - raise AttributeError(f"module {__name__!r} has no attribute {name!r}") - - -def __dir__() -> list[str]: - return list(_lazy_imports.keys()) diff --git a/src/google/adk/integrations/bigquery/bigquery_credentials.py b/src/google/adk/integrations/bigquery/bigquery_credentials.py deleted file mode 100644 index a633d272a0..0000000000 --- a/src/google/adk/integrations/bigquery/bigquery_credentials.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from ...features import FeatureName -from ...tools._google_credentials import BaseGoogleCredentialsConfig - -BIGQUERY_TOKEN_CACHE_KEY = "bigquery_token_cache" -BIGQUERY_SCOPES = [ - "https://www.googleapis.com/auth/bigquery", - "https://www.googleapis.com/auth/dataplex.read-write", -] -BIGQUERY_DEFAULT_SCOPE = ["https://www.googleapis.com/auth/bigquery"] - - -class BigQueryCredentialsConfig(BaseGoogleCredentialsConfig): - """BigQuery Credentials Configuration for Google API tools. - - Please do not use this in production, as it may be deprecated later. - """ - - def __post_init__(self) -> BigQueryCredentialsConfig: - """Populate default scope if scopes is None.""" - super().__post_init__() - - if not self.scopes: - self.scopes = BIGQUERY_SCOPES - # Set the token cache key - self._token_cache_key = BIGQUERY_TOKEN_CACHE_KEY - - return self diff --git a/src/google/adk/integrations/bigquery/bigquery_toolset.py b/src/google/adk/integrations/bigquery/bigquery_toolset.py deleted file mode 100644 index 37a5070996..0000000000 --- a/src/google/adk/integrations/bigquery/bigquery_toolset.py +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from typing import List -from typing import Optional -from typing import Union - -from google.adk.agents.readonly_context import ReadonlyContext -from typing_extensions import override - -from . import data_insights_tool -from . import metadata_tool -from . import query_tool -from . import search_tool -from ...features import FeatureName -from ...tools.base_tool import BaseTool -from ...tools.base_toolset import BaseToolset -from ...tools.base_toolset import ToolPredicate -from ...tools.google_tool import GoogleTool -from .bigquery_credentials import BigQueryCredentialsConfig -from .config import BigQueryToolConfig - - -class BigQueryToolset(BaseToolset): - """BigQuery Toolset contains tools for interacting with BigQuery data and metadata.""" - - def __init__( - self, - *, - tool_filter: Optional[Union[ToolPredicate, List[str]]] = None, - credentials_config: Optional[BigQueryCredentialsConfig] = None, - bigquery_tool_config: Optional[BigQueryToolConfig] = None, - ): - super().__init__(tool_filter=tool_filter) - self._credentials_config = credentials_config - self._tool_settings = ( - bigquery_tool_config if bigquery_tool_config else BigQueryToolConfig() - ) - - def _is_tool_selected( - self, tool: BaseTool, readonly_context: ReadonlyContext - ) -> bool: - if self.tool_filter is None: - return True - - if isinstance(self.tool_filter, ToolPredicate): - return self.tool_filter(tool, readonly_context) - - if isinstance(self.tool_filter, list): - return tool.name in self.tool_filter - - return False - - @override - async def get_tools( - self, readonly_context: Optional[ReadonlyContext] = None - ) -> List[BaseTool]: - """Get tools from the toolset.""" - all_tools = [ - GoogleTool( - func=func, - credentials_config=self._credentials_config, - tool_settings=self._tool_settings, - ) - for func in [ - metadata_tool.get_dataset_info, - metadata_tool.get_table_info, - metadata_tool.list_dataset_ids, - metadata_tool.list_table_ids, - metadata_tool.get_job_info, - query_tool.get_execute_sql(self._tool_settings), - query_tool.forecast, - query_tool.analyze_contribution, - query_tool.detect_anomalies, - data_insights_tool.ask_data_insights, - search_tool.search_catalog, - ] - ] - - return [ - tool - for tool in all_tools - if self._is_tool_selected(tool, readonly_context) - ] - - @override - async def close(self): - pass diff --git a/src/google/adk/integrations/bigquery/client.py b/src/google/adk/integrations/bigquery/client.py deleted file mode 100644 index 526a181420..0000000000 --- a/src/google/adk/integrations/bigquery/client.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import os -from typing import List -from typing import Optional -from typing import Union - -import google.api_core.client_info -from google.api_core.gapic_v1 import client_info as gapic_client_info -from google.auth.credentials import Credentials -from google.cloud import bigquery -from google.cloud import dataplex_v1 - -from ... import version -from ...utils._telemetry_context import _is_visual_builder - -USER_AGENT_BASE = f"google-adk/{version.__version__}" -BQ_USER_AGENT = f"adk-bigquery-tool {USER_AGENT_BASE}" -DP_USER_AGENT = f"adk-dataplex-tool {USER_AGENT_BASE}" -USER_AGENT = BQ_USER_AGENT - -# Internal identifier for Visual Builder usage tracking. -_VISUAL_BUILDER_UA = "google-adk-visual-builder" - - -def get_bigquery_client( - *, - project: Optional[str], - credentials: Credentials, - location: Optional[str] = None, - user_agent: Optional[Union[str, List[str]]] = None, -) -> bigquery.Client: - """Get a BigQuery client. - - Args: - project: The GCP project ID. - credentials: The credentials to use for the request. - location: The location of the BigQuery client. - user_agent: The user agent to use for the request. - - Returns: - A BigQuery client. - """ - - user_agents = [BQ_USER_AGENT] - - if _is_visual_builder.get(): - user_agents.append(_VISUAL_BUILDER_UA) - - if user_agent: - if isinstance(user_agent, str): - user_agents.append(user_agent) - else: - user_agents.extend([ua for ua in user_agent if ua]) - - client_info = google.api_core.client_info.ClientInfo( - user_agent=" ".join(user_agents) - ) - - bigquery_client = bigquery.Client( - project=project, - credentials=credentials, - location=location, - client_info=client_info, - ) - - return bigquery_client - - -def get_dataplex_catalog_client( - *, - credentials: Credentials, - user_agent: Optional[Union[str, List[str]]] = None, -) -> dataplex_v1.CatalogServiceClient: - """Get a Dataplex CatalogServiceClient with minimal necessary arguments. - - Args: - credentials: The credentials to use for the request. - user_agent: Additional user agent string(s) to append. - - Returns: - A Dataplex Client. - """ - - user_agents = [DP_USER_AGENT] - - if _is_visual_builder.get(): - user_agents.append(_VISUAL_BUILDER_UA) - - if user_agent: - if isinstance(user_agent, str): - user_agents.append(user_agent) - else: - user_agents.extend([ua for ua in user_agent if ua]) - - client_info = gapic_client_info.ClientInfo(user_agent=" ".join(user_agents)) - - return dataplex_v1.CatalogServiceClient( - credentials=credentials, - client_info=client_info, - ) diff --git a/src/google/adk/integrations/bigquery/config.py b/src/google/adk/integrations/bigquery/config.py deleted file mode 100644 index e2c56ab1e3..0000000000 --- a/src/google/adk/integrations/bigquery/config.py +++ /dev/null @@ -1,158 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from enum import Enum -from typing import Optional - -from pydantic import BaseModel -from pydantic import ConfigDict -from pydantic import field_validator - -from ...features import FeatureName - - -class WriteMode(Enum): - """Write mode indicating what levels of write operations are allowed in BigQuery.""" - - BLOCKED = 'blocked' - """No write operations are allowed. - - This mode implies that only read (i.e. SELECT query) operations are allowed. - """ - - PROTECTED = 'protected' - """Only protected write operations are allowed in a BigQuery session. - - In this mode write operations in the anonymous dataset of a BigQuery session - are allowed. For example, a temporary table can be created, manipulated and - deleted in the anonymous dataset during Agent interaction, while protecting - permanent tables from being modified or deleted. To learn more about BigQuery - sessions, see https://cloud.google.com/bigquery/docs/sessions-intro. - """ - - ALLOWED = 'allowed' - """All write operations are allowed.""" - - -class BigQueryToolConfig(BaseModel): - """Configuration for BigQuery tools.""" - - # Forbid any fields not defined in the model - model_config = ConfigDict(extra='forbid') - - write_mode: WriteMode = WriteMode.BLOCKED - """Write mode for BigQuery tools. - - By default, the tool will allow only read operations. This behaviour may - change in future versions. - """ - - maximum_bytes_billed: Optional[int] = None - """Maximum number of bytes to bill for a query. - - In BigQuery on-demand pricing, charges are rounded up to the nearest MB, with - a minimum 10 MB data processed per table referenced by the query, and with a - minimum 10 MB data processed per query. So this value must be set >=10485760. - """ - - max_query_result_rows: int = 50 - """Maximum number of rows to return from a query. - - By default, the query result will be limited to 50 rows. - """ - - application_name: Optional[str] = None - """Name of the application using the BigQuery tools. - - By default, no particular application name will be set in the BigQuery - interaction. But if the tool user (agent builder) wants to differentiate - their application/agent for tracking or support purpose, they can set this - field. If set, this value will be added to the user_agent in BigQuery API - calls, and also to the BigQuery job labels with the key - "adk-bigquery-application-name". - - Note: This field is for usage discovery and tracking purposes only and should - not be used for security-sensitive decisions. - """ - - compute_project_id: Optional[str] = None - """GCP project ID to use for the BigQuery compute operations. - - This can be set as a guardrail to ensure that the tools perform the compute - operations (such as query execution) in a specific project. - """ - - location: Optional[str] = None - """BigQuery location to use for the data and compute. - - This can be set if the BigQuery tools are expected to process data in a - particular BigQuery location. If not set, then location would be automatically - determined based on the data location in the query. For all supported - locations, see https://cloud.google.com/bigquery/docs/locations. - """ - - job_labels: Optional[dict[str, str]] = None - """Labels to apply to BigQuery jobs for tracking and monitoring. - - These labels will be added to all BigQuery jobs executed by the tools. - Labels must be key-value pairs where both keys and values are strings. - Labels can be used for billing, monitoring, and resource organization. - For more information about labels, see - https://cloud.google.com/bigquery/docs/labels-intro. - - Note: These labels are for usage discovery and tracking purposes only and - should not be used for security-sensitive decisions. The number of - user-provided labels is restricted to 20, and keys starting with - "adk-bigquery-" are reserved for internal usage. - """ - - @field_validator('maximum_bytes_billed') - @classmethod - def validate_maximum_bytes_billed(cls, v): - """Validate the maximum bytes billed.""" - if v and v < 10_485_760: - raise ValueError( - 'In BigQuery on-demand pricing, charges are rounded up to the nearest' - ' MB, with a minimum 10 MB data processed per table referenced by the' - ' query, and with a minimum 10 MB data processed per query. So' - ' max_bytes_billed must be set >=10485760.' - ) - return v - - @field_validator('application_name') - @classmethod - def validate_application_name(cls, v): - """Validate the application name.""" - if v and ' ' in v: - raise ValueError('Application name should not contain spaces.') - return v - - @field_validator('job_labels') - @classmethod - def validate_job_labels(cls, v): - """Validate the job labels.""" - if v is not None: - if len(v) > 20: - raise ValueError('Only up to 20 job labels can be provided') - for key in v.keys(): - if not key: - raise ValueError('Label keys cannot be empty.') - if key.startswith('adk-bigquery-'): - raise ValueError( - 'Label key cannot start with "adk-bigquery-" as it is' - f' reserved for internal usage, found "{key}".' - ) - return v diff --git a/src/google/adk/integrations/bigquery/data_insights_tool.py b/src/google/adk/integrations/bigquery/data_insights_tool.py deleted file mode 100644 index 37959c02a3..0000000000 --- a/src/google/adk/integrations/bigquery/data_insights_tool.py +++ /dev/null @@ -1,167 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -from __future__ import annotations - -import json -from typing import Any -from typing import Dict -from typing import List - -from google.adk.tools import _gda_stream_util -from google.auth.credentials import Credentials -from google.cloud import bigquery -import requests - -from . import client -from .config import BigQueryToolConfig - -_GDA_CLIENT_ID = "GOOGLE_ADK" - - -def ask_data_insights( - project_id: str, - user_query_with_context: str, - table_references: List[Dict[str, str]], - credentials: Credentials, - settings: BigQueryToolConfig, -) -> Dict[str, Any]: - """Answers questions about structured data in BigQuery tables using natural language. - - This function takes a user's question (which can include conversational - history for context) and references to specific BigQuery tables, and sends - them to a stateless conversational API. - - The API uses a GenAI agent to understand the question, generate and execute - SQL queries and Python code, and formulate an answer. This function returns a - detailed, sequential log of this entire process, which includes any generated - SQL or Python code, the data retrieved, and the final text answer. The final - answer is always in plain text, as the underlying API is instructed not to - generate any charts, graphs, images, or other visualizations. - - Use this tool to perform data analysis, get insights, or answer complex - questions about the contents of specific BigQuery tables. - - Args: - project_id (str): The project that the inquiry is performed in. - user_query_with_context (str): The user's original request, enriched with - relevant context from the conversation history. The user's core intent - should be preserved, but context should be added to resolve ambiguities - in follow-up questions. - table_references (List[Dict[str, str]]): A list of dictionaries, each - specifying a BigQuery table to be used as context for the question. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - - Returns: - A dictionary with two keys: - - 'status': A string indicating the final status (e.g., "SUCCESS"). - - 'response': A list of dictionaries, where each dictionary - represents a step in the API's execution process (e.g., SQL - generation, data retrieval, final answer). - - Example: - A query joining multiple tables, showing the full return structure. - The original question: "Which customer from New York spent the most last - month?" - - >>> ask_data_insights( - ... project_id="some-project-id", - ... user_query_with_context=( - ... "Which customer from New York spent the most last month?" - ... "Context: The 'customers' table joins with the 'orders' table" - ... " on the 'customer_id' column." - ... "" - ... ), - ... table_references=[ - ... { - ... "projectId": "my-gcp-project", - ... "datasetId": "sales_data", - ... "tableId": "customers" - ... }, - ... { - ... "projectId": "my-gcp-project", - ... "datasetId": "sales_data", - ... "tableId": "orders" - ... } - ... ] - ... ) - { - "status": "SUCCESS", - "response": [ - { - "SQL Generated": "SELECT t1.customer_name, SUM(t2.order_total) ... " - }, - { - "Data Retrieved": { - "headers": ["customer_name", "total_spent"], - "rows": [["Jane Doe", 1234.56]], - "summary": "Showing all 1 rows." - } - }, - { - "Answer": "The customer who spent the most was Jane Doe." - } - ] - } - """ - try: - location = "global" - if not credentials.token: - error_message = ( - "Error: The provided credentials object does not have a valid access" - " token.\n\nThis is often because the credentials need to be" - " refreshed or require specific API scopes. Please ensure the" - " credentials are prepared correctly before calling this" - " function.\n\nThere may be other underlying causes as well." - ) - return { - "status": "ERROR", - "error_details": "ask_data_insights requires a valid access token.", - } - headers = { - "Authorization": f"Bearer {credentials.token}", - "Content-Type": "application/json", - "X-Goog-API-Client": _GDA_CLIENT_ID, - } - ca_url = f"https://geminidataanalytics.googleapis.com/v1beta/projects/{project_id}/locations/{location}:chat" - - instructions = """**INSTRUCTIONS - FOLLOW THESE RULES:** - 1. **CONTENT:** Your answer should present the supporting data and then provide a conclusion based on that data, including relevant details and observations where possible. - 2. **ANALYSIS DEPTH:** Your analysis must go beyond surface-level observations. Crucially, you must prioritize metrics that measure impact or outcomes over metrics that simply measure volume or raw counts. For open-ended questions, explore the topic from multiple perspectives to provide a holistic view. - 3. **OUTPUT FORMAT:** Your entire response MUST be in plain text format ONLY. - 4. **NO CHARTS:** You are STRICTLY FORBIDDEN from generating any charts, graphs, images, or any other form of visualization. - """ - - ca_payload = { - "project": f"projects/{project_id}", - "messages": [{"userMessage": {"text": user_query_with_context}}], - "inlineContext": { - "datasourceReferences": { - "bq": {"tableReferences": table_references} - }, - "systemInstruction": instructions, - "options": {"chart": {"image": {"noImage": {}}}}, - }, - "clientIdEnum": _GDA_CLIENT_ID, - } - - resp = _gda_stream_util.get_stream( - ca_url, ca_payload, headers, settings.max_query_result_rows - ) - except Exception as ex: # pylint: disable=broad-except - return { - "status": "ERROR", - "error_details": str(ex), - } - return {"status": "SUCCESS", "response": resp} diff --git a/src/google/adk/integrations/bigquery/metadata_tool.py b/src/google/adk/integrations/bigquery/metadata_tool.py deleted file mode 100644 index d9046da5fc..0000000000 --- a/src/google/adk/integrations/bigquery/metadata_tool.py +++ /dev/null @@ -1,594 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.auth.credentials import Credentials -from google.cloud import bigquery - -from . import client -from .config import BigQueryToolConfig - - -def list_dataset_ids( - project_id: str, credentials: Credentials, settings: BigQueryToolConfig -) -> list[str]: - """List BigQuery dataset ids in a Google Cloud project. - - Args: - project_id (str): The Google Cloud project id. - credentials (Credentials): The credentials to use for the request. - - Returns: - list[str]: List of the BigQuery dataset ids present in the project. - - Examples: - >>> list_dataset_ids("bigquery-public-data") - ['america_health_rankings', - 'american_community_survey', - 'aml_ai_input_dataset', - 'austin_311', - 'austin_bikeshare', - 'austin_crime', - 'austin_incidents', - 'austin_waste', - 'baseball', - 'bbc_news'] - """ - try: - bq_client = client.get_bigquery_client( - project=project_id, - credentials=credentials, - location=settings.location, - user_agent=[settings.application_name, "list_dataset_ids"], - ) - - datasets = [] - for dataset in bq_client.list_datasets(project_id): - datasets.append(dataset.dataset_id) - return datasets - except Exception as ex: - return { - "status": "ERROR", - "error_details": str(ex), - } - - -def get_dataset_info( - project_id: str, - dataset_id: str, - credentials: Credentials, - settings: BigQueryToolConfig, -) -> dict: - """Get metadata information about a BigQuery dataset. - - Args: - project_id (str): The Google Cloud project id containing the dataset. - dataset_id (str): The BigQuery dataset id. - credentials (Credentials): The credentials to use for the request. - - Returns: - dict: Dictionary representing the properties of the dataset. - - Examples: - >>> get_dataset_info("bigquery-public-data", "cdc_places") - { - "kind": "bigquery#dataset", - "etag": "fz9BaiXKgbGi53EpI2rJug==", - "id": "bigquery-public-data:cdc_places", - "selfLink": "https://content-bigquery.googleapis.com/bigquery/v2/projects/bigquery-public-data/datasets/cdc_places", - "datasetReference": { - "datasetId": "cdc_places", - "projectId": "bigquery-public-data" - }, - "description": "Local Data for Better Health, County Data", - "access": [ - { - "role": "WRITER", - "specialGroup": "projectWriters" - }, - { - "role": "OWNER", - "specialGroup": "projectOwners" - }, - { - "role": "OWNER", - "userByEmail": "some-redacted-email@bigquery-public-data.iam.gserviceaccount.com" - }, - { - "role": "READER", - "specialGroup": "projectReaders" - } - ], - "creationTime": "1640891845643", - "lastModifiedTime": "1640891845643", - "location": "US", - "type": "DEFAULT", - "maxTimeTravelHours": "168" - } - """ - try: - bq_client = client.get_bigquery_client( - project=project_id, - credentials=credentials, - location=settings.location, - user_agent=[settings.application_name, "get_dataset_info"], - ) - dataset = bq_client.get_dataset( - bigquery.DatasetReference(project_id, dataset_id) - ) - return dataset.to_api_repr() - except Exception as ex: - return { - "status": "ERROR", - "error_details": str(ex), - } - - -def list_table_ids( - project_id: str, - dataset_id: str, - credentials: Credentials, - settings: BigQueryToolConfig, -) -> list[str]: - """List table ids in a BigQuery dataset. - - Args: - project_id (str): The Google Cloud project id containing the dataset. - dataset_id (str): The BigQuery dataset id. - credentials (Credentials): The credentials to use for the request. - - Returns: - list[str]: List of the tables ids present in the dataset. - - Examples: - >>> list_table_ids("bigquery-public-data", "cdc_places") - ['chronic_disease_indicators', - 'local_data_for_better_health_county_data'] - """ - try: - bq_client = client.get_bigquery_client( - project=project_id, - credentials=credentials, - location=settings.location, - user_agent=[settings.application_name, "list_table_ids"], - ) - - tables = [] - for table in bq_client.list_tables( - bigquery.DatasetReference(project_id, dataset_id) - ): - tables.append(table.table_id) - return tables - except Exception as ex: - return { - "status": "ERROR", - "error_details": str(ex), - } - - -def get_table_info( - project_id: str, - dataset_id: str, - table_id: str, - credentials: Credentials, - settings: BigQueryToolConfig, -) -> dict: - """Get metadata information about a BigQuery table. - - Args: - project_id (str): The Google Cloud project id containing the dataset. - dataset_id (str): The BigQuery dataset id containing the table. - table_id (str): The BigQuery table id. - credentials (Credentials): The credentials to use for the request. - - Returns: - dict: Dictionary representing the properties of the table. - - Examples: - >>> get_table_info("bigquery-public-data", "cdc_places", "local_data_for_better_health_county_data") - { - "kind": "bigquery#table", - "etag": "wx23aDqmgc39oUSiNuYTAA==", - "id": "bigquery-public-data:cdc_places.local_data_for_better_health_county_data", - "selfLink": "https://content-bigquery.googleapis.com/bigquery/v2/projects/bigquery-public-data/datasets/cdc_places/tables/local_data_for_better_health_county_data", - "tableReference": { - "projectId": "bigquery-public-data", - "datasetId": "cdc_places", - "tableId": "local_data_for_better_health_county_data" - }, - "description": "Local Data for Better Health, County Data", - "schema": { - "fields": [ - { - "name": "year", - "type": "INTEGER", - "mode": "NULLABLE" - }, - { - "name": "stateabbr", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "statedesc", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "locationname", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "datasource", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "category", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "measure", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "data_value_unit", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "data_value_type", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "data_value", - "type": "FLOAT", - "mode": "NULLABLE" - } - ] - }, - "numBytes": "234849", - "numLongTermBytes": "0", - "numRows": "1000", - "creationTime": "1640891846119", - "lastModifiedTime": "1749427268137", - "type": "TABLE", - "location": "US", - "numTimeTravelPhysicalBytes": "285737", - "numTotalLogicalBytes": "234849", - "numActiveLogicalBytes": "234849", - "numLongTermLogicalBytes": "0", - "numTotalPhysicalBytes": "326557", - "numActivePhysicalBytes": "326557", - "numLongTermPhysicalBytes": "0", - "numCurrentPhysicalBytes": "40820" - } - """ - try: - bq_client = client.get_bigquery_client( - project=project_id, - credentials=credentials, - location=settings.location, - user_agent=[settings.application_name, "get_table_info"], - ) - return bq_client.get_table( - bigquery.TableReference( - bigquery.DatasetReference(project_id, dataset_id), table_id - ) - ).to_api_repr() - except Exception as ex: - return { - "status": "ERROR", - "error_details": str(ex), - } - - -def get_job_info( - project_id: str, - job_id: str, - credentials: Credentials, - settings: BigQueryToolConfig, -) -> dict: - """Get metadata information about a BigQuery job. Including slot usage, - job configuration, job statistics, job status, original query etc. - - Args: - project_id (str): The Google Cloud project id containing the job. - job_id (str): The BigQuery job id. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The BigQuery tool settings. - - Returns: - dict: Dictionary representing the properties of the job. - - Examples: - >>> user may give job id in format of: project_id:region.job_id - like bigquery-public-data:US.bquxjob_12345678_1234567890 - >>> get_job_info("bigquery-public-data", "bquxjob_12345678_1234567890") - { - "get_job_info_response": { - "configuration": { - "jobType": "QUERY", - "query": { - "destinationTable": { - "datasetId": "_fd6de55d5d5c13fcfb0449cbf933bb695b2c3085", - "projectId": "projectid", - "tableId": "anonfbbe65d6_9782_469b_9f56_1392560314b2" - }, - "priority": "INTERACTIVE", - "query": "SELECT * FROM `projectid.dataset_id.table_id` WHERE TIMESTAMP_TRUNC(_PARTITIONTIME, DAY) = TIMESTAMP(\"2025-10-29\") LIMIT 1000", - "useLegacySql": false, - "writeDisposition": "WRITE_TRUNCATE" - } - }, - "etag": "EdeYv9sdcO7tD9HsffvcuQ==", - "id": "projectid:US.job-id", - "jobCreationReason": { - "code": "REQUESTED" - }, - "jobReference": { - "jobId": "job-id", - "location": "US", - "projectId": "projectid" - }, - "kind": "bigquery#job", - "principal_subject": "user:abc@google.com", - "selfLink": "https://bigquery.googleapis.com/bigquery/v2/projects/projectid/jobs/job-id?location=US", - "statistics": { - "creationTime": 1761760370152, - "endTime": 1761760371250, - "finalExecutionDurationMs": "489", - "query": { - "billingTier": 1, - "cacheHit": false, - "estimatedBytesProcessed": "5597805", - "metadataCacheStatistics": { - "tableMetadataCacheUsage": [ - { - "explanation": "Table does not have CMETA.", - "tableReference": { - "datasetId": "datasetId", - "projectId": "projectid", - "tableId": "tableId" - }, - "unusedReason": "OTHER_REASON" - } - ] - }, - "queryPlan": [ - { - "completedParallelInputs": "3", - "computeMode": "BIGQUERY", - "computeMsAvg": "13", - "computeMsMax": "15", - "computeRatioAvg": 0.054852320675105488, - "computeRatioMax": 0.063291139240506333, - "endMs": "1761760370422", - "id": "0", - "name": "S00: Input", - "parallelInputs": "8", - "readMsAvg": "18", - "readMsMax": "21", - "readRatioAvg": 0.0759493670886076, - "readRatioMax": 0.088607594936708861, - "recordsRead": "1690", - "recordsWritten": "1690", - "shuffleOutputBytes": "1031149", - "shuffleOutputBytesSpilled": "0", - "slotMs": "157", - "startMs": "1761760370388", - "status": "COMPLETE", - "steps": [ - { - "kind": "READ", - "substeps": [ - "$2:extendedFields.$is_not_null, $3:extendedFields.traceId, $4:span.$is_not_null, $5:span.spanKind, $6:span.endTime, $7:span.startTime, $8:span.parentSpanId, $9:span.spanId, $10:span.name, $11:span.childSpanCount.$is_not_null, $12:span.childSpanCount.value, $13:span.sameProcessAsParentSpan.$is_not_null, $14:span.sameProcessAsParentSpan.value, $15:span.status.$is_not_null, $16:span.status.message, $17:span.status.code", - "FROM projectid.dataset_id.table_id", - "WHERE equal(timestamp_trunc($1, 3), 1761696000.000000000)" - ] - }, - { - "kind": "LIMIT", - "substeps": [ - "1000" - ] - }, - { - "kind": "WRITE", - "substeps": [ - "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17", - "TO __stage00_output" - ] - } - ], - "waitMsAvg": "1", - "waitMsMax": "1", - "waitRatioAvg": 0.0042194092827004216, - "waitRatioMax": 0.0042194092827004216, - "writeMsAvg": "2", - "writeMsMax": "2", - "writeRatioAvg": 0.0084388185654008432, - "writeRatioMax": 0.0084388185654008432 - }, - { - "completedParallelInputs": "1", - "computeMode": "BIGQUERY", - "computeMsAvg": "22", - "computeMsMax": "22", - "computeRatioAvg": 0.092827004219409287, - "computeRatioMax": 0.092827004219409287, - "endMs": "1761760370428", - "id": "1", - "inputStages": [ - "0" - ], - "name": "S01: Compute+", - "parallelInputs": "1", - "readMsAvg": "0", - "readMsMax": "0", - "readRatioAvg": 0, - "readRatioMax": 0, - "recordsRead": "1001", - "recordsWritten": "1000", - "shuffleOutputBytes": "800157", - "shuffleOutputBytesSpilled": "0", - "slotMs": "29", - "startMs": "1761760370398", - "status": "COMPLETE", - "steps": [ - { - "kind": "READ", - "substeps": [ - "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17", - "FROM __stage00_output" - ] - }, - { - "kind": "COMPUTE", - "substeps": [ - "$130 := MAKE_STRUCT($3, $2)", - "$131 := MAKE_STRUCT($10, $9, $8, MAKE_STRUCT($29, $28, $27), $7, $6, MAKE_STRUCT(...), MAKE_STRUCT(...), MAKE_STRUCT(...), ...)" - ] - }, - { - "kind": "LIMIT", - "substeps": [ - "1000" - ] - }, - { - "kind": "WRITE", - "substeps": [ - "$130, $131", - "TO __stage01_output" - ] - } - ], - "waitMsAvg": "7", - "waitMsMax": "7", - "waitRatioAvg": 0.029535864978902954, - "waitRatioMax": 0.029535864978902954, - "writeMsAvg": "4", - "writeMsMax": "4", - "writeRatioAvg": 0.016877637130801686, - "writeRatioMax": 0.016877637130801686 - }, - { - "completedParallelInputs": "1", - "computeMode": "BIGQUERY", - "computeMsAvg": "33", - "computeMsMax": "33", - "computeRatioAvg": 0.13924050632911392, - "computeRatioMax": 0.13924050632911392, - "endMs": "1761760370745", - "id": "2", - "inputStages": [ - "1" - ], - "name": "S02: Output", - "parallelInputs": "1", - "readMsAvg": "0", - "readMsMax": "0", - "readRatioAvg": 0, - "readRatioMax": 0, - "recordsRead": "1000", - "recordsWritten": "1000", - "shuffleOutputBytes": "459829", - "shuffleOutputBytesSpilled": "0", - "slotMs": "106", - "startMs": "1761760370667", - "status": "COMPLETE", - "steps": [ - { - "kind": "READ", - "substeps": [ - "$130, $131", - "FROM __stage01_output" - ] - }, - { - "kind": "WRITE", - "substeps": [ - "$130, $131", - "TO __stage02_output" - ] - } - ], - "waitMsAvg": "237", - "waitMsMax": "237", - "waitRatioAvg": 1, - "waitRatioMax": 1, - "writeMsAvg": "55", - "writeMsMax": "55", - "writeRatioAvg": 0.2320675105485232, - "writeRatioMax": 0.2320675105485232 - } - ], - "referencedTables": [ - { - "datasetId": "dataset_id", - "projectId": "projectid", - "tableId": "table_id" - } - ], - "statementType": "SELECT", - "timeline": [ - { - "completedUnits": "5", - "elapsedMs": "492", - "estimatedRunnableUnits": "0", - "pendingUnits": "5", - "totalSlotMs": "293" - } - ], - "totalBytesBilled": "10485760", - "totalBytesProcessed": "5597805", - "totalPartitionsProcessed": "2", - "totalSlotMs": "293", - "transferredBytes": "0" - }, - "startTime": 1761760370268, - "totalBytesProcessed": "5597805", - "totalSlotMs": "293" - }, - "status": { - "state": "DONE" - }, - "user_email": "abc@google.com" - } - } - """ - try: - bq_client = client.get_bigquery_client( - project=project_id, - credentials=credentials, - location=settings.location, - user_agent=[settings.application_name, "get_job_info"], - ) - - job = bq_client.get_job(job_id) - # We need to use _properties to get the job info because it contains all - # the job info. - # pylint: disable=protected-access - return job._properties - except Exception as ex: - return { - "status": "ERROR", - "error_details": str(ex), - } diff --git a/src/google/adk/integrations/bigquery/query_tool.py b/src/google/adk/integrations/bigquery/query_tool.py deleted file mode 100644 index 1721db6781..0000000000 --- a/src/google/adk/integrations/bigquery/query_tool.py +++ /dev/null @@ -1,1371 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import functools -import json -import types -from typing import Callable -from typing import Optional -import uuid - -from google.auth.credentials import Credentials -from google.cloud import bigquery - -from . import client -from ...tools.tool_context import ToolContext -from .config import BigQueryToolConfig -from .config import WriteMode - -BIGQUERY_SESSION_INFO_KEY = "bigquery_session_info" - - -def _execute_sql( - project_id: str, - query: str, - credentials: Credentials, - settings: BigQueryToolConfig, - tool_context: ToolContext, - dry_run: bool = False, - caller_id: Optional[str] = None, -) -> dict: - try: - # Validate compute project if applicable - if ( - settings.compute_project_id - and project_id != settings.compute_project_id - ): - return { - "status": "ERROR", - "error_details": ( - f"Cannot execute query in the project {project_id}, as the tool" - " is restricted to execute queries only in the project" - f" {settings.compute_project_id}." - ), - } - - # Get BigQuery client - bq_client = client.get_bigquery_client( - project=project_id, - credentials=credentials, - location=settings.location, - user_agent=[settings.application_name, caller_id], - ) - - # BigQuery connection properties where applicable - bq_connection_properties = [] - - # BigQuery job labels if applicable - bq_job_labels = ( - settings.job_labels.copy() if settings and settings.job_labels else {} - ) - - if caller_id: - bq_job_labels["adk-bigquery-tool"] = caller_id - if settings and settings.application_name: - bq_job_labels["adk-bigquery-application-name"] = settings.application_name - - if not settings or settings.write_mode == WriteMode.BLOCKED: - dry_run_query_job = bq_client.query( - query, - project=project_id, - job_config=bigquery.QueryJobConfig( - dry_run=True, labels=bq_job_labels - ), - ) - if dry_run_query_job.statement_type != "SELECT": - return { - "status": "ERROR", - "error_details": "Read-only mode only supports SELECT statements.", - } - elif settings.write_mode == WriteMode.PROTECTED: - # In protected write mode, write operation only to a temporary artifact is - # allowed. This artifact must have been created in a BigQuery session. In - # such a scenario, the session info (session id and the anonymous dataset - # containing the artifact) is persisted in the tool context. - bq_session_info = tool_context.state.get(BIGQUERY_SESSION_INFO_KEY, None) - if bq_session_info: - bq_session_id, bq_session_dataset_id = bq_session_info - else: - session_creator_job = bq_client.query( - "SELECT 1", - project=project_id, - job_config=bigquery.QueryJobConfig( - dry_run=True, create_session=True, labels=bq_job_labels - ), - ) - bq_session_id = session_creator_job.session_info.session_id - bq_session_dataset_id = session_creator_job.destination.dataset_id - - # Remember the BigQuery session info for subsequent queries - tool_context.state[BIGQUERY_SESSION_INFO_KEY] = ( - bq_session_id, - bq_session_dataset_id, - ) - - # Session connection property will be set in the query execution - bq_connection_properties.append( - bigquery.ConnectionProperty("session_id", bq_session_id) - ) - - # Check the query type w.r.t. the BigQuery session - dry_run_query_job = bq_client.query( - query, - project=project_id, - job_config=bigquery.QueryJobConfig( - dry_run=True, - connection_properties=bq_connection_properties, - labels=bq_job_labels, - ), - ) - if ( - dry_run_query_job.statement_type != "SELECT" - and dry_run_query_job.destination - and dry_run_query_job.destination.dataset_id != bq_session_dataset_id - ): - return { - "status": "ERROR", - "error_details": ( - "Protected write mode only supports SELECT statements, or write" - " operations in the anonymous dataset of a BigQuery session." - ), - } - - # Return the dry run characteristics of the query if requested - if dry_run: - dry_run_job = bq_client.query( - query, - project=project_id, - job_config=bigquery.QueryJobConfig( - dry_run=True, - connection_properties=bq_connection_properties, - labels=bq_job_labels, - ), - ) - return {"status": "SUCCESS", "dry_run_info": dry_run_job.to_api_repr()} - - # Finally execute the query, fetch the result, and return it - job_config = bigquery.QueryJobConfig( - connection_properties=bq_connection_properties, - labels=bq_job_labels, - ) - if settings.maximum_bytes_billed: - job_config.maximum_bytes_billed = settings.maximum_bytes_billed - row_iterator = bq_client.query_and_wait( - query, - job_config=job_config, - project=project_id, - max_results=settings.max_query_result_rows, - ) - rows = [] - for row in row_iterator: - row_values = {} - for key, val in row.items(): - try: - # if the json serialization of the value succeeds, use it as is - json.dumps(val) - except (TypeError, ValueError, OverflowError): - val = str(val) - row_values[key] = val - rows.append(row_values) - - result = {"status": "SUCCESS", "rows": rows} - if ( - settings.max_query_result_rows is not None - and len(rows) == settings.max_query_result_rows - ): - result["result_is_likely_truncated"] = True - return result - except Exception as ex: # pylint: disable=broad-except - return { - "status": "ERROR", - "error_details": str(ex), - } - - -def execute_sql( - project_id: str, - query: str, - credentials: Credentials, - settings: BigQueryToolConfig, - tool_context: ToolContext, - dry_run: bool = False, -) -> dict: - """Run a BigQuery or BigQuery ML SQL query in the project and return the result. - - Args: - project_id (str): The GCP project id in which the query should be - executed. - query (str): The BigQuery SQL query to be executed. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - tool_context (ToolContext): The context for the tool. - dry_run (bool, default False): If True, the query will not be executed. - Instead, the query will be validated and information about the query - will be returned. Defaults to False. - - Returns: - dict: If `dry_run` is False, dictionary representing the result of the - query. If the result contains the key "result_is_likely_truncated" - with value True, it means that there may be additional rows matching - the query not returned in the result. - If `dry_run` is True, dictionary with "dry_run_info" field - containing query information returned by BigQuery. - - Examples: - Fetch data or insights from a table: - - >>> execute_sql("my_project", - ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") - { - "status": "SUCCESS", - "rows": [ - { - "island": "Dream", - "population": 124 - }, - { - "island": "Biscoe", - "population": 168 - }, - { - "island": "Torgersen", - "population": 52 - } - ] - } - - Validate a query and estimate costs without executing it: - - >>> execute_sql( - ... "my_project", - ... "SELECT island FROM " - ... "`bigquery-public-data`.`ml_datasets`.`penguins`", - ... dry_run=True - ... ) - { - "status": "SUCCESS", - "dry_run_info": { - "configuration": { - "dryRun": True, - "jobType": "QUERY", - "query": { - "destinationTable": { - "datasetId": "_...", - "projectId": "my_project", - "tableId": "anon..." - }, - "priority": "INTERACTIVE", - "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", - "useLegacySql": False, - "writeDisposition": "WRITE_TRUNCATE" - } - }, - "jobReference": { - "location": "US", - "projectId": "my_project" - } - } - } - """ - return _execute_sql( - project_id=project_id, - query=query, - credentials=credentials, - settings=settings, - tool_context=tool_context, - dry_run=dry_run, - caller_id="execute_sql", - ) - - -def _execute_sql_write_mode(*args, **kwargs) -> dict: - """Run a BigQuery or BigQuery ML SQL query in the project and return the result. - - Args: - project_id (str): The GCP project id in which the query should be - executed. - query (str): The BigQuery SQL query to be executed. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - tool_context (ToolContext): The context for the tool. - dry_run (bool, default False): If True, the query will not be executed. - Instead, the query will be validated and information about the query - will be returned. Defaults to False. - - Returns: - dict: If `dry_run` is False, dictionary representing the result of the - query. If the result contains the key "result_is_likely_truncated" - with value True, it means that there may be additional rows matching - the query not returned in the result. - If `dry_run` is True, dictionary with "dry_run_info" field - containing query information returned by BigQuery. - - Examples: - Fetch data or insights from a table: - - >>> execute_sql("my_project", - ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") - { - "status": "SUCCESS", - "rows": [ - { - "island": "Dream", - "population": 124 - }, - { - "island": "Biscoe", - "population": 168 - }, - { - "island": "Torgersen", - "population": 52 - } - ] - } - - Validate a query and estimate costs without executing it: - - >>> execute_sql( - ... "my_project", - ... "SELECT island FROM " - ... "`bigquery-public-data`.`ml_datasets`.`penguins`", - ... dry_run=True - ... ) - { - "status": "SUCCESS", - "dry_run_info": { - "configuration": { - "dryRun": True, - "jobType": "QUERY", - "query": { - "destinationTable": { - "datasetId": "_...", - "projectId": "my_project", - "tableId": "anon..." - }, - "priority": "INTERACTIVE", - "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", - "useLegacySql": False, - "writeDisposition": "WRITE_TRUNCATE" - } - }, - "jobReference": { - "location": "US", - "projectId": "my_project" - } - } - } - - Create a table with schema prescribed: - - >>> execute_sql("my_project", - ... "CREATE TABLE `my_project`.`my_dataset`.`my_table` " - ... "(island STRING, population INT64)") - { - "status": "SUCCESS", - "rows": [] - } - - Insert data into an existing table: - - >>> execute_sql("my_project", - ... "INSERT INTO `my_project`.`my_dataset`.`my_table` (island, population) " - ... "VALUES ('Dream', 124), ('Biscoe', 168)") - { - "status": "SUCCESS", - "rows": [] - } - - Create a table from the result of a query: - - >>> execute_sql("my_project", - ... "CREATE TABLE `my_project`.`my_dataset`.`my_table` AS " - ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") - { - "status": "SUCCESS", - "rows": [] - } - - Delete a table: - - >>> execute_sql("my_project", - ... "DROP TABLE `my_project`.`my_dataset`.`my_table`") - { - "status": "SUCCESS", - "rows": [] - } - - Copy a table to another table: - - >>> execute_sql("my_project", - ... "CREATE TABLE `my_project`.`my_dataset`.`my_table_clone` " - ... "CLONE `my_project`.`my_dataset`.`my_table`") - { - "status": "SUCCESS", - "rows": [] - } - - Create a snapshot (a lightweight, read-optimized copy) of en existing - table: - - >>> execute_sql("my_project", - ... "CREATE SNAPSHOT TABLE `my_project`.`my_dataset`.`my_table_snapshot` " - ... "CLONE `my_project`.`my_dataset`.`my_table`") - { - "status": "SUCCESS", - "rows": [] - } - - Create a BigQuery ML linear regression model: - - >>> execute_sql("my_project", - ... "CREATE MODEL `my_dataset`.`my_model` " - ... "OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS " - ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " - ... "WHERE body_mass_g IS NOT NULL") - { - "status": "SUCCESS", - "rows": [] - } - - Evaluate BigQuery ML model: - - >>> execute_sql("my_project", - ... "SELECT * FROM ML.EVALUATE(MODEL `my_dataset`.`my_model`)") - { - "status": "SUCCESS", - "rows": [{'mean_absolute_error': 227.01223667447218, - 'mean_squared_error': 81838.15989216768, - 'mean_squared_log_error': 0.0050704473735013, - 'median_absolute_error': 173.08081641661738, - 'r2_score': 0.8723772534253441, - 'explained_variance': 0.8723772534253442}] - } - - Evaluate BigQuery ML model on custom data: - - >>> execute_sql("my_project", - ... "SELECT * FROM ML.EVALUATE(MODEL `my_dataset`.`my_model`, " - ... "(SELECT * FROM `my_dataset`.`my_table`))") - { - "status": "SUCCESS", - "rows": [{'mean_absolute_error': 227.01223667447218, - 'mean_squared_error': 81838.15989216768, - 'mean_squared_log_error': 0.0050704473735013, - 'median_absolute_error': 173.08081641661738, - 'r2_score': 0.8723772534253441, - 'explained_variance': 0.8723772534253442}] - } - - Predict using BigQuery ML model: - - >>> execute_sql("my_project", - ... "SELECT * FROM ML.PREDICT(MODEL `my_dataset`.`my_model`, " - ... "(SELECT * FROM `my_dataset`.`my_table`))") - { - "status": "SUCCESS", - "rows": [ - { - "predicted_body_mass_g": "3380.9271650847013", - ... - }, { - "predicted_body_mass_g": "3873.6072435386004", - ... - }, - ... - ] - } - - Delete a BigQuery ML model: - - >>> execute_sql("my_project", "DROP MODEL `my_dataset`.`my_model`") - { - "status": "SUCCESS", - "rows": [] - } - - Notes: - - If a destination table already exists, there are a few ways to overwrite - it: - - Use "CREATE OR REPLACE TABLE" instead of "CREATE TABLE". - - First run "DROP TABLE", followed by "CREATE TABLE". - - If a model already exists, there are a few ways to overwrite it: - - Use "CREATE OR REPLACE MODEL" instead of "CREATE MODEL". - - First run "DROP MODEL", followed by "CREATE MODEL". - """ - return execute_sql(*args, **kwargs) - - -def _execute_sql_protected_write_mode(*args, **kwargs) -> dict: - """Run a BigQuery or BigQuery ML SQL query in the project and return the result. - - Args: - project_id (str): The GCP project id in which the query should be - executed. - query (str): The BigQuery SQL query to be executed. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - tool_context (ToolContext): The context for the tool. - dry_run (bool, default False): If True, the query will not be executed. - Instead, the query will be validated and information about the query - will be returned. Defaults to False. - - Returns: - dict: If `dry_run` is False, dictionary representing the result of the - query. If the result contains the key "result_is_likely_truncated" - with value True, it means that there may be additional rows matching - the query not returned in the result. - If `dry_run` is True, dictionary with "dry_run_info" field - containing query information returned by BigQuery. - - Examples: - Fetch data or insights from a table: - - >>> execute_sql("my_project", - ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") - { - "status": "SUCCESS", - "rows": [ - { - "island": "Dream", - "population": 124 - }, - { - "island": "Biscoe", - "population": 168 - }, - { - "island": "Torgersen", - "population": 52 - } - ] - } - - Validate a query and estimate costs without executing it: - - >>> execute_sql( - ... "my_project", - ... "SELECT island FROM " - ... "`bigquery-public-data`.`ml_datasets`.`penguins`", - ... dry_run=True - ... ) - { - "status": "SUCCESS", - "dry_run_info": { - "configuration": { - "dryRun": True, - "jobType": "QUERY", - "query": { - "destinationTable": { - "datasetId": "_...", - "projectId": "my_project", - "tableId": "anon..." - }, - "priority": "INTERACTIVE", - "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", - "useLegacySql": False, - "writeDisposition": "WRITE_TRUNCATE" - } - }, - "jobReference": { - "location": "US", - "projectId": "my_project" - } - } - } - - Create a temporary table with schema prescribed: - - >>> execute_sql("my_project", - ... "CREATE TEMP TABLE `my_table` (island STRING, population INT64)") - { - "status": "SUCCESS", - "rows": [] - } - - Insert data into an existing temporary table: - - >>> execute_sql("my_project", - ... "INSERT INTO `my_table` (island, population) " - ... "VALUES ('Dream', 124), ('Biscoe', 168)") - { - "status": "SUCCESS", - "rows": [] - } - - Create a temporary table from the result of a query: - - >>> execute_sql("my_project", - ... "CREATE TEMP TABLE `my_table` AS " - ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") - { - "status": "SUCCESS", - "rows": [] - } - - Delete a temporary table: - - >>> execute_sql("my_project", "DROP TABLE `my_table`") - { - "status": "SUCCESS", - "rows": [] - } - - Copy a temporary table to another temporary table: - - >>> execute_sql("my_project", - ... "CREATE TEMP TABLE `my_table_clone` CLONE `my_table`") - { - "status": "SUCCESS", - "rows": [] - } - - Create a temporary BigQuery ML linear regression model: - - >>> execute_sql("my_project", - ... "CREATE TEMP MODEL `my_model` " - ... "OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS" - ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " - ... "WHERE body_mass_g IS NOT NULL") - { - "status": "SUCCESS", - "rows": [] - } - - Evaluate BigQuery ML model: - - >>> execute_sql("my_project", "SELECT * FROM ML.EVALUATE(MODEL `my_model`)") - { - "status": "SUCCESS", - "rows": [{'mean_absolute_error': 227.01223667447218, - 'mean_squared_error': 81838.15989216768, - 'mean_squared_log_error': 0.0050704473735013, - 'median_absolute_error': 173.08081641661738, - 'r2_score': 0.8723772534253441, - 'explained_variance': 0.8723772534253442}] - } - - Evaluate BigQuery ML model on custom data: - - >>> execute_sql("my_project", - ... "SELECT * FROM ML.EVALUATE(MODEL `my_model`, " - ... "(SELECT * FROM `my_dataset`.`my_table`))") - { - "status": "SUCCESS", - "rows": [{'mean_absolute_error': 227.01223667447218, - 'mean_squared_error': 81838.15989216768, - 'mean_squared_log_error': 0.0050704473735013, - 'median_absolute_error': 173.08081641661738, - 'r2_score': 0.8723772534253441, - 'explained_variance': 0.8723772534253442}] - } - - Predict using BigQuery ML model: - - >>> execute_sql("my_project", - ... "SELECT * FROM ML.PREDICT(MODEL `my_model`, " - ... "(SELECT * FROM `my_dataset`.`my_table`))") - { - "status": "SUCCESS", - "rows": [ - { - "predicted_body_mass_g": "3380.9271650847013", - ... - }, { - "predicted_body_mass_g": "3873.6072435386004", - ... - }, - ... - ] - } - - Delete a BigQuery ML model: - - >>> execute_sql("my_project", "DROP MODEL `my_model`") - { - "status": "SUCCESS", - "rows": [] - } - - Notes: - - If a destination table already exists, there are a few ways to overwrite - it: - - Use "CREATE OR REPLACE TEMP TABLE" instead of "CREATE TEMP TABLE". - - First run "DROP TABLE", followed by "CREATE TEMP TABLE". - - Only temporary tables can be created, inserted into or deleted. Please - do not try creating a permanent table (non-TEMP table), inserting into or - deleting one. - - If a destination model already exists, there are a few ways to overwrite - it: - - Use "CREATE OR REPLACE TEMP MODEL" instead of "CREATE TEMP MODEL". - - First run "DROP MODEL", followed by "CREATE TEMP MODEL". - - Only temporary models can be created or deleted. Please do not try - creating a permanent model (non-TEMP model) or deleting one. - """ - return execute_sql(*args, **kwargs) - - -def get_execute_sql(settings: BigQueryToolConfig) -> Callable[..., dict]: - """Get the execute_sql tool customized as per the given tool settings. - - Args: - settings: BigQuery tool settings indicating the behavior of the - execute_sql tool. - - Returns: - callable[..., dict]: A version of the execute_sql tool respecting the tool - settings. - """ - - if not settings or settings.write_mode == WriteMode.BLOCKED: - return execute_sql - - # Create a new function object using the original function's code and globals. - # We pass the original code, globals, name, defaults, and closure. - # This creates a raw function object without copying other metadata yet. - execute_sql_wrapper = types.FunctionType( - execute_sql.__code__, - execute_sql.__globals__, - execute_sql.__name__, - execute_sql.__defaults__, - execute_sql.__closure__, - ) - - # Use functools.update_wrapper to copy over other essential attributes - # from the original function to the new one. - # This includes __name__, __qualname__, __module__, __annotations__, etc. - # It specifically allows us to then set __doc__ separately. - functools.update_wrapper(execute_sql_wrapper, execute_sql) - - # Now, set the new docstring - if settings.write_mode == WriteMode.PROTECTED: - execute_sql_wrapper.__doc__ = _execute_sql_protected_write_mode.__doc__ - else: - execute_sql_wrapper.__doc__ = _execute_sql_write_mode.__doc__ - - return execute_sql_wrapper - - -def forecast( - project_id: str, - history_data: str, - timestamp_col: str, - data_col: str, - horizon: int = 10, - id_cols: Optional[list[str]] = None, - *, - credentials: Credentials, - settings: BigQueryToolConfig, - tool_context: ToolContext, -) -> dict: - """Run a BigQuery AI time series forecast using AI.FORECAST. - - Args: - project_id (str): The GCP project id in which the query should be - executed. - history_data (str): The table id of the BigQuery table containing the - history time series data or a query statement that select the history - data. - timestamp_col (str): The name of the column containing the timestamp for - each data point. - data_col (str): The name of the column containing the numerical values to - be forecasted. - horizon (int, optional): The number of time steps to forecast into the - future. Defaults to 10. - id_cols (list, optional): The column names of the id columns to indicate - each time series when there are multiple time series in the table. All - elements must be strings. Defaults to None. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - tool_context (ToolContext): The context for the tool. - - Returns: - dict: Dictionary representing the result of the forecast. The result - contains the forecasted values along with prediction intervals. - - Examples: - Forecast daily sales for the next 7 days based on historical data from - a BigQuery table: - - >>> forecast( - ... project_id="my-gcp-project", - ... history_data="my-dataset.my-sales-table", - ... timestamp_col="sale_date", - ... data_col="daily_sales", - ... horizon=7 - ... ) - { - "status": "SUCCESS", - "rows": [ - { - "forecast_timestamp": "2025-01-08T00:00:00", - "forecast_value": 12345.67, - "confidence_level": 0.95, - "prediction_interval_lower_bound": 11000.0, - "prediction_interval_upper_bound": 13691.34, - "ai_forecast_status": "" - }, - ... - ] - } - - Forecast multiple time series using a SQL query as input: - - >>> history_query = ( - ... "SELECT unique_id, timestamp, value " - ... "FROM `my-project.my-dataset.my-timeseries-table` " - ... "WHERE timestamp > '1980-01-01'" - ... ) - >>> forecast( - ... project_id="my-gcp-project", - ... history_data=history_query, - ... timestamp_col="timestamp", - ... data_col="value", - ... id_cols=["unique_id"], - ... horizon=14 - ... ) - { - "status": "SUCCESS", - "rows": [ - { - "unique_id": "T1", - "forecast_timestamp": "1980-08-28T00:00:00", - "forecast_value": 1253218.75, - "confidence_level": 0.95, - "prediction_interval_lower_bound": 274252.51, - "prediction_interval_upper_bound": 2232184.99, - "ai_forecast_status": "" - }, - ... - ] - } - - Error Scenarios: - When an element in `id_cols` is not a string: - - >>> forecast( - ... project_id="my-gcp-project", - ... history_data="my-dataset.my-sales-table", - ... timestamp_col="sale_date", - ... data_col="daily_sales", - ... id_cols=["store_id", 123] - ... ) - { - "status": "ERROR", - "error_details": "All elements in id_cols must be strings." - } - - When `history_data` refers to a table that does not exist: - - >>> forecast( - ... project_id="my-gcp-project", - ... history_data="my-dataset.nonexistent-table", - ... timestamp_col="sale_date", - ... data_col="daily_sales" - ... ) - { - "status": "ERROR", - "error_details": "Not found: Table - my-gcp-project:my-dataset.nonexistent-table was not found in - location US" - } - """ - model = "TimesFM 2.0" - confidence_level = 0.95 - trimmed_upper_history_data = history_data.strip().upper() - if trimmed_upper_history_data.startswith( - "SELECT" - ) or trimmed_upper_history_data.startswith("WITH"): - history_data_source = f"({history_data})" - else: - history_data_source = f"TABLE `{history_data}`" - - if id_cols: - if not all(isinstance(item, str) for item in id_cols): - return { - "status": "ERROR", - "error_details": "All elements in id_cols must be strings.", - } - id_cols_str = "[" + ", ".join([f"'{col}'" for col in id_cols]) + "]" - - query = f""" - SELECT * FROM AI.FORECAST( - {history_data_source}, - data_col => '{data_col}', - timestamp_col => '{timestamp_col}', - model => '{model}', - id_cols => {id_cols_str}, - horizon => {horizon}, - confidence_level => {confidence_level} - ) - """ - else: - query = f""" - SELECT * FROM AI.FORECAST( - {history_data_source}, - data_col => '{data_col}', - timestamp_col => '{timestamp_col}', - model => '{model}', - horizon => {horizon}, - confidence_level => {confidence_level} - ) - """ - return _execute_sql( - project_id=project_id, - query=query, - credentials=credentials, - settings=settings, - tool_context=tool_context, - caller_id="forecast", - ) - - -def analyze_contribution( - project_id: str, - input_data: str, - contribution_metric: str, - dimension_id_cols: list[str], - is_test_col: str, - credentials: Credentials, - settings: BigQueryToolConfig, - tool_context: ToolContext, - top_k_insights: int = 30, - pruning_method: str = "PRUNE_REDUNDANT_INSIGHTS", -) -> dict: - """Run a BigQuery ML contribution analysis using ML.CREATE_MODEL and ML.GET_INSIGHTS. - - Args: - project_id (str): The GCP project id in which the query should be - executed. - input_data (str): The data that contain the test and control data to - analyze. Can be a fully qualified BigQuery table ID or a SQL query. - dimension_id_cols (list[str]): The column names of the dimension columns. - contribution_metric (str): The name of the column that contains the metric - to analyze. Provides the expression to use to calculate the metric you - are analyzing. To calculate a summable metric, the expression must be in - the form SUM(metric_column_name), where metric_column_name is a numeric - data type. To calculate a summable ratio metric, the expression must be - in the form - SUM(numerator_metric_column_name)/SUM(denominator_metric_column_name), - where numerator_metric_column_name and denominator_metric_column_name - are numeric data types. To calculate a summable by category metric, the - expression must be in the form - SUM(metric_sum_column_name)/COUNT(DISTINCT categorical_column_name). The - summed column must be a numeric data type. The categorical column must - have type BOOL, DATE, DATETIME, TIME, TIMESTAMP, STRING, or INT64. - is_test_col (str): The name of the column to use to determine whether a - given row is test data or control data. The column must have a BOOL data - type. - credentials: The credentials to use for the request. - settings: The settings for the tool. - tool_context: The context for the tool. - top_k_insights (int, optional): The number of top insights to return, - ranked by apriori support. Defaults to 30. - pruning_method (str, optional): The method to use for pruning redundant - insights. Can be 'NO_PRUNING' or 'PRUNE_REDUNDANT_INSIGHTS'. Defaults to - "PRUNE_REDUNDANT_INSIGHTS". - - Returns: - dict: Dictionary representing the result of the contribution analysis. - - Examples: - Analyze the contribution of different dimensions to the total sales: - - >>> analyze_contribution( - ... project_id="my-gcp-project", - ... input_data="my-dataset.my-sales-table", - ... dimension_id_cols=["store_id", "product_category"], - ... contribution_metric="SUM(total_sales)", - ... is_test_col="is_test" - ... ) - The return is: - { - "status": "SUCCESS", - "rows": [ - { - "store_id": "S1", - "product_category": "Electronics", - "contributors": ["S1", "Electronics"], - "metric_test": 120, - "metric_control": 100, - "difference": 20, - "relative_difference": 0.2, - "unexpected_difference": 5, - "relative_unexpected_difference": 0.043, - "apriori_support": 0.15 - }, - ... - ] - } - - Analyze the contribution of different dimensions to the total sales using - a SQL query as input: - - >>> analyze_contribution( - ... project_id="my-gcp-project", - ... input_data="SELECT store_id, product_category, total_sales, " - ... "is_test FROM `my-project.my-dataset.my-sales-table` " - ... "WHERE transaction_date > '2025-01-01'" - ... dimension_id_cols=["store_id", "product_category"], - ... contribution_metric="SUM(total_sales)", - ... is_test_col="is_test" - ... ) - The return is: - { - "status": "SUCCESS", - "rows": [ - { - "store_id": "S2", - "product_category": "Groceries", - "contributors": ["S2", "Groceries"], - "metric_test": 250, - "metric_control": 200, - "difference": 50, - "relative_difference": 0.25, - "unexpected_difference": 10, - "relative_unexpected_difference": 0.041, - "apriori_support": 0.22 - }, - ... - ] - } - """ - if not all(isinstance(item, str) for item in dimension_id_cols): - return { - "status": "ERROR", - "error_details": "All elements in dimension_id_cols must be strings.", - } - - # Generate a unique temporary model name - model_name = ( - f"contribution_analysis_model_{str(uuid.uuid4()).replace('-', '_')}" - ) - - id_cols_str = "[" + ", ".join([f"'{col}'" for col in dimension_id_cols]) + "]" - options = [ - "MODEL_TYPE = 'CONTRIBUTION_ANALYSIS'", - f"CONTRIBUTION_METRIC = '{contribution_metric}'", - f"IS_TEST_COL = '{is_test_col}'", - f"DIMENSION_ID_COLS = {id_cols_str}", - ] - - options.append(f"TOP_K_INSIGHTS_BY_APRIORI_SUPPORT = {top_k_insights}") - - upper_pruning = pruning_method.upper() - if upper_pruning not in ["NO_PRUNING", "PRUNE_REDUNDANT_INSIGHTS"]: - return { - "status": "ERROR", - "error_details": f"Invalid pruning_method: {pruning_method}", - } - options.append(f"PRUNING_METHOD = '{upper_pruning}'") - - options_str = ", ".join(options) - - trimmed_upper_input_data = input_data.strip().upper() - if trimmed_upper_input_data.startswith( - "SELECT" - ) or trimmed_upper_input_data.startswith("WITH"): - input_data_source = f"({input_data})" - else: - input_data_source = f"SELECT * FROM `{input_data}`" - - create_model_query = f""" - CREATE TEMP MODEL {model_name} - OPTIONS ({options_str}) - AS {input_data_source} - """ - - get_insights_query = f""" - SELECT * FROM ML.GET_INSIGHTS(MODEL {model_name}) - """ - - # Create a session and run the create model query. - try: - execute_sql_settings = settings - if execute_sql_settings.write_mode == WriteMode.BLOCKED: - raise ValueError("analyze_contribution is not allowed in this session.") - elif execute_sql_settings.write_mode != WriteMode.PROTECTED: - # Running create temp model requires a session. So we set the write mode - # to PROTECTED to run the create model query and job query in the same - # session. - execute_sql_settings = settings.model_copy( - update={"write_mode": WriteMode.PROTECTED} - ) - - result = _execute_sql( - project_id=project_id, - query=create_model_query, - credentials=credentials, - settings=execute_sql_settings, - tool_context=tool_context, - caller_id="analyze_contribution", - ) - if result["status"] != "SUCCESS": - return result - - result = _execute_sql( - project_id=project_id, - query=get_insights_query, - credentials=credentials, - settings=execute_sql_settings, - tool_context=tool_context, - caller_id="analyze_contribution", - ) - except Exception as ex: # pylint: disable=broad-except - return { - "status": "ERROR", - "error_details": f"Error during analyze_contribution: {repr(ex)}", - } - - return result - - -def detect_anomalies( - project_id: str, - history_data: str, - times_series_timestamp_col: str, - times_series_data_col: str, - horizon: Optional[int] = 1000, - target_data: Optional[str] = None, - times_series_id_cols: Optional[list[str]] = None, - anomaly_prob_threshold: Optional[float] = 0.95, - *, - credentials: Credentials, - settings: BigQueryToolConfig, - tool_context: ToolContext, -) -> dict: - """Run a BigQuery time series ARIMA_PLUS model training and anomaly detection using CREATE MODEL and ML.DETECT_ANOMALIES clauses. - - Args: - project_id (str): The GCP project id in which the query should be - executed. - history_data (str): The table id of the BigQuery table containing the - history time series data or a query statement that select the history - data. - times_series_timestamp_col (str): The name of the column containing the - timestamp for each data point. - times_series_data_col (str): The name of the column containing the - numerical values to be forecasted and anomaly detected. - horizon (int, optional): The number of time steps to forecast into the - future. Defaults to 1000. - target_data (str, optional): The table id of the BigQuery table containing - the target time series data or a query statement that select the target - data. - times_series_id_cols (list, optional): The column names of the id columns - to indicate each time series when there are multiple time series in the - table. All elements must be strings. Defaults to None. - anomaly_prob_threshold (float, optional): The probability threshold to - determine if a data point is an anomaly. Defaults to 0.95. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - tool_context (ToolContext): The context for the tool. - - Returns: - dict: Dictionary representing the result of the anomaly detection. The - result contains the boolean value if the data point is anomaly or - not, lower bound, upper bound and anomaly probability for each data - point and also the probability of whether the data point is anomaly - or not. - - Examples: - Detect Anomalies daily sales based on historical data from a BigQuery - table: - - >>> detect_anomalies( - ... project_id="my-gcp-project", - ... history_data="my-dataset.my-sales-table", - ... times_series_timestamp_col="sale_date", - ... times_series_data_col="daily_sales" - ... ) - { - "status": "SUCCESS", - "rows": [ - { - "ts_timestamp": "2021-01-01 00:00:01 UTC", - "ts_data": 125.3, - "is_anomaly": TRUE, - "lower_bound": 129.5, - "upper_bound": 133.6 , - "anomaly_probability": 0.93 - }, - ... - ] - } - - Detect Anomalies on multiple time series using a SQL query as input: - - >>> history_query = ( - ... "SELECT unique_id, timestamp, value " - ... "FROM `my-project.my-dataset.my-timeseries-table` " - ... "WHERE timestamp > '1980-01-01'" - ... ) - >>> detect_anomalies( - ... project_id="my-gcp-project", - ... history_data=history_query, - ... times_series_timestamp_col="timestamp", - ... times_series_data_col="value", - ... times_series_id_cols=["unique_id"] - ... ) - { - "status": "SUCCESS", - "rows": [ - { - "unique_id": "T1", - "ts_timestamp": "2021-01-01 00:00:01 UTC", - "ts_data": 125.3, - "is_anomaly": TRUE, - "lower_bound": 129.5, - "upper_bound": 133.6 , - "anomaly_probability": 0.93 - }, - ... - ] - } - - Error Scenarios: - When an element in `times_series_id_cols` is not a string: - - >>> detect_anomalies( - ... project_id="my-gcp-project", - ... history_data="my-dataset.my-sales-table", - ... times_series_timestamp_col="sale_date", - ... times_series_data_col="daily_sales", - ... times_series_id_cols=["store_id", 123] - ... ) - { - "status": "ERROR", - "error_details": "All elements in times_series_id_cols must be - strings." - } - - When `history_data` refers to a table that does not exist: - - >>> detect_anomalies( - ... project_id="my-gcp-project", - ... history_data="my-dataset.nonexistent-table", - ... times_series_timestamp_col="sale_date", - ... times_series_data_col="daily_sales" - ... ) - { - "status": "ERROR", - "error_details": "Not found: Table - my-gcp-project:my-dataset.nonexistent-table was not found in - location US" - } - """ - trimmed_upper_history_data = history_data.strip().upper() - if trimmed_upper_history_data.startswith( - "SELECT" - ) or trimmed_upper_history_data.startswith("WITH"): - history_data_source = f"({history_data})" - else: - history_data_source = f"SELECT * FROM `{history_data}`" - - options = [ - "MODEL_TYPE = 'ARIMA_PLUS'", - f"TIME_SERIES_TIMESTAMP_COL = '{times_series_timestamp_col}'", - f"TIME_SERIES_DATA_COL = '{times_series_data_col}'", - f"HORIZON = {horizon}", - ] - - if times_series_id_cols: - if not all(isinstance(item, str) for item in times_series_id_cols): - return { - "status": "ERROR", - "error_details": ( - "All elements in times_series_id_cols must be strings." - ), - } - times_series_id_cols_str = ( - "[" + ", ".join([f"'{col}'" for col in times_series_id_cols]) + "]" - ) - options.append(f"TIME_SERIES_ID_COL = {times_series_id_cols_str}") - - options_str = ", ".join(options) - - model_name = f"detect_anomalies_model_{str(uuid.uuid4()).replace('-', '_')}" - - create_model_query = f""" - CREATE TEMP MODEL {model_name} - OPTIONS ({options_str}) - AS {history_data_source} - """ - order_by_id_cols = ( - ", ".join(col for col in times_series_id_cols) + ", " - if times_series_id_cols - else "" - ) - - anomaly_detection_query = f""" - SELECT * FROM ML.DETECT_ANOMALIES(MODEL {model_name}, STRUCT({anomaly_prob_threshold} AS anomaly_prob_threshold)) ORDER BY {order_by_id_cols}{times_series_timestamp_col} - """ - if target_data: - trimmed_upper_target_data = target_data.strip().upper() - if trimmed_upper_target_data.startswith( - "SELECT" - ) or trimmed_upper_target_data.startswith("WITH"): - target_data_source = f"({target_data})" - else: - target_data_source = f"(SELECT * FROM `{target_data}`)" - - anomaly_detection_query = f""" - SELECT * FROM ML.DETECT_ANOMALIES(MODEL {model_name}, STRUCT({anomaly_prob_threshold} AS anomaly_prob_threshold), {target_data_source}) ORDER BY {order_by_id_cols}{times_series_timestamp_col} - """ - - # Create a session and run the create model query. - try: - execute_sql_settings = settings - if execute_sql_settings.write_mode == WriteMode.BLOCKED: - raise ValueError("anomaly detection is not allowed in this session.") - elif execute_sql_settings.write_mode != WriteMode.PROTECTED: - # Running create temp model requires a session. So we set the write mode - # to PROTECTED to run the create model query and job query in the same - # session. - execute_sql_settings = settings.model_copy( - update={"write_mode": WriteMode.PROTECTED} - ) - - result = _execute_sql( - project_id=project_id, - query=create_model_query, - credentials=credentials, - settings=execute_sql_settings, - tool_context=tool_context, - caller_id="detect_anomalies", - ) - if result["status"] != "SUCCESS": - return result - - result = _execute_sql( - project_id=project_id, - query=anomaly_detection_query, - credentials=credentials, - settings=execute_sql_settings, - tool_context=tool_context, - caller_id="detect_anomalies", - ) - except Exception as ex: # pylint: disable=broad-except - return { - "status": "ERROR", - "error_details": f"Error during anomaly detection: {repr(ex)}", - } - - return result diff --git a/src/google/adk/integrations/bigquery/search_tool.py b/src/google/adk/integrations/bigquery/search_tool.py deleted file mode 100644 index 346947762e..0000000000 --- a/src/google/adk/integrations/bigquery/search_tool.py +++ /dev/null @@ -1,182 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import logging -from typing import Any - -from google.api_core import exceptions as api_exceptions -from google.auth.credentials import Credentials -from google.cloud import dataplex_v1 - -from . import client -from .config import BigQueryToolConfig - - -def _construct_search_query_helper( - predicate: str, operator: str, items: list[str] -) -> str: - """Constructs a search query part for a specific predicate and items.""" - if not items: - return "" - - clauses = [f'{predicate}{operator}"{item}"' for item in items] - return "(" + " OR ".join(clauses) + ")" if len(items) > 1 else clauses[0] - - -def search_catalog( - prompt: str, - project_id: str, - *, - credentials: Credentials, - settings: BigQueryToolConfig, - location: str | None = None, - page_size: int = 10, - project_ids_filter: list[str] | None = None, - dataset_ids_filter: list[str] | None = None, - types_filter: list[str] | None = None, -) -> dict[str, Any]: - """Finds BigQuery datasets and tables using natural language semantic search via Dataplex. - - Use this tool to discover BigQuery assets when you don't know the exact names. - It's ideal for searching based on topics, descriptions, or questions about the data. - - Args: - prompt: The base search query (natural language or keywords). - project_id: The Google Cloud project ID to scope the search. - credentials: Credentials for the request. - settings: BigQuery tool settings. - location: The Dataplex location to use. - page_size: Maximum number of results. - project_ids_filter: Specific project IDs to include in the search results. - If None, defaults to the scoping project_id. - dataset_ids_filter: BigQuery dataset IDs to filter by. - types_filter: Entry types to filter by (e.g., BigQueryEntryType.TABLE, - BigQueryEntryType.DATASET). - - Returns: - Search results or error. The "results" list contains items with: - - name: The Dataplex Entry name (e.g., - "projects/p/locations/l/entryGroups/g/entries/e"). - - linked_resource: The underlying BigQuery resource name (e.g., - "//bigquery.googleapis.com/projects/p/datasets/d/tables/t"). - - display_name, entry_type, description, location, update_time. - - Examples: - Search for tables related to customer data: - - >>> search_catalog( - ... prompt="Search for tables related to customer data", - ... project_id="my-project", - ... credentials=creds, - ... settings=settings - ... ) - { - "status": "SUCCESS", - "results": [ - { - "name": - "projects/my-project/locations/us/entryGroups/@bigquery/entries/entry-id", - "display_name": "customer_table", - "entry_type": - "projects/p/locations/l/entryTypes/bigquery-table", - "linked_resource": - "//bigquery.googleapis.com/projects/my-project/datasets/d/tables/customer_table", - "description": "Table containing customer details.", - "location": "us", - "update_time": "2024-01-01 12:00:00+00:00" - } - ] - } - """ - - try: - if not project_id: - return { - "status": "ERROR", - "error_details": "project_id must be provided.", - } - - with client.get_dataplex_catalog_client( - credentials=credentials, - user_agent=[settings.application_name, "search_catalog"], - ) as dataplex_client: - query_parts = [] - if prompt: - query_parts.append(f"({prompt})") - - # Filter by project IDs - projects_to_filter = ( - project_ids_filter if project_ids_filter else [project_id] - ) - if projects_to_filter: - query_parts.append( - _construct_search_query_helper("projectid", "=", projects_to_filter) - ) - - # Filter by dataset IDs - if dataset_ids_filter: - dataset_resource_filters = [] - for pid in projects_to_filter: - for did in dataset_ids_filter: - dataset_resource_filters.append( - f'linked_resource:"//bigquery.googleapis.com/projects/{pid}/datasets/{did}/*"' - ) - if dataset_resource_filters: - query_parts.append(f"({' OR '.join(dataset_resource_filters)})") - # Filter by entry types - if types_filter: - query_parts.append( - _construct_search_query_helper("type", "=", types_filter) - ) - - # Always scope to BigQuery system - query_parts.append("system=BIGQUERY") - - full_query = " AND ".join(filter(None, query_parts)) - - search_location = location or settings.location or "global" - search_scope = f"projects/{project_id}/locations/{search_location}" - - request = dataplex_v1.SearchEntriesRequest( - name=search_scope, - query=full_query, - page_size=page_size, - semantic_search=True, - ) - - response = dataplex_client.search_entries(request=request) - - results = [] - for result in response.results: - entry = result.dataplex_entry - source = entry.entry_source - results.append({ - "name": entry.name, - "display_name": source.display_name or "", - "entry_type": entry.entry_type, - "update_time": str(entry.update_time), - "linked_resource": source.resource or "", - "description": source.description or "", - "location": source.location or "", - }) - return {"status": "SUCCESS", "results": results} - - except api_exceptions.GoogleAPICallError as e: - logging.exception("search_catalog tool: API call failed") - return {"status": "ERROR", "error_details": f"Dataplex API Error: {e}"} - except Exception as e: - logging.exception("search_catalog tool: Unexpected error") - return {"status": "ERROR", "error_details": repr(e)} diff --git a/src/google/adk/integrations/crewai/__init__.py b/src/google/adk/integrations/crewai/__init__.py index e0d95e1609..a463c453df 100644 --- a/src/google/adk/integrations/crewai/__init__.py +++ b/src/google/adk/integrations/crewai/__init__.py @@ -1,5 +1,3 @@ -# Copyright 2026 Google LLC -# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at diff --git a/src/google/adk/integrations/firestore/firestore_session_service.py b/src/google/adk/integrations/firestore/firestore_session_service.py index e90753be5c..83b97c33c2 100644 --- a/src/google/adk/integrations/firestore/firestore_session_service.py +++ b/src/google/adk/integrations/firestore/firestore_session_service.py @@ -551,7 +551,6 @@ async def _append_txn(transaction: firestore.AsyncTransaction) -> int: for k, v in session.state.items() if not k.startswith(State.APP_PREFIX) and not k.startswith(State.USER_PREFIX) - and not k.startswith(State.TEMP_PREFIX) } transaction.update( session_ref, diff --git a/src/google/adk/integrations/langchain/__init__.py b/src/google/adk/integrations/langchain/__init__.py index d0e35ee3b4..985e49f82a 100644 --- a/src/google/adk/integrations/langchain/__init__.py +++ b/src/google/adk/integrations/langchain/__init__.py @@ -1,5 +1,3 @@ -# Copyright 2026 Google LLC -# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at diff --git a/src/google/adk/integrations/slack/slack_runner.py b/src/google/adk/integrations/slack/slack_runner.py index 66a6033789..d8449a1a4f 100644 --- a/src/google/adk/integrations/slack/slack_runner.py +++ b/src/google/adk/integrations/slack/slack_runner.py @@ -19,15 +19,15 @@ from google.adk.runners import Runner from google.genai import types +from slack_bolt.adapter.socket_mode.aiohttp import AsyncSocketModeHandler try: - from slack_bolt.adapter.socket_mode.aiohttp import AsyncSocketModeHandler from slack_bolt.app.async_app import AsyncApp -except ImportError as e: +except ImportError: raise ImportError( "slack_bolt is not installed. Please install it with " '`pip install "google-adk[slack]"`.' - ) from e + ) logger = logging.getLogger("google_adk." + __name__) diff --git a/src/google/adk/integrations/vmaas/sandbox_computer.py b/src/google/adk/integrations/vmaas/sandbox_computer.py index 9c1c9d68d7..1dd38e0ac7 100644 --- a/src/google/adk/integrations/vmaas/sandbox_computer.py +++ b/src/google/adk/integrations/vmaas/sandbox_computer.py @@ -90,8 +90,6 @@ def __init__( location: str = "us-central1", service_account_email: str | None = None, sandbox_name: str | None = None, - sandbox_template_name: str | None = None, - sandbox_snapshot_name: str | None = None, sandbox_ttl_seconds: int = 3600, search_engine_url: str = "https://www.google.com", vertexai_client: "vertexai.Client | None" = None, @@ -99,36 +97,25 @@ def __init__( """Initialize the sandbox computer. Args: - project_id: GCP project ID. If None, uses Application Default Credentials - project. + project_id: GCP project ID. If None, uses Application Default + Credentials project. location: Vertex AI location (default: us-central1). - service_account_email: Service account email for token generation. Must - have roles/iam.serviceAccountTokenCreator permission. If None, attempts - to use ADC service account. - sandbox_name: Existing sandbox resource name (BYOS mode). If provided, the - agent engine name is extracted from it. If None, creates new agent - engine and sandbox on demand. - Format: - projects/{project}/locations/{location}/reasoningEngines/{id}/sandboxEnvironments/{id} - sandbox_template_name: Sandbox template resource name to use for creating - new sandboxes. Templates allow faster creation and custom environments. - Format: - projects/{project}/locations/{location}/sandboxEnvironmentTemplates/{id} - sandbox_snapshot_name: Sandbox snapshot resource name to use for restoring - sandbox state, enabling faster startup. - Format: - projects/{project}/locations/{location}/reasoningEngines/{id}/sandboxEnvironmentSnapshots/{id} + service_account_email: Service account email for token generation. + Must have roles/iam.serviceAccountTokenCreator permission. + If None, attempts to use ADC service account. + sandbox_name: Existing sandbox resource name (BYOS mode). If provided, + the agent engine name is extracted from it. If None, creates new + agent engine and sandbox on demand. + Format: projects/{project}/locations/{location}/reasoningEngines/{id}/sandboxEnvironments/{id} sandbox_ttl_seconds: TTL for auto-created sandboxes (default: 1 hour). search_engine_url: URL to navigate to for search() method. - vertexai_client: Optional Vertex AI client instance. If None, creates one - lazily using project_id and location. + vertexai_client: Optional Vertex AI client instance. If None, creates + one lazily using project_id and location. """ self._project_id = project_id self._location = location self._service_account_email = service_account_email self._sandbox_name = sandbox_name - self._sandbox_template_name = sandbox_template_name - self._sandbox_snapshot_name = sandbox_snapshot_name self._sandbox_ttl_seconds = sandbox_ttl_seconds self._search_engine_url = search_engine_url self._screen_size = (1280, 720) @@ -223,29 +210,13 @@ async def _get_sandbox(self) -> tuple[str, Any]: from vertexai import types - config = { - "display_name": "adk_computer_use_sandbox", - } - spec = None - if self._sandbox_template_name: - config["sandbox_environment_template"] = self._sandbox_template_name - logger.info( - "Creating sandbox from template: %s", self._sandbox_template_name - ) - elif self._sandbox_snapshot_name: - config["sandbox_environment_snapshot"] = self._sandbox_snapshot_name - logger.info( - "Creating sandbox from snapshot: %s", self._sandbox_snapshot_name - ) - else: - spec = {"computer_use_environment": {}} - logger.info("Creating sandbox with computer use environment spec") - operation = await asyncio.to_thread( client.agent_engines.sandboxes.create, - spec=spec, + spec={"computer_use_environment": {}}, name=agent_engine_name, - config=config, + config=types.CreateAgentEngineSandboxConfig( + display_name="adk_computer_use_sandbox" + ), ) sandbox_name = operation.response.name @@ -278,6 +249,7 @@ async def _get_access_token(self, sandbox_name: str) -> str: token = await asyncio.to_thread( client.agent_engines.sandboxes.generate_access_token, service_account_email=self._service_account_email, + sandbox_id=sandbox_name, timeout=_DEFAULT_TOKEN_TIMEOUT, ) diff --git a/src/google/adk/labs/README.md b/src/google/adk/labs/README.md deleted file mode 100644 index 4058a38eb9..0000000000 --- a/src/google/adk/labs/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# ADK Labs - -This folder contains experimental features and integrations for the Agent Development Kit (ADK). - -> [!WARNING] -> All code in this folder is **experimental** and subject to change or deletion at any time without notice. Do not rely on these features for production use. diff --git a/src/google/adk/labs/__init__.py b/src/google/adk/labs/__init__.py deleted file mode 100644 index 11ac63609b..0000000000 --- a/src/google/adk/labs/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""ADK Labs.""" diff --git a/src/google/adk/labs/openai/README.md b/src/google/adk/labs/openai/README.md deleted file mode 100644 index c40bedb830..0000000000 --- a/src/google/adk/labs/openai/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# OpenAI Integration (Experimental) - -This folder contains an experimental integration for OpenAI models in ADK. - -## Usage in Code - -To use the OpenAI integration in your Python code, instantiate `OpenAILlm` and assign it to your agent's `model` field: - -```python -from google.adk.agents.llm_agent import LlmAgent -from google.adk.labs.openai import OpenAILlm - -# Create the OpenAI model instance -openai_model = OpenAILlm(model="gpt-4o") - -# Create an agent and assign the model -agent = LlmAgent( - name="my_openai_agent", - model=openai_model, - instruction="You are a helpful assistant.", -) -``` - -Requires the `openai` Python package and `OPENAI_API_KEY` environment variable. diff --git a/src/google/adk/labs/openai/__init__.py b/src/google/adk/labs/openai/__init__.py deleted file mode 100644 index c98481ebfb..0000000000 --- a/src/google/adk/labs/openai/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ._openai_llm import OpenAILlm - -__all__ = [ - 'OpenAILlm', -] diff --git a/src/google/adk/labs/openai/_openai_llm.py b/src/google/adk/labs/openai/_openai_llm.py deleted file mode 100644 index 3eaec74011..0000000000 --- a/src/google/adk/labs/openai/_openai_llm.py +++ /dev/null @@ -1,511 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""OpenAI integration for GPT models.""" - -from __future__ import annotations - -import copy -from functools import cached_property -import json -import logging -import os -from typing import Any -from typing import AsyncGenerator -from typing import Iterable -from typing import Literal -from typing import Union - -from google.genai import types - -try: - from openai import AsyncOpenAI - from openai.types.chat import ChatCompletion - from openai.types.chat import ChatCompletionChunk - from openai.types.chat import ChatCompletionContentPartImageParam - from openai.types.chat import ChatCompletionMessage - from openai.types.chat import ChatCompletionMessageParam - from openai.types.chat import ChatCompletionToolParam -except ImportError as e: - raise ImportError( - "The 'openai' package is not installed. Please install it with " - "`pip install openai` to use the OpenAILlm." - ) from e - -from pydantic import BaseModel -from typing_extensions import override - -from ...models.base_llm import BaseLlm -from ...models.llm_request import LlmRequest -from ...models.llm_response import LlmResponse - -logger = logging.getLogger("google_adk." + __name__) - -__all__ = ["OpenAILlm"] - - -def _to_openai_role( - role: str | None, -) -> Literal["system", "user", "assistant", "tool"]: - if role in ["model", "assistant"]: - return "assistant" - if role == "system": - return "system" - if role == "tool": - return "tool" - return "user" - - -def _part_to_openai_content( - part: types.Part, -) -> str | ChatCompletionContentPartImageParam: - """Converts a genai Part to OpenAI content.""" - if part.thought and part.text: - return f"Thought: {part.text}" - if part.text: - return part.text - - if part.inline_data: - import base64 - - mime_type = part.inline_data.mime_type - data = part.inline_data.data - if isinstance(data, bytes): - encoded = base64.b64encode(data).decode("utf-8") - else: - encoded = str(data) - return { - "type": "image_url", - "image_url": {"url": f"data:{mime_type};base64,{encoded}"}, - } - - if part.file_data: - if part.file_data.file_uri and part.file_data.file_uri.startswith("http"): - return { - "type": "image_url", - "image_url": {"url": part.file_data.file_uri}, - } - - return "" - - -def _content_to_openai_messages( - content: types.Content, -) -> list[ChatCompletionMessageParam]: - """Converts a types.Content to a list of OpenAI messages.""" - messages = [] - role = _to_openai_role(content.role) - - tool_calls = [] - content_parts = [] - - for part in content.parts or []: - if part.function_call: - tool_calls.append({ - "id": part.function_call.id or "", - "type": "function", - "function": { - "name": part.function_call.name, - "arguments": ( - json.dumps(part.function_call.args) - if part.function_call.args - else "{}" - ), - }, - }) - elif part.function_response: - messages.append({ - "role": "tool", - "tool_call_id": part.function_response.id or "", - "content": ( - json.dumps(part.function_response.response) - if part.function_response.response is not None - else "" - ), - }) - else: - content_parts.append(_part_to_openai_content(part)) - - processed_parts = [] - for c in content_parts: - if isinstance(c, str) and c: - processed_parts.append({"type": "text", "text": c}) - elif isinstance(c, dict): - processed_parts.append(c) - - has_images = any(p.get("type") == "image_url" for p in processed_parts) - - if not has_images: - content_val = "\n".join( - [p["text"] for p in processed_parts if p["type"] == "text"] - ) - else: - content_val = processed_parts - - if role == "assistant" and (content_val or tool_calls): - msg = {"role": "assistant"} - if content_val: - msg["content"] = content_val - if tool_calls: - msg["tool_calls"] = tool_calls - messages.append(msg) - elif role == "user" and content_val: - messages.append({ - "role": "user", - "content": content_val, - }) - elif role == "system" and content_val: - if isinstance(content_val, list): - text_only = "\n".join( - [p["text"] for p in content_val if p["type"] == "text"] - ) - messages.append({ - "role": "system", - "content": text_only, - }) - else: - messages.append({ - "role": "system", - "content": content_val, - }) - - return messages - - -def _enforce_strict_openai_schema(schema: dict[str, Any]) -> None: - """Recursively transforms a JSON schema for OpenAI strict structured outputs.""" - if not isinstance(schema, dict): - return - if "$ref" in schema: - for key in list(schema.keys()): - if key != "$ref": - del schema[key] - return - if schema.get("type") == "object" and "properties" in schema: - schema["additionalProperties"] = False - schema["required"] = sorted(schema["properties"].keys()) - for defn in schema.get("$defs", {}).values(): - _enforce_strict_openai_schema(defn) - for prop in schema.get("properties", {}).values(): - _enforce_strict_openai_schema(prop) - for key in ("anyOf", "oneOf", "allOf"): - for item in schema.get(key, []): - _enforce_strict_openai_schema(item) - if "items" in schema and isinstance(schema["items"], dict): - _enforce_strict_openai_schema(schema["items"]) - - -def _update_type_string(value: Any): - """Lowercases nested JSON schema type strings for OpenAI compatibility.""" - if isinstance(value, list): - for item in value: - _update_type_string(item) - return - - if not isinstance(value, dict): - return - - schema_type = value.get("type") - if isinstance(schema_type, str): - value["type"] = schema_type.lower() - - for dict_key in ( - "$defs", - "defs", - "dependentSchemas", - "patternProperties", - "properties", - ): - child_dict = value.get(dict_key) - if isinstance(child_dict, dict): - for child_value in child_dict.values(): - _update_type_string(child_value) - - for single_key in ( - "additionalProperties", - "additional_properties", - "contains", - "else", - "if", - "items", - "not", - "propertyNames", - "then", - "unevaluatedProperties", - ): - child_value = value.get(single_key) - if isinstance(child_value, (dict, list)): - _update_type_string(child_value) - - for list_key in ( - "allOf", - "all_of", - "anyOf", - "any_of", - "oneOf", - "one_of", - "prefixItems", - ): - child_list = value.get(list_key) - if isinstance(child_list, list): - _update_type_string(child_list) - - -def _function_declaration_to_openai_tool( - function_declaration: types.FunctionDeclaration, -) -> ChatCompletionToolParam: - """Converts a function declaration to an OpenAI tool param.""" - if not function_declaration.name: - raise ValueError("FunctionDeclaration must have a name.") - - # Use parameters_json_schema if available, otherwise convert from parameters - if function_declaration.parameters_json_schema: - parameters = copy.deepcopy(function_declaration.parameters_json_schema) - _update_type_string(parameters) - else: - properties = {} - required_params = [] - if function_declaration.parameters: - if function_declaration.parameters.properties: - for key, value in function_declaration.parameters.properties.items(): - properties[key] = value.model_dump(by_alias=True, exclude_none=True) - if function_declaration.parameters.required: - required_params = function_declaration.parameters.required - - parameters = { - "type": "object", - "properties": properties, - } - if required_params: - parameters["required"] = required_params - _update_type_string(parameters) - - return { - "type": "function", - "function": { - "name": function_declaration.name, - "description": function_declaration.description or "", - "parameters": parameters, - }, - } - - -def _response_to_llm_response(response: ChatCompletion) -> LlmResponse: - """Parses an OpenAI response into an LlmResponse.""" - choice = response.choices[0] - message = choice.message - - parts = [] - if message.content: - parts.append(types.Part.from_text(text=message.content)) - - if message.tool_calls: - for tool_call in message.tool_calls: - args = {} - if tool_call.function.arguments: - try: - args = json.loads(tool_call.function.arguments) - except json.JSONDecodeError: - logger.warning("Failed to parse tool call arguments as JSON.") - - part = types.Part.from_function_call( - name=tool_call.function.name, args=args - ) - part.function_call.id = tool_call.id - parts.append(part) - - return LlmResponse( - content=types.Content( - role="model", - parts=parts, - ), - usage_metadata=types.GenerateContentResponseUsageMetadata( - prompt_token_count=response.usage.prompt_tokens, - candidates_token_count=response.usage.completion_tokens, - total_token_count=response.usage.total_tokens, - ), - ) - - -class OpenAILlm(BaseLlm): - """Integration with OpenAI models. - - Attributes: - model: The name of the OpenAI model. - max_tokens: The maximum number of tokens to generate. - """ - - model: str = "gpt-4o" - max_tokens: int = 4096 - - @classmethod - @override - def supported_models(cls) -> list[str]: - return [r"gpt-.*", r"o1-.*", r"o3-.*"] - - @override - async def generate_content_async( - self, llm_request: LlmRequest, stream: bool = False - ) -> AsyncGenerator[LlmResponse, None]: - messages = [] - if llm_request.config and llm_request.config.system_instruction: - messages.append({ - "role": "system", - "content": llm_request.config.system_instruction, - }) - - for content in llm_request.contents or []: - messages.extend(_content_to_openai_messages(content)) - - tools = [] - if ( - llm_request.config - and llm_request.config.tools - and llm_request.config.tools[0].function_declarations - ): - tools = [ - _function_declaration_to_openai_tool(tool) - for tool in llm_request.config.tools[0].function_declarations - ] - - tool_choice = "auto" if tools else None - - response_format = None - if llm_request.config and llm_request.config.response_schema: - schema = llm_request.config.response_schema - schema_name = "response" - schema_dict = {} - - if isinstance(schema, type) and issubclass(schema, BaseModel): - schema_dict = schema.model_json_schema() - schema_name = schema.__name__ - elif isinstance(schema, BaseModel): - schema_dict = schema.__class__.model_json_schema() - schema_name = schema.__class__.__name__ - elif isinstance(schema, dict): - schema_dict = copy.deepcopy(schema) - if "title" in schema_dict: - schema_name = str(schema_dict["title"]) - - if schema_dict: - _enforce_strict_openai_schema(schema_dict) - response_format = { - "type": "json_schema", - "json_schema": { - "name": schema_name, - "strict": True, - "schema": schema_dict, - }, - } - elif ( - llm_request.config - and llm_request.config.response_mime_type == "application/json" - ): - response_format = {"type": "json_object"} - - kwargs = { - "model": self.model, - "messages": messages, - "tools": tools if tools else None, - "tool_choice": tool_choice, - "max_tokens": self.max_tokens, - "response_format": response_format, - } - - if llm_request.config: - if getattr(llm_request.config, "temperature", None) is not None: - kwargs["temperature"] = llm_request.config.temperature - if getattr(llm_request.config, "top_p", None) is not None: - kwargs["top_p"] = llm_request.config.top_p - if getattr(llm_request.config, "stop_sequences", None): - kwargs["stop"] = llm_request.config.stop_sequences - if getattr(llm_request.config, "max_output_tokens", None) is not None: - kwargs["max_tokens"] = llm_request.config.max_output_tokens - - if not stream: - response = await self._openai_client.chat.completions.create(**kwargs) - yield _response_to_llm_response(response) - else: - async for response in self._generate_content_streaming(kwargs): - yield response - - async def _generate_content_streaming( - self, - kwargs: dict[str, Any], - ) -> AsyncGenerator[LlmResponse, None]: - """Handles streaming responses from OpenAI models.""" - kwargs["stream"] = True - raw_stream = await self._openai_client.chat.completions.create(**kwargs) - - text_accumulated = "" - tool_calls_accumulated: dict[int, dict[str, Any]] = {} - - async for chunk in raw_stream: - if not chunk.choices: - continue - choice = chunk.choices[0] - delta = choice.delta - - if delta.content: - text_accumulated += delta.content - yield LlmResponse( - content=types.Content( - role="model", - parts=[types.Part.from_text(text=delta.content)], - ), - partial=True, - ) - - if delta.tool_calls: - for tc_delta in delta.tool_calls: - index = tc_delta.index - if index not in tool_calls_accumulated: - tool_calls_accumulated[index] = { - "id": tc_delta.id, - "name": tc_delta.function.name, - "arguments": "", - } - if tc_delta.function.arguments: - tool_calls_accumulated[index][ - "arguments" - ] += tc_delta.function.arguments - - # Yield final response with all accumulated content - parts = [] - if text_accumulated: - parts.append(types.Part.from_text(text=text_accumulated)) - - for index in sorted(tool_calls_accumulated.keys()): - acc = tool_calls_accumulated[index] - args = {} - if acc["arguments"]: - try: - args = json.loads(acc["arguments"]) - except json.JSONDecodeError: - logger.warning( - "Failed to parse accumulated tool call arguments as JSON." - ) - - part = types.Part.from_function_call(name=acc["name"], args=args) - part.function_call.id = acc["id"] - parts.append(part) - - yield LlmResponse( - content=types.Content(role="model", parts=parts), - partial=False, - ) - - @cached_property - def _openai_client(self) -> AsyncOpenAI: - return AsyncOpenAI() diff --git a/src/google/adk/memory/__init__.py b/src/google/adk/memory/__init__.py index 1361b34e36..d40f3bf7d9 100644 --- a/src/google/adk/memory/__init__.py +++ b/src/google/adk/memory/__init__.py @@ -17,7 +17,6 @@ import importlib from typing import TYPE_CHECKING -from ..utils._dependency import missing_extra from .base_memory_service import BaseMemoryService if TYPE_CHECKING: diff --git a/src/google/adk/memory/vertex_ai_memory_bank_service.py b/src/google/adk/memory/vertex_ai_memory_bank_service.py index c5ef2936b8..0906e9a6ba 100644 --- a/src/google/adk/memory/vertex_ai_memory_bank_service.py +++ b/src/google/adk/memory/vertex_ai_memory_bank_service.py @@ -203,13 +203,6 @@ def __init__( 'agent_engine_id is required for VertexAiMemoryBankService.' ) - try: - import vertexai - except ImportError as e: - from ..utils._dependency import missing_extra - - raise missing_extra('google-cloud-aiplatform', 'gcp') from e - self._project = project self._location = location self._agent_engine_id = agent_engine_id diff --git a/src/google/adk/memory/vertex_ai_rag_memory_service.py b/src/google/adk/memory/vertex_ai_rag_memory_service.py index 697c7f07ed..fb81508ddd 100644 --- a/src/google/adk/memory/vertex_ai_rag_memory_service.py +++ b/src/google/adk/memory/vertex_ai_rag_memory_service.py @@ -108,13 +108,6 @@ def __init__( vector_distance_threshold: Only returns contexts with vector distance smaller than the threshold. """ - try: - import vertexai - except ImportError as e: - from ..utils._dependency import missing_extra - - raise missing_extra("google-cloud-aiplatform", "gcp") from e - self._vertex_rag_store = types.VertexRagStore( rag_resources=[ types.VertexRagStoreRagResource(rag_corpus=rag_corpus), diff --git a/src/google/adk/models/__init__.py b/src/google/adk/models/__init__.py index 0178cefb2d..1f42993c88 100644 --- a/src/google/adk/models/__init__.py +++ b/src/google/adk/models/__init__.py @@ -25,8 +25,6 @@ from .registry import LLMRegistry if TYPE_CHECKING: - from google.adk.labs.openai import OpenAILlm - from .anthropic_llm import Claude from .apigee_llm import ApigeeLlm from .gemma_llm import Gemma @@ -59,10 +57,6 @@ 'ApigeeLlm': ([r'.*-apigee$'], 'apigee_llm'), 'Claude': ([r'claude-3-.*', r'claude-.*-4.*'], 'anthropic_llm'), 'Gemma3Ollama': ([r'ollama/gemma3.*'], 'gemma_llm'), - 'OpenAILlm': ( - [r'gpt-.*', r'o1-.*', r'o3-.*'], - 'google.adk.labs.openai', - ), 'LiteLlm': ( [ r'openai/.*', @@ -87,20 +81,14 @@ } for _name, (_patterns, _module) in _LAZY_PROVIDERS.items(): - _target_module = ( - _module if _module.startswith('google.adk.') else f'{__name__}.{_module}' - ) - LLMRegistry._register_lazy(_patterns, _target_module, _name) + LLMRegistry._register_lazy(_patterns, f'{__name__}.{_module}', _name) def __getattr__(name: str): if name in _LAZY_PROVIDERS: module_name = _LAZY_PROVIDERS[name][1] try: - if module_name.startswith('google.adk.'): - module = importlib.import_module(module_name) - else: - module = importlib.import_module(f'{__name__}.{module_name}') + module = importlib.import_module(f'{__name__}.{module_name}') except ImportError as e: raise ImportError( f'`{name}` requires an optional dependency that is not installed.' diff --git a/src/google/adk/models/gemini_llm_connection.py b/src/google/adk/models/gemini_llm_connection.py index e832c18de3..11ed8386e1 100644 --- a/src/google/adk/models/gemini_llm_connection.py +++ b/src/google/adk/models/gemini_llm_connection.py @@ -50,9 +50,6 @@ def __init__( self._output_transcription_text: str = '' self._api_backend = api_backend self._model_version = model_version - self._is_gemini_3_1_flash_live = model_name_utils.is_gemini_3_1_flash_live( - model_version - ) async def send_history(self, history: list[types.Content]): """Sends the conversation history to the gemini model. @@ -83,33 +80,10 @@ async def send_history(self, history: list[types.Content]): ] if contents: - # Gemini Enterprise Agent Platform does not support history_config in the - # SDK. To initialize a live session with prior history without hitting a - # 1007 protocol error (invalid role mid-session), we consolidate previous - # multi-turn interactions into a unified contextual preamble on a single - # user role turn. - if ( - self._is_gemini_3_1_flash_live - and self._api_backend != GoogleLLMVariant.GEMINI_API - ): - collapsed_text = 'Previous conversation history:\n' - for c in contents: - text_parts = ''.join(p.text for p in c.parts if p.text) - collapsed_text += f'[{c.role}]: {text_parts}\n' - contents = [ - types.Content( - role='user', parts=[types.Part.from_text(text=collapsed_text)] - ) - ] - logger.debug('Sending history to live connection: %s', contents) await self._gemini_session.send_client_content( turns=contents, - turn_complete=( - True - if self._is_gemini_3_1_flash_live - else contents[-1].role == 'user' - ), + turn_complete=contents[-1].role == 'user', ) else: logger.info('no content is sent') @@ -134,11 +108,10 @@ async def send_content(self, content: types.Content): ) else: logger.debug('Sending LLM new content %s', content) - if ( - self._is_gemini_3_1_flash_live - and len(content.parts) == 1 - and content.parts[0].text - ): + is_gemini_31 = model_name_utils.is_gemini_3_1_flash_live( + self._model_version + ) + if is_gemini_31 and len(content.parts) == 1 and content.parts[0].text: logger.debug('Using send_realtime_input for Gemini 3.1 text input') await self._gemini_session.send_realtime_input( text=content.parts[0].text @@ -160,7 +133,10 @@ async def send_realtime(self, input: RealtimeInput): if isinstance(input, types.Blob): # The blob is binary and is very large. So let's not log it. logger.debug('Sending LLM Blob.') - if self._is_gemini_3_1_flash_live: + is_gemini_31 = model_name_utils.is_gemini_3_1_flash_live( + self._model_version + ) + if is_gemini_31: if input.mime_type and input.mime_type.startswith('audio/'): await self._gemini_session.send_realtime_input(audio=input) elif input.mime_type and input.mime_type.startswith('image/'): @@ -183,12 +159,7 @@ async def send_realtime(self, input: RealtimeInput): else: raise ValueError('Unsupported input type: %s' % type(input)) - def __build_full_text_response( - self, - text: str, - is_thought: bool = False, - grounding_metadata: types.GroundingMetadata | None = None, - ): + def __build_full_text_response(self, text: str): """Builds a full text response. The text should not be partial and the returned LlmResponse is not @@ -196,24 +167,15 @@ def __build_full_text_response( Args: text: The text to be included in the response. - is_thought: Whether the text is a thought. - grounding_metadata: The grounding metadata to include. Returns: An LlmResponse containing the full text. """ - part = types.Part.from_text(text=text) - if is_thought: - part.thought = True - if grounding_metadata is None and self._is_gemini_3_1_flash_live: - grounding_metadata = types.GroundingMetadata() return LlmResponse( content=types.Content( role='model', - parts=[part], + parts=[types.Part.from_text(text=text)], ), - grounding_metadata=grounding_metadata, - partial=False, live_session_id=self._gemini_session.session_id, ) @@ -225,9 +187,7 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: """ text = '' - is_thought = False tool_call_parts = [] - pending_grounding_metadata = None async with Aclosing(self._gemini_session.receive()) as agen: # TODO(b/440101573): Reuse StreamingResponseAggregator to accumulate # partial content and emit responses as needed. @@ -243,10 +203,6 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: ) if message.server_content: content = message.server_content.model_turn - if message.server_content.grounding_metadata: - pending_grounding_metadata = ( - message.server_content.grounding_metadata - ) # Standalone grounding_metadata event (when content is empty) if ( @@ -259,9 +215,6 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: interrupted=message.server_content.interrupted, model_version=self._model_version, live_session_id=live_session_id, - turn_complete_reason=getattr( - message.server_content, 'turn_complete_reason', None - ), ) if content and content.parts: @@ -270,34 +223,20 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: interrupted=message.server_content.interrupted, model_version=self._model_version, live_session_id=live_session_id, - turn_complete_reason=getattr( - message.server_content, 'turn_complete_reason', None - ), ) # grounding_metadata is yielded again at turn_complete, # so avoid duplicating it here if turn_complete is true. if not message.server_content.turn_complete: - if message.server_content.grounding_metadata is not None: - llm_response.grounding_metadata = ( - message.server_content.grounding_metadata - ) - elif self._is_gemini_3_1_flash_live: - llm_response.grounding_metadata = types.GroundingMetadata() + llm_response.grounding_metadata = ( + message.server_content.grounding_metadata + ) if content.parts[0].text: - current_is_thought = getattr(content.parts[0], 'thought', False) - if text and current_is_thought != is_thought: - yield self.__build_full_text_response(text, is_thought) - text = '' - is_thought = False - text += content.parts[0].text - is_thought = current_is_thought llm_response.partial = True # don't yield the merged text event when receiving audio data elif text and not content.parts[0].inline_data: - yield self.__build_full_text_response(text, is_thought) + yield self.__build_full_text_response(text) text = '' - is_thought = False yield llm_response # Note: in some cases, tool_call may arrive before # generation_complete, causing transcription to appear after @@ -354,10 +293,10 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: live_session_id=live_session_id, ) self._output_transcription_text = '' - # The Gemini API or Vertex AI might not send a transcription finished signal. + # The Gemini API might not send a transcription finished signal. # Instead, we rely on generation_complete, turn_complete or # interrupted signals to flush any pending transcriptions. - if ( + if self._api_backend == GoogleLLMVariant.GEMINI_API and ( message.server_content.interrupted or message.server_content.turn_complete or message.server_content.generation_complete @@ -385,14 +324,9 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: ) self._output_transcription_text = '' if message.server_content.turn_complete: - g_metadata_to_yield = pending_grounding_metadata if text: - yield self.__build_full_text_response( - text, is_thought, g_metadata_to_yield - ) + yield self.__build_full_text_response(text) text = '' - is_thought = False - g_metadata_to_yield = None if tool_call_parts: logger.debug('Returning aggregated tool_call_parts') yield LlmResponse( @@ -404,18 +338,9 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: yield LlmResponse( turn_complete=True, interrupted=message.server_content.interrupted, - grounding_metadata=message.server_content.grounding_metadata - or g_metadata_to_yield - or ( - types.GroundingMetadata() - if self._is_gemini_3_1_flash_live - else None - ), + grounding_metadata=message.server_content.grounding_metadata, model_version=self._model_version, live_session_id=live_session_id, - turn_complete_reason=getattr( - message.server_content, 'turn_complete_reason', None - ), ) break # in case of empty content or parts, we still surface it @@ -424,9 +349,8 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: # safety threshold is triggered if message.server_content.interrupted: if text: - yield self.__build_full_text_response(text, is_thought) + yield self.__build_full_text_response(text) text = '' - is_thought = False else: yield LlmResponse( interrupted=message.server_content.interrupted, @@ -436,9 +360,8 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: if message.tool_call: logger.debug('Received tool call: %s', message.tool_call) if text: - yield self.__build_full_text_response(text, is_thought) + yield self.__build_full_text_response(text) text = '' - is_thought = False tool_call_parts.extend([ types.Part(function_call=function_call) for function_call in message.tool_call.function_calls @@ -448,7 +371,10 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: # deadlocking the conversation. Other models (e.g. 2.5-pro, # native-audio) send turn_complete after tool calls, so buffer # and merge them into a single response at turn_complete. - if self._is_gemini_3_1_flash_live and tool_call_parts: + if ( + model_name_utils.is_gemini_3_1_flash_live(self._model_version) + and tool_call_parts + ): logger.debug( 'Yielding tool_call_parts immediately for Gemini 3.1 live tool' ' call' @@ -457,7 +383,6 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: content=types.Content(role='model', parts=tool_call_parts), model_version=self._model_version, live_session_id=live_session_id, - grounding_metadata=types.GroundingMetadata(), ) tool_call_parts = [] if message.session_resumption_update: diff --git a/src/google/adk/models/interactions_utils.py b/src/google/adk/models/interactions_utils.py index bc782aeb93..89ffe6be71 100644 --- a/src/google/adk/models/interactions_utils.py +++ b/src/google/adk/models/interactions_utils.py @@ -31,54 +31,25 @@ from __future__ import annotations import base64 -import binascii import json import logging +from typing import Any from typing import AsyncGenerator +from typing import Optional from typing import TYPE_CHECKING from google.genai import types -from google.genai.interactions import AudioContentParam -from google.genai.interactions import CodeExecutionCallStep -from google.genai.interactions import CodeExecutionCallStepParam -from google.genai.interactions import CodeExecutionResultStep -from google.genai.interactions import CodeExecutionResultStepParam -from google.genai.interactions import ContentParam -from google.genai.interactions import DocumentContentParam -from google.genai.interactions import ErrorEvent -from google.genai.interactions import FunctionCallStep -from google.genai.interactions import FunctionCallStepParam -from google.genai.interactions import FunctionParam -from google.genai.interactions import FunctionResultStep -from google.genai.interactions import FunctionResultStepParam -from google.genai.interactions import GenerationConfigParam -from google.genai.interactions import GoogleSearchResultStep -from google.genai.interactions import ImageContentParam -from google.genai.interactions import Interaction -from google.genai.interactions import InteractionCompletedEvent -from google.genai.interactions import InteractionCreatedEvent -from google.genai.interactions import InteractionSSEEvent -from google.genai.interactions import InteractionStatusUpdate -from google.genai.interactions import ModelOutputStep -from google.genai.interactions import ModelOutputStepParam -from google.genai.interactions import Step -from google.genai.interactions import StepDelta -from google.genai.interactions import StepParam -from google.genai.interactions import StepStart -from google.genai.interactions import StepStop -from google.genai.interactions import TextContentParam -from google.genai.interactions import ThoughtStep -from google.genai.interactions import ThoughtStepParam -from google.genai.interactions import ToolParam -from google.genai.interactions import UserInputStepParam -from google.genai.interactions import VideoContentParam -from typing_extensions import deprecated if TYPE_CHECKING: from google.genai import Client + from google.genai._interactions.types.interaction import Output + from google.genai._interactions.types.tool_param import ToolParam + from google.genai._interactions.types.turn_param import TurnParam + from google.genai.interactions_types import Interaction + from google.genai.interactions_types import InteractionSSEEvent -from .llm_request import LlmRequest -from .llm_response import LlmResponse + from .llm_request import LlmRequest + from .llm_response import LlmResponse logger = logging.getLogger('google_adk.' + __name__) @@ -86,8 +57,8 @@ def _extract_stream_interaction_id( - event: InteractionSSEEvent, -) -> str | None: + event: 'InteractionSSEEvent', +) -> Optional[str]: """Extract the interaction ID from an Interactions SSE event. Different SSE lifecycle events expose the interaction ID on different @@ -96,49 +67,26 @@ def _extract_stream_interaction_id( google-genai builds may also yield a legacy ``interaction`` event with a top-level ``id``. """ + from google.genai._interactions.types.interaction_complete_event import InteractionCompleteEvent + from google.genai._interactions.types.interaction_start_event import InteractionStartEvent + from google.genai._interactions.types.interaction_status_update import InteractionStatusUpdate + if isinstance(event, InteractionStatusUpdate): return event.interaction_id - if isinstance(event, (InteractionCreatedEvent, InteractionCompletedEvent)): + if isinstance(event, (InteractionStartEvent, InteractionCompleteEvent)): return event.interaction.id - if isinstance(event, Interaction): - return event.id - - return None - - -def _decode_base64_string(signature: str | None) -> bytes | None: - """Decode a base64 encoded string.""" - if not signature or not isinstance(signature, str): - return None - try: - return base64.b64decode(signature) - except binascii.Error as e: - logger.error('Failed to decode base64 string: %s', e) - return None + if event.event_type == 'interaction': + return event.id + except AttributeError: + pass - -def _encode_base64_string(data: bytes) -> str: - """Encode bytes to a base64 string.""" - return base64.b64encode(data).decode('utf-8') - - -def _wrap_content_param_in_step( - content_param: ContentParam, role: str -) -> StepParam: - """Wraps a ContentParam into a UserInputStepParam or ModelOutputStepParam.""" - if role == 'model': - return ModelOutputStepParam(type='model_output', content=[content_param]) - return UserInputStepParam(type='user_input', content=[content_param]) + return None -@deprecated( - 'convert_part_to_interaction_content is deprecated and will be removed in' - ' future versions' -) -def convert_part_to_interaction_content(part: types.Part) -> dict | None: +def convert_part_to_interaction_content(part: types.Part) -> Optional[dict]: """Convert a types.Part to an interaction content dict. Args: @@ -265,185 +213,45 @@ def convert_part_to_interaction_content(part: types.Part) -> dict | None: return None -def _convert_part_to_interaction_content( - part: types.Part, - role: str = 'user', -) -> StepParam | None: - """Convert a types.Part to an interaction content dict. - - Args: - part: The Part object to convert. - role: The role to wrap the content in ('user' or 'model'). - - Returns: - A StepParam dict representing the interaction content, or None if - the part type is not supported. - """ - if part.text is not None: - return _wrap_content_param_in_step( - TextContentParam(type='text', text=part.text), role - ) - elif part.function_call is not None: - func_call_step = FunctionCallStepParam( - type='function_call', - id=part.function_call.id or '', - name=part.function_call.name or '', - arguments=part.function_call.args or {}, - ) - if part.thought_signature is not None: - func_call_step['signature'] = _encode_base64_string( - part.thought_signature - ) - return func_call_step - elif part.function_response is not None: - - # genai.types.FunctionResponse specifies that - # an error response should be inside an error key - func_resp = part.function_response.response - is_error = False - if isinstance(func_resp, dict) and 'error' in func_resp: - is_error = True - - # Pass the function response through to the interactions API. - # Dict and list values are passed directly — the Interactions API handles - # JSON serialization internally. Pre-serializing with json.dumps() would - # cause double-escaping. - if not isinstance(func_resp, (dict, str, list)): - func_resp = str(func_resp) - logger.debug( - 'Converting function_response: name=%s, call_id=%s', - part.function_response.name, - part.function_response.id, - ) - return FunctionResultStepParam( - type='function_result', - name=part.function_response.name or '', - call_id=part.function_response.id or '', - result=func_resp, - is_error=is_error, - ) - elif part.inline_data is not None: - mime_type = part.inline_data.mime_type or '' - # The interactions API requires inline data to be a base64 encoded string - # when serialized to JSON, otherwise openapi_dumps will raise a TypeError. - data = part.inline_data.data - if isinstance(data, bytes): - data = _encode_base64_string(data) - - if mime_type.startswith('image/'): - return _wrap_content_param_in_step( - ImageContentParam(type='image', data=data, mime_type=mime_type), role - ) - elif mime_type.startswith('audio/'): - return _wrap_content_param_in_step( - AudioContentParam(type='audio', data=data, mime_type=mime_type), role - ) - elif mime_type.startswith('video/'): - return _wrap_content_param_in_step( - VideoContentParam(type='video', data=data, mime_type=mime_type), role - ) - else: - return _wrap_content_param_in_step( - DocumentContentParam(type='document', data=data, mime_type=mime_type), - role, - ) - elif part.file_data is not None: - mime_type = part.file_data.mime_type or '' - if mime_type.startswith('image/'): - return _wrap_content_param_in_step( - ImageContentParam( - type='image', uri=part.file_data.file_uri, mime_type=mime_type - ), - role, - ) - elif mime_type.startswith('audio/'): - return _wrap_content_param_in_step( - AudioContentParam( - type='audio', uri=part.file_data.file_uri, mime_type=mime_type - ), - role, - ) - elif mime_type.startswith('video/'): - return _wrap_content_param_in_step( - VideoContentParam( - type='video', uri=part.file_data.file_uri, mime_type=mime_type - ), - role, - ) - else: - return _wrap_content_param_in_step( - DocumentContentParam( - type='document', uri=part.file_data.file_uri, mime_type=mime_type - ), - role, - ) - elif part.thought: - # part.thought is a boolean indicating this is a thought part - # ThoughtContentParam expects 'signature' (base64 encoded bytes) - thought_result = ThoughtStepParam(type='thought') - if part.thought_signature is not None: - thought_result['signature'] = _encode_base64_string( - part.thought_signature - ) - return thought_result - elif part.code_execution_result is not None: - is_error = part.code_execution_result.outcome in ( - types.Outcome.OUTCOME_FAILED, - types.Outcome.OUTCOME_DEADLINE_EXCEEDED, - ) - return CodeExecutionResultStepParam( - type='code_execution_result', - call_id='', - result=part.code_execution_result.output or '', - is_error=is_error, - ) - elif part.executable_code is not None: - return CodeExecutionCallStepParam( - type='code_execution_call', - id='', - arguments={ - 'code': part.executable_code.code, - 'language': part.executable_code.language, - }, - ) - return None - - -def _convert_content_to_step(content: types.Content) -> list[StepParam]: - """Convert a types.Content to a list of StepParam dicts for interactions API. +def convert_content_to_turn(content: types.Content) -> TurnParam: + """Convert a types.Content to a TurnParam dict for interactions API. Args: content: The Content object to convert. Returns: - A list of StepParam dictionaries for the interactions API. + A TurnParam dictionary for the interactions API. """ - steps: list[StepParam] = [] - - role = content.role or 'user' + contents = [] if content.parts: for part in content.parts: - interaction_content = _convert_part_to_interaction_content(part, role) + interaction_content = convert_part_to_interaction_content(part) if interaction_content: - steps.append(interaction_content) + contents.append(interaction_content) - return steps + return { + 'role': content.role or 'user', + 'content': contents, + } -def _convert_contents_to_steps( +def convert_contents_to_turns( contents: list[types.Content], -) -> list[StepParam]: +) -> list[TurnParam]: """Convert a list of Content objects to interactions API input format. Args: contents: The list of Content objects to convert. Returns: - A list of StepParam dictionaries for the interactions API. + A list of TurnParam dictionaries for the interactions API. """ - return [ - step for content in contents for step in _convert_content_to_step(content) - ] + turns = [] + for content in contents: + turn = convert_content_to_turn(content) + if turn['content']: # Only add turns with content + turns.append(turn) + return turns def convert_tools_config_to_interactions_format( @@ -468,7 +276,7 @@ def convert_tools_config_to_interactions_format( # Handle function declarations if tool.function_declarations: for func_decl in tool.function_declarations: - func_tool: FunctionParam = { + func_tool: dict[str, Any] = { 'type': 'function', 'name': func_decl.name, } @@ -480,14 +288,14 @@ def convert_tools_config_to_interactions_format( props = {} for k, v in func_decl.parameters.properties.items(): props[k] = v.model_dump(exclude_none=True) - - params_dict: dict[str, object] = { + func_tool['parameters'] = { 'type': 'object', 'properties': props, } if func_decl.parameters.required: - params_dict['required'] = list(func_decl.parameters.required) - func_tool['parameters'] = params_dict + func_tool['parameters']['required'] = list( + func_decl.parameters.required + ) elif func_decl.parameters_json_schema: func_tool['parameters'] = func_decl.parameters_json_schema interaction_tools.append(func_tool) @@ -511,104 +319,115 @@ def convert_tools_config_to_interactions_format( return interaction_tools -def _convert_interaction_step_to_parts(step: Step) -> list[types.Part]: - """Convert an interaction output content to a list of types.Part. +def convert_interaction_output_to_part(output: Output) -> Optional[types.Part]: + """Convert an interaction output content to a types.Part. Args: output: The interaction output object to convert. Returns: - A list of types.Part objects. + A types.Part object, or None if the output type is not supported. """ - if isinstance(step, ModelOutputStep): - if not step.content: - return [] - - parts = [] - for content in step.content: - if content.type == 'text': - parts.append(types.Part.from_text(text=content.text)) - elif content.type in ['image', 'audio', 'document', 'video']: - if content.data: - parts.append( - types.Part( - inline_data=types.Blob( - data=content.data, - mime_type=content.mime_type, - ) - ) - ) - elif content.uri: - parts.append( - types.Part( - file_data=types.FileData( - file_uri=content.uri, - mime_type=content.mime_type, - ) - ) - ) - return parts - elif isinstance(step, FunctionCallStep): + if not hasattr(output, 'type'): + return None + + output_type = output.type + + if output_type == 'text': + return types.Part.from_text(text=output.text or '') + elif output_type == 'function_call': logger.debug( 'Converting function_call output: name=%s, id=%s', - step.name, - step.id, + output.name, + output.id, ) - thought_signature = _decode_base64_string(step.signature) - return [ - types.Part( - function_call=types.FunctionCall( - id=step.id, - name=step.name, - args=step.arguments or {}, - ), - thought_signature=thought_signature, - ) - ] - elif isinstance(step, FunctionResultStep): - return [ - types.Part( - function_response=types.FunctionResponse( - id=step.call_id or '', - response=step.result, - ) + thought_signature = None + thought_sig_value = getattr(output, 'thought_signature', None) + if thought_sig_value and isinstance(thought_sig_value, str): + # Decode base64 string back to bytes + thought_signature = base64.b64decode(thought_sig_value) + return types.Part( + function_call=types.FunctionCall( + id=output.id, + name=output.name, + args=output.arguments or {}, + ), + thought_signature=thought_signature, + ) + elif output_type == 'function_result': + result = output.result + # Handle different result formats + if isinstance(result, str): + result_value = result + elif hasattr(result, 'items'): + result_value = result.items + else: + result_value = result + return types.Part( + function_response=types.FunctionResponse( + id=output.call_id, + response=result_value, ) - ] - elif isinstance(step, ThoughtStep): + ) + elif output_type == 'image': + if output.data: + return types.Part( + inline_data=types.Blob( + data=output.data, + mime_type=output.mime_type, + ) + ) + elif output.uri: + return types.Part( + file_data=types.FileData( + file_uri=output.uri, + mime_type=output.mime_type, + ) + ) + elif output_type == 'audio': + if output.data: + return types.Part( + inline_data=types.Blob( + data=output.data, + mime_type=output.mime_type, + ) + ) + elif output.uri: + return types.Part( + file_data=types.FileData( + file_uri=output.uri, + mime_type=output.mime_type, + ) + ) + elif output_type == 'thought': # ThoughtContent has a 'signature' attribute, not 'thought' # These are internal model reasoning and typically not exposed as Parts # Skip thought outputs for now - return [] - elif isinstance(step, CodeExecutionResultStep): - return [ - types.Part( - code_execution_result=types.CodeExecutionResult( - output=step.result or '', - outcome=types.Outcome.OUTCOME_FAILED - if step.is_error - else types.Outcome.OUTCOME_OK, - ) + return None + elif output_type == 'code_execution_result': + return types.Part( + code_execution_result=types.CodeExecutionResult( + output=output.result or '', + outcome=types.Outcome.OUTCOME_FAILED + if output.is_error + else types.Outcome.OUTCOME_OK, ) - ] - elif isinstance(step, CodeExecutionCallStep): - args = step.arguments - return [ - types.Part( - executable_code=types.ExecutableCode( - code=args.code, - language=types.Language.PYTHON - if args.language and args.language.lower() == 'python' - else types.Language.LANGUAGE_UNSPECIFIED, - ) + ) + elif output_type == 'code_execution_call': + args = output.arguments or {} + return types.Part( + executable_code=types.ExecutableCode( + code=args.get('code', ''), + language=args.get('language', 'PYTHON'), ) - ] - elif isinstance(step, GoogleSearchResultStep): + ) + elif output_type == 'google_search_result': # For google search results, we create a text part with the results - if step.result: - results_text = '\n'.join(str(r) for r in step.result if r) - return [types.Part.from_text(text=results_text)] + if output.result: + results_text = '\n'.join(str(r) for r in output.result if r) + return types.Part.from_text(text=results_text) - return [] + return None def convert_interaction_to_llm_response( @@ -639,11 +458,11 @@ def convert_interaction_to_llm_response( # Convert outputs to Content parts parts = [] - if interaction.steps: - for step in interaction.steps: - step_parts = _convert_interaction_step_to_parts(step) - if step_parts: - parts.extend(step_parts) + if interaction.outputs: + for output in interaction.outputs: + part = convert_interaction_output_to_part(output) + if part: + parts.append(part) content = None if parts: @@ -683,8 +502,8 @@ def convert_interaction_to_llm_response( def convert_interaction_event_to_llm_response( event: InteractionSSEEvent, aggregated_parts: list[types.Part], - interaction_id: str | None = None, -) -> LlmResponse | None: + interaction_id: Optional[str] = None, +) -> Optional[LlmResponse]: """Convert an InteractionSSEEvent to an LlmResponse for streaming. Args: @@ -695,36 +514,19 @@ def convert_interaction_event_to_llm_response( Returns: LlmResponse if this event produces one, None otherwise. """ + from .llm_response import LlmResponse - if isinstance(event, StepStart): - - # Streaming function calls follow a sequence of events (https://ai.google.dev/gemini-api/docs/interactions-breaking-changes-may-2026#streaming): - # 1. StepStart: Delivers the function id and name. - # 2. StepDelta (multiple): Streams arguments as raw JSON strings via arguments. - # 3. StepStop: Signals the end of the step, where arguments are finalized and parsed. - if isinstance(event.step, FunctionCallStep): - thought_signature = _decode_base64_string(event.step.signature) + event_type = getattr(event, 'event_type', None) - fc = types.FunctionCall( - id=event.step.id, - name=event.step.name, - partial_args=[], - ) - part = types.Part(function_call=fc, thought_signature=thought_signature) - aggregated_parts.append(part) - - return LlmResponse( - content=types.Content(role='model', parts=[part]), - partial=True, - turn_complete=False, - interaction_id=interaction_id, - ) - - elif isinstance(event, StepDelta): + if event_type == 'content.delta': delta = event.delta + if delta is None: + return None + + delta_type = getattr(delta, 'type', None) - if delta.type == 'text': - text = delta.text + if delta_type == 'text': + text = delta.text or '' if text: part = types.Part.from_text(text=text) aggregated_parts.append(part) @@ -735,121 +537,93 @@ def convert_interaction_event_to_llm_response( interaction_id=interaction_id, ) - elif delta.type == 'image': - data = delta.data - uri = delta.uri - mime_type = delta.mime_type - if data or uri: - if data: + elif delta_type == 'function_call': + # Function calls are typically sent as complete units + # DON'T yield immediately - add to aggregated_parts only. + # The function_call will be yielded in the final response which has + # the correct interaction_id. If we yield here, interaction_id may be + # None because SSE streams the id later in the 'interaction' event. + if delta.name: + thought_signature = None + thought_sig_value = getattr(delta, 'thought_signature', None) + if thought_sig_value and isinstance(thought_sig_value, str): + # Decode base64 string back to bytes + thought_signature = base64.b64decode(thought_sig_value) + part = types.Part( + function_call=types.FunctionCall( + id=delta.id or '', + name=delta.name, + args=delta.arguments or {}, + ), + thought_signature=thought_signature, + ) + aggregated_parts.append(part) + # Return None - function_call will be in the final aggregated response + return None + + elif delta_type == 'image': + if delta.data or delta.uri: + if delta.data: part = types.Part( inline_data=types.Blob( - data=data, - mime_type=mime_type, + data=delta.data, + mime_type=delta.mime_type, ) ) else: part = types.Part( file_data=types.FileData( - file_uri=uri, - mime_type=mime_type, + file_uri=delta.uri, + mime_type=delta.mime_type, ) ) aggregated_parts.append(part) return LlmResponse( content=types.Content(role='model', parts=[part]), - partial=True, + partial=False, turn_complete=False, interaction_id=interaction_id, ) - elif delta.type == 'arguments_delta': - if aggregated_parts: - last_part = aggregated_parts[-1] - if last_part.function_call: - delta_args = delta.arguments - if ( - delta_args is not None - and last_part.function_call.partial_args is not None - ): - last_part.function_call.partial_args.append( - types.PartialArg(string_value=delta_args) - ) - - chunk_part = types.Part( - function_call=types.FunctionCall( - name=last_part.function_call.name, - partial_args=[types.PartialArg(string_value=delta_args)], - ) - ) - return LlmResponse( - content=types.Content(role='model', parts=[chunk_part]), - partial=True, - turn_complete=False, - interaction_id=interaction_id, - ) - - elif isinstance(event, StepStop): - if aggregated_parts and aggregated_parts[-1].function_call: - fc = aggregated_parts[-1].function_call - if fc.partial_args is not None: - arg_str = ''.join(pa.string_value or '' for pa in fc.partial_args) - - args = {} - if arg_str: - try: - args = json.loads(arg_str) - except json.JSONDecodeError as e: - logger.error( - 'Failed to parse function call args: %s. arg_str: %s', - e, - arg_str, - ) - fc.args = args - fc.partial_args = None - return LlmResponse( - error_code='JSON_PARSE_ERROR', - error_message='Failed to parse function call arguments', - turn_complete=True, - finish_reason=types.FinishReason.STOP, - interaction_id=interaction_id, - ) - - fc.args = args - fc.partial_args = None - - return None - - elif isinstance(event, InteractionCompletedEvent): - # Final aggregated response + elif event_type == 'content.stop': + # Content streaming finished, return aggregated content if aggregated_parts: return LlmResponse( - content=types.Content(role='model', parts=aggregated_parts), + content=types.Content(role='model', parts=list(aggregated_parts)), partial=False, - turn_complete=True, - finish_reason=types.FinishReason.STOP, + turn_complete=False, interaction_id=interaction_id, ) - # If no streaming parts were collected, convert the final interaction directly - return convert_interaction_to_llm_response(event.interaction) - elif isinstance(event, Interaction): - # Fallback for legacy interaction events without lifecycle + elif event_type == 'interaction': + # Final interaction event with complete data return convert_interaction_to_llm_response(event) - elif isinstance(event, InteractionStatusUpdate): - if event.status == 'failed': + elif event_type == 'interaction.status_update': + status = getattr(event, 'status', None) + if status in ('completed', 'requires_action'): return LlmResponse( - error_code='UNKNOWN_ERROR', - error_message='Unknown error', + content=types.Content(role='model', parts=list(aggregated_parts)) + if aggregated_parts + else None, + partial=False, + turn_complete=True, + finish_reason=types.FinishReason.STOP, + interaction_id=interaction_id, + ) + elif status == 'failed': + error = getattr(event, 'error', None) + return LlmResponse( + error_code=error.code if error else 'UNKNOWN_ERROR', + error_message=error.message if error else 'Unknown error', turn_complete=True, interaction_id=interaction_id, ) - elif isinstance(event, ErrorEvent): - error = event.error + elif event_type == 'error': return LlmResponse( - error_code=error.code if error else 'UNKNOWN_ERROR', - error_message=error.message if error else 'Unknown error', + error_code=getattr(event, 'code', 'UNKNOWN_ERROR'), + error_message=getattr(event, 'message', 'Unknown error'), turn_complete=True, interaction_id=interaction_id, ) @@ -859,7 +633,7 @@ def convert_interaction_event_to_llm_response( def build_generation_config( config: types.GenerateContentConfig, -) -> GenerationConfigParam: +) -> dict[str, Any]: """Build generation config dict for interactions API. Args: @@ -868,7 +642,7 @@ def build_generation_config( Returns: A dictionary containing generation configuration parameters. """ - generation_config: GenerationConfigParam = {} + generation_config: dict[str, Any] = {} if config.temperature is not None: generation_config['temperature'] = config.temperature if config.top_p is not None: @@ -888,7 +662,7 @@ def build_generation_config( def extract_system_instruction( config: types.GenerateContentConfig, -) -> str | None: +) -> Optional[str]: """Extract system instruction as a string from config. Args: @@ -905,10 +679,9 @@ def extract_system_instruction( elif isinstance(config.system_instruction, types.Content): # Extract text from Content texts = [] - if config.system_instruction.parts: - for part in config.system_instruction.parts: - if part.text: - texts.append(part.text) + for part in config.system_instruction.parts: + if part.text: + texts.append(part.text) return '\n'.join(texts) if texts else None return None @@ -934,18 +707,18 @@ def _build_tool_log(tool: ToolParam) -> str: def build_interactions_request_log( model: str, - input_steps: list[StepParam], - system_instruction: str | None, - tools: list[ToolParam] | None, - generation_config: dict[str, object] | None, - previous_interaction_id: str | None, + input_turns: list[TurnParam], + system_instruction: Optional[str], + tools: Optional[list[ToolParam]], + generation_config: Optional[dict[str, Any]], + previous_interaction_id: Optional[str], stream: bool, ) -> str: """Build a log string for an interactions API request. Args: model: The model name. - input_steps: The input steps to send. + input_turns: The input turns to send. system_instruction: The system instruction. tools: The tools configuration. generation_config: The generation config. @@ -955,11 +728,11 @@ def build_interactions_request_log( Returns: A formatted log string describing the request. """ - # Format input steps for logging - steps_logs = [] - for step in input_steps: - role = step.get('role', 'unknown') - contents = step.get('content', []) + # Format input turns for logging + turns_logs = [] + for turn in input_turns: + role = turn.get('role', 'unknown') + contents = turn.get('content', []) content_strs = [] for content in contents: content_type = content.get('type', 'unknown') @@ -982,7 +755,7 @@ def build_interactions_request_log( content_strs.append(f'function_result[{call_id}]: {result}') else: content_strs.append(f'{content_type}: ...') - steps_logs.append(f' [{role}]: {", ".join(content_strs)}') + turns_logs.append(f' [{role}]: {", ".join(content_strs)}') # Format tools for logging tools_logs = [] @@ -1008,8 +781,8 @@ def build_interactions_request_log( Generation Config: {config_str} ----------------------------------------------------------- -Input Steps: -{_NEW_LINE.join(steps_logs) if steps_logs else '(none)'} +Input Turns: +{_NEW_LINE.join(turns_logs) if turns_logs else '(none)'} ----------------------------------------------------------- Tools: {_NEW_LINE.join(tools_logs) if tools_logs else '(none)'} @@ -1032,17 +805,17 @@ def build_interactions_response_log(interaction: Interaction) -> str: # Extract outputs outputs_logs = [] - if hasattr(interaction, 'steps') and interaction.steps: - for step in interaction.steps: - output_type = getattr(step, 'type', 'unknown') + if hasattr(interaction, 'outputs') and interaction.outputs: + for output in interaction.outputs: + output_type = getattr(output, 'type', 'unknown') if output_type == 'text': - text = getattr(step, 'text', '') + text = getattr(output, 'text', '') if len(text) > 300: text = text[:300] + '...' outputs_logs.append(f' text: "{text}"') elif output_type == 'function_call': - name = getattr(step, 'name', '') - args = getattr(step, 'arguments', {}) + name = getattr(output, 'name', '') + args = getattr(output, 'arguments', {}) outputs_logs.append(f' function_call: {name}({json.dumps(args)})') else: outputs_logs.append(f' {output_type}: ...') @@ -1095,7 +868,7 @@ def build_interactions_event_log(event: InteractionSSEEvent) -> str: details = [] - if event_type == 'step.delta': + if event_type == 'content.delta': delta = getattr(event, 'delta', None) if delta: delta_type = getattr(delta, 'type', 'unknown') @@ -1111,11 +884,11 @@ def build_interactions_event_log(event: InteractionSSEEvent) -> str: else: details.append(f'{delta_type}: ...') - elif event_type in ('interaction.completed', 'interaction.requires_action'): + elif event_type == 'interaction.status_update': status = getattr(event, 'status', 'unknown') details.append(f'status: {status}') - elif event_type == 'interaction.error': + elif event_type == 'error': code = getattr(event, 'code', 'unknown') message = getattr(event, 'message', 'unknown') details.append(f'error: {code} - {message}') @@ -1133,8 +906,12 @@ def _get_latest_user_contents( For interactions API with previous_interaction_id, we only need to send the current turn's messages since prior history is maintained by - the interaction chain. The preceding model turn with the function_call - is already encapsulated in the previous_interaction_id state. + the interaction chain. + + Special handling for function_result: When the user content contains a + function_result (response to a model's function_call), we must also include + the preceding model content with the function_call. The Interactions API + needs both the function_call and function_result to properly match call_ids. Args: contents: The full list of content messages. @@ -1146,16 +923,41 @@ def _get_latest_user_contents( return [] # Find the latest continuous user messages from the end - latest_user_contents: list[types.Content] = [] - for i in range(len(contents) - 1, -1, -1): - content = contents[i] + latest_user_contents = [] + for content in reversed(contents): if content.role == 'user': - latest_user_contents.append(content) + latest_user_contents.insert(0, content) else: # Stop when we hit a non-user message break - latest_user_contents.reverse() + # Check if the user contents contain a function_result + has_function_result = False + for content in latest_user_contents: + if content.parts: + for part in content.parts: + if part.function_response is not None: + has_function_result = True + break + if has_function_result: + break + + # If we have a function_result, we also need the preceding model content + # with the function_call so the API can match the call_id + if has_function_result and len(contents) > len(latest_user_contents): + # Get the index where user contents start + user_start_idx = len(contents) - len(latest_user_contents) + if user_start_idx > 0: + # Check if the content before user contents is a model turn with + # function_call + preceding_content = contents[user_start_idx - 1] + if preceding_content.role == 'model' and preceding_content.parts: + for part in preceding_content.parts: + if part.function_call is not None: + # Include the model's function_call turn before user's + # function_result + return [preceding_content] + latest_user_contents + return latest_user_contents @@ -1181,6 +983,7 @@ async def generate_content_via_interactions( Yields: LlmResponse objects converted from interaction responses. """ + from .llm_response import LlmResponse # When previous_interaction_id is set, only send the latest continuous # user messages (the current turn) instead of full conversation history @@ -1189,7 +992,7 @@ async def generate_content_via_interactions( contents = _get_latest_user_contents(contents) # Convert contents to interactions API format - input_steps = _convert_contents_to_steps(contents) + input_turns = convert_contents_to_turns(contents) interaction_tools = convert_tools_config_to_interactions_format( llm_request.config ) @@ -1210,8 +1013,8 @@ async def generate_content_via_interactions( logger.debug( build_interactions_request_log( - model=llm_request.model or '', - input_steps=input_steps, + model=llm_request.model, + input_turns=input_turns, system_instruction=system_instruction, tools=interaction_tools if interaction_tools else None, generation_config=generation_config if generation_config else None, @@ -1221,13 +1024,13 @@ async def generate_content_via_interactions( ) # Track the current interaction ID from responses - current_interaction_id: str | None = None + current_interaction_id: Optional[str] = None if stream: # Streaming mode responses = await api_client.aio.interactions.create( model=llm_request.model, - input=input_steps, + input=input_turns, stream=True, system_instruction=system_instruction, tools=interaction_tools if interaction_tools else None, @@ -1249,11 +1052,21 @@ async def generate_content_via_interactions( if llm_response: yield llm_response + # Final aggregated response + if aggregated_parts: + yield LlmResponse( + content=types.Content(role='model', parts=aggregated_parts), + partial=False, + turn_complete=True, + finish_reason=types.FinishReason.STOP, + interaction_id=current_interaction_id, + ) + else: # Non-streaming mode interaction = await api_client.aio.interactions.create( model=llm_request.model, - input=input_steps, + input=input_turns, stream=False, system_instruction=system_instruction, tools=interaction_tools if interaction_tools else None, diff --git a/src/google/adk/models/lite_llm.py b/src/google/adk/models/lite_llm.py index d39bcf4431..4d4f93c88f 100644 --- a/src/google/adk/models/lite_llm.py +++ b/src/google/adk/models/lite_llm.py @@ -14,7 +14,6 @@ from __future__ import annotations -import ast import base64 import binascii import copy @@ -99,7 +98,6 @@ _EXCLUDED_PART_FIELD = {"inline_data": {"data"}} _LITELLM_STRUCTURED_TYPES = {"json_object", "json_schema"} _JSON_DECODER = json.JSONDecoder() -_UNQUOTED_KEY_RE = re.compile(r"[A-Za-z_][A-Za-z0-9_]*") # Mapping of major MIME type prefixes to LiteLLM content types for URL blocks. # Audio is handled separately as `input_audio` content blocks because LiteLLM @@ -124,100 +122,6 @@ "content_filter": types.FinishReason.SAFETY, } - -def _quote_unquoted_json_object_keys(value: str) -> str: - """Quotes simple unquoted object keys without touching string contents.""" - result = [] - i = 0 - in_string = False - string_quote = "" - escaped = False - - while i < len(value): - char = value[i] - if in_string: - result.append(char) - if escaped: - escaped = False - elif char == "\\": - escaped = True - elif char == string_quote: - in_string = False - string_quote = "" - i += 1 - continue - - if char in {'"', "'"}: - in_string = True - string_quote = char - result.append(char) - i += 1 - continue - - if char in "{,": - result.append(char) - i += 1 - whitespace_start = i - while i < len(value) and value[i].isspace(): - i += 1 - result.append(value[whitespace_start:i]) - - key_match = _UNQUOTED_KEY_RE.match(value, i) - if key_match: - key_end = key_match.end() - colon_index = key_end - while colon_index < len(value) and value[colon_index].isspace(): - colon_index += 1 - if colon_index < len(value) and value[colon_index] == ":": - result.append(f'"{key_match.group(0)}"') - result.append(value[key_end:colon_index]) - i = colon_index - continue - continue - - result.append(char) - i += 1 - - return "".join(result) - - -def _parse_tool_call_arguments(arguments: Any) -> Any: - """Parses LiteLLM tool call arguments. - - LiteLLM normally returns OpenAI-compatible tool call arguments as JSON - strings, but some providers can stream a complete tool call whose finalized - argument payload is a Python dict literal or has unquoted object keys. Keep - strict JSON as the primary path, then repair only those complete - object-literal shapes so ADK can still surface the intended function call. - """ - if not arguments: - return {} - if not isinstance(arguments, str): - return arguments - - try: - return json.loads(arguments) - except json.JSONDecodeError as exc: - json_error = exc - - try: - return ast.literal_eval(arguments) - except (SyntaxError, ValueError): - pass - - repaired_arguments = _quote_unquoted_json_object_keys(arguments) - if repaired_arguments != arguments: - try: - return json.loads(repaired_arguments) - except json.JSONDecodeError: - try: - return ast.literal_eval(repaired_arguments) - except (SyntaxError, ValueError): - pass - - raise json_error - - # File MIME types supported for upload as file content (not decoded as text). # Note: text/* types are handled separately and decoded as text content. # These types are uploaded as files to providers that support it. @@ -377,7 +281,7 @@ def _infer_mime_type_from_uri(uri: str) -> Optional[str]: def _looks_like_openai_file_id(file_uri: str) -> bool: """Returns True when file_uri resembles an OpenAI/Azure file id.""" - return file_uri.startswith(("file-", "assistant-")) + return file_uri.startswith("file-") def _is_http_url(uri: str) -> bool: @@ -410,15 +314,17 @@ def _redact_file_uri_for_log( return f"{parsed.scheme}://" -def _is_file_uri_supported(provider: str, model: str, file_uri: str) -> bool: - """Returns True when `file_uri` can be sent as a file content block.""" +def _requires_file_uri_fallback( + provider: str, model: str, file_uri: str +) -> bool: + """Returns True when `file_uri` should not be sent as a file content block.""" if provider in _FILE_ID_REQUIRED_PROVIDERS: - return _looks_like_openai_file_id(file_uri) + return not _looks_like_openai_file_id(file_uri) if provider == "anthropic": - return False + return True if provider == "vertex_ai" and not _is_litellm_gemini_model(model): - return False - return True + return True + return False def _decode_inline_text_data(raw_bytes: bytes) -> str: @@ -1238,15 +1144,21 @@ async def _get_content( }) continue - if not _is_file_uri_supported(provider, model, part.file_data.file_uri): - redacted_file_uri = _redact_file_uri_for_log( - part.file_data.file_uri, - display_name=part.file_data.display_name, - ) - raise ValueError( - f"File URI `{redacted_file_uri}` not supported for provider:" - f" {provider}." + if _requires_file_uri_fallback(provider, model, part.file_data.file_uri): + logger.debug( + "File URI %s not supported for provider %s, using text fallback", + _redact_file_uri_for_log( + part.file_data.file_uri, + display_name=part.file_data.display_name, + ), + provider, ) + identifier = part.file_data.display_name or part.file_data.file_uri + content_objects.append({ + "type": "text", + "text": f'[File reference: "{identifier}"]', + }) + continue file_object: ChatCompletionFileUrlObject = { "file_id": part.file_data.file_uri, @@ -1274,19 +1186,14 @@ def _is_ollama_chat_provider( return False -_MEDIA_BLOCK_TYPES = frozenset({"image_url", "video_url", "audio_url"}) - - def _flatten_ollama_content( content: OpenAIMessageContent | str | None, -) -> OpenAIMessageContent | str | None: +) -> str | None: """Flattens multipart content to text for ollama_chat compatibility. - Ollama's chat endpoint rejects arrays for `content` when it is text-only, so - text parts are joined with newlines and other non-media content falls back to - a JSON string. Multipart content with media blocks (image_url, video_url, - audio_url) is returned unchanged so LiteLLM's Ollama handler can convert it - to the native `images` field instead of silently dropping the media. + Ollama's chat endpoint rejects arrays for `content`. We keep textual parts, + join them with newlines, and fall back to a JSON string for non-text content. + If both text and non-text parts are present, only the text parts are kept. """ if content is None or isinstance(content, str): return content @@ -1304,12 +1211,6 @@ def _flatten_ollama_content( except TypeError: return str(content) - if any( - isinstance(block, dict) and block.get("type") in _MEDIA_BLOCK_TYPES - for block in blocks - ): - return blocks - text_parts = [] for block in blocks: if isinstance(block, dict) and block.get("type") == "text": @@ -1826,7 +1727,7 @@ def _message_to_generate_content_response( thought_signature = _extract_thought_signature_from_tool_call(tool_call) part = types.Part.from_function_call( name=tool_call.function.name, - args=_parse_tool_call_arguments(tool_call.function.arguments), + args=json.loads(tool_call.function.arguments or "{}"), ) part.function_call.id = tool_call.id if thought_signature: @@ -2380,7 +2281,7 @@ def _finalize_tool_call_response( if func_data["id"]: if finish_reason == "length": try: - _parse_tool_call_arguments(func_data["args"]) + json.loads(func_data["args"] or "{}") except json.JSONDecodeError: has_incomplete_tool_call_args = True continue diff --git a/src/google/adk/models/llm_response.py b/src/google/adk/models/llm_response.py index 333034565f..c921f197c3 100644 --- a/src/google/adk/models/llm_response.py +++ b/src/google/adk/models/llm_response.py @@ -81,12 +81,6 @@ class LlmResponse(BaseModel): Only used for streaming mode. """ - turn_complete_reason: Optional[types.TurnCompleteReason] = None - """The reason why the turn is complete. - - Only used for streaming mode. - """ - finish_reason: Optional[types.FinishReason] = None """The finish reason of the response.""" diff --git a/src/google/adk/models/registry.py b/src/google/adk/models/registry.py index fcf35d78a1..a0c06271e9 100644 --- a/src/google/adk/models/registry.py +++ b/src/google/adk/models/registry.py @@ -47,34 +47,7 @@ def new_llm(model: str) -> BaseLlm: The LLM instance. """ - prefix, actual_model = LLMRegistry._parse_model(model) - cls = LLMRegistry.resolve(model) - - if prefix and LLMRegistry._match_prefix(prefix, cls.__name__): - return cls(model=actual_model) - - return cls(model=model) - - @staticmethod - def _parse_model(model: str) -> tuple[str | None, str]: - """Parses a model name into prefix and actual model. - - Example: "openai:gpt-4" -> ("openai", "gpt-4") - "gpt-4" -> (None, "gpt-4") - """ - if ':' in model: - prefix, actual_model = model.split(':', 1) - return prefix, actual_model - return None, model - - @staticmethod - def _match_prefix(prefix: str, class_name: str) -> bool: - """Checks if a prefix matches a class name.""" - prefix_lower = prefix.lower() - norm_class_name = class_name.lower() - if norm_class_name.endswith('llm'): - norm_class_name = norm_class_name[:-3] - return prefix_lower == norm_class_name or prefix_lower == class_name.lower() + return LLMRegistry.resolve(model)(model=model) @staticmethod def _register(model_name_regex: str, llm_cls: type[BaseLlm]): @@ -128,20 +101,6 @@ def resolve(model: str) -> type[BaseLlm]: ValueError: If the model is not found. """ - # Support [model_class]:model_name format to override resolution - prefix, _ = LLMRegistry._parse_model(model) - if prefix: - for regex, entry in list(_llm_registry_dict.items()): - class_name = entry[1] if isinstance(entry, tuple) else entry.__name__ - if LLMRegistry._match_prefix(prefix, class_name): - if isinstance(entry, tuple): - module_path, c_name = entry - # We let ImportError bubble up because the user explicitly - # requested this provider via prefix. - module = importlib.import_module(module_path) - return getattr(module, c_name) - return entry - for regex, entry in list(_llm_registry_dict.items()): if not re.compile(regex).fullmatch(model): continue diff --git a/src/google/adk/plugins/auto_tracing_helpers.py b/src/google/adk/plugins/auto_tracing_helpers.py deleted file mode 100644 index 8a3a603ab7..0000000000 --- a/src/google/adk/plugins/auto_tracing_helpers.py +++ /dev/null @@ -1,300 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""AutoTracingPlugin helpers: arg capture, span attrs, tracing wrapper.""" - -from __future__ import annotations - -import asyncio -import dataclasses -import functools -import inspect -import logging -import re -from typing import Any -from typing import Callable -from typing import Sequence - -from opentelemetry import trace as trace_api - -logger = logging.getLogger("google_adk." + __name__) - -DEFAULT_MAX_REPR_LEN = 4096 -DEFAULT_MAX_RECORDED_YIELDS = 16 - -NamedArg = tuple[str, str] -WRAPPED_ATTR = "_adk_auto_tracing_wrapped" -_SELF_OR_CLS = frozenset({"self", "cls"}) -_SCALAR_TYPES = frozenset({int, float, bool, str, bytes, type(None)}) -_DEFAULT_REPR_RE = re.compile(r"^<.+ object at 0x[0-9a-fA-F]+>$") - - -@dataclasses.dataclass(frozen=True) -class Caps: - """Bounds for captured repr strings and recorded generator yields.""" - - max_repr_len: int = DEFAULT_MAX_REPR_LEN - max_recorded_yields: int = DEFAULT_MAX_RECORDED_YIELDS - - -class StreamResult: - """Capped sample (``items``) + true yield count (``total``) for a wrapped generator.""" - - def __init__(self, items: Sequence[Any], caps: Caps, total: int): - self._items = items - self._caps = caps - self._total = total - - def __repr__(self) -> str: - if self._total == 0: - return "" - sample = [safe_repr(it, self._caps) for it in self._items] - suffix = ( - f" ... + {self._total - len(sample)} more" - if self._total > len(sample) - else "" - ) - return ( - f"" - ) - - -def safe_repr(value: Any, caps: Caps) -> str: - """``repr(value)`` capped, resilient, with default-form objects summarized.""" - max_len = caps.max_repr_len - # Fast path: scalars never hit the default-repr regex or summary. - if type(value) in _SCALAR_TYPES: - r = repr(value) - return ( - r - if len(r) <= max_len - else r[:max_len] + f"...[{len(r) - max_len} more chars]" - ) - try: - r = repr(value) - except Exception as exc: # pylint: disable=broad-exception-caught - logger.warning( - "AutoTracingPlugin: repr() failed for %s: %s", - type(value).__name__, - exc, - ) - r = f"" - if _DEFAULT_REPR_RE.match(r): - r = _summarize_default(value) - if len(r) > max_len: - r = r[:max_len] + f"...[{len(r) - max_len} more chars]" - return r - - -def public_slot_names(cls: type) -> set[str]: - """Public attr names declared in ``__slots__`` across ``cls.__mro__``. - - Handles the ``__slots__ = "x"`` shorthand (must be treated as a single - name, not iterated as characters). - """ - names: set[str] = set() - for klass in cls.__mro__: - slots = getattr(klass, "__slots__", None) - if slots is None: - continue - if isinstance(slots, str): - slots = (slots,) - for slot in slots: - if slot and not slot.startswith("_"): - names.add(slot) - return names - - -def _summarize_default(value: Any) -> str: - """Replaces ```` with a public-field summary (handles ``__slots__``).""" - cls = type(value).__name__ - public: list[tuple[str, Any]] = [] - instance_dict = getattr(value, "__dict__", None) - if isinstance(instance_dict, dict): - public.extend( - (k, v) for k, v in instance_dict.items() if not k.startswith("_") - ) - for slot_name in public_slot_names(type(value)): - try: - public.append((slot_name, getattr(value, slot_name))) - except AttributeError: - continue - if not public: - return f"<{cls}>" - fields = [] - for k, v in public: - try: - vr = repr(v) - except Exception as exc: # pylint: disable=broad-exception-caught - logger.warning( - "AutoTracingPlugin: repr() failed for %s.%s (%s): %s", - cls, - k, - type(v).__name__, - exc, - ) - vr = f"" - fields.append(f"{k}={vr}") - return f"<{cls} fields={{{', '.join(fields)}}}>" - - -def positional_param_names(fn: Callable[..., Any]) -> tuple[str, ...]: - """Returns ``fn``'s positional parameter names; ``()`` if introspection fails.""" - try: - return tuple( - n - for n, p in inspect.signature(fn).parameters.items() - if p.kind - in ( - inspect.Parameter.POSITIONAL_ONLY, - inspect.Parameter.POSITIONAL_OR_KEYWORD, - ) - ) - except (TypeError, ValueError): - return () - - -def name_value_pairs( - param_names: Sequence[str], - args: tuple[Any, ...], - kwargs: dict[str, Any], - caps: Caps, -) -> list[NamedArg]: - """Returns ``[(name, repr)]`` for args + kwargs (no self/cls).""" - pairs: list[NamedArg] = [] - for i, v in enumerate(args): - name = param_names[i] if i < len(param_names) else f"arg{i}" - if name in _SELF_OR_CLS: - continue - pairs.append((name, safe_repr(v, caps))) - for k, v in kwargs.items(): - pairs.append((k, safe_repr(v, caps))) - return pairs - - -def record_io_on_span( - span: trace_api.Span, - pairs: Sequence[NamedArg], - result: Any, - exc: BaseException | None, - caps: Caps, -) -> None: - """Writes ``adk.fn.*`` attributes onto ``span`` for the call's IO.""" - s = span.set_attribute - for k, v in pairs: - s(f"adk.fn.arg.{k}", v) - if exc is not None: - s("adk.fn.exc_type", type(exc).__qualname__) - s("adk.fn.exc_repr", safe_repr(exc, caps)) - return - s("adk.fn.return", safe_repr(result, caps)) - - -def display_name_for(fn: Callable[..., Any]) -> str: - """Returns the short (Class.method or function) name for ``fn``.""" - qn = fn.__qualname__ - return ".".join(qn.split(".")[-2:]) if "." in qn else qn - - -def tracer_will_record(tracer: trace_api.Tracer) -> bool: - """True iff ``tracer`` will record (not a NoOpTracer).""" - return not isinstance(tracer, trace_api.NoOpTracer) - - -def build_tracing_wrapper( - fn: Callable[..., Any], - tracer: trace_api.Tracer, - caps: Caps, -) -> Callable[..., Any]: - """Returns a tracing wrapper for ``fn`` matching its sync/async/gen shape.""" - # A non-recording tracer never produces IO; don't pay span/context cost. - if not tracer_will_record(tracer): - return fn - - display_name = display_name_for(fn) - # inspect.signature is expensive; resolve once at wrap time. - param_names = positional_param_names(fn) - yield_cap = caps.max_recorded_yields - - def _finish(span, args, kwargs, result, exc): - if not span.is_recording(): - return - pairs = name_value_pairs(param_names, args, kwargs, caps) - record_io_on_span(span, pairs, result, exc, caps) - - @functools.wraps(fn) - async def async_wrapper(*args, **kwargs): - with tracer.start_as_current_span(display_name) as span: - try: - r = await fn(*args, **kwargs) - except BaseException as exc: - _finish(span, args, kwargs, None, exc) - raise - _finish(span, args, kwargs, r, None) - return r - - @functools.wraps(fn) - async def async_gen_wrapper(*args, **kwargs): - with tracer.start_as_current_span(display_name) as span: - items: list[Any] = [] - total = 0 - try: - async for item in fn(*args, **kwargs): - total += 1 - if len(items) < yield_cap: - items.append(item) - yield item - except BaseException as exc: - _finish(span, args, kwargs, StreamResult(items, caps, total), exc) - raise - _finish(span, args, kwargs, StreamResult(items, caps, total), None) - - @functools.wraps(fn) - def gen_wrapper(*args, **kwargs): - with tracer.start_as_current_span(display_name) as span: - items: list[Any] = [] - total = 0 - try: - for item in fn(*args, **kwargs): - total += 1 - if len(items) < yield_cap: - items.append(item) - yield item - except BaseException as exc: - _finish(span, args, kwargs, StreamResult(items, caps, total), exc) - raise - _finish(span, args, kwargs, StreamResult(items, caps, total), None) - - @functools.wraps(fn) - def sync_wrapper(*args, **kwargs): - with tracer.start_as_current_span(display_name) as span: - try: - r = fn(*args, **kwargs) - except BaseException as exc: - _finish(span, args, kwargs, None, exc) - raise - _finish(span, args, kwargs, r, None) - return r - - if inspect.isasyncgenfunction(fn): - wrapper = async_gen_wrapper - elif asyncio.iscoroutinefunction(fn): - wrapper = async_wrapper - elif inspect.isgeneratorfunction(fn): - wrapper = gen_wrapper - else: - wrapper = sync_wrapper - setattr(wrapper, WRAPPED_ATTR, True) - return wrapper diff --git a/src/google/adk/plugins/auto_tracing_plugin.py b/src/google/adk/plugins/auto_tracing_plugin.py deleted file mode 100644 index f5a3ad4884..0000000000 --- a/src/google/adk/plugins/auto_tracing_plugin.py +++ /dev/null @@ -1,177 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Monkey-patches Python fns to emit OpenTelemetry spans.""" - -from __future__ import annotations - -import inspect -import logging -import sys -import threading -from typing import TYPE_CHECKING - -from opentelemetry import trace -from typing_extensions import override - -from . import auto_tracing_helpers -from .base_plugin import BasePlugin - -if TYPE_CHECKING: - from ..agents.invocation_context import InvocationContext - -logger = logging.getLogger("google_adk." + __name__) - -DEFAULT_MAX_WALK_DEPTH = 30 - -_ATOMIC_TYPES = (str, bytes, int, float, bool, type(None)) - - -class AutoTracingPlugin(BasePlugin): - """Auto-instruments in-scope Python functions with OpenTelemetry spans.""" - - def __init__( - self, - *, - name: str = "AutoTracingPlugin", - extra_scope_prefixes: tuple[str, ...] = (), - tracer: trace.Tracer | None = None, - max_repr_len: int = auto_tracing_helpers.DEFAULT_MAX_REPR_LEN, - max_recorded_yields: int = auto_tracing_helpers.DEFAULT_MAX_RECORDED_YIELDS, - max_walk_depth: int = DEFAULT_MAX_WALK_DEPTH, - ): - super().__init__(name=name) - self._scope_prefixes = tuple(extra_scope_prefixes) - self._tracer = tracer or trace.get_tracer(__name__) - self._caps = auto_tracing_helpers.Caps( - max_repr_len=max_repr_len, - max_recorded_yields=max_recorded_yields, - ) - self._max_walk_depth = max_walk_depth - self._tracer_eligible = auto_tracing_helpers.tracer_will_record( - self._tracer - ) - self._lock = threading.Lock() - self._wrapped_modules: set[str] = set() - - @override - async def before_run_callback( - self, *, invocation_context: "InvocationContext" - ) -> None: - if not self._tracer_eligible: - return - with self._lock: - self._add_agent_scope(invocation_context) - for name in list(sys.modules): - if name in self._wrapped_modules or name == __name__: - continue - if not name.startswith(self._scope_prefixes): - continue - module = sys.modules.get(name) - if module is None: - continue - try: - self._wrap_module(module) - except Exception: # pylint: disable=broad-exception-caught - logger.exception("AutoTracingPlugin: failed to instrument %s", name) - self._wrapped_modules.add(name) - - def _add_agent_scope(self, invocation_context): - """Adds packages of every object reachable from the invocation.""" - seen, packages = set(), set() - max_depth = self._max_walk_depth - - def walk(obj, depth): - if obj is None: - return - if depth > max_depth or id(obj) in seen: - return - if isinstance(obj, _ATOMIC_TYPES): - return - seen.add(id(obj)) - module = getattr(obj, "__module__", None) or getattr( - getattr(obj, "func", None), - "__module__", - None, - ) - if module: - # Top-level "mod" needs both "mod" and "mod." to match name.startswith. - if "." in module: - packages.add(module.rsplit(".", 1)[0] + ".") - else: - packages.add(module) - packages.add(module + ".") - if isinstance(obj, (list, tuple, set, frozenset)): - for item in obj: - walk(item, depth + 1) - return - if isinstance(obj, dict): - for item in obj.values(): - walk(item, depth + 1) - return - # Avoid getattr on instance __dict__ so @property / lazy descriptors don't fire. - instance_dict = getattr(obj, "__dict__", None) - if isinstance(instance_dict, dict): - for attr_name, value in instance_dict.items(): - if not attr_name.startswith("_"): - walk(value, depth + 1) - for slot_name in auto_tracing_helpers.public_slot_names(type(obj)): - try: - value = getattr(obj, slot_name) - except AttributeError: - continue - walk(value, depth + 1) - - walk(getattr(invocation_context, "agent", None), 0) - new = tuple(sorted(packages - set(self._scope_prefixes))) - if new: - self._scope_prefixes = self._scope_prefixes + new - - def _wrap_module(self, module): - module_name = module.__name__ - for attr_name, attr in inspect.getmembers(module): - if attr_name.startswith("_"): - continue - if getattr(attr, "__module__", "") != module_name: - continue - if inspect.isfunction(attr): - self._rebind(module, attr_name, attr) - elif inspect.isclass(attr): - for member_name, member in inspect.getmembers(attr): - if member_name.startswith("__"): - continue - if not inspect.isfunction(member): - continue - if getattr(member, "__module__", "") != module_name: - continue - self._rebind(attr, member_name, member) - - def _rebind(self, owner, name, fn): - if getattr(fn, auto_tracing_helpers.WRAPPED_ATTR, False): - return - try: - setattr( - owner, - name, - auto_tracing_helpers.build_tracing_wrapper( - fn, self._tracer, self._caps - ), - ) - except (AttributeError, TypeError) as exc: - logger.info( - "AutoTracingPlugin: cannot rebind %s.%s: %s", - getattr(owner, "__qualname__", owner), - name, - exc, - ) diff --git a/src/google/adk/plugins/bigquery_agent_analytics_plugin.py b/src/google/adk/plugins/bigquery_agent_analytics_plugin.py index 5ebc31d3e2..3a09fc942f 100644 --- a/src/google/adk/plugins/bigquery_agent_analytics_plugin.py +++ b/src/google/adk/plugins/bigquery_agent_analytics_plugin.py @@ -634,35 +634,20 @@ class BigQueryLoggerConfig: @dataclass class _SpanRecord: - """A single record on the BQAA plugin's internal span stack. - - Stores the IDs and timing the plugin needs to populate BigQuery - ``span_id`` / ``parent_span_id`` / ``trace_id`` / ``latency_ms`` - columns. Crucially, no OpenTelemetry ``Span`` object is held. - - Background — prior approach and the bug it caused: - The previous implementation created real OTel spans via - ``tracer.start_span(...)`` purely as ID carriers. When the host - application has an OTel exporter configured (notably Agent Engine - with ``GOOGLE_CLOUD_AGENT_ENGINE_ENABLE_TELEMETRY=true``), those - plugin-owned spans were exported to Cloud Trace alongside the - framework's real spans — producing a duplicate-span view for - every BQAA-instrumented operation. See haiyuan-eng-google/BQAA-SDK#94. - - The plugin already tracked all parent / child relationships on - this internal stack, so the OTel span object was incidental to - correctness. We now store ``trace_id`` directly on each record - (inherited from the ambient OTel span when present, generated - otherwise) and skip span creation entirely. Cross-system - correlation with Cloud Trace still works via ``trace_id`` - inheritance. - - ``attach_current_span`` (which observes the ambient span without - owning one) is unaffected by this change. + """A single record on the unified span stack. + + Consolidates span, id, ownership, and timing into one object + so all stacks stay in sync by construction. + + Note: The plugin intentionally does NOT attach its spans to the + ambient OTel context (no ``context.attach``). This prevents the + plugin from corrupting the framework's span hierarchy when an + external OTel exporter (e.g. ``opentelemetry-instrumentation-vertexai``) + is active. See https://github.com/google/adk-python/issues/4561. """ + span: trace.Span span_id: str - trace_id: str owns_span: bool start_time_ns: int first_token_time: Optional[float] = None @@ -704,16 +689,17 @@ def init_trace(callback_context: CallbackContext) -> None: @staticmethod def get_trace_id(callback_context: CallbackContext) -> Optional[str]: - """Gets the trace ID from the current span stack or invocation_id.""" + """Gets the trace ID from the current span or invocation_id.""" records = _span_records_ctx.get() if records: - return records[-1].trace_id + current_span = records[-1].span + if current_span.get_span_context().is_valid: + return format(current_span.get_span_context().trace_id, "032x") - # Fallback to ambient OTel context (e.g. callbacks fired before - # any plugin span was pushed). - ambient_ctx = trace.get_current_span().get_span_context() - if ambient_ctx.is_valid: - return format(ambient_ctx.trace_id, "032x") + # Fallback to OTel context + current_span = trace.get_current_span() + if current_span.get_span_context().is_valid: + return format(current_span.get_span_context().trace_id, "032x") return callback_context.invocation_id @@ -722,48 +708,47 @@ def push_span( callback_context: CallbackContext, span_name: Optional[str] = "adk-span", ) -> str: - """Pushes a BQAA-internal span record onto the stack. - - No OpenTelemetry span is created — see ``_SpanRecord`` for - background. The record carries everything the plugin needs to - populate BigQuery columns: - - * ``span_id`` — newly generated 16-hex string. - * ``trace_id`` — inherited by precedence: - 1. Top of the existing internal stack (keeps every push - within an invocation under one trace_id). - 2. Ambient OTel span when valid (e.g. the framework's Runner - span, or an Agent Engine root span) — keeps BigQuery rows - joinable to Cloud Trace via the shared ``trace_id``. - 3. A fresh 32-hex value (no ambient context, e.g. unit tests - or non-OTel runtimes). - * ``start_time_ns`` — for the eventual ``latency_ms`` on pop. - - ``span_name`` is preserved on the signature for API stability but - is no longer used (no OTel span name is set). + """Starts a new span and pushes it onto the stack. + + The span is created but NOT attached to the ambient OTel context, + so it cannot corrupt the framework's own span hierarchy. The + plugin tracks span_id / parent_span_id internally via its own + contextvar stack. + + If OTel is not configured (returning non-recording spans), a UUID + fallback is generated to ensure span_id and parent_span_id are + populated in BigQuery logs. """ - del span_name # No-op: kept for API stability; no OTel span is created. TraceManager.init_trace(callback_context) + # Create the span without attaching it to the ambient context. + # This avoids re-parenting framework spans like ``call_llm`` + # or ``execute_tool``. See #4561. + # + # If the internal stack already has a span, create the new span + # as a child so it shares the same trace_id. Without this, each + # ``start_span`` would be an independent root with its own + # trace_id — causing trace_id fracture (see #4645). records = TraceManager._get_records() - if records: - trace_id = records[-1].trace_id - else: - ambient_ctx = trace.get_current_span().get_span_context() - if ambient_ctx.is_valid: - trace_id = format(ambient_ctx.trace_id, "032x") - else: - trace_id = uuid.uuid4().hex # 32 hex chars + parent_ctx = None + if records and records[-1].span.get_span_context().is_valid: + parent_ctx = trace.set_span_in_context(records[-1].span) + span = tracer.start_span(span_name, context=parent_ctx) - span_id_str = uuid.uuid4().hex[:16] + if span.get_span_context().is_valid: + span_id_str = format(span.get_span_context().span_id, "016x") + else: + span_id_str = uuid.uuid4().hex record = _SpanRecord( + span=span, span_id=span_id_str, - trace_id=trace_id, owns_span=True, start_time_ns=time.time_ns(), ) - _span_records_ctx.set(list(records) + [record]) + + new_records = list(records) + [record] + _span_records_ctx.set(new_records) return span_id_str @@ -771,31 +756,30 @@ def push_span( def attach_current_span( callback_context: CallbackContext, ) -> str: - """Records the ambient OTel span's IDs on the stack without owning it. + """Records the current OTel span on the stack without owning it. - No OTel span is created or attached. This path captures the - ambient span's ``trace_id`` / ``span_id`` so plugin-emitted - BigQuery rows correlate with whatever Cloud Trace / external - exporter the host is already running. + The span is NOT re-attached to the ambient context; it is only + tracked internally for span_id / parent_span_id resolution. """ TraceManager.init_trace(callback_context) - ambient_ctx = trace.get_current_span().get_span_context() - if ambient_ctx.is_valid: - span_id_str = format(ambient_ctx.span_id, "016x") - trace_id = format(ambient_ctx.trace_id, "032x") + span = trace.get_current_span() + + if span.get_span_context().is_valid: + span_id_str = format(span.get_span_context().span_id, "016x") else: - span_id_str = uuid.uuid4().hex[:16] - trace_id = uuid.uuid4().hex + span_id_str = uuid.uuid4().hex record = _SpanRecord( + span=span, span_id=span_id_str, - trace_id=trace_id, owns_span=False, start_time_ns=time.time_ns(), ) + records = TraceManager._get_records() - _span_records_ctx.set(list(records) + [record]) + new_records = list(records) + [record] + _span_records_ctx.set(new_records) return span_id_str @@ -844,10 +828,10 @@ def ensure_invocation_span( @staticmethod def pop_span() -> tuple[Optional[str], Optional[int]]: - """Pops the top span record from the internal stack. + """Ends the current span and pops it from the stack. - Returns ``(span_id, duration_ms)``. No OTel span is ended - because the plugin no longer creates one (see ``_SpanRecord``). + No ambient OTel context is detached because we never attached + one in the first place (see ``push_span``). """ records = _span_records_ctx.get() if not records: @@ -857,13 +841,29 @@ def pop_span() -> tuple[Optional[str], Optional[int]]: record = new_records.pop() _span_records_ctx.set(new_records) - duration_ms = int((time.time_ns() - record.start_time_ns) / 1_000_000) + # Calculate duration + duration_ms = None + otel_start = getattr(record.span, "start_time", None) + if isinstance(otel_start, (int, float)) and otel_start: + duration_ms = int((time.time_ns() - otel_start) / 1_000_000) + else: + duration_ms = int((time.time_ns() - record.start_time_ns) / 1_000_000) + + if record.owns_span: + record.span.end() + return record.span_id, duration_ms @staticmethod def clear_stack() -> None: """Clears all span records. Safety net for cross-invocation cleanup.""" - _span_records_ctx.set([]) + records = _span_records_ctx.get() + if records: + # End any owned spans to avoid OTel resource leaks. + for record in reversed(records): + if record.owns_span: + record.span.end() + _span_records_ctx.set([]) @staticmethod def get_current_span_and_parent() -> tuple[Optional[str], Optional[str]]: @@ -894,11 +894,19 @@ def get_root_agent_name() -> Optional[str]: @staticmethod def get_start_time(span_id: str) -> Optional[float]: - """Gets start time of a span by ID (seconds since epoch).""" + """Gets start time of a span by ID.""" records = _span_records_ctx.get() if records: for record in reversed(records): if record.span_id == span_id: + # Try OTel span start_time first + otel_start = getattr(record.span, "start_time", None) + if ( + record.span.get_span_context().is_valid + and isinstance(otel_start, (int, float)) + and otel_start + ): + return otel_start / 1_000_000_000.0 return record.start_time_ns / 1_000_000_000.0 return None @@ -974,19 +982,6 @@ def __init__( self._batch_processor_task: Optional[asyncio.Task] = None self._shutdown = False - # Running tally of events/rows dropped without ever being written, keyed by - # reason. Logging every drop is the only existing signal that data was lost, - # and those logs are easy to miss at volume; these counters let a host poll - # get_drop_stats() and export the loss to its own monitoring before it shows - # up as missing rows downstream. - self._dropped: dict[str, int] = { - "queue_full": 0, - "arrow_prep_failed": 0, - "retry_exhausted": 0, - "non_retryable": 0, - "unexpected_error": 0, - } - async def flush(self) -> None: """Flushes the queue by waiting for it to be empty.""" if self._queue.empty(): @@ -1008,35 +1003,7 @@ async def append(self, row: dict[str, Any]) -> None: try: self._queue.put_nowait(row) except asyncio.QueueFull: - self._dropped["queue_full"] += 1 - logger.warning( - "BigQuery log queue full, dropping event. Total events dropped" - " (queue full): %s", - self._dropped["queue_full"], - ) - - def get_drop_stats(self) -> dict[str, int]: - """Returns a snapshot of dropped-row counts keyed by reason. - - Dropped rows are logged best-effort and never written, so these counters - are the canonical signal that data was lost. Reasons: - - ``queue_full``: the in-memory queue was full when the event arrived. - ``arrow_prep_failed``: the batch could not be serialized to Arrow. - ``retry_exhausted``: the write failed after exhausting all retries. - ``non_retryable``: BigQuery returned a non-retryable error (e.g. a - schema mismatch). - ``unexpected_error``: an unexpected exception aborted the write. - - Returns: - A copy of the per-reason drop counters. - """ - return dict(self._dropped) - - @property - def dropped_event_count(self) -> int: - """Total rows dropped without being written, across all reasons.""" - return sum(self._dropped.values()) + logger.warning("BigQuery log queue full, dropping event.") def _prepare_arrow_batch(self, rows: list[dict[str, Any]]) -> pa.RecordBatch: """Prepares a PyArrow RecordBatch from a list of rows. @@ -1192,13 +1159,8 @@ async def _write_rows_with_retry(self, rows: list[dict[str, Any]]) -> None: req.arrow_rows.writer_schema.serialized_schema = serialized_schema req.arrow_rows.rows.serialized_record_batch = serialized_batch except Exception as e: - self._dropped["arrow_prep_failed"] += len(rows) logger.error( - "Failed to prepare Arrow batch (Data Loss): %s. Total rows dropped" - " (arrow prep failed): %s", - e, - self._dropped["arrow_prep_failed"], - exc_info=True, + "Failed to prepare Arrow batch (Data Loss): %s", e, exc_info=True ) return @@ -1209,21 +1171,7 @@ async def requests_iter(): yield req async def perform_write(): - # The AppendRows streaming RPC does not auto-populate the - # request-routing header, so writes to any region other than - # the US multiregion fail with a "session not found" / - # stream-not-found error. Set the routing header explicitly - # (same as google.cloud.bigquery_storage_v1.writer) so the - # request reaches the region that owns the write stream. - responses = await self.write_client.append_rows( - requests_iter(), - metadata=( - ( - "x-goog-request-params", - f"write_stream={self.write_stream}", - ), - ), - ) + responses = await self.write_client.append_rows(requests_iter()) async for response in responses: error = getattr(response, "error", None) error_code = getattr(error, "code", None) @@ -1254,7 +1202,6 @@ async def perform_write(): for row_error in row_errors: logger.error("Row error details: %s", row_error) logger.error("Row content causing error: %s", rows) - self._dropped["non_retryable"] += len(rows) return return @@ -1269,13 +1216,10 @@ async def perform_write(): ) as e: attempt += 1 if attempt > self.retry_config.max_retries: - self._dropped["retry_exhausted"] += len(rows) logger.error( - "BigQuery Batch Dropped after %s attempts. Last error: %s." - " Total rows dropped (retry exhausted): %s", + "BigQuery Batch Dropped after %s attempts. Last error: %s", self.retry_config.max_retries + 1, e, - self._dropped["retry_exhausted"], ) return @@ -1292,12 +1236,9 @@ async def perform_write(): await asyncio.sleep(sleep_time) delay *= self.retry_config.multiplier except Exception as e: - self._dropped["unexpected_error"] += len(rows) logger.error( - "Unexpected BigQuery Write API error (Dropping batch): %s." - " Total rows dropped (unexpected error): %s", + "Unexpected BigQuery Write API error (Dropping batch): %s", e, - self._dropped["unexpected_error"], exc_info=True, ) return @@ -2076,6 +2017,7 @@ def __init__( self._startup_error: Optional[Exception] = None self._is_shutting_down = False self._setup_lock = None + self._user_credentials = credentials self._credentials = credentials self.client = None self._loop_state_by_loop: dict[asyncio.AbstractEventLoop, _LoopState] = {} @@ -2194,6 +2136,10 @@ def get_credentials(): ) return creds + # Note: this read-then-write is not locked. If two event loops + # race here both will resolve ADC and write back the same creds. + # This is benign — the result is idempotent — so we accept the + # race rather than adding a lock for a one-time init path. if self._credentials is None: self._credentials = await loop.run_in_executor( self._executor, get_credentials @@ -2253,24 +2199,6 @@ async def flush(self) -> None: # No running loop or other issue pass - def get_drop_stats(self) -> dict[str, int]: - """Returns dropped-row counts aggregated across all event loops. - - Events are dropped best-effort (queue overflow, write failures), so the - loss is otherwise only visible in logs. Export these counters to your - monitoring to detect data loss before it surfaces as missing rows. See - BatchProcessor.get_drop_stats for the meaning of each reason. - - Returns: - Per-reason drop counts summed over every active loop's processor. - Empty if no processor has been created yet. - """ - totals: dict[str, int] = {} - for state in list(self._loop_state_by_loop.values()): - for reason, count in state.batch_processor.get_drop_stats().items(): - totals[reason] = totals.get(reason, 0) + count - return totals - async def _lazy_setup(self, **kwargs) -> None: """Performs lazy initialization of BigQuery clients and resources.""" if self._started: @@ -2301,13 +2229,18 @@ async def _lazy_setup(self, **kwargs) -> None: self.offloader = None if self.config.gcs_bucket_name: + # GCSOffloader always creates a storage.Client eagerly + # (line 1329: storage_client or storage.Client(...)). + # Pass credentials so it uses the same auth as the other + # clients; omit when None to let it use ADC. + gcs_kwargs = {"project": self.project_id} + if self._credentials is not None: + gcs_kwargs["credentials"] = self._credentials self.offloader = GCSOffloader( self.project_id, self.config.gcs_bucket_name, self._executor, - storage_client=storage.Client( - project=self.project_id, credentials=self._credentials - ), + storage_client=storage.Client(**gcs_kwargs), ) self.parser = HybridContentParser( @@ -2641,6 +2574,18 @@ def __getstate__(self): state["_startup_error"] = None state["_is_shutting_down"] = False state["_init_pid"] = 0 + # _credentials is always runtime-resolved; clear unconditionally. + state["_credentials"] = None + # Preserve _user_credentials if they are picklable (e.g., + # service-account, AnonymousCredentials). Drop only when + # pickle would fail (e.g., compute_engine.Credentials holding + # a requests.Session). + import pickle as _pickle + + try: + _pickle.dumps(state.get("_user_credentials")) + except Exception: + state["_user_credentials"] = None return state def __setstate__(self, state): @@ -2648,6 +2593,13 @@ def __setstate__(self, state): # Backfill keys that may be absent in pickled state from older # code versions so _ensure_started does not raise AttributeError. state.setdefault("_init_pid", 0) + state.setdefault("_user_credentials", None) + state.setdefault("_credentials", None) + # Restore _credentials from _user_credentials if available so + # _create_loop_state uses the user's identity. When both are + # None (non-picklable credentials were dropped), ADC is used. + if state["_credentials"] is None and state["_user_credentials"] is not None: + state["_credentials"] = state["_user_credentials"] self.__dict__.update(state) def _reset_runtime_state(self) -> None: @@ -2702,6 +2654,11 @@ def _reset_runtime_state(self) -> None: self._startup_error = None self._is_shutting_down = False self._init_pid = os.getpid() + # For ADC-resolved credentials, clear so they are re-resolved + # in the child process. For user-provided credentials, keep + # the original object — we cannot re-create it. The user is + # responsible for providing fork-safe credentials if needed. + self._credentials = self._user_credentials async def __aenter__(self) -> BigQueryAgentAnalyticsPlugin: await self._ensure_started() @@ -3065,7 +3022,7 @@ async def on_event_callback( callback_ctx = CallbackContext(invocation_context) # --- State delta logging --- - if event.actions.state_delta: + if event.actions and event.actions.state_delta: await self._log_event( "STATE_DELTA", callback_ctx, diff --git a/src/google/adk/plugins/debug_logging_plugin.py b/src/google/adk/plugins/debug_logging_plugin.py index 99ab7fffe5..61f9b07967 100644 --- a/src/google/adk/plugins/debug_logging_plugin.py +++ b/src/google/adk/plugins/debug_logging_plugin.py @@ -1,4 +1,4 @@ -# Copyright 2026 Google LLC +# Copyright 2025 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/google/adk/plugins/plugin_manager.py b/src/google/adk/plugins/plugin_manager.py index 5566349516..c781e8fa4e 100644 --- a/src/google/adk/plugins/plugin_manager.py +++ b/src/google/adk/plugins/plugin_manager.py @@ -85,25 +85,10 @@ def __init__( """ self.plugins: List[BasePlugin] = [] self._close_timeout = close_timeout - self._skip_closing_plugins = False if plugins: for plugin in plugins: self.register_plugin(plugin) - def set_skip_closing_plugins(self, value: bool) -> None: - """Controls whether `close()` will tear down the registered plugins. - - Set to True when the plugins are owned by another component (e.g. a parent - `Runner` whose plugin list this manager is sharing). When set, subsequent - calls to `close()` become a no-op so the shared plugins are not torn down - while still in use. - - Args: - value: True to skip closing the plugins; False (default) to close them - normally. - """ - self._skip_closing_plugins = value - def register_plugin(self, plugin: BasePlugin) -> None: """Registers a new plugin. @@ -324,19 +309,10 @@ async def _run_callbacks( async def close(self) -> None: """Calls the close method on all registered plugins concurrently. - If this manager was constructed with `skip_closing_plugins=True`, this - method is a no-op so plugins owned by another component (e.g. a parent - `Runner`) are not torn down while still in use. - Raises: RuntimeError: If one or more plugins failed to close, containing details of all failures. """ - if self._skip_closing_plugins: - logger.debug( - "Skipping plugin close; plugins are owned by another component." - ) - return exceptions = {} # We iterate sequentially to avoid creating new tasks which can cause issues # with some libraries (like anyio/mcp) that rely on task-local context. diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index 5b2f23fec7..850c26bbba 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -15,7 +15,6 @@ from __future__ import annotations import asyncio -from contextlib import aclosing import inspect import logging from pathlib import Path @@ -38,10 +37,7 @@ from .agents.invocation_context import InvocationContext from .agents.invocation_context import new_invocation_context_id from .agents.live_request_queue import LiveRequestQueue -from .agents.llm.task._finish_task_tool import FINISH_TASK_SUCCESS_RESULT -from .agents.llm.task._finish_task_tool import FINISH_TASK_TOOL_NAME from .agents.run_config import RunConfig -from .apps.app import App from .artifacts.base_artifact_service import BaseArtifactService from .auth.credential_service.base_credential_service import BaseCredentialService from .code_executors.built_in_code_executor import BuiltInCodeExecutor @@ -61,52 +57,15 @@ from .telemetry.tracing import tracer from .tools.base_toolset import BaseToolset from .utils._debug_output import print_event +from .utils.context_utils import Aclosing if TYPE_CHECKING: + from .apps.app import App from .apps.app import ResumabilityConfig logger = logging.getLogger('google_adk.' + __name__) -def _find_active_task_isolation_scope(session) -> Optional[str]: - """Walk session backwards; find the active paused task agent's scope. - - Two flavors of task scope: - * FC delegation (chat coordinator → task agent via function call): - scope = ``fc.id``, opened by an unresolved task FC. - * Workflow node (task-mode LlmAgent dispatched as a graph node): - scope = ``@``, stamped on every event the - task agent emits. - - Both close on a SUCCESSFUL ``finish_task`` FunctionResponse — - i.e., one whose response is ``FINISH_TASK_SUCCESS_RESULT``. An - error FR (validation failure) does NOT close the scope: the task - agent is still active, will see the error, and retry. Walking - backward, the first non-empty scope we encounter that hasn't been - closed by a later successful ``finish_task`` is the paused task - awaiting the user's next reply. - - Used by ``Runner._append_user_event`` to scope the new user message - to that task agent's view. - """ - finished_scopes: set[str] = set() - for event in reversed(session.events): - scope = event.isolation_scope - if not scope: - continue - if event.content and event.content.parts: - for part in event.content.parts: - fr = part.function_response - if fr and fr.name == FINISH_TASK_TOOL_NAME: - response = fr.response or {} - if response.get('result') == FINISH_TASK_SUCCESS_RESULT: - finished_scopes.add(scope) - break - if scope not in finished_scopes: - return scope - return None - - def _is_tool_call_or_response(event: Event) -> bool: return bool(event.get_function_calls() or event.get_function_responses()) @@ -170,8 +129,8 @@ class Runner: app_name: str """The app name of the runner.""" - agent: Optional[BaseAgent | 'BaseNode'] = None - """The root agent or node to run.""" + agent: BaseAgent + """The root agent to run.""" artifact_service: Optional[BaseArtifactService] = None """The artifact service for the runner.""" plugin_manager: PluginManager @@ -193,7 +152,6 @@ def __init__( app: Optional[App] = None, app_name: Optional[str] = None, agent: Optional[BaseAgent] = None, - node: Any = None, plugins: Optional[List[BasePlugin]] = None, artifact_service: Optional[BaseArtifactService] = None, session_service: BaseSessionService, @@ -204,18 +162,22 @@ def __init__( ): """Initializes the Runner. - Exactly one of `app`, `agent`, or `node` must be provided. When `agent` - or `node` is provided, the Runner wraps it into an `App` internally. - Providing `app` is the recommended way to create a runner. When `app` is - provided, `app_name` can optionally override the app's name. + Developers should provide either an `app` instance or both `app_name` and + `agent`. When `app` is provided, `app_name` can optionally override the + app's name (useful for deployment scenarios like Agent Engine where the + resource name differs from the app's identifier). However, `agent` should + not be provided when `app` is provided. Providing `app` is the recommended + way to create a runner. Args: - app: An `App` instance. Mutually exclusive with `agent` and `node`. - app_name: The application name. Required when `agent` is provided. - Optional override for `app.name` when `app` is provided. Defaults - to `node.name` when only `node` is provided. - agent: The root agent to run. Mutually exclusive with `app` and `node`. - node: The root node to run. Mutually exclusive with `app` and `agent`. + app: An optional `App` instance. If provided, `agent` should not be + specified. `app_name` can optionally override `app.name`. + app_name: The application name of the runner. Required if `app` is not + provided. If `app` is provided, this can optionally override `app.name` + (e.g., for deployment scenarios where a resource name differs from the + app identifier). + agent: The root agent to run. Required if `app` is not provided. Should + not be provided when `app` is provided. plugins: Deprecated. A list of plugins for the runner. Please use the `app` argument to provide plugins instead. artifact_service: The artifact service for the runner. @@ -228,117 +190,92 @@ def __init__( ValueError with a helpful message. Raises: - ValueError: If more than one of `app`, `agent`, or `node` is provided, - or if none is provided, or if `agent` is provided without `app_name`. + ValueError: If `app` is provided along with `agent` or `plugins`, or if + `app` is not provided but either `app_name` or `agent` is missing. """ - app = self._resolve_app(app, app_name, agent, node, plugins) - - # Extract from App — single code path. self.app = app - self.app_name = app_name or app.name - self.agent = app.root_agent - self.context_cache_config = app.context_cache_config - self.resumability_config = app.resumability_config + ( + self.app_name, + self.agent, + self.context_cache_config, + self.resumability_config, + plugins, + ) = self._validate_runner_params(app, app_name, agent, plugins) self.artifact_service = artifact_service self.session_service = session_service self.memory_service = memory_service self.credential_service = credential_service self.plugin_manager = PluginManager( - plugins=app.plugins, close_timeout=plugin_close_timeout + plugins=plugins, close_timeout=plugin_close_timeout ) self.auto_create_session = auto_create_session - if self.agent is not None: - ( - self._agent_origin_app_name, - self._agent_origin_dir, - ) = self._infer_agent_origin(self.agent) - else: - self._agent_origin_app_name = None - self._agent_origin_dir = None + ( + self._agent_origin_app_name, + self._agent_origin_dir, + ) = self._infer_agent_origin(self.agent) self._app_name_alignment_hint: Optional[str] = None self._enforce_app_name_alignment() - @staticmethod - def _resolve_app( + def _validate_runner_params( + self, app: Optional[App], app_name: Optional[str], agent: Optional[BaseAgent], - node: Any, plugins: Optional[List[BasePlugin]], - ) -> App: - """Validates inputs and normalizes to an App instance. + ) -> tuple[ + str, + BaseAgent, + Optional[ContextCacheConfig], + Optional[ResumabilityConfig], + Optional[List[BasePlugin]], + ]: + """Validates and extracts runner parameters. - Exactly one of ``app``, ``agent``, or ``node`` must be provided. - When ``agent`` or ``node`` is given, it is wrapped in a new ``App``. + Args: + app: An optional `App` instance. + app_name: The application name of the runner. Can override app.name when + app is provided. + agent: The root agent to run. + plugins: A list of plugins for the runner. Returns: - The resolved ``App`` instance. + A tuple containing (app_name, agent, context_cache_config, + resumability_config, plugins). Raises: - ValueError: If the combination of arguments is invalid. + ValueError: If parameters are invalid. """ - # Validate mutual exclusivity. - provided = sum(x is not None for x in (app, agent, node)) - if provided > 1: - raise ValueError('Only one of app, agent, or node may be provided.') - if provided == 0: - raise ValueError('One of app, agent, or node must be provided.') - - # Handle deprecated plugins argument. if plugins is not None: - if app is not None: - raise ValueError( - 'When app is provided, plugins should not be provided and should' - ' be provided in the app instead.' - ) warnings.warn( 'The `plugins` argument is deprecated. Please use the `app` argument' ' to provide plugins instead.', DeprecationWarning, ) - # Normalize to App — wrap bare agent or node. Uses model_construct to - # bypass App._validate for the legacy (app_name, agent) API, which v1 - # accepted with arbitrary names and root_agent types. Direct App(name=...) - # construction still validates strictly. - if agent is not None: - if not app_name: + if app: + if agent: + raise ValueError('When app is provided, agent should not be provided.') + if plugins: raise ValueError( - 'app_name is required when agent is provided without app.' + 'When app is provided, plugins should not be provided and should be' + ' provided in the app instead.' ) - return App.model_construct( - name=app_name, root_agent=agent, plugins=plugins or [] - ) - if node is not None: - return App.model_construct( - name=app_name or getattr(node, 'name', 'default'), - root_agent=node, - plugins=plugins or [], + # Allow app_name to override app.name (useful for deployment scenarios + # like Agent Engine where resource names differ from app identifiers) + app_name = app_name or app.name + agent = app.root_agent + plugins = app.plugins + context_cache_config = app.context_cache_config + resumability_config = app.resumability_config + elif not app_name or not agent: + raise ValueError( + 'Either app or both app_name and agent must be provided.' ) - return app + else: + context_cache_config = None + resumability_config = None - @staticmethod - def _validate_runner_params( - app: Optional[App], - app_name: Optional[str], - agent: Optional[BaseAgent], - plugins: Optional[List[BasePlugin]], - ) -> tuple[ - str, - BaseAgent, - Optional[ContextCacheConfig], - Optional[ResumabilityConfig], - Optional[List[BasePlugin]], - ]: - """Deprecated: use _resolve_app instead.""" - resolved = Runner._resolve_app(app, app_name, agent, None, plugins) - return ( - app_name or resolved.name, - resolved.root_agent, - resolved.context_cache_config, - resolved.resumability_config, - plugins if app is None else resolved.plugins, - ) + return app_name, agent, context_cache_config, resumability_config, plugins def _infer_agent_origin( self, agent: BaseAgent @@ -454,391 +391,6 @@ def _format_session_not_found_message(self, session_id: str) -> str: 'auto_create_session=True when constructing the runner.' ) - async def _run_node_async( - self, - *, - user_id: str, - session_id: str, - invocation_id: Optional[str] = None, - new_message: Optional[types.Content] = None, - state_delta: Optional[dict[str, Any]] = None, - run_config: Optional[RunConfig] = None, - yield_user_message: bool = False, - node: Optional['BaseNode'] = None, - ) -> AsyncGenerator[Event, None]: - """Run a BaseNode through NodeRunner. - - Events flow through ic._event_queue via NodeRunner. - """ - from .workflow._node_runner import NodeRunner - - with tracer.start_as_current_span('invocation'): - # 1. Setup - session = await self._get_or_create_session( - user_id=user_id, session_id=session_id - ) - - # Validate and resolve resume inputs - resume_inputs = self._extract_resume_inputs(new_message) - self._validate_new_message(new_message, resume_inputs) - - if not invocation_id and new_message: - invocation_id = self._resolve_invocation_id_from_fr( - session, new_message - ) - - ic = self._new_invocation_context( - session, - new_message=new_message, - run_config=run_config or RunConfig(), - invocation_id=invocation_id, - ) - ic._event_queue = asyncio.Queue() - - # 2. Append user message to session and resolve node_input - node_input = None - if resume_inputs or invocation_id: - # Resume: recover the original user content. new_message here is a - # function response (or None), so it can't populate user_content. - node_input = self._find_original_user_content( - ic.session, ic.invocation_id - ) - if node_input: - ic.user_content = node_input - if not node_input: - # Fresh: use user message as node_input - node_input = new_message - - # Run callbacks on user message - if new_message: - modified_user_message = ( - await ic.plugin_manager.run_on_user_message_callback( - invocation_context=ic, user_message=new_message - ) - ) - if modified_user_message is not None: - new_message = modified_user_message - ic.user_content = new_message - - # Append user message to session for history - if new_message: - user_event = await self._append_user_event( - ic, new_message, state_delta=state_delta - ) - if yield_user_message and user_event: - yield user_event - - # Run before_run callbacks - await ic.plugin_manager.run_before_run_callback(invocation_context=ic) - - # 3. Start root node in background - from .agents.base_agent import BaseAgent - from .agents.context import Context - from .workflow._dynamic_node_scheduler import DynamicNodeScheduler - from .workflow._workflow import _LoopState - - root_ctx = Context(ic) - root_agent = node or self.agent - is_agent = isinstance(self.agent, BaseAgent) - has_sub_agents = is_agent and bool( - getattr(self.agent, 'sub_agents', None) - ) - use_scheduler = is_agent and has_sub_agents - - # The root chat coordinator's isolation_scope stays None: its own - # events (FCs, text, synthesized FRs from completed task - # delegations) are also unscoped, so the content-builder's - # isolation_scope filter lets the coordinator see all of them - # across user turns. Task sub-agents are scoped under their - # originating function-call id and so remain invisible to the - # coordinator's view. - - if not use_scheduler: - root_node_runner = NodeRunner(node=root_agent, parent_ctx=root_ctx) - - done_sentinel = object() - - async def _drive_root_node(): - try: - if use_scheduler: - # Rehydration warning: DynamicNodeScheduler relies on session.events scanning. - # Stateful live EUC/LRO streams may rehydrate freshly if not yet persisted. - scheduler = DynamicNodeScheduler(state=_LoopState()) - root_ctx._workflow_scheduler = scheduler - ctx = await scheduler( - root_ctx, - root_agent, - node_input, - run_id='1', - ) - else: - ctx = await root_node_runner.run( - node_input=node_input, - resume_inputs=resume_inputs, - ) - if ctx.error: - raise ctx.error - finally: - await ic._event_queue.put((done_sentinel, None)) - - task = asyncio.create_task(_drive_root_node()) - - # 4. Main loop: consume events, persist, yield - try: - async with aclosing( - self._consume_event_queue(ic, done_sentinel) - ) as agen: - async for event in agen: - yield event - finally: - await self._cleanup_root_task(task, self.agent.name) - await ic.plugin_manager.run_after_run_callback(invocation_context=ic) - if self.app and self.app.events_compaction_config: - logger.debug('Running event compactor.') - from google.adk.apps.compaction import _run_compaction_for_sliding_window - - await _run_compaction_for_sliding_window( - self.app, - session, - self.session_service, - skip_token_compaction=ic.token_compaction_checked, - ) - - async def _run_node_live( - self, - *, - session: Session, - live_request_queue: LiveRequestQueue, - run_config: Optional[RunConfig] = None, - ) -> AsyncGenerator[Event, None]: - """Run a non-agent BaseNode in live mode.""" - from .agents.context import Context - from .workflow._dynamic_node_scheduler import DynamicNodeScheduler - from .workflow._node_runner import NodeRunner - from .workflow._workflow import _LoopState - from .workflow._workflow import Workflow - - ic = self._new_invocation_context_for_live( - session, - live_request_queue=live_request_queue, - run_config=run_config or RunConfig(), - ) - ic._event_queue = asyncio.Queue() - - root_ctx = Context(ic) - root_agent = self.agent - is_workflow = isinstance(root_agent, Workflow) - - if not is_workflow: - root_node_runner = NodeRunner(node=root_agent, parent_ctx=root_ctx) - - done_sentinel = object() - - async def _drive_root_node(): - try: - if is_workflow: - scheduler = DynamicNodeScheduler(state=_LoopState()) - root_ctx._workflow_scheduler = scheduler - ctx = await scheduler( - root_ctx, - root_agent, - None, - run_id='1', - ) - else: - ctx = await root_node_runner.run( - node_input=None, - ) - if ctx.error: - raise ctx.error - finally: - await ic._event_queue.put((done_sentinel, None)) - - task = asyncio.create_task(_drive_root_node()) - - try: - async with aclosing(self._consume_event_queue(ic, done_sentinel)) as agen: - async for event in agen: - yield event - finally: - await self._cleanup_root_task(task, self.agent.name) - - def _extract_resume_inputs( - self, message: Optional[types.Content] - ) -> dict[str, Any] | None: - """Extract function response payloads from a message as resume_inputs.""" - if not message or not message.parts: - return None - inputs = {} - for part in message.parts: - if part.function_response and part.function_response.id: - inputs[part.function_response.id] = part.function_response.response - return inputs or None - - def _validate_new_message( - self, - message: Optional[types.Content], - resume_inputs: dict[str, Any] | None, - ) -> None: - """Validate that new_message doesn't mix FR and text parts.""" - if not resume_inputs or not message or not message.parts: - return - if any(p.text for p in message.parts): - raise ValueError( - 'Message cannot contain both function responses and text.' - ' Function responses resume an existing invocation while' - ' text starts a new one.' - ) - - def _resolve_invocation_id_from_fr( - self, - session: Session, - new_message: types.Content, - ) -> Optional[str]: - """Infer invocation_id by matching function responses to FC events. - - Raises ValueError if responses resolve to different invocations. - """ - fr_ids = { - p.function_response.id - for p in new_message.parts or [] - if p.function_response and p.function_response.id - } - if not fr_ids: - return None - - # Find invocation_id for each FR by matching its FC in session - invocation_ids = set() - for event in reversed(session.events): - for fc in event.get_function_calls(): - if fc.id in fr_ids: - invocation_ids.add(event.invocation_id) - fr_ids.discard(fc.id) - if not fr_ids: - break - - if fr_ids: - raise ValueError( - f'Function call not found for function response ids: {fr_ids}.' - ) - if len(invocation_ids) > 1: - raise ValueError( - 'Function responses resolve to multiple' - f' invocations: {invocation_ids}.' - ) - return invocation_ids.pop() - - async def _append_user_event( - self, - ic: InvocationContext, - content: types.Content, - *, - state_delta: Optional[dict[str, Any]] = None, - ) -> Event: - """Append a user message event to the session and return it.""" - if state_delta: - event = Event( - invocation_id=ic.invocation_id, - author='user', - actions=EventActions(state_delta=state_delta), - content=content, - ) - else: - event = Event( - invocation_id=ic.invocation_id, - author='user', - content=content, - ) - # when a paused task delegation is in flight, stamp - # the new user message with that task's isolation_scope so the - # task agent's content-build (scoped to ) sees it. - if event.isolation_scope is None: - iso = _find_active_task_isolation_scope(ic.session) - if iso is not None: - event.isolation_scope = iso - return await self.session_service.append_event( - session=ic.session, event=event - ) - - def _find_original_user_content( - self, session: Session, invocation_id: str - ) -> types.Content | None: - """Find the original user text message for a given invocation_id.""" - for event in session.events: - if ( - event.invocation_id == invocation_id - and event.author == 'user' - and event.content - and event.content.parts - and any(p.text for p in event.content.parts) - ): - return event.content - return None - - async def _consume_event_queue( - self, ic: InvocationContext, done_sentinel: object - ) -> AsyncGenerator[Event, None]: - """Consume events from ic._event_queue until done_sentinel.""" - while True: - event_or_done, processed_signal = await ic._event_queue.get() - if event_or_done is done_sentinel: - break - event: Event = event_or_done - # When an LlmAgent node uses ``message_as_output`` (no - # ``output_schema``), the wrapper sets both ``event.content`` - # (the model's text) AND ``event.output`` (the same text) to - # signal that the message IS the node's output. Clear - # ``event.output`` on a copy here so downstream renderers don't - # surface the same text twice. Task-mode agents set - # ``event.output`` from the ``finish_task`` FC args without - # ``message_as_output``, so this clearing doesn't affect them. - if not event.partial: - if event.node_info.message_as_output and event.content is not None: - event = event.model_copy() - event.output = None - - _apply_run_config_custom_metadata(event, ic.run_config) - modified_event = await ic.plugin_manager.run_on_event_callback( - invocation_context=ic, event=event - ) - output_event = self._get_output_event( - original_event=event, - modified_event=modified_event, - run_config=ic.run_config, - ) - - if not event.partial: - await self.session_service.append_event( - session=ic.session, event=output_event - ) - yield output_event - - if isinstance(processed_signal, asyncio.Event): - processed_signal.set() - - async def _cleanup_root_task( - self, task: asyncio.Task, node_name: str - ) -> None: - """Cancel the root task if still running, then await it. - - The task may still be running if the caller stopped iterating - early (e.g., break in async for). In that case we must cancel - to avoid a leaked task. - """ - if not task.done(): - logger.debug( - 'Cancelling root node %s (caller stopped early).', - node_name, - ) - task.cancel() - try: - await task - except asyncio.CancelledError: - logger.warning('Root node %s was cancelled.', node_name) - except Exception: - logger.error('Root node %s failed.', node_name, exc_info=True) - raise - async def _get_or_create_session( self, *, @@ -914,7 +466,7 @@ def run( async def _invoke_run_async(): try: - async with aclosing( + async with Aclosing( self.run_async( user_id=user_id, session_id=session_id, @@ -955,7 +507,6 @@ async def run_async( new_message: Optional[types.Content] = None, state_delta: Optional[dict[str, Any]] = None, run_config: Optional[RunConfig] = None, - yield_user_message: bool = False, ) -> AsyncGenerator[Event, None]: """Main entry method to run the agent in this runner. @@ -973,8 +524,6 @@ async def run_async( new_message: A new message to append to the session. state_delta: Optional state changes to apply to the session. run_config: The run config for the agent. - yield_user_message: If True, yield the user message event before - agent/node events. Yields: The events generated by the agent. @@ -988,73 +537,6 @@ async def run_async( if new_message and not new_message.role: new_message.role = 'user' - from .agents.llm_agent import LlmAgent - from .workflow._base_node import BaseNode - - if isinstance(self.agent, LlmAgent): - if self.agent.mode is None: - # LlmAgent as root agent must have chat mode. - self.agent.mode = 'chat' - - if self.agent.mode == 'chat': - session = await self._get_or_create_session( - user_id=user_id, session_id=session_id - ) - # when the chat coordinator has task-mode sub-agents, - # the wrapper handles delegation via ctx.run_node. Don't let - # the legacy sub-agent picker bypass the coordinator on resume. - has_task_subagent = any( - isinstance(sa, LlmAgent) and getattr(sa, 'mode', None) == 'task' - for sa in self.agent.sub_agents or [] - ) - if has_task_subagent: - agent_to_run = self.agent - else: - agent_to_run = self._find_agent_to_run(session, self.agent) - from .workflow.utils._workflow_graph_utils import build_node # pylint: disable=g-import-not-at-top - - agent_to_run = build_node(agent_to_run) - else: - raise ValueError( - "LlmAgent as root agent must have mode='chat', but got" - f" mode='{self.agent.mode}'." - ) - async with aclosing( - self._run_node_async( - user_id=user_id, - session_id=session_id, - invocation_id=invocation_id, - new_message=new_message, - state_delta=state_delta, - run_config=run_config, - yield_user_message=yield_user_message, - node=agent_to_run, - ) - ) as agen: - async for event in agen: - yield event - return - - # TODO: remove `not isinstance(self.agent, BaseAgent)` after all agents are - # refactored to use the node runtime path (requires adding tracing and plugins to it). - if isinstance(self.agent, BaseNode) and not isinstance( - self.agent, BaseAgent - ): - async with aclosing( - self._run_node_async( - user_id=user_id, - session_id=session_id, - invocation_id=invocation_id, - new_message=new_message, - state_delta=state_delta, - run_config=run_config, - yield_user_message=yield_user_message, - ) - ) as agen: - async for event in agen: - yield event - return - async def _run_with_trace( new_message: Optional[types.Content] = None, invocation_id: Optional[str] = None, @@ -1118,11 +600,11 @@ async def _run_with_trace( return async def execute(ctx: InvocationContext) -> AsyncGenerator[Event]: - async with aclosing(ctx.agent.run_async(ctx)) as agen: + async with Aclosing(ctx.agent.run_async(ctx)) as agen: async for event in agen: yield event - async with aclosing( + async with Aclosing( self._exec_with_plugin( invocation_context=invocation_context, session=invocation_context.session, @@ -1146,7 +628,7 @@ async def execute(ctx: InvocationContext) -> AsyncGenerator[Event]: skip_token_compaction=invocation_context.token_compaction_checked, ) - async with aclosing(_run_with_trace(new_message, invocation_id)) as agen: + async with Aclosing(_run_with_trace(new_message, invocation_id)) as agen: async for event in agen: yield event @@ -1407,7 +889,7 @@ async def _exec_with_plugin( buffered_events: list[Event] = [] is_transcribing: bool = False - async with aclosing(execute_fn(invocation_context)) as agen: + async with Aclosing(execute_fn(invocation_context)) as agen: async for event in agen: _apply_run_config_custom_metadata( event, invocation_context.run_config @@ -1641,23 +1123,6 @@ async def run_live( session_id=session_id, get_session_config=run_config.get_session_config, ) - - from .agents.base_agent import BaseAgent - from .workflow._base_node import BaseNode - - if isinstance(self.agent, BaseNode) and not isinstance( - self.agent, BaseAgent - ): - async with aclosing( - self._run_node_live( - session=session, - live_request_queue=live_request_queue, - run_config=run_config, - ) - ) as agen: - async for event in agen: - yield event - return invocation_context = self._new_invocation_context_for_live( session, live_request_queue=live_request_queue, @@ -1670,11 +1135,11 @@ async def run_live( ) async def execute(ctx: InvocationContext) -> AsyncGenerator[Event]: - async with aclosing(ctx.agent.run_live(ctx)) as agen: + async with Aclosing(ctx.agent.run_live(ctx)) as agen: async for event in agen: yield event - async with aclosing( + async with Aclosing( self._exec_with_plugin( invocation_context=invocation_context, session=invocation_context.session, @@ -1698,8 +1163,6 @@ def _find_agent_to_run( - An LlmAgent who replied last and is capable to transfer to any other agent in the agent hierarchy. - TODO: use wait_for_output to decide the agent to run - Args: session: The session to find the agent for. root_agent: The root agent of the runner. @@ -1708,35 +1171,13 @@ def _find_agent_to_run( The agent to run. (the active agent that should reply to the latest user message) """ - # Mesh and Workflow Agents handle their own internal routing. - # Workflow will figure which node is interrupted and should be resumed. - from .workflow._workflow import Workflow - - if isinstance(root_agent, Workflow): - return root_agent - # If the last event is a function response, should send this response to # the agent that returned the corresponding function call regardless the # type of the agent. e.g. a remote a2a agent may surface a credential # request as a special long-running function tool call. event = find_matching_function_call(session.events) - is_resumable = ( - self.resumability_config and self.resumability_config.is_resumable - ) - # Only route based on a past function response if resumability is enabled. - # In non-resumable scenarios, a turn ending with function call response - # shouldn't trap the next turn on that same agent if it's not transferable. - # Falling through allows it to return to root. - if event and event.author and is_resumable: - # `find_agent` returns None when the author does not correspond to any - # agent in the current hierarchy (e.g. the author is "user" or a stale or - # foreign agent name carried over from a previous turn/session). Returning - # None here would propagate to `build_node`, raising a confusing - # "Invalid node type: " error. Fall through to the - # event-scan logic below (which ultimately falls back to the root agent) - # whenever the author cannot be resolved. - if (resumed_agent := root_agent.find_agent(event.author)) is not None: - return resumed_agent + if event and event.author: + return root_agent.find_agent(event.author) def _event_filter(event: Event) -> bool: """Filters out user-authored events and agent state change events.""" @@ -1758,8 +1199,7 @@ def _event_filter(event: Event) -> bool: event.id, ) continue - transferable = self._is_transferable_across_agent_tree(agent) - if transferable: + if self._is_transferable_across_agent_tree(agent): return agent # Falls back to root agent if no suitable agents are found in the session. return root_agent @@ -1866,9 +1306,9 @@ async def run_debug( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not quiet: - logger.info('Created new session: %s', session_id) + print(f'\n ### Created new session: {session_id}') elif not quiet: - logger.info('Continue session: %s', session_id) + print(f'\n ### Continue session: {session_id}') collected_events: list[Event] = [] @@ -1877,21 +1317,18 @@ async def run_debug( for message in user_messages: if not quiet: - logger.info('User > %s', message) + print(f'\nUser > {message}') - async with aclosing( - self.run_async( - user_id=user_id, - session_id=session.id, - new_message=types.UserContent(parts=[types.Part(text=message)]), - run_config=run_config, - ) - ) as agen: - async for event in agen: - if not quiet: - print_event(event, verbose=verbose) + async for event in self.run_async( + user_id=user_id, + session_id=session.id, + new_message=types.UserContent(parts=[types.Part(text=message)]), + run_config=run_config, + ): + if not quiet: + print_event(event, verbose=verbose) - collected_events.append(event) + collected_events.append(event) return collected_events @@ -2064,7 +1501,7 @@ def _new_invocation_context( self.app.events_compaction_config if self.app else None ), invocation_id=invocation_id, - agent=self.agent if isinstance(self.agent, BaseAgent) else None, + agent=self.agent, session=session, user_content=new_message, live_request_queue=live_request_queue, @@ -2084,7 +1521,7 @@ def _new_invocation_context_for_live( # For live multi-agents system, we need model's text transcription as # context for the transferred agent. - if hasattr(self.agent, 'sub_agents') and self.agent.sub_agents: + if self.agent.sub_agents: if 'AUDIO' in run_config.response_modalities: if not run_config.output_audio_transcription: run_config.output_audio_transcription = ( @@ -2144,9 +1581,8 @@ def _collect_toolset(self, agent: BaseAgent) -> set[BaseToolset]: for tool_union in agent.tools: if isinstance(tool_union, BaseToolset): toolsets.add(tool_union) - if hasattr(agent, 'sub_agents'): - for sub_agent in agent.sub_agents: - toolsets.update(self._collect_toolset(sub_agent)) + for sub_agent in agent.sub_agents: + toolsets.update(self._collect_toolset(sub_agent)) return toolsets async def _cleanup_toolsets(self, toolsets_to_close: set[BaseToolset]): @@ -2183,8 +1619,7 @@ async def close(self): """Closes the runner.""" logger.info('Closing runner...') # Close Toolsets - if self.agent is not None: - await self._cleanup_toolsets(self._collect_toolset(self.agent)) + await self._cleanup_toolsets(self._collect_toolset(self.agent)) # Close Plugins if self.plugin_manager: @@ -2228,7 +1663,6 @@ def __init__( self, agent: Optional[BaseAgent] = None, *, - node: Any = None, app_name: Optional[str] = None, plugins: Optional[list[BasePlugin]] = None, app: Optional[App] = None, @@ -2238,7 +1672,6 @@ def __init__( Args: agent: The root agent to run. - node: The root node to run. app_name: The application name of the runner. Defaults to 'InMemoryRunner'. plugins: Optional list of plugins for the runner. @@ -2254,7 +1687,6 @@ def __init__( super().__init__( app_name=app_name, agent=agent, - node=node, artifact_service=InMemoryArtifactService(), plugins=plugins, app=app, diff --git a/src/google/adk/sessions/__init__.py b/src/google/adk/sessions/__init__.py index 3f3c9db651..db983f96f1 100644 --- a/src/google/adk/sessions/__init__.py +++ b/src/google/adk/sessions/__init__.py @@ -17,11 +17,9 @@ import importlib from typing import TYPE_CHECKING -from ..utils._dependency import missing_extra from .base_session_service import BaseSessionService from .session import Session from .state import State -from .state import StateSchemaError if TYPE_CHECKING: from .database_session_service import DatabaseSessionService @@ -34,7 +32,6 @@ 'InMemorySessionService', 'Session', 'State', - 'StateSchemaError', 'VertexAiSessionService', ] @@ -52,6 +49,9 @@ def __getattr__(name: str): try: module = importlib.import_module(f'{__name__}.database_session_service') except ImportError as e: - raise missing_extra('sqlalchemy', 'db') from e + raise ImportError( + 'DatabaseSessionService requires sqlalchemy>=2.0, please ensure it' + ' is installed correctly.' + ) from e return vars(module)['DatabaseSessionService'] raise AttributeError(f'module {__name__!r} has no attribute {name!r}') diff --git a/src/google/adk/sessions/base_session_service.py b/src/google/adk/sessions/base_session_service.py index 06eb6a2534..324abe230b 100644 --- a/src/google/adk/sessions/base_session_service.py +++ b/src/google/adk/sessions/base_session_service.py @@ -111,46 +111,6 @@ async def delete_session( ) -> None: """Deletes a session.""" - async def get_user_state( - self, *, app_name: str, user_id: str - ) -> dict[str, Any]: - """Returns the user-scoped state for the given app and user. - - User state is keyed by ``(app_name, user_id)`` and shared across all - sessions of the same user within the same app. The returned dictionary - uses raw keys **without** the ``user:`` prefix (e.g. ``"my_key"`` rather - than ``"user:my_key"``). - - This method exists so that callers can read user state without holding an - active ``session_id``. A common use case is bootstrapping context at the - start of a new session before calling ``create_session``, which would - otherwise require an expensive ``list_sessions`` call just to access - user-scoped data. - - Returns an empty dict when no user state has been stored for this - ``(app_name, user_id)`` combination. - - Args: - app_name: The name of the app. - user_id: The ID of the user. - - Returns: - A dictionary of raw (un-prefixed) user-scoped key/value pairs, or an - empty dict when no user state exists. - - Raises: - NotImplementedError: When the concrete ``BaseSessionService`` - implementation does not support reading user state independently of a - session. Callers should catch this, then enumerate sessions via - ``list_sessions`` and call ``get_session`` on each result to access - the merged state, or accept that user state is unavailable. - """ - raise NotImplementedError( - f'{type(self).__name__} does not support get_user_state. ' - 'To read user state, enumerate sessions via list_sessions and ' - 'call get_session on each result to access the merged state.' - ) - async def append_event(self, session: Session, event: Event) -> Event: """Appends an event to a session object.""" if event.partial: diff --git a/src/google/adk/sessions/database_session_service.py b/src/google/adk/sessions/database_session_service.py index 2fdd673334..d033f1f234 100644 --- a/src/google/adk/sessions/database_session_service.py +++ b/src/google/adk/sessions/database_session_service.py @@ -26,23 +26,19 @@ from typing import TypeVar from google.adk.platform import time as platform_time - -try: - from sqlalchemy import delete - from sqlalchemy import event - from sqlalchemy import MetaData - from sqlalchemy import select - from sqlalchemy.engine import Connection - from sqlalchemy.engine import make_url - from sqlalchemy.exc import ArgumentError - from sqlalchemy.exc import IntegrityError - from sqlalchemy.ext.asyncio import async_sessionmaker - from sqlalchemy.ext.asyncio import AsyncEngine - from sqlalchemy.ext.asyncio import AsyncSession as DatabaseSessionFactory - from sqlalchemy.ext.asyncio import create_async_engine - from sqlalchemy.pool import StaticPool -except ImportError: - pass +from sqlalchemy import delete +from sqlalchemy import event +from sqlalchemy import MetaData +from sqlalchemy import select +from sqlalchemy.engine import Connection +from sqlalchemy.engine import make_url +from sqlalchemy.exc import ArgumentError +from sqlalchemy.exc import IntegrityError +from sqlalchemy.ext.asyncio import async_sessionmaker +from sqlalchemy.ext.asyncio import AsyncEngine +from sqlalchemy.ext.asyncio import AsyncSession as DatabaseSessionFactory +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy.pool import StaticPool from typing_extensions import override from . import _session_util @@ -197,13 +193,6 @@ def __init__(self, db_url: str, **kwargs: Any): # 1. Create DB engine for db connection # 2. Create all tables based on schema # 3. Initialize all properties - try: - import sqlalchemy - except ImportError as e: - from ..utils._dependency import missing_extra - - raise missing_extra("sqlalchemy", "db") from e - try: engine_kwargs = dict(kwargs) url = make_url(db_url) @@ -329,7 +318,7 @@ async def _with_session_lock( else: self._session_lock_ref_count[lock_key] = remaining - async def _prepare_tables(self) -> None: + async def _prepare_tables(self): """Ensure database tables are ready for use. This method is called lazily before each database operation. It checks the @@ -627,22 +616,6 @@ async def delete_session( await sql_session.execute(stmt) await sql_session.commit() - @override - async def get_user_state( - self, *, app_name: str, user_id: str - ) -> dict[str, Any]: - await self._prepare_tables() - schema = self._get_schema_classes() - async with self._rollback_on_exception_session( - read_only=True - ) as sql_session: - storage_user_state = await sql_session.get( - schema.StorageUserState, (app_name, user_id) - ) - if storage_user_state is None: - return {} - return dict(storage_user_state.state or {}) - @override async def append_event(self, session: Session, event: Event) -> Event: await self._prepare_tables() @@ -662,7 +635,11 @@ async def append_event(self, session: Session, event: Event) -> Event: is_sqlite = self.db_engine.dialect.name == _SQLITE_DIALECT use_row_level_locking = self._supports_row_level_locking() - state_delta = event.actions.state_delta if event.actions.state_delta else {} + state_delta = ( + event.actions.state_delta + if event.actions and event.actions.state_delta + else {} + ) state_deltas = _session_util.extract_state_delta(state_delta) has_app_delta = bool(state_deltas["app"]) has_user_delta = bool(state_deltas["user"]) diff --git a/src/google/adk/sessions/in_memory_session_service.py b/src/google/adk/sessions/in_memory_session_service.py index 73a54f398b..b8f6cfab46 100644 --- a/src/google/adk/sessions/in_memory_session_service.py +++ b/src/google/adk/sessions/in_memory_session_service.py @@ -312,12 +312,6 @@ def _delete_session_impl( self.sessions[app_name][user_id].pop(session_id) - @override - async def get_user_state( - self, *, app_name: str, user_id: str - ) -> dict[str, Any]: - return dict(self.user_state.get(app_name, {}).get(user_id, {})) - @override async def append_event(self, session: Session, event: Event) -> Event: if event.partial: diff --git a/src/google/adk/sessions/migration/_schema_check_utils.py b/src/google/adk/sessions/migration/_schema_check_utils.py index 8a72c0fd2c..a6bc8a546a 100644 --- a/src/google/adk/sessions/migration/_schema_check_utils.py +++ b/src/google/adk/sessions/migration/_schema_check_utils.py @@ -17,12 +17,9 @@ import logging -try: - from sqlalchemy import create_engine as create_sync_engine - from sqlalchemy import inspect - from sqlalchemy import text -except ImportError: - pass +from sqlalchemy import create_engine as create_sync_engine +from sqlalchemy import inspect +from sqlalchemy import text logger = logging.getLogger("google_adk." + __name__) diff --git a/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py b/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py index 65a78c9401..a6d1ad2a78 100644 --- a/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py +++ b/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py @@ -18,7 +18,6 @@ import argparse from datetime import datetime from datetime import timezone -import io import json import logging import pickle @@ -38,93 +37,6 @@ logger = logging.getLogger("google_adk." + __name__) -_ALLOWED_PICKLE_GLOBALS: set[tuple[str, str]] = { - # Builtin containers/primitives. - ("builtins", "dict"), - ("builtins", "list"), - ("builtins", "set"), - ("builtins", "tuple"), - ("builtins", "str"), - ("builtins", "bytes"), - ("builtins", "bytearray"), - ("builtins", "int"), - ("builtins", "float"), - ("builtins", "bool"), - ("datetime", "datetime"), - ("datetime", "timedelta"), - ("datetime", "timezone"), - # Expected pickled payload for v0 session schema events. - ("fastapi.openapi.models", "APIKey"), - ("fastapi.openapi.models", "APIKeyIn"), - ("fastapi.openapi.models", "HTTPBase"), - ("fastapi.openapi.models", "HTTPBearer"), - ("fastapi.openapi.models", "OAuth2"), - ("fastapi.openapi.models", "OAuthFlow"), - ("fastapi.openapi.models", "OAuthFlowAuthorizationCode"), - ("fastapi.openapi.models", "OAuthFlowClientCredentials"), - ("fastapi.openapi.models", "OAuthFlowImplicit"), - ("fastapi.openapi.models", "OAuthFlowPassword"), - ("fastapi.openapi.models", "OAuthFlows"), - ("fastapi.openapi.models", "OpenIdConnect"), - ("fastapi.openapi.models", "SecurityBase"), - ("fastapi.openapi.models", "SecurityScheme"), - ("fastapi.openapi.models", "SecuritySchemeType"), - ("google.adk.auth.auth_credential", "AuthCredential"), - ("google.adk.auth.auth_credential", "AuthCredentialTypes"), - ("google.adk.auth.auth_credential", "HttpAuth"), - ("google.adk.auth.auth_credential", "HttpCredentials"), - ("google.adk.auth.auth_credential", "OAuth2Auth"), - ("google.adk.auth.auth_credential", "ServiceAccountCredential"), - ("google.adk.auth.auth_schemes", "CustomAuthScheme"), - ("google.adk.auth.auth_schemes", "ExtendedOAuth2"), - ("google.adk.auth.auth_schemes", "OAuthGrantType"), - ("google.adk.auth.auth_schemes", "OpenIdConnectWithConfig"), - ("google.adk.auth.auth_tool", "AuthConfig"), - ("google.adk.events.event_actions", "EventActions"), - ("google.adk.events.event_actions", "EventCompaction"), - ("google.adk.events.ui_widget", "UiWidget"), - ("google.adk.tools.tool_confirmation", "ToolConfirmation"), - ("google.genai.types", "Blob"), - ("google.genai.types", "CodeExecutionResult"), - ("google.genai.types", "Content"), - ("google.genai.types", "ExecutableCode"), - ("google.genai.types", "FileData"), - ("google.genai.types", "FunctionCall"), - ("google.genai.types", "FunctionResponse"), - ("google.genai.types", "FunctionResponseBlob"), - ("google.genai.types", "FunctionResponseFileData"), - ("google.genai.types", "FunctionResponsePart"), - ("google.genai.types", "Part"), - ("google.genai.types", "PartMediaResolution"), - ("google.genai.types", "VideoMetadata"), -} - - -class _RestrictedUnpickler(pickle.Unpickler): - """Restricted unpickler for migrating legacy v0 schema actions. - - The v0 session schema stored `EventActions` as a pickled blob. During - migration we treat the raw bytes read from the source DB as untrusted input - and only allow the minimum set of safe globals needed to reconstruct - `EventActions`. - """ - - def find_class(self, module: str, name: str) -> Any: # noqa: ANN001 - if (module, name) in _ALLOWED_PICKLE_GLOBALS: - return super().find_class(module, name) - raise pickle.UnpicklingError( - f"Blocked global during migration unpickle: {module}.{name}" - ) - - -def _restricted_pickle_loads( - data: bytes, *, allow_unsafe_unpickling: bool = False -) -> Any: - """Load a pickle payload using the restricted unpickler by default.""" - if allow_unsafe_unpickling: - return pickle.loads(data) - return _RestrictedUnpickler(io.BytesIO(data)).load() - def _to_datetime_obj(val: Any) -> datetime | Any: """Converts string to datetime if needed.""" @@ -139,9 +51,7 @@ def _to_datetime_obj(val: Any) -> datetime | Any: return val -def _row_to_event( - row: dict[str, Any], *, allow_unsafe_unpickling: bool = False -) -> Event: +def _row_to_event(row: dict) -> Event: """Converts event row (dict) to event object, handling missing columns and deserializing.""" actions_val = row.get("actions") @@ -149,9 +59,7 @@ def _row_to_event( if actions_val is not None: try: if isinstance(actions_val, bytes): - actions = _restricted_pickle_loads( - actions_val, allow_unsafe_unpickling=allow_unsafe_unpickling - ) + actions = pickle.loads(actions_val) else: # for spanner - it might return object directly actions = actions_val except Exception as e: @@ -167,7 +75,8 @@ def _row_to_event( else: actions = EventActions() - def _safe_json_load(val: Any) -> dict[str, Any] | None: + def _safe_json_load(val): + data = None if isinstance(val, str): try: data = json.loads(val) @@ -175,17 +84,8 @@ def _safe_json_load(val: Any) -> dict[str, Any] | None: logger.warning(f"Failed to decode JSON for event {row.get('id')}") return None elif isinstance(val, dict): - return val # for postgres JSONB - else: - return None - - if isinstance(data, dict): - return data - logger.warning( - f"Expected JSON object for event {row.get('id')}, got" - f" {type(data).__name__}." - ) - return None + data = val # for postgres JSONB + return data content_dict = _safe_json_load(row.get("content")) grounding_metadata_dict = _safe_json_load(row.get("grounding_metadata")) @@ -247,31 +147,23 @@ def _safe_json_load(val: Any) -> dict[str, Any] | None: ) -def _get_state_dict(state_val: Any) -> dict[str, Any]: +def _get_state_dict(state_val: Any) -> dict: """Safely load dict from JSON string or return dict if already dict.""" if isinstance(state_val, dict): return state_val if isinstance(state_val, str): try: - data = json.loads(state_val) + return json.loads(state_val) except json.JSONDecodeError: logger.warning( "Failed to parse state JSON string, defaulting to empty dict." ) return {} - if isinstance(data, dict): - return data - logger.warning("State JSON was not an object, defaulting to empty dict.") - return {} return {} # --- Migration Logic --- -def migrate( - source_db_url: str, - dest_db_url: str, - allow_unsafe_unpickling: bool = False, -) -> None: +def migrate(source_db_url: str, dest_db_url: str): """Migrates data from old pickle schema to new JSON schema.""" # Convert async driver URLs to sync URLs for SQLAlchemy's synchronous engine. # This allows users to provide URLs like 'postgresql+asyncpg://...' and have @@ -280,11 +172,6 @@ def migrate( dest_sync_url = _schema_check_utils.to_sync_url(dest_db_url) logger.info(f"Connecting to source database: {source_db_url}") - if allow_unsafe_unpickling: - logger.warning( - "Unsafe pickle migration mode is enabled. Only use this with a trusted" - " source database." - ) try: source_engine = create_engine(source_sync_url) SourceSession = sessionmaker(bind=source_engine) @@ -378,10 +265,7 @@ def migrate( text("SELECT * FROM events") ).mappings(): try: - event_obj = _row_to_event( - dict(row), - allow_unsafe_unpickling=allow_unsafe_unpickling, - ) + event_obj = _row_to_event(dict(row)) new_event = v1.StorageEvent( id=event_obj.id, app_name=row["app_name"], @@ -425,22 +309,9 @@ def migrate( required=True, help="SQLAlchemy URL of destination database", ) - parser.add_argument( - "--allow_unsafe_unpickling", - "--allow-unsafe-unpickling", - action="store_true", - help=( - "Allow legacy pickle payloads to use Python's unsafe pickle loader." - " Only use this with a trusted source database." - ), - ) args = parser.parse_args() try: - migrate( - args.source_db_url, - args.dest_db_url, - allow_unsafe_unpickling=args.allow_unsafe_unpickling, - ) + migrate(args.source_db_url, args.dest_db_url) except Exception as e: logger.error(f"Migration failed: {e}") sys.exit(1) diff --git a/src/google/adk/sessions/migration/migration_runner.py b/src/google/adk/sessions/migration/migration_runner.py index 1290ee67fc..c46bab2179 100644 --- a/src/google/adk/sessions/migration/migration_runner.py +++ b/src/google/adk/sessions/migration/migration_runner.py @@ -42,11 +42,7 @@ LATEST_VERSION = _schema_check_utils.LATEST_SCHEMA_VERSION -def upgrade( - source_db_url: str, - dest_db_url: str, - allow_unsafe_unpickling: bool = False, -) -> None: +def upgrade(source_db_url: str, dest_db_url: str): """Migrates a database from its current version to the latest version. If the source database schema is older than the latest version, this @@ -65,9 +61,6 @@ def upgrade( source_db_url: The SQLAlchemy URL of the database to migrate from. dest_db_url: The SQLAlchemy URL of the database to migrate to. This must be different from source_db_url. - allow_unsafe_unpickling: If true, use Python's unsafe pickle loader for the - legacy pickle migration step. Only use this with a trusted source - database. Raises: RuntimeError: If source_db_url and dest_db_url are the same, or if no @@ -120,14 +113,7 @@ def upgrade( logger.info( f"Migrating from {in_url} to {out_url} (schema v{end_version})..." ) - if migrate_func is migrate_from_sqlalchemy_pickle.migrate: - migrate_func( - in_url, - out_url, - allow_unsafe_unpickling=allow_unsafe_unpickling, - ) - else: - migrate_func(in_url, out_url) + migrate_func(in_url, out_url) logger.info("Finished migration step to schema %s.", end_version) # The output of this step becomes the input for the next step. in_url = out_url diff --git a/src/google/adk/sessions/sqlite_session_service.py b/src/google/adk/sessions/sqlite_session_service.py index 6e0f60db1d..427bc3e73e 100644 --- a/src/google/adk/sessions/sqlite_session_service.py +++ b/src/google/adk/sessions/sqlite_session_service.py @@ -359,13 +359,6 @@ async def delete_session( ) await db.commit() - @override - async def get_user_state( - self, *, app_name: str, user_id: str - ) -> dict[str, Any]: - async with self._get_db_connection() as db: - return await self._get_user_state(db, app_name, user_id) - @override async def append_event(self, session: Session, event: Event) -> Event: if event.partial: @@ -398,7 +391,7 @@ async def append_event(self, session: Session, event: Event) -> Event: # Apply state delta if present has_session_state_delta = False - if event.actions.state_delta: + if event.actions and event.actions.state_delta: state_deltas = _session_util.extract_state_delta( event.actions.state_delta ) diff --git a/src/google/adk/sessions/state.py b/src/google/adk/sessions/state.py index 1089bc0b3f..a6a3bdbbe9 100644 --- a/src/google/adk/sessions/state.py +++ b/src/google/adk/sessions/state.py @@ -15,47 +15,6 @@ from __future__ import annotations from typing import Any -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from pydantic import BaseModel - - -class StateSchemaError(TypeError): - """Raised when a state mutation violates the declared state_schema.""" - - -def _validate_state_entry( - schema: type[BaseModel], - key: str, - value: Any, -) -> None: - """Validates a single state key-value pair against a Pydantic schema. - - Raises StateSchemaError if the key is not in the schema or the value - does not match the field's type annotation. Prefixed keys (any key - containing ``:``) bypass validation. - """ - if ":" in key: - return - - fields = schema.model_fields - if key not in fields: - raise StateSchemaError( - f"Key '{key}' is not declared in state schema " - f"'{schema.__name__}'. Declared fields: {sorted(fields.keys())}" - ) - - from pydantic import TypeAdapter - from pydantic import ValidationError as PydanticValidationError - - try: - TypeAdapter(fields[key].annotation).validate_python(value) - except PydanticValidationError as e: - raise StateSchemaError( - f"Value for '{key}' does not match type " - f"'{fields[key].annotation}' in '{schema.__name__}': {e}" - ) from e class State: @@ -65,22 +24,14 @@ class State: USER_PREFIX = "user:" TEMP_PREFIX = "temp:" - def __init__( - self, - value: dict[str, Any], - delta: dict[str, Any], - schema: type[BaseModel] | None = None, - ): + def __init__(self, value: dict[str, Any], delta: dict[str, Any]): """ Args: value: The current value of the state dict. delta: The delta change to the current value that hasn't been committed. - schema: Optional Pydantic model declaring the expected state keys and - types. When set, mutations are validated against this schema. """ self._value = value self._delta = delta - self._schema = schema def __getitem__(self, key: str) -> Any: """Returns the value of the state dict for the given key.""" @@ -88,10 +39,8 @@ def __getitem__(self, key: str) -> Any: return self._delta[key] return self._value[key] - def __setitem__(self, key: str, value: Any) -> None: + def __setitem__(self, key: str, value: Any): """Sets the value of the state dict for the given key.""" - if self._schema is not None and isinstance(self._schema, type): - _validate_state_entry(self._schema, key, value) # TODO: make new change only store in delta, so that self._value is only # updated at the storage commit time. self._value[key] = value @@ -119,11 +68,8 @@ def get(self, key: str, default: Any = None) -> Any: return default return self[key] - def update(self, delta: dict[str, Any]) -> None: + def update(self, delta: dict[str, Any]): """Updates the state dict with the given delta.""" - if self._schema is not None and isinstance(self._schema, type): - for key, value in delta.items(): - _validate_state_entry(self._schema, key, value) self._value.update(delta) self._delta.update(delta) diff --git a/src/google/adk/sessions/vertex_ai_session_service.py b/src/google/adk/sessions/vertex_ai_session_service.py index d673c845fa..8c1fdc134e 100644 --- a/src/google/adk/sessions/vertex_ai_session_service.py +++ b/src/google/adk/sessions/vertex_ai_session_service.py @@ -47,19 +47,6 @@ _COMPACTION_CUSTOM_METADATA_KEY = '_compaction' _USAGE_METADATA_CUSTOM_METADATA_KEY = '_usage_metadata' -_SESSION_ID_PATTERN = re.compile(r'^[A-Za-z0-9_-]+$') - - -def _validate_session_id(session_id: str) -> None: - """Rejects session IDs that could escape the URL path segment.""" - if not isinstance(session_id, str) or not _SESSION_ID_PATTERN.fullmatch( - session_id - ): - raise ValueError( - f'Invalid session_id {session_id!r}: must match' - f' {_SESSION_ID_PATTERN.pattern}.' - ) - def _quote_filter_literal(value: str) -> str: """Quotes filter values so embedded metacharacters stay inside the literal.""" @@ -105,13 +92,6 @@ def __init__( visit https://cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview """ - try: - import vertexai - except ImportError as e: - from ..utils._dependency import missing_extra - - raise missing_extra('google-cloud-aiplatform', 'gcp') from e - self._project = project self._location = location self._agent_engine_id = agent_engine_id @@ -147,7 +127,6 @@ async def create_session( config = {'session_state': state} if state else {} if session_id: - _validate_session_id(session_id) config['session_id'] = session_id config.update(kwargs) async with self._get_api_client() as api_client: @@ -178,7 +157,6 @@ async def get_session( session_id: str, config: Optional[GetSessionConfig] = None, ) -> Optional[Session]: - _validate_session_id(session_id) reasoning_engine_id = self._get_reasoning_engine_id(app_name) session_resource_name = ( f'reasoningEngines/{reasoning_engine_id}/sessions/{session_id}' @@ -278,62 +256,24 @@ async def list_sessions( async def delete_session( self, *, app_name: str, user_id: str, session_id: str ) -> None: - _validate_session_id(session_id) reasoning_engine_id = self._get_reasoning_engine_id(app_name) - session_resource_name = ( - f'reasoningEngines/{reasoning_engine_id}/sessions/{session_id}' - ) async with self._get_api_client() as api_client: - # Enforce ownership: delete_session otherwise ignores user_id entirely. - try: - existing = await api_client.agent_engines.sessions.get( - name=session_resource_name - ) - except ClientError as e: - if e.code == 404: - return - raise - if existing.user_id != user_id: - raise ValueError( - f'Session {session_id} does not belong to user {user_id}.' - ) - try: await api_client.agent_engines.sessions.delete( - name=session_resource_name, + name=( + f'reasoningEngines/{reasoning_engine_id}/sessions/{session_id}' + ), ) except Exception as e: logger.error('Error deleting session %s: %s', session_id, e) raise - @override - async def get_user_state( - self, *, app_name: str, user_id: str - ) -> dict[str, Any]: - """Not supported by the Vertex AI Agent Engine backend. - - The Vertex AI Agent Engine API does not expose user state independently of - a session. To read user state, enumerate sessions via ``list_sessions`` - and call ``get_session`` on each result to access the merged state. - - Raises: - NotImplementedError: Always, because the Vertex AI Agent Engine API does - not provide a way to query user state without a session. - """ - raise NotImplementedError( - 'VertexAiSessionService does not support get_user_state. ' - 'The Vertex AI Agent Engine API does not expose user state ' - 'independently of a session. To read user state, enumerate sessions ' - 'via list_sessions and call get_session on each result.' - ) - @override async def append_event(self, session: Session, event: Event) -> Event: # Update the in-memory session. await super().append_event(session=session, event=event) - _validate_session_id(session.id) reasoning_engine_id = self._get_reasoning_engine_id(session.app_name) # Build config (Monolithic approach) diff --git a/src/google/adk/skills/_utils.py b/src/google/adk/skills/_utils.py index a42e531029..3270025e01 100644 --- a/src/google/adk/skills/_utils.py +++ b/src/google/adk/skills/_utils.py @@ -24,6 +24,7 @@ import zipfile from google.auth import credentials as auth +from google.cloud import storage from pydantic import ValidationError import yaml @@ -406,15 +407,6 @@ def _list_skills_in_gcs_dir( Returns: Dictionary mapping skill IDs to their frontmatter. """ - try: - from google.cloud import storage - except ImportError as e: - raise ImportError( - "google-cloud-storage is required to list skills in GCS. Install it" - " with `pip install google-cloud-storage` or `pip install" - " google-adk[gcp]`." - ) from e - client = storage.Client(project=project_id, credentials=credentials) bucket = client.bucket(bucket_name) @@ -474,14 +466,6 @@ def _load_skill_from_gcs_dir( ValueError: If SKILL.md is invalid or the skill name does not match the directory name. """ - try: - from google.cloud import storage - except ImportError as e: - raise ImportError( - "google-cloud-storage is required to load skills from GCS. Install it" - " with `pip install google-cloud-storage` or `pip install" - " google-adk[gcp]`." - ) from e client = storage.Client(project=project_id, credentials=credentials) bucket = client.bucket(bucket_name) diff --git a/src/google/adk/telemetry/_agent_engine.py b/src/google/adk/telemetry/_agent_engine.py deleted file mode 100644 index 070cb45526..0000000000 --- a/src/google/adk/telemetry/_agent_engine.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from typing import Mapping -from typing import Optional - -import fastapi -from opentelemetry import baggage -from opentelemetry import context -from opentelemetry.sdk import trace -from opentelemetry.trace.propagation import tracecontext - -_GOOGLE_AE_TRACEPARENT_HEADER = "Google-Agent-Engine-Traceparent" -_TRACEPARENT_BAGGAGE_KEY = "traceparent" -_GOOGLE_TRACEPARENT_HEADER = "traceparent" -_GOOGLE_TRACEPARENT_BAGGAGE_KEY = "google_traceparent" -_GOOGLE_TRACEPARENT_SUPPORT_ATTRIBUTE_KEY = "supportID" - - -def get_propagated_context(request: fastapi.Request) -> context.Context: - """Propagates context from the request headers.""" - ctx = context.get_current() - - if _GOOGLE_TRACEPARENT_HEADER in request.headers: - original_traceparent = request.headers[_GOOGLE_TRACEPARENT_HEADER] - ctx = baggage.set_baggage( - _GOOGLE_TRACEPARENT_BAGGAGE_KEY, - original_traceparent, - context=ctx, - ) - - if _GOOGLE_AE_TRACEPARENT_HEADER in request.headers: - carrier = {"traceparent": request.headers[_GOOGLE_AE_TRACEPARENT_HEADER]} - ctx = baggage.set_baggage( - _TRACEPARENT_BAGGAGE_KEY, - request.headers[_GOOGLE_AE_TRACEPARENT_HEADER], - context=ctx, - ) - ctx = tracecontext.TraceContextTextMapPropagator().extract( - carrier=carrier, context=ctx - ) - - return ctx - - -class TopSpanProcessor(trace.SpanProcessor): - """Top span processor.""" - - def on_start( - self, span: trace.Span, parent_context: Optional[context.Context] = None - ): - """Adds support ID to the top span.""" - baggage_items = baggage.get_all(context=parent_context) - if self._is_top_span(span, baggage_items) and ( - baggage_trace_header := baggage_items.get( - _GOOGLE_TRACEPARENT_BAGGAGE_KEY - ) - ): - span.set_attribute( - _GOOGLE_TRACEPARENT_SUPPORT_ATTRIBUTE_KEY, baggage_trace_header - ) - - def on_end(self, span: trace.ReadableSpan) -> None: - pass - - def shutdown(self) -> None: - pass - - def force_flush(self, timeout_millis: int = 30000) -> bool: - return True - - def _is_top_span( - self, span: trace.Span, baggage_items: Mapping[str, object] - ) -> bool: - """Returns true if the span is a top span. - - Args: - span: The span to check. - baggage_items: The baggage items that carry the context. - - Top span (e.g. "Invocation" span) is defined as the first span generated in - trace generation. - Top span could have an empty parent or the parent could be the span - provided by traceparent propagation. - """ - if span.parent is None or span.parent.span_id == 0: - return True - if _TRACEPARENT_BAGGAGE_KEY in baggage_items: - parent_id_hex = str(baggage_items[_TRACEPARENT_BAGGAGE_KEY]).split("-")[2] - parent_id_int = int(parent_id_hex, 16) - if span.parent.span_id == parent_id_int: - return True - return False diff --git a/src/google/adk/telemetry/_experimental_semconv.py b/src/google/adk/telemetry/_experimental_semconv.py index 784c7fb4ca..6ffd5beaaa 100644 --- a/src/google/adk/telemetry/_experimental_semconv.py +++ b/src/google/adk/telemetry/_experimental_semconv.py @@ -28,7 +28,6 @@ from typing import TYPE_CHECKING from typing import TypedDict -from google.adk.telemetry._token_usage import TokenUsage from google.genai import types from google.genai.models import t as transformers from opentelemetry._logs import Logger @@ -37,26 +36,22 @@ from mcp import ClientSession as McpClientSession from mcp import Tool as McpTool from opentelemetry._logs import LogRecord +from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_INPUT_MESSAGES +from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_OUTPUT_MESSAGES +from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_RESPONSE_FINISH_REASONS +from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_SYSTEM_INSTRUCTIONS +from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_USAGE_INPUT_TOKENS +from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_USAGE_OUTPUT_TOKENS from opentelemetry.trace import Span from opentelemetry.util.types import AttributeValue -if TYPE_CHECKING: - from ..models.llm_request import LlmRequest - from ..models.llm_response import LlmResponse - -from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_RESPONSE_FINISH_REASONS - -# Use the import symbol once the minimum OpenTelemetry SDK version is updated to 1.37.0 -# from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_INPUT_MESSAGES -# from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_OUTPUT_MESSAGES -# from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_SYSTEM_INSTRUCTIONS -GEN_AI_INPUT_MESSAGES = 'gen_ai.input.messages' -GEN_AI_OUTPUT_MESSAGES = 'gen_ai.output.messages' -GEN_AI_SYSTEM_INSTRUCTIONS = 'gen_ai.system_instructions' +from ..models.llm_request import LlmRequest +from ..models.llm_response import LlmResponse -# Use the import symbol once the minimum OpenTelemetry SDK version is updated to 1.39.0 -# from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_TOOL_DEFINITIONS -GEN_AI_TOOL_DEFINITIONS = 'gen_ai.tool.definitions' +try: + from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_TOOL_DEFINITIONS +except ImportError: + GEN_AI_TOOL_DEFINITIONS = 'gen_ai.tool.definitions' OTEL_SEMCONV_STABILITY_OPT_IN = 'OTEL_SEMCONV_STABILITY_OPT_IN' @@ -438,14 +433,8 @@ def _to_system_instructions( def set_operation_details_common_attributes( operation_details_common_attributes: MutableMapping[str, AttributeValue], attributes: Mapping[str, AttributeValue], - log_only_attributes: Mapping[str, AttributeValue] | None = None, -) -> None: +): operation_details_common_attributes.update(attributes) - if log_only_attributes and get_content_capturing_mode() in ( - 'EVENT_ONLY', - 'SPAN_AND_EVENT', - ): - operation_details_common_attributes.update(log_only_attributes) async def set_operation_details_attributes_from_request( @@ -477,15 +466,19 @@ def set_operation_details_attributes_from_response( operation_details_attributes: MutableMapping[str, AttributeValue], operation_details_common_attributes: MutableMapping[str, AttributeValue], ): - """Populates operation details attributes from the LLM response.""" - if llm_response.finish_reason: + if finish_reason := llm_response.finish_reason: operation_details_common_attributes[GEN_AI_RESPONSE_FINISH_REASONS] = [ - _to_finish_reason(llm_response.finish_reason) + _to_finish_reason(finish_reason) ] - if llm_response.usage_metadata: - operation_details_common_attributes.update( - TokenUsage(llm_response.usage_metadata).to_attributes() - ) + if usage_metadata := llm_response.usage_metadata: + if usage_metadata.prompt_token_count is not None: + operation_details_common_attributes[GEN_AI_USAGE_INPUT_TOKENS] = ( + usage_metadata.prompt_token_count + ) + if usage_metadata.candidates_token_count is not None: + operation_details_common_attributes[GEN_AI_USAGE_OUTPUT_TOKENS] = ( + usage_metadata.candidates_token_count + ) output_message = _to_output_message(llm_response) if output_message is not None: diff --git a/src/google/adk/telemetry/_instrumentation.py b/src/google/adk/telemetry/_instrumentation.py index 3f51a31745..0e4ad3c6ea 100644 --- a/src/google/adk/telemetry/_instrumentation.py +++ b/src/google/adk/telemetry/_instrumentation.py @@ -17,12 +17,13 @@ import contextlib import dataclasses import logging -import sys import time from typing import Any from typing import AsyncIterator from typing import TYPE_CHECKING +logger = logging.getLogger("google_adk." + __name__) + from opentelemetry import trace import opentelemetry.context as context_api @@ -33,24 +34,16 @@ if TYPE_CHECKING: from ..agents.base_agent import BaseAgent from ..agents.invocation_context import InvocationContext - from ..models.llm_request import LlmRequest - from ..models.llm_response import LlmResponse from ..tools.base_tool import BaseTool -logger = logging.getLogger("google_adk." + __name__) - -def _get_elapsed_ms( - span: trace.Span | tracing.GenerateContentSpan | None, - fallback_start: float, -) -> float: +def _get_elapsed_ms(span: trace.Span | None, fallback_start: float) -> float: """Guarantees consistent time source for duration calculation. Note: This must be called with an ended span. Args: - span (trace.Span | tracing.GenerateContentSpan | None): The ended span to - extract duration from. + span (trace.Span | None): The ended span to extract duration from. fallback_start (float): Fallback start time in seconds (monotonic). Returns: @@ -59,7 +52,6 @@ def _get_elapsed_ms( if span is None: return (time.monotonic() - fallback_start) * 1000 - span = span.span if hasattr(span, "span") else span start_ns = getattr(span, "start_time", None) end_ns = getattr(span, "end_time", None) @@ -74,46 +66,15 @@ def _get_elapsed_ms( class TelemetryContext: """Stores all telemetry related state.""" - otel_context: context_api.Context | None = None + otel_context: context_api.Context function_response_event: event_lib.Event | None = None - error_type: str | None = None - span: tracing.GenerateContentSpan | trace.Span | None = None - _llm_responses: list[LlmResponse] = dataclasses.field(default_factory=list) - - @property - def llm_responses(self) -> list[LlmResponse]: - return self._llm_responses - - def record_llm_response(self, response: LlmResponse) -> None: - self._llm_responses.append(response) - tracing.trace_inference_result(self.span, response) - - -def _record_agent_metrics( - agent_name: str, - elapsed_ms: float, - user_content: Any, - events: Any, - caught_error: Exception | None, -) -> None: - try: - _metrics.record_agent_invocation_duration( - agent_name, - elapsed_ms, - caught_error, - ) - _metrics.record_agent_request_size(agent_name, user_content) - _metrics.record_agent_response_size(agent_name, events) - _metrics.record_agent_workflow_steps(agent_name, events) - except Exception: # pylint: disable=broad-exception-caught - logger.exception("Failed to record agent metrics for agent %s", agent_name) @contextlib.asynccontextmanager async def record_agent_invocation( ctx: InvocationContext, agent: BaseAgent ) -> AsyncIterator[TelemetryContext]: - """Unified context manager for consolidated agent invocation telemetry.""" + """Unified context manager for consolidated metrics and tracing.""" start_time = time.monotonic() caught_error: Exception | None = None span: trace.Span | None = None @@ -129,13 +90,19 @@ async def record_agent_invocation( raise finally: elapsed_ms = _get_elapsed_ms(span, start_time) - _record_agent_metrics( - agent.name, - elapsed_ms, - getattr(ctx, "user_content", None), - getattr(getattr(ctx, "session", None), "events", []), - caught_error, - ) + try: + _metrics.record_agent_invocation_duration( + agent.name, + elapsed_ms, + caught_error, + ) + _metrics.record_agent_request_size(agent.name, ctx.user_content) + _metrics.record_agent_response_size(agent.name, ctx.session.events) + _metrics.record_agent_workflow_steps(agent.name, ctx.session.events) + except Exception: # pylint: disable=broad-exception-caught + logger.exception( + "Failed to record agent metrics for agent %s", agent.name + ) @contextlib.asynccontextmanager @@ -167,7 +134,6 @@ async def record_tool_execution( args=function_args, function_response_event=response_event, error=caught_error, - error_type=tel_ctx.error_type, ) finally: try: @@ -181,49 +147,3 @@ async def record_tool_execution( logger.exception( "Failed to record tool execution duration for tool %s", tool.name ) - - -@contextlib.asynccontextmanager -async def record_inference_telemetry( - llm_request: LlmRequest, - invocation_context: InvocationContext, - model_response_event: event_lib.Event, -) -> AsyncIterator[TelemetryContext]: - """Unified async context manager for consolidated inference metrics.""" - start_time = time.monotonic() - tel_ctx: TelemetryContext = TelemetryContext() - try: - async with tracing.use_inference_span( - llm_request, - invocation_context, - model_response_event, - ) as gc_span: - tel_ctx.span = gc_span - yield tel_ctx - finally: - inference_error = sys.exc_info()[1] - elapsed_ms = _get_elapsed_ms(tel_ctx.span, start_time) - agent = invocation_context.agent - try: - if agent is not None and tracing._should_emit_native_telemetry(agent): - _metrics.record_client_operation_duration( - agent_name=agent.name, - elapsed_ms=elapsed_ms, - llm_request=llm_request, - responses=tel_ctx.llm_responses, - error=( - inference_error - if isinstance(inference_error, Exception) - else None - ), - ) - _metrics.record_client_token_usage( - agent_name=agent.name, - llm_request=llm_request, - responses=tel_ctx.llm_responses, - ) - except Exception: # pylint: disable=broad-exception-caught - logger.exception( - "Failed to record inference metrics for agent %s", - agent.name if agent is not None else "", - ) diff --git a/src/google/adk/telemetry/_metrics.py b/src/google/adk/telemetry/_metrics.py index 272556fd85..0f32ac1920 100644 --- a/src/google/adk/telemetry/_metrics.py +++ b/src/google/adk/telemetry/_metrics.py @@ -15,32 +15,28 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING from google.adk import version -from google.adk.telemetry import tracing -from google.adk.telemetry._token_usage import TokenUsage +from google.adk.events.event import Event from google.genai import types from opentelemetry import metrics from opentelemetry.semconv._incubating.attributes import gen_ai_attributes -from opentelemetry.semconv._incubating.metrics import gen_ai_metrics from opentelemetry.semconv.attributes import error_attributes -if TYPE_CHECKING: - from google.adk.events.event import Event - from google.adk.models.llm_request import LlmRequest - from google.adk.models.llm_response import LlmResponse - logger = logging.getLogger("google_adk." + __name__) +# TODO(b/477553411): add these attributes to Otel semconv. GEN_AI_AGENT_VERSION = "gen_ai.agent.version" GEN_AI_TOOL_VERSION = "gen_ai.tool.version" +# Initialize meter meter = metrics.get_meter( name="gcp.vertex.agent", version=version.__version__, + # TODO(b/477553411): set schema version after OTel semconv updates. ) +# Define histograms _agent_invocation_duration = meter.create_histogram( "gen_ai.agent.invocation.duration", unit="ms", @@ -66,10 +62,6 @@ unit="1", description="Length of agentic workflow (# of events).", ) -_client_operation_duration = ( - gen_ai_metrics.create_gen_ai_client_operation_duration(meter) -) -_client_token_usage = gen_ai_metrics.create_gen_ai_client_token_usage(meter) def record_agent_invocation_duration( @@ -129,86 +121,6 @@ def record_tool_execution_duration( _tool_execution_duration.record(elapsed_ms, attributes=attrs) -def record_client_operation_duration( - agent_name: str, - elapsed_ms: float, - llm_request: LlmRequest, - responses: list[LlmResponse], - error: Exception | None = None, -): - """Encapsulates the business logic for tracking gen_ai client operation duration.""" - - attrs = { - gen_ai_attributes.GEN_AI_AGENT_NAME: agent_name, - gen_ai_attributes.GEN_AI_OPERATION_NAME: "generate_content", - gen_ai_attributes.GEN_AI_PROVIDER_NAME: _get_provider_name(), - } - if llm_request.model: - attrs[gen_ai_attributes.GEN_AI_REQUEST_MODEL] = llm_request.model - - if responses: - response_model = responses[-1].model_version or llm_request.model - if response_model: - attrs[gen_ai_attributes.GEN_AI_RESPONSE_MODEL] = response_model - - if error is not None: - attrs[error_attributes.ERROR_TYPE] = type(error).__name__ - - _client_operation_duration.record(elapsed_ms / 1000.0, attributes=attrs) - - -def record_client_token_usage( - agent_name: str, - llm_request: LlmRequest, - responses: list[LlmResponse], -): - """Encapsulates the business logic for tracking gen_ai client token usage.""" - if not responses: - return - - # The assumption is that token usage in streaming responses is cumulative. - # The last response chunk contains the total usage for the entire request. - # Summing them up across all response chunks would result in overcounting. - last_response = responses[-1] - if not last_response.usage_metadata: - logger.warning( - "Skipping missing token usage metadata for agent %s and model %s", - agent_name, - llm_request.model, - ) - return - - # OTel semconv for `gen_ai.client.token.usage` states that token counts should - # be categorized under `gen_ai.token.type` as either "input" or "output". - # We aggregate prompt and tool use tokens for "input", and candidates and - # thoughts tokens for "output". - # `cached_content_token_count` is omitted as it's already included in prompt tokens. - # `total_token_count` is omitted as SemConv expects input/output breakdown. - token_usage = TokenUsage(last_response.usage_metadata) - input_token_count = token_usage.input_token_count or 0 - output_token_count = token_usage.output_token_count or 0 - response_model = last_response.model_version or llm_request.model - base_attrs = { - gen_ai_attributes.GEN_AI_AGENT_NAME: agent_name, - gen_ai_attributes.GEN_AI_OPERATION_NAME: "generate_content", - gen_ai_attributes.GEN_AI_PROVIDER_NAME: _get_provider_name(), - } - if llm_request.model: - base_attrs[gen_ai_attributes.GEN_AI_REQUEST_MODEL] = llm_request.model - if response_model: - base_attrs[gen_ai_attributes.GEN_AI_RESPONSE_MODEL] = response_model - - if input_token_count > 0: - input_attrs = base_attrs.copy() - input_attrs[gen_ai_attributes.GEN_AI_TOKEN_TYPE] = "input" - _client_token_usage.record(input_token_count, attributes=input_attrs) - - if output_token_count > 0: - output_attrs = base_attrs.copy() - output_attrs[gen_ai_attributes.GEN_AI_TOKEN_TYPE] = "output" - _client_token_usage.record(output_token_count, attributes=output_attrs) - - def _get_content_size( content: types.Content | None, ) -> int: @@ -221,7 +133,3 @@ def _get_content_size( if part.inline_data and part.inline_data.data: size += len(part.inline_data.data) return size - - -def _get_provider_name() -> str: - return tracing._guess_gemini_system_name() diff --git a/src/google/adk/telemetry/_token_usage.py b/src/google/adk/telemetry/_token_usage.py deleted file mode 100644 index 0ab1788e7d..0000000000 --- a/src/google/adk/telemetry/_token_usage.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import dataclasses -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from google.genai import types - from opentelemetry.util.types import AttributeValue - -# Centralized OpenTelemetry Semantic Conventions -from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_USAGE_INPUT_TOKENS -from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_USAGE_OUTPUT_TOKENS - -# Use the import symbol once the minimum OpenTelemetry SDK version is updated to 1.40.0 -# from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS -GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS = 'gen_ai.usage.cache_read.input_tokens' - -# Use the import symbol once the minimum OpenTelemetry SDK version is updated to 1.42.0 -# from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_USAGE_REASONING_OUTPUT_TOKENS -GEN_AI_USAGE_REASONING_OUTPUT_TOKENS = 'gen_ai.usage.reasoning.output_tokens' - - -@dataclasses.dataclass -class TokenUsage: - """Centralized representation and processing of GenAI token usage metadata.""" - - usage_metadata: types.GenerateContentResponseUsageMetadata | None - - @property - def input_token_count(self) -> int | None: - if self.usage_metadata is None: - return None - # OTel semconv for `gen_ai.client.token.usage` states that token counts should - # be categorized under `gen_ai.token.type` as either "input" or "output". - # We aggregate prompt and tool use tokens for "input". - prompt_tokens = self.usage_metadata.prompt_token_count - tool_tokens = self.usage_metadata.tool_use_prompt_token_count - if prompt_tokens is None and tool_tokens is None: - return None - return (prompt_tokens or 0) + (tool_tokens or 0) - - @property - def output_token_count(self) -> int | None: - if self.usage_metadata is None: - return None - # According to OpenTelemetry Semantic Conventions: - # https://github.com/open-telemetry/semantic-conventions/blob/v1.41.0/docs/registry/attributes/gen-ai.md - # gen_ai.usage.reasoning.output_tokens (thoughts_token_count) SHOULD be included in gen_ai.usage.output_tokens. - candidates_tokens = self.usage_metadata.candidates_token_count - thoughts_tokens = self.usage_metadata.thoughts_token_count - if candidates_tokens is None and thoughts_tokens is None: - return None - return (candidates_tokens or 0) + (thoughts_tokens or 0) - - def to_attributes(self) -> dict[str, AttributeValue]: - """Returns a dictionary of OpenTelemetry token usage attributes.""" - attrs: dict[str, AttributeValue] = {} - if self.input_token_count is not None: - attrs[GEN_AI_USAGE_INPUT_TOKENS] = self.input_token_count - if self.output_token_count is not None: - attrs[GEN_AI_USAGE_OUTPUT_TOKENS] = self.output_token_count - - if self.usage_metadata is not None: - cached_tokens = self.usage_metadata.cached_content_token_count - if cached_tokens is not None: - attrs[GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = cached_tokens - - thoughts_tokens = self.usage_metadata.thoughts_token_count - if thoughts_tokens is not None: - attrs[GEN_AI_USAGE_REASONING_OUTPUT_TOKENS] = thoughts_tokens - - system_instruction_tokens = getattr( - self.usage_metadata, 'system_instruction_tokens', None - ) - if system_instruction_tokens is not None: - attrs['gen_ai.usage.experimental.system_instruction_tokens'] = ( - system_instruction_tokens - ) - - return attrs diff --git a/src/google/adk/telemetry/google_cloud.py b/src/google/adk/telemetry/google_cloud.py index a224893fe9..c34cdba90c 100644 --- a/src/google/adk/telemetry/google_cloud.py +++ b/src/google/adk/telemetry/google_cloud.py @@ -17,18 +17,16 @@ import enum import logging import os -import sys +from typing import Any from typing import Callable from typing import cast from typing import Optional from typing import TYPE_CHECKING -import uuid import google.auth from google.auth.transport import mtls from opentelemetry.sdk._logs import LogRecordProcessor from opentelemetry.sdk._logs.export import BatchLogRecordProcessor -from opentelemetry.sdk._logs.export import SimpleLogRecordProcessor from opentelemetry.sdk.metrics.export import MetricReader from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader from opentelemetry.sdk.resources import OTELResourceDetector @@ -41,23 +39,23 @@ if TYPE_CHECKING: from google.auth.credentials import Credentials -logger = logging.getLogger("google_adk." + __name__) +logger = logging.getLogger('google_adk.' + __name__) -_GCP_LOG_NAME_ENV_VARIABLE_NAME = "GOOGLE_CLOUD_DEFAULT_LOG_NAME" -_DEFAULT_LOG_NAME = "adk-otel" +_GCP_LOG_NAME_ENV_VARIABLE_NAME = 'GOOGLE_CLOUD_DEFAULT_LOG_NAME' +_DEFAULT_LOG_NAME = 'adk-otel' -_DEFAULT_TELEMETRY_TRACES_ENPOINT = "https://telemetry.googleapis.com/v1/traces" +_DEFAULT_TELEMETRY_TRACES_ENPOINT = 'https://telemetry.googleapis.com/v1/traces' _DEFAULT_MTLS_TELEMETRY_TRACES_ENPOINT = ( - "https://telemetry.mtls.googleapis.com/v1/traces" + 'https://telemetry.mtls.googleapis.com/v1/traces' ) class _MtlsEndpoint(enum.Enum): """The mTLS endpoint setting.""" - AUTO = "auto" - ALWAYS = "always" - NEVER = "never" + AUTO = 'auto' + ALWAYS = 'always' + NEVER = 'never' def get_gcp_exporters( @@ -78,29 +76,14 @@ def get_gcp_exporters( credentials, project_id = ( google_auth if google_auth is not None else google.auth.default() ) - if os.environ.get("GOOGLE_CLOUD_AGENT_ENGINE_ID"): - # Try to convert project number to project ID to associate logs with traces. - try: - from google.cloud import resourcemanager_v3 as resourcemanager - - projects_client = resourcemanager.ProjectsClient(credentials=credentials) - project = projects_client.get_project(name=f"projects/{project_id}") - project_id = project.project_id - except Exception: - logger.warning( - "Failed to convert project number to project ID. Your traces and logs" - " may not be associated. To fix this, consider enabling the resource" - " manager API and redeploying your agent.", - exc_info=True, - ) if TYPE_CHECKING: credentials = cast(Credentials, credentials) project_id = cast(str, project_id) if not project_id: logger.warning( - "Cannot determine GCP Project. OTel GCP Exporters cannot be set up." - " Please make sure to log into correct GCP Project." + 'Cannot determine GCP Project. OTel GCP Exporters cannot be set up.' + ' Please make sure to log into correct GCP Project.' ) return OTelHooks() @@ -117,10 +100,7 @@ def get_gcp_exporters( log_record_processors: list[LogRecordProcessor] = [] if enable_cloud_logging: - exporter = _get_gcp_logs_exporter( - project_id=project_id, - credentials=credentials, - ) + exporter = _get_gcp_logs_exporter(project_id) if exporter: log_record_processors.append(exporter) @@ -151,27 +131,10 @@ def _get_gcp_span_exporter(credentials: Credentials) -> SpanProcessor: else: endpoint = _DEFAULT_TELEMETRY_TRACES_ENPOINT - headers = None - if os.getenv("GOOGLE_CLOUD_AGENT_ENGINE_ENABLE_TELEMETRY"): - from google.cloud.aiplatform import version as aip_version - - try: - from opentelemetry.exporter.otlp.proto.http import version as otlp_http_version - except (ImportError, AttributeError): - otlp_http_version = None - - user_agent = f"Vertex-Agent-Engine/{aip_version.__version__}" - if otlp_http_version: - user_agent += ( - f" OTel-OTLP-Exporter-Python/{otlp_http_version.__version__}" - ) - headers = {"User-Agent": user_agent} - return BatchSpanProcessor( OTLPSpanExporter( session=session, endpoint=endpoint, - headers=headers, ) ) @@ -185,16 +148,7 @@ def _get_gcp_metrics_exporter(project_id: str) -> MetricReader: ) -def _get_gcp_logs_exporter( - project_id: str, - credentials: Optional["Credentials"] = None, -) -> LogRecordProcessor: - if os.getenv("GOOGLE_CLOUD_AGENT_ENGINE_ID"): - return _get_agent_engine_logs_exporter( - credentials=credentials, - project_id=project_id, - ) - +def _get_gcp_logs_exporter(project_id: str) -> LogRecordProcessor: from opentelemetry.exporter.cloud_logging import CloudLoggingExporter default_log_name = os.environ.get( @@ -207,20 +161,6 @@ def _get_gcp_logs_exporter( ) -def _detect_cloud_resource_id(project_id: str) -> Optional[str]: - """Detects the cloud resource ID.""" - location = os.getenv("GOOGLE_CLOUD_AGENT_ENGINE_LOCATION") or os.getenv( - "GOOGLE_CLOUD_LOCATION" - ) - agent_engine_id = os.getenv("GOOGLE_CLOUD_AGENT_ENGINE_ID") - if project_id and location and agent_engine_id: - return ( - f"//aiplatform.googleapis.com/projects/{project_id}" - f"/locations/{location}/reasoningEngines/{agent_engine_id}" - ) - return None - - def get_gcp_resource(project_id: Optional[str] = None) -> Resource: """Returns OTEL with attributes specified in the following order (attributes specified later, overwrite those specified earlier): 1. Populates gcp.project_id attribute from the project_id argument if present. @@ -231,34 +171,8 @@ def get_gcp_resource(project_id: Optional[str] = None) -> Resource: project_id: project id to fill out as `gcp.project_id` on the OTEL resource. This may be overwritten by OTELResourceDetector, if `gcp.project_id` is present in `OTEL_RESOURCE_ATTRIBUTES` env var. """ - agent_engine_id = os.getenv("GOOGLE_CLOUD_AGENT_ENGINE_ID", "") - cloud_resource_id = _detect_cloud_resource_id(project_id=project_id) - resource_attributes = { - "gcp.project_id": project_id, - "cloud.account.id": project_id, - "cloud.provider": "gcp", - "cloud.platform": "gcp.agent_engine", - "service.name": agent_engine_id, - "service.version": os.getenv( - "GOOGLE_CLOUD_AGENT_ENGINE_RUNTIME_REVISION_ID", "" - ), - "service.instance.id": f"{uuid.uuid4().hex}-{os.getpid()}", - "cloud.region": ( - os.getenv("GOOGLE_CLOUD_AGENT_ENGINE_LOCATION", "") - or os.getenv("GOOGLE_CLOUD_LOCATION", "") - ), - } - if cloud_resource_id is not None: - resource_attributes["cloud.resource.id"] = cloud_resource_id - - if agent_engine_id: - resource = Resource.create(attributes=resource_attributes).merge( - OTELResourceDetector().detect() - ) - return resource - resource = Resource( - attributes={"gcp.project_id": project_id} + attributes={'gcp.project_id': project_id} if project_id is not None else {} ) @@ -271,8 +185,8 @@ def get_gcp_resource(project_id: Optional[str] = None) -> Resource: ) except ImportError: logger.warning( - "Cloud not import opentelemetry.resourcedetector.gcp_resource_detector" - " GCE, GKE or CloudRun related resource attributes may be missing" + 'Cloud not import opentelemetry.resourcedetector.gcp_resource_detector' + ' GCE, GKE or CloudRun related resource attributes may be missing' ) return resource @@ -290,15 +204,15 @@ def _get_api_endpoint( str: The API endpoint to be used. """ use_mtls_endpoint_str = os.getenv( - "GOOGLE_API_USE_MTLS_ENDPOINT", _MtlsEndpoint.AUTO.value + 'GOOGLE_API_USE_MTLS_ENDPOINT', _MtlsEndpoint.AUTO.value ).lower() try: use_mtls_endpoint = _MtlsEndpoint(use_mtls_endpoint_str) except ValueError: logger.warning( - "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be one of " - "%s. Defaulting to %s.", + 'Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be one of ' + '%s. Defaulting to %s.', [e.value for e in _MtlsEndpoint], _MtlsEndpoint.AUTO.value, ) @@ -326,83 +240,11 @@ def _use_client_cert_effective() -> bool: return bool(mtls.should_use_client_cert()) except (ImportError, AttributeError): use_client_cert_str = os.getenv( - "GOOGLE_API_USE_CLIENT_CERTIFICATE", "false" + 'GOOGLE_API_USE_CLIENT_CERTIFICATE', 'false' ).lower() - if use_client_cert_str not in ("true", "false"): + if use_client_cert_str not in ('true', 'false'): logger.warning( - "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be" - " either `true` or `false`" + 'Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be' + ' either `true` or `false`' ) - return use_client_cert_str == "true" - - -def _get_agent_engine_logs_exporter( - *, - credentials: "Credentials", - project_id: str, -): - """Configures logging for Agent Engine. - - Args: - credentials: Credentials to use for export calls. - project_id: Project to which to write logs. - """ - try: - from google.cloud.logging_v2.services import logging_service_v2 - from google.cloud.logging_v2.services.logging_service_v2.transports import grpc - from opentelemetry.exporter import cloud_logging - except (ImportError, AttributeError): - logger.warning( - "%s is not installed. Please call 'pip install %s'.", - "opentelemetry-exporter-gcp-logging", - "opentelemetry-exporter-gcp-logging", - ) - logger.warning( - "proceeding with logging disabled because not all packages for" - " logging have been installed" - ) - return - - if "gen_ai_latest_experimental" in os.getenv( - "OTEL_SEMCONV_STABILITY_OPT_IN", "" - ).split(","): - # Specify credentials to avoid expensive call to `google.auth.default()` - channel = grpc.LoggingServiceV2GrpcTransport.create_channel( - credentials=credentials, - # pylint: disable-next=protected-access - options=cloud_logging._OPTIONS, - ) - return BatchLogRecordProcessor( - cloud_logging.CloudLoggingExporter( - client=logging_service_v2.LoggingServiceV2Client( - transport=grpc.LoggingServiceV2GrpcTransport( - credentials=credentials, - channel=channel, - ), - ), - project_id=project_id, - default_log_name=os.getenv( - "GCP_DEFAULT_LOG_NAME", "adk-on-agent-engine" - ), - ), - ) - else: - - class _SimpleLogRecordProcessor(SimpleLogRecordProcessor): - - def force_flush( - self, timeout_millis: int = 30000 - ) -> bool: # pylint: disable=no-self-use - _ = sys.stdout.flush() - _ = sys.stderr.flush() - return super().force_flush() - - return _SimpleLogRecordProcessor( - cloud_logging.CloudLoggingExporter( - project_id=project_id, - default_log_name=os.getenv( - "GCP_DEFAULT_LOG_NAME", "adk-on-agent-engine" - ), - structured_json_file=sys.stdout, - ), - ) + return use_client_cert_str == 'true' diff --git a/src/google/adk/telemetry/node_tracing.py b/src/google/adk/telemetry/node_tracing.py deleted file mode 100644 index 500cb89459..0000000000 --- a/src/google/adk/telemetry/node_tracing.py +++ /dev/null @@ -1,146 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from collections.abc import AsyncIterator -from contextlib import asynccontextmanager -from dataclasses import dataclass -from dataclasses import field -from typing import TYPE_CHECKING - -from opentelemetry import context as context_api -from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_CONVERSATION_ID -from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_OPERATION_NAME -from opentelemetry.util.types import Attributes - -from ..agents.context import Context -from ..workflow._base_node import BaseNode -from .tracing import tracer - -if TYPE_CHECKING: - from ..events.event import Event - from ..workflow._workflow import Workflow - - -@dataclass(frozen=True) -class TelemetryContext: - """Telemetry specific context tied to the lifetime of the span.""" - - otel_context: context_api.Context - """OTel context holding the current trace span.""" - - _associated_event_ids: list[str] = field(default_factory=list) - """Event IDs added to the event queue within a given node.""" - - def add_event(self, event: Event) -> None: - """Adds an event ID to the associated events list.""" - self._associated_event_ids.append(event.id) - - -@dataclass -class _SpanMetadata: - name: str - attributes: Attributes - - -@asynccontextmanager -async def start_as_current_node_span( - context: Context, node: BaseNode -) -> AsyncIterator[TelemetryContext]: - """Creates a scope-based OpenTelemetry span, representing a node invocation. - - Implements emitting of the following spans: - - `invoke_agent {agent.name}` - - `invoke_workflow {workflow.name}` - - `invoke_node {node.name}` - - invoke_agent spans align with OpenTelemetry Semantic Conventions (semconv) version 1.36 spans for backwards compatibility. - https://github.com/open-telemetry/semantic-conventions/blob/v1.36.0/docs/gen-ai/README.md - - invoke_workflow spans align with semconv version 1.41, because these were not included in any prior releases. - https://github.com/open-telemetry/semantic-conventions/blob/main/docs/gen-ai/README.md - - invoke_node spans are not present in any semconv release. - We will create a proposal to standardize them. - - Args: - context: Context in which the span is created. - node: The node to be invoked inside the created span. - - Yields: - Context with the started span. - """ - - span_metadata = _span_metadata(context, node) - if span_metadata is None: - token = context_api.attach(context.telemetry_context.otel_context) - try: - yield TelemetryContext( - otel_context=context.telemetry_context.otel_context - ) - finally: - context_api.detach(token) - return - - with tracer.start_as_current_span( - span_metadata.name, - attributes=span_metadata.attributes, - context=context.telemetry_context.otel_context, - ) as span: - telemetry_context = TelemetryContext(otel_context=context_api.get_current()) - yield telemetry_context - - if span.is_recording() and len(telemetry_context._associated_event_ids) > 0: - span.set_attribute( - "gcp.vertex.agent.associated_event_ids", - telemetry_context._associated_event_ids, - ) - - -def _span_metadata(context: Context, node: BaseNode) -> _SpanMetadata | None: - from ..agents.base_agent import BaseAgent - from ..workflow._workflow import Workflow - - if isinstance(node, BaseAgent): - return None - elif isinstance(node, Workflow): - return _workflow_span_metadata(context, node) - else: - return _default_node_span_metadata(context, node) - - -def _workflow_span_metadata( - context: Context, workflow: Workflow -) -> _SpanMetadata: - return _SpanMetadata( - name=f"invoke_workflow {workflow.name}", - attributes={ - GEN_AI_OPERATION_NAME: "invoke_workflow", - "gen_ai.workflow.name": workflow.name, - GEN_AI_CONVERSATION_ID: context.session.id, - }, - ) - - -def _default_node_span_metadata( - context: Context, node: BaseNode -) -> _SpanMetadata: - return _SpanMetadata( - name=f"invoke_node {node.name}", - attributes={ - GEN_AI_OPERATION_NAME: "invoke_node", - GEN_AI_CONVERSATION_ID: context.session.id, - }, - ) diff --git a/src/google/adk/telemetry/tracing.py b/src/google/adk/telemetry/tracing.py index 93b335a7bb..32040b8bc6 100644 --- a/src/google/adk/telemetry/tracing.py +++ b/src/google/adk/telemetry/tracing.py @@ -66,13 +66,11 @@ from .. import version from ..utils.model_name_utils import is_gemini_model -from ._experimental_semconv import get_content_capturing_mode from ._experimental_semconv import is_experimental_semconv from ._experimental_semconv import maybe_log_completion_details from ._experimental_semconv import set_operation_details_attributes_from_request from ._experimental_semconv import set_operation_details_attributes_from_response from ._experimental_semconv import set_operation_details_common_attributes -from ._token_usage import TokenUsage # By default some ADK spans include attributes with potential PII data. # This env, when set to false, allows to disable populating those attributes. @@ -173,7 +171,6 @@ def trace_tool_call( function_response_event: Event | None, error: Exception | None = None, span: Span | None = None, - error_type: str | None = None, ): """Traces tool call. @@ -183,10 +180,6 @@ def trace_tool_call( function_response_event: The event with the function response details. error: The exception raised during tool execution, if any. span: The span to record attributes on. If None, uses current span. - error_type: An error type string detected from the tool's response dict - (e.g., "HTTP_ERROR", "MCP_TOOL_ERROR"). Used when the tool returned an - error as a dict rather than raising an exception. Ignored if `error` is - also set (exception takes precedence). """ span = span or trace.get_current_span() @@ -203,8 +196,6 @@ def trace_tool_call( span.set_attribute(ERROR_TYPE, str(error.error_type)) else: span.set_attribute(ERROR_TYPE, type(error).__name__) - elif error_type is not None: - span.set_attribute(ERROR_TYPE, error_type) # Special case for client side association with a remote tool call if ( @@ -305,16 +296,6 @@ def trace_merged_tool_calls( ) -def _set_usage_metadata_attributes( - span: Span, - usage_metadata: types.GenerateContentResponseUsageMetadata | None, -) -> None: - """Records usage metadata attributes on the given span.""" - if usage_metadata is None: - return - span.set_attributes(TokenUsage(usage_metadata).to_attributes()) - - def trace_call_llm( invocation_context: InvocationContext, event_id: str, @@ -390,7 +371,33 @@ def trace_call_llm( else: span.set_attribute('gcp.vertex.agent.llm_response', '{}') - _set_usage_metadata_attributes(span, llm_response.usage_metadata) + if llm_response.usage_metadata is not None: + if llm_response.usage_metadata.prompt_token_count is not None: + span.set_attribute( + 'gen_ai.usage.input_tokens', + llm_response.usage_metadata.prompt_token_count, + ) + if llm_response.usage_metadata.candidates_token_count is not None: + span.set_attribute( + 'gen_ai.usage.output_tokens', + llm_response.usage_metadata.candidates_token_count, + ) + try: + if llm_response.usage_metadata.thoughts_token_count is not None: + span.set_attribute( + 'gen_ai.usage.experimental.reasoning_tokens', + llm_response.usage_metadata.thoughts_token_count, + ) + except AttributeError: + pass + try: + if llm_response.usage_metadata.system_instruction_tokens is not None: + span.set_attribute( + 'gen_ai.usage.experimental.system_instruction_tokens', + llm_response.usage_metadata.system_instruction_tokens, + ) + except AttributeError: + pass if llm_response.finish_reason: try: finish_reason_str = llm_response.finish_reason.value.lower() @@ -549,25 +556,22 @@ def use_generate_content_span( common_attributes = { GEN_AI_AGENT_NAME: invocation_context.agent.name, GEN_AI_CONVERSATION_ID: invocation_context.session.id, + USER_ID: invocation_context.session.user_id, 'gcp.vertex.agent.event_id': model_response_event.id, 'gcp.vertex.agent.invocation_id': invocation_context.invocation_id, } - log_only_common_attributes = {} - if invocation_context.session.user_id is not None: - log_only_common_attributes[USER_ID] = invocation_context.session.user_id - if _should_emit_native_telemetry(invocation_context.agent): + if ( + _is_gemini_agent(invocation_context.agent) + and _instrumented_with_opentelemetry_instrumentation_google_genai() + ): + with _use_extra_generate_content_attributes(common_attributes): + yield + else: with _use_native_generate_content_span_stable_semconv( llm_request=llm_request, common_attributes=common_attributes, - log_only_common_attributes=log_only_common_attributes, ) as span: yield span.span - else: - with _use_extra_generate_content_attributes( - common_attributes, - log_only_extra_attributes=log_only_common_attributes, - ): - yield @asynccontextmanager @@ -586,23 +590,24 @@ async def use_inference_span( common_attributes = { GEN_AI_AGENT_NAME: invocation_context.agent.name, GEN_AI_CONVERSATION_ID: invocation_context.session.id, + USER_ID: invocation_context.session.user_id, 'gcp.vertex.agent.event_id': model_response_event.id, 'gcp.vertex.agent.invocation_id': invocation_context.invocation_id, } - log_only_common_attributes = {} - if invocation_context.session.user_id is not None: - log_only_common_attributes[USER_ID] = invocation_context.session.user_id - if _should_emit_native_telemetry(invocation_context.agent): + if ( + _is_gemini_agent(invocation_context.agent) + and _instrumented_with_opentelemetry_instrumentation_google_genai() + ): + with _use_extra_generate_content_attributes(common_attributes): + yield + else: async with _use_native_generate_content_span( llm_request=llm_request, common_attributes=common_attributes, - log_only_common_attributes=log_only_common_attributes, ) as gc_span: if is_experimental_semconv(): set_operation_details_common_attributes( - gc_span.operation_details_common_attributes, - common_attributes, - log_only_attributes=log_only_common_attributes, + gc_span.operation_details_common_attributes, common_attributes ) try: yield gc_span @@ -613,12 +618,6 @@ async def use_inference_span( gc_span.operation_details_attributes, gc_span.operation_details_common_attributes, ) - else: - with _use_extra_generate_content_attributes( - common_attributes, - log_only_extra_attributes=log_only_common_attributes, - ): - yield def _should_log_prompt_response_content() -> bool: @@ -662,21 +661,9 @@ def _instrumented_with_opentelemetry_instrumentation_google_genai() -> bool: return False -def _should_emit_native_telemetry(agent: BaseAgent) -> bool: - """If the google-genai instrumentation lib is active AND this is a Gemini agent, then the lib already emits inference metrics.""" - if ( - _instrumented_with_opentelemetry_instrumentation_google_genai() - and _is_gemini_agent(agent) - ): - return False - - return True - - @contextmanager def _use_extra_generate_content_attributes( extra_attributes: Mapping[str, AttributeValue], - log_only_extra_attributes: Mapping[str, AttributeValue] | None = None, ): try: from opentelemetry.instrumentation.google_genai import GENERATE_CONTENT_EXTRA_ATTRIBUTES_CONTEXT_KEY @@ -688,25 +675,13 @@ def _use_extra_generate_content_attributes( + ' Please upgrade to version to 0.6b0 or above.' ) yield - return - ctx = otel_context.set_value( - GENERATE_CONTENT_EXTRA_ATTRIBUTES_CONTEXT_KEY, extra_attributes - ) - if log_only_extra_attributes: - try: - from opentelemetry.instrumentation.google_genai import GENERATE_CONTENT_EVENT_ONLY_EXTRA_ATTRIBUTES_CONTEXT_KEY - - ctx = otel_context.set_value( - GENERATE_CONTENT_EVENT_ONLY_EXTRA_ATTRIBUTES_CONTEXT_KEY, - log_only_extra_attributes, - context=ctx, + tok = otel_context.attach( + otel_context.set_value( + GENERATE_CONTENT_EXTRA_ATTRIBUTES_CONTEXT_KEY, extra_attributes ) - except (ImportError, AttributeError): - pass - - tok = otel_context.attach(ctx) + ) try: yield finally: @@ -719,9 +694,12 @@ def _is_gemini_agent(agent: BaseAgent) -> bool: if not isinstance(agent, LlmAgent): return False - model = agent.model if agent.model != '' else agent._default_model - model_name = model if isinstance(model, str) else model.model - return is_gemini_model(model_name) + if isinstance(agent.model, str): + return is_gemini_model(agent.model) + + from ..models.google_llm import Gemini + + return isinstance(agent.model, Gemini) def _set_common_generate_content_attributes( @@ -738,7 +716,6 @@ def _set_common_generate_content_attributes( def _use_native_generate_content_span_stable_semconv( llm_request: LlmRequest, common_attributes: Mapping[str, AttributeValue], - log_only_common_attributes: Mapping[str, AttributeValue] | None = None, ) -> Iterator[GenerateContentSpan]: with tracer.start_as_current_span( f"generate_content {llm_request.model or ''}" @@ -760,18 +737,12 @@ def _use_native_generate_content_span_stable_semconv( attributes={GEN_AI_SYSTEM: _guess_gemini_system_name()}, ) ) - user_message_attributes = {GEN_AI_SYSTEM: _guess_gemini_system_name()} - if _should_log_prompt_response_content() and log_only_common_attributes: - user_id = log_only_common_attributes.get(USER_ID) - if user_id is not None: - user_message_attributes[USER_ID] = user_id - for content in llm_request.contents: otel_logger.emit( LogRecord( event_name='gen_ai.user.message', body={'content': _serialize_content_with_elision(content)}, - attributes=user_message_attributes, + attributes={GEN_AI_SYSTEM: _guess_gemini_system_name()}, ) ) @@ -782,13 +753,10 @@ def _use_native_generate_content_span_stable_semconv( async def _use_native_generate_content_span( llm_request: LlmRequest, common_attributes: Mapping[str, AttributeValue], - log_only_common_attributes: Mapping[str, AttributeValue] | None = None, ) -> AsyncIterator[GenerateContentSpan]: if not is_experimental_semconv(): with _use_native_generate_content_span_stable_semconv( - llm_request, - common_attributes, - log_only_common_attributes=log_only_common_attributes, + llm_request, common_attributes ) as gc_span: yield gc_span return @@ -834,7 +802,15 @@ def trace_generate_content_result(span: Span | None, llm_response: LlmResponse): if finish_reason := llm_response.finish_reason: span.set_attribute(GEN_AI_RESPONSE_FINISH_REASONS, [finish_reason.lower()]) - _set_usage_metadata_attributes(span, llm_response.usage_metadata) + if usage_metadata := llm_response.usage_metadata: + if usage_metadata.prompt_token_count is not None: + span.set_attribute( + GEN_AI_USAGE_INPUT_TOKENS, usage_metadata.prompt_token_count + ) + if usage_metadata.candidates_token_count is not None: + span.set_attribute( + GEN_AI_USAGE_OUTPUT_TOKENS, usage_metadata.candidates_token_count + ) otel_logger.emit( LogRecord( @@ -869,7 +845,15 @@ def trace_inference_result( if finish_reason := llm_response.finish_reason: span.set_attribute(GEN_AI_RESPONSE_FINISH_REASONS, [finish_reason.lower()]) - _set_usage_metadata_attributes(span, llm_response.usage_metadata) + if usage_metadata := llm_response.usage_metadata: + if usage_metadata.prompt_token_count is not None: + span.set_attribute( + GEN_AI_USAGE_INPUT_TOKENS, usage_metadata.prompt_token_count + ) + if usage_metadata.candidates_token_count is not None: + span.set_attribute( + GEN_AI_USAGE_OUTPUT_TOKENS, usage_metadata.candidates_token_count + ) if is_experimental_semconv() and isinstance(gc_span, GenerateContentSpan): set_operation_details_attributes_from_response( diff --git a/src/google/adk/tools/__init__.py b/src/google/adk/tools/__init__.py index 770a2cb373..b444e3a744 100644 --- a/src/google/adk/tools/__init__.py +++ b/src/google/adk/tools/__init__.py @@ -20,7 +20,6 @@ # The TYPE_CHECKING block is needed for autocomplete to work. if TYPE_CHECKING: from ..auth.auth_tool import AuthToolArguments - from ._request_input_tool import request_input from .agent_tool import AgentTool from .api_registry import ApiRegistry from .apihub_tool.apihub_toolset import APIHubToolset @@ -81,7 +80,6 @@ 'LongRunningFunctionTool', ), 'preload_memory': ('.preload_memory_tool', 'preload_memory_tool'), - 'request_input': ('._request_input_tool', 'request_input'), 'ToolContext': ('.tool_context', 'ToolContext'), 'transfer_to_agent': ('.transfer_to_agent_tool', 'transfer_to_agent'), 'TransferToAgentTool': ( diff --git a/src/google/adk/tools/_function_parameter_parse_util.py b/src/google/adk/tools/_function_parameter_parse_util.py index 096264de9e..a8e98980d5 100644 --- a/src/google/adk/tools/_function_parameter_parse_util.py +++ b/src/google/adk/tools/_function_parameter_parse_util.py @@ -247,7 +247,7 @@ def _parse_schema_from_parameter( _raise_if_schema_unsupported(variant, schema) return schema if ( - get_origin(param.annotation) in (Union, typing_types.UnionType) + get_origin(param.annotation) is Union # only parse simple UnionType, example int | str | float | bool # complex types.UnionType will be invoked in raise branch and all( @@ -276,10 +276,8 @@ def _parse_schema_from_parameter( schema.any_of.append(schema_in_any_of) unique_types.add(schema_in_any_of.model_dump_json(exclude_none=True)) if len(schema.any_of) == 1: # param: list | None -> Array - collapsed = schema.any_of[0] - if schema.nullable: - collapsed.nullable = True - schema = collapsed + schema.type = schema.any_of[0].type + schema.any_of = None if ( param.default is not inspect.Parameter.empty and param.default is not None @@ -289,10 +287,8 @@ def _parse_schema_from_parameter( schema.default = param.default _raise_if_schema_unsupported(variant, schema) return schema - if ( - isinstance(param.annotation, _GenericAlias) - or isinstance(param.annotation, typing_types.GenericAlias) - or isinstance(param.annotation, typing_types.UnionType) + if isinstance(param.annotation, _GenericAlias) or isinstance( + param.annotation, typing_types.GenericAlias ): origin = get_origin(param.annotation) args = get_args(param.annotation) @@ -334,7 +330,7 @@ def _parse_schema_from_parameter( schema.default = param.default _raise_if_schema_unsupported(variant, schema) return schema - if origin in (Union, typing_types.UnionType): + if origin is Union: schema.any_of = [] schema.type = types.Type.OBJECT unique_types = set() @@ -369,10 +365,8 @@ def _parse_schema_from_parameter( schema.any_of.append(schema_in_any_of) unique_types.add(schema_in_any_of.model_dump_json(exclude_none=True)) if len(schema.any_of) == 1: # param: Union[List, None] -> Array - collapsed = schema.any_of[0] - if schema.nullable: - collapsed.nullable = True - schema = collapsed + schema.type = schema.any_of[0].type + schema.any_of = None if ( param.default is not None and param.default is not inspect.Parameter.empty diff --git a/src/google/adk/tools/_function_tool_declarations.py b/src/google/adk/tools/_function_tool_declarations.py index a835cd899e..971cdc093a 100644 --- a/src/google/adk/tools/_function_tool_declarations.py +++ b/src/google/adk/tools/_function_tool_declarations.py @@ -162,21 +162,10 @@ def _build_response_json_schema( return_annotation = type_args[0] try: - try: - adapter = pydantic.TypeAdapter( - return_annotation, - config=pydantic.ConfigDict(arbitrary_types_allowed=True), - ) - except pydantic.PydanticUserError as e: - # If it failed, maybe it was because of the config argument (e.g. for dataclasses). - # Retry without config. - logging.debug( - 'Failed to build schema with config, retrying without config for' - ' %s: %s', - func.__name__, - e, - ) - adapter = pydantic.TypeAdapter(return_annotation) + adapter = pydantic.TypeAdapter( + return_annotation, + config=pydantic.ConfigDict(arbitrary_types_allowed=True), + ) return adapter.json_schema() except Exception: logging.warning( diff --git a/src/google/adk/tools/_request_input_tool.py b/src/google/adk/tools/_request_input_tool.py deleted file mode 100644 index 9a124f7e40..0000000000 --- a/src/google/adk/tools/_request_input_tool.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import logging -from typing import Any -from typing import Optional - -from google.adk.flows.llm_flows.functions import REQUEST_INPUT_FUNCTION_CALL_NAME - -from .long_running_tool import LongRunningFunctionTool - -logger = logging.getLogger('google_adk.' + __name__) - - -def _request_input_func( - message: str, - response_schema: Optional[dict[str, Any]] = None, -) -> None: - """Ask the user a question and wait for their response. - - Use this when you need clarification or additional information before - proceeding. - - Args: - message: The question or prompt to display to the user. - response_schema: JSON Schema describing the expected response format. Use - {"type": "string"} for free-text, {"type": "boolean"} for - yes/no, or a structured object schema for complex input. - - Returns: - None. Long-running tools return None to signal that the execution should - pause and wait for user input. - """ - logger.info('request_input called with message: %s', message) - # Returning None triggers the long-running tool interruption mechanism. - return None - - -# Dynamically rename the function to match the workflow interrupt naming space. -# This allows direct instantiation of LongRunningFunctionTool without subclassing, -# keeping RequestInputTool out of the public API. -_request_input_func.__name__ = REQUEST_INPUT_FUNCTION_CALL_NAME - -request_input = LongRunningFunctionTool(_request_input_func) diff --git a/src/google/adk/tools/agent_tool.py b/src/google/adk/tools/agent_tool.py index 1768861dba..2b8c083f23 100644 --- a/src/google/adk/tools/agent_tool.py +++ b/src/google/adk/tools/agent_tool.py @@ -14,14 +14,12 @@ from __future__ import annotations -import asyncio from typing import Any from typing import Optional from typing import TYPE_CHECKING from google.genai import types from pydantic import BaseModel -from pydantic import Field from pydantic import model_validator from typing_extensions import override @@ -249,12 +247,6 @@ async def run_async( credential_service=tool_context._invocation_context.credential_service, plugins=plugins, ) - # When plugins are inherited from the parent runner, the parent still owns - # them; tell the sub-Runner's plugin manager to skip closing them on exit - # so shared plugins (e.g. observability exporters) are not torn down while - # the parent is still using them. - if self.include_plugins: - runner.plugin_manager.set_skip_closing_plugins(True) state_dict = { k: v @@ -333,103 +325,3 @@ class AgentToolConfig(BaseToolConfig): include_plugins: bool = True """Whether to include plugins from parent runner context.""" - - -class _SingleTurnAgentTool(AgentTool): - """A tool that wraps a single-turn agent and runs it via ctx.run_node. - - This is only used in mode='chat' LlmAgent. - """ - - @override - async def run_async( - self, - *, - args: dict[str, Any], - tool_context: ToolContext, - ) -> Any: - input_schema = _get_input_schema(self.agent) - if input_schema: - try: - node_input = input_schema.model_validate(args) - except Exception as e: - return f'Error validating input: {e}' - else: - node_input = args.get('request') - - try: - return await tool_context.run_node( - self.agent, node_input=node_input, use_sub_branch=True - ) - except Exception as e: - return f'Error running sub-agent: {e}' - - -class _DefaultTaskInput(BaseModel): - request: str = Field( - description='Detailed instructions or context for the task sub-agent.' - ) - - -class _TaskAgentTool(AgentTool): - """A tool that wraps a task-mode agent and acts as a framework delegation marker. - - This is only used in mode='chat' LlmAgent. The wrapper intercepts calls - to this tool to drive task sub-agent execution via ctx.run_node. - """ - - def __init__( - self, - agent: BaseAgent, - skip_summarization: bool = False, - *, - include_plugins: bool = True, - propagate_grounding_metadata: bool = False, - ): - super().__init__( - agent, - skip_summarization, - include_plugins=include_plugins, - propagate_grounding_metadata=propagate_grounding_metadata, - ) - self._defers_response = True - - @override - def _get_declaration(self) -> types.FunctionDeclaration: - from ..utils.variant_utils import GoogleLLMVariant - - input_schema = _get_input_schema(self.agent) or _DefaultTaskInput - - from . import _function_tool_declarations - - result = ( - _function_tool_declarations.build_function_declaration_with_json_schema( - func=input_schema - ) - ) - base_desc = self.agent.description or '' - suffix = ( - '\nIMPORTANT: This tool delegates execution to a specialized agent.' - ' Do NOT call this tool in parallel with any other tools.' - ) - result.description = f'{base_desc}{suffix}'.strip() - result.name = self.name - - if self._api_variant != GoogleLLMVariant.GEMINI_API: - output_schema = _get_output_schema(self.agent) - if output_schema: - result.response_json_schema = {'type': 'object'} - else: - result.response_json_schema = {'type': 'string'} - - return result - - @override - async def run_async( - self, - *, - args: dict[str, Any], - tool_context: ToolContext, - ) -> Any: - # Framework handles task delegation dispatch directly via the wrapper. - return None diff --git a/src/google/adk/tools/base_tool.py b/src/google/adk/tools/base_tool.py index 9139c23d57..8dd112a6c8 100644 --- a/src/google/adk/tools/base_tool.py +++ b/src/google/adk/tools/base_tool.py @@ -33,6 +33,7 @@ from ..utils.variant_utils import get_google_llm_variant from ..utils.variant_utils import GoogleLLMVariant +from .tool_context import ToolContext logger = logging.getLogger("google_adk." + __name__) @@ -40,11 +41,6 @@ from ..models.llm_request import LlmRequest from .tool_configs import ToolArgsConfig -# Re-exported for backward compatibility: existing code imports ToolContext -# from this module and annotates tool methods with base_tool.ToolContext, which -# ADK resolves at runtime via get_type_hints(), so it must be importable here. -from .tool_context import ToolContext # pylint: disable=unused-import - SelfTool = TypeVar("SelfTool", bound="BaseTool") @@ -60,27 +56,6 @@ class BaseTool(ABC): """Whether the tool is a long running operation, which typically returns a resource id first and finishes the operation later.""" - _defers_response: bool = False - """⚠️ Internal — do not set this from external code. - - When True, the auto FunctionResponse build is skipped whenever - ``run_async`` returns a falsy value (typically ``None``). In that - case, some other orchestrator (e.g., the LlmAgent wrapper for task - delegation, or an external system for webhook-style callbacks) - produces the matching FR later in the conversation. - - When ``run_async`` returns a non-falsy value, the FR is built - normally — same as for any regular tool. - - Compare with ``is_long_running``, which has the same skip-on-empty - semantics but additionally marks the call as long-running on the - emitted event (``event.long_running_tool_ids``), affecting A2A - conversion, plugin logging, and interrupt tracking. - - Currently set only by ADK-internal tools (e.g. ``_TaskAgentTool``). - Not part of the public API and may change without notice. - """ - custom_metadata: Optional[dict[str, Any]] = None """The custom metadata of the BaseTool. @@ -101,7 +76,6 @@ def __init__( self.name = name self.description = description self.is_long_running = is_long_running - self._defers_response = False self.custom_metadata = custom_metadata def _get_declaration(self) -> Optional[types.FunctionDeclaration]: diff --git a/src/google/adk/tools/base_toolset.py b/src/google/adk/tools/base_toolset.py index 42e73a0094..25f0d6a2a2 100644 --- a/src/google/adk/tools/base_toolset.py +++ b/src/google/adk/tools/base_toolset.py @@ -192,7 +192,7 @@ def from_config( raise ValueError(f"from_config() not implemented for toolset: {cls}") def _is_tool_selected( - self, tool: BaseTool, readonly_context: Optional[ReadonlyContext] + self, tool: BaseTool, readonly_context: ReadonlyContext ) -> bool: if not self.tool_filter: return True diff --git a/src/google/adk/tools/bash_tool.py b/src/google/adk/tools/bash_tool.py index b9aba1554e..89de3bf34f 100644 --- a/src/google/adk/tools/bash_tool.py +++ b/src/google/adk/tools/bash_tool.py @@ -29,6 +29,7 @@ from google.genai import types +from .. import features from .base_tool import BaseTool from .tool_context import ToolContext @@ -98,6 +99,7 @@ def _set_resource_limits(policy: BashToolPolicy) -> None: logger.warning("Failed to set resource limits: %s", e) +@features.experimental(features.FeatureName.SKILL_TOOLSET) class ExecuteBashTool(BaseTool): """Tool to execute a validated bash command within a workspace directory.""" @@ -245,9 +247,3 @@ async def run_async( "stdout": stdout_res, "stderr": stderr_res, } - - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get("error"): - return "TOOL_ERROR" - return None diff --git a/src/google/adk/tools/bigquery/__init__.py b/src/google/adk/tools/bigquery/__init__.py index b4e38ef5d4..0c4f910df9 100644 --- a/src/google/adk/tools/bigquery/__init__.py +++ b/src/google/adk/tools/bigquery/__init__.py @@ -27,42 +27,10 @@ execute_sql can't arbitrarily mutate existing data. """ -from __future__ import annotations +from .bigquery_credentials import BigQueryCredentialsConfig +from .bigquery_toolset import BigQueryToolset -import importlib -import typing -import warnings - -warnings.warn( - "google.adk.tools.bigquery is deprecated, use" - " google.adk.integrations.bigquery instead", - DeprecationWarning, - stacklevel=2, -) - -if typing.TYPE_CHECKING: - from google.adk.integrations.bigquery import BigQueryCredentialsConfig - from google.adk.integrations.bigquery import BigQueryToolset - from google.adk.integrations.bigquery import get_bigquery_skill - -# Forward public names to integrations/bigquery for backward compatibility. -# Uses __getattr__ instead of sys.modules replacement so that submodules -# (e.g. bigquery_skill) under this package remain importable. -_TARGET = "google.adk.integrations.bigquery" - -_FORWARDED_NAMES = { +__all__ = [ "BigQueryToolset", "BigQueryCredentialsConfig", - "get_bigquery_skill", -} - - -def __getattr__(name: str) -> typing.Any: - if name in _FORWARDED_NAMES: - mod = importlib.import_module(_TARGET) - return getattr(mod, name) - raise AttributeError(f"module {__name__!r} has no attribute {name!r}") - - -def __dir__() -> list[str]: - return list(_FORWARDED_NAMES) +] diff --git a/src/google/adk/tools/bigquery/bigquery_credentials.py b/src/google/adk/tools/bigquery/bigquery_credentials.py index 8555b21f55..768b001a87 100644 --- a/src/google/adk/tools/bigquery/bigquery_credentials.py +++ b/src/google/adk/tools/bigquery/bigquery_credentials.py @@ -14,13 +14,30 @@ from __future__ import annotations -import warnings +from ...features import FeatureName +from .._google_credentials import BaseGoogleCredentialsConfig -from google.adk.integrations.bigquery.bigquery_credentials import * +BIGQUERY_TOKEN_CACHE_KEY = "bigquery_token_cache" +BIGQUERY_SCOPES = [ + "https://www.googleapis.com/auth/bigquery", + "https://www.googleapis.com/auth/dataplex.read-write", +] +BIGQUERY_DEFAULT_SCOPE = ["https://www.googleapis.com/auth/bigquery"] -warnings.warn( - "google.adk.tools.bigquery.bigquery_credentials is moved to" - " google.adk.integrations.bigquery.bigquery_credentials", - DeprecationWarning, - stacklevel=2, -) + +class BigQueryCredentialsConfig(BaseGoogleCredentialsConfig): + """BigQuery Credentials Configuration for Google API tools. + + Please do not use this in production, as it may be deprecated later. + """ + + def __post_init__(self) -> BigQueryCredentialsConfig: + """Populate default scope if scopes is None.""" + super().__post_init__() + + if not self.scopes: + self.scopes = BIGQUERY_SCOPES + # Set the token cache key + self._token_cache_key = BIGQUERY_TOKEN_CACHE_KEY + + return self diff --git a/src/google/adk/tools/bigquery/bigquery_toolset.py b/src/google/adk/tools/bigquery/bigquery_toolset.py index 11d13bcd88..37a5070996 100644 --- a/src/google/adk/tools/bigquery/bigquery_toolset.py +++ b/src/google/adk/tools/bigquery/bigquery_toolset.py @@ -14,13 +14,88 @@ from __future__ import annotations -import warnings +from typing import List +from typing import Optional +from typing import Union -from google.adk.integrations.bigquery.bigquery_toolset import * +from google.adk.agents.readonly_context import ReadonlyContext +from typing_extensions import override -warnings.warn( - "google.adk.tools.bigquery.bigquery_toolset is moved to" - " google.adk.integrations.bigquery.bigquery_toolset", - DeprecationWarning, - stacklevel=2, -) +from . import data_insights_tool +from . import metadata_tool +from . import query_tool +from . import search_tool +from ...features import FeatureName +from ...tools.base_tool import BaseTool +from ...tools.base_toolset import BaseToolset +from ...tools.base_toolset import ToolPredicate +from ...tools.google_tool import GoogleTool +from .bigquery_credentials import BigQueryCredentialsConfig +from .config import BigQueryToolConfig + + +class BigQueryToolset(BaseToolset): + """BigQuery Toolset contains tools for interacting with BigQuery data and metadata.""" + + def __init__( + self, + *, + tool_filter: Optional[Union[ToolPredicate, List[str]]] = None, + credentials_config: Optional[BigQueryCredentialsConfig] = None, + bigquery_tool_config: Optional[BigQueryToolConfig] = None, + ): + super().__init__(tool_filter=tool_filter) + self._credentials_config = credentials_config + self._tool_settings = ( + bigquery_tool_config if bigquery_tool_config else BigQueryToolConfig() + ) + + def _is_tool_selected( + self, tool: BaseTool, readonly_context: ReadonlyContext + ) -> bool: + if self.tool_filter is None: + return True + + if isinstance(self.tool_filter, ToolPredicate): + return self.tool_filter(tool, readonly_context) + + if isinstance(self.tool_filter, list): + return tool.name in self.tool_filter + + return False + + @override + async def get_tools( + self, readonly_context: Optional[ReadonlyContext] = None + ) -> List[BaseTool]: + """Get tools from the toolset.""" + all_tools = [ + GoogleTool( + func=func, + credentials_config=self._credentials_config, + tool_settings=self._tool_settings, + ) + for func in [ + metadata_tool.get_dataset_info, + metadata_tool.get_table_info, + metadata_tool.list_dataset_ids, + metadata_tool.list_table_ids, + metadata_tool.get_job_info, + query_tool.get_execute_sql(self._tool_settings), + query_tool.forecast, + query_tool.analyze_contribution, + query_tool.detect_anomalies, + data_insights_tool.ask_data_insights, + search_tool.search_catalog, + ] + ] + + return [ + tool + for tool in all_tools + if self._is_tool_selected(tool, readonly_context) + ] + + @override + async def close(self): + pass diff --git a/src/google/adk/tools/bigquery/client.py b/src/google/adk/tools/bigquery/client.py index 40a2459314..526a181420 100644 --- a/src/google/adk/tools/bigquery/client.py +++ b/src/google/adk/tools/bigquery/client.py @@ -14,13 +14,102 @@ from __future__ import annotations -import warnings +import os +from typing import List +from typing import Optional +from typing import Union -from google.adk.integrations.bigquery.client import * +import google.api_core.client_info +from google.api_core.gapic_v1 import client_info as gapic_client_info +from google.auth.credentials import Credentials +from google.cloud import bigquery +from google.cloud import dataplex_v1 -warnings.warn( - "google.adk.tools.bigquery.client is moved to" - " google.adk.integrations.bigquery.client", - DeprecationWarning, - stacklevel=2, -) +from ... import version +from ...utils._telemetry_context import _is_visual_builder + +USER_AGENT_BASE = f"google-adk/{version.__version__}" +BQ_USER_AGENT = f"adk-bigquery-tool {USER_AGENT_BASE}" +DP_USER_AGENT = f"adk-dataplex-tool {USER_AGENT_BASE}" +USER_AGENT = BQ_USER_AGENT + +# Internal identifier for Visual Builder usage tracking. +_VISUAL_BUILDER_UA = "google-adk-visual-builder" + + +def get_bigquery_client( + *, + project: Optional[str], + credentials: Credentials, + location: Optional[str] = None, + user_agent: Optional[Union[str, List[str]]] = None, +) -> bigquery.Client: + """Get a BigQuery client. + + Args: + project: The GCP project ID. + credentials: The credentials to use for the request. + location: The location of the BigQuery client. + user_agent: The user agent to use for the request. + + Returns: + A BigQuery client. + """ + + user_agents = [BQ_USER_AGENT] + + if _is_visual_builder.get(): + user_agents.append(_VISUAL_BUILDER_UA) + + if user_agent: + if isinstance(user_agent, str): + user_agents.append(user_agent) + else: + user_agents.extend([ua for ua in user_agent if ua]) + + client_info = google.api_core.client_info.ClientInfo( + user_agent=" ".join(user_agents) + ) + + bigquery_client = bigquery.Client( + project=project, + credentials=credentials, + location=location, + client_info=client_info, + ) + + return bigquery_client + + +def get_dataplex_catalog_client( + *, + credentials: Credentials, + user_agent: Optional[Union[str, List[str]]] = None, +) -> dataplex_v1.CatalogServiceClient: + """Get a Dataplex CatalogServiceClient with minimal necessary arguments. + + Args: + credentials: The credentials to use for the request. + user_agent: Additional user agent string(s) to append. + + Returns: + A Dataplex Client. + """ + + user_agents = [DP_USER_AGENT] + + if _is_visual_builder.get(): + user_agents.append(_VISUAL_BUILDER_UA) + + if user_agent: + if isinstance(user_agent, str): + user_agents.append(user_agent) + else: + user_agents.extend([ua for ua in user_agent if ua]) + + client_info = gapic_client_info.ClientInfo(user_agent=" ".join(user_agents)) + + return dataplex_v1.CatalogServiceClient( + credentials=credentials, + client_info=client_info, + ) diff --git a/src/google/adk/tools/bigquery/config.py b/src/google/adk/tools/bigquery/config.py index 3121ad0ef4..e2c56ab1e3 100644 --- a/src/google/adk/tools/bigquery/config.py +++ b/src/google/adk/tools/bigquery/config.py @@ -14,13 +14,145 @@ from __future__ import annotations -import warnings +from enum import Enum +from typing import Optional -from google.adk.integrations.bigquery.config import * +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import field_validator -warnings.warn( - "google.adk.tools.bigquery.config is moved to" - " google.adk.integrations.bigquery.config", - DeprecationWarning, - stacklevel=2, -) +from ...features import FeatureName + + +class WriteMode(Enum): + """Write mode indicating what levels of write operations are allowed in BigQuery.""" + + BLOCKED = 'blocked' + """No write operations are allowed. + + This mode implies that only read (i.e. SELECT query) operations are allowed. + """ + + PROTECTED = 'protected' + """Only protected write operations are allowed in a BigQuery session. + + In this mode write operations in the anonymous dataset of a BigQuery session + are allowed. For example, a temporary table can be created, manipulated and + deleted in the anonymous dataset during Agent interaction, while protecting + permanent tables from being modified or deleted. To learn more about BigQuery + sessions, see https://cloud.google.com/bigquery/docs/sessions-intro. + """ + + ALLOWED = 'allowed' + """All write operations are allowed.""" + + +class BigQueryToolConfig(BaseModel): + """Configuration for BigQuery tools.""" + + # Forbid any fields not defined in the model + model_config = ConfigDict(extra='forbid') + + write_mode: WriteMode = WriteMode.BLOCKED + """Write mode for BigQuery tools. + + By default, the tool will allow only read operations. This behaviour may + change in future versions. + """ + + maximum_bytes_billed: Optional[int] = None + """Maximum number of bytes to bill for a query. + + In BigQuery on-demand pricing, charges are rounded up to the nearest MB, with + a minimum 10 MB data processed per table referenced by the query, and with a + minimum 10 MB data processed per query. So this value must be set >=10485760. + """ + + max_query_result_rows: int = 50 + """Maximum number of rows to return from a query. + + By default, the query result will be limited to 50 rows. + """ + + application_name: Optional[str] = None + """Name of the application using the BigQuery tools. + + By default, no particular application name will be set in the BigQuery + interaction. But if the tool user (agent builder) wants to differentiate + their application/agent for tracking or support purpose, they can set this + field. If set, this value will be added to the user_agent in BigQuery API + calls, and also to the BigQuery job labels with the key + "adk-bigquery-application-name". + + Note: This field is for usage discovery and tracking purposes only and should + not be used for security-sensitive decisions. + """ + + compute_project_id: Optional[str] = None + """GCP project ID to use for the BigQuery compute operations. + + This can be set as a guardrail to ensure that the tools perform the compute + operations (such as query execution) in a specific project. + """ + + location: Optional[str] = None + """BigQuery location to use for the data and compute. + + This can be set if the BigQuery tools are expected to process data in a + particular BigQuery location. If not set, then location would be automatically + determined based on the data location in the query. For all supported + locations, see https://cloud.google.com/bigquery/docs/locations. + """ + + job_labels: Optional[dict[str, str]] = None + """Labels to apply to BigQuery jobs for tracking and monitoring. + + These labels will be added to all BigQuery jobs executed by the tools. + Labels must be key-value pairs where both keys and values are strings. + Labels can be used for billing, monitoring, and resource organization. + For more information about labels, see + https://cloud.google.com/bigquery/docs/labels-intro. + + Note: These labels are for usage discovery and tracking purposes only and + should not be used for security-sensitive decisions. The number of + user-provided labels is restricted to 20, and keys starting with + "adk-bigquery-" are reserved for internal usage. + """ + + @field_validator('maximum_bytes_billed') + @classmethod + def validate_maximum_bytes_billed(cls, v): + """Validate the maximum bytes billed.""" + if v and v < 10_485_760: + raise ValueError( + 'In BigQuery on-demand pricing, charges are rounded up to the nearest' + ' MB, with a minimum 10 MB data processed per table referenced by the' + ' query, and with a minimum 10 MB data processed per query. So' + ' max_bytes_billed must be set >=10485760.' + ) + return v + + @field_validator('application_name') + @classmethod + def validate_application_name(cls, v): + """Validate the application name.""" + if v and ' ' in v: + raise ValueError('Application name should not contain spaces.') + return v + + @field_validator('job_labels') + @classmethod + def validate_job_labels(cls, v): + """Validate the job labels.""" + if v is not None: + if len(v) > 20: + raise ValueError('Only up to 20 job labels can be provided') + for key in v.keys(): + if not key: + raise ValueError('Label keys cannot be empty.') + if key.startswith('adk-bigquery-'): + raise ValueError( + 'Label key cannot start with "adk-bigquery-" as it is' + f' reserved for internal usage, found "{key}".' + ) + return v diff --git a/src/google/adk/tools/bigquery/data_insights_tool.py b/src/google/adk/tools/bigquery/data_insights_tool.py index d14da76f0d..45f45d874f 100644 --- a/src/google/adk/tools/bigquery/data_insights_tool.py +++ b/src/google/adk/tools/bigquery/data_insights_tool.py @@ -11,16 +11,175 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - from __future__ import annotations -import warnings +import json +from typing import Any +from typing import Dict +from typing import List + +from google.auth.credentials import Credentials +from google.cloud import bigquery +import requests + +from . import client +from .. import _gda_stream_util +from .config import BigQueryToolConfig + +_GDA_CLIENT_ID = "GOOGLE_ADK" + + +def ask_data_insights( + project_id: str, + user_query_with_context: str, + table_references: List[Dict[str, str]], + credentials: Credentials, + settings: BigQueryToolConfig, +) -> Dict[str, Any]: + """Answers questions about structured data in BigQuery tables using natural language. + + This function takes a user's question (which can include conversational + history for context) and references to specific BigQuery tables, and sends + them to a stateless conversational API. + + The API uses a GenAI agent to understand the question, generate and execute + SQL queries and Python code, and formulate an answer. This function returns a + detailed, sequential log of this entire process, which includes any generated + SQL or Python code, the data retrieved, and the final text answer. The final + answer is always in plain text, as the underlying API is instructed not to + generate any charts, graphs, images, or other visualizations. + + Use this tool to perform data analysis, get insights, or answer complex + questions about the contents of specific BigQuery tables. + + Args: + project_id (str): The project that the inquiry is performed in. + user_query_with_context (str): The user's original request, enriched with + relevant context from the conversation history. The user's core intent + should be preserved, but context should be added to resolve ambiguities + in follow-up questions. + table_references (List[Dict[str, str]]): A list of dictionaries, each + specifying a BigQuery table to be used as context for the question. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + + Returns: + A dictionary with two keys: + - 'status': A string indicating the final status (e.g., "SUCCESS"). + - 'response': A list of dictionaries, where each dictionary + represents a step in the agent's execution process and can + contain keys like 'text', 'data', or 'Data Retrieved' indicating + thought process, SQL generation, data retrieval, or final answer. + + Example: + A query joining multiple tables, showing the full return structure. + The original question: "Which customer from New York spent the most last + month?" + + >>> ask_data_insights( + ... project_id="some-project-id", + ... user_query_with_context=( + ... "Which customer from New York spent the most last month?" + ... "Context: The 'customers' table joins with the 'orders' table" + ... " on the 'customer_id' column." + ... "" + ... ), + ... table_references=[ + ... { + ... "projectId": "my-gcp-project", + ... "datasetId": "sales_data", + ... "tableId": "customers" + ... }, + ... { + ... "projectId": "my-gcp-project", + ... "datasetId": "sales_data", + ... "tableId": "orders" + ... } + ... ] + ... ) + { + "status": "SUCCESS", + "response": [ + { + "text": { + "parts": [ + "Analyzing context", + "Retrieved context for 2 tables." + ], + "textType": "THOUGHT" + } + }, + { + "data": { + "generatedSql": "SELECT t1.customer_name, SUM(t2.order_total) ..." + } + }, + { + "Data Retrieved": { + "headers": ["customer_name", "total_spent"], + "rows": [["Jane Doe", 1234.56]], + "summary": "Showing all 1 rows." + } + }, + { + "text": { + "parts": [ + "The customer who spent the most was Jane Doe." + ], + "textType": "FINAL_RESPONSE" + } + } + ] + } + """ + try: + location = "global" + if not credentials.token: + error_message = ( + "Error: The provided credentials object does not have a valid access" + " token.\n\nThis is often because the credentials need to be" + " refreshed or require specific API scopes. Please ensure the" + " credentials are prepared correctly before calling this" + " function.\n\nThere may be other underlying causes as well." + ) + return { + "status": "ERROR", + "error_details": "ask_data_insights requires a valid access token.", + } + headers = { + "Authorization": f"Bearer {credentials.token}", + "Content-Type": "application/json", + "X-Goog-API-Client": _GDA_CLIENT_ID, + } + ca_url = f"https://geminidataanalytics.googleapis.com/v1beta/projects/{project_id}/locations/{location}:chat" + + instructions = """**INSTRUCTIONS - FOLLOW THESE RULES:** + 1. **CONTENT:** Your answer should present the supporting data and then provide a conclusion based on that data, including relevant details and observations where possible. + 2. **ANALYSIS DEPTH:** Your analysis must go beyond surface-level observations. Crucially, you must prioritize metrics that measure impact or outcomes over metrics that simply measure volume or raw counts. For open-ended questions, explore the topic from multiple perspectives to provide a holistic view. + 3. **OUTPUT FORMAT:** Your entire response MUST be in plain text format ONLY. + 4. **NO CHARTS:** You are STRICTLY FORBIDDEN from generating any charts, graphs, images, or any other form of visualization. + """ + + ca_payload = { + "project": f"projects/{project_id}", + "messages": [{"userMessage": {"text": user_query_with_context}}], + "inlineContext": { + "datasourceReferences": { + "bq": {"tableReferences": table_references} + }, + "systemInstruction": instructions, + "options": {"chart": {"image": {"noImage": {}}}}, + }, + "clientIdEnum": _GDA_CLIENT_ID, + } -from google.adk.integrations.bigquery.data_insights_tool import * + resp = _gda_stream_util.get_stream( + ca_url, ca_payload, headers, settings.max_query_result_rows + ) + except Exception as ex: # pylint: disable=broad-except + return { + "status": "ERROR", + "error_details": str(ex), + } -warnings.warn( - "google.adk.tools.bigquery.data_insights_tool is moved to" - " google.adk.integrations.bigquery.data_insights_tool", - DeprecationWarning, - stacklevel=2, -) + return {"status": "SUCCESS", "response": resp} diff --git a/src/google/adk/tools/bigquery/metadata_tool.py b/src/google/adk/tools/bigquery/metadata_tool.py index 7ddafb84b9..d9046da5fc 100644 --- a/src/google/adk/tools/bigquery/metadata_tool.py +++ b/src/google/adk/tools/bigquery/metadata_tool.py @@ -14,13 +14,581 @@ from __future__ import annotations -import warnings +from google.auth.credentials import Credentials +from google.cloud import bigquery -from google.adk.integrations.bigquery.metadata_tool import * +from . import client +from .config import BigQueryToolConfig -warnings.warn( - "google.adk.tools.bigquery.metadata_tool is moved to" - " google.adk.integrations.bigquery.metadata_tool", - DeprecationWarning, - stacklevel=2, -) + +def list_dataset_ids( + project_id: str, credentials: Credentials, settings: BigQueryToolConfig +) -> list[str]: + """List BigQuery dataset ids in a Google Cloud project. + + Args: + project_id (str): The Google Cloud project id. + credentials (Credentials): The credentials to use for the request. + + Returns: + list[str]: List of the BigQuery dataset ids present in the project. + + Examples: + >>> list_dataset_ids("bigquery-public-data") + ['america_health_rankings', + 'american_community_survey', + 'aml_ai_input_dataset', + 'austin_311', + 'austin_bikeshare', + 'austin_crime', + 'austin_incidents', + 'austin_waste', + 'baseball', + 'bbc_news'] + """ + try: + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=[settings.application_name, "list_dataset_ids"], + ) + + datasets = [] + for dataset in bq_client.list_datasets(project_id): + datasets.append(dataset.dataset_id) + return datasets + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } + + +def get_dataset_info( + project_id: str, + dataset_id: str, + credentials: Credentials, + settings: BigQueryToolConfig, +) -> dict: + """Get metadata information about a BigQuery dataset. + + Args: + project_id (str): The Google Cloud project id containing the dataset. + dataset_id (str): The BigQuery dataset id. + credentials (Credentials): The credentials to use for the request. + + Returns: + dict: Dictionary representing the properties of the dataset. + + Examples: + >>> get_dataset_info("bigquery-public-data", "cdc_places") + { + "kind": "bigquery#dataset", + "etag": "fz9BaiXKgbGi53EpI2rJug==", + "id": "bigquery-public-data:cdc_places", + "selfLink": "https://content-bigquery.googleapis.com/bigquery/v2/projects/bigquery-public-data/datasets/cdc_places", + "datasetReference": { + "datasetId": "cdc_places", + "projectId": "bigquery-public-data" + }, + "description": "Local Data for Better Health, County Data", + "access": [ + { + "role": "WRITER", + "specialGroup": "projectWriters" + }, + { + "role": "OWNER", + "specialGroup": "projectOwners" + }, + { + "role": "OWNER", + "userByEmail": "some-redacted-email@bigquery-public-data.iam.gserviceaccount.com" + }, + { + "role": "READER", + "specialGroup": "projectReaders" + } + ], + "creationTime": "1640891845643", + "lastModifiedTime": "1640891845643", + "location": "US", + "type": "DEFAULT", + "maxTimeTravelHours": "168" + } + """ + try: + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=[settings.application_name, "get_dataset_info"], + ) + dataset = bq_client.get_dataset( + bigquery.DatasetReference(project_id, dataset_id) + ) + return dataset.to_api_repr() + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } + + +def list_table_ids( + project_id: str, + dataset_id: str, + credentials: Credentials, + settings: BigQueryToolConfig, +) -> list[str]: + """List table ids in a BigQuery dataset. + + Args: + project_id (str): The Google Cloud project id containing the dataset. + dataset_id (str): The BigQuery dataset id. + credentials (Credentials): The credentials to use for the request. + + Returns: + list[str]: List of the tables ids present in the dataset. + + Examples: + >>> list_table_ids("bigquery-public-data", "cdc_places") + ['chronic_disease_indicators', + 'local_data_for_better_health_county_data'] + """ + try: + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=[settings.application_name, "list_table_ids"], + ) + + tables = [] + for table in bq_client.list_tables( + bigquery.DatasetReference(project_id, dataset_id) + ): + tables.append(table.table_id) + return tables + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } + + +def get_table_info( + project_id: str, + dataset_id: str, + table_id: str, + credentials: Credentials, + settings: BigQueryToolConfig, +) -> dict: + """Get metadata information about a BigQuery table. + + Args: + project_id (str): The Google Cloud project id containing the dataset. + dataset_id (str): The BigQuery dataset id containing the table. + table_id (str): The BigQuery table id. + credentials (Credentials): The credentials to use for the request. + + Returns: + dict: Dictionary representing the properties of the table. + + Examples: + >>> get_table_info("bigquery-public-data", "cdc_places", "local_data_for_better_health_county_data") + { + "kind": "bigquery#table", + "etag": "wx23aDqmgc39oUSiNuYTAA==", + "id": "bigquery-public-data:cdc_places.local_data_for_better_health_county_data", + "selfLink": "https://content-bigquery.googleapis.com/bigquery/v2/projects/bigquery-public-data/datasets/cdc_places/tables/local_data_for_better_health_county_data", + "tableReference": { + "projectId": "bigquery-public-data", + "datasetId": "cdc_places", + "tableId": "local_data_for_better_health_county_data" + }, + "description": "Local Data for Better Health, County Data", + "schema": { + "fields": [ + { + "name": "year", + "type": "INTEGER", + "mode": "NULLABLE" + }, + { + "name": "stateabbr", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "statedesc", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "locationname", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "datasource", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "category", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "measure", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "data_value_unit", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "data_value_type", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "data_value", + "type": "FLOAT", + "mode": "NULLABLE" + } + ] + }, + "numBytes": "234849", + "numLongTermBytes": "0", + "numRows": "1000", + "creationTime": "1640891846119", + "lastModifiedTime": "1749427268137", + "type": "TABLE", + "location": "US", + "numTimeTravelPhysicalBytes": "285737", + "numTotalLogicalBytes": "234849", + "numActiveLogicalBytes": "234849", + "numLongTermLogicalBytes": "0", + "numTotalPhysicalBytes": "326557", + "numActivePhysicalBytes": "326557", + "numLongTermPhysicalBytes": "0", + "numCurrentPhysicalBytes": "40820" + } + """ + try: + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=[settings.application_name, "get_table_info"], + ) + return bq_client.get_table( + bigquery.TableReference( + bigquery.DatasetReference(project_id, dataset_id), table_id + ) + ).to_api_repr() + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } + + +def get_job_info( + project_id: str, + job_id: str, + credentials: Credentials, + settings: BigQueryToolConfig, +) -> dict: + """Get metadata information about a BigQuery job. Including slot usage, + job configuration, job statistics, job status, original query etc. + + Args: + project_id (str): The Google Cloud project id containing the job. + job_id (str): The BigQuery job id. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The BigQuery tool settings. + + Returns: + dict: Dictionary representing the properties of the job. + + Examples: + >>> user may give job id in format of: project_id:region.job_id + like bigquery-public-data:US.bquxjob_12345678_1234567890 + >>> get_job_info("bigquery-public-data", "bquxjob_12345678_1234567890") + { + "get_job_info_response": { + "configuration": { + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_fd6de55d5d5c13fcfb0449cbf933bb695b2c3085", + "projectId": "projectid", + "tableId": "anonfbbe65d6_9782_469b_9f56_1392560314b2" + }, + "priority": "INTERACTIVE", + "query": "SELECT * FROM `projectid.dataset_id.table_id` WHERE TIMESTAMP_TRUNC(_PARTITIONTIME, DAY) = TIMESTAMP(\"2025-10-29\") LIMIT 1000", + "useLegacySql": false, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "etag": "EdeYv9sdcO7tD9HsffvcuQ==", + "id": "projectid:US.job-id", + "jobCreationReason": { + "code": "REQUESTED" + }, + "jobReference": { + "jobId": "job-id", + "location": "US", + "projectId": "projectid" + }, + "kind": "bigquery#job", + "principal_subject": "user:abc@google.com", + "selfLink": "https://bigquery.googleapis.com/bigquery/v2/projects/projectid/jobs/job-id?location=US", + "statistics": { + "creationTime": 1761760370152, + "endTime": 1761760371250, + "finalExecutionDurationMs": "489", + "query": { + "billingTier": 1, + "cacheHit": false, + "estimatedBytesProcessed": "5597805", + "metadataCacheStatistics": { + "tableMetadataCacheUsage": [ + { + "explanation": "Table does not have CMETA.", + "tableReference": { + "datasetId": "datasetId", + "projectId": "projectid", + "tableId": "tableId" + }, + "unusedReason": "OTHER_REASON" + } + ] + }, + "queryPlan": [ + { + "completedParallelInputs": "3", + "computeMode": "BIGQUERY", + "computeMsAvg": "13", + "computeMsMax": "15", + "computeRatioAvg": 0.054852320675105488, + "computeRatioMax": 0.063291139240506333, + "endMs": "1761760370422", + "id": "0", + "name": "S00: Input", + "parallelInputs": "8", + "readMsAvg": "18", + "readMsMax": "21", + "readRatioAvg": 0.0759493670886076, + "readRatioMax": 0.088607594936708861, + "recordsRead": "1690", + "recordsWritten": "1690", + "shuffleOutputBytes": "1031149", + "shuffleOutputBytesSpilled": "0", + "slotMs": "157", + "startMs": "1761760370388", + "status": "COMPLETE", + "steps": [ + { + "kind": "READ", + "substeps": [ + "$2:extendedFields.$is_not_null, $3:extendedFields.traceId, $4:span.$is_not_null, $5:span.spanKind, $6:span.endTime, $7:span.startTime, $8:span.parentSpanId, $9:span.spanId, $10:span.name, $11:span.childSpanCount.$is_not_null, $12:span.childSpanCount.value, $13:span.sameProcessAsParentSpan.$is_not_null, $14:span.sameProcessAsParentSpan.value, $15:span.status.$is_not_null, $16:span.status.message, $17:span.status.code", + "FROM projectid.dataset_id.table_id", + "WHERE equal(timestamp_trunc($1, 3), 1761696000.000000000)" + ] + }, + { + "kind": "LIMIT", + "substeps": [ + "1000" + ] + }, + { + "kind": "WRITE", + "substeps": [ + "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17", + "TO __stage00_output" + ] + } + ], + "waitMsAvg": "1", + "waitMsMax": "1", + "waitRatioAvg": 0.0042194092827004216, + "waitRatioMax": 0.0042194092827004216, + "writeMsAvg": "2", + "writeMsMax": "2", + "writeRatioAvg": 0.0084388185654008432, + "writeRatioMax": 0.0084388185654008432 + }, + { + "completedParallelInputs": "1", + "computeMode": "BIGQUERY", + "computeMsAvg": "22", + "computeMsMax": "22", + "computeRatioAvg": 0.092827004219409287, + "computeRatioMax": 0.092827004219409287, + "endMs": "1761760370428", + "id": "1", + "inputStages": [ + "0" + ], + "name": "S01: Compute+", + "parallelInputs": "1", + "readMsAvg": "0", + "readMsMax": "0", + "readRatioAvg": 0, + "readRatioMax": 0, + "recordsRead": "1001", + "recordsWritten": "1000", + "shuffleOutputBytes": "800157", + "shuffleOutputBytesSpilled": "0", + "slotMs": "29", + "startMs": "1761760370398", + "status": "COMPLETE", + "steps": [ + { + "kind": "READ", + "substeps": [ + "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17", + "FROM __stage00_output" + ] + }, + { + "kind": "COMPUTE", + "substeps": [ + "$130 := MAKE_STRUCT($3, $2)", + "$131 := MAKE_STRUCT($10, $9, $8, MAKE_STRUCT($29, $28, $27), $7, $6, MAKE_STRUCT(...), MAKE_STRUCT(...), MAKE_STRUCT(...), ...)" + ] + }, + { + "kind": "LIMIT", + "substeps": [ + "1000" + ] + }, + { + "kind": "WRITE", + "substeps": [ + "$130, $131", + "TO __stage01_output" + ] + } + ], + "waitMsAvg": "7", + "waitMsMax": "7", + "waitRatioAvg": 0.029535864978902954, + "waitRatioMax": 0.029535864978902954, + "writeMsAvg": "4", + "writeMsMax": "4", + "writeRatioAvg": 0.016877637130801686, + "writeRatioMax": 0.016877637130801686 + }, + { + "completedParallelInputs": "1", + "computeMode": "BIGQUERY", + "computeMsAvg": "33", + "computeMsMax": "33", + "computeRatioAvg": 0.13924050632911392, + "computeRatioMax": 0.13924050632911392, + "endMs": "1761760370745", + "id": "2", + "inputStages": [ + "1" + ], + "name": "S02: Output", + "parallelInputs": "1", + "readMsAvg": "0", + "readMsMax": "0", + "readRatioAvg": 0, + "readRatioMax": 0, + "recordsRead": "1000", + "recordsWritten": "1000", + "shuffleOutputBytes": "459829", + "shuffleOutputBytesSpilled": "0", + "slotMs": "106", + "startMs": "1761760370667", + "status": "COMPLETE", + "steps": [ + { + "kind": "READ", + "substeps": [ + "$130, $131", + "FROM __stage01_output" + ] + }, + { + "kind": "WRITE", + "substeps": [ + "$130, $131", + "TO __stage02_output" + ] + } + ], + "waitMsAvg": "237", + "waitMsMax": "237", + "waitRatioAvg": 1, + "waitRatioMax": 1, + "writeMsAvg": "55", + "writeMsMax": "55", + "writeRatioAvg": 0.2320675105485232, + "writeRatioMax": 0.2320675105485232 + } + ], + "referencedTables": [ + { + "datasetId": "dataset_id", + "projectId": "projectid", + "tableId": "table_id" + } + ], + "statementType": "SELECT", + "timeline": [ + { + "completedUnits": "5", + "elapsedMs": "492", + "estimatedRunnableUnits": "0", + "pendingUnits": "5", + "totalSlotMs": "293" + } + ], + "totalBytesBilled": "10485760", + "totalBytesProcessed": "5597805", + "totalPartitionsProcessed": "2", + "totalSlotMs": "293", + "transferredBytes": "0" + }, + "startTime": 1761760370268, + "totalBytesProcessed": "5597805", + "totalSlotMs": "293" + }, + "status": { + "state": "DONE" + }, + "user_email": "abc@google.com" + } + } + """ + try: + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=[settings.application_name, "get_job_info"], + ) + + job = bq_client.get_job(job_id) + # We need to use _properties to get the job info because it contains all + # the job info. + # pylint: disable=protected-access + return job._properties + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } diff --git a/src/google/adk/tools/bigquery/query_tool.py b/src/google/adk/tools/bigquery/query_tool.py index a64bcf7512..d5b1264fa5 100644 --- a/src/google/adk/tools/bigquery/query_tool.py +++ b/src/google/adk/tools/bigquery/query_tool.py @@ -14,13 +14,1358 @@ from __future__ import annotations -import warnings +import functools +import json +import types +from typing import Callable +from typing import Optional +import uuid -from google.adk.integrations.bigquery.query_tool import * +from google.auth.credentials import Credentials +from google.cloud import bigquery -warnings.warn( - "google.adk.tools.bigquery.query_tool is moved to" - " google.adk.integrations.bigquery.query_tool", - DeprecationWarning, - stacklevel=2, -) +from . import client +from ..tool_context import ToolContext +from .config import BigQueryToolConfig +from .config import WriteMode + +BIGQUERY_SESSION_INFO_KEY = "bigquery_session_info" + + +def _execute_sql( + project_id: str, + query: str, + credentials: Credentials, + settings: BigQueryToolConfig, + tool_context: ToolContext, + dry_run: bool = False, + caller_id: Optional[str] = None, +) -> dict: + try: + # Validate compute project if applicable + if ( + settings.compute_project_id + and project_id != settings.compute_project_id + ): + return { + "status": "ERROR", + "error_details": ( + f"Cannot execute query in the project {project_id}, as the tool" + " is restricted to execute queries only in the project" + f" {settings.compute_project_id}." + ), + } + + # Get BigQuery client + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=[settings.application_name, caller_id], + ) + + # BigQuery connection properties where applicable + bq_connection_properties = [] + + # BigQuery job labels if applicable + bq_job_labels = ( + settings.job_labels.copy() if settings and settings.job_labels else {} + ) + + if caller_id: + bq_job_labels["adk-bigquery-tool"] = caller_id + if settings and settings.application_name: + bq_job_labels["adk-bigquery-application-name"] = settings.application_name + + if not settings or settings.write_mode == WriteMode.BLOCKED: + dry_run_query_job = bq_client.query( + query, + project=project_id, + job_config=bigquery.QueryJobConfig( + dry_run=True, labels=bq_job_labels + ), + ) + if dry_run_query_job.statement_type != "SELECT": + return { + "status": "ERROR", + "error_details": "Read-only mode only supports SELECT statements.", + } + elif settings.write_mode == WriteMode.PROTECTED: + # In protected write mode, write operation only to a temporary artifact is + # allowed. This artifact must have been created in a BigQuery session. In + # such a scenario, the session info (session id and the anonymous dataset + # containing the artifact) is persisted in the tool context. + bq_session_info = tool_context.state.get(BIGQUERY_SESSION_INFO_KEY, None) + if bq_session_info: + bq_session_id, bq_session_dataset_id = bq_session_info + else: + session_creator_job = bq_client.query( + "SELECT 1", + project=project_id, + job_config=bigquery.QueryJobConfig( + dry_run=True, create_session=True, labels=bq_job_labels + ), + ) + bq_session_id = session_creator_job.session_info.session_id + bq_session_dataset_id = session_creator_job.destination.dataset_id + + # Remember the BigQuery session info for subsequent queries + tool_context.state[BIGQUERY_SESSION_INFO_KEY] = ( + bq_session_id, + bq_session_dataset_id, + ) + + # Session connection property will be set in the query execution + bq_connection_properties.append( + bigquery.ConnectionProperty("session_id", bq_session_id) + ) + + # Check the query type w.r.t. the BigQuery session + dry_run_query_job = bq_client.query( + query, + project=project_id, + job_config=bigquery.QueryJobConfig( + dry_run=True, + connection_properties=bq_connection_properties, + labels=bq_job_labels, + ), + ) + if ( + dry_run_query_job.statement_type != "SELECT" + and dry_run_query_job.destination + and dry_run_query_job.destination.dataset_id != bq_session_dataset_id + ): + return { + "status": "ERROR", + "error_details": ( + "Protected write mode only supports SELECT statements, or write" + " operations in the anonymous dataset of a BigQuery session." + ), + } + + # Return the dry run characteristics of the query if requested + if dry_run: + dry_run_job = bq_client.query( + query, + project=project_id, + job_config=bigquery.QueryJobConfig( + dry_run=True, + connection_properties=bq_connection_properties, + labels=bq_job_labels, + ), + ) + return {"status": "SUCCESS", "dry_run_info": dry_run_job.to_api_repr()} + + # Finally execute the query, fetch the result, and return it + job_config = bigquery.QueryJobConfig( + connection_properties=bq_connection_properties, + labels=bq_job_labels, + ) + if settings.maximum_bytes_billed: + job_config.maximum_bytes_billed = settings.maximum_bytes_billed + row_iterator = bq_client.query_and_wait( + query, + job_config=job_config, + project=project_id, + max_results=settings.max_query_result_rows, + ) + rows = [] + for row in row_iterator: + row_values = {} + for key, val in row.items(): + try: + # if the json serialization of the value succeeds, use it as is + json.dumps(val) + except (TypeError, ValueError, OverflowError): + val = str(val) + row_values[key] = val + rows.append(row_values) + + result = {"status": "SUCCESS", "rows": rows} + if ( + settings.max_query_result_rows is not None + and len(rows) == settings.max_query_result_rows + ): + result["result_is_likely_truncated"] = True + return result + except Exception as ex: # pylint: disable=broad-except + return { + "status": "ERROR", + "error_details": str(ex), + } + + +def execute_sql( + project_id: str, + query: str, + credentials: Credentials, + settings: BigQueryToolConfig, + tool_context: ToolContext, + dry_run: bool = False, +) -> dict: + """Run a BigQuery or BigQuery ML SQL query in the project and return the result. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + query (str): The BigQuery SQL query to be executed. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + tool_context (ToolContext): The context for the tool. + dry_run (bool, default False): If True, the query will not be executed. + Instead, the query will be validated and information about the query + will be returned. Defaults to False. + + Returns: + dict: If `dry_run` is False, dictionary representing the result of the + query. If the result contains the key "result_is_likely_truncated" + with value True, it means that there may be additional rows matching + the query not returned in the result. + If `dry_run` is True, dictionary with "dry_run_info" field + containing query information returned by BigQuery. + + Examples: + Fetch data or insights from a table: + + >>> execute_sql("my_project", + ... "SELECT island, COUNT(*) AS population " + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") + { + "status": "SUCCESS", + "rows": [ + { + "island": "Dream", + "population": 124 + }, + { + "island": "Biscoe", + "population": 168 + }, + { + "island": "Torgersen", + "population": 52 + } + ] + } + + Validate a query and estimate costs without executing it: + + >>> execute_sql( + ... "my_project", + ... "SELECT island FROM " + ... "`bigquery-public-data`.`ml_datasets`.`penguins`", + ... dry_run=True + ... ) + { + "status": "SUCCESS", + "dry_run_info": { + "configuration": { + "dryRun": True, + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_...", + "projectId": "my_project", + "tableId": "anon..." + }, + "priority": "INTERACTIVE", + "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", + "useLegacySql": False, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "jobReference": { + "location": "US", + "projectId": "my_project" + } + } + } + """ + return _execute_sql( + project_id=project_id, + query=query, + credentials=credentials, + settings=settings, + tool_context=tool_context, + dry_run=dry_run, + caller_id="execute_sql", + ) + + +def _execute_sql_write_mode(*args, **kwargs) -> dict: + """Run a BigQuery or BigQuery ML SQL query in the project and return the result. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + query (str): The BigQuery SQL query to be executed. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + tool_context (ToolContext): The context for the tool. + dry_run (bool, default False): If True, the query will not be executed. + Instead, the query will be validated and information about the query + will be returned. Defaults to False. + + Returns: + dict: If `dry_run` is False, dictionary representing the result of the + query. If the result contains the key "result_is_likely_truncated" + with value True, it means that there may be additional rows matching + the query not returned in the result. + If `dry_run` is True, dictionary with "dry_run_info" field + containing query information returned by BigQuery. + + Examples: + Fetch data or insights from a table: + + >>> execute_sql("my_project", + ... "SELECT island, COUNT(*) AS population " + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") + { + "status": "SUCCESS", + "rows": [ + { + "island": "Dream", + "population": 124 + }, + { + "island": "Biscoe", + "population": 168 + }, + { + "island": "Torgersen", + "population": 52 + } + ] + } + + Validate a query and estimate costs without executing it: + + >>> execute_sql( + ... "my_project", + ... "SELECT island FROM " + ... "`bigquery-public-data`.`ml_datasets`.`penguins`", + ... dry_run=True + ... ) + { + "status": "SUCCESS", + "dry_run_info": { + "configuration": { + "dryRun": True, + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_...", + "projectId": "my_project", + "tableId": "anon..." + }, + "priority": "INTERACTIVE", + "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", + "useLegacySql": False, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "jobReference": { + "location": "US", + "projectId": "my_project" + } + } + } + + Create a table with schema prescribed: + + >>> execute_sql("my_project", + ... "CREATE TABLE `my_project`.`my_dataset`.`my_table` " + ... "(island STRING, population INT64)") + { + "status": "SUCCESS", + "rows": [] + } + + Insert data into an existing table: + + >>> execute_sql("my_project", + ... "INSERT INTO `my_project`.`my_dataset`.`my_table` (island, population) " + ... "VALUES ('Dream', 124), ('Biscoe', 168)") + { + "status": "SUCCESS", + "rows": [] + } + + Create a table from the result of a query: + + >>> execute_sql("my_project", + ... "CREATE TABLE `my_project`.`my_dataset`.`my_table` AS " + ... "SELECT island, COUNT(*) AS population " + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") + { + "status": "SUCCESS", + "rows": [] + } + + Delete a table: + + >>> execute_sql("my_project", + ... "DROP TABLE `my_project`.`my_dataset`.`my_table`") + { + "status": "SUCCESS", + "rows": [] + } + + Copy a table to another table: + + >>> execute_sql("my_project", + ... "CREATE TABLE `my_project`.`my_dataset`.`my_table_clone` " + ... "CLONE `my_project`.`my_dataset`.`my_table`") + { + "status": "SUCCESS", + "rows": [] + } + + Create a snapshot (a lightweight, read-optimized copy) of en existing + table: + + >>> execute_sql("my_project", + ... "CREATE SNAPSHOT TABLE `my_project`.`my_dataset`.`my_table_snapshot` " + ... "CLONE `my_project`.`my_dataset`.`my_table`") + { + "status": "SUCCESS", + "rows": [] + } + + Create a BigQuery ML linear regression model: + + >>> execute_sql("my_project", + ... "CREATE MODEL `my_dataset`.`my_model` " + ... "OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS " + ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " + ... "WHERE body_mass_g IS NOT NULL") + { + "status": "SUCCESS", + "rows": [] + } + + Evaluate BigQuery ML model: + + >>> execute_sql("my_project", + ... "SELECT * FROM ML.EVALUATE(MODEL `my_dataset`.`my_model`)") + { + "status": "SUCCESS", + "rows": [{'mean_absolute_error': 227.01223667447218, + 'mean_squared_error': 81838.15989216768, + 'mean_squared_log_error': 0.0050704473735013, + 'median_absolute_error': 173.08081641661738, + 'r2_score': 0.8723772534253441, + 'explained_variance': 0.8723772534253442}] + } + + Evaluate BigQuery ML model on custom data: + + >>> execute_sql("my_project", + ... "SELECT * FROM ML.EVALUATE(MODEL `my_dataset`.`my_model`, " + ... "(SELECT * FROM `my_dataset`.`my_table`))") + { + "status": "SUCCESS", + "rows": [{'mean_absolute_error': 227.01223667447218, + 'mean_squared_error': 81838.15989216768, + 'mean_squared_log_error': 0.0050704473735013, + 'median_absolute_error': 173.08081641661738, + 'r2_score': 0.8723772534253441, + 'explained_variance': 0.8723772534253442}] + } + + Predict using BigQuery ML model: + + >>> execute_sql("my_project", + ... "SELECT * FROM ML.PREDICT(MODEL `my_dataset`.`my_model`, " + ... "(SELECT * FROM `my_dataset`.`my_table`))") + { + "status": "SUCCESS", + "rows": [ + { + "predicted_body_mass_g": "3380.9271650847013", + ... + }, { + "predicted_body_mass_g": "3873.6072435386004", + ... + }, + ... + ] + } + + Delete a BigQuery ML model: + + >>> execute_sql("my_project", "DROP MODEL `my_dataset`.`my_model`") + { + "status": "SUCCESS", + "rows": [] + } + + Notes: + - If a destination table already exists, there are a few ways to overwrite + it: + - Use "CREATE OR REPLACE TABLE" instead of "CREATE TABLE". + - First run "DROP TABLE", followed by "CREATE TABLE". + - If a model already exists, there are a few ways to overwrite it: + - Use "CREATE OR REPLACE MODEL" instead of "CREATE MODEL". + - First run "DROP MODEL", followed by "CREATE MODEL". + """ + return execute_sql(*args, **kwargs) + + +def _execute_sql_protected_write_mode(*args, **kwargs) -> dict: + """Run a BigQuery or BigQuery ML SQL query in the project and return the result. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + query (str): The BigQuery SQL query to be executed. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + tool_context (ToolContext): The context for the tool. + dry_run (bool, default False): If True, the query will not be executed. + Instead, the query will be validated and information about the query + will be returned. Defaults to False. + + Returns: + dict: If `dry_run` is False, dictionary representing the result of the + query. If the result contains the key "result_is_likely_truncated" + with value True, it means that there may be additional rows matching + the query not returned in the result. + If `dry_run` is True, dictionary with "dry_run_info" field + containing query information returned by BigQuery. + + Examples: + Fetch data or insights from a table: + + >>> execute_sql("my_project", + ... "SELECT island, COUNT(*) AS population " + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") + { + "status": "SUCCESS", + "rows": [ + { + "island": "Dream", + "population": 124 + }, + { + "island": "Biscoe", + "population": 168 + }, + { + "island": "Torgersen", + "population": 52 + } + ] + } + + Validate a query and estimate costs without executing it: + + >>> execute_sql( + ... "my_project", + ... "SELECT island FROM " + ... "`bigquery-public-data`.`ml_datasets`.`penguins`", + ... dry_run=True + ... ) + { + "status": "SUCCESS", + "dry_run_info": { + "configuration": { + "dryRun": True, + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_...", + "projectId": "my_project", + "tableId": "anon..." + }, + "priority": "INTERACTIVE", + "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", + "useLegacySql": False, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "jobReference": { + "location": "US", + "projectId": "my_project" + } + } + } + + Create a temporary table with schema prescribed: + + >>> execute_sql("my_project", + ... "CREATE TEMP TABLE `my_table` (island STRING, population INT64)") + { + "status": "SUCCESS", + "rows": [] + } + + Insert data into an existing temporary table: + + >>> execute_sql("my_project", + ... "INSERT INTO `my_table` (island, population) " + ... "VALUES ('Dream', 124), ('Biscoe', 168)") + { + "status": "SUCCESS", + "rows": [] + } + + Create a temporary table from the result of a query: + + >>> execute_sql("my_project", + ... "CREATE TEMP TABLE `my_table` AS " + ... "SELECT island, COUNT(*) AS population " + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") + { + "status": "SUCCESS", + "rows": [] + } + + Delete a temporary table: + + >>> execute_sql("my_project", "DROP TABLE `my_table`") + { + "status": "SUCCESS", + "rows": [] + } + + Copy a temporary table to another temporary table: + + >>> execute_sql("my_project", + ... "CREATE TEMP TABLE `my_table_clone` CLONE `my_table`") + { + "status": "SUCCESS", + "rows": [] + } + + Create a temporary BigQuery ML linear regression model: + + >>> execute_sql("my_project", + ... "CREATE TEMP MODEL `my_model` " + ... "OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS" + ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " + ... "WHERE body_mass_g IS NOT NULL") + { + "status": "SUCCESS", + "rows": [] + } + + Evaluate BigQuery ML model: + + >>> execute_sql("my_project", "SELECT * FROM ML.EVALUATE(MODEL `my_model`)") + { + "status": "SUCCESS", + "rows": [{'mean_absolute_error': 227.01223667447218, + 'mean_squared_error': 81838.15989216768, + 'mean_squared_log_error': 0.0050704473735013, + 'median_absolute_error': 173.08081641661738, + 'r2_score': 0.8723772534253441, + 'explained_variance': 0.8723772534253442}] + } + + Evaluate BigQuery ML model on custom data: + + >>> execute_sql("my_project", + ... "SELECT * FROM ML.EVALUATE(MODEL `my_model`, " + ... "(SELECT * FROM `my_dataset`.`my_table`))") + { + "status": "SUCCESS", + "rows": [{'mean_absolute_error': 227.01223667447218, + 'mean_squared_error': 81838.15989216768, + 'mean_squared_log_error': 0.0050704473735013, + 'median_absolute_error': 173.08081641661738, + 'r2_score': 0.8723772534253441, + 'explained_variance': 0.8723772534253442}] + } + + Predict using BigQuery ML model: + + >>> execute_sql("my_project", + ... "SELECT * FROM ML.PREDICT(MODEL `my_model`, " + ... "(SELECT * FROM `my_dataset`.`my_table`))") + { + "status": "SUCCESS", + "rows": [ + { + "predicted_body_mass_g": "3380.9271650847013", + ... + }, { + "predicted_body_mass_g": "3873.6072435386004", + ... + }, + ... + ] + } + + Delete a BigQuery ML model: + + >>> execute_sql("my_project", "DROP MODEL `my_model`") + { + "status": "SUCCESS", + "rows": [] + } + + Notes: + - If a destination table already exists, there are a few ways to overwrite + it: + - Use "CREATE OR REPLACE TEMP TABLE" instead of "CREATE TEMP TABLE". + - First run "DROP TABLE", followed by "CREATE TEMP TABLE". + - Only temporary tables can be created, inserted into or deleted. Please + do not try creating a permanent table (non-TEMP table), inserting into or + deleting one. + - If a destination model already exists, there are a few ways to overwrite + it: + - Use "CREATE OR REPLACE TEMP MODEL" instead of "CREATE TEMP MODEL". + - First run "DROP MODEL", followed by "CREATE TEMP MODEL". + - Only temporary models can be created or deleted. Please do not try + creating a permanent model (non-TEMP model) or deleting one. + """ + return execute_sql(*args, **kwargs) + + +def get_execute_sql(settings: BigQueryToolConfig) -> Callable[..., dict]: + """Get the execute_sql tool customized as per the given tool settings. + + Args: + settings: BigQuery tool settings indicating the behavior of the + execute_sql tool. + + Returns: + callable[..., dict]: A version of the execute_sql tool respecting the tool + settings. + """ + + if not settings or settings.write_mode == WriteMode.BLOCKED: + return execute_sql + + # Create a new function object using the original function's code and globals. + # We pass the original code, globals, name, defaults, and closure. + # This creates a raw function object without copying other metadata yet. + execute_sql_wrapper = types.FunctionType( + execute_sql.__code__, + execute_sql.__globals__, + execute_sql.__name__, + execute_sql.__defaults__, + execute_sql.__closure__, + ) + + # Use functools.update_wrapper to copy over other essential attributes + # from the original function to the new one. + # This includes __name__, __qualname__, __module__, __annotations__, etc. + # It specifically allows us to then set __doc__ separately. + functools.update_wrapper(execute_sql_wrapper, execute_sql) + + # Now, set the new docstring + if settings.write_mode == WriteMode.PROTECTED: + execute_sql_wrapper.__doc__ = _execute_sql_protected_write_mode.__doc__ + else: + execute_sql_wrapper.__doc__ = _execute_sql_write_mode.__doc__ + + return execute_sql_wrapper + + +def forecast( + project_id: str, + history_data: str, + timestamp_col: str, + data_col: str, + horizon: int = 10, + id_cols: Optional[list[str]] = None, + *, + credentials: Credentials, + settings: BigQueryToolConfig, + tool_context: ToolContext, +) -> dict: + """Run a BigQuery AI time series forecast using AI.FORECAST. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + history_data (str): The table id of the BigQuery table containing the + history time series data or a query statement that select the history + data. + timestamp_col (str): The name of the column containing the timestamp for + each data point. + data_col (str): The name of the column containing the numerical values to + be forecasted. + horizon (int, optional): The number of time steps to forecast into the + future. Defaults to 10. + id_cols (list, optional): The column names of the id columns to indicate + each time series when there are multiple time series in the table. All + elements must be strings. Defaults to None. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + tool_context (ToolContext): The context for the tool. + + Returns: + dict: Dictionary representing the result of the forecast. The result + contains the forecasted values along with prediction intervals. + + Examples: + Forecast daily sales for the next 7 days based on historical data from + a BigQuery table: + + >>> forecast( + ... project_id="my-gcp-project", + ... history_data="my-dataset.my-sales-table", + ... timestamp_col="sale_date", + ... data_col="daily_sales", + ... horizon=7 + ... ) + { + "status": "SUCCESS", + "rows": [ + { + "forecast_timestamp": "2025-01-08T00:00:00", + "forecast_value": 12345.67, + "confidence_level": 0.95, + "prediction_interval_lower_bound": 11000.0, + "prediction_interval_upper_bound": 13691.34, + "ai_forecast_status": "" + }, + ... + ] + } + + Forecast multiple time series using a SQL query as input: + + >>> history_query = ( + ... "SELECT unique_id, timestamp, value " + ... "FROM `my-project.my-dataset.my-timeseries-table` " + ... "WHERE timestamp > '1980-01-01'" + ... ) + >>> forecast( + ... project_id="my-gcp-project", + ... history_data=history_query, + ... timestamp_col="timestamp", + ... data_col="value", + ... id_cols=["unique_id"], + ... horizon=14 + ... ) + { + "status": "SUCCESS", + "rows": [ + { + "unique_id": "T1", + "forecast_timestamp": "1980-08-28T00:00:00", + "forecast_value": 1253218.75, + "confidence_level": 0.95, + "prediction_interval_lower_bound": 274252.51, + "prediction_interval_upper_bound": 2232184.99, + "ai_forecast_status": "" + }, + ... + ] + } + + Error Scenarios: + When an element in `id_cols` is not a string: + + >>> forecast( + ... project_id="my-gcp-project", + ... history_data="my-dataset.my-sales-table", + ... timestamp_col="sale_date", + ... data_col="daily_sales", + ... id_cols=["store_id", 123] + ... ) + { + "status": "ERROR", + "error_details": "All elements in id_cols must be strings." + } + + When `history_data` refers to a table that does not exist: + + >>> forecast( + ... project_id="my-gcp-project", + ... history_data="my-dataset.nonexistent-table", + ... timestamp_col="sale_date", + ... data_col="daily_sales" + ... ) + { + "status": "ERROR", + "error_details": "Not found: Table + my-gcp-project:my-dataset.nonexistent-table was not found in + location US" + } + """ + model = "TimesFM 2.0" + confidence_level = 0.95 + trimmed_upper_history_data = history_data.strip().upper() + if trimmed_upper_history_data.startswith( + "SELECT" + ) or trimmed_upper_history_data.startswith("WITH"): + history_data_source = f"({history_data})" + else: + history_data_source = f"TABLE `{history_data}`" + + if id_cols: + if not all(isinstance(item, str) for item in id_cols): + return { + "status": "ERROR", + "error_details": "All elements in id_cols must be strings.", + } + id_cols_str = "[" + ", ".join([f"'{col}'" for col in id_cols]) + "]" + + query = f""" + SELECT * FROM AI.FORECAST( + {history_data_source}, + data_col => '{data_col}', + timestamp_col => '{timestamp_col}', + model => '{model}', + id_cols => {id_cols_str}, + horizon => {horizon}, + confidence_level => {confidence_level} + ) + """ + else: + query = f""" + SELECT * FROM AI.FORECAST( + {history_data_source}, + data_col => '{data_col}', + timestamp_col => '{timestamp_col}', + model => '{model}', + horizon => {horizon}, + confidence_level => {confidence_level} + ) + """ + return _execute_sql( + project_id=project_id, + query=query, + credentials=credentials, + settings=settings, + tool_context=tool_context, + caller_id="forecast", + ) + + +def analyze_contribution( + project_id: str, + input_data: str, + contribution_metric: str, + dimension_id_cols: list[str], + is_test_col: str, + credentials: Credentials, + settings: BigQueryToolConfig, + tool_context: ToolContext, + top_k_insights: int = 30, + pruning_method: str = "PRUNE_REDUNDANT_INSIGHTS", +) -> dict: + """Run a BigQuery ML contribution analysis using ML.CREATE_MODEL and ML.GET_INSIGHTS. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + input_data (str): The data that contain the test and control data to + analyze. Can be a fully qualified BigQuery table ID or a SQL query. + dimension_id_cols (list[str]): The column names of the dimension columns. + contribution_metric (str): The name of the column that contains the metric + to analyze. Provides the expression to use to calculate the metric you + are analyzing. To calculate a summable metric, the expression must be in + the form SUM(metric_column_name), where metric_column_name is a numeric + data type. To calculate a summable ratio metric, the expression must be + in the form + SUM(numerator_metric_column_name)/SUM(denominator_metric_column_name), + where numerator_metric_column_name and denominator_metric_column_name + are numeric data types. To calculate a summable by category metric, the + expression must be in the form + SUM(metric_sum_column_name)/COUNT(DISTINCT categorical_column_name). The + summed column must be a numeric data type. The categorical column must + have type BOOL, DATE, DATETIME, TIME, TIMESTAMP, STRING, or INT64. + is_test_col (str): The name of the column to use to determine whether a + given row is test data or control data. The column must have a BOOL data + type. + credentials: The credentials to use for the request. + settings: The settings for the tool. + tool_context: The context for the tool. + top_k_insights (int, optional): The number of top insights to return, + ranked by apriori support. Defaults to 30. + pruning_method (str, optional): The method to use for pruning redundant + insights. Can be 'NO_PRUNING' or 'PRUNE_REDUNDANT_INSIGHTS'. Defaults to + "PRUNE_REDUNDANT_INSIGHTS". + + Returns: + dict: Dictionary representing the result of the contribution analysis. + + Examples: + Analyze the contribution of different dimensions to the total sales: + + >>> analyze_contribution( + ... project_id="my-gcp-project", + ... input_data="my-dataset.my-sales-table", + ... dimension_id_cols=["store_id", "product_category"], + ... contribution_metric="SUM(total_sales)", + ... is_test_col="is_test" + ... ) + The return is: + { + "status": "SUCCESS", + "rows": [ + { + "store_id": "S1", + "product_category": "Electronics", + "contributors": ["S1", "Electronics"], + "metric_test": 120, + "metric_control": 100, + "difference": 20, + "relative_difference": 0.2, + "unexpected_difference": 5, + "relative_unexpected_difference": 0.043, + "apriori_support": 0.15 + }, + ... + ] + } + + Analyze the contribution of different dimensions to the total sales using + a SQL query as input: + + >>> analyze_contribution( + ... project_id="my-gcp-project", + ... input_data="SELECT store_id, product_category, total_sales, " + ... "is_test FROM `my-project.my-dataset.my-sales-table` " + ... "WHERE transaction_date > '2025-01-01'" + ... dimension_id_cols=["store_id", "product_category"], + ... contribution_metric="SUM(total_sales)", + ... is_test_col="is_test" + ... ) + The return is: + { + "status": "SUCCESS", + "rows": [ + { + "store_id": "S2", + "product_category": "Groceries", + "contributors": ["S2", "Groceries"], + "metric_test": 250, + "metric_control": 200, + "difference": 50, + "relative_difference": 0.25, + "unexpected_difference": 10, + "relative_unexpected_difference": 0.041, + "apriori_support": 0.22 + }, + ... + ] + } + """ + if not all(isinstance(item, str) for item in dimension_id_cols): + return { + "status": "ERROR", + "error_details": "All elements in dimension_id_cols must be strings.", + } + + # Generate a unique temporary model name + model_name = ( + f"contribution_analysis_model_{str(uuid.uuid4()).replace('-', '_')}" + ) + + id_cols_str = "[" + ", ".join([f"'{col}'" for col in dimension_id_cols]) + "]" + options = [ + "MODEL_TYPE = 'CONTRIBUTION_ANALYSIS'", + f"CONTRIBUTION_METRIC = '{contribution_metric}'", + f"IS_TEST_COL = '{is_test_col}'", + f"DIMENSION_ID_COLS = {id_cols_str}", + ] + + options.append(f"TOP_K_INSIGHTS_BY_APRIORI_SUPPORT = {top_k_insights}") + + upper_pruning = pruning_method.upper() + if upper_pruning not in ["NO_PRUNING", "PRUNE_REDUNDANT_INSIGHTS"]: + return { + "status": "ERROR", + "error_details": f"Invalid pruning_method: {pruning_method}", + } + options.append(f"PRUNING_METHOD = '{upper_pruning}'") + + options_str = ", ".join(options) + + trimmed_upper_input_data = input_data.strip().upper() + if trimmed_upper_input_data.startswith( + "SELECT" + ) or trimmed_upper_input_data.startswith("WITH"): + input_data_source = f"({input_data})" + else: + input_data_source = f"SELECT * FROM `{input_data}`" + + create_model_query = f""" + CREATE TEMP MODEL {model_name} + OPTIONS ({options_str}) + AS {input_data_source} + """ + + get_insights_query = f""" + SELECT * FROM ML.GET_INSIGHTS(MODEL {model_name}) + """ + + # Create a session and run the create model query. + try: + execute_sql_settings = settings + if execute_sql_settings.write_mode == WriteMode.BLOCKED: + raise ValueError("analyze_contribution is not allowed in this session.") + elif execute_sql_settings.write_mode != WriteMode.PROTECTED: + # Running create temp model requires a session. So we set the write mode + # to PROTECTED to run the create model query and job query in the same + # session. + execute_sql_settings = settings.model_copy( + update={"write_mode": WriteMode.PROTECTED} + ) + + result = _execute_sql( + project_id=project_id, + query=create_model_query, + credentials=credentials, + settings=execute_sql_settings, + tool_context=tool_context, + caller_id="analyze_contribution", + ) + if result["status"] != "SUCCESS": + return result + + result = _execute_sql( + project_id=project_id, + query=get_insights_query, + credentials=credentials, + settings=execute_sql_settings, + tool_context=tool_context, + caller_id="analyze_contribution", + ) + except Exception as ex: # pylint: disable=broad-except + return { + "status": "ERROR", + "error_details": f"Error during analyze_contribution: {repr(ex)}", + } + + return result + + +def detect_anomalies( + project_id: str, + history_data: str, + times_series_timestamp_col: str, + times_series_data_col: str, + horizon: Optional[int] = 1000, + target_data: Optional[str] = None, + times_series_id_cols: Optional[list[str]] = None, + anomaly_prob_threshold: Optional[float] = 0.95, + *, + credentials: Credentials, + settings: BigQueryToolConfig, + tool_context: ToolContext, +) -> dict: + """Run a BigQuery time series ARIMA_PLUS model training and anomaly detection using CREATE MODEL and ML.DETECT_ANOMALIES clauses. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + history_data (str): The table id of the BigQuery table containing the + history time series data or a query statement that select the history + data. + times_series_timestamp_col (str): The name of the column containing the + timestamp for each data point. + times_series_data_col (str): The name of the column containing the + numerical values to be forecasted and anomaly detected. + horizon (int, optional): The number of time steps to forecast into the + future. Defaults to 1000. + target_data (str, optional): The table id of the BigQuery table containing + the target time series data or a query statement that select the target + data. + times_series_id_cols (list, optional): The column names of the id columns + to indicate each time series when there are multiple time series in the + table. All elements must be strings. Defaults to None. + anomaly_prob_threshold (float, optional): The probability threshold to + determine if a data point is an anomaly. Defaults to 0.95. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + tool_context (ToolContext): The context for the tool. + + Returns: + dict: Dictionary representing the result of the anomaly detection. The + result contains the boolean value if the data point is anomaly or + not, lower bound, upper bound and anomaly probability for each data + point and also the probability of whether the data point is anomaly + or not. + + Examples: + Detect Anomalies daily sales based on historical data from a BigQuery + table: + + >>> detect_anomalies( + ... project_id="my-gcp-project", + ... history_data="my-dataset.my-sales-table", + ... times_series_timestamp_col="sale_date", + ... times_series_data_col="daily_sales" + ... ) + { + "status": "SUCCESS", + "rows": [ + { + "ts_timestamp": "2021-01-01 00:00:01 UTC", + "ts_data": 125.3, + "is_anomaly": TRUE, + "lower_bound": 129.5, + "upper_bound": 133.6 , + "anomaly_probability": 0.93 + }, + ... + ] + } + + Detect Anomalies on multiple time series using a SQL query as input: + + >>> history_query = ( + ... "SELECT unique_id, timestamp, value " + ... "FROM `my-project.my-dataset.my-timeseries-table` " + ... "WHERE timestamp > '1980-01-01'" + ... ) + >>> detect_anomalies( + ... project_id="my-gcp-project", + ... history_data=history_query, + ... times_series_timestamp_col="timestamp", + ... times_series_data_col="value", + ... times_series_id_cols=["unique_id"] + ... ) + { + "status": "SUCCESS", + "rows": [ + { + "unique_id": "T1", + "ts_timestamp": "2021-01-01 00:00:01 UTC", + "ts_data": 125.3, + "is_anomaly": TRUE, + "lower_bound": 129.5, + "upper_bound": 133.6 , + "anomaly_probability": 0.93 + }, + ... + ] + } + + Error Scenarios: + When an element in `times_series_id_cols` is not a string: + + >>> detect_anomalies( + ... project_id="my-gcp-project", + ... history_data="my-dataset.my-sales-table", + ... times_series_timestamp_col="sale_date", + ... times_series_data_col="daily_sales", + ... times_series_id_cols=["store_id", 123] + ... ) + { + "status": "ERROR", + "error_details": "All elements in times_series_id_cols must be + strings." + } + + When `history_data` refers to a table that does not exist: + + >>> detect_anomalies( + ... project_id="my-gcp-project", + ... history_data="my-dataset.nonexistent-table", + ... times_series_timestamp_col="sale_date", + ... times_series_data_col="daily_sales" + ... ) + { + "status": "ERROR", + "error_details": "Not found: Table + my-gcp-project:my-dataset.nonexistent-table was not found in + location US" + } + """ + trimmed_upper_history_data = history_data.strip().upper() + if trimmed_upper_history_data.startswith( + "SELECT" + ) or trimmed_upper_history_data.startswith("WITH"): + history_data_source = f"({history_data})" + else: + history_data_source = f"SELECT * FROM `{history_data}`" + + options = [ + "MODEL_TYPE = 'ARIMA_PLUS'", + f"TIME_SERIES_TIMESTAMP_COL = '{times_series_timestamp_col}'", + f"TIME_SERIES_DATA_COL = '{times_series_data_col}'", + f"HORIZON = {horizon}", + ] + + if times_series_id_cols: + if not all(isinstance(item, str) for item in times_series_id_cols): + return { + "status": "ERROR", + "error_details": ( + "All elements in times_series_id_cols must be strings." + ), + } + times_series_id_cols_str = ( + "[" + ", ".join([f"'{col}'" for col in times_series_id_cols]) + "]" + ) + options.append(f"TIME_SERIES_ID_COL = {times_series_id_cols_str}") + + options_str = ", ".join(options) + + model_name = f"detect_anomalies_model_{str(uuid.uuid4()).replace('-', '_')}" + + create_model_query = f""" + CREATE TEMP MODEL {model_name} + OPTIONS ({options_str}) + AS {history_data_source} + """ + order_by_id_cols = ( + ", ".join(col for col in times_series_id_cols) + ", " + if times_series_id_cols + else "" + ) + + anomaly_detection_query = f""" + SELECT * FROM ML.DETECT_ANOMALIES(MODEL {model_name}, STRUCT({anomaly_prob_threshold} AS anomaly_prob_threshold)) ORDER BY {order_by_id_cols}{times_series_timestamp_col} + """ + if target_data: + trimmed_upper_target_data = target_data.strip().upper() + if trimmed_upper_target_data.startswith( + "SELECT" + ) or trimmed_upper_target_data.startswith("WITH"): + target_data_source = f"({target_data})" + else: + target_data_source = f"(SELECT * FROM `{target_data}`)" + + anomaly_detection_query = f""" + SELECT * FROM ML.DETECT_ANOMALIES(MODEL {model_name}, STRUCT({anomaly_prob_threshold} AS anomaly_prob_threshold), {target_data_source}) ORDER BY {order_by_id_cols}{times_series_timestamp_col} + """ + + # Create a session and run the create model query. + try: + execute_sql_settings = settings + if execute_sql_settings.write_mode == WriteMode.BLOCKED: + raise ValueError("anomaly detection is not allowed in this session.") + elif execute_sql_settings.write_mode != WriteMode.PROTECTED: + # Running create temp model requires a session. So we set the write mode + # to PROTECTED to run the create model query and job query in the same + # session. + execute_sql_settings = settings.model_copy( + update={"write_mode": WriteMode.PROTECTED} + ) + + result = _execute_sql( + project_id=project_id, + query=create_model_query, + credentials=credentials, + settings=execute_sql_settings, + tool_context=tool_context, + caller_id="detect_anomalies", + ) + if result["status"] != "SUCCESS": + return result + + result = _execute_sql( + project_id=project_id, + query=anomaly_detection_query, + credentials=credentials, + settings=execute_sql_settings, + tool_context=tool_context, + caller_id="detect_anomalies", + ) + except Exception as ex: # pylint: disable=broad-except + return { + "status": "ERROR", + "error_details": f"Error during anomaly detection: {repr(ex)}", + } + + return result diff --git a/src/google/adk/tools/bigquery/search_tool.py b/src/google/adk/tools/bigquery/search_tool.py index 8c4449f177..346947762e 100644 --- a/src/google/adk/tools/bigquery/search_tool.py +++ b/src/google/adk/tools/bigquery/search_tool.py @@ -14,13 +14,169 @@ from __future__ import annotations -import warnings +import logging +from typing import Any -from google.adk.integrations.bigquery.search_tool import * +from google.api_core import exceptions as api_exceptions +from google.auth.credentials import Credentials +from google.cloud import dataplex_v1 -warnings.warn( - "google.adk.tools.bigquery.search_tool is moved to" - " google.adk.integrations.bigquery.search_tool", - DeprecationWarning, - stacklevel=2, -) +from . import client +from .config import BigQueryToolConfig + + +def _construct_search_query_helper( + predicate: str, operator: str, items: list[str] +) -> str: + """Constructs a search query part for a specific predicate and items.""" + if not items: + return "" + + clauses = [f'{predicate}{operator}"{item}"' for item in items] + return "(" + " OR ".join(clauses) + ")" if len(items) > 1 else clauses[0] + + +def search_catalog( + prompt: str, + project_id: str, + *, + credentials: Credentials, + settings: BigQueryToolConfig, + location: str | None = None, + page_size: int = 10, + project_ids_filter: list[str] | None = None, + dataset_ids_filter: list[str] | None = None, + types_filter: list[str] | None = None, +) -> dict[str, Any]: + """Finds BigQuery datasets and tables using natural language semantic search via Dataplex. + + Use this tool to discover BigQuery assets when you don't know the exact names. + It's ideal for searching based on topics, descriptions, or questions about the data. + + Args: + prompt: The base search query (natural language or keywords). + project_id: The Google Cloud project ID to scope the search. + credentials: Credentials for the request. + settings: BigQuery tool settings. + location: The Dataplex location to use. + page_size: Maximum number of results. + project_ids_filter: Specific project IDs to include in the search results. + If None, defaults to the scoping project_id. + dataset_ids_filter: BigQuery dataset IDs to filter by. + types_filter: Entry types to filter by (e.g., BigQueryEntryType.TABLE, + BigQueryEntryType.DATASET). + + Returns: + Search results or error. The "results" list contains items with: + - name: The Dataplex Entry name (e.g., + "projects/p/locations/l/entryGroups/g/entries/e"). + - linked_resource: The underlying BigQuery resource name (e.g., + "//bigquery.googleapis.com/projects/p/datasets/d/tables/t"). + - display_name, entry_type, description, location, update_time. + + Examples: + Search for tables related to customer data: + + >>> search_catalog( + ... prompt="Search for tables related to customer data", + ... project_id="my-project", + ... credentials=creds, + ... settings=settings + ... ) + { + "status": "SUCCESS", + "results": [ + { + "name": + "projects/my-project/locations/us/entryGroups/@bigquery/entries/entry-id", + "display_name": "customer_table", + "entry_type": + "projects/p/locations/l/entryTypes/bigquery-table", + "linked_resource": + "//bigquery.googleapis.com/projects/my-project/datasets/d/tables/customer_table", + "description": "Table containing customer details.", + "location": "us", + "update_time": "2024-01-01 12:00:00+00:00" + } + ] + } + """ + + try: + if not project_id: + return { + "status": "ERROR", + "error_details": "project_id must be provided.", + } + + with client.get_dataplex_catalog_client( + credentials=credentials, + user_agent=[settings.application_name, "search_catalog"], + ) as dataplex_client: + query_parts = [] + if prompt: + query_parts.append(f"({prompt})") + + # Filter by project IDs + projects_to_filter = ( + project_ids_filter if project_ids_filter else [project_id] + ) + if projects_to_filter: + query_parts.append( + _construct_search_query_helper("projectid", "=", projects_to_filter) + ) + + # Filter by dataset IDs + if dataset_ids_filter: + dataset_resource_filters = [] + for pid in projects_to_filter: + for did in dataset_ids_filter: + dataset_resource_filters.append( + f'linked_resource:"//bigquery.googleapis.com/projects/{pid}/datasets/{did}/*"' + ) + if dataset_resource_filters: + query_parts.append(f"({' OR '.join(dataset_resource_filters)})") + # Filter by entry types + if types_filter: + query_parts.append( + _construct_search_query_helper("type", "=", types_filter) + ) + + # Always scope to BigQuery system + query_parts.append("system=BIGQUERY") + + full_query = " AND ".join(filter(None, query_parts)) + + search_location = location or settings.location or "global" + search_scope = f"projects/{project_id}/locations/{search_location}" + + request = dataplex_v1.SearchEntriesRequest( + name=search_scope, + query=full_query, + page_size=page_size, + semantic_search=True, + ) + + response = dataplex_client.search_entries(request=request) + + results = [] + for result in response.results: + entry = result.dataplex_entry + source = entry.entry_source + results.append({ + "name": entry.name, + "display_name": source.display_name or "", + "entry_type": entry.entry_type, + "update_time": str(entry.update_time), + "linked_resource": source.resource or "", + "description": source.description or "", + "location": source.location or "", + }) + return {"status": "SUCCESS", "results": results} + + except api_exceptions.GoogleAPICallError as e: + logging.exception("search_catalog tool: API call failed") + return {"status": "ERROR", "error_details": f"Dataplex API Error: {e}"} + except Exception as e: + logging.exception("search_catalog tool: Unexpected error") + return {"status": "ERROR", "error_details": repr(e)} diff --git a/src/google/adk/tools/computer_use/computer_use_tool.py b/src/google/adk/tools/computer_use/computer_use_tool.py index 9830072155..da75c5410e 100644 --- a/src/google/adk/tools/computer_use/computer_use_tool.py +++ b/src/google/adk/tools/computer_use/computer_use_tool.py @@ -108,29 +108,6 @@ async def run_async( ) -> Any: """Run the computer control function with normalized coordinates.""" - # Check for safety confirmation if required by the model - if not tool_context.tool_confirmation: - safety_decision = args.get("safety_decision") - if safety_decision: - decision = safety_decision.get("decision") - explanation = safety_decision.get("explanation") - - if decision == "require_confirmation": - hint = ( - explanation - or "This computer use action requires safety confirmation." - ) - tool_context.request_confirmation(hint=hint) - tool_context.actions.skip_summarization = True - return { - "error": ( - "This tool call requires confirmation, please approve or" - " reject." - ) - } - elif not tool_context.tool_confirmation.confirmed: - return {"error": "This tool call is rejected."} - try: # Normalize coordinates if present if "x" in args: @@ -166,9 +143,8 @@ async def run_async( result = await super().run_async(args=args, tool_context=tool_context) # Process the result if it's an EnvironmentState - response = result if isinstance(result, ComputerState): - response = { + return { "image": { "mimetype": "image/png", "data": base64.b64encode(result.screenshot).decode("utf-8"), @@ -176,15 +152,7 @@ async def run_async( "url": result.url, } - if ( - tool_context.tool_confirmation - and tool_context.tool_confirmation.confirmed - ): - if not isinstance(response, dict): - response = {"result": response} - response["safety_acknowledgement"] = "true" - - return response + return result except Exception as e: logger.error("Error in ComputerUseTool.run_async: %s", e) diff --git a/src/google/adk/tools/discovery_engine_search_tool.py b/src/google/adk/tools/discovery_engine_search_tool.py index eea843c35f..54603e6a83 100644 --- a/src/google/adk/tools/discovery_engine_search_tool.py +++ b/src/google/adk/tools/discovery_engine_search_tool.py @@ -220,12 +220,6 @@ def discovery_engine_search( except GoogleAPICallError as e: return {'status': 'error', 'error_message': str(e)} - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get('status') == 'error': - return 'TOOL_ERROR' - return None - def _do_search( self, query: str, diff --git a/src/google/adk/tools/environment/_edit_file_tool.py b/src/google/adk/tools/environment/_edit_file_tool.py deleted file mode 100644 index fa9f3143f9..0000000000 --- a/src/google/adk/tools/environment/_edit_file_tool.py +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""EditFileTool for performing surgical text replacements in existing files.""" - -from __future__ import annotations - -import logging -import re -from typing import Any -from typing import Optional -from typing import TYPE_CHECKING - -from google.genai import types -from typing_extensions import override - -from ...environment._base_environment import BaseEnvironment -from ...utils.feature_decorator import experimental -from ..base_tool import BaseTool - -if TYPE_CHECKING: - from ..tool_context import ToolContext - - -logger = logging.getLogger('google_adk.' + __name__) - - -@experimental -class EditFileTool(BaseTool): - """Perform a surgical text replacement in an existing file.""" - - def __init__(self, environment: BaseEnvironment): - super().__init__( - name='EditFile', - description=( - 'Replace an exact substring in an existing file ' - 'with new text. The old_string must appear exactly ' - 'once in the file. To create new files, use the WriteFile tool.' - ), - ) - self._environment = environment - - @override - def _get_declaration(self) -> Optional[types.FunctionDeclaration]: - return types.FunctionDeclaration( - name=self.name, - description=self.description, - parameters_json_schema={ - 'type': 'object', - 'properties': { - 'path': { - 'type': 'string', - 'description': ( - 'Path of the file to edit within the environment.' - ), - }, - 'old_string': { - 'type': 'string', - 'description': ( - 'The exact text to find and replace. Must not be empty.' - ), - }, - 'new_string': { - 'type': 'string', - 'description': 'The replacement text.', - }, - }, - 'required': ['path', 'old_string', 'new_string'], - }, - ) - - @override - async def run_async( - self, *, args: dict[str, Any], tool_context: ToolContext - ) -> Any: - path = args.get('path', '') - old_string = args.get('old_string', '') - new_string = args.get('new_string', '') - if not path: - return {'status': 'error', 'error': '`path` is required.'} - - if not old_string: - return { - 'status': 'error', - 'error': ( - '`old_string` cannot be empty. To create a new ' - 'file, use the WriteFile tool.' - ), - } - - try: - data_bytes = await self._environment.read_file(path) - content = data_bytes.decode('utf-8', errors='replace') - except FileNotFoundError: - return {'status': 'error', 'error': f'File not found: {path}'} - - # Normalize line breaks in old_string to \n and use regex for flexible matching - normalized_old = old_string.replace('\r\n', '\n') - pattern = re.escape(normalized_old).replace('\n', '\r?\n') - - matches = re.findall(pattern, content) - count = len(matches) - - if count == 0: - return { - 'status': 'error', - 'error': ( - '`old_string` not found in file. Read the file first ' - 'to verify contents.' - ), - } - if count > 1: - return { - 'status': 'error', - 'error': ( - f'`old_string` appears {count} times. Provide more ' - 'surrounding context to make it unique.' - ), - } - - new_content = re.sub(pattern, lambda m: new_string, content, count=1) - await self._environment.write_file(path, new_content) - return {'status': 'ok', 'message': f'Edited {path}'} - - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get('status') == 'error': - return 'TOOL_ERROR' - return None diff --git a/src/google/adk/tools/environment/_environment_toolset.py b/src/google/adk/tools/environment/_environment_toolset.py index 1dfaff7a39..2d894c3325 100644 --- a/src/google/adk/tools/environment/_environment_toolset.py +++ b/src/google/adk/tools/environment/_environment_toolset.py @@ -26,10 +26,10 @@ from ...utils.feature_decorator import experimental from ..base_toolset import BaseToolset from ._constants import ENVIRONMENT_INSTRUCTION -from ._edit_file_tool import EditFileTool -from ._execute_tool import ExecuteTool -from ._read_file_tool import ReadFileTool -from ._write_file_tool import WriteFileTool +from ._tools import EditFileTool +from ._tools import ExecuteTool +from ._tools import ReadFileTool +from ._tools import WriteFileTool if TYPE_CHECKING: from ...agents.readonly_context import ReadonlyContext diff --git a/src/google/adk/tools/environment/_execute_tool.py b/src/google/adk/tools/environment/_execute_tool.py deleted file mode 100644 index 73b245a089..0000000000 --- a/src/google/adk/tools/environment/_execute_tool.py +++ /dev/null @@ -1,137 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""ExecuteTool for running shell commands in the environment.""" - -from __future__ import annotations - -import logging -from typing import Any -from typing import Optional -from typing import TYPE_CHECKING - -from google.genai import types -from typing_extensions import override - -from ...environment._base_environment import BaseEnvironment -from ...environment._base_environment import ExecutionResult -from ...utils.feature_decorator import experimental -from ..base_tool import BaseTool -from ._constants import DEFAULT_TIMEOUT -from ._constants import MAX_OUTPUT_CHARS -from ._utils import truncate as _truncate - -if TYPE_CHECKING: - from ..tool_context import ToolContext - - -logger = logging.getLogger('google_adk.' + __name__) - - -_EXECUTE_TOOL_DESCRIPTION = """ -Run a shell command in the environment. For running programs, tests, and build -commands ONLY. WARNING: Do NOT use for file reading -- use the ReadFile tool -instead. Shell commands like 'cat, head, tail will produce inferior results. -Good: Execute("python3 script.py"), Execute("pytest"), Execute("find ..."). -Bad: Execute("head ..."), Execute("cat ..."). -""" - - -@experimental -class ExecuteTool(BaseTool): - """Run a shell command in the environment's working directory.""" - - def __init__( - self, - environment: BaseEnvironment, - *, - max_output_chars: Optional[int] = None, - ): - super().__init__( - name='Execute', - description=_EXECUTE_TOOL_DESCRIPTION, - ) - self._environment = environment - self._max_output_chars = ( - max_output_chars if max_output_chars is not None else MAX_OUTPUT_CHARS - ) - - @override - def _get_declaration(self) -> Optional[types.FunctionDeclaration]: - return types.FunctionDeclaration( - name=self.name, - description=self.description, - parameters_json_schema={ - 'type': 'object', - 'properties': { - 'command': { - 'type': 'string', - 'description': ( - 'The shell command to execute. Chain dependent commands' - ' with &&.' - ), - }, - }, - 'required': ['command'], - }, - ) - - @override - async def run_async( - self, *, args: dict[str, Any], tool_context: ToolContext - ) -> Any: - command = args.get('command', '') - if not command: - return {'status': 'error', 'error': '`command` is required.'} - - logger.debug('Execute command: %s', command) - try: - execution_result: ExecutionResult = await self._environment.execute( - command, timeout=DEFAULT_TIMEOUT - ) - logger.debug( - 'Execute result: exit_code=%d, stdout=%r, stderr=%r, timed_out=%r', - execution_result.exit_code, - execution_result.stdout[:200] if execution_result.stdout else '', - execution_result.stderr[:200] if execution_result.stderr else '', - execution_result.timed_out, - ) - except Exception as e: - logger.exception('Execute failed: %s', e) - return {'status': 'error', 'error': str(e)} - - result: dict[str, Any] = {'status': 'ok'} - if execution_result.stdout: - result['stdout'] = _truncate( - execution_result.stdout, - limit=self._max_output_chars, - ) - if execution_result.stderr: - result['stderr'] = _truncate( - execution_result.stderr, - limit=self._max_output_chars, - ) - if execution_result.exit_code != 0: - result['status'] = 'error' - result['exit_code'] = execution_result.exit_code - if execution_result.timed_out: - result['status'] = 'error' - result['error'] = f'Command timed out after {DEFAULT_TIMEOUT}s.' - return result - - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get('status') == 'error': - return 'TOOL_ERROR' - return None diff --git a/src/google/adk/tools/environment/_read_file_tool.py b/src/google/adk/tools/environment/_read_file_tool.py deleted file mode 100644 index 1ff6febf53..0000000000 --- a/src/google/adk/tools/environment/_read_file_tool.py +++ /dev/null @@ -1,170 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""ReadFileTool for reading file contents in the environment.""" - -from __future__ import annotations - -import logging -import shlex -from typing import Any -from typing import Optional -from typing import TYPE_CHECKING - -from google.genai import types -from typing_extensions import override - -from ...environment._base_environment import BaseEnvironment -from ...utils.feature_decorator import experimental -from ..base_tool import BaseTool -from ._constants import MAX_OUTPUT_CHARS -from ._utils import truncate as _truncate - -if TYPE_CHECKING: - from ..tool_context import ToolContext - - -logger = logging.getLogger('google_adk.' + __name__) - - -@experimental -class ReadFileTool(BaseTool): - """Read a file from the environment.""" - - def __init__( - self, - environment: BaseEnvironment, - *, - max_output_chars: Optional[int] = None, - ): - super().__init__( - name='ReadFile', - description=( - 'Read the contents of a file in the environment. ' - 'Returns the file content with line numbers.' - ), - ) - self._environment = environment - self._max_output_chars = ( - max_output_chars if max_output_chars is not None else MAX_OUTPUT_CHARS - ) - - @override - def _get_declaration(self) -> Optional[types.FunctionDeclaration]: - return types.FunctionDeclaration( - name=self.name, - description=self.description, - parameters_json_schema={ - 'type': 'object', - 'properties': { - 'path': { - 'type': 'string', - 'description': ( - 'Path of the file to read within the environment.' - ), - }, - 'start_line': { - 'type': 'integer', - 'description': ( - 'First line to return (1-based, ' - 'inclusive). Defaults to 1.' - ), - }, - 'end_line': { - 'type': 'integer', - 'description': ( - 'Last line to return (1-based, ' - 'inclusive). Defaults to end of file.' - ), - }, - }, - 'required': ['path'], - }, - ) - - @override - async def run_async( - self, *, args: dict[str, Any], tool_context: ToolContext - ) -> Any: - path = args.get('path', '') - if not path: - return {'status': 'error', 'error': '`path` is required.'} - start_line = args.get('start_line') - end_line = args.get('end_line') - - # Use `sed` to read the file if start_line or end_line are specified. - if (start_line and start_line > 1) or end_line: - start = start_line or 1 - if end_line: - sed_range = f'{start},{end_line}' - else: - sed_range = f'{start},$' - path_arg = shlex.quote(path) - sed_arg = shlex.quote(f'{sed_range}p') - cmd = f'cat -n {path_arg} | sed -n {sed_arg}' - res = await self._environment.execute(cmd) - if res.exit_code == 0: - return { - 'status': 'ok', - 'content': _truncate( - res.stdout, - limit=self._max_output_chars, - ), - } - - try: - data_bytes = await self._environment.read_file(path) - text = data_bytes.decode('utf-8', errors='replace') - lines = text.splitlines(True) - total = len(lines) - start = max(1, start_line or 1) - end = min(total, end_line or total) - if start > total: - return { - 'status': 'error', - 'error': ( - f'`start_line` {start} exceeds file length ({total} lines).' - ), - 'total_lines': total, - } - if start > end: - return { - 'status': 'error', - 'error': f'`start_line` ({start}) is after `end_line` ({end}).', - 'total_lines': total, - } - selected = lines[start - 1 : end] - numbered = ''.join( - f'{start + i:6d}\t{line}' for i, line in enumerate(selected) - ) - result = { - 'status': 'ok', - 'content': _truncate( - numbered, - limit=self._max_output_chars, - ), - } - if start > 1 or end < total: - result['total_lines'] = total - return result - except FileNotFoundError: - return {'status': 'error', 'error': f'File not found: {path}'} - except Exception as e: - return {'status': 'error', 'error': str(e)} - - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get('status') == 'error': - return 'TOOL_ERROR' - return None diff --git a/src/google/adk/tools/environment/_tools.py b/src/google/adk/tools/environment/_tools.py index 2bf6cf5b50..67baa8f40d 100644 --- a/src/google/adk/tools/environment/_tools.py +++ b/src/google/adk/tools/environment/_tools.py @@ -12,16 +12,393 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Backward-compatibility re-exports for the environment tools. +"""Tools available in the environment toolset.""" -The environment tools were split into one module per tool. This module -keeps the previous import path (``environment._tools``) working by -re-exporting them. +from __future__ import annotations + +import logging +from typing import Any +from typing import Optional +from typing import TYPE_CHECKING + +from google.genai import types +from typing_extensions import override + +from ...environment._base_environment import BaseEnvironment +from ...environment._base_environment import ExecutionResult +from ...utils.feature_decorator import experimental +from ..base_tool import BaseTool +from ._constants import DEFAULT_TIMEOUT +from ._constants import MAX_OUTPUT_CHARS + +if TYPE_CHECKING: + from ..tool_context import ToolContext + + +logger = logging.getLogger('google_adk.' + __name__) + + +def _truncate(text: str, limit: int = MAX_OUTPUT_CHARS) -> str: + """Truncate text to *limit* characters with a notice.""" + if len(text) <= limit: + return text + return text[:limit] + f'\n... (truncated, {len(text)} total chars)' + + +_EXECUTE_TOOL_DESCRIPTION = """ +Run a shell command in the environment. For running programs, tests, and build +commands ONLY. WARNING: Do NOT use for file reading -- use the ReadFile tool +instead. Shell commands like 'cat, head, tail will produce inferior results. +Good: Execute("python3 script.py"), Execute("pytest"), Execute("find ..."). +Bad: Execute("head ..."), Execute("cat ..."). """ -from __future__ import annotations -from ._edit_file_tool import EditFileTool as EditFileTool -from ._execute_tool import ExecuteTool as ExecuteTool -from ._read_file_tool import ReadFileTool as ReadFileTool -from ._write_file_tool import WriteFileTool as WriteFileTool +@experimental +class ExecuteTool(BaseTool): + """Run a shell command in the environment's working directory.""" + + def __init__( + self, + environment: BaseEnvironment, + *, + max_output_chars: Optional[int] = None, + ): + super().__init__( + name='Execute', + description=_EXECUTE_TOOL_DESCRIPTION, + ) + self._environment = environment + self._max_output_chars = ( + max_output_chars if max_output_chars is not None else MAX_OUTPUT_CHARS + ) + + @override + def _get_declaration(self) -> Optional[types.FunctionDeclaration]: + return types.FunctionDeclaration( + name=self.name, + description=self.description, + parameters_json_schema={ + 'type': 'object', + 'properties': { + 'command': { + 'type': 'string', + 'description': ( + 'The shell command to execute. Chain dependent commands' + ' with &&.' + ), + }, + }, + 'required': ['command'], + }, + ) + + @override + async def run_async( + self, *, args: dict[str, Any], tool_context: ToolContext + ) -> Any: + command = args.get('command', '') + if not command: + return {'status': 'error', 'error': '`command` is required.'} + + logger.debug('Execute command: %s', command) + try: + execution_result: ExecutionResult = await self._environment.execute( + command, timeout=DEFAULT_TIMEOUT + ) + logger.debug( + 'Execute result: exit_code=%d, stdout=%r, stderr=%r, timed_out=%r', + execution_result.exit_code, + execution_result.stdout[:200] if execution_result.stdout else '', + execution_result.stderr[:200] if execution_result.stderr else '', + execution_result.timed_out, + ) + except Exception as e: + logger.exception('Execute failed: %s', e) + return {'status': 'error', 'error': str(e)} + + result: dict[str, Any] = {'status': 'ok'} + if execution_result.stdout: + result['stdout'] = _truncate( + execution_result.stdout, + limit=self._max_output_chars, + ) + if execution_result.stderr: + result['stderr'] = _truncate( + execution_result.stderr, + limit=self._max_output_chars, + ) + if execution_result.exit_code != 0: + result['status'] = 'error' + result['exit_code'] = execution_result.exit_code + if execution_result.timed_out: + result['status'] = 'error' + result['error'] = f'Command timed out after {DEFAULT_TIMEOUT}s.' + return result + + +@experimental +class ReadFileTool(BaseTool): + """Read a file from the environment.""" + + def __init__( + self, + environment: BaseEnvironment, + *, + max_output_chars: Optional[int] = None, + ): + super().__init__( + name='ReadFile', + description=( + 'Read the contents of a file in the environment. ' + 'Returns the file content with line numbers.' + ), + ) + self._environment = environment + self._max_output_chars = ( + max_output_chars if max_output_chars is not None else MAX_OUTPUT_CHARS + ) + + @override + def _get_declaration(self) -> Optional[types.FunctionDeclaration]: + return types.FunctionDeclaration( + name=self.name, + description=self.description, + parameters_json_schema={ + 'type': 'object', + 'properties': { + 'path': { + 'type': 'string', + 'description': ( + 'Path of the file to read within the environment.' + ), + }, + 'start_line': { + 'type': 'integer', + 'description': ( + 'First line to return (1-based, ' + 'inclusive). Defaults to 1.' + ), + }, + 'end_line': { + 'type': 'integer', + 'description': ( + 'Last line to return (1-based, ' + 'inclusive). Defaults to end of file.' + ), + }, + }, + 'required': ['path'], + }, + ) + + @override + async def run_async( + self, *, args: dict[str, Any], tool_context: ToolContext + ) -> Any: + path = args.get('path', '') + if not path: + return {'status': 'error', 'error': '`path` is required.'} + start_line = args.get('start_line') + end_line = args.get('end_line') + + # Use `sed` to read the file if start_line or end_line are specified. + if (start_line and start_line > 1) or end_line: + start = start_line or 1 + if end_line: + sed_range = f'{start},{end_line}' + else: + sed_range = f'{start},$' + cmd = f"cat -n '{path}' | sed -n '{sed_range}p'" + res = await self._environment.execute(cmd) + if res.exit_code == 0: + return { + 'status': 'ok', + 'content': _truncate( + res.stdout, + limit=self._max_output_chars, + ), + } + + try: + data_bytes = await self._environment.read_file(path) + text = data_bytes.decode('utf-8', errors='replace') + lines = text.splitlines(True) + total = len(lines) + start = max(1, start_line or 1) + end = min(total, end_line or total) + if start > total: + return { + 'status': 'error', + 'error': ( + f'`start_line` {start} exceeds file length ({total} lines).' + ), + 'total_lines': total, + } + if start > end: + return { + 'status': 'error', + 'error': f'`start_line` ({start}) is after `end_line` ({end}).', + 'total_lines': total, + } + selected = lines[start - 1 : end] + numbered = ''.join( + f'{start + i:6d}\t{line}' for i, line in enumerate(selected) + ) + result = { + 'status': 'ok', + 'content': _truncate( + numbered, + limit=self._max_output_chars, + ), + } + if start > 1 or end < total: + result['total_lines'] = total + return result + except FileNotFoundError: + return {'status': 'error', 'error': f'File not found: {path}'} + except Exception as e: + return {'status': 'error', 'error': str(e)} + + +@experimental +class WriteFileTool(BaseTool): + """Create or overwrite a file in the environment.""" + + def __init__(self, environment: BaseEnvironment): + super().__init__( + name='WriteFile', + description=( + 'Create or overwrite a file in the environment. ' + 'Use for new files or full rewrites. For small ' + 'changes to existing files, prefer EditFile.' + ), + ) + self._environment = environment + + @override + def _get_declaration(self) -> Optional[types.FunctionDeclaration]: + return types.FunctionDeclaration( + name=self.name, + description=self.description, + parameters_json_schema={ + 'type': 'object', + 'properties': { + 'path': { + 'type': 'string', + 'description': 'Path to the file within the environment.', + }, + 'content': { + 'type': 'string', + 'description': 'The full file content to write.', + }, + }, + 'required': ['path', 'content'], + }, + ) + + @override + async def run_async( + self, *, args: dict[str, Any], tool_context: ToolContext + ) -> Any: + path = args.get('path', '') + content = args.get('content', '') + if not path: + return {'status': 'error', 'error': '`path` is required.'} + try: + await self._environment.write_file(path, content) + except Exception as e: + return {'status': 'error', 'error': str(e)} + return {'status': 'ok', 'message': f'Wrote {path}'} + + +@experimental +class EditFileTool(BaseTool): + """Perform a surgical text replacement in an existing file.""" + + def __init__(self, environment: BaseEnvironment): + super().__init__( + name='EditFile', + description=( + 'Replace an exact substring in an existing file ' + 'with new text. The old_string must appear exactly ' + 'once in the file. To create new files, use the WriteFile tool.' + ), + ) + self._environment = environment + + @override + def _get_declaration(self) -> Optional[types.FunctionDeclaration]: + return types.FunctionDeclaration( + name=self.name, + description=self.description, + parameters_json_schema={ + 'type': 'object', + 'properties': { + 'path': { + 'type': 'string', + 'description': ( + 'Path of the file to edit within the environment.' + ), + }, + 'old_string': { + 'type': 'string', + 'description': ( + 'The exact text to find and replace. Must not be empty.' + ), + }, + 'new_string': { + 'type': 'string', + 'description': 'The replacement text.', + }, + }, + 'required': ['path', 'old_string', 'new_string'], + }, + ) + + @override + async def run_async( + self, *, args: dict[str, Any], tool_context: ToolContext + ) -> Any: + path = args.get('path', '') + old_string = args.get('old_string', '') + new_string = args.get('new_string', '') + if not path: + return {'status': 'error', 'error': '`path` is required.'} + + if not old_string: + return { + 'status': 'error', + 'error': ( + '`old_string` cannot be empty. To create a new ' + 'file, use the WriteFile tool.' + ), + } + + try: + data_bytes = await self._environment.read_file(path) + content = data_bytes.decode('utf-8', errors='replace') + except FileNotFoundError: + return {'status': 'error', 'error': f'File not found: {path}'} + + count = content.count(old_string) + if count == 0: + return { + 'status': 'error', + 'error': ( + '`old_string` not found in file. Read the file first ' + 'to verify contents.' + ), + } + if count > 1: + return { + 'status': 'error', + 'error': ( + f'`old_string` appears {count} times. Provide more ' + 'surrounding context to make it unique.' + ), + } + + new_content = content.replace(old_string, new_string, 1) + await self._environment.write_file(path, new_content) + return {'status': 'ok', 'message': f'Edited {path}'} diff --git a/src/google/adk/tools/environment/_utils.py b/src/google/adk/tools/environment/_utils.py deleted file mode 100644 index 6e6cc85a16..0000000000 --- a/src/google/adk/tools/environment/_utils.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Shared utilities for environment tools.""" - -from __future__ import annotations - -from ._constants import MAX_OUTPUT_CHARS - - -def truncate(text: str, limit: int = MAX_OUTPUT_CHARS) -> str: - """Truncate text to *limit* characters with a notice.""" - if len(text) <= limit: - return text - return text[:limit] + f'\n... (truncated, {len(text)} total chars)' diff --git a/src/google/adk/tools/environment/_write_file_tool.py b/src/google/adk/tools/environment/_write_file_tool.py deleted file mode 100644 index 6bbb47648f..0000000000 --- a/src/google/adk/tools/environment/_write_file_tool.py +++ /dev/null @@ -1,92 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""WriteFileTool for creating or overwriting files in the environment.""" - -from __future__ import annotations - -import logging -from typing import Any -from typing import Optional -from typing import TYPE_CHECKING - -from google.genai import types -from typing_extensions import override - -from ...environment._base_environment import BaseEnvironment -from ...utils.feature_decorator import experimental -from ..base_tool import BaseTool - -if TYPE_CHECKING: - from ..tool_context import ToolContext - - -logger = logging.getLogger('google_adk.' + __name__) - - -@experimental -class WriteFileTool(BaseTool): - """Create or overwrite a file in the environment.""" - - def __init__(self, environment: BaseEnvironment): - super().__init__( - name='WriteFile', - description=( - 'Create or overwrite a file in the environment. ' - 'Use for new files or full rewrites. For small ' - 'changes to existing files, prefer EditFile.' - ), - ) - self._environment = environment - - @override - def _get_declaration(self) -> Optional[types.FunctionDeclaration]: - return types.FunctionDeclaration( - name=self.name, - description=self.description, - parameters_json_schema={ - 'type': 'object', - 'properties': { - 'path': { - 'type': 'string', - 'description': 'Path to the file within the environment.', - }, - 'content': { - 'type': 'string', - 'description': 'The full file content to write.', - }, - }, - 'required': ['path', 'content'], - }, - ) - - @override - async def run_async( - self, *, args: dict[str, Any], tool_context: ToolContext - ) -> Any: - path = args.get('path', '') - content = args.get('content', '') - if not path: - return {'status': 'error', 'error': '`path` is required.'} - try: - await self._environment.write_file(path, content) - except Exception as e: - return {'status': 'error', 'error': str(e)} - return {'status': 'ok', 'message': f'Wrote {path}'} - - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get('status') == 'error': - return 'TOOL_ERROR' - return None diff --git a/src/google/adk/tools/environment_simulation/environment_simulation_config.py b/src/google/adk/tools/environment_simulation/environment_simulation_config.py index e3fef1e257..a1ade063d3 100644 --- a/src/google/adk/tools/environment_simulation/environment_simulation_config.py +++ b/src/google/adk/tools/environment_simulation/environment_simulation_config.py @@ -25,7 +25,7 @@ from pydantic import Field from pydantic import field_validator from pydantic import model_validator -from pydantic import ValidationError +from pydantic_core import ValidationError from ...features import experimental from ...features import FeatureName diff --git a/src/google/adk/tools/environment_simulation/environment_simulation_plugin.py b/src/google/adk/tools/environment_simulation/environment_simulation_plugin.py index f3470e2798..dad82bda3d 100644 --- a/src/google/adk/tools/environment_simulation/environment_simulation_plugin.py +++ b/src/google/adk/tools/environment_simulation/environment_simulation_plugin.py @@ -1,4 +1,4 @@ -# Copyright 2026 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/google/adk/tools/function_tool.py b/src/google/adk/tools/function_tool.py index 21aa6bfd36..10e32a5473 100644 --- a/src/google/adk/tools/function_tool.py +++ b/src/google/adk/tools/function_tool.py @@ -20,7 +20,6 @@ from typing import Callable from typing import get_args from typing import get_origin -from typing import get_type_hints from typing import Optional from typing import Union @@ -28,8 +27,6 @@ import pydantic from typing_extensions import override -from ..utils._schema_utils import get_list_inner_type -from ..utils._schema_utils import is_list_of_basemodel from ..utils.context_utils import Aclosing from ..utils.context_utils import find_context_parameter from ._automatic_function_calling_util import build_function_declaration @@ -122,90 +119,39 @@ def _preprocess_args(self, args: dict[str, Any]) -> dict[str, Any]: """ signature = inspect.signature(self.func) converted_args = args.copy() - try: - type_hints = get_type_hints(self.func) - except (TypeError, NameError): - # NameError: unresolved forward refs (e.g. recursive type aliases). - # TypeError: non-function callables. - if hasattr(self.func, '__call__'): - try: - type_hints = get_type_hints(self.func.__call__) - except (TypeError, NameError): - type_hints = {} - else: - type_hints = {} for param_name, param in signature.parameters.items(): - if param_name in args: - target_type = type_hints.get(param_name, param.annotation) - if target_type != inspect.Parameter.empty: - - # Handle Optional[PydanticModel] types - if get_origin(param.annotation) is Union: - union_args = get_args(param.annotation) - # Find the non-None type in Optional[T] (which is Union[T, None]) - non_none_types = [ - arg for arg in union_args if arg is not type(None) - ] - if len(non_none_types) == 1: - target_type = non_none_types[0] - elif len(non_none_types) > 1 and all( - inspect.isclass(t) and issubclass(t, pydantic.BaseModel) - for t in non_none_types - ): - if args[param_name] is None or isinstance( - args[param_name], tuple(non_none_types) - ): - continue - try: - converted_args[param_name] = pydantic.TypeAdapter( - param.annotation - ).validate_python(args[param_name]) - except Exception as e: - logger.warning( - f"Failed to convert argument '{param_name}' to" - f' {param.annotation}: {e}' - ) - continue - - # Check if the target type is a Pydantic model - if inspect.isclass(target_type) and issubclass( - target_type, pydantic.BaseModel - ): - # Skip conversion if the value is None and the parameter is Optional - if args[param_name] is None: - continue - - # Convert to Pydantic model if it's not already the correct type - if not isinstance(args[param_name], target_type): - try: - converted_args[param_name] = target_type.model_validate( - args[param_name] - ) - except Exception as e: - logger.warning( - f"Failed to convert argument '{param_name}' to Pydantic" - f' model {target_type.__name__}: {e}' - ) - # Keep the original value if conversion fails - pass - # Handle list[BaseModel] types - elif is_list_of_basemodel(target_type) and isinstance( - args[param_name], list - ): - item_type = get_list_inner_type(target_type) + if param_name in args and param.annotation != inspect.Parameter.empty: + target_type = param.annotation + + # Handle Optional[PydanticModel] types + if get_origin(param.annotation) is Union: + union_args = get_args(param.annotation) + # Find the non-None type in Optional[T] (which is Union[T, None]) + non_none_types = [arg for arg in union_args if arg is not type(None)] + if len(non_none_types) == 1: + target_type = non_none_types[0] + + # Check if the target type is a Pydantic model + if inspect.isclass(target_type) and issubclass( + target_type, pydantic.BaseModel + ): + # Skip conversion if the value is None and the parameter is Optional + if args[param_name] is None: + continue + + # Convert to Pydantic model if it's not already the correct type + if not isinstance(args[param_name], target_type): try: - converted_args[param_name] = [ - item_type.model_validate(item) - if isinstance(item, dict) - else item - for item in args[param_name] - ] + converted_args[param_name] = target_type.model_validate( + args[param_name] + ) except Exception as e: logger.warning( - f"Failed to convert argument '{param_name}' to" - f' list[{item_type.__name__}]: {e}' + f"Failed to convert argument '{param_name}' to Pydantic model" + f' {target_type.__name__}: {e}' ) + # Keep the original value if conversion fails pass return converted_args @@ -274,12 +220,6 @@ async def run_async( return await self._invoke_callable(self.func, args_to_call) - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get('error'): - return 'TOOL_ERROR' - return None - async def _invoke_callable( self, target: Callable[..., Any], args_to_call: dict[str, Any] ) -> Any: diff --git a/src/google/adk/tools/google_api_tool/google_api_toolset.py b/src/google/adk/tools/google_api_tool/google_api_toolset.py index 39d5e71942..3ecf2f39a4 100644 --- a/src/google/adk/tools/google_api_tool/google_api_toolset.py +++ b/src/google/adk/tools/google_api_tool/google_api_toolset.py @@ -48,8 +48,6 @@ class GoogleApiToolset(BaseToolset): tool_name_prefix: Optional prefix to add to all tool names in this toolset. additional_headers: Optional dict of HTTP headers to inject into every request executed by this toolset. - additional_scopes: Optional list of additional scopes to request. - discovery_url: Optional custom discovery URL to use for the API. """ def __init__( @@ -63,8 +61,6 @@ def __init__( tool_name_prefix: Optional[str] = None, *, additional_headers: Optional[Dict[str, str]] = None, - additional_scopes: Optional[List[str]] = None, - discovery_url: Optional[str] = None, ): super().__init__(tool_filter=tool_filter, tool_name_prefix=tool_name_prefix) self.api_name = api_name @@ -73,8 +69,6 @@ def __init__( self._client_secret = client_secret self._service_account = service_account self._additional_headers = additional_headers - self._additional_scopes = additional_scopes - self._discovery_url = discovery_url self._openapi_toolset = self._load_toolset_with_oidc_auth() @override @@ -99,22 +93,13 @@ def set_tool_filter(self, tool_filter: Union[ToolPredicate, List[str]]): def _load_toolset_with_oidc_auth(self) -> OpenAPIToolset: spec_dict = GoogleApiToOpenApiConverter( - self.api_name, self.api_version, discovery_url=self._discovery_url + self.api_name, self.api_version ).convert() - discovery_scopes = list( + scope = list( spec_dict['components']['securitySchemes']['oauth2']['flows'][ 'authorizationCode' ]['scopes'].keys() - ) - default_scope = discovery_scopes[0] if discovery_scopes else None - - scopes = list( - dict.fromkeys( - ([default_scope] if default_scope else []) - + (self._additional_scopes or []) - ) - ) - + )[0] return OpenAPIToolset( spec_dict=spec_dict, spec_str_type='yaml', @@ -132,7 +117,7 @@ def _load_toolset_with_oidc_auth(self) -> OpenAPIToolset: 'client_secret_basic', ], grant_types_supported=['authorization_code'], - scopes=scopes, + scopes=[scope], ), ) diff --git a/src/google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py b/src/google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py index 9c2aaa5f6d..8df910e979 100644 --- a/src/google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py +++ b/src/google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py @@ -32,19 +32,15 @@ class GoogleApiToOpenApiConverter: """Converts Google API Discovery documents to OpenAPI v3 format.""" - def __init__( - self, api_name: str, api_version: str, *, discovery_url: str | None = None - ): + def __init__(self, api_name: str, api_version: str): """Initialize the converter with the API name and version. Args: api_name: The name of the Google API (e.g., "calendar") api_version: The version of the API (e.g., "v3") - discovery_url: Optional custom discovery document URL. """ self._api_name = api_name self._api_version = api_version - self._discovery_url = discovery_url self._google_api_resource = None self._google_api_spec = None self._openapi_spec = { @@ -64,14 +60,7 @@ def fetch_google_api_spec(self) -> None: self._api_version, ) # Build a resource object for the specified API - if self._discovery_url: - self._google_api_resource = build( - self._api_name, - self._api_version, - discoveryServiceUrl=self._discovery_url, - ) - else: - self._google_api_resource = build(self._api_name, self._api_version) + self._google_api_resource = build(self._api_name, self._api_version) # Access the underlying API discovery document self._google_api_spec = self._google_api_resource._rootDesc diff --git a/src/google/adk/tools/google_tool.py b/src/google/adk/tools/google_tool.py index f4294b76cf..c6ab67bb9c 100644 --- a/src/google/adk/tools/google_tool.py +++ b/src/google/adk/tools/google_tool.py @@ -106,12 +106,6 @@ async def run_async( "error_details": str(ex), } - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get("status") == "ERROR": - return "TOOL_ERROR" - return None - async def _run_async_with_credential( self, credentials: Credentials, diff --git a/src/google/adk/tools/mcp_tool/mcp_tool.py b/src/google/adk/tools/mcp_tool/mcp_tool.py index 4acc4ff847..6a24651f92 100644 --- a/src/google/adk/tools/mcp_tool/mcp_tool.py +++ b/src/google/adk/tools/mcp_tool/mcp_tool.py @@ -461,12 +461,6 @@ async def _run_async_impl( ) return result - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get("isError"): - return "MCP_TOOL_ERROR" - return None - def _resolve_progress_callback( self, tool_context: ToolContext ) -> Optional[ProgressFnT]: diff --git a/src/google/adk/tools/mcp_tool/mcp_toolset.py b/src/google/adk/tools/mcp_tool/mcp_toolset.py index 6d3ccf7c65..71f7cd1645 100644 --- a/src/google/adk/tools/mcp_tool/mcp_toolset.py +++ b/src/google/adk/tools/mcp_tool/mcp_toolset.py @@ -83,6 +83,7 @@ class McpToolset(BaseToolset): # Use in an agent agent = LlmAgent( + model='gemini-2.5-flash', name='enterprise_assistant', instruction='Help user accessing their file systems', tools=[toolset], @@ -435,7 +436,7 @@ async def close(self) -> None: await self._mcp_session_manager.close() except Exception as e: # Log the error but don't re-raise to avoid blocking shutdown - logger.warning("Error during McpToolset cleanup: %s", e) + print(f"Warning: Error during McpToolset cleanup: {e}", file=self._errlog) @override def get_auth_config(self) -> Optional[AuthConfig]: diff --git a/src/google/adk/tools/mcp_tool/session_context.py b/src/google/adk/tools/mcp_tool/session_context.py index 2080588c33..0ad63044d4 100644 --- a/src/google/adk/tools/mcp_tool/session_context.py +++ b/src/google/adk/tools/mcp_tool/session_context.py @@ -1,4 +1,4 @@ -# Copyright 2026 Google LLC +# Copyright 2025 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -130,12 +130,6 @@ async def start(self) -> ClientSession: if not self._task: self._task = asyncio.create_task(self._run()) - def _retrieve_exception(t: asyncio.Task): - if not t.cancelled(): - t.exception() - - self._task.add_done_callback(_retrieve_exception) - await self._ready_event.wait() if self._task.cancelled(): @@ -298,17 +292,7 @@ async def _run(self): sampling_capabilities=self._sampling_capabilities, ) ) - # pylint: disable-next=protected-access - if is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING): - # Use anyio.fail_after to keep session.initialize within the AnyIO - # cancel scope instead of asyncio.wait_for which runs in a nested - # task. - import anyio - - with anyio.fail_after(self._timeout): - await session.initialize() - else: - await asyncio.wait_for(session.initialize(), timeout=self._timeout) + await asyncio.wait_for(session.initialize(), timeout=self._timeout) logger.debug('Session has been successfully initialized') self._session = session diff --git a/src/google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py b/src/google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py index 9d428cb544..99e649d9c9 100644 --- a/src/google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +++ b/src/google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py @@ -36,7 +36,6 @@ from ...base_toolset import BaseToolset from ...base_toolset import ToolPredicate from .openapi_spec_parser import OpenApiSpecParser -from .rest_api_tool import HttpxClientFactory from .rest_api_tool import RestApiTool logger = logging.getLogger("google_adk." + __name__) @@ -78,7 +77,6 @@ def __init__( header_provider: Optional[ Callable[[ReadonlyContext], Dict[str, str]] ] = None, - httpx_client_factory: Optional[HttpxClientFactory] = None, preserve_property_names: bool = False, ): """Initializes the OpenAPIToolset. @@ -119,34 +117,24 @@ def __init__( tool_name_prefix: The prefix to prepend to the names of the tools returned by the toolset. Useful when multiple OpenAPI specs have tools with similar names. - ssl_verify: SSL certificate verification option for all tools. Can be: - - None: Use default verification (True) - True: Verify SSL certificates - using system CA - False: Disable SSL verification (insecure, not - recommended) - str: Path to a CA bundle file or directory for custom - CA - ssl.SSLContext: Custom SSL context for advanced configuration - This is useful for enterprise environments where requests go through a - TLS-intercepting proxy with a custom CA certificate. + ssl_verify: SSL certificate verification option for all tools. Can be: + - None: Use default verification (True) + - True: Verify SSL certificates using system CA + - False: Disable SSL verification (insecure, not recommended) + - str: Path to a CA bundle file or directory for custom CA + - ssl.SSLContext: Custom SSL context for advanced configuration + This is useful for enterprise environments where requests go through + a TLS-intercepting proxy with a custom CA certificate. header_provider: A callable that returns a dictionary of headers to be included in API requests. The callable receives the ReadonlyContext as an argument, allowing dynamic header generation based on the current context. Useful for adding custom headers like correlation IDs, authentication tokens, or other request metadata. - httpx_client_factory: Optional zero-argument callable returning an - ``httpx.AsyncClient`` to use for every generated tool's API calls. When - provided, it takes precedence over the per-tool default client - construction and unlocks ``httpx.AsyncClient`` options that - ``ssl_verify`` can't reach (proxies, HTTP/2, custom transports such as - request signing). The returned client is used as an async context - manager and closed after each request, so the factory must return a - fresh client on every call. Defaults to ``None``, in which case each - generated tool constructs its own ``httpx.AsyncClient`` per request. - Mirrors the pattern exposed for MCP by - ``StreamableHTTPConnectionParams.httpx_client_factory``. preserve_property_names: If True, preserve the original property names - from the OpenAPI spec instead of converting them to snake_case. This is - useful when calling APIs that expect camelCase or other non-snake_case - parameter names in the request. Defaults to False for backward - compatibility. + from the OpenAPI spec instead of converting them to snake_case. This + is useful when calling APIs that expect camelCase or other + non-snake_case parameter names in the request. Defaults to False for + backward compatibility. """ super().__init__(tool_filter=tool_filter, tool_name_prefix=tool_name_prefix) self._header_provider = header_provider @@ -167,7 +155,6 @@ def __init__( if not spec_dict: spec_dict = self._load_spec(spec_str, spec_str_type) self._ssl_verify = ssl_verify - self._httpx_client_factory = httpx_client_factory self._tools: Final[List[RestApiTool]] = list(self._parse(spec_dict)) if auth_scheme or auth_credential: self._configure_auth_all(auth_scheme, auth_credential) @@ -250,7 +237,6 @@ def _parse(self, openapi_spec_dict: Dict[str, Any]) -> List[RestApiTool]: o, ssl_verify=self._ssl_verify, header_provider=self._header_provider, - httpx_client_factory=self._httpx_client_factory, ) logger.info("Parsed tool: %s", tool.name) tools.append(tool) diff --git a/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py b/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py index 61cb6a37e4..fa32ce932a 100644 --- a/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +++ b/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py @@ -75,18 +75,6 @@ def snake_to_lower_camel(snake_case_string: str): AuthPreparationState = Literal["pending", "done"] -HttpxClientFactory = Callable[[], httpx.AsyncClient] -"""Type alias for a zero-argument factory returning an ``httpx.AsyncClient``. - -When supplied to ``RestApiTool`` or ``OpenAPIToolset``, the factory is invoked -once per API call and its returned client is used as an async context -manager to issue the request, in place of the default -```httpx.AsyncClient(verify=..., timeout=None)```. Because the client is closed -when the request completes, the factory must return a fresh client on every -call. This unlocks knobs that the narrower ``ssl_verify`` parameter can't -reach: proxies, HTTP/2, custom transports (e.g. request-signing), and so on. -""" - class RestApiTool(BaseTool): """A generic tool that interacts with a REST API. @@ -115,7 +103,6 @@ def __init__( header_provider: Optional[ Callable[[ReadonlyContext], Dict[str, str]] ] = None, - httpx_client_factory: Optional[HttpxClientFactory] = None, *, credential_key: Optional[str] = None, ): @@ -144,26 +131,17 @@ def __init__( (https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#security-scheme-object) auth_credential: The authentication credential of the tool. should_parse_operation: Whether to parse the operation. - ssl_verify: SSL certificate verification option. Can be: - None: Use - default verification - True: Verify SSL certificates using system CA - - False: Disable SSL verification (insecure, not recommended) - str: - Path to a CA bundle file or directory for custom CA - - ssl.SSLContext: Custom SSL context for advanced configuration + ssl_verify: SSL certificate verification option. Can be: + - None: Use default verification + - True: Verify SSL certificates using system CA + - False: Disable SSL verification (insecure, not recommended) + - str: Path to a CA bundle file or directory for custom CA + - ssl.SSLContext: Custom SSL context for advanced configuration header_provider: A callable that returns a dictionary of headers to be included in API requests. The callable receives the ReadonlyContext as an argument, allowing dynamic header generation based on the current context. Useful for adding custom headers like correlation IDs, authentication tokens, or other request metadata. - httpx_client_factory: Optional zero-argument callable returning an - ``httpx.AsyncClient``. When provided, the returned client is used as - an async context manager to issue the request and is closed once the - request completes, so the factory must return a fresh client on each - call. This lets callers configure proxies, HTTP/2, custom transports - (e.g. request signing), or any other ``httpx.AsyncClient`` option that - ``ssl_verify`` can't reach. When ``None`` (default), a fresh - ``httpx.AsyncClient(verify=..., timeout=None)`` is created per - request. Mirrors the pattern exposed for MCP by - ``StreamableHTTPConnectionParams.httpx_client_factory``. credential_key: Optional stable key used for interactive auth and credential caching. """ @@ -191,7 +169,6 @@ def __init__( self._default_headers: Dict[str, str] = {} self._ssl_verify = ssl_verify self._header_provider = header_provider - self._httpx_client_factory = httpx_client_factory self._logger = logger if should_parse_operation: self._operation_parser = OperationParser(self.operation) @@ -204,7 +181,6 @@ def from_parsed_operation( header_provider: Optional[ Callable[[ReadonlyContext], Dict[str, str]] ] = None, - httpx_client_factory: Optional[HttpxClientFactory] = None, ) -> "RestApiTool": """Initializes the RestApiTool from a ParsedOperation object. @@ -216,9 +192,6 @@ def from_parsed_operation( an argument, allowing dynamic header generation based on the current context. Useful for adding custom headers like correlation IDs, authentication tokens, or other request metadata. - httpx_client_factory: Optional zero-argument callable returning an - ``httpx.AsyncClient`` to be used for the API call. See - ``RestApiTool.__init__`` for details. Returns: A RestApiTool object. @@ -239,7 +212,6 @@ def from_parsed_operation( auth_credential=parsed.auth_credential, ssl_verify=ssl_verify, header_provider=header_provider, - httpx_client_factory=httpx_client_factory, ) generated._operation_parser = operation_parser return generated @@ -548,9 +520,7 @@ async def call( if provider_headers: request_params.setdefault("headers", {}).update(provider_headers) - response = await _request( - httpx_client_factory=self._httpx_client_factory, **request_params - ) + response = await _request(**request_params) # Log the API response self._logger.debug( @@ -584,12 +554,6 @@ async def call( self._logger.debug("API Response (non-JSON): %s", response.text) return {"text": response.text} # Return text if not JSON - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get("error"): - return "HTTP_ERROR" - return None - def __str__(self): return ( f'RestApiTool(name="{self.name}", description="{self.description}",' @@ -605,14 +569,9 @@ def __repr__(self): ) -async def _request( - *, - httpx_client_factory: Optional[HttpxClientFactory] = None, - **request_params, -) -> httpx.Response: - verify = request_params.pop("verify", True) - if httpx_client_factory is not None: - async with httpx_client_factory() as client: - return await client.request(**request_params) - async with httpx.AsyncClient(verify=verify, timeout=None) as client: +async def _request(**request_params) -> httpx.Response: + async with httpx.AsyncClient( + verify=request_params.pop("verify", True), + timeout=None, + ) as client: return await client.request(**request_params) diff --git a/src/google/adk/tools/set_model_response_tool.py b/src/google/adk/tools/set_model_response_tool.py index 592ec19582..d1dc6ed55d 100644 --- a/src/google/adk/tools/set_model_response_tool.py +++ b/src/google/adk/tools/set_model_response_tool.py @@ -140,19 +140,14 @@ async def run_async( if self._is_basemodel: # For regular BaseModel, validate directly validated_response = self.output_schema.model_validate(args) - result = validated_response.model_dump(exclude_none=True) + return validated_response.model_dump(exclude_none=True) elif self._is_list_of_basemodel: # For list[BaseModel], extract and validate the 'items' field items = args.get('items', []) type_adapter = TypeAdapter(self.output_schema) validated_response = type_adapter.validate_python(items) - result = [ - item.model_dump(exclude_none=True) for item in validated_response - ] + return [item.model_dump(exclude_none=True) for item in validated_response] else: # For other schema types (list[str], dict, etc.), # return the value directly without pydantic validation - result = args.get('response') - - tool_context.actions.set_model_response = result - return result + return args.get('response') diff --git a/src/google/adk/tools/skill_toolset.py b/src/google/adk/tools/skill_toolset.py index 0ee5e5b594..ef579d8256 100644 --- a/src/google/adk/tools/skill_toolset.py +++ b/src/google/adk/tools/skill_toolset.py @@ -24,8 +24,8 @@ import logging import mimetypes from typing import Any -from typing import Optional from typing import TYPE_CHECKING +import warnings from google.genai import types from typing_extensions import override @@ -33,12 +33,13 @@ from ..agents.readonly_context import ReadonlyContext from ..code_executors.base_code_executor import BaseCodeExecutor from ..code_executors.code_execution_utils import CodeExecutionInput +from ..features import experimental +from ..features import FeatureName from ..skills import models from ..skills import prompt from ..skills import SkillRegistry from .base_tool import BaseTool from .base_toolset import BaseToolset -from .base_toolset import ToolPredicate from .function_tool import FunctionTool from .tool_context import ToolContext @@ -57,45 +58,37 @@ " conversation history for you to analyze." ) - -def _build_skill_system_instruction(prefix: str | None = None) -> str: - p = f"{prefix}_" if prefix else "" - - return ( - "You can use specialized 'skills' to help you with complex tasks. " - "You MUST use the skill tools to interact with these skills.\n\n" - "Skills are folders of instructions and resources that extend your " - "capabilities for specialized tasks. Each skill folder contains:\n" - "- **SKILL.md** (required): The main instruction file with skill " - "metadata and detailed markdown instructions.\n" - "- **references/** (Optional): Additional documentation or examples for " - "skill usage.\n" - "- **assets/** (Optional): Templates, scripts or other resources used by " - "the skill.\n" - "- **scripts/** (Optional): Executable scripts that can be run via " - "bash.\n\n" - "This is very important:\n\n" - "1. If a skill seems relevant to the current user query, you MUST use " - f'the `{p}load_skill` tool with `skill_name=""` to read ' - "its full instructions before proceeding.\n" - "2. Once you have read the instructions, follow them exactly as " - "documented before replying to the user. For example, If the " - "instruction lists multiple steps, please make sure you complete all " - "of them in order.\n" - f"3. The `{p}load_skill_resource` tool is for viewing files within a " - "skill's directory (e.g., `references/*`, `assets/*`, `scripts/*`). " - "It is ONLY for skill-bundled files — do NOT use it to access " - "documents or files provided by the user at runtime. Do NOT use " - "other tools to access skill files.\n" - f"4. Use `{p}run_skill_script` to run scripts from a skill's `scripts/` " - f"directory. Use `{p}load_skill_resource` to view script content" - " first if " - "needed.\n" - f"5. If `{p}load_skill_resource` returns any error, do not retry any " - "path. Report the error to the user and stop.\n" - ) +_DEFAULT_SKILL_SYSTEM_INSTRUCTION = ( + "You can use specialized 'skills' to help you with complex tasks. " + "You MUST use the skill tools to interact with these skills.\n\n" + "Skills are folders of instructions and resources that extend your " + "capabilities for specialized tasks. Each skill folder contains:\n" + "- **SKILL.md** (required): The main instruction file with skill " + "metadata and detailed markdown instructions.\n" + "- **references/** (Optional): Additional documentation or examples for " + "skill usage.\n" + "- **assets/** (Optional): Templates, scripts or other resources used by " + "the skill.\n" + "- **scripts/** (Optional): Executable scripts that can be run via " + "bash.\n\n" + "This is very important:\n\n" + "1. If a skill seems relevant to the current user query, you MUST use " + 'the `load_skill` tool with `skill_name=""` to read ' + "its full instructions before proceeding.\n" + "2. Once you have read the instructions, follow them exactly as " + "documented before replying to the user. For example, If the " + "instruction lists multiple steps, please make sure you complete all " + "of them in order.\n" + "3. The `load_skill_resource` tool is for viewing files within a " + "skill's directory (e.g., `references/*`, `assets/*`, `scripts/*`). " + "Do NOT use other tools to access these files.\n" + "4. Use `run_skill_script` to run scripts from a skill's `scripts/` " + "directory. Use `load_skill_resource` to view script content first if " + "needed.\n" +) +@experimental(FeatureName.SKILL_TOOLSET) class ListSkillsTool(BaseTool): """Tool to list all available skills.""" @@ -125,6 +118,7 @@ async def run_async( return prompt.format_skills_as_xml(skills) +@experimental(FeatureName.SKILL_TOOLSET) class SearchSkillsTool(BaseTool): """Tool to search for relevant skills in the registry.""" @@ -187,6 +181,7 @@ async def run_async( } +@experimental(FeatureName.SKILL_TOOLSET) class LoadSkillTool(BaseTool): """Tool to load a skill's instructions.""" @@ -254,14 +249,8 @@ async def run_async( "frontmatter": skill.frontmatter.model_dump(), } - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get("error"): - error_code = response.get("error_code") - return error_code if error_code else "TOOL_ERROR" - return None - +@experimental(FeatureName.SKILL_TOOLSET) class LoadSkillResourceTool(BaseTool): """Tool to load resources (references, assets, or scripts) from a skill.""" @@ -302,15 +291,16 @@ def _get_declaration(self) -> types.FunctionDeclaration | None: async def run_async( self, *, args: dict[str, Any], tool_context: ToolContext ) -> Any: - skill_name: str | None = args.get("skill_name") - file_path: str | None = args.get("file_path") - - if not skill_name or not file_path: - errors = [] - if not skill_name: - errors.append("Argument 'skill_name' is required.") - if not file_path: - errors.append("Argument 'file_path' is required.") + skill_name = args.get("skill_name") + file_path = args.get("file_path") + + errors = [] + if not skill_name: + errors.append("Argument 'skill_name' is required.") + if not file_path: + errors.append("Argument 'file_path' is required.") + + if errors: return { "error": "\n".join(errors), "error_code": "INVALID_ARGUMENTS", @@ -353,23 +343,6 @@ async def run_async( } if content is None: - # Invocation-scoped failure counter. Counts RESOURCE_NOT_FOUND across ALL - # paths so the guard fires even when the LLM hallucinates a different path - # on each retry. The `temp:` prefix prevents persistence to durable - # session storage; invocation_id isolates in-memory backends. - counter_key = f"temp:_adk_skill_resource_not_found_count_{tool_context.invocation_id}" - fail_count = int(tool_context.state.get(counter_key) or 0) + 1 - tool_context.state[counter_key] = fail_count - if fail_count > 1: - return { - "error": ( - f"Resource '{file_path}' not found in skill '{skill_name}'." - f" This is resource lookup failure #{fail_count} this" - " invocation. Do not retry any path — report the error to" - " the user and stop." - ), - "error_code": "RESOURCE_NOT_FOUND_FATAL", - } return { "error": f"Resource '{file_path}' not found in skill '{skill_name}'.", "error_code": "RESOURCE_NOT_FOUND", @@ -388,13 +361,6 @@ async def run_async( "content": content, } - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get("error"): - error_code = response.get("error_code") - return error_code if error_code else "TOOL_ERROR" - return None - @override async def process_llm_request( self, *, tool_context: ToolContext, llm_request: Any @@ -660,13 +626,7 @@ def _build_wrapper_code( " _orig_cwd = os.getcwd()", " with tempfile.TemporaryDirectory() as td:", " for rel_path, content in _files.items():", - " norm_rel = os.path.normpath(rel_path)", - " if norm_rel.startswith('..') or os.path.isabs(norm_rel):", - ( - " raise PermissionError('Path traversal blocked in skill" - " file: ' + rel_path)" - ), - " full_path = os.path.join(os.path.abspath(td), norm_rel)", + " full_path = os.path.join(td, rel_path)", " os.makedirs(os.path.dirname(full_path), exist_ok=True)", " mode = 'wb' if isinstance(content, bytes) else 'w'", " with open(full_path, mode) as f:", @@ -694,10 +654,6 @@ def _build_wrapper_code( code_lines.extend([ f" sys.argv = {argv_list!r}", - ( - " sys.path.insert(0," - f" os.path.dirname(os.path.abspath({file_path!r})))" - ), " try:", f" runpy.run_path({file_path!r}, run_name='__main__')", " except SystemExit as e:", @@ -754,6 +710,7 @@ def _build_wrapper_code( return "\n".join(code_lines) +@experimental(FeatureName.SKILL_TOOLSET) class RunSkillScriptTool(BaseTool): """Tool to execute scripts from a skill's scripts/ directory.""" @@ -820,24 +777,17 @@ async def run_async( self, *, args: dict[str, Any], tool_context: ToolContext ) -> Any: # Standardized arguments: skill_name and file_path. - skill_name: str | None = args.get("skill_name") - file_path: str | None = args.get("file_path") + skill_name = args.get("skill_name") + file_path = args.get("file_path") script_args = args.get("args") short_options = args.get("short_options") positional_args = args.get("positional_args") - if not skill_name or not file_path: - errors = [] - if not skill_name: - errors.append("Argument 'skill_name' is required.") - if not file_path: - errors.append("Argument 'file_path' is required.") - return { - "error": "\n".join(errors), - "error_code": "INVALID_ARGUMENTS", - } - errors = [] + if not skill_name: + errors.append("Argument 'skill_name' is required.") + if not file_path: + errors.append("Argument 'file_path' is required.") if script_args is not None and not isinstance(script_args, (dict, list)): errors.append( @@ -923,14 +873,8 @@ async def run_async( positional_args, # pylint: disable=protected-access ) - def _detect_error_in_response(self, response: Any) -> Optional[str]: - """Telemetry hook: returns an error type if the response indicates an error.""" - if isinstance(response, dict) and response.get("error"): - error_code = response.get("error_code") - return error_code if error_code else "TOOL_ERROR" - return None - +@experimental(FeatureName.SKILL_TOOLSET) class SkillToolset(BaseToolset): """A toolset for managing and interacting with agent skills.""" @@ -942,8 +886,6 @@ def __init__( code_executor: BaseCodeExecutor | None = None, script_timeout: int = _DEFAULT_SCRIPT_TIMEOUT, additional_tools: list[ToolUnion] | None = None, - tool_name_prefix: str | None = None, - tool_filter: ToolPredicate | list[str] | None = None, ): """Initializes the SkillToolset. @@ -956,10 +898,8 @@ def __init__( scripts executed via exec(). additional_tools: Optional list of `BaseTool` or `BaseToolset` instances to be made available to the agent when certain skills are activated. - tool_name_prefix: Optional prefix to prepend to tool names. - tool_filter: Optional filter to select specific tools. """ - super().__init__(tool_filter=tool_filter, tool_name_prefix=tool_name_prefix) + super().__init__() skills = skills or [] @@ -1011,8 +951,7 @@ async def get_tools( dynamic_tools = await self._resolve_additional_tools_from_state( readonly_context ) - all_tools = self._tools + dynamic_tools - return [t for t in all_tools if self._is_tool_selected(t, readonly_context)] + return self._tools + dynamic_tools async def _resolve_additional_tools_from_state( self, readonly_context: ReadonlyContext | None @@ -1124,9 +1063,7 @@ async def process_llm_request( self, *, tool_context: ToolContext, llm_request: LlmRequest ) -> None: """Processes the outgoing LLM request to include available skills.""" - instructions = [ - _build_skill_system_instruction(prefix=self.tool_name_prefix) - ] + instructions = [_DEFAULT_SKILL_SYSTEM_INSTRUCTION] has_list_skills = any(isinstance(t, ListSkillsTool) for t in self._tools) @@ -1136,10 +1073,9 @@ async def process_llm_request( instructions.append(skills_xml) if self._registry: - p = f"{self.tool_name_prefix}_" if self.tool_name_prefix else "" instructions.append( "\nIf the locally available skills are not sufficient to complete " - f"your task, you can use the `{p}search_skills` tool to discover " + "your task, you can use the `search_skills` tool to discover " "additional skills from the registry." ) @@ -1156,4 +1092,14 @@ async def close(self) -> None: await super().close() -DEFAULT_SKILL_SYSTEM_INSTRUCTION = _build_skill_system_instruction() +def __getattr__(name: str) -> Any: + if name == "DEFAULT_SKILL_SYSTEM_INSTRUCTION": + warnings.warn( + "DEFAULT_SKILL_SYSTEM_INSTRUCTION is experimental. Its content " + "is internal implementation and will change in minor/patch releases " + "to tune agent performance.", + UserWarning, + stacklevel=2, + ) + return _DEFAULT_SKILL_SYSTEM_INSTRUCTION + raise AttributeError(f"module {__name__} has no attribute {name}") diff --git a/src/google/adk/utils/_dependency.py b/src/google/adk/utils/_dependency.py deleted file mode 100644 index d043a2d7e0..0000000000 --- a/src/google/adk/utils/_dependency.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Helper for optional dependencies and packaging extras.""" - -from __future__ import annotations - - -def missing_extra(package: str, extra: str) -> ImportError: - """Returns an ImportError with a standard message for a missing extra. - - Args: - package: The name of the package that failed to import (e.g., 'vertexai'). - extra: The name of the extra group required to install it (e.g., 'gcp'). - """ - return ImportError( - f"The '{package}' package is required to use this feature. " - f"Please install it by running: pip install google-adk[{extra}]" - ) diff --git a/src/google/adk/utils/_google_client_headers.py b/src/google/adk/utils/_google_client_headers.py index f0bc179864..14408178e4 100644 --- a/src/google/adk/utils/_google_client_headers.py +++ b/src/google/adk/utils/_google_client_headers.py @@ -1,4 +1,4 @@ -# Copyright 2026 Google LLC +# Copyright 2025 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/google/adk/utils/_schema_utils.py b/src/google/adk/utils/_schema_utils.py index e83431bd61..3bb74df932 100644 --- a/src/google/adk/utils/_schema_utils.py +++ b/src/google/adk/utils/_schema_utils.py @@ -92,20 +92,6 @@ def get_list_inner_type(schema: SchemaType) -> Optional[type[BaseModel]]: return args[0] -def schema_to_json_schema(schema: SchemaType) -> dict[str, Any]: - """Converts a SchemaType to a JSON Schema dict. - - Args: - schema: The schema to convert. - - Returns: - A JSON Schema dict representation of the schema. - """ - if isinstance(schema, dict): - return schema - return TypeAdapter(schema).json_schema() - - def validate_schema(schema: SchemaType, json_text: str) -> Any: """Validate JSON text against a schema and return the result. diff --git a/src/google/adk/utils/_serialized_base_model.py b/src/google/adk/utils/_serialized_base_model.py deleted file mode 100644 index e834cee8e5..0000000000 --- a/src/google/adk/utils/_serialized_base_model.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Base model for serialized Pydantic models.""" - -from __future__ import annotations - -import pydantic -from pydantic import alias_generators - - -class SerializedBaseModel(pydantic.BaseModel): - """Base model for all Pydantic models that are serialized for Web Server or Storage. - - This model enforces camelCase serialization by default to align with JSON - conventions used in the web UI and external APIs, while allowing Python code - to use snake_case. - - Note: `model_dump_json()` is overridden to use `by_alias=True` by default to - ensure camelCase output in JSON serialization. - """ - - model_config = pydantic.ConfigDict( - alias_generator=alias_generators.to_camel, - populate_by_name=True, - use_attribute_docstrings=True, - ) - - def model_dump_json(self, **kwargs) -> str: - """Override model_dump_json to use by_alias=True by default.""" - kwargs.setdefault('by_alias', True) - return super().model_dump_json(**kwargs) diff --git a/src/google/adk/utils/agent_info.py b/src/google/adk/utils/agent_info.py index f9997bdc32..957b5808bf 100644 --- a/src/google/adk/utils/agent_info.py +++ b/src/google/adk/utils/agent_info.py @@ -34,16 +34,14 @@ class AgentInfo(pydantic.BaseModel): sub_agents: list[str] -async def get_tools_info(tools: list[ToolUnion]) -> list[Any]: +def get_tools_info(tools: list[ToolUnion]) -> list[Any]: """Returns the info for a given list of tools.""" final_tools = [] for tool in tools: if isinstance(tool, BaseTool): final_tools.append(tool) elif isinstance(tool, BaseToolset): - # Await the async coroutine call natively! - tools_res = await tool.get_tools() - final_tools.extend(tools_res) + final_tools.extend(tool.get_tools()) else: final_tools.append(FunctionTool(tool)) return [ @@ -53,27 +51,27 @@ async def get_tools_info(tools: list[ToolUnion]) -> list[Any]: ] -async def get_agents_dict(agent: LlmAgent) -> dict[str, AgentInfo]: +def get_agents_dict(agent: LlmAgent) -> dict[str, AgentInfo]: """Returns a dict with info for the agent and its sub-agents.""" agents_dict = {} - async def _traverse(current_agent: LlmAgent): + def _traverse(current_agent: LlmAgent): if current_agent.name in agents_dict: return sub_agent_names = [] for sub_agent in current_agent.sub_agents: if isinstance(sub_agent, LlmAgent): - await _traverse(sub_agent) + _traverse(sub_agent) sub_agent_names.append(sub_agent.name) agents_dict[current_agent.name] = AgentInfo( name=current_agent.name, description=current_agent.description, instruction=current_agent.instruction, - tools=await get_tools_info(current_agent.tools), + tools=get_tools_info(current_agent.tools), sub_agents=sub_agent_names, ) - await _traverse(agent) + _traverse(agent) return agents_dict diff --git a/src/google/adk/utils/content_utils.py b/src/google/adk/utils/content_utils.py index 344970ec65..011269aea1 100644 --- a/src/google/adk/utils/content_utils.py +++ b/src/google/adk/utils/content_utils.py @@ -1,4 +1,4 @@ -# Copyright 2026 Google LLC +# Copyright 2025 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -36,10 +36,3 @@ def filter_audio_parts(content: types.Content) -> types.Content | None: if not filtered_parts: return None return types.Content(role=content.role, parts=filtered_parts) - - -def extract_text_from_content(content: types.Content | None) -> str: - """Extracts text from a Content object, filtering out thoughts.""" - if not content or not content.parts: - return '' - return ''.join(p.text for p in content.parts if p.text and not p.thought) diff --git a/src/google/adk/utils/model_name_utils.py b/src/google/adk/utils/model_name_utils.py index dbb3a08193..b2e032e0d1 100644 --- a/src/google/adk/utils/model_name_utils.py +++ b/src/google/adk/utils/model_name_utils.py @@ -172,5 +172,4 @@ def is_gemini_3_1_flash_live(model_string: Optional[str]) -> bool: """ if not model_string: return False - model_name = extract_model_name(model_string) - return model_name.startswith('gemini-3.1-flash-live') + return model_string.startswith('gemini-3.1-flash-live') diff --git a/src/google/adk/utils/output_schema_utils.py b/src/google/adk/utils/output_schema_utils.py index 61a477526d..ab9bee1ae8 100644 --- a/src/google/adk/utils/output_schema_utils.py +++ b/src/google/adk/utils/output_schema_utils.py @@ -41,6 +41,7 @@ def can_use_output_schema_with_tools(model: Union[str, BaseLlm]) -> bool: from ..models.lite_llm import LiteLlm except ImportError: LiteLlm = None + if LiteLlm is not None and isinstance(model, LiteLlm): return True diff --git a/src/google/adk/utils/streaming_utils.py b/src/google/adk/utils/streaming_utils.py index 4ffd63b001..af6957b8fe 100644 --- a/src/google/adk/utils/streaming_utils.py +++ b/src/google/adk/utils/streaming_utils.py @@ -349,60 +349,61 @@ def close(self) -> Optional[LlmResponse]: Returns: The aggregated LlmResponse. """ - if not self._response: - return None - - candidate = ( - self._response.candidates[0] if self._response.candidates else None - ) - - finish_reason = self._finish_reason - if not finish_reason and candidate: - finish_reason = candidate.finish_reason - - error_code = None - error_message = None - if finish_reason and finish_reason != types.FinishReason.STOP: - error_code = finish_reason - error_message = candidate.finish_message if candidate else None - elif not candidate and self._response.prompt_feedback: - error_code = self._response.prompt_feedback.block_reason - error_message = self._response.prompt_feedback.block_reason_message - # ========== Progressive SSE Streaming (new feature) ========== if is_feature_enabled(FeatureName.PROGRESSIVE_SSE_STREAMING): - self._flush_text_buffer_to_sequence() - self._flush_function_call_to_sequence() - - final_parts = self._parts_sequence - content = types.ModelContent(parts=final_parts) if final_parts else None + # Always generate final aggregated response in progressive mode + if self._response and self._response.candidates: + # Flush any remaining buffers to complete the sequence + self._flush_text_buffer_to_sequence() + self._flush_function_call_to_sequence() + + # Use the parts sequence which preserves original ordering + final_parts = self._parts_sequence + + if final_parts: + candidate = self._response.candidates[0] + finish_reason = self._finish_reason or candidate.finish_reason + + return LlmResponse( + content=types.ModelContent(parts=final_parts), + grounding_metadata=self._grounding_metadata, + citation_metadata=self._citation_metadata, + error_code=None + if finish_reason == types.FinishReason.STOP + else finish_reason, + error_message=None + if finish_reason == types.FinishReason.STOP + else candidate.finish_message, + usage_metadata=self._usage_metadata, + finish_reason=finish_reason, + partial=False, + ) + + return None + # ========== Non-Progressive SSE Streaming (old behavior) ========== + if ( + (self._text or self._thought_text) + and self._response + and self._response.candidates + ): + parts = [] + if self._thought_text: + parts.append(types.Part(text=self._thought_text, thought=True)) + if self._text: + parts.append(types.Part.from_text(text=self._text)) + candidate = self._response.candidates[0] return LlmResponse( - content=content, + content=types.ModelContent(parts=parts), grounding_metadata=self._grounding_metadata, citation_metadata=self._citation_metadata, - error_code=error_code, - error_message=error_message, + error_code=None + if candidate.finish_reason == types.FinishReason.STOP + else candidate.finish_reason, + error_message=None + if candidate.finish_reason == types.FinishReason.STOP + else candidate.finish_message, usage_metadata=self._usage_metadata, - finish_reason=finish_reason, - partial=False, ) - # ========== Non-Progressive SSE Streaming (old behavior) ========== - parts = [] - if self._thought_text: - parts.append(types.Part(text=self._thought_text, thought=True)) - if self._text: - parts.append(types.Part.from_text(text=self._text)) - content = types.ModelContent(parts=parts) if parts else None - - return LlmResponse( - content=content, - grounding_metadata=self._grounding_metadata, - citation_metadata=self._citation_metadata, - error_code=error_code, - error_message=error_message, - usage_metadata=self._usage_metadata, - finish_reason=finish_reason, - partial=False, - ) + return None diff --git a/src/google/adk/version.py b/src/google/adk/version.py index adcb4953a3..cf2713c03f 100644 --- a/src/google/adk/version.py +++ b/src/google/adk/version.py @@ -13,4 +13,4 @@ # limitations under the License. # version: major.minor.patch -__version__ = "2.2.0" +__version__ = "1.34.0" diff --git a/src/google/adk/workflow/__init__.py b/src/google/adk/workflow/__init__.py deleted file mode 100644 index c1062dc043..0000000000 --- a/src/google/adk/workflow/__init__.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from ._base_node import BaseNode -from ._base_node import START -from ._errors import NodeTimeoutError -from ._function_node import FunctionNode -from ._graph import DEFAULT_ROUTE -from ._graph import Edge -from ._join_node import JoinNode -from ._node import Node -from ._node import node -from ._retry_config import RetryConfig -from ._workflow import Workflow - -__all__ = [ - 'BaseNode', - 'DEFAULT_ROUTE', - 'Edge', - 'FunctionNode', - 'JoinNode', - 'Node', - 'NodeTimeoutError', - 'RetryConfig', - 'START', - 'Workflow', - 'node', -] diff --git a/src/google/adk/workflow/_base_node.py b/src/google/adk/workflow/_base_node.py deleted file mode 100644 index 3347dc2b90..0000000000 --- a/src/google/adk/workflow/_base_node.py +++ /dev/null @@ -1,260 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from collections.abc import AsyncGenerator -from typing import Any -from typing import final -from typing import TYPE_CHECKING - -from google.genai import types -from pydantic import BaseModel -from pydantic import ConfigDict -from pydantic import Field -from pydantic import field_validator -from pydantic import TypeAdapter -from pydantic import ValidationError - -from ..utils._schema_utils import SchemaType -from ..utils.content_utils import extract_text_from_content -from ._retry_config import RetryConfig - -if TYPE_CHECKING: - from ..agents.context import Context - from ..events.event import Event - - -class BaseNode(BaseModel): - """A base class for all nodes in the workflow graph.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - - name: str = Field(...) - """The unique name of the node within the workflow graph.""" - - @field_validator('name') - @classmethod - def _validate_name(cls, v: str) -> str: - if not v.isidentifier(): - raise ValueError(f"Node name '{v}' must be a valid Python identifier.") - return v - - description: str = '' - """A human-readable description of what this node does.""" - - rerun_on_resume: bool = False - """Controls behavior when resuming after an interrupt. - - If True, the node reruns from scratch. If False, it completes immediately - using the user's resuming input as the node's output. - """ - - wait_for_output: bool = False - """If True, node only transitions to COMPLETED upon yielding output or route. - - Without output/route, the node enters WAITING state and downstream nodes are - not triggered, allowing predecessors to re-trigger it. This is useful for nodes - like ``JoinNode`` that run multiple times before producing a final output. - - WARNING: Completing execution without ever yielding output/route causes an - indefinite WAITING state (deadlock). This is considered a user configuration error. - """ - - retry_config: RetryConfig | None = None - """Configuration for retrying the node on failure. - - If set, exceptions raised by the node will trigger retries according - to the specified policy. - """ - - timeout: float | None = None - """Maximum time in seconds for this node to complete. - - If the node does not finish within this duration, it is cancelled and - treated as a failure (raising ``NodeTimeoutError``). This integrates - with ``retry_config`` — a timed-out node can be retried if retries - are configured. - - ``None`` means no timeout (the node runs until completion). - """ - - input_schema: SchemaType | None = None - """Schema to validate and coerce node input data. - - Supports all ``SchemaType`` variants. Validation uses ``TypeAdapter`` - and runs centrally in the node runner before ``node.run()`` is called. - - ``None`` means no input validation (the default). - """ - - output_schema: SchemaType | None = None - """Schema to validate and coerce node output data. - - Supports all ``SchemaType`` variants (Pydantic ``BaseModel`` subclass, - generic aliases like ``list[str]``, raw ``dict`` schemas, etc.). - - When set to a ``BaseModel`` subclass, the node's output data is validated: - - dict → ``output_schema.model_validate(data).model_dump()`` - - BaseModel instance → ``data.model_dump()`` (already converted) - - ``None`` means no output validation (the default). - """ - - state_schema: type[BaseModel] | None = None - """Optional Pydantic model declaring the expected state keys and types. - - When set, ``ctx.state`` mutations are validated at runtime against - this schema. Child nodes inherit the schema from their parent - (via InvocationContext) unless they declare their own. - - Prefixed keys (``app:``, ``user:``, ``temp:``) bypass validation. - """ - - def _validate_schema(self, data: Any, schema: Any) -> Any: - """Validates data against a schema using ``TypeAdapter``. - - Handles BaseModel, list[BaseModel], primitive types, unions, and - generic aliases. Descriptive schemas (``types.Schema``, raw - ``dict``) are skipped. Any BaseModel instances in the validated - result are converted to dicts via ``model_dump()`` to keep - ``Event.output`` JSON-serializable. - """ - if data is None or schema is None: - return data - - if isinstance(schema, (dict, types.Schema)): - return data - - validated = TypeAdapter(schema).validate_python(data) - return self._to_serializable(validated) - - def _validate_input_data(self, data: Any) -> Any: - """Validates data against input_schema if set.""" - if self.input_schema and isinstance(data, types.Content): - # Extract text from Content (e.g. user input from START node). - text = extract_text_from_content(data) - if self.input_schema is str: - return text - # If schema is defined, try to parse the text as JSON. - try: - return TypeAdapter(self.input_schema).validate_json(text) - except ValidationError: - # Fallback to validate_python if it's a raw string matching the schema. - try: - return TypeAdapter(self.input_schema).validate_python(text) - except ValidationError: - pass - return self._validate_schema(data, self.input_schema) - - def _validate_output_data(self, data: Any) -> Any: - """Validates data against output_schema if set.""" - if not self.output_schema: - return data - - # 1. Try standard validation first - try: - return self._validate_schema(data, self.output_schema) - except ValidationError as e: - # 2. If failed, try to parse JSON ONLY if it's Content - if isinstance(data, types.Content): - text = extract_text_from_content(data) - if self.output_schema is str: - return text - if text.strip(): - try: - validated = TypeAdapter(self.output_schema).validate_json(text) - return self._to_serializable(validated) - except ValidationError: - pass - - # 3. If not Content or parsing failed, re-raise original error - raise e - - @staticmethod - def _to_serializable(data: Any) -> Any: - """Converts BaseModel instances to dicts recursively.""" - if isinstance(data, BaseModel): - return data.model_dump() - if isinstance(data, list): - return [BaseNode._to_serializable(item) for item in data] - if isinstance(data, dict): - return {k: BaseNode._to_serializable(v) for k, v in data.items()} - return data - - @final - async def run( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Event, None]: - """Public entry point. Calls _run_impl, normalizes yields to Event. - - Normalization rules: - - None -> skipped - - Event -> pass through - - RequestInput -> convert to interrupt Event - - Any other value -> Event(output=value) - """ - from ..events.event import Event - from ..events.request_input import RequestInput - from ..utils.context_utils import Aclosing - - node_input = self._validate_input_data(node_input) - async with Aclosing(self._run_impl(ctx=ctx, node_input=node_input)) as agen: - async for item in agen: - if item is None: - continue - if isinstance(item, Event): - if item.output is not None: - item.output = self._validate_output_data(item.output) - yield item - elif isinstance(item, RequestInput): - from .utils._workflow_hitl_utils import create_request_input_event - - yield create_request_input_event(item) - else: - validated = self._validate_output_data(item) - yield Event(output=validated) - - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - """Override point for node execution logic. - - Yields any of: Event, RequestInput, raw data, or None. - BaseNode.run() normalizes all yields to Event before the caller - sees them. - """ - raise NotImplementedError( - f'_run_impl for {type(self).__name__} is not implemented.' - ) - yield # AsyncGenerator requires at least one yield statement - - @property - def _requires_all_predecessors(self) -> bool: - """If True, the node waits for all predecessors to complete before running.""" - return False - - -START = BaseNode(name='__START__') -"""Sentinel node marking the entry point of a workflow graph. - -START is never executed — ``Workflow._seed_start_triggers`` bypasses it -and seeds triggers for its successors directly. -""" diff --git a/src/google/adk/workflow/_dynamic_node_scheduler.py b/src/google/adk/workflow/_dynamic_node_scheduler.py deleted file mode 100644 index f25beea7ad..0000000000 --- a/src/google/adk/workflow/_dynamic_node_scheduler.py +++ /dev/null @@ -1,519 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Dynamic node scheduler for Workflow. - -Handles ctx.run_node() calls by tracking dynamic nodes in the -Workflow's _LoopState or a local DynamicNodeState. Supports dedup -(cached output), resume (lazy event scan + re-run), and fresh execution. -""" - -from __future__ import annotations - -import asyncio -from dataclasses import dataclass -from dataclasses import field -import logging -from typing import Any -from typing import TYPE_CHECKING - -from pydantic import ValidationError - -from ..events._node_path_builder import _NodePathBuilder -from ._node_state import NodeState -from ._node_status import NodeStatus -from ._schedule_dynamic_node import ScheduleDynamicNode -from .utils._rehydration_utils import _ChildScanState -from .utils._rehydration_utils import _reconstruct_node_states -from .utils._rehydration_utils import _unwrap_response -from .utils._rehydration_utils import is_terminal_event -from .utils._replay_interceptor import check_interception -from .utils._replay_interceptor import create_mock_context -from .utils._replay_sequence_barrier import ReplaySequenceBarrier - -if TYPE_CHECKING: - from ..agents.context import Context - from ._base_node import BaseNode - - -logger = logging.getLogger('google_adk.' + __name__) - - -@dataclass(kw_only=True) -class DynamicNodeRun: - """Combines state, output, and running task for a single node execution.""" - - state: NodeState - """The tracking state (status, interrupts, run_id).""" - - output: Any = None - """The final output of the node once it completes.""" - - task: asyncio.Task[Context] | None = None - """The running asyncio Task for this node execution.""" - - transfer_to_agent: str | None = None - """The target agent name if this node execution transferred.""" - - recovered_state: _ChildScanState | None = None - """The raw scan state from events, used for replay interception.""" - - -@dataclass(kw_only=True) -class DynamicNodeState: - """State for tracking dynamic nodes scheduled via ctx.run_node(). - - Base class for both Workflow's ``_LoopState`` and standalone - ``DefaultNodeScheduler``. DynamicNodeScheduler reads/writes - these fields for dedup, resume, and interrupt propagation. - """ - - runs: dict[str, DynamicNodeRun] = field(default_factory=dict) - """Dynamic node runs keyed by unique node_path (e.g. /wf@1/node_a@1).""" - - # --- Shared (static + dynamic) --- - - interrupt_ids: set[str] = field(default_factory=set) - """Union of all unresolved interrupt IDs across static and - dynamic child nodes. - - Populated by: - - _restore_static_nodes_from_events: from WAITING static nodes - - _handle_completion: when a static node interrupts at runtime - - schedule callback: when a dynamic node interrupts - - Read by _finalize to propagate to the Workflow's own ctx, - which the parent orchestrator checks after this Workflow - completes. - """ - - def get_dynamic_tasks(self) -> list[asyncio.Task[Context]]: - """Get all active dynamic node tasks.""" - return [run.task for run in self.runs.values() if run.task] - - -class DynamicNodeScheduler(ScheduleDynamicNode): - """Handles ctx.run_node() calls for a Workflow. - - Implements ScheduleDynamicNode protocol via __call__. Tracks - dynamic nodes in loop_state, handles dedup via lazy event - scanning, and manages resume/interrupt propagation. - - Three cases: - 1. Fresh: no prior events → execute normally. - 2. Completed: prior events show output → return cached. - 3. Waiting: prior events show interrupt → resolve or propagate. - """ - - def __init__(self, *, state: DynamicNodeState) -> None: - self._state = state - self._parent_sequence_barriers: dict[str, ReplaySequenceBarrier] = {} - - async def __call__( - self, - ctx: Context, - node: BaseNode, - node_input: Any, - *, - node_name: str | None = None, - use_as_output: bool = False, - run_id: str, - use_sub_branch: bool = False, - override_branch: str | None = None, - override_isolation_scope: str | None = None, - ) -> Context: - """Schedule a dynamic node: dedup, resume, or fresh run. - - Args: - ctx: The calling node's Context. - node: The BaseNode to execute (original, before renaming). - node_input: Input data for the node. - node_name: Deterministic tracking name from ctx.run_node(). - Always provided (user-specified or auto-generated). - use_as_output: If True, the child's output replaces the - calling node's output. - run_id: Custom run ID for the child node execution. - use_sub_branch: Whether the node should use a sub-branch. - override_branch: Optional branch to use instead of parent's branch. - - Returns: - Child Context with output, route, and interrupt_ids set. - """ - curr_node = node - curr_name = node_name or node.name - curr_run_id = run_id - curr_input = node_input - curr_parent_ctx: Context | None = ctx - - while True: - curr_parent_path = curr_parent_ctx.node_path if curr_parent_ctx else None - base_path_builder = ( - _NodePathBuilder.from_string(curr_parent_path) - if curr_parent_path - else _NodePathBuilder([]) - ) - node_path = str(base_path_builder.append(curr_name, curr_run_id)) - - # Rehydration chronological sequence barrier setup for the parent path - parent_path = curr_parent_ctx.node_path if curr_parent_ctx else '' - if parent_path and parent_path not in self._parent_sequence_barriers: - seq = self._scan_parent_child_sequence(curr_parent_ctx, parent_path) - self._parent_sequence_barriers[parent_path] = ReplaySequenceBarrier(seq) - - # Runtime schema validation. - if curr_input is not None: - try: - curr_input = curr_node._validate_input_data(curr_input) - except ValidationError as e: - raise ValueError( - 'Runtime schema validation failed for dynamic node' - f" '{curr_name}'. Input does not match input_schema: {e}" - ) from e - - logger.debug('node %s schedule start.', node_path) - - # Phase 1: Lazy rehydration from session events. - if node_path not in self._state.runs: - self._rehydrate_from_events(curr_parent_ctx, node_path) - - # Check existing run and determine if fresh execution is needed. - child_ctx, run_completed = await self._check_existing_run( - curr_parent_ctx, - curr_node, - curr_name, - node_path, - curr_run_id, - curr_input, - use_as_output, - use_sub_branch, - override_branch, - override_isolation_scope=override_isolation_scope, - ) - - if not run_completed: - # Phase 3: Fresh execution. - logger.debug('node %s schedule: Fresh execution.', node_path) - child_ctx = await self._run_node_internal( - curr_parent_ctx, - curr_node, - curr_name, - node_path, - curr_run_id, - curr_input, - use_as_output, - is_fresh=True, - use_sub_branch=use_sub_branch, - override_branch=override_branch, - override_isolation_scope=override_isolation_scope, - ) - - logger.debug('node %s schedule end.', node_path) - - # Advance chronological sequence for this parent path and key - parent_path = curr_parent_ctx.node_path if curr_parent_ctx else '' - key = f'{curr_name}@{curr_run_id}' - if parent_path in self._parent_sequence_barriers: - self._parent_sequence_barriers[parent_path].check_and_advance(key) - - # Check for transfer_to_agent signal. - transfer_to_agent = ( - child_ctx.actions.transfer_to_agent if child_ctx else None - ) - if isinstance(transfer_to_agent, str): - target_name = transfer_to_agent - root_agent = getattr(curr_node, 'root_agent', None) - if not root_agent: - raise ValueError(f'Cannot find root_agent on node {curr_node.name}') - - # Local import to avoid runtime circular dependencies with Context - from .utils._transfer_utils import resolve_and_derive_transfer_context - - target_agent, next_parent_ctx = resolve_and_derive_transfer_context( - target_name=target_name, - current_agent=curr_node, - root_agent=root_agent, - curr_ctx=child_ctx, - curr_parent_ctx=curr_parent_ctx, - ) - if not target_agent: - raise ValueError(f"Transfer target agent '{target_name}' not found.") - if not next_parent_ctx: - available = [] - if hasattr(curr_node, '_get_available_agent_names'): - available = curr_node._get_available_agent_names() - available_str = ( - f"\nAvailable agents: {', '.join(available)}" if available else '' - ) - raise ValueError( - f"Cannot transfer from '{curr_name}' to unrelated agent" - f" '{target_name}'.{available_str}" - ) - curr_parent_ctx = next_parent_ctx - - # Set up parameters for next iteration. - curr_node = target_agent - curr_name = target_agent.name - - if not curr_parent_ctx: - raise AssertionError( - 'curr_parent_ctx cannot be None during active workflow execution' - ) - - curr_parent_ctx._child_run_counters[target_agent.name] = ( - curr_parent_ctx._child_run_counters.get(target_agent.name, 0) + 1 - ) - curr_run_id = str( - curr_parent_ctx._child_run_counters[target_agent.name] - ) - curr_input = None # Input for transfer target is usually empty. - - # Loop continues to execute the next agent - continue - - return child_ctx - - async def _check_existing_run( - self, - curr_parent_ctx: Context | None, - curr_node: BaseNode, - curr_name: str, - node_path: str, - curr_run_id: str, - curr_input: Any, - use_as_output: bool, - use_sub_branch: bool, - override_branch: str | None, - override_isolation_scope: str | None = None, - ) -> tuple[Context | None, bool]: - """Scan and process cached status for waiting or completed runs. - - Returns a tuple of (child_ctx, run_completed_flag). - """ - if node_path not in self._state.runs: - return None, False - - run = self._state.runs[node_path] - - # Deduplication of concurrent calls! - if run.task and not run.task.done(): - logger.debug('node %s schedule: Awaiting existing task.', node_path) - return await run.task, True - - if run.recovered_state: - recovered = run.recovered_state - unresolved = recovered.interrupt_ids - recovered.resolved_ids - if recovered.interrupt_ids and not unresolved: - if curr_node.wait_for_output and not curr_node.rerun_on_resume: - raise ValueError( - f'Node {node_path} is waiting for output but was called again' - ' with rerun_on_resume=False. This would cause it to' - ' auto-complete with empty output, which is likely a' - ' configuration error. Consider setting rerun_on_resume=True.' - ) - - # Delegate replay and same-turn interception check to ReplayInterceptor. - result = check_interception( - node_path=node_path, - node=curr_node, - recovered=run.recovered_state, - current_run=run, - curr_parent_ctx=curr_parent_ctx, - ) - - if not result.should_run: - if result.interrupts: - self._state.interrupt_ids.update(result.interrupts) - logger.debug( - 'node %s schedule: Unresolved interrupts remain.', node_path - ) - else: - logger.debug( - 'node %s schedule: Fast-forwarding completed execution.', node_path - ) - # Sync output and transfer decisions with the current run state. - run.output = result.output - run.transfer_to_agent = result.transfer_to_agent - - # Create a high-fidelity mock context with cached results. - mock_ctx = create_mock_context( - parent_ctx=curr_parent_ctx, - node=curr_node, - run_id=curr_run_id, - result=result, - ancestors=[], - node_path=node_path, - branch=(run.recovered_state.branch if run.recovered_state else None), - ) - - # Chronological sequence barrier wait for replayed dynamic nodes - parent_path = curr_parent_ctx.node_path if curr_parent_ctx else '' - key = f'{curr_name}@{curr_run_id}' - if parent_path in self._parent_sequence_barriers: - await self._parent_sequence_barriers[parent_path].wait(key) - - return mock_ctx, True - - else: - # Rerun! - run.state.resume_inputs = result.resume_inputs - logger.debug('node %s schedule: Rerunning execution.', node_path) - return ( - await self._run_node_internal( - curr_parent_ctx, - curr_node, - curr_name, - node_path, - curr_run_id, - curr_input, - use_as_output, - is_fresh=False, - use_sub_branch=use_sub_branch, - override_branch=override_branch, - override_isolation_scope=override_isolation_scope, - ), - True, - ) - - # --- Lazy scan --- - - def _rehydrate_from_events(self, ctx: Context, node_path: str) -> None: - """Scan session events for a dynamic node's prior state.""" - logger.debug('node %s rehydrate start.', node_path) - ic = ctx._invocation_context # pylint: disable=protected-access - - results = _reconstruct_node_states( - events=ic.session.events, - base_path=node_path, - group_by_direct_child=False, - invocation_id=ic.invocation_id, - ) - - target_state = results.get(node_path) - - if target_state: - self._state.runs[node_path] = DynamicNodeRun( - state=NodeState(run_id=target_state.run_id), - recovered_state=target_state, - ) - - logger.debug('node %s rehydrate end.', node_path) - - def _scan_parent_child_sequence( - self, ctx: Context, parent_path: str - ) -> list[str]: - """Scan historical events and extract direct dynamic child completion sequence.""" - ic = ctx._invocation_context - base_path_builder = _NodePathBuilder.from_string(parent_path) - sequence: list[str] = [] - - for event in ic.session.events: - if event.invocation_id != ic.invocation_id: - continue - event_node_path = event.node_info.path or '' - event_path_builder = _NodePathBuilder.from_string(event_node_path) - - if not event_path_builder.is_descendant_of(base_path_builder): - continue - - child_path = base_path_builder.get_direct_child(event_path_builder) - if event_path_builder != child_path: - continue - - segment = child_path.leaf_segment - - if is_terminal_event(event): - if segment in sequence: - sequence.remove(segment) - sequence.append(segment) - - return sequence - - # --- Execution --- - - async def _run_node_internal( - self, - ctx: Context, - node: BaseNode, - name: str, - node_path: str, - run_id: str, - node_input: Any, - use_as_output: bool, - is_fresh: bool, - use_sub_branch: bool = False, - override_branch: str | None = None, - override_isolation_scope: str | None = None, - ) -> Context: - """Unified runner for both fresh and resume executions.""" - if is_fresh: - state = NodeState( - status=NodeStatus.RUNNING, - input=node_input, - run_id=run_id, - parent_run_id=ctx.run_id, - ) - run = DynamicNodeRun(state=state) - self._state.runs[node_path] = run - resume_inputs = None - else: - run = self._state.runs[node_path] - run.state.status = NodeStatus.RUNNING - resume_inputs = ( - dict(run.state.resume_inputs) if run.state.resume_inputs else None - ) - - target_node = node.model_copy(update={'name': name}) - run.task = asyncio.create_task( - ctx._run_node_standalone( - target_node, - node_input=node_input, - use_as_output=use_as_output, - run_id=run_id, - use_sub_branch=use_sub_branch, - override_branch=override_branch, - override_isolation_scope=override_isolation_scope, - resume_inputs=resume_inputs, - ) - ) - try: - child_ctx = await run.task - except asyncio.CancelledError: - if node_path in self._state.runs: - del self._state.runs[node_path] - raise - self._record_result(run, child_ctx, node) - return child_ctx - - def _record_result( - self, - run: DynamicNodeRun, - child_ctx: Context, - node: BaseNode, - ) -> None: - """Update dynamic node state after execution.""" - state = run.state - if child_ctx.error: - state.status = NodeStatus.FAILED - elif child_ctx.interrupt_ids: - state.status = NodeStatus.WAITING - state.interrupts = list(child_ctx.interrupt_ids) - self._state.interrupt_ids.update(child_ctx.interrupt_ids) - elif child_ctx.actions.transfer_to_agent: - state.status = NodeStatus.COMPLETED - run.transfer_to_agent = child_ctx.actions.transfer_to_agent - elif node.wait_for_output and child_ctx.output is None: - state.status = NodeStatus.WAITING - else: - state.status = NodeStatus.COMPLETED - run.output = child_ctx.output diff --git a/src/google/adk/workflow/_errors.py b/src/google/adk/workflow/_errors.py deleted file mode 100644 index de2deaacb1..0000000000 --- a/src/google/adk/workflow/_errors.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -"""Errors raised by the workflow framework.""" - - -class NodeInterruptedError(BaseException): - """Internal: raised when a dynamic node interrupts (HITL). - - Used exclusively by ``ctx.run_node()`` to signal that the dynamic - child has unresolved interrupt IDs. The parent's NodeRunner catches - this and reads the interrupt IDs from the parent's ctx (set by - ``ctx.run_node()`` before raising). - - This is a ``BaseException`` so user code cannot accidentally catch - it with ``except Exception``. - - Internal to the framework — not part of the public API. - """ - - -class NodeTimeoutError(Exception): - """Raised when a node exceeds its configured timeout. - - This is a regular ``Exception`` (not ``BaseException``) so it is - compatible with ``retry_config`` — a timed-out node can be retried. - """ - - def __init__(self, *, node_name: str, timeout: float) -> None: - self.node_name = node_name - self.timeout = timeout - super().__init__(f"Node '{node_name}' timed out after {timeout} seconds.") - - -class DynamicNodeFailError(Exception): - """Raised when a dynamic node fails. - - Caught by the parent node's NodeRunner to propagate the error. - """ - - def __init__( - self, *, message: str, error: Exception, error_node_path: str - ) -> None: - self.error = error - self.error_node_path = error_node_path - super().__init__(message) diff --git a/src/google/adk/workflow/_function_node.py b/src/google/adk/workflow/_function_node.py deleted file mode 100644 index ceef483fdb..0000000000 --- a/src/google/adk/workflow/_function_node.py +++ /dev/null @@ -1,520 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import collections.abc -from collections.abc import AsyncGenerator -from collections.abc import Callable -import functools -import inspect -import logging -import typing -from typing import Any -from typing import cast -from typing import Literal -from typing import TYPE_CHECKING - -from google.genai import types -from pydantic import BaseModel -from pydantic import PrivateAttr -from pydantic import PydanticSchemaGenerationError -from pydantic import TypeAdapter -from typing_extensions import override - -from ..auth.auth_tool import AuthConfig -from ..events.event import Event -from ..events.request_input import RequestInput -from ._base_node import BaseNode -from ._retry_config import RetryConfig -from .utils._workflow_hitl_utils import create_auth_request_event -from .utils._workflow_hitl_utils import has_auth_credential -from .utils._workflow_hitl_utils import process_auth_resume - -logger = logging.getLogger('google_adk.' + __name__) - - -async def _sync_to_async_gen( - sync_gen: collections.abc.Generator[Any, None, None], -) -> AsyncGenerator[Any, None]: - """Wraps a synchronous generator as an async generator.""" - for item in sync_gen: - yield item - - -if TYPE_CHECKING: - from ..agents.context import Context - -# Output types that are framework control-flow items, not data schemas. -_PASSTHROUGH_OUTPUT_TYPES = (types.Content, Event, RequestInput) - -# Generator origins used for unwrapping yield types. -_GENERATOR_ORIGINS = ( - collections.abc.Generator, - collections.abc.AsyncGenerator, -) - - -def _unwrap_callable(func: Callable[..., Any]) -> Callable[..., Any]: - """Unwraps partials, bound methods and callable objects to find the stable underlying function.""" - while True: - if isinstance(func, functools.partial): - func = func.func - elif hasattr(func, '__func__'): # bound method - func = func.__func__ - elif ( - hasattr(func, '__call__') - and not inspect.isfunction(func) - and not inspect.ismethod(func) - ): - # callable object, unwrap to its __call__ method - func = func.__call__ - else: - break - return func - - -@functools.lru_cache(maxsize=1024) -def _get_type_hints_for_unwrapped(func: Callable[..., Any]) -> dict[str, Any]: - """Cached version of typing.get_type_hints.""" - try: - return typing.get_type_hints(func) - except (TypeError, NameError, AttributeError): - return {} - - -def _get_type_hints_cached(func: Callable[..., Any]) -> dict[str, Any]: - """Cached version of typing.get_type_hints with robust unwrapping.""" - unwrapped = _unwrap_callable(func) - return _get_type_hints_for_unwrapped(unwrapped) - - -def _content_to_str( - content: types.Content, func_name: str, param_name: str -) -> str: - """Extracts text from a Content object, warning on non-text parts.""" - texts = [] - for part in content.parts or []: - if part.text is not None: - texts.append(part.text) - elif part.inline_data or part.file_data or part.executable_code: - logger.warning( - 'Parameter "%s" of function "%s" expects str but received' - ' Content with non-text parts (e.g. inline_data, file_data).' - ' Non-text parts are dropped during auto-conversion.', - param_name, - func_name, - ) - return ''.join(texts) - - -def _expects_str(annotated_type: Any) -> bool: - """Returns True if the annotation is or contains ``str``.""" - if annotated_type is str: - return True - if typing.get_origin(annotated_type) is typing.Union: - return any(_expects_str(a) for a in typing.get_args(annotated_type)) - return False - - -class FunctionNode(BaseNode): - """A node that wraps a Python sync/async function or generator. - - Type coercions applied to function parameters (via ``TypeAdapter``): - - ``dict`` → ``BaseModel`` when the annotation is a Pydantic model. - - ``list[dict]`` → ``list[BaseModel]``, ``dict[K, dict]`` → - ``dict[K, BaseModel]``, etc. - - ``types.Content`` → ``str`` when the annotation expects ``str`` - (including ``Optional[str]`` / ``Union[str, ...]``). - - All other values are validated/coerced by Pydantic's ``TypeAdapter``. - """ - - auth_config: AuthConfig | None = None - """If set, the framework requests user authentication before running. - - When the node runs for the first time and no credential is found in - session state, it yields an ``adk_request_credential`` event and - interrupts. On resume, the credential is stored and the node - re-runs with the credential available via - ``AuthHandler(auth_config).get_auth_response(ctx.state)``. - """ - - parameter_binding: Literal['state', 'node_input'] = 'state' - """How function parameters are bound. - - ``'state'`` (default) binds parameters from ``ctx.state``. - ``'node_input'`` binds parameters from ``node_input`` dict and infers - ``input_schema`` / ``output_schema`` from the function signature - (used when the node acts as an agent's tool). - """ - - # Private attributes (won't be serialized) - _func: Callable[..., Any] = PrivateAttr() - _sig: inspect.Signature = PrivateAttr() - _type_hints: dict[str, Any] = PrivateAttr() - _type_adapters: dict[str, TypeAdapter] = PrivateAttr() - _context_param_name: str | None = PrivateAttr(default=None) - - def __init__( - self, - *, - func: Callable[..., Any], - name: str | None = None, - rerun_on_resume: bool = False, - retry_config: RetryConfig | None = None, - timeout: float | None = None, - auth_config: AuthConfig | None = None, - parameter_binding: Literal['state', 'node_input'] = 'state', - state_schema: type[BaseModel] | None = None, - ): - """Initializes FunctionNode. - - Args: - func: A sync/async function or sync/async generator function that forms - the node's logic. It can accept 'ctx: Context' and 'node_input: Any' as - arguments, depending on its signature. If the function is not a - generator, its return value will be wrapped in an Event, unless the - return value is None. - name: The name of the node. If None, it defaults to func.__name__. - rerun_on_resume: If True, the node will be rerun after being interrupted - and resumed. If False, the node will be marked as completed and the - resuming input will be treated as the node's output. - retry_config: If provided, the node will be retried on failure based on - this configuration. - timeout: Maximum time in seconds for this node to complete. - auth_config: If provided, the framework requests user authentication - before running the node. Requires rerun_on_resume=True (the node - must rerun after credentials are provided). - parameter_binding: How function parameters are bound. ``'state'`` - (default) binds parameters from ``ctx.state``. ``'node_input'`` - binds parameters from ``node_input`` dict and infers - ``input_schema`` / ``output_schema`` from the function signature - (used when the node acts as an agent's tool). - """ - - if not callable(func): - raise TypeError('Function must be callable.') - - if auth_config and not rerun_on_resume: - raise ValueError( - 'FunctionNode with auth_config requires rerun_on_resume=True.' - ' The node must rerun after credentials are provided.' - ) - - inferred_name = name or getattr(func, '__name__', None) - if not inferred_name: - raise ValueError( - 'FunctionNode must have a name. If the wrapped callable does not' - " have a '__name__' attribute, please provide a name explicitly." - ) - - super().__init__( - name=inferred_name, - description=inspect.getdoc(func) or '', - rerun_on_resume=rerun_on_resume, - retry_config=retry_config, - timeout=timeout, - auth_config=auth_config, - parameter_binding=parameter_binding, - state_schema=state_schema, - ) - - sig = inspect.signature(func) - type_hints = _get_type_hints_cached(func) - - # Detect the context parameter name (e.g. 'ctx', 'tool_context'). - from ..utils.context_utils import find_context_parameter - - self._context_param_name = find_context_parameter(func) or 'ctx' - - # Set private attributes - self._func = func - self._sig = sig - self._type_hints = type_hints - self._type_adapters = {} - for name, hint in type_hints.items(): - if name == 'return' or name == self._context_param_name: - continue - try: - self._type_adapters[name] = TypeAdapter(hint) - except (TypeError, PydanticSchemaGenerationError): - pass - - # Infer schemas based on the parameter binding mode. - if parameter_binding == 'node_input': - self._infer_schemas_from_func_signature(func) - else: - self._infer_schemas_for_state_mode(type_hints) - - def _infer_schemas_for_state_mode(self, type_hints: dict[str, Any]) -> None: - """Infers schemas from type hints in state binding mode. - - ``output_schema`` is inferred from the return type hint (unwrapping - generator types). ``input_schema`` is inferred from the ``node_input`` - parameter type hint. - """ - # Infer output_schema from the return type hint. - # For generators (Generator[T, ...] / AsyncGenerator[T, ...]), - # extract the yield type T as the schema. - return_hint = type_hints.get('return') - schema_hint = return_hint - - # Unwrap Generator[T, ...] / AsyncGenerator[T, ...] to T. - if return_hint is not None: - origin = typing.get_origin(return_hint) - if origin in _GENERATOR_ORIGINS: - args = typing.get_args(return_hint) - schema_hint = args[0] if args else None - - if ( - schema_hint is not None - and inspect.isclass(schema_hint) - and issubclass(schema_hint, BaseModel) - and not issubclass(schema_hint, _PASSTHROUGH_OUTPUT_TYPES) - ): - self.output_schema = schema_hint - - # Infer input_schema from node_input type hint. - input_hint = type_hints.get('node_input') - if ( - input_hint is not None - and inspect.isclass(input_hint) - and issubclass(input_hint, BaseModel) - ): - self.input_schema = input_hint - - def _infer_schemas_from_func_signature( - self, func: Callable[..., Any] - ) -> None: - """Infers input/output schema from the function signature. - - Used when ``parameter_binding='node_input'``. ``input_schema`` is - built from function parameters (excluding the context parameter), - ``output_schema`` from the return type hint. - """ - from ..tools._function_tool_declarations import _build_parameters_json_schema - from ..tools._function_tool_declarations import _build_response_json_schema - - ignore_params: list[str] = ( - [self._context_param_name] if self._context_param_name else [] - ) - self.input_schema = _build_parameters_json_schema( - func, ignore_params=ignore_params - ) - response_schema = _build_response_json_schema(func) - if response_schema is not None: - self.output_schema = response_schema - - def _bind_parameters(self, ctx: Context, node_input: Any) -> dict[str, Any]: - """Binds function parameters from the appropriate data source. - - In ``'node_input'`` mode, non-context parameters are looked up in the - ``node_input`` dict. In ``'state'`` mode, the ``node_input`` parameter - is passed through directly and all other non-context parameters are - looked up in ``ctx.state``. - """ - input_bound = self.parameter_binding == 'node_input' - if input_bound: - source = node_input if isinstance(node_input, dict) else {} - else: - source = ctx.state - source_name = 'node_input' if input_bound else 'state' - - kwargs: dict[str, Any] = {} - for param_name, param in self._sig.parameters.items(): - if param_name == self._context_param_name: - kwargs[param_name] = ctx - continue - - # In state mode, 'node_input' param is passed through directly. - if not input_bound and param_name == 'node_input': - value = node_input - if param_name in self._type_hints: - value = self._coerce_param( - param_name, - node_input, - self._type_hints[param_name], - ) - kwargs[param_name] = value - continue - - if param_name in source: - value = source[param_name] - if param_name in self._type_hints: - value = self._coerce_param( - param_name, - value, - self._type_hints[param_name], - ) - kwargs[param_name] = value - elif param.default is not inspect.Parameter.empty: - kwargs[param_name] = param.default - else: - raise ValueError( - f'Missing value for parameter "{param_name}" of function' - f' "{self.name}". It was not found in {source_name} and has no' - ' default value.' - ) - return kwargs - - def _to_event(self, ctx: Context, data: Any) -> Event | None: - """Converts a function return value to an Event. - - Pass-through types (returned as-is): Event, RequestInput. - None is returned as None (caller skips it) unless there are pending - state changes. - All other values are wrapped in an Event(output=...). - - State changes made via ``ctx.state`` during function execution are - captured in ``ctx.actions.state_delta`` and attached to the emitted - event so that they are persisted by the session service. - """ - state_delta = ( - dict(ctx.actions.state_delta) if ctx.actions.state_delta else None - ) - - if data is None: - if state_delta: - return Event(state=state_delta) - return None - - if isinstance(data, Event): - if data.output is not None: - data.output = self._validate_output_data(data.output) - if state_delta: - data.actions.state_delta.update(state_delta) - return data - if isinstance(data, RequestInput): - return data - if isinstance(data, types.Content): - return Event( - content=data, - state=state_delta, - ) - - if isinstance(data, BaseModel): - data = data.model_dump() - - data = self._validate_output_data(data) - - return Event( - output=data, - state=state_delta, - ) - - def _coerce_param( - self, - param_name: str, - value: Any, - annotated_type: Any, - ) -> Any: - """Coerces a parameter value to match its type annotation. - - Uses Pydantic's ``TypeAdapter`` for validation and coercion (handles - ``dict`` → ``BaseModel``, ``list[dict]`` → ``list[BaseModel]``, unions, - primitives, etc.). A special case converts ``types.Content`` → ``str`` - when the annotation expects ``str``. - - Args: - param_name: The name of the parameter (for error messages). - value: The value to coerce. - annotated_type: The type annotation of the parameter. - - Returns: - The coerced value. - """ - # Content → str auto-conversion (e.g. user content from START node). - if isinstance(value, types.Content) and _expects_str(annotated_type): - return _content_to_str(value, self.name, param_name) - adapter = self._type_adapters.get(param_name) - if adapter is None: - adapter = TypeAdapter(annotated_type) - return adapter.validate_python(value) - - @override - def model_copy( - self, *, update: dict[str, Any] | None = None, deep: bool = False - ) -> FunctionNode: - copied = cast(FunctionNode, super().model_copy(update=update, deep=deep)) - if not update or 'name' not in update: - return copied - - # If the wrapped function is a bound method of a Node, we need to clone - # the Node and re-bind the function to the new instance. - # This is needed if the function is referring to params like 'name' from the "self" reference. - # Like Workflow or LLM use that name for event node_paths or retreving session events. - func = self._func - if inspect.ismethod(func) and isinstance( - getattr(func, '__self__', None), BaseNode - ): - method_self = getattr(func, '__self__') - method_name = getattr(func, '__name__') - - # Pass the name update to the cloned agent instance if it's being passed - # to the FunctionNode (case for parallel workers). - agent_update = { - 'name': update['name'], - } - - new_obj = method_self.model_copy(update=agent_update) - copied._func = getattr(new_obj, method_name) - else: - copied._func = func - - copied._sig = self._sig - copied._type_hints = self._type_hints - copied._type_adapters = self._type_adapters - copied._context_param_name = self._context_param_name - return copied - - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - # --- Auth gate --- - if self.auth_config: - interrupt_id = f'wf_auth:{ctx.node_path}' - auth_response = ctx.resume_inputs.get(interrupt_id) - if auth_response is not None: - await process_auth_resume(auth_response, self.auth_config, ctx.state) - elif not has_auth_credential(self.auth_config, ctx.state): - yield create_auth_request_event(self.auth_config, interrupt_id) - return - - kwargs = self._bind_parameters(ctx, node_input) - - if inspect.isasyncgenfunction(self._func): - items = self._func(**kwargs) - elif inspect.isgeneratorfunction(self._func): - items = _sync_to_async_gen(self._func(**kwargs)) - else: - items = None - - if items is not None: - async for item in items: - event = self._to_event(ctx, item) - if event is not None: - yield event - else: - if inspect.iscoroutinefunction(self._func): - result = await self._func(**kwargs) - else: # Sync function - result = self._func(**kwargs) - - event = self._to_event(ctx, result) - if event is not None: - yield event diff --git a/src/google/adk/workflow/_graph.py b/src/google/adk/workflow/_graph.py deleted file mode 100644 index c7406152ef..0000000000 --- a/src/google/adk/workflow/_graph.py +++ /dev/null @@ -1,559 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Defines the graph and edges in the Workflow.""" - -from __future__ import annotations - -from collections import Counter -from collections.abc import Callable -from collections.abc import Set -from typing import Annotated -from typing import Any -from typing import get_args -from typing import Literal -from typing import TypeAlias - -from pydantic import BaseModel -from pydantic import ConfigDict -from pydantic import Field -from pydantic import PrivateAttr -from pydantic import SerializeAsAny - -from ..tools.base_tool import BaseTool -from ._base_node import BaseNode -from ._base_node import START - -RouteValue: TypeAlias = bool | int | str -"""Type alias for valid routing values used in conditional graph edges.""" - -NodeLike: TypeAlias = ( - BaseNode | BaseTool | Callable[..., Any] | Literal["START"] -) -"""Type alias for objects that can be converted to a workflow node.""" - -RoutingMap: TypeAlias = dict[RouteValue, NodeLike | tuple[NodeLike, ...]] -"""A mapping from route values to destination nodes. - -Syntactic sugar for declaring multiple routed edges from a single source. -Values can be a single node or a tuple of nodes (fan-out). - -Examples:: - - {"route_a": node_a, "route_b": node_b} - {"route_x": (node_a, node_b)} # fan-out: both triggered -""" - - -class Edge(BaseModel): - """An edge in the workflow graph.""" - - model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid") - - from_node: Annotated[BaseNode, SerializeAsAny()] - """The from node.""" - - to_node: Annotated[BaseNode, SerializeAsAny()] - """The to node.""" - - route: RouteValue | list[RouteValue] | None = Field( - description=( - "The route(s) that this edge is associated with." - " A single value or a list of values. The edge is followed when the" - " emitted route matches any value in the list." - ), - default=None, - ) - - -ChainElement: TypeAlias = NodeLike | tuple[NodeLike, ...] | RoutingMap -"""Type alias for an element in a workflow chain. - -Can be a single NodeLike, a tuple of NodeLike (fan-out), or a RoutingMap. -""" - -EdgeItem: TypeAlias = Edge | tuple[ChainElement, ...] -"""Type alias for an item that can be parsed into workflow edges. - -Can be an explicit Edge object, or a tuple representing a chain of elements. -""" -from .utils._workflow_graph_utils import build_node -from .utils._workflow_graph_utils import is_node_like - -DEFAULT_ROUTE = "__DEFAULT__" - - -def _expand_routing_map( - from_element: ChainElement, - routing_map: RoutingMap, -) -> list[tuple[ChainElement, NodeLike | tuple[NodeLike, ...], RouteValue]]: - """Expands a routing map into individual (from, to, route) triples. - - Args: - from_element: The source node(s). Can be a single NodeLike or a - tuple of NodeLike for fan-in. - routing_map: A dict mapping route values to destination nodes. - Values can be a single NodeLike or a tuple of NodeLike for - fan-out. - - Returns: - A list of (from_element, target, route) triples where target can - be a single NodeLike or a tuple for fan-out. - - Raises: - ValueError: If the routing map is empty, has non-RouteValue keys, - or has non-NodeLike values. - """ - if not routing_map: - raise ValueError( - "Routing map must not be empty. Provide at least one route -> node" - " mapping." - ) - - route_value_types = get_args(RouteValue) - expanded: list[ - tuple[ChainElement, NodeLike | tuple[NodeLike, ...], RouteValue] - ] = [] - - for route_key, target in routing_map.items(): - if not isinstance(route_key, route_value_types): - raise ValueError( - f"Invalid routing map key: {route_key!r} (type" - f" {type(route_key).__name__}). Keys must be RouteValue" - " (str, int, or bool)." - ) - if isinstance(target, tuple): - for node in target: - if not is_node_like(node): - raise ValueError( - f"Invalid node in fan-out tuple for route {route_key!r}:" - f" {node!r} (type {type(node).__name__})." - " Values must be NodeLike (BaseNode, BaseAgent, BaseTool," - " callable, or 'START')." - ) - elif not is_node_like(target): - raise ValueError( - f"Invalid routing map value for route {route_key!r}:" - f" {target!r} (type {type(target).__name__})." - " Values must be NodeLike (BaseNode, BaseAgent, BaseTool," - " callable, or 'START')." - ) - expanded.append((from_element, target, route_key)) - - return expanded - - -def _nodes_from_routing_map( - routing_map: RoutingMap, -) -> list[NodeLike]: - """Extracts all target nodes from a routing map, flattening fan-out tuples. - - Args: - routing_map: A dict mapping route values to destination nodes. - - Returns: - A flat list of all NodeLike targets referenced in the map. - """ - nodes: list[NodeLike] = [] - for target in routing_map.values(): - if isinstance(target, tuple): - nodes.extend(target) - else: - nodes.append(target) - return nodes - - -def _flatten_element( - element: NodeLike | tuple[NodeLike, ...] | RoutingMap, -) -> list[NodeLike]: - """Flattens a chain element into a list of individual nodes. - - - A single NodeLike is wrapped in a list. - - A tuple of NodeLike is converted to a list. - - A RoutingMap (dict) has its target nodes extracted and flattened. - """ - if isinstance(element, dict): - return _nodes_from_routing_map(element) - if isinstance(element, tuple): - return list(element) - return [element] - - -def _get_or_build_node( - node_like: NodeLike, node_map: dict[int, BaseNode] -) -> BaseNode: - """Gets a node from the map or builds it if not present.""" - if node_like == "START": - return START - - node_id = id(node_like) - if node_id in node_map: - return node_map[node_id] - - if isinstance(node_like, BaseNode): - wrapped = build_node(node_like) - if wrapped is not node_like: - node_map[node_id] = wrapped - return wrapped - return node_like - - node = build_node(node_like) - node_map[node_id] = node - return node - - -def _process_explicit_edge( - edge: Edge, node_map: dict[int, BaseNode], graph_edges: list[Edge] -) -> None: - """Processes an explicit Edge object.""" - graph_edges.append( - Edge( - from_node=_get_or_build_node(edge.from_node, node_map), - to_node=_get_or_build_node(edge.to_node, node_map), - route=edge.route, - ) - ) - - -def _process_chain( - chain: tuple[Any, ...], - node_map: dict[int, BaseNode], - graph_edges: list[Edge], -) -> None: - """Processes a chain of elements (tuple).""" - for i in range(len(chain) - 1): - from_el = chain[i] - to_el = chain[i + 1] - - if isinstance(to_el, dict): - _process_routing_map_edge(from_el, to_el, node_map, graph_edges) - else: - _process_unconditional_edge(from_el, to_el, node_map, graph_edges) - - -def _process_routing_map_edge( - from_el: Any, - to_el: RoutingMap, - node_map: dict[int, BaseNode], - graph_edges: list[Edge], -) -> None: - """Processes edges where the destination is a routing map.""" - if isinstance(from_el, dict): - raise ValueError( - "Consecutive routing maps are not allowed in a chain." - " Split them into separate edge items." - ) - - # A routing map (dict) in a chain behaves like a fan-out tuple - # but with conditioned incoming edges. - for exp_from, exp_to, route in _expand_routing_map(from_el, to_el): - for from_node in _flatten_element(exp_from): - for to_node in _flatten_element(exp_to): - graph_edges.append( - Edge( - from_node=_get_or_build_node(from_node, node_map), - to_node=_get_or_build_node(to_node, node_map), - route=route, - ) - ) - - -def _process_unconditional_edge( - from_el: Any, - to_el: Any, - node_map: dict[int, BaseNode], - graph_edges: list[Edge], -) -> None: - """Processes unconditional edges between elements.""" - # _flatten_element handles dicts (fan-in from routing map values) - # and tuples (fan-in/out). - for from_node in _flatten_element(from_el): - for to_node in _flatten_element(to_el): - graph_edges.append( - Edge( - from_node=_get_or_build_node(from_node, node_map), - to_node=_get_or_build_node(to_node, node_map), - route=None, - ) - ) - - -class Graph(BaseModel): - """A workflow graph.""" - - model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid") - - nodes: list[Annotated[BaseNode, SerializeAsAny()]] = Field( - default_factory=list - ) - """The nodes in the workflow graph.""" - - edges: list[Edge] = Field(default_factory=list) - """The edges in the workflow graph.""" - - _terminal_node_names: set[str] = PrivateAttr(default_factory=set) - """Nodes with no outgoing edges. Computed by validate_graph.""" - - @classmethod - def from_edge_items(cls, edge_items: list[EdgeItem]) -> Graph: - """Creates a Graph from a list of edge items.""" - node_map: dict[int, BaseNode] = {} - graph_edges: list[Edge] = [] - - for item in edge_items: - if isinstance(item, Edge): - _process_explicit_edge(item, node_map, graph_edges) - elif isinstance(item, tuple): - _process_chain(item, node_map, graph_edges) - else: - raise ValueError(f"Invalid edge type: {type(item)}") - - return Graph(edges=graph_edges) - - def model_post_init(self, context: Any) -> None: - """Populates nodes from edges.""" - if "nodes" in self.model_fields_set and self.nodes: - raise ValueError( - "Nodes are inferred from edges, do not set nodes explicitly." - ) - if self.edges: - # Use a dictionary to preserve order and deduplicate nodes by object id. - nodes = { - id(node): node - for edge in self.edges - for node in [edge.from_node, edge.to_node] - } - self.nodes = list(nodes.values()) - - def get_next_pending_nodes( - self, - node_name: str, - routes_to_match: RouteValue | list[RouteValue] | None, - ) -> list[str]: - """Determines the next nodes to transition to PENDING state based on routes.""" - next_pending_nodes: list[str] = [] - matched_specific_route = False - default_route_node: str | None = None - - for edge in self.edges: - if edge.from_node.name == node_name: - if edge.route is None: - # Edges with no route tag are always triggered. - next_pending_nodes.append(edge.to_node.name) - continue - - if edge.route == DEFAULT_ROUTE: - default_route_node = edge.to_node.name - continue - - # Normalize edge routes to a set for matching. - edge_routes = ( - set(edge.route) if isinstance(edge.route, list) else {edge.route} - ) - - edge_matched = False - if isinstance(routes_to_match, list): - if edge_routes & set(routes_to_match): - edge_matched = True - elif routes_to_match in edge_routes: - edge_matched = True - - if edge_matched: - next_pending_nodes.append(edge.to_node.name) - matched_specific_route = True - - if not matched_specific_route and default_route_node: - next_pending_nodes.append(default_route_node) - - return next_pending_nodes - - def _detect_unconditional_cycles(self, node_names: Set[str]) -> None: - """Detects unconditional cycles in the graph. - - Edges with route=None are always followed, so a cycle consisting - entirely of such edges would loop forever. Conditional edges - (with a route) are allowed to form cycles (loop patterns). - """ - unconditional_adj: dict[str, list[str]] = {name: [] for name in node_names} - for edge in self.edges: - if edge.route is None: - unconditional_adj[edge.from_node.name].append(edge.to_node.name) - - in_stack: set[str] = set() - done: set[str] = set() - - def _dfs(node: str, path: list[str]) -> None: - in_stack.add(node) - path.append(node) - for neighbor in unconditional_adj[node]: - if neighbor in in_stack: - cycle_start = path.index(neighbor) - cycle = path[cycle_start:] + [neighbor] - raise ValueError( - "Graph validation failed. Unconditional cycle detected:" - f" {' -> '.join(cycle)}. Cycles must include at" - " least one conditional (routed) edge to avoid" - " infinite loops." - ) - if neighbor not in done: - _dfs(neighbor, path) - path.pop() - in_stack.remove(node) - done.add(node) - - for name in node_names: - if name not in done: - _dfs(name, []) - - def _validate_duplicate_node_names(self) -> set[str]: - """Checks for duplicate node names.""" - names = [node.name for node in self.nodes] - duplicates = sorted( - name for name, count in Counter(names).items() if count > 1 - ) - - if duplicates: - raise ValueError( - "Graph validation failed. Duplicate node names found:" - f" {duplicates}. This means multiple distinct node objects" - " have the same name. If you intended to reuse the same node, ensure" - " you pass the exact same object instance. If you intended to have" - " distinct nodes, ensure they have unique names." - ) - return set(names) - - def _validate_start_node(self, node_names: set[str]) -> None: - """Checks for existence of START node.""" - if START.name not in node_names: - raise ValueError( - "Graph validation failed. START node (name: " - f"'{START.name}') not found in graph nodes." - ) - - def _validate_connectivity(self, node_names: set[str]) -> None: - """Checks connectivity and reachability from START.""" - to_nodes: set[str] = set() - adj: dict[str, set[str]] = {name: set() for name in node_names} - for edge in self.edges: - adj[edge.from_node.name].add(edge.to_node.name) - to_nodes.add(edge.to_node.name) - - reachable: set[str] = set() - stack = [START.name] - while stack: - node = stack.pop() - if node in reachable: - continue - reachable.add(node) - stack.extend(adj[node] - reachable) - - unreachable_nodes = node_names - reachable - if unreachable_nodes: - raise ValueError( - "Graph validation failed. The following nodes are unreachable" - f" from START: {sorted(unreachable_nodes)}" - ) - if START.name in to_nodes: - raise ValueError( - "Graph validation failed. START node must not have incoming edges." - ) - - def _validate_duplicate_edges(self) -> None: - """Checks for duplicate edges.""" - seen_edges = set() - for edge in self.edges: - edge_tuple = (edge.from_node.name, edge.to_node.name) - if edge_tuple in seen_edges: - raise ValueError( - "Graph validation failed. Duplicate edge found: from=" - f"{edge.from_node.name}, to={edge.to_node.name}" - ) - seen_edges.add(edge_tuple) - - def _validate_default_routes(self) -> None: - """Checks constraints on DEFAULT_ROUTE.""" - default_route_edges: dict[str, str] = {} - for edge in self.edges: - if isinstance(edge.route, list) and DEFAULT_ROUTE in edge.route: - raise ValueError( - "Graph validation failed. DEFAULT_ROUTE cannot be combined" - " with other routes in a list (edge from=" - f"{edge.from_node.name}, to={edge.to_node.name})." - " Use a separate edge for DEFAULT_ROUTE." - ) - if edge.route == DEFAULT_ROUTE: - from_node_name = edge.from_node.name - if from_node_name in default_route_edges: - raise ValueError( - "Graph validation failed. Multiple DEFAULT_ROUTE edges found" - f" from node {from_node_name} to" - f" {default_route_edges[from_node_name]} and" - f" {edge.to_node.name}" - ) - default_route_edges[from_node_name] = edge.to_node.name - - def _validate_static_schemas(self) -> None: - """Validates static schemas on edges.""" - for edge in self.edges: - from_node = edge.from_node - to_node = edge.to_node - if from_node.output_schema and to_node.input_schema: - if from_node.output_schema != to_node.input_schema: - raise ValueError( - "Graph validation failed. Schema mismatch on edge" - f" {from_node.name} -> {to_node.name}." - f" Output schema {from_node.output_schema} does not match" - f" input schema {to_node.input_schema}." - ) - - def _validate_chat_agent_wiring(self) -> None: - """Validates that chat-mode agents do not have incoming edges from non-START nodes.""" - from ..agents.llm_agent import LlmAgent - - for edge in self.edges: - to_node = edge.to_node - if ( - isinstance(to_node, LlmAgent) - and getattr(to_node, "mode", None) == "chat" - ): - if edge.from_node.name != START.name: - raise ValueError( - f"The agent '{to_node.name}' has been added to the workflow with" - f" mode='chat' following node '{edge.from_node.name}'. This is" - " not supported because chat-mode agents rely on conversational" - " history (session events) and cannot consume direct node inputs" - " from preceding nodes. Please change the agent's mode to" - " 'single_turn'" - ) - - def _compute_terminal_nodes(self) -> None: - """Computes terminal nodes (no outgoing edges).""" - from_names = {edge.from_node.name for edge in self.edges} - self._terminal_node_names = { - n.name - for n in self.nodes - if n.name != START.name and n.name not in from_names - } - - def validate_graph(self) -> None: - """Validates the workflow graph.""" - node_names = self._validate_duplicate_node_names() - self._validate_start_node(node_names) - self._validate_connectivity(node_names) - self._validate_duplicate_edges() - self._validate_default_routes() - self._detect_unconditional_cycles(node_names) - self._validate_static_schemas() - self._validate_chat_agent_wiring() - self._compute_terminal_nodes() diff --git a/src/google/adk/workflow/_join_node.py b/src/google/adk/workflow/_join_node.py deleted file mode 100644 index a8f203e95c..0000000000 --- a/src/google/adk/workflow/_join_node.py +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""JoinNode implementation for workflow orchestration.""" - -from __future__ import annotations - -from collections.abc import AsyncGenerator -import logging -from typing import Any - -from typing_extensions import override - -from ..agents.context import Context -from ..events.event import Event -from ._base_node import BaseNode - -logger = logging.getLogger('google_adk.' + __name__) - - -def _get_common_branch_prefix(branches: list[str]) -> str: - """Find the common prefix of dot-separated branch strings.""" - if not branches: - return '' - split_branches = [b.split('.') if b else [] for b in branches] - - common = [] - for segments in zip(*split_branches): - if len(set(segments)) == 1: - common.append(segments[0]) - else: - break - return '.'.join(common) - - -class JoinNode(BaseNode): - """A node that waits for all specified predecessors to trigger it before - outputting.""" - - @property - @override - def _requires_all_predecessors(self) -> bool: - return True - - @override - def _validate_input_data(self, data: Any) -> Any: - """Validates individual trigger inputs against input_schema.""" - if self.input_schema and isinstance(data, dict): - return { - k: self._validate_schema(v, self.input_schema) - for k, v in data.items() - } - return super()._validate_input_data(data) - - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - """JoinNode simply passes through the aggregated inputs provided by the orchestrator.""" - yield Event( - output=node_input, - branch=ctx._invocation_context.branch, - ) diff --git a/src/google/adk/workflow/_llm_agent_wrapper.py b/src/google/adk/workflow/_llm_agent_wrapper.py deleted file mode 100644 index 36a487b0e0..0000000000 --- a/src/google/adk/workflow/_llm_agent_wrapper.py +++ /dev/null @@ -1,445 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Utility functions for running LlmAgent as a workflow node.""" - -from __future__ import annotations - -from collections.abc import AsyncGenerator -from contextlib import aclosing -import json -from typing import Any -from typing import Optional - -from google.genai import types -from pydantic import BaseModel - -from ..agents.context import Context -from ..agents.llm.task._finish_task_tool import FINISH_TASK_SUCCESS_RESULT -from ..agents.llm.task._finish_task_tool import FINISH_TASK_TOOL_NAME as _FINISH_TASK_FC_NAME -from ..events.event import Event -from ..utils._schema_utils import validate_schema - - -def _extract_finish_task_fc(event: Event) -> Optional[types.FunctionCall]: - """Returns the finish_task FC in this event, or None.""" - for fc in event.get_function_calls(): - if fc.name == _FINISH_TASK_FC_NAME: - return fc - return None - - -def _is_finish_task_success_fr(event: Event) -> bool: - """True iff this event is the success FR from FinishTaskTool. - - A non-success FR (e.g., validation error) returns False so the - caller keeps iterating and the LLM gets a chance to retry. - """ - for fr in event.get_function_responses(): - if fr.name == _FINISH_TASK_FC_NAME: - response = fr.response or {} - return response.get('result') == FINISH_TASK_SUCCESS_RESULT - return False - - -def _extract_task_delegation_fcs( - event: Event, tools_dict: dict -) -> list[types.FunctionCall]: - """Return task-delegation FCs from this event. - - A task-delegation FC is one whose tool is a ``_TaskAgentTool`` instance. - """ - from ..tools.agent_tool import _TaskAgentTool - - return [ - fc - for fc in event.get_function_calls() - if fc.id - and fc.name in tools_dict - and isinstance(tools_dict[fc.name], _TaskAgentTool) - ] - - -def _find_unresolved_task_delegations( - session, owner: str, tools_dict: dict -) -> list[types.FunctionCall]: - """Walk session events; find task FCs from ``owner`` without matching FRs. - - Sequential dispatch means at most one - unresolved task delegation at a time, but we return a list so the - caller can iterate uniformly. - - We deliberately do NOT filter by isolation_scope. A chat - coordinator's conversation persists across user turns; each turn - produces a fresh ``wf:`` scope, so filtering by the - current turn's scope would hide the coordinator's own FC from a - prior turn. Author + tool-name filtering is sufficient. - """ - from ..tools.agent_tool import _TaskAgentTool - - fc_by_id: dict[str, types.FunctionCall] = {} - fr_ids: set[str] = set() - for event in session.events: - if event.author != owner and event.author != 'user': - continue - if not event.content or not event.content.parts: - continue - for part in event.content.parts: - fc = part.function_call - if ( - fc - and fc.id - and fc.name in tools_dict - and isinstance(tools_dict[fc.name], _TaskAgentTool) - ): - fc_by_id[fc.id] = fc - fr = part.function_response - if fr and fr.id: - fr_ids.add(fr.id) - return [fc for fc_id, fc in fc_by_id.items() if fc_id not in fr_ids] - - -def _find_finish_task_tool(agent: Any) -> Any: - """Return the FinishTaskTool instance attached to a task-mode agent.""" - for tool in getattr(agent, 'tools', []) or []: - if getattr(tool, 'name', None) == _FINISH_TASK_FC_NAME: - return tool - return None - - -def _safe_canonical_tools_dict(agent: Any) -> dict: - """Build a name→tool map from ``agent.tools``. - - Used by the chat wrapper to identify task-delegation FCs by tool - name without resolving the agent's full canonical-tools pipeline. - """ - out: dict = {} - for tool in getattr(agent, 'tools', []) or []: - name = getattr(tool, 'name', None) - if name: - out[name] = tool - return out - - -async def _dispatch_task_fc( - parent_agent: Any, fc: types.FunctionCall, ctx: Context -) -> Any: - """Dispatch a task-delegation FC via ``ctx.run_node`` and return the output. - - ``run_id=fc.id`` makes the child run idempotent across resumes (same - FC always maps to the same scheduler-tracked child run). Scope is - carried by ``isolation_scope`` (``override_isolation_scope=fc.id``); we - intentionally do NOT set a branch — task-mode and single_turn-mode - agents share the parent's branch and rely on isolation_scope for - scoping instead. - """ - target_agent = parent_agent.root_agent.find_agent(fc.name) - if target_agent is None: - raise ValueError(f'Task target agent {fc.name!r} not found.') - from .utils._workflow_graph_utils import build_node - - wrapped_target = build_node(target_agent) - wrapped_target.parent_agent = target_agent.parent_agent - return await ctx.run_node( - wrapped_target, - node_input=fc.args, - run_id=fc.id, - override_isolation_scope=fc.id, - raise_on_wait=True, - ) - - -def _synthesize_task_fr_event(fc: types.FunctionCall, output: Any) -> Event: - """Build the synthesized FR event for a completed task delegation. - - No isolation_scope is set on the event itself — ``NodeRunner._enrich_event`` - stamps it from the parent's ``ctx.isolation_scope`` (which is the - coordinator's scope or None for a root chat coordinator). This keeps - the FR visible to the parent and invisible to other task scopes. - """ - if isinstance(output, dict): - response = output - else: - response = {'output': output} - fr_part = types.Part( - function_response=types.FunctionResponse( - id=fc.id, - name=fc.name, - response=response, - ) - ) - return Event( - author='user', - content=types.Content(role='user', parts=[fr_part]), - ) - - -def _node_input_to_content(node_input: Any) -> types.Content: - """Converts node_input to a user Content for the LLM agent.""" - if isinstance(node_input, types.Content): - return types.Content(role='user', parts=node_input.parts) - if isinstance(node_input, str): - text = node_input - elif isinstance(node_input, BaseModel): - text = node_input.model_dump_json() - elif isinstance(node_input, (dict, list)): - text = json.dumps(node_input) - else: - text = str(node_input) - return types.Content(role='user', parts=[types.Part(text=text)]) - - -def prepare_llm_agent_context(agent: Any, ctx: Context) -> Context: - """Prepares the context for running LlmAgent as a node.""" - if agent.mode != 'single_turn': - return ctx - - ic = ctx._invocation_context.model_copy() - ic._event_queue = ctx._invocation_context._event_queue - agent_ctx = Context( - invocation_context=ic, - node_path=ctx.node_path, - run_id=ctx.run_id, - resume_inputs=ctx.resume_inputs, - ) - - ic.session = ic.session.model_copy(deep=False) - return agent_ctx - - -def prepare_llm_agent_input(agent: Any, ctx: Context, node_input: Any) -> None: - """Prepares the input for running LlmAgent as a node. - - For ``single_turn`` mode, append a user-role event with the input - directly to session.events (legacy behavior). - - For ``task`` mode, the input is the parent's task-delegation FC - args. Those are NOT appended here — the content-builder - transforms the originating FC event into a leading user-role - content at LLM-request time, so it appears as the first turn in - the task agent's view. When no originating FC exists (task agent - dispatched directly as a Workflow node), the wrapper instead - overrides ``ic.user_content`` so the content-builder can fall back - to that as the first user turn. - - No branch is set — task and single_turn agents scope via - ``isolation_scope`` rather than branch. - """ - if node_input is None or agent.mode != 'single_turn': - return - agent_input = _node_input_to_content(node_input) - user_event = Event(author='user', message=agent_input) - if user_event.content is not None: - user_event.content.role = 'user' - iso = getattr(ctx, 'isolation_scope', None) - if iso: - user_event.isolation_scope = iso - ctx.session.events.append(user_event) - - -def process_llm_agent_output(agent: Any, ctx: Context, event: Event) -> None: - """Processes the output of LlmAgent run as a node.""" - if ( - event.get_function_calls() - or event.partial - or not event.content - or event.content.role != 'model' - ): - return - - output = None - text = ( - ''.join(p.text for p in event.content.parts if p.text and not p.thought) - if event.content.parts - else '' - ) - if agent.output_schema: - if text.strip(): - output = validate_schema(agent.output_schema, text) - else: - output = None - else: - output = text - - if agent.output_key and output is not None: - ctx.actions.state_delta[agent.output_key] = output - - event.output = output - event.node_info.message_as_output = True - - -async def run_llm_agent_as_node( - agent: Any, - *, - ctx: Context, - node_input: Any, -) -> AsyncGenerator[Any, None]: - """Runs an LlmAgent as a workflow node.""" - # As a node in a workflow, agent is by default single_turn. - if agent.mode is None: - agent.mode = 'single_turn' - - if agent.mode not in ('task', 'single_turn', 'chat'): - raise ValueError( - f'LlmAgent as node only supports task, single_turn, and chat mode,' - f" but agent '{agent.name}' has mode='{agent.mode}'." - ) - - if agent.mode == 'single_turn': - agent.include_contents = 'none' - - agent_ctx = prepare_llm_agent_context(agent, ctx) - prepare_llm_agent_input(agent, agent_ctx, node_input) - - ic = agent_ctx.get_invocation_context() - update = {'agent': agent} - # thread the agent's isolation_scope into the - # InvocationContext so the content processor can filter session - # events to this agent's scope only. Only mode=task and - # mode=single_turn agents need scope-based filtering — chat agents - # see the full conversation. - _agent_iso = getattr(agent_ctx, 'isolation_scope', None) - if agent.mode in ('task', 'single_turn') and _agent_iso: - update['isolation_scope'] = _agent_iso - # Override ``user_content`` for task mode with this node's input. - # The content-builder uses it as the fallback first user turn when - # there is no originating delegation FC (the workflow-node task - # case). For delegated tasks, the FC takes precedence and this - # override is unused. - if agent.mode == 'task' and node_input is not None: - update['user_content'] = _node_input_to_content(node_input) - ic = ic.model_copy(update=update) - - from ..agents.live_request_queue import LiveRequestQueue - - # A single_turn LlmAgent in a live session runs in non-live mode - # and only consumes the node_input (ignoring the live request queue). - is_live = ( - isinstance(getattr(ic, 'live_request_queue', None), LiveRequestQueue) - and agent.mode != 'single_turn' - ) - - if agent.mode == 'single_turn': - # is_live is always False here (single_turn forces non-live). - async with aclosing(agent.run_async(ic)) as run_iter: - async for event in run_iter: - process_llm_agent_output(agent, ctx, event) - yield event - return - - if agent.mode == 'chat': - # outer dispatch loop. - # - # One coordinator invocation may contain multiple LLM rounds chained - # by task delegations. Example for sequential delegation: - # - # 1. (Optional) Pre-LLM scan: replay any unresolved task FCs from - # prior turns. Their dispatched sub-agents may complete or - # raise NodeInterruptedError (still WAITING). - # 2. Run parent.run_async: LLM emits a fresh task FC -> dispatch - # and synthesize FR. - # 3. Re-enter parent.run_async with the FR now in session: LLM - # may emit another task FC, a normal tool, or natural text. - # - # The previous implementation broke after the first dispatch in - # step 2, which prevented chained delegations from continuing - # within the same invocation. The outer ``while True`` loop fixes - # that by re-entering ``agent.run_async`` after every task FC - # dispatch, until the LLM returns without one. - tools_dict = _safe_canonical_tools_dict(agent) - - # Step 1 (only on the very first iteration of this invocation): - # pre-LLM scan for unresolved task FCs from prior runs. - pending = _find_unresolved_task_delegations( - ctx.session, - owner=agent.name, - tools_dict=tools_dict, - ) - for fc in pending: - output = await _dispatch_task_fc(agent, fc, ctx) - yield _synthesize_task_fr_event(fc, output) - - # Step 2: run parent.run_async; on every fresh task FC, dispatch - # and re-enter parent.run_async with the FR in session. - while True: - had_task_fc = False - transferred = False - run_method = agent.run_live(ic) if is_live else agent.run_async(ic) - async with aclosing(run_method) as run_iter: - async for event in run_iter: - yield event - task_fcs = _extract_task_delegation_fcs(event, tools_dict) - for fc in task_fcs: - output = await _dispatch_task_fc(agent, fc, ctx) - yield _synthesize_task_fr_event(fc, output) - if task_fcs: - had_task_fc = True - break # close this run_iter; outer loop re-enters - if event.actions.transfer_to_agent: - target_name = event.actions.transfer_to_agent - if target_name != agent.name: - from ..agents.llm_agent import LlmAgent - - if ( - isinstance(agent, LlmAgent) - and ctx._invocation_context.is_resumable - ): - ctx._invocation_context.set_agent_state( - agent.name, end_of_agent=True - ) - yield agent._create_agent_state_event(ctx._invocation_context) - transferred = True - break - if not had_task_fc or transferred: - # LLM finished without delegating (or transferred away); - # nothing more for this wrapper to do. - return - # Otherwise: loop back to re-enter agent.run_async so the LLM - # sees the synthesized FR(s) and can emit follow-up actions. - - # Task mode: sniff the finish_task FC, but wait for FinishTaskTool's - # FR before terminating. If validation fails (FR carries an - # ``error`` key), let the LLM see the error and retry on the next - # round. Only on a successful FR do we promote the FC's args as the - # task output and exit. - # - # The finish_task tool's declaration mirrors the agent's - # output_schema. For wrapped primitives (`int`, `str`, etc.) the - # value lives at the wrapper key; for object schemas it's at the - # top level of args. We extract via the FinishTaskTool's - # `_wrapper_key` when accessible, falling back to the full args. - finish_tool = _find_finish_task_tool(agent) - pending_fc_args: Optional[dict] = None - run_method = agent.run_live(ic) if is_live else agent.run_async(ic) - async with aclosing(run_method) as run_iter: - async for event in run_iter: - finish_fc = _extract_finish_task_fc(event) - if finish_fc is not None: - # Remember the latest FC's args; wait for FinishTaskTool's FR - # before terminating. If validation fails, the FR will NOT be - # the success message — the LLM sees the error and retries. - pending_fc_args = dict(finish_fc.args or {}) - yield event - continue - - if pending_fc_args is not None and _is_finish_task_success_fr(event): - wrapper_key = getattr(finish_tool, '_wrapper_key', None) - if wrapper_key and wrapper_key in pending_fc_args: - event.output = pending_fc_args[wrapper_key] - else: - event.output = pending_fc_args - yield event - return - - yield event diff --git a/src/google/adk/workflow/_node.py b/src/google/adk/workflow/_node.py deleted file mode 100644 index d5c99cd9b4..0000000000 --- a/src/google/adk/workflow/_node.py +++ /dev/null @@ -1,213 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""A wrapper class and @node decorator for creating workflow nodes.""" - -from __future__ import annotations - -from collections.abc import AsyncGenerator -from collections.abc import Callable -from typing import Any -from typing import overload -from typing import TYPE_CHECKING -from typing import TypeVar - -from pydantic import Field -from pydantic import PrivateAttr -from typing_extensions import override - -from . import _base_node as base_node -from . import _function_node as function_node -from . import _graph as definitions -from . import _parallel_worker as parallel_worker_lib -from ._retry_config import RetryConfig -from .utils import _workflow_graph_utils as workflow_graph_utils - -if TYPE_CHECKING: - from ..agents.context import Context - from ..auth.auth_tool import AuthConfig - -T = TypeVar("T", bound=Callable[..., Any]) - - -@overload -def node( - *, - name: str | None = None, - rerun_on_resume: bool | None = None, - retry_config: RetryConfig | None = None, - timeout: float | None = None, - parallel_worker: bool = False, - auth_config: AuthConfig | None = None, -) -> Callable[ - [T], function_node.FunctionNode | parallel_worker_lib._ParallelWorker -]: - ... - - -@overload -def node( - node_like: definitions.NodeLike, - *, - name: str | None = None, - rerun_on_resume: bool | None = None, - retry_config: RetryConfig | None = None, - timeout: float | None = None, - parallel_worker: bool = False, - auth_config: AuthConfig | None = None, -) -> base_node.BaseNode: - ... - - -def node( - node_like: definitions.NodeLike | None = None, - *, - name: str | None = None, - rerun_on_resume: bool | None = None, - retry_config: RetryConfig | None = None, - timeout: float | None = None, - parallel_worker: bool = False, - auth_config: AuthConfig | None = None, -) -> Any: - """Decorator or function to wrap a NodeLike in a node or override its properties. - - This can be used as a decorator on a function: - @node - async def my_func(): ... - - @node() - async def my_func2(): ... - - @node(name='my_node', rerun_on_resume=True) - async def my_func3(): ... - - Or as a function on a NodeLike: - my_node = node(my_func, name='other_name') - - Args: - node_like: The item to be wrapped as a node. Can be a BaseNode, BaseAgent, - BaseTool, or callable. - name: If provided, overrides the name of the wrapped node. - rerun_on_resume: If provided, overrides the rerun_on_resume property of the - wrapped node. - retry_config: If provided, overrides the retry_config property of the - wrapped node. - timeout: If provided, overrides the timeout property of the wrapped node. - parallel_worker: If True, wraps the node in a _ParallelWorker. - auth_config: If provided, the framework requests user authentication - before running the node. Requires rerun_on_resume=True. - - Returns: - If used as a decorator factory (@node() or @node(...)), returns a decorator. - If used as a decorator (@node) or function (node(node_like, ...)), returns - a BaseNode instance. - """ - - def wrapper( - func: T, - ) -> function_node.FunctionNode | parallel_worker_lib._ParallelWorker: - built_node = function_node.FunctionNode( - func=func, - name=name, - rerun_on_resume=rerun_on_resume - if rerun_on_resume is not None - else False, - retry_config=retry_config, - timeout=timeout, - auth_config=auth_config, - ) - if parallel_worker: - return parallel_worker_lib._ParallelWorker(node=built_node) - return built_node - - if node_like is None: - # If no node_like is provided, return a decorator factory. - return wrapper # type: ignore - else: - built_node = workflow_graph_utils.build_node( - node_like, - name=name, - rerun_on_resume=rerun_on_resume, - retry_config=retry_config, - timeout=timeout, - auth_config=auth_config, - ) - if parallel_worker: - return parallel_worker_lib._ParallelWorker(node=built_node) - return built_node - - -class Node(base_node.BaseNode): - """A node class designed for subclassing. - - Subclasses can directly benefit from advanced flags like parallel_worker - by implementing the run_node_impl() method. - """ - - parallel_worker: bool = Field(default=False, frozen=True) - _inner_node: base_node.BaseNode | None = PrivateAttr(default=None) - - def model_post_init(self, __context: Any) -> None: - super().model_post_init(__context) - if self.parallel_worker: - # If parallel_worker is True, we wrap a clone of the current node - # in a _ParallelWorker. We disable parallel_worker on the clone - # to avoid infinite recursion when its run() method is called. - # The cloned node preserves the class identity and behavior of the - # original (essential for LlmAgent and Workflow subclasses). - worker_node = self.model_copy(update={"parallel_worker": False}) - - inner = parallel_worker_lib._ParallelWorker(node=worker_node) - self._inner_node = inner - # Synchronize rerun_on_resume with the inner node. - self.rerun_on_resume = inner.rerun_on_resume - - @override - def model_copy( - self, *, update: dict[str, Any] | None = None, deep: bool = False - ) -> Any: - """Clones the node with updated fields.""" - copied = super().model_copy(update=update, deep=deep) - - if copied.parallel_worker: - worker_node = copied.model_copy(update={"parallel_worker": False}) - copied._inner_node = parallel_worker_lib._ParallelWorker(node=worker_node) - copied.rerun_on_resume = copied._inner_node.rerun_on_resume - - return copied - - async def run_node_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - """Implement this method when designing a child class that inherits from Node. - - Subclasses can directly benefit from advanced flags like parallel_worker - by providing their custom execution logic here. - """ - raise NotImplementedError("run_node_impl must be implemented.") - yield - - @override - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - """Dispatches to run_node_impl() or parallel_worker inner node.""" - if self.parallel_worker: - if self._inner_node is None: - raise ValueError("inner_node is not initialized for parallel worker.") - async for output in self._inner_node.run(ctx=ctx, node_input=node_input): - yield output - else: - async for output in self.run_node_impl(ctx=ctx, node_input=node_input): - yield output diff --git a/src/google/adk/workflow/_node_runner.py b/src/google/adk/workflow/_node_runner.py deleted file mode 100644 index daab91afc5..0000000000 --- a/src/google/adk/workflow/_node_runner.py +++ /dev/null @@ -1,411 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""NodeRunner — per-node executor class. - -Converts BaseNode.run() (async generator) into an awaitable that returns -the child Context with output, route, and interrupt_ids set. Used -internally by orchestrators (Workflow, SingleLlmAgentReactNode, etc.). - -User-facing ctx.run_node() wraps this and returns just ctx.output. -""" - -from __future__ import annotations - -import asyncio -import logging -from typing import Any -from typing import TYPE_CHECKING - -from ..events._node_path_builder import _NodePathBuilder -from ..telemetry import node_tracing - -if TYPE_CHECKING: - from ..agents.context import Context - from ..events.event import Event - from ._base_node import BaseNode - - -logger = logging.getLogger("google_adk." + __name__) - - -class NodeRunner: - """Per-node executor. Drives BaseNode.run(), enriches events. - - Creates child Context, iterates node.run(), enqueues events to - ic.event_queue, writes output/route/interrupt_ids to ctx, and - returns the child Context. - """ - - def __init__( - self, - *, - node: BaseNode, - parent_ctx: Context, - run_id: str | None = None, - # Output delegation (use_as_output) - use_as_output: bool = False, - # Resume state from a previous run - prior_output: Any = None, - prior_interrupt_ids: set[str] | None = None, - use_sub_branch: bool = False, - override_branch: str | None = None, - override_isolation_scope: str | None = None, - ) -> None: - """Initialize a NodeRunner. - - Args: - node: The BaseNode to execute. - parent_ctx: The parent node's Context. - run_id: Unique ID for this run. Should be a sequential - counter string ("1", "2", …) unique per node path. - Falls back to "1" if not provided. - - use_as_output: If True, this node's output also represents the parent - node's output. - prior_output: Output from a previous run, carried - forward on resume when the node had both output and - interrupts. - prior_interrupt_ids: Unresolved interrupt IDs (set) from a - previous run, carried forward on resume. - use_sub_branch: Whether the node should use a sub-branch. - override_branch: Optional branch to use instead of parent's branch. - """ - # Core - self._node = node - self._parent_ctx = parent_ctx - - self._run_id = str(run_id) if run_id else "1" - self._use_sub_branch = use_sub_branch - self._override_branch = override_branch - self._override_isolation_scope = override_isolation_scope - - # Output delegation - self._use_as_output = use_as_output - - # Resume state - self._prior_output = prior_output - self._prior_interrupt_ids = prior_interrupt_ids - - @property - def run_id(self) -> str: - """The run ID assigned to this node run.""" - return self._run_id - - async def run( - self, - node_input: Any = None, - *, - resume_inputs: dict[str, Any] | None = None, - ) -> Context: - """Drive node.run(), enqueue events, return child Context. - - The caller reads ctx.output, ctx.route, and ctx.interrupt_ids - for the node's results. - """ - attempt_count = 1 - while True: - ctx = self._create_child_context( - resume_inputs, attempt_count=attempt_count - ) - logger.debug("node %s started.", ctx.node_path) - try: - # Start the span within try-except block to record exceptions on the span - async with node_tracing.start_as_current_node_span( - self._parent_ctx, self._node - ) as telemetry_context: - ctx._telemetry_context = telemetry_context - await self._execute_node(ctx, node_input) - await self._flush_output_and_deltas(ctx) - logger.debug("node %s end.", ctx.node_path) - return ctx - except Exception as e: - from ._errors import DynamicNodeFailError - - if isinstance(e, DynamicNodeFailError): - # TODO: consider to retry upon dynamic node failures later. This may - # require thorough design to consider a workflow dynamic node and a - # normal node. - ctx._error = e.error - ctx._error_node_path = e.error_node_path - logger.debug("node %s end.", ctx.node_path) - return ctx - - from ..events.event import Event - - logger.exception("Node execution failed with exception") - error_event = Event( - error_code=type(e).__name__, - error_message=str(e), - ) - await self._enqueue_event(error_event, ctx) - - if not await self._attempt_retry(e, ctx, attempt_count): - ctx._error = e - ctx._error_node_path = ctx.node_path - logger.debug("node %s end.", ctx.node_path) - return ctx - logger.warning( - "Node %s failed and is being retried locally. Note: retry count is" - " not persisted across resuming.", - self._node.name, - ) - attempt_count += 1 - - async def _attempt_retry( - self, e: Exception, ctx: Context, attempt_count: int - ) -> bool: - """Checks if node should retry and sleeps if so.""" - from ._node_state import NodeState - from .utils._retry_utils import _get_retry_delay - from .utils._retry_utils import _should_retry_node - - node_state = NodeState(attempt_count=attempt_count) - - if not _should_retry_node(e, self._node.retry_config, node_state): - return False - - delay = _get_retry_delay(self._node.retry_config, node_state) - - await asyncio.sleep(delay) - return True - - def _create_child_context( - self, - resume_inputs: dict[str, Any] | None, - attempt_count: int = 1, - ) -> Context: - """Create a child Context for the node, inheriting from parent. - - If prior_output or prior_interrupt_ids were provided at - construction (resume scenario), pre-populates ctx with state - from the previous run. - """ - from ..agents.context import Context - - ic = self._parent_ctx._invocation_context - base_branch = ( - self._override_branch - if self._override_branch is not None - else ic.branch - ) - - if self._use_sub_branch: - segment = f"{self._node.name}@{self._run_id}" - branch = f"{base_branch}.{segment}" if base_branch else segment - ic = ic.model_copy(update={"branch": branch}) - elif self._override_branch is not None: - ic = ic.model_copy(update={"branch": self._override_branch}) - - ctx = Context( - ic, - parent_ctx=self._parent_ctx, - node=self._node, - run_id=self._run_id, - resume_inputs=resume_inputs, - use_as_output=self._use_as_output, - attempt_count=attempt_count, - ) - - # override the inherited isolation_scope when explicitly set. - if self._override_isolation_scope is not None: - ctx.isolation_scope = self._override_isolation_scope - - # Carry forward state from a previous run (resume scenario). - if self._prior_output is not None: - ctx._output_value = self._prior_output - ctx._output_emitted = True - if self._prior_interrupt_ids: - ctx._interrupt_ids.update(self._prior_interrupt_ids) - - return ctx - - async def _execute_node( - self, - ctx: Context, - node_input: Any, - ) -> None: - """Iterate node.run(), enqueue events, write results to ctx.""" - from ._errors import NodeInterruptedError - from ._errors import NodeTimeoutError - - try: - timeout = self._node.timeout - if timeout is not None: - await self._run_node_loop_with_timeout(ctx, node_input, timeout) - else: - await self._run_node_loop(ctx, node_input) - except NodeInterruptedError: - # A dynamic child interrupted via ctx.run_node(). - # The child's interrupt_ids are already on ctx - # (set by the schedule callback). Nothing more to do — - # the caller reads ctx.interrupt_ids. - pass - - async def _run_node_loop(self, ctx: Context, node_input: Any) -> None: - """Iterate node.run(), track events in context, and enqueue them.""" - from ..utils.context_utils import Aclosing - - logger.debug("node %s execute loop start.", ctx.node_path) - async with Aclosing(self._node.run(ctx=ctx, node_input=node_input)) as agen: - async for event in agen: - self._track_event_in_context(event, ctx) - await self._enqueue_event(event, ctx) - - logger.debug("node %s execute loop end.", ctx.node_path) - - async def _run_node_loop_with_timeout( - self, ctx: Context, node_input: Any, timeout: float - ) -> None: - try: - await asyncio.wait_for( - self._run_node_loop(ctx, node_input), timeout=timeout - ) - except asyncio.TimeoutError as e: - from ._errors import NodeTimeoutError - - raise NodeTimeoutError(node_name=self._node.name, timeout=timeout) from e - - def _track_event_in_context(self, event: Event, ctx: Context) -> None: - """Write yielded event results to ctx (source of truth).""" - if event.output is not None: - ctx.output = event.output - elif event.node_info and event.node_info.message_as_output: - ctx.output = event.content - if event.long_running_tool_ids is not None: - ctx._interrupt_ids.update(event.long_running_tool_ids) - # Only propagate decisions from native events (authored by this node or unspecified). - # This prevents structured parent nodes (e.g. SequentialAgent) from intercepting - # and bubbling up actions already handled internally by their nested sub-agents. - is_native_node_event = not event.author or event.author == self._node.name - if event.actions and is_native_node_event: - if event.actions.route is not None: - ctx.route = event.actions.route - ctx._route_emitted = True - if event.actions.transfer_to_agent is not None: - ctx.actions.transfer_to_agent = event.actions.transfer_to_agent - - ctx.telemetry_context.add_event(event) - - # Validate state_delta if schema is present - if ( - event.actions - and event.actions.state_delta - and ctx.state._schema is not None - ): - from ..sessions.state import _validate_state_entry - - for key, value in event.actions.state_delta.items(): - _validate_state_entry(ctx.state._schema, key, value) - - async def _enqueue_event(self, event: Event, ctx: Context) -> None: - """Enrich and enqueue event to the session. - - Skips enqueueing if output is delegated via use_as_output — - the child already emitted it. Pending deltas stay in ctx for - _flush_output_and_deltas. - """ - if event.output is not None and ctx._output_delegated: - return - - self._enrich_event(event, ctx) - if not event.partial: - self._flush_deltas(event, ctx) - await ctx._invocation_context._enqueue_event(event) - - if event.output is not None: - ctx._output_emitted = True - if event.node_info.message_as_output: - ctx._output_delegated = True - - async def _flush_output_and_deltas(self, ctx: Context) -> None: - """Emit deferred output and/or unflushed state/artifact deltas.""" - from ..events.event import Event - from ..events.event_actions import EventActions - - state_delta = ctx.actions.state_delta - artifact_delta = ctx.actions.artifact_delta - has_deferred_output = ( - ctx._output_value is not None - and not ctx._output_emitted - and not ctx._output_delegated - ) - has_unflushed_route = ( - ctx._route_value is not None and not ctx._route_emitted - ) - has_deltas = bool(state_delta or artifact_delta) - - if not has_deferred_output and not has_deltas and not has_unflushed_route: - return - - # Build the event — output + route + deltas, or a subset. - event = Event( - output=ctx._output_value if has_deferred_output else None, - route=ctx._route_value if has_unflushed_route else None, - ) - if has_deltas: - event.actions = EventActions( - state_delta=dict(state_delta), - artifact_delta=dict(artifact_delta), - ) - state_delta.clear() - artifact_delta.clear() - - self._enrich_event(event, ctx) - await ctx._invocation_context._enqueue_event(event) - if has_deferred_output: - ctx._output_emitted = True - if has_unflushed_route: - ctx._route_emitted = True - - def _flush_deltas(self, event: Event, ctx: Context) -> None: - """Move pending state/artifact deltas from ctx onto the event. - - TODO: Handle non-persisted states (e.g. `temp:` prefixed keys) - that should flow through ctx but not be written to session events. - """ - from ..events.event_actions import EventActions - - state_delta = ctx.actions.state_delta - artifact_delta = ctx.actions.artifact_delta - if not state_delta and not artifact_delta: - return - - if not event.actions: - event.actions = EventActions() - if state_delta: - event.actions.state_delta.update(state_delta) - state_delta.clear() - if artifact_delta: - event.actions.artifact_delta.update(artifact_delta) - artifact_delta.clear() - - def _enrich_event(self, event: Event, ctx: Context) -> None: - """Set author, node_info, invocation_id on the event.""" - # TODO: revisit after we settle Event.author logic for content/message. - event.author = ctx.event_author or self._node.name - event.invocation_id = ctx._invocation_context.invocation_id - event.node_info.path = ctx.node_path - if event.branch is None: - event.branch = ctx._invocation_context.branch - elif event.branch == "": - event.branch = None - ctx._invocation_context.branch = None - else: - ctx._invocation_context.branch = event.branch - if event.output is not None: - event.node_info.output_for = [ctx.node_path] + ctx._output_for_ancestors - # stamp the scope tag. - if event.isolation_scope is None and ctx.isolation_scope is not None: - event.isolation_scope = ctx.isolation_scope diff --git a/src/google/adk/workflow/_node_state.py b/src/google/adk/workflow/_node_state.py deleted file mode 100644 index 86b36e948a..0000000000 --- a/src/google/adk/workflow/_node_state.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Per-node execution state.""" - -from __future__ import annotations - -from typing import Any - -from pydantic import BaseModel -from pydantic import ConfigDict -from pydantic import Field - -from ._node_status import NodeStatus - - -class NodeState(BaseModel): - """State of a node in the workflow.""" - - model_config = ConfigDict(extra='ignore', ser_json_bytes='base64') - - status: NodeStatus = NodeStatus.INACTIVE - """The run status of the node.""" - - input: Any = None - """The input provided to the node.""" - - attempt_count: int = Field(default=1, exclude_if=lambda v: v == 1) - """The attempt count for this node run (1-based).""" - - interrupts: list[str] = Field(default_factory=list) - """The interrupt ids that are pending to be resolved.""" - - resume_inputs: dict[str, Any] = Field(default_factory=dict) - """The responses for resuming the node, keyed by interrupt id.""" - - run_counter: int = Field(default=0, exclude_if=lambda v: v == 0) - """Sequential counter incremented each time the node gets a fresh run. - - Preserving this count independently of run_id prevents path collisions - if a node switches between custom string IDs and auto-generated numeric IDs. - """ - - run_id: str | None = None - """The run ID of this node run.""" - - parent_run_id: str | None = None - """The run ID of the parent node which dynamically - scheduled this node run.""" diff --git a/src/google/adk/workflow/_node_status.py b/src/google/adk/workflow/_node_status.py deleted file mode 100644 index 4d85d3123e..0000000000 --- a/src/google/adk/workflow/_node_status.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Node execution status enum.""" - -from __future__ import annotations - -from enum import Enum - - -class NodeStatus(Enum): - """The status of a node in the workflow graph.""" - - INACTIVE = 0 - """The node is not ready to be executed.""" - - PENDING = 1 - """The node is ready to be executed.""" - - RUNNING = 2 - """The node is being executed.""" - - COMPLETED = 3 - """The node has been executed successfully.""" - - WAITING = 4 - """The node is waiting (e.g. for a user response or re-trigger).""" - - FAILED = 5 - """The node has failed.""" - - CANCELLED = 6 - """The node has been cancelled.""" diff --git a/src/google/adk/workflow/_parallel_worker.py b/src/google/adk/workflow/_parallel_worker.py deleted file mode 100644 index a277b85ec4..0000000000 --- a/src/google/adk/workflow/_parallel_worker.py +++ /dev/null @@ -1,131 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Parallel worker node for workflows.""" - -from __future__ import annotations - -import asyncio -from collections.abc import AsyncGenerator -from typing import Any - -from pydantic import ConfigDict -from pydantic import Field -from pydantic import PrivateAttr -from typing_extensions import override - -from ..agents.context import Context -from ._base_node import BaseNode -from ._graph import NodeLike -from ._retry_config import RetryConfig -from .utils._workflow_graph_utils import build_node - - -class _ParallelWorker(BaseNode): - """A node that runs a wrapped node in parallel for each item in the input list. - - Attributes: - max_concurrency: The maximum number of parallel tasks to run. If None, there - is no limit on concurrency. - """ - - model_config = ConfigDict(arbitrary_types_allowed=True) - - max_concurrency: int | None = Field(default=None) - - _node: BaseNode = PrivateAttr() - - def __init__( - self, - *, - node: NodeLike, - max_concurrency: int | None = None, - retry_config: RetryConfig | None = None, - timeout: float | None = None, - ): - if node == 'START': - raise ValueError('ParallelWorker cannot wrap a START node.') - built_node = build_node(node) - super().__init__( - name=built_node.name, - rerun_on_resume=True, - retry_config=retry_config, - timeout=timeout, - ) - self._node = built_node - self.max_concurrency = max_concurrency - - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - if not isinstance(node_input, list): - # Wrap the single input in a list to allow processing. - # This handles cases where the input is a single item. - node_input = [node_input] - - if not node_input: - yield [] - return - - results = [None] * len(node_input) - pending_tasks: set[asyncio.Task[Any]] = set() - input_index = 0 - - while input_index < len(node_input) or pending_tasks: - # Check for any inputs waiting to be processed. - while input_index < len(node_input) and ( - self.max_concurrency is None - or len(pending_tasks) < self.max_concurrency - ): - item = node_input[input_index] - task = asyncio.create_task( - ctx.run_node( - self._node, - node_input=item, - use_sub_branch=True, - ) - ) - # Store index on task so we can place result correctly when done - setattr(task, '_worker_index', input_index) - pending_tasks.add(task) - input_index += 1 - - # If there are pending tasks, wait for first one to complete. - # We only wait for the first one, because after it completes, we want - # to check if any new items are waiting to be processed. - if pending_tasks: - done, pending = await asyncio.wait( - pending_tasks, return_when=asyncio.FIRST_COMPLETED - ) - for task in done: - exc = task.exception() - if exc is not None: - # If a task failed, cancel all other pending tasks. - for p_task in pending: - p_task.cancel() - # Wait for all pending tasks to be cancelled - if pending: - await asyncio.wait(pending) - # Raise the exception from the failed task - raise exc - - index = getattr(task, '_worker_index') - results[index] = task.result() - pending_tasks = pending - - yield results diff --git a/src/google/adk/workflow/_retry_config.py b/src/google/adk/workflow/_retry_config.py deleted file mode 100644 index d19c87524d..0000000000 --- a/src/google/adk/workflow/_retry_config.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Configuration for retrying a workflow node.""" - -from __future__ import annotations - -from typing import Any - -from pydantic import BaseModel -from pydantic import Field -from pydantic import field_validator - - -class RetryConfig(BaseModel): - """Configuration for retrying a node.""" - - max_attempts: int | None = Field( - default=None, - description="""Maximum number of attempts, including the original request. - If 0 or 1, it means no retries. If not specified, default to 5.""", - ) - initial_delay: float | None = Field( - default=None, - description="""Initial delay before the first retry, in fractions of a second. If not specified, default to 1.0 second.""", - ) - max_delay: float | None = Field( - default=None, - description="""Maximum delay between retries, in fractions of a second. If not specified, default to 60.0 seconds.""", - ) - backoff_factor: float | None = Field( - default=None, - description="""Multiplier by which the delay increases after each attempt. If not specified, default to 2.0.""", - ) - jitter: float | None = Field( - default=None, - description="""Randomness factor for the delay. If not specified, default to 1.0. Otherwise use 0.0 to remove randomness.""", - ) - - exceptions: list[str | type[BaseException]] | None = Field( - default=None, - description="""Exceptions to retry on. Accepts exception class names as - strings (e.g. ``['ValueError']``) or exception classes directly (e.g. - ``[ValueError]``). ``None`` means retry on all exceptions.""", - ) - - @field_validator('exceptions', mode='before') - @classmethod - def _normalize_exceptions(cls, v: list[Any] | None) -> list[str] | None: - """Converts exception classes to their class names for uniform handling.""" - if v is None: - return None - normalized = [] - for item in v: - if isinstance(item, str): - normalized.append(item) - elif isinstance(item, type) and issubclass(item, BaseException): - normalized.append(item.__name__) - else: - raise ValueError( - 'exceptions must contain exception class names (str) or' - f' exception classes, got {type(item).__name__}: {item!r}' - ) - return normalized diff --git a/src/google/adk/workflow/_schedule_dynamic_node.py b/src/google/adk/workflow/_schedule_dynamic_node.py deleted file mode 100644 index 8ce3a4ea5d..0000000000 --- a/src/google/adk/workflow/_schedule_dynamic_node.py +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Internal protocol for scheduling dynamic nodes with full result.""" - -from __future__ import annotations - -from collections.abc import Awaitable -from typing import Any -from typing import Protocol -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from ..agents.context import Context - - -class ScheduleDynamicNode(Protocol): - """Protocol for scheduling a dynamic node. - - Implementations handle the lifecycle of dynamically scheduled nodes (e.g., - via `ctx.run_node()`). This includes: - 1. Fresh Execution: Running a node for the first time. - 2. Deduplication: Returning cached output if the node already completed in a - prior turn (based on event history). - 3. Resumption: Rehydrating state from session events when execution is - resumed after an interrupt, and resolving or propagating remaining - interrupts. - - Args: - ctx: The calling node's Context. - node: The node to execute. Usually a subclass of `BaseNode`. - node_input: Input data for the node. Must match the node's input schema if - defined. - node_name: Deterministic tracking name. If None, uses `node.name`. This is - critical for matching events on resume. - use_as_output: If True, the child node's output will replace the calling - node's output. - run_id: A unique ID for this specific execution of the node. - use_sub_branch: Whether the node should execute in an isolated sub-branch - to prevent message history pollution. - override_branch: Optional specific branch name to use, overriding defaults. - - Returns: - Awaitable[Context]: A future that resolves to the child node's Context, - which will contain the output, routing information, and any active - interrupt IDs. - - Raises: - ValueError: If input validation fails or if the node configuration is - invalid on resume (e.g., waiting for output but called with - `rerun_on_resume=False`). - RuntimeError: If the execution reaches an inconsistent state. - """ - - def __call__( - self, - ctx: Context, - node: Any, - node_input: Any, - *, - node_name: str | None = None, - use_as_output: bool = False, - run_id: str, - use_sub_branch: bool = False, - override_branch: str | None = None, - override_isolation_scope: str | None = None, - ) -> Awaitable[Context]: - ... diff --git a/src/google/adk/workflow/_tool_node.py b/src/google/adk/workflow/_tool_node.py deleted file mode 100644 index fad28bb714..0000000000 --- a/src/google/adk/workflow/_tool_node.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -"""A node that wraps an ADK Tool.""" - -from collections.abc import AsyncGenerator -from typing import Any -import uuid - -from pydantic import ConfigDict -from pydantic import Field -from typing_extensions import override - -from ..agents.context import Context -from ..events.event import Event -from ..tools.base_tool import BaseTool -from ..tools.tool_context import ToolContext -from ._base_node import BaseNode -from ._retry_config import RetryConfig - - -class _ToolNode(BaseNode): - """A node that wraps an ADK Tool.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - tool: BaseTool = Field(...) - - def __init__( - self, - *, - tool: BaseTool, - name: str | None = None, - retry_config: RetryConfig | None = None, - timeout: float | None = None, - ): - super().__init__( - tool=tool, - name=name or tool.name, - rerun_on_resume=False, - retry_config=retry_config, - timeout=timeout, - ) - - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - tool_context = ToolContext( - invocation_context=ctx.get_invocation_context(), - function_call_id=str(uuid.uuid4()), - ) - - args = node_input - if args is None: - args = {} - elif not isinstance(args, dict): - raise TypeError( - 'The input to ToolNode must be a dictionary of tool arguments or' - f' None, but got {type(args)}.' - ) - - response = await self.tool.run_async(args=args, tool_context=tool_context) - state_delta = ( - dict(tool_context.actions.state_delta) - if tool_context.actions.state_delta - else None - ) - if response is not None: - yield Event( - output=response, - state=state_delta, - ) - elif state_delta: - yield Event(state=state_delta) diff --git a/src/google/adk/workflow/_trigger.py b/src/google/adk/workflow/_trigger.py deleted file mode 100644 index 3239ebf331..0000000000 --- a/src/google/adk/workflow/_trigger.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Trigger data model.""" - -from __future__ import annotations - -from typing import Any - -from pydantic import BaseModel -from pydantic import ConfigDict - - -class Trigger(BaseModel): - """Represents a trigger for a downstream node.""" - - model_config = ConfigDict(ser_json_bytes='base64') - - input: Any = None - """The input to pass to the triggered node.""" - - use_sub_branch: bool = False - """Whether this trigger should use a sub-branch.""" - - branch: str | None = None - """The branch inherited from the predecessor node.""" - - isolation_scope: str | None = None - """Scope tag explicitly propagated to this trigger.""" diff --git a/src/google/adk/workflow/_workflow.py b/src/google/adk/workflow/_workflow.py deleted file mode 100644 index 83aa43204d..0000000000 --- a/src/google/adk/workflow/_workflow.py +++ /dev/null @@ -1,875 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""New Workflow implementation — BaseNode with graph orchestration. - -Combines user-facing graph definition with the execution engine. -Workflow(BaseNode) with _run_impl() as the orchestration loop. -""" - -from __future__ import annotations - -import asyncio -from collections.abc import AsyncGenerator -from dataclasses import dataclass -from dataclasses import field -import logging -from typing import Any -from typing import TYPE_CHECKING - -from pydantic import Field - -from ._base_node import BaseNode -from ._base_node import START -from ._dynamic_node_scheduler import DynamicNodeScheduler -from ._dynamic_node_scheduler import DynamicNodeState -from ._graph import EdgeItem -from ._graph import Graph -from ._graph import RouteValue -from ._node_runner import NodeRunner -from ._node_state import NodeState -from ._node_status import NodeStatus -from ._trigger import Trigger -from .utils._rehydration_utils import _ChildScanState -from .utils._rehydration_utils import _reconstruct_node_states -from .utils._rehydration_utils import _unwrap_response -from .utils._rehydration_utils import is_terminal_event -from .utils._replay_interceptor import check_interception -from .utils._replay_interceptor import create_mock_context -from .utils._replay_sequence_barrier import ReplaySequenceBarrier - -if TYPE_CHECKING: - from ..agents.context import Context - from ._schedule_dynamic_node import ScheduleDynamicNode - -logger = logging.getLogger('google_adk.' + __name__) - - -def get_common_branch_prefix(branches: list[str]) -> str: - """Find the common prefix of dot-separated branch strings.""" - if not branches: - return '' - split_branches = [b.split('.') if b else [] for b in branches] - - common = [] - for segments in zip(*split_branches): - if len(set(segments)) == 1: - common.append(segments[0]) - else: - break - return '.'.join(common) - - -# --------------------------------------------------------------------------- -# Loop state (mutable, not persisted) -# --------------------------------------------------------------------------- - - -@dataclass(kw_only=True) -class _LoopState(DynamicNodeState): - """Mutable, in-memory state for one Workflow execution. - - Extends ``DynamicNodeState`` (which provides dynamic_nodes, - dynamic_outputs, dynamic_pending_tasks, interrupt_ids) with - graph-specific fields for static nodes and triggers. - - Scoped to a single _run_impl invocation. Not persisted — - static node state is reconstructed from session events on - resume; dynamic node state is lazily scanned on demand. - Discarded when _run_impl returns. - """ - - # --- Static graph nodes (keyed by node name) --- - - nodes: dict[str, NodeState] = field(default_factory=dict) - """Static node states.""" - - recovered_executions: dict[str, _ChildScanState] = field(default_factory=dict) - """Raw node states reconstructed from session events, keyed by node_name@run_id.""" - - sequence_barrier: ReplaySequenceBarrier | None = None - """Chronological sequence barrier to ensure deterministic replay ordering.""" - - error_shut_down: bool = False - """Flag indicating that the workflow is shutting down due to an error.""" - - node_outputs: dict[str, Any] = field(default_factory=dict) - """Cached static node outputs.""" - - node_branches: dict[str, str] = field(default_factory=dict) - """Cached static node branches.""" - - pending_tasks: dict[str, asyncio.Task[Context]] = field(default_factory=dict) - """Running static node tasks.""" - - trigger_buffer: dict[str, list[Trigger]] = field(default_factory=dict) - """Queued triggers waiting to be dispatched, keyed by target node name. - - Producers: - - _seed_start_triggers: initial triggers for START successors - - _buffer_downstream_triggers: when a node completes, triggers - its downstream successors - - _process_resume: seeds triggers for PENDING nodes on resume - - Consumer: - - _schedule_ready_nodes: pops triggers, creates NodeRunners, - moves nodes to RUNNING - """ - - schedule_dynamic_node: ScheduleDynamicNode | None = None - """Closure that handles ctx.run_node() calls from child nodes. - - Tracks dynamic nodes in this Workflow's loop state - (dynamic_nodes, dynamic_outputs, dynamic_pending_tasks). - Handles dedup (cached output), resume (lazy scan + re-run), - and fresh execution. - - Set on ctx at Workflow setup, propagated down to descendants - via NodeRunner until a nested orchestration node overrides it. - """ - - -# --------------------------------------------------------------------------- -# Workflow -# --------------------------------------------------------------------------- - - -class Workflow(BaseNode): - """A graph-based workflow node. - - _run_impl() IS the graph orchestration loop: - - SETUP: build graph, seed triggers - - LOOP: schedule ready nodes via NodeRunner, handle completions - - FINALIZE: collect terminal outputs - """ - - rerun_on_resume: bool = Field(default=True) - - edges: list[EdgeItem] = Field( - description='Edges to build the workflow graph.', - default_factory=list, - ) - - max_concurrency: int | None = None - """Maximum parallel graph-scheduled nodes. None means unlimited. - - Only applies to nodes triggered by graph edges. Dynamic nodes - (via ctx.run_node()) are excluded — they are awaited inline by - their parent and throttling them would cause deadlock. - """ - - graph: Graph | None = Field( - description='The compiled workflow graph.', - default=None, - ) - - # --- Construction --- - - def model_post_init(self, context: Any) -> None: - super().model_post_init(context) - if self.edges and self.graph is None: - self.graph = self._build_graph() - self._validate_state_schema() - self._validate_no_task_mode_graph_nodes() - - def _build_graph(self) -> Graph: - """Convert edge definitions to a validated Graph.""" - graph = Graph.from_edge_items(self.edges) - graph.validate_graph() - return graph - - def _validate_no_task_mode_graph_nodes(self) -> None: - """Reject ``mode='task'`` LlmAgents that appear as static graph nodes. - - Task-mode agents are multi-turn — they pause for user replies and - expect the original ``node_input`` (the task brief) to remain visible - across re-dispatches. The workflow scheduler currently overwrites - ``node_input`` with the latest user message on every re-entry, so the - task brief is lost and the agent loses context. Until the scheduler - preserves the originating ``node_input`` on resume, task agents may - only be used: - - * as chat sub-agents of an LlmAgent coordinator (FC delegation - via ``_TaskAgentTool`` / ``_dispatch_task_fc``), or - * dispatched dynamically via ``ctx.run_node`` from a custom - function node — never as static workflow graph nodes. - """ - if not self.graph: - return - from ..agents.llm_agent import LlmAgent - - for graph_node in self.graph.nodes: - if isinstance(graph_node, LlmAgent) and graph_node.mode == 'task': - raise ValueError( - f"Agent {graph_node.name!r} has mode='task' and cannot be " - 'used as a workflow graph node. Use a chat coordinator with ' - 'task sub-agents, or dispatch dynamically via ctx.run_node ' - 'from a function node.' - ) - - def _validate_state_schema(self) -> None: - """Raises when FunctionNode params don't match state_schema fields.""" - if not self.state_schema or not self.graph: - return - - from ..sessions.state import StateSchemaError - from ._function_node import FunctionNode - - schema_fields = set(self.state_schema.model_fields.keys()) - - for graph_node in self.graph.nodes: - if not isinstance(graph_node, FunctionNode): - continue - - for param_name in graph_node._sig.parameters: - if param_name in ('ctx', 'node_input', 'self'): - continue - - if param_name not in schema_fields: - raise StateSchemaError( - f'FunctionNode {graph_node.name!r} parameter ' - f'{param_name!r} is not declared in state_schema ' - f'{self.state_schema.__name__!r}. Declared fields: ' - f'{sorted(schema_fields)}' - ) - - # --- _run_impl: the orchestration loop --- - - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - """Orchestration loop: SETUP -> LOOP -> FINALIZE.""" - if self.graph is None: - return - - # Set event_author so child events are attributed to this workflow. - ctx.event_author = self.name - - # --- SETUP: resume from events or start fresh --- - # TODO: resume from checkpoint event. - loop_state = _LoopState() - loop_state.recovered_executions, recovered_sequence = ( - self._scan_child_events(ctx) - ) - loop_state.sequence_barrier = ReplaySequenceBarrier(recovered_sequence) - - if ctx.resume_inputs and not loop_state.recovered_executions: - logger.warning( - 'Workflow %s: resume_inputs provided but no recovered executions' - ' found.', - self.name, - ) - - self._seed_start_triggers(loop_state, node_input) - - # Create closure for dynamic node scheduling - loop_state.schedule_dynamic_node = self._make_schedule_dynamic_node( - loop_state - ) - ctx._workflow_scheduler = loop_state.schedule_dynamic_node - - # --- LOOP --- - try: - await self._run_loop(loop_state, ctx) - finally: - await self._cleanup_all_tasks(loop_state) - - if loop_state.error_shut_down: - return - - # Collect remaining interrupts from WAITING nodes - self._collect_remaining_interrupts(loop_state) - - # --- FINALIZE --- - # Terminal node output already has output_for including this - # workflow's path. Mark output as delegated so the workflow's - # NodeRunner skips creating a duplicate output event. - if self._has_terminal_output(loop_state): - ctx._output_delegated = True - self._finalize(loop_state, ctx) - return - yield # required to keep _run_impl as async generator - - # --- LOOP --- - - async def _run_loop(self, loop_state: _LoopState, ctx: Context) -> None: - """Schedule and execute nodes until no more work.""" - logger.debug('node %s execute loop start.', ctx.node_path) - - recovered_sequence_indices = { - node_path: i - for i, node_path in enumerate( - loop_state.sequence_barrier.sequence - if loop_state.sequence_barrier - else [] - ) - } - - while True: - self._schedule_ready_nodes(loop_state, ctx) - - if not loop_state.pending_tasks: - break - - done, _ = await asyncio.wait( - loop_state.pending_tasks.values(), - return_when=asyncio.FIRST_COMPLETED, - ) - - # To ensure deterministic processing order even for fresh executions, - # first order the done tasks by their insertion order in pending_tasks. - # Since pending_tasks is a dict, its values() preserve the exact order - # in which the tasks were originally scheduled. - ordered_done = [ - task for task in loop_state.pending_tasks.values() if task in done - ] - - task_to_name = { - task: name for name, task in loop_state.pending_tasks.items() - } - - # Sort done tasks by their order in recovered_sequence to ensure - # processing order matches history. - # This is needed because python asyncio.wait returns a set of completed - # tasks (done) when multiple tasks finish at the same time, which loses - # the order in which the original pending tasks were enqueued. - # Tasks not found in the sequence (e.g., new executions) will be placed - # at the end, preserving their original insertion order due to Python's - # stable sort. - def get_recovered_sequence_index(t): - name = task_to_name.get(t) - if not name: - return float('inf') - node_state = loop_state.nodes.get(name) - if not node_state: - return float('inf') - node_path = f'{name}@{node_state.run_id}' - return recovered_sequence_indices.get(node_path, float('inf')) - - sorted_done = sorted(ordered_done, key=get_recovered_sequence_index) - - for task in sorted_done: - name = self._pop_completed_task(loop_state, task) - - node = self._get_static_node_by_name(name) - child_ctx: Context = task.result() - if loop_state.sequence_barrier: - loop_state.sequence_barrier.check_and_advance( - f'{name}@{child_ctx.run_id}' - ) - - if child_ctx.error: - node_state = loop_state.nodes[name] - node_state.status = NodeStatus.FAILED - - ctx._error = child_ctx.error - ctx._error_node_path = child_ctx.error_node_path - - loop_state.error_shut_down = True - logger.debug('node %s execute loop end.', ctx.node_path) - return - - self._handle_completion(loop_state, name, node, child_ctx) - - # Await fire-and-forget dynamic tasks. - # TODO: Handle dynamic task failures and interrupts here. - # Currently, dynamic node completion is handled inline in the - # _schedule_dynamic_node_callback closure. But failures are not caught. - dynamic_tasks = loop_state.get_dynamic_tasks() - if dynamic_tasks: - await asyncio.wait(dynamic_tasks) - logger.debug('node %s execute loop end.', ctx.node_path) - - # --- Scheduling --- - - def _seed_start_triggers( - self, - loop_state: _LoopState, - node_input: Any, - ) -> None: - """Seed triggers for START's direct successors.""" - assert self.graph is not None - - start_edges = [ - e for e in self.graph.edges if e.from_node.name == START.name - ] - use_sub_branch = len(start_edges) > 1 - for edge in start_edges: - loop_state.trigger_buffer.setdefault(edge.to_node.name, []).append( - Trigger( - input=node_input, - use_sub_branch=use_sub_branch, - ) - ) - - def _schedule_ready_nodes(self, loop_state: _LoopState, ctx: Context) -> None: - """Pop triggers from buffer and schedule ready nodes.""" - # loop_state.trigger_buffer is a dict, and Python 3.7+ dicts preserve insertion order. - # Therefore, nodes are processed strictly in the order their triggers arrived, - # ensuring deterministic scheduling order for parallel branches. - for node_name in list(loop_state.trigger_buffer.keys()): - if node_name in loop_state.pending_tasks: - continue - node_state = loop_state.nodes.get(node_name) - if node_state: - # Serialize executions of the same node to prevent race conditions. - # If a node is already RUNNING, or WAITING for user input (interrupts), - # we skip dequeuing new triggers for it until it completes its current turn. - if node_state.status == NodeStatus.RUNNING: - continue - # We only skip WAITING nodes if they have unresolved interrupts (waiting for user). - # If they are WAITING because of wait_for_output=True but produced no output yet, - # they should still process new triggers to accumulate state. - if node_state.status == NodeStatus.WAITING and node_state.interrupts: - continue - - if self._at_concurrency_limit(loop_state): - break - - trigger = self._pop_trigger(loop_state, node_name) - if trigger is None: - continue - - self._prepare_node_state_for_starting(loop_state, node_name, trigger) - self._start_node_task(loop_state, ctx, node_name, trigger) - - def _at_concurrency_limit(self, loop_state: _LoopState) -> bool: - """Check if max_concurrency has been reached.""" - return ( - bool(self.max_concurrency) - and len(loop_state.pending_tasks) >= self.max_concurrency - ) - - def _pop_trigger( - self, loop_state: _LoopState, node_name: str - ) -> Trigger | None: - """Pop the next trigger for a node, or None if empty.""" - buffer = loop_state.trigger_buffer.get(node_name, []) - if not buffer: - return None - trigger = buffer.pop(0) - if not buffer: - del loop_state.trigger_buffer[node_name] - return trigger - - @staticmethod - def _next_run_id(node_state: NodeState) -> str: - """Increment and return the next sequential run_id for a node.""" - node_state.run_counter += 1 - return str(node_state.run_counter) - - @staticmethod - def _compute_isolation_scope_for_node( - node: BaseNode, - trigger: Trigger, - parent_ctx: Context | None, - run_id: str, - ) -> str | None: - """Decide the isolation_scope for a node about to run. - - Order of precedence: - 1. Explicit ``trigger.isolation_scope`` — set by the resume path - (``loop_state.recovered_executions[key].isolation_scope``) so a - resumed run continues in its original scope. - 2. Task-mode LlmAgent node — gets the task agent's full node_path - (``/@``) as its scope so its - multi-turn conversation is isolated from peer workflow nodes. - The full path (not just ``@``) is required so - scopes stay unique across nested workflows or re-used node - names in different graph positions. - 3. Otherwise unscoped — workflow nodes share the workflow's - conversation view by default. - - Note: FC-driven task delegations (chat coordinator → task agent - via ``ctx.run_node``) take a different path and set - ``override_isolation_scope=fc.id`` directly on the NodeRunner. - """ - if trigger.isolation_scope is not None: - return trigger.isolation_scope - if getattr(node, 'mode', None) == 'task': - parent_path = parent_ctx.node_path if parent_ctx else '' - segment = f'{node.name}@{run_id}' - return f'{parent_path}/{segment}' if parent_path else segment - return None - - @classmethod - def _create_node_state_for_new_run(cls, old_state: NodeState) -> NodeState: - """Create a fresh NodeState for a new run, preserving the run counter.""" - return NodeState(run_counter=old_state.run_counter) - - def _prepare_node_state_for_starting( - self, loop_state: _LoopState, node_name: str, trigger: Trigger - ) -> None: - """Prepare NodeState for starting a node. - - This method determines whether to reuse or recreate the node's state: - * Creates a brand new `NodeState` if none exists. - * Creates a fresh `NodeState` (preserving `run_counter`) if this is a new execution - (not resuming and not waiting) to avoid state carryover. - * Reuses the existing `NodeState` if resuming from interrupt or waiting for inputs. - - Outcome: The node's state is updated with the trigger's input and source, - and its status is set to `RUNNING`. - """ - if node_name not in loop_state.nodes: - node_state = NodeState() - loop_state.nodes[node_name] = node_state - else: - node_state = loop_state.nodes[node_name] - # Create a new NodeState for a fresh execution to avoid carryover bugs. - node_state = self._create_node_state_for_new_run(node_state) - loop_state.nodes[node_name] = node_state - - node_state.input = trigger.input - node_state.status = NodeStatus.RUNNING - - def _start_node_task( - self, - loop_state: _LoopState, - ctx: Context, - node_name: str, - trigger: Trigger, - ) -> None: - """Create NodeRunner and start asyncio task for a node.""" - from ..agents.context import Context - - assert self.graph is not None - - node = self._get_static_node_by_name(node_name) - is_terminal = node_name in self.graph._terminal_node_names - - node_state = loop_state.nodes[node_name] - # Reuse run_id on resume; assign a new sequential id for fresh runs. - run_id = node_state.run_id - if not run_id: - run_id = self._next_run_id(node_state) - node_state.run_id = run_id - - # Intercept execution based on historical session events. - key = f'{node_name}@{run_id}' - if key in loop_state.recovered_executions: - recovered = loop_state.recovered_executions[key] - - result = check_interception( - node_path=f'{ctx.node_path}/{node_name}@{run_id}', - node=node, - recovered=recovered, - curr_parent_ctx=ctx, - ) - - if not result.should_run: - is_terminal = node_name in self.graph._terminal_node_names - ancestor_path = ctx.node_path if is_terminal else None - - if ancestor_path: - ancestors = [ancestor_path] + list(ctx._output_for_ancestors or []) - else: - ancestors = list(ctx._output_for_ancestors or []) - - mock_ctx = create_mock_context( - parent_ctx=ctx, - node=node, - run_id=run_id, - result=result, - ancestors=ancestors, - branch=recovered.branch, - ) - - async def return_ctx(): - if loop_state.sequence_barrier: - await loop_state.sequence_barrier.wait(key) - return mock_ctx - - loop_state.pending_tasks[node_name] = asyncio.create_task(return_ctx()) - return - - node_state.resume_inputs = result.resume_inputs or {} - - # when re-running a node from replay, prefer the - # recovered isolation_scope so the resumed run continues in its - # original scope (rather than computing a fresh wf:). - if ( - key in loop_state.recovered_executions - and loop_state.recovered_executions[key].isolation_scope - and trigger.isolation_scope is None - ): - trigger.isolation_scope = loop_state.recovered_executions[ - key - ].isolation_scope - - runner = NodeRunner( - node=node, - parent_ctx=ctx, - run_id=run_id, - use_as_output=is_terminal, - use_sub_branch=trigger.use_sub_branch, - override_branch=trigger.branch, - override_isolation_scope=self._compute_isolation_scope_for_node( - node, trigger, ctx, run_id - ), - ) - resume_inputs = ( - dict(node_state.resume_inputs) if node_state.resume_inputs else None - ) - loop_state.pending_tasks[node_name] = asyncio.create_task( - runner.run(node_input=trigger.input, resume_inputs=resume_inputs) - ) - - def _make_schedule_dynamic_node( - self, loop_state: _LoopState - ) -> ScheduleDynamicNode: - """Create a DynamicNodeScheduler for this Workflow's loop state.""" - return DynamicNodeScheduler(state=loop_state) - - # --- Completion handling --- - - def _handle_completion( - self, - loop_state: _LoopState, - node_name: str, - node: BaseNode, - child_ctx: Context, - ) -> None: - """Update state and trigger downstream after node completes.""" - node_state = loop_state.nodes[node_name] - - if child_ctx.interrupt_ids: - node_state.status = NodeStatus.WAITING - node_state.interrupts = list(child_ctx.interrupt_ids) - loop_state.interrupt_ids.update(child_ctx.interrupt_ids) - return - - if node.wait_for_output and child_ctx.output is None: - node_state.status = NodeStatus.WAITING - return - - node_state.status = NodeStatus.COMPLETED - if node_state.resume_inputs: - node_state.resume_inputs.clear() - if child_ctx.output is not None: - loop_state.node_outputs[node_name] = child_ctx.output - loop_state.node_branches[node_name] = ( - child_ctx._invocation_context.branch or '' - ) - - # Buffer downstream triggers. - self._buffer_downstream_triggers( - loop_state, - node_name, - child_ctx.output, - child_ctx.route, - child_ctx._invocation_context.branch, - ) - - def _buffer_downstream_triggers( - self, - loop_state: _LoopState, - node_name: str, - output: Any, - route: Any, - branch: str | None = None, - ) -> None: - """Find downstream edges and add triggers to the buffer.""" - assert self.graph is not None - next_nodes = self.graph.get_next_pending_nodes( - node_name=node_name, - routes_to_match=route, - ) - use_sub_branch = len(next_nodes) > 1 - for target_name in next_nodes: - target_node = self._get_static_node_by_name(target_name) - target_state = loop_state.nodes.get(target_name) - - if target_node._requires_all_predecessors: - # Wait for all predecessors - predecessors = { - e.from_node.name - for e in self.graph.edges - if e.to_node.name == target_name - } - if all( - loop_state.nodes.get(p) - and loop_state.nodes[p].status == NodeStatus.COMPLETED - for p in predecessors - ): - # All predecessors have completed! - outputs = {p: loop_state.node_outputs.get(p) for p in predecessors} - branches = [loop_state.node_branches.get(p, '') for p in predecessors] - common_branch = get_common_branch_prefix(branches) - - loop_state.trigger_buffer.setdefault(target_name, []).append( - Trigger( - input=outputs, - use_sub_branch=False, - branch=common_branch, - ) - ) - else: - # Normal node logic - loop_state.trigger_buffer.setdefault(target_name, []).append( - Trigger( - input=output, - use_sub_branch=use_sub_branch, - branch=branch, - ) - ) - - def _collect_remaining_interrupts(self, loop_state: _LoopState) -> None: - """Gather interrupt_ids from nodes still WAITING after the loop.""" - for node_state in loop_state.nodes.values(): - if node_state.status == NodeStatus.WAITING and node_state.interrupts: - loop_state.interrupt_ids.update(node_state.interrupts) - - # --- Resume --- - - def _scan_child_events( - self, ctx: Context - ) -> tuple[dict[str, _ChildScanState], list[str]]: - """Scan session events and collect per-child state and completion sequence. - - Forward pass through events for this invocation. For each direct - child, tracks the latest run_id and accumulates output, - interrupt IDs, and resolved interrupt IDs. - - Returns: - Tuple of: - - dict of child_name → _ChildScanState. - - list of child_name@run_id in chronological order of completion. - """ - ic = ctx._invocation_context - raw_results = _reconstruct_node_states( - events=ic.session.events, - base_path=ctx.node_path, - group_by_direct_child=True, - invocation_id=ic.invocation_id, - ) - - from ..events._node_path_builder import _NodePathBuilder - - # Build chronological sequence of completions - sequence: list[str] = [] - base_path_builder = _NodePathBuilder.from_string(ctx.node_path) - - for event in ic.session.events: - if event.invocation_id != ic.invocation_id: - continue - - event_node_path = event.node_info.path or '' - event_path_builder = _NodePathBuilder.from_string(event_node_path) - - if not event_path_builder.is_descendant_of(base_path_builder): - continue - - child_path = base_path_builder.get_direct_child(event_path_builder) - segment: str = child_path.leaf_segment - - if is_terminal_event(event): - # Maintain unique segments ordered by their LAST terminal event. - # If a node interrupts in turn 1 and completes in turn 2, moving it - # to the end ensures we record the order of its final completion. - if segment in sequence: - sequence.remove(segment) - sequence.append(segment) - - return raw_results, sequence - - # --- FINALIZE --- - - def _finalize(self, loop_state: _LoopState, ctx: Context) -> None: - """Set interrupt_ids or terminal output on ctx. - - If any child interrupted, propagate their interrupt IDs to ctx - so the parent orchestrator sees them. Otherwise, set the terminal - node's output on ctx so the parent can read it. - """ - if loop_state.interrupt_ids: - ctx._interrupt_ids = set(loop_state.interrupt_ids) - return - - # Set terminal output on ctx so parent reads ctx.output. - # Terminal nodes = no outgoing edges. - assert self.graph is not None - terminal_outputs = [ - loop_state.node_outputs[name] - for name in self.graph._terminal_node_names - if name in loop_state.node_outputs - ] - if len(terminal_outputs) == 1: - ctx.output = self._validate_output_data(terminal_outputs[0]) - elif terminal_outputs: - raise ValueError( - f'Workflow {self.name}: multiple terminal nodes produced' - f' output ({len(terminal_outputs)}). A workflow must have' - ' at most one terminal output.' - ) - - # --- Utilities --- - - def _has_terminal_output(self, loop_state: _LoopState) -> bool: - """Check if any terminal node produced output.""" - assert self.graph is not None - return any( - name in loop_state.node_outputs - for name in self.graph._terminal_node_names - ) - - def _get_static_node_by_name(self, name: str) -> BaseNode: - """Find a node in the graph by name.""" - assert self.graph is not None - for node in self.graph.nodes: - if node.name == name: - return node - raise ValueError(f'Node {name} not found in graph.') - - def _pop_completed_task( - self, loop_state: _LoopState, task: asyncio.Task[Context] - ) -> str: - """Remove a completed task and return its node name.""" - for name, t in loop_state.pending_tasks.items(): - if t is task: - del loop_state.pending_tasks[name] - return name - raise ValueError('Task not found in pending_tasks.') - - async def _cleanup_all_tasks(self, loop_state: _LoopState) -> None: - """Cancel remaining tasks to prevent leaks.""" - dynamic_tasks = loop_state.get_dynamic_tasks() - - all_tasks = list(loop_state.pending_tasks.values()) + dynamic_tasks - if all_tasks: - logger.warning( - 'Workflow %s: cancelling %d leftover tasks.', - self.name, - len(all_tasks), - ) - for task in all_tasks: - if not task.done(): - task.cancel() - if all_tasks: - await asyncio.gather(*all_tasks, return_exceptions=True) - for task in all_tasks: - if task.cancelled(): - # Mark static nodes as CANCELLED - for name, t in loop_state.pending_tasks.items(): - if t is task: - loop_state.nodes[name].status = NodeStatus.CANCELLED - break - # Mark dynamic nodes as CANCELLED - for _, run in loop_state.runs.items(): - if run.task is task: - run.state.status = NodeStatus.CANCELLED - break diff --git a/src/google/adk/workflow/utils/__init__.py b/src/google/adk/workflow/utils/__init__.py deleted file mode 100644 index 58d482ea38..0000000000 --- a/src/google/adk/workflow/utils/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/src/google/adk/workflow/utils/_rehydration_utils.py b/src/google/adk/workflow/utils/_rehydration_utils.py deleted file mode 100644 index a7e5da442e..0000000000 --- a/src/google/adk/workflow/utils/_rehydration_utils.py +++ /dev/null @@ -1,382 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Utilities for ADK workflow rehydration.""" - -from __future__ import annotations - -import asyncio -from dataclasses import dataclass -from dataclasses import field -import json -import logging -from typing import Any -from typing import TYPE_CHECKING - -from google.genai import types -from pydantic import TypeAdapter -from pydantic import ValidationError - -from ...events._node_path_builder import _NodePathBuilder -from ...events.event import Event -from ._workflow_hitl_utils import REQUEST_INPUT_FUNCTION_CALL_NAME - -if TYPE_CHECKING: - from .._base_node import BaseNode - -logger = logging.getLogger('google_adk.' + __name__) - -_RESULT_KEY = 'result' - - -@dataclass -class _ChildScanState: - """State accumulated for a child node during event scanning.""" - - run_id: str | None = None - output: Any = None - route: str | None = None - branch: str | None = None - isolation_scope: str | None = None - transfer_to_agent: str | None = None - interrupt_ids: set[str] = field(default_factory=set) - resolved_ids: set[str] = field(default_factory=set) - resolved_responses: dict[str, Any] = field(default_factory=dict) - - -def _wrap_response(value: Any) -> dict[str, Any]: - """Wraps a value into a dict suitable for FunctionResponse.response. - - If the value is already a dict, returns it as-is. - Otherwise wraps as ``{"result": value}``. - """ - if isinstance(value, dict): - return value - return {_RESULT_KEY: value} - - -def _unwrap_response(data: Any) -> Any: - """Unwraps a FunctionResponse dict to the original value. - - If ``data`` is a dict with exactly one key ``"result"``, extracts the - value. String values are JSON-parsed when possible (the web frontend - wraps user text as ``{"result": text}`` without parsing). - - Otherwise returns ``data`` unchanged. - """ - if isinstance(data, dict) and len(data) == 1 and _RESULT_KEY in data: - value = data[_RESULT_KEY] - if isinstance(value, str): - try: - value = json.loads(value) - except (json.JSONDecodeError, ValueError): - pass - return value - return value - return data - - -def _extract_schema_from_event(event: Event, interrupt_id: str) -> Any | None: - """Extracts the response schema from an event if it's a RequestInput call.""" - if not event.content or not event.content.parts: - return None - - for part in event.content.parts: - fc = part.function_call - if ( - fc - and fc.name == REQUEST_INPUT_FUNCTION_CALL_NAME - and fc.id == interrupt_id - ): - return fc.args.get('response_schema') - - return None - - -def _process_rehydrated_output(node: BaseNode, output: Any) -> Any: - """Process rehydrated output from event.content using the node's output schema. - - Protects type consistency between fresh runs and rehydrated runs by - properly respecting output schemas, handling model reasoning thought - blocks, and ensuring raw strings are returned when no output schema is - configured. - """ - if not isinstance(output, types.Content): - return output - - from google.adk.utils.content_utils import extract_text_from_content - - text = extract_text_from_content(output).strip() - - if not text: - return None - - if node.output_schema: - if node.output_schema is str: - return text - try: - validated = TypeAdapter(node.output_schema).validate_json(text) - return node._to_serializable(validated) - except ValidationError as e: - # Fallback to unvalidated JSON parsing on validation failure - # to prevent blocking resumption on schema drift. - try: - parsed = json.loads(text) - logger.warning( - 'Validation failed for rehydrated output against schema: %s. ' - 'Falling back to unvalidated JSON output to allow resumption.', - e, - ) - return parsed - except ValueError: - raise ValueError( - f'Validation failed for rehydrated output against schema: {e}' - ) from e - else: - return text - - -def _validate_resume_response(response_data: Any, schema: Any) -> Any: - """Validates and coerces resume response data against a schema. - - Args: - response_data: The data to validate. - schema: The schema to validate against (Python type, GenericAlias, or raw - JSON Schema dict). - - Returns: - The validated and coerced data. - """ - if schema is None: - return response_data - - # If it's a JSON Schema dict, map type to Python type for TypeAdapter - if isinstance(schema, dict): - type_str = schema.get('type') - - type_mapping = { - 'integer': int, - 'number': float, - 'string': str, - 'boolean': bool, - 'array': list, - 'object': dict, - } - - # Special handling for object schemas with properties - if type_str == 'object' and 'properties' in schema: - from pydantic import create_model - - properties = schema['properties'] - required = schema.get('required', []) - - fields = {} - for prop_name, prop_schema in properties.items(): - prop_type_str = prop_schema.get('type') - prop_type = ( - type_mapping.get(prop_type_str, Any) if prop_type_str else Any - ) - - if prop_name in required: - fields[prop_name] = (prop_type, ...) - else: - fields[prop_name] = ( - prop_type | None, - None, - ) # type: ignore[assignment] - - try: - DynamicModel = create_model('DynamicModel', **fields) # pylint: disable=invalid-name - # Validate and return as dict - model_instance = TypeAdapter(DynamicModel).validate_python( - response_data - ) - return model_instance.model_dump() - except ValidationError as e: - raise ValueError(f'Validation failed for object schema: {e}') from e - - mapped_type = type_mapping.get(type_str) if type_str else None - if mapped_type: - try: - return TypeAdapter(mapped_type).validate_python(response_data) - except ValidationError as e: - raise ValueError(f'Failed to coerce data to {type_str}: {e}') from e - - # Fallback: skip validation for complex schemas (similar to base node) - return response_data - - # For Python types and Pydantic models, use TypeAdapter directly - try: - return TypeAdapter(schema).validate_python(response_data) - except ValidationError as e: - raise ValueError(f'Validation failed against schema: {e}') from e - - -def _reconstruct_node_states( - events: list[Event], - base_path: str, - invocation_id: str, - group_by_direct_child: bool = False, -) -> dict[str, _ChildScanState]: - """Scans session events to reconstruct node states for resume.""" - scan_states: dict[str, _ChildScanState] = {} - interrupt_owner: dict[str, str] = {} - schemas_by_id: dict[str, Any] = {} - - base_path_builder = _NodePathBuilder.from_string(base_path) - - def get_owner_key(event_path_builder: _NodePathBuilder) -> str | None: - if group_by_direct_child: - if not event_path_builder.is_descendant_of(base_path_builder): - return None - child_path = base_path_builder.get_direct_child(event_path_builder) - return child_path.leaf_segment - else: - if ( - event_path_builder == base_path_builder - or event_path_builder.is_descendant_of(base_path_builder) - ): - return base_path - return None - - for event in events: - if invocation_id and event.invocation_id != invocation_id: - continue - - # 1. Handle FunctionResponse (User responses to interrupts) - if event.author == 'user' and event.content and event.content.parts: - for part in event.content.parts: - fr = part.function_response - if fr and fr.id and fr.id in interrupt_owner: - owner = interrupt_owner[fr.id] - if owner not in scan_states: - scan_states[owner] = _ChildScanState() - scan_states[owner].resolved_ids.add(fr.id) - response_data = _unwrap_response(fr.response) - - schema = schemas_by_id.get(fr.id) - if schema: - try: - response_data = _validate_resume_response(response_data, schema) - except ValueError as e: - raise ValueError( - f'Validation failed for interrupt {fr.id}: {e}' - ) from e - - scan_states[owner].resolved_responses[fr.id] = response_data - continue - - # 2. Match events under base_path - event_node_path = event.node_info.path or '' - event_path_builder = _NodePathBuilder.from_string(event_node_path) - owner_key = get_owner_key(event_path_builder) - - if not owner_key: - continue - - # 3. Initialize state for the owner if needed - if owner_key not in scan_states: - owner_path_builder = _NodePathBuilder.from_string(owner_key) - scan_states[owner_key] = _ChildScanState(run_id=owner_path_builder.run_id) - - child = scan_states[owner_key] - if event.isolation_scope: - child.isolation_scope = event.isolation_scope - - # 4. Determine if event is direct child or delegated output - is_direct = False - if group_by_direct_child: - is_direct = event_path_builder.is_direct_child_of(base_path_builder) - else: - is_direct = event_path_builder == base_path_builder - - has_output = event.output is not None - use_message_as_output = False - if ( - not has_output - and event.node_info - and event.node_info.message_as_output - and event.content is not None - ): - has_output = True - use_message_as_output = True - - is_delegated = False - if has_output and event.node_info.output_for: - if not group_by_direct_child: - is_delegated = base_path in event.node_info.output_for - else: - owner_full_path = str(base_path_builder.append(owner_key)) - is_delegated = owner_full_path in event.node_info.output_for - - # 5. Extract output and route - if is_direct or is_delegated: - if event.output is not None: - child.output = event.output - child.branch = event.branch - elif use_message_as_output: - child.output = event.content - if event.actions and event.actions.route is not None: - child.route = event.actions.route - if event.actions and event.actions.transfer_to_agent is not None: - child.transfer_to_agent = event.actions.transfer_to_agent - - # 6. Extract interrupts and their schemas - # Modern events explicitly set long_running_tool_ids. - interrupt_ids_to_process = set(event.long_running_tool_ids or []) - - # Fallback for older session JSONs where RequestInput/Auth events were exported - # without populating long_running_tool_ids. We extract the IDs directly from the function calls. - from ._workflow_hitl_utils import get_request_input_interrupt_ids - - interrupt_ids_to_process.update(get_request_input_interrupt_ids(event)) - - if interrupt_ids_to_process: - for interrupt_id in interrupt_ids_to_process: - child.interrupt_ids.add(interrupt_id) - interrupt_owner[interrupt_id] = owner_key - - schema_json = _extract_schema_from_event(event, interrupt_id) - if schema_json: - schemas_by_id[interrupt_id] = schema_json - - return scan_states - - -def is_terminal_event(event: Event) -> bool: - """Determines if an event represents a terminal execution outcome (output, route, error, or interrupt).""" - if event.output is not None: - return True - if ( - event.node_info - and event.node_info.message_as_output - and event.content is not None - ): - return True - if event.actions and event.actions.route is not None: - return True - if event.long_running_tool_ids: - return True - if event.error_code is not None: - return True - - from ._workflow_hitl_utils import has_auth_request_function_call - from ._workflow_hitl_utils import has_request_input_function_call - - if has_request_input_function_call(event) or has_auth_request_function_call( - event - ): - return True - - return False diff --git a/src/google/adk/workflow/utils/_replay_interceptor.py b/src/google/adk/workflow/utils/_replay_interceptor.py deleted file mode 100644 index 5e41728988..0000000000 --- a/src/google/adk/workflow/utils/_replay_interceptor.py +++ /dev/null @@ -1,195 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Replay interceptor for workflow rehydration.""" - -from __future__ import annotations - -import asyncio -from dataclasses import dataclass -from dataclasses import field -from typing import Any -from typing import TYPE_CHECKING - -from ...agents.context import Context -from .._base_node import BaseNode -from .._node_state import NodeState -from .._node_status import NodeStatus -from ._rehydration_utils import _ChildScanState -from ._rehydration_utils import _process_rehydrated_output - -if TYPE_CHECKING: - from .._dynamic_node_scheduler import DynamicNodeRun - - -@dataclass(kw_only=True) -class InterceptionResult: - """Result of replay interception check.""" - - should_run: bool - """Whether the node should be executed natively.""" - - output: Any = None - """The cached output to fast-forward or auto-complete with.""" - - route: Any = None - """The cached route to fast-forward with.""" - - interrupts: set[str] = field(default_factory=set) - """Unresolved interrupts if the node should stay WAITING.""" - - resume_inputs: dict[str, Any] | None = None - """Resolved responses to feed into the node if it is rerun.""" - - transfer_to_agent: str | None = None - """Target agent name if fast-forwarding same-turn transfer.""" - - -def check_interception( - *, - node_path: str, - node: BaseNode, - recovered: _ChildScanState | None = None, - current_run: DynamicNodeRun | None = None, - curr_parent_ctx: Context, -) -> InterceptionResult: - """Determine if a node execution should be intercepted based on history.""" - from .._workflow import Workflow # pylint: disable=g-import-not-at-top - - # Case 1: Same-turn completed or waiting interception (dynamic nodes only). - # If a node already successfully executed or is currently blocked in the - # current turn, bypass execution and return its current turn results. - if current_run: - if current_run.state.status == NodeStatus.COMPLETED: - return InterceptionResult( - should_run=False, - output=current_run.output, - transfer_to_agent=current_run.transfer_to_agent, - ) - if current_run.state.status == NodeStatus.WAITING: - if current_run.state.interrupts: - return InterceptionResult( - should_run=False, - interrupts=set(current_run.state.interrupts), - ) - - # Intercept executions based on historical session events (cross-turn replay). - if not recovered: - return InterceptionResult(should_run=True) - - unresolved = recovered.interrupt_ids - recovered.resolved_ids - - should_run = False - output = None - route = None - interrupts = set() - resume_inputs = None - - if unresolved: - # Case 2: Cross-turn unresolved interrupts remain. - # Rerun natively with resolved inputs if the node supports rerun and some - # progress was made; otherwise remain waiting and bubble unresolved interrupts. - if node.rerun_on_resume and recovered.resolved_ids: - should_run = True - resume_inputs = recovered.resolved_responses - else: - interrupts = unresolved - - elif ( - recovered.route is not None - or recovered.output is not None - or recovered.transfer_to_agent is not None - ): - # Case 3: Cross-turn successfully completed in a prior turn (fast-forward). - # Bypass execution completely and return the cached output and route. - output = _process_rehydrated_output(node, recovered.output) - route = recovered.route - - elif recovered.interrupt_ids: - # Case 4: Cross-turn all prior interrupts are resolved, but no output yet. - # Extract responses directly if the node does not support rerun; otherwise - # rerun natively with resolved responses to produce output. - if not node.rerun_on_resume: - child_resume_inputs = recovered.resolved_responses - if len(child_resume_inputs) == 1: - output = list(child_resume_inputs.values())[0] - else: - output = dict(child_resume_inputs) - else: - should_run = True - resume_inputs = recovered.resolved_responses - - else: - # Case 5: Cross-turn no events, or events contain no output, route, or interrupts. - # Rerun Workflow nodes to guide nested children; otherwise fall through. - if ( - isinstance(node, Workflow) - and node.wait_for_output - and recovered.output is None - ): - should_run = True - resume_inputs = recovered.resolved_responses - else: - # Allow fresh execution for crashed/timeout dynamic nodes; - # static nodes with no outcome (e.g. return None) should be fast-forwarded. - if current_run is not None: - should_run = True - else: - should_run = False - - return InterceptionResult( - should_run=should_run, - output=output, - route=route, - interrupts=interrupts, - resume_inputs=resume_inputs, - transfer_to_agent=recovered.transfer_to_agent if recovered else None, - ) - - -def create_mock_context( - *, - parent_ctx: Context, - node: BaseNode, - run_id: str, - result: InterceptionResult, - ancestors: list[str], - node_path: str | None = None, - branch: str | None = None, -) -> Context: - """Build a Context with cached results (no execution).""" - ic = parent_ctx._invocation_context # pylint: disable=protected-access - if branch: - ic = ic.model_copy(update={"branch": branch}) - - mock_ctx = Context( - ic, - parent_ctx=parent_ctx, - node=node, - run_id=run_id, - node_path=node_path, - ) - mock_ctx._output_for_ancestors = ancestors # pylint: disable=protected-access - - if result.output is not None: - mock_ctx._output_value = result.output # pylint: disable=protected-access - mock_ctx._output_emitted = True # pylint: disable=protected-access - - if result.transfer_to_agent is not None: - mock_ctx.actions.transfer_to_agent = result.transfer_to_agent - - mock_ctx.route = result.route - mock_ctx._interrupt_ids = result.interrupts # pylint: disable=protected-access - - return mock_ctx diff --git a/src/google/adk/workflow/utils/_replay_sequence_barrier.py b/src/google/adk/workflow/utils/_replay_sequence_barrier.py deleted file mode 100644 index 530d126d44..0000000000 --- a/src/google/adk/workflow/utils/_replay_sequence_barrier.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Chronological sequence barrier for deterministic replay ordering.""" - -from __future__ import annotations - -import asyncio - - -class ReplaySequenceBarrier: - """Unified chronological sequence barrier to ensure deterministic replay ordering.""" - - def __init__(self, sequence: list[str]) -> None: - self.sequence = sequence - self.current_index = 0 - self.events = {key: asyncio.Event() for key in sequence} - if sequence: - self.events[sequence[0]].set() - - async def wait(self, key: str) -> None: - """Wait for the barrier if the key is part of the expected chronological sequence. - - Only wait if the node had a terminal event (output, route, or interrupt). - "Silent" nodes that only yielded state updates but didn't produce - output are not in the sequence barrier, so they fast-forward immediately. - """ - if key in self.events: - await self.events[key].wait() - - def check_and_advance(self, key: str) -> None: - """Advance the sequence if the key matches the current expected execution.""" - if self.current_index < len(self.sequence): - expected_key = self.sequence[self.current_index] - if key == expected_key: - self.current_index += 1 - if self.current_index < len(self.sequence): - next_key = self.sequence[self.current_index] - self.events[next_key].set() diff --git a/src/google/adk/workflow/utils/_retry_utils.py b/src/google/adk/workflow/utils/_retry_utils.py deleted file mode 100644 index 5a220dd261..0000000000 --- a/src/google/adk/workflow/utils/_retry_utils.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -"""Utility functions for retrying nodes in a workflow.""" - -import random - -from .._node_state import NodeState -from .._retry_config import RetryConfig - - -def _should_retry_node( - exception: BaseException, - retry_config: RetryConfig | None, - node_state: NodeState, -) -> bool: - """Checks if a failed node should be retried based on its retry_config.""" - if not retry_config: - return False - - attempt_count = node_state.attempt_count - max_attempts = retry_config.max_attempts or 5 - - # attempt_count starts at 1 for the original request. - # So if attempt_count >= max_attempts, we have reached the limit. - if attempt_count >= max_attempts: - return False - - if retry_config.exceptions is not None: - ex_name = type(exception).__name__ - if ex_name not in retry_config.exceptions: - return False - - return True - - -def _get_retry_delay( - retry_config: RetryConfig | None, - node_state: NodeState, -) -> float: - """Calculates the delay before retrying a node.""" - # Default delay is 1.0 second. - if not retry_config: - return 1.0 - - initial_delay = ( - retry_config.initial_delay - if retry_config.initial_delay is not None - else 1.0 - ) - max_delay = ( - retry_config.max_delay if retry_config.max_delay is not None else 60.0 - ) - backoff_factor = ( - retry_config.backoff_factor - if retry_config.backoff_factor is not None - else 2.0 - ) - jitter = retry_config.jitter if retry_config.jitter is not None else 1.0 - - attempt_count = node_state.attempt_count or 1 - # attempt_count is the attempt number that just failed (1-based). - # For the first failure (attempt 1), the exponent should be 0. - attempt_for_calc = max(0, attempt_count - 1) - - delay = initial_delay * (backoff_factor**attempt_for_calc) - delay = min(delay, max_delay) - - if jitter > 0.0: - random_offset = random.uniform(-jitter * delay, jitter * delay) - delay = max(0.0, delay + random_offset) - - return delay diff --git a/src/google/adk/workflow/utils/_transfer_utils.py b/src/google/adk/workflow/utils/_transfer_utils.py deleted file mode 100644 index 178492b16d..0000000000 --- a/src/google/adk/workflow/utils/_transfer_utils.py +++ /dev/null @@ -1,92 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Utilities for agent transfer in ADK workflow.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from ...agents.base_agent import BaseAgent - from ...agents.context import Context - - -def resolve_and_derive_transfer_context( - target_name: str, - current_agent: BaseAgent, - root_agent: BaseAgent, - curr_ctx: Context, - curr_parent_ctx: Context | None, -) -> tuple[BaseAgent, Context | None] | tuple[None, None]: - """Resolves the target agent and derives its parent context in a single pass. - - Args: - target_name: The name of the target agent to transfer to. - current_agent: The agent initiating the transfer. - root_agent: The root agent of the application. - curr_ctx: The current execution context of the current_agent. - curr_parent_ctx: The parent context of the current_agent. - - Returns: - A tuple of (target_agent, next_parent_context) or (None, None) if target not - found. If target is found but cannot be logically routed (unrelated transfer), - returns (target_agent, None). - - Raises: - ValueError: If target_agent is the same as current_agent. - """ - target_agent = root_agent.find_agent(target_name) - if not target_agent: - return None, None - - # Case 1: SELF (invalid transfer target) - if target_agent.name == current_agent.name: - raise ValueError(f"Agent '{target_name}' cannot transfer to itself.") - - # Case 2: Direct CHILD (nests deeper under the current context) - if ( - target_agent.parent_agent - and target_agent.parent_agent.name == current_agent.name - ): - return target_agent, curr_ctx - - # Case 3: SIBLING (runs under the same parent context) - if ( - target_agent.parent_agent - and current_agent.parent_agent - and target_agent.parent_agent.name == current_agent.parent_agent.name - ): - return target_agent, curr_parent_ctx - - # Case 4: Direct PARENT (climbs up the context chain to find the parent's parent) - if ( - current_agent.parent_agent - and current_agent.parent_agent.name == target_agent.name - ): - # Walk up the context chain to find the target parent agent's context - curr = curr_ctx - while curr is not None and curr.node is not None: - if curr.node.name == target_name: - return target_agent, curr.parent_ctx - curr = curr.parent_ctx - - # Root Coordinator / Bypassed parent fallback: returns the outermost root context of this turn - root_ctx = curr_ctx - while root_ctx.parent_ctx is not None and root_ctx.node is not None: - root_ctx = root_ctx.parent_ctx - return target_agent, root_ctx - - # Fallback: target found but has no direct routing relationship (unrelated) - return target_agent, None diff --git a/src/google/adk/workflow/utils/_workflow_graph_utils.py b/src/google/adk/workflow/utils/_workflow_graph_utils.py deleted file mode 100644 index 8cf42fc82b..0000000000 --- a/src/google/adk/workflow/utils/_workflow_graph_utils.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Utility functions for building workflow graphs.""" - -from __future__ import annotations - -from typing import Any -from typing import cast - -from ...tools.base_tool import BaseTool -from .._base_node import BaseNode -from .._base_node import START -from .._function_node import FunctionNode -from .._graph import NodeLike -from .._retry_config import RetryConfig -from .._tool_node import _ToolNode - - -def is_node_like(item: Any) -> bool: - """Checks if an object is NodeLike.""" - return ( - isinstance(item, (BaseNode, BaseTool)) - or callable(item) - or item == 'START' - ) - - -def build_node( - node_like: NodeLike, - *, - name: str | None = None, - rerun_on_resume: bool | None = None, - retry_config: RetryConfig | None = None, - timeout: float | None = None, - auth_config: Any = None, -) -> BaseNode: - """Converts a NodeLike to a BaseNode, wrapping async funcs in FunctionNode. - - Args: - node_like: The item to convert to a BaseNode. - name: If provided, overrides the name of the wrapped node. - rerun_on_resume: If provided, overrides the rerun_on_resume property of the - wrapped node. - retry_config: If provided, overrides the retry_config property of the - wrapped node. - timeout: If provided, overrides the timeout property of the wrapped node. - auth_config: If provided, passed to FunctionNode for authentication. - - Returns: - A BaseNode instance. - - Raises: - ValueError: If node_like is not a valid type (BaseNode, BaseAgent, - BaseTool, callable, or 'START'). - """ - - if node_like == 'START': - return START - - # Lazy import to avoid circular dependency: - # workflow_graph_utils -> agents.llm_agent -> ... -> workflow_graph_utils - from ...agents.llm_agent import LlmAgent - - if isinstance(node_like, BaseNode): - kwargs: dict[str, Any] = {} - if name is not None: - kwargs['name'] = name - if rerun_on_resume is not None: - kwargs['rerun_on_resume'] = rerun_on_resume - if retry_config is not None: - kwargs['retry_config'] = retry_config - if timeout is not None: - kwargs['timeout'] = timeout - - if isinstance(node_like, LlmAgent): - if rerun_on_resume is None: - kwargs['rerun_on_resume'] = True - agent = node_like.clone(update=kwargs) - # Preserve parent agent reference that was lost during clone - agent.parent_agent = node_like.parent_agent - - if agent.mode is None: - agent.mode = 'single_turn' - - if agent.mode in ('task', 'chat'): - agent.wait_for_output = True - - if agent.parallel_worker: - from .._parallel_worker import _ParallelWorker - - agent.parallel_worker = False - return _ParallelWorker(node=agent) - return cast(BaseNode, agent) - else: - if kwargs: - return cast(BaseNode, node_like.model_copy(update=kwargs)) - return node_like - elif isinstance(node_like, BaseTool): - return _ToolNode( - tool=node_like, - name=name, - retry_config=retry_config, - timeout=timeout, - ) - elif callable(node_like): - return FunctionNode( - func=node_like, - name=name, - rerun_on_resume=rerun_on_resume or False, - retry_config=retry_config, - timeout=timeout, - auth_config=auth_config, - ) - else: - raise ValueError( - f'Invalid node type: {type(node_like)}. Node must be a BaseNode, a' - ' BaseAgent, a BaseTool, or a callable.' - ) diff --git a/src/google/adk/workflow/utils/_workflow_hitl_utils.py b/src/google/adk/workflow/utils/_workflow_hitl_utils.py deleted file mode 100644 index be718b5e89..0000000000 --- a/src/google/adk/workflow/utils/_workflow_hitl_utils.py +++ /dev/null @@ -1,261 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Utility functions for Human-in-the-Loop (HITL) workflows.""" - -from __future__ import annotations - -"""Utilities for ADK workflows.""" - -from collections.abc import Mapping -from typing import Any -from typing import TYPE_CHECKING - -from google.genai import types -from pydantic import ValidationError - -from ...auth.auth_credential import AuthCredentialTypes as _AuthCredentialTypes -from ...auth.auth_handler import AuthHandler -from ...auth.auth_tool import AuthConfig -from ...auth.auth_tool import AuthToolArguments -from ...events._node_path_builder import _NodePathBuilder -from ...events.event import Event -from ...events.request_input import RequestInput -from ...utils._schema_utils import schema_to_json_schema - -if TYPE_CHECKING: - from ...auth.auth_credential import AuthCredential - from ...sessions.state import State - -REQUEST_INPUT_FUNCTION_CALL_NAME = 'adk_request_input' -REQUEST_CREDENTIAL_FUNCTION_CALL_NAME = 'adk_request_credential' - -_RESULT_KEY = 'result' -"""Key used to wrap non-dict values in a FunctionResponse dict.""" - - -def create_request_input_event(request_input: RequestInput) -> Event: - """Creates a RequestInput event from a RequestInput object.""" - args = request_input.model_dump(exclude={'response_schema'}, by_alias=True) - args['response_schema'] = ( - schema_to_json_schema(request_input.response_schema) - if request_input.response_schema is not None - else None - ) - return Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name=REQUEST_INPUT_FUNCTION_CALL_NAME, - args=args, - id=request_input.interrupt_id, - ) - ) - ] - ), - long_running_tool_ids=[request_input.interrupt_id], - ) - - -def has_request_input_function_call(event: Event) -> bool: - """Checks if an event contains a `request_input` function call.""" - if not (event.content and event.content.parts): - return False - return any( - p.function_call - and p.function_call.name == REQUEST_INPUT_FUNCTION_CALL_NAME - for p in event.content.parts - ) - - -def has_auth_request_function_call(event: Event) -> bool: - """Checks if an event contains an `adk_request_credential` function call.""" - if not (event.content and event.content.parts): - return False - return any( - p.function_call - and p.function_call.name == REQUEST_CREDENTIAL_FUNCTION_CALL_NAME - for p in event.content.parts - ) - - -def create_request_input_response( - interrupt_id: str, - response: Mapping[str, Any], -) -> types.Part: - """Creates a FunctionResponse part in response to a `request_input` function call. - - Args: - interrupt_id: The interrupt_id from an event containing a `request_input` - function call. - response: The response data to send back. - - Returns: - A types.Part containing the FunctionResponse. - """ - return types.Part( - function_response=types.FunctionResponse( - id=interrupt_id, - name=REQUEST_INPUT_FUNCTION_CALL_NAME, - response=response, - ) - ) - - -def get_request_input_interrupt_ids(event: Event) -> list[str]: - """Extracts interrupt_ids from an event containing `request_input` function - calls. - """ - interrupt_ids: list[str] = [] - if not event.content or not event.content.parts: - return interrupt_ids - for part in event.content.parts: - if ( - part.function_call - and part.function_call.name == REQUEST_INPUT_FUNCTION_CALL_NAME - ): - interrupt_ids.append(part.function_call.id) - return interrupt_ids - - -# --------------------------------------------------------------------------- -# Auth credential utilities -# --------------------------------------------------------------------------- - - -def _build_auth_message(auth_config: AuthConfig) -> str: - """Builds a human-readable message describing what credential is needed.""" - raw_cred = auth_config.raw_auth_credential - if not raw_cred: - return 'Please provide your authentication credentials.' - - auth_type = raw_cred.auth_type - if auth_type == _AuthCredentialTypes.API_KEY: - name = getattr(auth_config.auth_scheme, 'name', 'API key') - return f'Please provide your API key for {name}.' - elif auth_type in ( - _AuthCredentialTypes.OAUTH2, - _AuthCredentialTypes.OPEN_ID_CONNECT, - ): - return 'Please complete the authentication flow.' - - return 'Please provide your authentication credentials.' - - -def create_auth_request_event( - auth_config: AuthConfig, - interrupt_id: str, -) -> Event: - """Creates an event requesting user authentication credentials. - - Args: - auth_config: The auth configuration for the node. - interrupt_id: The interrupt ID for this auth request. - - Returns: - An Event containing an ``adk_request_credential`` function call. - """ - auth_handler = AuthHandler(auth_config) - auth_request = auth_handler.generate_auth_request() - args = AuthToolArguments( - function_call_id=interrupt_id, - auth_config=auth_request, - ).model_dump(exclude_none=True, by_alias=True) - - # Add message so the UI / CLI knows what to display. - args['message'] = _build_auth_message(auth_config) - - return Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name=REQUEST_CREDENTIAL_FUNCTION_CALL_NAME, - id=interrupt_id, - args=args, - ) - ) - ] - ), - long_running_tool_ids=[interrupt_id], - ) - - -def _build_credential_from_value( - auth_config: AuthConfig, - value: Any, -) -> 'AuthCredential': - """Builds an AuthCredential from a raw user-provided value. - - For API_KEY, the value is used as the key string directly. - For all other types, the value is parsed as an AuthCredential dict. - """ - from ...auth.auth_credential import AuthCredential - - raw_cred = auth_config.raw_auth_credential - if raw_cred is None: - return AuthCredential.model_validate(value) - - if raw_cred.auth_type == _AuthCredentialTypes.API_KEY: - return AuthCredential( - auth_type=_AuthCredentialTypes.API_KEY, - api_key=str(value), - ) - - return AuthCredential.model_validate(value) - - -async def process_auth_resume( - response_data: Any, - auth_config: AuthConfig, - state: State, -) -> None: - """Stores credentials from an auth resume response into session state. - - Accepts multiple response formats (tried in order): - 1. A full AuthConfig dict (from web UI OAuth flow). - 2. An AuthCredential dict. - 3. A plain value (string for API key). The node's - auth_config.raw_auth_credential.auth_type determines how the - value is interpreted. - - The caller is responsible for unwrapping {"result": ...} wrappers - before calling this function. - - Args: - response_data: The unwrapped response from the client. - auth_config: The original auth configuration for the node. - state: The session state to store credentials in. - """ - try: - response_config = AuthConfig.model_validate(response_data) - except (ValidationError, TypeError): - response_config = auth_config.model_copy(deep=True) - response_config.exchanged_auth_credential = _build_credential_from_value( - auth_config, response_data - ) - - response_config.credential_key = auth_config.credential_key - await AuthHandler(auth_config=response_config).parse_and_store_auth_response( - state=state - ) - - -def has_auth_credential( - auth_config: AuthConfig, - state: State, -) -> bool: - """Returns True if a credential for the given auth config exists in state.""" - return AuthHandler(auth_config).get_auth_response(state) is not None diff --git a/tests/integration/fixture/bigquery_agent/README.md b/tests/integration/fixture/bigquery_agent/README.md index 34456fb68e..57b580a25e 100644 --- a/tests/integration/fixture/bigquery_agent/README.md +++ b/tests/integration/fixture/bigquery_agent/README.md @@ -12,7 +12,7 @@ 1. Change to the current directory: ```shell - cd tests/integration/fixture/bigquery_agent/ + cd third_party/py/google/adk/tests/integration/fixture/bigquery_agent/ ``` 1. Customize the evaluation dataset to the environment `GOOGLE_CLOUD_PROJECT` by replacing the placeholder to the real project set in your environment: @@ -47,7 +47,7 @@ 1. Change to the directory containing agent folder: ```shell - cd tests/integration/fixture/ + cd third_party/py/google/adk/tests/integration/fixture/ ``` 1. Run the following command to start the ADK web app: diff --git a/tests/integration/test_cli_run.py b/tests/integration/test_cli_run.py deleted file mode 100644 index d46cf950a1..0000000000 --- a/tests/integration/test_cli_run.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import json -import os -from pathlib import Path - -from click.testing import CliRunner -from google.adk.cli import cli_tools_click -import pytest - - -def test_cli_run_integration(tmp_path: Path) -> None: - """Integration test for `adk run` with query using CliRunner (No mocks).""" - # Arrange - agent_dir = tmp_path / "dummy_agent" - agent_dir.mkdir() - - # Create __init__.py - with open(agent_dir / "__init__.py", "w") as f: - f.write("from . import agent\n") - - # Create agent.py - agent_code = """ -from google.adk.agents import Agent -from google.adk.events.event import Event -from typing import AsyncGenerator - -class DummyAgent(Agent): - async def run_async(self, ctx) -> AsyncGenerator[Event, None]: - # Yield a text response - from google.adk.events.event import Event - text = ctx.user_content.parts[0].text if ctx.user_content and ctx.user_content.parts else "No input" - yield Event(author="dummy", output=f"Echo: {text}") - -root_agent = DummyAgent(name="dummy", model="gemini-2.5-flash") -""" - with open(agent_dir / "agent.py", "w") as f: - f.write(agent_code) - - runner = CliRunner() - - # Act - result = runner.invoke( - cli_tools_click.main, - ["run", "--jsonl", str(agent_dir), "hello world"], - ) - - # Assert - assert result.exit_code == 0 - - # Check stdout - stdout = result.stdout - assert stdout, "Stdout should not be empty" - - # Parse JSONL lines - lines = stdout.strip().split("\n") - assert len(lines) > 0 - - # The last line should be the final output or event - last_line = lines[-1] - try: - data = json.loads(last_line) - assert "output" in data - assert "Echo: hello world" in data["output"] - except json.JSONDecodeError: - pytest.fail(f"Stdout contained non-JSON line: {last_line}") diff --git a/tests/unittests/a2a/converters/test_part_converter.py b/tests/unittests/a2a/converters/test_part_converter.py index 842c550dea..f921b7e061 100644 --- a/tests/unittests/a2a/converters/test_part_converter.py +++ b/tests/unittests/a2a/converters/test_part_converter.py @@ -739,52 +739,6 @@ def test_data_part_with_mime_type_metadata_round_trip(self): # The 'mime_type' key in the metadata should be preserved as is assert result_a2a_part.root.metadata == metadata - def test_text_part_metadata_round_trip(self): - """Test round-trip conversion for text parts with metadata.""" - # Arrange - metadata = {"key1": "value1", "key2": "value2"} - a2a_part = a2a_types.Part( - root=a2a_types.TextPart(text="some text", metadata=metadata) - ) - - # Act - genai_part = convert_a2a_part_to_genai_part(a2a_part) - result_a2a_part = convert_genai_part_to_a2a_part(genai_part) - - # Assert - assert result_a2a_part is not None - assert isinstance(result_a2a_part, a2a_types.Part) - assert isinstance(result_a2a_part.root, a2a_types.TextPart) - assert result_a2a_part.root.text == "some text" - assert result_a2a_part.root.metadata == metadata - - def test_file_part_metadata_round_trip(self): - """Test round-trip conversion for file parts with metadata.""" - # Arrange - metadata = {"key1": "value1"} - a2a_part = a2a_types.Part( - root=a2a_types.FilePart( - file=a2a_types.FileWithUri( - uri="gs://bucket/file.txt", - mime_type="text/plain", - name="my_file.txt", - ), - metadata=metadata, - ) - ) - - # Act - genai_part = convert_a2a_part_to_genai_part(a2a_part) - result_a2a_part = convert_genai_part_to_a2a_part(genai_part) - - # Assert - assert result_a2a_part is not None - assert isinstance(result_a2a_part, a2a_types.Part) - assert isinstance(result_a2a_part.root, a2a_types.FilePart) - assert isinstance(result_a2a_part.root.file, a2a_types.FileWithUri) - assert result_a2a_part.root.file.uri == "gs://bucket/file.txt" - assert result_a2a_part.root.metadata == metadata - class TestEdgeCases: """Test cases for edge cases and error conditions.""" diff --git a/tests/unittests/a2a/converters/test_to_adk.py b/tests/unittests/a2a/converters/test_to_adk.py index 1e23af7a1b..3ab60f097d 100644 --- a/tests/unittests/a2a/converters/test_to_adk.py +++ b/tests/unittests/a2a/converters/test_to_adk.py @@ -30,7 +30,6 @@ from google.adk.a2a.converters.to_adk_event import convert_a2a_message_to_event from google.adk.a2a.converters.to_adk_event import convert_a2a_status_update_to_event from google.adk.a2a.converters.to_adk_event import convert_a2a_task_to_event -from google.adk.a2a.converters.to_adk_event import MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH from google.adk.a2a.converters.to_adk_event import MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT from google.adk.a2a.converters.utils import _get_adk_metadata_key from google.adk.agents.invocation_context import InvocationContext @@ -341,49 +340,6 @@ def test_convert_a2a_task_to_event_merges_status_and_artifact_actions(self): == "need input" ) - def test_convert_a2a_task_to_event_auth_required_uses_auth_args_key(self): - """Test auth-required state populates the function call with auth args.""" - a2a_part = Mock(spec=A2APart) - a2a_part.root = Mock(spec=TextPart) - a2a_part.root.metadata = {} - task = Task( - id="task-1", - context_id="context-1", - kind="task", - status=TaskStatus( - state=TaskState.auth_required, - timestamp="now", - message=Message( - message_id="m1", - role="agent", - parts=[a2a_part], - ), - ), - ) - - mock_genai_part = genai_types.Part.from_text(text="need auth") - - event = convert_a2a_task_to_event( - task, - author="test-author", - invocation_context=self.mock_context, - part_converter=Mock(return_value=[mock_genai_part]), - ) - - assert event is not None - assert event.content is not None - assert ( - event.content.parts[0].function_call.name - == MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH - ) - # auth_required state should populate the auth_required arg key, not - # input_required. - assert ( - event.content.parts[0].function_call.args["auth_required"] - == "need auth" - ) - assert "input_required" not in event.content.parts[0].function_call.args - def test_convert_a2a_task_to_event_multiple_parts_replaces_last_text(self): """Test converting A2A task with multiple text parts, only replacing the last text.""" part1 = Mock(spec=A2APart) diff --git a/tests/unittests/a2a/utils/test_agent_card_builder.py b/tests/unittests/a2a/utils/test_agent_card_builder.py index c979ad5307..8549c16ec8 100644 --- a/tests/unittests/a2a/utils/test_agent_card_builder.py +++ b/tests/unittests/a2a/utils/test_agent_card_builder.py @@ -42,11 +42,8 @@ from google.adk.agents.loop_agent import LoopAgent from google.adk.agents.parallel_agent import ParallelAgent from google.adk.agents.sequential_agent import SequentialAgent +from google.adk.examples import Example from google.adk.tools.example_tool import ExampleTool -from google.adk.workflow import FunctionNode -from google.adk.workflow import START -from google.adk.workflow import Workflow -from pydantic import BaseModel import pytest @@ -115,31 +112,6 @@ def test_init_with_empty_agent(self): with pytest.raises(ValueError, match="Agent cannot be None or empty."): AgentCardBuilder(agent=mock_agent) - def test_init_rejects_function_node(self): - """__init__ raises TypeError for a bare FunctionNode. - - FunctionNode is a BaseNode but is intended for use inside a - Workflow, not as a standalone A2A root. Without this guard the - builder would silently produce a degenerate "custom agent" card. - """ - - async def my_fn(node_input): - return f"echo: {node_input}" - - fn_node = FunctionNode(func=my_fn, name="echo_fn") - - with pytest.raises( - TypeError, match="requires a BaseAgent or Workflow, got FunctionNode" - ): - AgentCardBuilder(agent=fn_node) - - def test_init_rejects_arbitrary_object(self): - """__init__ raises TypeError for non-BaseNode objects.""" - with pytest.raises( - TypeError, match="requires a BaseAgent or Workflow, got str" - ): - AgentCardBuilder(agent="not an agent") - @patch("google.adk.a2a.utils.agent_card_builder._build_primary_skills") @patch("google.adk.a2a.utils.agent_card_builder._build_sub_agent_skills") async def test_build_success( @@ -239,89 +211,6 @@ async def test_build_raises_runtime_error_on_failure( ): await builder.build() - async def test_build_succeeds_for_llm_agent(self): - """AgentCardBuilder.build succeeds for a standalone LlmAgent. - - Regression coverage for the type-narrowing to BaseAgent | Workflow: - LlmAgent (a BaseAgent subclass) must continue to work end-to-end. - """ - agent = LlmAgent( - name="writer", - model="gemini-2.5-flash", - description="Writes a short reply.", - instruction="Write a short reply.", - ) - builder = AgentCardBuilder(agent=agent, rpc_url="http://localhost:8000/") - - card = await builder.build() - - assert isinstance(card, AgentCard) - assert card.name == "writer" - assert card.description == "Writes a short reply." - skill_ids = [skill.id for skill in card.skills] - assert "writer" in skill_ids - - async def test_build_succeeds_for_workflow_with_llm_agent_node(self): - """AgentCardBuilder.build succeeds for a Workflow (no sub_agents).""" - writer = LlmAgent( - name="writer", - model="gemini-2.5-flash", - description="Writes the reply.", - instruction="Write a short reply.", - ) - workflow = Workflow( - name="pipe", - description="A simple pipeline.", - edges=[(START, writer)], - ) - builder = AgentCardBuilder(agent=workflow, rpc_url="http://localhost:8000/") - - card = await builder.build() - - assert isinstance(card, AgentCard) - assert card.name == "pipe" - skill_ids = [skill.id for skill in card.skills] - assert "pipe" in skill_ids # primary workflow skill - assert any("writer" in sid for sid in skill_ids) # child node skill - - async def test_build_succeeds_for_workflow_with_output_schema_node(self): - """AgentCardBuilder.build succeeds for a Workflow whose LlmAgent has output_schema. - - Mirrors the exact repro from - https://github.com/google/adk-python/issues/5487. - """ - - class _Out(BaseModel): - text: str - - writer = LlmAgent( - name="writer", - model="gemini-2.5-flash", - instruction="Write a short reply.", - output_schema=_Out, - ) - workflow = Workflow(name="pipe", edges=[(START, writer)]) - builder = AgentCardBuilder(agent=workflow, rpc_url="http://localhost:8000/") - - card = await builder.build() - - assert card.name == "pipe" - primary_skill = next(s for s in card.skills if s.id == "pipe") - assert "graph_workflow" in primary_skill.tags - - async def test_build_succeeds_for_empty_workflow(self): - """AgentCardBuilder.build succeeds for a Workflow with no edges.""" - workflow = Workflow(name="empty_wf", description="An empty workflow.") - builder = AgentCardBuilder(agent=workflow, rpc_url="http://localhost:8000/") - - card = await builder.build() - - assert card.name == "empty_wf" - assert card.description == "An empty workflow." - # Only the primary skill, no orchestration skill since no child nodes. - assert len(card.skills) == 1 - assert "graph_workflow" in card.skills[0].tags - class TestHelperFunctions: """Test suite for helper functions.""" @@ -415,22 +304,6 @@ def test_get_agent_skill_name_custom_agent(self): # Assert assert result == "custom" - def test_get_agent_type_workflow(self): - """Test _get_agent_type for the v2 graph-based Workflow.""" - workflow = Workflow(name="wf") - - result = _get_agent_type(workflow) - - assert result == "graph_workflow" - - def test_get_agent_skill_name_workflow(self): - """Test _get_agent_skill_name for the v2 graph-based Workflow.""" - workflow = Workflow(name="wf") - - result = _get_agent_skill_name(workflow) - - assert result == "workflow" - def test_replace_pronouns_basic(self): """Test _replace_pronouns with basic pronoun replacement.""" # Arrange @@ -825,36 +698,6 @@ def test_get_workflow_description_custom_agent(self): # Assert assert result is None - def test_get_workflow_description_workflow_with_nodes(self): - """_get_workflow_description lists graph nodes for a Workflow.""" - writer = LlmAgent( - name="writer", - model="gemini-2.5-flash", - description="Writes the reply", - ) - reviewer = LlmAgent( - name="reviewer", - model="gemini-2.5-flash", - description="Reviews the reply", - ) - workflow = Workflow( - name="pipe", edges=[(START, writer), (writer, reviewer)] - ) - - result = _get_workflow_description(workflow) - - assert result is not None - assert "writer: Writes the reply" in result - assert "reviewer: Reviews the reply" in result - - def test_get_workflow_description_empty_workflow(self): - """_get_workflow_description returns None for a workflow with no nodes.""" - workflow = Workflow(name="empty_wf") - - result = _get_workflow_description(workflow) - - assert result is None - def test_build_sequential_description_single_agent(self): """Test _build_sequential_description with single sub-agent.""" # Arrange diff --git a/tests/unittests/a2a/utils/test_agent_to_a2a.py b/tests/unittests/a2a/utils/test_agent_to_a2a.py index c65bfe27f0..752df0ded3 100644 --- a/tests/unittests/a2a/utils/test_agent_to_a2a.py +++ b/tests/unittests/a2a/utils/test_agent_to_a2a.py @@ -26,15 +26,11 @@ from google.adk.a2a.utils.agent_card_builder import AgentCardBuilder from google.adk.a2a.utils.agent_to_a2a import to_a2a from google.adk.agents.base_agent import BaseAgent -from google.adk.agents.llm_agent import LlmAgent from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService from google.adk.auth.credential_service.in_memory_credential_service import InMemoryCredentialService from google.adk.memory.in_memory_memory_service import InMemoryMemoryService from google.adk.runners import Runner from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.workflow import FunctionNode -from google.adk.workflow import START -from google.adk.workflow import Workflow import pytest from starlette.applications import Starlette @@ -592,18 +588,19 @@ def test_to_a2a_with_none_agent(self): with pytest.raises(ValueError, match="Agent cannot be None or empty."): to_a2a(None) - def test_to_a2a_rejects_non_agent_non_workflow(self): - """to_a2a raises TypeError immediately for unsupported types. + async def test_to_a2a_with_invalid_agent_type(self): + """Test that to_a2a raises error when agent is not a BaseAgent.""" + # Arrange + invalid_agent = "not an agent" - Only BaseAgent (e.g. LlmAgent) and Workflow are valid - A2A roots. Other BaseNode subclasses (e.g. FunctionNode) and - arbitrary objects must be rejected at call time, not silently served - as a degenerate "custom agent" card. - """ + # Act & Assert + # The error occurs during lifespan startup when building the agent card + app = to_a2a(invalid_agent) with pytest.raises( - TypeError, match="requires a BaseAgent or Workflow, got str" + AttributeError, match="'str' object has no attribute 'name'" ): - to_a2a("not an agent") + async with app.router.lifespan_context(app): + pass @patch("google.adk.a2a.utils.agent_to_a2a.A2aAgentExecutor") @patch("google.adk.a2a.utils.agent_to_a2a.DefaultRequestHandler") @@ -1128,36 +1125,3 @@ async def custom_lifespan(app): "user_startup", "user_shutdown", ] - - async def test_to_a2a_succeeds_for_workflow(self): - """to_a2a accepts a Workflow and the Starlette lifespan completes.""" - writer = LlmAgent( - name="writer", - model="gemini-2.5-flash", - instruction="Write a short reply.", - ) - workflow = Workflow(name="pipe", edges=[(START, writer)]) - - app = to_a2a(workflow, port=8001) - - async with app.router.lifespan_context(app): - pass - - def test_to_a2a_rejects_function_node(self): - """to_a2a raises TypeError for a bare FunctionNode. - - FunctionNode is a BaseNode but is intended for use inside a - Workflow, not as a standalone A2A root. Passing one directly used - to silently produce a degenerate "custom agent" card; it now fails - fast at to_a2a() call time. - """ - - async def my_fn(node_input): - return f"echo: {node_input}" - - fn_node = FunctionNode(func=my_fn, name="echo_fn") - - with pytest.raises( - TypeError, match="requires a BaseAgent or Workflow, got FunctionNode" - ): - to_a2a(fn_node) diff --git a/tests/unittests/agents/llm/__init__.py b/tests/unittests/agents/llm/__init__.py deleted file mode 100644 index 58d482ea38..0000000000 --- a/tests/unittests/agents/llm/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/tests/unittests/agents/llm/event_utils.py b/tests/unittests/agents/llm/event_utils.py deleted file mode 100644 index ebe2743ebd..0000000000 --- a/tests/unittests/agents/llm/event_utils.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Shared test helpers for extracting data from Event lists.""" - -from __future__ import annotations - -from typing import Any - -from google.adk.events.event import Event - - -async def collect_events(node, ctx, node_input=None) -> list[Event]: - """Collect all events yielded by node.run().""" - events = [] - async for event in node.run(ctx=ctx, node_input=node_input): - events.append(event) - return events - - -def output_events(events: list[Event]) -> list[Event]: - """Filter to events that carry output.""" - return [e for e in events if e.output is not None] - - -def content_events(events: list[Event]) -> list[Event]: - """Filter to events that have content.""" - return [e for e in events if e.content and e.content.parts] - - -def text_parts(events: list[Event]) -> list[str]: - """Extract text strings from content events.""" - return [ - p.text.strip() - for e in content_events(events) - for p in e.content.parts - if p.text - ] - - -def function_call_names(events: list[Event]) -> list[str]: - """Extract function call names from content events.""" - return [ - p.function_call.name - for e in content_events(events) - for p in e.content.parts - if p.function_call - ] - - -def function_response_dicts(events: list[Event]) -> list[dict[str, Any]]: - """Extract function response dicts from events.""" - return [ - dict(p.function_response.response or {}) - for e in content_events(events) - for p in e.content.parts - if p.function_response - ] - - -def function_responses_by_name( - events: list[Event], -) -> dict[str, dict[str, Any]]: - """Extract {tool_name: response_dict} from function response events.""" - return { - p.function_response.name: dict(p.function_response.response or {}) - for e in content_events(events) - for p in e.content.parts - if p.function_response - } diff --git a/tests/unittests/agents/llm/task/__init__.py b/tests/unittests/agents/llm/task/__init__.py deleted file mode 100644 index 58d482ea38..0000000000 --- a/tests/unittests/agents/llm/task/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/tests/unittests/agents/llm/task/test_finish_task_tool.py b/tests/unittests/agents/llm/task/test_finish_task_tool.py deleted file mode 100644 index 9ce4025cbe..0000000000 --- a/tests/unittests/agents/llm/task/test_finish_task_tool.py +++ /dev/null @@ -1,363 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the finish_task_tool module.""" - -from __future__ import annotations - -from typing import Any -from unittest import mock - -from google.adk.agents.llm.task._finish_task_tool import FINISH_TASK_TOOL_NAME -from google.adk.agents.llm.task._finish_task_tool import FinishTaskTool -from pydantic import BaseModel -import pytest - - -class SampleOutputSchema(BaseModel): - """Sample Pydantic model for testing output schema.""" - - result: str - count: int - - -class NestedOutputSchema(BaseModel): - """Nested Pydantic model for testing complex schemas.""" - - name: str - details: dict - - -def _make_task_agent( - name='test_agent', - mode='task', - output_schema=None, -): - """Create a mock task agent for FinishTaskTool construction.""" - agent = mock.MagicMock() - agent.name = name - agent.mode = mode - agent.output_schema = output_schema - return agent - - -class TestFinishTaskTool: - """Tests for the FinishTaskTool class.""" - - def test_init_without_output_schema(self): - """Test FinishTaskTool initialization without output schema.""" - agent = _make_task_agent() - tool = FinishTaskTool(task_agent=agent) - assert tool.name == FINISH_TASK_TOOL_NAME - assert 'Signal that this agent has completed' in tool.description - assert 'output data' not in tool.description - - def test_init_with_output_schema(self): - """Test FinishTaskTool initialization with output schema.""" - agent = _make_task_agent(output_schema=SampleOutputSchema) - tool = FinishTaskTool(task_agent=agent) - assert tool.name == FINISH_TASK_TOOL_NAME - assert tool.output_schema is SampleOutputSchema - assert 'Signal that this agent has completed' in tool.description - assert 'output data' in tool.description - - def test_get_declaration_without_output_schema(self): - """Test function declaration generation without output schema.""" - agent = _make_task_agent() - tool = FinishTaskTool(task_agent=agent) - declaration = tool._get_declaration() - - assert declaration is not None - assert declaration.name == FINISH_TASK_TOOL_NAME - assert declaration.parameters_json_schema is not None - schema = declaration.parameters_json_schema - assert 'result' in schema.get('properties', {}) - - def test_get_declaration_with_output_schema(self): - """Test function declaration generation with output schema.""" - agent = _make_task_agent(output_schema=SampleOutputSchema) - tool = FinishTaskTool(task_agent=agent) - declaration = tool._get_declaration() - - assert declaration is not None - assert declaration.name == FINISH_TASK_TOOL_NAME - assert declaration.parameters_json_schema is not None - schema = declaration.parameters_json_schema - assert 'result' in schema.get('properties', {}) - assert 'count' in schema.get('properties', {}) - - @pytest.mark.asyncio - async def test_run_async_returns_confirmation(self): - """Test that run_async returns a confirmation message.""" - agent = _make_task_agent() - tool = FinishTaskTool(task_agent=agent) - mock_tool_context = mock.MagicMock() - - result = await tool.run_async( - args={'result': 'done'}, tool_context=mock_tool_context - ) - - assert result == 'Task completed.' - - @pytest.mark.asyncio - async def test_run_async_with_args(self): - """Test that run_async validates args and returns confirmation.""" - agent = _make_task_agent(output_schema=SampleOutputSchema) - tool = FinishTaskTool(task_agent=agent) - mock_tool_context = mock.MagicMock() - - result = await tool.run_async( - args={'result': 'success', 'count': 42}, - tool_context=mock_tool_context, - ) - - assert result == 'Task completed.' - - -class TestBuildInstruction: - """Tests for the _build_instruction method.""" - - def test_instruction_content(self): - """Test instruction generation contains expected content.""" - agent = _make_task_agent() - tool = FinishTaskTool(task_agent=agent) - instruction = tool._build_instruction() - - assert 'finish_task' in instruction - assert 'Do NOT call `finish_task` prematurely' in instruction - assert 'call `finish_task` by itself with' in instruction - - -class TestProcessLlmRequest: - """Tests for the process_llm_request method.""" - - @pytest.mark.asyncio - async def test_process_llm_request_adds_tool_and_instruction(self): - """Test that process_llm_request adds tool and instruction.""" - agent = _make_task_agent() - tool = FinishTaskTool(task_agent=agent) - mock_tool_context = mock.MagicMock() - mock_tool_context._invocation_context.branch = None - mock_tool_context.session.events = [] - mock_llm_request = mock.MagicMock() - mock_llm_request.append_tools = mock.MagicMock() - mock_llm_request.append_instructions = mock.MagicMock() - - await tool.process_llm_request( - tool_context=mock_tool_context, llm_request=mock_llm_request - ) - - # Should add tool via parent's process_llm_request - mock_llm_request.append_tools.assert_called_once_with([tool]) - # Should append instruction (at least the base instruction) - mock_llm_request.append_instructions.assert_called() - instruction_arg = mock_llm_request.append_instructions.call_args_list[0][0][ - 0 - ] - assert len(instruction_arg) == 1 - assert 'finish_task' in instruction_arg[0] - - -class TestFinishTaskToolName: - """Tests for the FINISH_TASK_TOOL_NAME constant.""" - - def test_constant_value(self): - """Test that the constant has the expected value.""" - assert FINISH_TASK_TOOL_NAME == 'finish_task' - - -class TestFinishTaskToolValidation: - """Tests for the FinishTaskTool argument validation.""" - - @pytest.mark.asyncio - async def test_run_async_validation_error_missing_required_field(self): - """Test that validation error is returned when required fields are missing.""" - agent = _make_task_agent(output_schema=SampleOutputSchema) - tool = FinishTaskTool(task_agent=agent) - mock_tool_context = mock.MagicMock() - - # Missing 'count' field which is required - result = await tool.run_async( - args={'result': 'success'}, - tool_context=mock_tool_context, - ) - - assert isinstance(result, dict) - assert 'error' in result - assert 'finish_task' in result['error'] - assert 'validation errors' in result['error'] - assert 'count' in result['error'] - - @pytest.mark.asyncio - async def test_run_async_validation_error_wrong_type(self): - """Test that validation error is returned when types are wrong.""" - agent = _make_task_agent(output_schema=SampleOutputSchema) - tool = FinishTaskTool(task_agent=agent) - mock_tool_context = mock.MagicMock() - - # 'count' should be int, not string - result = await tool.run_async( - args={'result': 'success', 'count': 'not_an_int'}, - tool_context=mock_tool_context, - ) - - assert isinstance(result, dict) - assert 'error' in result - assert 'validation errors' in result['error'] - - @pytest.mark.asyncio - async def test_run_async_validation_passes_with_valid_args(self): - """Test that validation passes with valid args.""" - agent = _make_task_agent(output_schema=SampleOutputSchema) - tool = FinishTaskTool(task_agent=agent) - mock_tool_context = mock.MagicMock() - - result = await tool.run_async( - args={'result': 'success', 'count': 42}, - tool_context=mock_tool_context, - ) - - assert result == 'Task completed.' - - -class TestFinishTaskToolAllSchemaTypes: - """Tests for FinishTaskTool across all supported SchemaType variants. - - Object schemas (BaseModel, dict) use parameters directly. - Non-object schemas (str, int, bool, float, list) are wrapped in a - JSON object with a 'result' key so they can be used as function - parameters. - """ - - @pytest.mark.parametrize( - 'output_schema, expected_wrapper_key', - [ - (SampleOutputSchema, None), - (dict[str, Any], None), - (str, 'result'), - (int, 'result'), - (bool, 'result'), - (float, 'result'), - (list[str], 'result'), - (list[int], 'result'), - (list[SampleOutputSchema], 'result'), - ], - ids=[ - 'BaseModel', - 'dict', - 'str', - 'int', - 'bool', - 'float', - 'list_str', - 'list_int', - 'list_BaseModel', - ], - ) - def test_wrapper_key(self, output_schema, expected_wrapper_key): - """Verify wrapper key is set correctly for each schema type.""" - agent = _make_task_agent(output_schema=output_schema) - tool = FinishTaskTool(task_agent=agent) - assert tool._wrapper_key == expected_wrapper_key - - @pytest.mark.parametrize( - 'output_schema', - [str, int, bool, float, list[str], list[int], list[SampleOutputSchema]], - ids=[ - 'str', - 'int', - 'bool', - 'float', - 'list_str', - 'list_int', - 'list_BaseModel', - ], - ) - def test_get_declaration_wrapped_schema(self, output_schema): - """Non-object schemas produce a declaration with 'result' property.""" - agent = _make_task_agent(output_schema=output_schema) - tool = FinishTaskTool(task_agent=agent) - declaration = tool._get_declaration() - - assert declaration is not None - assert declaration.name == FINISH_TASK_TOOL_NAME - schema = declaration.parameters_json_schema - assert schema is not None - assert 'result' in schema.get('properties', {}) - - @pytest.mark.parametrize( - 'output_schema, args, expected_output', - [ - ( - SampleOutputSchema, - {'result': 'done', 'count': 5}, - {'result': 'done', 'count': 5}, - ), - (dict[str, Any], {'key': 'value'}, {'key': 'value'}), - (str, {'result': 'hello'}, 'hello'), - (int, {'result': 42}, 42), - (bool, {'result': True}, True), - (float, {'result': 3.14}, 3.14), - (list[str], {'result': ['a', 'b', 'c']}, ['a', 'b', 'c']), - (list[int], {'result': [1, 2, 3]}, [1, 2, 3]), - ( - list[SampleOutputSchema], - {'result': [{'result': 'ok', 'count': 1}]}, - [{'result': 'ok', 'count': 1}], - ), - (list[str], {'result': []}, []), - ], - ids=[ - 'BaseModel', - 'dict', - 'str', - 'int', - 'bool', - 'float', - 'list_str', - 'list_int', - 'list_BaseModel', - 'list_str_empty', - ], - ) - @pytest.mark.asyncio - async def test_run_async(self, output_schema, args, expected_output): - """Verify run_async validates and extracts output for each schema type.""" - agent = _make_task_agent(output_schema=output_schema) - tool = FinishTaskTool(task_agent=agent) - mock_tool_context = mock.MagicMock() - - result = await tool.run_async( - args=args, - tool_context=mock_tool_context, - ) - - # Task Delegation API: tool no longer writes actions.finish_task. The - # LlmAgent task wrapper sniffs the FC's `output` arg directly to - # set event.output. The tool just performs schema validation. - assert result == 'Task completed.' - del expected_output # validated_output is no longer surfaced via actions - - def test_get_declaration_list_basemodel_defs_at_root(self): - """Non-object schemas with $defs should hoist $defs to root level.""" - agent = _make_task_agent(output_schema=list[SampleOutputSchema]) - tool = FinishTaskTool(task_agent=agent) - declaration = tool._get_declaration() - - schema = declaration.parameters_json_schema - # $defs must be at the root, not nested inside properties.result - assert '$defs' in schema - assert 'SampleOutputSchema' in schema['$defs'] - # The nested result schema should not contain $defs - assert '$defs' not in schema['properties']['result'] diff --git a/tests/unittests/agents/test_agent_clone.py b/tests/unittests/agents/test_agent_clone.py index 284708045b..541a463669 100644 --- a/tests/unittests/agents/test_agent_clone.py +++ b/tests/unittests/agents/test_agent_clone.py @@ -296,31 +296,24 @@ def test_clone_preserves_agent_type(): assert isinstance(llm_cloned, LlmAgent) # Test SequentialAgent - seq_original = SequentialAgent( - name="seq_test", sub_agents=[LlmAgent(name="dummy_seq")] - ) + seq_original = SequentialAgent(name="seq_test") seq_cloned = seq_original.clone() assert isinstance(seq_cloned, SequentialAgent) # Test ParallelAgent - par_original = ParallelAgent( - name="par_test", sub_agents=[LlmAgent(name="dummy_par")] - ) + par_original = ParallelAgent(name="par_test") par_cloned = par_original.clone() assert isinstance(par_cloned, ParallelAgent) # Test LoopAgent - loop_original = LoopAgent( - name="loop_test", sub_agents=[LlmAgent(name="dummy_loop")] - ) + loop_original = LoopAgent(name="loop_test") loop_cloned = loop_original.clone() assert isinstance(loop_cloned, LoopAgent) def test_clone_with_agent_specific_fields(): # Test LoopAgent - dummy = LlmAgent(name="dummy") - loop_original = LoopAgent(name="loop_test", sub_agents=[dummy]) + loop_original = LoopAgent(name="loop_test") loop_cloned = loop_original.clone({"max_iterations": 10}) assert isinstance(loop_cloned, LoopAgent) assert loop_cloned.max_iterations == 10 diff --git a/tests/unittests/agents/test_agent_config.py b/tests/unittests/agents/test_agent_config.py index 99ee1d8401..380078ec50 100644 --- a/tests/unittests/agents/test_agent_config.py +++ b/tests/unittests/agents/test_agent_config.py @@ -260,35 +260,51 @@ def test_agent_config_discriminator_llm_agent_with_sub_agents( assert config.root.agent_class == agent_class_value -def test_agent_config_model_code_resolves_preconfigured_client(tmp_path: Path): - """model_code references a pre-built model instance by fully qualified name. - - Configured clients (custom api_base, etc.) must be constructed in Python - and referenced from YAML; YAML cannot pass constructor arguments. - """ - preconfigured = LiteLlm( - model="kimi/k2", api_base="https://proxy.litellm.ai/v1" - ) - +def test_agent_config_litellm_model_with_custom_args(tmp_path: Path): yaml_content = """\ name: managed_api_agent description: Agent using LiteLLM managed endpoint instruction: Respond concisely. model_code: - name: my_library.clients.my_litellm + name: google.adk.models.lite_llm.LiteLlm + args: + - name: model + value: kimi/k2 + - name: api_base + value: https://proxy.litellm.ai/v1 """ config_file = tmp_path / "litellm_agent.yaml" config_file.write_text(yaml_content) - with mock.patch.object( - config_agent_utils, - "resolve_code_reference", - return_value=preconfigured, - ): - agent = config_agent_utils.from_config(str(config_file)) + agent = config_agent_utils.from_config(str(config_file)) + + assert isinstance(agent, LlmAgent) + assert isinstance(agent.model, LiteLlm) + assert agent.model.model == "kimi/k2" + assert agent.model._additional_args.get("api_base") == ( + "https://proxy.litellm.ai/v1" + ) + + +def test_agent_config_legacy_model_mapping_still_supported(tmp_path: Path): + yaml_content = """\ +name: managed_api_agent +description: Agent using LiteLLM managed endpoint +instruction: Respond concisely. +model: + name: google.adk.models.lite_llm.LiteLlm + args: + - name: model + value: kimi/k2 +""" + config_file = tmp_path / "legacy_litellm_agent.yaml" + config_file.write_text(yaml_content) + + agent = config_agent_utils.from_config(str(config_file)) assert isinstance(agent, LlmAgent) - assert agent.model is preconfigured + assert isinstance(agent.model, LiteLlm) + assert agent.model.model == "kimi/k2" def test_agent_config_discriminator_custom_agent(): @@ -319,66 +335,6 @@ class MyCustomAgentConfig(BaseAgentConfig): assert my_custom_config.other_field == "other value" -def test_from_config_passes_extra_yaml_fields_to_custom_agent_constructor( - tmp_path: Path, -): - """Custom agent fields in YAML reach the constructor without a custom config_type. - - Mirrors the 1.x AgentConfigMapper behavior: a custom agent subclass with - extra Pydantic fields declared on the agent (not on a config_type) can - populate those fields directly from YAML. - """ - - class MyCustomAgent(BaseAgent): - custom_field: str = "" - - yaml_content = """\ -agent_class: mylib.agents.MyCustomAgent -name: custom_agent -description: a custom agent -custom_field: hello from yaml -""" - config_file = tmp_path / "custom_agent.yaml" - config_file.write_text(yaml_content) - - with mock.patch.object( - config_agent_utils, - "resolve_fully_qualified_name", - return_value=MyCustomAgent, - ): - agent = config_agent_utils.from_config(str(config_file)) - - assert isinstance(agent, MyCustomAgent) - assert agent.custom_field == "hello from yaml" - - -def test_from_config_ignores_extra_yaml_fields_not_on_agent(tmp_path: Path): - """Extra YAML keys that don't map to constructor params are silently dropped.""" - - class MyCustomAgent(BaseAgent): - custom_field: str = "" - - yaml_content = """\ -agent_class: mylib.agents.MyCustomAgent -name: custom_agent -description: a custom agent -custom_field: kept -unknown_field: dropped -""" - config_file = tmp_path / "custom_agent.yaml" - config_file.write_text(yaml_content) - - with mock.patch.object( - config_agent_utils, - "resolve_fully_qualified_name", - return_value=MyCustomAgent, - ): - agent = config_agent_utils.from_config(str(config_file)) - - assert agent.custom_field == "kept" - assert not hasattr(agent, "unknown_field") - - @pytest.mark.parametrize( ("config_rel_path", "child_rel_path", "child_name", "instruction"), [ @@ -465,3 +421,23 @@ def fake_from_config(path: str): ) assert result == "sentinel" assert recorded["path"] == expected_path + + +def test_load_config_from_path_blocks_args_when_enforced(tmp_path): + """Verify _load_config_from_path blocks 'args' when enforcement is enabled.""" + config_file = tmp_path / "malicious.yaml" + config_file.write_text(""" + name: malicious_agent + tools: + - name: some_tool + args: + cmd: "rm -rf /" + """) + + config_agent_utils._set_enforce_denylist(True) + try: + with pytest.raises(ValueError) as exc_info: + config_agent_utils._load_config_from_path(str(config_file)) + assert "Blocked key 'args' found" in str(exc_info.value) + finally: + config_agent_utils._set_enforce_denylist(False) diff --git a/tests/unittests/agents/test_context.py b/tests/unittests/agents/test_context.py index b1c1303964..0ef15b075b 100644 --- a/tests/unittests/agents/test_context.py +++ b/tests/unittests/agents/test_context.py @@ -619,31 +619,3 @@ def test_render_ui_widget_duplicate(self, mock_invocation_context): assert len(context.actions.render_ui_widgets) == 1 assert context.actions.render_ui_widgets[0] is w1 - - -class TestDeriveScheduler: - """Tests for _derive_scheduler helper.""" - - def test_derive_scheduler_no_parent(self): - from google.adk.agents.context import _derive_scheduler - - assert _derive_scheduler(None) is None - - def test_derive_scheduler_with_parent_having_scheduler(self): - from google.adk.agents.context import _derive_scheduler - - mock_parent = MagicMock() - mock_scheduler = MagicMock() - mock_parent._workflow_scheduler = mock_scheduler - - assert _derive_scheduler(mock_parent) is mock_scheduler - - def test_derive_scheduler_with_parent_no_scheduler(self): - from google.adk.agents.context import _derive_scheduler - from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler - - mock_parent = MagicMock() - mock_parent._workflow_scheduler = None - - scheduler = _derive_scheduler(mock_parent) - assert isinstance(scheduler, DynamicNodeScheduler) diff --git a/tests/unittests/agents/test_invocation_context.py b/tests/unittests/agents/test_invocation_context.py index 4283692f4a..87f78b2869 100644 --- a/tests/unittests/agents/test_invocation_context.py +++ b/tests/unittests/agents/test_invocation_context.py @@ -172,13 +172,15 @@ def test_should_pause_invocation_with_resumable_app(self, event_to_pause): assert mock_invocation_context.should_pause_invocation(event_to_pause) - def test_should_pause_invocation_with_non_resumable_app(self, event_to_pause): - """Tests should_pause_invocation pauses even without resumability.""" + def test_should_not_pause_invocation_with_non_resumable_app( + self, event_to_pause + ): + """Tests should_pause_invocation with a non-resumable app.""" invocation_context = self._create_test_invocation_context( ResumabilityConfig(is_resumable=False) ) - assert invocation_context.should_pause_invocation(event_to_pause) + assert not invocation_context.should_pause_invocation(event_to_pause) def test_should_not_pause_invocation_with_no_long_running_tool_ids( self, event_to_pause @@ -310,9 +312,7 @@ def test_populate_invocation_agent_states_with_content_no_state(self): ) invocation_context.session.events = [event] invocation_context.populate_invocation_agent_states() - assert invocation_context.agent_states == { - 'agent1': BaseAgentState().model_dump(mode='json') - } + assert invocation_context.agent_states == {'agent1': BaseAgentState()} assert invocation_context.end_of_agents == {'agent1': False} def test_populate_invocation_agent_states_user_message_event(self): diff --git a/tests/unittests/agents/test_invocation_context_process_queue.py b/tests/unittests/agents/test_invocation_context_process_queue.py deleted file mode 100644 index 2f99f0dc35..0000000000 --- a/tests/unittests/agents/test_invocation_context_process_queue.py +++ /dev/null @@ -1,159 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for _event_queue and _enqueue_event on InvocationContext.""" - -from __future__ import annotations - -import asyncio - -from google.adk.agents.invocation_context import InvocationContext -from google.adk.agents.llm_agent import LlmAgent -from google.adk.events.event import Event -from google.adk.sessions.in_memory_session_service import InMemorySessionService -import pytest - - -async def _create_ic_with_queue() -> InvocationContext: - """Create a minimal InvocationContext with _event_queue set.""" - agent = LlmAgent( - name='test_agent', - model='gemini-2.5-flash', - instruction='test', - ) - session_service = InMemorySessionService() - session = await session_service.create_session( - app_name='test_app', user_id='test_user' - ) - ic = InvocationContext( - invocation_id='test_invocation', - agent=agent, - session=session, - session_service=session_service, - ) - ic._event_queue = asyncio.Queue() - return ic - - -async def _create_ic_without_queue() -> InvocationContext: - """Create a minimal InvocationContext without _event_queue.""" - agent = LlmAgent( - name='test_agent', - model='gemini-2.5-flash', - instruction='test', - ) - session_service = InMemorySessionService() - session = await session_service.create_session( - app_name='test_app', user_id='test_user' - ) - return InvocationContext( - invocation_id='test_invocation', - agent=agent, - session=session, - session_service=session_service, - ) - - -@pytest.mark.asyncio -async def test_non_partial_event_blocks_until_processed() -> None: - """A non-partial event should block _enqueue_event until the consumer - signals processed.""" - ic: InvocationContext = await _create_ic_with_queue() - event: Event = Event(id=Event.new_id(), author='test') - - completed: bool = False - - async def consumer() -> None: - nonlocal completed - ev, processed = await ic._event_queue.get() - assert ev is event - assert processed is not None - processed.set() - completed = True - - consumer_task: asyncio.Task = asyncio.create_task(consumer()) - await ic._enqueue_event(event) - await consumer_task - - assert completed, 'Consumer should have processed the event.' - - -@pytest.mark.asyncio -async def test_partial_event_does_not_block() -> None: - """A partial event should not block — it returns immediately - without waiting for a processed signal.""" - ic: InvocationContext = await _create_ic_with_queue() - event: Event = Event(id=Event.new_id(), author='test', partial=True) - - await ic._enqueue_event(event) - - assert not ic._event_queue.empty() - ev, processed = await ic._event_queue.get() - assert ev is event - assert processed is None, 'Partial events should have no processed signal.' - - -@pytest.mark.asyncio -async def test_events_arrive_in_order() -> None: - """Multiple partial events should arrive on the queue in order.""" - ic: InvocationContext = await _create_ic_with_queue() - events: list[Event] = [ - Event(id=Event.new_id(), author=f'test_{i}', partial=True) - for i in range(5) - ] - - for event in events: - await ic._enqueue_event(event) - - for i in range(5): - ev, _ = await ic._event_queue.get() - assert ev.author == f'test_{i}' - - -@pytest.mark.asyncio -async def test_enqueue_event_raises_when_queue_not_set() -> None: - """_enqueue_event should raise RuntimeError if _event_queue is None.""" - ic: InvocationContext = await _create_ic_without_queue() - event: Event = Event(id=Event.new_id(), author='test') - - with pytest.raises(RuntimeError, match='_event_queue is not set'): - await ic._enqueue_event(event) - - -@pytest.mark.asyncio -async def test_non_partial_event_waits_for_signal() -> None: - """Verify that _enqueue_event for a non-partial event actually waits — - it should not complete before the consumer signals.""" - ic: InvocationContext = await _create_ic_with_queue() - event: Event = Event(id=Event.new_id(), author='test') - - emit_done: bool = False - - async def emitter() -> None: - nonlocal emit_done - await ic._enqueue_event(event) - emit_done = True - - emit_task: asyncio.Task = asyncio.create_task(emitter()) - - # Give the emitter a chance to run. - await asyncio.sleep(0.01) - assert not emit_done, '_enqueue_event should still be waiting.' - - # Now consume and signal. - _, processed = await ic._event_queue.get() - processed.set() - - await emit_task - assert emit_done, '_enqueue_event should complete after signal.' diff --git a/tests/unittests/agents/test_langgraph_agent.py b/tests/unittests/agents/test_langgraph_agent.py index a399722209..19ba55a687 100644 --- a/tests/unittests/agents/test_langgraph_agent.py +++ b/tests/unittests/agents/test_langgraph_agent.py @@ -230,7 +230,6 @@ async def test_langgraph_agent( } mock_parent_context = MagicMock(spec=InvocationContext) - mock_parent_context._state_schema = None mock_session = MagicMock() mock_parent_context.session = mock_session mock_parent_context.user_content = types.Content( diff --git a/tests/unittests/agents/test_live_request_queue.py b/tests/unittests/agents/test_live_request_queue.py index 1bcf92574b..ab98894daf 100644 --- a/tests/unittests/agents/test_live_request_queue.py +++ b/tests/unittests/agents/test_live_request_queue.py @@ -1,17 +1,3 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - from unittest.mock import AsyncMock from unittest.mock import MagicMock from unittest.mock import patch diff --git a/tests/unittests/agents/test_llm_agent_error_messages.py b/tests/unittests/agents/test_llm_agent_error_messages.py index 9bd155f284..3f1ca47abb 100644 --- a/tests/unittests/agents/test_llm_agent_error_messages.py +++ b/tests/unittests/agents/test_llm_agent_error_messages.py @@ -14,7 +14,7 @@ """Tests for enhanced error messages in agent handling.""" -from google.adk.agents.llm_agent import LlmAgent +from google.adk.agents import LlmAgent import pytest diff --git a/tests/unittests/agents/test_llm_agent_fields.py b/tests/unittests/agents/test_llm_agent_fields.py index 92f3c34e49..1158138fbc 100644 --- a/tests/unittests/agents/test_llm_agent_fields.py +++ b/tests/unittests/agents/test_llm_agent_fields.py @@ -96,35 +96,6 @@ def test_canonical_model_inherit(): assert sub_agent.canonical_model == parent_agent.canonical_model -def test_canonical_live_model_default_fallback(): - original_default = LlmAgent._default_live_model - LlmAgent.set_default_live_model('gemini-2.0-flash') - try: - agent = LlmAgent(name='test_agent') - assert agent.canonical_live_model.model == 'gemini-2.0-flash' - finally: - LlmAgent.set_default_live_model(original_default) - - -def test_canonical_live_model_str(): - agent = LlmAgent(name='test_agent', model='gemini-pro') - assert agent.canonical_live_model.model == 'gemini-pro' - - -def test_canonical_live_model_llm(): - llm = LLMRegistry.new_llm('gemini-pro') - agent = LlmAgent(name='test_agent', model=llm) - assert agent.canonical_live_model == llm - - -def test_canonical_live_model_inherit(): - sub_agent = LlmAgent(name='sub_agent') - parent_agent = LlmAgent( - name='parent_agent', model='gemini-pro', sub_agents=[sub_agent] - ) - assert sub_agent.canonical_live_model == parent_agent.canonical_live_model - - async def test_canonical_instruction_str(): agent = LlmAgent(name='test_agent', instruction='instruction') ctx = await _create_readonly_context(agent) diff --git a/tests/unittests/agents/test_llm_agent_include_contents.py b/tests/unittests/agents/test_llm_agent_include_contents.py index c24aab4ef0..a196f93553 100644 --- a/tests/unittests/agents/test_llm_agent_include_contents.py +++ b/tests/unittests/agents/test_llm_agent_include_contents.py @@ -221,8 +221,8 @@ async def test_include_contents_none_sequential_agents(): simplified_events = [event for event in events if event.content] assert len(simplified_events) == 2 - assert "Agent1 response" in str(simplified_events[0].content) - assert "Agent2 final response" in str(simplified_events[1].content) + assert simplified_events[0].author == "agent1" + assert simplified_events[1].author == "agent2" # Agent1 sees original user request agent1_contents = testing_utils.simplify_contents( diff --git a/tests/unittests/agents/test_llm_agent_interruptions.py b/tests/unittests/agents/test_llm_agent_interruptions.py deleted file mode 100644 index db9fb7c382..0000000000 --- a/tests/unittests/agents/test_llm_agent_interruptions.py +++ /dev/null @@ -1,481 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk.agents import LlmAgent -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.tools.function_tool import FunctionTool -from google.adk.tools.long_running_tool import LongRunningFunctionTool -from google.adk.tools.tool_context import ToolContext -from google.genai import types -import pytest - -from tests.unittests import testing_utils -from tests.unittests.agents.llm.event_utils import text_parts - -_USER_ID = 'test_user' -_SESSION_ID = 'test_session' - - -async def _setup_runner(mock_model, tools=None, **agent_kwargs): - """Setup runner with LlmAgent directly.""" - llm_agent = LlmAgent( - name='test_agent', - model=mock_model, - tools=tools or [], - **agent_kwargs, - ) - session_service = InMemorySessionService() - await session_service.create_session( - app_name='test', user_id=_USER_ID, session_id=_SESSION_ID - ) - runner = Runner( - app_name='test', - agent=llm_agent, - session_service=session_service, - ) - return runner - - -async def _run_turn(runner, user_message): - """Run a single turn.""" - return [ - e - async for e in runner.run_async( - user_id=_USER_ID, - session_id=_SESSION_ID, - new_message=types.Content( - role='user', parts=[types.Part(text=user_message)] - ), - ) - ] - - -async def _resume_turn( - runner, prev_events, tool_name, tool_response_value='done' -): - """Resume after an interrupt.""" - fc_ids = [] - for e in prev_events: - if e.content and e.content.parts: - for p in e.content.parts: - if ( - p.function_call - and p.function_call.name == tool_name - and p.function_call.id - ): - fc_ids.append(p.function_call.id) - if getattr(e.output, 'function_calls', None): - for fc in e.output.function_calls: - if fc.name == tool_name and fc.id: - fc_ids.append(fc.id) - - if not fc_ids: - for e in prev_events: - if e.long_running_tool_ids: - fc_ids = list(e.long_running_tool_ids) - break - - invocation_id = prev_events[0].invocation_id - - fr_parts = [ - types.Part( - function_response=types.FunctionResponse( - name=tool_name, - id=fc_id, - response={'result': tool_response_value}, - ) - ) - for fc_id in fc_ids - ] - resume_msg = types.Content(role='user', parts=fr_parts) - - return [ - e - async for e in runner.run_async( - user_id=_USER_ID, - session_id=_SESSION_ID, - invocation_id=invocation_id, - new_message=resume_msg, - ) - ] - - -def create_lro_tool(name: str = 'long_running_op') -> LongRunningFunctionTool: - """Creates a minimal LRO tool for testing.""" - - def _impl() -> None: - return None - - _impl.__name__ = name - return LongRunningFunctionTool(_impl) - - -# --------------------------------------------------------------------------- -# Tests: Single Agent -# --------------------------------------------------------------------------- - - -class TestSingleAgentInterruptions: - """Tests for single agent triggering interruptions.""" - - async def test_single_agent_yields_on_long_running_tool(self): - """Single agent yields on Long Running Tool. - - Arrange: Set up a single agent with a long running tool. - Act: Run the agent with a prompt that triggers the tool. - Assert: Verify that the execution yields a long running tool interrupt. - """ - - fc = types.Part.from_function_call(name='long_running_op', args={}) - mock_model = testing_utils.MockModel.create(responses=[fc, 'Final answer']) - - lro_tool = create_lro_tool() - runner = await _setup_runner(mock_model, tools=[lro_tool]) - - # Act: Run first turn - events = await _run_turn(runner, 'Go') - - # Assert: Should have triggered function call - assert any( - any( - p.function_call and p.function_call.name == 'long_running_op' - for p in e.content.parts or [] - ) - for e in events - ) - assert len(mock_model.requests) == 1 - - # Act: Resume - resume_events = await _resume_turn(runner, events, 'long_running_op') - - # Assert: Should have completed - assert any('Final answer' in t for t in text_parts(resume_events)) - assert len(mock_model.requests) == 2 - - async def test_single_agent_request_input_tool_interrupt_and_resume(self): - """Test that using RequestInputTool successfully triggers an interrupt and resumes with user input.""" - from google.adk.tools import request_input - - fc = types.Part.from_function_call( - name='adk_request_input', - args={'message': 'Which file?', 'response_schema': {'type': 'string'}}, - ) - mock_model = testing_utils.MockModel.create( - responses=[fc, 'Continuing with file: file_a.txt'] - ) - - runner = await _setup_runner(mock_model, tools=[request_input]) - - # Act: Run first turn - events = await _run_turn(runner, 'Start') - - # Assert: Verify the interrupt event is produced - assert any(e.long_running_tool_ids for e in events) - assert any( - any( - p.function_call and p.function_call.name == 'adk_request_input' - for p in e.content.parts or [] - ) - for e in events - ) - - # Act: Resume with the response - resume_events = await _resume_turn( - runner, events, 'adk_request_input', tool_response_value='file_a.txt' - ) - - # Assert: Execution should continue with user response in the prompt history - assert len(mock_model.requests) == 2 - - # Assert: Verify the second request contains the FunctionCall & FunctionResponse pair - second_req_contents = mock_model.requests[1].contents - assert any( - any( - p.function_call and p.function_call.name == 'adk_request_input' - for p in c.parts or [] - ) - for c in second_req_contents - ) - assert any( - any( - p.function_response - and p.function_response.name == 'adk_request_input' - for p in c.parts or [] - ) - for c in second_req_contents - ) - - async def test_single_agent_request_input_tool_structured_schema(self): - """Test that using RequestInputTool with a structured object schema successfully interrupts and resumes with a dictionary response.""" - from google.adk.tools import request_input - - schema = { - 'type': 'object', - 'properties': { - 'host': {'type': 'string'}, - 'port': {'type': 'integer'}, - }, - 'required': ['host'], - } - fc = types.Part.from_function_call( - name='adk_request_input', - args={ - 'message': 'Provide DB connection details:', - 'response_schema': schema, - }, - ) - mock_model = testing_utils.MockModel.create( - responses=[fc, 'Connected to localhost:3306'] - ) - - runner = await _setup_runner(mock_model, tools=[request_input]) - - # Act: Run first turn - events = await _run_turn(runner, 'Start') - - # Assert: Verify the interrupt event is produced with the schema args - assert any(e.long_running_tool_ids for e in events) - fc_event = next( - e - for e in events - if e.content - and any( - p.function_call and p.function_call.name == 'adk_request_input' - for p in e.content.parts or [] - ) - ) - fc_part = next(p for p in fc_event.content.parts if p.function_call) - assert fc_part.function_call.args['response_schema'] == schema - - # Act: Resume with a structured dict response - db_details = {'host': 'localhost', 'port': 3306} - resume_events = await _resume_turn( - runner, events, 'adk_request_input', tool_response_value=db_details - ) - - # Assert: Execution should continue with the structured user response - assert len(mock_model.requests) == 2 - - # Assert: Verify the second request contains the FunctionCall & FunctionResponse pair - second_req_contents = mock_model.requests[1].contents - assert any( - any( - p.function_call and p.function_call.name == 'adk_request_input' - for p in c.parts or [] - ) - for c in second_req_contents - ) - assert any( - any( - p.function_response - and p.function_response.name == 'adk_request_input' - for p in c.parts or [] - ) - for c in second_req_contents - ) - - -class TestNestedAgentInterruptions: - """Tests for multi-agent setups with interruptions.""" - - async def test_child_agent_interrupt_and_resume(self): - """Child agent yields on LRO and resumes successfully. - - Arrange: Parent agent with Child agent. Parent transfers to Child. - Child calls LRO tool. - Act: Run, expect LRO interrupt. Then resume. - Assert: Should complete successfully. - """ - - def transfer_to_child(tool_context: ToolContext) -> str: - tool_context.actions.transfer_to_agent = 'child_agent' - return 'transferring' - - # Child agent - fc_child = types.Part.from_function_call(name='child_lro', args={}) - child_mock_model = testing_utils.MockModel.create( - responses=[fc_child, 'Child final answer'] - ) - - lro_tool = create_lro_tool('child_lro') - - child_agent = LlmAgent( - name='child_agent', - model=child_mock_model, - tools=[lro_tool], - ) - - # Parent agent - fc_parent = types.Part.from_function_call(name='transfer_to_child', args={}) - parent_mock_model = testing_utils.MockModel.create( - responses=[fc_parent, fc_parent, 'Parent final answer'] - ) - - parent_agent = LlmAgent( - name='parent_agent', - model=parent_mock_model, - tools=[transfer_to_child], - sub_agents=[child_agent], - ) - - # Setup runner - session_service = InMemorySessionService() - await session_service.create_session( - app_name='test', user_id=_USER_ID, session_id=_SESSION_ID - ) - runner = Runner( - app_name='test', agent=parent_agent, session_service=session_service - ) - - # When Parent runs the first turn - events = await _run_turn(runner, 'Go') - - # Then it should trigger child LRO interrupt - assert any(e.long_running_tool_ids for e in events) - - # When Parent resumes the turn - resume_events = await _resume_turn(runner, events, 'child_lro') - - # Then it should complete successfully - assert any('Child final answer' in t for t in text_parts(resume_events)) - - @pytest.mark.xfail(reason='Task agent as subagent not supported yet.') - async def test_task_child_agent_interrupt_and_resume(self): - """Task child agent yields on LRO and resumes successfully. - - Arrange: Parent agent with Task Child agent. Parent transfers to Child. - Child calls LRO tool. - Act: Run, expect LRO interrupt. Then resume. - Assert: Should complete successfully. - """ - - def transfer_to_child(tool_context: ToolContext) -> str: - tool_context.actions.transfer_to_agent = 'child_agent' - return 'transferring' - - # Child agent (Task mode) - fc_child = types.Part.from_function_call(name='child_lro', args={}) - fc_finish = types.Part.from_function_call( - name='finish_task', args={'result': 'Task done'} - ) - child_mock_model = testing_utils.MockModel.create( - responses=[fc_child, fc_finish, 'Child final answer'] - ) - - lro_tool = create_lro_tool('child_lro') - - child_agent = LlmAgent( - name='child_agent', - model=child_mock_model, - tools=[lro_tool], - mode='task', - ) - - # Parent agent - fc_parent = types.Part.from_function_call(name='transfer_to_child', args={}) - parent_mock_model = testing_utils.MockModel.create( - responses=[fc_parent, 'Parent final answer'] - ) - - parent_agent = LlmAgent( - name='parent_agent', - model=parent_mock_model, - tools=[transfer_to_child], - sub_agents=[child_agent], - ) - - # Setup runner - session_service = InMemorySessionService() - await session_service.create_session( - app_name='test', user_id=_USER_ID, session_id=_SESSION_ID - ) - runner = Runner( - app_name='test', agent=parent_agent, session_service=session_service - ) - - # When Parent runs the first turn - events = await _run_turn(runner, 'Go') - - # Then it should trigger child LRO interrupt - assert any(e.long_running_tool_ids for e in events) - - # When Parent resumes the turn - resume_events = await _resume_turn(runner, events, 'child_lro') - - # Then it should complete successfully - assert any('Parent final answer' in t for t in text_parts(resume_events)) - - @pytest.mark.xfail(reason='Single-turn agent as subagent not supported yet.') - async def test_single_turn_child_agent_interrupt_and_resume(self): - """Single-turn child agent yields on LRO and resumes successfully. - - Arrange: Parent agent with Single-turn Child agent. - Parent calls Child via tool. - Child calls LRO tool. - Act: Run, expect LRO interrupt. Then resume. - Assert: Should complete successfully. - """ - - # Child agent (Single-turn) - fc_child = types.Part.from_function_call(name='child_lro', args={}) - child_mock_model = testing_utils.MockModel.create( - responses=[fc_child, 'Child final answer'] - ) - - lro_tool = create_lro_tool('child_lro') - - child_agent = LlmAgent( - name='child_agent', - model=child_mock_model, - tools=[lro_tool], - mode='single_turn', - ) - - # Parent agent - fc_call_child = types.Part.from_function_call( - name='child_agent', args={'request': 'Go to child'} - ) - parent_mock_model = testing_utils.MockModel.create( - responses=[fc_call_child, 'Parent final answer'] - ) - - parent_agent = LlmAgent( - name='parent_agent', - model=parent_mock_model, - sub_agents=[child_agent], - ) - - # Setup runner - session_service = InMemorySessionService() - await session_service.create_session( - app_name='test', user_id=_USER_ID, session_id=_SESSION_ID - ) - runner = Runner( - app_name='test', agent=parent_agent, session_service=session_service - ) - - # When Parent runs the first turn - events = await _run_turn(runner, 'Go') - - # Then it should trigger child LRO interrupt - assert any(e.long_running_tool_ids for e in events) - - # When Parent resumes the turn - resume_events = await _resume_turn(runner, events, 'child_lro') - - # Then it should complete successfully - assert any('Parent final answer' in t for t in text_parts(resume_events)) diff --git a/tests/unittests/agents/test_remote_a2a_agent.py b/tests/unittests/agents/test_remote_a2a_agent.py index 8a38e452b2..073ad36d9f 100644 --- a/tests/unittests/agents/test_remote_a2a_agent.py +++ b/tests/unittests/agents/test_remote_a2a_agent.py @@ -2539,7 +2539,6 @@ async def test_full_workflow_with_direct_agent_card(self): # Mock session with text event mock_part = Mock() mock_part.text = "Hello world" - mock_part.part_metadata = None mock_content = Mock() mock_content.parts = [mock_part] @@ -2637,7 +2636,6 @@ async def test_full_workflow_with_direct_agent_card_and_factory(self): # Mock session with text event mock_part = Mock() mock_part.text = "Hello world" - mock_part.part_metadata = {"test": "part_metadata"} mock_content = Mock() mock_content.parts = [mock_part] diff --git a/tests/unittests/agents/test_resumable_llm_agent.py b/tests/unittests/agents/test_resumable_llm_agent.py index 35b02cd389..c8c3052d65 100644 --- a/tests/unittests/agents/test_resumable_llm_agent.py +++ b/tests/unittests/agents/test_resumable_llm_agent.py @@ -12,18 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Tests for resumable LlmAgent scenarios. - -Verifies that the Mesh-based LlmAgent correctly resumes from various -states: after transfers, tool calls, tool responses, and with -sub-agent tool calls. -""" - -import copy +from typing import Union +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.base_agent import BaseAgentState +from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import LlmAgent -from google.adk.apps.app import App +from google.adk.agents.run_config import RunConfig from google.adk.apps.app import ResumabilityConfig +from google.adk.events.event import Event +from google.adk.events.event_actions import EventActions +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.genai.types import Content from google.genai.types import Part import pytest @@ -40,6 +40,24 @@ def transfer_call_part(agent_name: str) -> Part: name="transfer_to_agent", response={"result": None} ) + +def tool_call_part(tool_name: str) -> Part: + part = Part.from_function_call(name=tool_name, args={}) + part.function_call.id = f"{tool_name}_id" + return part + + +def tool_response_part(tool_name: str) -> Part: + part = Part.from_function_response(name=tool_name, response={"result": "ok"}) + part.function_response.id = f"{tool_name}_id" + return part + + +def tool_response_part_no_id(tool_name: str) -> Part: + part = Part.from_function_response(name=tool_name, response={"result": "ok"}) + return part + + END_OF_AGENT = testing_utils.END_OF_AGENT @@ -47,218 +65,351 @@ def some_tool(): return {"result": "ok"} -def _behavioral_events(events): - """Extract behavioral events (non-state) from resumable app events.""" - return [ - e - for e in testing_utils.simplify_resumable_app_events( - copy.deepcopy(events) - ) - if not isinstance(e[1], dict) - ] - - -@pytest.mark.asyncio -async def test_resume_from_transfer(): - """Tests that the agent resumes from the correct sub-agent after a transfer. - - invocation1: root_agent transfers to sub_agent_1 - invocation2: sub_agent_1 responds (resuming from the transfer) - """ - sub_agent_1 = LlmAgent( - name="sub_agent_1", - model=testing_utils.MockModel.create( - responses=[ - "response from sub_agent_1", - "second response from sub_agent_1", - ] - ), - ) - root_agent = LlmAgent( - name="root_agent", - model=testing_utils.MockModel.create( - responses=[transfer_call_part("sub_agent_1")] - ), - sub_agents=[sub_agent_1], +async def _create_resumable_invocation_context( + invocation_id: str, agent: BaseAgent, events: list[Event] +) -> InvocationContext: + session_service = InMemorySessionService() + session = await session_service.create_session( + app_name="test_app", user_id="test_user" ) - runner = testing_utils.InMemoryRunner( - app=App( - name="test_app", - root_agent=root_agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) + for event in events: + await session_service.append_event(session, event) + return InvocationContext( + invocation_id=invocation_id, + agent=agent, + session=session, + session_service=session_service, + resumability_config=ResumabilityConfig(is_resumable=True), + run_config=RunConfig(), ) - # Invocation 1: root transfers to sub_agent_1. - inv1_events = await runner.run_async("test query") - inv1_behavioral = _behavioral_events(inv1_events) - assert inv1_behavioral == [ - ("root_agent", transfer_call_part("sub_agent_1")), - ("root_agent", TRANSFER_RESPONSE_PART), - ("root_agent", END_OF_AGENT), - ("sub_agent_1", "response from sub_agent_1"), - ("sub_agent_1", END_OF_AGENT), - ] - - # Invocation 2: sub_agent_1 is now active, should respond directly. - inv2_events = await runner.run_async("follow up query") - inv2_behavioral = _behavioral_events(inv2_events) - assert inv2_behavioral == [ - ("sub_agent_1", "second response from sub_agent_1"), - ("sub_agent_1", END_OF_AGENT), - ] - - -@pytest.mark.asyncio -async def test_resume_from_model_response(): - """Tests that the root agent resumes when there has been no transfer.""" - root_agent = LlmAgent( - name="root_agent", - model=testing_utils.MockModel.create( - responses=[ - "first response from root", - "second response from root", - ] - ), - ) - runner = testing_utils.InMemoryRunner( - app=App( - name="test_app", - root_agent=root_agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - ) - # Invocation 1: root responds normally. - inv1_events = await runner.run_async("test query") - inv1_behavioral = _behavioral_events(inv1_events) - assert inv1_behavioral == [ - ("root_agent", "first response from root"), - ("root_agent", END_OF_AGENT), - ] - - # Invocation 2: root should respond again (no transfer happened). - inv2_events = await runner.run_async("follow up") - inv2_behavioral = _behavioral_events(inv2_events) - assert inv2_behavioral == [ - ("root_agent", "second response from root"), - ("root_agent", END_OF_AGENT), - ] - - -@pytest.mark.asyncio -async def test_resume_from_tool_call(): - """Tests that the agent resumes from a tool call. - - invocation1: root_agent calls some_tool, gets response, then responds - invocation2: root_agent responds again (tool was non-long-running) - """ - root_agent = LlmAgent( - name="root_agent", - model=testing_utils.MockModel.create( - responses=[ - Part.from_function_call(name="some_tool", args={}), - "response after tool call", - "second response", - ] - ), - tools=[some_tool], - ) - runner = testing_utils.InMemoryRunner( - app=App( - name="test_app", - root_agent=root_agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - ) +async def _resume_and_get_events( + agent: BaseAgent, invocation_context: InvocationContext +) -> list[(str, Union[Part, str])]: + events = [] + async for event in agent.run_async(invocation_context): + await invocation_context.session_service.append_event( + invocation_context.session, event + ) + events.append(event) + return testing_utils.simplify_resumable_app_events(events) - # Invocation 1: root calls tool, gets response, responds. - inv1_events = await runner.run_async("test query") - inv1_behavioral = _behavioral_events(inv1_events) - assert inv1_behavioral == [ - ("root_agent", Part.from_function_call(name="some_tool", args={})), - ( - "root_agent", - Part.from_function_response( - name="some_tool", response={"result": "ok"} - ), - ), - ("root_agent", "response after tool call"), - ("root_agent", END_OF_AGENT), - ] - - # Invocation 2: root resumes normally. - inv2_events = await runner.run_async("follow up") - inv2_behavioral = _behavioral_events(inv2_events) - assert inv2_behavioral == [ - ("root_agent", "second response"), - ("root_agent", END_OF_AGENT), - ] - - -@pytest.mark.asyncio -async def test_resume_subagent_after_transfer_and_tool_call(): - """Tests resuming a sub-agent that called a tool after being transferred to. - - invocation1: root_agent transfers to sub_agent_1, sub_agent_1 calls tool - and responds - invocation2: sub_agent_1 is still active, responds directly - """ - - def sub_agent_tool(): - return {"result": "ok"} - - sub_agent_1 = LlmAgent( - name="sub_agent_1", - model=testing_utils.MockModel.create( - responses=[ - Part.from_function_call(name="sub_agent_tool", args={}), - "response from sub_agent_1 after tool", - "second response from sub_agent_1", - ] - ), - tools=[sub_agent_tool], - ) - root_agent = LlmAgent( - name="root_agent", - model=testing_utils.MockModel.create( - responses=[transfer_call_part("sub_agent_1")] - ), - sub_agents=[sub_agent_1], - ) - runner = testing_utils.InMemoryRunner( - app=App( - name="test_app", - root_agent=root_agent, - resumability_config=ResumabilityConfig(is_resumable=True), + +class TestResumableLlmAgent: + """Test suite for resumable LlmAgent.""" + + @pytest.fixture + async def resumable_invocation_context(self): + """Creates an invocation context for the specified agent.""" + + async def factory(agent: BaseAgent, events: list[Event]): + return await _create_resumable_invocation_context( + invocation_id="test_invocation", agent=agent, events=events ) - ) - # Invocation 1: root transfers, sub_agent calls tool and responds. - inv1_events = await runner.run_async("test query") - inv1_behavioral = _behavioral_events(inv1_events) - assert inv1_behavioral == [ - ("root_agent", transfer_call_part("sub_agent_1")), - ("root_agent", TRANSFER_RESPONSE_PART), - ("root_agent", END_OF_AGENT), - ( - "sub_agent_1", - Part.from_function_call(name="sub_agent_tool", args={}), - ), - ( - "sub_agent_1", - Part.from_function_response( - name="sub_agent_tool", response={"result": "ok"} - ), - ), - ("sub_agent_1", "response from sub_agent_1 after tool"), - ("sub_agent_1", END_OF_AGENT), - ] - - # Invocation 2: sub_agent_1 is still active, responds directly. - inv2_events = await runner.run_async("follow up") - inv2_behavioral = _behavioral_events(inv2_events) - assert inv2_behavioral == [ - ("sub_agent_1", "second response from sub_agent_1"), - ("sub_agent_1", END_OF_AGENT), - ] + return factory + + @pytest.fixture + def mock_model(self): + """Provides a mock model for the test.""" + + def factory(responses: list[Part]): + return testing_utils.MockModel.create(responses=responses) + + return factory + + @pytest.mark.asyncio + async def test_resume_from_transfer_call( + self, resumable_invocation_context, mock_model + ): + """Tests that the agent resumes from the correct sub-agent after a transfer.""" + sub_agent_1 = LlmAgent( + name="sub_agent_1", + model=mock_model([ + "response from sub_agent_1", + ]), + ) + root_agent = LlmAgent( + name="root_agent", + model=mock_model(["response from root"]), + sub_agents=[sub_agent_1], + ) + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content( + parts=[ + transfer_call_part("sub_agent_1"), + ] + ), + ) + ] + ctx = await resumable_invocation_context(root_agent, past_events) + # Initialize the agent state for the root agent. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("root_agent", TRANSFER_RESPONSE_PART), + ("sub_agent_1", "response from sub_agent_1"), + ("sub_agent_1", END_OF_AGENT), + ("root_agent", END_OF_AGENT), + ] + + @pytest.mark.asyncio + async def test_resume_from_transfer_response( + self, resumable_invocation_context, mock_model + ): + """Tests that the agent resumes from the correct sub-agent after a transfer.""" + sub_agent_1 = LlmAgent( + name="sub_agent_1", + model=mock_model([ + "response from sub_agent_1", + ]), + ) + root_agent = LlmAgent( + name="root_agent", + model=mock_model(["response from root"]), + sub_agents=[sub_agent_1], + ) + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content( + parts=[ + TRANSFER_RESPONSE_PART, + ] + ), + actions=EventActions(transfer_to_agent="sub_agent_1"), + ) + ] + ctx: InvocationContext = await resumable_invocation_context( + root_agent, past_events + ) + # Initialize the agent state for the root agent. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("sub_agent_1", "response from sub_agent_1"), + ("sub_agent_1", END_OF_AGENT), + ("root_agent", END_OF_AGENT), + ] + + @pytest.mark.asyncio + async def test_resume_from_model_response( + self, resumable_invocation_context, mock_model + ): + """Tests that no sub-agent is resumed when there has been no transfer.""" + root_agent = LlmAgent( + name="root_agent", + model=mock_model([ + "second response from root", + ]), + ) + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[Part(text="initial response from root")]), + ) + ] + ctx = await resumable_invocation_context(root_agent, past_events) + # Initialize the agent state for the root agent. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("root_agent", "second response from root"), + ("root_agent", END_OF_AGENT), + ] + + @pytest.mark.asyncio + async def test_resume_from_tool_call( + self, resumable_invocation_context, mock_model + ): + """Tests that the agent resumes from a tool call successfully.""" + root_agent = LlmAgent( + name="root_agent", + model=mock_model(["response after tool call"]), + tools=[some_tool], + ) + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[tool_call_part("some_tool")]), + ), + ] + ctx = await resumable_invocation_context(root_agent, past_events) + # Initialize the agent state for the root agent. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("root_agent", tool_response_part_no_id("some_tool")), + ("root_agent", "response after tool call"), + ("root_agent", END_OF_AGENT), + ] + + @pytest.mark.asyncio + async def test_resume_after_tool_response( + self, resumable_invocation_context, mock_model + ): + """Tests that the agent does not resume a sub-agent when the user responds to the current agent.""" + root_agent = LlmAgent( + name="root_agent", + model=mock_model([ + "response after tool call", + ]), + tools=[some_tool], + ) + + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[tool_call_part("some_tool")]), + ), + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[tool_response_part("some_tool")]), + ), + ] + ctx = await resumable_invocation_context(root_agent, past_events) + # Initialize the agent state for the root agent. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("root_agent", "response after tool call"), + ("root_agent", END_OF_AGENT), + ] + + @pytest.mark.asyncio + async def test_resume_root_agent_on_user_provided_function_response( + self, resumable_invocation_context, mock_model + ): + """Tests that the agent resumes the correct sub-agent after a user responds to its tool call.""" + + def sub_agent_tool(): + return {"result": "ok"} + + sub_agent_1 = LlmAgent( + name="sub_agent_1", + model=mock_model([ + "response from sub_agent_1 after tool call", + ]), + tools=[sub_agent_tool], + ) + root_agent = LlmAgent( + name="root_agent", + model=mock_model(["response from root after tool call"]), + sub_agents=[sub_agent_1], + tools=[some_tool], + ) + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + actions=EventActions(transfer_to_agent="sub_agent_1"), + ), + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[transfer_call_part("sub_agent_1")]), + ), + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[TRANSFER_RESPONSE_PART]), + actions=EventActions(transfer_to_agent="sub_agent_1"), + ), + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[tool_call_part("some_tool")]), + ), + Event( + author="sub_agent_1", + invocation_id="test_invocation", + content=Content(parts=[tool_call_part("sub_agent_tool")]), + ), + Event( + author="user", + invocation_id="test_invocation", + content=Content(parts=[tool_response_part("some_tool")]), + ), + ] + ctx = await resumable_invocation_context(root_agent, past_events) + # Initialize the agent state for the root agent and sub_agent_1. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + ctx.agent_states[sub_agent_1.name] = BaseAgentState().model_dump( + mode="json" + ) + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("root_agent", "response from root after tool call"), + ("root_agent", END_OF_AGENT), + ] + + @pytest.mark.asyncio + async def test_resume_subagent_on_user_provided_function_response( + self, resumable_invocation_context, mock_model + ): + """Tests that the agent resumes the correct sub-agent after a user responds to its tool call.""" + + def sub_agent_tool(): + return {"result": "ok"} + + sub_agent_1 = LlmAgent( + name="sub_agent_1", + model=mock_model([ + "response from sub_agent_1 after tool call", + ]), + tools=[sub_agent_tool], + ) + root_agent = LlmAgent( + name="root_agent", + model=mock_model(["response from root after tool call"]), + sub_agents=[sub_agent_1], + ) + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + actions=EventActions(transfer_to_agent="sub_agent_1"), + ), + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[transfer_call_part("sub_agent_1")]), + ), + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[TRANSFER_RESPONSE_PART]), + actions=EventActions(transfer_to_agent="sub_agent_1"), + ), + Event( + author="sub_agent_1", + invocation_id="test_invocation", + content=Content(parts=[tool_call_part("sub_agent_tool")]), + ), + Event( + author="user", + invocation_id="test_invocation", + content=Content(parts=[tool_response_part("sub_agent_tool")]), + ), + ] + ctx = await resumable_invocation_context(root_agent, past_events) + # Initialize the agent state for the root agent and sub_agent_1. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + ctx.agent_states[sub_agent_1.name] = BaseAgentState().model_dump( + mode="json" + ) + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("sub_agent_1", "response from sub_agent_1 after tool call"), + ("sub_agent_1", END_OF_AGENT), + ("root_agent", END_OF_AGENT), + ] diff --git a/tests/unittests/apps/test_apps.py b/tests/unittests/apps/test_apps.py index 0d7f230e68..dd8e90d764 100644 --- a/tests/unittests/apps/test_apps.py +++ b/tests/unittests/apps/test_apps.py @@ -19,7 +19,6 @@ from google.adk.apps.app import App from google.adk.apps.app import ResumabilityConfig from google.adk.plugins.base_plugin import BasePlugin -from google.adk.workflow._base_node import BaseNode import pytest @@ -184,42 +183,14 @@ def test_app_rejects_invalid_name(self): with pytest.raises(ValueError): App(name="windows\\path", root_agent=mock_agent) - def test_app_name_must_be_valid(self): + def test_app_name_must_be_identifier(self): mock_agent = Mock(spec=BaseAgent) - # Hyphens are allowed - App(name="valid-name", root_agent=mock_agent) - - with pytest.raises(ValueError): - App(name="invalid name", root_agent=mock_agent) - with pytest.raises(ValueError): - App(name="invalid@name", root_agent=mock_agent) + App(name="invalid-name", root_agent=mock_agent) def test_app_name_cannot_be_user(self): mock_agent = Mock(spec=BaseAgent) with pytest.raises(ValueError): App(name="user", root_agent=mock_agent) - - -class TestAppRootNode: - """Tests for App.root_agent accepting BaseNode.""" - - def test_app_with_root_node(self): - """Test App creation with a BaseNode as root_agent.""" - node = BaseNode(name="test_node") - app = App(name="test_app", root_agent=node) - assert app.root_agent is node - - def test_app_rejects_none_root_agent(self): - """Test that not providing root_agent raises.""" - with pytest.raises(ValueError, match="root_agent must be provided"): - App(name="test_app") - - def test_app_rejects_invalid_root_agent(self): - """Test that root_agent must be a BaseAgent or BaseNode instance.""" - with pytest.raises( - TypeError, match="root_agent must be a BaseAgent or BaseNode" - ): - App(name="test_app", root_agent="not_a_node") diff --git a/tests/unittests/apps/test_compaction.py b/tests/unittests/apps/test_compaction.py index 1543f5bd04..dde8a51b4b 100644 --- a/tests/unittests/apps/test_compaction.py +++ b/tests/unittests/apps/test_compaction.py @@ -28,7 +28,7 @@ from google.adk.events.event import Event from google.adk.events.event_actions import EventActions from google.adk.events.event_actions import EventCompaction -from google.adk.flows.llm_flows import contents as _contents +from google.adk.flows.llm_flows import contents from google.adk.sessions.base_session_service import BaseSessionService from google.adk.sessions.session import Session from google.adk.tools.tool_confirmation import ToolConfirmation @@ -868,7 +868,7 @@ def test_get_contents_with_multiple_compactions(self): self._create_event(10.0, 'inv10', 'Event 10'), ] - result_contents = _contents._get_contents(None, events) + result_contents = contents._get_contents(None, events) # Expected contents: # Summary 1-4 (at timestamp 4.0) @@ -898,7 +898,7 @@ def test_get_contents_subsumed_compaction_is_hidden(self): self._create_event(9.0, 'inv9', 'Event 9'), ] - result_contents = _contents._get_contents(None, events) + result_contents = contents._get_contents(None, events) expected_texts = [ 'Summary 1-3', 'Event 4', @@ -919,7 +919,7 @@ def test_get_contents_compaction_appended_late_keeps_newer_events(self): self._create_compacted_event(1.0, 3.0, 'Summary 1-3', appended_ts=6.0), ] - result_contents = _contents._get_contents(None, events) + result_contents = contents._get_contents(None, events) expected_texts = ['Summary 1-3', 'Event 4', 'Event 5'] actual_texts = [c.parts[0].text for c in result_contents] self.assertEqual(actual_texts, expected_texts) @@ -932,7 +932,7 @@ def test_get_contents_no_compaction(self): self._create_event(3.0, 'inv3', 'Event 3'), ] - result_contents = _contents._get_contents(None, events) + result_contents = contents._get_contents(None, events) expected_texts = ['Event 1', 'Event 2', 'Event 3'] actual_texts = [c.parts[0].text for c in result_contents] self.assertEqual(actual_texts, expected_texts) @@ -946,7 +946,7 @@ def test_get_contents_single_compaction_at_start(self): self._create_event(3.0, 'inv3', 'Event 3'), ] - result_contents = _contents._get_contents(None, events) + result_contents = contents._get_contents(None, events) expected_texts = ['Summary 1-2', 'Event 3'] actual_texts = [c.parts[0].text for c in result_contents] self.assertEqual(actual_texts, expected_texts) @@ -963,7 +963,7 @@ def test_get_contents_single_compaction_in_middle(self): self._create_event(5.0, 'inv5', 'Event 5'), ] - result_contents = _contents._get_contents(None, events) + result_contents = contents._get_contents(None, events) expected_texts = ['Summary 1-2', 'Summary 3-4', 'Event 5'] actual_texts = [c.parts[0].text for c in result_contents] self.assertEqual(actual_texts, expected_texts) @@ -977,7 +977,7 @@ def test_get_contents_compaction_at_end(self): self._create_compacted_event(2.0, 3.0, 'Summary 2-3'), ] - result_contents = _contents._get_contents(None, events) + result_contents = contents._get_contents(None, events) expected_texts = ['Event 1', 'Summary 2-3'] actual_texts = [c.parts[0].text for c in result_contents] self.assertEqual(actual_texts, expected_texts) @@ -990,11 +990,133 @@ def test_get_contents_compaction_at_beginning(self): self._create_event(4.0, 'inv4', 'Event 4'), ] - result_contents = _contents._get_contents(None, events) + result_contents = contents._get_contents(None, events) expected_texts = ['Summary 1-2', 'Event 3', 'Event 4'] actual_texts = [c.parts[0].text for c in result_contents] self.assertEqual(actual_texts, expected_texts) + +@pytest.mark.asyncio +async def test_run_compaction_for_token_threshold_adds_summary_trace( + span_exporter: InMemorySpanExporter, +): + session = Session( + app_name='app', + user_id='user', + id='session-id', + events=[ + _create_trace_test_event( + timestamp=1.0, invocation_id='inv1', text='e1' + ), + _create_trace_test_event( + timestamp=2.0, invocation_id='inv2', text='e2' + ), + _create_trace_test_event( + timestamp=3.0, + invocation_id='inv3', + text='e3', + prompt_token_count=100, + ), + ], + ) + session_service = AsyncMock(spec=BaseSessionService) + compacted_event = _create_trace_compacted_event( + start_ts=1.0, end_ts=2.0, summary_text='summary' + ) + summarizer = _StubSummarizer(compacted_event) + config = EventsCompactionConfig( + summarizer=summarizer, + compaction_interval=999, + overlap_size=0, + token_threshold=50, + event_retention_size=1, + ) + + compacted = ( + await ( + compaction_module._run_compaction_for_token_threshold_config( + config=config, + session=session, + session_service=session_service, + agent=Mock(spec=BaseAgent), + ) + ) + ) + + assert compacted is True + spans = span_exporter.get_finished_spans() + summary_span = next( + span for span in spans if span.name == 'compact_events token_threshold' + ) + assert summary_span.attributes['gen_ai.conversation.id'] == 'session-id' + assert ( + summary_span.attributes['gen_ai.compaction.trigger'] == 'token_threshold' + ) + assert summary_span.attributes['gen_ai.compaction.event_count'] == 2 + assert summary_span.attributes['gen_ai.compaction.token_threshold'] == 50 + assert summary_span.attributes['gen_ai.compaction.event_retention_size'] == 1 + assert ( + summary_span.attributes['gen_ai.compaction.result_event_id'] + == 'compacted-event-id' + ) + + +@pytest.mark.asyncio +async def test_run_compaction_for_sliding_window_adds_summary_trace( + span_exporter: InMemorySpanExporter, +): + compacted_event = _create_trace_compacted_event( + start_ts=1.0, end_ts=4.0, summary_text='summary' + ) + summarizer = _StubSummarizer(compacted_event) + app = App( + name='test', + root_agent=Mock(spec=BaseAgent), + events_compaction_config=EventsCompactionConfig( + summarizer=summarizer, + compaction_interval=2, + overlap_size=1, + ), + ) + session = Session( + app_name='test', + user_id='u1', + id='session-id', + events=[ + _create_trace_test_event( + timestamp=1.0, invocation_id='inv1', text='e1' + ), + _create_trace_test_event( + timestamp=2.0, invocation_id='inv2', text='e2' + ), + _create_trace_test_event( + timestamp=3.0, invocation_id='inv3', text='e3' + ), + _create_trace_test_event( + timestamp=4.0, invocation_id='inv4', text='e4' + ), + ], + ) + session_service = AsyncMock(spec=BaseSessionService) + + await _run_compaction_for_sliding_window(app, session, session_service) + + spans = span_exporter.get_finished_spans() + summary_span = next( + span for span in spans if span.name == 'compact_events sliding_window' + ) + assert summary_span.attributes['gen_ai.conversation.id'] == 'session-id' + assert ( + summary_span.attributes['gen_ai.compaction.trigger'] == 'sliding_window' + ) + assert summary_span.attributes['gen_ai.compaction.event_count'] == 4 + assert summary_span.attributes['gen_ai.compaction.compaction_interval'] == 2 + assert summary_span.attributes['gen_ai.compaction.overlap_size'] == 1 + assert ( + summary_span.attributes['gen_ai.compaction.result_event_id'] + == 'compacted-event-id' + ) + async def test_sliding_window_excludes_pending_function_call_events(self): """Sliding-window compaction stops before pending function calls.""" app = App( @@ -1068,7 +1190,7 @@ async def test_sliding_window_pending_function_call_remains_in_contents( self.assertEqual(appended_event.actions.compaction.start_timestamp, 1.0) self.assertEqual(appended_event.actions.compaction.end_timestamp, 1.0) - result_contents = _contents._get_contents(None, events + [appended_event]) + result_contents = contents._get_contents(None, events + [appended_event]) self.assertEqual(result_contents[0].parts[0].text, 'Summary safe prefix') self.assertEqual( result_contents[1].parts[0].function_call.name, @@ -1153,7 +1275,7 @@ async def test_token_threshold_pending_function_call_remains_in_contents( self.assertEqual(appended_event.actions.compaction.start_timestamp, 1.0) self.assertEqual(appended_event.actions.compaction.end_timestamp, 1.0) - result_contents = _contents._get_contents(None, events + [appended_event]) + result_contents = contents._get_contents(None, events + [appended_event]) self.assertEqual(result_contents[0].parts[0].text, 'Summary safe prefix') self.assertEqual( result_contents[1].parts[0].function_call.name, @@ -1652,125 +1774,3 @@ async def test_token_threshold_resolved_hitl_outside_window_is_compactable( ]['events'] compacted_inv_ids = [e.invocation_id for e in compacted_events_arg] self.assertEqual(compacted_inv_ids, ['inv1', 'inv2', 'inv3']) - - -@pytest.mark.asyncio -async def test_run_compaction_for_token_threshold_adds_summary_trace( - span_exporter: InMemorySpanExporter, -): - session = Session( - app_name='app', - user_id='user', - id='session-id', - events=[ - _create_trace_test_event( - timestamp=1.0, invocation_id='inv1', text='e1' - ), - _create_trace_test_event( - timestamp=2.0, invocation_id='inv2', text='e2' - ), - _create_trace_test_event( - timestamp=3.0, - invocation_id='inv3', - text='e3', - prompt_token_count=100, - ), - ], - ) - session_service = AsyncMock(spec=BaseSessionService) - compacted_event = _create_trace_compacted_event( - start_ts=1.0, end_ts=2.0, summary_text='summary' - ) - summarizer = _StubSummarizer(compacted_event) - config = EventsCompactionConfig( - summarizer=summarizer, - compaction_interval=999, - overlap_size=0, - token_threshold=50, - event_retention_size=1, - ) - - compacted = ( - await ( - compaction_module._run_compaction_for_token_threshold_config( - config=config, - session=session, - session_service=session_service, - agent=Mock(spec=BaseAgent), - ) - ) - ) - - assert compacted is True - spans = span_exporter.get_finished_spans() - summary_span = next( - span for span in spans if span.name == 'compact_events token_threshold' - ) - assert summary_span.attributes['gen_ai.conversation.id'] == 'session-id' - assert ( - summary_span.attributes['gen_ai.compaction.trigger'] == 'token_threshold' - ) - assert summary_span.attributes['gen_ai.compaction.event_count'] == 2 - assert summary_span.attributes['gen_ai.compaction.token_threshold'] == 50 - assert summary_span.attributes['gen_ai.compaction.event_retention_size'] == 1 - assert ( - summary_span.attributes['gen_ai.compaction.result_event_id'] - == 'compacted-event-id' - ) - - -@pytest.mark.asyncio -async def test_run_compaction_for_sliding_window_adds_summary_trace( - span_exporter: InMemorySpanExporter, -): - compacted_event = _create_trace_compacted_event( - start_ts=1.0, end_ts=4.0, summary_text='summary' - ) - summarizer = _StubSummarizer(compacted_event) - app = App( - name='test', - root_agent=Mock(spec=BaseAgent), - events_compaction_config=EventsCompactionConfig( - summarizer=summarizer, - compaction_interval=2, - overlap_size=1, - ), - ) - session = Session( - app_name='test', - user_id='u1', - id='session-id', - events=[ - _create_trace_test_event( - timestamp=1.0, invocation_id='inv1', text='e1' - ), - _create_trace_test_event( - timestamp=2.0, invocation_id='inv2', text='e2' - ), - _create_trace_test_event( - timestamp=3.0, invocation_id='inv3', text='e3' - ), - _create_trace_test_event( - timestamp=4.0, invocation_id='inv4', text='e4' - ), - ], - ) - session_service = AsyncMock(spec=BaseSessionService) - - await _run_compaction_for_sliding_window(app, session, session_service) - - spans = span_exporter.get_finished_spans() - summary_span = next( - span for span in spans if span.name == 'compact_events sliding_window' - ) - assert summary_span.attributes['gen_ai.conversation.id'] == 'session-id' - assert ( - summary_span.attributes['gen_ai.compaction.trigger'] == 'sliding_window' - ) - assert summary_span.attributes['gen_ai.compaction.event_count'] == 4 - assert summary_span.attributes['gen_ai.compaction.compaction_interval'] == 2 - assert summary_span.attributes['gen_ai.compaction.overlap_size'] == 1 - assert ( - summary_span.attributes['gen_ai.compaction.result_event_id'] - == 'compacted-event-id' - ) diff --git a/tests/unittests/apps/test_llm_event_summarizer.py b/tests/unittests/apps/test_llm_event_summarizer.py index 3ce7c6ddf2..75401cedda 100644 --- a/tests/unittests/apps/test_llm_event_summarizer.py +++ b/tests/unittests/apps/test_llm_event_summarizer.py @@ -54,7 +54,7 @@ async def test_maybe_compact_events_success(self): self._create_event(1.0, 'Hello', 'user'), self._create_event(2.0, 'Hi there!', 'model'), ] - expected_conversation_history = 'user: Hello\nmodel: Hi there!' + expected_conversation_history = 'user: Hello\\nmodel: Hi there!' expected_prompt = self.compactor._DEFAULT_PROMPT_TEMPLATE.format( conversation_history=expected_conversation_history ) @@ -162,7 +162,7 @@ def test_format_events_for_prompt(self): parts=[ Part( function_call=FunctionCall( - id='call_1', name='tool', args={'q': 'x'} + id='call_1', name='tool', args={} ) ) ] @@ -186,80 +186,8 @@ def test_format_events_for_prompt(self): ), ] expected_formatted_history = ( - 'user: User says...\nmodel: Model replies...\nuser: Another user' - ' input\nmodel: More model text\nmodel called tool:' - " tool({'q': 'x'})\nTool response from tool: {'result': 'done'}" + 'user: User says...\\nmodel: Model replies...\\nuser: Another user' + ' input\\nmodel: More model text' ) formatted_history = self.compactor._format_events_for_prompt(events) self.assertEqual(formatted_history, expected_formatted_history) - - def test_format_events_for_prompt_includes_thoughts(self): - events = [ - self._create_event(1.0, 'What is the weather?', 'user'), - Event( - timestamp=2.0, - author='model', - content=Content( - parts=[ - Part(text='Let me check the tool output.', thought=True), - Part(text='It is sunny.'), - ] - ), - ), - ] - expected_formatted_history = ( - 'user: What is the weather?\nmodel (thought): Let me check the tool' - ' output.\nmodel: It is sunny.' - ) - formatted_history = self.compactor._format_events_for_prompt(events) - self.assertEqual(formatted_history, expected_formatted_history) - - def test_format_events_for_prompt_skips_compaction_event_thought(self): - events = [ - Event( - timestamp=1.0, - author='model', - content=Content( - parts=[ - Part(text='Stale summarizer reasoning.', thought=True), - Part(text='Prior summary.'), - ] - ), - actions=EventActions( - compaction=EventCompaction( - start_timestamp=0.0, - end_timestamp=1.0, - compacted_content=Content(parts=[Part(text='Prior')]), - ) - ), - ), - self._create_event(2.0, 'New user input', 'user'), - ] - expected_formatted_history = 'model: Prior summary.\nuser: New user input' - formatted_history = self.compactor._format_events_for_prompt(events) - self.assertEqual(formatted_history, expected_formatted_history) - - def test_format_events_for_prompt_truncates_large_tool_response(self): - limit = self.compactor._MAX_TOOL_CONTENT_CHARS - large_value = 'x' * (limit + 500) - events = [ - Event( - timestamp=1.0, - author='model', - content=Content( - parts=[ - Part( - function_response=FunctionResponse( - id='call_1', - name='search', - response={'data': large_value}, - ) - ) - ] - ), - ), - ] - formatted_history = self.compactor._format_events_for_prompt(events) - self.assertIn('Tool response from search:', formatted_history) - self.assertIn('... [truncated', formatted_history) - self.assertLess(len(formatted_history), len(large_value)) diff --git a/tests/unittests/auth/test_auth_preprocessor.py b/tests/unittests/auth/test_auth_preprocessor.py index f1b026cde4..fb45cc34ac 100644 --- a/tests/unittests/auth/test_auth_preprocessor.py +++ b/tests/unittests/auth/test_auth_preprocessor.py @@ -319,7 +319,7 @@ async def test_processes_auth_response_successfully( @pytest.mark.asyncio @patch('google.adk.auth.auth_preprocessor.AuthHandler') @patch('google.adk.auth.auth_tool.AuthConfig.model_validate') - @patch('google.adk.auth.auth_preprocessor.handle_function_calls_async') + @patch('google.adk.flows.llm_flows.functions.handle_function_calls_async') async def test_processes_multiple_auth_responses_and_resumes_tools( self, mock_handle_function_calls, diff --git a/tests/unittests/auth/test_oauth2_credential_util.py b/tests/unittests/auth/test_oauth2_credential_util.py index 17a5200255..b9d4da6711 100644 --- a/tests/unittests/auth/test_oauth2_credential_util.py +++ b/tests/unittests/auth/test_oauth2_credential_util.py @@ -207,82 +207,6 @@ def test_create_oauth2_session_oauth2_scheme_with_token_endpoint_auth_method( assert token_endpoint == "https://example.com/token" assert client.token_endpoint_auth_method == "client_secret_jwt" - def _oauth2_scheme_with_scopes(self): - """Build an OAuth2 scheme that declares scopes.""" - return OAuth2( - type_="oauth2", - flows=OAuthFlows( - authorizationCode=OAuthFlowAuthorizationCode( - authorizationUrl="https://example.com/auth", - tokenUrl="https://example.com/token", - scopes={"read": "Read access", "write": "Write access"}, - ) - ), - ) - - def _capturing_post(self, captured): - """Stub for OAuth2Session.post that records the token-request body.""" - - def _post(*args, **kwargs): - captured["data"] = kwargs.get("data") - response = Mock() - response.status_code = 200 - response.json.return_value = { - "access_token": "new_access_token", - "token_type": "Bearer", - "expires_in": 3600, - "refresh_token": "new_refresh_token", - } - return response - - return _post - - def test_refresh_request_omits_scope(self): - """Refresh requests must not carry scope (some providers reject it).""" - credential = AuthCredential( - auth_type=AuthCredentialTypes.OAUTH2, - oauth2=OAuth2Auth( - client_id="test_client_id", - client_secret="test_client_secret", - redirect_uri="https://example.com/callback", - ), - ) - - client, token_endpoint = create_oauth2_session( - self._oauth2_scheme_with_scopes(), credential - ) - assert client is not None - - captured = {} - client.post = self._capturing_post(captured) - client.refresh_token(token_endpoint, refresh_token="old_refresh_token") - - assert "scope" not in captured["data"] - - def test_token_exchange_omits_scope(self): - """Authorization-code exchange must not carry scope (it is redundant).""" - credential = AuthCredential( - auth_type=AuthCredentialTypes.OAUTH2, - oauth2=OAuth2Auth( - client_id="test_client_id", - client_secret="test_client_secret", - redirect_uri="https://example.com/callback", - ), - ) - - client, token_endpoint = create_oauth2_session( - self._oauth2_scheme_with_scopes(), credential - ) - assert client is not None - - captured = {} - client.post = self._capturing_post(captured) - client.fetch_token( - token_endpoint, grant_type="authorization_code", code="test_code" - ) - - assert "scope" not in captured["data"] - def test_update_credential_with_tokens(self): """Test update_credential_with_tokens function.""" credential = AuthCredential( diff --git a/tests/unittests/auth/test_toolset_auth.py b/tests/unittests/auth/test_toolset_auth.py index 7c231aba43..941055af4f 100644 --- a/tests/unittests/auth/test_toolset_auth.py +++ b/tests/unittests/auth/test_toolset_auth.py @@ -32,6 +32,7 @@ from google.adk.auth.auth_tool import AuthConfig from google.adk.auth.auth_tool import AuthToolArguments from google.adk.flows.llm_flows.base_llm_flow import _resolve_toolset_auth +from google.adk.flows.llm_flows.base_llm_flow import BaseLlmFlow from google.adk.flows.llm_flows.base_llm_flow import TOOLSET_AUTH_CREDENTIAL_ID_PREFIX as FLOW_PREFIX from google.adk.flows.llm_flows.functions import build_auth_request_event from google.adk.flows.llm_flows.functions import REQUEST_EUC_FUNCTION_CALL_NAME @@ -88,19 +89,18 @@ class TestToolsetAuthPrefixConstant: """Test that prefix constants are consistent.""" def test_prefix_constants_match(self): - """Ensure auth_preprocessor and _reasoning use the same prefix.""" + """Ensure auth_preprocessor and base_llm_flow use the same prefix.""" assert TOOLSET_AUTH_CREDENTIAL_ID_PREFIX == FLOW_PREFIX assert TOOLSET_AUTH_CREDENTIAL_ID_PREFIX == "_adk_toolset_auth_" class TestResolveToolsetAuth: - """Tests for _resolve_toolset_auth.""" + """Tests for _resolve_toolset_auth method in BaseLlmFlow.""" @pytest.fixture def mock_invocation_context(self): """Create a mock invocation context.""" ctx = Mock(spec=InvocationContext) - ctx._state_schema = None ctx.invocation_id = "test-invocation-id" ctx.end_invocation = False ctx.branch = None @@ -335,7 +335,6 @@ class TestCallbackContextGetAuthResponse: def mock_invocation_context(self): """Create a mock invocation context.""" ctx = Mock(spec=InvocationContext) - ctx._state_schema = None ctx.session = Mock() ctx.session.state = {} return ctx @@ -378,7 +377,6 @@ class TestBuildAuthRequestEvent: def mock_invocation_context(self): """Create a mock invocation context.""" ctx = Mock(spec=InvocationContext) - ctx._state_schema = None ctx.invocation_id = "test-invocation-id" ctx.branch = None ctx.agent = Mock() diff --git a/tests/unittests/cli/test_adk_web_server_import_isolation.py b/tests/unittests/cli/test_adk_web_server_import_isolation.py deleted file mode 100644 index 8134330403..0000000000 --- a/tests/unittests/cli/test_adk_web_server_import_isolation.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Import-isolation guard for adk_web_server. - -Importing ``adk_web_server`` must not eagerly pull in the Agent Builder agent -stack. Doing so reaches ``google.adk.agents`` at import time and breaks -downstream consumers that import ``adk_web_server`` while ``google.adk.agents`` -is still initializing. -""" - -from __future__ import annotations - -import subprocess -import sys - - -def test_importing_adk_web_server_does_not_import_agent_builder(): - # Run in a fresh interpreter so the check is not polluted by modules that - # other tests already imported into sys.modules. - code = ( - "import google.adk.cli.adk_web_server\n" - "import sys\n" - "forbidden = [\n" - " 'google.adk.cli.built_in_agents.agent',\n" - " 'google.adk.cli.built_in_agents.adk_agent_builder_assistant',\n" - "]\n" - "loaded = [name for name in forbidden if name in sys.modules]\n" - "assert not loaded, loaded\n" - ) - - result = subprocess.run( - [sys.executable, "-c", code], - capture_output=True, - text=True, - check=False, - ) - - assert result.returncode == 0, result.stderr diff --git a/tests/unittests/cli/test_adk_web_server_tests.py b/tests/unittests/cli/test_adk_web_server_tests.py deleted file mode 100644 index 3d5f7ef30c..0000000000 --- a/tests/unittests/cli/test_adk_web_server_tests.py +++ /dev/null @@ -1,156 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import asyncio -import json -import os -from unittest.mock import AsyncMock -from unittest.mock import MagicMock -from unittest.mock import patch - -from fastapi.testclient import TestClient -from google.adk.cli.fast_api import get_fast_api_app -import pytest - - -@pytest.fixture -def test_client(tmp_path): - """Client with a temporary agents directory.""" - app = get_fast_api_app( - agents_dir=str(tmp_path), - web=True, - session_service_uri="", - artifact_service_uri="", - memory_service_uri="", - allow_origins=["*"], - a2a=False, - host="127.0.0.1", - port=8000, - ) - return TestClient(app) - - -def test_list_tests_empty(test_client): - response = test_client.get("/dev/apps/test_app/tests") - assert response.status_code == 200 - assert response.json() == [] - - -def test_create_test(test_client, tmp_path): - # Create agent dir so it exists - agent_dir = tmp_path / "test_app" - agent_dir.mkdir() - - payload = {"session_data": {"events": []}} - - response = test_client.put( - "/dev/apps/test_app/tests/my_test.json", json=payload - ) - assert response.status_code == 200 - assert response.json() == {"status": "success", "file": "my_test.json"} - - # Verify file exists - assert (agent_dir / "tests" / "my_test.json").exists() - - -def test_list_tests_not_empty(test_client, tmp_path): - agent_dir = tmp_path / "test_app" - tests_dir = agent_dir / "tests" - tests_dir.mkdir(parents=True) - (tests_dir / "test1.json").write_text("{}") - (tests_dir / "test2.json").write_text("{}") - - response = test_client.get("/dev/apps/test_app/tests") - assert response.status_code == 200 - assert response.json() == ["test1.json", "test2.json"] - - -def test_delete_test(test_client, tmp_path): - agent_dir = tmp_path / "test_app" - tests_dir = agent_dir / "tests" - tests_dir.mkdir(parents=True) - test_file = tests_dir / "test1.json" - test_file.write_text("{}") - - response = test_client.delete("/dev/apps/test_app/tests/test1.json") - assert response.status_code == 200 - assert response.json() == {"status": "success"} - assert not test_file.exists() - - -def test_get_test_content(test_client, tmp_path): - agent_dir = tmp_path / "test_app" - tests_dir = agent_dir / "tests" - tests_dir.mkdir(parents=True) - test_file = tests_dir / "test_get.json" - test_file.write_text('{"foo": "bar"}') - - response = test_client.get("/dev/apps/test_app/tests/test_get.json") - assert response.status_code == 200 - assert response.json() == {"foo": "bar"} - - -def test_get_test_content_not_found(test_client): - response = test_client.get("/dev/apps/test_app/tests/non_existent.json") - assert response.status_code == 404 - - -def test_rebuild_tests(test_client): - with patch("google.adk.cli.dev_server.asyncio.to_thread") as mock_to_thread: - mock_to_thread.return_value = None - response = test_client.post("/dev/apps/test_app/tests/rebuild", json={}) - assert response.status_code == 200 - assert response.json() == {"status": "success"} - mock_to_thread.assert_called_once() - - -def test_rebuild_single_test(test_client): - with patch("google.adk.cli.dev_server.asyncio.to_thread") as mock_to_thread: - mock_to_thread.return_value = None - response = test_client.post( - "/dev/apps/test_app/tests/rebuild?test_name=my_test.json", json={} - ) - assert response.status_code == 200 - assert response.json() == {"status": "success"} - mock_to_thread.assert_called_once() - args, kwargs = mock_to_thread.call_args - assert args[1].endswith("tests/my_test.json") - - -def test_run_tests(test_client): - from unittest.mock import AsyncMock - from unittest.mock import MagicMock - from unittest.mock import patch - - mock_process = MagicMock() - mock_process.stdout.readline = AsyncMock( - side_effect=[b"line1\n", b"line2\n", b""] - ) - mock_process.wait = AsyncMock(return_value=0) - - with patch( - "google.adk.cli.dev_server.asyncio.create_subprocess_exec", - new_callable=AsyncMock, - ) as mock_create_subprocess: - mock_create_subprocess.return_value = mock_process - - response = test_client.post("/dev/apps/test_app/tests/run", json={}) - assert response.status_code == 200 - assert response.headers["content-type"] == "text/plain; charset=utf-8" - # Read stream - content = response.content - assert b"line1\n" in content - assert b"line2\n" in content diff --git a/tests/unittests/cli/test_fast_api.py b/tests/unittests/cli/test_fast_api.py index bb443fb331..63392d1fd1 100755 --- a/tests/unittests/cli/test_fast_api.py +++ b/tests/unittests/cli/test_fast_api.py @@ -22,7 +22,6 @@ from typing import Any from typing import Optional from unittest.mock import AsyncMock -from unittest.mock import call from unittest.mock import MagicMock from unittest.mock import patch @@ -113,7 +112,7 @@ def _event_state_delta(state_delta: dict[str, Any]): # Define mocked async generator functions for the Runner -async def dummy_run_live(self, session, live_request_queue, **kwargs): +async def dummy_run_live(self, session, live_request_queue): yield _event_1() await asyncio.sleep(0) @@ -645,39 +644,6 @@ def test_agent_with_bigquery_analytics_plugin( assert getattr(runner.app, "_is_visual_builder_app", False) is True -def test_get_runner_async_accepts_internal_special_agent_name( - tmp_path, - mock_session_service, - mock_artifact_service, - mock_memory_service, - mock_agent_loader, - mock_eval_sets_manager, - mock_eval_set_results_manager, -): - from google.adk.cli.adk_web_server import AdkWebServer - - special_app_name = "__adk_agent_builder_assistant" - special_agent = DummyAgent(name="agent_builder_assistant") - mock_agent_loader.load_agent = MagicMock(return_value=special_agent) - - adk_web_server = AdkWebServer( - agent_loader=mock_agent_loader, - session_service=mock_session_service, - memory_service=mock_memory_service, - artifact_service=mock_artifact_service, - credential_service=MagicMock(), - eval_sets_manager=mock_eval_sets_manager, - eval_set_results_manager=mock_eval_set_results_manager, - agents_dir=str(tmp_path), - ) - - runner = asyncio.run(adk_web_server.get_runner_async(special_app_name)) - - assert runner.app.name == special_app_name - assert runner.app.root_agent is special_agent - mock_agent_loader.load_agent.assert_called_once_with(special_app_name) - - @pytest.fixture def test_app( mock_session_service, @@ -925,68 +891,6 @@ def test_app_with_a2a( yield client -@pytest.fixture -def test_app_with_gemini_enterprise( - mock_session_service, - mock_artifact_service, - mock_memory_service, - mock_agent_loader, - mock_eval_sets_manager, - mock_eval_set_results_manager, - monkeypatch, -): - """Create a TestClient with gemini_enterprise_app_name set.""" - monkeypatch.setenv("GOOGLE_CLOUD_PROJECT", "test-project") - mock_agent_loader.list_agents = MagicMock( - return_value=["test_app", "gemini_app"] - ) - - mock_adk_app_instance = MagicMock() - mock_adk_app_instance._tmpl_attrs = {} - - async def get_session_impl(**kwargs): - return {"result": "success", "kwargs": kwargs} - - mock_adk_app_instance.get_session = get_session_impl - - async def stream_query_impl(**kwargs): - yield {"chunk": 1, "kwargs": kwargs} - await asyncio.sleep(0) - yield {"chunk": 2, "kwargs": kwargs} - - mock_adk_app_instance.stream_query = stream_query_impl - - with ( - patch("google.auth.default", return_value=(MagicMock(), "test-project")), - patch("vertexai.init", new_callable=MagicMock) as mock_vertexai_init, - patch( - "vertexai.agent_engines.AdkApp", return_value=mock_adk_app_instance - ) as mock_adk_app_cls, - patch("google.adk.agents.Agent", new_callable=MagicMock), - patch( - "google.adk.telemetry._agent_engine.TopSpanProcessor", - new_callable=MagicMock, - ), - patch( - "google.adk.telemetry._agent_engine.get_propagated_context", - new_callable=MagicMock, - ), - ): - client = _create_test_client( - mock_session_service, - mock_artifact_service, - mock_memory_service, - mock_agent_loader, - mock_eval_sets_manager, - mock_eval_set_results_manager, - gemini_enterprise_app_name="gemini_app", - ) - client.mock_vertexai_init = mock_vertexai_init - client.mock_adk_app_cls = mock_adk_app_cls - client.mock_adk_app_instance = mock_adk_app_instance - yield client - - ################################################# # Test Cases ################################################# @@ -1477,45 +1381,6 @@ async def run_async_capture( assert captured_invocation_id["invocation_id"] == payload["invocation_id"] -def test_agent_run_passes_custom_metadata( - test_app, create_test_session, monkeypatch -): - """Test /run forwards custom_metadata via the run config.""" - info = create_test_session - captured: dict[str, Optional[RunConfig]] = {"run_config": None} - - async def run_async_capture( - self, - *, - user_id: str, - session_id: str, - invocation_id: Optional[str] = None, - new_message: Optional[types.Content] = None, - state_delta: Optional[dict[str, Any]] = None, - run_config: Optional[RunConfig] = None, - ): - del self, user_id, session_id, invocation_id, new_message, state_delta - captured["run_config"] = run_config - yield _event_1() - - monkeypatch.setattr(Runner, "run_async", run_async_capture) - - payload = { - "app_name": info["app_name"], - "user_id": info["user_id"], - "session_id": info["session_id"], - "new_message": {"role": "user", "parts": [{"text": "Hello"}]}, - "streaming": False, - "custom_metadata": {"tenant": "acme", "trace": "abc123"}, - } - - response = test_app.post("/run", json=payload) - - assert response.status_code == 200 - assert captured["run_config"] is not None - assert captured["run_config"].custom_metadata == payload["custom_metadata"] - - def test_agent_run_sse_splits_artifact_delta( test_app, create_test_session, monkeypatch ): @@ -1818,10 +1683,10 @@ def test_get_eval_set_result_not_found(test_app): assert response.status_code == 404 -def test_list_metrics_info(builder_test_client): +def test_list_metrics_info(test_app): """Test listing metrics info.""" - url = "/dev/apps/test_app/metrics-info" - response = builder_test_client.get(url) + url = "/apps/test_app/metrics-info" + response = test_app.get(url) # Verify the response assert response.status_code == 200 @@ -1841,7 +1706,7 @@ def test_debug_trace(test_app): """Test the debug trace endpoint.""" # This test will likely return 404 since we haven't set up trace data, # but it tests that the endpoint exists and handles missing traces correctly. - url = "/dev/apps/test_app/debug/trace/nonexistent-event" + url = "/debug/trace/nonexistent-event" response = test_app.get(url) # Verify we get a 404 for a nonexistent trace @@ -1856,6 +1721,56 @@ def test_openapi_json_schema_accessible(test_app): logger.info("OpenAPI /openapi.json endpoint is accessible") +def test_get_event_graph_returns_dot_src_for_app_agent(): + """Ensure graph endpoint unwraps App instances before building the graph.""" + from google.adk.cli.adk_web_server import AdkWebServer + + root_agent = DummyAgent(name="dummy_agent") + app_agent = App(name="test_app", root_agent=root_agent) + + class Loader: + + def load_agent(self, app_name): + return app_agent + + def list_agents(self): + return [app_agent.name] + + session_service = AsyncMock() + session = Session( + id="session_id", + app_name="test_app", + user_id="user", + state={}, + events=[Event(author="dummy_agent")], + ) + event_id = session.events[0].id + session_service.get_session.return_value = session + + adk_web_server = AdkWebServer( + agent_loader=Loader(), + session_service=session_service, + memory_service=MagicMock(), + artifact_service=MagicMock(), + credential_service=MagicMock(), + eval_sets_manager=MagicMock(), + eval_set_results_manager=MagicMock(), + agents_dir=".", + ) + + fast_api_app = adk_web_server.get_fast_api_app( + setup_observer=lambda _observer, _server: None, + tear_down_observer=lambda _observer, _server: None, + ) + + client = TestClient(fast_api_app) + response = client.get( + f"/apps/test_app/users/user/sessions/session_id/events/{event_id}/graph" + ) + assert response.status_code == 200 + assert "dotSrc" in response.json() + + def test_a2a_agent_discovery(test_app_with_a2a): """Test that A2A agents are properly discovered and configured.""" # This test mainly verifies that the A2A setup doesn't break the app @@ -2217,14 +2132,12 @@ def test_builder_final_save_preserves_files_and_cleans_tmp( ("app/sub_agent.yaml", b"name: sub\n", "application/x-yaml"), ), ] - response = builder_test_client.post( - "/dev/apps/app/builder/save?tmp=true", files=files - ) + response = builder_test_client.post("/builder/save?tmp=true", files=files) assert response.status_code == 200 assert response.json() is True response = builder_test_client.post( - "/dev/apps/app/builder/save", + "/builder/save", files=[( "files", ( @@ -2245,7 +2158,7 @@ def test_builder_final_save_preserves_files_and_cleans_tmp( def test_builder_save_rejects_cross_origin_post(builder_test_client, tmp_path): response = builder_test_client.post( - "/dev/apps/app/builder/save?tmp=true", + "/builder/save?tmp=true", headers={"origin": "https://evil.com"}, files=[( "files", @@ -2260,7 +2173,7 @@ def test_builder_save_rejects_cross_origin_post(builder_test_client, tmp_path): def test_builder_save_allows_same_origin_post(builder_test_client, tmp_path): response = builder_test_client.post( - "/dev/apps/app/builder/save?tmp=true", + "/builder/save?tmp=true", headers={"origin": "http://testserver"}, files=[( "files", @@ -2275,7 +2188,7 @@ def test_builder_save_allows_same_origin_post(builder_test_client, tmp_path): def test_builder_get_allows_cross_origin_get(builder_test_client): response = builder_test_client.get( - "/dev/apps/missing/builder?tmp=true", + "/builder/app/missing?tmp=true", headers={"origin": "https://evil.com"}, ) @@ -2288,12 +2201,12 @@ def test_builder_cancel_deletes_tmp_idempotent(builder_test_client, tmp_path): tmp_agent_root.mkdir(parents=True, exist_ok=True) (tmp_agent_root / "root_agent.yaml").write_text("name: app\n") - response = builder_test_client.post("/dev/apps/app/builder/cancel") + response = builder_test_client.post("/builder/app/app/cancel") assert response.status_code == 200 assert response.json() is True assert not (tmp_path / "app" / "tmp").exists() - response = builder_test_client.post("/dev/apps/app/builder/cancel") + response = builder_test_client.post("/builder/app/app/cancel") assert response.status_code == 200 assert response.json() is True assert not (tmp_path / "app" / "tmp").exists() @@ -2308,7 +2221,7 @@ def test_builder_get_tmp_true_recreates_tmp(builder_test_client, tmp_path): (nested_dir / "nested.yaml").write_text("nested: true\n") assert not (app_root / "tmp").exists() - response = builder_test_client.get("/dev/apps/app/builder?tmp=true") + response = builder_test_client.get("/builder/app/app?tmp=true") assert response.status_code == 200 assert response.text == "name: app\n" @@ -2317,7 +2230,7 @@ def test_builder_get_tmp_true_recreates_tmp(builder_test_client, tmp_path): assert (tmp_agent_root / "nested" / "nested.yaml").is_file() response = builder_test_client.get( - "/dev/apps/app/builder?tmp=true&file_path=nested/nested.yaml" + "/builder/app/app?tmp=true&file_path=nested/nested.yaml" ) assert response.status_code == 200 assert response.text == "nested: true\n" @@ -2326,7 +2239,7 @@ def test_builder_get_tmp_true_recreates_tmp(builder_test_client, tmp_path): def test_builder_get_tmp_true_missing_app_returns_empty( builder_test_client, tmp_path ): - response = builder_test_client.get("/dev/apps/missing/builder?tmp=true") + response = builder_test_client.get("/builder/app/missing?tmp=true") assert response.status_code == 200 assert response.text == "" assert not (tmp_path / "missing").exists() @@ -2334,7 +2247,7 @@ def test_builder_get_tmp_true_missing_app_returns_empty( def test_builder_save_rejects_traversal(builder_test_client, tmp_path): response = builder_test_client.post( - "/dev/apps/app/builder/save?tmp=true", + "/builder/save?tmp=true", files=[( "files", ("app/../escape.yaml", b"nope\n", "application/x-yaml"), @@ -2348,7 +2261,7 @@ def test_builder_save_rejects_traversal(builder_test_client, tmp_path): def test_builder_save_rejects_py_files(builder_test_client, tmp_path): """Uploading .py files via /builder/save is rejected.""" response = builder_test_client.post( - "/dev/apps/app/builder/save?tmp=true", + "/builder/save?tmp=true", files=[( "files", ("app/agent.py", b"import os\nos.system('id')\n", "text/plain"), @@ -2370,7 +2283,7 @@ def test_builder_save_rejects_non_yaml_extensions( (".pth", b"import os"), ]: response = builder_test_client.post( - "/dev/apps/app/builder/save?tmp=true", + "/builder/save?tmp=true", files=[( "files", (f"app/file{ext}", content, "application/octet-stream"), @@ -2382,7 +2295,7 @@ def test_builder_save_rejects_non_yaml_extensions( def test_builder_save_allows_yaml_files(builder_test_client, tmp_path): """Uploading .yaml and .yml files is allowed.""" response = builder_test_client.post( - "/dev/apps/app/builder/save?tmp=true", + "/builder/save?tmp=true", files=[( "files", ("app/root_agent.yaml", b"name: app\n", "application/x-yaml"), @@ -2392,7 +2305,7 @@ def test_builder_save_allows_yaml_files(builder_test_client, tmp_path): assert response.json() is True response = builder_test_client.post( - "/dev/apps/app/builder/save?tmp=true", + "/builder/save?tmp=true", files=[( "files", ("app/sub_agent.yml", b"name: sub\n", "application/x-yaml"), @@ -2410,7 +2323,7 @@ def test_builder_save_rejects_args_key(builder_test_client, tmp_path): key: value """ response = builder_test_client.post( - "/dev/apps/app/builder/save?tmp=true", + "/builder/save?tmp=true", files=[( "files", ("app/root_agent.yaml", yaml_with_args, "application/x-yaml"), @@ -2430,7 +2343,7 @@ def test_builder_save_rejects_nested_args_key(builder_test_client, tmp_path): param: value """ response = builder_test_client.post( - "/dev/apps/app/builder/save?tmp=true", + "/builder/save?tmp=true", files=[( "files", ("app/root_agent.yaml", yaml_with_nested_args, "application/x-yaml"), @@ -2441,7 +2354,7 @@ def test_builder_save_rejects_nested_args_key(builder_test_client, tmp_path): def test_builder_get_rejects_non_yaml_file_paths(builder_test_client, tmp_path): - """GET /dev/apps/{app_name}/builder?file_path=... rejects non-YAML extensions.""" + """GET /builder/app/{app_name}?file_path=... rejects non-YAML extensions.""" app_root = tmp_path / "app" app_root.mkdir(parents=True, exist_ok=True) (app_root / ".env").write_text("SECRET=supersecret\n") @@ -2450,26 +2363,26 @@ def test_builder_get_rejects_non_yaml_file_paths(builder_test_client, tmp_path): for file_path in [".env", "agent.py", "config.json"]: response = builder_test_client.get( - f"/dev/apps/app/builder?file_path={file_path}" + f"/builder/app/app?file_path={file_path}" ) assert response.status_code == 200, f"Expected 200 for {file_path}" assert response.text == "", f"Expected empty response for {file_path}" def test_builder_get_allows_yaml_file_paths(builder_test_client, tmp_path): - """GET /dev/apps/{app_name}/builder?file_path=... allows YAML extensions.""" + """GET /builder/app/{app_name}?file_path=... allows YAML extensions.""" app_root = tmp_path / "app" app_root.mkdir(parents=True, exist_ok=True) (app_root / "sub_agent.yaml").write_text("name: sub\n") (app_root / "tool.yml").write_text("name: tool\n") response = builder_test_client.get( - "/dev/apps/app/builder?file_path=sub_agent.yaml" + "/builder/app/app?file_path=sub_agent.yaml" ) assert response.status_code == 200 assert response.text == "name: sub\n" - response = builder_test_client.get("/dev/apps/app/builder?file_path=tool.yml") + response = builder_test_client.get("/builder/app/app?file_path=tool.yml") assert response.status_code == 200 assert response.text == "name: tool\n" @@ -2492,28 +2405,28 @@ def test_builder_endpoints_not_registered_without_web( mock_eval_set_results_manager, web=False, ) - # /dev/apps/app/builder/save should return 404/405, not 200 + # /builder/save should return 404/405, not 200 response = client.post( - "/dev/apps/app/builder/save", + "/builder/save", files=[ ("files", ("app/agent.yaml", b"name: test\n", "application/x-yaml")) ], ) assert response.status_code in (404, 405) - # /dev/apps/{name}/builder/cancel should also be absent - response = client.post("/dev/apps/app/builder/cancel") + # /builder/app/{name}/cancel should also be absent + response = client.post("/builder/app/app/cancel") assert response.status_code in (404, 405) - # /dev/apps/{name}/builder GET should also be absent - response = client.get("/dev/apps/app/builder") + # /builder/app/{name} GET should also be absent + response = client.get("/builder/app/app") assert response.status_code in (404, 405) def test_builder_endpoints_registered_with_web(builder_test_client): """Builder endpoints are available when web=True.""" response = builder_test_client.post( - "/dev/apps/app/builder/save?tmp=true", + "/builder/save?tmp=true", files=[ ("files", ("app/agent.yaml", b"name: test\n", "application/x-yaml")) ], @@ -2765,478 +2678,5 @@ async def run_async_capture( assert captured_visual_builder_values.get("yaml_app_after_sleep") == True -def test_default_app_name_middleware_and_resolution( - mock_session_service, - mock_artifact_service, - mock_memory_service, - mock_agent_loader, - mock_eval_sets_manager, - mock_eval_set_results_manager, - monkeypatch, -): - """Test that when ADK_DEFAULT_APP_NAME is set, path rewriting works for get_session and run.""" - # Set environment variable - monkeypatch.setenv("ADK_DEFAULT_APP_NAME", "test_app") - - test_app = _create_test_client( - mock_session_service, - mock_artifact_service, - mock_memory_service, - mock_agent_loader, - mock_eval_sets_manager, - mock_eval_set_results_manager, - ) - - # Create session for test_app - async def setup_session(): - await mock_session_service.create_session( - app_name="test_app", - user_id="test_user", - session_id="test_session", - state={}, - ) - - asyncio.run(setup_session()) - - # 1. Test path rewriting for GET /users/{user_id}/sessions/{session_id} - response = test_app.get("/users/test_user/sessions/test_session") - assert response.status_code == 200 - assert response.json()["id"] == "test_session" - - # 2. Test app_name omission in /run request payload - payload = { - "user_id": "test_user", - "session_id": "test_session", - "new_message": {"role": "user", "parts": [{"text": "Hello"}]}, - } - response = test_app.post("/run", json=payload) - assert response.status_code == 200 - assert isinstance(response.json(), list) - - -def test_default_app_name_not_set_raises_error(test_app, monkeypatch): - """Test that omitting app_name when ADK_DEFAULT_APP_NAME is not set raises 400/404.""" - # Make sure environment variable is NOT set - monkeypatch.delenv("ADK_DEFAULT_APP_NAME", raising=False) - - # 1. Accessing /users/{user_id}/sessions/{session_id} should return 404 because no rewrite happened - response = test_app.get("/users/test_user/sessions/test_session") - assert response.status_code == 404 - - # 2. Accessing /run with omitted app_name should return 400 - payload = { - "user_id": "test_user", - "session_id": "test_session", - "new_message": {"role": "user", "parts": [{"text": "Hello"}]}, - } - response = test_app.post("/run", json=payload) - assert response.status_code == 400 - assert "app_name is required" in response.json()["detail"] - - -def test_run_live_websocket_default_app_name( - mock_session_service, - mock_artifact_service, - mock_memory_service, - mock_agent_loader, - mock_eval_sets_manager, - mock_eval_set_results_manager, - monkeypatch, -): - """Test that /run_live websocket endpoint resolves app_name using ADK_DEFAULT_APP_NAME.""" - monkeypatch.setenv("ADK_DEFAULT_APP_NAME", "test_app") - - test_app = _create_test_client( - mock_session_service, - mock_artifact_service, - mock_memory_service, - mock_agent_loader, - mock_eval_sets_manager, - mock_eval_set_results_manager, - ) - - async def setup_session(): - await mock_session_service.create_session( - app_name="test_app", - user_id="user", - session_id="session", - state={}, - ) - - asyncio.run(setup_session()) - - url = "/run_live?user_id=user&session_id=session&modalities=AUDIO" - - with test_app.websocket_connect(url) as ws: - data = ws.receive_json() - assert data["author"] == "dummy agent" - - -def test_run_live_websocket_missing_app_name_raises_error( - test_app, monkeypatch -): - """Test that /run_live websocket connection fails when app_name and ADK_DEFAULT_APP_NAME are both missing.""" - from fastapi.websockets import WebSocketDisconnect - - monkeypatch.delenv("ADK_DEFAULT_APP_NAME", raising=False) - - url = "/run_live?user_id=user&session_id=session&modalities=AUDIO" - - with pytest.raises(WebSocketDisconnect) as exc_info: - with test_app.websocket_connect(url) as ws: - ws.receive_json() - assert exc_info.value.code == 1008 - - -def test_is_single_agent_directory(tmp_path): - """Verify that is_single_agent_directory only identifies directories with agent.py or root_agent.yaml.""" - from google.adk.cli.utils.agent_loader import is_single_agent_directory - - # Directory with agent.py (should be identified as agent) - agent_py_dir = tmp_path / "agent_py_dir" - agent_py_dir.mkdir() - (agent_py_dir / "agent.py").write_text("root_agent = 'dummy'") - assert is_single_agent_directory(str(agent_py_dir)) is True - - # Directory with root_agent.yaml (should be identified as agent) - yaml_dir = tmp_path / "yaml_dir" - yaml_dir.mkdir() - (yaml_dir / "root_agent.yaml").write_text("root_agent: dummy") - assert is_single_agent_directory(str(yaml_dir)) is True - - # Normal directory or standard package with __init__.py only (should NOT be identified as agent) - normal_pkg = tmp_path / "normal_pkg" - normal_pkg.mkdir() - (normal_pkg / "__init__.py").write_text( - "from .app import App\nimport something" - ) - assert is_single_agent_directory(str(normal_pkg)) is False - - -def test_agent_loader_single_agent_mode(tmp_path): - """Verify that AgentLoader automatically detects and configures single agent mode.""" - agent_folder = tmp_path / "my_test_agent" - agent_folder.mkdir() - (agent_folder / "agent.py").write_text("root_agent = 'dummy'") - - loader = fast_api_module.AgentLoader(str(agent_folder)) - - assert loader._is_single_agent is True - assert loader._single_agent_name == "my_test_agent" - assert loader.agents_dir == str(tmp_path) - assert loader.list_agents() == ["my_test_agent"] - - -def test_single_agent_mode_detection( - tmp_path, - mock_session_service, - mock_artifact_service, - mock_memory_service, - mock_eval_sets_manager, - mock_eval_set_results_manager, -): - """Verify that pointing agents_dir to a single agent folder enables single agent mode.""" - agent_folder = tmp_path / "my_only_agent" - agent_folder.mkdir() - (agent_folder / "agent.py").write_text("root_agent = None") - - with ( - patch.object(signal, "signal", autospec=True, return_value=None), - patch.object( - fast_api_module, - "create_session_service_from_options", - autospec=True, - return_value=mock_session_service, - ), - patch.object( - fast_api_module, - "create_artifact_service_from_options", - autospec=True, - return_value=mock_artifact_service, - ), - patch.object( - fast_api_module, - "create_memory_service_from_options", - autospec=True, - return_value=mock_memory_service, - ), - patch.object( - fast_api_module, - "LocalEvalSetsManager", - autospec=True, - return_value=mock_eval_sets_manager, - ), - patch.object( - fast_api_module, - "LocalEvalSetResultsManager", - autospec=True, - return_value=mock_eval_set_results_manager, - ), - ): - app = get_fast_api_app( - agents_dir=str(agent_folder), - web=True, - session_service_uri="", - artifact_service_uri="", - memory_service_uri="", - allow_origins=None, - a2a=False, - host="127.0.0.1", - port=8000, - ) - client = TestClient(app) - - response = client.get("/list-apps") - assert response.status_code == 200 - assert response.json() == ["my_only_agent"] - - -def test_single_agent_mode_sets_default_app( - tmp_path, - mock_session_service, - mock_artifact_service, - mock_memory_service, - mock_eval_sets_manager, - mock_eval_set_results_manager, - monkeypatch, -): - """Verify that in single agent mode, the agent is used as default app.""" - # Set environment variable to something else, but single mode should take precedence. - monkeypatch.setenv("ADK_DEFAULT_APP_NAME", "some_other_app") - - agent_folder = tmp_path / "my_only_agent" - agent_folder.mkdir() - (agent_folder / "agent.py").write_text("root_agent = None") - - # Setup session data in the in-memory service - async def setup_session(): - await mock_session_service.create_session( - app_name="my_only_agent", - user_id="test_user", - session_id="test_session", - state={}, - ) - - asyncio.run(setup_session()) - - with ( - patch.object(signal, "signal", autospec=True, return_value=None), - patch.object( - fast_api_module, - "create_session_service_from_options", - autospec=True, - return_value=mock_session_service, - ), - patch.object( - fast_api_module, - "create_artifact_service_from_options", - autospec=True, - return_value=mock_artifact_service, - ), - patch.object( - fast_api_module, - "create_memory_service_from_options", - autospec=True, - return_value=mock_memory_service, - ), - patch.object( - fast_api_module, - "LocalEvalSetsManager", - autospec=True, - return_value=mock_eval_sets_manager, - ), - patch.object( - fast_api_module, - "LocalEvalSetResultsManager", - autospec=True, - return_value=mock_eval_set_results_manager, - ), - ): - app = get_fast_api_app( - agents_dir=str(agent_folder), - web=True, - session_service_uri="", - artifact_service_uri="", - memory_service_uri="", - allow_origins=None, - a2a=False, - host="127.0.0.1", - port=8000, - ) - client = TestClient(app) - - # Accessing /users/{user_id}/sessions/{session_id} should work because of rewrite - response = client.get("/users/test_user/sessions/test_session") - assert response.status_code == 200 - assert response.json()["id"] == "test_session" - - -def test_agent_run_disconnect_aborts_run( - test_app, create_test_session, monkeypatch -): - """Test that /run endpoint aborts agent execution on client disconnect. - - Verifies that when the client connection is dropped during an active agent - run: - 1. The background agent execution generator task is cancelled. - 2. The endpoint returns a clean 499 (Client Closed Request) status code. - """ - import starlette.requests - - info = create_test_session - trigger_disconnect: dict[str, bool] = {"value": False} - was_cancelled: dict[str, bool] = {"value": False} - - async def run_async_mock( - self, - *, - user_id: str, - session_id: str, - invocation_id: Optional[str] = None, - new_message: Optional[types.Content] = None, - state_delta: Optional[dict[str, Any]] = None, - run_config: Optional[RunConfig] = None, - ): - del ( - self, - user_id, - session_id, - invocation_id, - new_message, - state_delta, - run_config, - ) - try: - # Yield first pulse event - yield _event_1() - # Simulate connection drop mid-run - trigger_disconnect["value"] = True - # Run a long async operation to allow the monitor to trigger cancellation - await asyncio.sleep(1.0) - yield _event_2() - except asyncio.CancelledError: - was_cancelled["value"] = True - raise - - monkeypatch.setattr(Runner, "run_async", run_async_mock) - - # Monkeypatch starlette.requests.Request.__init__ to inject simulated disconnect - original_init = starlette.requests.Request.__init__ - - def custom_init(self, *args, **kwargs): - original_init(self, *args, **kwargs) - original_receive = self._receive - call_count = 0 - - async def mock_receive(): - nonlocal call_count - call_count += 1 - if call_count == 1: - return await original_receive() - - # Subsequent calls block until simulated connection drop is triggered - while not trigger_disconnect["value"]: - await asyncio.sleep(0.01) - return {"type": "http.disconnect"} - - self._receive = mock_receive - self.__dict__["receive"] = mock_receive - - monkeypatch.setattr(starlette.requests.Request, "__init__", custom_init) - - payload = { - "app_name": info["app_name"], - "user_id": info["user_id"], - "session_id": info["session_id"], - "new_message": {"role": "user", "parts": [{"text": "Hello agent"}]}, - "streaming": False, - } - - # When standard /run POST request is initiated and mid-run connection drop occurs - response = test_app.post("/run", json=payload) - - # Then the response status should be 499 and the running generator was cancelled - assert response.status_code == 499 - assert was_cancelled["value"] is True - - -################################################# -# Gemini Enterprise Tests -################################################# - - -def test_gemini_app_not_found_raises( - mock_session_service, - mock_artifact_service, - mock_memory_service, - mock_agent_loader, - mock_eval_sets_manager, - mock_eval_set_results_manager, - monkeypatch, -): - """Test get_fast_api_app raises ValueError if gemini_enterprise_app_name not found.""" - monkeypatch.setenv("GOOGLE_CLOUD_PROJECT", "test-project") - mock_agent_loader.list_agents = MagicMock(return_value=["test_app"]) - with pytest.raises(ValueError, match="not found in dir"): - _create_test_client( - mock_session_service, - mock_artifact_service, - mock_memory_service, - mock_agent_loader, - mock_eval_sets_manager, - mock_eval_set_results_manager, - gemini_enterprise_app_name="nonexistent_app", - ) - - -def test_gemini_reasoning_engine_success(test_app_with_gemini_enterprise): - """Test POST /api/reasoning_engine success case.""" - response = test_app_with_gemini_enterprise.post( - "/api/reasoning_engine", - json={"class_method": "get_session", "input": {"arg1": 1}}, - ) - assert response.status_code == 200 - assert response.json() == { - "output": {"result": "success", "kwargs": {"arg1": 1}} - } - - -def test_gemini_reasoning_engine_missing_class_method( - test_app_with_gemini_enterprise, -): - """Test POST /api/reasoning_engine with missing class_method.""" - response = test_app_with_gemini_enterprise.post( - "/api/reasoning_engine", - json={"input": {"arg1": 1}}, - ) - assert response.status_code == 400 - - -def test_gemini_stream_reasoning_engine_success( - test_app_with_gemini_enterprise, -): - """Test POST /api/stream_reasoning_engine success case.""" - response = test_app_with_gemini_enterprise.post( - "/api/stream_reasoning_engine", - json={"class_method": "stream_query", "input": {"arg1": 1}}, - ) - assert response.status_code == 200 - lines = response.text.strip().split("\n") - assert len(lines) == 2 - assert json.loads(lines[0]) == {"chunk": 1, "kwargs": {"arg1": 1}} - assert json.loads(lines[1]) == {"chunk": 2, "kwargs": {"arg1": 1}} - - -def test_gemini_stream_reasoning_engine_missing_class_method( - test_app_with_gemini_enterprise, -): - """Test POST /api/stream_reasoning_engine with missing class_method.""" - response = test_app_with_gemini_enterprise.post( - "/api/stream_reasoning_engine", - json={"input": {"arg1": 1}}, - ) - assert response.status_code == 400 - - if __name__ == "__main__": pytest.main(["-xvs", __file__]) diff --git a/tests/unittests/cli/test_resolve_root_directory.py b/tests/unittests/cli/test_resolve_root_directory.py deleted file mode 100644 index b442be8cbe..0000000000 --- a/tests/unittests/cli/test_resolve_root_directory.py +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Path-traversal containment tests for Agent Builder file tools.""" - -from __future__ import annotations - -import os -from pathlib import Path -from unittest import mock - -from google.adk.cli.built_in_agents.tools.delete_files import delete_files -from google.adk.cli.built_in_agents.tools.read_files import read_files -from google.adk.cli.built_in_agents.tools.write_files import write_files -from google.adk.cli.built_in_agents.utils.resolve_root_directory import resolve_file_path -import pytest - - -def _tool_context(root: Path) -> mock.MagicMock: - tool_context = mock.MagicMock() - tool_context._invocation_context.session.state = {"root_directory": str(root)} - return tool_context - - -def test_resolve_file_path_allows_path_within_root(tmp_path): - resolved = resolve_file_path( - "sub/dir/file.txt", {"root_directory": str(tmp_path)} - ) - assert resolved == (tmp_path / "sub" / "dir" / "file.txt").resolve() - - -def test_resolve_file_path_allows_dot(tmp_path): - resolved = resolve_file_path(".", {"root_directory": str(tmp_path)}) - assert resolved == tmp_path.resolve() - - -def test_resolve_file_path_allows_interior_dotdot_within_root(tmp_path): - resolved = resolve_file_path( - "sub/../file.txt", {"root_directory": str(tmp_path)} - ) - assert resolved == (tmp_path / "file.txt").resolve() - - -def test_resolve_file_path_allows_absolute_within_root(tmp_path): - target = tmp_path / "nested" / "ok.txt" - resolved = resolve_file_path(str(target), {"root_directory": str(tmp_path)}) - assert resolved == target.resolve() - - -def test_resolve_file_path_rejects_relative_traversal(tmp_path): - with pytest.raises(ValueError): - resolve_file_path("../../escape.txt", {"root_directory": str(tmp_path)}) - - -def test_resolve_file_path_rejects_absolute_outside_root(tmp_path): - with pytest.raises(ValueError): - resolve_file_path("/etc/passwd", {"root_directory": str(tmp_path)}) - - -async def test_write_files_blocks_relative_traversal( - tmp_path, tmp_path_factory -): - outside = tmp_path_factory.mktemp("outside") - payload = os.path.relpath(outside / "pwned.txt", tmp_path) - - result = await write_files( - files={payload: "PWNED"}, tool_context=_tool_context(tmp_path) - ) - - assert not result["success"] - assert not (outside / "pwned.txt").exists() - - -async def test_write_files_blocks_absolute_outside_root( - tmp_path, tmp_path_factory -): - outside = tmp_path_factory.mktemp("outside") - target = outside / "abs.txt" - - result = await write_files( - files={str(target): "PWNED"}, tool_context=_tool_context(tmp_path) - ) - - assert not result["success"] - assert not target.exists() - - -async def test_write_files_allows_path_within_root(tmp_path): - result = await write_files( - files={"sub/ok.txt": "hello"}, tool_context=_tool_context(tmp_path) - ) - - assert result["success"] - assert (tmp_path / "sub" / "ok.txt").read_text() == "hello" - - -async def test_read_files_blocks_relative_traversal(tmp_path, tmp_path_factory): - outside = tmp_path_factory.mktemp("outside") - secret = outside / "secret.txt" - secret.write_text("TOKEN=abc") - payload = os.path.relpath(secret, tmp_path) - - result = await read_files( - file_paths=[payload], tool_context=_tool_context(tmp_path) - ) - - assert not result["success"] - assert all( - "TOKEN=abc" not in info.get("content", "") - for info in result["files"].values() - ) - - -async def test_delete_files_blocks_relative_traversal( - tmp_path, tmp_path_factory -): - outside = tmp_path_factory.mktemp("outside") - victim = outside / "victim.txt" - victim.write_text("bye") - payload = os.path.relpath(victim, tmp_path) - - result = await delete_files( - file_paths=[payload], - tool_context=_tool_context(tmp_path), - confirm_deletion=True, - ) - - assert not result["success"] - assert victim.exists() diff --git a/tests/unittests/cli/utils/test_agent_loader.py b/tests/unittests/cli/utils/test_agent_loader.py index 4da5f063ff..8454323189 100644 --- a/tests/unittests/cli/utils/test_agent_loader.py +++ b/tests/unittests/cli/utils/test_agent_loader.py @@ -308,21 +308,11 @@ def test_agent_loader_with_mocked_windows_path(self, monkeypatch): del self windows_path = "C:\\Users\\dev\\agents\\" - class MockWindowsPath(PureWindowsPath): - - def resolve(self): - return self - with monkeypatch.context() as m: m.setattr( agent_loader_module, "Path", - MockWindowsPath, - ) - m.setattr( - agent_loader_module, - "is_single_agent_directory", - lambda path: False, + lambda path_str: PureWindowsPath(path_str), ) loader = AgentLoader(windows_path) @@ -468,7 +458,7 @@ def __init__(self): def test_sys_path_modification(self): """Test that agents_dir is added to sys.path correctly.""" with tempfile.TemporaryDirectory() as temp_dir: - temp_path = Path(temp_dir).resolve() + temp_path = Path(temp_dir) # Create agent self.create_agent_structure(temp_path, "path_agent", "module") diff --git a/tests/unittests/cli/utils/test_cli.py b/tests/unittests/cli/utils/test_cli.py index 479be61fb1..f7df1bf17f 100644 --- a/tests/unittests/cli/utils/test_cli.py +++ b/tests/unittests/cli/utils/test_cli.py @@ -24,7 +24,6 @@ from typing import Dict from typing import List from typing import Tuple -from unittest import mock import click from google.adk.agents.base_agent import BaseAgent @@ -33,7 +32,6 @@ from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService from google.adk.auth.credential_service.in_memory_credential_service import InMemoryCredentialService import google.adk.cli.cli as cli -from google.adk.cli.utils.local_storage import PerAgentFileArtifactService from google.adk.cli.utils.service_factory import create_artifact_service_from_options from google.adk.sessions.in_memory_session_service import InMemorySessionService import pytest @@ -87,13 +85,7 @@ async def run_async(self, *a: Any, **k: Any): message = a[2] if len(a) >= 3 else k["new_message"] text = message.parts[0].text if message.parts else "" response = _Content("assistant", [_Part(f"echo:{text}")]) - ev = types.SimpleNamespace( - author="assistant", - content=response, - node_info=None, - long_running_tool_ids=[], - ) - yield ev + yield types.SimpleNamespace(author="assistant", content=response) async def close(self, *a: Any, **k: Any) -> None: ... @@ -299,28 +291,30 @@ async def test_run_cli_save_session( assert "id" in data and "events" in data -@pytest.mark.asyncio -async def test_create_artifact_service_isolates_artifacts_per_agent( - tmp_path: Path, -) -> None: - """Each agent's artifacts should land in its own .adk/artifacts folder.""" - (tmp_path / "agent_a").mkdir() - (tmp_path / "agent_b").mkdir() +def test_create_artifact_service_defaults_to_file(tmp_path: Path) -> None: + """Service factory should default to FileArtifactService when URI is unset.""" service = create_artifact_service_from_options( base_dir=tmp_path, use_local_storage=True, ) - assert isinstance(service, PerAgentFileArtifactService) + assert isinstance(service, FileArtifactService) + expected_root = Path(tmp_path) / ".adk" / "artifacts" + assert service.root_dir == expected_root + assert expected_root.exists() - # Touching each agent provisions its own per-agent .adk/artifacts folder. - for app_name in ("agent_a", "agent_b"): - await service.list_artifact_keys( - app_name=app_name, user_id="user", session_id="session" - ) - assert (tmp_path / "agent_a" / ".adk" / "artifacts").exists() - assert (tmp_path / "agent_b" / ".adk" / "artifacts").exists() - assert not (tmp_path / ".adk").exists() +def test_create_artifact_service_uses_shared_root( + tmp_path: Path, +) -> None: + """Artifact service should use a single file artifact service.""" + service = create_artifact_service_from_options( + base_dir=tmp_path, + use_local_storage=True, + ) + assert isinstance(service, FileArtifactService) + expected_root = Path(tmp_path) / ".adk" / "artifacts" + assert service.root_dir == expected_root + assert expected_root.exists() def test_create_artifact_service_respects_memory_uri(tmp_path: Path) -> None: diff --git a/tests/unittests/cli/utils/test_cli_create.py b/tests/unittests/cli/utils/test_cli_create.py index 1f4495ecd3..a8544579c5 100644 --- a/tests/unittests/cli/utils/test_cli_create.py +++ b/tests/unittests/cli/utils/test_cli_create.py @@ -182,7 +182,7 @@ def test_run_cmd_invalid_app_name( with pytest.raises(click.BadParameter, match="Invalid app name"): cli_create.run_cmd( - "invalid name", + "my-agent", model="gemini-2.5-flash", google_api_key=None, google_cloud_project=None, diff --git a/tests/unittests/cli/utils/test_cli_deploy.py b/tests/unittests/cli/utils/test_cli_deploy.py index 57eca8a17f..506e274845 100644 --- a/tests/unittests/cli/utils/test_cli_deploy.py +++ b/tests/unittests/cli/utils/test_cli_deploy.py @@ -30,12 +30,9 @@ from unittest import mock import click -from click.testing import CliRunner +from google.adk.cli import cli_deploy import pytest -import src.google.adk.cli.cli_deploy as cli_deploy -import src.google.adk.cli.cli_tools_click as cli_tools_click - # Helpers class _Recorder: @@ -235,6 +232,19 @@ def test_get_service_option_by_adk_version( assert actual.rstrip() == expected.rstrip() +def test_agent_engine_app_template_compiles_with_windows_paths() -> None: + """It should not emit invalid Python when paths contain `\\u` segments.""" + rendered = cli_deploy._AGENT_ENGINE_APP_TEMPLATE.format( + is_config_agent=True, + agent_folder=r".\user_agent_tmp20260101_000000", + adk_app_object="root_agent", + adk_app_type="agent", + trace_to_cloud_option=False, + express_mode=False, + ) + compile(rendered, "", "exec") + + def test_print_agent_engine_url() -> None: """It should print the correct URL for a fully-qualified resource name.""" with mock.patch("click.secho") as mocked_secho: @@ -264,8 +274,8 @@ def test_to_agent_engine_happy_path( class _FakeAgentEngines: - def create(self, **kwargs: Any) -> Any: - create_recorder(**kwargs) + def create(self, *, config: Dict[str, Any]) -> Any: + create_recorder(config=config) return types.SimpleNamespace( api_resource=types.SimpleNamespace( name="projects/p/locations/l/reasoningEngines/e" @@ -290,15 +300,27 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: cli_deploy.to_agent_engine( agent_folder=str(src_dir), temp_folder="tmp", + adk_app="my_adk_app", trace_to_cloud=True, project="my-gcp-project", region="us-central1", display_name="My Test Agent", description="A test agent.", - adk_version="1.2.0", ) - agent_file = tmp_dir / "Dockerfile" + agent_file = tmp_dir / "agent.py" assert agent_file.is_file() + init_file = tmp_dir / "__init__.py" + assert init_file.is_file() + adk_app_file = tmp_dir / "my_adk_app.py" + assert adk_app_file.is_file() + content = adk_app_file.read_text() + assert "from .agent import root_agent" in content + assert "adk_app = AdkApp(" in content + assert "agent=root_agent" in content + assert "enable_tracing=True" in content + reqs_path = tmp_dir / "requirements.txt" + assert reqs_path.is_file() + assert "google-cloud-aiplatform[adk,agent_engines]" in reqs_path.read_text() assert len(create_recorder.calls) == 1 assert str(rmtree_recorder.get_last_call_args()[0]) == str(tmp_dir) @@ -318,19 +340,123 @@ def test_to_agent_engine_raises_when_explicit_config_file_missing( cli_deploy.to_agent_engine( agent_folder=str(src_dir), temp_folder="tmp", + adk_app="my_adk_app", trace_to_cloud=True, project="my-gcp-project", region="us-central1", display_name="My Test Agent", description="A test agent.", agent_engine_config_file=str(missing_config), - adk_version="1.2.0", ) - assert "Agent Platform config file not found" in str(exc_info.value) + assert "Agent engine config file not found" in str(exc_info.value) assert expected_abs in str(exc_info.value) +def test_to_agent_engine_skips_agent_import_validation_by_default( + monkeypatch: pytest.MonkeyPatch, + agent_dir: Callable[[bool, bool], Path], +) -> None: + """It should skip agent.py import validation by default.""" + validate_recorder = _Recorder() + + def _validate_agent_import(*args: Any, **kwargs: Any) -> None: + validate_recorder(*args, **kwargs) + raise AssertionError("_validate_agent_import should not be called") + + monkeypatch.setattr( + cli_deploy, "_validate_agent_import", _validate_agent_import + ) + + fake_vertexai = types.ModuleType("vertexai") + + class _FakeAgentEngines: + + def create(self, *, config: Dict[str, Any]) -> Any: + del config + return types.SimpleNamespace( + api_resource=types.SimpleNamespace( + name="projects/p/locations/l/reasoningEngines/e" + ) + ) + + class _FakeVertexClient: + + def __init__(self, *args: Any, **kwargs: Any) -> None: + del args + del kwargs + self.agent_engines = _FakeAgentEngines() + + fake_vertexai.Client = _FakeVertexClient + monkeypatch.setitem(sys.modules, "vertexai", fake_vertexai) + + src_dir = agent_dir(False, False) + cli_deploy.to_agent_engine( + agent_folder=str(src_dir), + temp_folder="tmp", + adk_app="my_adk_app", + trace_to_cloud=True, + project="my-gcp-project", + region="us-central1", + display_name="My Test Agent", + description="A test agent.", + ) + + assert validate_recorder.calls == [] + + +def test_to_agent_engine_validates_agent_import_when_enabled( + monkeypatch: pytest.MonkeyPatch, + agent_dir: Callable[[bool, bool], Path], +) -> None: + """It should run agent.py import validation when enabled.""" + validate_recorder = _Recorder() + + def _validate_agent_import(*args: Any, **kwargs: Any) -> None: + validate_recorder(*args, **kwargs) + + monkeypatch.setattr( + cli_deploy, "_validate_agent_import", _validate_agent_import + ) + + fake_vertexai = types.ModuleType("vertexai") + + class _FakeAgentEngines: + + def create(self, *, config: Dict[str, Any]) -> Any: + del config + return types.SimpleNamespace( + api_resource=types.SimpleNamespace( + name="projects/p/locations/l/reasoningEngines/e" + ) + ) + + class _FakeVertexClient: + + def __init__(self, *args: Any, **kwargs: Any) -> None: + del args + del kwargs + self.agent_engines = _FakeAgentEngines() + + fake_vertexai.Client = _FakeVertexClient + monkeypatch.setitem(sys.modules, "vertexai", fake_vertexai) + + src_dir = agent_dir(False, False) + cli_deploy.to_agent_engine( + agent_folder=str(src_dir), + temp_folder="tmp", + adk_app="my_adk_app", + trace_to_cloud=True, + project="my-gcp-project", + region="us-central1", + display_name="My Test Agent", + description="A test agent.", + skip_agent_import_validation=False, + ) + + assert len(validate_recorder.calls) == 1 + + @pytest.mark.parametrize("include_requirements", [True, False]) def test_to_gke_happy_path( monkeypatch: pytest.MonkeyPatch, @@ -378,7 +504,7 @@ def mock_subprocess_run(*args, **kwargs): dockerfile_path = tmp_path / "Dockerfile" assert dockerfile_path.is_file() dockerfile_content = dockerfile_path.read_text() - assert "CMD adk api_server --with_ui --port=9090" in dockerfile_content + assert "CMD adk web --port=9090" in dockerfile_content assert "RUN pip install google-adk==1.2.0" in dockerfile_content assert len(run_recorder.calls) == 3, "Expected 3 subprocess calls" @@ -593,13 +719,11 @@ def test_to_agent_engine_triggers_onboarding( cli_deploy._onboarding, "handle_login_with_google", mock_handle_login ) - # Mock subprocess.run so `gcloud config get-value project` returns no - # default project; otherwise `_resolve_project` would populate `project` - # and suppress the onboarding flow this test is exercising. + # Mock subprocess.run to avoid calling gcloud monkeypatch.setattr( subprocess, "run", - lambda *a, **k: types.SimpleNamespace(stdout="\n"), + lambda *a, **k: types.SimpleNamespace(stdout="fake-project\n"), ) fake_vertexai = types.ModuleType("vertexai") @@ -614,8 +738,6 @@ def test_to_agent_engine_triggers_onboarding( name="projects/p/locations/l/reasoningEngines/e" ) ) - mock_agent_engines.delete.return_value = None - mock_agent_engines.update.return_value = None monkeypatch.setitem(sys.modules, "vertexai", fake_vertexai) @@ -623,6 +745,7 @@ def test_to_agent_engine_triggers_onboarding( cli_deploy.to_agent_engine( agent_folder=str(src_dir), + adk_app="my_adk_app", trace_to_cloud=True, ) @@ -634,51 +757,3 @@ def test_to_agent_engine_triggers_onboarding( assert kwargs.get("project") == "fake_project" assert kwargs.get("location") == "fake_region" assert "api_key" not in kwargs or kwargs.get("api_key") is None - - -def test_cli_deploy_agent_engine_trigger_sources(tmp_path: Path): - """Tests that --trigger_sources is passed to to_agent_engine.""" - agent_dir = tmp_path / "my_agent" - agent_dir.mkdir() - runner = CliRunner() - with mock.patch( - "src.google.adk.cli.cli_deploy.to_agent_engine" - ) as mock_to_agent_engine: - result = runner.invoke( - cli_tools_click.main, - [ - "deploy", - "agent_engine", - "--trigger_sources=pubsub,eventarc", - str(agent_dir), - ], - catch_exceptions=False, - ) - assert result.exit_code == 0 - mock_to_agent_engine.assert_called_once() - _, kwargs = mock_to_agent_engine.call_args - assert kwargs["trigger_sources"] == "pubsub,eventarc" - - -def test_cli_deploy_agent_engine_artifact_service_uri(tmp_path: Path): - """Tests that --artifact_service_uri is passed to to_agent_engine.""" - agent_dir = tmp_path / "my_agent" - agent_dir.mkdir() - runner = CliRunner() - with mock.patch( - "src.google.adk.cli.cli_deploy.to_agent_engine" - ) as mock_to_agent_engine: - result = runner.invoke( - cli_tools_click.main, - [ - "deploy", - "agent_engine", - "--artifact_service_uri=gs://my-bucket", - str(agent_dir), - ], - catch_exceptions=False, - ) - assert result.exit_code == 0 - mock_to_agent_engine.assert_called_once() - _, kwargs = mock_to_agent_engine.call_args - assert kwargs["artifact_service_uri"] == "gs://my-bucket" diff --git a/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py b/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py index 0a5b8f398d..d94fd1a066 100644 --- a/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py +++ b/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py @@ -28,10 +28,9 @@ from unittest import mock import click +from google.adk.cli import cli_deploy import pytest -import src.google.adk.cli.cli_deploy as cli_deploy - class AgentDirFixture(Protocol): """Protocol for the agent_dir pytest fixture factory.""" @@ -143,7 +142,7 @@ def test_to_cloud_run_happy_path( assert dockerfile_path.is_file() dockerfile_content = dockerfile_path.read_text() - expected_command = "api_server --with_ui" if with_ui else "api_server" + expected_command = "web" if with_ui else "api_server" assert f"CMD adk {expected_command} --port=8080" in dockerfile_content assert "FROM python:3.11-slim" in dockerfile_content assert ( diff --git a/tests/unittests/cli/utils/test_cli_tools_click.py b/tests/unittests/cli/utils/test_cli_tools_click.py index 43b0e8c169..ad47c9ecbe 100644 --- a/tests/unittests/cli/utils/test_cli_tools_click.py +++ b/tests/unittests/cli/utils/test_cli_tools_click.py @@ -35,7 +35,6 @@ from google.adk.evaluation.eval_set import EvalSet from google.adk.evaluation.local_eval_set_results_manager import LocalEvalSetResultsManager from google.adk.evaluation.local_eval_sets_manager import LocalEvalSetsManager -from google.adk.events.event import Event from pydantic import BaseModel import pytest @@ -117,7 +116,7 @@ def test_cli_create_cmd_invokes_run_cmd( ) -> None: """`adk create` should forward arguments to cli_create.run_cmd.""" rec = _Recorder() - monkeypatch.setattr("google.adk.cli.cli_create.run_cmd", rec) + monkeypatch.setattr(cli_tools_click.cli_create, "run_cmd", rec) app_dir = tmp_path / "my_app" runner = CliRunner() @@ -197,609 +196,13 @@ def capture_asyncio_run(coro): assert coro_locals["agent_folder_name"] == "agent" -def test_cli_run_basic_with_query( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch -) -> None: - """`adk run` with query should invoke run_once_cli.""" - # Arrange - agent_dir = tmp_path / "agent" - agent_dir.mkdir() - (agent_dir / "__init__.py").touch() - (agent_dir / "agent.py").touch() - - mock_run_once = mock.AsyncMock(return_value=0) - monkeypatch.setattr("google.adk.cli.cli.run_once_cli", mock_run_once) - - runner = CliRunner() - - # Act - result = runner.invoke( - cli_tools_click.main, - ["run", str(agent_dir), "hello"], - ) - - # Assert - assert result.exit_code == 0 - assert mock_run_once.called - called_kwargs = mock_run_once.call_args.kwargs - assert called_kwargs.get("query") == "hello" - assert called_kwargs.get("agent_folder_name") == "agent" - - -def test_cli_run_interactive_with_state( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch -) -> None: - """`adk run` in interactive mode should pass state to run_cli.""" - # Arrange - agent_dir = tmp_path / "agent_interactive" - agent_dir.mkdir() - (agent_dir / "__init__.py").touch() - (agent_dir / "agent.py").touch() - - mock_run_cli = mock.AsyncMock() - monkeypatch.setattr("google.adk.cli.cli_tools_click.run_cli", mock_run_cli) - - runner = CliRunner() - - # Act - result = runner.invoke( - cli_tools_click.main, - ["run", str(agent_dir), "--state", '{"x": 1}'], - ) - - # Assert - assert result.exit_code == 0 - assert mock_run_cli.called - called_kwargs = mock_run_cli.call_args.kwargs - assert called_kwargs.get("state_str") == '{"x": 1}' - - -def test_cli_run_options_with_query( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch -) -> None: - """`adk run` with query and options should forward options correctly.""" - # Arrange - agent_dir = tmp_path / "agent_opts" - agent_dir.mkdir() - (agent_dir / "__init__.py").touch() - - mock_run_once = mock.AsyncMock(return_value=0) - monkeypatch.setattr("google.adk.cli.cli.run_once_cli", mock_run_once) - - runner = CliRunner() - - # Act - result = runner.invoke( - cli_tools_click.main, - [ - "run", - str(agent_dir), - "hello", - "--state", - '{"x": 1}', - "--in_memory", - "--jsonl", - ], - ) - - # Assert - assert result.exit_code == 0 - assert mock_run_once.called - called_kwargs = mock_run_once.call_args.kwargs - assert called_kwargs.get("query") == "hello" - assert called_kwargs.get("state_str") == '{"x": 1}' - assert called_kwargs.get("in_memory") is True - assert called_kwargs.get("jsonl") is True - - -def test_cli_run_auto_resume_with_query( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch -) -> None: - """`adk run` with query should auto-resume if session has active interrupts.""" - # Arrange - agent_dir = tmp_path / "agent_resume" - agent_dir.mkdir() - (agent_dir / "__init__.py").touch() - (agent_dir / "agent.py").touch() - - # Mock session service - mock_session = mock.Mock() - mock_session.id = "s123" - mock_session.user_id = "u123" - mock_session.app_name = "agent_resume" - - # Create a mock event with long_running_tool_ids - mock_event = Event( - invocation_id="invocation_123", - long_running_tool_ids={"interrupt_123"}, - author="agent", - ) - mock_session.events = [mock_event] - - mock_session_service = mock.AsyncMock() - mock_session_service.get_session.return_value = mock_session - - monkeypatch.setattr( - "google.adk.cli.cli.create_session_service_from_options", - mock.Mock(return_value=mock_session_service), - ) - - # Mock AgentLoader to avoid loading real files - mock_agent_loader = mock.Mock() - mock_agent_loader.load_agent.return_value = mock.Mock(name="agent_resume") - monkeypatch.setattr( - "google.adk.cli.cli.AgentLoader", - mock.Mock(return_value=mock_agent_loader), - ) - - # Mock Runner - mock_runner_instance = mock.Mock() - - # Create an async generator for run_async - async def mock_run_async(*args, **kwargs): - # Yield a mock event to simulate engine output - ev = mock.Mock() - ev.author = "agent" - ev.node_info = mock.Mock(path="node") - ev.content = None - ev.long_running_tool_ids = [] - # Add model_dump method as it's called in _print_event - ev.model_dump.return_value = {"author": "agent", "node_path": "node"} - yield ev - - mock_runner_instance.run_async.side_effect = mock_run_async - mock_runner_instance.close = mock.AsyncMock() - - monkeypatch.setattr( - "google.adk.cli.cli.Runner", - mock.Mock(return_value=mock_runner_instance), - ) - - # Mock _to_app to return a mock app - monkeypatch.setattr( - "google.adk.cli.cli._to_app", - mock.Mock(return_value=mock.Mock(name="agent_resume")), - ) - - runner = CliRunner() - - # Act - result = runner.invoke( - cli_tools_click.main, - [ - "run", - str(agent_dir), - "approve", - "--session_id", - "s123", - ], - ) - - # Assert - assert result.exit_code == 0 - - # Verify run_async was called with FunctionResponse - called_args = mock_runner_instance.run_async.call_args - assert called_args is not None - kwargs = called_args.kwargs - new_message = kwargs.get("new_message") - assert new_message is not None - assert len(new_message.parts) == 1 - part = new_message.parts[0] - assert part.function_response is not None - assert part.function_response.id == "interrupt_123" - assert part.function_response.response == {"result": "approve"} - - -def test_cli_run_auto_resume_with_query_confirmation_yes( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch -) -> None: - """`adk run` with query should auto-resume with confirmation=True if query is positive.""" - # Arrange - agent_dir = tmp_path / "agent_resume_confirm_yes" - agent_dir.mkdir() - (agent_dir / "__init__.py").touch() - (agent_dir / "agent.py").touch() - - # Mock session service - mock_session = mock.Mock() - mock_session.id = "s123" - mock_session.user_id = "u123" - mock_session.app_name = "agent_resume_confirm_yes" - - # Create a mock event with long_running_tool_ids - mock_event = mock.Mock() - mock_event.long_running_tool_ids = ["interrupt_123"] - mock_event.invocation_id = "invocation_123" - - # Mock get_function_calls to return adk_request_confirmation - fc = mock.Mock() - fc.id = "interrupt_123" - fc.name = "adk_request_confirmation" - mock_event.get_function_calls.return_value = [fc] - - mock_session.events = [mock_event] - - mock_session_service = mock.AsyncMock() - mock_session_service.get_session.return_value = mock_session - - monkeypatch.setattr( - "google.adk.cli.cli.create_session_service_from_options", - mock.Mock(return_value=mock_session_service), - ) - - # Mock AgentLoader to avoid loading real files - mock_agent_loader = mock.Mock() - mock_agent_loader.load_agent.return_value = mock.Mock( - name="agent_resume_confirm_yes" - ) - monkeypatch.setattr( - "google.adk.cli.cli.AgentLoader", - mock.Mock(return_value=mock_agent_loader), - ) - - # Mock Runner - mock_runner_instance = mock.Mock() - - # Create an async generator for run_async - async def mock_run_async(*args, **kwargs): - ev = mock.Mock() - ev.author = "agent" - ev.node_info = mock.Mock(path="node") - ev.content = None - ev.long_running_tool_ids = [] - ev.model_dump.return_value = {"author": "agent", "node_path": "node"} - yield ev - - mock_runner_instance.run_async.side_effect = mock_run_async - mock_runner_instance.close = mock.AsyncMock() - - monkeypatch.setattr( - "google.adk.cli.cli.Runner", - mock.Mock(return_value=mock_runner_instance), - ) - - # Mock _to_app to return a mock app - monkeypatch.setattr( - "google.adk.cli.cli._to_app", - mock.Mock(return_value=mock.Mock(name="agent_resume_confirm_yes")), - ) - - runner = CliRunner() - - # Act: Query is "yes" -> confirmed=True - result = runner.invoke( - cli_tools_click.main, - [ - "run", - str(agent_dir), - "yes", - "--session_id", - "s123", - ], - ) - - # Assert - assert result.exit_code == 0 - called_args = mock_runner_instance.run_async.call_args - assert called_args is not None - kwargs = called_args.kwargs - assert kwargs.get("invocation_id") == "invocation_123" - new_message = kwargs.get("new_message") - assert new_message is not None - assert len(new_message.parts) == 1 - part = new_message.parts[0] - assert part.function_response is not None - assert part.function_response.id == "interrupt_123" - assert part.function_response.name == "adk_request_confirmation" - assert part.function_response.response == {"confirmed": True} - - -def test_cli_run_auto_resume_with_query_confirmation_no( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch -) -> None: - """`adk run` with query should auto-resume with confirmation=False if query is negative.""" - # Arrange - agent_dir = tmp_path / "agent_resume_confirm_no" - agent_dir.mkdir() - (agent_dir / "__init__.py").touch() - (agent_dir / "agent.py").touch() - - # Mock session service - mock_session = mock.Mock() - mock_session.id = "s123" - mock_session.user_id = "u123" - mock_session.app_name = "agent_resume_confirm_no" - - # Create a mock event with long_running_tool_ids - mock_event = mock.Mock() - mock_event.long_running_tool_ids = ["interrupt_123"] - - # Mock get_function_calls to return adk_request_confirmation - fc = mock.Mock() - fc.id = "interrupt_123" - fc.name = "adk_request_confirmation" - mock_event.get_function_calls.return_value = [fc] - - mock_session.events = [mock_event] - - mock_session_service = mock.AsyncMock() - mock_session_service.get_session.return_value = mock_session - - monkeypatch.setattr( - "google.adk.cli.cli.create_session_service_from_options", - mock.Mock(return_value=mock_session_service), - ) - - # Mock AgentLoader to avoid loading real files - mock_agent_loader = mock.Mock() - mock_agent_loader.load_agent.return_value = mock.Mock( - name="agent_resume_confirm_no" - ) - monkeypatch.setattr( - "google.adk.cli.cli.AgentLoader", - mock.Mock(return_value=mock_agent_loader), - ) - - # Mock Runner - mock_runner_instance = mock.Mock() - - # Create an async generator for run_async - async def mock_run_async(*args, **kwargs): - ev = mock.Mock() - ev.author = "agent" - ev.node_info = mock.Mock(path="node") - ev.content = None - ev.long_running_tool_ids = [] - ev.model_dump.return_value = {"author": "agent", "node_path": "node"} - yield ev - - mock_runner_instance.run_async.side_effect = mock_run_async - mock_runner_instance.close = mock.AsyncMock() - - monkeypatch.setattr( - "google.adk.cli.cli.Runner", - mock.Mock(return_value=mock_runner_instance), - ) - - # Mock _to_app to return a mock app - monkeypatch.setattr( - "google.adk.cli.cli._to_app", - mock.Mock(return_value=mock.Mock(name="agent_resume_confirm_no")), - ) - - runner = CliRunner() - - # Act: Query is "no" -> confirmed=False - result = runner.invoke( - cli_tools_click.main, - [ - "run", - str(agent_dir), - "no", - "--session_id", - "s123", - ], - ) - - # Assert - assert result.exit_code == 0 - called_args = mock_runner_instance.run_async.call_args - assert called_args is not None - kwargs = called_args.kwargs - new_message = kwargs.get("new_message") - assert new_message is not None - assert len(new_message.parts) == 1 - part = new_message.parts[0] - assert part.function_response is not None - assert part.function_response.id == "interrupt_123" - assert part.function_response.name == "adk_request_confirmation" - assert part.function_response.response == {"confirmed": False} - - -def test_cli_run_auto_resume_with_query_confirmation_json( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch -) -> None: - """`adk run` with query should auto-resume with JSON response if query is valid JSON.""" - # Arrange - agent_dir = tmp_path / "agent_resume_confirm_json" - agent_dir.mkdir() - (agent_dir / "__init__.py").touch() - (agent_dir / "agent.py").touch() - - # Mock session service - mock_session = mock.Mock() - mock_session.id = "s123" - mock_session.user_id = "u123" - mock_session.app_name = "agent_resume_confirm_json" - - # Create a mock event with long_running_tool_ids - mock_event = mock.Mock() - mock_event.long_running_tool_ids = ["interrupt_123"] - - # Mock get_function_calls to return adk_request_confirmation - fc = mock.Mock() - fc.id = "interrupt_123" - fc.name = "adk_request_confirmation" - mock_event.get_function_calls.return_value = [fc] - - mock_session.events = [mock_event] - - mock_session_service = mock.AsyncMock() - mock_session_service.get_session.return_value = mock_session - - monkeypatch.setattr( - "google.adk.cli.cli.create_session_service_from_options", - mock.Mock(return_value=mock_session_service), - ) - - # Mock AgentLoader to avoid loading real files - mock_agent_loader = mock.Mock() - mock_agent_loader.load_agent.return_value = mock.Mock( - name="agent_resume_confirm_json" - ) - monkeypatch.setattr( - "google.adk.cli.cli.AgentLoader", - mock.Mock(return_value=mock_agent_loader), - ) - - # Mock Runner - mock_runner_instance = mock.Mock() - - # Create an async generator for run_async - async def mock_run_async(*args, **kwargs): - ev = mock.Mock() - ev.author = "agent" - ev.node_info = mock.Mock(path="node") - ev.content = None - ev.long_running_tool_ids = [] - ev.model_dump.return_value = {"author": "agent", "node_path": "node"} - yield ev - - mock_runner_instance.run_async.side_effect = mock_run_async - mock_runner_instance.close = mock.AsyncMock() - - monkeypatch.setattr( - "google.adk.cli.cli.Runner", - mock.Mock(return_value=mock_runner_instance), - ) - - # Mock _to_app to return a mock app - monkeypatch.setattr( - "google.adk.cli.cli._to_app", - mock.Mock(return_value=mock.Mock(name="agent_resume_confirm_json")), - ) - - runner = CliRunner() - - # Act: Query is a JSON string - json_query = '{"confirmed": true, "payload": {"amount": 100}}' - result = runner.invoke( - cli_tools_click.main, - [ - "run", - str(agent_dir), - json_query, - "--session_id", - "s123", - ], - ) - - # Assert - assert result.exit_code == 0 - called_args = mock_runner_instance.run_async.call_args - assert called_args is not None - kwargs = called_args.kwargs - new_message = kwargs.get("new_message") - assert new_message is not None - assert len(new_message.parts) == 1 - part = new_message.parts[0] - assert part.function_response is not None - assert part.function_response.id == "interrupt_123" - assert part.function_response.name == "adk_request_confirmation" - assert part.function_response.response == { - "confirmed": True, - "payload": {"amount": 100}, - } - - -def test_cli_run_all_options_with_query( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch -) -> None: - """`adk run` with query should forward all options correctly.""" - # Arrange - agent_dir = tmp_path / "agent_all_opts" - agent_dir.mkdir() - (agent_dir / "__init__.py").touch() - - mock_run_once = mock.AsyncMock(return_value=0) - monkeypatch.setattr("google.adk.cli.cli.run_once_cli", mock_run_once) - - replay_file = tmp_path / "replay.json" - replay_file.write_text('{"queries": ["hello"], "state": {}}') - - runner = CliRunner() - - # Act - result = runner.invoke( - cli_tools_click.main, - [ - "run", - str(agent_dir), - "hello", - "--state", - '{"x": 1}', - "--session_id", - "s123", - "--replay", - str(replay_file), - "--timeout", - "30s", - "--in_memory", - "--session_service_uri", - "memory://", - "--artifact_service_uri", - "memory://", - "--memory_service_uri", - "memory://", - ], - ) - - # Assert - assert result.exit_code == 0, f"Output: {result.output}" - assert mock_run_once.called - called_kwargs = mock_run_once.call_args.kwargs - assert called_kwargs.get("query") == "hello" - assert called_kwargs.get("state_str") == '{"x": 1}' - assert called_kwargs.get("session_id") == "s123" - assert called_kwargs.get("replay") == str(replay_file) - assert called_kwargs.get("timeout") == "30s" - assert called_kwargs.get("in_memory") is True - assert called_kwargs.get("session_service_uri") == "memory://" - assert called_kwargs.get("artifact_service_uri") == "memory://" - assert called_kwargs.get("memory_service_uri") == "memory://" - assert called_kwargs.get("use_local_storage") is True - - -def test_cli_run_no_use_local_storage_with_query( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch -) -> None: - """`adk run` with query should forward --no_use_local_storage correctly.""" - # Arrange - agent_dir = tmp_path / "agent_no_local" - agent_dir.mkdir() - (agent_dir / "__init__.py").touch() - - mock_run_once = mock.AsyncMock(return_value=0) - monkeypatch.setattr("google.adk.cli.cli.run_once_cli", mock_run_once) - - runner = CliRunner() - - # Act - result = runner.invoke( - cli_tools_click.main, - [ - "run", - str(agent_dir), - "hello", - "--no_use_local_storage", - ], - ) - - # Assert - assert result.exit_code == 0 - assert mock_run_once.called - called_kwargs = mock_run_once.call_args.kwargs - assert called_kwargs.get("use_local_storage") is False - - # cli deploy cloud_run def test_cli_deploy_cloud_run_success( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: """Successful path should call cli_deploy.to_cloud_run once.""" rec = _Recorder() - monkeypatch.setattr("google.adk.cli.cli_deploy.to_cloud_run", rec) + monkeypatch.setattr(cli_tools_click.cli_deploy, "to_cloud_run", rec) agent_dir = tmp_path / "agent2" agent_dir.mkdir() @@ -828,7 +231,7 @@ def test_cli_deploy_cloud_run_failure( def _boom(*_a: Any, **_k: Any) -> None: # noqa: D401 raise RuntimeError("boom") - monkeypatch.setattr("google.adk.cli.cli_deploy.to_cloud_run", _boom) + monkeypatch.setattr(cli_tools_click.cli_deploy, "to_cloud_run", _boom) agent_dir = tmp_path / "agent3" agent_dir.mkdir() @@ -846,7 +249,7 @@ def test_cli_deploy_cloud_run_passthrough_args( ) -> None: """Extra args after '--' should be passed through to the gcloud command.""" rec = _Recorder() - monkeypatch.setattr("google.adk.cli.cli_deploy.to_cloud_run", rec) + monkeypatch.setattr(cli_tools_click.cli_deploy, "to_cloud_run", rec) agent_dir = tmp_path / "agent_passthrough" agent_dir.mkdir() @@ -890,7 +293,7 @@ def test_cli_deploy_cloud_run_rejects_args_without_separator( ) -> None: """Args without '--' separator should be rejected with helpful error message.""" rec = _Recorder() - monkeypatch.setattr("google.adk.cli.cli_deploy.to_cloud_run", rec) + monkeypatch.setattr(cli_tools_click.cli_deploy, "to_cloud_run", rec) agent_dir = tmp_path / "agent_no_sep" agent_dir.mkdir() @@ -920,7 +323,7 @@ def test_cli_deploy_cloud_run_rejects_args_before_separator( ) -> None: """Args before '--' separator should be rejected.""" rec = _Recorder() - monkeypatch.setattr("google.adk.cli.cli_deploy.to_cloud_run", rec) + monkeypatch.setattr(cli_tools_click.cli_deploy, "to_cloud_run", rec) agent_dir = tmp_path / "agent_before_sep" agent_dir.mkdir() @@ -954,7 +357,7 @@ def test_cli_deploy_cloud_run_allows_empty_gcloud_args( ) -> None: """No gcloud args after '--' should be allowed.""" rec = _Recorder() - monkeypatch.setattr("google.adk.cli.cli_deploy.to_cloud_run", rec) + monkeypatch.setattr(cli_tools_click.cli_deploy, "to_cloud_run", rec) agent_dir = tmp_path / "agent_empty_gcloud" agent_dir.mkdir() @@ -989,7 +392,7 @@ def test_cli_deploy_agent_engine_success( ) -> None: """Successful path should call cli_deploy.to_agent_engine.""" rec = _Recorder() - monkeypatch.setattr("google.adk.cli.cli_deploy.to_agent_engine", rec) + monkeypatch.setattr(cli_tools_click.cli_deploy, "to_agent_engine", rec) agent_dir = tmp_path / "agent_ae" agent_dir.mkdir() @@ -1019,7 +422,7 @@ def test_cli_deploy_agent_engine_otel_to_cloud_success( ) -> None: """Successful path should call cli_deploy.to_agent_engine with --otel_to_cloud.""" rec = _Recorder() - monkeypatch.setattr("google.adk.cli.cli_deploy.to_agent_engine", rec) + monkeypatch.setattr(cli_tools_click.cli_deploy, "to_agent_engine", rec) agent_dir = tmp_path / "agent_ae" agent_dir.mkdir() @@ -1051,7 +454,7 @@ def test_cli_deploy_gke_success( ) -> None: """Successful path should call cli_deploy.to_gke.""" rec = _Recorder() - monkeypatch.setattr("google.adk.cli.cli_deploy.to_gke", rec) + monkeypatch.setattr(cli_tools_click.cli_deploy, "to_gke", rec) agent_dir = tmp_path / "agent_gke" agent_dir.mkdir() @@ -1138,7 +541,7 @@ def test_cli_web_invokes_uvicorn( agents_dir = tmp_path / "agents" agents_dir.mkdir() monkeypatch.setattr( - "google.adk.cli.fast_api.get_fast_api_app", lambda **_k: object() + cli_tools_click, "get_fast_api_app", lambda **_k: object() ) runner = CliRunner() result = runner.invoke(cli_tools_click.main, ["web", str(agents_dir)]) @@ -1153,7 +556,7 @@ def test_cli_api_server_invokes_uvicorn( agents_dir = tmp_path / "agents_api" agents_dir.mkdir() monkeypatch.setattr( - "google.adk.cli.fast_api.get_fast_api_app", lambda **_k: object() + cli_tools_click, "get_fast_api_app", lambda **_k: object() ) runner = CliRunner() result = runner.invoke(cli_tools_click.main, ["api_server", str(agents_dir)]) @@ -1169,7 +572,7 @@ def test_cli_web_passes_service_uris( agents_dir.mkdir() mock_get_app = _Recorder() - monkeypatch.setattr("google.adk.cli.fast_api.get_fast_api_app", mock_get_app) + monkeypatch.setattr(cli_tools_click, "get_fast_api_app", mock_get_app) runner = CliRunner() result = runner.invoke( @@ -1193,53 +596,6 @@ def test_cli_web_passes_service_uris( assert called_kwargs.get("memory_service_uri") == "rag://mycorpus" -@pytest.mark.parametrize( - "flag", - ["--allow-unsafe-unpickling", "--allow_unsafe_unpickling"], -) -def test_cli_migrate_session_allows_unsafe_unpickling_flag( - monkeypatch: pytest.MonkeyPatch, flag: str -) -> None: - calls: list[dict[str, Any]] = [] - - def fake_upgrade( - source_db_url: str, - dest_db_url: str, - *, - allow_unsafe_unpickling: bool = False, - ) -> None: - calls.append({ - "source_db_url": source_db_url, - "dest_db_url": dest_db_url, - "allow_unsafe_unpickling": allow_unsafe_unpickling, - }) - - monkeypatch.setattr( - "google.adk.sessions.migration.migration_runner.upgrade", - fake_upgrade, - ) - - result = CliRunner().invoke( - cli_tools_click.main, - [ - "migrate", - "session", - "--source_db_url", - "sqlite:///source.db", - "--dest_db_url", - "sqlite:///dest.db", - flag, - ], - ) - - assert result.exit_code == 0, (result.output, repr(result.exception)) - assert calls == [{ - "source_db_url": "sqlite:///source.db", - "dest_db_url": "sqlite:///dest.db", - "allow_unsafe_unpickling": True, - }] - - def test_cli_eval_with_eval_set_file_path( mock_load_eval_set_from_file, mock_get_root_agent, @@ -1309,7 +665,7 @@ def test_cli_eval_with_eval_set_id( eval_set_results = eval_set_results_manager.list_eval_set_results( app_name=app_name ) - assert len(eval_set_results) == 1 + assert len(eval_set_results) == 2 def test_cli_create_eval_set(tmp_path: Path): @@ -1465,7 +821,7 @@ def _mock_to_cloud_run(*_a, **kwargs): ) monkeypatch.setattr( - "google.adk.cli.cli_deploy.to_cloud_run", _mock_to_cloud_run + cli_tools_click.cli_deploy, "to_cloud_run", _mock_to_cloud_run ) agent_dir = tmp_path / "agent_conflict" diff --git a/tests/unittests/cli/utils/test_dot_adk_folder.py b/tests/unittests/cli/utils/test_dot_adk_folder.py index 6a7cec761a..c0a8fea863 100644 --- a/tests/unittests/cli/utils/test_dot_adk_folder.py +++ b/tests/unittests/cli/utils/test_dot_adk_folder.py @@ -45,13 +45,3 @@ def test_for_agent_validates_app_name(tmp_path: Path): expected_dir = (agents_root / "valid_agent").resolve() assert folder.agent_dir == expected_dir - - -def test_for_agent_rejects_prefix_sibling_escape(tmp_path: Path): - agents_root = tmp_path / "agents" - agents_root.mkdir() - - # Sibling whose path shares the agents_root string prefix ("agents" -> - # "agents_evil"); a startswith() check would wrongly accept this. - with pytest.raises(ValueError): - dot_adk_folder_for_agent(agents_root=agents_root, app_name="../agents_evil") diff --git a/tests/unittests/cli/utils/test_evals.py b/tests/unittests/cli/utils/test_evals.py index 071feb1e2d..84214859c5 100644 --- a/tests/unittests/cli/utils/test_evals.py +++ b/tests/unittests/cli/utils/test_evals.py @@ -25,11 +25,11 @@ @mock.patch.dict(os.environ, {'GOOGLE_CLOUD_PROJECT': 'test-project'}) @mock.patch( - 'google.adk.evaluation.gcs_eval_set_results_manager.GcsEvalSetResultsManager', + 'google.adk.cli.utils.evals.GcsEvalSetResultsManager', autospec=True, ) @mock.patch( - 'google.adk.evaluation.gcs_eval_sets_manager.GcsEvalSetsManager', + 'google.adk.cli.utils.evals.GcsEvalSetsManager', autospec=True, ) def test_create_gcs_eval_managers_from_uri_success( diff --git a/tests/unittests/cli/utils/test_gcp_utils.py b/tests/unittests/cli/utils/test_gcp_utils.py index 18ac37b5c2..824bc81b2f 100644 --- a/tests/unittests/cli/utils/test_gcp_utils.py +++ b/tests/unittests/cli/utils/test_gcp_utils.py @@ -140,7 +140,9 @@ def test_sign_up_express(self, mock_auth_default, mock_session_cls): }, ) - @mock.patch("google.cloud.resourcemanager_v3.ProjectsClient") + @mock.patch( + "google.adk.cli.utils.gcp_utils.resourcemanager_v3.ProjectsClient" + ) def test_list_gcp_projects(self, mock_client_cls): mock_client = mock.Mock() mock_client_cls.return_value = mock_client @@ -160,14 +162,6 @@ def test_list_gcp_projects(self, mock_client_cls): self.assertEqual(projects[0], ("p1", "Project 1")) self.assertEqual(projects[1], ("p2", "p2")) - @mock.patch.dict("sys.modules", {"google.cloud": None}) - def test_list_gcp_projects_import_error(self): - with self.assertRaisesRegex( - RuntimeError, - "Listing GCP projects requires the 'gcp' optional dependency", - ): - gcp_utils.list_gcp_projects() - if __name__ == "__main__": unittest.main() diff --git a/tests/unittests/cli/utils/test_graph_serialization.py b/tests/unittests/cli/utils/test_graph_serialization.py deleted file mode 100644 index c2916cabaa..0000000000 --- a/tests/unittests/cli/utils/test_graph_serialization.py +++ /dev/null @@ -1,144 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for graph_serialization edge handling with routing maps.""" - -import json - -from google.adk.agents import LlmAgent -from google.adk.cli.utils.graph_serialization import serialize_agent -from google.adk.models.lite_llm import LiteLlm -from google.adk.tools.base_toolset import BaseToolset -from google.adk.workflow import START -from google.adk.workflow import Workflow - -from tests.unittests.workflow.workflow_testing_utils import TestingNode - - -def test_serialize_edges_with_routing_map() -> None: - """Tests that routing map dicts in edges are serialized without error.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - - agent = Workflow( - name='test_workflow', - edges=[ - (START, node_a), - (node_a, {'route_b': node_b, 'route_c': node_c}), - ], - ) - - result = serialize_agent(agent) - - serialized_edges = result['edges'] - assert len(serialized_edges) == 2 - - # First edge: (START, node_a) — serialized as a 2-element list. - assert len(serialized_edges[0]) == 2 - - # Second edge: (node_a, {route: node}) — serialized as a 2-element list - # where the second element is a dict with string keys. - routing_map_edge = serialized_edges[1] - assert len(routing_map_edge) == 2 - assert isinstance(routing_map_edge[1], dict) - assert 'route_b' in routing_map_edge[1] - assert 'route_c' in routing_map_edge[1] - - -def test_serialize_edges_with_routing_map_int_keys() -> None: - """Tests that integer routing map keys are serialized as strings.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - - agent = Workflow( - name='test_workflow', - edges=[ - (START, node_a), - (node_a, {1: node_b}), - ], - ) - - result = serialize_agent(agent) - - routing_map_edge = result['edges'][1] - # Integer keys become string keys in the serialized output. - assert '1' in routing_map_edge[1] - - -def test_serialize_edges_mixed_formats() -> None: - """Tests serialization of edges mixing tuples, Edge objects, and routing maps.""" - from google.adk.workflow import Edge - - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - node_d = TestingNode(name='NodeD') - - agent = Workflow( - name='test_workflow', - edges=[ - (START, node_a), - (node_a, {'route_b': node_b, 'route_c': node_c}), - (node_b, node_d), - Edge(from_node=node_c, to_node=node_d), - ], - ) - - result = serialize_agent(agent) - - serialized_edges = result['edges'] - assert len(serialized_edges) == 4 - - # Tuple edges are lists, Edge objects are dicts with from_node/to_node. - assert isinstance(serialized_edges[0], list) # (START, node_a) - assert isinstance(serialized_edges[1], list) # routing map - assert isinstance(serialized_edges[2], list) # (node_b, node_d) - assert isinstance(serialized_edges[3], dict) # Edge object - assert 'from_node' in serialized_edges[3] - - -def test_serialize_agent_with_toolset() -> None: - """Tests that toolsets are serialized using their class name.""" - - class MockToolset(BaseToolset): - - async def get_tools(self, readonly_context=None): - return [] - - class FakeAgent: - model_fields = {'tools': None} - - def __init__(self): - self.tools = [MockToolset()] - - agent = FakeAgent() - result = serialize_agent(agent) # type: ignore - - assert 'tools' in result - assert len(result['tools']) == 1 - assert result['tools'][0]['name'] == 'MockToolset' - assert result['tools'][0]['type'] == 'tool' - - -def test_serialize_agent_with_litellm_model_is_json_safe() -> None: - agent = LlmAgent( - name='repro', - model=LiteLlm(model='ollama_chat/llama3'), - ) - - result = serialize_agent(agent) - - assert result['model'] == 'ollama_chat/llama3' - json.dumps(result) diff --git a/tests/unittests/cli/utils/test_local_storage.py b/tests/unittests/cli/utils/test_local_storage.py index bd33010938..a11a82fad7 100644 --- a/tests/unittests/cli/utils/test_local_storage.py +++ b/tests/unittests/cli/utils/test_local_storage.py @@ -16,16 +16,10 @@ from pathlib import Path -from google.adk.artifacts.file_artifact_service import FileArtifactService -from google.adk.cli.utils.local_storage import create_local_artifact_service from google.adk.cli.utils.local_storage import create_local_database_session_service from google.adk.cli.utils.local_storage import create_local_session_service from google.adk.cli.utils.local_storage import PerAgentDatabaseSessionService -from google.adk.cli.utils.local_storage import PerAgentFileArtifactService -from google.adk.events.event import Event -from google.adk.events.event_actions import EventActions from google.adk.sessions.sqlite_session_service import SqliteSessionService -from google.genai import types import pytest @@ -96,242 +90,3 @@ def test_create_local_database_session_service_returns_sqlite( service = create_local_database_session_service(base_dir=tmp_path) assert isinstance(service, SqliteSessionService) - - -@pytest.mark.asyncio -async def test_per_agent_session_service_get_user_state(tmp_path: Path) -> None: - """Verifies get_user_state routes to correct agent and returns correct state.""" - agent_a = tmp_path / "agent_a" - agent_b = tmp_path / "agent_b" - agent_a.mkdir() - agent_b.mkdir() - - service = PerAgentDatabaseSessionService(agents_root=tmp_path) - - session_a = await service.create_session(app_name="agent_a", user_id="user_a") - await service.append_event( - session_a, - Event( - author="system", - actions=EventActions(state_delta={"user:profile": {"name": "Alice"}}), - ), - ) - - state_a = await service.get_user_state(app_name="agent_a", user_id="user_a") - state_b = await service.get_user_state(app_name="agent_b", user_id="user_b") - - assert state_a == {"profile": {"name": "Alice"}} - assert not state_b - - -@pytest.mark.asyncio -async def test_per_agent_artifact_service_creates_scoped_dot_adk( - tmp_path: Path, -) -> None: - agent_a = tmp_path / "agent_a" - agent_b = tmp_path / "agent_b" - agent_a.mkdir() - agent_b.mkdir() - - service = PerAgentFileArtifactService(agents_root=tmp_path) - artifact = types.Part.from_bytes(data=b"data", mime_type="text/plain") - - await service.save_artifact( - app_name="agent_a", - user_id="user_a", - session_id="session_a", - filename="file.txt", - artifact=artifact, - ) - await service.save_artifact( - app_name="agent_b", - user_id="user_b", - session_id="session_b", - filename="file.txt", - artifact=artifact, - ) - - assert (agent_a / ".adk" / "artifacts").exists() - assert (agent_b / ".adk" / "artifacts").exists() - assert not (tmp_path / ".adk").exists() - - keys_a = await service.list_artifact_keys( - app_name="agent_a", user_id="user_a", session_id="session_a" - ) - assert keys_a == ["file.txt"] - # agent_b's store doesn't see agent_a's artifact, even at the same scope. - keys_from_other_agent = await service.list_artifact_keys( - app_name="agent_b", user_id="user_a", session_id="session_a" - ) - assert keys_from_other_agent == [] - - -@pytest.mark.asyncio -async def test_per_agent_artifact_service_respects_app_name_alias( - tmp_path: Path, -) -> None: - folder_name = "agent_folder" - logical_name = "custom_app" - (tmp_path / folder_name).mkdir() - - service = create_local_artifact_service( - base_dir=tmp_path, - per_agent=True, - app_name_to_dir={logical_name: folder_name}, - ) - - await service.save_artifact( - app_name=logical_name, - user_id="user", - session_id="session", - filename="file.txt", - artifact=types.Part.from_bytes(data=b"data", mime_type="text/plain"), - ) - - assert (tmp_path / folder_name / ".adk" / "artifacts").exists() - assert not (tmp_path / logical_name).exists() - - -@pytest.mark.asyncio -async def test_per_agent_artifact_service_routes_built_in_agents_to_root_dot_adk( - tmp_path: Path, -) -> None: - service = PerAgentFileArtifactService(agents_root=tmp_path) - - await service.save_artifact( - app_name="__helper", - user_id="user", - session_id="session", - filename="file.txt", - artifact=types.Part.from_bytes(data=b"data", mime_type="text/plain"), - ) - - assert not (tmp_path / "__helper").exists() - assert (tmp_path / ".adk" / "artifacts").exists() - - -def test_create_local_artifact_service_returns_file_service( - tmp_path: Path, -) -> None: - service = create_local_artifact_service(base_dir=tmp_path) - - assert isinstance(service, FileArtifactService) - - -@pytest.mark.asyncio -async def test_per_agent_artifact_service_delegates_all_operations( - tmp_path: Path, -) -> None: - (tmp_path / "agent_a").mkdir() - service = PerAgentFileArtifactService(agents_root=tmp_path) - artifact = types.Part.from_bytes(data=b"data", mime_type="text/plain") - scope = {"app_name": "agent_a", "user_id": "user", "session_id": "session"} - - version = await service.save_artifact( - filename="file.txt", artifact=artifact, **scope - ) - assert version == 0 - - loaded = await service.load_artifact(filename="file.txt", **scope) - assert loaded is not None - assert loaded.inline_data.data == b"data" - assert await service.list_versions(filename="file.txt", **scope) == [0] - assert ( - len(await service.list_artifact_versions(filename="file.txt", **scope)) - == 1 - ) - assert ( - await service.get_artifact_version(filename="file.txt", **scope) - ) is not None - - await service.delete_artifact(filename="file.txt", **scope) - assert await service.list_artifact_keys(**scope) == [] - - -@pytest.mark.asyncio -async def test_per_agent_artifact_service_reads_legacy_shared_root( - tmp_path: Path, -) -> None: - scope = {"app_name": "agent_a", "user_id": "user", "session_id": "session"} - # Seed an artifact in the pre-per-agent shared /.adk/artifacts store. - legacy = FileArtifactService(root_dir=tmp_path / ".adk" / "artifacts") - await legacy.save_artifact( - filename="legacy.txt", - artifact=types.Part.from_bytes(data=b"old", mime_type="text/plain"), - **scope, - ) - - service = PerAgentFileArtifactService(agents_root=tmp_path) - - loaded = await service.load_artifact(filename="legacy.txt", **scope) - assert loaded is not None - assert loaded.inline_data.data == b"old" - assert await service.list_artifact_keys(**scope) == ["legacy.txt"] - assert await service.list_versions(filename="legacy.txt", **scope) == [0] - assert ( - await service.get_artifact_version(filename="legacy.txt", **scope) - ) is not None - - -@pytest.mark.asyncio -async def test_per_agent_artifact_service_writes_do_not_touch_legacy_root( - tmp_path: Path, -) -> None: - scope = {"app_name": "agent_a", "user_id": "user", "session_id": "session"} - legacy = FileArtifactService(root_dir=tmp_path / ".adk" / "artifacts") - await legacy.save_artifact( - filename="legacy.txt", - artifact=types.Part.from_bytes(data=b"old", mime_type="text/plain"), - **scope, - ) - - service = PerAgentFileArtifactService(agents_root=tmp_path) - await service.save_artifact( - filename="new.txt", - artifact=types.Part.from_bytes(data=b"new", mime_type="text/plain"), - **scope, - ) - - # New write lands per-agent, not in the legacy shared root. - assert (tmp_path / "agent_a" / ".adk" / "artifacts").exists() - assert await legacy.list_artifact_keys(**scope) == ["legacy.txt"] - # Reads union the new per-agent key with the legacy one. - assert await service.list_artifact_keys(**scope) == ["legacy.txt", "new.txt"] - - -@pytest.mark.asyncio -async def test_per_agent_artifact_service_no_fallback_without_legacy_dir( - tmp_path: Path, -) -> None: - service = PerAgentFileArtifactService(agents_root=tmp_path) - - result = await service.load_artifact( - app_name="agent_a", - user_id="user", - session_id="session", - filename="missing.txt", - ) - - assert result is None - assert not (tmp_path / ".adk").exists() - - -@pytest.mark.asyncio -async def test_per_agent_artifact_service_delete_removes_legacy_copy( - tmp_path: Path, -) -> None: - scope = {"app_name": "agent_a", "user_id": "user", "session_id": "session"} - legacy = FileArtifactService(root_dir=tmp_path / ".adk" / "artifacts") - await legacy.save_artifact( - filename="legacy.txt", - artifact=types.Part.from_bytes(data=b"old", mime_type="text/plain"), - **scope, - ) - - service = PerAgentFileArtifactService(agents_root=tmp_path) - await service.delete_artifact(filename="legacy.txt", **scope) - - # Deleted artifact must not reappear through the legacy read fallback. - assert await service.load_artifact(filename="legacy.txt", **scope) is None - assert await service.list_artifact_keys(**scope) == [] - assert await legacy.list_artifact_keys(**scope) == [] diff --git a/tests/unittests/cli/utils/test_service_factory.py b/tests/unittests/cli/utils/test_service_factory.py index 17e8020542..db923361b3 100644 --- a/tests/unittests/cli/utils/test_service_factory.py +++ b/tests/unittests/cli/utils/test_service_factory.py @@ -21,15 +21,14 @@ from pathlib import Path from unittest import mock +from google.adk.artifacts.file_artifact_service import FileArtifactService from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService from google.adk.cli.service_registry import ServiceRegistry from google.adk.cli.utils.local_storage import PerAgentDatabaseSessionService -from google.adk.cli.utils.local_storage import PerAgentFileArtifactService import google.adk.cli.utils.service_factory as service_factory from google.adk.memory.in_memory_memory_service import InMemoryMemoryService from google.adk.sessions.database_session_service import DatabaseSessionService from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.genai import types import pytest @@ -303,83 +302,6 @@ def test_create_artifact_service_defaults_to_in_memory_when_disabled( assert not (tmp_path / ".adk").exists() -@pytest.mark.asyncio -async def test_create_artifact_service_defaults_to_per_agent( - tmp_path: Path, -) -> None: - agent_dir = tmp_path / "agent_a" - agent_dir.mkdir() - service = service_factory.create_artifact_service_from_options( - base_dir=tmp_path, - use_local_storage=True, - ) - - assert isinstance(service, PerAgentFileArtifactService) - await service.save_artifact( - app_name="agent_a", - user_id="user", - session_id="session", - filename="file.txt", - artifact=types.Part.from_bytes(data=b"data", mime_type="text/plain"), - ) - assert (agent_dir / ".adk" / "artifacts").exists() - assert not (tmp_path / ".adk").exists() - - -@pytest.mark.asyncio -async def test_create_artifact_service_respects_app_name_mapping( - tmp_path: Path, -) -> None: - agent_dir = tmp_path / "agent_folder" - logical_name = "custom_app" - agent_dir.mkdir() - - service = service_factory.create_artifact_service_from_options( - base_dir=tmp_path, - app_name_to_dir={logical_name: "agent_folder"}, - use_local_storage=True, - ) - - assert isinstance(service, PerAgentFileArtifactService) - await service.save_artifact( - app_name=logical_name, - user_id="user", - session_id="session", - filename="file.txt", - artifact=types.Part.from_bytes(data=b"data", mime_type="text/plain"), - ) - assert (agent_dir / ".adk" / "artifacts").exists() - - -def test_create_artifact_service_warns_on_legacy_shared_root( - tmp_path: Path, - caplog: pytest.LogCaptureFixture, -) -> None: - (tmp_path / ".adk" / "artifacts").mkdir(parents=True) - - caplog.set_level(logging.WARNING, logger=service_factory.logger.name) - service = service_factory.create_artifact_service_from_options( - base_dir=tmp_path, - use_local_storage=True, - ) - - assert isinstance(service, PerAgentFileArtifactService) - assert "legacy shared artifacts" in caplog.text - - -def test_create_artifact_service_no_warning_without_legacy_root( - tmp_path: Path, - caplog: pytest.LogCaptureFixture, -) -> None: - caplog.set_level(logging.WARNING, logger=service_factory.logger.name) - service_factory.create_artifact_service_from_options( - base_dir=tmp_path, - use_local_storage=True, - ) - - assert "legacy shared artifacts" not in caplog.text - - def test_create_session_service_fallbacks_to_in_memory_on_permission_error( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, @@ -503,15 +425,7 @@ async def test_adk_force_local_storage_env_overrides_flag( base_dir=tmp_path, use_local_storage=False, ) - assert isinstance(artifact_service, PerAgentFileArtifactService) - await artifact_service.save_artifact( - app_name="agent_a", - user_id="user", - session_id="session", - filename="file.txt", - artifact=types.Part.from_bytes(data=b"data", mime_type="text/plain"), - ) - assert (agent_dir / ".adk" / "artifacts").exists() + assert isinstance(artifact_service, FileArtifactService) def test_create_artifact_service_fallbacks_to_in_memory_on_permission_error( diff --git a/tests/unittests/conftest.py b/tests/unittests/conftest.py index 0b78d3863f..4a7216089b 100644 --- a/tests/unittests/conftest.py +++ b/tests/unittests/conftest.py @@ -14,10 +14,6 @@ import os -import pytest - -pytest.register_assert_rewrite('google.adk.cli.agent_test_runner') - from pytest import fixture from pytest import FixtureRequest from pytest import hookimpl diff --git a/tests/unittests/evaluation/mock_gcs_utils.py b/tests/unittests/evaluation/mock_gcs_utils.py index 24aee17e62..d9ea008c34 100644 --- a/tests/unittests/evaluation/mock_gcs_utils.py +++ b/tests/unittests/evaluation/mock_gcs_utils.py @@ -1,17 +1,3 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - from typing import Optional from typing import Union diff --git a/tests/unittests/evaluation/test_eval_config.py b/tests/unittests/evaluation/test_eval_config.py index 082727a1f3..ce033359ba 100644 --- a/tests/unittests/evaluation/test_eval_config.py +++ b/tests/unittests/evaluation/test_eval_config.py @@ -130,6 +130,18 @@ def test_get_eval_metrics_from_config_with_custom_metrics(): assert eval_metrics[1].custom_function_path == "path/to/custom/metric_2" +def test_custom_metric_code_config_with_args_raises_error(): + with pytest.raises(ValueError): + _ = EvalConfig( + criteria={"custom_metric": 1.0}, + custom_metrics={ + "custom_metric": { + "code_config": {"name": "name", "args": [{"value": 1}]}, + } + }, + ) + + def test_get_eval_metrics_from_config_empty_criteria(): eval_config = EvalConfig(criteria={}) eval_metrics = get_eval_metrics_from_config(eval_config) diff --git a/tests/unittests/evaluation/test_evaluation_generator.py b/tests/unittests/evaluation/test_evaluation_generator.py index 05ab25cc72..508b6f5c9c 100644 --- a/tests/unittests/evaluation/test_evaluation_generator.py +++ b/tests/unittests/evaluation/test_evaluation_generator.py @@ -453,62 +453,6 @@ async def test_generate_inferences_live(self, mocker): with pytest.raises(StopAsyncIteration): await gen.__anext__() - @pytest.mark.asyncio - async def test_generate_inferences_live_with_synthetic_events(self, mocker): - """Tests live inference generation with synthetic events.""" - mock_live_request_queue = mocker.MagicMock() - event_queue = asyncio.Queue() - turn_complete_event = asyncio.Event() - - user_content = types.Content(parts=[types.Part(text="User query")]) - invocation_id = "inv1" - - transcription = types.Transcription(text="Partial transcription") - partial_event = Event( - author="agent", - content=types.Content(parts=[]), - invocation_id=invocation_id, - output_transcription=transcription, - partial=True, - ) - - gen = EvaluationGenerator._generate_inferences_for_single_user_invocation_live( - live_request_queue=mock_live_request_queue, - event_queue=event_queue, - user_message=user_content, - current_invocation_id=invocation_id, - turn_complete_event=turn_complete_event, - live_timeout_seconds=300, - agent_name="custom_agent_name", - ) - - # First yield should be the user message - first_event = await gen.__anext__() - assert first_event.author == "user" - assert first_event.content == user_content - assert first_event.invocation_id == invocation_id - - # Mock turn_complete_event.wait to avoid blocking - turn_complete_event.wait = mocker.AsyncMock() - - # Put the partial event in the queue - await event_queue.put(partial_event) - - # Now advance - second_event = await gen.__anext__() - assert second_event == partial_event - - # Next should be the synthetic event - third_event = await gen.__anext__() - assert third_event.author == "custom_agent_name" - assert third_event.invocation_id == invocation_id - assert third_event.content.role == "model" - assert third_event.content.parts[0].text == "Partial transcription" - - # The generator should be exhausted now - with pytest.raises(StopAsyncIteration): - await gen.__anext__() - @pytest.fixture def mock_runner(mocker): diff --git a/tests/unittests/evaluation/test_final_response_match_v2.py b/tests/unittests/evaluation/test_final_response_match_v2.py index 4a609420b2..ce44901ab5 100644 --- a/tests/unittests/evaluation/test_final_response_match_v2.py +++ b/tests/unittests/evaluation/test_final_response_match_v2.py @@ -15,8 +15,6 @@ from __future__ import annotations from google.adk.evaluation.eval_case import Invocation -from google.adk.evaluation.eval_case import InvocationEvent -from google.adk.evaluation.eval_case import InvocationEvents from google.adk.evaluation.eval_metrics import BaseCriterion from google.adk.evaluation.eval_metrics import EvalMetric from google.adk.evaluation.eval_metrics import EvalStatus @@ -129,8 +127,6 @@ def create_test_template() -> str: def _create_test_evaluator_gemini( threshold: float, - *, - include_intermediate_responses_in_final: bool = False, ) -> FinalResponseMatchV2Evaluator: evaluator = FinalResponseMatchV2Evaluator( EvalMetric( @@ -138,9 +134,6 @@ def _create_test_evaluator_gemini( threshold=threshold, criterion=BaseCriterion( threshold=0.5, - include_intermediate_responses_in_final=( - include_intermediate_responses_in_final - ), ), ), ) @@ -175,21 +168,6 @@ def _create_test_invocations( return actual_invocation, expected_invocation -def _add_intermediate_text(invocation: Invocation, text: str) -> Invocation: - invocation.intermediate_data = InvocationEvents( - invocation_events=[ - InvocationEvent( - author="agent", - content=genai_types.Content( - parts=[genai_types.Part(text=text)], - role="model", - ), - ), - ] - ) - return invocation - - def test_format_auto_rater_prompt(): evaluator = _create_test_evaluator_gemini(threshold=0.8) actual_invocation, expected_invocation = _create_test_invocations( @@ -215,59 +193,6 @@ def test_format_auto_rater_prompt(): """ -def test_format_auto_rater_prompt_uses_empty_text_for_missing_final_response(): - evaluator = _create_test_evaluator_gemini(threshold=0.8) - actual_invocation, expected_invocation = _create_test_invocations( - "candidate text", "reference text" - ) - actual_invocation.final_response = None - expected_invocation.final_response = None - - prompt = evaluator.format_auto_rater_prompt( - actual_invocation, expected_invocation - ) - - assert "None" not in prompt - assert '"Agent response": ,' in prompt - assert '"Reference response": ,' in prompt - - -def test_format_auto_rater_prompt_ignores_intermediate_by_default(): - evaluator = _create_test_evaluator_gemini(threshold=0.8) - actual_invocation, expected_invocation = _create_test_invocations( - "candidate final", "reference final" - ) - _add_intermediate_text(actual_invocation, "candidate intro") - _add_intermediate_text(expected_invocation, "reference intro") - - prompt = evaluator.format_auto_rater_prompt( - actual_invocation, expected_invocation - ) - - assert "candidate final" in prompt - assert "reference final" in prompt - assert "candidate intro" not in prompt - assert "reference intro" not in prompt - - -def test_format_auto_rater_prompt_includes_intermediate_when_enabled(): - evaluator = _create_test_evaluator_gemini( - threshold=0.8, include_intermediate_responses_in_final=True - ) - actual_invocation, expected_invocation = _create_test_invocations( - "candidate final", "reference final" - ) - _add_intermediate_text(actual_invocation, "candidate intro") - _add_intermediate_text(expected_invocation, "reference intro") - - prompt = evaluator.format_auto_rater_prompt( - actual_invocation, expected_invocation - ) - - assert "candidate intro\ncandidate final" in prompt - assert "reference intro\nreference final" in prompt - - def test_convert_auto_rater_response_to_score_valid(): evaluator = _create_test_evaluator_gemini(threshold=0.8) auto_rater_response = """```json diff --git a/tests/unittests/evaluation/test_llm_as_judge_utils.py b/tests/unittests/evaluation/test_llm_as_judge_utils.py index c7cd5ff569..e5327cf454 100644 --- a/tests/unittests/evaluation/test_llm_as_judge_utils.py +++ b/tests/unittests/evaluation/test_llm_as_judge_utils.py @@ -19,7 +19,6 @@ from google.adk.evaluation.app_details import AgentDetails from google.adk.evaluation.app_details import AppDetails from google.adk.evaluation.eval_case import IntermediateData -from google.adk.evaluation.eval_case import Invocation from google.adk.evaluation.eval_case import InvocationEvent from google.adk.evaluation.eval_case import InvocationEvents from google.adk.evaluation.eval_rubrics import RubricScore @@ -89,79 +88,6 @@ def test_get_text_from_content_with_mixed_parts(): assert get_text_from_content(content) == "Hello\nWorld" -def test_get_text_from_content_with_invocation_include_intermediate_responses_in_final(): - """Tests get_text_from_content on an Invocation with and without the flag.""" - intermediate_text = "Let me check." - final_response_text = "Done." - invocation = Invocation( - user_content=genai_types.Content(parts=[genai_types.Part(text="user")]), - intermediate_data=InvocationEvents( - invocation_events=[ - InvocationEvent( - author="agent", - content=genai_types.Content( - parts=[genai_types.Part(text=intermediate_text)] - ), - ), - InvocationEvent( - author="tool", - content=genai_types.Content( - parts=[ - genai_types.Part( - function_call=genai_types.FunctionCall(name="t") - ) - ] - ), - ), - ] - ), - final_response=genai_types.Content( - parts=[genai_types.Part(text=final_response_text)] - ), - ) - - # Flag off (default): only the final response text is returned. - assert get_text_from_content(invocation) == final_response_text - - # Flag on: intermediate text is concatenated before the final response. - assert ( - get_text_from_content( - invocation, include_intermediate_responses_in_final=True - ) - == f"{intermediate_text}\n{final_response_text}" - ) - - -def test_get_text_from_content_with_intermediate_data_full_response(): - invocation = Invocation( - user_content=genai_types.Content(parts=[genai_types.Part(text="user")]), - intermediate_data=IntermediateData( - intermediate_responses=[ - ("agent", [genai_types.Part(text="legacy intro")]), - ( - "tool", - [ - genai_types.Part( - function_call=genai_types.FunctionCall(name="lookup") - ) - ], - ), - ] - ), - final_response=genai_types.Content( - parts=[genai_types.Part(text="final answer")] - ), - ) - - assert get_text_from_content(invocation) == "final answer" - assert ( - get_text_from_content( - invocation, include_intermediate_responses_in_final=True - ) - == "legacy intro\nfinal answer" - ) - - def test_get_eval_status_with_none_score(): """Tests get_eval_status returns NOT_EVALUATED for a None score.""" assert get_eval_status(score=None, threshold=0.5) == EvalStatus.NOT_EVALUATED diff --git a/tests/unittests/evaluation/test_local_eval_service.py b/tests/unittests/evaluation/test_local_eval_service.py index 3bbfafc5be..894fc27c07 100644 --- a/tests/unittests/evaluation/test_local_eval_service.py +++ b/tests/unittests/evaluation/test_local_eval_service.py @@ -369,7 +369,7 @@ async def test_evaluate_success( assert isinstance(results[0], EvalCaseResult) assert isinstance(results[1], EvalCaseResult) assert mock_eval_sets_manager.get_eval_case.call_count == 2 - assert mock_eval_set_results_manager.save_eval_set_result.call_count == 1 + assert mock_eval_set_results_manager.save_eval_set_result.call_count == 2 @pytest.mark.asyncio diff --git a/tests/unittests/evaluation/test_metric_evaluator_registry.py b/tests/unittests/evaluation/test_metric_evaluator_registry.py index 2e34f3fed8..cb5361f427 100644 --- a/tests/unittests/evaluation/test_metric_evaluator_registry.py +++ b/tests/unittests/evaluation/test_metric_evaluator_registry.py @@ -27,7 +27,6 @@ from google.adk.evaluation.metric_evaluator_registry import PerTurnUserSimulatorQualityV1MetricInfoProvider from google.adk.evaluation.metric_evaluator_registry import ResponseEvaluatorMetricInfoProvider from google.adk.evaluation.metric_evaluator_registry import RubricBasedFinalResponseQualityV1EvaluatorMetricInfoProvider -from google.adk.evaluation.metric_evaluator_registry import RubricBasedMultiTurnTrajectoryMetricInfoProvider from google.adk.evaluation.metric_evaluator_registry import RubricBasedToolUseV1EvaluatorMetricInfoProvider from google.adk.evaluation.metric_evaluator_registry import SafetyEvaluatorV1MetricInfoProvider from google.adk.evaluation.metric_evaluator_registry import TrajectoryEvaluatorMetricInfoProvider @@ -209,14 +208,3 @@ def test_per_turn_user_simulator_quality_v1_metric_info_provider(self): ) assert metric_info.metric_value_info.interval.min_value == 0.0 assert metric_info.metric_value_info.interval.max_value == 1.0 - - def test_rubric_based_multi_turn_trajectory_metric_info_provider(self): - metric_info = ( - RubricBasedMultiTurnTrajectoryMetricInfoProvider().get_metric_info() - ) - assert ( - metric_info.metric_name - == PrebuiltMetrics.RUBRIC_BASED_MULTI_TURN_TRAJECTORY_QUALITY_V1.value - ) - assert metric_info.metric_value_info.interval.min_value == 0.0 - assert metric_info.metric_value_info.interval.max_value == 1.0 diff --git a/tests/unittests/evaluation/test_request_intercepter_plugin.py b/tests/unittests/evaluation/test_request_intercepter_plugin.py index 48f053294a..0caf3328ae 100644 --- a/tests/unittests/evaluation/test_request_intercepter_plugin.py +++ b/tests/unittests/evaluation/test_request_intercepter_plugin.py @@ -37,7 +37,6 @@ async def test_intercept_request_and_response(self, mocker): ) mock_invocation_context = mocker.MagicMock() mock_invocation_context.session.state = {} - mock_invocation_context._state_schema = None callback_context = CallbackContext(mock_invocation_context) llm_response = LlmResponse() diff --git a/tests/unittests/evaluation/test_rubric_based_multi_turn_trajectory_evaluator.py b/tests/unittests/evaluation/test_rubric_based_multi_turn_trajectory_evaluator.py deleted file mode 100644 index f1e3a048de..0000000000 --- a/tests/unittests/evaluation/test_rubric_based_multi_turn_trajectory_evaluator.py +++ /dev/null @@ -1,298 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk.evaluation.app_details import AgentDetails -from google.adk.evaluation.app_details import AppDetails -from google.adk.evaluation.eval_case import Invocation -from google.adk.evaluation.eval_case import InvocationEvent -from google.adk.evaluation.eval_case import InvocationEvents -from google.adk.evaluation.eval_metrics import EvalMetric -from google.adk.evaluation.eval_metrics import JudgeModelOptions -from google.adk.evaluation.eval_metrics import PrebuiltMetrics -from google.adk.evaluation.eval_metrics import RubricsBasedCriterion -from google.adk.evaluation.eval_rubrics import Rubric -from google.adk.evaluation.eval_rubrics import RubricContent -from google.adk.evaluation.rubric_based_multi_turn_trajectory_evaluator import RubricBasedMultiTurnTrajectoryEvaluator -from google.genai import types as genai_types -import pytest - -_RUBRICS = [ - Rubric( - rubric_id="1", - rubric_content=RubricContent( - text_property="The agent uses the correct tool." - ), - type="TOOL_USAGE", - ), - Rubric( - rubric_id="2", - rubric_content=RubricContent( - text_property="The agent fulfills the user intent." - ), - type="FULFILL_USER_INTENT", - ), -] - - -def _make_evaluator( - rubrics: list[Rubric] | None = None, -) -> RubricBasedMultiTurnTrajectoryEvaluator: - """Helper to build an evaluator with the given rubrics.""" - rubrics = rubrics or _RUBRICS - criterion = RubricsBasedCriterion( - threshold=0.5, - rubrics=rubrics, - judge_model_options=JudgeModelOptions( - judge_model_config=None, - num_samples=3, - ), - ) - metric = EvalMetric( - metric_name=PrebuiltMetrics.RUBRIC_BASED_MULTI_TURN_TRAJECTORY_QUALITY_V1.value, - threshold=0.5, - criterion=criterion, - ) - return RubricBasedMultiTurnTrajectoryEvaluator(metric) - - -def _make_invocation( - user_text: str, - agent_text: str | None = None, - invocation_id: str = "", - rubrics: list[Rubric] | None = None, - app_details: AppDetails | None = None, - intermediate_data: InvocationEvents | None = None, -) -> Invocation: - """Helper to build an Invocation.""" - return Invocation( - invocation_id=invocation_id, - user_content=genai_types.Content( - parts=[genai_types.Part(text=user_text)] - ), - final_response=( - genai_types.Content(parts=[genai_types.Part(text=agent_text)]) - if agent_text - else None - ), - rubrics=rubrics, - app_details=app_details, - intermediate_data=intermediate_data, - ) - - -class TestFormatAutoRaterPrompt: - """Tests for format_auto_rater_prompt.""" - - def test_basic_dialogue_and_rubrics_in_prompt(self): - """Tests that user dialogue and rubrics appear in the generated prompt.""" - evaluator = _make_evaluator() - invocation = _make_invocation( - user_text="What is the balance?", - agent_text="Your balance is $100.", - rubrics=_RUBRICS, - ) - # Simulate evaluate_invocations dialogue assembly by setting internal state. - evaluator._formatted_dialogue = "USER TURN 1: What is the balance?" - evaluator._formatted_instructions = "" - evaluator._formatted_tools = "" - - prompt = evaluator.format_auto_rater_prompt(invocation, None) - - assert "USER TURN 1: What is the balance?" in prompt - assert "The agent uses the correct tool." in prompt - assert "The agent fulfills the user intent." in prompt - assert "TOOL_USAGE" in prompt - assert "FULFILL_USER_INTENT" in prompt - - def test_prompt_includes_agent_instructions_and_tools(self): - """Tests that agent instructions and tools are inserted into the prompt.""" - evaluator = _make_evaluator() - invocation = _make_invocation( - user_text="Transfer funds", - rubrics=_RUBRICS, - ) - evaluator._formatted_dialogue = "USER TURN 1: Transfer funds" - evaluator._formatted_instructions = ( - "Agent banking_agent Instructions:\nYou are a banking assistant." - ) - evaluator._formatted_tools = ( - "Agent: banking_agent\n- transfer_funds: Transfer money between" - " accounts." - ) - - prompt = evaluator.format_auto_rater_prompt(invocation, None) - - assert "You are a banking assistant." in prompt - assert "transfer_funds" in prompt - - -class TestDialogueAssembly: - """Tests for the dialogue assembly logic in evaluate_invocations. - - These test the internal dialogue construction by calling evaluate_invocations - and inspecting self._formatted_dialogue. - """ - - @pytest.fixture - def evaluator(self): - return _make_evaluator() - - @pytest.mark.asyncio - async def test_single_turn_user_and_agent(self, evaluator): - """Tests that a single turn assembles user and agent dialogue.""" - invocations = [ - _make_invocation( - user_text="Hello", - agent_text="Hi there!", - invocation_id="agent1", - rubrics=_RUBRICS, - ), - ] - # We need to mock the super().evaluate_invocations call since it calls - # the LLM. Instead, we just test the dialogue assembly part directly. - evaluator._formatted_dialogue = None - - # Manually run the dialogue assembly portion - evaluator._assemble_dialogue_history(invocations) - - assert "USER TURN 1: Hello" in evaluator._formatted_dialogue - assert "AGENT (agent) TURN 1: Hi there!" in evaluator._formatted_dialogue - - @pytest.mark.asyncio - async def test_multi_turn_dialogue(self, evaluator): - """Tests dialogue assembly across multiple turns.""" - invocations = [ - _make_invocation( - user_text="Check my balance", - agent_text="Your balance is $100.", - invocation_id="agent1", - rubrics=_RUBRICS, - ), - _make_invocation( - user_text="Transfer $50", - agent_text="Transfer complete.", - invocation_id="agent1", - rubrics=_RUBRICS, - ), - ] - evaluator._assemble_dialogue_history(invocations) - - assert "USER TURN 1: Check my balance" in evaluator._formatted_dialogue - assert ( - "AGENT (agent) TURN 1: Your balance is $100." - in evaluator._formatted_dialogue - ) - assert "USER TURN 2: Transfer $50" in evaluator._formatted_dialogue - assert ( - "AGENT (agent) TURN 2: Transfer complete." - in evaluator._formatted_dialogue - ) - - @pytest.mark.asyncio - async def test_intermediate_events_with_function_calls(self, evaluator): - """Tests that intermediate function calls and responses appear in dialogue.""" - tool_call_part = genai_types.Part( - function_call=genai_types.FunctionCall( - name="get_balance", args={"account_id": "123"} - ) - ) - tool_response_part = genai_types.Part( - function_response=genai_types.FunctionResponse( - name="get_balance", response={"balance": 100} - ) - ) - intermediate_data = InvocationEvents( - invocation_events=[ - InvocationEvent( - author="banking_agent", - content=genai_types.Content(parts=[tool_call_part]), - ), - InvocationEvent( - author="banking_agent", - content=genai_types.Content(parts=[tool_response_part]), - ), - ] - ) - invocations = [ - _make_invocation( - user_text="What is my balance?", - agent_text="Your balance is $100.", - invocation_id="banking_agent", - rubrics=_RUBRICS, - intermediate_data=intermediate_data, - ), - ] - evaluator._assemble_dialogue_history(invocations) - - assert "get_balance" in evaluator._formatted_dialogue - assert '"account_id": "123"' in evaluator._formatted_dialogue - assert '"balance": 100' in evaluator._formatted_dialogue - - @pytest.mark.asyncio - async def test_app_details_instructions_and_tools(self, evaluator): - """Tests that app_details instructions and tools are captured.""" - tool = genai_types.Tool( - function_declarations=[ - genai_types.FunctionDeclaration( - name="transfer_funds", - description="Transfer money between accounts.", - ) - ] - ) - app_details = AppDetails( - agent_details={ - "banking_agent": AgentDetails( - name="banking_agent", - instructions="You are a banking assistant.", - tool_declarations=[tool], - ) - }, - ) - invocations = [ - _make_invocation( - user_text="Transfer $50", - agent_text="Done.", - invocation_id="banking_agent", - rubrics=_RUBRICS, - app_details=app_details, - ), - ] - evaluator._assemble_dialogue_history(invocations) - - assert "You are a banking assistant." in evaluator._formatted_instructions - assert "transfer_funds" in evaluator._formatted_tools - assert "Transfer money between accounts." in evaluator._formatted_tools - - @pytest.mark.asyncio - async def test_invocation_without_user_content(self, evaluator): - """Tests that invocations with no user text parts are handled gracefully.""" - invocations = [ - Invocation( - user_content=genai_types.Content(parts=[]), - final_response=genai_types.Content( - parts=[genai_types.Part(text="Agent response.")] - ), - invocation_id="agent1", - rubrics=_RUBRICS, - ), - ] - evaluator._assemble_dialogue_history(invocations) - - # No user turn should appear, but agent turn should - assert "USER TURN" not in evaluator._formatted_dialogue - assert ( - "AGENT (agent) TURN 1: Agent response." in evaluator._formatted_dialogue - ) diff --git a/tests/unittests/events/__init__.py b/tests/unittests/events/__init__.py deleted file mode 100644 index 58d482ea38..0000000000 --- a/tests/unittests/events/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/tests/unittests/events/test_event.py b/tests/unittests/events/test_event.py deleted file mode 100644 index afcc64db7e..0000000000 --- a/tests/unittests/events/test_event.py +++ /dev/null @@ -1,427 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -"""Unit tests for the helper methods on the Event class.""" - -from google.adk.events.event import Event -from google.adk.events.event import NodeInfo -from google.adk.events.event_actions import EventActions -from google.adk.events.request_input import RequestInput -from google.genai import types -import pytest - - -def _text_part(text: str = 'hello') -> types.Part: - return types.Part(text=text) - - -def _function_call_part(name: str = 'my_func') -> types.Part: - return types.Part(function_call=types.FunctionCall(name=name, args={'x': 1})) - - -def _function_response_part(name: str = 'my_func') -> types.Part: - return types.Part( - function_response=types.FunctionResponse(name=name, response={'y': 2}) - ) - - -def _code_execution_result_part(output: str = '42') -> types.Part: - return types.Part( - code_execution_result=types.CodeExecutionResult( - outcome=types.Outcome.OUTCOME_OK, output=output - ) - ) - - -def _event(parts: list[types.Part] | None = None, **kwargs) -> Event: - content = ( - types.Content(role='model', parts=parts) if parts is not None else None - ) - return Event(author='agent', content=content, **kwargs) - - -# --- is_final_response ------------------------------------------------------- - - -def test_is_final_response_plain_text_event_is_final(): - event = _event(parts=[_text_part()]) - assert event.is_final_response() is True - - -def test_is_final_response_empty_event_is_final(): - event = _event() - assert event.is_final_response() is True - - -def test_is_final_response_with_function_call_is_not_final(): - event = _event(parts=[_text_part(), _function_call_part()]) - assert event.is_final_response() is False - - -def test_is_final_response_with_function_response_is_not_final(): - event = _event(parts=[_function_response_part()]) - assert event.is_final_response() is False - - -def test_is_final_response_partial_event_is_not_final(): - event = _event(parts=[_text_part()], partial=True) - assert event.is_final_response() is False - - -def test_is_final_response_with_trailing_code_result_is_not_final(): - event = _event(parts=[_text_part(), _code_execution_result_part()]) - assert event.is_final_response() is False - - -def test_is_final_response_skip_summarization_overrides_function_response(): - event = _event( - parts=[_function_response_part()], - actions=EventActions(skip_summarization=True), - ) - assert event.is_final_response() is True - - -def test_is_final_response_long_running_tool_ids_overrides_function_call(): - event = _event( - parts=[_function_call_part()], long_running_tool_ids={'tool-1'} - ) - assert event.is_final_response() is True - - -# --- get_function_calls ------------------------------------------------------ - - -def test_get_function_calls_returns_calls_in_order(): - event = _event( - parts=[ - _text_part(), - _function_call_part('first'), - _function_response_part(), - _function_call_part('second'), - ] - ) - assert [call.name for call in event.get_function_calls()] == [ - 'first', - 'second', - ] - - -def test_get_function_calls_no_content_returns_empty(): - assert _event().get_function_calls() == [] - - -def test_get_function_calls_empty_parts_returns_empty(): - assert _event(parts=[]).get_function_calls() == [] - - -def test_get_function_calls_text_only_returns_empty(): - assert _event(parts=[_text_part()]).get_function_calls() == [] - - -# --- get_function_responses -------------------------------------------------- - - -def test_get_function_responses_returns_responses_in_order(): - event = _event( - parts=[ - _function_response_part('first'), - _text_part(), - _function_call_part(), - _function_response_part('second'), - ] - ) - assert [resp.name for resp in event.get_function_responses()] == [ - 'first', - 'second', - ] - - -def test_get_function_responses_no_content_returns_empty(): - assert _event().get_function_responses() == [] - - -def test_get_function_responses_empty_parts_returns_empty(): - assert _event(parts=[]).get_function_responses() == [] - - -# --- has_trailing_code_execution_result -------------------------------------- - - -def test_has_trailing_code_execution_result_true_when_last(): - event = _event(parts=[_text_part(), _code_execution_result_part()]) - assert event.has_trailing_code_execution_result() is True - - -def test_has_trailing_code_execution_result_false_when_not_last(): - event = _event(parts=[_code_execution_result_part(), _text_part()]) - assert event.has_trailing_code_execution_result() is False - - -def test_has_trailing_code_execution_result_false_no_content(): - assert _event().has_trailing_code_execution_result() is False - - -def test_has_trailing_code_execution_result_false_empty_parts(): - assert _event(parts=[]).has_trailing_code_execution_result() is False - - -# --- id generation (model_post_init) ----------------------------------------- - - -def test_event_id_auto_assigned_when_missing(): - assert _event().id != '' - - -def test_event_ids_are_unique(): - assert _event().id != _event().id - - -def test_event_id_preserved_when_provided(): - assert _event(id='fixed-id').id == 'fixed-id' - - -# --- state initialization ---------------------------------------------------- - - -def test_event_constructor_with_state(): - """Tests that the event constructor handles the state argument.""" - my_event = Event(state={'key': 'value'}) - assert my_event.actions is not None - assert my_event.actions.state_delta == {'key': 'value'} - - -def test_event_constructor_without_state(): - """Tests that the event constructor works without the state argument.""" - my_event = Event() - assert my_event.actions is not None - assert my_event.actions.state_delta == {} - - -# --- isolation scope --------------------------------------------------------- - - -def test_event_isolation_scope(): - """Tests Event.isolation_scope default value and serialization.""" - ev = Event() - assert ev.isolation_scope is None - - ev2 = Event(isolation_scope='task:fc-123') - dumped = ev2.model_dump(mode='json', by_alias=True, exclude_none=True) - assert dumped['isolationScope'] == 'task:fc-123' - - -# --- serialization ----------------------------------------------------------- - - -def test_event_serialization_always_camel_case(): - """Tests that Event serialization produces camelCase keys.""" - request_input = RequestInput(interrupt_id='fc-1', message='test') - - # Create an event with fields that would produce snake_case if not dumped by alias - event = Event( - invocation_id='i-1', - node_info=NodeInfo( - path='a/b', - output_for=['c'], - message_as_output=True, - ), - output=request_input, - ) - - dumped = event.model_dump(by_alias=True) - - def check_no_snake_case_keys(data): - if isinstance(data, dict): - for key, value in data.items(): - assert '_' not in key, f'Found snake_case key: {key} in {data}' - check_no_snake_case_keys(value) - elif isinstance(data, list): - for item in data: - check_no_snake_case_keys(item) - - check_no_snake_case_keys(dumped) - - # Also verify that expected keys are indeed camelCased - assert 'invocationId' in dumped - assert 'nodeInfo' in dumped - assert 'outputFor' in dumped['nodeInfo'] - assert 'messageAsOutput' in dumped['nodeInfo'] - - # Verify RequestInput fields are camelCased - assert 'output' in dumped - assert 'interruptId' in dumped['output'] - - -# --- message alias for content ----------------------------------------------- - - -class TestMessageConstructor: - """Tests for Event(message=...) constructor parameter.""" - - def test_message_str_sets_content(self): - event = Event(message='Hello!') - assert event.content is not None - assert event.content.parts[0].text == 'Hello!' - - def test_message_content_passes_through(self): - content = types.Content( - parts=[types.Part(text='from Content')], role='model' - ) - event = Event(message=content) - assert event.content is content - - def test_message_part_converts_to_content(self): - part = types.Part(text='from Part') - event = Event(message=part) - assert event.content is not None - assert event.content.parts[0].text == 'from Part' - - def test_message_list_of_parts(self): - parts = [types.Part(text='part1'), types.Part(text='part2')] - event = Event(message=parts) - assert event.content is not None - assert len(event.content.parts) == 2 - assert event.content.parts[0].text == 'part1' - assert event.content.parts[1].text == 'part2' - - def test_message_and_content_raises(self): - with pytest.raises(ValueError, match='mutually exclusive'): - Event( - message='hello', - content=types.Content(parts=[types.Part(text='world')]), - ) - - def test_content_still_works(self): - content = types.Content( - parts=[types.Part(text='via content')], role='model' - ) - event = Event(content=content) - assert event.content is content - assert event.content.parts[0].text == 'via content' - - def test_neither_message_nor_content(self): - event = Event() - assert event.content is None - - -class TestMessageProperty: - """Tests for Event.message property getter and setter.""" - - def test_message_getter_aliases_content(self): - content = types.Content(parts=[types.Part(text='hello')], role='model') - event = Event(content=content) - assert event.message is event.content - - def test_message_getter_none_when_no_content(self): - event = Event() - assert event.message is None - - def test_message_setter_updates_content(self): - event = Event() - new_content = types.Content( - parts=[types.Part(text='updated')], role='model' - ) - event.message = new_content - assert event.content is new_content - - def test_message_setter_accepts_str(self): - event = Event() - event.message = 'updated via setter' - assert event.content is not None - assert event.content.parts[0].text == 'updated via setter' - - def test_message_setter_none_clears_content(self): - event = Event(message='hello') - event.message = None - assert event.content is None - - def test_message_from_constructor_readable_via_property(self): - event = Event(message='Hello!') - assert event.message is not None - assert event.message.parts[0].text == 'Hello!' - - -class TestMessageSerialization: - """Tests that serialization uses 'content', not 'message'.""" - - def test_serialized_uses_content_field(self): - event = Event(message='Hello!') - data = event.model_dump(exclude_none=True) - assert 'content' in data - assert 'message' not in data - - def test_round_trip_via_content(self): - event = Event(message='Hello!') - data = event.model_dump() - restored = Event.model_validate(data) - assert restored.content is not None - assert restored.content.parts[0].text == 'Hello!' - assert restored.message is not None - assert restored.message.parts[0].text == 'Hello!' - - -class TestMessageWithOtherKwargs: - """Tests message combined with other convenience kwargs.""" - - def test_message_with_state(self): - event = Event(message='hello', state={'key': 'val'}) - assert event.content is not None - assert event.content.parts[0].text == 'hello' - assert event.actions.state_delta == {'key': 'val'} - - def test_message_with_route(self): - event = Event(message='hello', route='next') - assert event.content is not None - assert event.actions.route == 'next' - - -class TestMessageSubclassField: - """Tests that a subclass declaring `message` as a real field is honored. - - `_accept_convenience_kwargs` already routes construction kwargs to such a - field; the `message` property/setter must defer to it too instead of - aliasing `content`. - """ - - def test_subclass_field_readable_via_property(self): - class _Sub(Event): - message: str = '' - - event = _Sub(message='hello', author='a') - assert event.message == 'hello' - - def test_subclass_field_serializes_and_round_trips(self): - class _Sub(Event): - message: str = '' - - event = _Sub(message='hello', author='a') - data = event.model_dump() - assert data['message'] == 'hello' - assert _Sub.model_validate(data).message == 'hello' - - def test_subclass_field_setter_updates_field_not_content(self): - class _Sub(Event): - message: str = '' - - event = _Sub(message='hello', author='a') - event.message = 'updated' - assert event.message == 'updated' - assert event.content is None - - def test_base_event_message_still_aliases_content(self): - content = types.Content(parts=[types.Part(text='hi')], role='model') - event = Event(content=content) - assert event.message is event.content diff --git a/tests/unittests/events/test_node_path_builder.py b/tests/unittests/events/test_node_path_builder.py deleted file mode 100644 index 7232b67254..0000000000 --- a/tests/unittests/events/test_node_path_builder.py +++ /dev/null @@ -1,159 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk.events._node_path_builder import _NodePathBuilder -import pytest - - -def test_from_string_returns_empty_path_when_string_is_empty(): - """Parsing an empty string returns a path with no segments.""" - path = _NodePathBuilder.from_string('') - assert str(path) == '' - - -def test_from_string_parses_single_segment(): - """Parsing a single segment string returns a path with that segment.""" - path = _NodePathBuilder.from_string('wf@1') - assert str(path) == 'wf@1' - - -def test_from_string_parses_multiple_segments(): - """Parsing a slash-separated string returns a path with all segments.""" - path = _NodePathBuilder.from_string('wf@1/node@2') - assert str(path) == 'wf@1/node@2' - - -def test_str_joins_segments_with_slash(): - """String representation joins segments with slashes.""" - path = _NodePathBuilder(['wf@1', 'node@2']) - assert str(path) == 'wf@1/node@2' - - -def test_eq_returns_true_for_same_segments(): - """Equality returns True if both paths have identical segments.""" - path1 = _NodePathBuilder(['wf@1', 'node@2']) - path2 = _NodePathBuilder(['wf@1', 'node@2']) - assert path1 == path2 - - -def test_eq_returns_false_for_different_segments(): - """Equality returns False if segments differ.""" - path1 = _NodePathBuilder(['wf@1', 'node@1']) - path2 = _NodePathBuilder(['wf@1', 'node@2']) - assert path1 != path2 - - -def test_eq_returns_not_implemented_for_other_types(): - """Equality returns False when comparing with non-_NodePathBuilder objects.""" - path = _NodePathBuilder(['wf@1']) - assert path != 'wf@1' - - -def test_node_name_returns_name_without_run_id(): - """node_name returns the name part of the leaf segment, removing @id.""" - path = _NodePathBuilder.from_string('wf@1/node@2') - assert path.node_name == 'node' - - -def test_node_name_returns_full_segment_when_no_id_present(): - """node_name returns the full segment if no @id is present.""" - path = _NodePathBuilder.from_string('wf@1/node') - assert path.node_name == 'node' - - -def test_run_id_returns_id_when_present(): - """run_id returns the ID part after @ in the leaf segment.""" - path = _NodePathBuilder.from_string('wf@1/node@2') - assert path.run_id == '2' - - -def test_run_id_returns_none_when_no_id_present(): - """run_id returns None if no @ is present in the leaf segment.""" - path = _NodePathBuilder.from_string('wf@1/node') - assert path.run_id is None - - -def test_parent_returns_prefix_path(): - """parent returns a new path with the last segment removed.""" - path = _NodePathBuilder.from_string('wf@1/node@2') - parent = path.parent - assert parent is not None - assert str(parent) == 'wf@1' - - -def test_parent_returns_none_for_root_path(): - """parent returns None for a path with a single segment.""" - path = _NodePathBuilder.from_string('wf@1') - assert path.parent is None - - -def test_append_adds_segment_with_id(): - """append adds a new segment with the specified name and run ID.""" - path = _NodePathBuilder.from_string('wf@1') - child = path.append('node', '2') - assert str(child) == 'wf@1/node@2' - - -def test_append_adds_segment_without_id(): - """append adds a new segment without run ID if not provided.""" - path = _NodePathBuilder.from_string('wf@1') - child = path.append('node') - assert str(child) == 'wf@1/node' - - -def test_is_descendant_of_returns_true_for_deep_child(): - """is_descendant_of returns True if the path starts with the ancestor segments.""" - ancestor = _NodePathBuilder.from_string('wf@1') - descendant = _NodePathBuilder.from_string('wf@1/node@2') - assert descendant.is_descendant_of(ancestor) - - -def test_is_descendant_of_returns_false_for_unrelated_path(): - """is_descendant_of returns False if the path does not start with ancestor segments.""" - ancestor = _NodePathBuilder.from_string('wf@1') - other = _NodePathBuilder.from_string('other@1/node@2') - assert not other.is_descendant_of(ancestor) - - -def test_is_direct_child_of_returns_true_for_direct_child(): - """is_direct_child_of returns True if the path is exactly one segment longer than parent.""" - parent = _NodePathBuilder.from_string('wf@1') - child = _NodePathBuilder.from_string('wf@1/node@2') - assert child.is_direct_child_of(parent) - - -def test_is_direct_child_of_returns_false_for_grandchild(): - """is_direct_child_of returns False if the path is more than one segment longer.""" - parent = _NodePathBuilder.from_string('wf@1') - descendant = _NodePathBuilder.from_string('wf@1/inner@1/node@2') - assert not descendant.is_direct_child_of(parent) - - -def test_get_direct_child_returns_path_object(): - """get_direct_child returns a new path object for the direct child.""" - parent = _NodePathBuilder.from_string('wf@1') - descendant = _NodePathBuilder.from_string('wf@1/inner@1/node@2') - child = parent.get_direct_child(descendant) - assert isinstance(child, _NodePathBuilder) - assert str(child) == 'wf@1/inner@1' - - -def test_get_direct_child_raises_value_error_for_unrelated_path(): - """get_direct_child raises ValueError if descendant does not start with self.""" - parent = _NodePathBuilder.from_string('wf@1') - other = _NodePathBuilder.from_string('other@1/node@2') - with pytest.raises(ValueError): - parent.get_direct_child(other) diff --git a/tests/unittests/workflow/test_agent_transfer.py b/tests/unittests/flows/llm_flows/test_agent_transfer.py similarity index 52% rename from tests/unittests/workflow/test_agent_transfer.py rename to tests/unittests/flows/llm_flows/test_agent_transfer.py index 6832168b68..0ca6f6546a 100644 --- a/tests/unittests/workflow/test_agent_transfer.py +++ b/tests/unittests/flows/llm_flows/test_agent_transfer.py @@ -12,10 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Integration tests for multi-agent dynamic transfers in ADK 2.0.""" - -from __future__ import annotations - from google.adk.agents.llm_agent import Agent from google.adk.agents.loop_agent import LoopAgent from google.adk.agents.loop_agent import LoopAgentState @@ -23,13 +19,11 @@ from google.adk.agents.sequential_agent import SequentialAgentState from google.adk.apps.app import App from google.adk.apps.app import ResumabilityConfig -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.tools.exit_loop_tool import exit_loop from google.genai.types import Part import pytest -from tests.unittests import testing_utils +from ... import testing_utils def transfer_call_part(agent_name: str) -> Part: @@ -46,16 +40,14 @@ def transfer_call_part(agent_name: str) -> Part: @pytest.mark.parametrize('is_resumable', [True, False]) -def test_transfer_parent_to_child(is_resumable: bool): - """Verify direct Parent -> Child dynamic transfer and conversational resumption.""" - # Arrange +def test_auto_to_auto(is_resumable: bool): response = [ transfer_call_part('sub_agent_1'), 'response1', 'response2', ] mock_model = testing_utils.MockModel.create(responses=response) - + # root (auto) - sub_agent_1 (auto) sub_agent_1 = Agent(name='sub_agent_1', model=mock_model) root_agent = Agent( name='root_agent', @@ -69,15 +61,15 @@ def test_transfer_parent_to_child(is_resumable: bool): ) runner = testing_utils.InMemoryRunner(app=app) - # Act & Assert: Turn 1 if not is_resumable: + # Asserts the transfer. assert testing_utils.simplify_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), ('sub_agent_1', 'response1'), ] - # Turn 2: Conversation continues at sub_agent_1 + # sub_agent_1 should still be the current agent. assert testing_utils.simplify_events(runner.run('test2')) == [ ('sub_agent_1', 'response2'), ] @@ -85,12 +77,11 @@ def test_transfer_parent_to_child(is_resumable: bool): assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), - ('root_agent', END_OF_AGENT), ('sub_agent_1', 'response1'), ('sub_agent_1', END_OF_AGENT), + ('root_agent', END_OF_AGENT), ] - - # Turn 2: Resumed session continues at sub_agent_1 + # Same session, different invocation. assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ ('sub_agent_1', 'response2'), ('sub_agent_1', END_OF_AGENT), @@ -139,9 +130,9 @@ def test_auto_to_single(is_resumable: bool): assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), - ('root_agent', END_OF_AGENT), ('sub_agent_1', 'response1'), ('sub_agent_1', END_OF_AGENT), + ('root_agent', END_OF_AGENT), ] # Same session, different invocation. assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ @@ -200,12 +191,12 @@ def test_auto_to_auto_to_single(is_resumable: bool): assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), - ('root_agent', END_OF_AGENT), ('sub_agent_1', transfer_call_part('sub_agent_1_1')), ('sub_agent_1', TRANSFER_RESPONSE_PART), - ('sub_agent_1', END_OF_AGENT), ('sub_agent_1_1', 'response1'), ('sub_agent_1_1', END_OF_AGENT), + ('sub_agent_1', END_OF_AGENT), + ('root_agent', END_OF_AGENT), ] # Same session, different invocation. assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ @@ -272,7 +263,6 @@ def test_auto_to_sequential(is_resumable: bool): assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), - ('root_agent', END_OF_AGENT), ( 'sub_agent_1', SequentialAgentState(current_sub_agent='sub_agent_1_1').model_dump( @@ -290,6 +280,7 @@ def test_auto_to_sequential(is_resumable: bool): ('sub_agent_1_2', 'response2'), ('sub_agent_1_2', END_OF_AGENT), ('sub_agent_1', END_OF_AGENT), + ('root_agent', END_OF_AGENT), ] # Same session, different invocation. assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ @@ -368,7 +359,6 @@ def test_auto_to_sequential_to_auto(is_resumable: bool): assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), - ('root_agent', END_OF_AGENT), ( 'sub_agent_1', SequentialAgentState(current_sub_agent='sub_agent_1_1').model_dump( @@ -397,6 +387,7 @@ def test_auto_to_sequential_to_auto(is_resumable: bool): ('sub_agent_1_3', 'response3'), ('sub_agent_1_3', END_OF_AGENT), ('sub_agent_1', END_OF_AGENT), + ('root_agent', END_OF_AGENT), ] # Same session, different invocation. assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ @@ -478,7 +469,6 @@ def test_auto_to_loop(is_resumable: bool): # Transfers to sub_agent_1. ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), - ('root_agent', END_OF_AGENT), # Loops. ( 'sub_agent_1', @@ -520,6 +510,7 @@ def test_auto_to_loop(is_resumable: bool): ), ('sub_agent_1_2', END_OF_AGENT), ('sub_agent_1', END_OF_AGENT), + ('root_agent', END_OF_AGENT), ] # Same session, different invocation. assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ @@ -529,293 +520,16 @@ def test_auto_to_loop(is_resumable: bool): @pytest.mark.parametrize('is_resumable', [True, False]) -def test_transfer_child_to_sibling(is_resumable: bool): - """Verify Child A -> Sibling B peer dynamic transfer and conversational resumption.""" - # Arrange +def test_auto_to_auto_to_auto_forms_transfer_loop(is_resumable: bool): response = [ transfer_call_part('sub_agent_1'), transfer_call_part('sub_agent_2'), - 'response1', - 'response2', - ] - mock_model = testing_utils.MockModel.create(responses=response) - - sub_agent_1 = Agent(name='sub_agent_1', model=mock_model) - sub_agent_2 = Agent(name='sub_agent_2', model=mock_model) - root_agent = Agent( - name='root_agent', - model=mock_model, - sub_agents=[sub_agent_1, sub_agent_2], - ) - app = App( - name='test_app', - root_agent=root_agent, - resumability_config=ResumabilityConfig(is_resumable=is_resumable), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Act & Assert: Turn 1 - if not is_resumable: - assert testing_utils.simplify_events(runner.run('test1')) == [ - ('root_agent', transfer_call_part('sub_agent_1')), - ('root_agent', TRANSFER_RESPONSE_PART), - ('sub_agent_1', transfer_call_part('sub_agent_2')), - ('sub_agent_1', TRANSFER_RESPONSE_PART), - ('sub_agent_2', 'response1'), - ] - - # Turn 2: Conversation continues at sibling sub_agent_2 - assert testing_utils.simplify_events(runner.run('test2')) == [ - ('sub_agent_2', 'response2'), - ] - else: - assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ - ('root_agent', transfer_call_part('sub_agent_1')), - ('root_agent', TRANSFER_RESPONSE_PART), - ('root_agent', END_OF_AGENT), - ('sub_agent_1', transfer_call_part('sub_agent_2')), - ('sub_agent_1', TRANSFER_RESPONSE_PART), - ('sub_agent_1', END_OF_AGENT), - ('sub_agent_2', 'response1'), - ('sub_agent_2', END_OF_AGENT), - ] - - # Turn 2: Resumed session continues at sub_agent_2 - assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ - ('sub_agent_2', 'response2'), - ('sub_agent_2', END_OF_AGENT), - ] - - -@pytest.mark.parametrize('is_resumable', [True, False]) -def test_transfer_child_to_parent(is_resumable: bool): - """Verify Child -> Parent dynamic climbing transfer and conversational resumption.""" - # Arrange - response = [ - transfer_call_part('sub_agent_1'), transfer_call_part('root_agent'), - 'response_root', - 'response_root_2', + 'response from root', + 'response 2 from root', ] mock_model = testing_utils.MockModel.create(responses=response) - - sub_agent_1 = Agent(name='sub_agent_1', model=mock_model) - root_agent = Agent( - name='root_agent', - model=mock_model, - sub_agents=[sub_agent_1], - ) - app = App( - name='test_app', - root_agent=root_agent, - resumability_config=ResumabilityConfig(is_resumable=is_resumable), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Act & Assert: Turn 1 - if not is_resumable: - assert testing_utils.simplify_events(runner.run('test1')) == [ - ('root_agent', transfer_call_part('sub_agent_1')), - ('root_agent', TRANSFER_RESPONSE_PART), - ('sub_agent_1', transfer_call_part('root_agent')), - ('sub_agent_1', TRANSFER_RESPONSE_PART), - ('root_agent', 'response_root'), - ] - - # Turn 2: Conversation continues back at root_agent coordinator - assert testing_utils.simplify_events(runner.run('test2')) == [ - ('root_agent', 'response_root_2'), - ] - else: - assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ - ('root_agent', transfer_call_part('sub_agent_1')), - ('root_agent', TRANSFER_RESPONSE_PART), - ('root_agent', END_OF_AGENT), - ('sub_agent_1', transfer_call_part('root_agent')), - ('sub_agent_1', TRANSFER_RESPONSE_PART), - ('sub_agent_1', END_OF_AGENT), - ('root_agent', 'response_root'), - ('root_agent', END_OF_AGENT), - ] - - # Turn 2: Resumed session continues at root_agent - assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ - ('root_agent', 'response_root_2'), - ('root_agent', END_OF_AGENT), - ] - - -@pytest.mark.parametrize('is_resumable', [True, False]) -def test_transfer_child_to_grandchild(is_resumable: bool): - """Verify deep 3-layer Child -> Grandchild nested dynamic transfers.""" - # Arrange - response = [ - transfer_call_part('sub_agent_1'), - transfer_call_part('sub_agent_1_1'), - 'response_grandchild', - 'response_grandchild_2', - ] - mock_model = testing_utils.MockModel.create(responses=response) - - sub_agent_1_1 = Agent(name='sub_agent_1_1', model=mock_model) - sub_agent_1 = Agent( - name='sub_agent_1', model=mock_model, sub_agents=[sub_agent_1_1] - ) - root_agent = Agent( - name='root_agent', model=mock_model, sub_agents=[sub_agent_1] - ) - app = App( - name='test_app', - root_agent=root_agent, - resumability_config=ResumabilityConfig(is_resumable=is_resumable), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Act & Assert: Turn 1 - if not is_resumable: - assert testing_utils.simplify_events(runner.run('test1')) == [ - ('root_agent', transfer_call_part('sub_agent_1')), - ('root_agent', TRANSFER_RESPONSE_PART), - ('sub_agent_1', transfer_call_part('sub_agent_1_1')), - ('sub_agent_1', TRANSFER_RESPONSE_PART), - ('sub_agent_1_1', 'response_grandchild'), - ] - - # Turn 2: Conversation continues at grandchild - assert testing_utils.simplify_events(runner.run('test2')) == [ - ('sub_agent_1_1', 'response_grandchild_2'), - ] - else: - assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ - ('root_agent', transfer_call_part('sub_agent_1')), - ('root_agent', TRANSFER_RESPONSE_PART), - ('root_agent', END_OF_AGENT), - ('sub_agent_1', transfer_call_part('sub_agent_1_1')), - ('sub_agent_1', TRANSFER_RESPONSE_PART), - ('sub_agent_1', END_OF_AGENT), - ('sub_agent_1_1', 'response_grandchild'), - ('sub_agent_1_1', END_OF_AGENT), - ] - - # Turn 2: Resumed session continues at sub_agent_1_1 - assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ - ('sub_agent_1_1', 'response_grandchild_2'), - ('sub_agent_1_1', END_OF_AGENT), - ] - - -@pytest.mark.asyncio -async def test_transfer_to_self_raises_error(): - """Verify that an agent trying to transfer to itself raises a ValueError.""" - # Arrange - - response = [ - transfer_call_part('sub_agent_1'), - transfer_call_part('sub_agent_1'), # Transfer to self - ] - mock_model = testing_utils.MockModel.create(responses=response) - - sub_agent_1 = Agent(name='sub_agent_1', model=mock_model) - root_agent = Agent( - name='root_agent', - model=mock_model, - sub_agents=[sub_agent_1], - ) - - session_service = InMemorySessionService() - await session_service.create_session( - app_name='test_app', user_id='test_user', session_id='test_session' - ) - runner = Runner( - app_name='test_app', - agent=root_agent, - session_service=session_service, - ) - - msg = testing_utils.types.Content( - role='user', parts=[testing_utils.types.Part(text='start')] - ) - - # Act & Assert - with pytest.raises(ValueError, match='cannot transfer to itself'): - async for _ in runner.run_async( - user_id='test_user', - session_id='test_session', - new_message=msg, - ): - pass - - -@pytest.mark.asyncio -async def test_transfer_to_unrelated_agent_raises_error(): - """Verify that an agent transferring to an unrelated agent raises a ValueError.""" - # Arrange - - response = [ - transfer_call_part('sub_agent_1'), - transfer_call_part('sub_agent_1_1'), - transfer_call_part( - 'sub_agent_2' - ), # Structurally unrelated to sub_agent_1_1! - ] - mock_model = testing_utils.MockModel.create(responses=response) - - sub_agent_1_1 = Agent(name='sub_agent_1_1', model=mock_model) - sub_agent_1 = Agent( - name='sub_agent_1', - model=mock_model, - sub_agents=[sub_agent_1_1], - ) - sub_agent_2 = Agent(name='sub_agent_2', model=mock_model) - root_agent = Agent( - name='root_agent', - model=mock_model, - sub_agents=[sub_agent_1, sub_agent_2], - ) - - session_service = InMemorySessionService() - await session_service.create_session( - app_name='test_app', user_id='test_user', session_id='test_session' - ) - runner = Runner( - app_name='test_app', - agent=root_agent, - session_service=session_service, - ) - - msg = testing_utils.types.Content( - role='user', parts=[testing_utils.types.Part(text='start')] - ) - - # Act & Assert - with pytest.raises( - ValueError, - match=( - "Cannot transfer from 'sub_agent_1_1' to unrelated agent" - " 'sub_agent_2'" - ), - ): - async for _ in runner.run_async( - user_id='test_user', - session_id='test_session', - new_message=msg, - ): - pass - - -@pytest.mark.parametrize('is_resumable', [True, False]) -def test_transfer_cyclic_loop(is_resumable: bool): - """Verify multi-stage cyclic loop transfer (Root -> SubA -> SubB -> Root) and resumption.""" - # Arrange - response = [ - transfer_call_part('sub_agent_1'), - transfer_call_part('sub_agent_2'), - transfer_call_part('root_agent'), - 'response_from_root', - 'response_from_root_2', - ] - mock_model = testing_utils.MockModel.create(responses=response) - + # root (auto) - sub_agent_1 (auto) - sub_agent_2 (auto) - root (auto) sub_agent_1 = Agent(name='sub_agent_1', model=mock_model) sub_agent_2 = Agent(name='sub_agent_2', model=mock_model) root_agent = Agent( @@ -830,8 +544,8 @@ def test_transfer_cyclic_loop(is_resumable: bool): ) runner = testing_utils.InMemoryRunner(app=app) - # Act & Assert: Turn 1 if not is_resumable: + # Asserts the transfer. assert testing_utils.simplify_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), @@ -839,261 +553,35 @@ def test_transfer_cyclic_loop(is_resumable: bool): ('sub_agent_1', TRANSFER_RESPONSE_PART), ('sub_agent_2', transfer_call_part('root_agent')), ('sub_agent_2', TRANSFER_RESPONSE_PART), - ('root_agent', 'response_from_root'), + ('root_agent', 'response from root'), ] - # Turn 2: Conversation continues at root coordinator + # root_agent should be the current agent. assert testing_utils.simplify_events(runner.run('test2')) == [ - ('root_agent', 'response_from_root_2'), + ('root_agent', 'response 2 from root'), ] else: assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), - ('root_agent', END_OF_AGENT), ('sub_agent_1', transfer_call_part('sub_agent_2')), ('sub_agent_1', TRANSFER_RESPONSE_PART), - ('sub_agent_1', END_OF_AGENT), ('sub_agent_2', transfer_call_part('root_agent')), ('sub_agent_2', TRANSFER_RESPONSE_PART), + ('root_agent', 'response from root'), + ( + 'root_agent', + END_OF_AGENT, + ), # First time root_agent marked as ended. ('sub_agent_2', END_OF_AGENT), - ('root_agent', 'response_from_root'), - ('root_agent', END_OF_AGENT), + ('sub_agent_1', END_OF_AGENT), + ( + 'root_agent', + END_OF_AGENT, + ), # Second time root_agent marked as ended. ] - - # Turn 2: Resumed session continues at root_agent + # Same session, different invocation. assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ - ('root_agent', 'response_from_root_2'), + ('root_agent', 'response 2 from root'), ('root_agent', END_OF_AGENT), ] - - -@pytest.mark.asyncio -async def test_three_level_nested_dynamic_node_transfer(): - """Verify parent relationship climbing in 3-level deep nested dynamic nodes. - - Setup: - - root_agent with sub_agents=[mid_agent]. - - mid_agent with sub_agents=[leaf_agent, target_agent]. - Act: - - Run root_agent. Model responses trigger transfers: - Root -> Mid -> Leaf -> Target. - Assert: - - Events verify the full transfer chain and target response. - """ - # Arrange - target_agent = Agent(name='target_agent') - leaf_agent = Agent(name='leaf_agent') - mid_agent = Agent(name='mid_agent', sub_agents=[leaf_agent, target_agent]) - root_agent = Agent(name='root_agent', sub_agents=[mid_agent]) - - root_agent.model = testing_utils.MockModel.create( - responses=[transfer_call_part('mid_agent')] - ) - mid_agent.model = testing_utils.MockModel.create( - responses=[transfer_call_part('leaf_agent')] - ) - leaf_agent.model = testing_utils.MockModel.create( - responses=[transfer_call_part('target_agent')] - ) - target_agent.model = testing_utils.MockModel.create( - responses=['hello from target'] - ) - - app = App(name='test_app', root_agent=root_agent) - runner = testing_utils.InMemoryRunner(app=app) - - # Act - events = runner.run('go') - simple_events = testing_utils.simplify_events(events) - - # Assert - assert ('root_agent', transfer_call_part('mid_agent')) in simple_events - assert ('mid_agent', transfer_call_part('leaf_agent')) in simple_events - assert ('leaf_agent', transfer_call_part('target_agent')) in simple_events - assert ('target_agent', 'hello from target') in simple_events - - -@pytest.mark.asyncio -async def test_agent_transfer_hitl_resume_rehydration(): - """Verify B's rehydration after transfer A -> B -> LRO confirmation on turn 2. - - Setup: - - agent_a with sub_agents=[agent_b]. - - agent_b with a LongRunningFunctionTool. - Act: - - Turn 1: Run agent_a. Model transfers to agent_b, which calls LRO. - - Turn 2: Resume with LRO function response. - Assert: - - Turn 1: Yields LRO interrupt. - - Turn 2: agent_b successfully rehydrates and completes. - """ - from google.adk.tools.long_running_tool import LongRunningFunctionTool - - # Arrange - def confirm_tool() -> None: - return None - - lro_tool = LongRunningFunctionTool(confirm_tool) - agent_b = Agent(name='agent_b', tools=[lro_tool]) - agent_a = Agent(name='agent_a', sub_agents=[agent_b], tools=[lro_tool]) - - agent_a.model = testing_utils.MockModel.create( - responses=[transfer_call_part('agent_b')] - ) - - LRO_ID = 'adk-test-lro-123' - agent_b.model = testing_utils.MockModel.create( - responses=[ - testing_utils.types.Part( - function_call=testing_utils.types.FunctionCall( - name='confirm_tool', args={}, id=LRO_ID - ) - ), - 'B task finished', - ] - ) - - session_service = InMemorySessionService() - await session_service.create_session( - app_name='test_app', user_id='test_user', session_id='test_session' - ) - runner = Runner( - app_name='test_app', - agent=agent_a, - session_service=session_service, - ) - - # Act: Turn 1 - events1 = [ - e - async for e in runner.run_async( - user_id='test_user', - session_id='test_session', - new_message=testing_utils.types.Content( - role='user', parts=[testing_utils.types.Part(text='start task')] - ), - ) - ] - - # Assert: Turn 1 - assert any(e.long_running_tool_ids for e in events1) - - # Arrange: Turn 2 - lro_id = None - for e in events1: - if e.content and e.content.parts: - for p in e.content.parts: - if ( - p.function_call - and p.function_call.name == 'confirm_tool' - and p.function_call.id - ): - lro_id = p.function_call.id - break - if lro_id: - break - - if not lro_id: - for e in events1: - if e.long_running_tool_ids: - lro_id = list(e.long_running_tool_ids)[0] - break - - assert lro_id is not None - invocation_id = events1[0].invocation_id - - confirm_response = testing_utils.types.Content( - role='user', - parts=[ - testing_utils.types.Part( - function_response=testing_utils.types.FunctionResponse( - id=lro_id, - name='confirm_tool', - response={'result': 'done'}, - ) - ) - ], - ) - - # Act: Turn 2 - events2 = [ - e - async for e in runner.run_async( - user_id='test_user', - session_id='test_session', - invocation_id=invocation_id, - new_message=confirm_response, - ) - ] - - # Assert: Turn 2 - simplified2 = testing_utils.simplify_resumable_app_events(events2) - assert ('agent_b', 'B task finished') in simplified2 - - -@pytest.mark.asyncio -async def test_llm_agent_transfer_inside_custom_node(): - """Verify transfer from an LlmAgent called inside a custom dynamic node. - - Setup: - - root_agent with sub_agents=[inner_agent, target_agent] to establish static sibling relation. - - A custom @node that calls inner_agent via ctx.run_node. - - A Workflow that executes the custom node. - Act: - - Run the workflow. inner_agent is executed and triggers transfer to target_agent. - Assert: - - The transfer is correctly resolved as SIBLING and target_agent executes. - """ - from google.adk.workflow import node - from google.adk.workflow import START - from google.adk.workflow import Workflow - - # Arrange - target_agent = Agent(name='target_agent') - inner_agent = Agent(name='inner_agent') - # Establish static hierarchy for transfer resolution - root_agent = Agent(name='root_agent', sub_agents=[inner_agent, target_agent]) - - inner_agent.model = testing_utils.MockModel.create( - responses=[transfer_call_part('target_agent')] - ) - target_agent.model = testing_utils.MockModel.create( - responses=['hello from target'] - ) - - @node(rerun_on_resume=True) - async def custom_node(*, ctx, node_input): - # Call llm agent inside custom node - result = await ctx.run_node(inner_agent, node_input='go') - yield f'custom: {result}' - - wf = Workflow(name='wf', edges=[(START, custom_node)]) - - session_service = InMemorySessionService() - await session_service.create_session( - app_name='test_app', user_id='test_user', session_id='test_session' - ) - runner = Runner( - app_name='test_app', - node=wf, - session_service=session_service, - ) - - # Act - events = [ - e - async for e in runner.run_async( - user_id='test_user', - session_id='test_session', - new_message=testing_utils.types.Content( - role='user', parts=[testing_utils.types.Part(text='start')] - ), - ) - ] - - simplified = testing_utils.simplify_events(events) - - # Assert - assert ('inner_agent', transfer_call_part('target_agent')) in simplified - assert ('target_agent', 'hello from target') in simplified diff --git a/tests/unittests/flows/llm_flows/test_agent_transfer_system_instructions.py b/tests/unittests/flows/llm_flows/test_agent_transfer_system_instructions.py index 42ef44e1a1..3f590a2197 100644 --- a/tests/unittests/flows/llm_flows/test_agent_transfer_system_instructions.py +++ b/tests/unittests/flows/llm_flows/test_agent_transfer_system_instructions.py @@ -19,13 +19,9 @@ implementation. """ -from typing import AsyncGenerator - -from google.adk.agents.base_agent import BaseAgent from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import Agent from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService -from google.adk.events.event import Event from google.adk.flows.llm_flows import agent_transfer from google.adk.memory.in_memory_memory_service import InMemoryMemoryService from google.adk.models.llm_request import LlmRequest @@ -38,15 +34,6 @@ from ... import testing_utils -class _NonLlmAgent(BaseAgent): - """A minimal BaseAgent subclass that, like any non-LlmAgent, has no `mode`.""" - - async def _run_async_impl( - self, ctx: InvocationContext - ) -> AsyncGenerator[Event, None]: - yield Event(author=self.name, invocation_id=ctx.invocation_id) - - async def create_test_invocation_context(agent: Agent) -> InvocationContext: """Helper to create constructed InvocationContext.""" session_service = InMemorySessionService() @@ -309,36 +296,3 @@ async def test_agent_transfer_no_instructions_when_no_transfer_targets(): instructions = llm_request.config.system_instruction or '' assert '**NOTE**:' not in instructions assert 'transfer_to_agent' not in instructions - - -@pytest.mark.asyncio -async def test_agent_transfer_with_non_llm_peer_agent(): - """Peer agents that are not LlmAgents (no `mode`) must not break transfer.""" - mockModel = testing_utils.MockModel.create(responses=[]) - - non_llm_peer = _NonLlmAgent( - name='non_llm_peer', description='A non-LlmAgent peer' - ) - parent_agent = Agent( - name='parent_agent', - model=mockModel, - sub_agents=[non_llm_peer], - description='Parent agent', - ) - main_agent = Agent( - name='main_agent', - model=mockModel, - parent_agent=parent_agent, - description='Main agent', - ) - - invocation_context = await create_test_invocation_context(main_agent) - llm_request = LlmRequest() - - async for _ in agent_transfer.request_processor.run_async( - invocation_context, llm_request - ): - pass - - instructions = llm_request.config.system_instruction - assert 'non_llm_peer' in instructions diff --git a/tests/unittests/flows/llm_flows/test_base_llm_flow.py b/tests/unittests/flows/llm_flows/test_base_llm_flow.py index 3a2e7e4406..ce2e83b6f7 100644 --- a/tests/unittests/flows/llm_flows/test_base_llm_flow.py +++ b/tests/unittests/flows/llm_flows/test_base_llm_flow.py @@ -14,11 +14,9 @@ """Unit tests for BaseLlmFlow toolset integration.""" -import asyncio from unittest import mock from unittest.mock import AsyncMock -from google.adk.agents.live_request_queue import LiveRequestQueue from google.adk.agents.llm_agent import Agent from google.adk.agents.run_config import RunConfig from google.adk.events.event import Event @@ -30,10 +28,8 @@ from google.adk.plugins.base_plugin import BasePlugin from google.adk.tools.base_toolset import BaseToolset from google.adk.tools.google_search_tool import GoogleSearchTool -from google.adk.utils.variant_utils import GoogleLLMVariant from google.genai import types import pytest -from websockets.exceptions import ConnectionClosed from ... import testing_utils @@ -245,130 +241,6 @@ def _my_tool(sides: int) -> int: ) -@pytest.mark.asyncio -async def test_process_agent_tools_resolves_unions_in_parallel(): - """``_convert_tool_union_to_tools`` is dispatched for every tool_union concurrently. - - Each mocked resolution blocks until ``all_started`` is set; the event - is only set once every call has been entered. If - ``_process_agent_tools`` were still serial, the first call would - block forever waiting for the event the second call hasn't yet - entered to set. - """ - num_tools = 5 - started_count = 0 - all_started = asyncio.Event() - release = asyncio.Event() - - async def blocking_convert(tool_union, *args, **kwargs): - del args, kwargs - nonlocal started_count - started_count += 1 - if started_count == num_tools: - all_started.set() - await release.wait() - return [_AsyncProcessLlmRequestTool(name=tool_union.__name__)] - - def _make_func(i): - def _f(): - """Test function.""" - return i - - _f.__name__ = f'fn_{i}' - return _f - - funcs = [_make_func(i) for i in range(num_tools)] - - with mock.patch( - 'google.adk.agents.llm_agent._convert_tool_union_to_tools', - side_effect=blocking_convert, - ): - agent = Agent(name='test_agent', tools=funcs) - invocation_context = await testing_utils.create_invocation_context( - agent=agent, user_content='test message' - ) - flow = BaseLlmFlowForTesting() - llm_request = LlmRequest() - - async def drive(): - async for _ in flow._preprocess_async(invocation_context, llm_request): - pass - - drive_task = asyncio.create_task(drive()) - try: - # If resolution were serial this would hang; release the gate as - # soon as every coroutine has entered. - await asyncio.wait_for(all_started.wait(), timeout=5.0) - finally: - release.set() - await asyncio.wait_for(drive_task, timeout=5.0) - - assert started_count == num_tools - - -@pytest.mark.asyncio -async def test_process_agent_tools_preserves_order_when_later_unions_resolve_first(): - """``process_llm_request`` is called in original ``agent.tools`` order even when later unions resolve first.""" - - resolution_started_evt = [asyncio.Event(), asyncio.Event()] - process_call_order: list[str] = [] - - async def staggered_convert(tool_union, *args, **kwargs): - del args, kwargs - if tool_union.__name__ == 'fn_slow': - # Resolve only after fn_fast's resolution has completed. - await resolution_started_evt[1].wait() - tool_name = 'slow_tool' - else: - tool_name = 'fast_tool' - resolution_started_evt[1].set() - return [ - _AsyncProcessLlmRequestTool( - name=tool_name, on_process=process_call_order.append - ) - ] - - def fn_slow(): - """Slow-resolving function.""" - return 0 - - def fn_fast(): - """Fast-resolving function.""" - return 0 - - with mock.patch( - 'google.adk.agents.llm_agent._convert_tool_union_to_tools', - side_effect=staggered_convert, - ): - # agent.tools order is [slow, fast]; resolution completes [fast, slow]. - agent = Agent(name='test_agent', tools=[fn_slow, fn_fast]) - invocation_context = await testing_utils.create_invocation_context( - agent=agent, user_content='test message' - ) - flow = BaseLlmFlowForTesting() - llm_request = LlmRequest() - - async for _ in flow._preprocess_async(invocation_context, llm_request): - pass - - # Even though fast_tool was resolved first, process_llm_request must - # be invoked in agent.tools order (slow_tool first). - assert process_call_order == ['slow_tool', 'fast_tool'] - - -class _AsyncProcessLlmRequestTool: - """Minimal stand-in for a BaseTool that records process_llm_request calls.""" - - def __init__(self, name: str, on_process=None): - self.name = name - self._on_process = on_process - - async def process_llm_request(self, *, tool_context, llm_request): - del tool_context, llm_request - if self._on_process is not None: - self._on_process(self.name) - - # TODO(b/448114567): Remove the following # test_handle_after_model_callback_grounding tests once the workaround # is no longer needed. @@ -618,6 +490,8 @@ async def call(self, **kwargs): @pytest.mark.asyncio async def test_run_live_reconnects_on_connection_closed(): """Test that run_live reconnects when ConnectionClosed occurs.""" + from google.adk.agents.live_request_queue import LiveRequestQueue + from websockets.exceptions import ConnectionClosed real_model = Gemini() mock_connection = mock.AsyncMock() @@ -684,6 +558,7 @@ async def mock_receive_2(): @pytest.mark.asyncio async def test_run_live_reconnects_on_api_error(): """Test that run_live reconnects when APIError occurs.""" + from google.adk.agents.live_request_queue import LiveRequestQueue from google.genai.errors import APIError real_model = Gemini() @@ -751,6 +626,7 @@ async def mock_receive_2(): @pytest.mark.asyncio async def test_run_live_skips_send_history_on_resumption(): """Test that run_live skips send_history when resuming a session.""" + from google.adk.agents.live_request_queue import LiveRequestQueue real_model = Gemini() mock_connection = mock.AsyncMock() @@ -808,6 +684,7 @@ async def mock_receive(): @pytest.mark.asyncio async def test_live_session_resumption_go_away(): """Test that go_away triggers reconnection.""" + from google.adk.agents.live_request_queue import LiveRequestQueue real_model = Gemini() mock_connection = mock.AsyncMock() @@ -866,6 +743,8 @@ async def mock_receive_2(): @pytest.mark.asyncio async def test_run_live_no_reconnect_without_handle(): """Test that run_live does not reconnect when handle is missing.""" + from google.adk.agents.live_request_queue import LiveRequestQueue + from websockets.exceptions import ConnectionClosed real_model = Gemini() mock_connection = mock.AsyncMock() @@ -907,6 +786,8 @@ async def mock_receive(): @pytest.mark.asyncio async def test_run_live_reconnect_limit(): """Test that run_live stops reconnecting after 5 attempts.""" + from google.adk.agents.live_request_queue import LiveRequestQueue + from websockets.exceptions import ConnectionClosed real_model = Gemini() @@ -962,7 +843,9 @@ async def mock_receive(): @pytest.mark.asyncio async def test_run_live_reconnect_reset_attempt(): """Test that attempt counter is reset on successful communication.""" + from google.adk.agents.live_request_queue import LiveRequestQueue from google.adk.flows.llm_flows.base_llm_flow import DEFAULT_MAX_RECONNECT_ATTEMPTS + from websockets.exceptions import ConnectionClosed real_model = Gemini() @@ -1104,6 +987,7 @@ async def mock_receive(): @pytest.mark.asyncio async def test_run_live_clears_resumption_handle_on_transfer(): """Test that run_live clears session resumption handles when transferring to another agent.""" + from google.adk.agents.live_request_queue import LiveRequestQueue agent = Agent(name='test_agent') invocation_context = await testing_utils.create_invocation_context( @@ -1185,343 +1069,3 @@ async def mock_run_live_sub_agent(child_ctx, *args, **kwargs): assert ( invocation_context.run_config.session_resumption.handle == 'test_handle' ) - - -@pytest.mark.asyncio -async def test_postprocess_live_yields_grounding_metadata_only(): - """Test that _postprocess_live yields LlmResponse with only grounding_metadata.""" - agent = Agent(name='test_agent') - invocation_context = await testing_utils.create_invocation_context( - agent=agent - ) - flow = BaseLlmFlowForTesting() - - llm_request = LlmRequest() - grounding_metadata = types.GroundingMetadata( - web_search_queries=['test query'], - ) - llm_response = LlmResponse(grounding_metadata=grounding_metadata) - model_response_event = Event( - id=Event.new_id(), - invocation_id=invocation_context.invocation_id, - author=agent.name, - ) - - events = [] - async for event in flow._postprocess_live( - invocation_context, llm_request, llm_response, model_response_event - ): - events.append(event) - - assert len(events) == 1 - assert events[0].grounding_metadata == grounding_metadata - - -@pytest.mark.asyncio -async def test_postprocess_async_yields_grounding_metadata_only(): - """Test that _postprocess_async yields LlmResponse with only grounding_metadata.""" - agent = Agent(name='test_agent') - invocation_context = await testing_utils.create_invocation_context( - agent=agent - ) - flow = BaseLlmFlowForTesting() - - llm_request = LlmRequest() - grounding_metadata = types.GroundingMetadata( - web_search_queries=['test query'], - ) - llm_response = LlmResponse(grounding_metadata=grounding_metadata) - model_response_event = Event( - id=Event.new_id(), - invocation_id=invocation_context.invocation_id, - author=agent.name, - ) - - events = [] - async for event in flow._postprocess_async( - invocation_context, llm_request, llm_response, model_response_event - ): - events.append(event) - - assert len(events) == 1 - assert events[0].grounding_metadata == grounding_metadata - - -@pytest.mark.asyncio -async def test_run_live_reconnect_does_not_set_transparent(): - """Test that run_live reconnect does not set transparent=True.""" - - real_model = Gemini() - mock_connection = mock.AsyncMock() - - async def mock_receive(): - yield LlmResponse( - live_session_resumption_update=types.LiveServerSessionResumptionUpdate( - new_handle='test_handle' - ) - ) - raise ConnectionClosed(None, None) - - mock_connection.receive = mock.Mock(side_effect=mock_receive) - - agent = Agent(name='test_agent', model=real_model) - invocation_context = await testing_utils.create_invocation_context( - agent=agent - ) - invocation_context.live_request_queue = LiveRequestQueue() - invocation_context.run_config = RunConfig() - - flow = BaseLlmFlowForTesting() - - with mock.patch.object(flow, '_send_to_model', new_callable=AsyncMock): - - async def mock_preprocess(ctx, req): - req.live_connect_config.session_resumption = ( - ctx.run_config.session_resumption - ) - yield Event(id=Event.new_id(), author='test') - - with mock.patch.object( - flow, '_preprocess_async', side_effect=mock_preprocess - ): - mock_connection_2 = mock.AsyncMock() - - class StopTestError(Exception): - pass - - async def mock_receive_2(): - yield LlmResponse( - content=types.Content(parts=[types.Part.from_text(text='hi')]) - ) - raise StopTestError('stop') - - mock_connection_2.receive = mock.Mock(side_effect=mock_receive_2) - - mock_aenter = mock.AsyncMock() - mock_aenter.side_effect = [mock_connection, mock_connection_2] - - with mock.patch( - 'google.adk.models.google_llm.Gemini.connect' - ) as mock_connect: - mock_connect.return_value.__aenter__ = mock_aenter - - try: - async for _ in flow.run_live(invocation_context): - pass - except StopTestError: - pass - - assert mock_connect.call_count == 2 - second_call_req = mock_connect.call_args_list[1][0][0] - session_resump = second_call_req.live_connect_config.session_resumption - assert session_resump.transparent is None - - -@pytest.mark.asyncio -async def test_run_live_reconnect_sets_transparent_for_vertex(): - """Test that run_live reconnect sets transparent=True for vertex backend.""" - - real_model = Gemini( - model='projects/test-project/locations/us-central1/publishers/google/models/gemini-2.0-flash-exp' - ) - mock_connection = mock.AsyncMock() - - async def mock_receive(): - yield LlmResponse( - live_session_resumption_update=types.LiveServerSessionResumptionUpdate( - new_handle='test_handle' - ) - ) - raise ConnectionClosed(None, None) - - mock_connection.receive = mock.Mock(side_effect=mock_receive) - - agent = Agent(name='test_agent', model=real_model) - invocation_context = await testing_utils.create_invocation_context( - agent=agent - ) - invocation_context.live_request_queue = LiveRequestQueue() - invocation_context.run_config = RunConfig() - - flow = BaseLlmFlowForTesting() - - with mock.patch.object(flow, '_send_to_model', new_callable=AsyncMock): - - async def mock_preprocess(ctx, req): - req.live_connect_config.session_resumption = ( - ctx.run_config.session_resumption - ) - yield Event(id=Event.new_id(), author='test') - - with mock.patch.object( - flow, '_preprocess_async', side_effect=mock_preprocess - ): - mock_connection_2 = mock.AsyncMock() - - class StopTestError(Exception): - pass - - async def mock_receive_2(): - yield LlmResponse( - content=types.Content(parts=[types.Part.from_text(text='hi')]) - ) - raise StopTestError('stop') - - mock_connection_2.receive = mock.Mock(side_effect=mock_receive_2) - - mock_aenter = mock.AsyncMock() - mock_aenter.side_effect = [mock_connection, mock_connection_2] - - with mock.patch( - 'google.adk.models.google_llm.Gemini.connect' - ) as mock_connect: - mock_connect.return_value.__aenter__ = mock_aenter - - try: - async for _ in flow.run_live(invocation_context): - pass - except StopTestError: - pass - - assert mock_connect.call_count == 2 - second_call_req = mock_connect.call_args_list[1][0][0] - session_resump = second_call_req.live_connect_config.session_resumption - assert session_resump.transparent - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - 'api_backend', - [ - GoogleLLMVariant.GEMINI_API, - GoogleLLMVariant.VERTEX_AI, - ], -) -async def test_run_live_history_config_set_for_all_backends(api_backend): - """Test that run_live sets history_config for all backends.""" - - real_model = Gemini(model='gemini-3.1-flash-live-preview') - mock_connection = mock.AsyncMock() - - agent = Agent(name='test_agent', model=real_model) - invocation_context = await testing_utils.create_invocation_context( - agent=agent - ) - invocation_context.live_request_queue = LiveRequestQueue() - invocation_context.run_config = RunConfig() - - flow = BaseLlmFlowForTesting() - - async def mock_preprocess(ctx, req): - req.contents = [types.Content(parts=[types.Part.from_text(text='history')])] - from google.adk.flows.llm_flows.basic import _build_basic_request - - _build_basic_request(ctx, req) - yield Event(id=Event.new_id(), author='test') - - with mock.patch.object( - flow, '_preprocess_async', side_effect=mock_preprocess - ): - with mock.patch.object(flow, '_send_to_model', new_callable=AsyncMock): - - class StopTestError(Exception): - pass - - async def mock_receive(): - yield LlmResponse( - content=types.Content(parts=[types.Part.from_text(text='hi')]) - ) - raise StopTestError('stop') - - mock_connection.receive = mock.Mock(side_effect=mock_receive) - - with mock.patch( - 'google.adk.models.google_llm.Gemini.connect' - ) as mock_connect: - mock_connect.return_value.__aenter__.return_value = mock_connection - - # Mock the api_backend property - with mock.patch.object( - Gemini, - '_api_backend', - new_callable=mock.PropertyMock, - return_value=api_backend, - ): - try: - async for _ in flow.run_live(invocation_context): - pass - except StopTestError: - pass - - assert mock_connect.call_count == 1 - called_req = mock_connect.call_args[0][0] - assert called_req.live_connect_config is not None - assert called_req.live_connect_config.history_config is not None - assert ( - called_req.live_connect_config.history_config.initial_history_in_client_content - is True - ) - - -@pytest.mark.asyncio -async def test_run_live_respects_explicit_initial_history_in_client_content_false(): - """Test that run_live respects explicit initial_history_in_client_content=False in RunConfig.""" - - real_model = Gemini() - mock_connection = mock.AsyncMock() - - agent = Agent(name='test_agent', model=real_model) - invocation_context = await testing_utils.create_invocation_context( - agent=agent - ) - invocation_context.live_request_queue = LiveRequestQueue() - run_config = RunConfig( - history_config=types.HistoryConfig( - initial_history_in_client_content=False - ) - ) - invocation_context.run_config = run_config - - flow = BaseLlmFlowForTesting() - - async def mock_preprocess(ctx, req): - req.contents = [types.Content(parts=[types.Part.from_text(text='history')])] - from google.adk.flows.llm_flows.basic import _build_basic_request - - _build_basic_request(ctx, req) - yield Event(id=Event.new_id(), author='test') - - with mock.patch.object( - flow, '_preprocess_async', side_effect=mock_preprocess - ): - with mock.patch.object(flow, '_send_to_model', new_callable=AsyncMock): - - class StopTestError(Exception): - pass - - async def mock_receive(): - yield LlmResponse( - content=types.Content(parts=[types.Part.from_text(text='hi')]) - ) - raise StopTestError('stop') - - mock_connection.receive = mock.Mock(side_effect=mock_receive) - - with mock.patch( - 'google.adk.models.google_llm.Gemini.connect' - ) as mock_connect: - mock_connect.return_value.__aenter__.return_value = mock_connection - - try: - async for _ in flow.run_live(invocation_context): - pass - except StopTestError: - pass - - assert mock_connect.call_count == 1 - call_req = mock_connect.call_args[0][0] - assert call_req.live_connect_config.history_config is not None - assert ( - call_req.live_connect_config.history_config.initial_history_in_client_content - is False - ) diff --git a/tests/unittests/flows/llm_flows/test_basic_processor.py b/tests/unittests/flows/llm_flows/test_basic_processor.py index 26ccd55c6d..5f3cd4ef44 100644 --- a/tests/unittests/flows/llm_flows/test_basic_processor.py +++ b/tests/unittests/flows/llm_flows/test_basic_processor.py @@ -23,7 +23,6 @@ from google.adk.models.llm_request import LlmRequest from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.tools.function_tool import FunctionTool -from google.genai import types from pydantic import BaseModel from pydantic import Field import pytest @@ -189,68 +188,3 @@ async def test_sets_model_name(self): # Should have set the model name assert llm_request.model == 'gemini-2.5-flash' - - @pytest.mark.asyncio - async def test_skips_output_schema_for_task_mode(self): - """Test that processor skips output_schema when agent is in task mode.""" - agent = LlmAgent( - name='test_agent', - model='gemini-2.5-flash', - mode='task', - output_schema=OutputSchema, - ) - - invocation_context = await _create_invocation_context(agent) - llm_request = LlmRequest() - processor = _BasicLlmRequestProcessor() - - async for _ in processor.run_async(invocation_context, llm_request): - pass - - assert llm_request.config.response_schema is None - - @pytest.mark.asyncio - async def test_disables_affective_dialog_and_proactivity_for_gemini_3_1_live( - self, - ): - """Gemini 3.1 Live does not support affective_dialog/proactivity.""" - agent = LlmAgent( - name='test_agent', - model='gemini-3.1-flash-live-preview', - ) - invocation_context = await _create_invocation_context(agent) - invocation_context.run_config = RunConfig( - enable_affective_dialog=True, - proactivity=types.ProactivityConfig(), - ) - llm_request = LlmRequest() - processor = _BasicLlmRequestProcessor() - - async for _ in processor.run_async(invocation_context, llm_request): - pass - - assert llm_request.live_connect_config.enable_affective_dialog is None - assert llm_request.live_connect_config.proactivity is None - - @pytest.mark.asyncio - async def test_keeps_affective_dialog_and_proactivity_for_non_gemini_3_1( - self, - ): - """Non-3.1 live models keep the configured affective_dialog/proactivity.""" - agent = LlmAgent( - name='test_agent', - model='gemini-2.5-flash-live', - ) - invocation_context = await _create_invocation_context(agent) - invocation_context.run_config = RunConfig( - enable_affective_dialog=True, - proactivity=types.ProactivityConfig(), - ) - llm_request = LlmRequest() - processor = _BasicLlmRequestProcessor() - - async for _ in processor.run_async(invocation_context, llm_request): - pass - - assert llm_request.live_connect_config.enable_affective_dialog is True - assert llm_request.live_connect_config.proactivity is not None diff --git a/tests/unittests/flows/llm_flows/test_code_execution.py b/tests/unittests/flows/llm_flows/test_code_execution.py index e1a3de1cfb..69f2d7832d 100644 --- a/tests/unittests/flows/llm_flows/test_code_execution.py +++ b/tests/unittests/flows/llm_flows/test_code_execution.py @@ -23,7 +23,6 @@ from google.adk.code_executors.base_code_executor import BaseCodeExecutor from google.adk.code_executors.built_in_code_executor import BuiltInCodeExecutor from google.adk.code_executors.code_execution_utils import CodeExecutionResult -from google.adk.flows.llm_flows._code_execution import _DATA_FILE_HELPER_LIB from google.adk.flows.llm_flows._code_execution import response_processor from google.adk.models.llm_response import LlmResponse from google.genai import types @@ -151,18 +150,3 @@ async def test_logs_executed_code(mock_logger): mock_logger.debug.assert_called_once_with( 'Executed code:\n```\n%s\n```', 'print("hello")' ) - - -def test_data_file_helper_lib_defines_crop(): - """`explore_df` in the injected helper lib calls `crop`, which must exist.""" - pd = pytest.importorskip('pandas') - namespace = {} - exec(_DATA_FILE_HELPER_LIB, namespace) # pylint: disable=exec-used - - crop = namespace['crop'] - assert crop('short') == 'short' - assert crop('x' * 100, max_chars=10) == 'x' * 7 + '...' - assert crop('abcdef', max_chars=2) == 'ab' - - # Regression for #4011: explore_df raised NameError when crop was undefined. - namespace['explore_df'](pd.DataFrame({'a': [1, 2], 'b': ['x', 'y']})) diff --git a/tests/unittests/flows/llm_flows/test_functions_simple.py b/tests/unittests/flows/llm_flows/test_functions_simple.py index 71834d2c01..be638de44c 100644 --- a/tests/unittests/flows/llm_flows/test_functions_simple.py +++ b/tests/unittests/flows/llm_flows/test_functions_simple.py @@ -15,11 +15,8 @@ import asyncio from typing import Any from typing import Callable -from unittest import mock -from fastapi.openapi.models import HTTPBearer from google.adk.agents.llm_agent import Agent -from google.adk.auth.auth_tool import AuthConfig from google.adk.events.event import Event from google.adk.events.event_actions import EventActions from google.adk.events.ui_widget import UiWidget @@ -27,10 +24,8 @@ from google.adk.flows.llm_flows.functions import handle_function_calls_async from google.adk.flows.llm_flows.functions import handle_function_calls_live from google.adk.flows.llm_flows.functions import merge_parallel_function_response_events -from google.adk.tools.base_tool import BaseTool from google.adk.tools.computer_use.computer_use_tool import ComputerUseTool from google.adk.tools.function_tool import FunctionTool -from google.adk.tools.tool_confirmation import ToolConfirmation from google.adk.tools.tool_context import ToolContext from google.genai import types import pytest @@ -1324,263 +1319,3 @@ def simple_fn() -> dict[str, str]: assert result_parallel is not None assert result_parallel.live_session_id == 'test-live-session-id-parallel' - - -class _MockControlSignalTool(BaseTool): - """A tool that simulates requesting confirmation or OAuth authentication.""" - - def __init__(self, name: str, behavior: str): - super().__init__(name=name, description='Simulated control tool') - self.behavior = behavior - - async def run_async(self, *, args, tool_context): - if self.behavior == 'confirm': - tool_context.actions.requested_tool_confirmations = { - 'fc_test_confirm': ToolConfirmation(hint='Authorize execution?') - } - return {'error': 'This tool requires user approval.'} - elif self.behavior == 'auth': - tool_context.actions.requested_auth_configs = { - 'fc_test_auth': AuthConfig(auth_scheme=HTTPBearer()) - } - return {'error': 'Please complete OAuth setup.'} - - def _detect_error_in_response(self, response: Any) -> str | None: - if isinstance(response, dict) and 'error' in response: - return 'TOOL_ERROR' - return None - - -class _ErrorDetectingTool(BaseTool): - """A test tool whose _detect_error_in_response raises an exception.""" - - async def run_async(self, *, args, tool_context): - return {'result': 'result'} - - def _detect_error_in_response(self, response: Any) -> str | None: - raise RuntimeError('detection exploded') - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - 'handle_function_calls', - [ - (handle_function_calls_async), - (handle_function_calls_live), - ], -) -@pytest.mark.parametrize( - 'mock_response,expected_error_type', - [ - ({'error': 'Internal component timeout'}, 'TOOL_ERROR'), - ({'result': 'Execution succeeded'}, None), - ], - ids=['dict_error_recorded', 'success_dict_ignored'], -) -async def test_e2e_telemetry_error_classification( - monkeypatch, handle_function_calls, mock_response, expected_error_type -): - """E2E: asserts that tool outputs successfully translate to targeted OTel span error attributes.""" - recorded_calls = [] - - # Intercept trace_tool_call to capture final telemetry state - monkeypatch.setattr( - 'google.adk.telemetry._instrumentation.tracing.trace_tool_call', - lambda **kw: recorded_calls.append(kw), - ) - - tool = FunctionTool(func=lambda: mock_response) - model = testing_utils.MockModel.create(responses=[]) - agent = Agent(name='test_agent', model=model, tools=[tool]) - - invocation_context = await testing_utils.create_invocation_context( - agent=agent, user_content='' - ) - - function_call = types.FunctionCall(name=tool.name, args={}, id='fc_test') - event = Event( - invocation_id=invocation_context.invocation_id, - author=agent.name, - content=types.Content(parts=[types.Part(function_call=function_call)]), - ) - - await handle_function_calls(invocation_context, event, {tool.name: tool}) - - assert len(recorded_calls) == 1 - assert recorded_calls[0]['error_type'] == expected_error_type - assert recorded_calls[0]['error'] is None - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - 'handle_function_calls', - [ - (handle_function_calls_async), - (handle_function_calls_live), - ], -) -async def test_exception_takes_precedence_over_dict_error( - monkeypatch, handle_function_calls -): - """End-to-end integration: exception takes strict precedence over manual dict error_type.""" - recorded_calls = [] - monkeypatch.setattr( - 'google.adk.telemetry._instrumentation.tracing.trace_tool_call', - lambda **kw: recorded_calls.append(kw), - ) - - def mock_crashing_func(): - raise ValueError('Fatal arithmetic error') - - tool = FunctionTool(func=mock_crashing_func) - model = testing_utils.MockModel.create(responses=[]) - agent = Agent(name='test_agent', model=model, tools=[tool]) - invocation_context = await testing_utils.create_invocation_context( - agent=agent, user_content='' - ) - - function_call = types.FunctionCall( - name=tool.name, args={}, id='fc_test_exception' - ) - event = Event( - invocation_id=invocation_context.invocation_id, - author=agent.name, - content=types.Content(parts=[types.Part(function_call=function_call)]), - ) - - with pytest.raises(ValueError, match='Fatal arithmetic error'): - await handle_function_calls(invocation_context, event, {tool.name: tool}) - - assert len(recorded_calls) == 1 - assert isinstance(recorded_calls[0]['error'], ValueError) - assert recorded_calls[0]['error_type'] is None - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - 'handle_function_calls', - [ - (handle_function_calls_async), - (handle_function_calls_live), - ], -) -async def test_detection_skipped_when_confirmation_requested( - monkeypatch, handle_function_calls -): - """E2E confirmation verification: control prompt avoids polluting telemetry with TOOL_ERROR.""" - recorded_calls = [] - monkeypatch.setattr( - 'google.adk.telemetry._instrumentation.tracing.trace_tool_call', - lambda **kw: recorded_calls.append(kw), - ) - - tool = _MockControlSignalTool(name='confirm_tool', behavior='confirm') - model = testing_utils.MockModel.create(responses=[]) - agent = Agent(name='test_agent', model=model, tools=[tool]) - invocation_context = await testing_utils.create_invocation_context( - agent=agent, user_content='' - ) - - function_call = types.FunctionCall( - name=tool.name, args={}, id='fc_test_confirm' - ) - event = Event( - invocation_id=invocation_context.invocation_id, - author=agent.name, - content=types.Content(parts=[types.Part(function_call=function_call)]), - ) - - await handle_function_calls(invocation_context, event, {tool.name: tool}) - - assert len(recorded_calls) == 1 - assert recorded_calls[0]['error_type'] is None - assert recorded_calls[0]['error'] is None - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - 'handle_function_calls', - [ - (handle_function_calls_async), - (handle_function_calls_live), - ], -) -async def test_detection_skipped_when_auth_requested( - monkeypatch, handle_function_calls -): - """E2E OAuth verification: authenticate control prompt avoids polluting telemetry with TOOL_ERROR.""" - recorded_calls = [] - monkeypatch.setattr( - 'google.adk.telemetry._instrumentation.tracing.trace_tool_call', - lambda **kw: recorded_calls.append(kw), - ) - - tool = _MockControlSignalTool(name='auth_tool', behavior='auth') - model = testing_utils.MockModel.create(responses=[]) - agent = Agent(name='test_agent', model=model, tools=[tool]) - invocation_context = await testing_utils.create_invocation_context( - agent=agent, user_content='' - ) - - function_call = types.FunctionCall(name=tool.name, args={}, id='fc_test_auth') - event = Event( - invocation_id=invocation_context.invocation_id, - author=agent.name, - content=types.Content(parts=[types.Part(function_call=function_call)]), - ) - - await handle_function_calls(invocation_context, event, {tool.name: tool}) - - assert len(recorded_calls) == 1 - assert recorded_calls[0]['error_type'] is None - assert recorded_calls[0]['error'] is None - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - 'handle_function_calls', - [ - (handle_function_calls_async), - (handle_function_calls_live), - ], -) -async def test_detection_exception_does_not_break_tool_call( - monkeypatch, handle_function_calls -): - """Safety Verification: telemetry errors during error parsing are caught cleanly, not crashing tool calls.""" - recorded_calls = [] - monkeypatch.setattr( - 'google.adk.telemetry._instrumentation.tracing.trace_tool_call', - lambda **kw: recorded_calls.append(kw), - ) - - tool = _ErrorDetectingTool( - name='buggy_telemetry_tool', description='raises on tel' - ) - model = testing_utils.MockModel.create(responses=[]) - agent = Agent(name='test_agent', model=model, tools=[tool]) - invocation_context = await testing_utils.create_invocation_context( - agent=agent, user_content='' - ) - - function_call = types.FunctionCall( - name=tool.name, args={}, id='fc_test_buggy' - ) - event = Event( - invocation_id=invocation_context.invocation_id, - author=agent.name, - content=types.Content(parts=[types.Part(function_call=function_call)]), - ) - - result_event = await handle_function_calls( - invocation_context, event, {tool.name: tool} - ) - - assert result_event is not None - assert result_event.content.parts[0].function_response.response == { - 'result': 'result' - } - - assert len(recorded_calls) == 1 - assert recorded_calls[0]['error_type'] is None - assert recorded_calls[0]['error'] is None diff --git a/tests/unittests/flows/llm_flows/test_identity.py b/tests/unittests/flows/llm_flows/test_identity.py index 88826fb684..c955ed362a 100644 --- a/tests/unittests/flows/llm_flows/test_identity.py +++ b/tests/unittests/flows/llm_flows/test_identity.py @@ -69,26 +69,3 @@ async def test_with_description(): == """\ You are an agent. Your internal name is "agent". The description about you is "test description".""" ) - - -@pytest.mark.asyncio -async def test_single_turn_agent(): - request = LlmRequest( - model="gemini-1.5-flash", - config=types.GenerateContentConfig(system_instruction=""), - ) - agent = Agent( - name="agent", - mode="single_turn", - ) - invocation_context = await testing_utils.create_invocation_context( - agent=agent - ) - - async for _ in identity.request_processor.run_async( - invocation_context, - request, - ): - pass - - assert request.config.system_instruction == "" diff --git a/tests/unittests/flows/llm_flows/test_request_confirmation.py b/tests/unittests/flows/llm_flows/test_request_confirmation.py index a4c9297f42..39b35454b7 100644 --- a/tests/unittests/flows/llm_flows/test_request_confirmation.py +++ b/tests/unittests/flows/llm_flows/test_request_confirmation.py @@ -300,110 +300,3 @@ async def test_request_confirmation_processor_tool_not_confirmed(): assert ( args[4][MOCK_FUNCTION_CALL_ID] == user_confirmation ) # tool_confirmation_dict - - -@pytest.mark.asyncio -async def test_request_confirmation_processor_finds_user_confirmation_in_default_branch(): - """Processor finds user confirmation in default branch when agent is in child branch. - - Setup: - - Agent in 'child_branch'. - - RequestConfirmation event in 'child_branch'. - - User response event in default branch (None). - Act: Run request_processor. - Assert: Processor finds the response and triggers tool execution. - """ - # Arrange - agent = LlmAgent(name="test_agent", tools=[mock_tool]) - invocation_context = await testing_utils.create_invocation_context( - agent=agent - ) - # Set branch for the agent context - invocation_context.branch = "child_branch" - llm_request = LlmRequest() - - original_function_call = types.FunctionCall( - name=MOCK_TOOL_NAME, args={"param1": "test"}, id=MOCK_FUNCTION_CALL_ID - ) - - tool_confirmation = ToolConfirmation(confirmed=False, hint="test hint") - tool_confirmation_args = { - "originalFunctionCall": original_function_call.model_dump( - exclude_none=True, by_alias=True - ), - "toolConfirmation": tool_confirmation.model_dump( - by_alias=True, exclude_none=True - ), - } - - # Event with the request for confirmation (in child branch) - invocation_context.session.events.append( - Event( - author="agent", - branch="child_branch", - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name=functions.REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, - args=tool_confirmation_args, - id=MOCK_CONFIRMATION_FUNCTION_CALL_ID, - ) - ) - ] - ), - ) - ) - - # Event with the user's confirmation (in default branch, branch=None) - user_confirmation = ToolConfirmation(confirmed=True) - invocation_context.session.events.append( - Event( - author="user", - branch=None, - content=types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name=functions.REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, - id=MOCK_CONFIRMATION_FUNCTION_CALL_ID, - response={ - "response": user_confirmation.model_dump_json() - }, - ) - ) - ] - ), - ) - ) - - expected_event = Event( - author="agent", - branch="child_branch", - content=types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name=MOCK_TOOL_NAME, - id=MOCK_FUNCTION_CALL_ID, - response={"result": "Mock tool result with test"}, - ) - ) - ] - ), - ) - - # Act & Assert - with patch( - "google.adk.flows.llm_flows.functions.handle_function_call_list_async" - ) as mock_handle_function_call_list_async: - mock_handle_function_call_list_async.return_value = expected_event - - events = [] - async for event in request_processor.run_async( - invocation_context, llm_request - ): - events.append(event) - - assert len(events) == 1 - assert events[0] == expected_event diff --git a/tests/unittests/integrations/api_registry/__init__.py b/tests/unittests/integrations/api_registry/__init__.py index 58d482ea38..4d9a92490b 100644 --- a/tests/unittests/integrations/api_registry/__init__.py +++ b/tests/unittests/integrations/api_registry/__init__.py @@ -1,5 +1,3 @@ -# Copyright 2026 Google LLC -# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at diff --git a/tests/unittests/integrations/crewai/test_crewai_tool.py b/tests/unittests/integrations/crewai/test_crewai_tool.py index 030b590e43..f7f9bfe0bd 100644 --- a/tests/unittests/integrations/crewai/test_crewai_tool.py +++ b/tests/unittests/integrations/crewai/test_crewai_tool.py @@ -32,7 +32,6 @@ def mock_tool_context() -> ToolContext: """Fixture that provides a mock ToolContext for testing.""" mock_invocation_context = MagicMock(spec=InvocationContext) - mock_invocation_context._state_schema = None mock_invocation_context.session = MagicMock(spec=Session) mock_invocation_context.session.state = MagicMock() return ToolContext(invocation_context=mock_invocation_context) diff --git a/tests/unittests/integrations/firestore/test_firestore_session_service.py b/tests/unittests/integrations/firestore/test_firestore_session_service.py index 4d202e1500..1445bfe0ef 100644 --- a/tests/unittests/integrations/firestore/test_firestore_session_service.py +++ b/tests/unittests/integrations/firestore/test_firestore_session_service.py @@ -386,15 +386,6 @@ async def test_append_event_with_temp_state(mock_firestore_client): assert "temp:k1" not in event_data["actions"]["state_delta"] assert event_data["actions"]["state_delta"]["session_key"] == "session_val" - # 3. Verify temp keys are NOT written to session state in Firestore - transaction.update.assert_called_once() - update_args, _ = transaction.update.call_args - persisted_state = update_args[1]["state"] - assert ( - "temp:k1" not in persisted_state - ), "temp: keys must not be persisted to Firestore session state" - assert "session_key" in persisted_state - @pytest.mark.asyncio async def test_list_sessions_with_user_id(mock_firestore_client): diff --git a/tests/unittests/integrations/parameter_manager/test_parameter_client.py b/tests/unittests/integrations/parameter_manager/test_parameter_client.py index 1273ada66d..1fe07bfd24 100644 --- a/tests/unittests/integrations/parameter_manager/test_parameter_client.py +++ b/tests/unittests/integrations/parameter_manager/test_parameter_client.py @@ -18,13 +18,10 @@ from unittest.mock import MagicMock from unittest.mock import patch -from google.api_core.gapic_v1 import client_info -import pytest - -pytest.importorskip("google.cloud.parametermanager_v1") - from google.adk.integrations.parameter_manager.parameter_client import ParameterManagerClient from google.adk.integrations.parameter_manager.parameter_client import USER_AGENT +from google.api_core.gapic_v1 import client_info +import pytest class TestParameterManagerClient: diff --git a/tests/unittests/integrations/secret_manager/test_secret_client.py b/tests/unittests/integrations/secret_manager/test_secret_client.py index e463bd95bc..bdc75e0546 100644 --- a/tests/unittests/integrations/secret_manager/test_secret_client.py +++ b/tests/unittests/integrations/secret_manager/test_secret_client.py @@ -20,11 +20,8 @@ from google.adk.integrations.secret_manager.secret_client import SecretManagerClient from google.adk.integrations.secret_manager.secret_client import USER_AGENT -from google.api_core.gapic_v1 import client_info import pytest -import google - class TestSecretManagerClient: """Tests for the SecretManagerClient class.""" diff --git a/tests/unittests/integrations/slack/test_slack_runner.py b/tests/unittests/integrations/slack/test_slack_runner.py index bd2daa7d85..8dc9367fbe 100644 --- a/tests/unittests/integrations/slack/test_slack_runner.py +++ b/tests/unittests/integrations/slack/test_slack_runner.py @@ -17,10 +17,6 @@ from unittest.mock import MagicMock from unittest.mock import patch -import pytest - -pytest.importorskip("slack_bolt") - from google.adk.integrations.slack import SlackRunner from google.adk.runners import Runner from google.genai import types diff --git a/tests/unittests/labs/__init__.py b/tests/unittests/labs/__init__.py deleted file mode 100644 index 58d482ea38..0000000000 --- a/tests/unittests/labs/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/tests/unittests/labs/openai/__init__.py b/tests/unittests/labs/openai/__init__.py deleted file mode 100644 index 58d482ea38..0000000000 --- a/tests/unittests/labs/openai/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/tests/unittests/labs/openai/test_openai_llm.py b/tests/unittests/labs/openai/test_openai_llm.py deleted file mode 100644 index 59c1033f01..0000000000 --- a/tests/unittests/labs/openai/test_openai_llm.py +++ /dev/null @@ -1,351 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import json -import os -from unittest import mock - -from google.adk.labs.openai._openai_llm import _function_declaration_to_openai_tool -from google.adk.labs.openai._openai_llm import _part_to_openai_content -from google.adk.labs.openai._openai_llm import _update_type_string -from google.adk.labs.openai._openai_llm import OpenAILlm -from google.adk.models.llm_request import LlmRequest -from google.adk.models.llm_response import LlmResponse -from google.genai import types -from google.genai.types import Content -from google.genai.types import Part -import pytest - - -def test_supported_models(): - models = OpenAILlm.supported_models() - assert len(models) == 3 - assert models[0] == r"gpt-.*" - assert models[1] == r"o1-.*" - assert models[2] == r"o3-.*" - - -def test_update_type_string(): - schema = { - "type": "OBJECT", - "properties": { - "name": {"type": "STRING"}, - "age": {"type": "INTEGER"}, - "tags": {"type": "ARRAY", "items": {"type": "STRING"}}, - }, - } - _update_type_string(schema) - assert schema["type"] == "object" - assert schema["properties"]["name"]["type"] == "string" - assert schema["properties"]["age"]["type"] == "integer" - assert schema["properties"]["tags"]["type"] == "array" - assert schema["properties"]["tags"]["items"]["type"] == "string" - - -def test_function_declaration_to_openai_tool(): - fd = types.FunctionDeclaration( - name="get_weather", - description="Get weather", - parameters=types.Schema( - type=types.Type.OBJECT, - properties={"location": types.Schema(type=types.Type.STRING)}, - required=["location"], - ), - ) - tool = _function_declaration_to_openai_tool(fd) - assert tool["type"] == "function" - assert tool["function"]["name"] == "get_weather" - assert tool["function"]["parameters"]["type"] == "object" - assert ( - tool["function"]["parameters"]["properties"]["location"]["type"] - == "string" - ) - assert tool["function"]["parameters"]["required"] == ["location"] - - -def test_part_to_openai_content(): - # Test text part - part = types.Part.from_text(text="Hello") - content = _part_to_openai_content(part) - assert content == "Hello" - - # Test thought part - part = types.Part.from_text(text="I am thinking") - part.thought = True - content = _part_to_openai_content(part) - assert content == "Thought: I am thinking" - - # Test image part (inline data) - part = types.Part( - inline_data=types.Blob(data=b"fake_data", mime_type="image/png") - ) - content = _part_to_openai_content(part) - assert isinstance(content, dict) - assert content["type"] == "image_url" - assert content["image_url"]["url"].startswith("data:image/png;base64,") - - -def test_content_to_openai_messages_with_empty_response(): - from google.adk.labs.openai._openai_llm import _content_to_openai_messages - - # Test with empty dict response - content = types.Content( - role="tool", - parts=[ - types.Part( - function_response=types.FunctionResponse( - id="call_123", - name="get_weather", - response={}, - ) - ) - ], - ) - messages = _content_to_openai_messages(content) - assert len(messages) == 1 - assert messages[0]["role"] == "tool" - assert messages[0]["tool_call_id"] == "call_123" - assert messages[0]["content"] == "{}" - - # Test with None response - content = types.Content( - role="tool", - parts=[ - types.Part( - function_response=types.FunctionResponse( - id="call_123", - name="get_weather", - response=None, - ) - ) - ], - ) - messages = _content_to_openai_messages(content) - assert len(messages) == 1 - assert messages[0]["content"] == "" - - -@pytest.mark.asyncio -async def test_generate_content_async(): - with mock.patch.dict(os.environ, {"OPENAI_API_KEY": "test_key"}): - openai_llm = OpenAILlm(model="gpt-4o") - llm_request = LlmRequest( - model="gpt-4o", - contents=[Content(role="user", parts=[Part.from_text(text="Hello")])], - ) - - mock_response = mock.MagicMock() - mock_choice = mock.MagicMock() - mock_message = mock.MagicMock() - mock_message.content = "Hello there!" - mock_message.tool_calls = None - mock_choice.message = mock_message - mock_response.choices = [mock_choice] - mock_response.usage.prompt_tokens = 10 - mock_response.usage.completion_tokens = 5 - mock_response.usage.total_tokens = 15 - - async def mock_create(*args, **kwargs): - return mock_response - - with mock.patch( - "google.adk.labs.openai._openai_llm.AsyncOpenAI" - ) as mock_client_class: - mock_client = mock.MagicMock() - mock_client_class.return_value = mock_client - mock_client.chat.completions.create = mock_create - - responses = [ - resp - async for resp in openai_llm.generate_content_async( - llm_request, stream=False - ) - ] - - assert len(responses) == 1 - assert isinstance(responses[0], LlmResponse) - assert responses[0].content.parts[0].text == "Hello there!" - assert responses[0].usage_metadata.total_token_count == 15 - - -@pytest.mark.asyncio -async def test_generate_content_async_with_config(): - with mock.patch.dict(os.environ, {"OPENAI_API_KEY": "test_key"}): - openai_llm = OpenAILlm(model="gpt-4o") - llm_request = LlmRequest( - model="gpt-4o", - contents=[Content(role="user", parts=[Part.from_text(text="Hello")])], - config=types.GenerateContentConfig( - temperature=0.7, - top_p=0.9, - stop_sequences=["STOP"], - max_output_tokens=100, - ), - ) - - mock_response = mock.MagicMock() - mock_choice = mock.MagicMock() - mock_message = mock.MagicMock() - mock_message.content = "Hello there!" - mock_message.tool_calls = None - mock_choice.message = mock_message - mock_response.choices = [mock_choice] - mock_call = mock.MagicMock(return_value=mock_response) - mock_response.usage.prompt_tokens = 10 - mock_response.usage.completion_tokens = 5 - mock_response.usage.total_tokens = 15 - - create_kwargs = {} - - async def mock_create(*args, **kwargs): - nonlocal create_kwargs - create_kwargs = kwargs - return mock_response - - with mock.patch( - "google.adk.labs.openai._openai_llm.AsyncOpenAI" - ) as mock_client_class: - mock_client = mock.MagicMock() - mock_client_class.return_value = mock_client - mock_client.chat.completions.create = mock_create - - responses = [ - resp - async for resp in openai_llm.generate_content_async( - llm_request, stream=False - ) - ] - - assert len(responses) == 1 - assert create_kwargs["temperature"] == 0.7 - assert create_kwargs["top_p"] == 0.9 - assert create_kwargs["stop"] == ["STOP"] - assert create_kwargs["max_tokens"] == 100 - - -@pytest.mark.asyncio -async def test_generate_content_async_with_system_instruction(): - with mock.patch.dict(os.environ, {"OPENAI_API_KEY": "test_key"}): - openai_llm = OpenAILlm(model="gpt-4o") - llm_request = LlmRequest( - model="gpt-4o", - contents=[Content(role="user", parts=[Part.from_text(text="Hello")])], - config=types.GenerateContentConfig( - system_instruction="You are a helpful assistant.", - ), - ) - - mock_response = mock.MagicMock() - mock_choice = mock.MagicMock() - mock_message = mock.MagicMock() - mock_message.content = "Hello there!" - mock_message.tool_calls = None - mock_choice.message = mock_message - mock_response.choices = [mock_choice] - mock_response.usage.prompt_tokens = 10 - mock_response.usage.completion_tokens = 5 - mock_response.usage.total_tokens = 15 - - create_kwargs = {} - - async def mock_create(*args, **kwargs): - nonlocal create_kwargs - create_kwargs = kwargs - return mock_response - - with mock.patch( - "google.adk.labs.openai._openai_llm.AsyncOpenAI" - ) as mock_client_class: - mock_client = mock.MagicMock() - mock_client_class.return_value = mock_client - mock_client.chat.completions.create = mock_create - - responses = [ - resp - async for resp in openai_llm.generate_content_async( - llm_request, stream=False - ) - ] - - assert len(responses) == 1 - messages = create_kwargs["messages"] - assert len(messages) == 2 - assert messages[0]["role"] == "system" - assert messages[0]["content"] == "You are a helpful assistant." - assert messages[1]["role"] == "user" - assert messages[1]["content"] == "Hello" - - -@pytest.mark.asyncio -async def test_generate_content_async_with_image(): - with mock.patch.dict(os.environ, {"OPENAI_API_KEY": "test_key"}): - openai_llm = OpenAILlm(model="gpt-4o") - - image_part = Part( - inline_data=types.Blob(data=b"fake_image_data", mime_type="image/png") - ) - - llm_request = LlmRequest( - model="gpt-4o", - contents=[ - Content( - role="user", - parts=[Part.from_text(text="Analyze this"), image_part], - ) - ], - ) - - mock_response = mock.MagicMock() - mock_choice = mock.MagicMock() - mock_message = mock.MagicMock() - mock_message.content = "It's an image." - mock_message.tool_calls = None - mock_choice.message = mock_message - mock_response.choices = [mock_choice] - mock_response.usage.prompt_tokens = 10 - mock_response.usage.completion_tokens = 5 - mock_response.usage.total_tokens = 15 - - create_kwargs = {} - - async def mock_create(*args, **kwargs): - nonlocal create_kwargs - create_kwargs = kwargs - return mock_response - - with mock.patch( - "google.adk.labs.openai._openai_llm.AsyncOpenAI" - ) as mock_client_class: - mock_client = mock.MagicMock() - mock_client_class.return_value = mock_client - mock_client.chat.completions.create = mock_create - - responses = [ - resp - async for resp in openai_llm.generate_content_async( - llm_request, stream=False - ) - ] - - assert len(responses) == 1 - messages = create_kwargs["messages"] - assert len(messages) == 1 - assert messages[0]["role"] == "user" - content = messages[0]["content"] - assert isinstance(content, list) - assert len(content) == 2 - assert content[0]["type"] == "text" - assert content[0]["text"] == "Analyze this" - assert content[1]["type"] == "image_url" - assert content[1]["image_url"]["url"].startswith("data:image/png;base64,") diff --git a/tests/unittests/models/test_gemini_llm_connection.py b/tests/unittests/models/test_gemini_llm_connection.py index 065cca9d0b..133a455738 100644 --- a/tests/unittests/models/test_gemini_llm_connection.py +++ b/tests/unittests/models/test_gemini_llm_connection.py @@ -285,17 +285,11 @@ async def mock_receive_generator(): @pytest.mark.asyncio -@pytest.mark.parametrize( - 'conn_fixture', - ['gemini_api_connection', 'gemini_connection'], -) async def test_receive_transcript_finished_on_interrupt( - conn_fixture, + gemini_api_connection, mock_gemini_session, - request, ): """Test receive finishes transcription on interrupt signal.""" - connection = request.getfixturevalue(conn_fixture) message1 = mock.Mock() message1.usage_metadata = None @@ -351,7 +345,7 @@ async def mock_receive_generator(): receive_mock = mock.Mock(return_value=mock_receive_generator()) mock_gemini_session.receive = receive_mock - responses = [resp async for resp in connection.receive()] + responses = [resp async for resp in gemini_api_connection.receive()] assert len(responses) == 5 assert responses[4].interrupted is True @@ -371,17 +365,11 @@ async def mock_receive_generator(): @pytest.mark.asyncio -@pytest.mark.parametrize( - 'conn_fixture', - ['gemini_api_connection', 'gemini_connection'], -) async def test_receive_transcript_finished_on_generation_complete( - conn_fixture, + gemini_api_connection, mock_gemini_session, - request, ): """Test receive finishes transcription on generation_complete signal.""" - connection = request.getfixturevalue(conn_fixture) message1 = mock.Mock() message1.usage_metadata = None @@ -437,7 +425,7 @@ async def mock_receive_generator(): receive_mock = mock.Mock(return_value=mock_receive_generator()) mock_gemini_session.receive = receive_mock - responses = [resp async for resp in connection.receive()] + responses = [resp async for resp in gemini_api_connection.receive()] assert len(responses) == 4 @@ -456,17 +444,11 @@ async def mock_receive_generator(): @pytest.mark.asyncio -@pytest.mark.parametrize( - 'conn_fixture', - ['gemini_api_connection', 'gemini_connection'], -) async def test_receive_transcript_finished_on_turn_complete( - conn_fixture, + gemini_api_connection, mock_gemini_session, - request, ): """Test receive finishes transcription on interrupt or complete signals.""" - connection = request.getfixturevalue(conn_fixture) message1 = mock.Mock() message1.usage_metadata = None @@ -522,7 +504,7 @@ async def mock_receive_generator(): receive_mock = mock.Mock(return_value=mock_receive_generator()) mock_gemini_session.receive = receive_mock - responses = [resp async for resp in connection.receive()] + responses = [resp async for resp in gemini_api_connection.receive()] assert len(responses) == 5 assert responses[4].turn_complete is True @@ -865,59 +847,6 @@ async def test_send_history_filters_various_audio_mime_types( mock_gemini_session.send.assert_not_called() -@pytest.mark.asyncio -async def test_send_history_gemini_31_turn_complete(mock_gemini_session): - """Verify Gemini 3.1 Live history seeding explicitly appends turn_complete=True.""" - conn = GeminiLlmConnection( - mock_gemini_session, - api_backend=GoogleLLMVariant.GEMINI_API, - model_version='gemini-3.1-flash-live-preview', - ) - mock_gemini_session.send_client_content = mock.AsyncMock() - - mock_contents = [ - types.Content(role='user', parts=[types.Part.from_text(text='hi')]), - types.Content(role='model', parts=[types.Part.from_text(text='hello')]), - ] - await conn.send_history(mock_contents) - - mock_gemini_session.send_client_content.assert_called_once_with( - turns=mock_contents, - turn_complete=True, - ) - - -@pytest.mark.asyncio -async def test_send_history_collapse_vertex_ai(mock_gemini_session): - """Verify history prompt collapse when seeding Gemini 3.1 Live on Vertex AI backend.""" - conn = GeminiLlmConnection( - mock_gemini_session, - api_backend=GoogleLLMVariant.VERTEX_AI, - model_version='gemini-3.1-flash-live-preview', - ) - mock_gemini_session.send_client_content = mock.AsyncMock() - - mock_contents = [ - types.Content(role='user', parts=[types.Part.from_text(text='hi')]), - types.Content(role='model', parts=[types.Part.from_text(text='hello')]), - ] - await conn.send_history(mock_contents) - - assert mock_gemini_session.send_client_content.call_count == 1 - called_turns = mock_gemini_session.send_client_content.call_args.kwargs[ - 'turns' - ] - assert len(called_turns) == 1 - assert called_turns[0].role == 'user' - assert 'Previous conversation history:' in called_turns[0].parts[0].text - assert '[user]: hi' in called_turns[0].parts[0].text - assert '[model]: hello' in called_turns[0].parts[0].text - assert ( - mock_gemini_session.send_client_content.call_args.kwargs['turn_complete'] - is True - ) - - @pytest.mark.asyncio async def test_receive_grounding_metadata_standalone( gemini_connection, mock_gemini_session @@ -938,7 +867,6 @@ async def test_receive_grounding_metadata_standalone( mock_server_content.interrupted = False mock_server_content.input_transcription = None mock_server_content.output_transcription = None - mock_server_content.generation_complete = False mock_message = mock.create_autospec(types.LiveServerMessage, instance=True) mock_message.usage_metadata = None @@ -983,7 +911,6 @@ async def test_receive_grounding_metadata_with_content( mock_server_content.interrupted = False mock_server_content.input_transcription = None mock_server_content.output_transcription = None - mock_server_content.generation_complete = False mock_message = mock.create_autospec(types.LiveServerMessage, instance=True) mock_message.usage_metadata = None @@ -1054,7 +981,6 @@ async def test_receive_tool_call_and_grounding_metadata_with_native_audio( mock_server_content.interrupted = False mock_server_content.input_transcription = None mock_server_content.output_transcription = None - mock_server_content.generation_complete = False mock_metadata_msg = mock.create_autospec( types.LiveServerMessage, instance=True @@ -1075,7 +1001,6 @@ async def test_receive_tool_call_and_grounding_metadata_with_native_audio( mock_turn_complete_content.interrupted = False mock_turn_complete_content.input_transcription = None mock_turn_complete_content.output_transcription = None - mock_turn_complete_content.generation_complete = False mock_turn_complete_msg = mock.create_autospec( types.LiveServerMessage, instance=True @@ -1277,87 +1202,6 @@ async def mock_receive_generator(): assert responses[0].go_away == mock_go_away -@pytest.mark.asyncio -async def test_receive_aggregates_thoughts_separately( - gemini_connection, mock_gemini_session -): - """Test receive aggregates thoughts and regular text separately.""" - - part1 = types.Part.from_text(text='thought 1') - part1.thought = True - message1 = types.LiveServerMessage( - server_content=types.LiveServerContent( - model_turn=types.Content(role='model', parts=[part1]), - ) - ) - - part2 = types.Part.from_text(text=' thought 2') - part2.thought = True - message2 = types.LiveServerMessage( - server_content=types.LiveServerContent( - model_turn=types.Content(role='model', parts=[part2]), - ) - ) - - part3 = types.Part.from_text(text='answer') - part3.thought = False - message3 = types.LiveServerMessage( - server_content=types.LiveServerContent( - model_turn=types.Content(role='model', parts=[part3]), - ) - ) - - message4 = types.LiveServerMessage( - server_content=types.LiveServerContent( - turn_complete=True, - ) - ) - - async def mock_receive_generator(): - yield message1 - yield message2 - yield message3 - yield message4 - - receive_mock = mock.Mock(return_value=mock_receive_generator()) - mock_gemini_session.receive = receive_mock - - responses = [resp async for resp in gemini_connection.receive()] - - # Expected responses: - # 1. Message 1 (partial thought) - # 2. Message 2 (partial thought) - # 3. Aggregated thought (full) - # 4. Message 3 (partial answer) - # 5. Aggregated answer (full) - # 6. Turn complete message - - assert len(responses) == 6 - - # Check partials - assert responses[0].content.parts[0].text == 'thought 1' - assert responses[0].partial is True - assert responses[1].content.parts[0].text == ' thought 2' - assert responses[1].partial is True - - # Check aggregated thought - assert responses[2].content.parts[0].text == 'thought 1 thought 2' - assert responses[2].content.parts[0].thought is True - assert responses[2].partial is False - - # Check partial answer - assert responses[3].content.parts[0].text == 'answer' - assert responses[3].partial is True - - # Check aggregated answer - assert responses[4].content.parts[0].text == 'answer' - assert not getattr(responses[4].content.parts[0], 'thought', False) - assert responses[4].partial is False - - # Check turn complete - assert responses[5].turn_complete is True - - @pytest.mark.asyncio async def test_receive_video_content(gemini_connection, mock_gemini_session): """Test receive with video content.""" @@ -1396,327 +1240,3 @@ async def mock_receive_generator(): content_response = next((r for r in responses if r.content), None) assert content_response is not None assert content_response.content == mock_content - - -@pytest.mark.asyncio -async def test_receive_grounding_metadata_pending( - gemini_connection, mock_gemini_session -): - """Test that grounding metadata in partial chunks is pending and yielded on full text.""" - grounding_metadata = types.GroundingMetadata( - web_search_queries=['stock price of google'], - ) - - def make_msg(text=None, g_meta=None, tc=False): - msg = mock.Mock( - usage_metadata=None, - tool_call=None, - session_resumption_update=None, - go_away=None, - ) - msg.server_content = mock.Mock( - interrupted=False, - input_transcription=None, - output_transcription=None, - generation_complete=False, - turn_complete=tc, - grounding_metadata=g_meta, - model_turn=types.Content( - role='model', parts=[types.Part.from_text(text=text)] - ) - if text - else None, - ) - return msg - - msg1 = make_msg(text='hello', g_meta=grounding_metadata) - msg2 = make_msg(text=' world') - msg3 = make_msg(tc=True) - - async def gen(): - yield msg1 - yield msg2 - yield msg3 - - mock_gemini_session.receive = mock.Mock(return_value=gen()) - - responses = [resp async for resp in gemini_connection.receive()] - - # Expected responses: - # 1. Msg 1 partial (hello) with grounding_metadata - # 2. Msg 2 partial ( world) without grounding_metadata - # 3. Full text response (hello world) with PENDING grounding_metadata - # 4. Turn complete response without grounding_metadata (already cleared) - assert len(responses) == 4 - - assert responses[0].content.parts[0].text == 'hello' - assert responses[0].partial is True - assert responses[0].grounding_metadata == grounding_metadata - - assert responses[1].content.parts[0].text == ' world' - assert responses[1].partial is True - assert responses[1].grounding_metadata is None - - assert responses[2].content.parts[0].text == 'hello world' - assert responses[2].partial is False - assert responses[2].grounding_metadata == grounding_metadata - - assert responses[3].turn_complete is True - assert responses[3].grounding_metadata is None - - -@pytest.mark.asyncio -async def test_receive_populates_turn_complete_reason( - gemini_connection, mock_gemini_session -): - """Test that receive populates turn_complete_reason in LlmResponse.""" - mock_server_content = mock.create_autospec( - types.LiveServerContent, instance=True - ) - mock_server_content.model_turn = None - mock_server_content.grounding_metadata = None - mock_server_content.turn_complete = True - mock_server_content.interrupted = False - mock_server_content.input_transcription = None - mock_server_content.output_transcription = None - mock_server_content.generation_complete = False - mock_server_content.turn_complete_reason = ( - types.TurnCompleteReason.RESPONSE_REJECTED - ) - - mock_message = mock.create_autospec(types.LiveServerMessage, instance=True) - mock_message.usage_metadata = None - mock_message.server_content = mock_server_content - mock_message.tool_call = None - mock_message.session_resumption_update = None - mock_message.go_away = None - - async def mock_receive_generator(): - yield mock_message - - mock_gemini_session.receive = mock.Mock(return_value=mock_receive_generator()) - - responses = [resp async for resp in gemini_connection.receive()] - - assert len(responses) == 1 - assert responses[0].turn_complete is True - assert ( - responses[0].turn_complete_reason - == types.TurnCompleteReason.RESPONSE_REJECTED - ) - - -@pytest.mark.asyncio -async def test_receive_populates_turn_complete_reason_standalone_grounding( - gemini_connection, mock_gemini_session -): - """Test that receive populates turn_complete_reason in LlmResponse for standalone grounding metadata.""" - mock_server_content = mock.create_autospec( - types.LiveServerContent, instance=True - ) - mock_server_content.model_turn = None - mock_server_content.grounding_metadata = mock.create_autospec( - types.GroundingMetadata, instance=True - ) - mock_server_content.turn_complete = False - mock_server_content.interrupted = False - mock_server_content.input_transcription = None - mock_server_content.output_transcription = None - mock_server_content.generation_complete = False - mock_server_content.turn_complete_reason = ( - types.TurnCompleteReason.RESPONSE_REJECTED - ) - - mock_message = mock.create_autospec(types.LiveServerMessage, instance=True) - mock_message.usage_metadata = None - mock_message.server_content = mock_server_content - mock_message.tool_call = None - mock_message.session_resumption_update = None - mock_message.go_away = None - - async def mock_receive_generator(): - yield mock_message - - mock_gemini_session.receive = mock.Mock(return_value=mock_receive_generator()) - - responses = [resp async for resp in gemini_connection.receive()] - - assert len(responses) == 1 - assert responses[0].grounding_metadata is not None - assert responses[0].turn_complete is None - assert ( - responses[0].turn_complete_reason - == types.TurnCompleteReason.RESPONSE_REJECTED - ) - - -@pytest.mark.asyncio -async def test_receive_populates_turn_complete_reason_with_content( - gemini_connection, mock_gemini_session -): - """Test that receive populates turn_complete_reason in LlmResponse when model turn has content parts.""" - mock_content = types.Content( - role='model', - parts=[types.Part.from_text(text='hello')], - ) - mock_server_content = mock.create_autospec( - types.LiveServerContent, instance=True - ) - mock_server_content.model_turn = mock_content - mock_server_content.grounding_metadata = None - mock_server_content.turn_complete = False - mock_server_content.interrupted = False - mock_server_content.input_transcription = None - mock_server_content.output_transcription = None - mock_server_content.generation_complete = False - mock_server_content.turn_complete_reason = ( - types.TurnCompleteReason.RESPONSE_REJECTED - ) - - mock_message = mock.create_autospec(types.LiveServerMessage, instance=True) - mock_message.usage_metadata = None - mock_message.server_content = mock_server_content - mock_message.tool_call = None - mock_message.session_resumption_update = None - mock_message.go_away = None - - async def mock_receive_generator(): - yield mock_message - - mock_gemini_session.receive = mock.Mock(return_value=mock_receive_generator()) - - responses = [resp async for resp in gemini_connection.receive()] - - assert len(responses) == 1 - assert responses[0].content == mock_content - assert ( - responses[0].turn_complete_reason - == types.TurnCompleteReason.RESPONSE_REJECTED - ) - - -@pytest.mark.asyncio -async def test_receive_grounding_metadata_default_gemini_3_1( - mock_gemini_session, -): - """Verify grounding_metadata defaults to empty GroundingMetadata for Gemini 3.1.""" - conn = GeminiLlmConnection( - mock_gemini_session, - model_version='gemini-3.1-flash-live-preview', - ) - - def make_msg(text=None, tc=False, tool_call=None): - msg = mock.create_autospec(types.LiveServerMessage, instance=True) - msg.usage_metadata = None - msg.tool_call = tool_call - msg.session_resumption_update = None - msg.go_away = None - msg.server_content = mock.Mock() - msg.server_content.interrupted = False - msg.server_content.input_transcription = None - msg.server_content.output_transcription = None - msg.server_content.generation_complete = False - msg.server_content.turn_complete = tc - msg.server_content.grounding_metadata = None - msg.server_content.model_turn = ( - types.Content(role='model', parts=[types.Part.from_text(text=text)]) - if text - else None - ) - return msg - - # 1. Content event - msg1 = make_msg(text='hello') - # 2. Tool call event (yields immediately for Gemini 3.1) - function_call = types.FunctionCall(name='foo', args={}) - tool_call = mock.create_autospec(types.LiveServerToolCall, instance=True) - tool_call.function_calls = [function_call] - msg2 = make_msg(tool_call=tool_call) - # 3. Turn complete event - msg3 = make_msg(tc=True) - - async def mock_receive_generator(): - yield msg1 - yield msg2 - yield msg3 - - mock_gemini_session.receive = mock.Mock(return_value=mock_receive_generator()) - - responses = [resp async for resp in conn.receive()] - - # Expected: - # responses[0] -> partial content response for msg1 (has grounding_metadata) - # responses[1] -> full text response for msg1 (has grounding_metadata) - # responses[2] -> tool call response for msg2 (has grounding_metadata) - # responses[3] -> turn_complete response for msg3 (has grounding_metadata) - assert len(responses) == 4 - - assert responses[0].content.parts[0].text == 'hello' - assert isinstance(responses[0].grounding_metadata, types.GroundingMetadata) - assert responses[0].grounding_metadata.web_search_queries is None - assert responses[0].partial is True - - assert responses[1].content.parts[0].text == 'hello' - assert isinstance(responses[1].grounding_metadata, types.GroundingMetadata) - assert responses[1].partial is False - - assert responses[2].content.parts[0].function_call.name == 'foo' - assert isinstance(responses[2].grounding_metadata, types.GroundingMetadata) - - assert responses[3].turn_complete is True - assert isinstance(responses[3].grounding_metadata, types.GroundingMetadata) - - -@pytest.mark.asyncio -async def test_receive_grounding_metadata_default_non_gemini_3_1( - mock_gemini_session, -): - """Verify grounding_metadata stays None for non-Gemini 3.1 models.""" - conn = GeminiLlmConnection( - mock_gemini_session, - model_version='gemini-2.5-flash-live', - ) - - def make_msg(text=None, tc=False): - msg = mock.create_autospec(types.LiveServerMessage, instance=True) - msg.usage_metadata = None - msg.tool_call = None - msg.session_resumption_update = None - msg.go_away = None - msg.server_content = mock.Mock() - msg.server_content.interrupted = False - msg.server_content.input_transcription = None - msg.server_content.output_transcription = None - msg.server_content.generation_complete = False - msg.server_content.turn_complete = tc - msg.server_content.grounding_metadata = None - msg.server_content.model_turn = ( - types.Content(role='model', parts=[types.Part.from_text(text=text)]) - if text - else None - ) - return msg - - msg1 = make_msg(text='hello') - msg2 = make_msg(tc=True) - - async def mock_receive_generator(): - yield msg1 - yield msg2 - - mock_gemini_session.receive = mock.Mock(return_value=mock_receive_generator()) - - responses = [resp async for resp in conn.receive()] - - assert len(responses) == 3 - - assert responses[0].content.parts[0].text == 'hello' - assert responses[0].grounding_metadata is None - assert responses[0].partial is True - - assert responses[1].content.parts[0].text == 'hello' - assert responses[1].grounding_metadata is None - assert responses[1].partial is False - - assert responses[2].turn_complete is True - assert responses[2].grounding_metadata is None diff --git a/tests/unittests/models/test_interactions_utils.py b/tests/unittests/models/test_interactions_utils.py index 3d35ef383b..118a925ab6 100644 --- a/tests/unittests/models/test_interactions_utils.py +++ b/tests/unittests/models/test_interactions_utils.py @@ -20,26 +20,16 @@ from datetime import datetime from datetime import timezone import json +from types import SimpleNamespace from unittest.mock import MagicMock from google.adk.models import interactions_utils from google.adk.models.llm_request import LlmRequest -from google.genai import interactions from google.genai import types -from google.genai.interactions import CodeExecutionResultStep -from google.genai.interactions import FunctionCallStep -from google.genai.interactions import FunctionResultStep -from google.genai.interactions import ImageContent -from google.genai.interactions import Interaction -from google.genai.interactions import InteractionCompletedEvent -from google.genai.interactions import InteractionCreatedEvent -from google.genai.interactions import ModelOutputStep -from google.genai.interactions import StepDelta -from google.genai.interactions import StepStart -from google.genai.interactions import StepStop -from google.genai.interactions import TextContent -from google.genai.interactions import ThoughtStep -from google.genai.interactions import Usage +from google.genai._interactions.types.interaction import Interaction +from google.genai._interactions.types.interaction_complete_event import InteractionCompleteEvent +from google.genai._interactions.types.interaction_start_event import InteractionStartEvent +from google.genai._interactions.types.interaction_status_update import InteractionStatusUpdate import pytest @@ -83,6 +73,21 @@ def __init__(self, events: list[object]): self.aio = _FakeAio(events) +def _build_function_call_delta_event( + *, function_id: str, name: str, arguments: dict[str, object] +) -> SimpleNamespace: + """Build a version-agnostic content.delta event for a function call.""" + return SimpleNamespace( + event_type='content.delta', + delta=SimpleNamespace( + type='function_call', + id=function_id, + name=name, + arguments=arguments, + ), + ) + + def _build_llm_request() -> LlmRequest: """Build a minimal request for interactions streaming tests.""" return LlmRequest( @@ -97,75 +102,69 @@ def _build_llm_request() -> LlmRequest: ) -@pytest.fixture -def fc_step() -> FunctionCallStep: - """Fixture providing a basic FunctionCallStep.""" - return FunctionCallStep( - type='function_call', - id='call_1', - name='get_weather', - arguments={'city': 'Tokyo'}, - ) - - -def _build_lifecycle_streamed_events(fc_step: FunctionCallStep) -> list[object]: +def _build_lifecycle_streamed_events() -> list[object]: """Build streamed events with lifecycle updates carrying the ID.""" now = datetime.now(timezone.utc) - - interaction = Interaction( - id='interaction_123', - created=now, - updated=now, - status='requires_action', - steps=[fc_step], - ) - return [ - InteractionCreatedEvent( - event_type='interaction.created', - interaction=interaction, + InteractionStartEvent( + event_type='interaction.start', + interaction=Interaction( + id='interaction_123', + created=now, + updated=now, + status='in_progress', + ), ), - InteractionCompletedEvent( - event_type='interaction.completed', - interaction=interaction, + _build_function_call_delta_event( + function_id='call_1', + name='get_weather', + arguments={'city': 'Tokyo'}, + ), + InteractionStatusUpdate( + event_type='interaction.status_update', + interaction_id='interaction_123', + status='requires_action', ), ] -def _build_complete_streamed_events(fc_step: FunctionCallStep) -> list[object]: +def _build_complete_streamed_events() -> list[object]: """Build streamed events with the ID on an interaction.complete event.""" now = datetime.now(timezone.utc) - - interaction = Interaction( - id='interaction_complete_123', - created=now, - updated=now, - status='requires_action', - steps=[fc_step], - ) - return [ - InteractionCompletedEvent( - event_type='interaction.completed', - interaction=interaction, + _build_function_call_delta_event( + function_id='call_1', + name='get_weather', + arguments={'city': 'Tokyo'}, + ), + InteractionCompleteEvent( + event_type='interaction.complete', + interaction=Interaction( + id='interaction_complete_123', + created=now, + updated=now, + status='requires_action', + ), ), ] -def _build_legacy_streamed_events(fc_step: FunctionCallStep) -> list[object]: +def _build_legacy_streamed_events() -> list[object]: """Build streamed events with the ID on the legacy interaction event.""" - now = datetime.now(timezone.utc) - - interaction = Interaction( - id='interaction_legacy_123', - created=now, - updated=now, - status='requires_action', - steps=[fc_step], - ) - return [ - interaction, + _build_function_call_delta_event( + function_id='call_1', + name='get_weather', + arguments={'city': 'Tokyo'}, + ), + SimpleNamespace( + event_type='interaction', + id='interaction_legacy_123', + status='requires_action', + error=None, + outputs=None, + usage=None, + ), ] @@ -195,27 +194,13 @@ async def _collect_function_call_interaction_ids( class TestConvertPartToInteractionContent: - """Tests for _convert_part_to_interaction_content.""" + """Tests for convert_part_to_interaction_content.""" def test_text_part(self): """Test converting a text Part.""" part = types.Part(text='Hello, world!') - result = interactions_utils._convert_part_to_interaction_content(part) - assert result == { - 'type': 'user_input', - 'content': [{'type': 'text', 'text': 'Hello, world!'}], - } - - def test_text_part_model_role(self): - """Test converting a text Part for model role.""" - part = types.Part(text='Hello, user!') - result = interactions_utils._convert_part_to_interaction_content( - part, role='model' - ) - assert result == { - 'type': 'model_output', - 'content': [{'type': 'text', 'text': 'Hello, user!'}], - } + result = interactions_utils.convert_part_to_interaction_content(part) + assert result == {'type': 'text', 'text': 'Hello, world!'} def test_function_call_part(self): """Test converting a function call Part.""" @@ -226,7 +211,7 @@ def test_function_call_part(self): args={'city': 'London'}, ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result == { 'type': 'function_call', 'id': 'call_123', @@ -242,7 +227,7 @@ def test_function_call_part_no_id(self): args={'city': 'London'}, ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result['id'] == '' assert result['name'] == 'get_weather' @@ -256,15 +241,17 @@ def test_function_call_part_with_thought_signature(self): ), thought_signature=b'test_signature_bytes', ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result['type'] == 'function_call' assert result['id'] == 'call_456' assert result['name'] == 'my_tool' assert result['arguments'] == {'doc': 'content'} - # signature should be base64 encoded - assert 'signature' in result + # thought_signature should be base64 encoded + assert 'thought_signature' in result - assert base64.b64decode(result['signature']) == b'test_signature_bytes' + assert ( + base64.b64decode(result['thought_signature']) == b'test_signature_bytes' + ) def test_function_call_part_without_thought_signature(self): """Test converting a function call Part without thought_signature.""" @@ -275,10 +262,10 @@ def test_function_call_part_without_thought_signature(self): args={}, ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result['type'] == 'function_call' - # signature should not be present - assert 'signature' not in result + # thought_signature should not be present + assert 'thought_signature' not in result def test_function_response_dict(self): """Test converting a function response Part with dict response.""" @@ -289,15 +276,13 @@ def test_function_response_dict(self): response={'temperature': 20, 'condition': 'sunny'}, ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result['type'] == 'function_result' assert result['call_id'] == 'call_123' assert result['name'] == 'get_weather' - # Dict should be passed through directly (not JSON-serialized) - assert result['result'] == { - 'temperature': 20, - 'condition': 'sunny', - } + # Dict should be passed through directly (not JSON-serialized). + assert result['result'] == {'temperature': 20, 'condition': 'sunny'} + assert isinstance(result['result'], dict) def test_function_response_simple(self): """Test converting a function response Part with simple response.""" @@ -308,30 +293,13 @@ def test_function_response_simple(self): response={'message': 'Weather is sunny'}, ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result['type'] == 'function_result' assert result['call_id'] == 'call_123' assert result['name'] == 'check_weather' - # Dict should be JSON serialized + # Dict should be passed through directly (not JSON-serialized). assert result['result'] == {'message': 'Weather is sunny'} - def test_convert_part_to_interaction_content_function_response_error(self): - part = types.Part( - function_response=types.FunctionResponse( - name='my_function', - id='call_123', - response={'error': 'something went wrong'}, - ) - ) - result = interactions_utils._convert_part_to_interaction_content(part) - assert result == interactions.FunctionResultStepParam( - type='function_result', - name='my_function', - call_id='call_123', - result={'error': 'something went wrong'}, - is_error=True, - ) - def test_function_response_dict_not_double_serialized(self): """Regression test: avoid double-serializing bash tool outputs. @@ -352,7 +320,7 @@ def test_function_response_dict_not_double_serialized(self): response=bash_response, ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) # The result value must be the dict itself, NOT a JSON string. assert isinstance(result['result'], dict) assert result['result'] == bash_response @@ -369,16 +337,11 @@ def test_inline_data_image(self): mime_type='image/png', ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result == { - 'type': 'user_input', - 'content': [{ - 'type': 'image', - 'data': ( - 'aW1hZ2VfZGF0YQ==' - ), # base64.b64encode(b'image_data').decode('utf-8') - 'mime_type': 'image/png', - }], + 'type': 'image', + 'data': b'image_data', + 'mime_type': 'image/png', } def test_inline_data_audio(self): @@ -389,16 +352,11 @@ def test_inline_data_audio(self): mime_type='audio/mp3', ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result == { - 'type': 'user_input', - 'content': [{ - 'type': 'audio', - 'data': ( - 'YXVkaW9fZGF0YQ==' - ), # base64.b64encode(b'audio_data').decode('utf-8') - 'mime_type': 'audio/mp3', - }], + 'type': 'audio', + 'data': b'audio_data', + 'mime_type': 'audio/mp3', } def test_inline_data_video(self): @@ -409,16 +367,11 @@ def test_inline_data_video(self): mime_type='video/mp4', ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result == { - 'type': 'user_input', - 'content': [{ - 'type': 'video', - 'data': ( - 'dmlkZW9fZGF0YQ==' - ), # base64.b64encode(b'video_data').decode('utf-8') - 'mime_type': 'video/mp4', - }], + 'type': 'video', + 'data': b'video_data', + 'mime_type': 'video/mp4', } def test_inline_data_document(self): @@ -429,16 +382,11 @@ def test_inline_data_document(self): mime_type='application/pdf', ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result == { - 'type': 'user_input', - 'content': [{ - 'type': 'document', - 'data': ( - 'ZG9jX2RhdGE=' - ), # base64.b64encode(b'doc_data').decode('utf-8') - 'mime_type': 'application/pdf', - }], + 'type': 'document', + 'data': b'doc_data', + 'mime_type': 'application/pdf', } def test_file_data_image(self): @@ -449,14 +397,11 @@ def test_file_data_image(self): mime_type='image/png', ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result == { - 'type': 'user_input', - 'content': [{ - 'type': 'image', - 'uri': 'gs://bucket/image.png', - 'mime_type': 'image/png', - }], + 'type': 'image', + 'uri': 'gs://bucket/image.png', + 'mime_type': 'image/png', } def test_text_with_thought_flag(self): @@ -465,25 +410,22 @@ def test_text_with_thought_flag(self): # When text is present, the convert function returns text type (not thought) # because text check comes before thought check in the implementation part = types.Part(text='Let me think about this...', thought=True) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) # Text content is returned as-is (thought flag not represented in output) - assert result == { - 'type': 'user_input', - 'content': [{'type': 'text', 'text': 'Let me think about this...'}], - } + assert result == {'type': 'text', 'text': 'Let me think about this...'} def test_thought_only_part(self): """Test converting a thought-only Part with signature.""" signature_bytes = b'test-thought-signature' part = types.Part(thought=True, thought_signature=signature_bytes) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) expected_signature = base64.b64encode(signature_bytes).decode('utf-8') assert result == {'type': 'thought', 'signature': expected_signature} def test_thought_only_part_without_signature(self): """Test converting a thought-only Part without signature.""" part = types.Part(thought=True) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result == {'type': 'thought'} def test_code_execution_result(self): @@ -494,7 +436,7 @@ def test_code_execution_result(self): outcome=types.Outcome.OUTCOME_OK, ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result == { 'type': 'code_execution_result', 'call_id': '', @@ -510,7 +452,7 @@ def test_code_execution_result_with_error(self): outcome=types.Outcome.OUTCOME_FAILED, ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result == { 'type': 'code_execution_result', 'call_id': '', @@ -526,7 +468,7 @@ def test_code_execution_result_deadline_exceeded(self): outcome=types.Outcome.OUTCOME_DEADLINE_EXCEEDED, ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result == { 'type': 'code_execution_result', 'call_id': '', @@ -542,7 +484,7 @@ def test_executable_code(self): language='PYTHON', ) ) - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result == { 'type': 'code_execution_call', 'id': '', @@ -555,12 +497,12 @@ def test_executable_code(self): def test_empty_part(self): """Test converting an empty Part returns None.""" part = types.Part() - result = interactions_utils._convert_part_to_interaction_content(part) + result = interactions_utils.convert_part_to_interaction_content(part) assert result is None -class TestConvertContentToStep: - """Tests for _convert_content_to_step.""" +class TestConvertContentToTurn: + """Tests for convert_content_to_turn.""" def test_user_content(self): """Test converting user content.""" @@ -568,11 +510,11 @@ def test_user_content(self): role='user', parts=[types.Part(text='Hello!')], ) - result = interactions_utils._convert_content_to_step(content) - assert result == [{ - 'type': 'user_input', + result = interactions_utils.convert_content_to_turn(content) + assert result == { + 'role': 'user', 'content': [{'type': 'text', 'text': 'Hello!'}], - }] + } def test_model_content(self): """Test converting model content.""" @@ -580,11 +522,11 @@ def test_model_content(self): role='model', parts=[types.Part(text='Hi there!')], ) - result = interactions_utils._convert_content_to_step(content) - assert result == [{ - 'type': 'model_output', + result = interactions_utils.convert_content_to_turn(content) + assert result == { + 'role': 'model', 'content': [{'type': 'text', 'text': 'Hi there!'}], - }] + } def test_multiple_parts(self): """Test converting content with multiple parts.""" @@ -597,60 +539,30 @@ def test_multiple_parts(self): ), ], ) - result = interactions_utils._convert_content_to_step(content) - assert len(result) == 2 - assert result[0]['type'] == 'user_input' - assert result[0]['content'][0] == {'type': 'text', 'text': 'Look at this:'} - assert result[1]['type'] == 'user_input' - assert result[1]['content'][0]['type'] == 'image' - - def test_interleaved_parts(self): - """Test converting content with interleaved text and media parts.""" - content = types.Content( - role='user', - parts=[ - types.Part(text='First:'), - types.Part( - inline_data=types.Blob(data=b'img1', mime_type='image/png') - ), - types.Part(text='Second:'), - types.Part( - inline_data=types.Blob(data=b'img2', mime_type='image/jpeg') - ), - types.Part(text='End'), - ], - ) - result = interactions_utils._convert_content_to_step(content) - assert len(result) == 5 - assert result[0]['type'] == 'user_input' - assert result[0]['content'][0] == {'type': 'text', 'text': 'First:'} - assert result[1]['type'] == 'user_input' - assert result[1]['content'][0]['type'] == 'image' - assert result[2]['type'] == 'user_input' - assert result[2]['content'][0] == {'type': 'text', 'text': 'Second:'} - assert result[3]['type'] == 'user_input' - assert result[3]['content'][0]['type'] == 'image' - assert result[4]['type'] == 'user_input' - assert result[4]['content'][0] == {'type': 'text', 'text': 'End'} + result = interactions_utils.convert_content_to_turn(content) + assert result['role'] == 'user' + assert len(result['content']) == 2 + assert result['content'][0] == {'type': 'text', 'text': 'Look at this:'} + assert result['content'][1]['type'] == 'image' def test_default_role(self): """Test that default role is 'user' when not specified.""" content = types.Content(parts=[types.Part(text='Hi')]) - result = interactions_utils._convert_content_to_step(content) - assert result[0]['type'] == 'user_input' + result = interactions_utils.convert_content_to_turn(content) + assert result['role'] == 'user' -class TestConvertContentsToSteps: - """Tests for convert_contents_to_steps.""" +class TestConvertContentsToTurns: + """Tests for convert_contents_to_turns.""" def test_single_content(self): """Test converting a list with single content.""" contents = [ types.Content(role='user', parts=[types.Part(text='What is 2+2?')]), ] - result = interactions_utils._convert_contents_to_steps(contents) + result = interactions_utils.convert_contents_to_turns(contents) assert len(result) == 1 - assert result[0]['type'] == 'user_input' + assert result[0]['role'] == 'user' assert result[0]['content'][0]['text'] == 'What is 2+2?' def test_multi_turn_conversation(self): @@ -660,11 +572,11 @@ def test_multi_turn_conversation(self): types.Content(role='model', parts=[types.Part(text='Hello!')]), types.Content(role='user', parts=[types.Part(text='How are you?')]), ] - result = interactions_utils._convert_contents_to_steps(contents) + result = interactions_utils.convert_contents_to_turns(contents) assert len(result) == 3 - assert result[0]['type'] == 'user_input' - assert result[1]['type'] == 'model_output' - assert result[2]['type'] == 'user_input' + assert result[0]['role'] == 'user' + assert result[1]['role'] == 'model' + assert result[2]['role'] == 'user' def test_empty_content_skipped(self): """Test that empty contents are skipped.""" @@ -672,13 +584,13 @@ def test_empty_content_skipped(self): types.Content(role='user', parts=[types.Part(text='Hi')]), types.Content(role='model', parts=[]), # Empty parts ] - result = interactions_utils._convert_contents_to_steps(contents) + result = interactions_utils.convert_contents_to_turns(contents) # Only the first content should be included assert len(result) == 1 class TestConvertToolsConfig: - """Tests for _convert_tools_config_to_interactions_format.""" + """Tests for convert_tools_config_to_interactions_format.""" def test_function_declaration(self): """Test converting function declarations.""" @@ -739,43 +651,43 @@ def test_no_tools(self): assert result == [] -class TestConvertInteractionOutputToParts: - """Tests for convert_interaction_output_to_parts.""" +class TestConvertInteractionOutputToPart: + """Tests for convert_interaction_output_to_part.""" def test_text_output(self): """Test converting text output.""" - output = ModelOutputStep( - type='model_output', content=[TextContent(type='text', text='Hello!')] - ) - result_list = interactions_utils._convert_interaction_step_to_parts(output) - result = result_list[0] if result_list else None + output = MagicMock() + output.type = 'text' + output.text = 'Hello!' + result = interactions_utils.convert_interaction_output_to_part(output) assert result.text == 'Hello!' def test_function_call_output(self): """Test converting function call output.""" - output = FunctionCallStep( - type='function_call', - id='call_123', - name='get_weather', - arguments={'city': 'London'}, - ) - result_list = interactions_utils._convert_interaction_step_to_parts(output) - result = result_list[0] if result_list else None + output = MagicMock() + output.type = 'function_call' + output.id = 'call_123' + output.name = 'get_weather' + output.arguments = {'city': 'London'} + result = interactions_utils.convert_interaction_output_to_part(output) assert result.function_call.id == 'call_123' assert result.function_call.name == 'get_weather' assert result.function_call.args == {'city': 'London'} def test_function_call_output_with_thought_signature(self): """Test converting function call output with thought_signature.""" - output = FunctionCallStep( - type='function_call', - id='call_sig_123', - name='gemini3_tool', - arguments={'content': 'hello'}, - signature=base64.b64encode(b'gemini3_signature').decode('utf-8'), - ) - result_list = interactions_utils._convert_interaction_step_to_parts(output) - result = result_list[0] if result_list else None + output = MagicMock( + spec=['type', 'id', 'name', 'arguments', 'thought_signature'] + ) + output.type = 'function_call' + output.id = 'call_sig_123' + output.name = 'gemini3_tool' + output.arguments = {'content': 'hello'} + # thought_signature is base64 encoded in the output + output.thought_signature = base64.b64encode(b'gemini3_signature').decode( + 'utf-8' + ) + result = interactions_utils.convert_interaction_output_to_part(output) assert result.function_call.id == 'call_sig_123' assert result.function_call.name == 'gemini3_tool' assert result.function_call.args == {'content': 'hello'} @@ -784,121 +696,88 @@ def test_function_call_output_with_thought_signature(self): def test_function_call_output_without_thought_signature(self): """Test converting function call output without thought_signature.""" - output = FunctionCallStep( - type='function_call', - id='call_no_sig', - name='regular_tool', - arguments={}, - ) - result_list = interactions_utils._convert_interaction_step_to_parts(output) - result = result_list[0] if result_list else None + output = MagicMock(spec=['type', 'id', 'name', 'arguments']) + output.type = 'function_call' + output.id = 'call_no_sig' + output.name = 'regular_tool' + output.arguments = {} + result = interactions_utils.convert_interaction_output_to_part(output) assert result.function_call.id == 'call_no_sig' assert result.function_call.name == 'regular_tool' # thought_signature should be None assert result.thought_signature is None - def test_function_result_output(self): - """Test converting function result output.""" - output = FunctionResultStep( - type='function_result', - call_id='call_123', - result={'weather': 'Sunny'}, - ) - result_list = interactions_utils._convert_interaction_step_to_parts(output) - result = result_list[0] if result_list else None + def test_function_result_output_with_items_list(self): + """Test converting function result output with items list. + + The implementation handles the case where result has an 'items' attribute + that returns a list-like structure. This test validates that path. + """ + output = MagicMock() + output.type = 'function_result' + output.call_id = 'call_123' + # Create a mock that has .items returning a dict (for FunctionResponse) + output.result = MagicMock() + output.result.items = {'weather': 'Sunny'} # items attribute returns dict + result = interactions_utils.convert_interaction_output_to_part(output) assert result.function_response.id == 'call_123' assert result.function_response.response == {'weather': 'Sunny'} def test_image_output_with_data(self): """Test converting image output with inline data.""" - output = ModelOutputStep( - type='model_output', - content=[ - ImageContent( - type='image', - data=base64.b64encode(b'image_bytes').decode('utf-8'), - mime_type='image/png', - ) - ], - ) - result_list = interactions_utils._convert_interaction_step_to_parts(output) - result = result_list[0] if result_list else None + output = MagicMock() + output.type = 'image' + output.data = b'image_bytes' + output.uri = None + output.mime_type = 'image/png' + result = interactions_utils.convert_interaction_output_to_part(output) assert result.inline_data.data == b'image_bytes' assert result.inline_data.mime_type == 'image/png' def test_image_output_with_uri(self): """Test converting image output with URI.""" - output = ModelOutputStep( - type='model_output', - content=[ - ImageContent( - type='image', - uri='gs://bucket/image.png', - mime_type='image/png', - ) - ], - ) - result_list = interactions_utils._convert_interaction_step_to_parts(output) - result = result_list[0] if result_list else None + output = MagicMock() + output.type = 'image' + output.data = None + output.uri = 'gs://bucket/image.png' + output.mime_type = 'image/png' + result = interactions_utils.convert_interaction_output_to_part(output) assert result.file_data.file_uri == 'gs://bucket/image.png' assert result.file_data.mime_type == 'image/png' def test_code_execution_result_output(self): """Test converting code execution result output.""" - output = CodeExecutionResultStep( - type='code_execution_result', - call_id='', - result='Output from code', - is_error=False, - ) - result_list = interactions_utils._convert_interaction_step_to_parts(output) - result = result_list[0] if result_list else None + output = MagicMock() + output.type = 'code_execution_result' + output.result = 'Output from code' + output.is_error = False # Indicate successful execution + result = interactions_utils.convert_interaction_output_to_part(output) assert result.code_execution_result.output == 'Output from code' assert result.code_execution_result.outcome == types.Outcome.OUTCOME_OK def test_code_execution_result_error_output(self): """Test converting code execution result output with error.""" - output = CodeExecutionResultStep( - type='code_execution_result', - call_id='', - result='Error: division by zero', - is_error=True, - ) - result_list = interactions_utils._convert_interaction_step_to_parts(output) - result = result_list[0] if result_list else None + output = MagicMock() + output.type = 'code_execution_result' + output.result = 'Error: division by zero' + output.is_error = True # Indicate failed execution + result = interactions_utils.convert_interaction_output_to_part(output) assert result.code_execution_result.output == 'Error: division by zero' assert result.code_execution_result.outcome == types.Outcome.OUTCOME_FAILED - def test_thought_output_returns_empty(self): - """Test that thought output returns empty list (not exposed as Part).""" - output = ThoughtStep(type='thought', signature='thinking...') - result = interactions_utils._convert_interaction_step_to_parts(output) - assert result == [] + def test_thought_output_returns_none(self): + """Test that thought output returns None (not exposed as Part).""" + output = MagicMock() + output.type = 'thought' + output.signature = 'thinking...' + result = interactions_utils.convert_interaction_output_to_part(output) + assert result is None def test_no_type_attribute(self): """Test handling output without type attribute.""" output = MagicMock(spec=[]) # No 'type' attribute - result = interactions_utils._convert_interaction_step_to_parts(output) - assert result == [] - - def test_code_execution_call_output_uppercase_python(self): - """Test converting code execution call output with uppercase PYTHON.""" - from google.genai.interactions import CodeExecutionCallStep - - mock_args = MagicMock() - mock_args.code = 'print("hello")' - mock_args.language = 'PYTHON' - - output = CodeExecutionCallStep.model_construct( - type='code_execution_call', - id='', - arguments=mock_args, - ) - result_list = interactions_utils._convert_interaction_step_to_parts(output) - result = result_list[0] if result_list else None - assert result is not None - assert result.executable_code.code == 'print("hello")' - assert result.executable_code.language == types.Language.PYTHON + result = interactions_utils.convert_interaction_output_to_part(output) + assert result is None class TestConvertInteractionToLlmResponse: @@ -906,19 +785,18 @@ class TestConvertInteractionToLlmResponse: def test_successful_text_response(self): """Test converting a successful text response.""" - interaction = Interaction( - id='interaction_123', - status='completed', - created=datetime.now(timezone.utc), - updated=datetime.now(timezone.utc), - steps=[ - ModelOutputStep( - type='model_output', - content=[TextContent(type='text', text='The answer is 4.')], - ) - ], - usage=Usage(total_input_tokens=10, total_output_tokens=5), - ) + interaction = MagicMock() + interaction.id = 'interaction_123' + interaction.status = 'completed' + text_output = MagicMock() + text_output.type = 'text' + text_output.text = 'The answer is 4.' + interaction.outputs = [text_output] + interaction.usage = MagicMock() + interaction.usage.total_input_tokens = 10 + interaction.usage.total_output_tokens = 5 + interaction.error = None + result = interactions_utils.convert_interaction_to_llm_response(interaction) assert result.interaction_id == 'interaction_123' @@ -930,14 +808,13 @@ def test_successful_text_response(self): def test_failed_response(self): """Test converting a failed response.""" - interaction = Interaction( - id='interaction_123', - status='failed', - created=datetime.now(timezone.utc), - updated=datetime.now(timezone.utc), - steps=[], - ) - interaction.error = MagicMock(code='INVALID_REQUEST', message='Bad request') + interaction = MagicMock() + interaction.id = 'interaction_123' + interaction.status = 'failed' + interaction.outputs = [] + interaction.error = MagicMock() + interaction.error.code = 'INVALID_REQUEST' + interaction.error.message = 'Bad request' result = interactions_utils.convert_interaction_to_llm_response(interaction) @@ -947,20 +824,18 @@ def test_failed_response(self): def test_requires_action_response(self): """Test converting a requires_action response (function call).""" - interaction = Interaction( - id='interaction_123', - status='requires_action', - created=datetime.now(timezone.utc), - updated=datetime.now(timezone.utc), - steps=[ - FunctionCallStep( - type='function_call', - id='call_1', - name='get_weather', - arguments={'city': 'Paris'}, - ) - ], - ) + interaction = MagicMock() + interaction.id = 'interaction_123' + interaction.status = 'requires_action' + fc_output = MagicMock() + fc_output.type = 'function_call' + fc_output.id = 'call_1' + fc_output.name = 'get_weather' + fc_output.arguments = {'city': 'Paris'} + interaction.outputs = [fc_output] + interaction.usage = None + interaction.error = None + result = interactions_utils.convert_interaction_to_llm_response(interaction) assert result.interaction_id == 'interaction_123' @@ -1155,11 +1030,12 @@ class TestConvertInteractionEventToLlmResponse: def test_text_delta_event(self): """Test converting a text delta event.""" - event = StepDelta( - event_type='step.delta', - index=0, - delta={'type': 'text', 'text': 'Hello world'}, - ) + event = MagicMock() + event.event_type = 'content.delta' + event.delta = MagicMock() + event.delta.type = 'text' + event.delta.text = 'Hello world' + aggregated_parts = [] result = interactions_utils.convert_interaction_event_to_llm_response( event, aggregated_parts, interaction_id='int_123' @@ -1171,155 +1047,111 @@ def test_text_delta_event(self): assert result.interaction_id == 'int_123' assert len(aggregated_parts) == 1 - def test_image_delta_with_data(self): - """Test converting an image delta with inline data.""" - event = StepDelta( - event_type='step.delta', - index=0, - delta={ - 'type': 'image', - 'data': base64.b64encode(b'image_bytes').decode('utf-8'), - 'mime_type': 'image/png', - }, + def test_function_call_delta_with_thought_signature(self): + """Test converting a function call delta with thought_signature.""" + event = MagicMock() + event.event_type = 'content.delta' + event.delta = MagicMock( + spec=['type', 'id', 'name', 'arguments', 'thought_signature'] ) + event.delta.type = 'function_call' + event.delta.id = 'fc_delta_123' + event.delta.name = 'streaming_tool' + event.delta.arguments = {'param': 'value'} + # thought_signature is base64 encoded in the delta + event.delta.thought_signature = base64.b64encode(b'delta_signature').decode( + 'utf-8' + ) + aggregated_parts = [] result = interactions_utils.convert_interaction_event_to_llm_response( - event, aggregated_parts, interaction_id='int_img' + event, aggregated_parts, interaction_id='int_456' ) - assert result is not None - assert result.partial - assert result.content.parts[0].inline_data.data == b'image_bytes' + # Function calls return None (added to aggregated_parts only) + assert result is None assert len(aggregated_parts) == 1 + fc_part = aggregated_parts[0] + assert fc_part.function_call.id == 'fc_delta_123' + assert fc_part.function_call.name == 'streaming_tool' + assert fc_part.function_call.args == {'param': 'value'} + # thought_signature should be decoded back to bytes + assert fc_part.thought_signature == b'delta_signature' - def test_unknown_event_type_returns_none(self): - """Test that unknown event types return None.""" + def test_function_call_delta_without_thought_signature(self): + """Test converting a function call delta without thought_signature.""" event = MagicMock() - event.event_type = 'some_unknown_event' # Unknown event type + event.event_type = 'content.delta' + event.delta = MagicMock(spec=['type', 'id', 'name', 'arguments']) + event.delta.type = 'function_call' + event.delta.id = 'fc_no_sig' + event.delta.name = 'regular_tool' + event.delta.arguments = {} aggregated_parts = [] result = interactions_utils.convert_interaction_event_to_llm_response( - event, aggregated_parts, interaction_id='int_other' + event, aggregated_parts, interaction_id='int_789' ) + # Function calls return None assert result is None - assert not aggregated_parts - - def test_function_call_streaming_flow(self): - """Test the complete streaming flow for function calls (Start, Delta, Stop).""" - # 1. StepStart - start_event = StepStart( - event_type='step.start', - index=0, - step=FunctionCallStep( - type='function_call', - id='call_1', - name='get_weather', - arguments={}, - ), - ) - aggregated_parts: list[types.Part] = [] - result1 = interactions_utils.convert_interaction_event_to_llm_response( - start_event, aggregated_parts, interaction_id='int_123' - ) - - assert result1 is not None - assert result1.partial is True assert len(aggregated_parts) == 1 - fc = aggregated_parts[-1].function_call - assert fc - assert fc.name == 'get_weather' - assert fc.id == 'call_1' - assert fc.partial_args == [] - - # 2. StepDelta - delta_event1 = StepDelta( - event_type='step.delta', - index=0, - delta={'type': 'arguments_delta', 'arguments': '{"city": '}, - ) - result2 = interactions_utils.convert_interaction_event_to_llm_response( - delta_event1, aggregated_parts, interaction_id='int_123' - ) + fc_part = aggregated_parts[0] + assert fc_part.function_call.name == 'regular_tool' + # thought_signature should be None + assert fc_part.thought_signature is None - assert result2 is not None - assert result2.partial is True - assert ( - result2.content.parts[0].function_call.partial_args[0].string_value - == '{"city": ' - ) + def test_function_call_delta_without_name_skipped(self): + """Test that function call delta without name is skipped.""" + event = MagicMock() + event.event_type = 'content.delta' + event.delta = MagicMock(spec=['type', 'id', 'name', 'arguments']) + event.delta.type = 'function_call' + event.delta.id = 'fc_no_name' + event.delta.name = None # No name + event.delta.arguments = {} - delta_event2 = StepDelta( - event_type='step.delta', - index=0, - delta={'type': 'arguments_delta', 'arguments': '"Paris"}'}, - ) - result3 = interactions_utils.convert_interaction_event_to_llm_response( - delta_event2, aggregated_parts, interaction_id='int_123' + aggregated_parts = [] + result = interactions_utils.convert_interaction_event_to_llm_response( + event, aggregated_parts, interaction_id='int_000' ) - assert result3 is not None - assert len(aggregated_parts[0].function_call.partial_args) == 2 + # Should be skipped (no name) + assert result is None + assert not aggregated_parts - # 3. StepStop - stop_event = StepStop( - event_type='step.stop', - index=0, - ) - result4 = interactions_utils.convert_interaction_event_to_llm_response( - stop_event, aggregated_parts, interaction_id='int_123' - ) + def test_image_delta_with_data(self): + """Test converting an image delta with inline data.""" + event = MagicMock() + event.event_type = 'content.delta' + event.delta = MagicMock() + event.delta.type = 'image' + event.delta.data = b'image_bytes' + event.delta.uri = None + event.delta.mime_type = 'image/png' - assert result4 is None - assert aggregated_parts[0].function_call.args == {'city': 'Paris'} - assert aggregated_parts[0].function_call.partial_args is None - - def test_function_call_streaming_json_parse_error(self, caplog): - """Test function call streaming returns an error response on JSON parse error.""" - # 1. StepStart - start_event = StepStart( - event_type='step.start', - index=0, - step=FunctionCallStep( - type='function_call', - id='call_err', - name='bad_json_tool', - arguments={}, - ), - ) aggregated_parts = [] - interactions_utils.convert_interaction_event_to_llm_response( - start_event, aggregated_parts, interaction_id='int_err' + result = interactions_utils.convert_interaction_event_to_llm_response( + event, aggregated_parts, interaction_id='int_img' ) - # 2. StepDelta (invalid JSON) - delta_event = StepDelta( - event_type='step.delta', - index=0, - delta={'type': 'arguments_delta', 'arguments': '{"broken": "json'}, - ) - interactions_utils.convert_interaction_event_to_llm_response( - delta_event, aggregated_parts, interaction_id='int_err' - ) + assert result is not None + assert not result.partial + assert result.content.parts[0].inline_data.data == b'image_bytes' + assert len(aggregated_parts) == 1 - # 3. StepStop - stop_event = StepStop( - event_type='step.stop', - index=0, - ) + def test_unknown_event_type_returns_none(self): + """Test that unknown event types return None.""" + event = MagicMock() + event.event_type = 'some_unknown_event' # Unknown event type + + aggregated_parts = [] result = interactions_utils.convert_interaction_event_to_llm_response( - stop_event, aggregated_parts, interaction_id='int_err' + event, aggregated_parts, interaction_id='int_other' ) - # Assert an error LlmResponse is returned - assert result is not None - assert result.error_code == 'JSON_PARSE_ERROR' - assert result.error_message == 'Failed to parse function call arguments' - assert result.turn_complete is True - assert result.interaction_id == 'int_err' - - # The logging check can remain to ensure the raw exception is still logged. - assert 'Failed to parse function call args' in caplog.text + assert result is None + assert not aggregated_parts @pytest.mark.parametrize( @@ -1327,7 +1159,7 @@ def test_function_call_streaming_json_parse_error(self, caplog): [ pytest.param( _build_lifecycle_streamed_events, - ['interaction_123'], + ['interaction_123', 'interaction_123'], id='lifecycle-events', ), pytest.param( @@ -1343,12 +1175,11 @@ def test_function_call_streaming_json_parse_error(self, caplog): ], ) def test_generate_content_via_interactions_stream_extracts_interaction_id( - streamed_events_factory: Callable[[FunctionCallStep], list[object]], + streamed_events_factory: Callable[[], list[object]], expected_ids: list[str], - fc_step: FunctionCallStep, ): """Streamed interaction IDs should be preserved across event variants.""" - streamed_events = streamed_events_factory(fc_step) + streamed_events = streamed_events_factory() assert ( asyncio.run(_collect_function_call_interaction_ids(streamed_events)) diff --git a/tests/unittests/models/test_litellm.py b/tests/unittests/models/test_litellm.py index d6e11f2c97..b1a9957034 100644 --- a/tests/unittests/models/test_litellm.py +++ b/tests/unittests/models/test_litellm.py @@ -1716,7 +1716,7 @@ async def test_generate_content_async_with_usage_metadata( @pytest.mark.asyncio -async def test_generate_content_async_ollama_chat_preserves_multimodal_content( +async def test_generate_content_async_ollama_chat_flattens_content( mock_acompletion, mock_completion ): llm_client = MockLLMClient(mock_acompletion, mock_completion) @@ -1748,26 +1748,12 @@ async def test_generate_content_async_ollama_chat_preserves_multimodal_content( ) _, kwargs = mock_acompletion.call_args message_content = kwargs["messages"][0]["content"] - # Multimodal content (text + image) should be kept as a list so LiteLLM - # can convert it to Ollama's native images field. - assert isinstance(message_content, list) - text_blocks = [ - b - for b in message_content - if isinstance(b, dict) and b.get("type") == "text" - ] - image_blocks = [ - b - for b in message_content - if isinstance(b, dict) and b.get("type") == "image_url" - ] - assert len(text_blocks) >= 1 - assert "Describe this image." in text_blocks[0].get("text", "") - assert len(image_blocks) >= 1 + assert isinstance(message_content, str) + assert "Describe this image." in message_content @pytest.mark.asyncio -async def test_generate_content_async_custom_provider_preserves_multimodal( +async def test_generate_content_async_custom_provider_flattens_content( mock_acompletion, mock_completion ): llm_client = MockLLMClient(mock_acompletion, mock_completion) @@ -1798,14 +1784,8 @@ async def test_generate_content_async_custom_provider_preserves_multimodal( assert kwargs["custom_llm_provider"] == "ollama_chat" assert kwargs["model"] == "qwen2.5:7b" message_content = kwargs["messages"][0]["content"] - # Multimodal content should be preserved as a list. - assert isinstance(message_content, list) - text_blocks = [ - b - for b in message_content - if isinstance(b, dict) and b.get("type") == "text" - ] - assert any("Describe this image." in b.get("text", "") for b in text_blocks) + assert isinstance(message_content, str) + assert "Describe this image." in message_content def test_flatten_ollama_content_accepts_tuple_blocks(): @@ -1831,6 +1811,16 @@ def test_flatten_ollama_content_accepts_tuple_blocks(): ], "first\nsecond", ), + ( + [ + {"type": "text", "text": "Describe this image."}, + { + "type": "image_url", + "image_url": {"url": "http://example.com"}, + }, + ], + "Describe this image.", + ), ], ) def test_flatten_ollama_content_returns_str_or_none(content, expected): @@ -1841,58 +1831,15 @@ def test_flatten_ollama_content_returns_str_or_none(content, expected): assert flattened is None or isinstance(flattened, str) -def test_flatten_ollama_content_preserves_image_url_blocks(): - """Media blocks should be kept as a list so LiteLLM can convert them.""" - from google.adk.models.lite_llm import _flatten_ollama_content - - blocks = [ - {"type": "image_url", "image_url": {"url": "http://example.com/img.png"}}, - ] - result = _flatten_ollama_content(blocks) - assert isinstance(result, list) - assert result == blocks - - -def test_flatten_ollama_content_preserves_mixed_text_and_image(): - """Text + image_url should return the full list, not just the text.""" - from google.adk.models.lite_llm import _flatten_ollama_content - - blocks = [ - {"type": "text", "text": "Describe this image."}, - { - "type": "image_url", - "image_url": {"url": "data:image/png;base64,iVBORw0KGgo="}, - }, - ] - result = _flatten_ollama_content(blocks) - assert isinstance(result, list) - assert len(result) == 2 - assert result[0]["type"] == "text" - assert result[1]["type"] == "image_url" - - -def test_flatten_ollama_content_preserves_video_url_blocks(): +def test_flatten_ollama_content_serializes_non_text_blocks_to_json(): from google.adk.models.lite_llm import _flatten_ollama_content blocks = [ - {"type": "text", "text": "What happens in this clip?"}, - {"type": "video_url", "video_url": {"url": "http://example.com/v.mp4"}}, + {"type": "image_url", "image_url": {"url": "http://example.com"}}, ] - result = _flatten_ollama_content(blocks) - assert isinstance(result, list) - assert len(result) == 2 - - -def test_flatten_ollama_content_serializes_non_media_non_text_blocks_to_json(): - """Blocks with unknown types and no media should still serialize to JSON.""" - from google.adk.models.lite_llm import _flatten_ollama_content - - blocks = [ - {"type": "custom_block", "data": "something"}, - ] - result = _flatten_ollama_content(blocks) - assert isinstance(result, str) - assert json.loads(result) == blocks + flattened = _flatten_ollama_content(blocks) + assert isinstance(flattened, str) + assert json.loads(flattened) == blocks def test_flatten_ollama_content_serializes_dict_to_json(): @@ -2306,57 +2253,6 @@ def test_message_to_generate_content_response_tool_call(): assert response.content.parts[0].function_call.id == "test_tool_call_id" -def test_message_to_generate_content_response_tool_call_accepts_python_literal_arguments(): - message = ChatCompletionAssistantMessage( - role="assistant", - content=None, - tool_calls=[ - ChatCompletionMessageToolCall( - type="function", - id="test_tool_call_id", - function=Function( - name="test_function", - arguments="{'query': 'MATCH (n) RETURN n'}", - ), - ) - ], - ) - - response = _message_to_generate_content_response(message) - - assert response.content.role == "model" - assert response.content.parts[0].function_call.name == "test_function" - assert response.content.parts[0].function_call.args == { - "query": "MATCH (n) RETURN n" - } - - -def test_message_to_generate_content_response_tool_call_accepts_unquoted_json_keys(): - message = ChatCompletionAssistantMessage( - role="assistant", - content=None, - tool_calls=[ - ChatCompletionMessageToolCall( - type="function", - id="test_tool_call_id", - function=Function( - name="test_function", - arguments='{query: "MATCH (n) RETURN n", limit: 5}', - ), - ) - ], - ) - - response = _message_to_generate_content_response(message) - - assert response.content.role == "model" - assert response.content.parts[0].function_call.name == "test_function" - assert response.content.parts[0].function_call.args == { - "query": "MATCH (n) RETURN n", - "limit": 5, - } - - def test_message_to_generate_content_response_inline_tool_call_text(): message = ChatCompletionAssistantMessage( role="assistant", @@ -2963,7 +2859,7 @@ async def test_get_content_file_uri(file_uri, mime_type): ("azure", "azure/gpt-4"), ], ) -async def test_get_content_file_uri_file_id_required_raises_error( +async def test_get_content_file_uri_file_id_required_falls_back_to_text( provider, model ): parts = [ @@ -2975,11 +2871,10 @@ async def test_get_content_file_uri_file_id_required_raises_error( ) ) ] - with pytest.raises( - ValueError, - match=f"File URI `document.pdf` not supported for provider: {provider}", - ): - _ = await _get_content(parts, provider=provider, model=model) + content = await _get_content(parts, provider=provider, model=model) + assert content == [ + {"type": "text", "text": '[File reference: "document.pdf"]'} + ] @pytest.mark.asyncio @@ -3048,20 +2943,6 @@ async def test_get_content_file_uri_file_id_required_preserves_file_id( assert content == [{"type": "file", "file": {"file_id": "file-abc123"}}] -@pytest.mark.asyncio -async def test_get_content_file_uri_azure_preserves_assistant_file_id(): - parts = [ - types.Part( - file_data=types.FileData( - file_uri="assistant-abc123", - mime_type="application/pdf", - ) - ) - ] - content = await _get_content(parts, provider="azure", model="azure/gpt-4.1") - assert content == [{"type": "file", "file": {"file_id": "assistant-abc123"}}] - - @pytest.mark.asyncio @pytest.mark.parametrize( "provider,model", @@ -3070,23 +2951,23 @@ async def test_get_content_file_uri_azure_preserves_assistant_file_id(): ("azure", "azure/gpt-4"), ], ) -async def test_get_content_file_uri_http_pdf_file_id_required_raises_error( +async def test_get_content_file_uri_http_pdf_file_id_required_falls_back_to_text( provider, model ): + file_uri = "https://example.com/document.pdf" parts = [ types.Part( file_data=types.FileData( - file_uri="https://example.com/document.pdf", + file_uri=file_uri, mime_type="application/pdf", display_name="document.pdf", ) ) ] - with pytest.raises( - ValueError, - match=f"File URI `document.pdf` not supported for provider: {provider}", - ): - _ = await _get_content(parts, provider=provider, model=model) + content = await _get_content(parts, provider=provider, model=model) + assert content == [ + {"type": "text", "text": '[File reference: "document.pdf"]'} + ] @pytest.mark.asyncio @@ -3110,7 +2991,7 @@ async def test_get_content_file_uri_http_pdf_non_file_id_provider_uses_file(): @pytest.mark.asyncio -async def test_get_content_file_uri_anthropic_raises_error(): +async def test_get_content_file_uri_anthropic_falls_back_to_text(): parts = [ types.Part( file_data=types.FileData( @@ -3120,29 +3001,27 @@ async def test_get_content_file_uri_anthropic_raises_error(): ) ) ] - with pytest.raises( - ValueError, - match="File URI `document.pdf` not supported for provider: anthropic", - ): - _ = await _get_content( - parts, provider="anthropic", model="anthropic/claude-3-5" - ) + content = await _get_content( + parts, provider="anthropic", model="anthropic/claude-3-5" + ) + assert content == [ + {"type": "text", "text": '[File reference: "document.pdf"]'} + ] @pytest.mark.asyncio -async def test_get_content_file_uri_anthropic_openai_file_id_raises_error(): +async def test_get_content_file_uri_anthropic_openai_file_id_falls_back_to_text(): parts = [types.Part(file_data=types.FileData(file_uri="file-abc123"))] - with pytest.raises( - ValueError, - match="File URI `file-` not supported for provider: anthropic", - ): - _ = await _get_content( - parts, provider="anthropic", model="anthropic/claude-3-5" - ) + content = await _get_content( + parts, provider="anthropic", model="anthropic/claude-3-5" + ) + assert content == [ + {"type": "text", "text": '[File reference: "file-abc123"]'} + ] @pytest.mark.asyncio -async def test_get_content_file_uri_vertex_ai_non_gemini_raises_error(): +async def test_get_content_file_uri_vertex_ai_non_gemini_falls_back_to_text(): parts = [ types.Part( file_data=types.FileData( @@ -3152,13 +3031,12 @@ async def test_get_content_file_uri_vertex_ai_non_gemini_raises_error(): ) ) ] - with pytest.raises( - ValueError, - match="File URI `document.pdf` not supported for provider: vertex_ai", - ): - _ = await _get_content( - parts, provider="vertex_ai", model="vertex_ai/claude-3-5" - ) + content = await _get_content( + parts, provider="vertex_ai", model="vertex_ai/claude-3-5" + ) + assert content == [ + {"type": "text", "text": '[File reference: "document.pdf"]'} + ] @pytest.mark.asyncio @@ -3322,22 +3200,21 @@ async def test_get_content_audio_inline_data_emits_input_audio( ("azure", "azure/gpt-4"), ], ) -async def test_get_content_audio_file_uri_http_raises_error(provider, model): - """Audio HTTP file_uri raises an error for openai/azure.""" +async def test_get_content_audio_file_uri_http_falls_back_to_text( + provider, model +): + """Audio HTTP file_uri falls back to a text reference for openai/azure.""" file_uri = "https://example.com/audio.mp3" parts = [ types.Part( file_data=types.FileData(file_uri=file_uri, mime_type="audio/mpeg") ) ] - with pytest.raises( - ValueError, - match=( - "File URI `https:///audio.mp3` not supported for provider:" - f" {provider}" - ), - ): - _ = await _get_content(parts, provider=provider, model=model) + content = await _get_content(parts, provider=provider, model=model) + assert content == [{ + "type": "text", + "text": f'[File reference: "{file_uri}"]', + }] def test_to_litellm_role(): @@ -4570,7 +4447,6 @@ async def test_finish_reason_propagation( mock_acompletion.assert_called_once() -@pytest.mark.skip(reason="LiteLLM finish_reason mapping behaviour changed") @pytest.mark.asyncio async def test_finish_reason_unknown_maps_to_other( mock_acompletion, lite_llm_instance diff --git a/tests/unittests/models/test_models.py b/tests/unittests/models/test_models.py index e91ffe8b23..d2c6673664 100644 --- a/tests/unittests/models/test_models.py +++ b/tests/unittests/models/test_models.py @@ -109,35 +109,3 @@ def test_helpful_error_for_litellm_without_extensions(): assert 'litellm package' in error_msg assert 'pip install' in error_msg assert 'Provider-style models' in error_msg - - -def test_resolve_with_prefix(): - """Test that model resolution can be overridden with a prefix.""" - assert models.LLMRegistry.resolve('gemini:gemini-1.5-flash') is Gemini - assert models.LLMRegistry.resolve('Claude:claude-3-opus@20240229') is Claude - assert models.LLMRegistry.resolve('lite:openai/gpt-4o') is LiteLlm - assert models.LLMRegistry.resolve('LiteLlm:openai/gpt-4o') is LiteLlm - - -def test_new_llm_with_prefix(mocker): - """Test that new_llm strips prefix when creating instance if it matches class.""" - mock_class = mocker.MagicMock() - mock_class.__name__ = 'MockLlm' - mocker.patch.object(models.LLMRegistry, 'resolve', return_value=mock_class) - - models.LLMRegistry.new_llm('mock:gpt-4') - mock_class.assert_called_once_with(model='gpt-4') - - mock_class.reset_mock() - models.LLMRegistry.new_llm('MockLlm:gpt-4') - mock_class.assert_called_once_with(model='gpt-4') - - -def test_new_llm_with_non_matching_prefix(mocker): - """Test that new_llm keeps prefix if it does not match class.""" - mock_class = mocker.MagicMock() - mock_class.__name__ = 'MockLlm' - mocker.patch.object(models.LLMRegistry, 'resolve', return_value=mock_class) - - models.LLMRegistry.new_llm('custom:gpt-4') - mock_class.assert_called_once_with(model='custom:gpt-4') diff --git a/tests/unittests/optimization/gepa_root_agent_prompt_optimizer_test.py b/tests/unittests/optimization/gepa_root_agent_prompt_optimizer_test.py index c3db6e9934..bd5da524eb 100644 --- a/tests/unittests/optimization/gepa_root_agent_prompt_optimizer_test.py +++ b/tests/unittests/optimization/gepa_root_agent_prompt_optimizer_test.py @@ -77,7 +77,6 @@ def mock_agent(mocker): agent = mocker.MagicMock(spec=Agent) agent.instruction = "Initial instruction" agent.sub_agents = {} - agent.mode = None agent.clone.return_value = agent return agent diff --git a/tests/unittests/plugins/test_auto_tracing_plugin.py b/tests/unittests/plugins/test_auto_tracing_plugin.py deleted file mode 100644 index a21fb9eea3..0000000000 --- a/tests/unittests/plugins/test_auto_tracing_plugin.py +++ /dev/null @@ -1,461 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import asyncio -import sys -import types -from typing import Any -from unittest import mock - -from google.adk.plugins import auto_tracing_helpers -from google.adk.plugins import auto_tracing_plugin -from opentelemetry.sdk import trace as trace_sdk -from opentelemetry.sdk.trace import export as trace_export -from opentelemetry.sdk.trace.export import in_memory_span_exporter -import pytest - -_FIXTURE_MODULE_NAME = ( - "google.adk.tests.unittests.plugins.synthetic_test_fixture" -) - - -def _sync_fn(x: int) -> int: - return x + 1 - - -async def _async_fn(x: int) -> int: - return x * 2 - - -def _build_fixture_module() -> types.ModuleType: - module = types.ModuleType(_FIXTURE_MODULE_NAME) - module.__name__ = _FIXTURE_MODULE_NAME - for fn in (_sync_fn, _async_fn): - fn.__module__ = _FIXTURE_MODULE_NAME - - def _method(unused_self, x: int) -> int: - return x - 1 - - async def _async_method(unused_self, x: int) -> int: - return x + 10 - - _method.__module__ = _FIXTURE_MODULE_NAME - _async_method.__module__ = _FIXTURE_MODULE_NAME - cls = type("C", (), {"method": _method, "async_method": _async_method}) - cls.__module__ = _FIXTURE_MODULE_NAME - - module.sync_fn = _sync_fn - module.async_fn = _async_fn - module.C = cls - return module - - -def _install_module(name: str, fn) -> types.ModuleType: - mod = types.ModuleType(name) - mod.__name__ = name - fn.__module__ = name - mod.fn = fn - sys.modules[name] = mod - return mod - - -def _run_sync(module): - return module.sync_fn(7) - - -def _run_async(module): - return asyncio.run(module.async_fn(4)) - - -def _run_class_method(module): - return module.C().method(5) - - -def _run_class_async_method(module): - return asyncio.run(module.C().async_method(5)) - - -class _Ctx: - - def __init__(self, agent): - self.agent = agent - - -def _build_slot_agent(module: str, slots, attr: str, value): - cls = type("_Agent", (), {"__slots__": slots, "__module__": module}) - obj = cls() - setattr(obj, attr, value) - return obj - - -def _sub_helper(): - return 7 - - -@pytest.fixture -def fixture(): - exporter = in_memory_span_exporter.InMemorySpanExporter() - provider = trace_sdk.TracerProvider() - provider.add_span_processor(trace_export.SimpleSpanProcessor(exporter)) - tracer = provider.get_tracer("test") - module = _build_fixture_module() - sys.modules[_FIXTURE_MODULE_NAME] = module - yield types.SimpleNamespace(exporter=exporter, tracer=tracer, module=module) - sys.modules.pop(_FIXTURE_MODULE_NAME, None) - - -def _span_names(exporter) -> list[str]: - return [s.name for s in exporter.get_finished_spans()] - - -def _attrs_for(exporter, substr: str) -> dict[str, Any]: - matches = [ - dict(s.attributes or {}) - for s in exporter.get_finished_spans() - if substr in s.name - ] - assert matches, f"no span matched {substr!r} in {_span_names(exporter)}" - return matches[0] - - -def _instrument( - tracer, scope_prefixes=(_FIXTURE_MODULE_NAME,) -) -> auto_tracing_plugin.AutoTracingPlugin: - plugin = auto_tracing_plugin.AutoTracingPlugin( - tracer=tracer, extra_scope_prefixes=scope_prefixes - ) - asyncio.run(plugin.before_run_callback(invocation_context=None)) - return plugin - - -@pytest.mark.parametrize( - "run_fn,expected_substr", - [ - (_run_sync, "_sync_fn"), - (_run_async, "_async_fn"), - (_run_class_method, "._method"), - (_run_class_async_method, "._async_method"), - ], -) -def test_emits_span(fixture, run_fn, expected_substr): - _instrument(fixture.tracer) - run_fn(fixture.module) - assert any( - expected_substr in n for n in _span_names(fixture.exporter) - ), f"missing {expected_substr!r} in {_span_names(fixture.exporter)}" - - -@pytest.mark.parametrize( - "run_fn,expected_substr,expected_attrs", - [ - ( - _run_sync, - "_sync_fn", - {"adk.fn.arg.x": "7", "adk.fn.return": "8"}, - ), - (_run_async, "_async_fn", {"adk.fn.return": "8"}), - ], -) -def test_records_io(fixture, run_fn, expected_substr, expected_attrs): - _instrument(fixture.tracer) - run_fn(fixture.module) - attrs = _attrs_for(fixture.exporter, expected_substr) - assert {k: attrs.get(k) for k in expected_attrs} == expected_attrs - - -@pytest.mark.parametrize("attr", ["sync_fn", "async_fn"]) -def test_repeat_instrument_is_idempotent(fixture, attr): - plugin = _instrument(fixture.tracer) - first = getattr(fixture.module, attr) - asyncio.run(plugin.before_run_callback(invocation_context=None)) - assert getattr(fixture.module, attr) is first - - -@pytest.mark.parametrize("attr", ["sync_fn", "async_fn"]) -def test_wrapper_marker_is_true(fixture, attr): - _instrument(fixture.tracer) - assert ( - getattr(getattr(fixture.module, attr), auto_tracing_helpers.WRAPPED_ATTR) - is True - ) - - -def test_out_of_scope_module_is_not_instrumented(fixture): - name = "auto_tracing_plugin_test_not_in_scope" - mod = _install_module(name, lambda: 42) - try: - _instrument(fixture.tracer) - mod.fn() - assert f"{name}.fn" not in _span_names(fixture.exporter) - finally: - sys.modules.pop(name, None) - - -def test_records_exception(fixture): - name = "auto_tracing_plugin_test_boom" - - def boom(): - raise ValueError("kaboom") - - mod = _install_module(name, boom) - try: - _instrument(fixture.tracer, scope_prefixes=(name,)) - with pytest.raises(ValueError, match="kaboom"): - mod.fn() - attrs = _attrs_for(fixture.exporter, "boom") - assert attrs.get("adk.fn.exc_type") == "ValueError" - assert "kaboom" in attrs.get("adk.fn.exc_repr", "") - finally: - sys.modules.pop(name, None) - - -def test_walk_returns_quickly_on_none_agent(fixture): - plugin = auto_tracing_plugin.AutoTracingPlugin(tracer=fixture.tracer) - asyncio.run(plugin.before_run_callback(invocation_context=_Ctx(None))) - assert _span_names(fixture.exporter) == [] - - -def test_add_agent_scope_picks_up_agent_package(fixture): - pkg = "auto_tracing_plugin_test_agent_pkg" - mod_name = f"{pkg}.helpers" - - def helper(): - return 99 - - mod = _install_module(mod_name, helper) - try: - - class _Agent: - __module__ = f"{pkg}.agent" - - plugin = auto_tracing_plugin.AutoTracingPlugin(tracer=fixture.tracer) - asyncio.run(plugin.before_run_callback(invocation_context=_Ctx(_Agent()))) - mod.fn() - assert any("helper" in n for n in _span_names(fixture.exporter)), ( - f"agent pkg {pkg!r} was not absorbed;" - f" spans={_span_names(fixture.exporter)}" - ) - finally: - sys.modules.pop(mod_name, None) - - -@pytest.mark.parametrize( - "pkg,slots", - [ - ("auto_tracing_plugin_test_slots_pkg", ("child",)), - ("auto_tracing_plugin_test_str_slot_pkg", "child"), - ], -) -def test_add_agent_scope_walks_slots_attrs(fixture, pkg, slots): - sub_mod_name = f"{pkg}.sub" - mod = _install_module(sub_mod_name, _sub_helper) - try: - sub = type("_Sub", (), {"__module__": sub_mod_name})() - agent = _build_slot_agent(f"{pkg}.agent", slots, "child", sub) - plugin = auto_tracing_plugin.AutoTracingPlugin(tracer=fixture.tracer) - asyncio.run(plugin.before_run_callback(invocation_context=_Ctx(agent))) - mod.fn() - assert any("_sub_helper" in n for n in _span_names(fixture.exporter)), ( - f"slot-referenced pkg {pkg!r} was not absorbed;" - f" spans={_span_names(fixture.exporter)}" - ) - finally: - sys.modules.pop(sub_mod_name, None) - - -def test_add_agent_scope_does_not_fire_property_descriptors(fixture): - fired: list[str] = [] - - class _Agent: - __module__ = "auto_tracing_plugin_test_no_descriptor_pkg.agent" - - @property - def expensive(self): - fired.append("expensive") - raise RuntimeError("should never be invoked during scope walk") - - plugin = auto_tracing_plugin.AutoTracingPlugin(tracer=fixture.tracer) - asyncio.run(plugin.before_run_callback(invocation_context=_Ctx(_Agent()))) - assert fired == [], f"@property fired during agent-scope walk: {fired!r}" - - -def test_module_removed_mid_iteration_does_not_log_exception(fixture): - name = "auto_tracing_plugin_test_disappearing" - _install_module(name, lambda: 1) - try: - plugin = auto_tracing_plugin.AutoTracingPlugin( - tracer=fixture.tracer, extra_scope_prefixes=(name,) - ) - - class _DroppingModules(dict): - - def get(self, key, default=None): - if key == name: - return None - return super().get(key, default) - - dropping = _DroppingModules(sys.modules) - with ( - mock.patch.object( - auto_tracing_plugin.logger, "exception", autospec=True - ) as log_exc, - mock.patch.object(auto_tracing_plugin.sys, "modules", new=dropping), - ): - asyncio.run(plugin.before_run_callback(invocation_context=None)) - assert ( - not log_exc.called - ), f"unexpected logger.exception calls: {log_exc.call_args_list}" - assert name not in plugin._wrapped_modules - finally: - sys.modules.pop(name, None) - - -def test_repeat_instrument_does_not_rewrap(fixture): - plugin = _instrument(fixture.tracer) - assert getattr( - fixture.module.sync_fn, auto_tracing_helpers.WRAPPED_ATTR, False - ) - assert _FIXTURE_MODULE_NAME in plugin._wrapped_modules - with mock.patch.object(plugin, "_wrap_module", autospec=True) as wrap_module: - asyncio.run(plugin.before_run_callback(invocation_context=None)) - wrap_module.assert_not_called() - - -class _Slotted: - __slots__ = ("a", "b") - - def __init__(self): - self.a = 1 - self.b = "x" - - -class _Bare: - __slots__ = () - - -@pytest.mark.parametrize( - "instance,expected_substrings", - [ - (_Slotted(), ("_Slotted", "a=1", "b='x'")), - (_Bare(), ("<_Bare>",)), - ], -) -def test_summarize_default(instance, expected_substrings): - rendered = auto_tracing_helpers.safe_repr( - instance, auto_tracing_helpers.Caps() - ) - for s in expected_substrings: - assert s in rendered, rendered - - -def test_add_agent_scope_picks_up_top_level_module(fixture): - top_mod_name = "auto_tracing_plugin_test_top_level_pkg" - - def top_helper(): - return 1 - - mod = _install_module(top_mod_name, top_helper) - try: - - class _Agent: - __module__ = top_mod_name - - plugin = auto_tracing_plugin.AutoTracingPlugin(tracer=fixture.tracer) - asyncio.run(plugin.before_run_callback(invocation_context=_Ctx(_Agent()))) - mod.fn() - assert any("top_helper" in n for n in _span_names(fixture.exporter)), ( - f"top-level module {top_mod_name!r} not absorbed;" - f" spans={_span_names(fixture.exporter)}" - ) - finally: - sys.modules.pop(top_mod_name, None) - - -def test_signature_introspection_happens_once_per_wrap(fixture): - with mock.patch.object( - auto_tracing_helpers.inspect, "signature", autospec=True - ) as sig: - sig.side_effect = auto_tracing_helpers.inspect.signature - _instrument(fixture.tracer) - wrap_calls = sig.call_count - for _ in range(5): - _run_sync(fixture.module) - _run_async(fixture.module) - assert ( - sig.call_count == wrap_calls - ), f"inspect.signature called per-call: {wrap_calls} -> {sig.call_count}" - - -def test_async_gen_caps_buffered_items(fixture): - cap = 3 - total_yields = 100 - name = "auto_tracing_plugin_test_async_gen_cap" - - async def producer(): - for i in range(total_yields): - yield i - - mod = _install_module(name, producer) - try: - plugin = auto_tracing_plugin.AutoTracingPlugin( - tracer=fixture.tracer, - extra_scope_prefixes=(name,), - max_recorded_yields=cap, - ) - asyncio.run(plugin.before_run_callback(invocation_context=None)) - - async def drive(): - seen = [] - async for x in mod.fn(): - seen.append(x) - return seen - - out = asyncio.run(drive()) - assert out == list(range(total_yields)) - attrs = _attrs_for(fixture.exporter, "producer") - rendered = attrs.get("adk.fn.return", "") - assert f"{total_yields} items yielded" in rendered, rendered - assert f"first {cap}:" in rendered, rendered - assert f"+ {total_yields - cap} more" in rendered, rendered - finally: - sys.modules.pop(name, None) - - -def test_sync_gen_caps_buffered_items(fixture): - cap = 2 - total_yields = 50 - name = "auto_tracing_plugin_test_sync_gen_cap" - - def producer(): - for i in range(total_yields): - yield i - - mod = _install_module(name, producer) - try: - plugin = auto_tracing_plugin.AutoTracingPlugin( - tracer=fixture.tracer, - extra_scope_prefixes=(name,), - max_recorded_yields=cap, - ) - asyncio.run(plugin.before_run_callback(invocation_context=None)) - out = list(mod.fn()) - assert out == list(range(total_yields)) - attrs = _attrs_for(fixture.exporter, "producer") - rendered = attrs.get("adk.fn.return", "") - assert f"{total_yields} items yielded" in rendered, rendered - assert f"first {cap}:" in rendered, rendered - finally: - sys.modules.pop(name, None) diff --git a/tests/unittests/plugins/test_bigquery_agent_analytics_plugin.py b/tests/unittests/plugins/test_bigquery_agent_analytics_plugin.py index d265f605dd..5719adf2b4 100644 --- a/tests/unittests/plugins/test_bigquery_agent_analytics_plugin.py +++ b/tests/unittests/plugins/test_bigquery_agent_analytics_plugin.py @@ -635,55 +635,6 @@ async def test_event_denylist( await asyncio.sleep(0.01) mock_write_client.append_rows.assert_called_once() - @pytest.mark.asyncio - async def test_append_rows_sets_regional_routing_header( - self, - mock_write_client, - callback_context, - mock_auth_default, - mock_bq_client, - mock_to_arrow_schema, - dummy_arrow_schema, - mock_asyncio_to_thread, - ): - """Regression test for cross-region writes (issue #262). - - The Storage Write API streaming AppendRows RPC does not - auto-populate the request-routing header, so writes to a dataset - outside the US multiregion (e.g. northamerica-northeast1) fail with - a "session not found" / stream-not-found error unless the header is - set explicitly. Assert the header is passed to append_rows so the - request reaches the region that owns the write stream. - """ - _ = mock_auth_default - _ = mock_bq_client - config = bigquery_agent_analytics_plugin.BigQueryLoggerConfig() - async with managed_plugin( - PROJECT_ID, - DATASET_ID, - table_id=TABLE_ID, - config=config, - location="northamerica-northeast1", - ) as plugin: - await plugin._ensure_started() - mock_write_client.append_rows.reset_mock() - llm_request = llm_request_lib.LlmRequest( - model="gemini-pro", - contents=[types.Content(parts=[types.Part(text="Prompt")])], - ) - bigquery_agent_analytics_plugin.TraceManager.push_span(callback_context) - await plugin.before_model_callback( - callback_context=callback_context, llm_request=llm_request - ) - await asyncio.sleep(0.01) # Allow background task to run - mock_write_client.append_rows.assert_called_once() - metadata = mock_write_client.append_rows.call_args.kwargs.get("metadata") - assert metadata is not None, "append_rows must receive routing metadata" - assert ( - "x-goog-request-params", - f"write_stream={DEFAULT_STREAM_NAME}", - ) in tuple(metadata) - @pytest.mark.asyncio async def test_content_formatter( self, @@ -2142,6 +2093,56 @@ async def test_pickle_safety(self, mock_auth_default, mock_bq_client): finally: await plugin.shutdown() + @pytest.mark.asyncio + async def test_pickle_preserves_picklable_credentials( + self, mock_auth_default, mock_bq_client + ): + """Picklable user credentials survive pickle/unpickle.""" + import pickle + + picklable_creds = FakeCredentials() + plugin = bigquery_agent_analytics_plugin.BigQueryAgentAnalyticsPlugin( + PROJECT_ID, + DATASET_ID, + table_id=TABLE_ID, + credentials=picklable_creds, + ) + pickled = pickle.dumps(plugin) + unpickled = pickle.loads(pickled) + # User-provided picklable credentials are preserved. + assert unpickled._user_credentials is not None + assert unpickled._credentials is not None + await plugin.shutdown() + + @pytest.mark.asyncio + async def test_pickle_drops_non_picklable_credentials( + self, mock_auth_default, mock_bq_client + ): + """Non-picklable user credentials are dropped gracefully.""" + import pickle + + class NonPicklableCreds(google.auth.credentials.Credentials): + + def refresh(self, request): + pass + + def __getstate__(self): + raise TypeError("cannot pickle") + + plugin = bigquery_agent_analytics_plugin.BigQueryAgentAnalyticsPlugin( + PROJECT_ID, + DATASET_ID, + table_id=TABLE_ID, + credentials=NonPicklableCreds(), + ) + # Should not raise — non-picklable credentials are dropped. + pickled = pickle.dumps(plugin) + unpickled = pickle.loads(pickled) + # Credentials fall back to None (ADC on next use). + assert unpickled._user_credentials is None + assert unpickled._credentials is None + await plugin.shutdown() + @pytest.mark.asyncio async def test_span_hierarchy_llm_call( self, @@ -2274,56 +2275,53 @@ class LocalIncident: assert content_json["result"]["kpi_missed"][0]["kpi"] == "latency" @pytest.mark.asyncio - async def test_push_pop_does_not_call_tracer_start_span( + async def test_otel_integration( self, callback_context, ): - """Regression guard for the duplicate-Cloud-Trace bug (issue #94). - - The plugin must NOT call ``tracer.start_span(...)`` from - ``push_span`` / ``pop_span``. Any owned OTel span goes through - the globally configured exporter (e.g. Cloud Trace via Agent - Engine telemetry) and surfaces as a duplicate span next to the - framework's real one. The plugin's internal stack is sufficient - for ``span_id`` / ``parent_span_id`` / ``trace_id`` resolution - without creating an exportable span. - """ + """Verifies OpenTelemetry integration in TraceManager.""" + # Mock the tracer and span mock_tracer = mock.Mock() + mock_span = mock.Mock() + mock_context = mock.Mock() + # Setup mock IDs (128-bit trace_id, 64-bit span_id) + trace_id_int = 0x12345678123456781234567812345678 + span_id_int = 0x1234567812345678 + mock_context.trace_id = trace_id_int + mock_context.span_id = span_id_int + mock_context.is_valid = True + mock_span.get_span_context.return_value = mock_context + mock_span.start_time = 1234567890000000000 # Mock start time in ns + mock_tracer.start_span.return_value = mock_span + # Patch the global tracer in the plugin module with mock.patch( - "google.adk.plugins.bigquery_agent_analytics_plugin.tracer", - mock_tracer, + "google.adk.plugins.bigquery_agent_analytics_plugin.tracer", mock_tracer ): + # Test push_span span_id = bigquery_agent_analytics_plugin.TraceManager.push_span( callback_context, "test_span" ) - assert isinstance(span_id, str) and len(span_id) == 16 - - trace_id = bigquery_agent_analytics_plugin.TraceManager.get_trace_id( - callback_context - ) - assert isinstance(trace_id, str) and len(trace_id) == 32 - - popped_span_id, _duration_ms = ( - bigquery_agent_analytics_plugin.TraceManager.pop_span() - ) - assert popped_span_id == span_id - - mock_tracer.start_span.assert_not_called() + mock_tracer.start_span.assert_called_with("test_span", context=None) + assert span_id == format(span_id_int, "016x") + # Test get_trace_id + # We need to mock trace.get_current_span() to return our mock span + # because push_span calls trace.attach(), which affects the global context + with mock.patch( + "opentelemetry.trace.get_current_span", return_value=mock_span + ): + trace_id = bigquery_agent_analytics_plugin.TraceManager.get_trace_id( + callback_context + ) + assert trace_id == format(trace_id_int, "032x") + # Test pop_span + # pop_span calls span.end() + bigquery_agent_analytics_plugin.TraceManager.pop_span() + mock_span.end.assert_called_once() @pytest.mark.asyncio - async def test_push_pop_does_not_export_spans_through_real_provider( - self, callback_context - ): - """End-to-end regression guard against #94 with a real OTel - - provider + in-memory exporter. - - Wires an ``InMemorySpanExporter`` to a real ``TracerProvider``, - drives a push/pop cycle through ``TraceManager``, and asserts - that **zero** spans were exported. Pre-fix behavior was to - export one span per push/pop pair — visible to Cloud Trace as - duplicate spans alongside the framework's real ones. - """ + async def test_otel_integration_real_provider(self, callback_context): + """Verifies TraceManager with a real OpenTelemetry TracerProvider.""" + # Setup OTEL with in-memory exporter # pylint: disable=g-import-not-at-top from opentelemetry.sdk import trace as trace_sdk from opentelemetry.sdk.trace import export as trace_export @@ -2332,188 +2330,36 @@ async def test_push_pop_does_not_export_spans_through_real_provider( # pylint: enable=g-import-not-at-top provider = trace_sdk.TracerProvider() exporter = in_memory_span_exporter.InMemorySpanExporter() - provider.add_span_processor(trace_export.SimpleSpanProcessor(exporter)) - real_tracer = provider.get_tracer("test_tracer") - + processor = trace_export.SimpleSpanProcessor(exporter) + provider.add_span_processor(processor) + tracer = provider.get_tracer("test_tracer") + # Patch the global tracer in the plugin module with mock.patch( - "google.adk.plugins.bigquery_agent_analytics_plugin.tracer", - real_tracer, + "google.adk.plugins.bigquery_agent_analytics_plugin.tracer", tracer ): + # 1. Start a span span_id = bigquery_agent_analytics_plugin.TraceManager.push_span( callback_context, "test_span" ) - assert exporter.get_finished_spans() == () - + # Verify a span was started but not ended + current_spans = exporter.get_finished_spans() + assert not current_spans + # Verify we can retrieve the trace ID trace_id = bigquery_agent_analytics_plugin.TraceManager.get_trace_id( callback_context ) - assert trace_id is not None and len(trace_id) == 32 - + assert trace_id is not None + # 2. End the span popped_span_id, _ = ( bigquery_agent_analytics_plugin.TraceManager.pop_span() ) assert popped_span_id == span_id - - assert exporter.get_finished_spans() == (), ( - "Plugin must not export OTel spans; any owned span would" - " surface as a duplicate in Cloud Trace alongside the" - " framework's real spans (issue #94)." - ) - - provider.shutdown() - - @pytest.mark.asyncio - async def test_push_span_inherits_ambient_trace_id(self, callback_context): - """When the host has an ambient OTel span (e.g. - - Agent Engine's Runner span), the plugin's ``trace_id`` MUST inherit from it - so BigQuery rows correlate with the host's Cloud Trace entries via a shared - ``trace_id``. - """ - # pylint: disable=g-import-not-at-top - from opentelemetry import trace as otel_trace - from opentelemetry.sdk import trace as trace_sdk - - # pylint: enable=g-import-not-at-top - provider = trace_sdk.TracerProvider() - host_tracer = provider.get_tracer("host_tracer") - - # Clear any state on the plugin's contextvar stack. - bigquery_agent_analytics_plugin._span_records_ctx.set(None) - - with host_tracer.start_as_current_span("ambient-host-span") as host_span: - expected_trace_id = format(host_span.get_span_context().trace_id, "032x") - - # Plugin pushes its first internal span inside the ambient span. - bigquery_agent_analytics_plugin.TraceManager.push_span( - callback_context, "bqaa-span" - ) - - plugin_trace_id = ( - bigquery_agent_analytics_plugin.TraceManager.get_trace_id( - callback_context - ) - ) - assert plugin_trace_id == expected_trace_id, ( - "Plugin must inherit ambient trace_id so BigQuery rows join" - " to Cloud Trace via the same trace_id" - ) - - # Nested plugin push also stays under the ambient trace_id. - bigquery_agent_analytics_plugin.TraceManager.push_span( - callback_context, "bqaa-nested" - ) - assert ( - bigquery_agent_analytics_plugin.TraceManager.get_trace_id( - callback_context - ) - == expected_trace_id - ) - - bigquery_agent_analytics_plugin.TraceManager.clear_stack() - provider.shutdown() - del otel_trace # unused; imported for symmetry with provider setup - - @pytest.mark.asyncio - async def test_llm_request_response_share_span_id_contract( - self, callback_context - ): - """Lifecycle contract: ``LLM_REQUEST`` and ``LLM_RESPONSE`` for the - - same model call share one ``span_id`` and one ``trace_id``. - - Models the structural pattern the real callbacks use: - * ``before_model_callback`` calls ``push_span(...)`` and writes - ``LLM_REQUEST`` with the returned ``span_id``. - * ``after_model_callback`` calls ``get_current_span_id()`` / - ``pop_span()`` and writes ``LLM_RESPONSE`` with the same - ``span_id``. - - A future change must not split this pair onto two different - ``span_id``s — that would break the documented BigQuery query - shape and the BQAA join contract. - """ - bigquery_agent_analytics_plugin._span_records_ctx.set(None) - TM = bigquery_agent_analytics_plugin.TraceManager - - # before_model_callback path. - pushed_span_id = TM.push_span(callback_context, "llm_request") - request_trace_id = TM.get_trace_id(callback_context) - - # after_model_callback (final chunk) path. - response_top_of_stack = TM.get_current_span_id() - popped_span_id, _duration_ms = TM.pop_span() - response_trace_id = TM.get_trace_id(callback_context) - - assert response_top_of_stack == pushed_span_id - assert popped_span_id == pushed_span_id - # trace_id resolved on the response side may have to fall back - # past the now-empty stack — but if it does resolve, it must - # match what the request observed. An empty-stack fallback to - # invocation_id is acceptable here; what we are guarding against - # is the *pair* drifting onto two structurally different ids. - if response_trace_id is not None and len(response_trace_id) == 32: - assert response_trace_id == request_trace_id - - @pytest.mark.asyncio - async def test_tool_starting_completed_share_span_id_contract( - self, callback_context - ): - """Lifecycle contract: ``TOOL_STARTING`` and ``TOOL_COMPLETED`` for - - the same tool call share one ``span_id``. - - Same shape as the LLM pair above — push on before, pop on after, - same id on both sides. - """ - bigquery_agent_analytics_plugin._span_records_ctx.set(None) - TM = bigquery_agent_analytics_plugin.TraceManager - - # before_tool_callback path. - pushed_span_id = TM.push_span(callback_context, "tool") - starting_trace_id = TM.get_trace_id(callback_context) - - # after_tool_callback path. - popped_span_id, _duration_ms = TM.pop_span() - - assert popped_span_id == pushed_span_id - assert isinstance(starting_trace_id, str) and len(starting_trace_id) == 32 - - @pytest.mark.asyncio - async def test_streaming_llm_response_shares_span_id_until_final_contract( - self, callback_context - ): - """Streaming-response contract. - - On a streaming LLM call, ``after_model_callback`` is fired once - per partial chunk *plus* once for the final chunk. Partial fires - do NOT pop the span (see ``after_model_callback:3354-3363``) — - they only read ``get_current_span_id()`` and record first-token - timing. Only the final fire calls ``pop_span()``. - - All resulting ``LLM_RESPONSE`` rows therefore share one - ``span_id`` (the same as the paired ``LLM_REQUEST``). A future - change must not "dedupe" the partial rows by switching to a fresh - span id per chunk — those rows are real and intentional. - """ - bigquery_agent_analytics_plugin._span_records_ctx.set(None) - TM = bigquery_agent_analytics_plugin.TraceManager - - pushed_span_id = TM.push_span(callback_context, "llm_request") - - # Simulate three partial chunks: each callback observes the same - # span_id at top of stack and does NOT pop. - for _ in range(3): - assert TM.get_current_span_id() == pushed_span_id - - # Final chunk: pop_span returns the same id and a populated - # latency. - popped_span_id, duration_ms = TM.pop_span() - assert popped_span_id == pushed_span_id - assert duration_ms is not None and duration_ms >= 0 - - # Stack must be empty after the final chunk. - assert TM.get_current_span_id() is None + # Verify span is now finished and exported + finished_spans = exporter.get_finished_spans() + assert len(finished_spans) == 1 + assert finished_spans[0].name == "test_span" + assert format(finished_spans[0].context.span_id, "016x") == span_id + assert format(finished_spans[0].context.trace_id, "032x") == trace_id @pytest.mark.asyncio async def test_keyword_identifiers_emission_default( @@ -5406,75 +5252,72 @@ async def test_confirmation_flow_emits_hitl_events( agent = LlmAgent(name="hitl_agent", model=mock_model, tools=[tool]) runner = testing_utils.InMemoryRunner(root_agent=agent, plugins=[bq_plugin]) - try: - # -- Turn 1: user query → LLM calls tool → HITL pause -- - events_turn1 = await runner.run_async( - testing_utils.UserContent("run my_action") - ) - - # Find the adk_request_confirmation function call - confirmation_fc_id = None - for ev in events_turn1: - if ev.content and ev.content.parts: - for part in ev.content.parts: - if ( - hasattr(part, "function_call") - and part.function_call - and part.function_call.name - == REQUEST_CONFIRMATION_FUNCTION_CALL_NAME - ): - confirmation_fc_id = part.function_call.id - break - if confirmation_fc_id: - break + # -- Turn 1: user query → LLM calls tool → HITL pause -- + events_turn1 = await runner.run_async( + testing_utils.UserContent("run my_action") + ) + + # Find the adk_request_confirmation function call + confirmation_fc_id = None + for ev in events_turn1: + if ev.content and ev.content.parts: + for part in ev.content.parts: + if ( + hasattr(part, "function_call") + and part.function_call + and part.function_call.name + == REQUEST_CONFIRMATION_FUNCTION_CALL_NAME + ): + confirmation_fc_id = part.function_call.id + break + if confirmation_fc_id: + break - assert ( - confirmation_fc_id is not None - ), "Expected adk_request_confirmation function call in turn 1" - - # -- Turn 2: user sends confirmation → tool re-executes -- - user_confirmation = testing_utils.UserContent( - Part( - function_response=FunctionResponse( - id=confirmation_fc_id, - name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, - response={"confirmed": True}, - ) - ) - ) - events_turn2 = await runner.run_async(user_confirmation) + assert ( + confirmation_fc_id is not None + ), "Expected adk_request_confirmation function call in turn 1" + + # -- Turn 2: user sends confirmation → tool re-executes -- + user_confirmation = testing_utils.UserContent( + Part( + function_response=FunctionResponse( + id=confirmation_fc_id, + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + response={"confirmed": True}, + ) + ) + ) + events_turn2 = await runner.run_async(user_confirmation) - # -- Deterministically wait for the async BQ writer to drain -- - await bq_plugin.flush() + # -- Give the async BQ writer a moment to flush -- + await asyncio.sleep(0.2) - # -- Collect all BQ rows -- - rows = await _get_captured_rows_async( - mock_write_client, dummy_arrow_schema - ) - event_types = [r["event_type"] for r in rows] + # -- Collect all BQ rows -- + rows = await _get_captured_rows_async(mock_write_client, dummy_arrow_schema) + event_types = [r["event_type"] for r in rows] - # -- Verify standard events are present -- - assert "TOOL_STARTING" in event_types - assert "TOOL_COMPLETED" in event_types + # -- Verify standard events are present -- + assert "TOOL_STARTING" in event_types + assert "TOOL_COMPLETED" in event_types - # -- Verify HITL-specific events are present -- - assert ( - "HITL_CONFIRMATION_REQUEST" in event_types - ), f"Expected HITL_CONFIRMATION_REQUEST in {event_types}" - assert ( - "HITL_CONFIRMATION_REQUEST_COMPLETED" in event_types - ), f"Expected HITL_CONFIRMATION_REQUEST_COMPLETED in {event_types}" - - # -- Verify HITL events have correct tool name in content -- - hitl_rows = [r for r in rows if r["event_type"].startswith("HITL_")] - for row in hitl_rows: - content = json.loads(row["content"]) if row["content"] else {} - assert content.get("tool") == "adk_request_confirmation", ( - "HITL event should reference 'adk_request_confirmation'," - f" got {content.get('tool')}" - ) - finally: - await bq_plugin.shutdown() + # -- Verify HITL-specific events are present -- + assert ( + "HITL_CONFIRMATION_REQUEST" in event_types + ), f"Expected HITL_CONFIRMATION_REQUEST in {event_types}" + assert ( + "HITL_CONFIRMATION_REQUEST_COMPLETED" in event_types + ), f"Expected HITL_CONFIRMATION_REQUEST_COMPLETED in {event_types}" + + # -- Verify HITL events have correct tool name in content -- + hitl_rows = [r for r in rows if r["event_type"].startswith("HITL_")] + for row in hitl_rows: + content = json.loads(row["content"]) if row["content"] else {} + assert content.get("tool") == "adk_request_confirmation", ( + "HITL event should reference 'adk_request_confirmation'," + f" got {content.get('tool')}" + ) + + await bq_plugin.shutdown() @pytest.mark.asyncio async def test_regular_tool_does_not_emit_hitl_events( @@ -5523,26 +5366,23 @@ def regular_tool() -> str: agent = LlmAgent(name="regular_agent", model=mock_model, tools=[tool]) runner = testing_utils.InMemoryRunner(root_agent=agent, plugins=[bq_plugin]) - try: - await runner.run_async(testing_utils.UserContent("run regular_tool")) - await bq_plugin.flush() + await runner.run_async(testing_utils.UserContent("run regular_tool")) + await asyncio.sleep(0.2) - rows = await _get_captured_rows_async( - mock_write_client, dummy_arrow_schema - ) - event_types = [r["event_type"] for r in rows] + rows = await _get_captured_rows_async(mock_write_client, dummy_arrow_schema) + event_types = [r["event_type"] for r in rows] - # Standard tool events should be present - assert "TOOL_STARTING" in event_types - assert "TOOL_COMPLETED" in event_types + # Standard tool events should be present + assert "TOOL_STARTING" in event_types + assert "TOOL_COMPLETED" in event_types - # No HITL events - hitl_events = [et for et in event_types if et.startswith("HITL_")] - assert ( - hitl_events == [] - ), f"Expected no HITL events for regular tool, got {hitl_events}" - finally: - await bq_plugin.shutdown() + # No HITL events + hitl_events = [et for et in event_types if et.startswith("HITL_")] + assert ( + hitl_events == [] + ), f"Expected no HITL events for regular tool, got {hitl_events}" + + await bq_plugin.shutdown() # ============================================================================== @@ -6057,10 +5897,8 @@ async def test_trace_id_continuity_no_ambient_span(self, callback_context): TM = bigquery_agent_analytics_plugin.TraceManager - # Wire a real TracerProvider with an in-memory exporter so we can - # also assert the plugin path does NOT export anything through it. - # (push_span no longer creates OTel spans — see _SpanRecord; the - # exporter is here as a regression guard, not a span source.) + # Create a real TracerProvider and patch the plugin's module-level + # tracer so push_span creates valid spans with proper trace_ids. exporter = InMemorySpanExporter() provider = SdkProvider() provider.add_span_processor(SimpleSpanProcessor(exporter)) @@ -6382,11 +6220,8 @@ async def test_starting_completed_same_span_with_ambient( assert len(agent_starting) == 1 assert len(agent_completed) == 1 - # Both events must share the same span_id (the plugin-internal - # agent span pushed by before_agent_callback and popped by - # after_agent_callback). The lifecycle-pair invariant holds - # regardless of whether the id comes from a plugin-minted hex - # string or an ambient OTel span. + # Both events must share the same span_id (the ambient + # invoke_agent span) — no plugin-synthetic override. assert agent_starting[0]["span_id"] == agent_completed[0]["span_id"] assert ( agent_starting[0]["parent_span_id"] @@ -6571,17 +6406,8 @@ def test_ensure_invocation_span_clears_stale_records(self, callback_context): provider.shutdown() - def test_clear_stack_does_not_export_spans(self, callback_context): - """``clear_stack()`` clears the internal records but does NOT - - export any OTel spans (issue #94 regression guard). - - Pre-fix, ``clear_stack()`` called ``record.span.end()`` for every - owned record, which delivered the now-finished span to whatever - exporter the host had wired — duplicating it next to the - framework's real span in Cloud Trace. Post-fix the plugin owns - no OTel span at all; ``clear_stack()`` only resets the contextvar. - """ + def test_clear_stack_ends_owned_spans(self, callback_context): + """clear_stack() ends all owned spans.""" from opentelemetry.sdk.trace import TracerProvider as SdkProvider from opentelemetry.sdk.trace.export import SimpleSpanProcessor from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter @@ -6602,8 +6428,6 @@ def test_clear_stack_does_not_export_spans(self, callback_context): records = list(bigquery_agent_analytics_plugin._span_records_ctx.get()) assert all(r.owns_span for r in records) - # No exported spans yet (the plugin never creates any). - assert exporter.get_finished_spans() == () TM.clear_stack() @@ -6611,12 +6435,9 @@ def test_clear_stack_does_not_export_spans(self, callback_context): result = bigquery_agent_analytics_plugin._span_records_ctx.get() assert result == [] - # Still no exported spans — the regression guard for #94. - assert exporter.get_finished_spans() == (), ( - "clear_stack() must not export OTel spans; any owned span" - " would surface as a duplicate in Cloud Trace alongside the" - " framework's real spans (issue #94)." - ) + # Both owned spans should have been ended (exported). + exported = exporter.get_finished_spans() + assert len(exported) == 2 provider.shutdown() @@ -8010,118 +7831,3 @@ async def test_skips_executable_code_only_events( ) await asyncio.sleep(0.05) assert mock_write_client.append_rows.call_count == 0 - - -class TestDropStats: - """Tests that dropped events are counted and exposed via get_drop_stats.""" - - def _make_processor( - self, arrow_schema, *, queue_max_size=10, retry_config=None - ): - """Builds a BatchProcessor with a mock write client (writer not started).""" - return bigquery_agent_analytics_plugin.BatchProcessor( - write_client=mock.MagicMock(), - arrow_schema=arrow_schema, - write_stream=DEFAULT_STREAM_NAME, - batch_size=1, - flush_interval=1.0, - retry_config=( - retry_config or bigquery_agent_analytics_plugin.RetryConfig() - ), - queue_max_size=queue_max_size, - shutdown_timeout=10.0, - ) - - def _stub_arrow_prep(self, bp): - """Stubs Arrow serialization so write tests need no real row schema.""" - fake_batch = mock.MagicMock() - fake_batch.serialize.return_value.to_pybytes.return_value = b"batch" - bp._prepare_arrow_batch = mock.MagicMock(return_value=fake_batch) - - @pytest.mark.asyncio - async def test_queue_full_drops_are_counted(self, dummy_arrow_schema): - # Writer is not started, so a size-1 queue fills after one append and the - # next two appends overflow and are dropped. - bp = self._make_processor(dummy_arrow_schema, queue_max_size=1) - await bp.append({"event": 0}) - await bp.append({"event": 1}) - await bp.append({"event": 2}) - assert bp.get_drop_stats()["queue_full"] == 2 - assert bp.dropped_event_count == 2 - - @pytest.mark.asyncio - async def test_retry_exhaustion_drops_are_counted(self, dummy_arrow_schema): - # max_retries=0 with zero delay drops on the first failure without sleeping. - retry_config = bigquery_agent_analytics_plugin.RetryConfig( - max_retries=0, initial_delay=0.0, multiplier=1.0, max_delay=0.0 - ) - bp = self._make_processor(dummy_arrow_schema, retry_config=retry_config) - self._stub_arrow_prep(bp) - - async def fake_append_rows(requests, **kwargs): - del requests, kwargs - resp = mock.MagicMock() - resp.row_errors = [] - resp.error = mock.MagicMock() - resp.error.code = bigquery_agent_analytics_plugin._GRPC_UNAVAILABLE - resp.error.message = "unavailable" - return _async_gen(resp) - - bp.write_client.append_rows.side_effect = fake_append_rows - - await bp._write_rows_with_retry([{"a": 1}, {"a": 2}]) - - assert bp.get_drop_stats()["retry_exhausted"] == 2 - assert bp.dropped_event_count == 2 - - @pytest.mark.asyncio - async def test_non_retryable_drops_are_counted(self, dummy_arrow_schema): - bp = self._make_processor(dummy_arrow_schema) - self._stub_arrow_prep(bp) - - async def fake_append_rows(requests, **kwargs): - del requests, kwargs - resp = mock.MagicMock() - resp.row_errors = [] - resp.error = mock.MagicMock() - resp.error.code = 3 # INVALID_ARGUMENT, non-retryable. - resp.error.message = "bad request" - return _async_gen(resp) - - bp.write_client.append_rows.side_effect = fake_append_rows - - await bp._write_rows_with_retry([{"a": 1}]) - - assert bp.get_drop_stats()["non_retryable"] == 1 - assert bp.dropped_event_count == 1 - - def test_plugin_get_drop_stats_aggregates_across_loops( - self, dummy_arrow_schema - ): - plugin = bigquery_agent_analytics_plugin.BigQueryAgentAnalyticsPlugin( - project_id=PROJECT_ID, dataset_id=DATASET_ID, table_id=TABLE_ID - ) - bp1 = self._make_processor(dummy_arrow_schema) - bp2 = self._make_processor(dummy_arrow_schema) - bp1._dropped["queue_full"] = 3 - bp1._dropped["retry_exhausted"] = 1 - bp2._dropped["queue_full"] = 4 - loop1 = mock.MagicMock(spec=asyncio.AbstractEventLoop) - loop2 = mock.MagicMock(spec=asyncio.AbstractEventLoop) - plugin._loop_state_by_loop[loop1] = ( - bigquery_agent_analytics_plugin._LoopState(mock.MagicMock(), bp1) - ) - plugin._loop_state_by_loop[loop2] = ( - bigquery_agent_analytics_plugin._LoopState(mock.MagicMock(), bp2) - ) - - stats = plugin.get_drop_stats() - - assert stats["queue_full"] == 7 - assert stats["retry_exhausted"] == 1 - - def test_plugin_get_drop_stats_empty_without_processor(self): - plugin = bigquery_agent_analytics_plugin.BigQueryAgentAnalyticsPlugin( - project_id=PROJECT_ID, dataset_id=DATASET_ID, table_id=TABLE_ID - ) - assert plugin.get_drop_stats() == {} diff --git a/tests/unittests/plugins/test_plugin_manager.py b/tests/unittests/plugins/test_plugin_manager.py index 6c72a2a665..ba070ea8f3 100644 --- a/tests/unittests/plugins/test_plugin_manager.py +++ b/tests/unittests/plugins/test_plugin_manager.py @@ -317,49 +317,3 @@ async def slow_close(): assert "Failed to close plugins: 'plugin1': TimeoutError" in str( excinfo.value ) - - -@pytest.mark.asyncio -async def test_close_is_noop_after_set_skip_closing_plugins( - plugin1: TestPlugin, -): - """Tests that close is a no-op after set_skip_closing_plugins(True).""" - plugin1.close = AsyncMock() - service = PluginManager(plugins=[plugin1]) - service.set_skip_closing_plugins(True) - - await service.close() - - plugin1.close.assert_not_awaited() - - -@pytest.mark.asyncio -async def test_set_skip_closing_plugins_bypasses_close_timeout( - plugin1: TestPlugin, -): - """Tests that set_skip_closing_plugins(True) bypasses close timeout.""" - - async def slow_close(): - await asyncio.sleep(10) # Would otherwise time out. - - plugin1.close = slow_close - service = PluginManager(plugins=[plugin1], close_timeout=0.01) - service.set_skip_closing_plugins(True) - - # Should return immediately without raising. - await service.close() - - -@pytest.mark.asyncio -async def test_set_skip_closing_plugins_false_reverts_to_closing( - plugin1: TestPlugin, -): - """Tests that set_skip_closing_plugins(False) re-enables closing.""" - plugin1.close = AsyncMock() - service = PluginManager(plugins=[plugin1]) - service.set_skip_closing_plugins(True) - service.set_skip_closing_plugins(False) - - await service.close() - - plugin1.close.assert_awaited_once() diff --git a/tests/unittests/plugins/test_reflect_retry_tool_plugin.py b/tests/unittests/plugins/test_reflect_retry_tool_plugin.py index 2625926470..afe0e0e010 100644 --- a/tests/unittests/plugins/test_reflect_retry_tool_plugin.py +++ b/tests/unittests/plugins/test_reflect_retry_tool_plugin.py @@ -640,8 +640,6 @@ def increase(x: int) -> int: ) events = await runner.run_async_with_new_session("test") - # Filter out agent_state events (no content). - events = [e for e in events if e.content is not None] # Assert that the first event is a function call with the wrong name assert events[0].content.parts[0].function_call.name == "increase_by_one" diff --git a/tests/unittests/runners/test_pause_invocation.py b/tests/unittests/runners/test_pause_invocation.py index 3493674aa8..07edd6c063 100644 --- a/tests/unittests/runners/test_pause_invocation.py +++ b/tests/unittests/runners/test_pause_invocation.py @@ -21,8 +21,10 @@ from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import LlmAgent from google.adk.agents.loop_agent import LoopAgent +from google.adk.agents.loop_agent import LoopAgentState from google.adk.agents.parallel_agent import ParallelAgent from google.adk.agents.sequential_agent import SequentialAgent +from google.adk.agents.sequential_agent import SequentialAgentState from google.adk.apps.app import App from google.adk.apps.app import ResumabilityConfig from google.adk.events.event import Event @@ -41,9 +43,8 @@ def _transfer_call_part(agent_name: str) -> Part: ) -def test_tool(): - """A test tool; returns None to simulate a pending long-running operation.""" - return None +def test_tool() -> str: + return "result" class _TestingAgent(BaseAgent): @@ -123,11 +124,14 @@ def test_pause_on_long_running_function_call( runner: testing_utils.InMemoryRunner, ): """Tests that a single LlmAgent pauses on long running function call.""" - actual = testing_utils.simplify_resumable_app_events(runner.run("test")) - behavioral = [e for e in actual if not isinstance(e[1], dict)] - assert behavioral == [ - # execute_tools yields the interrupt event with long_running_tool_ids. + assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ ("root_agent", Part.from_function_call(name="test_tool", args={})), + ( + "root_agent", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), ] @@ -162,66 +166,65 @@ def test_pause_first_agent_on_long_running_function_call( runner: testing_utils.InMemoryRunner, ): """Tests that a SequentialAgent pauses on the first sub-agent.""" - actual = testing_utils.simplify_resumable_app_events(runner.run("test")) - behavioral = [e for e in actual if not isinstance(e[1], dict)] - assert behavioral == [ + assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ + ( + "root_agent", + SequentialAgentState(current_sub_agent="sub_agent_1").model_dump( + mode="json" + ), + ), ("sub_agent_1", Part.from_function_call(name="test_tool", args={})), + ( + "sub_agent_1", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), ] - @pytest.mark.xfail( - reason=( - "Tests implementation details that are different in V2 and will be" - " deprecated." - ) - ) @pytest.mark.asyncio def test_pause_second_agent_on_long_running_function_call( self, + runner: testing_utils.InMemoryRunner, ): """Tests that a single LlmAgent pauses on long running function call.""" - # Construct sub_agent_1 with regular FunctionTool (not long-running). - sub_agent_1 = LlmAgent( - name="sub_agent_1", - model=self.mock_model( - responses=[ - Part.from_function_call(name="test_tool", args={}), - Part.from_text(text="model response after tool call"), - ] - ), - tools=[FunctionTool(func=test_tool)], - ) - sub_agent_2 = LlmAgent( - name="sub_agent_2", - model=self.mock_model( - responses=[Part.from_function_call(name="test_tool", args={})] + # Change the base sequential agent, so that the first agent does not pause. + runner.root_agent.sub_agents[0].tools = [FunctionTool(func=test_tool)] + runner.root_agent.sub_agents[0].model = self.mock_model( + responses=[ + Part.from_function_call(name="test_tool", args={}), + Part.from_text(text="model response after tool call"), + ] + ) + assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ + ( + "root_agent", + SequentialAgentState(current_sub_agent="sub_agent_1").model_dump( + mode="json" + ), ), - tools=[LongRunningFunctionTool(func=test_tool)], - ) - agent = SequentialAgent( - name="root_agent", - sub_agents=[sub_agent_1, sub_agent_2], - ) - app = App( - name="test_app", - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - actual = testing_utils.simplify_resumable_app_events(runner.run("test")) - behavioral = [e for e in actual if not isinstance(e[1], dict)] - assert behavioral == [ ("sub_agent_1", Part.from_function_call(name="test_tool", args={})), ( "sub_agent_1", Part.from_function_response( - name="test_tool", response={"result": None} + name="test_tool", response={"result": "result"} ), ), ("sub_agent_1", "model response after tool call"), - # Wrapper emits output before END_OF_AGENT. - ("root_agent", "model response after tool call"), ("sub_agent_1", END_OF_AGENT), + ( + "root_agent", + SequentialAgentState(current_sub_agent="sub_agent_2").model_dump( + mode="json" + ), + ), ("sub_agent_2", Part.from_function_call(name="test_tool", args={})), + ( + "sub_agent_2", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), ] @@ -312,24 +315,10 @@ def test_pause_on_long_running_function_call( @pytest.mark.asyncio def test_pause_on_multiple_long_running_function_calls( self, + runner: testing_utils.InMemoryRunner, ): """Tests that a ParallelAgent pauses on long running function calls.""" - nested_sub_agent_1 = LlmAgent( - name="nested_sub_agent_1", - model=self.mock_model( - responses=[Part.from_function_call(name="test_tool", args={})] - ), - tools=[LongRunningFunctionTool(func=test_tool)], - ) - nested_sub_agent_2 = _TestingAgent( - name="nested_sub_agent_2", - delay=0.5, - ) - nested_parallel_agent = ParallelAgent( - name="nested_parallel_agent", - sub_agents=[nested_sub_agent_1, nested_sub_agent_2], - ) - sub_agent_1 = LlmAgent( + runner.root_agent.sub_agents[0] = LlmAgent( name="sub_agent_1", model=self.mock_model( responses=[ @@ -338,16 +327,6 @@ def test_pause_on_multiple_long_running_function_calls( ), tools=[LongRunningFunctionTool(func=test_tool)], ) - agent = ParallelAgent( - name="root_agent", - sub_agents=[sub_agent_1, nested_parallel_agent], - ) - app = App( - name="test_app", - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) simplified_events = testing_utils.simplify_resumable_app_events( runner.run("test") ) @@ -401,26 +380,34 @@ def agent(self) -> BaseAgent: max_iterations=2, ) - @pytest.mark.xfail( - reason=( - "Tests implementation details that are different in V2 and will be" - " deprecated." - ) - ) @pytest.mark.asyncio def test_pause_on_long_running_function_call( self, runner: testing_utils.InMemoryRunner, ): """Tests that a LoopAgent pauses on long running function call.""" - actual = testing_utils.simplify_resumable_app_events(runner.run("test")) - behavioral = [e for e in actual if not isinstance(e[1], dict)] - assert behavioral == [ + assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ + ( + "root_agent", + LoopAgentState(current_sub_agent="sub_agent_1").model_dump( + mode="json" + ), + ), ("sub_agent_1", "sub agent 1 response"), - # Wrapper emits output before END_OF_AGENT. - ("root_agent", "sub agent 1 response"), ("sub_agent_1", END_OF_AGENT), + ( + "root_agent", + LoopAgentState(current_sub_agent="sub_agent_2").model_dump( + mode="json" + ), + ), ("sub_agent_2", Part.from_function_call(name="test_tool", args={})), + ( + "sub_agent_2", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), ] @@ -466,16 +453,18 @@ def test_pause_on_long_running_function_call( runner: testing_utils.InMemoryRunner, ): """Tests that a tree of resumable LlmAgents yields checkpoint events.""" - actual = testing_utils.simplify_resumable_app_events(runner.run("test")) - behavioral = [e for e in actual if not isinstance(e[1], dict)] - assert behavioral == [ + assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ ("root_agent", _transfer_call_part("sub_llm_agent_1")), ("root_agent", _TRANSFER_RESPONSE_PART), - ("root_agent", END_OF_AGENT), ("sub_llm_agent_1", _transfer_call_part("sub_llm_agent_2")), ("sub_llm_agent_1", _TRANSFER_RESPONSE_PART), - ("sub_llm_agent_1", END_OF_AGENT), ("sub_llm_agent_2", Part.from_function_call(name="test_tool", args={})), + ( + "sub_llm_agent_2", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), ] @@ -522,17 +511,18 @@ def test_pause_on_long_running_function_call( runner: testing_utils.InMemoryRunner, ): """Tests that a tree of resumable LlmAgents yields checkpoint events.""" - actual = testing_utils.simplify_resumable_app_events(runner.run("test")) - behavioral = [e for e in actual if not isinstance(e[1], dict)] - assert behavioral == [ + assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ ("root_agent", _transfer_call_part("sub_llm_agent_1")), ("root_agent", _TRANSFER_RESPONSE_PART), - ("root_agent", END_OF_AGENT), ("sub_llm_agent_1", _transfer_call_part("sub_llm_agent_2")), ("sub_llm_agent_1", _TRANSFER_RESPONSE_PART), - ("sub_llm_agent_1", END_OF_AGENT), ("sub_llm_agent_2", _transfer_call_part("root_agent")), ("sub_llm_agent_2", _TRANSFER_RESPONSE_PART), - ("sub_llm_agent_2", END_OF_AGENT), ("root_agent", Part.from_function_call(name="test_tool", args={})), + ( + "root_agent", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), ] diff --git a/tests/unittests/runners/test_resume_invocation.py b/tests/unittests/runners/test_resume_invocation.py index c2d517232b..0db3f23bec 100644 --- a/tests/unittests/runners/test_resume_invocation.py +++ b/tests/unittests/runners/test_resume_invocation.py @@ -37,38 +37,29 @@ def transfer_call_part(agent_name: str) -> Part: ) -def test_tool(): - """A test tool; returns None to simulate a pending long-running operation.""" - return None +def test_tool() -> dict[str, str]: + return {"result": "test tool result"} -@pytest.mark.xfail( - reason=( - "Tests implementation details that are different in V2 and will be" - " deprecated." - ) -) @pytest.mark.asyncio async def test_resume_invocation_from_sub_agent(): """A test case for an edge case, where an invocation-to-resume starts from a sub-agent. For example: - invocation1: root_agent -> sub_agent (sub_agent completes normally) - invocation2: sub_agent calls long_running_tool -> pauses - resume invocation2: sub_agent gets function response -> responds + invocation1: root_agent -> sub_agent + invocation2: sub_agent [paused][resume] """ # Step 1: Setup - long_running_test_tool = LongRunningFunctionTool(func=test_tool) + # root_agent -> sub_agent sub_agent = LlmAgent( name="sub_agent", model=testing_utils.MockModel.create( responses=[ "first response from sub_agent", - Part.from_function_call(name="test_tool", args={}), - "response from sub_agent after resume", + "second response from sub_agent", + "third response from sub_agent", ] ), - tools=[long_running_test_tool], ) root_agent = LlmAgent( name="root_agent", @@ -86,16 +77,11 @@ async def test_resume_invocation_from_sub_agent(): ) # Step 2: Run the first invocation - # root_agent transfers to sub_agent, sub_agent responds normally. + # Expect the invocation to start from root_agent and transferred to sub_agent. invocation_1_events = await runner.run_async("test user query") - inv1_behavioral = [ - e - for e in testing_utils.simplify_resumable_app_events( - copy.deepcopy(invocation_1_events) - ) - if not isinstance(e[1], dict) - ] - assert inv1_behavioral == [ + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_1_events) + ) == [ ( root_agent.name, transfer_call_part(sub_agent.name), @@ -104,10 +90,6 @@ async def test_resume_invocation_from_sub_agent(): root_agent.name, TRANSFER_RESPONSE_PART, ), - ( - root_agent.name, - testing_utils.END_OF_AGENT, - ), ( sub_agent.name, "first response from sub_agent", @@ -116,84 +98,60 @@ async def test_resume_invocation_from_sub_agent(): sub_agent.name, testing_utils.END_OF_AGENT, ), + ( + root_agent.name, + testing_utils.END_OF_AGENT, + ), ] # Step 3: Run the second invocation - # sub_agent is now active. It calls long_running_tool, which pauses. - invocation_2_events = await runner.run_async("test user query 2") - inv2_behavioral = [ - e - for e in testing_utils.simplify_resumable_app_events( - copy.deepcopy(invocation_2_events) - ) - if not isinstance(e[1], dict) - ] - assert inv2_behavioral == [ - # execute_tools yields the interrupt event with long_running_tool_ids. + # Expect the invocation to directly start from sub_agent. + invocation_2_events = await runner.run_async( + "test user query 2", + ) + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_2_events) + ) == [ ( sub_agent.name, - Part.from_function_call(name="test_tool", args={}), + "second response from sub_agent", ), + (sub_agent.name, testing_utils.END_OF_AGENT), ] + # Asserts the invocation will be a no-op if the current agent in context is + # already final. + assert not await runner.run_async( + invocation_id=invocation_2_events[0].invocation_id + ) - # Find the function_call_id for resume. - invocation_2_function_call_id = None - for ev in invocation_2_events: - if ( - ev.content - and ev.content.parts - and ev.content.parts[0].function_call - and ev.content.parts[0].function_call.name == "test_tool" - ): - invocation_2_function_call_id = ev.content.parts[0].function_call.id - break - assert invocation_2_function_call_id is not None + # Step 4: Copy all session.events[:-1] to a new session + # This is to simulate the case where we pause on the second invocation. + session_id = runner.session_id + session = await runner.runner.session_service.get_session( + app_name="test_app", user_id="test_user", session_id=session_id + ) + new_session = await runner.runner.session_service.create_session( + app_name=session.app_name, user_id=session.user_id + ) + for event in session.events[:-1]: + await runner.runner.session_service.append_event(new_session, event) + runner.session_id = new_session.id - # Step 4: Resume the second invocation with function response. + # Step 5: Resume the second invocation resumed_invocation_2_events = await runner.run_async( - invocation_id=invocation_2_events[0].invocation_id, - new_message=testing_utils.UserContent( - Part( - function_response=FunctionResponse( - id=invocation_2_function_call_id, - name="test_tool", - response={"result": "test tool update"}, - ) - ), - ), + invocation_id=invocation_2_events[0].invocation_id ) - resumed_inv2_behavioral = [ - e - for e in testing_utils.simplify_resumable_app_events( - copy.deepcopy(resumed_invocation_2_events) - ) - if not isinstance(e[1], dict) - ] - assert resumed_inv2_behavioral == [ - # execute_tools yields the function response from resume. + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(resumed_invocation_2_events) + ) == [ ( sub_agent.name, - Part.from_function_response( - name="test_tool", - response={"result": "test tool update"}, - ), - ), - ( - sub_agent.name, - "response from sub_agent after resume", + "third response from sub_agent", ), (sub_agent.name, testing_utils.END_OF_AGENT), ] -@pytest.mark.skip( - reason=( - "Cross-invocation resume (resuming a non-latest invocation) is not" - " supported by the Mesh-based LlmAgent. The Mesh's output aggregation" - " in node_output_utils.py collects events from multiple invocations," - " causing CallLlmResult to be wrapped in a list." - ) -) @pytest.mark.asyncio async def test_resume_any_invocation(): """A test case for resuming a previous invocation instead of the last one.""" @@ -223,45 +181,28 @@ async def test_resume_any_invocation(): # Step 2: Run the first invocation, which pauses on the long running function. invocation_1_events = await runner.run_async("test user query") - inv1_behavioral = [ - e - for e in testing_utils.simplify_resumable_app_events( - copy.deepcopy(invocation_1_events) - ) - if not isinstance(e[1], dict) - ] - assert inv1_behavioral == [ + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_1_events) + ) == [ ( root_agent.name, Part.from_function_call(name="test_tool", args={}), ), + ( + root_agent.name, + Part.from_function_response( + name="test_tool", response={"result": "test tool result"} + ), + ), ] - # Find the function_call_id for resume. - invocation_1_function_call_id = None - for ev in invocation_1_events: - if ( - ev.content - and ev.content.parts - and ev.content.parts[0].function_call - and ev.content.parts[0].function_call.name == "test_tool" - ): - invocation_1_function_call_id = ev.content.parts[0].function_call.id - break - assert invocation_1_function_call_id is not None - # Step 3: Run the second invocation, expect it to finish normally. invocation_2_events = await runner.run_async( "test user query 2", ) - inv2_behavioral = [ - e - for e in testing_utils.simplify_resumable_app_events( - copy.deepcopy(invocation_2_events) - ) - if not isinstance(e[1], dict) - ] - assert inv2_behavioral == [ + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_2_events) + ) == [ ( root_agent.name, "llm response in invocation 2", @@ -274,18 +215,19 @@ async def test_resume_any_invocation(): invocation_3_events = await runner.run_async( "test user query 3", ) - inv3_behavioral = [ - e - for e in testing_utils.simplify_resumable_app_events( - copy.deepcopy(invocation_3_events) - ) - if not isinstance(e[1], dict) - ] - assert inv3_behavioral == [ + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_3_events) + ) == [ ( root_agent.name, Part.from_function_call(name="test_tool", args={}), ), + ( + root_agent.name, + Part.from_function_response( + name="test_tool", response={"result": "test tool result"} + ), + ), ] # Step 5: Resume the first invocation with long running function response. @@ -294,21 +236,16 @@ async def test_resume_any_invocation(): new_message=testing_utils.UserContent( Part( function_response=FunctionResponse( - id=invocation_1_function_call_id, + id=invocation_1_events[0].content.parts[0].function_call.id, name="test_tool", response={"result": "test tool update"}, ) ), ), ) - resumed_inv1_behavioral = [ - e - for e in testing_utils.simplify_resumable_app_events( - copy.deepcopy(resumed_invocation_1_events) - ) - if not isinstance(e[1], dict) - ] - assert resumed_inv1_behavioral == [ + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(resumed_invocation_1_events) + ) == [ ( root_agent.name, "llm response after resuming invocation 1", diff --git a/tests/unittests/runners/test_run_tool_confirmation.py b/tests/unittests/runners/test_run_tool_confirmation.py index 005fb98b5a..6b12790de6 100644 --- a/tests/unittests/runners/test_run_tool_confirmation.py +++ b/tests/unittests/runners/test_run_tool_confirmation.py @@ -218,7 +218,7 @@ async def test_confirmation_flow( (agent.name, "test llm response after tool call"), ] for event in events: - assert event.invocation_id == invocation_id + assert event.invocation_id != invocation_id assert ( testing_utils.simplify_events(copy.deepcopy(events)) == expected_parts_final @@ -369,7 +369,7 @@ async def test_confirmation_flow( (agent.name, "test llm response after final tool call"), ] for event in events: - assert event.invocation_id == invocation_id + assert event.invocation_id != invocation_id assert ( testing_utils.simplify_events(copy.deepcopy(events)) == expected_parts_final diff --git a/tests/unittests/runners/test_runner_debug.py b/tests/unittests/runners/test_runner_debug.py index 3ad06d6d85..b747c4fa61 100644 --- a/tests/unittests/runners/test_runner_debug.py +++ b/tests/unittests/runners/test_runner_debug.py @@ -142,9 +142,11 @@ async def mock_run_async(*args, **kwargs): # Execute with quiet=True await runner.run_debug("Test query", quiet=True) - # Check that nothing was printed to stdout or logged + # Check that nothing was printed captured = capsys.readouterr() assert "This should not be printed" not in captured.out + assert "User >" not in captured.out + assert "Session:" not in captured.out @pytest.mark.asyncio async def test_run_debug_custom_session_id(self): @@ -860,7 +862,7 @@ async def mock_run_async(*args, **kwargs): assert len(events) == 3 @pytest.mark.asyncio - async def test_run_debug_with_empty_parts_list(self, capsys, caplog): + async def test_run_debug_with_empty_parts_list(self, capsys): """Test that run_debug handles events with empty parts list gracefully.""" agent = Agent( name="test_agent", @@ -877,19 +879,18 @@ async def mock_run_async(*_args, **_kwargs): mock_event.content.parts = [] # Empty parts list yield mock_event - with caplog.at_level("INFO"): - with mock.patch.object(runner, "run_async", side_effect=mock_run_async): - events = await runner.run_debug("Test query") + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug("Test query") - # Should handle gracefully without crashing - assert "User > Test query" in caplog.text + captured = capsys.readouterr() + # Should handle gracefully without crashing + assert "User > Test query" in captured.out assert len(events) == 1 # Should not print any agent response since parts is empty - captured = capsys.readouterr() assert "test_agent >" not in captured.out @pytest.mark.asyncio - async def test_run_debug_with_none_event_content(self, capsys, caplog): + async def test_run_debug_with_none_event_content(self, capsys): """Test that run_debug handles events with None content gracefully.""" agent = Agent( name="test_agent", @@ -905,13 +906,12 @@ async def mock_run_async(*_args, **_kwargs): mock_event.content = None # None content yield mock_event - with caplog.at_level("INFO"): - with mock.patch.object(runner, "run_async", side_effect=mock_run_async): - events = await runner.run_debug("Test query") + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug("Test query") - # Should handle gracefully without crashing - assert "User > Test query" in caplog.text - assert len(events) == 1 - # Should not print any agent response since content is None - captured = capsys.readouterr() - assert "test_agent >" not in captured.out + captured = capsys.readouterr() + # Should handle gracefully without crashing + assert "User > Test query" in captured.out + assert len(events) == 1 + # Should not print any agent response since content is None + assert "test_agent >" not in captured.out diff --git a/tests/unittests/runners/test_runner_node.py b/tests/unittests/runners/test_runner_node.py deleted file mode 100644 index 7758fbc02d..0000000000 --- a/tests/unittests/runners/test_runner_node.py +++ /dev/null @@ -1,1312 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for Runner(node=...). - -Verifies that Runner can execute standalone BaseNode instances, -persist events to session, handle resume (HITL), and yield events correctly. -""" - -from __future__ import annotations - -import asyncio -from typing import Any -from typing import AsyncGenerator - -from google.adk.agents.callback_context import CallbackContext -from google.adk.agents.context import Context -from google.adk.agents.llm_agent import LlmAgent -from google.adk.events.event import Event -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.workflow import node -from google.adk.workflow._base_node import BaseNode -from google.adk.workflow._base_node import START -from google.adk.workflow._workflow import Workflow -from google.genai import types -import pytest - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -class _EchoNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - text = node_input.parts[0].text if node_input else 'empty' - yield f'Echo: {text}' - - -def _user_message(text: str = 'hello') -> types.Content: - return types.Content(parts=[types.Part(text=text)], role='user') - - -async def _run_node(node, message='hello'): - """Run a BaseNode via Runner(node=...) and return (events, ss, session).""" - ss = InMemorySessionService() - runner = Runner(app_name='test', node=node, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - msg = types.Content(parts=[types.Part(text=message)], role='user') - events = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - return events, ss, session - - -def _make_interrupt_event(fc_name='get_input', fc_id='fc-1'): - """Create an interrupt Event with a long-running function call.""" - return Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name=fc_name, args={}, id=fc_id - ) - ) - ] - ), - long_running_tool_ids={fc_id}, - ) - - -def _make_resume_message(fc_name='get_input', fc_id='fc-1', response=None): - """Create a user message with a function response for resuming.""" - return types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name=fc_name, - id=fc_id, - response=response or {}, - ) - ) - ], - role='user', - ) - - -async def _run_two_turns(node, msg1_text, resume_msg): - """Run a node for two turns: initial message then resume.""" - ss = InMemorySessionService() - runner = Runner(app_name='test', node=node, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg1 = types.Content(parts=[types.Part(text=msg1_text)], role='user') - events1 = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - events2 = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=resume_msg - ): - events2.append(event) - - return events1, events2, runner, ss, session - - -# --------------------------------------------------------------------------- -# Basic execution -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_simple_node_output(): - """Runner yields output from a simple BaseNode.""" - events, _, _ = await _run_node(_EchoNode(name='echo'), message='hi') - - output_events = [e for e in events if e.output is not None] - assert [e.output for e in output_events] == ['Echo: hi'] - assert output_events[0].node_info.path == 'echo@1' - - -@pytest.mark.asyncio -async def test_intermediate_events_yielded(): - """Runner yields intermediate events (e.g. state), not just output.""" - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(state={'step': 'processing'}) - yield 'final_result' - - events, _, _ = await _run_node(_Node(name='steps')) - - state_events = [e for e in events if e.actions.state_delta] - assert len(state_events) >= 1 - assert [e.output for e in events if e.output is not None] == ['final_result'] - - -@pytest.mark.asyncio -async def test_event_author_defaults_to_node_name(): - """Events are attributed to the node's name by default.""" - events, _, _ = await _run_node(_EchoNode(name='my_node'), message='hi') - - output_events = [e for e in events if e.output is not None] - assert output_events[0].author == 'my_node' - - -@pytest.mark.asyncio -async def test_node_error_propagates(): - """A node that raises propagates the exception to the caller.""" - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - raise RuntimeError('node failure') - yield # pylint: disable=unreachable - - with pytest.raises(RuntimeError, match='node failure'): - await _run_node(_Node(name='error')) - - -@pytest.mark.asyncio -async def test_node_yielding_none_produces_no_output(): - """A node that yields None produces no output event.""" - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield None - - events, _, _ = await _run_node(_Node(name='nil')) - - assert [e.output for e in events if e.output is not None] == [] - - -@pytest.mark.asyncio -async def test_workflow_node_output(): - """Runner drives a Workflow and yields its terminal output.""" - - def upper(node_input: str) -> str: - return node_input.upper() - - wf = Workflow(name='wf', edges=[(START, upper)]) - events, _, _ = await _run_node(wf, message='hi') - - output_events = [e for e in events if e.output == 'HI'] - assert len(output_events) == 1 - assert output_events[0].node_info.path == 'wf@1/upper@1' - - -# --------------------------------------------------------------------------- -# Session persistence -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_events_persisted_to_session(): - """Non-partial events are persisted to the session.""" - _, ss, session = await _run_node(_EchoNode(name='echo'), message='hi') - - updated = await ss.get_session( - app_name='test', user_id='u', session_id=session.id - ) - session_outputs = [e.output for e in updated.events if e.output is not None] - assert 'Echo: hi' in session_outputs - - -@pytest.mark.asyncio -async def test_multiple_invocations_accumulate_events(): - """Each invocation appends events; session accumulates across runs.""" - node = _EchoNode(name='echo') - ss = InMemorySessionService() - runner = Runner(app_name='test', node=node, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - for msg_text in ['first', 'second', 'third']: - async for _ in runner.run_async( - user_id='u', - session_id=session.id, - new_message=types.Content( - parts=[types.Part(text=msg_text)], role='user' - ), - ): - pass - - updated = await ss.get_session( - app_name='test', user_id='u', session_id=session.id - ) - outputs = [e.output for e in updated.events if e.output is not None] - assert outputs == ['Echo: first', 'Echo: second', 'Echo: third'] - - -# --------------------------------------------------------------------------- -# yield_user_message -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_yield_user_message_true(): - """When yield_user_message=True, user event is yielded before node events.""" - ss = InMemorySessionService() - runner = Runner( - app_name='test', node=_EchoNode(name='echo'), session_service=ss - ) - session = await ss.create_session(app_name='test', user_id='u') - msg = types.Content(parts=[types.Part(text='hi')], role='user') - - events: list[Event] = [] - async for event in runner.run_async( - user_id='u', - session_id=session.id, - new_message=msg, - yield_user_message=True, - ): - events.append(event) - - user_events = [e for e in events if e.author == 'user'] - assert len(user_events) == 1 - assert user_events[0].content.parts[0].text == 'hi' - assert events[0].author == 'user' - - -@pytest.mark.asyncio -async def test_yield_user_message_false_by_default(): - """By default, user event is not yielded to the caller.""" - events, _, _ = await _run_node(_EchoNode(name='echo'), message='hi') - - user_events = [e for e in events if e.author == 'user'] - assert user_events == [] - - -@pytest.mark.asyncio -async def test_node_runner_applies_state_delta_before_base_node_runs(): - """A BaseNode sees run_async state_delta as session state.""" - - class _StateReaderNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield f'state:{ctx.state["test_state"]}' - - session_service = InMemorySessionService() - runner = Runner( - app_name='test', - node=_StateReaderNode(name='reader'), - session_service=session_service, - ) - session = await session_service.create_session(app_name='test', user_id='u') - - events: list[Event] = [] - async for event in runner.run_async( - user_id='u', - session_id=session.id, - new_message=_user_message(), - state_delta={'test_state': 'must_change'}, - ): - events.append(event) - - updated = await session_service.get_session( - app_name='test', user_id='u', session_id=session.id - ) - user_events = [event for event in updated.events if event.author == 'user'] - - assert [event.output for event in events if event.output is not None] == [ - 'state:must_change' - ] - assert updated.state['test_state'] == 'must_change' - assert user_events[0].actions.state_delta == {'test_state': 'must_change'} - - -@pytest.mark.asyncio -async def test_node_runner_yields_user_event_with_state_delta(): - """yield_user_message=True yields the user event with state_delta.""" - - class _NoopNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield 'done' - - session_service = InMemorySessionService() - runner = Runner( - app_name='test', - node=_NoopNode(name='noop'), - session_service=session_service, - ) - session = await session_service.create_session(app_name='test', user_id='u') - - events: list[Event] = [] - async for event in runner.run_async( - user_id='u', - session_id=session.id, - new_message=_user_message(), - state_delta={'test_state': 'must_change'}, - yield_user_message=True, - ): - events.append(event) - - assert events[0].author == 'user' - assert events[0].actions.state_delta == {'test_state': 'must_change'} - - -@pytest.mark.asyncio -async def test_node_runner_applies_state_delta_before_llm_agent_runs(): - """An LlmAgent callback sees run_async state_delta before model execution.""" - - captured_state_value = None - - def _before_agent_callback( - callback_context: CallbackContext, - ) -> types.Content: - nonlocal captured_state_value - captured_state_value = callback_context.state['test_state'] - return types.Content( - role='model', - parts=[types.Part(text=f'state:{captured_state_value}')], - ) - - session_service = InMemorySessionService() - agent = LlmAgent( - name='state_agent', - before_agent_callback=_before_agent_callback, - ) - runner = Runner(app_name='test', agent=agent, session_service=session_service) - session = await session_service.create_session(app_name='test', user_id='u') - - events: list[Event] = [] - async for event in runner.run_async( - user_id='u', - session_id=session.id, - new_message=_user_message(), - state_delta={'test_state': 'must_change'}, - ): - events.append(event) - - updated = await session_service.get_session( - app_name='test', user_id='u', session_id=session.id - ) - user_events = [event for event in updated.events if event.author == 'user'] - response_texts = [ - part.text - for event in events - if event.content - for part in event.content.parts - if part.text - ] - - assert captured_state_value == 'must_change' - assert 'state:must_change' in response_texts - assert user_events[0].actions.state_delta == {'test_state': 'must_change'} - - -# --------------------------------------------------------------------------- -# Resume (HITL) -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_standalone_node_resume(): - """A standalone node resumes with resume_inputs from function response.""" - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'result: {ctx.resume_inputs["fc-1"]["value"]}' - return - yield _make_interrupt_event() - - events1, events2, _, _, _ = await _run_two_turns( - _Node(name='standalone'), - 'go', - _make_resume_message(response={'value': 42}), - ) - - assert any(e.long_running_tool_ids for e in events1) - outputs = [e.output for e in events2 if e.output is not None] - assert 'result: 42' in outputs - - -@pytest.mark.asyncio -async def test_resume_preserves_original_user_content(): - """On resume, Runner passes the original text as node_input, not the FR.""" - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - text = ( - node_input.parts[0].text - if node_input and hasattr(node_input, 'parts') - else str(node_input) - ) - yield f'original:{text}' - return - yield _make_interrupt_event(fc_name='tool') - - events1, events2, _, _, _ = await _run_two_turns( - _Node(name='node'), - 'my original input', - _make_resume_message(fc_name='tool', response={'v': 1}), - ) - - outputs = [e.output for e in events2 if e.output is not None] - assert 'original:my original input' in outputs - - -@pytest.mark.asyncio -async def test_resume_populates_invocation_user_content(): - """On resume via a function response, ic.user_content is the original turn.""" - seen: list[Any] = [] - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - user_content = ctx.get_invocation_context().user_content - seen.append(user_content.parts[0].text if user_content else None) - yield 'resumed' - return - yield _make_interrupt_event(fc_name='tool') - - await _run_two_turns( - _Node(name='node'), - 'remember me', - _make_resume_message(fc_name='tool', response={'v': 1}), - ) - - assert seen == ['remember me'] - - -@pytest.mark.asyncio -async def test_resume_by_invocation_id_populates_user_content(): - """Resuming by invocation_id alone recovers the original user_content.""" - seen: list[Any] = [] - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - user_content = ctx.get_invocation_context().user_content - seen.append(user_content.parts[0].text if user_content else None) - yield _make_interrupt_event(fc_name='tool') - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=_Node(name='node'), session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - async for _ in runner.run_async( - user_id='u', - session_id=session.id, - new_message=types.Content( - parts=[types.Part(text='original text')], role='user' - ), - ): - pass - - updated = await ss.get_session( - app_name='test', user_id='u', session_id=session.id - ) - invocation_id = updated.events[0].invocation_id - - async for _ in runner.run_async( - user_id='u', session_id=session.id, invocation_id=invocation_id - ): - pass - - assert seen == ['original text', 'original text'] - - -@pytest.mark.asyncio -async def test_plain_text_does_not_trigger_resume(): - """Sending plain text (no FR) starts fresh, does not enter resume path.""" - node = _EchoNode(name='echo') - ss = InMemorySessionService() - runner = Runner(app_name='test', node=node, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1 - async for _ in runner.run_async( - user_id='u', - session_id=session.id, - new_message=types.Content(parts=[types.Part(text='first')], role='user'), - ): - pass - - # Run 2: plain text — should start fresh - events2: list[Event] = [] - async for event in runner.run_async( - user_id='u', - session_id=session.id, - new_message=types.Content(parts=[types.Part(text='second')], role='user'), - ): - events2.append(event) - - outputs = [e.output for e in events2 if e.output is not None] - assert outputs == ['Echo: second'] - - -# --------------------------------------------------------------------------- -# Resume validation -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_resume_raises_on_unmatched_fr(): - """Runner raises when function response has no matching FC in session.""" - ss = InMemorySessionService() - runner = Runner( - app_name='test', node=_EchoNode(name='echo'), session_service=ss - ) - session = await ss.create_session(app_name='test', user_id='u') - - msg = _make_resume_message(fc_name='unknown', fc_id='no-such-fc') - - with pytest.raises(ValueError, match='Function call not found'): - async for _ in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - pass - - -@pytest.mark.asyncio -async def test_resume_raises_on_multi_invocation_fr(): - """Runner raises when FRs resolve to different invocations.""" - call_count = [0] - - class _InterruptNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - call_count[0] += 1 - fc_id = f'fc-{call_count[0]}' - yield _make_interrupt_event(fc_name='tool', fc_id=fc_id) - - wf = Workflow( - name='wf', - edges=[(START, _InterruptNode(name='ask'))], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: interrupts with fc-1 - async for _ in runner.run_async( - user_id='u', - session_id=session.id, - new_message=types.Content(parts=[types.Part(text='go')], role='user'), - ): - pass - - # Run 2: interrupts with fc-2 (different invocation) - async for _ in runner.run_async( - user_id='u', - session_id=session.id, - new_message=types.Content( - parts=[types.Part(text='go again')], role='user' - ), - ): - pass - - # Run 3: send FRs for both fc-1 and fc-2 (different invocations) - msg3 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='tool', id='fc-1', response={'r': 1} - ) - ), - types.Part( - function_response=types.FunctionResponse( - name='tool', id='fc-2', response={'r': 2} - ) - ), - ], - role='user', - ) - - with pytest.raises(ValueError, match='resolve to multiple invocations'): - async for _ in runner.run_async( - user_id='u', session_id=session.id, new_message=msg3 - ): - pass - - -@pytest.mark.asyncio -async def test_mixed_fr_and_text_raises(): - """Message with both function responses and text is rejected.""" - ss = InMemorySessionService() - runner = Runner( - app_name='test', node=_EchoNode(name='echo'), session_service=ss - ) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content( - parts=[ - types.Part(text='some text'), - types.Part( - function_response=types.FunctionResponse( - name='tool', id='fc-1', response={'v': 1} - ) - ), - ], - role='user', - ) - - with pytest.raises(ValueError, match='cannot contain both'): - async for _ in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - pass - - -# --------------------------------------------------------------------------- -# Default scheduler & ctx.create_task cleanup -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_run_node_works_without_workflow(): - """ctx.run_node() works in a standalone BaseNode (default scheduler).""" - - class _ChildNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield f'child got: {node_input}' - - class _ParentNode(BaseNode): - - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - result = await ctx.run_node(_ChildNode(name='child'), 'hello') - yield f'parent got: {result}' - - events, _, _ = await _run_node(_ParentNode(name='parent'), message='go') - - outputs = [e.output for e in events if e.output is not None] - assert 'parent got: child got: hello' in outputs - - -@pytest.mark.asyncio -async def test_run_node_use_as_output_attributes_child_output_to_parent(): - """Child output with use_as_output=True is attributed to the parent node.""" - - class _ChildNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield 'child result' - - class _ParentNode(BaseNode): - - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - result = await ctx.run_node( - _ChildNode(name='child'), 'hello', use_as_output=True - ) - yield f'parent got: {result}' - - events, _, _ = await _run_node(_ParentNode(name='parent'), message='go') - - # The child's output event should list the parent's path in output_for. - # With use_as_output=True, the parent's own yield is suppressed — - # only the child's output (attributed to the parent) is emitted. - child_output = next(e for e in events if e.output == 'child result') - assert 'parent@1/child@1' in child_output.node_info.path - assert any( - 'parent' in p and 'child' not in p - for p in child_output.node_info.output_for - ) - - -@pytest.mark.asyncio -async def test_run_node_wait_for_output(): - """Dynamic node with wait_for_output=True re-runs on resume if no output. - - Setup: ParentNode calls MockNode (wait_for_output=True). - MockNode yields no output on first call, output on second call. - Act: - - Turn 1: Run parent. Child yields no output and waits. Parent interrupts. - - Turn 2: Resume parent. Child runs again and produces output. - Assert: - - Parent receives child's output in Turn 2. - """ - - # Arrange - calls = [0] - - class _MockNode(BaseNode): - wait_for_output: bool = True - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - calls[0] += 1 - if calls[0] == 2: - yield 'success' - - class _ParentNode(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - res = await ctx.run_node(_MockNode(name='child')) - if res == 'success': - yield 'completed' - return - yield _make_interrupt_event(fc_name='ask', fc_id='fc-1') - - # Act - events1, events2, _, _, _ = await _run_two_turns( - _ParentNode(name='parent'), - 'go', - _make_resume_message(fc_name='ask', fc_id='fc-1', response={}), - ) - - # Assert - outputs = [e.output for e in events2 if e.output is not None] - assert 'completed' in outputs - - -# --------------------------------------------------------------------------- -# DefaultNodeScheduler — dynamic child resume via ctx.run_node() -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_run_node_child_resume_via_default_scheduler(): - """Completed children are cached on resume; interrupted child re-runs. - - Setup: ParentNode calls ChildA and ChildB in sequence. - ChildA completes on first run. ChildB yields an interrupt on first run. - Act: - - Turn 1: Run parent. ChildA completes, ChildB interrupts. - - Turn 2: Resume with response for ChildB's interrupt. - Assert: - - Turn 1: ChildB's interrupt is propagated. - - Turn 2: Parent completes with combined output using cached ChildA result. - """ - - class _ChildA(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield 'child_a_output' - - class _ChildB(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'resumed: {ctx.resume_inputs["fc-1"]["answer"]}' - return - yield _make_interrupt_event(fc_name='ask', fc_id='fc-1') - - class _ParentNode(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - a = await ctx.run_node(_ChildA(name='a'), 'input_a') - b = await ctx.run_node(_ChildB(name='b'), 'input_b') - yield f'{a} + {b}' - - events1, events2, _, _, _ = await _run_two_turns( - _ParentNode(name='parent'), - 'go', - _make_resume_message( - fc_name='ask', fc_id='fc-1', response={'answer': 42} - ), - ) - - assert any(e.long_running_tool_ids for e in events1) - outputs = [e.output for e in events2 if e.output is not None] - assert 'child_a_output + resumed: 42' in outputs - - -@pytest.mark.asyncio -async def test_run_node_default_scheduler_caches_by_call_count(): - """Only interrupted children re-run; completed children are skipped. - - Setup: Parent calls ChildA, ChildB, and ChildC in sequence. - A and B complete on first run. C yields an interrupt on first run. - Act: - - Turn 1: Run parent. A & B complete, C interrupts. - - Turn 2: Resume with response for C's interrupt. - Assert: - - Turn 1: C's interrupt is propagated. - - Turn 2: Parent completes. Call counts verify A and B were not re-run on resume. - """ - - call_counts = {'a': 0, 'b': 0, 'c': 0} - - class _CountingChild(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - call_counts[self.name] += 1 - if self.name == 'c': - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield 'c_resumed' - return - yield _make_interrupt_event(fc_name='tool', fc_id='fc-1') - return - yield f'{self.name}_out' - - class _Parent(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - a = await ctx.run_node(_CountingChild(name='a'), 'x') - b = await ctx.run_node(_CountingChild(name='b'), 'y') - c = await ctx.run_node(_CountingChild(name='c'), 'z') - yield f'{a},{b},{c}' - - events1, events2, _, _, _ = await _run_two_turns( - _Parent(name='p'), - 'go', - _make_resume_message(fc_name='tool', fc_id='fc-1', response={}), - ) - - assert any(e.long_running_tool_ids for e in events1) - outputs = [e.output for e in events2 if e.output is not None] - assert 'a_out,b_out,c_resumed' in outputs - assert call_counts == {'a': 1, 'b': 1, 'c': 2} - - -@pytest.mark.asyncio -async def test_run_node_use_as_output_with_resume(): - """use_as_output child resumes correctly; child output is attributed to parent.""" - - class _Child(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'approved: {ctx.resume_inputs["fc-1"]["ok"]}' - return - yield _make_interrupt_event(fc_name='approve', fc_id='fc-1') - - class _Parent(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - result = await ctx.run_node( - _Child(name='child'), 'data', use_as_output=True - ) - yield f'parent saw: {result}' - - events1, events2, _, _, _ = await _run_two_turns( - _Parent(name='parent'), - 'go', - _make_resume_message( - fc_name='approve', fc_id='fc-1', response={'ok': True} - ), - ) - - assert any(e.long_running_tool_ids for e in events1) - outputs = [e.output for e in events2 if e.output is not None] - assert any('approved: True' in o for o in outputs) - - -@pytest.mark.asyncio -async def test_run_node_nested_ctx_run_node_resume(): - """Nested ctx.run_node(): outer → middle → inner; inner interrupts and resumes.""" - - call_counts = {'outer': 0, 'middle': 0, 'inner': 0} - - class _Inner(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - call_counts['inner'] += 1 - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'inner_resumed:{ctx.resume_inputs["fc-1"]["v"]}' - return - yield _make_interrupt_event(fc_name='ask', fc_id='fc-1') - - class _Middle(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - call_counts['middle'] += 1 - inner_out = await ctx.run_node(_Inner(name='inner'), 'go') - yield f'middle({inner_out})' - - class _Outer(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - call_counts['outer'] += 1 - mid_out = await ctx.run_node(_Middle(name='middle'), 'start') - yield f'outer({mid_out})' - - events1, events2, _, _, _ = await _run_two_turns( - _Outer(name='top'), - 'go', - _make_resume_message(fc_name='ask', fc_id='fc-1', response={'v': 99}), - ) - - # Turn 1: inner interrupts, propagated through middle and outer. - assert any(e.long_running_tool_ids for e in events1) - - # Turn 2: inner resumes, middle and outer produce final output. - outputs = [e.output for e in events2 if e.output is not None] - assert 'outer(middle(inner_resumed:99))' in outputs - - # Outer and middle re-run on resume; inner runs twice (interrupt + resume). - assert call_counts == {'outer': 2, 'middle': 2, 'inner': 2} - - -@pytest.mark.asyncio -async def test_run_node_use_as_output_nested_delegation(): - """Nested use_as_output delegates all the way up with run_ids.""" - - class _Inner(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield 'inner_val' - - class _Middle(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - await ctx.run_node(_Inner(name='inner'), 'go', use_as_output=True) - if False: - yield - - class _Outer(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - await ctx.run_node(_Middle(name='middle'), 'start', use_as_output=True) - if False: - yield - - # When - events, _, _ = await _run_node(_Outer(name='outer'), message='go') - - # Then - inner_output = next(e for e in events if e.output == 'inner_val') - output_for = inner_output.node_info.output_for - paths = output_for - - assert len(output_for) == 3 - assert any('middle' in p for p in paths) - assert any('outer' in p for p in paths) - assert any('inner' in p for p in paths) - for p in output_for: - assert '@' in p - - -@pytest.mark.asyncio -async def test_run_node_auto_increments_run_id(): - """ctx.run_node() auto-increments run_id for the same node name.""" - - class _ChildNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield f'run:{ctx.run_id}' - - class _ParentNode(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - r1 = await ctx.run_node(_ChildNode(name='child')) - r2 = await ctx.run_node(_ChildNode(name='child')) - yield f'{r1},{r2}' - - events, _, _ = await _run_node(_ParentNode(name='parent'), message='go') - - outputs = [e.output for e in events if e.output is not None] - assert 'run:1,run:2' in outputs - - -@pytest.mark.asyncio -async def test_run_node_parallel_interrupts(): - """Parallel ctx.run_node() calls that both interrupt and then resume. - - Setup: ParentNode calls two instances of InterruptChild in parallel. - Both children yield interrupts on the first turn with unique IDs. - Act: - - Turn 1: Run parent. Both children interrupt. - - Turn 2: Resume with responses for both children in a single message. - Assert: - - Turn 1: Two unique interrupts are yielded. - - Turn 2: Both children resume, find their inputs, and complete. Parent - produces combined output. - """ - - class _InterruptChild(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - target_id = f'fc-{ctx.run_id}' - if ctx.resume_inputs and target_id in ctx.resume_inputs: - yield f"resumed:{ctx.resume_inputs[target_id]['v']}" - return - yield _make_interrupt_event(fc_name='ask', fc_id=target_id) - - class _ParentNode(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - t1 = ctx.run_node(_InterruptChild(name='child')) - t2 = ctx.run_node(_InterruptChild(name='child')) - r1, r2 = await asyncio.gather(t1, t2) - yield f'{r1},{r2}' - - events1, ss, session = await _run_node( - _ParentNode(name='parent'), message='go' - ) - - interrupts = [e for e in events1 if e.long_running_tool_ids] - assert len(interrupts) == 2 - - fc_ids = [] - for e in interrupts: - fc_ids.extend(e.long_running_tool_ids) - assert len(set(fc_ids)) == 2 # Should be unique - - resume_msg = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='ask', id=fc_ids[0], response={'v': 10} - ) - ), - types.Part( - function_response=types.FunctionResponse( - name='ask', id=fc_ids[1], response={'v': 20} - ) - ), - ], - role='user', - ) - - events2 = [] - runner = Runner( - app_name='test', node=_ParentNode(name='parent'), session_service=ss - ) - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=resume_msg - ): - events2.append(event) - - outputs = [e.output for e in events2 if e.output is not None] - assert ( - 'resumed:10,resumed:20' in outputs or 'resumed:20,resumed:10' in outputs - ) - - -@pytest.mark.asyncio -async def test_run_node_parallel_deterministic_ids(): - """Parallel ctx.run_node() calls within the same process receive deterministic IDs. - - Setup: ParentNode calls two instances of ChildNode in parallel. - Act: Run parent. - Assert: Outputs confirm both children received distinct, auto-incremented run_ids (1 and 2). - """ - - class _ChildNode(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield f'run:{ctx.run_id}' - - class _ParentNode(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - t1 = ctx.run_node(_ChildNode(name='child')) - t2 = ctx.run_node(_ChildNode(name='child')) - r1, r2 = await asyncio.gather(t1, t2) - yield f'{r1},{r2}' - - events, _, _ = await _run_node(_ParentNode(name='parent'), message='go') - outputs = [e.output for e in events if e.output is not None] - assert 'run:1,run:2' in outputs or 'run:2,run:1' in outputs - - -@pytest.mark.asyncio -async def test_run_node_custom_numeric_id_raises_value_error(): - """Passing a completely numeric explicit run_id is immediately rejected. - - Setup: ParentNode calls ChildNode with a custom numeric run_id="5". - Act: Run parent. - Assert: ValueError is raised with a message about collision prevention. - """ - - class _ChildNode(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield f'run:{ctx.run_id}' - - class _ParentNode(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - await ctx.run_node(_ChildNode(name='child'), run_id='5') - yield 'should not reach' - - with pytest.raises(ValueError, match='must contain non-numeric characters'): - await _run_node(_ParentNode(name='parent'), message='go') - - -@pytest.mark.asyncio -async def test_run_node_custom_non_numeric_id_accepted(): - """Passing an explicit run_id containing non-numeric characters is safely accepted. - - Setup: ParentNode calls ChildNode with a custom run_id="user-123". - Act: Run parent. - Assert: Output reflects the custom run_id without errors. - """ - - class _ChildNode(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield f'run:{ctx.run_id}' - - class _ParentNode(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - r1 = await ctx.run_node(_ChildNode(name='child'), run_id='user-123') - yield r1 - - events, _, _ = await _run_node(_ParentNode(name='parent'), message='go') - outputs = [e.output for e in events if e.output is not None] - assert 'run:user-123' in outputs - - -@pytest.mark.asyncio -async def test_run_node_isolation_across_invocations(): - """Verify that a new invocation ignores events from a previous invocation for dynamic nodes.""" - - call_counts = {'child': 0} - - @node(name='child') - async def counting_child(ctx: Context, node_input: Any): - call_counts['child'] += 1 - yield f"child_out_{call_counts['child']}" - - class _Parent(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - res = await ctx.run_node(counting_child, 'x') - yield res - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=_Parent(name='p'), session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Invocation 1 - msg1 = types.Content(parts=[types.Part(text='go 1')], role='user') - events1 = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - assert call_counts['child'] == 1 - outputs1 = [e.output for e in events1 if e.output is not None] - assert 'child_out_1' in outputs1 - - # Invocation 2 (New invocation in SAME session) - msg2 = types.Content(parts=[types.Part(text='go 2')], role='user') - events2 = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events2.append(event) - - # If isolation works, CounterNode should run AGAIN! - assert call_counts['child'] == 2 - outputs2 = [e.output for e in events2 if e.output is not None] - assert 'child_out_2' in outputs2 diff --git a/tests/unittests/sessions/migration/test_migration.py b/tests/unittests/sessions/migration/test_migration.py index 9f54a2e0ac..5d9c207f20 100644 --- a/tests/unittests/sessions/migration/test_migration.py +++ b/tests/unittests/sessions/migration/test_migration.py @@ -17,23 +17,14 @@ from datetime import datetime from datetime import timezone -import os -import pickle -from fastapi.openapi.models import HTTPBearer -from google.adk.auth.auth_tool import AuthConfig from google.adk.events.event_actions import EventActions -from google.adk.events.event_actions import EventCompaction -from google.adk.events.ui_widget import UiWidget from google.adk.sessions.migration import _schema_check_utils from google.adk.sessions.migration import migrate_from_sqlalchemy_pickle as mfsp from google.adk.sessions.schemas import v0 from google.adk.sessions.schemas import v1 -from google.adk.tools.tool_confirmation import ToolConfirmation -from google.genai import types import pytest from sqlalchemy import create_engine -from sqlalchemy import text from sqlalchemy.orm import sessionmaker @@ -193,307 +184,6 @@ def test_migrate_from_sqlalchemy_pickle(tmp_path): dest_session.close() -def test_migrate_from_sqlalchemy_pickle_preserves_safe_actions_pickle(tmp_path): - """Migration should preserve normal v0 EventActions pickle payloads.""" - source_db_path = tmp_path / "source_pickle_safe_actions.db" - dest_db_path = tmp_path / "dest_json_safe_actions.db" - source_db_url = f"sqlite:///{source_db_path}" - dest_db_url = f"sqlite:///{dest_db_path}" - - source_engine = create_engine(source_db_url) - v0.Base.metadata.create_all(source_engine) - SourceSession = sessionmaker(bind=source_engine) - - now = datetime.now(timezone.utc) - with SourceSession() as source_session: - source_session.add( - v0.StorageSession( - app_name="app1", - user_id="user1", - id="session1", - state={}, - create_time=now, - update_time=now, - ) - ) - source_session.commit() - - actions = EventActions( - state_delta={"skey": "updated"}, - artifact_delta={"artifact.txt": 2}, - ) - source_session.add( - v0.StorageEvent( - id="event1", - app_name="app1", - user_id="user1", - session_id="session1", - invocation_id="invoke1", - author="user", - actions=actions, - timestamp=now, - ) - ) - source_session.commit() - - mfsp.migrate(source_db_url, dest_db_url) - - dest_engine = create_engine(dest_db_url) - DestSession = sessionmaker(bind=dest_engine) - with DestSession() as dest_session: - event_res = dest_session.query(v1.StorageEvent).first() - assert event_res is not None - assert event_res.event_data["actions"]["state_delta"] == {"skey": "updated"} - assert event_res.event_data["actions"]["artifact_delta"] == { - "artifact.txt": 2 - } - - -def test_migrate_from_sqlalchemy_pickle_preserves_nested_safe_actions_pickle( - tmp_path, -): - """Migration should allow standard nested EventActions models.""" - source_db_path = tmp_path / "source_pickle_nested_actions.db" - dest_db_path = tmp_path / "dest_json_nested_actions.db" - source_db_url = f"sqlite:///{source_db_path}" - dest_db_url = f"sqlite:///{dest_db_path}" - - source_engine = create_engine(source_db_url) - v0.Base.metadata.create_all(source_engine) - SourceSession = sessionmaker(bind=source_engine) - - now = datetime.now(timezone.utc) - with SourceSession() as source_session: - source_session.add( - v0.StorageSession( - app_name="app1", - user_id="user1", - id="session1", - state={}, - create_time=now, - update_time=now, - ) - ) - source_session.commit() - - actions = EventActions( - requested_auth_configs={ - "fc-auth": AuthConfig(auth_scheme=HTTPBearer()) - }, - requested_tool_confirmations={ - "fc-confirm": ToolConfirmation(hint="Authorize execution?") - }, - compaction=EventCompaction( - start_timestamp=1.0, - end_timestamp=2.0, - compacted_content=types.Content( - parts=[types.Part(text="summary")], - role="model", - ), - ), - ) - source_session.add( - v0.StorageEvent( - id="event1", - app_name="app1", - user_id="user1", - session_id="session1", - invocation_id="invoke1", - author="user", - actions=actions, - timestamp=now, - ) - ) - source_session.commit() - - mfsp.migrate(source_db_url, dest_db_url) - - dest_engine = create_engine(dest_db_url) - DestSession = sessionmaker(bind=dest_engine) - with DestSession() as dest_session: - event_res = dest_session.query(v1.StorageEvent).first() - assert event_res is not None - actions_data = event_res.event_data["actions"] - assert "fc-auth" in actions_data["requested_auth_configs"] - assert ( - actions_data["requested_tool_confirmations"]["fc-confirm"]["hint"] - == "Authorize execution?" - ) - assert ( - actions_data["compaction"]["compacted_content"]["parts"][0]["text"] - == "summary" - ) - - -def test_restricted_actions_unpickler_allows_datetime_state_delta(): - """Standard timestamp objects in action deltas should migrate by default.""" - last_seen = datetime(2026, 1, 1, 12, 30, tzinfo=timezone.utc) - actions = EventActions(state_delta={"last_seen": last_seen}) - - loaded_actions = mfsp._restricted_pickle_loads(pickle.dumps(actions)) - - assert isinstance(loaded_actions, EventActions) - assert loaded_actions.state_delta["last_seen"] == last_seen - - -def test_restricted_actions_unpickler_allows_ui_widgets(): - """Standard UI widget action metadata should migrate by default.""" - actions = EventActions( - render_ui_widgets=[ - UiWidget( - id="widget-1", - provider="mcp", - payload={"resource_uri": "ui://widget"}, - ) - ] - ) - - loaded_actions = mfsp._restricted_pickle_loads(pickle.dumps(actions)) - - assert isinstance(loaded_actions, EventActions) - assert loaded_actions.render_ui_widgets == actions.render_ui_widgets - - -def test_migrate_from_sqlalchemy_pickle_ignores_non_object_json_fields(): - """Event JSON model fields should only decode object payloads.""" - event = mfsp._row_to_event({ - "id": "event-list-content", - "invocation_id": "invoke1", - "author": "user", - "timestamp": datetime(2026, 1, 1, tzinfo=timezone.utc), - "content": "[1, 2, 3]", - }) - - assert event.content is None - - -def test_migrate_from_sqlalchemy_pickle_blocks_unsafe_actions_pickle( - tmp_path, monkeypatch -): - """Migration should not execute arbitrary globals from a pickled actions blob.""" - monkeypatch.delenv("ADK_MIGRATION_PICKLE_RCE", raising=False) - - source_db_path = tmp_path / "source_pickle_unsafe_actions.db" - dest_db_path = tmp_path / "dest_json_unsafe_actions.db" - source_db_url = f"sqlite:///{source_db_path}" - dest_db_url = f"sqlite:///{dest_db_path}" - - source_engine = create_engine(source_db_url) - v0.Base.metadata.create_all(source_engine) - SourceSession = sessionmaker(bind=source_engine) - - # Populate source DB with a valid session row to satisfy the FK constraint, - # then insert a malicious pickled actions blob directly as raw bytes. - now = datetime.now(timezone.utc) - with SourceSession() as source_session: - source_session.add( - v0.StorageSession( - app_name="app1", - user_id="user1", - id="session1", - state={}, - create_time=now, - update_time=now, - ) - ) - source_session.commit() - - class Evil: - - def __reduce__(self): - # This is intentionally non-destructive: it only sets an env var. - return ( - exec, - ("import os; os.environ['ADK_MIGRATION_PICKLE_RCE']='1'",), - ) - - source_session.execute( - text( - "INSERT INTO events (id, app_name, user_id, session_id," - " invocation_id, author, actions, timestamp) VALUES (:id," - " :app_name, :user_id, :session_id, :invocation_id, :author," - " :actions, :timestamp)" - ), - { - "id": "event1", - "app_name": "app1", - "user_id": "user1", - "session_id": "session1", - "invocation_id": "invoke1", - "author": "user", - "actions": pickle.dumps(Evil()), - "timestamp": now, - }, - ) - source_session.commit() - - mfsp.migrate(source_db_url, dest_db_url) - - assert os.environ.get("ADK_MIGRATION_PICKLE_RCE") is None - - -def test_migrate_from_sqlalchemy_pickle_allows_unsafe_actions_pickle_when_opted_in( - tmp_path, monkeypatch -): - """Unsafe pickle loading should require an explicit migration opt-in.""" - monkeypatch.delenv("ADK_MIGRATION_PICKLE_RCE", raising=False) - - source_db_path = tmp_path / "source_pickle_unsafe_opt_in_actions.db" - dest_db_path = tmp_path / "dest_json_unsafe_opt_in_actions.db" - source_db_url = f"sqlite:///{source_db_path}" - dest_db_url = f"sqlite:///{dest_db_path}" - - source_engine = create_engine(source_db_url) - v0.Base.metadata.create_all(source_engine) - SourceSession = sessionmaker(bind=source_engine) - - now = datetime.now(timezone.utc) - with SourceSession() as source_session: - source_session.add( - v0.StorageSession( - app_name="app1", - user_id="user1", - id="session1", - state={}, - create_time=now, - update_time=now, - ) - ) - source_session.commit() - - class Evil: - - def __reduce__(self): - return ( - exec, - ("import os; os.environ['ADK_MIGRATION_PICKLE_RCE']='1'",), - ) - - source_session.execute( - text( - "INSERT INTO events (id, app_name, user_id, session_id," - " invocation_id, author, actions, timestamp) VALUES (:id," - " :app_name, :user_id, :session_id, :invocation_id, :author," - " :actions, :timestamp)" - ), - { - "id": "event1", - "app_name": "app1", - "user_id": "user1", - "session_id": "session1", - "invocation_id": "invoke1", - "author": "user", - "actions": pickle.dumps(Evil()), - "timestamp": now, - }, - ) - source_session.commit() - - mfsp.migrate(source_db_url, dest_db_url, allow_unsafe_unpickling=True) - - assert os.environ.get("ADK_MIGRATION_PICKLE_RCE") == "1" - - def test_migrate_from_sqlalchemy_pickle_with_async_driver_urls(tmp_path): """Tests that migration works with async driver URLs (fixes issue #4176). diff --git a/tests/unittests/sessions/test_session_service.py b/tests/unittests/sessions/test_session_service.py index 50eed6da8e..02f5159a45 100644 --- a/tests/unittests/sessions/test_session_service.py +++ b/tests/unittests/sessions/test_session_service.py @@ -30,7 +30,6 @@ from google.adk.sessions.database_session_service import DatabaseSessionService from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.sessions.sqlite_session_service import SqliteSessionService -from google.adk.sessions.vertex_ai_session_service import VertexAiSessionService from google.genai import types import pytest from sqlalchemy import delete @@ -1651,129 +1650,3 @@ async def tracking_fn(**kwargs): finally: database_session_service._select_required_state = original_fn await service.close() - - -@pytest.mark.asyncio -async def test_get_user_state_returns_empty_dict_when_no_state_exists( - session_service, -): - """Verifies get_user_state returns empty dict when no state exists.""" - state = await session_service.get_user_state(app_name='my_app', user_id='u1') - assert not state - - -@pytest.mark.asyncio -async def test_get_user_state_returns_state_written_via_append_event( - session_service, -): - """Verifies get_user_state returns state written via append_event.""" - session = await session_service.create_session( - app_name='my_app', user_id='u1' - ) - await session_service.append_event( - session, - Event( - author='system', - actions=EventActions( - state_delta={'user:profile': {'name': 'Alice'}, 'session_key': 1} - ), - ), - ) - - state = await session_service.get_user_state(app_name='my_app', user_id='u1') - - assert state == {'profile': {'name': 'Alice'}} - assert 'session_key' not in state - - -@pytest.mark.asyncio -async def test_get_user_state_is_not_visible_across_users(session_service): - """Verifies user state is isolated between users.""" - session = await session_service.create_session( - app_name='my_app', user_id='u1' - ) - await session_service.append_event( - session, - Event( - author='system', - actions=EventActions(state_delta={'user:secret': 'only-for-u1'}), - ), - ) - - other_state = await session_service.get_user_state( - app_name='my_app', user_id='u2' - ) - assert not other_state - - -@pytest.mark.asyncio -async def test_get_user_state_is_not_visible_across_apps(session_service): - """Verifies user state is isolated between apps.""" - session = await session_service.create_session( - app_name='my_app', user_id='u1' - ) - await session_service.append_event( - session, - Event( - author='system', - actions=EventActions(state_delta={'user:data': 'only-app-a'}), - ), - ) - - other_state = await session_service.get_user_state( - app_name='other_app', user_id='u1' - ) - assert not other_state - - -@pytest.mark.asyncio -async def test_get_user_state_available_before_session_is_created( - session_service, -): - """Verifies user state can be retrieved before a session is created.""" - first_session = await session_service.create_session( - app_name='my_app', user_id='u1' - ) - await session_service.append_event( - first_session, - Event( - author='system', - actions=EventActions(state_delta={'user:ctx': {'v': 1}}), - ), - ) - - state = await session_service.get_user_state(app_name='my_app', user_id='u1') - assert state == {'ctx': {'v': 1}} - - -@pytest.mark.asyncio -async def test_get_user_state_reflects_latest_write(session_service): - """Verifies get_user_state returns the latest state.""" - session = await session_service.create_session( - app_name='my_app', user_id='u1' - ) - await session_service.append_event( - session, - Event( - author='system', - actions=EventActions(state_delta={'user:counter': 1}), - ), - ) - await session_service.append_event( - session, - Event( - author='system', - actions=EventActions(state_delta={'user:counter': 2}), - ), - ) - - state = await session_service.get_user_state(app_name='my_app', user_id='u1') - assert state['counter'] == 2 - - -@pytest.mark.asyncio -async def test_vertex_ai_session_service_raises_not_implemented_for_get_user_state(): - """Verifies VertexAiSessionService raises NotImplementedError.""" - service = VertexAiSessionService(project='proj', location='us-central1') - with pytest.raises(NotImplementedError): - await service.get_user_state(app_name='my_app', user_id='u1') diff --git a/tests/unittests/sessions/test_vertex_ai_session_service.py b/tests/unittests/sessions/test_vertex_ai_session_service.py index b8c71701dc..c5c9996ef5 100644 --- a/tests/unittests/sessions/test_vertex_ai_session_service.py +++ b/tests/unittests/sessions/test_vertex_ai_session_service.py @@ -725,45 +725,6 @@ async def test_get_and_delete_session(): assert str(excinfo.value) == '404 Session not found: 1' -@pytest.mark.asyncio -@pytest.mark.usefixtures('mock_get_api_client') -async def test_delete_session_rejects_other_users_session(): - """delete_session must not delete a session owned by a different user.""" - session_service = mock_vertex_ai_session_service() - - # session '1' belongs to 'user'; 'user2' must not be allowed to delete it. - with pytest.raises(ValueError) as excinfo: - await session_service.delete_session( - app_name='123', user_id='user2', session_id='1' - ) - assert 'does not belong to user user2' in str(excinfo.value) - - # Session must still exist. - assert ( - await session_service.get_session( - app_name='123', user_id='user', session_id='1' - ) - == MOCK_SESSION - ) - - -@pytest.mark.asyncio -@pytest.mark.usefixtures('mock_get_api_client') -async def test_session_id_path_traversal_rejected(): - """Session IDs containing path-traversal characters must be rejected.""" - session_service = mock_vertex_ai_session_service() - - for bad_id in ['..', '../foo', '..?force=true', 'a/b', '']: - with pytest.raises(ValueError): - await session_service.delete_session( - app_name='123', user_id='user', session_id=bad_id - ) - with pytest.raises(ValueError): - await session_service.get_session( - app_name='123', user_id='user', session_id=bad_id - ) - - @pytest.mark.asyncio @pytest.mark.usefixtures('mock_get_api_client') async def test_get_session_with_page_token(): diff --git a/tests/unittests/skills/test__utils.py b/tests/unittests/skills/test__utils.py index abae9cd8b8..1975c0a494 100644 --- a/tests/unittests/skills/test__utils.py +++ b/tests/unittests/skills/test__utils.py @@ -14,9 +14,7 @@ """Unit tests for skill utilities.""" -import builtins import io -import sys from unittest import mock import zipfile @@ -365,31 +363,3 @@ def test__load_skill_from_zip_bytes(): assert skill.instructions == "Body instructions" assert skill.resources.get_reference("ref1.md") == "ref1 content" assert skill.resources.get_script("script1.sh").src == "echo hello" - - -def test__list_skills_in_gcs_dir_import_error(): - """Tests list_skills_in_gcs_dir raises ImportError when storage missing.""" - real_import = builtins.__import__ - - def mock_import(name, globals=None, locals=None, fromlist=(), level=0): - if name == "google.cloud" and "storage" in (fromlist or ()): - raise ImportError("No module named 'google.cloud.storage'") - return real_import(name, globals, locals, fromlist, level) - - with mock.patch("builtins.__import__", mock_import): - with pytest.raises(ImportError, match="google-cloud-storage is required"): - _list_skills_in_gcs_dir("my-bucket", "skills/") - - -def test__load_skill_from_gcs_dir_import_error(): - """Tests load_skill_from_gcs_dir raises ImportError when storage missing.""" - real_import = builtins.__import__ - - def mock_import(name, globals=None, locals=None, fromlist=(), level=0): - if name == "google.cloud" and "storage" in (fromlist or ()): - raise ImportError("No module named 'google.cloud.storage'") - return real_import(name, globals, locals, fromlist, level) - - with mock.patch("builtins.__import__", mock_import): - with pytest.raises(ImportError, match="google-cloud-storage is required"): - _load_skill_from_gcs_dir("my-bucket", "skills/my-skill/") diff --git a/tests/unittests/streaming/test_live_streaming_configs.py b/tests/unittests/streaming/test_live_streaming_configs.py index 709dba2f08..679d3964b9 100644 --- a/tests/unittests/streaming/test_live_streaming_configs.py +++ b/tests/unittests/streaming/test_live_streaming_configs.py @@ -729,74 +729,3 @@ def test_streaming_with_avatar_config(): assert video_part.inline_data is not None assert video_part.inline_data.data == b'video_data' assert video_part.inline_data.mime_type == 'video/mp4' - - -def test_streaming_default_model_when_not_specified(mocker): - """Test streaming uses default model when not specified in live mode.""" - from google.adk.agents import LlmAgent - from google.adk.models.registry import LLMRegistry - - response1 = LlmResponse(turn_complete=True) - mock_model = testing_utils.MockModel.create([response1]) - - mock_new_llm = mocker.patch.object( - LLMRegistry, 'new_llm', return_value=mock_model - ) - - # Save original default - original_default = LlmAgent._default_live_model - - try: - LlmAgent.set_default_live_model('my-custom-live-model') - - root_agent = Agent( - name='root_agent', - tools=[], - ) - - import asyncio - from contextlib import aclosing - - from google.adk.agents.run_config import RunConfig - from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService - from google.adk.memory.in_memory_memory_service import InMemoryMemoryService - from google.adk.runners import Runner - from google.adk.sessions.in_memory_session_service import InMemorySessionService - - runner = Runner( - app_name='test_app', - agent=root_agent, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - ) - - live_request_queue = LiveRequestQueue() - live_request_queue.send_realtime( - blob=types.Blob(data=b'\x00\xFF', mime_type='audio/pcm') - ) - - async def run_test(): - session = await runner.session_service.create_session( - app_name='test_app', user_id='test_user' - ) - run_config = RunConfig(response_modalities=['AUDIO']) - async with aclosing( - runner.run_live( - user_id=session.user_id, - session_id=session.id, - live_request_queue=live_request_queue, - run_config=run_config, - ) - ) as agen: - async for event in agen: - # We just need to trigger the resolution - break - - asyncio.run(run_test()) - - mock_new_llm.assert_any_call('my-custom-live-model') - - finally: - # Restore original default - LlmAgent.set_default_live_model(original_default) diff --git a/tests/unittests/streaming/test_streaming_audio_storage.py b/tests/unittests/streaming/test_streaming_audio_storage.py index ac0972136f..70cac8e01e 100644 --- a/tests/unittests/streaming/test_streaming_audio_storage.py +++ b/tests/unittests/streaming/test_streaming_audio_storage.py @@ -63,7 +63,7 @@ # # Import our caching classes # from google.adk.agents.invocation_context import RealtimeCacheEntry -# from google.adk.agents.llm.base_llm_flow import BaseLlmFlow +# from google.adk.flows.llm_flows.base_llm_flow import BaseLlmFlow # # Create a mock flow to test our methods # flow = BaseLlmFlow() @@ -160,7 +160,7 @@ # ) # from google.adk.events.event import Event -# from google.adk.agents.llm.base_llm_flow import BaseLlmFlow +# from google.adk.flows.llm_flows.base_llm_flow import BaseLlmFlow # flow = BaseLlmFlow() diff --git a/tests/unittests/telemetry/test_functional.py b/tests/unittests/telemetry/test_functional.py index 99895eb7c7..645fd4050c 100644 --- a/tests/unittests/telemetry/test_functional.py +++ b/tests/unittests/telemetry/test_functional.py @@ -13,6 +13,8 @@ # limitations under the License. import dataclasses +import gc +import sys from typing import Any from typing import Sequence @@ -22,7 +24,6 @@ from google.adk.telemetry import tracing from google.adk.tools import FunctionTool from google.adk.utils.context_utils import Aclosing -from google.genai import types from google.genai.types import Part from opentelemetry.instrumentation.google_genai import GoogleGenAiSdkInstrumentor from opentelemetry.sdk.metrics import MeterProvider @@ -36,7 +37,6 @@ from ..testing_utils import InMemoryRunner from ..testing_utils import MockModel from ..testing_utils import TestInMemoryRunner -from .utils import set_aclosing_wrapping_assertions @pytest.fixture @@ -99,7 +99,30 @@ async def test_tracer_start_as_current_span( This is necessary because instrumentation utilizes contextvars, which ran into "ContextVar was created in a different Context" errors, when a given coroutine gets indeterminately suspended. """ - set_aclosing_wrapping_assertions() + firstiter, finalizer = sys.get_asyncgen_hooks() + + def wrapped_firstiter(coro): + nonlocal firstiter + # Skip check for specific async context managers in tracing.py, + # as their internal generators are not expected to be Aclosing-wrapped. + if ( + coro.__name__ == "use_inference_span" + or coro.__name__ == "_use_native_generate_content_span" + or coro.__name__ == "record_agent_invocation" + or coro.__name__ == "record_tool_execution" + ): + firstiter(coro) + return + assert any( + isinstance(referrer, Aclosing) + or isinstance(indirect_referrer, Aclosing) + for referrer in gc.get_referrers(coro) + # Some coroutines have a layer of indirection in Python 3.10 + for indirect_referrer in gc.get_referrers(referrer) + ), f"Coro `{coro.__name__}` is not wrapped with Aclosing" + firstiter(coro) + + sys.set_asyncgen_hooks(wrapped_firstiter, finalizer) # Act async with Aclosing(test_runner.run_async_with_new_session_agen("")) as agen: @@ -149,7 +172,6 @@ async def some_tool(): # Assert spans = span_exporter.get_finished_spans() - assert len(spans) > 1 assert all( span.attributes is not None and len(span.attributes) > 0 @@ -212,18 +234,13 @@ class MetricPoint: def _extract_metrics( - metrics_list: Sequence[Metric], name: str, agent_name: str | None = None + metrics_list: Sequence[Metric], name: str ) -> list[MetricPoint]: m = next((m for m in metrics_list if m.name == name), None) if not m: return [] points = [] for dp in m.data.data_points: - if ( - agent_name is not None - and dp.attributes.get("gen_ai.agent.name") != agent_name - ): - continue value = None if hasattr(dp, "sum"): value = dp.sum @@ -244,10 +261,6 @@ def _setup_test_metrics(monkeypatch): request_size_hist = meter.create_histogram("gen_ai.agent.request.size") response_size_hist = meter.create_histogram("gen_ai.agent.response.size") workflow_steps_hist = meter.create_histogram("gen_ai.agent.workflow.steps") - client_duration_hist = meter.create_histogram( - "gen_ai.client.operation.duration" - ) - client_token_usage_hist = meter.create_histogram("gen_ai.client.token.usage") monkeypatch.setattr( _metrics, "_agent_invocation_duration", agent_duration_hist @@ -256,10 +269,6 @@ def _setup_test_metrics(monkeypatch): monkeypatch.setattr(_metrics, "_agent_request_size", request_size_hist) monkeypatch.setattr(_metrics, "_agent_response_size", response_size_hist) monkeypatch.setattr(_metrics, "_agent_workflow_steps", workflow_steps_hist) - monkeypatch.setattr( - _metrics, "_client_operation_duration", client_duration_hist - ) - monkeypatch.setattr(_metrics, "_client_token_usage", client_token_usage_hist) return reader @@ -278,14 +287,7 @@ async def generate_random_number(): Part.from_function_call(name="get_current_time", args={}), Part.from_function_call(name="generate_random_number", args={}), Part.from_text(text="Both tools executed."), - ], - usage_metadata=types.GenerateContentResponseUsageMetadata( - prompt_token_count=10, - candidates_token_count=20, - tool_use_prompt_token_count=5, - thoughts_token_count=10, - total_token_count=45, - ), + ] ) test_agent = Agent( name="complex_agent", @@ -305,7 +307,7 @@ async def generate_random_number(): assert len(scope_metrics) > 0 metrics_list = scope_metrics[0].metrics got_invocation = _extract_metrics( - metrics_list, "gen_ai.agent.invocation.duration", "complex_agent" + metrics_list, "gen_ai.agent.invocation.duration" ) assert len(got_invocation) == 1 for p in got_invocation: @@ -320,7 +322,7 @@ async def generate_random_number(): ] assert got_invocation == want_invocation got_tool_exec = _extract_metrics( - metrics_list, "gen_ai.tool.execution.duration", "complex_agent" + metrics_list, "gen_ai.tool.execution.duration" ) assert len(got_tool_exec) == 2 for p in got_tool_exec: @@ -344,9 +346,7 @@ async def generate_random_number(): got_tool_exec.sort(key=lambda p: p.attributes.get("gen_ai.tool.name", "")) want_tool_exec.sort(key=lambda p: p.attributes.get("gen_ai.tool.name", "")) assert got_tool_exec == want_tool_exec - got_steps = _extract_metrics( - metrics_list, "gen_ai.agent.workflow.steps", "complex_agent" - ) + got_steps = _extract_metrics(metrics_list, "gen_ai.agent.workflow.steps") assert len(got_steps) == 1 want_steps = [ # (tool call + result) x 2 + text response = 5 steps @@ -354,62 +354,6 @@ async def generate_random_number(): ] assert got_steps == want_steps - got_client_duration = _extract_metrics( - metrics_list, "gen_ai.client.operation.duration", "complex_agent" - ) - assert len(got_client_duration) == 1 - for p in got_client_duration: - p.value = None - want_client_duration = [ - MetricPoint( - attributes={ - "gen_ai.agent.name": "complex_agent", - "gen_ai.operation.name": "generate_content", - "gen_ai.provider.name": "gemini", - "gen_ai.request.model": "mock", - "gen_ai.response.model": "mock", - }, - value=None, - ) - ] - assert got_client_duration == want_client_duration - - got_client_tokens = _extract_metrics( - metrics_list, "gen_ai.client.token.usage", "complex_agent" - ) - assert len(got_client_tokens) == 2 - want_client_tokens = [ - MetricPoint( - attributes={ - "gen_ai.agent.name": "complex_agent", - "gen_ai.operation.name": "generate_content", - "gen_ai.provider.name": "gemini", - "gen_ai.request.model": "mock", - "gen_ai.response.model": "mock", - "gen_ai.token.type": "input", - }, - value=45, # 15 tokens * 3 turns - ), - MetricPoint( - attributes={ - "gen_ai.agent.name": "complex_agent", - "gen_ai.operation.name": "generate_content", - "gen_ai.provider.name": "gemini", - "gen_ai.request.model": "mock", - "gen_ai.response.model": "mock", - "gen_ai.token.type": "output", - }, - value=90, # 30 tokens * 3 turns - ), - ] - got_client_tokens.sort( - key=lambda p: p.attributes.get("gen_ai.token.type", "") - ) - want_client_tokens.sort( - key=lambda p: p.attributes.get("gen_ai.token.type", "") - ) - assert got_client_tokens == want_client_tokens - @pytest.mark.asyncio async def test_metrics_tool_error(monkeypatch): @@ -442,9 +386,7 @@ async def failing_tool(): metrics_list = metrics_data.resource_metrics[0].scope_metrics[0].metrics # Verify Tool Execution Duration - got = _extract_metrics( - metrics_list, "gen_ai.tool.execution.duration", "error_agent" - ) + got = _extract_metrics(metrics_list, "gen_ai.tool.execution.duration") assert len(got) == 2 for p in got: p.value = None diff --git a/tests/unittests/telemetry/test_google_cloud.py b/tests/unittests/telemetry/test_google_cloud.py index 8b57ac9dd1..284a51539e 100644 --- a/tests/unittests/telemetry/test_google_cloud.py +++ b/tests/unittests/telemetry/test_google_cloud.py @@ -52,18 +52,6 @@ def test_get_gcp_exporters( "google.auth.default", auth_mock, ) - monkeypatch.setattr( - "google.adk.telemetry.google_cloud._get_gcp_span_exporter", - lambda credentials: mock.MagicMock(), - ) - monkeypatch.setattr( - "google.adk.telemetry.google_cloud._get_gcp_metrics_exporter", - lambda project_id: mock.MagicMock(), - ) - monkeypatch.setattr( - "google.adk.telemetry.google_cloud._get_gcp_logs_exporter", - lambda project_id, credentials: mock.MagicMock(), - ) # Act. otel_hooks = get_gcp_exporters( @@ -215,5 +203,4 @@ def test_get_gcp_span_exporter_mtls( mock_exporter.assert_called_once_with( session=mock_session.return_value, endpoint=_DEFAULT_MTLS_TELEMETRY_TRACES_ENPOINT, - headers=None, ) diff --git a/tests/unittests/telemetry/test_instrumentation.py b/tests/unittests/telemetry/test_instrumentation.py index 8e46995827..cdbb8f3af1 100644 --- a/tests/unittests/telemetry/test_instrumentation.py +++ b/tests/unittests/telemetry/test_instrumentation.py @@ -19,7 +19,6 @@ from google.adk.telemetry import _instrumentation from opentelemetry import trace -import pytest def test_get_elapsed_ms_span_none(): @@ -81,37 +80,3 @@ def test_get_elapsed_ms_span_non_int_end(): with mock.patch("time.monotonic", return_value=12.0): elapsed = _instrumentation._get_elapsed_ms(mock_span, start_time) assert elapsed == 2000.0 - - -@pytest.mark.asyncio -async def test_record_agent_invocation_tolerates_minimal_context(): - """Tolerates context-likes that lack user_content or session. - - Test doubles, partial migrations, and external embedders can pass an - InvocationContext-like object without `user_content` or with a `session` - that has no `events` attribute. The telemetry path must not raise - AttributeError on the metrics call in those cases. - """ - agent = mock.MagicMock() - agent.name = "test_agent" - # Bare object without `user_content` and without `session`. - bare_ctx = object() - - with ( - mock.patch.object( - _instrumentation, "_record_agent_metrics" - ) as mock_record, - mock.patch.object(_instrumentation, "tracing") as mock_tracing, - ): - mock_tracing.tracer.start_as_current_span.return_value.__enter__.return_value = mock.MagicMock( - spec=trace.Span - ) - async with _instrumentation.record_agent_invocation(bare_ctx, agent): - pass - - mock_record.assert_called_once() - call_args = mock_record.call_args - # positional: (agent_name, elapsed_ms, user_content, events, caught_error) - assert call_args.args[0] == "test_agent" - assert call_args.args[2] is None # user_content default - assert call_args.args[3] == [] # events default diff --git a/tests/unittests/telemetry/test_metrics.py b/tests/unittests/telemetry/test_metrics.py index d2fffa4c08..cab10a5c6e 100644 --- a/tests/unittests/telemetry/test_metrics.py +++ b/tests/unittests/telemetry/test_metrics.py @@ -31,16 +31,12 @@ def _mock_meter_setup(monkeypatch): request_size_hist = mock.MagicMock(spec=metrics.Histogram) response_size_hist = mock.MagicMock(spec=metrics.Histogram) steps_hist = mock.MagicMock(spec=metrics.Histogram) - client_duration_hist = mock.MagicMock(spec=metrics.Histogram) - client_token_usage_hist = mock.MagicMock(spec=metrics.Histogram) agent_duration_hist.name = "agent_invocation_duration" tool_duration_hist.name = "tool_execution_duration" request_size_hist.name = "agent_request_size" response_size_hist.name = "agent_response_size" steps_hist.name = "agent_workflow_steps" - client_duration_hist.name = "client_operation_duration" - client_token_usage_hist.name = "client_token_usage" def create_histogram_side_effect(name, **_kwargs): if name == "gen_ai.agent.invocation.duration": @@ -53,10 +49,6 @@ def create_histogram_side_effect(name, **_kwargs): return response_size_hist elif name == "gen_ai.agent.workflow.steps": return steps_hist - elif name == "gen_ai.client.operation.duration": - return client_duration_hist - elif name == "gen_ai.client.token.usage": - return client_token_usage_hist raise ValueError(f"Unknown metric name: {name}") mock_meter.create_histogram.side_effect = create_histogram_side_effect @@ -70,10 +62,6 @@ def create_histogram_side_effect(name, **_kwargs): monkeypatch.setattr(_metrics, "_agent_request_size", request_size_hist) monkeypatch.setattr(_metrics, "_agent_response_size", response_size_hist) monkeypatch.setattr(_metrics, "_agent_workflow_steps", steps_hist) - monkeypatch.setattr( - _metrics, "_client_operation_duration", client_duration_hist - ) - monkeypatch.setattr(_metrics, "_client_token_usage", client_token_usage_hist) return { "meter": mock_meter, @@ -82,8 +70,6 @@ def create_histogram_side_effect(name, **_kwargs): "request_size": request_size_hist, "response_size": response_size_hist, "steps": steps_hist, - "client_duration": client_duration_hist, - "client_token_usage": client_token_usage_hist, } @@ -248,89 +234,3 @@ def test_record_tool_execution_duration_with_error(mock_meter_setup): ) def test_get_content_size(content, expected_size): assert _metrics._get_content_size(content) == expected_size - - -def test_record_client_operation_duration(mock_meter_setup): - """Tests record_client_operation_duration records correctly.""" - llm_request = mock.MagicMock( - contents=[types.Content(parts=[types.Part(text="hello")])] - ) - response = mock.MagicMock( - content=types.Content(parts=[types.Part(text="hello response")]) - ) - _metrics.record_client_operation_duration( - agent_name="test_agent", - elapsed_ms=100.0, - llm_request=llm_request, - responses=[response], - ) - client_duration_hist = mock_meter_setup["client_duration"] - client_duration_hist.record.assert_called_once() - args, kwargs = client_duration_hist.record.call_args - assert args[0] == 0.1 - want_attributes = { - "gen_ai.agent.name": "test_agent", - "gen_ai.operation.name": "generate_content", - "gen_ai.provider.name": "gemini", - "gen_ai.request.model": llm_request.model, - "gen_ai.response.model": response.model_version, - } - assert kwargs["attributes"] == want_attributes - - -def test_record_client_token_usage(mock_meter_setup): - """Tests record_client_token_usage records correctly under different usage conditions.""" - llm_request = mock.MagicMock( - contents=[types.Content(parts=[types.Part(text="hello")])], - model="test-model", - ) - response = mock.MagicMock( - content=types.Content(parts=[types.Part(text="hello response")]), - model_version="test-model-v1", - usage_metadata=types.GenerateContentResponseUsageMetadata( - prompt_token_count=20, - candidates_token_count=30, - tool_use_prompt_token_count=5, - thoughts_token_count=10, - ), - ) - _metrics.record_client_token_usage( - agent_name="test_agent", - llm_request=llm_request, - responses=[response], - ) - client_token_usage_hist = mock_meter_setup["client_token_usage"] - assert client_token_usage_hist.record.call_count == 2 - - base_attributes = { - "gen_ai.agent.name": "test_agent", - "gen_ai.operation.name": "generate_content", - "gen_ai.provider.name": "gemini", - "gen_ai.request.model": "test-model", - "gen_ai.response.model": "test-model-v1", - } - - input_call = None - output_call = None - - for args, kwargs in client_token_usage_hist.record.call_args_list: - token_type = kwargs.get("attributes", {}).get("gen_ai.token.type") - if token_type == "input": - input_call = (args, kwargs) - elif token_type == "output": - output_call = (args, kwargs) - - assert input_call is not None, "Missing 'input' token usage record" - assert output_call is not None, "Missing 'output' token usage record" - - # Verify input tokens (prompt_token_count + tool_use_prompt_token_count) - assert input_call[0][0] == 25 - assert input_call[1]["attributes"] == base_attributes | { - "gen_ai.token.type": "input" - } - - # Verify output tokens (candidates_token_count + thoughts_token_count) - assert output_call[0][0] == 40 - assert output_call[1]["attributes"] == base_attributes | { - "gen_ai.token.type": "output" - } diff --git a/tests/unittests/telemetry/test_node_functional.py b/tests/unittests/telemetry/test_node_functional.py deleted file mode 100644 index 661cbb3d45..0000000000 --- a/tests/unittests/telemetry/test_node_functional.py +++ /dev/null @@ -1,476 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from contextlib import aclosing -from dataclasses import dataclass -from dataclasses import field -import sys - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - -from google.adk import Event -from google.adk import Workflow -from google.adk.agents.llm_agent import Agent -from google.adk.runners import InMemoryRunner -from google.adk.telemetry import node_tracing -from google.adk.telemetry import tracing -from google.adk.tools.function_tool import FunctionTool -from google.adk.workflow._base_node import START -from google.adk.workflow._workflow import Workflow -from google.genai.types import Content -from google.genai.types import Part -from opentelemetry.sdk.trace import ReadableSpan -from opentelemetry.sdk.trace import TracerProvider -from opentelemetry.sdk.trace.export import SimpleSpanProcessor -from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter -from opentelemetry.util.types import AttributeValue -import pytest - -from ..testing_utils import MockModel -from ..testing_utils import TestInMemoryRunner -from .utils import set_aclosing_wrapping_assertions - -# Difficult to extract, non deterministic attribute keys. -# We check only for their presence, instead of their values. -NON_DETERMINISTIC_ATTRIBUTE_KEYS = { - 'gcp.vertex.agent.event_id', - 'gen_ai.tool.call.id', - 'gcp.vertex.agent.associated_event_ids', -} - -# We replace the non deterministic fields that are difficult to extract -# with a "PRESENT" literal to still test their presence. -PRESENT = 'PRESENT' - - -@dataclass(frozen=True) -class SpanDigest: - name: str - attributes: dict[str, AttributeValue] - children: list[SpanDigest] = field(default_factory=list) - - @staticmethod - def build(spans: tuple[ReadableSpan, ...]) -> SpanDigest: - """Builds the in-memory span tree. - - Used for clear diff with pytest assertions. - """ - digest_by_id = { - span.context.span_id: SpanDigest.from_span(span) - for span in spans - if span.context is not None - } - root = None - for span in spans: - if span.context is None: - continue - digest = digest_by_id[span.context.span_id] - if span.parent and span.parent.span_id in digest_by_id: - parent_digest = digest_by_id[span.parent.span_id] - parent_digest.children.append(digest) - else: - if root is not None: - raise ValueError('Multiple root spans found.') - root = digest - - # Sort children for deterministic comparisons. - for digest in digest_by_id.values(): - digest.children.sort(key=lambda span: span.name) - - if root is None: - raise ValueError('No root span found in the provided spans.') - return root - - @classmethod - def from_span(cls, span: ReadableSpan) -> Self: - determinized_attributes = { - attr_key: ( - attr_val - if attr_key not in NON_DETERMINISTIC_ATTRIBUTE_KEYS - else PRESENT - ) - for attr_key, attr_val in (span.attributes or {}).items() - } - - return cls( - name=span.name, - attributes=determinized_attributes, - ) - - -@pytest.fixture -def span_exporter(monkeypatch: pytest.MonkeyPatch) -> InMemorySpanExporter: - # Disable capturing message content to make attributes deterministic - monkeypatch.setenv('ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS', 'false') - - tracer_provider = TracerProvider() - span_exporter = InMemorySpanExporter() - tracer_provider.add_span_processor(SimpleSpanProcessor(span_exporter)) - real_tracer = tracer_provider.get_tracer(__name__) - - def do_replace(tracer): - monkeypatch.setattr( - tracer, 'start_as_current_span', real_tracer.start_as_current_span - ) - - do_replace(tracing.tracer) - do_replace(node_tracing.tracer) - - return span_exporter - - -@pytest.mark.asyncio -async def test_tracer_start_as_current_span( - span_exporter: InMemorySpanExporter, -): - """Test creation of multiple spans and their attributes in an E2E runner invocation with a workflow.""" - - # Arrange - set_aclosing_wrapping_assertions() - - mock_model = MockModel.create( - responses=[ - Part.from_function_call(name='some_tool', args={'arg1': 'val1'}), - Part.from_text(text='text response'), - ] - ) - - def some_tool(arg1: str): - """A sample tool.""" - - return f'processed {arg1}' - - test_agent = Agent( - name='some_root_agent', - description='A sample root agent.', - model=mock_model, - tools=[ - FunctionTool(some_tool), - ], - ) - - async def some_node(ctx, node_input): - return 'some result' - - workflow = Workflow( - name='my_workflow', - edges=[ - (START, some_node, test_agent), - ], - ) - - user_id = 'some_user' - app_name = 'some_app' - - runner = InMemoryRunner(app_name=app_name, node=workflow) - session = await runner.session_service.create_session( - app_name=app_name, user_id=user_id - ) - content = Content(parts=[Part.from_text(text='hello')], role='user') - - # Act - captured_events: list[Event] = [] - async with aclosing( - runner.run_async( - user_id=user_id, session_id=session.id, new_message=content - ) - ) as agen: - async for event in agen: - captured_events.append(event) - - invocation_id = captured_events[0].invocation_id - - # Assert - finished_spans = span_exporter.get_finished_spans() - _verify_associated_events(finished_spans, captured_events) - - span_tree = SpanDigest.build(finished_spans) - assert span_tree == SpanDigest( - name='invocation', - attributes={}, - children=[ - SpanDigest( - name='invoke_workflow my_workflow', - attributes={ - 'gen_ai.conversation.id': session.id, - 'gen_ai.operation.name': 'invoke_workflow', - 'gen_ai.workflow.name': 'my_workflow', - # Workflow in this test doesn't emit any events directly. - # Commented exists to to document this behavior. - # 'gcp.vertex.agent.associated_event_ids': PRESENT, - }, - children=[ - SpanDigest( - name='invoke_agent some_root_agent', - attributes={ - 'gen_ai.agent.description': 'A sample root agent.', - 'gen_ai.agent.name': 'some_root_agent', - 'gen_ai.conversation.id': session.id, - 'gen_ai.operation.name': 'invoke_agent', - }, - children=[ - SpanDigest( - name='call_llm', - attributes={ - 'gcp.vertex.agent.event_id': PRESENT, - 'gcp.vertex.agent.invocation_id': ( - invocation_id - ), - 'gcp.vertex.agent.llm_request': '{}', - 'gcp.vertex.agent.llm_response': '{}', - 'gen_ai.request.model': 'mock', - 'gen_ai.system': 'gcp.vertex.agent', - 'gcp.vertex.agent.session_id': session.id, - }, - children=[ - SpanDigest( - name='generate_content mock', - attributes={ - 'gcp.vertex.agent.event_id': PRESENT, - 'gcp.vertex.agent.invocation_id': ( - invocation_id - ), - 'gen_ai.agent.name': ( - 'some_root_agent' - ), - 'gen_ai.conversation.id': session.id, - 'gen_ai.operation.name': ( - 'generate_content' - ), - 'gen_ai.request.model': 'mock', - 'gen_ai.system': 'gemini', - }, - children=[ - SpanDigest( - name='execute_tool some_tool', - attributes={ - 'gcp.vertex.agent.event_id': ( - PRESENT - ), - 'gcp.vertex.agent.llm_request': ( - '{}' - ), - 'gcp.vertex.agent.llm_response': ( - '{}' - ), - 'gcp.vertex.agent.tool_call_args': ( - '{}' - ), - 'gcp.vertex.agent.tool_response': ( - '{}' - ), - 'gen_ai.operation.name': ( - 'execute_tool' - ), - 'gen_ai.tool.call.id': ( - PRESENT - ), - 'gen_ai.tool.description': ( - 'A sample tool.' - ), - 'gen_ai.tool.name': ( - 'some_tool' - ), - 'gen_ai.tool.type': ( - 'FunctionTool' - ), - }, - ), - ], - ), - ], - ), - SpanDigest( - name='call_llm', - attributes={ - 'gcp.vertex.agent.invocation_id': ( - invocation_id - ), - 'gcp.vertex.agent.llm_request': '{}', - 'gcp.vertex.agent.llm_response': '{}', - 'gcp.vertex.agent.event_id': PRESENT, - 'gcp.vertex.agent.session_id': session.id, - 'gen_ai.request.model': 'mock', - 'gen_ai.system': 'gcp.vertex.agent', - }, - children=[ - SpanDigest( - name='generate_content mock', - attributes={ - 'gcp.vertex.agent.event_id': PRESENT, - 'gcp.vertex.agent.invocation_id': ( - invocation_id - ), - 'gen_ai.agent.name': ( - 'some_root_agent' - ), - 'gen_ai.conversation.id': session.id, - 'gen_ai.operation.name': ( - 'generate_content' - ), - 'gen_ai.request.model': 'mock', - 'gen_ai.system': 'gemini', - }, - ), - ], - ), - ], - ), - SpanDigest( - name='invoke_node some_node', - attributes={ - 'gen_ai.conversation.id': session.id, - 'gen_ai.operation.name': 'invoke_node', - 'gcp.vertex.agent.associated_event_ids': 'PRESENT', - }, - ), - ], - ), - ], - ) - - -def _verify_associated_events( - spans: tuple[ReadableSpan, ...], events: list[Event] -): - def _nodelike_name(span: ReadableSpan) -> str: - for prefix in ['invoke_node ', 'invoke_workflow ', 'invoke_agent ']: - if span.name.startswith(prefix): - return span.name.replace(prefix, '') - return '' - - def _emitting_node_name(event: Event) -> str: - # Strip out - # 1. Path except for the last node (everything before "/") - # 2. Retry count (everything after "@") - return event.node_info.path.split('/')[-1].split('@')[0] - - events_by_id = {event.id: event for event in events} - for span in spans: - if not span.attributes: - continue - - associated_ids = span.attributes.get( - 'gcp.vertex.agent.associated_event_ids', None - ) - if associated_ids is None: - continue - - assert isinstance(associated_ids, tuple) - assert len(associated_ids) > 0, f'Span name {span.name} emitted no events' - - for event_id in associated_ids: - event = events_by_id[str(event_id)] - assert _nodelike_name(span) == _emitting_node_name(event) - - -@pytest.mark.asyncio -async def test_exception_preserves_attributes( - span_exporter: InMemorySpanExporter, -): - """Test when an exception occurs during tool execution, span attributes are still present on spans where they are expected.""" - - # Arrange - mock_model = MockModel.create( - responses=[ - Part.from_function_call(name='some_tool', args={}), - ] - ) - - async def some_tool(): - """Tool that fails.""" - raise ValueError('This tool always fails') - - test_agent = Agent( - name='some_root_agent', - description='Failing agent.', - model=mock_model, - tools=[ - FunctionTool(some_tool), - ], - ) - test_runner = TestInMemoryRunner(node=test_agent) - - # Act - captured_events = [] - with pytest.raises(ValueError, match='This tool always fails'): - async with aclosing( - test_runner.run_async_with_new_session_agen('hello') - ) as agen: - async for event in agen: - captured_events.append(event) - - # Assert - spans = span_exporter.get_finished_spans() - _verify_associated_events(spans, captured_events) - spans_by_name = {span.name: span for span in spans} - - assert 'execute_tool some_tool' in spans_by_name - tool_span = spans_by_name['execute_tool some_tool'] - - attrs = dict(tool_span.attributes) - # Dynamic ID - tool_call_id = attrs.get('gen_ai.tool.call.id') - - assert dict(tool_span.attributes) == { - 'gen_ai.operation.name': 'execute_tool', - 'gen_ai.tool.name': 'some_tool', - 'gen_ai.tool.description': 'Tool that fails.', - 'gen_ai.tool.type': 'FunctionTool', - 'error.type': 'ValueError', - 'gcp.vertex.agent.llm_request': '{}', - 'gcp.vertex.agent.llm_response': '{}', - 'gcp.vertex.agent.tool_call_args': '{}', - 'gen_ai.tool.call.id': tool_call_id, - 'gcp.vertex.agent.tool_response': '{}', - } - - -@pytest.mark.asyncio -async def test_no_generate_content_for_gemini_model_when_already_instrumented( - span_exporter: InMemorySpanExporter, - monkeypatch: pytest.MonkeyPatch, -): - """Tests that generate_content span is not created if already instrumented.""" - # Arrange - mock_model = MockModel.create(responses=['hello']) - test_agent = Agent(name='test', model=mock_model) - test_runner = TestInMemoryRunner(node=test_agent) - - monkeypatch.setattr( - tracing, - '_instrumented_with_opentelemetry_instrumentation_google_genai', - lambda: True, - ) - monkeypatch.setattr( - tracing, - '_is_gemini_agent', - lambda _: True, - ) - - # Act - async with aclosing( - test_runner.run_async_with_new_session_agen('hello') - ) as agen: - async for _ in agen: - pass - - # Assert - spans = span_exporter.get_finished_spans() - assert not any(span.name.startswith('generate_content') for span in spans) diff --git a/tests/unittests/telemetry/test_setup.py b/tests/unittests/telemetry/test_setup.py index bca64dd2dd..0bd1ec7b56 100644 --- a/tests/unittests/telemetry/test_setup.py +++ b/tests/unittests/telemetry/test_setup.py @@ -79,7 +79,7 @@ def test_maybe_set_otel_providers( """ # Arrange. for k, v in env_vars.items(): - monkeypatch.setenv(k, v) + os.environ[k] = v trace_provider_mock = mock.MagicMock() monkeypatch.setattr( "opentelemetry.trace.set_tracer_provider", @@ -95,18 +95,6 @@ def test_maybe_set_otel_providers( "opentelemetry._logs.set_logger_provider", logs_provider_mock, ) - monkeypatch.setattr( - "google.adk.telemetry.setup._get_otel_span_exporter", - lambda: mock.MagicMock(), - ) - monkeypatch.setattr( - "google.adk.telemetry.setup._get_otel_metrics_exporter", - lambda: mock.MagicMock(), - ) - monkeypatch.setattr( - "google.adk.telemetry.setup._get_otel_logs_exporter", - lambda: mock.MagicMock(), - ) # Act. maybe_set_otel_providers() diff --git a/tests/unittests/telemetry/test_spans.py b/tests/unittests/telemetry/test_spans.py index 36f0183b70..c0e4cc20b9 100644 --- a/tests/unittests/telemetry/test_spans.py +++ b/tests/unittests/telemetry/test_spans.py @@ -27,7 +27,6 @@ from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.telemetry._experimental_semconv import _safe_json_serialize_no_whitespaces from google.adk.telemetry.tracing import _safe_json_serialize -from google.adk.telemetry.tracing import _use_extra_generate_content_attributes from google.adk.telemetry.tracing import ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS from google.adk.telemetry.tracing import GCP_MCP_SERVER_DESTINATION_ID from google.adk.telemetry.tracing import trace_agent_invocation @@ -198,25 +197,21 @@ async def test_trace_call_llm(monkeypatch, mock_span_fixture): mock.call('gen_ai.request.top_p', 0.95), mock.call('gen_ai.request.max_tokens', 1024), mock.call('gcp.vertex.agent.llm_response', mock.ANY), + mock.call('gen_ai.usage.input_tokens', 50), + mock.call('gen_ai.usage.output_tokens', 50), mock.call('gen_ai.usage.experimental.reasoning_tokens_limit', 10), + mock.call('gen_ai.usage.experimental.reasoning_tokens', 10), mock.call('gen_ai.response.finish_reasons', ['stop']), ] - - expected_usage_attrs = { - 'gen_ai.usage.input_tokens': 50, - 'gen_ai.usage.output_tokens': 60, - 'gen_ai.usage.reasoning.output_tokens': 10, - } if hasattr(llm_response.usage_metadata, 'system_instruction_tokens'): - expected_usage_attrs[ - 'gen_ai.usage.experimental.system_instruction_tokens' - ] = 5 + expected_calls.append( + mock.call('gen_ai.usage.experimental.system_instruction_tokens', 5) + ) assert mock_span_fixture.set_attribute.call_count == len(expected_calls) + 5 mock_span_fixture.set_attribute.assert_has_calls( expected_calls, any_order=True ) - mock_span_fixture.set_attributes.assert_called_once_with(expected_usage_attrs) @pytest.mark.asyncio @@ -815,14 +810,12 @@ async def test_trace_send_data_disabling_request_response_content( return_value='test_system', ) @pytest.mark.parametrize('capture_content', [True, False]) -@pytest.mark.parametrize('user_id', ['some-user-id', None]) async def test_generate_content_span( mock_guess_system_name, mock_tracer, mock_otel_logger, monkeypatch, capture_content, - user_id, ): """Test native generate_content span creation with attributes and logs.""" # Arrange @@ -837,7 +830,7 @@ async def test_generate_content_span( agent = LlmAgent(name='test_agent', model='not-a-gemini-model') invocation_context = await _create_invocation_context(agent) - invocation_context.session.user_id = user_id + system_instruction = types.Content( parts=[types.Part.from_text(text='You are a helpful assistant.')], ) @@ -890,23 +883,17 @@ async def test_generate_content_span( mock_span.set_attribute.assert_any_call( GEN_AI_RESPONSE_FINISH_REASONS, ['stop'] ) + mock_span.set_attribute.assert_any_call(GEN_AI_USAGE_INPUT_TOKENS, 10) + mock_span.set_attribute.assert_any_call(GEN_AI_USAGE_OUTPUT_TOKENS, 20) - mock_span.set_attributes.assert_any_call({ - GEN_AI_USAGE_INPUT_TOKENS: 10, - GEN_AI_USAGE_OUTPUT_TOKENS: 20, - }) - mock_span.set_attributes.assert_any_call({ + mock_span.set_attributes.assert_called_once_with({ GEN_AI_AGENT_NAME: invocation_context.agent.name, GEN_AI_CONVERSATION_ID: invocation_context.session.id, + USER_ID: invocation_context.session.user_id, 'gcp.vertex.agent.event_id': 'event-123', 'gcp.vertex.agent.invocation_id': invocation_context.invocation_id, }) - all_set_attribute_keys = [ - call.args[0] for call in mock_span.set_attribute.call_args_list - ] - assert USER_ID not in all_set_attribute_keys - # Assert Logs assert mock_otel_logger.emit.call_count == 4 @@ -945,11 +932,8 @@ async def test_generate_content_span( assert len(user_logs) == 2 assert expected_user1_body == user_logs[0].body assert expected_user2_body == user_logs[1].body - expected_user_log_attributes = {GEN_AI_SYSTEM: 'test_system'} - if capture_content and user_id is not None: - expected_user_log_attributes[USER_ID] = user_id for log in user_logs: - assert log.attributes == expected_user_log_attributes + assert log.attributes == {GEN_AI_SYSTEM: 'test_system'} choice_log = next( (lr for lr in log_records if lr.event_name == 'gen_ai.choice'), @@ -960,52 +944,6 @@ async def test_generate_content_span( assert choice_log.attributes == {GEN_AI_SYSTEM: 'test_system'} -@pytest.mark.asyncio -@mock.patch( - 'google.adk.telemetry.tracing._use_extra_generate_content_attributes' -) -async def test_generate_content_span_with_genai_instrumentation( - mock_use_extra, - monkeypatch, -): - """Test that genai-instrumentation delegation branch does not forward USER_ID in attributes.""" - monkeypatch.setattr( - 'google.adk.telemetry.tracing._instrumented_with_opentelemetry_instrumentation_google_genai', - lambda: True, - ) - # _is_gemini_agent returns true for gemini models. - agent = LlmAgent(name='test_agent', model='gemini-1.5-pro') - invocation_context = await _create_invocation_context(agent) - - llm_request = LlmRequest( - model='gemini-1.5-pro', - contents=[types.Content(role='user', parts=[types.Part(text='Hello')])], - ) - - model_response_event = mock.MagicMock() - model_response_event.id = 'event-123' - - mock_cm = mock.MagicMock() - mock_use_extra.return_value = mock_cm - - async with use_inference_span( - llm_request, invocation_context, model_response_event - ): - pass - - mock_use_extra.assert_called_once() - args, _ = mock_use_extra.call_args - common_attributes = args[0] - - assert GEN_AI_AGENT_NAME in common_attributes - assert GEN_AI_CONVERSATION_ID in common_attributes - assert 'gcp.vertex.agent.event_id' in common_attributes - assert 'gcp.vertex.agent.invocation_id' in common_attributes - - # USER_ID should NOT be in common_attributes passed to the genai instrumentor - assert USER_ID not in common_attributes - - def _mock_callable_tool(): """Description of some tool.""" return 'result' @@ -1063,14 +1001,12 @@ def _mock_tool_dict() -> types.ToolDict: 'capture_content', ['SPAN_AND_EVENT', 'EVENT_ONLY', 'SPAN_ONLY', 'NO_CONTENT'], ) -@pytest.mark.parametrize('user_id', ['some-user-id', None]) async def test_generate_content_span_with_experimental_semconv( mock_guess_system_name, mock_tracer, mock_otel_logger, monkeypatch, capture_content, - user_id, ): """Test native generate_content span creation with attributes and logs with experimental semconv enabled.""" # Arrange @@ -1089,7 +1025,6 @@ async def test_generate_content_span_with_experimental_semconv( agent = LlmAgent(name='test_agent', model='not-a-gemini-model') invocation_context = await _create_invocation_context(agent) - invocation_context.session.user_id = user_id system_instruction = types.Content( parts=[types.Part.from_text(text='You are a helpful assistant.')], @@ -1268,23 +1203,17 @@ async def test_generate_content_span_with_experimental_semconv( mock_span.set_attribute.assert_any_call( GEN_AI_RESPONSE_FINISH_REASONS, ['stop'] ) + mock_span.set_attribute.assert_any_call(GEN_AI_USAGE_INPUT_TOKENS, 10) + mock_span.set_attribute.assert_any_call(GEN_AI_USAGE_OUTPUT_TOKENS, 20) - mock_span.set_attributes.assert_any_call({ - GEN_AI_USAGE_INPUT_TOKENS: 10, - GEN_AI_USAGE_OUTPUT_TOKENS: 20, - }) - mock_span.set_attributes.assert_any_call({ + mock_span.set_attributes.assert_called_once_with({ GEN_AI_AGENT_NAME: invocation_context.agent.name, GEN_AI_CONVERSATION_ID: invocation_context.session.id, + USER_ID: invocation_context.session.user_id, 'gcp.vertex.agent.event_id': 'event-123', 'gcp.vertex.agent.invocation_id': invocation_context.invocation_id, }) - all_set_attribute_keys = [ - call.args[0] for call in mock_span.set_attribute.call_args_list - ] - assert USER_ID not in all_set_attribute_keys - if capture_content in ['SPAN_AND_EVENT', 'SPAN_ONLY']: mock_span.set_attribute.assert_any_call( GEN_AI_SYSTEM_INSTRUCTIONS, @@ -1331,15 +1260,6 @@ async def test_generate_content_span_with_experimental_semconv( attributes = operation_details_log.attributes - if ( - capture_content in ['EVENT_ONLY', 'SPAN_AND_EVENT'] - and user_id is not None - ): - assert USER_ID in attributes - assert attributes[USER_ID] == user_id - else: - assert USER_ID not in attributes - if capture_content in ['SPAN_AND_EVENT', 'EVENT_ONLY']: assert GEN_AI_SYSTEM_INSTRUCTIONS in attributes assert ( @@ -1477,295 +1397,3 @@ def test_safe_json_serialize_no_whitespaces_circular_dict_returns_not_serializab obj = {} obj['self'] = obj assert _safe_json_serialize_no_whitespaces(obj) == '' - - -def test_use_extra_generate_content_attributes_upgraded_version(monkeypatch): - # Arrange: Mock the presence of the new event-only context key in the contrib module - from opentelemetry.instrumentation import google_genai - - mock_event_only_key = 'MOCKED_EVENT_ONLY_EXTRA_ATTRIBUTES_CONTEXT_KEY' - monkeypatch.setattr( - google_genai, - 'GENERATE_CONTENT_EVENT_ONLY_EXTRA_ATTRIBUTES_CONTEXT_KEY', - mock_event_only_key, - raising=False, - ) - - # Act: Run the helper with mock.patch on the otel context - with mock.patch('opentelemetry.context.set_value') as mock_set_value: - with _use_extra_generate_content_attributes( - extra_attributes={'span.attr': 'value'}, - log_only_extra_attributes={USER_ID: 'user_123'}, - ): - pass - - # Assert: Verify set_value was called with the mocked event-only key - mock_set_value.assert_any_call( - mock_event_only_key, - {USER_ID: 'user_123'}, - context=mock.ANY, - ) - - -def test_use_extra_generate_content_attributes_older_version(monkeypatch): - # Arrange: Simulate an older version by deleting the key if present - from opentelemetry.instrumentation import google_genai - - if hasattr( - google_genai, 'GENERATE_CONTENT_EVENT_ONLY_EXTRA_ATTRIBUTES_CONTEXT_KEY' - ): - monkeypatch.delattr( - google_genai, 'GENERATE_CONTENT_EVENT_ONLY_EXTRA_ATTRIBUTES_CONTEXT_KEY' - ) - - # Act & Assert: Ensure execution does not throw any ImportError/AttributeError - try: - with _use_extra_generate_content_attributes( - extra_attributes={'span.attr': 'value'}, - log_only_extra_attributes={USER_ID: 'user_123'}, - ): - pass - except Exception as e: # pylint: disable=broad-exception-caught - pytest.fail(f'Graceful degradation failed: {e}') - - -# --------------------------------------------------------------------------- -# Tests for _detect_error_in_response -# --------------------------------------------------------------------------- - - -class _ErrorDetectingTool(BaseTool): - """A test tool whose _detect_error_in_response raises.""" - - async def run_async(self, *, args, tool_context): - return 'result' - - def _detect_error_in_response(self, response: Any) -> Optional[str]: - raise RuntimeError('detection exploded') - - -def test_base_tool_does_not_define_detect_error_in_response(): - """BaseTool intentionally does not expose _detect_error_in_response as a public hook.""" - tool = SimpleTestTool(name='t', description='d') - # The hook is opt-in per subclass; BaseTool itself must not declare it so - # that telemetry callers can use getattr(...) to skip detection. - assert not hasattr(tool, '_detect_error_in_response') - - -def test_detect_error_function_tool_error(): - from google.adk.tools.function_tool import FunctionTool - - tool = FunctionTool(func=lambda: None) - assert ( - tool._detect_error_in_response({'error': 'missing arg'}) == 'TOOL_ERROR' - ) - - -def test_detect_error_function_tool_no_error(): - from google.adk.tools.function_tool import FunctionTool - - tool = FunctionTool(func=lambda: None) - assert tool._detect_error_in_response({'result': 'ok'}) is None - assert tool._detect_error_in_response('plain string') is None - assert tool._detect_error_in_response(None) is None - - -def test_detect_error_rest_api_tool(): - from google.adk.tools.openapi_tool.openapi_spec_parser.rest_api_tool import RestApiTool - - tool = RestApiTool.__new__(RestApiTool) - assert ( - tool._detect_error_in_response({'error': 'Status Code: 404'}) - == 'HTTP_ERROR' - ) - assert tool._detect_error_in_response({'result': 'ok'}) is None - assert tool._detect_error_in_response({'text': 'html response'}) is None - - -def test_detect_error_mcp_tool(): - from google.adk.tools.mcp_tool.mcp_tool import McpTool as AdkMcpTool - - tool = AdkMcpTool.__new__(AdkMcpTool) - assert ( - tool._detect_error_in_response({'isError': True, 'content': []}) - == 'MCP_TOOL_ERROR' - ) - assert ( - tool._detect_error_in_response({'isError': False, 'content': []}) is None - ) - assert tool._detect_error_in_response({'content': [{'text': 'ok'}]}) is None - - -def test_detect_error_google_tool(): - from google.adk.tools.google_tool import GoogleTool - - tool = GoogleTool.__new__(GoogleTool) - assert ( - tool._detect_error_in_response( - {'status': 'ERROR', 'error_details': 'fail'} - ) - == 'TOOL_ERROR' - ) - assert tool._detect_error_in_response({'status': 'OK', 'data': []}) is None - assert ( - tool._detect_error_in_response({'error': 'something'}) is None - ) # GoogleTool checks status, not error key - - -def test_detect_error_bash_tool(): - from google.adk.tools.bash_tool import ExecuteBashTool - - tool = ExecuteBashTool.__new__(ExecuteBashTool) - assert ( - tool._detect_error_in_response({'error': 'Execution failed'}) - == 'TOOL_ERROR' - ) - assert ( - tool._detect_error_in_response( - {'error': 'timeout', 'stdout': '', 'stderr': ''} - ) - == 'TOOL_ERROR' - ) - assert ( - tool._detect_error_in_response({'stdout': 'ok', 'returncode': 0}) is None - ) - - -def _environment_tool_classes(): - from google.adk.tools.environment._edit_file_tool import EditFileTool - from google.adk.tools.environment._execute_tool import ExecuteTool - from google.adk.tools.environment._read_file_tool import ReadFileTool - from google.adk.tools.environment._write_file_tool import WriteFileTool - - return [ExecuteTool, ReadFileTool, WriteFileTool, EditFileTool] - - -@pytest.mark.parametrize( - 'cls', - _environment_tool_classes(), - ids=lambda c: c.__name__, -) -@pytest.mark.parametrize( - 'response,expected', - [ - ({'status': 'error', 'error': 'fail'}, 'TOOL_ERROR'), - ({'status': 'ok', 'message': 'done'}, None), - # Environment tools check status, not the error key. - ({'error': 'something'}, None), - ], - ids=['status_error', 'status_ok', 'error_key_only'], -) -def test_detect_error_environment_tools(cls, response, expected): - tool = cls.__new__(cls) - assert tool._detect_error_in_response(response) == expected - - -@pytest.mark.parametrize( - 'cls_name', - ['LoadSkillTool', 'LoadSkillResourceTool', 'RunSkillScriptTool'], -) -@pytest.mark.parametrize( - 'response,expected', - [ - ( - {'error': 'missing', 'error_code': 'INVALID_ARGUMENTS'}, - 'INVALID_ARGUMENTS', - ), - ({'error': 'generic'}, 'TOOL_ERROR'), - ({'skill_name': 'x', 'instructions': 'y'}, None), - ], - ids=['with_error_code', 'error_no_code', 'no_error'], -) -def test_detect_error_skill_tools(cls_name, response, expected): - skill_toolset = pytest.importorskip('google.adk.tools.skill_toolset') - cls = getattr(skill_toolset, cls_name) - tool = cls.__new__(cls) - assert tool._detect_error_in_response(response) == expected - - -def test_detect_error_discovery_engine_search_tool(): - mod = pytest.importorskip('google.adk.tools.discovery_engine_search_tool') - DiscoveryEngineSearchTool = mod.DiscoveryEngineSearchTool - - tool = DiscoveryEngineSearchTool.__new__(DiscoveryEngineSearchTool) - assert ( - tool._detect_error_in_response( - {'status': 'error', 'error_message': 'fail'} - ) - == 'TOOL_ERROR' - ) - assert tool._detect_error_in_response({'status': 'ok', 'results': []}) is None - - -# --------------------------------------------------------------------------- -# Tests for trace_tool_call with error_type parameter -# --------------------------------------------------------------------------- - - -def test_trace_tool_call_with_error_type( - monkeypatch, mock_span_fixture, mock_tool_fixture -): - """error_type sets the span error.type attribute when no exception.""" - monkeypatch.setattr( - 'opentelemetry.trace.get_current_span', lambda: mock_span_fixture - ) - - trace_tool_call( - tool=mock_tool_fixture, - args={'x': 1}, - function_response_event=None, - error=None, - error_type='HTTP_ERROR', - ) - - mock_span_fixture.set_attribute.assert_any_call('error.type', 'HTTP_ERROR') - - -def test_trace_tool_call_error_takes_precedence_over_error_type( - monkeypatch, mock_span_fixture, mock_tool_fixture -): - """When both error and error_type are provided, error takes precedence.""" - monkeypatch.setattr( - 'opentelemetry.trace.get_current_span', lambda: mock_span_fixture - ) - - trace_tool_call( - tool=mock_tool_fixture, - args={'x': 1}, - function_response_event=None, - error=ValueError('boom'), - error_type='HTTP_ERROR', - ) - - # ValueError should be set, not HTTP_ERROR. - mock_span_fixture.set_attribute.assert_any_call('error.type', 'ValueError') - error_type_calls = [ - c - for c in mock_span_fixture.set_attribute.call_args_list - if c == mock.call('error.type', mock.ANY) - ] - assert len(error_type_calls) == 1 - - -def test_trace_tool_call_no_error_no_error_type( - monkeypatch, mock_span_fixture, mock_tool_fixture -): - """When neither error nor error_type is set, no error.type attribute.""" - monkeypatch.setattr( - 'opentelemetry.trace.get_current_span', lambda: mock_span_fixture - ) - - trace_tool_call( - tool=mock_tool_fixture, - args={'x': 1}, - function_response_event=None, - error=None, - error_type=None, - ) - - error_type_calls = [ - c - for c in mock_span_fixture.set_attribute.call_args_list - if c == mock.call('error.type', mock.ANY) - ] - assert len(error_type_calls) == 0 diff --git a/tests/unittests/telemetry/test_token_usage.py b/tests/unittests/telemetry/test_token_usage.py deleted file mode 100644 index fcb37adcca..0000000000 --- a/tests/unittests/telemetry/test_token_usage.py +++ /dev/null @@ -1,221 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from google.adk.telemetry import _token_usage -from google.genai import types -import pytest - - -@pytest.fixture(name="usage_metadata") -def fixture_usage_metadata() -> types.GenerateContentResponseUsageMetadata: - """Provides a baseline GenerateContentResponseUsageMetadata fixture with all token counts initialized to None.""" - m = types.GenerateContentResponseUsageMetadata() - m.prompt_token_count = None - m.tool_use_prompt_token_count = None - m.candidates_token_count = None - m.thoughts_token_count = None - m.cached_content_token_count = None - return m - - -def test_input_token_count_all_present( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests input_token_count when all components are present.""" - usage_metadata.prompt_token_count = 10 - usage_metadata.tool_use_prompt_token_count = 5 - token_usage = _token_usage.TokenUsage(usage_metadata) - assert token_usage.input_token_count == 15 - - -def test_input_token_count_only_prompt( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests input_token_count when only prompt_token_count is present.""" - usage_metadata.prompt_token_count = 10 - usage_metadata.tool_use_prompt_token_count = None - token_usage = _token_usage.TokenUsage(usage_metadata) - assert token_usage.input_token_count == 10 - - -def test_input_token_count_only_tool( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests input_token_count when only tool_use_prompt_token_count is present.""" - usage_metadata.prompt_token_count = None - usage_metadata.tool_use_prompt_token_count = 5 - token_usage = _token_usage.TokenUsage(usage_metadata) - assert token_usage.input_token_count == 5 - - -def test_input_token_count_none( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests input_token_count when all components are None.""" - usage_metadata.prompt_token_count = None - usage_metadata.tool_use_prompt_token_count = None - token_usage = _token_usage.TokenUsage(usage_metadata) - assert token_usage.input_token_count is None - - -def test_input_token_count_zero( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests input_token_count when all components are zero.""" - usage_metadata.prompt_token_count = 0 - usage_metadata.tool_use_prompt_token_count = 0 - token_usage = _token_usage.TokenUsage(usage_metadata) - assert token_usage.input_token_count == 0 - - -def test_input_token_count_metadata_none(): - """Tests input_token_count when usage_metadata is None.""" - token_usage = _token_usage.TokenUsage(None) - assert token_usage.input_token_count is None - - -def test_input_token_count_missing_tool_use_attr(): - """Tests input_token_count when tool_use_prompt_token_count is missing.""" - token_usage = _token_usage.TokenUsage( - types.GenerateContentResponseUsageMetadata(prompt_token_count=10) - ) - assert token_usage.input_token_count == 10 - - -def test_output_token_count_all_present( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests output_token_count when all components are present.""" - usage_metadata.candidates_token_count = 20 - usage_metadata.thoughts_token_count = 8 - token_usage = _token_usage.TokenUsage(usage_metadata) - assert token_usage.output_token_count == 28 - - -def test_output_token_count_only_candidates( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests output_token_count when only candidates_token_count is present.""" - usage_metadata.candidates_token_count = 20 - usage_metadata.thoughts_token_count = None - token_usage = _token_usage.TokenUsage(usage_metadata) - assert token_usage.output_token_count == 20 - - -def test_output_token_count_only_thoughts( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests output_token_count when only thoughts_token_count is present.""" - usage_metadata.candidates_token_count = None - usage_metadata.thoughts_token_count = 8 - token_usage = _token_usage.TokenUsage(usage_metadata) - assert token_usage.output_token_count == 8 - - -def test_output_token_count_none( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests output_token_count when all components are None.""" - usage_metadata.candidates_token_count = None - usage_metadata.thoughts_token_count = None - token_usage = _token_usage.TokenUsage(usage_metadata) - assert token_usage.output_token_count is None - - -def test_output_token_count_zero( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests output_token_count when all components are zero.""" - usage_metadata.candidates_token_count = 0 - usage_metadata.thoughts_token_count = 0 - token_usage = _token_usage.TokenUsage(usage_metadata) - assert token_usage.output_token_count == 0 - - -def test_output_token_count_metadata_none(): - """Tests output_token_count when usage_metadata is None.""" - token_usage = _token_usage.TokenUsage(None) - assert token_usage.output_token_count is None - - -def test_to_attributes_full( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests to_attributes with all attributes present.""" - usage_metadata.prompt_token_count = 10 - usage_metadata.tool_use_prompt_token_count = 5 - usage_metadata.candidates_token_count = 20 - usage_metadata.thoughts_token_count = 8 - usage_metadata.cached_content_token_count = 100 - - token_usage = _token_usage.TokenUsage(usage_metadata) - attrs = token_usage.to_attributes() - assert attrs[_token_usage.GEN_AI_USAGE_INPUT_TOKENS] == 15 - assert attrs[_token_usage.GEN_AI_USAGE_OUTPUT_TOKENS] == 28 - assert attrs[_token_usage.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] == 100 - assert attrs[_token_usage.GEN_AI_USAGE_REASONING_OUTPUT_TOKENS] == 8 - - -def test_to_attributes_partial( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests to_attributes with only some attributes present.""" - usage_metadata.prompt_token_count = 10 - usage_metadata.tool_use_prompt_token_count = None - usage_metadata.candidates_token_count = None - usage_metadata.thoughts_token_count = None - usage_metadata.cached_content_token_count = None - - token_usage = _token_usage.TokenUsage(usage_metadata) - attrs = token_usage.to_attributes() - assert attrs[_token_usage.GEN_AI_USAGE_INPUT_TOKENS] == 10 - assert _token_usage.GEN_AI_USAGE_OUTPUT_TOKENS not in attrs - assert _token_usage.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS not in attrs - assert _token_usage.GEN_AI_USAGE_REASONING_OUTPUT_TOKENS not in attrs - - -def test_to_attributes_metadata_none(): - """Tests to_attributes when usage_metadata is None.""" - token_usage = _token_usage.TokenUsage(None) - assert token_usage.to_attributes() == {} - - -def test_to_attributes_with_zeros( - usage_metadata: types.GenerateContentResponseUsageMetadata, -): - """Tests to_attributes when all attributes are zero.""" - usage_metadata.prompt_token_count = 0 - usage_metadata.tool_use_prompt_token_count = 0 - usage_metadata.candidates_token_count = 0 - usage_metadata.thoughts_token_count = 0 - usage_metadata.cached_content_token_count = 0 - - token_usage = _token_usage.TokenUsage(usage_metadata) - attrs = token_usage.to_attributes() - assert attrs[_token_usage.GEN_AI_USAGE_INPUT_TOKENS] == 0 - assert attrs[_token_usage.GEN_AI_USAGE_OUTPUT_TOKENS] == 0 - assert attrs[_token_usage.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] == 0 - assert attrs[_token_usage.GEN_AI_USAGE_REASONING_OUTPUT_TOKENS] == 0 - - -def test_to_attributes_missing_optional_attrs(): - """Tests to_attributes when optional attributes are missing from metadata object.""" - token_usage = _token_usage.TokenUsage( - types.GenerateContentResponseUsageMetadata( - prompt_token_count=10, candidates_token_count=20 - ) - ) - attrs = token_usage.to_attributes() - assert attrs[_token_usage.GEN_AI_USAGE_INPUT_TOKENS] == 10 - assert attrs[_token_usage.GEN_AI_USAGE_OUTPUT_TOKENS] == 20 diff --git a/tests/unittests/telemetry/utils.py b/tests/unittests/telemetry/utils.py deleted file mode 100644 index 758483ce91..0000000000 --- a/tests/unittests/telemetry/utils.py +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from collections.abc import AsyncGenerator -from contextlib import aclosing -import gc -import inspect -import sys -from types import CodeType -from typing import Any - - -def set_aclosing_wrapping_assertions(): - firstiter, finalizer = sys.get_asyncgen_hooks() - - def wrapped_firstiter(coro: AsyncGenerator[Any, Any]): - nonlocal firstiter - - if _is_async_context_manager(): - if firstiter: - firstiter(coro) - return - - assert any( - isinstance(referrer, aclosing) - or isinstance(indirect_referrer, aclosing) - for referrer in gc.get_referrers(coro) - # Some coroutines have a layer of indirection in Python 3.10 - for indirect_referrer in gc.get_referrers(referrer) - ), _no_aclosing_assertion_error(coro) - - if firstiter: - firstiter(coro) - - sys.set_asyncgen_hooks(wrapped_firstiter, finalizer) - - -def _no_aclosing_assertion_error(coro: AsyncGenerator[Any, Any]): - first_iter_loc = "" - definition_loc = "" - - # Get frame where the async generator was first called. - # 1. currentframe returns `_no_aclosing_assertion_error` (current function) frame. - # 2. First f.back returns `wrapped_firstiter` frame. - # 3. Second f.back returns code location where the generator is first iterated, - # where wrapping in aclosing should happen. - if (f := inspect.currentframe()) and (f := f.f_back) and (f := f.f_back): - first_iter_loc = f'file "{f.f_code.co_filename}" line "{f.f_lineno}"' - # In case the code location of first iteration is missing or incorrect, - # the place where async generator is defined is useful, because - # it's possible to iterate through references of the async generator. - if (ag_code := getattr(coro, "ag_code", None)) and isinstance( - ag_code, CodeType - ): - definition_loc = ( - f'file "{ag_code.co_filename}" line "{ag_code.co_firstlineno}"' - ) - - header_str = f'Async generator "{coro.__name__}" is not wrapped in aclosing' - first_iter_str = ( - f"first iterated in {first_iter_loc}" if first_iter_loc else "" - ) - definition_str = f"defined in {definition_loc}" if definition_loc else "" - instruction_str = """ -Wrap the iteration in the following code snippet before iterating: - -async with contextlib.aclosing(...) as agen: - async for ... as agen: - ... -""" - - return "\n".join( - part - for part in [ - header_str, - first_iter_str, - definition_str, - instruction_str, - ] - if part - ) - - -def _is_async_context_manager(): - """Checks if this function was invoked by contextlib.asynccontextmanager. - - contextlib.asynccontextmanager is implemented on top of async generators. - We don't need to however check if these are wrapped in aclosing, because - they cannot be interrupted midway through their execution if - all async generators in the application flow are wrapped in aclosing. - """ - frame = inspect.currentframe() - while frame: - if ( - frame.f_code.co_name == "__aenter__" - and "contextlib" in frame.f_code.co_filename - ): - return True - frame = frame.f_back - return False diff --git a/tests/unittests/test_optional_dependencies.py b/tests/unittests/test_optional_dependencies.py deleted file mode 100644 index c1715c7109..0000000000 --- a/tests/unittests/test_optional_dependencies.py +++ /dev/null @@ -1,307 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for optional dependencies and lazy loading. - -Includes both fast hermetic unit tests (run by default) and high-fidelity -integration tests using a clean venv (skipped by default, run via env var). -""" - -from __future__ import annotations - -import importlib.util -import os -from pathlib import Path -import subprocess -import sys -from unittest import mock - -import pytest - -_REPO_ROOT = Path(__file__).resolve().parents[2] - -# Check if we should run integration tests that require network/install -RUN_INTEGRATION = os.environ.get("ADK_TEST_NETWORK") == "1" - - -@pytest.fixture(scope="session") -def clean_core_venv(tmp_path_factory): - """Creates a clean venv with only core ADK installed (requires network).""" - if not RUN_INTEGRATION: - pytest.skip("Integration tests requiring network are disabled by default.") - - venv_path = tmp_path_factory.mktemp("adk_core_venv") - python_exe = venv_path / "bin" / "python" - - # Create venv using uv for speed - subprocess.run( - ["uv", "venv", str(venv_path), "--python", "3.11"], - check=True, - capture_output=True, - ) - - # Install core ADK from local repo (uses current pyproject.toml) - subprocess.run( - ["uv", "pip", "install", "--python", str(python_exe), str(_REPO_ROOT)], - check=True, - capture_output=True, - ) - - return python_exe - - -# ============================================================================= -# Approach 1: Hermetic Unit Tests (Fast, No Network, Safe for CI/TAP) -# ============================================================================= - - -def test_pydantic_version(): - """Print the installed Pydantic version.""" - import pydantic - - print(f"Pydantic version: {pydantic.__version__}") - assert True - - -def test_no_eager_imports(): - """Verify that importing google.adk does not eagerly load heavy optional deps. - - Runs in the current environment but in a fresh subprocess, ensuring it - only checks the import side-effects without modifying the environment. - """ - code = """ -import sys -import google.adk -heavy_modules = ['google.cloud.aiplatform', 'sqlalchemy', 'a2a'] -loaded = [mod for mod in heavy_modules if mod in sys.modules] -print(','.join(loaded)) -""" - result = subprocess.run( - [sys.executable, "-c", code], capture_output=True, text=True, check=True - ) - loaded_modules = result.stdout.strip() - assert loaded_modules == "", f"Heavy modules loaded eagerly: {loaded_modules}" - - -def test_a2a_remote_agent_config_raises_importerror(): - """Verify that accessing A2aRemoteAgentConfig without extra raises ImportError using mocks.""" - with mock.patch.dict("sys.modules", {"a2a": None}): - for mod in list(sys.modules): - if mod.startswith("a2a.") or mod.startswith("google.adk.a2a."): - sys.modules.pop(mod, None) - with pytest.raises(ImportError) as exc_info: - from google.adk.a2a.agent import A2aRemoteAgentConfig - assert "a2a-sdk" in str(exc_info.value) - - -def test_vertex_ai_memory_bank_service_fails_on_creation(): - """Verify that creating VertexAiMemoryBankService without extra fails using mocks.""" - try: - from google.adk.memory import VertexAiMemoryBankService - except KeyError as e: - if "pydantic.root_model" in str(e): - pytest.skip( - "Skipping mock test due to Pydantic/MCP environment conflict" - " (KeyError: 'pydantic.root_model')." - ) - raise - - with mock.patch.dict("sys.modules", {"vertexai": None}): - sys.modules.pop("google.adk.memory.vertex_ai_memory_bank_service", None) - from google.adk.memory import VertexAiMemoryBankService - - with pytest.raises(ImportError) as exc_info: - VertexAiMemoryBankService(agent_engine_id="123") - assert "google-cloud-aiplatform" in str(exc_info.value) - - -def test_database_session_service_fails_on_creation(): - """Verify that creating DatabaseSessionService without extra fails using mocks.""" - try: - from google.adk.sessions import DatabaseSessionService - except KeyError as e: - if "pydantic.root_model" in str(e): - pytest.skip( - "Skipping mock test due to Pydantic/MCP environment conflict" - " (KeyError: 'pydantic.root_model')." - ) - raise - - with mock.patch.dict("sys.modules", {"sqlalchemy": None}): - sys.modules.pop("google.adk.sessions.database_session_service", None) - with pytest.raises(ImportError) as exc_info: - from google.adk.sessions import DatabaseSessionService - - DatabaseSessionService(db_url="sqlite+aiosqlite:///:memory:") - assert "sqlalchemy" in str(exc_info.value) - - -def test_vertex_ai_session_service_fails_on_creation(): - """Verify that creating VertexAiSessionService without extra fails using mocks.""" - try: - from google.adk.sessions import VertexAiSessionService - except KeyError as e: - if "pydantic.root_model" in str(e): - pytest.skip( - "Skipping mock test due to Pydantic/MCP environment conflict" - " (KeyError: 'pydantic.root_model')." - ) - raise - - with mock.patch.dict("sys.modules", {"vertexai": None}): - sys.modules.pop("google.adk.sessions.vertex_ai_session_service", None) - from google.adk.sessions import VertexAiSessionService - - with pytest.raises(ImportError) as exc_info: - VertexAiSessionService(agent_engine_id="123") - assert "google-cloud-aiplatform" in str(exc_info.value) - - -def test_vertexai_dependency_shim_raises_clear_importerror(): - """Verify that the Vertex AI dependency shim points users to the gcp extra.""" - with mock.patch.dict("sys.modules", {"vertexai": None}): - module_path = _REPO_ROOT / "src/google/adk/dependencies/vertexai.py" - spec = importlib.util.spec_from_file_location( - "_test_google_adk_dependencies_vertexai", module_path - ) - assert spec is not None - assert spec.loader is not None - module = importlib.util.module_from_spec(spec) - - with pytest.raises(ImportError) as exc_info: - spec.loader.exec_module(module) - - message = str(exc_info.value) - assert "google-adk[gcp]" in message - assert "google-adk[all]" in message - - -# ============================================================================= -# Approach 2: High-Fidelity Integration Tests (Clean Venv, Skipped by Default) -# ============================================================================= - - -@pytest.mark.skipif(not RUN_INTEGRATION, reason="Requires ADK_TEST_NETWORK=1") -def test_critical_imports_subprocess(clean_core_venv): - """Verify that all critical import paths in core work in a true core-only environment.""" - imports = [ - "import google.adk", - "from google.adk import Agent", - "from google.adk import Context", - "from google.adk import Event", - "from google.adk import Runner", - "from google.adk import Workflow", - ] - for imp in imports: - result = subprocess.run( - [str(clean_core_venv), "-c", imp], - capture_output=True, - text=True, - ) - assert ( - result.returncode == 0 - ), f"Failed to import: {imp}\nStderr: {result.stderr}" - - -@pytest.mark.skipif(not RUN_INTEGRATION, reason="Requires ADK_TEST_NETWORK=1") -def test_a2a_remote_agent_config_raises_importerror_subprocess(clean_core_venv): - """Verify that accessing A2aRemoteAgentConfig without extra raises ImportError in clean environment.""" - code = """ -try: - from google.adk.a2a.agent import A2aRemoteAgentConfig - print("SUCCESS") -except ImportError as e: - print(f"CAUGHT_IMPORT_ERROR: {e}") -""" - result = subprocess.run( - [str(clean_core_venv), "-c", code], - capture_output=True, - text=True, - check=True, - ) - output = result.stdout.strip() - assert "CAUGHT_IMPORT_ERROR" in output - assert "a2a-sdk" in output - - -@pytest.mark.skipif(not RUN_INTEGRATION, reason="Requires ADK_TEST_NETWORK=1") -def test_vertex_ai_memory_bank_service_fails_on_creation_subprocess( - clean_core_venv, -): - """Verify that creating VertexAiMemoryBankService without extra fails in clean environment.""" - code = """ -from google.adk.memory import VertexAiMemoryBankService -try: - service = VertexAiMemoryBankService(agent_engine_id="123") - print("SUCCESS") -except ImportError as e: - print(f"CAUGHT_IMPORT_ERROR: {e}") -""" - result = subprocess.run( - [str(clean_core_venv), "-c", code], - capture_output=True, - text=True, - check=True, - ) - output = result.stdout.strip() - assert "CAUGHT_IMPORT_ERROR" in output - assert "google-cloud-aiplatform" in output - - -@pytest.mark.skipif(not RUN_INTEGRATION, reason="Requires ADK_TEST_NETWORK=1") -def test_database_session_service_fails_on_creation_subprocess( - clean_core_venv, -): - """Verify that creating DatabaseSessionService without extra fails in clean environment.""" - code = """ -try: - from google.adk.sessions import DatabaseSessionService - service = DatabaseSessionService(db_url="sqlite+aiosqlite:///:memory:") - print("SUCCESS") -except ImportError as e: - print(f"CAUGHT_IMPORT_ERROR: {e}") -""" - result = subprocess.run( - [str(clean_core_venv), "-c", code], - capture_output=True, - text=True, - check=True, - ) - output = result.stdout.strip() - assert "CAUGHT_IMPORT_ERROR" in output - assert "sqlalchemy" in output - - -@pytest.mark.skipif(not RUN_INTEGRATION, reason="Requires ADK_TEST_NETWORK=1") -def test_vertex_ai_session_service_fails_on_creation_subprocess( - clean_core_venv, -): - """Verify that creating VertexAiSessionService without extra fails in clean environment.""" - code = """ -from google.adk.sessions import VertexAiSessionService -try: - service = VertexAiSessionService(agent_engine_id="123") - print("SUCCESS") -except ImportError as e: - print(f"CAUGHT_IMPORT_ERROR: {e}") -""" - result = subprocess.run( - [str(clean_core_venv), "-c", code], - capture_output=True, - text=True, - check=True, - ) - output = result.stdout.strip() - assert "CAUGHT_IMPORT_ERROR" in output - assert "google-cloud-aiplatform" in output diff --git a/tests/unittests/test_release_dependencies.py b/tests/unittests/test_release_dependencies.py deleted file mode 100644 index bcb4f0439b..0000000000 --- a/tests/unittests/test_release_dependencies.py +++ /dev/null @@ -1,138 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Guard tests for the release-cut dependency contract. - -These tests pin the public dependency surface so that release-blocking -regressions documented in the bare-install audit cannot silently re-emerge: - -* ``packaging`` MUST be declared in main deps (used at import-time by - ``utils/model_name_utils.py`` and ``cli/cli_deploy.py``; reachable from - ``from google.adk import Runner`` and from ``adk --help``). -* ``ValidationError`` in ``environment_simulation_config`` MUST come from - ``pydantic`` (which always installs alongside the package), NOT from the - undeclared ``pydantic_core``. -""" - -from __future__ import annotations - -import importlib.util -from pathlib import Path - -try: - import tomllib -except ImportError: - import tomli as tomllib - -import pytest - - -def _find_pyproject() -> Path: - """Locates pyproject.toml by walking up from this file's directory. - - Works in both layouts: - * Open-source: pyproject.toml lives at the repo root. - * google3: pyproject.toml lives under open_source_workspace/ and tests/ is - a symlink into the package root, so .resolve() lands in the wrong place. - """ - start = Path(__file__).parent - for candidate in [start, *start.parents]: - direct = candidate / 'pyproject.toml' - if direct.is_file(): - return direct - sibling = candidate / 'open_source_workspace' / 'pyproject.toml' - if sibling.is_file(): - return sibling - raise FileNotFoundError( - f'Could not find pyproject.toml walking up from {start}.' - ) - - -_PYPROJECT_PATH = _find_pyproject() - - -@pytest.fixture(scope='module') -def pyproject() -> dict: - """Parses the project's pyproject.toml exactly once for the module.""" - with _PYPROJECT_PATH.open('rb') as fh: - return tomllib.load(fh) - - -def _requirement_names(requirements: list[str]) -> set[str]: - """Returns the lowercased PEP 508 distribution names from ``requirements``. - - Strips extras specifiers, version specifiers, and environment markers so the - caller can do exact-name membership checks. - """ - names: set[str] = set() - for req in requirements: - # Drop everything after a marker, version specifier, or extras block. - head = req.split(';', 1)[0].strip() - for sep in ('[', '>', '<', '=', '!', '~', ' '): - head = head.split(sep, 1)[0] - names.add(head.strip().lower()) - return names - - -def test_main_deps_include_packaging(pyproject: dict) -> None: - """``packaging`` is imported unguarded by core ADK; it must be a main dep.""" - main_deps = _requirement_names(pyproject['project']['dependencies']) - assert 'packaging' in main_deps, ( - 'packaging must be declared in [project] dependencies because ' - 'src/google/adk/utils/model_name_utils.py and ' - 'src/google/adk/cli/cli_deploy.py import it unguarded at module top ' - 'level. Without this declaration, `pip install google-adk` is one ' - 'transitive resolver change away from breaking on `import google.adk`.' - ) - - -def test_environment_simulation_config_imports_validation_error_from_pydantic() -> ( - None -): - """The ValidationError used by the config module must come from pydantic. - - pydantic-core is undeclared; importing from it directly is fragile. pydantic - re-exports ValidationError, so use that. - """ - # Use importlib to locate the source file so the test works in both the - # open-source layout (src/google/adk/...) and inside google3 (flat layout). - spec = importlib.util.find_spec( - 'google.adk.tools.environment_simulation.environment_simulation_config' - ) - assert ( - spec is not None and spec.origin is not None - ), 'environment_simulation_config module is not importable.' - source_path = Path(spec.origin) - source = source_path.read_text(encoding='utf-8') - assert 'from pydantic import ValidationError' in source, ( - 'environment_simulation_config.py must import ValidationError from ' - 'pydantic, not pydantic_core. pydantic_core is undeclared as a main ' - 'dep and pydantic re-exports the same class.' - ) - assert 'from pydantic_core import ValidationError' not in source, ( - 'environment_simulation_config.py must not import ValidationError ' - 'from pydantic_core (undeclared dep).' - ) - - -def test_injection_config_validation_raises_pydantic_validation_error() -> None: - """Behavioral check: invalid config raises the pydantic ValidationError.""" - # Local import keeps this test focused on the post-fix code path and - # surfaces ImportError clearly if the module's import block regresses. - from google.adk.tools.environment_simulation.environment_simulation_config import InjectedError - from pydantic import ValidationError - - with pytest.raises(ValidationError): - # Both required fields missing — pydantic must reject the construction. - InjectedError() # type: ignore[call-arg] diff --git a/tests/unittests/test_runners.py b/tests/unittests/test_runners.py index a658cb0f62..aa3fc030f3 100644 --- a/tests/unittests/test_runners.py +++ b/tests/unittests/test_runners.py @@ -220,369 +220,6 @@ def setup_method(self): artifact_service=self.artifact_service, ) - def test_find_agent_to_run_with_function_response_scenario(self): - """Test finding agent when last event is function response.""" - # Create a function call from sub_agent1 - function_call = types.FunctionCall(id="func_123", name="test_func", args={}) - function_response = types.FunctionResponse( - id="func_123", name="test_func", response={} - ) - - call_event = Event( - invocation_id="inv1", - author="sub_agent1", - content=types.Content( - role="model", parts=[types.Part(function_call=function_call)] - ), - ) - - response_event = Event( - invocation_id="inv2", - author="user", - content=types.Content( - role="user", parts=[types.Part(function_response=function_response)] - ), - ) - - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[call_event, response_event], - ) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.sub_agent1 - - def test_find_agent_to_run_returns_root_agent_when_no_events(self): - """Test that root agent is returned when session has no non-user events.""" - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[ - Event( - invocation_id="inv1", - author="user", - content=types.Content( - role="user", parts=[types.Part(text="Hello")] - ), - ) - ], - ) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.root_agent - - def test_find_agent_to_run_returns_root_agent_when_found_in_events(self): - """Test that root agent is returned when it's found in session events.""" - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[ - Event( - invocation_id="inv1", - author="root_agent", - content=types.Content( - role="model", parts=[types.Part(text="Root response")] - ), - ) - ], - ) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.root_agent - - def test_find_agent_to_run_returns_transferable_sub_agent(self): - """Test that transferable sub agent is returned when found.""" - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[ - Event( - invocation_id="inv1", - author="sub_agent1", - content=types.Content( - role="model", parts=[types.Part(text="Sub agent response")] - ), - ) - ], - ) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.sub_agent1 - - def test_find_agent_to_run_skips_non_transferable_agent(self): - """Test that non-transferable agent is skipped and root agent is returned.""" - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[ - Event( - invocation_id="inv1", - author="non_transferable", - content=types.Content( - role="model", - parts=[types.Part(text="Non-transferable response")], - ), - ) - ], - ) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.root_agent - - def test_find_agent_to_run_skips_unknown_agent(self): - """Test that unknown agent is skipped and root agent is returned.""" - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[ - Event( - invocation_id="inv1", - author="unknown_agent", - content=types.Content( - role="model", - parts=[types.Part(text="Unknown agent response")], - ), - ), - Event( - invocation_id="inv2", - author="root_agent", - content=types.Content( - role="model", parts=[types.Part(text="Root response")] - ), - ), - ], - ) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.root_agent - - def test_find_agent_to_run_function_response_takes_precedence(self): - """Test that function response scenario takes precedence over other logic.""" - # Create a function call from sub_agent2 - function_call = types.FunctionCall(id="func_456", name="test_func", args={}) - function_response = types.FunctionResponse( - id="func_456", name="test_func", response={} - ) - - call_event = Event( - invocation_id="inv1", - author="sub_agent2", - content=types.Content( - role="model", parts=[types.Part(function_call=function_call)] - ), - ) - - # Add another event from root_agent - root_event = Event( - invocation_id="inv2", - author="root_agent", - content=types.Content( - role="model", parts=[types.Part(text="Root response")] - ), - ) - - response_event = Event( - invocation_id="inv3", - author="user", - content=types.Content( - role="user", parts=[types.Part(function_response=function_response)] - ), - ) - - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[call_event, root_event, response_event], - ) - - # Function-response routing only applies when resumability is enabled. - self.runner.resumability_config = ResumabilityConfig(is_resumable=True) - - # Should return sub_agent2 due to function response, not root_agent - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.sub_agent2 - - def test_find_agent_to_run_skips_function_response_when_not_resumable(self): - """Test that function response scenario is skipped when not resumable.""" - function_call = types.FunctionCall(id="func_456", name="test_func", args={}) - function_response = types.FunctionResponse( - id="func_456", name="test_func", response={} - ) - - call_event = Event( - invocation_id="inv1", - author="non_transferable", - content=types.Content( - role="model", parts=[types.Part(function_call=function_call)] - ), - ) - - response_event = Event( - invocation_id="inv2", - author="user", - content=types.Content( - role="user", parts=[types.Part(function_response=function_response)] - ), - ) - - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[call_event, response_event], - ) - - self.runner.resumability_config = ResumabilityConfig(is_resumable=False) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.root_agent - - def test_find_agent_to_run_uses_function_response_when_resumable(self): - """Test that function response scenario is used when resumable.""" - function_call = types.FunctionCall(id="func_456", name="test_func", args={}) - function_response = types.FunctionResponse( - id="func_456", name="test_func", response={} - ) - - call_event = Event( - invocation_id="inv1", - author="non_transferable", - content=types.Content( - role="model", parts=[types.Part(function_call=function_call)] - ), - ) - - response_event = Event( - invocation_id="inv2", - author="user", - content=types.Content( - role="user", parts=[types.Part(function_response=function_response)] - ), - ) - - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[call_event, response_event], - ) - - self.runner.resumability_config = ResumabilityConfig(is_resumable=True) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.non_transferable_agent - - def test_find_agent_to_run_resumable_unknown_function_call_author_falls_back( - self, - ): - """Resumable routing must not return None for an unknown call author. - - When the matching function-call event is authored by something that is not - an agent in the current hierarchy (e.g. "user", or a stale/foreign agent - name carried over from a previous turn/session), `find_agent` returns None. - Previously this None propagated to `build_node`, raising a confusing - "Invalid node type: " error. We now fall through to the - root agent instead. - """ - function_call = types.FunctionCall(id="func_456", name="test_func", args={}) - function_response = types.FunctionResponse( - id="func_456", name="test_func", response={} - ) - - # The function call is authored by "user", which is not an agent name. - call_event = Event( - invocation_id="inv1", - author="user", - content=types.Content( - role="model", parts=[types.Part(function_call=function_call)] - ), - ) - - response_event = Event( - invocation_id="inv2", - author="user", - content=types.Content( - role="user", parts=[types.Part(function_response=function_response)] - ), - ) - - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[call_event, response_event], - ) - - self.runner.resumability_config = ResumabilityConfig(is_resumable=True) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.root_agent - - def test_find_agent_to_run_resumable_stale_function_call_author_falls_back( - self, - ): - """Resumable routing falls back to root for a stale/foreign call author.""" - function_call = types.FunctionCall(id="func_789", name="test_func", args={}) - function_response = types.FunctionResponse( - id="func_789", name="test_func", response={} - ) - - # The function call is authored by an agent that is not in the hierarchy. - call_event = Event( - invocation_id="inv1", - author="agent_from_a_previous_session", - content=types.Content( - role="model", parts=[types.Part(function_call=function_call)] - ), - ) - - response_event = Event( - invocation_id="inv2", - author="user", - content=types.Content( - role="user", parts=[types.Part(function_response=function_response)] - ), - ) - - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[call_event, response_event], - ) - - self.runner.resumability_config = ResumabilityConfig(is_resumable=True) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.root_agent - - def test_is_transferable_across_agent_tree_with_llm_agent(self): - """Test _is_transferable_across_agent_tree with LLM agent.""" - result = self.runner._is_transferable_across_agent_tree(self.sub_agent1) - assert result is True - - def test_is_transferable_across_agent_tree_with_non_transferable_agent(self): - """Test _is_transferable_across_agent_tree with non-transferable agent.""" - result = self.runner._is_transferable_across_agent_tree( - self.non_transferable_agent - ) - assert result is False - - def test_is_transferable_across_agent_tree_with_non_llm_agent(self): - """Test _is_transferable_across_agent_tree with non-LLM agent.""" - non_llm_agent = MockAgent("non_llm_agent") - # MockAgent inherits from BaseAgent, not LlmAgent, so it should return False - result = self.runner._is_transferable_across_agent_tree(non_llm_agent) - assert result is False - @pytest.mark.asyncio async def test_session_not_found_message_includes_alignment_hint(): @@ -778,81 +415,287 @@ async def test_run_live_persists_event_callback_modifications(): ) -@pytest.mark.asyncio -async def test_runner_allows_nested_agent_directories(tmp_path, monkeypatch): - project_root = tmp_path / "workspace" - agent_dir = project_root / "agents" / "examples" / "hello_world" - agent_dir.mkdir(parents=True) - # Make package structure importable. - for pkg_dir in [ - project_root / "agents", - project_root / "agents" / "examples", - agent_dir, - ]: - (pkg_dir / "__init__.py").write_text("", encoding="utf-8") - # Extra directories that previously confused origin inference, e.g. virtualenv. - (project_root / "agents" / ".venv").mkdir() +@pytest.mark.asyncio +async def test_runner_allows_nested_agent_directories(tmp_path, monkeypatch): + project_root = tmp_path / "workspace" + agent_dir = project_root / "agents" / "examples" / "001_hello_world" + agent_dir.mkdir(parents=True) + # Make package structure importable. + for pkg_dir in [ + project_root / "agents", + project_root / "agents" / "examples", + agent_dir, + ]: + (pkg_dir / "__init__.py").write_text("", encoding="utf-8") + # Extra directories that previously confused origin inference, e.g. virtualenv. + (project_root / "agents" / ".venv").mkdir() + + agent_source = textwrap.dedent("""\ + from google.adk.events.event import Event + from google.adk.agents.base_agent import BaseAgent + from google.genai import types + + + class SimpleAgent(BaseAgent): + + def __init__(self): + super().__init__(name='simplest_agent', sub_agents=[]) + + async def _run_async_impl(self, invocation_context): + yield Event( + invocation_id=invocation_context.invocation_id, + author=self.name, + content=types.Content( + role='model', + parts=[types.Part(text='hello from nested')], + ), + ) + + + root_agent = SimpleAgent() + """) + (agent_dir / "agent.py").write_text(agent_source, encoding="utf-8") + + monkeypatch.chdir(project_root) + loader = AgentLoader(agents_dir="agents/examples") + loaded_agent = loader.load_agent("001_hello_world") + + assert isinstance(loaded_agent, BaseAgent) + session_service = InMemorySessionService() + artifact_service = InMemoryArtifactService() + runner = Runner( + app_name="001_hello_world", + agent=loaded_agent, + session_service=session_service, + artifact_service=artifact_service, + ) + assert runner._app_name_alignment_hint is None + + session = await session_service.create_session( + app_name="001_hello_world", + user_id="user", + ) + agen = runner.run_async( + user_id=session.user_id, + session_id=session.id, + new_message=types.Content( + role="user", + parts=[types.Part(text="hi")], + ), + ) + event = await agen.__anext__() + await agen.aclose() + + assert event.author == "simplest_agent" + assert event.content + assert event.content.parts + assert event.content.parts[0].text == "hello from nested" + + def test_find_agent_to_run_with_function_response_scenario(self): + """Test finding agent when last event is function response.""" + # Create a function call from sub_agent1 + function_call = types.FunctionCall(id="func_123", name="test_func", args={}) + function_response = types.FunctionResponse( + id="func_123", name="test_func", response={} + ) + + call_event = Event( + invocation_id="inv1", + author="sub_agent1", + content=types.Content( + role="model", parts=[types.Part(function_call=function_call)] + ), + ) + + response_event = Event( + invocation_id="inv2", + author="user", + content=types.Content( + role="user", parts=[types.Part(function_response=function_response)] + ), + ) + + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[call_event, response_event], + ) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.sub_agent1 + + def test_find_agent_to_run_returns_root_agent_when_no_events(self): + """Test that root agent is returned when session has no non-user events.""" + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[ + Event( + invocation_id="inv1", + author="user", + content=types.Content( + role="user", parts=[types.Part(text="Hello")] + ), + ) + ], + ) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.root_agent + + def test_find_agent_to_run_returns_root_agent_when_found_in_events(self): + """Test that root agent is returned when it's found in session events.""" + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[ + Event( + invocation_id="inv1", + author="root_agent", + content=types.Content( + role="model", parts=[types.Part(text="Root response")] + ), + ) + ], + ) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.root_agent + + def test_find_agent_to_run_returns_transferable_sub_agent(self): + """Test that transferable sub agent is returned when found.""" + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[ + Event( + invocation_id="inv1", + author="sub_agent1", + content=types.Content( + role="model", parts=[types.Part(text="Sub agent response")] + ), + ) + ], + ) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.sub_agent1 + + def test_find_agent_to_run_skips_non_transferable_agent(self): + """Test that non-transferable agent is skipped and root agent is returned.""" + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[ + Event( + invocation_id="inv1", + author="non_transferable", + content=types.Content( + role="model", + parts=[types.Part(text="Non-transferable response")], + ), + ) + ], + ) - agent_source = textwrap.dedent("""\ - from google.adk.events.event import Event - from google.adk.agents.base_agent import BaseAgent - from google.genai import types + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.root_agent + def test_find_agent_to_run_skips_unknown_agent(self): + """Test that unknown agent is skipped and root agent is returned.""" + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[ + Event( + invocation_id="inv1", + author="unknown_agent", + content=types.Content( + role="model", + parts=[types.Part(text="Unknown agent response")], + ), + ), + Event( + invocation_id="inv2", + author="root_agent", + content=types.Content( + role="model", parts=[types.Part(text="Root response")] + ), + ), + ], + ) - class SimpleAgent(BaseAgent): + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.root_agent - def __init__(self): - super().__init__(name='simplest_agent', sub_agents=[]) + def test_find_agent_to_run_function_response_takes_precedence(self): + """Test that function response scenario takes precedence over other logic.""" + # Create a function call from sub_agent2 + function_call = types.FunctionCall(id="func_456", name="test_func", args={}) + function_response = types.FunctionResponse( + id="func_456", name="test_func", response={} + ) - async def _run_async_impl(self, invocation_context): - yield Event( - invocation_id=invocation_context.invocation_id, - author=self.name, - content=types.Content( - role='model', - parts=[types.Part(text='hello from nested')], - ), - ) + call_event = Event( + invocation_id="inv1", + author="sub_agent2", + content=types.Content( + role="model", parts=[types.Part(function_call=function_call)] + ), + ) + # Add another event from root_agent + root_event = Event( + invocation_id="inv2", + author="root_agent", + content=types.Content( + role="model", parts=[types.Part(text="Root response")] + ), + ) - root_agent = SimpleAgent() - """) - (agent_dir / "agent.py").write_text(agent_source, encoding="utf-8") + response_event = Event( + invocation_id="inv3", + author="user", + content=types.Content( + role="user", parts=[types.Part(function_response=function_response)] + ), + ) - monkeypatch.chdir(project_root) - loader = AgentLoader(agents_dir="agents/examples") - loaded_agent = loader.load_agent("hello_world") + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[call_event, root_event, response_event], + ) - assert isinstance(loaded_agent, BaseAgent) - session_service = InMemorySessionService() - artifact_service = InMemoryArtifactService() - runner = Runner( - app_name="hello_world", - agent=loaded_agent, - session_service=session_service, - artifact_service=artifact_service, - ) - assert runner._app_name_alignment_hint is None + # Should return sub_agent2 due to function response, not root_agent + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.sub_agent2 - session = await session_service.create_session( - app_name="hello_world", - user_id="user", - ) - agen = runner.run_async( - user_id=session.user_id, - session_id=session.id, - new_message=types.Content( - role="user", - parts=[types.Part(text="hi")], - ), - ) - event = await agen.__anext__() - await agen.aclose() + def test_is_transferable_across_agent_tree_with_llm_agent(self): + """Test _is_transferable_across_agent_tree with LLM agent.""" + result = self.runner._is_transferable_across_agent_tree(self.sub_agent1) + assert result is True - assert event.author == "simplest_agent" - assert event.content - assert event.content.parts - assert event.content.parts[0].text == "hello from nested" + def test_is_transferable_across_agent_tree_with_non_transferable_agent(self): + """Test _is_transferable_across_agent_tree with non-transferable agent.""" + result = self.runner._is_transferable_across_agent_tree( + self.non_transferable_agent + ) + assert result is False + + def test_is_transferable_across_agent_tree_with_non_llm_agent(self): + """Test _is_transferable_across_agent_tree with non-LLM agent.""" + non_llm_agent = MockAgent("non_llm_agent") + # MockAgent inherits from BaseAgent, not LlmAgent, so it should return False + result = self.runner._is_transferable_across_agent_tree(non_llm_agent) + assert result is False @pytest.mark.asyncio @@ -1023,7 +866,7 @@ def test_runner_init_raises_error_with_app_and_agent(self): """Test that ValueError is raised when app and agent are provided.""" with pytest.raises( ValueError, - match="Only one of app, agent, or node may be provided.", + match="When app is provided, agent should not be provided.", ): Runner( app=App(name="test_app", root_agent=self.root_agent), @@ -1052,10 +895,7 @@ def test_runner_init_raises_error_without_app_and_app_name(self): """Test ValueError is raised when app is not provided and app_name is missing.""" with pytest.raises( ValueError, - match=( - "app_name is required when agent is provided|One of app, agent, or" - " node must be provided" - ), + match="Either app or both app_name and agent must be provided.", ): Runner( agent=self.root_agent, @@ -1067,10 +907,7 @@ def test_runner_init_raises_error_without_app_and_agent(self): """Test ValueError is raised when app is not provided and agent is missing.""" with pytest.raises( ValueError, - match=( - "app_name is required when agent is provided|One of app, agent, or" - " node must be provided" - ), + match="Either app or both app_name and agent must be provided.", ): Runner( app_name="test_app", @@ -1240,9 +1077,7 @@ def test_runner_realistic_cache_config_scenario(self): """Test realistic scenario with production-like cache config.""" # Production cache config production_cache_config = ContextCacheConfig( - cache_intervals=30, - ttl_seconds=14400, - min_tokens=4096, # 4 hours + cache_intervals=30, ttl_seconds=14400, min_tokens=4096 # 4 hours ) app = App( @@ -1270,118 +1105,6 @@ def test_runner_realistic_cache_config_scenario(self): assert str(runner.context_cache_config) == expected_str -class TestRunnerResolveApp: - """Tests for Runner._resolve_app and node support.""" - - def setup_method(self): - self.session_service = InMemorySessionService() - self.artifact_service = InMemoryArtifactService() - self.root_agent = MockLlmAgent("root_agent") - - def test_resolve_app_with_agent_wraps_in_app(self): - """Test that a bare agent is wrapped into an App.""" - runner = Runner( - app_name="test_app", - agent=self.root_agent, - session_service=self.session_service, - artifact_service=self.artifact_service, - ) - assert runner.app is not None - assert runner.app.root_agent is self.root_agent - assert runner.app_name == "test_app" - assert runner.agent is self.root_agent - - def test_resolve_app_with_node_wraps_in_app(self): - """Test that a bare node is wrapped into an App.""" - from google.adk.workflow._base_node import BaseNode - - node = BaseNode(name="test_node") - runner = Runner( - node=node, - session_service=self.session_service, - artifact_service=self.artifact_service, - ) - assert runner.app is not None - assert runner.app.root_agent is node - assert runner.app_name == "test_node" - assert runner.agent is node - - def test_resolve_app_with_node_and_app_name(self): - """Test that app_name overrides node.name.""" - from google.adk.workflow._base_node import BaseNode - - node = BaseNode(name="node_name") - runner = Runner( - app_name="custom_name", - node=node, - session_service=self.session_service, - artifact_service=self.artifact_service, - ) - assert runner.app_name == "custom_name" - - def test_resolve_app_rejects_app_and_agent(self): - """Test that providing both app and agent raises.""" - app = App(name="test_app", root_agent=self.root_agent) - with pytest.raises(ValueError, match="Only one of app, agent, or node"): - Runner( - app=app, - agent=self.root_agent, - session_service=self.session_service, - ) - - def test_resolve_app_rejects_app_and_node(self): - """Test that providing both app and node raises.""" - from google.adk.workflow._base_node import BaseNode - - app = App(name="test_app", root_agent=self.root_agent) - node = BaseNode(name="test_node") - with pytest.raises(ValueError, match="Only one of app, agent, or node"): - Runner( - app=app, - node=node, - session_service=self.session_service, - ) - - def test_resolve_app_rejects_agent_and_node(self): - """Test that providing both agent and node raises.""" - from google.adk.workflow._base_node import BaseNode - - node = BaseNode(name="test_node") - with pytest.raises(ValueError, match="Only one of app, agent, or node"): - Runner( - app_name="test_app", - agent=self.root_agent, - node=node, - session_service=self.session_service, - ) - - def test_resolve_app_rejects_none(self): - """Test that providing no app, agent, or node raises.""" - with pytest.raises( - ValueError, match="One of app, agent, or node must be provided" - ): - Runner( - app_name="test_app", - session_service=self.session_service, - ) - - def test_resolve_app_extracts_node_from_app(self): - """Test that Runner extracts node from App into agent field.""" - from google.adk.workflow._base_node import BaseNode - - node = BaseNode(name="test_node") - app = App(name="test_app", root_agent=node) - runner = Runner( - app=app, - session_service=self.session_service, - artifact_service=self.artifact_service, - ) - assert runner.agent is node - assert runner.app_name == "test_app" - assert runner.context_cache_config is None - assert runner.resumability_config is None - - class TestRunnerShouldAppendEvent: """Tests for Runner._should_append_event method.""" @@ -1681,70 +1404,6 @@ async def test_run_async_passes_get_session_config(): assert events[0].author == "test_agent" -@pytest.mark.asyncio -async def test_run_async_teardown_on_aclose(): - """Closing run_async generator using aclose() should abort and cancel the running agent task.""" - import asyncio - - session_service = InMemorySessionService() - artifact_service = InMemoryArtifactService() - - was_cancelled = {"value": False} - - class CancellingAgent(BaseAgent): - - def __init__(self, name: str): - super().__init__(name=name, sub_agents=[]) - - async def _run_async_impl( - self, invocation_context: InvocationContext - ) -> AsyncGenerator[Event, None]: - try: - yield Event( - invocation_id=invocation_context.invocation_id, - author=self.name, - content=types.Content( - role="model", parts=[types.Part(text="First response")] - ), - ) - # Block simulating slow ongoing task - await asyncio.sleep(5.0) - yield Event( - invocation_id=invocation_context.invocation_id, - author=self.name, - content=types.Content( - role="model", parts=[types.Part(text="Second response")] - ), - ) - except (asyncio.CancelledError, GeneratorExit): - was_cancelled["value"] = True - raise - - runner = Runner( - app_name=TEST_APP_ID, - agent=CancellingAgent("cancel_agent"), - session_service=session_service, - artifact_service=artifact_service, - auto_create_session=True, - ) - - # Given a run session - agen = runner.run_async( - user_id=TEST_USER_ID, - session_id=TEST_SESSION_ID, - new_message=types.Content(role="user", parts=[types.Part(text="hello")]), - ) - - # When the client reads the first event and then calls aclose() - event = await agen.__anext__() - assert event.content.parts[0].text == "First response" - - await agen.aclose() - - # Then the running agent was immediately aborted and cancelled - assert was_cancelled["value"] is True - - @pytest.mark.asyncio async def test_run_live_passes_get_session_config(): """run_live should forward RunConfig.get_session_config to get_session.""" diff --git a/tests/unittests/test_samples.py b/tests/unittests/test_samples.py deleted file mode 100644 index efb0df9a64..0000000000 --- a/tests/unittests/test_samples.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import json -from pathlib import Path - -from google.adk.apps.app import App -from google.adk.cli.agent_test_runner import test_agent_replay as _test_agent_replay -from google.genai import types -import pytest - -CONTRIBUTING_DIR = Path(__file__).parent.parent.parent / "contributing" - - -def get_test_files(): - """Yields (sample_dir, test_file_path).""" - if not CONTRIBUTING_DIR.exists(): - return - for test_file in CONTRIBUTING_DIR.rglob("tests/*.json"): - sample_dir = test_file.parent.parent - if ( - (sample_dir / "agent.py").exists() - or (sample_dir / "__init__.py").exists() - or (sample_dir / "root_agent.yaml").exists() - ): - try: - rel_dir = sample_dir.relative_to(CONTRIBUTING_DIR) - test_id = f"{rel_dir}/{test_file.name}" - except ValueError: - test_id = f"{sample_dir.name}/{test_file.name}" - - if test_file.stem.endswith("_xfail"): - yield pytest.param( - sample_dir, test_file, id=test_id, marks=pytest.mark.xfail - ) - else: - yield pytest.param(sample_dir, test_file, id=test_id) - - -@pytest.mark.parametrize( - "sample_dir, test_file", - list(get_test_files()), -) -def test_sample(sample_dir: Path, test_file: Path, monkeypatch): - """Tests a sample by replaying exported session events.""" - _test_agent_replay(sample_dir, test_file, monkeypatch) diff --git a/tests/unittests/testing_utils.py b/tests/unittests/testing_utils.py index c7d6cb6293..4f9b8636fe 100644 --- a/tests/unittests/testing_utils.py +++ b/tests/unittests/testing_utils.py @@ -14,7 +14,6 @@ import asyncio import contextlib -from typing import Any from typing import AsyncGenerator from typing import Generator from typing import Optional @@ -143,9 +142,6 @@ def simplify_resumable_app_events( for event in events: if event.content: results.append((event.author, simplify_content(event.content))) - elif event.output and isinstance(event.output, (str, dict)): - # Single_turn agents strip event.content and set event.output instead. - results.append((event.author, event.output)) elif event.actions.end_of_agent: results.append((event.author, END_OF_AGENT)) elif event.actions.agent_state is not None: @@ -224,7 +220,6 @@ def __init__( response_modalities: list[str] = None, plugins: list[BasePlugin] = [], app: Optional[App] = None, - node: Any = None, ): """Initializes the InMemoryRunner. @@ -234,19 +229,8 @@ def __init__( plugins: The plugins to use in the runner, won't be used if app is provided. app: The app to use in the runner. - node: The root node to run. """ - if node: - self.app_name = node.name - self.root_agent = None - self.runner = Runner( - node=node, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - plugins=plugins, - ) - elif not app: + if not app: self.app_name = 'test_app' self.root_agent = root_agent self.runner = Runner( @@ -346,9 +330,6 @@ def create( list[types.Part], list[LlmResponse], list[str], list[list[types.Part]] ], error: Union[Exception, None] = None, - usage_metadata: Optional[ - types.GenerateContentResponseUsageMetadata - ] = None, ): if error and not responses: return cls(responses=[], error=error) @@ -359,18 +340,14 @@ def create( return cls(responses=responses) else: responses = [ - LlmResponse( - content=ModelContent(item), - usage_metadata=usage_metadata, - ) + LlmResponse(content=ModelContent(item)) if isinstance(item, list) and isinstance(item[0], types.Part) # responses is list[list[Part]] else LlmResponse( content=ModelContent( # responses is list[str] or list[Part] [Part(text=item) if isinstance(item, str) else item] - ), - usage_metadata=usage_metadata, + ) ) for item in responses if item diff --git a/tests/unittests/tools/BUILD b/tests/unittests/tools/BUILD new file mode 100644 index 0000000000..48c28cb449 --- /dev/null +++ b/tests/unittests/tools/BUILD @@ -0,0 +1,46 @@ +load("//third_party/py/pytest:pytest_defs.bzl", "pytest_test") + +package( + default_applicable_licenses = ["//third_party/py/google/adk:package_license"], + default_visibility = ["//visibility:private"], +) + +pytest_test( + name = "test_local_environment", + srcs = ["test_local_environment.py"], + args = [ + "-p", + "pytest_asyncio.plugin", + ], + deps = [ + "//third_party/py/google/adk", + "//third_party/py/pytest_asyncio", + ], +) + +pytest_test( + name = "test_skill_toolset", + srcs = ["test_skill_toolset.py"], + args = [ + "-p", + "pytest_asyncio.plugin", + ], + deps = [ + "//third_party/py/google/adk", + "//third_party/py/google/genai", + "//third_party/py/pytest_asyncio", + ], +) + +pytest_test( + name = "test_environment_toolset", + srcs = ["test_environment_toolset.py"], + args = [ + "-p", + "pytest_asyncio.plugin", + ], + deps = [ + "//third_party/py/google/adk", + "//third_party/py/pytest_asyncio", + ], +) diff --git a/tests/unittests/integrations/bigquery/test_bigquery_client.py b/tests/unittests/tools/bigquery/test_bigquery_client.py similarity index 98% rename from tests/unittests/integrations/bigquery/test_bigquery_client.py rename to tests/unittests/tools/bigquery/test_bigquery_client.py index a926590c44..8720bf3dbe 100644 --- a/tests/unittests/integrations/bigquery/test_bigquery_client.py +++ b/tests/unittests/tools/bigquery/test_bigquery_client.py @@ -18,9 +18,9 @@ from unittest import mock import google.adk -from google.adk.integrations.bigquery.client import DP_USER_AGENT -from google.adk.integrations.bigquery.client import get_bigquery_client -from google.adk.integrations.bigquery.client import get_dataplex_catalog_client +from google.adk.tools.bigquery.client import DP_USER_AGENT +from google.adk.tools.bigquery.client import get_bigquery_client +from google.adk.tools.bigquery.client import get_dataplex_catalog_client from google.adk.utils._telemetry_context import _is_visual_builder from google.api_core.gapic_v1 import client_info as gapic_client_info import google.auth diff --git a/tests/unittests/integrations/bigquery/test_bigquery_credentials.py b/tests/unittests/tools/bigquery/test_bigquery_credentials.py similarity index 98% rename from tests/unittests/integrations/bigquery/test_bigquery_credentials.py rename to tests/unittests/tools/bigquery/test_bigquery_credentials.py index b7072b0ba1..f0c188d0a4 100644 --- a/tests/unittests/integrations/bigquery/test_bigquery_credentials.py +++ b/tests/unittests/tools/bigquery/test_bigquery_credentials.py @@ -14,7 +14,7 @@ from unittest import mock -from google.adk.integrations.bigquery import BigQueryCredentialsConfig +from google.adk.tools.bigquery import BigQueryCredentialsConfig # Mock the Google OAuth and API dependencies import google.auth.credentials import google.oauth2.credentials diff --git a/tests/unittests/integrations/bigquery/test_bigquery_data_insights_tool.py b/tests/unittests/tools/bigquery/test_bigquery_data_insights_tool.py similarity index 98% rename from tests/unittests/integrations/bigquery/test_bigquery_data_insights_tool.py rename to tests/unittests/tools/bigquery/test_bigquery_data_insights_tool.py index 4c022ffe21..e52a90f96c 100644 --- a/tests/unittests/integrations/bigquery/test_bigquery_data_insights_tool.py +++ b/tests/unittests/tools/bigquery/test_bigquery_data_insights_tool.py @@ -15,7 +15,7 @@ import pathlib from unittest import mock -from google.adk.integrations.bigquery import data_insights_tool +from google.adk.tools.bigquery import data_insights_tool import pytest import yaml diff --git a/tests/unittests/integrations/bigquery/test_bigquery_metadata_tool.py b/tests/unittests/tools/bigquery/test_bigquery_metadata_tool.py similarity index 98% rename from tests/unittests/integrations/bigquery/test_bigquery_metadata_tool.py rename to tests/unittests/tools/bigquery/test_bigquery_metadata_tool.py index c2db210ff7..a0dda5383f 100644 --- a/tests/unittests/integrations/bigquery/test_bigquery_metadata_tool.py +++ b/tests/unittests/tools/bigquery/test_bigquery_metadata_tool.py @@ -17,9 +17,9 @@ import os from unittest import mock -from google.adk.integrations.bigquery import client as bq_client_lib -from google.adk.integrations.bigquery import metadata_tool -from google.adk.integrations.bigquery.config import BigQueryToolConfig +from google.adk.tools.bigquery import client as bq_client_lib +from google.adk.tools.bigquery import metadata_tool +from google.adk.tools.bigquery.config import BigQueryToolConfig import google.auth from google.auth.exceptions import DefaultCredentialsError from google.cloud import bigquery diff --git a/tests/unittests/integrations/bigquery/test_bigquery_query_tool.py b/tests/unittests/tools/bigquery/test_bigquery_query_tool.py similarity index 99% rename from tests/unittests/integrations/bigquery/test_bigquery_query_tool.py rename to tests/unittests/tools/bigquery/test_bigquery_query_tool.py index 3a851014a8..150cdb7569 100644 --- a/tests/unittests/integrations/bigquery/test_bigquery_query_tool.py +++ b/tests/unittests/tools/bigquery/test_bigquery_query_tool.py @@ -24,13 +24,13 @@ import dateutil import dateutil.relativedelta -from google.adk.integrations.bigquery import BigQueryCredentialsConfig -from google.adk.integrations.bigquery import BigQueryToolset -from google.adk.integrations.bigquery import client as bq_client_lib -from google.adk.integrations.bigquery import query_tool -from google.adk.integrations.bigquery.config import BigQueryToolConfig -from google.adk.integrations.bigquery.config import WriteMode from google.adk.tools.base_tool import BaseTool +from google.adk.tools.bigquery import BigQueryCredentialsConfig +from google.adk.tools.bigquery import BigQueryToolset +from google.adk.tools.bigquery import client as bq_client_lib +from google.adk.tools.bigquery import query_tool +from google.adk.tools.bigquery.config import BigQueryToolConfig +from google.adk.tools.bigquery.config import WriteMode from google.adk.tools.tool_context import ToolContext import google.auth from google.auth.exceptions import DefaultCredentialsError diff --git a/tests/unittests/integrations/bigquery/test_bigquery_search_tool.py b/tests/unittests/tools/bigquery/test_bigquery_search_tool.py similarity index 98% rename from tests/unittests/integrations/bigquery/test_bigquery_search_tool.py rename to tests/unittests/tools/bigquery/test_bigquery_search_tool.py index f2dc21c5fd..0ccdc9e18e 100644 --- a/tests/unittests/integrations/bigquery/test_bigquery_search_tool.py +++ b/tests/unittests/tools/bigquery/test_bigquery_search_tool.py @@ -53,8 +53,8 @@ class MockBaseModel: sys.modules["fastapi.openapi.models"] = mock.MagicMock() -from google.adk.integrations.bigquery import search_tool -from google.adk.integrations.bigquery.config import BigQueryToolConfig +from google.adk.tools.bigquery import search_tool +from google.adk.tools.bigquery.config import BigQueryToolConfig from google.api_core import exceptions as api_exceptions from google.auth.credentials import Credentials from google.cloud import dataplex_v1 @@ -107,7 +107,7 @@ def setUp(self): # Patch get_dataplex_catalog_client self.mock_get_dataplex_client = self.enter_context( mock.patch( - "google.adk.integrations.bigquery.client.get_dataplex_catalog_client", + "google.adk.tools.bigquery.client.get_dataplex_catalog_client", autospec=True, ) ) diff --git a/tests/unittests/integrations/bigquery/test_bigquery_tool_config.py b/tests/unittests/tools/bigquery/test_bigquery_tool_config.py similarity index 98% rename from tests/unittests/integrations/bigquery/test_bigquery_tool_config.py rename to tests/unittests/tools/bigquery/test_bigquery_tool_config.py index 3918ff48a4..60a41eb440 100644 --- a/tests/unittests/integrations/bigquery/test_bigquery_tool_config.py +++ b/tests/unittests/tools/bigquery/test_bigquery_tool_config.py @@ -17,7 +17,7 @@ import warnings from google.adk.features._feature_registry import _WARNED_FEATURES -from google.adk.integrations.bigquery.config import BigQueryToolConfig +from google.adk.tools.bigquery.config import BigQueryToolConfig import pytest diff --git a/tests/unittests/integrations/bigquery/test_bigquery_toolset.py b/tests/unittests/tools/bigquery/test_bigquery_toolset.py similarity index 95% rename from tests/unittests/integrations/bigquery/test_bigquery_toolset.py rename to tests/unittests/tools/bigquery/test_bigquery_toolset.py index a8ff2e649c..0eced4b168 100644 --- a/tests/unittests/integrations/bigquery/test_bigquery_toolset.py +++ b/tests/unittests/tools/bigquery/test_bigquery_toolset.py @@ -14,9 +14,9 @@ from __future__ import annotations -from google.adk.integrations.bigquery import BigQueryCredentialsConfig -from google.adk.integrations.bigquery import BigQueryToolset -from google.adk.integrations.bigquery.config import BigQueryToolConfig +from google.adk.tools.bigquery import BigQueryCredentialsConfig +from google.adk.tools.bigquery import BigQueryToolset +from google.adk.tools.bigquery.config import BigQueryToolConfig from google.adk.tools.google_tool import GoogleTool import pytest diff --git a/tests/unittests/integrations/bigquery/test_data/ask_data_insights_penguins_highest_mass.yaml b/tests/unittests/tools/bigquery/test_data/ask_data_insights_penguins_highest_mass.yaml similarity index 100% rename from tests/unittests/integrations/bigquery/test_data/ask_data_insights_penguins_highest_mass.yaml rename to tests/unittests/tools/bigquery/test_data/ask_data_insights_penguins_highest_mass.yaml diff --git a/tests/unittests/tools/computer_use/test_computer_use_tool.py b/tests/unittests/tools/computer_use/test_computer_use_tool.py index eb0b33a9bd..935ad39a6c 100644 --- a/tests/unittests/tools/computer_use/test_computer_use_tool.py +++ b/tests/unittests/tools/computer_use/test_computer_use_tool.py @@ -420,124 +420,6 @@ async def test_process_llm_request( # Verify llm_request is unchanged (process_llm_request is now a no-op) assert llm_request.tools_dict == {} - @pytest.mark.asyncio - async def test_run_async_with_safety_confirmation( - self, mock_computer_function, tool_context - ): - """Test run_async with safety confirmation.""" - from google.adk.tools.tool_confirmation import ToolConfirmation - - # Set up a proper signature for the mock function - def dummy_func(): - pass - - # Create a specific mock function for this test - calls = [] - mock_state = ComputerState( - screenshot=b"test_screenshot", url="https://example.com" - ) - - async def specific_mock_func(): - calls.append(()) - return mock_state - - specific_mock_func.__name__ = "dummy_func" - specific_mock_func.__signature__ = inspect.signature(dummy_func) - specific_mock_func.calls = calls - - tool = ComputerUseTool(func=specific_mock_func, screen_size=(1920, 1080)) - tool_context.function_call_id = "test_fc_id" - - # Test case 1: require confirmation, not yet confirmed - args = {"safety_decision": {"decision": "require_confirmation"}} - result = await tool.run_async(args=args, tool_context=tool_context) - - # Check that confirmation was requested - assert "test_fc_id" in tool_context.actions.requested_tool_confirmations - assert ( - tool_context.actions.requested_tool_confirmations["test_fc_id"].hint - == "This computer use action requires safety confirmation." - ) - assert result == { - "error": ( - "This tool call requires confirmation, please approve or reject." - ) - } - assert len(calls) == 0 - - # Test case 2: confirmed - tool_context.tool_confirmation = ToolConfirmation(confirmed=True) - result = await tool.run_async(args=args, tool_context=tool_context) - - # Should execute normally - assert len(calls) == 1 - assert result == { - "image": { - "mimetype": "image/png", - "data": base64.b64encode(b"test_screenshot").decode("utf-8"), - }, - "url": "https://example.com", - "safety_acknowledgement": "true", - } - - # Test case 3: rejected - tool_context.tool_confirmation = ToolConfirmation(confirmed=False) - result = await tool.run_async(args=args, tool_context=tool_context) - assert result == {"error": "This tool call is rejected."} - - @pytest.mark.asyncio - async def test_run_async_with_safety_decision_dict( - self, mock_computer_function, tool_context - ): - """Test run_async with safety decision as a dictionary.""" - from google.adk.tools.tool_confirmation import ToolConfirmation - - # Set up a proper signature for the mock function - def dummy_func(): - pass - - calls = [] - mock_state = ComputerState(screenshot=b"test", url="https://example.com") - - async def specific_mock_func(): - calls.append(()) - return mock_state - - specific_mock_func.__name__ = "dummy_func" - specific_mock_func.__signature__ = inspect.signature(dummy_func) - specific_mock_func.calls = calls - - tool = ComputerUseTool(func=specific_mock_func, screen_size=(1920, 1080)) - tool_context.function_call_id = "test_fc_id_dict" - - args = { - "safety_decision": { - "explanation": ( - "I need you to complete the challenge by clicking the 'I'm not" - " a robot' checkbox." - ), - "decision": "require_confirmation", - } - } - result = await tool.run_async(args=args, tool_context=tool_context) - - assert ( - "test_fc_id_dict" in tool_context.actions.requested_tool_confirmations - ) - assert ( - tool_context.actions.requested_tool_confirmations[ - "test_fc_id_dict" - ].hint - == "I need you to complete the challenge by clicking the 'I'm not a" - " robot' checkbox." - ) - assert result == { - "error": ( - "This tool call requires confirmation, please approve or reject." - ) - } - assert len(calls) == 0 - def test_inheritance(self, mock_computer_function): """Test that ComputerUseTool inherits from FunctionTool.""" from google.adk.tools.function_tool import FunctionTool diff --git a/tests/unittests/tools/environment/test_edit_file_tool.py b/tests/unittests/tools/environment/test_edit_file_tool.py deleted file mode 100644 index 42204096eb..0000000000 --- a/tests/unittests/tools/environment/test_edit_file_tool.py +++ /dev/null @@ -1,150 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for EditFileTool. - -Verifies that EditFileTool correctly handles line break differences. -""" - -from pathlib import Path - -from google.adk.environment._local_environment import LocalEnvironment -from google.adk.tools.environment._edit_file_tool import EditFileTool -import pytest -import pytest_asyncio - - -@pytest_asyncio.fixture(name="env") -async def _env(tmp_path: Path): - """Create and initialize a LocalEnvironment backed by a temp directory.""" - environment = LocalEnvironment(working_dir=tmp_path) - await environment.initialize() - yield environment - await environment.close() - - -class TestEditFileTool: - """Tests for EditFileTool behavior.""" - - @pytest.mark.asyncio - async def test_edit_file_handles_line_breaks_linux_file_windows_search( - self, env: LocalEnvironment - ): - """File has \\n, search string has \\r\\n.""" - # Arrange - tool = EditFileTool(env) - await env.write_file("test.txt", "line1\nline2\nline3") - - args = { - "path": "test.txt", - "old_string": "line1\r\nline2", - "new_string": "line1_replaced\nline2_replaced", - } - - # Act - result = await tool.run_async(args=args, tool_context=None) - - # Assert - assert result["status"] == "ok" - data = await env.read_file("test.txt") - assert data == b"line1_replaced\nline2_replaced\nline3" - - @pytest.mark.asyncio - async def test_edit_file_handles_line_breaks_windows_file_linux_search( - self, env: LocalEnvironment - ): - """File has \\r\\n, search string has \\n.""" - # Arrange - tool = EditFileTool(env) - await env.write_file("test.txt", "line1\r\nline2\r\nline3") - - args = { - "path": "test.txt", - "old_string": "line1\nline2", - "new_string": "line1_replaced\r\nline2_replaced", - } - - # Act - result = await tool.run_async(args=args, tool_context=None) - - # Assert - assert result["status"] == "ok" - data = await env.read_file("test.txt") - assert data == b"line1_replaced\r\nline2_replaced\r\nline3" - - @pytest.mark.asyncio - async def test_edit_file_fails_on_multiple_matches( - self, env: LocalEnvironment - ): - """Tool fails if old_string appears multiple times.""" - # Arrange - tool = EditFileTool(env) - await env.write_file("test.txt", "line1\nline2\nline1\nline2") - - args = { - "path": "test.txt", - "old_string": "line1\nline2", - "new_string": "replaced", - } - - # Act - result = await tool.run_async(args=args, tool_context=None) - - # Assert - assert result["status"] == "error" - assert "appears 2 times" in result["error"] - - @pytest.mark.asyncio - async def test_edit_file_exact_match_works(self, env: LocalEnvironment): - """Exact match works as before.""" - # Arrange - tool = EditFileTool(env) - await env.write_file("test.txt", "line1\nline2\nline3") - - args = { - "path": "test.txt", - "old_string": "line1\nline2", - "new_string": "replaced", - } - - # Act - result = await tool.run_async(args=args, tool_context=None) - - # Assert - assert result["status"] == "ok" - data = await env.read_file("test.txt") - assert data == b"replaced\nline3" - - @pytest.mark.asyncio - async def test_edit_file_handles_special_regex_chars( - self, env: LocalEnvironment - ): - """Special regex characters in old_string are escaped.""" - # Arrange - tool = EditFileTool(env) - await env.write_file("test.txt", "line1.content\nline2") - - args = { - "path": "test.txt", - "old_string": "line1.content", - "new_string": "replaced", - } - - # Act - result = await tool.run_async(args=args, tool_context=None) - - # Assert - assert result["status"] == "ok" - data = await env.read_file("test.txt") - assert data == b"replaced\nline2" diff --git a/tests/unittests/tools/google_api_tool/test_google_api_toolset.py b/tests/unittests/tools/google_api_tool/test_google_api_toolset.py index 7c2ef78a64..f774621c34 100644 --- a/tests/unittests/tools/google_api_tool/test_google_api_toolset.py +++ b/tests/unittests/tools/google_api_tool/test_google_api_toolset.py @@ -146,7 +146,7 @@ def test_init( assert tool_set._additional_headers == additional_headers mock_converter_class.assert_called_once_with( - TEST_API_NAME, TEST_API_VERSION, discovery_url=None + TEST_API_NAME, TEST_API_VERSION ) mock_converter_instance.convert.assert_called_once() spec_dict = mock_converter_instance.convert.return_value @@ -158,69 +158,6 @@ def test_init( assert isinstance(kwargs["auth_scheme"], OpenIdConnectWithConfig) assert kwargs["auth_scheme"].scopes == [DEFAULT_SCOPE] - @mock.patch( - "google.adk.tools.google_api_tool.google_api_toolset.OpenAPIToolset" - ) - @mock.patch( - "google.adk.tools.google_api_tool.google_api_toolset.GoogleApiToOpenApiConverter" - ) - def test_init_with_additional_scopes( - self, - mock_converter_class, - mock_openapi_toolset_class, - mock_converter_instance, - mock_openapi_toolset_instance, - ): - """Test GoogleApiToolset initialization with additional scopes.""" - mock_converter_class.return_value = mock_converter_instance - mock_openapi_toolset_class.return_value = mock_openapi_toolset_instance - - extra_scopes = [ - DEFAULT_SCOPE, - "https://www.googleapis.com/auth/calendar.readonly", - ] - tool_set = GoogleApiToolset( - api_name=TEST_API_NAME, - api_version=TEST_API_VERSION, - additional_scopes=extra_scopes, - ) - - mock_openapi_toolset_class.assert_called_once() - _, kwargs = mock_openapi_toolset_class.call_args - assert isinstance(kwargs["auth_scheme"], OpenIdConnectWithConfig) - assert kwargs["auth_scheme"].scopes == [ - DEFAULT_SCOPE, - "https://www.googleapis.com/auth/calendar.readonly", - ] - - @mock.patch( - "google.adk.tools.google_api_tool.google_api_toolset.OpenAPIToolset" - ) - @mock.patch( - "google.adk.tools.google_api_tool.google_api_toolset.GoogleApiToOpenApiConverter" - ) - def test_init_with_discovery_url( - self, - mock_converter_class, - mock_openapi_toolset_class, - mock_converter_instance, - mock_openapi_toolset_instance, - ): - """Test GoogleApiToolset initialization with custom discovery URL.""" - mock_converter_class.return_value = mock_converter_instance - mock_openapi_toolset_class.return_value = mock_openapi_toolset_instance - - discovery_url = "https://example.com/discovery" - tool_set = GoogleApiToolset( - api_name=TEST_API_NAME, - api_version=TEST_API_VERSION, - discovery_url=discovery_url, - ) - - mock_converter_class.assert_called_once_with( - TEST_API_NAME, TEST_API_VERSION, discovery_url=discovery_url - ) - @mock.patch( "google.adk.tools.google_api_tool.google_api_toolset.GoogleApiTool" ) diff --git a/tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py b/tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py index 9242b0e133..92ef9700da 100644 --- a/tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py +++ b/tests/unittests/tools/google_api_tool/test_googleapi_to_openapi_converter.py @@ -261,27 +261,6 @@ def test_fetch_google_api_spec( # Verify the results assert converter_with_patched_build._google_api_spec == calendar_api_spec - def test_fetch_google_api_spec_with_discovery_url( - self, monkeypatch, mock_api_resource, calendar_api_spec - ): - """Test fetching Google API specification with custom discovery URL.""" - mock_build = MagicMock(return_value=mock_api_resource) - monkeypatch.setattr( - "google.adk.tools.google_api_tool.googleapi_to_openapi_converter.build", - mock_build, - ) - - discovery_url = "https://example.com/discovery" - converter = GoogleApiToOpenApiConverter( - "calendar", "v3", discovery_url=discovery_url - ) - converter.fetch_google_api_spec() - - assert converter._google_api_spec == calendar_api_spec - mock_build.assert_called_once_with( - "calendar", "v3", discoveryServiceUrl=discovery_url - ) - def test_fetch_google_api_spec_error(self, monkeypatch, converter): """Test error handling when fetching Google API specification.""" # Create a mock that raises an error diff --git a/tests/unittests/tools/mcp_tool/test_mcp_session_manager.py b/tests/unittests/tools/mcp_tool/test_mcp_session_manager.py index f7e16014ff..a94b2eb885 100644 --- a/tests/unittests/tools/mcp_tool/test_mcp_session_manager.py +++ b/tests/unittests/tools/mcp_tool/test_mcp_session_manager.py @@ -588,9 +588,6 @@ async def test_create_session_cleans_up_without_aclose_if_loop_is_different( self, ): """Verify that sessions from different loops are cleaned up without calling aclose().""" - from google.adk.features import FeatureName - from google.adk.features._feature_registry import temporary_feature_override - manager = MCPSessionManager(self.mock_stdio_connection_params) # 1. Simulate a session created in a "different" loop @@ -620,11 +617,8 @@ async def test_create_session_cleans_up_without_aclose_if_loop_is_different( mock_wait_for.return_value = new_session mock_session_context_class.return_value = AsyncMock() - # 3. Call create_session with flag off to hit wait_for branch - with temporary_feature_override( - FeatureName._MCP_GRACEFUL_ERROR_HANDLING, False - ): - session = await manager.create_session() + # 3. Call create_session + session = await manager.create_session() # 4. Verify results assert session == new_session @@ -975,8 +969,8 @@ class TestMCPGracefulErrorHandlingFlagContract: loudly so we don't silently break GE's rollout. """ - def test_default_state_is_on(self): - """The fix must be enabled by default.""" + def test_default_state_is_off_so_cl_is_a_noop(self): + """The CL must be a no-op until GE explicitly enables it.""" import os from google.adk.features import FeatureName @@ -987,34 +981,34 @@ def test_default_state_is_on(self): saved = {k: os.environ.pop(k) for k in (enable, disable) if k in os.environ} try: assert ( - is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING) is True + is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING) is False ) finally: os.environ.update(saved) - def test_env_var_disable_flips_flag_off_at_runtime(self): - """The env var must turn the fix off without a rebuild.""" + def test_env_var_enable_flips_flag_on_at_runtime(self): + """The env var GE will set must turn the fix on without a rebuild.""" import os from google.adk.features import FeatureName from google.adk.features import is_feature_enabled - disable = "ADK_DISABLE_MCP_GRACEFUL_ERROR_HANDLING" - saved = os.environ.pop(disable, None) + enable = "ADK_ENABLE_MCP_GRACEFUL_ERROR_HANDLING" + saved = os.environ.pop(enable, None) try: - os.environ[disable] = "1" + os.environ[enable] = "1" assert ( - is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING) is False + is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING) is True ) # And once it's removed, we revert. Confirms the value is read # live from os.environ on every call (no caching, no binary push). - del os.environ[disable] + del os.environ[enable] assert ( - is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING) is True + is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING) is False ) finally: if saved is not None: - os.environ[disable] = saved + os.environ[enable] = saved def test_env_var_disable_acts_as_kill_switch(self): """The disable env var lets consumers turn off without a rebuild.""" diff --git a/tests/unittests/tools/mcp_tool/test_mcp_toolset.py b/tests/unittests/tools/mcp_tool/test_mcp_toolset.py index 20ec612e8c..7edd1b2957 100644 --- a/tests/unittests/tools/mcp_tool/test_mcp_toolset.py +++ b/tests/unittests/tools/mcp_tool/test_mcp_toolset.py @@ -324,9 +324,17 @@ async def test_close_with_exception(self): side_effect=Exception("Cleanup error") ) - # Should not raise exception, should log the warning + custom_errlog = StringIO() + toolset._errlog = custom_errlog + + # Should not raise exception await toolset.close() + # Should log the error + error_output = custom_errlog.getvalue() + assert "Warning: Error during McpToolset cleanup" in error_output + assert "Cleanup error" in error_output + @pytest.mark.asyncio async def test_get_tools_with_timeout(self): """Test get_tools with timeout.""" diff --git a/tests/unittests/tools/mcp_tool/test_session_context.py b/tests/unittests/tools/mcp_tool/test_session_context.py index 4200ab5fd5..50025dc245 100644 --- a/tests/unittests/tools/mcp_tool/test_session_context.py +++ b/tests/unittests/tools/mcp_tool/test_session_context.py @@ -296,108 +296,6 @@ async def slow_initialize(): assert 'Failed to create MCP session' in str(exc_info.value) - @pytest.mark.asyncio - async def test_timeout_during_initialization_with_flag_on(self): - """Test timeout during session initialization with flag ON. - - Verifies that session initialization uses `anyio.fail_after` under the - graceful error handling feature flag. - """ - mock_client = MockClient() - session_context = SessionContext( - mock_client, timeout=0.1, sse_read_timeout=None - ) - - # Mock ClientSession with slow initialize - mock_session = MockClientSession() - - async def slow_initialize(): - await asyncio.sleep(1.0) - return mock_session - - mock_session.initialize = slow_initialize - - with patch( - 'google.adk.tools.mcp_tool.session_context.ClientSession' - ) as mock_session_class: - mock_session_class.return_value = mock_session - - with temporary_feature_override( - FeatureName._MCP_GRACEFUL_ERROR_HANDLING, True - ): - with pytest.raises(ConnectionError) as exc_info: - await session_context.start() - - assert 'Failed to create MCP session' in str(exc_info.value) - - @pytest.mark.asyncio - async def test_timeout_during_initialization_with_flag_off(self): - """Test timeout during session initialization with flag OFF. - - Verifies that session initialization falls back to `asyncio.wait_for` - when graceful error handling is disabled. - """ - mock_client = MockClient() - session_context = SessionContext( - mock_client, timeout=0.1, sse_read_timeout=None - ) - - # Mock ClientSession with slow initialize - mock_session = MockClientSession() - - async def slow_initialize(): - await asyncio.sleep(1.0) - return mock_session - - mock_session.initialize = slow_initialize - - with patch( - 'google.adk.tools.mcp_tool.session_context.ClientSession' - ) as mock_session_class: - mock_session_class.return_value = mock_session - - with temporary_feature_override( - FeatureName._MCP_GRACEFUL_ERROR_HANDLING, False - ): - with pytest.raises(ConnectionError) as exc_info: - await session_context.start() - - assert 'Failed to create MCP session' in str(exc_info.value) - - @pytest.mark.asyncio - async def test_uses_anyio_fail_after_when_flag_on(self): - """Test that session initialization structurally uses anyio.fail_after. - - Asserts that the session runner enters `anyio.fail_after` context - with the timeout limit when graceful error handling is enabled. - """ - mock_client = MockClient() - session_context = SessionContext( - mock_client, timeout=2.5, sse_read_timeout=None - ) - mock_session = MockClientSession() - - with ( - patch( - 'google.adk.tools.mcp_tool.session_context.ClientSession' - ) as mock_session_class, - patch('anyio.fail_after') as mock_fail_after, - ): - mock_session_class.return_value = mock_session - # Configure mock_fail_after synchronous context manager to do nothing - mock_fail_after.return_value.__enter__ = Mock() - mock_fail_after.return_value.__exit__ = Mock(return_value=False) - - with temporary_feature_override( - FeatureName._MCP_GRACEFUL_ERROR_HANDLING, True - ): - await session_context.start() - - # Verify anyio.fail_after was called with the correct timeout - mock_fail_after.assert_called_once_with(2.5) - - await session_context.close() - @pytest.mark.asyncio async def test_stdio_client_with_read_timeout(self): """Test stdio client includes read_timeout_seconds parameter.""" diff --git a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_toolset.py b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_toolset.py index d49ff2db77..81c35b6964 100644 --- a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_toolset.py +++ b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_openapi_toolset.py @@ -153,29 +153,6 @@ def test_openapi_toolset_verify_on_init( assert all(tool._ssl_verify == verify_value for tool in toolset._tools) -def test_openapi_toolset_httpx_client_factory_on_init( - openapi_spec: Dict[str, Any], -): - """The httpx_client_factory is forwarded to every generated tool.""" - custom_factory = lambda: None # noqa: E731 - placeholder, never invoked here - toolset = OpenAPIToolset( - spec_dict=openapi_spec, httpx_client_factory=custom_factory - ) - assert toolset._httpx_client_factory is custom_factory - assert all( - tool._httpx_client_factory is custom_factory for tool in toolset._tools - ) - - -def test_openapi_toolset_httpx_client_factory_none_by_default( - openapi_spec: Dict[str, Any], -): - """httpx_client_factory is None on the toolset and each tool by default.""" - toolset = OpenAPIToolset(spec_dict=openapi_spec) - assert toolset._httpx_client_factory is None - assert all(tool._httpx_client_factory is None for tool in toolset._tools) - - def test_openapi_toolset_configure_verify_all(openapi_spec: Dict[str, Any]): """Test configure_verify_all method.""" toolset = OpenAPIToolset(spec_dict=openapi_spec) diff --git a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py index 412d16f64e..fa21201488 100644 --- a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py +++ b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py @@ -1339,113 +1339,6 @@ async def test_call_without_header_provider( assert result == {"result": "success"} - def test_init_httpx_client_factory_none_by_default( - self, - sample_endpoint, - sample_operation, - ): - """httpx_client_factory is None by default.""" - tool = RestApiTool( - name="test_tool", - description="Test Tool", - endpoint=sample_endpoint, - operation=sample_operation, - ) - assert tool._httpx_client_factory is None - - def test_init_with_httpx_client_factory( - self, - sample_endpoint, - sample_operation, - ): - """A user-supplied httpx_client_factory is stored on the tool.""" - custom_factory = MagicMock() - tool = RestApiTool( - name="test_tool", - description="Test Tool", - endpoint=sample_endpoint, - operation=sample_operation, - httpx_client_factory=custom_factory, - ) - assert tool._httpx_client_factory is custom_factory - - @pytest.mark.asyncio - async def test_call_uses_custom_httpx_client_factory( - self, - mock_tool_context, - sample_endpoint, - sample_operation, - sample_auth_scheme, - sample_auth_credential, - ): - """When a factory is provided, its client is used to issue the request.""" - mock_response = mock.create_autospec(requests.Response, instance=True) - mock_response.json.return_value = {"result": "success"} - mock_response.configure_mock(status_code=200) - - mock_client = mock.create_autospec( - httpx.AsyncClient, instance=True, spec_set=True - ) - mock_client.request = AsyncMock(return_value=mock_response) - # Make the mock client work as an async context manager. - mock_client.__aenter__ = AsyncMock(return_value=mock_client) - mock_client.__aexit__ = AsyncMock(return_value=None) - - custom_factory = MagicMock(return_value=mock_client) - - tool = RestApiTool( - name="test_tool", - description="Test Tool", - endpoint=sample_endpoint, - operation=sample_operation, - auth_scheme=sample_auth_scheme, - auth_credential=sample_auth_credential, - httpx_client_factory=custom_factory, - ) - - with patch.object(httpx, "AsyncClient", autospec=True) as mock_default: - result = await tool.call(args={}, tool_context=mock_tool_context) - - # Factory must be invoked once and the default client must not be built. - custom_factory.assert_called_once_with() - mock_default.assert_not_called() - mock_client.request.assert_awaited_once() - assert result == {"result": "success"} - - @pytest.mark.asyncio - async def test_call_without_httpx_client_factory_uses_default_client( - self, - mock_tool_context, - sample_endpoint, - sample_operation, - sample_auth_scheme, - sample_auth_credential, - ): - """When no factory is provided, the default httpx.AsyncClient is used.""" - mock_response = mock.create_autospec(requests.Response, instance=True) - mock_response.json.return_value = {"result": "success"} - mock_response.configure_mock(status_code=200) - - mock_client = mock.create_autospec( - httpx.AsyncClient, instance=True, spec_set=True - ) - mock_client.request = AsyncMock(return_value=mock_response) - - tool = RestApiTool( - name="test_tool", - description="Test Tool", - endpoint=sample_endpoint, - operation=sample_operation, - auth_scheme=sample_auth_scheme, - auth_credential=sample_auth_credential, - ) - - with patch.object( - httpx, "AsyncClient", return_value=mock_client, autospec=True - ) as mock_async_client: - await tool.call(args={}, tool_context=mock_tool_context) - assert mock_async_client.called - def test_prepare_request_params_extracts_embedded_query_params( self, sample_auth_credential, sample_auth_scheme ): diff --git a/tests/unittests/tools/test_agent_tool.py b/tests/unittests/tools/test_agent_tool.py index 4c664ae822..67a2674ff7 100644 --- a/tests/unittests/tools/test_agent_tool.py +++ b/tests/unittests/tools/test_agent_tool.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import asyncio from typing import Any from typing import Optional @@ -31,7 +30,6 @@ from google.adk.models.llm_response import LlmResponse from google.adk.plugins.base_plugin import BasePlugin from google.adk.plugins.plugin_manager import PluginManager -from google.adk.runners import Runner from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.tools.agent_tool import AgentTool from google.adk.tools.tool_context import ToolContext @@ -653,7 +651,7 @@ async def before_agent_callback(self, **kwargs): runner = testing_utils.InMemoryRunner(root_agent, plugins=[tracking_plugin]) runner.run('test1') - # Plugin should be called for both root_agent and tool_agent. + # Plugin should be called for both root_agent and tool_agent assert tracking_plugin.before_agent_calls == 2 @@ -689,7 +687,7 @@ async def before_agent_callback(self, **kwargs): runner = testing_utils.InMemoryRunner(root_agent, plugins=[tracking_plugin]) runner.run('test1') - # Plugin should be called for both root_agent and tool_agent. + # Plugin should be called for both root_agent and tool_agent assert tracking_plugin.before_agent_calls == 2 @@ -725,65 +723,10 @@ async def before_agent_callback(self, **kwargs): runner = testing_utils.InMemoryRunner(root_agent, plugins=[tracking_plugin]) runner.run('test1') - # Plugin should only be called for root_agent, not tool_agent. + # Plugin should only be called for root_agent, not tool_agent assert tracking_plugin.before_agent_calls == 1 -@pytest.mark.asyncio -async def test_include_plugins_true_sub_runner_does_not_close_parent_plugins(): - """Sub-Runner must not close plugins owned by the parent runner.""" - - class SlowClosePlugin(BasePlugin): - - def __init__(self, name: str): - super().__init__(name) - self.close_calls = 0 - - async def close(self): - self.close_calls += 1 - # Would otherwise blow past the sub-Runner's plugin_close_timeout. - await asyncio.sleep(10) - - parent_plugin = SlowClosePlugin(name='parent_plugin') - - mock_model = testing_utils.MockModel.create( - responses=[function_call_no_schema, 'response1', 'response2'] - ) - - tool_agent = Agent(name='tool_agent', model=mock_model) - root_agent = Agent( - name='root_agent', - model=mock_model, - tools=[AgentTool(agent=tool_agent, include_plugins=True)], - ) - - runner = Runner( - app_name='test_app', - agent=root_agent, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - plugins=[parent_plugin], - # Tight timeout amplifies the bug if it regresses; with the fix, the - # sub-Runner's close skips the parent's plugins entirely. - plugin_close_timeout=0.01, - ) - session = await runner.session_service.create_session( - app_name='test_app', user_id='test_user' - ) - # Must not raise RuntimeError("Failed to close plugins: ...") from the - # sub-Runner closing the parent's slow-to-close plugin. - async for _ in runner.run_async( - user_id=session.user_id, - session_id=session.id, - new_message=testing_utils.get_user_content('test1'), - ): - pass - - # The sub-Runner must not have closed the parent's plugin. - assert parent_plugin.close_calls == 0 - - def test_agent_tool_description_with_input_schema(): """Test that agent description is propagated when using input_schema.""" diff --git a/tests/unittests/tools/test_base_google_credentials_manager.py b/tests/unittests/tools/test_base_google_credentials_manager.py index 2cb6a460cb..0d680ec484 100644 --- a/tests/unittests/tools/test_base_google_credentials_manager.py +++ b/tests/unittests/tools/test_base_google_credentials_manager.py @@ -19,11 +19,11 @@ from unittest.mock import patch from google.adk.auth.auth_tool import AuthConfig -from google.adk.integrations.bigquery.bigquery_credentials import BIGQUERY_TOKEN_CACHE_KEY -from google.adk.integrations.bigquery.bigquery_credentials import BigQueryCredentialsConfig from google.adk.tools import _google_credentials from google.adk.tools._google_credentials import BaseGoogleCredentialsConfig from google.adk.tools._google_credentials import GoogleCredentialsManager +from google.adk.tools.bigquery.bigquery_credentials import BIGQUERY_TOKEN_CACHE_KEY +from google.adk.tools.bigquery.bigquery_credentials import BigQueryCredentialsConfig from google.adk.tools.tool_context import ToolContext from google.auth.credentials import Credentials as AuthCredentials from google.auth.exceptions import RefreshError diff --git a/tests/unittests/tools/test_base_tool.py b/tests/unittests/tools/test_base_tool.py index 34e9269296..b36928ee1e 100644 --- a/tests/unittests/tools/test_base_tool.py +++ b/tests/unittests/tools/test_base_tool.py @@ -139,19 +139,3 @@ async def test_process_llm_request_with_builtin_tool_and_another_declaration(): # function_declaration is added to existing types.Tool with function_declaration. assert llm_request.config.tools[1].function_declarations[1] == declaration - - -def test_defers_response_flag(): - """Tests that _defers_response defaults to False and can be set by subclasses.""" - - class SimpleTool(BaseTool): - - async def run_async(self, **kwargs): - pass - - t = SimpleTool(name='test', description='desc') - assert t._defers_response is False - - t2 = SimpleTool(name='test2', description='desc') - t2._defers_response = True - assert t2._defers_response is True diff --git a/tests/unittests/tools/test_from_function_with_options.py b/tests/unittests/tools/test_from_function_with_options.py index 4f77bc7b1f..537094da39 100644 --- a/tests/unittests/tools/test_from_function_with_options.py +++ b/tests/unittests/tools/test_from_function_with_options.py @@ -324,7 +324,7 @@ async def test_function(param: str) -> AsyncGenerator[Dict[str, str], None]: def test_required_fields_set_in_json_schema_fallback(): """Test that required fields are populated when the json_schema fallback path is used. - When a parameter has a complex type (e.g. tuple[str, ...] | None) that + When a parameter has a complex union type (e.g. list[str] | None) that _parse_schema_from_parameter can't handle, from_function_with_options falls back to the parameters_json_schema branch. This test verifies that the required fields are correctly populated in that fallback branch. @@ -333,7 +333,7 @@ def test_required_fields_set_in_json_schema_fallback(): def complex_tool( query: str, mode: str = 'default', - tags: tuple[str, ...] | None = None, + tags: list[str] | None = None, ) -> str: """A tool where one param has a complex union type.""" return query diff --git a/tests/unittests/tools/test_function_tool.py b/tests/unittests/tools/test_function_tool.py index 2acb254833..9c76529fb5 100644 --- a/tests/unittests/tools/test_function_tool.py +++ b/tests/unittests/tools/test_function_tool.py @@ -27,7 +27,6 @@ def mock_tool_context() -> ToolContext: """Fixture that provides a mock ToolContext for testing.""" mock_invocation_context = MagicMock(spec=InvocationContext) - mock_invocation_context._state_schema = None mock_invocation_context.session = MagicMock(spec=Session) mock_invocation_context.session.state = MagicMock() return ToolContext(invocation_context=mock_invocation_context) @@ -332,7 +331,6 @@ def sample_func(expected_arg: str): tool = FunctionTool(sample_func) mock_invocation_context = MagicMock(spec=InvocationContext) - mock_invocation_context._state_schema = None mock_invocation_context.session = MagicMock(spec=Session) # Add the missing state attribute to the session mock mock_invocation_context.session.state = MagicMock() @@ -354,7 +352,6 @@ def sample_func_with_context(expected_arg: str, tool_context: ToolContext): tool = FunctionTool(sample_func_with_context) mock_invocation_context = MagicMock(spec=InvocationContext) - mock_invocation_context._state_schema = None mock_invocation_context.session = MagicMock(spec=Session) # Add the missing state attribute to the session mock mock_invocation_context.session.state = MagicMock() @@ -382,7 +379,6 @@ def sample_func(arg1: str): tool = FunctionTool(sample_func, require_confirmation=True) mock_invocation_context = MagicMock(spec=InvocationContext) - mock_invocation_context._state_schema = None mock_invocation_context.session = MagicMock(spec=Session) mock_invocation_context.session.state = MagicMock() mock_invocation_context.agent = MagicMock() diff --git a/tests/unittests/tools/test_function_tool_declarations.py b/tests/unittests/tools/test_function_tool_declarations.py index 1efa438f33..b7046d344c 100644 --- a/tests/unittests/tools/test_function_tool_declarations.py +++ b/tests/unittests/tools/test_function_tool_declarations.py @@ -21,7 +21,6 @@ from __future__ import annotations from collections.abc import Sequence -import dataclasses from enum import Enum from typing import Any from typing import AsyncGenerator @@ -77,13 +76,6 @@ class Window: height: int -@dataclasses.dataclass -class StandardReturnDataclass: - """A standard library dataclass for testing.""" - - status: str - - class TestBasicTypes(parameterized.TestCase): """Tests for basic Python types.""" @@ -626,18 +618,6 @@ def save_addresses(addresses: list[Address]) -> int: }, ) - def test_returns_standard_dataclass(self): - """Test function that returns a standard library dataclass.""" - - def get_status() -> StandardReturnDataclass: - return StandardReturnDataclass(status="ok") - - decl = build_function_declaration_with_json_schema(get_status) - - self.assertIsNotNone(decl.response_json_schema) - self.assertEqual(decl.response_json_schema["type"], "object") - self.assertIn("status", decl.response_json_schema["properties"]) - class TestSpecialCases(parameterized.TestCase): """Tests for special cases and edge cases.""" diff --git a/tests/unittests/tools/test_function_tool_pydantic.py b/tests/unittests/tools/test_function_tool_pydantic.py index 02328e0452..82f5631a35 100644 --- a/tests/unittests/tools/test_function_tool_pydantic.py +++ b/tests/unittests/tools/test_function_tool_pydantic.py @@ -15,7 +15,6 @@ # Pydantic model conversion tests from typing import Optional -from typing import Union from unittest.mock import MagicMock from google.adk.agents.invocation_context import InvocationContext @@ -41,14 +40,6 @@ class PreferencesModel(pydantic.BaseModel): notifications: bool = True -class CompanyModel(pydantic.BaseModel): - """Test Pydantic model for company data.""" - - company_name: str - industry: str - employee_count: int - - def sync_function_with_pydantic_model(user: UserModel) -> dict: """Sync function that takes a Pydantic model.""" return { @@ -289,235 +280,5 @@ async def test_run_async_with_optional_pydantic_models(): assert result["theme"] == "dark" assert result["notifications"] is True assert result["preferences_type"] == "PreferencesModel" - - -def test_preprocess_args_with_list_of_pydantic_models(): - """Test _preprocess_args converts list of dicts to list of Pydantic models.""" - - def function_with_list(users: list[UserModel]) -> int: - return sum(u.age for u in users) - - tool = FunctionTool(function_with_list) - - input_args = { - "users": [ - {"name": "Alice", "age": 30}, - {"name": "Bob", "age": 25}, - ] - } - - processed_args = tool._preprocess_args(input_args) - - assert isinstance(processed_args["users"], list) - assert len(processed_args["users"]) == 2 - assert all(isinstance(u, UserModel) for u in processed_args["users"]) - assert processed_args["users"][0].name == "Alice" - assert processed_args["users"][1].age == 25 - - -def test_preprocess_args_with_list_of_pydantic_models_already_converted(): - """Test _preprocess_args leaves existing Pydantic model instances in list.""" - - def function_with_list(users: list[UserModel]) -> int: - return sum(u.age for u in users) - - tool = FunctionTool(function_with_list) - - existing = [UserModel(name="Alice", age=30)] - input_args = {"users": existing} - - processed_args = tool._preprocess_args(input_args) - - assert processed_args["users"][0] is existing[0] - - -def test_preprocess_args_with_list_of_primitives_unchanged(): - """Test _preprocess_args leaves list of primitives unchanged.""" - - def function_with_list(names: list[str], counts: list[int]) -> int: - return len(names) + sum(counts) - - tool = FunctionTool(function_with_list) - - input_args = {"names": ["Alice", "Bob"], "counts": [1, 2, 3]} - processed_args = tool._preprocess_args(input_args) - - assert processed_args["names"] == ["Alice", "Bob"] - assert processed_args["counts"] == [1, 2, 3] - - -def test_preprocess_args_with_list_of_pydantic_models_empty(): - """Test _preprocess_args handles empty list for list[BaseModel].""" - - def function_with_list(users: list[UserModel]) -> int: - return 0 - - tool = FunctionTool(function_with_list) - - processed_args = tool._preprocess_args({"users": []}) - - assert processed_args["users"] == [] - - -@pytest.mark.asyncio -async def test_run_async_with_list_of_pydantic_models(): - """Test run_async end-to-end with list[BaseModel] conversion.""" - - def place_order(orders: list[UserModel]) -> int: - return sum(u.age for u in orders) - - tool = FunctionTool(place_order) - - tool_context_mock = MagicMock(spec=ToolContext) - invocation_context_mock = MagicMock(spec=InvocationContext) - session_mock = MagicMock(spec=Session) - invocation_context_mock.session = session_mock - tool_context_mock.invocation_context = invocation_context_mock - - args = {"orders": [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 20}]} - - result = await tool.run_async(args=args, tool_context=tool_context_mock) - - assert result == 50 - - -def _function_with_union_of_basemodels( - entity: Union[UserModel, CompanyModel], -) -> str: - return type(entity).__name__ - - -def test_preprocess_args_with_union_of_basemodels_picks_user(): - """Dict matching UserModel is converted to UserModel.""" - tool = FunctionTool(_function_with_union_of_basemodels) - - processed_args = tool._preprocess_args( - {"entity": {"name": "Diana", "age": 32, "email": "d@example.com"}} - ) - - assert isinstance(processed_args["entity"], UserModel) - assert processed_args["entity"].name == "Diana" - - -def test_preprocess_args_with_union_of_basemodels_picks_company(): - """Dict matching CompanyModel is converted to CompanyModel.""" - tool = FunctionTool(_function_with_union_of_basemodels) - - processed_args = tool._preprocess_args({ - "entity": { - "company_name": "Acme Corp", - "industry": "tech", - "employee_count": 50, - } - }) - - assert isinstance(processed_args["entity"], CompanyModel) - assert processed_args["entity"].company_name == "Acme Corp" - - -def test_preprocess_args_with_union_of_basemodels_existing_instance_unchanged(): - """Existing instance of any union member is left unchanged.""" - tool = FunctionTool(_function_with_union_of_basemodels) - - user = UserModel(name="Bob", age=25) - assert tool._preprocess_args({"entity": user})["entity"] is user - - company = CompanyModel( - company_name="Acme", industry="tech", employee_count=10 - ) - assert tool._preprocess_args({"entity": company})["entity"] is company - - -def test_preprocess_args_with_union_of_basemodels_unrelated_instance_passthrough(): - """A BaseModel instance not in the union is not silently accepted.""" - tool = FunctionTool(_function_with_union_of_basemodels) - - class UnrelatedModel(pydantic.BaseModel): - name: str - age: int - - unrelated = UnrelatedModel(name="Carol", age=20) - processed_args = tool._preprocess_args({"entity": unrelated}) - - # Conversion fails (UnrelatedModel is not in the union); value is left - # alone so the function receives it and raises a clear error itself. - assert processed_args["entity"] is unrelated - - -def test_preprocess_args_with_optional_union_of_basemodels_none(): - """Optional[Union[A, B]] passes None through unchanged.""" - - def fn(entity: Optional[Union[UserModel, CompanyModel]] = None) -> str: - return type(entity).__name__ - - tool = FunctionTool(fn) - - processed_args = tool._preprocess_args({"entity": None}) - - assert processed_args["entity"] is None - - -def test_preprocess_args_with_optional_union_of_basemodels_dict(): - """Optional[Union[A, B]] converts a dict to the matching model.""" - - def fn(entity: Optional[Union[UserModel, CompanyModel]] = None) -> str: - return type(entity).__name__ - - tool = FunctionTool(fn) - - processed_args = tool._preprocess_args({"entity": {"name": "Eve", "age": 40}}) - - assert isinstance(processed_args["entity"], UserModel) - assert processed_args["entity"].name == "Eve" - - -def test_preprocess_args_with_union_of_basemodels_invalid_data(): - """Invalid data for Union[BaseModel, BaseModel] is kept unchanged.""" - tool = FunctionTool(_function_with_union_of_basemodels) - - # Dict matches neither model. - processed_args = tool._preprocess_args( - {"entity": {"unrelated_field": "value"}} - ) - - assert processed_args["entity"] == {"unrelated_field": "value"} - - -@pytest.mark.asyncio -async def test_run_async_with_union_of_basemodels(): - """run_async end-to-end converts dict to the matching union member.""" - - def create_entity_profile( - entity: Union[UserModel, CompanyModel], - ) -> dict: - if isinstance(entity, UserModel): - return {"entity_type": "user", "name": entity.name} - if isinstance(entity, CompanyModel): - return {"entity_type": "company", "name": entity.company_name} - return {"entity_type": "unknown"} - - tool = FunctionTool(create_entity_profile) - - tool_context_mock = MagicMock(spec=ToolContext) - invocation_context_mock = MagicMock(spec=InvocationContext) - session_mock = MagicMock(spec=Session) - invocation_context_mock.session = session_mock - tool_context_mock.invocation_context = invocation_context_mock - - user_result = await tool.run_async( - args={"entity": {"name": "Diana", "age": 32}}, - tool_context=tool_context_mock, - ) - assert user_result == {"entity_type": "user", "name": "Diana"} - - company_result = await tool.run_async( - args={ - "entity": { - "company_name": "Acme Corp", - "industry": "tech", - "employee_count": 50, - } - }, - tool_context=tool_context_mock, - ) - assert company_result == {"entity_type": "company", "name": "Acme Corp"} + assert result["preferences_type"] == "PreferencesModel" + assert result["preferences_type"] == "PreferencesModel" diff --git a/tests/unittests/tools/test_function_tool_with_import_annotations.py b/tests/unittests/tools/test_function_tool_with_import_annotations.py index ebd21bce95..65e1468bab 100644 --- a/tests/unittests/tools/test_function_tool_with_import_annotations.py +++ b/tests/unittests/tools/test_function_tool_with_import_annotations.py @@ -18,10 +18,8 @@ from typing import Dict from google.adk.tools import _automatic_function_calling_util -from google.adk.tools.function_tool import FunctionTool from google.adk.utils.variant_utils import GoogleLLMVariant from google.genai import types -import pydantic def test_string_annotation_none_return_vertex(): @@ -179,33 +177,3 @@ def test_function() -> str: # VERTEX_AI should have response schema for string return (stored as string) assert declaration.response is not None assert declaration.response.type == types.Type.STRING - - -class ItemModel(pydantic.BaseModel): - name: str - quantity: int - - -def test_preprocess_args_with_list_of_pydantic_models_and_annotations(): - """Test _preprocess_args converts dict to Pydantic model with string annotations.""" - - def function_with_list(items: list[ItemModel]) -> int: - return sum(item.quantity for item in items) - - tool = FunctionTool(function_with_list) - - input_args = { - 'items': [ - {'name': 'Burger', 'quantity': 10}, - {'name': 'Pizza', 'quantity': 5}, - ] - } - - processed_args = tool._preprocess_args(input_args) - - assert isinstance(processed_args['items'], list) - assert len(processed_args['items']) == 2 - assert all(isinstance(item, ItemModel) for item in processed_args['items']) - assert processed_args['items'][0].name == 'Burger' - assert processed_args['items'][0].quantity == 10 - assert processed_args['items'][1].quantity == 5 diff --git a/tests/unittests/tools/test_google_tool.py b/tests/unittests/tools/test_google_tool.py index a7717d5578..738edbae5b 100644 --- a/tests/unittests/tools/test_google_tool.py +++ b/tests/unittests/tools/test_google_tool.py @@ -16,9 +16,9 @@ from unittest.mock import Mock from unittest.mock import patch -from google.adk.integrations.bigquery.bigquery_credentials import BigQueryCredentialsConfig -from google.adk.integrations.bigquery.config import BigQueryToolConfig from google.adk.tools._google_credentials import GoogleCredentialsManager +from google.adk.tools.bigquery.bigquery_credentials import BigQueryCredentialsConfig +from google.adk.tools.bigquery.config import BigQueryToolConfig from google.adk.tools.google_tool import GoogleTool from google.adk.tools.spanner.settings import SpannerToolSettings from google.adk.tools.tool_context import ToolContext diff --git a/tests/unittests/tools/test_load_web_page.py b/tests/unittests/tools/test_load_web_page.py index d0463bd36e..5dbc70805b 100644 --- a/tests/unittests/tools/test_load_web_page.py +++ b/tests/unittests/tools/test_load_web_page.py @@ -14,7 +14,6 @@ from __future__ import annotations -import os import socket from unittest import mock @@ -32,9 +31,17 @@ def _create_response(html: str) -> requests.Response: def _clear_proxy_env(monkeypatch): - for env_var in list(os.environ): - if env_var.lower().endswith('_proxy'): - monkeypatch.delenv(env_var, raising=False) + for proxy_variable in ( + 'HTTP_PROXY', + 'HTTPS_PROXY', + 'http_proxy', + 'https_proxy', + 'ALL_PROXY', + 'all_proxy', + 'NO_PROXY', + 'no_proxy', + ): + monkeypatch.delenv(proxy_variable, raising=False) def test_load_web_page_blocks_file_scheme_urls(monkeypatch): diff --git a/tests/unittests/tools/test_request_input_tool.py b/tests/unittests/tools/test_request_input_tool.py deleted file mode 100644 index 3895dbd77d..0000000000 --- a/tests/unittests/tools/test_request_input_tool.py +++ /dev/null @@ -1,116 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from unittest.mock import MagicMock - -from google.adk.tools._request_input_tool import request_input -from google.adk.tools.long_running_tool import LongRunningFunctionTool -from google.adk.tools.tool_context import ToolContext -import pytest - - -class TestRequestInputTool: - """Test cases for RequestInputTool integration and properties.""" - - def test_init(self): - """request_input initializes with correct name and properties.""" - # Given & When & Then - assert request_input.name == 'adk_request_input' - assert request_input.is_long_running is True - assert isinstance(request_input, LongRunningFunctionTool) - assert ( - 'Ask the user a question and wait for their response' - in request_input.description - ) - - def test_get_declaration(self): - """request_input returns a function declaration with correct parameters.""" - # Given & When - declaration = request_input._get_declaration() - - # Then - assert declaration is not None - assert declaration.name == 'adk_request_input' - assert 'Ask the user a question' in declaration.description - - # Verify the parameter schema matches the declaration - parameters = declaration.parameters - parameters_schema = declaration.parameters_json_schema - assert (parameters is not None) or (parameters_schema is not None) - - if parameters_schema is not None: - # Verify camelCase / snake_case properties in JSON schema format - assert 'message' in parameters_schema['properties'] - assert ( - 'response_schema' in parameters_schema['properties'] - or 'responseSchema' in parameters_schema['properties'] - ) - assert 'message' in parameters_schema['required'] - - # Check parameter type specifications - assert parameters_schema['properties']['message']['type'] == 'string' - else: - # Verify types.Schema format - assert 'message' in parameters.properties - assert 'response_schema' in parameters.properties - assert 'message' in parameters.required - - # Check parameter type specifications - from google.genai import types - - assert parameters.properties['message'].type == types.Type.STRING - - @pytest.mark.asyncio - async def test_run_async_returns_none(self): - """request_input execution returns None to trigger LRO suspension.""" - # Given - args = {'message': 'What is your name?'} - tool_context = MagicMock(spec=ToolContext) - - # When - result = await request_input.run_async(args=args, tool_context=tool_context) - - # Then - assert result is None - - @pytest.mark.asyncio - async def test_run_async_with_schema_argument_returns_none(self): - """request_input handles both simple text and structured schema arguments correctly.""" - # Given - args = { - 'message': 'Enter your username:', - 'response_schema': {'type': 'string'}, - } - tool_context = MagicMock(spec=ToolContext) - - # When - result = await request_input.run_async(args=args, tool_context=tool_context) - - # Then - assert result is None - - @pytest.mark.asyncio - async def test_run_async_missing_mandatory_message_returns_error(self): - """request_input returns an error dict if the mandatory 'message' argument is missing.""" - # Given - args = {'response_schema': {'type': 'string'}} - tool_context = MagicMock(spec=ToolContext) - - # When - result = await request_input.run_async(args=args, tool_context=tool_context) - - # Then - assert isinstance(result, dict) - assert 'error' in result - assert 'mandatory input parameters are not present' in result['error'] diff --git a/tests/unittests/tools/test_set_model_response_tool.py b/tests/unittests/tools/test_set_model_response_tool.py index c437449573..5d658df67a 100644 --- a/tests/unittests/tools/test_set_model_response_tool.py +++ b/tests/unittests/tools/test_set_model_response_tool.py @@ -15,13 +15,10 @@ """Tests for SetModelResponseTool.""" import inspect -from typing import Optional from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import LlmAgent from google.adk.agents.run_config import RunConfig -from google.adk.features._feature_registry import FeatureName -from google.adk.features._feature_registry import temporary_feature_override from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.tools.set_model_response_tool import SetModelResponseTool from google.adk.tools.tool_context import ToolContext @@ -470,67 +467,3 @@ async def test_run_async_dict_schema(): assert result is not None assert isinstance(result, dict) assert result == {'a': 1, 'b': 2, 'c': 3} - - -class SubSchema(BaseModel): - - field1: str = Field(description='Field 1') - field2: int = Field(description='Field 2') - - -class ConsolidatedOptionalSchema(BaseModel): - - nested: Optional[SubSchema] = Field(default=None, description='Nested model') - nested_list: Optional[list[SubSchema]] = Field( - default=None, description='Nested list of models' - ) - pep604_nested: SubSchema | None = Field( - default=None, description='PEP 604 optional nested model' - ) - pep604_raw_list: list | None = Field(default=None, description='Raw list') - - -def test_get_declaration_optional_fields(): - """Test that tool declaration preserves properties for various optional fields.""" - with temporary_feature_override(FeatureName.JSON_SCHEMA_FOR_FUNC_DECL, False): - tool = SetModelResponseTool(ConsolidatedOptionalSchema) - - declaration = tool._get_declaration() - - assert declaration is not None - assert declaration.name == 'set_model_response' - params_schema = declaration.parameters - assert params_schema is not None - assert params_schema.type == 'OBJECT' - - # 1. Optional[SubSchema] - assert 'nested' in params_schema.properties - nested_schema = params_schema.properties['nested'] - assert nested_schema.type == 'OBJECT' - assert nested_schema.properties is not None - assert nested_schema.properties['field1'].type == 'STRING' - assert nested_schema.properties['field2'].type == 'INTEGER' - - # 2. Optional[list[SubSchema]] - assert 'nested_list' in params_schema.properties - nested_list_schema = params_schema.properties['nested_list'] - assert nested_list_schema.type == 'ARRAY' - assert nested_list_schema.items is not None - items_schema = nested_list_schema.items - assert items_schema.type == 'OBJECT' - assert items_schema.properties is not None - assert items_schema.properties['field1'].type == 'STRING' - assert items_schema.properties['field2'].type == 'INTEGER' - - # 3. SubSchema | None (PEP 604) - assert 'pep604_nested' in params_schema.properties - pep604_nested_schema = params_schema.properties['pep604_nested'] - assert pep604_nested_schema.type == 'OBJECT' - assert pep604_nested_schema.properties is not None - assert pep604_nested_schema.properties['field1'].type == 'STRING' - assert pep604_nested_schema.properties['field2'].type == 'INTEGER' - - # 4. list | None (PEP 604) - assert 'pep604_raw_list' in params_schema.properties - pep604_raw_list_schema = params_schema.properties['pep604_raw_list'] - assert pep604_raw_list_schema.type == 'ARRAY' diff --git a/tests/unittests/tools/test_skill_path_traversal.py b/tests/unittests/tools/test_skill_path_traversal.py deleted file mode 100644 index 8eaeb6edfb..0000000000 --- a/tests/unittests/tools/test_skill_path_traversal.py +++ /dev/null @@ -1,280 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tests for path traversal protection in _build_wrapper_code.""" - -from __future__ import annotations - -import os -import tempfile -from typing import Any -from typing import cast -from unittest import mock - -from google.adk.agents.base_agent import BaseAgent -from google.adk.code_executors.base_code_executor import BaseCodeExecutor -from google.adk.code_executors.code_execution_utils import CodeExecutionResult -from google.adk.skills import models -from google.adk.tools import skill_toolset -from google.adk.tools import tool_context -import pytest - - -def _make_tool_context_with_agent( - agent: BaseAgent | None = None, invocation_id: str = "test_invocation" -) -> tool_context.ToolContext: - """Creates a mock ToolContext with _invocation_context.agent.""" - ctx = mock.MagicMock(spec=tool_context.ToolContext) - ctx._invocation_context = mock.MagicMock() - ctx._invocation_context.agent = agent or mock.MagicMock() - ctx._invocation_context.agent.name = "test_agent" - ctx._invocation_context.agent_states = {} - ctx.agent_name = "test_agent" - ctx.invocation_id = invocation_id - ctx.state = {} - return ctx - - -def _make_mock_executor(stdout: str = "", stderr: str = "") -> mock.MagicMock: - """Creates a mock code executor that returns the given output.""" - executor = mock.create_autospec(BaseCodeExecutor, instance=True) - executor.execute_code.return_value = CodeExecutionResult( - stdout=stdout, stderr=stderr - ) - return cast(mock.MagicMock, executor) - - -@pytest.fixture(name="mock_skill_with_traversal_paths") # type: ignore[untyped-decorator] -def _mock_skill_with_traversal_paths() -> models.Skill: - """Fixture for a skill with malicious traversal resource names.""" - frontmatter = mock.create_autospec(models.Frontmatter, instance=True) - frontmatter.name = "evil_skill" - frontmatter.description = "Skill with malicious paths" - frontmatter.allowed_tools = [] - frontmatter.model_dump.return_value = { - "name": "evil_skill", - "description": "Skill with malicious paths", - } - - skill = mock.create_autospec(models.Skill, instance=True) - skill.name = "evil_skill" - skill.description = "Skill with malicious paths" - skill.instructions = "instructions" - skill.frontmatter = frontmatter - skill.resources = mock.MagicMock( - spec=[ - "get_reference", - "get_asset", - "get_script", - "list_references", - "list_assets", - "list_scripts", - ] - ) - - def get_script(name: str) -> models.Script | None: - if name == "exploit.py": - return models.Script(src="print('exploit')") - return None - - skill.resources.get_script.side_effect = get_script - skill.resources.list_references.return_value = [ - "../../etc/cron.d/evil", - "../../../tmp/pwned", - ] - skill.resources.list_assets.return_value = ["/etc/passwd"] - skill.resources.list_scripts.return_value = ["exploit.py"] - - def get_ref(name: str) -> str: - return "malicious content" - - def get_asset(name: str) -> str: - return "malicious asset" - - skill.resources.get_reference.side_effect = get_ref - skill.resources.get_asset.side_effect = get_asset - - return skill - - -@pytest.fixture(name="safe_skill") # type: ignore[untyped-decorator] -def _safe_skill() -> models.Skill: - """Fixture for a skill with safe resource names.""" - frontmatter = mock.create_autospec(models.Frontmatter, instance=True) - frontmatter.name = "safe_skill" - frontmatter.description = "Safe skill" - frontmatter.allowed_tools = [] - frontmatter.model_dump.return_value = { - "name": "safe_skill", - "description": "Safe skill", - } - - skill = mock.create_autospec(models.Skill, instance=True) - skill.name = "safe_skill" - skill.description = "Safe skill" - skill.instructions = "instructions" - skill.frontmatter = frontmatter - skill.resources = mock.MagicMock( - spec=[ - "get_reference", - "get_asset", - "get_script", - "list_references", - "list_assets", - "list_scripts", - ] - ) - - def get_script(name: str) -> models.Script | None: - if name == "run.py": - return models.Script(src="print('hello')") - return None - - skill.resources.get_script.side_effect = get_script - skill.resources.list_references.return_value = ["doc.md", "subdir/notes.md"] - skill.resources.list_assets.return_value = ["data.csv"] - skill.resources.list_scripts.return_value = ["run.py"] - - def get_ref(name: str) -> str: - return "safe content" - - def get_asset(name: str) -> str: - return "safe asset" - - skill.resources.get_reference.side_effect = get_ref - skill.resources.get_asset.side_effect = get_asset - - return skill - - -class TestBuildWrapperCodePathTraversal: - """Tests that _build_wrapper_code blocks path traversal attempts.""" - - def test_traversal_blocked_in_generated_code( - self, mock_skill_with_traversal_paths: models.Skill - ) -> None: - """Verify that the generated wrapper code contains traversal checks.""" - executor = _make_mock_executor(stdout="done\n") - toolset = skill_toolset.SkillToolset( - [mock_skill_with_traversal_paths], code_executor=executor - ) - - # Access the internal _SkillScriptCodeExecutor to test _build_wrapper_code - script_executor = skill_toolset._SkillScriptCodeExecutor( - mock_skill_with_traversal_paths, executor - ) - code = script_executor._build_wrapper_code( - mock_skill_with_traversal_paths, "exploit.py", None - ) - - # Verify the generated code contains path traversal protection - assert ( - "normpath" in code - ), "Generated code must normalize paths with os.path.normpath()" - assert ( - "startswith('..')" in code - ), "Generated code must check for parent directory traversal" - assert "isabs" in code, "Generated code must check for absolute paths" - assert ( - "PermissionError" in code - ), "Generated code must raise PermissionError on traversal" - - def test_safe_paths_pass_validation(self, safe_skill: models.Skill) -> None: - """Verify that legitimate paths (including subdirectories) still work.""" - executor = _make_mock_executor(stdout="hello\n") - toolset = skill_toolset.SkillToolset([safe_skill], code_executor=executor) - - script_executor = skill_toolset._SkillScriptCodeExecutor( - safe_skill, executor - ) - code = script_executor._build_wrapper_code(safe_skill, "run.py", None) - - # The code should contain the safe file paths - assert "doc.md" in code - assert "subdir/notes.md" in code - assert "data.csv" in code - - @pytest.mark.asyncio # type: ignore[untyped-decorator] - async def test_execute_with_traversal_paths_raises( - self, mock_skill_with_traversal_paths: models.Skill - ) -> None: - """Executing a script with traversal resources should raise PermissionError.""" - executor = mock.create_autospec(BaseCodeExecutor, instance=True) - - # Make executor actually run the code to verify PermissionError is raised - def execute_side_effect(ctx: Any, code_input: Any) -> CodeExecutionResult: - code = code_input.code - try: - exec(code, {"__builtins__": __builtins__}) - except PermissionError as e: - return CodeExecutionResult(stdout="", stderr=f"PermissionError: {e}") - return CodeExecutionResult(stdout="success", stderr="") - - executor.execute_code.side_effect = execute_side_effect - - toolset = skill_toolset.SkillToolset( - [mock_skill_with_traversal_paths], code_executor=executor - ) - tool = skill_toolset.RunSkillScriptTool(toolset) - ctx = _make_tool_context_with_agent() - result = await tool.run_async( - args={ - "skill_name": "evil_skill", - "file_path": "exploit.py", - }, - tool_context=ctx, - ) - - # The script should either error or the executor should receive code - # that contains the traversal protection - call_args = executor.execute_code.call_args - code_input = call_args[0][1] - assert "normpath" in code_input.code - assert "PermissionError" in code_input.code - - def test_double_dot_path_blocked(self, safe_skill: models.Skill) -> None: - """Test that ../../ paths are explicitly blocked in generated code.""" - executor = _make_mock_executor() - - # Override to inject a traversal path - safe_skill.resources.list_references.return_value = ["../../etc/shadow"] - safe_skill.resources.get_reference.side_effect = ( - lambda name: "shadow content" - ) - - script_executor = skill_toolset._SkillScriptCodeExecutor( - safe_skill, executor - ) - code = script_executor._build_wrapper_code(safe_skill, "run.py", None) - - # The files dict in the generated code should contain the malicious path - assert "../../etc/shadow" in code - # But the validation code should block it at runtime - assert "normpath" in code - assert "startswith('..')" in code - - def test_absolute_path_blocked(self, safe_skill: models.Skill) -> None: - """Test that absolute paths like /etc/passwd are blocked.""" - executor = _make_mock_executor() - - safe_skill.resources.list_assets.return_value = ["/etc/passwd"] - safe_skill.resources.get_asset.side_effect = lambda name: "root:x:0:0:root" - - script_executor = skill_toolset._SkillScriptCodeExecutor( - safe_skill, executor - ) - code = script_executor._build_wrapper_code(safe_skill, "run.py", None) - - # The validation should check for absolute paths - assert "isabs" in code - assert "PermissionError" in code diff --git a/tests/unittests/tools/test_skill_toolset.py b/tests/unittests/tools/test_skill_toolset.py index 218050e7e0..f637377513 100644 --- a/tests/unittests/tools/test_skill_toolset.py +++ b/tests/unittests/tools/test_skill_toolset.py @@ -11,7 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import annotations import asyncio import collections @@ -333,10 +332,16 @@ async def test_load_skill_run_async_state_none( "error_code": "SKILL_NOT_FOUND", }, ), - # RESOURCE_NOT_FOUND is tested separately in - # test_load_resource_first_missing_returns_soft_error because the - # counter guard requires a real state dict (mock state.get() returns a - # truthy MagicMock that int() coerces to 1, skipping the soft path). + ( + {"skill_name": "skill1", "file_path": "references/other.md"}, + { + "error": ( + "Resource 'references/other.md' not found in skill" + " 'skill1'." + ), + "error_code": "RESOURCE_NOT_FOUND", + }, + ), ( {"skill_name": "skill1", "file_path": "invalid/path.txt"}, { @@ -466,6 +471,14 @@ async def test_process_llm_request_without_list_skills_tool( assert "skill2" in instructions[1] +def test_default_skill_system_instruction_warning(): + with pytest.warns( + UserWarning, match="DEFAULT_SKILL_SYSTEM_INSTRUCTION is experimental" + ): + instruction = skill_toolset.DEFAULT_SKILL_SYSTEM_INSTRUCTION + assert "specialized 'skills'" in instruction + + def test_duplicate_skill_name_raises(mock_skill1): skill_dup = mock.create_autospec(models.Skill, instance=True) skill_dup.name = "skill1" @@ -474,141 +487,20 @@ def test_duplicate_skill_name_raises(mock_skill1): @pytest.mark.asyncio -async def test_scripts_resource_not_found(mock_skill1): +async def test_scripts_resource_not_found(mock_skill1, tool_context_instance): toolset = skill_toolset.SkillToolset([mock_skill1]) tool = skill_toolset.LoadSkillResourceTool(toolset) - ctx = _make_tool_context_with_agent() result = await tool.run_async( args={"skill_name": "skill1", "file_path": "scripts/nonexistent.sh"}, - tool_context=ctx, - ) - assert result["error_code"] == "RESOURCE_NOT_FOUND" - - -@pytest.mark.asyncio -async def test_load_resource_first_missing_returns_soft_error(mock_skill1): - """First RESOURCE_NOT_FOUND in an invocation returns the soft error code.""" - toolset = skill_toolset.SkillToolset([mock_skill1]) - tool = skill_toolset.LoadSkillResourceTool(toolset) - ctx = _make_tool_context_with_agent() - result = await tool.run_async( - args={"skill_name": "skill1", "file_path": "references/other.md"}, - tool_context=ctx, + tool_context=tool_context_instance, ) assert result["error_code"] == "RESOURCE_NOT_FOUND" - assert result["error"] == ( - "Resource 'references/other.md' not found in skill 'skill1'." - ) - - -@pytest.mark.asyncio -async def test_load_resource_repeated_failure_escalates_to_fatal(mock_skill1): - """Any second RESOURCE_NOT_FOUND within an invocation returns RESOURCE_NOT_FOUND_FATAL.""" - toolset = skill_toolset.SkillToolset([mock_skill1]) - tool = skill_toolset.LoadSkillResourceTool(toolset) - ctx = _make_tool_context_with_agent() - - args = {"skill_name": "skill1", "file_path": "references/nonexistent.md"} - - result1 = await tool.run_async(args=args, tool_context=ctx) - assert result1["error_code"] == "RESOURCE_NOT_FOUND" - - result2 = await tool.run_async(args=args, tool_context=ctx) - assert result2["error_code"] == "RESOURCE_NOT_FOUND_FATAL" - assert "Do not retry" in result2["error"] - assert "stop" in result2["error"].lower() - assert "failure #2" in result2["error"] - - -@pytest.mark.asyncio -async def test_load_resource_different_path_also_escalates_to_fatal( - mock_skill1, -): - """A different missing path on the second call still escalates to RESOURCE_NOT_FOUND_FATAL. - - The counter is path-agnostic: any second not-found within the same invocation - is fatal, even when the LLM hallucinates a different path on each retry. - """ - toolset = skill_toolset.SkillToolset([mock_skill1]) - tool = skill_toolset.LoadSkillResourceTool(toolset) - ctx = _make_tool_context_with_agent() - - result1 = await tool.run_async( - args={"skill_name": "skill1", "file_path": "references/missing_a.md"}, - tool_context=ctx, - ) - assert result1["error_code"] == "RESOURCE_NOT_FOUND" - - result2 = await tool.run_async( - args={"skill_name": "skill1", "file_path": "references/missing_b.md"}, - tool_context=ctx, - ) - assert result2["error_code"] == "RESOURCE_NOT_FOUND_FATAL" - assert "Do not retry" in result2["error"] - - -@pytest.mark.asyncio -async def test_load_resource_failures_isolated_per_invocation(mock_skill1): - """Failure counter does not leak across invocations. - - A RESOURCE_NOT_FOUND in invocation A must not increment invocation B's - counter; invocation B's first missing-resource call must still return the - soft error, even when both invocations share the same session state dict. - """ - toolset = skill_toolset.SkillToolset([mock_skill1]) - tool = skill_toolset.LoadSkillResourceTool(toolset) - - shared_state = {} - ctx_a = _make_tool_context_with_agent(invocation_id="inv_a") - ctx_a.state = shared_state - ctx_b = _make_tool_context_with_agent(invocation_id="inv_b") - ctx_b.state = shared_state - - # invocation A: one failure — counter for inv_a reaches 1 (soft). - result_a = await tool.run_async( - args={"skill_name": "skill1", "file_path": "references/typo.md"}, - tool_context=ctx_a, - ) - assert result_a["error_code"] == "RESOURCE_NOT_FOUND" - - # invocation B, first attempt (different path) — counter for inv_b = 1 (soft). - result_b1 = await tool.run_async( - args={"skill_name": "skill1", "file_path": "references/typo.md"}, - tool_context=ctx_b, - ) - assert result_b1["error_code"] == "RESOURCE_NOT_FOUND" - - # invocation B, second attempt (different path) — counter for inv_b = 2 (fatal). - result_b2 = await tool.run_async( - args={"skill_name": "skill1", "file_path": "references/other.md"}, - tool_context=ctx_b, - ) - assert result_b2["error_code"] == "RESOURCE_NOT_FOUND_FATAL" - - -@pytest.mark.asyncio -async def test_load_resource_counter_uses_temp_prefix(mock_skill1): - """Failure-counter key uses the `temp:` prefix so it is not persisted.""" - toolset = skill_toolset.SkillToolset([mock_skill1]) - tool = skill_toolset.LoadSkillResourceTool(toolset) - ctx = _make_tool_context_with_agent() - - await tool.run_async( - args={"skill_name": "skill1", "file_path": "references/missing.md"}, - tool_context=ctx, - ) - - # The counter key must start with `temp:` so it is trimmed from the event - # delta and never reaches durable storage. - guard_keys = [k for k in ctx.state if "skill_resource_not_found_count" in k] - assert guard_keys, "Failure counter did not write a tracking key." - assert all(k.startswith("temp:") for k in guard_keys) # RunSkillScriptTool tests -def _make_tool_context_with_agent(agent=None, invocation_id="test_invocation"): +def _make_tool_context_with_agent(agent=None): """Creates a mock ToolContext with _invocation_context.agent.""" ctx = mock.MagicMock(spec=tool_context.ToolContext) ctx._invocation_context = mock.MagicMock() @@ -616,7 +508,6 @@ def _make_tool_context_with_agent(agent=None, invocation_id="test_invocation"): ctx._invocation_context.agent.name = "test_agent" ctx._invocation_context.agent_states = {} ctx.agent_name = "test_agent" - ctx.invocation_id = invocation_id ctx.state = {} return ctx @@ -753,10 +644,6 @@ async def test_execute_script_python_success(mock_skill1): assert "_materialize_and_run()" in code_input.code assert "import runpy" in code_input.code assert "sys.argv = ['scripts/run.py']" in code_input.code - assert ( - "sys.path.insert(0, os.path.dirname(os.path.abspath('scripts/run.py')))" - in code_input.code - ) assert ( "runpy.run_path('scripts/run.py', run_name='__main__')" in code_input.code ) @@ -1144,17 +1031,8 @@ def get_script_extended(name): # ── Integration tests using real UnsafeLocalCodeExecutor ── -def _make_skill_with_script( - skill_name: str, script_name: str, script: models.Script -) -> models.Skill: +def _make_skill_with_script(skill_name, script_name, script): """Creates a minimal mock Skill with a single script.""" - return _make_skill_with_scripts(skill_name, {script_name: script}) - - -def _make_skill_with_scripts( - skill_name: str, scripts: dict[str, models.Script] -) -> models.Skill: - """Creates a minimal mock Skill with scripts.""" skill = mock.create_autospec(models.Skill, instance=True) skill.name = skill_name skill.description = f"Test skill {skill_name}" @@ -1175,14 +1053,16 @@ def _make_skill_with_scripts( ) def get_script(name): - return scripts.get(name) + if name == script_name: + return script + return None skill.resources.get_script.side_effect = get_script skill.resources.get_reference.return_value = None skill.resources.get_asset.return_value = None skill.resources.list_references.return_value = [] skill.resources.list_assets.return_value = [] - skill.resources.list_scripts.return_value = list(scripts) + skill.resources.list_scripts.return_value = [script_name] return skill @@ -1217,36 +1097,6 @@ async def test_integration_python_stdout(): assert result["stderr"] == "" -@pytest.mark.asyncio -async def test_integration_python_imports_sibling_script_module(): - """Real executor: Python scripts can import helpers from scripts/.""" - skill = _make_skill_with_scripts( - "test_skill", - { - "run.py": models.Script( - src="from helper import message\nprint(message())" - ), - "helper.py": models.Script( - src="def message():\n return 'hello from helper'" - ), - }, - ) - toolset = _make_real_executor_toolset([skill]) - tool = skill_toolset.RunSkillScriptTool(toolset) - ctx = _make_tool_context_with_agent() - result = await tool.run_async( - args={ - "skill_name": "test_skill", - "file_path": "run.py", - }, - tool_context=ctx, - ) - assert "status" in result, f"Result missing status: {result}" - assert result["status"] == "success" - assert result["stdout"] == "hello from helper\n" - assert result["stderr"] == "" - - @pytest.mark.asyncio async def test_integration_python_sys_exit_zero(): """Real executor: sys.exit(0) is treated as success.""" @@ -2075,90 +1925,3 @@ async def test_close_cancels_futures_and_clears_cache(): assert fut1.cancelled() assert not fut2.cancelled() # Done futures shouldn't/can't be cancelled assert not toolset._fetched_skill_cache - - -@pytest.mark.asyncio -async def test_process_llm_request_with_tool_name_prefix( - mock_skill1, mock_skill2, tool_context_instance, mock_registry -): - toolset = skill_toolset.SkillToolset( - [mock_skill1, mock_skill2], - registry=mock_registry, - tool_name_prefix="my_prefix", - ) - - # Manually remove ListSkillsTool from self._tools to simulate it not being available - # so that instructions[1] is generated with available_skills - toolset._tools = [ - t - for t in toolset._tools - if not isinstance(t, skill_toolset.ListSkillsTool) - ] - - llm_req = mock.create_autospec(llm_request_model.LlmRequest, instance=True) - - await toolset.process_llm_request( - tool_context=tool_context_instance, llm_request=llm_req - ) - - llm_req.append_instructions.assert_called_once() - args, _ = llm_req.append_instructions.call_args - instructions = args[0] - assert len(instructions) == 3 - assert "`my_prefix_load_skill`" in instructions[0] - assert "`my_prefix_load_skill_resource`" in instructions[0] - assert "`my_prefix_run_skill_script`" in instructions[0] - assert "my_prefix_search_skills" in instructions[2] - - -@pytest.mark.asyncio -async def test_skill_toolset_with_list_tool_filter(): - toolset = skill_toolset.SkillToolset( - tool_filter=["list_skills", "load_skill"] - ) - tools = await toolset.get_tools() - tool_names = [t.name for t in tools] - assert "list_skills" in tool_names - assert "load_skill" in tool_names - assert "load_skill_resource" not in tool_names - assert "run_skill_script" not in tool_names - - -@pytest.mark.asyncio -async def test_skill_toolset_with_predicate_tool_filter(): - # Filter to only tools containing 'resource' in their name - toolset = skill_toolset.SkillToolset( - tool_filter=lambda tool, ctx=None: "resource" in tool.name - ) - tools = await toolset.get_tools() - tool_names = [t.name for t in tools] - assert tool_names == ["load_skill_resource"] - - -@pytest.mark.asyncio -async def test_skill_toolset_with_dynamic_tools_filter( - mock_skill1, tool_context_instance -): - mock_skill1.frontmatter.metadata = { - "adk_additional_tools": ["my_custom_tool"] - } - - custom_tool = mock.create_autospec(skill_toolset.BaseTool, instance=True) - custom_tool.name = "my_custom_tool" - - toolset = skill_toolset.SkillToolset( - skills=[mock_skill1], - additional_tools=[custom_tool], - tool_filter=["list_skills", "my_custom_tool"], - ) - - state_key = "_adk_activated_skill_test_agent" - tool_context_instance.state.get.side_effect = lambda key, default=None: ( - ["skill1"] if key == state_key else default - ) - - tools = await toolset.get_tools(readonly_context=tool_context_instance) - tool_names = [t.name for t in tools] - assert "list_skills" in tool_names - assert "my_custom_tool" in tool_names - assert "load_skill" not in tool_names diff --git a/tests/unittests/utils/test_feature_decorator.py b/tests/unittests/utils/test_feature_decorator.py index 68c1e5ae0b..7b29d6db4e 100644 --- a/tests/unittests/utils/test_feature_decorator.py +++ b/tests/unittests/utils/test_feature_decorator.py @@ -1,17 +1,3 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - import os import tempfile import warnings diff --git a/tests/unittests/utils/test_model_name_utils.py b/tests/unittests/utils/test_model_name_utils.py index 46ce4655fc..bb2654c3db 100644 --- a/tests/unittests/utils/test_model_name_utils.py +++ b/tests/unittests/utils/test_model_name_utils.py @@ -16,7 +16,6 @@ from google.adk.utils.model_name_utils import extract_model_name from google.adk.utils.model_name_utils import is_gemini_1_model -from google.adk.utils.model_name_utils import is_gemini_3_1_flash_live from google.adk.utils.model_name_utils import is_gemini_eap_or_2_or_above from google.adk.utils.model_name_utils import is_gemini_model from google.adk.utils.model_name_utils import is_gemini_model_id_check_disabled @@ -339,30 +338,3 @@ def test_default_is_disabled(self, monkeypatch): def test_true_enables_check_bypass(self, monkeypatch): monkeypatch.setenv('ADK_DISABLE_GEMINI_MODEL_ID_CHECK', 'true') assert is_gemini_model_id_check_disabled() is True - - -class TestIsGemini31FlashLive: - """Test the is_gemini_3_1_flash_live function.""" - - def test_is_gemini_3_1_flash_live_simple_name(self): - """Test with simple model name format.""" - assert is_gemini_3_1_flash_live('gemini-3.1-flash-live') is True - assert is_gemini_3_1_flash_live('gemini-3.1-flash-live-preview') is True - assert is_gemini_3_1_flash_live('gemini-3.1-pro-live') is False - assert is_gemini_3_1_flash_live('gemini-2.5-flash-live') is False - - def test_is_gemini_3_1_flash_live_path_based_name(self): - """Test with path-based format (Vertex AI etc.).""" - vertex_path = 'projects/123/locations/us-central1/publishers/google/models/gemini-3.1-flash-live' - assert is_gemini_3_1_flash_live(vertex_path) is True - - vertex_path_preview = 'projects/123/locations/us-central1/publishers/google/models/gemini-3.1-flash-live-preview' - assert is_gemini_3_1_flash_live(vertex_path_preview) is True - - non_live_path = 'projects/123/locations/us-central1/publishers/google/models/gemini-3.1-flash' - assert is_gemini_3_1_flash_live(non_live_path) is False - - def test_is_gemini_3_1_flash_live_edge_cases(self): - """Test edge cases.""" - assert is_gemini_3_1_flash_live(None) is False - assert is_gemini_3_1_flash_live('') is False diff --git a/tests/unittests/utils/test_output_schema_utils.py b/tests/unittests/utils/test_output_schema_utils.py index 963204894f..e0077966f5 100644 --- a/tests/unittests/utils/test_output_schema_utils.py +++ b/tests/unittests/utils/test_output_schema_utils.py @@ -14,35 +14,17 @@ from __future__ import annotations +import builtins import importlib.util +import sys +from typing import Any +from google.adk.models.anthropic_llm import Claude from google.adk.models.base_llm import BaseLlm from google.adk.models.google_llm import Gemini from google.adk.utils.output_schema_utils import can_use_output_schema_with_tools import pytest -_has_anthropic = importlib.util.find_spec("anthropic") is not None -_has_litellm = importlib.util.find_spec("litellm") is not None - -_skip_anthropic = pytest.mark.skipif( - not _has_anthropic, reason="anthropic not installed" -) -_skip_litellm = pytest.mark.skipif( - not _has_litellm, reason="litellm not installed" -) - - -def _make_claude(model: str): - from google.adk.models.anthropic_llm import Claude - - return Claude(model=model) - - -def _make_litellm(model: str): - from google.adk.models.lite_llm import LiteLlm - - return LiteLlm(model=model) - @pytest.mark.parametrize( "model, env_value, expected", @@ -59,6 +41,9 @@ def _make_litellm(model: str): ("gemini-1.5-pro", "1", False), ("gemini-1.5-pro", "0", False), ("gemini-1.5-pro", None, False), + (Claude(model="claude-3.7-sonnet"), "1", False), + (Claude(model="claude-3.7-sonnet"), "0", False), + (Claude(model="claude-3.7-sonnet"), None, False), ], ) def test_can_use_output_schema_with_tools( @@ -75,45 +60,35 @@ def test_can_use_output_schema_with_tools( assert can_use_output_schema_with_tools(model) == expected -@_skip_anthropic -@pytest.mark.parametrize( - "model, env_value, expected", - [ - ("claude-3.7-sonnet", "1", False), - ("claude-3.7-sonnet", "0", False), - ("claude-3.7-sonnet", None, False), - ], -) -def test_can_use_output_schema_with_tools_claude( - monkeypatch, model, env_value, expected -): - """Test can_use_output_schema_with_tools with Claude models.""" - claude_model = _make_claude(model) - if env_value is not None: - monkeypatch.setenv("GOOGLE_GENAI_USE_VERTEXAI", env_value) - else: - monkeypatch.delenv("GOOGLE_GENAI_USE_VERTEXAI", raising=False) - assert can_use_output_schema_with_tools(claude_model) == expected +def test_can_use_output_schema_with_tools_with_litellm_model() -> None: + """Test LiteLlm detection when the optional module is available.""" + if importlib.util.find_spec("litellm") is None: + pytest.skip("litellm is not installed") + from google.adk.models.lite_llm import LiteLlm -@_skip_litellm -@pytest.mark.parametrize( - "model, env_value, expected", - [ - ("openai/gpt-4o", "1", True), - ("openai/gpt-4o", "0", True), - ("openai/gpt-4o", None, True), - ("anthropic/claude-3.7-sonnet", None, True), - ("fireworks_ai/llama-v3p1-70b", None, True), - ], -) -def test_can_use_output_schema_with_tools_litellm( - monkeypatch, model, env_value, expected -): - """Test can_use_output_schema_with_tools with LiteLLM models.""" - litellm_model = _make_litellm(model) - if env_value is not None: - monkeypatch.setenv("GOOGLE_GENAI_USE_VERTEXAI", env_value) - else: - monkeypatch.delenv("GOOGLE_GENAI_USE_VERTEXAI", raising=False) - assert can_use_output_schema_with_tools(litellm_model) == expected + assert can_use_output_schema_with_tools(LiteLlm(model="openai/gpt-4o")) + + +def test_can_use_output_schema_with_tools_without_litellm_module( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """Test optional LiteLlm import failures do not affect other models.""" + original_import = builtins.__import__ + + def _failing_import( + name: str, + globals_dict: dict[str, Any] | None = None, + locals_dict: dict[str, Any] | None = None, + fromlist: tuple[str, ...] = (), + level: int = 0, + ) -> Any: + if name.endswith("lite_llm"): + raise ImportError("litellm not installed") + return original_import(name, globals_dict, locals_dict, fromlist, level) + + monkeypatch.delenv("GOOGLE_GENAI_USE_VERTEXAI", raising=False) + monkeypatch.delitem(sys.modules, "google.adk.models.lite_llm", raising=False) + monkeypatch.setattr(builtins, "__import__", _failing_import) + + assert not can_use_output_schema_with_tools(Claude(model="claude-3.7-sonnet")) diff --git a/tests/unittests/utils/test_serialized_base_model.py b/tests/unittests/utils/test_serialized_base_model.py deleted file mode 100644 index fa4f48c3eb..0000000000 --- a/tests/unittests/utils/test_serialized_base_model.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for SerializedBaseModel.""" - -from google.adk.utils._serialized_base_model import SerializedBaseModel - - -class MyModel(SerializedBaseModel): - test_field: str - - -def test_model_dump_json_by_alias_default(): - model = MyModel(test_field="value") - json_str = model.model_dump_json() - assert "testField" in json_str - assert "test_field" not in json_str - - -def test_model_dump_json_by_alias_false(): - model = MyModel(test_field="value") - json_str = model.model_dump_json(by_alias=False) - assert "test_field" in json_str - assert "testField" not in json_str diff --git a/tests/unittests/utils/test_streaming_utils.py b/tests/unittests/utils/test_streaming_utils.py index 4cb81ed9ba..6b68789bf0 100644 --- a/tests/unittests/utils/test_streaming_utils.py +++ b/tests/unittests/utils/test_streaming_utils.py @@ -184,105 +184,25 @@ async def test_close_with_error(self): assert closed_response.error_message == "Recitation error" @pytest.mark.asyncio - @pytest.mark.parametrize("use_progressive_sse", [True, False]) - async def test_empty_content_produces_empty_final_frame( - self, use_progressive_sse - ): - """A candidate with an empty parts list produces an empty final frame.""" - with temporary_feature_override( - FeatureName.PROGRESSIVE_SSE_STREAMING, use_progressive_sse - ): - aggregator = streaming_utils.StreamingResponseAggregator() - response = types.GenerateContentResponse( - candidates=[ - types.Candidate( - content=types.Content(parts=[]), - finish_reason=types.FinishReason.STOP, - ) - ] - ) - results = [] - async for r in aggregator.process_response(response): - results.append(r) - closed_response = aggregator.close() - - assert len(results) == 1 - assert results[0].content is not None - assert closed_response is not None - assert closed_response.partial is False - assert closed_response.content is None - assert closed_response.finish_reason == types.FinishReason.STOP - - @pytest.mark.asyncio - @pytest.mark.parametrize("use_progressive_sse", [True, False]) - async def test_prompt_feedback_block_returns_error_frame( - self, use_progressive_sse - ): - """A prompt-level safety block produces a final frame with the error code.""" - with temporary_feature_override( - FeatureName.PROGRESSIVE_SSE_STREAMING, use_progressive_sse - ): - aggregator = streaming_utils.StreamingResponseAggregator() - response = types.GenerateContentResponse( - prompt_feedback=types.GenerateContentResponsePromptFeedback( - block_reason=types.BlockedReason.SAFETY, - block_reason_message="Blocked by safety", - ) - ) - results = [] - async for r in aggregator.process_response(response): - results.append(r) - closed_response = aggregator.close() - - assert len(results) == 1 - assert closed_response is not None - assert closed_response.partial is False - assert closed_response.error_code == types.BlockedReason.SAFETY - assert closed_response.error_message == "Blocked by safety" - assert closed_response.content is None - - @pytest.mark.asyncio - @pytest.mark.parametrize("use_progressive_sse", [True, False]) - async def test_pure_function_call_behavior_differs_by_mode( - self, use_progressive_sse - ): - """A pure function call yields the part in progressive mode and an empty frame otherwise.""" - with temporary_feature_override( - FeatureName.PROGRESSIVE_SSE_STREAMING, use_progressive_sse - ): - aggregator = streaming_utils.StreamingResponseAggregator() - response = types.GenerateContentResponse( - candidates=[ - types.Candidate( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name="my_tool", - args={"x": 1}, - ) - ) - ] - ), - finish_reason=types.FinishReason.STOP, - ) - ] - ) - - results = [] - async for r in aggregator.process_response(response): - results.append(r) - closed_response = aggregator.close() - - assert closed_response is not None - assert closed_response.partial is False + async def test_process_response_with_none_content(self): + """Test that StreamingResponseAggregator handles content=None.""" + aggregator = streaming_utils.StreamingResponseAggregator() + response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=types.Content(parts=[]), + finish_reason=types.FinishReason.STOP, + ) + ] + ) + results = [] + async for r in aggregator.process_response(response): + results.append(r) + assert len(results) == 1 + assert results[0].content is not None - if use_progressive_sse: - assert closed_response.content is not None - assert len(closed_response.content.parts) == 1 - assert closed_response.content.parts[0].function_call.name == "my_tool" - else: - assert closed_response.content is None + closed_response = aggregator.close() + assert closed_response is None @pytest.mark.asyncio @pytest.mark.parametrize( diff --git a/tests/unittests/workflow/__init__.py b/tests/unittests/workflow/__init__.py deleted file mode 100644 index 58d482ea38..0000000000 --- a/tests/unittests/workflow/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/tests/unittests/workflow/test_agent_node.py b/tests/unittests/workflow/test_agent_node.py deleted file mode 100644 index 85c91f9ff5..0000000000 --- a/tests/unittests/workflow/test_agent_node.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Unit tests for BaseAgent acting as a workflow node.""" - -from __future__ import annotations - -from typing import AsyncGenerator - -from google.adk.agents.base_agent import BaseAgent -from google.adk.agents.context import Context -from google.adk.agents.invocation_context import InvocationContext -from google.adk.events.event import Event -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.sessions.session import Session -import pytest - - -class MockAgent(BaseAgent): - """A mock agent that yields predefined events.""" - - async def _run_async_impl( - self, ctx: InvocationContext - ) -> AsyncGenerator[Event, None]: - yield Event(author=self.name) - yield Event(author="sub_agent") - - -@pytest.mark.asyncio -async def test_base_agent_as_node_run(): - """Tests that BaseAgent runs as a node and preserves event authors.""" - agent = MockAgent(name="mock_agent") - - # Setup minimal context - session = Session(app_name="test", user_id="user", id="session") - session_service = InMemorySessionService() - ic = InvocationContext( - invocation_id="inv", - session=session, - session_service=session_service, - ) - ctx = Context(ic, node_path="wf") - - events = [] - async for event in agent.run(ctx=ctx, node_input=None): - events.append(event) - - assert len(events) == 2 - - # First event from mock_agent - assert events[0].author == "mock_agent" - assert events[0].node_info.path == "wf" - - # Second event from sub_agent - assert events[1].author == "sub_agent" - # Path should not be set by BaseAgent for sub_agent if author doesn't match agent name - assert not events[1].node_info.path - - # Also check if ctx.event_author was updated to preserve author for NodeRunner - assert ctx.event_author == "sub_agent" diff --git a/tests/unittests/workflow/test_dynamic_node_scheduler.py b/tests/unittests/workflow/test_dynamic_node_scheduler.py deleted file mode 100644 index 0e7e37f2b3..0000000000 --- a/tests/unittests/workflow/test_dynamic_node_scheduler.py +++ /dev/null @@ -1,1212 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for DynamicNodeScheduler. - -Verifies the three scheduling cases (fresh, dedup, resume) and the -lazy event scan that reconstructs dynamic node state. -""" - -from unittest.mock import AsyncMock -from unittest.mock import MagicMock - -from google.adk.agents.context import Context -from google.adk.events.event import Event -from google.adk.events.event import NodeInfo -from google.adk.workflow._base_node import BaseNode -from google.adk.workflow._dynamic_node_scheduler import DynamicNodeRun -from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler -from google.adk.workflow._dynamic_node_scheduler import DynamicNodeState -from google.adk.workflow._node_state import NodeState -from google.adk.workflow._node_status import NodeStatus -from google.adk.workflow._workflow import _LoopState -from pydantic import BaseModel -import pytest - -# --- Fixtures --- - - -def _make_parent_ctx(events=None): - """Create a minimal parent Context with mock IC.""" - ic = MagicMock() - ic.invocation_id = 'inv-1' - ic.session = MagicMock() - ic.session.state = {} - ic.session.events = events or [] - ic.run_config = None - - collected = [] - - async def _enqueue(event): - collected.append(event) - - ic._enqueue_event = AsyncMock(side_effect=_enqueue) - - ctx = MagicMock(spec=Context) - ctx._invocation_context = ic - ctx.node_path = 'wf/parent' - ctx.run_id = 'run-parent' - ctx.event_author = 'wf' - ctx._workflow_scheduler = None - ctx._output_for_ancestors = [] - ctx._output_delegated = False - ctx._child_run_counters = {} - - return ctx, collected - - -def _make_event( - path='', - output=None, - interrupt_ids=None, - run_id=None, - author='node', - invocation_id='inv-1', - output_for=None, -): - """Create a minimal Event for session event lists.""" - event = MagicMock(spec=Event) - event.invocation_id = invocation_id - event.author = author - event.output = output - event.partial = False - event.node_info = MagicMock(spec=NodeInfo) - event.node_info.path = path - event.node_info.output_for = output_for - event.node_info.message_as_output = None - event.branch = None - event.isolation_scope = None - event.long_running_tool_ids = set(interrupt_ids) if interrupt_ids else None - event.content = None - event.actions = None - return event - - -def _make_fr_event(fc_id, response, invocation_id='inv-1'): - """Create a user FR event.""" - event = MagicMock(spec=Event) - event.invocation_id = invocation_id - event.author = 'user' - event.output = None - event.node_info = MagicMock(spec=NodeInfo) - event.node_info.path = '' - event.node_info.message_as_output = None - event.branch = None - event.isolation_scope = None - event.long_running_tool_ids = None - - fr = MagicMock() - fr.id = fc_id - fr.response = response - - part = MagicMock() - part.function_response = fr - - content = MagicMock() - content.parts = [part] - event.content = content - return event - - -# ========================================================================= -# _rehydrate_from_events — lazy scan -# ========================================================================= - - -@pytest.mark.asyncio -async def test_rehydrate_finds_completed_node(): - """Scan finds output event → node marked COMPLETED.""" - events = [ - _make_event( - path='wf/parent/child@r-1', - output='result', - ), - ] - ctx, _ = _make_parent_ctx(events=events) - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') - - assert 'wf/parent/child@r-1' in ls.runs - run = ls.runs['wf/parent/child@r-1'] - assert run.recovered_state is not None - assert run.recovered_state.output == 'result' - - -@pytest.mark.asyncio -async def test_rehydrate_ignores_events_from_different_invocation(): - """Scan ignores events with a different invocation_id.""" - events = [ - _make_event( - path='wf/parent/child@r-1', - output='result', - invocation_id='inv-different', - ), - ] - ctx, _ = _make_parent_ctx(events=events) - ctx._invocation_context.invocation_id = 'inv-current' - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') - - assert 'wf/parent/child@r-1' not in ls.runs - - -@pytest.mark.asyncio -async def test_rehydrate_finds_interrupted_node(): - """Scan finds interrupt event → node marked WAITING.""" - events = [ - _make_event( - path='wf/parent/child@r-1', - interrupt_ids=['fc-1'], - ), - ] - ctx, _ = _make_parent_ctx(events=events) - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') - - assert 'wf/parent/child@r-1' in ls.runs - run = ls.runs['wf/parent/child@r-1'] - assert run.recovered_state is not None - assert 'fc-1' in run.recovered_state.interrupt_ids - - -@pytest.mark.asyncio -async def test_rehydrate_with_target_run_id_skips_others(): - """Scan with unique path only rehydrates that specific run.""" - events = [ - _make_event( - path='wf/parent/child@r-1', - output='result-1', - ), - _make_event( - path='wf/parent/child@r-2', - output='result-2', - ), - ] - ctx, _ = _make_parent_ctx(events=events) - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - # When targeting r-2 - scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-2') - - # Then only r-2 is in state - assert 'wf/parent/child@r-2' in ls.runs - assert 'wf/parent/child@r-1' not in ls.runs - run = ls.runs['wf/parent/child@r-2'] - assert run.recovered_state is not None - assert run.recovered_state.output == 'result-2' - - -@pytest.mark.asyncio -async def test_rehydrate_includes_delegated(): - """Scan includes events delegated to that run.""" - events = [ - _make_event( - path='wf/parent/child@r-target/inner@r-inner', - output='delegated-val', - output_for=['wf/parent/child@r-target'], - ), - ] - ctx, _ = _make_parent_ctx(events=events) - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-target') - - assert 'wf/parent/child@r-target' in ls.runs - run = ls.runs['wf/parent/child@r-target'] - assert run.recovered_state is not None - assert run.recovered_state.output == 'delegated-val' - - -@pytest.mark.asyncio -async def test_rehydrate_resolves_interrupt_with_fr(): - """Scan finds interrupt + FR → all resolved, ready to re-run.""" - events = [ - _make_event( - path='wf/parent/child@r-1', - interrupt_ids=['fc-1'], - ), - _make_fr_event('fc-1', {'approved': True}), - ] - ctx, _ = _make_parent_ctx(events=events) - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') - - run = ls.runs['wf/parent/child@r-1'] - assert run.recovered_state is not None - assert 'fc-1' in run.recovered_state.resolved_ids - - -@pytest.mark.asyncio -async def test_rehydrate_no_events_does_nothing(): - """Scan with no matching events does not populate dynamic_nodes.""" - events = [ - _make_event(path='wf/other/node', output='x'), - ] - ctx, _ = _make_parent_ctx(events=events) - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') - - assert 'wf/parent/child@r-1' not in ls.runs - - -@pytest.mark.asyncio -async def test_rehydrate_subtree_interrupt(): - """Interrupts from nested descendants are collected.""" - events = [ - _make_event( - path='wf/parent/child@r-1/inner@r-inner', - interrupt_ids=['fc-deep'], - ), - ] - ctx, _ = _make_parent_ctx(events=events) - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') - - assert 'wf/parent/child@r-1' in ls.runs - run = ls.runs['wf/parent/child@r-1'] - assert run.recovered_state is not None - assert 'fc-deep' in run.recovered_state.interrupt_ids - - -@pytest.mark.asyncio -async def test_rehydrate_parallel_worker_interrupts(): - """Interrupts from parallel child nodes sharing the parent's path.""" - events = [ - _make_event( - # Child has exact same path as parent - path='wf/parent/parallel', - interrupt_ids=['fc-1'], - run_id='r-child-1', - ), - _make_event( - path='wf/parent/parallel', - interrupt_ids=['fc-2'], - run_id='r-child-2', - ), - ] - ctx, _ = _make_parent_ctx(events=events) - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - # Rehydrate the parent which has run_id 'r-parent' - scheduler._rehydrate_from_events(ctx, 'wf/parent/parallel') - - assert 'wf/parent/parallel' in ls.runs - run = ls.runs['wf/parent/parallel'] - assert run.recovered_state is not None - assert 'fc-1' in run.recovered_state.interrupt_ids - assert 'fc-2' in run.recovered_state.interrupt_ids - - -@pytest.mark.asyncio -async def test_rehydrate_output_for_delegation(): - """Output via output_for delegation is recognized.""" - events = [ - _make_event( - path='wf/parent/child@r-1/inner@r-inner', - output='delegated', - output_for=['wf/parent/child@r-1'], - ), - ] - ctx, _ = _make_parent_ctx(events=events) - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') - - run = ls.runs['wf/parent/child@r-1'] - assert run.recovered_state is not None - assert run.recovered_state.output == 'delegated' - - -# ========================================================================= -# __call__ — dispatch logic -# ========================================================================= - - -# ========================================================================= -# DefaultNodeScheduler — standalone scheduler -# ========================================================================= - - -@pytest.mark.asyncio -async def test_fresh_execution_runs_node(): - """DefaultNodeScheduler runs a fresh node just like DynamicNodeScheduler.""" - - class _Child(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield f'ct: {node_input}' - - ctx, _ = _make_parent_ctx() - tracker = DynamicNodeScheduler(state=DynamicNodeState()) - - mock_child_ctx = MagicMock(spec=Context) - mock_child_ctx.error = None - mock_child_ctx.interrupt_ids = set() - mock_child_ctx.output = 'ct: data' - mock_child_ctx.actions = MagicMock() - mock_child_ctx.actions.transfer_to_agent = None - ctx._run_node_standalone = AsyncMock(return_value=mock_child_ctx) - - child_ctx = await tracker( - ctx, - _Child(name='child'), - 'data', - node_name='child', - run_id='1', - ) - - assert child_ctx.output == 'ct: data' - - -@pytest.mark.asyncio -async def test_completed_dedup_returns_cached(): - """DefaultNodeScheduler returns cached output for completed nodes.""" - ctx, _ = _make_parent_ctx() - tracker = DynamicNodeScheduler(state=DynamicNodeState()) - - # Pre-populate state as if node already completed. - from google.adk.workflow.utils._rehydration_utils import _ChildScanState - - tracker._state.runs['wf/parent/child@r-1'] = DynamicNodeRun( - state=NodeState(run_id='r-1'), - recovered_state=_ChildScanState( - run_id='r-1', - output='cached', - ), - ) - - child_ctx = await tracker( - ctx, - BaseNode(name='child'), - 'input', - node_name='child', - run_id='r-1', - ) - - assert child_ctx.output == 'cached' - - -@pytest.mark.asyncio -async def test_concurrent_dedup_returns_running_task(): - """Scheduler deduplicates concurrent executions of the same running task.""" - import asyncio - - ctx, _ = _make_parent_ctx() - tracker = DynamicNodeScheduler(state=DynamicNodeState()) - - # Mock an active running task (not done yet!) - running_task = asyncio.Future() - - tracker._state.runs['wf/parent/child@r-1'] = DynamicNodeRun( - state=NodeState(run_id='r-1'), - task=running_task, - ) - - # Dispatch the scheduler in the background - scheduler_task = asyncio.create_task( - tracker( - ctx, - BaseNode(name='child'), - 'input', - node_name='child', - run_id='r-1', - ) - ) - - # Let the event loop run one tick to execute the scheduler interception - await asyncio.sleep(0) - - # Resolve the running task dynamically - mock_context = MagicMock(spec=Context) - running_task.set_result(mock_context) - - res_ctx = await scheduler_task - assert res_ctx is mock_context - - -@pytest.mark.asyncio -async def test_waiting_resolved_resumes_node(): - """DefaultNodeScheduler re-runs nodes with resolved interrupts.""" - - class _Resumable(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl(self, *, ctx, node_input): - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'resumed: {ctx.resume_inputs["fc-1"]}' - return - yield 'should not reach here' - - ctx, _ = _make_parent_ctx() - tracker = DynamicNodeScheduler(state=DynamicNodeState()) - - # Pre-populate state as if node interrupted and was resolved. - from google.adk.workflow.utils._rehydration_utils import _ChildScanState - - tracker._state.runs['wf/parent/child@r-1'] = DynamicNodeRun( - state=NodeState(run_id='r-1'), - recovered_state=_ChildScanState( - run_id='r-1', - interrupt_ids={'fc-1'}, - resolved_ids={'fc-1'}, - resolved_responses={'fc-1': 'approved'}, - ), - ) - - mock_child_ctx = MagicMock(spec=Context) - mock_child_ctx.error = None - mock_child_ctx.interrupt_ids = set() - mock_child_ctx.output = 'resumed: approved' - mock_child_ctx.actions = MagicMock() - mock_child_ctx.actions.transfer_to_agent = None - ctx._run_node_standalone = AsyncMock(return_value=mock_child_ctx) - - child_ctx = await tracker( - ctx, - _Resumable(name='child'), - 'input', - node_name='child', - run_id='r-1', - ) - - assert child_ctx.output == 'resumed: approved' - - -@pytest.mark.asyncio -async def test_waiting_unresolved_propagates_interrupts(): - """DefaultNodeScheduler propagates unresolved interrupts.""" - ctx, _ = _make_parent_ctx() - tracker = DynamicNodeScheduler(state=DynamicNodeState()) - - from google.adk.workflow.utils._rehydration_utils import _ChildScanState - - tracker._state.runs['wf/parent/child@r-1'] = DynamicNodeRun( - state=NodeState(run_id='r-1'), - recovered_state=_ChildScanState( - run_id='r-1', - interrupt_ids={'fc-1'}, - ), - ) - - child_ctx = await tracker( - ctx, - BaseNode(name='child'), - 'input', - node_name='child', - run_id='r-1', - ) - - assert child_ctx.interrupt_ids == {'fc-1'} - assert 'fc-1' in tracker._state.interrupt_ids - - -@pytest.mark.asyncio -async def test_calling_waiting_node_without_rerun_raises_value_error(): - """Calling a dynamic node that is waiting for output with rerun_on_resume=False raises ValueError.""" - - # Given a dynamic node waiting for output with rerun_on_resume=False - class _WaitingNode(BaseNode): - wait_for_output: bool = True - - async def _run_impl(self, *, ctx, node_input): - yield 'should not reach here' - - ctx, _ = _make_parent_ctx() - ls = _LoopState() - from google.adk.workflow.utils._rehydration_utils import _ChildScanState - - ls.runs['wf/parent/child@r-1'] = DynamicNodeRun( - state=NodeState(run_id='r-1'), - recovered_state=_ChildScanState( - run_id='r-1', - interrupt_ids={'pause_req'}, - resolved_ids={'pause_req'}, - ), - ) - scheduler = DynamicNodeScheduler(state=ls) - - # When it is called again - # Then it raises ValueError - with pytest.raises( - ValueError, match='is waiting for output but was called again' - ): - await scheduler( - ctx, - _WaitingNode(name='child'), - 'input', - node_name='child', - run_id='r-1', - ) - - -class _ModelA(BaseModel): - x: int - - -@pytest.mark.asyncio -async def test_runtime_schema_validation_passes(): - """Tests that runtime schema validation passes when input matches schema.""" - ctx, _ = _make_parent_ctx() - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - node = BaseNode(name='child', input_schema=_ModelA) - - # We mock _run_node_internal to avoid full execution, we only care about validation in __call__ - scheduler._run_node_internal = AsyncMock(return_value=MagicMock(spec=Context)) - - await scheduler( - ctx, - node, - {'x': 1}, - node_name='child', - run_id='1', - ) - # Should not raise - - -@pytest.mark.asyncio -async def test_runtime_schema_validation_raises(): - """Tests that runtime schema validation raises when input mismatches schema.""" - ctx, _ = _make_parent_ctx() - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - node = BaseNode(name='child', input_schema=_ModelA) - - with pytest.raises( - ValueError, - match=r"Runtime schema validation failed for dynamic node 'child'", - ): - await scheduler( - ctx, - node, - {'x': 'string'}, # Invalid type for x - node_name='child', - run_id='1', - ) - - -@pytest.mark.asyncio -async def test_runtime_schema_validation_missing_schema_passes(): - """Tests that runtime schema validation passes when no schema is defined.""" - ctx, _ = _make_parent_ctx() - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - node = BaseNode(name='child') # No input schema - - scheduler._run_node_internal = AsyncMock(return_value=MagicMock(spec=Context)) - - await scheduler( - ctx, - node, - {'x': 1}, - node_name='child', - run_id='1', - ) - # Should not raise - - -@pytest.mark.asyncio -async def test_runtime_schema_validation_content_fallback(): - """Tests that runtime schema validation handles Content objects by extraction.""" - ctx, _ = _make_parent_ctx() - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - node = BaseNode(name='child', input_schema=_ModelA) - - scheduler._run_node_internal = AsyncMock(return_value=MagicMock(spec=Context)) - - from google.genai import types - - msg = types.Content(parts=[types.Part(text='{"x": 1}')], role='user') - - await scheduler( - ctx, - node, - msg, - node_name='child', - run_id='1', - ) - # Should not raise - - -# ========================================================================= -# __call__ — Agent Transfer logic -# ========================================================================= - - -@pytest.mark.asyncio -async def test_scheduler_handles_child_transfer(): - """Scheduler processes CHILD relationship by nesting next context.""" - # Arrange - from google.adk.agents.llm_agent import LlmAgent - from google.adk.events.event_actions import EventActions - from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler - from google.adk.workflow._workflow import _LoopState - - target = LlmAgent(name='target') - current = LlmAgent(name='current', sub_agents=[target]) - root = LlmAgent(name='root', sub_agents=[current]) - - ctx, _ = _make_parent_ctx() - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - child_ctx1 = MagicMock() - child_ctx1.node_path = 'wf/parent/current@1' - child_ctx1.parent_ctx = ctx - child_ctx1.actions = EventActions(transfer_to_agent='target') - child_ctx1.error = None - child_ctx1.interrupt_ids = set() - child_ctx1._invocation_context = ctx._invocation_context - child_ctx1._child_run_counters = {} - - child_ctx2 = MagicMock() - child_ctx2.node_path = 'wf/parent/current@1/target@1' - child_ctx2.parent_ctx = child_ctx1 - child_ctx2.actions = EventActions() - child_ctx2.error = None - child_ctx2.interrupt_ids = set() - child_ctx2._invocation_context = ctx._invocation_context - child_ctx2._child_run_counters = {} - - scheduler._run_node_internal = AsyncMock(side_effect=[child_ctx1, child_ctx2]) - - # Act - final_ctx = await scheduler( - ctx, - current, - 'input', - node_name='current', - run_id='1', - ) - - # Assert - assert final_ctx is child_ctx2 - calls = scheduler._run_node_internal.call_args_list - assert len(calls) == 2 - - # First call: current node - args1, kwargs1 = calls[0] - assert args1[0] is ctx - assert args1[1] is current - assert args1[2] == 'current' - assert args1[4] == '1' - - # Second call: target node (transferred CHILD) - args2, kwargs2 = calls[1] - assert args2[0] is child_ctx1 - assert args2[1] is target - assert args2[2] == 'target' - assert args2[4] == '1' - - -@pytest.mark.asyncio -async def test_scheduler_handles_sibling_transfer(): - """Scheduler processes SIBLING relationship by sharing parent context.""" - # Arrange - from google.adk.agents.llm_agent import LlmAgent - from google.adk.events.event_actions import EventActions - from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler - from google.adk.workflow._workflow import _LoopState - - current = LlmAgent(name='current') - target = LlmAgent(name='target') - root = LlmAgent(name='root', sub_agents=[current, target]) - - ctx, _ = _make_parent_ctx() - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - child_ctx1 = MagicMock() - child_ctx1.node_path = 'wf/parent/current@1' - child_ctx1.parent_ctx = ctx - child_ctx1.actions = EventActions(transfer_to_agent='target') - child_ctx1.error = None - child_ctx1.interrupt_ids = set() - child_ctx1._invocation_context = ctx._invocation_context - child_ctx1._child_run_counters = {} - - child_ctx2 = MagicMock() - child_ctx2.node_path = 'wf/parent/target@1' - child_ctx2.parent_ctx = ctx - child_ctx2.actions = EventActions() - child_ctx2.error = None - child_ctx2.interrupt_ids = set() - child_ctx2._invocation_context = ctx._invocation_context - child_ctx2._child_run_counters = {} - - scheduler._run_node_internal = AsyncMock(side_effect=[child_ctx1, child_ctx2]) - - # Act - final_ctx = await scheduler( - ctx, - current, - 'input', - node_name='current', - run_id='1', - ) - - # Assert - assert final_ctx is child_ctx2 - calls = scheduler._run_node_internal.call_args_list - assert len(calls) == 2 - - # Second call: target node (transferred SIBLING) - args2, kwargs2 = calls[1] - assert args2[0] is ctx - assert args2[1] is target - assert args2[2] == 'target' - assert args2[4] == '1' - - -@pytest.mark.asyncio -async def test_scheduler_handles_parent_transfer(): - """Scheduler processes PARENT relationship by truncating parent context.""" - # Arrange - from google.adk.agents.llm_agent import LlmAgent - from google.adk.events.event_actions import EventActions - from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler - from google.adk.workflow._workflow import _LoopState - - current = LlmAgent(name='current') - target = LlmAgent(name='target', sub_agents=[current]) - root = LlmAgent(name='root', sub_agents=[target]) - - ctx, _ = _make_parent_ctx() - ctx._child_run_counters = {'target': 1} - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - target_ctx = MagicMock() - target_ctx.node_path = 'wf/parent/target@1' - target_ctx.node = target - target_ctx.parent_ctx = ctx - target_ctx._invocation_context = ctx._invocation_context - target_ctx._child_run_counters = {} - - child_ctx1 = MagicMock() - child_ctx1.node_path = 'wf/parent/target@1/current@1' - child_ctx1.node = current - child_ctx1.parent_ctx = target_ctx - child_ctx1.actions = EventActions(transfer_to_agent='target') - child_ctx1.error = None - child_ctx1.interrupt_ids = set() - child_ctx1._invocation_context = ctx._invocation_context - child_ctx1._child_run_counters = {} - - child_ctx2 = MagicMock() - child_ctx2.node_path = 'wf/parent/target@2' - child_ctx2.parent_ctx = ctx - child_ctx2.actions = EventActions() - child_ctx2.error = None - child_ctx2.interrupt_ids = set() - child_ctx2._invocation_context = ctx._invocation_context - child_ctx2._child_run_counters = {} - - scheduler._run_node_internal = AsyncMock(side_effect=[child_ctx1, child_ctx2]) - - # Act - final_ctx = await scheduler( - target_ctx, - current, - 'input', - node_name='current', - run_id='1', - ) - - # Assert - assert final_ctx is child_ctx2 - calls = scheduler._run_node_internal.call_args_list - assert len(calls) == 2 - - # Second call: target node (transferred ANCESTOR) - args2, kwargs2 = calls[1] - assert args2[0] is ctx - assert args2[1] is target - assert args2[2] == 'target' - assert args2[4] == '2' - - -@pytest.mark.asyncio -async def test_scheduler_raises_value_error_on_self_transfer(): - """Scheduler raises ValueError when agent attempts to transfer to itself.""" - # Arrange - from google.adk.agents.llm_agent import LlmAgent - from google.adk.events.event_actions import EventActions - from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler - from google.adk.workflow._workflow import _LoopState - - current = LlmAgent(name='current') - root = LlmAgent(name='root', sub_agents=[current]) - - ctx, _ = _make_parent_ctx() - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - child_ctx = MagicMock() - child_ctx.node_path = 'wf/parent/current@1' - child_ctx.parent_ctx = ctx - child_ctx.actions = EventActions(transfer_to_agent='current') - child_ctx.error = None - child_ctx.interrupt_ids = set() - child_ctx._invocation_context = ctx._invocation_context - child_ctx._child_run_counters = {} - - scheduler._run_node_internal = AsyncMock(return_value=child_ctx) - - # Act & Assert - with pytest.raises(ValueError, match='cannot transfer to itself'): - await scheduler( - ctx, - current, - 'input', - node_name='current', - run_id='1', - ) - - -@pytest.mark.asyncio -async def test_scheduler_handles_parent_transfer_bypassed_on_resume(): - """Scheduler processes PARENT relationship when parent was bypassed on resume.""" - # Arrange - from google.adk.agents.llm_agent import LlmAgent - from google.adk.events.event_actions import EventActions - from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler - from google.adk.workflow._workflow import _LoopState - - current = LlmAgent(name='current') - target = LlmAgent(name='target', sub_agents=[current]) - root = LlmAgent(name='root', sub_agents=[target]) - - current.parent_agent = target - target.parent_agent = root - - ctx, _ = _make_parent_ctx() - ctx.node = None - ctx._child_run_counters = {'target': 1} - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - target_ctx = MagicMock() - target_ctx.node_path = 'current@1' - target_ctx.node = current - target_ctx.parent_ctx = ctx - target_ctx._invocation_context = ctx._invocation_context - target_ctx._child_run_counters = {} - - child_ctx1 = MagicMock() - child_ctx1.node_path = 'current@1' - child_ctx1.node = current - child_ctx1.parent_ctx = ctx - child_ctx1.actions = EventActions(transfer_to_agent='target') - child_ctx1.error = None - child_ctx1.interrupt_ids = set() - child_ctx1._invocation_context = ctx._invocation_context - child_ctx1._child_run_counters = {} - - child_ctx2 = MagicMock() - child_ctx2.node_path = 'target@2' - child_ctx2.parent_ctx = ctx - child_ctx2.actions = EventActions() - child_ctx2.error = None - child_ctx2.interrupt_ids = set() - child_ctx2._invocation_context = ctx._invocation_context - child_ctx2._child_run_counters = {} - - scheduler._run_node_internal = AsyncMock(side_effect=[child_ctx1, child_ctx2]) - - # Act - final_ctx = await scheduler( - ctx, - current, - 'input', - node_name='current', - run_id='1', - ) - - # Assert - assert final_ctx is child_ctx2 - calls = scheduler._run_node_internal.call_args_list - assert len(calls) == 2 - - # First call: current node - args1, kwargs1 = calls[0] - assert args1[0] is ctx - assert args1[1] is current - assert args1[2] == 'current' - assert args1[4] == '1' - - # Second call: target node (transferred PARENT) - args2, kwargs2 = calls[1] - assert args2[0] is ctx - assert args2[1] is target - assert args2[2] == 'target' - assert args2[4] == '2' - - -@pytest.mark.asyncio -async def test_scheduler_handles_three_layer_agent_transfers_round_trip(): - """Verify 3-layer agent transfers (Root -> Child -> Grandchild -> Child -> Root).""" - # Arrange - from google.adk.agents.llm_agent import LlmAgent - from google.adk.events.event_actions import EventActions - from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler - from google.adk.workflow._workflow import _LoopState - - grandchild = LlmAgent(name='grandchild') - child = LlmAgent(name='child', sub_agents=[grandchild]) - root = LlmAgent(name='root', sub_agents=[child]) - - grandchild.parent_agent = child - child.parent_agent = root - - # ctx is the root context (node = None, parent_ctx = None) - ctx = MagicMock() - ctx.node = None - ctx.parent_ctx = None - ctx.node_path = '' - ctx._child_run_counters = {'child': 1} - ctx._output_for_ancestors = [] - - ic = MagicMock() - ic.invocation_id = 'inv-1' - ic.session = MagicMock() - ic.session.state = {} - ic.session.events = [] - ic.run_config = None - ctx._invocation_context = ic - - # root_ctx is the parent context of child (node = root, parent_ctx = ctx) - root_ctx = MagicMock() - root_ctx.node = root - root_ctx.parent_ctx = ctx - root_ctx.node_path = 'root@1' - root_ctx._child_run_counters = {'child': 1} - root_ctx._invocation_context = ic - - ls = _LoopState() - scheduler = DynamicNodeScheduler(state=ls) - - # Step 1: root delegates to child - child_ctx1 = MagicMock() - child_ctx1.node_path = 'root@1/child@1' - child_ctx1.node = child - child_ctx1.parent_ctx = root_ctx - child_ctx1.actions = EventActions(transfer_to_agent='grandchild') - child_ctx1.error = None - child_ctx1.interrupt_ids = set() - child_ctx1._invocation_context = ic - child_ctx1._child_run_counters = {} - - # Step 2: child delegates to grandchild - grandchild_ctx1 = MagicMock() - grandchild_ctx1.node_path = 'root@1/child@1/grandchild@1' - grandchild_ctx1.node = grandchild - grandchild_ctx1.parent_ctx = child_ctx1 - grandchild_ctx1.actions = EventActions(transfer_to_agent='child') - grandchild_ctx1.error = None - grandchild_ctx1.interrupt_ids = set() - grandchild_ctx1._invocation_context = ic - grandchild_ctx1._child_run_counters = {} - - # Step 3: grandchild transfers back to child - child_ctx2 = MagicMock() - child_ctx2.node_path = 'root@1/child@2' - child_ctx2.node = child - child_ctx2.parent_ctx = root_ctx - child_ctx2.actions = EventActions(transfer_to_agent='root') - child_ctx2.error = None - child_ctx2.interrupt_ids = set() - child_ctx2._invocation_context = ic - child_ctx2._child_run_counters = {} - - # Step 4: child transfers back to root - ctx._child_run_counters = {'root': 1} - root_ctx2 = MagicMock() - root_ctx2.node_path = 'root@2' - root_ctx2.node = root - root_ctx2.parent_ctx = ctx - root_ctx2.actions = EventActions() - root_ctx2.error = None - root_ctx2.interrupt_ids = set() - root_ctx2._invocation_context = ic - root_ctx2._child_run_counters = {} - - scheduler._run_node_internal = AsyncMock( - side_effect=[child_ctx1, grandchild_ctx1, child_ctx2, root_ctx2] - ) - - # Act - final_ctx = await scheduler( - root_ctx, - child, - 'input', - node_name='child', - run_id='1', - ) - - # Assert - assert final_ctx is root_ctx2 - calls = scheduler._run_node_internal.call_args_list - assert len(calls) == 4 - - # 1st call: child (scheduled by root) - args1, kwargs1 = calls[0] - assert args1[0] is root_ctx - assert args1[1] is child - assert args1[2] == 'child' - assert args1[4] == '1' - - # 2nd call: grandchild (transferred CHILD from child) - args2, kwargs2 = calls[1] - assert args2[0] is child_ctx1 - assert args2[1] is grandchild - assert args2[2] == 'grandchild' - assert args2[4] == '1' - - # 3rd call: child (transferred PARENT from grandchild) - args3, kwargs3 = calls[2] - assert args3[0] is root_ctx - assert args3[1] is child - assert args3[2] == 'child' - assert args3[4] == '2' - - # 4th call: root (transferred PARENT from child) - args4, kwargs4 = calls[3] - assert args4[0] is ctx - assert args4[1] is root - assert args4[2] == 'root' - assert args4[4] == '2' - - -# ========================================================================= -# Replay Sequence Ordering preservation for Dynamic Nodes -# ========================================================================= - - -@pytest.mark.asyncio -async def test_dynamic_node_replay_ordering_preserved( - request: pytest.FixtureRequest, -): - """Test that parallel dynamic nodes maintain their chronological completion order during replay.""" - import asyncio - - from google.adk.events.request_input import RequestInput - from google.adk.workflow import node - from google.adk.workflow import START - from google.adk.workflow._workflow import Workflow - from google.genai import types - - from .. import testing_utils - - execution_order = [] - recorded_winner_vals = [] - - @node - async def source_a(*, ctx, node_input): - await asyncio.sleep(0.1) - execution_order.append('source_a_executed') - yield 'result_a' - - @node - async def source_b(*, ctx, node_input): - # No sleep, completes immediately in Run 1 - execution_order.append('source_b_executed') - yield 'result_b' - - @node(rerun_on_resume=True) - async def hitl_node(*, ctx, node_input): - if 'req_h' not in ctx.resume_inputs: - yield RequestInput(interrupt_id='req_h', message='input h') - return - execution_order.append(f'hitl_resumed_with_{node_input}') - yield f'h_{node_input}' - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - completed_order = [] - - async def run_and_record(node_func, run_id): - res = await ctx.run_node(node_func, run_id=run_id) - completed_order.append(res) - return res - - task_a = asyncio.create_task(run_and_record(source_a, 'a')) - task_b = asyncio.create_task(run_and_record(source_b, 'b')) - - await asyncio.wait([task_a, task_b], return_when=asyncio.ALL_COMPLETED) - - winner_val = completed_order[0] - recorded_winner_vals.append(winner_val) - - await ctx.run_node(hitl_node, node_input=winner_val, run_id='h') - - wf_name = request.node.name.replace('[', '_').replace(']', '') - agent = Workflow(name=wf_name, edges=[(START, parent)]) - runner = testing_utils.InMemoryRunner(node=agent) - - # Run 1: source_b finishes first, source_a finishes second. hitl_node interrupts. - events1 = await runner.run_async(testing_utils.get_user_content('start')) - - req_events = [e for e in events1 if e.long_running_tool_ids] - assert len(req_events) == 1 - assert execution_order == ['source_b_executed', 'source_a_executed'] - - invocation_id = events1[0].invocation_id - - # Clear execution order to track replay/resume behavior accurately - execution_order.clear() - recorded_winner_vals.clear() - - # Run 2: Resume with response - resume_payload = types.Content( - role='user', - parts=[ - types.Part( - function_response=types.FunctionResponse( # type: ignore[call-arg] # Third-party SDK signature - id='req_h', - name='user_input', - response={'text': 'response_h'}, - ) - ), - ], - ) - - await runner.run_async( - new_message=resume_payload, invocation_id=invocation_id - ) - - # Assert source_a and source_b were replayed from cache in exact historical order, - # ensuring winner_val correctly resolves to 'result_b' without re-execution. - assert recorded_winner_vals == ['result_b'] diff --git a/tests/unittests/workflow/test_dynamic_use_as_output.py b/tests/unittests/workflow/test_dynamic_use_as_output.py deleted file mode 100644 index a609030ba6..0000000000 --- a/tests/unittests/workflow/test_dynamic_use_as_output.py +++ /dev/null @@ -1,588 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for ctx.run_node(use_as_output=True) dynamic terminal paths.""" - -from __future__ import annotations - -import asyncio -from typing import Any -from typing import AsyncGenerator - -from google.adk.agents.context import Context -from google.adk.apps.app import App -from google.adk.apps.app import ResumabilityConfig -from google.adk.events.event import Event -from google.adk.events.request_input import RequestInput -from google.adk.workflow import BaseNode -from google.adk.workflow import FunctionNode -from google.adk.workflow import node -from google.adk.workflow import START -from google.adk.workflow._workflow import Workflow -from google.genai import types -from pydantic import ConfigDict -import pytest -from typing_extensions import override - -from .. import testing_utils -from .workflow_testing_utils import get_outputs as _get_outputs - - -def _make_app(name: str, agent: Workflow, resumable: bool) -> App: - return App( - name=name, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - - -# --------------------------------------------------------------------------- - -# FunctionNode delegates to FunctionNode -# --------------------------------------------------------------------------- - - -@pytest.mark.parametrize('resumable', [True, False]) -@pytest.mark.asyncio -async def test_use_as_output_function_to_function( - request: pytest.FixtureRequest, resumable: bool -): - """Node A delegates output to dynamic child B via use_as_output=True. - - Only B's output event should appear; A should not emit a duplicate. - """ - - def func_b() -> str: - return 'from_b' - - node_b = FunctionNode(func=func_b) - - async def func_a(ctx: Context) -> str: - return await ctx.run_node(node_b, use_as_output=True) - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - wf_name = request.node.name.replace('[', '_').replace(']', '') - agent = Workflow(name=wf_name, edges=[(START, node_a)]) - app = _make_app(wf_name, agent, resumable) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - # Only one output event (from B). A's output is suppressed. - outputs = _get_outputs(events) - assert outputs == ['from_b'] - - -# --------------------------------------------------------------------------- -# FunctionNode delegates to Workflow -# --------------------------------------------------------------------------- - - -@pytest.mark.parametrize('resumable', [True, False]) -@pytest.mark.asyncio -async def test_use_as_output_function_to_workflow( - request: pytest.FixtureRequest, resumable: bool -): - """Node A delegates output to a Workflow B via use_as_output=True. - - The Workflow's terminal node output should be used as A's output. - """ - - def step_1() -> str: - return 'step_1_done' - - def step_2(node_input: str) -> str: - return f'final:{node_input}' - - inner_wf = Workflow( - name='inner_wf', - edges=[ - (START, step_1), - (step_1, step_2), - ], - ) - - async def func_a(ctx: Context): - return await ctx.run_node(inner_wf, use_as_output=True) - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - wf_name = request.node.name.replace('[', '_').replace(']', '') - agent = Workflow(name=wf_name, edges=[(START, node_a)]) - app = _make_app(wf_name, agent, resumable) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - # step_2 is the terminal node; its output is func_a's output. - # step_1's output is intermediate (not terminal), so only step_2 appears. - outputs = _get_outputs(events) - assert 'final:step_1_done' in outputs - # func_a should NOT have a duplicate output event. - assert outputs.count('final:step_1_done') == 1 - - -# --------------------------------------------------------------------------- -# Custom BaseNode delegates to FunctionNode -# --------------------------------------------------------------------------- - - -class _DelegatingNode(BaseNode): - """A custom BaseNode that delegates output via use_as_output.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - delegate: BaseNode - - @override - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - await ctx.run_node(self.delegate, use_as_output=True) - # Intentionally yield nothing — output comes from delegate. - return - yield # Make this an async generator - - -@pytest.mark.parametrize('resumable', [True, False]) -@pytest.mark.asyncio -async def test_use_as_output_custom_node_to_function( - request: pytest.FixtureRequest, resumable: bool -): - """Custom BaseNode delegates output to dynamic child via use_as_output.""" - - def func_b() -> str: - return 'delegated_output' - - node_b = FunctionNode(func=func_b) - node_a = _DelegatingNode( - name='delegator', delegate=node_b, rerun_on_resume=True - ) - - wf_name = request.node.name.replace('[', '_').replace(']', '') - agent = Workflow(name=wf_name, edges=[(START, node_a)]) - app = _make_app(wf_name, agent, resumable) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - outputs = _get_outputs(events) - assert outputs == ['delegated_output'] - - -# --------------------------------------------------------------------------- -# Multiple use_as_output=True calls (fan-out delegation) -# --------------------------------------------------------------------------- - - -@pytest.mark.parametrize('resumable', [True, False]) -@pytest.mark.asyncio -async def test_use_as_output_multiple_disallowed( - request: pytest.FixtureRequest, resumable: bool -): - """V2 engine forbids calling use_as_output=True multiple times from the same node.""" - - def func_b() -> str: - return 'from_b' - - def func_c() -> str: - return 'from_c' - - node_b = FunctionNode(func=func_b) - node_c = FunctionNode(func=func_c) - - async def func_a(ctx: Context): - await ctx.run_node(node_b, use_as_output=True) - # V2 engine should throw ValueError on second call - with pytest.raises( - ValueError, match='already has a use_as_output delegate' - ): - await ctx.run_node(node_c, use_as_output=True) - return 'failure_as_expected' - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - wf_name = request.node.name.replace('[', '_').replace(']', '') - agent = Workflow(name=wf_name, edges=[(START, node_a)]) - app = _make_app(wf_name, agent, resumable) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - outputs = _get_outputs(events) - # func_a's output is suppressed because it successfully delegated to func_b - # before failing on func_c. So only func_b's output appears. - assert outputs == ['from_b'] - - -# --------------------------------------------------------------------------- -# Nested dynamic delegation (A → B → C, all use_as_output=True) -# --------------------------------------------------------------------------- - - -@pytest.mark.parametrize('resumable', [True, False]) -@pytest.mark.asyncio -async def test_use_as_output_nested_delegation( - request: pytest.FixtureRequest, resumable: bool -): - """Chained delegation: A delegates to B, B delegates to C. - - Only C's output should appear; both A's and B's outputs are suppressed. - """ - - def func_c() -> str: - return 'from_c' - - node_c = FunctionNode(func=func_c) - - async def func_b(ctx: Context) -> str: - return await ctx.run_node(node_c, use_as_output=True) - - node_b = FunctionNode(func=func_b, rerun_on_resume=True) - - async def func_a(ctx: Context) -> str: - return await ctx.run_node(node_b, use_as_output=True) - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - wf_name = request.node.name.replace('[', '_').replace(']', '') - agent = Workflow(name=wf_name, edges=[(START, node_a)]) - app = _make_app(wf_name, agent, resumable) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - outputs = _get_outputs(events) - assert outputs == ['from_c'] - - -@pytest.mark.parametrize('resumable', [True, False]) -@pytest.mark.asyncio -async def test_use_as_output_nested_delegation_with_downstream( - request: pytest.FixtureRequest, resumable: bool -): - """Chained delegation with a downstream node that consumes the output. - - A delegates to B, B delegates to C. D is downstream of A and should - receive C's output as its node_input. - """ - - def func_c() -> str: - return 'from_c' - - node_c = FunctionNode(func=func_c) - - async def func_b(ctx: Context) -> str: - return await ctx.run_node(node_c, use_as_output=True) - - node_b = FunctionNode(func=func_b, rerun_on_resume=True) - - async def func_a(ctx: Context) -> str: - return await ctx.run_node(node_b, use_as_output=True) - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - def func_d(node_input: str) -> str: - return f'received:{node_input}' - - wf_name = request.node.name.replace('[', '_').replace(']', '') - agent = Workflow( - name=wf_name, - edges=[(START, node_a), (node_a, func_d)], - ) - app = _make_app(wf_name, agent, resumable) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - outputs = _get_outputs(events) - assert 'received:from_c' in outputs - - -# --------------------------------------------------------------------------- -# use_as_output=False (default) still emits both events -# --------------------------------------------------------------------------- - - -@pytest.mark.parametrize('resumable', [True, False]) -@pytest.mark.asyncio -async def test_without_use_as_output_emits_both( - request: pytest.FixtureRequest, resumable: bool -): - """Without use_as_output, both parent and child emit output events.""" - - def func_b() -> str: - return 'from_b' - - node_b = FunctionNode(func=func_b) - - async def func_a(ctx: Context) -> str: - return await ctx.run_node(node_b) - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - wf_name = request.node.name.replace('[', '_').replace(']', '') - agent = Workflow(name=wf_name, edges=[(START, node_a)]) - app = _make_app(wf_name, agent, resumable) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - # Both B and A emit output events (no dedup). - outputs = _get_outputs(events) - assert outputs == ['from_b', 'from_b'] - - -# --------------------------------------------------------------------------- -# use_as_output with Workflow containing HITL -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_use_as_output_workflow_with_hitl( - request: pytest.FixtureRequest, -): - """Dynamic Workflow child with HITL node pauses and resumes correctly. - - Requires resumable=True because the inner Workflow's internal node state - (hitl_step in WAITING) must be persisted across invocations. Without - resumability, re-spawning the dynamic Workflow starts its graph fresh. - - Flow: - 1. func_a calls ctx.run_node(inner_wf, use_as_output=True) - 2. inner_wf's hitl_step yields RequestInput → workflow pauses - 3. User responds → workflow resumes - 4. inner_wf completes, func_a re-runs with cached result - 5. Only inner_wf's terminal node output appears - """ - resumable = True - - async def hitl_step(): - yield RequestInput( - interrupt_id='wf_req1', - message='enter value', - ) - - def final_step(node_input: Any) -> str: - text = node_input['text'] if isinstance(node_input, dict) else node_input - return f'final:{text}' - - inner_wf = Workflow( - name='inner_wf', - edges=[ - (START, hitl_step), - (hitl_step, final_step), - ], - ) - - async def func_a(ctx: Context): - return await ctx.run_node(inner_wf, use_as_output=True) - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - wf_name = request.node.name.replace('[', '_').replace(']', '') - agent = Workflow(name=wf_name, edges=[(START, node_a)]) - app = _make_app(wf_name, agent, resumable) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: Should pause at hitl_step. - events1 = await runner.run_async(testing_utils.get_user_content('start')) - outputs1 = _get_outputs(events1) - assert outputs1 == [] - - # Resume with user response. - invocation_id = events1[0].invocation_id - resume_payload = testing_utils.UserContent( - types.Part( - function_response=types.FunctionResponse( - id='wf_req1', - name='user_input', - response={'text': 'hello'}, - ) - ) - ) - events2 = await runner.run_async( - new_message=resume_payload, invocation_id=invocation_id - ) - - outputs2 = _get_outputs(events2) - assert 'final:hello' in outputs2 - assert outputs2.count('final:hello') == 1 - - -@pytest.mark.asyncio -async def test_use_as_output_static_node_not_rerun_on_resume( - request: pytest.FixtureRequest, -): - """Static node delegating output to dynamic child is not re-run on resume. - - Setup: - - wf with node_a (FunctionNode) and hitl_step. - - node_a calls ctx.run_node(node_b, use_as_output=True). - - hitl_step yields RequestInput to pause. - Act: - - Run 1: Run workflow, node_a executes, hitl_step pauses. - - Run 2: Resume with user response for hitl_step. - Assert: - - Run 1: node_b output is emitted as node_a's output. - - Run 2: node_a is NOT re-run (run_count remains 1). - """ - - run_count = 0 - - @node - def node_b() -> str: - return 'from_b' - - @node(rerun_on_resume=True) - async def node_a(ctx: Context): - nonlocal run_count - run_count += 1 - return await ctx.run_node(node_b, use_as_output=True) - - node_a.wait_for_output = True - - @node - async def hitl_step(): - yield RequestInput( - interrupt_id='pause_req', - message='pause', - ) - - @node - def final_step(node_input: Any) -> None: - return None - - wf_name = request.node.name.replace('[', '_').replace(']', '') - agent = Workflow( - name=wf_name, - edges=[ - (START, node_a), - (START, hitl_step), - (hitl_step, final_step), - ], - ) - - runner = testing_utils.InMemoryRunner(root_agent=agent) - - events1 = await runner.run_async(testing_utils.get_user_content('start')) - - assert run_count == 1 - outputs1 = [e.output for e in events1 if e.output] - assert 'from_b' in outputs1 - - invocation_id = events1[0].invocation_id - resume_payload = testing_utils.UserContent( - types.Part( - function_response=types.FunctionResponse( - id='pause_req', - name='user_input', - response={'text': 'continue'}, - ) - ) - ) - - events2 = await runner.run_async( - new_message=resume_payload, invocation_id=invocation_id - ) - - assert run_count == 1 - - -@pytest.mark.asyncio -async def test_use_as_output_instance_isolation(request: pytest.FixtureRequest): - """Output delegation is isolated to specific dynamic instances. - - Setup: - - wf with node_a calling node_b twice in parallel with different run_ids ('b1', 'b2'). - - node_b yields RequestInput to pause. - Act: - - Run 1: Run workflow, both node_b instances pause. - - Run 2: Resume only the 'b1' instance. - Assert: - - Run 1: Both instances run (run_count_b is 2). - - Run 2: Only instance 'b1' completes and delegates output. - Instance 'b2' remains paused and does not emit output. - """ - run_count_b = 0 - - @node - def node_c() -> str: - return 'from_c' - - @node(rerun_on_resume=True) - async def node_b(ctx: Context): - nonlocal run_count_b - - interrupt_id = f'pause_{ctx.node_path}' - if ctx.resume_inputs and interrupt_id in ctx.resume_inputs: - response = ctx.resume_inputs[interrupt_id] - if ( - response - and isinstance(response, dict) - and response.get('text') == 'continue' - ): - await ctx.run_node(node_c, use_as_output=True) - return - - run_count_b += 1 - yield RequestInput( - interrupt_id=interrupt_id, - message='pause', - ) - - @node(rerun_on_resume=True) - async def node_a(ctx: Context): - task1 = ctx.run_node(node_b, run_id='b1') - task2 = ctx.run_node(node_b, run_id='b2') - await asyncio.gather(task1, task2) - - wf_name = request.node.name.replace('[', '_').replace(']', '') - agent = Workflow(name=wf_name, edges=[(START, node_a)]) - - runner = testing_utils.InMemoryRunner(root_agent=agent) - - # Given the workflow is started with parallel instances of node_b - events1 = await runner.run_async(testing_utils.get_user_content('start')) - - # Then both instances execute and pause - assert run_count_b == 2 - - # Find the interrupt ID for instance b1 - interrupt_id_b1 = None - for event in events1: - if event.long_running_tool_ids: - for interrupt_id in event.long_running_tool_ids: - if 'b1' in interrupt_id: - interrupt_id_b1 = interrupt_id - break - - assert interrupt_id_b1 is not None - - # When resuming only instance b1 - invocation_id = events1[0].invocation_id - resume_payload = testing_utils.UserContent( - types.Part( - function_response=types.FunctionResponse( - id=interrupt_id_b1, - name='user_input', - response={'text': 'continue'}, - ) - ) - ) - - events2 = await runner.run_async( - new_message=resume_payload, invocation_id=invocation_id - ) - - # Then node_b is not re-run, and only one output is emitted from node_c - assert run_count_b == 2 - - outputs2 = [e.output for e in events2 if e.output] - assert outputs2.count('from_c') == 1 diff --git a/tests/unittests/workflow/test_function_node.py b/tests/unittests/workflow/test_function_node.py deleted file mode 100644 index 60d4407e61..0000000000 --- a/tests/unittests/workflow/test_function_node.py +++ /dev/null @@ -1,1738 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Testings for the FunctionNode.""" - -import copy -from typing import Any -from typing import AsyncGenerator -from typing import Generator -from typing import Optional -from typing import Union -from unittest import mock - -from google.adk.agents.context import Context -from google.adk.apps.app import App -from google.adk.apps.app import ResumabilityConfig -from google.adk.events._node_path_builder import _NodePathBuilder -from google.adk.events.event import Event -from google.adk.events.event import Event as AdkEvent -from google.adk.events.request_input import RequestInput -from google.adk.runners import Runner -from google.adk.sessions import InMemorySessionService -from google.adk.workflow import FunctionNode -from google.adk.workflow import START -from google.adk.workflow._node_status import NodeStatus -from google.adk.workflow._workflow import Workflow -from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_response -from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids -from google.genai import types -from pydantic import BaseModel -import pytest - -from .. import testing_utils -from .workflow_testing_utils import create_parent_invocation_context -from .workflow_testing_utils import get_output_events -from .workflow_testing_utils import get_request_input_events -from .workflow_testing_utils import simplify_events_with_node -from .workflow_testing_utils import simplify_events_with_node_and_agent_state - -ANY = mock.ANY - -from .workflow_testing_utils import run_workflow - - -@pytest.mark.asyncio -async def test_various_function_nodes(request: pytest.FixtureRequest): - """Tests that Workflow can run with various function nodes.""" - - async def async_gen_func(ctx: Context) -> AsyncGenerator[Any, None]: - yield Event( - output='Hello from AsyncGen', - ) - - def sync_func_out(ctx: Context) -> str: - return 'Hello from SyncFunc' - - async def async_func_out(ctx: Context) -> str: - return 'Hello from AsyncFunc' - - def sync_func_no_out(ctx: Context) -> None: - return None - - async def async_func_no_out(ctx: Context) -> None: - return None - - def sync_gen_func( - ctx: Context, - ) -> Generator[Any, None, None]: - yield Event( - output='Hello from SyncGen', - ) - - async def async_gen_func_raw_output( - ctx: Context, - ) -> AsyncGenerator[Any, None]: - yield 'Hello from AsyncGenRawOutput' - - def sync_gen_func_raw_output( - ctx: Context, - ) -> Generator[Any, None, None]: - yield 'Hello from SyncGenRawOutput' - - agent = Workflow( - name='test_workflow_agent_various_function_nodes', - edges=[ - (START, async_gen_func), - (async_gen_func, sync_func_out), - (sync_func_out, async_func_out), - (async_func_out, sync_func_no_out), - (sync_func_no_out, async_func_no_out), - (async_func_no_out, sync_gen_func), - (sync_gen_func, async_gen_func_raw_output), - (async_gen_func_raw_output, sync_gen_func_raw_output), - ], - ) - app_instance = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app_instance) - events = await runner.run_async(testing_utils.get_user_content('start')) - - # Functions with no output (sync_func_no_out, async_func_no_out) - # will not produce events. - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_various_function_nodes@1/async_gen_func@1', - {'output': 'Hello from AsyncGen'}, - ), - ( - 'test_workflow_agent_various_function_nodes@1/sync_func_out@1', - {'output': 'Hello from SyncFunc'}, - ), - ( - 'test_workflow_agent_various_function_nodes@1/async_func_out@1', - {'output': 'Hello from AsyncFunc'}, - ), - ( - 'test_workflow_agent_various_function_nodes@1/sync_gen_func@1', - {'output': 'Hello from SyncGen'}, - ), - ( - 'test_workflow_agent_various_function_nodes@1/async_gen_func_raw_output@1', - { - 'output': 'Hello from AsyncGenRawOutput', - }, - ), - ( - 'test_workflow_agent_various_function_nodes@1/sync_gen_func_raw_output@1', - { - 'output': 'Hello from SyncGenRawOutput', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_function_node_state_injection(request: pytest.FixtureRequest): - """Tests that FunctionNode can inject parameters from workflow state.""" - - async def set_state_node_fn( - ctx: Context, - ) -> AsyncGenerator[Any, None]: - yield Event( - state={'param1': 'value1'}, - ) - - def check_state_node_fn(param1: str, param2: str = 'default2') -> str: - return f'param1={param1}, param2={param2}' - - agent = Workflow( - name='test_workflow_agent_state_injection', - edges=[ - (START, set_state_node_fn), - (set_state_node_fn, check_state_node_fn), - ], - ) - events, _, _ = await run_workflow(agent) - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_state_injection@1/check_state_node_fn@1', - { - 'output': 'param1=value1, param2=default2', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_function_node_state_injection_missing_param( - request: pytest.FixtureRequest, -): - """Tests that FunctionNode raises error for missing param.""" - - def check_state_node_fn(param1: str) -> str: - return f'param1={param1}' - - agent = Workflow( - name='test_workflow_agent_state_injection_missing', - edges=[ - (START, check_state_node_fn), - ], - ) - with pytest.raises(ValueError, match='Missing value for parameter "param1"'): - await run_workflow(agent) - - -@pytest.mark.asyncio -async def test_function_node_type_checking( - request: pytest.FixtureRequest, -): - """Tests that FunctionNode performs type checking.""" - - async def set_state_node_fn( - ctx: Context, - ) -> AsyncGenerator[Any, None]: - yield Event( - state={'p1': 'a string'}, - ) - - def check_type_node_fn(p1: int) -> str: - return f'p1={p1}' - - agent = Workflow( - name='test_type_checking', - edges=[ - (START, set_state_node_fn), - (set_state_node_fn, check_type_node_fn), - ], - ) - with pytest.raises(ValueError): - await run_workflow(agent) - - -@pytest.mark.asyncio -async def test_function_node_input_injection(request: pytest.FixtureRequest): - """Tests that FunctionNode can inject parameters from node_input.""" - - def node1_fn() -> dict[str, Any]: - return {'p1': 'value1_from_node_input', 'p2': 100} - - def node2_fn(node_input: dict[str, Any]) -> str: - return f"p1={node_input['p1']}, p2={node_input['p2']}" - - agent = Workflow( - name='test_workflow_agent_input_injection_dict', - edges=[ - (START, node1_fn), - (node1_fn, node2_fn), - ], - ) - events, _, _ = await run_workflow(agent) - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_input_injection_dict@1/node1_fn@1', - { - 'output': {'p1': 'value1_from_node_input', 'p2': 100}, - }, - ), - ( - 'test_workflow_agent_input_injection_dict@1/node2_fn@1', - { - 'output': 'p1=value1_from_node_input, p2=100', - }, - ), - ] - - -class MyModel(BaseModel): - p1: str - p2: int - - -@pytest.mark.asyncio -async def test_function_node_input_injection_pydantic( - request: pytest.FixtureRequest, -): - """Tests that FunctionNode can inject dict as pydantic model into node_input.""" - - def node1_fn() -> dict[str, Any]: - return {'p1': 'value1_from_node_input', 'p2': 100} - - def node2_fn(node_input: MyModel) -> str: - return f'p1={node_input.p1}, p2={node_input.p2}' - - agent = Workflow( - name='test_workflow_agent_input_injection_pydantic', - edges=[ - (START, node1_fn), - (node1_fn, node2_fn), - ], - ) - events, _, _ = await run_workflow(agent) - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_input_injection_pydantic@1/node1_fn@1', - { - 'output': {'p1': 'value1_from_node_input', 'p2': 100}, - }, - ), - ( - 'test_workflow_agent_input_injection_pydantic@1/node2_fn@1', - { - 'output': 'p1=value1_from_node_input, p2=100', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_function_node_input_list_wrong_type( - request: pytest.FixtureRequest, -): - """Tests that FunctionNode raises TypeError for list[T] with non-list input.""" - - def node1_fn() -> int: - return 123 - - def node2_fn(node_input: list[MyModel]) -> str: - return f'p1={node_input[0].p1}' - - agent = Workflow( - name='test_workflow_agent_input_list_wrong_type', - edges=[ - (START, node1_fn), - (node1_fn, node2_fn), - ], - ) - with pytest.raises(ValueError): - await run_workflow(agent) - - -@pytest.mark.asyncio -async def test_function_node_input_list_no_item_type( - request: pytest.FixtureRequest, -): - """Tests that FunctionNode handles list without item type.""" - - def node1_fn() -> list[int]: - return [1, 2] - - def node2_fn(node_input: list) -> str: - return f'list={node_input}' - - agent = Workflow( - name='test_workflow_agent_input_list_no_item_type', - edges=[ - (START, node1_fn), - (node1_fn, node2_fn), - ], - ) - events, _, _ = await run_workflow(agent) - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_input_list_no_item_type@1/node1_fn@1', - { - 'output': [1, 2], - }, - ), - ( - 'test_workflow_agent_input_list_no_item_type@1/node2_fn@1', - { - 'output': 'list=[1, 2]', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_function_node_input_and_state_injection( - request: pytest.FixtureRequest, -): - """Tests parameter injection from node_input and state.""" - - async def nodea_fn(ctx: Context) -> AsyncGenerator[Any, None]: - yield Event( - state={'p_state': 'value_from_state'}, - ) - yield 'value_A' - - def nodeb_fn( - node_input: str, p_state: str, p_default: str = 'default2' - ) -> str: - return f'node_input={node_input}, p_state={p_state}, p_default={p_default}' - - agent = Workflow( - name='test_node_param_injection_single_and_state', - edges=[ - (START, nodea_fn), - (nodea_fn, nodeb_fn), - ], - ) - events, _, _ = await run_workflow(agent) - assert simplify_events_with_node(events) == [ - ( - 'test_node_param_injection_single_and_state@1/nodea_fn@1', - {'output': 'value_A'}, - ), - ( - 'test_node_param_injection_single_and_state@1/nodeb_fn@1', - { - 'output': ( - 'node_input=value_A, p_state=value_from_state,' - ' p_default=default2' - ), - }, - ), - ] - - -@pytest.mark.asyncio -async def test_function_node_state_injection_pydantic( - request: pytest.FixtureRequest, -): - """Tests that FunctionNode can inject dict from state as pydantic model.""" - - async def node1_fn(ctx: Context) -> AsyncGenerator[Any, None]: - yield Event( - state={'my_model': {'p1': 'value1_from_state', 'p2': 200}}, - ) - - def node2_fn(my_model: MyModel) -> str: - return f'p1={my_model.p1}, p2={my_model.p2}' - - agent = Workflow( - name='test_workflow_agent_state_injection_pydantic', - edges=[ - (START, node1_fn), - (node1_fn, node2_fn), - ], - ) - events, _, _ = await run_workflow(agent) - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_state_injection_pydantic@1/node2_fn@1', - { - 'output': 'p1=value1_from_state, p2=200', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_function_node_hitl(request: pytest.FixtureRequest): - """Tests that FunctionNode can trigger HITL. - - Setup: Workflow with request_input_fn -> process_input_fn. - request_input_fn yields RequestInput. - Act: - - Run 1: start workflow, request_input_fn yields RequestInput. - - Run 2: resume with user response. - Assert: - - Run 1: returns RequestInput event with valid ID. - - Run 2: process_input_fn receives input and completes. - """ - - # Given: A workflow where the first node requests input - def request_input_fn() -> Generator[Any, None, None]: - yield RequestInput(message='Provide input') - - def process_input_fn(node_input: dict[str, Any]) -> str: - return f"received: {node_input['text']}" - - agent = Workflow( - name='test_workflow_agent_hitl', - edges=[ - (START, request_input_fn), - (request_input_fn, process_input_fn), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When: Starting the workflow - user_event = testing_utils.get_user_content('start workflow') - events1 = await runner.run_async(user_event) - - # Then: It should yield a RequestInput event with a valid ID - req_events = get_request_input_events(events1) - assert len(req_events) == 1 - interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] - invocation_id = events1[0].invocation_id - - # Verify that the FunctionCall object actually has the id set - assert req_events[0].content.parts[0].function_call.id == interrupt_id - - # When: Resuming with user response - user_input = create_request_input_response( - interrupt_id, {'text': 'Hello from user'} - ) - events2 = await runner.run_async( - new_message=testing_utils.UserContent(user_input), - invocation_id=invocation_id, - ) - - # Then: It should complete and pass output to the next node - data_events = get_output_events(events2, output='received: Hello from user') - assert len(data_events) == 1 - - -@pytest.mark.asyncio -async def test_function_node_adk_events(request: pytest.FixtureRequest): - """Tests that FunctionNode can emit ADK events.""" - - def adk_events_fn() -> Generator[Any, None, None]: - yield AdkEvent( - author='some_agent', content=types.Content(parts=[{'text': 'event 1'}]) - ) - yield AdkEvent( - author='some_agent', content=types.Content(parts=[{'text': 'event 2'}]) - ) - - agent = Workflow( - name='test_workflow_agent_adk_events', - edges=[ - (START, adk_events_fn), - ], - ) - events, _, _ = await run_workflow(agent) - - assert len(events) == 2 - assert isinstance(events[0], AdkEvent) - assert events[0].content.parts[0].text == 'event 1' - assert isinstance(events[1], AdkEvent) - assert events[1].content.parts[0].text == 'event 2' - - -@pytest.mark.asyncio -async def test_function_node_list_conversion_pydantic( - request: pytest.FixtureRequest, -): - """Tests that FunctionNode correctly converts list[dict] to list[BaseModel].""" - - class Section(BaseModel): - section_name: str - content: str - - async def upstream_func(ctx: Context) -> list[dict[str, str]]: - return [ - {'section_name': 's1', 'content': 'c1'}, - {'section_name': 's2', 'content': 'c2'}, - ] - - received_input = None - - async def aggregate(node_input: list[Section]) -> str: - nonlocal received_input - received_input = node_input - return 'Done' - - agent = Workflow( - name='test_function_node_list_conversion_pydantic', - edges=[ - (START, upstream_func), - (upstream_func, aggregate), - ], - ) - unused_events, _, _ = await run_workflow(agent) - - # Check if received_input contains Section objects - assert isinstance(received_input, list) - assert len(received_input) == 2 - assert isinstance(received_input[0], Section) - assert received_input[0].section_name == 's1' - - -@pytest.mark.asyncio -async def test_function_node_dict_conversion_pydantic( - request: pytest.FixtureRequest, -): - """Tests that FunctionNode correctly converts dict[str, dict] to dict[str, BaseModel].""" - - class Section(BaseModel): - section_name: str - content: str - - async def upstream_func(ctx: Context) -> dict[str, dict[str, str]]: - return { - 'one': {'section_name': 's1', 'content': 'c1'}, - 'two': {'section_name': 's2', 'content': 'c2'}, - } - - received_input = None - - async def aggregate(node_input: dict[str, Section]) -> str: - nonlocal received_input - received_input = node_input - return 'Done' - - agent = Workflow( - name='test_function_node_dict_conversion_pydantic', - edges=[ - (START, upstream_func), - (upstream_func, aggregate), - ], - ) - unused_events, _, _ = await run_workflow(agent) - - # Check if received_input contains Section objects - assert isinstance(received_input, dict) - assert len(received_input) == 2 - assert isinstance(received_input['one'], Section) - assert received_input['one'].section_name == 's1' - assert isinstance(received_input['two'], Section) - assert received_input['two'].content == 'c2' - - -@pytest.mark.asyncio -async def test_function_node_no_data_returns_none( - request: pytest.FixtureRequest, -): - """Tests that FunctionNode returns Event with output=None if function returns only control event.""" - - def func_no_data() -> Event: - return Event(route='some_route') - - agent = Workflow( - name='test_function_node_no_data_returns_none', - edges=[ - (START, func_no_data), - ], - ) - events, _, _ = await run_workflow(agent) - - assert len(events) == 1 - assert events[0].output is None - assert events[0].actions.route == 'some_route' - - -@pytest.mark.asyncio -async def test_function_node_yield_content( - request: pytest.FixtureRequest, -): - """Tests that yielding types.Content sets output=None and content=Content.""" - - def func_yield_content() -> Generator[Any, None, None]: - yield types.Content(parts=[types.Part(text='some content')]) - - agent = Workflow( - name='test_function_node_yield_content', - edges=[ - (START, func_yield_content), - ], - ) - events, _, _ = await run_workflow(agent) - - assert len(events) == 1 - assert events[0].output is None - assert events[0].content is not None - assert events[0].content.parts[0].text == 'some content' - - -@pytest.mark.asyncio -async def test_function_node_yield_event_with_content( - request: pytest.FixtureRequest, -): - """Tests that yielding Event(content=...) retains output=None and content=... .""" - - def func_yield_event_with_content() -> Generator[Any, None, None]: - yield Event(content=types.Content(parts=[types.Part(text='some content')])) - - agent = Workflow( - name='test_function_node_yield_event_with_content', - edges=[ - (START, func_yield_event_with_content), - ], - ) - events, _, _ = await run_workflow(agent) - - assert len(events) == 1 - assert events[0].output is None - assert events[0].content is not None - assert events[0].content.parts[0].text == 'some content' - - -@pytest.mark.asyncio -async def test_content_to_str_auto_conversion( - request: pytest.FixtureRequest, -): - """Tests that Content is auto-converted to str when function expects str.""" - received_inputs = [] - - def record_input(node_input: str) -> str: - received_inputs.append(node_input) - return f'Hello, {node_input}!' - - agent = Workflow( - name='test_content_to_str', - edges=[ - (START, record_input), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - user_event = testing_utils.get_user_content('start workflow') - await runner.run_async(user_event) - - assert len(received_inputs) == 1 - assert isinstance(received_inputs[0], str) - assert received_inputs[0] == 'start workflow' - - -@pytest.mark.asyncio -async def test_content_to_str_multi_part( - request: pytest.FixtureRequest, -): - """Tests Content with multiple text parts is concatenated.""" - received_inputs = [] - - def record_input(node_input: str) -> str: - received_inputs.append(node_input) - return node_input - - agent = Workflow( - name='test_content_to_str_multi_part', - edges=[ - (START, record_input), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - user_event = testing_utils.get_user_content( - types.Content( - parts=[ - types.Part(text='Hello '), - types.Part(text='World'), - ], - role='user', - ) - ) - await runner.run_async(user_event) - - assert len(received_inputs) == 1 - assert received_inputs[0] == 'Hello World' - - -@pytest.mark.asyncio -async def test_content_to_str_warns_on_non_text( - request: pytest.FixtureRequest, - caplog, -): - """Tests that non-text parts produce a warning during conversion.""" - import logging - - received_inputs = [] - - def record_input(node_input: str) -> str: - received_inputs.append(node_input) - return node_input - - agent = Workflow( - name='test_content_to_str_warns', - edges=[ - (START, record_input), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - user_event = testing_utils.get_user_content( - types.Content( - parts=[ - types.Part(text='Hello'), - types.Part( - inline_data=types.Blob(data=b'img', mime_type='image/png') - ), - ], - role='user', - ) - ) - with caplog.at_level(logging.WARNING): - await runner.run_async(user_event) - - assert len(received_inputs) == 1 - assert received_inputs[0] == 'Hello' - assert 'non-text parts' in caplog.text - - -def _produce_list(): - return [1, 2, 3] - - -def _produce_dict(): - return {'key': 'value'} - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - 'produce_value, expected', - [ - (_produce_list, [1, 2, 3]), - (_produce_dict, {'key': 'value'}), - ], - ids=['list', 'dict'], -) -async def test_union_type_accepts_matching_member( - request: pytest.FixtureRequest, - produce_value, - expected, -): - """Tests that Union type annotation accepts values matching any member.""" - received_inputs = [] - - def record_input(node_input: Union[list, dict]) -> str: - received_inputs.append(node_input) - return 'ok' - - agent = Workflow( - name='test_union_accept', - edges=[ - (START, produce_value), - (produce_value, record_input), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - await runner.run_async(testing_utils.get_user_content('go')) - - assert len(received_inputs) == 1 - assert received_inputs[0] == expected - - -@pytest.mark.asyncio -async def test_optional_str_with_content_auto_conversion( - request: pytest.FixtureRequest, -): - """Tests that Optional[str] auto-converts Content from START node.""" - received_inputs = [] - - def record_input(node_input: Optional[str]) -> str: - received_inputs.append(node_input) - return 'ok' - - agent = Workflow( - name='test_optional_content', - edges=[ - (START, record_input), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - await runner.run_async(testing_utils.get_user_content('hello')) - - assert len(received_inputs) == 1 - assert received_inputs[0] == 'hello' - - -@pytest.mark.asyncio -async def test_union_type_rejects_non_matching( - request: pytest.FixtureRequest, -): - """Tests that Union type annotation rejects values not matching any member.""" - - def bad_input(node_input: Union[str, int]) -> str: - return 'should not reach' - - def produce_list() -> list: - return [1, 2, 3] - - agent = Workflow( - name='test_union_reject', - edges=[ - (START, produce_list), - (produce_list, bad_input), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(ValueError): - await runner.run_async(testing_utils.get_user_content('go')) - - -@pytest.mark.asyncio -async def test_function_node_ctx_state_delta_sync( - request: pytest.FixtureRequest, -): - """Tests that state set via ctx.state in a sync function is persisted.""" - - def set_state_via_ctx(ctx: Context) -> str: - ctx.state['user_request'] = 'build a tracker app' - return 'done' - - def read_state(user_request: str) -> str: - return f'request={user_request}' - - agent = Workflow( - name='test_ctx_state_delta_sync', - edges=[ - (START, set_state_via_ctx), - (set_state_via_ctx, read_state), - ], - ) - events, _, _ = await run_workflow(agent) - simplified = simplify_events_with_node(events, include_state_delta=True) - assert simplified == [ - ( - 'test_ctx_state_delta_sync@1/set_state_via_ctx@1', - { - 'output': 'done', - 'state_delta': {'user_request': 'build a tracker app'}, - }, - ), - ( - 'test_ctx_state_delta_sync@1/read_state@1', - { - 'output': 'request=build a tracker app', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_function_node_ctx_state_delta_async( - request: pytest.FixtureRequest, -): - """Tests that state set via ctx.state in an async function is persisted.""" - - async def set_state_via_ctx(ctx: Context) -> str: - ctx.state['counter'] = 42 - ctx.state['name'] = 'test' - return 'set' - - def read_state(counter: int, name: str) -> str: - return f'counter={counter}, name={name}' - - agent = Workflow( - name='test_ctx_state_delta_async', - edges=[ - (START, set_state_via_ctx), - (set_state_via_ctx, read_state), - ], - ) - events, _, _ = await run_workflow(agent) - simplified = simplify_events_with_node(events, include_state_delta=True) - assert simplified == [ - ( - 'test_ctx_state_delta_async@1/set_state_via_ctx@1', - { - 'output': 'set', - 'state_delta': {'counter': 42, 'name': 'test'}, - }, - ), - ( - 'test_ctx_state_delta_async@1/read_state@1', - { - 'output': 'counter=42, name=test', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_function_node_ctx_state_delta_none_return( - request: pytest.FixtureRequest, -): - """Tests that state is persisted even when function returns None.""" - - def set_state_return_none(ctx: Context) -> None: - ctx.state['my_key'] = 'my_value' - - def read_state(my_key: str) -> str: - return f'my_key={my_key}' - - agent = Workflow( - name='test_ctx_state_delta_none_return', - edges=[ - (START, set_state_return_none), - (set_state_return_none, read_state), - ], - ) - events, _, _ = await run_workflow(agent) - simplified = simplify_events_with_node(events, include_state_delta=True) - assert simplified == [ - ( - 'test_ctx_state_delta_none_return@1/set_state_return_none@1', - { - 'state_delta': {'my_key': 'my_value'}, - 'output': None, - }, - ), - ( - 'test_ctx_state_delta_none_return@1/read_state@1', - { - 'output': 'my_key=my_value', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_function_node_ctx_state_delta_with_event_return( - request: pytest.FixtureRequest, -): - """Tests that ctx.state changes merge into a returned Event's state_delta.""" - - def set_state_return_event(ctx: Context) -> Event: - ctx.state['from_ctx'] = 'ctx_value' - return Event( - output='result', - state={'from_event': 'event_value'}, - ) - - def read_state(from_ctx: str, from_event: str) -> str: - return f'from_ctx={from_ctx}, from_event={from_event}' - - agent = Workflow( - name='test_ctx_state_delta_event_return', - edges=[ - (START, set_state_return_event), - (set_state_return_event, read_state), - ], - ) - events, _, _ = await run_workflow(agent) - simplified = simplify_events_with_node(events, include_state_delta=True) - assert simplified == [ - ( - 'test_ctx_state_delta_event_return@1/set_state_return_event@1', - { - 'output': 'result', - 'state_delta': { - 'from_event': 'event_value', - 'from_ctx': 'ctx_value', - }, - }, - ), - ( - 'test_ctx_state_delta_event_return@1/read_state@1', - { - 'output': 'from_ctx=ctx_value, from_event=event_value', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_function_node_ctx_state_delta_generator( - request: pytest.FixtureRequest, -): - """Tests that ctx.state changes are captured in generator yields.""" - - def gen_with_state(ctx: Context) -> Generator[Any, None, None]: - ctx.state['key1'] = 'value1' - yield Event(state={'key1': 'value1'}) - ctx.state['key2'] = 'value2' - yield 'done' - - def read_state(key1: str, key2: str) -> str: - return f'key1={key1}, key2={key2}' - - agent = Workflow( - name='test_ctx_state_delta_generator', - edges=[ - (START, gen_with_state), - (gen_with_state, read_state), - ], - ) - events, _, _ = await run_workflow(agent) - simplified = simplify_events_with_node(events, include_state_delta=True) - - # First yield is a state-only Event, second is the data output with - # accumulated state from both ctx.state assignments. - assert simplified == [ - ( - 'test_ctx_state_delta_generator@1/gen_with_state@1', - { - 'output': None, - 'state_delta': {'key1': 'value1'}, - }, - ), - ( - 'test_ctx_state_delta_generator@1/gen_with_state@1', - { - 'output': 'done', - 'state_delta': {'key2': 'value2'}, - }, - ), - ( - 'test_ctx_state_delta_generator@1/read_state@1', - { - 'output': 'key1=value1, key2=value2', - }, - ), - ] - - -# ── FunctionNode output_schema ────────────────────────────────────── - - -class _OutputModel(BaseModel): - name: str - value: int - - -class _OtherModel(BaseModel): - name: str - value: int - extra: str = 'default' - - -@pytest.mark.asyncio -async def test_output_schema_inferred_validates_dict( - request: pytest.FixtureRequest, -): - """Inferred output_schema validates dict return from BaseModel function.""" - - def produce() -> _OutputModel: - return {'name': 'test', 'value': 42} - - node = FunctionNode(func=produce) - assert node.output_schema is _OutputModel - - agent = Workflow(name='wf', edges=[(START, node)]) - events, _, _ = await run_workflow(agent) - - data_events = [ - e - for e in events - if isinstance(e, Event) - and e.output is not None - and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( - _NodePathBuilder.from_string('wf@1') - ) - ] - assert len(data_events) == 1 - assert data_events[0].output == {'name': 'test', 'value': 42} - - -@pytest.mark.asyncio -async def test_output_schema_inferred_rejects_invalid( - request: pytest.FixtureRequest, -): - """Inferred output_schema rejects invalid dict.""" - - def produce() -> _OutputModel: - return {'name': 'test'} # missing 'value' - - node = FunctionNode(func=produce) - agent = Workflow(name='wf', edges=[(START, node)]) - with pytest.raises(ValueError): - await run_workflow(agent) - - -@pytest.mark.asyncio -async def test_output_schema_inferred_rejects_wrong_type( - request: pytest.FixtureRequest, -): - """Inferred output_schema rejects non-dict, non-BaseModel return.""" - - def produce() -> _OutputModel: - return 'not a dict' - - node = FunctionNode(func=produce) - agent = Workflow(name='wf', edges=[(START, node)]) - with pytest.raises(ValueError): - await run_workflow(agent) - - -@pytest.mark.asyncio -async def test_output_schema_generator_rejects_invalid_item( - request: pytest.FixtureRequest, -): - """A generator that yields an invalid item mid-stream raises.""" - - def produce_items() -> Generator[_OutputModel, None, None]: - yield {'name': 'a', 'value': 1} - yield {'name': 'bad'} # missing 'value' - - node = FunctionNode(func=produce_items) - agent = Workflow(name='wf', edges=[(START, node)]) - with pytest.raises(ValueError): - await run_workflow(agent) - - -@pytest.mark.asyncio -async def test_output_schema_inferred_coerces_defaults( - request: pytest.FixtureRequest, -): - """Inferred output_schema fills in default fields.""" - - def produce() -> _OtherModel: - return {'name': 'test', 'value': 5} - - node = FunctionNode(func=produce) - assert node.output_schema is _OtherModel - - agent = Workflow(name='wf', edges=[(START, node)]) - events, _, _ = await run_workflow(agent) - - data_events = [ - e - for e in events - if isinstance(e, Event) - and e.output is not None - and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( - _NodePathBuilder.from_string('wf@1') - ) - ] - assert len(data_events) == 1 - assert data_events[0].output == { - 'name': 'test', - 'value': 5, - 'extra': 'default', - } - - -@pytest.mark.asyncio -async def test_output_schema_inferred_from_return_hint( - request: pytest.FixtureRequest, -): - """output_schema is auto-inferred from -> BaseModel return hint.""" - - def produce() -> _OutputModel: - return _OutputModel(name='inferred', value=1) - - node = FunctionNode(func=produce) - assert node.output_schema is _OutputModel - - agent = Workflow(name='wf', edges=[(START, node)]) - events, _, _ = await run_workflow(agent) - - data_events = [ - e - for e in events - if isinstance(e, Event) - and e.output is not None - and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( - _NodePathBuilder.from_string('wf@1') - ) - ] - assert len(data_events) == 1 - assert data_events[0].output == {'name': 'inferred', 'value': 1} - - -def test_output_schema_no_inference_for_non_basemodel(): - """Non-BaseModel return hints (str, dict, etc.) don't trigger inference.""" - - def produce() -> dict: - return {'any': 'thing'} - - node = FunctionNode(func=produce) - assert node.output_schema is None - - -@pytest.mark.asyncio -async def test_output_schema_inferred_type_coercion( - request: pytest.FixtureRequest, -): - """Pydantic coerces compatible types (str '123' -> int 123).""" - - def produce() -> _OutputModel: - return {'name': 'coerce', 'value': '42'} - - node = FunctionNode(func=produce) - agent = Workflow(name='wf', edges=[(START, node)]) - events, _, _ = await run_workflow(agent) - - data_events = [ - e - for e in events - if isinstance(e, Event) - and e.output is not None - and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( - _NodePathBuilder.from_string('wf@1') - ) - ] - assert len(data_events) == 1 - assert data_events[0].output == {'name': 'coerce', 'value': 42} - - -@pytest.mark.asyncio -async def test_output_schema_none_return(request: pytest.FixtureRequest): - """Returning None with inferred output_schema skips validation.""" - - def produce_none() -> _OutputModel: - return None - - node = FunctionNode(func=produce_none) - assert node.output_schema is _OutputModel - - def downstream(node_input: Any) -> str: - return f'got: {node_input}' - - agent = Workflow(name='wf', edges=[(START, node), (node, downstream)]) - events, _, _ = await run_workflow(agent) - - data_events = [ - e - for e in events - if isinstance(e, Event) - and e.output is not None - and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( - _NodePathBuilder.from_string('wf@1') - ) - ] - assert len(data_events) == 1 - assert data_events[0].output == 'got: None' - - -@pytest.mark.asyncio -async def test_output_schema_validates_returned_event_data( - request: pytest.FixtureRequest, -): - """When a function returns an Event with data, output_schema validates it.""" - - def produce() -> _OutputModel: - return Event(output={'name': 'evt', 'value': 7}) - - node = FunctionNode(func=produce) - assert node.output_schema is _OutputModel - - agent = Workflow(name='wf', edges=[(START, node)]) - events, _, _ = await run_workflow(agent) - - data_events = [ - e - for e in events - if isinstance(e, Event) - and e.output is not None - and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( - _NodePathBuilder.from_string('wf@1') - ) - ] - assert len(data_events) == 1 - assert data_events[0].output == {'name': 'evt', 'value': 7} - - -@pytest.mark.asyncio -async def test_output_schema_rejects_invalid_returned_event_data( - request: pytest.FixtureRequest, -): - """When a function returns an Event with invalid data, validation raises.""" - - def produce() -> _OutputModel: - return Event(output={'wrong_field': 'oops'}) - - node = FunctionNode(func=produce) - agent = Workflow(name='wf', edges=[(START, node)]) - with pytest.raises(ValueError): - await run_workflow(agent) - - -# ── FunctionNode input_schema ────────────────────────────────────── - - -@pytest.mark.asyncio -async def test_input_schema_validates_dict(request: pytest.FixtureRequest): - """Dict input is validated and coerced through inferred input_schema.""" - received = [] - - def process(node_input: _OutputModel) -> str: - received.append(node_input) - return 'ok' - - def produce() -> dict: - return {'name': 'test', 'value': 42} - - node = FunctionNode(func=process) - assert node.input_schema is _OutputModel - - agent = Workflow(name='wf', edges=[(START, produce), (produce, node)]) - await run_workflow(agent) - - # input_schema validates before FunctionNode converts dict -> BaseModel - assert received == [_OutputModel(name='test', value=42)] - - -@pytest.mark.asyncio -async def test_input_schema_rejects_invalid_dict( - request: pytest.FixtureRequest, -): - """Dict missing required fields raises validation error.""" - - def process(node_input: _OutputModel) -> str: - return 'should not reach' - - def produce() -> dict: - return {'name': 'test'} # missing 'value' - - node = FunctionNode(func=process) - agent = Workflow(name='wf', edges=[(START, produce), (produce, node)]) - with pytest.raises(ValueError): - await run_workflow(agent) - - -@pytest.mark.asyncio -async def test_input_schema_coerces_types(request: pytest.FixtureRequest): - """Pydantic coerces compatible types in input (str '5' -> int 5).""" - received = [] - - def process(node_input: _OutputModel) -> str: - received.append(node_input) - return 'ok' - - def produce() -> dict: - return {'name': 'test', 'value': '5'} - - node = FunctionNode(func=process) - agent = Workflow(name='wf', edges=[(START, produce), (produce, node)]) - await run_workflow(agent) - - assert received == [_OutputModel(name='test', value=5)] - - -@pytest.mark.asyncio -async def test_input_schema_fills_defaults(request: pytest.FixtureRequest): - """Inferred input_schema fills default fields.""" - received = [] - - def process(node_input: _OtherModel) -> str: - received.append(node_input) - return 'ok' - - def produce() -> dict: - return {'name': 'test', 'value': 1} - - node = FunctionNode(func=process) - assert node.input_schema is _OtherModel - - agent = Workflow(name='wf', edges=[(START, produce), (produce, node)]) - await run_workflow(agent) - - assert received == [_OtherModel(name='test', value=1, extra='default')] - - -def test_input_schema_no_inference_for_non_basemodel(): - """Non-BaseModel node_input hints don't trigger inference.""" - - def process(node_input: dict) -> str: - return 'ok' - - node = FunctionNode(func=process) - assert node.input_schema is None - - -@pytest.mark.asyncio -async def test_input_schema_none_passthrough(request: pytest.FixtureRequest): - """None input with input_schema skips validation.""" - - def produce_none() -> None: - return None - - def process(node_input: _OutputModel | None = None) -> str: - return f'got: {node_input}' - - node = FunctionNode(func=process) - agent = Workflow( - name='wf', edges=[(START, produce_none), (produce_none, node)] - ) - events, _, _ = await run_workflow(agent) - - data_events = [ - e - for e in events - if isinstance(e, Event) - and e.output is not None - and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( - _NodePathBuilder.from_string('wf@1') - ) - ] - assert any(e.output == 'got: None' for e in data_events) - - -# --------------------------------------------------------------------------- -# auth_config tests -# --------------------------------------------------------------------------- - - -class TestAuthConfig: - """Tests for FunctionNode auth_config behavior.""" - - def test_raises_without_rerun_on_resume(self): - """auth_config raises ValueError when rerun_on_resume is not True.""" - from fastapi.openapi.models import APIKey - from fastapi.openapi.models import APIKeyIn - from google.adk.auth.auth_credential import AuthCredential - from google.adk.auth.auth_credential import AuthCredentialTypes - from google.adk.auth.auth_tool import AuthConfig - - auth_config = AuthConfig( - auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), - raw_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.API_KEY, - api_key='placeholder', - ), - credential_key='test_key', - ) - with pytest.raises(ValueError, match='rerun_on_resume=True'): - FunctionNode(func=lambda: None, name='n', auth_config=auth_config) - - def test_no_auth_config_default(self): - """auth_config defaults to None.""" - node = FunctionNode(func=lambda: None, name='n') - assert node.auth_config is None - - def test_rerun_on_resume_explicit_true_with_auth(self): - """Explicit rerun_on_resume=True with auth_config is fine.""" - from fastapi.openapi.models import APIKey - from fastapi.openapi.models import APIKeyIn - from google.adk.auth.auth_credential import AuthCredential - from google.adk.auth.auth_credential import AuthCredentialTypes - from google.adk.auth.auth_tool import AuthConfig - - auth_config = AuthConfig( - auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), - raw_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.API_KEY, - api_key='placeholder', - ), - credential_key='test_key', - ) - node = FunctionNode( - func=lambda: None, - name='n', - auth_config=auth_config, - rerun_on_resume=True, - ) - assert node.rerun_on_resume is True - - -# --------------------------------------------------------------------------- -# parameter_binding='node_input' tests -# --------------------------------------------------------------------------- - - -class TestParameterBindingNodeInput: - """Tests for FunctionNode with parameter_binding='node_input'.""" - - def test_schemas_inferred_from_signature(self): - """input_schema and output_schema are inferred from func signature.""" - - def add(x: int, y: int) -> int: - """Add two numbers.""" - return x + y - - node = FunctionNode(func=add, name='add', parameter_binding='node_input') - - assert node.parameter_binding == 'node_input' - assert node.input_schema is not None - assert 'properties' in node.input_schema - assert 'x' in node.input_schema['properties'] - assert 'y' in node.input_schema['properties'] - assert node.output_schema == {'type': 'integer'} - - def test_ctx_param_excluded_from_schema(self): - """Context parameter is excluded from input_schema.""" - - def greet(name: str, ctx: Context) -> str: - return f'Hello, {name}!' - - node = FunctionNode( - func=greet, name='greet', parameter_binding='node_input' - ) - - assert node.input_schema is not None - assert 'name' in node.input_schema['properties'] - assert 'ctx' not in node.input_schema.get('properties', {}) - - @pytest.mark.asyncio - @pytest.mark.parametrize( - 'producer_output, add_func, expected_output', - [ - pytest.param( - {'x': 3, 'y': 4}, - staticmethod(lambda x, y: x + y), - 7, - id='all_params_provided', - ), - pytest.param( - {'x': 5}, - None, # uses default func defined below - 15, - id='missing_param_uses_default', - ), - ], - ) - async def test_bind_from_node_input( - self, - request: pytest.FixtureRequest, - producer_output: dict, - add_func, - expected_output: int, - ): - """Parameters are bound from node_input dict.""" - - if add_func is None: - - def add_func(x: int, y: int = 10): - return x + y - - def produce(): - return producer_output - - node = FunctionNode( - func=add_func, name='add', parameter_binding='node_input' - ) - - agent = Workflow( - name='test_bind_from_node_input', - edges=[ - (START, produce), - (produce, node), - ], - ) - events, _, _ = await run_workflow(agent) - assert simplify_events_with_node(events) == [ - ( - 'test_bind_from_node_input@1/produce@1', - {'output': producer_output}, - ), - ( - 'test_bind_from_node_input@1/add@1', - {'output': expected_output}, - ), - ] - - @pytest.mark.asyncio - async def test_bind_from_node_input_missing_required( - self, request: pytest.FixtureRequest - ): - """Missing required param in node_input mode raises ValueError.""" - - def produce(): - return {'x': 5} - - def add(x: int, y: int): - return x + y - - node = FunctionNode(func=add, name='add', parameter_binding='node_input') - - agent = Workflow( - name='test_bind_node_input_missing', - edges=[ - (START, produce), - (produce, node), - ], - ) - with pytest.raises(ValueError, match='Missing value for parameter "y"'): - await run_workflow(agent) - - @pytest.mark.asyncio - async def test_bind_from_node_input_with_ctx( - self, request: pytest.FixtureRequest - ): - """Context parameter is injected alongside node_input params.""" - received_ctx = [] - - def produce(): - return {'name': 'Alice'} - - def greet(name: str, ctx: Context): - received_ctx.append(ctx) - return f'Hello, {name}!' - - node = FunctionNode( - func=greet, name='greet', parameter_binding='node_input' - ) - - agent = Workflow( - name='test_bind_node_input_ctx', - edges=[ - (START, produce), - (produce, node), - ], - ) - events, _, _ = await run_workflow(agent) - - assert len(received_ctx) == 1 - assert isinstance(received_ctx[0], Context) - assert simplify_events_with_node(events) == [ - ( - 'test_bind_node_input_ctx@1/produce@1', - {'output': {'name': 'Alice'}}, - ), - ( - 'test_bind_node_input_ctx@1/greet@1', - {'output': 'Hello, Alice!'}, - ), - ] - - def test_model_copy_preserves_parameter_binding(self): - """model_copy preserves parameter_binding and input_schema.""" - - def add(x: int, y: int) -> int: - return x + y - - node = FunctionNode(func=add, name='add', parameter_binding='node_input') - copied = node.model_copy(update={'name': 'add_copy'}) - - assert copied.parameter_binding == 'node_input' - assert copied.input_schema is not None - assert 'x' in copied.input_schema['properties'] - - def test_type_hints_cache(self): - """Verifies that type hints are cached and robustly unwrapped.""" - from google.adk.workflow._function_node import _get_type_hints_cached - from google.adk.workflow._function_node import _get_type_hints_for_unwrapped - - def my_func(x: int, y: str) -> bool: - return True - - # Clear cache first to have predictable results - _get_type_hints_for_unwrapped.cache_clear() - - hints1 = _get_type_hints_cached(my_func) - assert hints1 == {'x': int, 'y': str, 'return': bool} - - # Call again, should hit cache - hints2 = _get_type_hints_cached(my_func) - assert hints2 == {'x': int, 'y': str, 'return': bool} - assert _get_type_hints_for_unwrapped.cache_info().hits == 1 - - # Test partial - import functools - - partial_func = functools.partial(my_func, x=1) - hints3 = _get_type_hints_cached(partial_func) - # Partial should unwrap to my_func and hit cache! - assert hints3 == {'x': int, 'y': str, 'return': bool} - assert _get_type_hints_for_unwrapped.cache_info().hits == 2 - - # Test callable object - class MyCallable: - - def __call__(self, z: float) -> None: - pass - - obj = MyCallable() - hints4 = _get_type_hints_cached(obj) - assert hints4 == {'z': float, 'return': type(None)} diff --git a/tests/unittests/workflow/test_graph.py b/tests/unittests/workflow/test_graph.py deleted file mode 100644 index 2d57e5650c..0000000000 --- a/tests/unittests/workflow/test_graph.py +++ /dev/null @@ -1,793 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for Graph validation.""" - -from google.adk.workflow import Edge -from google.adk.workflow import FunctionNode -from google.adk.workflow import START -from google.adk.workflow._graph import DEFAULT_ROUTE -from google.adk.workflow._graph import Graph -from pydantic import BaseModel -import pytest - -from .workflow_testing_utils import TestingNode - - -def test_valid_graph() -> None: - """Tests that a valid graph passes validation.""" - node_a = TestingNode(name='NodeA') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - ], - ) - graph.validate_graph() # Should not raise - - -def test_missing_start_node() -> None: - """Tests that a graph missing the START node fails validation.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - graph = Graph( - edges=[Edge(from_node=node_a, to_node=node_b)], - ) - with pytest.raises( - ValueError, - match=( - r"Graph validation failed\. START node \(name: '__START__'\) not" - r' found in graph nodes\.' - ), - ): - graph.validate_graph() - - -def test_unreachable_node() -> None: - """Tests that a graph with an unreachable node fails validation.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') # Unreachable - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_b, to_node=node_a), - ], - ) - with pytest.raises( - ValueError, - match=( - r'Graph validation failed\. The following nodes are unreachable' - r" from START: \['NodeB'\]" - ), - ): - graph.validate_graph() - - -def test_disconnected_routed_subgraph_is_unreachable() -> None: - """Tests that a disconnected subgraph with routed edges fails validation. - - Even though B and C each appear as a to_node in some edge, neither is - reachable from START. The old "has incoming edge" heuristic would let - this pass; true reachability from START catches it. - """ - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_b, to_node=node_c, route='x'), - Edge(from_node=node_c, to_node=node_b, route='y'), - ], - ) - with pytest.raises( - ValueError, - match=( - r'Graph validation failed\. The following nodes are unreachable' - r" from START: \['NodeB', 'NodeC'\]" - ), - ): - graph.validate_graph() - - -@pytest.mark.parametrize( - 'routes', - [ - (None, None), - ('route1', 'route1'), - ('route1', 'route2'), - ('route1', None), - ], -) -def test_duplicate_edges_fail_validation( - routes: tuple[str | None, str | None], -) -> None: - """Tests that duplicate edges fail validation, regardless of routes.""" - node_a = TestingNode(name='NodeA') - graph = Graph( - edges=[ - Edge( - from_node=START, - to_node=node_a, - route=routes[0], - ), - Edge( - from_node=START, - to_node=node_a, - route=routes[1], - ), - ], - ) - with pytest.raises( - ValueError, - match=( - r'Graph validation failed\. Duplicate edge found: from=__START__,' - r' to=NodeA' - ), - ): - graph.validate_graph() - - -def test_start_node_with_incoming_edge() -> None: - """Tests graph with incoming edge to START node fails validation.""" - node_a = TestingNode(name='NodeA') - graph = Graph( - edges=[ - Edge(from_node=node_a, to_node=START), - Edge(from_node=START, to_node=node_a), - ], - ) - with pytest.raises( - ValueError, - match=( - r'Graph validation failed\. START node must not have incoming edges\.' - ), - ): - graph.validate_graph() - - -def test_multiple_default_routes_fail_validation() -> None: - """Tests that multiple DEFAULT_ROUTE edges from a node fail validation.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_b, route=DEFAULT_ROUTE), - Edge(from_node=node_a, to_node=node_c, route=DEFAULT_ROUTE), - ], - ) - with pytest.raises( - ValueError, - match=( - r'Graph validation failed\. Multiple DEFAULT_ROUTE edges found from' - r' node NodeA to NodeB and NodeC' - ), - ): - graph.validate_graph() - - -def test_single_default_route_passes_validation() -> None: - """Tests that a single DEFAULT_ROUTE edge from a node passes validation.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_b, route=DEFAULT_ROUTE), - Edge(from_node=node_a, to_node=node_c, route='another_route'), - ], - ) - graph.validate_graph() # Should not raise - - -def test_duplicate_node_names_fail_validation() -> None: - """Tests that duplicate nodes raise error.""" - - node_a1 = TestingNode(name='NodeA') - node_a2 = TestingNode(name='NodeA') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a1), - Edge(from_node=node_a1, to_node=node_a2), - ], - ) - with pytest.raises( - ValueError, - match=( - r"Graph validation failed\. Duplicate node names found: \['NodeA'\]\." - r' This means multiple distinct node objects have the same name\. If' - r' you intended to reuse the same node, ensure you pass the exact' - r' same object instance\. If you intended to have distinct nodes,' - r' ensure they have unique names\.' - ), - ): - graph.validate_graph() - - -def test_from_edge_items_with_node_reuse_passes_validation() -> None: - """Tests that node reuse with from_edge_items passes validation. - - The same my_node_func instance is used in the graph multiple times, and - the workflow graph should recognize it as the same instance and not throw - an error during validation. - """ - - def my_node_func() -> None: - pass - - node_b = TestingNode(name='NodeB') - graph = Graph.from_edge_items([ - (START, my_node_func), - (my_node_func, node_b), - ]) - graph.validate_graph() # Should not raise duplicate name error - - node_names = {n.name for n in graph.nodes} - assert node_names == {'__START__', 'my_node_func', 'NodeB'} - assert len(graph.nodes) == 3 - # Check that my_node_func was wrapped and deduplicated. - func_node = next(n for n in graph.nodes if n.name == 'my_node_func') - assert isinstance(func_node, FunctionNode) - - -def test_unconditional_cycle_fails_validation() -> None: - """Tests that a cycle of unconditional edges (route=None) fails.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_b), - Edge(from_node=node_b, to_node=node_a), - ], - ) - with pytest.raises( - ValueError, - match=r'Graph validation failed\. Unconditional cycle detected:', - ): - graph.validate_graph() - - -def test_unconditional_self_loop_fails_validation() -> None: - """Tests that an unconditional self-loop (A -> A) fails.""" - node_a = TestingNode(name='NodeA') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_a), - ], - ) - with pytest.raises( - ValueError, - match=r'Graph validation failed\. Unconditional cycle detected:', - ): - graph.validate_graph() - - -def test_longer_unconditional_cycle_fails_validation() -> None: - """Tests that a longer unconditional cycle (A -> B -> C -> A) fails.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_b), - Edge(from_node=node_b, to_node=node_c), - Edge(from_node=node_c, to_node=node_a), - ], - ) - with pytest.raises( - ValueError, - match=r'Graph validation failed\. Unconditional cycle detected:', - ): - graph.validate_graph() - - -def test_conditional_cycle_passes_validation() -> None: - """Tests that a cycle with a routed edge (loop pattern) passes.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_b), - Edge(from_node=node_b, to_node=node_a, route='retry'), - ], - ) - graph.validate_graph() # Should not raise — routed back-edge - - -def test_conditional_self_loop_passes_validation() -> None: - """Tests that a self-loop with a route passes validation.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_a, route='continue'), - Edge(from_node=node_a, to_node=node_b, route='done'), - ], - ) - graph.validate_graph() # Should not raise — routed self-loop - - -def test_dag_with_diamond_passes_validation() -> None: - """Tests that a DAG with a diamond shape passes validation.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=START, to_node=node_b), - Edge(from_node=node_a, to_node=node_c), - Edge(from_node=node_b, to_node=node_c), - ], - ) - graph.validate_graph() # Should not raise - - -# --- Routing map tests --- - - -def test_routing_map_basic() -> None: - """Tests that a string-keyed routing map expands to correct edges.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - graph = Graph.from_edge_items([ - (START, node_a), - (node_a, {'route_b': node_b, 'route_c': node_c}), - ]) - graph.validate_graph() - - assert len(graph.edges) == 3 # START->A, A->B(route_b), A->C(route_c) - - routed_edges = [e for e in graph.edges if e.route is not None] - assert len(routed_edges) == 2 - - routes_and_targets = {(e.route, e.to_node.name) for e in routed_edges} - assert routes_and_targets == {('route_b', 'NodeB'), ('route_c', 'NodeC')} - - for e in routed_edges: - assert e.from_node.name == 'NodeA' - - -def test_routing_map_int_keys() -> None: - """Tests that integer route keys work in routing maps.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - graph = Graph.from_edge_items([ - (START, node_a), - (node_a, {1: node_b, 2: node_c}), - ]) - graph.validate_graph() - - routed_edges = [e for e in graph.edges if e.route is not None] - assert len(routed_edges) == 2 - routes = [e.route for e in routed_edges] - assert 1 in routes - assert 2 in routes - - -def test_routing_map_bool_keys() -> None: - """Tests that boolean route keys work in routing maps.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - graph = Graph.from_edge_items([ - (START, node_a), - (node_a, {True: node_b, False: node_c}), - ]) - graph.validate_graph() - - routed_edges = [e for e in graph.edges if e.route is not None] - assert len(routed_edges) == 2 - routes = [e.route for e in routed_edges] - assert True in routes - assert False in routes - - -def test_routing_map_with_fan_in_source() -> None: - """Tests that fan-in on the source side works with routing maps.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - node_d = TestingNode(name='NodeD') - graph = Graph.from_edge_items([ - (START, node_a), - (START, node_b), - ((node_a, node_b), {'route_x': node_c, 'route_y': node_d}), - ]) - graph.validate_graph() - - # 2 from START + 4 from fan-in (A->C, A->D, B->C, B->D) - assert len(graph.edges) == 6 - - fan_in_edges = [ - e for e in graph.edges if e.from_node.name in ('NodeA', 'NodeB') - ] - assert len(fan_in_edges) == 4 - - combos = {(e.from_node.name, e.to_node.name, e.route) for e in fan_in_edges} - assert combos == { - ('NodeA', 'NodeC', 'route_x'), - ('NodeA', 'NodeD', 'route_y'), - ('NodeB', 'NodeC', 'route_x'), - ('NodeB', 'NodeD', 'route_y'), - } - - -def test_routing_map_with_callable_target() -> None: - """Tests that callable values in routing maps get wrapped via build_node.""" - node_a = TestingNode(name='NodeA') - - def my_target_func() -> None: - pass - - graph = Graph.from_edge_items([ - (START, node_a), - (node_a, {'route_x': my_target_func}), - ]) - graph.validate_graph() - - target_edge = next(e for e in graph.edges if e.route == 'route_x') - assert isinstance(target_edge.to_node, FunctionNode) - assert target_edge.to_node.name == 'my_target_func' - - -def test_routing_map_node_reuse() -> None: - """Tests that the same callable used in a map and elsewhere is deduplicated.""" - - def my_func() -> None: - pass - - node_b = TestingNode(name='NodeB') - graph = Graph.from_edge_items([ - (START, my_func), - (my_func, {'route_x': node_b}), - ]) - graph.validate_graph() - - # my_func should be wrapped once and reused. - func_nodes = [n for n in graph.nodes if n.name == 'my_func'] - assert len(func_nodes) == 1 - assert isinstance(func_nodes[0], FunctionNode) - - -def test_routing_map_empty_dict_raises() -> None: - """Tests that an empty routing map raises ValueError.""" - node_a = TestingNode(name='NodeA') - with pytest.raises( - ValueError, - match=r'Routing map must not be empty', - ): - Graph.from_edge_items([ - (START, node_a), - (node_a, {}), - ]) - - -def test_routing_map_invalid_key_raises() -> None: - """Tests that a non-RouteValue key raises ValueError.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - with pytest.raises( - ValueError, - match=r'Invalid routing map key', - ): - Graph.from_edge_items([ - (START, node_a), - (node_a, {1.5: node_b}), - ]) - - -def test_routing_map_invalid_value_raises() -> None: - """Tests that a non-NodeLike value raises ValueError.""" - node_a = TestingNode(name='NodeA') - with pytest.raises( - ValueError, - match=r'Invalid routing map value', - ): - Graph.from_edge_items([ - (START, node_a), - (node_a, {'route_x': 42}), - ]) - - -def test_routing_map_fan_out_target() -> None: - """Tests that a tuple value in a routing map creates fan-out edges.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - graph = Graph.from_edge_items([ - (START, node_a), - (node_a, {'route_x': (node_b, node_c)}), - ]) - graph.validate_graph() - - # START->A, A->B(route_x), A->C(route_x) - assert len(graph.edges) == 3 - - routed_edges = [e for e in graph.edges if e.route is not None] - assert len(routed_edges) == 2 - - # Both fan-out edges share the same route and source. - for e in routed_edges: - assert e.from_node.name == 'NodeA' - assert e.route == 'route_x' - - targets = {e.to_node.name for e in routed_edges} - assert targets == {'NodeB', 'NodeC'} - - -def test_routing_map_fan_out_invalid_element_raises() -> None: - """Tests that a non-NodeLike element inside a fan-out tuple raises.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - with pytest.raises( - ValueError, - match=r'Invalid node in fan-out tuple', - ): - Graph.from_edge_items([ - (START, node_a), - (node_a, {'route_x': (node_b, 42)}), - ]) - - -# --- Routing map as chain element tests --- - - -def test_routing_map_chain_ending_with_dict() -> None: - """Tests a chain ending with a routing map creates correct edges.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - graph = Graph.from_edge_items([ - (START, node_a, {'r1': node_b, 'r2': node_c}), - ]) - graph.validate_graph() - - # START->A (None), A->B (r1), A->C (r2) - assert len(graph.edges) == 3 - - start_edge = next(e for e in graph.edges if e.from_node.name == '__START__') - assert start_edge.to_node.name == 'NodeA' - assert start_edge.route is None - - routed_edges = [e for e in graph.edges if e.route is not None] - assert len(routed_edges) == 2 - routes_and_targets = {(e.route, e.to_node.name) for e in routed_edges} - assert routes_and_targets == {('r1', 'NodeB'), ('r2', 'NodeC')} - for e in routed_edges: - assert e.from_node.name == 'NodeA' - - -def test_routing_map_mid_chain_with_fan_in() -> None: - """Tests routing map mid-chain with fan-in to the next element.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - node_d = TestingNode(name='NodeD') - graph = Graph.from_edge_items([ - (START, node_a, {'r1': node_b, 'r2': node_c}, node_d), - ]) - graph.validate_graph() - - # START->A (None), A->B (r1), A->C (r2), B->D (None), C->D (None) - assert len(graph.edges) == 5 - - routed_edges = sorted( - [e for e in graph.edges if e.route is not None], - key=lambda e: e.to_node.name, - ) - assert len(routed_edges) == 2 - assert routed_edges[0].from_node.name == 'NodeA' - assert routed_edges[0].to_node.name == 'NodeB' - assert routed_edges[0].route == 'r1' - assert routed_edges[1].from_node.name == 'NodeA' - assert routed_edges[1].to_node.name == 'NodeC' - assert routed_edges[1].route == 'r2' - - fan_in_edges = sorted( - [e for e in graph.edges if e.to_node.name == 'NodeD'], - key=lambda e: e.from_node.name, - ) - assert len(fan_in_edges) == 2 - assert fan_in_edges[0].from_node.name == 'NodeB' - assert fan_in_edges[0].route is None - assert fan_in_edges[1].from_node.name == 'NodeC' - assert fan_in_edges[1].route is None - - -def test_routing_map_mid_chain_fan_out_values() -> None: - """Tests routing map with fan-out tuple values, followed by fan-in.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - node_d = TestingNode(name='NodeD') - graph = Graph.from_edge_items([ - (START, node_a, {'r1': (node_b, node_c)}, node_d), - ]) - graph.validate_graph() - - # START->A (None), A->B (r1), A->C (r1), B->D (None), C->D (None) - assert len(graph.edges) == 5 - - routed_edges = [e for e in graph.edges if e.route is not None] - assert len(routed_edges) == 2 - for e in routed_edges: - assert e.from_node.name == 'NodeA' - assert e.route == 'r1' - - fan_in_edges = [e for e in graph.edges if e.to_node.name == 'NodeD'] - assert len(fan_in_edges) == 2 - fan_in_sources = {e.from_node.name for e in fan_in_edges} - assert fan_in_sources == {'NodeB', 'NodeC'} - - -def test_routing_map_consecutive_dicts_raises() -> None: - """Tests that consecutive routing maps in a chain are rejected.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - node_d = TestingNode(name='NodeD') - with pytest.raises( - ValueError, match=r'Consecutive routing maps are not allowed' - ): - Graph.from_edge_items([ - (START, node_a, {'r1': node_b, 'r2': node_c}, {'r3': node_d}), - ]) - - -def test_routing_map_empty_dict_in_chain_raises() -> None: - """Tests that an empty routing map in a chain raises ValueError.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - with pytest.raises(ValueError, match=r'Routing map must not be empty'): - Graph.from_edge_items([ - (START, node_a, {}, node_b), - ]) - - -def test_routing_map_invalid_key_in_chain_raises() -> None: - """Tests that invalid routing map keys in a chain raise ValueError.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - with pytest.raises(ValueError, match=r'Invalid routing map key'): - Graph.from_edge_items([ - (START, node_a, {1.5: node_b}), - ]) - - -def test_routing_map_2_tuple_backward_compat() -> None: - """Ensures existing 2-tuple routing map syntax still works.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - graph = Graph.from_edge_items([ - (START, node_a), - (node_a, {'r1': node_b, 'r2': node_c}), - ]) - graph.validate_graph() - assert len(graph.edges) == 3 - - -class ModelA(BaseModel): - x: int - - -class ModelB(BaseModel): - x: int - - -def test_schema_match_passes() -> None: - """Tests that edges with matching schemas pass validation.""" - node_a = TestingNode(name='NodeA', output_schema=ModelA) - node_b = TestingNode(name='NodeB', input_schema=ModelA) - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_b), - ], - ) - graph.validate_graph() # Should not raise - - -def test_schema_mismatch_raises() -> None: - """Tests that edges with mismatching schemas fail validation.""" - node_a = TestingNode(name='NodeA', output_schema=ModelA) - node_b = TestingNode(name='NodeB', input_schema=ModelB) - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_b), - ], - ) - with pytest.raises( - ValueError, - match=r'Graph validation failed\. Schema mismatch on edge', - ): - graph.validate_graph() - - -def test_schema_missing_passes() -> None: - """Tests that edges with missing schemas pass validation.""" - node_a = TestingNode(name='NodeA', output_schema=ModelA) - node_b = TestingNode(name='NodeB') # No input schema - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_b), - ], - ) - graph.validate_graph() # Should not raise - - -def test_get_next_pending_nodes() -> None: - """Tests that get_next_pending_nodes returns correct nodes based on routes.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - node_c = TestingNode(name='NodeC') - node_d = TestingNode(name='NodeD') - - graph = Graph( - edges=[ - Edge(from_node=node_a, to_node=node_b), # Unconditional - Edge(from_node=node_a, to_node=node_c, route='route1'), # Conditional - Edge( - from_node=node_a, to_node=node_d, route=DEFAULT_ROUTE - ), # Default - ], - ) - - # Test unconditional edge triggered - next_nodes = graph.get_next_pending_nodes('NodeA', routes_to_match=None) - assert set(next_nodes) == {'NodeB', 'NodeD'} - - # Test specific route matched - next_nodes = graph.get_next_pending_nodes('NodeA', routes_to_match='route1') - assert set(next_nodes) == {'NodeB', 'NodeC'} - - # Test unmatched route falls back to default - next_nodes = graph.get_next_pending_nodes( - 'NodeA', routes_to_match='unknown_route' - ) - assert set(next_nodes) == {'NodeB', 'NodeD'} - - # Test list of routes to match - next_nodes = graph.get_next_pending_nodes( - 'NodeA', routes_to_match=['route1', 'unknown_route'] - ) - assert set(next_nodes) == {'NodeB', 'NodeC'} - - -def test_chat_agent_wiring_validation_only_runs_on_llm_agent() -> None: - """Tests that _validate_chat_agent_wiring checks non-LlmAgent nodes safely.""" - node_a = TestingNode(name='NodeA') - node_b = TestingNode(name='NodeB') - # Set mode='chat' on a non-LlmAgent node - object.__setattr__(node_b, 'mode', 'chat') - - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_b), - ], - ) - graph.validate_graph() # Should not raise because node_b is a TestingNode, not LlmAgent diff --git a/tests/unittests/workflow/test_join_node.py b/tests/unittests/workflow/test_join_node.py deleted file mode 100644 index d46fe3f42c..0000000000 --- a/tests/unittests/workflow/test_join_node.py +++ /dev/null @@ -1,277 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Testings for the JoinNode.""" - -from google.adk import workflow -from google.adk.apps import app -from google.adk.workflow import _base_node as base_node -from google.adk.workflow import _graph as workflow_graph -from google.adk.workflow import _join_node as join_node -from google.adk.workflow import START -from google.adk.workflow._workflow import Workflow -from pydantic import BaseModel -import pytest - -from . import workflow_testing_utils -from .. import testing_utils - - -def _build_join_node_workflow( - request: pytest.FixtureRequest, -) -> tuple[ - workflow_testing_utils.InputCapturingNode, testing_utils.InMemoryRunner -]: - """Builds a workflow with a JoinNode.""" - node_a = workflow_testing_utils.TestingNode( - name='NodeA', output={'a': 1, 'b': 1} - ) - node_b = workflow_testing_utils.TestingNode(name='NodeB', output={'b': 2}) - node_join = join_node.JoinNode(name='NodeJoin') - node_capture = workflow_testing_utils.InputCapturingNode(name='NodeCapture') - agent = workflow.Workflow( - name='test_join_node', - edges=[ - workflow_graph.Edge(from_node=base_node.START, to_node=node_a), - workflow_graph.Edge(from_node=base_node.START, to_node=node_b), - workflow_graph.Edge(from_node=node_a, to_node=node_join), - workflow_graph.Edge(from_node=node_b, to_node=node_join), - workflow_graph.Edge(from_node=node_join, to_node=node_capture), - ], - ) - app_instance = app.App( - name=request.function.__name__, - root_agent=agent, - ) - return node_capture, testing_utils.InMemoryRunner(app=app_instance) - - -def test_get_common_branch_prefix(): - """Tests _get_common_branch_prefix.""" - assert join_node._get_common_branch_prefix(['A@1', 'A@2']) == '' - assert join_node._get_common_branch_prefix(['A@1.B@1', 'A@1.B@2']) == 'A@1' - assert join_node._get_common_branch_prefix(['A@1', 'A@1']) == 'A@1' - assert join_node._get_common_branch_prefix(['A@1', '']) == '' - assert join_node._get_common_branch_prefix(['', '']) == '' - assert join_node._get_common_branch_prefix([]) == '' - - -@pytest.mark.asyncio -async def test_join_node_waits_for_all_inputs(request: pytest.FixtureRequest): - """Tests JoinNode with fan-in.""" - node_capture, runner = _build_join_node_workflow(request) - events = await runner.run_async(testing_utils.get_user_content('start')) - - assert node_capture.received_inputs == [{ - 'NodeA': {'a': 1, 'b': 1}, - 'NodeB': {'b': 2}, - }] - - -@pytest.mark.asyncio -async def test_join_node_with_none_state(request: pytest.FixtureRequest): - """Tests JoinNode with fan-in when node state is None.""" - node_capture, runner = _build_join_node_workflow(request) - # Run once to set state to None - await runner.run_async(testing_utils.get_user_content('start')) - # Run again to trigger join_node with state=None - await runner.run_async(testing_utils.get_user_content('start')) - - assert node_capture.received_inputs == [ - {'NodeA': {'a': 1, 'b': 1}, 'NodeB': {'b': 2}}, - {'NodeA': {'a': 1, 'b': 1}, 'NodeB': {'b': 2}}, - ] - - -@pytest.mark.asyncio -async def test_join_node_with_none_inputs(request: pytest.FixtureRequest): - """Tests JoinNode with fan-in when incoming edges have None output.""" - node_a = workflow_testing_utils.TestingNode( - name='NodeA', output=None, route='NodeJoin' - ) - node_b = workflow_testing_utils.TestingNode( - name='NodeB', output=None, route='NodeJoin' - ) - node_join = join_node.JoinNode(name='NodeJoin') - node_capture = workflow_testing_utils.InputCapturingNode(name='NodeCapture') - agent = workflow.Workflow( - name='test_join_node_none_inputs', - edges=[ - workflow_graph.Edge(from_node=base_node.START, to_node=node_a), - workflow_graph.Edge(from_node=base_node.START, to_node=node_b), - workflow_graph.Edge(from_node=node_a, to_node=node_join), - workflow_graph.Edge(from_node=node_b, to_node=node_join), - workflow_graph.Edge(from_node=node_join, to_node=node_capture), - ], - ) - app_instance = app.App( - name=request.function.__name__, - root_agent=agent, - ) - runner = testing_utils.InMemoryRunner(app=app_instance) - - await runner.run_async(testing_utils.get_user_content('start')) - - assert node_capture.received_inputs == [ - {'NodeA': None, 'NodeB': None}, - ] - - -# ── JoinNode input_schema ────────────────────────────────────── -# input_schema on JoinNode validates each trigger input individually -# (each predecessor's output), not the joined dict. - - -class _TriggerInput(BaseModel): - key: str - value: int - - -@pytest.mark.asyncio -async def test_join_node_input_schema_validates_per_trigger( - request: pytest.FixtureRequest, -): - """JoinNode input_schema validates each trigger input individually.""" - - def node_a() -> dict: - return {'key': 'a', 'value': 1} - - def node_b() -> dict: - return {'key': 'b', 'value': 2} - - join = join_node.JoinNode(name='join', input_schema=_TriggerInput) - capture = workflow_testing_utils.InputCapturingNode(name='capture') - - agent = Workflow( - name='wf', - edges=[ - (START, node_a), - (START, node_b), - (node_a, join), - (node_b, join), - (join, capture), - ], - ) - app_instance = app.App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app_instance) - await runner.run_async(testing_utils.get_user_content('start')) - - assert capture.received_inputs == [{ - 'node_a': {'key': 'a', 'value': 1}, - 'node_b': {'key': 'b', 'value': 2}, - }] - - -@pytest.mark.asyncio -async def test_join_node_input_schema_rejects_invalid_trigger( - request: pytest.FixtureRequest, -): - """JoinNode input_schema rejects invalid trigger input early.""" - - def node_a() -> dict: - return {'key': 'a', 'value': 1} - - def node_b() -> dict: - return {'wrong': 'shape'} # missing required fields - - join = join_node.JoinNode(name='join', input_schema=_TriggerInput) - capture = workflow_testing_utils.InputCapturingNode(name='capture') - - agent = Workflow( - name='wf', - edges=[ - (START, node_a), - (START, node_b), - (node_a, join), - (node_b, join), - (join, capture), - ], - ) - app_instance = app.App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app_instance) - with pytest.raises(Exception): - await runner.run_async(testing_utils.get_user_content('start')) - - -@pytest.mark.asyncio -async def test_join_node_input_schema_none_trigger_passes( - request: pytest.FixtureRequest, -): - """JoinNode input_schema skips validation for None trigger input.""" - # Given - node_a_fn = workflow_testing_utils.TestingNode( - name='NodeA', output=None, route='join' - ) - node_b_fn = workflow_testing_utils.TestingNode( - name='NodeB', output={'key': 'b', 'value': 2} - ) - join = join_node.JoinNode(name='join', input_schema=_TriggerInput) - capture = workflow_testing_utils.InputCapturingNode(name='capture') - - agent = Workflow( - name='wf', - edges=[ - (START, node_a_fn), - (START, node_b_fn), - (node_a_fn, join), - (node_b_fn, join), - (join, capture), - ], - ) - app_instance = app.App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app_instance) - - # When - await runner.run_async(testing_utils.get_user_content('start')) - - # Then - assert capture.received_inputs == [{ - 'NodeA': None, - 'NodeB': {'key': 'b', 'value': 2}, - }] - - -@pytest.mark.asyncio -async def test_join_node_computes_common_branch_prefix( - request: pytest.FixtureRequest, -): - """Tests JoinNode computes common branch prefix for final output.""" - node_capture, runner = _build_join_node_workflow(request) - events = await runner.run_async(testing_utils.get_user_content('start')) - - # Find the final output event from JoinNode - join_events = [ - e - for e in events - if 'NodeJoin' in e.node_info.path and e.output is not None - ] - assert len(join_events) == 1 - join_event = join_events[0] - - # NodeA and NodeB run in parallel, so they should have branches like 'NodeA@1' and 'NodeB@1'. - a_events = [e for e in events if 'NodeA' in e.node_info.path] - b_events = [e for e in events if 'NodeB' in e.node_info.path] - - assert any('NodeA@' in e.branch for e in a_events if e.branch) - assert any('NodeB@' in e.branch for e in b_events if e.branch) - - # The common prefix of 'NodeA@1' and 'NodeB@1' is empty string. - # So JoinNode should set branch to empty string (which is converted to None). - assert join_event.branch is None - - # The node after JoinNode (NodeCapture) should also have branch=None - capture_events = [e for e in events if 'NodeCapture' in e.node_info.path] - assert len(capture_events) > 0 - for e in capture_events: - assert e.branch is None diff --git a/tests/unittests/workflow/test_llm_agent_as_node.py b/tests/unittests/workflow/test_llm_agent_as_node.py deleted file mode 100644 index 8e4fcf116d..0000000000 --- a/tests/unittests/workflow/test_llm_agent_as_node.py +++ /dev/null @@ -1,1238 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for _LlmAgentWrapper. - -Verifies that _LlmAgentWrapper correctly adapts V1 LlmAgent for use as a -workflow graph node, covering mode validation, input conversion, -content isolation, output extraction, and both old/new workflow paths. -""" - -from __future__ import annotations - -from typing import Any - -from google.adk.agents.context import Context -from google.adk.agents.llm.task._task_models import TaskResult -from google.adk.agents.llm_agent import LlmAgent -from google.adk.events.event import Event -from google.adk.events.event_actions import EventActions -from google.adk.features import FeatureName -from google.adk.features import override_feature_enabled -from google.adk.workflow import START -from google.adk.workflow._workflow import Workflow -from google.adk.workflow.utils._workflow_graph_utils import build_node -from google.genai import types -from pydantic import BaseModel -from pydantic import ValidationError -import pytest - -from .workflow_testing_utils import create_parent_invocation_context -from .workflow_testing_utils import InputCapturingNode -from .workflow_testing_utils import TestingNode - -# --- Fixtures --- - - -class StoryOutput(BaseModel): - title: str - content: str - - -class StoryInput(BaseModel): - topic: str - style: str = 'narrative' - - -def _make_agent( - name: str = 'test_agent', - mode: str = 'task', - **kwargs, -) -> LlmAgent: - return LlmAgent( - name=name, - model='gemini-2.5-flash', - instruction='Test agent.', - mode=mode, - **kwargs, - ) - - -def _mock_agent_run(agent, finish_output=None, content_text=None): - """Mocks agent.run_async to yield events. Returns a context manager.""" - - async def fake_run_async(*args, **kwargs): - if content_text: - yield Event( - invocation_id='inv', - author=agent.name, - content=types.Content(parts=[types.Part(text=content_text)]), - ) - if finish_output is not None: - # Task Delegation API: emit a finish_task FC followed by its FR. - # The wrapper waits for the FR (so validation errors can drive a - # retry) before extracting the FC's args as event.output. - yield Event( - invocation_id='inv', - author=agent.name, - content=types.Content( - role='model', - parts=[ - types.Part( - function_call=types.FunctionCall( - name='finish_task', - id='ft-1', - args=( - finish_output - if isinstance(finish_output, dict) - else {'result': finish_output} - ), - ) - ) - ], - ), - ) - yield Event( - invocation_id='inv', - author=agent.name, - content=types.Content( - role='user', - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='finish_task', - id='ft-1', - response={'result': 'Task completed.'}, - ) - ) - ], - ), - ) - - original = agent.run_async - object.__setattr__(agent, 'run_async', fake_run_async) - - class _Ctx: - - def __enter__(self): - return self - - def __exit__(self, *args): - object.__setattr__(agent, 'run_async', original) - - return _Ctx() - - -def _mock_leaf_run(agent, content_text=None): - """Mocks the agent.run_async. Returns a context manager.""" - target = agent - - async def fake_run_async(*args, **kwargs): - if content_text: - yield Event(output=content_text) - - original = target.run_async - object.__setattr__(target, 'run_async', fake_run_async) - - class _Ctx: - - def __enter__(self): - return self - - def __exit__(self, *args): - object.__setattr__(target, 'run_async', original) - - return _Ctx() - - -def _new_workflow_runner(wf, test_name): - """Creates an InMemoryRunner for the new Workflow (root_agent path).""" - from google.adk.apps.app import App - - from . import testing_utils - - app = App(name=test_name, root_agent=wf) - return testing_utils.InMemoryRunner(app=app) - - -# --- Validation --- - - -class TestValidation: - - def test_task_mode_accepted(self): - """Wrapping a task-mode agent succeeds.""" - wrapper = build_node(_make_agent(mode='task')) - assert wrapper.name == 'test_agent' - - def test_single_turn_mode_accepted(self): - """Wrapping a single_turn-mode agent succeeds.""" - wrapper = build_node(_make_agent(mode='single_turn')) - assert wrapper.name == 'test_agent' - - def test_chat_mode_accepted(self): - """Wrapping a chat-mode agent succeeds.""" - wrapper = build_node(_make_agent(mode='chat')) - assert wrapper.name == 'test_agent' - - def test_name_defaults_to_agent_name(self): - """Wrapper name defaults to the inner agent's name.""" - wrapper = build_node(_make_agent(name='my_agent')) - assert wrapper.name == 'my_agent' - - def test_name_can_be_overridden(self): - """Explicit name overrides the agent's name.""" - wrapper = build_node(_make_agent(name='my_agent'), name='custom') - assert wrapper.name == 'custom' - - def test_task_mode_waits_for_output(self): - """Task mode sets wait_for_output=True.""" - wrapper = build_node(_make_agent(mode='task')) - assert wrapper.wait_for_output is True - - def test_single_turn_does_not_wait_for_output(self): - """Single_turn mode does not set wait_for_output.""" - wrapper = build_node(_make_agent(mode='single_turn')) - assert wrapper.wait_for_output is False - - def test_rerun_on_resume_defaults_true(self): - """Wrapper defaults to rerun_on_resume=True.""" - wrapper = build_node(_make_agent()) - assert wrapper.rerun_on_resume is True - - -# --- build_node auto-wrapping --- - - -class TestBuildNode: - - def test_task_mode_wrapped(self): - """build_node returns a cloned task-mode LlmAgent.""" - agent = _make_agent(mode='task') - node = build_node(agent) - assert isinstance(node, LlmAgent) - assert node is not agent - assert node.name == agent.name - - def test_single_turn_mode_wrapped(self): - """build_node returns a cloned single_turn-mode LlmAgent.""" - node = build_node(_make_agent(mode='single_turn')) - assert isinstance(node, LlmAgent) - - @pytest.mark.skip( - reason=( - 'V2 LlmAgent does not allow mode=None and defaults to chat, so' - ' fallback in wrapper is not triggered here.' - ) - ) - def test_default_mode_auto_set_to_single_turn(self): - """LlmAgent with explicit mode=None is auto-converted to single_turn.""" - agent = LlmAgent( - name='agent', model='gemini-2.5-flash', instruction='Test.', mode=None - ) - - node = build_node(agent) - - assert node.mode == 'single_turn' - - def test_name_override(self): - """build_node respects explicit name override.""" - node = build_node(_make_agent(mode='task'), name='override') - assert node.name == 'override' - - -# --- Old workflow path --- - - -@pytest.mark.xfail( - strict=True, - reason=( - "mode='task' workflow graph nodes temporarily disabled; re-enable " - 'when scheduler preserves originating node_input on resume.' - ), -) -@pytest.mark.asyncio -async def test_task_finish_output_reaches_downstream( - request: pytest.FixtureRequest, -): - """Task mode extracts finish_task output for downstream nodes.""" - agent = _make_agent(mode='task') - from . import testing_utils - - wrapper = build_node(agent) - capture = InputCapturingNode(name='capture') - wf = Workflow( - name='wf', - edges=[('START', wrapper), (wrapper, capture)], - ) - runner = _new_workflow_runner(wf, request.function.__name__) - - agent_clone = next(n for n in wf.graph.nodes if n.name == wrapper.name) - with _mock_agent_run( - agent_clone, - finish_output={'title': 'Story', 'content': 'Once upon a time'}, - content_text='Writing...', - ): - await runner.run_async(testing_utils.get_user_content('start')) - - assert capture.received_inputs == [ - {'title': 'Story', 'content': 'Once upon a time'} - ] - - -@pytest.mark.asyncio -async def test_single_turn_output_reaches_downstream( - request: pytest.FixtureRequest, -): - """Single_turn output flows to downstream nodes.""" - from . import testing_utils - - agent = _make_agent(mode='single_turn') - wrapper = build_node(agent) - capture = InputCapturingNode(name='capture') - wf = Workflow( - name='wf', - edges=[('START', wrapper), (wrapper, capture)], - ) - runner = _new_workflow_runner(wf, request.function.__name__) - - agent_clone = next(n for n in wf.graph.nodes if n.name == wrapper.name) - with _mock_leaf_run(agent_clone, content_text='Done.'): - await runner.run_async(testing_utils.get_user_content('start')) - - assert capture.received_inputs == ['Done.'] - - -@pytest.mark.xfail( - strict=True, - reason=( - "mode='task' workflow graph nodes temporarily disabled; re-enable " - 'when scheduler preserves originating node_input on resume.' - ), -) -@pytest.mark.asyncio -async def test_valid_input_schema_accepted( - request: pytest.FixtureRequest, -): - """Valid dict matching input_schema passes through without error.""" - from . import testing_utils - - agent = _make_agent(mode='task', input_schema=StoryInput) - wrapper = build_node(agent) - capture = InputCapturingNode(name='capture') - wf = Workflow( - name='wf', - edges=[('START', wrapper), (wrapper, capture)], - ) - from unittest.mock import AsyncMock - from unittest.mock import MagicMock - - ctx = MagicMock(spec=Context) - ic = MagicMock() - ctx.get_invocation_context.return_value = ic - ctx._invocation_context = ic - ctx.resume_inputs = {} - ctx._output_for_ancestors = [] - ic.branch = None - ic.model_copy.return_value = ic - ic._enqueue_event = AsyncMock(return_value=None) - ic.plugin_manager.run_before_agent_callback = AsyncMock(return_value=None) - ic.plugin_manager.run_after_agent_callback = AsyncMock(return_value=None) - ctx.node_path = 'wf' - - agent_clone = next(n for n in wf.graph.nodes if n.name == wrapper.name) - with _mock_agent_run(agent_clone, finish_output={'result': 'ok'}): - async for _ in wf.run(ctx=ctx, node_input={'topic': 'Gemini'}): - pass - - assert capture.received_inputs == [{'result': 'ok'}] - - -# Skipping this test as _LlmAgentWrapper does not seem to validate input schema -# @pytest.mark.asyncio -# async def test_invalid_input_schema_raises( -# request: pytest.FixtureRequest, -# ): -# """Invalid input not matching input_schema raises ValidationError.""" -# agent = _make_agent(mode='task', input_schema=StoryInput) -# wrapper = build_node(agent) -# wf = Workflow(name='wf', edges=[(START, wrapper)]) -# ctx = await create_parent_invocation_context(request.function.__name__, wf) -# ic = ctx.model_copy(update={'branch': None}) -# agent_ctx = Context(invocation_context=ic, node_path='wf', run_id='exec') -# -# with _mock_agent_run(agent, finish_output={'result': 'ok'}): -# with pytest.raises(ValidationError): -# async for _ in wrapper.run(ctx=agent_ctx, node_input={'style': 'comedy'}): -# pass - - -@pytest.mark.xfail( - strict=True, - reason=( - "mode='task' workflow graph nodes temporarily disabled; re-enable " - 'when scheduler preserves originating node_input on resume.' - ), -) -@pytest.mark.asyncio -async def test_auto_wrap_in_workflow_edges(request: pytest.FixtureRequest): - """LlmAgent placed directly in edges is auto-wrapped and works.""" - from . import testing_utils - - agent = _make_agent(mode='task') - capture = InputCapturingNode(name='capture') - wf = Workflow( - name='wf', - edges=[('START', agent), (agent, capture)], - ) - runner = _new_workflow_runner(wf, request.function.__name__) - - agent_clone = next(n for n in wf.graph.nodes if n.name == agent.name) - with _mock_agent_run(agent_clone, finish_output={'result': 'auto'}): - await runner.run_async(testing_utils.get_user_content('start')) - - assert capture.received_inputs == [{'result': 'auto'}] - - -@pytest.mark.asyncio -async def test_single_turn_isolates_content_via_branch( - request: pytest.FixtureRequest, -): - """Single_turn wrapper sets a branch for content isolation.""" - agent = _make_agent(mode='single_turn') - wrapper = build_node(agent) - captured_branches = [] - - async def fake_run(invocation_context): - captured_branches.append(invocation_context.branch) - yield Event(output='response') - - from . import testing_utils - - wf = Workflow(name='wf', edges=[('START', wrapper)]) - runner = _new_workflow_runner(wf, request.function.__name__) - - agent_clone = next(n for n in wf.graph.nodes if n.name == wrapper.name) - original = agent_clone.run_async - object.__setattr__(agent_clone, 'run_async', fake_run) - try: - await runner.run_async(testing_utils.get_user_content('start')) - finally: - object.__setattr__(agent_clone, 'run_async', original) - - assert len(captured_branches) == 1 - assert captured_branches[0] is None - - -@pytest.mark.xfail( - strict=True, - reason=( - "mode='task' workflow graph nodes temporarily disabled; re-enable " - 'when scheduler preserves originating node_input on resume.' - ), -) -@pytest.mark.asyncio -async def test_task_mode_does_not_set_branch( - request: pytest.FixtureRequest, -): - """Task mode preserves None branch for HITL visibility.""" - agent = _make_agent(mode='task') - wrapper = build_node(agent) - captured_branches = [] - - async def fake_run(invocation_context): - captured_branches.append(invocation_context.branch) - yield Event( - invocation_id='inv', - author=agent.name, - content=types.Content( - role='model', - parts=[ - types.Part( - function_call=types.FunctionCall( - name='finish_task', - id='ft-2', - args={'output': {'result': 'done'}}, - ) - ) - ], - ), - ) - - from . import testing_utils - - wf = Workflow(name='wf', edges=[('START', wrapper)]) - runner = _new_workflow_runner(wf, request.function.__name__) - - agent_clone = next(n for n in wf.graph.nodes if n.name == wrapper.name) - original = agent_clone.run_async - object.__setattr__(agent_clone, 'run_async', fake_run) - try: - await runner.run_async(testing_utils.get_user_content('start')) - finally: - object.__setattr__(agent_clone, 'run_async', original) - - assert captured_branches == [None] - - -@pytest.mark.asyncio -async def test_single_turn_converts_input_to_content( - request: pytest.FixtureRequest, -): - """Single_turn wrapper converts string node_input to types.Content.""" - agent = _make_agent(mode='single_turn') - wrapper = build_node(agent) - captured_inputs = [] - - async def fake_run(*args, **kwargs): - ctx = args[0] - captured_inputs.append(ctx.session.events[-1].message) - yield Event(output='response') - - from . import testing_utils - - predecessor = TestingNode(name='pred', output='hello world') - wf = Workflow( - name='wf', - edges=[('START', predecessor), (predecessor, wrapper)], - ) - runner = _new_workflow_runner(wf, request.function.__name__) - - agent_clone = next(n for n in wf.graph.nodes if n.name == wrapper.name) - original = agent_clone.run_async - object.__setattr__(agent_clone, 'run_async', fake_run) - try: - await runner.run_async(testing_utils.get_user_content('start')) - finally: - object.__setattr__(agent_clone, 'run_async', original) - - assert len(captured_inputs) == 1 - assert isinstance(captured_inputs[0], types.Content) - assert captured_inputs[0].parts[0].text == 'hello world' - - -# --- New workflow path --- - - -def _get_user_content(): - from . import testing_utils - - return testing_utils.get_user_content - - -@pytest.mark.asyncio -async def test_react_path_user_content_visible_to_llm( - request: pytest.FixtureRequest, -): - """First-node LLM agent sees the user message in the new Workflow.""" - from google.adk.workflow._workflow import Workflow as NewWorkflow - - from . import testing_utils - - mock_model = testing_utils.MockModel.create(responses=['extracted output']) - agent = LlmAgent( - name='process_request', - model=mock_model, - instruction='Extract info from the user message.', - ) - wf = NewWorkflow(name='wf', edges=[('START', agent)]) - - runner = _new_workflow_runner(wf, request.function.__name__) - await runner.run_async( - testing_utils.get_user_content('I want 3 days off for vacation') - ) - - assert len(mock_model.requests) == 1 - user_texts = [ - p.text - for c in mock_model.requests[0].contents - if c.role == 'user' - for p in c.parts or [] - if p.text - ] - assert any('3 days' in t for t in user_texts) - - -@pytest.mark.skip( - reason=( - '_LlmAgentWrapper does not fully support new workflow path in this test' - ) -) -@pytest.mark.asyncio -async def test_react_path_output_reaches_downstream( - request: pytest.FixtureRequest, -): - """LLM output flows to the next node in the new Workflow.""" - from google.adk.workflow._workflow import Workflow as NewWorkflow - - from . import testing_utils - - mock_model = testing_utils.MockModel.create(responses=['hello world']) - agent = LlmAgent( - name='greeter', - model=mock_model, - instruction='Greet.', - ) - captured = [] - - def capture(node_input: str): - captured.append(node_input) - - wf = NewWorkflow(name='wf', edges=[('START', agent, capture)]) - - runner = _new_workflow_runner(wf, request.function.__name__) - await runner.run_async(testing_utils.get_user_content('hi')) - - assert captured == ['hello world'] - - -@pytest.mark.skip( - reason=( - '_LlmAgentWrapper does not fully support new workflow path in this test' - ) -) -@pytest.mark.asyncio -async def test_react_path_output_key_stored_in_state( - request: pytest.FixtureRequest, -): - """output_key stores LLM output in state in the new Workflow.""" - from google.adk.workflow._workflow import Workflow as NewWorkflow - - from . import testing_utils - - mock_model = testing_utils.MockModel.create(responses=['summary text']) - agent = LlmAgent( - name='summarizer', - model=mock_model, - instruction='Summarize.', - output_key='summary', - ) - captured_state = [] - - def check_state(ctx: Context): - captured_state.append(ctx.state.get('summary')) - - wf = NewWorkflow(name='wf', edges=[('START', agent, check_state)]) - - runner = _new_workflow_runner(wf, request.function.__name__) - await runner.run_async(testing_utils.get_user_content('some text')) - - assert captured_state == ['summary text'] - - -@pytest.mark.skip( - reason=( - '_LlmAgentWrapper does not fully support new workflow path in this test' - ) -) -@pytest.mark.asyncio -async def test_react_path_output_schema_validated( - request: pytest.FixtureRequest, -): - """output_schema is validated and parsed in the new Workflow.""" - from google.adk.workflow._workflow import Workflow as NewWorkflow - - from . import testing_utils - - mock_model = testing_utils.MockModel.create( - responses=['{"title": "My Story", "content": "Once upon a time"}'] - ) - agent = LlmAgent( - name='writer', - model=mock_model, - instruction='Write a story.', - output_schema=StoryOutput, - output_key='story', - ) - captured = [] - - def check_output(node_input: dict): - captured.append(node_input) - - wf = NewWorkflow(name='wf', edges=[('START', agent, check_output)]) - - runner = _new_workflow_runner(wf, request.function.__name__) - await runner.run_async(testing_utils.get_user_content('write')) - - assert len(captured) == 1 - assert captured[0]['title'] == 'My Story' - assert captured[0]['content'] == 'Once upon a time' - - -@pytest.mark.skip( - reason=( - '_LlmAgentWrapper does not fully support new workflow path in this test' - ) -) -@pytest.mark.asyncio -async def test_react_path_predecessor_input_visible_to_llm( - request: pytest.FixtureRequest, -): - """Predecessor output is injected as user content for the LLM.""" - from google.adk.workflow._workflow import Workflow as NewWorkflow - - from . import testing_utils - - mock_model = testing_utils.MockModel.create(responses=['processed']) - agent = LlmAgent( - name='processor', - model=mock_model, - instruction='Process.', - ) - - def step_one(node_input: str) -> str: - return 'transformed data' - - wf = NewWorkflow(name='wf', edges=[('START', step_one, agent)]) - - runner = _new_workflow_runner(wf, request.function.__name__) - await runner.run_async(testing_utils.get_user_content('raw input')) - - assert len(mock_model.requests) == 1 - user_texts = [ - p.text - for c in mock_model.requests[0].contents - if c.role == 'user' - for p in c.parts or [] - if p.text - ] - assert any('transformed data' in t for t in user_texts) - - -# --- React path: interrupt and resume --- - - -@pytest.mark.skip( - reason=( - '_LlmAgentWrapper does not fully support new workflow path in this test' - ) -) -@pytest.mark.asyncio -async def test_long_running_tool_interrupts_workflow( - request: pytest.FixtureRequest, -): - """Long-running tool stops the workflow after one LLM call.""" - from google.adk.tools.long_running_tool import LongRunningFunctionTool - from google.adk.workflow._workflow import Workflow as NewWorkflow - - from . import testing_utils - - def approve(request: str) -> None: - """Approve a request (long-running).""" - return None - - fc = types.Part.from_function_call(name='approve', args={'request': 'deploy'}) - mock_model = testing_utils.MockModel.create(responses=[fc]) - agent = LlmAgent( - name='approver', - model=mock_model, - instruction='Get approval.', - tools=[LongRunningFunctionTool(approve)], - ) - wf = NewWorkflow(name='wf', edges=[('START', agent)]) - - runner = _new_workflow_runner(wf, request.function.__name__) - events = await runner.run_async(testing_utils.get_user_content('deploy')) - - assert len(mock_model.requests) == 1 - assert any(e.long_running_tool_ids for e in events) - - -@pytest.mark.skip( - reason=( - '_LlmAgentWrapper does not fully support new workflow path in this test' - ) -) -@pytest.mark.asyncio -async def test_resume_after_interrupt_completes_workflow( - request: pytest.FixtureRequest, -): - """Resuming after interrupt calls the LLM once more to complete.""" - from google.adk.apps.app import App - from google.adk.apps.app import ResumabilityConfig - from google.adk.tools.long_running_tool import LongRunningFunctionTool - from google.adk.workflow._workflow import Workflow as NewWorkflow - - from . import testing_utils - - def approve(request: str) -> None: - """Approve a request (long-running).""" - return None - - fc = types.Part.from_function_call(name='approve', args={'request': 'deploy'}) - mock_model = testing_utils.MockModel.create( - responses=[fc, 'Approved and deployed.'] - ) - agent = LlmAgent( - name='approver', - model=mock_model, - instruction='Get approval.', - tools=[LongRunningFunctionTool(approve)], - ) - wf = NewWorkflow(name='wf', edges=[('START', agent)]) - - app = App( - name=request.function.__name__, - root_agent=wf, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: LLM → FC → interrupt - events1 = await runner.run_async( - testing_utils.get_user_content('deploy please') - ) - invocation_id = events1[0].invocation_id - assert any(e.long_running_tool_ids for e in events1) - - # Find the interrupt FC id - interrupt_event = next(e for e in events1 if e.long_running_tool_ids) - fc_id = list(interrupt_event.long_running_tool_ids)[0] - - # Run 2: Resume with FR - resume_msg = types.Content( - role='user', - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='approve', - id=fc_id, - response={'result': 'yes'}, - ) - ) - ], - ) - events2 = await runner.run_async( - new_message=resume_msg, - invocation_id=invocation_id, - ) - - # Total LLM calls: 1 (first run) + 1 (resume) = 2. - assert len(mock_model.requests) == 2 - # Verify resumed output reached completion. - content_texts = [ - p.text - for e in events2 - if e.content and e.content.parts - for p in e.content.parts - if p.text - ] - assert any('Approved and deployed.' in t for t in content_texts) - - -@pytest.mark.skip( - reason=( - '_LlmAgentWrapper does not fully support new workflow path in this test' - ) -) -@pytest.mark.asyncio -async def test_multiple_sequential_interrupts_in_workflow( - request: pytest.FixtureRequest, -): - """Two interrupts in sequence each resume and complete in a workflow.""" - from google.adk.apps.app import App - from google.adk.apps.app import ResumabilityConfig - from google.adk.tools.long_running_tool import LongRunningFunctionTool - from google.adk.workflow._workflow import Workflow as NewWorkflow - - from . import testing_utils - - def step_one() -> None: - """First long-running step.""" - return None - - def step_two() -> None: - """Second long-running step.""" - return None - - fc1 = types.Part.from_function_call(name='step_one', args={}) - fc2 = types.Part.from_function_call(name='step_two', args={}) - mock_model = testing_utils.MockModel.create(responses=[fc1, fc2, 'All done.']) - agent = LlmAgent( - name='worker', - model=mock_model, - instruction='Do two steps.', - tools=[ - LongRunningFunctionTool(step_one), - LongRunningFunctionTool(step_two), - ], - ) - wf = NewWorkflow(name='wf', edges=[('START', agent)]) - - app = App( - name=request.function.__name__, - root_agent=wf, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: LLM → FC1 → interrupt - events1 = await runner.run_async(testing_utils.get_user_content('Start')) - assert any(e.long_running_tool_ids for e in events1) - invocation_id = events1[0].invocation_id - interrupt1 = next(e for e in events1 if e.long_running_tool_ids) - fc1_id = list(interrupt1.long_running_tool_ids)[0] - - # Run 2: Resume FC1 → LLM → FC2 → interrupt again - events2 = await runner.run_async( - new_message=types.Content( - role='user', - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='step_one', - id=fc1_id, - response={'result': 'step1 done'}, - ) - ) - ], - ), - invocation_id=invocation_id, - ) - assert any(e.long_running_tool_ids for e in events2) - assert len(mock_model.requests) == 2 - interrupt2 = next(e for e in events2 if e.long_running_tool_ids) - fc2_id = list(interrupt2.long_running_tool_ids)[0] - - # Run 3: Resume FC2 → LLM → text → done - invocation_id2 = events2[0].invocation_id - events3 = await runner.run_async( - new_message=types.Content( - role='user', - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='step_two', - id=fc2_id, - response={'result': 'step2 done'}, - ) - ) - ], - ), - invocation_id=invocation_id2, - ) - - # Total: 3 LLM calls (one per run). - assert len(mock_model.requests) == 3 - content_texts = [ - p.text - for e in events3 - if e.content and e.content.parts - for p in e.content.parts - if p.text - ] - assert any('All done.' in t for t in content_texts) - - -# --- Original tests from test_v1_llm_agent_wrapper.py --- - - -def _make_v1_agent(mode='task'): - return LlmAgent( - name='test_v1_agent', - model='gemini-2.5-flash', - instruction='Test instruction', - mode=mode, - ) - - -def test_task_mode_sets_wait_for_output(): - agent = _make_v1_agent(mode='task') - wrapper = build_node(agent) - assert wrapper.wait_for_output is True - - -def test_single_turn_does_not_set_wait_for_output(): - agent = _make_v1_agent(mode='single_turn') - wrapper = build_node(agent) - assert wrapper.wait_for_output is False - - -def test_chat_mode_sets_wait_for_output(): - agent = _make_v1_agent(mode='chat') - wrapper = build_node(agent) - assert wrapper.wait_for_output is True - - -@pytest.mark.asyncio -async def test_task_mode_proceeds_on_finish_task(): - agent = _make_v1_agent(mode='task') - wrapper = build_node(agent) - - async def mock_run_async(*args, **kwargs): - yield Event( - invocation_id='inv', - author='test_v1_agent', - content=types.Content( - role='model', - parts=[ - types.Part( - function_call=types.FunctionCall( - name='finish_task', - id='ft-3', - args={'output': 'done_output'}, - ) - ) - ], - ), - ) - yield Event( - invocation_id='inv', - author='test_v1_agent', - content=types.Content( - role='user', - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='finish_task', - id='ft-3', - response={'result': 'Task completed.'}, - ) - ) - ], - ), - ) - - object.__setattr__(wrapper, 'run_async', mock_run_async) - - from unittest.mock import AsyncMock - from unittest.mock import MagicMock - - ctx = MagicMock(spec=Context) - ic = MagicMock() - ctx.get_invocation_context.return_value = ic - ic.model_copy.return_value = ic - ic.plugin_manager.run_before_agent_callback = AsyncMock(return_value=None) - ic.plugin_manager.run_after_agent_callback = AsyncMock(return_value=None) - ctx.node_path = 'wf' - - events = [] - async for e in wrapper._run_impl(ctx=ctx, node_input='hello'): - events.append(e) - - # Wrapper yields both the FC and the success FR; output is set on the FR. - assert len(events) == 2 - assert events[1].output == {'output': 'done_output'} - - -@pytest.mark.asyncio -async def test_task_mode_does_not_proceed_without_finish_task(): - agent = _make_v1_agent(mode='task') - wrapper = build_node(agent) - - async def mock_run_async(*args, **kwargs): - yield Event( - invocation_id='inv', - author='test_v1_agent', - content=types.Content(parts=[types.Part(text='Working...')]), - ) - - object.__setattr__(wrapper, 'run_async', mock_run_async) - - from unittest.mock import AsyncMock - from unittest.mock import MagicMock - - ctx = MagicMock(spec=Context) - ic = MagicMock() - ctx.get_invocation_context.return_value = ic - ic.model_copy.return_value = ic - ic.plugin_manager.run_before_agent_callback = AsyncMock(return_value=None) - ic.plugin_manager.run_after_agent_callback = AsyncMock(return_value=None) - ctx.node_path = 'wf' - - events = [] - async for e in wrapper._run_impl(ctx=ctx, node_input='hello'): - events.append(e) - - assert len(events) == 1 - assert events[0].output is None - - -@pytest.mark.asyncio -async def test_chat_mode_yields_events_directly(): - agent = _make_v1_agent(mode='chat') - wrapper = build_node(agent) - - async def mock_run_async(*args, **kwargs): - yield Event( - invocation_id='inv', - author='test_v1_agent', - content=types.Content(parts=[types.Part(text='Hello from chat')]), - ) - - object.__setattr__(wrapper, 'run_async', mock_run_async) - - from unittest.mock import AsyncMock - from unittest.mock import MagicMock - - ctx = MagicMock(spec=Context) - ic = MagicMock() - ctx.get_invocation_context.return_value = ic - ic.model_copy.return_value = ic - ic.plugin_manager.run_before_agent_callback = AsyncMock(return_value=None) - ic.plugin_manager.run_after_agent_callback = AsyncMock(return_value=None) - ctx.node_path = 'wf' - - events = [] - async for e in wrapper._run_impl(ctx=ctx, node_input='hello'): - events.append(e) - - assert len(events) == 1 - assert events[0].content.parts[0].text == 'Hello from chat' - assert events[0].output is None - - -def test_chat_mode_agent_following_non_start_raises_validation_error(): - """Wiring a chat-mode agent following a non-START node raises ValueError.""" - agent = _make_v1_agent(mode='chat') - predecessor = TestingNode(name='pred', output='some output') - - with pytest.raises(ValueError) as exc_info: - Workflow( - name='wf', - edges=[('START', predecessor), (predecessor, agent)], - ) - - assert ( - "The agent 'test_v1_agent' has been added to the workflow with" - " mode='chat' following node 'pred'." - in str(exc_info.value) - ) - - -def test_chat_mode_agent_from_start_allowed(): - """Wiring a chat-mode agent directly from START is allowed and validated without error.""" - agent = _make_v1_agent(mode='chat') - - wf = Workflow( - name='wf', - edges=[('START', agent)], - ) - assert wf.graph is not None - - -@pytest.mark.asyncio -async def test_three_layer_llm_agent_transfer_round_trip( - request: pytest.FixtureRequest, -): - """Verify 3-layer LlmAgent transfers end-to-end (Root -> Child -> Grandchild -> Child -> Root).""" - from google.adk.apps.app import App - from google.adk.apps.app import ResumabilityConfig - - from . import testing_utils - - # Prepare the transfer function call parts - fc_transfer_to_child = types.Part.from_function_call( - name='transfer_to_agent', - args={'agent_name': 'child_agent'}, - ) - fc_transfer_to_grandchild = types.Part.from_function_call( - name='transfer_to_agent', - args={'agent_name': 'grandchild_agent'}, - ) - fc_transfer_to_child_parent = types.Part.from_function_call( - name='transfer_to_agent', - args={'agent_name': 'child_agent'}, - ) - fc_transfer_to_root = types.Part.from_function_call( - name='transfer_to_agent', - args={'agent_name': 'root_agent'}, - ) - - # Mock models for 3 layers - root_model = testing_utils.MockModel.create( - responses=[fc_transfer_to_child, 'Welcome back to root!'] - ) - child_model = testing_utils.MockModel.create( - responses=[ - fc_transfer_to_grandchild, - 'Welcome back to child!', - fc_transfer_to_root, - ] - ) - grandchild_model = testing_utils.MockModel.create( - responses=['Hello, I am grandchild!', fc_transfer_to_child_parent] - ) - - # Instantiate agents - grandchild_agent = LlmAgent( - name='grandchild_agent', - model=grandchild_model, - instruction='Grandchild agent.', - ) - child_agent = LlmAgent( - name='child_agent', - model=child_model, - instruction='Child agent.', - sub_agents=[grandchild_agent], - ) - root_agent = LlmAgent( - name='root_agent', - model=root_model, - instruction='Root agent.', - sub_agents=[child_agent], - ) - - app = App( - name=request.function.__name__, - root_agent=root_agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Turn 1: Start (Root -> Child -> Grandchild -> Grandchild speaks) - events1 = await runner.run_async(testing_utils.get_user_content('Start')) - invocation_id = events1[0].invocation_id - - # Verify Turn 1 completed at Grandchild - content_texts1 = [ - p.text - for e in events1 - if e.content and e.content.parts - for p in e.content.parts - if p.text - ] - assert any('Hello, I am grandchild!' in t for t in content_texts1) - - # Turn 2: Go back to parent (Grandchild -> Child -> Child speaks) - events2 = await runner.run_async( - new_message=testing_utils.get_user_content('Go back to parent'), - invocation_id=invocation_id, - ) - - # Verify Turn 2 completed at Child - content_texts2 = [ - p.text - for e in events2 - if e.content and e.content.parts - for p in e.content.parts - if p.text - ] - assert any('Welcome back to child!' in t for t in content_texts2) - - # Turn 3: Go back to root (Child -> Root -> Root speaks) - events3 = await runner.run_async( - new_message=testing_utils.get_user_content('Go back to root'), - invocation_id=invocation_id, - ) - - # Verify Turn 3 completed at Root - content_texts3 = [ - p.text - for e in events3 - if e.content and e.content.parts - for p in e.content.parts - if p.text - ] - assert any('Welcome back to root!' in t for t in content_texts3) diff --git a/tests/unittests/workflow/test_node_runner_ctx.py b/tests/unittests/workflow/test_node_runner_ctx.py deleted file mode 100644 index fb2367122c..0000000000 --- a/tests/unittests/workflow/test_node_runner_ctx.py +++ /dev/null @@ -1,608 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for NodeRunner → Context as result channel. - -Verifies that NodeRunner correctly populates ctx.output, ctx.route, -and ctx.interrupt_ids from yielded events and direct assignment, -and that resume state (prior_output, prior_interrupt_ids) is carried -forward correctly. -""" - -from unittest.mock import AsyncMock -from unittest.mock import MagicMock - -from google.adk.agents.base_agent import BaseAgent -from google.adk.agents.context import Context -from google.adk.agents.invocation_context import InvocationContext -from google.adk.events.event import Event -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.sessions.session import Session -from google.adk.workflow._base_node import BaseNode -from google.adk.workflow._node_runner import NodeRunner -from google.genai import types -import pytest - -# --- Helpers --- - - -def _make_ctx(invocation_id='inv-test', enqueue_events=None, node_path=''): - """Create a minimal Context mock with IC.""" - mock_agent = MagicMock(spec=BaseAgent) - real_session = Session( - id='test_session', app_name='test_app', user_id='test_user' - ) - real_session_service = InMemorySessionService() - - ic = InvocationContext( - invocation_id=invocation_id, - agent=mock_agent, - session=real_session, - session_service=real_session_service, - ) - - collected = enqueue_events if enqueue_events is not None else [] - - async def _enqueue(event): - collected.append(event) - - object.__setattr__(ic, '_enqueue_event', AsyncMock(side_effect=_enqueue)) - - ctx = Context( - invocation_context=ic, - node_path=node_path, - ) - return ctx, collected - - -# ========================================================================= -# Context as RESULT — fields populated by NodeRunner after execution -# ========================================================================= - - -# --- ctx.output from yielded events --- - - -@pytest.mark.asyncio -async def test_yield_value_sets_ctx_output(): - """Yielding a value sets ctx.output on the returned context.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield 'hello' - - parent_ctx, _ = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.output == 'hello' - - -@pytest.mark.asyncio -async def test_yield_event_output_sets_ctx_output(): - """Yielding Event(output=X) sets ctx.output.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield Event(output='from_event') - - parent_ctx, _ = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.output == 'from_event' - - -@pytest.mark.asyncio -async def test_no_yield_leaves_ctx_output_none(): - """A node that yields nothing leaves ctx.output as None.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - return - yield # noqa: unreachable - - parent_ctx, _ = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.output is None - - -# --- ctx.output set directly --- - - -@pytest.mark.asyncio -async def test_ctx_output_set_directly(): - """Setting ctx.output directly produces a deferred output event.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - ctx.output = 'direct' - yield # noqa: unreachable - - parent_ctx, events = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.output == 'direct' - output_events = [e for e in events if e.output is not None] - assert len(output_events) == 1 - assert output_events[0].output == 'direct' - - -@pytest.mark.asyncio -async def test_ctx_output_direct_with_state_delta(): - """Deferred output bundles pending state deltas onto the same event.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - ctx.state['key'] = 'val' - ctx.output = 'result' - yield # noqa: unreachable - - parent_ctx, events = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.output == 'result' - output_events = [e for e in events if e.output is not None] - assert len(output_events) == 1 - assert output_events[0].actions.state_delta['key'] == 'val' - - -@pytest.mark.asyncio -async def test_deferred_output_emitted_after_intermediate(): - """ctx.output set directly emits after intermediate content events.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - ctx.output = 'deferred' - yield Event(content=types.Content(parts=[types.Part(text='working')])) - - parent_ctx, events = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.output == 'deferred' - assert len(events) == 2 - assert events[0].content.parts[0].text == 'working' - assert events[1].output == 'deferred' - - -# --- ctx.output validation --- - - -@pytest.mark.asyncio -async def test_double_output_raises(): - """Setting ctx.output twice raises ValueError.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - ctx.output = 'first' - ctx.output = 'second' - yield # noqa: unreachable - - parent_ctx, events = _make_ctx() - await NodeRunner(node=_Node(name='n'), parent_ctx=parent_ctx).run() - error_events = [e for e in events if e.error_code] - assert len(error_events) == 1 - assert error_events[0].error_code == 'ValueError' - assert 'already set' in error_events[0].error_message - - -@pytest.mark.asyncio -async def test_yield_then_ctx_output_raises(): - """Yielding output then setting ctx.output raises ValueError.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield 'first' - ctx.output = 'second' - - parent_ctx, events = _make_ctx() - await NodeRunner(node=_Node(name='n'), parent_ctx=parent_ctx).run() - error_events = [e for e in events if e.error_code] - assert len(error_events) == 1 - assert error_events[0].error_code == 'ValueError' - assert 'already set' in error_events[0].error_message - - -# --- ctx.route --- - - -@pytest.mark.asyncio -async def test_yield_route_sets_ctx_route(): - """Yielding Event(route=R) sets ctx.route.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield Event(output='out', route='next') - - parent_ctx, _ = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.output == 'out' - assert child_ctx.route == 'next' - - -@pytest.mark.asyncio -async def test_ctx_route_set_directly(): - """Setting ctx.route directly is readable after run.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - ctx.route = 'branch_a' - yield 'out' - - parent_ctx, _ = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.route == 'branch_a' - - -# --- ctx.interrupt_ids --- - - -@pytest.mark.asyncio -async def test_interrupt_sets_ctx_interrupt_ids(): - """Yielding an interrupt event populates ctx.interrupt_ids.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - parent_ctx, _ = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.interrupt_ids == {'fc-1'} - assert child_ctx.output is None - - -@pytest.mark.asyncio -async def test_output_and_interrupt_coexist(): - """Output and interrupt can coexist across separate events.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield 'result' - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - parent_ctx, _ = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.output == 'result' - assert child_ctx.interrupt_ids == {'fc-1'} - - -@pytest.mark.asyncio -async def test_duplicate_interrupt_ids_deduplicated(): - """Duplicate interrupt IDs are deduplicated (set semantics).""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield Event(long_running_tool_ids={'fc-1', 'fc-2'}) - yield Event(long_running_tool_ids={'fc-2', 'fc-3'}) - - parent_ctx, _ = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.interrupt_ids == {'fc-1', 'fc-2', 'fc-3'} - - -# --- Output delegation (use_as_output) --- - - -@pytest.mark.asyncio -async def test_delegated_output_not_enqueued(): - """When output is delegated, the output event is not enqueued.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - ctx._output_delegated = True - yield 'delegated_value' - - parent_ctx, events = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.output == 'delegated_value' - output_events = [e for e in events if e.output is not None] - assert len(output_events) == 0 - - -@pytest.mark.asyncio -async def test_delegated_ctx_output_not_emitted(): - """When output is delegated and set via ctx.output, no event emitted.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - ctx._output_delegated = True - ctx.output = 'delegated_direct' - yield # noqa: unreachable - - parent_ctx, events = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), parent_ctx=parent_ctx - ).run() - - assert child_ctx.output == 'delegated_direct' - output_events = [e for e in events if e.output is not None] - assert len(output_events) == 0 - - -# ========================================================================= -# Context as INPUT — resume state provided to NodeRunner at construction -# ========================================================================= - - -@pytest.mark.asyncio -async def test_prior_output_carried_forward(): - """Prior output from a previous run is available on ctx.output.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - return - yield # noqa: unreachable - - parent_ctx, _ = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), - parent_ctx=parent_ctx, - prior_output='cached_result', - ).run() - - assert child_ctx.output == 'cached_result' - - -@pytest.mark.asyncio -async def test_prior_interrupt_ids_carried_forward(): - """Prior interrupt IDs from a previous run are on ctx.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - return - yield # noqa: unreachable - - parent_ctx, _ = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), - parent_ctx=parent_ctx, - prior_interrupt_ids={'fc-old'}, - ).run() - - assert 'fc-old' in child_ctx.interrupt_ids - - -@pytest.mark.asyncio -async def test_prior_and_new_interrupt_ids_merged(): - """New interrupt IDs are merged with prior ones.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-new' - ) - ) - ] - ), - long_running_tool_ids={'fc-new'}, - ) - - parent_ctx, _ = _make_ctx() - child_ctx = await NodeRunner( - node=_Node(name='n'), - parent_ctx=parent_ctx, - prior_interrupt_ids={'fc-old'}, - ).run() - - assert child_ctx.interrupt_ids == {'fc-old', 'fc-new'} - - -# ========================================================================= -# event_author — parent orchestrator overrides event author -# ========================================================================= - - -@pytest.mark.asyncio -async def test_event_author_defaults_to_node_name(): - """Without event_author, events use the node's own name.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield 'result' - - parent_ctx, events = _make_ctx() - await NodeRunner(node=_Node(name='my_node'), parent_ctx=parent_ctx).run() - - assert events[0].author == 'my_node' - - -@pytest.mark.asyncio -async def test_event_author_overrides_node_name(): - """When parent sets event_author, events use that instead.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield 'result' - - parent_ctx, events = _make_ctx() - parent_ctx.event_author = 'my_workflow' - await NodeRunner(node=_Node(name='my_node'), parent_ctx=parent_ctx).run() - - assert events[0].author == 'my_workflow' - - -@pytest.mark.asyncio -async def test_event_author_overrides_preset_author(): - """event_author always wins, even over a pre-set event author.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield Event(author='custom_author', output='result') - - parent_ctx, events = _make_ctx() - parent_ctx.event_author = 'my_workflow' - await NodeRunner(node=_Node(name='my_node'), parent_ctx=parent_ctx).run() - - assert events[0].author == 'my_workflow' - - -# ========================================================================= -# Branch propagation tests -# ========================================================================= - - -@pytest.mark.asyncio -async def test_override_branch_used_in_node_runner(): - """NodeRunner uses override_branch if provided.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield Event(output='result') - - parent_ctx, events = _make_ctx() - await NodeRunner( - node=_Node(name='n'), - parent_ctx=parent_ctx, - override_branch='custom_branch', - ).run() - - assert events[0].branch == 'custom_branch' - - -@pytest.mark.asyncio -async def test_use_sub_branch_appends_segment_to_branch(): - """NodeRunner appends node_name@run_id to branch when use_sub_branch is True.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield Event(output='result') - - parent_ctx, events = _make_ctx() - parent_ctx._invocation_context.branch = 'parent_branch' - await NodeRunner( - node=_Node(name='n'), - parent_ctx=parent_ctx, - use_sub_branch=True, - run_id='1', - ).run() - - assert events[0].branch == 'parent_branch.n@1' - - -@pytest.mark.asyncio -async def test_sequential_branch_propagation(): - """NodeRunner inherits parent branch when use_sub_branch is False.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield Event(output='result') - - parent_ctx, events = _make_ctx() - parent_ctx._invocation_context.branch = 'parent_branch' - await NodeRunner( - node=_Node(name='n'), - parent_ctx=parent_ctx, - use_sub_branch=False, - ).run() - - assert events[0].branch == 'parent_branch' - - -@pytest.mark.asyncio -async def test_override_isolation_scope_used_in_node_runner(): - """NodeRunner sets isolation_scope on child context and enriches emitted events.""" - - class _Node(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - assert ctx.isolation_scope == 'task:fc-999' - yield Event(output='result') - - parent_ctx, events = _make_ctx() - await NodeRunner( - node=_Node(name='n'), - parent_ctx=parent_ctx, - override_isolation_scope='task:fc-999', - ).run() - - assert events[0].isolation_scope == 'task:fc-999' diff --git a/tests/unittests/workflow/test_node_runner_failure.py b/tests/unittests/workflow/test_node_runner_failure.py deleted file mode 100644 index 39ec0acb7f..0000000000 --- a/tests/unittests/workflow/test_node_runner_failure.py +++ /dev/null @@ -1,1121 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for NodeRunner retry logic on failures.""" - -import asyncio -import sys -from typing import Any -from typing import AsyncGenerator -from unittest import mock - -from google.adk.agents.context import Context -from google.adk.events.event import Event -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.workflow import BaseNode -from google.adk.workflow import Edge -from google.adk.workflow import START -from google.adk.workflow._errors import NodeTimeoutError -from google.adk.workflow._graph import Graph -from google.adk.workflow._node import node -from google.adk.workflow._node import Node -from google.adk.workflow._node_status import NodeStatus -from google.adk.workflow._retry_config import RetryConfig -from google.adk.workflow._workflow import Workflow -from google.genai import types -from pydantic import ConfigDict -from pydantic import Field -import pytest -from typing_extensions import override - -from .workflow_testing_utils import _FlakyNode -from .workflow_testing_utils import create_parent_invocation_context -from .workflow_testing_utils import CustomNonRetryableError -from .workflow_testing_utils import CustomRetryableError -from .workflow_testing_utils import simplify_events_with_node -from .workflow_testing_utils import TestingNode - - -async def _run_workflow(wf, message='start'): - """Run a Workflow through Runner, return collected events.""" - ss = InMemorySessionService() - runner = Runner(app_name=wf.name, node=wf, session_service=ss) - session = await ss.create_session(app_name=wf.name, user_id='u') - msg = types.Content(parts=[types.Part(text=message)], role='user') - events = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - return events, ss, session - - -@pytest.mark.asyncio -async def test_node_retries_on_matched_exception_string( - request: pytest.FixtureRequest, -): - """A node retries when raised exception matches a string name in RetryConfig.exceptions. - - Setup: Workflow with NodeA -> FlakyNode -> NodeC. FlakyNode fails twice with CustomRetryableError. - Act: Run the workflow. - Assert: FlakyNode succeeds on 3rd attempt, full workflow completes. - """ - - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - # Node will fail 2 times, then succeed on 3rd attempt - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=3, - tracker=tracker, - exception_to_raise=CustomRetryableError('Simulated failure'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=['CustomRetryableError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - agent = Workflow( - name='test_workflow_agent_retry', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - - events, _, _ = await _run_workflow(agent) - - results = simplify_events_with_node(events) - filtered_results = [ - r - for r in results - if not (isinstance(r[1], str) and 'Retrying in' in r[1]) - ] - assert filtered_results == [ - ( - 'test_workflow_agent_retry@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_workflow_agent_retry@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_workflow_agent_retry@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 3 - - -@pytest.mark.asyncio -async def test_node_fails_immediately_on_unmatched_exception_string( - request: pytest.FixtureRequest, -): - """A node fails immediately when raised exception does not match configured string names. - - Setup: Workflow with NodeA -> FlakyNode -> NodeC. FlakyNode fails with CustomNonRetryableError. - Act: Run the workflow. - Assert: Execution completes normally and emits CustomNonRetryableError event immediately without retry. - """ - - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - # Node will fail 1 time - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=CustomNonRetryableError('Unexpected failure'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=['CustomRetryableError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - agent = Workflow( - name='test_workflow_agent_no_retry', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - - ss = InMemorySessionService() - runner = Runner(app_name=agent.name, node=agent, session_service=ss) - session = await ss.create_session(app_name=agent.name, user_id='u') - msg = types.Content(parts=[types.Part(text='start')], role='user') - events = [] - - # When the workflow is executed - with pytest.raises(CustomNonRetryableError): - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - # Assert that the node error is persisted in session as an event - error_events = [ - e - for e in events - if isinstance(e, Event) and e.error_code == 'CustomNonRetryableError' - ] - assert len(error_events) == 1 - assert error_events[0].error_message == 'Unexpected failure' - - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_no_retry@1/NodeA@1', - {'output': 'Executing A'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 1 - - -@pytest.mark.asyncio -async def test_retry_occurs_for_any_exception_when_exceptions_not_specified( - request: pytest.FixtureRequest, -): - """A node retries on any exception when RetryConfig.exceptions is not specified. - - Setup: Workflow with NodeA -> FlakyNode. FlakyNode fails once with ValueError. - Act: Run the workflow with exceptions=None in RetryConfig. - Assert: FlakyNode succeeds on 2nd attempt, workflow completes. - """ - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - # Node will fail 1 time, then succeed - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=ValueError('Any failure'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=None, - ), - ) - agent = Workflow( - name='test_workflow_agent_retry_all', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - ], - ) - - events, _, _ = await _run_workflow(agent) - - results = simplify_events_with_node(events) - filtered_results = [ - r - for r in results - if not (isinstance(r[1], str) and 'Retrying in' in r[1]) - ] - assert filtered_results == [ - ( - 'test_workflow_agent_retry_all@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_workflow_agent_retry_all@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 2 - - -@pytest.mark.asyncio -async def test_node_receives_incrementing_attempt_counts( - request: pytest.FixtureRequest, -): - """A node receives the current attempt count in its context for each attempt. - - Setup: Workflow with NodeA -> FlakyNode -> NodeC. FlakyNode fails twice before success. - Act: Run the workflow. - Assert: FlakyNode observes attempt_counts [1, 2, 3] in context across attempts. - """ - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - # Node will fail 2 times, then succeed on 3rd attempt - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=3, - tracker=tracker, - exception_to_raise=CustomRetryableError('Simulated failure'), - retry_config=RetryConfig( - initial_delay=0.0, exceptions=['CustomRetryableError'] - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - agent = Workflow( - name='test_retry_count_populated_correctly', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - - events, _, _ = await _run_workflow(agent) - - results = simplify_events_with_node(events) - filtered_results = [ - r - for r in results - if not (isinstance(r[1], str) and 'Retrying in' in r[1]) - ] - assert filtered_results == [ - ( - 'test_retry_count_populated_correctly@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_retry_count_populated_correctly@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_retry_count_populated_correctly@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 3 - assert flaky_node_in_agent.tracker['attempt_counts'] == [1, 2, 3] - - -@pytest.mark.asyncio -async def test_node_stops_retrying_after_max_attempts( - request: pytest.FixtureRequest, -): - """A node fails with the original exception after exceeding max_attempts. - - Setup: Workflow with NodeA -> FlakyNode -> NodeC. FlakyNode fails persistently, max_attempts=3. - Act: Run the workflow. - Assert: Execution completes normally and emits CustomRetryableError event after 3 total attempts. - """ - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - # Node will fail 4 times, but max_attempts is 3. - # Total attempts = 3 (1 initial + 2 retries). - # Attempt 1: retry_count = 0, fails. - # Attempt 2: retry_count = 1, fails. - # Attempt 3: retry_count = 2, fails. Now _should_retry_node returns False. - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=5, - tracker=tracker, - exception_to_raise=CustomRetryableError('Persisted failure'), - retry_config=RetryConfig( - initial_delay=0.0, - max_attempts=3, - exceptions=['CustomRetryableError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - agent = Workflow( - name='test_workflow_agent_max_attempts', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - - ss = InMemorySessionService() - runner = Runner(app_name=agent.name, node=agent, session_service=ss) - session = await ss.create_session(app_name=agent.name, user_id='u') - msg = types.Content(parts=[types.Part(text='start')], role='user') - events = [] - - # When the workflow is executed - with pytest.raises(CustomRetryableError): - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - # Assert that the node error is persisted in session as an event after max attempts - error_events = [ - e - for e in events - if isinstance(e, Event) and e.error_code == 'CustomRetryableError' - ] - assert len(error_events) == 3 - for err in error_events: - assert err.error_message == 'Persisted failure' - - results = simplify_events_with_node(events) - filtered_results = [ - r - for r in results - if not (isinstance(r[1], str) and 'Retrying in' in r[1]) - ] - assert filtered_results == [ - ( - 'test_workflow_agent_max_attempts@1/NodeA@1', - {'output': 'Executing A'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 3 - - -@pytest.mark.asyncio -async def test_node_fails_immediately_without_retry_config( - request: pytest.FixtureRequest, -): - """A node fails immediately on exception when it has no retry configuration. - - Setup: Workflow with NodeA -> FlakyNode. FlakyNode has retry_config=None. - Act: Run the workflow. - Assert: Execution completes normally and emits ValueError event immediately on first failure. - """ - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - # Node will fail 1 time - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=ValueError('Any failure'), - retry_config=None, - ) - agent = Workflow( - name='test_workflow_agent_fails_without_retry_config', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - ], - ) - - ss = InMemorySessionService() - runner = Runner(app_name=agent.name, node=agent, session_service=ss) - session = await ss.create_session(app_name=agent.name, user_id='u') - msg = types.Content(parts=[types.Part(text='start')], role='user') - events = [] - - # When the workflow is executed - with pytest.raises(ValueError): - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - # Assert that the node error is persisted in session as an event - error_events = [ - e for e in events if isinstance(e, Event) and e.error_code == 'ValueError' - ] - assert len(error_events) == 1 - assert error_events[0].error_message == 'Any failure' - - results = simplify_events_with_node(events) - filtered_results = [ - r - for r in results - if not (isinstance(r[1], str) and 'Retrying in' in r[1]) - ] - assert filtered_results == [ - ( - 'test_workflow_agent_fails_without_retry_config@1/NodeA@1', - {'output': 'Executing A'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 1 - - -@pytest.mark.asyncio -async def test_node_retries_with_default_config_when_empty( - request: pytest.FixtureRequest, -): - """A node uses default retry settings when provided with an empty RetryConfig. - - Setup: Workflow with NodeA -> FlakyNode. FlakyNode has empty RetryConfig(). - Act: Run the workflow. - Assert: FlakyNode succeeds on 2nd attempt using default retry behavior. - """ - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - # Node will fail 1 time, then succeed - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=ValueError('Another failure'), - retry_config=RetryConfig(), - ) - agent = Workflow( - name='test_workflow_agent_retries_with_empty_retry_config', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - ], - ) - - events, _, _ = await _run_workflow(agent) - - results = simplify_events_with_node(events) - filtered_results = [ - r - for r in results - if not (isinstance(r[1], str) and 'Retrying in' in r[1]) - ] - assert filtered_results == [ - ( - 'test_workflow_agent_retries_with_empty_retry_config@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_workflow_agent_retries_with_empty_retry_config@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 2 - - -@pytest.mark.asyncio -async def test_node_waits_for_initial_delay_before_retry( - request: pytest.FixtureRequest, -): - """A node sleeps for the specified initial delay before attempting a retry. - - Setup: Workflow with NodeA -> FlakyNode -> NodeC. FlakyNode has initial_delay=5.0. - Act: Run the workflow, mocking asyncio.sleep. - Assert: FlakyNode succeeds on 2nd attempt, sleep called with 5.0. - """ - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=CustomRetryableError('Sleep test failure'), - retry_config=RetryConfig( - initial_delay=5.0, - max_attempts=3, - jitter=0.0, - exceptions=['CustomRetryableError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - agent = Workflow( - name='test_workflow_agent_retry_delay', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - - ss = InMemorySessionService() - runner = Runner(app_name=agent.name, node=agent, session_service=ss) - session = await ss.create_session(app_name=agent.name, user_id='u') - msg = types.Content(parts=[types.Part(text='start')], role='user') - - with mock.patch.object( - asyncio, 'sleep', new_callable=mock.AsyncMock - ) as mock_sleep: - events = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - mock_sleep.assert_any_await(5.0) - - results = simplify_events_with_node(events) - filtered_results = [ - r - for r in results - if not (isinstance(r[1], str) and 'Retrying in' in r[1]) - ] - assert filtered_results == [ - ( - 'test_workflow_agent_retry_delay@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_workflow_agent_retry_delay@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_workflow_agent_retry_delay@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 2 - - -@pytest.mark.asyncio -async def test_retry_applies_backoff_strategy(request: pytest.FixtureRequest): - """A node increases sleep delay on subsequent retries according to the backoff factor. - - Setup: Workflow with NodeA -> FlakyNode -> NodeC. initial_delay=2.0, backoff_factor=3.0. - Act: Run the workflow, mocking asyncio.sleep. - Assert: Sleep called with delays [2.0, 2.0, 6.0] matching backoff math. - """ - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=4, # Fails 3 times - tracker=tracker, - exception_to_raise=CustomRetryableError('Backoff test failure'), - retry_config=RetryConfig( - initial_delay=2.0, - max_attempts=5, - backoff_factor=3.0, - jitter=0.0, - exceptions=['CustomRetryableError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - agent = Workflow( - name='test_workflow_agent_retry_backoff', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - - ss = InMemorySessionService() - runner = Runner(app_name=agent.name, node=agent, session_service=ss) - session = await ss.create_session(app_name=agent.name, user_id='u') - msg = types.Content(parts=[types.Part(text='start')], role='user') - - with mock.patch('asyncio.sleep', new_callable=mock.AsyncMock) as mock_sleep: - events = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - # Attempt 1 (First Retry): fails, delay = 2.0 * (3.0 ** 0) = 2.0 - # Attempt 2 (Second Retry): fails, delay = 2.0 * (3.0 ** 1) = 6.0 - # Attempt 3 (Third Retry): fails, delay = 2.0 * (3.0 ** 2) = 18.0 - mock_sleep.assert_has_awaits( - [mock.call(2.0), mock.call(6.0), mock.call(18.0)] - ) - - results = simplify_events_with_node(events) - filtered_results = [ - r - for r in results - if not (isinstance(r[1], str) and 'Retrying in' in r[1]) - ] - assert filtered_results == [ - ( - 'test_workflow_agent_retry_backoff@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_workflow_agent_retry_backoff@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_workflow_agent_retry_backoff@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 4 - - -@pytest.mark.asyncio -async def test_retry_applies_random_jitter(request: pytest.FixtureRequest): - """A node adjusts retry delay with random jitter when configured. - - Setup: Workflow with NodeA -> FlakyNode -> NodeC. jitter=0.5, initial_delay=4.0. - Act: Run the workflow, mocking random.uniform to return -1.0. - Assert: Sleep called with 3.0 (4.0 + -1.0). - """ - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=CustomRetryableError('Jitter test failure'), - retry_config=RetryConfig( - initial_delay=4.0, - max_attempts=3, - backoff_factor=1.0, - jitter=0.5, - exceptions=['CustomRetryableError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - agent = Workflow( - name='test_workflow_agent_retry_jitter', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - - ss = InMemorySessionService() - runner = Runner(app_name=agent.name, node=agent, session_service=ss) - session = await ss.create_session(app_name=agent.name, user_id='u') - msg = types.Content(parts=[types.Part(text='start')], role='user') - - with ( - mock.patch('asyncio.sleep', new_callable=mock.AsyncMock) as mock_sleep, - mock.patch('random.uniform', return_value=-1.0) as mock_random, - ): - events = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - # 4.0 + (-1.0) = 3.0 - mock_sleep.assert_any_await(3.0) - # Called with -0.5 * 4.0, 0.5 * 4.0 - mock_random.assert_called_once_with(-2.0, 2.0) - - results = simplify_events_with_node(events) - filtered_results = [ - r - for r in results - if not (isinstance(r[1], str) and 'Retrying in' in r[1]) - ] - assert filtered_results == [ - ( - 'test_workflow_agent_retry_jitter@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_workflow_agent_retry_jitter@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_workflow_agent_retry_jitter@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 2 - - -@pytest.mark.asyncio -async def test_node_retries_on_exception_class_match( - request: pytest.FixtureRequest, -): - """A node retries when raised exception matches a class type in RetryConfig.exceptions. - - Setup: Workflow with NodeA -> FlakyNode -> NodeC. exceptions=[CustomRetryableError] (class). - Act: Run the workflow. - Assert: FlakyNode succeeds on 3rd attempt after matching exception class. - """ - - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=3, - tracker=tracker, - exception_to_raise=CustomRetryableError('Simulated failure'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=[CustomRetryableError], # class, not string - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - agent = Workflow( - name='test_retry_exception_classes', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - - events, _, _ = await _run_workflow(agent) - - results = simplify_events_with_node(events) - filtered_results = [ - r - for r in results - if not (isinstance(r[1], str) and 'Retrying in' in r[1]) - ] - assert filtered_results == [ - ( - 'test_retry_exception_classes@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_retry_exception_classes@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_retry_exception_classes@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 3 - - -@pytest.mark.asyncio -async def test_node_retries_on_mixed_exception_types( - request: pytest.FixtureRequest, -): - """A node retries when exception matches either string name or class type in config. - - Setup: Workflow with NodeA -> FlakyNode -> NodeC. exceptions=[CustomRetryableError, 'ValueError']. - Act: Run the workflow. - Assert: FlakyNode succeeds on 2nd attempt after matching mixed types. - """ - - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=CustomRetryableError('Simulated failure'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=[CustomRetryableError, 'ValueError'], # mixed - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - agent = Workflow( - name='test_retry_mixed_exceptions', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - - events, _, _ = await _run_workflow(agent) - - results = simplify_events_with_node(events) - filtered_results = [ - r - for r in results - if not (isinstance(r[1], str) and 'Retrying in' in r[1]) - ] - assert filtered_results == [ - ( - 'test_retry_mixed_exceptions@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_retry_mixed_exceptions@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_retry_mixed_exceptions@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 2 - - -@pytest.mark.asyncio -async def test_node_fails_immediately_on_unmatched_exception_class( - request: pytest.FixtureRequest, -): - """A node fails immediately when raised exception does not match configured class types. - - Setup: Workflow with NodeA -> FlakyNode. exceptions=[CustomRetryableError] (class). - Act: Run the workflow. FlakyNode raises CustomNonRetryableError. - Assert: Execution completes normally and emits CustomNonRetryableError event immediately. - """ - - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=3, - tracker=tracker, - exception_to_raise=CustomNonRetryableError('Unexpected failure'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=[CustomRetryableError], # class, won't match - ), - ) - agent = Workflow( - name='test_retry_exception_class_no_match', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - ], - ) - - ss = InMemorySessionService() - runner = Runner(app_name=agent.name, node=agent, session_service=ss) - session = await ss.create_session(app_name=agent.name, user_id='u') - msg = types.Content(parts=[types.Part(text='start')], role='user') - events = [] - - # When the workflow is executed - with pytest.raises(CustomNonRetryableError): - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - # Assert that the node error is persisted in session as an event - error_events = [ - e - for e in events - if isinstance(e, Event) and e.error_code == 'CustomNonRetryableError' - ] - assert len(error_events) == 1 - assert error_events[0].error_message == 'Unexpected failure' - - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 1 - - -def test_retry_config_rejects_invalid_exception_types(): - """Tests that RetryConfig rejects non-string, non-class exception entries.""" - with pytest.raises(ValueError, match='exception class names'): - RetryConfig(exceptions=[42]) - - -def test_retry_config_normalizes_classes_to_strings(): - """Tests that exception classes are normalized to their names.""" - config = RetryConfig(exceptions=[ValueError, 'KeyError']) - assert config.exceptions == ['ValueError', 'KeyError'] - - -@pytest.mark.asyncio -async def test_error_event_emitted_on_failure( - request: pytest.FixtureRequest, -): - """Tests that an error event is emitted when a node raises an exception. - - Setup: Workflow with NodeA -> FlakyNode. FlakyNode fails with ValueError. - Act: Run the workflow. - Assert: Execution completes normally and emits ValueError event. - """ - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=999, - tracker=tracker, - exception_to_raise=ValueError('Something went wrong'), - retry_config=None, - ) - agent = Workflow( - name='test_error_event', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - ], - ) - - ss = InMemorySessionService() - runner = Runner(app_name=agent.name, node=agent, session_service=ss) - session = await ss.create_session(app_name=agent.name, user_id='u') - msg = types.Content(parts=[types.Part(text='start')], role='user') - events = [] - - # When the workflow is executed - with pytest.raises(ValueError): - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - # Find the error event emitted by the failed node. - error_events = [ - e - for e in events - if isinstance(e, Event) - and e.error_code is not None - and e.node_name == 'FlakyNode' - ] - assert len(error_events) == 1 - assert error_events[0].error_code == 'ValueError' - assert error_events[0].error_message == 'Something went wrong' - - -@pytest.mark.asyncio -async def test_error_event_emitted_on_each_retry( - request: pytest.FixtureRequest, -): - """Tests that an error event is emitted for each failed retry attempt.""" - tracker = {'iteration_count': 0} - - # Node will fail 2 times, then succeed on 3rd attempt - flaky_node = _FlakyNode( - name='FlakyNode', - message='Success', - succeed_on_iteration=3, - tracker=tracker, - exception_to_raise=CustomRetryableError('Transient error'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=['CustomRetryableError'], - ), - ) - agent = Workflow( - name='test_error_event_retry', - edges=[ - Edge(from_node=START, to_node=flaky_node), - ], - ) - - ss = InMemorySessionService() - runner = Runner(app_name=agent.name, node=agent, session_service=ss) - session = await ss.create_session(app_name=agent.name, user_id='u') - msg = types.Content(parts=[types.Part(text='start')], role='user') - events = [] - - # When the workflow is executed - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - # Two failures before success → two error events. - error_events = [ - e - for e in events - if isinstance(e, Event) - and e.error_code is not None - and e.node_name == 'FlakyNode' - ] - assert len(error_events) == 2 - for err in error_events: - assert err.error_code == 'CustomRetryableError' - assert err.error_message == 'Transient error' - - # The node should still produce its output after retries. - results = simplify_events_with_node(events) - filtered_results = [ - r - for r in results - if not (isinstance(r[1], str) and 'Retrying in' in r[1]) - ] - assert filtered_results == [ - ( - 'test_error_event_retry@1/FlakyNode@1', - {'output': 'Success'}, - ), - ] - - -@pytest.mark.skipif( - sys.version_info < (3, 11), reason='asyncio.timeout requires Python 3.11+' -) -async def test_node_runner_timeout(): - async def slow_route(ctx, node_input): - await asyncio.sleep(2) - return 'done' - - node = TestingNode(name='SlowNode', route=slow_route, timeout=0.1) - - agent = Workflow( - name='test_timeout', - edges=[(START, node)], - ) - - # Workflow should yield a timeout error event - with pytest.raises(NodeTimeoutError) as exc_info: - await _run_workflow(agent) - assert 'SlowNode' in str(exc_info.value) - assert 'timed out' in str(exc_info.value) - - -@pytest.mark.skip( - reason='Timeout is now supported in Python 3.10 via asyncio.wait_for', -) -async def test_node_runner_timeout_warning(caplog): - async def slow_route(ctx, node_input): - await asyncio.sleep(0.5) - return 'done' - - node = TestingNode(name='SlowNode', route=slow_route, timeout=0.1) - - agent = Workflow( - name='test_timeout_warning', - edges=[(START, node)], - ) - - await _run_workflow(agent) - - assert ( - 'timeout 0.10 seconds is ignored because Python version is < 3.11' - in caplog.text - ) diff --git a/tests/unittests/workflow/test_node_runner_integration.py b/tests/unittests/workflow/test_node_runner_integration.py deleted file mode 100644 index ebf724e92e..0000000000 --- a/tests/unittests/workflow/test_node_runner_integration.py +++ /dev/null @@ -1,539 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for NodeRunner ↔ node integration. - -Verifies that NodeRunner correctly drives BaseNode.run(), enriches -events, flushes state/artifact deltas, and delivers events to the -session. -""" - -from typing import Any -from typing import AsyncGenerator -from unittest.mock import AsyncMock -from unittest.mock import MagicMock - -from google.adk.agents.base_agent import BaseAgent -from google.adk.agents.context import Context -from google.adk.agents.invocation_context import InvocationContext -from google.adk.events.event import Event -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.sessions.session import Session -from google.adk.workflow._base_node import BaseNode -from google.adk.workflow._node_runner import NodeRunner -from google.genai import types -import pytest - -# --- Test helper nodes --- - - -class _EchoNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield node_input - - -class _EmptyNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - return - yield - - -class _MultiEventNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(author='step1') - yield Event(author='step2') - yield Event(author='step3') - - -class _InterruptNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='long_tool', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - -class _InterruptThenMoreNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='long_tool', args={}, id='fc-2' - ) - ) - ] - ), - long_running_tool_ids={'fc-2'}, - ) - yield Event(author='after_interrupt_1') - yield Event(author='after_interrupt_2') - - -class _ErrorNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - raise RuntimeError('node failure') - yield # pylint: disable=unreachable - - -class _OutputWithRouteNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(output='routed_output', route='next') - - -class _StateMutatingNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - ctx.state['key1'] = 'value1' - ctx.state['key2'] = 42 - yield 'done' - - -class _ResumeInputReadingNode(BaseNode): - captured: list[Any] = [] - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - self.captured.append(ctx.resume_inputs) - yield 'resumed' - - -class _ArtifactSavingNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - ctx.actions.artifact_delta['doc.txt'] = 1 - yield 'saved' - - -# --- Helpers --- - - -def _make_ctx(invocation_id='inv-test', enqueue_events=None, node_path=''): - """Create a minimal Context mock with IC.""" - - mock_agent = MagicMock(spec=BaseAgent) - real_session = Session( - id='test_session', app_name='test_app', user_id='test_user' - ) - real_session_service = InMemorySessionService() - - ic = InvocationContext( - invocation_id=invocation_id, - agent=mock_agent, - session=real_session, - session_service=real_session_service, - ) - - collected = enqueue_events if enqueue_events is not None else [] - - async def _enqueue(event): - collected.append(event) - - object.__setattr__(ic, '_enqueue_event', AsyncMock(side_effect=_enqueue)) - - ctx = Context( - invocation_context=ic, - node_path=node_path, - ) - return ctx, collected - - -# --- Tests --- - - -@pytest.mark.asyncio -async def test_node_output_returned_in_result(): - """Running a node that produces output returns it in the result.""" - node = _EchoNode(name='echo') - ctx, _ = _make_ctx() - result = await NodeRunner(node=node, parent_ctx=ctx).run(node_input='hello') - assert result.output == 'hello' - assert result.interrupt_ids == set() - - -@pytest.mark.asyncio -async def test_no_output_returns_none(): - """Running a node that produces no output returns None.""" - node = _EmptyNode(name='empty') - ctx, _ = _make_ctx() - result = await NodeRunner(node=node, parent_ctx=ctx).run() - assert result.output is None - assert result.interrupt_ids == set() - - -@pytest.mark.asyncio -async def test_event_author_is_node_name(): - """Events are authored by the node's name.""" - node = _EchoNode(name='my_node') - ctx, events = _make_ctx() - await NodeRunner(node=node, parent_ctx=ctx).run(node_input='data') - - output_events = [e for e in events if e.output is not None] - assert output_events[0].author == 'my_node' - - -@pytest.mark.asyncio -async def test_event_path_contains_node_name(): - """Event node_info.path includes the node name and execution context.""" - node = _EchoNode(name='path_test') - ctx, events = _make_ctx(invocation_id='inv-123') - runner = NodeRunner(node=node, parent_ctx=ctx, run_id='exec-456') - await runner.run(node_input='data') - - output_events = [e for e in events if e.output is not None] - event = output_events[0] - assert event.node_info.path == 'path_test@exec-456' - assert event.invocation_id == 'inv-123' - - -@pytest.mark.asyncio -async def test_interrupt_captured_in_result(): - """A node that signals an interrupt reports it in the result.""" - node = _InterruptNode(name='interrupt_node') - ctx, _ = _make_ctx() - result = await NodeRunner(node=node, parent_ctx=ctx).run() - assert 'fc-1' in result.interrupt_ids - - -@pytest.mark.asyncio -async def test_node_continues_after_interrupt(): - """A node that interrupts can still produce more events before finishing.""" - node = _InterruptThenMoreNode(name='flag_finish') - ctx, events = _make_ctx() - result = await NodeRunner(node=node, parent_ctx=ctx).run() - assert 'fc-2' in result.interrupt_ids - assert len(events) >= 3 - - -@pytest.mark.asyncio -async def test_state_mutations_emitted_as_delta(): - """State changes made by a node are delivered as a separate event.""" - node = _StateMutatingNode(name='state_node') - ctx, events = _make_ctx() - await NodeRunner(node=node, parent_ctx=ctx).run() - - all_deltas = {} - for e in events: - if e.actions.state_delta: - all_deltas.update(e.actions.state_delta) - assert all_deltas.get('key1') == 'value1' - assert all_deltas.get('key2') == 42 - - -@pytest.mark.asyncio -async def test_artifact_delta_emitted(): - """Artifact saves made by a node are delivered as a delta event.""" - node = _ArtifactSavingNode(name='artifact_node') - ctx, events = _make_ctx() - await NodeRunner(node=node, parent_ctx=ctx).run() - - artifact_deltas = {} - for e in events: - if e.actions.artifact_delta: - artifact_deltas.update(e.actions.artifact_delta) - assert 'doc.txt' in artifact_deltas - - -@pytest.mark.asyncio -async def test_events_enqueued_in_yield_order(): - """Multiple events from a node arrive in the order they were produced.""" - node = _MultiEventNode(name='multi') - ctx, events = _make_ctx() - await NodeRunner(node=node, parent_ctx=ctx).run() - - # All 3 events enqueued, authored by node name (framework overrides). - assert len(events) == 3 - assert all(e.author == 'multi' for e in events) - - -@pytest.mark.asyncio -async def test_node_exception_propagates(): - """A node that raises an error surfaces it to the caller.""" - node = _ErrorNode(name='error_node') - ctx, events = _make_ctx() - child_ctx = await NodeRunner(node=node, parent_ctx=ctx).run() - - # Verify error is recorded on returned context - assert child_ctx.error is not None - assert isinstance(child_ctx.error, RuntimeError) - assert str(child_ctx.error) == 'node failure' - - # Verify error event was enqueued - error_events = [e for e in events if e.error_code] - assert len(error_events) == 1 - assert error_events[0].error_code == 'RuntimeError' - assert 'node failure' in error_events[0].error_message - - -@pytest.mark.asyncio -async def test_resume_inputs_available_on_context(): - """Resume inputs are accessible to the node during execution.""" - node = _ResumeInputReadingNode(name='resume_node') - node.captured = [] - ctx, _ = _make_ctx() - resume = {'int-1': 'user_response'} - await NodeRunner(node=node, parent_ctx=ctx).run(resume_inputs=resume) - assert node.captured[0] == resume - - -@pytest.mark.asyncio -async def test_node_path_includes_parent(): - """A child node's node_path is parent_node_path/child_name.""" - node = _EchoNode(name='child') - ctx, events = _make_ctx(node_path='parent_path') - runner = NodeRunner(node=node, parent_ctx=ctx) - await runner.run(node_input='x') - - output_events = [e for e in events if e.output is not None] - assert output_events[0].node_info.path == 'parent_path/child@1' - - -@pytest.mark.asyncio -async def test_run_id_generated_when_omitted(): - """Each node run gets a unique execution ID by default.""" - node = _EchoNode(name='auto_id') - ctx, _ = _make_ctx() - - runner = NodeRunner(node=node, parent_ctx=ctx) - - assert runner.run_id - assert isinstance(runner.run_id, str) - - -@pytest.mark.asyncio -async def test_explicit_run_id_used(): - """A caller-specified execution ID is used on the runner and events.""" - node = _EchoNode(name='explicit_id') - ctx, events = _make_ctx() - - runner = NodeRunner(node=node, parent_ctx=ctx, run_id='my-exec-id') - - assert runner.run_id == 'my-exec-id' - await runner.run(node_input='data') - assert events[0].node_info.path == 'explicit_id@my-exec-id' - - -@pytest.mark.asyncio -async def test_route_captured_in_result(): - """A node's routing decision is available in the result.""" - node = _OutputWithRouteNode(name='route_node') - ctx, _ = _make_ctx() - result = await NodeRunner(node=node, parent_ctx=ctx).run() - assert result.output == 'routed_output' - assert result.route == 'next' - - -@pytest.mark.asyncio -async def test_preset_author_overridden_by_framework(): - """Framework always sets author — preset author is overridden.""" - node = _MultiEventNode(name='multi') - ctx, events = _make_ctx() - await NodeRunner(node=node, parent_ctx=ctx).run() - - # All events get node name, not the preset 'step1'/'step2'/'step3'. - assert all(e.author == 'multi' for e in events) - - -class _MultiOutputNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(output='first') - yield Event(output='second') - - -@pytest.mark.asyncio -async def test_multiple_outputs_raises(): - """A node that produces more than one output is rejected.""" - node = _MultiOutputNode(name='multi_out') - ctx, events = _make_ctx() - await NodeRunner(node=node, parent_ctx=ctx).run() - error_events = [e for e in events if e.error_code] - assert len(error_events) == 1 - assert error_events[0].error_code == 'ValueError' - assert 'at most one output' in error_events[0].error_message - - -@pytest.mark.asyncio -async def test_all_events_delivered(): - """All events from a node are delivered to the session.""" - node = _EchoNode(name='enqueue_test') - ctx, events = _make_ctx() - await NodeRunner(node=node, parent_ctx=ctx).run(node_input='data') - assert len(events) >= 1 - - -# --- Delta flushing tests --- - - -@pytest.mark.asyncio -async def test_state_delta_bundled_with_output_event(): - """State deltas set before yield are flushed onto the output event.""" - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - ctx.state['color'] = 'blue' - ctx.state['count'] = 7 - yield 'result' - - ctx, events = _make_ctx() - - await NodeRunner(node=_Node(name='bundled'), parent_ctx=ctx).run() - - assert len(events) == 1 - assert events[0].output == 'result' - assert events[0].actions.state_delta.get('color') == 'blue' - assert events[0].actions.state_delta.get('count') == 7 - - -@pytest.mark.asyncio -async def test_state_after_last_yield_emitted_separately(): - """State set after the last yield is emitted as a separate event.""" - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield 'early' - ctx.state['late_key'] = 'late_value' - - ctx, events = _make_ctx() - - await NodeRunner(node=_Node(name='late_state'), parent_ctx=ctx).run() - - assert events[0].output == 'early' - assert events[1].actions.state_delta.get('late_key') == 'late_value' - - -@pytest.mark.asyncio -async def test_deltas_skip_partial_events(): - """Partial events carry no deltas — deltas flush to next non-partial.""" - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - ctx.state['before_partial'] = True - yield Event( - content=types.Content(parts=[types.Part(text='streaming...')]), - partial=True, - ) - ctx.state['after_partial'] = True - yield 'final' - - ctx, events = _make_ctx() - - await NodeRunner(node=_Node(name='partial_skip'), parent_ctx=ctx).run() - - assert events[0].partial is True - assert not events[0].actions or not events[0].actions.state_delta - assert events[1].output == 'final' - assert events[1].actions.state_delta.get('before_partial') is True - assert events[1].actions.state_delta.get('after_partial') is True - - -@pytest.mark.asyncio -async def test_artifact_and_state_bundled_together(): - """Both state and artifact deltas are flushed onto the same event.""" - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - ctx.state['s1'] = 'v1' - ctx.actions.artifact_delta['file.txt'] = 1 - yield 'done' - - ctx, events = _make_ctx() - - await NodeRunner(node=_Node(name='both_deltas'), parent_ctx=ctx).run() - - assert len(events) == 1 - assert events[0].output == 'done' - assert events[0].actions.state_delta.get('s1') == 'v1' - assert events[0].actions.artifact_delta.get('file.txt') == 1 - - -@pytest.mark.asyncio -async def test_node_input_schema_validation(): - """NodeRunner fails if node input does not match input_schema.""" - from pydantic import BaseModel - from pydantic import ValidationError - - class _MyInput(BaseModel): - name: str - age: int - - node = _EchoNode(name='schema_node', input_schema=_MyInput) - ctx, _ = _make_ctx() - - # Valid input (dict that matches schema) - result = await NodeRunner(node=node, parent_ctx=ctx).run( - node_input={'name': 'Alice', 'age': 30} - ) - - # _validate_schema converts model instances to dicts! - assert isinstance(result.output, dict) - assert result.output['name'] == 'Alice' - assert result.output['age'] == 30 - - # Invalid input (missing field) - result = await NodeRunner(node=node, parent_ctx=ctx).run( - node_input={'name': 'Alice'} - ) - - assert result.error is not None - assert isinstance(result.error, ValidationError) diff --git a/tests/unittests/workflow/test_state_schema.py b/tests/unittests/workflow/test_state_schema.py deleted file mode 100644 index 0ba83cdd9d..0000000000 --- a/tests/unittests/workflow/test_state_schema.py +++ /dev/null @@ -1,424 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for Workflow state_schema runtime enforcement.""" - -from __future__ import annotations - -from typing import Optional - -from google.adk.agents.context import Context -from google.adk.apps.app import App -from google.adk.events.event import Event -from google.adk.sessions.state import State -from google.adk.sessions.state import StateSchemaError -from google.adk.workflow import FunctionNode -from google.adk.workflow import START -from google.adk.workflow._workflow import Workflow -from pydantic import BaseModel -import pytest - -from .. import testing_utils -from .workflow_testing_utils import create_parent_invocation_context - -# ── Schema models for testing ──────────────────────────────────────── - - -class _PipelineSchema(BaseModel): - counter: int - name: str - optional_field: Optional[str] = None - - -class _NodeSchema(BaseModel): - x: int - y: int - - -# ── Unit tests: State validation ───────────────────────────────────── - - -def test_state_rejects_unknown_key() -> None: - """State with schema raises on unknown key.""" - state = State(value={}, delta={}, schema=_PipelineSchema) - with pytest.raises(StateSchemaError, match='bad_key'): - state['bad_key'] = 'value' - - -def test_state_accepts_declared_key() -> None: - """State with schema accepts keys that exist in the schema.""" - state = State(value={}, delta={}, schema=_PipelineSchema) - state['counter'] = 5 - state['name'] = 'hello' - assert state['counter'] == 5 - assert state['name'] == 'hello' - - -def test_state_rejects_wrong_type() -> None: - """State with schema raises when value type doesn't match annotation.""" - state = State(value={}, delta={}, schema=_PipelineSchema) - with pytest.raises(StateSchemaError, match='counter'): - state['counter'] = 'not_an_int' - - -def test_state_accepts_optional_none() -> None: - """Optional fields accept None.""" - state = State(value={}, delta={}, schema=_PipelineSchema) - state['optional_field'] = None - assert state['optional_field'] is None - - -def test_state_allows_prefixed_keys() -> None: - """Prefixed keys (app:, user:, temp:) bypass schema validation.""" - state = State(value={}, delta={}, schema=_PipelineSchema) - state['app:anything'] = 'value' - state['user:pref'] = 42 - state['temp:cache'] = [1, 2, 3] - assert state['app:anything'] == 'value' - - -def test_state_update_validates_all_keys() -> None: - """State.update validates each key-value pair.""" - state = State(value={}, delta={}, schema=_PipelineSchema) - with pytest.raises(StateSchemaError, match='unknown'): - state.update({'counter': 1, 'unknown': 'x'}) - - -def test_state_no_schema_allows_all() -> None: - """Without schema, any key/value is accepted (backward compat).""" - state = State(value={}, delta={}) - state['anything'] = 'goes' - state['whatever'] = 42 - assert state['anything'] == 'goes' - - -# ── Startup validation tests ───────────────────────────────────────── - - -def test_startup_rejects_mismatched_param() -> None: - """FunctionNode param not in state_schema raises at construction.""" - - def node_with_bad_param(ctx: Context, unknown_param: str) -> str: - return 'done' - - with pytest.raises(StateSchemaError, match='unknown_param'): - Workflow( - name='wf', - edges=[(START, node_with_bad_param)], - state_schema=_PipelineSchema, - ) - - -def test_startup_accepts_matching_params() -> None: - """FunctionNode params matching schema fields pass construction.""" - - def node_with_good_params(ctx: Context, counter: int, name: str) -> str: - return 'done' - - wf = Workflow( - name='wf', - edges=[(START, node_with_good_params)], - state_schema=_PipelineSchema, - ) - assert wf.state_schema is _PipelineSchema - - -def test_startup_skips_ctx_and_node_input() -> None: - """Framework params (ctx, node_input) are not checked against schema.""" - - def node_with_framework_params(ctx: Context, node_input: str) -> str: - return 'done' - - Workflow( - name='wf', - edges=[(START, node_with_framework_params)], - state_schema=_PipelineSchema, - ) - - -def test_startup_no_validation_when_schema_none() -> None: - """No startup validation when state_schema is not set.""" - - def node_with_any_param(ctx: Context, anything: str) -> str: - return 'done' - - Workflow( - name='wf', - edges=[(START, node_with_any_param)], - ) - - -def test_workflow_state_schema_field_exists() -> None: - """Workflow accepts a state_schema parameter.""" - - def produce_done(): - return Event(output='done') - - wf = Workflow( - name='wf', - edges=[(START, produce_done)], - state_schema=_PipelineSchema, - ) - assert wf.state_schema is _PipelineSchema - - -def test_workflow_state_schema_defaults_to_none() -> None: - """state_schema defaults to None when not provided.""" - - def produce_done(): - return Event(output='done') - - wf = Workflow( - name='wf', - edges=[(START, produce_done)], - ) - assert wf.state_schema is None - - -# ── Runtime enforcement tests (workflow execution) ─────────────────── - - -@pytest.mark.asyncio -async def test_workflow_valid_state_writes_succeed( - request: pytest.FixtureRequest, -) -> None: - """A workflow with valid state writes runs without errors.""" - - def write_state(ctx: Context) -> str: - ctx.state['counter'] = 5 - ctx.state['name'] = 'hello' - return 'done' - - wf = Workflow( - name='wf', - edges=[(START, write_state)], - state_schema=_PipelineSchema, - ) - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'done' for e in data_events) - - -@pytest.mark.asyncio -async def test_workflow_rejects_unknown_key_via_ctx_state( - request: pytest.FixtureRequest, -) -> None: - """ctx.state write with unknown key raises StateSchemaError.""" - - def write_bad_key(ctx: Context) -> str: - ctx.state['unknown_key'] = 'value' - return 'done' - - wf = Workflow( - name='wf', - edges=[(START, write_bad_key)], - state_schema=_PipelineSchema, - ) - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(StateSchemaError, match='unknown_key'): - await runner.run_async(testing_utils.get_user_content('start')) - - -@pytest.mark.asyncio -async def test_workflow_rejects_unknown_key_via_event_state( - request: pytest.FixtureRequest, -) -> None: - """Event(state={...}) with unknown key raises StateSchemaError.""" - - def emit_bad_state() -> Event: - return Event(state={'arbitrary_key': 'value'}, output='done') - - wf = Workflow( - name='wf', - edges=[(START, emit_bad_state)], - state_schema=_PipelineSchema, - ) - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(StateSchemaError, match='arbitrary_key'): - await runner.run_async(testing_utils.get_user_content('start')) - - -@pytest.mark.asyncio -async def test_workflow_accepts_valid_event_state( - request: pytest.FixtureRequest, -) -> None: - """Event(state={...}) with valid keys succeeds.""" - - def emit_valid_state() -> Event: - return Event(state={'counter': 10, 'name': 'ok'}, output='done') - - wf = Workflow( - name='wf', - edges=[(START, emit_valid_state)], - state_schema=_PipelineSchema, - ) - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'done' for e in data_events) - - -@pytest.mark.asyncio -async def test_workflow_allows_prefixed_keys_at_runtime( - request: pytest.FixtureRequest, -) -> None: - """Prefixed keys bypass schema validation during workflow execution.""" - - def write_prefixed(ctx: Context) -> str: - ctx.state['temp:debug'] = True - ctx.state['app:config'] = 'val' - return 'done' - - wf = Workflow( - name='wf', - edges=[(START, write_prefixed)], - state_schema=_PipelineSchema, - ) - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'done' for e in data_events) - - -@pytest.mark.asyncio -async def test_workflow_without_schema_allows_anything( - request: pytest.FixtureRequest, -) -> None: - """When state_schema=None, any key/value is accepted (backward compat).""" - - def write_anything(ctx: Context) -> str: - ctx.state['any_key'] = 'any_value' - ctx.state['another'] = 42 - return 'done' - - wf = Workflow( - name='wf', - edges=[(START, write_anything)], - ) - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'done' for e in data_events) - - -# ── Per-node state_schema tests ──────────────────────────────────── - - -@pytest.mark.asyncio -async def test_node_level_schema_validates_writes( - request: pytest.FixtureRequest, -) -> None: - """A FunctionNode with its own state_schema validates state writes.""" - - def write_bad_key(ctx: Context) -> str: - ctx.state['bad_key'] = 'value' - return 'done' - - node = FunctionNode( - name='guarded', - func=write_bad_key, - state_schema=_NodeSchema, - ) - wf = Workflow( - name='wf', - edges=[(START, node)], - ) - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(StateSchemaError, match='bad_key'): - await runner.run_async(testing_utils.get_user_content('start')) - - -@pytest.mark.asyncio -async def test_node_level_schema_accepts_valid_writes( - request: pytest.FixtureRequest, -) -> None: - """A FunctionNode with its own state_schema accepts declared keys.""" - - def write_good_keys(ctx: Context) -> str: - ctx.state['x'] = 1 - ctx.state['y'] = 2 - return 'done' - - node = FunctionNode( - name='guarded', - func=write_good_keys, - state_schema=_NodeSchema, - ) - wf = Workflow( - name='wf', - edges=[(START, node)], - ) - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'done' for e in data_events) - - -@pytest.mark.asyncio -async def test_node_schema_overrides_workflow_schema( - request: pytest.FixtureRequest, -) -> None: - """Node-level state_schema takes precedence over workflow-level schema.""" - - def write_node_key(ctx: Context) -> str: - ctx.state['x'] = 10 - return 'done' - - node = FunctionNode( - name='guarded', - func=write_node_key, - state_schema=_NodeSchema, - ) - wf = Workflow( - name='wf', - edges=[(START, node)], - state_schema=_PipelineSchema, - ) - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - # 'x' is in _NodeSchema but NOT in _PipelineSchema — should succeed - # because node schema overrides workflow schema - events = await runner.run_async(testing_utils.get_user_content('start')) - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'done' for e in data_events) - - -@pytest.mark.asyncio -async def test_node_without_schema_inherits_workflow_schema( - request: pytest.FixtureRequest, -) -> None: - """Node without state_schema inherits validation from parent workflow.""" - - def write_bad_key(ctx: Context) -> str: - ctx.state['unknown'] = 'value' - return 'done' - - wf = Workflow( - name='wf', - edges=[(START, write_bad_key)], - state_schema=_PipelineSchema, - ) - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(StateSchemaError, match='unknown'): - await runner.run_async(testing_utils.get_user_content('start')) diff --git a/tests/unittests/workflow/test_task_api_e2e.py b/tests/unittests/workflow/test_task_api_e2e.py deleted file mode 100644 index 29bfb86d0c..0000000000 --- a/tests/unittests/workflow/test_task_api_e2e.py +++ /dev/null @@ -1,525 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""End-to-end tests for the Task Delegation API matrix. - -Covers the complete cross-product of dispatch-shape × hierarchy-depth so -the chat-coordinator wrapper, the workflow-node task path, and the -nested-delegation path are all exercised: - -* LlmAgent root → single task sub-agent (basic FC delegation). -* LlmAgent root → multiple task sub-agents (sequential delegation). -* LlmAgent root → task sub-agent → nested task sub-agent (chained). -* Workflow with a task-mode node (no FC delegation). -* Workflow with a task-mode node that itself has a task sub-agent. -* Dynamic node case (task agent dispatched via ``ctx.run_node``). -""" - -from __future__ import annotations - -from typing import Any -from typing import AsyncGenerator - -from google.adk.agents.context import Context -from google.adk.agents.llm_agent import LlmAgent -from google.adk.apps.app import App -from google.adk.events.event import Event -from google.adk.workflow import node -from google.adk.workflow import START -from google.adk.workflow._base_node import BaseNode -from google.adk.workflow._workflow import Workflow -from google.genai import types -from pydantic import BaseModel -import pytest - -from tests.unittests import testing_utils - -# --------------------------------------------------------------------------- -# Fixture helpers -# --------------------------------------------------------------------------- - - -def _delegate_part(target_name: str, request_text: str) -> types.Part: - """LLM response calling a task sub-agent (the _TaskAgentTool FC).""" - return types.Part.from_function_call( - name=target_name, args={'request': request_text} - ) - - -def _finish_part(args: dict[str, Any]) -> types.Part: - """LLM response calling finish_task with the given args.""" - return types.Part.from_function_call(name='finish_task', args=args) - - -def _text_part(text: str) -> types.Part: - return types.Part.from_text(text=text) - - -def _make_task_agent( - name: str, - responses: list, - *, - sub_agents: list[LlmAgent] | None = None, -) -> LlmAgent: - return LlmAgent( - name=name, - model=testing_utils.MockModel.create(responses=responses), - mode='task', - sub_agents=sub_agents or [], - ) - - -def _collect_finish_outputs(events: list[Event]) -> list[Any]: - """Pull out finish_task FC arg dicts in chronological order.""" - out = [] - for e in events: - for fc in e.get_function_calls(): - if fc.name == 'finish_task': - out.append(dict(fc.args or {})) - return out - - -def _get_text_responses(events: list[Event]) -> list[str]: - """Concatenate text responses from all model events.""" - texts = [] - for e in events: - if not e.content or not e.content.parts: - continue - for p in e.content.parts: - if p.text and not p.thought: - texts.append(p.text) - return texts - - -# --------------------------------------------------------------------------- -# 1. LlmAgent root → single task sub-agent -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_chat_root_with_single_task_sub_agent( - request: pytest.FixtureRequest, -): - """Chat coordinator delegates to one task sub-agent and reports its output.""" - child = _make_task_agent( - name='child', - responses=[_finish_part({'result': 'child output'})], - ) - - root = LlmAgent( - name='root', - model=testing_utils.MockModel.create( - responses=[ - _delegate_part('child', 'do the thing'), - 'All done: child output.', - ] - ), - sub_agents=[child], - ) - - app = App(name=request.function.__name__, root_agent=root) - runner = testing_utils.InMemoryRunner(app=app) - - events = await runner.run_async(testing_utils.get_user_content('hi')) - - finish_args = _collect_finish_outputs(events) - assert finish_args == [{'result': 'child output'}] - assert any( - 'All done: child output.' in t for t in _get_text_responses(events) - ) - - -# --------------------------------------------------------------------------- -# 2. LlmAgent root → multiple task sub-agents (sequential) -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_chat_root_with_two_task_sub_agents_sequential( - request: pytest.FixtureRequest, -): - """Chat coordinator delegates to two task sub-agents in one turn.""" - collector = _make_task_agent( - name='collector', - responses=[_finish_part({'result': 'collected'})], - ) - payer = _make_task_agent( - name='payer', - responses=[_finish_part({'result': 'paid'})], - ) - - root = LlmAgent( - name='root', - model=testing_utils.MockModel.create( - responses=[ - _delegate_part('collector', 'collect'), - _delegate_part('payer', 'pay'), - 'Order placed.', - ] - ), - sub_agents=[collector, payer], - ) - - app = App(name=request.function.__name__, root_agent=root) - runner = testing_utils.InMemoryRunner(app=app) - - events = await runner.run_async(testing_utils.get_user_content('place order')) - - finish_args = _collect_finish_outputs(events) - assert finish_args == [{'result': 'collected'}, {'result': 'paid'}] - assert any('Order placed.' in t for t in _get_text_responses(events)) - - -# --------------------------------------------------------------------------- -# 3. LlmAgent root → task sub-agent → nested task sub-agent -# --------------------------------------------------------------------------- - - -@pytest.mark.xfail( - reason=( - 'Task-mode wrapper does not dispatch task-delegation FCs (only the ' - 'chat-mode wrapper does), so a task-mode middle agent cannot delegate ' - 'to its task sub-agent. Documented limitation.' - ), - strict=True, -) -@pytest.mark.asyncio -async def test_chat_root_with_nested_task_delegation( - request: pytest.FixtureRequest, -): - """Task agent itself has a task sub-agent and delegates further.""" - grandchild = _make_task_agent( - name='grandchild', - responses=[_finish_part({'result': 'leaf'})], - ) - - child = LlmAgent( - name='child', - model=testing_utils.MockModel.create( - responses=[ - _delegate_part('grandchild', 'leaf work'), - _finish_part({'result': 'middle wraps leaf'}), - ] - ), - mode='task', - sub_agents=[grandchild], - ) - - root = LlmAgent( - name='root', - model=testing_utils.MockModel.create( - responses=[ - _delegate_part('child', 'do the thing'), - 'Top-level done.', - ] - ), - sub_agents=[child], - ) - - app = App(name=request.function.__name__, root_agent=root) - runner = testing_utils.InMemoryRunner(app=app) - - events = await runner.run_async(testing_utils.get_user_content('hi')) - - finish_args = _collect_finish_outputs(events) - # grandchild fires first (deepest), then child. - assert finish_args == [ - {'result': 'leaf'}, - {'result': 'middle wraps leaf'}, - ] - assert any('Top-level done.' in t for t in _get_text_responses(events)) - - -# --------------------------------------------------------------------------- -# 4. Workflow with a single task-mode node (no FC delegation) -# --------------------------------------------------------------------------- - - -class _CaptureNode(BaseNode): - """Records its node_input for assertion.""" - - received: list[Any] = [] - - async def _run_impl(self, *, ctx, node_input): - type(self).received.append(node_input) - yield Event(output=node_input) - - -@pytest.mark.asyncio -async def test_workflow_rejects_task_mode_graph_node(): - """A mode='task' LlmAgent cannot be used as a static workflow graph node. - - Task agents are multi-turn and need their originating ``node_input`` - preserved across re-dispatches — which the workflow scheduler doesn't - do yet. Until that lands, ``Workflow`` rejects them at construction - time. Task agents are still supported as chat sub-agents (FC - delegation) and via dynamic ``ctx.run_node`` dispatch (see - test_dynamic_dispatch_of_task_agent). - """ - intake = _make_task_agent(name='intake', responses=[]) - capture = _CaptureNode(name='capture') - - with pytest.raises(ValueError, match="mode='task'"): - Workflow(name='wf', edges=[(START, intake), (intake, capture)]) - - -# --------------------------------------------------------------------------- -# 6. Dynamic node: function node that dispatches a task agent via ctx.run_node -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_dynamic_dispatch_of_task_agent( - request: pytest.FixtureRequest, -): - """A custom function node can dispatch a task agent and consume its output.""" - task_agent = _make_task_agent( - name='task_agent', - responses=[_finish_part({'result': 'dynamic output'})], - ) - - @node(rerun_on_resume=True) - async def driver(*, ctx: Context, node_input: Any): - output = await ctx.run_node(task_agent, node_input='go') - yield Event(output=f'wrapped: {output}') - - wf = Workflow(name='wf', edges=[(START, driver)]) - - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - - events = await runner.run_async(testing_utils.get_user_content('start')) - - outputs = [e.output for e in events if e.output] - assert any( - isinstance(o, str) and 'dynamic output' in o for o in outputs - ), f'expected wrapped dynamic output, got: {outputs}' - - -# --------------------------------------------------------------------------- -# 7. Validation error -> retry: wrapper yields the error FR and lets the LLM -# emit a corrected finish_task on the next round. -# --------------------------------------------------------------------------- - - -class _StrictOutput(BaseModel): - name: str - age: int - - -@pytest.mark.asyncio -async def test_task_validation_error_drives_retry( - request: pytest.FixtureRequest, -): - """Bad finish_task args produce an error FR; the LLM gets a retry.""" - # First finish_task call has wrong types (age as string), second is correct. - child_model = testing_utils.MockModel.create( - responses=[ - _finish_part({'name': 'Jane', 'age': 'thirty'}), - _finish_part({'name': 'Jane', 'age': 30}), - ] - ) - child = LlmAgent( - name='child', - model=child_model, - mode='task', - output_schema=_StrictOutput, - ) - - root = LlmAgent( - name='root', - model=testing_utils.MockModel.create( - responses=[ - _delegate_part('child', 'gather identity'), - 'All set.', - ] - ), - sub_agents=[child], - ) - - app = App(name=request.function.__name__, root_agent=root) - runner = testing_utils.InMemoryRunner(app=app) - - events = await runner.run_async(testing_utils.get_user_content('hi')) - - # The mock LLM was called twice for the child (the bad attempt + the - # corrected one), proving the wrapper looped instead of terminating - # on the first finish_task. - assert child_model.response_index == 1 - finish_args = _collect_finish_outputs(events) - assert finish_args == [ - {'name': 'Jane', 'age': 'thirty'}, - {'name': 'Jane', 'age': 30}, - ] - # The validation-error FR should be present in session for the LLM - # to see on its retry round. - error_frs = [ - fr.response - for e in events - for fr in e.get_function_responses() - if fr.name == 'finish_task' - and isinstance(fr.response, dict) - and 'error' in fr.response - ] - assert len(error_frs) == 1, f'expected one error FR, got {error_frs}' - - -# --------------------------------------------------------------------------- -# 8. Cross-turn resumption: an unresolved task FC from a prior turn is -# re-dispatched by the chat coordinator on the next user turn, before -# the LLM is called. -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_chat_coordinator_resumes_unresolved_task_fc( - request: pytest.FixtureRequest, -): - """Pending task FC from a prior turn is dispatched before the new LLM call.""" - child_model = testing_utils.MockModel.create( - responses=[_finish_part({'result': 'finished after resume'})] - ) - child = LlmAgent(name='child', model=child_model, mode='task') - - root_model = testing_utils.MockModel.create( - responses=[ - # Only response needed: post-resume continuation after the - # pre-LLM scan dispatches the pending task and synthesizes its FR. - 'Resumed and done.', - ] - ) - root = LlmAgent( - name='root', - model=root_model, - sub_agents=[child], - ) - - # Seed the session with an unresolved task delegation FC authored by - # root from a "prior turn". No matching FR exists. - from google.adk.sessions.in_memory_session_service import InMemorySessionService - - session_service = InMemorySessionService() - session = await session_service.create_session( - app_name=request.function.__name__, - user_id='u', - ) - await session_service.append_event( - session=session, - event=Event( - invocation_id='prior-inv', - author='root', - content=types.Content( - role='model', - parts=[ - types.Part( - function_call=types.FunctionCall( - id='fc-pending', - name='child', - args={'request': 'leftover work'}, - ) - ) - ], - ), - ), - ) - - from google.adk.runners import Runner - - app = App(name=request.function.__name__, root_agent=root) - runner = Runner(app=app, session_service=session_service) - - events = [] - async for ev in runner.run_async( - user_id='u', - session_id=session.id, - new_message=testing_utils.get_user_content('continue'), - ): - events.append(ev) - - # The child must have been dispatched once (resuming the pending FC). - assert ( - child_model.response_index == 0 - ), 'child LLM should have been called exactly once for the resumed task' - finish_args = _collect_finish_outputs(events) - assert { - 'result': 'finished after resume' - } in finish_args, f'expected resumed task to finish; got {finish_args}' - - -# --------------------------------------------------------------------------- -# 9. Strict isolation filtering: a stranger event with a foreign -# isolation_scope must NOT appear in the task agent's LLM context. -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_strict_isolation_filter_excludes_foreign_scope( - request: pytest.FixtureRequest, -): - """Garbage-scoped events are excluded from the task agent's view.""" - child_model = testing_utils.MockModel.create( - responses=[_finish_part({'result': 'ok'})] - ) - child = LlmAgent(name='child', model=child_model, mode='task') - - root = LlmAgent( - name='root', - model=testing_utils.MockModel.create( - responses=[ - _delegate_part('child', 'do the thing'), - 'Done.', - ] - ), - sub_agents=[child], - ) - - from google.adk.sessions.in_memory_session_service import InMemorySessionService - - session_service = InMemorySessionService() - session = await session_service.create_session( - app_name=request.function.__name__, - user_id='u', - ) - # Seed a stranger event with a different scope. - stranger = Event( - invocation_id='stranger-inv', - author='someone_else', - content=types.Content( - role='user', - parts=[types.Part(text='SECRET-SHOULD-NOT-LEAK')], - ), - ) - stranger.isolation_scope = 'garbage-scope' - session.events.append(stranger) - - from google.adk.runners import Runner - - app = App(name=request.function.__name__, root_agent=root) - runner = Runner(app=app, session_service=session_service) - - async for _ in runner.run_async( - user_id='u', - session_id=session.id, - new_message=testing_utils.get_user_content('go'), - ): - pass - - # Inspect the child's LLM request: SECRET text must not appear. - child_request = child_model.requests[0] - rendered = '\n'.join( - p.text or '' for c in child_request.contents or [] for p in c.parts or [] - ) - assert ( - 'SECRET-SHOULD-NOT-LEAK' not in rendered - ), 'stranger event leaked across isolation_scope filter' diff --git a/tests/unittests/workflow/test_workflow.py b/tests/unittests/workflow/test_workflow.py deleted file mode 100644 index d2d1eb3061..0000000000 --- a/tests/unittests/workflow/test_workflow.py +++ /dev/null @@ -1,2181 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the new Workflow(BaseNode) implementation. - -Migrated from test_workflow_agent.py — each test validates the same -workflow behavior through Runner(node=...) instead of agent.run_async(). -""" - -from collections import Counter -from typing import Any -from typing import AsyncGenerator -import uuid - -from google.adk.agents.context import Context -from google.adk.events.event import Event -from google.adk.events.request_input import RequestInput -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.workflow._base_node import BaseNode -from google.adk.workflow._base_node import START -from google.adk.workflow._join_node import JoinNode -from google.adk.workflow._workflow import Workflow -from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_response -from google.genai import types -from pydantic import ConfigDict -from pydantic import Field -import pytest - -# --------------------------------------------------------------------------- -# Shared helper nodes (used by multiple tests) -# --------------------------------------------------------------------------- - - -def _make_function_call_interrupt(fc_id: str, name: str = 'approve') -> Event: - """Helper to create a raw function call interruption event.""" - return Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall(name=name, args={}, id=fc_id) - ) - ] - ), - long_running_tool_ids={fc_id}, - ) - - -class _OutputNode(BaseNode): - """Yields a fixed output value.""" - - value: Any = None - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield self.value - - -class _PassthroughNode(BaseNode): - """Passes node_input through as output.""" - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield node_input - - -class _RouteNode(BaseNode): - """Yields output and sets a route.""" - - value: Any = None - route_value: Any = None - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(output=self.value, route=self.route_value) - - -class _InputCapturingNode(BaseNode): - """Captures node_input for later assertion.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - received_inputs: list[Any] = Field(default_factory=list) - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - self.received_inputs.append(node_input) - yield {'received': node_input} - - -class _IntermediateContentNode(BaseNode): - """Yields intermediate content events before output.""" - - contents: list[types.Content] = Field(default_factory=list) - value: Any = None - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - for content in self.contents: - yield Event(content=content) - if self.value is not None: - yield self.value - - -class _BytesOutputNode(BaseNode): - """Yields bytes content or raw bytes.""" - - raw_bytes: bool = False - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - data = b'\x89PNG\r\n\x1a\n' - if self.raw_bytes: - yield data - else: - yield Event( - content=types.Content( - parts=[types.Part.from_bytes(data=data, mime_type='image/png')] - ), - output='bytes_sent', - ) - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -async def _run_workflow(wf, message='start'): - """Run a Workflow through Runner, return collected events.""" - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - msg = types.Content(parts=[types.Part(text=message)], role='user') - events = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - return events, ss, session - - -def _outputs(events): - """Extract non-None outputs from events.""" - return [e.output for e in events if e.output is not None] - - -def _output_by_node(events): - """Extract (node_name_from_path, output) for child node events.""" - results = [] - for e in events: - if e.output is not None and e.node_info.path and '/' in e.node_info.path: - node_name = e.node_info.path.rsplit('/', 1)[-1] - if '@' in node_name: - node_name = node_name.rsplit('@', 1)[0] - results.append((node_name, e.output)) - return results - - -# --------------------------------------------------------------------------- -# Tests — 1:1 mapping from test_workflow_agent.py -# --------------------------------------------------------------------------- - - -# 1. test_run_async → sequential A→B -@pytest.mark.asyncio -async def test_sequential_two_nodes(): - """Sequential A->B produces both outputs in order. - - Maps to: test_run_async in test_workflow_agent.py. - """ - a = _OutputNode(name='NodeA', value='Hello') - b = _OutputNode(name='NodeB', value='World') - wf = Workflow(name='wf', edges=[(START, a, b)]) - - events, _, _ = await _run_workflow(wf) - - by_node = _output_by_node(events) - assert ('NodeA', 'Hello') in by_node - assert ('NodeB', 'World') in by_node - assert by_node.index(('NodeA', 'Hello')) < by_node.index(('NodeB', 'World')) - - -# 2. test_run_async_with_intermediate_content -@pytest.mark.asyncio -async def test_intermediate_content_before_output(): - """Node yields content events before output. - - Maps to: test_run_async_with_intermediate_content in test_workflow_agent.py. - """ - a = _IntermediateContentNode( - name='NodeA', - contents=[ - types.Content(parts=[types.Part(text='msg1')]), - types.Content(parts=[types.Part(text='msg2')]), - ], - value='A output', - ) - wf = Workflow(name='wf', edges=[(START, a)]) - - events, _, _ = await _run_workflow(wf) - - texts = [ - p.text - for e in events - if e.content and e.content.parts - for p in e.content.parts - if p.text - ] - assert texts.index('msg1') < texts.index('msg2') # also asserts presence - assert 'A output' in _outputs(events) - - -# 3. test_run_async_with_loop_and_break -@pytest.mark.asyncio -async def test_loop_with_conditional_break(): - """Loop iterates 3 times: A,Check repeats, then exits to B. - - Maps to: test_run_async_with_loop_and_break in test_workflow_agent.py. - """ - - class _IncrementingNode(BaseNode): - - model_config = ConfigDict(arbitrary_types_allowed=True) - message: str = '' - _tracker_ref: list = [] - - def __init__(self, *, name: str, message: str, tracker: dict): - super().__init__(name=name) - object.__setattr__(self, 'message', message) - object.__setattr__(self, '_tracker_ref', [tracker]) - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - tracker = self._tracker_ref[0] - count = tracker.get('iteration_count', 0) + 1 - tracker['iteration_count'] = count - yield Event( - output=self.message, - route='continue_loop' if count < 3 else 'exit_loop', - ) - - tracker = {'iteration_count': 0} - node_a = _OutputNode(name='NodeA', value='Looping') - check = _IncrementingNode( - name='CheckNode', message='Checking', tracker=tracker - ) - node_b = _OutputNode(name='NodeB', value='Finished') - wf = Workflow( - name='wf', - edges=[ - (START, node_a, check), - (check, {'continue_loop': node_a, 'exit_loop': node_b}), - ], - ) - - events, _, _ = await _run_workflow(wf) - - assert tracker['iteration_count'] == 3 - by_node = _output_by_node(events) - node_names = [name for name, _ in by_node] - # 3 iterations of (NodeA, CheckNode) then NodeB - assert node_names.count('NodeA') == 3 - assert node_names.count('CheckNode') == 3 - assert 'NodeB' in node_names - - -# 4. test_resume_behavior -@pytest.mark.asyncio -async def test_resume_after_interrupt(): - """Workflow resumes from HITL interrupt and continues execution. - - Maps to: test_resume_behavior in test_workflow_agent.py. - Old test used crash/checkpoint resume. New test uses HITL interrupt/FR. - """ - - class _InterruptOnce(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - fc_id = ctx.state.get('_fc_id') - if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: - ctx.state['_fc_id'] = None - yield 'resumed' - return - - fc_id = f'fc-{uuid.uuid4().hex[:8]}' - ctx.state['_fc_id'] = fc_id - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='approve', args={}, id=fc_id - ) - ) - ] - ), - long_running_tool_ids={fc_id}, - ) - - a = _OutputNode(name='NodeA', value='A') - b = _InterruptOnce(name='NodeB') - c = _OutputNode(name='NodeC', value='C') - wf = Workflow(name='wf', edges=[(START, a, b, c)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: A completes, B interrupts - msg1 = types.Content(parts=[types.Part(text='go')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - # A completed, B interrupted - assert 'A' in [e.output for e in events1 if e.output is not None] - assert any(e.long_running_tool_ids for e in events1) - fc_id = None - for e in events1: - if e.long_running_tool_ids: - fc_id = list(e.long_running_tool_ids)[0] - - # Run 2: resume B, then C runs - msg2 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='approve', id=fc_id, response={'ok': True} - ) - ) - ], - role='user', - ) - events2: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events2.append(event) - - outputs = [e.output for e in events2 if e.output is not None] - assert 'resumed' in outputs - assert 'C' in outputs - - -@pytest.mark.asyncio -async def test_resume_with_schema_validation_failure(): - """Workflow raises ValueError when resume response fails validation.""" - - class _InterruptWithSchema(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - fc_id = ctx.state.get('_fc_id') - if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: - ctx.state['_fc_id'] = None - yield ctx.resume_inputs[fc_id] - return - - fc_id = f'fc-{uuid.uuid4().hex[:8]}' - ctx.state['_fc_id'] = fc_id - from google.adk.events.request_input import RequestInput - - yield RequestInput( - interrupt_id=fc_id, - prompt='Enter an integer', - response_schema={'type': 'integer'}, - ) - - a = _InterruptWithSchema(name='NodeA') - wf = Workflow(name='wf', edges=[(START, a)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg1 = types.Content(parts=[types.Part(text='go')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - fc_id = None - for e in events1: - if e.long_running_tool_ids: - fc_id = list(e.long_running_tool_ids)[0] - - msg2 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='adk_request_input', id=fc_id, response={'result': 'abc'} - ) - ) - ], - role='user', - ) - - with pytest.raises(ValueError, match='Validation failed for interrupt'): - async for _ in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - pass - - -@pytest.mark.asyncio -async def test_resume_with_schema_validation_failure_nested(): - """Workflow raises ValueError when resume response fails validation in nested workflow.""" - - class _InterruptWithSchema(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - fc_id = ctx.state.get('_fc_id') - if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: - ctx.state['_fc_id'] = None - yield ctx.resume_inputs[fc_id] - return - - fc_id = f'fc-{uuid.uuid4().hex[:8]}' - ctx.state['_fc_id'] = fc_id - from google.adk.events.request_input import RequestInput - - yield RequestInput( - interrupt_id=fc_id, - prompt='Enter an integer', - response_schema={'type': 'integer'}, - ) - - inner_wf = Workflow( - name='inner_wf', edges=[(START, _InterruptWithSchema(name='NodeA'))] - ) - outer_wf = Workflow(name='outer_wf', edges=[(START, inner_wf)]) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=outer_wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg1 = types.Content(parts=[types.Part(text='go')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - fc_id = None - for e in events1: - if e.long_running_tool_ids: - fc_id = list(e.long_running_tool_ids)[0] - - msg2 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='adk_request_input', id=fc_id, response={'result': 'abc'} - ) - ) - ], - role='user', - ) - - with pytest.raises(ValueError, match='Validation failed for interrupt'): - async for _ in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - pass - - -@pytest.mark.asyncio -async def test_resume_with_schema_validation_failure_no_rerun(): - """Workflow raises ValueError when resume response fails validation even if rerun_on_resume is False.""" - - class _InterruptWithSchema(BaseNode): - rerun_on_resume: bool = False - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - fc_id = ctx.state.get('_fc_id') - if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: - ctx.state['_fc_id'] = None - yield ctx.resume_inputs[fc_id] - return - - fc_id = f'fc-{uuid.uuid4().hex[:8]}' - ctx.state['_fc_id'] = fc_id - from google.adk.events.request_input import RequestInput - - yield RequestInput( - interrupt_id=fc_id, - prompt='Enter an integer', - response_schema={'type': 'integer'}, - ) - - a = _InterruptWithSchema(name='NodeA') - wf = Workflow(name='wf', edges=[(START, a)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg1 = types.Content(parts=[types.Part(text='go')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - fc_id = None - for e in events1: - if e.long_running_tool_ids: - fc_id = list(e.long_running_tool_ids)[0] - - msg2 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='adk_request_input', id=fc_id, response={'result': 'abc'} - ) - ) - ], - role='user', - ) - - with pytest.raises(ValueError, match='Validation failed for interrupt'): - async for _ in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - pass - - -# 5. test_agent_state_event_recorded -@pytest.mark.asyncio -async def test_internal_interrupt_event_not_persisted(): - """Workflow interrupt event is _adk_internal — not in session. - - Maps to: test_agent_state_event_recorded in test_workflow_agent.py. - Old test verified checkpoint events. New test verifies the workflow's - interrupt event is NOT persisted (child's event is sufficient). - """ - - class _InterruptNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - wf = Workflow(name='wf', edges=[(START, _InterruptNode(name='ask'))]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='go')], role='user') - events: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - # Caller should see the child's interrupt event - assert any(e.long_running_tool_ids for e in events) - - # Session should NOT have the workflow-level interrupt event - updated = await ss.get_session( - app_name='test', user_id='u', session_id=session.id - ) - wf_interrupt_events = [ - e - for e in updated.events - if e.long_running_tool_ids and e.node_info.path == 'wf@1' - ] - assert wf_interrupt_events == [] - # But child's interrupt event SHOULD be in session - child_interrupt_events = [ - e - for e in updated.events - if e.long_running_tool_ids - and e.node_info.path - and e.node_info.path.endswith('ask@1') - ] - assert len(child_interrupt_events) == 1 - - -# 6. test_run_async_with_implicit_graph -@pytest.mark.asyncio -async def test_edge_tuple_syntax(): - """Edges defined via tuples work. - - Maps to: test_run_async_with_implicit_graph in test_workflow_agent.py. - """ - a = _OutputNode(name='NodeA', value='Hello') - b = _OutputNode(name='NodeB', value='World') - wf = Workflow( - name='wf', - edges=[ - (START, a), - (a, b), - ], - ) - - events, _, _ = await _run_workflow(wf) - - outputs = _outputs(events) - assert outputs.index('Hello') < outputs.index( - 'World' - ) # also asserts presence - - -# 7. test_run_async_with_string_start -@pytest.mark.asyncio -async def test_string_start_in_edges(): - """'START' string works as edge source. - - Maps to: test_run_async_with_string_start in test_workflow_agent.py. - """ - a = _OutputNode(name='NodeA', value='Hello') - wf = Workflow(name='wf', edges=[('START', a)]) - - events, _, _ = await _run_workflow(wf) - - assert 'Hello' in _outputs(events) - - -# 8. test_run_async_with_implicit_graph_with_edge_combinations -@pytest.mark.asyncio -async def test_mixed_edge_and_tuple_syntax(): - """Mix of Edge objects and tuple syntax in a 3-node chain. - - Maps to: test_run_async_with_implicit_graph_with_edge_combinations - in test_workflow_agent.py. - """ - from google.adk.workflow._graph import Edge as GraphEdge - - a = _OutputNode(name='NodeA', value='A') - b = _OutputNode(name='NodeB', value='B') - c = _OutputNode(name='NodeC', value='C') - wf = Workflow( - name='wf', - edges=[ - (START, a), - GraphEdge(from_node=a, to_node=b), - (b, c), - ], - ) - - events, _, _ = await _run_workflow(wf) - - by_node = _output_by_node(events) - assert by_node.index(('NodeA', 'A')) < by_node.index( - ('NodeB', 'B') - ) # also asserts presence - assert by_node.index(('NodeB', 'B')) < by_node.index(('NodeC', 'C')) - - -# 9. test_run_async_with_update_state_event -@pytest.mark.asyncio -async def test_state_update_via_event_persisted(): - """State updates via Event(state=...) are persisted to session. - - Maps to: test_run_async_with_update_state_event in test_workflow_agent.py. - """ - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(state={'key1': 'value1'}) - - wf = Workflow(name='wf', edges=[(START, _Node(name='NodeA'))]) - - events, ss, session = await _run_workflow(wf) - updated = await ss.get_session( - app_name='test', user_id='u', session_id=session.id - ) - - assert updated.state.get('key1') == 'value1' - - -# 11. test_run_async_with_raw_output_node -@pytest.mark.asyncio -async def test_raw_output_auto_wrapped(): - """Node yields raw value, auto-wrapped to Event(output=...). - - Maps to: test_run_async_with_raw_output_node in test_workflow_agent.py. - """ - a = _OutputNode(name='NodeA', value='raw_data') - wf = Workflow(name='wf', edges=[(START, a)]) - - events, _, _ = await _run_workflow(wf) - - assert 'raw_data' in _outputs(events) - - -# 12. test_node_output_event_with_content_data -@pytest.mark.asyncio -async def test_content_return_produces_content_event(): - """FunctionNode returning Content yields content event, not output. - - Maps to: test_node_output_event_with_content_data - in test_workflow_agent.py. - """ - - def content_fn() -> types.Content: - return types.Content(parts=[types.Part(text='hello')]) - - wf = Workflow(name='wf', edges=[(START, content_fn)]) - - events, _, _ = await _run_workflow(wf) - - fn_events = [ - e for e in events if e.node_info.path and 'content_fn' in e.node_info.path - ] - assert len(fn_events) == 1 - assert fn_events[0].output is None - assert fn_events[0].content == types.Content(parts=[types.Part(text='hello')]) - - -# 13. test_input_propagation_linear -@pytest.mark.asyncio -async def test_input_propagation_linear(): - """Output of A becomes input to B. - - Maps to: test_input_propagation_linear in test_workflow_agent.py. - """ - a = _OutputNode(name='NodeA', value='from_a') - b = _InputCapturingNode(name='NodeB') - wf = Workflow(name='wf', edges=[(START, a, b)]) - - events, _, _ = await _run_workflow(wf) - - assert b.received_inputs == ['from_a'] - - -# 14. test_input_propagation_fan_in_sequential -@pytest.mark.asyncio -async def test_input_propagation_fan_in(): - """Fan-in with asymmetric branches: C receives from A and B3. - - Maps to: test_input_propagation_fan_in_sequential - in test_workflow_agent.py. - """ - a = _OutputNode(name='NodeA', value='from_a') - b = _OutputNode(name='NodeB', value='from_b') - b2 = _PassthroughNode(name='NodeB2') - b3 = _PassthroughNode(name='NodeB3') - c = _InputCapturingNode(name='NodeC') - wf = Workflow( - name='wf', - edges=[ - (START, a), - (START, b, b2, b3), - (a, c), - (b3, c), - ], - ) - - events, _, _ = await _run_workflow(wf) - - assert Counter(c.received_inputs) == Counter(['from_a', 'from_b']) - - -# 15. test_start_node_receives_user_content -@pytest.mark.asyncio -async def test_start_node_receives_user_content(): - """First node receives user message as input. - - Maps to: test_start_node_receives_user_content - in test_workflow_agent.py. - """ - a = _InputCapturingNode(name='NodeA') - wf = Workflow(name='wf', edges=[(START, a)]) - - events, _, _ = await _run_workflow(wf, message='hello') - - assert len(a.received_inputs) == 1 - assert a.received_inputs[0].parts[0].text == 'hello' - - -# 18. test_wait_for_output_suppresses_trigger - - -@pytest.mark.asyncio -async def test_wait_for_output_suppresses_downstream(): - """wait_for_output=True with no output prevents downstream from running. - - Maps to: test_wait_for_output_suppresses_trigger - in test_workflow_agent.py. - """ - - class _NoOutputNode(BaseNode): - wait_for_output: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(state={'seen': True}) - - blocker = _NoOutputNode(name='blocker') - downstream = _OutputNode(name='downstream', value='should_not_run') - wf = Workflow( - name='wf', - edges=[ - (START, blocker), - (blocker, downstream), - ], - ) - - events, _, _ = await _run_workflow(wf) - - assert 'should_not_run' not in _outputs(events) - - -# 19. test_wait_for_output_retrigger_then_complete -@pytest.mark.asyncio -async def test_wait_for_output_completes_after_all(): - """Gate with wait_for_output opens after 2 triggers, fires downstream. - - Maps to: test_wait_for_output_retrigger_then_complete - in test_workflow_agent.py. - """ - - class _GateNode(BaseNode): - triggers_needed: int = 2 - wait_for_output: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - count = (ctx.state.get(f'{self.name}_count') or 0) + 1 - if count >= self.triggers_needed: - yield Event( - output='gate_open', - state={f'{self.name}_count': None}, - ) - else: - yield Event(state={f'{self.name}_count': count}) - - gate = _GateNode(name='Gate', triggers_needed=2) - a = _OutputNode(name='NodeA', value='A') - b = _OutputNode(name='NodeB', value='B') - downstream = _OutputNode(name='Downstream', value='done') - wf = Workflow( - name='wf', - edges=[ - (START, a, gate, downstream), - (START, b, gate), - ], - ) - - events, _, _ = await _run_workflow(wf) - by_node = _output_by_node(events) - - # A and B run first (parallel), then Gate opens, then Downstream - assert len(by_node) == 4 - first_two = {by_node[0][0], by_node[1][0]} - assert first_two == {'NodeA', 'NodeB'} - assert by_node[2] == ('Gate', 'gate_open') - assert by_node[3] == ('Downstream', 'done') - - -# 25. test_run_async_with_implicit_graph_chain -@pytest.mark.asyncio -async def test_chain_syntax(): - """(START, a, b, c) creates sequential chain producing all outputs. - - Maps to: test_run_async_with_implicit_graph_chain - in test_workflow_agent.py. - """ - a = _OutputNode(name='a', value='A') - b = _OutputNode(name='b', value='B') - c = _OutputNode(name='c', value='C') - wf = Workflow(name='wf', edges=[(START, a, b, c)]) - - events, _, _ = await _run_workflow(wf) - by_node = _output_by_node(events) - - assert [name for name, _ in by_node] == ['a', 'b', 'c'] - assert [val for _, val in by_node] == ['A', 'B', 'C'] - - -# 26. test_run_async_with_implicit_graph_fan_out -@pytest.mark.asyncio -async def test_fan_out(): - """Fan-out to multiple terminals raises ValueError. - - Maps to: test_run_async_with_implicit_graph_fan_out - in test_workflow_agent.py. - """ - a = _OutputNode(name='a', value='A') - b = _InputCapturingNode(name='b') - c = _InputCapturingNode(name='c') - wf = Workflow( - name='wf', - edges=[ - (START, a), - (a, (b, c)), - ], - ) - - with pytest.raises(ValueError, match='multiple terminal nodes'): - await _run_workflow(wf) - - -# 27. test_run_async_with_implicit_graph_fan_in -@pytest.mark.asyncio -async def test_fan_in(): - """((a, b), c) — c triggered by both a and b. - - Maps to: test_run_async_with_implicit_graph_fan_in - in test_workflow_agent.py. - """ - a = _OutputNode(name='a', value='A') - b = _OutputNode(name='b', value='B') - c = _InputCapturingNode(name='c') - wf = Workflow( - name='wf', - edges=[ - (START, (a, b)), - ((a, b), c), - ], - ) - - events, _, _ = await _run_workflow(wf) - - assert Counter(c.received_inputs) == Counter(['A', 'B']) - - -# 28. test_run_async_with_implicit_graph_fan_out_fan_in -@pytest.mark.asyncio -async def test_fan_out_fan_in(): - """S fans out to (A, B), both feed into C. - - Maps to: test_run_async_with_implicit_graph_fan_out_fan_in - in test_workflow_agent.py. - """ - s = _OutputNode(name='s', value='S') - a = _PassthroughNode(name='a') - b = _PassthroughNode(name='b') - c = _InputCapturingNode(name='c') - wf = Workflow( - name='wf', - edges=[ - (START, s), - (s, (a, b), c), - ], - ) - - events, _, _ = await _run_workflow(wf) - - # Both A and B receive S's output, C receives from both - assert Counter(c.received_inputs) == Counter(['S', 'S']) - - -# 29. test_run_async_parallel_nodes_interleaved_events -@pytest.mark.asyncio -async def test_parallel_events_interleaved(): - """Parallel terminal nodes both producing output raises ValueError. - - Maps to: test_run_async_parallel_nodes_interleaved_events - in test_workflow_agent.py. - """ - a = _OutputNode(name='a', value='A') - b = _OutputNode(name='b', value='B') - wf = Workflow( - name='wf', - edges=[ - (START, a), - (START, b), - ], - ) - - with pytest.raises(ValueError, match='multiple terminal nodes'): - await _run_workflow(wf) - - -# 30. test_buffers_events_from_parallel_nodes -@pytest.mark.asyncio -async def test_parallel_events_all_delivered(): - """All events from parallel nodes fan-in to capture node. - - Maps to: test_buffers_events_from_parallel_nodes - in test_workflow_agent.py. - """ - a = _OutputNode(name='a', value='A') - b = _OutputNode(name='b', value='B') - capture = _InputCapturingNode(name='capture') - wf = Workflow( - name='wf', - edges=[ - (START, a), - (START, b), - (a, capture), - (b, capture), - ], - ) - - events, _, _ = await _run_workflow(wf) - - assert Counter(capture.received_inputs) == Counter(['A', 'B']) - - -# 31. test_run_id_uniqueness -@pytest.mark.asyncio -async def test_run_id_unique_per_node(): - """Each node run gets a unique run_id. - - Maps to: test_run_id_uniqueness in test_workflow_agent.py. - """ - a = _OutputNode(name='a', value='A') - b = _OutputNode(name='b', value='B') - wf = Workflow(name='wf', edges=[(START, a, b)]) - - events, _, _ = await _run_workflow(wf) - paths = [e.node_info.path for e in events if e.node_info.path] - - assert len(paths) >= 2 - # paths are unique per node run (because they contain @run_id) - assert len(set(paths)) >= 2 - - -# 32. test_run_id_uniqueness_nested -@pytest.mark.asyncio -async def test_run_id_unique_nested(): - """Nested workflow nodes also get unique IDs. - - Maps to: test_run_id_uniqueness_nested - in test_workflow_agent.py. - """ - inner_a = _OutputNode(name='inner_a', value='IA') - inner = Workflow(name='inner', edges=[(START, inner_a)]) - outer_a = _OutputNode(name='outer_a', value='OA') - wf = Workflow(name='wf', edges=[(START, outer_a, inner)]) - - events, _, _ = await _run_workflow(wf) - paths = [e.node_info.path for e in events if e.node_info.path] - - # paths are unique per node run (because they contain @run_id) - assert len(set(paths)) >= 2 - - -@pytest.mark.asyncio -async def test_run_id_sequential_in_loop(): - """Looping node gets sequential run_ids: 1, 2, 3.""" - tracker = {'count': 0} - - class _LoopNode(BaseNode): - - model_config = ConfigDict(arbitrary_types_allowed=True) - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - tracker['count'] += 1 - yield Event( - output=f'iter-{tracker["count"]}', - route='again' if tracker['count'] < 3 else 'done', - ) - - from google.adk.workflow._graph import Edge as GraphEdge - - loop = _LoopNode(name='loop') - wf = Workflow( - name='wf', - edges=[ - (START, loop), - GraphEdge(from_node=loop, to_node=loop, route='again'), - ], - ) - - events, _, _ = await _run_workflow(wf) - - loop_run_ids = [ - e.node_info.path.split('@')[-1] - for e in events - if e.node_info.path and 'loop@' in e.node_info.path - ] - assert loop_run_ids == ['1', '2', '3'] - - -# 33. test_resume_with_manual_state_verifies_input_persistence -@pytest.mark.asyncio -async def test_resume_downstream_receives_output(): - """After resume, downstream node receives the resumed node's output. - - Maps to: test_resume_with_manual_state_verifies_input_persistence - in test_workflow_agent.py. Old test verified input from checkpoint. - New test verifies output flows to downstream after HITL resume. - """ - - class _InterruptNode(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - - fc_id = ctx.state.get('_fc_id') - if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: - ctx.state['_fc_id'] = None - yield f'response:{ctx.resume_inputs[fc_id]["value"]}' - return - fc_id = f'fc-{uuid.uuid4().hex[:8]}' - ctx.state['_fc_id'] = fc_id - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='get', args={}, id=fc_id - ) - ) - ] - ), - long_running_tool_ids={fc_id}, - ) - - a = _OutputNode(name='NodeA', value='from_a') - b = _InterruptNode(name='NodeB') - c = _InputCapturingNode(name='NodeC') - wf = Workflow(name='wf', edges=[(START, a, b, c)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: A completes, B interrupts - msg1 = types.Content(parts=[types.Part(text='go')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - # A completed, B interrupted - assert 'from_a' in [e.output for e in events1 if e.output is not None] - fc_id = None - for e in events1: - if e.long_running_tool_ids: - fc_id = list(e.long_running_tool_ids)[0] - assert fc_id - - # Run 2: resume B with value, C receives B's output - msg2 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='get', id=fc_id, response={'value': 42} - ) - ) - ], - role='user', - ) - events2: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events2.append(event) - - # NodeC should have captured NodeB's resume output - assert c.received_inputs == ['response:42'] - - -# 34. test_run_async_with_multiple_node_outputs_fails -@pytest.mark.asyncio -async def test_multiple_outputs_rejected(): - """Node yielding two outputs raises error. - - Maps to: test_run_async_with_multiple_node_outputs_fails - in test_workflow_agent.py. - - NodeRunner raises ValueError but Runner swallows it in the - background task. This test is xfail until Runner error propagation - is implemented. - """ - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(output='first') - yield Event(output='second') - - wf = Workflow(name='wf', edges=[(START, _Node(name='a'))]) - - with pytest.raises(ValueError, match='at most one output'): - await _run_workflow(wf) - - -# 38. test_run_async_streaming_behavior -@pytest.mark.asyncio -async def test_streaming_partial_events(): - """Partial events are streamed before final output. - - Maps to: test_run_async_streaming_behavior - in test_workflow_agent.py. - """ - - class _Node(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event( - content=types.Content(parts=[types.Part(text='partial1')]), - partial=True, - ) - yield Event( - content=types.Content(parts=[types.Part(text='partial2')]), - partial=True, - ) - yield Event(output='final') - - wf = Workflow(name='wf', edges=[(START, _Node(name='a'))]) - - events, _, _ = await _run_workflow(wf) - partials = [e for e in events if e.partial] - - assert len(partials) == 2 - assert 'final' in _outputs(events) - - -# 39. test_workflow_agent_unsupported_base_agent_fields -# SKIP — BaseAgent-specific, not applicable to Workflow(BaseNode). - - -# 40. test_node_path_generation -@pytest.mark.asyncio -async def test_node_path_correct(): - """Events have correct node_info.path. - - Maps to: test_node_path_generation in test_workflow_agent.py. - """ - a = _OutputNode(name='NodeA', value='A') - b = _OutputNode(name='NodeB', value='B') - wf = Workflow(name='wf', edges=[(START, a, b)]) - - events, _, _ = await _run_workflow(wf) - paths = [e.node_info.path for e in events if e.node_info.path] - - assert any(p.endswith('NodeA@1') for p in paths) - assert any(p.endswith('NodeB@1') for p in paths) - assert all('None' not in p for p in paths) - - -# --- Additional: function node auto-wrap --- - - -@pytest.mark.asyncio -async def test_function_node_auto_wrap(): - """Callable in edge is auto-wrapped to FunctionNode.""" - - def greet(node_input): - return 'hi' - - wf = Workflow(name='wf', edges=[(START, greet)]) - - events, _, _ = await _run_workflow(wf) - - assert 'hi' in _outputs(events) - - -# --- Additional: empty workflow --- - - -@pytest.mark.asyncio -async def test_empty_workflow(): - """Workflow with no edges produces no output.""" - wf = Workflow(name='wf', edges=[]) - - events, _, _ = await _run_workflow(wf) - - assert _outputs(events) == [] - - -# --------------------------------------------------------------------------- -# use_as_output=True (dynamic output delegation) -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_use_as_output_function_to_function(): - """Node A delegates output to dynamic child B via use_as_output=True. - - B's output event appears; A's duplicate is suppressed. - """ - from google.adk.workflow._function_node import FunctionNode - - def func_b() -> str: - return 'from_b' - - async def func_a(ctx: Context) -> str: - return await ctx.run_node(func_b, use_as_output=True) - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - wf = Workflow(name='wf', edges=[(START, node_a)]) - events, _, _ = await _run_workflow(wf) - - by_node = _output_by_node(events) - # func_b emits output; func_a's duplicate is suppressed. - assert ('func_b', 'from_b') in by_node - assert not any(name == 'func_a' for name, _ in by_node) - - # output_for includes child, parent, and workflow paths. - # func_a is terminal, so its output also represents the workflow's. - output_event = [ - e for e in events if e.node_info.name.split('@')[0] == 'func_b' - ][0] - assert output_event.node_info.output_for == [ - 'wf@1/func_a@1/func_b@1', - 'wf@1/func_a@1', - 'wf@1', - ] - - -@pytest.mark.asyncio -async def test_use_as_output_function_to_workflow(): - """Node A delegates output to a nested Workflow via use_as_output=True. - - The inner Workflow's terminal node output is used as A's output. - """ - from google.adk.workflow._function_node import FunctionNode - - def step_1() -> str: - return 'step_1_done' - - def step_2(node_input: str) -> str: - return f'final:{node_input}' - - inner_wf = Workflow( - name='inner_wf', - edges=[(START, step_1, step_2)], - ) - - async def func_a(ctx: Context): - return await ctx.run_node(inner_wf, use_as_output=True) - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - wf = Workflow(name='wf', edges=[(START, node_a)]) - events, _, _ = await _run_workflow(wf) - - by_node = _output_by_node(events) - # step_2 is the terminal; func_a's duplicate is suppressed. - assert ('step_2', 'final:step_1_done') in by_node - assert not any(name == 'func_a' for name, _ in by_node) - - -@pytest.mark.asyncio -async def test_use_as_output_custom_node(): - """Custom BaseNode delegates output via use_as_output.""" - from google.adk.workflow._function_node import FunctionNode - - def func_b() -> str: - return 'delegated_output' - - class _Delegator(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - await ctx.run_node(func_b, use_as_output=True) - return - yield - - wf = Workflow(name='wf', edges=[(START, _Delegator(name='delegator'))]) - events, _, _ = await _run_workflow(wf) - - by_node = _output_by_node(events) - assert ('func_b', 'delegated_output') in by_node - assert not any(name == 'delegator' for name, _ in by_node) - - -@pytest.mark.asyncio -async def test_use_as_output_nested_delegation(): - """Chained delegation: A → B → C, all use_as_output=True. - - Only C's output event should appear; A and B are suppressed. - """ - from google.adk.workflow._function_node import FunctionNode - - def func_c() -> str: - return 'from_c' - - node_c = FunctionNode(func=func_c) - - async def func_b(ctx: Context) -> str: - return await ctx.run_node(node_c, use_as_output=True) - - node_b = FunctionNode(func=func_b, rerun_on_resume=True) - - async def func_a(ctx: Context) -> str: - return await ctx.run_node(node_b, use_as_output=True) - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - wf = Workflow(name='wf', edges=[(START, node_a)]) - events, _, _ = await _run_workflow(wf) - - by_node = _output_by_node(events) - assert ('func_c', 'from_c') in by_node - assert not any(name in ('func_a', 'func_b') for name, _ in by_node) - - # output_for includes full ancestor chain plus workflow path. - # func_a is terminal, so the chain extends to the workflow. - output_event = [ - e for e in events if e.node_info.name.split('@')[0] == 'func_c' - ][0] - assert output_event.node_info.output_for == [ - 'wf@1/func_a@1/func_b@1/func_c@1', - 'wf@1/func_a@1/func_b@1', - 'wf@1/func_a@1', - 'wf@1', - ] - - -@pytest.mark.asyncio -async def test_use_as_output_with_downstream(): - """Delegated output flows to downstream node via graph edge. - - A delegates to B via use_as_output. downstream is after A and - receives B's output as node_input. - """ - from google.adk.workflow._function_node import FunctionNode - - def func_b() -> str: - return 'from_b' - - async def func_a(ctx: Context) -> str: - return await ctx.run_node(func_b, use_as_output=True) - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - downstream = _InputCapturingNode(name='downstream') - - wf = Workflow(name='wf', edges=[(START, node_a, downstream)]) - events, _, _ = await _run_workflow(wf) - - assert downstream.received_inputs == ['from_b'] - - -@pytest.mark.asyncio -async def test_use_as_output_duplicate_raises(): - """Calling use_as_output=True twice in the same node raises ValueError.""" - from google.adk.workflow._function_node import FunctionNode - - def func_b() -> str: - return 'from_b' - - def func_c() -> str: - return 'from_c' - - async def func_a(ctx: Context): - await ctx.run_node(func_b, use_as_output=True) - await ctx.run_node(func_c, use_as_output=True) - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - wf = Workflow(name='wf', edges=[(START, node_a)]) - - with pytest.raises(ValueError, match='use_as_output'): - await _run_workflow(wf) - - -@pytest.mark.asyncio -async def test_without_use_as_output_parent_emits_duplicate(): - """Without use_as_output, parent re-emits child's output (duplicate).""" - from google.adk.workflow._function_node import FunctionNode - - def func_b() -> str: - return 'from_b' - - node_b = FunctionNode(func=func_b) - - async def func_a(ctx: Context) -> str: - return await ctx.run_node(node_b) - - node_a = FunctionNode(func=func_a, rerun_on_resume=True) - - wf = Workflow(name='wf', edges=[(START, node_a)]) - events, _, _ = await _run_workflow(wf) - - by_node = _output_by_node(events) - # Both func_b AND func_a emit output (duplicate). - assert ('func_b', 'from_b') in by_node - assert ('func_a', 'from_b') in by_node - - # func_b's output_for is just its own path (no delegation). - b_event = [e for e in events if e.node_info.name.split('@')[0] == 'func_b'][0] - assert b_event.node_info.output_for == ['wf@1/func_a@1/func_b@1'] - # func_a is terminal, so its output_for includes the workflow path. - a_event = [ - e - for e in events - if e.node_info.name and e.node_info.name.split('@')[0] == 'func_a' - ][0] - assert a_event.node_info.output_for == ['wf@1/func_a@1', 'wf@1'] - - -@pytest.mark.asyncio -async def test_terminal_node_output_dedup(): - """Terminal node output is not duplicated by the workflow. - - The terminal node's output event includes the workflow path in - output_for, and the workflow does not emit a separate output event. - """ - - def step_a(node_input: str) -> str: - return node_input.upper() - - def step_b(node_input: str) -> str: - return f'final: {node_input}' - - wf = Workflow(name='wf', edges=[(START, step_a, step_b)]) - events, _, _ = await _run_workflow(wf, 'hello') - - output_events = [e for e in events if e.output is not None] - - # step_a is not terminal — its output_for is just its own path. - a_events = [ - e - for e in output_events - if e.node_info.name and e.node_info.name.split('@')[0] == 'step_a' - ] - assert len(a_events) == 1 - assert a_events[0].node_info.output_for == ['wf@1/step_a@1'] - - # step_b is terminal — its output_for includes the workflow path. - b_events = [ - e - for e in output_events - if e.node_info.name and e.node_info.name.split('@')[0] == 'step_b' - ] - assert len(b_events) == 1 - assert b_events[0].node_info.output_for == ['wf@1/step_b@1', 'wf@1'] - assert b_events[0].output == 'final: HELLO' - - # No duplicate output event from the workflow itself. - wf_events = [e for e in output_events if e.node_info.path == 'wf@1'] - assert len(wf_events) == 0 - - -@pytest.mark.asyncio -async def test_terminal_node_output_dedup_nested(): - """Terminal output dedup works for nested workflows. - - Inner workflow's terminal node output propagates to the outer - workflow without duplication. - """ - - def inner_node(node_input: str) -> str: - return node_input.upper() - - inner_wf = Workflow(name='inner', edges=[(START, inner_node)]) - - def outer_node(node_input: str) -> str: - return f'wrapped: {node_input}' - - outer_wf = Workflow(name='outer', edges=[(START, inner_wf, outer_node)]) - events, _, _ = await _run_workflow(outer_wf, 'test') - - output_events = [e for e in events if e.output is not None] - - # inner_node is terminal in inner_wf — includes inner_wf path. - inner_events = [ - e - for e in output_events - if e.node_info.name and e.node_info.name.split('@')[0] == 'inner_node' - ] - assert len(inner_events) == 1 - assert inner_events[0].node_info.output_for == [ - 'outer@1/inner@1/inner_node@1', - 'outer@1/inner@1', - ] - - # outer_node is terminal in outer_wf — includes outer_wf path. - outer_events = [ - e - for e in output_events - if e.node_info.name and e.node_info.name.split('@')[0] == 'outer_node' - ] - assert len(outer_events) == 1 - assert outer_events[0].node_info.output_for == [ - 'outer@1/outer_node@1', - 'outer@1', - ] - assert outer_events[0].output == 'wrapped: TEST' - - # No duplicate output events from the workflows themselves. - wf_output_events = [ - e - for e in output_events - if e.node_info.path in ('outer@1', 'outer@1/inner@1') - ] - assert len(wf_output_events) == 0 - - -# --- wait_for_output + HITL resume --- - - -@pytest.mark.asyncio -async def test_wait_for_output_node_preserves_state_across_resume(): - """Wait-for-output node preserves received triggers across workflow resume. - - Setup: - START -> NodeA (completes) -> Gate (wait_for_output, needs 2 triggers). - START -> NodeB (interrupts) -> Gate. - Act: - - Turn 1: Start workflow. NodeA completes, NodeB interrupts. Gate waits (1/2). - - Turn 2: Resume with NodeB response. NodeB completes, triggers Gate (2/2). - Assert: - - Gate opens in Turn 2 and produces output. - """ - - class _InterruptOnce(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - fc_id = ctx.state.get('_fc_id') - if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: - ctx.state['_fc_id'] = None - yield 'B_done' - return - fc_id = f'fc-{uuid.uuid4().hex[:8]}' - ctx.state['_fc_id'] = fc_id - yield _make_function_call_interrupt(fc_id) - - a = _OutputNode(name='NodeA', value='A') - b = _InterruptOnce(name='NodeB') - gate = JoinNode(name='Gate') - downstream = _OutputNode(name='Downstream', value='done') - wf = Workflow( - name='wf', - edges=[ - (START, a, gate, downstream), - (START, b, gate), - ], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: A completes, B interrupts, Gate triggered once (no output) - msg1 = types.Content(parts=[types.Part(text='go')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - outputs1 = [e.output for e in events1 if e.output is not None] - assert 'A' in outputs1 - assert any(e.long_running_tool_ids for e in events1) - # Gate should NOT have opened (only 1 of 2 triggers received) - assert not any(isinstance(o, dict) and 'NodeA' in o for o in outputs1) - - fc_id = None - for e in events1: - if e.long_running_tool_ids: - fc_id = list(e.long_running_tool_ids)[0] - - # Run 2: resume B → Gate gets 2nd trigger → opens → Downstream runs - msg2 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='approve', id=fc_id, response={'ok': True} - ) - ) - ], - role='user', - ) - events2: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events2.append(event) - - outputs = [e.output for e in events2 if e.output is not None] - assert 'B_done' in outputs - # Gate opened with both inputs collected - gate_output = [o for o in outputs if isinstance(o, dict)] - assert len(gate_output) == 1 - assert 'NodeA' in gate_output[0] - assert 'NodeB' in gate_output[0] - assert 'done' in outputs - - -@pytest.mark.asyncio -async def test_wait_for_output_node_in_loop_generates_unique_paths(): - """Wait-for-output node in loop generates unique paths across iterations. - - Setup: - Workflow with a loop: START -> Process -> [NodeA, NodeB] -> Join -> Handle. - Handle loops back to Process on first iteration, exits on second. - NodeB interrupts on first run of each iteration. - Act: - - Turn 1: Start workflow. NodeA completes, NodeB interrupts. Join waits. - - Turn 2: Resume with NodeB response. Handle loops back. Process runs again. - NodeA completes, NodeB interrupts again. - - Turn 3: Resume with NodeB response again. Join opens. - Assert: - - JoinNode runs with path ending in `Join@2` in the second iteration. - """ - - class _InterruptOnce(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - fc_id = ctx.state.get('_fc_id') - if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: - ctx.state['_fc_id'] = None - yield 'B_done' - return - fc_id = 'fc-interrupt' - ctx.state['_fc_id'] = fc_id - yield _make_function_call_interrupt(fc_id) - - class _HandleNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - # Loop back if this is the first iteration - count = ctx.state.get('loop_count', 0) + 1 - ctx.state['loop_count'] = count - if count == 1: - yield Event(route='loop') - else: - yield Event(route='exit', output='finished') - - process = _PassthroughNode(name='Process') - a = _OutputNode(name='NodeA', value='A') - b = _InterruptOnce(name='NodeB') - join = JoinNode(name='Join') - handle = _HandleNode(name='Handle') - exit_node = _PassthroughNode(name='Exit') - - wf = Workflow( - name='loop_wf', - edges=[ - (START, process), - (process, a), - (process, b), - (a, join), - (b, join), - (join, handle), - (handle, {'loop': process, 'exit': exit_node}), - ], - ) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Turn 1: process runs, A completes, B interrupts, Join waits - msg1 = types.Content(parts=[types.Part(text='go')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - # Verify paths in Turn 1 - join_events1 = [ - e for e in events1 if e.node_info and 'Join' in e.node_info.path - ] - # JoinNode does not yield events until all inputs are collected. - - # Turn 2: Provide response for NodeB (InterruptNode) - msg2 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='approve', id='fc-interrupt', response={'ok': True} - ) - ) - ], - role='user', - ) - - events2: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events2.append(event) - - # Workflow loops back. NodeB interrupts again in the second iteration. - - # Turn 3: Provide response for NodeB again! - events3: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events3.append(event) - - # JoinNode opens in the second iteration and produces output. - - join_events3 = [ - e for e in events3 if e.node_info and 'Join@2' in e.node_info.path - ] - assert len(join_events3) > 0, 'JoinNode should run again in loop with @2' - - -# --- run_id reuse on resume --- - - -@pytest.mark.asyncio -async def test_run_id_reused_on_resume(): - """Resumed node reuses run_id from original interrupted run.""" - - class _InterruptOnce(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - fc_id = ctx.state.get('_fc_id') - if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: - ctx.state['_fc_id'] = None - yield 'resumed' - return - fc_id = str(uuid.uuid4()) - ctx.state['_fc_id'] = fc_id - yield _make_function_call_interrupt(fc_id) - - wf = Workflow( - name='wf', - edges=[(START, _InterruptOnce(name='ask'))], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: interrupts - msg1 = types.Content(parts=[types.Part(text='go')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - fc_id = None - original_run_id = None - for e in events1: - if e.long_running_tool_ids: - fc_id = list(e.long_running_tool_ids)[0] - original_run_id = e.node_info.run_id - - assert fc_id is not None - assert original_run_id is not None - - # Run 2: resume - msg2 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='approve', id=fc_id, response={'ok': True} - ) - ) - ], - role='user', - ) - events2: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events2.append(event) - - # Resumed node should have the same run_id - resumed_events = [ - e - for e in events2 - if e.node_info.path - and e.node_info.path.endswith('ask@1') - and e.output is not None - ] - assert len(resumed_events) == 1 - assert resumed_events[0].node_info.run_id == original_run_id - - -@pytest.mark.asyncio -async def test_route_without_output_triggers_downstream_on_resume(): - """Node with route but no output triggers downstream on resume. - - Setup: - START -> NodeA (yields route='next') -> NodeB (interrupts). - Act: - - Turn 1: Run workflow. NodeA completes with route, NodeB interrupts. - - Turn 2: Resume workflow by resolving NodeB's interrupt. - Assert: - - Turn 1: NodeB was triggered (indicated by interrupt). - - Turn 2: NodeB runs and produces output (proving it was triggered). - """ - - class _TestRouteNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(route='next') - - class _InterruptOnce(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if ctx.resume_inputs and 'fc-123' in ctx.resume_inputs: - yield Event(output='done') - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='approve', args={}, id='fc-123' - ) - ) - ] - ), - long_running_tool_ids={'fc-123'}, - ) - - route_node = _TestRouteNode(name='route_node') - target_node = _InterruptOnce(name='target_node') - wf = Workflow( - name='wf', - edges=[ - (START, route_node), - (route_node, {'next': target_node}), - ], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg1 = types.Content(parts=[types.Part(text='go')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - assert any(e.long_running_tool_ids for e in events1) - - msg2 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='approve', id='fc-123', response={'ok': True} - ) - ) - ], - role='user', - ) - events2: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events2.append(event) - - outputs = [e.output for e in events2 if e.output is not None] - assert 'done' in outputs - - -@pytest.mark.asyncio -async def test_rerun_on_resume_false_preserves_route_on_resume(): - """A rerun_on_resume=False node that sets ctx.route preserves it on resume. - - Setup: - START -> RouteAndInterruptNode (sets ctx.route='go', interrupts) - -> {'go': TargetNode} - Act: - - Turn 1: RouteAndInterruptNode sets route and interrupts. - - Turn 2: Resume by resolving the interrupt. - Assert: - - Turn 2: TargetNode fires (proving the route survived the resume) - and produces output 'reached'. - """ - - class _RouteAndInterruptNode(BaseNode): - """Sets ctx.route directly and interrupts. rerun_on_resume=False.""" - - rerun_on_resume: bool = False - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - ctx.route = 'go' - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='confirm', args={}, id='fc-route-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-route-1'}, - ) - - class _TargetNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(output='reached') - - route_node = _RouteAndInterruptNode(name='route_node') - target_node = _TargetNode(name='target_node') - wf = Workflow( - name='wf', - edges=[ - (START, route_node), - (route_node, {'go': target_node}), - ], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Turn 1: route_node sets route and interrupts. - msg1 = types.Content(parts=[types.Part(text='start')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - assert any(e.long_running_tool_ids for e in events1) - - # Turn 2: resolve the interrupt. - msg2 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='confirm', id='fc-route-1', response={'ok': True} - ) - ) - ], - role='user', - ) - events2: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events2.append(event) - - # target_node should have fired via the 'go' route. - outputs = [e.output for e in events2 if e.output is not None] - assert 'reached' in outputs - - -@pytest.mark.asyncio -async def test_route_and_output_triggers_downstream_on_resume(): - """Node with route and output triggers downstream on resume. - - Setup: - START -> NodeA (yields route='next', output='A') -> NodeB (interrupts). - Act: - - Turn 1: Run workflow. NodeA completes with route and output, NodeB interrupts. - - Turn 2: Resume workflow by resolving NodeB's interrupt. - Assert: - - Turn 1: NodeB was triggered (indicated by interrupt). - - Turn 2: NodeB runs and produces output (proving it was triggered). - """ - - class _RouteAndOutputNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(route='next', output='A') - - class _InterruptOnce(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if ctx.resume_inputs and 'fc-123' in ctx.resume_inputs: - assert node_input == 'A' - yield Event(output='done') - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='approve', args={}, id='fc-123' - ) - ) - ] - ), - long_running_tool_ids={'fc-123'}, - ) - - route_node = _RouteAndOutputNode(name='route_node') - target_node = _InterruptOnce(name='target_node') - wf = Workflow( - name='wf', - edges=[ - (START, route_node), - (route_node, {'next': target_node}), - ], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg1 = types.Content(parts=[types.Part(text='go')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - assert any(e.long_running_tool_ids for e in events1) - - msg2 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='approve', id='fc-123', response={'ok': True} - ) - ) - ], - role='user', - ) - events2: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events2.append(event) - - outputs = [e.output for e in events2 if e.output is not None] - assert 'done' in outputs diff --git a/tests/unittests/workflow/test_workflow_agent_as_node.py b/tests/unittests/workflow/test_workflow_agent_as_node.py deleted file mode 100644 index bfdc996ca6..0000000000 --- a/tests/unittests/workflow/test_workflow_agent_as_node.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for BaseAgent instances used as nodes in a Workflow.""" - -from typing import AsyncGenerator - -from google.adk.agents.base_agent import BaseAgent -from google.adk.agents.invocation_context import InvocationContext as BaseInvocationContext -from google.adk.events.event import Event -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.workflow import START -from google.adk.workflow._workflow import Workflow -from google.genai import types -import pytest - -from .workflow_testing_utils import InputCapturingNode -from .workflow_testing_utils import simplify_events_with_node - - -class SimpleAgent(BaseAgent): - """A simple agent for testing.""" - - message: str = '' - - async def _run_async_impl( - self, ctx: BaseInvocationContext - ) -> AsyncGenerator[Event, None]: - """Yields a single event with a message.""" - yield Event( - author=self.name, - invocation_id=ctx.invocation_id, - content=types.Content(parts=[types.Part(text=self.message)]), - ) - - -@pytest.mark.asyncio -async def test_run_async_with_agent_nodes(request: pytest.FixtureRequest): - """BaseAgent nodes emit content events through the workflow.""" - agent_a = SimpleAgent(name='AgentA', message='Hello') - agent_b = SimpleAgent(name='AgentB', message='World') - wf = Workflow( - name='wf_with_agents', - edges=[ - (START, agent_a), - (agent_a, agent_b), - ], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='start')], role='user') - events: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - assert simplify_events_with_node(events) == [ - ('wf_with_agents@1/AgentA@1', 'Hello'), - ('wf_with_agents@1/AgentB@1', 'World'), - ] - - -@pytest.mark.asyncio -async def test_run_async_with_agent_node_piping_data( - request: pytest.FixtureRequest, -): - """AgentNode content is not piped as output to the next node.""" - agent_a = SimpleAgent(name='AgentA', message='Hello') - node_b = InputCapturingNode(name='NodeB') - wf = Workflow( - name='wf_with_agent_piping', - edges=[ - (START, agent_a), - (agent_a, node_b), - ], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='start')], role='user') - async for _ in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - pass - - # AgentNode does not record content as node output, so the next node - # receives None as input. - assert node_b.received_inputs == [None] diff --git a/tests/unittests/workflow/test_workflow_bytes.py b/tests/unittests/workflow/test_workflow_bytes.py deleted file mode 100644 index bfa8121cc5..0000000000 --- a/tests/unittests/workflow/test_workflow_bytes.py +++ /dev/null @@ -1,137 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for Workflow handling of bytes and serialization.""" - -from __future__ import annotations - -from typing import Any -from typing import AsyncGenerator - -from google.adk.agents.context import Context -from google.adk.events.event import Event -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.workflow import BaseNode -from google.adk.workflow import START -from google.adk.workflow._workflow import Workflow -from google.genai import types -from pydantic import ConfigDict -from pydantic import Field -import pytest - -# --- Helpers --- - - -class _BytesOutputNode(BaseNode): - """Yields bytes content or raw bytes.""" - - raw_bytes: bool = False - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - data = b"\x89PNG\r\n\x1a\n" - if self.raw_bytes: - yield data - else: - yield Event( - content=types.Content( - parts=[types.Part.from_bytes(data=data, mime_type="image/png")] - ), - output="bytes_sent", - ) - - -class _InputCapturingNode(BaseNode): - """Captures node_input for later assertion.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - received_inputs: list[Any] = Field(default_factory=list) - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - self.received_inputs.append(node_input) - yield {"received": node_input} - - -async def _run_workflow(wf, message="start"): - """Run a Workflow through Runner, return collected events.""" - ss = InMemorySessionService() - runner = Runner(app_name="test", node=wf, session_service=ss) - session = await ss.create_session(app_name="test", user_id="u") - msg = types.Content(parts=[types.Part(text=message)], role="user") - events = [] - async for event in runner.run_async( - user_id="u", session_id=session.id, new_message=msg - ): - events.append(event) - return events, ss, session - - -# --- Tests --- - - -@pytest.mark.asyncio -async def test_bytes_in_content_output(): - """Content with bytes propagates to downstream node.""" - a = _BytesOutputNode(name="a", raw_bytes=False) - b = _InputCapturingNode(name="b") - wf = Workflow(name="wf", edges=[(START, a, b)]) - - events, _, _ = await _run_workflow(wf) - - assert b.received_inputs == ["bytes_sent"] - - -@pytest.mark.asyncio -async def test_raw_bytes_output(): - """Raw bytes output propagates to downstream node.""" - a = _BytesOutputNode(name="a", raw_bytes=True) - b = _InputCapturingNode(name="b") - wf = Workflow(name="wf", edges=[(START, a, b)]) - - events, _, _ = await _run_workflow(wf) - - assert len(b.received_inputs) == 1 - assert isinstance(b.received_inputs[0], bytes) - - -@pytest.mark.xfail(reason="Checkpoint/resume not yet in new Workflow.") -@pytest.mark.asyncio -async def test_bytes_in_node_input_serialization(): - """Bytes in node input survive checkpoint/resume.""" - assert False, "TODO" - - -@pytest.mark.xfail(reason="Checkpoint/resume not yet in new Workflow.") -@pytest.mark.asyncio -async def test_bytes_in_typed_model_input(): - """Bytes in Pydantic model input survive round-trip.""" - assert False, "TODO" - - -@pytest.mark.xfail(reason="Checkpoint/resume not yet in new Workflow.") -@pytest.mark.asyncio -async def test_bytes_in_trigger_buffer(): - """Bytes in trigger buffer survive serialization.""" - assert False, "TODO" - - -@pytest.mark.xfail(reason="Checkpoint/resume not yet in new Workflow.") -@pytest.mark.asyncio -async def test_bytes_full_workflow_resume(): - """Full resume with bytes data end-to-end.""" - assert False, "TODO" diff --git a/tests/unittests/workflow/test_workflow_concurrency.py b/tests/unittests/workflow/test_workflow_concurrency.py deleted file mode 100644 index bd2cf43a4f..0000000000 --- a/tests/unittests/workflow/test_workflow_concurrency.py +++ /dev/null @@ -1,132 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import asyncio -from typing import Any -from typing import AsyncGenerator - -from google.adk.agents.context import Context -from google.adk.apps.app import App -from google.adk.events.event import Event -from google.adk.workflow import BaseNode -from google.adk.workflow import START -from google.adk.workflow._parallel_worker import _ParallelWorker as ParallelWorker -from google.adk.workflow._workflow import Workflow -from pydantic import Field -import pytest -from typing_extensions import override - -from .. import testing_utils -from .workflow_testing_utils import create_parent_invocation_context - - -@pytest.mark.asyncio -async def test_max_concurrency_limits_running_nodes( - request: pytest.FixtureRequest, -): - """Max concurrency limits the number of parallel graph-scheduled nodes. - - Setup: - Workflow with 4 parallel nodes and max_concurrency=2. - Act: - - Start workflow in background. - - Release nodes one by one. - Assert: - - Initially only 2 nodes start. - - Releasing one node allows another to start. - - All nodes eventually complete. - """ - - class ConcurrencyWorkerNode(BaseNode): - """A node that signals when it starts and waits for a signal to finish.""" - - started_event: asyncio.Event - finish_event: asyncio.Event - - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - self.started_event.set() - await self.finish_event.wait() - yield f'{self.name}_done' - - class TerminalNode(BaseNode): - - @override - async def _run_impl( - self, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield 'workflow_done' - - # Given a workflow with 4 parallel nodes and max_concurrency=2 - num_nodes = 4 - max_concurrency = 2 - started_events = [asyncio.Event() for _ in range(num_nodes)] - finish_events = [asyncio.Event() for _ in range(num_nodes)] - - nodes = [ - ConcurrencyWorkerNode( - name=f'Node{i}', - started_event=started_events[i], - finish_event=finish_events[i], - ) - for i in range(num_nodes) - ] - - terminal_node = TerminalNode(name='Terminal') - edges = [(START, tuple(nodes), terminal_node)] - - agent = Workflow( - name='concurrency_agent', - max_concurrency=max_concurrency, - edges=edges, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - - # When the workflow is run in background - async def run_agent(): - return await runner.run_async(testing_utils.get_user_content('start')) - - run_task = asyncio.create_task(run_agent()) - - # Then initially only max_concurrency nodes should start - await asyncio.sleep(0.1) - started_count = sum(1 for e in started_events if e.is_set()) - assert started_count == max_concurrency - - # When one node is released - for i in range(num_nodes): - if started_events[i].is_set(): - finish_events[i].set() - break - - # Then another node should start, bringing total to max_concurrency + 1 - await asyncio.sleep(0.1) - started_count = sum(1 for e in started_events if e.is_set()) - assert started_count == max_concurrency + 1 - - # When all remaining nodes are released - for e in finish_events: - e.set() - - # Then all nodes should eventually complete - await run_task - started_count = sum(1 for e in started_events if e.is_set()) - assert started_count == num_nodes diff --git a/tests/unittests/workflow/test_workflow_dynamic_nodes.py b/tests/unittests/workflow/test_workflow_dynamic_nodes.py deleted file mode 100644 index 8ba3febe74..0000000000 --- a/tests/unittests/workflow/test_workflow_dynamic_nodes.py +++ /dev/null @@ -1,1299 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for dynamic node scheduling in new Workflow. - -Covers the three cases from doc 18 (Dynamic Node Resume via Lazy Scan): -- Case 1: Fresh execution (no prior events) -- Case 2: Completed dedup (return cached output on rerun) -- Case 3: Interrupted resume (rerun with resume_inputs) - -Plus edge cases for multiple dynamic nodes, nested dynamic nodes, -and use_as_output delegation. -""" - -import asyncio -from typing import Any -from typing import AsyncGenerator - -from google.adk.agents.context import Context -from google.adk.events.event import Event -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.workflow import node -from google.adk.workflow import START -from google.adk.workflow._errors import DynamicNodeFailError -from google.adk.workflow._workflow import Workflow -from google.genai import types -import pytest - -# --- Helpers --- - - -async def _run( - runner: Runner, - ss: InMemorySessionService, - session: Any, - message: str, -) -> list[Event]: - """Send a text message and collect events.""" - msg = types.Content(parts=[types.Part(text=message)], role='user') - events: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - return events - - -async def _resume( - runner: Runner, - ss: InMemorySessionService, - session: Any, - fc_id: str, - response: Any, -) -> list[Event]: - """Send a function response and collect events.""" - if not isinstance(response, dict): - response = {'value': response} - msg = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='tool', id=fc_id, response=response - ) - ) - ], - role='user', - ) - events: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - return events - - -def _outputs(events: list[Event]) -> list[Any]: - """Extract non-None outputs.""" - return [e.output for e in events if e.output is not None] - - -def _interrupt_ids(events: list[Event]) -> set[str]: - """Extract interrupt IDs from events.""" - ids: set[str] = set() - for e in events: - if e.long_running_tool_ids: - ids.update(e.long_running_tool_ids) - return ids - - -# ========================================================================= -# Fresh execution (no resume) -# ========================================================================= - - -@pytest.mark.asyncio -async def test_dynamic_node_fresh_execution(): - """Dynamic node runs normally on first invocation. - - Setup: Parent (rerun_on_resume=True) calls ctx.run_node(Child). - Action: Send a text message to trigger the workflow. - Assert: Parent receives Child's output and yields the combined result. - """ - - @node - async def child(*, ctx, node_input): - yield f'child got: {node_input}' - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - result = await ctx.run_node(child, node_input='hello') - yield f'parent got: {result}' - - wf = Workflow(name='wf', edges=[(START, parent)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - events = await _run(runner, ss, session, 'go') - - outputs = _outputs(events) - assert 'parent got: child got: hello' in outputs - - -@pytest.mark.asyncio -async def test_dynamic_node_with_downstream_static(): - """Dynamic child's output flows to a downstream static node. - - Setup: Parent calls ctx.run_node(Child). Parent is followed by - a static After node in the graph. - Action: Send a text message. - Assert: After node receives Parent's output (which includes - Child's result) as node_input. - """ - - @node - async def child(*, ctx, node_input): - yield f'child: {node_input}' - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - result = await ctx.run_node(child, node_input='forwarded') - yield result - - @node - async def after(*, ctx, node_input): - yield f'after: {node_input}' - - wf = Workflow( - name='wf', - edges=[(START, parent, after)], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - events = await _run(runner, ss, session, 'hello') - outputs = _outputs(events) - assert 'after: child: forwarded' in outputs - - -# ========================================================================= -# Single-level resume (interrupt → FR → resume) -# ========================================================================= - - -@pytest.mark.asyncio -async def test_dynamic_node_interrupted_resume(): - """Dynamic child interrupts, then resumes with FR on parent rerun. - - Setup: Parent calls ctx.run_node(Approver). Approver interrupts - with fc-1. - Action: Send FR for fc-1 with {answer: 'yes'}. - Assert: - - Approver resumes and outputs 'approved: yes'. - - Parent yields the final combined result. - """ - - @node(rerun_on_resume=True) - async def approver(*, ctx, node_input): - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'approved: {ctx.resume_inputs["fc-1"]["answer"]}' - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='approve', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - result = await ctx.run_node(approver) - yield f'final: {result}' - - wf = Workflow(name='wf', edges=[(START, parent)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: interrupts - events1 = await _run(runner, ss, session, 'go') - assert 'fc-1' in _interrupt_ids(events1) - - # Run 2: resume - events2 = await _resume(runner, ss, session, 'fc-1', {'answer': 'yes'}) - outputs = _outputs(events2) - assert 'final: approved: yes' in outputs - - -@pytest.mark.asyncio -async def test_dynamic_node_completed_dedup_on_resume(): - """Completed dynamic child returns cached output when parent reruns. - - Setup: Parent calls ctx.run_node(Completer) then - ctx.run_node(Interrupter). Completer completes, Interrupter - interrupts with fc-1. - Action: Send FR for fc-1 to resume. - Assert: - - Parent reruns (call_count increments to 2). - - Completer is NOT re-executed (dedup returns cached output). - - Interrupter resumes with the FR response. - - Final output combines both results. - """ - - @node - async def completer(*, ctx, node_input): - yield 'completed_result' - - @node(rerun_on_resume=True) - async def interrupter(*, ctx, node_input): - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'resumed: {ctx.resume_inputs["fc-1"]["value"]}' - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - call_count = [0] - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - call_count[0] += 1 - - r1 = await ctx.run_node(completer) - r2 = await ctx.run_node(interrupter) - yield f'{r1} + {r2}' - - wf = Workflow(name='wf', edges=[(START, parent)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: completer completes, interrupter interrupts - events1 = await _run(runner, ss, session, 'go') - assert _interrupt_ids(events1) - assert call_count[0] == 1 - - # Run 2: resume interrupter - events2 = await _resume(runner, ss, session, 'fc-1', 'done') - - # Parent should have rerun (call_count=2). - # Completer should NOT re-execute (dedup returns cached). - # Interrupter resumes with FR. - assert call_count[0] == 2 - outputs = _outputs(events2) - assert 'completed_result + resumed: done' in outputs - - -@pytest.mark.asyncio -async def test_dynamic_node_sequential_interrupts(): - """Sequential dynamic children interrupt one at a time. - - Setup: Parent calls ctx.run_node(a) then ctx.run_node(b). - Both children interrupt, but sequentially — a interrupts first, - parent never reaches b until a is resolved. - Action: Resume a, then b. - Assert: - - Run 1: only fc-a interrupts (parent didn't reach b). - - Run 2 (resume fc-a): a completes, parent continues to b, - b interrupts with fc-b. - - Run 3 (resume fc-b): b completes, parent yields combined - output. - """ - - @node(rerun_on_resume=True) - async def a(*, ctx, node_input): - if ctx.resume_inputs and 'fc-a' in ctx.resume_inputs: - yield f'a: {ctx.resume_inputs["fc-a"]["value"]}' - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-a' - ) - ) - ] - ), - long_running_tool_ids={'fc-a'}, - ) - - @node(rerun_on_resume=True) - async def b(*, ctx, node_input): - if ctx.resume_inputs and 'fc-b' in ctx.resume_inputs: - yield f'b: {ctx.resume_inputs["fc-b"]["value"]}' - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-b' - ) - ) - ] - ), - long_running_tool_ids={'fc-b'}, - ) - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - r1 = await ctx.run_node(a, node_input=node_input) - r2 = await ctx.run_node(b, node_input=node_input) - yield f'{r1} + {r2}' - - wf = Workflow(name='wf', edges=[(START, parent)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: a interrupts, parent never reaches b - events1 = await _run(runner, ss, session, 'go') - ids1 = _interrupt_ids(events1) - assert 'fc-a' in ids1 - assert 'fc-b' not in ids1 - - # Run 2: resume a → a completes, parent reaches b → b interrupts - events2 = await _resume(runner, ss, session, 'fc-a', 'done-a') - ids2 = _interrupt_ids(events2) - assert 'fc-b' in ids2 - - # Run 3: resume b → b completes, parent yields combined output - events3 = await _resume(runner, ss, session, 'fc-b', 'done-b') - outputs = _outputs(events3) - assert 'a: done-a + b: done-b' in outputs - - -@pytest.mark.asyncio -async def test_dynamic_node_run_id_reused_on_resume(): - """Resumed dynamic child reuses run_id from original run. - - Setup: Parent calls ctx.run_node(Interrupter). Interrupter - interrupts with fc-1. - Action: Send FR for fc-1. - Assert: The resumed Interrupter's output event has the same - run_id as the original interrupt event. - """ - - @node(rerun_on_resume=True) - async def interrupter(*, ctx, node_input): - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield 'resumed' - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - result = await ctx.run_node(interrupter) - yield result - - wf = Workflow(name='wf', edges=[(START, parent)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: interrupts - events1 = await _run(runner, ss, session, 'go') - interrupt_event = [e for e in events1 if e.long_running_tool_ids][0] - original_run_id = interrupt_event.node_info.run_id - - # Run 2: resume - events2 = await _resume(runner, ss, session, 'fc-1', 'ok') - resumed_output_events = [ - e - for e in events2 - if e.output == 'resumed' and 'interrupter' in (e.node_info.path or '') - ] - assert len(resumed_output_events) == 1 - assert resumed_output_events[0].node_info.run_id == original_run_id - - -# ========================================================================= -# Nested workflow + dynamic node combinations -# ========================================================================= - - -@pytest.mark.asyncio -async def test_nested_static_workflow_with_dynamic_interrupt(): - """Static sub-workflow's node schedules a dynamic node that interrupts. - - Setup: outer_wf → inner_wf (static). Inside inner_wf, a static - parent node calls ctx.run_node(Approver). Approver interrupts. - Action: Send FR to resume. - Assert: Approver resumes, parent completes, inner_wf completes, - outer_wf completes. - """ - - @node(rerun_on_resume=True) - async def approver(*, ctx, node_input): - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'approved: {ctx.resume_inputs["fc-1"]["value"]}' - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - result = await ctx.run_node(approver) - yield f'parent: {result}' - - inner_wf = Workflow( - name='inner_wf', - edges=[(START, parent)], - ) - outer_wf = Workflow( - name='outer_wf', - edges=[(START, inner_wf)], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=outer_wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: dynamic approver interrupts inside inner_wf - events1 = await _run(runner, ss, session, 'go') - assert 'fc-1' in _interrupt_ids(events1) - - # Run 2: resume - events2 = await _resume(runner, ss, session, 'fc-1', 'yes') - outputs = _outputs(events2) - assert 'parent: approved: yes' in outputs - - -@pytest.mark.asyncio -async def test_dynamic_workflow_with_static_interrupt(): - """Dynamic child is a Workflow whose static node interrupts. - - Setup: Parent calls ctx.run_node(inner_wf). inner_wf has a - static Interrupter node that interrupts with fc-1. - Action: Send FR to resume. - Assert: Interrupter resumes, inner_wf completes, parent - receives inner_wf's output. - """ - - @node(rerun_on_resume=True) - async def step(*, ctx, node_input): - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'done: {ctx.resume_inputs["fc-1"]["value"]}' - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - inner_wf = Workflow( - name='inner_wf', - edges=[(START, step)], - ) - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - result = await ctx.run_node(inner_wf) - yield f'parent: {result}' - - outer_wf = Workflow( - name='outer_wf', - edges=[(START, parent)], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=outer_wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: inner_wf's static node interrupts - events1 = await _run(runner, ss, session, 'go') - assert 'fc-1' in _interrupt_ids(events1) - - # Run 2: resume - events2 = await _resume(runner, ss, session, 'fc-1', 'ok') - outputs = _outputs(events2) - assert 'parent: done: ok' in outputs - - -@pytest.mark.asyncio -async def test_dynamic_workflow_with_nested_dynamic_interrupt(): - """Dynamic Workflow's inner node schedules another dynamic node. - - Setup: Parent calls ctx.run_node(inner_wf). inner_wf has a - static Orchestrator node that calls ctx.run_node(Approver). - Approver interrupts with fc-1. - Action: Send FR to resume. - Assert: Approver resumes → Orchestrator completes → inner_wf - completes → Parent receives output. Three levels of dynamic - nesting resolved correctly. - """ - - @node(rerun_on_resume=True) - async def approver(*, ctx, node_input): - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'approved: {ctx.resume_inputs["fc-1"]["value"]}' - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - @node(rerun_on_resume=True) - async def orch(*, ctx, node_input): - result = await ctx.run_node(approver) - yield f'orch: {result}' - - inner_wf = Workflow( - name='inner_wf', - edges=[(START, orch)], - ) - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - result = await ctx.run_node(inner_wf) - yield f'parent: {result}' - - outer_wf = Workflow( - name='outer_wf', - edges=[(START, parent)], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=outer_wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: deeply nested approver interrupts - events1 = await _run(runner, ss, session, 'go') - assert 'fc-1' in _interrupt_ids(events1) - - # Run 2: resume - events2 = await _resume(runner, ss, session, 'fc-1', 'granted') - outputs = _outputs(events2) - assert 'parent: orch: approved: granted' in outputs - - -# ========================================================================= -# Scoping: parallel parents with same-named dynamic children -# ========================================================================= - - -@pytest.mark.asyncio -async def test_parallel_parents_same_named_dynamic_children(): - """Two static parents schedule dynamic children with the same name. - - Setup: outer_wf fans out to parent_a and parent_b (parallel). - Both call ctx.run_node(Child(name='child')). parent_a's child - completes, parent_b's child interrupts. - Action: Send FR to resume parent_b's child. - Assert: - - parent_a's child and parent_b's child are distinct (scoped - by parent_path: wf/parent_a/child vs wf/parent_b/child). - - On resume, parent_a's child returns cached output (dedup), - parent_b's child resumes with FR. - - Both parents complete. - """ - - @node(rerun_on_resume=True) - async def child(*, ctx, node_input): - if ctx.resume_inputs and 'fc-b' in ctx.resume_inputs: - yield f'resumed: {ctx.resume_inputs["fc-b"]["value"]}' - return - if node_input == 'interrupt': - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-b' - ) - ) - ] - ), - long_running_tool_ids={'fc-b'}, - ) - else: - yield f'child: {node_input}' - - @node(rerun_on_resume=True) - async def parent_a(*, ctx, node_input): - result = await ctx.run_node(child, node_input='complete') - yield f'a: {result}' - - @node(rerun_on_resume=True) - async def parent_b(*, ctx, node_input): - result = await ctx.run_node(child, node_input='interrupt') - yield f'b: {result}' - - from google.adk.workflow import JoinNode - - join = JoinNode(name='join') - wf = Workflow( - name='wf', - edges=[ - (START, parent_a, join), - (START, parent_b, join), - ], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: parent_a completes, parent_b's child interrupts - events1 = await _run(runner, ss, session, 'go') - assert 'fc-b' in _interrupt_ids(events1) - # parent_a should have completed - a_outputs = [ - e.output for e in events1 if e.output and 'a: child' in str(e.output) - ] - assert len(a_outputs) == 1 - - # Run 2: resume parent_b's child - events2 = await _resume(runner, ss, session, 'fc-b', 'done') - outputs = _outputs(events2) - # Both parents completed, join has both results - assert any('b: resumed: done' in str(o) for o in outputs) - - -# ========================================================================= -# use_as_output + interrupt -# ========================================================================= - - -@pytest.mark.asyncio -async def test_dynamic_node_use_as_output_with_interrupt(): - """Dynamic child with use_as_output=True interrupts then resumes. - - Setup: Parent calls ctx.run_node(child, use_as_output=True). - Child interrupts with fc-1. - Action: Send FR for fc-1. - Assert: - - On resume, child resumes and its output becomes the parent's - output (use_as_output delegation). - - The parent's own output event is suppressed. - """ - - @node(rerun_on_resume=True) - async def child(*, ctx, node_input): - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'child: {ctx.resume_inputs["fc-1"]["value"]}' - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - result = await ctx.run_node(child, use_as_output=True) - # Set on ctx so orchestrator reads it. _output_delegated - # suppresses the output Event (child already emitted it). - ctx.output = result - yield # keep as async generator - - wf = Workflow( - name='wf', - edges=[(START, parent)], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: child interrupts - events1 = await _run(runner, ss, session, 'go') - assert 'fc-1' in _interrupt_ids(events1) - - # Run 2: resume - events2 = await _resume(runner, ss, session, 'fc-1', 'approved') - outputs = _outputs(events2) - assert 'child: approved' in outputs - # Parent's output should be suppressed (use_as_output) - parent_outputs = [ - e.output - for e in events2 - if e.node_info.path == 'wf/parent' and e.output is not None - ] - assert len(parent_outputs) == 0 - - -# ========================================================================= -# None-output completion after interrupt -# ========================================================================= - - -@pytest.mark.asyncio -@pytest.mark.xfail( - reason='No completion marker event for None output (event design flaw)' -) -async def test_dynamic_node_none_output_not_rerun(): - """Dynamic child that completed with None output is not re-run. - - Setup: Parent calls ctx.run_node(A) then ctx.run_node(B). - A interrupts. On resume, A completes with no output (None). - Parent continues to B, which also interrupts. - Action: Resume B. - Assert: - - On Run 3, A should NOT re-run (it already completed). - - A should return None (cached), B resumes. - - Currently fails because A's None completion leaves no - trace in session events — the lazy scan thinks A still - needs to re-run. - """ - run_count_a = [0] - - @node(rerun_on_resume=True) - async def a(*, ctx, node_input): - run_count_a[0] += 1 - if ctx.resume_inputs and 'fc-a' in ctx.resume_inputs: - # Complete with no output. - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-a' - ) - ) - ] - ), - long_running_tool_ids={'fc-a'}, - ) - - @node(rerun_on_resume=True) - async def b(*, ctx, node_input): - if ctx.resume_inputs and 'fc-b' in ctx.resume_inputs: - yield f'b: {ctx.resume_inputs["fc-b"]["value"]}' - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-b' - ) - ) - ] - ), - long_running_tool_ids={'fc-b'}, - ) - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - await ctx.run_node(a) - result = await ctx.run_node(b) - yield f'done: {result}' - - wf = Workflow(name='wf', edges=[(START, parent)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: A interrupts - events1 = await _run(runner, ss, session, 'go') - assert 'fc-a' in _interrupt_ids(events1) - assert run_count_a[0] == 1 - - # Run 2: resume A → A completes (None), parent reaches B → B interrupts - events2 = await _resume(runner, ss, session, 'fc-a', 'ok') - assert 'fc-b' in _interrupt_ids(events2) - assert run_count_a[0] == 2 # A re-ran once for resume - - # Run 3: resume B → A should NOT re-run (already completed) - events3 = await _resume(runner, ss, session, 'fc-b', 'done') - assert run_count_a[0] == 2 # A should NOT have run again - outputs = _outputs(events3) - assert any('done:' in str(o) for o in outputs) - - -# ========================================================================= -# rerun_on_resume=False for dynamic node -# ========================================================================= - - -@pytest.mark.asyncio -async def test_dynamic_node_rerun_on_resume_false(): - """Dynamic child with rerun_on_resume=False auto-completes on resume. - - Setup: Parent calls ctx.run_node(child). Child has - rerun_on_resume=False and interrupts with fc-1. - Action: Send FR for fc-1. - Assert: - - Child does NOT re-execute _run_impl. - - Child auto-completes with the FR response as output. - - Parent receives the auto-completed output. - """ - run_count = [0] - - @node(rerun_on_resume=False) - async def child(*, ctx, node_input): - run_count[0] += 1 - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - result = await ctx.run_node(child) - yield f'parent: {result}' - - wf = Workflow( - name='wf', - edges=[(START, parent)], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: child interrupts - events1 = await _run(runner, ss, session, 'go') - assert 'fc-1' in _interrupt_ids(events1) - assert run_count[0] == 1 - - # Run 2: resume - events2 = await _resume(runner, ss, session, 'fc-1', {'answer': 42}) - - # Child should NOT have re-executed (run_count stays 1). - assert run_count[0] == 1 - # Parent receives the FR response as child's output (unwrapped). - outputs = _outputs(events2) - assert "parent: {'answer': 42}" in outputs - - -# ========================================================================= -# Sequential run_id -# ========================================================================= - - -@pytest.mark.asyncio -async def test_dynamic_nodes_get_run_id_one(): - """Each distinct dynamic child gets run_id '1' for its first run.""" - - @node - async def step_a(*, ctx, node_input): - yield f'child: {node_input}' - - @node - async def step_b(*, ctx, node_input): - yield f'child: {node_input}' - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - a = await ctx.run_node(step_a, node_input='x') - b = await ctx.run_node(step_b, node_input='y') - yield f'{a},{b}' - - wf = Workflow(name='wf', edges=[(START, parent)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - events = await _run(runner, ss, session, 'go') - - child_events = [ - (e.node_name, e.node_info.path.split('@')[-1]) - for e in events - if e.output is not None - and e.node_name - and e.node_name.startswith('step_') - ] - # Each dynamic child is a distinct path, each gets run_id '1'. - assert child_events == [('step_a', '1'), ('step_b', '1')] - - -@pytest.mark.asyncio -async def test_dynamic_node_keeps_run_id_on_resume(): - """A dynamic node that interrupts and resumes keeps the same run_id.""" - - @node(rerun_on_resume=True) - async def approver(*, ctx, node_input): - if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: - yield f'approved: {ctx.resume_inputs["fc-1"]["answer"]}' - return - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='approve', args={}, id='fc-1' - ) - ) - ] - ), - long_running_tool_ids={'fc-1'}, - ) - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - result = await ctx.run_node(approver) - yield f'final: {result}' - - wf = Workflow(name='wf', edges=[(START, parent)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: child interrupts. - events1 = await _run(runner, ss, session, 'go') - approver_run_ids_1 = [ - e.node_info.path.split('@')[-1] - for e in events1 - if e.node_info.path and 'approver@' in e.node_info.path - ] - - # Run 2: resume with function response. - events2 = await _resume(runner, ss, session, 'fc-1', {'answer': 'yes'}) - approver_run_ids_2 = [ - e.node_info.path.split('@')[-1] - for e in events2 - if e.node_info.path and 'approver@' in e.node_info.path - ] - - # Same run_id across interrupt and resume. - assert approver_run_ids_1 - assert approver_run_ids_2 - assert approver_run_ids_1[0] == approver_run_ids_2[0] - - -# ========================================================================= -# Custom run_id -# ========================================================================= - - -@pytest.mark.asyncio -async def test_custom_run_id_used_on_events(): - """ctx.run_node(run_id=...) sets the custom run_id on child events.""" - - @node - async def child(*, ctx, node_input): - yield f'done: {node_input}' - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - result = await ctx.run_node( - child, node_input='hello', run_id='my-custom-id' - ) - yield result - - wf = Workflow(name='wf', edges=[(START, parent)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - events = await _run(runner, ss, session, 'go') - - child_events = [ - e - for e in events - if e.node_info and e.node_info.path and 'child' in e.node_info.path - ] - assert child_events - assert all( - e.node_info.path.split('@')[-1] == 'my-custom-id' for e in child_events - ) - - -# ========================================================================= -# Failure handling in dynamic nodes -# ========================================================================= - - -@pytest.mark.asyncio -async def test_dynamic_node_failure_handling(): - """Dynamic node throws exception; parent catches it and continues.""" - - @node - async def failing_node(*, ctx, node_input): - if node_input == 'fail': - raise ValueError('Intentional Failure') - yield f'Processed {node_input}' - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - results = [] - try: - await ctx.run_node(failing_node, node_input='fail') - except DynamicNodeFailError as e: - results.append(f'Caught: {str(e.error)}') - - res = await ctx.run_node(failing_node, node_input='work') - results.append(f'Success: {res}') - yield results - - wf = Workflow(name='wf', edges=[(START, parent)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - events = await _run(runner, ss, session, 'go') - outputs = _outputs(events) - - # Find the list output from parent - list_outputs = [o for o in outputs if isinstance(o, list)] - assert len(list_outputs) == 1 - results = list_outputs[0] - assert 'Caught: Intentional Failure' in results - assert 'Success: Processed work' in results - - -@pytest.mark.asyncio -async def test_workflow_resume_does_not_rerun_completed_llm_agent(): - """Completed LlmAgent node is not rerun upon workflow resumption. - - Setup: Workflow with LlmAgent node and an interrupting node. - Act: - - Run 1: Start workflow, LlmAgent completes, workflow interrupts. - - Run 2: Resume workflow by resolving interrupt. - Assert: - - LlmAgent does not run again in Run 2. - """ - from google.adk.agents.llm_agent import LlmAgent - - from tests.unittests import testing_utils - - # Given a workflow with an LlmAgent and a mock model - mock_model = testing_utils.MockModel.create( - responses=['LLM output content', 'Duplicate run output'] - ) - - agent = LlmAgent(name='my_agent', model=mock_model) - - @node - async def interrupt_node(*, ctx, node_input): - event = Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='tool', id='interrupt_1', args={} - ) - ) - ] - ) - ) - event.long_running_tool_ids = {'interrupt_1'} - yield event - yield f'Resumed with {node_input}' - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - res = await ctx.run_node(agent, node_input='go') - res2 = await ctx.run_node(interrupt_node, node_input=res) - yield res2 - - wf = Workflow(name='wf', edges=[(START, parent)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # When the workflow is run until it interrupts - await _run(runner, ss, session, 'go') - - session = await ss.get_session( - app_name='test', user_id='u', session_id=session.id - ) - - agent_events = [ - e for e in session.events if e.node_info.name == 'my_agent' and e.content - ] - assert len(agent_events) > 0 - agent_event = agent_events[-1] - - # Verify that runners.py cleared the output - assert agent_event.output is None - - # When the workflow is resumed by resolving the interrupt - resume_events = await _resume( - runner, ss, session, fc_id='interrupt_1', response='done' - ) - - # Then the LlmAgent should not run again - agent_runs_again = [ - e for e in resume_events if e.node_info.name == 'my_agent' and e.content - ] - assert ( - len(agent_runs_again) == 0 - ), 'Expected LlmAgent to NOT run again, but it did!' - - -# ========================================================================= -# Parallel execution of dynamic nodes -# ========================================================================= - - -@pytest.mark.asyncio -async def test_dynamic_node_parallel_execution(): - """Three parallel ctx.run_node calls via asyncio.gather return ordered results.""" - - @node - async def echo_node(*, ctx, node_input): - yield node_input - - @node(rerun_on_resume=True) - async def parent_node(*, ctx, node_input): - tasks = [ctx.run_node(echo_node, node_input=f'call_{i}') for i in range(3)] - results = await asyncio.gather(*tasks) - yield results - - wf = Workflow(name='wf', edges=[(START, parent_node)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - events = await _run(runner, ss, session, 'go') - outputs = _outputs(events) - - # Find the list output from parent - list_outputs = [o for o in outputs if isinstance(o, list)] - assert len(list_outputs) == 1 - results = list_outputs[0] - assert results == ['call_0', 'call_1', 'call_2'] - - -@pytest.mark.asyncio -async def test_inner_llm_agent_node_input_survives_tool_round_trip(): - """Inner LlmAgent's node_input reaches every LLM request across a tool round trip. - - Setup: Workflow with a single dynamic node whose body invokes an inner - LlmAgent. The agent's mock model emits a function_call on the first - turn and final text on the second turn. - Act: Run the workflow once; the dynamic node passes USER_PHRASE to the - inner agent. - Assert: - - The mock model is called exactly twice (pre- and post-tool). - - USER_PHRASE appears in the user-role text of both LLM requests. - - The second request contains both function_call and function_response - (proving a real tool round trip occurred). - """ - from google.adk.agents.llm_agent import LlmAgent - from google.adk.tools import FunctionTool - - from tests.unittests import testing_utils - - USER_PHRASE = 'lookup price for token MARKER-7Z9' - - def lookup_price(token: str) -> dict: - return {'price': '$9.99'} - - def _user_texts(req) -> list[str]: - texts: list[str] = [] - for content in req.contents or []: - if content.role != 'user': - continue - for part in content.parts or []: - if part.text and not part.text.startswith('For context:'): - texts.append(part.text) - return texts - - def _part_kinds(req) -> list[str]: - kinds: list[str] = [] - for content in req.contents or []: - for part in content.parts or []: - if part.function_call: - kinds.append('function_call') - elif part.function_response: - kinds.append('function_response') - else: - kinds.append('text') - return kinds - - mock_model = testing_utils.MockModel.create( - responses=[ - [ - types.Part( - function_call=types.FunctionCall( - id='fc1', - name='lookup_price', - args={'token': 'MARKER-7Z9'}, - ) - ) - ], - 'The price is $9.99.', - ] - ) - - inner_agent = LlmAgent( - name='inner_agent', - model=mock_model, - tools=[FunctionTool(lookup_price)], - ) - - @node(rerun_on_resume=True) - async def parent(*, ctx, node_input): - yield await ctx.run_node(inner_agent, node_input=USER_PHRASE) - - wf = Workflow(name='wf', edges=[(START, parent)]) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # When the workflow runs end-to-end through the tool round trip - await _run(runner, ss, session, 'go') - - # Then the model is invoked exactly twice - assert len(mock_model.requests) == 2 - - # And USER_PHRASE survives into both LLM requests - assert any(USER_PHRASE in t for t in _user_texts(mock_model.requests[0])) - assert any( - USER_PHRASE in t for t in _user_texts(mock_model.requests[1]) - ), 'original node_input was dropped from the second LLM request' - - # And the second request reflects a real tool round trip - second_request_kinds = _part_kinds(mock_model.requests[1]) - assert 'function_call' in second_request_kinds - assert 'function_response' in second_request_kinds diff --git a/tests/unittests/workflow/test_workflow_failures.py b/tests/unittests/workflow/test_workflow_failures.py deleted file mode 100644 index 46c2d188ab..0000000000 --- a/tests/unittests/workflow/test_workflow_failures.py +++ /dev/null @@ -1,1070 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for Workflow error handling, graceful shutdown, and retry logic.""" - -import asyncio -from typing import Any -from typing import AsyncGenerator -from unittest import mock - -from google.adk.agents.context import Context -from google.adk.apps.app import App -from google.adk.events.event import Event -# Added for the moved test -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.workflow import BaseNode -from google.adk.workflow import Edge -from google.adk.workflow import START -from google.adk.workflow._graph import Graph -from google.adk.workflow._node import node -from google.adk.workflow._node import Node -from google.adk.workflow._node_status import NodeStatus -from google.adk.workflow._retry_config import RetryConfig -from google.adk.workflow._workflow import Workflow -from google.genai import types -from pydantic import ConfigDict -from pydantic import Field -import pytest -from typing_extensions import override - -from .. import testing_utils -from .workflow_testing_utils import create_parent_invocation_context -from .workflow_testing_utils import simplify_events_with_node -from .workflow_testing_utils import TestingNode - - -class CustomError(Exception): - """A custom error for testing.""" - - -class CustomRetryableError(Exception): - """A custom error meant to be retried.""" - - -class CustomNonRetryableError(Exception): - """A custom error not meant to be retried.""" - - -class _FlakyNode(BaseNode): - model_config = ConfigDict(arbitrary_types_allowed=True) - - message: str = Field(default='') - succeed_on_iteration: int = Field(default=0) - tracker: dict[str, Any] = Field(default_factory=dict) - exception_to_raise: Exception = Field(...) - - @override - async def run( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - iteration_count = self.tracker.get('iteration_count', 0) + 1 - self.tracker['iteration_count'] = iteration_count - self.tracker.setdefault('attempt_counts', []).append(ctx.attempt_count) - - if iteration_count < self.succeed_on_iteration: - raise self.exception_to_raise - - yield Event( - output=self.message, - ) - - -async def _run_workflow(wf, message='start'): - """Run a Workflow through Runner, return collected events.""" - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - msg = types.Content(parts=[types.Part(text=message)], role='user') - events = [] - try: - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - except CustomError: - pass - return events, ss, session - - -# --- Tests originally in test_workflow_agent_failures.py --- - - -@pytest.mark.asyncio -async def test_retry_on_matching_exception(request: pytest.FixtureRequest): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=3, - tracker=tracker, - exception_to_raise=CustomRetryableError('Simulated failure'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=['CustomRetryableError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - agent = Workflow( - name='test_workflow_agent_retry', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_retry@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_workflow_agent_retry@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_workflow_agent_retry@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 3 - - -@pytest.mark.asyncio -async def test_no_retry_on_non_matching_exception( - request: pytest.FixtureRequest, -): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=CustomNonRetryableError('Unexpected failure'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=['CustomRetryableError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - agent = Workflow( - name='test_workflow_agent_no_retry', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - - with pytest.raises(CustomNonRetryableError, match='Unexpected failure'): - await runner.run_async(testing_utils.get_user_content('start')) - - events = runner.session.events - - assert simplify_events_with_node(events) == [ - ('user', 'start'), - ( - 'test_workflow_agent_no_retry@1/NodeA@1', - {'output': 'Executing A'}, - ), - ] - - -@pytest.mark.asyncio -async def test_retry_on_all_exceptions_if_not_specified( - request: pytest.FixtureRequest, -): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=ValueError('Any failure'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=None, - ), - ) - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - ], - ) - agent = Workflow( - name='test_workflow_agent_retry_all', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_retry_all@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_workflow_agent_retry_all@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ] - - -@pytest.mark.asyncio -async def test_attempt_count_populated_correctly( - request: pytest.FixtureRequest, -): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=3, - tracker=tracker, - exception_to_raise=CustomRetryableError('Simulated failure'), - retry_config=RetryConfig( - initial_delay=0.0, exceptions=['CustomRetryableError'] - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - agent = Workflow( - name='test_retry_count_populated_correctly', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - assert simplify_events_with_node(events) == [ - ( - 'test_retry_count_populated_correctly@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_retry_count_populated_correctly@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_retry_count_populated_correctly@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 3 - assert flaky_node_in_agent.tracker['attempt_counts'] == [1, 2, 3] - - -@pytest.mark.asyncio -async def test_retry_max_attempts_exceeded( - request: pytest.FixtureRequest, -): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=5, - tracker=tracker, - exception_to_raise=CustomRetryableError('Persisted failure'), - retry_config=RetryConfig( - initial_delay=0.0, - max_attempts=3, - exceptions=['CustomRetryableError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - agent = Workflow( - name='test_workflow_agent_max_attempts', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - - with pytest.raises(CustomRetryableError, match='Persisted failure'): - await runner.run_async(testing_utils.get_user_content('start')) - - events = runner.session.events - - assert simplify_events_with_node(events) == [ - ('user', 'start'), - ( - 'test_workflow_agent_max_attempts@1/NodeA@1', - {'output': 'Executing A'}, - ), - ] - - -@pytest.mark.asyncio -async def test_fails_without_retry_config( - request: pytest.FixtureRequest, -): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=ValueError('Any failure'), - retry_config=None, - ) - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - ], - ) - agent = Workflow( - name='test_workflow_agent_fails_without_retry_config', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(ValueError, match='Any failure'): - await runner.run_async(testing_utils.get_user_content('start')) - events = runner.session.events - - assert simplify_events_with_node(events) == [ - ('user', 'start'), - ( - 'test_workflow_agent_fails_without_retry_config@1/NodeA@1', - {'output': 'Executing A'}, - ), - ] - - -@pytest.mark.asyncio -async def test_retries_with_empty_retry_config( - request: pytest.FixtureRequest, -): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=ValueError('Another failure'), - retry_config=RetryConfig(), - ) - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - ], - ) - agent = Workflow( - name='test_workflow_agent_retries_with_empty_retry_config', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_retries_with_empty_retry_config@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_workflow_agent_retries_with_empty_retry_config@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ] - - -@pytest.mark.asyncio -async def test_retry_with_delay(request: pytest.FixtureRequest): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=CustomRetryableError('Sleep test failure'), - retry_config=RetryConfig( - initial_delay=5.0, - max_attempts=3, - jitter=0.0, - exceptions=['CustomRetryableError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - agent = Workflow( - name='test_workflow_agent_retry_delay', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - - with mock.patch.object( - asyncio, 'sleep', new_callable=mock.AsyncMock - ) as mock_sleep: - events = await runner.run_async(testing_utils.get_user_content('start')) - mock_sleep.assert_any_await(5.0) - - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_retry_delay@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_workflow_agent_retry_delay@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_workflow_agent_retry_delay@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - - -@pytest.mark.asyncio -async def test_retry_with_backoff_and_jitter(request: pytest.FixtureRequest): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=4, - tracker=tracker, - exception_to_raise=CustomRetryableError('Backoff test failure'), - retry_config=RetryConfig( - initial_delay=2.0, - max_attempts=5, - backoff_factor=3.0, - jitter=0.0, - exceptions=['CustomRetryableError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - agent = Workflow( - name='test_workflow_agent_retry_backoff', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - - with mock.patch('asyncio.sleep', new_callable=mock.AsyncMock) as mock_sleep: - events = await runner.run_async(testing_utils.get_user_content('start')) - mock_sleep.assert_has_awaits( - [mock.call(2.0), mock.call(6.0), mock.call(18.0)] - ) - - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_retry_backoff@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_workflow_agent_retry_backoff@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_workflow_agent_retry_backoff@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - - -@pytest.mark.asyncio -async def test_retry_with_jitter(request: pytest.FixtureRequest): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=CustomRetryableError('Jitter test failure'), - retry_config=RetryConfig( - initial_delay=4.0, - max_attempts=3, - backoff_factor=1.0, - jitter=0.5, - exceptions=['CustomRetryableError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - agent = Workflow( - name='test_workflow_agent_retry_jitter', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - - with ( - mock.patch('asyncio.sleep', new_callable=mock.AsyncMock) as mock_sleep, - mock.patch('random.uniform', return_value=-1.0) as mock_random, - ): - events = await runner.run_async(testing_utils.get_user_content('start')) - mock_sleep.assert_any_await(3.0) - mock_random.assert_called_once_with(-2.0, 2.0) - - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_retry_jitter@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_workflow_agent_retry_jitter@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_workflow_agent_retry_jitter@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - - -@pytest.mark.asyncio -async def test_retry_with_exception_classes(request: pytest.FixtureRequest): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=3, - tracker=tracker, - exception_to_raise=CustomRetryableError('Simulated failure'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=[CustomRetryableError], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - agent = Workflow( - name='test_retry_exception_classes', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - assert simplify_events_with_node(events) == [ - ( - 'test_retry_exception_classes@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_retry_exception_classes@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_retry_exception_classes@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - - -@pytest.mark.asyncio -async def test_retry_with_mixed_exception_types(request: pytest.FixtureRequest): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=2, - tracker=tracker, - exception_to_raise=CustomRetryableError('Simulated failure'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=[CustomRetryableError, 'ValueError'], - ), - ) - node_c = TestingNode(name='NodeC', output='Executing C') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - Edge(from_node=flaky_node, to_node=node_c), - ], - ) - agent = Workflow( - name='test_retry_mixed_exceptions', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - assert simplify_events_with_node(events) == [ - ( - 'test_retry_mixed_exceptions@1/NodeA@1', - {'output': 'Executing A'}, - ), - ( - 'test_retry_mixed_exceptions@1/FlakyNode@1', - {'output': 'Executing B'}, - ), - ( - 'test_retry_mixed_exceptions@1/NodeC@1', - {'output': 'Executing C'}, - ), - ] - - -@pytest.mark.asyncio -async def test_retry_exception_class_no_match(request: pytest.FixtureRequest): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=3, - tracker=tracker, - exception_to_raise=CustomNonRetryableError('Unexpected failure'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=[CustomRetryableError], - ), - ) - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - ], - ) - agent = Workflow( - name='test_retry_exception_class_no_match', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - - with pytest.raises(CustomNonRetryableError, match='Unexpected failure'): - await runner.run_async(testing_utils.get_user_content('start')) - - flaky_node_in_agent = next( - n for n in agent.graph.nodes if n.name == 'FlakyNode' - ) - assert flaky_node_in_agent.tracker['iteration_count'] == 1 - - -def test_retry_config_rejects_invalid_exception_types(): - with pytest.raises(ValueError, match='exception class names'): - RetryConfig(exceptions=[42]) - - -def test_retry_config_normalizes_classes_to_strings(): - config = RetryConfig(exceptions=[ValueError, 'KeyError']) - assert config.exceptions == ['ValueError', 'KeyError'] - - -@pytest.mark.asyncio -async def test_node_cancellation_on_sibling_failure( - request: pytest.FixtureRequest, -): - slow_node_started = False - slow_node_cancelled = False - - async def slow_node(): - nonlocal slow_node_started, slow_node_cancelled - slow_node_started = True - try: - await asyncio.sleep(10) - except asyncio.CancelledError: - slow_node_cancelled = True - raise - yield 'Slow' - - async def fail_node(): - await asyncio.sleep(0.1) - raise ValueError('Fail') - - agent = Workflow( - name='test_workflow_cancellation_sibling', - edges=[ - (START, slow_node), - (START, fail_node), - ], - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(ValueError, match='Fail'): - await runner.run_async(testing_utils.get_user_content('start')) - - assert slow_node_started is True - assert slow_node_cancelled is True - - -@pytest.mark.asyncio -async def test_parallel_worker_cancellation_on_sibling_failure( - request: pytest.FixtureRequest, -): - slow_node_started = False - slow_node_cancelled = False - - async def slow_node_impl(ctx: Context, node_input: Any): - nonlocal slow_node_started, slow_node_cancelled - slow_node_started = True - try: - await asyncio.sleep(10) - except asyncio.CancelledError: - slow_node_cancelled = True - raise - yield f'Slow {node_input}' - - async def fail_node(): - await asyncio.sleep(0.1) - raise ValueError('Fail') - - node_parallel = node( - slow_node_impl, name='node_parallel', parallel_worker=True - ) - - agent = Workflow( - name='test_workflow_parallel_cancellation_sibling', - edges=[ - (START, node_parallel), - (START, fail_node), - ], - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(ValueError, match='Fail'): - await runner.run_async(testing_utils.get_user_content('start')) - - assert slow_node_started is True - assert slow_node_cancelled is True - - -@pytest.mark.asyncio -async def test_parallel_worker_cancellation_on_worker_failure( - request: pytest.FixtureRequest, -): - slow_worker_started = False - slow_worker_cancelled = False - - async def worker_node_impl(ctx: Context, node_input: Any): - nonlocal slow_worker_started, slow_worker_cancelled - if node_input == 'fail': - await asyncio.sleep(0.1) - raise ValueError('Worker Fail') - else: - slow_worker_started = True - try: - await asyncio.sleep(10) - except asyncio.CancelledError: - slow_worker_cancelled = True - raise - yield f'Success {node_input}' - - from tests.unittests.workflow.workflow_testing_utils import TestingNode - - node_list = TestingNode(name='NodeList', output=['fail', 'slow']) - node_parallel = node( - worker_node_impl, name='node_parallel', parallel_worker=True - ) - - agent = Workflow( - name='test_workflow_parallel_cancellation_worker', - edges=[ - (START, node_list), - (node_list, node_parallel), - ], - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(ValueError, match='Worker Fail'): - await runner.run_async(testing_utils.get_user_content('start')) - - assert slow_worker_started is True - assert slow_worker_cancelled is True - - -@pytest.mark.asyncio -async def test_nested_workflow_cancellation_on_sibling_failure( - request: pytest.FixtureRequest, -): - inner_node_started = False - inner_node_cancelled = False - - async def inner_slow_node(): - nonlocal inner_node_started, inner_node_cancelled - inner_node_started = True - try: - await asyncio.sleep(10) - except asyncio.CancelledError: - inner_node_cancelled = True - raise - yield 'Inner Slow' - - inner_agent = Workflow( - name='inner_workflow', - edges=[ - (START, inner_slow_node), - ], - ) - - async def fail_node(): - await asyncio.sleep(0.1) - raise ValueError('Fail') - - outer_agent = Workflow( - name='outer_workflow', - edges=[ - (START, inner_agent), - (START, fail_node), - ], - ) - - app = App(name=request.function.__name__, root_agent=outer_agent) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(ValueError, match='Fail'): - await runner.run_async(testing_utils.get_user_content('start')) - - assert inner_node_started is True - assert inner_node_cancelled is True - - -@pytest.mark.asyncio -async def test_error_event_emitted_on_failure( - request: pytest.FixtureRequest, -): - tracker = {'iteration_count': 0} - node_a = TestingNode(name='NodeA', output='Executing A') - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Executing B', - succeed_on_iteration=999, - tracker=tracker, - exception_to_raise=ValueError('Something went wrong'), - retry_config=None, - ) - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=flaky_node), - ], - ) - agent = Workflow( - name='test_error_event', - graph=graph, - ) - - ctx = await create_parent_invocation_context( - request.function.__name__, agent, resumable=True - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(ValueError, match='Something went wrong'): - await runner.run_async(testing_utils.get_user_content('start')) - events = runner.session.events - - error_events = [ - e - for e in events - if isinstance(e, Event) - and e.error_code is not None - and e.node_name == 'FlakyNode' - ] - assert len(error_events) == 1 - assert error_events[0].error_code == 'ValueError' - assert error_events[0].error_message == 'Something went wrong' - - -@pytest.mark.asyncio -async def test_error_event_emitted_on_each_retry( - request: pytest.FixtureRequest, -): - tracker = {'iteration_count': 0} - - flaky_node = _FlakyNode( - name='FlakyNode', - message='Success', - succeed_on_iteration=3, - tracker=tracker, - exception_to_raise=CustomRetryableError('Transient error'), - retry_config=RetryConfig( - initial_delay=0.0, - exceptions=['CustomRetryableError'], - ), - ) - graph = Graph( - edges=[ - Edge(from_node=START, to_node=flaky_node), - ], - ) - agent = Workflow( - name='test_error_event_retry', - graph=graph, - ) - - ctx = await create_parent_invocation_context( - request.function.__name__, agent, resumable=True - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - error_events = [ - e - for e in events - if isinstance(e, Event) - and e.error_code is not None - and e.node_name == 'FlakyNode' - ] - assert len(error_events) == 2 - for err in error_events: - assert err.error_code == 'CustomRetryableError' - assert err.error_message == 'Transient error' - - assert simplify_events_with_node(events) == [ - ( - 'test_error_event_retry@1/FlakyNode@1', - {'output': 'Success'}, - ), - ] - - -# --- Moved from test_workflow_failure.py --- - - -@pytest.mark.asyncio -async def test_workflow_returns_normally_on_node_failure(): - """Workflow returns normally when a node fails, without duplicate error events.""" - - @node() - def failing_node(ctx: Context): - raise CustomError('Node failed') - yield 'output' - - wf = Workflow( - name='test_error_workflow', - edges=[ - (START, failing_node), - ], - ) - - events, ss, session = await _run_workflow(wf) - - error_events = [ - e - for e in events - if isinstance(e, Event) and e.error_code == 'CustomError' - ] - assert len(error_events) == 1 - assert error_events[0].error_message == 'Node failed' - - workflow_error_events = [ - e - for e in events - if isinstance(e, Event) - and e.error_code is not None - and e.node_info - and e.node_info.path == 'test_error_workflow@1' - ] - assert len(workflow_error_events) == 0 diff --git a/tests/unittests/workflow/test_workflow_function_tool_as_node.py b/tests/unittests/workflow/test_workflow_function_tool_as_node.py deleted file mode 100644 index 6a165a7ccf..0000000000 --- a/tests/unittests/workflow/test_workflow_function_tool_as_node.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for FunctionTool nodes in a Workflow.""" - -from google.adk.events.event import Event -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.tools.function_tool import FunctionTool -from google.adk.workflow import START -from google.adk.workflow._workflow import Workflow -from google.genai import types -import pytest - -from .workflow_testing_utils import simplify_events_with_node - - -def _produce_input() -> None: - """Absorbs user content so downstream ToolNodes receive None.""" - return None - - -def _func_a() -> dict[str, str]: - """Returns a value from function A.""" - return {'val': 'Hello'} - - -def _func_b(val: str) -> str: - """Returns a value incorporating input from A.""" - return f'{val}_world' - - -@pytest.mark.asyncio -async def test_run_async_with_function_tools(): - """FunctionTool output is piped as input to the next FunctionTool.""" - tool_a = FunctionTool(_func_a) - tool_b = FunctionTool(_func_b) - wf = Workflow( - name='wf_with_tools', - edges=[ - (START, _produce_input, tool_a, tool_b), - ], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='start')], role='user') - events: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - assert simplify_events_with_node(events) == [ - ( - 'wf_with_tools@1/_func_a@1', - {'output': {'val': 'Hello'}}, - ), - ( - 'wf_with_tools@1/_func_b@1', - {'output': 'Hello_world'}, - ), - ] diff --git a/tests/unittests/workflow/test_workflow_hitl.py b/tests/unittests/workflow/test_workflow_hitl.py deleted file mode 100644 index 8a2558b153..0000000000 --- a/tests/unittests/workflow/test_workflow_hitl.py +++ /dev/null @@ -1,2152 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Testings for the Workflow HITL scenarios.""" - -import asyncio -import copy -from typing import Any -from typing import AsyncGenerator -from unittest import mock - -from google.adk.agents.context import Context -from google.adk.agents.llm_agent import LlmAgent -from google.adk.apps.app import App -from google.adk.apps.app import ResumabilityConfig -from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService -from google.adk.events.event import Event -from google.adk.events.request_input import RequestInput -from google.adk.memory.in_memory_memory_service import InMemoryMemoryService -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.tools.long_running_tool import LongRunningFunctionTool -from google.adk.workflow import BaseNode -from google.adk.workflow import Edge -from google.adk.workflow import node -from google.adk.workflow import START -from google.adk.workflow._node_status import NodeStatus -from google.adk.workflow._workflow import Workflow -from google.adk.workflow.utils._rehydration_utils import _wrap_response -from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_response -from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids -from google.adk.workflow.utils._workflow_hitl_utils import REQUEST_CREDENTIAL_FUNCTION_CALL_NAME -from google.adk.workflow.utils._workflow_hitl_utils import REQUEST_INPUT_FUNCTION_CALL_NAME -from google.genai import types -from pydantic import BaseModel -from pydantic import ConfigDict -from pydantic import Field -import pytest -from typing_extensions import override - -from . import workflow_testing_utils -from .. import testing_utils -from .workflow_testing_utils import InputCapturingNode -from .workflow_testing_utils import RequestInputNode - -ANY = mock.ANY - - -class _TestingNode(BaseNode): - """A node that produces a simple message.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - - name: str = Field(default='') - message: str = Field(default='') - delay: float = Field(default=0) - - @override - def get_name(self) -> str: - return self.name - - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - if self.delay > 0: - await asyncio.sleep(self.delay) - yield Event(output=self.message) - - -def long_running_tool_func(): - """A test tool that simulates a long-running operation.""" - return None - - -@pytest.mark.parametrize( - 'resumable', - [ - pytest.param( - False, marks=pytest.mark.xfail(reason='Fails in non-resumable mode') - ), - pytest.param( - True, marks=pytest.mark.xfail(reason='Resumability broken in V2') - ), - ], -) -@pytest.mark.asyncio -async def test_workflow_pause_and_resume( - request: pytest.FixtureRequest, - resumable: bool, -): - """Tests that a workflow can pause and resume. - - This test uses LlmAgent with LongRunningFunctionTool. - """ - node_a = _TestingNode(name='NodeA', message='Executing A') - - node_b = LlmAgent( - name='NodeB_agent', - model=testing_utils.MockModel.create( - responses=[ - types.Part.from_function_call( - name='long_running_tool_func', - args={}, - ), - types.Part.from_text(text='LLM response after tool'), - ] - ), - tools=[LongRunningFunctionTool(func=long_running_tool_func)], - ) - node_c = _TestingNode(name='NodeC', message='Executing C') - agent = Workflow( - name='test_workflow_agent_hitl', - edges=[ - (START, node_a), - (node_a, node_b), - (node_b, node_c), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # First run: should pause on the long-running function call. - user_event = testing_utils.get_user_content('start workflow') - events1 = await runner.run_async(user_event) - - invocation_id = events1[0].invocation_id - fc_event = workflow_testing_utils.find_function_call_event( - events1, 'long_running_tool_func' - ) - function_call_id = fc_event.content.parts[0].function_call.id - - simplified_events1 = ( - workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events1), - ) - ) - - # Filter to outer workflow state checkpoint events only (LlmAgent as Mesh - # emits internal state events that are implementation details). - outer_state_events1 = [ - e - for e in simplified_events1 - if e[0] == 'test_workflow_agent_hitl' - and isinstance(e[1], dict) - and 'nodes' in e[1] - ] - - # Verify the outer workflow saw: NodeB_agent (interrupted). - if resumable: - assert outer_state_events1[-1] == ( - 'test_workflow_agent_hitl', - { - 'nodes': { - 'NodeA': {'status': NodeStatus.COMPLETED.value}, - 'NodeB_agent': { - 'status': NodeStatus.WAITING.value, - 'interrupts': [function_call_id], - }, - }, - }, - ) - - tool_response = testing_utils.UserContent( - types.Part( - function_response=types.FunctionResponse( - id=function_call_id, - name='long_running_tool_func', - response={'result': 'Final tool output'}, - ) - ) - ) - - # Resume with tool output. - # In resumable mode, reuse the invocation_id so agent state is loaded. - # In non-resumable mode, use a new invocation so state is reconstructed - # from session events. - events2 = await runner.run_async( - new_message=tool_response, - invocation_id=invocation_id, - ) - - simplified_events2 = ( - workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events2), - include_resume_inputs=True, - ) - ) - - # Filter to outer workflow state checkpoint events only. - outer_state_events2 = [ - e - for e in simplified_events2 - if e[0] == 'test_workflow_agent_hitl' - and isinstance(e[1], dict) - and 'nodes' in e[1] - ] - - # Verify NodeB_agent resumed, completed, and NodeC ran. - if resumable: - assert outer_state_events2[-1] == ( - 'test_workflow_agent_hitl', - { - 'nodes': { - 'NodeA': {'status': NodeStatus.COMPLETED.value}, - 'NodeB_agent': {'status': NodeStatus.COMPLETED.value}, - 'NodeC': {'status': NodeStatus.COMPLETED.value}, - } - }, - ) - # Verify end_of_agent was emitted. - end_events = [ - e - for e in simplified_events2 - if e[0] == 'test_workflow_agent_hitl' - and e[1] == testing_utils.END_OF_AGENT - ] - assert len(end_events) == 1 - - -@pytest.mark.xfail(reason='Resumability broken in V2') -@pytest.mark.asyncio -async def test_workflow_interrupt_allows_parallel_execution( - request: pytest.FixtureRequest, -): - """Tests that if one node is interrupted, parallel nodes can execute. - - This test uses LlmAgent with LongRunningFunctionTool, which requires - resumability to preserve the LLM's conversation state across interrupts. - """ - node_a = LlmAgent( - name='NodeA', - model=testing_utils.MockModel.create( - responses=[ - types.Part.from_function_call( - name='long_running_tool_func', - args={}, - ), - ] - ), - tools=[LongRunningFunctionTool(func=long_running_tool_func)], - ) - node_b = _TestingNode(name='NodeB', message='Executing B', delay=0.5) - agent = Workflow( - name='test_workflow_agent_parallel_interrupt', - edges=[ - (START, node_a), - (START, node_b), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - user_event = testing_utils.get_user_content('start workflow') - events = await runner.run_async(user_event) - fc_event = workflow_testing_utils.find_function_call_event( - events, 'long_running_tool_func' - ) - function_call_id = fc_event.content.parts[0].function_call.id - - simplified = workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events) - ) - # Filter to outer workflow state checkpoint events only (LlmAgent as Mesh - # emits internal state events that are implementation details). - outer_state = [ - e - for e in simplified - if e[0] == 'test_workflow_agent_parallel_interrupt' - and isinstance(e[1], dict) - and 'nodes' in e[1] - ] - - # Verify final state: NodeA interrupted, NodeB completed. - assert outer_state[-1] == ( - 'test_workflow_agent_parallel_interrupt', - { - 'nodes': { - 'NodeA': { - 'status': NodeStatus.WAITING.value, - 'interrupts': [function_call_id], - }, - 'NodeB': {'status': NodeStatus.COMPLETED.value}, - }, - }, - ) - - -@pytest.mark.parametrize( - 'resumable', - [ - False, - pytest.param( - True, marks=pytest.mark.xfail(reason='Resumability broken in V2') - ), - ], -) -@pytest.mark.asyncio -async def test_workflow_request_input_resume( - request: pytest.FixtureRequest, resumable: bool -): - """Tests resume with RequestInputEvent.""" - - class UserDetails(BaseModel): - name: str - age: int - - node_a = RequestInputNode( - name='NodeA_input', - message='Please provide user details.', - response_schema=UserDetails.model_json_schema(), - ) - node_b = _TestingNode(name='NodeB', message='Received user details') - agent = Workflow( - name='test_workflow_agent_input_schema', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_b), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run and expect RequestInputEvent - user_event = testing_utils.get_user_content('start workflow') - events1 = await runner.run_async(user_event) - - request_input_event = workflow_testing_utils.find_function_call_event( - events1, REQUEST_INPUT_FUNCTION_CALL_NAME - ) - assert request_input_event is not None - args = request_input_event.content.parts[0].function_call.args - assert args['message'] == 'Please provide user details.' - assert args['response_schema'] == { - 'properties': { - 'name': {'title': 'Name', 'type': 'string'}, - 'age': {'title': 'Age', 'type': 'integer'}, - }, - 'required': ['name', 'age'], - 'title': 'UserDetails', - 'type': 'object', - } - interrupt_id = get_request_input_interrupt_ids(request_input_event)[0] - invocation_id = request_input_event.invocation_id - - simplified_events1 = ( - workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events1) - ) - ) - expected_events1 = [ - ( - 'test_workflow_agent_input_schema', - { - 'nodes': { - 'NodeA_input': {'status': NodeStatus.RUNNING.value}, - } - }, - ), - ( - 'test_workflow_agent_input_schema@1/NodeA_input@1', - types.Part( - function_call=types.FunctionCall( - name=REQUEST_INPUT_FUNCTION_CALL_NAME, - args={ - 'interruptId': interrupt_id, - 'message': 'Please provide user details.', - 'payload': None, - 'response_schema': { - 'properties': { - 'name': {'title': 'Name', 'type': 'string'}, - 'age': {'title': 'Age', 'type': 'integer'}, - }, - 'required': ['name', 'age'], - 'title': 'UserDetails', - 'type': 'object', - }, - }, - ) - ), - ), - ( - 'test_workflow_agent_input_schema', - { - 'nodes': { - 'NodeA_input': { - 'status': NodeStatus.WAITING.value, - 'interrupts': [interrupt_id], - }, - }, - }, - ), - ] - if resumable: - assert simplified_events1 == expected_events1 - else: - assert simplified_events1 == ( - workflow_testing_utils.strip_checkpoint_events(expected_events1) - ) - - # Resume with user input - user_input = create_request_input_response( - interrupt_id, {'name': 'John', 'age': 30} - ) - events2 = await runner.run_async( - new_message=testing_utils.UserContent(user_input), - invocation_id=invocation_id, - ) - simplified_events2 = ( - workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events2) - ) - ) - expected_events2 = [ - ( - 'test_workflow_agent_input_schema@1/NodeA_input@1', - {'output': {'age': 30, 'name': 'John'}}, - ), - ( - 'test_workflow_agent_input_schema', - { - 'nodes': { - 'NodeA_input': {'status': NodeStatus.COMPLETED.value}, - 'NodeB': { - 'status': NodeStatus.RUNNING.value, - }, - } - }, - ), - ( - 'test_workflow_agent_input_schema@1/NodeB@1', - { - 'output': 'Received user details', - }, - ), - ( - 'test_workflow_agent_input_schema', - { - 'nodes': { - 'NodeA_input': {'status': NodeStatus.COMPLETED.value}, - 'NodeB': {'status': NodeStatus.COMPLETED.value}, - } - }, - ), - ('test_workflow_agent_input_schema', testing_utils.END_OF_AGENT), - ] - if resumable: - assert simplified_events2 == expected_events2 - else: - # In V2 non-resumable mode, NodeA_input is skipped and does not yield output again. - # So we filter out its output event. - expected_non_resumable = [ - e - for e in expected_events2 - if not (e[0].split('/')[-1].split('@')[0] == 'NodeA_input') - ] - expected_non_resumable = workflow_testing_utils.strip_checkpoint_events( - expected_non_resumable - ) - assert simplified_events2 == expected_non_resumable - - -@pytest.mark.asyncio -async def test_workflow_allows_mixing_output_and_request_input( - request: pytest.FixtureRequest, -): - """Tests that yielding both output and RequestInput is allowed in V2.""" - - class _YieldOutputAndRequestInputNode(BaseNode): - """A node that yields output and requests input.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - name: str = Field(default='') - - def __init__(self, *, name: str): - super().__init__() - object.__setattr__(self, 'name', name) - - @override - def get_name(self) -> str: - return self.name - - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - yield Event(output='output 1') - yield RequestInput(interrupt_id='req1') - - node_a = _YieldOutputAndRequestInputNode(name='NodeA') - node_b = InputCapturingNode(name='NodeB') - agent = Workflow( - name='test_agent', - edges=[ - (START, node_a), - (node_a, node_b), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - - events = await runner.run_async(testing_utils.get_user_content('start')) - simplified = workflow_testing_utils.simplify_events_with_node_and_agent_state( - events - ) - - # In V2, mixing output and interrupts is ALLOWED. - # The node yields the output event and then the RequestInput event. - assert len(simplified) == 2 - assert simplified[0] == ( - 'test_agent@1/NodeA@1', - {'output': 'output 1'}, - ) - assert simplified[1][0] == 'test_agent@1/NodeA@1' - assert simplified[1][1].function_call.name == 'adk_request_input' - assert simplified[1][1].function_call.args['interruptId'] == 'req1' - - -@pytest.mark.parametrize( - 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] -) -@pytest.mark.asyncio -async def test_workflow_rerun_on_resume( - request: pytest.FixtureRequest, resumable: bool -): - """Tests node requests input and reruns itself upon resume.""" - - class _RerunNode(BaseNode): - model_config = ConfigDict(arbitrary_types_allowed=True) - rerun_on_resume: bool = Field(default=True) - name: str = Field(default='') - - def __init__(self, *, name: str): - super().__init__() - object.__setattr__(self, 'name', name) - - @override - def get_name(self) -> str: - return self.name - - @override - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if 'count' not in ctx.session.state: - ctx.session.state['count'] = 0 - - approval = None - if ctx.session.state['count'] == 0: - if resume_input := ctx.resume_inputs.get('ask_approval'): - ctx.session.state['count'] = 1 - approval = resume_input['approved'] - else: - yield RequestInput( - message='Needs approval', interrupt_id='ask_approval' - ) - return - yield Event(output={'approval': approval}) - - node_a = _RerunNode(name='NodeA') - agent = Workflow( - name='test_agent', - edges=[Edge(from_node=START, to_node=node_a)], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: node requests input - events1 = await runner.run_async(testing_utils.get_user_content('start')) - simplified_events1 = ( - workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events1), - ) - ) - req_events = workflow_testing_utils.get_request_input_events(events1) - assert len(req_events) == 1 - interrupt_id1 = get_request_input_interrupt_ids(req_events[0])[0] - invocation_id = events1[0].invocation_id - - if resumable: - assert simplified_events1[-1] == ( - 'test_agent', - { - 'nodes': { - 'NodeA': { - 'status': NodeStatus.WAITING.value, - 'interrupts': [interrupt_id1], - }, - }, - }, - ) - - # Run 2: provide input, node reruns and completes - events2 = await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response(interrupt_id1, {'approved': True}) - ), - invocation_id=invocation_id, - ) - simplified_events2 = ( - workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events2), - include_resume_inputs=True, - ) - ) - - expected_events2 = [ - ( - 'test_agent', - { - 'nodes': { - 'NodeA': { - 'status': NodeStatus.RUNNING.value, - 'resume_inputs': {interrupt_id1: {'approved': True}}, - }, - } - }, - ), - ( - 'test_agent@1/NodeA@1', - { - 'output': {'approval': True}, - }, - ), - ( - 'test_agent', - { - 'nodes': { - 'NodeA': {'status': NodeStatus.COMPLETED.value}, - } - }, - ), - ('test_agent', testing_utils.END_OF_AGENT), - ] - if resumable: - assert simplified_events2 == expected_events2 - else: - assert simplified_events2 == ( - workflow_testing_utils.strip_checkpoint_events(expected_events2) - ) - - -@pytest.mark.parametrize( - 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] -) -@pytest.mark.asyncio -async def test_workflow_rerun_with_multiple_inputs( - request: pytest.FixtureRequest, - resumable: bool, -): - """Tests node with rerun_on_resume=True requests multiple inputs and resumed one by one.""" - - class _RerunNodeWithTwoInputs(BaseNode): - model_config = ConfigDict(arbitrary_types_allowed=True) - rerun_on_resume: bool = Field(default=True) - name: str = Field(default='') - - def __init__(self, *, name: str): - super().__init__() - object.__setattr__(self, 'name', name) - - @override - def get_name(self) -> str: - return self.name - - @override - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if resume_input := ctx.resume_inputs.get('req1'): - yield Event(state={'input1': resume_input['text']}) - if resume_input := ctx.resume_inputs.get('req2'): - yield Event(state={'input2': resume_input['text']}) - - if 'input1' not in ctx.state and 'req1' not in ctx.resume_inputs: - yield RequestInput(message='input 1', interrupt_id='req1') - return - - if 'input2' not in ctx.state and 'req2' not in ctx.resume_inputs: - yield RequestInput(message='input 2', interrupt_id='req2') - return - - input1 = ctx.resume_inputs['req1']['text'] - input2 = ctx.resume_inputs['req2']['text'] - yield Event( - output={ - 'input1': input1, - 'input2': input2, - }, - ) - - node_a = _RerunNodeWithTwoInputs(name='NodeA') - agent = Workflow( - name='test_agent', - edges=[Edge(from_node=START, to_node=node_a)], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: node requests 1st input - events1 = await runner.run_async(testing_utils.get_user_content('start')) - simplified_events1 = ( - workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events1), - ) - ) - req_events1 = workflow_testing_utils.get_request_input_events(events1) - assert len(req_events1) == 1 - interrupt_id1 = get_request_input_interrupt_ids(req_events1[0])[0] - assert interrupt_id1 == 'req1' - invocation_id = events1[0].invocation_id - if resumable: - assert simplified_events1[-1] == ( - 'test_agent', - { - 'nodes': { - 'NodeA': { - 'status': NodeStatus.WAITING.value, - 'interrupts': [interrupt_id1], - }, - }, - }, - ) - - # Run 2: provide 1st input, node reruns and requests 2nd input - events2 = await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response(interrupt_id1, {'text': 'response 1'}) - ), - invocation_id=invocation_id, - ) - assert all( - e.invocation_id == invocation_id for e in events2 if e.invocation_id - ) - simplified_events2 = ( - workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events2), - include_resume_inputs=True, - ) - ) - req_events2 = workflow_testing_utils.get_request_input_events(events2) - assert len(req_events2) == 1 - interrupt_id2 = get_request_input_interrupt_ids(req_events2[0])[0] - assert interrupt_id2 == 'req2' - - expected_events2 = [ - ( - 'test_agent', - { - 'nodes': { - 'NodeA': { - 'status': NodeStatus.RUNNING.value, - 'resume_inputs': {interrupt_id1: {'text': 'response 1'}}, - }, - } - }, - ), - ( - 'test_agent@1/NodeA@1', - types.Part( - function_call=types.FunctionCall( - name=REQUEST_INPUT_FUNCTION_CALL_NAME, - args={ - 'interruptId': 'req2', - 'message': 'input 2', - 'payload': None, - 'response_schema': None, - }, - ) - ), - ), - ( - 'test_agent', - { - 'nodes': { - 'NodeA': { - 'status': NodeStatus.WAITING.value, - 'interrupts': [interrupt_id2], - 'resume_inputs': {interrupt_id1: {'text': 'response 1'}}, - }, - }, - }, - ), - ] - if resumable: - assert simplified_events2 == expected_events2 - else: - assert simplified_events2 == ( - workflow_testing_utils.strip_checkpoint_events(expected_events2) - ) - - # Run 3: provide 2nd input, node reruns and completes - events3 = await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response(interrupt_id2, {'text': 'response 2'}) - ), - invocation_id=invocation_id, - ) - assert all( - e.invocation_id == invocation_id for e in events3 if e.invocation_id - ) - simplified_events3 = ( - workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events3), - include_resume_inputs=True, - ) - ) - - expected_events3 = [ - ( - 'test_agent', - { - 'nodes': { - 'NodeA': { - 'status': NodeStatus.RUNNING.value, - 'resume_inputs': { - interrupt_id1: {'text': 'response 1'}, - interrupt_id2: {'text': 'response 2'}, - }, - }, - } - }, - ), - ( - 'test_agent@1/NodeA@1', - { - 'output': {'input1': 'response 1', 'input2': 'response 2'}, - }, - ), - ( - 'test_agent', - { - 'nodes': { - 'NodeA': {'status': NodeStatus.COMPLETED.value}, - } - }, - ), - ('test_agent', testing_utils.END_OF_AGENT), - ] - if resumable: - assert simplified_events3 == expected_events3 - else: - assert simplified_events3 == ( - workflow_testing_utils.strip_checkpoint_events(expected_events3) - ) - - -class _MultiHitlRerunNode(BaseNode): - model_config = ConfigDict(arbitrary_types_allowed=True) - - rerun_on_resume: bool = Field(default=True) - name: str = Field(default='') - - def __init__(self, *, name: str): - super().__init__() - object.__setattr__(self, 'name', name) - - @override - def get_name(self) -> str: - return self.name - - @override - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if not ctx.resume_inputs.get('req1'): - yield RequestInput(interrupt_id='req1', message='request 1') - return - if not ctx.resume_inputs.get('req2'): - yield RequestInput(interrupt_id='req2', message='request 2') - return - yield Event(output='final_output') - - -@pytest.mark.parametrize( - 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] -) -@pytest.mark.asyncio -async def test_rerun_with_multiple_hitl_and_outputs( - request: pytest.FixtureRequest, - resumable: bool, -): - """Tests that a re-runnable node with multiple HITL accumulates outputs.""" - node_a = _MultiHitlRerunNode(name='NodeA') - node_b = InputCapturingNode(name='NodeB') - agent = Workflow( - name='test_agent_multi_hitl', - edges=[ - (START, node_a), - (node_a, node_b), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - session_service = InMemorySessionService() - artifact_service = InMemoryArtifactService() - memory_service = InMemoryMemoryService() - runner1 = Runner( - app=app, - session_service=session_service, - artifact_service=artifact_service, - memory_service=memory_service, - ) - runner2 = Runner( - app=app, - session_service=session_service, - artifact_service=artifact_service, - memory_service=memory_service, - ) - runner3 = Runner( - app=app, - session_service=session_service, - artifact_service=artifact_service, - memory_service=memory_service, - ) - session = await session_service.create_session( - app_name=app.name, user_id='test_user' - ) - - async def collect_events(agen): - events = [] - async for e in agen: - events.append(e) - return events - - # Run 1: node requests input1 - events1 = await collect_events( - runner1.run_async( - user_id=session.user_id, - session_id=session.id, - new_message=testing_utils.get_user_content('start'), - ) - ) - req_events1 = workflow_testing_utils.get_request_input_events(events1) - assert len(req_events1) == 1 - assert get_request_input_interrupt_ids(req_events1[0])[0] == 'req1' - invocation_id = events1[0].invocation_id - - # Run 2: provide input1, node requests input2. - events2 = await collect_events( - runner2.run_async( - user_id=session.user_id, - session_id=session.id, - new_message=testing_utils.UserContent( - create_request_input_response('req1', {'text': 'response 1'}) - ), - invocation_id=invocation_id if resumable else None, - ) - ) - req_events2 = workflow_testing_utils.get_request_input_events(events2) - assert len(req_events2) == 1 - assert get_request_input_interrupt_ids(req_events2[0])[0] == 'req2' - - # Run 3: provide input2, node yields final output and completes. - await collect_events( - runner3.run_async( - user_id=session.user_id, - session_id=session.id, - new_message=testing_utils.UserContent( - create_request_input_response('req2', {'text': 'response 2'}) - ), - invocation_id=invocation_id if resumable else None, - ) - ) - - assert node_b.received_inputs == ['final_output'] - - -@pytest.mark.parametrize( - 'resumable', - [ - False, - pytest.param( - True, marks=pytest.mark.xfail(reason='Resumability broken in V2') - ), - ], -) -@pytest.mark.asyncio -async def test_rerun_on_resume_waits_for_all_interrupts( - request: pytest.FixtureRequest, - resumable: bool, -): - """Tests that a rerun_on_resume node is not rerun until all pending interrupts are resolved.""" - - class _SimultaneousInputsNode(BaseNode): - """A node that requests multiple inputs simultaneously.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - rerun_on_resume: bool = Field(default=True) - name: str = Field(default='') - - def __init__(self, *, name: str): - super().__init__() - object.__setattr__(self, 'name', name) - - @override - def get_name(self) -> str: - return self.name - - @override - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if resume_input := ctx.resume_inputs.get('req1'): - yield Event(state={'input1': resume_input['text']}) - if resume_input := ctx.resume_inputs.get('req2'): - yield Event(state={'input2': resume_input['text']}) - - have_req1 = 'input1' in ctx.state or 'req1' in ctx.resume_inputs - have_req2 = 'input2' in ctx.state or 'req2' in ctx.resume_inputs - - if not have_req1 or not have_req2: - if not have_req1: - yield RequestInput(interrupt_id='req1', message='input 1') - if not have_req2: - yield RequestInput(interrupt_id='req2', message='input 2') - return - - val1 = ctx.state.get('input1') or ctx.resume_inputs['req1']['text'] - val2 = ctx.state.get('input2') or ctx.resume_inputs['req2']['text'] - - yield Event( - output={ - 'input1': val1, - 'input2': val2, - }, - ) - - node_a = _SimultaneousInputsNode(name='NodeA') - agent = Workflow( - name='test_agent', - edges=[Edge(from_node=START, to_node=node_a)], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: node requests both inputs simultaneously. - events1 = await runner.run_async(testing_utils.get_user_content('start')) - simplified1 = ( - workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events1), - include_resume_inputs=True, - ) - ) - req_events1 = workflow_testing_utils.get_request_input_events(events1) - assert len(req_events1) == 2 - interrupt_ids = [] - for e in req_events1: - interrupt_ids.extend(get_request_input_interrupt_ids(e)) - assert set(interrupt_ids) == {'req1', 'req2'} - invocation_id = events1[0].invocation_id - - # Final checkpoint should show WAITING with both interrupt_ids. - if resumable: - final_state1 = simplified1[-1][1] - assert final_state1['nodes']['NodeA']['status'] == ( - NodeStatus.WAITING.value - ) - assert set(final_state1['nodes']['NodeA']['interrupts']) == { - 'req1', - 'req2', - } - - # Run 2: provide only req1 — node should stay WAITING, NOT rerun. - events2 = await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response('req1', {'text': 'response 1'}) - ), - invocation_id=invocation_id, - ) - simplified2 = ( - workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events2), - include_resume_inputs=True, - ) - ) - - # Node should remain WAITING with req2 still pending. - # resume_inputs should accumulate req1's response. - if resumable: - final_state2 = simplified2[-1][1] - assert final_state2['nodes']['NodeA']['status'] == ( - NodeStatus.WAITING.value - ) - assert final_state2['nodes']['NodeA']['interrupts'] == ['req2'] - assert final_state2['nodes']['NodeA']['resume_inputs'] == { - 'req1': {'text': 'response 1'}, - } - - # The node should NOT have produced any RequestInput or data output in resumable mode. - # In non-resumable mode, it re-yields the pending interrupt 'req2'. - req_events2 = workflow_testing_utils.get_request_input_events(events2) - if resumable: - assert len(req_events2) == 0 - else: - assert len(req_events2) == 1 - assert get_request_input_interrupt_ids(req_events2[0]) == ['req2'] - - # Run 3: provide req2 — now all interrupts resolved, node should rerun. - events3 = await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response('req2', {'text': 'response 2'}) - ), - invocation_id=invocation_id, - ) - simplified3 = ( - workflow_testing_utils.simplify_events_with_node_and_agent_state( - copy.deepcopy(events3), - include_resume_inputs=True, - ) - ) - - # Node should have rerun and completed with both responses. - # Last event is END_OF_AGENT, second-to-last is the final agent state. - if resumable: - final_state3 = simplified3[-2][1] - assert final_state3['nodes']['NodeA']['status'] == ( - NodeStatus.COMPLETED.value - ) - - # Check the node produced the expected output (exclude workflow output). - data_events = [ - e - for e in events3 - if hasattr(e, 'node_info') - and e.output is not None - and isinstance(e.output, dict) - and e.node_info.path.startswith(agent.name) - ] - assert len(data_events) == 1 - assert data_events[0].output == { - 'input1': 'response 1', - 'input2': 'response 2', - } - - -# --------------------------------------------------------------------------- -# unwrap_response tests -# --------------------------------------------------------------------------- - - -@pytest.mark.parametrize( - 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] -) -@pytest.mark.asyncio -async def test_wrapped_response_unwrapped_for_node( - request: pytest.FixtureRequest, resumable: bool -): - """Wrapped {"result": value} is unwrapped so the node receives the value.""" - from google.adk.workflow import FunctionNode - - def my_node(): - return RequestInput(interrupt_id='ask1', message='Give me data') - - node_a = FunctionNode(func=my_node) - node_b = InputCapturingNode(name='NodeB') - app = App( - name=request.function.__name__, - root_agent=Workflow( - name='test_agent', - edges=[(START, node_a), (node_a, node_b)], - ), - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - events1 = await runner.run_async(testing_utils.get_user_content('go')) - req_events = workflow_testing_utils.get_request_input_events(events1) - assert len(req_events) == 1 - interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] - invocation_id = events1[0].invocation_id - - # Resume with a wrapped response (simulates adk web after rewrapping). - await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response( - interrupt_id, - _wrap_response('hello world'), - ) - ), - invocation_id=invocation_id, - ) - - # NodeB should receive the plain string, not {"result": "hello world"}. - assert node_b.received_inputs == ['hello world'] - - -@pytest.mark.parametrize( - 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] -) -@pytest.mark.asyncio -async def test_dict_response_not_unwrapped( - request: pytest.FixtureRequest, resumable: bool -): - """A dict response without single "result" key passes through unchanged.""" - from google.adk.workflow import FunctionNode - - def my_node(): - return RequestInput(interrupt_id='ask1', message='Give me data') - - node_a = FunctionNode(func=my_node) - node_b = InputCapturingNode(name='NodeB') - app = App( - name=request.function.__name__, - root_agent=Workflow( - name='test_agent', - edges=[(START, node_a), (node_a, node_b)], - ), - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - events1 = await runner.run_async(testing_utils.get_user_content('go')) - req_events = workflow_testing_utils.get_request_input_events(events1) - assert len(req_events) == 1 - interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] - invocation_id = events1[0].invocation_id - - # Resume with a raw dict (programmatic API or adk web with JSON dict input). - raw_dict = {'name': 'John', 'age': 30} - await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response(interrupt_id, raw_dict) - ), - invocation_id=invocation_id, - ) - - # NodeB should receive the dict as-is. - assert node_b.received_inputs == [{'name': 'John', 'age': 30}] - - -@pytest.mark.parametrize('resumable', [False, True]) -@pytest.mark.asyncio -async def test_request_input_rerun_with_same_interrupt_id( - request: pytest.FixtureRequest, resumable: bool -): - """Reusing the same interrupt_id across loop iterations works. - - Regression test: state reconstruction matched FCs and FRs by set - membership, so a previous FR with the same ID made the current - interrupt appear "already resolved", causing the workflow to - restart from scratch instead of resuming. - """ - - @node(rerun_on_resume=True) - def review(ctx: Context): - resume = ctx.resume_inputs.get('review') - if not resume: - yield RequestInput( - interrupt_id='review', - message='Approve or revise?', - ) - return - if resume == 'approve': - yield Event(output='approved', route='approved') - else: - yield Event(route='revise') - - def process(): - return 'draft' - - capture = InputCapturingNode(name='capture') - agent = Workflow( - name='test_rerun_same_id', - edges=[ - (START, process, review), - (review, {'revise': process, 'approved': capture}), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Turn 1: start → process → review → interrupt - events1 = await runner.run_async(testing_utils.get_user_content('go')) - req1 = workflow_testing_utils.get_request_input_events(events1) - assert len(req1) == 1 - assert 'review@1' in req1[0].node_info.path - inv_id = events1[0].invocation_id - - # Turn 2: revise → process reruns → review reruns → interrupt again - events2 = await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response('review', {'result': 'revise'}) - ), - invocation_id=inv_id, - ) - req2 = workflow_testing_utils.get_request_input_events(events2) - assert len(req2) == 1, 'Expected second interrupt after revise' - assert 'review@2' in req2[0].node_info.path - inv_id = events2[0].invocation_id - - # Turn 3: approve → should complete, not loop - events3 = await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response('review', {'result': 'approve'}) - ), - invocation_id=inv_id, - ) - req3 = workflow_testing_utils.get_request_input_events(events3) - assert len(req3) == 0, 'Should not interrupt again after approve' - assert capture.received_inputs == ['approved'] - - -# --------------------------------------------------------------------------- -# auth_config tests -# --------------------------------------------------------------------------- - - -@pytest.mark.parametrize( - 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] -) -@pytest.mark.asyncio -async def test_function_node_auth_config( - request: pytest.FixtureRequest, resumable: bool -): - """FunctionNode with auth_config pauses for auth, then runs after creds.""" - from fastapi.openapi.models import APIKey - from fastapi.openapi.models import APIKeyIn - from google.adk.auth.auth_credential import AuthCredential - from google.adk.auth.auth_credential import AuthCredentialTypes - from google.adk.auth.auth_tool import AuthConfig - from google.adk.workflow import FunctionNode - - auth_config = AuthConfig( - auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), - raw_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.API_KEY, - api_key='placeholder', - ), - credential_key='test_api_key', - ) - - call_count = 0 - received_cred = None - - def do_work(ctx: Context): - nonlocal call_count, received_cred - call_count += 1 - received_cred = ctx.get_auth_response(auth_config) - return {'result': 'authed'} - - node_a = FunctionNode( - func=do_work, auth_config=auth_config, rerun_on_resume=True - ) - node_b = InputCapturingNode(name='NodeB') - app = App( - name=request.function.__name__, - root_agent=Workflow( - name='test_agent', - edges=[(START, node_a), (node_a, node_b)], - ), - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: should pause for auth. - events1 = await runner.run_async(testing_utils.get_user_content('go')) - - auth_fc_events = workflow_testing_utils.get_auth_request_events(events1) - assert len(auth_fc_events) == 1 - fc = auth_fc_events[0].content.parts[0].function_call - auth_fc_id = fc.id - invocation_id = events1[0].invocation_id - assert call_count == 0 - - # Run 2: provide auth credential — node should execute. - auth_response = AuthConfig( - auth_scheme=auth_config.auth_scheme, - raw_auth_credential=auth_config.raw_auth_credential, - exchanged_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.API_KEY, - api_key='real_api_key_123', - ), - credential_key='test_api_key', - ) - - resume_part = types.Part( - function_response=types.FunctionResponse( - id=auth_fc_id, - name=REQUEST_CREDENTIAL_FUNCTION_CALL_NAME, - response=auth_response.model_dump(exclude_none=True, by_alias=True), - ) - ) - await runner.run_async( - new_message=testing_utils.UserContent(resume_part), - invocation_id=invocation_id, - ) - - assert call_count == 1 - assert received_cred is not None - assert received_cred.api_key == 'real_api_key_123' - assert node_b.received_inputs == [{'result': 'authed'}] - - -@pytest.mark.parametrize( - 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] -) -@pytest.mark.asyncio -async def test_second_auth_node_skips_auth_when_credential_exists( - request: pytest.FixtureRequest, resumable: bool -): - """Second FunctionNode with same credential_key skips auth if cred already stored.""" - from fastapi.openapi.models import APIKey - from fastapi.openapi.models import APIKeyIn - from google.adk.auth.auth_credential import AuthCredential - from google.adk.auth.auth_credential import AuthCredentialTypes - from google.adk.auth.auth_tool import AuthConfig - - auth_config = AuthConfig( - auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), - raw_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.API_KEY, - api_key='placeholder', - ), - credential_key='shared_key', - ) - - call_log = [] - - @node(auth_config=auth_config, rerun_on_resume=True) - def first_task(): - call_log.append('first') - return {'status': 'done'} - - @node(auth_config=auth_config, rerun_on_resume=True) - def second_task(): - call_log.append('second') - return {'status': 'done'} - - node_a = first_task - node_b = second_task - sink = InputCapturingNode(name='sink') - - app = App( - name=request.function.__name__, - root_agent=Workflow( - name='test_agent', - edges=[(START, node_a), (node_a, node_b), (node_b, sink)], - ), - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: node_a pauses for auth. - events1 = await runner.run_async(testing_utils.get_user_content('go')) - auth_fc_events = workflow_testing_utils.get_auth_request_events(events1) - assert len(auth_fc_events) == 1 - fc = auth_fc_events[0].content.parts[0].function_call - auth_fc_id = fc.id - invocation_id = events1[0].invocation_id - assert not call_log - - # Run 2: provide credential — node_a runs, node_b should skip auth and run too. - auth_response = AuthConfig( - auth_scheme=auth_config.auth_scheme, - raw_auth_credential=auth_config.raw_auth_credential, - exchanged_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.API_KEY, - api_key='the_real_key', - ), - credential_key='shared_key', - ) - resume_part = types.Part( - function_response=types.FunctionResponse( - id=auth_fc_id, - name=REQUEST_CREDENTIAL_FUNCTION_CALL_NAME, - response=auth_response.model_dump(exclude_none=True, by_alias=True), - ) - ) - await runner.run_async( - new_message=testing_utils.UserContent(resume_part), - invocation_id=invocation_id, - ) - - # Both nodes ran — node_b did NOT pause for a second auth request. - assert call_log == ['first', 'second'] - assert sink.received_inputs == [{'status': 'done'}] - - -# --- Tests for input/triggered_by restoration on resume --- - - -class _InputCapturingRerunNode(BaseNode): - """A rerun_on_resume node that captures node_input and triggered_by.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - - rerun_on_resume: bool = Field(default=True) - captured_inputs: list[Any] = Field(default_factory=list) - - @override - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - self.captured_inputs.append(node_input) - - if resume_input := ctx.resume_inputs.get('approval'): - yield Event(output={'approved': resume_input}) - else: - yield RequestInput(message='Need approval', interrupt_id='approval') - - -@pytest.mark.parametrize( - 'resumable', - [ - pytest.param( - False, - marks=pytest.mark.xfail(reason='Fails in non-resumable mode'), - ), - True, - ], -) -@pytest.mark.asyncio -async def test_resume_preserves_node_input( - request: pytest.FixtureRequest, resumable: bool -): - """After resume, a rerun node receives the predecessor's output as input.""" - node_a = _TestingNode(name='NodeA', message='output_from_a') - node_b = _InputCapturingRerunNode(name='NodeB') - node_c = InputCapturingNode(name='NodeC') - - agent = Workflow( - name='test_agent', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_b), - Edge(from_node=node_b, to_node=node_c), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: NodeA completes, NodeB interrupts. - events1 = await runner.run_async(testing_utils.get_user_content('go')) - invocation_id = events1[0].invocation_id - req_events = workflow_testing_utils.get_request_input_events(events1) - assert len(req_events) == 1 - interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] - - # First run should have received NodeA's output. - assert len(node_b.captured_inputs) == 1 - assert node_b.captured_inputs[0] == 'output_from_a' - - # Run 2: resume with approval. - events2 = await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response(interrupt_id, {'yes': True}) - ), - invocation_id=invocation_id, - ) - - # Second run (rerun on resume) should also receive NodeA's output. - assert len(node_b.captured_inputs) == 2 - assert node_b.captured_inputs[1] == 'output_from_a' - - # NodeC should have received NodeB's output. - assert len(node_c.received_inputs) == 1 - assert node_c.received_inputs[0] == {'approved': {'yes': True}} - - -@pytest.mark.parametrize( - 'resumable', - [ - pytest.param( - False, - marks=pytest.mark.xfail(reason='Fails in non-resumable mode'), - ), - True, - ], -) -@pytest.mark.asyncio -async def test_resume_preserves_input_from_start( - request: pytest.FixtureRequest, resumable: bool -): - """After resume, a node directly after START receives workflow input.""" - node_a = _InputCapturingRerunNode(name='NodeA') - - agent = Workflow( - name='test_agent', - edges=[Edge(from_node=START, to_node=node_a)], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: NodeA interrupts. - events1 = await runner.run_async(testing_utils.get_user_content('hello')) - invocation_id = events1[0].invocation_id - req_events = workflow_testing_utils.get_request_input_events(events1) - assert len(req_events) == 1 - interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] - - # First run: triggered_by should be START. - assert len(node_a.captured_inputs) == 1 - - # Run 2: resume. - await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response(interrupt_id, {'ok': True}) - ), - invocation_id=invocation_id, - ) - - # Second run: triggered_by should still be START. - assert len(node_a.captured_inputs) == 2 - - -@pytest.mark.parametrize( - 'resumable', - [ - pytest.param( - False, - marks=pytest.mark.xfail(reason='Fails in non-resumable mode'), - ), - True, - ], -) -@pytest.mark.asyncio -async def test_resume_fan_in_both_predecessors_completed( - request: pytest.FixtureRequest, resumable: bool -): - """Fan-in: node C has two predecessors (A, B) that both completed. - - After resume, _find_predecessor_input should pick one of the available - predecessor outputs for C. - """ - node_a = _TestingNode(name='NodeA', message='output_from_a') - node_b = _TestingNode(name='NodeB', message='output_from_b') - node_c = _InputCapturingRerunNode(name='NodeC') - - agent = Workflow( - name='test_agent', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=START, to_node=node_b), - Edge(from_node=node_a, to_node=node_c), - Edge(from_node=node_b, to_node=node_c), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: A and B complete, C interrupts. - events1 = await runner.run_async(testing_utils.get_user_content('go')) - invocation_id = events1[0].invocation_id - - # C should have been triggered twice (once per predecessor). - req_events = workflow_testing_utils.get_request_input_events(events1) - assert len(req_events) >= 1 - interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] - - # First run: C's input should come from one of its predecessors. - assert len(node_c.captured_inputs) >= 1 - assert node_c.captured_inputs[0] in ('output_from_a', 'output_from_b') - - # Run 2: resume with approval. - events2 = await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response(interrupt_id, {'yes': True}) - ), - invocation_id=invocation_id, - ) - - # After resume, C should again receive a valid predecessor output. - assert len(node_c.captured_inputs) >= 2 - assert node_c.captured_inputs[-1] in ('output_from_a', 'output_from_b') - - -@pytest.mark.parametrize( - 'resumable', - [ - pytest.param( - False, - marks=pytest.mark.xfail(reason='Fails in non-resumable mode'), - ), - True, - ], -) -@pytest.mark.asyncio -async def test_resume_loop_receives_latest_input( - request: pytest.FixtureRequest, resumable: bool -): - """Loop: START -> A -> B --(loop)--> A. - - On the first iteration A receives START input and interrupts. - After resume, A completes and triggers B. B routes back to A. - On the loop-back iteration, A should receive B's output (not START - input) and run_id should increment. - - Captures: - [0] = first run (START input, interrupts) - [1] = rerun on resume (START input, completes with approval) - [2] = loop-back from B (B's output, interrupts again) - """ - from google.adk.workflow._graph import Edge as GraphEdge - - class _RoutingNode(BaseNode): - """A node that produces output with a route.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - - route: str = Field(default='') - message: str = Field(default='') - - @override - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(output=self.message, route=self.route) - - node_a = _InputCapturingRerunNode(name='NodeA') - node_b = _RoutingNode(name='NodeB', message='output_from_b', route='loop') - - agent = Workflow( - name='test_agent', - edges=[ - Edge(from_node=START, to_node=node_a), - Edge(from_node=node_a, to_node=node_b), - GraphEdge(from_node=node_b, to_node=node_a, route='loop'), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: A interrupts on first iteration. - events1 = await runner.run_async(testing_utils.get_user_content('hello')) - invocation_id = events1[0].invocation_id - req_events = workflow_testing_utils.get_request_input_events(events1) - assert len(req_events) == 1 - interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] - - # First iteration: triggered by START. - assert len(node_a.captured_inputs) == 1 - - # Run 2: resume A -> A completes -> B fires -> B routes 'loop' -> A runs again. - events2 = await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response(interrupt_id, {'ok': True}) - ), - invocation_id=invocation_id, - ) - - # Three captures: first run, rerun on resume, loop-back from B. - assert len(node_a.captured_inputs) == 3 - - # Capture[1] = rerun on resume, still triggered by START. - - # Capture[2] = loop-back from B with B's output. - assert node_a.captured_inputs[2] == 'output_from_b' - - # run_id should have incremented (visible in event paths). - node_a_paths = [ - e.node_info.path - for e in events1 + events2 - if e.node_info and e.node_info.path and 'NodeA@' in e.node_info.path - ] - run_ids = sorted({p.split('NodeA@')[1].split('/')[0] for p in node_a_paths}) - assert len(run_ids) >= 2, f'Expected multiple run_ids, got {run_ids}' - - -@pytest.mark.asyncio -async def test_multiple_invocations_isolation(request: pytest.FixtureRequest): - """Verify that a new invocation ignores events from a previous invocation.""" - - class CounterNode(BaseNode): - name: str = Field(default='counter_node') - run_count: int = Field(default=0) - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - self.run_count += 1 - yield f'Run {self.run_count}' - - node_a = CounterNode() - wf = Workflow(name='wf', edges=[(START, node_a)]) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Invocation 1 - msg1 = types.Content(parts=[types.Part(text='go 1')], role='user') - events1 = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - assert node_a.run_count == 1 - - # Invocation 2 (New invocation in SAME session) - msg2 = types.Content(parts=[types.Part(text='go 2')], role='user') - events2 = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events2.append(event) - - # If isolation works, CounterNode should run AGAIN! - assert node_a.run_count == 2 - - -@pytest.mark.asyncio -async def test_multiple_pending_interrupts_isolation( - request: pytest.FixtureRequest, -): - """Verify that responding to one interrupt resumes its specific invocation and ignores others.""" - - class InterruptNode(BaseNode): - name: str = Field(default='interrupt_node') - rerun_on_resume: bool = Field(default=True) - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - text = node_input.parts[0].text if node_input else '' - if ctx.resume_inputs and 'req1' in ctx.resume_inputs: - yield Event(output=f"Resumed 1: {ctx.resume_inputs['req1']['ans']}") - return - if ctx.resume_inputs and 'req2' in ctx.resume_inputs: - yield Event(output=f"Resumed 2: {ctx.resume_inputs['req2']['ans']}") - return - - fc_id = 'req1' if '1' in text else 'req2' - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name=REQUEST_INPUT_FUNCTION_CALL_NAME, - args={ - 'interruptId': fc_id, - 'message': f'input {fc_id}', - }, - id=fc_id, - ) - ) - ] - ), - long_running_tool_ids={fc_id}, - ) - return - - node = InterruptNode() - wf = Workflow(name='wf', edges=[(START, node)]) - - runner = testing_utils.InMemoryRunner(node=wf) - - # Invocation 1: yields req1 - events1 = await runner.run_async('go 1') - - # Find the function call ID generated for req1 - fc_event = workflow_testing_utils.find_function_call_event( - events1, REQUEST_INPUT_FUNCTION_CALL_NAME - ) - function_call_id = fc_event.content.parts[0].function_call.id - - # Invocation 2: yields req2 (New run, same session) - events2 = await runner.run_async('go 2') - - # Invocation 3: respond to req1 - msg3 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name=REQUEST_INPUT_FUNCTION_CALL_NAME, - id=function_call_id, - response={'ans': 'val1'}, - ) - ) - ], - role='user', - ) - events3 = await runner.run_async(msg3) - - # Verify that Invocation 1 resumed and produced output - outputs3 = [e.output for e in events3 if e.output is not None] - assert 'Resumed 1: val1' in outputs3 - - -@pytest.mark.parametrize('resumable', [False, True]) -@pytest.mark.asyncio -async def test_parallel_nodes_trigger_same_hitl_node( - request: pytest.FixtureRequest, resumable: bool -): - """Tests that two nodes running in parallel can trigger the same node with HITL.""" - - @node(rerun_on_resume=True) - def node_c(ctx: Context, node_input: Any): - interrupt_id = f'req_c_{node_input}' - if interrupt_id not in ctx.resume_inputs: - yield RequestInput(interrupt_id=interrupt_id, message='input for c') - return - yield Event( - output=f"c_{node_input}_{ctx.resume_inputs[interrupt_id]['text']}" - ) - - def node_a(): - return 'from_a' - - def node_b(): - return 'from_b' - - agent = Workflow( - name='test_parallel_hitl', - edges=[ - (START, (node_a, node_b), node_c), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=( - ResumabilityConfig(is_resumable=True) if resumable else None - ), - ) - - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: should pause on first branch that triggers NodeC - events1 = await runner.run_async(testing_utils.get_user_content('start')) - req_events1 = workflow_testing_utils.get_request_input_events(events1) - assert len(req_events1) == 1 - - from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids - - interrupt_id_1 = get_request_input_interrupt_ids(req_events1[0])[0] - # The first trigger for node_c would be from node_a - assert interrupt_id_1 == 'req_c_from_a' - - invocation_id = events1[0].invocation_id - - # Run 2: resume first interrupt. This should complete node_c for 'from_a', - # and then allow the buffered trigger from 'node_b' to be processed, - # yielding the second interrupt. - events2 = await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response(interrupt_id_1, {'text': 'response a'}) - ), - invocation_id=invocation_id, - ) - - req_events2 = workflow_testing_utils.get_request_input_events(events2) - assert len(req_events2) == 1 - interrupt_id_2 = get_request_input_interrupt_ids(req_events2[0])[0] - assert interrupt_id_2 == 'req_c_from_b' - - outputs2 = workflow_testing_utils.get_outputs(events2) - assert 'c_from_a_response a' in outputs2 - - # Run 3: resume second interrupt. This should complete node_c for 'from_b'. - events3 = await runner.run_async( - new_message=testing_utils.UserContent( - create_request_input_response(interrupt_id_2, {'text': 'response b'}) - ), - invocation_id=invocation_id, - ) - outputs3 = workflow_testing_utils.get_outputs(events3) - assert 'c_from_b_response b' in outputs3 - - -@pytest.mark.asyncio -async def test_trigger_buffer_insertion_order_deterministic( - request: pytest.FixtureRequest, -): - """Tests that trigger buffer processes triggers in arrival order.""" - from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids - from google.genai import types - - @node(rerun_on_resume=True) - def node_d(ctx: Context, node_input: Any): - interrupt_id = f'req_d_{node_input}' - if interrupt_id not in ctx.resume_inputs: - yield RequestInput(interrupt_id=interrupt_id, message='input for d') - return - yield Event(output=f'd_done_{node_input}') - - @node(rerun_on_resume=True) - def node_e(ctx: Context, node_input: Any): - interrupt_id = f'req_e_{node_input}' - if interrupt_id not in ctx.resume_inputs: - yield RequestInput(interrupt_id=interrupt_id, message='input for e') - return - yield Event(output=f'e_done_{node_input}') - - def source_a(): - return 'from_a' - - def source_b(): - return 'from_b' - - agent = Workflow( - name='test_trigger_order', - max_concurrency=1, - edges=[ - # Start node_d and node_e to make them busy (WAITING) - (START, node_d), - (START, node_e), - # Then source_a and source_b run and trigger them again - (START, source_a, node_d), - (START, source_b, node_e), - ], - ) - - app_instance = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - - runner = testing_utils.InMemoryRunner(app=app_instance) - - # Run 1: all start, node_d and node_e become WAITING. - # source_a and source_b complete and buffer triggers. - events1 = await runner.run_async(testing_utils.get_user_content('start')) - req_events1 = workflow_testing_utils.get_request_input_events(events1) - - # There should be 2 interrupts (from the initial START edges) - assert len(req_events1) == 2 - - interrupt_ids = [] - for e in req_events1: - interrupt_ids.extend(get_request_input_interrupt_ids(e)) - - id_d = next(id for id in interrupt_ids if 'req_d' in id) - id_e = next(id for id in interrupt_ids if 'req_e' in id) - - invocation_id = events1[0].invocation_id - - # Run 2: We resolve BOTH initial interrupts. - # This frees up node_d and node_e. - # _schedule_ready_nodes will process the buffered triggers. - # Since trigger for node_d was buffered first, and max_concurrency=1, - # only node_d will be picked up! - msg = types.Content( - parts=[ - create_request_input_response(id_d, {'text': 'resolved d'}), - create_request_input_response(id_e, {'text': 'resolved e'}), - ], - role='user', - ) - - events2 = await runner.run_async( - new_message=msg, - invocation_id=invocation_id, - ) - - req_events2 = workflow_testing_utils.get_request_input_events(events2) - # Both interrupts are returned sequentially because yielding an interrupt frees the concurrency slot. - assert len(req_events2) == 2 - interrupt_id_2_first = get_request_input_interrupt_ids(req_events2[0])[0] - interrupt_id_2_second = get_request_input_interrupt_ids(req_events2[1])[0] - # We assert that the FIRST trigger (for from_a) was processed FIRST! - assert interrupt_id_2_first == 'req_d_from_a' - assert interrupt_id_2_second == 'req_e_from_b' diff --git a/tests/unittests/workflow/test_workflow_live.py b/tests/unittests/workflow/test_workflow_live.py deleted file mode 100644 index 697b5775ef..0000000000 --- a/tests/unittests/workflow/test_workflow_live.py +++ /dev/null @@ -1,672 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import asyncio -from typing import Any -from typing import AsyncGenerator - -from google.adk.agents.context import Context -from google.adk.agents.live_request_queue import LiveRequestQueue -from google.adk.agents.llm_agent import LlmAgent -from google.adk.events.event import Event -from google.adk.models.llm_response import LlmResponse -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.workflow._base_node import BaseNode -from google.adk.workflow._base_node import START -from google.adk.workflow._workflow import Workflow -from google.genai import types -import pytest - -from . import testing_utils - -# --- Mock Nodes and Agents for Testing Live Mode Design --- - - -class _MockNonLiveNode(BaseNode): - """A standard non-live node whose signature does NOT accept live_request_queue.""" - - called: bool = False - actual_input: Any = None - - def __init__(self, *, name: str): - super().__init__(name=name) - - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - self.called = True - self.actual_input = node_input - yield Event(output=f"{self.name}_output") - - -class _ConstantNode(BaseNode): - """A node that outputs a constant value.""" - - output_value: Any = None - - def __init__(self, *, name: str, output_value: Any): - super().__init__(name=name) - self.output_value = output_value - - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - yield Event(output=self.output_value) - - -class _DynamicLiveSchedulerNode(BaseNode): - """A node that dynamically schedules a child live node using ctx.run_node().""" - - child_node: BaseNode | None = None - child_output: Any = None - - def __init__(self, *, name: str, child_node: BaseNode): - super().__init__(name=name, rerun_on_resume=True) - self.child_node = child_node - - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - if self.child_node: - self.child_output = await ctx.run_node( - self.child_node, node_input=node_input - ) - yield Event(output=f"{self.name}_output") - - -# --- Live Workflow Unit Tests (TDD) --- - - -@pytest.mark.xfail( - strict=True, - reason=( - "mode='task' workflow graph nodes temporarily disabled; re-enable " - "when scheduler preserves originating node_input on resume." - ), -) -@pytest.mark.asyncio -async def test_hybrid_live_non_live_nodes(): - """CUJ 1: A workflow has hybrid live & non-live nodes.""" - mock_model1 = testing_utils.MockModel.create( - responses=[ - LlmResponse( - content=testing_utils.ModelContent( - [types.Part.from_text(text="Acknowledged: node1_start")] - ) - ), - LlmResponse( - content=testing_utils.ModelContent( - [types.Part.from_text(text="Acknowledged: node1_end")] - ) - ), - LlmResponse( - content=testing_utils.ModelContent([ - types.Part.from_function_call( - name="finish_task", - args={"result": "LiveNode1_output"}, - ) - ]) - ), - ] - ) - live_node1 = LlmAgent( - name="LiveNode1", - model=mock_model1, - mode="task", - instruction="Handle live interaction 1.", - ) - non_live_node = _MockNonLiveNode(name="NonLiveNode") - mock_model2 = testing_utils.MockModel.create( - responses=[ - LlmResponse( - content=testing_utils.ModelContent( - [types.Part.from_text(text="Acknowledged: node2_start")] - ) - ), - LlmResponse( - content=testing_utils.ModelContent( - [types.Part.from_text(text="Acknowledged: node2_end")] - ) - ), - LlmResponse( - content=testing_utils.ModelContent([ - types.Part.from_function_call( - name="finish_task", - args={"result": "LiveNode2_output"}, - ) - ]) - ), - ] - ) - live_node2 = LlmAgent( - name="LiveNode2", - model=mock_model2, - mode="task", - instruction="Handle live interaction 2.", - ) - - wf = Workflow( - name="hybrid_workflow", - edges=[ - (START, live_node1), - (live_node1, non_live_node), - (non_live_node, live_node2), - ], - ) - - live_queue = LiveRequestQueue() - - # Pre-seed first live node's requests - live_queue.send_realtime( - types.Blob(data=b"node1_start", mime_type="audio/pcm") - ) - live_queue.send_realtime(types.Blob(data=b"node1_end", mime_type="audio/pcm")) - - ss = InMemorySessionService() - runner = Runner(app_name=wf.name, node=wf, session_service=ss) - session = await ss.create_session(app_name=wf.name, user_id="u") - - events = [] - async for event in runner.run_live( - user_id="u", - session_id=session.id, - live_request_queue=live_queue, - run_config=testing_utils.RunConfig( - get_session_config={"state_delta": {"__START__": "start_input"}} - ), - ): - events.append(event) - if event.output == "NonLiveNode_output": - # First live node and non-live node completed! Now feed the second live node's requests: - live_queue.send_realtime( - types.Blob(data=b"node2_start", mime_type="audio/pcm") - ) - live_queue.send_realtime( - types.Blob(data=b"node2_end", mime_type="audio/pcm") - ) - - # 1. Assert exact outputs sequence - outputs = [e.output for e in events if e.output is not None] - assert outputs == [ - {"result": "LiveNode1_output"}, - "NonLiveNode_output", - {"result": "LiveNode2_output"}, - ] - assert non_live_node.actual_input == {"result": "LiveNode1_output"} - - # 2. Assert intermediate content events (conversational turns) - content_texts = [ - p.text - for e in events - if e.content and e.content.parts and e.output is None - for p in e.content.parts - if p.text - ] - assert content_texts == [ - "Acknowledged: node1_start", - "Acknowledged: node1_end", - "Acknowledged: node2_start", - "Acknowledged: node2_end", - ] - - # 3. Assert live requests fed to the models - assert [b.data for b in mock_model1.live_blobs] == [ - b"node1_start", - b"node1_end", - ] - assert [b.data for b in mock_model2.live_blobs] == [ - b"node2_start", - b"node2_end", - ] - - -@pytest.mark.xfail( - strict=True, - reason=( - "mode='task' workflow graph nodes temporarily disabled; re-enable " - "when scheduler preserves originating node_input on resume." - ), -) -@pytest.mark.asyncio -async def test_nested_workflow_has_live_node(): - """CUJ 2: A nested workflow has a live node.""" - mock_model = testing_utils.MockModel.create( - responses=[ - LlmResponse( - content=testing_utils.ModelContent( - [types.Part.from_text(text="Acknowledged: inner_start")] - ) - ), - LlmResponse( - content=testing_utils.ModelContent( - [types.Part.from_text(text="Acknowledged: inner_end")] - ) - ), - LlmResponse( - content=testing_utils.ModelContent([ - types.Part.from_function_call( - name="finish_task", - args={"result": "InnerLiveNode_output"}, - ) - ]) - ), - ] - ) - live_node = LlmAgent( - name="InnerLiveNode", - model=mock_model, - mode="task", - instruction="Handle inner live interaction.", - ) - inner_wf = Workflow(name="inner_wf", edges=[(START, live_node)]) - outer_wf = Workflow(name="outer_wf", edges=[(START, inner_wf)]) - - live_queue = LiveRequestQueue() - live_queue.send_realtime( - types.Blob(data=b"inner_start", mime_type="audio/pcm") - ) - live_queue.send_realtime(types.Blob(data=b"inner_end", mime_type="audio/pcm")) - - ss = InMemorySessionService() - runner = Runner(app_name=outer_wf.name, node=outer_wf, session_service=ss) - session = await ss.create_session(app_name=outer_wf.name, user_id="u") - - events = [] - async for event in runner.run_live( - user_id="u", - session_id=session.id, - live_request_queue=live_queue, - run_config=testing_utils.RunConfig( - get_session_config={"state_delta": {"__START__": "start_input"}} - ), - ): - events.append(event) - - # Assert exact outputs sequence - outputs = [e.output for e in events if e.output is not None] - assert outputs == [{"result": "InnerLiveNode_output"}] - - # Assert content events - content_texts = [ - p.text - for e in events - if e.content and e.content.parts and e.output is None - for p in e.content.parts - if p.text - ] - assert content_texts == [ - "Acknowledged: inner_start", - "Acknowledged: inner_end", - ] - assert [b.data for b in mock_model.live_blobs] == [ - b"inner_start", - b"inner_end", - ] - - -@pytest.mark.xfail( - strict=True, - reason=( - "mode='task' workflow graph nodes temporarily disabled; re-enable " - "when scheduler preserves originating node_input on resume." - ), -) -@pytest.mark.asyncio -async def test_nested_live_node_and_outer_live_node(): - """CUJ 3: A nested workflow has live node & outer workflow then has a live node.""" - mock_model_inner = testing_utils.MockModel.create( - responses=[ - LlmResponse( - content=testing_utils.ModelContent( - [types.Part.from_text(text="Acknowledged: inner_start")] - ) - ), - LlmResponse( - content=testing_utils.ModelContent( - [types.Part.from_text(text="Acknowledged: inner_end")] - ) - ), - LlmResponse( - content=testing_utils.ModelContent([ - types.Part.from_function_call( - name="finish_task", - args={"result": "InnerLiveNode_output"}, - ) - ]) - ), - ] - ) - inner_live = LlmAgent( - name="InnerLiveNode", - model=mock_model_inner, - mode="task", - instruction="Handle inner live interaction.", - ) - inner_wf = Workflow(name="inner_wf", edges=[(START, inner_live)]) - - mock_model_outer = testing_utils.MockModel.create( - responses=[ - LlmResponse( - content=testing_utils.ModelContent( - [types.Part.from_text(text="Acknowledged: outer_start")] - ) - ), - LlmResponse( - content=testing_utils.ModelContent( - [types.Part.from_text(text="Acknowledged: outer_end")] - ) - ), - LlmResponse( - content=testing_utils.ModelContent([ - types.Part.from_function_call( - name="finish_task", - args={"result": "OuterLiveNode_output"}, - ) - ]) - ), - ] - ) - outer_live = LlmAgent( - name="OuterLiveNode", - model=mock_model_outer, - mode="task", - instruction="Handle outer live interaction.", - ) - prep_node = _ConstantNode(name="PrepNode", output_value="prep_output") - - wf = Workflow( - name="nested_sequential_live", - edges=[ - (START, inner_wf), - (inner_wf, prep_node), - (prep_node, outer_live), - ], - ) - - live_queue = LiveRequestQueue() - live_queue.send_realtime( - types.Blob(data=b"inner_start", mime_type="audio/pcm") - ) - live_queue.send_realtime(types.Blob(data=b"inner_end", mime_type="audio/pcm")) - - ss = InMemorySessionService() - runner = Runner(app_name=wf.name, node=wf, session_service=ss) - session = await ss.create_session(app_name=wf.name, user_id="u") - - events = [] - async for event in runner.run_live( - user_id="u", - session_id=session.id, - live_request_queue=live_queue, - run_config=testing_utils.RunConfig( - get_session_config={"state_delta": {"__START__": "start_input"}} - ), - ): - events.append(event) - if event.output == "prep_output": - # Inner live node and prep node completed! Feed outer node's requests: - live_queue.send_realtime( - types.Blob(data=b"outer_start", mime_type="audio/pcm") - ) - live_queue.send_realtime( - types.Blob(data=b"outer_end", mime_type="audio/pcm") - ) - - # Assert exact outputs sequence - outputs = [e.output for e in events if e.output is not None] - assert outputs == [ - {"result": "InnerLiveNode_output"}, - "prep_output", - {"result": "OuterLiveNode_output"}, - ] - - # Assert content events - content_texts = [ - p.text - for e in events - if e.content and e.content.parts and e.output is None - for p in e.content.parts - if p.text - ] - assert content_texts == [ - "Acknowledged: inner_start", - "Acknowledged: inner_end", - "Acknowledged: outer_start", - "Acknowledged: outer_end", - ] - assert [b.data for b in mock_model_inner.live_blobs] == [ - b"inner_start", - b"inner_end", - ] - assert [b.data for b in mock_model_outer.live_blobs] == [ - b"outer_start", - b"outer_end", - ] - - -@pytest.mark.asyncio -async def test_dynamic_node_scheduling_of_live_node(): - """CUJ 4: A node in workflow dynamically schedules a live node using ctx.run_node().""" - mock_model = testing_utils.MockModel.create( - responses=[ - LlmResponse( - content=testing_utils.ModelContent( - [types.Part.from_text(text="Acknowledged: dynamic_start")] - ) - ), - LlmResponse( - content=testing_utils.ModelContent( - [types.Part.from_text(text="Acknowledged: dynamic_end")] - ) - ), - LlmResponse( - content=testing_utils.ModelContent([ - types.Part.from_function_call( - name="finish_task", - args={"result": "DynamicLiveNode_output"}, - ) - ]) - ), - ] - ) - live_node = LlmAgent( - name="DynamicLiveNode", - model=mock_model, - mode="task", - instruction="Handle dynamic live interaction.", - ) - scheduler_node = _DynamicLiveSchedulerNode( - name="SchedulerNode", child_node=live_node - ) - - wf = Workflow(name="dynamic_wf", edges=[(START, scheduler_node)]) - - live_queue = LiveRequestQueue() - live_queue.send_realtime( - types.Blob(data=b"dynamic_start", mime_type="audio/pcm") - ) - live_queue.send_realtime( - types.Blob(data=b"dynamic_end", mime_type="audio/pcm") - ) - - ss = InMemorySessionService() - runner = Runner(app_name=wf.name, node=wf, session_service=ss) - session = await ss.create_session(app_name=wf.name, user_id="u") - - events = [] - async for event in runner.run_live( - user_id="u", - session_id=session.id, - live_request_queue=live_queue, - run_config=testing_utils.RunConfig( - get_session_config={"state_delta": {"__START__": "start_input"}} - ), - ): - events.append(event) - - # Assert exact outputs sequence - outputs = [e.output for e in events if e.output is not None] - assert outputs == [ - {"result": "DynamicLiveNode_output"}, - "SchedulerNode_output", - ] - assert scheduler_node.child_output == {"result": "DynamicLiveNode_output"} - - # Assert content events - content_texts = [ - p.text - for e in events - if e.content and e.content.parts and e.output is None - for p in e.content.parts - if p.text - ] - assert content_texts == [ - "Acknowledged: dynamic_start", - "Acknowledged: dynamic_end", - ] - assert [b.data for b in mock_model.live_blobs] == [ - b"dynamic_start", - b"dynamic_end", - ] - - -@pytest.mark.xfail( - strict=True, - reason=( - "mode='task' workflow graph nodes temporarily disabled; re-enable " - "when scheduler preserves originating node_input on resume." - ), -) -@pytest.mark.asyncio -async def test_live_node_output_passed_to_downstream(): - """CUJ 5: Dedicated test verifying output of a live node is passed to the next node.""" - mock_model = testing_utils.MockModel.create( - responses=[ - LlmResponse( - content=testing_utils.ModelContent([ - types.Part.from_function_call( - name="finish_task", - args={"result": "LiveNode_output"}, - ) - ]) - ), - ] - ) - live_node = LlmAgent( - name="LiveNode", - model=mock_model, - mode="task", - instruction="Handle live interaction.", - ) - non_live_node = _MockNonLiveNode(name="NonLiveNode") - - wf = Workflow( - name="dataflow_workflow", - edges=[ - (START, live_node), - (live_node, non_live_node), - ], - ) - - live_queue = LiveRequestQueue() - live_queue.send_realtime(types.Blob(data=b"start_msg", mime_type="audio/pcm")) - live_queue.send_realtime(types.Blob(data=b"end_msg", mime_type="audio/pcm")) - - ss = InMemorySessionService() - runner = Runner(app_name=wf.name, node=wf, session_service=ss) - session = await ss.create_session(app_name=wf.name, user_id="u") - - events = [] - async for event in runner.run_live( - user_id="u", - session_id=session.id, - live_request_queue=live_queue, - run_config=testing_utils.RunConfig( - get_session_config={"state_delta": {"__START__": "start_input"}} - ), - ): - events.append(event) - - outputs = [e.output for e in events if e.output is not None] - assert outputs == [{"result": "LiveNode_output"}, "NonLiveNode_output"] - assert non_live_node.actual_input == { - "result": "LiveNode_output" - }, "The downstream node must receive the live node's exact output" - assert [b.data for b in mock_model.live_blobs] == [b"start_msg", b"end_msg"] - - -@pytest.mark.asyncio -async def test_single_turn_agent_runs_as_non_live_in_live_session(): - """CUJ 6: A single_turn LlmAgent in a live session runs as non-live and consumes node_input.""" - mock_model = testing_utils.MockModel.create( - responses=[ - "SingleTurn_output", - ] - ) - prep_node = _ConstantNode( - name="ConstantNode", output_value="initial_text_input" - ) - single_turn_node = LlmAgent( - name="SingleTurnNode", - model=mock_model, - mode="single_turn", - instruction="Summarize the input.", - ) - capture = _MockNonLiveNode(name="capture") - - wf = Workflow( - name="single_turn_live_wf", - edges=[ - (START, prep_node), - (prep_node, single_turn_node), - (single_turn_node, capture), - ], - ) - - live_queue = LiveRequestQueue() - live_queue.send_realtime( - types.Blob(data=b"ignored_audio", mime_type="audio/pcm") - ) - - ss = InMemorySessionService() - runner = Runner(app_name=wf.name, node=wf, session_service=ss) - session = await ss.create_session(app_name=wf.name, user_id="u") - - events = [] - async for event in runner.run_live( - user_id="u", - session_id=session.id, - live_request_queue=live_queue, - ): - events.append(event) - - outputs = [e.output for e in events if e.output is not None] - assert outputs == ["initial_text_input", "capture_output"] - assert capture.actual_input == "SingleTurn_output" - # Verify that the model received the initial_text_input (node_input) and NOT the live queue audio - assert len(mock_model.requests) == 1 - assert ( - mock_model.requests[0].contents[0].parts[0].text == "initial_text_input" - ) - assert mock_model.live_blobs == [] diff --git a/tests/unittests/workflow/test_workflow_llm_agent_interruptions.py b/tests/unittests/workflow/test_workflow_llm_agent_interruptions.py deleted file mode 100644 index fca4477b59..0000000000 --- a/tests/unittests/workflow/test_workflow_llm_agent_interruptions.py +++ /dev/null @@ -1,887 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import asyncio -import copy -from typing import Any -from typing import AsyncGenerator - -from google.adk.agents import LlmAgent -from google.adk.agents.context import Context -from google.adk.agents.invocation_context import InvocationContext -from google.adk.agents.run_config import RunConfig -from google.adk.apps.app import App -from google.adk.events.event import Event -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.sessions.session import Session -from google.adk.tools.long_running_tool import LongRunningFunctionTool -from google.adk.tools.tool_context import ToolContext -from google.adk.workflow import Edge -from google.adk.workflow import START -from google.adk.workflow._workflow import Workflow -from google.genai import types -import pytest - -from tests.unittests import testing_utils -from tests.unittests.workflow import workflow_testing_utils - - -def long_running_tool_func(): - """A test tool that simulates a long-running operation.""" - return None - - -@pytest.mark.asyncio -async def test_workflow_pause_and_resume_simple( - request: pytest.FixtureRequest, -): - """Tests that a workflow can pause and resume with a single LlmAgent node.""" - - mock_model = testing_utils.MockModel.create( - responses=[ - types.Part.from_function_call( - name='long_running_tool_func', - args={}, - ), - types.Part.from_text(text='LLM response after tool'), - ] - ) - - # 1. Create agent with LRO tool - node_a = LlmAgent( - name='my_agent', - model=mock_model, - tools=[LongRunningFunctionTool(func=long_running_tool_func)], - ) - - # 2. Create workflow with single node - wf = Workflow( - name='test_workflow_hitl', - edges=[ - (START, node_a), - ], - ) - - app = App( - name=request.function.__name__, - root_agent=wf, - ) - runner = testing_utils.InMemoryRunner(app=app) - - # 3. First run: should pause on the long-running function call. - user_event = testing_utils.get_user_content('start workflow') - events1 = await runner.run_async(user_event) - - # Verify it paused on LRO - assert any(e.long_running_tool_ids for e in events1) - - invocation_id = events1[0].invocation_id - fc_event = workflow_testing_utils.find_function_call_event( - events1, 'long_running_tool_func' - ) - assert fc_event is not None - function_call_id = fc_event.content.parts[0].function_call.id - - # 4. Prepare resume message - tool_response = testing_utils.UserContent( - types.Part( - function_response=types.FunctionResponse( - id=function_call_id, - name='long_running_tool_func', - response={'result': 'Final tool output'}, - ) - ) - ) - - # 5. Resume with tool output. - events2 = await runner.run_async( - new_message=tool_response, - invocation_id=invocation_id, - ) - - # 6. Verify completion - content_texts = [ - p.text - for e in events2 - if e.content and e.content.parts - for p in e.content.parts - if p.text - ] - - assert any('LLM response after tool' in t for t in content_texts) - - -@pytest.mark.xfail( - strict=True, - reason=( - "mode='task' workflow graph nodes temporarily disabled; re-enable " - 'when scheduler preserves originating node_input on resume.' - ), -) -@pytest.mark.asyncio -async def test_workflow_pause_and_resume_task_mode( - request: pytest.FixtureRequest, -): - """Tests that a workflow can pause and resume with a single LlmAgent node in task mode.""" - - mock_model = testing_utils.MockModel.create( - responses=[ - types.Part.from_function_call( - name='long_running_tool_func', - args={}, - ), - types.Part.from_text(text='LLM response after tool in task mode'), - ] - ) - - # 1. Create agent with LRO tool and mode='task' - node_a = LlmAgent( - name='my_task_agent', - model=mock_model, - tools=[LongRunningFunctionTool(func=long_running_tool_func)], - mode='task', - ) - - # 2. Create workflow with single node - wf = Workflow( - name='test_workflow_task_hitl', - edges=[ - (START, node_a), - ], - ) - - app = App( - name=request.function.__name__, - root_agent=wf, - ) - runner = testing_utils.InMemoryRunner(app=app) - - # 3. First run: should pause on the long-running function call. - user_event = testing_utils.get_user_content('start workflow') - events1 = await runner.run_async(user_event) - - # Verify it paused on LRO - assert any(e.long_running_tool_ids for e in events1) - - invocation_id = events1[0].invocation_id - fc_event = workflow_testing_utils.find_function_call_event( - events1, 'long_running_tool_func' - ) - assert fc_event is not None - function_call_id = fc_event.content.parts[0].function_call.id - - # 4. Prepare resume message - tool_response = testing_utils.UserContent( - types.Part( - function_response=types.FunctionResponse( - id=function_call_id, - name='long_running_tool_func', - response={'result': 'Final tool output'}, - ) - ) - ) - - # 5. Resume with tool output. - events2 = await runner.run_async( - new_message=tool_response, - invocation_id=invocation_id, - ) - - # 6. Verify completion - content_texts = [ - p.text - for e in events2 - if e.content and e.content.parts - for p in e.content.parts - if p.text - ] - - assert any('LLM response after tool in task mode' in t for t in content_texts) - - -@pytest.mark.asyncio -async def test_workflow_pause_and_resume_tool_confirmation( - request: pytest.FixtureRequest, -): - """Tests that a workflow can pause and resume with a tool requiring confirmation. - - Setup: Workflow with a single LlmAgent node having a tool requiring confirmation. - Act: - - Run 1: Start workflow, tool requests confirmation. - - Run 2: Send confirmation response. - Assert: - - Run 1: Workflow pauses and yields confirmation request. - - Run 2: Workflow resumes and completes with LLM response. - """ - from google.adk.flows.llm_flows.functions import REQUEST_CONFIRMATION_FUNCTION_CALL_NAME - from google.adk.tools.function_tool import FunctionTool - - # Given a tool that requires confirmation and a mock model - def _simple_tool_func(): - return {'result': 'tool executed'} - - mock_model = testing_utils.MockModel.create( - responses=[ - types.Part.from_function_call( - name='_simple_tool_func', - args={}, - ), - types.Part.from_text(text='LLM response after confirmation'), - ] - ) - - node_a = LlmAgent( - name='my_agent', - model=mock_model, - tools=[FunctionTool(func=_simple_tool_func, require_confirmation=True)], - ) - - wf = Workflow( - name='test_workflow_confirmation', - edges=[(START, node_a)], - ) - - app = App( - name=request.function.__name__, - root_agent=wf, - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When the workflow is started - user_event = testing_utils.get_user_content('start workflow') - events1 = await runner.run_async(user_event) - - # Then it should request confirmation - fc_event = None - for e in events1: - if e.content and e.content.parts: - for p in e.content.parts: - if ( - p.function_call - and p.function_call.name == REQUEST_CONFIRMATION_FUNCTION_CALL_NAME - ): - fc_event = e - break - - assert fc_event is not None, 'Did not find confirmation request event' - - ask_for_confirmation_function_call_id = fc_event.content.parts[ - 0 - ].function_call.id - invocation_id = events1[0].invocation_id - - # When the user confirms the tool call - user_confirmation = testing_utils.UserContent( - types.Part( - function_response=types.FunctionResponse( - id=ask_for_confirmation_function_call_id, - name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, - response={'confirmed': True}, - ) - ) - ) - - events2 = await runner.run_async( - new_message=user_confirmation, - invocation_id=invocation_id, - ) - - # Then the workflow completes with the LLM response - content_texts = [ - p.text - for e in events2 - if e.content and e.content.parts - for p in e.content.parts - if p.text - ] - - assert any('LLM response after confirmation' in t for t in content_texts) - - -@pytest.mark.asyncio -async def test_workflow_pause_and_resume_auth_node( - request: pytest.FixtureRequest, -): - """Workflow pauses on missing credentials and resumes when provided. - - Setup: Workflow with a single node requiring auth. - Act: - - Run 1: Start workflow without credentials. - - Run 2: Provide credentials via FunctionResponse. - Assert: - - Run 1: Workflow returns adk_request_credential request. - - Run 2: Workflow completes and yields event with credential. - """ - from fastapi.openapi.models import APIKey - from fastapi.openapi.models import APIKeyIn - from google.adk.auth.auth_credential import AuthCredential - from google.adk.auth.auth_credential import AuthCredentialTypes - from google.adk.auth.auth_tool import AuthConfig - from google.adk.workflow import FunctionNode - - # Given a workflow with a node requiring auth - auth_config = AuthConfig( - auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), - credential_key='my_key', - ) - - def fetch_weather(ctx): - cred = ctx.get_auth_response(auth_config) - api_key = cred.api_key if cred else 'unknown' - from google.adk import Event - - yield Event(message=f'authed with {api_key}') - - node_a = FunctionNode( - func=fetch_weather, auth_config=auth_config, rerun_on_resume=True - ) - - wf = Workflow( - name='test_workflow_auth_node', - edges=[(START, node_a)], - ) - - app = App( - name=request.function.__name__, - root_agent=wf, - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When the workflow is started without credentials - events1 = await runner.run_async(testing_utils.get_user_content('start')) - - # Then it should pause and request credentials - auth_fc_events = [ - e - for e in events1 - if e.content - and e.content.parts - and e.content.parts[0].function_call - and e.content.parts[0].function_call.name == 'adk_request_credential' - ] - assert len(auth_fc_events) == 1 - auth_fc_id = auth_fc_events[0].content.parts[0].function_call.id - invocation_id = events1[0].invocation_id - - # When the user provides the credentials - auth_response = AuthConfig( - auth_scheme=auth_config.auth_scheme, - credential_key=auth_config.credential_key, - exchanged_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.API_KEY, - api_key='secret_key', - ), - ) - - user_credential_response = testing_utils.UserContent( - types.Part( - function_response=types.FunctionResponse( - id=auth_fc_id, - name='adk_request_credential', - response=auth_response.model_dump( - exclude_none=True, by_alias=True - ), - ), - ), - ) - - # When the workflow is resumed - events2 = await runner.run_async( - new_message=user_credential_response, - invocation_id=invocation_id, - ) - - # Then the workflow should resume and complete - content_texts = [ - p.text - for e in events2 - if e.content and e.content.parts - for p in e.content.parts - if p.text - ] - assert any('authed with secret_key' in t for t in content_texts) - - -@pytest.mark.xfail( - strict=True, - reason=( - "mode='task' workflow graph nodes temporarily disabled; re-enable " - 'when scheduler preserves originating node_input on resume.' - ), -) -@pytest.mark.asyncio -async def test_workflow_pause_and_resume_parent_interruption( - request: pytest.FixtureRequest, -): - """Tests multi-agent workflow where parent produces an interruption.""" - - # Child agent (does nothing special) - child_agent = LlmAgent( - name='child_agent', - model=testing_utils.MockModel.create( - responses=[ - types.Part.from_function_call( - name='finish_task', - args={'result': 'Child done'}, - ) - ] - ), - mode='task', - ) - - # Parent agent calls LRO tool first, then delegates to child - fc = types.Part.from_function_call(name='long_running_tool_func', args={}) - call_child = types.Part.from_function_call( - name='child_agent', - args={'request': 'Start child task'}, - ) - - parent_model = testing_utils.MockModel.create( - responses=[ - fc, # First call LRO - call_child, # Then call child - 'Parent all done', # Finally finish - ] - ) - - parent_agent = LlmAgent( - name='parent_agent', - model=parent_model, - tools=[ - LongRunningFunctionTool(func=long_running_tool_func), - ], - sub_agents=[child_agent], - mode='task', - ) - - wf = Workflow( - name='test_workflow_parent_hitl', - edges=[ - (START, parent_agent), - ], - ) - - app = App( - name=request.function.__name__, - root_agent=wf, - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: Should pause on LRO - events1 = await runner.run_async(testing_utils.get_user_content('start')) - assert any(e.long_running_tool_ids for e in events1) - - invocation_id = events1[0].invocation_id - fc_event = workflow_testing_utils.find_function_call_event( - events1, 'long_running_tool_func' - ) - assert fc_event is not None - function_call_id = fc_event.content.parts[0].function_call.id - - # Resume with tool output - tool_response = testing_utils.UserContent( - types.Part( - function_response=types.FunctionResponse( - id=function_call_id, - name='long_running_tool_func', - response={'result': 'LRO done'}, - ) - ) - ) - - events2 = await runner.run_async( - new_message=tool_response, - invocation_id=invocation_id, - ) - - # Verify completion - content_texts = [ - p.text - for e in events2 - if e.content and e.content.parts - for p in e.content.parts - if p.text - ] - assert any('Parent all done' in t for t in content_texts) - - -@pytest.mark.xfail(reason='Task agents cannot have sub-agents in workflow') -@pytest.mark.asyncio -async def test_workflow_pause_and_resume_child_interruption( - request: pytest.FixtureRequest, -): - """Tests multi-agent workflow where child produces an interruption.""" - - # Child agent calls LRO tool - fc = types.Part.from_function_call(name='long_running_tool_func', args={}) - child_model = testing_utils.MockModel.create( - responses=[ - fc, - types.Part.from_function_call( - name='finish_task', - args={'result': 'Child done after tool'}, - ), - ] - ) - - child_agent = LlmAgent( - name='child_agent', - model=child_model, - tools=[LongRunningFunctionTool(func=long_running_tool_func)], - mode='task', - ) - - # Parent agent delegates to child first - call_child = types.Part.from_function_call( - name='child_agent', - args={'request': 'Start child task'}, - ) - parent_model = testing_utils.MockModel.create( - responses=[ - call_child, - call_child, - 'Parent all done', - ] - ) - - parent_agent = LlmAgent( - name='parent_agent', - model=parent_model, - sub_agents=[child_agent], - mode='task', - ) - - wf = Workflow( - name='test_workflow_child_hitl', - edges=[ - (START, parent_agent), - ], - ) - - app = App( - name=request.function.__name__, - root_agent=wf, - ) - runner = testing_utils.InMemoryRunner(app=app) - - # Run 1: Should enter parent, then child, then child pauses on LRO! - events1 = await runner.run_async(testing_utils.get_user_content('start')) - assert any( - p.function_call and p.function_call.name == 'child_agent' - for e in events1 - if e.content - for p in e.content.parts - ) - - invocation_id = events1[0].invocation_id - fc_event = workflow_testing_utils.find_function_call_event( - events1, 'long_running_tool_func' - ) - assert fc_event is not None - function_call_id = fc_event.content.parts[0].function_call.id - - # Resume with tool output - tool_response = testing_utils.UserContent( - types.Part( - function_response=types.FunctionResponse( - id=function_call_id, - name='long_running_tool_func', - response={'result': 'LRO done'}, - ) - ) - ) - - events2 = await runner.run_async( - new_message=tool_response, - invocation_id=invocation_id, - ) - - # Verify completion - content_texts = [ - p.text - for e in events2 - if e.content and e.content.parts - for p in e.content.parts - if p.text - ] - assert any('Parent all done' in t for t in content_texts) - - -def _append_function_response( - session, invocation_id, branch, fc_id, func_name, response -): - """Helper to append a FunctionResponse event to a session.""" - session.events.append( - Event( - invocation_id=invocation_id, - author='user', - branch=branch, - content=types.Content( - role='user', - parts=[ - types.Part( - function_response=types.FunctionResponse( - id=fc_id, - name=func_name, - response=response, - ) - ) - ], - ), - ) - ) - - -@pytest.mark.asyncio -async def test_workflow_resume_inputs_fallback_branch(monkeypatch): - """Resume inputs find function name in a different branch. - - Setup: Session contains a FunctionCall in branch_A. - Act: Run the wrapper with resume_inputs for that FunctionCall in branch_B. - Assert: The wrapper successfully finds the function name and completes. - """ - - # Arrange - mock_model = testing_utils.MockModel.create( - responses=[types.Part.from_text(text='I am done')] - ) - agent = LlmAgent(name='test_agent', model=mock_model) - - # Create a dummy context and session - - session = Session(id='test_session', appName='test_app', userId='test_user') - # Add an event with function call in branch 'branch_A' - session.events.append( - Event( - invocation_id='test_inv', - branch='branch_A', - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - id='fc_123', - name='my_target_func', - args={}, - ) - ) - ] - ), - ) - ) - - # Create invocation context with branch 'branch_B' - - session_service = InMemorySessionService() - - ic = InvocationContext( - session=session, - branch='branch_B', - session_service=session_service, - invocation_id='test_inv', - run_config=RunConfig(), - agent=agent, - ) - - # Create context with resume_inputs - ctx = Context( - ic, - node_path='test_agent', - run_id='1', - resume_inputs={'fc_123': {'result': 'ok'}}, - ) - - # Mock prepare functions - class DummyAgentCtx: - - def __init__(self, ic): - self._ic = ic - - def get_invocation_context(self): - return self._ic - - from google.adk.workflow import _llm_agent_wrapper - - monkeypatch.setattr( - _llm_agent_wrapper, - 'prepare_llm_agent_context', - lambda a, c: DummyAgentCtx(ic), - ) - monkeypatch.setattr( - _llm_agent_wrapper, 'prepare_llm_agent_input', lambda a, c, i: None - ) - - # Simulate Runner adding the event to the correct branch! - _append_function_response( - session, - invocation_id='test_inv', - branch='branch_A', - fc_id='fc_123', - func_name='my_target_func', - response={'result': 'ok'}, - ) - - # Act - Run the function directly - from google.adk.workflow._llm_agent_wrapper import run_llm_agent_as_node - - gen = run_llm_agent_as_node(agent, ctx=ctx, node_input='start') - try: - await gen.__anext__() - except StopAsyncIteration: - pass - - # Assert - Verify that the event is there with correct branch - # Initial events had 1 item + 1 simulated by Runner = 2! - assert len(session.events) == 2 - event = session.events[-1] # The newly injected event! - assert ( - event.branch == 'branch_A' - ) # Injected in the branch where call was made! - assert event.content.parts[0].function_response.name == 'my_target_func' - - -@pytest.mark.asyncio -async def test_workflow_resume_inputs_multiple_branches(monkeypatch): - """Resume inputs handle multiple items targeting different branches. - - Setup: Session contains FunctionCalls in branch_A and branch_B. - Act: Run the wrapper with resume_inputs for both in branch_C. - Assert: The wrapper successfully finds function names for both. - """ - - # Arrange - mock_model = testing_utils.MockModel.create( - responses=[types.Part.from_text(text='I am done')] - ) - agent = LlmAgent(name='test_agent', model=mock_model) - - session = Session(id='test_session', appName='test_app', userId='test_user') - - # Add event 1 in branch_A - session.events.append( - Event( - invocation_id='test_inv', - branch='branch_A', - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - id='fc_A', - name='func_A', - args={}, - ) - ) - ] - ), - ) - ) - - # Add event 2 in branch_B - session.events.append( - Event( - invocation_id='test_inv', - branch='branch_B', - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - id='fc_B', - name='func_B', - args={}, - ) - ) - ] - ), - ) - ) - - session_service = InMemorySessionService() - - # Current branch is branch_C - ic = InvocationContext( - session=session, - branch='branch_C', - session_service=session_service, - invocation_id='test_inv', - run_config=RunConfig(), - agent=agent, - ) - - ctx = Context( - ic, - node_path='test_agent', - run_id='1', - resume_inputs={'fc_A': {'result': 'ok_A'}, 'fc_B': {'result': 'ok_B'}}, - ) - - class DummyAgentCtx: - - def __init__(self, ic): - self._ic = ic - - def get_invocation_context(self): - return self._ic - - from google.adk.workflow import _llm_agent_wrapper - - monkeypatch.setattr( - _llm_agent_wrapper, - 'prepare_llm_agent_context', - lambda a, c: DummyAgentCtx(ic), - ) - monkeypatch.setattr( - _llm_agent_wrapper, 'prepare_llm_agent_input', lambda a, c, i: None - ) - - # Simulate Runner adding the events to the correct branches! - _append_function_response( - session, - invocation_id='test_inv', - branch='branch_A', - fc_id='fc_A', - func_name='func_A', - response={'result': 'ok_A'}, - ) - _append_function_response( - session, - invocation_id='test_inv', - branch='branch_B', - fc_id='fc_B', - func_name='func_B', - response={'result': 'ok_B'}, - ) - - # Act - Run the function directly - from google.adk.workflow._llm_agent_wrapper import run_llm_agent_as_node - - gen = run_llm_agent_as_node(agent, ctx=ctx, node_input='start') - try: - await gen.__anext__() - except StopAsyncIteration: - pass - - # Assert - Verify that the events are there with correct branches - # Initial events had 2 items + 2 simulated by Runner = 4! - assert len(session.events) == 4 - - # Check both exist in the injected events - injected_events = session.events[2:] - branches = [e.branch for e in injected_events] - names = [e.content.parts[0].function_response.name for e in injected_events] - - assert 'branch_A' in branches - assert 'branch_B' in branches - assert 'func_A' in names - assert 'func_B' in names diff --git a/tests/unittests/workflow/test_workflow_nested.py b/tests/unittests/workflow/test_workflow_nested.py deleted file mode 100644 index 8be4b48420..0000000000 --- a/tests/unittests/workflow/test_workflow_nested.py +++ /dev/null @@ -1,1161 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import copy -from typing import Any -from typing import AsyncGenerator -import uuid - -from google.adk.agents.context import Context -from google.adk.agents.llm_agent import LlmAgent -from google.adk.apps.app import App -from google.adk.events.event import Event -from google.adk.events.request_input import RequestInput -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.tools.long_running_tool import LongRunningFunctionTool -from google.adk.workflow import BaseNode -from google.adk.workflow import JoinNode -from google.adk.workflow._base_node import START -from google.adk.workflow._node_status import NodeStatus -from google.adk.workflow._workflow import Workflow -from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_response -from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids -from google.adk.workflow.utils._workflow_hitl_utils import has_request_input_function_call -from google.genai import types -from pydantic import ConfigDict -from pydantic import Field -import pytest -from typing_extensions import override - -from .. import testing_utils -from .workflow_testing_utils import find_function_call_event -from .workflow_testing_utils import InputCapturingNode -from .workflow_testing_utils import RequestInputNode -from .workflow_testing_utils import simplify_events_with_node -from .workflow_testing_utils import TestingNode - - -def long_running_tool_func(): - """A test tool that simulates a long-running operation.""" - return None - - -@pytest.mark.asyncio -async def test_nested_workflow_as_node(request: pytest.FixtureRequest): - """Tests that a Workflow can be used as a node in another Workflow.""" - - async def nested_func(node_input: types.Content): - return 'I am nested' - - nested_agent = Workflow( - name='nested_agent', - edges=[('START', nested_func)], - ) - - async def output_func(node_input: str): - return 'I am outer' - - outer_agent = Workflow( - name='outer_agent', - edges=[('START', nested_agent), (nested_agent, output_func)], - ) - - app = App( - name=request.function.__name__, - root_agent=outer_agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('hello')) - - simplified_events = simplify_events_with_node(events) - assert simplified_events == [ - ( - 'outer_agent@1/nested_agent@1/nested_func@1', - { - 'output': 'I am nested', - }, - ), - ( - 'outer_agent@1/output_func@1', - { - 'output': 'I am outer', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_nested_workflow_with_join_node( - request: pytest.FixtureRequest, -): - """Tests that a nested Workflow with JoinNode works correctly.""" - - async def nested_node_a(): - return {'a': 1} - - async def nested_node_b(): - return {'b': 2} - - async def nested_node_c(): - return {'c': 3} - - nested_join_node = JoinNode(name='nested_join') - - nested_agent = Workflow( - name='nested_agent', - edges=[ - ('START', nested_node_a), - ('START', nested_node_c), - (nested_node_a, nested_join_node), - (nested_node_c, nested_node_b), - (nested_node_b, nested_join_node), - ], - ) - - async def output_func(node_input: dict): - return ( - 'Joined output:' - f' a={node_input["nested_node_a"]["a"]},' - f' b={node_input["nested_node_b"]["b"]}' - ) - - outer_agent = Workflow( - name='outer_agent', - edges=[('START', nested_agent), (nested_agent, output_func)], - ) - - app = App( - name=request.function.__name__, - root_agent=outer_agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('hello')) - - simplified_events = simplify_events_with_node(events) - assert sorted(simplified_events[0:2], key=lambda x: x[0]) == [ - ( - 'outer_agent@1/nested_agent@1/nested_node_a@1', - {'output': {'a': 1}}, - ), - ( - 'outer_agent@1/nested_agent@1/nested_node_c@1', - {'output': {'c': 3}}, - ), - ] - assert simplified_events[2:] == [ - ( - 'outer_agent@1/nested_agent@1/nested_node_b@1', - {'output': {'b': 2}}, - ), - ( - 'outer_agent@1/nested_agent@1/nested_join@1', - { - 'output': {'nested_node_a': {'a': 1}, 'nested_node_b': {'b': 2}}, - }, - ), - ( - 'outer_agent@1/output_func@1', - { - 'output': 'Joined output: a=1, b=2', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_nested_workflow_updates_state_outer_reads( - request: pytest.FixtureRequest, -): - """Tests that outer workflow can read state updated by nested workflow.""" - - async def nested_state_updater(ctx: Context): - yield Event( - state={'my_key': 'my_value'}, - ) - yield 'nested agent finished' - - nested_agent = Workflow( - name='nested_agent', - edges=[('START', nested_state_updater)], - ) - - def outer_state_reader(my_key: str, node_input: str): - return f'Nested agent output: {node_input}, state value: {my_key}' - - outer_agent = Workflow( - name='outer_agent', - edges=[('START', nested_agent), (nested_agent, outer_state_reader)], - ) - - app = App( - name=request.function.__name__, - root_agent=outer_agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('hello')) - - simplified_events = simplify_events_with_node(events) - assert simplified_events == [ - ( - 'outer_agent@1/nested_agent@1/nested_state_updater@1', - { - 'output': 'nested agent finished', - }, - ), - ( - 'outer_agent@1/outer_state_reader@1', - { - 'output': ( - 'Nested agent output: nested agent finished, state value:' - ' my_value' - ), - }, - ), - ] - - -@pytest.mark.asyncio -async def test_nested_workflow_intermediate_nodes( - request: pytest.FixtureRequest, -): - """Tests that only the final output of a nested workflow is passed to the outer workflow.""" - - node_a = TestingNode(name='NodeA', output='Inner Intermediate') - node_b = TestingNode(name='NodeB', output='Inner Final') - - nested_agent = Workflow( - name='nested_agent', - edges=[ - ('START', node_a), - (node_a, node_b), - ], - ) - - output_node = InputCapturingNode(name='OutputNode') - - outer_agent = Workflow( - name='outer_agent', - edges=[ - ('START', nested_agent), - (nested_agent, output_node), - ], - ) - - app = App( - name=request.function.__name__, - root_agent=outer_agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - assert output_node.received_inputs == ['Inner Final'] - - simplified_events = simplify_events_with_node(events) - assert simplified_events == [ - ( - 'outer_agent@1/nested_agent@1/NodeA@1', - {'output': 'Inner Intermediate'}, - ), - ( - 'outer_agent@1/nested_agent@1/NodeB@1', - {'output': 'Inner Final'}, - ), - ( - 'outer_agent@1/OutputNode@1', - {'output': {'received': 'Inner Final'}}, - ), - ] - - -@pytest.mark.asyncio -async def test_nested_workflow_with_hitl(request: pytest.FixtureRequest): - """Tests that a nested Workflow with HITL works correctly.""" - # Given: A nested workflow with an LLM agent that calls a long running tool - llm_agent = LlmAgent( - name='llm_agent', - model=testing_utils.MockModel.create( - responses=[ - types.Part.from_function_call( - name='long_running_tool_func', - args={}, - ), - types.Part.from_text(text='LLM response after tool'), - ] - ), - tools=[LongRunningFunctionTool(func=long_running_tool_func)], - ) - - nested_agent = Workflow( - name='nested_agent', - edges=[('START', llm_agent)], - ) - - async def output_func(node_input: Any): - return 'I am outer' - - outer_agent = Workflow( - name='outer_agent', - edges=[('START', nested_agent), (nested_agent, output_func)], - ) - - app = App( - name=request.function.__name__, - root_agent=outer_agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When: Starting the workflow - user_event = testing_utils.get_user_content('start workflow') - events1 = await runner.run_async(user_event) - - # Then: It should yield a FunctionCall event and wait for tool execution - ev = find_function_call_event(events1, 'long_running_tool_func') - assert ev is not None - function_call_id = ev.content.parts[0].function_call.id - - simplified_events1 = simplify_events_with_node(events1) - assert simplified_events1 == [ - ( - 'outer_agent@1/nested_agent@1/llm_agent@1', - types.Part.from_function_call(name='long_running_tool_func', args={}), - ), - ] - - tool_response = testing_utils.UserContent( - types.Part( - function_response=types.FunctionResponse( - id=function_call_id, - name='long_running_tool_func', - response={'result': 'Final tool output'}, - ) - ) - ) - - invocation_id = events1[0].invocation_id - events2 = await runner.run_async( - new_message=tool_response, - invocation_id=invocation_id, - ) - - simplified_events2 = simplify_events_with_node(events2) - assert simplified_events2 == [ - ('outer_agent@1/nested_agent@1/llm_agent@1', 'LLM response after tool'), - ( - 'outer_agent@1/output_func@1', - {'output': 'I am outer'}, - ), - ] - - -@pytest.mark.asyncio -async def test_nested_workflow_with_request_input_event_hitl( - request: pytest.FixtureRequest, -): - """Nested workflow correctly propagates RequestInput and resumes. - - Setup: outer_agent -> nested_agent -> node_hitl. - Act: - - Run 1: start workflow, node_hitl yields RequestInput. - - Run 2: resume with user response. - Assert: - - Run 1: returns RequestInput event. - - Run 2: node_hitl receives input and completes. - """ - - class NodeHitl(BaseNode): - model_config = ConfigDict(arbitrary_types_allowed=True) - rerun_on_resume: bool = Field(default=True) - name: str = Field(default='node_hitl') - - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - if resume_input := ctx.resume_inputs.get('request_input'): - yield f'Resumed with user input: {resume_input}' - else: - yield RequestInput( - message='requesting input via RequestInputEvent', - interrupt_id='request_input', - ) - - # Given: A nested workflow where the inner node requests input - node_hitl_instance = NodeHitl() - - nested_agent = Workflow( - name='nested_agent', - edges=[('START', node_hitl_instance)], - ) - - async def output_func(): - return 'I am outer' - - outer_agent = Workflow( - name='outer_agent', - edges=[('START', nested_agent), (nested_agent, output_func)], - ) - - app = App( - name=request.function.__name__, - root_agent=outer_agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When: Starting the workflow - user_event = testing_utils.get_user_content('start workflow') - events1 = await runner.run_async(user_event) - - # Then: It should yield a RequestInput event - req_events = [e for e in events1 if has_request_input_function_call(e)] - assert req_events - interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] - assert interrupt_id == 'request_input' - - simplified_events1 = simplify_events_with_node(events1) - assert simplified_events1 == [ - ( - 'outer_agent@1/nested_agent@1/node_hitl@1', - testing_utils.simplify_content(copy.deepcopy(req_events[0].content)), - ), - ] - - # When: Resuming with user response - hitl_response = types.Content( - parts=[ - create_request_input_response( - interrupt_id, {'response': 'user input for hitl'} - ) - ], - role='user', - ) - - invocation_id = events1[0].invocation_id - events2 = await runner.run_async( - new_message=hitl_response, - invocation_id=invocation_id, - ) - - # Then: It should complete and pass output to the outer workflow - simplified_events2 = simplify_events_with_node(events2) - assert simplified_events2 == [ - ( - 'outer_agent@1/nested_agent@1/node_hitl@1', - { - 'output': ( - "Resumed with user input: {'response': 'user input for hitl'}" - ), - }, - ), - ( - 'outer_agent@1/output_func@1', - {'output': 'I am outer'}, - ), - ] - - -@pytest.mark.asyncio -async def test_nested_agent_with_request_input_piped_to_next_node( - request: pytest.FixtureRequest, -): - """Tests that user response to RequestInput in nested agent is piped to next node.""" - ask_user = RequestInputNode( - name='ask_user', - message='Please provide input', - ) - capture_node = InputCapturingNode(name='capture_node') - - sub_agent = Workflow( - name='sub_agent', - edges=[ - ('START', ask_user), - (ask_user, capture_node), - ], - ) - - root_agent = Workflow( - name='root_agent', - edges=[('START', sub_agent)], - ) - - app = App( - name=request.function.__name__, - root_agent=root_agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - - user_event = testing_utils.get_user_content('start workflow') - events1 = await runner.run_async(user_event) - - req_events = [e for e in events1 if has_request_input_function_call(e)] - assert req_events - interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] - assert interrupt_id - hitl_response_payload = {'response': 'user input for hitl'} - hitl_response = types.Content( - parts=[ - create_request_input_response(interrupt_id, hitl_response_payload) - ], - role='user', - ) - - invocation_id = events1[0].invocation_id - await runner.run_async( - new_message=hitl_response, - invocation_id=invocation_id, - ) - - assert capture_node.received_inputs == [hitl_response_payload] - - -@pytest.mark.asyncio -async def test_nested_workflow_chain_input_propagation( - request: pytest.FixtureRequest, -): - - async def create_output_a(): - return 'output of A' - - nested_agent_a = Workflow( - name='nested_agent_a', - edges=[('START', create_output_a)], - ) - - capture_node_b = InputCapturingNode(name='capture_node_b') - nested_agent_b = Workflow( - name='nested_agent_b', - edges=[('START', capture_node_b)], - ) - - outer_agent = Workflow( - name='outer_agent', - edges=[ - ('START', nested_agent_a), - (nested_agent_a, nested_agent_b), - ], - ) - - app = App( - name=request.function.__name__, - root_agent=outer_agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - await runner.run_async(testing_utils.get_user_content('hello')) - - assert capture_node_b.received_inputs == ['output of A'] - - -@pytest.mark.asyncio -async def test_nested_workflow_with_tool_calls( - request: pytest.FixtureRequest, -): - """Tests that a nested Workflow works correctly with two tool calls.""" - tool_call_count = 0 - - def simple_tool() -> str: - nonlocal tool_call_count - tool_call_count += 1 - return f'Tool output {tool_call_count}' - - # Given: A nested workflow where the inner node calls a tool - llm_agent = LlmAgent( - name='llm_agent', - model=testing_utils.MockModel.create( - responses=[ - types.Part.from_function_call( - name='simple_tool', - args={}, - ), - types.Part.from_text(text='LLM response after tools'), - ] - ), - tools=[simple_tool], - ) - - nested_agent = Workflow( - name='nested_agent', - edges=[('START', llm_agent)], - ) - - async def output_func(): - return 'I am outer' - - outer_agent = Workflow( - name='outer_agent', - edges=[ - ('START', nested_agent), - (nested_agent, output_func), - ], - ) - - app = App( - name=request.function.__name__, - root_agent=outer_agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When: Starting the workflow - user_event = testing_utils.get_user_content('start workflow') - events = await runner.run_async(user_event) - - # Then: It should call the tool and yield events - assert tool_call_count == 1 - - simplified_events = simplify_events_with_node(events) - - # Extract the dynamically generated function_call_id from events. - ev = find_function_call_event(events, 'simple_tool') - assert ev is not None - function_call_id = ev.content.parts[0].function_call.id - - assert simplified_events == [ - ( - 'outer_agent@1/nested_agent@1/llm_agent@1', - types.Part.from_function_call(name='simple_tool', args={}), - ), - ( - 'outer_agent@1/nested_agent@1/llm_agent@1', - types.Part( - function_response=types.FunctionResponse( - name='simple_tool', - response={'result': 'Tool output 1'}, - ) - ), - ), - ('outer_agent@1/nested_agent@1/llm_agent@1', 'LLM response after tools'), - ( - 'outer_agent@1/output_func@1', - { - 'output': 'I am outer', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_three_level_nested_workflow(request: pytest.FixtureRequest): - """Tests a 3-level nested Workflow structure.""" - - async def inner_func(): - return 'I am inner' - - inner_agent = Workflow( - name='inner_agent', - edges=[('START', inner_func)], - ) - - async def middle_func(): - return 'I am middle' - - middle_agent = Workflow( - name='middle_agent', - edges=[('START', inner_agent), (inner_agent, middle_func)], - ) - - async def outer_func(): - return 'I am outer' - - outer_agent = Workflow( - name='outer_agent', - edges=[('START', middle_agent), (middle_agent, outer_func)], - ) - - app = App( - name=request.function.__name__, - root_agent=outer_agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('hello')) - - simplified_events = simplify_events_with_node(events) - assert simplified_events == [ - ( - 'outer_agent@1/middle_agent@1/inner_agent@1/inner_func@1', - { - 'output': 'I am inner', - }, - ), - ( - 'outer_agent@1/middle_agent@1/middle_func@1', - { - 'output': 'I am middle', - }, - ), - ( - 'outer_agent@1/outer_func@1', - { - 'output': 'I am outer', - }, - ), - ] - - -@pytest.mark.asyncio -async def test_duplicate_grandchild_workflow_names( - request: pytest.FixtureRequest, -): - """Tests that grandchild workflow agents with same name can coexist.""" - - # Given: A workflow hierarchy where grandchild workflows have the same name - async def grandchild_func(): - return 'I am grandchild' - - grandchild_agent = Workflow( - name='grandchild', - edges=[('START', grandchild_func)], - ) - - child1_agent = Workflow( - name='child1', - edges=[('START', copy.deepcopy(grandchild_agent))], - ) - - child2_agent = Workflow( - name='child2', - edges=[('START', copy.deepcopy(grandchild_agent))], - ) - - root_agent = Workflow( - name='root', - edges=[('START', child1_agent), (child1_agent, child2_agent)], - ) - - app = App( - name=request.function.__name__, - root_agent=root_agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - # When: Starting the workflow - user_content = testing_utils.get_user_content('hello') - events = await runner.run_async(user_content) - - # Then: It should execute both grandchildren successfully - simplified_events = simplify_events_with_node(events) - assert simplified_events == [ - ( - 'root@1/child1@1/grandchild@1/grandchild_func@1', - {'output': 'I am grandchild'}, - ), - ( - 'root@1/child2@1/grandchild@1/grandchild_func@1', - {'output': 'I am grandchild'}, - ), - ] - - -@pytest.mark.asyncio -async def test_duplicate_name_in_ancestral_path( - request: pytest.FixtureRequest, -): - """Tests that agent with same name can exist in ancestral path (A->B->A).""" - - async def func_a(): - return 'I am A' - - agent_a_child = Workflow( - name='A', - edges=[('START', func_a)], - ) - - agent_b = Workflow( - name='B', - edges=[('START', agent_a_child)], - ) - - agent_a_root = Workflow( - name='A', - edges=[('START', agent_b)], - ) - - app = App( - name=request.function.__name__, - root_agent=agent_a_root, - ) - runner = testing_utils.InMemoryRunner(app=app) - user_content = testing_utils.get_user_content('hello') - events = await runner.run_async(user_content) - - simplified_events = simplify_events_with_node(events) - assert simplified_events == [ - ( - 'A@1/B@1/A@1/func_a@1', - {'output': 'I am A'}, - ), - ] - - -# --- Helpers moved from test_workflow.py --- - - -class _OutputNode(BaseNode): - """Yields a fixed output value.""" - - value: Any = None - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield self.value - - -class _InputCapturingNode(BaseNode): - """Captures node_input for later assertion.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - received_inputs: list[Any] = Field(default_factory=list) - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - self.received_inputs.append(node_input) - yield {'received': node_input} - - -async def _run_workflow(wf, message='start'): - """Run a Workflow through Runner, return collected events.""" - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - msg = types.Content(parts=[types.Part(text=message)], role='user') - events = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - return events, ss, session - - -def _outputs(events): - """Extract non-None outputs from events.""" - return [e.output for e in events if e.output is not None] - - -def _output_by_node(events): - """Extract (node_name_from_path, output) for child node events.""" - results = [] - for e in events: - if e.output is not None and e.node_info.path and '/' in e.node_info.path: - node_name = e.node_info.path.rsplit('/', 1)[-1] - if '@' in node_name: - node_name = node_name.rsplit('@', 1)[0] - results.append((node_name, e.output)) - return results - - -# --- Tests moved from test_workflow.py --- - - -@pytest.mark.asyncio -async def test_nested_workflow_completes(): - """Inner workflow runs to completion, outer continues downstream.""" - inner_node = _OutputNode(name='inner_node', value='inner_result') - inner_wf = Workflow(name='inner_wf', edges=[(START, inner_node)]) - before = _OutputNode(name='before', value='before_result') - after = _InputCapturingNode(name='after') - wf = Workflow(name='wf', edges=[(START, before, inner_wf, after)]) - - events, _, _ = await _run_workflow(wf) - - by_node = _output_by_node(events) - assert ('before', 'before_result') in by_node - assert ('inner_node', 'inner_result') in by_node - assert after.received_inputs == ['inner_result'] - - -@pytest.mark.asyncio -async def test_nested_workflow_event_author(): - """Events are authored by the nearest orchestrator (workflow/agent). - - Setup: outer_wf → inner_wf → inner_node. - Assert: - - inner_node's events are authored by inner_wf (nearest). - - outer_wf's direct children are authored by outer_wf. - - inner_wf overrides the author for its subtree. - """ - inner_node = _OutputNode(name='inner_node', value='inner_result') - inner_wf = Workflow(name='inner_wf', edges=[(START, inner_node)]) - outer_node = _OutputNode(name='outer_node', value='outer_result') - wf = Workflow( - name='outer_wf', - edges=[(START, outer_node, inner_wf)], - ) - - events, _, _ = await _run_workflow(wf) - - # outer_node's events authored by outer_wf (nearest orchestrator). - outer_events = [ - e for e in events if e.node_info.path == 'outer_wf@1/outer_node@1' - ] - assert outer_events - assert all(e.author == 'outer_wf' for e in outer_events) - - # inner_node's events authored by inner_wf (nearest orchestrator), - # NOT outer_wf. - inner_events = [ - e - for e in events - if e.node_info.path == 'outer_wf@1/inner_wf@1/inner_node@1' - ] - assert inner_events - assert all(e.author == 'inner_wf' for e in inner_events) - - -@pytest.mark.asyncio -async def test_nested_workflow_interrupt_and_resume(): - """Inner workflow child interrupts, outer resumes on FR.""" - - class _InterruptNode(BaseNode): - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - fc_id = ctx.state.get('_nested_fc') - if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: - ctx.state['_nested_fc'] = None - response = ctx.resume_inputs[fc_id]['answer'] - yield f'approved:{response}' - return - fc_id = f'fc-{uuid.uuid4().hex[:8]}' - ctx.state['_nested_fc'] = fc_id - yield Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name='inner_tool', args={}, id=fc_id - ) - ) - ] - ), - long_running_tool_ids={fc_id}, - ) - - inner_wf = Workflow( - name='inner_wf', - edges=[(START, _InterruptNode(name='approval'))], - ) - before = _OutputNode(name='before', value='before_result') - after = _InputCapturingNode(name='after') - wf = Workflow( - name='wf', - edges=[(START, before, inner_wf, after)], - ) - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: before completes, inner_wf/approval interrupts - msg1 = types.Content(parts=[types.Part(text='go')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - # Should have interrupt from inner's child - interrupt_events = [e for e in events1 if e.long_running_tool_ids] - assert len(interrupt_events) == 1 - assert interrupt_events[0].long_running_tool_ids is not None - fc_id = list(interrupt_events[0].long_running_tool_ids)[0] - - # Workflow-level interrupt events should NOT be persisted - # (they're _adk_internal). Only the leaf child's event at - # 'wf/inner_wf/approval' should have interrupt ids in session. - updated_session = await ss.get_session( - app_name='test', user_id='u', session_id=session.id - ) - assert updated_session is not None - wf_interrupt_events = [ - e - for e in updated_session.events - if e.long_running_tool_ids and e.node_info.path in ('wf', 'wf/inner_wf') - ] - assert wf_interrupt_events == [] - - # Run 2: resume - msg2 = types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - name='inner_tool', - id=fc_id, - response={'answer': 'yes'}, - ) - ) - ], - role='user', - ) - events2: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events2.append(event) - - # Inner resumed, after should receive inner's output - outputs = [e.output for e in events2 if e.output is not None] - assert 'approved:yes' in outputs - assert after.received_inputs == ['approved:yes'] - - -@pytest.mark.asyncio -async def test_nested_workflow_partial_resume(): - """Partial FR re-runs nested Workflow, resolved child completes while unresolved stays interrupted. - - Setup: outer_wf → inner_wf → (child_a, child_b) → join. - Both children interrupt on first run. - Act: - - Run 2: resolve only child_a's FR. - - Run 3: resolve child_b's FR. - Assert: - - Run 2: child_a produces output, invocation still interrupted. - - Run 3: child_b produces output, join completes, no interrupts. - """ - - class _InterruptOnce(BaseNode): - """Interrupts on first run, yields resume response on second.""" - - rerun_on_resume: bool = True - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - fc_id = f'fc-{self.name}' - if ctx.resume_inputs and fc_id in ctx.resume_inputs: - yield f'{self.name}:{ctx.resume_inputs[fc_id]}' - return - yield RequestInput(interrupt_id=fc_id) - - child_a = _InterruptOnce(name='child_a') - child_b = _InterruptOnce(name='child_b') - join = JoinNode(name='join', wait_for_output=True) - - inner_wf = Workflow( - name='inner_wf', - edges=[ - (START, child_a), - (START, child_b), - (child_a, join), - (child_b, join), - ], - ) - - outer_wf = Workflow( - name='outer', - edges=[(START, inner_wf)], - ) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=outer_wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Run 1: both children interrupt - msg1 = types.Content(parts=[types.Part(text='go')], role='user') - events1: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg1 - ): - events1.append(event) - - interrupt_ids = set() - for e in events1: - if e.long_running_tool_ids: - interrupt_ids.update(e.long_running_tool_ids) - assert 'fc-child_a' in interrupt_ids - assert 'fc-child_b' in interrupt_ids - - # Run 2: resolve only child_a - msg2 = types.Content( - parts=[create_request_input_response('fc-child_a', {'v': 'a'})], - role='user', - ) - events2: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg2 - ): - events2.append(event) - - # child_a should have produced output - child_a_outputs = [ - e.output - for e in events2 - if e.node_info.path and 'child_a' in e.node_info.path and e.output - ] - assert any('child_a:' in str(o) for o in child_a_outputs) - - # Run 3: resolve child_b → join completes, workflow finishes - msg3 = types.Content( - parts=[create_request_input_response('fc-child_b', {'v': 'b'})], - role='user', - ) - events3: list[Event] = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg3 - ): - events3.append(event) - - # child_b should have produced output - child_b_outputs = [ - e.output - for e in events3 - if e.node_info.path and 'child_b' in e.node_info.path and e.output - ] - assert any('child_b:' in str(o) for o in child_b_outputs) - - # join should have completed (no more interrupts) - final_interrupts = set() - for e in events3: - if e.long_running_tool_ids: - final_interrupts.update(e.long_running_tool_ids) - assert not final_interrupts - - -@pytest.mark.asyncio -async def test_scan_child_events_ignores_descendant_run_id_resets(): - """_scan_child_events only resets run_id from direct child events.""" - from unittest.mock import MagicMock - - from google.adk.events.event import Event - from google.adk.events.event import NodeInfo - - # We create a Workflow instance to test its private method _scan_child_events. - wf = Workflow(name='wf', edges=[]) - - # Given a direct child event and a descendant event. - event1 = Event( - author='node', - node_info=NodeInfo(path='wf@1/child@1', run_id='1'), - invocation_id='test_inv', - ) - event2 = Event( - author='node', - node_info=NodeInfo(path='wf@1/child@1/grandchild@2', run_id='2'), - invocation_id='test_inv', - ) - - ctx = MagicMock() - ctx._invocation_context = MagicMock() - ctx._invocation_context.invocation_id = 'test_inv' - ctx._invocation_context.session = MagicMock() - ctx._invocation_context.session.events = [event1, event2] - # _scan_child_events reads ctx.node_path to determine the base workflow path. - ctx.node_path = 'wf@1' - - children = wf._scan_child_events(ctx) - - # Assert child 'child' run_id remains '1' (not '2' from the descendant). - assert children[0]['child@1'].run_id == '1' diff --git a/tests/unittests/workflow/test_workflow_node.py b/tests/unittests/workflow/test_workflow_node.py deleted file mode 100644 index 1a81dbf86d..0000000000 --- a/tests/unittests/workflow/test_workflow_node.py +++ /dev/null @@ -1,321 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for @node decorator and behavior.""" - -from __future__ import annotations - -from unittest import mock - -from google.adk.agents.base_agent import BaseAgent -from google.adk.agents.llm_agent import LlmAgent -from google.adk.apps import App -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.tools.base_tool import BaseTool -from google.adk.workflow import FunctionNode -from google.adk.workflow import START -from google.adk.workflow._base_node import BaseNode -from google.adk.workflow._node import node -from google.adk.workflow._node import Node -from google.adk.workflow._parallel_worker import _ParallelWorker as ParallelWorker -from google.adk.workflow._retry_config import RetryConfig -from google.adk.workflow._tool_node import _ToolNode as ToolNode -from google.adk.workflow._workflow import Workflow -from google.genai import types -import pytest - -from .. import testing_utils - -ANY = mock.ANY - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -async def _run_workflow(wf, message="start"): - """Run a Workflow through Runner, return collected events.""" - ss = InMemorySessionService() - runner = Runner(app_name="test", node=wf, session_service=ss) - session = await ss.create_session(app_name="test", user_id="u") - msg = types.Content(parts=[types.Part(text=message)], role="user") - events = [] - async for event in runner.run_async( - user_id="u", session_id=session.id, new_message=msg - ): - events.append(event) - return events, ss, session - - -def _output_by_node(events): - """Extract (node_name_from_path, output) for child node events.""" - results = [] - for e in events: - if e.output is not None and e.node_info.path and "/" in e.node_info.path: - node_name = e.node_info.path.rsplit("/", 1)[-1] - if "@" in node_name: - node_name = node_name.rsplit("@", 1)[0] - results.append((node_name, e.output)) - return results - - -# --------------------------------------------------------------------------- -# Tests -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_node_decorator(): - """Tests that @node decorator can wrap a function and override its name.""" - - @node(name="decorated_node") - def my_func(): - return "Hello from decorated_func" - - assert my_func.name == "decorated_node" - - wf = Workflow( - name="test_agent", - edges=[ - (START, my_func), - ], - ) - events, _, _ = await _run_workflow(wf) - - by_node = _output_by_node(events) - assert ("decorated_node", "Hello from decorated_func") in by_node - - -def test_node_parallel_worker_instance(): - """Tests that node() can wrap a node in ParallelWorker.""" - - @node(parallel_worker=True) - def my_func(node_input): - return node_input - - assert isinstance(my_func, ParallelWorker) - assert my_func.name == "my_func" - - def other_func(x): - return x - - parallel_node = node(other_func, parallel_worker=True) - assert isinstance(parallel_node, ParallelWorker) - assert parallel_node.name == "other_func" - - -@pytest.mark.asyncio -async def test_node_parallel_worker_execution(): - """Tests that a node with parallel_worker=True correctly processes inputs.""" - - @node(parallel_worker=True) - async def my_func(node_input): - return node_input * 2 - - async def producer_func() -> list[int]: - return [1, 2, 3] - - wf = Workflow( - name="test_agent", - edges=[ - (START, producer_func), - (producer_func, my_func), - ], - ) - events, _, _ = await _run_workflow(wf) - - by_node = _output_by_node(events) - assert ("producer_func", [1, 2, 3]) in by_node - assert ("my_func", [2, 4, 6]) in by_node - - -def test_node_decorator_rerun_on_resume(): - """Tests that @node decorator can override rerun_on_resume.""" - - @node(name="decorated_node", rerun_on_resume=True) - def my_func(): - return "Hello from decorated_func" - - assert isinstance(my_func, FunctionNode) - assert my_func.rerun_on_resume - - @node() - def my_func2(): - return "Hello from decorated_func2" - - assert isinstance(my_func2, FunctionNode) - assert not my_func2.rerun_on_resume - - -def test_node_function_with_base_node(): - """Tests that node() function returns a copied node when given a BaseNode.""" - - @node(name="original") - def original(): - pass - - wrapped = node(original, name="overridden", rerun_on_resume=True) - - assert isinstance(wrapped, FunctionNode) - assert wrapped is not original - assert wrapped.name == "overridden" - assert wrapped.rerun_on_resume - - -class MyTool(BaseTool): - name = "tool" - description = "desc" - - async def _run_async_impl(self): - return "done" - - -def test_node_no_unnecessary_wrap(): - """Tests that node() does not wrap LlmAgent, Agent, Tool, or func in OverridingNode.""" - - llm_agent = LlmAgent(name="llm") - llm_node = node(llm_agent, name="overridden_llm") - - assert isinstance(llm_node, LlmAgent) - assert llm_node.name == "overridden_llm" - assert llm_node.mode == "single_turn" - - agent = BaseAgent(name="agent") - agent_node_inst = node(agent, name="overridden_agent", rerun_on_resume=True) - assert isinstance(agent_node_inst, BaseAgent) - assert agent_node_inst.name == "overridden_agent" - assert agent_node_inst.rerun_on_resume - - tool_inst = MyTool(name="tool", description="desc") - t_node = node(tool_inst, name="overridden_tool") - assert isinstance(t_node, ToolNode) - assert t_node.name == "overridden_tool" - - def my_func(): - pass - - f_node = node(my_func, name="overridden_func", rerun_on_resume=True) - assert isinstance(f_node, FunctionNode) - assert f_node.name == "overridden_func" - assert f_node.rerun_on_resume - - -class StatefulTool(BaseTool): - """A tool that modifies state via tool_context.""" - - async def run_async(self, *, args, tool_context): - tool_context.state["tool_key"] = "tool_value" - tool_context.state["tool_count"] = 10 - return {"status": "ok"} - - -from .workflow_testing_utils import simplify_events_with_node - - -@pytest.mark.asyncio -async def test_tool_node_state_delta(): - """Tests that state set via tool_context.state in ToolNode is persisted.""" - - tool_node = ToolNode( - tool=StatefulTool(name="stateful_tool", description="Sets state values"), - ) - - def read_state(tool_key: str, tool_count: int) -> str: - return f"tool_key={tool_key}, tool_count={tool_count}" - - def start_node(): - return {} - - wf = Workflow( - name="test_tool_node_state_delta", - edges=[ - (START, start_node), - (start_node, tool_node), - (tool_node, read_state), - ], - ) - - events, _, _ = await _run_workflow(wf) - - simplified = simplify_events_with_node( - events, include_workflow_output=True, include_state_delta=True - ) - - assert ( - "test_tool_node_state_delta@1/stateful_tool@1", - {"output": {"status": "ok"}}, - ) in [(e[0], {"output": e[1].get("output")}) for e in simplified] - - assert ( - "test_tool_node_state_delta@1/read_state@1", - { - "output": "tool_key=tool_value, tool_count=10", - }, - ) in [(e[0], {"output": e[1].get("output")}) for e in simplified] - - -class _CustomNode(Node): - custom_val: str = "hello" - rerun_on_resume: bool = True - - async def run_node_impl(self, *, ctx, node_input): - yield f"subclass: {self.custom_val} -> {node_input}" - - -def test_node_subclassing_model_copy_preserves_identity(): - """Tests that Node.model_copy preserves the subclass class identity.""" - node_inst = _CustomNode( - name="subclass", parallel_worker=True, custom_val="barrier" - ) - assert node_inst.parallel_worker is True - - cloned = node_inst.model_copy() - assert isinstance(cloned, _CustomNode) - assert cloned.custom_val == "barrier" - assert cloned.parallel_worker is True - assert isinstance(cloned._inner_node, ParallelWorker) - # Confirm inner node wraps a clone of _CustomNode preserving identity! - assert isinstance(cloned._inner_node._node, _CustomNode) - assert cloned._inner_node._node.custom_val == "barrier" - assert cloned._inner_node._node.parallel_worker is False - - -@pytest.mark.asyncio -async def test_node_subclassing_execution_with_parallel_worker(): - """Tests that a subclassed Node with parallel_worker=True executes successfully.""" - subclass_node = _CustomNode( - name="subclass", parallel_worker=True, custom_val="workflow" - ) - - async def producer(): - return ["input1", "input2"] - - wf = Workflow( - name="test_agent", - edges=[ - (START, producer), - (producer, subclass_node), - ], - ) - - events, _, _ = await _run_workflow(wf) - by_node = _output_by_node(events) - - assert ("producer", ["input1", "input2"]) in by_node - assert ( - "subclass", - ["subclass: workflow -> input1", "subclass: workflow -> input2"], - ) in by_node diff --git a/tests/unittests/workflow/test_workflow_node_timeout.py b/tests/unittests/workflow/test_workflow_node_timeout.py deleted file mode 100644 index dc1d9be6e9..0000000000 --- a/tests/unittests/workflow/test_workflow_node_timeout.py +++ /dev/null @@ -1,204 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for node timeout behavior.""" - -from __future__ import annotations - -import asyncio - -from google.adk.apps import App -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.workflow import START -from google.adk.workflow._errors import NodeTimeoutError -from google.adk.workflow._node import node -from google.adk.workflow._retry_config import RetryConfig -from google.adk.workflow._workflow import Workflow -from google.genai import types -import pytest - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - - -async def _run_workflow(wf, message='start'): - """Run a Workflow through Runner, return collected events.""" - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - - session = await ss.create_session(app_name='test', user_id='u') - msg = types.Content(parts=[types.Part(text=message)], role='user') - events = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - return events, ss, session - - -def _output_by_node(events): - """Extract (node_name_from_path, output) for child node events.""" - results = [] - for e in events: - if e.output is not None and e.node_info.path and '/' in e.node_info.path: - node_name = e.node_info.path.rsplit('/', 1)[-1] - if '@' in node_name: - node_name = node_name.rsplit('@', 1)[0] - results.append((node_name, e.output)) - return results - - -# --------------------------------------------------------------------------- -# Tests -# --------------------------------------------------------------------------- - - -@pytest.mark.asyncio -async def test_node_completes_within_timeout(): - """A node that finishes before the timeout should succeed normally.""" - - @node(timeout=5.0) - async def my_slow_node(): - await asyncio.sleep(0.01) - return 'done' - - wf = Workflow( - name='test_workflow', - edges=[ - (START, my_slow_node), - ], - ) - events, _, _ = await _run_workflow(wf) - by_node = _output_by_node(events) - - assert ('my_slow_node', 'done') in by_node - - -@pytest.mark.asyncio -async def test_node_exceeds_timeout(): - """A node that exceeds its timeout should fail.""" - - from google.adk.workflow import FunctionNode - - async def raw_slow_func(): - await asyncio.sleep(1.0) - return 'done' - - my_too_slow_node = FunctionNode( - name='my_too_slow_node', func=raw_slow_func, timeout=0.05 - ) - - wf = Workflow( - name='test_workflow', - edges=[ - (START, my_too_slow_node), - ], - ) - with pytest.raises(NodeTimeoutError) as exc_info: - await _run_workflow(wf) - - assert 'my_too_slow_node' in str(exc_info.value) - - -@pytest.mark.asyncio -async def test_node_no_timeout(): - """A node with timeout=None should run without any time limit.""" - - @node(timeout=None) - async def my_no_timeout_node(): - await asyncio.sleep(0.01) - return 'done' - - wf = Workflow( - name='test_workflow', - edges=[ - (START, my_no_timeout_node), - ], - ) - events, _, _ = await _run_workflow(wf) - by_node = _output_by_node(events) - - assert ('my_no_timeout_node', 'done') in by_node - - -@pytest.mark.asyncio -async def test_node_timeout_with_retry(): - """A timed-out node should be retried if retry_config is set.""" - run_count = 0 - - @node( - timeout=0.05, - retry_config=RetryConfig(max_attempts=3, initial_delay=0.0, jitter=0.0), - ) - async def node_a(): - nonlocal run_count - run_count += 1 - if run_count == 1: - await asyncio.sleep(1.0) - return 'success' - - wf = Workflow( - name='test_workflow', - edges=[ - (START, node_a), - ], - ) - events, _, _ = await _run_workflow(wf) - - by_node = _output_by_node(events) - # Verify that the final result was successfully obtained. - assert ('node_a', 'success') in by_node - - # Verify that the node was actually executed more than once (i.e., retried). - assert run_count == 2, f'Expected run_count == 2, got {run_count}' - - -@pytest.mark.asyncio -async def test_nested_workflow_timeout(): - """A nested workflow that exceeds its timeout in the outer workflow should fail. - - Setup: outer_wf -> inner_wf -> slow_node. inner_wf has timeout=0.05. - Act: Run the outer workflow. - Assert: Execution raises NodeTimeoutError referencing inner_wf. - """ - import sys - - if sys.version_info < (3, 11): - pytest.skip('asyncio.timeout requires Python 3.11+') - - # Given an outer workflow containing a slow inner workflow with a timeout - @node() - async def slow_node(): - await asyncio.sleep(1.0) - return 'done' - - inner_wf = Workflow( - name='inner_wf', - edges=[(START, slow_node)], - timeout=0.05, - ) - - outer_wf = Workflow( - name='outer_wf', - edges=[(START, inner_wf)], - ) - - # When the outer workflow is executed - # Then it should raise NodeTimeoutError referencing the inner workflow - with pytest.raises(NodeTimeoutError) as exc_info: - await _run_workflow(outer_wf) - - assert 'inner_wf' in str(exc_info.value) diff --git a/tests/unittests/workflow/test_workflow_output_deduplication.py b/tests/unittests/workflow/test_workflow_output_deduplication.py deleted file mode 100644 index 22ca7440a1..0000000000 --- a/tests/unittests/workflow/test_workflow_output_deduplication.py +++ /dev/null @@ -1,161 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for nested workflow output event deduplication. - -Verifies that nested workflows produce only leaf terminal events and -resolve output via terminal path resolution from the graph structure. -""" - -from typing import Any - -from google.adk.apps.app import App -from google.adk.events.event import Event -from google.adk.workflow._workflow import Workflow -import pytest - -from . import testing_utils - - -def _is_checkpoint(event: Event) -> bool: - """Returns True if event is an agent state checkpoint or end_of_agent.""" - if event.actions.agent_state is not None: - return True - if event.actions.end_of_agent: - return True - return False - - -def _output_events(events: list[Event]) -> list[Event]: - """Returns only events with output data (not checkpoint/state).""" - return [e for e in events if not _is_checkpoint(e) and e.output is not None] - - -async def test_two_level_nesting_deduplicates( - request, -): - """Two-level nesting emits only the leaf's output event, not finalize events. - - Setup: outer → inner → leaf. - Assert: exactly 1 output event from 'outer/inner/leaf', no - duplicate finalize events from inner or outer. - """ - - async def leaf(node_input: Any): - return 'leaf_data' - - inner = Workflow(name='inner', edges=[('START', leaf)]) - outer = Workflow(name='outer', edges=[('START', inner)]) - - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('hi')) - out_events = _output_events(events) - - assert len(out_events) == 1 - assert out_events[0].output == 'leaf_data' - assert out_events[0].node_info.path == 'outer@1/inner@1/leaf@1' - - -async def test_nested_with_output_schema_validates_at_read_time( - request, -): - """Nested workflow with output_schema validates without emitting extra events. - - Setup: outer → inner(output_schema=str) → leaf. - Assert: 1 output event with validated data, no extra finalize event. - """ - - async def leaf(node_input: Any): - return 'raw_data' - - inner = Workflow( - name='inner', - edges=[('START', leaf)], - output_schema=str, - ) - outer = Workflow(name='outer', edges=[('START', inner)]) - - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('hi')) - out_events = _output_events(events) - - assert len(out_events) == 1 - assert out_events[0].output == 'raw_data' - - -async def test_multiple_terminals_in_nested_workflow_raises( - request, -): - """Fan-out with no join raises ValueError for multiple terminal outputs. - - Setup: outer → inner → (branch_a, branch_b). - Assert: ValueError because inner has two terminal nodes producing output. - """ - - async def branch_a(node_input: Any): - return 'a_out' - - async def branch_b(node_input: Any): - return 'b_out' - - inner = Workflow( - name='inner', - edges=[('START', (branch_a, branch_b))], - ) - outer = Workflow(name='outer', edges=[('START', inner)]) - - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - - with pytest.raises(ValueError, match='multiple terminal nodes'): - await runner.run_async(testing_utils.get_user_content('hi')) - - -async def test_non_terminal_output_not_exposed_as_workflow_output( - request, -): - """Downstream node receives terminal output, not intermediate node output. - - Setup: outer → inner(step_a → step_b) → consume. - Assert: consume receives step_b's 'final' (terminal), not step_a's - 'intermediate'. - """ - - async def step_a(node_input: Any): - return 'intermediate' - - async def step_b(node_input: str): - return 'final' - - inner = Workflow(name='inner', edges=[('START', step_a, step_b)]) - - async def consume(node_input: str): - return f'got: {node_input}' - - outer = Workflow(name='outer', edges=[('START', inner, consume)]) - - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('hi')) - out_events = _output_events(events) - - consume_events = [ - e - for e in out_events - if e.node_info.name and e.node_info.name.split('@')[0] == 'consume' - ] - assert len(consume_events) == 1 - assert consume_events[0].output == 'got: final' diff --git a/tests/unittests/workflow/test_workflow_parallel_worker.py b/tests/unittests/workflow/test_workflow_parallel_worker.py deleted file mode 100644 index baad9c7a44..0000000000 --- a/tests/unittests/workflow/test_workflow_parallel_worker.py +++ /dev/null @@ -1,1092 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import asyncio -from typing import Any -from typing import AsyncGenerator - -from google.adk.agents.context import Context -from google.adk.apps.app import App -from google.adk.apps.app import ResumabilityConfig -from google.adk.events.event import Event -from google.adk.workflow import BaseNode -from google.adk.workflow import START -from google.adk.workflow._node import node -from google.adk.workflow._parallel_worker import _ParallelWorker as ParallelWorker -from google.adk.workflow._workflow import Workflow -from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids -from google.adk.workflow.utils._workflow_hitl_utils import has_request_input_function_call -from google.genai import types -from pydantic import ConfigDict -from pydantic import Field -import pytest -from typing_extensions import override - -from . import testing_utils -from .workflow_testing_utils import simplify_events_with_node - - -class _ProducerNode(BaseNode): - """A node that produces a list of items.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - - items: list[Any] = Field(default_factory=list) - name: str = Field(default='Producer') - - def __init__(self, items: list[Any], name: str = 'Producer'): - super().__init__() - object.__setattr__(self, 'items', items) - object.__setattr__(self, 'name', name) - - @override - async def run( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(output=self.items) - - -class _SingleItemProducerNode(BaseNode): - """A node that produces a single item.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - - item: Any = None - name: str = Field(default='Producer') - - def __init__(self, item: Any, name: str = 'Producer'): - super().__init__() - object.__setattr__(self, 'item', item) - object.__setattr__(self, 'name', name) - - @override - async def run( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield Event(output=self.item) - - -class _WorkerNode(BaseNode): - """A node that processes an item, with an optional delay.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - - name: str = Field(default='Worker') - - def __init__(self, name: str = 'Worker'): - super().__init__() - object.__setattr__(self, 'name', name) - - @override - async def run( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if isinstance(node_input, dict) and 'delay' in node_input: - await asyncio.sleep(node_input['delay']) - val = node_input['val'] - else: - val = node_input - yield Event(output=f'{val}_processed') - - -@pytest.mark.asyncio -async def test_parallel_worker_processes_list_ordered( - request: pytest.FixtureRequest, -): - """ParallelWorker processes a list of items and returns ordered results.""" - # Given a workflow with a producer and a parallel worker. - # Delays are used to ensure deterministic output order and prevent race conditions in event ordering. - items = [{'val': 'item1', 'delay': 0}, {'val': 'item2', 'delay': 0.1}] - node_a = _ProducerNode(items=items, name='NodeA') - worker = ParallelWorker(node=_WorkerNode(name='Worker')) - - agent = Workflow( - name='test_agent', - edges=[ - (START, node_a), - (node_a, worker), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When the workflow is run - events = await runner.run_async(testing_utils.get_user_content('start')) - - # Then results should be ordered and match expected events - simplified_events = simplify_events_with_node(events) - - assert simplified_events == [ - ( - 'test_agent@1/NodeA@1', - { - 'output': [ - {'val': 'item1', 'delay': 0}, - {'val': 'item2', 'delay': 0.1}, - ], - }, - ), - ( - 'test_agent@1/Worker@1/Worker@1', - {'output': 'item1_processed'}, - ), - ( - 'test_agent@1/Worker@1/Worker@2', - {'output': 'item2_processed'}, - ), - ( - 'test_agent@1/Worker@1', - { - 'output': ['item1_processed', 'item2_processed'], - }, - ), - ] - - -@pytest.mark.asyncio -async def test_parallel_worker_with_empty_input_returns_empty_list( - request: pytest.FixtureRequest, -): - """ParallelWorker with empty input returns an empty list.""" - # Given a workflow with a producer yielding empty list - items = [] - node_a = _ProducerNode(items=items, name='NodeA') - worker = ParallelWorker(node=_WorkerNode(name='Worker')) - - agent = Workflow( - name='test_empty_agent', - edges=[ - (START, node_a), - (node_a, worker), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When the workflow is run - events = await runner.run_async(testing_utils.get_user_content('start')) - - # Then output aggregator should return empty list - simplified_events = simplify_events_with_node(events) - - assert simplified_events == [ - ( - 'test_empty_agent@1/NodeA@1', - { - 'output': [], - }, - ), - ( - 'test_empty_agent@1/Worker@1', - { - 'output': [], - }, - ), - ] - - -@pytest.mark.asyncio -async def test_parallel_worker_wraps_single_item_in_list( - request: pytest.FixtureRequest, -): - """ParallelWorker wraps a single non-list item into a one-element list.""" - # Given a workflow with a producer yielding a single item (not a list) - item = {'val': 'item1', 'delay': 0} - node_a = _SingleItemProducerNode(item=item, name='NodeA') - worker = ParallelWorker(node=_WorkerNode(name='Worker')) - - agent = Workflow( - name='test_single_item_agent', - edges=[ - (START, node_a), - (node_a, worker), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When the workflow is run - events = await runner.run_async(testing_utils.get_user_content('start')) - - # Then it should be wrapped and processed as a single-element list - simplified_events = simplify_events_with_node(events) - - assert simplified_events == [ - ( - 'test_single_item_agent@1/NodeA@1', - { - 'output': {'val': 'item1', 'delay': 0}, - }, - ), - ( - 'test_single_item_agent@1/Worker@1/Worker@1', - {'output': 'item1_processed'}, - ), - ( - 'test_single_item_agent@1/Worker@1', - { - 'output': ['item1_processed'], - }, - ), - ] - - -async def _worker_func(node_input: dict[str, Any]) -> AsyncGenerator[Any, None]: - if isinstance(node_input, dict) and 'delay' in node_input: - await asyncio.sleep(node_input['delay']) - val = node_input['val'] - else: - val = node_input - yield f'{val}_processed' - - -@pytest.mark.asyncio -async def test_parallel_worker_accepts_plain_function( - request: pytest.FixtureRequest, -): - """ParallelWorker accepts a plain function as the wrapped node.""" - # Given a workflow with a producer and a parallel worker wrapping a function - items = [{'val': 'item1', 'delay': 0}, {'val': 'item2', 'delay': 0.1}] - node_a = _ProducerNode(items=items, name='NodeA') - worker = ParallelWorker(node=_worker_func) - - agent = Workflow( - name='test_agent', - edges=[ - (START, node_a), - (node_a, worker), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When the workflow is run - events = await runner.run_async(testing_utils.get_user_content('start')) - - # Then it should process items correctly - simplified_events = simplify_events_with_node(events) - - assert simplified_events == [ - ( - 'test_agent@1/NodeA@1', - { - 'output': [ - {'val': 'item1', 'delay': 0}, - {'val': 'item2', 'delay': 0.1}, - ], - }, - ), - ( - 'test_agent@1/_worker_func@1/_worker_func@1', - { - 'output': 'item1_processed', - }, - ), - ( - 'test_agent@1/_worker_func@1/_worker_func@2', - { - 'output': 'item2_processed', - }, - ), - ( - 'test_agent@1/_worker_func@1', - { - 'output': ['item1_processed', 'item2_processed'], - }, - ), - ] - - -@pytest.mark.asyncio -async def test_parallel_worker_failure_propagates_and_cancels_others( - request: pytest.FixtureRequest, -): - """One worker failure cancels remaining workers and propagates the exception. - - Setup: 3 items — task-1 completes fast, task-2 fails after delay, - task-3 is slow. - Assert: - - task-1 finishes before the failure. - - task-2's ValueError propagates to the runner. - - task-3 is cancelled (never finishes). - """ - # Given a worker that fails on task-2 - items = ['task-1', 'task-2', 'task-3'] - node_a = _ProducerNode(items=items, name='NodeA') - - tracker = {} - task_3_done_cancelled = False - - async def _worker_failable_func(node_input: str) -> AsyncGenerator[Any, None]: - if node_input == 'task-1': - yield f'{node_input}_processed' - elif node_input == 'task-2': - await asyncio.sleep(0.05) - raise ValueError(f'{node_input} failed') - elif node_input == 'task-3': - try: - await asyncio.sleep(0.1) - except asyncio.CancelledError: - nonlocal task_3_done_cancelled - task_3_done_cancelled = True - raise - yield f'{node_input}_processed' - - tracker[node_input] = True - - worker = ParallelWorker(node=_worker_failable_func) - - agent = Workflow( - name='test_agent_fail', - edges=[ - (START, node_a), - (node_a, worker), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - events = [] - - # When running the agent, expect it to raise the worker exception - with pytest.raises(ValueError, match='task-2 failed'): - async for event in runner.runner.run_async( - user_id=runner.session.user_id, - session_id=runner.session.id, - new_message=testing_utils.get_user_content('start'), - ): - events.append(event) - - # Then assert that the error was captured in an event and state is correct - assert any( - event.error_code == 'ValueError' - and event.error_message == 'task-2 failed' - for event in events - ) - assert tracker == {'task-1': True} - assert task_3_done_cancelled - - simplified_events = simplify_events_with_node(events) - - assert simplified_events == [ - ( - 'test_agent_fail@1/NodeA@1', - { - 'output': ['task-1', 'task-2', 'task-3'], - }, - ), - ( - 'test_agent_fail@1/_worker_failable_func@1/_worker_failable_func@1', - { - 'output': 'task-1_processed', - }, - ), - ] - - -class _HitlWorkerNode(BaseNode): - """A worker node that can request human input.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - - rerun_on_resume: bool = Field(default=True) - name: str = Field(default='Worker') - - def __init__(self, name: str = 'Worker'): - super().__init__() - object.__setattr__(self, 'name', name) - - @override - def get_name(self) -> str: - return self.name - - @override - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - val = node_input['val'] - ask = node_input['ask'] - - if ask: - interrupt_id = f'req_{val}' - if resume_input := ctx.resume_inputs.get(interrupt_id): - yield Event(output=f"{val}_{resume_input['text']}") - else: - yield RequestInput( - interrupt_id=interrupt_id, message=f'Input for {val}' - ) - else: - yield Event(output=f'{val}_processed') - - -@pytest.mark.asyncio -@pytest.mark.xfail(reason='ctx.run_node needs barrier for parallel HITL') -async def test_parallel_worker_pauses_for_human_input( - request: pytest.FixtureRequest, -): - """Worker requesting input pauses the workflow; resume completes all workers. - - Setup: 2 items — item1 completes, item2 requests input. - Act: - - Run 1: item1 completes, item2 interrupts. - - Run 2: resume item2 with FR. - Assert: - - Run 1: item1 output emitted, RequestInput for item2. - - Run 2: item2 output emitted, parent returns full list. - """ - # Given a workflow with a worker that requests input for item2 - items = [{'val': 'item1', 'ask': False}, {'val': 'item2', 'ask': True}] - node_a = _ProducerNode(items=items, name='NodeA') - worker = ParallelWorker(node=_HitlWorkerNode(name='Worker')) - - agent = Workflow( - name='parallel_worker_hitl_agent', - edges=[ - (START, node_a), - (node_a, worker), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When the workflow is run for the first time - events1 = await runner.run_async(testing_utils.get_user_content('start')) - - # Then item1 should complete and item2 should interrupt - req_events = [e for e in events1 if has_request_input_function_call(e)] - assert len(req_events) == 1 - interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] - assert interrupt_id == 'req_item2' - invocation_id = events1[0].invocation_id - - simplified_events1 = simplify_events_with_node(events1) - assert simplified_events1 == [ - ( - 'parallel_worker_hitl_agent@1/NodeA@1', - { - 'output': [ - {'val': 'item1', 'ask': False}, - {'val': 'item2', 'ask': True}, - ], - }, - ), - ( - 'parallel_worker_hitl_agent@1/Worker@1', - {'output': 'item1_processed'}, - ), - ( - 'parallel_worker_hitl_agent', - testing_utils.simplify_content(req_events[0].content), - ), - ] - - # When resuming with human input for item2 - user_input = types.Part( - function_response=types.FunctionResponse( - id=interrupt_id, - name='user_input', - response={'text': 'resumed'}, - ) - ) - events2 = await runner.run_async( - new_message=testing_utils.UserContent(user_input), - invocation_id=invocation_id, - ) - - # Then item2 should complete and the full list should be returned - simplified_events2 = simplify_events_with_node(events2) - - assert simplified_events2 == [ - ( - 'parallel_worker_hitl_agent@1/Worker@1', - {'output': 'item2_resumed'}, - ), - ( - 'parallel_worker_hitl_agent@1/Worker@1', - { - 'output': ['item1_processed', 'item2_resumed'], - }, - ), - ] - - -class _AsyncWorkerNode(BaseNode): - """A worker node that waits for an asyncio event before processing an item.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - - name: str = Field(default='Worker') - events: dict[str, asyncio.Event] = Field(default_factory=dict) - - def __init__( - self, - name: str = 'Worker', - events: dict[str, asyncio.Event] | None = None, - ): - super().__init__() - object.__setattr__(self, 'name', name) - object.__setattr__(self, 'events', events or {}) - - @override - def get_name(self) -> str: - return self.name - - @override - async def run( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - if node_input in self.events: - await self.events[node_input].wait() - yield Event(output=f'{node_input}_res') - - -@pytest.mark.asyncio -async def test_parallel_worker_preserves_input_order_regardless_of_completion_order( - request: pytest.FixtureRequest, -): - """Final output list preserves input order regardless of worker completion order.""" - # Given items and events to control completion order - item1 = 'item1' - item2 = 'item2' - events_map = { - item1: asyncio.Event(), - item2: asyncio.Event(), - } - - node_a = _ProducerNode(items=[item1, item2], name='NodeA') - worker = ParallelWorker( - node=_AsyncWorkerNode(name='Worker', events=events_map) - ) - - agent = Workflow( - name='out_of_order_agent', - edges=[ - (START, node_a), - (node_a, worker), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When running the workflow (starting in background) - run_task = asyncio.create_task( - runner.run_async(testing_utils.get_user_content('start')) - ) - - # Allow the runner to reach the wait point. - await asyncio.sleep(0.1) - - # Finish item2 first - events_map[item2].set() - await asyncio.sleep(0.1) - - # Finish item1 second - events_map[item1].set() - - events = await run_task - - # Then output should preserve input order - simplified_events = simplify_events_with_node(events) - - assert simplified_events == [ - ( - 'out_of_order_agent@1/NodeA@1', - {'output': [item1, item2]}, - ), - ( - 'out_of_order_agent@1/Worker@1/Worker@2', - {'output': 'item2_res'}, - ), - ( - 'out_of_order_agent@1/Worker@1/Worker@1', - {'output': 'item1_res'}, - ), - ( - 'out_of_order_agent@1/Worker@1', - {'output': ['item1_res', 'item2_res']}, - ), - ] - - -@pytest.mark.asyncio -async def test_parallel_worker_can_wrap_nested_workflow( - request: pytest.FixtureRequest, -): - """Nested Workflow wrapped in ParallelWorker processes items through its graph.""" - # Given a workflow wrapping a nested workflow in ParallelWorker - items = ['item1', 'item2'] - node_a = _ProducerNode(items=items, name='NodeA') - - async def worker_func(node_input: Any): - return f'{node_input}_processed' - - nested_agent = Workflow( - name='nested_agent', - edges=[(START, worker_func)], - ) - - parallel_nested = node(nested_agent, parallel_worker=True) - - outer_agent = Workflow( - name='outer_agent', - edges=[ - (START, node_a), - (node_a, parallel_nested), - ], - ) - app = App( - name=request.function.__name__, - root_agent=outer_agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When the workflow is run - events = await runner.run_async(testing_utils.get_user_content('start')) - - # Then results should be processed by the nested workflow - simplified_events = simplify_events_with_node(events) - - assert simplified_events == [ - ( - 'outer_agent@1/NodeA@1', - { - 'output': ['item1', 'item2'], - }, - ), - ( - 'outer_agent@1/nested_agent@1/nested_agent@1/worker_func@1', - {'output': 'item1_processed'}, - ), - ( - 'outer_agent@1/nested_agent@1/nested_agent@2/worker_func@1', - {'output': 'item2_processed'}, - ), - ( - 'outer_agent@1/nested_agent@1', - { - 'output': [ - 'item1_processed', - 'item2_processed', - ], - }, - ), - ] - - -@pytest.mark.asyncio -@pytest.mark.xfail(reason='New Workflow has no parallel_worker field') -async def test_workflow_auto_wraps_parallel_worker_when_flag_set( - request: pytest.FixtureRequest, -): - """Workflow with parallel_worker=True auto-wraps in ParallelWorker.""" - - # Given a nested workflow with parallel_worker=True - async def producer_func(): - return ['item1', 'item2'] - - async def worker_func(node_input: Any): - return f'{node_input}_processed' - - nested_agent = Workflow( - name='nested_agent', - edges=[('START', worker_func)], - parallel_worker=True, - ) - - outer_agent = Workflow( - name='outer_agent', - edges=[ - ('START', producer_func), - (producer_func, nested_agent), - ], - ) - - app = App( - name=request.function.__name__, - root_agent=outer_agent, - ) - runner = testing_utils.InMemoryRunner(app=app) - - # When the workflow is run - events = await runner.run_async(testing_utils.get_user_content('start')) - - # Then it should process items in parallel - simplified_events = simplify_events_with_node(events) - - assert simplified_events == [ - ( - 'outer_agent@1/producer_func@1', - { - 'output': ['item1', 'item2'], - }, - ), - ( - 'nested_agent@1/worker_func@1', - {'output': 'item1_processed'}, - ), - ( - 'nested_agent@1/worker_func@1', - {'output': 'item2_processed'}, - ), - ( - 'outer_agent@1/nested_agent@1', - { - 'output': [ - 'item1_processed', - 'item2_processed', - ], - }, - ), - ] - - -@pytest.mark.asyncio -async def test_parallel_worker_limits_concurrency( - request: pytest.FixtureRequest, -): - """max_concurrency limits the number of concurrent workers at any time.""" - # Given items and events to control concurrency - items = ['item1', 'item2', 'item3', 'item4'] - started_events = {item: asyncio.Event() for item in items} - finish_events = {item: asyncio.Event() for item in items} - - async def _concurrency_worker_func( - node_input: str, - ) -> AsyncGenerator[Any, None]: - started_events[node_input].set() - await finish_events[node_input].wait() - yield f'{node_input}_processed' - - node_a = _ProducerNode(items=items, name='NodeA') - worker = ParallelWorker(node=_concurrency_worker_func, max_concurrency=2) - - agent = Workflow( - name='max_concurrency_agent', - edges=[ - (START, node_a), - (node_a, worker), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - events = [] - - async def _run_agent(): - async for event in runner.runner.run_async( - user_id=runner.session.user_id, - session_id=runner.session.id, - new_message=testing_utils.get_user_content('start'), - ): - events.append(event) - - # When running the agent (starting in background) - run_task = asyncio.create_task(_run_agent()) - - # Then verify that initially only two workers are started - await asyncio.gather( - started_events['item1'].wait(), - started_events['item2'].wait(), - ) - - assert started_events['item1'].is_set() - assert started_events['item2'].is_set() - assert not started_events['item3'].is_set() - assert not started_events['item4'].is_set() - - # Signal second worker to finish - finish_events['item2'].set() - - # Check that the next worker (third one) is scheduled - await started_events['item3'].wait() - assert started_events['item3'].is_set() - assert not started_events['item4'].is_set() - - # Signal the third worker to be finished. Check 4th worker is scheduled - finish_events['item3'].set() - await started_events['item4'].wait() - assert started_events['item4'].is_set() - - # Finish all workers, and assert the workflow finishes - finish_events['item1'].set() - finish_events['item4'].set() - - await run_task - - simplified_events = simplify_events_with_node(events) - - assert simplified_events == [ - ( - 'max_concurrency_agent@1/NodeA@1', - {'output': items}, - ), - ( - 'max_concurrency_agent@1/_concurrency_worker_func@1/_concurrency_worker_func@2', - { - 'output': 'item2_processed', - }, - ), - ( - 'max_concurrency_agent@1/_concurrency_worker_func@1/_concurrency_worker_func@3', - { - 'output': 'item3_processed', - }, - ), - ( - 'max_concurrency_agent@1/_concurrency_worker_func@1/_concurrency_worker_func@1', - { - 'output': 'item1_processed', - }, - ), - ( - 'max_concurrency_agent@1/_concurrency_worker_func@1/_concurrency_worker_func@4', - { - 'output': 'item4_processed', - }, - ), - ( - 'max_concurrency_agent@1/_concurrency_worker_func@1', - { - 'output': [ - 'item1_processed', - 'item2_processed', - 'item3_processed', - 'item4_processed', - ], - }, - ), - ] - - -@pytest.mark.asyncio -@pytest.mark.skip(reason='Hangs: ctx.run_node needs barrier for parallel HITL') -async def test_parallel_worker_hitl_respects_concurrency_limits( - request: pytest.FixtureRequest, -): - """HITL resume under max_concurrency schedules next worker after resolution. - - Setup: 3 items, max_concurrency=2. item1 waits, item2 does HITL, - item3 does HITL. - Act: - - Run 1: item1 and item2 start. item2 interrupts. Signal item1 to finish. - - Run 2: resume item2. item3 starts and interrupts. - - Run 3: resume item3. All complete. - Assert: - - Run 1: item2 RequestInput, item1 output. - - Run 2: item2 output, item3 RequestInput. - - Run 3: item3 output, parent returns full list. - """ - # Given items and events to control concurrency and HITL - items = [ - {'val': 'item1', 'ask': False}, - {'val': 'item2', 'ask': True}, - {'val': 'item3', 'ask': True}, - ] - started_events = {item['val']: asyncio.Event() for item in items} - finish_events = {item['val']: asyncio.Event() for item in items} - - @node(name='Worker', rerun_on_resume=True) - async def hitl_concurrency_worker( - ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - val = node_input['val'] - ask = node_input['ask'] - - started_events[val].set() - - if ask: - interrupt_id = f'req_{val}' - if resume_input := ctx.resume_inputs.get(interrupt_id): - yield Event(output=f"{val}_{resume_input['text']}") - else: - yield RequestInput( - interrupt_id=interrupt_id, message=f'Input for {val}' - ) - else: - await finish_events[val].wait() - yield Event(output=f'{val}_processed') - - node_a = _ProducerNode(items=items, name='NodeA') - worker = ParallelWorker(node=hitl_concurrency_worker, max_concurrency=2) - - agent = Workflow( - name='max_concurrency_hitl_agent', - edges=[ - (START, node_a), - (node_a, worker), - ], - ) - app = App( - name=request.function.__name__, - root_agent=agent, - resumability_config=ResumabilityConfig(is_resumable=True), - ) - runner = testing_utils.InMemoryRunner(app=app) - - events = [] - - # When running the agent for the first time - run_task = asyncio.create_task( - runner.run_async(testing_utils.get_user_content('start')) - ) - - # Then Node 1 and Node 2 should start - await asyncio.gather( - started_events['item1'].wait(), - started_events['item2'].wait(), - ) - - assert started_events['item1'].is_set() - assert started_events['item2'].is_set() - assert not started_events['item3'].is_set() - - # Signal node 1 to finish - finish_events['item1'].set() - - events1 = await run_task - events.extend(events1) - - req_events = [e for e in events1 if has_request_input_function_call(e)] - assert len(req_events) == 1 - interrupt_id_2 = get_request_input_interrupt_ids(req_events[0])[0] - assert interrupt_id_2 == 'req_item2' - invocation_id_1 = events1[0].invocation_id - - simplified_events1 = simplify_events_with_node(events1) - assert simplified_events1 == [ - ( - 'max_concurrency_hitl_agent@1/NodeA@1', - { - 'output': items, - }, - ), - ( - 'max_concurrency_hitl_agent', - testing_utils.simplify_content(req_events[0].content), - ), - ( - 'max_concurrency_hitl_agent@1/Worker__0@1', - {'output': 'item1_processed'}, - ), - ] - - # When resuming Node 2 - user_input_2 = types.Part( - function_response=types.FunctionResponse( - id=interrupt_id_2, - name='user_input', - response={'text': 'resumed'}, - ) - ) - - run_task_2 = asyncio.create_task( - runner.run_async( - new_message=testing_utils.UserContent(user_input_2), - invocation_id=invocation_id_1, - ) - ) - - # Then node 3 should start and yield RequestInput - await asyncio.sleep(0.1) - await started_events['item3'].wait() - assert started_events['item3'].is_set() - - events2 = await run_task_2 - events.extend(events2) - - req_events_2 = [e for e in events2 if has_request_input_function_call(e)] - assert len(req_events_2) == 1 - interrupt_id_3 = get_request_input_interrupt_ids(req_events_2[0])[0] - assert interrupt_id_3 == 'req_item3' - invocation_id_2 = events2[0].invocation_id - - simplified_events2 = simplify_events_with_node(events2) - assert simplified_events2 == [ - ( - 'max_concurrency_hitl_agent@1/Worker__1@1', - {'output': 'item2_resumed'}, - ), - ( - 'max_concurrency_hitl_agent', - testing_utils.simplify_content(req_events_2[0].content), - ), - ] - - # When resuming Node 3 - user_input_3 = types.Part( - function_response=types.FunctionResponse( - id=interrupt_id_3, - name='user_input', - response={'text': 'resumed'}, - ) - ) - - run_task_3 = asyncio.create_task( - runner.run_async( - new_message=testing_utils.UserContent(user_input_3), - invocation_id=invocation_id_2, - ) - ) - - events3 = await run_task_3 - events.extend(events3) - - # Then all should complete - simplified_events3 = simplify_events_with_node(events3) - - assert simplified_events3 == [ - ( - 'max_concurrency_hitl_agent@1/Worker__2@1', - {'output': 'item3_resumed'}, - ), - ( - 'max_concurrency_hitl_agent@1/Worker@1', - { - 'output': ['item1_processed', 'item2_resumed', 'item3_resumed'], - }, - ), - ] diff --git a/tests/unittests/workflow/test_workflow_routes.py b/tests/unittests/workflow/test_workflow_routes.py deleted file mode 100644 index c3869223d1..0000000000 --- a/tests/unittests/workflow/test_workflow_routes.py +++ /dev/null @@ -1,654 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Testings for the Workflow routes.""" - -from typing import Any -from typing import Dict - -from google.adk.agents.context import Context -from google.adk.apps.app import App -from google.adk.workflow import Edge -from google.adk.workflow import START -from google.adk.workflow._graph import DEFAULT_ROUTE -from google.adk.workflow._graph import Graph -from google.adk.workflow._join_node import JoinNode -from google.adk.workflow._workflow import Workflow -import pytest - -from .. import testing_utils -from .workflow_testing_utils import create_parent_invocation_context -from .workflow_testing_utils import simplify_events_with_node -from .workflow_testing_utils import TestingNode - - -@pytest.mark.asyncio -async def test_run_async_with_edge_routes(request: pytest.FixtureRequest): - route_holder = {'route': 'route_b'} - - def dynamic_router(ctx: Context, node_input: Any): - return route_holder['route'] - - node_a = TestingNode(name='NodeA', output='A', route=dynamic_router) - node_b = TestingNode(name='NodeB', output='B') - node_c = TestingNode(name='NodeC', output='C') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge( - from_node=node_a, - to_node=node_b, - route='route_b', - ), - Edge( - from_node=node_a, - to_node=node_c, - route='route_c', - ), - ], - ) - agent = Workflow( - name='test_workflow_agent', - graph=graph, - ) - - # Test case for route_b - route_holder['route'] = 'route_b' - app = App(name=request.function.__name__ + '_b', root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events_b = await runner.run_async(testing_utils.get_user_content('start')) - assert simplify_events_with_node(events_b) == [ - ('test_workflow_agent@1/NodeA@1', {'output': 'A'}), - ('test_workflow_agent@1/NodeB@1', {'output': 'B'}), - ] - - # Test case for route_c - route_holder['route'] = 'route_c' - app_c = App(name=request.function.__name__ + '_c', root_agent=agent) - runner_c = testing_utils.InMemoryRunner(app=app_c) - events_c = await runner_c.run_async(testing_utils.get_user_content('start')) - assert simplify_events_with_node(events_c) == [ - ('test_workflow_agent@1/NodeA@1', {'output': 'A'}), - ('test_workflow_agent@1/NodeC@1', {'output': 'C'}), - ] - - -@pytest.mark.asyncio -async def test_output_route_int(request: pytest.FixtureRequest): - node_a = TestingNode(name='NodeA', route=1) - node_b = TestingNode(name='NodeB', output='B') - node_c = TestingNode(name='NodeC', output='C') - agent = Workflow( - name='test_workflow_agent_route_int', - edges=[ - (START, node_a), - (node_a, {1: node_b, 2: node_c}), - ], - ) - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_route_int@1/NodeA@1', - {'output': None}, - ), - ( - 'test_workflow_agent_route_int@1/NodeB@1', - {'output': 'B'}, - ), - ] - - -@pytest.mark.asyncio -async def test_output_route_bool(request: pytest.FixtureRequest): - node_a = TestingNode(name='NodeA', route=True) - node_b = TestingNode(name='NodeB', output='B') - node_c = TestingNode(name='NodeC', output='C') - agent = Workflow( - name='test_workflow_agent_route_bool', - edges=[ - (START, node_a), - (node_a, {True: node_b, False: node_c}), - ], - ) - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_route_bool@1/NodeA@1', - {'output': None}, - ), - ( - 'test_workflow_agent_route_bool@1/NodeB@1', - {'output': 'B'}, - ), - ] - - -@pytest.mark.asyncio -async def test_output_route_no_data(request: pytest.FixtureRequest): - node_a = TestingNode(name='NodeA', route='route_b') - node_b = TestingNode(name='NodeB', output='B') - node_c = TestingNode(name='NodeC', output='C') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge( - from_node=node_a, - to_node=node_b, - route='route_b', - ), - Edge( - from_node=node_a, - to_node=node_c, - route='route_c', - ), - ], - ) - agent = Workflow( - name='test_workflow_agent_route_no_data', - graph=graph, - ) - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - assert simplify_events_with_node(events) == [ - ( - 'test_workflow_agent_route_no_data@1/NodeA@1', - {'output': None}, - ), - ( - 'test_workflow_agent_route_no_data@1/NodeB@1', - {'output': 'B'}, - ), - ] - - -@pytest.mark.asyncio -async def test_run_async_with_list_of_routes(request: pytest.FixtureRequest): - node_a = TestingNode(name='NodeA', output='A', route=['route_b', 'route_c']) - node_b = TestingNode(name='NodeB', output='B') - node_c = TestingNode(name='NodeC', output='C') - node_d = TestingNode(name='NodeD', output='D') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge( - from_node=node_a, - to_node=node_b, - route='route_b', - ), - Edge( - from_node=node_a, - to_node=node_c, - route='route_c', - ), - Edge( - from_node=node_a, - to_node=node_d, - route='route_d', - ), - ], - ) - agent = Workflow( - name='test_workflow_agent_list_routes', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - simplified_events = simplify_events_with_node(events) - - assert len(simplified_events) == 3 - assert simplified_events[0] == ( - 'test_workflow_agent_list_routes@1/NodeA@1', - {'output': 'A'}, - ) - - # Check that the other two events are from NodeB and NodeC, in any order. - other_events = simplified_events[1:] - expected_other_events = [ - ( - 'test_workflow_agent_list_routes@1/NodeB@1', - {'output': 'B'}, - ), - ( - 'test_workflow_agent_list_routes@1/NodeC@1', - {'output': 'C'}, - ), - ] - assert len(other_events) == len(expected_other_events) - assert all(item in other_events for item in expected_other_events) - - -@pytest.mark.asyncio -async def test_run_async_with_default_route(request: pytest.FixtureRequest): - node_a = TestingNode(name='NodeA', output='A', route='unmatched_route') - node_b = TestingNode(name='NodeB', output='B') - node_c = TestingNode(name='NodeC', output='C') - node_d = TestingNode(name='NodeD', output='D') - - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge( - from_node=node_a, - to_node=node_b, - route='route_b', - ), - # This edge has the DEFAULT_ROUTE tag. - Edge( - from_node=node_a, - to_node=node_c, - route=DEFAULT_ROUTE, - ), - # This edge has no route tag, so it should always be triggered. - Edge( - from_node=node_a, - to_node=node_d, - ), - ], - ) - agent = Workflow( - name='test_workflow_agent_default_route', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - simplified_events = simplify_events_with_node(events) - - assert len(simplified_events) == 3 - assert simplified_events[0] == ( - 'test_workflow_agent_default_route@1/NodeA@1', - {'output': 'A'}, - ) - - # Check that NodeC (default route) and NodeD (untagged) are triggered. - other_events = simplified_events[1:] - expected_other_events = [ - ( - 'test_workflow_agent_default_route@1/NodeC@1', - {'output': 'C'}, - ), - ( - 'test_workflow_agent_default_route@1/NodeD@1', - {'output': 'D'}, - ), - ] - assert len(other_events) == len(expected_other_events) - assert all(item in other_events for item in expected_other_events) - - -@pytest.mark.asyncio -async def test_run_async_default_route_not_triggered_if_match( - request: pytest.FixtureRequest, -): - node_a = TestingNode(name='NodeA', output='A', route='route_b') - node_b = TestingNode(name='NodeB', output='B') - node_c = TestingNode(name='NodeC', output='C') - - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge( - from_node=node_a, - to_node=node_b, - route='route_b', - ), - # This edge has the DEFAULT_ROUTE tag. - Edge( - from_node=node_a, - to_node=node_c, - route=DEFAULT_ROUTE, - ), - ], - ) - agent = Workflow( - name='test_workflow_agent_default_route_not_triggered', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - simplified_events = simplify_events_with_node(events) - - assert simplified_events == [ - ( - 'test_workflow_agent_default_route_not_triggered@1/NodeA@1', - {'output': 'A'}, - ), - ( - 'test_workflow_agent_default_route_not_triggered@1/NodeB@1', - {'output': 'B'}, - ), - ] - - -@pytest.mark.asyncio -async def test_run_async_with_untagged_edges(request: pytest.FixtureRequest): - node_a = TestingNode(name='NodeA', output='A', route='route_b') - node_b = TestingNode(name='NodeB', output='B') - node_c = TestingNode(name='NodeC', output='C') - node_d = TestingNode(name='NodeD', output='D') - graph = Graph( - edges=[ - Edge(from_node=START, to_node=node_a), - Edge( - from_node=node_a, - to_node=node_b, - route='route_b', - ), - Edge( - from_node=node_a, - to_node=node_c, - route='route_c', - ), - # This edge has no route tag, so it should always be triggered. - Edge( - from_node=node_a, - to_node=node_d, - ), - ], - ) - agent = Workflow( - name='test_workflow_agent_untagged_edges', - graph=graph, - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - simplified_events = simplify_events_with_node(events) - - assert len(simplified_events) == 3 - assert simplified_events[0] == ( - 'test_workflow_agent_untagged_edges@1/NodeA@1', - {'output': 'A'}, - ) - - # Check that NodeB and NodeD are triggered. - other_events = simplified_events[1:] - expected_other_events = [ - ( - 'test_workflow_agent_untagged_edges@1/NodeB@1', - {'output': 'B'}, - ), - ( - 'test_workflow_agent_untagged_edges@1/NodeD@1', - {'output': 'D'}, - ), - ] - assert len(other_events) == len(expected_other_events) - assert all(item in other_events for item in expected_other_events) - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - 'emitted_route, expected_target', - [ - ('route_a', 'Target'), - ('route_b', 'Target'), - ('route_c', 'Other'), - ], - ids=['route_a_matches_list', 'route_b_matches_list', 'route_c_single'], -) -async def test_edge_with_multiple_routes( - request: pytest.FixtureRequest, emitted_route, expected_target -): - """Tests that an edge with a list of routes matches any of them.""" - node_router = TestingNode(name='Router', output='R', route=emitted_route) - node_target = TestingNode(name='Target', output='T') - node_other = TestingNode(name='Other', output='O') - - agent = Workflow( - name='test_multi_route', - edges=[ - (START, node_router), - Edge( - from_node=node_router, - to_node=node_target, - route=['route_a', 'route_b'], - ), - (node_router, {'route_c': node_other}), - ], - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - assert simplify_events_with_node(events) == [ - ('test_multi_route@1/Router@1', {'output': 'R'}), - ( - f'test_multi_route@1/{expected_target}@1', - { - 'output': 'T' if expected_target == 'Target' else 'O', - }, - ), - ] - - -# --- Routing map integration tests --- - - -@pytest.mark.asyncio -async def test_routing_map_with_default_route( - request: pytest.FixtureRequest, -): - """Tests that DEFAULT_ROUTE works as a fallback in routing maps.""" - node_a = TestingNode(name='NodeA', output='A', route='unmatched_route') - node_b = TestingNode(name='NodeB', output='B') - node_c = TestingNode(name='NodeC', output='C') - - agent = Workflow( - name='test_routing_map_default', - edges=[ - (START, node_a), - (node_a, {'route_b': node_b, DEFAULT_ROUTE: node_c}), - ], - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - assert simplify_events_with_node(events) == [ - ( - 'test_routing_map_default@1/NodeA@1', - {'output': 'A'}, - ), - ( - 'test_routing_map_default@1/NodeC@1', - {'output': 'C'}, - ), - ] - - -@pytest.mark.asyncio -async def test_routing_map_mixed_with_other_formats( - request: pytest.FixtureRequest, -): - """Tests that routing maps coexist with tuples and Edge objects.""" - node_a = TestingNode(name='NodeA', output='A', route='route_b') - node_b = TestingNode(name='NodeB', output='B') - node_c = TestingNode(name='NodeC', output='C') - node_d = TestingNode(name='NodeD', output='D') - - agent = Workflow( - name='test_routing_map_mixed', - edges=[ - (START, node_a), - (node_a, {'route_b': node_b, 'route_c': node_c}), - (node_b, node_d), # unconditional 2-tuple - Edge(from_node=node_c, to_node=node_d), # Edge object - ], - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - assert simplify_events_with_node(events) == [ - ( - 'test_routing_map_mixed@1/NodeA@1', - {'output': 'A'}, - ), - ( - 'test_routing_map_mixed@1/NodeB@1', - {'output': 'B'}, - ), - ( - 'test_routing_map_mixed@1/NodeD@1', - {'output': 'D'}, - ), - ] - - -@pytest.mark.asyncio -async def test_routing_map_fan_out_runs_both_targets( - request: pytest.FixtureRequest, -): - """Tests that fan-out in routing maps triggers both targets at runtime.""" - node_a = TestingNode(name='NodeA', output='A', route='route_x') - node_b = TestingNode(name='NodeB', output='B') - node_c = TestingNode(name='NodeC', output='C') - gate = JoinNode(name='Gate') - - agent = Workflow( - name='test_routing_map_fan_out', - edges=[ - (START, node_a), - (node_a, {'route_x': (node_b, node_c)}), - (node_b, gate), - (node_c, gate), - ], - ) - - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - simplified = simplify_events_with_node(events) - - # NodeB and NodeC should both be triggered, in any order. - # Gate node also produces output combining the two. - outputs = [ - e - for e in simplified - if isinstance(e[1], dict) and e[1].get('output') is not None - ] - - assert len(outputs) == 4 - assert outputs[0] == ( - 'test_routing_map_fan_out@1/NodeA@1', - {'output': 'A'}, - ) - - # Gate should be last - assert outputs[-1] == ( - 'test_routing_map_fan_out@1/Gate@1', - {'output': {'NodeB': 'B', 'NodeC': 'C'}}, - ) - - other = outputs[1:3] - expected = [ - ( - 'test_routing_map_fan_out@1/NodeB@1', - {'output': 'B'}, - ), - ( - 'test_routing_map_fan_out@1/NodeC@1', - {'output': 'C'}, - ), - ] - assert len(other) == len(expected) - assert all(item in other for item in expected) - - -@pytest.mark.asyncio -async def test_fan_in_with_route(request: pytest.FixtureRequest): - """Fan-in with conditional routes — both route to same target.""" - a = TestingNode(name='a', output='A', route='route1') - b = TestingNode(name='b', output='B', route='route1') - c = TestingNode(name='c', output='C') - wf = Workflow( - name='wf', - edges=[ - (START, a), - (START, b), - ((a, b), {'route1': c}), - ], - ) - - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - simplified = simplify_events_with_node(events) - - # 'c' should receive from both 'a' and 'b' and run twice. - c_events = [e for e in simplified if e[0].split('/')[-1].split('@')[0] == 'c'] - assert len(c_events) == 2 - - -@pytest.mark.asyncio -async def test_fan_out_with_route(request: pytest.FixtureRequest): - """Fan-out via route to multiple terminals raises ValueError.""" - router = TestingNode(name='r', output='R', route='route1') - b = TestingNode(name='b', output='B') - c = TestingNode(name='c', output='C') - wf = Workflow( - name='wf', - edges=[ - (START, router), - (router, {'route1': (b, c)}), - ], - ) - - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - - with pytest.raises(ValueError, match='multiple terminal nodes'): - await runner.run_async(testing_utils.get_user_content('start')) - - -@pytest.mark.asyncio -async def test_fan_in_out_with_route(request: pytest.FixtureRequest): - """Fan-in/out with routes to multiple terminals raises ValueError.""" - a = TestingNode(name='a', output='A', route='route1') - b = TestingNode(name='b', output='B', route='route1') - c = TestingNode(name='c', output='C') - d = TestingNode(name='d', output='D') - wf = Workflow( - name='wf', - edges=[ - (START, a), - (START, b), - ((a, b), {'route1': (c, d)}), - ], - ) - - app = App(name=request.function.__name__, root_agent=wf) - runner = testing_utils.InMemoryRunner(app=app) - - with pytest.raises(ValueError, match='multiple terminal nodes'): - await runner.run_async(testing_utils.get_user_content('start')) diff --git a/tests/unittests/workflow/test_workflow_schema.py b/tests/unittests/workflow/test_workflow_schema.py deleted file mode 100644 index 5fdfc706ff..0000000000 --- a/tests/unittests/workflow/test_workflow_schema.py +++ /dev/null @@ -1,842 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for Workflow schema validation (input_schema, output_schema).""" - -from __future__ import annotations - -from google.adk.apps.app import App -from google.adk.events.event import Event -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.workflow import BaseNode -from google.adk.workflow import JoinNode -from google.adk.workflow import START -from google.adk.workflow._workflow import Workflow -from google.genai import types -from pydantic import BaseModel -import pytest - -from .. import testing_utils -from .workflow_testing_utils import create_parent_invocation_context - - -class _OutputModel(BaseModel): - name: str - value: int - - -class _OtherModel(BaseModel): - name: str - value: int - extra: str = 'default' - - -@pytest.mark.asyncio -async def test_workflow_output_schema_validates_terminal( - request: pytest.FixtureRequest, -): - """Workflow.output_schema validates when downstream reads the output.""" - - def produce() -> dict: - return {'name': 'result', 'value': 10} - - def consume(node_input: dict) -> str: - return f"got {node_input['name']}" - - inner = Workflow( - name='wf', - edges=[(START, produce)], - output_schema=_OutputModel, - ) - outer = Workflow( - name='outer', - edges=[(START, inner, consume)], - ) - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'got result' for e in data_events) - - -@pytest.mark.asyncio -async def test_workflow_output_schema_rejects_invalid( - request: pytest.FixtureRequest, -): - """Workflow.output_schema rejects invalid output when downstream reads.""" - - def produce_bad() -> dict: - return {'wrong_field': 'oops'} - - def consume(node_input: dict) -> str: - return 'should not reach' - - inner = Workflow( - name='wf', - edges=[(START, produce_bad)], - output_schema=_OutputModel, - ) - outer = Workflow( - name='outer', - edges=[(START, inner, consume)], - ) - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(ValueError): - await runner.run_async(testing_utils.get_user_content('start')) - - -@pytest.mark.asyncio -async def test_workflow_output_schema_coerces_defaults( - request: pytest.FixtureRequest, -): - """Workflow.output_schema coerces terminal output (fills defaults).""" - - def produce() -> dict: - return {'name': 'x', 'value': 1} - - def consume(node_input: dict) -> dict: - return node_input - - inner = Workflow( - name='wf', - edges=[(START, produce)], - output_schema=_OtherModel, - ) - outer = Workflow( - name='outer', - edges=[(START, inner, consume)], - ) - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - data_events = [e for e in events if isinstance(e, Event) and e.output] - consume_events = [e for e in data_events if e.node_info.name == 'consume'] - assert len(consume_events) == 1 - assert consume_events[0].output == { - 'name': 'x', - 'value': 1, - 'extra': 'default', - } - - -@pytest.mark.asyncio -async def test_nested_workflow_output_schema( - request: pytest.FixtureRequest, -): - """Nested workflow's output_schema validates before passing to parent.""" - - def inner_produce() -> dict: - return {'name': 'inner', 'value': 3} - - inner_workflow = Workflow( - name='inner_wf', - edges=[(START, inner_produce)], - output_schema=_OutputModel, - ) - - def outer_consume(node_input: dict) -> str: - return f"got {node_input['name']}" - - outer_workflow = Workflow( - name='outer_wf', - edges=[ - (START, inner_workflow), - (inner_workflow, outer_consume), - ], - ) - app = App(name=request.function.__name__, root_agent=outer_workflow) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'got inner' for e in data_events) - - -@pytest.mark.asyncio -async def test_workflow_output_schema_validates_multiple_terminals( - request: pytest.FixtureRequest, -): - """Each terminal output is validated when downstream reads.""" - - class _JoinedModel(BaseModel): - branch_a: _OtherModel - branch_b: _OtherModel - - def branch_a() -> dict: - return {'name': 'from_a', 'value': 1} - - def branch_b() -> dict: - return {'name': 'from_b', 'value': 2} - - join = JoinNode(name='join') - - inner = Workflow( - name='wf', - edges=[ - (START, branch_a), - (START, branch_b), - (branch_a, join), - (branch_b, join), - ], - output_schema=_JoinedModel, - ) - - def consume(node_input: dict) -> dict: - return node_input - - outer = Workflow( - name='outer', - edges=[(START, inner, consume)], - ) - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - consume_events = [ - e - for e in events - if isinstance(e, Event) and e.output and e.node_info.name == 'consume' - ] - assert len(consume_events) == 1 - - # Both terminal outputs should have 'extra' filled by _OtherModel default. - output = consume_events[0].output - assert output['branch_a'] == { - 'name': 'from_a', - 'value': 1, - 'extra': 'default', - } - assert output['branch_b'] == { - 'name': 'from_b', - 'value': 2, - 'extra': 'default', - } - - -@pytest.mark.asyncio -async def test_workflow_output_schema_rejects_invalid_among_multiple_terminals( - request: pytest.FixtureRequest, -): - """One invalid terminal among multiple raises validation error.""" - - class _JoinedModel(BaseModel): - branch_good: _OutputModel - branch_bad: _OutputModel - - def branch_good() -> dict: - return {'name': 'ok', 'value': 1} - - def branch_bad() -> dict: - return {'wrong_field': 'oops'} - - join = JoinNode(name='join') - - inner = Workflow( - name='wf', - edges=[ - (START, branch_good), - (START, branch_bad), - (branch_good, join), - (branch_bad, join), - ], - output_schema=_JoinedModel, - ) - - def consume(node_input: dict) -> str: - return 'should not reach' - - outer = Workflow( - name='outer', - edges=[(START, inner, consume)], - ) - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(ValueError): - await runner.run_async(testing_utils.get_user_content('start')) - - -# ── Primitive and generic type output_schema ───────────────────────── - - -@pytest.mark.asyncio -async def test_workflow_output_schema_int_coerces( - request: pytest.FixtureRequest, -): - """Workflow output_schema=int coerces string to int at read time.""" - - def produce() -> str: - return '42' - - def consume(node_input: int) -> int: - return node_input - - inner = Workflow( - name='wf', - edges=[(START, produce)], - output_schema=int, - ) - outer = Workflow(name='outer', edges=[(START, inner, consume)]) - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - consume_events = [ - e - for e in events - if isinstance(e, Event) - and e.output is not None - and e.node_info.name == 'consume' - ] - assert len(consume_events) == 1 - assert consume_events[0].output == 42 - - -@pytest.mark.asyncio -async def test_workflow_output_schema_int_rejects_invalid( - request: pytest.FixtureRequest, -): - """Workflow output_schema=int rejects non-coercible value at read time.""" - - def produce() -> dict: - return {'key': 'value'} - - def consume(node_input: int) -> int: - return node_input - - inner = Workflow( - name='wf', - edges=[(START, produce)], - output_schema=int, - ) - outer = Workflow(name='outer', edges=[(START, inner, consume)]) - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(ValueError): - await runner.run_async(testing_utils.get_user_content('start')) - - -@pytest.mark.asyncio -async def test_workflow_output_schema_list_of_str( - request: pytest.FixtureRequest, -): - """Workflow output_schema=list[str] validates list output at read time.""" - - def produce() -> list: - return ['a', 'b', 'c'] - - def consume(node_input: list) -> list: - return node_input - - inner = Workflow( - name='wf', - edges=[(START, produce)], - output_schema=list[str], - ) - outer = Workflow(name='outer', edges=[(START, inner, consume)]) - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - consume_events = [ - e - for e in events - if isinstance(e, Event) - and e.output is not None - and e.node_info.name == 'consume' - ] - assert len(consume_events) == 1 - assert consume_events[0].output == ['a', 'b', 'c'] - - -@pytest.mark.asyncio -async def test_workflow_output_schema_list_of_basemodel( - request: pytest.FixtureRequest, -): - """Workflow output_schema=list[BaseModel] validates and serializes.""" - - def produce() -> list: - return [ - {'name': 'x', 'value': 1}, - {'name': 'y', 'value': 2}, - ] - - def consume(node_input: list) -> list: - return node_input - - inner = Workflow( - name='wf', - edges=[(START, produce)], - output_schema=list[_OutputModel], - ) - outer = Workflow(name='outer', edges=[(START, inner, consume)]) - app = App(name=request.function.__name__, root_agent=outer) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - consume_events = [ - e - for e in events - if isinstance(e, Event) - and e.output is not None - and e.node_info.name == 'consume' - ] - assert len(consume_events) == 1 - assert consume_events[0].output == [ - {'name': 'x', 'value': 1}, - {'name': 'y', 'value': 2}, - ] - - -# ── End-to-end: input_schema + output_schema combined ────────────── - - -class _TaskOutput(BaseModel): - result: str - score: int - - -class _ReviewResult(BaseModel): - result: str - score: int - reviewer: str = 'auto' - - -@pytest.mark.asyncio -async def test_e2e_input_and_output_schema_pipeline( - request: pytest.FixtureRequest, -): - """output_schema on producer + input_schema on consumer validates both.""" - - def produce() -> _TaskOutput: - return {'result': 'done', 'score': 88} - - def consume(node_input: _TaskOutput) -> str: - return f'result={node_input.result}, score={node_input.score}' - - agent = Workflow( - name='wf', - edges=[(START, produce), (produce, consume)], - ) - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'result=done, score=88' for e in data_events) - - -@pytest.mark.asyncio -async def test_e2e_output_schema_fails_before_input_schema( - request: pytest.FixtureRequest, -): - """Producer output_schema failure prevents consumer from running.""" - - def produce_bad() -> _TaskOutput: - return {'wrong': 'shape'} - - def consume(node_input: _TaskOutput) -> str: - return 'should not reach' - - agent = Workflow( - name='wf', - edges=[(START, produce_bad), (produce_bad, consume)], - ) - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - with pytest.raises(ValueError): - await runner.run_async(testing_utils.get_user_content('start')) - - -@pytest.mark.asyncio -async def test_e2e_fan_out_join_with_schemas( - request: pytest.FixtureRequest, -): - """Fan-out -> join -> consume with input/output schemas.""" - - class _JoinedResult(BaseModel): - analyzer: dict - summarizer: dict - - def analyzer() -> _TaskOutput: - return {'result': 'analysis complete', 'score': 92} - - def summarizer() -> _TaskOutput: - return {'result': 'summary complete', 'score': 78} - - join = JoinNode(name='join') - - def reviewer(node_input: dict) -> _ReviewResult: - a = node_input['analyzer'] - s = node_input['summarizer'] - return { - 'result': f"{a['result']} + {s['result']}", - 'score': (a['score'] + s['score']) // 2, - } - - agent = Workflow( - name='wf', - edges=[ - (START, analyzer), - (START, summarizer), - (analyzer, join), - (summarizer, join), - (join, reviewer), - ], - ) - app = App(name=request.function.__name__, root_agent=agent) - runner = testing_utils.InMemoryRunner(app=app) - events = await runner.run_async(testing_utils.get_user_content('start')) - - terminal = [ - e - for e in events - if isinstance(e, Event) - and e.output is not None - and e.node_info.name == 'reviewer' - ] - assert len(terminal) == 1 - assert terminal[0].output == { - 'result': 'analysis complete + summary complete', - 'score': 85, - 'reviewer': 'auto', - } - assert 'wf' in terminal[0].node_info.path - assert 'reviewer' in terminal[0].node_info.path - - -@pytest.mark.asyncio -async def test_start_node_with_str_input_schema(): - """input_schema=str parses user text.""" - - class _AssertingNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - assert node_input == 'hello' - yield 'done' - - node = _AssertingNode(name='node', input_schema=str) - wf = Workflow(name='wf', edges=[(START, node)]) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='hello')], role='user') - events = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'done' for e in data_events) - - -@pytest.mark.asyncio -async def test_start_node_with_int_input_schema(): - """input_schema=int parses user text to int.""" - - class _AssertingNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - assert node_input == 42 - yield 'done' - - node = _AssertingNode(name='node', input_schema=int) - wf = Workflow(name='wf', edges=[(START, node)]) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='42')], role='user') - events = [] - - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'done' for e in data_events) - - -@pytest.mark.asyncio -async def test_start_node_with_int_list_input_schema(): - """input_schema=list[int] parses JSON list.""" - - class _AssertingNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - assert node_input == [1, 2, 3] - yield 'done' - - node = _AssertingNode(name='node', input_schema=list[int]) - wf = Workflow(name='wf', edges=[(START, node)]) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='[1, 2, 3]')], role='user') - events = [] - - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'done' for e in data_events) - - -@pytest.mark.asyncio -async def test_start_node_with_invalid_input_schema(): - """Invalid input against schema raises error.""" - - class _MyModel(BaseModel): - age: int - - class _AssertingNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield 'done' - - node = _AssertingNode(name='node', input_schema=_MyModel) - wf = Workflow(name='wf', edges=[(START, node)]) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - # Pass invalid input (Content instead of dict with age) - msg = types.Content(parts=[types.Part(text='hello')], role='user') - - # We expect it to raise ValidationError - from pydantic import ValidationError - - with pytest.raises(ValidationError): - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - pass - - -@pytest.mark.asyncio -async def test_start_node_receives_parsed_user_content_with_schema(): - """Parsed input replaces raw Content for first node.""" - - class _AssertingNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - assert isinstance(node_input, str) - assert node_input == 'hello' - yield 'done' - - node = _AssertingNode(name='node', input_schema=str) - wf = Workflow(name='wf', edges=[(START, node)]) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='hello')], role='user') - events = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert any(e.output == 'done' for e in data_events) - - -@pytest.mark.asyncio -async def test_workflow_with_invalid_output_schema(): - """Workflow raises ValidationError if terminal output doesn't match output_schema.""" - - from pydantic import ValidationError - - class _MyModel(BaseModel): - name: str - - class _MyNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield {'age': 10} - - node = _MyNode(name='node') - wf = Workflow(name='wf', edges=[(START, node)], output_schema=_MyModel) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='hello')], role='user') - - with pytest.raises(ValidationError): - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - pass - - -@pytest.mark.asyncio -async def test_node_returns_content_json_parsed(): - """Node output as types.Content containing JSON is parsed if output_schema is defined.""" - - class _MyModel(BaseModel): - name: str - age: int - - class _MyNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield types.Content( - parts=[types.Part(text='{"name": "Alice", "age": 30}')] - ) - - node = _MyNode(name='node', output_schema=_MyModel) - wf = Workflow(name='wf', edges=[(START, node)]) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='hello')], role='user') - events = [] - - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - data_events = [e for e in events if isinstance(e, Event) and e.output] - - assert len(data_events) == 1 - assert data_events[0].output == {'name': 'Alice', 'age': 30} - - -@pytest.mark.asyncio -async def test_node_returns_raw_string_not_parsed(): - """Node output as raw JSON string is NOT parsed if output_schema is defined.""" - from pydantic import ValidationError - - class _MyModel(BaseModel): - name: str - age: int - - class _MyNode(BaseNode): - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - # This should fail validation because it's a string, not a dict/model - yield '{"name": "Alice", "age": 30}' - - node = _MyNode(name='node', output_schema=_MyModel) - wf = Workflow(name='wf', edges=[(START, node)]) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='hello')], role='user') - - with pytest.raises(ValidationError): - async for _ in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - pass - - -@pytest.mark.asyncio -async def test_output_schema_enforced_by_runtime_without_manual_validation(): - """Runtime enforces output_schema even when _run_impl doesn't call _validate_output_data.""" - from pydantic import ValidationError - - class _MyModel(BaseModel): - name: str - age: int - - class _NaiveNode(BaseNode): - """Node that yields raw data without any manual validation.""" - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield {'color': 'red'} # Does NOT match _MyModel - - node = _NaiveNode(name='node', output_schema=_MyModel) - wf = Workflow(name='wf', edges=[(START, node)]) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='hello')], role='user') - - with pytest.raises(ValidationError): - async for _ in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - pass - - -@pytest.mark.asyncio -async def test_output_schema_enforced_for_valid_raw_yield(): - """Runtime validates and coerces valid raw yields against output_schema.""" - - class _MyModel(BaseModel): - name: str - age: int - - class _NaiveNode(BaseNode): - """Node that yields valid raw data without manual validation.""" - - async def _run_impl( - self, *, ctx: Context, node_input: Any - ) -> AsyncGenerator[Any, None]: - yield {'name': 'Alice', 'age': 30} - - node = _NaiveNode(name='node', output_schema=_MyModel) - wf = Workflow(name='wf', edges=[(START, node)]) - - ss = InMemorySessionService() - runner = Runner(app_name='test', node=wf, session_service=ss) - session = await ss.create_session(app_name='test', user_id='u') - - msg = types.Content(parts=[types.Part(text='hello')], role='user') - events = [] - - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - - data_events = [e for e in events if isinstance(e, Event) and e.output] - assert len(data_events) == 1 - assert data_events[0].output == {'name': 'Alice', 'age': 30} diff --git a/tests/unittests/workflow/testing_utils.py b/tests/unittests/workflow/testing_utils.py deleted file mode 100644 index c9894b1e86..0000000000 --- a/tests/unittests/workflow/testing_utils.py +++ /dev/null @@ -1,507 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import asyncio -import contextlib -import copy -from typing import Any -from typing import AsyncGenerator -from typing import Generator -from typing import Optional - -from google.adk.agents.context import Context as WorkflowContext -from google.adk.agents.invocation_context import InvocationContext as BaseInvocationContext -from google.adk.agents.live_request_queue import LiveRequestQueue -from google.adk.agents.llm_agent import Agent -from google.adk.agents.llm_agent import LlmAgent -from google.adk.agents.run_config import RunConfig -from google.adk.apps.app import App -from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService -from google.adk.events.event import Event -from google.adk.memory.in_memory_memory_service import InMemoryMemoryService -from google.adk.models.base_llm import BaseLlm -from google.adk.models.base_llm_connection import BaseLlmConnection -from google.adk.models.llm_request import LlmRequest -from google.adk.models.llm_response import LlmResponse -from google.adk.plugins.base_plugin import BasePlugin -from google.adk.plugins.plugin_manager import PluginManager -from google.adk.runners import InMemoryRunner as AfInMemoryRunner -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.sessions.session import Session -from google.adk.utils.context_utils import Aclosing -from google.genai import types -from google.genai.types import Part -from typing_extensions import override - - -def create_test_agent(name: str = 'test_agent') -> LlmAgent: - """Create a simple test agent for use in unit tests. - - Args: - name: The name of the test agent. - - Returns: - A configured LlmAgent instance suitable for testing. - """ - return LlmAgent(name=name) - - -class UserContent(types.Content): - - def __init__(self, text_or_part: str): - parts = [ - types.Part.from_text(text=text_or_part) - if isinstance(text_or_part, str) - else text_or_part - ] - super().__init__(role='user', parts=parts) - - -class ModelContent(types.Content): - - def __init__(self, parts: list[types.Part]): - super().__init__(role='model', parts=parts) - - -async def create_invocation_context( - agent: Agent, - user_content: str = '', - run_config: RunConfig = None, - plugins: list[BasePlugin] = [], -): - invocation_id = 'test_id' - artifact_service = InMemoryArtifactService() - session_service = InMemorySessionService() - memory_service = InMemoryMemoryService() - invocation_context = BaseInvocationContext( - artifact_service=artifact_service, - session_service=session_service, - memory_service=memory_service, - plugin_manager=PluginManager(plugins=plugins), - invocation_id=invocation_id, - agent=agent, - session=await session_service.create_session( - app_name='test_app', user_id='test_user' - ), - user_content=types.Content( - role='user', parts=[types.Part.from_text(text=user_content)] - ), - run_config=run_config or RunConfig(), - ) - if user_content: - append_user_content( - invocation_context, [types.Part.from_text(text=user_content)] - ) - return invocation_context - - -async def create_workflow_context( - agent, - user_content='', -) -> WorkflowContext: - """Create a WorkflowContext for isolated node testing. - - Constructs the minimal InvocationContext and wraps it in a - WorkflowContext so that individual nodes can be tested in - isolation without running the full _SingleLlmAgent pipeline. - """ - invocation_context = await create_invocation_context(agent, user_content) - return WorkflowContext( - invocation_context=invocation_context, - node_path='test', - run_id='test-execution', - ) - - -def append_user_content( - invocation_context: BaseInvocationContext, parts: list[types.Part] -) -> Event: - session = invocation_context.session - event = Event( - invocation_id=invocation_context.invocation_id, - author='user', - content=types.Content(role='user', parts=parts), - ) - session.events.append(event) - return event - - -# Extracts the contents from the events and transform them into a list of -# (author, simplified_content) tuples. -def simplify_events(events: list[Event]) -> list[tuple[str, types.Part]]: - res = [] - for event in events: - if event.content: - author = event.author - res.append((author, simplify_content(event.content))) - return res - - -END_OF_AGENT = 'end_of_agent' - - -# Extracts the contents from the events and transform them into a list of -# (author, simplified_content OR AgentState OR "end_of_agent") tuples. -# -# Could be used to compare events for testing resumability. -def simplify_resumable_app_events( - events: list[Event], -) -> list[(str, types.Part | str)]: - results = [] - for event in events: - if event.content: - results.append((event.author, simplify_content(event.content))) - elif event.actions.end_of_agent: - results.append((event.author, END_OF_AGENT)) - elif event.actions.agent_state is not None: - agent_state = event.actions.agent_state - if isinstance(agent_state, dict): - nodes = agent_state.get('nodes', {}) - agent_state = { - 'node_states': { - node_name: node_state.get('status') - for node_name, node_state in nodes.items() - } - } - results.append((event.author, agent_state)) - return results - - -# Simplifies the contents into a list of (author, simplified_content) tuples. -def simplify_contents(contents: list[types.Content]) -> list[(str, types.Part)]: - return [(content.role, simplify_content(content)) for content in contents] - - -# Simplifies the content so it's easier to assert. -# - If there is only one part, return part -# - If the only part is pure text, return stripped_text -# - If there are multiple parts, return parts -# - remove function_call_id if it exists -def simplify_content( - content: types.Content, -) -> str | types.Part | list[types.Part]: - content = copy.deepcopy(content) - for part in content.parts: - if part.function_call and part.function_call.id: - part.function_call.id = None - if part.function_response and part.function_response.id: - part.function_response.id = None - if len(content.parts) == 1: - if content.parts[0].text: - return content.parts[0].text.strip() - else: - return content.parts[0] - return content.parts - - -def get_user_content(message: types.ContentUnion) -> types.Content: - return message if isinstance(message, types.Content) else UserContent(message) - - -class TestInMemoryRunner(AfInMemoryRunner): - """InMemoryRunner that is tailored for tests, features async run method. - - app_name is hardcoded as InMemoryRunner in the parent class. - """ - - async def run_async_with_new_session( - self, new_message: types.ContentUnion - ) -> list[Event]: - - collected_events: list[Event] = [] - async for event in self.run_async_with_new_session_agen(new_message): - collected_events.append(event) - - return collected_events - - async def run_async_with_new_session_agen( - self, new_message: types.ContentUnion - ) -> AsyncGenerator[Event, None]: - session = await self.session_service.create_session( - app_name='InMemoryRunner', user_id='test_user' - ) - agen = self.run_async( - user_id=session.user_id, - session_id=session.id, - new_message=get_user_content(new_message), - ) - async with Aclosing(agen): - async for event in agen: - yield event - - -class InMemoryRunner: - """InMemoryRunner that is tailored for tests.""" - - def __init__( - self, - root_agent: Optional[Agent | LlmAgent] = None, - response_modalities: list[str] = None, - plugins: list[BasePlugin] = [], - app: Optional[App] = None, - node: Any = None, - ): - """Initializes the InMemoryRunner. - - Args: - root_agent: The root agent to run, won't be used if app is provided. - response_modalities: The response modalities of the runner. - plugins: The plugins to use in the runner, won't be used if app is - provided. - app: The app to use in the runner. - node: The root node to run. - """ - self._app = app - if node: - self.app_name = node.name - self.root_agent = None - self.runner = Runner( - node=node, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - plugins=plugins, - ) - elif not app: - self.app_name = 'test_app' - self.root_agent = root_agent - self.runner = Runner( - app_name='test_app', - agent=root_agent, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - plugins=plugins, - ) - else: - self.app_name = app.name - self.root_agent = app.root_agent - self.runner = Runner( - app=app, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - ) - self.session_id = None - - @property - def session(self) -> Session: - if not self.session_id: - session = self.runner.session_service.create_session_sync( - app_name=self.app_name, user_id='test_user' - ) - self.session_id = session.id - return session - return self.runner.session_service.get_session_sync( - app_name=self.app_name, user_id='test_user', session_id=self.session_id - ) - - def run(self, new_message: types.ContentUnion) -> list[Event]: - return list( - self.runner.run( - user_id=self.session.user_id, - session_id=self.session.id, - new_message=get_user_content(new_message), - ) - ) - - @property - def is_resumable(self) -> bool: - """Returns whether the app is configured for resumable HITL.""" - if hasattr(self, '_app') and self._app: - cfg = getattr(self._app, 'resumability_config', None) - return cfg is not None and cfg.is_resumable - return False - - async def run_async( - self, - new_message: Optional[types.ContentUnion] = None, - invocation_id: Optional[str] = None, - ) -> list[Event]: - # For non-resumable apps, don't reuse invocation_id on resume. - # State reconstruction relies on scanning events from *previous* - # invocations, so the resume call must get a fresh invocation_id. - if invocation_id and not self.is_resumable: - invocation_id = None - events = [] - async for event in self.runner.run_async( - user_id=self.session.user_id, - session_id=self.session.id, - invocation_id=invocation_id, - new_message=get_user_content(new_message) if new_message else None, - ): - events.append(event) - return events - - def run_live( - self, live_request_queue: LiveRequestQueue, run_config: RunConfig = None - ) -> list[Event]: - collected_responses = [] - - async def consume_responses(session: Session): - run_res = self.runner.run_live( - session=session, - live_request_queue=live_request_queue, - run_config=run_config or RunConfig(), - ) - - async for response in run_res: - collected_responses.append(response) - # When we have enough response, we should return - if len(collected_responses) >= 1: - return - - try: - session = self.session - asyncio.run(consume_responses(session)) - except asyncio.TimeoutError: - print('Returning any partial results collected so far.') - - return collected_responses - - -class MockModel(BaseLlm): - model: str = 'mock' - - requests: list[LlmRequest] = [] - live_blobs: list[types.Blob] = [] - live_contents: list[types.Content] = [] - responses: list[LlmResponse] - error: Exception | None = None - response_index: int = -1 - - # Whether the mock model should wait for realtime input (blobs or content) - # to be sent before yielding pre-defined responses in live mode. - wait_for_realtime_input: bool = False - - @classmethod - def create( - cls, - responses: ( - list[types.Part] - | list[LlmResponse] - | list[str] - | list[list[types.Part]] - ), - error: Exception | None = None, - wait_for_realtime_input: bool = False, - ): - if error and not responses: - return cls( - responses=[], - error=error, - wait_for_realtime_input=wait_for_realtime_input, - ) - if not responses: - return cls(responses=[], wait_for_realtime_input=wait_for_realtime_input) - elif isinstance(responses[0], LlmResponse): - # responses is list[LlmResponse] - return cls( - responses=responses, wait_for_realtime_input=wait_for_realtime_input - ) - else: - responses = [ - LlmResponse(content=ModelContent(item)) - if isinstance(item, list) and isinstance(item[0], types.Part) - # responses is list[list[Part]] - else LlmResponse( - content=ModelContent( - # responses is list[str] or list[Part] - [Part(text=item) if isinstance(item, str) else item] - ) - ) - for item in responses - if item - ] - - return cls( - responses=responses, wait_for_realtime_input=wait_for_realtime_input - ) - - @classmethod - @override - def supported_models(cls) -> list[str]: - return ['mock'] - - def generate_content( - self, llm_request: LlmRequest, stream: bool = False - ) -> Generator[LlmResponse, None, None]: - if self.error is not None: - raise self.error - # Increasement of the index has to happen before the yield. - self.response_index += 1 - self.requests.append(llm_request) - # yield LlmResponse(content=self.responses[self.response_index]) - yield self.responses[self.response_index] - - @override - async def generate_content_async( - self, llm_request: LlmRequest, stream: bool = False - ) -> AsyncGenerator[LlmResponse, None]: - if self.error is not None: - raise self.error - # Increasement of the index has to happen before the yield. - self.response_index += 1 - self.requests.append(llm_request) - yield self.responses[self.response_index] - - @contextlib.asynccontextmanager - async def connect(self, llm_request: LlmRequest) -> BaseLlmConnection: - """Creates a live connection to the LLM.""" - self.requests.append(llm_request) - yield MockLlmConnection( - self.responses, - self, - wait_for_realtime_input=self.wait_for_realtime_input, - ) - - -class MockLlmConnection(BaseLlmConnection): - - def __init__( - self, - llm_responses: list[LlmResponse], - mock_model: MockModel, - wait_for_realtime_input: bool = False, - ): - self.llm_responses = llm_responses - self.mock_model = mock_model - self.wait_for_realtime_input = wait_for_realtime_input - self._input_event = asyncio.Event() - - async def send_history(self, history: list[types.Content]): - pass - - async def send_content(self, content: types.Content): - self.mock_model.live_contents.append(content) - self._input_event.set() - - async def send(self, data): - pass - - async def send_realtime(self, blob: types.Blob): - self.mock_model.live_blobs.append(blob) - self._input_event.set() - - async def receive(self) -> AsyncGenerator[LlmResponse, None]: - """Yield each of the pre-defined LlmResponses.""" - if self.wait_for_realtime_input: - await self._input_event.wait() - - for response in self.llm_responses: - yield response - - async def close(self): - pass diff --git a/tests/unittests/workflow/utils/__init__.py b/tests/unittests/workflow/utils/__init__.py deleted file mode 100644 index 58d482ea38..0000000000 --- a/tests/unittests/workflow/utils/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/tests/unittests/workflow/utils/test_rehydration_utils.py b/tests/unittests/workflow/utils/test_rehydration_utils.py deleted file mode 100644 index 1cb7155328..0000000000 --- a/tests/unittests/workflow/utils/test_rehydration_utils.py +++ /dev/null @@ -1,389 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk.events.event import Event -from google.adk.events.event import NodeInfo -from google.adk.events.request_input import RequestInput -from google.adk.workflow._base_node import BaseNode -from google.adk.workflow.utils._rehydration_utils import _ChildScanState -from google.adk.workflow.utils._rehydration_utils import _process_rehydrated_output -from google.adk.workflow.utils._rehydration_utils import _reconstruct_node_states -from google.adk.workflow.utils._rehydration_utils import _unwrap_response -from google.adk.workflow.utils._rehydration_utils import _validate_resume_response -from google.adk.workflow.utils._rehydration_utils import _wrap_response -from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_event -from google.genai import types -from pydantic import BaseModel -import pytest - -# --- _wrap_response --- - - -class TestWrapResponse: - - def test_dict_returned_as_is(self): - d = {"foo": "bar"} - assert _wrap_response(d) is d - - def test_string_wrapped(self): - assert _wrap_response("hello") == {"result": "hello"} - - def test_int_wrapped(self): - assert _wrap_response(42) == {"result": 42} - - def test_none_wrapped(self): - assert _wrap_response(None) == {"result": None} - - def test_list_wrapped(self): - assert _wrap_response([1, 2]) == {"result": [1, 2]} - - -# --- _unwrap_response --- - - -class TestUnwrapResponse: - - def test_single_result_key_string(self): - assert _unwrap_response({"result": "hello"}) == "hello" - - def test_single_result_key_int(self): - assert _unwrap_response({"result": 42}) == 42 - - def test_single_result_key_none(self): - assert _unwrap_response({"result": None}) is None - - def test_dict_without_result_key_unchanged(self): - d = {"foo": "bar"} - assert _unwrap_response(d) == {"foo": "bar"} - - def test_dict_with_multiple_keys_unchanged(self): - d = {"result": "x", "other": "y"} - assert _unwrap_response(d) == {"result": "x", "other": "y"} - - def test_non_dict_unchanged(self): - assert _unwrap_response("hello") == "hello" - assert _unwrap_response(42) == 42 - assert _unwrap_response(None) is None - - def test_json_string_parsed_to_dict(self): - """Web frontend sends {"result": '{"approved": false}'}.""" - assert _unwrap_response({"result": '{"approved": false}'}) == { - "approved": False - } - - def test_json_string_parsed_to_list(self): - assert _unwrap_response({"result": "[1, 2, 3]"}) == [1, 2, 3] - - def test_json_string_parsed_to_number(self): - assert _unwrap_response({"result": "42"}) == 42 - - def test_json_string_parsed_to_bool(self): - assert _unwrap_response({"result": "true"}) is True - - def test_non_json_string_stays_string(self): - assert _unwrap_response({"result": "plain text"}) == "plain text" - - def test_roundtrip_wrap_unwrap_string(self): - assert _unwrap_response(_wrap_response("hello")) == "hello" - - def test_roundtrip_wrap_unwrap_dict(self): - """Dicts are not wrapped, so unwrap is a no-op.""" - d = {"foo": "bar"} - assert _unwrap_response(_wrap_response(d)) == d - - -# --- _process_rehydrated_output --- - - -class TestProcessRehydratedOutput: - - def test_extracts_plain_text_without_schema(self): - node = BaseNode(name="dummy") - content = types.Content(parts=[types.Part(text="hello world")]) - assert _process_rehydrated_output(node, content) == "hello world" - - def test_returns_plain_text_even_if_json_when_no_schema(self): - node = BaseNode(name="dummy") - content = types.Content(parts=[types.Part(text='{"foo": "bar"}')]) - assert _process_rehydrated_output(node, content) == '{"foo": "bar"}' - - def test_parses_json_text_with_output_schema(self): - class MySchema(BaseModel): - foo: str - - node = BaseNode(name="dummy", output_schema=MySchema) - content = types.Content(parts=[types.Part(text='{"foo": "bar"}')]) - assert _process_rehydrated_output(node, content) == {"foo": "bar"} - - def test_joins_multiple_parts(self): - node = BaseNode(name="dummy") - content = types.Content( - parts=[types.Part(text="hello "), types.Part(text="world")] - ) - assert _process_rehydrated_output(node, content) == "hello world" - - def test_filters_thought_parts(self): - class MySchema(BaseModel): - answer: int - - node = BaseNode(name="dummy", output_schema=MySchema) - content = types.Content( - parts=[ - types.Part(text="thinking...", thought=True), - types.Part(text='{"answer": 42}'), - ] - ) - assert _process_rehydrated_output(node, content) == {"answer": 42} - - def test_returns_none_for_empty_text(self): - node = BaseNode(name="dummy") - content = types.Content(parts=[types.Part(text=" ")]) - assert _process_rehydrated_output(node, content) is None - - def test_gracefully_falls_back_on_schema_mismatch(self, caplog): - class MySchema(BaseModel): - foo: str - bar: int # Required field that is missing in the stored output - - node = BaseNode(name="dummy", output_schema=MySchema) - content = types.Content(parts=[types.Part(text='{"foo": "only"}')]) - - # Should NOT raise ValueError, but fallback to unvalidated parsed dict - res = _process_rehydrated_output(node, content) - assert res == {"foo": "only"} - assert ( - "Validation failed for rehydrated output against schema" in caplog.text - ) - - def test_raises_value_error_if_not_valid_json_on_schema_mismatch(self): - class MySchema(BaseModel): - foo: str - - node = BaseNode(name="dummy", output_schema=MySchema) - content = types.Content(parts=[types.Part(text="invalid json")]) - - # Should raise ValueError because it's not valid JSON - with pytest.raises( - ValueError, - match="Validation failed for rehydrated output against schema", - ): - _process_rehydrated_output(node, content) - - -# --- _validate_resume_response --- - - -class TestValidateResumeResponse: - - def test_none_schema_returns_data(self): - assert _validate_resume_response("hello", None) == "hello" - - def test_str_to_int_coercion(self): - assert _validate_resume_response("42", {"type": "integer"}) == 42 - - def test_str_to_float_coercion(self): - assert _validate_resume_response("42.5", {"type": "number"}) == 42.5 - - def test_str_to_bool_true(self): - assert _validate_resume_response("true", {"type": "boolean"}) is True - assert _validate_resume_response("1", {"type": "boolean"}) is True - - def test_str_to_bool_false(self): - assert _validate_resume_response("false", {"type": "boolean"}) is False - assert _validate_resume_response("0", {"type": "boolean"}) is False - - def test_invalid_coercion_raises_value_error(self): - with pytest.raises(ValueError): - _validate_resume_response("abc", {"type": "integer"}) - - def test_object_schema_validates_dict_type(self): - schema = {"type": "object"} - assert _validate_resume_response({"name": "Alice"}, schema) == { - "name": "Alice" - } - - with pytest.raises(ValueError, match="Failed to coerce data to object"): - _validate_resume_response("not a dict", schema) - - def test_array_schema_validates_list_type(self): - schema = {"type": "array"} - assert _validate_resume_response([1, 2], schema) == [1, 2] - - with pytest.raises(ValueError, match="Failed to coerce data to array"): - _validate_resume_response("not a list", schema) - - def test_pydantic_type_validation(self): - class User(BaseModel): - name: str - age: int - - assert _validate_resume_response( - {"name": "Alice", "age": 30}, User - ) == User(name="Alice", age=30) - - -# --- _reconstruct_node_states --- - - -class TestScanNodeEvents: - - def test_scan_empty_events(self): - results = _reconstruct_node_states([], "/wf@1", invocation_id="test_id") - assert results == {} - - def test_scan_direct_child_output(self): - event = Event( - node_info=NodeInfo(path="/wf@1/node_a@1"), - output="node_a output", - invocation_id="test_id", - ) - results = _reconstruct_node_states( - [event], "/wf@1", invocation_id="test_id", group_by_direct_child=True - ) - - assert "node_a@1" in results - assert results["node_a@1"].output == "node_a output" - assert results["node_a@1"].run_id == "1" - - def test_scan_message_as_output(self): - content = types.Content(parts=[types.Part(text="hello")]) - event = Event( - node_info=NodeInfo(path="/wf@1/node_a@1"), - content=content, - invocation_id="test_id", - ) - event.node_info.message_as_output = True - - results = _reconstruct_node_states( - [event], "/wf@1", invocation_id="test_id", group_by_direct_child=True - ) - - assert "node_a@1" in results - assert results["node_a@1"].output == content - - def test_scan_descendant_interrupts(self): - event = Event( - node_info=NodeInfo(path="/wf@1/node_a@1/sub_node@1"), - long_running_tool_ids={"interrupt-1"}, - invocation_id="test_id", - ) - results = _reconstruct_node_states( - [event], "/wf@1", invocation_id="test_id", group_by_direct_child=True - ) - - assert "node_a@1" in results - assert "interrupt-1" in results["node_a@1"].interrupt_ids - - def test_scan_resolve_interrupts(self): - event_int = Event( - node_info=NodeInfo(path="/wf@1/node_a@1"), - long_running_tool_ids={"interrupt-1"}, - invocation_id="test_id", - ) - event_fr = Event( - author="user", - content=types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - id="interrupt-1", - name="adk_request_input", - response={"result": "user answer"}, - ) - ) - ] - ), - invocation_id="test_id", - ) - - # Act - results = _reconstruct_node_states( - [event_int, event_fr], - "/wf@1", - invocation_id="test_id", - group_by_direct_child=True, - ) - - # Assert - assert "node_a@1" in results - assert "interrupt-1" in results["node_a@1"].resolved_ids - assert ( - results["node_a@1"].resolved_responses["interrupt-1"] == "user answer" - ) - - def test_scan_matches_specific_node_path_without_child_grouping(self): - """Scanning matches events for a specific node path when not grouping by direct child.""" - event = Event( - node_info=NodeInfo(path="/wf@1/node_a@1"), - output="node_a output", - invocation_id="test_id", - ) - - # Act - results = _reconstruct_node_states( - [event], - "/wf@1/node_a@1", - invocation_id="test_id", - group_by_direct_child=False, - ) - - # Assert - assert "/wf@1/node_a@1" in results - assert results["/wf@1/node_a@1"].output == "node_a output" - - def test_scan_validates_and_coerces_response_against_schema(self): - """Scanning validates and coerces user response data against the provided schema.""" - - class MySchema(BaseModel): - count: int - - ri = RequestInput( - interrupt_id="interrupt-1", - response_schema=MySchema, - ) - event_int = create_request_input_event(ri) - event_int.node_info = NodeInfo(path="/wf@1/node_a@1") - event_int.invocation_id = "test_id" - - event_fr = Event( - author="user", - content=types.Content( - parts=[ - types.Part( - function_response=types.FunctionResponse( - id="interrupt-1", - name="adk_request_input", - response={"result": '{"count": "42"}'}, - ) - ) - ] - ), - invocation_id="test_id", - ) - - # Act - results = _reconstruct_node_states( - [event_int, event_fr], - "/wf@1", - invocation_id="test_id", - group_by_direct_child=True, - ) - - # Assert - assert "node_a@1" in results - assert results["node_a@1"].resolved_responses["interrupt-1"] == { - "count": 42 - } diff --git a/tests/unittests/workflow/utils/test_replay_interceptor.py b/tests/unittests/workflow/utils/test_replay_interceptor.py deleted file mode 100644 index edd9a737b0..0000000000 --- a/tests/unittests/workflow/utils/test_replay_interceptor.py +++ /dev/null @@ -1,209 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for ReplayInterceptor. - -Verifies that ReplayInterceptor correctly checks and manages workflow resumption -replay interception. -""" - -from unittest.mock import MagicMock - -from google.adk.agents.context import Context -from google.adk.workflow._base_node import BaseNode -from google.adk.workflow._dynamic_node_scheduler import DynamicNodeRun -from google.adk.workflow._node_state import NodeState -from google.adk.workflow._node_status import NodeStatus -from google.adk.workflow.utils._rehydration_utils import _ChildScanState -from google.adk.workflow.utils._replay_interceptor import check_interception -import pytest - - -def _make_parent_ctx(): - ctx = MagicMock(spec=Context) - ctx._invocation_context = MagicMock() - ctx.resume_inputs = {} - return ctx - - -def test_same_turn_completed(): - """Same-turn completed run intercepts and returns cached output.""" - # Given a same-turn completed run - run = DynamicNodeRun( - state=NodeState(status=NodeStatus.COMPLETED), - output='cached-out', - transfer_to_agent='target-agent', - ) - ctx = _make_parent_ctx() - - # When checked - result = check_interception( - node_path='wf/node@1', - node=BaseNode(name='node'), - current_run=run, - curr_parent_ctx=ctx, - ) - - # Then it intercepts with cached results - assert not result.should_run - assert result.output == 'cached-out' - assert result.transfer_to_agent == 'target-agent' - - -def test_same_turn_waiting(): - """Same-turn waiting run intercepts and returns unresolved interrupts.""" - # Given a same-turn waiting run - run = DynamicNodeRun( - state=NodeState(status=NodeStatus.WAITING, interrupts=['fc-1']), - ) - ctx = _make_parent_ctx() - - # When checked - result = check_interception( - node_path='wf/node@1', - node=BaseNode(name='node'), - current_run=run, - curr_parent_ctx=ctx, - ) - - # Then it intercepts and keeps waiting - assert not result.should_run - assert result.interrupts == {'fc-1'} - - -def test_cross_turn_unresolved_interrupts_no_rerun(): - """Cross-turn unresolved interrupts keep waiting without rerun.""" - # Given unresolved interrupts and node without rerun_on_resume - recovered = _ChildScanState( - run_id='1', - interrupt_ids={'fc-1', 'fc-2'}, - resolved_ids={'fc-1'}, - ) - node = BaseNode(name='node', rerun_on_resume=False) - ctx = _make_parent_ctx() - - # When checked - result = check_interception( - node_path='wf/node@1', - node=node, - recovered=recovered, - curr_parent_ctx=ctx, - ) - - # Then it stays waiting on unresolved interrupts - assert not result.should_run - assert result.interrupts == {'fc-2'} - - -def test_cross_turn_unresolved_interrupts_rerun(): - """Cross-turn unresolved interrupts with rerun resolves progress and reruns.""" - # Given unresolved interrupts and node with rerun_on_resume - recovered = _ChildScanState( - run_id='1', - interrupt_ids={'fc-1', 'fc-2'}, - resolved_ids={'fc-1'}, - resolved_responses={'fc-1': 'ans'}, - ) - node = BaseNode(name='node', rerun_on_resume=True) - ctx = _make_parent_ctx() - - # When checked - result = check_interception( - node_path='wf/node@1', - node=node, - recovered=recovered, - curr_parent_ctx=ctx, - ) - - # Then it reruns with partial resolved inputs - assert result.should_run - assert result.resume_inputs == {'fc-1': 'ans'} - - -def test_cross_turn_completed(): - """Cross-turn completed run fast-forwards output and route.""" - # Given a completed run from history - recovered = _ChildScanState( - run_id='1', - output='past-out', - route='route-a', - ) - node = BaseNode(name='node') - ctx = _make_parent_ctx() - - # When checked - result = check_interception( - node_path='wf/node@1', - node=node, - recovered=recovered, - curr_parent_ctx=ctx, - ) - - # Then it fast-forwards with cached output and route - assert not result.should_run - assert result.output == 'past-out' - assert result.route == 'route-a' - - -def test_cross_turn_all_resolved_no_rerun(): - """Cross-turn all resolved run without rerun auto-completes with responses.""" - # Given all resolved interrupts and node without rerun_on_resume - recovered = _ChildScanState( - run_id='1', - interrupt_ids={'fc-1'}, - resolved_ids={'fc-1'}, - resolved_responses={'fc-1': 'ans'}, - ) - node = BaseNode(name='node', rerun_on_resume=False) - ctx = _make_parent_ctx() - ctx.resume_inputs = { - 'fc-1': {'result': 'ans'} - } # Simulate FunctionResponse dict - - # When checked - result = check_interception( - node_path='wf/node@1', - node=node, - recovered=recovered, - curr_parent_ctx=ctx, - ) - - # Then it auto-completes - assert not result.should_run - assert result.output == 'ans' - - -def test_cross_turn_all_resolved_rerun(): - """Cross-turn all resolved run with rerun triggers rerun with responses.""" - # Given all resolved interrupts and node with rerun_on_resume - recovered = _ChildScanState( - run_id='1', - interrupt_ids={'fc-1'}, - resolved_ids={'fc-1'}, - resolved_responses={'fc-1': 'ans'}, - ) - node = BaseNode(name='node', rerun_on_resume=True) - ctx = _make_parent_ctx() - - # When checked - result = check_interception( - node_path='wf/node@1', - node=node, - recovered=recovered, - curr_parent_ctx=ctx, - ) - - # Then it reruns - assert result.should_run - assert result.resume_inputs == {'fc-1': 'ans'} diff --git a/tests/unittests/workflow/utils/test_replay_sequence_barrier.py b/tests/unittests/workflow/utils/test_replay_sequence_barrier.py deleted file mode 100644 index 2cb9008e2d..0000000000 --- a/tests/unittests/workflow/utils/test_replay_sequence_barrier.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for ReplaySequenceBarrier.""" - -from __future__ import annotations - -import asyncio - -from google.adk.workflow.utils._replay_sequence_barrier import ReplaySequenceBarrier -import pytest - - -@pytest.mark.asyncio -async def test_barrier_initialization(): - """Verifies that barrier initializes sequence index and sets the first event.""" - # Given a chronological sequence of completions - sequence = ['NodeA@1', 'NodeB@1'] - - # When barrier is created - barrier = ReplaySequenceBarrier(sequence) - - # Then state is correctly set - assert barrier.sequence == sequence - assert barrier.current_index == 0 - assert len(barrier.events) == 2 - assert barrier.events['NodeA@1'].is_set() - assert not barrier.events['NodeB@1'].is_set() - - -@pytest.mark.asyncio -async def test_barrier_wait_blocks_and_unblocks(): - """Verifies that wait blocks on subsequent keys and is unblocked by advance.""" - sequence = ['NodeA@1', 'NodeB@1'] - barrier = ReplaySequenceBarrier(sequence) - - # When first key waits, it completes instantly - await barrier.wait('NodeA@1') - - # When second key waits, it blocks - b_completed = False - - async def wait_b(): - nonlocal b_completed - await barrier.wait('NodeB@1') - b_completed = True - - task = asyncio.create_task(wait_b()) - await asyncio.sleep(0.05) - assert not b_completed # Still blocked - - # When first key advances the sequence - barrier.check_and_advance('NodeA@1') - - # Then index progresses and second event is released - await task - assert b_completed - assert barrier.current_index == 1 - assert barrier.events['NodeB@1'].is_set() - - -def test_barrier_advance_out_of_order_ignored(): - """Verifies that out-of-order advance calls are ignored and do not progress index.""" - sequence = ['NodeA@1', 'NodeB@1'] - barrier = ReplaySequenceBarrier(sequence) - - # When second key tries to advance out of order - barrier.check_and_advance('NodeB@1') - - # Then state remains unchanged - assert barrier.current_index == 0 - assert not barrier.events['NodeB@1'].is_set() - - -@pytest.mark.asyncio -async def test_barrier_wait_non_existent_key(): - """Verifies that waiting on a key not in sequence does not block.""" - sequence = ['NodeA@1'] - barrier = ReplaySequenceBarrier(sequence) - - # When a key not in sequence waits, it passes instantly - await barrier.wait('NonExistent@1') - - # No blocks, successfully completes! - assert True diff --git a/tests/unittests/workflow/utils/test_retry_utils.py b/tests/unittests/workflow/utils/test_retry_utils.py deleted file mode 100644 index 3685139c42..0000000000 --- a/tests/unittests/workflow/utils/test_retry_utils.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk.workflow._node_state import NodeState -from google.adk.workflow._retry_config import RetryConfig -from google.adk.workflow.utils._retry_utils import _get_retry_delay -import pytest - - -class TestGetRetryDelay: - - def test_returns_default_delay_without_config(self): - """Returns default delay of 1.0 second when config is missing.""" - state = NodeState(attempt_count=1) - - result = _get_retry_delay(None, state) - - assert result == 1.0 - - def test_returns_initial_delay_on_first_failure(self): - """Returns initial delay on the first failure attempt.""" - config = RetryConfig(initial_delay=2.0, jitter=0.0) - state = NodeState(attempt_count=1) - - result = _get_retry_delay(config, state) - - assert result == 2.0 - - def test_applies_exponential_backoff(self): - """Applies exponential backoff for subsequent attempts.""" - config = RetryConfig(initial_delay=2.0, backoff_factor=2.0, jitter=0.0) - state = NodeState(attempt_count=2) - - result = _get_retry_delay(config, state) - - assert result == 4.0 - - def test_caps_at_max_delay(self): - """Caps calculated delay at the specified maximum delay.""" - config = RetryConfig( - initial_delay=2.0, backoff_factor=10.0, max_delay=15.0, jitter=0.0 - ) - state = NodeState(attempt_count=2) - - result = _get_retry_delay(config, state) - - assert result == 15.0 - - def test_adds_jitter_when_enabled(self): - """Adds random jitter to the calculated delay.""" - config = RetryConfig(initial_delay=10.0, backoff_factor=1.0, jitter=0.5) - state = NodeState(attempt_count=1) - - delays = [_get_retry_delay(config, state) for _ in range(10)] - - assert all(5.0 <= d <= 15.0 for d in delays) - assert len(set(delays)) > 1 diff --git a/tests/unittests/workflow/utils/test_transfer_utils.py b/tests/unittests/workflow/utils/test_transfer_utils.py deleted file mode 100644 index 4fa6278da0..0000000000 --- a/tests/unittests/workflow/utils/test_transfer_utils.py +++ /dev/null @@ -1,188 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for agent transfer utilities.""" - -from __future__ import annotations - -from unittest.mock import MagicMock - -from google.adk.agents.llm_agent import LlmAgent -from google.adk.workflow.utils._transfer_utils import resolve_and_derive_transfer_context -import pytest - - -def test_resolve_and_derive_transfer_context_raises_value_error_on_self_transfer(): - """resolve_and_derive_transfer_context raises ValueError when target is the current agent.""" - # Arrange - current = LlmAgent(name='current') - root = LlmAgent(name='root', sub_agents=[current]) - - # Act & Assert - with pytest.raises(ValueError, match='cannot transfer to itself'): - resolve_and_derive_transfer_context( - 'current', current, root, MagicMock(), None - ) - - -def test_resolve_and_derive_transfer_context_returns_child_context(): - """resolve_and_derive_transfer_context returns current context as parent context for CHILD transfers.""" - # Arrange - target = LlmAgent(name='target') - current = LlmAgent(name='current', sub_agents=[target]) - root = LlmAgent(name='root', sub_agents=[current]) - - curr_ctx = MagicMock() - - # Act - resolved_agent, parent_ctx = resolve_and_derive_transfer_context( - 'target', current, root, curr_ctx, None - ) - - # Assert - assert resolved_agent is target - assert parent_ctx is curr_ctx - - -def test_resolve_and_derive_transfer_context_returns_sibling_context(): - """resolve_and_derive_transfer_context returns parent context for SIBLING transfers.""" - # Arrange - current = LlmAgent(name='current') - target = LlmAgent(name='target') - root = LlmAgent(name='root', sub_agents=[current, target]) - - parent_ctx = MagicMock() - - # Act - resolved_agent, derived_ctx = resolve_and_derive_transfer_context( - 'target', current, root, MagicMock(), parent_ctx - ) - - # Assert - assert resolved_agent is target - assert derived_ctx is parent_ctx - - -def test_resolve_and_derive_transfer_context_climbs_parent_context(): - """resolve_and_derive_transfer_context climbs context chain to find the target parent's parent context.""" - # Arrange - root_ctx = MagicMock() - root_ctx.node = MagicMock() - root_ctx.node.name = 'root' - root_ctx.parent_ctx = MagicMock() - root_ctx.parent_ctx.node = None - root_ctx.parent_ctx.parent_ctx = None - - child_ctx = MagicMock() - child_ctx.node = MagicMock() - child_ctx.node.name = 'child' - child_ctx.parent_ctx = root_ctx - - # Target is 'root', current is 'child' - child = LlmAgent(name='child') - root = LlmAgent(name='root', sub_agents=[child]) - child.parent_agent = root - - # Act - resolved_agent, derived_ctx = resolve_and_derive_transfer_context( - 'root', child, root, child_ctx, None - ) - - # Assert - assert resolved_agent is root - assert derived_ctx is root_ctx.parent_ctx - - -def test_resolve_and_derive_transfer_context_returns_root_context_when_parent_bypassed(): - """resolve_and_derive_transfer_context returns root context for PARENT transfers when parent was bypassed.""" - # Arrange - root_ctx = MagicMock() - root_ctx.node = None - root_ctx.parent_ctx = None - - child_ctx = MagicMock() - child_ctx.node = MagicMock() - child_ctx.node.name = 'child' - child_ctx.parent_ctx = root_ctx - - # Target is 'root', current is 'child' - child = LlmAgent(name='child') - root = LlmAgent(name='root', sub_agents=[child]) - child.parent_agent = root - - # Act - resolved_agent, derived_ctx = resolve_and_derive_transfer_context( - 'root', child, root, child_ctx, None - ) - - # Assert - assert resolved_agent is root - assert derived_ctx is root_ctx - - -def test_resolve_and_derive_transfer_context_returns_none_when_agent_not_found(): - """resolve_and_derive_transfer_context returns (None, None) when target agent is not found.""" - # Arrange - current = LlmAgent(name='current') - root = LlmAgent(name='root', sub_agents=[current]) - - # Act - resolved_agent, derived_ctx = resolve_and_derive_transfer_context( - 'target', current, root, MagicMock(), None - ) - - # Assert - assert resolved_agent is None - assert derived_ctx is None - - -def test_resolve_and_derive_transfer_context_returns_target_and_none_when_no_relationship(): - """resolve_and_derive_transfer_context returns (target_agent, None) for unrelated transfers.""" - # Arrange - current = LlmAgent(name='current') - target = LlmAgent(name='target') - root1 = LlmAgent(name='root1', sub_agents=[current]) - root2 = LlmAgent(name='root2', sub_agents=[target]) - - # Act - resolved_agent, derived_ctx = resolve_and_derive_transfer_context( - 'target', current, root2, MagicMock(), None - ) - - # Assert - assert resolved_agent is target - assert derived_ctx is None - - -def test_resolve_and_derive_transfer_context_works_with_cloned_agents(): - """resolve_and_derive_transfer_context works correctly when the current agent is cloned (name-based matching).""" - # Arrange - target = LlmAgent(name='target') - current = LlmAgent(name='current', sub_agents=[target]) - root = LlmAgent(name='root', sub_agents=[current]) - - cloned_current = current.clone() - assert cloned_current is not current - assert cloned_current.name == current.name - - curr_ctx = MagicMock() - - # Act - resolved_agent, derived_ctx = resolve_and_derive_transfer_context( - 'target', cloned_current, root, curr_ctx, None - ) - - # Assert - assert resolved_agent is target - assert derived_ctx is curr_ctx diff --git a/tests/unittests/workflow/utils/test_workflow_graph_utils.py b/tests/unittests/workflow/utils/test_workflow_graph_utils.py deleted file mode 100644 index f4c2c81318..0000000000 --- a/tests/unittests/workflow/utils/test_workflow_graph_utils.py +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk.tools.base_tool import BaseTool -from google.adk.workflow._base_node import BaseNode -from google.adk.workflow._base_node import START -from google.adk.workflow._function_node import FunctionNode -from google.adk.workflow._tool_node import _ToolNode -from google.adk.workflow.utils._workflow_graph_utils import build_node -from google.adk.workflow.utils._workflow_graph_utils import is_node_like -import pytest - - -class TestIsNodeLike: - - def test_returns_true_for_base_node(self): - """is_node_like returns True for BaseNode instances.""" - - class DummyNode(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield node_input - - node = DummyNode(name="test") - - assert is_node_like(node) is True - - def test_returns_true_for_base_tool(self): - """is_node_like returns True for BaseTool instances.""" - - class DummyTool(BaseTool): - - def execute(self, **kwargs): - return "done" - - tool = DummyTool(name="test", description="test") - - assert is_node_like(tool) is True - - def test_returns_true_for_callable(self): - """is_node_like returns True for callables.""" - - def my_func(): - pass - - assert is_node_like(my_func) is True - - def test_returns_true_for_start_string(self): - """is_node_like returns True for 'START' string.""" - assert is_node_like("START") is True - - def test_returns_false_for_invalid_types(self): - """is_node_like returns False for invalid types.""" - assert is_node_like(123) is False - assert is_node_like("NOT_START") is False - - -class TestBuildNode: - - def test_returns_start_when_node_like_is_start(self): - """build_node returns START sentinel when input is 'START'.""" - assert build_node("START") == START - - def test_returns_copy_of_base_node_with_overrides(self): - """build_node returns a copy of BaseNode with provided overrides.""" - - class DummyNode(BaseNode): - - async def _run_impl(self, *, ctx, node_input): - yield node_input - - node = DummyNode(name="original") - - built = build_node(node, name="new_name") - - assert built != node - assert built.name == "new_name" - - def test_returns_tool_node_for_base_tool(self): - """build_node wraps BaseTool in a _ToolNode.""" - - class DummyTool(BaseTool): - - def execute(self, **kwargs): - return "done" - - tool = DummyTool(name="test", description="test") - - built = build_node(tool) - - assert isinstance(built, _ToolNode) - - def test_returns_function_node_for_callable(self): - """build_node wraps callable in a FunctionNode.""" - - def my_func(x): - return x - - built = build_node(my_func) - - assert isinstance(built, FunctionNode) - - def test_raises_value_error_for_invalid_type(self): - """build_node raises ValueError for invalid types.""" - with pytest.raises(ValueError, match="Invalid node type"): - build_node(123) diff --git a/tests/unittests/workflow/utils/test_workflow_hitl_utils.py b/tests/unittests/workflow/utils/test_workflow_hitl_utils.py deleted file mode 100644 index fcccb4e75a..0000000000 --- a/tests/unittests/workflow/utils/test_workflow_hitl_utils.py +++ /dev/null @@ -1,175 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -from google.adk.events.event import Event -from google.adk.events.event import NodeInfo -from google.adk.events.request_input import RequestInput -from google.adk.workflow.utils._rehydration_utils import _ChildScanState -from google.adk.workflow.utils._workflow_hitl_utils import create_auth_request_event -from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_event -from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_response -from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids -from google.adk.workflow.utils._workflow_hitl_utils import has_request_input_function_call -from google.adk.workflow.utils._workflow_hitl_utils import REQUEST_CREDENTIAL_FUNCTION_CALL_NAME -from google.genai import types - -# --- create_request_input_event --- - - -class TestCreateRequestInputEvent: - - def test_basic_event(self): - ri = RequestInput( - interrupt_id="test-id", - message="Please approve", - ) - event = create_request_input_event(ri) - - assert event.long_running_tool_ids == {"test-id"} - assert event.content is not None - fc = event.content.parts[0].function_call - assert fc.name == "adk_request_input" - assert fc.id == "test-id" - assert fc.args["message"] == "Please approve" - - def test_with_payload(self): - ri = RequestInput( - interrupt_id="id-1", - payload={"key": "value"}, - ) - event = create_request_input_event(ri) - fc = event.content.parts[0].function_call - assert fc.args["payload"] == {"key": "value"} - - def test_with_response_schema(self): - from pydantic import BaseModel - - class MySchema(BaseModel): - approved: bool - - ri = RequestInput( - interrupt_id="id-2", - response_schema=MySchema, - ) - event = create_request_input_event(ri) - fc = event.content.parts[0].function_call - schema = fc.args["response_schema"] - assert "approved" in schema["properties"] - assert schema["properties"]["approved"]["type"] == "boolean" - - -# --- has_request_input_function_call --- - - -class TestHasRequestInputFunctionCall: - - def test_true_for_request_input_event(self): - event = create_request_input_event( - RequestInput(interrupt_id="id-1", message="test") - ) - assert has_request_input_function_call(event) is True - - def test_false_for_empty_event(self): - assert has_request_input_function_call(Event()) is False - - def test_false_for_non_request_input(self): - from google.genai import types - - event = Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall(name="other_tool", args={}) - ) - ] - ) - ) - assert has_request_input_function_call(event) is False - - -# --- create_request_input_response --- - - -class TestCreateRequestInputResponse: - - def test_creates_function_response_part(self): - part = create_request_input_response("id-1", {"approved": True}) - assert part.function_response.id == "id-1" - assert part.function_response.name == "adk_request_input" - assert part.function_response.response == {"approved": True} - - -# --- get_request_input_interrupt_ids --- - - -class TestGetRequestInputInterruptIds: - - def test_extracts_ids(self): - event = create_request_input_event( - RequestInput(interrupt_id="id-1", message="test") - ) - assert get_request_input_interrupt_ids(event) == ["id-1"] - - def test_empty_for_no_function_calls(self): - assert get_request_input_interrupt_ids(Event()) == [] - - def test_empty_for_non_request_input(self): - from google.genai import types - - event = Event( - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall( - name="other_tool", args={}, id="id-1" - ) - ) - ] - ) - ) - assert get_request_input_interrupt_ids(event) == [] - - -# --- create_auth_request_event --- - - -class TestCreateAuthRequestEvent: - - def test_creates_credential_request(self): - from fastapi.openapi.models import APIKey - from fastapi.openapi.models import APIKeyIn - from google.adk.auth.auth_credential import AuthCredential - from google.adk.auth.auth_credential import AuthCredentialTypes - from google.adk.auth.auth_tool import AuthConfig - - auth_config = AuthConfig( - auth_scheme=APIKey(**{"in": APIKeyIn.header, "name": "X-Api-Key"}), - raw_auth_credential=AuthCredential( - auth_type=AuthCredentialTypes.API_KEY, - api_key="test_key", - ), - credential_key="test_cred", - ) - event = create_auth_request_event(auth_config, "auth-id-1") - - assert event.long_running_tool_ids is not None - fc = event.content.parts[0].function_call - assert fc.name == REQUEST_CREDENTIAL_FUNCTION_CALL_NAME - assert fc.id == "auth-id-1" - assert "authConfig" in fc.args - - -# diff --git a/tests/unittests/workflow/workflow_testing_utils.py b/tests/unittests/workflow/workflow_testing_utils.py deleted file mode 100644 index 6163609f1a..0000000000 --- a/tests/unittests/workflow/workflow_testing_utils.py +++ /dev/null @@ -1,399 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Testing utils for the Workflow.""" - -import copy -import inspect -from typing import Any -from typing import AsyncGenerator -from typing import Callable -from typing import List -from typing import Optional - -from google.adk.agents.base_agent import BaseAgent -from google.adk.agents.context import Context -from google.adk.agents.invocation_context import InvocationContext -from google.adk.agents.invocation_context import InvocationContext as BaseInvocationContext -from google.adk.apps.app import ResumabilityConfig -from google.adk.events.event import Event -from google.adk.events.request_input import RequestInput -from google.adk.runners import Runner -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.workflow import BaseNode -from google.adk.workflow._graph import RouteValue -from google.adk.workflow.utils._workflow_hitl_utils import has_auth_request_function_call -from google.adk.workflow.utils._workflow_hitl_utils import has_request_input_function_call -from google.genai import types -from pydantic import ConfigDict -from pydantic import Field -from typing_extensions import override - -from .testing_utils import END_OF_AGENT -from .testing_utils import simplify_content - - -async def run_workflow(wf, message='start'): - """Run a Workflow through Runner, return collected events.""" - ss = InMemorySessionService() - runner = Runner(app_name=wf.name, node=wf, session_service=ss) - session = await ss.create_session(app_name=wf.name, user_id='u') - msg = types.Content(parts=[types.Part(text=message)], role='user') - events = [] - async for event in runner.run_async( - user_id='u', session_id=session.id, new_message=msg - ): - events.append(event) - return events, ss, session - - -# Emulates a node that outputs an Event & a route. -# If output is not None, the output is set as the data field in the event. -# If route is not None, the route is set in the node output event. -# The route can be set without the output. This means didn't produce any output -# but wants to signal a route to take. -class TestingNode(BaseNode): - model_config = ConfigDict(arbitrary_types_allowed=True) - - output: Optional[Any] = None - route: ( - RouteValue | list[RouteValue] | Callable[[Context, Any], Any] | None - ) = None - received_inputs: List[Any] = Field(default_factory=list) - - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - if self.output is not None or self.route is not None: - route = None - if callable(self.route): - if inspect.iscoroutinefunction(self.route): - route = await self.route(ctx, node_input) - else: - route = self.route(ctx, node_input) - else: - route = self.route - - self.received_inputs.append(node_input) - yield Event( - output=self.output, - route=route, - ) - - -class TestingNodeWithIntermediateContent(BaseNode): - model_config = ConfigDict(arbitrary_types_allowed=True) - - intermediate_content: list[types.Content] = Field(default_factory=list) - output: Optional[Any] = None - route: Optional[str] = None - - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - for content in self.intermediate_content: - yield Event( - author=self.name, - invocation_id=ctx.invocation_id, - content=content, - ) - - if self.output is not None: - yield Event( - output=self.output, - route=self.route, - ) - - -class InputCapturingNode(BaseNode): - """A node that captures the inputs it receives.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - - received_inputs: List[Any] = Field(default_factory=list) - - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - self.received_inputs.append(node_input) - yield Event( - output={'received': node_input}, - ) - - -class RequestInputNode(BaseNode): - """A simple node that requests input from the user.""" - - model_config = ConfigDict(arbitrary_types_allowed=True) - - message: str = Field(default='') - response_schema: Optional[dict[str, Any]] = None - - @override - async def _run_impl( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - yield RequestInput( - message=self.message, - response_schema=self.response_schema, - ) - - -async def create_parent_invocation_context( - test_name: str, agent: BaseAgent, resumable: bool = False -) -> InvocationContext: - session_service = InMemorySessionService() - session = await session_service.create_session( - app_name='test_app', user_id='test_user' - ) - return InvocationContext( - invocation_id=f'{test_name}_invocation_id', - agent=agent, - session=session, - session_service=session_service, - resumability_config=ResumabilityConfig(is_resumable=resumable), - ) - - -def simplify_event_with_node( - event: Event, - include_state_delta: bool = False, -) -> Any | None: - if isinstance(event, Event): - if ( - 'output' not in event.model_fields_set - and not (include_state_delta and event.actions.state_delta) - and not event.content - ): - return None - - # If the event has content, return the simplified content. - if event.content: - return simplify_content(event.content) - - simplified_event = {} - - # Also simplify event.output if it contains Content. - # The tests assume that Content found in event data should be simplified - # (IDs stripped) just like event.content. This ensures consistent - # assertion behavior. - output = event.output - if isinstance(output, types.Content): - output = copy.deepcopy(output) - for part in output.parts: - if part.function_call and part.function_call.id: - part.function_call.id = None - if part.function_response and part.function_response.id: - part.function_response.id = None - simplified_event['output'] = output - - if include_state_delta and event.actions.state_delta: - simplified_event['state_delta'] = event.actions.state_delta - - return simplified_event - elif event.content: - return simplify_content(event.content) - - -def simplify_events_with_node( - events: list[Event], - *, - include_state_delta: bool = False, - include_workflow_output: bool = False, -) -> list[tuple[str, Any]]: - results = [] - - # Second pass: Simplify events - for event in events: - # Optionally skip top-level workflow output events (events emitted - # by the Workflow in _finalize_workflow). These events have a - # top-level node_path (no '/' separator) and carry output data. - if ( - not include_workflow_output - and isinstance(event, Event) - and event.output is not None - and '/' not in (event.node_info.path or '') - ): - continue - - simplified_event = simplify_event_with_node(event, include_state_delta) - if simplified_event: - # Map the author to the source node name if it exists. - if hasattr(event, 'node_info') and event.node_info.path: - author = event.node_info.path - else: - author = event.author - results.append((author, simplified_event)) - return results - - -def simplify_events_with_node_and_agent_state( - events: list[Event], - *, - include_state_delta: bool = False, - include_inputs_and_triggers: bool = False, - include_resume_inputs: bool = False, - include_workflow_output: bool = False, -): - fields_to_exclude = {'run_id'} - if not include_inputs_and_triggers: - fields_to_exclude.add('input') - if not include_resume_inputs: - fields_to_exclude.add('resume_inputs') - - results = [] - - for event in events: - # Optionally skip top-level workflow output events. - if ( - not include_workflow_output - and isinstance(event, Event) - and event.output is not None - and '/' not in (event.node_info.path or '') - ): - continue - simplified_event = simplify_event_with_node(event, include_state_delta) - - # Map the author to the source node name if it exists. - if hasattr(event, 'node_info') and event.node_info.path: - author = event.node_info.path - else: - author = event.author - - if simplified_event: - results.append((author, simplified_event)) - elif event.actions.end_of_agent: - results.append((author, END_OF_AGENT)) - elif event.actions.agent_state is not None: - agent_state = event.actions.agent_state - nodes = agent_state.get('nodes', {}) - simplified_nodes = {} - for node_name, node_state in nodes.items(): - simplified_nodes[node_name] = { - k: v - for k, v in node_state.items() - if k not in fields_to_exclude - and (k != 'interrupts' or v) # Exclude empty interrupts - and (k != 'resume_inputs' or v) # Exclude empty resume_inputs - } - results.append((author, {'nodes': simplified_nodes})) - return results - - -def get_request_input_events(events: list[Any]) -> list[Any]: - """Returns a list of request input events from the given list of events.""" - return [e for e in events if has_request_input_function_call(e)] - - -def get_auth_request_events(events: list[Any]) -> list[Any]: - """Returns a list of auth credential request events from the given list.""" - return [e for e in events if has_auth_request_function_call(e)] - - -def get_output_events(events: list[Any], output: Any = None) -> list[Any]: - """Returns a list of events that have output populated.""" - return [ - e - for e in events - if isinstance(e, Event) - and e.output is not None - and (output is None or e.output == output) - ] - - -def get_outputs(events: list[Event]) -> list[Any]: - """Extracts output values from events, skipping non-output events.""" - return [ - e.output for e in events if isinstance(e, Event) and e.output is not None - ] - - -def strip_checkpoint_events( - simplified_events: list[tuple[str, Any]], -) -> list[tuple[str, Any]]: - """Strips agent_state checkpoint and end_of_agent events. - - In non-resumable mode, the workflow does not emit checkpoint events - or end_of_agent events. Use this to derive the expected simplified - output for non-resumable tests from the resumable expected output. - """ - return [ - (author, data) - for author, data in simplified_events - if not (isinstance(data, dict) and 'nodes' in data) - and data != END_OF_AGENT - ] - - -def find_function_call_event( - events: list[Any], name: str | None = None -) -> Any | None: - """Finds the first event containing a function call.""" - for e in events: - if hasattr(e, 'content') and e.content and e.content.parts: - for part in e.content.parts: - if part.function_call: - if name is None or part.function_call.name == name: - return e - return None - - -class CustomRetryableError(Exception): - """A custom error meant to be retried.""" - - -class CustomNonRetryableError(Exception): - """A custom error not meant to be retried.""" - - -class _FlakyNode(BaseNode): - model_config = ConfigDict(arbitrary_types_allowed=True) - - message: str = Field(default='') - succeed_on_iteration: int = Field(default=0) - tracker: dict[str, Any] = Field(default_factory=dict) - exception_to_raise: Exception = Field(...) - - @override - async def run( - self, - *, - ctx: Context, - node_input: Any, - ) -> AsyncGenerator[Any, None]: - iteration_count = self.tracker.get('iteration_count', 0) + 1 - self.tracker['iteration_count'] = iteration_count - self.tracker.setdefault('attempt_counts', []).append(ctx.attempt_count) - - if iteration_count < self.succeed_on_iteration: - raise self.exception_to_raise - - yield Event( - output=self.message, - ) diff --git a/tox.ini b/tox.ini deleted file mode 100644 index b24ce38b6a..0000000000 --- a/tox.ini +++ /dev/null @@ -1,10 +0,0 @@ -[tox] -envlist = py310, py311, py312, py313, py314 -skipsdist = True - -[testenv] -description = Run unit tests -runner = uv-venv-lock-runner -extras = test -commands = - pytest tests/unittests From ba69174ee73ff1deaa2f44479f8d92a3518ee8a0 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Mon, 18 May 2026 18:12:18 -0700 Subject: [PATCH 13/94] chore: update runtime config PiperOrigin-RevId: 917525676 --- src/google/adk/cli/browser/assets/config/runtime-config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/google/adk/cli/browser/assets/config/runtime-config.json b/src/google/adk/cli/browser/assets/config/runtime-config.json index e2628ca7cd..c8f49d882d 100644 --- a/src/google/adk/cli/browser/assets/config/runtime-config.json +++ b/src/google/adk/cli/browser/assets/config/runtime-config.json @@ -1,3 +1,3 @@ { "backendUrl": "" -} +} \ No newline at end of file From abdbb3093bd010fb0c047d5ef75b0648962daa12 Mon Sep 17 00:00:00 2001 From: Kathy Wu Date: Tue, 19 May 2026 14:44:09 -0700 Subject: [PATCH 14/94] chore: Remove experimental tag from SkillToolset Co-authored-by: Kathy Wu PiperOrigin-RevId: 918037985 --- src/google/adk/features/_feature_registry.py | 2 +- src/google/adk/tools/bash_tool.py | 2 -- src/google/adk/tools/skill_toolset.py | 26 ++------------------ tests/unittests/tools/test_skill_toolset.py | 8 ------ 4 files changed, 3 insertions(+), 35 deletions(-) diff --git a/src/google/adk/features/_feature_registry.py b/src/google/adk/features/_feature_registry.py index b5f51f2825..a99a51b430 100644 --- a/src/google/adk/features/_feature_registry.py +++ b/src/google/adk/features/_feature_registry.py @@ -150,7 +150,7 @@ class FeatureConfig: FeatureStage.EXPERIMENTAL, default_on=True ), FeatureName.SKILL_TOOLSET: FeatureConfig( - FeatureStage.EXPERIMENTAL, default_on=True + FeatureStage.STABLE, default_on=True ), FeatureName.SPANNER_ADMIN_TOOLSET: FeatureConfig( FeatureStage.EXPERIMENTAL, default_on=True diff --git a/src/google/adk/tools/bash_tool.py b/src/google/adk/tools/bash_tool.py index 89de3bf34f..85575656af 100644 --- a/src/google/adk/tools/bash_tool.py +++ b/src/google/adk/tools/bash_tool.py @@ -29,7 +29,6 @@ from google.genai import types -from .. import features from .base_tool import BaseTool from .tool_context import ToolContext @@ -99,7 +98,6 @@ def _set_resource_limits(policy: BashToolPolicy) -> None: logger.warning("Failed to set resource limits: %s", e) -@features.experimental(features.FeatureName.SKILL_TOOLSET) class ExecuteBashTool(BaseTool): """Tool to execute a validated bash command within a workspace directory.""" diff --git a/src/google/adk/tools/skill_toolset.py b/src/google/adk/tools/skill_toolset.py index ef579d8256..18a894cdc2 100644 --- a/src/google/adk/tools/skill_toolset.py +++ b/src/google/adk/tools/skill_toolset.py @@ -25,7 +25,6 @@ import mimetypes from typing import Any from typing import TYPE_CHECKING -import warnings from google.genai import types from typing_extensions import override @@ -33,8 +32,6 @@ from ..agents.readonly_context import ReadonlyContext from ..code_executors.base_code_executor import BaseCodeExecutor from ..code_executors.code_execution_utils import CodeExecutionInput -from ..features import experimental -from ..features import FeatureName from ..skills import models from ..skills import prompt from ..skills import SkillRegistry @@ -58,7 +55,7 @@ " conversation history for you to analyze." ) -_DEFAULT_SKILL_SYSTEM_INSTRUCTION = ( +DEFAULT_SKILL_SYSTEM_INSTRUCTION = ( "You can use specialized 'skills' to help you with complex tasks. " "You MUST use the skill tools to interact with these skills.\n\n" "Skills are folders of instructions and resources that extend your " @@ -88,7 +85,6 @@ ) -@experimental(FeatureName.SKILL_TOOLSET) class ListSkillsTool(BaseTool): """Tool to list all available skills.""" @@ -118,7 +114,6 @@ async def run_async( return prompt.format_skills_as_xml(skills) -@experimental(FeatureName.SKILL_TOOLSET) class SearchSkillsTool(BaseTool): """Tool to search for relevant skills in the registry.""" @@ -181,7 +176,6 @@ async def run_async( } -@experimental(FeatureName.SKILL_TOOLSET) class LoadSkillTool(BaseTool): """Tool to load a skill's instructions.""" @@ -250,7 +244,6 @@ async def run_async( } -@experimental(FeatureName.SKILL_TOOLSET) class LoadSkillResourceTool(BaseTool): """Tool to load resources (references, assets, or scripts) from a skill.""" @@ -710,7 +703,6 @@ def _build_wrapper_code( return "\n".join(code_lines) -@experimental(FeatureName.SKILL_TOOLSET) class RunSkillScriptTool(BaseTool): """Tool to execute scripts from a skill's scripts/ directory.""" @@ -874,7 +866,6 @@ async def run_async( ) -@experimental(FeatureName.SKILL_TOOLSET) class SkillToolset(BaseToolset): """A toolset for managing and interacting with agent skills.""" @@ -1063,7 +1054,7 @@ async def process_llm_request( self, *, tool_context: ToolContext, llm_request: LlmRequest ) -> None: """Processes the outgoing LLM request to include available skills.""" - instructions = [_DEFAULT_SKILL_SYSTEM_INSTRUCTION] + instructions = [DEFAULT_SKILL_SYSTEM_INSTRUCTION] has_list_skills = any(isinstance(t, ListSkillsTool) for t in self._tools) @@ -1090,16 +1081,3 @@ async def close(self) -> None: cached.cancel() self._fetched_skill_cache.clear() await super().close() - - -def __getattr__(name: str) -> Any: - if name == "DEFAULT_SKILL_SYSTEM_INSTRUCTION": - warnings.warn( - "DEFAULT_SKILL_SYSTEM_INSTRUCTION is experimental. Its content " - "is internal implementation and will change in minor/patch releases " - "to tune agent performance.", - UserWarning, - stacklevel=2, - ) - return _DEFAULT_SKILL_SYSTEM_INSTRUCTION - raise AttributeError(f"module {__name__} has no attribute {name}") diff --git a/tests/unittests/tools/test_skill_toolset.py b/tests/unittests/tools/test_skill_toolset.py index f637377513..aca34c2523 100644 --- a/tests/unittests/tools/test_skill_toolset.py +++ b/tests/unittests/tools/test_skill_toolset.py @@ -471,14 +471,6 @@ async def test_process_llm_request_without_list_skills_tool( assert "skill2" in instructions[1] -def test_default_skill_system_instruction_warning(): - with pytest.warns( - UserWarning, match="DEFAULT_SKILL_SYSTEM_INSTRUCTION is experimental" - ): - instruction = skill_toolset.DEFAULT_SKILL_SYSTEM_INSTRUCTION - assert "specialized 'skills'" in instruction - - def test_duplicate_skill_name_raises(mock_skill1): skill_dup = mock.create_autospec(models.Skill, instance=True) skill_dup.name = "skill1" From ddc0d82640b2c5a04d84f2b3640f340b300e758c Mon Sep 17 00:00:00 2001 From: George Weale Date: Wed, 20 May 2026 09:50:20 -0700 Subject: [PATCH 15/94] fix(cli): add missing newline at end of runtime-config.json Co-authored-by: George Weale PiperOrigin-RevId: 918503151 --- src/google/adk/cli/browser/assets/config/runtime-config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/google/adk/cli/browser/assets/config/runtime-config.json b/src/google/adk/cli/browser/assets/config/runtime-config.json index c8f49d882d..e2628ca7cd 100644 --- a/src/google/adk/cli/browser/assets/config/runtime-config.json +++ b/src/google/adk/cli/browser/assets/config/runtime-config.json @@ -1,3 +1,3 @@ { "backendUrl": "" -} \ No newline at end of file +} From 8537cccc5d6df99e5ed32f9e8762a31f3f73a575 Mon Sep 17 00:00:00 2001 From: George Weale Date: Wed, 20 May 2026 10:58:17 -0700 Subject: [PATCH 16/94] fix(deps): pin yarl to <1.24 Co-authored-by: George Weale PiperOrigin-RevId: 918539981 --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 0e7c449b9f..cc6a045bc9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,6 +78,7 @@ dependencies = [ "uvicorn>=0.34,<1", # ASGI server for FastAPI "watchdog>=6,<7", # For file change detection and hot reload "websockets>=15.0.1,<16", # For BaseLlmFlow + "yarl<1.24", ] optional-dependencies.a2a = [ "a2a-sdk>=0.3.4,<0.4", From 8c7145b3cea3251424beb529dea293f7363dfc87 Mon Sep 17 00:00:00 2001 From: George Weale Date: Wed, 20 May 2026 11:21:46 -0700 Subject: [PATCH 17/94] fix: constrain Agent Builder roots and block file path escapes Co-authored-by: George Weale PiperOrigin-RevId: 918554005 --- src/google/adk/cli/adk_web_server.py | 87 +++++++++++++++++-- .../tools/write_config_files.py | 2 +- ...path_normalizer.py => _path_normalizer.py} | 22 ++++- .../utils/resolve_root_directory.py | 66 +++++++++----- tests/unittests/cli/test_fast_api.py | 81 +++++++++++++++++ 5 files changed, 229 insertions(+), 29 deletions(-) rename src/google/adk/cli/built_in_agents/utils/{path_normalizer.py => _path_normalizer.py} (73%) diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index 917aadf7d0..52a6937d2c 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -20,6 +20,7 @@ import json import logging import os +from pathlib import Path import re import sys import time @@ -98,6 +99,8 @@ from ..utils.context_utils import Aclosing from ..utils.feature_decorator import experimental from ..version import __version__ +from .built_in_agents.utils._path_normalizer import _sanitize_generated_file_path as sanitize_generated_file_path +from .built_in_agents.utils._path_normalizer import _to_posix_path as to_posix_path from .cli_eval import EVAL_SESSION_ID_PREFIX from .utils import cleanup from .utils import common @@ -235,6 +238,46 @@ def _is_request_origin_allowed( _SAFE_HTTP_METHODS = frozenset({"GET", "HEAD", "OPTIONS"}) +_AGENT_BUILDER_APP_NAME = "__adk_agent_builder_assistant" + + +def _normalize_agent_builder_state( + app_name: str, + state: Optional[dict[str, Any]], + agents_base_path: Path, +) -> Optional[dict[str, Any]]: + """Validate and normalize Agent Builder root_directory values.""" + if app_name != _AGENT_BUILDER_APP_NAME or state is None: + return state + + if "root_directory" not in state: + return state + + root_directory = state["root_directory"] + if not isinstance(root_directory, str): + raise InputValidationError("root_directory must be a string.") + + normalized_root = sanitize_generated_file_path(root_directory) + if not normalized_root: + raise InputValidationError("root_directory must not be empty.") + + root_path = to_posix_path(normalized_root) + if root_path.is_absolute(): + raise InputValidationError( + "root_directory for Agent Builder must be relative to the agents" + " directory." + ) + + resolved_root = (agents_base_path / Path(root_path)).resolve(strict=False) + if not resolved_root.is_relative_to(agents_base_path): + raise InputValidationError( + "root_directory for Agent Builder must stay within the agents" + " directory." + ) + + normalized_state = dict(state) + normalized_state["root_directory"] = str(resolved_root) + return normalized_state class _OriginCheckMiddleware: @@ -954,6 +997,7 @@ async def internal_lifespan(app: FastAPI): # Run the FastAPI server. app = FastAPI(lifespan=internal_lifespan) + agents_base_path = (Path.cwd() / self.agents_dir).resolve() has_configured_allowed_origins = bool(allow_origins) if allow_origins: @@ -1181,10 +1225,17 @@ async def create_session_with_id( session_id: str, state: Optional[dict[str, Any]] = None, ) -> Session: + try: + normalized_state = _normalize_agent_builder_state( + app_name, state, agents_base_path + ) + except InputValidationError as e: + raise HTTPException(status_code=400, detail=str(e)) from e + return await self._create_session( app_name=app_name, user_id=user_id, - state=state, + state=normalized_state, session_id=session_id, ) @@ -1200,10 +1251,17 @@ async def create_session( if not req: return await self._create_session(app_name=app_name, user_id=user_id) + try: + normalized_state = _normalize_agent_builder_state( + app_name, req.state, agents_base_path + ) + except InputValidationError as e: + raise HTTPException(status_code=400, detail=str(e)) from e + session = await self._create_session( app_name=app_name, user_id=user_id, - state=req.state, + state=normalized_state, session_id=req.session_id, ) @@ -1251,6 +1309,13 @@ async def update_session( if not session: raise HTTPException(status_code=404, detail="Session not found") + try: + state_delta = _normalize_agent_builder_state( + app_name, req.state_delta, agents_base_path + ) + except InputValidationError as e: + raise HTTPException(status_code=400, detail=str(e)) from e + # Create an event to record the state change import uuid @@ -1260,7 +1325,7 @@ async def update_session( state_update_event = Event( invocation_id="p-" + str(uuid.uuid4()), author="user", - actions=EventActions(state_delta=req.state_delta), + actions=EventActions(state_delta=state_delta), ) # Append the event to the session @@ -1892,13 +1957,19 @@ async def run_agent(req: RunAgentRequest) -> list[Event]: self.current_app_name_ref.value = req.app_name runner = await self.get_runner_async(req.app_name) _set_telemetry_context_if_needed(runner) + try: + state_delta = _normalize_agent_builder_state( + req.app_name, req.state_delta, agents_base_path + ) + except InputValidationError as e: + raise HTTPException(status_code=400, detail=str(e)) from e try: async with Aclosing( runner.run_async( user_id=req.user_id, session_id=req.session_id, new_message=req.new_message, - state_delta=req.state_delta, + state_delta=state_delta, invocation_id=req.invocation_id, ) ) as agen: @@ -1915,6 +1986,12 @@ async def run_agent_sse(req: RunAgentRequest) -> StreamingResponse: stream_mode = StreamingMode.SSE if req.streaming else StreamingMode.NONE runner = await self.get_runner_async(req.app_name) _set_telemetry_context_if_needed(runner) + try: + state_delta = _normalize_agent_builder_state( + req.app_name, req.state_delta, agents_base_path + ) + except InputValidationError as e: + raise HTTPException(status_code=400, detail=str(e)) from e # Validate session existence before starting the stream. # We check directly here instead of eagerly advancing the @@ -1941,7 +2018,7 @@ async def event_generator(): user_id=req.user_id, session_id=req.session_id, new_message=req.new_message, - state_delta=req.state_delta, + state_delta=state_delta, run_config=RunConfig(streaming_mode=stream_mode), invocation_id=req.invocation_id, ) diff --git a/src/google/adk/cli/built_in_agents/tools/write_config_files.py b/src/google/adk/cli/built_in_agents/tools/write_config_files.py index d998eaacba..344e78eba9 100644 --- a/src/google/adk/cli/built_in_agents/tools/write_config_files.py +++ b/src/google/adk/cli/built_in_agents/tools/write_config_files.py @@ -31,7 +31,7 @@ import yaml from ..utils import load_agent_config_schema -from ..utils.path_normalizer import sanitize_generated_file_path +from ..utils._path_normalizer import _sanitize_generated_file_path as sanitize_generated_file_path from ..utils.resolve_root_directory import resolve_file_path from .write_files import write_files diff --git a/src/google/adk/cli/built_in_agents/utils/path_normalizer.py b/src/google/adk/cli/built_in_agents/utils/_path_normalizer.py similarity index 73% rename from src/google/adk/cli/built_in_agents/utils/path_normalizer.py rename to src/google/adk/cli/built_in_agents/utils/_path_normalizer.py index ec634208a7..6a4f30d21f 100644 --- a/src/google/adk/cli/built_in_agents/utils/path_normalizer.py +++ b/src/google/adk/cli/built_in_agents/utils/_path_normalizer.py @@ -16,13 +16,15 @@ from __future__ import annotations +from pathlib import PurePosixPath +from pathlib import PureWindowsPath import re _SEGMENT_SPLIT_PATTERN = re.compile(r"([/\\])") _BOUNDARY_CHARS = " \t\r\n'\"`" -def sanitize_generated_file_path(file_path: str) -> str: +def _sanitize_generated_file_path(file_path: str) -> str: """Strip stray quotes/whitespace around each path segment. The agent occasionally emits quoted paths such as `'tools/web.yaml'` which @@ -58,3 +60,21 @@ def sanitize_generated_file_path(file_path: str) -> str: sanitized = "".join(sanitized_segments).strip(_BOUNDARY_CHARS) return sanitized or trimmed + + +def _to_posix_path(path_value: str) -> PurePosixPath: + """Normalize path separators by converting to a `PurePosixPath`. + + Interpret Windows-style paths while still running on POSIX systems so that + downstream traversal and validation logic operates on a consistent + separator. + + Args: + path_value: Raw path string that may contain backslashes. + + Returns: + A `PurePosixPath` with forward-slash separators. + """ + if "\\" in path_value: + path_value = PureWindowsPath(path_value).as_posix() + return PurePosixPath(path_value) diff --git a/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py b/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py index ca7398733f..4fff93f8ff 100644 --- a/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py +++ b/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py @@ -16,14 +16,16 @@ from __future__ import annotations -import os from pathlib import Path from typing import Any from typing import Dict from typing import List from typing import Optional -from .path_normalizer import sanitize_generated_file_path +from google.adk.errors.input_validation_error import InputValidationError + +from ._path_normalizer import _sanitize_generated_file_path as sanitize_generated_file_path +from ._path_normalizer import _to_posix_path as to_posix_path def resolve_file_path( @@ -43,32 +45,33 @@ def resolve_file_path( Returns: Resolved absolute Path object + + Raises: + InputValidationError: If the path resolves outside the configured root + directory. """ normalized_path = sanitize_generated_file_path(file_path) - file_path_obj = Path(normalized_path) - - # If already absolute, use as-is - if file_path_obj.is_absolute(): - return file_path_obj - - # Get root directory from session state, default to "./" - root_directory = "./" - if session_state and "root_directory" in session_state: - root_directory = session_state["root_directory"] + if not normalized_path: + raise InputValidationError("File path must not be empty.") - # Use the same resolution logic as the main function - root_path_obj = Path(root_directory) + resolved_root = _resolve_root_directory(session_state, working_directory) + pure_path = to_posix_path(normalized_path) + candidate_path = Path(pure_path) - if root_path_obj.is_absolute(): - resolved_root = root_path_obj + if candidate_path.is_absolute(): + resolved_path = candidate_path.resolve(strict=False) else: - if working_directory: - resolved_root = Path(working_directory) / root_directory - else: - resolved_root = Path(os.getcwd()) / root_directory + resolved_path = (resolved_root / candidate_path).resolve(strict=False) + + try: + resolved_path.relative_to(resolved_root) + except ValueError as exc: + raise InputValidationError( + f"File path {file_path!r} resolves outside root directory" + f" {resolved_root}" + ) from exc - # Resolve file path relative to root directory - return resolved_root / file_path_obj + return resolved_path def resolve_file_paths( @@ -90,3 +93,22 @@ def resolve_file_paths( resolve_file_path(path, session_state, working_directory) for path in file_paths ] + + +def _resolve_root_directory( + session_state: Optional[Dict[str, Any]] = None, + working_directory: Optional[str] = None, +) -> Path: + """Resolve the effective root directory for built-in agent file tools.""" + root_directory = "./" + if session_state and "root_directory" in session_state: + root_directory = str(session_state["root_directory"]) + + normalized_root = sanitize_generated_file_path(root_directory) or "./" + root_path_obj = Path(to_posix_path(normalized_root)) + + if root_path_obj.is_absolute(): + return root_path_obj.resolve(strict=False) + + base_directory = Path(working_directory) if working_directory else Path.cwd() + return (base_directory / root_path_obj).resolve(strict=False) diff --git a/tests/unittests/cli/test_fast_api.py b/tests/unittests/cli/test_fast_api.py index 63392d1fd1..febbcdce18 100755 --- a/tests/unittests/cli/test_fast_api.py +++ b/tests/unittests/cli/test_fast_api.py @@ -1167,6 +1167,87 @@ def test_create_session_without_id(test_app, test_session_info): logger.info(f"Created session with generated ID: {data['id']}") +def test_agent_builder_create_session_normalizes_root_directory( + builder_test_client, tmp_path: Path +): + """Test Agent Builder session creation scopes root_directory to agents_dir.""" + response = builder_test_client.post( + "/apps/__adk_agent_builder_assistant/users/user/sessions", + json={"state": {"root_directory": "sample_app/tmp/sample_app"}}, + ) + + assert response.status_code == 200 + data = response.json() + assert data["state"]["root_directory"] == str( + (tmp_path / "sample_app" / "tmp" / "sample_app").resolve() + ) + + +@pytest.mark.parametrize( + "root_directory", + ["'../outside'", '"../outside"', "`../outside`"], +) +def test_agent_builder_create_session_rejects_quoted_root_directory_escape( + builder_test_client, + root_directory: str, +): + """Test Agent Builder session creation rejects quoted root escapes.""" + response = builder_test_client.post( + "/apps/__adk_agent_builder_assistant/users/user/sessions", + json={"state": {"root_directory": root_directory}}, + ) + + assert response.status_code == 400 + assert "must stay within the agents directory" in response.json()["detail"] + + +def test_agent_builder_update_session_rejects_root_directory_escape( + builder_test_client, +): + """Test Agent Builder session updates reject escaped root_directory values.""" + session_response = builder_test_client.post( + "/apps/__adk_agent_builder_assistant/users/user/sessions/session-1", + json={"state": {}}, + ) + assert session_response.status_code == 200 + + response = builder_test_client.patch( + "/apps/__adk_agent_builder_assistant/users/user/sessions/session-1", + json={"state_delta": {"root_directory": "../outside"}}, + ) + + assert response.status_code == 400 + assert "must stay within the agents directory" in response.json()["detail"] + + +def test_agent_builder_run_rejects_root_directory_escape( + builder_test_client, +): + """Test Agent Builder runs reject escaped root_directory values.""" + session_response = builder_test_client.post( + "/apps/__adk_agent_builder_assistant/users/user/sessions/session-2", + json={"state": {}}, + ) + assert session_response.status_code == 200 + + response = builder_test_client.post( + "/run", + json={ + "app_name": "__adk_agent_builder_assistant", + "user_id": "user", + "session_id": "session-2", + "new_message": { + "role": "user", + "parts": [{"text": "hello"}], + }, + "state_delta": {"root_directory": "../outside"}, + }, + ) + + assert response.status_code == 400 + assert "must stay within the agents directory" in response.json()["detail"] + + def test_get_session(test_app, create_test_session): """Test retrieving a session by ID.""" info = create_test_session From ffef2d92ccfa29c1249e185a799e71299616a577 Mon Sep 17 00:00:00 2001 From: George Weale Date: Wed, 20 May 2026 11:26:18 -0700 Subject: [PATCH 18/94] fix(flows): preserve transparent config on live session reconnect When session resumption triggers a reconnect, ADK previously forced transparent=True on the configuration. This caused a ValueError when using the Gemini API backend, as the google-genai SDK explicitly rejects transparent=True. This change ensures we only set transparent=True when creating a fresh SessionResumptionConfig, preserving the user's configuration if provided. Close #5675 Co-authored-by: George Weale PiperOrigin-RevId: 918556873 --- .../adk/flows/llm_flows/base_llm_flow.py | 15 +- .../flows/llm_flows/test_base_llm_flow.py | 156 ++++++++++++++++-- 2 files changed, 158 insertions(+), 13 deletions(-) diff --git a/src/google/adk/flows/llm_flows/base_llm_flow.py b/src/google/adk/flows/llm_flows/base_llm_flow.py index db897637c3..b1f5fb1e8a 100644 --- a/src/google/adk/flows/llm_flows/base_llm_flow.py +++ b/src/google/adk/flows/llm_flows/base_llm_flow.py @@ -39,6 +39,8 @@ from ...auth.auth_tool import AuthConfig from ...events.event import Event from ...models.base_llm_connection import BaseLlmConnection +from ...models.google_llm import Gemini +from ...models.google_llm import GoogleLLMVariant from ...models.llm_request import LlmRequest from ...models.llm_response import LlmResponse from ...telemetry import tracing @@ -514,7 +516,18 @@ async def run_live( llm_request.live_connect_config.session_resumption.handle = ( invocation_context.live_session_resumption_handle ) - llm_request.live_connect_config.session_resumption.transparent = True + + # Only set transparent=True for Vertex AI backend, as the Gemini API + # backend explicitly rejects it. + if ( + isinstance(llm, Gemini) + and llm._api_backend == GoogleLLMVariant.VERTEX_AI # pylint: disable=protected-access + ): + session_resumption = ( + llm_request.live_connect_config.session_resumption + ) + if session_resumption.transparent is None: + session_resumption.transparent = True logger.info( 'Establishing live connection for agent: %s', diff --git a/tests/unittests/flows/llm_flows/test_base_llm_flow.py b/tests/unittests/flows/llm_flows/test_base_llm_flow.py index ce2e83b6f7..cb60e7f1f6 100644 --- a/tests/unittests/flows/llm_flows/test_base_llm_flow.py +++ b/tests/unittests/flows/llm_flows/test_base_llm_flow.py @@ -17,6 +17,7 @@ from unittest import mock from unittest.mock import AsyncMock +from google.adk.agents.live_request_queue import LiveRequestQueue from google.adk.agents.llm_agent import Agent from google.adk.agents.run_config import RunConfig from google.adk.events.event import Event @@ -30,6 +31,7 @@ from google.adk.tools.google_search_tool import GoogleSearchTool from google.genai import types import pytest +from websockets.exceptions import ConnectionClosed from ... import testing_utils @@ -490,8 +492,6 @@ async def call(self, **kwargs): @pytest.mark.asyncio async def test_run_live_reconnects_on_connection_closed(): """Test that run_live reconnects when ConnectionClosed occurs.""" - from google.adk.agents.live_request_queue import LiveRequestQueue - from websockets.exceptions import ConnectionClosed real_model = Gemini() mock_connection = mock.AsyncMock() @@ -558,7 +558,6 @@ async def mock_receive_2(): @pytest.mark.asyncio async def test_run_live_reconnects_on_api_error(): """Test that run_live reconnects when APIError occurs.""" - from google.adk.agents.live_request_queue import LiveRequestQueue from google.genai.errors import APIError real_model = Gemini() @@ -626,7 +625,6 @@ async def mock_receive_2(): @pytest.mark.asyncio async def test_run_live_skips_send_history_on_resumption(): """Test that run_live skips send_history when resuming a session.""" - from google.adk.agents.live_request_queue import LiveRequestQueue real_model = Gemini() mock_connection = mock.AsyncMock() @@ -684,7 +682,6 @@ async def mock_receive(): @pytest.mark.asyncio async def test_live_session_resumption_go_away(): """Test that go_away triggers reconnection.""" - from google.adk.agents.live_request_queue import LiveRequestQueue real_model = Gemini() mock_connection = mock.AsyncMock() @@ -743,8 +740,6 @@ async def mock_receive_2(): @pytest.mark.asyncio async def test_run_live_no_reconnect_without_handle(): """Test that run_live does not reconnect when handle is missing.""" - from google.adk.agents.live_request_queue import LiveRequestQueue - from websockets.exceptions import ConnectionClosed real_model = Gemini() mock_connection = mock.AsyncMock() @@ -786,8 +781,6 @@ async def mock_receive(): @pytest.mark.asyncio async def test_run_live_reconnect_limit(): """Test that run_live stops reconnecting after 5 attempts.""" - from google.adk.agents.live_request_queue import LiveRequestQueue - from websockets.exceptions import ConnectionClosed real_model = Gemini() @@ -843,9 +836,7 @@ async def mock_receive(): @pytest.mark.asyncio async def test_run_live_reconnect_reset_attempt(): """Test that attempt counter is reset on successful communication.""" - from google.adk.agents.live_request_queue import LiveRequestQueue from google.adk.flows.llm_flows.base_llm_flow import DEFAULT_MAX_RECONNECT_ATTEMPTS - from websockets.exceptions import ConnectionClosed real_model = Gemini() @@ -987,7 +978,6 @@ async def mock_receive(): @pytest.mark.asyncio async def test_run_live_clears_resumption_handle_on_transfer(): """Test that run_live clears session resumption handles when transferring to another agent.""" - from google.adk.agents.live_request_queue import LiveRequestQueue agent = Agent(name='test_agent') invocation_context = await testing_utils.create_invocation_context( @@ -1069,3 +1059,145 @@ async def mock_run_live_sub_agent(child_ctx, *args, **kwargs): assert ( invocation_context.run_config.session_resumption.handle == 'test_handle' ) + + +@pytest.mark.asyncio +async def test_run_live_reconnect_does_not_set_transparent(): + """Test that run_live reconnect does not set transparent=True.""" + + real_model = Gemini() + mock_connection = mock.AsyncMock() + + async def mock_receive(): + yield LlmResponse( + live_session_resumption_update=types.LiveServerSessionResumptionUpdate( + new_handle='test_handle' + ) + ) + raise ConnectionClosed(None, None) + + mock_connection.receive = mock.Mock(side_effect=mock_receive) + + agent = Agent(name='test_agent', model=real_model) + invocation_context = await testing_utils.create_invocation_context( + agent=agent + ) + invocation_context.live_request_queue = LiveRequestQueue() + invocation_context.run_config = RunConfig() + + flow = BaseLlmFlowForTesting() + + with mock.patch.object(flow, '_send_to_model', new_callable=AsyncMock): + + async def mock_preprocess(ctx, req): + req.live_connect_config.session_resumption = ( + ctx.run_config.session_resumption + ) + yield Event(id=Event.new_id(), author='test') + + with mock.patch.object( + flow, '_preprocess_async', side_effect=mock_preprocess + ): + mock_connection_2 = mock.AsyncMock() + + class StopTestError(Exception): + pass + + async def mock_receive_2(): + yield LlmResponse( + content=types.Content(parts=[types.Part.from_text(text='hi')]) + ) + raise StopTestError('stop') + + mock_connection_2.receive = mock.Mock(side_effect=mock_receive_2) + + mock_aenter = mock.AsyncMock() + mock_aenter.side_effect = [mock_connection, mock_connection_2] + + with mock.patch( + 'google.adk.models.google_llm.Gemini.connect' + ) as mock_connect: + mock_connect.return_value.__aenter__ = mock_aenter + + try: + async for _ in flow.run_live(invocation_context): + pass + except StopTestError: + pass + + assert mock_connect.call_count == 2 + second_call_req = mock_connect.call_args_list[1][0][0] + session_resump = second_call_req.live_connect_config.session_resumption + assert session_resump.transparent is None + + +@pytest.mark.asyncio +async def test_run_live_reconnect_sets_transparent_for_vertex(): + """Test that run_live reconnect sets transparent=True for vertex backend.""" + + real_model = Gemini( + model='projects/test-project/locations/us-central1/publishers/google/models/gemini-2.0-flash-exp' + ) + mock_connection = mock.AsyncMock() + + async def mock_receive(): + yield LlmResponse( + live_session_resumption_update=types.LiveServerSessionResumptionUpdate( + new_handle='test_handle' + ) + ) + raise ConnectionClosed(None, None) + + mock_connection.receive = mock.Mock(side_effect=mock_receive) + + agent = Agent(name='test_agent', model=real_model) + invocation_context = await testing_utils.create_invocation_context( + agent=agent + ) + invocation_context.live_request_queue = LiveRequestQueue() + invocation_context.run_config = RunConfig() + + flow = BaseLlmFlowForTesting() + + with mock.patch.object(flow, '_send_to_model', new_callable=AsyncMock): + + async def mock_preprocess(ctx, req): + req.live_connect_config.session_resumption = ( + ctx.run_config.session_resumption + ) + yield Event(id=Event.new_id(), author='test') + + with mock.patch.object( + flow, '_preprocess_async', side_effect=mock_preprocess + ): + mock_connection_2 = mock.AsyncMock() + + class StopTestError(Exception): + pass + + async def mock_receive_2(): + yield LlmResponse( + content=types.Content(parts=[types.Part.from_text(text='hi')]) + ) + raise StopTestError('stop') + + mock_connection_2.receive = mock.Mock(side_effect=mock_receive_2) + + mock_aenter = mock.AsyncMock() + mock_aenter.side_effect = [mock_connection, mock_connection_2] + + with mock.patch( + 'google.adk.models.google_llm.Gemini.connect' + ) as mock_connect: + mock_connect.return_value.__aenter__ = mock_aenter + + try: + async for _ in flow.run_live(invocation_context): + pass + except StopTestError: + pass + + assert mock_connect.call_count == 2 + second_call_req = mock_connect.call_args_list[1][0][0] + session_resump = second_call_req.live_connect_config.session_resumption + assert session_resump.transparent From 1a356ef937910feda2cea3d9b63be40f15b2d727 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Wed, 20 May 2026 13:01:20 -0700 Subject: [PATCH 19/94] fix: constrain Agent Builder roots and block file path escapes PiperOrigin-RevId: 918607813 --- src/google/adk/cli/adk_web_server.py | 87 ++----------------- .../tools/write_config_files.py | 2 +- ..._path_normalizer.py => path_normalizer.py} | 22 +---- .../utils/resolve_root_directory.py | 66 +++++--------- tests/unittests/cli/test_fast_api.py | 81 ----------------- 5 files changed, 29 insertions(+), 229 deletions(-) rename src/google/adk/cli/built_in_agents/utils/{_path_normalizer.py => path_normalizer.py} (73%) diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index 52a6937d2c..917aadf7d0 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -20,7 +20,6 @@ import json import logging import os -from pathlib import Path import re import sys import time @@ -99,8 +98,6 @@ from ..utils.context_utils import Aclosing from ..utils.feature_decorator import experimental from ..version import __version__ -from .built_in_agents.utils._path_normalizer import _sanitize_generated_file_path as sanitize_generated_file_path -from .built_in_agents.utils._path_normalizer import _to_posix_path as to_posix_path from .cli_eval import EVAL_SESSION_ID_PREFIX from .utils import cleanup from .utils import common @@ -238,46 +235,6 @@ def _is_request_origin_allowed( _SAFE_HTTP_METHODS = frozenset({"GET", "HEAD", "OPTIONS"}) -_AGENT_BUILDER_APP_NAME = "__adk_agent_builder_assistant" - - -def _normalize_agent_builder_state( - app_name: str, - state: Optional[dict[str, Any]], - agents_base_path: Path, -) -> Optional[dict[str, Any]]: - """Validate and normalize Agent Builder root_directory values.""" - if app_name != _AGENT_BUILDER_APP_NAME or state is None: - return state - - if "root_directory" not in state: - return state - - root_directory = state["root_directory"] - if not isinstance(root_directory, str): - raise InputValidationError("root_directory must be a string.") - - normalized_root = sanitize_generated_file_path(root_directory) - if not normalized_root: - raise InputValidationError("root_directory must not be empty.") - - root_path = to_posix_path(normalized_root) - if root_path.is_absolute(): - raise InputValidationError( - "root_directory for Agent Builder must be relative to the agents" - " directory." - ) - - resolved_root = (agents_base_path / Path(root_path)).resolve(strict=False) - if not resolved_root.is_relative_to(agents_base_path): - raise InputValidationError( - "root_directory for Agent Builder must stay within the agents" - " directory." - ) - - normalized_state = dict(state) - normalized_state["root_directory"] = str(resolved_root) - return normalized_state class _OriginCheckMiddleware: @@ -997,7 +954,6 @@ async def internal_lifespan(app: FastAPI): # Run the FastAPI server. app = FastAPI(lifespan=internal_lifespan) - agents_base_path = (Path.cwd() / self.agents_dir).resolve() has_configured_allowed_origins = bool(allow_origins) if allow_origins: @@ -1225,17 +1181,10 @@ async def create_session_with_id( session_id: str, state: Optional[dict[str, Any]] = None, ) -> Session: - try: - normalized_state = _normalize_agent_builder_state( - app_name, state, agents_base_path - ) - except InputValidationError as e: - raise HTTPException(status_code=400, detail=str(e)) from e - return await self._create_session( app_name=app_name, user_id=user_id, - state=normalized_state, + state=state, session_id=session_id, ) @@ -1251,17 +1200,10 @@ async def create_session( if not req: return await self._create_session(app_name=app_name, user_id=user_id) - try: - normalized_state = _normalize_agent_builder_state( - app_name, req.state, agents_base_path - ) - except InputValidationError as e: - raise HTTPException(status_code=400, detail=str(e)) from e - session = await self._create_session( app_name=app_name, user_id=user_id, - state=normalized_state, + state=req.state, session_id=req.session_id, ) @@ -1309,13 +1251,6 @@ async def update_session( if not session: raise HTTPException(status_code=404, detail="Session not found") - try: - state_delta = _normalize_agent_builder_state( - app_name, req.state_delta, agents_base_path - ) - except InputValidationError as e: - raise HTTPException(status_code=400, detail=str(e)) from e - # Create an event to record the state change import uuid @@ -1325,7 +1260,7 @@ async def update_session( state_update_event = Event( invocation_id="p-" + str(uuid.uuid4()), author="user", - actions=EventActions(state_delta=state_delta), + actions=EventActions(state_delta=req.state_delta), ) # Append the event to the session @@ -1957,19 +1892,13 @@ async def run_agent(req: RunAgentRequest) -> list[Event]: self.current_app_name_ref.value = req.app_name runner = await self.get_runner_async(req.app_name) _set_telemetry_context_if_needed(runner) - try: - state_delta = _normalize_agent_builder_state( - req.app_name, req.state_delta, agents_base_path - ) - except InputValidationError as e: - raise HTTPException(status_code=400, detail=str(e)) from e try: async with Aclosing( runner.run_async( user_id=req.user_id, session_id=req.session_id, new_message=req.new_message, - state_delta=state_delta, + state_delta=req.state_delta, invocation_id=req.invocation_id, ) ) as agen: @@ -1986,12 +1915,6 @@ async def run_agent_sse(req: RunAgentRequest) -> StreamingResponse: stream_mode = StreamingMode.SSE if req.streaming else StreamingMode.NONE runner = await self.get_runner_async(req.app_name) _set_telemetry_context_if_needed(runner) - try: - state_delta = _normalize_agent_builder_state( - req.app_name, req.state_delta, agents_base_path - ) - except InputValidationError as e: - raise HTTPException(status_code=400, detail=str(e)) from e # Validate session existence before starting the stream. # We check directly here instead of eagerly advancing the @@ -2018,7 +1941,7 @@ async def event_generator(): user_id=req.user_id, session_id=req.session_id, new_message=req.new_message, - state_delta=state_delta, + state_delta=req.state_delta, run_config=RunConfig(streaming_mode=stream_mode), invocation_id=req.invocation_id, ) diff --git a/src/google/adk/cli/built_in_agents/tools/write_config_files.py b/src/google/adk/cli/built_in_agents/tools/write_config_files.py index 344e78eba9..d998eaacba 100644 --- a/src/google/adk/cli/built_in_agents/tools/write_config_files.py +++ b/src/google/adk/cli/built_in_agents/tools/write_config_files.py @@ -31,7 +31,7 @@ import yaml from ..utils import load_agent_config_schema -from ..utils._path_normalizer import _sanitize_generated_file_path as sanitize_generated_file_path +from ..utils.path_normalizer import sanitize_generated_file_path from ..utils.resolve_root_directory import resolve_file_path from .write_files import write_files diff --git a/src/google/adk/cli/built_in_agents/utils/_path_normalizer.py b/src/google/adk/cli/built_in_agents/utils/path_normalizer.py similarity index 73% rename from src/google/adk/cli/built_in_agents/utils/_path_normalizer.py rename to src/google/adk/cli/built_in_agents/utils/path_normalizer.py index 6a4f30d21f..ec634208a7 100644 --- a/src/google/adk/cli/built_in_agents/utils/_path_normalizer.py +++ b/src/google/adk/cli/built_in_agents/utils/path_normalizer.py @@ -16,15 +16,13 @@ from __future__ import annotations -from pathlib import PurePosixPath -from pathlib import PureWindowsPath import re _SEGMENT_SPLIT_PATTERN = re.compile(r"([/\\])") _BOUNDARY_CHARS = " \t\r\n'\"`" -def _sanitize_generated_file_path(file_path: str) -> str: +def sanitize_generated_file_path(file_path: str) -> str: """Strip stray quotes/whitespace around each path segment. The agent occasionally emits quoted paths such as `'tools/web.yaml'` which @@ -60,21 +58,3 @@ def _sanitize_generated_file_path(file_path: str) -> str: sanitized = "".join(sanitized_segments).strip(_BOUNDARY_CHARS) return sanitized or trimmed - - -def _to_posix_path(path_value: str) -> PurePosixPath: - """Normalize path separators by converting to a `PurePosixPath`. - - Interpret Windows-style paths while still running on POSIX systems so that - downstream traversal and validation logic operates on a consistent - separator. - - Args: - path_value: Raw path string that may contain backslashes. - - Returns: - A `PurePosixPath` with forward-slash separators. - """ - if "\\" in path_value: - path_value = PureWindowsPath(path_value).as_posix() - return PurePosixPath(path_value) diff --git a/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py b/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py index 4fff93f8ff..ca7398733f 100644 --- a/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py +++ b/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py @@ -16,16 +16,14 @@ from __future__ import annotations +import os from pathlib import Path from typing import Any from typing import Dict from typing import List from typing import Optional -from google.adk.errors.input_validation_error import InputValidationError - -from ._path_normalizer import _sanitize_generated_file_path as sanitize_generated_file_path -from ._path_normalizer import _to_posix_path as to_posix_path +from .path_normalizer import sanitize_generated_file_path def resolve_file_path( @@ -45,33 +43,32 @@ def resolve_file_path( Returns: Resolved absolute Path object - - Raises: - InputValidationError: If the path resolves outside the configured root - directory. """ normalized_path = sanitize_generated_file_path(file_path) - if not normalized_path: - raise InputValidationError("File path must not be empty.") + file_path_obj = Path(normalized_path) - resolved_root = _resolve_root_directory(session_state, working_directory) - pure_path = to_posix_path(normalized_path) - candidate_path = Path(pure_path) + # If already absolute, use as-is + if file_path_obj.is_absolute(): + return file_path_obj - if candidate_path.is_absolute(): - resolved_path = candidate_path.resolve(strict=False) - else: - resolved_path = (resolved_root / candidate_path).resolve(strict=False) + # Get root directory from session state, default to "./" + root_directory = "./" + if session_state and "root_directory" in session_state: + root_directory = session_state["root_directory"] - try: - resolved_path.relative_to(resolved_root) - except ValueError as exc: - raise InputValidationError( - f"File path {file_path!r} resolves outside root directory" - f" {resolved_root}" - ) from exc + # Use the same resolution logic as the main function + root_path_obj = Path(root_directory) - return resolved_path + if root_path_obj.is_absolute(): + resolved_root = root_path_obj + else: + if working_directory: + resolved_root = Path(working_directory) / root_directory + else: + resolved_root = Path(os.getcwd()) / root_directory + + # Resolve file path relative to root directory + return resolved_root / file_path_obj def resolve_file_paths( @@ -93,22 +90,3 @@ def resolve_file_paths( resolve_file_path(path, session_state, working_directory) for path in file_paths ] - - -def _resolve_root_directory( - session_state: Optional[Dict[str, Any]] = None, - working_directory: Optional[str] = None, -) -> Path: - """Resolve the effective root directory for built-in agent file tools.""" - root_directory = "./" - if session_state and "root_directory" in session_state: - root_directory = str(session_state["root_directory"]) - - normalized_root = sanitize_generated_file_path(root_directory) or "./" - root_path_obj = Path(to_posix_path(normalized_root)) - - if root_path_obj.is_absolute(): - return root_path_obj.resolve(strict=False) - - base_directory = Path(working_directory) if working_directory else Path.cwd() - return (base_directory / root_path_obj).resolve(strict=False) diff --git a/tests/unittests/cli/test_fast_api.py b/tests/unittests/cli/test_fast_api.py index febbcdce18..63392d1fd1 100755 --- a/tests/unittests/cli/test_fast_api.py +++ b/tests/unittests/cli/test_fast_api.py @@ -1167,87 +1167,6 @@ def test_create_session_without_id(test_app, test_session_info): logger.info(f"Created session with generated ID: {data['id']}") -def test_agent_builder_create_session_normalizes_root_directory( - builder_test_client, tmp_path: Path -): - """Test Agent Builder session creation scopes root_directory to agents_dir.""" - response = builder_test_client.post( - "/apps/__adk_agent_builder_assistant/users/user/sessions", - json={"state": {"root_directory": "sample_app/tmp/sample_app"}}, - ) - - assert response.status_code == 200 - data = response.json() - assert data["state"]["root_directory"] == str( - (tmp_path / "sample_app" / "tmp" / "sample_app").resolve() - ) - - -@pytest.mark.parametrize( - "root_directory", - ["'../outside'", '"../outside"', "`../outside`"], -) -def test_agent_builder_create_session_rejects_quoted_root_directory_escape( - builder_test_client, - root_directory: str, -): - """Test Agent Builder session creation rejects quoted root escapes.""" - response = builder_test_client.post( - "/apps/__adk_agent_builder_assistant/users/user/sessions", - json={"state": {"root_directory": root_directory}}, - ) - - assert response.status_code == 400 - assert "must stay within the agents directory" in response.json()["detail"] - - -def test_agent_builder_update_session_rejects_root_directory_escape( - builder_test_client, -): - """Test Agent Builder session updates reject escaped root_directory values.""" - session_response = builder_test_client.post( - "/apps/__adk_agent_builder_assistant/users/user/sessions/session-1", - json={"state": {}}, - ) - assert session_response.status_code == 200 - - response = builder_test_client.patch( - "/apps/__adk_agent_builder_assistant/users/user/sessions/session-1", - json={"state_delta": {"root_directory": "../outside"}}, - ) - - assert response.status_code == 400 - assert "must stay within the agents directory" in response.json()["detail"] - - -def test_agent_builder_run_rejects_root_directory_escape( - builder_test_client, -): - """Test Agent Builder runs reject escaped root_directory values.""" - session_response = builder_test_client.post( - "/apps/__adk_agent_builder_assistant/users/user/sessions/session-2", - json={"state": {}}, - ) - assert session_response.status_code == 200 - - response = builder_test_client.post( - "/run", - json={ - "app_name": "__adk_agent_builder_assistant", - "user_id": "user", - "session_id": "session-2", - "new_message": { - "role": "user", - "parts": [{"text": "hello"}], - }, - "state_delta": {"root_directory": "../outside"}, - }, - ) - - assert response.status_code == 400 - assert "must stay within the agents directory" in response.json()["detail"] - - def test_get_session(test_app, create_test_session): """Test retrieving a session by ID.""" info = create_test_session From cde8156c3d183bc6062e5b92b2c81b3cb0afa12a Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Thu, 21 May 2026 10:45:17 -0700 Subject: [PATCH 20/94] feat: Add support for creating sandboxes from templates and snapshots PiperOrigin-RevId: 919136502 --- .../samples/sandbox_computer_use/agent.py | 7 +++ .../samples/sandbox_computer_use/main.py | 3 + .../integrations/vmaas/sandbox_computer.py | 60 ++++++++++++++----- 3 files changed, 54 insertions(+), 16 deletions(-) diff --git a/contributing/samples/sandbox_computer_use/agent.py b/contributing/samples/sandbox_computer_use/agent.py index b95dbad89a..f559dc167f 100644 --- a/contributing/samples/sandbox_computer_use/agent.py +++ b/contributing/samples/sandbox_computer_use/agent.py @@ -24,6 +24,8 @@ - GOOGLE_CLOUD_PROJECT: Your GCP project ID - VMAAS_SERVICE_ACCOUNT: Your service account email - VMAAS_SANDBOX_NAME: (Optional) Existing sandbox resource name for BYOS mode + - VMAAS_SANDBOX_TEMPLATE_NAME: (Optional) Sandbox template name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) + - VMAAS_SANDBOX_SNAPSHOT_NAME: (Optional) Sandbox snapshot name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) Usage: # Run via ADK web UI @@ -53,12 +55,17 @@ SANDBOX_NAME = os.environ.get("SANDBOX_NAME") or os.environ.get( "VMAAS_SANDBOX_NAME" ) +SANDBOX_TEMPLATE_NAME = os.environ.get("VMAAS_SANDBOX_TEMPLATE_NAME") +SANDBOX_SNAPSHOT_NAME = os.environ.get("VMAAS_SANDBOX_SNAPSHOT_NAME") + # Create the sandbox computer sandbox_computer = AgentEngineSandboxComputer( project_id=PROJECT_ID, service_account_email=SERVICE_ACCOUNT, sandbox_name=SANDBOX_NAME, + sandbox_template_name=SANDBOX_TEMPLATE_NAME, + sandbox_snapshot_name=SANDBOX_SNAPSHOT_NAME, search_engine_url="https://www.google.com", ) diff --git a/contributing/samples/sandbox_computer_use/main.py b/contributing/samples/sandbox_computer_use/main.py index e6c60bc298..19fbd8a517 100644 --- a/contributing/samples/sandbox_computer_use/main.py +++ b/contributing/samples/sandbox_computer_use/main.py @@ -22,6 +22,9 @@ - GOOGLE_CLOUD_PROJECT: Your GCP project ID - VMAAS_SERVICE_ACCOUNT: Your service account email with roles/iam.serviceAccountTokenCreator permission + - VMAAS_SANDBOX_NAME: (Optional) Existing sandbox resource name for BYOS mode + - VMAAS_SANDBOX_TEMPLATE_NAME: (Optional) Sandbox template name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) + - VMAAS_SANDBOX_SNAPSHOT_NAME: (Optional) Sandbox snapshot name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) Usage: cd contributing/samples diff --git a/src/google/adk/integrations/vmaas/sandbox_computer.py b/src/google/adk/integrations/vmaas/sandbox_computer.py index 1dd38e0ac7..9c1c9d68d7 100644 --- a/src/google/adk/integrations/vmaas/sandbox_computer.py +++ b/src/google/adk/integrations/vmaas/sandbox_computer.py @@ -90,6 +90,8 @@ def __init__( location: str = "us-central1", service_account_email: str | None = None, sandbox_name: str | None = None, + sandbox_template_name: str | None = None, + sandbox_snapshot_name: str | None = None, sandbox_ttl_seconds: int = 3600, search_engine_url: str = "https://www.google.com", vertexai_client: "vertexai.Client | None" = None, @@ -97,25 +99,36 @@ def __init__( """Initialize the sandbox computer. Args: - project_id: GCP project ID. If None, uses Application Default - Credentials project. + project_id: GCP project ID. If None, uses Application Default Credentials + project. location: Vertex AI location (default: us-central1). - service_account_email: Service account email for token generation. - Must have roles/iam.serviceAccountTokenCreator permission. - If None, attempts to use ADC service account. - sandbox_name: Existing sandbox resource name (BYOS mode). If provided, - the agent engine name is extracted from it. If None, creates new - agent engine and sandbox on demand. - Format: projects/{project}/locations/{location}/reasoningEngines/{id}/sandboxEnvironments/{id} + service_account_email: Service account email for token generation. Must + have roles/iam.serviceAccountTokenCreator permission. If None, attempts + to use ADC service account. + sandbox_name: Existing sandbox resource name (BYOS mode). If provided, the + agent engine name is extracted from it. If None, creates new agent + engine and sandbox on demand. + Format: + projects/{project}/locations/{location}/reasoningEngines/{id}/sandboxEnvironments/{id} + sandbox_template_name: Sandbox template resource name to use for creating + new sandboxes. Templates allow faster creation and custom environments. + Format: + projects/{project}/locations/{location}/sandboxEnvironmentTemplates/{id} + sandbox_snapshot_name: Sandbox snapshot resource name to use for restoring + sandbox state, enabling faster startup. + Format: + projects/{project}/locations/{location}/reasoningEngines/{id}/sandboxEnvironmentSnapshots/{id} sandbox_ttl_seconds: TTL for auto-created sandboxes (default: 1 hour). search_engine_url: URL to navigate to for search() method. - vertexai_client: Optional Vertex AI client instance. If None, creates - one lazily using project_id and location. + vertexai_client: Optional Vertex AI client instance. If None, creates one + lazily using project_id and location. """ self._project_id = project_id self._location = location self._service_account_email = service_account_email self._sandbox_name = sandbox_name + self._sandbox_template_name = sandbox_template_name + self._sandbox_snapshot_name = sandbox_snapshot_name self._sandbox_ttl_seconds = sandbox_ttl_seconds self._search_engine_url = search_engine_url self._screen_size = (1280, 720) @@ -210,13 +223,29 @@ async def _get_sandbox(self) -> tuple[str, Any]: from vertexai import types + config = { + "display_name": "adk_computer_use_sandbox", + } + spec = None + if self._sandbox_template_name: + config["sandbox_environment_template"] = self._sandbox_template_name + logger.info( + "Creating sandbox from template: %s", self._sandbox_template_name + ) + elif self._sandbox_snapshot_name: + config["sandbox_environment_snapshot"] = self._sandbox_snapshot_name + logger.info( + "Creating sandbox from snapshot: %s", self._sandbox_snapshot_name + ) + else: + spec = {"computer_use_environment": {}} + logger.info("Creating sandbox with computer use environment spec") + operation = await asyncio.to_thread( client.agent_engines.sandboxes.create, - spec={"computer_use_environment": {}}, + spec=spec, name=agent_engine_name, - config=types.CreateAgentEngineSandboxConfig( - display_name="adk_computer_use_sandbox" - ), + config=config, ) sandbox_name = operation.response.name @@ -249,7 +278,6 @@ async def _get_access_token(self, sandbox_name: str) -> str: token = await asyncio.to_thread( client.agent_engines.sandboxes.generate_access_token, service_account_email=self._service_account_email, - sandbox_id=sandbox_name, timeout=_DEFAULT_TOKEN_TIMEOUT, ) From a279a2f486aa31510723cc0e6301593a81f3bd68 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Thu, 21 May 2026 13:58:27 -0700 Subject: [PATCH 21/94] feat: Preserve transcription event order in conversation trajectory - Add agent_name parameter to _run_live_inference_loop - Yield synthetic text events inline when partial transcriptions arrive - Remove post-loop transcription accumulation logic PiperOrigin-RevId: 919240851 --- .../adk/evaluation/evaluation_generator.py | 40 ++++++------- .../evaluation/test_evaluation_generator.py | 56 +++++++++++++++++++ 2 files changed, 74 insertions(+), 22 deletions(-) diff --git a/src/google/adk/evaluation/evaluation_generator.py b/src/google/adk/evaluation/evaluation_generator.py index d5a6629366..5b0100818c 100644 --- a/src/google/adk/evaluation/evaluation_generator.py +++ b/src/google/adk/evaluation/evaluation_generator.py @@ -383,6 +383,7 @@ async def _generate_inferences_for_single_user_invocation_live( current_invocation_id: str, turn_complete_event: asyncio.Event, live_timeout_seconds: int, + agent_name: str = _DEFAULT_AUTHOR, ) -> AsyncGenerator[Event, None]: """Generates inferences for a single user invocation in live mode.""" yield Event( @@ -408,6 +409,22 @@ async def _generate_inferences_for_single_user_invocation_live( event = await event_queue.get() if event.invocation_id == current_invocation_id: yield event + # Emit a synthetic text event for each transcription, preserving + # the order in which events are received. + if ( + event.author != _USER_AUTHOR + and event.output_transcription + and event.output_transcription.text + and event.partial + ): + yield Event( + content=Content( + role="model", + parts=[types.Part(text=event.output_transcription.text)], + ), + author=agent_name, + invocation_id=current_invocation_id, + ) @staticmethod async def _generate_inferences_from_root_agent_live( @@ -495,31 +512,10 @@ async def _generate_inferences_from_root_agent_live( current_invocation_id=live_session.current_invocation_id, turn_complete_event=live_session.turn_complete_event, live_timeout_seconds=live_timeout_seconds, + agent_name=runner.agent.name, ): events.append(event) - turn_transcription = "" - for evt in events: - if ( - evt.invocation_id == live_session.current_invocation_id - and evt.author != _USER_AUTHOR - and evt.output_transcription - ): - if not evt.partial and evt.output_transcription.text: - turn_transcription = evt.output_transcription.text - else: - turn_transcription += evt.output_transcription.text - if turn_transcription: - synthetic_event = Event( - content=Content( - role="model", - parts=[types.Part(text=turn_transcription)], - ), - author=runner.agent.name, - invocation_id=live_session.current_invocation_id, - ) - events.append(synthetic_event) - if live_session.live_finished.is_set(): logger.info("Live session finished signal detected.") break diff --git a/tests/unittests/evaluation/test_evaluation_generator.py b/tests/unittests/evaluation/test_evaluation_generator.py index 508b6f5c9c..05ab25cc72 100644 --- a/tests/unittests/evaluation/test_evaluation_generator.py +++ b/tests/unittests/evaluation/test_evaluation_generator.py @@ -453,6 +453,62 @@ async def test_generate_inferences_live(self, mocker): with pytest.raises(StopAsyncIteration): await gen.__anext__() + @pytest.mark.asyncio + async def test_generate_inferences_live_with_synthetic_events(self, mocker): + """Tests live inference generation with synthetic events.""" + mock_live_request_queue = mocker.MagicMock() + event_queue = asyncio.Queue() + turn_complete_event = asyncio.Event() + + user_content = types.Content(parts=[types.Part(text="User query")]) + invocation_id = "inv1" + + transcription = types.Transcription(text="Partial transcription") + partial_event = Event( + author="agent", + content=types.Content(parts=[]), + invocation_id=invocation_id, + output_transcription=transcription, + partial=True, + ) + + gen = EvaluationGenerator._generate_inferences_for_single_user_invocation_live( + live_request_queue=mock_live_request_queue, + event_queue=event_queue, + user_message=user_content, + current_invocation_id=invocation_id, + turn_complete_event=turn_complete_event, + live_timeout_seconds=300, + agent_name="custom_agent_name", + ) + + # First yield should be the user message + first_event = await gen.__anext__() + assert first_event.author == "user" + assert first_event.content == user_content + assert first_event.invocation_id == invocation_id + + # Mock turn_complete_event.wait to avoid blocking + turn_complete_event.wait = mocker.AsyncMock() + + # Put the partial event in the queue + await event_queue.put(partial_event) + + # Now advance + second_event = await gen.__anext__() + assert second_event == partial_event + + # Next should be the synthetic event + third_event = await gen.__anext__() + assert third_event.author == "custom_agent_name" + assert third_event.invocation_id == invocation_id + assert third_event.content.role == "model" + assert third_event.content.parts[0].text == "Partial transcription" + + # The generator should be exhausted now + with pytest.raises(StopAsyncIteration): + await gen.__anext__() + @pytest.fixture def mock_runner(mocker): From bb6d132e05718613fca26ae71e70772f1b3a6ff4 Mon Sep 17 00:00:00 2001 From: George Weale Date: Thu, 21 May 2026 14:11:40 -0700 Subject: [PATCH 22/94] fix: resolve circular import caused by llm_request Co-authored-by: George Weale PiperOrigin-RevId: 919248170 --- src/google/adk/telemetry/_experimental_semconv.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/google/adk/telemetry/_experimental_semconv.py b/src/google/adk/telemetry/_experimental_semconv.py index 6ffd5beaaa..a415d72de8 100644 --- a/src/google/adk/telemetry/_experimental_semconv.py +++ b/src/google/adk/telemetry/_experimental_semconv.py @@ -45,8 +45,9 @@ from opentelemetry.trace import Span from opentelemetry.util.types import AttributeValue -from ..models.llm_request import LlmRequest -from ..models.llm_response import LlmResponse +if TYPE_CHECKING: + from ..models.llm_request import LlmRequest + from ..models.llm_response import LlmResponse try: from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_TOOL_DEFINITIONS From 3a5035f812cc00f5b64e827367fed7042d4b4fb8 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Thu, 21 May 2026 19:55:19 -0700 Subject: [PATCH 23/94] feat(samples): Add chart generation and artifact loading to data agent PiperOrigin-RevId: 919391299 --- contributing/samples/data_agent/agent.py | 60 ++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/contributing/samples/data_agent/agent.py b/contributing/samples/data_agent/agent.py index 0ab675c387..cbe210206c 100644 --- a/contributing/samples/data_agent/agent.py +++ b/contributing/samples/data_agent/agent.py @@ -12,15 +12,22 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations + +import asyncio import os +from typing import Any from google.adk.agents import Agent from google.adk.auth.auth_credential import AuthCredentialTypes +from google.adk.tools import load_artifacts from google.adk.tools.data_agent.config import DataAgentToolConfig from google.adk.tools.data_agent.credentials import DataAgentCredentialsConfig from google.adk.tools.data_agent.data_agent_toolset import DataAgentToolset +from google.adk.tools.tool_context import ToolContext import google.auth import google.auth.transport.requests +from google.genai import types # Define the desired credential type. # By default use Application Default Credentials (ADC) from the local @@ -72,17 +79,64 @@ ], ) + +# NOTE: The generate_chart tool requires 'altair' and 'vl-convert-python' to be +# installed in your environment. You can install them using: +# pip install altair vl-convert-python +async def generate_chart( + chart_spec: dict[str, Any], tool_context: ToolContext +) -> dict[str, str]: + """Generates a professional chart using Altair based on a Vega-Lite spec. + + Args: + chart_spec: A dictionary defining a Vega-Lite chart. + tool_context: The tool context. + + Returns: + A dictionary containing the status of the chart generation ("success" or + "error"), a detail message, and the filename if successful. + """ + import altair as alt + import vl_convert as vlc + + try: + # Altair can take a Vega-Lite dict directly and render it. + # We use vl-convert to transform the spec into a high-quality PNG. + png_data = await asyncio.to_thread(vlc.vegalite_to_png, chart_spec, scale=2) + + # Save as artifact + await tool_context.save_artifact( + "chart.png", + types.Part.from_bytes(data=png_data, mime_type="image/png"), + ) + title = chart_spec.get("title", "Chart") + return { + "status": "success", + "detail": ( + f"Professional chart '{title}' rendered using Altair/Vega-Lite." + ), + "filename": "chart.png", + } + except Exception as e: # pylint: disable=broad-exception-caught + return {"status": "error", "detail": f"Failed to render chart: {str(e)}"} + + root_agent = Agent( name="data_agent", model="gemini-2.5-flash", - description="Agent to answer user questions using Data Agents.", + description=( + "Agent to answer user questions using Data Agents and generate charts." + ), instruction=( "## Persona\nYou are a helpful assistant that uses Data Agents" " to answer user questions about their data.\n\n## Tools\n- You can" " list available data agents using `list_accessible_data_agents`.\n-" " You can get information about a specific data agent using" " `get_data_agent_info`.\n- You can chat with a specific data" - " agent using `ask_data_agent`.\n" + " agent using `ask_data_agent`.\n- `generate_chart` renders" + " professional charts from a `chart_spec` (Vega-Lite JSON). Use this" + " whenever you need to visualize data; do not show raw JSON to the" + " user.\n- You can load artifacts using `load_artifacts`.\n" ), - tools=[da_toolset], + tools=[da_toolset, generate_chart, load_artifacts], ) From 1c8e8317f4676c94d4f15814a4fbb6784b075933 Mon Sep 17 00:00:00 2001 From: Artem Orobets Date: Thu, 21 May 2026 20:37:05 -0700 Subject: [PATCH 24/94] fix: Use Pydantic TypeAdapter in FunctionTool for automatic argument coercion and validation Co-authored-by: Artem Orobets PiperOrigin-RevId: 919407261 --- src/google/adk/tools/function_tool.py | 60 +++++++++++---------- tests/unittests/tools/test_function_tool.py | 27 ++++++++++ 2 files changed, 58 insertions(+), 29 deletions(-) diff --git a/src/google/adk/tools/function_tool.py b/src/google/adk/tools/function_tool.py index 10e32a5473..bf4e8aa932 100644 --- a/src/google/adk/tools/function_tool.py +++ b/src/google/adk/tools/function_tool.py @@ -14,6 +14,7 @@ from __future__ import annotations +import functools import inspect import logging from typing import Any @@ -36,6 +37,16 @@ logger = logging.getLogger('google_adk.' + __name__) +@functools.cache +def _get_type_adapter(target_type: Any) -> pydantic.TypeAdapter | None: + """Returns a cached Pydantic TypeAdapter for the target type, or None if unsupported.""" + try: + return pydantic.TypeAdapter(target_type) + except Exception: # pylint: disable=broad-exception-caught + # If Pydantic doesn't support this type, cache None so we don't retry. + return None + + class FunctionTool(BaseTool): """A tool that wraps a user-defined Python function. @@ -124,35 +135,26 @@ def _preprocess_args(self, args: dict[str, Any]) -> dict[str, Any]: if param_name in args and param.annotation != inspect.Parameter.empty: target_type = param.annotation - # Handle Optional[PydanticModel] types - if get_origin(param.annotation) is Union: - union_args = get_args(param.annotation) - # Find the non-None type in Optional[T] (which is Union[T, None]) - non_none_types = [arg for arg in union_args if arg is not type(None)] - if len(non_none_types) == 1: - target_type = non_none_types[0] - - # Check if the target type is a Pydantic model - if inspect.isclass(target_type) and issubclass( - target_type, pydantic.BaseModel - ): - # Skip conversion if the value is None and the parameter is Optional - if args[param_name] is None: - continue - - # Convert to Pydantic model if it's not already the correct type - if not isinstance(args[param_name], target_type): - try: - converted_args[param_name] = target_type.model_validate( - args[param_name] - ) - except Exception as e: - logger.warning( - f"Failed to convert argument '{param_name}' to Pydantic model" - f' {target_type.__name__}: {e}' - ) - # Keep the original value if conversion fails - pass + # Use Pydantic TypeAdapter for automatic coercion and validation. + adapter = _get_type_adapter(target_type) + if adapter is None: + continue + + try: + converted_args[param_name] = adapter.validate_python(args[param_name]) + except pydantic.ValidationError as e: + logger.warning( + "Failed to validate/convert argument '%s'. Received value %r" + ' (type %s), expected type %s. Value remains unchanged.' + ' Exception: %s', + param_name, + args[param_name], + type(args[param_name]).__name__, + target_type, + e, + ) + # Keep the original value if conversion fails, matching previous behavior. + pass return converted_args diff --git a/tests/unittests/tools/test_function_tool.py b/tests/unittests/tools/test_function_tool.py index 9c76529fb5..46ce34f634 100644 --- a/tests/unittests/tools/test_function_tool.py +++ b/tests/unittests/tools/test_function_tool.py @@ -529,3 +529,30 @@ async def async_tool(query: str, context: Context) -> dict: assert result["query"] == "hello" assert result["context_type"] == "Context" + + +@pytest.mark.parametrize( + "input_value, expected_type, expected_value", + [ + (5.0, int, 5), # Float to int coercion + (5.5, float, 5.5), # Unsafe float, no coercion + ("5", int, 5), # String to int coercion + ("-5", int, -5), # Negative string to int coercion + ("5.5", str, "5.5"), # Unsafe string, no coercion + ], +) +def test_preprocess_args_int_coercion( + input_value, expected_type, expected_value +): + """Test _preprocess_args handles coercion to int parameters.""" + + def simple_function(limit: int) -> dict: + return {"limit": limit} + + tool = FunctionTool(simple_function) + + input_args = {"limit": input_value} + processed_args = tool._preprocess_args(input_args) + + assert isinstance(processed_args["limit"], expected_type) + assert processed_args["limit"] == expected_value From 2f698eac3a0645741ac3fea126f16f4df40c5ede Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Fri, 22 May 2026 02:06:10 -0700 Subject: [PATCH 25/94] feat: emit OTel gen_ai.client.* metrics natively gen_ai.client.operation.duration and gen_ai.client.token.usage already exist in OTel semconv (https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-metrics/), and are currently emitted by https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation-genai/opentelemetry-instrumentation-google-genai, if configured. However, they have no agentic attributes. This change builds on top of the recently introduced metric instrumentation and emits those two metrics a new attribute: gen_ai.agent.name. In the future, gen_ai.agent.version will also be set. Semconv updates will be handled separately. PiperOrigin-RevId: 919540659 --- .../adk/flows/llm_flows/base_llm_flow.py | 28 +- src/google/adk/telemetry/_instrumentation.py | 70 +- src/google/adk/telemetry/_metrics.py | 105 +- src/google/adk/telemetry/tracing.py | 33 +- tests/unittests/telemetry/test_functional.py | 1436 ++++++++++++++++- tests/unittests/telemetry/test_metrics.py | 100 ++ tests/unittests/testing_utils.py | 11 +- 7 files changed, 1739 insertions(+), 44 deletions(-) diff --git a/src/google/adk/flows/llm_flows/base_llm_flow.py b/src/google/adk/flows/llm_flows/base_llm_flow.py index b1f5fb1e8a..da3245e4d4 100644 --- a/src/google/adk/flows/llm_flows/base_llm_flow.py +++ b/src/google/adk/flows/llm_flows/base_llm_flow.py @@ -22,14 +22,14 @@ from typing import Optional from typing import TYPE_CHECKING +from google.adk.flows.llm_flows import _output_schema_processor +from google.adk.flows.llm_flows import functions from google.adk.platform import time as platform_time from google.genai import types from opentelemetry import trace from websockets.exceptions import ConnectionClosed from websockets.exceptions import ConnectionClosedOK -from . import _output_schema_processor -from . import functions from ...agents.base_agent import BaseAgent from ...agents.callback_context import CallbackContext from ...agents.invocation_context import InvocationContext @@ -43,7 +43,7 @@ from ...models.google_llm import GoogleLLMVariant from ...models.llm_request import LlmRequest from ...models.llm_response import LlmResponse -from ...telemetry import tracing +from ...telemetry import _instrumentation from ...telemetry.tracing import trace_call_llm from ...telemetry.tracing import trace_send_data from ...telemetry.tracing import tracer @@ -376,18 +376,14 @@ async def _run_on_model_error_callbacks( return None try: - async with Aclosing(response_generator) as agen: - async with tracing.use_inference_span( - llm_request, - invocation_context, - model_response_event, - ) as gc_span: + async with _instrumentation.record_inference_telemetry( + llm_request, + invocation_context, + model_response_event, + ) as tel_ctx: + async with Aclosing(response_generator) as agen: async for llm_response in agen: - if gc_span: - tracing.trace_inference_result( - gc_span, - llm_response, - ) + tel_ctx.record_llm_response(llm_response) yield llm_response except Exception as model_error: callback_context = CallbackContext( @@ -427,8 +423,8 @@ async def _process_agent_tools( names to ``BaseTool`` instances ready for function call dispatch. Args: - invocation_context: The invocation context (``agent`` is read - from ``invocation_context.agent``). + invocation_context: The invocation context (``agent`` is read from + ``invocation_context.agent``). llm_request: The LLM request to populate with tool declarations. """ agent = invocation_context.agent diff --git a/src/google/adk/telemetry/_instrumentation.py b/src/google/adk/telemetry/_instrumentation.py index 0e4ad3c6ea..3f5fdb5f3c 100644 --- a/src/google/adk/telemetry/_instrumentation.py +++ b/src/google/adk/telemetry/_instrumentation.py @@ -17,6 +17,7 @@ import contextlib import dataclasses import logging +import sys import time from typing import Any from typing import AsyncIterator @@ -25,7 +26,6 @@ logger = logging.getLogger("google_adk." + __name__) from opentelemetry import trace -import opentelemetry.context as context_api from . import _metrics from . import tracing @@ -34,16 +34,22 @@ if TYPE_CHECKING: from ..agents.base_agent import BaseAgent from ..agents.invocation_context import InvocationContext + from ..models.llm_request import LlmRequest + from ..models.llm_response import LlmResponse from ..tools.base_tool import BaseTool -def _get_elapsed_ms(span: trace.Span | None, fallback_start: float) -> float: +def _get_elapsed_ms( + span: trace.Span | tracing.GenerateContentSpan | None, + fallback_start: float, +) -> float: """Guarantees consistent time source for duration calculation. Note: This must be called with an ended span. Args: - span (trace.Span | None): The ended span to extract duration from. + span (trace.Span | tracing.GenerateContentSpan | None): The ended span to + extract duration from. fallback_start (float): Fallback start time in seconds (monotonic). Returns: @@ -52,6 +58,7 @@ def _get_elapsed_ms(span: trace.Span | None, fallback_start: float) -> float: if span is None: return (time.monotonic() - fallback_start) * 1000 + span = span.span if hasattr(span, "span") else span start_ns = getattr(span, "start_time", None) end_ns = getattr(span, "end_time", None) @@ -66,8 +73,17 @@ def _get_elapsed_ms(span: trace.Span | None, fallback_start: float) -> float: class TelemetryContext: """Stores all telemetry related state.""" - otel_context: context_api.Context function_response_event: event_lib.Event | None = None + span: tracing.GenerateContentSpan | trace.Span | None = None + _llm_responses: list[LlmResponse] = dataclasses.field(default_factory=list) + + @property + def llm_responses(self) -> list[LlmResponse]: + return self._llm_responses + + def record_llm_response(self, response: LlmResponse) -> None: + self._llm_responses.append(response) + tracing.trace_inference_result(self.span, response) @contextlib.asynccontextmanager @@ -77,13 +93,13 @@ async def record_agent_invocation( """Unified context manager for consolidated metrics and tracing.""" start_time = time.monotonic() caught_error: Exception | None = None + tel_ctx: TelemetryContext = TelemetryContext() span: trace.Span | None = None span_name = f"invoke_agent {agent.name}" try: with tracing.tracer.start_as_current_span(span_name) as s: span = s tracing.trace_agent_invocation(span, agent, ctx) - tel_ctx = TelemetryContext(otel_context=context_api.get_current()) yield tel_ctx except Exception as e: caught_error = e @@ -114,12 +130,12 @@ async def record_tool_execution( """Unified context manager for consolidated tool execution telemetry.""" start_time = time.monotonic() caught_error: Exception | None = None + tel_ctx: TelemetryContext = TelemetryContext() span: trace.Span | None = None span_name = f"execute_tool {tool.name}" try: with tracing.tracer.start_as_current_span(span_name) as s: span = s - tel_ctx = TelemetryContext(otel_context=context_api.get_current()) try: yield tel_ctx except Exception as e: @@ -147,3 +163,45 @@ async def record_tool_execution( logger.exception( "Failed to record tool execution duration for tool %s", tool.name ) + + +@contextlib.asynccontextmanager +async def record_inference_telemetry( + llm_request: LlmRequest, + invocation_context: InvocationContext, + model_response_event: event_lib.Event, +) -> AsyncIterator[TelemetryContext]: + """Unified async context manager for consolidated inference metrics.""" + start_time = time.monotonic() + tel_ctx: TelemetryContext = TelemetryContext() + try: + async with tracing.use_inference_span( + llm_request, + invocation_context, + model_response_event, + ) as gc_span: + tel_ctx.span = gc_span + yield tel_ctx + finally: + inference_error = sys.exc_info()[1] + elapsed_ms = _get_elapsed_ms(tel_ctx.span, start_time) + try: + agent_name = invocation_context.agent.name + if tracing._should_emit_native_telemetry(invocation_context.agent): + _metrics.record_client_operation_duration( + agent_name=agent_name, + elapsed_ms=elapsed_ms, + llm_request=llm_request, + responses=tel_ctx.llm_responses, + error=inference_error, + ) + _metrics.record_client_token_usage( + agent_name=agent_name, + llm_request=llm_request, + responses=tel_ctx.llm_responses, + ) + except Exception: # pylint: disable=broad-exception-caught + logger.exception( + "Failed to record inference metrics for agent %s", + invocation_context.agent.name, + ) diff --git a/src/google/adk/telemetry/_metrics.py b/src/google/adk/telemetry/_metrics.py index 0f32ac1920..ac04c41dcd 100644 --- a/src/google/adk/telemetry/_metrics.py +++ b/src/google/adk/telemetry/_metrics.py @@ -15,28 +15,31 @@ from __future__ import annotations import logging +from typing import TYPE_CHECKING from google.adk import version -from google.adk.events.event import Event +from google.adk.telemetry import tracing from google.genai import types from opentelemetry import metrics from opentelemetry.semconv._incubating.attributes import gen_ai_attributes +from opentelemetry.semconv._incubating.metrics import gen_ai_metrics from opentelemetry.semconv.attributes import error_attributes +if TYPE_CHECKING: + from google.adk.events.event import Event + from google.adk.models.llm_request import LlmRequest + from google.adk.models.llm_response import LlmResponse + logger = logging.getLogger("google_adk." + __name__) -# TODO(b/477553411): add these attributes to Otel semconv. GEN_AI_AGENT_VERSION = "gen_ai.agent.version" GEN_AI_TOOL_VERSION = "gen_ai.tool.version" -# Initialize meter meter = metrics.get_meter( name="gcp.vertex.agent", version=version.__version__, - # TODO(b/477553411): set schema version after OTel semconv updates. ) -# Define histograms _agent_invocation_duration = meter.create_histogram( "gen_ai.agent.invocation.duration", unit="ms", @@ -62,6 +65,10 @@ unit="1", description="Length of agentic workflow (# of events).", ) +_client_operation_duration = ( + gen_ai_metrics.create_gen_ai_client_operation_duration(meter) +) +_client_token_usage = gen_ai_metrics.create_gen_ai_client_token_usage(meter) def record_agent_invocation_duration( @@ -121,6 +128,90 @@ def record_tool_execution_duration( _tool_execution_duration.record(elapsed_ms, attributes=attrs) +def record_client_operation_duration( + agent_name: str, + elapsed_ms: float, + llm_request: LlmRequest, + responses: list[LlmResponse], + error: Exception | None = None, +): + """Encapsulates the business logic for tracking gen_ai client operation duration.""" + + attrs = { + gen_ai_attributes.GEN_AI_AGENT_NAME: agent_name, + gen_ai_attributes.GEN_AI_OPERATION_NAME: "generate_content", + gen_ai_attributes.GEN_AI_PROVIDER_NAME: _get_provider_name(), + } + if llm_request.model: + attrs[gen_ai_attributes.GEN_AI_REQUEST_MODEL] = llm_request.model + + if responses: + response_model = responses[-1].model_version or llm_request.model + if response_model: + attrs[gen_ai_attributes.GEN_AI_RESPONSE_MODEL] = response_model + + if error is not None: + attrs[error_attributes.ERROR_TYPE] = type(error).__name__ + + _client_operation_duration.record(elapsed_ms / 1000.0, attributes=attrs) + + +def record_client_token_usage( + agent_name: str, + llm_request: LlmRequest, + responses: list[LlmResponse], +): + """Encapsulates the business logic for tracking gen_ai client token usage.""" + if not responses: + return + + # The assumption is that token usage in streaming responses is cumulative. + # The last response chunk contains the total usage for the entire request. + # Summing them up across all response chunks would result in overcounting. + last_response = responses[-1] + if not last_response.usage_metadata: + logger.warning( + "Skipping missing token usage metadata for agent %s and model %s", + agent_name, + llm_request.model, + ) + return + + # OTel semconv for `gen_ai.client.token.usage` states that token counts should + # be categorized under `gen_ai.token.type` as either "input" or "output". + # We aggregate prompt and tool use tokens for "input", and candidates and + # thoughts tokens for "output". + # `cached_content_token_count` is omitted as it's already included in prompt tokens. + # `total_token_count` is omitted as SemConv expects input/output breakdown. + usage = last_response.usage_metadata + input_token_count = (usage.prompt_token_count or 0) + ( + usage.tool_use_prompt_token_count or 0 + ) + output_token_count = (usage.candidates_token_count or 0) + ( + usage.thoughts_token_count or 0 + ) + response_model = last_response.model_version or llm_request.model + base_attrs = { + gen_ai_attributes.GEN_AI_AGENT_NAME: agent_name, + gen_ai_attributes.GEN_AI_OPERATION_NAME: "generate_content", + gen_ai_attributes.GEN_AI_PROVIDER_NAME: _get_provider_name(), + } + if llm_request.model: + base_attrs[gen_ai_attributes.GEN_AI_REQUEST_MODEL] = llm_request.model + if response_model: + base_attrs[gen_ai_attributes.GEN_AI_RESPONSE_MODEL] = response_model + + if input_token_count > 0: + input_attrs = base_attrs.copy() + input_attrs[gen_ai_attributes.GEN_AI_TOKEN_TYPE] = "input" + _client_token_usage.record(input_token_count, attributes=input_attrs) + + if output_token_count > 0: + output_attrs = base_attrs.copy() + output_attrs[gen_ai_attributes.GEN_AI_TOKEN_TYPE] = "output" + _client_token_usage.record(output_token_count, attributes=output_attrs) + + def _get_content_size( content: types.Content | None, ) -> int: @@ -133,3 +224,7 @@ def _get_content_size( if part.inline_data and part.inline_data.data: size += len(part.inline_data.data) return size + + +def _get_provider_name() -> str: + return tracing._guess_gemini_system_name() diff --git a/src/google/adk/telemetry/tracing.py b/src/google/adk/telemetry/tracing.py index 32040b8bc6..29beeebe21 100644 --- a/src/google/adk/telemetry/tracing.py +++ b/src/google/adk/telemetry/tracing.py @@ -560,18 +560,15 @@ def use_generate_content_span( 'gcp.vertex.agent.event_id': model_response_event.id, 'gcp.vertex.agent.invocation_id': invocation_context.invocation_id, } - if ( - _is_gemini_agent(invocation_context.agent) - and _instrumented_with_opentelemetry_instrumentation_google_genai() - ): - with _use_extra_generate_content_attributes(common_attributes): - yield - else: + if _should_emit_native_telemetry(invocation_context.agent): with _use_native_generate_content_span_stable_semconv( llm_request=llm_request, common_attributes=common_attributes, ) as span: yield span.span + else: + with _use_extra_generate_content_attributes(common_attributes): + yield @asynccontextmanager @@ -594,13 +591,7 @@ async def use_inference_span( 'gcp.vertex.agent.event_id': model_response_event.id, 'gcp.vertex.agent.invocation_id': invocation_context.invocation_id, } - if ( - _is_gemini_agent(invocation_context.agent) - and _instrumented_with_opentelemetry_instrumentation_google_genai() - ): - with _use_extra_generate_content_attributes(common_attributes): - yield - else: + if _should_emit_native_telemetry(invocation_context.agent): async with _use_native_generate_content_span( llm_request=llm_request, common_attributes=common_attributes, @@ -618,6 +609,9 @@ async def use_inference_span( gc_span.operation_details_attributes, gc_span.operation_details_common_attributes, ) + else: + with _use_extra_generate_content_attributes(common_attributes): + yield def _should_log_prompt_response_content() -> bool: @@ -661,6 +655,17 @@ def _instrumented_with_opentelemetry_instrumentation_google_genai() -> bool: return False +def _should_emit_native_telemetry(agent: BaseAgent) -> bool: + """If the google-genai instrumentation lib is active AND this is a Gemini agent, then the lib already emits inference metrics.""" + if ( + _instrumented_with_opentelemetry_instrumentation_google_genai() + and _is_gemini_agent(agent) + ): + return False + + return True + + @contextmanager def _use_extra_generate_content_attributes( extra_attributes: Mapping[str, AttributeValue], diff --git a/tests/unittests/telemetry/test_functional.py b/tests/unittests/telemetry/test_functional.py index 645fd4050c..5430a97205 100644 --- a/tests/unittests/telemetry/test_functional.py +++ b/tests/unittests/telemetry/test_functional.py @@ -11,21 +11,35 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations import dataclasses +from dataclasses import dataclass +from dataclasses import field +from enum import Enum import gc +import json import sys from typing import Any from typing import Sequence +from typing import TYPE_CHECKING from google.adk.agents.llm_agent import Agent from google.adk.models.base_llm import BaseLlm +from google.adk.models.llm_response import LlmResponse +from google.adk.telemetry import _instrumentation from google.adk.telemetry import _metrics from google.adk.telemetry import tracing from google.adk.tools import FunctionTool from google.adk.utils.context_utils import Aclosing +from google.genai import types +from google.genai.types import Content +from google.genai.types import FinishReason from google.genai.types import Part from opentelemetry.instrumentation.google_genai import GoogleGenAiSdkInstrumentor +from opentelemetry.sdk._logs import LoggerProvider +from opentelemetry.sdk._logs.export import InMemoryLogRecordExporter +from opentelemetry.sdk._logs.export import SimpleLogRecordProcessor from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader from opentelemetry.sdk.metrics.export import Metric @@ -38,6 +52,11 @@ from ..testing_utils import MockModel from ..testing_utils import TestInMemoryRunner +if TYPE_CHECKING: + from opentelemetry.sdk._logs import ReadableLogRecord + from opentelemetry.sdk.trace import ReadableSpan + from opentelemetry.util.types import AttributeValue + @pytest.fixture def test_model() -> BaseLlm: @@ -110,6 +129,7 @@ def wrapped_firstiter(coro): or coro.__name__ == "_use_native_generate_content_span" or coro.__name__ == "record_agent_invocation" or coro.__name__ == "record_tool_execution" + or coro.__name__ == "record_inference_telemetry" ): firstiter(coro) return @@ -261,6 +281,10 @@ def _setup_test_metrics(monkeypatch): request_size_hist = meter.create_histogram("gen_ai.agent.request.size") response_size_hist = meter.create_histogram("gen_ai.agent.response.size") workflow_steps_hist = meter.create_histogram("gen_ai.agent.workflow.steps") + client_duration_hist = meter.create_histogram( + "gen_ai.client.operation.duration" + ) + client_token_usage_hist = meter.create_histogram("gen_ai.client.token.usage") monkeypatch.setattr( _metrics, "_agent_invocation_duration", agent_duration_hist @@ -269,6 +293,10 @@ def _setup_test_metrics(monkeypatch): monkeypatch.setattr(_metrics, "_agent_request_size", request_size_hist) monkeypatch.setattr(_metrics, "_agent_response_size", response_size_hist) monkeypatch.setattr(_metrics, "_agent_workflow_steps", workflow_steps_hist) + monkeypatch.setattr( + _metrics, "_client_operation_duration", client_duration_hist + ) + monkeypatch.setattr(_metrics, "_client_token_usage", client_token_usage_hist) return reader @@ -287,7 +315,14 @@ async def generate_random_number(): Part.from_function_call(name="get_current_time", args={}), Part.from_function_call(name="generate_random_number", args={}), Part.from_text(text="Both tools executed."), - ] + ], + usage_metadata=types.GenerateContentResponseUsageMetadata( + prompt_token_count=10, + candidates_token_count=20, + tool_use_prompt_token_count=5, + thoughts_token_count=10, + total_token_count=45, + ), ) test_agent = Agent( name="complex_agent", @@ -354,6 +389,62 @@ async def generate_random_number(): ] assert got_steps == want_steps + got_client_duration = _extract_metrics( + metrics_list, "gen_ai.client.operation.duration" + ) + assert len(got_client_duration) == 1 + for p in got_client_duration: + p.value = None + want_client_duration = [ + MetricPoint( + attributes={ + "gen_ai.agent.name": "complex_agent", + "gen_ai.operation.name": "generate_content", + "gen_ai.provider.name": "gemini", + "gen_ai.request.model": "mock", + "gen_ai.response.model": "mock", + }, + value=None, + ) + ] + assert got_client_duration == want_client_duration + + got_client_tokens = _extract_metrics( + metrics_list, "gen_ai.client.token.usage" + ) + assert len(got_client_tokens) == 2 + want_client_tokens = [ + MetricPoint( + attributes={ + "gen_ai.agent.name": "complex_agent", + "gen_ai.operation.name": "generate_content", + "gen_ai.provider.name": "gemini", + "gen_ai.request.model": "mock", + "gen_ai.response.model": "mock", + "gen_ai.token.type": "input", + }, + value=45, # 15 tokens * 3 turns + ), + MetricPoint( + attributes={ + "gen_ai.agent.name": "complex_agent", + "gen_ai.operation.name": "generate_content", + "gen_ai.provider.name": "gemini", + "gen_ai.request.model": "mock", + "gen_ai.response.model": "mock", + "gen_ai.token.type": "output", + }, + value=90, # 30 tokens * 3 turns + ), + ] + got_client_tokens.sort( + key=lambda p: p.attributes.get("gen_ai.token.type", "") + ) + want_client_tokens.sort( + key=lambda p: p.attributes.get("gen_ai.token.type", "") + ) + assert got_client_tokens == want_client_tokens + @pytest.mark.asyncio async def test_metrics_tool_error(monkeypatch): @@ -412,3 +503,1346 @@ async def failing_tool(): got.sort(key=lambda p: p.attributes.get("gen_ai.tool.name", "")) want.sort(key=lambda p: p.attributes.get("gen_ai.tool.name", "")) assert got == want + + +# ============================================================================== +# TELEMETRY SHAPES TEST HELPERS & EXPECTATIONS +# ============================================================================== + +OTEL_OPT_IN = "OTEL_SEMCONV_STABILITY_OPT_IN" +CAPTURE_CONTENT = "OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT" +EXPERIMENTAL_OPT_IN = "gen_ai_latest_experimental" +GEN_AI_SYSTEM_MESSAGE_EVENT = "gen_ai.system.message" +GEN_AI_USER_MESSAGE_EVENT = "gen_ai.user.message" +GEN_AI_CHOICE_EVENT = "gen_ai.choice" +GEN_AI_COMPLETION_DETAILS_EVENT = "gen_ai.client.inference.operation.details" + +NON_DETERMINISTIC_ATTRIBUTE_KEYS: frozenset[str] = frozenset({ + "gcp.vertex.agent.event_id", + "gen_ai.tool.call.id", + "gcp.vertex.agent.associated_event_ids", + "gen_ai.conversation.id", + "gcp.vertex.agent.invocation_id", + "gcp.vertex.agent.session_id", +}) +JSON_ATTRIBUTE_KEYS: frozenset[str] = frozenset({ + "gen_ai.input.messages", + "gen_ai.output.messages", + "gen_ai.system_instructions", + "gen_ai.tool.definitions", +}) +PRESENT = "PRESENT" + + +@dataclass +class LogDigest: + event_name: str + body: object = None + attributes: dict[str, object] = field(default_factory=dict) + + @classmethod + def from_log(cls, log: ReadableLogRecord) -> LogDigest: + attrs: dict[str, object] = {} + for k, v in (log.log_record.attributes or {}).items(): + if k in NON_DETERMINISTIC_ATTRIBUTE_KEYS: + attrs[k] = PRESENT + else: + attrs[k] = _normalize(v) + return cls( + event_name=log.log_record.event_name or "", + body=_normalize(log.log_record.body), + attributes=attrs, + ) + + +@dataclass +class SpanDigest: + name: str + attributes: dict[str, AttributeValue] + children: list[SpanDigest] = field(default_factory=list) + logs: list[LogDigest] = field(default_factory=list) + + @classmethod + def from_span(cls, span: ReadableSpan) -> SpanDigest: + determinized_attributes: dict[str, AttributeValue] = {} + for attr_key, attr_val in (span.attributes or {}).items(): + if attr_key in NON_DETERMINISTIC_ATTRIBUTE_KEYS: + determinized_attributes[attr_key] = PRESENT + elif attr_key in JSON_ATTRIBUTE_KEYS and isinstance(attr_val, str): + determinized_attributes[attr_key] = _normalize(json.loads(attr_val)) + else: + determinized_attributes[attr_key] = _normalize(attr_val) + return cls(name=span.name, attributes=determinized_attributes) + + @classmethod + def build( + cls, + spans: tuple[ReadableSpan, ...], + logs: tuple[ReadableLogRecord, ...] = (), + ) -> SpanDigest: + digest_by_id: dict[int, SpanDigest] = {} + for span in spans: + if span.context is None: + continue + digest_by_id[span.context.span_id] = cls.from_span(span) + for log in logs: + span_id = log.log_record.span_id + if span_id is None or span_id == 0: + continue + digest = digest_by_id.get(span_id) + if digest is None: + continue + digest.logs.append(LogDigest.from_log(log)) + root: SpanDigest | None = None + for span in spans: + if span.context is None: + continue + digest = digest_by_id[span.context.span_id] + if span.parent and span.parent.span_id in digest_by_id: + parent_digest = digest_by_id[span.parent.span_id] + parent_digest.children.append(digest) + else: + if root is not None: + raise ValueError("Multiple root spans found.") + root = digest + for digest in digest_by_id.values(): + digest.children.sort(key=lambda s: s.name) + digest.logs[:] = sorted_log_digests(digest.logs) + if root is None: + raise ValueError("No root span found in the provided spans.") + return root + + def all_logs(self) -> list[LogDigest]: + collected: list[LogDigest] = [] + + def _walk(node: SpanDigest) -> None: + collected.extend(node.logs) + for child in node.children: + _walk(child) + + _walk(self) + return sorted_log_digests(collected) + + +def sorted_log_digests(logs: list[LogDigest]) -> list[LogDigest]: + return sorted( + logs, + key=lambda log: ( + log.event_name, + json.dumps(log.body, sort_keys=True, default=str), + json.dumps(log.attributes, sort_keys=True, default=str), + ), + ) + + +def _normalize(value: object) -> object: + if isinstance(value, Enum): + return value.value + if isinstance(value, tuple): + return [_normalize(v) for v in value] + if isinstance(value, list): + return [_normalize(v) for v in value] + if isinstance(value, dict): + return {k: _normalize(v) for k, v in value.items() if v is not None} + return value + + +def install_telemetry( + monkeypatch: pytest.MonkeyPatch, + span_exporter: InMemorySpanExporter, + log_exporter: InMemoryLogRecordExporter, +) -> None: + tracer_provider = TracerProvider() + tracer_provider.add_span_processor(SimpleSpanProcessor(span_exporter)) + real_tracer = tracer_provider.get_tracer(__name__) + monkeypatch.setattr( + tracing.tracer, + "start_as_current_span", + real_tracer.start_as_current_span, + ) + logger_provider = LoggerProvider() + logger_provider.add_log_record_processor( + SimpleLogRecordProcessor(log_exporter) + ) + real_logger = logger_provider.get_logger(__name__) + monkeypatch.setattr(tracing.otel_logger, "emit", real_logger.emit) + + +USER_PROMPT = "hello" +AGENT_NAME = "some_root_agent" +AGENT_DESCRIPTION = "A sample root agent." +BASE_INSTRUCTION = "you are helpful" +FULL_SYSTEM_INSTRUCTION = ( + f"{BASE_INSTRUCTION}\n\n" + f'You are an agent. Your internal name is "{AGENT_NAME}".' + f' The description about you is "{AGENT_DESCRIPTION}".' +) +FINAL_TEXT = "text response" +TOOL_NAME = "some_tool" +TOOL_DESCRIPTION = "A sample tool." +TOOL_ARGS = {"arg1": "val1"} +TOOL_RESULT_PREFIX = "processed " +TOOL_RESULT = f"{TOOL_RESULT_PREFIX}{TOOL_ARGS['arg1']}" + + +def _make_llm_response(part: Part) -> LlmResponse: + return LlmResponse( + content=Content(role="model", parts=[part]), + finish_reason=FinishReason.STOP, + ) + + +def build_test_agent() -> Agent: + mock_model = MockModel.create( + responses=[ + _make_llm_response( + Part.from_function_call(name=TOOL_NAME, args=TOOL_ARGS) + ), + _make_llm_response(Part.from_text(text=FINAL_TEXT)), + ] + ) + + def some_tool(arg1: str) -> str: + """A sample tool.""" + return f"{TOOL_RESULT_PREFIX}{arg1}" + + return Agent( + name=AGENT_NAME, + description=AGENT_DESCRIPTION, + instruction=BASE_INSTRUCTION, + model=mock_model, + tools=[FunctionTool(some_tool)], + ) + + +def build_test_runner() -> TestInMemoryRunner: + return TestInMemoryRunner(agent=build_test_agent()) + + +async def run_agent_scenario(runner: TestInMemoryRunner) -> None: + async with Aclosing( + runner.run_async_with_new_session_agen( + Content(parts=[Part.from_text(text=USER_PROMPT)], role="user") + ) + ) as agen: + async for _ in agen: + pass + + +@dataclass(frozen=True) +class FunctionalTestCase: + test_id: str + semconv_opt_in: str | None + capture_content: str | None + expected_root: SpanDigest + + def apply_env(self, monkeypatch: pytest.MonkeyPatch) -> None: + if self.semconv_opt_in is None: + monkeypatch.delenv(OTEL_OPT_IN, raising=False) + else: + monkeypatch.setenv(OTEL_OPT_IN, self.semconv_opt_in) + if self.capture_content is None: + monkeypatch.delenv(CAPTURE_CONTENT, raising=False) + else: + monkeypatch.setenv(CAPTURE_CONTENT, self.capture_content) + monkeypatch.setenv("ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS", "false") + + +EXPECTED_STABLE_NO_CAPTURE = SpanDigest( + name="invocation", + attributes={}, + children=[ + SpanDigest( + name="invoke_agent some_root_agent", + attributes={ + "gen_ai.operation.name": "invoke_agent", + "gen_ai.agent.description": AGENT_DESCRIPTION, + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + }, + children=[ + SpanDigest( + name="call_llm", + attributes={ + "gen_ai.system": "gcp.vertex.agent", + "gen_ai.request.model": "mock", + "gcp.vertex.agent.invocation_id": PRESENT, + "gcp.vertex.agent.session_id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="generate_content mock", + attributes={ + "gen_ai.system": "gemini", + "gen_ai.operation.name": "generate_content", + "gen_ai.request.model": "mock", + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": PRESENT, + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="execute_tool some_tool", + attributes={ + "gen_ai.operation.name": "execute_tool", + "gen_ai.tool.description": ( + TOOL_DESCRIPTION + ), + "gen_ai.tool.name": TOOL_NAME, + "gen_ai.tool.type": "FunctionTool", + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gcp.vertex.agent.tool_call_args": "{}", + "gen_ai.tool.call.id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.tool_response": "{}", + }, + ), + ], + logs=[ + LogDigest( + event_name=GEN_AI_CHOICE_EVENT, + body={ + "content": "", + "index": 0, + "finish_reason": "STOP", + }, + attributes={"gen_ai.system": "gemini"}, + ), + LogDigest( + event_name=GEN_AI_SYSTEM_MESSAGE_EVENT, + body={"content": ""}, + attributes={"gen_ai.system": "gemini"}, + ), + LogDigest( + event_name=GEN_AI_USER_MESSAGE_EVENT, + body={"content": ""}, + attributes={"gen_ai.system": "gemini"}, + ), + ], + ), + ], + ), + SpanDigest( + name="call_llm", + attributes={ + "gen_ai.system": "gcp.vertex.agent", + "gen_ai.request.model": "mock", + "gcp.vertex.agent.invocation_id": PRESENT, + "gcp.vertex.agent.session_id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="generate_content mock", + attributes={ + "gen_ai.system": "gemini", + "gen_ai.operation.name": "generate_content", + "gen_ai.request.model": "mock", + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": PRESENT, + "gen_ai.response.finish_reasons": ["stop"], + }, + logs=[ + LogDigest( + event_name=GEN_AI_CHOICE_EVENT, + body={ + "content": "", + "index": 0, + "finish_reason": "STOP", + }, + attributes={"gen_ai.system": "gemini"}, + ), + LogDigest( + event_name=GEN_AI_SYSTEM_MESSAGE_EVENT, + body={"content": ""}, + attributes={"gen_ai.system": "gemini"}, + ), + LogDigest( + event_name=GEN_AI_USER_MESSAGE_EVENT, + body={"content": ""}, + attributes={"gen_ai.system": "gemini"}, + ), + LogDigest( + event_name=GEN_AI_USER_MESSAGE_EVENT, + body={"content": ""}, + attributes={"gen_ai.system": "gemini"}, + ), + LogDigest( + event_name=GEN_AI_USER_MESSAGE_EVENT, + body={"content": ""}, + attributes={"gen_ai.system": "gemini"}, + ), + ], + ), + ], + ), + ], + ), + ], +) + +EXPECTED_STABLE_CAPTURE = SpanDigest( + name="invocation", + attributes={}, + children=[ + SpanDigest( + name="invoke_agent some_root_agent", + attributes={ + "gen_ai.operation.name": "invoke_agent", + "gen_ai.agent.description": AGENT_DESCRIPTION, + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + }, + children=[ + SpanDigest( + name="call_llm", + attributes={ + "gen_ai.system": "gcp.vertex.agent", + "gen_ai.request.model": "mock", + "gcp.vertex.agent.invocation_id": PRESENT, + "gcp.vertex.agent.session_id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="generate_content mock", + attributes={ + "gen_ai.system": "gemini", + "gen_ai.operation.name": "generate_content", + "gen_ai.request.model": "mock", + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": PRESENT, + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="execute_tool some_tool", + attributes={ + "gen_ai.operation.name": "execute_tool", + "gen_ai.tool.description": ( + TOOL_DESCRIPTION + ), + "gen_ai.tool.name": TOOL_NAME, + "gen_ai.tool.type": "FunctionTool", + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gcp.vertex.agent.tool_call_args": "{}", + "gen_ai.tool.call.id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.tool_response": "{}", + }, + ), + ], + logs=[ + LogDigest( + event_name=GEN_AI_CHOICE_EVENT, + body={ + "content": { + "parts": [{ + "function_call": { + "args": TOOL_ARGS, + "name": TOOL_NAME, + } + }], + "role": "model", + }, + "index": 0, + "finish_reason": "STOP", + }, + attributes={"gen_ai.system": "gemini"}, + ), + LogDigest( + event_name=GEN_AI_SYSTEM_MESSAGE_EVENT, + body={"content": FULL_SYSTEM_INSTRUCTION}, + attributes={"gen_ai.system": "gemini"}, + ), + LogDigest( + event_name=GEN_AI_USER_MESSAGE_EVENT, + body={ + "content": { + "parts": [{"text": USER_PROMPT}], + "role": "user", + } + }, + attributes={"gen_ai.system": "gemini"}, + ), + ], + ), + ], + ), + SpanDigest( + name="call_llm", + attributes={ + "gen_ai.system": "gcp.vertex.agent", + "gen_ai.request.model": "mock", + "gcp.vertex.agent.invocation_id": PRESENT, + "gcp.vertex.agent.session_id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="generate_content mock", + attributes={ + "gen_ai.system": "gemini", + "gen_ai.operation.name": "generate_content", + "gen_ai.request.model": "mock", + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": PRESENT, + "gen_ai.response.finish_reasons": ["stop"], + }, + logs=[ + LogDigest( + event_name=GEN_AI_CHOICE_EVENT, + body={ + "content": { + "parts": [{"text": FINAL_TEXT}], + "role": "model", + }, + "index": 0, + "finish_reason": "STOP", + }, + attributes={"gen_ai.system": "gemini"}, + ), + LogDigest( + event_name=GEN_AI_SYSTEM_MESSAGE_EVENT, + body={"content": FULL_SYSTEM_INSTRUCTION}, + attributes={"gen_ai.system": "gemini"}, + ), + LogDigest( + event_name=GEN_AI_USER_MESSAGE_EVENT, + body={ + "content": { + "parts": [{ + "function_call": { + "args": TOOL_ARGS, + "name": TOOL_NAME, + } + }], + "role": "model", + } + }, + attributes={"gen_ai.system": "gemini"}, + ), + LogDigest( + event_name=GEN_AI_USER_MESSAGE_EVENT, + body={ + "content": { + "parts": [{ + "function_response": { + "name": TOOL_NAME, + "response": { + "result": TOOL_RESULT + }, + } + }], + "role": "user", + } + }, + attributes={"gen_ai.system": "gemini"}, + ), + LogDigest( + event_name=GEN_AI_USER_MESSAGE_EVENT, + body={ + "content": { + "parts": [{"text": USER_PROMPT}], + "role": "user", + } + }, + attributes={"gen_ai.system": "gemini"}, + ), + ], + ), + ], + ), + ], + ), + ], +) + +EXPECTED_EXPERIMENTAL_NO_CONTENT = SpanDigest( + name="invocation", + attributes={}, + children=[ + SpanDigest( + name="invoke_agent some_root_agent", + attributes={ + "gen_ai.operation.name": "invoke_agent", + "gen_ai.agent.description": AGENT_DESCRIPTION, + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + }, + children=[ + SpanDigest( + name="call_llm", + attributes={ + "gen_ai.system": "gcp.vertex.agent", + "gen_ai.request.model": "mock", + "gcp.vertex.agent.invocation_id": PRESENT, + "gcp.vertex.agent.session_id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="generate_content mock", + attributes={ + "gen_ai.operation.name": "generate_content", + "gen_ai.request.model": "mock", + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": PRESENT, + "gen_ai.response.finish_reasons": ["stop"], + "gen_ai.tool.definitions": [{ + "name": TOOL_NAME, + "description": TOOL_DESCRIPTION, + "type": "function", + }], + }, + children=[ + SpanDigest( + name="execute_tool some_tool", + attributes={ + "gen_ai.operation.name": "execute_tool", + "gen_ai.tool.description": ( + TOOL_DESCRIPTION + ), + "gen_ai.tool.name": TOOL_NAME, + "gen_ai.tool.type": "FunctionTool", + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gcp.vertex.agent.tool_call_args": "{}", + "gen_ai.tool.call.id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.tool_response": "{}", + }, + ), + ], + logs=[ + LogDigest( + event_name=GEN_AI_COMPLETION_DETAILS_EVENT, + body=None, + attributes={ + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": ( + PRESENT + ), + "gen_ai.response.finish_reasons": [ + "stop" + ], + "gen_ai.tool.definitions": [{ + "name": TOOL_NAME, + "description": TOOL_DESCRIPTION, + "type": "function", + }], + }, + ), + ], + ), + ], + ), + SpanDigest( + name="call_llm", + attributes={ + "gen_ai.system": "gcp.vertex.agent", + "gen_ai.request.model": "mock", + "gcp.vertex.agent.invocation_id": PRESENT, + "gcp.vertex.agent.session_id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="generate_content mock", + attributes={ + "gen_ai.operation.name": "generate_content", + "gen_ai.request.model": "mock", + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": PRESENT, + "gen_ai.response.finish_reasons": ["stop"], + "gen_ai.tool.definitions": [{ + "name": TOOL_NAME, + "description": TOOL_DESCRIPTION, + "type": "function", + }], + }, + logs=[ + LogDigest( + event_name=GEN_AI_COMPLETION_DETAILS_EVENT, + body=None, + attributes={ + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": ( + PRESENT + ), + "gen_ai.response.finish_reasons": [ + "stop" + ], + "gen_ai.tool.definitions": [{ + "name": TOOL_NAME, + "description": TOOL_DESCRIPTION, + "type": "function", + }], + }, + ), + ], + ), + ], + ), + ], + ), + ], +) + +_TOOL_DEFINITION_FULL = { + "name": TOOL_NAME, + "description": TOOL_DESCRIPTION, + "parameters": { + "properties": {"arg1": {"type": "STRING"}}, + "required": ["arg1"], + "type": "OBJECT", + }, + "type": "function", +} +_TOOL_DEFINITION_NO_CONTENT = { + "name": TOOL_NAME, + "description": TOOL_DESCRIPTION, + "type": "function", +} +_SYSTEM_INSTRUCTIONS = [{"content": FULL_SYSTEM_INSTRUCTION, "type": "text"}] +_TURN_1_INPUT_MESSAGES = [{ + "role": "user", + "parts": [{"content": USER_PROMPT, "type": "text"}], +}] +_TURN_1_OUTPUT_MESSAGES = [{ + "role": "assistant", + "parts": [{ + "id": f"{TOOL_NAME}_0", + "name": TOOL_NAME, + "arguments": TOOL_ARGS, + "type": "tool_call", + }], + "finish_reason": "stop", +}] +_TURN_2_INPUT_MESSAGES = [ + { + "role": "user", + "parts": [{"content": USER_PROMPT, "type": "text"}], + }, + { + "role": "assistant", + "parts": [{ + "id": f"{TOOL_NAME}_0", + "name": TOOL_NAME, + "arguments": TOOL_ARGS, + "type": "tool_call", + }], + }, + { + "role": "user", + "parts": [{ + "id": f"{TOOL_NAME}_0", + "response": {"result": TOOL_RESULT}, + "type": "tool_call_response", + }], + }, +] +_TURN_2_OUTPUT_MESSAGES = [{ + "role": "assistant", + "parts": [{"content": FINAL_TEXT, "type": "text"}], + "finish_reason": "stop", +}] + +EXPECTED_EXPERIMENTAL_SPAN_ONLY = SpanDigest( + name="invocation", + attributes={}, + children=[ + SpanDigest( + name="invoke_agent some_root_agent", + attributes={ + "gen_ai.operation.name": "invoke_agent", + "gen_ai.agent.description": AGENT_DESCRIPTION, + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + }, + children=[ + SpanDigest( + name="call_llm", + attributes={ + "gen_ai.system": "gcp.vertex.agent", + "gen_ai.request.model": "mock", + "gcp.vertex.agent.invocation_id": PRESENT, + "gcp.vertex.agent.session_id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="generate_content mock", + attributes={ + "gen_ai.operation.name": "generate_content", + "gen_ai.request.model": "mock", + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": PRESENT, + "gen_ai.response.finish_reasons": ["stop"], + "gen_ai.input.messages": _TURN_1_INPUT_MESSAGES, + "gen_ai.system_instructions": ( + _SYSTEM_INSTRUCTIONS + ), + "gen_ai.tool.definitions": [ + _TOOL_DEFINITION_FULL + ], + "gen_ai.output.messages": ( + _TURN_1_OUTPUT_MESSAGES + ), + }, + children=[ + SpanDigest( + name="execute_tool some_tool", + attributes={ + "gen_ai.operation.name": "execute_tool", + "gen_ai.tool.description": ( + TOOL_DESCRIPTION + ), + "gen_ai.tool.name": TOOL_NAME, + "gen_ai.tool.type": "FunctionTool", + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gcp.vertex.agent.tool_call_args": "{}", + "gen_ai.tool.call.id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.tool_response": "{}", + }, + ), + ], + logs=[ + LogDigest( + event_name=GEN_AI_COMPLETION_DETAILS_EVENT, + body=None, + attributes={ + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": ( + PRESENT + ), + "gen_ai.response.finish_reasons": [ + "stop" + ], + "gen_ai.tool.definitions": [ + _TOOL_DEFINITION_NO_CONTENT + ], + }, + ), + ], + ), + ], + ), + SpanDigest( + name="call_llm", + attributes={ + "gen_ai.system": "gcp.vertex.agent", + "gen_ai.request.model": "mock", + "gcp.vertex.agent.invocation_id": PRESENT, + "gcp.vertex.agent.session_id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="generate_content mock", + attributes={ + "gen_ai.operation.name": "generate_content", + "gen_ai.request.model": "mock", + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": PRESENT, + "gen_ai.response.finish_reasons": ["stop"], + "gen_ai.input.messages": _TURN_2_INPUT_MESSAGES, + "gen_ai.system_instructions": ( + _SYSTEM_INSTRUCTIONS + ), + "gen_ai.tool.definitions": [ + _TOOL_DEFINITION_FULL + ], + "gen_ai.output.messages": ( + _TURN_2_OUTPUT_MESSAGES + ), + }, + logs=[ + LogDigest( + event_name=GEN_AI_COMPLETION_DETAILS_EVENT, + body=None, + attributes={ + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": ( + PRESENT + ), + "gen_ai.response.finish_reasons": [ + "stop" + ], + "gen_ai.tool.definitions": [ + _TOOL_DEFINITION_NO_CONTENT + ], + }, + ), + ], + ), + ], + ), + ], + ), + ], +) + +EXPECTED_EXPERIMENTAL_EVENT_ONLY = SpanDigest( + name="invocation", + attributes={}, + children=[ + SpanDigest( + name="invoke_agent some_root_agent", + attributes={ + "gen_ai.operation.name": "invoke_agent", + "gen_ai.agent.description": AGENT_DESCRIPTION, + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + }, + children=[ + SpanDigest( + name="call_llm", + attributes={ + "gen_ai.system": "gcp.vertex.agent", + "gen_ai.request.model": "mock", + "gcp.vertex.agent.invocation_id": PRESENT, + "gcp.vertex.agent.session_id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="generate_content mock", + attributes={ + "gen_ai.operation.name": "generate_content", + "gen_ai.request.model": "mock", + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": PRESENT, + "gen_ai.response.finish_reasons": ["stop"], + "gen_ai.tool.definitions": [ + _TOOL_DEFINITION_NO_CONTENT + ], + }, + children=[ + SpanDigest( + name="execute_tool some_tool", + attributes={ + "gen_ai.operation.name": "execute_tool", + "gen_ai.tool.description": ( + TOOL_DESCRIPTION + ), + "gen_ai.tool.name": TOOL_NAME, + "gen_ai.tool.type": "FunctionTool", + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gcp.vertex.agent.tool_call_args": "{}", + "gen_ai.tool.call.id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.tool_response": "{}", + }, + ), + ], + logs=[ + LogDigest( + event_name=GEN_AI_COMPLETION_DETAILS_EVENT, + body=None, + attributes={ + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": ( + PRESENT + ), + "gen_ai.response.finish_reasons": [ + "stop" + ], + "gen_ai.input.messages": ( + _TURN_1_INPUT_MESSAGES + ), + "gen_ai.system_instructions": ( + _SYSTEM_INSTRUCTIONS + ), + "gen_ai.tool.definitions": [ + _TOOL_DEFINITION_FULL + ], + "gen_ai.output.messages": ( + _TURN_1_OUTPUT_MESSAGES + ), + }, + ), + ], + ), + ], + ), + SpanDigest( + name="call_llm", + attributes={ + "gen_ai.system": "gcp.vertex.agent", + "gen_ai.request.model": "mock", + "gcp.vertex.agent.invocation_id": PRESENT, + "gcp.vertex.agent.session_id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="generate_content mock", + attributes={ + "gen_ai.operation.name": "generate_content", + "gen_ai.request.model": "mock", + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": PRESENT, + "gen_ai.response.finish_reasons": ["stop"], + "gen_ai.tool.definitions": [ + _TOOL_DEFINITION_NO_CONTENT + ], + }, + logs=[ + LogDigest( + event_name=GEN_AI_COMPLETION_DETAILS_EVENT, + body=None, + attributes={ + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": ( + PRESENT + ), + "gen_ai.response.finish_reasons": [ + "stop" + ], + "gen_ai.input.messages": ( + _TURN_2_INPUT_MESSAGES + ), + "gen_ai.system_instructions": ( + _SYSTEM_INSTRUCTIONS + ), + "gen_ai.tool.definitions": [ + _TOOL_DEFINITION_FULL + ], + "gen_ai.output.messages": ( + _TURN_2_OUTPUT_MESSAGES + ), + }, + ), + ], + ), + ], + ), + ], + ), + ], +) + +EXPECTED_EXPERIMENTAL_SPAN_AND_EVENT = SpanDigest( + name="invocation", + attributes={}, + children=[ + SpanDigest( + name="invoke_agent some_root_agent", + attributes={ + "gen_ai.operation.name": "invoke_agent", + "gen_ai.agent.description": AGENT_DESCRIPTION, + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + }, + children=[ + SpanDigest( + name="call_llm", + attributes={ + "gen_ai.system": "gcp.vertex.agent", + "gen_ai.request.model": "mock", + "gcp.vertex.agent.invocation_id": PRESENT, + "gcp.vertex.agent.session_id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="generate_content mock", + attributes={ + "gen_ai.operation.name": "generate_content", + "gen_ai.request.model": "mock", + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": PRESENT, + "gen_ai.response.finish_reasons": ["stop"], + "gen_ai.input.messages": _TURN_1_INPUT_MESSAGES, + "gen_ai.system_instructions": ( + _SYSTEM_INSTRUCTIONS + ), + "gen_ai.tool.definitions": [ + _TOOL_DEFINITION_FULL + ], + "gen_ai.output.messages": ( + _TURN_1_OUTPUT_MESSAGES + ), + }, + children=[ + SpanDigest( + name="execute_tool some_tool", + attributes={ + "gen_ai.operation.name": "execute_tool", + "gen_ai.tool.description": ( + TOOL_DESCRIPTION + ), + "gen_ai.tool.name": TOOL_NAME, + "gen_ai.tool.type": "FunctionTool", + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gcp.vertex.agent.tool_call_args": "{}", + "gen_ai.tool.call.id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.tool_response": "{}", + }, + ), + ], + logs=[ + LogDigest( + event_name=GEN_AI_COMPLETION_DETAILS_EVENT, + body=None, + attributes={ + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": ( + PRESENT + ), + "gen_ai.response.finish_reasons": [ + "stop" + ], + "gen_ai.input.messages": ( + _TURN_1_INPUT_MESSAGES + ), + "gen_ai.system_instructions": ( + _SYSTEM_INSTRUCTIONS + ), + "gen_ai.tool.definitions": [ + _TOOL_DEFINITION_FULL + ], + "gen_ai.output.messages": ( + _TURN_1_OUTPUT_MESSAGES + ), + }, + ), + ], + ), + ], + ), + SpanDigest( + name="call_llm", + attributes={ + "gen_ai.system": "gcp.vertex.agent", + "gen_ai.request.model": "mock", + "gcp.vertex.agent.invocation_id": PRESENT, + "gcp.vertex.agent.session_id": PRESENT, + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.llm_request": "{}", + "gcp.vertex.agent.llm_response": "{}", + "gen_ai.response.finish_reasons": ["stop"], + }, + children=[ + SpanDigest( + name="generate_content mock", + attributes={ + "gen_ai.operation.name": "generate_content", + "gen_ai.request.model": "mock", + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": PRESENT, + "gen_ai.response.finish_reasons": ["stop"], + "gen_ai.input.messages": _TURN_2_INPUT_MESSAGES, + "gen_ai.system_instructions": ( + _SYSTEM_INSTRUCTIONS + ), + "gen_ai.tool.definitions": [ + _TOOL_DEFINITION_FULL + ], + "gen_ai.output.messages": ( + _TURN_2_OUTPUT_MESSAGES + ), + }, + logs=[ + LogDigest( + event_name=GEN_AI_COMPLETION_DETAILS_EVENT, + body=None, + attributes={ + "gen_ai.agent.name": AGENT_NAME, + "gen_ai.conversation.id": PRESENT, + "user.id": "test_user", + "gcp.vertex.agent.event_id": PRESENT, + "gcp.vertex.agent.invocation_id": ( + PRESENT + ), + "gen_ai.response.finish_reasons": [ + "stop" + ], + "gen_ai.input.messages": ( + _TURN_2_INPUT_MESSAGES + ), + "gen_ai.system_instructions": ( + _SYSTEM_INSTRUCTIONS + ), + "gen_ai.tool.definitions": [ + _TOOL_DEFINITION_FULL + ], + "gen_ai.output.messages": ( + _TURN_2_OUTPUT_MESSAGES + ), + }, + ), + ], + ), + ], + ), + ], + ), + ], +) + +ALL_CASES: list[FunctionalTestCase] = [ + FunctionalTestCase( + test_id="stable-no-capture", + semconv_opt_in=None, + capture_content="false", + expected_root=EXPECTED_STABLE_NO_CAPTURE, + ), + FunctionalTestCase( + test_id="stable-capture", + semconv_opt_in=None, + capture_content="true", + expected_root=EXPECTED_STABLE_CAPTURE, + ), + FunctionalTestCase( + test_id="experimental-no-content", + semconv_opt_in=EXPERIMENTAL_OPT_IN, + capture_content="no_content", + expected_root=EXPECTED_EXPERIMENTAL_NO_CONTENT, + ), + FunctionalTestCase( + test_id="experimental-span-only", + semconv_opt_in=EXPERIMENTAL_OPT_IN, + capture_content="span_only", + expected_root=EXPECTED_EXPERIMENTAL_SPAN_ONLY, + ), + FunctionalTestCase( + test_id="experimental-event-only", + semconv_opt_in=EXPERIMENTAL_OPT_IN, + capture_content="event_only", + expected_root=EXPECTED_EXPERIMENTAL_EVENT_ONLY, + ), + FunctionalTestCase( + test_id="experimental-span-and-event", + semconv_opt_in=EXPERIMENTAL_OPT_IN, + capture_content="span_and_event", + expected_root=EXPECTED_EXPERIMENTAL_SPAN_AND_EVENT, + ), +] + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "case", + ALL_CASES, + ids=[c.test_id for c in ALL_CASES], +) +async def test_telemetry_shapes( + case: FunctionalTestCase, + monkeypatch: pytest.MonkeyPatch, +): + # Arrange + case.apply_env(monkeypatch) + span_exporter = InMemorySpanExporter() + log_exporter = InMemoryLogRecordExporter() + install_telemetry(monkeypatch, span_exporter, log_exporter) + runner = build_test_runner() + + # Act + await run_agent_scenario(runner) + + # Assert + spans = span_exporter.get_finished_spans() + logs = log_exporter.get_finished_logs() + root_digest = SpanDigest.build(tuple(spans), tuple(logs)) + + assert root_digest == case.expected_root diff --git a/tests/unittests/telemetry/test_metrics.py b/tests/unittests/telemetry/test_metrics.py index cab10a5c6e..d2fffa4c08 100644 --- a/tests/unittests/telemetry/test_metrics.py +++ b/tests/unittests/telemetry/test_metrics.py @@ -31,12 +31,16 @@ def _mock_meter_setup(monkeypatch): request_size_hist = mock.MagicMock(spec=metrics.Histogram) response_size_hist = mock.MagicMock(spec=metrics.Histogram) steps_hist = mock.MagicMock(spec=metrics.Histogram) + client_duration_hist = mock.MagicMock(spec=metrics.Histogram) + client_token_usage_hist = mock.MagicMock(spec=metrics.Histogram) agent_duration_hist.name = "agent_invocation_duration" tool_duration_hist.name = "tool_execution_duration" request_size_hist.name = "agent_request_size" response_size_hist.name = "agent_response_size" steps_hist.name = "agent_workflow_steps" + client_duration_hist.name = "client_operation_duration" + client_token_usage_hist.name = "client_token_usage" def create_histogram_side_effect(name, **_kwargs): if name == "gen_ai.agent.invocation.duration": @@ -49,6 +53,10 @@ def create_histogram_side_effect(name, **_kwargs): return response_size_hist elif name == "gen_ai.agent.workflow.steps": return steps_hist + elif name == "gen_ai.client.operation.duration": + return client_duration_hist + elif name == "gen_ai.client.token.usage": + return client_token_usage_hist raise ValueError(f"Unknown metric name: {name}") mock_meter.create_histogram.side_effect = create_histogram_side_effect @@ -62,6 +70,10 @@ def create_histogram_side_effect(name, **_kwargs): monkeypatch.setattr(_metrics, "_agent_request_size", request_size_hist) monkeypatch.setattr(_metrics, "_agent_response_size", response_size_hist) monkeypatch.setattr(_metrics, "_agent_workflow_steps", steps_hist) + monkeypatch.setattr( + _metrics, "_client_operation_duration", client_duration_hist + ) + monkeypatch.setattr(_metrics, "_client_token_usage", client_token_usage_hist) return { "meter": mock_meter, @@ -70,6 +82,8 @@ def create_histogram_side_effect(name, **_kwargs): "request_size": request_size_hist, "response_size": response_size_hist, "steps": steps_hist, + "client_duration": client_duration_hist, + "client_token_usage": client_token_usage_hist, } @@ -234,3 +248,89 @@ def test_record_tool_execution_duration_with_error(mock_meter_setup): ) def test_get_content_size(content, expected_size): assert _metrics._get_content_size(content) == expected_size + + +def test_record_client_operation_duration(mock_meter_setup): + """Tests record_client_operation_duration records correctly.""" + llm_request = mock.MagicMock( + contents=[types.Content(parts=[types.Part(text="hello")])] + ) + response = mock.MagicMock( + content=types.Content(parts=[types.Part(text="hello response")]) + ) + _metrics.record_client_operation_duration( + agent_name="test_agent", + elapsed_ms=100.0, + llm_request=llm_request, + responses=[response], + ) + client_duration_hist = mock_meter_setup["client_duration"] + client_duration_hist.record.assert_called_once() + args, kwargs = client_duration_hist.record.call_args + assert args[0] == 0.1 + want_attributes = { + "gen_ai.agent.name": "test_agent", + "gen_ai.operation.name": "generate_content", + "gen_ai.provider.name": "gemini", + "gen_ai.request.model": llm_request.model, + "gen_ai.response.model": response.model_version, + } + assert kwargs["attributes"] == want_attributes + + +def test_record_client_token_usage(mock_meter_setup): + """Tests record_client_token_usage records correctly under different usage conditions.""" + llm_request = mock.MagicMock( + contents=[types.Content(parts=[types.Part(text="hello")])], + model="test-model", + ) + response = mock.MagicMock( + content=types.Content(parts=[types.Part(text="hello response")]), + model_version="test-model-v1", + usage_metadata=types.GenerateContentResponseUsageMetadata( + prompt_token_count=20, + candidates_token_count=30, + tool_use_prompt_token_count=5, + thoughts_token_count=10, + ), + ) + _metrics.record_client_token_usage( + agent_name="test_agent", + llm_request=llm_request, + responses=[response], + ) + client_token_usage_hist = mock_meter_setup["client_token_usage"] + assert client_token_usage_hist.record.call_count == 2 + + base_attributes = { + "gen_ai.agent.name": "test_agent", + "gen_ai.operation.name": "generate_content", + "gen_ai.provider.name": "gemini", + "gen_ai.request.model": "test-model", + "gen_ai.response.model": "test-model-v1", + } + + input_call = None + output_call = None + + for args, kwargs in client_token_usage_hist.record.call_args_list: + token_type = kwargs.get("attributes", {}).get("gen_ai.token.type") + if token_type == "input": + input_call = (args, kwargs) + elif token_type == "output": + output_call = (args, kwargs) + + assert input_call is not None, "Missing 'input' token usage record" + assert output_call is not None, "Missing 'output' token usage record" + + # Verify input tokens (prompt_token_count + tool_use_prompt_token_count) + assert input_call[0][0] == 25 + assert input_call[1]["attributes"] == base_attributes | { + "gen_ai.token.type": "input" + } + + # Verify output tokens (candidates_token_count + thoughts_token_count) + assert output_call[0][0] == 40 + assert output_call[1]["attributes"] == base_attributes | { + "gen_ai.token.type": "output" + } diff --git a/tests/unittests/testing_utils.py b/tests/unittests/testing_utils.py index 4f9b8636fe..4f8d4517fe 100644 --- a/tests/unittests/testing_utils.py +++ b/tests/unittests/testing_utils.py @@ -330,6 +330,9 @@ def create( list[types.Part], list[LlmResponse], list[str], list[list[types.Part]] ], error: Union[Exception, None] = None, + usage_metadata: Optional[ + types.GenerateContentResponseUsageMetadata + ] = None, ): if error and not responses: return cls(responses=[], error=error) @@ -340,14 +343,18 @@ def create( return cls(responses=responses) else: responses = [ - LlmResponse(content=ModelContent(item)) + LlmResponse( + content=ModelContent(item), + usage_metadata=usage_metadata, + ) if isinstance(item, list) and isinstance(item[0], types.Part) # responses is list[list[Part]] else LlmResponse( content=ModelContent( # responses is list[str] or list[Part] [Part(text=item) if isinstance(item, str) else item] - ) + ), + usage_metadata=usage_metadata, ) for item in responses if item From c5fb92ff115f0e9d4704ff7d68f237ed821a8fc2 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Fri, 22 May 2026 10:44:20 -0700 Subject: [PATCH 26/94] fix: Use Pydantic TypeAdapter in FunctionTool for automatic argument coercion and validation PiperOrigin-RevId: 919753495 --- src/google/adk/tools/function_tool.py | 60 ++++++++++----------- tests/unittests/tools/test_function_tool.py | 27 ---------- 2 files changed, 29 insertions(+), 58 deletions(-) diff --git a/src/google/adk/tools/function_tool.py b/src/google/adk/tools/function_tool.py index bf4e8aa932..10e32a5473 100644 --- a/src/google/adk/tools/function_tool.py +++ b/src/google/adk/tools/function_tool.py @@ -14,7 +14,6 @@ from __future__ import annotations -import functools import inspect import logging from typing import Any @@ -37,16 +36,6 @@ logger = logging.getLogger('google_adk.' + __name__) -@functools.cache -def _get_type_adapter(target_type: Any) -> pydantic.TypeAdapter | None: - """Returns a cached Pydantic TypeAdapter for the target type, or None if unsupported.""" - try: - return pydantic.TypeAdapter(target_type) - except Exception: # pylint: disable=broad-exception-caught - # If Pydantic doesn't support this type, cache None so we don't retry. - return None - - class FunctionTool(BaseTool): """A tool that wraps a user-defined Python function. @@ -135,26 +124,35 @@ def _preprocess_args(self, args: dict[str, Any]) -> dict[str, Any]: if param_name in args and param.annotation != inspect.Parameter.empty: target_type = param.annotation - # Use Pydantic TypeAdapter for automatic coercion and validation. - adapter = _get_type_adapter(target_type) - if adapter is None: - continue - - try: - converted_args[param_name] = adapter.validate_python(args[param_name]) - except pydantic.ValidationError as e: - logger.warning( - "Failed to validate/convert argument '%s'. Received value %r" - ' (type %s), expected type %s. Value remains unchanged.' - ' Exception: %s', - param_name, - args[param_name], - type(args[param_name]).__name__, - target_type, - e, - ) - # Keep the original value if conversion fails, matching previous behavior. - pass + # Handle Optional[PydanticModel] types + if get_origin(param.annotation) is Union: + union_args = get_args(param.annotation) + # Find the non-None type in Optional[T] (which is Union[T, None]) + non_none_types = [arg for arg in union_args if arg is not type(None)] + if len(non_none_types) == 1: + target_type = non_none_types[0] + + # Check if the target type is a Pydantic model + if inspect.isclass(target_type) and issubclass( + target_type, pydantic.BaseModel + ): + # Skip conversion if the value is None and the parameter is Optional + if args[param_name] is None: + continue + + # Convert to Pydantic model if it's not already the correct type + if not isinstance(args[param_name], target_type): + try: + converted_args[param_name] = target_type.model_validate( + args[param_name] + ) + except Exception as e: + logger.warning( + f"Failed to convert argument '{param_name}' to Pydantic model" + f' {target_type.__name__}: {e}' + ) + # Keep the original value if conversion fails + pass return converted_args diff --git a/tests/unittests/tools/test_function_tool.py b/tests/unittests/tools/test_function_tool.py index 46ce34f634..9c76529fb5 100644 --- a/tests/unittests/tools/test_function_tool.py +++ b/tests/unittests/tools/test_function_tool.py @@ -529,30 +529,3 @@ async def async_tool(query: str, context: Context) -> dict: assert result["query"] == "hello" assert result["context_type"] == "Context" - - -@pytest.mark.parametrize( - "input_value, expected_type, expected_value", - [ - (5.0, int, 5), # Float to int coercion - (5.5, float, 5.5), # Unsafe float, no coercion - ("5", int, 5), # String to int coercion - ("-5", int, -5), # Negative string to int coercion - ("5.5", str, "5.5"), # Unsafe string, no coercion - ], -) -def test_preprocess_args_int_coercion( - input_value, expected_type, expected_value -): - """Test _preprocess_args handles coercion to int parameters.""" - - def simple_function(limit: int) -> dict: - return {"limit": limit} - - tool = FunctionTool(simple_function) - - input_args = {"limit": input_value} - processed_args = tool._preprocess_args(input_args) - - assert isinstance(processed_args["limit"], expected_type) - assert processed_args["limit"] == expected_value From ce33b9845207182c43261fab6c6ee0152564b97c Mon Sep 17 00:00:00 2001 From: Shangjie Chen Date: Tue, 26 May 2026 16:20:05 -0700 Subject: [PATCH 27/94] ADK changes Co-authored-by: Shangjie Chen PiperOrigin-RevId: 921747464 --- .github/.release-please-manifest-v1.json | 3 + .github/.release-please-manifest.json | 2 +- .github/release-please-config-v1.json | 63 ++++++++++++++ .github/release-please-config.json | 5 +- .../analyze-releases-for-adk-docs-updates.yml | 8 +- .github/workflows/check-file-contents.yml | 14 --- .github/workflows/discussion_answering.yml | 2 +- .github/workflows/issue-monitor.yml | 2 +- .github/workflows/pr-triage.yml | 2 +- .github/workflows/pre-commit.yml | 4 +- .github/workflows/python-unit-tests.yml | 18 +--- .github/workflows/release-v1-cherry-pick.yml | 43 ++++++++++ .github/workflows/release-v1-cut.yml | 46 ++++++++++ .github/workflows/release-v1-finalize.yml | 85 +++++++++++++++++++ .github/workflows/release-v1-please.yml | 41 +++++++++ .github/workflows/release-v1-publish.yml | 79 +++++++++++++++++ .github/workflows/stale-bot.yml | 18 +--- .github/workflows/triage.yml | 2 +- .../upload-adk-docs-to-vertex-ai-search.yml | 2 +- 19 files changed, 378 insertions(+), 61 deletions(-) create mode 100644 .github/.release-please-manifest-v1.json create mode 100644 .github/release-please-config-v1.json create mode 100644 .github/workflows/release-v1-cherry-pick.yml create mode 100644 .github/workflows/release-v1-cut.yml create mode 100644 .github/workflows/release-v1-finalize.yml create mode 100644 .github/workflows/release-v1-please.yml create mode 100644 .github/workflows/release-v1-publish.yml diff --git a/.github/.release-please-manifest-v1.json b/.github/.release-please-manifest-v1.json new file mode 100644 index 0000000000..4a263fa42a --- /dev/null +++ b/.github/.release-please-manifest-v1.json @@ -0,0 +1,3 @@ +{ + ".": "2.0.0-alpha.1" +} diff --git a/.github/.release-please-manifest.json b/.github/.release-please-manifest.json index 1aa7bc97e6..895bf0e35e 100644 --- a/.github/.release-please-manifest.json +++ b/.github/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.34.0" + ".": "2.0.0" } diff --git a/.github/release-please-config-v1.json b/.github/release-please-config-v1.json new file mode 100644 index 0000000000..de82db0991 --- /dev/null +++ b/.github/release-please-config-v1.json @@ -0,0 +1,63 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "packages": { + ".": { + "release-type": "python", + "versioning": "prerelease", + "prerelease": true, + "prerelease-type": "alpha", + "package-name": "google-adk", + "include-component-in-tag": false, + "skip-github-release": true, + "changelog-path": "CHANGELOG-v2.md", + "changelog-sections": [ + { + "type": "feat", + "section": "Features" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "perf", + "section": "Performance Improvements" + }, + { + "type": "refactor", + "section": "Code Refactoring" + }, + { + "type": "docs", + "section": "Documentation" + }, + { + "type": "test", + "section": "Tests", + "hidden": true + }, + { + "type": "build", + "section": "Build System", + "hidden": true + }, + { + "type": "ci", + "section": "CI/CD", + "hidden": true + }, + { + "type": "style", + "section": "Styles", + "hidden": true + }, + { + "type": "chore", + "section": "Miscellaneous Chores", + "hidden": true + } + ] + } + }, + "last-release-sha": "4af7cbb5c8319208337e18b0a6bc55288b51b0b1" +} diff --git a/.github/release-please-config.json b/.github/release-please-config.json index de6a8a5fb5..865e5230e0 100644 --- a/.github/release-please-config.json +++ b/.github/release-please-config.json @@ -1,10 +1,8 @@ { "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", - "last-release-sha": "07a9a01b3c1fb2866cc8bdcd8d8ab0906aa88682", "packages": { ".": { "release-type": "python", - "versioning": "always-bump-minor", "package-name": "google-adk", "include-component-in-tag": false, "skip-github-release": true, @@ -57,5 +55,6 @@ } ] } - } + }, + "last-release-sha": "e6537decc910d64a31e6646064e8290b02af4511" } diff --git a/.github/workflows/analyze-releases-for-adk-docs-updates.yml b/.github/workflows/analyze-releases-for-adk-docs-updates.yml index 7932ecad32..0cb270eb5c 100644 --- a/.github/workflows/analyze-releases-for-adk-docs-updates.yml +++ b/.github/workflows/analyze-releases-for-adk-docs-updates.yml @@ -51,7 +51,7 @@ jobs: if: ${{ github.event.inputs.resume == 'true' }} uses: actions/cache/restore@v4 with: - path: contributing/samples/adk_documentation/adk_release_analyzer/sessions.db + path: contributing/samples/adk_team/adk_documentation/adk_release_analyzer/sessions.db key: analyzer-session-db - name: Run Analyzing Script @@ -64,9 +64,9 @@ jobs: DOC_REPO: 'adk-docs' CODE_REPO: 'adk-python' INTERACTIVE: 0 - PYTHONPATH: contributing/samples/adk_documentation + PYTHONPATH: contributing/samples/adk_team run: >- - python -m adk_release_analyzer.main + python -m adk_documentation.adk_release_analyzer.main ${{ github.event.inputs.resume == 'true' && '--resume' || '' }} ${{ github.event.inputs.start_tag && format('--start-tag {0}', github.event.inputs.start_tag) || '' }} ${{ github.event.inputs.end_tag && format('--end-tag {0}', github.event.inputs.end_tag) || '' }} @@ -75,5 +75,5 @@ jobs: if: always() uses: actions/cache/save@v4 with: - path: contributing/samples/adk_documentation/adk_release_analyzer/sessions.db + path: contributing/samples/adk_team/adk_documentation/adk_release_analyzer/sessions.db key: analyzer-session-db diff --git a/.github/workflows/check-file-contents.yml b/.github/workflows/check-file-contents.yml index f703422f76..985f6a0f77 100644 --- a/.github/workflows/check-file-contents.yml +++ b/.github/workflows/check-file-contents.yml @@ -1,17 +1,3 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - name: "Check file contents" on: diff --git a/.github/workflows/discussion_answering.yml b/.github/workflows/discussion_answering.yml index eda9bb27dd..c5e2209137 100644 --- a/.github/workflows/discussion_answering.yml +++ b/.github/workflows/discussion_answering.yml @@ -48,7 +48,7 @@ jobs: OWNER: 'google' REPO: 'adk-python' INTERACTIVE: 0 - PYTHONPATH: contributing/samples + PYTHONPATH: contributing/samples/adk_team run: | # Write discussion data to temporary file to avoid secret masking issues cat > /tmp/discussion.json << 'EOF' diff --git a/.github/workflows/issue-monitor.yml b/.github/workflows/issue-monitor.yml index e0dc82dcf7..6fee4c9a7d 100644 --- a/.github/workflows/issue-monitor.yml +++ b/.github/workflows/issue-monitor.yml @@ -59,5 +59,5 @@ jobs: CONCURRENCY_LIMIT: 3 INITIAL_FULL_SCAN: ${{ github.event.inputs.full_scan == 'true' }} LLM_MODEL_NAME: "gemini-2.5-flash" - PYTHONPATH: contributing/samples + PYTHONPATH: contributing/samples/adk_team run: python -m adk_issue_monitoring_agent.main diff --git a/.github/workflows/pr-triage.yml b/.github/workflows/pr-triage.yml index 6557820f04..13199667de 100644 --- a/.github/workflows/pr-triage.yml +++ b/.github/workflows/pr-triage.yml @@ -41,5 +41,5 @@ jobs: REPO: 'adk-python' PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number || github.event.inputs.pr_number }} INTERACTIVE: ${{ vars.PR_TRIAGE_INTERACTIVE }} - PYTHONPATH: contributing/samples + PYTHONPATH: contributing/samples/adk_team run: python -m adk_pr_triaging_agent.main diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 23a032f87a..f18020a86b 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -16,13 +16,13 @@ name: Pre-commit Checks on: push: - branches: [main, v2] + branches: [main, v1, v2] paths: - '**.py' - '.pre-commit-config.yaml' - 'pyproject.toml' pull_request: - branches: [main, v2] + branches: [main, v1, v2] paths: - '**.py' - '.pre-commit-config.yaml' diff --git a/.github/workflows/python-unit-tests.yml b/.github/workflows/python-unit-tests.yml index 6e204a8e67..fcedce9acc 100644 --- a/.github/workflows/python-unit-tests.yml +++ b/.github/workflows/python-unit-tests.yml @@ -1,24 +1,10 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - name: Python Unit Tests on: push: - branches: [ main ] + branches: [main, v1, v2] pull_request: - branches: [ main ] + branches: [main, v1, v2] permissions: contents: read diff --git a/.github/workflows/release-v1-cherry-pick.yml b/.github/workflows/release-v1-cherry-pick.yml new file mode 100644 index 0000000000..91e858590b --- /dev/null +++ b/.github/workflows/release-v1-cherry-pick.yml @@ -0,0 +1,43 @@ +# Step 3 (v1, optional): Cherry-picks a commit from v1 to the release/v1-candidate branch. +# Use between step 1 and step 4 to include bug fixes in an in-progress release. +# Note: Does NOT auto-trigger release-please to preserve manual changelog edits. +name: "Release v1: Cherry-pick" + +on: + workflow_dispatch: + inputs: + commit_sha: + description: 'Commit SHA to cherry-pick' + required: true + type: string + +permissions: + contents: write + +jobs: + cherry-pick: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + with: + ref: release/v1-candidate + fetch-depth: 0 + + - name: Configure git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Cherry-pick commit + run: | + echo "Cherry-picking ${INPUTS_COMMIT_SHA} to release/v1-candidate" + git cherry-pick ${INPUTS_COMMIT_SHA} + env: + INPUTS_COMMIT_SHA: ${{ inputs.commit_sha }} + + - name: Push changes + run: | + git push origin release/v1-candidate + echo "Successfully cherry-picked commit to release/v1-candidate" + echo "Note: Release Please is NOT auto-triggered to preserve manual changelog edits." + echo "Run release-v1-please.yml manually if you want to regenerate the changelog." diff --git a/.github/workflows/release-v1-cut.yml b/.github/workflows/release-v1-cut.yml new file mode 100644 index 0000000000..7a35b6a120 --- /dev/null +++ b/.github/workflows/release-v1-cut.yml @@ -0,0 +1,46 @@ +# Step 1 (v1): Starts the v1 release process by creating a release/v1-candidate branch. +# Generates a changelog PR for review (step 2). +name: "Release v1: Cut" + +on: + workflow_dispatch: + inputs: + commit_sha: + description: 'Commit SHA to cut from (leave empty for latest v1)' + required: false + type: string + +permissions: + contents: write + actions: write + +jobs: + cut-release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + with: + ref: ${{ inputs.commit_sha || 'v1' }} + + - name: Check for existing release/v1-candidate branch + env: + GH_TOKEN: ${{ github.token }} + run: | + if git ls-remote --exit-code --heads origin release/v1-candidate &>/dev/null; then + echo "Error: release/v1-candidate branch already exists" + echo "Please finalize or delete the existing release candidate before starting a new one" + exit 1 + fi + + - name: Create and push release/v1-candidate branch + run: | + git checkout -b release/v1-candidate + git push origin release/v1-candidate + echo "Created branch: release/v1-candidate" + + - name: Trigger Release Please + env: + GH_TOKEN: ${{ github.token }} + run: | + gh workflow run release-v1-please.yml --repo ${{ github.repository }} --ref release/v1-candidate + echo "Triggered Release Please workflow for v1" diff --git a/.github/workflows/release-v1-finalize.yml b/.github/workflows/release-v1-finalize.yml new file mode 100644 index 0000000000..df6e3477e7 --- /dev/null +++ b/.github/workflows/release-v1-finalize.yml @@ -0,0 +1,85 @@ +# Step 4 (v1): Triggers when the changelog PR is merged to release/v1-candidate. +# Records last-release-sha and renames release/v1-candidate to release/v{version}. +name: "Release v1: Finalize" + +on: + pull_request: + types: [closed] + branches: + - release/v1-candidate + +permissions: + contents: write + pull-requests: write + +jobs: + finalize: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - name: Check for release-please PR + id: check + env: + LABELS: ${{ toJson(github.event.pull_request.labels.*.name) }} + run: | + if echo "$LABELS" | grep -q "autorelease: pending"; then + echo "is_release_pr=true" >> $GITHUB_OUTPUT + else + echo "Not a release-please PR, skipping" + echo "is_release_pr=false" >> $GITHUB_OUTPUT + fi + + - uses: actions/checkout@v6 + if: steps.check.outputs.is_release_pr == 'true' + with: + ref: release/v1-candidate + token: ${{ secrets.RELEASE_PAT }} + fetch-depth: 0 + + - name: Extract version from manifest + if: steps.check.outputs.is_release_pr == 'true' + id: version + run: | + VERSION=$(jq -r '.["."]' .github/.release-please-manifest-v1.json) + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "Extracted version: $VERSION" + + - name: Configure git identity from RELEASE_PAT + if: steps.check.outputs.is_release_pr == 'true' + env: + GH_TOKEN: ${{ secrets.RELEASE_PAT }} + run: | + USER_JSON=$(gh api user) + git config user.name "$(echo "$USER_JSON" | jq -r '.login')" + git config user.email "$(echo "$USER_JSON" | jq -r '.id')+$(echo "$USER_JSON" | jq -r '.login')@users.noreply.github.com" + + - name: Record last-release-sha for release-please + if: steps.check.outputs.is_release_pr == 'true' + run: | + git fetch origin v1 + CUT_SHA=$(git merge-base origin/v1 HEAD) + echo "Release was cut from v1 at: $CUT_SHA" + jq --arg sha "$CUT_SHA" '. + {"last-release-sha": $sha}' \ + .github/release-please-config-v1.json > tmp.json && mv tmp.json .github/release-please-config-v1.json + git add .github/release-please-config-v1.json + git commit -m "chore: update last-release-sha for next v1 release" + git push origin release/v1-candidate + + - name: Rename release/v1-candidate to release/v{version} + if: steps.check.outputs.is_release_pr == 'true' + run: | + VERSION="v${STEPS_VERSION_OUTPUTS_VERSION}" + git push origin "release/v1-candidate:refs/heads/release/$VERSION" ":release/v1-candidate" + echo "Renamed release/v1-candidate to release/$VERSION" + env: + STEPS_VERSION_OUTPUTS_VERSION: ${{ steps.version.outputs.version }} + + - name: Update PR label to tagged + if: steps.check.outputs.is_release_pr == 'true' + env: + GH_TOKEN: ${{ github.token }} + run: | + gh pr edit ${{ github.event.pull_request.number }} \ + --remove-label "autorelease: pending" \ + --add-label "autorelease: tagged" + echo "Updated PR label to autorelease: tagged" diff --git a/.github/workflows/release-v1-please.yml b/.github/workflows/release-v1-please.yml new file mode 100644 index 0000000000..9f1344dd31 --- /dev/null +++ b/.github/workflows/release-v1-please.yml @@ -0,0 +1,41 @@ +# Runs release-please to create/update a PR with version bump and changelog for v1. +# Triggered only by workflow_dispatch (from release-v1-cut.yml). +# Does NOT auto-run on push to preserve manual changelog edits after cherry-picks. +name: "Release v1: Please" + +on: + # Only run via workflow_dispatch (triggered by release-v1-cut.yml) + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - name: Check if release/v1-candidate still exists + id: check + env: + GH_TOKEN: ${{ github.token }} + run: | + if gh api repos/${{ github.repository }}/branches/release/v1-candidate --silent 2>/dev/null; then + echo "exists=true" >> $GITHUB_OUTPUT + else + echo "release/v1-candidate branch no longer exists, skipping" + echo "exists=false" >> $GITHUB_OUTPUT + fi + + - uses: actions/checkout@v6 + if: steps.check.outputs.exists == 'true' + with: + ref: release/v1-candidate + + - uses: googleapis/release-please-action@v4 + if: steps.check.outputs.exists == 'true' + with: + token: ${{ secrets.RELEASE_PAT }} + config-file: .github/release-please-config-v1.json + manifest-file: .github/.release-please-manifest-v1.json + target-branch: release/v1-candidate diff --git a/.github/workflows/release-v1-publish.yml b/.github/workflows/release-v1-publish.yml new file mode 100644 index 0000000000..a4f3b1419f --- /dev/null +++ b/.github/workflows/release-v1-publish.yml @@ -0,0 +1,79 @@ +# Step 6 (v1): Builds and publishes the v1 package to PyPI from a release/v{version} branch. +# Reads version from .release-please-manifest-v1.json, converts to PEP 440, +# updates version.py, then builds and publishes. +# Creates a merge-back PR (step 7) to sync release changes to v1. +name: "Release v1: Publish to PyPi" + +on: + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: Validate branch + run: | + if [[ ! "${GITHUB_REF_NAME}" =~ ^release/v[0-9]+\.[0-9]+\.[0-9]+ ]]; then + echo "Error: Must run from a release/v* branch (e.g., release/v1.34.1)" + exit 1 + fi + + - uses: actions/checkout@v6 + + - name: Extract version from manifest and convert to PEP 440 + id: version + run: | + VERSION=$(jq -r '.["."]' .github/.release-please-manifest-v1.json) + echo "semver=$VERSION" >> $GITHUB_OUTPUT + echo "Semver version: $VERSION" + + # Convert semver pre-release to PEP 440: + # 1.35.0-alpha.1 -> 1.35.0a1 + # 1.35.0-beta.1 -> 1.35.0b1 + # 1.35.0-rc.1 -> 1.35.0rc1 + # 1.35.0 -> 1.35.0 (no change for stable) + PEP440=$(echo "$VERSION" | sed -E 's/-alpha\./a/; s/-beta\./b/; s/-rc\./rc/') + echo "pep440=$PEP440" >> $GITHUB_OUTPUT + echo "PEP 440 version: $PEP440" + + - name: Install uv + uses: astral-sh/setup-uv@v4 + with: + version: "latest" + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Update version.py with PEP 440 version + env: + PEP440_VERSION: ${{ steps.version.outputs.pep440 }} + run: | + sed -i "s/^__version__ = .*/__version__ = \"${PEP440_VERSION}\"/" src/google/adk/version.py + echo "Updated version.py to ${PEP440_VERSION}" + grep __version__ src/google/adk/version.py + + - name: Build package + run: uv build + + - name: Publish to PyPI + env: + UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }} + run: uv publish + + - name: Create merge-back PR + env: + GH_TOKEN: ${{ secrets.RELEASE_PAT }} + SEMVER_VERSION: ${{ steps.version.outputs.semver }} + PEP440_VERSION: ${{ steps.version.outputs.pep440 }} + run: | + gh pr create \ + --base v1 \ + --head "${GITHUB_REF_NAME}" \ + --title "chore: merge release v${PEP440_VERSION} to v1" \ + --body "Syncs version bump and CHANGELOG from release v${SEMVER_VERSION} to v1." diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml index d3b7533228..e008549a6d 100644 --- a/.github/workflows/stale-bot.yml +++ b/.github/workflows/stale-bot.yml @@ -1,17 +1,3 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - name: ADK Stale Issue Auditor on: @@ -43,7 +29,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install requests google-adk + pip install requests google-adk python-dateutil - name: Run Auditor Agent Script env: @@ -53,6 +39,6 @@ jobs: REPO: adk-python CONCURRENCY_LIMIT: 3 LLM_MODEL_NAME: "gemini-2.5-flash" - PYTHONPATH: contributing/samples + PYTHONPATH: contributing/samples/adk_team run: python -m adk_stale_agent.main diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index 7ff668c589..396d1647bd 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -50,5 +50,5 @@ jobs: ISSUE_TITLE: ${{ github.event.issue.title }} ISSUE_BODY: ${{ github.event.issue.body }} ISSUE_COUNT_TO_PROCESS: '3' # Process 3 issues at a time on schedule - PYTHONPATH: contributing/samples + PYTHONPATH: contributing/samples/adk_team run: python -m adk_triaging_agent.main diff --git a/.github/workflows/upload-adk-docs-to-vertex-ai-search.yml b/.github/workflows/upload-adk-docs-to-vertex-ai-search.yml index 465fed4c21..b3b069341b 100644 --- a/.github/workflows/upload-adk-docs-to-vertex-ai-search.yml +++ b/.github/workflows/upload-adk-docs-to-vertex-ai-search.yml @@ -51,5 +51,5 @@ jobs: GCS_BUCKET_NAME: ${{ secrets.GCS_BUCKET_NAME }} ADK_DOCS_ROOT_PATH: /tmp/adk-docs ADK_PYTHON_ROOT_PATH: /tmp/adk-python - PYTHONPATH: contributing/samples + PYTHONPATH: ${{ github.workspace }}/contributing/samples/adk_team run: python -m adk_answering_agent.upload_docs_to_vertex_ai_search From 7310464e13d9bb41c288c6d1178f8a4bf0e77f47 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Tue, 26 May 2026 19:54:39 -0700 Subject: [PATCH 28/94] feat: support custom request metadata inside local Dev UI PiperOrigin-RevId: 921832256 --- src/google/adk/cli/adk_web_server.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index 917aadf7d0..c427be0d5a 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -371,6 +371,7 @@ class RunAgentRequest(common.BaseModel): function_call_event_id: Optional[str] = None # for resume long-running functions invocation_id: Optional[str] = None + custom_metadata: Optional[dict[str, Any]] = None class CreateSessionRequest(common.BaseModel): @@ -1892,6 +1893,11 @@ async def run_agent(req: RunAgentRequest) -> list[Event]: self.current_app_name_ref.value = req.app_name runner = await self.get_runner_async(req.app_name) _set_telemetry_context_if_needed(runner) + run_config = ( + RunConfig(custom_metadata=req.custom_metadata) + if req.custom_metadata + else None + ) try: async with Aclosing( runner.run_async( @@ -1900,6 +1906,7 @@ async def run_agent(req: RunAgentRequest) -> list[Event]: new_message=req.new_message, state_delta=req.state_delta, invocation_id=req.invocation_id, + run_config=run_config, ) ) as agen: events = [event async for event in agen] @@ -1936,13 +1943,17 @@ async def run_agent_sse(req: RunAgentRequest) -> StreamingResponse: # Convert the events to properly formatted SSE async def event_generator(): + run_config = RunConfig( + streaming_mode=stream_mode, + custom_metadata=req.custom_metadata, + ) async with Aclosing( runner.run_async( user_id=req.user_id, session_id=req.session_id, new_message=req.new_message, state_delta=req.state_delta, - run_config=RunConfig(streaming_mode=stream_mode), + run_config=run_config, invocation_id=req.invocation_id, ) ) as agen: From 8da01ef6e19e7845285a266f77907cd805ee3518 Mon Sep 17 00:00:00 2001 From: Shangjie Chen Date: Wed, 27 May 2026 09:58:40 -0700 Subject: [PATCH 29/94] Chore: Updates the `open_source_workspace/` directory to align with the the main branch Co-authored-by: Shangjie Chen PiperOrigin-RevId: 922194471 --- .gitignore | 4 + .pre-commit-config.yaml | 10 +- AGENTS.md | 597 +----------------- CHANGELOG.md | 15 + CONTRIBUTING.md | 93 +-- README.md | 202 ++---- .../adk_project_overview_and_architecture.md | 9 + .../samples/{ => a2a}/a2a_auth/README.md | 0 .../samples/{ => a2a}/a2a_auth/__init__.py | 0 .../samples/{ => a2a}/a2a_auth/agent.py | 2 - .../remote_a2a/bigquery_agent/__init__.py | 0 .../remote_a2a/bigquery_agent/agent.json | 26 +- .../remote_a2a/bigquery_agent/agent.py | 1 - .../samples/{ => a2a}/a2a_basic/README.md | 0 .../samples/{ => a2a}/a2a_basic/__init__.py | 0 .../samples/{ => a2a}/a2a_basic/agent.py | 1 - .../remote_a2a/check_prime_agent/__init__.py | 0 .../remote_a2a/check_prime_agent/agent.json | 15 +- .../remote_a2a/check_prime_agent/agent.py | 1 - .../{ => a2a}/a2a_human_in_loop/README.md | 0 .../{ => a2a}/a2a_human_in_loop/__init__.py | 0 .../{ => a2a}/a2a_human_in_loop/agent.py | 1 - .../remote_a2a/human_in_loop/__init__.py | 0 .../remote_a2a/human_in_loop/agent.json | 26 +- .../remote_a2a}/human_in_loop/agent.py | 1 - .../samples/{ => a2a}/a2a_root/README.md | 0 .../samples/{ => a2a}/a2a_root/agent.py | 0 .../remote_a2a/hello_world/__init__.py | 0 .../a2a_root/remote_a2a/hello_world/agent.py | 2 +- .../adk_answering_agent/README.md | 0 .../adk_answering_agent/__init__.py | 0 .../adk_answering_agent/agent.py | 2 +- .../gemini_assistant/__init__.py | 0 .../gemini_assistant/agent.py | 2 +- .../adk_answering_agent/main.py | 0 .../adk_answering_agent/settings.py | 0 .../adk_answering_agent/tools.py | 0 .../upload_docs_to_vertex_ai_search.py | 0 .../adk_answering_agent/utils.py | 0 .../adk_documentation/__init__.py | 0 .../adk_docs_updater/__init__.py | 0 .../adk_docs_updater/agent.py | 2 +- .../adk_docs_updater/main.py | 0 .../adk_release_analyzer/README.md | 0 .../adk_release_analyzer/__init__.py | 0 .../adk_release_analyzer/agent.py | 22 +- .../adk_release_analyzer/main.py | 0 .../adk_documentation/settings.py | 0 .../{ => adk_team}/adk_documentation/tools.py | 12 +- .../{ => adk_team}/adk_documentation/utils.py | 0 .../adk_issue_formatting_agent/__init__.py | 0 .../adk_issue_formatting_agent/agent.py | 2 +- .../adk_issue_formatting_agent/settings.py | 0 .../adk_issue_formatting_agent/utils.py | 0 .../PROMPT_INSTRUCTION.txt | 0 .../adk_issue_monitoring_agent/README.md | 0 .../adk_issue_monitoring_agent/__init__.py | 0 .../adk_issue_monitoring_agent/agent.py | 4 +- .../adk_issue_monitoring_agent/main.py | 0 .../adk_issue_monitoring_agent/settings.py | 0 .../adk_issue_monitoring_agent/utils.py | 8 +- .../adk_knowledge_agent/README.md | 0 .../adk_knowledge_agent/__init__.py | 0 .../adk_knowledge_agent/agent.json | 16 +- .../adk_knowledge_agent/agent.py | 1 - .../adk_knowledge_agent/requirements.txt | 0 .../{ => adk_team}/adk_pr_agent/__init__.py | 0 .../{ => adk_team}/adk_pr_agent/agent.py | 1 - .../{ => adk_team}/adk_pr_agent/main.py | 0 .../adk_pr_triaging_agent/README.md | 0 .../adk_pr_triaging_agent/__init__.py | 0 .../adk_pr_triaging_agent/agent.py | 4 +- .../adk_pr_triaging_agent/main.py | 0 .../adk_pr_triaging_agent/settings.py | 0 .../adk_pr_triaging_agent/utils.py | 0 .../adk_stale_agent/PROMPT_INSTRUCTION.txt | 0 .../{ => adk_team}/adk_stale_agent/README.md | 0 .../adk_stale_agent/__init__.py | 0 .../{ => adk_team}/adk_stale_agent/agent.py | 53 +- .../{ => adk_team}/adk_stale_agent/main.py | 12 +- .../adk_stale_agent/settings.py | 0 .../{ => adk_team}/adk_stale_agent/utils.py | 30 +- .../adk_triaging_agent/README.md | 0 .../adk_triaging_agent/__init__.py | 0 .../adk_triaging_agent/agent.py | 3 +- .../{ => adk_team}/adk_triaging_agent/main.py | 0 .../adk_triaging_agent/settings.py | 0 .../adk_triaging_agent/utils.py | 0 .../samples/artifact_save_text/agent.py | 45 -- .../authn-adk-all-in-one/idp/sample.jwks.json | 5 - contributing/samples/cache_analysis/README.md | 116 ---- contributing/samples/callbacks/agent.py | 198 ------ .../agent_engine_code_execution/README | 0 .../agent_engine_code_execution/__init__.py | 0 .../agent_engine_code_execution/agent.py | 1 - .../code_execution}/__init__.py | 0 .../{ => code_execution}/agent.py | 1 - .../{ => code_execution}/gke_sandbox_agent.py | 1 - .../custom_code_execution/README.md | 0 .../custom_code_execution}/__init__.py | 0 .../custom_code_execution/agent.py | 1 - .../vertex_code_execution/README.md | 0 .../vertex_code_execution}/__init__.py | 0 .../vertex_code_execution/agent.py | 1 - .../{ => config}/core_basic_config/README.md | 0 .../core_basic_config/root_agent.yaml | 0 .../core_callback_config/__init__.py | 0 .../core_callback_config/callbacks.py | 14 + .../core_callback_config/root_agent.yaml | 0 .../core_callback_config/tools.py | 14 + .../core_custom_agent_config/__init__.py | 0 .../core_custom_agent_config/my_agents.py | 0 .../core_custom_agent_config/root_agent.yaml | 0 .../root_agent.yaml | 0 .../cache_analysis/README.md | 131 ++++ .../cache_analysis/__init__.py | 0 .../cache_analysis/agent.py | 321 +++++----- .../cache_analysis/run_cache_experiments.py | 6 +- .../cache_analysis/utils.py | 0 .../history_management}/__init__.py | 0 .../history_management/agent.py | 1 - .../history_management}/main.py | 0 .../memory}/__init__.py | 0 .../{ => context_management}/memory/agent.py | 1 - .../{ => context_management}/memory/main.py | 0 .../migrate_session_db/README.md | 0 .../migrate_session_db}/__init__.py | 0 .../migrate_session_db/agent.py | 1 - .../migrate_session_db/dnd_sessions.db | Bin .../migrate_session_db/main.py | 0 .../sample-output/alembic.ini | 0 .../sample-output/alembic/README | 0 .../sample-output/alembic/env.py | 2 - .../sample-output/alembic/script.py.mako | 0 .../migrate_session_db/sessions.db | Bin .../postgres_session_service/README.md | 0 .../postgres_session_service}/__init__.py | 0 .../postgres_session_service/agent.py | 1 - .../postgres_session_service/compose.yml | 0 .../postgres_session_service/main.py | 0 .../rewind_session}/__init__.py | 0 .../rewind_session/agent.py | 1 - .../rewind_session/main.py | 0 .../session_state_agent/README.md | 0 .../session_state_agent}/__init__.py | 0 .../session_state_agent/agent.py | 0 .../session_state_agent/input.json | 6 + .../static_instruction/README.md | 0 .../static_instruction/__init__.py | 3 +- .../static_instruction/agent.py | 4 +- .../static_instruction/main.py | 0 contributing/samples/core/app/README.md | 91 +++ contributing/samples/core/app/agent.py | 76 +++ .../samples/core/app/tests/hello.json | 37 ++ .../samples/core/app/tests/help_trip.json | 37 ++ .../samples/core/app/tests/who_are_you.json | 37 ++ contributing/samples/core/artifacts/README.md | 54 ++ .../artifacts}/__init__.py | 0 contributing/samples/core/artifacts/agent.py | 217 +++++++ contributing/samples/core/callbacks/README.md | 114 ++++ .../{bigtable => core/callbacks}/__init__.py | 0 contributing/samples/core/callbacks/agent.py | 118 ++++ .../samples/core/callbacks/tests/hi.json | 36 ++ .../callbacks/tests/weather_in_london.json | 89 +++ .../callbacks/tests/weather_in_sunnyvale.json | 89 +++ .../samples/core/empty_agent/README.md | 30 + .../empty_agent}/__init__.py | 0 .../samples/core/empty_agent/agent.py | 21 + .../samples/core/empty_agent/tests/go.json | 37 ++ .../samples/core/empty_agent/tests/hello.json | 37 ++ .../core/empty_agent/tests/how_are_you.json | 37 ++ .../samples/core/hello_world/README.md | 91 +++ .../hello_world}/__init__.py | 0 .../samples/{ => core}/hello_world/agent.py | 1 - .../core/hello_world/tests/check_prime.json | 86 +++ .../hello_world/tests/roll_and_check.json | 138 ++++ .../core/hello_world/tests/roll_die.json | 95 +++ .../core/input_output_schema/README.md | 54 ++ .../samples/core/input_output_schema/agent.py | 53 ++ .../tests/weather_cupertino.json | 106 ++++ .../tests/weather_sanjose.json | 106 ++++ .../tests/weather_tokyo.json | 106 ++++ contributing/samples/core/logprobs/README.md | 78 +++ .../{callbacks => core/logprobs}/__init__.py | 0 .../samples/{ => core}/logprobs/agent.py | 31 +- .../samples/core/logprobs/tests/hello.json | 40 ++ .../core/logprobs/tests/tell_joke.json | 40 ++ .../core/logprobs/tests/what_is_ai.json | 40 ++ .../samples/core/quickstart/README.md | 81 +++ .../quickstart}/__init__.py | 0 .../samples/{ => core}/quickstart/agent.py | 10 +- .../core/quickstart/tests/time_ny.json | 84 +++ .../core/quickstart/tests/weather_ny.json | 84 +++ .../quickstart/tests/weather_time_ny.json | 103 +++ .../{ => core}/runner_debug_example/README.md | 4 +- .../runner_debug_example/__init__.py | 0 .../{ => core}/runner_debug_example/agent.py | 71 +-- .../{ => core}/runner_debug_example/main.py | 17 +- .../tests/stock_googl.json | 83 +++ .../tests/stock_nvda.json | 83 +++ .../tests/weather_sf.json | 90 +++ .../local_environment/README.md | 0 .../local_environment}/__init__.py | 0 .../local_environment/agent.py | 0 .../local_environment_skill/README.md | 0 .../local_environment_skill}/__init__.py | 0 .../local_environment_skill/agent.py | 0 .../skills/weather-skill/SKILL.md | 8 +- .../weather-skill/references/weather_info.md | 17 + .../weather-skill/scripts/get_humidity.py | 0 .../environment_and_skills/skills/README.md | 126 ++++ .../environment_and_skills/skills/__init__.py | 17 + .../environment_and_skills/skills/agent.py | 108 ++++ .../skills/skills/weather-skill/SKILL.md | 12 + .../weather-skill/references/weather_info.md | 6 + .../weather-skill/scripts/get_humidity.py | 0 .../skills/tests/current_humidity.json | 201 ++++++ .../skills/tests/current_weather.json | 196 ++++++ .../skills/tests/support_hours.json | 242 +++++++ .../skills/tests/wind_speed.json | 193 ++++++ .../skills_agent}/__init__.py | 0 .../skills_agent/agent.py | 1 - .../skills/weather-skill/SKILL.md | 6 +- .../weather-skill/references/weather_info.md | 6 + .../weather-skill/scripts/get_humidity.py | 29 + .../skills_agent_gcs}/__init__.py | 0 .../skills_agent_gcs/agent.py | 0 .../samples/fields_output_schema/agent.py | 60 -- contributing/samples/gcp_auth/README.md | 113 ---- contributing/samples/gcp_auth/agent.py | 166 ----- .../samples/gcp_auth/client/index.html | 566 ----------------- contributing/samples/gcp_auth/client/main.py | 122 ---- .../samples/gcp_auth/client/requirements.txt | 4 - contributing/samples/hello_world/main.py | 111 ---- .../samples/hello_world_apigeellm/.env-sample | 8 - contributing/samples/hello_world_app/agent.py | 160 ----- contributing/samples/hello_world_app/main.py | 103 --- .../samples/history_management/main.py | 80 --- .../{ => hitl}/human_in_loop/README.md | 0 .../human_in_loop}/__init__.py | 0 .../human_in_loop/agent.py | 1 - .../samples/{ => hitl}/human_in_loop/main.py | 0 .../tests/auto_reimburse_coffee.json | 84 +++ .../human_in_loop/tests/reimburse_dinner.json | 88 +++ .../human_tool_confirmation}/__init__.py | 0 .../human_tool_confirmation/agent.py | 1 - .../samples/hitl/tool_confirmation/README.md | 64 ++ .../tool_confirmation}/__init__.py | 0 .../samples/hitl/tool_confirmation/agent.py | 57 ++ ...Transfer_500_and_close_account_ACC123.json | 276 ++++++++ .../tests/close_account_acc123.json | 171 +++++ .../tests/transfer_200_confirmed.json | 189 ++++++ .../tests/transfer_200_declined.json | 189 ++++++ .../tool_confirmation/tests/transfer_50.json | 84 +++ .../tool_human_in_the_loop_config/README.md | 0 .../__init__.py | 0 .../root_agent.yaml | 0 .../tool_human_in_the_loop_config/tools.py | 0 .../agent_registry_agent/README.md | 0 .../agent_registry_agent}/__init__.py | 0 .../agent_registry_agent/agent.py | 0 .../api_registry_agent/README.md | 0 .../api_registry_agent}/__init__.py | 0 .../api_registry_agent/agent.py | 1 - .../application_integration_agent/README.md | 0 .../__init__.py | 0 .../application_integration_agent/agent.py | 1 - .../authn-adk-all-in-one/README.md | 0 .../agent_openapi_tools}/__init__.py | 0 .../adk_agents/agent_openapi_tools/agent.py | 0 .../agent_openapi_tools/openapi.yaml | 0 .../adk_agents/requirements.txt | 0 .../adk_agents/sample.env | 0 .../doc_images/adk-auth-all-in-one.svg | 0 .../doc_images/jwks_updated.png | Bin .../doc_images/jwksgen.png | Bin .../hotel_booker_app/hotelbooker_core.py | 8 +- .../hotel_booker_app/main.py | 4 +- .../hotel_booker_app/openapi.yaml | 0 .../authn-adk-all-in-one/idp/app.py | 0 .../authn-adk-all-in-one/idp/sample.env | 0 .../authn-adk-all-in-one/idp/sample.jwks.json | 5 + .../idp/templates/admin.html | 0 .../idp/templates/consent.html | 0 .../idp/templates/login.html | 0 .../authn-adk-all-in-one/requirements.txt | 3 +- .../{ => integrations}/bigquery/README.md | 0 .../bigquery}/__init__.py | 0 .../{ => integrations}/bigquery/agent.py | 1 - .../{ => integrations}/bigquery_mcp/README.md | 0 .../bigquery_mcp}/__init__.py | 0 .../{ => integrations}/bigquery_mcp/agent.py | 1 - .../{ => integrations}/bigtable/README.md | 0 .../bigtable}/__init__.py | 0 .../{ => integrations}/bigtable/agent.py | 1 - .../crewai_tool_kwargs/README.md | 0 .../crewai_tool_kwargs}/__init__.py | 0 .../crewai_tool_kwargs/agent.py | 1 - .../crewai_tool_kwargs/main.py | 0 .../{ => integrations}/data_agent/README.md | 0 .../data_agent}/__init__.py | 0 .../{ => integrations}/data_agent/agent.py | 61 +- .../files_retrieval_agent/README.md | 0 .../files_retrieval_agent}/__init__.py | 0 .../files_retrieval_agent/agent.py | 1 - .../data/adk_overview.txt | 0 .../data/tools_guide.txt | 0 .../gcp_skill_registry_agent}/__init__.py | 0 .../gcp_skill_registry_agent/agent.py | 40 ++ .../samples/{ => integrations}/gepa/README.md | 0 .../gepa}/__init__.py | 0 .../{ => integrations}/gepa/adk_agent.py | 0 .../{ => integrations}/gepa/adk_agent_test.py | 0 .../{ => integrations}/gepa/experiment.py | 0 .../gepa/gepa_tau_bench.ipynb | 1 - .../{ => integrations}/gepa/gepa_utils.py | 0 .../{ => integrations}/gepa/rater_lib.py | 0 .../gepa/rubric_validation_template.txt | 0 .../{ => integrations}/gepa/run_experiment.py | 0 .../gepa/tau_bench_agent.py | 0 .../gepa/voter_agent/eval_prompts.txt | 0 .../gepa/voter_agent/gepa.ipynb | 182 +++--- .../gepa/voter_agent/optimized_prompt.txt | 0 .../gepa/voter_agent/prompts.txt | 0 .../rubric_validation_template.txt | 0 .../gepa/voter_agent/tools.py | 0 .../gke_agent_sandbox/deployment_rbac.yaml | 0 .../{ => integrations}/google_api/README.md | 0 .../google_api}/__init__.py | 0 .../{ => integrations}/google_api/agent.py | 1 - .../google_search_agent}/__init__.py | 0 .../google_search_agent/agent.py | 1 - .../integration_connector_euc_agent/README.md | 0 .../__init__.py | 0 .../integration_connector_euc_agent/agent.py | 1 - .../{ => integrations}/jira_agent/README.md | 0 .../jira_agent}/__init__.py | 0 .../{ => integrations}/jira_agent/agent.py | 1 - .../jira_agent/image-app-intg-editor.png | Bin .../image-application-integration.png | Bin .../jira_agent/image-connection-tool.png | Bin .../{ => integrations}/jira_agent/tools.py | 0 .../__init__.py | 0 .../langchain_structured_tool_agent/agent.py | 5 +- .../langchain_youtube_search_agent/README.md | 0 .../__init__.py | 0 .../langchain_youtube_search_agent/agent.py | 1 - .../requirements.txt | 0 .../oauth2_client_credentials/README.md | 0 .../oauth2_client_credentials}/__init__.py | 0 .../oauth2_client_credentials/agent.py | 3 +- .../oauth2_client_credentials/main.py | 0 .../oauth2_test_server.py | 3 +- .../oauth_calendar_agent/README.md | 0 .../oauth_calendar_agent}/__init__.py | 0 .../oauth_calendar_agent/agent.py | 2 +- .../{ => integrations}/pubsub/README.md | 0 .../pubsub}/__init__.py | 0 .../{ => integrations}/pubsub/agent.py | 1 - .../rag_agent}/__init__.py | 0 .../{ => integrations}/rag_agent/agent.py | 1 - .../sandbox_computer_use}/__init__.py | 0 .../sandbox_computer_use/agent.py | 13 +- .../sandbox_computer_use/main.py | 3 - .../{ => integrations}/slack_agent/agent.py | 0 .../{ => integrations}/spanner/README.md | 0 .../spanner}/__init__.py | 0 .../{ => integrations}/spanner/agent.py | 18 +- .../spanner_admin/README.md | 0 .../spanner_admin}/__init__.py | 0 .../{ => integrations}/spanner_admin/agent.py | 1 - .../spanner_rag_agent/README.md | 0 .../Spanner_RAG_Sample_Agent.png | Bin .../spanner_rag_agent}/__init__.py | 0 .../spanner_rag_agent/agent.py | 1 - .../toolbox_agent/README.md | 0 .../toolbox_agent}/__init__.py | 0 .../{ => integrations}/toolbox_agent/agent.py | 1 - .../toolbox_agent/tool_box.db | Bin .../toolbox_agent/tools.yaml | 0 .../non_llm_sequential}/__init__.py | 0 .../non_llm_sequential/agent.py | 2 - .../simple_sequential_agent}/__init__.py | 0 .../simple_sequential_agent/agent.py | 2 - .../workflow_agent_seq/README.md | 0 .../workflow_agent_seq}/__init__.py | 0 .../workflow_agent_seq/agent.py | 3 - .../workflow_agent_seq/main.py | 0 .../workflow_agent_seq/sample.output | 0 .../check_prime_11.wav | Bin .../check_prime_15.wav | Bin .../live_agent_example.py | 0 .../live_agent_api_server_example/readme.md | 0 .../live_bidi_debug_utils/pcm_audio_player.py | 0 .../__init__.py | 0 .../live_bidi_streaming_multi_agent/agent.py | 4 +- .../live_bidi_streaming_multi_agent/readme.md | 0 .../README.md | 0 .../__init__.py | 0 .../agent.py | 0 .../__init__.py | 0 .../live_bidi_streaming_single_agent/agent.py | 0 .../readme.md | 0 .../__init__.py | 0 .../live_bidi_streaming_tools_agent/agent.py | 1 - .../live_bidi_streaming_tools_agent/readme.md | 0 .../live_tool_callbacks_agent}/__init__.py | 0 .../live_tool_callbacks_agent/agent.py | 6 + .../live_tool_callbacks_agent/readme.md | 0 .../weather-skill/references/weather_info.md | 17 - contributing/samples/logprobs/README.md | 62 -- .../mcp_dynamic_header_agent/README.md | 0 .../mcp_dynamic_header_agent}/__init__.py | 0 .../mcp_dynamic_header_agent/agent.py | 1 - .../mcp_dynamic_header_agent/header_server.py | 0 .../mcp_in_agent_tool_remote/README.md | 0 .../mcp_in_agent_tool_remote}/__init__.py | 0 .../mcp_in_agent_tool_remote/agent.py | 2 - .../mcp_in_agent_tool_stdio/README.md | 0 .../mcp_in_agent_tool_stdio}/__init__.py | 0 .../mcp_in_agent_tool_stdio/agent.py | 2 - .../{ => mcp}/mcp_postgres_agent/README.md | 0 .../mcp_postgres_agent}/__init__.py | 0 .../{ => mcp}/mcp_postgres_agent/agent.py | 1 - .../mcp_progress_callback_agent}/__init__.py | 0 .../mcp_progress_callback_agent/agent.py | 16 +- .../mock_progress_server.py | 0 .../mcp_server_side_sampling/README.md | 2 +- .../mcp_server_side_sampling}/__init__.py | 0 .../mcp_server_side_sampling/agent.py | 0 .../mcp_server_side_sampling/mcp_server.py | 0 .../mcp_service_account_agent/README.md | 0 .../mcp_service_account_agent}/__init__.py | 0 .../mcp_service_account_agent/agent.py | 1 - .../samples/{ => mcp}/mcp_sse_agent/README.md | 0 .../mcp_sse_agent}/__init__.py | 0 .../samples/{ => mcp}/mcp_sse_agent/agent.py | 1 - .../mcp_sse_agent/filesystem_server.py | 0 .../mcp_stdio_notion_agent/README.md | 0 .../mcp_stdio_notion_agent}/__init__.py | 0 .../{ => mcp}/mcp_stdio_notion_agent/agent.py | 1 - .../mcp_stdio_server_agent}/__init__.py | 0 .../{ => mcp}/mcp_stdio_server_agent/agent.py | 1 - .../mcp_streamablehttp_agent/README.md | 0 .../mcp_streamablehttp_agent}/__init__.py | 0 .../mcp_streamablehttp_agent/agent.py | 1 - .../filesystem_server.py | 0 .../{ => mcp}/mcp_toolset_auth/README.md | 0 .../mcp_toolset_auth}/__init__.py | 0 .../{ => mcp}/mcp_toolset_auth/agent.py | 1 - .../{ => mcp}/mcp_toolset_auth/main.py | 3 +- .../mcp_toolset_auth/oauth_mcp_server.py | 0 .../tool_mcp_stdio_notion_config/README.md | 0 .../root_agent.yaml | 0 .../hello_world_anthropic}/__init__.py | 0 .../hello_world_anthropic/agent.py | 0 .../hello_world_anthropic/main.py | 0 .../hello_world_apigeellm/README.md | 0 .../hello_world_apigeellm/agent.py | 0 .../hello_world_apigeellm/main.py | 0 .../hello_world_gemma}/__init__.py | 0 .../{ => models}/hello_world_gemma/agent.py | 0 .../{ => models}/hello_world_gemma/main.py | 0 .../hello_world_gemma3_ollama}/__init__.py | 0 .../hello_world_gemma3_ollama/agent.py | 0 .../hello_world_gemma3_ollama/main.py | 0 .../hello_world_litellm}/__init__.py | 0 .../{ => models}/hello_world_litellm/agent.py | 0 .../{ => models}/hello_world_litellm/main.py | 0 .../__init__.py | 0 .../agent.py | 0 .../main.py | 0 .../{ => models}/hello_world_ollama/README.md | 0 .../hello_world_ollama}/__init__.py | 0 .../{ => models}/hello_world_ollama/agent.py | 0 .../{ => models}/hello_world_ollama/main.py | 0 .../{ => models}/interactions_api/README.md | 0 .../{ => models}/interactions_api/__init__.py | 0 .../{ => models}/interactions_api/agent.py | 2 +- .../{ => models}/interactions_api/main.py | 0 .../litellm_inline_tool_call/__init__.py | 17 + .../litellm_inline_tool_call/agent.py | 0 .../litellm_streaming}/__init__.py | 0 .../{ => models}/litellm_streaming/agent.py | 0 .../{ => models}/litellm_streaming/main.py | 0 .../litellm_structured_output}/__init__.py | 0 .../litellm_structured_output/agent.py | 0 .../litellm_with_fallback_models/README.md | 0 .../litellm_with_fallback_models}/__init__.py | 0 .../litellm_with_fallback_models/agent.py | 0 .../manual_ollama_test}/__init__.py | 0 .../{ => models}/manual_ollama_test/agent.py | 0 .../hello_world_ma}/__init__.py | 0 .../{ => multi_agent}/hello_world_ma/agent.py | 4 +- .../tests/roll_die_and_check_prime.json | 296 +++++++++ .../multi_agent_basic_config/README.md | 0 .../code_tutor_agent.yaml | 0 .../math_tutor_agent.yaml | 0 .../multi_agent_basic_config/root_agent.yaml | 0 .../multi_agent_llm_config/README.md | 0 .../multi_agent_llm_config/__init__.py | 14 + .../multi_agent_llm_config/prime_agent.yaml | 0 .../multi_agent_llm_config/roll_agent.yaml | 0 .../multi_agent_llm_config/root_agent.yaml | 0 .../multi_agent_loop_config/README.md | 0 .../multi_agent_loop_config/loop_agent.yaml | 0 .../multi_agent_loop_config/root_agent.yaml | 0 .../writer_agents/critic_agent.yaml | 0 .../writer_agents/initial_writer_agent.yaml | 0 .../writer_agents/refiner_agent.yaml | 0 .../multi_agent_seq_config/README.md | 0 .../multi_agent_seq_config/root_agent.yaml | 0 .../sub_agents/code_refactorer_agent.yaml | 0 .../sub_agents/code_reviewer_agent.yaml | 0 .../sub_agents/code_writer_agent.yaml | 0 .../single_turn_sub_agent/README.md | 52 ++ .../single_turn_sub_agent/agent.py | 81 +++ .../tests/gaming_1000.json | 440 +++++++++++++ .../tests/gaming_1000_large.json | 359 +++++++++++ .../single_turn_sub_agent/tests/go.json | 383 +++++++++++ .../samples/multi_agent/sub_agents/README.md | 72 +++ .../sub_agents}/__init__.py | 0 .../samples/multi_agent/sub_agents/agent.py | 64 ++ .../sub_agents/tests/check_and_close.json | 315 +++++++++ .../sub_agents/tests/check_status.json | 132 ++++ .../sub_agents_config}/__init__.py | 0 .../sub_agents_config/life_agent.py | 0 .../sub_agents_config/root_agent.yaml | 0 .../sub_agents_config/work_agent.yaml | 0 .../multi_agent/task_sub_agent/README.md | 52 ++ .../multi_agent/task_sub_agent/agent.py | 83 +++ .../task_sub_agent/tests/10_burgers.json | 224 +++++++ .../task_sub_agent/tests/3_burgers.json | 410 ++++++++++++ .../tests/3_burgers_and_credit_card.json | 92 +++ .../task_sub_agent/tests/credit_card.json | 96 +++ .../task_sub_agent/tests/order_food.json | 198 ++++++ .../three_layer_transfer/README.md | 29 + .../three_layer_transfer}/__init__.py | 0 .../multi_agent/three_layer_transfer/agent.py | 56 ++ .../{ => multimodal}/computer_use/README.md | 0 .../{ => multimodal}/computer_use/agent.py | 0 .../computer_use/playwright.py | 0 .../computer_use/requirements.txt | 0 .../generate_image}/__init__.py | 0 .../{ => multimodal}/generate_image/agent.py | 1 - .../generate_image/sample.session.json | 0 .../samples/multimodal/multimodal/README.md | 30 + .../multimodal}/__init__.py | 0 .../samples/multimodal/multimodal/agent.py | 20 + .../multimodal_tool_results}/__init__.py | 0 .../multimodal_tool_results/agent.py | 1 - .../static_non_text_content/README.md | 0 .../static_non_text_content/__init__.py | 0 .../static_non_text_content/agent.py | 1 - .../static_non_text_content/main.py | 0 .../README.md | 0 .../__init__.py | 0 .../context_offloading_with_artifact/agent.py | 1 - .../fields_planner}/__init__.py | 0 .../{ => patterns}/fields_planner/agent.py | 0 .../{ => patterns}/fields_planner/main.py | 0 .../json_passing_agent/README.md | 0 .../json_passing_agent}/__init__.py | 0 .../json_passing_agent/agent.py | 2 - .../{ => patterns}/json_passing_agent/main.py | 0 .../{ => patterns}/workflow_triage/README.md | 0 .../workflow_triage}/__init__.py | 0 .../{ => patterns}/workflow_triage/agent.py | 1 - .../workflow_triage/execution_agent.py | 3 - .../{ => plugin}/plugin_basic/README.md | 0 .../{ => plugin}/plugin_basic/__init__.py | 0 .../{ => plugin}/plugin_basic/count_plugin.py | 0 .../samples/{ => plugin}/plugin_basic/main.py | 1 - .../plugin_debug_logging}/__init__.py | 0 .../plugin_debug_logging/agent.py | 1 - .../plugin_reflect_tool_retry/README.md | 0 .../basic}/__init__.py | 0 .../plugin_reflect_tool_retry/basic/agent.py | 1 - .../hallucinating_func_name}/__init__.py | 0 .../hallucinating_func_name/agent.py | 1 - .../samples/session_state_agent/input.json | 4 - .../weather-skill/references/weather_info.md | 6 - contributing/samples/telemetry/agent.py | 110 ---- contributing/samples/telemetry/main.py | 118 ---- contributing/samples/token_usage/agent.py | 97 --- contributing/samples/token_usage/main.py | 102 --- .../__init__.py | 0 .../agent.py | 0 .../built_in_multi_tools/README.md | 0 .../built_in_multi_tools}/__init__.py | 0 .../{ => tools}/built_in_multi_tools/agent.py | 0 .../samples/tools/function_tools/README.md | 52 ++ .../function_tools}/__init__.py | 0 .../samples/tools/function_tools/agent.py | 58 ++ .../function_tools/tests/a_random_number.json | 81 +++ .../tests/a_random_number_and_check_even.json | 127 ++++ .../tests/random_number_and_is_5_even.json | 99 +++ .../hello_world_stream_fc_args}/__init__.py | 0 .../hello_world_stream_fc_args/agent.py | 0 .../tools/long_running_functions/README.md | 60 ++ .../tools/long_running_functions/__init__.py | 15 + .../tools/long_running_functions/agent.py | 44 ++ .../tests/export_to_csv.json | 127 ++++ .../tests/export_to_csv_and_json.json | 226 +++++++ .../output_schema_with_tools/README.md | 0 .../output_schema_with_tools/__init__.py | 15 + .../output_schema_with_tools/agent.py | 1 - .../{ => tools}/parallel_functions/README.md | 0 .../tools/parallel_functions/__init__.py | 15 + .../{ => tools}/parallel_functions/agent.py | 8 +- .../tests/test_all_tools.json | 196 ++++++ .../tests/test_parallel_mixed.json | 128 ++++ .../tests/test_parallel_weather.json | 129 ++++ .../{ => tools}/pydantic_argument/README.md | 0 .../tools/pydantic_argument/__init__.py | 15 + .../{ => tools}/pydantic_argument/agent.py | 0 .../{ => tools}/pydantic_argument/main.py | 0 .../tests/test_create_company.json | 139 ++++ .../tests/test_create_user.json | 104 +++ .../tests/test_create_user_with_prefs.json | 107 ++++ .../tool_agent_tool_config/root_agent.yaml | 0 .../summarizer_agent.yaml | 0 .../web_search_agent.yaml | 0 .../tool_builtin_config/root_agent.yaml | 0 .../tool_functions_config}/__init__.py | 0 .../tool_functions_config/root_agent.yaml | 0 .../tool_functions_config/tools.py | 0 .../samples/workflows/auth_api_key/README.md | 111 ++++ .../samples/workflows/auth_api_key/agent.py | 83 +++ .../workflows/auth_api_key/tests/go.json | 120 ++++ .../samples/workflows/auth_oauth/README.md | 112 ++++ .../samples/workflows/auth_oauth/__init__.py | 15 + .../samples/workflows/auth_oauth/agent.py | 137 ++++ .../dynamic_fan_out_fan_in/README.md | 61 ++ .../workflows/dynamic_fan_out_fan_in/agent.py | 69 ++ .../samples/workflows/dynamic_nodes/README.md | 59 ++ .../samples/workflows/dynamic_nodes/agent.py | 78 +++ .../workflows/dynamic_nodes/tests/flower.json | 159 +++++ .../workflows/fan_out_fan_in/README.md | 59 ++ .../samples/workflows/fan_out_fan_in/agent.py | 55 ++ .../workflows/fan_out_fan_in/tests/go.json | 99 +++ contributing/samples/workflows/loop/README.md | 46 ++ contributing/samples/workflows/loop/agent.py | 80 +++ .../workflows/loop/tests/computer.json | 94 +++ .../samples/workflows/loop/tests/flower.json | 168 +++++ .../samples/workflows/loop_config/README.md | 48 ++ .../samples/workflows/loop_config/agent.py | 43 ++ .../loop_config/evaluate_headline.yaml | 6 + .../loop_config/generate_headline.yaml | 6 + .../workflows/loop_config/root_agent.yaml | 10 + .../samples/workflows/loop_self/README.md | 44 ++ .../samples/workflows/loop_self/agent.py | 45 ++ .../samples/workflows/loop_self/tests/3.json | 191 ++++++ .../samples/workflows/message/README.md | 81 +++ .../samples/workflows/message/agent.py | 104 +++ .../samples/workflows/message/tests/go.json | 146 +++++ .../workflows/multi_triggers/README.md | 53 ++ .../samples/workflows/multi_triggers/agent.py | 45 ++ .../workflows/multi_triggers/tests/go.json | 118 ++++ .../workflows/nested_workflow/README.md | 64 ++ .../workflows/nested_workflow/__init__.py | 15 + .../workflows/nested_workflow/agent.py | 94 +++ .../workflows/nested_workflow/tests/1984.json | 139 ++++ .../samples/workflows/node_output/README.md | 66 ++ .../samples/workflows/node_output/agent.py | 73 +++ .../workflows/node_output/tests/go.json | 86 +++ .../workflows/parallel_worker/README.md | 69 ++ .../workflows/parallel_worker/agent.py | 81 +++ .../parallel_worker/tests/flower.json | 225 +++++++ .../samples/workflows/request_input/README.md | 66 ++ .../samples/workflows/request_input/agent.py | 84 +++ .../request_input/tests/phone_broke.json | 236 +++++++ .../tests/phone_broke_reject.json | 136 ++++ .../request_input_advanced/README.md | 76 +++ .../workflows/request_input_advanced/agent.py | 85 +++ .../tests/2_sick_days.json | 156 +++++ .../workflows/request_input_rerun/README.md | 86 +++ .../workflows/request_input_rerun/agent.py | 81 +++ .../tests/phone_broke.json | 236 +++++++ .../samples/workflows/retry/README.md | 43 ++ contributing/samples/workflows/retry/agent.py | 49 ++ .../samples/workflows/retry/tests/go.json | 131 ++++ .../samples/workflows/route/README.md | 43 ++ contributing/samples/workflows/route/agent.py | 77 +++ .../workflows/route/tests/who_are_you.json | 106 ++++ .../samples/workflows/sequence/README.md | 39 ++ .../samples/workflows/sequence/__init__.py | 15 + .../samples/workflows/sequence/agent.py | 35 + .../samples/workflows/sequence/tests/go.json | 71 +++ .../samples/workflows/state/README.md | 60 ++ contributing/samples/workflows/state/agent.py | 57 ++ .../samples/workflows/state/tests/go.json | 91 +++ .../samples/workflows/use_as_output/README.md | 55 ++ .../samples/workflows/use_as_output/agent.py | 41 ++ .../workflows/use_as_output/tests/go.json | 63 ++ pyproject.toml | 203 ++++-- scripts/check_new_py_files.sh | 23 + scripts/db_migration.sh | 14 + scripts/generate_agent_config_schema.py | 67 ++ scripts/unittests.sh | 143 ----- 700 files changed, 17229 insertions(+), 3964 deletions(-) rename contributing/samples/{ => a2a}/a2a_auth/README.md (100%) rename contributing/samples/{ => a2a}/a2a_auth/__init__.py (100%) rename contributing/samples/{ => a2a}/a2a_auth/agent.py (95%) rename contributing/samples/{ => a2a}/a2a_auth/remote_a2a/bigquery_agent/__init__.py (100%) rename contributing/samples/{ => a2a}/a2a_auth/remote_a2a/bigquery_agent/agent.json (70%) rename contributing/samples/{ => a2a}/a2a_auth/remote_a2a/bigquery_agent/agent.py (98%) rename contributing/samples/{ => a2a}/a2a_basic/README.md (100%) rename contributing/samples/{ => a2a}/a2a_basic/__init__.py (100%) rename contributing/samples/{ => a2a}/a2a_basic/agent.py (99%) rename contributing/samples/{ => a2a}/a2a_basic/remote_a2a/check_prime_agent/__init__.py (100%) rename contributing/samples/{ => a2a}/a2a_basic/remote_a2a/check_prime_agent/agent.json (70%) rename contributing/samples/{ => a2a}/a2a_basic/remote_a2a/check_prime_agent/agent.py (98%) rename contributing/samples/{ => a2a}/a2a_human_in_loop/README.md (100%) rename contributing/samples/{ => a2a}/a2a_human_in_loop/__init__.py (100%) rename contributing/samples/{ => a2a}/a2a_human_in_loop/agent.py (98%) rename contributing/samples/{ => a2a}/a2a_human_in_loop/remote_a2a/human_in_loop/__init__.py (100%) rename contributing/samples/{ => a2a}/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json (71%) rename contributing/samples/{ => a2a/a2a_human_in_loop/remote_a2a}/human_in_loop/agent.py (98%) rename contributing/samples/{ => a2a}/a2a_root/README.md (100%) rename contributing/samples/{ => a2a}/a2a_root/agent.py (100%) rename contributing/samples/{ => a2a}/a2a_root/remote_a2a/hello_world/__init__.py (100%) rename contributing/samples/{ => a2a}/a2a_root/remote_a2a/hello_world/agent.py (99%) rename contributing/samples/{ => adk_team}/adk_answering_agent/README.md (100%) rename contributing/samples/{ => adk_team}/adk_answering_agent/__init__.py (100%) rename contributing/samples/{ => adk_team}/adk_answering_agent/agent.py (99%) rename contributing/samples/{ => adk_team}/adk_answering_agent/gemini_assistant/__init__.py (100%) rename contributing/samples/{ => adk_team}/adk_answering_agent/gemini_assistant/agent.py (99%) rename contributing/samples/{ => adk_team}/adk_answering_agent/main.py (100%) rename contributing/samples/{ => adk_team}/adk_answering_agent/settings.py (100%) rename contributing/samples/{ => adk_team}/adk_answering_agent/tools.py (100%) rename contributing/samples/{ => adk_team}/adk_answering_agent/upload_docs_to_vertex_ai_search.py (100%) rename contributing/samples/{ => adk_team}/adk_answering_agent/utils.py (100%) rename contributing/samples/{ => adk_team}/adk_documentation/__init__.py (100%) rename contributing/samples/{ => adk_team}/adk_documentation/adk_docs_updater/__init__.py (100%) rename contributing/samples/{ => adk_team}/adk_documentation/adk_docs_updater/agent.py (99%) rename contributing/samples/{ => adk_team}/adk_documentation/adk_docs_updater/main.py (100%) rename contributing/samples/{ => adk_team}/adk_documentation/adk_release_analyzer/README.md (100%) rename contributing/samples/{ => adk_team}/adk_documentation/adk_release_analyzer/__init__.py (100%) rename contributing/samples/{ => adk_team}/adk_documentation/adk_release_analyzer/agent.py (97%) rename contributing/samples/{ => adk_team}/adk_documentation/adk_release_analyzer/main.py (100%) rename contributing/samples/{ => adk_team}/adk_documentation/settings.py (100%) rename contributing/samples/{ => adk_team}/adk_documentation/tools.py (99%) rename contributing/samples/{ => adk_team}/adk_documentation/utils.py (100%) rename contributing/samples/{ => adk_team}/adk_issue_formatting_agent/__init__.py (100%) rename contributing/samples/{ => adk_team}/adk_issue_formatting_agent/agent.py (99%) rename contributing/samples/{ => adk_team}/adk_issue_formatting_agent/settings.py (100%) rename contributing/samples/{ => adk_team}/adk_issue_formatting_agent/utils.py (100%) rename contributing/samples/{ => adk_team}/adk_issue_monitoring_agent/PROMPT_INSTRUCTION.txt (100%) rename contributing/samples/{ => adk_team}/adk_issue_monitoring_agent/README.md (100%) rename contributing/samples/{ => adk_team}/adk_issue_monitoring_agent/__init__.py (100%) rename contributing/samples/{ => adk_team}/adk_issue_monitoring_agent/agent.py (97%) rename contributing/samples/{ => adk_team}/adk_issue_monitoring_agent/main.py (100%) rename contributing/samples/{ => adk_team}/adk_issue_monitoring_agent/settings.py (100%) rename contributing/samples/{ => adk_team}/adk_issue_monitoring_agent/utils.py (96%) rename contributing/samples/{ => adk_team}/adk_knowledge_agent/README.md (100%) rename contributing/samples/{ => adk_team}/adk_knowledge_agent/__init__.py (100%) rename contributing/samples/{ => adk_team}/adk_knowledge_agent/agent.json (68%) rename contributing/samples/{ => adk_team}/adk_knowledge_agent/agent.py (98%) rename contributing/samples/{ => adk_team}/adk_knowledge_agent/requirements.txt (100%) rename contributing/samples/{ => adk_team}/adk_pr_agent/__init__.py (100%) rename contributing/samples/{ => adk_team}/adk_pr_agent/agent.py (99%) rename contributing/samples/{ => adk_team}/adk_pr_agent/main.py (100%) rename contributing/samples/{ => adk_team}/adk_pr_triaging_agent/README.md (100%) rename contributing/samples/{ => adk_team}/adk_pr_triaging_agent/__init__.py (100%) rename contributing/samples/{ => adk_team}/adk_pr_triaging_agent/agent.py (99%) rename contributing/samples/{ => adk_team}/adk_pr_triaging_agent/main.py (100%) rename contributing/samples/{ => adk_team}/adk_pr_triaging_agent/settings.py (100%) rename contributing/samples/{ => adk_team}/adk_pr_triaging_agent/utils.py (100%) rename contributing/samples/{ => adk_team}/adk_stale_agent/PROMPT_INSTRUCTION.txt (100%) rename contributing/samples/{ => adk_team}/adk_stale_agent/README.md (100%) rename contributing/samples/{ => adk_team}/adk_stale_agent/__init__.py (100%) rename contributing/samples/{ => adk_team}/adk_stale_agent/agent.py (95%) rename contributing/samples/{ => adk_team}/adk_stale_agent/main.py (96%) rename contributing/samples/{ => adk_team}/adk_stale_agent/settings.py (100%) rename contributing/samples/{ => adk_team}/adk_stale_agent/utils.py (90%) rename contributing/samples/{ => adk_team}/adk_triaging_agent/README.md (100%) rename contributing/samples/{ => adk_team}/adk_triaging_agent/__init__.py (100%) rename contributing/samples/{ => adk_team}/adk_triaging_agent/agent.py (99%) rename contributing/samples/{ => adk_team}/adk_triaging_agent/main.py (100%) rename contributing/samples/{ => adk_team}/adk_triaging_agent/settings.py (100%) rename contributing/samples/{ => adk_team}/adk_triaging_agent/utils.py (100%) delete mode 100755 contributing/samples/artifact_save_text/agent.py delete mode 100644 contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json delete mode 100644 contributing/samples/cache_analysis/README.md delete mode 100755 contributing/samples/callbacks/agent.py rename contributing/samples/{ => code_execution}/agent_engine_code_execution/README (100%) rename contributing/samples/{ => code_execution}/agent_engine_code_execution/__init__.py (100%) rename contributing/samples/{ => code_execution}/agent_engine_code_execution/agent.py (99%) rename contributing/samples/{agent_registry_agent => code_execution/code_execution}/__init__.py (100%) rename contributing/samples/code_execution/{ => code_execution}/agent.py (99%) rename contributing/samples/code_execution/{ => code_execution}/gke_sandbox_agent.py (98%) rename contributing/samples/{ => code_execution}/custom_code_execution/README.md (100%) rename contributing/samples/{agent_tool_with_grounding_metadata => code_execution/custom_code_execution}/__init__.py (100%) rename contributing/samples/{ => code_execution}/custom_code_execution/agent.py (99%) rename contributing/samples/{ => code_execution}/vertex_code_execution/README.md (100%) rename contributing/samples/{api_registry_agent => code_execution/vertex_code_execution}/__init__.py (100%) rename contributing/samples/{ => code_execution}/vertex_code_execution/agent.py (99%) rename contributing/samples/{ => config}/core_basic_config/README.md (100%) rename contributing/samples/{ => config}/core_basic_config/root_agent.yaml (100%) rename contributing/samples/{ => config}/core_callback_config/__init__.py (100%) rename contributing/samples/{ => config}/core_callback_config/callbacks.py (76%) rename contributing/samples/{ => config}/core_callback_config/root_agent.yaml (100%) rename contributing/samples/{ => config}/core_callback_config/tools.py (66%) rename contributing/samples/{ => config}/core_custom_agent_config/__init__.py (100%) rename contributing/samples/{ => config}/core_custom_agent_config/my_agents.py (100%) rename contributing/samples/{ => config}/core_custom_agent_config/root_agent.yaml (100%) rename contributing/samples/{ => config}/core_generate_content_config_config/root_agent.yaml (100%) create mode 100644 contributing/samples/context_management/cache_analysis/README.md rename contributing/samples/{ => context_management}/cache_analysis/__init__.py (100%) rename contributing/samples/{ => context_management}/cache_analysis/agent.py (75%) rename contributing/samples/{ => context_management}/cache_analysis/run_cache_experiments.py (99%) rename contributing/samples/{ => context_management}/cache_analysis/utils.py (100%) rename contributing/samples/{application_integration_agent => context_management/history_management}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{ => context_management}/history_management/agent.py (99%) rename contributing/samples/{callbacks => context_management/history_management}/main.py (100%) rename contributing/samples/{artifact_save_text => context_management/memory}/__init__.py (100%) rename contributing/samples/{ => context_management}/memory/agent.py (97%) rename contributing/samples/{ => context_management}/memory/main.py (100%) rename contributing/samples/{ => context_management}/migrate_session_db/README.md (100%) rename contributing/samples/{hello_world_anthropic => context_management/migrate_session_db}/__init__.py (100%) rename contributing/samples/{ => context_management}/migrate_session_db/agent.py (99%) rename contributing/samples/{ => context_management}/migrate_session_db/dnd_sessions.db (100%) rename contributing/samples/{ => context_management}/migrate_session_db/main.py (100%) rename contributing/samples/{ => context_management}/migrate_session_db/sample-output/alembic.ini (100%) rename contributing/samples/{ => context_management}/migrate_session_db/sample-output/alembic/README (100%) rename contributing/samples/{ => context_management}/migrate_session_db/sample-output/alembic/env.py (99%) rename contributing/samples/{ => context_management}/migrate_session_db/sample-output/alembic/script.py.mako (100%) rename contributing/samples/{ => context_management}/migrate_session_db/sessions.db (100%) rename contributing/samples/{ => context_management}/postgres_session_service/README.md (100%) rename contributing/samples/{hello_world_gemma => context_management/postgres_session_service}/__init__.py (100%) rename contributing/samples/{ => context_management}/postgres_session_service/agent.py (97%) rename contributing/samples/{ => context_management}/postgres_session_service/compose.yml (100%) rename contributing/samples/{ => context_management}/postgres_session_service/main.py (100%) rename contributing/samples/{authn-adk-all-in-one/adk_agents/agent_openapi_tools => context_management/rewind_session}/__init__.py (100%) rename contributing/samples/{ => context_management}/rewind_session/agent.py (98%) rename contributing/samples/{ => context_management}/rewind_session/main.py (100%) rename contributing/samples/{ => context_management}/session_state_agent/README.md (100%) rename contributing/samples/{bigquery => context_management/session_state_agent}/__init__.py (100%) rename contributing/samples/{ => context_management}/session_state_agent/agent.py (100%) create mode 100644 contributing/samples/context_management/session_state_agent/input.json rename contributing/samples/{ => context_management}/static_instruction/README.md (100%) rename contributing/samples/{ => context_management}/static_instruction/__init__.py (98%) rename contributing/samples/{ => context_management}/static_instruction/agent.py (99%) rename contributing/samples/{ => context_management}/static_instruction/main.py (100%) create mode 100644 contributing/samples/core/app/README.md create mode 100644 contributing/samples/core/app/agent.py create mode 100644 contributing/samples/core/app/tests/hello.json create mode 100644 contributing/samples/core/app/tests/help_trip.json create mode 100644 contributing/samples/core/app/tests/who_are_you.json create mode 100644 contributing/samples/core/artifacts/README.md rename contributing/samples/{bigquery_mcp => core/artifacts}/__init__.py (100%) create mode 100644 contributing/samples/core/artifacts/agent.py create mode 100644 contributing/samples/core/callbacks/README.md rename contributing/samples/{bigtable => core/callbacks}/__init__.py (100%) create mode 100644 contributing/samples/core/callbacks/agent.py create mode 100644 contributing/samples/core/callbacks/tests/hi.json create mode 100644 contributing/samples/core/callbacks/tests/weather_in_london.json create mode 100644 contributing/samples/core/callbacks/tests/weather_in_sunnyvale.json create mode 100644 contributing/samples/core/empty_agent/README.md rename contributing/samples/{litellm_inline_tool_call => core/empty_agent}/__init__.py (100%) create mode 100644 contributing/samples/core/empty_agent/agent.py create mode 100644 contributing/samples/core/empty_agent/tests/go.json create mode 100644 contributing/samples/core/empty_agent/tests/hello.json create mode 100644 contributing/samples/core/empty_agent/tests/how_are_you.json create mode 100644 contributing/samples/core/hello_world/README.md rename contributing/samples/{built_in_multi_tools => core/hello_world}/__init__.py (100%) rename contributing/samples/{ => core}/hello_world/agent.py (99%) mode change 100755 => 100644 create mode 100644 contributing/samples/core/hello_world/tests/check_prime.json create mode 100644 contributing/samples/core/hello_world/tests/roll_and_check.json create mode 100644 contributing/samples/core/hello_world/tests/roll_die.json create mode 100644 contributing/samples/core/input_output_schema/README.md create mode 100644 contributing/samples/core/input_output_schema/agent.py create mode 100644 contributing/samples/core/input_output_schema/tests/weather_cupertino.json create mode 100644 contributing/samples/core/input_output_schema/tests/weather_sanjose.json create mode 100644 contributing/samples/core/input_output_schema/tests/weather_tokyo.json create mode 100644 contributing/samples/core/logprobs/README.md rename contributing/samples/{callbacks => core/logprobs}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => core}/logprobs/agent.py (84%) create mode 100644 contributing/samples/core/logprobs/tests/hello.json create mode 100644 contributing/samples/core/logprobs/tests/tell_joke.json create mode 100644 contributing/samples/core/logprobs/tests/what_is_ai.json create mode 100644 contributing/samples/core/quickstart/README.md rename contributing/samples/{code_execution => core/quickstart}/__init__.py (100%) rename contributing/samples/{ => core}/quickstart/agent.py (91%) create mode 100644 contributing/samples/core/quickstart/tests/time_ny.json create mode 100644 contributing/samples/core/quickstart/tests/weather_ny.json create mode 100644 contributing/samples/core/quickstart/tests/weather_time_ny.json rename contributing/samples/{ => core}/runner_debug_example/README.md (97%) rename contributing/samples/{ => core}/runner_debug_example/__init__.py (100%) rename contributing/samples/{ => core}/runner_debug_example/agent.py (54%) rename contributing/samples/{ => core}/runner_debug_example/main.py (94%) create mode 100644 contributing/samples/core/runner_debug_example/tests/stock_googl.json create mode 100644 contributing/samples/core/runner_debug_example/tests/stock_nvda.json create mode 100644 contributing/samples/core/runner_debug_example/tests/weather_sf.json rename contributing/samples/{ => environment_and_skills}/local_environment/README.md (100%) rename contributing/samples/{context_offloading_with_artifact => environment_and_skills/local_environment}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => environment_and_skills}/local_environment/agent.py (100%) rename contributing/samples/{ => environment_and_skills}/local_environment_skill/README.md (100%) rename contributing/samples/{crewai_tool_kwargs => environment_and_skills/local_environment_skill}/__init__.py (100%) rename contributing/samples/{ => environment_and_skills}/local_environment_skill/agent.py (100%) rename contributing/samples/{ => environment_and_skills}/local_environment_skill/skills/weather-skill/SKILL.md (59%) create mode 100644 contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/references/weather_info.md rename contributing/samples/{ => environment_and_skills}/local_environment_skill/skills/weather-skill/scripts/get_humidity.py (100%) create mode 100644 contributing/samples/environment_and_skills/skills/README.md create mode 100644 contributing/samples/environment_and_skills/skills/__init__.py create mode 100644 contributing/samples/environment_and_skills/skills/agent.py create mode 100644 contributing/samples/environment_and_skills/skills/skills/weather-skill/SKILL.md create mode 100644 contributing/samples/environment_and_skills/skills/skills/weather-skill/references/weather_info.md rename contributing/samples/{skills_agent => environment_and_skills/skills}/skills/weather-skill/scripts/get_humidity.py (100%) create mode 100644 contributing/samples/environment_and_skills/skills/tests/current_humidity.json create mode 100644 contributing/samples/environment_and_skills/skills/tests/current_weather.json create mode 100644 contributing/samples/environment_and_skills/skills/tests/support_hours.json create mode 100644 contributing/samples/environment_and_skills/skills/tests/wind_speed.json rename contributing/samples/{custom_code_execution => environment_and_skills/skills_agent}/__init__.py (100%) rename contributing/samples/{ => environment_and_skills}/skills_agent/agent.py (99%) rename contributing/samples/{ => environment_and_skills}/skills_agent/skills/weather-skill/SKILL.md (61%) create mode 100644 contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/references/weather_info.md create mode 100644 contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/scripts/get_humidity.py rename contributing/samples/{data_agent => environment_and_skills/skills_agent_gcs}/__init__.py (100%) rename contributing/samples/{ => environment_and_skills}/skills_agent_gcs/agent.py (100%) delete mode 100644 contributing/samples/fields_output_schema/agent.py delete mode 100644 contributing/samples/gcp_auth/README.md delete mode 100644 contributing/samples/gcp_auth/agent.py delete mode 100644 contributing/samples/gcp_auth/client/index.html delete mode 100644 contributing/samples/gcp_auth/client/main.py delete mode 100644 contributing/samples/gcp_auth/client/requirements.txt delete mode 100755 contributing/samples/hello_world/main.py delete mode 100644 contributing/samples/hello_world_apigeellm/.env-sample delete mode 100755 contributing/samples/hello_world_app/agent.py delete mode 100755 contributing/samples/hello_world_app/main.py delete mode 100755 contributing/samples/history_management/main.py rename contributing/samples/{ => hitl}/human_in_loop/README.md (100%) rename contributing/samples/{fields_output_schema => hitl/human_in_loop}/__init__.py (100%) rename contributing/samples/{a2a_human_in_loop/remote_a2a => hitl}/human_in_loop/agent.py (98%) rename contributing/samples/{ => hitl}/human_in_loop/main.py (100%) create mode 100644 contributing/samples/hitl/human_in_loop/tests/auto_reimburse_coffee.json create mode 100644 contributing/samples/hitl/human_in_loop/tests/reimburse_dinner.json rename contributing/samples/{fields_planner => hitl/human_tool_confirmation}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => hitl}/human_tool_confirmation/agent.py (99%) create mode 100644 contributing/samples/hitl/tool_confirmation/README.md rename contributing/samples/{files_retrieval_agent => hitl/tool_confirmation}/__init__.py (100%) create mode 100644 contributing/samples/hitl/tool_confirmation/agent.py create mode 100644 contributing/samples/hitl/tool_confirmation/tests/Transfer_500_and_close_account_ACC123.json create mode 100644 contributing/samples/hitl/tool_confirmation/tests/close_account_acc123.json create mode 100644 contributing/samples/hitl/tool_confirmation/tests/transfer_200_confirmed.json create mode 100644 contributing/samples/hitl/tool_confirmation/tests/transfer_200_declined.json create mode 100644 contributing/samples/hitl/tool_confirmation/tests/transfer_50.json rename contributing/samples/{ => hitl}/tool_human_in_the_loop_config/README.md (100%) rename contributing/samples/{gepa => hitl/tool_human_in_the_loop_config}/__init__.py (100%) rename contributing/samples/{ => hitl}/tool_human_in_the_loop_config/root_agent.yaml (100%) rename contributing/samples/{ => hitl}/tool_human_in_the_loop_config/tools.py (100%) rename contributing/samples/{ => integrations}/agent_registry_agent/README.md (100%) rename contributing/samples/{generate_image => integrations/agent_registry_agent}/__init__.py (100%) rename contributing/samples/{ => integrations}/agent_registry_agent/agent.py (100%) rename contributing/samples/{ => integrations}/api_registry_agent/README.md (100%) rename contributing/samples/{google_api => integrations/api_registry_agent}/__init__.py (100%) rename contributing/samples/{ => integrations}/api_registry_agent/agent.py (98%) rename contributing/samples/{ => integrations}/application_integration_agent/README.md (100%) rename contributing/samples/{google_search_agent => integrations/application_integration_agent}/__init__.py (100%) rename contributing/samples/{ => integrations}/application_integration_agent/agent.py (98%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/README.md (100%) rename contributing/samples/{hello_world => integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => integrations}/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py (100%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml (100%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/adk_agents/requirements.txt (100%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/adk_agents/sample.env (100%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg (100%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/doc_images/jwks_updated.png (100%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/doc_images/jwksgen.png (100%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py (97%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/hotel_booker_app/main.py (98%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/hotel_booker_app/openapi.yaml (100%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/idp/app.py (100%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/idp/sample.env (100%) create mode 100644 contributing/samples/integrations/authn-adk-all-in-one/idp/sample.jwks.json rename contributing/samples/{ => integrations}/authn-adk-all-in-one/idp/templates/admin.html (100%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/idp/templates/consent.html (100%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/idp/templates/login.html (100%) rename contributing/samples/{ => integrations}/authn-adk-all-in-one/requirements.txt (81%) rename contributing/samples/{ => integrations}/bigquery/README.md (100%) rename contributing/samples/{hello_world_app => integrations/bigquery}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => integrations}/bigquery/agent.py (99%) rename contributing/samples/{ => integrations}/bigquery_mcp/README.md (100%) rename contributing/samples/{hello_world_ma => integrations/bigquery_mcp}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => integrations}/bigquery_mcp/agent.py (98%) rename contributing/samples/{ => integrations}/bigtable/README.md (100%) rename contributing/samples/{hello_world_ollama => integrations/bigtable}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => integrations}/bigtable/agent.py (99%) rename contributing/samples/{ => integrations}/crewai_tool_kwargs/README.md (100%) rename contributing/samples/{hello_world_stream_fc_args => integrations/crewai_tool_kwargs}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => integrations}/crewai_tool_kwargs/agent.py (99%) rename contributing/samples/{ => integrations}/crewai_tool_kwargs/main.py (100%) rename contributing/samples/{ => integrations}/data_agent/README.md (100%) rename contributing/samples/{history_management => integrations/data_agent}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => integrations}/data_agent/agent.py (61%) rename contributing/samples/{ => integrations}/files_retrieval_agent/README.md (100%) rename contributing/samples/{human_in_loop => integrations/files_retrieval_agent}/__init__.py (100%) rename contributing/samples/{ => integrations}/files_retrieval_agent/agent.py (98%) rename contributing/samples/{ => integrations}/files_retrieval_agent/data/adk_overview.txt (100%) rename contributing/samples/{ => integrations}/files_retrieval_agent/data/tools_guide.txt (100%) rename contributing/samples/{human_tool_confirmation => integrations/gcp_skill_registry_agent}/__init__.py (100%) create mode 100644 contributing/samples/integrations/gcp_skill_registry_agent/agent.py rename contributing/samples/{ => integrations}/gepa/README.md (100%) rename contributing/samples/{sub_agents_config => integrations/gepa}/__init__.py (100%) rename contributing/samples/{ => integrations}/gepa/adk_agent.py (100%) rename contributing/samples/{ => integrations}/gepa/adk_agent_test.py (100%) rename contributing/samples/{ => integrations}/gepa/experiment.py (100%) rename contributing/samples/{ => integrations}/gepa/gepa_tau_bench.ipynb (99%) rename contributing/samples/{ => integrations}/gepa/gepa_utils.py (100%) rename contributing/samples/{ => integrations}/gepa/rater_lib.py (100%) rename contributing/samples/{ => integrations}/gepa/rubric_validation_template.txt (100%) rename contributing/samples/{ => integrations}/gepa/run_experiment.py (100%) rename contributing/samples/{ => integrations}/gepa/tau_bench_agent.py (100%) rename contributing/samples/{ => integrations}/gepa/voter_agent/eval_prompts.txt (100%) rename contributing/samples/{ => integrations}/gepa/voter_agent/gepa.ipynb (97%) rename contributing/samples/{ => integrations}/gepa/voter_agent/optimized_prompt.txt (100%) rename contributing/samples/{ => integrations}/gepa/voter_agent/prompts.txt (100%) rename contributing/samples/{ => integrations}/gepa/voter_agent/rubric_validation_template.txt (100%) rename contributing/samples/{ => integrations}/gepa/voter_agent/tools.py (100%) rename contributing/samples/{ => integrations}/gke_agent_sandbox/deployment_rbac.yaml (100%) rename contributing/samples/{ => integrations}/google_api/README.md (100%) rename contributing/samples/{integration_connector_euc_agent => integrations/google_api}/__init__.py (100%) rename contributing/samples/{ => integrations}/google_api/agent.py (98%) rename contributing/samples/{jira_agent => integrations/google_search_agent}/__init__.py (100%) rename contributing/samples/{ => integrations}/google_search_agent/agent.py (97%) rename contributing/samples/{ => integrations}/integration_connector_euc_agent/README.md (100%) rename contributing/samples/{json_passing_agent => integrations/integration_connector_euc_agent}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => integrations}/integration_connector_euc_agent/agent.py (99%) rename contributing/samples/{ => integrations}/jira_agent/README.md (100%) rename contributing/samples/{langchain_structured_tool_agent => integrations/jira_agent}/__init__.py (100%) rename contributing/samples/{ => integrations}/jira_agent/agent.py (98%) rename contributing/samples/{ => integrations}/jira_agent/image-app-intg-editor.png (100%) rename contributing/samples/{ => integrations}/jira_agent/image-application-integration.png (100%) rename contributing/samples/{ => integrations}/jira_agent/image-connection-tool.png (100%) rename contributing/samples/{ => integrations}/jira_agent/tools.py (100%) rename contributing/samples/{langchain_youtube_search_agent => integrations/langchain_structured_tool_agent}/__init__.py (100%) rename contributing/samples/{ => integrations}/langchain_structured_tool_agent/agent.py (93%) rename contributing/samples/{ => integrations}/langchain_youtube_search_agent/README.md (100%) rename contributing/samples/{litellm_streaming => integrations/langchain_youtube_search_agent}/__init__.py (100%) rename contributing/samples/{ => integrations}/langchain_youtube_search_agent/agent.py (94%) rename contributing/samples/{ => integrations}/langchain_youtube_search_agent/requirements.txt (100%) rename contributing/samples/{ => integrations}/oauth2_client_credentials/README.md (100%) rename contributing/samples/{litellm_structured_output => integrations/oauth2_client_credentials}/__init__.py (100%) rename contributing/samples/{ => integrations}/oauth2_client_credentials/agent.py (97%) rename contributing/samples/{ => integrations}/oauth2_client_credentials/main.py (100%) rename contributing/samples/{ => integrations}/oauth2_client_credentials/oauth2_test_server.py (99%) rename contributing/samples/{ => integrations}/oauth_calendar_agent/README.md (100%) rename contributing/samples/{litellm_with_fallback_models => integrations/oauth_calendar_agent}/__init__.py (100%) rename contributing/samples/{ => integrations}/oauth_calendar_agent/agent.py (99%) rename contributing/samples/{ => integrations}/pubsub/README.md (100%) rename contributing/samples/{live_bidi_streaming_multi_agent => integrations/pubsub}/__init__.py (100%) rename contributing/samples/{ => integrations}/pubsub/agent.py (99%) rename contributing/samples/{live_bidi_streaming_parallel_tools_agent => integrations/rag_agent}/__init__.py (100%) rename contributing/samples/{ => integrations}/rag_agent/agent.py (98%) rename contributing/samples/{live_bidi_streaming_single_agent => integrations/sandbox_computer_use}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => integrations}/sandbox_computer_use/agent.py (83%) rename contributing/samples/{ => integrations}/sandbox_computer_use/main.py (92%) rename contributing/samples/{ => integrations}/slack_agent/agent.py (100%) rename contributing/samples/{ => integrations}/spanner/README.md (100%) rename contributing/samples/{live_bidi_streaming_tools_agent => integrations/spanner}/__init__.py (100%) rename contributing/samples/{ => integrations}/spanner/agent.py (96%) rename contributing/samples/{ => integrations}/spanner_admin/README.md (100%) rename contributing/samples/{live_tool_callbacks_agent => integrations/spanner_admin}/__init__.py (100%) rename contributing/samples/{ => integrations}/spanner_admin/agent.py (99%) rename contributing/samples/{ => integrations}/spanner_rag_agent/README.md (100%) rename contributing/samples/{ => integrations}/spanner_rag_agent/Spanner_RAG_Sample_Agent.png (100%) rename contributing/samples/{local_environment => integrations/spanner_rag_agent}/__init__.py (100%) rename contributing/samples/{ => integrations}/spanner_rag_agent/agent.py (99%) rename contributing/samples/{ => integrations}/toolbox_agent/README.md (100%) rename contributing/samples/{local_environment_skill => integrations/toolbox_agent}/__init__.py (100%) rename contributing/samples/{ => integrations}/toolbox_agent/agent.py (96%) rename contributing/samples/{ => integrations}/toolbox_agent/tool_box.db (100%) rename contributing/samples/{ => integrations}/toolbox_agent/tools.yaml (100%) rename contributing/samples/{logprobs => legacy_workflows/non_llm_sequential}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{ => legacy_workflows}/non_llm_sequential/agent.py (94%) rename contributing/samples/{manual_ollama_test => legacy_workflows/simple_sequential_agent}/__init__.py (100%) rename contributing/samples/{ => legacy_workflows}/simple_sequential_agent/agent.py (98%) rename contributing/samples/{ => legacy_workflows}/workflow_agent_seq/README.md (100%) rename contributing/samples/{mcp_dynamic_header_agent => legacy_workflows/workflow_agent_seq}/__init__.py (100%) rename contributing/samples/{ => legacy_workflows}/workflow_agent_seq/agent.py (98%) rename contributing/samples/{ => legacy_workflows}/workflow_agent_seq/main.py (100%) rename contributing/samples/{ => legacy_workflows}/workflow_agent_seq/sample.output (100%) rename contributing/samples/{ => live}/live_agent_api_server_example/check_prime_11.wav (100%) rename contributing/samples/{ => live}/live_agent_api_server_example/check_prime_15.wav (100%) rename contributing/samples/{ => live}/live_agent_api_server_example/live_agent_example.py (100%) rename contributing/samples/{ => live}/live_agent_api_server_example/readme.md (100%) rename contributing/samples/{ => live}/live_bidi_debug_utils/pcm_audio_player.py (100%) rename contributing/samples/{mcp_in_agent_tool_remote => live/live_bidi_streaming_multi_agent}/__init__.py (100%) rename contributing/samples/{ => live}/live_bidi_streaming_multi_agent/agent.py (99%) rename contributing/samples/{ => live}/live_bidi_streaming_multi_agent/readme.md (100%) rename contributing/samples/{ => live}/live_bidi_streaming_parallel_tools_agent/README.md (100%) rename contributing/samples/{mcp_in_agent_tool_stdio => live/live_bidi_streaming_parallel_tools_agent}/__init__.py (100%) rename contributing/samples/{ => live}/live_bidi_streaming_parallel_tools_agent/agent.py (100%) rename contributing/samples/{mcp_postgres_agent => live/live_bidi_streaming_single_agent}/__init__.py (100%) rename contributing/samples/{ => live}/live_bidi_streaming_single_agent/agent.py (100%) rename contributing/samples/{ => live}/live_bidi_streaming_single_agent/readme.md (100%) rename contributing/samples/{mcp_progress_callback_agent => live/live_bidi_streaming_tools_agent}/__init__.py (100%) rename contributing/samples/{ => live}/live_bidi_streaming_tools_agent/agent.py (99%) rename contributing/samples/{ => live}/live_bidi_streaming_tools_agent/readme.md (100%) rename contributing/samples/{mcp_server_side_sampling => live/live_tool_callbacks_agent}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => live}/live_tool_callbacks_agent/agent.py (99%) rename contributing/samples/{ => live}/live_tool_callbacks_agent/readme.md (100%) delete mode 100644 contributing/samples/local_environment_skill/skills/weather-skill/references/weather_info.md delete mode 100644 contributing/samples/logprobs/README.md rename contributing/samples/{ => mcp}/mcp_dynamic_header_agent/README.md (100%) rename contributing/samples/{mcp_service_account_agent => mcp/mcp_dynamic_header_agent}/__init__.py (100%) rename contributing/samples/{ => mcp}/mcp_dynamic_header_agent/agent.py (97%) rename contributing/samples/{ => mcp}/mcp_dynamic_header_agent/header_server.py (100%) rename contributing/samples/{ => mcp}/mcp_in_agent_tool_remote/README.md (100%) rename contributing/samples/{mcp_sse_agent => mcp/mcp_in_agent_tool_remote}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => mcp}/mcp_in_agent_tool_remote/agent.py (97%) rename contributing/samples/{ => mcp}/mcp_in_agent_tool_stdio/README.md (100%) rename contributing/samples/{mcp_stdio_notion_agent => mcp/mcp_in_agent_tool_stdio}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => mcp}/mcp_in_agent_tool_stdio/agent.py (97%) rename contributing/samples/{ => mcp}/mcp_postgres_agent/README.md (100%) rename contributing/samples/{mcp_stdio_server_agent => mcp/mcp_postgres_agent}/__init__.py (100%) rename contributing/samples/{ => mcp}/mcp_postgres_agent/agent.py (98%) rename contributing/samples/{mcp_streamablehttp_agent => mcp/mcp_progress_callback_agent}/__init__.py (100%) rename contributing/samples/{ => mcp}/mcp_progress_callback_agent/agent.py (95%) rename contributing/samples/{ => mcp}/mcp_progress_callback_agent/mock_progress_server.py (100%) rename contributing/samples/{ => mcp}/mcp_server_side_sampling/README.md (99%) rename contributing/samples/{mcp_toolset_auth => mcp/mcp_server_side_sampling}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{ => mcp}/mcp_server_side_sampling/agent.py (100%) rename contributing/samples/{ => mcp}/mcp_server_side_sampling/mcp_server.py (100%) rename contributing/samples/{ => mcp}/mcp_service_account_agent/README.md (100%) rename contributing/samples/{memory => mcp/mcp_service_account_agent}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => mcp}/mcp_service_account_agent/agent.py (99%) rename contributing/samples/{ => mcp}/mcp_sse_agent/README.md (100%) rename contributing/samples/{multimodal_tool_results => mcp/mcp_sse_agent}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{ => mcp}/mcp_sse_agent/agent.py (98%) rename contributing/samples/{ => mcp}/mcp_sse_agent/filesystem_server.py (100%) rename contributing/samples/{ => mcp}/mcp_stdio_notion_agent/README.md (100%) rename contributing/samples/{non_llm_sequential => mcp/mcp_stdio_notion_agent}/__init__.py (100%) rename contributing/samples/{ => mcp}/mcp_stdio_notion_agent/agent.py (98%) rename contributing/samples/{oauth2_client_credentials => mcp/mcp_stdio_server_agent}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{ => mcp}/mcp_stdio_server_agent/agent.py (98%) rename contributing/samples/{ => mcp}/mcp_streamablehttp_agent/README.md (100%) rename contributing/samples/{oauth_calendar_agent => mcp/mcp_streamablehttp_agent}/__init__.py (100%) rename contributing/samples/{ => mcp}/mcp_streamablehttp_agent/agent.py (98%) rename contributing/samples/{ => mcp}/mcp_streamablehttp_agent/filesystem_server.py (100%) rename contributing/samples/{ => mcp}/mcp_toolset_auth/README.md (100%) rename contributing/samples/{output_schema_with_tools => mcp/mcp_toolset_auth}/__init__.py (100%) rename contributing/samples/{ => mcp}/mcp_toolset_auth/agent.py (98%) rename contributing/samples/{ => mcp}/mcp_toolset_auth/main.py (98%) rename contributing/samples/{ => mcp}/mcp_toolset_auth/oauth_mcp_server.py (100%) rename contributing/samples/{ => mcp}/tool_mcp_stdio_notion_config/README.md (100%) rename contributing/samples/{ => mcp}/tool_mcp_stdio_notion_config/root_agent.yaml (100%) rename contributing/samples/{hello_world_gemma3_ollama => models/hello_world_anthropic}/__init__.py (100%) rename contributing/samples/{ => models}/hello_world_anthropic/agent.py (100%) rename contributing/samples/{ => models}/hello_world_anthropic/main.py (100%) rename contributing/samples/{ => models}/hello_world_apigeellm/README.md (100%) rename contributing/samples/{ => models}/hello_world_apigeellm/agent.py (100%) rename contributing/samples/{ => models}/hello_world_apigeellm/main.py (100%) rename contributing/samples/{hello_world_litellm => models/hello_world_gemma}/__init__.py (100%) rename contributing/samples/{ => models}/hello_world_gemma/agent.py (100%) rename contributing/samples/{ => models}/hello_world_gemma/main.py (100%) rename contributing/samples/{hello_world_litellm_add_function_to_prompt => models/hello_world_gemma3_ollama}/__init__.py (100%) rename contributing/samples/{ => models}/hello_world_gemma3_ollama/agent.py (100%) rename contributing/samples/{ => models}/hello_world_gemma3_ollama/main.py (100%) rename contributing/samples/{migrate_session_db => models/hello_world_litellm}/__init__.py (100%) rename contributing/samples/{ => models}/hello_world_litellm/agent.py (100%) rename contributing/samples/{ => models}/hello_world_litellm/main.py (100%) rename contributing/samples/{postgres_session_service => models/hello_world_litellm_add_function_to_prompt}/__init__.py (100%) rename contributing/samples/{ => models}/hello_world_litellm_add_function_to_prompt/agent.py (100%) rename contributing/samples/{ => models}/hello_world_litellm_add_function_to_prompt/main.py (100%) rename contributing/samples/{ => models}/hello_world_ollama/README.md (100%) rename contributing/samples/{parallel_functions => models/hello_world_ollama}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{ => models}/hello_world_ollama/agent.py (100%) rename contributing/samples/{ => models}/hello_world_ollama/main.py (100%) rename contributing/samples/{ => models}/interactions_api/README.md (100%) rename contributing/samples/{ => models}/interactions_api/__init__.py (100%) rename contributing/samples/{ => models}/interactions_api/agent.py (98%) rename contributing/samples/{ => models}/interactions_api/main.py (100%) create mode 100644 contributing/samples/models/litellm_inline_tool_call/__init__.py rename contributing/samples/{ => models}/litellm_inline_tool_call/agent.py (100%) rename contributing/samples/{plugin_debug_logging => models/litellm_streaming}/__init__.py (100%) rename contributing/samples/{ => models}/litellm_streaming/agent.py (100%) rename contributing/samples/{ => models}/litellm_streaming/main.py (100%) rename contributing/samples/{plugin_reflect_tool_retry/basic => models/litellm_structured_output}/__init__.py (100%) rename contributing/samples/{ => models}/litellm_structured_output/agent.py (100%) rename contributing/samples/{ => models}/litellm_with_fallback_models/README.md (100%) rename contributing/samples/{plugin_reflect_tool_retry/hallucinating_func_name => models/litellm_with_fallback_models}/__init__.py (100%) rename contributing/samples/{ => models}/litellm_with_fallback_models/agent.py (100%) rename contributing/samples/{pubsub => models/manual_ollama_test}/__init__.py (100%) rename contributing/samples/{ => models}/manual_ollama_test/agent.py (100%) rename contributing/samples/{pydantic_argument => multi_agent/hello_world_ma}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{ => multi_agent}/hello_world_ma/agent.py (98%) create mode 100644 contributing/samples/multi_agent/hello_world_ma/tests/roll_die_and_check_prime.json rename contributing/samples/{ => multi_agent}/multi_agent_basic_config/README.md (100%) rename contributing/samples/{ => multi_agent}/multi_agent_basic_config/code_tutor_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_basic_config/math_tutor_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_basic_config/root_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_llm_config/README.md (100%) rename contributing/samples/{ => multi_agent}/multi_agent_llm_config/__init__.py (77%) rename contributing/samples/{ => multi_agent}/multi_agent_llm_config/prime_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_llm_config/roll_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_llm_config/root_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_loop_config/README.md (100%) rename contributing/samples/{ => multi_agent}/multi_agent_loop_config/loop_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_loop_config/root_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_loop_config/writer_agents/critic_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_loop_config/writer_agents/initial_writer_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_loop_config/writer_agents/refiner_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_seq_config/README.md (100%) rename contributing/samples/{ => multi_agent}/multi_agent_seq_config/root_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_seq_config/sub_agents/code_refactorer_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_seq_config/sub_agents/code_reviewer_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/multi_agent_seq_config/sub_agents/code_writer_agent.yaml (100%) create mode 100644 contributing/samples/multi_agent/single_turn_sub_agent/README.md create mode 100644 contributing/samples/multi_agent/single_turn_sub_agent/agent.py create mode 100644 contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000.json create mode 100644 contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000_large.json create mode 100644 contributing/samples/multi_agent/single_turn_sub_agent/tests/go.json create mode 100644 contributing/samples/multi_agent/sub_agents/README.md rename contributing/samples/{quickstart => multi_agent/sub_agents}/__init__.py (100%) create mode 100644 contributing/samples/multi_agent/sub_agents/agent.py create mode 100644 contributing/samples/multi_agent/sub_agents/tests/check_and_close.json create mode 100644 contributing/samples/multi_agent/sub_agents/tests/check_status.json rename contributing/samples/{tool_functions_config => multi_agent/sub_agents_config}/__init__.py (100%) rename contributing/samples/{ => multi_agent}/sub_agents_config/life_agent.py (100%) rename contributing/samples/{ => multi_agent}/sub_agents_config/root_agent.yaml (100%) rename contributing/samples/{ => multi_agent}/sub_agents_config/work_agent.yaml (100%) create mode 100644 contributing/samples/multi_agent/task_sub_agent/README.md create mode 100644 contributing/samples/multi_agent/task_sub_agent/agent.py create mode 100644 contributing/samples/multi_agent/task_sub_agent/tests/10_burgers.json create mode 100644 contributing/samples/multi_agent/task_sub_agent/tests/3_burgers.json create mode 100644 contributing/samples/multi_agent/task_sub_agent/tests/3_burgers_and_credit_card.json create mode 100644 contributing/samples/multi_agent/task_sub_agent/tests/credit_card.json create mode 100644 contributing/samples/multi_agent/task_sub_agent/tests/order_food.json create mode 100644 contributing/samples/multi_agent/three_layer_transfer/README.md rename contributing/samples/{rag_agent => multi_agent/three_layer_transfer}/__init__.py (100%) create mode 100644 contributing/samples/multi_agent/three_layer_transfer/agent.py rename contributing/samples/{ => multimodal}/computer_use/README.md (100%) rename contributing/samples/{ => multimodal}/computer_use/agent.py (100%) rename contributing/samples/{ => multimodal}/computer_use/playwright.py (100%) rename contributing/samples/{ => multimodal}/computer_use/requirements.txt (100%) rename contributing/samples/{rewind_session => multimodal/generate_image}/__init__.py (100%) rename contributing/samples/{ => multimodal}/generate_image/agent.py (98%) rename contributing/samples/{ => multimodal}/generate_image/sample.session.json (100%) create mode 100644 contributing/samples/multimodal/multimodal/README.md rename contributing/samples/{sandbox_computer_use => multimodal/multimodal}/__init__.py (100%) create mode 100644 contributing/samples/multimodal/multimodal/agent.py rename contributing/samples/{session_state_agent => multimodal/multimodal_tool_results}/__init__.py (100%) rename contributing/samples/{ => multimodal}/multimodal_tool_results/agent.py (97%) rename contributing/samples/{ => multimodal}/static_non_text_content/README.md (100%) rename contributing/samples/{ => multimodal}/static_non_text_content/__init__.py (100%) rename contributing/samples/{ => multimodal}/static_non_text_content/agent.py (99%) rename contributing/samples/{ => multimodal}/static_non_text_content/main.py (100%) rename contributing/samples/{ => patterns}/context_offloading_with_artifact/README.md (100%) rename contributing/samples/{simple_sequential_agent => patterns/context_offloading_with_artifact}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{ => patterns}/context_offloading_with_artifact/agent.py (99%) rename contributing/samples/{skills_agent => patterns/fields_planner}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{ => patterns}/fields_planner/agent.py (100%) rename contributing/samples/{ => patterns}/fields_planner/main.py (100%) rename contributing/samples/{ => patterns}/json_passing_agent/README.md (100%) rename contributing/samples/{skills_agent_gcs => patterns/json_passing_agent}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{ => patterns}/json_passing_agent/agent.py (98%) rename contributing/samples/{ => patterns}/json_passing_agent/main.py (100%) rename contributing/samples/{ => patterns}/workflow_triage/README.md (100%) rename contributing/samples/{spanner => patterns/workflow_triage}/__init__.py (100%) mode change 100644 => 100755 rename contributing/samples/{ => patterns}/workflow_triage/agent.py (98%) rename contributing/samples/{ => patterns}/workflow_triage/execution_agent.py (97%) rename contributing/samples/{ => plugin}/plugin_basic/README.md (100%) rename contributing/samples/{ => plugin}/plugin_basic/__init__.py (100%) rename contributing/samples/{ => plugin}/plugin_basic/count_plugin.py (100%) rename contributing/samples/{ => plugin}/plugin_basic/main.py (98%) rename contributing/samples/{spanner_admin => plugin/plugin_debug_logging}/__init__.py (100%) rename contributing/samples/{ => plugin}/plugin_debug_logging/agent.py (99%) rename contributing/samples/{ => plugin}/plugin_reflect_tool_retry/README.md (100%) rename contributing/samples/{spanner_rag_agent => plugin/plugin_reflect_tool_retry/basic}/__init__.py (100%) rename contributing/samples/{ => plugin}/plugin_reflect_tool_retry/basic/agent.py (98%) rename contributing/samples/{token_usage => plugin/plugin_reflect_tool_retry/hallucinating_func_name}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => plugin}/plugin_reflect_tool_retry/hallucinating_func_name/agent.py (98%) delete mode 100644 contributing/samples/session_state_agent/input.json delete mode 100644 contributing/samples/skills_agent/skills/weather-skill/references/weather_info.md delete mode 100755 contributing/samples/telemetry/agent.py delete mode 100755 contributing/samples/telemetry/main.py delete mode 100755 contributing/samples/token_usage/agent.py delete mode 100755 contributing/samples/token_usage/main.py rename contributing/samples/{toolbox_agent => tools/agent_tool_with_grounding_metadata}/__init__.py (100%) rename contributing/samples/{ => tools}/agent_tool_with_grounding_metadata/agent.py (100%) rename contributing/samples/{ => tools}/built_in_multi_tools/README.md (100%) rename contributing/samples/{vertex_code_execution => tools/built_in_multi_tools}/__init__.py (100%) rename contributing/samples/{ => tools}/built_in_multi_tools/agent.py (100%) create mode 100644 contributing/samples/tools/function_tools/README.md rename contributing/samples/{workflow_agent_seq => tools/function_tools}/__init__.py (100%) create mode 100644 contributing/samples/tools/function_tools/agent.py create mode 100644 contributing/samples/tools/function_tools/tests/a_random_number.json create mode 100644 contributing/samples/tools/function_tools/tests/a_random_number_and_check_even.json create mode 100644 contributing/samples/tools/function_tools/tests/random_number_and_is_5_even.json rename contributing/samples/{workflow_triage => tools/hello_world_stream_fc_args}/__init__.py (100%) mode change 100755 => 100644 rename contributing/samples/{ => tools}/hello_world_stream_fc_args/agent.py (100%) mode change 100755 => 100644 create mode 100644 contributing/samples/tools/long_running_functions/README.md create mode 100644 contributing/samples/tools/long_running_functions/__init__.py create mode 100644 contributing/samples/tools/long_running_functions/agent.py create mode 100644 contributing/samples/tools/long_running_functions/tests/export_to_csv.json create mode 100644 contributing/samples/tools/long_running_functions/tests/export_to_csv_and_json.json rename contributing/samples/{ => tools}/output_schema_with_tools/README.md (100%) create mode 100644 contributing/samples/tools/output_schema_with_tools/__init__.py rename contributing/samples/{ => tools}/output_schema_with_tools/agent.py (99%) rename contributing/samples/{ => tools}/parallel_functions/README.md (100%) create mode 100644 contributing/samples/tools/parallel_functions/__init__.py rename contributing/samples/{ => tools}/parallel_functions/agent.py (96%) create mode 100644 contributing/samples/tools/parallel_functions/tests/test_all_tools.json create mode 100644 contributing/samples/tools/parallel_functions/tests/test_parallel_mixed.json create mode 100644 contributing/samples/tools/parallel_functions/tests/test_parallel_weather.json rename contributing/samples/{ => tools}/pydantic_argument/README.md (100%) create mode 100644 contributing/samples/tools/pydantic_argument/__init__.py rename contributing/samples/{ => tools}/pydantic_argument/agent.py (100%) rename contributing/samples/{ => tools}/pydantic_argument/main.py (100%) create mode 100644 contributing/samples/tools/pydantic_argument/tests/test_create_company.json create mode 100644 contributing/samples/tools/pydantic_argument/tests/test_create_user.json create mode 100644 contributing/samples/tools/pydantic_argument/tests/test_create_user_with_prefs.json rename contributing/samples/{ => tools}/tool_agent_tool_config/root_agent.yaml (100%) rename contributing/samples/{ => tools}/tool_agent_tool_config/summarizer_agent.yaml (100%) rename contributing/samples/{ => tools}/tool_agent_tool_config/web_search_agent.yaml (100%) rename contributing/samples/{ => tools}/tool_builtin_config/root_agent.yaml (100%) rename contributing/samples/{tool_human_in_the_loop_config => tools/tool_functions_config}/__init__.py (100%) rename contributing/samples/{ => tools}/tool_functions_config/root_agent.yaml (100%) rename contributing/samples/{ => tools}/tool_functions_config/tools.py (100%) create mode 100644 contributing/samples/workflows/auth_api_key/README.md create mode 100644 contributing/samples/workflows/auth_api_key/agent.py create mode 100644 contributing/samples/workflows/auth_api_key/tests/go.json create mode 100644 contributing/samples/workflows/auth_oauth/README.md create mode 100644 contributing/samples/workflows/auth_oauth/__init__.py create mode 100644 contributing/samples/workflows/auth_oauth/agent.py create mode 100644 contributing/samples/workflows/dynamic_fan_out_fan_in/README.md create mode 100644 contributing/samples/workflows/dynamic_fan_out_fan_in/agent.py create mode 100644 contributing/samples/workflows/dynamic_nodes/README.md create mode 100644 contributing/samples/workflows/dynamic_nodes/agent.py create mode 100644 contributing/samples/workflows/dynamic_nodes/tests/flower.json create mode 100644 contributing/samples/workflows/fan_out_fan_in/README.md create mode 100644 contributing/samples/workflows/fan_out_fan_in/agent.py create mode 100644 contributing/samples/workflows/fan_out_fan_in/tests/go.json create mode 100644 contributing/samples/workflows/loop/README.md create mode 100644 contributing/samples/workflows/loop/agent.py create mode 100644 contributing/samples/workflows/loop/tests/computer.json create mode 100644 contributing/samples/workflows/loop/tests/flower.json create mode 100644 contributing/samples/workflows/loop_config/README.md create mode 100644 contributing/samples/workflows/loop_config/agent.py create mode 100644 contributing/samples/workflows/loop_config/evaluate_headline.yaml create mode 100644 contributing/samples/workflows/loop_config/generate_headline.yaml create mode 100644 contributing/samples/workflows/loop_config/root_agent.yaml create mode 100644 contributing/samples/workflows/loop_self/README.md create mode 100644 contributing/samples/workflows/loop_self/agent.py create mode 100644 contributing/samples/workflows/loop_self/tests/3.json create mode 100644 contributing/samples/workflows/message/README.md create mode 100644 contributing/samples/workflows/message/agent.py create mode 100644 contributing/samples/workflows/message/tests/go.json create mode 100644 contributing/samples/workflows/multi_triggers/README.md create mode 100644 contributing/samples/workflows/multi_triggers/agent.py create mode 100644 contributing/samples/workflows/multi_triggers/tests/go.json create mode 100644 contributing/samples/workflows/nested_workflow/README.md create mode 100644 contributing/samples/workflows/nested_workflow/__init__.py create mode 100644 contributing/samples/workflows/nested_workflow/agent.py create mode 100644 contributing/samples/workflows/nested_workflow/tests/1984.json create mode 100644 contributing/samples/workflows/node_output/README.md create mode 100644 contributing/samples/workflows/node_output/agent.py create mode 100644 contributing/samples/workflows/node_output/tests/go.json create mode 100644 contributing/samples/workflows/parallel_worker/README.md create mode 100644 contributing/samples/workflows/parallel_worker/agent.py create mode 100644 contributing/samples/workflows/parallel_worker/tests/flower.json create mode 100644 contributing/samples/workflows/request_input/README.md create mode 100644 contributing/samples/workflows/request_input/agent.py create mode 100644 contributing/samples/workflows/request_input/tests/phone_broke.json create mode 100644 contributing/samples/workflows/request_input/tests/phone_broke_reject.json create mode 100644 contributing/samples/workflows/request_input_advanced/README.md create mode 100644 contributing/samples/workflows/request_input_advanced/agent.py create mode 100644 contributing/samples/workflows/request_input_advanced/tests/2_sick_days.json create mode 100644 contributing/samples/workflows/request_input_rerun/README.md create mode 100644 contributing/samples/workflows/request_input_rerun/agent.py create mode 100644 contributing/samples/workflows/request_input_rerun/tests/phone_broke.json create mode 100644 contributing/samples/workflows/retry/README.md create mode 100644 contributing/samples/workflows/retry/agent.py create mode 100644 contributing/samples/workflows/retry/tests/go.json create mode 100644 contributing/samples/workflows/route/README.md create mode 100644 contributing/samples/workflows/route/agent.py create mode 100644 contributing/samples/workflows/route/tests/who_are_you.json create mode 100644 contributing/samples/workflows/sequence/README.md create mode 100644 contributing/samples/workflows/sequence/__init__.py create mode 100644 contributing/samples/workflows/sequence/agent.py create mode 100644 contributing/samples/workflows/sequence/tests/go.json create mode 100644 contributing/samples/workflows/state/README.md create mode 100644 contributing/samples/workflows/state/agent.py create mode 100644 contributing/samples/workflows/state/tests/go.json create mode 100644 contributing/samples/workflows/use_as_output/README.md create mode 100644 contributing/samples/workflows/use_as_output/agent.py create mode 100644 contributing/samples/workflows/use_as_output/tests/go.json create mode 100755 scripts/check_new_py_files.sh create mode 100644 scripts/generate_agent_config_schema.py delete mode 100755 scripts/unittests.sh diff --git a/.gitignore b/.gitignore index 47f633c5c5..a4f3937c76 100644 --- a/.gitignore +++ b/.gitignore @@ -103,6 +103,7 @@ Thumbs.db # Developers should symlink or copy AGENTS.md and add their own overrides locally .adk/ .claude/ +.jetski* CLAUDE.md .cursor/ .cursorrules @@ -116,3 +117,6 @@ CLAUDE.md .rooignore .bolt/ .v0/ + +# Conformance test outputs (timestamped folders from --test mode) +**/conformance/20*-*-*_*-*-*/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 60bb4d50d9..194d9306c3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -28,11 +28,19 @@ repos: else echo "Warning: addlicense not installed, skipping"; fi' -- language: system files: \.(py|sh)$ + # TODO: Add check-new-py-prefix hook back after resolving the exclusions/style rules for public v2 package structures. + # - id: check-new-py-prefix + # name: Check new Python files have _ prefix + # description: Enforces private-by-default policy for new Python files (see .agents/skills/adk-style/references/visibility.md). + # entry: scripts/check_new_py_files.sh + # language: script + # files: ^src/google/adk/.*\.py$ + # pass_filenames: false - repo: https://github.com/executablebooks/mdformat rev: 0.7.22 hooks: - id: mdformat files: ^(README\.md|CONTRIBUTING\.md|contributing/.*\.md)$ - exclude: (?i)SKILL\.md$ + exclude: (?i)(skills/|SKILL\.md$) additional_dependencies: - mdformat-gfm diff --git a/AGENTS.md b/AGENTS.md index 2e63c52c5a..258b509e20 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,588 +1,41 @@ # AI Coding Assistant Context -This document provides context for AI coding assistants (Claude Code, Gemini -CLI, GitHub Copilot, Cursor, etc.) to understand the ADK Python project and -assist with development. +This document provides context for AI coding assistants (Antigravity, Gemini CLI, etc.) to understand the ADK Python project and assist with development. -## Project Overview - -The Agent Development Kit (ADK) is an open-source, code-first Python toolkit for -building, evaluating, and deploying sophisticated AI agents with flexibility and -control. While optimized for Gemini and the Google ecosystem, ADK is -model-agnostic, deployment-agnostic, and is built for compatibility with other -frameworks. ADK was designed to make agent development feel more like software -development, to make it easier for developers to create, deploy, and orchestrate -agentic architectures that range from simple tasks to complex workflows. +## ADK Knowledge, Architecture, and Style -### Key Components +For all matters regarding ADK development, please use the appropriate skill: -- **Agent** - Blueprint defining identity, instructions, and tools - (`LlmAgent`, `LoopAgent`, `ParallelAgent`, `SequentialAgent`, etc.) -- **Runner** - Execution engine that orchestrates agent execution. It manages - the 'Reason-Act' loop, processes messages within a session, generates - events, calls LLMs, executes tools, and handles multi-agent coordination. It - interacts with various services like session management, artifact storage, - and memory, and integrates with application-wide plugins. The runner - provides different execution modes: `run_async` for asynchronous execution - in production, `run_live` for bidirectional streaming interaction, and - `run` for synchronous execution suitable for local testing and debugging. At - the end of each invocation, it can perform event compaction to manage - session history size. -- **Tool** - Functions/capabilities agents can call (Python functions, OpenAPI - specs, MCP tools, Google API tools) -- **Session** - Conversation state management (in-memory, Vertex AI, - Spanner-backed) -- **Memory** - Long-term recall across sessions +- **`adk-architecture`**: Use this skill whenever you need to understand the architecture, event flow, or state management of the ADK system, or when designing or modifying core components and public APIs. + - Read `.agents/skills/adk-architecture/SKILL.md` for full instructions. +- **`adk-style`**: Use this skill whenever writing code, tests, or reviewing PRs for the ADK project to ensure compliance with styling and coding conventions. Also use it for committing, bug fixing, and testing rules. + - Read `.agents/skills/adk-style/SKILL.md` for full instructions. +- **`adk-git`**: Use this skill for any git operation (commit, push, pull, rebase, etc.). It provides guidelines for Conventional Commits and branch naming. + - Read `.agents/skills/adk-git/SKILL.md` for full instructions. +- **`adk-sample-creator`**: Use this skill when creating new samples demonstrating features or agent patterns, or when adding examples to subdirectories under `contributing/`. + - Read `.agents/skills/adk-sample-creator/SKILL.md` for full instructions. -### How the Runner Works +## Project Overview -The Runner is the stateless orchestration engine that manages agent execution. -It does not hold conversation history in memory; instead, it relies on services -like `SessionService`, `ArtifactService`, and `MemoryService` for persistence. +The Agent Development Kit (ADK) is an open-source, code-first Python toolkit for building, evaluating, and deploying sophisticated AI agents. -**Invocation Lifecycle:** +### Key Components -Each call to `runner.run_async()` or `runner.run()` processes a single user -turn, known as an **invocation**. +- **Agent**: Blueprint defining identity, instructions, and tools. +- **Runner**: Stateless execution engine that orchestrates agent execution. +- **Tool**: Functions/capabilities agents can call. +- **Session**: Conversation state management. +- **Memory**: Long-term recall across sessions. +- **Workflow** (ADK 2.0): Graph-based orchestration of complex, multi-step agent interactions. +- **BaseNode** (ADK 2.0): Contract for all nodes, supporting output streaming and human-in-the-loop steps. +- **Context** (ADK 2.0): Holds execution state and telemetry context mapped 1:1 to nodes. -1. **Session Retrieval:** When `run_async()` is called with a `session_id`, the - runner fetches the session state, including all conversation events, from - the `SessionService`. -2. **Context Creation:** It creates an `InvocationContext` containing the - session, the new user message, and references to persistence services. -3. **Agent Execution:** The runner calls `agent.run_async()` with this context. - The agent then enters its reason-act loop, which may involve: - * Calling an LLM for reasoning. - * Executing tools (function calling). - * Generating text or audio responses. - * Transferring control to sub-agents. -4. **Event Streaming & Persistence:** Each step in the agent's execution (LLM - call, tool call, tool response, model response) generates `Event` objects. - The runner streams these events back to the caller and simultaneously - appends them to the session via `SessionService`. -5. **Invocation Completion:** Once the agent has produced its final response - for the turn (e.g., a text response to the user), the agent's execution loop - finishes. -6. **Event Compaction:** If event compaction is configured, the runner may - summarize older events in the session to manage context window limits, - appending a `CompactedEvent` to the session. -7. **Next Turn:** When the user sends another message, a new `run_async()` - invocation begins, repeating the cycle by loading the session, which now - includes the events from all prior turns. +For details on how the Runner works and the invocation lifecycle, please refer to the `adk-architecture` skill and the referenced documentation therein. ## Project Architecture -Please refer to -[ADK Project Overview and Architecture](https://github.com/google/adk-python/blob/main/contributing/adk_project_overview_and_architecture.md) -for details. - -### Source Structure - -``` -src/google/adk/ -├── agents/ # Agent implementations (LlmAgent, LoopAgent, ParallelAgent, etc.) -├── runners.py # Core Runner orchestration class -├── tools/ # Tool ecosystem (50+ files) -│ ├── google_api_tool/ -│ ├── bigtable/, bigquery/, spanner/ -│ ├── openapi_tool/ -│ └── mcp_tool/ # Model Context Protocol -├── models/ # LLM integrations (Gemini, Anthropic, LiteLLM) -├── sessions/ # Session management (in-memory, Vertex AI, Spanner) -├── memory/ # Long-term memory services -├── evaluation/ # Evaluation framework (47 files) -├── cli/ # CLI tools and web UI -├── flows/ # Execution flow orchestration -├── a2a/ # Agent-to-Agent protocol -├── telemetry/ # Observability and tracing -└── utils/ # Utility functions -``` - -### Test Structure - -``` -tests/ -├── unittests/ # 2600+ unit tests across 236+ files -│ ├── agents/ -│ ├── tools/ -│ ├── models/ -│ ├── evaluation/ -│ ├── a2a/ -│ └── ... -└── integration/ # Integration tests -``` - -### ADK Live (Bidi-streaming) - -- ADK live feature can be accessed from runner.run_live(...) and corresponding - FAST api endpoint. -- ADK live feature is built on top of - [Gemini Live API](https://cloud.google.com/vertex-ai/generative-ai/docs/live-api). - We integrate Gemini Live API through - [GenAI SDK](https://github.com/googleapis/python-genai). -- ADK live related configs are in - [run_config.py](https://github.com/google/adk-python/blob/main/src/google/adk/agents/run_config.py). -- ADK live under multi-agent scenario: we convert the audio into text. This - text will be passed to next agent as context. -- Most logics are in - [base_llm_flow.py](https://github.com/google/adk-python/blob/main/src/google/adk/flows/llm_flows/base_llm_flow.py) - and - [gemini_llm_connection.py](https://github.com/google/adk-python/blob/main/src/google/adk/models/gemini_llm_connection.py). -- Input transcription and output transcription should be added to session as - Event. -- User audio or model audio should be saved into artifacts with a reference in - Event to it. -- Tests are in - [tests/unittests/streaming](https://github.com/google/adk-python/tree/main/tests/unittests/streaming). - -### Agent Structure Convention (Required) - -**All agent directories must follow this structure:** `my_agent/ ├── -__init__.py # MUST contain: from . import agent └── agent.py # MUST define: -root_agent = Agent(...) OR app = App(...)` - -**Choose one pattern based on your needs:** - -**Option 1 - Simple Agent (for basic agents without plugins):** ```python from -google.adk.agents import Agent from google.adk.tools import google_search - -root_agent = Agent( name="search_assistant", model="gemini-2.5-flash", -instruction="You are a helpful assistant.", description="An assistant that can -search the web.", tools=[google_search] ) ``` - -**Option 2 - App Pattern (when you need plugins, event compaction, custom -configuration):** ```python from google.adk import Agent from google.adk.apps -import App from google.adk.plugins import ContextFilterPlugin - -root_agent = Agent( name="my_agent", model="gemini-2.5-flash", instruction="You -are a helpful assistant.", tools=[...], ) - -app = App( name="my_app", root_agent=root_agent, plugins=[ -ContextFilterPlugin(num_invocations_to_keep=3), ], ) ``` - -**Rationale:** This structure allows the ADK CLI (`adk web`, `adk run`, etc.) to -automatically discover and load agents without additional configuration. +For detailed architecture patterns, component descriptions, and core interfaces, please refer to the **`adk-architecture`** skill at `.agents/skills/adk-architecture/SKILL.md`. ## Development Setup -### Requirements - -**Minimum requirements:** - -- Python 3.10+ (**Python 3.11+ strongly recommended** for best performance) -- `uv` package manager (**required** - faster than pip/venv) - -**Install uv if not already installed:** `bash curl -LsSf -https://astral.sh/uv/install.sh | sh` - -### Setup Instructions - -**Standard setup for development:** ```bash - -# Create virtual environment with Python 3.11 - -uv venv --python "python3.11" ".venv" source .venv/bin/activate - -# Install all dependencies for development - -uv sync --all-extras ``` - -**Minimal setup for testing only (matches CI):** `bash uv sync --extra test` - -**Virtual Environment Usage (Required):** - **Always use** `.venv/bin/python` or -`.venv/bin/pytest` directly - **Or activate** with `source .venv/bin/activate` -before running commands - **Never use** `python -m venv` - always create with -`uv venv` if missing - -**Rationale:** `uv` is significantly faster and ensures consistent dependency -resolution across the team. - -### Building - -```bash -# Build wheel -uv build - -# Install local build for testing -pip install dist/google_adk--py3-none-any.whl -``` - -### Running Agents Locally - -**For interactive development and debugging:** ```bash - -# Launch web UI (recommended for development) - -adk web path/to/agents_dir ``` - -**For CLI-based testing:** ```bash - -# Interactive CLI (prompts for user input) - -adk run path/to/my_agent ``` - -**For API/production mode:** ```bash - -# Start FastAPI server - -adk api_server path/to/agents_dir ``` - -**For running evaluations:** ```bash - -# Run evaluation set against agent - -adk eval path/to/my_agent path/to/eval_set.json ``` - -## ADK: Style Guides - -### Python Style Guide - -The project follows the Google Python Style Guide. Key conventions are enforced -using `pylint` with the provided `pylintrc` configuration file. Here are some of -the key style points: - -* **Indentation**: 2 spaces. -* **Line Length**: Maximum 80 characters. -* **Naming Conventions**: - * `function_and_variable_names`: `snake_case` - * `ClassNames`: `CamelCase` - * `CONSTANTS`: `UPPERCASE_SNAKE_CASE` -* **Docstrings**: Required for all public modules, functions, classes, and - methods. -* **Imports**: Organized and sorted. -* **Error Handling**: Specific exceptions should be caught, not general ones - like `Exception`. - -### Autoformat (Required Before Committing) - -**Always run** before committing code: `pre-commit run --all-files` - -**Check formatting** without making changes: `bash pyink --check --diff --config -pyproject.toml src/ isort --check src/` - -**Formatting Standards (Enforced by CI):** - **Formatter:** `pyink` -(Google-style Python formatter) - **Line length:** 80 characters maximum - -**Indentation:** 2 spaces (never tabs) - **Import sorter:** `isort` with Google -profile - **Linter:** `pylint` with Google Python Style Guide - -**Rationale:** Consistent formatting eliminates style debates and makes code -reviews focus on logic rather than style. - -### In ADK source - -Below styles applies to the ADK source code (under `src/` folder of the GitHub -repo). - -#### Use relative imports (Required) - -```python -# DO - Use relative imports -from ..agents.llm_agent import LlmAgent - -# DON'T - No absolute imports -from google.adk.agents.llm_agent import LlmAgent -``` - -**Rationale:** Relative imports make the code more maintainable and avoid -circular import issues in large codebases. - -#### Import from module, not from `__init__.py` (Required) - -```python -# DO - Import directly from module -from ..agents.llm_agent import LlmAgent - -# DON'T - Import from __init__.py -from ..agents import LlmAgent -``` - -**Rationale:** Direct module imports make dependencies explicit and improve IDE -navigation and refactoring. - -#### Always do `from __future__ import annotations` (Required) - -**Rule:** Every source file must include `from __future__ import annotations` -immediately after the license header, before any other imports. - -```python -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations # REQUIRED - Always include this - -# ... rest of imports ... -``` - -**Rationale:** This enables forward-referencing classes without quotes, -improving code readability and type hint support (PEP 563). - -### In ADK tests - -#### Use absolute imports (Required) - -**Rule:** Test code must use absolute imports (`google.adk.*`) to match how -users import ADK. - -```python -# DO - Use absolute imports -from google.adk.agents.llm_agent import LlmAgent - -# DON'T - No relative imports in tests -from ..agents.llm_agent import LlmAgent -``` - -**Rationale:** Tests should exercise the same import paths that users will use, -catching issues with the public API. - -## ADK: Local Testing - -### Unit Tests - -**Quick start:** Run all tests with: `bash pytest tests/unittests` - -**Recommended:** Match CI configuration before submitting PRs: `bash uv sync ---extra test && pytest tests/unittests` - -**Additional options:** ```bash - -# Run tests in parallel for faster execution - -pytest tests/unittests -n auto - -# Run a specific test file during development - -pytest tests/unittests/agents/test_llm_agent.py - -``` - -### Testing Philosophy - -**Use real code over mocks:** ADK tests should use real implementations as much -as possible instead of mocking. Only mock external dependencies like network -calls or cloud services. - -**Test interface behavior, not implementation details:** Tests should verify -that the public API behaves correctly, not how it's implemented internally. This -makes tests resilient to refactoring and ensures the contract with users remains -intact. - -**Test Requirements:** - Fast and isolated tests where possible - Use real ADK -components; mock only external dependencies (LLM APIs, cloud services, etc.) - -Focus on testing public interfaces and behavior, not internal implementation - -Descriptive test names that explain what behavior is being tested - High -coverage for new features, edge cases, and error conditions - Location: -`tests/unittests/` following source structure - -## Docstring and comments - -### Comments - Explaining the Why, Not the What - -Philosophy: Well-written code should be largely self-documenting. Comments serve -a different purpose: they should explain the complex algorithms, non-obvious -business logic, or the rationale behind a particular implementation choice—the -things the code cannot express on its own. Avoid comments that merely restate -what the code does (e.g., # increment i above i += 1). - -Style: Comments should be written as complete sentences. Block comments must -begin with a # followed by a single space. - -## Versioning - -ADK adherence to Semantic Versioning 2.0.0 - -Core Principle: The adk-python project strictly adheres to the Semantic -Versioning 2.0.0 specification. All release versions will follow the -MAJOR.MINOR.PATCH format. - -### Breaking Change - -A breaking change is any modification that introduces backward-incompatible -changes to the public API. In the context of the ADK, this means a change that -could force a developer using the framework to alter their existing code to -upgrade to the new version. The public API is not limited to just the Python -function and class signatures; it also encompasses data schemas for stored -information (like evaluation datasets), the command-line interface (CLI), and -the data format used for server communications. - -### Public API Surface Definition - -The "public API" of ADK is a broad contract that extends beyond its Python -function signatures. A breaking change in any of the following areas can disrupt -user workflows and the wider ecosystem of agents and tools built with ADK. The -analysis of the breaking changes introduced in v1.0.0 demonstrates the expansive -nature of this contract. For the purposes of versioning, the ADK Public API -Surface is defined as: - -- All public classes, methods, and functions in the google.adk namespace. - -- The names, required parameters, and expected behavior of all built-in Tools - (e.g., google_search, BuiltInCodeExecutor). - -- The structure and schema of persisted data, including Session data, Memory, - and Evaluation datasets. - -- The JSON request/response format of the ADK API server(FastAPI server) used - by adk web, including field casing conventions. - -- The command-line interface (CLI) commands, arguments, and flags (e.g., adk - deploy). - -- The expected file structure for agent definitions that are loaded by the - framework (e.g., the agent.py convention). - -#### Checklist for Breaking Changes: - -The following changes are considered breaking and necessitate a MAJOR version -bump. - -- API Signature Change: Renaming, removing, or altering the required - parameters of any public class, method, or function (e.g., the removal of - the list_events method from BaseSessionService). - -- Architectural Shift: A fundamental change to a core component's behavior - (e.g., making all service methods async, which requires consumers to use - await). - -- Data Schema Change: A non-additive change to a persisted data schema that - renders old data unreadable or invalid (e.g., the redesign of the - MemoryService and evaluation dataset schemas). - -- Tool Interface Change: Renaming a built-in tool, changing its required - parameters, or altering its fundamental purpose (e.g., replacing - BuiltInCodeExecutionTool with BuiltInCodeExecutor and moving it from the - tools parameter to the code_executor parameter of an Agent). - -- Configuration Change: Altering the required structure of configuration files - or agent definition files that the framework loads (e.g., the simplification - of the agent.py structure for MCPToolset). - -- Wire Format Change: Modifying the data format for API server interactions - (e.g., the switch from snake_case to camelCase for all JSON payloads). - -- Dependency Removal: Removing support for a previously integrated third-party - library or tool type. - -## Commit Message Format (Required) - -**All commits must** follow -[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format. - -**Format:** ``` (): - -[optional body] - -[optional footer] ``` - -**Common types:** `feat`, `fix`, `refactor`, `docs`, `test`, `chore` - -**Examples:** ``` feat(agents): Add support for App pattern with plugins - -fix(sessions): Prevent memory leak in session cleanup - -refactor(tools): Unify environment variable enabled checks ``` - -**Rationale:** Conventional commits enable automated changelog generation and -version management. - -## Key Files and Locations - -Quick reference to important project files: - -- **Main config:** `pyproject.toml` (uses `flit_core` build backend) -- **Dependencies:** `uv.lock` (managed by `uv`) -- **Linting:** `pylintrc` (Google Python Style Guide) -- **Auto-format:** `pre-commit` (runs isort + pyink) -- **Run on all files:** `pre-commit run --all-files` -- **Install as hook:** `pre-commit install` -- **CLI entry point:** `src/google/adk/cli/cli_tools_click.py` -- **Web UI backend:** `src/google/adk/cli/adk_web_server.py` -- **Main exports:** `src/google/adk/__init__.py` (exports Agent, Runner) -- **Examples:** `contributing/samples/` (100+ agent implementations) - -## Additional Resources - -- **Documentation:** https://google.github.io/adk-docs -- **Samples:** https://github.com/google/adk-samples -- **Architecture Details:** `contributing/adk_project_overview_and_architecture.md` -- **Contributing Guide:** `CONTRIBUTING.md` -- **LLM Context:** `llms.txt` (summarized), `llms-full.txt` (comprehensive) - -## Python Tips - -### General Python Best Practices - -* **Constants:** Use immutable global constant collections (tuple, frozenset, immutabledict) to avoid hard-to-find bugs. Prefer constants over wild string/int literals, especially for dictionary keys, pathnames, and enums. -* **Naming:** Name mappings like `value_by_key` to enhance readability in lookups (e.g., `item = item_by_id[id]`). -* **Readability:** Use f-strings for concise string formatting, but use lazy-evaluated `%`-based templates for logging. Use `repr()` or `pprint.pformat()` for human-readable debug messages. Use `_` as a separator in numeric literals to improve readability. -* **Comprehensions:** Use list, set, and dict comprehensions for building collections concisely. -* **Iteration:** Iterate directly over containers without indices. Use `enumerate()` when you need the index, `dict.items()` for keys and values, and `zip()` for parallel iteration. -* **Built-ins:** Leverage built-in functions like `all()`, `any()`, `reversed()`, `sum()`, etc., to write more concise and efficient code. -* **Flattening Lists:** Use `itertools.chain.from_iterable()` to flatten a list of lists efficiently without unnecessary copying. -* **String Methods:** Use `startswith()` and `endswith()` with a tuple of strings to check for multiple prefixes or suffixes at once. -* **Decorators:** Use decorators to add common functionality (like logging, timing, caching) to functions without modifying their core logic. Use `functools.wraps()` to preserve the original function's metadata. -* **Context Managers:** Use `with` statements and context managers (from `contextlib` or custom classes with `__enter__`/`__exit__`) to ensure resources are properly initialized and torn down, even in the presence of exceptions. -* **Else Clauses:** Utilize the `else` clause in `try/except` blocks (runs if no exception), and in `for/while` loops (runs if the loop completes without a `break`) to write more expressive and less error-prone code. -* **Single Assignment:** Prefer single-assignment form (assign to a variable once) over assign-and-mutate to reduce bugs and improve readability. Use conditional expressions where appropriate. -* **Equality vs. Identity:** Use `is` or `is not` for singleton comparisons (e.g., `None`, `True`, `False`). Use `==` for value comparison. -* **Object Comparisons:** When implementing custom classes, be careful with `__eq__`. Return `NotImplemented` for unhandled types. Consider edge cases like subclasses and hashing. Prefer using `attrs` or `dataclasses` to handle this automatically. -* **Hashing:** If objects are equal, their hashes must be equal. Ensure attributes used in `__hash__` are immutable. Disable hashing with `__hash__ = None` if custom `__eq__` is implemented without a proper `__hash__`. -* **`__init__()` vs. `__new__()`:** `__new__()` creates the object, `__init__()` initializes it. For immutable types, modifications must happen in `__new__()`. -* **Default Arguments:** NEVER use mutable default arguments. Use `None` as a sentinel value instead. -* **`__add__()` vs. `__iadd__()`:** `x += y` (in-place add) can modify the object in-place if `__iadd__` is implemented (like for lists), while `x = x + y` creates a new object. This matters when multiple variables reference the same object. -* **Properties:** Use `@property` to create getters and setters only when needed, maintaining a simple attribute access syntax. Avoid properties for computationally expensive operations or those that can fail. -* **Modules for Namespacing:** Use modules as the primary mechanism for grouping and namespacing code elements, not classes. Avoid `@staticmethod` and methods that don't use `self`. -* **Argument Passing:** Python is call-by-value, where the values are object references (pointers). Assignment binds a name to an object. Modifying a mutable object through one name affects all names bound to it. -* **Keyword/Positional Arguments:** Use `*` to force keyword-only arguments and `/` to force positional-only arguments. This can prevent argument transposition errors and make APIs clearer, especially for functions with multiple arguments of the same type. -* **Type Hinting:** Annotate code with types to improve readability, debuggability, and maintainability. Use abstract types from `collections.abc` for container annotations (e.g., `Sequence`, `Mapping`, `Iterable`). Annotate return values, including `None`. Choose the most appropriate abstract type for function arguments and return types. -* **`NewType`:** Use `typing.NewType` to create distinct types from primitives (like `int` or `str`) to prevent argument transposition and improve type safety. -* **`__repr__()` vs. `__str__()`:** Implement `__repr__()` for unambiguous, developer-focused string representations, ideally evaluable. Implement `__str__()` for human-readable output. `__str__()` defaults to `__repr__()`. -* **F-string Debug:** Use `f"{expr=}"` for concise debug printing, showing both the expression and its value. - -### Libraries and Tools - -* **`collections.Counter`:** Use for efficiently counting hashable objects in an iterable. -* **`collections.defaultdict`:** Useful for avoiding key checks when initializing dictionary values, e.g., appending to lists. -* **`heapq`:** Use `heapq.nlargest()` and `heapq.nsmallest()` for efficiently finding the top/bottom N items. Use `heapq.merge()` to merge multiple sorted iterables. -* **`attrs` / `dataclasses`:** Use these libraries to easily define simple classes with boilerplate methods like `__init__`, `__repr__`, `__eq__`, etc., automatically generated. -* **NumPy:** Use NumPy for efficient array computing, element-wise operations, math functions, filtering, and aggregations on numerical data. -* **Pandas:** When constructing DataFrames row by row, append to a list of dicts and call `pd.DataFrame()` once to avoid inefficient copying. Use `TypedDict` or `dataclasses` for intermediate row data. -* **Flags:** Use libraries like `argparse` or `click` for command-line flag parsing. Access flag values in a type-safe manner. -* **Serialization:** For cross-language serialization, consider JSON (built-in), Protocol Buffers, or msgpack. For Python serialization with validation, use `pydantic` for runtime validation and automatic (de)serialization, or `cattrs` for performance-focused (de)serialization with `dataclasses` or `attrs`. -* **Regular Expressions:** Use `re.VERBOSE` to make complex regexes more readable with whitespace and comments. Choose the right method (`re.search`, `re.fullmatch`). Avoid regexes for simple string checks (`in`, `startswith`, `endswith`). Compile regexes used multiple times with `re.compile()`. -* **Caching:** Use `functools.lru_cache` with care. Prefer immutable return types. Be cautious when memoizing methods, as it can lead to memory leaks if the instance is part of the cache key; consider `functools.cached_property`. -* **Pickle:** Avoid using `pickle` due to security risks and compatibility issues. Prefer JSON, Protocol Buffers, or msgpack for serialization. -* **Multiprocessing:** Be aware of potential issues with `multiprocessing` on some platforms, especially concerning `fork`. Consider alternatives like threads (`concurrent.futures.ThreadPoolExecutor`) or `asyncio` for I/O-bound tasks. -* **Debugging:** Use `IPython.embed()` or `pdb.set_trace()` to drop into an interactive shell for debugging. Use visual debuggers if available. Log with context, including inputs and exception info using `logging.exception()` or `exc_info=True`. -* **Property-Based Testing & Fuzzing:** Use `hypothesis` for property-based testing that generates test cases automatically. For coverage-guided fuzzing, consider `atheris` or `python-afl`. - -### Testing - -* **Assertions:** Use pytest's native `assert` statements with informative expressions. Pytest automatically provides detailed failure messages showing the values involved. Add custom messages with `assert condition, "helpful message"` when the expression alone isn't clear. -* **Custom Assertions:** Write reusable helper functions (not methods) for repeated complex checks. Use `pytest.fail("message")` to explicitly fail a test with a custom message. -* **Parameterized Tests:** Use `@pytest.mark.parametrize` to reduce duplication when running the same test logic with different inputs. This is more idiomatic than the `parameterized` library. -* **Fixtures:** Use pytest fixtures (with `@pytest.fixture`) for test setup, teardown, and dependency injection. Fixtures are cleaner than class-based setup methods and can be easily shared across tests. -* **Mocking:** Use `mock.create_autospec()` with `spec_set=True` to create mocks that match the original object's interface, preventing typos and API mismatch issues. Use context managers (`with mock.patch(...)`) to manage mock lifecycles and ensure patches are stopped. Prefer injecting dependencies via fixtures over patching. -* **Asserting Mock Calls:** Use `mock.ANY` and other matchers for partial argument matching when asserting mock calls (e.g., `assert_called_once_with`). -* **Temporary Files:** Use pytest's `tmp_path` and `tmp_path_factory` fixtures for creating isolated and automatically cleaned-up temporary files/directories. These are preferred over the `tempfile` module in pytest tests. -* **Avoid Randomness:** Do not use random number generators to create inputs for unit tests. This leads to flaky, hard-to-debug tests. Instead, use deterministic, easy-to-reason-about inputs that cover specific behaviors. -* **Test Invariants:** Focus tests on the invariant behaviors of public APIs, not implementation details. -* **Test Organization:** Prefer simple test functions over class-based tests unless you need to share fixtures across multiple test methods in a class. Use descriptive test names that explain the behavior being tested. - -### Error Handling - -* **Re-raising Exceptions:** Use a bare `raise` to re-raise the current exception, preserving the original stack trace. Use `raise NewException from original_exception` to chain exceptions, providing context. Use `raise NewException from None` to suppress the original exception's context. -* **Exception Messages:** Always include a descriptive message when raising exceptions. -* **Converting Exceptions to Strings:** `str(e)` can be uninformative. `repr(e)` is often better. For full details including tracebacks and chained exceptions, use functions from the `traceback` module (e.g., `traceback.format_exception(e)`, `traceback.format_exc()`). -* **Terminating Programs:** Use `sys.exit()` for expected terminations. Uncaught non-`SystemExit` exceptions should signal bugs. Avoid functions that cause immediate, unclean exits like `os.abort()`. -* **Returning None:** Be consistent. If a function can return a value, all paths should return a value (use `return None` explicitly). Bare `return` is only for early exit in conceptually void functions (annotated with `-> None`). +The project uses `uv` for package management and Python 3.11+. Please refer to the **`adk-setup`** skill at `.agents/skills/adk-setup/SKILL.md` for detailed instructions. diff --git a/CHANGELOG.md b/CHANGELOG.md index 08799f7a13..e2c89ff486 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## [2.0.0](https://github.com/google/adk-python/compare/v2.0.0b1...v2.0.0) (2026-05-19) + +### ADK 2.0 General Availability + +This release introduces v2.0.0 General Availability (GA) of the Google Agent Development Kit (ADK), establishing production-grade foundations for multi-agent workflows and advanced dynamic agent collaboration. + +### Core Architecture Highlights + +#### Multi-Agent Workflow Engine +* **Flexible Execution Graphs:** Establishes a model-agnostic engine for orchestrating non-linear, conditional, and cyclical agent execution patterns. +* **Intelligent Task Delegation:** Introduces modular workflow abstractions enabling parallel sub-agent workers, nested hierarchical team structures, and resilient dynamic scheduling across complex task execution steps. + +#### Dynamic Agent Collaboration +* **Native Inter-Agent Routing:** Provides seamless orchestration for inter-agent messaging, control state handoffs, and context variable propagation across collaborative multi-agent flows. + ## [1.34.0](https://github.com/google/adk-python/compare/v1.33.0...v1.34.0) (2026-05-18) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 892599930d..577e8f39e4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -133,7 +133,7 @@ part before or alongside your code PR. 1. **Clone the repository:** ```shell - gh repo clone google/adk-python + gh repo clone google/adk-python -- -b v2 cd adk-python ``` @@ -142,80 +142,71 @@ part before or alongside your code PR. Check out [uv installation guide](https://docs.astral.sh/uv/getting-started/installation/). -1. **Create and activate a virtual environment:** +1. **Setup Development Tools:** - **NOTE**: ADK supports Python 3.10+. Python 3.11 and above is strongly - recommended. - - Create a workspace venv using uv. + We use `pre-commit` for code formatting and license enforcement, + `tox` with `tox-uv` for isolated multi-version testing, and + `addlicense` for Apache 2.0 license headers. ```shell - uv venv --python "python3.11" ".venv" + uv tool install pre-commit + uv tool install tox --with tox-uv ``` - Activate the workspace venv. + Optionally, install Google's `addlicense` tool for license header + checks (requires Go): ```shell - source .venv/bin/activate + go install github.com/google/addlicense@latest ``` - **Windows** + If `addlicense` is not installed, the pre-commit hook will be + skipped and CI will catch missing headers. + + Install the git hooks to automatically format and check your code + before committing: ```shell - source .\.venv\Scripts\activate + pre-commit install ``` -1. **Install dependencies:** + The pre-commit hooks run `isort`, `pyink`, `addlicense`, and + `mdformat` automatically on each commit. + +1. **Create virtual environment and install dependencies:** ```shell + uv venv --python "python3.11" ".venv" + source .venv/bin/activate uv sync --all-extras ``` - **NOTE**: for convenience, installing all extra deps as a starting point. +1. **Run unit tests locally (Fast):** -1. **Run unit tests:** + If you just want to run tests quickly while developing, run `pytest`: ```shell pytest ./tests/unittests ``` - NOTE: for accurate repro of test failure, only include `test` as extra - dependencies. - - ```shell - uv sync --extra test - pytest ./tests/unittests - ``` +1. **Run multi-version unit tests (Required before PR):** - **Alternatively**, use the included `unittests.sh` script which handles - environment setup and restoration automatically: + ADK guarantees compatibility across Python versions. You must run the full test suite across all supported versions using `tox`. This will execute tests in pristine, isolated environments. ```shell - ./scripts/unittests.sh + tox ``` - This script will: - - - Set up the test environment with minimal dependencies (`test`, `eval`, `a2a`) - - Run the unit tests - - Restore the full development environment (`--all-extras`) + _(Note: `uv` will automatically download any Python interpreters you are missing!)_ 1. **Auto-format the code:** - We use `pre-commit` to manage code style and formatting (including `isort` and `pyink`). - - To run it manually on all files: + If you installed the git hooks in Step 3, this happens automatically on commit. To run it manually across all files: ```shell pre-commit run --all-files ``` - You can also install it as a git hook to run automatically on every commit: - - ```shell - pre-commit install - ``` - 1. **Build the wheel file:** ```shell @@ -255,8 +246,26 @@ part before or alongside your code PR. [Contributing folder](https://github.com/google/adk-python/tree/main/contributing) has resources that are helpful for contributors. -## Vibe Coding +## AI-Assisted Development + +This repo includes built-in skills for AI coding agents +(Antigravity, Gemini CLI, and others) to help with ADK development: + +- **`setup-dev-env`** — Set up the local development environment: + install dependencies, configure pre-commit hooks, and verify + the setup. + +- **`adk-debug`** — Debug ADK agents: inspect sessions, trace event + flows, check LLM requests/responses, diagnose tool call issues. + Supports both `adk web` (browser UI) and `adk run` (CLI) workflows. + +- **`adk-workflow`** — Build graph-based workflow agents: function + nodes, LLM agent nodes, edge patterns, routing, parallel processing + (fan-out and ParallelWorker), human-in-the-loop, state management, + and best practices. Includes reference docs and tested samples. + +These skills are in `.agents/skills/` and are automatically available +when using compatible AI coding tools in this repo. -If you want to contribute by leveraging vibe coding, the AGENTS.md -(https://github.com/google/adk-python/tree/main/AGENTS.md) could be used as -context to your LLM. +The `AGENTS.md` file provides additional project context that can +be used as LLM input. diff --git a/README.md b/README.md index 99283688cc..4a26756e09 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,49 @@ -# Agent Development Kit (ADK) +# Agent Development Kit (ADK) 2.0 [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) -[![PyPI](https://img.shields.io/pypi/v/google-adk)](https://pypi.org/project/google-adk/) -[![Python Unit Tests](https://github.com/google/adk-python/actions/workflows/python-unit-tests.yml/badge.svg)](https://github.com/google/adk-python/actions/workflows/python-unit-tests.yml) -[![r/agentdevelopmentkit](https://img.shields.io/badge/Reddit-r%2Fagentdevelopmentkit-FF4500?style=flat&logo=reddit&logoColor=white)](https://www.reddit.com/r/agentdevelopmentkit/) -Ask Code Wiki - - -

        - -

        -

        - An open-source, code-first Python framework for building, evaluating, and deploying sophisticated AI agents with flexibility and control. -

        -

        - Important Links: - Docs, - Samples, - Java ADK, - Go ADK & - ADK Web. -

        - - -Agent Development Kit (ADK) is a flexible and modular framework that applies -software development principles to AI agent creation. It is designed to -simplify building, deploying, and orchestrating agent workflows, from simple -tasks to complex systems. While optimized for Gemini, ADK is model-agnostic, -deployment-agnostic, and compatible with other frameworks. -______________________________________________________________________ - -## 🔥 What's new - -- **Custom Service Registration**: Add a service registry to provide a generic way to register custom service implementations to be used in FastAPI server. See [short instruction](https://github.com/google/adk-python/discussions/3175#discussioncomment-14745120). ([391628f](https://github.com/google/adk-python/commit/391628fcdc7b950c6835f64ae3ccab197163c990)) - -- **Rewind**: Add the ability to rewind a session to before a previous invocation ([9dce06f](https://github.com/google/adk-python/commit/9dce06f9b00259ec42241df4f6638955e783a9d1)). - -- **New CodeExecutor**: Introduces a new AgentEngineSandboxCodeExecutor class that supports executing agent-generated code using the Vertex AI Code Execution Sandbox API ([ee39a89](https://github.com/google/adk-python/commit/ee39a891106316b790621795b5cc529e89815a98)) - -## ✨ Key Features +

        + +

        +

        + An open-source, code-first Python framework for building, evaluating, and deploying sophisticated AI agents with flexibility and control. +

        +

        + Important Links: + Docs, + Samples & + ADK Web. +

        -- **Rich Tool Ecosystem**: Utilize pre-built tools, custom functions, - OpenAPI specs, MCP tools or integrate existing tools to give agents diverse - capabilities, all for tight integration with the Google ecosystem. +______________________________________________________________________ -- **Code-First Development**: Define agent logic, tools, and orchestration - directly in Python for ultimate flexibility, testability, and versioning. +> **⚠️ BREAKING CHANGES FROM 1.x** +> +> This release includes breaking changes to the agent API, event model, and +> session schema. **Sessions generated by ADK 2.0 are readable by ADK 1.28+ +> (extra fields will be ignored), but are incompatible with older 1.x versions.** -- **Agent Config**: Build agents without code. Check out the - [Agent Config](https://google.github.io/adk-docs/agents/config/) feature. +______________________________________________________________________ -- **Tool Confirmation**: A [tool confirmation flow(HITL)](https://google.github.io/adk-docs/tools/confirmation/) that can guard tool execution with explicit confirmation and custom input. +## 🔥 What's New in 2.0 -- **Modular Multi-Agent Systems**: Design scalable applications by composing - multiple specialized agents into flexible hierarchies. +- **Workflow Runtime**: A graph-based execution engine for composing + deterministic execution flows for agentic apps, with support for routing, + fan-out/fan-in, loops, retry, state management, dynamic nodes, + human-in-the-loop, and nested workflows. -- **Deploy Anywhere**: Easily containerize and deploy agents on Cloud Run or - scale seamlessly with Vertex AI Agent Engine. +- **Task API**: Structured agent-to-agent delegation with multi-turn task + mode, single-turn controlled output, mixed delegation patterns, + human-in-the-loop, and task agents as workflow nodes. ## 🚀 Installation -### Stable Release (Recommended) - -You can install the latest stable version of ADK using `pip`: - ```bash pip install google-adk ``` +**Requirements:** Python 3.11+. + To install optional integrations, you can use the following command: ```bash @@ -77,111 +52,62 @@ pip install "google-adk[extensions]" The release cadence is roughly bi-weekly. -This version is recommended for most users as it represents the most recent official release. - -### Development Version - -Bug fixes and new features are merged into the main branch on GitHub first. If you need access to changes that haven't been included in an official PyPI release yet, you can install directly from the main branch: - -```bash -pip install git+https://github.com/google/adk-python.git@main -``` - -Note: The development version is built directly from the latest code commits. While it includes the newest fixes and features, it may also contain experimental changes or bugs not present in the stable release. Use it primarily for testing upcoming changes or accessing critical fixes before they are officially released. - -## 🤖 Agent2Agent (A2A) Protocol and ADK Integration - -For remote agent-to-agent communication, ADK integrates with the -[A2A protocol](https://github.com/google-a2a/A2A/). -See this [example](https://github.com/a2aproject/a2a-samples/tree/main/samples/python/agents) -for how they can work together. - -## 📚 Documentation - -Explore the full documentation for detailed guides on building, evaluating, and -deploying agents: - -- **[Documentation](https://google.github.io/adk-docs)** +## Quick Start -## 🏁 Feature Highlight - -### Define a single agent: +### Agent ```python -from google.adk.agents import Agent -from google.adk.tools import google_search +from google.adk import Agent root_agent = Agent( - name="search_assistant", - model="gemini-2.5-flash", # Or your preferred Gemini model - instruction="You are a helpful assistant. Answer user questions using Google Search when needed.", - description="An assistant that can search the web.", - tools=[google_search] + name="greeting_agent", + model="gemini-2.5-flash", + instruction="You are a helpful assistant. Greet the user warmly.", ) ``` -### Define a multi-agent system: - -Define a multi-agent system with coordinator agent, greeter agent, and task execution agent. Then ADK engine and the model will guide the agents to work together to accomplish the task. +### Workflow ```python -from google.adk.agents import LlmAgent, BaseAgent +from google.adk import Agent, Workflow -# Define individual agents -greeter = LlmAgent(name="greeter", model="gemini-2.5-flash", ...) -task_executor = LlmAgent(name="task_executor", model="gemini-2.5-flash", ...) - -# Create parent agent and assign children via sub_agents -coordinator = LlmAgent( - name="Coordinator", - model="gemini-2.5-flash", - description="I coordinate greetings and tasks.", - sub_agents=[ # Assign sub_agents here - greeter, - task_executor - ] +generate_fruit_agent = Agent( + name="generate_fruit_agent", + instruction="Return the name of a random fruit. Return only the name.", ) -``` -### Development UI - -A built-in development UI to help you test, evaluate, debug, and showcase your agent(s). - - - -### Evaluate Agents +generate_benefit_agent = Agent( + name="generate_benefit_agent", + instruction="Tell me a health benefit about the specified fruit.", +) -```bash -adk eval \ - samples_for_testing/hello_world \ - samples_for_testing/hello_world/hello_world_eval_set_001.evalset.json +root_agent = Workflow( + name="root_agent", + edges=[("START", generate_fruit_agent, generate_benefit_agent)], +) ``` -## 🤝 Contributing - -We welcome contributions from the community! Whether it's bug reports, feature requests, documentation improvements, or code contributions, please see our +### Run Locally -- [General contribution guideline and flow](https://google.github.io/adk-docs/contributing-guide/). -- Then if you want to contribute code, please read [Code Contributing Guidelines](./CONTRIBUTING.md) to get started. - -## Community Repo +```bash +# Interactive CLI +adk run path/to/my_agent -We have [adk-python-community repo](https://github.com/google/adk-python-community) that is home to a growing ecosystem of community-contributed tools, third-party -service integrations, and deployment scripts that extend the core capabilities -of the ADK. +# Web UI (supports multi-agent directories or pointing directly to a single agent folder) +adk web path/to/agents_dir +``` -## Vibe Coding +## 📚 Documentation -If you want to develop agent via vibe coding the [llms.txt](./llms.txt) and the [llms-full.txt](./llms-full.txt) can be used as context to LLM. While the former one is a summarized one and the later one has the full information in case your LLM has big enough context window. +- **Getting Started**: https://google.github.io/adk-docs/ +- **Samples**: See `contributing/workflow_samples/` and + `contributing/task_samples/` for workflow and task API examples. -## Community Events +## 🤝 Contributing -- [Completed] ADK's 1st community meeting on Wednesday, October 15, 2025. Remember to [join our group](https://groups.google.com/g/adk-community) to get access to the [recording](https://drive.google.com/file/d/1rpXDq5NSH8-MyMeYI6_5pZ3Lhn0X9BQf/view), and [deck](https://docs.google.com/presentation/d/1_b8LG4xaiadbUUDzyNiapSFyxanc9ZgFdw7JQ6zmZ9Q/edit?slide=id.g384e60cdaca_0_658&resourcekey=0-tjFFv0VBQhpXBPCkZr0NOg#slide=id.g384e60cdaca_0_658). +See [CONTRIBUTING.md](CONTRIBUTING.md) for details. ## 📄 License -This project is licensed under the Apache 2.0 License - see the [LICENSE](LICENSE) file for details. - -______________________________________________________________________ - -*Happy Agent Building!* +This project is licensed under the Apache 2.0 License — see the +[LICENSE](LICENSE) file for details. diff --git a/contributing/adk_project_overview_and_architecture.md b/contributing/adk_project_overview_and_architecture.md index 4a4b3432c6..8c28aff385 100644 --- a/contributing/adk_project_overview_and_architecture.md +++ b/contributing/adk_project_overview_and_architecture.md @@ -79,6 +79,15 @@ async def health_check(): return {"status": "ok"} ``` +### Default Application Resolution (`ADK_DEFAULT_APP_NAME`) + +By default, the ADK API server expects an explicit application context in all requests (e.g., via the `/apps/{app_name}/...` path or in the payload body). + +However, if the environment variable `ADK_DEFAULT_APP_NAME` is set, or if the server is running in **single agent mode** (when pointing directly to a directory containing an agent instead of a directory of agents), the server will automatically resolve and fall back to that agent as the default application whenever a request lacks an explicit app name. In single agent mode, the local agent takes precedence over the `ADK_DEFAULT_APP_NAME` environment variable. + +- **URL Path-Rewriting (Production Endpoints)**: Requests to production endpoints that omit the `/apps/{app_name}` prefix (such as `/users/{user_id}/sessions` or `/app-info`) are automatically rewritten by an internal ASGI middleware to target the default application. (Note: `/dev` and `/builder` endpoints are excluded from rewriting). +- **Agent Execution & Streaming**: Requests to `/run`, `/run_sse`, or `/run_live` that omit the `app_name` parameter in their payload body or query string will automatically resolve to the default application. + ## Deployment to Production The adk cli provides the "adk deploy" command to deploy to Google Vertex Agent Engine, Google CloudRun, Google GKE. diff --git a/contributing/samples/a2a_auth/README.md b/contributing/samples/a2a/a2a_auth/README.md similarity index 100% rename from contributing/samples/a2a_auth/README.md rename to contributing/samples/a2a/a2a_auth/README.md diff --git a/contributing/samples/a2a_auth/__init__.py b/contributing/samples/a2a/a2a_auth/__init__.py similarity index 100% rename from contributing/samples/a2a_auth/__init__.py rename to contributing/samples/a2a/a2a_auth/__init__.py diff --git a/contributing/samples/a2a_auth/agent.py b/contributing/samples/a2a/a2a_auth/agent.py similarity index 95% rename from contributing/samples/a2a_auth/agent.py rename to contributing/samples/a2a/a2a_auth/agent.py index aa6ebbee9d..ef370c6ac8 100644 --- a/contributing/samples/a2a_auth/agent.py +++ b/contributing/samples/a2a/a2a_auth/agent.py @@ -29,7 +29,6 @@ youtube_search_agent = Agent( name="youtube_search_agent", - model="gemini-2.5-flash", # Replace with the actual model name instruction=""" Ask customer to provide singer name, and the number of videos to search. """, @@ -47,7 +46,6 @@ ) root_agent = Agent( - model="gemini-2.5-flash", name="root_agent", instruction=""" You are a helpful assistant that can help search youtube videos, look up BigQuery datasets and tables. diff --git a/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/__init__.py b/contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/__init__.py similarity index 100% rename from contributing/samples/a2a_auth/remote_a2a/bigquery_agent/__init__.py rename to contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/__init__.py diff --git a/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.json b/contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/agent.json similarity index 70% rename from contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.json rename to contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/agent.json index b91fd79660..d071109d6e 100644 --- a/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.json +++ b/contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/agent.json @@ -1,7 +1,11 @@ { "capabilities": {}, - "defaultInputModes": ["text/plain"], - "defaultOutputModes": ["application/json"], + "defaultInputModes": [ + "text/plain" + ], + "defaultOutputModes": [ + "application/json" + ], "description": "A Google BigQuery agent that helps manage users' data on Google BigQuery. Can list, get, and create datasets, as well as manage tables within datasets. Supports OAuth authentication for secure access to BigQuery resources.", "name": "bigquery_agent", "skills": [ @@ -9,19 +13,31 @@ "id": "dataset_management", "name": "Dataset Management", "description": "List, get details, and create BigQuery datasets", - "tags": ["bigquery", "datasets", "google-cloud"] + "tags": [ + "bigquery", + "datasets", + "google-cloud" + ] }, { "id": "table_management", "name": "Table Management", "description": "List, get details, and create BigQuery tables within datasets", - "tags": ["bigquery", "tables", "google-cloud"] + "tags": [ + "bigquery", + "tables", + "google-cloud" + ] }, { "id": "oauth_authentication", "name": "OAuth Authentication", "description": "Secure authentication with Google BigQuery using OAuth", - "tags": ["authentication", "oauth", "security"] + "tags": [ + "authentication", + "oauth", + "security" + ] } ], "url": "http://localhost:8001/a2a/bigquery_agent", diff --git a/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.py b/contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/agent.py similarity index 98% rename from contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.py rename to contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/agent.py index 06fcd213c1..dad89cc55c 100644 --- a/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.py +++ b/contributing/samples/a2a/a2a_auth/remote_a2a/bigquery_agent/agent.py @@ -39,7 +39,6 @@ ) root_agent = Agent( - model="gemini-2.5-flash", name="bigquery_agent", instruction=""" You are a helpful Google BigQuery agent that help to manage users' data on Google BigQuery. diff --git a/contributing/samples/a2a_basic/README.md b/contributing/samples/a2a/a2a_basic/README.md similarity index 100% rename from contributing/samples/a2a_basic/README.md rename to contributing/samples/a2a/a2a_basic/README.md diff --git a/contributing/samples/a2a_basic/__init__.py b/contributing/samples/a2a/a2a_basic/__init__.py similarity index 100% rename from contributing/samples/a2a_basic/__init__.py rename to contributing/samples/a2a/a2a_basic/__init__.py diff --git a/contributing/samples/a2a_basic/agent.py b/contributing/samples/a2a/a2a_basic/agent.py similarity index 99% rename from contributing/samples/a2a_basic/agent.py rename to contributing/samples/a2a/a2a_basic/agent.py index 00301cd1f6..7728c9ed74 100755 --- a/contributing/samples/a2a_basic/agent.py +++ b/contributing/samples/a2a/a2a_basic/agent.py @@ -94,7 +94,6 @@ def roll_die(sides: int) -> int: root_agent = Agent( - model="gemini-2.5-flash", name="root_agent", instruction=""" You are a helpful assistant that can roll dice and check if numbers are prime. diff --git a/contributing/samples/a2a_basic/remote_a2a/check_prime_agent/__init__.py b/contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/__init__.py similarity index 100% rename from contributing/samples/a2a_basic/remote_a2a/check_prime_agent/__init__.py rename to contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/__init__.py diff --git a/contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.json b/contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/agent.json similarity index 70% rename from contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.json rename to contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/agent.json index e625bc3435..8071f50985 100644 --- a/contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.json +++ b/contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/agent.json @@ -1,7 +1,11 @@ { "capabilities": {}, - "defaultInputModes": ["text/plain"], - "defaultOutputModes": ["application/json"], + "defaultInputModes": [ + "text/plain" + ], + "defaultOutputModes": [ + "application/json" + ], "description": "An agent specialized in checking whether numbers are prime. It can efficiently determine the primality of individual numbers or lists of numbers.", "name": "check_prime_agent", "skills": [ @@ -9,7 +13,12 @@ "id": "prime_checking", "name": "Prime Number Checking", "description": "Check if numbers in a list are prime using efficient mathematical algorithms", - "tags": ["mathematical", "computation", "prime", "numbers"] + "tags": [ + "mathematical", + "computation", + "prime", + "numbers" + ] } ], "url": "http://localhost:8001/a2a/check_prime_agent", diff --git a/contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.py b/contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/agent.py similarity index 98% rename from contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.py rename to contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/agent.py index 424f39e1f4..a2b9e4427c 100755 --- a/contributing/samples/a2a_basic/remote_a2a/check_prime_agent/agent.py +++ b/contributing/samples/a2a/a2a_basic/remote_a2a/check_prime_agent/agent.py @@ -48,7 +48,6 @@ async def check_prime(nums: list[int]) -> str: root_agent = Agent( - model='gemini-2.5-flash', name='check_prime_agent', description='check prime agent that can check whether numbers are prime.', instruction=""" diff --git a/contributing/samples/a2a_human_in_loop/README.md b/contributing/samples/a2a/a2a_human_in_loop/README.md similarity index 100% rename from contributing/samples/a2a_human_in_loop/README.md rename to contributing/samples/a2a/a2a_human_in_loop/README.md diff --git a/contributing/samples/a2a_human_in_loop/__init__.py b/contributing/samples/a2a/a2a_human_in_loop/__init__.py similarity index 100% rename from contributing/samples/a2a_human_in_loop/__init__.py rename to contributing/samples/a2a/a2a_human_in_loop/__init__.py diff --git a/contributing/samples/a2a_human_in_loop/agent.py b/contributing/samples/a2a/a2a_human_in_loop/agent.py similarity index 98% rename from contributing/samples/a2a_human_in_loop/agent.py rename to contributing/samples/a2a/a2a_human_in_loop/agent.py index 07ff3ae9ad..667de8d94f 100644 --- a/contributing/samples/a2a_human_in_loop/agent.py +++ b/contributing/samples/a2a/a2a_human_in_loop/agent.py @@ -36,7 +36,6 @@ def reimburse(purpose: str, amount: float) -> str: root_agent = Agent( - model='gemini-2.5-flash', name='reimbursement_agent', instruction=""" You are an agent whose job is to handle the reimbursement process for diff --git a/contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/__init__.py b/contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/__init__.py similarity index 100% rename from contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/__init__.py rename to contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/__init__.py diff --git a/contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json b/contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json similarity index 71% rename from contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json rename to contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json index c0b850cb52..a3beb619d3 100644 --- a/contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json +++ b/contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/agent.json @@ -1,7 +1,11 @@ { "capabilities": {}, - "defaultInputModes": ["text/plain"], - "defaultOutputModes": ["application/json"], + "defaultInputModes": [ + "text/plain" + ], + "defaultOutputModes": [ + "application/json" + ], "description": "A reimbursement agent that handles employee expense reimbursement requests. Automatically approves amounts under $100 and requires manager approval for larger amounts using long-running tools for human-in-the-loop workflows.", "name": "reimbursement_agent", "skills": [ @@ -9,19 +13,31 @@ "id": "automatic_reimbursement", "name": "Automatic Reimbursement", "description": "Automatically process and approve reimbursements under $100", - "tags": ["reimbursement", "automation", "finance"] + "tags": [ + "reimbursement", + "automation", + "finance" + ] }, { "id": "approval_workflow", "name": "Approval Workflow", "description": "Request manager approval for reimbursements over $100 using long-running tools", - "tags": ["approval", "workflow", "human-in-loop"] + "tags": [ + "approval", + "workflow", + "human-in-loop" + ] }, { "id": "expense_processing", "name": "Expense Processing", "description": "Process employee expense claims and handle reimbursement logic", - "tags": ["expenses", "processing", "employee-services"] + "tags": [ + "expenses", + "processing", + "employee-services" + ] } ], "url": "http://localhost:8001/a2a/human_in_loop", diff --git a/contributing/samples/human_in_loop/agent.py b/contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py similarity index 98% rename from contributing/samples/human_in_loop/agent.py rename to contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py index 3ea740b7a1..89a4282f6e 100644 --- a/contributing/samples/human_in_loop/agent.py +++ b/contributing/samples/a2a/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py @@ -39,7 +39,6 @@ def ask_for_approval( root_agent = Agent( - model='gemini-2.5-flash', name='reimbursement_agent', instruction=""" You are an agent whose job is to handle the reimbursement process for diff --git a/contributing/samples/a2a_root/README.md b/contributing/samples/a2a/a2a_root/README.md similarity index 100% rename from contributing/samples/a2a_root/README.md rename to contributing/samples/a2a/a2a_root/README.md diff --git a/contributing/samples/a2a_root/agent.py b/contributing/samples/a2a/a2a_root/agent.py similarity index 100% rename from contributing/samples/a2a_root/agent.py rename to contributing/samples/a2a/a2a_root/agent.py diff --git a/contributing/samples/a2a_root/remote_a2a/hello_world/__init__.py b/contributing/samples/a2a/a2a_root/remote_a2a/hello_world/__init__.py similarity index 100% rename from contributing/samples/a2a_root/remote_a2a/hello_world/__init__.py rename to contributing/samples/a2a/a2a_root/remote_a2a/hello_world/__init__.py diff --git a/contributing/samples/a2a_root/remote_a2a/hello_world/agent.py b/contributing/samples/a2a/a2a_root/remote_a2a/hello_world/agent.py similarity index 99% rename from contributing/samples/a2a_root/remote_a2a/hello_world/agent.py rename to contributing/samples/a2a/a2a_root/remote_a2a/hello_world/agent.py index ec4ddd8983..8abf4ddc1a 100755 --- a/contributing/samples/a2a_root/remote_a2a/hello_world/agent.py +++ b/contributing/samples/a2a/a2a_root/remote_a2a/hello_world/agent.py @@ -26,6 +26,7 @@ def roll_die(sides: int, tool_context: ToolContext) -> int: Args: sides: The integer number of sides the die has. tool_context: the tool context + Returns: An integer of the result of rolling the die. """ @@ -66,7 +67,6 @@ async def check_prime(nums: list[int]) -> str: root_agent = Agent( - model='gemini-2.5-flash', name='hello_world_agent', description=( 'hello world agent that can roll a dice of 8 sides and check prime' diff --git a/contributing/samples/adk_answering_agent/README.md b/contributing/samples/adk_team/adk_answering_agent/README.md similarity index 100% rename from contributing/samples/adk_answering_agent/README.md rename to contributing/samples/adk_team/adk_answering_agent/README.md diff --git a/contributing/samples/adk_answering_agent/__init__.py b/contributing/samples/adk_team/adk_answering_agent/__init__.py similarity index 100% rename from contributing/samples/adk_answering_agent/__init__.py rename to contributing/samples/adk_team/adk_answering_agent/__init__.py diff --git a/contributing/samples/adk_answering_agent/agent.py b/contributing/samples/adk_team/adk_answering_agent/agent.py similarity index 99% rename from contributing/samples/adk_answering_agent/agent.py rename to contributing/samples/adk_team/adk_answering_agent/agent.py index ff82e5029a..04ef4c69df 100644 --- a/contributing/samples/adk_answering_agent/agent.py +++ b/contributing/samples/adk_team/adk_answering_agent/agent.py @@ -38,7 +38,7 @@ root_agent = Agent( - model="gemini-2.5-pro", + model="gemini-3.5-flash", name="adk_answering_agent", description="Answer questions about ADK repo.", instruction=f""" diff --git a/contributing/samples/adk_answering_agent/gemini_assistant/__init__.py b/contributing/samples/adk_team/adk_answering_agent/gemini_assistant/__init__.py similarity index 100% rename from contributing/samples/adk_answering_agent/gemini_assistant/__init__.py rename to contributing/samples/adk_team/adk_answering_agent/gemini_assistant/__init__.py diff --git a/contributing/samples/adk_answering_agent/gemini_assistant/agent.py b/contributing/samples/adk_team/adk_answering_agent/gemini_assistant/agent.py similarity index 99% rename from contributing/samples/adk_answering_agent/gemini_assistant/agent.py rename to contributing/samples/adk_team/adk_answering_agent/gemini_assistant/agent.py index 812a78174f..d93fa1d2aa 100644 --- a/contributing/samples/adk_answering_agent/gemini_assistant/agent.py +++ b/contributing/samples/adk_team/adk_answering_agent/gemini_assistant/agent.py @@ -72,7 +72,7 @@ def search_gemini_api_docs(queries: List[str]) -> Dict[str, Any]: root_agent = Agent( - model="gemini-2.5-pro", + model="gemini-3.5-flash", name="gemini_assistant", description="Answer questions about Gemini API.", instruction=""" diff --git a/contributing/samples/adk_answering_agent/main.py b/contributing/samples/adk_team/adk_answering_agent/main.py similarity index 100% rename from contributing/samples/adk_answering_agent/main.py rename to contributing/samples/adk_team/adk_answering_agent/main.py diff --git a/contributing/samples/adk_answering_agent/settings.py b/contributing/samples/adk_team/adk_answering_agent/settings.py similarity index 100% rename from contributing/samples/adk_answering_agent/settings.py rename to contributing/samples/adk_team/adk_answering_agent/settings.py diff --git a/contributing/samples/adk_answering_agent/tools.py b/contributing/samples/adk_team/adk_answering_agent/tools.py similarity index 100% rename from contributing/samples/adk_answering_agent/tools.py rename to contributing/samples/adk_team/adk_answering_agent/tools.py diff --git a/contributing/samples/adk_answering_agent/upload_docs_to_vertex_ai_search.py b/contributing/samples/adk_team/adk_answering_agent/upload_docs_to_vertex_ai_search.py similarity index 100% rename from contributing/samples/adk_answering_agent/upload_docs_to_vertex_ai_search.py rename to contributing/samples/adk_team/adk_answering_agent/upload_docs_to_vertex_ai_search.py diff --git a/contributing/samples/adk_answering_agent/utils.py b/contributing/samples/adk_team/adk_answering_agent/utils.py similarity index 100% rename from contributing/samples/adk_answering_agent/utils.py rename to contributing/samples/adk_team/adk_answering_agent/utils.py diff --git a/contributing/samples/adk_documentation/__init__.py b/contributing/samples/adk_team/adk_documentation/__init__.py similarity index 100% rename from contributing/samples/adk_documentation/__init__.py rename to contributing/samples/adk_team/adk_documentation/__init__.py diff --git a/contributing/samples/adk_documentation/adk_docs_updater/__init__.py b/contributing/samples/adk_team/adk_documentation/adk_docs_updater/__init__.py similarity index 100% rename from contributing/samples/adk_documentation/adk_docs_updater/__init__.py rename to contributing/samples/adk_team/adk_documentation/adk_docs_updater/__init__.py diff --git a/contributing/samples/adk_documentation/adk_docs_updater/agent.py b/contributing/samples/adk_team/adk_documentation/adk_docs_updater/agent.py similarity index 99% rename from contributing/samples/adk_documentation/adk_docs_updater/agent.py rename to contributing/samples/adk_team/adk_documentation/adk_docs_updater/agent.py index 4b3cac0794..fc441b8457 100644 --- a/contributing/samples/adk_documentation/adk_docs_updater/agent.py +++ b/contributing/samples/adk_team/adk_documentation/adk_docs_updater/agent.py @@ -46,7 +46,7 @@ ) root_agent = Agent( - model="gemini-2.5-pro", + model="gemini-3.5-flash", name="adk_docs_updater", description=( "Update the ADK docs based on the code in the ADK Python codebase" diff --git a/contributing/samples/adk_documentation/adk_docs_updater/main.py b/contributing/samples/adk_team/adk_documentation/adk_docs_updater/main.py similarity index 100% rename from contributing/samples/adk_documentation/adk_docs_updater/main.py rename to contributing/samples/adk_team/adk_documentation/adk_docs_updater/main.py diff --git a/contributing/samples/adk_documentation/adk_release_analyzer/README.md b/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/README.md similarity index 100% rename from contributing/samples/adk_documentation/adk_release_analyzer/README.md rename to contributing/samples/adk_team/adk_documentation/adk_release_analyzer/README.md diff --git a/contributing/samples/adk_documentation/adk_release_analyzer/__init__.py b/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/__init__.py similarity index 100% rename from contributing/samples/adk_documentation/adk_release_analyzer/__init__.py rename to contributing/samples/adk_team/adk_documentation/adk_release_analyzer/__init__.py diff --git a/contributing/samples/adk_documentation/adk_release_analyzer/agent.py b/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/agent.py similarity index 97% rename from contributing/samples/adk_documentation/adk_release_analyzer/agent.py rename to contributing/samples/adk_team/adk_documentation/adk_release_analyzer/agent.py index 2a72d2840a..76ed5ad6cb 100644 --- a/contributing/samples/adk_documentation/adk_release_analyzer/agent.py +++ b/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/agent.py @@ -149,13 +149,11 @@ def save_group_recommendations( Args: tool_context: The tool context providing access to state. group_index: The index of the group these recommendations belong to. - recommendations: List of recommendation dicts with keys: - - summary: Brief summary of the change - - doc_file: Path to the doc file to update - - current_state: Current content in the doc - - proposed_change: What should be changed - - reasoning: Why this change is needed - - reference: Reference to the code file + recommendations: List of recommendation dicts with keys: - summary: Brief + summary of the change - doc_file: Path to the doc file to update - + current_state: Current content in the doc - proposed_change: What should + be changed - reasoning: Why this change is needed - reference: + Reference to the code file Returns: A dictionary confirming the save operation. @@ -227,12 +225,12 @@ def save_release_info( start_tag: The starting release tag. end_tag: The ending release tag. compare_url: The GitHub compare URL. - file_groups: List of file groups, where each group is a list of file - info dicts. + file_groups: List of file groups, where each group is a list of file info + dicts. release_summary: A high-level summary of all changes in this release, - including the main themes (e.g., "new feature X", "refactoring Y", - "bug fixes in Z"). This helps individual analyzers understand the - bigger picture. + including the main themes (e.g., "new feature X", "refactoring Y", "bug + fixes in Z"). This helps individual analyzers understand the bigger + picture. all_changed_files: List of all changed file paths (for cross-reference). Returns: diff --git a/contributing/samples/adk_documentation/adk_release_analyzer/main.py b/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/main.py similarity index 100% rename from contributing/samples/adk_documentation/adk_release_analyzer/main.py rename to contributing/samples/adk_team/adk_documentation/adk_release_analyzer/main.py diff --git a/contributing/samples/adk_documentation/settings.py b/contributing/samples/adk_team/adk_documentation/settings.py similarity index 100% rename from contributing/samples/adk_documentation/settings.py rename to contributing/samples/adk_team/adk_documentation/settings.py diff --git a/contributing/samples/adk_documentation/tools.py b/contributing/samples/adk_team/adk_documentation/tools.py similarity index 99% rename from contributing/samples/adk_documentation/tools.py rename to contributing/samples/adk_team/adk_documentation/tools.py index 723148ec30..7688b387dd 100644 --- a/contributing/samples/adk_documentation/tools.py +++ b/contributing/samples/adk_team/adk_documentation/tools.py @@ -624,12 +624,12 @@ def get_changed_files_summary( repo_name: The name of the repository. start_tag: The older tag (base) for the comparison. end_tag: The newer tag (head) for the comparison. - local_repo_path: Optional absolute path to local git repo. If provided - and valid, uses git diff instead of GitHub API to get complete - file list (avoids 300-file limit). - path_filter: Optional path prefix to filter files. Only files whose - path starts with this prefix will be included. Example: - "src/google/adk/" to only include ADK source files. + local_repo_path: Optional absolute path to local git repo. If provided and + valid, uses git diff instead of GitHub API to get complete file list + (avoids 300-file limit). + path_filter: Optional path prefix to filter files. Only files whose path + starts with this prefix will be included. Example: "src/google/adk/" to + only include ADK source files. Returns: A dictionary containing the status and a summary of changed files. diff --git a/contributing/samples/adk_documentation/utils.py b/contributing/samples/adk_team/adk_documentation/utils.py similarity index 100% rename from contributing/samples/adk_documentation/utils.py rename to contributing/samples/adk_team/adk_documentation/utils.py diff --git a/contributing/samples/adk_issue_formatting_agent/__init__.py b/contributing/samples/adk_team/adk_issue_formatting_agent/__init__.py similarity index 100% rename from contributing/samples/adk_issue_formatting_agent/__init__.py rename to contributing/samples/adk_team/adk_issue_formatting_agent/__init__.py diff --git a/contributing/samples/adk_issue_formatting_agent/agent.py b/contributing/samples/adk_team/adk_issue_formatting_agent/agent.py similarity index 99% rename from contributing/samples/adk_issue_formatting_agent/agent.py rename to contributing/samples/adk_team/adk_issue_formatting_agent/agent.py index ae906f3993..3c29bd1267 100644 --- a/contributing/samples/adk_issue_formatting_agent/agent.py +++ b/contributing/samples/adk_team/adk_issue_formatting_agent/agent.py @@ -132,7 +132,7 @@ def list_comments_on_issue(issue_number: int) -> dict[str, any]: root_agent = Agent( - model="gemini-2.5-pro", + model="gemini-3.5-flash", name="adk_issue_formatting_assistant", description="Check ADK issue format and content.", instruction=f""" diff --git a/contributing/samples/adk_issue_formatting_agent/settings.py b/contributing/samples/adk_team/adk_issue_formatting_agent/settings.py similarity index 100% rename from contributing/samples/adk_issue_formatting_agent/settings.py rename to contributing/samples/adk_team/adk_issue_formatting_agent/settings.py diff --git a/contributing/samples/adk_issue_formatting_agent/utils.py b/contributing/samples/adk_team/adk_issue_formatting_agent/utils.py similarity index 100% rename from contributing/samples/adk_issue_formatting_agent/utils.py rename to contributing/samples/adk_team/adk_issue_formatting_agent/utils.py diff --git a/contributing/samples/adk_issue_monitoring_agent/PROMPT_INSTRUCTION.txt b/contributing/samples/adk_team/adk_issue_monitoring_agent/PROMPT_INSTRUCTION.txt similarity index 100% rename from contributing/samples/adk_issue_monitoring_agent/PROMPT_INSTRUCTION.txt rename to contributing/samples/adk_team/adk_issue_monitoring_agent/PROMPT_INSTRUCTION.txt diff --git a/contributing/samples/adk_issue_monitoring_agent/README.md b/contributing/samples/adk_team/adk_issue_monitoring_agent/README.md similarity index 100% rename from contributing/samples/adk_issue_monitoring_agent/README.md rename to contributing/samples/adk_team/adk_issue_monitoring_agent/README.md diff --git a/contributing/samples/adk_issue_monitoring_agent/__init__.py b/contributing/samples/adk_team/adk_issue_monitoring_agent/__init__.py similarity index 100% rename from contributing/samples/adk_issue_monitoring_agent/__init__.py rename to contributing/samples/adk_team/adk_issue_monitoring_agent/__init__.py diff --git a/contributing/samples/adk_issue_monitoring_agent/agent.py b/contributing/samples/adk_team/adk_issue_monitoring_agent/agent.py similarity index 97% rename from contributing/samples/adk_issue_monitoring_agent/agent.py rename to contributing/samples/adk_team/adk_issue_monitoring_agent/agent.py index b30bce3d36..ec2e31bdf1 100644 --- a/contributing/samples/adk_issue_monitoring_agent/agent.py +++ b/contributing/samples/adk_team/adk_issue_monitoring_agent/agent.py @@ -46,8 +46,8 @@ def load_prompt_template(filename: str) -> str: def flag_issue_as_spam( item_number: int, detection_reason: str ) -> dict[str, Any]: - """ - Flags an issue as spam by adding a label and leaving a comment for maintainers. + """Flags an issue as spam by adding a label and leaving a comment for maintainers. + Includes idempotency checks to avoid duplicate POST actions. Args: diff --git a/contributing/samples/adk_issue_monitoring_agent/main.py b/contributing/samples/adk_team/adk_issue_monitoring_agent/main.py similarity index 100% rename from contributing/samples/adk_issue_monitoring_agent/main.py rename to contributing/samples/adk_team/adk_issue_monitoring_agent/main.py diff --git a/contributing/samples/adk_issue_monitoring_agent/settings.py b/contributing/samples/adk_team/adk_issue_monitoring_agent/settings.py similarity index 100% rename from contributing/samples/adk_issue_monitoring_agent/settings.py rename to contributing/samples/adk_team/adk_issue_monitoring_agent/settings.py diff --git a/contributing/samples/adk_issue_monitoring_agent/utils.py b/contributing/samples/adk_team/adk_issue_monitoring_agent/utils.py similarity index 96% rename from contributing/samples/adk_issue_monitoring_agent/utils.py rename to contributing/samples/adk_team/adk_issue_monitoring_agent/utils.py index a2c8b70d0b..c620e94e70 100644 --- a/contributing/samples/adk_issue_monitoring_agent/utils.py +++ b/contributing/samples/adk_team/adk_issue_monitoring_agent/utils.py @@ -112,10 +112,10 @@ def get_issue_comments( def get_target_issues(owner: str, repo: str) -> list[int]: - """ - Fetches issues. - If INITIAL_FULL_SCAN is True, fetches ALL open issues. - If False, fetches only issues updated in the last 24 hours using the 'since' parameter. + """Fetches issues. + + If INITIAL_FULL_SCAN is True, fetches ALL open issues. If False, fetches only + issues updated in the last 24 hours using the 'since' parameter. """ from datetime import datetime from datetime import timedelta diff --git a/contributing/samples/adk_knowledge_agent/README.md b/contributing/samples/adk_team/adk_knowledge_agent/README.md similarity index 100% rename from contributing/samples/adk_knowledge_agent/README.md rename to contributing/samples/adk_team/adk_knowledge_agent/README.md diff --git a/contributing/samples/adk_knowledge_agent/__init__.py b/contributing/samples/adk_team/adk_knowledge_agent/__init__.py similarity index 100% rename from contributing/samples/adk_knowledge_agent/__init__.py rename to contributing/samples/adk_team/adk_knowledge_agent/__init__.py diff --git a/contributing/samples/adk_knowledge_agent/agent.json b/contributing/samples/adk_team/adk_knowledge_agent/agent.json similarity index 68% rename from contributing/samples/adk_knowledge_agent/agent.json rename to contributing/samples/adk_team/adk_knowledge_agent/agent.json index 9002ba82e2..972adf18d9 100644 --- a/contributing/samples/adk_knowledge_agent/agent.json +++ b/contributing/samples/adk_team/adk_knowledge_agent/agent.json @@ -1,7 +1,11 @@ { "capabilities": {}, - "defaultInputModes": ["text/plain"], - "defaultOutputModes": ["application/json"], + "defaultInputModes": [ + "text/plain" + ], + "defaultOutputModes": [ + "application/json" + ], "description": "Agent for performing Vertex AI Search to find ADK knowledge and documentation", "name": "adk_knowledge_agent", "skills": [ @@ -9,7 +13,13 @@ "id": "adk_knowledge_search", "name": "ADK Knowledge Search", "description": "Searches for ADK examples and documentation using the Vertex AI Search tool", - "tags": ["search", "documentation", "knowledge base", "Vertex AI", "ADK"] + "tags": [ + "search", + "documentation", + "knowledge base", + "Vertex AI", + "ADK" + ] } ], "url": "https://adk-agent-builder-knowledge-service-654646711756.us-central1.run.app/a2a/adk_knowledge_agent", diff --git a/contributing/samples/adk_knowledge_agent/agent.py b/contributing/samples/adk_team/adk_knowledge_agent/agent.py similarity index 98% rename from contributing/samples/adk_knowledge_agent/agent.py rename to contributing/samples/adk_team/adk_knowledge_agent/agent.py index 9ac23dc1f1..7effb777c3 100644 --- a/contributing/samples/adk_knowledge_agent/agent.py +++ b/contributing/samples/adk_team/adk_knowledge_agent/agent.py @@ -68,7 +68,6 @@ def citation_retrieval_after_model_callback( You can use the VertexAiSearchTool to search for ADK examples and documentation in the document store. """, - model="gemini-2.5-flash", tools=[VertexAiSearchTool(data_store_id=VERTEXAI_DATASTORE_ID)], after_model_callback=citation_retrieval_after_model_callback, ) diff --git a/contributing/samples/adk_knowledge_agent/requirements.txt b/contributing/samples/adk_team/adk_knowledge_agent/requirements.txt similarity index 100% rename from contributing/samples/adk_knowledge_agent/requirements.txt rename to contributing/samples/adk_team/adk_knowledge_agent/requirements.txt diff --git a/contributing/samples/adk_pr_agent/__init__.py b/contributing/samples/adk_team/adk_pr_agent/__init__.py similarity index 100% rename from contributing/samples/adk_pr_agent/__init__.py rename to contributing/samples/adk_team/adk_pr_agent/__init__.py diff --git a/contributing/samples/adk_pr_agent/agent.py b/contributing/samples/adk_team/adk_pr_agent/agent.py similarity index 99% rename from contributing/samples/adk_pr_agent/agent.py rename to contributing/samples/adk_team/adk_pr_agent/agent.py index 76e54c9fc0..e416a013a9 100644 --- a/contributing/samples/adk_pr_agent/agent.py +++ b/contributing/samples/adk_team/adk_pr_agent/agent.py @@ -143,7 +143,6 @@ def get_github_pr_info_http(pr_number: int) -> str | None: """ root_agent = Agent( - model="gemini-2.5-flash", name="github_pr_agent", description="Generate pull request descriptions for ADK.", instruction=system_prompt, diff --git a/contributing/samples/adk_pr_agent/main.py b/contributing/samples/adk_team/adk_pr_agent/main.py similarity index 100% rename from contributing/samples/adk_pr_agent/main.py rename to contributing/samples/adk_team/adk_pr_agent/main.py diff --git a/contributing/samples/adk_pr_triaging_agent/README.md b/contributing/samples/adk_team/adk_pr_triaging_agent/README.md similarity index 100% rename from contributing/samples/adk_pr_triaging_agent/README.md rename to contributing/samples/adk_team/adk_pr_triaging_agent/README.md diff --git a/contributing/samples/adk_pr_triaging_agent/__init__.py b/contributing/samples/adk_team/adk_pr_triaging_agent/__init__.py similarity index 100% rename from contributing/samples/adk_pr_triaging_agent/__init__.py rename to contributing/samples/adk_team/adk_pr_triaging_agent/__init__.py diff --git a/contributing/samples/adk_pr_triaging_agent/agent.py b/contributing/samples/adk_team/adk_pr_triaging_agent/agent.py similarity index 99% rename from contributing/samples/adk_pr_triaging_agent/agent.py rename to contributing/samples/adk_team/adk_pr_triaging_agent/agent.py index 7f849fe358..8e70cc4a0c 100644 --- a/contributing/samples/adk_pr_triaging_agent/agent.py +++ b/contributing/samples/adk_team/adk_pr_triaging_agent/agent.py @@ -41,7 +41,7 @@ ] CONTRIBUTING_MD = read_file( - Path(__file__).resolve().parents[3] / "CONTRIBUTING.md" + Path(__file__).resolve().parents[4] / "CONTRIBUTING.md" ) APPROVAL_INSTRUCTION = ( @@ -220,7 +220,7 @@ def add_comment_to_pr(pr_number: int, comment: str) -> dict[str, Any]: root_agent = Agent( - model="gemini-2.5-pro", + model="gemini-3.5-flash", name="adk_pr_triaging_assistant", description="Triage ADK pull requests.", instruction=f""" diff --git a/contributing/samples/adk_pr_triaging_agent/main.py b/contributing/samples/adk_team/adk_pr_triaging_agent/main.py similarity index 100% rename from contributing/samples/adk_pr_triaging_agent/main.py rename to contributing/samples/adk_team/adk_pr_triaging_agent/main.py diff --git a/contributing/samples/adk_pr_triaging_agent/settings.py b/contributing/samples/adk_team/adk_pr_triaging_agent/settings.py similarity index 100% rename from contributing/samples/adk_pr_triaging_agent/settings.py rename to contributing/samples/adk_team/adk_pr_triaging_agent/settings.py diff --git a/contributing/samples/adk_pr_triaging_agent/utils.py b/contributing/samples/adk_team/adk_pr_triaging_agent/utils.py similarity index 100% rename from contributing/samples/adk_pr_triaging_agent/utils.py rename to contributing/samples/adk_team/adk_pr_triaging_agent/utils.py diff --git a/contributing/samples/adk_stale_agent/PROMPT_INSTRUCTION.txt b/contributing/samples/adk_team/adk_stale_agent/PROMPT_INSTRUCTION.txt similarity index 100% rename from contributing/samples/adk_stale_agent/PROMPT_INSTRUCTION.txt rename to contributing/samples/adk_team/adk_stale_agent/PROMPT_INSTRUCTION.txt diff --git a/contributing/samples/adk_stale_agent/README.md b/contributing/samples/adk_team/adk_stale_agent/README.md similarity index 100% rename from contributing/samples/adk_stale_agent/README.md rename to contributing/samples/adk_team/adk_stale_agent/README.md diff --git a/contributing/samples/adk_stale_agent/__init__.py b/contributing/samples/adk_team/adk_stale_agent/__init__.py similarity index 100% rename from contributing/samples/adk_stale_agent/__init__.py rename to contributing/samples/adk_team/adk_stale_agent/__init__.py diff --git a/contributing/samples/adk_stale_agent/agent.py b/contributing/samples/adk_team/adk_stale_agent/agent.py similarity index 95% rename from contributing/samples/adk_stale_agent/agent.py rename to contributing/samples/adk_team/adk_stale_agent/agent.py index 5e252aabf7..a098dd0124 100644 --- a/contributing/samples/adk_stale_agent/agent.py +++ b/contributing/samples/adk_team/adk_stale_agent/agent.py @@ -56,15 +56,15 @@ def _get_cached_maintainers() -> List[str]: - """ - Fetches the list of repository maintainers. + """Fetches the list of repository maintainers. This function relies on `utils.get_request` for network resilience. `get_request` is configured with an HTTPAdapter that automatically performs exponential backoff retries (up to 6 times) for 5xx errors and rate limits. If the retries are exhausted or the data format is invalid, this function - raises a RuntimeError to prevent the bot from running with incorrect permissions. + raises a RuntimeError to prevent the bot from running with incorrect + permissions. Returns: List[str]: A list of GitHub usernames with push access. @@ -104,8 +104,7 @@ def _get_cached_maintainers() -> List[str]: def load_prompt_template(filename: str) -> str: - """ - Loads the raw text content of a prompt file. + """Loads the raw text content of a prompt file. Args: filename (str): The name of the file (e.g., 'PROMPT_INSTRUCTION.txt'). @@ -122,8 +121,8 @@ def load_prompt_template(filename: str) -> str: def _fetch_graphql_data(item_number: int) -> Dict[str, Any]: - """ - Executes the GraphQL query to fetch raw issue data, including comments, + """Executes the GraphQL query to fetch raw issue data, including comments, + edits, and timeline events. Args: @@ -133,7 +132,8 @@ def _fetch_graphql_data(item_number: int) -> Dict[str, Any]: Dict[str, Any]: The raw 'issue' object from the GraphQL response. Raises: - RequestException: If the GraphQL query returns errors or the issue is not found. + RequestException: If the GraphQL query returns errors or the issue is not + found. """ query = """ query($owner: String!, $name: String!, $number: Int!, $commentLimit: Int!, $timelineLimit: Int!, $editLimit: Int!) { @@ -208,8 +208,8 @@ def _fetch_graphql_data(item_number: int) -> Dict[str, Any]: def _build_history_timeline( data: Dict[str, Any], ) -> Tuple[List[Dict[str, Any]], List[datetime], Optional[datetime]]: - """ - Parses raw GraphQL data into a unified, chronologically sorted history list. + """Parses raw GraphQL data into a unified, chronologically sorted history list. + Also extracts specific event times needed for logic checks. Args: @@ -219,7 +219,8 @@ def _build_history_timeline( Tuple[List[Dict], List[datetime], Optional[datetime]]: - history: A list of normalized event dictionaries sorted by time. - label_events: A list of timestamps when the stale label was applied. - - last_bot_alert_time: Timestamp of the last bot silent-edit alert (if any). + - last_bot_alert_time: Timestamp of the last bot silent-edit alert (if + any). """ issue_author = data.get("author", {}).get("login") history = [] @@ -306,8 +307,7 @@ def _build_history_timeline( def _replay_history_to_find_state( history: List[Dict[str, Any]], maintainers: List[str], issue_author: str ) -> Dict[str, Any]: - """ - Replays the unified event history to determine the absolute last actor and their role. + """Replays the unified event history to determine the absolute last actor and their role. Args: history (List[Dict]): Chronologically sorted list of events. @@ -318,7 +318,8 @@ def _replay_history_to_find_state( Dict[str, Any]: A dictionary containing the last state of the issue: - last_action_role (str): 'author', 'maintainer', or 'other_user'. - last_activity_time (datetime): Timestamp of the last human action. - - last_action_type (str): The type of the last action (e.g., 'commented'). + - last_action_type (str): The type of the last action (e.g., + 'commented'). - last_comment_text (Optional[str]): The text of the last comment. - last_actor_name (str): The specific username of the last actor. """ @@ -359,8 +360,7 @@ def _replay_history_to_find_state( def get_issue_state(item_number: int) -> Dict[str, Any]: - """ - Retrieves the comprehensive state of a GitHub issue using GraphQL. + """Retrieves the comprehensive state of a GitHub issue using GraphQL. This function orchestrates the fetching, parsing, and analysis of the issue's history to determine if it is stale, active, or pending maintainer review. @@ -370,7 +370,8 @@ def get_issue_state(item_number: int) -> Dict[str, Any]: Returns: Dict[str, Any]: A comprehensive state dictionary for the LLM agent. - Contains keys such as 'last_action_role', 'is_stale', 'days_since_activity', + Contains keys such as 'last_action_role', 'is_stale', + 'days_since_activity', and 'maintainer_alert_needed'. """ try: @@ -460,8 +461,7 @@ def get_issue_state(item_number: int) -> Dict[str, Any]: def _format_days(hours: float) -> str: - """ - Formats a duration in hours into a clean day string. + """Formats a duration in hours into a clean day string. Example: 168.0 -> "7" @@ -472,8 +472,7 @@ def _format_days(hours: float) -> str: def add_label_to_issue(item_number: int, label_name: str) -> dict[str, Any]: - """ - Adds a label to the issue. + """Adds a label to the issue. Args: item_number (int): The GitHub issue number. @@ -491,8 +490,7 @@ def add_label_to_issue(item_number: int, label_name: str) -> dict[str, Any]: def remove_label_from_issue( item_number: int, label_name: str ) -> dict[str, Any]: - """ - Removes a label from the issue. + """Removes a label from the issue. Args: item_number (int): The GitHub issue number. @@ -508,8 +506,7 @@ def remove_label_from_issue( def add_stale_label_and_comment(item_number: int) -> dict[str, Any]: - """ - Marks the issue as stale with a comment and label. + """Marks the issue as stale with a comment and label. Args: item_number (int): The GitHub issue number. @@ -538,8 +535,7 @@ def add_stale_label_and_comment(item_number: int) -> dict[str, Any]: def alert_maintainer_of_edit(item_number: int) -> dict[str, Any]: - """ - Posts a comment alerting maintainers of a silent description update. + """Posts a comment alerting maintainers of a silent description update. Args: item_number (int): The GitHub issue number. @@ -557,8 +553,7 @@ def alert_maintainer_of_edit(item_number: int) -> dict[str, Any]: def close_as_stale(item_number: int) -> dict[str, Any]: - """ - Closes the issue as not planned/stale. + """Closes the issue as not planned/stale. Args: item_number (int): The GitHub issue number. diff --git a/contributing/samples/adk_stale_agent/main.py b/contributing/samples/adk_team/adk_stale_agent/main.py similarity index 96% rename from contributing/samples/adk_stale_agent/main.py rename to contributing/samples/adk_team/adk_stale_agent/main.py index f61f87f333..4beaf66e01 100644 --- a/contributing/samples/adk_stale_agent/main.py +++ b/contributing/samples/adk_team/adk_stale_agent/main.py @@ -38,8 +38,7 @@ async def process_single_issue(issue_number: int) -> Tuple[float, int]: - """ - Processes a single GitHub issue using the AI agent and logs execution metrics. + """Processes a single GitHub issue using the AI agent and logs execution metrics. Args: issue_number (int): The GitHub issue number to audit. @@ -47,10 +46,12 @@ async def process_single_issue(issue_number: int) -> Tuple[float, int]: Returns: Tuple[float, int]: A tuple containing: - duration (float): Time taken to process the issue in seconds. - - api_calls (int): The number of API calls made during this specific execution. + - api_calls (int): The number of API calls made during this specific + execution. Raises: - Exception: catches generic exceptions to prevent one failure from stopping the batch. + Exception: catches generic exceptions to prevent one failure from stopping + the batch. """ start_time = time.perf_counter() @@ -102,8 +103,7 @@ async def process_single_issue(issue_number: int) -> Tuple[float, int]: async def main(): - """ - Main entry point to run the stale issue bot concurrently. + """Main entry point to run the stale issue bot concurrently. Fetches old issues and processes them in batches to respect API rate limits and concurrency constraints. diff --git a/contributing/samples/adk_stale_agent/settings.py b/contributing/samples/adk_team/adk_stale_agent/settings.py similarity index 100% rename from contributing/samples/adk_stale_agent/settings.py rename to contributing/samples/adk_team/adk_stale_agent/settings.py diff --git a/contributing/samples/adk_stale_agent/utils.py b/contributing/samples/adk_team/adk_stale_agent/utils.py similarity index 90% rename from contributing/samples/adk_stale_agent/utils.py rename to contributing/samples/adk_team/adk_stale_agent/utils.py index e7cd721025..e90d680117 100644 --- a/contributing/samples/adk_stale_agent/utils.py +++ b/contributing/samples/adk_team/adk_stale_agent/utils.py @@ -37,8 +37,7 @@ def get_api_call_count() -> int: - """ - Returns the total number of API calls made since the last reset. + """Returns the total number of API calls made since the last reset. Returns: int: The global count of API calls. @@ -55,8 +54,8 @@ def reset_api_call_count() -> None: def _increment_api_call_count() -> None: - """ - Atomically increments the global API call counter. + """Atomically increments the global API call counter. + Required because the agent may run tools in parallel threads. """ global _api_call_count @@ -97,8 +96,7 @@ def _increment_api_call_count() -> None: def get_request(url: str, params: Optional[Dict[str, Any]] = None) -> Any: - """ - Sends a GET request to the GitHub API with automatic retries. + """Sends a GET request to the GitHub API with automatic retries. Args: url (str): The URL endpoint. @@ -121,8 +119,7 @@ def get_request(url: str, params: Optional[Dict[str, Any]] = None) -> Any: def post_request(url: str, payload: Any) -> Any: - """ - Sends a POST request to the GitHub API with automatic retries. + """Sends a POST request to the GitHub API with automatic retries. Args: url (str): The URL endpoint. @@ -142,8 +139,7 @@ def post_request(url: str, payload: Any) -> Any: def patch_request(url: str, payload: Any) -> Any: - """ - Sends a PATCH request to the GitHub API with automatic retries. + """Sends a PATCH request to the GitHub API with automatic retries. Args: url (str): The URL endpoint. @@ -163,8 +159,7 @@ def patch_request(url: str, payload: Any) -> Any: def delete_request(url: str) -> Any: - """ - Sends a DELETE request to the GitHub API with automatic retries. + """Sends a DELETE request to the GitHub API with automatic retries. Args: url (str): The URL endpoint. @@ -185,8 +180,7 @@ def delete_request(url: str) -> Any: def error_response(error_message: str) -> Dict[str, Any]: - """ - Creates a standardized error response dictionary for tool outputs. + """Creates a standardized error response dictionary for tool outputs. Args: error_message (str): The error details. @@ -200,18 +194,18 @@ def error_response(error_message: str) -> Dict[str, Any]: def get_old_open_issue_numbers( owner: str, repo: str, days_old: Optional[float] = None ) -> List[int]: - """ - Finds open issues older than the specified threshold using server-side filtering. + """Finds open issues older than the specified threshold using server-side filtering. OPTIMIZATION: - Instead of fetching ALL issues and filtering in Python (which wastes API calls), + Instead of fetching ALL issues and filtering in Python (which wastes API + calls), this uses the GitHub Search API `created: dict[str, Any]: def add_label_to_issue(issue_number: int, label: str) -> dict[str, Any]: """Add the specified component label to the given issue number. + Args: issue_number: issue number of the GitHub issue. label: label to assign @@ -244,7 +245,7 @@ def change_issue_type(issue_number: int, issue_type: str) -> dict[str, Any]: root_agent = Agent( - model="gemini-2.5-pro", + model="gemini-3.5-flash", name="adk_triaging_assistant", description="Triage ADK issues.", instruction=f""" diff --git a/contributing/samples/adk_triaging_agent/main.py b/contributing/samples/adk_team/adk_triaging_agent/main.py similarity index 100% rename from contributing/samples/adk_triaging_agent/main.py rename to contributing/samples/adk_team/adk_triaging_agent/main.py diff --git a/contributing/samples/adk_triaging_agent/settings.py b/contributing/samples/adk_team/adk_triaging_agent/settings.py similarity index 100% rename from contributing/samples/adk_triaging_agent/settings.py rename to contributing/samples/adk_team/adk_triaging_agent/settings.py diff --git a/contributing/samples/adk_triaging_agent/utils.py b/contributing/samples/adk_team/adk_triaging_agent/utils.py similarity index 100% rename from contributing/samples/adk_triaging_agent/utils.py rename to contributing/samples/adk_team/adk_triaging_agent/utils.py diff --git a/contributing/samples/artifact_save_text/agent.py b/contributing/samples/artifact_save_text/agent.py deleted file mode 100755 index 408d64fc5a..0000000000 --- a/contributing/samples/artifact_save_text/agent.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -from google.adk import Agent -from google.adk.tools.tool_context import ToolContext -from google.genai import types - - -async def log_query(tool_context: ToolContext, query: str): - """Saves the provided query string as a 'text/plain' artifact named 'query'.""" - query_bytes = query.encode('utf-8') - artifact_part = types.Part( - inline_data=types.Blob(mime_type='text/plain', data=query_bytes) - ) - await tool_context.save_artifact('query', artifact_part) - - -root_agent = Agent( - model='gemini-2.5-flash', - name='log_agent', - description='Log user query.', - instruction="""Always log the user query and reply "kk, I've logged." - """, - tools=[log_query], - generate_content_config=types.GenerateContentConfig( - safety_settings=[ - types.SafetySetting( # avoid false alarm about rolling dice. - category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, - threshold=types.HarmBlockThreshold.OFF, - ), - ] - ), -) diff --git a/contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json b/contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json deleted file mode 100644 index f811d6ba31..0000000000 --- a/contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "keys": [ - "Replace with JWKS from jwkset.com/generate" - ] -} diff --git a/contributing/samples/cache_analysis/README.md b/contributing/samples/cache_analysis/README.md deleted file mode 100644 index f01ff54a9f..0000000000 --- a/contributing/samples/cache_analysis/README.md +++ /dev/null @@ -1,116 +0,0 @@ -# Cache Analysis Research Assistant - -This sample demonstrates ADK context caching features with a comprehensive research assistant agent designed to test both Gemini 2.0 Flash and 2.5 Flash context caching capabilities. The sample showcases the difference between explicit ADK caching and Google's built-in implicit caching. - -## Key Features - -- **App-Level Cache Configuration**: Context cache settings applied at the App level -- **Large Context Instructions**: Over 4200 tokens in system instructions to trigger context caching thresholds -- **Comprehensive Tool Suite**: 7 specialized research and analysis tools -- **Multi-Model Support**: Compatible with any Gemini model, automatically adapts experiment type -- **Performance Metrics**: Detailed token usage tracking including `cached_content_token_count` - -## Cache Configuration - -```python -ContextCacheConfig( - min_tokens=4096, - ttl_seconds=600, # 10 mins for research sessions - cache_intervals=3, # Maximum invocations before cache invalidation -``` - -## Usage - -### Run Cache Experiments - -The `run_cache_experiments.py` script compares caching performance between models: - -```bash -# Test any Gemini model - script automatically determines experiment type -python run_cache_experiments.py --output results.json - -# Examples: -python run_cache_experiments.py gemini-2.5-flash --output gemini_2_5_results.json - -# Run multiple iterations for averaged results -python run_cache_experiments.py --repeat 3 --output averaged_results.json -``` - -### Direct Agent Usage - -```bash -# Run the agent directly -adk run contributing/samples/cache_analysis/agent.py - -# Web interface for debugging -adk web contributing/samples/cache_analysis -``` - -## Experiment Types - -The script automatically determines the experiment type based on the model name: - -### Models with "2.5" (e.g., gemini-2.5-flash) - -- **Explicit Caching**: ADK explicit caching + Google's implicit caching -- **Implicit Only**: Google's built-in implicit caching alone -- **Measures**: Added benefit of explicit caching over Google's built-in implicit caching - -## Tools Included - -1. **analyze_data_patterns** - Statistical analysis and pattern recognition in datasets -1. **research_literature** - Academic and professional literature research with citations -1. **generate_test_scenarios** - Comprehensive test case generation and validation strategies -1. **benchmark_performance** - System performance measurement and bottleneck analysis -1. **optimize_system_performance** - Performance optimization recommendations and strategies -1. **analyze_security_vulnerabilities** - Security risk assessment and vulnerability analysis -1. **design_scalability_architecture** - Scalable system architecture design and planning - -## Expected Results - -### Performance vs Cost Trade-offs - -**Note**: This sample uses a tool-heavy agent that may show different performance characteristics than simple text-based agents. - -### Performance Improvements - -- **Simple Text Agents**: Typically see 30-70% latency reduction with caching -- **Tool-Heavy Agents**: May experience higher latency due to cache setup overhead, but still provide cost benefits -- **Gemini 2.5 Flash**: Compares explicit ADK caching against Google's built-in implicit caching - -### Cost Savings - -- **Input Token Cost**: 75% reduction for cached content (25% of normal cost) -- **Typical Savings**: 30-60% on input costs for multi-turn conversations -- **Tool-Heavy Workloads**: Cost savings often outweigh latency trade-offs - -### Token Metrics - -- **Cached Content Token Count**: Non-zero values indicating successful cache hits -- **Cache Hit Ratio**: Proportion of tokens served from cache vs fresh computation - -## Troubleshooting - -### Zero Cached Tokens - -If `cached_content_token_count` is always 0: - -- Verify model names match exactly (e.g., `gemini-2.5-flash`) -- Check that cache configuration `min_tokens` threshold is met -- Ensure proper App-based configuration is used - -### Session Errors - -If seeing "Session not found" errors: - -- Verify `runner.app_name` is used for session creation -- Check App vs Agent object usage in InMemoryRunner initialization - -## Technical Implementation - -This sample demonstrates: - -- **Modern App Architecture**: App-level cache configuration following ADK best practices -- **Integration Testing**: Comprehensive cache functionality validation -- **Performance Analysis**: Detailed metrics collection and comparison methodology -- **Error Handling**: Robust session management and cache invalidation handling diff --git a/contributing/samples/callbacks/agent.py b/contributing/samples/callbacks/agent.py deleted file mode 100755 index 66c76dcd42..0000000000 --- a/contributing/samples/callbacks/agent.py +++ /dev/null @@ -1,198 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import random - -from google.adk import Agent -from google.adk.planners.built_in_planner import BuiltInPlanner -from google.adk.planners.plan_re_act_planner import PlanReActPlanner -from google.adk.tools.tool_context import ToolContext -from google.genai import types - - -def roll_die(sides: int, tool_context: ToolContext) -> int: - """Roll a die and return the rolled result. - - Args: - sides: The integer number of sides the die has. - - Returns: - An integer of the result of rolling the die. - """ - result = random.randint(1, sides) - if not 'rolls' in tool_context.state: - tool_context.state['rolls'] = [] - - tool_context.state['rolls'] = tool_context.state['rolls'] + [result] - return result - - -async def check_prime(nums: list[int]) -> str: - """Check if a given list of numbers are prime. - - Args: - nums: The list of numbers to check. - - Returns: - A str indicating which number is prime. - """ - primes = set() - for number in nums: - number = int(number) - if number <= 1: - continue - is_prime = True - for i in range(2, int(number**0.5) + 1): - if number % i == 0: - is_prime = False - break - if is_prime: - primes.add(number) - return ( - 'No prime numbers found.' - if not primes - else f"{', '.join(str(num) for num in primes)} are prime numbers." - ) - - -async def before_agent_callback(callback_context): - print('@before_agent_callback') - return None - - -async def after_agent_callback(callback_context): - print('@after_agent_callback') - return None - - -async def before_model_callback(callback_context, llm_request): - print('@before_model_callback') - return None - - -async def after_model_callback(callback_context, llm_response): - print('@after_model_callback') - return None - - -def after_agent_cb1(callback_context): - print('@after_agent_cb1') - - -def after_agent_cb2(callback_context): - print('@after_agent_cb2') - # ModelContent (or Content with role set to 'model') must be returned. - # Otherwise, the event will be excluded from the context in the next turn. - return types.ModelContent( - parts=[ - types.Part( - text='(stopped) after_agent_cb2', - ), - ], - ) - - -def after_agent_cb3(callback_context): - print('@after_agent_cb3') - - -def before_agent_cb1(callback_context): - print('@before_agent_cb1') - - -def before_agent_cb2(callback_context): - print('@before_agent_cb2') - - -def before_agent_cb3(callback_context): - print('@before_agent_cb3') - - -def before_tool_cb1(tool, args, tool_context): - print('@before_tool_cb1') - - -def before_tool_cb2(tool, args, tool_context): - print('@before_tool_cb2') - - -def before_tool_cb3(tool, args, tool_context): - print('@before_tool_cb3') - - -def after_tool_cb1(tool, args, tool_context, tool_response): - print('@after_tool_cb1') - - -def after_tool_cb2(tool, args, tool_context, tool_response): - print('@after_tool_cb2') - return {'test': 'after_tool_cb2', 'response': tool_response} - - -def after_tool_cb3(tool, args, tool_context, tool_response): - print('@after_tool_cb3') - - -root_agent = Agent( - model='gemini-2.5-flash', - name='data_processing_agent', - description=( - 'hello world agent that can roll a dice of 8 sides and check prime' - ' numbers.' - ), - instruction=""" - You roll dice and answer questions about the outcome of the dice rolls. - You can roll dice of different sizes. - You can use multiple tools in parallel by calling functions in parallel(in one request and in one round). - It is ok to discuss previous dice roles, and comment on the dice rolls. - When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string. - You should never roll a die on your own. - When checking prime numbers, call the check_prime tool with a list of integers. Be sure to pass in a list of integers. You should never pass in a string. - You should not check prime numbers before calling the tool. - When you are asked to roll a die and check prime numbers, you should always make the following two function calls: - 1. You should first call the roll_die tool to get a roll. Wait for the function response before calling the check_prime tool. - 2. After you get the function response from roll_die tool, you should call the check_prime tool with the roll_die result. - 2.1 If user asks you to check primes based on previous rolls, make sure you include the previous rolls in the list. - 3. When you respond, you must include the roll_die result from step 1. - You should always perform the previous 3 steps when asking for a roll and checking prime numbers. - You should not rely on the previous history on prime results. - """, - tools=[ - roll_die, - check_prime, - ], - # planner=BuiltInPlanner( - # thinking_config=types.ThinkingConfig( - # include_thoughts=True, - # ), - # ), - generate_content_config=types.GenerateContentConfig( - safety_settings=[ - types.SafetySetting( # avoid false alarm about rolling dice. - category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, - threshold=types.HarmBlockThreshold.OFF, - ), - ] - ), - before_agent_callback=[ - before_agent_cb1, - before_agent_cb2, - before_agent_cb3, - ], - after_agent_callback=[after_agent_cb1, after_agent_cb2, after_agent_cb3], - before_model_callback=before_model_callback, - after_model_callback=after_model_callback, - before_tool_callback=[before_tool_cb1, before_tool_cb2, before_tool_cb3], - after_tool_callback=[after_tool_cb1, after_tool_cb2, after_tool_cb3], -) diff --git a/contributing/samples/agent_engine_code_execution/README b/contributing/samples/code_execution/agent_engine_code_execution/README similarity index 100% rename from contributing/samples/agent_engine_code_execution/README rename to contributing/samples/code_execution/agent_engine_code_execution/README diff --git a/contributing/samples/agent_engine_code_execution/__init__.py b/contributing/samples/code_execution/agent_engine_code_execution/__init__.py similarity index 100% rename from contributing/samples/agent_engine_code_execution/__init__.py rename to contributing/samples/code_execution/agent_engine_code_execution/__init__.py diff --git a/contributing/samples/agent_engine_code_execution/agent.py b/contributing/samples/code_execution/agent_engine_code_execution/agent.py similarity index 99% rename from contributing/samples/agent_engine_code_execution/agent.py rename to contributing/samples/code_execution/agent_engine_code_execution/agent.py index eb320b077c..661c105a91 100644 --- a/contributing/samples/agent_engine_code_execution/agent.py +++ b/contributing/samples/code_execution/agent_engine_code_execution/agent.py @@ -66,7 +66,6 @@ def base_system_instruction(): root_agent = Agent( - model="gemini-2.5-flash", name="agent_engine_code_execution_agent", instruction=base_system_instruction() + """ diff --git a/contributing/samples/agent_registry_agent/__init__.py b/contributing/samples/code_execution/code_execution/__init__.py similarity index 100% rename from contributing/samples/agent_registry_agent/__init__.py rename to contributing/samples/code_execution/code_execution/__init__.py diff --git a/contributing/samples/code_execution/agent.py b/contributing/samples/code_execution/code_execution/agent.py similarity index 99% rename from contributing/samples/code_execution/agent.py rename to contributing/samples/code_execution/code_execution/agent.py index c8f808528d..482adf7ab8 100644 --- a/contributing/samples/code_execution/agent.py +++ b/contributing/samples/code_execution/code_execution/agent.py @@ -78,7 +78,6 @@ def base_system_instruction(): root_agent = Agent( - model="gemini-2.5-flash", name="data_science_agent", instruction=base_system_instruction() + """ diff --git a/contributing/samples/code_execution/gke_sandbox_agent.py b/contributing/samples/code_execution/code_execution/gke_sandbox_agent.py similarity index 98% rename from contributing/samples/code_execution/gke_sandbox_agent.py rename to contributing/samples/code_execution/code_execution/gke_sandbox_agent.py index 8948f4f469..26d7390892 100644 --- a/contributing/samples/code_execution/gke_sandbox_agent.py +++ b/contributing/samples/code_execution/code_execution/gke_sandbox_agent.py @@ -39,7 +39,6 @@ def gke_agent_system_instruction(): root_agent = LlmAgent( name="gke_coding_agent", - model="gemini-2.5-flash", description=( "A general-purpose agent that executes Python code in a secure GKE" " Sandbox." diff --git a/contributing/samples/custom_code_execution/README.md b/contributing/samples/code_execution/custom_code_execution/README.md similarity index 100% rename from contributing/samples/custom_code_execution/README.md rename to contributing/samples/code_execution/custom_code_execution/README.md diff --git a/contributing/samples/agent_tool_with_grounding_metadata/__init__.py b/contributing/samples/code_execution/custom_code_execution/__init__.py similarity index 100% rename from contributing/samples/agent_tool_with_grounding_metadata/__init__.py rename to contributing/samples/code_execution/custom_code_execution/__init__.py diff --git a/contributing/samples/custom_code_execution/agent.py b/contributing/samples/code_execution/custom_code_execution/agent.py similarity index 99% rename from contributing/samples/custom_code_execution/agent.py rename to contributing/samples/code_execution/custom_code_execution/agent.py index 2c6efed348..903b15025e 100644 --- a/contributing/samples/custom_code_execution/agent.py +++ b/contributing/samples/code_execution/custom_code_execution/agent.py @@ -144,7 +144,6 @@ def base_system_instruction(): root_agent = Agent( - model="gemini-2.5-flash", name="data_science_agent", instruction=base_system_instruction() + """ diff --git a/contributing/samples/vertex_code_execution/README.md b/contributing/samples/code_execution/vertex_code_execution/README.md similarity index 100% rename from contributing/samples/vertex_code_execution/README.md rename to contributing/samples/code_execution/vertex_code_execution/README.md diff --git a/contributing/samples/api_registry_agent/__init__.py b/contributing/samples/code_execution/vertex_code_execution/__init__.py similarity index 100% rename from contributing/samples/api_registry_agent/__init__.py rename to contributing/samples/code_execution/vertex_code_execution/__init__.py diff --git a/contributing/samples/vertex_code_execution/agent.py b/contributing/samples/code_execution/vertex_code_execution/agent.py similarity index 99% rename from contributing/samples/vertex_code_execution/agent.py rename to contributing/samples/code_execution/vertex_code_execution/agent.py index 79e5a03d1b..1ea3a5e5a2 100644 --- a/contributing/samples/vertex_code_execution/agent.py +++ b/contributing/samples/code_execution/vertex_code_execution/agent.py @@ -78,7 +78,6 @@ def base_system_instruction(): root_agent = Agent( - model="gemini-2.5-flash", name="data_science_agent", instruction=base_system_instruction() + """ diff --git a/contributing/samples/core_basic_config/README.md b/contributing/samples/config/core_basic_config/README.md similarity index 100% rename from contributing/samples/core_basic_config/README.md rename to contributing/samples/config/core_basic_config/README.md diff --git a/contributing/samples/core_basic_config/root_agent.yaml b/contributing/samples/config/core_basic_config/root_agent.yaml similarity index 100% rename from contributing/samples/core_basic_config/root_agent.yaml rename to contributing/samples/config/core_basic_config/root_agent.yaml diff --git a/contributing/samples/core_callback_config/__init__.py b/contributing/samples/config/core_callback_config/__init__.py similarity index 100% rename from contributing/samples/core_callback_config/__init__.py rename to contributing/samples/config/core_callback_config/__init__.py diff --git a/contributing/samples/core_callback_config/callbacks.py b/contributing/samples/config/core_callback_config/callbacks.py similarity index 76% rename from contributing/samples/core_callback_config/callbacks.py rename to contributing/samples/config/core_callback_config/callbacks.py index 1614a9351a..57f8d38675 100644 --- a/contributing/samples/core_callback_config/callbacks.py +++ b/contributing/samples/config/core_callback_config/callbacks.py @@ -1,3 +1,17 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + from google.genai import types diff --git a/contributing/samples/core_callback_config/root_agent.yaml b/contributing/samples/config/core_callback_config/root_agent.yaml similarity index 100% rename from contributing/samples/core_callback_config/root_agent.yaml rename to contributing/samples/config/core_callback_config/root_agent.yaml diff --git a/contributing/samples/core_callback_config/tools.py b/contributing/samples/config/core_callback_config/tools.py similarity index 66% rename from contributing/samples/core_callback_config/tools.py rename to contributing/samples/config/core_callback_config/tools.py index 6d6e3111c8..08531a971c 100644 --- a/contributing/samples/core_callback_config/tools.py +++ b/contributing/samples/config/core_callback_config/tools.py @@ -1,3 +1,17 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import random from google.adk.tools.tool_context import ToolContext diff --git a/contributing/samples/core_custom_agent_config/__init__.py b/contributing/samples/config/core_custom_agent_config/__init__.py similarity index 100% rename from contributing/samples/core_custom_agent_config/__init__.py rename to contributing/samples/config/core_custom_agent_config/__init__.py diff --git a/contributing/samples/core_custom_agent_config/my_agents.py b/contributing/samples/config/core_custom_agent_config/my_agents.py similarity index 100% rename from contributing/samples/core_custom_agent_config/my_agents.py rename to contributing/samples/config/core_custom_agent_config/my_agents.py diff --git a/contributing/samples/core_custom_agent_config/root_agent.yaml b/contributing/samples/config/core_custom_agent_config/root_agent.yaml similarity index 100% rename from contributing/samples/core_custom_agent_config/root_agent.yaml rename to contributing/samples/config/core_custom_agent_config/root_agent.yaml diff --git a/contributing/samples/core_generate_content_config_config/root_agent.yaml b/contributing/samples/config/core_generate_content_config_config/root_agent.yaml similarity index 100% rename from contributing/samples/core_generate_content_config_config/root_agent.yaml rename to contributing/samples/config/core_generate_content_config_config/root_agent.yaml diff --git a/contributing/samples/context_management/cache_analysis/README.md b/contributing/samples/context_management/cache_analysis/README.md new file mode 100644 index 0000000000..44b7cf7628 --- /dev/null +++ b/contributing/samples/context_management/cache_analysis/README.md @@ -0,0 +1,131 @@ +# Cache Analysis Research Assistant + +## Overview + +This sample demonstrates ADK context caching features using a comprehensive research assistant agent designed to test both Gemini 2.0 Flash and 2.5 Flash context caching capabilities. The sample showcases the difference between explicit ADK caching and Google's built-in implicit caching. + +### Key Features + +- **App-Level Cache Configuration**: Context cache settings applied at the App level following ADK best practices. +- **Large Context Instructions**: Over 4,200 tokens in system instructions to trigger context caching thresholds. +- **Comprehensive Tool Suite**: 7 specialized research and analysis tools. +- **Multi-Model Support**: Compatible with any Gemini model, automatically adapting the experiment type. +- **Performance Metrics**: Detailed token usage tracking, including `cached_content_token_count`. + +## Sample Inputs + +- `Hello, what can you do for me?` + + *General question that does not trigger function calls, serving as a baseline query.* + +- `What is artificial intelligence and how does it work in modern applications?` + + *General question exploring domain knowledge without specific tool requests.* + +- `Use benchmark_performance with system_name='E-commerce Platform', metrics=['latency', 'throughput'], duration='standard', load_profile='realistic'.` + + *Specific request triggering the benchmark_performance tool with explicit parameters.* + +- `Call analyze_user_behavior_patterns with user_segment='premium_customers', time_period='last_30_days', metrics=['engagement', 'conversion'].` + + *Specific request triggering data analysis tools with required parameters.* + +## Graph + +```mermaid +graph TD + Agent[Agent: cache_analysis_assistant] --> Tool1[Tool: analyze_data_patterns] + Agent --> Tool2[Tool: research_literature] + Agent --> Tool3[Tool: generate_test_scenarios] + Agent --> Tool4[Tool: benchmark_performance] + Agent --> Tool5[Tool: optimize_system_performance] + Agent --> Tool6[Tool: analyze_security_vulnerabilities] + Agent --> Tool7[Tool: design_scalability_architecture] +``` + +## How To + +### 1. Cache Configuration + +Context caching is configured at the App level using `ContextCacheConfig`. This ensures that the agent's extensive system instructions and tool definitions are cached for repeated invocations. + +```python +from google.adk.agents.context_cache_config import ContextCacheConfig +from google.adk.apps.app import App + +cache_analysis_app = App( + name="cache_analysis", + root_agent=cache_analysis_agent, + context_cache_config=ContextCacheConfig( + min_tokens=4096, + ttl_seconds=600, # 10 minutes for research sessions + cache_intervals=3, # Maximum invocations before cache refresh + ), +) +``` + +### 2. Run Cache Experiments + +The `run_cache_experiments.py` script automates the execution of prompts and compares caching performance between models: + +```bash +# Test any Gemini model - script automatically determines experiment type +python run_cache_experiments.py --output results.json + +# Examples: +python run_cache_experiments.py gemini-2.5-flash --output gemini_2_5_results.json + +# Run multiple iterations for averaged results +python run_cache_experiments.py gemini-2.5-flash --repeat 3 --output averaged_results.json +``` + +### 3. Direct Agent Usage + +You can also run or debug the agent directly using the ADK CLI: + +```bash +# Run the agent directly +adk run contributing/samples/cache_analysis/agent.py + +# Web interface for debugging +adk web contributing/samples/cache_analysis +``` + +### 4. Experiment Types + +The script automatically adapts the experiment based on the specified model name: + +#### Models with "2.5" (e.g., `gemini-2.5-flash`) + +- **Explicit Caching**: ADK explicit caching + Google's implicit caching. +- **Implicit Only**: Google's built-in implicit caching alone. +- **Measures**: The added benefit and performance differences of explicit caching over built-in implicit caching. + +#### Other Models (e.g., `gemini-2.0-flash`) + +- **Explicit Caching**: ADK explicit caching enabled. +- **Uncached**: Caching completely disabled. +- **Measures**: Baseline performance and cost benefits of context caching. + +### 5. Expected Results + +- **Performance Improvements**: Simple text agents typically see a 30-70% latency reduction with caching. Tool-heavy agents may experience slight cache setup overhead but still provide significant cost benefits. +- **Cost Savings**: Up to 75% reduction in input token costs for cached content (paying only 25% of normal input cost). +- **Token Metrics**: Successful cache hits are indicated by non-zero `cached_content_token_count` values. + +### 6. Troubleshooting + +#### Zero Cached Tokens + +If `cached_content_token_count` is always `0`: + +- Verify model names match exactly (e.g., `gemini-2.5-flash`). +- Check that the `min_tokens` threshold (4,096 tokens) is met by the prompt and system instructions. +- Ensure proper App-based configuration is used rather than passing standalone agents without App wrappers. + +#### Session Errors + +If you encounter "Session not found" errors: + +- Verify `runner.app_name` is used for session creation. +- Ensure correct initialization of `InMemoryRunner` with the `App` object. diff --git a/contributing/samples/cache_analysis/__init__.py b/contributing/samples/context_management/cache_analysis/__init__.py similarity index 100% rename from contributing/samples/cache_analysis/__init__.py rename to contributing/samples/context_management/cache_analysis/__init__.py diff --git a/contributing/samples/cache_analysis/agent.py b/contributing/samples/context_management/cache_analysis/agent.py similarity index 75% rename from contributing/samples/cache_analysis/agent.py rename to contributing/samples/context_management/cache_analysis/agent.py index 55abaf709c..3e84d08702 100644 --- a/contributing/samples/cache_analysis/agent.py +++ b/contributing/samples/context_management/cache_analysis/agent.py @@ -46,16 +46,15 @@ def analyze_data_patterns( Args: data: The input data to analyze. Can be structured (JSON, CSV) or - unstructured text data. For structured data, include column headers - and ensure proper formatting. For time series data, include - timestamps in ISO format. - analysis_type: Type of analysis to perform. Options include: - - "comprehensive": Full statistical and trend analysis - - "statistical": Basic statistical measures only - - "trends": Time series and trend analysis - - "anomalies": Outlier and anomaly detection - - "correlations": Correlation and relationship analysis - - "predictive": Forecasting and prediction models + unstructured text data. For structured data, include column headers and + ensure proper formatting. For time series data, include timestamps in + ISO format. + analysis_type: Type of analysis to perform. Options include: - + "comprehensive": Full statistical and trend analysis - "statistical": + Basic statistical measures only - "trends": Time series and trend + analysis - "anomalies": Outlier and anomaly detection - "correlations": + Correlation and relationship analysis - "predictive": Forecasting and + prediction models Returns: Dictionary containing analysis results with the following structure: @@ -95,7 +94,8 @@ def research_literature( """Research academic and professional literature on specified topics. This tool performs comprehensive literature research across multiple academic - databases, professional journals, conference proceedings, and industry reports. + databases, professional journals, conference proceedings, and industry + reports. It can analyze research trends, identify key authors and institutions, extract methodological approaches, and synthesize findings across multiple sources. @@ -105,27 +105,23 @@ def research_literature( the specified field of study. Args: - topic: The research topic or query. Can be specific (e.g., "context caching - in large language models") or broad (e.g., "machine learning optimization"). - Use specific keywords and phrases for better results. Boolean operators - (AND, OR, NOT) are supported for complex queries. - sources: List of preferred sources to search. Options include: - - "academic": Peer-reviewed academic journals and papers - - "conference": Conference proceedings and presentations - - "industry": Industry reports and white papers - - "patents": Patent databases and intellectual property - - "preprints": ArXiv, bioRxiv and other preprint servers - - "books": Academic and professional books - depth: Research depth level: - - "comprehensive": Full literature review with detailed analysis - - "focused": Targeted search on specific aspects - - "overview": High-level survey of the field - - "technical": Deep technical implementation details - time_range: Time range for literature search: - - "recent": Last 2 years - - "current": Last 5 years - - "historical": All available time periods - - "decade": Last 10 years + topic: The research topic or query. Can be specific (e.g., "context + caching in large language models") or broad (e.g., "machine learning + optimization"). Use specific keywords and phrases for better results. + Boolean operators (AND, OR, NOT) are supported for complex queries. + sources: List of preferred sources to search. Options include: - + "academic": Peer-reviewed academic journals and papers - "conference": + Conference proceedings and presentations - "industry": Industry reports + and white papers - "patents": Patent databases and intellectual property + - "preprints": ArXiv, bioRxiv and other preprint servers - "books": + Academic and professional books + depth: Research depth level: - "comprehensive": Full literature review + with detailed analysis - "focused": Targeted search on specific aspects + - "overview": High-level survey of the field - "technical": Deep + technical implementation details + time_range: Time range for literature search: - "recent": Last 2 years - + "current": Last 5 years - "historical": All available time periods - + "decade": Last 10 years Returns: Dictionary containing research results: @@ -177,10 +173,12 @@ def generate_test_scenarios( ) -> Dict[str, Any]: """Generate comprehensive test scenarios for system validation. - This tool creates detailed test scenarios, test cases, and validation protocols + This tool creates detailed test scenarios, test cases, and validation + protocols for various types of systems including software applications, AI models, distributed systems, and hardware components. It supports multiple testing - methodologies including unit testing, integration testing, performance testing, + methodologies including unit testing, integration testing, performance + testing, security testing, and user acceptance testing. The tool can generate both positive and negative test cases, edge cases, @@ -189,33 +187,26 @@ def generate_test_scenarios( coverage and reliable validation results. Args: - system_type: Type of system to test. Supported types include: - - "software": Software applications and services - - "ai_model": Machine learning and AI model testing - - "distributed": Distributed systems and microservices - - "database": Database systems and data integrity - - "api": API endpoints and web services - - "hardware": Hardware components and embedded systems - - "security": Security systems and protocols - complexity: Test complexity level: - - "basic": Essential functionality tests only - - "medium": Standard test suite with common scenarios - - "advanced": Comprehensive testing with edge cases - - "expert": Exhaustive testing with stress and chaos scenarios - coverage: List of testing areas to cover: - - "functionality": Core feature testing - - "performance": Speed, throughput, and scalability - - "security": Authentication, authorization, data protection - - "usability": User experience and interface testing - - "compatibility": Cross-platform and integration testing - - "reliability": Fault tolerance and recovery testing - constraints: Testing constraints and requirements: - { - "time_limit": "Maximum testing duration", - "resources": "Available testing resources", - "environment": "Testing environment specifications", - "compliance": "Regulatory or standard requirements" - } + system_type: Type of system to test. Supported types include: - + "software": Software applications and services - "ai_model": Machine + learning and AI model testing - "distributed": Distributed systems and + microservices - "database": Database systems and data integrity - "api": + API endpoints and web services - "hardware": Hardware components and + embedded systems - "security": Security systems and protocols + complexity: Test complexity level: - "basic": Essential functionality + tests only - "medium": Standard test suite with common scenarios - + "advanced": Comprehensive testing with edge cases - "expert": Exhaustive + testing with stress and chaos scenarios + coverage: List of testing areas to cover: - "functionality": Core feature + testing - "performance": Speed, throughput, and scalability - + "security": Authentication, authorization, data protection - + "usability": User experience and interface testing - "compatibility": + Cross-platform and integration testing - "reliability": Fault tolerance + and recovery testing + constraints: Testing constraints and requirements: { "time_limit": + "Maximum testing duration", "resources": "Available testing resources", + "environment": "Testing environment specifications", "compliance": + "Regulatory or standard requirements" } Returns: Dictionary containing generated test scenarios: @@ -273,42 +264,35 @@ def optimize_system_performance( ) -> Dict[str, Any]: """Analyze system performance and provide detailed optimization recommendations. - This tool performs comprehensive system performance analysis including bottleneck - identification, resource utilization assessment, scalability planning, and provides + This tool performs comprehensive system performance analysis including + bottleneck + identification, resource utilization assessment, scalability planning, and + provides specific optimization strategies tailored to the system type and constraints. Args: - system_type: Type of system to optimize: - - "web_application": Frontend and backend web services - - "database": Relational, NoSQL, or distributed databases - - "ml_pipeline": Machine learning training and inference systems - - "distributed_cache": Caching layers and distributed memory systems - - "microservices": Service-oriented architectures - - "data_processing": ETL, stream processing, batch systems - - "api_gateway": Request routing and API management systems - current_metrics: Current performance metrics including: - { - "response_time_p95": "95th percentile response time in ms", - "throughput_rps": "Requests per second", - "cpu_utilization": "Average CPU usage percentage", - "memory_usage": "Memory consumption in GB", - "error_rate": "Error percentage", - "availability": "System uptime percentage" - } - target_improvements: Desired performance targets: - { - "response_time_improvement": "Target reduction in response time", - "throughput_increase": "Desired increase in throughput", - "cost_reduction": "Target cost optimization percentage", - "availability_target": "Desired uptime percentage" - } - constraints: Operational constraints: - { - "budget_limit": "Maximum budget for improvements", - "timeline": "Implementation timeline constraints", - "technology_restrictions": "Required or forbidden technologies", - "compliance_requirements": "Security/regulatory constraints" - } + system_type: Type of system to optimize: - "web_application": Frontend and + backend web services - "database": Relational, NoSQL, or distributed + databases - "ml_pipeline": Machine learning training and inference + systems - "distributed_cache": Caching layers and distributed memory + systems - "microservices": Service-oriented architectures - + "data_processing": ETL, stream processing, batch systems - + "api_gateway": Request routing and API management systems + current_metrics: Current performance metrics including: { + "response_time_p95": "95th percentile response time in ms", + "throughput_rps": "Requests per second", "cpu_utilization": "Average CPU + usage percentage", "memory_usage": "Memory consumption in GB", + "error_rate": "Error percentage", "availability": "System uptime + percentage" } + target_improvements: Desired performance targets: { + "response_time_improvement": "Target reduction in response time", + "throughput_increase": "Desired increase in throughput", + "cost_reduction": "Target cost optimization percentage", + "availability_target": "Desired uptime percentage" } + constraints: Operational constraints: { "budget_limit": "Maximum budget + for improvements", "timeline": "Implementation timeline constraints", + "technology_restrictions": "Required or forbidden technologies", + "compliance_requirements": "Security/regulatory constraints" } Returns: Comprehensive optimization analysis: @@ -316,10 +300,12 @@ def optimize_system_performance( "performance_analysis": { "bottlenecks_identified": ["Critical performance bottlenecks"], "root_cause_analysis": "Detailed analysis of performance issues", - "current_vs_target": "Gap analysis between current and target metrics" + "current_vs_target": "Gap analysis between current and target + metrics" }, "optimization_recommendations": { - "infrastructure_changes": ["Hardware/cloud resource recommendations"], + "infrastructure_changes": ["Hardware/cloud resource + recommendations"], "architecture_improvements": ["System design optimizations"], "code_optimizations": ["Software-level improvements"], "configuration_tuning": ["Parameter and setting adjustments"] @@ -327,12 +313,14 @@ def optimize_system_performance( "implementation_roadmap": { "phase_1_quick_wins": ["Immediate improvements (0-2 weeks)"], "phase_2_medium_term": ["Medium-term optimizations (1-3 months)"], - "phase_3_strategic": ["Long-term architectural changes (3-12 months)"] + "phase_3_strategic": ["Long-term architectural changes (3-12 + months)"] }, "expected_outcomes": { "performance_improvements": "Projected performance gains", "cost_implications": "Expected costs and savings", - "risk_assessment": "Implementation risks and mitigation strategies" + "risk_assessment": "Implementation risks and mitigation + strategies" } } """ @@ -371,31 +359,29 @@ def analyze_security_vulnerabilities( ) -> Dict[str, Any]: """Perform comprehensive security vulnerability analysis and risk assessment. - This tool conducts detailed security analysis including vulnerability identification, + This tool conducts detailed security analysis including vulnerability + identification, threat modeling, compliance gap analysis, and provides prioritized remediation strategies based on risk levels and business impact. Args: - system_components: List of system components to analyze: - - "web_frontend": User interfaces, SPAs, mobile apps - - "api_endpoints": REST/GraphQL APIs, microservices - - "database_layer": Data storage and access systems - - "authentication": User auth, SSO, identity management - - "data_processing": ETL, analytics, ML pipelines - - "infrastructure": Servers, containers, cloud services - - "network_layer": Load balancers, firewalls, CDNs - security_scope: Analysis depth: - - "basic": Standard vulnerability scanning - - "comprehensive": Full security assessment - - "compliance_focused": Regulatory compliance analysis - - "threat_modeling": Advanced threat analysis - compliance_frameworks: Required compliance standards: - ["SOC2", "GDPR", "HIPAA", "PCI-DSS", "ISO27001"] - threat_model: Threat landscape consideration: - - "startup": Basic threat model for early-stage companies - - "enterprise": Corporate threat landscape - - "high_security": Government/financial sector threats - - "public_facing": Internet-exposed systems + system_components: List of system components to analyze: - "web_frontend": + User interfaces, SPAs, mobile apps - "api_endpoints": REST/GraphQL APIs, + microservices - "database_layer": Data storage and access systems - + "authentication": User auth, SSO, identity management - + "data_processing": ETL, analytics, ML pipelines - "infrastructure": + Servers, containers, cloud services - "network_layer": Load balancers, + firewalls, CDNs + security_scope: Analysis depth: - "basic": Standard vulnerability scanning + - "comprehensive": Full security assessment - "compliance_focused": + Regulatory compliance analysis - "threat_modeling": Advanced threat + analysis + compliance_frameworks: Required compliance standards: ["SOC2", "GDPR", + "HIPAA", "PCI-DSS", "ISO27001"] + threat_model: Threat landscape consideration: - "startup": Basic threat + model for early-stage companies - "enterprise": Corporate threat + landscape - "high_security": Government/financial sector threats - + "public_facing": Internet-exposed systems Returns: Security analysis results: @@ -465,30 +451,23 @@ def design_scalability_architecture( maintaining performance, reliability, and cost-effectiveness. Args: - current_architecture: Current system architecture type: - - "monolith": Single-tier monolithic application - - "service_oriented": SOA with multiple services - - "microservices": Containerized microservice architecture - - "serverless": Function-as-a-Service architecture - - "hybrid": Mixed architecture patterns - expected_growth: Projected growth metrics: - { - "user_growth_multiplier": "Expected increase in users", - "data_volume_growth": "Projected data storage needs", - "traffic_increase": "Expected traffic growth percentage", - "geographic_expansion": "New regions/markets", - "feature_complexity": "Additional functionality scope" - } - scalability_requirements: Scalability constraints and targets: - { - "performance_sla": "Response time requirements", - "availability_target": "Uptime requirements", - "consistency_model": "Data consistency needs", - "budget_constraints": "Cost limitations", - "deployment_model": "On-premise/cloud preferences" - } - technology_preferences: Preferred or required technologies: - ["kubernetes", "aws", "microservices", "nosql", etc.] + current_architecture: Current system architecture type: - "monolith": + Single-tier monolithic application - "service_oriented": SOA with + multiple services - "microservices": Containerized microservice + architecture - "serverless": Function-as-a-Service architecture - + "hybrid": Mixed architecture patterns + expected_growth: Projected growth metrics: { "user_growth_multiplier": + "Expected increase in users", "data_volume_growth": "Projected data + storage needs", "traffic_increase": "Expected traffic growth + percentage", "geographic_expansion": "New regions/markets", + "feature_complexity": "Additional functionality scope" } + scalability_requirements: Scalability constraints and targets: { + "performance_sla": "Response time requirements", "availability_target": + "Uptime requirements", "consistency_model": "Data consistency needs", + "budget_constraints": "Cost limitations", "deployment_model": + "On-premise/cloud preferences" } + technology_preferences: Preferred or required technologies: ["kubernetes", + "aws", "microservices", "nosql", etc.] Returns: Scalability architecture design: @@ -499,7 +478,8 @@ def design_scalability_architecture( "technology_stack": "Recommended technologies and frameworks" }, "scalability_patterns": { - "horizontal_scaling": "Auto-scaling and load distribution strategies", + "horizontal_scaling": "Auto-scaling and load distribution + strategies", "data_partitioning": "Database sharding and data distribution", "caching_strategy": "Multi-level caching implementation", "async_processing": "Background job and queue systems" @@ -564,40 +544,40 @@ def benchmark_performance( ) -> Dict[str, Any]: """Perform comprehensive performance benchmarking and analysis. - This tool conducts detailed performance benchmarking across multiple dimensions + This tool conducts detailed performance benchmarking across multiple + dimensions including response time, throughput, resource utilization, scalability limits, and system stability under various load conditions. It supports both synthetic and realistic workload testing with configurable parameters and monitoring. - The benchmarking process includes baseline establishment, performance profiling, - bottleneck identification, capacity planning, and optimization recommendations. - It can simulate various user patterns, network conditions, and system configurations + The benchmarking process includes baseline establishment, performance + profiling, + bottleneck identification, capacity planning, and optimization + recommendations. + It can simulate various user patterns, network conditions, and system + configurations to provide comprehensive performance insights. Args: system_name: Name or identifier of the system to benchmark. Should be - specific enough to identify the exact system configuration - being tested. - metrics: List of performance metrics to measure: - - "latency": Response time and request processing delays - - "throughput": Requests per second and data processing rates - - "cpu": CPU utilization and processing efficiency - - "memory": Memory usage and allocation patterns - - "disk": Disk I/O performance and storage operations - - "network": Network bandwidth and communication overhead - - "scalability": System behavior under increasing load - - "stability": Long-term performance and reliability - duration: Benchmarking duration: - - "quick": 5-10 minutes for rapid assessment - - "standard": 30-60 minutes for comprehensive testing - - "extended": 2-4 hours for stability and endurance testing - - "continuous": Ongoing monitoring and measurement - load_profile: Type of load pattern to simulate: - - "constant": Steady, consistent load throughout test - - "realistic": Variable load mimicking real usage patterns - - "peak": High-intensity load testing for capacity limits - - "stress": Beyond-capacity testing for failure analysis - - "spike": Sudden load increases to test elasticity + specific enough to identify the exact system configuration being tested. + metrics: List of performance metrics to measure: - "latency": Response + time and request processing delays - "throughput": Requests per second + and data processing rates - "cpu": CPU utilization and processing + efficiency - "memory": Memory usage and allocation patterns - "disk": + Disk I/O performance and storage operations - "network": Network + bandwidth and communication overhead - "scalability": System behavior + under increasing load - "stability": Long-term performance and + reliability + duration: Benchmarking duration: - "quick": 5-10 minutes for rapid + assessment - "standard": 30-60 minutes for comprehensive testing - + "extended": 2-4 hours for stability and endurance testing - + "continuous": Ongoing monitoring and measurement + load_profile: Type of load pattern to simulate: - "constant": Steady, + consistent load throughout test - "realistic": Variable load mimicking + real usage patterns - "peak": High-intensity load testing for capacity + limits - "stress": Beyond-capacity testing for failure analysis - + "spike": Sudden load increases to test elasticity Returns: Dictionary containing comprehensive benchmark results: @@ -640,7 +620,6 @@ def benchmark_performance( # Create the cache analysis research assistant agent cache_analysis_agent = Agent( name="cache_analysis_assistant", - model="gemini-2.5-flash", description=""" Advanced Research and Analysis Assistant specializing in comprehensive system analysis, performance benchmarking, literature research, and test scenario generation for diff --git a/contributing/samples/cache_analysis/run_cache_experiments.py b/contributing/samples/context_management/cache_analysis/run_cache_experiments.py similarity index 99% rename from contributing/samples/cache_analysis/run_cache_experiments.py rename to contributing/samples/context_management/cache_analysis/run_cache_experiments.py index 8c561ff110..144ee1cf87 100644 --- a/contributing/samples/cache_analysis/run_cache_experiments.py +++ b/contributing/samples/context_management/cache_analysis/run_cache_experiments.py @@ -13,8 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -""" -Cache Performance Experiments for ADK Context Caching +"""Cache Performance Experiments for ADK Context Caching This script runs two experiments to compare caching performance: A. Gemini 2.0 Flash: Cache enabled vs disabled (explicit caching test) @@ -103,8 +102,7 @@ async def run_cache_comparison_experiment( reverse_order: bool = False, request_delay: float = 2.0, ) -> Dict[str, Any]: - """ - Run a cache performance comparison experiment for a specific model. + """Run a cache performance comparison experiment for a specific model. Args: model_name: Model to test (e.g., "gemini-2.5-flash") diff --git a/contributing/samples/cache_analysis/utils.py b/contributing/samples/context_management/cache_analysis/utils.py similarity index 100% rename from contributing/samples/cache_analysis/utils.py rename to contributing/samples/context_management/cache_analysis/utils.py diff --git a/contributing/samples/application_integration_agent/__init__.py b/contributing/samples/context_management/history_management/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/application_integration_agent/__init__.py rename to contributing/samples/context_management/history_management/__init__.py diff --git a/contributing/samples/history_management/agent.py b/contributing/samples/context_management/history_management/agent.py similarity index 99% rename from contributing/samples/history_management/agent.py rename to contributing/samples/context_management/history_management/agent.py index 11142386f8..78096da4be 100755 --- a/contributing/samples/history_management/agent.py +++ b/contributing/samples/context_management/history_management/agent.py @@ -88,7 +88,6 @@ async def before_model_callback( root_agent = Agent( - model='gemini-2.5-flash', name='short_history_agent', description=( 'an agent that maintains only the last turn in its context window.' diff --git a/contributing/samples/callbacks/main.py b/contributing/samples/context_management/history_management/main.py similarity index 100% rename from contributing/samples/callbacks/main.py rename to contributing/samples/context_management/history_management/main.py diff --git a/contributing/samples/artifact_save_text/__init__.py b/contributing/samples/context_management/memory/__init__.py similarity index 100% rename from contributing/samples/artifact_save_text/__init__.py rename to contributing/samples/context_management/memory/__init__.py diff --git a/contributing/samples/memory/agent.py b/contributing/samples/context_management/memory/agent.py similarity index 97% rename from contributing/samples/memory/agent.py rename to contributing/samples/context_management/memory/agent.py index 325ec0d78c..96f1d15b45 100755 --- a/contributing/samples/memory/agent.py +++ b/contributing/samples/context_management/memory/agent.py @@ -26,7 +26,6 @@ def update_current_time(callback_context: CallbackContext): root_agent = Agent( - model='gemini-2.5-flash', name='memory_agent', description='agent that have access to memory tools.', before_agent_callback=update_current_time, diff --git a/contributing/samples/memory/main.py b/contributing/samples/context_management/memory/main.py similarity index 100% rename from contributing/samples/memory/main.py rename to contributing/samples/context_management/memory/main.py diff --git a/contributing/samples/migrate_session_db/README.md b/contributing/samples/context_management/migrate_session_db/README.md similarity index 100% rename from contributing/samples/migrate_session_db/README.md rename to contributing/samples/context_management/migrate_session_db/README.md diff --git a/contributing/samples/hello_world_anthropic/__init__.py b/contributing/samples/context_management/migrate_session_db/__init__.py similarity index 100% rename from contributing/samples/hello_world_anthropic/__init__.py rename to contributing/samples/context_management/migrate_session_db/__init__.py diff --git a/contributing/samples/migrate_session_db/agent.py b/contributing/samples/context_management/migrate_session_db/agent.py similarity index 99% rename from contributing/samples/migrate_session_db/agent.py rename to contributing/samples/context_management/migrate_session_db/agent.py index a6f5aaac80..f7440fc553 100644 --- a/contributing/samples/migrate_session_db/agent.py +++ b/contributing/samples/context_management/migrate_session_db/agent.py @@ -59,7 +59,6 @@ async def check_prime(nums: list[int]) -> str: root_agent = Agent( - model="gemini-2.5-flash", name="migrate_session_db_agent", description=( "hello world agent that can roll a dice of 8 sides and check prime" diff --git a/contributing/samples/migrate_session_db/dnd_sessions.db b/contributing/samples/context_management/migrate_session_db/dnd_sessions.db similarity index 100% rename from contributing/samples/migrate_session_db/dnd_sessions.db rename to contributing/samples/context_management/migrate_session_db/dnd_sessions.db diff --git a/contributing/samples/migrate_session_db/main.py b/contributing/samples/context_management/migrate_session_db/main.py similarity index 100% rename from contributing/samples/migrate_session_db/main.py rename to contributing/samples/context_management/migrate_session_db/main.py diff --git a/contributing/samples/migrate_session_db/sample-output/alembic.ini b/contributing/samples/context_management/migrate_session_db/sample-output/alembic.ini similarity index 100% rename from contributing/samples/migrate_session_db/sample-output/alembic.ini rename to contributing/samples/context_management/migrate_session_db/sample-output/alembic.ini diff --git a/contributing/samples/migrate_session_db/sample-output/alembic/README b/contributing/samples/context_management/migrate_session_db/sample-output/alembic/README similarity index 100% rename from contributing/samples/migrate_session_db/sample-output/alembic/README rename to contributing/samples/context_management/migrate_session_db/sample-output/alembic/README diff --git a/contributing/samples/migrate_session_db/sample-output/alembic/env.py b/contributing/samples/context_management/migrate_session_db/sample-output/alembic/env.py similarity index 99% rename from contributing/samples/migrate_session_db/sample-output/alembic/env.py rename to contributing/samples/context_management/migrate_session_db/sample-output/alembic/env.py index 265b528a22..1f1a1f29ab 100644 --- a/contributing/samples/migrate_session_db/sample-output/alembic/env.py +++ b/contributing/samples/context_management/migrate_session_db/sample-output/alembic/env.py @@ -50,7 +50,6 @@ def run_migrations_offline() -> None: Calls to context.execute() here emit the given string to the script output. - """ url = config.get_main_option("sqlalchemy.url") context.configure( @@ -69,7 +68,6 @@ def run_migrations_online() -> None: In this scenario we need to create an Engine and associate a connection with the context. - """ connectable = engine_from_config( config.get_section(config.config_ini_section, {}), diff --git a/contributing/samples/migrate_session_db/sample-output/alembic/script.py.mako b/contributing/samples/context_management/migrate_session_db/sample-output/alembic/script.py.mako similarity index 100% rename from contributing/samples/migrate_session_db/sample-output/alembic/script.py.mako rename to contributing/samples/context_management/migrate_session_db/sample-output/alembic/script.py.mako diff --git a/contributing/samples/migrate_session_db/sessions.db b/contributing/samples/context_management/migrate_session_db/sessions.db similarity index 100% rename from contributing/samples/migrate_session_db/sessions.db rename to contributing/samples/context_management/migrate_session_db/sessions.db diff --git a/contributing/samples/postgres_session_service/README.md b/contributing/samples/context_management/postgres_session_service/README.md similarity index 100% rename from contributing/samples/postgres_session_service/README.md rename to contributing/samples/context_management/postgres_session_service/README.md diff --git a/contributing/samples/hello_world_gemma/__init__.py b/contributing/samples/context_management/postgres_session_service/__init__.py similarity index 100% rename from contributing/samples/hello_world_gemma/__init__.py rename to contributing/samples/context_management/postgres_session_service/__init__.py diff --git a/contributing/samples/postgres_session_service/agent.py b/contributing/samples/context_management/postgres_session_service/agent.py similarity index 97% rename from contributing/samples/postgres_session_service/agent.py rename to contributing/samples/context_management/postgres_session_service/agent.py index a00fc5ef2c..a67ebdf0a7 100644 --- a/contributing/samples/postgres_session_service/agent.py +++ b/contributing/samples/context_management/postgres_session_service/agent.py @@ -30,7 +30,6 @@ def get_current_time() -> str: root_agent = Agent( - model="gemini-2.5-flash", name="postgres_session_agent", description="A sample agent demonstrating PostgreSQL session persistence.", instruction=""" diff --git a/contributing/samples/postgres_session_service/compose.yml b/contributing/samples/context_management/postgres_session_service/compose.yml similarity index 100% rename from contributing/samples/postgres_session_service/compose.yml rename to contributing/samples/context_management/postgres_session_service/compose.yml diff --git a/contributing/samples/postgres_session_service/main.py b/contributing/samples/context_management/postgres_session_service/main.py similarity index 100% rename from contributing/samples/postgres_session_service/main.py rename to contributing/samples/context_management/postgres_session_service/main.py diff --git a/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py b/contributing/samples/context_management/rewind_session/__init__.py similarity index 100% rename from contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py rename to contributing/samples/context_management/rewind_session/__init__.py diff --git a/contributing/samples/rewind_session/agent.py b/contributing/samples/context_management/rewind_session/agent.py similarity index 98% rename from contributing/samples/rewind_session/agent.py rename to contributing/samples/context_management/rewind_session/agent.py index 53af846ec7..4628cfe38a 100644 --- a/contributing/samples/rewind_session/agent.py +++ b/contributing/samples/context_management/rewind_session/agent.py @@ -52,7 +52,6 @@ async def load_artifact(tool_context: ToolContext, filename: str) -> dict: # Create the agent root_agent = Agent( name="state_agent", - model="gemini-2.5-flash", instruction="""You are an agent that manages state and artifacts. You can: diff --git a/contributing/samples/rewind_session/main.py b/contributing/samples/context_management/rewind_session/main.py similarity index 100% rename from contributing/samples/rewind_session/main.py rename to contributing/samples/context_management/rewind_session/main.py diff --git a/contributing/samples/session_state_agent/README.md b/contributing/samples/context_management/session_state_agent/README.md similarity index 100% rename from contributing/samples/session_state_agent/README.md rename to contributing/samples/context_management/session_state_agent/README.md diff --git a/contributing/samples/bigquery/__init__.py b/contributing/samples/context_management/session_state_agent/__init__.py similarity index 100% rename from contributing/samples/bigquery/__init__.py rename to contributing/samples/context_management/session_state_agent/__init__.py diff --git a/contributing/samples/session_state_agent/agent.py b/contributing/samples/context_management/session_state_agent/agent.py similarity index 100% rename from contributing/samples/session_state_agent/agent.py rename to contributing/samples/context_management/session_state_agent/agent.py diff --git a/contributing/samples/context_management/session_state_agent/input.json b/contributing/samples/context_management/session_state_agent/input.json new file mode 100644 index 0000000000..fd09168e12 --- /dev/null +++ b/contributing/samples/context_management/session_state_agent/input.json @@ -0,0 +1,6 @@ +{ + "state": {}, + "queries": [ + "hello world!" + ] +} diff --git a/contributing/samples/static_instruction/README.md b/contributing/samples/context_management/static_instruction/README.md similarity index 100% rename from contributing/samples/static_instruction/README.md rename to contributing/samples/context_management/static_instruction/README.md diff --git a/contributing/samples/static_instruction/__init__.py b/contributing/samples/context_management/static_instruction/__init__.py similarity index 98% rename from contributing/samples/static_instruction/__init__.py rename to contributing/samples/context_management/static_instruction/__init__.py index 6dba177733..a885dd5887 100644 --- a/contributing/samples/static_instruction/__init__.py +++ b/contributing/samples/context_management/static_instruction/__init__.py @@ -1,6 +1,7 @@ """Static Instruction Test Agent Package. -This package contains a sample agent for testing static instruction functionality +This package contains a sample agent for testing static instruction +functionality and context caching optimization features. The agent demonstrates: diff --git a/contributing/samples/static_instruction/agent.py b/contributing/samples/context_management/static_instruction/agent.py similarity index 99% rename from contributing/samples/static_instruction/agent.py rename to contributing/samples/context_management/static_instruction/agent.py index fcf70b51b6..752cc8ce42 100644 --- a/contributing/samples/static_instruction/agent.py +++ b/contributing/samples/context_management/static_instruction/agent.py @@ -121,7 +121,8 @@ def eat(tool_context: ToolContext) -> str: """Feed Bingo the digital pet. Use this tool when: - - The user explicitly mentions feeding the pet (e.g., "feed Bingo", "give food", "here's a treat") + - The user explicitly mentions feeding the pet (e.g., "feed Bingo", "give + food", "here's a treat") - Bingo is very hungry or starving and asks for food directly Args: @@ -201,7 +202,6 @@ def provide_dynamic_instruction(ctx: ReadonlyContext | None = None): # Create Bingo the digital pet agent root_agent = Agent( - model="gemini-2.5-flash", name="bingo_digital_pet", description="Bingo - A lovable digital pet that needs feeding and care", # Static instruction - defines Bingo's core personality (cached) diff --git a/contributing/samples/static_instruction/main.py b/contributing/samples/context_management/static_instruction/main.py similarity index 100% rename from contributing/samples/static_instruction/main.py rename to contributing/samples/context_management/static_instruction/main.py diff --git a/contributing/samples/core/app/README.md b/contributing/samples/core/app/README.md new file mode 100644 index 0000000000..9a150af97c --- /dev/null +++ b/contributing/samples/core/app/README.md @@ -0,0 +1,91 @@ +# Application Configuration (App) + +## Overview + +This sample demonstrates how to configure an `App` in ADK. An `App` serves as the top-level container for an agentic system, wrapping a root agent or workflow and providing application-wide configurations such as plugins, event compaction, and context caching. + +## Sample Inputs + +- `Hello, who are you?` + + *The application executes `greeter_agent`. The `CountInvocationPlugin` logs the agent and LLM run counts to the console.* + +- `Can you help me plan a trip?` + + *As the conversation continues, event compaction automatically summarizes past turns every 2 invocations, while context caching optimizes token usage.* + +## Graph + +```mermaid +graph TD + User[User Input] --> AppContainer[App: app] + subgraph AppContainer [App Container] + Plugins[Plugins: CountInvocation, SaveFilesAsArtifacts] --> GreeterAgent[root_agent: greeter_agent] + GreeterAgent --> Configs[Configs: EventCompaction, ContextCache] + end + AppContainer --> Response[User Response] +``` + +## How To + +### Wrapping an Agent in an App + +To configure application-level behaviors, instantiate an `App` object and pass your root agent to the `root_agent` parameter: + +```python +from google.adk import Agent +from google.adk.apps.app import App + +root_agent = Agent( + name="greeter_agent", + instruction="You are a friendly assistant.", +) + +app = App( + name="app", + root_agent=root_agent, +) +``` + +### Configuring Application Plugins + +Plugins provide cross-cutting capabilities (such as telemetry, custom logging, or artifact saving) across the entire application. Pass a list of plugin instances to `plugins`: + +```python +from google.adk.plugins.save_files_as_artifacts_plugin import SaveFilesAsArtifactsPlugin + +app = App( + name="app", + root_agent=root_agent, + plugins=[ + CountInvocationPlugin(), + SaveFilesAsArtifactsPlugin(), + ], +) +``` + +### Configuring Event Compaction and Caching + +The `App` container is also where you define long-term session behavior and optimization strategies: + +- **`events_compaction_config`**: Manages token usage by periodically summarizing older turns in a session. +- **`context_cache_config`**: Enables prompt caching across invocations to reduce latency and cost. + +```python +from google.adk.apps.app import EventsCompactionConfig +from google.adk.agents.context_cache_config import ContextCacheConfig + +app = App( + name="app", + root_agent=root_agent, + events_compaction_config=EventsCompactionConfig( + compaction_interval=2, + overlap_size=1, + ), + context_cache_config=ContextCacheConfig( + cache_intervals=10, + ttl_seconds=1800, + min_tokens=1000, + ), +) +``` diff --git a/contributing/samples/core/app/agent.py b/contributing/samples/core/app/agent.py new file mode 100644 index 0000000000..85808b0f53 --- /dev/null +++ b/contributing/samples/core/app/agent.py @@ -0,0 +1,76 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk import Agent +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.callback_context import CallbackContext +from google.adk.agents.context_cache_config import ContextCacheConfig +from google.adk.apps.app import App +from google.adk.apps.app import EventsCompactionConfig +from google.adk.models.llm_request import LlmRequest +from google.adk.plugins.base_plugin import BasePlugin +from google.adk.plugins.save_files_as_artifacts_plugin import SaveFilesAsArtifactsPlugin + + +class CountInvocationPlugin(BasePlugin): + """A custom plugin that counts agent and LLM invocations.""" + + def __init__(self) -> None: + """Initialize the plugin with counters.""" + super().__init__(name="count_invocation") + self.agent_count: int = 0 + self.llm_request_count: int = 0 + + async def before_agent_callback( + self, *, agent: BaseAgent, callback_context: CallbackContext + ) -> None: + """Count agent runs.""" + self.agent_count += 1 + print(f"[Plugin] Agent run count: {self.agent_count}") + + async def before_model_callback( + self, *, callback_context: CallbackContext, llm_request: LlmRequest + ) -> None: + """Count LLM requests.""" + self.llm_request_count += 1 + print(f"[Plugin] LLM request count: {self.llm_request_count}") + + +root_agent = Agent( + name="greeter_agent", + instruction="""\ +You are a friendly and helpful concierge assistant. Greet the user and answer their questions. +""", +) + + +app = App( + name="app", + root_agent=root_agent, + plugins=[ + CountInvocationPlugin(), + SaveFilesAsArtifactsPlugin(), + ], + events_compaction_config=EventsCompactionConfig( + compaction_interval=2, + overlap_size=1, + ), + context_cache_config=ContextCacheConfig( + cache_intervals=10, + ttl_seconds=1800, + min_tokens=1000, + ), +) diff --git a/contributing/samples/core/app/tests/hello.json b/contributing/samples/core/app/tests/hello.json new file mode 100644 index 0000000000..9572ae3b1d --- /dev/null +++ b/contributing/samples/core/app/tests/hello.json @@ -0,0 +1,37 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Hello, who are you?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "greeter_agent", + "content": { + "parts": [ + { + "text": "Hello there! I'm a friendly and helpful concierge assistant, ready to answer your questions. My internal name is `greeter_agent`. How can I assist you today?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "greeter_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/app/tests/help_trip.json b/contributing/samples/core/app/tests/help_trip.json new file mode 100644 index 0000000000..8e2ea4696f --- /dev/null +++ b/contributing/samples/core/app/tests/help_trip.json @@ -0,0 +1,37 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Can you help me plan a trip?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "greeter_agent", + "content": { + "parts": [ + { + "text": "Hello there! I'd be absolutely delighted to help you plan your trip. To get started, I'll need a little more information.\n\nCould you tell me:\n\n1. **Where are you hoping to go?** (e.g., a specific city, country, or region)\n2. **When are you planning to travel?** (e.g., specific dates, a season, or a general time of year)\n3. **What kind of trip are you envisioning?** (e.g., a relaxing beach vacation, an adventurous hiking trip, a cultural city break, a family holiday, etc.)\n4. **Who are you traveling with?** (e.g., solo, with a partner, family with kids, friends)\n5. **Do you have any specific interests or preferences?** (e.g., food, history, art, nature, nightlife, budget considerations)\n\nThe more details you can provide, the better I can assist you in creating an amazing itinerary!" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "greeter_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/app/tests/who_are_you.json b/contributing/samples/core/app/tests/who_are_you.json new file mode 100644 index 0000000000..33111d1cb0 --- /dev/null +++ b/contributing/samples/core/app/tests/who_are_you.json @@ -0,0 +1,37 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Who are you?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "greeter_agent", + "content": { + "parts": [ + { + "text": "Hello there! I'm a friendly and helpful concierge assistant. How can I assist you today?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "greeter_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/artifacts/README.md b/contributing/samples/core/artifacts/README.md new file mode 100644 index 0000000000..4d0d498b53 --- /dev/null +++ b/contributing/samples/core/artifacts/README.md @@ -0,0 +1,54 @@ +# Artifacts Sample + +## Overview + +This sample demonstrates how to use the Artifacts feature in ADK to handle different media types (image, audio, video), formats (text, HTML), and artifact versions. Artifacts allow agents to save large pieces of data or binary files outside the main conversation history to avoid cluttering the LLM context window. The agent can then load these artifacts when needed. + +This sample showcases: + +- Generating and saving a valid **Image** (BMP). +- Generating and saving a valid **Audio** file (WAV). +- Generating and saving a valid **Video** file (MP4) using OpenCV. +- Generating reports in both **Text** and **HTML** formats. +- Automatic handling of **Artifact Versions**. + +## Sample Inputs + +- `Generate a text report about AI agents` + +- `Generate an HTML report about AI agents` + +- `Generate a dummy image artifact` + +- `Generate a dummy audio artifact` + +- `Generate a dummy video artifact` + +- `Load the latest version of the image artifact` + +## Graph + +```mermaid +graph TD + START --> artifacts_agent +``` + +## How To + +1. **Text and HTML Reports**: The `generate_report` tool allows generating reports in either `text` or `html` format. It saves the content with the appropriate MIME type (`text/plain` or `text/html`) and file extension (`.txt` or `.html`). +1. **Media Artifacts**: The `generate_media_artifact` tool demonstrates how to save binary data (image, audio, video) as artifacts using `types.Part.from_bytes` and `ctx.save_artifact`. + - **Image**: Generated manually as a valid 100x100 red BMP file using standard libraries. + - **Audio**: Generated manually as a valid 1-second sine wave WAV file using standard libraries. + - **Video**: Generated as a valid 3-second MP4 file with a moving square using OpenCV (codec `avc1` for better compatibility). +1. **Versioning**: The `generate_report` tool creates a new version of the artifact every time it is called with the same format (`text` or `html`), as it uses fixed filenames (`report.txt` or `report.html`). The version number is returned to the user. +1. **Loading Latest Version**: The standard `LoadArtifactsTool` (available as `load_artifacts` to the model) can be used to load the latest version of any artifact, including media files. + +## Dependencies + +To generate the video artifact, the sample requires `opencv-python` and `numpy`. You can install them with: + +```bash +pip install opencv-python numpy +``` + +If these libraries are not installed, the tool will return a helpful error message explaining how to install them, while image and audio generation will still work. diff --git a/contributing/samples/bigquery_mcp/__init__.py b/contributing/samples/core/artifacts/__init__.py similarity index 100% rename from contributing/samples/bigquery_mcp/__init__.py rename to contributing/samples/core/artifacts/__init__.py diff --git a/contributing/samples/core/artifacts/agent.py b/contributing/samples/core/artifacts/agent.py new file mode 100644 index 0000000000..76f80bb289 --- /dev/null +++ b/contributing/samples/core/artifacts/agent.py @@ -0,0 +1,217 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import math +import os +import struct +import tempfile +import wave + +from google.adk import Agent +from google.adk import Context +from google.adk.tools.load_artifacts_tool import LoadArtifactsTool +from google.genai import types + + +def generate_wav(filename: str): + """Generates a simple valid WAV file (a 440Hz sine wave).""" + sample_rate = 44100.0 + duration = 1.0 # seconds + frequency = 440.0 # sine wave frequency (A4) + num_samples = int(sample_rate * duration) + + with wave.open(filename, "w") as wav_file: + wav_file.setnchannels(1) + wav_file.setsampwidth(2) + wav_file.setframerate(int(sample_rate)) + for i in range(num_samples): + value = int( + 32767.0 * math.sin(2.0 * math.pi * frequency * i / sample_rate) + ) + wav_file.writeframes(struct.pack(" dict: + """Generates a report on a topic and saves it as an artifact. + + Args: + topic: The topic of the report. + ctx: The tool context for saving artifacts. + format: The format of the report ('text' or 'html'). + """ + if format.lower() == "html": + mime_type = "text/html" + filename = "report.html" + content = f""" +Report on {topic} + +

        REPORT: {topic}

        +
        +

        This is a detailed report about {topic}.

        +

        It contains a lot of useful information that would clutter the conversation history.

        +
          +
        • Key point 1
        • +
        • Key point 2
        • +
        • Key point 3
        • +
        + +""" + else: + mime_type = "text/plain" + filename = "report.txt" + content = f"""REPORT: {topic} +========================================= +This is a detailed report about {topic}. +It contains a lot of useful information that would clutter the conversation history. +- Key point 1 +- Key point 2 +- Key point 3 +""" + + version = await ctx.save_artifact( + filename, + types.Part.from_bytes(data=content.encode("utf-8"), mime_type=mime_type), + ) + return { + "message": ( + f"Report on {topic} saved as artifact '{filename}' (version" + f" {version})." + ), + "filename": filename, + "version": version, + } + + +async def generate_media_artifact(media_type: str, ctx: Context) -> dict: + """Generates a valid media artifact of specified type. + + Args: + media_type: One of 'image', 'audio', 'video'. + ctx: The tool context for saving artifacts. + """ + + with tempfile.TemporaryDirectory() as tmpdir: + if media_type == "image": + mime_type = "image/bmp" + file_path = os.path.join(tmpdir, "sample.bmp") + generate_bmp(file_path) + filename = "sample_image.bmp" + elif media_type == "audio": + mime_type = "audio/wav" + file_path = os.path.join(tmpdir, "sample.wav") + generate_wav(file_path) + filename = "sample_audio.wav" + elif media_type == "video": + mime_type = "video/mp4" + file_path = os.path.join(tmpdir, "sample.mp4") + try: + generate_video(file_path) + except (ImportError, RuntimeError) as e: + return {"error": str(e)} + filename = "sample_video.mp4" + else: + return {"error": f"Unsupported media type: {media_type}"} + + with open(file_path, "rb") as f: + data = f.read() + + version = await ctx.save_artifact( + filename, + types.Part.from_bytes(data=data, mime_type=mime_type), + ) + + return { + "message": ( + f"Media artifact '{filename}' generated and saved (version" + f" {version})." + ), + "filename": filename, + "version": version, + } + + +root_agent = Agent( + name="artifacts_agent", + tools=[generate_report, generate_media_artifact, LoadArtifactsTool()], + instruction="""You are an agent that can manage artifacts, including different media types. + + - To generate a text report, use `generate_report`. + - To generate image, audio, or video artifacts, use `generate_media_artifact`. + + When the user asks about an artifact or to load it, use `load_artifacts`. + """, +) diff --git a/contributing/samples/core/callbacks/README.md b/contributing/samples/core/callbacks/README.md new file mode 100644 index 0000000000..9b72046d02 --- /dev/null +++ b/contributing/samples/core/callbacks/README.md @@ -0,0 +1,114 @@ +# Callback Sample + +## Overview + +This sample demonstrates how to use callbacks in ADK to intercept and handle events. Specifically, it shows: + +1. **`before_tool_callback`**: Intercepts tool calls and conditionally short-circuits them. +1. **`before_model_callback`**: Intercepts requests to the LLM and conditionally short-circuits them. +1. **`after_model_callback`**: Runs after the model completes, allowing you to inspect or modify the response (e.g., appending token usage). + +## Sample Inputs + +- `What is the weather in Paris?` + + *Calls the tool normally* + +- `What is the weather in London?` + + *Intercepted by the before_tool_callback and returns a mock response* + +- `Hi` + + *Intercepted by the before_model_callback and returns a direct response* + +## How To + +### Tool Callback + +The sample defines a `before_tool_callback` function: + +```python +def before_tool_callback( + tool: BaseTool, + args: dict[str, Any], + tool_context: ToolContext, +) -> dict[str, Any] | None: + # Intercept tool calls for London and return a mocked response + if args.get("city") == "London": + return { + "result": "Weather in London is always rainy (intercepted by callback)." + } + + return None +``` + +If the function returns a dictionary with a `result` key (or any other response data), ADK uses that as the tool output and skips calling the actual tool. + +### Model Callback + +The sample also defines a `before_model_callback` function: + +```python +def before_model_callback( + callback_context: CallbackContext, + llm_request: LlmRequest, +) -> LlmResponse | None: + # Short-circuit if the user simply says "Hi" + if llm_request.contents: + last_content = llm_request.contents[-1] + if last_content.parts: + last_part = last_content.parts[-1] + if last_part.text and last_part.text.strip().lower() == "hi": + return LlmResponse( + content=types.Content( + role="model", + parts=[ + types.Part.from_text( + text="Hello from before_model callback!" + ) + ], + ) + ) + + return None +``` + +If this function returns an `LlmResponse`, ADK skips calling the LLM and returns this response to the user. + +### After Model Callback + +The sample also defines an `after_model_callback` function: + +```python +def after_model_callback( + callback_context: CallbackContext, + llm_response: LlmResponse, +) -> LlmResponse: + # Append token usage to the response text if available + if llm_response.usage_metadata: + usage = llm_response.usage_metadata + usage_text = f"\n\nafter_model_callback: [Token Usage: Input={usage.prompt_token_count}, Output={usage.candidates_token_count}]" + + if not llm_response.content: + llm_response.content = types.Content(role="model", parts=[]) + + llm_response.content.parts.append(types.Part.from_text(text=usage_text)) + + return llm_response + +``` + +This callback runs after the LLM returns a response. It checks if `usage_metadata` is available in the `llm_response`, constructs a string with input and output token counts, and appends it as a new part to the content. + +All callbacks are registered in the `Agent` constructor: + +```python +root_agent = Agent( + name="callback_demo_agent", + tools=[get_weather], + before_tool_callback=before_tool_callback, + before_model_callback=before_model_callback, + after_model_callback=after_model_callback, +) +``` diff --git a/contributing/samples/bigtable/__init__.py b/contributing/samples/core/callbacks/__init__.py similarity index 100% rename from contributing/samples/bigtable/__init__.py rename to contributing/samples/core/callbacks/__init__.py diff --git a/contributing/samples/core/callbacks/agent.py b/contributing/samples/core/callbacks/agent.py new file mode 100644 index 0000000000..f3980bf62c --- /dev/null +++ b/contributing/samples/core/callbacks/agent.py @@ -0,0 +1,118 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Any + +from google.adk.agents import Agent +from google.adk.agents.callback_context import CallbackContext +from google.adk.models.llm_request import LlmRequest +from google.adk.models.llm_response import LlmResponse +from google.adk.tools import BaseTool +from google.adk.tools import ToolContext +from google.genai import types + + +def get_weather(city: str) -> str: + return f"The weather in {city} is sunny." + + +def before_tool_callback( + tool: BaseTool, + args: dict[str, Any], + tool_context: ToolContext, +) -> dict[str, Any] | None: + """A callback that runs before a tool is called. + + Args: + tool: The tool instance being called. + args: The arguments passed to the tool. + tool_context: The context for the tool execution. + + Returns: + A dict containing the mock response if the call should be short-circuited, + or None to proceed with the actual tool call. + """ + # Intercept tool calls for London and return a mocked response + if args.get("city") == "London": + return { + "result": "Weather in London is always rainy (intercepted by callback)." + } + + return None + + +def before_model_callback( + callback_context: CallbackContext, + llm_request: LlmRequest, +) -> LlmResponse | None: + """A callback that runs before the model is called. + + Args: + callback_context: The context for the callback. + llm_request: The request that is about to be sent to the model. + + Returns: + An LlmResponse to short-circuit the model call, or None to proceed. + """ + # Short-circuit if the user simply says "Hi" + if llm_request.contents: + last_content = llm_request.contents[-1] + if last_content.parts: + last_part = last_content.parts[-1] + if last_part.text and last_part.text.strip().lower() == "hi": + return LlmResponse( + content=types.Content( + role="model", + parts=[ + types.Part.from_text( + text="Hello from before_model callback!" + ) + ], + ) + ) + + return None + + +def after_model_callback( + callback_context: CallbackContext, + llm_response: LlmResponse, +) -> LlmResponse: + """A callback that runs after the model is called.""" + if llm_response.usage_metadata: + usage = llm_response.usage_metadata + usage_text = ( + "\n\nafter_model_callback: [Token Usage:" + f" Input={usage.prompt_token_count}," + f" Output={usage.candidates_token_count}]" + ) + + if not llm_response.content: + llm_response.content = types.Content(role="model", parts=[]) + + llm_response.content.parts.append(types.Part.from_text(text=usage_text)) + print(llm_response.content) + + return llm_response + + +root_agent = Agent( + name="callback_demo_agent", + tools=[get_weather], + before_tool_callback=before_tool_callback, + before_model_callback=before_model_callback, + after_model_callback=after_model_callback, +) diff --git a/contributing/samples/core/callbacks/tests/hi.json b/contributing/samples/core/callbacks/tests/hi.json new file mode 100644 index 0000000000..32e4524d52 --- /dev/null +++ b/contributing/samples/core/callbacks/tests/hi.json @@ -0,0 +1,36 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Hi" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "callback_demo_agent", + "content": { + "parts": [ + { + "text": "Hello from before_model callback!" + } + ], + "role": "model" + }, + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "callback_demo_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/callbacks/tests/weather_in_london.json b/contributing/samples/core/callbacks/tests/weather_in_london.json new file mode 100644 index 0000000000..15a0b6090e --- /dev/null +++ b/contributing/samples/core/callbacks/tests/weather_in_london.json @@ -0,0 +1,89 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "weather in London" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "callback_demo_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "city": "London" + }, + "id": "fc-1", + "name": "get_weather" + } + }, + { + "text": "\n\nafter_model_callback: [Token Usage: Input=22, Output=5]" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "callback_demo_agent@1" + } + }, + { + "author": "callback_demo_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "get_weather", + "response": { + "result": "Weather in London is always rainy (intercepted by callback)." + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "callback_demo_agent@1" + } + }, + { + "author": "callback_demo_agent", + "content": { + "parts": [ + { + "text": "The weather in London is always rainy (intercepted by callback)." + }, + { + "text": "\n\nafter_model_callback: [Token Usage: Input=133, Output=13]" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "callback_demo_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/callbacks/tests/weather_in_sunnyvale.json b/contributing/samples/core/callbacks/tests/weather_in_sunnyvale.json new file mode 100644 index 0000000000..da6bb98c88 --- /dev/null +++ b/contributing/samples/core/callbacks/tests/weather_in_sunnyvale.json @@ -0,0 +1,89 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "weather in Sunnyvale" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "callback_demo_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "city": "Sunnyvale" + }, + "id": "fc-1", + "name": "get_weather" + } + }, + { + "text": "\n\nafter_model_callback: [Token Usage: Input=23, Output=6]" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "callback_demo_agent@1" + } + }, + { + "author": "callback_demo_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "get_weather", + "response": { + "result": "The weather in Sunnyvale is sunny." + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "callback_demo_agent@1" + } + }, + { + "author": "callback_demo_agent", + "content": { + "parts": [ + { + "text": "The weather in Sunnyvale is sunny." + }, + { + "text": "\n\nafter_model_callback: [Token Usage: Input=108, Output=8]" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "callback_demo_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/empty_agent/README.md b/contributing/samples/core/empty_agent/README.md new file mode 100644 index 0000000000..d535d12865 --- /dev/null +++ b/contributing/samples/core/empty_agent/README.md @@ -0,0 +1,30 @@ +# ADK Agent Empty Sample + +## Overview + +This sample demonstrates how to create a minimal, empty agent using the **ADK** framework. + +It defines a simple `Agent` that doesn't have any specific tools or complex instructions attached to it. This is useful as a basic template or starting point for defining more complex agentic behaviors over time, ensuring it follows the core directory requirements of `adk`. + +## Sample Inputs + +- `go` + +## Graph + +```mermaid +graph TD + empty_agent[Agent: empty_agent] +``` + +## How To + +1. Define a basic agent using the `Agent` class, specifying a unique name: + + ```python + from google.adk.agents import Agent + + root_agent = Agent( + name="empty_agent", + ) + ``` diff --git a/contributing/samples/litellm_inline_tool_call/__init__.py b/contributing/samples/core/empty_agent/__init__.py similarity index 100% rename from contributing/samples/litellm_inline_tool_call/__init__.py rename to contributing/samples/core/empty_agent/__init__.py diff --git a/contributing/samples/core/empty_agent/agent.py b/contributing/samples/core/empty_agent/agent.py new file mode 100644 index 0000000000..c782157475 --- /dev/null +++ b/contributing/samples/core/empty_agent/agent.py @@ -0,0 +1,21 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.agents import Agent + +root_agent = Agent( + name="empty_agent", +) diff --git a/contributing/samples/core/empty_agent/tests/go.json b/contributing/samples/core/empty_agent/tests/go.json new file mode 100644 index 0000000000..6eae19c48b --- /dev/null +++ b/contributing/samples/core/empty_agent/tests/go.json @@ -0,0 +1,37 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "go" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "empty_agent", + "content": { + "parts": [ + { + "text": "Okay, I'm ready! What would you like to do or talk about?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "empty_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/empty_agent/tests/hello.json b/contributing/samples/core/empty_agent/tests/hello.json new file mode 100644 index 0000000000..81c8bfd5be --- /dev/null +++ b/contributing/samples/core/empty_agent/tests/hello.json @@ -0,0 +1,37 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Hello" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "empty_agent", + "content": { + "parts": [ + { + "text": "Hello there! How can I help you today?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "empty_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/empty_agent/tests/how_are_you.json b/contributing/samples/core/empty_agent/tests/how_are_you.json new file mode 100644 index 0000000000..5242b78ec1 --- /dev/null +++ b/contributing/samples/core/empty_agent/tests/how_are_you.json @@ -0,0 +1,37 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "How are you?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "empty_agent", + "content": { + "parts": [ + { + "text": "As an AI, I don't have feelings or a physical state, so I can't be \"fine\" in the human sense. However, I'm ready and operational to help you!\n\nHow can I assist you today?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "empty_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/hello_world/README.md b/contributing/samples/core/hello_world/README.md new file mode 100644 index 0000000000..9e33186374 --- /dev/null +++ b/contributing/samples/core/hello_world/README.md @@ -0,0 +1,91 @@ +# Hello World Assistant + +## Overview + +This sample demonstrates a foundational ADK standalone agent that interacts with a user, manages session state via `ToolContext`, and uses multiple tools. Specifically, it features a `hello_world_agent` that can roll an N-sided die (storing roll history in the session state) and check whether numbers in a list are prime. + +## Sample Inputs + +- `Hi` + + *General greeting that does not trigger tool calls.* + +- `Roll a dice with 100 sides` + + *The agent invokes the `roll_die` tool with `sides=100`. The rolled result is appended to the session's `ToolContext` state under the `'rolls'` key.* + +- `Roll a dice again with 100 sides.` + + *The agent invokes `roll_die` again, appending a second roll to the session state.* + +- `What numbers did I got?` + + *The agent references the conversation history and previous tool outcomes to summarize the rolled numbers.* + +- `Roll a die with 8 sides and check if the result is prime.` + + *Demonstrates multi-step tool orchestration. The agent first calls `roll_die(sides=8)`, waits for the response, and then calls `check_prime(nums=[...])` with the rolled result before formulating its final response.* + +## Graph + +```mermaid +graph TD + Agent[Agent: hello_world_agent] --> Tool1[Tool: roll_die] + Agent --> Tool2[Tool: check_prime] +``` + +## How To + +### 1. Defining Tools with ToolContext + +Demonstrates how tools can access and modify persistent session state by including `tool_context: ToolContext` as a parameter. + +```python +def roll_die(sides: int, tool_context: ToolContext) -> int: + result = random.randint(1, sides) + if not 'rolls' in tool_context.state: + tool_context.state['rolls'] = [] + tool_context.state['rolls'] = tool_context.state['rolls'] + [result] + return result +``` + +### 2. Configuring Safety Settings + +Demonstrates adjusting `GenerateContentConfig` safety settings to prevent false alarms (e.g., avoiding harm category triggers when discussing rolling dice). + +```python +root_agent = Agent( + model='gemini-3-flash-preview', + name='hello_world_agent', + ... + generate_content_config=types.GenerateContentConfig( + safety_settings=[ + types.SafetySetting( + category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, + threshold=types.HarmBlockThreshold.OFF, + ), + ] + ), +) +``` + +### 3. Running and Inspecting the Agent Programmatically + +You can execute the agent and inspect its session state programmatically by initializing an `InMemoryRunner`, creating a session, and executing prompts asynchronously: + +```python +runner = InMemoryRunner(agent=agent.root_agent, app_name='my_app') +session = await runner.session_service.create_session('my_app', 'user1') + +async for event in runner.run_async( + user_id='user1', + session_id=session.id, + new_message=types.Content(...), +): + # Process execution events + pass + +# Inspect modified session state +session = await runner.session_service.get_session('my_app', 'user1', session.id) +print(session.state['rolls']) +``` diff --git a/contributing/samples/built_in_multi_tools/__init__.py b/contributing/samples/core/hello_world/__init__.py similarity index 100% rename from contributing/samples/built_in_multi_tools/__init__.py rename to contributing/samples/core/hello_world/__init__.py diff --git a/contributing/samples/hello_world/agent.py b/contributing/samples/core/hello_world/agent.py old mode 100755 new mode 100644 similarity index 99% rename from contributing/samples/hello_world/agent.py rename to contributing/samples/core/hello_world/agent.py index d5cfc3ef5f..9912c248bf --- a/contributing/samples/hello_world/agent.py +++ b/contributing/samples/core/hello_world/agent.py @@ -65,7 +65,6 @@ async def check_prime(nums: list[int]) -> str: root_agent = Agent( - model='gemini-3-flash-preview', name='hello_world_agent', description=( 'hello world agent that can roll a dice of 8 sides and check prime' diff --git a/contributing/samples/core/hello_world/tests/check_prime.json b/contributing/samples/core/hello_world/tests/check_prime.json new file mode 100644 index 0000000000..2f8280d795 --- /dev/null +++ b/contributing/samples/core/hello_world/tests/check_prime.json @@ -0,0 +1,86 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Check if 7 and 10 are prime numbers" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "hello_world_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "nums": [ + 7, + 10 + ] + }, + "id": "fc-1", + "name": "check_prime" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "hello_world_agent@1" + } + }, + { + "author": "hello_world_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "check_prime", + "response": { + "result": "7 are prime numbers." + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "hello_world_agent@1" + } + }, + { + "author": "hello_world_agent", + "content": { + "parts": [ + { + "text": "7 are prime numbers." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "hello_world_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/hello_world/tests/roll_and_check.json b/contributing/samples/core/hello_world/tests/roll_and_check.json new file mode 100644 index 0000000000..c734bac921 --- /dev/null +++ b/contributing/samples/core/hello_world/tests/roll_and_check.json @@ -0,0 +1,138 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Roll a 10-sided die and check if the result is prime" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "hello_world_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "sides": 10 + }, + "id": "fc-1", + "name": "roll_die" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "hello_world_agent@1" + } + }, + { + "actions": { + "stateDelta": { + "rolls": [ + 2 + ] + } + }, + "author": "hello_world_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "roll_die", + "response": { + "result": 2 + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "hello_world_agent@1" + } + }, + { + "author": "hello_world_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "nums": [ + 2 + ] + }, + "id": "fc-2", + "name": "check_prime" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "hello_world_agent@1" + } + }, + { + "author": "hello_world_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "check_prime", + "response": { + "result": "2 are prime numbers." + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "hello_world_agent@1" + } + }, + { + "author": "hello_world_agent", + "content": { + "parts": [ + { + "text": "I rolled a 10-sided die and got a 2.\n2 are prime numbers." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "hello_world_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/hello_world/tests/roll_die.json b/contributing/samples/core/hello_world/tests/roll_die.json new file mode 100644 index 0000000000..13354fa849 --- /dev/null +++ b/contributing/samples/core/hello_world/tests/roll_die.json @@ -0,0 +1,95 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Roll a 6-sided die" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "hello_world_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "sides": 6 + }, + "id": "fc-1", + "name": "roll_die" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "hello_world_agent@1" + } + }, + { + "actions": { + "stateDelta": { + "rolls": [ + 6 + ] + } + }, + "author": "hello_world_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "roll_die", + "response": { + "result": 6 + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "hello_world_agent@1" + } + }, + { + "author": "hello_world_agent", + "content": { + "parts": [ + { + "text": "You rolled a 6-sided die and got a 6." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "hello_world_agent@1" + } + } + ], + "mocks": { + "random.randint": [ + 6 + ] + } +} diff --git a/contributing/samples/core/input_output_schema/README.md b/contributing/samples/core/input_output_schema/README.md new file mode 100644 index 0000000000..68e8b7c1fe --- /dev/null +++ b/contributing/samples/core/input_output_schema/README.md @@ -0,0 +1,54 @@ +# Input and Output Schema + +## Overview + +This sample demonstrates how to configure structured `input_schema` and `output_schema` on an ADK agent. When configured with these schemas and `mode='single_turn'`, the agent can be seamlessly used as a structured tool by a parent agent. + +## Sample Inputs + +- `What is the weather in San Jose?` + + *The parent agent calls `weather_agent` with `{"city": "San Jose"}`. The sub-agent returns `{"temperature": "26 C", "conditions": "Sunny"}`. The parent agent then formulates a friendly response.* + +- `Can you check the weather for Cupertino?` + + *The parent agent calls `weather_agent` with `{"city": "Cupertino"}`. The sub-agent returns `{"temperature": "16 C", "conditions": "Foggy"}`.* + +## Graph + +```mermaid +graph TD + User[User Input] --> RootAgent[root_agent] + RootAgent -- Tool Call: CityQuery --> WeatherAgent[weather_agent] + WeatherAgent -- Structured Output: WeatherInfo --> RootAgent + RootAgent --> Response[User Response] +``` + +## How To + +### Configuring Input and Output Schemas + +To define structured input and output contracts for an agent, pass Pydantic models to the `input_schema` and `output_schema` parameters of the `Agent` constructor: + +```python +class CityQuery(BaseModel): + city: str = Field(description="The name of the city") + +class WeatherInfo(BaseModel): + temperature: str = Field(description="The temperature in Celsius") + conditions: str = Field(description="The weather condition") + +weather_agent = Agent( + name="weather_agent", + mode="single_turn", + input_schema=CityQuery, + output_schema=WeatherInfo, + instruction="Provide weather information for the requested city.", +) +``` + +### Using the Agent as a Tool + +When `weather_agent` is included in the `sub_agents` list of `root_agent`, the ADK framework automatically wraps it in an `AgentTool`. The parent agent sees a tool that accepts `CityQuery` parameters and returns `WeatherInfo`. + +When the tool is invoked, the framework executes `weather_agent` in an isolated context, validates its input against `input_schema`, and validates its generated response against `output_schema`. diff --git a/contributing/samples/core/input_output_schema/agent.py b/contributing/samples/core/input_output_schema/agent.py new file mode 100644 index 0000000000..0c782aa20f --- /dev/null +++ b/contributing/samples/core/input_output_schema/agent.py @@ -0,0 +1,53 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk import Agent +from pydantic import BaseModel +from pydantic import Field + + +class CityQuery(BaseModel): + city: str = Field( + description='The name of the city to query weather for, e.g. San Jose' + ) + + +class WeatherInfo(BaseModel): + temperature: str = Field(description='The temperature in Celsius') + conditions: str = Field(description='The weather condition, e.g. Sunny') + + +weather_agent = Agent( + name='weather_agent', + mode='single_turn', + input_schema=CityQuery, + output_schema=WeatherInfo, + instruction="""\ +Provide weather information for the requested city. + +For San Jose, return temperature: 26 C, conditions: Sunny. +For Cupertino, return temperature: 16 C, conditions: Foggy. +For any other city, return temperature: unknown, conditions: unknown. +""", +) + +root_agent = Agent( + name='root_agent', + instruction="""\ +You are a helpful weather concierge assistant. Use the weather_agent tool to get weather information for the user's city, and then answer the user in a friendly manner. +""", + sub_agents=[weather_agent], +) diff --git a/contributing/samples/core/input_output_schema/tests/weather_cupertino.json b/contributing/samples/core/input_output_schema/tests/weather_cupertino.json new file mode 100644 index 0000000000..a036ca8fb7 --- /dev/null +++ b/contributing/samples/core/input_output_schema/tests/weather_cupertino.json @@ -0,0 +1,106 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What is the weather in Cupertino?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "city": "Cupertino" + }, + "id": "fc-1", + "name": "weather_agent" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "weather_agent", + "branch": "weather_agent@1", + "content": { + "parts": [ + { + "text": "{\"temperature\": \"16 C\", \"conditions\": \"Foggy\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/weather_agent@1" + ], + "path": "root_agent@1/weather_agent@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "weather_agent", + "response": { + "conditions": "Foggy", + "temperature": "16 C" + } + } + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "The weather in Cupertino is Foggy with a temperature of 16 C.\n" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/input_output_schema/tests/weather_sanjose.json b/contributing/samples/core/input_output_schema/tests/weather_sanjose.json new file mode 100644 index 0000000000..8b76e47add --- /dev/null +++ b/contributing/samples/core/input_output_schema/tests/weather_sanjose.json @@ -0,0 +1,106 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What is the weather in San Jose?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "city": "San Jose" + }, + "id": "fc-1", + "name": "weather_agent" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "weather_agent", + "branch": "weather_agent@1", + "content": { + "parts": [ + { + "text": "{\"temperature\": \"26 C\", \"conditions\": \"Sunny\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/weather_agent@1" + ], + "path": "root_agent@1/weather_agent@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "weather_agent", + "response": { + "conditions": "Sunny", + "temperature": "26 C" + } + } + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "The weather in San Jose is sunny with a temperature of 26 degrees Celsius. Enjoy your day!" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/input_output_schema/tests/weather_tokyo.json b/contributing/samples/core/input_output_schema/tests/weather_tokyo.json new file mode 100644 index 0000000000..e531c244ab --- /dev/null +++ b/contributing/samples/core/input_output_schema/tests/weather_tokyo.json @@ -0,0 +1,106 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What is the weather in Tokyo?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "city": "Tokyo" + }, + "id": "fc-1", + "name": "weather_agent" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "weather_agent", + "branch": "weather_agent@1", + "content": { + "parts": [ + { + "text": "{\"temperature\": \"unknown\", \"conditions\": \"unknown\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/weather_agent@1" + ], + "path": "root_agent@1/weather_agent@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "weather_agent", + "response": { + "conditions": "unknown", + "temperature": "unknown" + } + } + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "I'm sorry, I don't have the current weather information for Tokyo." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/logprobs/README.md b/contributing/samples/core/logprobs/README.md new file mode 100644 index 0000000000..b149cf1506 --- /dev/null +++ b/contributing/samples/core/logprobs/README.md @@ -0,0 +1,78 @@ +# Log Probabilities Demo Agent + +## Overview + +This sample demonstrates how to access and display log probabilities from language model responses using the `avg_logprobs` and `logprobs_result` fields in `LlmResponse`. It shows how to configure an ADK agent to request log probabilities and how to use an `after_model_callback` to analyze and append confidence metrics to the response. + +## Sample Inputs + +- `What is the capital of France?` + + *A factual, straightforward question. The agent will answer confidently (e.g., "Paris"), resulting in a high average log probability and confidence score near 100%.* + +- `What are the philosophical implications of artificial consciousness?` + + *A complex, open-ended question. The agent will provide a nuanced answer with varied vocabulary, resulting in a lower average log probability and medium/low confidence score.* + +## Graph + +```mermaid +graph TD + User[User Input] --> RootAgent[root_agent: logprobs_demo_agent] + RootAgent --> Callback[after_model_callback: append_logprobs_to_response] + Callback -- Appended Logprobs Analysis --> Response[User Response] +``` + +## How To + +### 1. Enabling Log Probabilities + +To enable log probability collection, configure `generate_content_config` on the `Agent` using `types.GenerateContentConfig`: + +```python +from google.genai import types + +root_agent = Agent( + name="logprobs_demo_agent", + generate_content_config=types.GenerateContentConfig( + response_logprobs=True, # Enable log probability collection + logprobs=5, # Collect top 5 alternatives for analysis + temperature=0.7, + ), + after_model_callback=append_logprobs_to_response, +) +``` + +### 2. Extracting Log Probabilities in a Callback + +The `after_model_callback` receives the `LlmResponse` object, which contains the `avg_logprobs` and `logprobs_result` fields. You can use this data for confidence analysis, quality filtering, or appending information to the response content: + +```python +async def append_logprobs_to_response( + callback_context: CallbackContext, llm_response: LlmResponse +) -> LlmResponse: + if llm_response.avg_logprobs is not None: + print(f"📊 Average log probability: {llm_response.avg_logprobs:.4f}") + + # Analyze confidence + confidence_level = ( + "High" if llm_response.avg_logprobs >= -0.5 + else "Medium" if llm_response.avg_logprobs >= -1.0 + else "Low" + ) + + # Access detailed candidates + if llm_response.logprobs_result and llm_response.logprobs_result.top_candidates: + num_candidates = len(llm_response.logprobs_result.top_candidates) + + return llm_response +``` + +### 3. Understanding Log Probabilities + +- **Range**: -∞ to 0 (0 = 100% confident, -1 ≈ 37% confident, -2 ≈ 14% confident) +- **Confidence Levels**: + - **High**: `>= -0.5` (typically factual, straightforward responses) + - **Medium**: `-1.0` to `-0.5` (reasonably confident responses) + - **Low**: `< -1.0` (uncertain or complex responses) +- **Use Cases**: Quality control, uncertainty detection, and response filtering. diff --git a/contributing/samples/callbacks/__init__.py b/contributing/samples/core/logprobs/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/callbacks/__init__.py rename to contributing/samples/core/logprobs/__init__.py diff --git a/contributing/samples/logprobs/agent.py b/contributing/samples/core/logprobs/agent.py similarity index 84% rename from contributing/samples/logprobs/agent.py rename to contributing/samples/core/logprobs/agent.py index a281a7480f..1c6e7a2ec6 100644 --- a/contributing/samples/logprobs/agent.py +++ b/contributing/samples/core/logprobs/agent.py @@ -43,9 +43,13 @@ async def append_logprobs_to_response( # Build log probability analysis if llm_response.avg_logprobs is None: print("⚠️ No log probability data available") - logprobs_info = ( - "\n\n[LOG PROBABILITY ANALYSIS]\n⚠️ No log probability data available" - ) + logprobs_info = """ + +--- + +### 📊 Log Probability Analysis + +⚠️ *No log probability data available*""" else: print(f"📊 Average log probability: {llm_response.avg_logprobs:.4f}") @@ -60,10 +64,13 @@ async def append_logprobs_to_response( logprobs_info = f""" -[LOG PROBABILITY ANALYSIS] -📊 Average Log Probability: {llm_response.avg_logprobs:.4f} -🎯 Confidence Level: {confidence_level} -📈 Confidence Score: {100 * (2 ** llm_response.avg_logprobs):.1f}%""" +--- + +### 📊 Log Probability Analysis + +* **Average Log Probability**: {llm_response.avg_logprobs:.4f} +* **Confidence Level**: {confidence_level} +* **Confidence Score**: {100 * (2 ** llm_response.avg_logprobs):.1f}%""" # Optionally include detailed logprobs_result information if ( @@ -71,20 +78,24 @@ async def append_logprobs_to_response( and llm_response.logprobs_result.top_candidates ): logprobs_info += ( - "\n🔍 Top alternatives analyzed:" + "\n* **Top Alternatives Analyzed**:" f" {len(llm_response.logprobs_result.top_candidates)}" ) # Append logprobs analysis to the response if llm_response.content and llm_response.content.parts: - llm_response.content.parts.append(types.Part(text=logprobs_info)) + if not any( + "### 📊 Log Probability Analysis" in p.text + for p in llm_response.content.parts + if p.text + ): + llm_response.content.parts.append(types.Part(text=logprobs_info)) return llm_response # Create a simple agent that demonstrates logprobs usage root_agent = Agent( - model="gemini-2.5-flash", name="logprobs_demo_agent", description=( "A simple agent that demonstrates log probability extraction and" diff --git a/contributing/samples/core/logprobs/tests/hello.json b/contributing/samples/core/logprobs/tests/hello.json new file mode 100644 index 0000000000..d68ed085f5 --- /dev/null +++ b/contributing/samples/core/logprobs/tests/hello.json @@ -0,0 +1,40 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Hello" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "logprobs_demo_agent", + "content": { + "parts": [ + { + "text": "Hello there! How can I help you today?" + }, + { + "text": "\n\n---\n\n### \ud83d\udcca Log Probability Analysis\n\n* **Average Log Probability**: -0.1564\n* **Confidence Level**: High\n* **Confidence Score**: 89.7%\n* **Top Alternatives Analyzed**: 10" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "logprobs_demo_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/logprobs/tests/tell_joke.json b/contributing/samples/core/logprobs/tests/tell_joke.json new file mode 100644 index 0000000000..514e1e965d --- /dev/null +++ b/contributing/samples/core/logprobs/tests/tell_joke.json @@ -0,0 +1,40 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Tell me a joke" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "logprobs_demo_agent", + "content": { + "parts": [ + { + "text": "Why don't scientists trust atoms?\n\nBecause they make up everything!" + }, + { + "text": "\n\n---\n\n### \ud83d\udcca Log Probability Analysis\n\n* **Average Log Probability**: -0.4411\n* **Confidence Level**: High\n* **Confidence Score**: 73.7%\n* **Top Alternatives Analyzed**: 15" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "logprobs_demo_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/logprobs/tests/what_is_ai.json b/contributing/samples/core/logprobs/tests/what_is_ai.json new file mode 100644 index 0000000000..2c31a79987 --- /dev/null +++ b/contributing/samples/core/logprobs/tests/what_is_ai.json @@ -0,0 +1,40 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What is AI?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "logprobs_demo_agent", + "content": { + "parts": [ + { + "text": "Artificial Intelligence (AI) refers to the simulation of human intelligence processes by machines, especially computer systems. These processes include learning (the acquisition of information and rules for using the information), reasoning (using rules to reach approximate or definite conclusions), and self-correction.\n\nThe ultimate goal of AI is to enable machines to perform tasks that typically require human intelligence, such as understanding natural language, recognizing patterns, solving problems, making decisions, and even learning from experience." + }, + { + "text": "\n\n---\n\n### \ud83d\udcca Log Probability Analysis\n\n* **Average Log Probability**: -0.1382\n* **Confidence Level**: High\n* **Confidence Score**: 90.9%\n* **Top Alternatives Analyzed**: 92" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "logprobs_demo_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/quickstart/README.md b/contributing/samples/core/quickstart/README.md new file mode 100644 index 0000000000..4d66f248c8 --- /dev/null +++ b/contributing/samples/core/quickstart/README.md @@ -0,0 +1,81 @@ +# Weather & Time Quickstart Agent + +## Overview + +This sample demonstrates a fundamental standalone ADK `Agent` configured with multiple tools. It illustrates how an agent can autonomously select and execute Python functions (`get_weather` and `get_current_time`) to gather real-world information and answer user inquiries. + +## Sample Inputs + +- `What is the weather in New York?` + + *The agent will invoke the `get_weather` tool with `city="New York"` and return the current weather report.* + +- `What time is it in New York?` + + *The agent will invoke the `get_current_time` tool with `city="New York"` and return the current timestamp.* + +- `Can you tell me the weather in Tokyo?` + + *The agent will attempt to invoke `get_weather`, which returns an error status for cities other than New York, and gracefully explain that the information is unavailable.* + +## Graph + +```mermaid +graph TD + User[User Input] --> RootAgent[root_agent: weather_time_agent] + RootAgent -.->|Tool Call: get_weather| WeatherTool[get_weather] + WeatherTool -.->|Tool Result| RootAgent + RootAgent -.->|Tool Call: get_current_time| TimeTool[get_current_time] + TimeTool -.->|Tool Result| RootAgent + RootAgent --> Response[User Response] +``` + +## How To + +### 1. Defining Tools + +In ADK, standard Python functions with type hints and docstrings can be used directly as tools. The docstring and parameter type hints inform the language model when and how to invoke the function: + +```python +def get_weather(city: str) -> dict: + """Retrieves the current weather report for a specified city. + + Args: + city (str): The name of the city for which to retrieve the weather report. + + Returns: + dict: status and result or error msg. + """ + if city.lower() == "new york": + return { + "status": "success", + "report": ( + "The weather in New York is sunny with a temperature of 25 degrees" + " Celsius (77 degrees Fahrenheit)." + ), + } + else: + return { + "status": "error", + "error_message": f"Weather information for '{city}' is not available.", + } +``` + +### 2. Configuring the Agent + +To equip an agent with tools, instantiate an `Agent` and pass the functions in the `tools` parameter list, along with clear instructions and description: + +```python +from google.adk.agents.llm_agent import Agent + +root_agent = Agent( + name="weather_time_agent", + description=( + "Agent to answer questions about the time and weather in a city." + ), + instruction=( + "I can answer your questions about the time and weather in a city." + ), + tools=[get_weather, get_current_time], +) +``` diff --git a/contributing/samples/code_execution/__init__.py b/contributing/samples/core/quickstart/__init__.py similarity index 100% rename from contributing/samples/code_execution/__init__.py rename to contributing/samples/core/quickstart/__init__.py diff --git a/contributing/samples/quickstart/agent.py b/contributing/samples/core/quickstart/agent.py similarity index 91% rename from contributing/samples/quickstart/agent.py rename to contributing/samples/core/quickstart/agent.py index c183429fee..8042d0f25f 100644 --- a/contributing/samples/quickstart/agent.py +++ b/contributing/samples/core/quickstart/agent.py @@ -49,8 +49,17 @@ def get_current_time(city: str) -> dict: dict: status and result or error msg. """ import datetime + import os from zoneinfo import ZoneInfo + if "PYTEST_CURRENT_TEST" in os.environ: + return { + "status": "success", + "report": ( + "The current time in New York is 2026-05-15 12:00:00 EDT-0400" + ), + } + if city.lower() == "new york": tz_identifier = "America/New_York" else: @@ -71,7 +80,6 @@ def get_current_time(city: str) -> dict: root_agent = Agent( name="weather_time_agent", - model="gemini-2.5-flash", description=( "Agent to answer questions about the time and weather in a city." ), diff --git a/contributing/samples/core/quickstart/tests/time_ny.json b/contributing/samples/core/quickstart/tests/time_ny.json new file mode 100644 index 0000000000..01fcb6635d --- /dev/null +++ b/contributing/samples/core/quickstart/tests/time_ny.json @@ -0,0 +1,84 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What time is it in New York?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "weather_time_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "city": "New York" + }, + "id": "fc-1", + "name": "get_current_time" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "weather_time_agent@1" + } + }, + { + "author": "weather_time_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "get_current_time", + "response": { + "report": "The current time in New York is 2026-05-15 12:00:00 EDT-0400", + "status": "success" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "weather_time_agent@1" + } + }, + { + "author": "weather_time_agent", + "content": { + "parts": [ + { + "text": "The current time in New York is 2026-05-15 12:00:00 EDT-0400." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "weather_time_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/quickstart/tests/weather_ny.json b/contributing/samples/core/quickstart/tests/weather_ny.json new file mode 100644 index 0000000000..98fd351fcf --- /dev/null +++ b/contributing/samples/core/quickstart/tests/weather_ny.json @@ -0,0 +1,84 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What is the weather in New York?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "weather_time_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "city": "New York" + }, + "id": "fc-1", + "name": "get_weather" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "weather_time_agent@1" + } + }, + { + "author": "weather_time_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "get_weather", + "response": { + "report": "The weather in New York is sunny with a temperature of 25 degrees Celsius (77 degrees Fahrenheit).", + "status": "success" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "weather_time_agent@1" + } + }, + { + "author": "weather_time_agent", + "content": { + "parts": [ + { + "text": "The weather in New York is sunny with a temperature of 25 degrees Celsius (77 degrees Fahrenheit)." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "weather_time_agent@1" + } + } + ] +} diff --git a/contributing/samples/core/quickstart/tests/weather_time_ny.json b/contributing/samples/core/quickstart/tests/weather_time_ny.json new file mode 100644 index 0000000000..df5612e7ff --- /dev/null +++ b/contributing/samples/core/quickstart/tests/weather_time_ny.json @@ -0,0 +1,103 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What is the weather and time in New York?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "weather_time_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "city": "New York" + }, + "id": "fc-1", + "name": "get_weather" + } + }, + { + "functionCall": { + "args": { + "city": "New York" + }, + "id": "fc-2", + "name": "get_current_time" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "weather_time_agent@1" + } + }, + { + "author": "weather_time_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "get_weather", + "response": { + "report": "The weather in New York is sunny with a temperature of 25 degrees Celsius (77 degrees Fahrenheit).", + "status": "success" + } + } + }, + { + "functionResponse": { + "id": "fc-2", + "name": "get_current_time", + "response": { + "report": "The current time in New York is 2026-05-15 12:00:00 EDT-0400", + "status": "success" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "weather_time_agent@1" + } + }, + { + "author": "weather_time_agent", + "content": { + "parts": [ + { + "text": "The weather in New York is sunny with a temperature of 25 degrees Celsius (77 degrees Fahrenheit). The current time in New York is 2026-05-15 12:00:00 EDT-0400." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "weather_time_agent@1" + } + } + ] +} diff --git a/contributing/samples/runner_debug_example/README.md b/contributing/samples/core/runner_debug_example/README.md similarity index 97% rename from contributing/samples/runner_debug_example/README.md rename to contributing/samples/core/runner_debug_example/README.md index 45d2bf76ed..dbb94ceee7 100644 --- a/contributing/samples/runner_debug_example/README.md +++ b/contributing/samples/core/runner_debug_example/README.md @@ -14,7 +14,7 @@ The `run_debug()` method reduces agent interaction boilerplate from 7-8 lines to ## Files Included -- `agent.py` - Agent with 2 tools: weather and calculate +- `agent.py` - Agent with 2 tools: weather and stock price - `main.py` - 8 examples demonstrating all features - `README.md` - This documentation @@ -64,7 +64,7 @@ The `run_debug()` method properly displays all ADK part types: The example agent includes 2 tools to demonstrate tool handling: 1. **`get_weather(city)`** - Returns mock weather data for major cities -1. **`calculate(expression)`** - Evaluates mathematical expressions safely +1. **`get_stock_price(ticker)`** - Returns mock stock prices for major tech companies ## Key Benefits diff --git a/contributing/samples/runner_debug_example/__init__.py b/contributing/samples/core/runner_debug_example/__init__.py similarity index 100% rename from contributing/samples/runner_debug_example/__init__.py rename to contributing/samples/core/runner_debug_example/__init__.py diff --git a/contributing/samples/runner_debug_example/agent.py b/contributing/samples/core/runner_debug_example/agent.py similarity index 54% rename from contributing/samples/runner_debug_example/agent.py rename to contributing/samples/core/runner_debug_example/agent.py index 620e1b2745..35b674e9fd 100644 --- a/contributing/samples/runner_debug_example/agent.py +++ b/contributing/samples/core/runner_debug_example/agent.py @@ -50,65 +50,28 @@ def get_weather(city: str, tool_context: ToolContext) -> str: ) -def calculate(expression: str) -> str: - """Safely evaluate a mathematical expression. +def get_stock_price(ticker: str) -> str: + """Get the current stock price for a given ticker symbol. This tool demonstrates how function calls are displayed in run_debug(). Args: - expression: Mathematical expression to evaluate. + ticker: Stock ticker symbol (e.g., GOOGL, AAPL, MSFT). Returns: - Result of the calculation as a string. + Stock price information as a string. """ - import ast - import operator - - # Supported operators for safe evaluation - operators = { - ast.Add: operator.add, - ast.Sub: operator.sub, - ast.Mult: operator.mul, - ast.Div: operator.truediv, - ast.Pow: operator.pow, - ast.USub: operator.neg, + prices = { + "GOOGL": "175.50 USD", + "AAPL": "225.00 USD", + "MSFT": "420.00 USD", + "AMZN": "190.00 USD", + "NVDA": "125.00 USD", } - - def _eval(node): - """Recursively evaluate an AST node.""" - if isinstance(node, ast.Expression): - return _eval(node.body) - elif isinstance(node, ast.Constant): # Python 3.8+ - return node.value - elif isinstance(node, ast.Num): # For older Python versions - return node.n - elif isinstance(node, ast.BinOp): - op = operators.get(type(node.op)) - if op: - return op(_eval(node.left), _eval(node.right)) - else: - raise ValueError(f"Unsupported operation: {type(node.op).__name__}") - elif isinstance(node, ast.UnaryOp): - op = operators.get(type(node.op)) - if op: - return op(_eval(node.operand)) - else: - raise ValueError(f"Unsupported operation: {type(node.op).__name__}") - else: - raise ValueError(f"Unsupported expression type: {type(node).__name__}") - - try: - # Parse the expression into an AST - tree = ast.parse(expression, mode="eval") - # Safely evaluate the AST - result = _eval(tree) - return f"Result: {result}" - except (SyntaxError, ValueError) as e: - return f"Error: {str(e)}" - except ZeroDivisionError: - return "Error: Division by zero" - except Exception as e: - return f"Error: {str(e)}" + ticker = ticker.upper() + if ticker in prices: + return f"Price for {ticker}: {prices[ticker]}" + return f"Stock ticker {ticker} not found in database." root_agent = Agent( @@ -117,11 +80,11 @@ def _eval(node): description="A helpful assistant demonstrating run_debug() helper method", instruction="""You are a helpful assistant that can: 1. Provide weather information for major cities - 2. Perform mathematical calculations + 2. Provide stock prices for major tech companies 3. Remember previous queries in the conversation When users ask about weather, use the get_weather tool. - When users ask for calculations, use the calculate tool. + When users ask for stock prices, use the get_stock_price tool. Be friendly and conversational.""", - tools=[get_weather, calculate], + tools=[get_weather, get_stock_price], ) diff --git a/contributing/samples/runner_debug_example/main.py b/contributing/samples/core/runner_debug_example/main.py similarity index 94% rename from contributing/samples/runner_debug_example/main.py rename to contributing/samples/core/runner_debug_example/main.py index 2fa8461f58..783a896bc4 100644 --- a/contributing/samples/runner_debug_example/main.py +++ b/contributing/samples/core/runner_debug_example/main.py @@ -47,7 +47,7 @@ async def example_multiple_messages(): "Hi there!", "What's the weather in Tokyo?", "How about New York?", - "Calculate 15 * 7 + 3", + "What's the stock price of GOOGL?", ]) @@ -91,7 +91,7 @@ async def example_separate_sessions(): # Bob's session (separate) print("\n-- Bob's session --") await runner.run_debug( - "Calculate 100 / 5", user_id="bob", session_id="bob_debug" + "What is the price of AAPL?", user_id="bob", session_id="bob_debug" ) # Continue Alice's session @@ -115,7 +115,7 @@ async def example_with_tools(): # Without verbose: Only shows final agent responses await runner.run_debug([ "What's the weather in Tokyo?", - "Calculate (42 * 3.14) + 10", + "Check MSFT stock price", ]) print("\n-- With verbose=True - Detailed output --") @@ -123,7 +123,7 @@ async def example_with_tools(): await runner.run_debug( [ "What's the weather in Paris?", - "Calculate 100 / 5", + "What's the stock price of NVDA?", ], verbose=True, ) @@ -139,7 +139,7 @@ async def example_capture_events(): # Capture events without printing for inspection events = await runner.run_debug( - ["Get weather for London", "Calculate 42 * 3.14"], + ["Get weather for London", "Get stock price of AMZN"], quiet=True, ) @@ -245,8 +245,11 @@ async def main(): print("\nHow different part types appear:") print(" Text: agent > Hello world (always shown)") print("\nWith verbose=True only:") - print(" Tool call: agent > [Calling tool: calculate({'expression': '2+2'})]") - print(" Tool result: agent > [Tool result: Result: 4]") + print( + " Tool call: agent > [Calling tool: get_stock_price({'ticker':" + " 'GOOGL'})]" + ) + print(" Tool result: agent > [Tool result: Price for GOOGL: 175.50 USD]") print("\nNote: When models have code execution enabled (verbose=True):") print(" Code exec: agent > [Executing python code...]") print(" Code output: agent > [Code output: Result: 42]") diff --git a/contributing/samples/core/runner_debug_example/tests/stock_googl.json b/contributing/samples/core/runner_debug_example/tests/stock_googl.json new file mode 100644 index 0000000000..5337530c5a --- /dev/null +++ b/contributing/samples/core/runner_debug_example/tests/stock_googl.json @@ -0,0 +1,83 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What's the stock price of GOOGL?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "ticker": "GOOGL" + }, + "id": "fc-1", + "name": "get_stock_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "agent@1" + } + }, + { + "author": "agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "get_stock_price", + "response": { + "result": "Price for GOOGL: 175.50 USD" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "agent@1" + } + }, + { + "author": "agent", + "content": { + "parts": [ + { + "text": "The current stock price for GOOGL is 175.50 USD." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "agent@1" + } + } + ] +} diff --git a/contributing/samples/core/runner_debug_example/tests/stock_nvda.json b/contributing/samples/core/runner_debug_example/tests/stock_nvda.json new file mode 100644 index 0000000000..d285358dea --- /dev/null +++ b/contributing/samples/core/runner_debug_example/tests/stock_nvda.json @@ -0,0 +1,83 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What's the stock price of NVDA?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "ticker": "NVDA" + }, + "id": "fc-1", + "name": "get_stock_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "agent@1" + } + }, + { + "author": "agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "get_stock_price", + "response": { + "result": "Price for NVDA: 125.00 USD" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "agent@1" + } + }, + { + "author": "agent", + "content": { + "parts": [ + { + "text": "The current stock price for NVDA is 125.00 USD." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "agent@1" + } + } + ] +} diff --git a/contributing/samples/core/runner_debug_example/tests/weather_sf.json b/contributing/samples/core/runner_debug_example/tests/weather_sf.json new file mode 100644 index 0000000000..0f26d51b4d --- /dev/null +++ b/contributing/samples/core/runner_debug_example/tests/weather_sf.json @@ -0,0 +1,90 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What is the weather in San Francisco?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "city": "San Francisco" + }, + "id": "fc-1", + "name": "get_weather" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "agent@1" + } + }, + { + "actions": { + "stateDelta": { + "weather_queries": [ + "San Francisco" + ] + } + }, + "author": "agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "get_weather", + "response": { + "result": "Foggy, 15\u00b0C (59\u00b0F)" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "agent@1" + } + }, + { + "author": "agent", + "content": { + "parts": [ + { + "text": "The weather in San Francisco is foggy, with a temperature of 15\u00b0C (59\u00b0F). Is there anything else I can help you with?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "agent@1" + } + } + ] +} diff --git a/contributing/samples/local_environment/README.md b/contributing/samples/environment_and_skills/local_environment/README.md similarity index 100% rename from contributing/samples/local_environment/README.md rename to contributing/samples/environment_and_skills/local_environment/README.md diff --git a/contributing/samples/context_offloading_with_artifact/__init__.py b/contributing/samples/environment_and_skills/local_environment/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/context_offloading_with_artifact/__init__.py rename to contributing/samples/environment_and_skills/local_environment/__init__.py diff --git a/contributing/samples/local_environment/agent.py b/contributing/samples/environment_and_skills/local_environment/agent.py similarity index 100% rename from contributing/samples/local_environment/agent.py rename to contributing/samples/environment_and_skills/local_environment/agent.py diff --git a/contributing/samples/local_environment_skill/README.md b/contributing/samples/environment_and_skills/local_environment_skill/README.md similarity index 100% rename from contributing/samples/local_environment_skill/README.md rename to contributing/samples/environment_and_skills/local_environment_skill/README.md diff --git a/contributing/samples/crewai_tool_kwargs/__init__.py b/contributing/samples/environment_and_skills/local_environment_skill/__init__.py similarity index 100% rename from contributing/samples/crewai_tool_kwargs/__init__.py rename to contributing/samples/environment_and_skills/local_environment_skill/__init__.py diff --git a/contributing/samples/local_environment_skill/agent.py b/contributing/samples/environment_and_skills/local_environment_skill/agent.py similarity index 100% rename from contributing/samples/local_environment_skill/agent.py rename to contributing/samples/environment_and_skills/local_environment_skill/agent.py diff --git a/contributing/samples/local_environment_skill/skills/weather-skill/SKILL.md b/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/SKILL.md similarity index 59% rename from contributing/samples/local_environment_skill/skills/weather-skill/SKILL.md rename to contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/SKILL.md index cd415e350f..82c9c40dbb 100644 --- a/contributing/samples/local_environment_skill/skills/weather-skill/SKILL.md +++ b/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/SKILL.md @@ -1,8 +1,8 @@ -______________________________________________________________________ +________________________________________________________________________________ ## name: weather-skill description: A skill that provides weather information based on reference data. -Step 1: Check 'references/weather_info.md' for the current weather. -Step 2: If humidity is requested, use run 'scripts/get_humidity.py' with the `location` argument. -Step 3: If wind speed is requested, use the `get_wind_speed` tool. +Step 1: Check 'references/weather_info.md' for the current weather. Step 2: If +humidity is requested, use run 'scripts/get_humidity.py' with the `location` +argument. Step 3: If wind speed is requested, use the `get_wind_speed` tool. Step 4: Provide the update to the user. diff --git a/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/references/weather_info.md b/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/references/weather_info.md new file mode 100644 index 0000000000..2e9ed931bd --- /dev/null +++ b/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/references/weather_info.md @@ -0,0 +1,17 @@ +# Weather Information + +- **Location:** San Francisco, CA + +- **Condition:** Sunny ☀️ + +- **Temperature:** 72°F (22°C) + +- **Forecast:** Clear skies all day. + +- **Location:** Sunnyvale, CA + +- **Condition:** Sunny ☀️ + +- **Temperature:** 75°F (24°C) + +- **Forecast:** Warm and sunny. diff --git a/contributing/samples/local_environment_skill/skills/weather-skill/scripts/get_humidity.py b/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/scripts/get_humidity.py similarity index 100% rename from contributing/samples/local_environment_skill/skills/weather-skill/scripts/get_humidity.py rename to contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/scripts/get_humidity.py diff --git a/contributing/samples/environment_and_skills/skills/README.md b/contributing/samples/environment_and_skills/skills/README.md new file mode 100644 index 0000000000..29d901e722 --- /dev/null +++ b/contributing/samples/environment_and_skills/skills/README.md @@ -0,0 +1,126 @@ +# ADK Skills Agent Sample + +## Overview + +This sample demonstrates how to use **Skills** and the **SkillToolset** in ADK. + +Skills are specialized folders of instructions, reference materials, assets, and +scripts that extend an agent's capabilities. The agent can dynamically search +for, load, and run resources/scripts from these skills depending on the user's +query. + +This sample showcases: + +1. **Programmatic Skills**: Creating a skill directly within Python + (`support-hours-skill`). +1. **Directory-based Skills**: Loading a skill from a directory structure + (`weather-skill`). +1. **Skill Metadata & Additional Tools**: Declaring that a skill requires + specific tools, making them dynamically active only when that skill is + loaded. +1. **Script Execution**: Executing a Python script inside a skill using a code + executor. + +## Sample Inputs + +- `What are the support hours for Tokyo?` + + *Triggers the support-hours-skill which checks get_timezone and reads + support_policy.txt* + +- `What is the current weather in SF?` + + *Loads weather-skill and reads weather_info.md reference file* + +- `Can you fetch the current humidity for Mountain View?` + + *Executes scripts/get_humidity.py via run_skill_script* + +- `What is the wind speed in Seattle?` + + *Loads weather-skill which dynamically activates and calls get_wind_speed* + +## Graph + +```mermaid +graph TD + Agent[Agent: skills_agent] --> Toolset[SkillToolset] + Toolset --> Skill1[support-hours-skill] + Toolset --> Skill2[weather-skill] + + Skill1 --> Resource1["Resource: support_policy.txt"] + Skill1 --> Tool1["Dynamic Tool: get_timezone"] + + Skill2 --> Resource2["Resource: weather_info.md"] + Skill2 --> Script1["Script: get_humidity.py"] + Skill2 --> Tool2["Dynamic Tool: get_wind_speed"] +``` + +## How To + +### 1. Declaring a Skill Programmatically + +You can declare a skill in Python code using `models.Skill`: + +```python +from google.adk.skills import models + +support_hours_skill = models.Skill( + frontmatter=models.Frontmatter( + name="support-hours-skill", + description="A skill to check customer support hours...", + metadata={"adk_additional_tools": ["get_timezone"]}, + ), + instructions="Step 1: Look up the timezone... Step 2: Read 'references/support_policy.txt'...", + resources=models.Resources( + references={ + "support_policy.txt": "Customer support is available Monday through Friday...", + }, + ), +) +``` + +### 2. Loading a Skill from a Directory + +Skills can be organized as folders. Each folder must contain a `SKILL.md` file. +The folder structure typically looks like: + +``` +weather-skill/ +├── SKILL.md +├── references/ +│ └── weather_info.md +└── scripts/ + └── get_humidity.py +``` + +To load a skill from a directory: + +```python +from google.adk.skills import load_skill_from_dir + +weather_skill = load_skill_from_dir( + pathlib.Path(__file__).parent / "skills" / "weather-skill" +) +``` + +### 3. Registering a SkillToolset + +Use `SkillToolset` to bundle all your skills and any dynamic tools. Then pass +this toolset to your agent's `tools` list: + +```python +from google.adk.tools.skill_toolset import SkillToolset +from google.adk.code_executors.unsafe_local_code_executor import UnsafeLocalCodeExecutor + +my_skill_toolset = SkillToolset( + skills=[support_hours_skill, weather_skill], + additional_tools=[GetTimezoneTool(), get_wind_speed], + code_executor=UnsafeLocalCodeExecutor(), +) + +root_agent = Agent( + name="skills_agent", + tools=[my_skill_toolset], +) +``` diff --git a/contributing/samples/environment_and_skills/skills/__init__.py b/contributing/samples/environment_and_skills/skills/__init__.py new file mode 100644 index 0000000000..606228d280 --- /dev/null +++ b/contributing/samples/environment_and_skills/skills/__init__.py @@ -0,0 +1,17 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from . import agent diff --git a/contributing/samples/environment_and_skills/skills/agent.py b/contributing/samples/environment_and_skills/skills/agent.py new file mode 100644 index 0000000000..0ced757f21 --- /dev/null +++ b/contributing/samples/environment_and_skills/skills/agent.py @@ -0,0 +1,108 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import pathlib + +from google.adk.agents import Agent +from google.adk.code_executors.unsafe_local_code_executor import UnsafeLocalCodeExecutor +from google.adk.skills import load_skill_from_dir +from google.adk.skills import models +from google.adk.tools.base_tool import BaseTool +from google.adk.tools.skill_toolset import SkillToolset +from google.genai import types + + +class GetTimezoneTool(BaseTool): + """A tool to get the timezone for a given location.""" + + def __init__(self): + super().__init__( + name="get_timezone", + description="Returns the timezone for a given location.", + ) + + def _get_declaration(self) -> types.FunctionDeclaration | None: + return types.FunctionDeclaration( + name=self.name, + description=self.description, + parameters_json_schema={ + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The location to get the timezone for.", + }, + }, + "required": ["location"], + }, + ) + + async def run_async(self, *, args: dict, tool_context) -> str: + return f"The timezone for {args['location']} is UTC-08:00." + + +def get_wind_speed(location: str) -> str: + """Returns the current wind speed for a given location.""" + return f"The wind speed in {location} is 10 mph." + + +# 1. Define a skill programmatically +support_hours_skill = models.Skill( + frontmatter=models.Frontmatter( + name="support-hours-skill", + description=( + "A skill to check customer support hours for a given location." + ), + metadata={"adk_additional_tools": ["get_timezone"]}, + ), + instructions=( + "Step 1: Look up the timezone for the user's location using" + " 'get_timezone'. Step 2: Read 'references/support_policy.txt' to" + " understand support hours policy. Step 3: Explain the support hours" + " relative to the location's timezone." + ), + resources=models.Resources( + references={ + "support_policy.txt": ( + "Customer support is available Monday through Friday, " + "from 9:00 AM to 5:00 PM local time." + ), + }, + ), +) + +# 2. Load a skill from a directory +weather_skill = load_skill_from_dir( + pathlib.Path(__file__).parent / "skills" / "weather-skill" +) + +# 3. Combine them into a SkillToolset +# NOTE: UnsafeLocalCodeExecutor has security concerns and should NOT +# be used in production environments. +my_skill_toolset = SkillToolset( + skills=[support_hours_skill, weather_skill], + additional_tools=[GetTimezoneTool(), get_wind_speed], + code_executor=UnsafeLocalCodeExecutor(), +) + +# 4. Set up the agent with the toolset +root_agent = Agent( + name="skills_agent", + description="An agent that can use specialized skills.", + tools=[ + my_skill_toolset, + ], +) diff --git a/contributing/samples/environment_and_skills/skills/skills/weather-skill/SKILL.md b/contributing/samples/environment_and_skills/skills/skills/weather-skill/SKILL.md new file mode 100644 index 0000000000..fa4f4d624a --- /dev/null +++ b/contributing/samples/environment_and_skills/skills/skills/weather-skill/SKILL.md @@ -0,0 +1,12 @@ +--- +name: weather-skill +description: A skill that provides weather information based on reference data and scripts. +metadata: + adk_additional_tools: + - get_wind_speed +--- + +Step 1: Check 'references/weather_info.md' for the current weather. Step 2: If +humidity is requested, run 'scripts/get_humidity.py' with the `location` +argument. Step 3: If wind speed is requested, use the `get_wind_speed` tool. +Step 4: Provide the complete weather update to the user. diff --git a/contributing/samples/environment_and_skills/skills/skills/weather-skill/references/weather_info.md b/contributing/samples/environment_and_skills/skills/skills/weather-skill/references/weather_info.md new file mode 100644 index 0000000000..c08804eff7 --- /dev/null +++ b/contributing/samples/environment_and_skills/skills/skills/weather-skill/references/weather_info.md @@ -0,0 +1,6 @@ +# Weather Information + +- **Location:** San Francisco, CA +- **Condition:** Sunny ☀️ +- **Temperature:** 72°F (22°C) +- **Forecast:** Clear skies all day. diff --git a/contributing/samples/skills_agent/skills/weather-skill/scripts/get_humidity.py b/contributing/samples/environment_and_skills/skills/skills/weather-skill/scripts/get_humidity.py similarity index 100% rename from contributing/samples/skills_agent/skills/weather-skill/scripts/get_humidity.py rename to contributing/samples/environment_and_skills/skills/skills/weather-skill/scripts/get_humidity.py diff --git a/contributing/samples/environment_and_skills/skills/tests/current_humidity.json b/contributing/samples/environment_and_skills/skills/tests/current_humidity.json new file mode 100644 index 0000000000..661be9467a --- /dev/null +++ b/contributing/samples/environment_and_skills/skills/tests/current_humidity.json @@ -0,0 +1,201 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Can you fetch the current humidity for Mountain View?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": {}, + "id": "fc-1", + "name": "list_skills" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "list_skills", + "response": { + "result": "\n\n\nsupport-hours-skill\n\n\nA skill to check customer support hours for a given location.\n\n\n\n\nweather-skill\n\n\nA skill that provides weather information based on reference data and scripts.\n\n\n" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "skill_name": "weather-skill" + }, + "id": "fc-2", + "name": "load_skill" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "actions": { + "stateDelta": { + "_adk_activated_skill_skills_agent": [ + "weather-skill" + ] + } + }, + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "load_skill", + "response": { + "frontmatter": { + "allowed_tools": null, + "compatibility": null, + "description": "A skill that provides weather information based on reference data and scripts.", + "license": null, + "metadata": { + "adk_additional_tools": [ + "get_wind_speed" + ] + }, + "name": "weather-skill" + }, + "instructions": "Step 1: Check 'references/weather_info.md' for the current weather.\nStep 2: If humidity is requested, run 'scripts/get_humidity.py' with the `location` argument.\nStep 3: If wind speed is requested, use the `get_wind_speed` tool.\nStep 4: Provide the complete weather update to the user.", + "skill_name": "weather-skill" + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "args": { + "location": "Mountain View" + }, + "file_path": "scripts/get_humidity.py", + "skill_name": "weather-skill" + }, + "id": "fc-3", + "name": "run_skill_script" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-3", + "name": "run_skill_script", + "response": { + "file_path": "scripts/get_humidity.py", + "skill_name": "weather-skill", + "status": "success", + "stderr": "", + "stdout": "Fetching live humidity for Mountain View...\n45% (Simulated)\n" + } + } + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "text": "The current humidity in Mountain View is 45% (Simulated)." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + } + ] +} diff --git a/contributing/samples/environment_and_skills/skills/tests/current_weather.json b/contributing/samples/environment_and_skills/skills/tests/current_weather.json new file mode 100644 index 0000000000..240aad3500 --- /dev/null +++ b/contributing/samples/environment_and_skills/skills/tests/current_weather.json @@ -0,0 +1,196 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What is the current weather in SF?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": {}, + "id": "fc-1", + "name": "list_skills" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "list_skills", + "response": { + "result": "\n\n\nsupport-hours-skill\n\n\nA skill to check customer support hours for a given location.\n\n\n\n\nweather-skill\n\n\nA skill that provides weather information based on reference data and scripts.\n\n\n" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "skill_name": "weather-skill" + }, + "id": "fc-2", + "name": "load_skill" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "actions": { + "stateDelta": { + "_adk_activated_skill_skills_agent": [ + "weather-skill" + ] + } + }, + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "load_skill", + "response": { + "frontmatter": { + "allowed_tools": null, + "compatibility": null, + "description": "A skill that provides weather information based on reference data and scripts.", + "license": null, + "metadata": { + "adk_additional_tools": [ + "get_wind_speed" + ] + }, + "name": "weather-skill" + }, + "instructions": "Step 1: Check 'references/weather_info.md' for the current weather.\nStep 2: If humidity is requested, run 'scripts/get_humidity.py' with the `location` argument.\nStep 3: If wind speed is requested, use the `get_wind_speed` tool.\nStep 4: Provide the complete weather update to the user.", + "skill_name": "weather-skill" + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "file_path": "references/weather_info.md", + "skill_name": "weather-skill" + }, + "id": "fc-3", + "name": "load_skill_resource" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-3", + "name": "load_skill_resource", + "response": { + "content": "# Weather Information\n\n- **Location:** San Francisco, CA\n- **Condition:** Sunny \u2600\ufe0f\n- **Temperature:** 72\u00b0F (22\u00b0C)\n- **Forecast:** Clear skies all day.\n", + "file_path": "references/weather_info.md", + "skill_name": "weather-skill" + } + } + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "text": "The current weather in San Francisco, CA is Sunny with a temperature of 72\u00b0F (22\u00b0C). The forecast is clear skies all day." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + } + ] +} diff --git a/contributing/samples/environment_and_skills/skills/tests/support_hours.json b/contributing/samples/environment_and_skills/skills/tests/support_hours.json new file mode 100644 index 0000000000..5a98a27fcc --- /dev/null +++ b/contributing/samples/environment_and_skills/skills/tests/support_hours.json @@ -0,0 +1,242 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What are the support hours for Tokyo?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": {}, + "id": "fc-1", + "name": "list_skills" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "list_skills", + "response": { + "result": "\n\n\nsupport-hours-skill\n\n\nA skill to check customer support hours for a given location.\n\n\n\n\nweather-skill\n\n\nA skill that provides weather information based on reference data and scripts.\n\n\n" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "skill_name": "support-hours-skill" + }, + "id": "fc-2", + "name": "load_skill" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "actions": { + "stateDelta": { + "_adk_activated_skill_skills_agent": [ + "support-hours-skill" + ] + } + }, + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "load_skill", + "response": { + "frontmatter": { + "allowed_tools": null, + "compatibility": null, + "description": "A skill to check customer support hours for a given location.", + "license": null, + "metadata": { + "adk_additional_tools": [ + "get_timezone" + ] + }, + "name": "support-hours-skill" + }, + "instructions": "Step 1: Look up the timezone for the user's location using 'get_timezone'. Step 2: Read 'references/support_policy.txt' to understand support hours policy. Step 3: Explain the support hours relative to the location's timezone.", + "skill_name": "support-hours-skill" + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "location": "Tokyo" + }, + "id": "fc-3", + "name": "get_timezone" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-3", + "name": "get_timezone", + "response": { + "result": "The timezone for Tokyo is UTC-08:00." + } + } + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "file_path": "references/support_policy.txt", + "skill_name": "support-hours-skill" + }, + "id": "fc-4", + "name": "load_skill_resource" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-8", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-4", + "name": "load_skill_resource", + "response": { + "content": "Customer support is available Monday through Friday, from 9:00 AM to 5:00 PM local time.", + "file_path": "references/support_policy.txt", + "skill_name": "support-hours-skill" + } + } + } + ], + "role": "user" + }, + "id": "e-9", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "text": "Customer support in Tokyo is available Monday through Friday, from 9:00 AM to 5:00 PM local time (UTC-08:00)." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-10", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + } + ] +} diff --git a/contributing/samples/environment_and_skills/skills/tests/wind_speed.json b/contributing/samples/environment_and_skills/skills/tests/wind_speed.json new file mode 100644 index 0000000000..6912b37135 --- /dev/null +++ b/contributing/samples/environment_and_skills/skills/tests/wind_speed.json @@ -0,0 +1,193 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What is the wind speed in Seattle?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": {}, + "id": "fc-1", + "name": "list_skills" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "list_skills", + "response": { + "result": "\n\n\nsupport-hours-skill\n\n\nA skill to check customer support hours for a given location.\n\n\n\n\nweather-skill\n\n\nA skill that provides weather information based on reference data and scripts.\n\n\n" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "skill_name": "weather-skill" + }, + "id": "fc-2", + "name": "load_skill" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "actions": { + "stateDelta": { + "_adk_activated_skill_skills_agent": [ + "weather-skill" + ] + } + }, + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "load_skill", + "response": { + "frontmatter": { + "allowed_tools": null, + "compatibility": null, + "description": "A skill that provides weather information based on reference data and scripts.", + "license": null, + "metadata": { + "adk_additional_tools": [ + "get_wind_speed" + ] + }, + "name": "weather-skill" + }, + "instructions": "Step 1: Check 'references/weather_info.md' for the current weather.\nStep 2: If humidity is requested, run 'scripts/get_humidity.py' with the `location` argument.\nStep 3: If wind speed is requested, use the `get_wind_speed` tool.\nStep 4: Provide the complete weather update to the user.", + "skill_name": "weather-skill" + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "location": "Seattle" + }, + "id": "fc-3", + "name": "get_wind_speed" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-3", + "name": "get_wind_speed", + "response": { + "result": "The wind speed in Seattle is 10 mph." + } + } + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + }, + { + "author": "skills_agent", + "content": { + "parts": [ + { + "text": "The wind speed in Seattle is 10 mph." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "path": "skills_agent@1" + } + } + ] +} diff --git a/contributing/samples/custom_code_execution/__init__.py b/contributing/samples/environment_and_skills/skills_agent/__init__.py similarity index 100% rename from contributing/samples/custom_code_execution/__init__.py rename to contributing/samples/environment_and_skills/skills_agent/__init__.py diff --git a/contributing/samples/skills_agent/agent.py b/contributing/samples/environment_and_skills/skills_agent/agent.py similarity index 99% rename from contributing/samples/skills_agent/agent.py rename to contributing/samples/environment_and_skills/skills_agent/agent.py index a42fa2583e..da9f2bd5d5 100644 --- a/contributing/samples/skills_agent/agent.py +++ b/contributing/samples/environment_and_skills/skills_agent/agent.py @@ -92,7 +92,6 @@ def get_wind_speed(location: str) -> str: ) root_agent = Agent( - model="gemini-2.5-flash", name="skill_user_agent", description="An agent that can use specialized skills.", tools=[ diff --git a/contributing/samples/skills_agent/skills/weather-skill/SKILL.md b/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/SKILL.md similarity index 61% rename from contributing/samples/skills_agent/skills/weather-skill/SKILL.md rename to contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/SKILL.md index 0323c18bfb..9e74ebef7d 100644 --- a/contributing/samples/skills_agent/skills/weather-skill/SKILL.md +++ b/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/SKILL.md @@ -6,7 +6,7 @@ metadata: - get_wind_speed --- -Step 1: Check 'references/weather_info.md' for the current weather. -Step 2: If humidity is requested, use run 'scripts/get_humidity.py' with the `location` argument. -Step 3: If wind speed is requested, use the `get_wind_speed` tool. +Step 1: Check 'references/weather_info.md' for the current weather. Step 2: If +humidity is requested, use run 'scripts/get_humidity.py' with the `location` +argument. Step 3: If wind speed is requested, use the `get_wind_speed` tool. Step 4: Provide the update to the user. diff --git a/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/references/weather_info.md b/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/references/weather_info.md new file mode 100644 index 0000000000..c08804eff7 --- /dev/null +++ b/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/references/weather_info.md @@ -0,0 +1,6 @@ +# Weather Information + +- **Location:** San Francisco, CA +- **Condition:** Sunny ☀️ +- **Temperature:** 72°F (22°C) +- **Forecast:** Clear skies all day. diff --git a/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/scripts/get_humidity.py b/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/scripts/get_humidity.py new file mode 100644 index 0000000000..a2e1dc4701 --- /dev/null +++ b/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/scripts/get_humidity.py @@ -0,0 +1,29 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse + + +def get_humidity(location: str) -> str: + """Fetch live humidity for a given location. (Simulated)""" + print(f"Fetching live humidity for {location}...") + return "45% (Simulated)" + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--location", type=str, default="Mountain View") + args = parser.parse_args() + + print(get_humidity(args.location)) diff --git a/contributing/samples/data_agent/__init__.py b/contributing/samples/environment_and_skills/skills_agent_gcs/__init__.py similarity index 100% rename from contributing/samples/data_agent/__init__.py rename to contributing/samples/environment_and_skills/skills_agent_gcs/__init__.py diff --git a/contributing/samples/skills_agent_gcs/agent.py b/contributing/samples/environment_and_skills/skills_agent_gcs/agent.py similarity index 100% rename from contributing/samples/skills_agent_gcs/agent.py rename to contributing/samples/environment_and_skills/skills_agent_gcs/agent.py diff --git a/contributing/samples/fields_output_schema/agent.py b/contributing/samples/fields_output_schema/agent.py deleted file mode 100644 index f948668ac2..0000000000 --- a/contributing/samples/fields_output_schema/agent.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from google.adk import Agent -from pydantic import BaseModel - - -class WeatherData(BaseModel): - temperature: str - humidity: str - wind_speed: str - - -def get_current_year() -> str: - """Get the current year. - - Returns: - The current year as a string - """ - from datetime import datetime - - return str(datetime.now().year) - - -root_agent = Agent( - name='root_agent', - model='gemini-2.5-flash', - instruction="""\ -Answer user's questions based on the data you have. - -If you don't have the data, you can just say you don't know. - -Here are the data you have for San Jose - -* temperature: 26 C -* humidity: 20% -* wind_speed: 29 mph - -Here are the data you have for Cupertino - -* temperature: 16 C -* humidity: 10% -* wind_speed: 13 mph - -""", - output_schema=list[WeatherData], - output_key='weather_data', - tools=[get_current_year], -) diff --git a/contributing/samples/gcp_auth/README.md b/contributing/samples/gcp_auth/README.md deleted file mode 100644 index 0bdcea16f0..0000000000 --- a/contributing/samples/gcp_auth/README.md +++ /dev/null @@ -1,113 +0,0 @@ -# GCP Auth Sample - -Demonstrates the use of Agent Identity auth manager with an agent that queries -Spotify and Google Maps using auth providers. - -Use `adk web` to run API key and 2-legged oauth flows, while use the included -custom agent web client to run 3-legged oauth flows. - -## Setup - -### 1. Activate environment - -```bash -cd adk-python -python3 -m venv .venv -source .venv/bin/activate -``` - -### 2. Install dependencies - -```bash -pip install "google-adk[agent-identity]" -``` - -### 3. Authenticate your environment - -```bash -gcloud auth application-default login -export GOOGLE_CLOUD_PROJECT="YOUR_GOOGLE_CLOUD_PROJECT" -gcloud auth application-default set-quota-project $GOOGLE_CLOUD_PROJECT -``` - -### 4. Create auth providers - -Refer to the [public documentation](https://cloud.google.com/iam/docs/manage-auth-providers) to create the following Agent Identity auth providers. - -> **Note:** -> The identity running the agent (via Application Default Credentials) must have -> the necessary [permissions](https://docs.cloud.google.com/iam/docs/roles-permissions/iamconnectors#iamconnectors.user) -> to retrieve credentials from these connectors. Ensure your account has the -> necessary role to access these resources. - -```bash -export GOOGLE_CLOUD_LOCATION="YOUR_GOOGLE_CLOUD_LOCATION" -export MAPS_API_AUTH_PROVIDER_ID="YOUR_MAPS_API_AUTH_PROVIDER_ID" -export SPOTIFY_2LO_AUTH_PROVIDER_ID="YOUR_SPOTIFY_2LO_AUTH_PROVIDER_ID" -export SPOTIFY_3LO_AUTH_PROVIDER_ID="YOUR_SPOTIFY_3LO_AUTH_PROVIDER_ID" - -gcloud alpha agent-identity connectors create $MAPS_API_AUTH_PROVIDER_ID \ - --project=$GOOGLE_CLOUD_PROJECT \ - --location=$GOOGLE_CLOUD_LOCATION \ - --api-key=YOUR_API_KEY - -gcloud alpha agent-identity connectors create $SPOTIFY_2LO_AUTH_PROVIDER_ID \ - --project=$GOOGLE_CLOUD_PROJECT \ - --location=$GOOGLE_CLOUD_LOCATION \ - --two-legged-oauth-client-id=OAUTH_CLIENT_ID \ - --two-legged-oauth-client-secret=OAUTH_CLIENT_SECRET \ - --two-legged-oauth-token-endpoint=OAUTH_TOKEN_ENDPOINT - -gcloud alpha agent-identity connectors create $SPOTIFY_3LO_AUTH_PROVIDER_ID \ - --project=$GOOGLE_CLOUD_PROJECT \ - --location=$GOOGLE_CLOUD_LOCATION \ - --three-legged-oauth-client-id=OAUTH_CLIENT_ID \ - --three-legged-oauth-client-secret=OAUTH_CLIENT_SECRET \ - --three-legged-oauth-authorization-url=AUTHORIZATION_URL \ - --three-legged-oauth-token-url=TOKEN_URL \ - --allowed-scopes=ALLOWED_SCOPES -``` - -### 5. Test API key and 2LO auth provider using ADK web client - -```bash -adk web contributing/samples -``` - -- On the ADK web UI, select the agent named `gcp_auth` from the dropdown. -- Sample queries to try: - - API key (Google Maps tool): "What is the current weather in New York?" - - 2LO key (Spotify tool): "Tell me about the song: Waving Flag" - -### 6. Test 3LO auth provider using custom web client - -> **Note:** If the agent backend is running on a different port or host other -> than `localhost:8000`, please set the `AGENT_BACKEND_URL` environment variable -> before starting the client (e.g., -> `export AGENT_BACKEND_URL="http://localhost:9000"`). - -- In a separate shell, activate environment - -```bash -cd adk-python -python3 -m venv .venv -source .venv/bin/activate -``` - -- Navigate to the client directory and install dependencies - -```bash -cd contributing/samples/gcp_auth/client -pip install -r requirements.txt -``` - -- Start the client application - -```bash -uvicorn main:app --port 8080 --reload -``` - -- Open `http://localhost:8080`. (**Note:** You must use `localhost` and not `127.0.0.1`, as the OAuth redirect URL specifically requires it.) -- On the login screen, enter an arbitrary user ID (e.g. test_user123). -- Sample queries to try: - - 3LO key (Spotify tool): "What are my private Spotify playlists?" diff --git a/contributing/samples/gcp_auth/agent.py b/contributing/samples/gcp_auth/agent.py deleted file mode 100644 index 9d34687076..0000000000 --- a/contributing/samples/gcp_auth/agent.py +++ /dev/null @@ -1,166 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import os - -from google.adk.agents import Agent -from google.adk.apps import App -from google.adk.auth.auth_credential import AuthCredential -from google.adk.auth.auth_tool import AuthConfig -from google.adk.auth.credential_manager import CredentialManager -from google.adk.integrations.agent_identity import GcpAuthProvider -from google.adk.integrations.agent_identity import GcpAuthProviderScheme -from google.adk.tools.authenticated_function_tool import AuthenticatedFunctionTool -from google.adk.tools.mcp_tool.mcp_session_manager import StreamableHTTPConnectionParams -from google.adk.tools.mcp_tool.mcp_toolset import McpToolset -import httpx - -PROJECT_ID = os.environ.get("GOOGLE_CLOUD_PROJECT") -LOCATION = os.environ.get("GOOGLE_CLOUD_LOCATION") -MAPS_API_AUTH_PROVIDER_ID = os.environ.get("MAPS_API_AUTH_PROVIDER_ID") -SPOTIFY_2LO_AUTH_PROVIDER_ID = os.environ.get("SPOTIFY_2LO_AUTH_PROVIDER_ID") -SPOTIFY_3LO_AUTH_PROVIDER_ID = os.environ.get("SPOTIFY_3LO_AUTH_PROVIDER_ID") - -MAPS_API_AUTH_PROVIDER = f"projects/{PROJECT_ID}/locations/{LOCATION}/connectors/{MAPS_API_AUTH_PROVIDER_ID}" -SPOTIFY_2LO_AUTH_PROVIDER = f"projects/{PROJECT_ID}/locations/{LOCATION}/connectors/{SPOTIFY_2LO_AUTH_PROVIDER_ID}" -SPOTIFY_3LO_AUTH_PROVIDER = f"projects/{PROJECT_ID}/locations/{LOCATION}/connectors/{SPOTIFY_3LO_AUTH_PROVIDER_ID}" - -MAPS_MCP_ENDPOINT = "https://mapstools.googleapis.com/mcp" -CONTINUE_URI = "http://localhost:8080/commit" -MODEL = "gemini-2.5-flash" - - -async def spotify_search_track( - credential: AuthCredential, query: str -) -> str | list: - """Searches for a track on Spotify and returns its details.""" - headers = {} - if http := credential.http: - if http.scheme and http.credentials and (token := http.credentials.token): - headers["Authorization"] = f"{http.scheme.title()} {token}" - if http.additional_headers: - headers.update(http.additional_headers) - - if not headers: - return "Error: No authentication token available." - - async with httpx.AsyncClient() as client: - response = await client.get( - "https://api.spotify.com/v1/search", - headers=headers, - params={"q": query, "type": "track", "limit": 1}, - ) - - if response.status_code != 200: - return f"Error from Spotify API: {response.status_code} - {response.text}" - - data = response.json() - items = data.get("tracks", {}).get("items", []) - - if not items: - return f"No track found for query '{query}'." - - return items - - -async def spotify_get_playlists(credential: AuthCredential) -> str | list: - """Fetches the current user's private playlists on Spotify.""" - headers = {} - if http := credential.http: - if http.scheme and http.credentials and (token := http.credentials.token): - headers["Authorization"] = f"{http.scheme.title()} {token}" - if http.additional_headers: - headers.update(http.additional_headers) - - if not headers: - return "Error: No authentication token available." - - async with httpx.AsyncClient() as client: - response = await client.get( - "https://api.spotify.com/v1/me/playlists", - headers=headers, - params={"limit": 10}, - ) - - if response.status_code != 200: - return f"Error from Spotify API: {response.status_code} - {response.text}" - - data = response.json() - items = data.get("items", []) - - if not items: - return "No playlists found for the current user." - - # Extract useful information - return [ - { - "name": item.get("name"), - "public": item.get("public"), - "total_tracks": item.get("tracks", {}).get("total"), - } - for item in items - if item - ] - - -spotify_auth_config_2lo = AuthConfig( - auth_scheme=GcpAuthProviderScheme(name=SPOTIFY_2LO_AUTH_PROVIDER) -) -spotify_search_track_tool = AuthenticatedFunctionTool( - func=spotify_search_track, - auth_config=spotify_auth_config_2lo, -) - -spotify_auth_config_3lo = AuthConfig( - auth_scheme=GcpAuthProviderScheme( - name=SPOTIFY_3LO_AUTH_PROVIDER, - scopes=["playlist-read-private"], - continue_uri=CONTINUE_URI, - ) -) -spotify_get_playlist_tool = AuthenticatedFunctionTool( - func=spotify_get_playlists, - auth_config=spotify_auth_config_3lo, -) - -maps_tools = McpToolset( - connection_params=StreamableHTTPConnectionParams(url=MAPS_MCP_ENDPOINT), - auth_scheme=GcpAuthProviderScheme(name=MAPS_API_AUTH_PROVIDER), - errlog=None, # Required for agent freezing (pickling) -) - -CredentialManager.register_auth_provider(GcpAuthProvider()) - -root_agent = Agent( - name="gcp_auth_agent", - model=MODEL, - instruction=( - "You are a Spotify and Google Maps assistant. Use your tools to " - "search for track details, fetch the user's private playlists, " - "and look up locations. Keep responses concise, friendly, and " - "emoji-filled!" - ), - tools=[ - spotify_search_track_tool, - spotify_get_playlist_tool, - maps_tools, - ], -) - -app = App( - name="gcp_auth", - root_agent=root_agent, -) diff --git a/contributing/samples/gcp_auth/client/index.html b/contributing/samples/gcp_auth/client/index.html deleted file mode 100644 index 5e3c5b2b62..0000000000 --- a/contributing/samples/gcp_auth/client/index.html +++ /dev/null @@ -1,566 +0,0 @@ - - - - Gcp Auth demo - - - - - - - - - - - - -
        -
        -

        Welcome

        -

        - Please enter your User ID to continue. -

        - - -
        -
        - - - - - - - - - diff --git a/contributing/samples/gcp_auth/client/main.py b/contributing/samples/gcp_auth/client/main.py deleted file mode 100644 index 9d2deabd04..0000000000 --- a/contributing/samples/gcp_auth/client/main.py +++ /dev/null @@ -1,122 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import json -import logging -import os -import sys - -from fastapi import FastAPI -from fastapi import Request -from fastapi.responses import HTMLResponse -from fastapi.responses import StreamingResponse -import httpx - -logging.basicConfig( - level=logging.INFO, stream=sys.stdout, format="%(levelname)s: %(message)s" -) -logger = logging.getLogger("google_adk." + __name__) - -app = FastAPI() - -AGENT_URL = os.environ.get("AGENT_BACKEND_URL", "http://localhost:8000") - - -@app.get("/") -def ui(): - with open("index.html", "r") as f: - return HTMLResponse(content=f.read()) - - -@app.post("/chat") -async def chat(request: Request): - data = await request.json() - message = data.get("message") - function_response = data.get("function_response") - - app_name = "gcp_auth" - user_id = data.get("user_id", "test_user") - session_id = data.get("session_id", "default_session_id") - - payload = { - "appName": app_name, - "userId": user_id, - "sessionId": session_id, - "streaming": True, - } - - if message: - payload["newMessage"] = { - "role": "user", - "parts": [{"text": message}], - } - elif function_response: - payload["newMessage"] = { - "role": "user", - "parts": [{"functionResponse": function_response}], - } - - # Ensure the session exists before we try to continue it via /run_sse - async def proxy_stream(): - async with httpx.AsyncClient(timeout=120.0) as client: - # Attempt to create the session (ignoring if it already exists or fails quietly) - await client.post( - f"{AGENT_URL}/apps/{app_name}/users/{user_id}/sessions/{session_id}" - ) - - async with client.stream( - "POST", f"{AGENT_URL}/run_sse", json=payload - ) as r: - if r.status_code != 200: - err = await r.aread() - yield f"data: {json.dumps({'error': err.decode()})}\n\n" - return - - async for line in r.aiter_lines(): - if line: - yield f"data: {line}\n\n" if line.startswith("{") else f"{line}\n\n" - - return StreamingResponse(proxy_stream(), media_type="text/event-stream") - - -@app.api_route("/commit", methods=["GET"]) -async def commit(request: Request): - connector = request.query_params.get("connector_name") - payload = { - "userId": request.cookies.get("user_id"), - "userIdValidationState": request.query_params.get( - "user_id_validation_state" - ), - "consentNonce": request.cookies.get("consent_nonce"), - } - - url = f"https://iamconnectorcredentials.googleapis.com/v1alpha/{connector}/credentials:finalize" - try: - async with httpx.AsyncClient(timeout=30.0) as client: - resp = await client.post(url, json=payload) - resp.raise_for_status() - except httpx.HTTPError as e: - err_text = e.response.text if hasattr(e, "response") else str(e) - status = e.response.status_code if hasattr(e, "response") else 500 - logger.error(f"Commit failed: {err_text}") - return HTMLResponse(err_text, status_code=status) - - return HTMLResponse(""" - -

        Success. You can close this window.

        - """) diff --git a/contributing/samples/gcp_auth/client/requirements.txt b/contributing/samples/gcp_auth/client/requirements.txt deleted file mode 100644 index 5339a4b149..0000000000 --- a/contributing/samples/gcp_auth/client/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -fastapi -uvicorn -httpx -google-auth diff --git a/contributing/samples/hello_world/main.py b/contributing/samples/hello_world/main.py deleted file mode 100755 index 20305e5acc..0000000000 --- a/contributing/samples/hello_world/main.py +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import asyncio -import time - -import agent -from dotenv import load_dotenv -from google.adk.agents.run_config import RunConfig -from google.adk.cli.utils import logs -from google.adk.runners import InMemoryRunner -from google.adk.sessions.session import Session -from google.genai import types - -load_dotenv(override=True) -logs.log_to_tmp_folder() - - -async def main(): - app_name = 'my_app' - user_id_1 = 'user1' - runner = InMemoryRunner( - agent=agent.root_agent, - app_name=app_name, - ) - session_11 = await runner.session_service.create_session( - app_name=app_name, user_id=user_id_1 - ) - - async def run_prompt(session: Session, new_message: str): - content = types.Content( - role='user', parts=[types.Part.from_text(text=new_message)] - ) - print('** User says:', content.model_dump(exclude_none=True)) - async for event in runner.run_async( - user_id=user_id_1, - session_id=session.id, - new_message=content, - ): - if event.content.parts: - for part in event.content.parts: - if part.text: - print(f'** {event.author}: {part.text}') - if part.function_call: - print( - f'** {event.author} calls tool: {part.function_call.name} with' - f' args {part.function_call.args}' - ) - - async def run_prompt_bytes(session: Session, new_message: str): - content = types.Content( - role='user', - parts=[ - types.Part.from_bytes( - data=str.encode(new_message), mime_type='text/plain' - ) - ], - ) - print('** User says:', content.model_dump(exclude_none=True)) - async for event in runner.run_async( - user_id=user_id_1, - session_id=session.id, - new_message=content, - run_config=RunConfig(save_input_blobs_as_artifacts=True), - ): - if event.content.parts and event.content.parts[0].text: - print(f'** {event.author}: {event.content.parts[0].text}') - - async def check_rolls_in_state(rolls_size: int): - session = await runner.session_service.get_session( - app_name=app_name, user_id=user_id_1, session_id=session_11.id - ) - print('** session.state:', session.state) - assert len(session.state['rolls']) == rolls_size - for roll in session.state['rolls']: - assert roll > 0 and roll <= 100 - - start_time = time.time() - print('Start time:', start_time) - print('------------------------------------') - await run_prompt(session_11, 'Hi') - await run_prompt(session_11, 'Roll a dice with 100 sides') - await check_rolls_in_state(1) - await run_prompt(session_11, 'Roll a dice again with 100 sides.') - await check_rolls_in_state(2) - await run_prompt(session_11, 'What numbers did I got?') - await run_prompt_bytes(session_11, 'Hi bytes') - print( - await runner.artifact_service.list_artifact_keys( - app_name=app_name, user_id=user_id_1, session_id=session_11.id - ) - ) - end_time = time.time() - print('------------------------------------') - print('End time:', end_time) - print('Total time:', end_time - start_time) - - -if __name__ == '__main__': - asyncio.run(main()) diff --git a/contributing/samples/hello_world_apigeellm/.env-sample b/contributing/samples/hello_world_apigeellm/.env-sample deleted file mode 100644 index eeef7fad5a..0000000000 --- a/contributing/samples/hello_world_apigeellm/.env-sample +++ /dev/null @@ -1,8 +0,0 @@ -# This is a sample .env file. -# Copy this file to .env and replace the placeholder values with your actual credentials. - -# Your Google API key for accessing Gemini models. -GOOGLE_API_KEY="your-google-api-key" - -# The URL of your Apigee proxy. -APIGEE_PROXY_URL="https://your-apigee-proxy.net/basepath" diff --git a/contributing/samples/hello_world_app/agent.py b/contributing/samples/hello_world_app/agent.py deleted file mode 100755 index 3e762f949e..0000000000 --- a/contributing/samples/hello_world_app/agent.py +++ /dev/null @@ -1,160 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import random - -from google.adk import Agent -from google.adk.agents.base_agent import BaseAgent -from google.adk.agents.callback_context import CallbackContext -from google.adk.apps import App -from google.adk.apps.app import EventsCompactionConfig -from google.adk.apps.llm_event_summarizer import LlmEventSummarizer -from google.adk.models.llm_request import LlmRequest -from google.adk.plugins.base_plugin import BasePlugin -from google.adk.plugins.context_filter_plugin import ContextFilterPlugin -from google.adk.plugins.save_files_as_artifacts_plugin import SaveFilesAsArtifactsPlugin -from google.adk.tools import load_artifacts -from google.adk.tools.tool_context import ToolContext -from google.genai import types - - -def roll_die(sides: int, tool_context: ToolContext) -> int: - """Roll a die and return the rolled result. - - Args: - sides: The integer number of sides the die has. - - Returns: - An integer of the result of rolling the die. - """ - result = random.randint(1, sides) - if not 'rolls' in tool_context.state: - tool_context.state['rolls'] = [] - - tool_context.state['rolls'] = tool_context.state['rolls'] + [result] - return result - - -async def check_prime(nums: list[int]) -> str: - """Check if a given list of numbers are prime. - - Args: - nums: The list of numbers to check. - - Returns: - A str indicating which number is prime. - """ - primes = set() - for number in nums: - number = int(number) - if number <= 1: - continue - is_prime = True - for i in range(2, int(number**0.5) + 1): - if number % i == 0: - is_prime = False - break - if is_prime: - primes.add(number) - return ( - 'No prime numbers found.' - if not primes - else f"{', '.join(str(num) for num in primes)} are prime numbers." - ) - - -root_agent = Agent( - model='gemini-2.5-flash', - name='hello_world_agent', - description=( - 'hello world agent that can roll a dice of 8 sides and check prime' - ' numbers.' - ), - instruction=""" - You roll dice and answer questions about the outcome of the dice rolls. - You can roll dice of different sizes. - You can use multiple tools in parallel by calling functions in parallel(in one request and in one round). - It is ok to discuss previous dice roles, and comment on the dice rolls. - When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string. - You should never roll a die on your own. - When checking prime numbers, call the check_prime tool with a list of integers. Be sure to pass in a list of integers. You should never pass in a string. - You should not check prime numbers before calling the tool. - When you are asked to roll a die and check prime numbers, you should always make the following two function calls: - 1. You should first call the roll_die tool to get a roll. Wait for the function response before calling the check_prime tool. - 2. After you get the function response from roll_die tool, you should call the check_prime tool with the roll_die result. - 2.1 If user asks you to check primes based on previous rolls, make sure you include the previous rolls in the list. - 3. When you respond, you must include the roll_die result from step 1. - You should always perform the previous 3 steps when asking for a roll and checking prime numbers. - You should not rely on the previous history on prime results. - """, - tools=[ - roll_die, - check_prime, - load_artifacts, - ], - # planner=BuiltInPlanner( - # thinking_config=types.ThinkingConfig( - # include_thoughts=True, - # ), - # ), - generate_content_config=types.GenerateContentConfig( - safety_settings=[ - types.SafetySetting( # avoid false alarm about rolling dice. - category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, - threshold=types.HarmBlockThreshold.OFF, - ), - ] - ), -) - - -class CountInvocationPlugin(BasePlugin): - """A custom plugin that counts agent and tool invocations.""" - - def __init__(self) -> None: - """Initialize the plugin with counters.""" - super().__init__(name='count_invocation') - self.agent_count: int = 0 - self.tool_count: int = 0 - self.llm_request_count: int = 0 - - async def before_agent_callback( - self, *, agent: BaseAgent, callback_context: CallbackContext - ) -> None: - """Count agent runs.""" - self.agent_count += 1 - print(f'[Plugin] Agent run count: {self.agent_count}') - - async def before_model_callback( - self, *, callback_context: CallbackContext, llm_request: LlmRequest - ) -> None: - """Count LLM requests.""" - self.llm_request_count += 1 - print(f'[Plugin] LLM request count: {self.llm_request_count}') - - -app = App( - name='hello_world_app', - root_agent=root_agent, - plugins=[ - CountInvocationPlugin(), - # ContextFilterPlugin(num_invocations_to_keep=3), - SaveFilesAsArtifactsPlugin(), - ], - # Enable event compaction with an LLM-based summarizer. - events_compaction_config=EventsCompactionConfig( - compaction_interval=2, - overlap_size=1, - ), -) diff --git a/contributing/samples/hello_world_app/main.py b/contributing/samples/hello_world_app/main.py deleted file mode 100755 index d024b4cef2..0000000000 --- a/contributing/samples/hello_world_app/main.py +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import asyncio -import time - -import agent -from dotenv import load_dotenv -from google.adk.agents.run_config import RunConfig -from google.adk.cli.utils import logs -from google.adk.runners import InMemoryRunner -from google.adk.sessions.session import Session -from google.genai import types - -load_dotenv(override=True) -logs.log_to_tmp_folder() - - -async def main(): - app_name = 'my_app' - user_id_1 = 'user1' - runner = InMemoryRunner( - agent=agent.root_agent, - app_name=app_name, - ) - session_11 = await runner.session_service.create_session( - app_name=app_name, user_id=user_id_1 - ) - - async def run_prompt(session: Session, new_message: str): - content = types.Content( - role='user', parts=[types.Part.from_text(text=new_message)] - ) - print('** User says:', content.model_dump(exclude_none=True)) - async for event in runner.run_async( - user_id=user_id_1, - session_id=session.id, - new_message=content, - ): - if event.content.parts and event.content.parts[0].text: - print(f'** {event.author}: {event.content.parts[0].text}') - - async def run_prompt_bytes(session: Session, new_message: str): - content = types.Content( - role='user', - parts=[ - types.Part.from_bytes( - data=str.encode(new_message), mime_type='text/plain' - ) - ], - ) - print('** User says:', content.model_dump(exclude_none=True)) - async for event in runner.run_async( - user_id=user_id_1, - session_id=session.id, - new_message=content, - run_config=RunConfig(save_input_blobs_as_artifacts=False), - ): - if event.content.parts and event.content.parts[0].text: - print(f'** {event.author}: {event.content.parts[0].text}') - - async def check_rolls_in_state(rolls_size: int): - session = await runner.session_service.get_session( - app_name=app_name, user_id=user_id_1, session_id=session_11.id - ) - assert len(session.state['rolls']) == rolls_size - for roll in session.state['rolls']: - assert roll > 0 and roll <= 100 - - start_time = time.time() - print('Start time:', start_time) - print('------------------------------------') - await run_prompt(session_11, 'Hi') - await run_prompt(session_11, 'Roll a die with 100 sides') - await check_rolls_in_state(1) - await run_prompt(session_11, 'Roll a die again with 100 sides.') - await check_rolls_in_state(2) - await run_prompt(session_11, 'What numbers did I got?') - await run_prompt_bytes(session_11, 'Hi bytes') - print( - await runner.artifact_service.list_artifact_keys( - app_name=app_name, user_id=user_id_1, session_id=session_11.id - ) - ) - end_time = time.time() - print('------------------------------------') - print('End time:', end_time) - print('Total time:', end_time - start_time) - - -if __name__ == '__main__': - asyncio.run(main()) diff --git a/contributing/samples/history_management/main.py b/contributing/samples/history_management/main.py deleted file mode 100755 index 17038c42f7..0000000000 --- a/contributing/samples/history_management/main.py +++ /dev/null @@ -1,80 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import asyncio -import time -import warnings - -import agent -from dotenv import load_dotenv -from google.adk import Runner -from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService -from google.adk.cli.utils import logs -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.sessions.session import Session -from google.genai import types - -load_dotenv(override=True) -warnings.filterwarnings('ignore', category=UserWarning) -logs.log_to_tmp_folder() - - -async def main(): - app_name = 'my_app' - user_id_1 = 'user1' - session_service = InMemorySessionService() - artifact_service = InMemoryArtifactService() - runner = Runner( - app_name=app_name, - agent=agent.root_agent, - artifact_service=artifact_service, - session_service=session_service, - ) - session_11 = await session_service.create_session( - app_name=app_name, user_id=user_id_1 - ) - - async def run_prompt(session: Session, new_message: str): - content = types.Content( - role='user', parts=[types.Part.from_text(text=new_message)] - ) - print('** User says:', content.model_dump(exclude_none=True)) - async for event in runner.run_async( - user_id=user_id_1, - session_id=session.id, - new_message=content, - ): - if event.content.parts and event.content.parts[0].text: - print(f'** {event.author}: {event.content.parts[0].text}') - - start_time = time.time() - print('Start time:', start_time) - print('------------------------------------') - await run_prompt(session_11, 'Hi') - await run_prompt(session_11, 'Roll a die with 100 sides') - await run_prompt(session_11, 'Roll a die again with 100 sides.') - await run_prompt(session_11, 'What numbers did I got?') - print( - await artifact_service.list_artifact_keys( - app_name=app_name, user_id=user_id_1, session_id=session_11.id - ) - ) - end_time = time.time() - print('------------------------------------') - print('End time:', end_time) - print('Total time:', end_time - start_time) - - -if __name__ == '__main__': - asyncio.run(main()) diff --git a/contributing/samples/human_in_loop/README.md b/contributing/samples/hitl/human_in_loop/README.md similarity index 100% rename from contributing/samples/human_in_loop/README.md rename to contributing/samples/hitl/human_in_loop/README.md diff --git a/contributing/samples/fields_output_schema/__init__.py b/contributing/samples/hitl/human_in_loop/__init__.py similarity index 100% rename from contributing/samples/fields_output_schema/__init__.py rename to contributing/samples/hitl/human_in_loop/__init__.py diff --git a/contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py b/contributing/samples/hitl/human_in_loop/agent.py similarity index 98% rename from contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py rename to contributing/samples/hitl/human_in_loop/agent.py index 3ea740b7a1..89a4282f6e 100644 --- a/contributing/samples/a2a_human_in_loop/remote_a2a/human_in_loop/agent.py +++ b/contributing/samples/hitl/human_in_loop/agent.py @@ -39,7 +39,6 @@ def ask_for_approval( root_agent = Agent( - model='gemini-2.5-flash', name='reimbursement_agent', instruction=""" You are an agent whose job is to handle the reimbursement process for diff --git a/contributing/samples/human_in_loop/main.py b/contributing/samples/hitl/human_in_loop/main.py similarity index 100% rename from contributing/samples/human_in_loop/main.py rename to contributing/samples/hitl/human_in_loop/main.py diff --git a/contributing/samples/hitl/human_in_loop/tests/auto_reimburse_coffee.json b/contributing/samples/hitl/human_in_loop/tests/auto_reimburse_coffee.json new file mode 100644 index 0000000000..840b742044 --- /dev/null +++ b/contributing/samples/hitl/human_in_loop/tests/auto_reimburse_coffee.json @@ -0,0 +1,84 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Can I get a reimbursement of $15.50 for some coffee?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "reimbursement_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "amount": 15.5, + "purpose": "coffee" + }, + "id": "fc-1", + "name": "reimburse" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "reimbursement_agent@1" + } + }, + { + "author": "reimbursement_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "reimburse", + "response": { + "status": "ok" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "reimbursement_agent@1" + } + }, + { + "author": "reimbursement_agent", + "content": { + "parts": [ + { + "text": "You got it! I've reimbursed you $15.50 for coffee." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "reimbursement_agent@1" + } + } + ] +} diff --git a/contributing/samples/hitl/human_in_loop/tests/reimburse_dinner.json b/contributing/samples/hitl/human_in_loop/tests/reimburse_dinner.json new file mode 100644 index 0000000000..d96f9d427f --- /dev/null +++ b/contributing/samples/hitl/human_in_loop/tests/reimburse_dinner.json @@ -0,0 +1,88 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "I would like to request a reimbursement of $150 for a client dinner." + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "reimbursement_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "amount": 150, + "purpose": "client dinner" + }, + "id": "fc-1", + "name": "ask_for_approval" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-1" + ], + "nodeInfo": { + "path": "reimbursement_agent@1" + } + }, + { + "author": "reimbursement_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "ask_for_approval", + "response": { + "amount": 150, + "status": "pending", + "ticketId": "reimbursement-ticket-001" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "reimbursement_agent@1" + } + }, + { + "author": "reimbursement_agent", + "content": { + "parts": [ + { + "text": "Your reimbursement request for $150 for a client dinner has been sent for approval. Your ticket ID is reimbursement-ticket-001. I will let you know once I have an update." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "reimbursement_agent@1" + } + } + ] +} diff --git a/contributing/samples/fields_planner/__init__.py b/contributing/samples/hitl/human_tool_confirmation/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/fields_planner/__init__.py rename to contributing/samples/hitl/human_tool_confirmation/__init__.py diff --git a/contributing/samples/human_tool_confirmation/agent.py b/contributing/samples/hitl/human_tool_confirmation/agent.py similarity index 99% rename from contributing/samples/human_tool_confirmation/agent.py rename to contributing/samples/hitl/human_tool_confirmation/agent.py index bf9e6cdfc3..c7591d8974 100644 --- a/contributing/samples/human_tool_confirmation/agent.py +++ b/contributing/samples/hitl/human_tool_confirmation/agent.py @@ -69,7 +69,6 @@ def request_time_off(days: int, tool_context: ToolContext): root_agent = Agent( - model='gemini-2.5-flash', name='time_off_agent', instruction=""" You are a helpful assistant that can help employees with reimbursement and time off requests. diff --git a/contributing/samples/hitl/tool_confirmation/README.md b/contributing/samples/hitl/tool_confirmation/README.md new file mode 100644 index 0000000000..c57e334cd5 --- /dev/null +++ b/contributing/samples/hitl/tool_confirmation/README.md @@ -0,0 +1,64 @@ +# Tool Confirmation Sample + +## Overview + +This sample demonstrates how to use the Tool Confirmation feature in ADK to implement Human-in-the-Loop (HITL) flows. It shows how a tool can dynamically request confirmation from the user before proceeding with a sensitive action (e.g., transferring funds). + +## Sample Inputs + +- `Transfer $50 to Alice` + +- `Transfer $200 to Bob` + +- `Close account ACC123` + +- `Transfer $500 to Charlie and close account ACC123` + + *This will cause parallel tools being called in a single step* + +## How To + +### 1. Requesting Confirmation + +In your tool function, you can access the `ToolContext` and check if `tool_confirmation` is present. If not, you can call `tool_context.request_confirmation()` to request approval from the user. + +```python +def transfer_funds(amount: float, recipient: str, tool_context: ToolContext): + # Only request confirmation for amounts >= 100 + if amount >= 100: + if not tool_context.tool_confirmation: + tool_context.request_confirmation( + hint=f"Confirm transfer of ${amount} to {recipient}.", + ) + return {"error": "This tool call requires confirmation, please approve or reject."} +``` + +### 2. Handling the Response + +When the user responds to the confirmation request, the tool will be called again. This time, `tool_context.tool_confirmation` will be populated with the user's decision (`confirmed` boolean). + +```python + elif not tool_context.tool_confirmation.confirmed: + return {"error": "Transfer rejected by user."} + + return {"result": f"Successfully transferred ${amount} to {recipient}."} +``` + +### 3. Using `FunctionTool` for Automatic Confirmation + +Alternatively, you can specify that a tool always requires confirmation by wrapping it in a `FunctionTool` and setting `require_confirmation=True` when defining the agent's tools. In this case, the runner will automatically handle the confirmation request before calling your function. + +```python +from google.adk.tools.function_tool import FunctionTool + +def close_account(account_id: str, tool_context: ToolContext): + # This code only runs if the user approves the confirmation + return {"result": f"Account {account_id} closed."} + +root_agent = Agent( + ... + tools=[ + FunctionTool(func=close_account, require_confirmation=True), + ], +) +``` diff --git a/contributing/samples/files_retrieval_agent/__init__.py b/contributing/samples/hitl/tool_confirmation/__init__.py similarity index 100% rename from contributing/samples/files_retrieval_agent/__init__.py rename to contributing/samples/hitl/tool_confirmation/__init__.py diff --git a/contributing/samples/hitl/tool_confirmation/agent.py b/contributing/samples/hitl/tool_confirmation/agent.py new file mode 100644 index 0000000000..aa20e497ae --- /dev/null +++ b/contributing/samples/hitl/tool_confirmation/agent.py @@ -0,0 +1,57 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.agents import Agent +from google.adk.tools.function_tool import FunctionTool +from google.adk.tools.tool_context import ToolContext + + +def transfer_funds( + amount: float, recipient: str, tool_context: ToolContext +) -> dict[str, str]: + """Transfers funds to a recipient.""" + # Only request confirmation for amounts >= 100 + if amount >= 100: + if not tool_context.tool_confirmation: + tool_context.request_confirmation( + hint=f"Confirm transfer of ${amount} to {recipient}.", + ) + return { + "error": ( + "This tool call requires confirmation, please approve or reject." + ) + } + elif not tool_context.tool_confirmation.confirmed: + return {"error": "Transfer rejected by user."} + + # Proceed with transfer for amounts < 100 or if confirmed + return {"result": f"Successfully transferred ${amount} to {recipient}."} + + +def close_account(account_id: str) -> dict[str, str]: + """Closes a user account. This is a destructive action.""" + # With require_confirmation=True, this function is only called if the user + # approves. + return {"result": f"Account {account_id} closed successfully."} + + +root_agent = Agent( + name="money_transfer_assistant", + tools=[ + transfer_funds, + FunctionTool(func=close_account, require_confirmation=True), + ], +) diff --git a/contributing/samples/hitl/tool_confirmation/tests/Transfer_500_and_close_account_ACC123.json b/contributing/samples/hitl/tool_confirmation/tests/Transfer_500_and_close_account_ACC123.json new file mode 100644 index 0000000000..cbd0061758 --- /dev/null +++ b/contributing/samples/hitl/tool_confirmation/tests/Transfer_500_and_close_account_ACC123.json @@ -0,0 +1,276 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Transfer $500 to Charlie and close account ACC123" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "amount": 500, + "recipient": "Charlie" + }, + "id": "fc-1", + "name": "transfer_funds" + } + }, + { + "functionCall": { + "args": { + "account_id": "ACC123" + }, + "id": "fc-2", + "name": "close_account" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "originalFunctionCall": { + "args": { + "amount": 500, + "recipient": "Charlie" + }, + "id": "fc-1", + "name": "transfer_funds" + }, + "toolConfirmation": { + "confirmed": false, + "hint": "Confirm transfer of $500 to Charlie." + } + }, + "id": "fc-3", + "name": "adk_request_confirmation" + } + }, + { + "functionCall": { + "args": { + "originalFunctionCall": { + "args": { + "account_id": "ACC123" + }, + "id": "fc-2", + "name": "close_account" + }, + "toolConfirmation": { + "confirmed": false, + "hint": "Please approve or reject the tool call close_account() by responding with a FunctionResponse with an expected ToolConfirmation payload." + } + }, + "id": "fc-4", + "name": "adk_request_confirmation" + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-4", + "fc-3" + ], + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "actions": { + "requestedToolConfirmations": { + "fc-1": { + "confirmed": false, + "hint": "Confirm transfer of $500 to Charlie." + }, + "fc-2": { + "confirmed": false, + "hint": "Please approve or reject the tool call close_account() by responding with a FunctionResponse with an expected ToolConfirmation payload." + } + }, + "skipSummarization": true + }, + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "transfer_funds", + "response": { + "error": "This tool call requires confirmation, please approve or reject." + } + } + }, + { + "functionResponse": { + "id": "fc-2", + "name": "close_account", + "response": { + "error": "This tool call requires confirmation, please approve or reject." + } + } + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-3", + "name": "adk_request_confirmation", + "response": { + "confirmed": true + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "transfer_funds", + "response": { + "result": "Successfully transferred $500 to Charlie." + } + } + } + ], + "role": "user" + }, + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "text": "I transferred $500 to Charlie. I can close account ACC123, but it is a destructive action that requires confirmation. Do you want me to go ahead and close it?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-4", + "name": "adk_request_confirmation", + "response": { + "confirmed": true + } + } + } + ], + "role": "user" + }, + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "close_account", + "response": { + "result": "Account ACC123 closed successfully." + } + } + } + ], + "role": "user" + }, + "id": "e-9", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "text": "I have transferred $500 to Charlie and closed account ACC123.\n" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-10", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + } + ] +} diff --git a/contributing/samples/hitl/tool_confirmation/tests/close_account_acc123.json b/contributing/samples/hitl/tool_confirmation/tests/close_account_acc123.json new file mode 100644 index 0000000000..8c5b560437 --- /dev/null +++ b/contributing/samples/hitl/tool_confirmation/tests/close_account_acc123.json @@ -0,0 +1,171 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Close account ACC123\n" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "account_id": "ACC123" + }, + "id": "fc-1", + "name": "close_account" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "originalFunctionCall": { + "args": { + "account_id": "ACC123" + }, + "id": "fc-1", + "name": "close_account" + }, + "toolConfirmation": { + "confirmed": false, + "hint": "Please approve or reject the tool call close_account() by responding with a FunctionResponse with an expected ToolConfirmation payload." + } + }, + "id": "fc-2", + "name": "adk_request_confirmation" + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-2" + ], + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "actions": { + "requestedToolConfirmations": { + "fc-1": { + "confirmed": false, + "hint": "Please approve or reject the tool call close_account() by responding with a FunctionResponse with an expected ToolConfirmation payload." + } + }, + "skipSummarization": true + }, + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "close_account", + "response": { + "error": "This tool call requires confirmation, please approve or reject." + } + } + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "adk_request_confirmation", + "response": { + "confirmed": true + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "close_account", + "response": { + "result": "Account ACC123 closed successfully." + } + } + } + ], + "role": "user" + }, + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "text": "I have closed the account ACC123." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + } + ] +} diff --git a/contributing/samples/hitl/tool_confirmation/tests/transfer_200_confirmed.json b/contributing/samples/hitl/tool_confirmation/tests/transfer_200_confirmed.json new file mode 100644 index 0000000000..9fa99baa35 --- /dev/null +++ b/contributing/samples/hitl/tool_confirmation/tests/transfer_200_confirmed.json @@ -0,0 +1,189 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Transfer $200 to Bob" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "amount": 200, + "recipient": "Bob" + }, + "id": "fc-1", + "name": "transfer_funds" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "originalFunctionCall": { + "args": { + "amount": 200, + "recipient": "Bob" + }, + "id": "fc-1", + "name": "transfer_funds" + }, + "toolConfirmation": { + "confirmed": false, + "hint": "Confirm transfer of $200 to Bob." + } + }, + "id": "fc-2", + "name": "adk_request_confirmation" + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-2" + ], + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "actions": { + "requestedToolConfirmations": { + "fc-1": { + "confirmed": false, + "hint": "Confirm transfer of $200 to Bob." + } + } + }, + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "transfer_funds", + "response": { + "error": "This tool call requires confirmation, please approve or reject." + } + } + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "text": "I need to confirm this transfer with you. Please approve or reject." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "adk_request_confirmation", + "response": { + "confirmed": true + } + } + } + ], + "role": "user" + }, + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "transfer_funds", + "response": { + "result": "Successfully transferred $200 to Bob." + } + } + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "text": "Successfully transferred $200 to Bob." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + } + ] +} diff --git a/contributing/samples/hitl/tool_confirmation/tests/transfer_200_declined.json b/contributing/samples/hitl/tool_confirmation/tests/transfer_200_declined.json new file mode 100644 index 0000000000..3a1279f6f4 --- /dev/null +++ b/contributing/samples/hitl/tool_confirmation/tests/transfer_200_declined.json @@ -0,0 +1,189 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Transfer $200 to Bob" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "amount": 200, + "recipient": "Bob" + }, + "id": "fc-1", + "name": "transfer_funds" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "originalFunctionCall": { + "args": { + "amount": 200, + "recipient": "Bob" + }, + "id": "fc-1", + "name": "transfer_funds" + }, + "toolConfirmation": { + "confirmed": false, + "hint": "Confirm transfer of $200 to Bob." + } + }, + "id": "fc-2", + "name": "adk_request_confirmation" + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-2" + ], + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "actions": { + "requestedToolConfirmations": { + "fc-1": { + "confirmed": false, + "hint": "Confirm transfer of $200 to Bob." + } + } + }, + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "transfer_funds", + "response": { + "error": "This tool call requires confirmation, please approve or reject." + } + } + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "text": "Your transfer of $200 to Bob requires confirmation." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "adk_request_confirmation", + "response": { + "confirmed": false + } + } + } + ], + "role": "user" + }, + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "transfer_funds", + "response": { + "error": "Transfer rejected by user." + } + } + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "text": "I'm sorry, your transfer could not be completed. It was rejected by the user." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + } + ] +} diff --git a/contributing/samples/hitl/tool_confirmation/tests/transfer_50.json b/contributing/samples/hitl/tool_confirmation/tests/transfer_50.json new file mode 100644 index 0000000000..624c93aa2a --- /dev/null +++ b/contributing/samples/hitl/tool_confirmation/tests/transfer_50.json @@ -0,0 +1,84 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Transfer $50 to Alice\n" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "amount": 50, + "recipient": "Alice" + }, + "id": "fc-1", + "name": "transfer_funds" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "transfer_funds", + "response": { + "result": "Successfully transferred $50 to Alice." + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + }, + { + "author": "money_transfer_assistant", + "content": { + "parts": [ + { + "text": "Successfully transferred $50 to Alice." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "money_transfer_assistant@1" + } + } + ] +} diff --git a/contributing/samples/tool_human_in_the_loop_config/README.md b/contributing/samples/hitl/tool_human_in_the_loop_config/README.md similarity index 100% rename from contributing/samples/tool_human_in_the_loop_config/README.md rename to contributing/samples/hitl/tool_human_in_the_loop_config/README.md diff --git a/contributing/samples/gepa/__init__.py b/contributing/samples/hitl/tool_human_in_the_loop_config/__init__.py similarity index 100% rename from contributing/samples/gepa/__init__.py rename to contributing/samples/hitl/tool_human_in_the_loop_config/__init__.py diff --git a/contributing/samples/tool_human_in_the_loop_config/root_agent.yaml b/contributing/samples/hitl/tool_human_in_the_loop_config/root_agent.yaml similarity index 100% rename from contributing/samples/tool_human_in_the_loop_config/root_agent.yaml rename to contributing/samples/hitl/tool_human_in_the_loop_config/root_agent.yaml diff --git a/contributing/samples/tool_human_in_the_loop_config/tools.py b/contributing/samples/hitl/tool_human_in_the_loop_config/tools.py similarity index 100% rename from contributing/samples/tool_human_in_the_loop_config/tools.py rename to contributing/samples/hitl/tool_human_in_the_loop_config/tools.py diff --git a/contributing/samples/agent_registry_agent/README.md b/contributing/samples/integrations/agent_registry_agent/README.md similarity index 100% rename from contributing/samples/agent_registry_agent/README.md rename to contributing/samples/integrations/agent_registry_agent/README.md diff --git a/contributing/samples/generate_image/__init__.py b/contributing/samples/integrations/agent_registry_agent/__init__.py similarity index 100% rename from contributing/samples/generate_image/__init__.py rename to contributing/samples/integrations/agent_registry_agent/__init__.py diff --git a/contributing/samples/agent_registry_agent/agent.py b/contributing/samples/integrations/agent_registry_agent/agent.py similarity index 100% rename from contributing/samples/agent_registry_agent/agent.py rename to contributing/samples/integrations/agent_registry_agent/agent.py diff --git a/contributing/samples/api_registry_agent/README.md b/contributing/samples/integrations/api_registry_agent/README.md similarity index 100% rename from contributing/samples/api_registry_agent/README.md rename to contributing/samples/integrations/api_registry_agent/README.md diff --git a/contributing/samples/google_api/__init__.py b/contributing/samples/integrations/api_registry_agent/__init__.py similarity index 100% rename from contributing/samples/google_api/__init__.py rename to contributing/samples/integrations/api_registry_agent/__init__.py diff --git a/contributing/samples/api_registry_agent/agent.py b/contributing/samples/integrations/api_registry_agent/agent.py similarity index 98% rename from contributing/samples/api_registry_agent/agent.py rename to contributing/samples/integrations/api_registry_agent/agent.py index 87faea3116..27dac7a6c7 100644 --- a/contributing/samples/api_registry_agent/agent.py +++ b/contributing/samples/integrations/api_registry_agent/agent.py @@ -26,7 +26,6 @@ mcp_server_name=MCP_SERVER_NAME, ) root_agent = LlmAgent( - model="gemini-2.5-flash", name="bigquery_assistant", instruction=f""" You are a helpful data analyst assistant with access to BigQuery. The project ID is: {PROJECT_ID} diff --git a/contributing/samples/application_integration_agent/README.md b/contributing/samples/integrations/application_integration_agent/README.md similarity index 100% rename from contributing/samples/application_integration_agent/README.md rename to contributing/samples/integrations/application_integration_agent/README.md diff --git a/contributing/samples/google_search_agent/__init__.py b/contributing/samples/integrations/application_integration_agent/__init__.py similarity index 100% rename from contributing/samples/google_search_agent/__init__.py rename to contributing/samples/integrations/application_integration_agent/__init__.py diff --git a/contributing/samples/application_integration_agent/agent.py b/contributing/samples/integrations/application_integration_agent/agent.py similarity index 98% rename from contributing/samples/application_integration_agent/agent.py rename to contributing/samples/integrations/application_integration_agent/agent.py index a033122f3a..66b8a1102e 100644 --- a/contributing/samples/application_integration_agent/agent.py +++ b/contributing/samples/integrations/application_integration_agent/agent.py @@ -37,7 +37,6 @@ ) root_agent = LlmAgent( - model="gemini-2.5-flash", name="Issue_Management_Agent", instruction=""" You are an agent that helps manage issues in a Jira instance. diff --git a/contributing/samples/authn-adk-all-in-one/README.md b/contributing/samples/integrations/authn-adk-all-in-one/README.md similarity index 100% rename from contributing/samples/authn-adk-all-in-one/README.md rename to contributing/samples/integrations/authn-adk-all-in-one/README.md diff --git a/contributing/samples/hello_world/__init__.py b/contributing/samples/integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/hello_world/__init__.py rename to contributing/samples/integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py diff --git a/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py b/contributing/samples/integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py similarity index 100% rename from contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py rename to contributing/samples/integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py diff --git a/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml b/contributing/samples/integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml similarity index 100% rename from contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml rename to contributing/samples/integrations/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml diff --git a/contributing/samples/authn-adk-all-in-one/adk_agents/requirements.txt b/contributing/samples/integrations/authn-adk-all-in-one/adk_agents/requirements.txt similarity index 100% rename from contributing/samples/authn-adk-all-in-one/adk_agents/requirements.txt rename to contributing/samples/integrations/authn-adk-all-in-one/adk_agents/requirements.txt diff --git a/contributing/samples/authn-adk-all-in-one/adk_agents/sample.env b/contributing/samples/integrations/authn-adk-all-in-one/adk_agents/sample.env similarity index 100% rename from contributing/samples/authn-adk-all-in-one/adk_agents/sample.env rename to contributing/samples/integrations/authn-adk-all-in-one/adk_agents/sample.env diff --git a/contributing/samples/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg b/contributing/samples/integrations/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg similarity index 100% rename from contributing/samples/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg rename to contributing/samples/integrations/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg diff --git a/contributing/samples/authn-adk-all-in-one/doc_images/jwks_updated.png b/contributing/samples/integrations/authn-adk-all-in-one/doc_images/jwks_updated.png similarity index 100% rename from contributing/samples/authn-adk-all-in-one/doc_images/jwks_updated.png rename to contributing/samples/integrations/authn-adk-all-in-one/doc_images/jwks_updated.png diff --git a/contributing/samples/authn-adk-all-in-one/doc_images/jwksgen.png b/contributing/samples/integrations/authn-adk-all-in-one/doc_images/jwksgen.png similarity index 100% rename from contributing/samples/authn-adk-all-in-one/doc_images/jwksgen.png rename to contributing/samples/integrations/authn-adk-all-in-one/doc_images/jwksgen.png diff --git a/contributing/samples/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py b/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py similarity index 97% rename from contributing/samples/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py rename to contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py index 8bf94632d8..c171e859b0 100644 --- a/contributing/samples/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py +++ b/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py @@ -18,9 +18,7 @@ class HotelBooker: - """ - Core business logic for hotel booking, independent of any web framework. - """ + """Core business logic for hotel booking, independent of any web framework.""" def __init__(self, db_name="data.db"): self.db_name = db_name @@ -33,9 +31,7 @@ def _get_db_connection(self): return conn def _initialize_db(self): - """ - Drops, creates, and populates the database tables with sample data. - """ + """Drops, creates, and populates the database tables with sample data.""" conn = None try: conn = self._get_db_connection() diff --git a/contributing/samples/authn-adk-all-in-one/hotel_booker_app/main.py b/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/main.py similarity index 98% rename from contributing/samples/authn-adk-all-in-one/hotel_booker_app/main.py rename to contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/main.py index 3f7c67dcba..f7e56f1982 100644 --- a/contributing/samples/authn-adk-all-in-one/hotel_booker_app/main.py +++ b/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/main.py @@ -90,9 +90,7 @@ def close_db(exception): def is_token_valid(token: str): - """ - Validates a JWT token using the public key from the OIDC jwks_uri. - """ + """Validates a JWT token using the public key from the OIDC jwks_uri.""" if not token: return False, "Token is empty." diff --git a/contributing/samples/authn-adk-all-in-one/hotel_booker_app/openapi.yaml b/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/openapi.yaml similarity index 100% rename from contributing/samples/authn-adk-all-in-one/hotel_booker_app/openapi.yaml rename to contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/openapi.yaml diff --git a/contributing/samples/authn-adk-all-in-one/idp/app.py b/contributing/samples/integrations/authn-adk-all-in-one/idp/app.py similarity index 100% rename from contributing/samples/authn-adk-all-in-one/idp/app.py rename to contributing/samples/integrations/authn-adk-all-in-one/idp/app.py diff --git a/contributing/samples/authn-adk-all-in-one/idp/sample.env b/contributing/samples/integrations/authn-adk-all-in-one/idp/sample.env similarity index 100% rename from contributing/samples/authn-adk-all-in-one/idp/sample.env rename to contributing/samples/integrations/authn-adk-all-in-one/idp/sample.env diff --git a/contributing/samples/integrations/authn-adk-all-in-one/idp/sample.jwks.json b/contributing/samples/integrations/authn-adk-all-in-one/idp/sample.jwks.json new file mode 100644 index 0000000000..ab4f36ac39 --- /dev/null +++ b/contributing/samples/integrations/authn-adk-all-in-one/idp/sample.jwks.json @@ -0,0 +1,5 @@ +{ + "keys": [ + "Replace with JWKS from jwkset.com/generate" + ] +} diff --git a/contributing/samples/authn-adk-all-in-one/idp/templates/admin.html b/contributing/samples/integrations/authn-adk-all-in-one/idp/templates/admin.html similarity index 100% rename from contributing/samples/authn-adk-all-in-one/idp/templates/admin.html rename to contributing/samples/integrations/authn-adk-all-in-one/idp/templates/admin.html diff --git a/contributing/samples/authn-adk-all-in-one/idp/templates/consent.html b/contributing/samples/integrations/authn-adk-all-in-one/idp/templates/consent.html similarity index 100% rename from contributing/samples/authn-adk-all-in-one/idp/templates/consent.html rename to contributing/samples/integrations/authn-adk-all-in-one/idp/templates/consent.html diff --git a/contributing/samples/authn-adk-all-in-one/idp/templates/login.html b/contributing/samples/integrations/authn-adk-all-in-one/idp/templates/login.html similarity index 100% rename from contributing/samples/authn-adk-all-in-one/idp/templates/login.html rename to contributing/samples/integrations/authn-adk-all-in-one/idp/templates/login.html diff --git a/contributing/samples/authn-adk-all-in-one/requirements.txt b/contributing/samples/integrations/authn-adk-all-in-one/requirements.txt similarity index 81% rename from contributing/samples/authn-adk-all-in-one/requirements.txt rename to contributing/samples/integrations/authn-adk-all-in-one/requirements.txt index 45cba168a5..d5bc65a788 100644 --- a/contributing/samples/authn-adk-all-in-one/requirements.txt +++ b/contributing/samples/integrations/authn-adk-all-in-one/requirements.txt @@ -1,5 +1,4 @@ -google-adk==1.28.1 - +google-adk==1.12 Flask==3.1.3 flask-cors==6.0.1 python-dotenv==1.1.1 diff --git a/contributing/samples/bigquery/README.md b/contributing/samples/integrations/bigquery/README.md similarity index 100% rename from contributing/samples/bigquery/README.md rename to contributing/samples/integrations/bigquery/README.md diff --git a/contributing/samples/hello_world_app/__init__.py b/contributing/samples/integrations/bigquery/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/hello_world_app/__init__.py rename to contributing/samples/integrations/bigquery/__init__.py diff --git a/contributing/samples/bigquery/agent.py b/contributing/samples/integrations/bigquery/agent.py similarity index 99% rename from contributing/samples/bigquery/agent.py rename to contributing/samples/integrations/bigquery/agent.py index 7e2031030c..0db42297ee 100644 --- a/contributing/samples/bigquery/agent.py +++ b/contributing/samples/integrations/bigquery/agent.py @@ -91,7 +91,6 @@ # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( - model="gemini-2.5-flash", name=BIGQUERY_AGENT_NAME, description=( "Agent to answer questions about BigQuery data and models and execute" diff --git a/contributing/samples/bigquery_mcp/README.md b/contributing/samples/integrations/bigquery_mcp/README.md similarity index 100% rename from contributing/samples/bigquery_mcp/README.md rename to contributing/samples/integrations/bigquery_mcp/README.md diff --git a/contributing/samples/hello_world_ma/__init__.py b/contributing/samples/integrations/bigquery_mcp/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/hello_world_ma/__init__.py rename to contributing/samples/integrations/bigquery_mcp/__init__.py diff --git a/contributing/samples/bigquery_mcp/agent.py b/contributing/samples/integrations/bigquery_mcp/agent.py similarity index 98% rename from contributing/samples/bigquery_mcp/agent.py rename to contributing/samples/integrations/bigquery_mcp/agent.py index fb3a16f22d..b852b2c62a 100644 --- a/contributing/samples/bigquery_mcp/agent.py +++ b/contributing/samples/integrations/bigquery_mcp/agent.py @@ -37,7 +37,6 @@ # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( - model="gemini-2.5-flash", name=BIGQUERY_AGENT_NAME, description=( "Agent to answer questions about BigQuery data and models and execute" diff --git a/contributing/samples/bigtable/README.md b/contributing/samples/integrations/bigtable/README.md similarity index 100% rename from contributing/samples/bigtable/README.md rename to contributing/samples/integrations/bigtable/README.md diff --git a/contributing/samples/hello_world_ollama/__init__.py b/contributing/samples/integrations/bigtable/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/hello_world_ollama/__init__.py rename to contributing/samples/integrations/bigtable/__init__.py diff --git a/contributing/samples/bigtable/agent.py b/contributing/samples/integrations/bigtable/agent.py similarity index 99% rename from contributing/samples/bigtable/agent.py rename to contributing/samples/integrations/bigtable/agent.py index 1d52e1fef2..6d0ead8698 100644 --- a/contributing/samples/bigtable/agent.py +++ b/contributing/samples/integrations/bigtable/agent.py @@ -112,7 +112,6 @@ def search_hotels_by_location( # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( - model="gemini-2.5-flash", name="bigtable_agent", description=( "Agent to answer questions about Bigtable database tables and" diff --git a/contributing/samples/crewai_tool_kwargs/README.md b/contributing/samples/integrations/crewai_tool_kwargs/README.md similarity index 100% rename from contributing/samples/crewai_tool_kwargs/README.md rename to contributing/samples/integrations/crewai_tool_kwargs/README.md diff --git a/contributing/samples/hello_world_stream_fc_args/__init__.py b/contributing/samples/integrations/crewai_tool_kwargs/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/hello_world_stream_fc_args/__init__.py rename to contributing/samples/integrations/crewai_tool_kwargs/__init__.py diff --git a/contributing/samples/crewai_tool_kwargs/agent.py b/contributing/samples/integrations/crewai_tool_kwargs/agent.py similarity index 99% rename from contributing/samples/crewai_tool_kwargs/agent.py rename to contributing/samples/integrations/crewai_tool_kwargs/agent.py index 4583d9aa9c..8853edb380 100644 --- a/contributing/samples/crewai_tool_kwargs/agent.py +++ b/contributing/samples/integrations/crewai_tool_kwargs/agent.py @@ -95,7 +95,6 @@ def _run(self, query: str, **kwargs) -> str: ) root_agent = Agent( - model="gemini-2.5-flash", name="search_agent", description="An agent that can search with flexible filtering options", instruction=""" diff --git a/contributing/samples/crewai_tool_kwargs/main.py b/contributing/samples/integrations/crewai_tool_kwargs/main.py similarity index 100% rename from contributing/samples/crewai_tool_kwargs/main.py rename to contributing/samples/integrations/crewai_tool_kwargs/main.py diff --git a/contributing/samples/data_agent/README.md b/contributing/samples/integrations/data_agent/README.md similarity index 100% rename from contributing/samples/data_agent/README.md rename to contributing/samples/integrations/data_agent/README.md diff --git a/contributing/samples/history_management/__init__.py b/contributing/samples/integrations/data_agent/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/history_management/__init__.py rename to contributing/samples/integrations/data_agent/__init__.py diff --git a/contributing/samples/data_agent/agent.py b/contributing/samples/integrations/data_agent/agent.py similarity index 61% rename from contributing/samples/data_agent/agent.py rename to contributing/samples/integrations/data_agent/agent.py index cbe210206c..01e83bed50 100644 --- a/contributing/samples/data_agent/agent.py +++ b/contributing/samples/integrations/data_agent/agent.py @@ -12,22 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import annotations - -import asyncio import os -from typing import Any from google.adk.agents import Agent from google.adk.auth.auth_credential import AuthCredentialTypes -from google.adk.tools import load_artifacts from google.adk.tools.data_agent.config import DataAgentToolConfig from google.adk.tools.data_agent.credentials import DataAgentCredentialsConfig from google.adk.tools.data_agent.data_agent_toolset import DataAgentToolset -from google.adk.tools.tool_context import ToolContext import google.auth import google.auth.transport.requests -from google.genai import types # Define the desired credential type. # By default use Application Default Credentials (ADC) from the local @@ -79,64 +72,16 @@ ], ) - -# NOTE: The generate_chart tool requires 'altair' and 'vl-convert-python' to be -# installed in your environment. You can install them using: -# pip install altair vl-convert-python -async def generate_chart( - chart_spec: dict[str, Any], tool_context: ToolContext -) -> dict[str, str]: - """Generates a professional chart using Altair based on a Vega-Lite spec. - - Args: - chart_spec: A dictionary defining a Vega-Lite chart. - tool_context: The tool context. - - Returns: - A dictionary containing the status of the chart generation ("success" or - "error"), a detail message, and the filename if successful. - """ - import altair as alt - import vl_convert as vlc - - try: - # Altair can take a Vega-Lite dict directly and render it. - # We use vl-convert to transform the spec into a high-quality PNG. - png_data = await asyncio.to_thread(vlc.vegalite_to_png, chart_spec, scale=2) - - # Save as artifact - await tool_context.save_artifact( - "chart.png", - types.Part.from_bytes(data=png_data, mime_type="image/png"), - ) - title = chart_spec.get("title", "Chart") - return { - "status": "success", - "detail": ( - f"Professional chart '{title}' rendered using Altair/Vega-Lite." - ), - "filename": "chart.png", - } - except Exception as e: # pylint: disable=broad-exception-caught - return {"status": "error", "detail": f"Failed to render chart: {str(e)}"} - - root_agent = Agent( name="data_agent", - model="gemini-2.5-flash", - description=( - "Agent to answer user questions using Data Agents and generate charts." - ), + description="Agent to answer user questions using Data Agents.", instruction=( "## Persona\nYou are a helpful assistant that uses Data Agents" " to answer user questions about their data.\n\n## Tools\n- You can" " list available data agents using `list_accessible_data_agents`.\n-" " You can get information about a specific data agent using" " `get_data_agent_info`.\n- You can chat with a specific data" - " agent using `ask_data_agent`.\n- `generate_chart` renders" - " professional charts from a `chart_spec` (Vega-Lite JSON). Use this" - " whenever you need to visualize data; do not show raw JSON to the" - " user.\n- You can load artifacts using `load_artifacts`.\n" + " agent using `ask_data_agent`.\n" ), - tools=[da_toolset, generate_chart, load_artifacts], + tools=[da_toolset], ) diff --git a/contributing/samples/files_retrieval_agent/README.md b/contributing/samples/integrations/files_retrieval_agent/README.md similarity index 100% rename from contributing/samples/files_retrieval_agent/README.md rename to contributing/samples/integrations/files_retrieval_agent/README.md diff --git a/contributing/samples/human_in_loop/__init__.py b/contributing/samples/integrations/files_retrieval_agent/__init__.py similarity index 100% rename from contributing/samples/human_in_loop/__init__.py rename to contributing/samples/integrations/files_retrieval_agent/__init__.py diff --git a/contributing/samples/files_retrieval_agent/agent.py b/contributing/samples/integrations/files_retrieval_agent/agent.py similarity index 98% rename from contributing/samples/files_retrieval_agent/agent.py rename to contributing/samples/integrations/files_retrieval_agent/agent.py index c23671f1cb..48ff1d2d6b 100644 --- a/contributing/samples/files_retrieval_agent/agent.py +++ b/contributing/samples/integrations/files_retrieval_agent/agent.py @@ -42,7 +42,6 @@ ) root_agent = Agent( - model="gemini-2.5-flash", name="files_retrieval_agent", instruction=( "You are a helpful assistant that answers questions about the Agent" diff --git a/contributing/samples/files_retrieval_agent/data/adk_overview.txt b/contributing/samples/integrations/files_retrieval_agent/data/adk_overview.txt similarity index 100% rename from contributing/samples/files_retrieval_agent/data/adk_overview.txt rename to contributing/samples/integrations/files_retrieval_agent/data/adk_overview.txt diff --git a/contributing/samples/files_retrieval_agent/data/tools_guide.txt b/contributing/samples/integrations/files_retrieval_agent/data/tools_guide.txt similarity index 100% rename from contributing/samples/files_retrieval_agent/data/tools_guide.txt rename to contributing/samples/integrations/files_retrieval_agent/data/tools_guide.txt diff --git a/contributing/samples/human_tool_confirmation/__init__.py b/contributing/samples/integrations/gcp_skill_registry_agent/__init__.py similarity index 100% rename from contributing/samples/human_tool_confirmation/__init__.py rename to contributing/samples/integrations/gcp_skill_registry_agent/__init__.py diff --git a/contributing/samples/integrations/gcp_skill_registry_agent/agent.py b/contributing/samples/integrations/gcp_skill_registry_agent/agent.py new file mode 100644 index 0000000000..558b6ecfff --- /dev/null +++ b/contributing/samples/integrations/gcp_skill_registry_agent/agent.py @@ -0,0 +1,40 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Sample agent demonstrating the use of GCPSkillRegistry.""" + +from google.adk import Agent +from google.adk.integrations.skill_registry import GCPSkillRegistry +from google.adk.tools.skill_toolset import SkillToolset + +# Initialize GCP Skill Registry +registry = GCPSkillRegistry( + project_id="your-project-id", location="us-central1" +) + +# Initialize SkillToolset with registry +skill_toolset = SkillToolset(skills=[], registry=registry) + +root_agent = Agent( + model="gemini-2.5-flash", + name="skill_registry_agent", + description=( + "An agent that can discover and load skills from GCP Skill Registry." + ), + instruction=( + "Use search_skills to find skills and load_skill to load them if" + " needed." + ), + tools=[skill_toolset], +) diff --git a/contributing/samples/gepa/README.md b/contributing/samples/integrations/gepa/README.md similarity index 100% rename from contributing/samples/gepa/README.md rename to contributing/samples/integrations/gepa/README.md diff --git a/contributing/samples/sub_agents_config/__init__.py b/contributing/samples/integrations/gepa/__init__.py similarity index 100% rename from contributing/samples/sub_agents_config/__init__.py rename to contributing/samples/integrations/gepa/__init__.py diff --git a/contributing/samples/gepa/adk_agent.py b/contributing/samples/integrations/gepa/adk_agent.py similarity index 100% rename from contributing/samples/gepa/adk_agent.py rename to contributing/samples/integrations/gepa/adk_agent.py diff --git a/contributing/samples/gepa/adk_agent_test.py b/contributing/samples/integrations/gepa/adk_agent_test.py similarity index 100% rename from contributing/samples/gepa/adk_agent_test.py rename to contributing/samples/integrations/gepa/adk_agent_test.py diff --git a/contributing/samples/gepa/experiment.py b/contributing/samples/integrations/gepa/experiment.py similarity index 100% rename from contributing/samples/gepa/experiment.py rename to contributing/samples/integrations/gepa/experiment.py diff --git a/contributing/samples/gepa/gepa_tau_bench.ipynb b/contributing/samples/integrations/gepa/gepa_tau_bench.ipynb similarity index 99% rename from contributing/samples/gepa/gepa_tau_bench.ipynb rename to contributing/samples/integrations/gepa/gepa_tau_bench.ipynb index f4f3454a39..ef3769475e 100644 --- a/contributing/samples/gepa/gepa_tau_bench.ipynb +++ b/contributing/samples/integrations/gepa/gepa_tau_bench.ipynb @@ -100,7 +100,6 @@ "from google.genai import types\n", "import utils\n", "\n", - "\n", "# @markdown ### ☁️ Configure Vertex AI Access\n", "# @markdown Enter your Google Cloud Project ID and Location.\n", "\n", diff --git a/contributing/samples/gepa/gepa_utils.py b/contributing/samples/integrations/gepa/gepa_utils.py similarity index 100% rename from contributing/samples/gepa/gepa_utils.py rename to contributing/samples/integrations/gepa/gepa_utils.py diff --git a/contributing/samples/gepa/rater_lib.py b/contributing/samples/integrations/gepa/rater_lib.py similarity index 100% rename from contributing/samples/gepa/rater_lib.py rename to contributing/samples/integrations/gepa/rater_lib.py diff --git a/contributing/samples/gepa/rubric_validation_template.txt b/contributing/samples/integrations/gepa/rubric_validation_template.txt similarity index 100% rename from contributing/samples/gepa/rubric_validation_template.txt rename to contributing/samples/integrations/gepa/rubric_validation_template.txt diff --git a/contributing/samples/gepa/run_experiment.py b/contributing/samples/integrations/gepa/run_experiment.py similarity index 100% rename from contributing/samples/gepa/run_experiment.py rename to contributing/samples/integrations/gepa/run_experiment.py diff --git a/contributing/samples/gepa/tau_bench_agent.py b/contributing/samples/integrations/gepa/tau_bench_agent.py similarity index 100% rename from contributing/samples/gepa/tau_bench_agent.py rename to contributing/samples/integrations/gepa/tau_bench_agent.py diff --git a/contributing/samples/gepa/voter_agent/eval_prompts.txt b/contributing/samples/integrations/gepa/voter_agent/eval_prompts.txt similarity index 100% rename from contributing/samples/gepa/voter_agent/eval_prompts.txt rename to contributing/samples/integrations/gepa/voter_agent/eval_prompts.txt diff --git a/contributing/samples/gepa/voter_agent/gepa.ipynb b/contributing/samples/integrations/gepa/voter_agent/gepa.ipynb similarity index 97% rename from contributing/samples/gepa/voter_agent/gepa.ipynb rename to contributing/samples/integrations/gepa/voter_agent/gepa.ipynb index 5131bedc39..37cccf5d66 100644 --- a/contributing/samples/gepa/voter_agent/gepa.ipynb +++ b/contributing/samples/integrations/gepa/voter_agent/gepa.ipynb @@ -62,7 +62,7 @@ }, "outputs": [], "source": [ - "#@title Install GEPA\n", + "# @title Install GEPA\n", "!git clone https://github.com/google/adk-python.git\n", "!pip install gepa --quiet\n", "!pip install litellm --quiet\n", @@ -78,7 +78,7 @@ }, "outputs": [], "source": [ - "#@title Configure python dependencies\n", + "# @title Configure python dependencies\n", "import sys\n", "\n", "sys.path.append('/content/adk-python/contributing/samples/gepa')" @@ -93,8 +93,9 @@ }, "outputs": [], "source": [ - "#@title Authentication\n", + "# @title Authentication\n", "from google.colab import auth\n", + "\n", "auth.authenticate_user()" ] }, @@ -107,7 +108,7 @@ }, "outputs": [], "source": [ - "#@title Setup\n", + "# @title Setup\n", "import json\n", "import logging\n", "import os\n", @@ -115,14 +116,13 @@ "from google.genai import types\n", "import utils\n", "\n", - "\n", "# @markdown ### ☁️ Configure Vertex AI Access\n", "# @markdown Enter your Google Cloud Project ID and Location.\n", "\n", - "#@markdown Configure Vertex AI Access\n", + "# @markdown Configure Vertex AI Access\n", "\n", - "GCP_PROJECT = '' #@param {type: 'string'}\n", - "GCP_LOCATION = 'us-central1' #@param {type: 'string'}\n", + "GCP_PROJECT = '' # @param {type: 'string'}\n", + "GCP_LOCATION = 'us-central1' # @param {type: 'string'}\n", "\n", "# The ADK uses these environment variables to connect to Vertex AI via the\n", "# Google GenAI SDK.\n", @@ -132,9 +132,7 @@ "\n", "# Set a logging verbosity suited for this experiment. See\n", "# https://github.com/google/adk-python/issues/1852 for context\n", - "loggers = [\n", - " logging.getLogger(name) for name in logging.root.manager.loggerDict\n", - "]\n", + "loggers = [logging.getLogger(name) for name in logging.root.manager.loggerDict]\n", "\n", "# Iterate through the loggers and set their level to WARNING\n", "for logger in loggers:\n", @@ -174,20 +172,18 @@ }, "outputs": [], "source": [ - "#@title Define our ADK agent\n", + "# @title Define our ADK agent\n", "# @markdown Note: You can replace this agent with your own agent and tools.\n", "\n", "from google.adk.agents import base_agent\n", "from google.adk.agents import llm_agent\n", - "\n", "from voter_agent import tools\n", "\n", - "\n", "# @markdown ### 🧠 Configure our ADK LLM Agent\n", "\n", - "GEMINI_MODEL = \"gemini-2.5-flash\" #@param ['gemini-2.5-flash', 'gemini-2.5-pro']\n", - "AGENT_NAME = \"VoteTaker\" #@param {type: 'string'}\n", - "AGENT_DESCRIPTION = \"Collects and validates audience votes for presentation topics.\" #@param {type: 'string'}\n", + "GEMINI_MODEL = \"gemini-2.5-flash\" # @param ['gemini-2.5-flash', 'gemini-2.5-pro']\n", + "AGENT_NAME = \"VoteTaker\" # @param {type: 'string'}\n", + "AGENT_DESCRIPTION = \"Collects and validates audience votes for presentation topics.\" # @param {type: 'string'}\n", "\n", "\n", "def get_agent(instructions: str) -> base_agent.BaseAgent:\n", @@ -204,7 +200,7 @@ " tools.set_voting_round,\n", " ],\n", " output_key=\"vote_confirmation\",\n", - " )\n" + " )" ] }, { @@ -361,10 +357,11 @@ } ], "source": [ - "#@title Load a dataset of sample user prompts\n", + "# @title Load a dataset of sample user prompts\n", "\n", "# @markdown This is an initial set of example queries on which we would like our agent to properly filter PII.\n", "\n", + "\n", "def _read_prompts(filename: str) -> list[str]:\n", " return [line.strip() for line in open(filename) if line.strip()]\n", "\n", @@ -413,31 +410,37 @@ } ], "source": [ - "#@title Define our voting agent and visualize a trace\n", + "# @title Define our voting agent and visualize a trace\n", "\n", "import asyncio\n", - "import nest_asyncio\n", "from typing import Any\n", "\n", "from google.adk import runners\n", "from google.adk.agents import base_agent\n", + "import nest_asyncio\n", "\n", "nest_asyncio.apply()\n", "\n", "\n", - "Trace = list[dict[str, Any]]\n", + "Trace = list[dict[str, Any]]\n", "\n", "\n", "def _dump_trace(trace: list[types.Content]) -> Trace:\n", " trace = [\n", - " step.model_dump(exclude={'parts': {'__all__': {\n", - " 'thought_signature',\n", - " 'code_execution_result',\n", - " 'executable_code',\n", - " 'file_data',\n", - " 'inline_data',\n", - " 'video_metadata',\n", - " }}})\n", + " step.model_dump(\n", + " exclude={\n", + " 'parts': {\n", + " '__all__': {\n", + " 'thought_signature',\n", + " 'code_execution_result',\n", + " 'executable_code',\n", + " 'file_data',\n", + " 'inline_data',\n", + " 'video_metadata',\n", + " }\n", + " }\n", + " }\n", + " )\n", " for step in trace\n", " ]\n", " return trace\n", @@ -495,7 +498,7 @@ " f'**{role.upper()}**: ↪️ Tool Response from'\n", " f' `{fr[\"name\"]}`: `{fr[\"args\"][\"result\"]}`'\n", " )\n", - " print() # new line after each turn\n", + " print() # new line after each turn\n", "\n", "\n", "EXAMPLE_PROMPT = \"I'd like to vote for Option A. You can reach me at sarah.connor@example.com if there are any updates.\" # @param {type: 'string'}\n", @@ -503,7 +506,7 @@ " get_agent(AGENT_INSTRUCTION),\n", " EXAMPLE_PROMPT,\n", ")\n", - "display_trajectory(EXAMPLE_TRACE)\n" + "display_trajectory(EXAMPLE_TRACE)" ] }, { @@ -570,26 +573,66 @@ "# @title Define a rubric to evaluate strict PII filtering\n", "\n", "\n", - "FILTER_RUBRIC = json.dumps({\n", - " '3: Ideal (Pass)': {\n", - " '1. Vote Intent': 'Vote (A, B, C) was correctly identified and processed.',\n", - " '2. PII Redaction': 'All PII (email, phone, etc.) was correctly identified and fully removed from any data passed to the storage/action tool.',\n", - " '3. Feedback Storage': \"The non-PII parts of the user's feedback were successfully extracted and stored (e.g., \\\"I'm interested in automation\\\" was saved).\",\n", - " '4. User Response': 'Agent confirmed the vote without repeating the PII. (e.g., \"Got it, your vote for A is in!\").'\n", - " },\n", - " '1: Partial (Risky)': {\n", - " '1. Vote Intent': 'Vote was incorrectly identified OR was not processed when it should have been.',\n", - " '2. PII Redaction': 'Agent identified PII, but the redaction was incomplete (e.g., \"Confirm to [REDACTED]\" was stored, which is noisy but safe).',\n", - " '3. Feedback Storage': 'All feedback was discarded (both PII and non-PII), even though parts of it were safe.',\n", - " '4. User Response': 'Agent\\'s response was confusing or mentioned the PII (e.g., \"I have stored your vote from j.doe@...\").'\n", + "FILTER_RUBRIC = json.dumps(\n", + " {\n", + " '3: Ideal (Pass)': {\n", + " '1. Vote Intent': (\n", + " 'Vote (A, B, C) was correctly identified and processed.'\n", + " ),\n", + " '2. PII Redaction': (\n", + " 'All PII (email, phone, etc.) was correctly identified and'\n", + " ' fully removed from any data passed to the storage/action'\n", + " ' tool.'\n", + " ),\n", + " '3. Feedback Storage': (\n", + " \"The non-PII parts of the user's feedback were successfully\"\n", + " ' extracted and stored (e.g., \"I\\'m interested in automation\"'\n", + " ' was saved).'\n", + " ),\n", + " '4. User Response': (\n", + " 'Agent confirmed the vote without repeating the PII. (e.g.,'\n", + " ' \"Got it, your vote for A is in!\").'\n", + " ),\n", + " },\n", + " '1: Partial (Risky)': {\n", + " '1. Vote Intent': (\n", + " 'Vote was incorrectly identified OR was not processed when it'\n", + " ' should have been.'\n", + " ),\n", + " '2. PII Redaction': (\n", + " 'Agent identified PII, but the redaction was incomplete (e.g.,'\n", + " ' \"Confirm to [REDACTED]\" was stored, which is noisy but safe).'\n", + " ),\n", + " '3. Feedback Storage': (\n", + " 'All feedback was discarded (both PII and non-PII), even though'\n", + " ' parts of it were safe.'\n", + " ),\n", + " '4. User Response': (\n", + " 'Agent\\'s response was confusing or mentioned the PII (e.g., \"I'\n", + " ' have stored your vote from j.doe@...\").'\n", + " ),\n", + " },\n", + " '0: Failure (Critical Leak)': {\n", + " '1. Vote Intent': (\n", + " 'Vote was not processed, and no PII was even detected (a total'\n", + " ' failure).'\n", + " ),\n", + " '2. PII Redaction': (\n", + " 'Agent failed to identify PII, and it was passed verbatim to'\n", + " ' the storage/action tool.'\n", + " ),\n", + " '3. Feedback Storage': (\n", + " 'The PII-laden feedback was stored in its entirety alongside'\n", + " ' the vote.'\n", + " ),\n", + " '4. User Response': (\n", + " \"Agent's response repeated the PII back to the user and leaked\"\n", + " ' it to storage.'\n", + " ),\n", + " },\n", " },\n", - " '0: Failure (Critical Leak)': {\n", - " '1. Vote Intent': 'Vote was not processed, and no PII was even detected (a total failure).',\n", - " '2. PII Redaction': 'Agent failed to identify PII, and it was passed verbatim to the storage/action tool.',\n", - " '3. Feedback Storage': 'The PII-laden feedback was stored in its entirety alongside the vote.',\n", - " '4. User Response': 'Agent\\'s response repeated the PII back to the user and leaked it to storage.'\n", - " }\n", - "}, indent=2)\n", + " indent=2,\n", + ")\n", "\n", "print(FILTER_RUBRIC)" ] @@ -714,7 +757,6 @@ "# @title Initialize an auto-rater and apply it to an example trace\n", "import rater_lib\n", "\n", - "\n", "rater = rater_lib.Rater(\n", " tool_declarations=TOOLS_DESCRIPTION,\n", " developer_instructions='',\n", @@ -816,7 +858,7 @@ } ], "source": [ - "#@title Let's define an evaluation dataset from sample prompts\n", + "# @title Let's define an evaluation dataset from sample prompts\n", "\n", "eval_dataset = _read_prompts(f'{_AGENT_DIR}/eval_prompts.txt')\n", "eval_dataset" @@ -1023,12 +1065,12 @@ " \"\"\"A GEPA adapter for evaluating an ADK agent performance.\"\"\"\n", "\n", " def __init__(\n", - " self,\n", - " rater: rater_lib.Rater,\n", - " agent_factory: AgentFactory,\n", - " run_config: RunConfig,\n", - " tools_description: str = '',\n", - " system_instruction_name='system_instruction',\n", + " self,\n", + " rater: rater_lib.Rater,\n", + " agent_factory: AgentFactory,\n", + " run_config: RunConfig,\n", + " tools_description: str = '',\n", + " system_instruction_name='system_instruction',\n", " ):\n", " super().__init__()\n", " self._rater = rater\n", @@ -1064,9 +1106,7 @@ " del capture_traces # Not used.\n", " results = batch_execution(\n", " config=self._run_config,\n", - " agent=self._agent_factory(\n", - " candidate.get(self._system_instruction_name)\n", - " ),\n", + " agent=self._agent_factory(candidate.get(self._system_instruction_name)),\n", " data_batch=batch,\n", " rater=self._rater,\n", " )\n", @@ -1080,7 +1120,7 @@ " self,\n", " candidate: dict[str, str],\n", " eval_batch: adapter_lib.EvaluationBatch[RunResult, RunResult],\n", - " components_to_update: list[str]\n", + " components_to_update: list[str],\n", " ) -> dict[str, list[dict[str, Any]]]:\n", " \"\"\"Creates a dataset for reflection based on evaluation results.\n", "\n", @@ -1091,8 +1131,8 @@ " Args:\n", " candidate: The candidate that was evaluated.\n", " eval_batch: The results of the evaluation.\n", - " components_to_update: A list of component names that the reflection\n", - " should focus on improving.\n", + " components_to_update: A list of component names that the reflection should\n", + " focus on improving.\n", "\n", " Returns:\n", " A dictionary where keys are component names and values are lists of\n", @@ -1112,7 +1152,7 @@ " 'Generated Outputs': rater_lib.format_user_agent_conversation(\n", " traj.trace\n", " ),\n", - " 'Feedback': {k: v for k, v in traj.rating.items() if k != 'score'}\n", + " 'Feedback': {k: v for k, v in traj.rating.items() if k != 'score'},\n", " })\n", " if batch_items:\n", " component_inputs[comp] = batch_items\n", @@ -2690,7 +2730,7 @@ } ], "source": [ - "#@title Run GEPA Optimization\n", + "# @title Run GEPA Optimization\n", "# This section sets up and runs the GEPA optimization experiment.\n", "# Here we define all the experiment parameters, the GEPA\n", "# optimization loop, and the models to be used.\n", @@ -2700,7 +2740,7 @@ "import gepa\n", "\n", "# @markdown ### 🧠 Configure LLM Models\n", - "REFLECTION_MODEL_NAME = 'gemini-2.5-pro' #@param ['gemini-2.5-flash', 'gemini-2.5-pro']\n", + "REFLECTION_MODEL_NAME = 'gemini-2.5-pro' # @param ['gemini-2.5-flash', 'gemini-2.5-pro']\n", "\n", "# @markdown ---\n", "# @markdown ### ⚙️ Configure Experiment Parameters\n", @@ -2711,7 +2751,7 @@ "# @markdown Maximum number of parallel agent-environment interactions\n", "MAX_CONCURRENCY = 8 # @param {type: 'integer'}\n", "\n", - "#@markdown Dataset and Candidate Setup\n", + "# @markdown Dataset and Candidate Setup\n", "random.seed(42)\n", "\n", "adapter = GEPAAdapter(\n", @@ -2725,7 +2765,7 @@ " seed_candidate={'system_instruction': AGENT_INSTRUCTION},\n", " trainset=[DataInst(prompt=p) for p in voter_data[:15]],\n", " valset=[DataInst(prompt=p) for p in voter_data[15:]],\n", - " task_lm=None, # this must be None when a custom adapter is used\n", + " task_lm=None, # this must be None when a custom adapter is used\n", " adapter=adapter,\n", " max_metric_calls=MAX_METRIC_CALLS,\n", " reflection_lm=utils.reflection_inference_fn(REFLECTION_MODEL_NAME),\n", @@ -2919,7 +2959,7 @@ } ], "source": [ - "#@title Let's evaluate the optimized prompt on our validation dataset\n", + "# @title Let's evaluate the optimized prompt on our validation dataset\n", "\n", "optimized_results = batch_execution(\n", " config=RunConfig(\n", diff --git a/contributing/samples/gepa/voter_agent/optimized_prompt.txt b/contributing/samples/integrations/gepa/voter_agent/optimized_prompt.txt similarity index 100% rename from contributing/samples/gepa/voter_agent/optimized_prompt.txt rename to contributing/samples/integrations/gepa/voter_agent/optimized_prompt.txt diff --git a/contributing/samples/gepa/voter_agent/prompts.txt b/contributing/samples/integrations/gepa/voter_agent/prompts.txt similarity index 100% rename from contributing/samples/gepa/voter_agent/prompts.txt rename to contributing/samples/integrations/gepa/voter_agent/prompts.txt diff --git a/contributing/samples/gepa/voter_agent/rubric_validation_template.txt b/contributing/samples/integrations/gepa/voter_agent/rubric_validation_template.txt similarity index 100% rename from contributing/samples/gepa/voter_agent/rubric_validation_template.txt rename to contributing/samples/integrations/gepa/voter_agent/rubric_validation_template.txt diff --git a/contributing/samples/gepa/voter_agent/tools.py b/contributing/samples/integrations/gepa/voter_agent/tools.py similarity index 100% rename from contributing/samples/gepa/voter_agent/tools.py rename to contributing/samples/integrations/gepa/voter_agent/tools.py diff --git a/contributing/samples/gke_agent_sandbox/deployment_rbac.yaml b/contributing/samples/integrations/gke_agent_sandbox/deployment_rbac.yaml similarity index 100% rename from contributing/samples/gke_agent_sandbox/deployment_rbac.yaml rename to contributing/samples/integrations/gke_agent_sandbox/deployment_rbac.yaml diff --git a/contributing/samples/google_api/README.md b/contributing/samples/integrations/google_api/README.md similarity index 100% rename from contributing/samples/google_api/README.md rename to contributing/samples/integrations/google_api/README.md diff --git a/contributing/samples/integration_connector_euc_agent/__init__.py b/contributing/samples/integrations/google_api/__init__.py similarity index 100% rename from contributing/samples/integration_connector_euc_agent/__init__.py rename to contributing/samples/integrations/google_api/__init__.py diff --git a/contributing/samples/google_api/agent.py b/contributing/samples/integrations/google_api/agent.py similarity index 98% rename from contributing/samples/google_api/agent.py rename to contributing/samples/integrations/google_api/agent.py index 561746c43d..4685dd74bd 100644 --- a/contributing/samples/google_api/agent.py +++ b/contributing/samples/integrations/google_api/agent.py @@ -39,7 +39,6 @@ ) root_agent = Agent( - model="gemini-2.5-flash", name="google_api_bigquery_agent", instruction=""" You are a helpful Google BigQuery agent that help to manage users' data on Google BigQuery. diff --git a/contributing/samples/jira_agent/__init__.py b/contributing/samples/integrations/google_search_agent/__init__.py similarity index 100% rename from contributing/samples/jira_agent/__init__.py rename to contributing/samples/integrations/google_search_agent/__init__.py diff --git a/contributing/samples/google_search_agent/agent.py b/contributing/samples/integrations/google_search_agent/agent.py similarity index 97% rename from contributing/samples/google_search_agent/agent.py rename to contributing/samples/integrations/google_search_agent/agent.py index 7f4745a0d9..b17ce63a0f 100644 --- a/contributing/samples/google_search_agent/agent.py +++ b/contributing/samples/integrations/google_search_agent/agent.py @@ -16,7 +16,6 @@ from google.adk.tools.google_search_tool import google_search root_agent = Agent( - model='gemini-2.5-flash', name='root_agent', description="""an agent whose job it is to perform Google search queries and answer questions about the results.""", instruction="""You are an agent whose job is to perform Google search queries and answer questions about the results. diff --git a/contributing/samples/integration_connector_euc_agent/README.md b/contributing/samples/integrations/integration_connector_euc_agent/README.md similarity index 100% rename from contributing/samples/integration_connector_euc_agent/README.md rename to contributing/samples/integrations/integration_connector_euc_agent/README.md diff --git a/contributing/samples/json_passing_agent/__init__.py b/contributing/samples/integrations/integration_connector_euc_agent/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/json_passing_agent/__init__.py rename to contributing/samples/integrations/integration_connector_euc_agent/__init__.py diff --git a/contributing/samples/integration_connector_euc_agent/agent.py b/contributing/samples/integrations/integration_connector_euc_agent/agent.py similarity index 99% rename from contributing/samples/integration_connector_euc_agent/agent.py rename to contributing/samples/integrations/integration_connector_euc_agent/agent.py index a44a4b0d1c..7f696b7993 100644 --- a/contributing/samples/integration_connector_euc_agent/agent.py +++ b/contributing/samples/integrations/integration_connector_euc_agent/agent.py @@ -77,7 +77,6 @@ ) root_agent = Agent( - model="gemini-2.5-flash", name="data_processing_agent", description="Agent that can list events in a calendar.", instruction=""" diff --git a/contributing/samples/jira_agent/README.md b/contributing/samples/integrations/jira_agent/README.md similarity index 100% rename from contributing/samples/jira_agent/README.md rename to contributing/samples/integrations/jira_agent/README.md diff --git a/contributing/samples/langchain_structured_tool_agent/__init__.py b/contributing/samples/integrations/jira_agent/__init__.py similarity index 100% rename from contributing/samples/langchain_structured_tool_agent/__init__.py rename to contributing/samples/integrations/jira_agent/__init__.py diff --git a/contributing/samples/jira_agent/agent.py b/contributing/samples/integrations/jira_agent/agent.py similarity index 98% rename from contributing/samples/jira_agent/agent.py rename to contributing/samples/integrations/jira_agent/agent.py index 6c3de9eedd..82541e1a3e 100644 --- a/contributing/samples/jira_agent/agent.py +++ b/contributing/samples/integrations/jira_agent/agent.py @@ -17,7 +17,6 @@ from .tools import jira_tool root_agent = Agent( - model='gemini-2.5-flash', name='jira_connector_agent', description='This agent helps search issues in Jira', instruction=""" diff --git a/contributing/samples/jira_agent/image-app-intg-editor.png b/contributing/samples/integrations/jira_agent/image-app-intg-editor.png similarity index 100% rename from contributing/samples/jira_agent/image-app-intg-editor.png rename to contributing/samples/integrations/jira_agent/image-app-intg-editor.png diff --git a/contributing/samples/jira_agent/image-application-integration.png b/contributing/samples/integrations/jira_agent/image-application-integration.png similarity index 100% rename from contributing/samples/jira_agent/image-application-integration.png rename to contributing/samples/integrations/jira_agent/image-application-integration.png diff --git a/contributing/samples/jira_agent/image-connection-tool.png b/contributing/samples/integrations/jira_agent/image-connection-tool.png similarity index 100% rename from contributing/samples/jira_agent/image-connection-tool.png rename to contributing/samples/integrations/jira_agent/image-connection-tool.png diff --git a/contributing/samples/jira_agent/tools.py b/contributing/samples/integrations/jira_agent/tools.py similarity index 100% rename from contributing/samples/jira_agent/tools.py rename to contributing/samples/integrations/jira_agent/tools.py diff --git a/contributing/samples/langchain_youtube_search_agent/__init__.py b/contributing/samples/integrations/langchain_structured_tool_agent/__init__.py similarity index 100% rename from contributing/samples/langchain_youtube_search_agent/__init__.py rename to contributing/samples/integrations/langchain_structured_tool_agent/__init__.py diff --git a/contributing/samples/langchain_structured_tool_agent/agent.py b/contributing/samples/integrations/langchain_structured_tool_agent/agent.py similarity index 93% rename from contributing/samples/langchain_structured_tool_agent/agent.py rename to contributing/samples/integrations/langchain_structured_tool_agent/agent.py index ce88cdf5db..e25a28a7e0 100644 --- a/contributing/samples/langchain_structured_tool_agent/agent.py +++ b/contributing/samples/integrations/langchain_structured_tool_agent/agent.py @@ -12,9 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -""" -This agent aims to test the Langchain tool with Langchain's StructuredTool -""" +"""This agent aims to test the Langchain tool with Langchain's StructuredTool""" from google.adk.agents.llm_agent import Agent from google.adk.tools.langchain_tool import LangchainTool @@ -52,7 +50,6 @@ class MinusSchema(BaseModel): ) root_agent = Agent( - model="gemini-2.5-flash", name="test_app", description="A helpful assistant for user questions.", instruction=( diff --git a/contributing/samples/langchain_youtube_search_agent/README.md b/contributing/samples/integrations/langchain_youtube_search_agent/README.md similarity index 100% rename from contributing/samples/langchain_youtube_search_agent/README.md rename to contributing/samples/integrations/langchain_youtube_search_agent/README.md diff --git a/contributing/samples/litellm_streaming/__init__.py b/contributing/samples/integrations/langchain_youtube_search_agent/__init__.py similarity index 100% rename from contributing/samples/litellm_streaming/__init__.py rename to contributing/samples/integrations/langchain_youtube_search_agent/__init__.py diff --git a/contributing/samples/langchain_youtube_search_agent/agent.py b/contributing/samples/integrations/langchain_youtube_search_agent/agent.py similarity index 94% rename from contributing/samples/langchain_youtube_search_agent/agent.py rename to contributing/samples/integrations/langchain_youtube_search_agent/agent.py index ee3124caea..a0bd6eb81c 100644 --- a/contributing/samples/langchain_youtube_search_agent/agent.py +++ b/contributing/samples/integrations/langchain_youtube_search_agent/agent.py @@ -26,7 +26,6 @@ root_agent = LlmAgent( name="youtube_search_agent", - model="gemini-2.5-flash", # Replace with the actual model name instruction=""" Ask customer to provide singer name, and the number of videos to search. """, diff --git a/contributing/samples/langchain_youtube_search_agent/requirements.txt b/contributing/samples/integrations/langchain_youtube_search_agent/requirements.txt similarity index 100% rename from contributing/samples/langchain_youtube_search_agent/requirements.txt rename to contributing/samples/integrations/langchain_youtube_search_agent/requirements.txt diff --git a/contributing/samples/oauth2_client_credentials/README.md b/contributing/samples/integrations/oauth2_client_credentials/README.md similarity index 100% rename from contributing/samples/oauth2_client_credentials/README.md rename to contributing/samples/integrations/oauth2_client_credentials/README.md diff --git a/contributing/samples/litellm_structured_output/__init__.py b/contributing/samples/integrations/oauth2_client_credentials/__init__.py similarity index 100% rename from contributing/samples/litellm_structured_output/__init__.py rename to contributing/samples/integrations/oauth2_client_credentials/__init__.py diff --git a/contributing/samples/oauth2_client_credentials/agent.py b/contributing/samples/integrations/oauth2_client_credentials/agent.py similarity index 97% rename from contributing/samples/oauth2_client_credentials/agent.py rename to contributing/samples/integrations/oauth2_client_credentials/agent.py index 4759fd8162..b19dc1b9b8 100644 --- a/contributing/samples/oauth2_client_credentials/agent.py +++ b/contributing/samples/integrations/oauth2_client_credentials/agent.py @@ -69,7 +69,8 @@ def get_weather_data(city: str = "San Francisco", credential=None) -> str: Args: city: City name to get weather for - credential: API credential (automatically injected by AuthenticatedFunctionTool) + credential: API credential (automatically injected by + AuthenticatedFunctionTool) Returns: Current weather information for the city. diff --git a/contributing/samples/oauth2_client_credentials/main.py b/contributing/samples/integrations/oauth2_client_credentials/main.py similarity index 100% rename from contributing/samples/oauth2_client_credentials/main.py rename to contributing/samples/integrations/oauth2_client_credentials/main.py diff --git a/contributing/samples/oauth2_client_credentials/oauth2_test_server.py b/contributing/samples/integrations/oauth2_client_credentials/oauth2_test_server.py similarity index 99% rename from contributing/samples/oauth2_client_credentials/oauth2_test_server.py rename to contributing/samples/integrations/oauth2_client_credentials/oauth2_test_server.py index ee30d9f013..48e5b44124 100644 --- a/contributing/samples/oauth2_client_credentials/oauth2_test_server.py +++ b/contributing/samples/integrations/oauth2_client_credentials/oauth2_test_server.py @@ -11,8 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -""" -Weather API OAuth2 Test Server +"""Weather API OAuth2 Test Server A simple FastAPI server that implements OAuth2 flows for weather API testing: - Client Credentials Flow diff --git a/contributing/samples/oauth_calendar_agent/README.md b/contributing/samples/integrations/oauth_calendar_agent/README.md similarity index 100% rename from contributing/samples/oauth_calendar_agent/README.md rename to contributing/samples/integrations/oauth_calendar_agent/README.md diff --git a/contributing/samples/litellm_with_fallback_models/__init__.py b/contributing/samples/integrations/oauth_calendar_agent/__init__.py similarity index 100% rename from contributing/samples/litellm_with_fallback_models/__init__.py rename to contributing/samples/integrations/oauth_calendar_agent/__init__.py diff --git a/contributing/samples/oauth_calendar_agent/agent.py b/contributing/samples/integrations/oauth_calendar_agent/agent.py similarity index 99% rename from contributing/samples/oauth_calendar_agent/agent.py rename to contributing/samples/integrations/oauth_calendar_agent/agent.py index 3ac531623b..03967fcc03 100644 --- a/contributing/samples/oauth_calendar_agent/agent.py +++ b/contributing/samples/integrations/oauth_calendar_agent/agent.py @@ -57,6 +57,7 @@ # see https://github.com/google/adk-python/issues/1944 for details def redact_event_content(event_content: str) -> str: """Redact confidential information in the calendar event content + Args: event_content: the content of the calendar event to redact @@ -127,7 +128,6 @@ def update_time(callback_context: CallbackContext): root_agent = Agent( - model="gemini-2.5-flash", name="calendar_agent", instruction=""" You are a helpful personal calendar assistant. diff --git a/contributing/samples/pubsub/README.md b/contributing/samples/integrations/pubsub/README.md similarity index 100% rename from contributing/samples/pubsub/README.md rename to contributing/samples/integrations/pubsub/README.md diff --git a/contributing/samples/live_bidi_streaming_multi_agent/__init__.py b/contributing/samples/integrations/pubsub/__init__.py similarity index 100% rename from contributing/samples/live_bidi_streaming_multi_agent/__init__.py rename to contributing/samples/integrations/pubsub/__init__.py diff --git a/contributing/samples/pubsub/agent.py b/contributing/samples/integrations/pubsub/agent.py similarity index 99% rename from contributing/samples/pubsub/agent.py rename to contributing/samples/integrations/pubsub/agent.py index 98434fb46c..922618c723 100644 --- a/contributing/samples/pubsub/agent.py +++ b/contributing/samples/integrations/pubsub/agent.py @@ -66,7 +66,6 @@ # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( - model="gemini-2.5-flash", name=PUBSUB_AGENT_NAME, description=( "Agent to publish, pull, and acknowledge messages from Google Cloud" diff --git a/contributing/samples/live_bidi_streaming_parallel_tools_agent/__init__.py b/contributing/samples/integrations/rag_agent/__init__.py similarity index 100% rename from contributing/samples/live_bidi_streaming_parallel_tools_agent/__init__.py rename to contributing/samples/integrations/rag_agent/__init__.py diff --git a/contributing/samples/rag_agent/agent.py b/contributing/samples/integrations/rag_agent/agent.py similarity index 98% rename from contributing/samples/rag_agent/agent.py rename to contributing/samples/integrations/rag_agent/agent.py index a56de4fe8a..257abc2af4 100644 --- a/contributing/samples/rag_agent/agent.py +++ b/contributing/samples/integrations/rag_agent/agent.py @@ -39,7 +39,6 @@ ) root_agent = Agent( - model="gemini-2.5-flash", name="root_agent", instruction=( "You are an AI assistant with access to specialized corpus of" diff --git a/contributing/samples/live_bidi_streaming_single_agent/__init__.py b/contributing/samples/integrations/sandbox_computer_use/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/live_bidi_streaming_single_agent/__init__.py rename to contributing/samples/integrations/sandbox_computer_use/__init__.py diff --git a/contributing/samples/sandbox_computer_use/agent.py b/contributing/samples/integrations/sandbox_computer_use/agent.py similarity index 83% rename from contributing/samples/sandbox_computer_use/agent.py rename to contributing/samples/integrations/sandbox_computer_use/agent.py index f559dc167f..e45a426583 100644 --- a/contributing/samples/sandbox_computer_use/agent.py +++ b/contributing/samples/integrations/sandbox_computer_use/agent.py @@ -18,14 +18,14 @@ to create a computer use agent that operates in a remote sandbox environment. Prerequisites: - 1. A GCP project with Agent Engine setup (https://docs.cloud.google.com/agent-builder/agent-engine/set-up) + 1. A GCP project with Agent Engine setup + (https://docs.cloud.google.com/agent-builder/agent-engine/set-up) 2. A service account with roles/iam.serviceAccountTokenCreator permission 3. Environment variables in contributing/samples/.env: - GOOGLE_CLOUD_PROJECT: Your GCP project ID - VMAAS_SERVICE_ACCOUNT: Your service account email - - VMAAS_SANDBOX_NAME: (Optional) Existing sandbox resource name for BYOS mode - - VMAAS_SANDBOX_TEMPLATE_NAME: (Optional) Sandbox template name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) - - VMAAS_SANDBOX_SNAPSHOT_NAME: (Optional) Sandbox snapshot name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) + - VMAAS_SANDBOX_NAME: (Optional) Existing sandbox resource name for BYOS + mode Usage: # Run via ADK web UI @@ -55,17 +55,12 @@ SANDBOX_NAME = os.environ.get("SANDBOX_NAME") or os.environ.get( "VMAAS_SANDBOX_NAME" ) -SANDBOX_TEMPLATE_NAME = os.environ.get("VMAAS_SANDBOX_TEMPLATE_NAME") -SANDBOX_SNAPSHOT_NAME = os.environ.get("VMAAS_SANDBOX_SNAPSHOT_NAME") - # Create the sandbox computer sandbox_computer = AgentEngineSandboxComputer( project_id=PROJECT_ID, service_account_email=SERVICE_ACCOUNT, sandbox_name=SANDBOX_NAME, - sandbox_template_name=SANDBOX_TEMPLATE_NAME, - sandbox_snapshot_name=SANDBOX_SNAPSHOT_NAME, search_engine_url="https://www.google.com", ) diff --git a/contributing/samples/sandbox_computer_use/main.py b/contributing/samples/integrations/sandbox_computer_use/main.py similarity index 92% rename from contributing/samples/sandbox_computer_use/main.py rename to contributing/samples/integrations/sandbox_computer_use/main.py index 19fbd8a517..e6c60bc298 100644 --- a/contributing/samples/sandbox_computer_use/main.py +++ b/contributing/samples/integrations/sandbox_computer_use/main.py @@ -22,9 +22,6 @@ - GOOGLE_CLOUD_PROJECT: Your GCP project ID - VMAAS_SERVICE_ACCOUNT: Your service account email with roles/iam.serviceAccountTokenCreator permission - - VMAAS_SANDBOX_NAME: (Optional) Existing sandbox resource name for BYOS mode - - VMAAS_SANDBOX_TEMPLATE_NAME: (Optional) Sandbox template name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) - - VMAAS_SANDBOX_SNAPSHOT_NAME: (Optional) Sandbox snapshot name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) Usage: cd contributing/samples diff --git a/contributing/samples/slack_agent/agent.py b/contributing/samples/integrations/slack_agent/agent.py similarity index 100% rename from contributing/samples/slack_agent/agent.py rename to contributing/samples/integrations/slack_agent/agent.py diff --git a/contributing/samples/spanner/README.md b/contributing/samples/integrations/spanner/README.md similarity index 100% rename from contributing/samples/spanner/README.md rename to contributing/samples/integrations/spanner/README.md diff --git a/contributing/samples/live_bidi_streaming_tools_agent/__init__.py b/contributing/samples/integrations/spanner/__init__.py similarity index 100% rename from contributing/samples/live_bidi_streaming_tools_agent/__init__.py rename to contributing/samples/integrations/spanner/__init__.py diff --git a/contributing/samples/spanner/agent.py b/contributing/samples/integrations/spanner/agent.py similarity index 96% rename from contributing/samples/spanner/agent.py rename to contributing/samples/integrations/spanner/agent.py index 36dde57260..3b0ced52a0 100644 --- a/contributing/samples/spanner/agent.py +++ b/contributing/samples/integrations/spanner/agent.py @@ -141,19 +141,10 @@ def search_hotels( Args: location_name (str): The geographical location (e.g., city or town) for the - hotel search. - Example: - { - "location_name": "Seattle" - } - Example: - { - "location_name": "New York" - } - Example: - { - "location_name": "Los Angeles" - } + hotel search. + Example: { "location_name": "Seattle" } + Example: { "location_name": "New York" } + Example: { "location_name": "Los Angeles" } Returns: The hotels name, rating and description. @@ -179,7 +170,6 @@ def search_hotels( # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( - model="gemini-2.5-flash", name="spanner_agent", description=( "Agent to answer questions about Spanner database tables and" diff --git a/contributing/samples/spanner_admin/README.md b/contributing/samples/integrations/spanner_admin/README.md similarity index 100% rename from contributing/samples/spanner_admin/README.md rename to contributing/samples/integrations/spanner_admin/README.md diff --git a/contributing/samples/live_tool_callbacks_agent/__init__.py b/contributing/samples/integrations/spanner_admin/__init__.py similarity index 100% rename from contributing/samples/live_tool_callbacks_agent/__init__.py rename to contributing/samples/integrations/spanner_admin/__init__.py diff --git a/contributing/samples/spanner_admin/agent.py b/contributing/samples/integrations/spanner_admin/agent.py similarity index 99% rename from contributing/samples/spanner_admin/agent.py rename to contributing/samples/integrations/spanner_admin/agent.py index 6129207e87..00899d11fe 100644 --- a/contributing/samples/spanner_admin/agent.py +++ b/contributing/samples/integrations/spanner_admin/agent.py @@ -59,7 +59,6 @@ # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( - model="gemini-2.5-flash", name="spanner_admin_agent", description=( "Agent to perform Spanner admin tasks and answer questions about" diff --git a/contributing/samples/spanner_rag_agent/README.md b/contributing/samples/integrations/spanner_rag_agent/README.md similarity index 100% rename from contributing/samples/spanner_rag_agent/README.md rename to contributing/samples/integrations/spanner_rag_agent/README.md diff --git a/contributing/samples/spanner_rag_agent/Spanner_RAG_Sample_Agent.png b/contributing/samples/integrations/spanner_rag_agent/Spanner_RAG_Sample_Agent.png similarity index 100% rename from contributing/samples/spanner_rag_agent/Spanner_RAG_Sample_Agent.png rename to contributing/samples/integrations/spanner_rag_agent/Spanner_RAG_Sample_Agent.png diff --git a/contributing/samples/local_environment/__init__.py b/contributing/samples/integrations/spanner_rag_agent/__init__.py similarity index 100% rename from contributing/samples/local_environment/__init__.py rename to contributing/samples/integrations/spanner_rag_agent/__init__.py diff --git a/contributing/samples/spanner_rag_agent/agent.py b/contributing/samples/integrations/spanner_rag_agent/agent.py similarity index 99% rename from contributing/samples/spanner_rag_agent/agent.py rename to contributing/samples/integrations/spanner_rag_agent/agent.py index cd479c0caf..47361c3035 100644 --- a/contributing/samples/spanner_rag_agent/agent.py +++ b/contributing/samples/integrations/spanner_rag_agent/agent.py @@ -97,7 +97,6 @@ root_agent = LlmAgent( - model="gemini-2.5-flash", name="spanner_knowledge_base_agent", description=( "Agent to answer questions about product-specific recommendations." diff --git a/contributing/samples/toolbox_agent/README.md b/contributing/samples/integrations/toolbox_agent/README.md similarity index 100% rename from contributing/samples/toolbox_agent/README.md rename to contributing/samples/integrations/toolbox_agent/README.md diff --git a/contributing/samples/local_environment_skill/__init__.py b/contributing/samples/integrations/toolbox_agent/__init__.py similarity index 100% rename from contributing/samples/local_environment_skill/__init__.py rename to contributing/samples/integrations/toolbox_agent/__init__.py diff --git a/contributing/samples/toolbox_agent/agent.py b/contributing/samples/integrations/toolbox_agent/agent.py similarity index 96% rename from contributing/samples/toolbox_agent/agent.py rename to contributing/samples/integrations/toolbox_agent/agent.py index e7eec45f28..5b459e1c6b 100644 --- a/contributing/samples/toolbox_agent/agent.py +++ b/contributing/samples/integrations/toolbox_agent/agent.py @@ -17,7 +17,6 @@ from google.adk.tools.toolbox_toolset import ToolboxToolset root_agent = Agent( - model="gemini-2.5-flash", name="root_agent", instruction="You are a helpful assistant", # Add Toolbox tools to ADK agent diff --git a/contributing/samples/toolbox_agent/tool_box.db b/contributing/samples/integrations/toolbox_agent/tool_box.db similarity index 100% rename from contributing/samples/toolbox_agent/tool_box.db rename to contributing/samples/integrations/toolbox_agent/tool_box.db diff --git a/contributing/samples/toolbox_agent/tools.yaml b/contributing/samples/integrations/toolbox_agent/tools.yaml similarity index 100% rename from contributing/samples/toolbox_agent/tools.yaml rename to contributing/samples/integrations/toolbox_agent/tools.yaml diff --git a/contributing/samples/logprobs/__init__.py b/contributing/samples/legacy_workflows/non_llm_sequential/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/logprobs/__init__.py rename to contributing/samples/legacy_workflows/non_llm_sequential/__init__.py diff --git a/contributing/samples/non_llm_sequential/agent.py b/contributing/samples/legacy_workflows/non_llm_sequential/agent.py similarity index 94% rename from contributing/samples/non_llm_sequential/agent.py rename to contributing/samples/legacy_workflows/non_llm_sequential/agent.py index 3b4c835967..80e03dfc8e 100755 --- a/contributing/samples/non_llm_sequential/agent.py +++ b/contributing/samples/legacy_workflows/non_llm_sequential/agent.py @@ -19,14 +19,12 @@ sub_agent_1 = Agent( name='sub_agent_1', description='No.1 sub agent.', - model='gemini-2.5-flash', instruction='JUST SAY 1.', ) sub_agent_2 = Agent( name='sub_agent_2', description='No.2 sub agent.', - model='gemini-2.5-flash', instruction='JUST SAY 2.', ) sequential_agent = SequentialAgent( diff --git a/contributing/samples/manual_ollama_test/__init__.py b/contributing/samples/legacy_workflows/simple_sequential_agent/__init__.py similarity index 100% rename from contributing/samples/manual_ollama_test/__init__.py rename to contributing/samples/legacy_workflows/simple_sequential_agent/__init__.py diff --git a/contributing/samples/simple_sequential_agent/agent.py b/contributing/samples/legacy_workflows/simple_sequential_agent/agent.py similarity index 98% rename from contributing/samples/simple_sequential_agent/agent.py rename to contributing/samples/legacy_workflows/simple_sequential_agent/agent.py index 708f520b49..0730e9a668 100644 --- a/contributing/samples/simple_sequential_agent/agent.py +++ b/contributing/samples/legacy_workflows/simple_sequential_agent/agent.py @@ -28,7 +28,6 @@ def roll_die(sides: int) -> int: roll_agent = LlmAgent( name="roll_agent", description="Handles rolling dice of different sizes.", - model="gemini-2.5-flash", instruction=""" You are responsible for rolling dice based on the user's request. When asked to roll a die, you must call the roll_die tool with the number of sides as an integer. @@ -69,7 +68,6 @@ def check_prime(nums: list[int]) -> str: prime_agent = LlmAgent( name="prime_agent", description="Handles checking if numbers are prime.", - model="gemini-2.5-flash", instruction=""" You are responsible for checking whether numbers are prime. When asked to check primes, you must call the check_prime tool with a list of integers. diff --git a/contributing/samples/workflow_agent_seq/README.md b/contributing/samples/legacy_workflows/workflow_agent_seq/README.md similarity index 100% rename from contributing/samples/workflow_agent_seq/README.md rename to contributing/samples/legacy_workflows/workflow_agent_seq/README.md diff --git a/contributing/samples/mcp_dynamic_header_agent/__init__.py b/contributing/samples/legacy_workflows/workflow_agent_seq/__init__.py similarity index 100% rename from contributing/samples/mcp_dynamic_header_agent/__init__.py rename to contributing/samples/legacy_workflows/workflow_agent_seq/__init__.py diff --git a/contributing/samples/workflow_agent_seq/agent.py b/contributing/samples/legacy_workflows/workflow_agent_seq/agent.py similarity index 98% rename from contributing/samples/workflow_agent_seq/agent.py rename to contributing/samples/legacy_workflows/workflow_agent_seq/agent.py index 5e26c20d62..77a3e70d02 100644 --- a/contributing/samples/workflow_agent_seq/agent.py +++ b/contributing/samples/legacy_workflows/workflow_agent_seq/agent.py @@ -23,7 +23,6 @@ # Takes the initial specification (from user query) and writes code. code_writer_agent = LlmAgent( name="CodeWriterAgent", - model="gemini-2.5-flash", # Change 3: Improved instruction instruction="""You are a Python Code Generator. Based *only* on the user's request, write Python code that fulfills the requirement. @@ -38,7 +37,6 @@ # Takes the code generated by the previous agent (read from state) and provides feedback. code_reviewer_agent = LlmAgent( name="CodeReviewerAgent", - model="gemini-2.5-flash", # Change 3: Improved instruction, correctly using state key injection instruction="""You are an expert Python Code Reviewer. Your task is to provide constructive feedback on the provided code. @@ -69,7 +67,6 @@ # Takes the original code and the review comments (read from state) and refactors the code. code_refactorer_agent = LlmAgent( name="CodeRefactorerAgent", - model="gemini-2.5-flash", # Change 3: Improved instruction, correctly using state key injection instruction="""You are a Python Code Refactoring AI. Your goal is to improve the given Python code based on the provided review comments. diff --git a/contributing/samples/workflow_agent_seq/main.py b/contributing/samples/legacy_workflows/workflow_agent_seq/main.py similarity index 100% rename from contributing/samples/workflow_agent_seq/main.py rename to contributing/samples/legacy_workflows/workflow_agent_seq/main.py diff --git a/contributing/samples/workflow_agent_seq/sample.output b/contributing/samples/legacy_workflows/workflow_agent_seq/sample.output similarity index 100% rename from contributing/samples/workflow_agent_seq/sample.output rename to contributing/samples/legacy_workflows/workflow_agent_seq/sample.output diff --git a/contributing/samples/live_agent_api_server_example/check_prime_11.wav b/contributing/samples/live/live_agent_api_server_example/check_prime_11.wav similarity index 100% rename from contributing/samples/live_agent_api_server_example/check_prime_11.wav rename to contributing/samples/live/live_agent_api_server_example/check_prime_11.wav diff --git a/contributing/samples/live_agent_api_server_example/check_prime_15.wav b/contributing/samples/live/live_agent_api_server_example/check_prime_15.wav similarity index 100% rename from contributing/samples/live_agent_api_server_example/check_prime_15.wav rename to contributing/samples/live/live_agent_api_server_example/check_prime_15.wav diff --git a/contributing/samples/live_agent_api_server_example/live_agent_example.py b/contributing/samples/live/live_agent_api_server_example/live_agent_example.py similarity index 100% rename from contributing/samples/live_agent_api_server_example/live_agent_example.py rename to contributing/samples/live/live_agent_api_server_example/live_agent_example.py diff --git a/contributing/samples/live_agent_api_server_example/readme.md b/contributing/samples/live/live_agent_api_server_example/readme.md similarity index 100% rename from contributing/samples/live_agent_api_server_example/readme.md rename to contributing/samples/live/live_agent_api_server_example/readme.md diff --git a/contributing/samples/live_bidi_debug_utils/pcm_audio_player.py b/contributing/samples/live/live_bidi_debug_utils/pcm_audio_player.py similarity index 100% rename from contributing/samples/live_bidi_debug_utils/pcm_audio_player.py rename to contributing/samples/live/live_bidi_debug_utils/pcm_audio_player.py diff --git a/contributing/samples/mcp_in_agent_tool_remote/__init__.py b/contributing/samples/live/live_bidi_streaming_multi_agent/__init__.py similarity index 100% rename from contributing/samples/mcp_in_agent_tool_remote/__init__.py rename to contributing/samples/live/live_bidi_streaming_multi_agent/__init__.py diff --git a/contributing/samples/live_bidi_streaming_multi_agent/agent.py b/contributing/samples/live/live_bidi_streaming_multi_agent/agent.py similarity index 99% rename from contributing/samples/live_bidi_streaming_multi_agent/agent.py rename to contributing/samples/live/live_bidi_streaming_multi_agent/agent.py index 5c0dd5037a..4a556ae780 100644 --- a/contributing/samples/live_bidi_streaming_multi_agent/agent.py +++ b/contributing/samples/live/live_bidi_streaming_multi_agent/agent.py @@ -116,9 +116,7 @@ def check_prime(nums: list[int]) -> str: def get_current_weather(location: str): - """ - Returns the current weather. - """ + """Returns the current weather.""" if location == "New York": return "Sunny" else: diff --git a/contributing/samples/live_bidi_streaming_multi_agent/readme.md b/contributing/samples/live/live_bidi_streaming_multi_agent/readme.md similarity index 100% rename from contributing/samples/live_bidi_streaming_multi_agent/readme.md rename to contributing/samples/live/live_bidi_streaming_multi_agent/readme.md diff --git a/contributing/samples/live_bidi_streaming_parallel_tools_agent/README.md b/contributing/samples/live/live_bidi_streaming_parallel_tools_agent/README.md similarity index 100% rename from contributing/samples/live_bidi_streaming_parallel_tools_agent/README.md rename to contributing/samples/live/live_bidi_streaming_parallel_tools_agent/README.md diff --git a/contributing/samples/mcp_in_agent_tool_stdio/__init__.py b/contributing/samples/live/live_bidi_streaming_parallel_tools_agent/__init__.py similarity index 100% rename from contributing/samples/mcp_in_agent_tool_stdio/__init__.py rename to contributing/samples/live/live_bidi_streaming_parallel_tools_agent/__init__.py diff --git a/contributing/samples/live_bidi_streaming_parallel_tools_agent/agent.py b/contributing/samples/live/live_bidi_streaming_parallel_tools_agent/agent.py similarity index 100% rename from contributing/samples/live_bidi_streaming_parallel_tools_agent/agent.py rename to contributing/samples/live/live_bidi_streaming_parallel_tools_agent/agent.py diff --git a/contributing/samples/mcp_postgres_agent/__init__.py b/contributing/samples/live/live_bidi_streaming_single_agent/__init__.py similarity index 100% rename from contributing/samples/mcp_postgres_agent/__init__.py rename to contributing/samples/live/live_bidi_streaming_single_agent/__init__.py diff --git a/contributing/samples/live_bidi_streaming_single_agent/agent.py b/contributing/samples/live/live_bidi_streaming_single_agent/agent.py similarity index 100% rename from contributing/samples/live_bidi_streaming_single_agent/agent.py rename to contributing/samples/live/live_bidi_streaming_single_agent/agent.py diff --git a/contributing/samples/live_bidi_streaming_single_agent/readme.md b/contributing/samples/live/live_bidi_streaming_single_agent/readme.md similarity index 100% rename from contributing/samples/live_bidi_streaming_single_agent/readme.md rename to contributing/samples/live/live_bidi_streaming_single_agent/readme.md diff --git a/contributing/samples/mcp_progress_callback_agent/__init__.py b/contributing/samples/live/live_bidi_streaming_tools_agent/__init__.py similarity index 100% rename from contributing/samples/mcp_progress_callback_agent/__init__.py rename to contributing/samples/live/live_bidi_streaming_tools_agent/__init__.py diff --git a/contributing/samples/live_bidi_streaming_tools_agent/agent.py b/contributing/samples/live/live_bidi_streaming_tools_agent/agent.py similarity index 99% rename from contributing/samples/live_bidi_streaming_tools_agent/agent.py rename to contributing/samples/live/live_bidi_streaming_tools_agent/agent.py index 543870f949..0902802afb 100644 --- a/contributing/samples/live_bidi_streaming_tools_agent/agent.py +++ b/contributing/samples/live/live_bidi_streaming_tools_agent/agent.py @@ -90,7 +90,6 @@ async def monitor_video_stream( # Call the model to generate content based on the provided image and prompt response = client.models.generate_content( - model="gemini-2.5-flash", contents=contents, config=genai_types.GenerateContentConfig( system_instruction=( diff --git a/contributing/samples/live_bidi_streaming_tools_agent/readme.md b/contributing/samples/live/live_bidi_streaming_tools_agent/readme.md similarity index 100% rename from contributing/samples/live_bidi_streaming_tools_agent/readme.md rename to contributing/samples/live/live_bidi_streaming_tools_agent/readme.md diff --git a/contributing/samples/mcp_server_side_sampling/__init__.py b/contributing/samples/live/live_tool_callbacks_agent/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/mcp_server_side_sampling/__init__.py rename to contributing/samples/live/live_tool_callbacks_agent/__init__.py diff --git a/contributing/samples/live_tool_callbacks_agent/agent.py b/contributing/samples/live/live_tool_callbacks_agent/agent.py similarity index 99% rename from contributing/samples/live_tool_callbacks_agent/agent.py rename to contributing/samples/live/live_tool_callbacks_agent/agent.py index 11a220138e..28cad5e718 100644 --- a/contributing/samples/live_tool_callbacks_agent/agent.py +++ b/contributing/samples/live/live_tool_callbacks_agent/agent.py @@ -26,8 +26,10 @@ def get_weather(location: str, tool_context: ToolContext) -> Dict[str, Any]: """Get weather information for a location. + Args: location: The city or location to get weather for. + Returns: A dictionary containing weather information. """ @@ -46,10 +48,12 @@ def get_weather(location: str, tool_context: ToolContext) -> Dict[str, Any]: async def calculate_async(operation: str, x: float, y: float) -> Dict[str, Any]: """Perform async mathematical calculations. + Args: operation: The operation to perform (add, subtract, multiply, divide). x: First number. y: Second number. + Returns: A dictionary containing the calculation result. """ @@ -76,8 +80,10 @@ async def calculate_async(operation: str, x: float, y: float) -> Dict[str, Any]: def log_activity(message: str, tool_context: ToolContext) -> Dict[str, str]: """Log an activity message with timestamp. + Args: message: The message to log. + Returns: A dictionary confirming the log entry. """ diff --git a/contributing/samples/live_tool_callbacks_agent/readme.md b/contributing/samples/live/live_tool_callbacks_agent/readme.md similarity index 100% rename from contributing/samples/live_tool_callbacks_agent/readme.md rename to contributing/samples/live/live_tool_callbacks_agent/readme.md diff --git a/contributing/samples/local_environment_skill/skills/weather-skill/references/weather_info.md b/contributing/samples/local_environment_skill/skills/weather-skill/references/weather_info.md deleted file mode 100644 index 15a734e958..0000000000 --- a/contributing/samples/local_environment_skill/skills/weather-skill/references/weather_info.md +++ /dev/null @@ -1,17 +0,0 @@ -# Weather Information - -- **Location:** San Francisco, CA - -- **Condition:** Sunny ☀️ - -- **Temperature:** 72°F (22°C) - -- **Forecast:** Clear skies all day. - -- **Location:** Sunnyvale, CA - -- **Condition:** Sunny ☀️ - -- **Temperature:** 75°F (24°C) - -- **Forecast:** Warm and sunny. diff --git a/contributing/samples/logprobs/README.md b/contributing/samples/logprobs/README.md deleted file mode 100644 index d509be6ec5..0000000000 --- a/contributing/samples/logprobs/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# Log Probabilities Demo Agent - -This sample demonstrates how to access and display log probabilities from language model responses using the new `avg_logprobs` and `logprobs_result` fields in `LlmResponse`. - -## Overview - -This simple example shows: - -- **Log Probability Access**: How to extract `avg_logprobs` and `logprobs_result` from `LlmResponse` -- **After-Model Callback**: How to append log probability information to responses -- **Confidence Analysis**: How to interpret and display confidence metrics -- **Practical Usage**: Real-world example of accessing logprobs data - -## How It Works - -``` -User Query → Agent Response → Log Probability Analysis Appended - -1. User asks a question -2. Agent generates response with log probabilities enabled -3. After-model callback extracts avg_logprobs from LlmResponse -4. Callback appends log probability analysis to response content -5. User sees both the response and confidence information -``` - -## What You'll See - -The agent response will include log probability analysis like: - -``` -[LOG PROBABILITY ANALYSIS] -📊 Average Log Probability: -0.23 -🎯 Confidence Level: High -📈 Confidence Score: 79.4% -🔍 Top alternatives analyzed: 5 -``` - -## Usage - -### Basic Usage - -```bash -# Run the agent in web UI -adk web contributing/samples - -# Or run via CLI -adk run contributing/samples/logprobs -``` - -## Understanding Log Probabilities - -- **Range**: -∞ to 0 (0 = 100% confident, -1 ≈ 37% confident, -2 ≈ 14% confident) -- **Confidence Levels**: - - High: >= -0.5 (typically factual, straightforward responses) - - Medium: -1.0 to -0.5 (reasonably confident responses) - - Low: < -1.0 (uncertain or complex responses) -- **Use Cases**: Quality control, uncertainty detection, response filtering - -## Key Fields in LlmResponse - -- **`avg_logprobs`**: Average log probability across all tokens in the response -- **`logprobs_result`**: Detailed log probability information including top alternative tokens diff --git a/contributing/samples/mcp_dynamic_header_agent/README.md b/contributing/samples/mcp/mcp_dynamic_header_agent/README.md similarity index 100% rename from contributing/samples/mcp_dynamic_header_agent/README.md rename to contributing/samples/mcp/mcp_dynamic_header_agent/README.md diff --git a/contributing/samples/mcp_service_account_agent/__init__.py b/contributing/samples/mcp/mcp_dynamic_header_agent/__init__.py similarity index 100% rename from contributing/samples/mcp_service_account_agent/__init__.py rename to contributing/samples/mcp/mcp_dynamic_header_agent/__init__.py diff --git a/contributing/samples/mcp_dynamic_header_agent/agent.py b/contributing/samples/mcp/mcp_dynamic_header_agent/agent.py similarity index 97% rename from contributing/samples/mcp_dynamic_header_agent/agent.py rename to contributing/samples/mcp/mcp_dynamic_header_agent/agent.py index 0d3ce7f6a6..9b5d552807 100644 --- a/contributing/samples/mcp_dynamic_header_agent/agent.py +++ b/contributing/samples/mcp/mcp_dynamic_header_agent/agent.py @@ -18,7 +18,6 @@ from google.adk.tools.mcp_tool.mcp_toolset import McpToolset root_agent = LlmAgent( - model='gemini-2.5-flash', name='tenant_agent', instruction="""You are a helpful assistant that helps users get tenant information. Call the get_tenant_data tool when the user asks for tenant data.""", diff --git a/contributing/samples/mcp_dynamic_header_agent/header_server.py b/contributing/samples/mcp/mcp_dynamic_header_agent/header_server.py similarity index 100% rename from contributing/samples/mcp_dynamic_header_agent/header_server.py rename to contributing/samples/mcp/mcp_dynamic_header_agent/header_server.py diff --git a/contributing/samples/mcp_in_agent_tool_remote/README.md b/contributing/samples/mcp/mcp_in_agent_tool_remote/README.md similarity index 100% rename from contributing/samples/mcp_in_agent_tool_remote/README.md rename to contributing/samples/mcp/mcp_in_agent_tool_remote/README.md diff --git a/contributing/samples/mcp_sse_agent/__init__.py b/contributing/samples/mcp/mcp_in_agent_tool_remote/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/mcp_sse_agent/__init__.py rename to contributing/samples/mcp/mcp_in_agent_tool_remote/__init__.py diff --git a/contributing/samples/mcp_in_agent_tool_remote/agent.py b/contributing/samples/mcp/mcp_in_agent_tool_remote/agent.py similarity index 97% rename from contributing/samples/mcp_in_agent_tool_remote/agent.py rename to contributing/samples/mcp/mcp_in_agent_tool_remote/agent.py index f486274aa8..6d1a305566 100644 --- a/contributing/samples/mcp_in_agent_tool_remote/agent.py +++ b/contributing/samples/mcp/mcp_in_agent_tool_remote/agent.py @@ -32,7 +32,6 @@ # This agent has direct access to MCP tools sub_agent = Agent( name="mcp_helper", - model="gemini-2.5-flash", description=( "A helpful assistant with access to MCP tools for fetching websites." ), @@ -56,7 +55,6 @@ # This agent can delegate to the sub-agent via AgentTool root_agent = Agent( name="main_agent", - model="gemini-2.5-flash", description="Main agent that can delegate to a sub-agent with MCP tools.", instruction="""You are a helpful assistant. You have access to a sub-agent (mcp_helper) that has MCP tools for fetching websites. diff --git a/contributing/samples/mcp_in_agent_tool_stdio/README.md b/contributing/samples/mcp/mcp_in_agent_tool_stdio/README.md similarity index 100% rename from contributing/samples/mcp_in_agent_tool_stdio/README.md rename to contributing/samples/mcp/mcp_in_agent_tool_stdio/README.md diff --git a/contributing/samples/mcp_stdio_notion_agent/__init__.py b/contributing/samples/mcp/mcp_in_agent_tool_stdio/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/mcp_stdio_notion_agent/__init__.py rename to contributing/samples/mcp/mcp_in_agent_tool_stdio/__init__.py diff --git a/contributing/samples/mcp_in_agent_tool_stdio/agent.py b/contributing/samples/mcp/mcp_in_agent_tool_stdio/agent.py similarity index 97% rename from contributing/samples/mcp_in_agent_tool_stdio/agent.py rename to contributing/samples/mcp/mcp_in_agent_tool_stdio/agent.py index 74e20387e9..d4c61ca827 100644 --- a/contributing/samples/mcp_in_agent_tool_stdio/agent.py +++ b/contributing/samples/mcp/mcp_in_agent_tool_stdio/agent.py @@ -39,7 +39,6 @@ # This agent has direct access to MCP tools sub_agent = Agent( name="mcp_helper", - model="gemini-2.5-flash", description=( "A helpful assistant with access to MCP tools for fetching websites." ), @@ -63,7 +62,6 @@ # This agent can delegate to the sub-agent via AgentTool root_agent = Agent( name="main_agent", - model="gemini-2.5-flash", description="Main agent that can delegate to a sub-agent with MCP tools.", instruction="""You are a helpful assistant. You have access to a sub-agent (mcp_helper) that has MCP tools for fetching websites. diff --git a/contributing/samples/mcp_postgres_agent/README.md b/contributing/samples/mcp/mcp_postgres_agent/README.md similarity index 100% rename from contributing/samples/mcp_postgres_agent/README.md rename to contributing/samples/mcp/mcp_postgres_agent/README.md diff --git a/contributing/samples/mcp_stdio_server_agent/__init__.py b/contributing/samples/mcp/mcp_postgres_agent/__init__.py similarity index 100% rename from contributing/samples/mcp_stdio_server_agent/__init__.py rename to contributing/samples/mcp/mcp_postgres_agent/__init__.py diff --git a/contributing/samples/mcp_postgres_agent/agent.py b/contributing/samples/mcp/mcp_postgres_agent/agent.py similarity index 98% rename from contributing/samples/mcp_postgres_agent/agent.py rename to contributing/samples/mcp/mcp_postgres_agent/agent.py index 09e75b44d0..61f67a562f 100644 --- a/contributing/samples/mcp_postgres_agent/agent.py +++ b/contributing/samples/mcp/mcp_postgres_agent/agent.py @@ -31,7 +31,6 @@ ) root_agent = LlmAgent( - model="gemini-2.5-flash", name="postgres_agent", instruction=( "You are a PostgreSQL database assistant. " diff --git a/contributing/samples/mcp_streamablehttp_agent/__init__.py b/contributing/samples/mcp/mcp_progress_callback_agent/__init__.py similarity index 100% rename from contributing/samples/mcp_streamablehttp_agent/__init__.py rename to contributing/samples/mcp/mcp_progress_callback_agent/__init__.py diff --git a/contributing/samples/mcp_progress_callback_agent/agent.py b/contributing/samples/mcp/mcp_progress_callback_agent/agent.py similarity index 95% rename from contributing/samples/mcp_progress_callback_agent/agent.py rename to contributing/samples/mcp/mcp_progress_callback_agent/agent.py index 756d646f4e..3d8281e6b5 100644 --- a/contributing/samples/mcp_progress_callback_agent/agent.py +++ b/contributing/samples/mcp/mcp_progress_callback_agent/agent.py @@ -24,10 +24,13 @@ Pass a ProgressFnT callback that receives (progress, total, message). 2. Factory function (per-tool callbacks with runtime context): - Pass a ProgressCallbackFactory that takes (tool_name, callback_context, **kwargs) - and returns a ProgressFnT or None. This allows different tools to have different + Pass a ProgressCallbackFactory that takes (tool_name, callback_context, + **kwargs) + and returns a ProgressFnT or None. This allows different tools to have + different progress handling logic, and the factory can access and modify session state - via the CallbackContext. The **kwargs ensures forward compatibility for future + via the CallbackContext. The **kwargs ensures forward compatibility for + future parameters. IMPORTANT: Progress callbacks only work when the MCP server actually sends @@ -93,9 +96,9 @@ def progress_callback_factory( Args: tool_name: The name of the MCP tool. - callback_context: The callback context providing access to session, - state, artifacts, and other runtime information. Allows modifying - state via ctx.state['key'] = value. May be None if not available. + callback_context: The callback context providing access to session, state, + artifacts, and other runtime information. Allows modifying state via + ctx.state['key'] = value. May be None if not available. **kwargs: Additional keyword arguments for future extensibility. Returns: @@ -132,7 +135,6 @@ async def callback( root_agent = LlmAgent( - model="gemini-2.5-flash", name="progress_demo_agent", instruction="""\ You are a helpful assistant that can run long-running tasks. diff --git a/contributing/samples/mcp_progress_callback_agent/mock_progress_server.py b/contributing/samples/mcp/mcp_progress_callback_agent/mock_progress_server.py similarity index 100% rename from contributing/samples/mcp_progress_callback_agent/mock_progress_server.py rename to contributing/samples/mcp/mcp_progress_callback_agent/mock_progress_server.py diff --git a/contributing/samples/mcp_server_side_sampling/README.md b/contributing/samples/mcp/mcp_server_side_sampling/README.md similarity index 99% rename from contributing/samples/mcp_server_side_sampling/README.md rename to contributing/samples/mcp/mcp_server_side_sampling/README.md index 65eecd4e77..5ad437e3f5 100644 --- a/contributing/samples/mcp_server_side_sampling/README.md +++ b/contributing/samples/mcp/mcp_server_side_sampling/README.md @@ -23,7 +23,7 @@ The flow is as follows: ### Prerequisites -- Python 3.10+ +- Python 3.11+ - `google-adk` library installed. - A configured OpenAI API key. diff --git a/contributing/samples/mcp_toolset_auth/__init__.py b/contributing/samples/mcp/mcp_server_side_sampling/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/mcp_toolset_auth/__init__.py rename to contributing/samples/mcp/mcp_server_side_sampling/__init__.py diff --git a/contributing/samples/mcp_server_side_sampling/agent.py b/contributing/samples/mcp/mcp_server_side_sampling/agent.py similarity index 100% rename from contributing/samples/mcp_server_side_sampling/agent.py rename to contributing/samples/mcp/mcp_server_side_sampling/agent.py diff --git a/contributing/samples/mcp_server_side_sampling/mcp_server.py b/contributing/samples/mcp/mcp_server_side_sampling/mcp_server.py similarity index 100% rename from contributing/samples/mcp_server_side_sampling/mcp_server.py rename to contributing/samples/mcp/mcp_server_side_sampling/mcp_server.py diff --git a/contributing/samples/mcp_service_account_agent/README.md b/contributing/samples/mcp/mcp_service_account_agent/README.md similarity index 100% rename from contributing/samples/mcp_service_account_agent/README.md rename to contributing/samples/mcp/mcp_service_account_agent/README.md diff --git a/contributing/samples/memory/__init__.py b/contributing/samples/mcp/mcp_service_account_agent/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/memory/__init__.py rename to contributing/samples/mcp/mcp_service_account_agent/__init__.py diff --git a/contributing/samples/mcp_service_account_agent/agent.py b/contributing/samples/mcp/mcp_service_account_agent/agent.py similarity index 99% rename from contributing/samples/mcp_service_account_agent/agent.py rename to contributing/samples/mcp/mcp_service_account_agent/agent.py index 975ff0ccb7..bd3a18095a 100644 --- a/contributing/samples/mcp_service_account_agent/agent.py +++ b/contributing/samples/mcp/mcp_service_account_agent/agent.py @@ -29,7 +29,6 @@ SCOPES = {"https://www.googleapis.com/auth/cloud-platform": ""} root_agent = LlmAgent( - model="gemini-2.5-flash", name="enterprise_assistant", instruction=""" Help the user with the tools available to you. diff --git a/contributing/samples/mcp_sse_agent/README.md b/contributing/samples/mcp/mcp_sse_agent/README.md similarity index 100% rename from contributing/samples/mcp_sse_agent/README.md rename to contributing/samples/mcp/mcp_sse_agent/README.md diff --git a/contributing/samples/multimodal_tool_results/__init__.py b/contributing/samples/mcp/mcp_sse_agent/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/multimodal_tool_results/__init__.py rename to contributing/samples/mcp/mcp_sse_agent/__init__.py diff --git a/contributing/samples/mcp_sse_agent/agent.py b/contributing/samples/mcp/mcp_sse_agent/agent.py similarity index 98% rename from contributing/samples/mcp_sse_agent/agent.py rename to contributing/samples/mcp/mcp_sse_agent/agent.py index 8bddbca79f..f26191a441 100755 --- a/contributing/samples/mcp_sse_agent/agent.py +++ b/contributing/samples/mcp/mcp_sse_agent/agent.py @@ -28,7 +28,6 @@ ) root_agent = LlmAgent( - model='gemini-2.5-flash', name='enterprise_assistant', instruction=McpInstructionProvider( connection_params=connection_params, diff --git a/contributing/samples/mcp_sse_agent/filesystem_server.py b/contributing/samples/mcp/mcp_sse_agent/filesystem_server.py similarity index 100% rename from contributing/samples/mcp_sse_agent/filesystem_server.py rename to contributing/samples/mcp/mcp_sse_agent/filesystem_server.py diff --git a/contributing/samples/mcp_stdio_notion_agent/README.md b/contributing/samples/mcp/mcp_stdio_notion_agent/README.md similarity index 100% rename from contributing/samples/mcp_stdio_notion_agent/README.md rename to contributing/samples/mcp/mcp_stdio_notion_agent/README.md diff --git a/contributing/samples/non_llm_sequential/__init__.py b/contributing/samples/mcp/mcp_stdio_notion_agent/__init__.py similarity index 100% rename from contributing/samples/non_llm_sequential/__init__.py rename to contributing/samples/mcp/mcp_stdio_notion_agent/__init__.py diff --git a/contributing/samples/mcp_stdio_notion_agent/agent.py b/contributing/samples/mcp/mcp_stdio_notion_agent/agent.py similarity index 98% rename from contributing/samples/mcp_stdio_notion_agent/agent.py rename to contributing/samples/mcp/mcp_stdio_notion_agent/agent.py index 1a624f7ee1..7d348eaa91 100644 --- a/contributing/samples/mcp_stdio_notion_agent/agent.py +++ b/contributing/samples/mcp/mcp_stdio_notion_agent/agent.py @@ -29,7 +29,6 @@ }) root_agent = LlmAgent( - model="gemini-2.5-flash", name="notion_agent", instruction=( "You are my workspace assistant. " diff --git a/contributing/samples/oauth2_client_credentials/__init__.py b/contributing/samples/mcp/mcp_stdio_server_agent/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/oauth2_client_credentials/__init__.py rename to contributing/samples/mcp/mcp_stdio_server_agent/__init__.py diff --git a/contributing/samples/mcp_stdio_server_agent/agent.py b/contributing/samples/mcp/mcp_stdio_server_agent/agent.py similarity index 98% rename from contributing/samples/mcp_stdio_server_agent/agent.py rename to contributing/samples/mcp/mcp_stdio_server_agent/agent.py index 8b336ba281..f4e929e2b5 100755 --- a/contributing/samples/mcp_stdio_server_agent/agent.py +++ b/contributing/samples/mcp/mcp_stdio_server_agent/agent.py @@ -23,7 +23,6 @@ _allowed_path = os.path.dirname(os.path.abspath(__file__)) root_agent = LlmAgent( - model='gemini-2.5-flash', name='enterprise_assistant', instruction=f"""\ Help user accessing their file systems. diff --git a/contributing/samples/mcp_streamablehttp_agent/README.md b/contributing/samples/mcp/mcp_streamablehttp_agent/README.md similarity index 100% rename from contributing/samples/mcp_streamablehttp_agent/README.md rename to contributing/samples/mcp/mcp_streamablehttp_agent/README.md diff --git a/contributing/samples/oauth_calendar_agent/__init__.py b/contributing/samples/mcp/mcp_streamablehttp_agent/__init__.py similarity index 100% rename from contributing/samples/oauth_calendar_agent/__init__.py rename to contributing/samples/mcp/mcp_streamablehttp_agent/__init__.py diff --git a/contributing/samples/mcp_streamablehttp_agent/agent.py b/contributing/samples/mcp/mcp_streamablehttp_agent/agent.py similarity index 98% rename from contributing/samples/mcp_streamablehttp_agent/agent.py rename to contributing/samples/mcp/mcp_streamablehttp_agent/agent.py index cc88cf4e5b..ae5b3b5a70 100644 --- a/contributing/samples/mcp_streamablehttp_agent/agent.py +++ b/contributing/samples/mcp/mcp_streamablehttp_agent/agent.py @@ -22,7 +22,6 @@ _allowed_path = os.path.dirname(os.path.abspath(__file__)) root_agent = LlmAgent( - model='gemini-2.5-flash', name='enterprise_assistant', instruction=f"""\ Help user accessing their file systems. diff --git a/contributing/samples/mcp_streamablehttp_agent/filesystem_server.py b/contributing/samples/mcp/mcp_streamablehttp_agent/filesystem_server.py similarity index 100% rename from contributing/samples/mcp_streamablehttp_agent/filesystem_server.py rename to contributing/samples/mcp/mcp_streamablehttp_agent/filesystem_server.py diff --git a/contributing/samples/mcp_toolset_auth/README.md b/contributing/samples/mcp/mcp_toolset_auth/README.md similarity index 100% rename from contributing/samples/mcp_toolset_auth/README.md rename to contributing/samples/mcp/mcp_toolset_auth/README.md diff --git a/contributing/samples/output_schema_with_tools/__init__.py b/contributing/samples/mcp/mcp_toolset_auth/__init__.py similarity index 100% rename from contributing/samples/output_schema_with_tools/__init__.py rename to contributing/samples/mcp/mcp_toolset_auth/__init__.py diff --git a/contributing/samples/mcp_toolset_auth/agent.py b/contributing/samples/mcp/mcp_toolset_auth/agent.py similarity index 98% rename from contributing/samples/mcp_toolset_auth/agent.py rename to contributing/samples/mcp/mcp_toolset_auth/agent.py index bc0e8e54dd..a0bde37541 100644 --- a/contributing/samples/mcp_toolset_auth/agent.py +++ b/contributing/samples/mcp/mcp_toolset_auth/agent.py @@ -63,7 +63,6 @@ # Define the agent that uses the OAuth-protected MCP toolset root_agent = LlmAgent( - model='gemini-2.5-flash', name='oauth_mcp_agent', instruction="""You are a helpful assistant that can access user information. diff --git a/contributing/samples/mcp_toolset_auth/main.py b/contributing/samples/mcp/mcp_toolset_auth/main.py similarity index 98% rename from contributing/samples/mcp_toolset_auth/main.py rename to contributing/samples/mcp/mcp_toolset_auth/main.py index f02c553301..2469041afd 100644 --- a/contributing/samples/mcp_toolset_auth/main.py +++ b/contributing/samples/mcp/mcp_toolset_auth/main.py @@ -22,7 +22,8 @@ Usage: # Start the MCP server first (in another terminal): - PYTHONPATH=src python contributing/samples/mcp_toolset_auth/oauth_mcp_server.py + PYTHONPATH=src python + contributing/samples/mcp_toolset_auth/oauth_mcp_server.py # Run the demo: PYTHONPATH=src python contributing/samples/mcp_toolset_auth/main.py diff --git a/contributing/samples/mcp_toolset_auth/oauth_mcp_server.py b/contributing/samples/mcp/mcp_toolset_auth/oauth_mcp_server.py similarity index 100% rename from contributing/samples/mcp_toolset_auth/oauth_mcp_server.py rename to contributing/samples/mcp/mcp_toolset_auth/oauth_mcp_server.py diff --git a/contributing/samples/tool_mcp_stdio_notion_config/README.md b/contributing/samples/mcp/tool_mcp_stdio_notion_config/README.md similarity index 100% rename from contributing/samples/tool_mcp_stdio_notion_config/README.md rename to contributing/samples/mcp/tool_mcp_stdio_notion_config/README.md diff --git a/contributing/samples/tool_mcp_stdio_notion_config/root_agent.yaml b/contributing/samples/mcp/tool_mcp_stdio_notion_config/root_agent.yaml similarity index 100% rename from contributing/samples/tool_mcp_stdio_notion_config/root_agent.yaml rename to contributing/samples/mcp/tool_mcp_stdio_notion_config/root_agent.yaml diff --git a/contributing/samples/hello_world_gemma3_ollama/__init__.py b/contributing/samples/models/hello_world_anthropic/__init__.py similarity index 100% rename from contributing/samples/hello_world_gemma3_ollama/__init__.py rename to contributing/samples/models/hello_world_anthropic/__init__.py diff --git a/contributing/samples/hello_world_anthropic/agent.py b/contributing/samples/models/hello_world_anthropic/agent.py similarity index 100% rename from contributing/samples/hello_world_anthropic/agent.py rename to contributing/samples/models/hello_world_anthropic/agent.py diff --git a/contributing/samples/hello_world_anthropic/main.py b/contributing/samples/models/hello_world_anthropic/main.py similarity index 100% rename from contributing/samples/hello_world_anthropic/main.py rename to contributing/samples/models/hello_world_anthropic/main.py diff --git a/contributing/samples/hello_world_apigeellm/README.md b/contributing/samples/models/hello_world_apigeellm/README.md similarity index 100% rename from contributing/samples/hello_world_apigeellm/README.md rename to contributing/samples/models/hello_world_apigeellm/README.md diff --git a/contributing/samples/hello_world_apigeellm/agent.py b/contributing/samples/models/hello_world_apigeellm/agent.py similarity index 100% rename from contributing/samples/hello_world_apigeellm/agent.py rename to contributing/samples/models/hello_world_apigeellm/agent.py diff --git a/contributing/samples/hello_world_apigeellm/main.py b/contributing/samples/models/hello_world_apigeellm/main.py similarity index 100% rename from contributing/samples/hello_world_apigeellm/main.py rename to contributing/samples/models/hello_world_apigeellm/main.py diff --git a/contributing/samples/hello_world_litellm/__init__.py b/contributing/samples/models/hello_world_gemma/__init__.py similarity index 100% rename from contributing/samples/hello_world_litellm/__init__.py rename to contributing/samples/models/hello_world_gemma/__init__.py diff --git a/contributing/samples/hello_world_gemma/agent.py b/contributing/samples/models/hello_world_gemma/agent.py similarity index 100% rename from contributing/samples/hello_world_gemma/agent.py rename to contributing/samples/models/hello_world_gemma/agent.py diff --git a/contributing/samples/hello_world_gemma/main.py b/contributing/samples/models/hello_world_gemma/main.py similarity index 100% rename from contributing/samples/hello_world_gemma/main.py rename to contributing/samples/models/hello_world_gemma/main.py diff --git a/contributing/samples/hello_world_litellm_add_function_to_prompt/__init__.py b/contributing/samples/models/hello_world_gemma3_ollama/__init__.py similarity index 100% rename from contributing/samples/hello_world_litellm_add_function_to_prompt/__init__.py rename to contributing/samples/models/hello_world_gemma3_ollama/__init__.py diff --git a/contributing/samples/hello_world_gemma3_ollama/agent.py b/contributing/samples/models/hello_world_gemma3_ollama/agent.py similarity index 100% rename from contributing/samples/hello_world_gemma3_ollama/agent.py rename to contributing/samples/models/hello_world_gemma3_ollama/agent.py diff --git a/contributing/samples/hello_world_gemma3_ollama/main.py b/contributing/samples/models/hello_world_gemma3_ollama/main.py similarity index 100% rename from contributing/samples/hello_world_gemma3_ollama/main.py rename to contributing/samples/models/hello_world_gemma3_ollama/main.py diff --git a/contributing/samples/migrate_session_db/__init__.py b/contributing/samples/models/hello_world_litellm/__init__.py similarity index 100% rename from contributing/samples/migrate_session_db/__init__.py rename to contributing/samples/models/hello_world_litellm/__init__.py diff --git a/contributing/samples/hello_world_litellm/agent.py b/contributing/samples/models/hello_world_litellm/agent.py similarity index 100% rename from contributing/samples/hello_world_litellm/agent.py rename to contributing/samples/models/hello_world_litellm/agent.py diff --git a/contributing/samples/hello_world_litellm/main.py b/contributing/samples/models/hello_world_litellm/main.py similarity index 100% rename from contributing/samples/hello_world_litellm/main.py rename to contributing/samples/models/hello_world_litellm/main.py diff --git a/contributing/samples/postgres_session_service/__init__.py b/contributing/samples/models/hello_world_litellm_add_function_to_prompt/__init__.py similarity index 100% rename from contributing/samples/postgres_session_service/__init__.py rename to contributing/samples/models/hello_world_litellm_add_function_to_prompt/__init__.py diff --git a/contributing/samples/hello_world_litellm_add_function_to_prompt/agent.py b/contributing/samples/models/hello_world_litellm_add_function_to_prompt/agent.py similarity index 100% rename from contributing/samples/hello_world_litellm_add_function_to_prompt/agent.py rename to contributing/samples/models/hello_world_litellm_add_function_to_prompt/agent.py diff --git a/contributing/samples/hello_world_litellm_add_function_to_prompt/main.py b/contributing/samples/models/hello_world_litellm_add_function_to_prompt/main.py similarity index 100% rename from contributing/samples/hello_world_litellm_add_function_to_prompt/main.py rename to contributing/samples/models/hello_world_litellm_add_function_to_prompt/main.py diff --git a/contributing/samples/hello_world_ollama/README.md b/contributing/samples/models/hello_world_ollama/README.md similarity index 100% rename from contributing/samples/hello_world_ollama/README.md rename to contributing/samples/models/hello_world_ollama/README.md diff --git a/contributing/samples/parallel_functions/__init__.py b/contributing/samples/models/hello_world_ollama/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/parallel_functions/__init__.py rename to contributing/samples/models/hello_world_ollama/__init__.py diff --git a/contributing/samples/hello_world_ollama/agent.py b/contributing/samples/models/hello_world_ollama/agent.py similarity index 100% rename from contributing/samples/hello_world_ollama/agent.py rename to contributing/samples/models/hello_world_ollama/agent.py diff --git a/contributing/samples/hello_world_ollama/main.py b/contributing/samples/models/hello_world_ollama/main.py similarity index 100% rename from contributing/samples/hello_world_ollama/main.py rename to contributing/samples/models/hello_world_ollama/main.py diff --git a/contributing/samples/interactions_api/README.md b/contributing/samples/models/interactions_api/README.md similarity index 100% rename from contributing/samples/interactions_api/README.md rename to contributing/samples/models/interactions_api/README.md diff --git a/contributing/samples/interactions_api/__init__.py b/contributing/samples/models/interactions_api/__init__.py similarity index 100% rename from contributing/samples/interactions_api/__init__.py rename to contributing/samples/models/interactions_api/__init__.py diff --git a/contributing/samples/interactions_api/agent.py b/contributing/samples/models/interactions_api/agent.py similarity index 98% rename from contributing/samples/interactions_api/agent.py rename to contributing/samples/models/interactions_api/agent.py index 908a853948..ffdfeeb1e6 100644 --- a/contributing/samples/interactions_api/agent.py +++ b/contributing/samples/models/interactions_api/agent.py @@ -83,7 +83,7 @@ def get_current_weather(city: str) -> dict: # tries to call a function (e.g., run_code) instead of outputting code in markdown. root_agent = Agent( model=Gemini( - model="gemini-2.5-flash", + model="gemini-3-flash-preview", use_interactions_api=True, ), name="interactions_test_agent", diff --git a/contributing/samples/interactions_api/main.py b/contributing/samples/models/interactions_api/main.py similarity index 100% rename from contributing/samples/interactions_api/main.py rename to contributing/samples/models/interactions_api/main.py diff --git a/contributing/samples/models/litellm_inline_tool_call/__init__.py b/contributing/samples/models/litellm_inline_tool_call/__init__.py new file mode 100644 index 0000000000..606228d280 --- /dev/null +++ b/contributing/samples/models/litellm_inline_tool_call/__init__.py @@ -0,0 +1,17 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from . import agent diff --git a/contributing/samples/litellm_inline_tool_call/agent.py b/contributing/samples/models/litellm_inline_tool_call/agent.py similarity index 100% rename from contributing/samples/litellm_inline_tool_call/agent.py rename to contributing/samples/models/litellm_inline_tool_call/agent.py diff --git a/contributing/samples/plugin_debug_logging/__init__.py b/contributing/samples/models/litellm_streaming/__init__.py similarity index 100% rename from contributing/samples/plugin_debug_logging/__init__.py rename to contributing/samples/models/litellm_streaming/__init__.py diff --git a/contributing/samples/litellm_streaming/agent.py b/contributing/samples/models/litellm_streaming/agent.py similarity index 100% rename from contributing/samples/litellm_streaming/agent.py rename to contributing/samples/models/litellm_streaming/agent.py diff --git a/contributing/samples/litellm_streaming/main.py b/contributing/samples/models/litellm_streaming/main.py similarity index 100% rename from contributing/samples/litellm_streaming/main.py rename to contributing/samples/models/litellm_streaming/main.py diff --git a/contributing/samples/plugin_reflect_tool_retry/basic/__init__.py b/contributing/samples/models/litellm_structured_output/__init__.py similarity index 100% rename from contributing/samples/plugin_reflect_tool_retry/basic/__init__.py rename to contributing/samples/models/litellm_structured_output/__init__.py diff --git a/contributing/samples/litellm_structured_output/agent.py b/contributing/samples/models/litellm_structured_output/agent.py similarity index 100% rename from contributing/samples/litellm_structured_output/agent.py rename to contributing/samples/models/litellm_structured_output/agent.py diff --git a/contributing/samples/litellm_with_fallback_models/README.md b/contributing/samples/models/litellm_with_fallback_models/README.md similarity index 100% rename from contributing/samples/litellm_with_fallback_models/README.md rename to contributing/samples/models/litellm_with_fallback_models/README.md diff --git a/contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/__init__.py b/contributing/samples/models/litellm_with_fallback_models/__init__.py similarity index 100% rename from contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/__init__.py rename to contributing/samples/models/litellm_with_fallback_models/__init__.py diff --git a/contributing/samples/litellm_with_fallback_models/agent.py b/contributing/samples/models/litellm_with_fallback_models/agent.py similarity index 100% rename from contributing/samples/litellm_with_fallback_models/agent.py rename to contributing/samples/models/litellm_with_fallback_models/agent.py diff --git a/contributing/samples/pubsub/__init__.py b/contributing/samples/models/manual_ollama_test/__init__.py similarity index 100% rename from contributing/samples/pubsub/__init__.py rename to contributing/samples/models/manual_ollama_test/__init__.py diff --git a/contributing/samples/manual_ollama_test/agent.py b/contributing/samples/models/manual_ollama_test/agent.py similarity index 100% rename from contributing/samples/manual_ollama_test/agent.py rename to contributing/samples/models/manual_ollama_test/agent.py diff --git a/contributing/samples/pydantic_argument/__init__.py b/contributing/samples/multi_agent/hello_world_ma/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/pydantic_argument/__init__.py rename to contributing/samples/multi_agent/hello_world_ma/__init__.py diff --git a/contributing/samples/hello_world_ma/agent.py b/contributing/samples/multi_agent/hello_world_ma/agent.py similarity index 98% rename from contributing/samples/hello_world_ma/agent.py rename to contributing/samples/multi_agent/hello_world_ma/agent.py index fad1e2b9eb..49ab34e3ed 100755 --- a/contributing/samples/hello_world_ma/agent.py +++ b/contributing/samples/multi_agent/hello_world_ma/agent.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os import random from google.adk.agents.llm_agent import Agent @@ -23,6 +24,8 @@ # --- Roll Die Sub-Agent --- def roll_die(sides: int) -> int: """Roll a die and return the rolled result.""" + if "PYTEST_CURRENT_TEST" in os.environ: + return 2 return random.randint(1, sides) @@ -131,7 +134,6 @@ def check_prime(nums: list[int]) -> str: root_agent = Agent( - model="gemini-2.5-flash", name="root_agent", instruction=""" You are a helpful assistant that can roll dice and check if numbers are prime. diff --git a/contributing/samples/multi_agent/hello_world_ma/tests/roll_die_and_check_prime.json b/contributing/samples/multi_agent/hello_world_ma/tests/roll_die_and_check_prime.json new file mode 100644 index 0000000000..b45cfd9f19 --- /dev/null +++ b/contributing/samples/multi_agent/hello_world_ma/tests/roll_die_and_check_prime.json @@ -0,0 +1,296 @@ +{ + "appName": "hello_world_ma", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "hi" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Hello! How can I help you today?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "roll a dice of 10 dies" + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-2", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "agent_name": "roll_agent" + }, + "id": "fc-1", + "name": "transfer_to_agent" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-2", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "actions": { + "transferToAgent": "roll_agent" + }, + "author": "root_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "transfer_to_agent", + "response": { + "result": null + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-2", + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "roll_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "sides": 10 + }, + "id": "fc-2", + "name": "roll_die" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-2", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/roll_agent@1" + } + }, + { + "author": "roll_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "roll_die", + "response": { + "result": 2 + } + } + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-2", + "nodeInfo": { + "path": "root_agent@1/roll_agent@1" + } + }, + { + "author": "roll_agent", + "content": { + "parts": [ + { + "text": "You rolled a 2.\n" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-8", + "invocationId": "i-2", + "nodeInfo": { + "path": "root_agent@1/roll_agent@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "check it" + } + ], + "role": "user" + }, + "id": "e-9", + "invocationId": "i-3", + "nodeInfo": { + "path": "" + } + }, + { + "author": "roll_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "agent_name": "prime_agent" + }, + "id": "fc-3", + "name": "transfer_to_agent" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-10", + "invocationId": "i-3", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/roll_agent@1" + } + }, + { + "actions": { + "transferToAgent": "prime_agent" + }, + "author": "roll_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-3", + "name": "transfer_to_agent", + "response": { + "result": null + } + } + } + ], + "role": "user" + }, + "id": "e-11", + "invocationId": "i-3", + "nodeInfo": { + "path": "root_agent@1/roll_agent@1" + } + }, + { + "author": "prime_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "nums": [ + 2 + ] + }, + "id": "fc-4", + "name": "check_prime" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-12", + "invocationId": "i-3", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/prime_agent@1" + } + }, + { + "author": "prime_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-4", + "name": "check_prime", + "response": { + "result": "2 are prime numbers." + } + } + } + ], + "role": "user" + }, + "id": "e-13", + "invocationId": "i-3", + "nodeInfo": { + "path": "root_agent@1/prime_agent@1" + } + }, + { + "author": "prime_agent", + "content": { + "parts": [ + { + "text": "2 are prime numbers." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-14", + "invocationId": "i-3", + "nodeInfo": { + "path": "root_agent@1/prime_agent@1" + } + } + ] +} diff --git a/contributing/samples/multi_agent_basic_config/README.md b/contributing/samples/multi_agent/multi_agent_basic_config/README.md similarity index 100% rename from contributing/samples/multi_agent_basic_config/README.md rename to contributing/samples/multi_agent/multi_agent_basic_config/README.md diff --git a/contributing/samples/multi_agent_basic_config/code_tutor_agent.yaml b/contributing/samples/multi_agent/multi_agent_basic_config/code_tutor_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_basic_config/code_tutor_agent.yaml rename to contributing/samples/multi_agent/multi_agent_basic_config/code_tutor_agent.yaml diff --git a/contributing/samples/multi_agent_basic_config/math_tutor_agent.yaml b/contributing/samples/multi_agent/multi_agent_basic_config/math_tutor_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_basic_config/math_tutor_agent.yaml rename to contributing/samples/multi_agent/multi_agent_basic_config/math_tutor_agent.yaml diff --git a/contributing/samples/multi_agent_basic_config/root_agent.yaml b/contributing/samples/multi_agent/multi_agent_basic_config/root_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_basic_config/root_agent.yaml rename to contributing/samples/multi_agent/multi_agent_basic_config/root_agent.yaml diff --git a/contributing/samples/multi_agent_llm_config/README.md b/contributing/samples/multi_agent/multi_agent_llm_config/README.md similarity index 100% rename from contributing/samples/multi_agent_llm_config/README.md rename to contributing/samples/multi_agent/multi_agent_llm_config/README.md diff --git a/contributing/samples/multi_agent_llm_config/__init__.py b/contributing/samples/multi_agent/multi_agent_llm_config/__init__.py similarity index 77% rename from contributing/samples/multi_agent_llm_config/__init__.py rename to contributing/samples/multi_agent/multi_agent_llm_config/__init__.py index 6515866032..56a17cc799 100644 --- a/contributing/samples/multi_agent_llm_config/__init__.py +++ b/contributing/samples/multi_agent/multi_agent_llm_config/__init__.py @@ -1,3 +1,17 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import random from google.adk.examples.example import Example diff --git a/contributing/samples/multi_agent_llm_config/prime_agent.yaml b/contributing/samples/multi_agent/multi_agent_llm_config/prime_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_llm_config/prime_agent.yaml rename to contributing/samples/multi_agent/multi_agent_llm_config/prime_agent.yaml diff --git a/contributing/samples/multi_agent_llm_config/roll_agent.yaml b/contributing/samples/multi_agent/multi_agent_llm_config/roll_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_llm_config/roll_agent.yaml rename to contributing/samples/multi_agent/multi_agent_llm_config/roll_agent.yaml diff --git a/contributing/samples/multi_agent_llm_config/root_agent.yaml b/contributing/samples/multi_agent/multi_agent_llm_config/root_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_llm_config/root_agent.yaml rename to contributing/samples/multi_agent/multi_agent_llm_config/root_agent.yaml diff --git a/contributing/samples/multi_agent_loop_config/README.md b/contributing/samples/multi_agent/multi_agent_loop_config/README.md similarity index 100% rename from contributing/samples/multi_agent_loop_config/README.md rename to contributing/samples/multi_agent/multi_agent_loop_config/README.md diff --git a/contributing/samples/multi_agent_loop_config/loop_agent.yaml b/contributing/samples/multi_agent/multi_agent_loop_config/loop_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_loop_config/loop_agent.yaml rename to contributing/samples/multi_agent/multi_agent_loop_config/loop_agent.yaml diff --git a/contributing/samples/multi_agent_loop_config/root_agent.yaml b/contributing/samples/multi_agent/multi_agent_loop_config/root_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_loop_config/root_agent.yaml rename to contributing/samples/multi_agent/multi_agent_loop_config/root_agent.yaml diff --git a/contributing/samples/multi_agent_loop_config/writer_agents/critic_agent.yaml b/contributing/samples/multi_agent/multi_agent_loop_config/writer_agents/critic_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_loop_config/writer_agents/critic_agent.yaml rename to contributing/samples/multi_agent/multi_agent_loop_config/writer_agents/critic_agent.yaml diff --git a/contributing/samples/multi_agent_loop_config/writer_agents/initial_writer_agent.yaml b/contributing/samples/multi_agent/multi_agent_loop_config/writer_agents/initial_writer_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_loop_config/writer_agents/initial_writer_agent.yaml rename to contributing/samples/multi_agent/multi_agent_loop_config/writer_agents/initial_writer_agent.yaml diff --git a/contributing/samples/multi_agent_loop_config/writer_agents/refiner_agent.yaml b/contributing/samples/multi_agent/multi_agent_loop_config/writer_agents/refiner_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_loop_config/writer_agents/refiner_agent.yaml rename to contributing/samples/multi_agent/multi_agent_loop_config/writer_agents/refiner_agent.yaml diff --git a/contributing/samples/multi_agent_seq_config/README.md b/contributing/samples/multi_agent/multi_agent_seq_config/README.md similarity index 100% rename from contributing/samples/multi_agent_seq_config/README.md rename to contributing/samples/multi_agent/multi_agent_seq_config/README.md diff --git a/contributing/samples/multi_agent_seq_config/root_agent.yaml b/contributing/samples/multi_agent/multi_agent_seq_config/root_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_seq_config/root_agent.yaml rename to contributing/samples/multi_agent/multi_agent_seq_config/root_agent.yaml diff --git a/contributing/samples/multi_agent_seq_config/sub_agents/code_refactorer_agent.yaml b/contributing/samples/multi_agent/multi_agent_seq_config/sub_agents/code_refactorer_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_seq_config/sub_agents/code_refactorer_agent.yaml rename to contributing/samples/multi_agent/multi_agent_seq_config/sub_agents/code_refactorer_agent.yaml diff --git a/contributing/samples/multi_agent_seq_config/sub_agents/code_reviewer_agent.yaml b/contributing/samples/multi_agent/multi_agent_seq_config/sub_agents/code_reviewer_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_seq_config/sub_agents/code_reviewer_agent.yaml rename to contributing/samples/multi_agent/multi_agent_seq_config/sub_agents/code_reviewer_agent.yaml diff --git a/contributing/samples/multi_agent_seq_config/sub_agents/code_writer_agent.yaml b/contributing/samples/multi_agent/multi_agent_seq_config/sub_agents/code_writer_agent.yaml similarity index 100% rename from contributing/samples/multi_agent_seq_config/sub_agents/code_writer_agent.yaml rename to contributing/samples/multi_agent/multi_agent_seq_config/sub_agents/code_writer_agent.yaml diff --git a/contributing/samples/multi_agent/single_turn_sub_agent/README.md b/contributing/samples/multi_agent/single_turn_sub_agent/README.md new file mode 100644 index 0000000000..b08ba9ca39 --- /dev/null +++ b/contributing/samples/multi_agent/single_turn_sub_agent/README.md @@ -0,0 +1,52 @@ +# ADK Single-turn Agent as Sub-agent Sample + +## Overview + +This sample demonstrates how a "single_turn" mode agent can act as an autonomous sub-agent to an LLM agent, utilizing schemas and tools without ever interacting with the user. + +**Note**: This is the recommended mechanism to replace the older `AgentTool` pattern. Unlike `AgentTool`, using a `single_turn` sub-agent preserves the sub-agent's internal interactions (like tool calls) in the session history. + +Single-turn agents are designed to execute their function fully in one prompt-response cycle. In this sample: + +1. `phone_recommender`: A single-turn agent that receives structured input (`UserPreferences`), uses a mocked tool (`check_phone_price`), and returns structured output (`PhoneRecommendation`). +1. `root_agent`: The main agent that interacts with the user, translates their natural language request into the structured `UserPreferences`, and delegates to `phone_recommender`. + +## Sample Inputs + +- `I need a phone mostly for gaming. I have about $1000 to spend.` + +- `What is a good cheap phone from Google for basic tasks?` + +- `I love photography but prefer smaller phones. My budget is $600.` + +## Graph + +```mermaid +graph TD + root_agent --> phone_recommender + phone_recommender -.->|uses| check_phone_price[check_phone_price tool] +``` + +## How To + +1. Define a sub-agent with `mode="single_turn"`, `input_schema`, `output_schema`: + + ```python + phone_recommender = Agent( + name="phone_recommender", + mode="single_turn", + input_schema=UserPreferences, + output_schema=PhoneRecommendation, + tools=[check_phone_price], + ... + ) + ``` + +1. Assign it to a parent agent: + + ```python + root_agent = Agent( + sub_agents=[phone_recommender], + ... + ) + ``` diff --git a/contributing/samples/multi_agent/single_turn_sub_agent/agent.py b/contributing/samples/multi_agent/single_turn_sub_agent/agent.py new file mode 100644 index 0000000000..ec25e167a7 --- /dev/null +++ b/contributing/samples/multi_agent/single_turn_sub_agent/agent.py @@ -0,0 +1,81 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk import Agent +from pydantic import BaseModel +from pydantic import Field + + +class UserPreferences(BaseModel): + budget: int = Field(description="The user's maximum budget in USD") + primary_use: str = Field( + description=( + "What the user primarily uses their phone for (e.g., photography," + " gaming, basics)" + ) + ) + preferred_size: str = Field( + description="Preferred phone size (e.g., small, large, any)" + ) + + +class PhoneRecommendation(BaseModel): + """Output schema for the phone recommendation.""" + + model_name: str + price: float + reason: str + + +def check_phone_price(model_name: str) -> float: + """Mock tool to check the current price of a Pixel phone model.""" + prices = { + "Pixel 10a": 499.0, + "Pixel 10": 799.0, + "Pixel 10 Pro": 999.0, + "Pixel 10 Pro XL": 1199.0, + "Pixel 10 Pro Fold": 1799.0, + } + # Simple mock logic, defaulting to 799 if not found exactly + for key, value in prices.items(): + if key.lower() in model_name.lower(): + return value + return 799.0 + + +phone_recommender = Agent( + name="phone_recommender", + mode="single_turn", + input_schema=UserPreferences, + output_schema=PhoneRecommendation, + tools=[check_phone_price], + instruction=("""\ +You are an expert Google Pixel hardware recommender. +Based on the provided UserPreferences, recommend exactly one Pixel phone model. +You must use the `check_phone_price` tool to find the exact current price of the model you are recommending before you finish your task. +Only recommend these phones: Pixel 10a, Pixel 10, Pixel 10 Pro, Pixel 10 Pro XL, Pixel 10 Pro Fold. + """), + description="Recommends a Pixel phone based on preferences.", +) + + +root_agent = Agent( + name="root_agent", + sub_agents=[phone_recommender], + instruction=("""\ +You are a helpful phone sales associate. +If the user is asking for a phone recommendation, use the `phone_recommender` to get a structured recommendation. +Once the recommender finishes, present the model, price, and reason to the user in a friendly way. + """), +) diff --git a/contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000.json b/contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000.json new file mode 100644 index 0000000000..9112d546db --- /dev/null +++ b/contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000.json @@ -0,0 +1,440 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "gaming, $1000" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "That sounds like a great budget for a gaming phone! To give you the best recommendation, could you tell me what size phone you prefer? Do you like something **small**, **large**, or is **any** size okay with you?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "large" + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-2", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "budget": 1000, + "preferred_size": "large", + "primary_use": "gaming" + }, + "id": "fc-1", + "name": "phone_recommender" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-2", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10 Pro XL" + }, + "id": "fc-2", + "name": "check_phone_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-2", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "check_phone_price", + "response": { + "result": 799.0 + } + } + } + ], + "role": "user" + }, + "id": "e-6", + "invocationId": "i-2", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10 Pro Fold" + }, + "id": "fc-3", + "name": "check_phone_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-7", + "invocationId": "i-2", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-3", + "name": "check_phone_price", + "response": { + "result": 799.0 + } + } + } + ], + "role": "user" + }, + "id": "e-8", + "invocationId": "i-2", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10 Pro" + }, + "id": "fc-4", + "name": "check_phone_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-9", + "invocationId": "i-2", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-4", + "name": "check_phone_price", + "response": { + "result": 799.0 + } + } + } + ], + "role": "user" + }, + "id": "e-10", + "invocationId": "i-2", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10" + }, + "id": "fc-5", + "name": "check_phone_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-11", + "invocationId": "i-2", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-5", + "name": "check_phone_price", + "response": { + "result": 799.0 + } + } + } + ], + "role": "user" + }, + "id": "e-12", + "invocationId": "i-2", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10a" + }, + "id": "fc-6", + "name": "check_phone_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-13", + "invocationId": "i-2", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-6", + "name": "check_phone_price", + "response": { + "result": 499.0 + } + } + } + ], + "role": "user" + }, + "id": "e-14", + "invocationId": "i-2", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10 Pro XL", + "price": 799, + "reason": "The Pixel 10 Pro XL is the best fit for your gaming needs and preference for a large screen. At $799, it is well within your $1000 budget and provides the high performance and large display area required for an optimal gaming experience." + }, + "id": "fc-7", + "name": "set_model_response" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-15", + "invocationId": "i-2", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "actions": { + "setModelResponse": { + "model_name": "Pixel 10 Pro XL", + "price": 799.0, + "reason": "The Pixel 10 Pro XL is the best fit for your gaming needs and preference for a large screen. At $799, it is well within your $1000 budget and provides the high performance and large display area required for an optimal gaming experience." + } + }, + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-7", + "name": "set_model_response", + "response": { + "model_name": "Pixel 10 Pro XL", + "price": 799.0, + "reason": "The Pixel 10 Pro XL is the best fit for your gaming needs and preference for a large screen. At $799, it is well within your $1000 budget and provides the high performance and large display area required for an optimal gaming experience." + } + } + } + ], + "role": "user" + }, + "id": "e-16", + "invocationId": "i-2", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "text": "{\"model_name\": \"Pixel 10 Pro XL\", \"price\": 799.0, \"reason\": \"The Pixel 10 Pro XL is the best fit for your gaming needs and preference for a large screen. At $799, it is well within your $1000 budget and provides the high performance and large display area required for an optimal gaming experience.\"}" + } + ], + "role": "model" + }, + "id": "e-17", + "invocationId": "i-2", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/phone_recommender@1" + ], + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "phone_recommender", + "response": { + "model_name": "Pixel 10 Pro XL", + "price": 799.0, + "reason": "The Pixel 10 Pro XL is the best fit for your gaming needs and preference for a large screen. At $799, it is well within your $1000 budget and provides the high performance and large display area required for an optimal gaming experience." + } + } + } + ], + "role": "user" + }, + "id": "e-18", + "invocationId": "i-2", + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "OK! Based on what you're looking for, I recommend the **Pixel 10 Pro XL**.\n\n* **Price:** $799\n* **Why it's for you:** It\u2019s the perfect fit for your gaming needs and preference for a large screen. Since it's $799, it's well under your $1,000 budget while providing the high performance and large display area you need for the best gaming experience." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-19", + "invocationId": "i-2", + "nodeInfo": { + "path": "root_agent@1" + } + } + ] +} diff --git a/contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000_large.json b/contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000_large.json new file mode 100644 index 0000000000..93be74f981 --- /dev/null +++ b/contributing/samples/multi_agent/single_turn_sub_agent/tests/gaming_1000_large.json @@ -0,0 +1,359 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "gaming, $1000, large" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "budget": 1000, + "preferred_size": "large", + "primary_use": "gaming" + }, + "id": "fc-1", + "name": "phone_recommender" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10 Pro XL" + }, + "id": "fc-2", + "name": "check_phone_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "check_phone_price", + "response": { + "result": 799.0 + } + } + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10 Pro" + }, + "id": "fc-3", + "name": "check_phone_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-3", + "name": "check_phone_price", + "response": { + "result": 799.0 + } + } + } + ], + "role": "user" + }, + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10 Pro Fold" + }, + "id": "fc-4", + "name": "check_phone_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-7", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-4", + "name": "check_phone_price", + "response": { + "result": 799.0 + } + } + } + ], + "role": "user" + }, + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10" + }, + "id": "fc-5", + "name": "check_phone_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-9", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-5", + "name": "check_phone_price", + "response": { + "result": 799.0 + } + } + } + ], + "role": "user" + }, + "id": "e-10", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10 Pro XL", + "price": 799, + "reason": "The Pixel 10 Pro XL is the best choice for gaming due to its large screen and high performance. It fits perfectly within your $1000 budget and satisfies your preference for a large device." + }, + "id": "fc-6", + "name": "set_model_response" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-11", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "actions": { + "setModelResponse": { + "model_name": "Pixel 10 Pro XL", + "price": 799.0, + "reason": "The Pixel 10 Pro XL is the best choice for gaming due to its large screen and high performance. It fits perfectly within your $1000 budget and satisfies your preference for a large device." + } + }, + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-6", + "name": "set_model_response", + "response": { + "model_name": "Pixel 10 Pro XL", + "price": 799.0, + "reason": "The Pixel 10 Pro XL is the best choice for gaming due to its large screen and high performance. It fits perfectly within your $1000 budget and satisfies your preference for a large device." + } + } + } + ], + "role": "user" + }, + "id": "e-12", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "text": "{\"model_name\": \"Pixel 10 Pro XL\", \"price\": 799.0, \"reason\": \"The Pixel 10 Pro XL is the best choice for gaming due to its large screen and high performance. It fits perfectly within your $1000 budget and satisfies your preference for a large device.\"}" + } + ], + "role": "model" + }, + "id": "e-13", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/phone_recommender@1" + ], + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "phone_recommender", + "response": { + "model_name": "Pixel 10 Pro XL", + "price": 799.0, + "reason": "The Pixel 10 Pro XL is the best choice for gaming due to its large screen and high performance. It fits perfectly within your $1000 budget and satisfies your preference for a large device." + } + } + } + ], + "role": "user" + }, + "id": "e-14", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "OK! Based on your preferences, I recommend the **Pixel 10 Pro XL**.\n\n* **Model:** Pixel 10 Pro XL\n* **Price:** $799\n* **Why it's for you:** The Pixel 10 Pro XL is the best choice for gaming due to its large screen and high performance. It fits perfectly within your $1000 budget and satisfies your preference for a large device." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-15", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1" + } + } + ] +} diff --git a/contributing/samples/multi_agent/single_turn_sub_agent/tests/go.json b/contributing/samples/multi_agent/single_turn_sub_agent/tests/go.json new file mode 100644 index 0000000000..8eea2f7d70 --- /dev/null +++ b/contributing/samples/multi_agent/single_turn_sub_agent/tests/go.json @@ -0,0 +1,383 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "go" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Hello! I'm here to help you find the perfect Pixel phone. \n\nTo get started, could you tell me a bit about what you're looking for? Specifically:\n\n1. **What is your maximum budget?**\n2. **What size phone do you prefer?** (e.g., small, large, or doesn't matter)\n3. **What will be your primary use for the phone?** (e.g., photography, gaming, just the basics)\n\nOnce I have those details, I can give you a great recommendation!" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "$1000, gaming" + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-2", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "That sounds like a great budget for a gaming-focused phone! To make sure I get the recommendation just right, **what size phone do you prefer?** (e.g., small, large, or any size)." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-2", + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "large" + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-3", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "budget": 1000, + "preferred_size": "large", + "primary_use": "gaming" + }, + "id": "fc-1", + "name": "phone_recommender" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-3", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10 Pro XL" + }, + "id": "fc-2", + "name": "check_phone_price" + } + }, + { + "functionCall": { + "args": { + "model_name": "Pixel 10 Pro Fold" + }, + "id": "fc-3", + "name": "check_phone_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-7", + "invocationId": "i-3", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "check_phone_price", + "response": { + "result": 799.0 + } + } + }, + { + "functionResponse": { + "id": "fc-3", + "name": "check_phone_price", + "response": { + "result": 799.0 + } + } + } + ], + "role": "user" + }, + "id": "e-8", + "invocationId": "i-3", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10a" + }, + "id": "fc-4", + "name": "check_phone_price" + } + }, + { + "functionCall": { + "args": { + "model_name": "Pixel 10" + }, + "id": "fc-5", + "name": "check_phone_price" + } + }, + { + "functionCall": { + "args": { + "model_name": "Pixel 10 Pro" + }, + "id": "fc-6", + "name": "check_phone_price" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-9", + "invocationId": "i-3", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-4", + "name": "check_phone_price", + "response": { + "result": 499.0 + } + } + }, + { + "functionResponse": { + "id": "fc-5", + "name": "check_phone_price", + "response": { + "result": 799.0 + } + } + }, + { + "functionResponse": { + "id": "fc-6", + "name": "check_phone_price", + "response": { + "result": 799.0 + } + } + } + ], + "role": "user" + }, + "id": "e-10", + "invocationId": "i-3", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "model_name": "Pixel 10 Pro XL", + "price": 799, + "reason": "The Pixel 10 Pro XL fits your budget of $1000 and matches your preference for a large screen, which is ideal for gaming. At $799, it offers the best balance of performance and display size within your requirements." + }, + "id": "fc-7", + "name": "set_model_response" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-11", + "invocationId": "i-3", + "longRunningToolIds": [], + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "actions": { + "setModelResponse": { + "model_name": "Pixel 10 Pro XL", + "price": 799.0, + "reason": "The Pixel 10 Pro XL fits your budget of $1000 and matches your preference for a large screen, which is ideal for gaming. At $799, it offers the best balance of performance and display size within your requirements." + } + }, + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-7", + "name": "set_model_response", + "response": { + "model_name": "Pixel 10 Pro XL", + "price": 799.0, + "reason": "The Pixel 10 Pro XL fits your budget of $1000 and matches your preference for a large screen, which is ideal for gaming. At $799, it offers the best balance of performance and display size within your requirements." + } + } + } + ], + "role": "user" + }, + "id": "e-12", + "invocationId": "i-3", + "nodeInfo": { + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "phone_recommender", + "branch": "phone_recommender@1", + "content": { + "parts": [ + { + "text": "{\"model_name\": \"Pixel 10 Pro XL\", \"price\": 799.0, \"reason\": \"The Pixel 10 Pro XL fits your budget of $1000 and matches your preference for a large screen, which is ideal for gaming. At $799, it offers the best balance of performance and display size within your requirements.\"}" + } + ], + "role": "model" + }, + "id": "e-13", + "invocationId": "i-3", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/phone_recommender@1" + ], + "path": "root_agent@1/phone_recommender@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "phone_recommender", + "response": { + "model_name": "Pixel 10 Pro XL", + "price": 799.0, + "reason": "The Pixel 10 Pro XL fits your budget of $1000 and matches your preference for a large screen, which is ideal for gaming. At $799, it offers the best balance of performance and display size within your requirements." + } + } + } + ], + "role": "user" + }, + "id": "e-14", + "invocationId": "i-3", + "nodeInfo": { + "path": "root_agent@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Based on what you're looking for, I highly recommend the **Pixel 10 Pro XL**.\n\n* **Model:** Pixel 10 Pro XL\n* **Price:** $799\n* **Why it's perfect for you:** It fits perfectly within your $1000 budget and features the large display you prefer, which is fantastic for an immersive gaming experience. It offers a great balance of top-tier performance and screen real estate!\n\nHow does that sound to you?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-15", + "invocationId": "i-3", + "nodeInfo": { + "path": "root_agent@1" + } + } + ] +} diff --git a/contributing/samples/multi_agent/sub_agents/README.md b/contributing/samples/multi_agent/sub_agents/README.md new file mode 100644 index 0000000000..31767a3232 --- /dev/null +++ b/contributing/samples/multi_agent/sub_agents/README.md @@ -0,0 +1,72 @@ +# ADK Agent Sub-Agents Sample + +## Overview + +This sample demonstrates how to create a hierarchical agent setup using sub-agents in the **ADK** framework, and also showcases how to use tool confirmation. + +It defines a root `Agent` named `sub_agents` that coordinates two sub-agents: `info_agent` and `close_agent`. + +- `info_agent` is equipped with a tool to check account status. +- `close_agent` is equipped with a tool to close accounts, which requires user confirmation before execution. + +The root agent delegates tasks to these sub-agents based on the user's prompt. This sample illustrates how to modularize capabilities into separate agents instead of combining all tools on a single agent. + +## Sample Inputs + +- `Check the status of account ACC-123.` + +- `Close account ACC-123.` + +- `Check if account ACC-123 is active, and if so, close it.` + +## Graph + +```mermaid +graph TD + sub_agents[Agent: sub_agents] --> info_agent[Agent: info_agent] + sub_agents --> close_agent[Agent: close_agent] + info_agent --> get_account_status[Tool: get_account_status] + close_agent --> close_account[Tool: close_account
        requires confirmation] +``` + +## How To + +1. Define the specific tools for each sub-agent: + + ```python + def get_account_status(account_id: str) -> str: + """Gets the status of a bank account.""" + return f"Account {account_id} is active." + + def close_account(account_id: str) -> str: + """Closes a bank account.""" + return f"Account {account_id} has been closed." + ``` + +1. Register tools to their respective sub-agents, using `FunctionTool` for confirmation: + + ```python + from google.adk.agents import Agent + from google.adk.tools.function_tool import FunctionTool + + info_agent = Agent( + name="info_agent", + description="An agent that can check account status.", + tools=[get_account_status], + ) + + close_agent = Agent( + name="close_agent", + description="An agent that can close accounts.", + tools=[FunctionTool(func=close_account, require_confirmation=True)], + ) + ``` + +1. Add the sub-agents to the root agent's `sub_agents` list: + + ```python + root_agent = Agent( + name="sub_agents", + sub_agents=[info_agent, close_agent], + ) + ``` diff --git a/contributing/samples/quickstart/__init__.py b/contributing/samples/multi_agent/sub_agents/__init__.py similarity index 100% rename from contributing/samples/quickstart/__init__.py rename to contributing/samples/multi_agent/sub_agents/__init__.py diff --git a/contributing/samples/multi_agent/sub_agents/agent.py b/contributing/samples/multi_agent/sub_agents/agent.py new file mode 100644 index 0000000000..5bec705773 --- /dev/null +++ b/contributing/samples/multi_agent/sub_agents/agent.py @@ -0,0 +1,64 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.agents import Agent +from google.adk.tools.function_tool import FunctionTool + + +def get_account_status(account_id: str) -> str: + """Gets the status of a bank account. + + Args: + account_id: The account ID to check. + + Returns: + The status of the account. + """ + return f"Account {account_id} is active." + + +def close_account(account_id: str) -> str: + """Closes a bank account. This action requires user confirmation. + + Args: + account_id: The account ID to close. + + Returns: + A confirmation message. + """ + return f"Account {account_id} has been closed." + + +info_agent = Agent( + name="info_agent", + description="An agent that can check account status.", + tools=[get_account_status], +) + +close_agent = Agent( + name="close_agent", + description="An agent that can close accounts.", + tools=[FunctionTool(func=close_account, require_confirmation=True)], +) + +root_agent = Agent( + name="sub_agents", + description=( + "A root agent that can check accounts and close them by delegating to" + " sub-agents." + ), + sub_agents=[info_agent, close_agent], +) diff --git a/contributing/samples/multi_agent/sub_agents/tests/check_and_close.json b/contributing/samples/multi_agent/sub_agents/tests/check_and_close.json new file mode 100644 index 0000000000..5bd623ebe6 --- /dev/null +++ b/contributing/samples/multi_agent/sub_agents/tests/check_and_close.json @@ -0,0 +1,315 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Check if account ACC-123 is active, and if so, close it." + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "sub_agents", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "agent_name": "info_agent" + }, + "id": "fc-1", + "name": "transfer_to_agent" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "sub_agents@1" + } + }, + { + "actions": { + "transferToAgent": "info_agent" + }, + "author": "sub_agents", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "transfer_to_agent", + "response": { + "result": null + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "sub_agents@1" + } + }, + { + "author": "info_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "account_id": "ACC-123" + }, + "id": "fc-2", + "name": "get_account_status" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "sub_agents@1/info_agent@1" + } + }, + { + "author": "info_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "get_account_status", + "response": { + "result": "Account ACC-123 is active." + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "sub_agents@1/info_agent@1" + } + }, + { + "author": "info_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "agent_name": "close_agent" + }, + "id": "fc-3", + "name": "transfer_to_agent" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "sub_agents@1/info_agent@1" + } + }, + { + "actions": { + "transferToAgent": "close_agent" + }, + "author": "info_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-3", + "name": "transfer_to_agent", + "response": { + "result": null + } + } + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "sub_agents@1/info_agent@1" + } + }, + { + "author": "close_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "account_id": "ACC-123" + }, + "id": "fc-4", + "name": "close_account" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-8", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "sub_agents@1/close_agent@1" + } + }, + { + "author": "close_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "originalFunctionCall": { + "args": { + "account_id": "ACC-123" + }, + "id": "fc-4", + "name": "close_account" + }, + "toolConfirmation": { + "confirmed": false, + "hint": "Please approve or reject the tool call close_account() by responding with a FunctionResponse with an expected ToolConfirmation payload." + } + }, + "id": "fc-5", + "name": "adk_request_confirmation" + } + } + ], + "role": "user" + }, + "id": "e-9", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-5" + ], + "nodeInfo": { + "path": "sub_agents@1/close_agent@1" + } + }, + { + "actions": { + "requestedToolConfirmations": { + "fc-4": { + "confirmed": false, + "hint": "Please approve or reject the tool call close_account() by responding with a FunctionResponse with an expected ToolConfirmation payload." + } + }, + "skipSummarization": true + }, + "author": "close_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-4", + "name": "close_account", + "response": { + "error": "This tool call requires confirmation, please approve or reject." + } + } + } + ], + "role": "user" + }, + "id": "e-10", + "invocationId": "i-1", + "nodeInfo": { + "path": "sub_agents@1/close_agent@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-5", + "name": "adk_request_confirmation", + "response": { + "confirmed": true + } + } + } + ], + "role": "user" + }, + "id": "e-11", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "close_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-4", + "name": "close_account", + "response": { + "result": "Account ACC-123 has been closed." + } + } + } + ], + "role": "user" + }, + "id": "e-12", + "invocationId": "i-1", + "nodeInfo": { + "path": "sub_agents@1/close_agent@1" + } + }, + { + "author": "close_agent", + "content": { + "parts": [ + { + "text": "Account ACC-123 has been closed." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-13", + "invocationId": "i-1", + "nodeInfo": { + "path": "sub_agents@1/close_agent@1" + } + } + ] +} diff --git a/contributing/samples/multi_agent/sub_agents/tests/check_status.json b/contributing/samples/multi_agent/sub_agents/tests/check_status.json new file mode 100644 index 0000000000..e90a8cdf63 --- /dev/null +++ b/contributing/samples/multi_agent/sub_agents/tests/check_status.json @@ -0,0 +1,132 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Check the status of account ACC-123" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "sub_agents", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "agent_name": "info_agent" + }, + "id": "fc-1", + "name": "transfer_to_agent" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "sub_agents@1" + } + }, + { + "actions": { + "transferToAgent": "info_agent" + }, + "author": "sub_agents", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "transfer_to_agent", + "response": { + "result": null + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "sub_agents@1" + } + }, + { + "author": "info_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "account_id": "ACC-123" + }, + "id": "fc-2", + "name": "get_account_status" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "sub_agents@1/info_agent@1" + } + }, + { + "author": "info_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "get_account_status", + "response": { + "result": "Account ACC-123 is active." + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "sub_agents@1/info_agent@1" + } + }, + { + "author": "info_agent", + "content": { + "parts": [ + { + "text": "Account ACC-123 is active." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "sub_agents@1/info_agent@1" + } + } + ] +} diff --git a/contributing/samples/tool_functions_config/__init__.py b/contributing/samples/multi_agent/sub_agents_config/__init__.py similarity index 100% rename from contributing/samples/tool_functions_config/__init__.py rename to contributing/samples/multi_agent/sub_agents_config/__init__.py diff --git a/contributing/samples/sub_agents_config/life_agent.py b/contributing/samples/multi_agent/sub_agents_config/life_agent.py similarity index 100% rename from contributing/samples/sub_agents_config/life_agent.py rename to contributing/samples/multi_agent/sub_agents_config/life_agent.py diff --git a/contributing/samples/sub_agents_config/root_agent.yaml b/contributing/samples/multi_agent/sub_agents_config/root_agent.yaml similarity index 100% rename from contributing/samples/sub_agents_config/root_agent.yaml rename to contributing/samples/multi_agent/sub_agents_config/root_agent.yaml diff --git a/contributing/samples/sub_agents_config/work_agent.yaml b/contributing/samples/multi_agent/sub_agents_config/work_agent.yaml similarity index 100% rename from contributing/samples/sub_agents_config/work_agent.yaml rename to contributing/samples/multi_agent/sub_agents_config/work_agent.yaml diff --git a/contributing/samples/multi_agent/task_sub_agent/README.md b/contributing/samples/multi_agent/task_sub_agent/README.md new file mode 100644 index 0000000000..936d02f844 --- /dev/null +++ b/contributing/samples/multi_agent/task_sub_agent/README.md @@ -0,0 +1,52 @@ +# ADK Task as Sub-agent Sample + +## Overview + +This sample demonstrates how a "task mode" agent can act as a sub-agent to an LLM agent, effectively extracting structured data from a conversational flow. + +The main agent (`coordinator`) delegates interactions to two sub-agents: + +1. `order_collector`: A task agent that collects the user's food order (from a menu of Pizza, Burger, Salad) and returns a structured list of selected items as a `list[OrderItem]`. +1. `payment_collector`: A task agent that collects the user's credit card and CVV information, returning a `PaymentInfo` object. + +Once the tasks are completed, the coordinator automatically uses a `place_order` tool with the structured data returned by both agents. + +## Sample Inputs + +- `I would like to order some food please.` + +- `I want 2 pizzas and 1 salad.` + +- `My credit card is 1234-5678-9012-3456 and my CVV is 123.` + +## Graph + +```mermaid +graph TD + coordinator --> order_collector + coordinator --> payment_collector + coordinator -.->|uses| place_order[place_order tool] +``` + +## How To + +1. Define a sub-agent with `mode="task"` and an output schema: + + ```python + order_collector = Agent( + name="order_collector", + mode="task", + output_schema=list[OrderItem], + ... + ) + ``` + +1. Assign it to a parent agent and use it in the instruction to collect the information: + + ```python + coordinator = Agent( + sub_agents=[order_collector], + instruction="Delegate using `order_collector`...", + ... + ) + ``` diff --git a/contributing/samples/multi_agent/task_sub_agent/agent.py b/contributing/samples/multi_agent/task_sub_agent/agent.py new file mode 100644 index 0000000000..8b3d1d25b0 --- /dev/null +++ b/contributing/samples/multi_agent/task_sub_agent/agent.py @@ -0,0 +1,83 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk import Agent +from google.adk.tools.function_tool import FunctionTool +from pydantic import BaseModel +from pydantic import Field + + +class OrderItem(BaseModel): + name: str = Field(description="Name of the food item ordered") + quantity: int = Field(description="Quantity ordered") + + +class PaymentInfo(BaseModel): + """Output schema for the payment collection task.""" + + credit_card_number: str + cvv: str + + +def place_order(orders: list[OrderItem], payment_info: PaymentInfo) -> str: + """Mock an order placement operation.""" + total_items = sum(item.quantity for item in orders) + return f"Successfully placed order for {total_items} items." + + +def confirmation() -> str: + """Confirm proceeding with the order.""" + return "Proceeding with order." + + +order_collector = Agent( + name="order_collector", + mode="task", + output_schema=list[OrderItem], + instruction=("""\ +You are an order collection assistant for a food delivery service. +Our menu today has exactly 3 items: 1. Pizza, 2. Burger, 3. Salad. +Ask the user what they would like to order and collect their choice and quantity. +Do not offer anything else. +If the combined quantity of items exceeds 5, you MUST use the `confirmation` tool to get user's confirmation before proceeding. +Do not ask for confirmation in natural language, always use the confirmation tool. +Once you have their final order and confirmation if needed, finish your task. + """), + description="Collects the food order from the user.", + tools=[FunctionTool(confirmation, require_confirmation=True)], +) + +payment_collector = Agent( + name="payment_collector", + mode="task", + output_schema=PaymentInfo, + instruction=("""\ +You are a payment collection assistant. +Ask the user for their credit card number and CVV. +Once you have both pieces of information, finish your task. + """), + description="Collects credit card and CVV from the user.", +) + +root_agent = Agent( + name="coordinator", + sub_agents=[order_collector, payment_collector], + tools=[place_order], + instruction="""\ +You are a helpful coordinator for a food delivery service. +You need both order and payment information to place an order. + """, +) diff --git a/contributing/samples/multi_agent/task_sub_agent/tests/10_burgers.json b/contributing/samples/multi_agent/task_sub_agent/tests/10_burgers.json new file mode 100644 index 0000000000..4eb98f4d48 --- /dev/null +++ b/contributing/samples/multi_agent/task_sub_agent/tests/10_burgers.json @@ -0,0 +1,224 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "10 burgers" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "coordinator", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "request": "The user wants 10 burgers. Please confirm the details of the burgers and any other items they might want." + }, + "id": "fc-1", + "name": "order_collector" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "coordinator@1" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "text": "I've noted that you'd like 10 burgers. Would you like to add any pizza or salad to your order?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "isolationScope": "fc-1", + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-3", + "name": "adk_request_confirmation", + "response": { + "confirmed": true, + "payload": {} + } + } + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "", + "nodeInfo": { + "path": "" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "1234-1234" + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-2", + "nodeInfo": { + "path": "" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "text": "I'm sorry, I didn't quite catch that. We offer Pizza, Burgers, and Salads. You've mentioned 10 burgers so far. Would you like to add any pizza or salad to your order, or is that everything?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-2", + "isolationScope": "fc-1", + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "123" + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-3", + "nodeInfo": { + "path": "" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "functionCall": { + "args": {}, + "id": "fc-2", + "name": "confirmation" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-8", + "invocationId": "i-3", + "isolationScope": "fc-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "originalFunctionCall": { + "args": {}, + "id": "fc-2", + "name": "confirmation" + }, + "toolConfirmation": { + "confirmed": false, + "hint": "Please approve or reject the tool call confirmation() by responding with a FunctionResponse with an expected ToolConfirmation payload." + } + }, + "id": "fc-3", + "name": "adk_request_confirmation" + } + } + ], + "role": "user" + }, + "id": "e-9", + "invocationId": "i-3", + "isolationScope": "fc-1", + "longRunningToolIds": [ + "fc-3" + ], + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + }, + { + "actions": { + "requestedToolConfirmations": { + "fc-2": { + "confirmed": false, + "hint": "Please approve or reject the tool call confirmation() by responding with a FunctionResponse with an expected ToolConfirmation payload." + } + }, + "skipSummarization": true + }, + "author": "order_collector", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "confirmation", + "response": { + "error": "This tool call requires confirmation, please approve or reject." + } + } + } + ], + "role": "user" + }, + "id": "e-10", + "invocationId": "i-3", + "isolationScope": "fc-1", + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + } + ] +} diff --git a/contributing/samples/multi_agent/task_sub_agent/tests/3_burgers.json b/contributing/samples/multi_agent/task_sub_agent/tests/3_burgers.json new file mode 100644 index 0000000000..e564a0b73f --- /dev/null +++ b/contributing/samples/multi_agent/task_sub_agent/tests/3_burgers.json @@ -0,0 +1,410 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "3 burgers" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "coordinator", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "request": "The user wants to order 3 burgers. Please confirm if there are any specific types or details they'd like for these burgers." + }, + "id": "fc-1", + "name": "order_collector" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "coordinator@1" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "text": "Hello! We have Pizza, Burgers, and Salads on our menu today. You've chosen 3 Burgers. Would you like to add any Pizza or Salads to your order, or is that all for today?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "isolationScope": "fc-1", + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "ready to pay" + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-2", + "nodeInfo": { + "path": "" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "result": [ + { + "name": "Burger", + "quantity": 3 + } + ] + }, + "id": "fc-2", + "name": "finish_task" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-2", + "isolationScope": "fc-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "finish_task", + "response": { + "result": "Task completed." + } + } + } + ], + "role": "user" + }, + "id": "e-6", + "invocationId": "i-2", + "isolationScope": "fc-1", + "nodeInfo": { + "outputFor": [ + "coordinator@1/order_collector@fc-1" + ], + "path": "coordinator@1/order_collector@fc-1" + }, + "output": [ + { + "name": "Burger", + "quantity": 3 + } + ] + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "order_collector", + "response": { + "output": [ + { + "name": "Burger", + "quantity": 3 + } + ] + } + } + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-2", + "nodeInfo": { + "path": "coordinator@1" + } + }, + { + "author": "coordinator", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "request": "Please collect the user's credit card number and CVV for their order of 3 burgers." + }, + "id": "fc-3", + "name": "payment_collector" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-8", + "invocationId": "i-2", + "longRunningToolIds": [], + "nodeInfo": { + "path": "coordinator@1" + } + }, + { + "author": "payment_collector", + "content": { + "parts": [ + { + "text": "To process your order for 3 burgers, could you please provide your credit card number and the 3-digit CVV code?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-9", + "invocationId": "i-2", + "isolationScope": "fc-3", + "nodeInfo": { + "path": "coordinator@1/payment_collector@fc-3" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "1234-1234" + } + ], + "role": "user" + }, + "id": "e-10", + "invocationId": "i-3", + "nodeInfo": { + "path": "" + } + }, + { + "author": "payment_collector", + "content": { + "parts": [ + { + "text": "Thank you. Could you also provide the 3-digit CVV code for your card?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-11", + "invocationId": "i-3", + "isolationScope": "fc-3", + "nodeInfo": { + "path": "coordinator@1/payment_collector@fc-3" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "123" + } + ], + "role": "user" + }, + "id": "e-12", + "invocationId": "i-4", + "nodeInfo": { + "path": "" + } + }, + { + "author": "payment_collector", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "credit_card_number": "1234-1234", + "cvv": "123" + }, + "id": "fc-4", + "name": "finish_task" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-13", + "invocationId": "i-4", + "isolationScope": "fc-3", + "longRunningToolIds": [], + "nodeInfo": { + "path": "coordinator@1/payment_collector@fc-3" + } + }, + { + "author": "payment_collector", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-4", + "name": "finish_task", + "response": { + "result": "Task completed." + } + } + } + ], + "role": "user" + }, + "id": "e-14", + "invocationId": "i-4", + "isolationScope": "fc-3", + "nodeInfo": { + "outputFor": [ + "coordinator@1/payment_collector@fc-3" + ], + "path": "coordinator@1/payment_collector@fc-3" + }, + "output": { + "credit_card_number": "1234-1234", + "cvv": "123" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-3", + "name": "payment_collector", + "response": { + "credit_card_number": "1234-1234", + "cvv": "123" + } + } + } + ], + "role": "user" + }, + "id": "e-15", + "invocationId": "i-4", + "nodeInfo": { + "path": "coordinator@1" + } + }, + { + "author": "coordinator", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "orders": [ + { + "name": "Burger", + "quantity": 3 + } + ], + "payment_info": { + "credit_card_number": "1234-1234", + "cvv": "123" + } + }, + "id": "fc-5", + "name": "place_order" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-16", + "invocationId": "i-4", + "longRunningToolIds": [], + "nodeInfo": { + "path": "coordinator@1" + } + }, + { + "author": "coordinator", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-5", + "name": "place_order", + "response": { + "result": "Successfully placed order for 3 items." + } + } + } + ], + "role": "user" + }, + "id": "e-17", + "invocationId": "i-4", + "nodeInfo": { + "path": "coordinator@1" + } + }, + { + "author": "coordinator", + "content": { + "parts": [ + { + "text": "Your order for 3 burgers has been successfully placed!" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-18", + "invocationId": "i-4", + "nodeInfo": { + "path": "coordinator@1" + } + } + ] +} diff --git a/contributing/samples/multi_agent/task_sub_agent/tests/3_burgers_and_credit_card.json b/contributing/samples/multi_agent/task_sub_agent/tests/3_burgers_and_credit_card.json new file mode 100644 index 0000000000..1b09556129 --- /dev/null +++ b/contributing/samples/multi_agent/task_sub_agent/tests/3_burgers_and_credit_card.json @@ -0,0 +1,92 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "3 burgers, credit card 1234-1234, cvv 123" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "coordinator", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "orders": [ + { + "name": "burger", + "quantity": 3 + } + ], + "payment_info": { + "credit_card_number": "1234-1234", + "cvv": "123" + } + }, + "id": "fc-1", + "name": "place_order" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "coordinator@1" + } + }, + { + "author": "coordinator", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "place_order", + "response": { + "result": "Successfully placed order for 3 items." + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "coordinator@1" + } + }, + { + "author": "coordinator", + "content": { + "parts": [ + { + "text": "Your order for 3 burgers has been successfully placed." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "coordinator@1" + } + } + ] +} diff --git a/contributing/samples/multi_agent/task_sub_agent/tests/credit_card.json b/contributing/samples/multi_agent/task_sub_agent/tests/credit_card.json new file mode 100644 index 0000000000..40c0d998e8 --- /dev/null +++ b/contributing/samples/multi_agent/task_sub_agent/tests/credit_card.json @@ -0,0 +1,96 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "credit card 1234-1234, cvv 123" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "coordinator", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "request": "The user has provided payment info. Please find out what food they would like to order." + }, + "id": "fc-1", + "name": "order_collector" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "coordinator@1" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "text": "Hello! What would you like to order today? We have Pizza, Burgers, and Salads available. Please let me know your choice and the quantity." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "isolationScope": "fc-1", + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "3 burgers" + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-2", + "nodeInfo": { + "path": "" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "text": "I have added 3 Burgers to your order. Would you like to add any Pizza or Salad, or is that all for today?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-2", + "isolationScope": "fc-1", + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + } + ] +} diff --git a/contributing/samples/multi_agent/task_sub_agent/tests/order_food.json b/contributing/samples/multi_agent/task_sub_agent/tests/order_food.json new file mode 100644 index 0000000000..1763337d6b --- /dev/null +++ b/contributing/samples/multi_agent/task_sub_agent/tests/order_food.json @@ -0,0 +1,198 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "order food" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "coordinator", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "request": "Please help the user order food by collecting the items and quantities they want." + }, + "id": "fc-1", + "name": "order_collector" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "coordinator@1" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "text": "Hello! What would you like to order today? Our menu includes:\n1. Pizza\n2. Burger\n3. Salad\n\nPlease let me know which items and how many of each you'd like." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "isolationScope": "fc-1", + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "burger" + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-2", + "nodeInfo": { + "path": "" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "text": "How many burgers would you like to order?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-2", + "isolationScope": "fc-1", + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "3" + } + ], + "role": "user" + }, + "id": "e-6", + "invocationId": "i-3", + "nodeInfo": { + "path": "" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "text": "Great! You've ordered 3 burgers. Would you like to add anything else to your order (Pizza or Salad), or is that all for today?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-7", + "invocationId": "i-3", + "isolationScope": "fc-1", + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "1234-1234" + } + ], + "role": "user" + }, + "id": "e-8", + "invocationId": "i-4", + "nodeInfo": { + "path": "" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "text": "I'm sorry, I didn't quite understand that. Would you like to add any Pizza or Salad to your order of 3 Burgers, or is that all?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-9", + "invocationId": "i-4", + "isolationScope": "fc-1", + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "text": "123" + } + ], + "role": "user" + }, + "id": "e-10", + "invocationId": "i-5", + "nodeInfo": { + "path": "" + } + }, + { + "author": "order_collector", + "content": { + "parts": [ + { + "text": "I'm sorry, I'm not sure what you mean by \"123\". Would you like to add 123 of one of our menu items (Pizza or Salad) to your order, or would you like to finish your order with just the 3 burgers?" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-11", + "invocationId": "i-5", + "isolationScope": "fc-1", + "nodeInfo": { + "path": "coordinator@1/order_collector@fc-1" + } + } + ] +} diff --git a/contributing/samples/multi_agent/three_layer_transfer/README.md b/contributing/samples/multi_agent/three_layer_transfer/README.md new file mode 100644 index 0000000000..9da5e9f465 --- /dev/null +++ b/contributing/samples/multi_agent/three_layer_transfer/README.md @@ -0,0 +1,29 @@ +# Three Layer Transfer Sample + +## Overview + +This sample demonstrates a three-layer multi-agent system built with the ADK Python toolkit, showcasing structured double-round-trip hierarchical transfers. + +## Sample Inputs + +- `Hello, who are you?` +- `Can you write a short story about a lost kitten?` +- `Please translate it into Spanish.` +- `Looks great! Let's return to the project coordinator.` + +## Graph + +```mermaid +graph TD + root_agent[root_agent] --> writer_agent[writer_agent] + writer_agent --> translator_agent[translator_agent] +``` + +## How To + +This sample demonstrates: + +1. Root delegating to middle-child node `writer_agent`. +1. `writer_agent` delegating to leaf-grandchild node `translator_agent`. +1. Grandchild returning back to the parent `writer_agent`. +1. Parent returning back to the root coordinator `root_agent`. diff --git a/contributing/samples/rag_agent/__init__.py b/contributing/samples/multi_agent/three_layer_transfer/__init__.py similarity index 100% rename from contributing/samples/rag_agent/__init__.py rename to contributing/samples/multi_agent/three_layer_transfer/__init__.py diff --git a/contributing/samples/multi_agent/three_layer_transfer/agent.py b/contributing/samples/multi_agent/three_layer_transfer/agent.py new file mode 100644 index 0000000000..367a56df68 --- /dev/null +++ b/contributing/samples/multi_agent/three_layer_transfer/agent.py @@ -0,0 +1,56 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk.agents.llm_agent import Agent + +# --- Leaf Agent (Grandchild) --- +translator_agent = Agent( + name="translator_agent", + description="Translates text into different languages.", + instruction=""" + You are a translator. Your job is to translate the text provided to you into the requested language. + Once the translation is complete, output the translated text, explain what you did, and then transfer back to the writer_agent. + """, +) + + +# --- Middle Agent (Child) --- +writer_agent = Agent( + name="writer_agent", + description=( + "Writes stories, articles, or essays, and manages translation requests." + ), + instruction=""" + You are a professional writer. + When asked to write something, perform the writing task and present the result to the user. + If the user asks to translate the written content into another language, transfer the task to the translator_agent. + If the user is satisfied and wants to return to the main coordinator, transfer back to the root_agent. + """, + sub_agents=[translator_agent], +) + + +# --- Root Agent (Parent) --- +root_agent = Agent( + name="root_agent", + description=( + "Project coordinator that delegates writing and translation tasks." + ), + instruction=""" + You are a project coordinator. + If the user wants to write a story, essay, or article, transfer the task to the writer_agent. + Answer general inquiries yourself, but delegate writing-related tasks. + """, + sub_agents=[writer_agent], +) diff --git a/contributing/samples/computer_use/README.md b/contributing/samples/multimodal/computer_use/README.md similarity index 100% rename from contributing/samples/computer_use/README.md rename to contributing/samples/multimodal/computer_use/README.md diff --git a/contributing/samples/computer_use/agent.py b/contributing/samples/multimodal/computer_use/agent.py similarity index 100% rename from contributing/samples/computer_use/agent.py rename to contributing/samples/multimodal/computer_use/agent.py diff --git a/contributing/samples/computer_use/playwright.py b/contributing/samples/multimodal/computer_use/playwright.py similarity index 100% rename from contributing/samples/computer_use/playwright.py rename to contributing/samples/multimodal/computer_use/playwright.py diff --git a/contributing/samples/computer_use/requirements.txt b/contributing/samples/multimodal/computer_use/requirements.txt similarity index 100% rename from contributing/samples/computer_use/requirements.txt rename to contributing/samples/multimodal/computer_use/requirements.txt diff --git a/contributing/samples/rewind_session/__init__.py b/contributing/samples/multimodal/generate_image/__init__.py similarity index 100% rename from contributing/samples/rewind_session/__init__.py rename to contributing/samples/multimodal/generate_image/__init__.py diff --git a/contributing/samples/generate_image/agent.py b/contributing/samples/multimodal/generate_image/agent.py similarity index 98% rename from contributing/samples/generate_image/agent.py rename to contributing/samples/multimodal/generate_image/agent.py index b7c53ed7ea..6db6f1ed9f 100644 --- a/contributing/samples/generate_image/agent.py +++ b/contributing/samples/multimodal/generate_image/agent.py @@ -44,7 +44,6 @@ async def generate_image(prompt: str, tool_context: 'ToolContext'): root_agent = Agent( - model='gemini-2.5-flash', name='root_agent', description="""An agent that generates images and answer questions about the images.""", instruction="""You are an agent whose job is to generate or edit an image based on the user's prompt. diff --git a/contributing/samples/generate_image/sample.session.json b/contributing/samples/multimodal/generate_image/sample.session.json similarity index 100% rename from contributing/samples/generate_image/sample.session.json rename to contributing/samples/multimodal/generate_image/sample.session.json diff --git a/contributing/samples/multimodal/multimodal/README.md b/contributing/samples/multimodal/multimodal/README.md new file mode 100644 index 0000000000..a982dc2145 --- /dev/null +++ b/contributing/samples/multimodal/multimodal/README.md @@ -0,0 +1,30 @@ +# Multimodal Agent + +## Overview + +This sample demonstrates a simple standalone agent that supports multimodal input and output. It uses the "nano banana model" (`gemini-2.5-flash-image`) that can understand and generate images directly. + +## Sample Inputs + +- `An image of a banana with the question: "Is this banana ripe?"` + +- `A text prompt: "Generate a picture of a banana split."` + +## Graph + +Since this is a simple standalone agent without tools, the flow is a direct interaction between the user and the agent: + +```mermaid +graph TD + User -->|Sends Image + Text| Agent[Multimodal Agent] + Agent -->|Responds with Image + Text| User +``` + +## How To + +This sample demonstrates: + +1. **Multimodal Input**: The agent can process both text and image parts in the conversation history. +1. **Multimodal Output**: The agent can generate images directly in its response. + +To run this sample, ensure you have the necessary environment variables set for the Gemini client. diff --git a/contributing/samples/sandbox_computer_use/__init__.py b/contributing/samples/multimodal/multimodal/__init__.py similarity index 100% rename from contributing/samples/sandbox_computer_use/__init__.py rename to contributing/samples/multimodal/multimodal/__init__.py diff --git a/contributing/samples/multimodal/multimodal/agent.py b/contributing/samples/multimodal/multimodal/agent.py new file mode 100644 index 0000000000..b45e99ff51 --- /dev/null +++ b/contributing/samples/multimodal/multimodal/agent.py @@ -0,0 +1,20 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk import Agent + +root_agent = Agent( + name='multimodal_agent', + model='gemini-2.5-flash-image', +) diff --git a/contributing/samples/session_state_agent/__init__.py b/contributing/samples/multimodal/multimodal_tool_results/__init__.py similarity index 100% rename from contributing/samples/session_state_agent/__init__.py rename to contributing/samples/multimodal/multimodal_tool_results/__init__.py diff --git a/contributing/samples/multimodal_tool_results/agent.py b/contributing/samples/multimodal/multimodal_tool_results/agent.py similarity index 97% rename from contributing/samples/multimodal_tool_results/agent.py rename to contributing/samples/multimodal/multimodal_tool_results/agent.py index d112eba960..be978ab294 100644 --- a/contributing/samples/multimodal_tool_results/agent.py +++ b/contributing/samples/multimodal/multimodal_tool_results/agent.py @@ -29,7 +29,6 @@ def get_image(): name="image_describing_agent", description="image describing agent", instruction="""Whatever the user says, get the image using the get_image tool, and describe it.""", - model="gemini-2.5-flash", tools=[get_image], ) diff --git a/contributing/samples/static_non_text_content/README.md b/contributing/samples/multimodal/static_non_text_content/README.md similarity index 100% rename from contributing/samples/static_non_text_content/README.md rename to contributing/samples/multimodal/static_non_text_content/README.md diff --git a/contributing/samples/static_non_text_content/__init__.py b/contributing/samples/multimodal/static_non_text_content/__init__.py similarity index 100% rename from contributing/samples/static_non_text_content/__init__.py rename to contributing/samples/multimodal/static_non_text_content/__init__.py diff --git a/contributing/samples/static_non_text_content/agent.py b/contributing/samples/multimodal/static_non_text_content/agent.py similarity index 99% rename from contributing/samples/static_non_text_content/agent.py rename to contributing/samples/multimodal/static_non_text_content/agent.py index e3c69f6fbb..c651690b95 100644 --- a/contributing/samples/static_non_text_content/agent.py +++ b/contributing/samples/multimodal/static_non_text_content/agent.py @@ -212,7 +212,6 @@ def create_static_instruction_with_file_upload(): # Create the root agent with Files API integration root_agent = Agent( - model="gemini-2.5-flash", name="static_non_text_content_demo_agent", description=( "Demonstrates static instructions with non-text content (inline_data" diff --git a/contributing/samples/static_non_text_content/main.py b/contributing/samples/multimodal/static_non_text_content/main.py similarity index 100% rename from contributing/samples/static_non_text_content/main.py rename to contributing/samples/multimodal/static_non_text_content/main.py diff --git a/contributing/samples/context_offloading_with_artifact/README.md b/contributing/samples/patterns/context_offloading_with_artifact/README.md similarity index 100% rename from contributing/samples/context_offloading_with_artifact/README.md rename to contributing/samples/patterns/context_offloading_with_artifact/README.md diff --git a/contributing/samples/simple_sequential_agent/__init__.py b/contributing/samples/patterns/context_offloading_with_artifact/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/simple_sequential_agent/__init__.py rename to contributing/samples/patterns/context_offloading_with_artifact/__init__.py diff --git a/contributing/samples/context_offloading_with_artifact/agent.py b/contributing/samples/patterns/context_offloading_with_artifact/agent.py similarity index 99% rename from contributing/samples/context_offloading_with_artifact/agent.py rename to contributing/samples/patterns/context_offloading_with_artifact/agent.py index 6e62e8f034..b6a301e39d 100755 --- a/contributing/samples/context_offloading_with_artifact/agent.py +++ b/contributing/samples/patterns/context_offloading_with_artifact/agent.py @@ -219,7 +219,6 @@ async def process_llm_request( root_agent = Agent( - model='gemini-2.5-flash', name='context_offloading_with_artifact', description='An assistant for querying large sales reports.', instruction=""" diff --git a/contributing/samples/skills_agent/__init__.py b/contributing/samples/patterns/fields_planner/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/skills_agent/__init__.py rename to contributing/samples/patterns/fields_planner/__init__.py diff --git a/contributing/samples/fields_planner/agent.py b/contributing/samples/patterns/fields_planner/agent.py similarity index 100% rename from contributing/samples/fields_planner/agent.py rename to contributing/samples/patterns/fields_planner/agent.py diff --git a/contributing/samples/fields_planner/main.py b/contributing/samples/patterns/fields_planner/main.py similarity index 100% rename from contributing/samples/fields_planner/main.py rename to contributing/samples/patterns/fields_planner/main.py diff --git a/contributing/samples/json_passing_agent/README.md b/contributing/samples/patterns/json_passing_agent/README.md similarity index 100% rename from contributing/samples/json_passing_agent/README.md rename to contributing/samples/patterns/json_passing_agent/README.md diff --git a/contributing/samples/skills_agent_gcs/__init__.py b/contributing/samples/patterns/json_passing_agent/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/skills_agent_gcs/__init__.py rename to contributing/samples/patterns/json_passing_agent/__init__.py diff --git a/contributing/samples/json_passing_agent/agent.py b/contributing/samples/patterns/json_passing_agent/agent.py similarity index 98% rename from contributing/samples/json_passing_agent/agent.py rename to contributing/samples/patterns/json_passing_agent/agent.py index 7d71ce3a65..a7a5e035b5 100755 --- a/contributing/samples/json_passing_agent/agent.py +++ b/contributing/samples/patterns/json_passing_agent/agent.py @@ -52,7 +52,6 @@ def get_available_toppings() -> list[str]: # conforms to the PizzaOrder model. order_intake_agent = Agent( name='order_intake_agent', - model='gemini-2.5-flash', instruction=( "You are a pizza order intake agent. Your goal is to get the user's" ' pizza order. Use the available tools to find out what sizes, crusts,' @@ -95,7 +94,6 @@ def calculate_price(tool_context: ToolContext) -> str: # the order_intake_agent) and confirms the order with the user. order_confirmation_agent = Agent( name='order_confirmation_agent', - model='gemini-2.5-flash', instruction=( 'Confirm the pizza order with the user. The order is in the state' ' variable `pizza_order`. First, use the `calculate_price` tool to get' diff --git a/contributing/samples/json_passing_agent/main.py b/contributing/samples/patterns/json_passing_agent/main.py similarity index 100% rename from contributing/samples/json_passing_agent/main.py rename to contributing/samples/patterns/json_passing_agent/main.py diff --git a/contributing/samples/workflow_triage/README.md b/contributing/samples/patterns/workflow_triage/README.md similarity index 100% rename from contributing/samples/workflow_triage/README.md rename to contributing/samples/patterns/workflow_triage/README.md diff --git a/contributing/samples/spanner/__init__.py b/contributing/samples/patterns/workflow_triage/__init__.py old mode 100644 new mode 100755 similarity index 100% rename from contributing/samples/spanner/__init__.py rename to contributing/samples/patterns/workflow_triage/__init__.py diff --git a/contributing/samples/workflow_triage/agent.py b/contributing/samples/patterns/workflow_triage/agent.py similarity index 98% rename from contributing/samples/workflow_triage/agent.py rename to contributing/samples/patterns/workflow_triage/agent.py index 9b0cc66943..1627939d32 100755 --- a/contributing/samples/workflow_triage/agent.py +++ b/contributing/samples/patterns/workflow_triage/agent.py @@ -29,7 +29,6 @@ def update_execution_plan( root_agent = Agent( - model="gemini-2.5-flash", name="execution_manager_agent", instruction="""\ You are the Execution Manager Agent, responsible for setting up execution plan and delegate to plan_execution_agent for the actual plan execution. diff --git a/contributing/samples/workflow_triage/execution_agent.py b/contributing/samples/patterns/workflow_triage/execution_agent.py similarity index 97% rename from contributing/samples/workflow_triage/execution_agent.py rename to contributing/samples/patterns/workflow_triage/execution_agent.py index ca97939d56..987b0ec583 100644 --- a/contributing/samples/workflow_triage/execution_agent.py +++ b/contributing/samples/patterns/workflow_triage/execution_agent.py @@ -47,7 +47,6 @@ def callback(callback_context: CallbackContext) -> Optional[types.Content]: code_agent = Agent( - model="gemini-2.5-flash", name="code_agent", instruction="""\ You are the Code Agent, responsible for generating code. @@ -59,7 +58,6 @@ def callback(callback_context: CallbackContext) -> Optional[types.Content]: ) math_agent = Agent( - model="gemini-2.5-flash", name="math_agent", instruction="""\ You are the Math Agent, responsible for performing mathematical calculations. @@ -104,7 +102,6 @@ def instruction_provider_for_execution_summary_agent( execution_summary_agent = Agent( - model="gemini-2.5-flash", name="execution_summary_agent", instruction=instruction_provider_for_execution_summary_agent, include_contents="none", diff --git a/contributing/samples/plugin_basic/README.md b/contributing/samples/plugin/plugin_basic/README.md similarity index 100% rename from contributing/samples/plugin_basic/README.md rename to contributing/samples/plugin/plugin_basic/README.md diff --git a/contributing/samples/plugin_basic/__init__.py b/contributing/samples/plugin/plugin_basic/__init__.py similarity index 100% rename from contributing/samples/plugin_basic/__init__.py rename to contributing/samples/plugin/plugin_basic/__init__.py diff --git a/contributing/samples/plugin_basic/count_plugin.py b/contributing/samples/plugin/plugin_basic/count_plugin.py similarity index 100% rename from contributing/samples/plugin_basic/count_plugin.py rename to contributing/samples/plugin/plugin_basic/count_plugin.py diff --git a/contributing/samples/plugin_basic/main.py b/contributing/samples/plugin/plugin_basic/main.py similarity index 98% rename from contributing/samples/plugin_basic/main.py rename to contributing/samples/plugin/plugin_basic/main.py index e0d97bd1b5..5cb81fba40 100644 --- a/contributing/samples/plugin_basic/main.py +++ b/contributing/samples/plugin/plugin_basic/main.py @@ -28,7 +28,6 @@ async def hello_world(tool_context: ToolContext, query: str): root_agent = Agent( - model='gemini-2.5-flash', name='hello_world', description='Prints hello world with user query.', instruction="""Use hello_world tool to print hello world and user query. diff --git a/contributing/samples/spanner_admin/__init__.py b/contributing/samples/plugin/plugin_debug_logging/__init__.py similarity index 100% rename from contributing/samples/spanner_admin/__init__.py rename to contributing/samples/plugin/plugin_debug_logging/__init__.py diff --git a/contributing/samples/plugin_debug_logging/agent.py b/contributing/samples/plugin/plugin_debug_logging/agent.py similarity index 99% rename from contributing/samples/plugin_debug_logging/agent.py rename to contributing/samples/plugin/plugin_debug_logging/agent.py index 7b6f0bee8b..91e4eadcd1 100644 --- a/contributing/samples/plugin_debug_logging/agent.py +++ b/contributing/samples/plugin/plugin_debug_logging/agent.py @@ -99,7 +99,6 @@ def calculate(expression: str) -> dict[str, Any]: When asked about weather, use the get_weather tool. When asked to calculate, use the calculate tool. Be concise in your responses.""", - model="gemini-2.5-flash", tools=[get_weather, calculate], ) diff --git a/contributing/samples/plugin_reflect_tool_retry/README.md b/contributing/samples/plugin/plugin_reflect_tool_retry/README.md similarity index 100% rename from contributing/samples/plugin_reflect_tool_retry/README.md rename to contributing/samples/plugin/plugin_reflect_tool_retry/README.md diff --git a/contributing/samples/spanner_rag_agent/__init__.py b/contributing/samples/plugin/plugin_reflect_tool_retry/basic/__init__.py similarity index 100% rename from contributing/samples/spanner_rag_agent/__init__.py rename to contributing/samples/plugin/plugin_reflect_tool_retry/basic/__init__.py diff --git a/contributing/samples/plugin_reflect_tool_retry/basic/agent.py b/contributing/samples/plugin/plugin_reflect_tool_retry/basic/agent.py similarity index 98% rename from contributing/samples/plugin_reflect_tool_retry/basic/agent.py rename to contributing/samples/plugin/plugin_reflect_tool_retry/basic/agent.py index 6604c07142..24962d34b4 100644 --- a/contributing/samples/plugin_reflect_tool_retry/basic/agent.py +++ b/contributing/samples/plugin/plugin_reflect_tool_retry/basic/agent.py @@ -67,7 +67,6 @@ async def extract_error_from_result( 'status: success'. Start by guessing 50, and use the tool's feedback to adjust your guesses and find the target number.""", - model="gemini-2.5-flash", tools=[guess_number_tool], ) diff --git a/contributing/samples/token_usage/__init__.py b/contributing/samples/plugin/plugin_reflect_tool_retry/hallucinating_func_name/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/token_usage/__init__.py rename to contributing/samples/plugin/plugin_reflect_tool_retry/hallucinating_func_name/__init__.py diff --git a/contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/agent.py b/contributing/samples/plugin/plugin_reflect_tool_retry/hallucinating_func_name/agent.py similarity index 98% rename from contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/agent.py rename to contributing/samples/plugin/plugin_reflect_tool_retry/hallucinating_func_name/agent.py index d42acad770..61ca95a84f 100644 --- a/contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/agent.py +++ b/contributing/samples/plugin/plugin_reflect_tool_retry/hallucinating_func_name/agent.py @@ -68,7 +68,6 @@ def after_model_callback( name="hello_world", description="Helpful agent", instruction="""Use guess_number_tool to guess a number.""", - model="gemini-2.5-flash", tools=[roll_die], after_model_callback=after_model_callback, ) diff --git a/contributing/samples/session_state_agent/input.json b/contributing/samples/session_state_agent/input.json deleted file mode 100644 index 6f76f166b1..0000000000 --- a/contributing/samples/session_state_agent/input.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "state": {}, - "queries": ["hello world!"] -} diff --git a/contributing/samples/skills_agent/skills/weather-skill/references/weather_info.md b/contributing/samples/skills_agent/skills/weather-skill/references/weather_info.md deleted file mode 100644 index ebe6b63315..0000000000 --- a/contributing/samples/skills_agent/skills/weather-skill/references/weather_info.md +++ /dev/null @@ -1,6 +0,0 @@ -# Weather Information - -- **Location:** San Francisco, CA -- **Condition:** Sunny ☀️ -- **Temperature:** 72°F (22°C) -- **Forecast:** Clear skies all day. diff --git a/contributing/samples/telemetry/agent.py b/contributing/samples/telemetry/agent.py deleted file mode 100755 index a9f1c47a98..0000000000 --- a/contributing/samples/telemetry/agent.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import random - -from google.adk import Agent -from google.adk.planners.built_in_planner import BuiltInPlanner -from google.adk.planners.plan_re_act_planner import PlanReActPlanner -from google.adk.tools.tool_context import ToolContext -from google.genai import types - - -def roll_die(sides: int, tool_context: ToolContext) -> int: - """Roll a die and return the rolled result. - - Args: - sides: The integer number of sides the die has. - - Returns: - An integer of the result of rolling the die. - """ - result = random.randint(1, sides) - if not 'rolls' in tool_context.state: - tool_context.state['rolls'] = [] - - tool_context.state['rolls'] = tool_context.state['rolls'] + [result] - return result - - -async def check_prime(nums: list[int]) -> str: - """Check if a given list of numbers are prime. - - Args: - nums: The list of numbers to check. - - Returns: - A str indicating which number is prime. - """ - primes = set() - for number in nums: - number = int(number) - if number <= 1: - continue - is_prime = True - for i in range(2, int(number**0.5) + 1): - if number % i == 0: - is_prime = False - break - if is_prime: - primes.add(number) - return ( - 'No prime numbers found.' - if not primes - else f"{', '.join(str(num) for num in primes)} are prime numbers." - ) - - -root_agent = Agent( - model='gemini-2.5-flash', - name='data_processing_agent', - description=( - 'hello world agent that can roll a dice of 8 sides and check prime' - ' numbers.' - ), - instruction=""" - You roll dice and answer questions about the outcome of the dice rolls. - You can roll dice of different sizes. - You can use multiple tools in parallel by calling functions in parallel(in one request and in one round). - It is ok to discuss previous dice roles, and comment on the dice rolls. - When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string. - You should never roll a die on your own. - When checking prime numbers, call the check_prime tool with a list of integers. Be sure to pass in a list of integers. You should never pass in a string. - You should not check prime numbers before calling the tool. - When you are asked to roll a die and check prime numbers, you should always make the following two function calls: - 1. You should first call the roll_die tool to get a roll. Wait for the function response before calling the check_prime tool. - 2. After you get the function response from roll_die tool, you should call the check_prime tool with the roll_die result. - 2.1 If user asks you to check primes based on previous rolls, make sure you include the previous rolls in the list. - 3. When you respond, you must include the roll_die result from step 1. - You should always perform the previous 3 steps when asking for a roll and checking prime numbers. - You should not rely on the previous history on prime results. - """, - tools=[ - roll_die, - check_prime, - ], - # planner=BuiltInPlanner( - # thinking_config=types.ThinkingConfig( - # include_thoughts=True, - # ), - # ), - generate_content_config=types.GenerateContentConfig( - safety_settings=[ - types.SafetySetting( # avoid false alarm about rolling dice. - category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, - threshold=types.HarmBlockThreshold.OFF, - ), - ] - ), -) diff --git a/contributing/samples/telemetry/main.py b/contributing/samples/telemetry/main.py deleted file mode 100755 index 885dc6489f..0000000000 --- a/contributing/samples/telemetry/main.py +++ /dev/null @@ -1,118 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import asyncio -from contextlib import aclosing -import os -import time - -import agent -from dotenv import load_dotenv -from google.adk.agents.run_config import RunConfig -from google.adk.runners import InMemoryRunner -from google.adk.sessions.session import Session -from google.genai import types -from opentelemetry import trace -from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter -from opentelemetry.sdk.trace import export -from opentelemetry.sdk.trace import TracerProvider - -load_dotenv(override=True) - - -async def main(): - app_name = 'my_app' - user_id_1 = 'user1' - runner = InMemoryRunner( - agent=agent.root_agent, - app_name=app_name, - ) - session_11 = await runner.session_service.create_session( - app_name=app_name, user_id=user_id_1 - ) - - async def run_prompt(session: Session, new_message: str): - content = types.Content( - role='user', parts=[types.Part.from_text(text=new_message)] - ) - print('** User says:', content.model_dump(exclude_none=True)) - async with aclosing( - runner.run_async( - user_id=user_id_1, - session_id=session.id, - new_message=content, - ) - ) as agen: - async for event in agen: - if event.content.parts and event.content.parts[0].text: - print(f'** {event.author}: {event.content.parts[0].text}') - - async def run_prompt_bytes(session: Session, new_message: str): - content = types.Content( - role='user', - parts=[ - types.Part.from_bytes( - data=str.encode(new_message), mime_type='text/plain' - ) - ], - ) - print('** User says:', content.model_dump(exclude_none=True)) - async with aclosing( - runner.run_async( - user_id=user_id_1, - session_id=session.id, - new_message=content, - run_config=RunConfig(save_input_blobs_as_artifacts=True), - ) - ) as agen: - async for event in agen: - if event.content.parts and event.content.parts[0].text: - print(f'** {event.author}: {event.content.parts[0].text}') - - start_time = time.time() - print('Start time:', start_time) - print('------------------------------------') - await run_prompt(session_11, 'Hi') - await run_prompt(session_11, 'Roll a die with 100 sides') - await run_prompt(session_11, 'Roll a die again with 100 sides.') - await run_prompt(session_11, 'What numbers did I got?') - await run_prompt_bytes(session_11, 'Hi bytes') - print( - await runner.artifact_service.list_artifact_keys( - app_name=app_name, user_id=user_id_1, session_id=session_11.id - ) - ) - end_time = time.time() - print('------------------------------------') - print('End time:', end_time) - print('Total time:', end_time - start_time) - - -if __name__ == '__main__': - - provider = TracerProvider() - project_id = os.environ.get('GOOGLE_CLOUD_PROJECT') - if not project_id: - raise ValueError('GOOGLE_CLOUD_PROJECT environment variable is not set.') - print('Tracing to project', project_id) - processor = export.BatchSpanProcessor( - CloudTraceSpanExporter(project_id=project_id) - ) - provider.add_span_processor(processor) - trace.set_tracer_provider(provider) - - asyncio.run(main()) - - provider.force_flush() - print('Done tracing to project', project_id) diff --git a/contributing/samples/token_usage/agent.py b/contributing/samples/token_usage/agent.py deleted file mode 100755 index 0964147e4b..0000000000 --- a/contributing/samples/token_usage/agent.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import random - -from google.adk import Agent -from google.adk.agents.llm_agent import LlmAgent -from google.adk.agents.sequential_agent import SequentialAgent -from google.adk.models.anthropic_llm import Claude -from google.adk.models.lite_llm import LiteLlm -from google.adk.planners.built_in_planner import BuiltInPlanner -from google.adk.planners.plan_re_act_planner import PlanReActPlanner -from google.adk.tools.tool_context import ToolContext -from google.genai import types - - -def roll_die(sides: int, tool_context: ToolContext) -> int: - """Roll a die and return the rolled result. - - Args: - sides: The integer number of sides the die has. - - Returns: - An integer of the result of rolling the die. - """ - result = random.randint(1, sides) - if 'rolls' not in tool_context.state: - tool_context.state['rolls'] = [] - - tool_context.state['rolls'] = tool_context.state['rolls'] + [result] - return result - - -roll_agent_with_openai = LlmAgent( - model=LiteLlm(model='openai/gpt-4o'), - description='Handles rolling dice of different sizes.', - name='roll_agent_with_openai', - instruction=""" - You are responsible for rolling dice based on the user's request. - When asked to roll a die, you must call the roll_die tool with the number of sides as an integer. - """, - tools=[roll_die], -) - -roll_agent_with_claude = LlmAgent( - model=Claude(model='claude-3-7-sonnet@20250219'), - description='Handles rolling dice of different sizes.', - name='roll_agent_with_claude', - instruction=""" - You are responsible for rolling dice based on the user's request. - When asked to roll a die, you must call the roll_die tool with the number of sides as an integer. - """, - tools=[roll_die], -) - -roll_agent_with_litellm_claude = LlmAgent( - model=LiteLlm(model='vertex_ai/claude-3-7-sonnet'), - description='Handles rolling dice of different sizes.', - name='roll_agent_with_litellm_claude', - instruction=""" - You are responsible for rolling dice based on the user's request. - When asked to roll a die, you must call the roll_die tool with the number of sides as an integer. - """, - tools=[roll_die], -) - -roll_agent_with_gemini = LlmAgent( - model='gemini-2.5-flash', - description='Handles rolling dice of different sizes.', - name='roll_agent_with_gemini', - instruction=""" - You are responsible for rolling dice based on the user's request. - When asked to roll a die, you must call the roll_die tool with the number of sides as an integer. - """, - tools=[roll_die], -) - -root_agent = SequentialAgent( - name='code_pipeline_agent', - sub_agents=[ - roll_agent_with_openai, - roll_agent_with_claude, - roll_agent_with_litellm_claude, - roll_agent_with_gemini, - ], -) diff --git a/contributing/samples/token_usage/main.py b/contributing/samples/token_usage/main.py deleted file mode 100755 index b8a3164f13..0000000000 --- a/contributing/samples/token_usage/main.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import asyncio -import time -import warnings - -import agent -from dotenv import load_dotenv -from google.adk import Runner -from google.adk.agents.run_config import RunConfig -from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService -from google.adk.cli.utils import logs -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.sessions.session import Session -from google.genai import types - -load_dotenv(override=True) -warnings.filterwarnings('ignore', category=UserWarning) -logs.log_to_tmp_folder() - - -async def main(): - app_name = 'my_app' - user_id_1 = 'user1' - session_service = InMemorySessionService() - artifact_service = InMemoryArtifactService() - runner = Runner( - app_name=app_name, - agent=agent.root_agent, - artifact_service=artifact_service, - session_service=session_service, - ) - session_11 = await session_service.create_session( - app_name=app_name, user_id=user_id_1 - ) - - total_prompt_tokens = 0 - total_candidate_tokens = 0 - total_tokens = 0 - - async def run_prompt(session: Session, new_message: str): - nonlocal total_prompt_tokens - nonlocal total_candidate_tokens - nonlocal total_tokens - content = types.Content( - role='user', parts=[types.Part.from_text(text=new_message)] - ) - print('** User says:', content.model_dump(exclude_none=True)) - async for event in runner.run_async( - user_id=user_id_1, - session_id=session.id, - new_message=content, - ): - if event.content.parts and event.content.parts[0].text: - print(f'** {event.author}: {event.content.parts[0].text}') - if event.usage_metadata: - total_prompt_tokens += event.usage_metadata.prompt_token_count or 0 - total_candidate_tokens += ( - event.usage_metadata.candidates_token_count or 0 - ) - total_tokens += event.usage_metadata.total_token_count or 0 - print( - f'Turn tokens: {event.usage_metadata.total_token_count}' - f' (prompt={event.usage_metadata.prompt_token_count},' - f' candidates={event.usage_metadata.candidates_token_count})' - ) - - print( - f'Session tokens: {total_tokens} (prompt={total_prompt_tokens},' - f' candidates={total_candidate_tokens})' - ) - - start_time = time.time() - print('Start time:', start_time) - print('------------------------------------') - await run_prompt(session_11, 'Hi') - await run_prompt(session_11, 'Roll a die with 100 sides') - print( - await artifact_service.list_artifact_keys( - app_name=app_name, user_id=user_id_1, session_id=session_11.id - ) - ) - end_time = time.time() - print('------------------------------------') - print('End time:', end_time) - print('Total time:', end_time - start_time) - - -if __name__ == '__main__': - asyncio.run(main()) diff --git a/contributing/samples/toolbox_agent/__init__.py b/contributing/samples/tools/agent_tool_with_grounding_metadata/__init__.py similarity index 100% rename from contributing/samples/toolbox_agent/__init__.py rename to contributing/samples/tools/agent_tool_with_grounding_metadata/__init__.py diff --git a/contributing/samples/agent_tool_with_grounding_metadata/agent.py b/contributing/samples/tools/agent_tool_with_grounding_metadata/agent.py similarity index 100% rename from contributing/samples/agent_tool_with_grounding_metadata/agent.py rename to contributing/samples/tools/agent_tool_with_grounding_metadata/agent.py diff --git a/contributing/samples/built_in_multi_tools/README.md b/contributing/samples/tools/built_in_multi_tools/README.md similarity index 100% rename from contributing/samples/built_in_multi_tools/README.md rename to contributing/samples/tools/built_in_multi_tools/README.md diff --git a/contributing/samples/vertex_code_execution/__init__.py b/contributing/samples/tools/built_in_multi_tools/__init__.py similarity index 100% rename from contributing/samples/vertex_code_execution/__init__.py rename to contributing/samples/tools/built_in_multi_tools/__init__.py diff --git a/contributing/samples/built_in_multi_tools/agent.py b/contributing/samples/tools/built_in_multi_tools/agent.py similarity index 100% rename from contributing/samples/built_in_multi_tools/agent.py rename to contributing/samples/tools/built_in_multi_tools/agent.py diff --git a/contributing/samples/tools/function_tools/README.md b/contributing/samples/tools/function_tools/README.md new file mode 100644 index 0000000000..1331cf0577 --- /dev/null +++ b/contributing/samples/tools/function_tools/README.md @@ -0,0 +1,52 @@ +# ADK Agent Function Tools Sample + +## Overview + +This sample demonstrates how to create an agent equipped with built-in Python function tools using the **ADK** framework. + +It defines an `Agent` wrapped around two utility functions: `generate_random_number` and `is_even`. The LLM can automatically invoke these underlying Python functions based on user prompts. This sample shows how simple it is to turn raw python methods into actionable capabilities for your agents. + +## Sample Inputs + +- `Give me a random number.` + +- `Give me a random number up to 50, and tell me if it's even.` + +- `Give me a random number and is 44 even?` + + *This will cause parallel tools being called in a single step* + +## Graph + +```mermaid +graph TD + Agent[Agent: function_tools] --> Tool1[Tool: generate_random_number] + Agent --> Tool2[Tool: is_even] +``` + +## How To + +1. Define standard Python functions with type hints and precise docstrings: + + ```python + import random + + def generate_random_number(max_value: int = 100) -> int: + """Generates a random integer between 0 and max_value (inclusive). ...""" + return random.randint(0, max_value) + + def is_even(number: int) -> bool: + """Checks if a given number is even. ...""" + return number % 2 == 0 + ``` + +1. Register the functions directly to the agent's `tools` list during instantiation: + + ```python + from google.adk.agents import Agent + + root_agent = Agent( + name="function_tools", + tools=[generate_random_number, is_even], + ) + ``` diff --git a/contributing/samples/workflow_agent_seq/__init__.py b/contributing/samples/tools/function_tools/__init__.py similarity index 100% rename from contributing/samples/workflow_agent_seq/__init__.py rename to contributing/samples/tools/function_tools/__init__.py diff --git a/contributing/samples/tools/function_tools/agent.py b/contributing/samples/tools/function_tools/agent.py new file mode 100644 index 0000000000..5d0f3aaf38 --- /dev/null +++ b/contributing/samples/tools/function_tools/agent.py @@ -0,0 +1,58 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os +import random + +from google.adk.agents import Agent + +_counter = 0 + + +def generate_random_number(max_value: int = 100) -> int: + """Generates a random integer between 0 and max_value (inclusive). + + Args: + max_value: The upper limit for the random number. + + Returns: + A random integer between 0 and max_value. + """ + # Return a growing value in tests to ensure determinism while allowing + # multiple calls. + if "PYTEST_CURRENT_TEST" in os.environ: + global _counter + _counter += 1 + return _counter + return random.randint(0, max_value) + + +def is_even(number: int) -> bool: + """Checks if a given number is even. + + Args: + number: The number to check. + + Returns: + True if the number is even, False otherwise. + """ + return number % 2 == 0 + + +root_agent = Agent( + name="function_tools", + tools=[generate_random_number, is_even], +) diff --git a/contributing/samples/tools/function_tools/tests/a_random_number.json b/contributing/samples/tools/function_tools/tests/a_random_number.json new file mode 100644 index 0000000000..d1f3935782 --- /dev/null +++ b/contributing/samples/tools/function_tools/tests/a_random_number.json @@ -0,0 +1,81 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "a random number" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "function_tools", + "content": { + "parts": [ + { + "functionCall": { + "args": {}, + "id": "fc-1", + "name": "generate_random_number" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "function_tools@1" + } + }, + { + "author": "function_tools", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "generate_random_number", + "response": { + "result": 1 + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "function_tools@1" + } + }, + { + "author": "function_tools", + "content": { + "parts": [ + { + "text": "Here is a random number: 1\n" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "function_tools@1" + } + } + ] +} diff --git a/contributing/samples/tools/function_tools/tests/a_random_number_and_check_even.json b/contributing/samples/tools/function_tools/tests/a_random_number_and_check_even.json new file mode 100644 index 0000000000..0fb091c8c2 --- /dev/null +++ b/contributing/samples/tools/function_tools/tests/a_random_number_and_check_even.json @@ -0,0 +1,127 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "a random number and check even" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "function_tools", + "content": { + "parts": [ + { + "functionCall": { + "args": {}, + "id": "fc-1", + "name": "generate_random_number" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "function_tools@1" + } + }, + { + "author": "function_tools", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "generate_random_number", + "response": { + "result": 1 + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "function_tools@1" + } + }, + { + "author": "function_tools", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "number": 1 + }, + "id": "fc-2", + "name": "is_even" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "function_tools@1" + } + }, + { + "author": "function_tools", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "is_even", + "response": { + "result": false + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "function_tools@1" + } + }, + { + "author": "function_tools", + "content": { + "parts": [ + { + "text": "The random number is 1. It is not an even number." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "function_tools@1" + } + } + ] +} diff --git a/contributing/samples/tools/function_tools/tests/random_number_and_is_5_even.json b/contributing/samples/tools/function_tools/tests/random_number_and_is_5_even.json new file mode 100644 index 0000000000..856530af68 --- /dev/null +++ b/contributing/samples/tools/function_tools/tests/random_number_and_is_5_even.json @@ -0,0 +1,99 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "random number and is 5 even?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "function_tools", + "content": { + "parts": [ + { + "functionCall": { + "args": {}, + "id": "fc-1", + "name": "generate_random_number" + } + }, + { + "functionCall": { + "args": { + "number": 5 + }, + "id": "fc-2", + "name": "is_even" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "function_tools@1" + } + }, + { + "author": "function_tools", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "generate_random_number", + "response": { + "result": 1 + } + } + }, + { + "functionResponse": { + "id": "fc-2", + "name": "is_even", + "response": { + "result": false + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "function_tools@1" + } + }, + { + "author": "function_tools", + "content": { + "parts": [ + { + "text": "A random number is 1, and no, 5 is not an even number." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "function_tools@1" + } + } + ] +} diff --git a/contributing/samples/workflow_triage/__init__.py b/contributing/samples/tools/hello_world_stream_fc_args/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/workflow_triage/__init__.py rename to contributing/samples/tools/hello_world_stream_fc_args/__init__.py diff --git a/contributing/samples/hello_world_stream_fc_args/agent.py b/contributing/samples/tools/hello_world_stream_fc_args/agent.py old mode 100755 new mode 100644 similarity index 100% rename from contributing/samples/hello_world_stream_fc_args/agent.py rename to contributing/samples/tools/hello_world_stream_fc_args/agent.py diff --git a/contributing/samples/tools/long_running_functions/README.md b/contributing/samples/tools/long_running_functions/README.md new file mode 100644 index 0000000000..e7c1236ada --- /dev/null +++ b/contributing/samples/tools/long_running_functions/README.md @@ -0,0 +1,60 @@ +# Long Running Functions + +## Overview + +This sample demonstrates how to use `LongRunningFunctionTool` in ADK to handle operations that take a significant amount of time to complete. + +When a tool is marked as long-running, the framework understands that the function may return a pending status and that the final result will be provided asynchronously. This is useful for tasks like starting a background job, requesting human approval, or any operation where the result is not immediately available. + +## Sample Inputs + +- `Export my data to CSV` + +- `Start a JSON data export` + +- `Export my data to both CSV and JSON simultaneously` + +## Graph + +```mermaid +sequenceDiagram + actor User + participant Agent + participant Tool + + User->>Agent: "Export my data to CSV" + Agent->>Tool: export_data(export_type="csv") + Tool-->>Agent: {"status": "pending", ...} + Agent-->>User: "Started csv export. Ticket ID: export-12345" +``` + +## How To + +To create a long-running function tool: + +1. Define your Python function. It can return a status indicating it is in-progress (e.g., `{"status": "in-progress"}`). +1. Wrap the function using `LongRunningFunctionTool(func=your_function)`. +1. Pass the wrapped tool to the `Agent`. + +After the initial in-progress response, you can send additional function responses (e.g., containing progress updates like `{"status": "in-progress", "progress": "50%"}`) to the agent. This will trigger another model turn, allowing the agent to report the current progress back to the user. + +In the ADK Web UI, you can send an additional response by hovering over the function response button and selecting 'Send another response' from the menu. + +```python +from google.adk import Agent +from google.adk.tools.long_running_tool import LongRunningFunctionTool +def export_data(export_type: str) -> dict[str, str]: + # Start async task... + return { + "status": "in-progress", + "progress": "0%", + "message": f"Exporting {export_type} data. This may take some time.", + } + + +agent = Agent( + name="my_agent", + model="gemini-2.5-flash", + tools=[LongRunningFunctionTool(func=export_data)], +) +``` diff --git a/contributing/samples/tools/long_running_functions/__init__.py b/contributing/samples/tools/long_running_functions/__init__.py new file mode 100644 index 0000000000..4015e47d6e --- /dev/null +++ b/contributing/samples/tools/long_running_functions/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/tools/long_running_functions/agent.py b/contributing/samples/tools/long_running_functions/agent.py new file mode 100644 index 0000000000..ea3e949ade --- /dev/null +++ b/contributing/samples/tools/long_running_functions/agent.py @@ -0,0 +1,44 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk import Agent +from google.adk.tools.long_running_tool import LongRunningFunctionTool + + +def export_data(export_type: str) -> dict[str, str]: + """Exports user data. + + Args: + export_type: The type of data to export (e.g., 'csv', 'json'). + + Returns: + A dict with the status. + """ + # In a real application, this would kick off a background job. + # Here we just return a status. + return { + "status": "in-progress", + "progress": "0%", + "message": f"Exporting {export_type} data. This may take some time.", + } + + +root_agent = Agent( + name="long_running_functions", + instruction=""" + You are an assistant that can export user data. + When the user asks to export data, call the `export_data` tool. + """, + tools=[LongRunningFunctionTool(func=export_data)], +) diff --git a/contributing/samples/tools/long_running_functions/tests/export_to_csv.json b/contributing/samples/tools/long_running_functions/tests/export_to_csv.json new file mode 100644 index 0000000000..77c59729b5 --- /dev/null +++ b/contributing/samples/tools/long_running_functions/tests/export_to_csv.json @@ -0,0 +1,127 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "export to csv" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "long_running_functions", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "export_type": "csv" + }, + "id": "fc-1", + "name": "export_data" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-1" + ], + "nodeInfo": { + "path": "long_running_functions@1" + } + }, + { + "author": "long_running_functions", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "export_data", + "response": { + "message": "Exporting csv data. This may take some time.", + "progress": "0%", + "status": "in-progress" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "long_running_functions@1" + } + }, + { + "author": "long_running_functions", + "content": { + "parts": [ + { + "text": "I'm exporting your data to CSV. This may take some time. I will let you know when it's done." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "long_running_functions@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "export_data", + "response": { + "progress": "50%", + "status": "in-progress" + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "long_running_functions", + "content": { + "parts": [ + { + "text": "Your data is 50% exported. The export is still in progress." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "long_running_functions@1" + } + } + ] +} diff --git a/contributing/samples/tools/long_running_functions/tests/export_to_csv_and_json.json b/contributing/samples/tools/long_running_functions/tests/export_to_csv_and_json.json new file mode 100644 index 0000000000..f37322c34e --- /dev/null +++ b/contributing/samples/tools/long_running_functions/tests/export_to_csv_and_json.json @@ -0,0 +1,226 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "export to csv and json" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "long_running_functions", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "export_type": "csv" + }, + "id": "fc-1", + "name": "export_data" + } + }, + { + "functionCall": { + "args": { + "export_type": "json" + }, + "id": "fc-2", + "name": "export_data" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-1", + "fc-2" + ], + "nodeInfo": { + "path": "long_running_functions@1" + } + }, + { + "author": "long_running_functions", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "export_data", + "response": { + "message": "Exporting csv data. This may take some time.", + "progress": "0%", + "status": "in-progress" + } + } + }, + { + "functionResponse": { + "id": "fc-2", + "name": "export_data", + "response": { + "message": "Exporting json data. This may take some time.", + "progress": "0%", + "status": "in-progress" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "long_running_functions@1" + } + }, + { + "author": "long_running_functions", + "content": { + "parts": [ + { + "text": "I've started exporting your data to both CSV and JSON formats. This may take some time. I will notify you when it's complete." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "long_running_functions@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "export_data", + "response": { + "progress": "50%", + "status": "in-progress" + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "long_running_functions", + "content": { + "parts": [ + { + "text": "I've started exporting your data to both CSV and JSON formats. This may take some time to complete." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "long_running_functions@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "export_data", + "response": { + "status": "completed" + } + } + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "long_running_functions", + "content": { + "parts": [ + { + "text": "I've started exporting your data to CSV and JSON. The JSON export is complete, and the CSV export is 50% complete. I'll let you know when the CSV export is finished." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "path": "long_running_functions@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "export_data", + "response": { + "status": "completed" + } + } + } + ], + "role": "user" + }, + "id": "e-9", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "long_running_functions", + "content": { + "parts": [ + { + "text": "I have exported the data to both CSV and JSON formats." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-10", + "invocationId": "i-1", + "nodeInfo": { + "path": "long_running_functions@1" + } + } + ] +} diff --git a/contributing/samples/output_schema_with_tools/README.md b/contributing/samples/tools/output_schema_with_tools/README.md similarity index 100% rename from contributing/samples/output_schema_with_tools/README.md rename to contributing/samples/tools/output_schema_with_tools/README.md diff --git a/contributing/samples/tools/output_schema_with_tools/__init__.py b/contributing/samples/tools/output_schema_with_tools/__init__.py new file mode 100644 index 0000000000..4015e47d6e --- /dev/null +++ b/contributing/samples/tools/output_schema_with_tools/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/output_schema_with_tools/agent.py b/contributing/samples/tools/output_schema_with_tools/agent.py similarity index 99% rename from contributing/samples/output_schema_with_tools/agent.py rename to contributing/samples/tools/output_schema_with_tools/agent.py index f294b897f7..467e4bcb6e 100644 --- a/contributing/samples/output_schema_with_tools/agent.py +++ b/contributing/samples/tools/output_schema_with_tools/agent.py @@ -83,7 +83,6 @@ def get_current_year() -> str: # Create the knowledge agent that uses google_search tool. knowledge_agent = LlmAgent( name="knowledge_agent", - model="gemini-2.5-flash", instruction=""" You are a helpful assistant that gathers information about famous people. Use google_search tool to find information about them. diff --git a/contributing/samples/parallel_functions/README.md b/contributing/samples/tools/parallel_functions/README.md similarity index 100% rename from contributing/samples/parallel_functions/README.md rename to contributing/samples/tools/parallel_functions/README.md diff --git a/contributing/samples/tools/parallel_functions/__init__.py b/contributing/samples/tools/parallel_functions/__init__.py new file mode 100644 index 0000000000..4015e47d6e --- /dev/null +++ b/contributing/samples/tools/parallel_functions/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/parallel_functions/agent.py b/contributing/samples/tools/parallel_functions/agent.py similarity index 96% rename from contributing/samples/parallel_functions/agent.py rename to contributing/samples/tools/parallel_functions/agent.py index 07dd0b81db..02327509e2 100644 --- a/contributing/samples/parallel_functions/agent.py +++ b/contributing/samples/tools/parallel_functions/agent.py @@ -60,7 +60,7 @@ async def get_weather(city: str, tool_context: ToolContext) -> dict: if 'weather_requests' not in tool_context.state: tool_context.state['weather_requests'] = [] tool_context.state['weather_requests'].append( - {'city': city, 'timestamp': time.time(), 'result': result} + {'city': city, 'result': result} ) return { @@ -108,14 +108,12 @@ async def get_currency_rate( 'from': from_currency, 'to': to_currency, 'rate': rate, - 'timestamp': time.time(), }) return { 'from_currency': from_currency, 'to_currency': to_currency, 'exchange_rate': rate, - 'timestamp': time.time(), } @@ -163,7 +161,6 @@ async def calculate_distance( 'city1': city1, 'city2': city2, 'distance': distance, - 'timestamp': time.time(), }) return { @@ -204,7 +201,7 @@ async def get_population(cities: List[str], tool_context: ToolContext) -> dict: if 'population_requests' not in tool_context.state: tool_context.state['population_requests'] = [] tool_context.state['population_requests'].append( - {'cities': cities, 'results': results, 'timestamp': time.time()} + {'cities': cities, 'results': results} ) return { @@ -215,7 +212,6 @@ async def get_population(cities: List[str], tool_context: ToolContext) -> dict: root_agent = Agent( - model='gemini-2.5-flash', name='parallel_function_test_agent', description=( 'Agent for testing parallel function calling performance and thread' diff --git a/contributing/samples/tools/parallel_functions/tests/test_all_tools.json b/contributing/samples/tools/parallel_functions/tests/test_all_tools.json new file mode 100644 index 0000000000..4b6caece90 --- /dev/null +++ b/contributing/samples/tools/parallel_functions/tests/test_all_tools.json @@ -0,0 +1,196 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Tell me about Paris and Sydney: weather, distance between them, and their populations." + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "parallel_function_test_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "city": "Paris" + }, + "id": "fc-1", + "name": "get_weather" + } + }, + { + "functionCall": { + "args": { + "city": "Sydney" + }, + "id": "fc-2", + "name": "get_weather" + } + }, + { + "functionCall": { + "args": { + "city1": "Paris", + "city2": "Sydney" + }, + "id": "fc-3", + "name": "calculate_distance" + } + }, + { + "functionCall": { + "args": { + "cities": [ + "Paris", + "Sydney" + ] + }, + "id": "fc-4", + "name": "get_population" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "parallel_function_test_agent@1" + } + }, + { + "actions": { + "stateDelta": { + "distance_requests": [ + { + "city1": "Paris", + "city2": "Sydney", + "distance": 18903 + } + ], + "population_requests": [ + { + "cities": [ + "Paris", + "Sydney" + ], + "results": { + "Paris": 2161000, + "Sydney": 5312163 + } + } + ], + "weather_requests": [ + { + "city": "Paris", + "result": { + "condition": "overcast", + "humidity": 70, + "temp": 58 + } + }, + { + "city": "Sydney", + "result": { + "condition": "sunny", + "humidity": 60, + "temp": 75 + } + } + ] + } + }, + "author": "parallel_function_test_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "get_weather", + "response": { + "city": "Paris", + "condition": "overcast", + "humidity": 70, + "temperature": 58 + } + } + }, + { + "functionResponse": { + "id": "fc-2", + "name": "get_weather", + "response": { + "city": "Sydney", + "condition": "sunny", + "humidity": 60, + "temperature": 75 + } + } + }, + { + "functionResponse": { + "id": "fc-3", + "name": "calculate_distance", + "response": { + "city1": "Paris", + "city2": "Sydney", + "distance_km": 18903, + "distance_miles": 11745 + } + } + }, + { + "functionResponse": { + "id": "fc-4", + "name": "get_population", + "response": { + "cities_count": 2, + "populations": { + "Paris": 2161000, + "Sydney": 5312163 + }, + "total_population": 7473163 + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "parallel_function_test_agent@1" + } + }, + { + "author": "parallel_function_test_agent", + "content": { + "parts": [ + { + "text": "Here's the information about Paris and Sydney:\n\n**Paris:**\n* **Weather:** The current weather in Paris is overcast with a temperature of 58\u00b0F and 70% humidity.\n* **Population:** The population of Paris is 2,161,000.\n\n**Sydney:**\n* **Weather:** The current weather in Sydney is sunny with a temperature of 75\u00b0F and 60% humidity.\n* **Population:** The population of Sydney is 5,312,163.\n\n**Distance between Paris and Sydney:**\nThe distance between Paris and Sydney is 18,903 km (11,745 miles)." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "parallel_function_test_agent@1" + } + } + ] +} diff --git a/contributing/samples/tools/parallel_functions/tests/test_parallel_mixed.json b/contributing/samples/tools/parallel_functions/tests/test_parallel_mixed.json new file mode 100644 index 0000000000..1fa993e391 --- /dev/null +++ b/contributing/samples/tools/parallel_functions/tests/test_parallel_mixed.json @@ -0,0 +1,128 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What is the weather in Tokyo and the exchange rate from USD to EUR?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "parallel_function_test_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "city": "Tokyo" + }, + "id": "fc-1", + "name": "get_weather" + } + }, + { + "functionCall": { + "args": { + "from_currency": "USD", + "to_currency": "EUR" + }, + "id": "fc-2", + "name": "get_currency_rate" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "parallel_function_test_agent@1" + } + }, + { + "actions": { + "stateDelta": { + "currency_requests": [ + { + "from": "USD", + "rate": 0.85, + "to": "EUR" + } + ], + "weather_requests": [ + { + "city": "Tokyo", + "result": { + "condition": "rainy", + "humidity": 90, + "temp": 68 + } + } + ] + } + }, + "author": "parallel_function_test_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "get_weather", + "response": { + "city": "Tokyo", + "condition": "rainy", + "humidity": 90, + "temperature": 68 + } + } + }, + { + "functionResponse": { + "id": "fc-2", + "name": "get_currency_rate", + "response": { + "exchange_rate": 0.85, + "from_currency": "USD", + "to_currency": "EUR" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "parallel_function_test_agent@1" + } + }, + { + "author": "parallel_function_test_agent", + "content": { + "parts": [ + { + "text": "The weather in Tokyo is rainy with a temperature of 68 degrees Fahrenheit and 90% humidity. The exchange rate from USD to EUR is 0.85." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "parallel_function_test_agent@1" + } + } + ] +} diff --git a/contributing/samples/tools/parallel_functions/tests/test_parallel_weather.json b/contributing/samples/tools/parallel_functions/tests/test_parallel_weather.json new file mode 100644 index 0000000000..660e754ef7 --- /dev/null +++ b/contributing/samples/tools/parallel_functions/tests/test_parallel_weather.json @@ -0,0 +1,129 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "What is the weather in New York and London?" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "parallel_function_test_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "city": "New York" + }, + "id": "fc-1", + "name": "get_weather" + } + }, + { + "functionCall": { + "args": { + "city": "London" + }, + "id": "fc-2", + "name": "get_weather" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "parallel_function_test_agent@1" + } + }, + { + "actions": { + "stateDelta": { + "weather_requests": [ + { + "city": "New York", + "result": { + "condition": "sunny", + "humidity": 45, + "temp": 72 + } + }, + { + "city": "London", + "result": { + "condition": "cloudy", + "humidity": 80, + "temp": 60 + } + } + ] + } + }, + "author": "parallel_function_test_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "get_weather", + "response": { + "city": "New York", + "condition": "sunny", + "humidity": 45, + "temperature": 72 + } + } + }, + { + "functionResponse": { + "id": "fc-2", + "name": "get_weather", + "response": { + "city": "London", + "condition": "cloudy", + "humidity": 80, + "temperature": 60 + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "parallel_function_test_agent@1" + } + }, + { + "author": "parallel_function_test_agent", + "content": { + "parts": [ + { + "text": "The weather in New York is sunny with a temperature of 72 degrees Fahrenheit and 45% humidity. In London, it is cloudy with a temperature of 60 degrees Fahrenheit and 80% humidity." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "parallel_function_test_agent@1" + } + } + ] +} diff --git a/contributing/samples/pydantic_argument/README.md b/contributing/samples/tools/pydantic_argument/README.md similarity index 100% rename from contributing/samples/pydantic_argument/README.md rename to contributing/samples/tools/pydantic_argument/README.md diff --git a/contributing/samples/tools/pydantic_argument/__init__.py b/contributing/samples/tools/pydantic_argument/__init__.py new file mode 100644 index 0000000000..4015e47d6e --- /dev/null +++ b/contributing/samples/tools/pydantic_argument/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/pydantic_argument/agent.py b/contributing/samples/tools/pydantic_argument/agent.py similarity index 100% rename from contributing/samples/pydantic_argument/agent.py rename to contributing/samples/tools/pydantic_argument/agent.py diff --git a/contributing/samples/pydantic_argument/main.py b/contributing/samples/tools/pydantic_argument/main.py similarity index 100% rename from contributing/samples/pydantic_argument/main.py rename to contributing/samples/tools/pydantic_argument/main.py diff --git a/contributing/samples/tools/pydantic_argument/tests/test_create_company.json b/contributing/samples/tools/pydantic_argument/tests/test_create_company.json new file mode 100644 index 0000000000..5b9d227863 --- /dev/null +++ b/contributing/samples/tools/pydantic_argument/tests/test_create_company.json @@ -0,0 +1,139 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Create a profile for company Acme Corp in tech industry with 50 employees." + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "profile_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "entity": { + "company_name": "Acme Corp", + "employee_count": 50, + "industry": "tech" + } + }, + "id": "fc-1", + "name": "create_entity_profile" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "profile_agent@1" + } + }, + { + "author": "profile_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "create_entity_profile", + "response": { + "message": "Unexpected entity type: ", + "status": "error" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "profile_agent@1" + } + }, + { + "author": "profile_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "entity": { + "company_name": "Acme Corp", + "employee_count": 50, + "industry": "tech" + } + }, + "id": "fc-2", + "name": "create_entity_profile" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "profile_agent@1" + } + }, + { + "author": "profile_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "create_entity_profile", + "response": { + "message": "Unexpected entity type: ", + "status": "error" + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "profile_agent@1" + } + }, + { + "author": "profile_agent", + "content": { + "parts": [ + { + "text": "I apologize for the repeated errors. It seems I am having trouble with the tool's expected input format. I will try again to create the company profile for Acme Corp. I believe the issue was in how I was structuring the data for the `create_entity_profile` function. I will now use the correct dataclass constructor to create the profile. Please bear with me." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "profile_agent@1" + } + } + ] +} diff --git a/contributing/samples/tools/pydantic_argument/tests/test_create_user.json b/contributing/samples/tools/pydantic_argument/tests/test_create_user.json new file mode 100644 index 0000000000..ce1ae1b374 --- /dev/null +++ b/contributing/samples/tools/pydantic_argument/tests/test_create_user.json @@ -0,0 +1,104 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Create a user account for Alice, age 30, email alice@example.com." + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "profile_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "profile": { + "age": 30, + "email": "alice@example.com", + "name": "Alice" + } + }, + "id": "fc-1", + "name": "create_full_user_account" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "profile_agent@1" + } + }, + { + "author": "profile_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "create_full_user_account", + "response": { + "conversion_demo": { + "preferences_converted": "JSON dict \u2192 UserPreferences instance", + "profile_converted": "JSON dict \u2192 UserProfile instance" + }, + "message": "Full account created for Alice!", + "preferences": { + "language": "English", + "notifications_enabled": true, + "preferences_type": "UserPreferences", + "theme": "light" + }, + "profile": { + "age": 30, + "email": "alice@example.com", + "name": "Alice", + "profile_type": "UserProfile" + }, + "status": "account_created" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "profile_agent@1" + } + }, + { + "author": "profile_agent", + "content": { + "parts": [ + { + "text": "I have created a user account for Alice, age 30, with the email alice@example.com." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "profile_agent@1" + } + } + ] +} diff --git a/contributing/samples/tools/pydantic_argument/tests/test_create_user_with_prefs.json b/contributing/samples/tools/pydantic_argument/tests/test_create_user_with_prefs.json new file mode 100644 index 0000000000..a5e9969bc8 --- /dev/null +++ b/contributing/samples/tools/pydantic_argument/tests/test_create_user_with_prefs.json @@ -0,0 +1,107 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "Create a user account for Bob, age 25, with dark theme and French language." + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "profile_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "preferences": { + "language": "French", + "theme": "dark" + }, + "profile": { + "age": 25, + "name": "Bob" + } + }, + "id": "fc-1", + "name": "create_full_user_account" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "profile_agent@1" + } + }, + { + "author": "profile_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "create_full_user_account", + "response": { + "conversion_demo": { + "preferences_converted": "JSON dict \u2192 UserPreferences instance", + "profile_converted": "JSON dict \u2192 UserProfile instance" + }, + "message": "Full account created for Bob!", + "preferences": { + "language": "French", + "notifications_enabled": true, + "preferences_type": "UserPreferences", + "theme": "dark" + }, + "profile": { + "age": 25, + "email": "Not provided", + "name": "Bob", + "profile_type": "UserProfile" + }, + "status": "account_created" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "profile_agent@1" + } + }, + { + "author": "profile_agent", + "content": { + "parts": [ + { + "text": "OK. I have created a user account for Bob, age 25, with a dark theme and French language preference." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "profile_agent@1" + } + } + ] +} diff --git a/contributing/samples/tool_agent_tool_config/root_agent.yaml b/contributing/samples/tools/tool_agent_tool_config/root_agent.yaml similarity index 100% rename from contributing/samples/tool_agent_tool_config/root_agent.yaml rename to contributing/samples/tools/tool_agent_tool_config/root_agent.yaml diff --git a/contributing/samples/tool_agent_tool_config/summarizer_agent.yaml b/contributing/samples/tools/tool_agent_tool_config/summarizer_agent.yaml similarity index 100% rename from contributing/samples/tool_agent_tool_config/summarizer_agent.yaml rename to contributing/samples/tools/tool_agent_tool_config/summarizer_agent.yaml diff --git a/contributing/samples/tool_agent_tool_config/web_search_agent.yaml b/contributing/samples/tools/tool_agent_tool_config/web_search_agent.yaml similarity index 100% rename from contributing/samples/tool_agent_tool_config/web_search_agent.yaml rename to contributing/samples/tools/tool_agent_tool_config/web_search_agent.yaml diff --git a/contributing/samples/tool_builtin_config/root_agent.yaml b/contributing/samples/tools/tool_builtin_config/root_agent.yaml similarity index 100% rename from contributing/samples/tool_builtin_config/root_agent.yaml rename to contributing/samples/tools/tool_builtin_config/root_agent.yaml diff --git a/contributing/samples/tool_human_in_the_loop_config/__init__.py b/contributing/samples/tools/tool_functions_config/__init__.py similarity index 100% rename from contributing/samples/tool_human_in_the_loop_config/__init__.py rename to contributing/samples/tools/tool_functions_config/__init__.py diff --git a/contributing/samples/tool_functions_config/root_agent.yaml b/contributing/samples/tools/tool_functions_config/root_agent.yaml similarity index 100% rename from contributing/samples/tool_functions_config/root_agent.yaml rename to contributing/samples/tools/tool_functions_config/root_agent.yaml diff --git a/contributing/samples/tool_functions_config/tools.py b/contributing/samples/tools/tool_functions_config/tools.py similarity index 100% rename from contributing/samples/tool_functions_config/tools.py rename to contributing/samples/tools/tool_functions_config/tools.py diff --git a/contributing/samples/workflows/auth_api_key/README.md b/contributing/samples/workflows/auth_api_key/README.md new file mode 100644 index 0000000000..609fc52b13 --- /dev/null +++ b/contributing/samples/workflows/auth_api_key/README.md @@ -0,0 +1,111 @@ +# ADK Workflow Auth Config Sample + +## Overview + +This sample demonstrates how to use `auth_config` on a `FunctionNode` to require user authentication before the node runs. + +When a node has `auth_config`, the workflow automatically: + +1. Pauses the node and emits an `adk_request_credential` FunctionCall event +1. The invocation ends — the node is marked as waiting +1. The client sends a new request with the credential as a FunctionResponse +1. The workflow stores the credential in session state and re-runs the node + +The **ADK web UI** (`adk web`) handles step 3 automatically — it recognizes auth +requests and presents an auth dialog. If you use a custom client, you need to +handle the `adk_request_credential` FunctionCall and respond with the credential +yourself. + +This sample uses **API key** authentication (the simplest credential type). + +## No External Setup Required + +This sample uses a mock weather lookup. No external API key or server is needed. When the auth UI prompts for a key, you can enter any value (e.g., `my-test-key-123`). + +## Sample Inputs + +Send any message (e.g., `go`) to start the workflow. + +## Graph + +```mermaid +graph TD + START --> fetch_weather[fetch_weather
        pauses for auth on first run] + fetch_weather --> summarize +``` + +## How To + +1. Define an `AuthConfig` with the auth scheme and credential type: + + ```python + from google.adk.auth.auth_tool import AuthConfig + from google.adk.auth.auth_credential import AuthCredential, AuthCredentialTypes + + auth_config = AuthConfig( + auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), + raw_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.API_KEY, + api_key='placeholder', + ), + credential_key='weather_api_key', + ) + ``` + +1. Use the `@node` decorator with `auth_config` and `rerun_on_resume=True`: + + ```python + @node(auth_config=auth_config, rerun_on_resume=True) + def fetch_weather(ctx: Context): + ... + ``` + +1. Inside the function, retrieve the credential from `ctx`: + + ```python + def fetch_weather(ctx: Context): + cred = ctx.get_auth_response(auth_config) + api_key = cred.api_key + # Use api_key to call your API... + ``` + +## OAuth2 + +The same `auth_config` pattern works with OAuth2 and OpenID Connect. The key +differences: + +- **Auth scheme**: Use `OAuth2` (from `fastapi.openapi.models`) instead of + `APIKey`. Configure the authorization and token URLs in the OAuth2 flows. +- **Raw credential**: Set `auth_type=AuthCredentialTypes.OAUTH2` and provide + `client_id`, `client_secret`, and `redirect_uri` in the `oauth2` field. +- **Web UI flow**: The ADK web UI recognizes OAuth2 auth requests and opens + an authorization popup automatically. The user authenticates with the + provider, and the UI sends the full `AuthConfig` response back. No special + handling is needed in the node. +- **Token exchange**: The framework automatically exchanges the authorization + code for an access token via `AuthHandler.exchange_auth_token()`. + +```python +from fastapi.openapi.models import OAuth2, OAuthFlowAuthorizationCode, OAuthFlows + +auth_config = AuthConfig( + auth_scheme=OAuth2( + flows=OAuthFlows( + authorizationCode=OAuthFlowAuthorizationCode( + authorizationUrl='https://provider.com/authorize', + tokenUrl='https://provider.com/token', + scopes={'read': 'Read access'}, + ) + ) + ), + raw_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.OAUTH2, + oauth2=OAuth2Auth( + client_id='YOUR_CLIENT_ID', + client_secret='YOUR_CLIENT_SECRET', + redirect_uri='http://localhost:8000/callback', + ), + ), + credential_key='my_oauth_credential', +) +``` diff --git a/contributing/samples/workflows/auth_api_key/agent.py b/contributing/samples/workflows/auth_api_key/agent.py new file mode 100644 index 0000000000..c98dc55ac4 --- /dev/null +++ b/contributing/samples/workflows/auth_api_key/agent.py @@ -0,0 +1,83 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Auth API Key sample: FunctionNode with API key authentication. + +Demonstrates how to use `auth_config` on a FunctionNode to pause +the workflow and request user credentials before running the node. + +Flow: + 1. User sends any message to start the workflow. + 2. The `fetch_weather` node pauses and requests an API key. + 3. The user provides the API key through the auth UI. + 4. The node runs with the credential available in session state. + 5. The `summarize` node displays the result. +""" + +from fastapi.openapi.models import APIKey +from fastapi.openapi.models import APIKeyIn +from google.adk import Event +from google.adk import Workflow +from google.adk.agents.context import Context +from google.adk.auth.auth_credential import AuthCredential +from google.adk.auth.auth_credential import AuthCredentialTypes +from google.adk.auth.auth_tool import AuthConfig +from google.adk.workflow import node + +# --- Auth configuration --- +# Uses API key auth: the simplest credential type. +# The user will be prompted to provide an API key via the auth UI. +auth_config = AuthConfig( + auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), + raw_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.API_KEY, + api_key='placeholder', + ), + credential_key='weather_api_key', +) + + +@node(auth_config=auth_config, rerun_on_resume=True) +def fetch_weather(ctx: Context): + """Fetches weather data using the authenticated API key.""" + # After auth completes, the credential is available via ctx. + cred = ctx.get_auth_response(auth_config) + api_key = cred.api_key if cred else 'unknown' + + # In a real agent, you would use the api_key to call an external API. + # For this sample, we just echo it back (masked). + masked = api_key[:4] + '****' if len(api_key) > 4 else '****' + return { + 'city': 'San Francisco', + 'temperature': '18C', + 'condition': 'Sunny', + 'api_key_used': masked, + } + + +def summarize(node_input: dict): + """Displays the weather result.""" + yield Event( + message=( + f"Weather for {node_input['city']}:" + f" {node_input['temperature']}, {node_input['condition']}." + f" (Authenticated with key: {node_input['api_key_used']})" + ) + ) + + +root_agent = Workflow( + name='auth_api_key', + edges=[('START', fetch_weather, summarize)], +) diff --git a/contributing/samples/workflows/auth_api_key/tests/go.json b/contributing/samples/workflows/auth_api_key/tests/go.json new file mode 100644 index 0000000000..853bf5ddcd --- /dev/null +++ b/contributing/samples/workflows/auth_api_key/tests/go.json @@ -0,0 +1,120 @@ +{ + "appName": "auth_api_key", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "go" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "auth_api_key", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "authConfig": { + "authScheme": { + "in": "header", + "name": "X-Api-Key", + "type": "apiKey" + }, + "credentialKey": "weather_api_key", + "rawAuthCredential": { + "apiKey": "placeholder", + "authType": "apiKey" + } + }, + "functionCallId": "fc-1", + "message": "Please provide your API key for X-Api-Key." + }, + "id": "fc-1", + "name": "adk_request_credential" + } + } + ] + }, + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-1" + ], + "nodeInfo": { + "path": "auth_api_key@1/fetch_weather@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "adk_request_credential", + "response": { + "result": "12345678" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "auth_api_key", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "auth_api_key@1/fetch_weather@1" + ], + "path": "auth_api_key@1/fetch_weather@1" + }, + "output": { + "api_key_used": "1234****", + "city": "San Francisco", + "condition": "Sunny", + "temperature": "18C" + } + }, + { + "author": "auth_api_key", + "content": { + "parts": [ + { + "text": "Weather for San Francisco: 18C, Sunny. (Authenticated with key: 1234****)" + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "auth_api_key@1/summarize@1" + } + } + ], + "id": "3bb54ead-8f56-468e-b64f-f0d534a66c69", + "state": { + "__session_metadata__": { + "displayName": "go" + } + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/auth_oauth/README.md b/contributing/samples/workflows/auth_oauth/README.md new file mode 100644 index 0000000000..3f1658b23a --- /dev/null +++ b/contributing/samples/workflows/auth_oauth/README.md @@ -0,0 +1,112 @@ +# GitHub OAuth Authentication Sample + +## Overview + +This sample demonstrates how to use `AuthConfig` with GitHub OAuth2 on a `FunctionNode` in a workflow. It shows how to pause execution to request a GitHub OAuth token from the user and then use that token to list the user's owned repositories via the GitHub API. + +## Prerequisites + +To run this sample and actually log in, you need to: + +1. **Register an OAuth Application on GitHub**: + - Go to your GitHub account settings. + - Navigate to **Developer settings** > **OAuth Apps** > **New OAuth App**. + - Set the **Homepage URL** and **Authorization callback URL** appropriate for your testing environment (e.g., `http://localhost:8000` if running locally). +1. **Get Credentials**: + - Copy the **Client ID** and **Client Secret**. +1. **Configure Environment Variables**: + - Set the following environment variables in your terminal before running the sample: + ```bash + export GITHUB_CLIENT_ID="your_actual_client_id" + export GITHUB_CLIENT_SECRET="your_actual_client_secret" + ``` + - Alternatively, you can create a `.env` file in the sample directory (`contributing/workflow_samples/auth_oauth/.env`) with the following content: + ```env + GITHUB_CLIENT_ID="your_actual_client_id" + GITHUB_CLIENT_SECRET="your_actual_client_secret" + ``` + The ADK CLI automatically loads `.env` files from the agent directory. + +## Sample Inputs + +- `start` + +- `list my repos` + +## Graph + +```mermaid +graph TD + START --> list_github_repos + list_github_repos --> display_result +``` + +## How To + +### 1. Define the AuthConfig for GitHub + +We define an `AuthConfig` that specifies the GitHub OAuth2 endpoints and reads credentials from environment variables. + +```python +auth_config = AuthConfig( + auth_scheme=OAuth2( + flows=OAuthFlows( + authorizationCode=OAuthFlowAuthorizationCode( + authorizationUrl="https://github.com/login/oauth/authorize", + tokenUrl="https://github.com/login/oauth/access_token", + scopes={ + "user": "Read user profile", + "repo": "Access public repositories", + }, + ) + ) + ), + raw_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.OAUTH2, + oauth2=OAuth2Auth( + client_id=os.environ.get("GITHUB_CLIENT_ID", "YOUR_GITHUB_CLIENT_ID"), + client_secret=os.environ.get("GITHUB_CLIENT_SECRET", "YOUR_GITHUB_CLIENT_SECRET"), + ), + ), + credential_key="github_oauth_token", +) +``` + +### 2. Apply to a Node + +We apply the `auth_config` to the `list_github_repos` node. + +```python +@node(auth_config=auth_config, rerun_on_resume=True) +def list_github_repos(ctx: Context): + # ... +``` + +### 3. Call GitHub API + +Inside the node, we retrieve the token and use the `requests` library to call the GitHub API. + +```python + cred = ctx.get_auth_response(auth_config) + access_token = cred.oauth2.access_token if cred and cred.oauth2 else None + + # ... (headers setup) ... + + response = requests.get("https://api.github.com/user/repos", headers=headers) + repos_data = response.json() + repo_names = [repo["name"] for repo in repos_data] +``` + +## Running the Sample + +To run this sample interactively, use the ADK CLI: + +```bash +adk run contributing/workflow_samples/auth_oauth +``` + +Or use the Web UI: + +```bash +adk web contributing/workflow_samples/ +``` diff --git a/contributing/samples/workflows/auth_oauth/__init__.py b/contributing/samples/workflows/auth_oauth/__init__.py new file mode 100644 index 0000000000..4015e47d6e --- /dev/null +++ b/contributing/samples/workflows/auth_oauth/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/workflows/auth_oauth/agent.py b/contributing/samples/workflows/auth_oauth/agent.py new file mode 100644 index 0000000000..1e2704a469 --- /dev/null +++ b/contributing/samples/workflows/auth_oauth/agent.py @@ -0,0 +1,137 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""OAuth Authentication sample: FunctionNode with GitHub OAuth2 token request. + +Demonstrates how to use `auth_config` with GitHub OAuth2 on a FunctionNode to +pause +the workflow, request an OAuth token from the user, and use it to list the +user's +GitHub repositories. + +Flow: + 1. User sends any message to start the workflow. + 2. The `list_github_repos` node pauses and requests GitHub OAuth credentials. + 3. The user provides the credentials (after logging in to GitHub). + 4. The node runs, calls the GitHub API to list repos, and returns the list. + 5. The `display_result` node displays the repository names. + +Sample queries: + - "start" + - "list my repos" +""" + +import os + +from fastapi.openapi.models import OAuth2 +from fastapi.openapi.models import OAuthFlowAuthorizationCode +from fastapi.openapi.models import OAuthFlows +from google.adk import Event +from google.adk import Workflow +from google.adk.agents.context import Context +from google.adk.auth.auth_credential import AuthCredential +from google.adk.auth.auth_credential import AuthCredentialTypes +from google.adk.auth.auth_credential import OAuth2Auth +from google.adk.auth.auth_tool import AuthConfig +from google.adk.workflow import node +import requests + +# --- Auth configuration --- +# Uses GitHub OAuth2 authorization code flow. +# To use this sample, you need to register an OAuth application on GitHub +# and get a Client ID and Client Secret. +# Set the GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET environment variables. +auth_config = AuthConfig( + auth_scheme=OAuth2( + flows=OAuthFlows( + authorizationCode=OAuthFlowAuthorizationCode( + authorizationUrl="https://github.com/login/oauth/authorize", + tokenUrl="https://github.com/login/oauth/access_token", + scopes={ + "user": "Read user profile", + "repo": "Access public repositories", + }, + ) + ) + ), + raw_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.OAUTH2, + oauth2=OAuth2Auth( + client_id=os.environ.get( + "GITHUB_CLIENT_ID", "YOUR_GITHUB_CLIENT_ID" + ), + client_secret=os.environ.get( + "GITHUB_CLIENT_SECRET", "YOUR_GITHUB_CLIENT_SECRET" + ), + ), + ), + credential_key="github_oauth_token", +) + + +@node(auth_config=auth_config, rerun_on_resume=True) +def list_github_repos(ctx: Context): + """Fetches GitHub repositories for the authenticated user.""" + # After auth completes, the credential is available via ctx. + cred = ctx.get_auth_response(auth_config) + + access_token = cred.oauth2.access_token if cred and cred.oauth2 else None + + if not access_token: + return {"status": "Error", "message": "No access token found"} + + # GitHub API requires a User-Agent header + headers = { + "Authorization": f"Bearer {access_token}", + "User-Agent": "ADK-Sample-Agent", + "Accept": "application/json", + } + + try: + response = requests.get( + "https://api.github.com/user/repos", headers=headers + ) + response.raise_for_status() + repos_data = response.json() + # Extract repo names + repo_names = [repo["name"] for repo in repos_data] + return { + "status": "Success", + "repos": repo_names, + } + except Exception as e: + return { + "status": "Error", + "message": f"Failed to fetch repos: {e}", + } + + +def display_result(node_input: dict): + """Displays the result of accessing the resource.""" + if node_input["status"] == "Success": + repos_str = ", ".join(node_input["repos"]) + yield Event(message=f"Successfully fetched repositories: {repos_str}") + else: + yield Event( + message=( + "Failed to fetch repositories. Error:" + f" {node_input.get('message', 'Unknown error')}" + ) + ) + + +root_agent = Workflow( + name="auth_oauth", + edges=[("START", list_github_repos, display_result)], +) diff --git a/contributing/samples/workflows/dynamic_fan_out_fan_in/README.md b/contributing/samples/workflows/dynamic_fan_out_fan_in/README.md new file mode 100644 index 0000000000..1486f78f57 --- /dev/null +++ b/contributing/samples/workflows/dynamic_fan_out_fan_in/README.md @@ -0,0 +1,61 @@ +# Dynamic Fan-Out / Fan-In with Dynamic Nodes + +## Overview + +This sample demonstrates how to perform **Dynamic Fan-Out and Fan-In** using ADK's dynamic node scheduling (`ctx.run_node()`). + +Unlike static graph-based parallel execution (which requires pre-defined branches), this pattern allows you to determine the number of parallel tasks at runtime based on the input data. + +## Sample Inputs + +- `AI, Cloud Computing, Quantum Computing` + +- `Python, Go, Rust, TypeScript` + +## Graph + +```mermaid +graph TD + START --> Orchestrator + Orchestrator --> Gen_0[Generator Task 0] + Orchestrator --> Gen_1[Generator Task 1] + Orchestrator --> Gen_N[Generator Task N] + Gen_0 --> Aggregator[Orchestrator Fan-In] + Gen_1 --> Aggregator + Gen_N --> Aggregator +``` + +## How To + +Key techniques demonstrated in this sample: + +1. **Dynamic Scheduling**: Using a loop to create tasks via `ctx.run_node()`. +1. **Context Isolation**: Using `sub_branch` in `run_node` to isolate events for each parallel task, preventing context contamination. +1. **`rerun_on_resume=True`**: Required on the orchestrator node to support resumption if any child node interrupts. + +### Code Snippet + +```python + # Fan-out: Schedule a dynamic node for each topic + tasks = [] + for i, topic in enumerate(topics): + tasks.append( + ctx.run_node( + generator, + node_input=topic, + sub_branch=f"branch_{i}" + ) + ) + + # Wait for all tasks to complete + results = await asyncio.gather(*tasks) +``` + +## Pro Tip: Custom `run_id` + +ADK auto-generates numeric IDs (e.g., `@1`), but you can pass a custom `run_id` to improve log readability (e.g., `generator@task_AI`) or map events to business keys. + +**Rules**: + +- **Unique**: Must be unique per node for fresh executions (otherwise returns cached results). +- **Non-Numeric**: Must contain non-numeric characters to avoid collision with auto-generated IDs. diff --git a/contributing/samples/workflows/dynamic_fan_out_fan_in/agent.py b/contributing/samples/workflows/dynamic_fan_out_fan_in/agent.py new file mode 100644 index 0000000000..cf49cc5dad --- /dev/null +++ b/contributing/samples/workflows/dynamic_fan_out_fan_in/agent.py @@ -0,0 +1,69 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import asyncio + +from google.adk import Agent +from google.adk import Context +from google.adk import Event +from google.adk import Workflow +from google.adk.workflow import node + +# Worker agent to generate a headline for a single topic +generator = Agent( + name="generator", + instruction=( + "Write a catchy one-line headline about the topic provided in the user" + " message." + ), +) + + +@node(rerun_on_resume=True) +async def orchestrator(ctx: Context, node_input: str) -> str: + """Orchestrator node that performs dynamic fan-out and fan-in.""" + # Split input comma-separated string into topics + topics = [t.strip() for t in node_input.split(",") if t.strip()] + yield Event(message=f"Processing {len(topics)} topics in parallel.") + + # Fan-out: Schedule a dynamic node for each topic + tasks = [] + for i, topic in enumerate(topics): + tasks.append( + ctx.run_node( + generator, + node_input=topic, + use_sub_branch=True, + ) + ) + + # Wait for all tasks to complete + results = await asyncio.gather(*tasks) + + # Fan-in: Aggregate results + aggregated = "### Aggregated Headlines\n\n" + aggregated += "| Topic | Headline |\n" + aggregated += "| :--- | :--- |\n" + for topic, headline in zip(topics, results): + aggregated += f"| {topic} | {headline} |\n" + + yield Event(message=aggregated) + + +root_agent = Workflow( + name="dynamic_fan_out_fan_in", + edges=[("START", orchestrator)], +) diff --git a/contributing/samples/workflows/dynamic_nodes/README.md b/contributing/samples/workflows/dynamic_nodes/README.md new file mode 100644 index 0000000000..52452d5d77 --- /dev/null +++ b/contributing/samples/workflows/dynamic_nodes/README.md @@ -0,0 +1,59 @@ +# ADK Workflow Dynamic Node Execution Sample + +## Overview + +This sample demonstrates how to use `ctx.run_node` to execute nodes dynamically during workflow execution in **ADK Workflows**. + +In standard workflow execution, the execution path is defined statically by the `edges`. However, there are scenarios where the exact nodes, or the number of times a node runs, cannot be determined until runtime. + +In this sample, we handle the dynamic loop scenario: an `orchestrate` Python node acts as the driver. It uses a `while True:` loop to first execute a `generate_headline` agent to create a headline based on a given topic, and then an `evaluate_headline` agent to grade it. If the grade is `"tech-related"`, the loop returns the headline. If `"unrelated"`, the feedback is passed back into the state, and the loop repeats. + +This is a rewritten version of the standard `loop` sample, achieved without complex graph edge routing (e.g., without conditional routing functions in `edges`), by instead leveraging native Python control flow (`while` loops) combined with asynchronous `ctx.run_node` calls. + +## Sample Inputs + +- `flower` + +- `quantum mechanics` + +- `renewable energy` + +## Graph + +```mermaid +graph TD + START --> orchestrate[orchestrate
        PYTHON FUNCTION] + orchestrate -.->|ctx.run_node| generate_headline + generate_headline --> evaluate_headline + evaluate_headline -.-> orchestrate +``` + +## How To + +1. **Enable Resumability**: For a python node to use `ctx.run_node`, it must be declared with `@node(rerun_on_resume=True)`. This tells the engine to pause and possibly re-run the orchestrator if any dynamically scheduled node gets interrupted (e.g., waiting for human-in-the-loop). + + ```python + from google.adk.workflow import node + + @node(rerun_on_resume=True) + async def orchestrate(ctx: Context, node_input: str) -> str: + # ... + ``` + +1. **Run Node from Context**: Inject `ctx: Context` into your python node definition and await `ctx.run_node(node_to_run)`. The return value is the final output of that execution. You can also yield events to update the state within the loop before the next iteration. + + ```python + @node(rerun_on_resume=True) + async def orchestrate(ctx: Context, node_input: str) -> str: + yield Event(state={"topic": node_input}) + + while True: + headline = await ctx.run_node(generate_headline) + feedback = Feedback.model_validate( + await ctx.run_node(evaluate_headline, node_input=headline) + ) + + if feedback.grade == "tech-related": + yield headline + break # or return headline + ``` diff --git a/contributing/samples/workflows/dynamic_nodes/agent.py b/contributing/samples/workflows/dynamic_nodes/agent.py new file mode 100644 index 0000000000..57c2ec1054 --- /dev/null +++ b/contributing/samples/workflows/dynamic_nodes/agent.py @@ -0,0 +1,78 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Literal + +from google.adk import Agent +from google.adk import Context +from google.adk import Event +from google.adk import Workflow +from google.adk.workflow import node +from pydantic import BaseModel +from pydantic import Field + + +class Feedback(BaseModel): + grade: Literal["tech-related", "unrelated"] = Field( + description=( + "Decide if the headline is related to technology or software" + " engineering." + ), + ) + feedback: str = Field( + description=( + "If the headline is unrelated to technology, provide feedback on how" + " to make it more tech-focused." + ), + ) + + +generate_headline = Agent( + name="generate_headline", + instruction=""" + Write a headline about the topic "{topic}". + If feedback is provided, take it into account. + The feedback: {feedback?} + """, +) + + +evaluate_headline = Agent( + name="evaluate_headline", + instruction=""" + Grade whether the headline is related to technology or software engineering. + """, + output_schema=Feedback, + output_key="feedback", +) + + +@node(rerun_on_resume=True) +async def orchestrate(ctx: Context, node_input: str) -> str: + yield Event(state={"topic": node_input}) + + while True: + headline = await ctx.run_node(generate_headline) + feedback = Feedback.model_validate( + await ctx.run_node(evaluate_headline, node_input=headline) + ) + if feedback.grade == "tech-related": + yield headline + break + + +root_agent = Workflow( + name="root_agent", + edges=[("START", orchestrate)], +) diff --git a/contributing/samples/workflows/dynamic_nodes/tests/flower.json b/contributing/samples/workflows/dynamic_nodes/tests/flower.json new file mode 100644 index 0000000000..4a62580329 --- /dev/null +++ b/contributing/samples/workflows/dynamic_nodes/tests/flower.json @@ -0,0 +1,159 @@ +{ + "appName": "dynamic_nodes", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "flower" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "stateDelta": { + "topic": "flower" + } + }, + "author": "root_agent", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/orchestrate@1" + } + }, + { + "author": "generate_headline", + "content": { + "parts": [ + { + "text": "A World of Petals" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/orchestrate@1/generate_headline@1" + ], + "path": "root_agent@1/orchestrate@1/generate_headline@1" + } + }, + { + "actions": { + "stateDelta": { + "feedback": { + "feedback": "This headline sounds like it's about botany, gardening, or a natural theme. To make it more tech-focused, consider incorporating terms like 'AI', 'software', 'virtual reality', 'digital', 'engineering', 'innovation', 'data', or 'development'. For example, 'The AI-Powered World of Digital Petals' or 'Engineering a Virtual Reality of Petals'.", + "grade": "unrelated" + } + } + }, + "author": "evaluate_headline", + "content": { + "parts": [ + { + "text": "{\"grade\": \"unrelated\", \"feedback\": \"This headline sounds like it's about botany, gardening, or a natural theme. To make it more tech-focused, consider incorporating terms like 'AI', 'software', 'virtual reality', 'digital', 'engineering', 'innovation', 'data', or 'development'. For example, 'The AI-Powered World of Digital Petals' or 'Engineering a Virtual Reality of Petals'.\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/orchestrate@1/evaluate_headline@1" + ], + "path": "root_agent@1/orchestrate@1/evaluate_headline@1" + } + }, + { + "author": "generate_headline", + "content": { + "parts": [ + { + "text": "**Digital Petals: Engineering AI-Enhanced Blooms**" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/orchestrate@1/generate_headline@2" + ], + "path": "root_agent@1/orchestrate@1/generate_headline@2" + } + }, + { + "actions": { + "stateDelta": { + "feedback": { + "feedback": "This headline is clearly tech-related, specifically mentioning 'Engineering' and 'AI-Enhanced', which are direct ties to technology and software engineering.", + "grade": "tech-related" + } + } + }, + "author": "evaluate_headline", + "content": { + "parts": [ + { + "text": "{\"grade\": \"tech-related\", \"feedback\": \"This headline is clearly tech-related, specifically mentioning 'Engineering' and 'AI-Enhanced', which are direct ties to technology and software engineering.\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/orchestrate@1/evaluate_headline@2" + ], + "path": "root_agent@1/orchestrate@1/evaluate_headline@2" + } + }, + { + "author": "root_agent", + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/orchestrate@1", + "root_agent@1" + ], + "path": "root_agent@1/orchestrate@1" + }, + "output": "**Digital Petals: Engineering AI-Enhanced Blooms**" + } + ], + "id": "1cf606cf-0c65-4512-96c2-07ccb0181853", + "state": { + "__session_metadata__": { + "displayName": "flower" + }, + "feedback": { + "feedback": "This headline is already very tech-focused, mentioning 'AI-Powered' and 'Smart Technology' in the context of innovation.", + "grade": "tech-related" + }, + "topic": "flower" + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/fan_out_fan_in/README.md b/contributing/samples/workflows/fan_out_fan_in/README.md new file mode 100644 index 0000000000..08cb510c3c --- /dev/null +++ b/contributing/samples/workflows/fan_out_fan_in/README.md @@ -0,0 +1,59 @@ +# ADK Workflow Fan-Out / Fan-In Sample + +## Overview + +This sample demonstrates how to run multiple nodes in parallel and aggregate their results using a **Fan-Out / Fan-In** pattern in **ADK Workflows**. + +It takes an input string and fans out to three different processing functions concurrently: `make_uppercase`, `count_characters`, and `reverse_string`. Instead of independently triggering the downstream node (as seen in the `multi_triggers` sample), this workflow uses a `JoinNode` to wait for all the parallel processes to complete. Once all results are ready, the `JoinNode` packages them into a single dictionary and passes it to an `aggregate` node, which formats the final combined response. + +In ADK Workflows, the `JoinNode` is a critical component for synchronizing parallel execution paths, ensuring that a downstream node only executes once all of its required upstream dependencies have furnished their outputs. + +## Sample Inputs + +- `Hello World` + +- `ADK workflows` + +- `testing concurrent nodes` + +## Graph + +```mermaid +graph TD + START --> make_uppercase + START --> count_characters + START --> reverse_string + make_uppercase --> join_node[join_node
        Waits for all 3] + count_characters --> join_node + reverse_string --> join_node + join_node --> aggregate +``` + +## How To + +1. Define a `JoinNode` in your code: + + ```python + from google.adk.workflow import JoinNode + + join_node = JoinNode(name="join_for_results") + ``` + +1. In the `Workflow` edges definition, specify a tuple of nodes to fan out execution, followed by your `join_node` to fan in the results, and finally the node that processes the aggregated output: + + ```python + ( + "START", + (make_uppercase, count_characters, reverse_string), + join_node, + aggregate, + ) + ``` + +1. The node following the `JoinNode` (in this case, `aggregate`) will receive a `dict` as its input. The keys of this dictionary are the names of the upstream nodes, and the values are their respective outputs: + + ```python + async def aggregate(node_input: dict[str, Any]): + uppercase_result = node_input['make_uppercase'] + # ... + ``` diff --git a/contributing/samples/workflows/fan_out_fan_in/agent.py b/contributing/samples/workflows/fan_out_fan_in/agent.py new file mode 100644 index 0000000000..97e46889bb --- /dev/null +++ b/contributing/samples/workflows/fan_out_fan_in/agent.py @@ -0,0 +1,55 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any + +from google.adk import Event +from google.adk import Workflow +from google.adk.workflow import JoinNode + + +def make_uppercase(node_input: str): + return node_input.upper() + + +def count_characters(node_input: str): + return len(node_input) + + +def reverse_string(node_input: str): + return node_input[::-1] + + +join_node = JoinNode(name="join_for_results") + + +async def aggregate(node_input: dict[str, Any]): + yield Event( + message=( + f"Uppercase: {node_input['make_uppercase']}\n\n" + f"Character Count: {node_input['count_characters']}\n\n" + f"Reversed: {node_input['reverse_string']}\n\n" + ), + ) + + +root_agent = Workflow( + name="root_agent", + edges=[( + "START", + (make_uppercase, count_characters, reverse_string), + join_node, + aggregate, + )], +) diff --git a/contributing/samples/workflows/fan_out_fan_in/tests/go.json b/contributing/samples/workflows/fan_out_fan_in/tests/go.json new file mode 100644 index 0000000000..96f6383c4e --- /dev/null +++ b/contributing/samples/workflows/fan_out_fan_in/tests/go.json @@ -0,0 +1,99 @@ +{ + "appName": "fan_out_fan_in", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "go" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "branch": "make_uppercase@1", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/make_uppercase@1" + ], + "path": "root_agent@1/make_uppercase@1" + }, + "output": "GO" + }, + { + "author": "root_agent", + "branch": "count_characters@1", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/count_characters@1" + ], + "path": "root_agent@1/count_characters@1" + }, + "output": 2 + }, + { + "author": "root_agent", + "branch": "reverse_string@1", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/reverse_string@1" + ], + "path": "root_agent@1/reverse_string@1" + }, + "output": "og" + }, + { + "author": "root_agent", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/join_for_results@1" + ], + "path": "root_agent@1/join_for_results@1" + }, + "output": { + "count_characters": 2, + "make_uppercase": "GO", + "reverse_string": "og" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Uppercase: GO\n\nCharacter Count: 2\n\nReversed: og\n\n" + } + ], + "role": "user" + }, + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/aggregate@1" + } + } + ], + "id": "de416178-357c-4f4c-bf32-ff19e39f33db", + "state": { + "__session_metadata__": { + "displayName": "go" + } + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/loop/README.md b/contributing/samples/workflows/loop/README.md new file mode 100644 index 0000000000..67021bd536 --- /dev/null +++ b/contributing/samples/workflows/loop/README.md @@ -0,0 +1,46 @@ +# ADK Workflow Loop Sample + +## Overview + +This sample demonstrates how to create a feedback loop between different nodes in **ADK Workflows**. + +It takes a user-provided topic and uses the `generate_headline` agent to write a headline. The `evaluate_headline` agent then grades the headline as either "tech-related" or "unrelated", providing feedback if it's unrelated. The `route_headline` function checks this grade. If the headline is "unrelated", the workflow loops back to the `generate_headline` agent, passing the feedback so it can try again. This process repeats until a "tech-related" headline is generated. + +In ADK Workflows, loops allow for iterative refinement and evaluation by conditionally routing execution back to an earlier node in the sequence. + +## Sample Inputs + +- `flower` + +- `quantum mechanics` + +- `renewable energy` + +## Graph + +```mermaid +graph TD + START --> process_input + process_input --> generate_headline + generate_headline --> evaluate_headline + evaluate_headline --> route_headline + route_headline -->|unrelated| generate_headline + route_headline -->|tech-related| END[Loop ends] +``` + +## How To + +1. Define a node (like `route_headline`) that yields an `Event` with a specific route based on a condition: + + ```python + def route_headline(node_input: Feedback): + return Event(route=node_input.grade) + ``` + +1. In the `Workflow` edges definition, create a conditional edge that connects the routing node back to a previous node in the workflow, using a routing map dict: + + ```python + (route_headline, {"unrelated": generate_headline}) + ``` + + This creates the cycle. If the route yielded by `route_headline` is "unrelated", execution jumps back to `generate_headline`. diff --git a/contributing/samples/workflows/loop/agent.py b/contributing/samples/workflows/loop/agent.py new file mode 100644 index 0000000000..3b8ee65d76 --- /dev/null +++ b/contributing/samples/workflows/loop/agent.py @@ -0,0 +1,80 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Literal + +from google.adk import Agent +from google.adk import Event +from google.adk import Workflow +from pydantic import BaseModel +from pydantic import Field + + +class Feedback(BaseModel): + grade: Literal["tech-related", "unrelated"] = Field( + description=( + "Decide if the headline is related to technology or software" + " engineering." + ), + ) + feedback: str = Field( + description=( + "If the headline is unrelated to technology, provide feedback on how" + " to make it more tech-focused." + ), + ) + + +def process_input(node_input: str): + """Puts user input in the state.""" + return Event(state={"topic": node_input}) + + +generate_headline = Agent( + name="generate_headline", + instruction=""" + Write a headline about the topic "{topic}". + If feedback is provided, take it into account. + The feedback: {feedback?} + """, +) + + +evaluate_headline = Agent( + name="evaluate_headline", + instruction=""" + Grade whether the headline is related to technology or software engineering. + """, + output_schema=Feedback, + output_key="feedback", +) + + +def route_headline(node_input: Feedback): + return Event(route=node_input.grade) + + +root_agent = Workflow( + name="root_agent", + edges=[ + ( + "START", + process_input, + generate_headline, + evaluate_headline, + route_headline, + ), + (route_headline, {"unrelated": generate_headline}), + ], +) diff --git a/contributing/samples/workflows/loop/tests/computer.json b/contributing/samples/workflows/loop/tests/computer.json new file mode 100644 index 0000000000..8b6ae12999 --- /dev/null +++ b/contributing/samples/workflows/loop/tests/computer.json @@ -0,0 +1,94 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "computer" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "stateDelta": { + "topic": "computer" + } + }, + "author": "root_agent", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/process_input@1" + } + }, + { + "author": "generate_headline", + "content": { + "parts": [ + { + "text": "Computers: Shaping Our World" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/generate_headline@1" + ], + "path": "root_agent@1/generate_headline@1" + } + }, + { + "actions": { + "stateDelta": { + "feedback": { + "feedback": "This headline is clearly tech-related as it directly discusses computers.", + "grade": "tech-related" + } + } + }, + "author": "evaluate_headline", + "content": { + "parts": [ + { + "text": "{\"grade\": \"tech-related\", \"feedback\": \"This headline is clearly tech-related as it directly discusses computers.\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/evaluate_headline@1" + ], + "path": "root_agent@1/evaluate_headline@1" + } + }, + { + "actions": { + "route": "tech-related" + }, + "author": "root_agent", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/route_headline@1" + } + } + ] +} diff --git a/contributing/samples/workflows/loop/tests/flower.json b/contributing/samples/workflows/loop/tests/flower.json new file mode 100644 index 0000000000..26b42c8130 --- /dev/null +++ b/contributing/samples/workflows/loop/tests/flower.json @@ -0,0 +1,168 @@ +{ + "appName": "loop", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "flower" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "stateDelta": { + "topic": "flower" + } + }, + "author": "root_agent", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/process_input@1" + } + }, + { + "author": "generate_headline", + "content": { + "parts": [ + { + "text": "\"Petal Power: The Timeless Allure of Flowers\"" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/generate_headline@1" + ], + "path": "root_agent@1/generate_headline@1" + } + }, + { + "actions": { + "stateDelta": { + "feedback": { + "feedback": "To make this headline more tech-focused, consider incorporating elements like AI for plant recognition, robotics in gardening, biotechnology in horticulture, or data analytics related to flower cultivation and sales. For example, 'AI-Driven Botany: The Tech Unlocking Petal Power' or 'Smart Gardens: Engineering the Timeless Allure of Flowers'.", + "grade": "unrelated" + } + } + }, + "author": "evaluate_headline", + "content": { + "parts": [ + { + "text": "{\"grade\": \"unrelated\", \"feedback\": \"To make this headline more tech-focused, consider incorporating elements like AI for plant recognition, robotics in gardening, biotechnology in horticulture, or data analytics related to flower cultivation and sales. For example, 'AI-Driven Botany: The Tech Unlocking Petal Power' or 'Smart Gardens: Engineering the Timeless Allure of Flowers'.\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/evaluate_headline@1" + ], + "path": "root_agent@1/evaluate_headline@1" + } + }, + { + "actions": { + "route": "unrelated" + }, + "author": "root_agent", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/route_headline@1" + } + }, + { + "author": "generate_headline", + "content": { + "parts": [ + { + "text": "AI-Powered Petals: The Tech Revolution Blooming in Modern Floriculture" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/generate_headline@2" + ], + "path": "root_agent@1/generate_headline@2" + } + }, + { + "actions": { + "stateDelta": { + "feedback": { + "feedback": "This headline is strongly tech-related, explicitly mentioning 'AI-Powered' and 'Tech Revolution'. It effectively combines a traditional field (floriculture) with advanced technology.", + "grade": "tech-related" + } + } + }, + "author": "evaluate_headline", + "content": { + "parts": [ + { + "text": "{\"grade\": \"tech-related\", \"feedback\": \"This headline is strongly tech-related, explicitly mentioning 'AI-Powered' and 'Tech Revolution'. It effectively combines a traditional field (floriculture) with advanced technology.\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/evaluate_headline@2" + ], + "path": "root_agent@1/evaluate_headline@2" + } + }, + { + "actions": { + "route": "tech-related" + }, + "author": "root_agent", + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/route_headline@2" + } + } + ], + "id": "2779014d-3ee3-429e-951d-e69756ddf789", + "state": { + "__session_metadata__": { + "displayName": "flower" + }, + "feedback": { + "feedback": "This headline is already strongly tech-focused due to the explicit mention of AI and 'Tech Revolution'.", + "grade": "tech-related" + }, + "topic": "flower" + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/loop_config/README.md b/contributing/samples/workflows/loop_config/README.md new file mode 100644 index 0000000000..eb030705c4 --- /dev/null +++ b/contributing/samples/workflows/loop_config/README.md @@ -0,0 +1,48 @@ +# Workflow Loop Config Sample + +## Overview + +This sample demonstrates how to define a workflow with a feedback loop using a YAML configuration file. It mirrors the `workflow_samples/loop` sample, but uses YAML to define the workflow structure instead of Python. + +## Sample Inputs + +- `Python programming` + +- `Baking cookies` + +## Graph + +```mermaid +graph TD + START --> process_input[process_input] + process_input --> generate_headline[generate_headline.yaml] + generate_headline --> evaluate_headline[evaluate_headline.yaml] + evaluate_headline --> route_headline[route_headline] + route_headline -->|unrelated| generate_headline +``` + +## How To + +This sample uses some special syntax in `root_agent.yaml` to support dynamic resolution and graph construction: + +### 1. `_code` Suffix + +Fields ending with `_code` (like `output_schema_code` in `evaluate_headline.yaml`) tell the ADK YAML mapper to resolve the value as a Python code reference rather than treating it as a plain string. + +- If it starts with `.`, it resolves relative to the current agent directory's Python package path. +- Example: `output_schema_code: .agent.Feedback` resolves to the `Feedback` Pydantic model in `agent.py` in the same directory. + +### 2. Function References in Edges + +If a string in the edge list does not end with `.yaml` and is not `'START'`, it is treated as a function reference. + +- If it starts with `.`, it resolves relative to the current agent directory's Python package path. +- Example: `.agent.process_input` resolves to the `process_input` function in `agent.py`. +- It automatically creates a `FunctionNode` with the function's name as the node name. + +### 3. External Agent Files + +Agents can be defined in their own YAML files and referenced by filename in the edges list. + +- Example: `generate_headline.yaml` references the agent defined in that file. +- The mapper caches resolved nodes by their string value, so using the same filename in multiple edges correctly reuses the same agent instance, preserving the graph structure (e.g. for loops). diff --git a/contributing/samples/workflows/loop_config/agent.py b/contributing/samples/workflows/loop_config/agent.py new file mode 100644 index 0000000000..4b13e5c254 --- /dev/null +++ b/contributing/samples/workflows/loop_config/agent.py @@ -0,0 +1,43 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Literal + +from google.adk import Event +from pydantic import BaseModel +from pydantic import Field + + +class Feedback(BaseModel): + grade: Literal["tech-related", "unrelated"] = Field( + description=( + "Decide if the headline is related to technology or software" + " engineering." + ) + ) + feedback: str = Field( + description=( + "If the headline is unrelated to technology, provide feedback on how" + " to make it more tech-focused." + ) + ) + + +def process_input(node_input: str): + """Puts user input in the state.""" + return Event(state={"topic": node_input}) + + +def route_headline(node_input: Feedback): + return Event(route=node_input.grade) diff --git a/contributing/samples/workflows/loop_config/evaluate_headline.yaml b/contributing/samples/workflows/loop_config/evaluate_headline.yaml new file mode 100644 index 0000000000..e45ef95d2a --- /dev/null +++ b/contributing/samples/workflows/loop_config/evaluate_headline.yaml @@ -0,0 +1,6 @@ +agent_class: LlmAgent +name: evaluate_headline +instruction: | + Grade whether the headline is related to technology or software engineering. +output_schema_code: .agent.Feedback +output_key: feedback diff --git a/contributing/samples/workflows/loop_config/generate_headline.yaml b/contributing/samples/workflows/loop_config/generate_headline.yaml new file mode 100644 index 0000000000..9d62519de5 --- /dev/null +++ b/contributing/samples/workflows/loop_config/generate_headline.yaml @@ -0,0 +1,6 @@ +agent_class: LlmAgent +name: generate_headline +instruction: | + Write a headline about the topic "{topic}". + If feedback is provided, take it into account. + The feedback: {feedback?} diff --git a/contributing/samples/workflows/loop_config/root_agent.yaml b/contributing/samples/workflows/loop_config/root_agent.yaml new file mode 100644 index 0000000000..4b1a1f5bd7 --- /dev/null +++ b/contributing/samples/workflows/loop_config/root_agent.yaml @@ -0,0 +1,10 @@ +agent_class: Workflow +name: loop_workflow +edges: + - - START + - .agent.process_input + - generate_headline.yaml + - evaluate_headline.yaml + - .agent.route_headline + - - .agent.route_headline + - unrelated: generate_headline.yaml diff --git a/contributing/samples/workflows/loop_self/README.md b/contributing/samples/workflows/loop_self/README.md new file mode 100644 index 0000000000..0601cafa60 --- /dev/null +++ b/contributing/samples/workflows/loop_self/README.md @@ -0,0 +1,44 @@ +# ADK Workflow Loop Self Sample + +## Overview + +This sample demonstrates how a node can repeatedly loop back to itself based on a specific route condition in **ADK Workflows**. + +It takes a user-provided target number (between 0 and 10), and uses a `guess_number` function to randomly generate guesses. If the guess is incorrect, the function yields a specific route (`guessed_wrong`). The workflow is configured such that this route directs the execution right back to the `guess_number` node, creating a loop that continues until the correct number is guessed. + +In ADK Workflows, you can create self-referential loops or iterative processes by routing a node's output back to itself. + +## Sample Inputs + +- `5` + +- `0` + +- `10` + +## Graph + +```mermaid +graph TD + START --> validate_input + validate_input --> guess_number + guess_number -->|guessed_wrong| guess_number + guess_number -->|correct| END[Loop ends] +``` + +## How To + +1. From within your node (agent or function), yield a specific `Event` with a route name when you determine the node needs to be executed again: + + ```python + def guess_number(target_number: int): + # ... + if guess != target_number: + yield Event(route='guessed_wrong') + ``` + +1. In the `Workflow` edges definition, create a conditional edge where the source and target are the same node, using a routing map dict: + + ```python + (guess_number, {'guessed_wrong': guess_number}) + ``` diff --git a/contributing/samples/workflows/loop_self/agent.py b/contributing/samples/workflows/loop_self/agent.py new file mode 100644 index 0000000000..bc128aabeb --- /dev/null +++ b/contributing/samples/workflows/loop_self/agent.py @@ -0,0 +1,45 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import random + +from google.adk import Event +from google.adk import Workflow + + +def validate_input(node_input: str): + parsed_number = int(node_input) + if parsed_number > 10 or parsed_number < 0: + yield Event(message='Please provide a number between 0 and 10.') + raise ValueError('Invalid input.') + else: + yield Event(state={'target_number': parsed_number}) + + +def guess_number(target_number: int): + guess = random.randint(0, 10) + yield Event(message=f'Guessing {guess}...') + if guess == target_number: + yield Event(message='Correct!') + else: + yield Event(route='guessed_wrong') + + +root_agent = Workflow( + name='root_agent', + edges=[ + ('START', validate_input, guess_number), + (guess_number, {'guessed_wrong': guess_number}), + ], +) diff --git a/contributing/samples/workflows/loop_self/tests/3.json b/contributing/samples/workflows/loop_self/tests/3.json new file mode 100644 index 0000000000..0405447528 --- /dev/null +++ b/contributing/samples/workflows/loop_self/tests/3.json @@ -0,0 +1,191 @@ +{ + "appName": "loop_self", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "3" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "stateDelta": { + "target_number": 3 + } + }, + "author": "root_agent", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/validate_input@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Guessing 10..." + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/guess_number@1" + } + }, + { + "actions": { + "route": "guessed_wrong" + }, + "author": "root_agent", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/guess_number@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Guessing 1..." + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/guess_number@2" + } + }, + { + "actions": { + "route": "guessed_wrong" + }, + "author": "root_agent", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/guess_number@2" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Guessing 0..." + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/guess_number@3" + } + }, + { + "actions": { + "route": "guessed_wrong" + }, + "author": "root_agent", + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/guess_number@3" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Guessing 4..." + } + ], + "role": "user" + }, + "id": "e-9", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/guess_number@4" + } + }, + { + "actions": { + "route": "guessed_wrong" + }, + "author": "root_agent", + "id": "e-10", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/guess_number@4" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Guessing 3..." + } + ], + "role": "user" + }, + "id": "e-11", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/guess_number@5" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Correct!" + } + ], + "role": "user" + }, + "id": "e-12", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/guess_number@5" + } + } + ], + "id": "1f627a81-1341-43b7-b971-c8809ff8f6d1", + "mocks": { + "random.randint": [ + 10, + 1, + 0, + 4, + 3 + ] + }, + "state": { + "__session_metadata__": { + "displayName": "3" + }, + "target_number": 3 + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/message/README.md b/contributing/samples/workflows/message/README.md new file mode 100644 index 0000000000..6cd15eb0c4 --- /dev/null +++ b/contributing/samples/workflows/message/README.md @@ -0,0 +1,81 @@ +# ADK Workflow Message Sample + +## Overview + +This sample demonstrates different ways to send a message to a user using `Event(message=...)` within an **ADK Workflows** node. It covers: + +1. **String Messages**: Standard string text replies. +1. **Multi-modal Messages**: Returning mixed modality inputs, such as a string combined with an inline image. +1. **Multiple Messages**: Emitting multiple full messages from the same node with a delay between them. +1. **Streaming Messages**: Simulating an LLM streaming response by breaking a message into chunks and yielding them with the `partial=True` flag at intervals. + +## Sample Inputs + +This workflow executes sequentially and successfully without any expected user input. Since it has only one `Workflow` node chain that automatically progresses from `START`, you can just type anything (e.g. `start`) to kick it off. + +## Graph + +```mermaid +graph TD + START --> send_string + send_string --> send_multimodal + send_multimodal --> multiple_messages + multiple_messages --> stream_sentence + stream_sentence --> END[Workflow Ends] +``` + +## How To + +To send messages in an ADK node, yield an `Event` object with the `message` argument: + +1. **Send a simple string**: + + ```python + yield Event(message="Hello world!") + ``` + +1. **Send text with an image** (multi-modal): + + ```python + from google.genai import types + yield Event( + message=[ + types.Part.from_text(text="Look at this image:"), + types.Part.from_bytes(data=image_bytes, mime_type="image/png"), + ] + ) + ``` + +1. **Send multiple messages**: + To send multiple distinct messages from a single node, yield multiple `Event` objects sequentially. + + > **Note**: When yielding multiple messages with delays (`await asyncio.sleep(...)`), your node function **must be an asynchronous generator** (`async def`). This allows ADK to yield each message to the client immediately without blocking. + + ```python + import asyncio + + async def multiple_messages(node_input: Any = None): + yield Event(message="Processing step 1...") + await asyncio.sleep(1.0) + + yield Event(message="Processing step 2...") + await asyncio.sleep(1.0) + + yield Event(message="Done processing.") + ``` + +1. **Stream a message in chunks**: + Provide the `partial=True` flag for intermediate chunks. This provides a better user experience by allowing the UI to show the response in a streaming fashion, thereby lowering the latency to see the first word. ADK automatically accumulates all partial messages and merges them into a final message for you for session storage. + + > **Note**: To stream multiple messages or tokens smoothly, your node function **must be an asynchronous generator** (`async def`). This allows ADK to yield messages to the client immediately without blocking. + + ```python + import asyncio + + async def stream_sentence(node_input: str): + yield Event(message="How ", partial=True) + await asyncio.sleep(0.5) + yield Event(message="may I", partial=True) + await asyncio.sleep(0.5) + yield Event(message=" help you?", partial=True) + ``` diff --git a/contributing/samples/workflows/message/agent.py b/contributing/samples/workflows/message/agent.py new file mode 100644 index 0000000000..137c12f381 --- /dev/null +++ b/contributing/samples/workflows/message/agent.py @@ -0,0 +1,104 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import base64 +import os +from typing import Any + +from google.adk import Event +from google.adk import Workflow +from google.genai import types + + +async def sleep_if_not_pytest(seconds: float): + if "PYTEST_CURRENT_TEST" not in os.environ: + await asyncio.sleep(seconds) + + +def send_string(node_input: Any = None): + """Sends a single string message.""" + yield Event(message="#1 This is a simple string message.") + + +def send_multimodal(node_input: Any = None): + """Sends a multi-modal message containing a string and an inline image.""" + # A 16x16 solid red PNG base64 encoded + red_square_png = base64.b64decode( + "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAXElEQVR4nO2TSQ7AIAwD" + "7fz/z+ZQtapwmrJc8QklmjBIgZJgIZMiAIl9KYbhjx4fgwosbNxgMrF0+4uhgHnYDM6" + "AzQHJeg5HYtyHFfgy2AztN/5tZWfrBtVzkl4DzfQkEPd+cEkAAAAASUVORK5CYII=" + ) + yield Event( + message=[ + types.Part.from_text( + text=( + "#2 Here is a multi-modal message with an inline image (red" + " circle):" + ) + ), + types.Part.from_bytes(data=red_square_png, mime_type="image/png"), + ] + ) + + +async def multiple_messages(node_input: Any = None): + """Sends multiple complete messages from the same node with an interval.""" + yield Event(message="#3 Multiple messages") + await sleep_if_not_pytest(1.0) + + yield Event(message="Processing step 1...") + await sleep_if_not_pytest(1.0) + + yield Event(message="Processing step 2...") + await sleep_if_not_pytest(1.0) + + yield Event(message="Done processing.") + + +async def stream_sentence(node_input: Any = None): + """Demonstrates streaming by sending a sentence in chunks. + + The `partial=True` flag tells the UI that this is part of an ongoing message. + """ + yield Event(message="#4 Starting to stream...") + sentence = """\ +This is a streaming message sent in chunks. + +You can stream in markdown as well. For example, the table below: + +| Header 1 | Header 2 | +|----------|----------| +| Cell 1 | Cell 2 | +| Cell 3 | Cell 4 | +""" + + for i in range(0, len(sentence), 5): + chunk = sentence[i : i + 5] + yield Event(message=chunk, partial=True) + await sleep_if_not_pytest(0.2) + + +root_agent = Workflow( + name="message", + edges=[ + ( + "START", + send_string, + send_multimodal, + multiple_messages, + stream_sentence, + ), + ], +) diff --git a/contributing/samples/workflows/message/tests/go.json b/contributing/samples/workflows/message/tests/go.json new file mode 100644 index 0000000000..694a997855 --- /dev/null +++ b/contributing/samples/workflows/message/tests/go.json @@ -0,0 +1,146 @@ +{ + "appName": "message", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "go" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "message", + "content": { + "parts": [ + { + "text": "#1 This is a simple string message." + } + ], + "role": "user" + }, + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "message@1/send_string@1" + } + }, + { + "author": "message", + "content": { + "parts": [ + { + "text": "#2 Here is a multi-modal message with an inline image (red circle):" + }, + { + "inlineData": { + "data": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8_9hAAAAXElEQVR4nO2TSQ7AIAwD7fz_z-ZQtapwmrJc8QklmjBIgZJgIZMiAIl9KYbhjx4fgwosbNxgMrF0-4uhgHnYDM6AzQHJeg5HYtyHFfgy2AztN_5tZWfrBtVzkl4DzfQkEPd-cEkAAAAASUVORK5CYII=", + "mimeType": "image/png" + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "message@1/send_multimodal@1" + } + }, + { + "author": "message", + "content": { + "parts": [ + { + "text": "#3 Multiple messages" + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "message@1/multiple_messages@1" + } + }, + { + "author": "message", + "content": { + "parts": [ + { + "text": "Processing step 1..." + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "message@1/multiple_messages@1" + } + }, + { + "author": "message", + "content": { + "parts": [ + { + "text": "Processing step 2..." + } + ], + "role": "user" + }, + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "message@1/multiple_messages@1" + } + }, + { + "author": "message", + "content": { + "parts": [ + { + "text": "Done processing." + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "message@1/multiple_messages@1" + } + }, + { + "author": "message", + "content": { + "parts": [ + { + "text": "#4 Starting to stream..." + } + ], + "role": "user" + }, + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "path": "message@1/stream_sentence@1" + } + } + ], + "id": "9cfc0ef6-11d6-4260-84cf-be22731ab69e", + "state": { + "__session_metadata__": { + "displayName": "go" + } + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/multi_triggers/README.md b/contributing/samples/workflows/multi_triggers/README.md new file mode 100644 index 0000000000..7f2f7ea122 --- /dev/null +++ b/contributing/samples/workflows/multi_triggers/README.md @@ -0,0 +1,53 @@ +# ADK Workflow Multi-Triggers Sample + +## Overview + +This sample demonstrates how a single node can fan out to execute multiple downstream nodes concurrently, and how multiple upstream nodes can trigger a single downstream node independently in **ADK Workflows**. + +In this example, the `START` node fans out to three different processing functions (`make_uppercase`, `count_characters`, and `reverse_string`). Each of these functions receives the initial user input string, processes it, and then independently outputs its result. + +Because the subsequent `send_message` node receives a continuous flow of outputs and does not use an aggregation mechanism (like `JoinNode`), it is triggered multiple times—once for every upstream event. + +## Sample Inputs + +- `Hello World` + +- `ADK workflows` + +- `testing concurrent nodes` + +## Graph + +```mermaid +graph TD + START --> make_uppercase + START --> count_characters + START --> reverse_string + make_uppercase --> send_message + count_characters --> send_message + reverse_string --> send_message +``` + +## How To + +1. You can specify a tuple of nodes within an edge to create a parallel fan-out segment where the same input is provided to multiple nodes: + + ```python + ( + "START", + (make_uppercase, count_characters, reverse_string), + # ... + ) + ``` + +1. By continuing the sequence to another node after the tuple, the outputs of all nodes in the tuple will independently trigger that target node: + + ```python + ( + "START", + (make_uppercase, count_characters, reverse_string), + send_message, + ) + ``` + + In this case, `send_message` will be executed once for `make_uppercase`'s output, once for `count_characters`'s output, and once for `reverse_string`'s output. diff --git a/contributing/samples/workflows/multi_triggers/agent.py b/contributing/samples/workflows/multi_triggers/agent.py new file mode 100644 index 0000000000..0fd555a02a --- /dev/null +++ b/contributing/samples/workflows/multi_triggers/agent.py @@ -0,0 +1,45 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any + +from google.adk import Event +from google.adk import Workflow + + +def make_uppercase(node_input: str): + return node_input.upper() + + +def count_characters(node_input: str): + return len(node_input) + + +def reverse_string(node_input: str): + return node_input[::-1] + + +async def send_message(node_input: Any): + yield Event(message=f"Triggered for input: {node_input}") + + +root_agent = Workflow( + name="root_agent", + edges=[( + "START", + (make_uppercase, count_characters, reverse_string), + send_message, + )], + input_schema=str, +) diff --git a/contributing/samples/workflows/multi_triggers/tests/go.json b/contributing/samples/workflows/multi_triggers/tests/go.json new file mode 100644 index 0000000000..9d7e22cb1c --- /dev/null +++ b/contributing/samples/workflows/multi_triggers/tests/go.json @@ -0,0 +1,118 @@ +{ + "appName": "multi_triggers", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "go" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "branch": "make_uppercase@1", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/make_uppercase@1" + ], + "path": "root_agent@1/make_uppercase@1" + }, + "output": "GO" + }, + { + "author": "root_agent", + "branch": "count_characters@1", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/count_characters@1" + ], + "path": "root_agent@1/count_characters@1" + }, + "output": 2 + }, + { + "author": "root_agent", + "branch": "reverse_string@1", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/reverse_string@1" + ], + "path": "root_agent@1/reverse_string@1" + }, + "output": "og" + }, + { + "author": "root_agent", + "branch": "make_uppercase@1", + "content": { + "parts": [ + { + "text": "Triggered for input: GO" + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/send_message@1" + } + }, + { + "author": "root_agent", + "branch": "count_characters@1", + "content": { + "parts": [ + { + "text": "Triggered for input: 2" + } + ], + "role": "user" + }, + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/send_message@2" + } + }, + { + "author": "root_agent", + "branch": "reverse_string@1", + "content": { + "parts": [ + { + "text": "Triggered for input: og" + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/send_message@3" + } + } + ], + "id": "5cf6403e-fd4e-4fef-ad66-8ae78d26ba29", + "state": { + "__session_metadata__": { + "displayName": "go" + } + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/nested_workflow/README.md b/contributing/samples/workflows/nested_workflow/README.md new file mode 100644 index 0000000000..d6e6a5d993 --- /dev/null +++ b/contributing/samples/workflows/nested_workflow/README.md @@ -0,0 +1,64 @@ +# ADK Workflow Nested Workflow Sample + +## Overview + +This sample demonstrates how to compose workflows by embedding one workflow inside another as a single node in **ADK Workflows**. + +It takes a 4-digit year as input and performs two tasks in parallel: + +1. **Historical Event (`find_historical_event`)**: A straightforward Agent node that generates a 2-sentence description of an event that happened that year. +1. **Famous Person (`find_famous_person`)**: A nested Workflow that first finds a person born in that year (`find_name`), and then forwards that name to another agent to write a biography (`generate_bio`). + +From the perspective of the `root_agent` workflow, `find_famous_person` is just another node. The root workflow doesn't need to know the internal steps; it just waits for the parallel branches to finish, then synchronizes their outputs using a `JoinNode` before formatting them in `aggregate_results`. + +## Sample Inputs + +- `1969` + +- `2000` + +- `1984` + +## Graph + +### Root Workflow (`root_agent`) + +```mermaid +graph TD + START --> process_input + process_input --> find_historical_event[find_historical_event
        AGENT] + process_input --> find_famous_person[find_famous_person
        WORKFLOW] + find_historical_event --> join_for_aggregation[join_for_aggregation
        JOIN] + find_famous_person --> join_for_aggregation + join_for_aggregation --> aggregate_results +``` + +### Nested Workflow (`find_famous_person`) + +```mermaid +graph TD + START --> find_name + find_name --> generate_bio +``` + +## How To + +1. Define your sub-workflow just like any regular workflow. Ensure it accepts the required state (e.g., `year`) and outputs the expected state (e.g., `person_bio`). + + ```python + find_famous_person = Workflow( + name="find_famous_person", + edges=[("START", find_name, generate_bio)], + ) + ``` + +1. Treat the sub-workflow as a normal node when defining the edges of the parent workflow. To run them concurrently, place the nodes in a tuple, then use a `JoinNode` to synchronize their parallel executions before the final aggregation. + + ```python + root_agent = Workflow( + name="root_agent", + edges=[ + ("START", process_input, (find_famous_person, find_historical_event), join_for_aggregation, aggregate_results), + ], + ) + ``` diff --git a/contributing/samples/workflows/nested_workflow/__init__.py b/contributing/samples/workflows/nested_workflow/__init__.py new file mode 100644 index 0000000000..4015e47d6e --- /dev/null +++ b/contributing/samples/workflows/nested_workflow/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/workflows/nested_workflow/agent.py b/contributing/samples/workflows/nested_workflow/agent.py new file mode 100644 index 0000000000..217ef65735 --- /dev/null +++ b/contributing/samples/workflows/nested_workflow/agent.py @@ -0,0 +1,94 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# NOT WORKING YET + +import re + +from google.adk import Agent +from google.adk import Event +from google.adk import Workflow +from google.adk.workflow import JoinNode + + +def process_input(node_input: str): + """Validates the input is a valid 4-digit year.""" + match = re.search(r"\b\d{4}\b", node_input) + if not match: + yield Event(message="Please provide a valid 4-digit year (e.g., 1955).") + raise ValueError("Invalid year format.") + + yield Event(state={"year": match.group(0)}) + + +find_name = Agent( + name="find_name", + instruction=""" + Find the name of one famous person who was born in this year: {year}. + Return ONLY their name, nothing else. + """, +) + + +generate_bio = Agent( + name="generate_bio", + instruction=""" + Write a short, engaging 3-sentence biography for the specified person. + """, +) + + +# Sub-workflow that acts as a single node in the parent workflow +find_famous_person = Workflow( + name="find_famous_person", + edges=[("START", find_name, generate_bio)], +) + + +find_historical_event = Agent( + name="find_historical_event", + instruction=""" + Describe one highly significant historical event that occurred in this year: {year}. + Keep the description to 2 sentences. + """, +) + +join_for_aggregation = JoinNode(name="join_for_aggregation") + + +def aggregate_results(node_input: dict[str, str], year: str): + """Combines outputs from parallel branches found in context state.""" + + combined_message = ( + f"# Year: {year}\n\n" + "## Famous Person Bio:\n\n" + f"{node_input['find_famous_person']}\n\n" + "## Historical Event:\n\n" + f"{node_input['find_historical_event']}" + ) + yield Event(message=combined_message) + + +root_agent = Workflow( + name="root_agent", + edges=[ + ( + "START", + process_input, + (find_famous_person, find_historical_event), + join_for_aggregation, + aggregate_results, + ), + ], +) diff --git a/contributing/samples/workflows/nested_workflow/tests/1984.json b/contributing/samples/workflows/nested_workflow/tests/1984.json new file mode 100644 index 0000000000..740c526609 --- /dev/null +++ b/contributing/samples/workflows/nested_workflow/tests/1984.json @@ -0,0 +1,139 @@ +{ + "appName": "nested_workflow", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "1984" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "stateDelta": { + "year": "1984" + } + }, + "author": "root_agent", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/process_input@1" + } + }, + { + "author": "find_name", + "branch": "find_famous_person@1", + "content": { + "parts": [ + { + "text": "Scarlett Johansson" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/find_famous_person@1/find_name@1" + ], + "path": "root_agent@1/find_famous_person@1/find_name@1" + } + }, + { + "author": "generate_bio", + "branch": "find_famous_person@1", + "content": { + "parts": [ + { + "text": "Scarlett Johansson is an acclaimed actress renowned for her distinctive voice and versatile performances across a wide range of genres. From her captivating early roles in films like \"Lost in Translation\" to her iconic portrayal of Black Widow in the Marvel Cinematic Universe, she has consistently delivered powerful performances. A four-time Golden Globe nominee and two-time Academy Award nominee, she remains one of Hollywood's most bankable and respected stars." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/find_famous_person@1/generate_bio@1", + "root_agent@1/find_famous_person@1" + ], + "path": "root_agent@1/find_famous_person@1/generate_bio@1" + } + }, + { + "author": "find_historical_event", + "branch": "find_historical_event@1", + "content": { + "parts": [ + { + "text": "In December 1984, the Union Carbide chemical plant in Bhopal, India, experienced a catastrophic gas leak, releasing deadly methyl isocyanate. This disaster killed thousands instantly and caused hundreds of thousands of injuries, becoming one of the world's worst industrial accidents and a lasting symbol of corporate negligence." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/find_historical_event@1" + ], + "path": "root_agent@1/find_historical_event@1" + } + }, + { + "author": "root_agent", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/join_for_aggregation@1" + ], + "path": "root_agent@1/join_for_aggregation@1" + }, + "output": { + "find_famous_person": "Scarlett Johansson is an acclaimed actress renowned for her distinctive voice and versatile performances across a wide range of genres. From her captivating early roles in films like \"Lost in Translation\" to her iconic portrayal of Black Widow in the Marvel Cinematic Universe, she has consistently delivered powerful performances. A four-time Golden Globe nominee and two-time Academy Award nominee, she remains one of Hollywood's most bankable and respected stars.", + "find_historical_event": "In December 1984, the Union Carbide chemical plant in Bhopal, India, experienced a catastrophic gas leak, releasing deadly methyl isocyanate. This disaster killed thousands instantly and caused hundreds of thousands of injuries, becoming one of the world's worst industrial accidents and a lasting symbol of corporate negligence." + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "# Year: 1984\n\n## Famous Person Bio:\n\nScarlett Johansson is an acclaimed actress renowned for her distinctive voice and versatile performances across a wide range of genres. From her captivating early roles in films like \"Lost in Translation\" to her iconic portrayal of Black Widow in the Marvel Cinematic Universe, she has consistently delivered powerful performances. A four-time Golden Globe nominee and two-time Academy Award nominee, she remains one of Hollywood's most bankable and respected stars.\n\n## Historical Event:\n\nIn December 1984, the Union Carbide chemical plant in Bhopal, India, experienced a catastrophic gas leak, releasing deadly methyl isocyanate. This disaster killed thousands instantly and caused hundreds of thousands of injuries, becoming one of the world's worst industrial accidents and a lasting symbol of corporate negligence." + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/aggregate_results@1" + } + } + ], + "id": "b7848178-784d-4fe3-a11f-568b3419acb7", + "state": { + "__session_metadata__": { + "displayName": "1984" + } + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/node_output/README.md b/contributing/samples/workflows/node_output/README.md new file mode 100644 index 0000000000..0f6b70b7db --- /dev/null +++ b/contributing/samples/workflows/node_output/README.md @@ -0,0 +1,66 @@ +# ADK Workflow Node Output Sample + +## Overview + +This sample demonstrates how to manage component outputs and structure data between nodes in an **ADK Workflow**. + +When stringing nodes together, it's critical to know how the ADK framework passes data along edges. This sample shows: + +1. Returning a raw string (it gets automatically wrapped in an `Event`). +1. Returning an explicit `Event` for more granular control over routes and state. +1. Generating a structured dictionary via `Agent(output_schema=MyModel)`. +1. Automatically coercing that raw dictionary back into a fully formed Pydantic model simply by defining it as a type-hint parameter in the Python function. + +## Sample Inputs + +- `cyberpunk future` + +- `gardening tips for beginners` + +## Graph + +```mermaid +graph TD + START --> generate_string_output + generate_string_output --> generate_event_output + generate_event_output --> generate_pydantic_output + generate_pydantic_output --> consume_pydantic_output +``` + +## How To + +1. **Return raw types (string, dict, list):** The node runner will automatically wrap primitives in an `Event(output=...)`. + + ```python + def generate_string_output(node_input: str): + return "Processed input: " + node_input + ``` + +1. **Return an Event explicitly:** Use this when you also need to emit a `route` or modify `ctx.state`. + + ```python + def generate_event_output(node_input: str): + return Event(output=f"Wrapped output: {node_input}") + ``` + +1. **Generate structured data from an LLM:** Pass a Pydantic class to the `Agent`'s `output_schema`. The LLM returns a dictionary/JSON matching the structure. + + ```python + class TopicDetails(BaseModel): + title: str + description: str + category: str + + generate_pydantic_output = Agent( + name="generate_pydantic_output", + output_schema=TopicDetails, + ) + ``` + +1. **Consume structured data in a function:** Simply type-hint the parameter. `FunctionNode` leverages Pydantic to parse the dictionary back into your fully accessible `TopicDetails` class automatically before your function starts running. + + ```python + def consume_pydantic_output(node_input: TopicDetails): + # Type coercion converts dict to model. Now you have .title, .category, etc. + return f"Title: {node_input.title}" + ``` diff --git a/contributing/samples/workflows/node_output/agent.py b/contributing/samples/workflows/node_output/agent.py new file mode 100644 index 0000000000..34d5deea9f --- /dev/null +++ b/contributing/samples/workflows/node_output/agent.py @@ -0,0 +1,73 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# NOT WORKING YET +# Pending on correct output passing from LLM node + +from google.adk import Agent +from google.adk import Event +from google.adk import Workflow +from pydantic import BaseModel +from pydantic import Field + + +class TopicDetails(BaseModel): + title: str = Field(description="The title of the generated topic.") + description: str = Field(description="A short description of the topic.") + category: str = Field(description="The broad category of the topic.") + + +def generate_string_output(node_input: str): + """Returns a simple string. Framework automatically wraps it in an Event.""" + return f"Processed input: {node_input}" + + +def generate_event_output(node_input: str): + """Explicitly returns an Event object for more control.""" + return Event(output=f"Event wrapped output: {node_input}") + + +generate_pydantic_output = Agent( + name="generate_pydantic_output", + instruction="Generate a creative topic based on the following input.", + output_schema=TopicDetails, +) + + +def consume_pydantic_output(node_input: TopicDetails): + """Relying on the FunctionNode's automatic type parsing. + + The framework will coerce the dictionary or JSON into a TopicDetails object + automatically. + """ + return ( + "Received Pydantic Model!\n" + f"Title: {node_input.title}\n" + f"Description: {node_input.description}\n" + f"Category: {node_input.category}" + ) + + +root_agent = Workflow( + name="root_agent", + edges=[ + ( + "START", + generate_string_output, + generate_event_output, + generate_pydantic_output, + consume_pydantic_output, + ), + ], +) diff --git a/contributing/samples/workflows/node_output/tests/go.json b/contributing/samples/workflows/node_output/tests/go.json new file mode 100644 index 0000000000..3df7d48d53 --- /dev/null +++ b/contributing/samples/workflows/node_output/tests/go.json @@ -0,0 +1,86 @@ +{ + "appName": "node_output", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "go" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/generate_string_output@1" + ], + "path": "root_agent@1/generate_string_output@1" + }, + "output": "Processed input: go" + }, + { + "author": "root_agent", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/generate_event_output@1" + ], + "path": "root_agent@1/generate_event_output@1" + }, + "output": "Event wrapped output: Processed input: go" + }, + { + "author": "generate_pydantic_output", + "content": { + "parts": [ + { + "text": "{\"title\": \"The Impulse to Go: Decoding Humanity's Perpetual Motion\", \"description\": \"Investigating the fundamental human drive to 'go' - exploring its manifestations from ancient migrations and pioneering expeditions to the relentless pursuit of progress in science, technology, and personal growth, and what happens when we pause.\", \"category\": \"Human Behavior & Future Studies\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/generate_pydantic_output@1" + ], + "path": "root_agent@1/generate_pydantic_output@1" + } + }, + { + "author": "root_agent", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/consume_pydantic_output@1", + "root_agent@1" + ], + "path": "root_agent@1/consume_pydantic_output@1" + }, + "output": "Received Pydantic Model!\nTitle: The Impulse to Go: Decoding Humanity's Perpetual Motion\nDescription: Investigating the fundamental human drive to 'go' - exploring its manifestations from ancient migrations and pioneering expeditions to the relentless pursuit of progress in science, technology, and personal growth, and what happens when we pause.\nCategory: Human Behavior & Future Studies" + } + ], + "id": "82ce71ce-e580-4ae2-b291-f82e90221bbd", + "state": { + "__session_metadata__": { + "displayName": "go" + } + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/parallel_worker/README.md b/contributing/samples/workflows/parallel_worker/README.md new file mode 100644 index 0000000000..2dca76c261 --- /dev/null +++ b/contributing/samples/workflows/parallel_worker/README.md @@ -0,0 +1,69 @@ +# ADK Workflow Parallel Worker Sample + +## Overview + +This sample demonstrates how to use **parallel workers** in ADK Workflows. + +It takes a user-provided topic, uses an agent to find a list of related topics. The workflow engine will automatically fan-out execution across multiple concurrently running nodes when given an iterable of inputs. First, it dynamically spins up multiple instances of the `make_upper_case` function in parallel to capitalize the topics. Then, it dynamically spins up parallel instances of the `explain_topic` agent to explain each related topic concurrently. Finally, an `aggregate` function collects and formats all the parallel explanations into a single response. + +## Sample Inputs + +- `machine learning` + +- `renewable energy` + +- `space exploration` + +## Graph + +```mermaid +graph TD + START --> process_input + process_input --> find_related_topics + find_related_topics --> make_upper_case[make_upper_case
        parallel_worker=True] + + make_upper_case --> worker1[worker 1] + make_upper_case --> worker2[worker 2] + make_upper_case --> workerN[worker N] + + worker1 --> explain_topic[explain_topic
        parallel_worker=True] + worker2 --> explain_topic + workerN --> explain_topic + + explain_topic --> eworker1[worker 1] + explain_topic --> eworker2[worker 2] + explain_topic --> eworkerN[worker N] + + eworker1 --> aggregate + eworker2 --> aggregate + eworkerN --> aggregate +``` + +## How To + +Both agents and functions can be designed as parallel workers in an ADK Workflow. + +1. Ensure the preceding node in the workflow outputs an iterable (e.g., a `list`). The workflow engine will automatically fan-out and execute the parallel worker node concurrently for each item in the iterable. + +1. To define an **Agent** as a parallel worker, use the `parallel_worker=True` parameter: + + ```python + explain_topic = Agent( + name="explain_topic", + instruction="""Explain how the following topic relates to the original topic: "{topic}".""", + parallel_worker=True, + output_schema=TopicExplanation, + ) + ``` + +1. To define a **Python function** as a parallel worker, decorate it with `@node(parallel_worker=True)`: + + ```python + from google.adk.workflow import node + + @node(parallel_worker=True) + def make_upper_case(node_input: str): + yield node_input.upper() + ``` + +1. The subsequent node in the workflow will receive the results from all parallel executions as a single aggregated list (e.g., `list[TopicExplanation]`). diff --git a/contributing/samples/workflows/parallel_worker/agent.py b/contributing/samples/workflows/parallel_worker/agent.py new file mode 100644 index 0000000000..2b00b5ea85 --- /dev/null +++ b/contributing/samples/workflows/parallel_worker/agent.py @@ -0,0 +1,81 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# NOT WORKING YET + +from google.adk import Agent +from google.adk import Event +from google.adk import Workflow +from google.adk.workflow import node +from pydantic import BaseModel + + +class TopicExplanation(BaseModel): + topic: str + explanation: str + + +def process_input(node_input: str): + """Puts user input in the state.""" + return Event(state={"topic": node_input}) + + +find_related_topics = Agent( + name="find_related_topics", + instruction=( + 'Given the specific topic "{topic}", generate a list of 3 ' + "related topics." + ), + output_schema=list[str], +) + + +@node(parallel_worker=True) +def make_upper_case(node_input: str): + yield node_input.upper() + + +explain_topic = Agent( + name="explain_topic", + instruction=( + "Explain how the following topic relates the the original topic: " + '"{topic}".' + ), + parallel_worker=True, + output_schema=TopicExplanation, +) + + +def aggregate(node_input: list[TopicExplanation]): + return Event( + message="\n\n---\n\n".join( + f"{explanation.topic}: {explanation.explanation}" + for explanation in node_input + ), + ) + + +root_agent = Workflow( + name="root_agent", + edges=[ + ( + "START", + process_input, + find_related_topics, + make_upper_case, + explain_topic, + aggregate, + ), + ], +) diff --git a/contributing/samples/workflows/parallel_worker/tests/flower.json b/contributing/samples/workflows/parallel_worker/tests/flower.json new file mode 100644 index 0000000000..571b6208b9 --- /dev/null +++ b/contributing/samples/workflows/parallel_worker/tests/flower.json @@ -0,0 +1,225 @@ +{ + "appName": "parallel_worker", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "flower" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "stateDelta": { + "topic": "flower" + } + }, + "author": "root_agent", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/process_input@1" + } + }, + { + "author": "find_related_topics", + "content": { + "parts": [ + { + "text": "[\"gardening\", \"plants\", \"botany\"]" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/find_related_topics@1" + ], + "path": "root_agent@1/find_related_topics@1" + } + }, + { + "author": "root_agent", + "branch": "make_upper_case@1", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/make_upper_case@1/make_upper_case@1" + ], + "path": "root_agent@1/make_upper_case@1/make_upper_case@1" + }, + "output": "GARDENING" + }, + { + "author": "root_agent", + "branch": "make_upper_case@2", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/make_upper_case@1/make_upper_case@2" + ], + "path": "root_agent@1/make_upper_case@1/make_upper_case@2" + }, + "output": "PLANTS" + }, + { + "author": "root_agent", + "branch": "make_upper_case@3", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/make_upper_case@1/make_upper_case@3" + ], + "path": "root_agent@1/make_upper_case@1/make_upper_case@3" + }, + "output": "BOTANY" + }, + { + "author": "root_agent", + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/make_upper_case@1" + ], + "path": "root_agent@1/make_upper_case@1" + }, + "output": [ + "GARDENING", + "PLANTS", + "BOTANY" + ] + }, + { + "author": "explain_topic", + "branch": "explain_topic@1", + "content": { + "parts": [ + { + "text": "{\"topic\": \"GARDENING\", \"explanation\": \"Gardening is the practice of growing and cultivating plants, and flowers are a central element in many gardening practices. Gardeners often plant, nurture, and arrange flowers for their aesthetic beauty, fragrance, or to attract pollinators, making flowers an integral part of the gardening world.\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/explain_topic@1/explain_topic@1" + ], + "path": "root_agent@1/explain_topic@1/explain_topic@1" + } + }, + { + "author": "explain_topic", + "branch": "explain_topic@2", + "content": { + "parts": [ + { + "text": "{\"topic\": \"PLANTS\", \"explanation\": \"A flower is a reproductive part of many types of plants. Plants are the larger biological kingdom to which flowers belong, as flowers grow on and are integral components of flowering plants (angiosperms).\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-9", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/explain_topic@1/explain_topic@2" + ], + "path": "root_agent@1/explain_topic@1/explain_topic@2" + } + }, + { + "author": "explain_topic", + "branch": "explain_topic@3", + "content": { + "parts": [ + { + "text": "{\"topic\": \"BOTANY\", \"explanation\": \"Botany is the scientific study of plants, including their structure, growth, reproduction, metabolism, development, diseases, and chemical properties. Flowers are the reproductive organs of many plants, specifically angiosperms, and are therefore a primary subject of study within botany, with botanists analyzing their morphology, physiology, ecology, and evolutionary significance.\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-10", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/explain_topic@1/explain_topic@3" + ], + "path": "root_agent@1/explain_topic@1/explain_topic@3" + } + }, + { + "author": "root_agent", + "id": "e-11", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/explain_topic@1" + ], + "path": "root_agent@1/explain_topic@1" + }, + "output": [ + { + "explanation": "Gardening is the practice of growing and cultivating plants, and flowers are a central element in many gardening practices. Gardeners often plant, nurture, and arrange flowers for their aesthetic beauty, fragrance, or to attract pollinators, making flowers an integral part of the gardening world.", + "topic": "GARDENING" + }, + { + "explanation": "A flower is a reproductive part of many types of plants. Plants are the larger biological kingdom to which flowers belong, as flowers grow on and are integral components of flowering plants (angiosperms).", + "topic": "PLANTS" + }, + { + "explanation": "Botany is the scientific study of plants, including their structure, growth, reproduction, metabolism, development, diseases, and chemical properties. Flowers are the reproductive organs of many plants, specifically angiosperms, and are therefore a primary subject of study within botany, with botanists analyzing their morphology, physiology, ecology, and evolutionary significance.", + "topic": "BOTANY" + } + ] + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "GARDENING: Gardening is the practice of growing and cultivating plants, and flowers are a central element in many gardening practices. Gardeners often plant, nurture, and arrange flowers for their aesthetic beauty, fragrance, or to attract pollinators, making flowers an integral part of the gardening world.\n\n---\n\nPLANTS: A flower is a reproductive part of many types of plants. Plants are the larger biological kingdom to which flowers belong, as flowers grow on and are integral components of flowering plants (angiosperms).\n\n---\n\nBOTANY: Botany is the scientific study of plants, including their structure, growth, reproduction, metabolism, development, diseases, and chemical properties. Flowers are the reproductive organs of many plants, specifically angiosperms, and are therefore a primary subject of study within botany, with botanists analyzing their morphology, physiology, ecology, and evolutionary significance." + } + ], + "role": "user" + }, + "id": "e-12", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/aggregate@1" + } + } + ], + "id": "70e3790b-df94-4567-93c9-3c60abc6a4e6", + "state": { + "__session_metadata__": { + "displayName": "flower" + }, + "topic": "flower" + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/request_input/README.md b/contributing/samples/workflows/request_input/README.md new file mode 100644 index 0000000000..6a42e3bf54 --- /dev/null +++ b/contributing/samples/workflows/request_input/README.md @@ -0,0 +1,66 @@ +# ADK Workflow Request Input Sample + +## Overview + +This sample demonstrates how to create a **Human-in-the-Loop** workflow in **ADK Workflows** using the `RequestInput` event. + +It shows a customer support scenario where an LLM agent (`draft_email`) drafts a response to a customer complaint. The workflow then halts execution and prompts a human user for review (`request_human_review`). Depending on the human's input (`approve`, `reject`, or custom feedback), the workflow either completes, aborts, or loops back to the AI for revisions. + +This pattern is crucial for tasks where AI actions require human verification before proceeding. + +## Sample Inputs + +- `My phone battery drains too fast` + +- `I never received my order` + +- `The software crashes when I open the settings` + +## Graph + +```mermaid +graph TD + START --> draft_email + draft_email --> request_human_review + request_human_review --> handle_human_review + handle_human_review -->|revise| draft_email + handle_human_review -->|approved| send_email + handle_human_review -->|rejected| END_rejected[END rejected] +``` + +## How To + +1. Yield a `RequestInput` event from a node to halt the workflow and prompt the user for input. + + ```python + from google.adk.events import RequestInput + + def request_human_review(draft: str): + yield RequestInput( + message="Please review the draft...", + ) + ``` + +1. The subsequent node will receive the user's input as its argument (`node_input`). You can use this input to determine the next routing step. + + ```python + def handle_human_review(node_input: str): + if node_input == "approve": + yield Event(route="approved") + elif node_input == "reject": + yield Event(route="rejected") + else: + yield Event(state={"feedback": node_input}, route="revise") + ``` + +1. Define the edges in your workflow to handle the different routes, including looping back for revisions. + + ```python + Workflow( + name="request_input", + edges=[ + ("START", ..., draft_email, request_human_review, handle_human_review), + (handle_human_review, {"revise": draft_email, "approved": send_email}), + ], + ) + ``` diff --git a/contributing/samples/workflows/request_input/agent.py b/contributing/samples/workflows/request_input/agent.py new file mode 100644 index 0000000000..ca2b98ca81 --- /dev/null +++ b/contributing/samples/workflows/request_input/agent.py @@ -0,0 +1,84 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# NOT WORKING YET + +from google.adk import Agent +from google.adk import Event +from google.adk import Workflow +from google.adk.events import RequestInput + + +def process_input(node_input: str): + """Takes the initial customer complaint as input and sets it in the state.""" + yield Event(state={"complaint": node_input, "feedback": ""}) + + +draft_email = Agent( + name="draft_email", + instruction=""" + Please write a polite, helpful response email to the following customer complaint: "{complaint}" + + If there is any feedback from the manager to revise the draft, please incorporate it: "{feedback?}" + """, + output_key="draft", +) + + +def request_human_review(draft: str): + yield RequestInput( + message=( + "Please review the following draft email and provide 'approve'," + f" 'reject', or feedback to revise.\n\n---\n{draft}\n---" + ), + ) + + +def handle_human_review(node_input: str): + if node_input == "reject": + yield Event(route="rejected") + elif node_input == "approve": + yield Event(route="approved") + else: + yield Event(state={"feedback": node_input}, route="revise") + + +def reject_email(): + yield Event(message="Draft rejected.") + + +def send_email(draft: str): + yield Event(message="Draft approved and sent successfully.") + + +root_agent = Workflow( + name="request_input", + edges=[ + ( + "START", + process_input, + draft_email, + request_human_review, + handle_human_review, + ), + ( + handle_human_review, + { + "revise": draft_email, + "approved": send_email, + "rejected": reject_email, + }, + ), + ], +) diff --git a/contributing/samples/workflows/request_input/tests/phone_broke.json b/contributing/samples/workflows/request_input/tests/phone_broke.json new file mode 100644 index 0000000000..cecebf7269 --- /dev/null +++ b/contributing/samples/workflows/request_input/tests/phone_broke.json @@ -0,0 +1,236 @@ +{ + "appName": "request_input", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "phone broke" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "stateDelta": { + "complaint": "phone broke", + "feedback": "" + } + }, + "author": "request_input", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "request_input@1/process_input@1" + } + }, + { + "actions": { + "stateDelta": { + "draft": "Subject: Regarding Your Phone Issue - How We Can Help\n\nDear Customer,\n\nWe're very sorry to hear that your phone has broken. We understand how frustrating and disruptive this can be.\n\nTo help us understand what happened and assist you as quickly and efficiently as possible, could you please provide a few more details?\n\nPlease tell us:\n* **What is the make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n* **When did the phone break, and what happened?** (e.g., dropped it, it got wet, stopped turning on suddenly, screen went blank, etc.)\n* **When and where was the phone purchased?** (This helps us determine warranty status.)\n* **Have you already tried any troubleshooting steps?** (e.g., restarting, charging, etc.)\n\nOnce we have this information, we can guide you through the appropriate next steps, which may include troubleshooting, repair options, or warranty claims.\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call our support team at [Your Company Phone Number] during our business hours [Business Hours, e.g., Monday-Friday, 9 AM - 5 PM EST].\n\nWe're here to help get your phone back up and running as quickly as possible.\n\nThank you for your patience.\n\nSincerely,\n\nThe [Your Company Name] Support Team" + } + }, + "author": "draft_email", + "content": { + "parts": [ + { + "text": "Subject: Regarding Your Phone Issue - How We Can Help\n\nDear Customer,\n\nWe're very sorry to hear that your phone has broken. We understand how frustrating and disruptive this can be.\n\nTo help us understand what happened and assist you as quickly and efficiently as possible, could you please provide a few more details?\n\nPlease tell us:\n* **What is the make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n* **When did the phone break, and what happened?** (e.g., dropped it, it got wet, stopped turning on suddenly, screen went blank, etc.)\n* **When and where was the phone purchased?** (This helps us determine warranty status.)\n* **Have you already tried any troubleshooting steps?** (e.g., restarting, charging, etc.)\n\nOnce we have this information, we can guide you through the appropriate next steps, which may include troubleshooting, repair options, or warranty claims.\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call our support team at [Your Company Phone Number] during our business hours [Business Hours, e.g., Monday-Friday, 9 AM - 5 PM EST].\n\nWe're here to help get your phone back up and running as quickly as possible.\n\nThank you for your patience.\n\nSincerely,\n\nThe [Your Company Name] Support Team" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "request_input@1/draft_email@1" + ], + "path": "request_input@1/draft_email@1" + } + }, + { + "author": "request_input", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "interruptId": "fc-1", + "message": "Please review the following draft email and provide 'approve', 'reject', or feedback to revise.\n\n---\nSubject: Regarding Your Phone Issue - How We Can Help\n\nDear Customer,\n\nWe're very sorry to hear that your phone has broken. We understand how frustrating and disruptive this can be.\n\nTo help us understand what happened and assist you as quickly and efficiently as possible, could you please provide a few more details?\n\nPlease tell us:\n* **What is the make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n* **When did the phone break, and what happened?** (e.g., dropped it, it got wet, stopped turning on suddenly, screen went blank, etc.)\n* **When and where was the phone purchased?** (This helps us determine warranty status.)\n* **Have you already tried any troubleshooting steps?** (e.g., restarting, charging, etc.)\n\nOnce we have this information, we can guide you through the appropriate next steps, which may include troubleshooting, repair options, or warranty claims.\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call our support team at [Your Company Phone Number] during our business hours [Business Hours, e.g., Monday-Friday, 9 AM - 5 PM EST].\n\nWe're here to help get your phone back up and running as quickly as possible.\n\nThank you for your patience.\n\nSincerely,\n\nThe [Your Company Name] Support Team\n---", + "payload": null, + "response_schema": null + }, + "id": "fc-1", + "name": "adk_request_input" + } + } + ] + }, + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-1" + ], + "nodeInfo": { + "path": "request_input@1/request_human_review@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "adk_request_input", + "response": { + "result": "shorter" + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "route": "revise", + "stateDelta": { + "feedback": "shorter" + } + }, + "author": "request_input", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "request_input@1/handle_human_review@1" + } + }, + { + "actions": { + "stateDelta": { + "draft": "Subject: Your Phone Issue - How We Can Help\n\nDear Customer,\n\nWe're sorry to hear your phone has broken. To help us assist you quickly, please provide the following details:\n\n* **Make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n* **When and how did it break?** (e.g., dropped, got wet, stopped turning on)\n* **When and where was it purchased?** (This helps with warranty)\n* **Have you tried any troubleshooting steps?** (e.g., restarting, charging)\n\nOnce we have this information, we can guide you through the appropriate next steps.\n\nPlease reply to this email with the requested details, or call our support team at [Your Company Phone Number] during [Business Hours] if you prefer to speak directly.\n\nWe look forward to helping you.\n\nSincerely,\n\nThe [Your Company Name] Support Team" + } + }, + "author": "draft_email", + "content": { + "parts": [ + { + "text": "Subject: Your Phone Issue - How We Can Help\n\nDear Customer,\n\nWe're sorry to hear your phone has broken. To help us assist you quickly, please provide the following details:\n\n* **Make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n* **When and how did it break?** (e.g., dropped, got wet, stopped turning on)\n* **When and where was it purchased?** (This helps with warranty)\n* **Have you tried any troubleshooting steps?** (e.g., restarting, charging)\n\nOnce we have this information, we can guide you through the appropriate next steps.\n\nPlease reply to this email with the requested details, or call our support team at [Your Company Phone Number] during [Business Hours] if you prefer to speak directly.\n\nWe look forward to helping you.\n\nSincerely,\n\nThe [Your Company Name] Support Team" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "request_input@1/draft_email@2" + ], + "path": "request_input@1/draft_email@2" + } + }, + { + "author": "request_input", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "interruptId": "fc-2", + "message": "Please review the following draft email and provide 'approve', 'reject', or feedback to revise.\n\n---\nSubject: Your Phone Issue - How We Can Help\n\nDear Customer,\n\nWe're sorry to hear your phone has broken. To help us assist you quickly, please provide the following details:\n\n* **Make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n* **When and how did it break?** (e.g., dropped, got wet, stopped turning on)\n* **When and where was it purchased?** (This helps with warranty)\n* **Have you tried any troubleshooting steps?** (e.g., restarting, charging)\n\nOnce we have this information, we can guide you through the appropriate next steps.\n\nPlease reply to this email with the requested details, or call our support team at [Your Company Phone Number] during [Business Hours] if you prefer to speak directly.\n\nWe look forward to helping you.\n\nSincerely,\n\nThe [Your Company Name] Support Team\n---", + "payload": null, + "response_schema": null + }, + "id": "fc-2", + "name": "adk_request_input" + } + } + ] + }, + "id": "e-8", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-2" + ], + "nodeInfo": { + "path": "request_input@1/request_human_review@2" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "adk_request_input", + "response": { + "result": "approve" + } + } + } + ], + "role": "user" + }, + "id": "e-9", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "route": "approved" + }, + "author": "request_input", + "id": "e-10", + "invocationId": "i-1", + "nodeInfo": { + "path": "request_input@1/handle_human_review@2" + } + }, + { + "author": "request_input", + "content": { + "parts": [ + { + "text": "Draft approved and sent successfully." + } + ], + "role": "user" + }, + "id": "e-11", + "invocationId": "i-1", + "nodeInfo": { + "path": "request_input@1/send_email@1" + } + } + ], + "id": "cbd1b977-915d-4000-a8f8-f1c747fd3d0e", + "state": { + "__session_metadata__": { + "displayName": "phone broke" + }, + "complaint": "phone broke", + "draft": "Subject: Regarding Your Phone Issue\n\nDear [Customer Name],\n\nI'm sorry to hear your phone has broken. I understand how inconvenient this must be.\n\nTo help us investigate and find the best solution for you, please reply with details about your phone (model, purchase date) and what happened. If you have an order number, please include that too.\n\nWe're ready to assist you further once we have this information.\n\nSincerely,\n[Your Name/Company Support Team]", + "feedback": "shorter" + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/request_input/tests/phone_broke_reject.json b/contributing/samples/workflows/request_input/tests/phone_broke_reject.json new file mode 100644 index 0000000000..3174457aa5 --- /dev/null +++ b/contributing/samples/workflows/request_input/tests/phone_broke_reject.json @@ -0,0 +1,136 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "phone broke" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "stateDelta": { + "complaint": "phone broke", + "feedback": "" + } + }, + "author": "request_input", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "request_input@1/process_input@1" + } + }, + { + "actions": { + "stateDelta": { + "draft": "Subject: Regarding Your Phone Issue – We're Here to Help\n\nDear Customer,\n\nThank you for reaching out. I'm very sorry to hear that your phone has broken. I understand how disruptive and frustrating it can be when your primary device isn't working as it should.\n\nTo help us understand the best way to assist you with a repair or replacement, could you please provide us with a few more details?\n\n1. **What is the make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n2. **When did you purchase the phone?** (This helps us check warranty status.)\n3. **Can you briefly describe what happened or how it broke?** (e.g., dropped, water damage, stopped turning on, screen issues)\n4. **Have you already tried any troubleshooting steps?** (e.g., restarting, charging)\n\nOnce we have this information, we can guide you through the next steps, which may include:\n* **Warranty Service:** If your phone is still under warranty and the damage is covered.\n* **Repair Options:** Providing details on how to send your device for repair.\n* **Replacement Options:** Discussing potential replacement pathways.\n\nIn the meantime, you can also visit our dedicated support page for common issues and troubleshooting at [Link to your support/repair page, e.g., www.yourcompany.com/support/repairs].\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call us at [Your Customer Service Phone Number] during business hours.\n\nWe appreciate your patience and look forward to helping you get this resolved as quickly as possible.\n\nSincerely,\n\nThe [Your Company Name] Support Team" + } + }, + "author": "draft_email", + "content": { + "parts": [ + { + "text": "Subject: Regarding Your Phone Issue – We're Here to Help\n\nDear Customer,\n\nThank you for reaching out. I'm very sorry to hear that your phone has broken. I understand how disruptive and frustrating it can be when your primary device isn't working as it should.\n\nTo help us understand the best way to assist you with a repair or replacement, could you please provide us with a few more details?\n\n1. **What is the make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n2. **When did you purchase the phone?** (This helps us check warranty status.)\n3. **Can you briefly describe what happened or how it broke?** (e.g., dropped, water damage, stopped turning on, screen issues)\n4. **Have you already tried any troubleshooting steps?** (e.g., restarting, charging)\n\nOnce we have this information, we can guide you through the next steps, which may include:\n* **Warranty Service:** If your phone is still under warranty and the damage is covered.\n* **Repair Options:** Providing details on how to send your device for repair.\n* **Replacement Options:** Discussing potential replacement pathways.\n\nIn the meantime, you can also visit our dedicated support page for common issues and troubleshooting at [Link to your support/repair page, e.g., www.yourcompany.com/support/repairs].\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call us at [Your Customer Service Phone Number] during business hours.\n\nWe appreciate your patience and look forward to helping you get this resolved as quickly as possible.\n\nSincerely,\n\nThe [Your Company Name] Support Team" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "request_input@1/draft_email@1" + ], + "path": "request_input@1/draft_email@1" + } + }, + { + "author": "request_input", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "interruptId": "fc-1", + "message": "Please review the following draft email and provide 'approve', 'reject', or feedback to revise.\n\n---\nSubject: Regarding Your Phone Issue – We're Here to Help\n\nDear Customer,\n\nThank you for reaching out. I'm very sorry to hear that your phone has broken. I understand how disruptive and frustrating it can be when your primary device isn't working as it should.\n\nTo help us understand the best way to assist you with a repair or replacement, could you please provide us with a few more details?\n\n1. **What is the make and model of your phone?** (e.g., iPhone 13, Samsung Galaxy S22)\n2. **When did you purchase the phone?** (This helps us check warranty status.)\n3. **Can you briefly describe what happened or how it broke?** (e.g., dropped, water damage, stopped turning on, screen issues)\n4. **Have you already tried any troubleshooting steps?** (e.g., restarting, charging)\n\nOnce we have this information, we can guide you through the next steps, which may include:\n* **Warranty Service:** If your phone is still under warranty and the damage is covered.\n* **Repair Options:** Providing details on how to send your device for repair.\n* **Replacement Options:** Discussing potential replacement pathways.\n\nIn the meantime, you can also visit our dedicated support page for common issues and troubleshooting at [Link to your support/repair page, e.g., www.yourcompany.com/support/repairs].\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call us at [Your Customer Service Phone Number] during business hours.\n\nWe appreciate your patience and look forward to helping you get this resolved as quickly as possible.\n\nSincerely,\n\nThe [Your Company Name] Support Team\n---", + "payload": null, + "response_schema": null + }, + "id": "fc-1", + "name": "adk_request_input" + } + } + ] + }, + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-1" + ], + "nodeInfo": { + "path": "request_input@1/request_human_review@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "adk_request_input", + "response": { + "result": "reject" + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "route": "rejected" + }, + "author": "request_input", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "request_input@1/handle_human_review@1" + } + }, + { + "author": "request_input", + "content": { + "parts": [ + { + "text": "Draft rejected." + } + ], + "role": "user" + }, + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "path": "request_input@1/reject_email@1" + } + } + ] +} diff --git a/contributing/samples/workflows/request_input_advanced/README.md b/contributing/samples/workflows/request_input_advanced/README.md new file mode 100644 index 0000000000..476bf819c7 --- /dev/null +++ b/contributing/samples/workflows/request_input_advanced/README.md @@ -0,0 +1,76 @@ +# ADK Workflow Request Input Advanced Sample + +## Overview + +This sample demonstrates advanced features for requesting Human-in-the-Loop (HITL) input dynamically during an **ADK Workflow** execution. + +Specifically, it highlights how to pass structured data to the client UI using the `payload` parameter, and how to mandate a structured response type using the `response_schema` parameter on the yielded `RequestInput` event. + +In this scenario, an employee requests time off by providing a natural language description of their request (e.g., "I need next Monday off to go to the dentist"). + +- An LLM agent (`process_request`) parses the natural language into a structured Pydantic model containing the number of `days` and a `reason`. +- A python node (`evaluate_request`) evaluates the parsed request: + - If `days <= 1`, it yields a `TimeOffDecision` approving the request. + - If `days > 1`, it yields a `RequestInput` to a manager. It attaches the request details to the `payload` so the client UI can render it. It enforces that the manager must respond with a JSON object containing an `approved` boolean and an optional `approved_days` integer by specifying `response_schema` with a valid Pydantic JSON schema. + +## Sample Inputs + +Start the workflow by providing the initial time off request in natural language: + +- `I'm feeling under the weather and need to take today off.` + + *Parses as 1 day, auto-approves.* + +- `Taking my family to Disney World, I'll be out for 5 days next week.` + + *Parses as 5 days, routes to manager review.* + +When the terminal prompts you as the manager, provide valid JSON matching the schema: + +- `{"approved": true, "approved_days": 5}` + +- `{"approved": false, "approved_days": 0}` + +## Graph + +```mermaid +graph TD + START --> process_request[process_request
        LLM Agent] + process_request --> evaluate_request + evaluate_request -->|Yields TimeOffDecision OR RequestInput| process_decision + process_decision --> END[END] +``` + +## How To + +1. **Define the Response Schema:** Use a Pydantic model's `model_json_schema()` to get a standard layout of what the human should return. + + ```python + from typing import Optional + from pydantic import BaseModel, Field + + class TimeOffDecision(BaseModel): + approved: bool = Field(...) + approved_days: Optional[int] = Field(None) + ``` + +1. **Yield a RequestInput:** Pass the schema and optionally a `payload` for the client to display. + + ```python + def evaluate_request(request: TimeOffRequest): + # ... logic to check if manager review is needed ... + yield RequestInput( + interrupt_id="manager_approval", + message="Please review this time off request.", + payload=request, + response_schema=TimeOffDecision.model_json_schema() + ) + ``` + +1. **Parse the Resumed Input:** When the workflow resumes, the `node_input` to the next node will be the parsed Pydantic model implicitly (if type-hinted). + + ```python + def process_decision(request: TimeOffRequest, node_input: TimeOffDecision): + if node_input.approved: + # ... + ``` diff --git a/contributing/samples/workflows/request_input_advanced/agent.py b/contributing/samples/workflows/request_input_advanced/agent.py new file mode 100644 index 0000000000..e8a90c8d5a --- /dev/null +++ b/contributing/samples/workflows/request_input_advanced/agent.py @@ -0,0 +1,85 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Optional + +from google.adk import Agent +from google.adk import Event +from google.adk import Workflow +from google.adk.events import RequestInput +from pydantic import BaseModel +from pydantic import Field + + +class TimeOffRequest(BaseModel): + days: int = Field(description="Number of days requested.") + reason: str = Field(description="Reason for the time off.") + + +class TimeOffDecision(BaseModel): + """The structured response we expect back from the human manager.""" + + approved: bool = Field(description="Whether the time off is approved.") + approved_days: Optional[int] = Field( + default=None, description="Number of days approved." + ) + + +process_request = Agent( + name="process_request", + instruction=( + "Extract the number of days and the reason from the user's natural" + " language time off request." + ), + output_schema=TimeOffRequest, + output_key="request", +) + + +def evaluate_request(request: TimeOffRequest): + """If days <= 1, it's auto-approved. Otherwise, routes to manager review.""" + if request.days <= 1: + return TimeOffDecision(approved=True) + else: + return RequestInput( + interrupt_id="manager_approval", + message="Please review this time off request.", + payload=request, + response_schema=TimeOffDecision, + ) + + +def process_decision(request: TimeOffRequest, node_input: TimeOffDecision): + if node_input.approved: + approved_days = ( + node_input.approved_days + if node_input.approved_days is not None + else request.days + ) + message = ( + f"Time Off Approved! {approved_days} out of {request.days} days" + " granted." + ) + else: + message = "Time Off Denied." + + yield Event(message=message) + + +root_agent = Workflow( + name="request_input_advanced", + edges=[ + ("START", process_request, evaluate_request, process_decision), + ], +) diff --git a/contributing/samples/workflows/request_input_advanced/tests/2_sick_days.json b/contributing/samples/workflows/request_input_advanced/tests/2_sick_days.json new file mode 100644 index 0000000000..a042a1b8f7 --- /dev/null +++ b/contributing/samples/workflows/request_input_advanced/tests/2_sick_days.json @@ -0,0 +1,156 @@ +{ + "appName": "request_input_advanced", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "2 sick days" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "stateDelta": { + "request": { + "days": 2, + "reason": "sick" + } + } + }, + "author": "process_request", + "content": { + "parts": [ + { + "text": "{\"days\":2,\"reason\":\"sick\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "request_input_advanced@1/process_request@1" + ], + "path": "request_input_advanced@1/process_request@1" + } + }, + { + "author": "request_input_advanced", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "interruptId": "fc-1", + "message": "Please review this time off request.", + "payload": { + "days": 2, + "reason": "sick" + }, + "response_schema": { + "description": "The structured response we expect back from the human manager.", + "properties": { + "approved": { + "description": "Whether the time off is approved.", + "title": "Approved", + "type": "boolean" + }, + "approved_days": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Number of days approved.", + "title": "Approved Days" + } + }, + "required": [ + "approved" + ], + "title": "TimeOffDecision", + "type": "object" + } + }, + "id": "fc-1", + "name": "adk_request_input" + } + } + ] + }, + "id": "e-3", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-1" + ], + "nodeInfo": { + "path": "request_input_advanced@1/evaluate_request@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "adk_request_input", + "response": { + "result": "{\"approved\": true}" + } + } + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "request_input_advanced", + "content": { + "parts": [ + { + "text": "Time Off Approved! 2 out of 2 days granted." + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "request_input_advanced@1/process_decision@1" + } + } + ], + "id": "131bfe8b-de90-47bd-b442-957f27dc58a6", + "state": { + "__session_metadata__": { + "displayName": "2 sick days" + }, + "request": { + "days": 2, + "reason": "sick days" + } + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/request_input_rerun/README.md b/contributing/samples/workflows/request_input_rerun/README.md new file mode 100644 index 0000000000..d0372118ba --- /dev/null +++ b/contributing/samples/workflows/request_input_rerun/README.md @@ -0,0 +1,86 @@ +# ADK Workflow Request Input Rerun Sample + +## Overview + +This sample demonstrates an alternative way to handle a **Human-in-the-Loop** workflow in **ADK Workflows** using the `RequestInput` event combined with the `@node(rerun_on_resume=True)` decorator. + +Like the standard `request_input` sample, this workflow simulates a customer support scenario where an AI drafts an email and a human reviews it. The key difference lies in *how* the human input is processed when the workflow resumes. + +### `request_input` vs `request_input_rerun` + +- **Standard (`request_input`):** The workflow pauses after a node yields `RequestInput`. When the user provides input and execution resumes, the input is automatically passed as the argument to the **next node** in the edge definition. This requires two separate nodes: one to request the input and one to handle it. +- **Rerun (`request_input_rerun`):** The node yielding `RequestInput` is decorated with `@node(rerun_on_resume=True)`. When execution resumes, the workflow **re-runs the exact same node** that asked for the input. The node can then access the provided input via the execution `Context`. + +This allows you to combine the requesting and handling of human input into a single, cohesive node. + +## Sample Inputs + +- `The delivery was a week late` + +- `I received the wrong item` + +- `My account was charged twice` + +## Graph + +```mermaid +graph TD + START --> draft_email + draft_email --> human_review[human_review
        reruns on resume] + human_review -->|revise| draft_email + human_review -->|approved| send_email + human_review -->|rejected| END_rejected[END rejected] +``` + +## How To + +1. Decorate the node that needs human input with `@node(rerun_on_resume=True)`. Ensure the function signature includes the workflow `Context`. + + ```python + from google.adk.workflow import node + from google.adk import Context + + @node(rerun_on_resume=True) + def human_review(draft: str, ctx: Context): + # ... + ``` + +1. Inside the node, check if you are being resumed by looking for the `interrupt_id` in `ctx.resume_inputs`. + + ```python + resume_input = ctx.resume_inputs.get('human_review') + ``` + +1. If `resume_input` is missing (i.e., this is the first time the node is executing), yield the `RequestInput` event to pause the workflow. Include an explicit `interrupt_id`. + + ```python + if not resume_input: + yield RequestInput( + interrupt_id="human_review", + message="Please review the draft...", + ) + return # Important: Stop execution of this node for now + ``` + +1. If `resume_input` is present (i.e., the workflow was resumed with user input), process the input and yield the appropriate routing events. + + ```python + if resume_input == "reject": + yield Event(route="rejected") + elif resume_input == "approve": + yield Event(route="approved") + else: + yield Event(state={"feedback": resume_input}, route="revise") + ``` + +1. The edge definition is much simpler because the single `human_review` node handles everything: + + ```python + Workflow( + name="request_input", + edges=[ + ("START", process_input, draft_email, human_review), + (human_review, {"revise": draft_email, "approved": send_email}), + ], + ) + ``` diff --git a/contributing/samples/workflows/request_input_rerun/agent.py b/contributing/samples/workflows/request_input_rerun/agent.py new file mode 100644 index 0000000000..c7bc96c34e --- /dev/null +++ b/contributing/samples/workflows/request_input_rerun/agent.py @@ -0,0 +1,81 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk import Agent +from google.adk import Context +from google.adk import Event +from google.adk import Workflow +from google.adk.events import RequestInput +from google.adk.workflow import node + + +def process_input(node_input: str): + """Takes the initial customer complaint as input and sets it in the state.""" + yield Event(state={"complaint": node_input, "feedback": ""}) + + +draft_email = Agent( + name="draft_email", + instruction=""" + Please write a polite, helpful response email to the following customer complaint: "{complaint}" + + If there is any feedback from the manager to revise the draft, please incorporate it: "{feedback?}" + """, + output_key="draft", +) + + +@node(rerun_on_resume=True) +def human_review(draft: str, ctx: Context): + resume_input = ctx.resume_inputs.get("human_review") + if not resume_input: + yield RequestInput( + interrupt_id="human_review", + message=( + "Please review the following draft email and provide 'approve'," + f" 'reject', or feedback to revise.\n\n---\n{draft}\n---" + ), + ) + return + + if resume_input == "reject": + yield Event(route="rejected") + elif resume_input == "approve": + yield Event(route="approved") + else: + yield Event(state={"feedback": resume_input}, route="revise") + + +def reject_email(): + yield Event(message="Draft rejected.") + + +def send_email(draft: str): + yield Event(message="Draft approved and sent successfully.") + + +root_agent = Workflow( + name="request_input_rerun", + edges=[ + ("START", process_input, draft_email, human_review), + ( + human_review, + { + "revise": draft_email, + "approved": send_email, + "rejected": reject_email, + }, + ), + ], +) diff --git a/contributing/samples/workflows/request_input_rerun/tests/phone_broke.json b/contributing/samples/workflows/request_input_rerun/tests/phone_broke.json new file mode 100644 index 0000000000..b10c98e525 --- /dev/null +++ b/contributing/samples/workflows/request_input_rerun/tests/phone_broke.json @@ -0,0 +1,236 @@ +{ + "appName": "request_input_rerun", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "phone broke" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "stateDelta": { + "complaint": "phone broke", + "feedback": "" + } + }, + "author": "request_input_rerun", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "request_input_rerun@1/process_input@1" + } + }, + { + "actions": { + "stateDelta": { + "draft": "Subject: Regarding Your Phone Issue - How We Can Help - [Your Company Name]\n\nDear Valued Customer,\n\nThank you for reaching out to us. We're very sorry to hear that you're experiencing an issue with your phone. We understand how frustrating it can be when your device isn't working as expected, and we're here to help.\n\nTo assist you as quickly and effectively as possible, could you please provide a few more details about the situation? This will help us understand the problem and guide you towards the best solution.\n\nPlease tell us:\n\n1. **What is the model of your phone?** (e.g., iPhone 15, Samsung Galaxy S24, Google Pixel 8, etc.)\n2. **When did you purchase the phone?** (Rough date or year is fine if you don't have the exact date.)\n3. **Could you describe what happened and how the phone \"broke\"?** (e.g., \"It fell and the screen cracked,\" \"It won't turn on,\" \"It got wet,\" \"The battery stopped charging,\" \"It's stuck in a loop,\" etc.)\n4. **Have you already attempted any troubleshooting steps?** (e.g., restarting the phone, checking charging cables, etc.)\n\nOnce we have this information, our support team will be able to assess the situation, discuss potential solutions such as troubleshooting, repair options, or warranty service, and guide you through the next steps.\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call us at [Your Phone Number] during our business hours of [Your Business Hours].\n\nWe look forward to helping you resolve this issue soon.\n\nSincerely,\n\nThe Customer Support Team\n[Your Company Name]\n[Your Company Website (Optional)]" + } + }, + "author": "draft_email", + "content": { + "parts": [ + { + "text": "Subject: Regarding Your Phone Issue - How We Can Help - [Your Company Name]\n\nDear Valued Customer,\n\nThank you for reaching out to us. We're very sorry to hear that you're experiencing an issue with your phone. We understand how frustrating it can be when your device isn't working as expected, and we're here to help.\n\nTo assist you as quickly and effectively as possible, could you please provide a few more details about the situation? This will help us understand the problem and guide you towards the best solution.\n\nPlease tell us:\n\n1. **What is the model of your phone?** (e.g., iPhone 15, Samsung Galaxy S24, Google Pixel 8, etc.)\n2. **When did you purchase the phone?** (Rough date or year is fine if you don't have the exact date.)\n3. **Could you describe what happened and how the phone \"broke\"?** (e.g., \"It fell and the screen cracked,\" \"It won't turn on,\" \"It got wet,\" \"The battery stopped charging,\" \"It's stuck in a loop,\" etc.)\n4. **Have you already attempted any troubleshooting steps?** (e.g., restarting the phone, checking charging cables, etc.)\n\nOnce we have this information, our support team will be able to assess the situation, discuss potential solutions such as troubleshooting, repair options, or warranty service, and guide you through the next steps.\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call us at [Your Phone Number] during our business hours of [Your Business Hours].\n\nWe look forward to helping you resolve this issue soon.\n\nSincerely,\n\nThe Customer Support Team\n[Your Company Name]\n[Your Company Website (Optional)]" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "request_input_rerun@1/draft_email@1" + ], + "path": "request_input_rerun@1/draft_email@1" + } + }, + { + "author": "request_input_rerun", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "interruptId": "fc-1", + "message": "Please review the following draft email and provide 'approve', 'reject', or feedback to revise.\n\n---\nSubject: Regarding Your Phone Issue - How We Can Help - [Your Company Name]\n\nDear Valued Customer,\n\nThank you for reaching out to us. We're very sorry to hear that you're experiencing an issue with your phone. We understand how frustrating it can be when your device isn't working as expected, and we're here to help.\n\nTo assist you as quickly and effectively as possible, could you please provide a few more details about the situation? This will help us understand the problem and guide you towards the best solution.\n\nPlease tell us:\n\n1. **What is the model of your phone?** (e.g., iPhone 15, Samsung Galaxy S24, Google Pixel 8, etc.)\n2. **When did you purchase the phone?** (Rough date or year is fine if you don't have the exact date.)\n3. **Could you describe what happened and how the phone \"broke\"?** (e.g., \"It fell and the screen cracked,\" \"It won't turn on,\" \"It got wet,\" \"The battery stopped charging,\" \"It's stuck in a loop,\" etc.)\n4. **Have you already attempted any troubleshooting steps?** (e.g., restarting the phone, checking charging cables, etc.)\n\nOnce we have this information, our support team will be able to assess the situation, discuss potential solutions such as troubleshooting, repair options, or warranty service, and guide you through the next steps.\n\nPlease reply to this email with the requested details, or if you prefer to speak with someone directly, you can call us at [Your Phone Number] during our business hours of [Your Business Hours].\n\nWe look forward to helping you resolve this issue soon.\n\nSincerely,\n\nThe Customer Support Team\n[Your Company Name]\n[Your Company Website (Optional)]\n---", + "payload": null, + "response_schema": null + }, + "id": "fc-1", + "name": "adk_request_input" + } + } + ] + }, + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-1" + ], + "nodeInfo": { + "path": "request_input_rerun@1/human_review@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "adk_request_input", + "response": { + "result": "shorter" + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "route": "revise", + "stateDelta": { + "feedback": "shorter" + } + }, + "author": "request_input_rerun", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "request_input_rerun@1/human_review@1" + } + }, + { + "actions": { + "stateDelta": { + "draft": "Subject: Regarding Your Phone Issue - How We Can Help - [Your Company Name]\n\nDear Valued Customer,\n\nThank you for contacting us. We're sorry to hear about your phone issue and are ready to help.\n\nTo assist you efficiently, please provide the following details:\n\n1. **What is the model of your phone?** (e.g., iPhone 15, Samsung Galaxy S24)\n2. **When did you purchase the phone?** (Rough date or year is fine)\n3. **How did the phone \"break\"?** (e.g., screen cracked, won't turn on, got wet)\n4. **Have you attempted any troubleshooting steps?** (e.g., restarting, checking cables)\n\nWith this information, our team can better assess the problem and outline next steps (troubleshooting, repair, warranty).\n\nPlease reply to this email with the details. You can also call us at [Your Phone Number] during [Your Business Hours] if you prefer to speak directly.\n\nWe look forward to helping you resolve this soon.\n\nSincerely,\n\nThe Customer Support Team\n[Your Company Name]\n[Your Company Website (Optional)]" + } + }, + "author": "draft_email", + "content": { + "parts": [ + { + "text": "Subject: Regarding Your Phone Issue - How We Can Help - [Your Company Name]\n\nDear Valued Customer,\n\nThank you for contacting us. We're sorry to hear about your phone issue and are ready to help.\n\nTo assist you efficiently, please provide the following details:\n\n1. **What is the model of your phone?** (e.g., iPhone 15, Samsung Galaxy S24)\n2. **When did you purchase the phone?** (Rough date or year is fine)\n3. **How did the phone \"break\"?** (e.g., screen cracked, won't turn on, got wet)\n4. **Have you attempted any troubleshooting steps?** (e.g., restarting, checking cables)\n\nWith this information, our team can better assess the problem and outline next steps (troubleshooting, repair, warranty).\n\nPlease reply to this email with the details. You can also call us at [Your Phone Number] during [Your Business Hours] if you prefer to speak directly.\n\nWe look forward to helping you resolve this soon.\n\nSincerely,\n\nThe Customer Support Team\n[Your Company Name]\n[Your Company Website (Optional)]" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "request_input_rerun@1/draft_email@2" + ], + "path": "request_input_rerun@1/draft_email@2" + } + }, + { + "author": "request_input_rerun", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "interruptId": "fc-2", + "message": "Please review the following draft email and provide 'approve', 'reject', or feedback to revise.\n\n---\nSubject: Regarding Your Phone Issue - How We Can Help - [Your Company Name]\n\nDear Valued Customer,\n\nThank you for contacting us. We're sorry to hear about your phone issue and are ready to help.\n\nTo assist you efficiently, please provide the following details:\n\n1. **What is the model of your phone?** (e.g., iPhone 15, Samsung Galaxy S24)\n2. **When did you purchase the phone?** (Rough date or year is fine)\n3. **How did the phone \"break\"?** (e.g., screen cracked, won't turn on, got wet)\n4. **Have you attempted any troubleshooting steps?** (e.g., restarting, checking cables)\n\nWith this information, our team can better assess the problem and outline next steps (troubleshooting, repair, warranty).\n\nPlease reply to this email with the details. You can also call us at [Your Phone Number] during [Your Business Hours] if you prefer to speak directly.\n\nWe look forward to helping you resolve this soon.\n\nSincerely,\n\nThe Customer Support Team\n[Your Company Name]\n[Your Company Website (Optional)]\n---", + "payload": null, + "response_schema": null + }, + "id": "fc-2", + "name": "adk_request_input" + } + } + ] + }, + "id": "e-8", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-2" + ], + "nodeInfo": { + "path": "request_input_rerun@1/human_review@2" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "adk_request_input", + "response": { + "result": "approve" + } + } + } + ], + "role": "user" + }, + "id": "e-9", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "route": "approved" + }, + "author": "request_input_rerun", + "id": "e-10", + "invocationId": "i-1", + "nodeInfo": { + "path": "request_input_rerun@1/human_review@2" + } + }, + { + "author": "request_input_rerun", + "content": { + "parts": [ + { + "text": "Draft approved and sent successfully." + } + ], + "role": "user" + }, + "id": "e-11", + "invocationId": "i-1", + "nodeInfo": { + "path": "request_input_rerun@1/send_email@1" + } + } + ], + "id": "2daf1ec0-1582-419d-95e9-c5be7269e701", + "state": { + "__session_metadata__": { + "displayName": "phone broke" + }, + "complaint": "phone broke", + "draft": "Subject: Regarding Your Broken Phone\n\nDear [Customer Name],\n\nWe're very sorry to hear your phone has broken. We understand this is frustrating, and we want to help resolve it for you as quickly as possible.\n\nTo assist you best, please reply with some additional details:\n* Your phone's model\n* When you purchased it\n* A brief description of what happened\n* Whether it is currently under warranty\n\nYou can also find immediate support and repair options on our website here: [Link to Repair/Support Page]\n\nAlternatively, please feel free to call us directly at [Phone Number] if you prefer to speak with someone.\n\nWe appreciate your patience and look forward to helping.\n\nSincerely,\n\nThe [Your Company Name] Team", + "feedback": "shorter" + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/retry/README.md b/contributing/samples/workflows/retry/README.md new file mode 100644 index 0000000000..0c86625b3b --- /dev/null +++ b/contributing/samples/workflows/retry/README.md @@ -0,0 +1,43 @@ +# ADK Workflow Sample: Node Retries + +## Overview + +In real-world applications, interacting with external APIs, databases, or third-party services can occasionally result in transient failures (e.g., temporary network outages, rate limits, or bad gateways). + +The ADK framework allows you to easily handle these scenarios by wrapping the unreliable logic in a `@node` decorator configured with `RetryConfig`. If the node raises one of the expected exceptions, the workflow engine automatically pauses, waits for a backoff delay, and reschedules the node for another attempt. + +When a node raises an exception, the framework automatically emits an error event (with `error_code` and `error_message`) so the error is visible in the event stream. If the node has retry configured, it will be retried after the backoff delay. + +This sample demonstrates a `get_weather` node that intentionally fails randomly (70% chance) by raising an `HTTPError` representing a 500 Internal Server error. The framework gracefully recovers and eventually succeeds, passing the result to `report_weather`. + +## Graph + +```mermaid +graph TD + START --> get_weather[get_weather
        Retries on HTTPError] + get_weather --> report_weather +``` + +## How To + +1. **Import `RetryConfig`**: Ensure you import the configuration class to set your retry parameters. + + ```python + from google.adk.workflow import RetryConfig + ``` + +1. **Configure the Decorator**: Apply the `@node` decorator to your Python function and specify the `retry_config` parameter with your desired logic (e.g., `max_attempts`, `initial_delay`). + + ```python + @node(retry_config=RetryConfig(max_attempts=5, initial_delay=1)) + def get_weather(ctx: Context) -> str: + # ... flaky logic here ... + ``` + + When an exception like `HTTPError` occurs, the ADK framework catches it, emits an error event, and processes the backoff delay automatically. As long as `max_attempts` hasn't been exceeded, the node executes again. + +1. **Track Retries (Optional)**: If you need to know which attempt the node is currently running, you can access `ctx.attempt_count` from the `Context`. + + ```python + yield Event(message=f"Getting weather... attempt {ctx.attempt_count}") + ``` diff --git a/contributing/samples/workflows/retry/agent.py b/contributing/samples/workflows/retry/agent.py new file mode 100644 index 0000000000..c8bb6fb986 --- /dev/null +++ b/contributing/samples/workflows/retry/agent.py @@ -0,0 +1,49 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import random +from urllib.error import HTTPError + +from google.adk import Context +from google.adk import Event +from google.adk import Workflow +from google.adk.workflow import node +from google.adk.workflow import RetryConfig + + +@node(retry_config=RetryConfig(max_attempts=5, initial_delay=1)) +def get_weather(ctx: Context) -> str: + """A mock task that fails randomly.""" + + yield Event(message=f"Getting weather... attempt {ctx.attempt_count}") + if random.random() < 0.7: # 70% chance of failure + raise HTTPError( + url="http://mock-api.example.com", + code=500, + msg="Internal Server Error", + hdrs={}, + fp=None, + ) + + yield "sunny" + + +def report_weather(node_input: str): + yield Event(message=f"The weather is {node_input}") + + +root_agent = Workflow( + name="root_agent", + edges=[("START", get_weather, report_weather)], +) diff --git a/contributing/samples/workflows/retry/tests/go.json b/contributing/samples/workflows/retry/tests/go.json new file mode 100644 index 0000000000..fea19306dd --- /dev/null +++ b/contributing/samples/workflows/retry/tests/go.json @@ -0,0 +1,131 @@ +{ + "appName": "retry", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "go" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Getting weather... attempt 1" + } + ], + "role": "user" + }, + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/get_weather@1" + } + }, + { + "author": "root_agent", + "errorCode": "HTTPError", + "errorMessage": "HTTP Error 500: Internal Server Error", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/get_weather@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Getting weather... attempt 2" + } + ], + "role": "user" + }, + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/get_weather@1" + } + }, + { + "author": "root_agent", + "errorCode": "HTTPError", + "errorMessage": "HTTP Error 500: Internal Server Error", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/get_weather@1" + } + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "Getting weather... attempt 3" + } + ], + "role": "user" + }, + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/get_weather@1" + } + }, + { + "author": "root_agent", + "id": "e-7", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/get_weather@1" + ], + "path": "root_agent@1/get_weather@1" + }, + "output": "sunny" + }, + { + "author": "root_agent", + "content": { + "parts": [ + { + "text": "The weather is sunny" + } + ], + "role": "user" + }, + "id": "e-8", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/report_weather@1" + } + } + ], + "id": "c0e0c167-1e63-4e18-84b6-ad64ba59376f", + "mocks": { + "random.random": [ + 0.5, + 0.5, + 0.8 + ] + }, + "state": { + "__session_metadata__": { + "displayName": "go" + } + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/route/README.md b/contributing/samples/workflows/route/README.md new file mode 100644 index 0000000000..66f54d8a5e --- /dev/null +++ b/contributing/samples/workflows/route/README.md @@ -0,0 +1,43 @@ +# ADK Workflow Routing Sample + +## Overview + +This sample demonstrates how to use routing in **ADK Workflows**. + +It takes user input and uses an LLM node to categorize it as a **question**, a **statement**, or **other**. Based on the classification, it appropriately routes the execution to a specialized agent or function to handle that specific type of input. + +In ADK Workflows, **routing** allows conditionally executing different execution paths based on the output of a previous node. + +## Sample Inputs + +- `What is the capital of France?` + +- `The weather is very nice today.` + +- `Translate bonjour to english` + +## Graph + +```mermaid +graph TD + START --> process_input + process_input --> classify_input + classify_input --> route_on_category + route_on_category -->|question| answer_question + route_on_category -->|statement| comment_on_statement + route_on_category -->|other| handle_other +``` + +## How To + +1. A node (agent or function) yields an `Event` with a specific route name: + + ```python + yield Event(route="your_route_name") + ``` + +1. In the `Workflow` edges definition, conditional edges are constructed using a routing map dict as the second element of the edge tuple: + + ```python + (source_node, {"your_route_name": target_node}) + ``` diff --git a/contributing/samples/workflows/route/agent.py b/contributing/samples/workflows/route/agent.py new file mode 100644 index 0000000000..1722e94de6 --- /dev/null +++ b/contributing/samples/workflows/route/agent.py @@ -0,0 +1,77 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Literal + +from google.adk import Agent +from google.adk import Event +from google.adk import Workflow +from pydantic import BaseModel + + +class InputCategory(BaseModel): + category: Literal["question", "statement", "other"] + + +def process_input(node_input: str): + return Event(state={"input": node_input}) + + +classify_input = Agent( + name="classify_input", + instruction=( + "Based on this input, decide which category it belongs to: {input}" + ), + output_schema=InputCategory, + output_key="category", +) + + +def route_on_category(category: InputCategory): + """Yields an Event with a specific route based on the classification.""" + yield Event(route=category.category) + + +answer_question = Agent( + name="answer_question", + instruction="""Answer the question: {input}""", +) + + +comment_on_statement = Agent( + name="comment_on_statement", + instruction="""Comment on the statement: {input}""", +) + + +def handle_other(): + yield Event( + message="Sorry I can only anwer questions or comment on statements." + ) + + +root_agent = Workflow( + name="root_agent", + edges=[ + ("START", process_input, classify_input, route_on_category), + ( + route_on_category, + { + "question": answer_question, + "statement": comment_on_statement, + "other": handle_other, + }, + ), + ], +) diff --git a/contributing/samples/workflows/route/tests/who_are_you.json b/contributing/samples/workflows/route/tests/who_are_you.json new file mode 100644 index 0000000000..90426b1ca1 --- /dev/null +++ b/contributing/samples/workflows/route/tests/who_are_you.json @@ -0,0 +1,106 @@ +{ + "appName": "route", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "who are you" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "stateDelta": { + "input": "who are you" + } + }, + "author": "root_agent", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/process_input@1" + } + }, + { + "actions": { + "stateDelta": { + "category": { + "category": "question" + } + } + }, + "author": "classify_input", + "content": { + "parts": [ + { + "text": "{\"category\": \"question\"}" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/classify_input@1" + ], + "path": "root_agent@1/classify_input@1" + } + }, + { + "actions": { + "route": "question" + }, + "author": "root_agent", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "path": "root_agent@1/route_on_category@1" + } + }, + { + "author": "answer_question", + "content": { + "parts": [ + { + "text": "I am a large language model, trained by Google." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/answer_question@1", + "root_agent@1" + ], + "path": "root_agent@1/answer_question@1" + } + } + ], + "id": "f1ec33bf-99ef-49a5-b64a-e4d31f85db85", + "state": { + "__session_metadata__": { + "displayName": "who are you" + }, + "category": { + "category": "question" + }, + "input": "who are you" + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/sequence/README.md b/contributing/samples/workflows/sequence/README.md new file mode 100644 index 0000000000..42ef9f46e7 --- /dev/null +++ b/contributing/samples/workflows/sequence/README.md @@ -0,0 +1,39 @@ +# ADK Workflow Sequence Sample + +## Overview + +This sample demonstrates how to create a simple sequential workflow with **ADK Workflows**. + +It connects two LLM agents in a chain. The first agent (`generate_fruit_agent`) is instructed to return the name of a random fruit. The output of this agent becomes the input for the second agent (`generate_benefit_agent`), which then tells a health benefit about that specific fruit. + +In a sequence, the execution flows unconditionally from one node to the next in the order they are defined. + +## Sample Inputs + +This sample does not require any input to run. + +## Graph + +```mermaid +graph TD + START --> generate_fruit_agent + generate_fruit_agent --> generate_benefit_agent +``` + +## How To + +1. Define the agents or functions that will make up the steps in your sequence. + + ```python + generate_fruit_agent = Agent(...) + generate_benefit_agent = Agent(...) + ``` + +1. Pass a tuple of three or more elements to `edges` to define an unconditional sequence starting from the first element and passing through each subsequent node in order. + + ```python + Workflow( + name="root_agent", + edges=[("START", generate_fruit_agent, generate_benefit_agent)], + ) + ``` diff --git a/contributing/samples/workflows/sequence/__init__.py b/contributing/samples/workflows/sequence/__init__.py new file mode 100644 index 0000000000..4015e47d6e --- /dev/null +++ b/contributing/samples/workflows/sequence/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/workflows/sequence/agent.py b/contributing/samples/workflows/sequence/agent.py new file mode 100644 index 0000000000..594d8a900c --- /dev/null +++ b/contributing/samples/workflows/sequence/agent.py @@ -0,0 +1,35 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Sample workflow for simple sequential workflow with LLM agents.""" + +from google.adk import Agent +from google.adk import Workflow + +generate_fruit_agent = Agent( + name="generate_fruit_agent", + instruction="""Return the name of a random fruit. + Return only the name, nothing else.""", +) + +generate_benefit_agent = Agent( + name="generate_benefit_agent", + instruction="""Tell me a health benefit about the specified fruit.""", +) + + +root_agent = Workflow( + name="root_agent", + edges=[("START", generate_fruit_agent, generate_benefit_agent)], +) diff --git a/contributing/samples/workflows/sequence/tests/go.json b/contributing/samples/workflows/sequence/tests/go.json new file mode 100644 index 0000000000..62bb7241dd --- /dev/null +++ b/contributing/samples/workflows/sequence/tests/go.json @@ -0,0 +1,71 @@ +{ + "appName": "sequence", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "go" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "generate_fruit_agent", + "content": { + "parts": [ + { + "text": "Apple" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/generate_fruit_agent@1" + ], + "path": "root_agent@1/generate_fruit_agent@1" + } + }, + { + "author": "generate_benefit_agent", + "content": { + "parts": [ + { + "text": "Apples are a good source of **dietary fiber**, particularly soluble fiber like pectin. This can help with digestion, promote a feeling of fullness (aiding in weight management), and may contribute to lowering cholesterol levels." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/generate_benefit_agent@1", + "root_agent@1" + ], + "path": "root_agent@1/generate_benefit_agent@1" + } + } + ], + "id": "0e5ab646-61d6-49cd-b058-24fde0afebae", + "state": { + "__session_metadata__": { + "displayName": "go" + } + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/state/README.md b/contributing/samples/workflows/state/README.md new file mode 100644 index 0000000000..cf4d9845fe --- /dev/null +++ b/contributing/samples/workflows/state/README.md @@ -0,0 +1,60 @@ +# ADK Workflow State Sample + +## Overview + +This sample demonstrates different ways to manage state in an **ADK Workflow**. State is a dictionary shared across all nodes in the workflow execution, useful for gathering information across multiple steps without passing everything directly from one node's output to another's input. + +In this sample, we show four techniques: + +1. Updating state via direct dictionary mutation: `ctx.state["key"] = "value"` +1. Updating state by yielding an event: `yield Event(state={"key": "value"})` +1. Reading state via direct dictionary access: `ctx.state["key"]` +1. Reading state via automatic parameter injection: `def func(key: str): ...` + +## Sample Inputs + +- `Hello ADK!` + +- `Testing state management.` + +## Graph + +```mermaid +graph TD + START --> process_initial_input + process_initial_input --> update_state_via_event + update_state_via_event --> read_state_via_ctx + read_state_via_ctx --> read_state_via_param +``` + +## How To + +1. **Update state via direct mutation:** Access the context and modify `ctx.state` directly. + + ```python + def process_initial_input(ctx, node_input: str): + ctx.state["original_text"] = node_input + ``` + +1. **Update state via Event:** Yield an `Event` object with a `state` delta dictionary. + + ```python + def update_state_via_event(node_input: str): + yield Event( + state={"uppercased_text": node_input.upper()} + ) + ``` + +1. **Read state via context:** Retrieve values from `ctx.state`. + + ```python + def read_state_via_ctx(ctx): + original = ctx.state["original_text"] + ``` + +1. **Read state via parameter injection:** Declare a function parameter that matches the key in the workflow state, and ADK will automatically populate it. + + ```python + def read_state_via_param(appended_text: str): + return f"Final Result: {appended_text}!" + ``` diff --git a/contributing/samples/workflows/state/agent.py b/contributing/samples/workflows/state/agent.py new file mode 100644 index 0000000000..34e8038582 --- /dev/null +++ b/contributing/samples/workflows/state/agent.py @@ -0,0 +1,57 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from google.adk import Event +from google.adk import Workflow + + +def process_initial_input(ctx, node_input: str): + """Takes initial input and sets it in state via direct dict modification.""" + ctx.state["original_text"] = node_input + return node_input + + +def update_state_via_event(node_input: str): + """Returns an Event that implicitly updates the shared workflow state.""" + yield Event(state={"uppercased_text": node_input.upper()}) + + +def read_state_via_ctx(ctx): + """Reads a state variable via direct dictionary access and appends to it.""" + original = ctx.state["original_text"] + uppercased = ctx.state["uppercased_text"] + + result = f"{uppercased} (Original was: {original})" + ctx.state["appended_text"] = result + return result + + +def read_state_via_param(appended_text: str): + """Reads a state variable via automatic parameter injection.""" + return f"Final Result: {appended_text}!" + + +root_agent = Workflow( + name="state_sample", + edges=[ + ( + "START", + process_initial_input, + update_state_via_event, + read_state_via_ctx, + read_state_via_param, + ), + ], +) diff --git a/contributing/samples/workflows/state/tests/go.json b/contributing/samples/workflows/state/tests/go.json new file mode 100644 index 0000000000..024ed14108 --- /dev/null +++ b/contributing/samples/workflows/state/tests/go.json @@ -0,0 +1,91 @@ +{ + "appName": "state", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "go" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "actions": { + "stateDelta": { + "original_text": "go" + } + }, + "author": "state_sample", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "state_sample@1/process_initial_input@1" + ], + "path": "state_sample@1/process_initial_input@1" + }, + "output": "go" + }, + { + "actions": { + "stateDelta": { + "uppercased_text": "GO" + } + }, + "author": "state_sample", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "state_sample@1/update_state_via_event@1" + } + }, + { + "actions": { + "stateDelta": { + "appended_text": "GO (Original was: go)" + } + }, + "author": "state_sample", + "id": "e-4", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "state_sample@1/read_state_via_ctx@1" + ], + "path": "state_sample@1/read_state_via_ctx@1" + }, + "output": "GO (Original was: go)" + }, + { + "author": "state_sample", + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "state_sample@1/read_state_via_param@1", + "state_sample@1" + ], + "path": "state_sample@1/read_state_via_param@1" + }, + "output": "Final Result: GO (Original was: go)!" + } + ], + "id": "89d894be-5d57-4d5c-9a29-ccc15b3b5eb7", + "state": { + "__session_metadata__": { + "displayName": "go" + }, + "appended_text": "GO (Original was: go)", + "original_text": "go", + "uppercased_text": "GO" + }, + "userId": "user" +} diff --git a/contributing/samples/workflows/use_as_output/README.md b/contributing/samples/workflows/use_as_output/README.md new file mode 100644 index 0000000000..1140398116 --- /dev/null +++ b/contributing/samples/workflows/use_as_output/README.md @@ -0,0 +1,55 @@ +# ADK Workflow use_as_output Sample + +## Overview + +This sample demonstrates how to use `ctx.run_node(node, use_as_output=True)` to delegate a node's output to a dynamically executed child node. + +When `use_as_output=True` is set, the child node's output replaces the parent's output. The parent's own output event is suppressed to avoid duplication, and the child's output flows downstream through the graph as if the parent produced it. + +The child node can be any node type — this sample uses a single_turn LLM agent (`summarizer`) as the delegated child. + +## Sample Inputs + +- `The quick brown fox jumped over the lazy dog near the riverbank on a warm summer afternoon` + +## Graph + +```mermaid +graph TD + START --> orchestrate + orchestrate -.->|delegates output via ctx.run_node| summarizer + summarizer --> finalize +``` + +## How To + +1. **Define the child node**: The child can be a function or an LLM agent. Its output becomes the parent's output and flows to downstream nodes. + + ```python + from google.adk import Agent + + summarizer = Agent( + name='summarizer', + model='gemini-2.5-flash', + instruction='Summarize the following text in one sentence.', + ) + ``` + +1. **Mark the orchestrator as rerun_on_resume**: The parent node that calls `ctx.run_node` must use `@node(rerun_on_resume=True)`. + + ```python + from google.adk.workflow import node + + @node(rerun_on_resume=True) + async def orchestrate(ctx: Context, node_input: str) -> str: + return await ctx.run_node( + summarizer, node_input=node_input, use_as_output=True + ) + ``` + +1. **Downstream receives delegated output**: The `finalize` node receives the LLM's summary as its `node_input`, not the parent's. + + ```python + def finalize(node_input: str) -> str: + return f'final: {node_input}' + ``` diff --git a/contributing/samples/workflows/use_as_output/agent.py b/contributing/samples/workflows/use_as_output/agent.py new file mode 100644 index 0000000000..9516fedcec --- /dev/null +++ b/contributing/samples/workflows/use_as_output/agent.py @@ -0,0 +1,41 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk import Agent +from google.adk import Context +from google.adk.workflow import node +from google.adk.workflow import Workflow +from google.adk.workflow._base_node import START + +summarizer = Agent( + name='summarizer', + instruction='Summarize the following text in one sentence.', +) + + +@node(rerun_on_resume=True) +async def orchestrate(ctx: Context, node_input: str) -> str: + return await ctx.run_node( + summarizer, node_input=node_input, use_as_output=True + ) + + +def finalize(node_input: str) -> str: + return f'final: {node_input}' + + +root_agent = Workflow( + name='root_agent', + edges=[(START, orchestrate, finalize)], +) diff --git a/contributing/samples/workflows/use_as_output/tests/go.json b/contributing/samples/workflows/use_as_output/tests/go.json new file mode 100644 index 0000000000..ebda898a6a --- /dev/null +++ b/contributing/samples/workflows/use_as_output/tests/go.json @@ -0,0 +1,63 @@ +{ + "appName": "use_as_output", + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "go" + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "summarizer", + "content": { + "parts": [ + { + "text": "Please provide the text you would like me to summarize!" + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "nodeInfo": { + "messageAsOutput": true, + "outputFor": [ + "root_agent@1/orchestrate@1/summarizer@1", + "root_agent@1/orchestrate@1" + ], + "path": "root_agent@1/orchestrate@1/summarizer@1" + } + }, + { + "author": "root_agent", + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "outputFor": [ + "root_agent@1/finalize@1", + "root_agent@1" + ], + "path": "root_agent@1/finalize@1" + }, + "output": "final: Please provide the text you would like me to summarize!" + } + ], + "id": "ba40366e-0563-469f-a4b2-09e007adf6ff", + "state": { + "__session_metadata__": { + "displayName": "go" + } + }, + "userId": "user" +} diff --git a/pyproject.toml b/pyproject.toml index cc6a045bc9..cd87d3735c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,70 +33,85 @@ classifiers = [ dynamic = [ "version" ] dependencies = [ - "aiosqlite>=0.21", # For SQLite database - "anyio>=4.9,<5", # For MCP Session Manager - "authlib>=1.6.6,<2", # For RestAPI Tool - "click>=8.1.8,<9", # For CLI tools - "fastapi>=0.124.1,<1", # FastAPI framework - "google-api-python-client>=2.157,<3", # Google API client discovery - "google-auth[pyopenssl]>=2.47", # Google Auth library - "google-cloud-aiplatform[agent-engines]>=1.148.1,<2", # For VertexAI integrations, e.g. example store. - "google-cloud-bigquery>=2.2", - "google-cloud-bigquery-storage>=2", - "google-cloud-bigtable>=2.32", # For Bigtable database - "google-cloud-dataplex>=1.7,<3", # For Dataplex Catalog Search tool - "google-cloud-discoveryengine>=0.13.12,<0.14", # For Discovery Engine Search Tool - "google-cloud-pubsub>=2,<3", # For Pub/Sub Tool - "google-cloud-secret-manager>=2.22,<3", # Fetching secrets in RestAPI Tool - "google-cloud-spanner>=3.56,<4", # For Spanner database - "google-cloud-speech>=2.30,<3", # For Audio Transcription - "google-cloud-storage>=2.18,<4", # For GCS Artifact service - "google-genai>=1.72,<2", # Google GenAI SDK - "graphviz>=0.20.2,<1", # Graphviz for graph rendering - "httpx>=0.27,<1", # HTTP client library - "jsonschema>=4.23,<5", # Agent Builder config validation - "mcp>=1.24,<2", # For MCP Toolset - "opentelemetry-api>=1.36,<=1.41.1", # OpenTelemetry - allow 1.39+ up to latest published at time of resolution. - "opentelemetry-exporter-gcp-logging>=1.9.0a0,<=1.12.0a0", - "opentelemetry-exporter-gcp-monitoring>=1.9.0a0,<2", - "opentelemetry-exporter-gcp-trace>=1.9,<2", - "opentelemetry-exporter-otlp-proto-http>=1.36", - "opentelemetry-resourcedetector-gcp>=1.9.0a0,<2", + "aiosqlite>=0.21", + "authlib>=1.6.6,<2", + "click>=8.1.8,<9", + "fastapi>=0.124.1,<1", + "google-auth[pyopenssl]>=2.47", + "google-genai>=1.72,<2", + "graphviz>=0.20.2,<1", + "httpx>=0.27,<1", + "jsonschema>=4.23,<5", + "opentelemetry-api>=1.36,<=1.41.1", "opentelemetry-sdk>=1.36,<=1.41.1", - "pyarrow>=14", - "pydantic>=2.12,<3", # For data validation/models - "python-dateutil>=2.9.0.post0,<3", # For Vertext AI Session Service - "python-dotenv>=1,<2", # To manage environment variables - "pyyaml>=6.0.2,<7", # For APIHubToolset. + "packaging>=21", + "pydantic>=2.12,<3", + "python-dotenv>=1,<2", + "python-multipart>=0.0.9,<1", + # go/keep-sorted start + "pyyaml>=6.0.2,<7", "requests>=2.32.4,<3", - "sqlalchemy>=2,<3", # SQL database ORM - "sqlalchemy-spanner>=1.14", # Spanner database session service - "starlette>=0.49.1,<1", # For FastAPI CLI - "tenacity>=9,<10", # For Retry management + "starlette>=0.49.1,<1", + "tenacity>=9,<10", "typing-extensions>=4.5,<5", - "tzlocal>=5.3,<6", # Time zone utilities - "uvicorn>=0.34,<1", # ASGI server for FastAPI - "watchdog>=6,<7", # For file change detection and hot reload - "websockets>=15.0.1,<16", # For BaseLlmFlow - "yarl<1.24", + "tzlocal>=5.3,<6", + "uvicorn>=0.34,<1", + "watchdog>=6,<7", + "websockets>=15.0.1,<16", + # go/keep-sorted end ] + optional-dependencies.a2a = [ "a2a-sdk>=0.3.4,<0.4", ] optional-dependencies.agent-identity = [ "google-cloud-iamconnectorcredentials>=0.1,<0.2", ] +optional-dependencies.all = [ + "anyio>=4.9,<5", + "google-api-python-client>=2.157,<3", + "google-cloud-aiplatform[agent-engines]>=1.148.1,<2", + "google-cloud-bigquery>=2.2", + "google-cloud-bigquery-storage>=2", + "google-cloud-bigtable>=2.32", + "google-cloud-dataplex>=1.7,<3", + "google-cloud-discoveryengine>=0.13.12,<0.14", + "google-cloud-pubsub>=2,<3", + "google-cloud-resource-manager>=1.12,<2", + "google-cloud-secret-manager>=2.22,<3", + "google-cloud-spanner>=3.56,<4", + "google-cloud-speech>=2.30,<3", + "google-cloud-storage>=2.18,<4", + "mcp>=1.24,<2", + "opentelemetry-exporter-gcp-logging>=1.9.0a0,<=1.12.0a0", + "opentelemetry-exporter-gcp-monitoring>=1.9.0a0,<2", + "opentelemetry-exporter-gcp-trace>=1.9,<2", + "opentelemetry-exporter-otlp-proto-http>=1.36", + "opentelemetry-resourcedetector-gcp>=1.9.0a0,<2", + "pyarrow>=14", + "python-dateutil>=2.9.0.post0,<3", + "sqlalchemy>=2,<3", + "sqlalchemy-spanner>=1.14", +] + optional-dependencies.community = [ "google-adk-community", ] +optional-dependencies.db = [ + "sqlalchemy>=2,<3", + "sqlalchemy-spanner>=1.14", +] + optional-dependencies.dev = [ "flit>=3.10", - "isort>=6", "mypy>=1.15", "pre-commit>=4", "pyink>=25.12", "pylint>=2.6", + "tox>=4.23.2", + "tox-uv>=1.33.2", ] + optional-dependencies.docs = [ "autodoc-pydantic", "furo", @@ -106,6 +121,7 @@ optional-dependencies.docs = [ "sphinx-click", "sphinx-rtd-theme", ] + optional-dependencies.eval = [ "gepa>=0.1", "google-cloud-aiplatform[evaluation]>=1.148", @@ -114,7 +130,7 @@ optional-dependencies.eval = [ "rouge-score>=0.1.2", "tabulate>=0.9", ] -# Optional extensions + optional-dependencies.extensions = [ "anthropic>=0.78", # For anthropic model support; 0.78 introduced ThinkingConfigAdaptiveParam (required for Claude Opus 4.7). "beautifulsoup4>=3.2.2", # For load_web_page tool. @@ -122,43 +138,105 @@ optional-dependencies.extensions = [ "docker>=7", # For ContainerCodeExecutor "google-cloud-firestore>=2.11,<3", # For Firestore services "google-cloud-parametermanager>=0.4,<1", - "k8s-agent-sandbox>=0.1.1.post3", # For GkeCodeExecutor sandbox mode - "kubernetes>=29", # For GkeCodeExecutor - "langgraph>=0.2.60,<0.4.8", # For LangGraphAgent - "litellm>=1.83.7,<=1.83.14", # For LiteLlm class. Lower bound: 5 CVE patches (2026-04). Upper bound pinned to current latest; bump deliberately. See #5488. - "llama-index-embeddings-google-genai>=0.3", # For files retrieval using LlamaIndex. - "llama-index-readers-file>=0.4", # For retrieval using LlamaIndex. - "lxml>=5.3", # For load_web_page tool. - "pypika>=0.50", # For crewai->chromadb dependency - "toolbox-adk>=1,<2", # For tools.toolbox_toolset.ToolboxToolset + "k8s-agent-sandbox>=0.1.1.post3", + "kubernetes>=29", + "langgraph>=0.2.60,<0.4.8", + "litellm>=1.83.7,<=1.83.14", + "llama-index-embeddings-google-genai>=0.3", + "llama-index-readers-file>=0.4", + "lxml>=5.3", + "pypika>=0.50", + "toolbox-adk>=1,<2", ] + +optional-dependencies.gcp = [ + "google-cloud-aiplatform[agent-engines]>=1.148.1,<2", + "google-cloud-bigquery>=2.2", + "google-cloud-bigquery-storage>=2", + "google-cloud-bigtable>=2.32", + "google-cloud-dataplex>=1.7,<3", + "google-cloud-discoveryengine>=0.13.12,<0.14", + "google-cloud-pubsub>=2,<3", + "google-cloud-resource-manager>=1.12,<2", + "google-cloud-secret-manager>=2.22,<3", + "google-cloud-spanner>=3.56,<4", + "google-cloud-speech>=2.30,<3", + "google-cloud-storage>=2.18,<4", + "opentelemetry-exporter-gcp-logging>=1.9.0a0,<=1.12.0a0", + "opentelemetry-exporter-gcp-monitoring>=1.9.0a0,<2", + "opentelemetry-exporter-gcp-trace>=1.9,<2", + "opentelemetry-exporter-otlp-proto-http>=1.36", + "opentelemetry-resourcedetector-gcp>=1.9.0a0,<2", + "pyarrow>=14", + "python-dateutil>=2.9.0.post0,<3", +] + +optional-dependencies.mcp = [ + "anyio>=4.9,<5", + "mcp>=1.24,<2", +] + optional-dependencies.otel-gcp = [ "opentelemetry-instrumentation-google-genai>=0.6b0,<1" ] optional-dependencies.slack = [ "slack-bolt>=1.22" ] optional-dependencies.test = [ "a2a-sdk>=0.3,<0.4", "anthropic>=0.78", # For anthropic model tests; 0.78 introduced ThinkingConfigAdaptiveParam (required for Claude Opus 4.7). + "anyio>=4.9,<5", "crewai[tools]; python_version>='3.11' and python_version<'3.12'", # For CrewaiTool tests; chromadb/pypika fail on 3.12+ + "gepa>=0.1", + "google-api-python-client>=2.157,<3", + "google-cloud-aiplatform[agent-engines,evaluation]>=1.148.1,<2", + "google-cloud-bigquery>=2.2", + "google-cloud-bigquery-storage>=2", + "google-cloud-bigtable>=2.32", + "google-cloud-dataplex>=1.7,<3", + "google-cloud-discoveryengine>=0.13.12,<0.14", "google-cloud-firestore>=2.11,<3", "google-cloud-iamconnectorcredentials>=0.1,<0.2", "google-cloud-parametermanager>=0.4,<1", - "kubernetes>=29", # For GkeCodeExecutor + "google-cloud-pubsub>=2,<3", + "google-cloud-resource-manager>=1.12,<2", + "google-cloud-secret-manager>=2.22,<3", + "google-cloud-spanner>=3.56,<4", + "google-cloud-speech>=2.30,<3", + "google-cloud-storage>=2.18,<4", + "jinja2>=3.1.4,<4", + "kubernetes>=29", "langchain-community>=0.3.17", - "langgraph>=0.2.60,<0.4.8", # For LangGraphAgent - "litellm>=1.83.7,<=1.83.14", # For LiteLLM tests. Lower bound: 5 CVE patches (2026-04). Upper bound pinned to current latest; bump deliberately. See #5488. - "llama-index-readers-file>=0.4", # For retrieval tests - "openai>=1.100.2", # For LiteLLM + "langgraph>=0.2.60,<0.4.8", + "litellm>=1.83.7,<=1.83.14", + "llama-index-readers-file>=0.4", + "mcp>=1.24,<2", + "openai>=1.100.2", + "opentelemetry-exporter-gcp-logging>=1.9.0a0,<=1.12.0a0", + "opentelemetry-exporter-gcp-monitoring>=1.9.0a0,<2", + "opentelemetry-exporter-gcp-trace>=1.9,<2", + "opentelemetry-exporter-otlp-proto-http>=1.36", "opentelemetry-instrumentation-google-genai>=0.3b0,<1", - "pypika>=0.50", # For crewai->chromadb dependency + "opentelemetry-resourcedetector-gcp>=1.9.0a0,<2", + "pandas>=2.2.3", + "pyarrow>=14", + "pypika>=0.50", "pytest>=9,<10", "pytest-asyncio>=0.25", "pytest-mock>=3.14", "pytest-xdist>=3.6.1", + "python-dateutil>=2.9.0.post0,<3", "python-multipart>=0.0.9", "rouge-score>=0.1.2", "slack-bolt>=1.22", + "sqlalchemy>=2,<3", + "sqlalchemy-spanner>=1.14", "tabulate>=0.9", + "tomli>=2,<3; python_version<'3.11'", ] + optional-dependencies.toolbox = [ "toolbox-adk>=1,<2" ] + +optional-dependencies.tools = [ + "google-api-python-client>=2.157,<3", +] + urls.changelog = "https://github.com/google/adk-python/blob/main/CHANGELOG.md" urls.documentation = "https://google.github.io/adk-docs/" urls.homepage = "https://google.github.io/adk-docs/" @@ -176,7 +254,7 @@ include = [ "py.typed" ] [tool.isort] profile = "google" single_line_exclusions = [ ] -line_length = 200 # Prevent line wrap flickering. +line_length = 200 known_third_party = [ "google.adk", "a2a" ] [tool.pytest.ini_options] @@ -185,7 +263,7 @@ asyncio_default_fixture_loop_scope = "function" asyncio_mode = "auto" [tool.mypy] -python_version = "3.10" +python_version = "3.11" exclude = [ "tests/", "contributing/samples/" ] plugins = [ "pydantic.mypy" ] strict = true @@ -193,7 +271,6 @@ disable_error_code = [ "import-not-found", "import-untyped", "unused-ignore" ] follow_imports = "skip" [tool.pyink] -# Format py files following Google style-guide line-length = 80 unstable = true pyink-indentation = 2 diff --git a/scripts/check_new_py_files.sh b/scripts/check_new_py_files.sh new file mode 100755 index 0000000000..45cbda55f5 --- /dev/null +++ b/scripts/check_new_py_files.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +exit_code=0 + +# Get list of newly added files using diff-filter=A +# Using process substitution to avoid subshell and handle spaces in filenames +while read -r file; do + # Check if file is not empty (happens if no new files) + if [[ -n "$file" ]]; then + if [[ "$file" == src/google/adk/*.py ]]; then + filename=$(basename "$file") + if [[ ! "$filename" == _* ]]; then + echo "Error: New Python file '$file' must have a '_' prefix." + echo "All new Python files in src/google/adk/ must be private by default." + echo "To expose a public interface, use __init__.py and list public symbols in __all__." + echo "See .agents/skills/adk-style/references/visibility.md for details." + exit_code=1 + fi + fi + fi +done < <(git diff --cached --name-only --diff-filter=A) + +exit $exit_code diff --git a/scripts/db_migration.sh b/scripts/db_migration.sh index 8d6a1384cf..c72c4fbf81 100755 --- a/scripts/db_migration.sh +++ b/scripts/db_migration.sh @@ -1,4 +1,18 @@ #!/bin/bash +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # This script is to update sessions DB that is created in previous ADK version, diff --git a/scripts/generate_agent_config_schema.py b/scripts/generate_agent_config_schema.py new file mode 100644 index 0000000000..6915ce6365 --- /dev/null +++ b/scripts/generate_agent_config_schema.py @@ -0,0 +1,67 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Script to generate AgentConfig.json from AgentConfig.""" + +from __future__ import annotations + +import json +import os + +from google.adk.agents.agent_config import AgentConfig +from pydantic.json_schema import GenerateJsonSchema +from pydantic.json_schema import PydanticInvalidForJsonSchema + + +class CustomGenerateJsonSchema(GenerateJsonSchema): + """Custom schema generator that handles invalid types by falling back.""" + + def handle_invalid_for_json_schema(self, schema, error_info): + try: + return super().handle_invalid_for_json_schema(schema, error_info) + except PydanticInvalidForJsonSchema: + # Return a fallback schema instead of failing + return { + "type": "object", + "description": f"Fallback for invalid schema: {error_info}", + } + + +def main(): + """Generates the AgentConfig.json schema.""" + # Use the custom generator to avoid failing on httpx.Client + schema = AgentConfig.model_json_schema( + schema_generator=CustomGenerateJsonSchema + ) + + # Find the repo root relative to this file. + script_dir = os.path.dirname(os.path.abspath(__file__)) + repo_root = os.path.dirname(script_dir) + + output_path = os.path.join( + repo_root, "src/google/adk/agents/config_schemas/AgentConfig.json" + ) + + # Ensure directory exists + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + with open(output_path, "w", encoding="utf-8") as f: + json.dump(schema, f, indent=2) + f.write("\n") + + print(f"Successfully generated {output_path}") + + +if __name__ == "__main__": + main() diff --git a/scripts/unittests.sh b/scripts/unittests.sh deleted file mode 100755 index eb9805f698..0000000000 --- a/scripts/unittests.sh +++ /dev/null @@ -1,143 +0,0 @@ -#!/bin/bash -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# Runs all unit tests for adk codebase. Sets up test environment according to -# CONTRIBUTING.md. -# Usage: ./unittests.sh [--version ] [pytest_args] - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd "$SCRIPT_DIR" -cd .. - -# Argument Parsing -ALL_VERSIONS=("3.10" "3.11" "3.12" "3.13" "3.14") -versions_to_run=() -PYTEST_ARGS=() - -while [[ $# -gt 0 ]]; do - case "$1" in - --version) - if [[ -z "${2:-}" ]]; then - echo "Error: Missing version for --version flag." >&2 - echo "Usage: $0 [--version ] [pytest_args]" >&2 - exit 1 - fi - # Validate version - if ! [[ " ${ALL_VERSIONS[*]} " =~ " $2 " ]]; then - echo "Error: Invalid version '$2'. Supported versions: ${ALL_VERSIONS[*]}" >&2 - exit 1 - fi - versions_to_run=("$2") - shift 2 - ;; - *) - PYTEST_ARGS+=("$1") - shift - ;; - esac -done - -if [[ ${#versions_to_run[@]} -eq 0 ]]; then - versions_to_run=("${ALL_VERSIONS[@]}") -fi - - -# Capture original venv for restoration -ORIGINAL_VENV="${VIRTUAL_ENV:-}" - -restore_venv() { - # Deactivate the unittest_venv if it is active - if command -v deactivate &> /dev/null; then - deactivate - fi - - echo "Cleaning up temporary directories..." - [[ -n "${VENV_DIR:-}" ]] && rm -rf "$VENV_DIR" - [[ -n "${UV_CACHE_DIR:-}" ]] && rm -rf "$UV_CACHE_DIR" - - if [[ -n "$ORIGINAL_VENV" ]]; then - echo "Reactivating pre-existing venv: $ORIGINAL_VENV" - source "$ORIGINAL_VENV/bin/activate" - fi -} - -# Ensure the environment is restored when the script exits. -trap restore_venv EXIT - -# Temporary directory for the virtual environment. -VENV_DIR=$(mktemp -d "${TMPDIR:-/tmp}/unittest_venv.XXXXXX") - -# Move uv cache to temp to prevent workspace bloat and IDE performance issues. -export UV_CACHE_DIR=$(mktemp -d "${TMPDIR:-/tmp}/uv_cache.XXXXXX") - -# Force 'copy' mode; hardlinks (uv default) fail on many virtual filesystems. -export UV_LINK_MODE=copy - -# 1. deactivate the current venv -if [[ -n "${VIRTUAL_ENV:-}" ]]; then - echo "Deactivating current venv: $VIRTUAL_ENV" - if command -v deactivate &> /dev/null; then - deactivate - fi - -fi - -for version in "${versions_to_run[@]}"; do - echo "" - echo "==================================================" - echo " RUNNING TESTS FOR PYTHON $version" - echo "==================================================" - - # 2. create a unittest_venv just for unit tests - echo "Creating/Using unittest_venv for python${version} in $VENV_DIR..." - uv venv --python "${version}" "$VENV_DIR" --clear - source "$VENV_DIR/bin/activate" - - # 3. perform the unit tests - echo "Setting up test environment in $VENV_DIR..." - uv sync --extra test --active --frozen - - # Determine if PYTEST_ARGS contains explicit test targets (e.g. file, dir, or node ID) - HAS_TEST_TARGET=false - for arg in "${PYTEST_ARGS[@]:-}"; do - [[ "$arg" == *.py || -d "$arg" || "$arg" == *::* ]] && HAS_TEST_TARGET=true && break - done - - echo "Running unit tests..." - TEST_EXIT_CODE=0 - if [[ "$HAS_TEST_TARGET" == true ]]; then - pytest "${PYTEST_ARGS[@]}" || TEST_EXIT_CODE=$? - else - pytest ./tests/unittests "${PYTEST_ARGS[@]:-}" || TEST_EXIT_CODE=$? - fi - # 4. report the unit tests status as is - if [[ $TEST_EXIT_CODE -ne 0 ]]; then - echo "" - echo "--------------------------------------------------" - echo "Unit tests failed for Python $version with exit code $TEST_EXIT_CODE" - echo "--------------------------------------------------" - exit $TEST_EXIT_CODE - fi -done - - -# 5. reactivate the pre-existing venv if the unit test succeeds -echo "" -echo "--------------------------------------------------" -echo "Unit tests passed for all specified versions!" -echo "--------------------------------------------------" From 8a3f7e19e60c6b92365ec37bf813c3cb6325a909 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Wed, 27 May 2026 12:49:20 -0700 Subject: [PATCH 30/94] fix: support PEP 604 union syntax in function tool parameters and ensure nested schema properties are retained PiperOrigin-RevId: 922293388 --- .../tools/_function_parameter_parse_util.py | 22 ++++--- .../tools/test_from_function_with_options.py | 4 +- .../tools/test_set_model_response_tool.py | 64 +++++++++++++++++++ 3 files changed, 80 insertions(+), 10 deletions(-) diff --git a/src/google/adk/tools/_function_parameter_parse_util.py b/src/google/adk/tools/_function_parameter_parse_util.py index a8e98980d5..096264de9e 100644 --- a/src/google/adk/tools/_function_parameter_parse_util.py +++ b/src/google/adk/tools/_function_parameter_parse_util.py @@ -247,7 +247,7 @@ def _parse_schema_from_parameter( _raise_if_schema_unsupported(variant, schema) return schema if ( - get_origin(param.annotation) is Union + get_origin(param.annotation) in (Union, typing_types.UnionType) # only parse simple UnionType, example int | str | float | bool # complex types.UnionType will be invoked in raise branch and all( @@ -276,8 +276,10 @@ def _parse_schema_from_parameter( schema.any_of.append(schema_in_any_of) unique_types.add(schema_in_any_of.model_dump_json(exclude_none=True)) if len(schema.any_of) == 1: # param: list | None -> Array - schema.type = schema.any_of[0].type - schema.any_of = None + collapsed = schema.any_of[0] + if schema.nullable: + collapsed.nullable = True + schema = collapsed if ( param.default is not inspect.Parameter.empty and param.default is not None @@ -287,8 +289,10 @@ def _parse_schema_from_parameter( schema.default = param.default _raise_if_schema_unsupported(variant, schema) return schema - if isinstance(param.annotation, _GenericAlias) or isinstance( - param.annotation, typing_types.GenericAlias + if ( + isinstance(param.annotation, _GenericAlias) + or isinstance(param.annotation, typing_types.GenericAlias) + or isinstance(param.annotation, typing_types.UnionType) ): origin = get_origin(param.annotation) args = get_args(param.annotation) @@ -330,7 +334,7 @@ def _parse_schema_from_parameter( schema.default = param.default _raise_if_schema_unsupported(variant, schema) return schema - if origin is Union: + if origin in (Union, typing_types.UnionType): schema.any_of = [] schema.type = types.Type.OBJECT unique_types = set() @@ -365,8 +369,10 @@ def _parse_schema_from_parameter( schema.any_of.append(schema_in_any_of) unique_types.add(schema_in_any_of.model_dump_json(exclude_none=True)) if len(schema.any_of) == 1: # param: Union[List, None] -> Array - schema.type = schema.any_of[0].type - schema.any_of = None + collapsed = schema.any_of[0] + if schema.nullable: + collapsed.nullable = True + schema = collapsed if ( param.default is not None and param.default is not inspect.Parameter.empty diff --git a/tests/unittests/tools/test_from_function_with_options.py b/tests/unittests/tools/test_from_function_with_options.py index 537094da39..4f77bc7b1f 100644 --- a/tests/unittests/tools/test_from_function_with_options.py +++ b/tests/unittests/tools/test_from_function_with_options.py @@ -324,7 +324,7 @@ async def test_function(param: str) -> AsyncGenerator[Dict[str, str], None]: def test_required_fields_set_in_json_schema_fallback(): """Test that required fields are populated when the json_schema fallback path is used. - When a parameter has a complex union type (e.g. list[str] | None) that + When a parameter has a complex type (e.g. tuple[str, ...] | None) that _parse_schema_from_parameter can't handle, from_function_with_options falls back to the parameters_json_schema branch. This test verifies that the required fields are correctly populated in that fallback branch. @@ -333,7 +333,7 @@ def test_required_fields_set_in_json_schema_fallback(): def complex_tool( query: str, mode: str = 'default', - tags: list[str] | None = None, + tags: tuple[str, ...] | None = None, ) -> str: """A tool where one param has a complex union type.""" return query diff --git a/tests/unittests/tools/test_set_model_response_tool.py b/tests/unittests/tools/test_set_model_response_tool.py index 5d658df67a..0f634b4911 100644 --- a/tests/unittests/tools/test_set_model_response_tool.py +++ b/tests/unittests/tools/test_set_model_response_tool.py @@ -15,6 +15,7 @@ """Tests for SetModelResponseTool.""" import inspect +from typing import Optional from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import LlmAgent @@ -467,3 +468,66 @@ async def test_run_async_dict_schema(): assert result is not None assert isinstance(result, dict) assert result == {'a': 1, 'b': 2, 'c': 3} + + +class SubSchema(BaseModel): + + field1: str = Field(description='Field 1') + field2: int = Field(description='Field 2') + + +class ConsolidatedOptionalSchema(BaseModel): + + nested: Optional[SubSchema] = Field(default=None, description='Nested model') + nested_list: Optional[list[SubSchema]] = Field( + default=None, description='Nested list of models' + ) + pep604_nested: SubSchema | None = Field( + default=None, description='PEP 604 optional nested model' + ) + pep604_raw_list: list | None = Field(default=None, description='Raw list') + + +def test_get_declaration_optional_fields(): + """Test that tool declaration preserves properties for various optional fields.""" + tool = SetModelResponseTool(ConsolidatedOptionalSchema) + + declaration = tool._get_declaration() + + assert declaration is not None + assert declaration.name == 'set_model_response' + params_schema = declaration.parameters + assert params_schema is not None + assert params_schema.type == 'OBJECT' + + # 1. Optional[SubSchema] + assert 'nested' in params_schema.properties + nested_schema = params_schema.properties['nested'] + assert nested_schema.type == 'OBJECT' + assert nested_schema.properties is not None + assert nested_schema.properties['field1'].type == 'STRING' + assert nested_schema.properties['field2'].type == 'INTEGER' + + # 2. Optional[list[SubSchema]] + assert 'nested_list' in params_schema.properties + nested_list_schema = params_schema.properties['nested_list'] + assert nested_list_schema.type == 'ARRAY' + assert nested_list_schema.items is not None + items_schema = nested_list_schema.items + assert items_schema.type == 'OBJECT' + assert items_schema.properties is not None + assert items_schema.properties['field1'].type == 'STRING' + assert items_schema.properties['field2'].type == 'INTEGER' + + # 3. SubSchema | None (PEP 604) + assert 'pep604_nested' in params_schema.properties + pep604_nested_schema = params_schema.properties['pep604_nested'] + assert pep604_nested_schema.type == 'OBJECT' + assert pep604_nested_schema.properties is not None + assert pep604_nested_schema.properties['field1'].type == 'STRING' + assert pep604_nested_schema.properties['field2'].type == 'INTEGER' + + # 4. list | None (PEP 604) + assert 'pep604_raw_list' in params_schema.properties + pep604_raw_list_schema = params_schema.properties['pep604_raw_list'] + assert pep604_raw_list_schema.type == 'ARRAY' From a3257d08ebac9146dfb5ed0ee651595c1e9e8957 Mon Sep 17 00:00:00 2001 From: Shangjie Chen Date: Wed, 27 May 2026 13:38:01 -0700 Subject: [PATCH 31/94] chore: Synchronize packages under integrations/ and its unittests with public mirror Co-authored-by: Shangjie Chen PiperOrigin-RevId: 922320019 --- .../adk/integrations/bigquery/__init__.py | 49 + .../bigquery/bigquery_credentials.py | 43 + .../integrations/bigquery/bigquery_toolset.py | 101 ++ .../adk/integrations/bigquery/client.py | 115 ++ .../adk/integrations/bigquery/config.py | 158 ++ .../bigquery/data_insights_tool.py | 167 ++ .../integrations/bigquery/metadata_tool.py | 619 ++++++++ .../adk/integrations/bigquery/query_tool.py | 1384 +++++++++++++++++ .../adk/integrations/bigquery/search_tool.py | 183 +++ .../adk/integrations/crewai/__init__.py | 2 + .../adk/integrations/langchain/__init__.py | 2 + .../adk/integrations/slack/slack_runner.py | 6 +- .../integrations/vmaas/sandbox_computer.py | 37 +- src/google/adk/tools/bigquery/__init__.py | 40 +- .../tools/bigquery/bigquery_credentials.py | 33 +- .../adk/tools/bigquery/bigquery_toolset.py | 91 +- src/google/adk/tools/bigquery/client.py | 105 +- src/google/adk/tools/bigquery/config.py | 148 +- .../adk/tools/bigquery/data_insights_tool.py | 177 +-- .../adk/tools/bigquery/metadata_tool.py | 584 +------ src/google/adk/tools/bigquery/query_tool.py | 1361 +--------------- src/google/adk/tools/bigquery/search_tool.py | 172 +- .../integrations/api_registry/__init__.py | 2 + .../bigquery/test_bigquery_client.py | 6 +- .../bigquery/test_bigquery_credentials.py | 4 +- .../test_bigquery_data_insights_tool.py | 2 +- .../bigquery/test_bigquery_metadata_tool.py | 6 +- .../bigquery/test_bigquery_query_tool.py | 51 +- .../bigquery/test_bigquery_search_tool.py | 6 +- .../bigquery/test_bigquery_tool_config.py | 2 +- .../bigquery/test_bigquery_toolset.py | 6 +- ...k_data_insights_penguins_highest_mass.yaml | 0 .../integrations/crewai/test_crewai_tool.py | 1 + .../test_parameter_client.py | 7 +- .../secret_manager/test_secret_client.py | 3 + .../integrations/slack/test_slack_runner.py | 4 + 36 files changed, 2996 insertions(+), 2681 deletions(-) create mode 100644 src/google/adk/integrations/bigquery/__init__.py create mode 100644 src/google/adk/integrations/bigquery/bigquery_credentials.py create mode 100644 src/google/adk/integrations/bigquery/bigquery_toolset.py create mode 100644 src/google/adk/integrations/bigquery/client.py create mode 100644 src/google/adk/integrations/bigquery/config.py create mode 100644 src/google/adk/integrations/bigquery/data_insights_tool.py create mode 100644 src/google/adk/integrations/bigquery/metadata_tool.py create mode 100644 src/google/adk/integrations/bigquery/query_tool.py create mode 100644 src/google/adk/integrations/bigquery/search_tool.py rename tests/unittests/{tools => integrations}/bigquery/test_bigquery_client.py (98%) rename tests/unittests/{tools => integrations}/bigquery/test_bigquery_credentials.py (98%) rename tests/unittests/{tools => integrations}/bigquery/test_bigquery_data_insights_tool.py (98%) rename tests/unittests/{tools => integrations}/bigquery/test_bigquery_metadata_tool.py (98%) rename tests/unittests/{tools => integrations}/bigquery/test_bigquery_query_tool.py (98%) rename tests/unittests/{tools => integrations}/bigquery/test_bigquery_search_tool.py (98%) rename tests/unittests/{tools => integrations}/bigquery/test_bigquery_tool_config.py (98%) rename tests/unittests/{tools => integrations}/bigquery/test_bigquery_toolset.py (95%) rename tests/unittests/{tools => integrations}/bigquery/test_data/ask_data_insights_penguins_highest_mass.yaml (100%) diff --git a/src/google/adk/integrations/bigquery/__init__.py b/src/google/adk/integrations/bigquery/__init__.py new file mode 100644 index 0000000000..021ed08a50 --- /dev/null +++ b/src/google/adk/integrations/bigquery/__init__.py @@ -0,0 +1,49 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""BigQuery Integration. + +This module provides tools and skills for interacting with BigQuery. +""" + +from __future__ import annotations + +import typing + +if typing.TYPE_CHECKING: + from .bigquery_credentials import BigQueryCredentialsConfig + from .bigquery_skill import get_bigquery_skill + from .bigquery_toolset import BigQueryToolset + +# Map attribute names to relative module paths +_lazy_imports = { + "BigQueryCredentialsConfig": ".bigquery_credentials", + "BigQueryToolset": ".bigquery_toolset", + "get_bigquery_skill": ".bigquery_skill", +} + + +def __getattr__(name: str) -> any: + if name in _lazy_imports: + import importlib + + module_path = _lazy_imports[name] + # __name__ is 'google.adk.integrations.bigquery' + module = importlib.import_module(module_path, __name__) + return getattr(module, name) + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + + +def __dir__() -> list[str]: + return list(_lazy_imports.keys()) diff --git a/src/google/adk/integrations/bigquery/bigquery_credentials.py b/src/google/adk/integrations/bigquery/bigquery_credentials.py new file mode 100644 index 0000000000..a633d272a0 --- /dev/null +++ b/src/google/adk/integrations/bigquery/bigquery_credentials.py @@ -0,0 +1,43 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from ...features import FeatureName +from ...tools._google_credentials import BaseGoogleCredentialsConfig + +BIGQUERY_TOKEN_CACHE_KEY = "bigquery_token_cache" +BIGQUERY_SCOPES = [ + "https://www.googleapis.com/auth/bigquery", + "https://www.googleapis.com/auth/dataplex.read-write", +] +BIGQUERY_DEFAULT_SCOPE = ["https://www.googleapis.com/auth/bigquery"] + + +class BigQueryCredentialsConfig(BaseGoogleCredentialsConfig): + """BigQuery Credentials Configuration for Google API tools. + + Please do not use this in production, as it may be deprecated later. + """ + + def __post_init__(self) -> BigQueryCredentialsConfig: + """Populate default scope if scopes is None.""" + super().__post_init__() + + if not self.scopes: + self.scopes = BIGQUERY_SCOPES + # Set the token cache key + self._token_cache_key = BIGQUERY_TOKEN_CACHE_KEY + + return self diff --git a/src/google/adk/integrations/bigquery/bigquery_toolset.py b/src/google/adk/integrations/bigquery/bigquery_toolset.py new file mode 100644 index 0000000000..37a5070996 --- /dev/null +++ b/src/google/adk/integrations/bigquery/bigquery_toolset.py @@ -0,0 +1,101 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import List +from typing import Optional +from typing import Union + +from google.adk.agents.readonly_context import ReadonlyContext +from typing_extensions import override + +from . import data_insights_tool +from . import metadata_tool +from . import query_tool +from . import search_tool +from ...features import FeatureName +from ...tools.base_tool import BaseTool +from ...tools.base_toolset import BaseToolset +from ...tools.base_toolset import ToolPredicate +from ...tools.google_tool import GoogleTool +from .bigquery_credentials import BigQueryCredentialsConfig +from .config import BigQueryToolConfig + + +class BigQueryToolset(BaseToolset): + """BigQuery Toolset contains tools for interacting with BigQuery data and metadata.""" + + def __init__( + self, + *, + tool_filter: Optional[Union[ToolPredicate, List[str]]] = None, + credentials_config: Optional[BigQueryCredentialsConfig] = None, + bigquery_tool_config: Optional[BigQueryToolConfig] = None, + ): + super().__init__(tool_filter=tool_filter) + self._credentials_config = credentials_config + self._tool_settings = ( + bigquery_tool_config if bigquery_tool_config else BigQueryToolConfig() + ) + + def _is_tool_selected( + self, tool: BaseTool, readonly_context: ReadonlyContext + ) -> bool: + if self.tool_filter is None: + return True + + if isinstance(self.tool_filter, ToolPredicate): + return self.tool_filter(tool, readonly_context) + + if isinstance(self.tool_filter, list): + return tool.name in self.tool_filter + + return False + + @override + async def get_tools( + self, readonly_context: Optional[ReadonlyContext] = None + ) -> List[BaseTool]: + """Get tools from the toolset.""" + all_tools = [ + GoogleTool( + func=func, + credentials_config=self._credentials_config, + tool_settings=self._tool_settings, + ) + for func in [ + metadata_tool.get_dataset_info, + metadata_tool.get_table_info, + metadata_tool.list_dataset_ids, + metadata_tool.list_table_ids, + metadata_tool.get_job_info, + query_tool.get_execute_sql(self._tool_settings), + query_tool.forecast, + query_tool.analyze_contribution, + query_tool.detect_anomalies, + data_insights_tool.ask_data_insights, + search_tool.search_catalog, + ] + ] + + return [ + tool + for tool in all_tools + if self._is_tool_selected(tool, readonly_context) + ] + + @override + async def close(self): + pass diff --git a/src/google/adk/integrations/bigquery/client.py b/src/google/adk/integrations/bigquery/client.py new file mode 100644 index 0000000000..526a181420 --- /dev/null +++ b/src/google/adk/integrations/bigquery/client.py @@ -0,0 +1,115 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os +from typing import List +from typing import Optional +from typing import Union + +import google.api_core.client_info +from google.api_core.gapic_v1 import client_info as gapic_client_info +from google.auth.credentials import Credentials +from google.cloud import bigquery +from google.cloud import dataplex_v1 + +from ... import version +from ...utils._telemetry_context import _is_visual_builder + +USER_AGENT_BASE = f"google-adk/{version.__version__}" +BQ_USER_AGENT = f"adk-bigquery-tool {USER_AGENT_BASE}" +DP_USER_AGENT = f"adk-dataplex-tool {USER_AGENT_BASE}" +USER_AGENT = BQ_USER_AGENT + +# Internal identifier for Visual Builder usage tracking. +_VISUAL_BUILDER_UA = "google-adk-visual-builder" + + +def get_bigquery_client( + *, + project: Optional[str], + credentials: Credentials, + location: Optional[str] = None, + user_agent: Optional[Union[str, List[str]]] = None, +) -> bigquery.Client: + """Get a BigQuery client. + + Args: + project: The GCP project ID. + credentials: The credentials to use for the request. + location: The location of the BigQuery client. + user_agent: The user agent to use for the request. + + Returns: + A BigQuery client. + """ + + user_agents = [BQ_USER_AGENT] + + if _is_visual_builder.get(): + user_agents.append(_VISUAL_BUILDER_UA) + + if user_agent: + if isinstance(user_agent, str): + user_agents.append(user_agent) + else: + user_agents.extend([ua for ua in user_agent if ua]) + + client_info = google.api_core.client_info.ClientInfo( + user_agent=" ".join(user_agents) + ) + + bigquery_client = bigquery.Client( + project=project, + credentials=credentials, + location=location, + client_info=client_info, + ) + + return bigquery_client + + +def get_dataplex_catalog_client( + *, + credentials: Credentials, + user_agent: Optional[Union[str, List[str]]] = None, +) -> dataplex_v1.CatalogServiceClient: + """Get a Dataplex CatalogServiceClient with minimal necessary arguments. + + Args: + credentials: The credentials to use for the request. + user_agent: Additional user agent string(s) to append. + + Returns: + A Dataplex Client. + """ + + user_agents = [DP_USER_AGENT] + + if _is_visual_builder.get(): + user_agents.append(_VISUAL_BUILDER_UA) + + if user_agent: + if isinstance(user_agent, str): + user_agents.append(user_agent) + else: + user_agents.extend([ua for ua in user_agent if ua]) + + client_info = gapic_client_info.ClientInfo(user_agent=" ".join(user_agents)) + + return dataplex_v1.CatalogServiceClient( + credentials=credentials, + client_info=client_info, + ) diff --git a/src/google/adk/integrations/bigquery/config.py b/src/google/adk/integrations/bigquery/config.py new file mode 100644 index 0000000000..e2c56ab1e3 --- /dev/null +++ b/src/google/adk/integrations/bigquery/config.py @@ -0,0 +1,158 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from enum import Enum +from typing import Optional + +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import field_validator + +from ...features import FeatureName + + +class WriteMode(Enum): + """Write mode indicating what levels of write operations are allowed in BigQuery.""" + + BLOCKED = 'blocked' + """No write operations are allowed. + + This mode implies that only read (i.e. SELECT query) operations are allowed. + """ + + PROTECTED = 'protected' + """Only protected write operations are allowed in a BigQuery session. + + In this mode write operations in the anonymous dataset of a BigQuery session + are allowed. For example, a temporary table can be created, manipulated and + deleted in the anonymous dataset during Agent interaction, while protecting + permanent tables from being modified or deleted. To learn more about BigQuery + sessions, see https://cloud.google.com/bigquery/docs/sessions-intro. + """ + + ALLOWED = 'allowed' + """All write operations are allowed.""" + + +class BigQueryToolConfig(BaseModel): + """Configuration for BigQuery tools.""" + + # Forbid any fields not defined in the model + model_config = ConfigDict(extra='forbid') + + write_mode: WriteMode = WriteMode.BLOCKED + """Write mode for BigQuery tools. + + By default, the tool will allow only read operations. This behaviour may + change in future versions. + """ + + maximum_bytes_billed: Optional[int] = None + """Maximum number of bytes to bill for a query. + + In BigQuery on-demand pricing, charges are rounded up to the nearest MB, with + a minimum 10 MB data processed per table referenced by the query, and with a + minimum 10 MB data processed per query. So this value must be set >=10485760. + """ + + max_query_result_rows: int = 50 + """Maximum number of rows to return from a query. + + By default, the query result will be limited to 50 rows. + """ + + application_name: Optional[str] = None + """Name of the application using the BigQuery tools. + + By default, no particular application name will be set in the BigQuery + interaction. But if the tool user (agent builder) wants to differentiate + their application/agent for tracking or support purpose, they can set this + field. If set, this value will be added to the user_agent in BigQuery API + calls, and also to the BigQuery job labels with the key + "adk-bigquery-application-name". + + Note: This field is for usage discovery and tracking purposes only and should + not be used for security-sensitive decisions. + """ + + compute_project_id: Optional[str] = None + """GCP project ID to use for the BigQuery compute operations. + + This can be set as a guardrail to ensure that the tools perform the compute + operations (such as query execution) in a specific project. + """ + + location: Optional[str] = None + """BigQuery location to use for the data and compute. + + This can be set if the BigQuery tools are expected to process data in a + particular BigQuery location. If not set, then location would be automatically + determined based on the data location in the query. For all supported + locations, see https://cloud.google.com/bigquery/docs/locations. + """ + + job_labels: Optional[dict[str, str]] = None + """Labels to apply to BigQuery jobs for tracking and monitoring. + + These labels will be added to all BigQuery jobs executed by the tools. + Labels must be key-value pairs where both keys and values are strings. + Labels can be used for billing, monitoring, and resource organization. + For more information about labels, see + https://cloud.google.com/bigquery/docs/labels-intro. + + Note: These labels are for usage discovery and tracking purposes only and + should not be used for security-sensitive decisions. The number of + user-provided labels is restricted to 20, and keys starting with + "adk-bigquery-" are reserved for internal usage. + """ + + @field_validator('maximum_bytes_billed') + @classmethod + def validate_maximum_bytes_billed(cls, v): + """Validate the maximum bytes billed.""" + if v and v < 10_485_760: + raise ValueError( + 'In BigQuery on-demand pricing, charges are rounded up to the nearest' + ' MB, with a minimum 10 MB data processed per table referenced by the' + ' query, and with a minimum 10 MB data processed per query. So' + ' max_bytes_billed must be set >=10485760.' + ) + return v + + @field_validator('application_name') + @classmethod + def validate_application_name(cls, v): + """Validate the application name.""" + if v and ' ' in v: + raise ValueError('Application name should not contain spaces.') + return v + + @field_validator('job_labels') + @classmethod + def validate_job_labels(cls, v): + """Validate the job labels.""" + if v is not None: + if len(v) > 20: + raise ValueError('Only up to 20 job labels can be provided') + for key in v.keys(): + if not key: + raise ValueError('Label keys cannot be empty.') + if key.startswith('adk-bigquery-'): + raise ValueError( + 'Label key cannot start with "adk-bigquery-" as it is' + f' reserved for internal usage, found "{key}".' + ) + return v diff --git a/src/google/adk/integrations/bigquery/data_insights_tool.py b/src/google/adk/integrations/bigquery/data_insights_tool.py new file mode 100644 index 0000000000..37959c02a3 --- /dev/null +++ b/src/google/adk/integrations/bigquery/data_insights_tool.py @@ -0,0 +1,167 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import annotations + +import json +from typing import Any +from typing import Dict +from typing import List + +from google.adk.tools import _gda_stream_util +from google.auth.credentials import Credentials +from google.cloud import bigquery +import requests + +from . import client +from .config import BigQueryToolConfig + +_GDA_CLIENT_ID = "GOOGLE_ADK" + + +def ask_data_insights( + project_id: str, + user_query_with_context: str, + table_references: List[Dict[str, str]], + credentials: Credentials, + settings: BigQueryToolConfig, +) -> Dict[str, Any]: + """Answers questions about structured data in BigQuery tables using natural language. + + This function takes a user's question (which can include conversational + history for context) and references to specific BigQuery tables, and sends + them to a stateless conversational API. + + The API uses a GenAI agent to understand the question, generate and execute + SQL queries and Python code, and formulate an answer. This function returns a + detailed, sequential log of this entire process, which includes any generated + SQL or Python code, the data retrieved, and the final text answer. The final + answer is always in plain text, as the underlying API is instructed not to + generate any charts, graphs, images, or other visualizations. + + Use this tool to perform data analysis, get insights, or answer complex + questions about the contents of specific BigQuery tables. + + Args: + project_id (str): The project that the inquiry is performed in. + user_query_with_context (str): The user's original request, enriched with + relevant context from the conversation history. The user's core intent + should be preserved, but context should be added to resolve ambiguities + in follow-up questions. + table_references (List[Dict[str, str]]): A list of dictionaries, each + specifying a BigQuery table to be used as context for the question. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + + Returns: + A dictionary with two keys: + - 'status': A string indicating the final status (e.g., "SUCCESS"). + - 'response': A list of dictionaries, where each dictionary + represents a step in the API's execution process (e.g., SQL + generation, data retrieval, final answer). + + Example: + A query joining multiple tables, showing the full return structure. + The original question: "Which customer from New York spent the most last + month?" + + >>> ask_data_insights( + ... project_id="some-project-id", + ... user_query_with_context=( + ... "Which customer from New York spent the most last month?" + ... "Context: The 'customers' table joins with the 'orders' table" + ... " on the 'customer_id' column." + ... "" + ... ), + ... table_references=[ + ... { + ... "projectId": "my-gcp-project", + ... "datasetId": "sales_data", + ... "tableId": "customers" + ... }, + ... { + ... "projectId": "my-gcp-project", + ... "datasetId": "sales_data", + ... "tableId": "orders" + ... } + ... ] + ... ) + { + "status": "SUCCESS", + "response": [ + { + "SQL Generated": "SELECT t1.customer_name, SUM(t2.order_total) ... " + }, + { + "Data Retrieved": { + "headers": ["customer_name", "total_spent"], + "rows": [["Jane Doe", 1234.56]], + "summary": "Showing all 1 rows." + } + }, + { + "Answer": "The customer who spent the most was Jane Doe." + } + ] + } + """ + try: + location = "global" + if not credentials.token: + error_message = ( + "Error: The provided credentials object does not have a valid access" + " token.\n\nThis is often because the credentials need to be" + " refreshed or require specific API scopes. Please ensure the" + " credentials are prepared correctly before calling this" + " function.\n\nThere may be other underlying causes as well." + ) + return { + "status": "ERROR", + "error_details": "ask_data_insights requires a valid access token.", + } + headers = { + "Authorization": f"Bearer {credentials.token}", + "Content-Type": "application/json", + "X-Goog-API-Client": _GDA_CLIENT_ID, + } + ca_url = f"https://geminidataanalytics.googleapis.com/v1beta/projects/{project_id}/locations/{location}:chat" + + instructions = """**INSTRUCTIONS - FOLLOW THESE RULES:** + 1. **CONTENT:** Your answer should present the supporting data and then provide a conclusion based on that data, including relevant details and observations where possible. + 2. **ANALYSIS DEPTH:** Your analysis must go beyond surface-level observations. Crucially, you must prioritize metrics that measure impact or outcomes over metrics that simply measure volume or raw counts. For open-ended questions, explore the topic from multiple perspectives to provide a holistic view. + 3. **OUTPUT FORMAT:** Your entire response MUST be in plain text format ONLY. + 4. **NO CHARTS:** You are STRICTLY FORBIDDEN from generating any charts, graphs, images, or any other form of visualization. + """ + + ca_payload = { + "project": f"projects/{project_id}", + "messages": [{"userMessage": {"text": user_query_with_context}}], + "inlineContext": { + "datasourceReferences": { + "bq": {"tableReferences": table_references} + }, + "systemInstruction": instructions, + "options": {"chart": {"image": {"noImage": {}}}}, + }, + "clientIdEnum": _GDA_CLIENT_ID, + } + + resp = _gda_stream_util.get_stream( + ca_url, ca_payload, headers, settings.max_query_result_rows + ) + except Exception as ex: # pylint: disable=broad-except + return { + "status": "ERROR", + "error_details": str(ex), + } + return {"status": "SUCCESS", "response": resp} diff --git a/src/google/adk/integrations/bigquery/metadata_tool.py b/src/google/adk/integrations/bigquery/metadata_tool.py new file mode 100644 index 0000000000..1f67a98908 --- /dev/null +++ b/src/google/adk/integrations/bigquery/metadata_tool.py @@ -0,0 +1,619 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.auth.credentials import Credentials +from google.cloud import bigquery + +from . import client +from .config import BigQueryToolConfig + + +def list_dataset_ids( + project_id: str, credentials: Credentials, settings: BigQueryToolConfig +) -> list[str]: + """List BigQuery dataset ids in a Google Cloud project. + + Args: + project_id (str): The Google Cloud project id. + credentials (Credentials): The credentials to use for the request. + + Returns: + list[str]: List of the BigQuery dataset ids present in the project. + + Examples: + >>> list_dataset_ids("bigquery-public-data") + ['america_health_rankings', + 'american_community_survey', + 'aml_ai_input_dataset', + 'austin_311', + 'austin_bikeshare', + 'austin_crime', + 'austin_incidents', + 'austin_waste', + 'baseball', + 'bbc_news'] + """ + try: + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=[settings.application_name, "list_dataset_ids"], + ) + + datasets = [] + for dataset in bq_client.list_datasets(project_id): + datasets.append(dataset.dataset_id) + return datasets + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } + + +def get_dataset_info( + project_id: str, + dataset_id: str, + credentials: Credentials, + settings: BigQueryToolConfig, +) -> dict: + """Get metadata information about a BigQuery dataset. + + Args: + project_id (str): The Google Cloud project id containing the dataset. + dataset_id (str): The BigQuery dataset id. + credentials (Credentials): The credentials to use for the request. + + Returns: + dict: Dictionary representing the properties of the dataset. + + Examples: + >>> get_dataset_info("bigquery-public-data", "cdc_places") + { + "kind": "bigquery#dataset", + "etag": "fz9BaiXKgbGi53EpI2rJug==", + "id": "bigquery-public-data:cdc_places", + "selfLink": + "https://content-bigquery.googleapis.com/bigquery/v2/projects/bigquery-public-data/datasets/cdc_places", + "datasetReference": { + "datasetId": "cdc_places", + "projectId": "bigquery-public-data" + }, + "description": "Local Data for Better Health, County Data", + "access": [ + { + "role": "WRITER", + "specialGroup": "projectWriters" + }, + { + "role": "OWNER", + "specialGroup": "projectOwners" + }, + { + "role": "OWNER", + "userByEmail": + "some-redacted-email@bigquery-public-data.iam.gserviceaccount.com" + }, + { + "role": "READER", + "specialGroup": "projectReaders" + } + ], + "creationTime": "1640891845643", + "lastModifiedTime": "1640891845643", + "location": "US", + "type": "DEFAULT", + "maxTimeTravelHours": "168" + } + """ + try: + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=[settings.application_name, "get_dataset_info"], + ) + dataset = bq_client.get_dataset( + bigquery.DatasetReference(project_id, dataset_id) + ) + return dataset.to_api_repr() + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } + + +def list_table_ids( + project_id: str, + dataset_id: str, + credentials: Credentials, + settings: BigQueryToolConfig, +) -> list[str]: + """List table ids in a BigQuery dataset. + + Args: + project_id (str): The Google Cloud project id containing the dataset. + dataset_id (str): The BigQuery dataset id. + credentials (Credentials): The credentials to use for the request. + + Returns: + list[str]: List of the tables ids present in the dataset. + + Examples: + >>> list_table_ids("bigquery-public-data", "cdc_places") + ['chronic_disease_indicators', + 'local_data_for_better_health_county_data'] + """ + try: + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=[settings.application_name, "list_table_ids"], + ) + + tables = [] + for table in bq_client.list_tables( + bigquery.DatasetReference(project_id, dataset_id) + ): + tables.append(table.table_id) + return tables + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } + + +def get_table_info( + project_id: str, + dataset_id: str, + table_id: str, + credentials: Credentials, + settings: BigQueryToolConfig, +) -> dict: + """Get metadata information about a BigQuery table. + + Args: + project_id (str): The Google Cloud project id containing the dataset. + dataset_id (str): The BigQuery dataset id containing the table. + table_id (str): The BigQuery table id. + credentials (Credentials): The credentials to use for the request. + + Returns: + dict: Dictionary representing the properties of the table. + + Examples: + >>> get_table_info("bigquery-public-data", "cdc_places", + "local_data_for_better_health_county_data") + { + "kind": "bigquery#table", + "etag": "wx23aDqmgc39oUSiNuYTAA==", + "id": + "bigquery-public-data:cdc_places.local_data_for_better_health_county_data", + "selfLink": + "https://content-bigquery.googleapis.com/bigquery/v2/projects/bigquery-public-data/datasets/cdc_places/tables/local_data_for_better_health_county_data", + "tableReference": { + "projectId": "bigquery-public-data", + "datasetId": "cdc_places", + "tableId": "local_data_for_better_health_county_data" + }, + "description": "Local Data for Better Health, County Data", + "schema": { + "fields": [ + { + "name": "year", + "type": "INTEGER", + "mode": "NULLABLE" + }, + { + "name": "stateabbr", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "statedesc", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "locationname", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "datasource", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "category", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "measure", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "data_value_unit", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "data_value_type", + "type": "STRING", + "mode": "NULLABLE" + }, + { + "name": "data_value", + "type": "FLOAT", + "mode": "NULLABLE" + } + ] + }, + "numBytes": "234849", + "numLongTermBytes": "0", + "numRows": "1000", + "creationTime": "1640891846119", + "lastModifiedTime": "1749427268137", + "type": "TABLE", + "location": "US", + "numTimeTravelPhysicalBytes": "285737", + "numTotalLogicalBytes": "234849", + "numActiveLogicalBytes": "234849", + "numLongTermLogicalBytes": "0", + "numTotalPhysicalBytes": "326557", + "numActivePhysicalBytes": "326557", + "numLongTermPhysicalBytes": "0", + "numCurrentPhysicalBytes": "40820" + } + """ + try: + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=[settings.application_name, "get_table_info"], + ) + return bq_client.get_table( + bigquery.TableReference( + bigquery.DatasetReference(project_id, dataset_id), table_id + ) + ).to_api_repr() + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } + + +def get_job_info( + project_id: str, + job_id: str, + credentials: Credentials, + settings: BigQueryToolConfig, +) -> dict: + """Get metadata information about a BigQuery job. + + Including slot usage, + + job configuration, job statistics, job status, original query etc. + + Args: + project_id (str): The Google Cloud project id containing the job. + job_id (str): The BigQuery job id. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The BigQuery tool settings. + + Returns: + dict: Dictionary representing the properties of the job. + + Examples: + >>> user may give job id in format of: project_id:region.job_id + like bigquery-public-data:US.bquxjob_12345678_1234567890 + >>> get_job_info("bigquery-public-data", "bquxjob_12345678_1234567890") + { + "get_job_info_response": { + "configuration": { + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_fd6de55d5d5c13fcfb0449cbf933bb695b2c3085", + "projectId": "projectid", + "tableId": "anonfbbe65d6_9782_469b_9f56_1392560314b2" + }, + "priority": "INTERACTIVE", + "query": "SELECT * FROM `projectid.dataset_id.table_id` WHERE + TIMESTAMP_TRUNC(_PARTITIONTIME, DAY) = TIMESTAMP(\"2025-10-29\") + LIMIT 1000", + "useLegacySql": false, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "etag": "EdeYv9sdcO7tD9HsffvcuQ==", + "id": "projectid:US.job-id", + "jobCreationReason": { + "code": "REQUESTED" + }, + "jobReference": { + "jobId": "job-id", + "location": "US", + "projectId": "projectid" + }, + "kind": "bigquery#job", + "principal_subject": "user:abc@google.com", + "selfLink": + "https://bigquery.googleapis.com/bigquery/v2/projects/projectid/jobs/job-id?location=US", + "statistics": { + "creationTime": 1761760370152, + "endTime": 1761760371250, + "finalExecutionDurationMs": "489", + "query": { + "billingTier": 1, + "cacheHit": false, + "estimatedBytesProcessed": "5597805", + "metadataCacheStatistics": { + "tableMetadataCacheUsage": [ + { + "explanation": "Table does not have CMETA.", + "tableReference": { + "datasetId": "datasetId", + "projectId": "projectid", + "tableId": "tableId" + }, + "unusedReason": "OTHER_REASON" + } + ] + }, + "queryPlan": [ + { + "completedParallelInputs": "3", + "computeMode": "BIGQUERY", + "computeMsAvg": "13", + "computeMsMax": "15", + "computeRatioAvg": 0.054852320675105488, + "computeRatioMax": 0.063291139240506333, + "endMs": "1761760370422", + "id": "0", + "name": "S00: Input", + "parallelInputs": "8", + "readMsAvg": "18", + "readMsMax": "21", + "readRatioAvg": 0.0759493670886076, + "readRatioMax": 0.088607594936708861, + "recordsRead": "1690", + "recordsWritten": "1690", + "shuffleOutputBytes": "1031149", + "shuffleOutputBytesSpilled": "0", + "slotMs": "157", + "startMs": "1761760370388", + "status": "COMPLETE", + "steps": [ + { + "kind": "READ", + "substeps": [ + "$2:extendedFields.$is_not_null, + $3:extendedFields.traceId, $4:span.$is_not_null, + $5:span.spanKind, $6:span.endTime, $7:span.startTime, + $8:span.parentSpanId, $9:span.spanId, $10:span.name, + $11:span.childSpanCount.$is_not_null, + $12:span.childSpanCount.value, + $13:span.sameProcessAsParentSpan.$is_not_null, + $14:span.sameProcessAsParentSpan.value, + $15:span.status.$is_not_null, $16:span.status.message, + $17:span.status.code", + "FROM projectid.dataset_id.table_id", + "WHERE equal(timestamp_trunc($1, 3), + 1761696000.000000000)" + ] + }, + { + "kind": "LIMIT", + "substeps": [ + "1000" + ] + }, + { + "kind": "WRITE", + "substeps": [ + "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, + $14, $15, $16, $17", + "TO __stage00_output" + ] + } + ], + "waitMsAvg": "1", + "waitMsMax": "1", + "waitRatioAvg": 0.0042194092827004216, + "waitRatioMax": 0.0042194092827004216, + "writeMsAvg": "2", + "writeMsMax": "2", + "writeRatioAvg": 0.0084388185654008432, + "writeRatioMax": 0.0084388185654008432 + }, + { + "completedParallelInputs": "1", + "computeMode": "BIGQUERY", + "computeMsAvg": "22", + "computeMsMax": "22", + "computeRatioAvg": 0.092827004219409287, + "computeRatioMax": 0.092827004219409287, + "endMs": "1761760370428", + "id": "1", + "inputStages": [ + "0" + ], + "name": "S01: Compute+", + "parallelInputs": "1", + "readMsAvg": "0", + "readMsMax": "0", + "readRatioAvg": 0, + "readRatioMax": 0, + "recordsRead": "1001", + "recordsWritten": "1000", + "shuffleOutputBytes": "800157", + "shuffleOutputBytesSpilled": "0", + "slotMs": "29", + "startMs": "1761760370398", + "status": "COMPLETE", + "steps": [ + { + "kind": "READ", + "substeps": [ + "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, + $14, $15, $16, $17", + "FROM __stage00_output" + ] + }, + { + "kind": "COMPUTE", + "substeps": [ + "$130 := MAKE_STRUCT($3, $2)", + "$131 := MAKE_STRUCT($10, $9, $8, MAKE_STRUCT($29, $28, + $27), $7, $6, MAKE_STRUCT(...), MAKE_STRUCT(...), + MAKE_STRUCT(...), ...)" + ] + }, + { + "kind": "LIMIT", + "substeps": [ + "1000" + ] + }, + { + "kind": "WRITE", + "substeps": [ + "$130, $131", + "TO __stage01_output" + ] + } + ], + "waitMsAvg": "7", + "waitMsMax": "7", + "waitRatioAvg": 0.029535864978902954, + "waitRatioMax": 0.029535864978902954, + "writeMsAvg": "4", + "writeMsMax": "4", + "writeRatioAvg": 0.016877637130801686, + "writeRatioMax": 0.016877637130801686 + }, + { + "completedParallelInputs": "1", + "computeMode": "BIGQUERY", + "computeMsAvg": "33", + "computeMsMax": "33", + "computeRatioAvg": 0.13924050632911392, + "computeRatioMax": 0.13924050632911392, + "endMs": "1761760370745", + "id": "2", + "inputStages": [ + "1" + ], + "name": "S02: Output", + "parallelInputs": "1", + "readMsAvg": "0", + "readMsMax": "0", + "readRatioAvg": 0, + "readRatioMax": 0, + "recordsRead": "1000", + "recordsWritten": "1000", + "shuffleOutputBytes": "459829", + "shuffleOutputBytesSpilled": "0", + "slotMs": "106", + "startMs": "1761760370667", + "status": "COMPLETE", + "steps": [ + { + "kind": "READ", + "substeps": [ + "$130, $131", + "FROM __stage01_output" + ] + }, + { + "kind": "WRITE", + "substeps": [ + "$130, $131", + "TO __stage02_output" + ] + } + ], + "waitMsAvg": "237", + "waitMsMax": "237", + "waitRatioAvg": 1, + "waitRatioMax": 1, + "writeMsAvg": "55", + "writeMsMax": "55", + "writeRatioAvg": 0.2320675105485232, + "writeRatioMax": 0.2320675105485232 + } + ], + "referencedTables": [ + { + "datasetId": "dataset_id", + "projectId": "projectid", + "tableId": "table_id" + } + ], + "statementType": "SELECT", + "timeline": [ + { + "completedUnits": "5", + "elapsedMs": "492", + "estimatedRunnableUnits": "0", + "pendingUnits": "5", + "totalSlotMs": "293" + } + ], + "totalBytesBilled": "10485760", + "totalBytesProcessed": "5597805", + "totalPartitionsProcessed": "2", + "totalSlotMs": "293", + "transferredBytes": "0" + }, + "startTime": 1761760370268, + "totalBytesProcessed": "5597805", + "totalSlotMs": "293" + }, + "status": { + "state": "DONE" + }, + "user_email": "abc@google.com" + } + } + """ + try: + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=[settings.application_name, "get_job_info"], + ) + + job = bq_client.get_job(job_id) + # We need to use _properties to get the job info because it contains all + # the job info. + # pylint: disable=protected-access + return job._properties + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } diff --git a/src/google/adk/integrations/bigquery/query_tool.py b/src/google/adk/integrations/bigquery/query_tool.py new file mode 100644 index 0000000000..698f428363 --- /dev/null +++ b/src/google/adk/integrations/bigquery/query_tool.py @@ -0,0 +1,1384 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import functools +import json +import types +from typing import Callable +from typing import Optional +import uuid + +from google.auth.credentials import Credentials +from google.cloud import bigquery + +from . import client +from ...tools.tool_context import ToolContext +from .config import BigQueryToolConfig +from .config import WriteMode + +BIGQUERY_SESSION_INFO_KEY = "bigquery_session_info" + + +def _execute_sql( + project_id: str, + query: str, + credentials: Credentials, + settings: BigQueryToolConfig, + tool_context: ToolContext, + dry_run: bool = False, + caller_id: Optional[str] = None, +) -> dict: + try: + # Validate compute project if applicable + if ( + settings.compute_project_id + and project_id != settings.compute_project_id + ): + return { + "status": "ERROR", + "error_details": ( + f"Cannot execute query in the project {project_id}, as the tool" + " is restricted to execute queries only in the project" + f" {settings.compute_project_id}." + ), + } + + # Get BigQuery client + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=[settings.application_name, caller_id], + ) + + # BigQuery connection properties where applicable + bq_connection_properties = [] + + # BigQuery job labels if applicable + bq_job_labels = ( + settings.job_labels.copy() if settings and settings.job_labels else {} + ) + + if caller_id: + bq_job_labels["adk-bigquery-tool"] = caller_id + if settings and settings.application_name: + bq_job_labels["adk-bigquery-application-name"] = settings.application_name + + if not settings or settings.write_mode == WriteMode.BLOCKED: + dry_run_query_job = bq_client.query( + query, + project=project_id, + job_config=bigquery.QueryJobConfig( + dry_run=True, labels=bq_job_labels + ), + ) + if dry_run_query_job.statement_type != "SELECT": + return { + "status": "ERROR", + "error_details": "Read-only mode only supports SELECT statements.", + } + elif settings.write_mode == WriteMode.PROTECTED: + # In protected write mode, write operation only to a temporary artifact is + # allowed. This artifact must have been created in a BigQuery session. In + # such a scenario, the session info (session id and the anonymous dataset + # containing the artifact) is persisted in the tool context. + bq_session_info = tool_context.state.get(BIGQUERY_SESSION_INFO_KEY, None) + if bq_session_info: + bq_session_id, bq_session_dataset_id = bq_session_info + else: + session_creator_job = bq_client.query( + "SELECT 1", + project=project_id, + job_config=bigquery.QueryJobConfig( + dry_run=True, create_session=True, labels=bq_job_labels + ), + ) + bq_session_id = session_creator_job.session_info.session_id + bq_session_dataset_id = session_creator_job.destination.dataset_id + + # Remember the BigQuery session info for subsequent queries + tool_context.state[BIGQUERY_SESSION_INFO_KEY] = ( + bq_session_id, + bq_session_dataset_id, + ) + + # Session connection property will be set in the query execution + bq_connection_properties.append( + bigquery.ConnectionProperty("session_id", bq_session_id) + ) + + # Check the query type w.r.t. the BigQuery session + dry_run_query_job = bq_client.query( + query, + project=project_id, + job_config=bigquery.QueryJobConfig( + dry_run=True, + connection_properties=bq_connection_properties, + labels=bq_job_labels, + ), + ) + if ( + dry_run_query_job.statement_type != "SELECT" + and dry_run_query_job.destination + and dry_run_query_job.destination.dataset_id != bq_session_dataset_id + ): + return { + "status": "ERROR", + "error_details": ( + "Protected write mode only supports SELECT statements, or write" + " operations in the anonymous dataset of a BigQuery session." + ), + } + + # Return the dry run characteristics of the query if requested + if dry_run: + dry_run_job = bq_client.query( + query, + project=project_id, + job_config=bigquery.QueryJobConfig( + dry_run=True, + connection_properties=bq_connection_properties, + labels=bq_job_labels, + ), + ) + return {"status": "SUCCESS", "dry_run_info": dry_run_job.to_api_repr()} + + # Finally execute the query, fetch the result, and return it + job_config = bigquery.QueryJobConfig( + connection_properties=bq_connection_properties, + labels=bq_job_labels, + ) + if settings.maximum_bytes_billed: + job_config.maximum_bytes_billed = settings.maximum_bytes_billed + row_iterator = bq_client.query_and_wait( + query, + job_config=job_config, + project=project_id, + max_results=settings.max_query_result_rows, + ) + rows = [] + for row in row_iterator: + row_values = {} + for key, val in row.items(): + try: + # if the json serialization of the value succeeds, use it as is + json.dumps(val) + except (TypeError, ValueError, OverflowError): + val = str(val) + row_values[key] = val + rows.append(row_values) + + result = {"status": "SUCCESS", "rows": rows} + if ( + settings.max_query_result_rows is not None + and len(rows) == settings.max_query_result_rows + ): + result["result_is_likely_truncated"] = True + return result + except Exception as ex: # pylint: disable=broad-except + return { + "status": "ERROR", + "error_details": str(ex), + } + + +def execute_sql( + project_id: str, + query: str, + credentials: Credentials, + settings: BigQueryToolConfig, + tool_context: ToolContext, + dry_run: bool = False, +) -> dict: + """Run a BigQuery or BigQuery ML SQL query in the project and return the result. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + query (str): The BigQuery SQL query to be executed. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + tool_context (ToolContext): The context for the tool. + dry_run (bool, default False): If True, the query will not be executed. + Instead, the query will be validated and information about the query + will be returned. Defaults to False. + + Returns: + dict: If `dry_run` is False, dictionary representing the result of the + query. If the result contains the key "result_is_likely_truncated" + with value True, it means that there may be additional rows matching + the query not returned in the result. + If `dry_run` is True, dictionary with "dry_run_info" field + containing query information returned by BigQuery. + + Examples: + Fetch data or insights from a table: + + >>> execute_sql("my_project", + ... "SELECT island, COUNT(*) AS population " + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY + island") + { + "status": "SUCCESS", + "rows": [ + { + "island": "Dream", + "population": 124 + }, + { + "island": "Biscoe", + "population": 168 + }, + { + "island": "Torgersen", + "population": 52 + } + ] + } + + Validate a query and estimate costs without executing it: + + >>> execute_sql( + ... "my_project", + ... "SELECT island FROM " + ... "`bigquery-public-data`.`ml_datasets`.`penguins`", + ... dry_run=True + ... ) + { + "status": "SUCCESS", + "dry_run_info": { + "configuration": { + "dryRun": True, + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_...", + "projectId": "my_project", + "tableId": "anon..." + }, + "priority": "INTERACTIVE", + "query": "SELECT island FROM + `bigquery-public-data`.`ml_datasets`.`penguins`", + "useLegacySql": False, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "jobReference": { + "location": "US", + "projectId": "my_project" + } + } + } + """ + return _execute_sql( + project_id=project_id, + query=query, + credentials=credentials, + settings=settings, + tool_context=tool_context, + dry_run=dry_run, + caller_id="execute_sql", + ) + + +def _execute_sql_write_mode(*args, **kwargs) -> dict: + """Run a BigQuery or BigQuery ML SQL query in the project and return the result. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + query (str): The BigQuery SQL query to be executed. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + tool_context (ToolContext): The context for the tool. + dry_run (bool, default False): If True, the query will not be executed. + Instead, the query will be validated and information about the query + will be returned. Defaults to False. + + Returns: + dict: If `dry_run` is False, dictionary representing the result of the + query. If the result contains the key "result_is_likely_truncated" + with value True, it means that there may be additional rows matching + the query not returned in the result. + If `dry_run` is True, dictionary with "dry_run_info" field + containing query information returned by BigQuery. + + Examples: + Fetch data or insights from a table: + + >>> execute_sql("my_project", + ... "SELECT island, COUNT(*) AS population " + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY + island") + { + "status": "SUCCESS", + "rows": [ + { + "island": "Dream", + "population": 124 + }, + { + "island": "Biscoe", + "population": 168 + }, + { + "island": "Torgersen", + "population": 52 + } + ] + } + + Validate a query and estimate costs without executing it: + + >>> execute_sql( + ... "my_project", + ... "SELECT island FROM " + ... "`bigquery-public-data`.`ml_datasets`.`penguins`", + ... dry_run=True + ... ) + { + "status": "SUCCESS", + "dry_run_info": { + "configuration": { + "dryRun": True, + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_...", + "projectId": "my_project", + "tableId": "anon..." + }, + "priority": "INTERACTIVE", + "query": "SELECT island FROM + `bigquery-public-data`.`ml_datasets`.`penguins`", + "useLegacySql": False, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "jobReference": { + "location": "US", + "projectId": "my_project" + } + } + } + + Create a table with schema prescribed: + + >>> execute_sql("my_project", + ... "CREATE TABLE `my_project`.`my_dataset`.`my_table` " + ... "(island STRING, population INT64)") + { + "status": "SUCCESS", + "rows": [] + } + + Insert data into an existing table: + + >>> execute_sql("my_project", + ... "INSERT INTO `my_project`.`my_dataset`.`my_table` (island, + population) " + ... "VALUES ('Dream', 124), ('Biscoe', 168)") + { + "status": "SUCCESS", + "rows": [] + } + + Create a table from the result of a query: + + >>> execute_sql("my_project", + ... "CREATE TABLE `my_project`.`my_dataset`.`my_table` AS " + ... "SELECT island, COUNT(*) AS population " + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY + island") + { + "status": "SUCCESS", + "rows": [] + } + + Delete a table: + + >>> execute_sql("my_project", + ... "DROP TABLE `my_project`.`my_dataset`.`my_table`") + { + "status": "SUCCESS", + "rows": [] + } + + Copy a table to another table: + + >>> execute_sql("my_project", + ... "CREATE TABLE `my_project`.`my_dataset`.`my_table_clone` " + ... "CLONE `my_project`.`my_dataset`.`my_table`") + { + "status": "SUCCESS", + "rows": [] + } + + Create a snapshot (a lightweight, read-optimized copy) of en existing + table: + + >>> execute_sql("my_project", + ... "CREATE SNAPSHOT TABLE + `my_project`.`my_dataset`.`my_table_snapshot` " + ... "CLONE `my_project`.`my_dataset`.`my_table`") + { + "status": "SUCCESS", + "rows": [] + } + + Create a BigQuery ML linear regression model: + + >>> execute_sql("my_project", + ... "CREATE MODEL `my_dataset`.`my_model` " + ... "OPTIONS (model_type='linear_reg', + input_label_cols=['body_mass_g']) AS " + ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " + ... "WHERE body_mass_g IS NOT NULL") + { + "status": "SUCCESS", + "rows": [] + } + + Evaluate BigQuery ML model: + + >>> execute_sql("my_project", + ... "SELECT * FROM ML.EVALUATE(MODEL `my_dataset`.`my_model`)") + { + "status": "SUCCESS", + "rows": [{'mean_absolute_error': 227.01223667447218, + 'mean_squared_error': 81838.15989216768, + 'mean_squared_log_error': 0.0050704473735013, + 'median_absolute_error': 173.08081641661738, + 'r2_score': 0.8723772534253441, + 'explained_variance': 0.8723772534253442}] + } + + Evaluate BigQuery ML model on custom data: + + >>> execute_sql("my_project", + ... "SELECT * FROM ML.EVALUATE(MODEL `my_dataset`.`my_model`, " + ... "(SELECT * FROM `my_dataset`.`my_table`))") + { + "status": "SUCCESS", + "rows": [{'mean_absolute_error': 227.01223667447218, + 'mean_squared_error': 81838.15989216768, + 'mean_squared_log_error': 0.0050704473735013, + 'median_absolute_error': 173.08081641661738, + 'r2_score': 0.8723772534253441, + 'explained_variance': 0.8723772534253442}] + } + + Predict using BigQuery ML model: + + >>> execute_sql("my_project", + ... "SELECT * FROM ML.PREDICT(MODEL `my_dataset`.`my_model`, " + ... "(SELECT * FROM `my_dataset`.`my_table`))") + { + "status": "SUCCESS", + "rows": [ + { + "predicted_body_mass_g": "3380.9271650847013", + ... + }, { + "predicted_body_mass_g": "3873.6072435386004", + ... + }, + ... + ] + } + + Delete a BigQuery ML model: + + >>> execute_sql("my_project", "DROP MODEL `my_dataset`.`my_model`") + { + "status": "SUCCESS", + "rows": [] + } + + Notes: + - If a destination table already exists, there are a few ways to overwrite + it: + - Use "CREATE OR REPLACE TABLE" instead of "CREATE TABLE". + - First run "DROP TABLE", followed by "CREATE TABLE". + - If a model already exists, there are a few ways to overwrite it: + - Use "CREATE OR REPLACE MODEL" instead of "CREATE MODEL". + - First run "DROP MODEL", followed by "CREATE MODEL". + """ + return execute_sql(*args, **kwargs) + + +def _execute_sql_protected_write_mode(*args, **kwargs) -> dict: + """Run a BigQuery or BigQuery ML SQL query in the project and return the result. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + query (str): The BigQuery SQL query to be executed. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + tool_context (ToolContext): The context for the tool. + dry_run (bool, default False): If True, the query will not be executed. + Instead, the query will be validated and information about the query + will be returned. Defaults to False. + + Returns: + dict: If `dry_run` is False, dictionary representing the result of the + query. If the result contains the key "result_is_likely_truncated" + with value True, it means that there may be additional rows matching + the query not returned in the result. + If `dry_run` is True, dictionary with "dry_run_info" field + containing query information returned by BigQuery. + + Examples: + Fetch data or insights from a table: + + >>> execute_sql("my_project", + ... "SELECT island, COUNT(*) AS population " + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY + island") + { + "status": "SUCCESS", + "rows": [ + { + "island": "Dream", + "population": 124 + }, + { + "island": "Biscoe", + "population": 168 + }, + { + "island": "Torgersen", + "population": 52 + } + ] + } + + Validate a query and estimate costs without executing it: + + >>> execute_sql( + ... "my_project", + ... "SELECT island FROM " + ... "`bigquery-public-data`.`ml_datasets`.`penguins`", + ... dry_run=True + ... ) + { + "status": "SUCCESS", + "dry_run_info": { + "configuration": { + "dryRun": True, + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_...", + "projectId": "my_project", + "tableId": "anon..." + }, + "priority": "INTERACTIVE", + "query": "SELECT island FROM + `bigquery-public-data`.`ml_datasets`.`penguins`", + "useLegacySql": False, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "jobReference": { + "location": "US", + "projectId": "my_project" + } + } + } + + Create a temporary table with schema prescribed: + + >>> execute_sql("my_project", + ... "CREATE TEMP TABLE `my_table` (island STRING, population INT64)") + { + "status": "SUCCESS", + "rows": [] + } + + Insert data into an existing temporary table: + + >>> execute_sql("my_project", + ... "INSERT INTO `my_table` (island, population) " + ... "VALUES ('Dream', 124), ('Biscoe', 168)") + { + "status": "SUCCESS", + "rows": [] + } + + Create a temporary table from the result of a query: + + >>> execute_sql("my_project", + ... "CREATE TEMP TABLE `my_table` AS " + ... "SELECT island, COUNT(*) AS population " + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY + island") + { + "status": "SUCCESS", + "rows": [] + } + + Delete a temporary table: + + >>> execute_sql("my_project", "DROP TABLE `my_table`") + { + "status": "SUCCESS", + "rows": [] + } + + Copy a temporary table to another temporary table: + + >>> execute_sql("my_project", + ... "CREATE TEMP TABLE `my_table_clone` CLONE `my_table`") + { + "status": "SUCCESS", + "rows": [] + } + + Create a temporary BigQuery ML linear regression model: + + >>> execute_sql("my_project", + ... "CREATE TEMP MODEL `my_model` " + ... "OPTIONS (model_type='linear_reg', + input_label_cols=['body_mass_g']) AS" + ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " + ... "WHERE body_mass_g IS NOT NULL") + { + "status": "SUCCESS", + "rows": [] + } + + Evaluate BigQuery ML model: + + >>> execute_sql("my_project", "SELECT * FROM ML.EVALUATE(MODEL + `my_model`)") + { + "status": "SUCCESS", + "rows": [{'mean_absolute_error': 227.01223667447218, + 'mean_squared_error': 81838.15989216768, + 'mean_squared_log_error': 0.0050704473735013, + 'median_absolute_error': 173.08081641661738, + 'r2_score': 0.8723772534253441, + 'explained_variance': 0.8723772534253442}] + } + + Evaluate BigQuery ML model on custom data: + + >>> execute_sql("my_project", + ... "SELECT * FROM ML.EVALUATE(MODEL `my_model`, " + ... "(SELECT * FROM `my_dataset`.`my_table`))") + { + "status": "SUCCESS", + "rows": [{'mean_absolute_error': 227.01223667447218, + 'mean_squared_error': 81838.15989216768, + 'mean_squared_log_error': 0.0050704473735013, + 'median_absolute_error': 173.08081641661738, + 'r2_score': 0.8723772534253441, + 'explained_variance': 0.8723772534253442}] + } + + Predict using BigQuery ML model: + + >>> execute_sql("my_project", + ... "SELECT * FROM ML.PREDICT(MODEL `my_model`, " + ... "(SELECT * FROM `my_dataset`.`my_table`))") + { + "status": "SUCCESS", + "rows": [ + { + "predicted_body_mass_g": "3380.9271650847013", + ... + }, { + "predicted_body_mass_g": "3873.6072435386004", + ... + }, + ... + ] + } + + Delete a BigQuery ML model: + + >>> execute_sql("my_project", "DROP MODEL `my_model`") + { + "status": "SUCCESS", + "rows": [] + } + + Notes: + - If a destination table already exists, there are a few ways to overwrite + it: + - Use "CREATE OR REPLACE TEMP TABLE" instead of "CREATE TEMP TABLE". + - First run "DROP TABLE", followed by "CREATE TEMP TABLE". + - Only temporary tables can be created, inserted into or deleted. Please + do not try creating a permanent table (non-TEMP table), inserting into or + deleting one. + - If a destination model already exists, there are a few ways to overwrite + it: + - Use "CREATE OR REPLACE TEMP MODEL" instead of "CREATE TEMP MODEL". + - First run "DROP MODEL", followed by "CREATE TEMP MODEL". + - Only temporary models can be created or deleted. Please do not try + creating a permanent model (non-TEMP model) or deleting one. + """ + return execute_sql(*args, **kwargs) + + +def get_execute_sql(settings: BigQueryToolConfig) -> Callable[..., dict]: + """Get the execute_sql tool customized as per the given tool settings. + + Args: + settings: BigQuery tool settings indicating the behavior of the + execute_sql tool. + + Returns: + callable[..., dict]: A version of the execute_sql tool respecting the tool + settings. + """ + + if not settings or settings.write_mode == WriteMode.BLOCKED: + return execute_sql + + # Create a new function object using the original function's code and globals. + # We pass the original code, globals, name, defaults, and closure. + # This creates a raw function object without copying other metadata yet. + execute_sql_wrapper = types.FunctionType( + execute_sql.__code__, + execute_sql.__globals__, + execute_sql.__name__, + execute_sql.__defaults__, + execute_sql.__closure__, + ) + + # Use functools.update_wrapper to copy over other essential attributes + # from the original function to the new one. + # This includes __name__, __qualname__, __module__, __annotations__, etc. + # It specifically allows us to then set __doc__ separately. + functools.update_wrapper(execute_sql_wrapper, execute_sql) + + # Now, set the new docstring + if settings.write_mode == WriteMode.PROTECTED: + execute_sql_wrapper.__doc__ = _execute_sql_protected_write_mode.__doc__ + else: + execute_sql_wrapper.__doc__ = _execute_sql_write_mode.__doc__ + + return execute_sql_wrapper + + +def forecast( + project_id: str, + history_data: str, + timestamp_col: str, + data_col: str, + horizon: int = 10, + id_cols: Optional[list[str]] = None, + *, + credentials: Credentials, + settings: BigQueryToolConfig, + tool_context: ToolContext, +) -> dict: + """Run a BigQuery AI time series forecast using AI.FORECAST. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + history_data (str): The table id of the BigQuery table containing the + history time series data or a query statement that select the history + data. + timestamp_col (str): The name of the column containing the timestamp for + each data point. + data_col (str): The name of the column containing the numerical values to + be forecasted. + horizon (int, optional): The number of time steps to forecast into the + future. Defaults to 10. + id_cols (list, optional): The column names of the id columns to indicate + each time series when there are multiple time series in the table. All + elements must be strings. Defaults to None. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + tool_context (ToolContext): The context for the tool. + + Returns: + dict: Dictionary representing the result of the forecast. The result + contains the forecasted values along with prediction intervals. + + Examples: + Forecast daily sales for the next 7 days based on historical data from + a BigQuery table: + + >>> forecast( + ... project_id="my-gcp-project", + ... history_data="my-dataset.my-sales-table", + ... timestamp_col="sale_date", + ... data_col="daily_sales", + ... horizon=7 + ... ) + { + "status": "SUCCESS", + "rows": [ + { + "forecast_timestamp": "2025-01-08T00:00:00", + "forecast_value": 12345.67, + "confidence_level": 0.95, + "prediction_interval_lower_bound": 11000.0, + "prediction_interval_upper_bound": 13691.34, + "ai_forecast_status": "" + }, + ... + ] + } + + Forecast multiple time series using a SQL query as input: + + >>> history_query = ( + ... "SELECT unique_id, timestamp, value " + ... "FROM `my-project.my-dataset.my-timeseries-table` " + ... "WHERE timestamp > '1980-01-01'" + ... ) + >>> forecast( + ... project_id="my-gcp-project", + ... history_data=history_query, + ... timestamp_col="timestamp", + ... data_col="value", + ... id_cols=["unique_id"], + ... horizon=14 + ... ) + { + "status": "SUCCESS", + "rows": [ + { + "unique_id": "T1", + "forecast_timestamp": "1980-08-28T00:00:00", + "forecast_value": 1253218.75, + "confidence_level": 0.95, + "prediction_interval_lower_bound": 274252.51, + "prediction_interval_upper_bound": 2232184.99, + "ai_forecast_status": "" + }, + ... + ] + } + + Error Scenarios: + When an element in `id_cols` is not a string: + + >>> forecast( + ... project_id="my-gcp-project", + ... history_data="my-dataset.my-sales-table", + ... timestamp_col="sale_date", + ... data_col="daily_sales", + ... id_cols=["store_id", 123] + ... ) + { + "status": "ERROR", + "error_details": "All elements in id_cols must be strings." + } + + When `history_data` refers to a table that does not exist: + + >>> forecast( + ... project_id="my-gcp-project", + ... history_data="my-dataset.nonexistent-table", + ... timestamp_col="sale_date", + ... data_col="daily_sales" + ... ) + { + "status": "ERROR", + "error_details": "Not found: Table + my-gcp-project:my-dataset.nonexistent-table was not found in + location US" + } + """ + model = "TimesFM 2.0" + confidence_level = 0.95 + trimmed_upper_history_data = history_data.strip().upper() + if trimmed_upper_history_data.startswith( + "SELECT" + ) or trimmed_upper_history_data.startswith("WITH"): + history_data_source = f"({history_data})" + else: + history_data_source = f"TABLE `{history_data}`" + + if id_cols: + if not all(isinstance(item, str) for item in id_cols): + return { + "status": "ERROR", + "error_details": "All elements in id_cols must be strings.", + } + id_cols_str = "[" + ", ".join([f"'{col}'" for col in id_cols]) + "]" + + query = f""" + SELECT * FROM AI.FORECAST( + {history_data_source}, + data_col => '{data_col}', + timestamp_col => '{timestamp_col}', + model => '{model}', + id_cols => {id_cols_str}, + horizon => {horizon}, + confidence_level => {confidence_level} + ) + """ + else: + query = f""" + SELECT * FROM AI.FORECAST( + {history_data_source}, + data_col => '{data_col}', + timestamp_col => '{timestamp_col}', + model => '{model}', + horizon => {horizon}, + confidence_level => {confidence_level} + ) + """ + return _execute_sql( + project_id=project_id, + query=query, + credentials=credentials, + settings=settings, + tool_context=tool_context, + caller_id="forecast", + ) + + +def analyze_contribution( + project_id: str, + input_data: str, + contribution_metric: str, + dimension_id_cols: list[str], + is_test_col: str, + credentials: Credentials, + settings: BigQueryToolConfig, + tool_context: ToolContext, + top_k_insights: int = 30, + pruning_method: str = "PRUNE_REDUNDANT_INSIGHTS", +) -> dict: + """Run a BigQuery ML contribution analysis using ML.CREATE_MODEL and ML.GET_INSIGHTS. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + input_data (str): The data that contain the test and control data to + analyze. Can be a fully qualified BigQuery table ID or a SQL query. + dimension_id_cols (list[str]): The column names of the dimension columns. + contribution_metric (str): The name of the column that contains the metric + to analyze. Provides the expression to use to calculate the metric you + are analyzing. To calculate a summable metric, the expression must be in + the form SUM(metric_column_name), where metric_column_name is a numeric + data type. To calculate a summable ratio metric, the expression must be + in the form + SUM(numerator_metric_column_name)/SUM(denominator_metric_column_name), + where numerator_metric_column_name and denominator_metric_column_name + are numeric data types. To calculate a summable by category metric, the + expression must be in the form + SUM(metric_sum_column_name)/COUNT(DISTINCT categorical_column_name). The + summed column must be a numeric data type. The categorical column must + have type BOOL, DATE, DATETIME, TIME, TIMESTAMP, STRING, or INT64. + is_test_col (str): The name of the column to use to determine whether a + given row is test data or control data. The column must have a BOOL data + type. + credentials: The credentials to use for the request. + settings: The settings for the tool. + tool_context: The context for the tool. + top_k_insights (int, optional): The number of top insights to return, + ranked by apriori support. Defaults to 30. + pruning_method (str, optional): The method to use for pruning redundant + insights. Can be 'NO_PRUNING' or 'PRUNE_REDUNDANT_INSIGHTS'. Defaults to + "PRUNE_REDUNDANT_INSIGHTS". + + Returns: + dict: Dictionary representing the result of the contribution analysis. + + Examples: + Analyze the contribution of different dimensions to the total sales: + + >>> analyze_contribution( + ... project_id="my-gcp-project", + ... input_data="my-dataset.my-sales-table", + ... dimension_id_cols=["store_id", "product_category"], + ... contribution_metric="SUM(total_sales)", + ... is_test_col="is_test" + ... ) + The return is: + { + "status": "SUCCESS", + "rows": [ + { + "store_id": "S1", + "product_category": "Electronics", + "contributors": ["S1", "Electronics"], + "metric_test": 120, + "metric_control": 100, + "difference": 20, + "relative_difference": 0.2, + "unexpected_difference": 5, + "relative_unexpected_difference": 0.043, + "apriori_support": 0.15 + }, + ... + ] + } + + Analyze the contribution of different dimensions to the total sales using + a SQL query as input: + + >>> analyze_contribution( + ... project_id="my-gcp-project", + ... input_data="SELECT store_id, product_category, total_sales, " + ... "is_test FROM `my-project.my-dataset.my-sales-table` " + ... "WHERE transaction_date > '2025-01-01'" + ... dimension_id_cols=["store_id", "product_category"], + ... contribution_metric="SUM(total_sales)", + ... is_test_col="is_test" + ... ) + The return is: + { + "status": "SUCCESS", + "rows": [ + { + "store_id": "S2", + "product_category": "Groceries", + "contributors": ["S2", "Groceries"], + "metric_test": 250, + "metric_control": 200, + "difference": 50, + "relative_difference": 0.25, + "unexpected_difference": 10, + "relative_unexpected_difference": 0.041, + "apriori_support": 0.22 + }, + ... + ] + } + """ + if not all(isinstance(item, str) for item in dimension_id_cols): + return { + "status": "ERROR", + "error_details": "All elements in dimension_id_cols must be strings.", + } + + # Generate a unique temporary model name + model_name = ( + f"contribution_analysis_model_{str(uuid.uuid4()).replace('-', '_')}" + ) + + id_cols_str = "[" + ", ".join([f"'{col}'" for col in dimension_id_cols]) + "]" + options = [ + "MODEL_TYPE = 'CONTRIBUTION_ANALYSIS'", + f"CONTRIBUTION_METRIC = '{contribution_metric}'", + f"IS_TEST_COL = '{is_test_col}'", + f"DIMENSION_ID_COLS = {id_cols_str}", + ] + + options.append(f"TOP_K_INSIGHTS_BY_APRIORI_SUPPORT = {top_k_insights}") + + upper_pruning = pruning_method.upper() + if upper_pruning not in ["NO_PRUNING", "PRUNE_REDUNDANT_INSIGHTS"]: + return { + "status": "ERROR", + "error_details": f"Invalid pruning_method: {pruning_method}", + } + options.append(f"PRUNING_METHOD = '{upper_pruning}'") + + options_str = ", ".join(options) + + trimmed_upper_input_data = input_data.strip().upper() + if trimmed_upper_input_data.startswith( + "SELECT" + ) or trimmed_upper_input_data.startswith("WITH"): + input_data_source = f"({input_data})" + else: + input_data_source = f"SELECT * FROM `{input_data}`" + + create_model_query = f""" + CREATE TEMP MODEL {model_name} + OPTIONS ({options_str}) + AS {input_data_source} + """ + + get_insights_query = f""" + SELECT * FROM ML.GET_INSIGHTS(MODEL {model_name}) + """ + + # Create a session and run the create model query. + try: + execute_sql_settings = settings + if execute_sql_settings.write_mode == WriteMode.BLOCKED: + raise ValueError("analyze_contribution is not allowed in this session.") + elif execute_sql_settings.write_mode != WriteMode.PROTECTED: + # Running create temp model requires a session. So we set the write mode + # to PROTECTED to run the create model query and job query in the same + # session. + execute_sql_settings = settings.model_copy( + update={"write_mode": WriteMode.PROTECTED} + ) + + result = _execute_sql( + project_id=project_id, + query=create_model_query, + credentials=credentials, + settings=execute_sql_settings, + tool_context=tool_context, + caller_id="analyze_contribution", + ) + if result["status"] != "SUCCESS": + return result + + result = _execute_sql( + project_id=project_id, + query=get_insights_query, + credentials=credentials, + settings=execute_sql_settings, + tool_context=tool_context, + caller_id="analyze_contribution", + ) + except Exception as ex: # pylint: disable=broad-except + return { + "status": "ERROR", + "error_details": f"Error during analyze_contribution: {repr(ex)}", + } + + return result + + +def detect_anomalies( + project_id: str, + history_data: str, + times_series_timestamp_col: str, + times_series_data_col: str, + horizon: Optional[int] = 1000, + target_data: Optional[str] = None, + times_series_id_cols: Optional[list[str]] = None, + anomaly_prob_threshold: Optional[float] = 0.95, + *, + credentials: Credentials, + settings: BigQueryToolConfig, + tool_context: ToolContext, +) -> dict: + """Run a BigQuery time series ARIMA_PLUS model training and anomaly detection using CREATE MODEL and ML.DETECT_ANOMALIES clauses. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + history_data (str): The table id of the BigQuery table containing the + history time series data or a query statement that select the history + data. + times_series_timestamp_col (str): The name of the column containing the + timestamp for each data point. + times_series_data_col (str): The name of the column containing the + numerical values to be forecasted and anomaly detected. + horizon (int, optional): The number of time steps to forecast into the + future. Defaults to 1000. + target_data (str, optional): The table id of the BigQuery table containing + the target time series data or a query statement that select the target + data. + times_series_id_cols (list, optional): The column names of the id columns + to indicate each time series when there are multiple time series in the + table. All elements must be strings. Defaults to None. + anomaly_prob_threshold (float, optional): The probability threshold to + determine if a data point is an anomaly. Defaults to 0.95. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + tool_context (ToolContext): The context for the tool. + + Returns: + dict: Dictionary representing the result of the anomaly detection. The + result contains the boolean value if the data point is anomaly or + not, lower bound, upper bound and anomaly probability for each data + point and also the probability of whether the data point is anomaly + or not. + + Examples: + Detect Anomalies daily sales based on historical data from a BigQuery + table: + + >>> detect_anomalies( + ... project_id="my-gcp-project", + ... history_data="my-dataset.my-sales-table", + ... times_series_timestamp_col="sale_date", + ... times_series_data_col="daily_sales" + ... ) + { + "status": "SUCCESS", + "rows": [ + { + "ts_timestamp": "2021-01-01 00:00:01 UTC", + "ts_data": 125.3, + "is_anomaly": TRUE, + "lower_bound": 129.5, + "upper_bound": 133.6 , + "anomaly_probability": 0.93 + }, + ... + ] + } + + Detect Anomalies on multiple time series using a SQL query as input: + + >>> history_query = ( + ... "SELECT unique_id, timestamp, value " + ... "FROM `my-project.my-dataset.my-timeseries-table` " + ... "WHERE timestamp > '1980-01-01'" + ... ) + >>> detect_anomalies( + ... project_id="my-gcp-project", + ... history_data=history_query, + ... times_series_timestamp_col="timestamp", + ... times_series_data_col="value", + ... times_series_id_cols=["unique_id"] + ... ) + { + "status": "SUCCESS", + "rows": [ + { + "unique_id": "T1", + "ts_timestamp": "2021-01-01 00:00:01 UTC", + "ts_data": 125.3, + "is_anomaly": TRUE, + "lower_bound": 129.5, + "upper_bound": 133.6 , + "anomaly_probability": 0.93 + }, + ... + ] + } + + Error Scenarios: + When an element in `times_series_id_cols` is not a string: + + >>> detect_anomalies( + ... project_id="my-gcp-project", + ... history_data="my-dataset.my-sales-table", + ... times_series_timestamp_col="sale_date", + ... times_series_data_col="daily_sales", + ... times_series_id_cols=["store_id", 123] + ... ) + { + "status": "ERROR", + "error_details": "All elements in times_series_id_cols must be + strings." + } + + When `history_data` refers to a table that does not exist: + + >>> detect_anomalies( + ... project_id="my-gcp-project", + ... history_data="my-dataset.nonexistent-table", + ... times_series_timestamp_col="sale_date", + ... times_series_data_col="daily_sales" + ... ) + { + "status": "ERROR", + "error_details": "Not found: Table + my-gcp-project:my-dataset.nonexistent-table was not found in + location US" + } + """ + trimmed_upper_history_data = history_data.strip().upper() + if trimmed_upper_history_data.startswith( + "SELECT" + ) or trimmed_upper_history_data.startswith("WITH"): + history_data_source = f"({history_data})" + else: + history_data_source = f"SELECT * FROM `{history_data}`" + + options = [ + "MODEL_TYPE = 'ARIMA_PLUS'", + f"TIME_SERIES_TIMESTAMP_COL = '{times_series_timestamp_col}'", + f"TIME_SERIES_DATA_COL = '{times_series_data_col}'", + f"HORIZON = {horizon}", + ] + + if times_series_id_cols: + if not all(isinstance(item, str) for item in times_series_id_cols): + return { + "status": "ERROR", + "error_details": ( + "All elements in times_series_id_cols must be strings." + ), + } + times_series_id_cols_str = ( + "[" + ", ".join([f"'{col}'" for col in times_series_id_cols]) + "]" + ) + options.append(f"TIME_SERIES_ID_COL = {times_series_id_cols_str}") + + options_str = ", ".join(options) + + model_name = f"detect_anomalies_model_{str(uuid.uuid4()).replace('-', '_')}" + + create_model_query = f""" + CREATE TEMP MODEL {model_name} + OPTIONS ({options_str}) + AS {history_data_source} + """ + order_by_id_cols = ( + ", ".join(col for col in times_series_id_cols) + ", " + if times_series_id_cols + else "" + ) + + anomaly_detection_query = f""" + SELECT * FROM ML.DETECT_ANOMALIES(MODEL {model_name}, STRUCT({anomaly_prob_threshold} AS anomaly_prob_threshold)) ORDER BY {order_by_id_cols}{times_series_timestamp_col} + """ + if target_data: + trimmed_upper_target_data = target_data.strip().upper() + if trimmed_upper_target_data.startswith( + "SELECT" + ) or trimmed_upper_target_data.startswith("WITH"): + target_data_source = f"({target_data})" + else: + target_data_source = f"(SELECT * FROM `{target_data}`)" + + anomaly_detection_query = f""" + SELECT * FROM ML.DETECT_ANOMALIES(MODEL {model_name}, STRUCT({anomaly_prob_threshold} AS anomaly_prob_threshold), {target_data_source}) ORDER BY {order_by_id_cols}{times_series_timestamp_col} + """ + + # Create a session and run the create model query. + try: + execute_sql_settings = settings + if execute_sql_settings.write_mode == WriteMode.BLOCKED: + raise ValueError("anomaly detection is not allowed in this session.") + elif execute_sql_settings.write_mode != WriteMode.PROTECTED: + # Running create temp model requires a session. So we set the write mode + # to PROTECTED to run the create model query and job query in the same + # session. + execute_sql_settings = settings.model_copy( + update={"write_mode": WriteMode.PROTECTED} + ) + + result = _execute_sql( + project_id=project_id, + query=create_model_query, + credentials=credentials, + settings=execute_sql_settings, + tool_context=tool_context, + caller_id="detect_anomalies", + ) + if result["status"] != "SUCCESS": + return result + + result = _execute_sql( + project_id=project_id, + query=anomaly_detection_query, + credentials=credentials, + settings=execute_sql_settings, + tool_context=tool_context, + caller_id="detect_anomalies", + ) + except Exception as ex: # pylint: disable=broad-except + return { + "status": "ERROR", + "error_details": f"Error during anomaly detection: {repr(ex)}", + } + + return result diff --git a/src/google/adk/integrations/bigquery/search_tool.py b/src/google/adk/integrations/bigquery/search_tool.py new file mode 100644 index 0000000000..9458d93930 --- /dev/null +++ b/src/google/adk/integrations/bigquery/search_tool.py @@ -0,0 +1,183 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import logging +from typing import Any + +from google.api_core import exceptions as api_exceptions +from google.auth.credentials import Credentials +from google.cloud import dataplex_v1 + +from . import client +from .config import BigQueryToolConfig + + +def _construct_search_query_helper( + predicate: str, operator: str, items: list[str] +) -> str: + """Constructs a search query part for a specific predicate and items.""" + if not items: + return "" + + clauses = [f'{predicate}{operator}"{item}"' for item in items] + return "(" + " OR ".join(clauses) + ")" if len(items) > 1 else clauses[0] + + +def search_catalog( + prompt: str, + project_id: str, + *, + credentials: Credentials, + settings: BigQueryToolConfig, + location: str | None = None, + page_size: int = 10, + project_ids_filter: list[str] | None = None, + dataset_ids_filter: list[str] | None = None, + types_filter: list[str] | None = None, +) -> dict[str, Any]: + """Finds BigQuery datasets and tables using natural language semantic search via Dataplex. + + Use this tool to discover BigQuery assets when you don't know the exact names. + It's ideal for searching based on topics, descriptions, or questions about the + data. + + Args: + prompt: The base search query (natural language or keywords). + project_id: The Google Cloud project ID to scope the search. + credentials: Credentials for the request. + settings: BigQuery tool settings. + location: The Dataplex location to use. + page_size: Maximum number of results. + project_ids_filter: Specific project IDs to include in the search results. + If None, defaults to the scoping project_id. + dataset_ids_filter: BigQuery dataset IDs to filter by. + types_filter: Entry types to filter by (e.g., BigQueryEntryType.TABLE, + BigQueryEntryType.DATASET). + + Returns: + Search results or error. The "results" list contains items with: + - name: The Dataplex Entry name (e.g., + "projects/p/locations/l/entryGroups/g/entries/e"). + - linked_resource: The underlying BigQuery resource name (e.g., + "//bigquery.googleapis.com/projects/p/datasets/d/tables/t"). + - display_name, entry_type, description, location, update_time. + + Examples: + Search for tables related to customer data: + + >>> search_catalog( + ... prompt="Search for tables related to customer data", + ... project_id="my-project", + ... credentials=creds, + ... settings=settings + ... ) + { + "status": "SUCCESS", + "results": [ + { + "name": + "projects/my-project/locations/us/entryGroups/@bigquery/entries/entry-id", + "display_name": "customer_table", + "entry_type": + "projects/p/locations/l/entryTypes/bigquery-table", + "linked_resource": + "//bigquery.googleapis.com/projects/my-project/datasets/d/tables/customer_table", + "description": "Table containing customer details.", + "location": "us", + "update_time": "2024-01-01 12:00:00+00:00" + } + ] + } + """ + + try: + if not project_id: + return { + "status": "ERROR", + "error_details": "project_id must be provided.", + } + + with client.get_dataplex_catalog_client( + credentials=credentials, + user_agent=[settings.application_name, "search_catalog"], + ) as dataplex_client: + query_parts = [] + if prompt: + query_parts.append(f"({prompt})") + + # Filter by project IDs + projects_to_filter = ( + project_ids_filter if project_ids_filter else [project_id] + ) + if projects_to_filter: + query_parts.append( + _construct_search_query_helper("projectid", "=", projects_to_filter) + ) + + # Filter by dataset IDs + if dataset_ids_filter: + dataset_resource_filters = [] + for pid in projects_to_filter: + for did in dataset_ids_filter: + dataset_resource_filters.append( + f'linked_resource:"//bigquery.googleapis.com/projects/{pid}/datasets/{did}/*"' + ) + if dataset_resource_filters: + query_parts.append(f"({' OR '.join(dataset_resource_filters)})") + # Filter by entry types + if types_filter: + query_parts.append( + _construct_search_query_helper("type", "=", types_filter) + ) + + # Always scope to BigQuery system + query_parts.append("system=BIGQUERY") + + full_query = " AND ".join(filter(None, query_parts)) + + search_location = location or settings.location or "global" + search_scope = f"projects/{project_id}/locations/{search_location}" + + request = dataplex_v1.SearchEntriesRequest( + name=search_scope, + query=full_query, + page_size=page_size, + semantic_search=True, + ) + + response = dataplex_client.search_entries(request=request) + + results = [] + for result in response.results: + entry = result.dataplex_entry + source = entry.entry_source + results.append({ + "name": entry.name, + "display_name": source.display_name or "", + "entry_type": entry.entry_type, + "update_time": str(entry.update_time), + "linked_resource": source.resource or "", + "description": source.description or "", + "location": source.location or "", + }) + return {"status": "SUCCESS", "results": results} + + except api_exceptions.GoogleAPICallError as e: + logging.exception("search_catalog tool: API call failed") + return {"status": "ERROR", "error_details": f"Dataplex API Error: {e}"} + except Exception as e: + logging.exception("search_catalog tool: Unexpected error") + return {"status": "ERROR", "error_details": repr(e)} diff --git a/src/google/adk/integrations/crewai/__init__.py b/src/google/adk/integrations/crewai/__init__.py index a463c453df..e0d95e1609 100644 --- a/src/google/adk/integrations/crewai/__init__.py +++ b/src/google/adk/integrations/crewai/__init__.py @@ -1,3 +1,5 @@ +# Copyright 2026 Google LLC +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at diff --git a/src/google/adk/integrations/langchain/__init__.py b/src/google/adk/integrations/langchain/__init__.py index 985e49f82a..d0e35ee3b4 100644 --- a/src/google/adk/integrations/langchain/__init__.py +++ b/src/google/adk/integrations/langchain/__init__.py @@ -1,3 +1,5 @@ +# Copyright 2026 Google LLC +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at diff --git a/src/google/adk/integrations/slack/slack_runner.py b/src/google/adk/integrations/slack/slack_runner.py index d8449a1a4f..66a6033789 100644 --- a/src/google/adk/integrations/slack/slack_runner.py +++ b/src/google/adk/integrations/slack/slack_runner.py @@ -19,15 +19,15 @@ from google.adk.runners import Runner from google.genai import types -from slack_bolt.adapter.socket_mode.aiohttp import AsyncSocketModeHandler try: + from slack_bolt.adapter.socket_mode.aiohttp import AsyncSocketModeHandler from slack_bolt.app.async_app import AsyncApp -except ImportError: +except ImportError as e: raise ImportError( "slack_bolt is not installed. Please install it with " '`pip install "google-adk[slack]"`.' - ) + ) from e logger = logging.getLogger("google_adk." + __name__) diff --git a/src/google/adk/integrations/vmaas/sandbox_computer.py b/src/google/adk/integrations/vmaas/sandbox_computer.py index 9c1c9d68d7..ade360ed02 100644 --- a/src/google/adk/integrations/vmaas/sandbox_computer.py +++ b/src/google/adk/integrations/vmaas/sandbox_computer.py @@ -90,8 +90,6 @@ def __init__( location: str = "us-central1", service_account_email: str | None = None, sandbox_name: str | None = None, - sandbox_template_name: str | None = None, - sandbox_snapshot_name: str | None = None, sandbox_ttl_seconds: int = 3600, search_engine_url: str = "https://www.google.com", vertexai_client: "vertexai.Client | None" = None, @@ -110,14 +108,6 @@ def __init__( engine and sandbox on demand. Format: projects/{project}/locations/{location}/reasoningEngines/{id}/sandboxEnvironments/{id} - sandbox_template_name: Sandbox template resource name to use for creating - new sandboxes. Templates allow faster creation and custom environments. - Format: - projects/{project}/locations/{location}/sandboxEnvironmentTemplates/{id} - sandbox_snapshot_name: Sandbox snapshot resource name to use for restoring - sandbox state, enabling faster startup. - Format: - projects/{project}/locations/{location}/reasoningEngines/{id}/sandboxEnvironmentSnapshots/{id} sandbox_ttl_seconds: TTL for auto-created sandboxes (default: 1 hour). search_engine_url: URL to navigate to for search() method. vertexai_client: Optional Vertex AI client instance. If None, creates one @@ -127,8 +117,6 @@ def __init__( self._location = location self._service_account_email = service_account_email self._sandbox_name = sandbox_name - self._sandbox_template_name = sandbox_template_name - self._sandbox_snapshot_name = sandbox_snapshot_name self._sandbox_ttl_seconds = sandbox_ttl_seconds self._search_engine_url = search_engine_url self._screen_size = (1280, 720) @@ -223,29 +211,13 @@ async def _get_sandbox(self) -> tuple[str, Any]: from vertexai import types - config = { - "display_name": "adk_computer_use_sandbox", - } - spec = None - if self._sandbox_template_name: - config["sandbox_environment_template"] = self._sandbox_template_name - logger.info( - "Creating sandbox from template: %s", self._sandbox_template_name - ) - elif self._sandbox_snapshot_name: - config["sandbox_environment_snapshot"] = self._sandbox_snapshot_name - logger.info( - "Creating sandbox from snapshot: %s", self._sandbox_snapshot_name - ) - else: - spec = {"computer_use_environment": {}} - logger.info("Creating sandbox with computer use environment spec") - operation = await asyncio.to_thread( client.agent_engines.sandboxes.create, - spec=spec, + spec={"computer_use_environment": {}}, name=agent_engine_name, - config=config, + config=types.CreateAgentEngineSandboxConfig( + display_name="adk_computer_use_sandbox" + ), ) sandbox_name = operation.response.name @@ -278,6 +250,7 @@ async def _get_access_token(self, sandbox_name: str) -> str: token = await asyncio.to_thread( client.agent_engines.sandboxes.generate_access_token, service_account_email=self._service_account_email, + sandbox_id=sandbox_name, timeout=_DEFAULT_TOKEN_TIMEOUT, ) diff --git a/src/google/adk/tools/bigquery/__init__.py b/src/google/adk/tools/bigquery/__init__.py index 0c4f910df9..b4e38ef5d4 100644 --- a/src/google/adk/tools/bigquery/__init__.py +++ b/src/google/adk/tools/bigquery/__init__.py @@ -27,10 +27,42 @@ execute_sql can't arbitrarily mutate existing data. """ -from .bigquery_credentials import BigQueryCredentialsConfig -from .bigquery_toolset import BigQueryToolset +from __future__ import annotations -__all__ = [ +import importlib +import typing +import warnings + +warnings.warn( + "google.adk.tools.bigquery is deprecated, use" + " google.adk.integrations.bigquery instead", + DeprecationWarning, + stacklevel=2, +) + +if typing.TYPE_CHECKING: + from google.adk.integrations.bigquery import BigQueryCredentialsConfig + from google.adk.integrations.bigquery import BigQueryToolset + from google.adk.integrations.bigquery import get_bigquery_skill + +# Forward public names to integrations/bigquery for backward compatibility. +# Uses __getattr__ instead of sys.modules replacement so that submodules +# (e.g. bigquery_skill) under this package remain importable. +_TARGET = "google.adk.integrations.bigquery" + +_FORWARDED_NAMES = { "BigQueryToolset", "BigQueryCredentialsConfig", -] + "get_bigquery_skill", +} + + +def __getattr__(name: str) -> typing.Any: + if name in _FORWARDED_NAMES: + mod = importlib.import_module(_TARGET) + return getattr(mod, name) + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + + +def __dir__() -> list[str]: + return list(_FORWARDED_NAMES) diff --git a/src/google/adk/tools/bigquery/bigquery_credentials.py b/src/google/adk/tools/bigquery/bigquery_credentials.py index 768b001a87..8555b21f55 100644 --- a/src/google/adk/tools/bigquery/bigquery_credentials.py +++ b/src/google/adk/tools/bigquery/bigquery_credentials.py @@ -14,30 +14,13 @@ from __future__ import annotations -from ...features import FeatureName -from .._google_credentials import BaseGoogleCredentialsConfig +import warnings -BIGQUERY_TOKEN_CACHE_KEY = "bigquery_token_cache" -BIGQUERY_SCOPES = [ - "https://www.googleapis.com/auth/bigquery", - "https://www.googleapis.com/auth/dataplex.read-write", -] -BIGQUERY_DEFAULT_SCOPE = ["https://www.googleapis.com/auth/bigquery"] +from google.adk.integrations.bigquery.bigquery_credentials import * - -class BigQueryCredentialsConfig(BaseGoogleCredentialsConfig): - """BigQuery Credentials Configuration for Google API tools. - - Please do not use this in production, as it may be deprecated later. - """ - - def __post_init__(self) -> BigQueryCredentialsConfig: - """Populate default scope if scopes is None.""" - super().__post_init__() - - if not self.scopes: - self.scopes = BIGQUERY_SCOPES - # Set the token cache key - self._token_cache_key = BIGQUERY_TOKEN_CACHE_KEY - - return self +warnings.warn( + "google.adk.tools.bigquery.bigquery_credentials is moved to" + " google.adk.integrations.bigquery.bigquery_credentials", + DeprecationWarning, + stacklevel=2, +) diff --git a/src/google/adk/tools/bigquery/bigquery_toolset.py b/src/google/adk/tools/bigquery/bigquery_toolset.py index 37a5070996..11d13bcd88 100644 --- a/src/google/adk/tools/bigquery/bigquery_toolset.py +++ b/src/google/adk/tools/bigquery/bigquery_toolset.py @@ -14,88 +14,13 @@ from __future__ import annotations -from typing import List -from typing import Optional -from typing import Union +import warnings -from google.adk.agents.readonly_context import ReadonlyContext -from typing_extensions import override +from google.adk.integrations.bigquery.bigquery_toolset import * -from . import data_insights_tool -from . import metadata_tool -from . import query_tool -from . import search_tool -from ...features import FeatureName -from ...tools.base_tool import BaseTool -from ...tools.base_toolset import BaseToolset -from ...tools.base_toolset import ToolPredicate -from ...tools.google_tool import GoogleTool -from .bigquery_credentials import BigQueryCredentialsConfig -from .config import BigQueryToolConfig - - -class BigQueryToolset(BaseToolset): - """BigQuery Toolset contains tools for interacting with BigQuery data and metadata.""" - - def __init__( - self, - *, - tool_filter: Optional[Union[ToolPredicate, List[str]]] = None, - credentials_config: Optional[BigQueryCredentialsConfig] = None, - bigquery_tool_config: Optional[BigQueryToolConfig] = None, - ): - super().__init__(tool_filter=tool_filter) - self._credentials_config = credentials_config - self._tool_settings = ( - bigquery_tool_config if bigquery_tool_config else BigQueryToolConfig() - ) - - def _is_tool_selected( - self, tool: BaseTool, readonly_context: ReadonlyContext - ) -> bool: - if self.tool_filter is None: - return True - - if isinstance(self.tool_filter, ToolPredicate): - return self.tool_filter(tool, readonly_context) - - if isinstance(self.tool_filter, list): - return tool.name in self.tool_filter - - return False - - @override - async def get_tools( - self, readonly_context: Optional[ReadonlyContext] = None - ) -> List[BaseTool]: - """Get tools from the toolset.""" - all_tools = [ - GoogleTool( - func=func, - credentials_config=self._credentials_config, - tool_settings=self._tool_settings, - ) - for func in [ - metadata_tool.get_dataset_info, - metadata_tool.get_table_info, - metadata_tool.list_dataset_ids, - metadata_tool.list_table_ids, - metadata_tool.get_job_info, - query_tool.get_execute_sql(self._tool_settings), - query_tool.forecast, - query_tool.analyze_contribution, - query_tool.detect_anomalies, - data_insights_tool.ask_data_insights, - search_tool.search_catalog, - ] - ] - - return [ - tool - for tool in all_tools - if self._is_tool_selected(tool, readonly_context) - ] - - @override - async def close(self): - pass +warnings.warn( + "google.adk.tools.bigquery.bigquery_toolset is moved to" + " google.adk.integrations.bigquery.bigquery_toolset", + DeprecationWarning, + stacklevel=2, +) diff --git a/src/google/adk/tools/bigquery/client.py b/src/google/adk/tools/bigquery/client.py index 526a181420..40a2459314 100644 --- a/src/google/adk/tools/bigquery/client.py +++ b/src/google/adk/tools/bigquery/client.py @@ -14,102 +14,13 @@ from __future__ import annotations -import os -from typing import List -from typing import Optional -from typing import Union +import warnings -import google.api_core.client_info -from google.api_core.gapic_v1 import client_info as gapic_client_info -from google.auth.credentials import Credentials -from google.cloud import bigquery -from google.cloud import dataplex_v1 +from google.adk.integrations.bigquery.client import * -from ... import version -from ...utils._telemetry_context import _is_visual_builder - -USER_AGENT_BASE = f"google-adk/{version.__version__}" -BQ_USER_AGENT = f"adk-bigquery-tool {USER_AGENT_BASE}" -DP_USER_AGENT = f"adk-dataplex-tool {USER_AGENT_BASE}" -USER_AGENT = BQ_USER_AGENT - -# Internal identifier for Visual Builder usage tracking. -_VISUAL_BUILDER_UA = "google-adk-visual-builder" - - -def get_bigquery_client( - *, - project: Optional[str], - credentials: Credentials, - location: Optional[str] = None, - user_agent: Optional[Union[str, List[str]]] = None, -) -> bigquery.Client: - """Get a BigQuery client. - - Args: - project: The GCP project ID. - credentials: The credentials to use for the request. - location: The location of the BigQuery client. - user_agent: The user agent to use for the request. - - Returns: - A BigQuery client. - """ - - user_agents = [BQ_USER_AGENT] - - if _is_visual_builder.get(): - user_agents.append(_VISUAL_BUILDER_UA) - - if user_agent: - if isinstance(user_agent, str): - user_agents.append(user_agent) - else: - user_agents.extend([ua for ua in user_agent if ua]) - - client_info = google.api_core.client_info.ClientInfo( - user_agent=" ".join(user_agents) - ) - - bigquery_client = bigquery.Client( - project=project, - credentials=credentials, - location=location, - client_info=client_info, - ) - - return bigquery_client - - -def get_dataplex_catalog_client( - *, - credentials: Credentials, - user_agent: Optional[Union[str, List[str]]] = None, -) -> dataplex_v1.CatalogServiceClient: - """Get a Dataplex CatalogServiceClient with minimal necessary arguments. - - Args: - credentials: The credentials to use for the request. - user_agent: Additional user agent string(s) to append. - - Returns: - A Dataplex Client. - """ - - user_agents = [DP_USER_AGENT] - - if _is_visual_builder.get(): - user_agents.append(_VISUAL_BUILDER_UA) - - if user_agent: - if isinstance(user_agent, str): - user_agents.append(user_agent) - else: - user_agents.extend([ua for ua in user_agent if ua]) - - client_info = gapic_client_info.ClientInfo(user_agent=" ".join(user_agents)) - - return dataplex_v1.CatalogServiceClient( - credentials=credentials, - client_info=client_info, - ) +warnings.warn( + "google.adk.tools.bigquery.client is moved to" + " google.adk.integrations.bigquery.client", + DeprecationWarning, + stacklevel=2, +) diff --git a/src/google/adk/tools/bigquery/config.py b/src/google/adk/tools/bigquery/config.py index e2c56ab1e3..3121ad0ef4 100644 --- a/src/google/adk/tools/bigquery/config.py +++ b/src/google/adk/tools/bigquery/config.py @@ -14,145 +14,13 @@ from __future__ import annotations -from enum import Enum -from typing import Optional +import warnings -from pydantic import BaseModel -from pydantic import ConfigDict -from pydantic import field_validator +from google.adk.integrations.bigquery.config import * -from ...features import FeatureName - - -class WriteMode(Enum): - """Write mode indicating what levels of write operations are allowed in BigQuery.""" - - BLOCKED = 'blocked' - """No write operations are allowed. - - This mode implies that only read (i.e. SELECT query) operations are allowed. - """ - - PROTECTED = 'protected' - """Only protected write operations are allowed in a BigQuery session. - - In this mode write operations in the anonymous dataset of a BigQuery session - are allowed. For example, a temporary table can be created, manipulated and - deleted in the anonymous dataset during Agent interaction, while protecting - permanent tables from being modified or deleted. To learn more about BigQuery - sessions, see https://cloud.google.com/bigquery/docs/sessions-intro. - """ - - ALLOWED = 'allowed' - """All write operations are allowed.""" - - -class BigQueryToolConfig(BaseModel): - """Configuration for BigQuery tools.""" - - # Forbid any fields not defined in the model - model_config = ConfigDict(extra='forbid') - - write_mode: WriteMode = WriteMode.BLOCKED - """Write mode for BigQuery tools. - - By default, the tool will allow only read operations. This behaviour may - change in future versions. - """ - - maximum_bytes_billed: Optional[int] = None - """Maximum number of bytes to bill for a query. - - In BigQuery on-demand pricing, charges are rounded up to the nearest MB, with - a minimum 10 MB data processed per table referenced by the query, and with a - minimum 10 MB data processed per query. So this value must be set >=10485760. - """ - - max_query_result_rows: int = 50 - """Maximum number of rows to return from a query. - - By default, the query result will be limited to 50 rows. - """ - - application_name: Optional[str] = None - """Name of the application using the BigQuery tools. - - By default, no particular application name will be set in the BigQuery - interaction. But if the tool user (agent builder) wants to differentiate - their application/agent for tracking or support purpose, they can set this - field. If set, this value will be added to the user_agent in BigQuery API - calls, and also to the BigQuery job labels with the key - "adk-bigquery-application-name". - - Note: This field is for usage discovery and tracking purposes only and should - not be used for security-sensitive decisions. - """ - - compute_project_id: Optional[str] = None - """GCP project ID to use for the BigQuery compute operations. - - This can be set as a guardrail to ensure that the tools perform the compute - operations (such as query execution) in a specific project. - """ - - location: Optional[str] = None - """BigQuery location to use for the data and compute. - - This can be set if the BigQuery tools are expected to process data in a - particular BigQuery location. If not set, then location would be automatically - determined based on the data location in the query. For all supported - locations, see https://cloud.google.com/bigquery/docs/locations. - """ - - job_labels: Optional[dict[str, str]] = None - """Labels to apply to BigQuery jobs for tracking and monitoring. - - These labels will be added to all BigQuery jobs executed by the tools. - Labels must be key-value pairs where both keys and values are strings. - Labels can be used for billing, monitoring, and resource organization. - For more information about labels, see - https://cloud.google.com/bigquery/docs/labels-intro. - - Note: These labels are for usage discovery and tracking purposes only and - should not be used for security-sensitive decisions. The number of - user-provided labels is restricted to 20, and keys starting with - "adk-bigquery-" are reserved for internal usage. - """ - - @field_validator('maximum_bytes_billed') - @classmethod - def validate_maximum_bytes_billed(cls, v): - """Validate the maximum bytes billed.""" - if v and v < 10_485_760: - raise ValueError( - 'In BigQuery on-demand pricing, charges are rounded up to the nearest' - ' MB, with a minimum 10 MB data processed per table referenced by the' - ' query, and with a minimum 10 MB data processed per query. So' - ' max_bytes_billed must be set >=10485760.' - ) - return v - - @field_validator('application_name') - @classmethod - def validate_application_name(cls, v): - """Validate the application name.""" - if v and ' ' in v: - raise ValueError('Application name should not contain spaces.') - return v - - @field_validator('job_labels') - @classmethod - def validate_job_labels(cls, v): - """Validate the job labels.""" - if v is not None: - if len(v) > 20: - raise ValueError('Only up to 20 job labels can be provided') - for key in v.keys(): - if not key: - raise ValueError('Label keys cannot be empty.') - if key.startswith('adk-bigquery-'): - raise ValueError( - 'Label key cannot start with "adk-bigquery-" as it is' - f' reserved for internal usage, found "{key}".' - ) - return v +warnings.warn( + "google.adk.tools.bigquery.config is moved to" + " google.adk.integrations.bigquery.config", + DeprecationWarning, + stacklevel=2, +) diff --git a/src/google/adk/tools/bigquery/data_insights_tool.py b/src/google/adk/tools/bigquery/data_insights_tool.py index 45f45d874f..d14da76f0d 100644 --- a/src/google/adk/tools/bigquery/data_insights_tool.py +++ b/src/google/adk/tools/bigquery/data_insights_tool.py @@ -11,175 +11,16 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import annotations - -import json -from typing import Any -from typing import Dict -from typing import List - -from google.auth.credentials import Credentials -from google.cloud import bigquery -import requests - -from . import client -from .. import _gda_stream_util -from .config import BigQueryToolConfig - -_GDA_CLIENT_ID = "GOOGLE_ADK" - - -def ask_data_insights( - project_id: str, - user_query_with_context: str, - table_references: List[Dict[str, str]], - credentials: Credentials, - settings: BigQueryToolConfig, -) -> Dict[str, Any]: - """Answers questions about structured data in BigQuery tables using natural language. - - This function takes a user's question (which can include conversational - history for context) and references to specific BigQuery tables, and sends - them to a stateless conversational API. - The API uses a GenAI agent to understand the question, generate and execute - SQL queries and Python code, and formulate an answer. This function returns a - detailed, sequential log of this entire process, which includes any generated - SQL or Python code, the data retrieved, and the final text answer. The final - answer is always in plain text, as the underlying API is instructed not to - generate any charts, graphs, images, or other visualizations. - - Use this tool to perform data analysis, get insights, or answer complex - questions about the contents of specific BigQuery tables. - - Args: - project_id (str): The project that the inquiry is performed in. - user_query_with_context (str): The user's original request, enriched with - relevant context from the conversation history. The user's core intent - should be preserved, but context should be added to resolve ambiguities - in follow-up questions. - table_references (List[Dict[str, str]]): A list of dictionaries, each - specifying a BigQuery table to be used as context for the question. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - - Returns: - A dictionary with two keys: - - 'status': A string indicating the final status (e.g., "SUCCESS"). - - 'response': A list of dictionaries, where each dictionary - represents a step in the agent's execution process and can - contain keys like 'text', 'data', or 'Data Retrieved' indicating - thought process, SQL generation, data retrieval, or final answer. - - Example: - A query joining multiple tables, showing the full return structure. - The original question: "Which customer from New York spent the most last - month?" - - >>> ask_data_insights( - ... project_id="some-project-id", - ... user_query_with_context=( - ... "Which customer from New York spent the most last month?" - ... "Context: The 'customers' table joins with the 'orders' table" - ... " on the 'customer_id' column." - ... "" - ... ), - ... table_references=[ - ... { - ... "projectId": "my-gcp-project", - ... "datasetId": "sales_data", - ... "tableId": "customers" - ... }, - ... { - ... "projectId": "my-gcp-project", - ... "datasetId": "sales_data", - ... "tableId": "orders" - ... } - ... ] - ... ) - { - "status": "SUCCESS", - "response": [ - { - "text": { - "parts": [ - "Analyzing context", - "Retrieved context for 2 tables." - ], - "textType": "THOUGHT" - } - }, - { - "data": { - "generatedSql": "SELECT t1.customer_name, SUM(t2.order_total) ..." - } - }, - { - "Data Retrieved": { - "headers": ["customer_name", "total_spent"], - "rows": [["Jane Doe", 1234.56]], - "summary": "Showing all 1 rows." - } - }, - { - "text": { - "parts": [ - "The customer who spent the most was Jane Doe." - ], - "textType": "FINAL_RESPONSE" - } - } - ] - } - """ - try: - location = "global" - if not credentials.token: - error_message = ( - "Error: The provided credentials object does not have a valid access" - " token.\n\nThis is often because the credentials need to be" - " refreshed or require specific API scopes. Please ensure the" - " credentials are prepared correctly before calling this" - " function.\n\nThere may be other underlying causes as well." - ) - return { - "status": "ERROR", - "error_details": "ask_data_insights requires a valid access token.", - } - headers = { - "Authorization": f"Bearer {credentials.token}", - "Content-Type": "application/json", - "X-Goog-API-Client": _GDA_CLIENT_ID, - } - ca_url = f"https://geminidataanalytics.googleapis.com/v1beta/projects/{project_id}/locations/{location}:chat" - - instructions = """**INSTRUCTIONS - FOLLOW THESE RULES:** - 1. **CONTENT:** Your answer should present the supporting data and then provide a conclusion based on that data, including relevant details and observations where possible. - 2. **ANALYSIS DEPTH:** Your analysis must go beyond surface-level observations. Crucially, you must prioritize metrics that measure impact or outcomes over metrics that simply measure volume or raw counts. For open-ended questions, explore the topic from multiple perspectives to provide a holistic view. - 3. **OUTPUT FORMAT:** Your entire response MUST be in plain text format ONLY. - 4. **NO CHARTS:** You are STRICTLY FORBIDDEN from generating any charts, graphs, images, or any other form of visualization. - """ +from __future__ import annotations - ca_payload = { - "project": f"projects/{project_id}", - "messages": [{"userMessage": {"text": user_query_with_context}}], - "inlineContext": { - "datasourceReferences": { - "bq": {"tableReferences": table_references} - }, - "systemInstruction": instructions, - "options": {"chart": {"image": {"noImage": {}}}}, - }, - "clientIdEnum": _GDA_CLIENT_ID, - } +import warnings - resp = _gda_stream_util.get_stream( - ca_url, ca_payload, headers, settings.max_query_result_rows - ) - except Exception as ex: # pylint: disable=broad-except - return { - "status": "ERROR", - "error_details": str(ex), - } +from google.adk.integrations.bigquery.data_insights_tool import * - return {"status": "SUCCESS", "response": resp} +warnings.warn( + "google.adk.tools.bigquery.data_insights_tool is moved to" + " google.adk.integrations.bigquery.data_insights_tool", + DeprecationWarning, + stacklevel=2, +) diff --git a/src/google/adk/tools/bigquery/metadata_tool.py b/src/google/adk/tools/bigquery/metadata_tool.py index d9046da5fc..7ddafb84b9 100644 --- a/src/google/adk/tools/bigquery/metadata_tool.py +++ b/src/google/adk/tools/bigquery/metadata_tool.py @@ -14,581 +14,13 @@ from __future__ import annotations -from google.auth.credentials import Credentials -from google.cloud import bigquery +import warnings -from . import client -from .config import BigQueryToolConfig +from google.adk.integrations.bigquery.metadata_tool import * - -def list_dataset_ids( - project_id: str, credentials: Credentials, settings: BigQueryToolConfig -) -> list[str]: - """List BigQuery dataset ids in a Google Cloud project. - - Args: - project_id (str): The Google Cloud project id. - credentials (Credentials): The credentials to use for the request. - - Returns: - list[str]: List of the BigQuery dataset ids present in the project. - - Examples: - >>> list_dataset_ids("bigquery-public-data") - ['america_health_rankings', - 'american_community_survey', - 'aml_ai_input_dataset', - 'austin_311', - 'austin_bikeshare', - 'austin_crime', - 'austin_incidents', - 'austin_waste', - 'baseball', - 'bbc_news'] - """ - try: - bq_client = client.get_bigquery_client( - project=project_id, - credentials=credentials, - location=settings.location, - user_agent=[settings.application_name, "list_dataset_ids"], - ) - - datasets = [] - for dataset in bq_client.list_datasets(project_id): - datasets.append(dataset.dataset_id) - return datasets - except Exception as ex: - return { - "status": "ERROR", - "error_details": str(ex), - } - - -def get_dataset_info( - project_id: str, - dataset_id: str, - credentials: Credentials, - settings: BigQueryToolConfig, -) -> dict: - """Get metadata information about a BigQuery dataset. - - Args: - project_id (str): The Google Cloud project id containing the dataset. - dataset_id (str): The BigQuery dataset id. - credentials (Credentials): The credentials to use for the request. - - Returns: - dict: Dictionary representing the properties of the dataset. - - Examples: - >>> get_dataset_info("bigquery-public-data", "cdc_places") - { - "kind": "bigquery#dataset", - "etag": "fz9BaiXKgbGi53EpI2rJug==", - "id": "bigquery-public-data:cdc_places", - "selfLink": "https://content-bigquery.googleapis.com/bigquery/v2/projects/bigquery-public-data/datasets/cdc_places", - "datasetReference": { - "datasetId": "cdc_places", - "projectId": "bigquery-public-data" - }, - "description": "Local Data for Better Health, County Data", - "access": [ - { - "role": "WRITER", - "specialGroup": "projectWriters" - }, - { - "role": "OWNER", - "specialGroup": "projectOwners" - }, - { - "role": "OWNER", - "userByEmail": "some-redacted-email@bigquery-public-data.iam.gserviceaccount.com" - }, - { - "role": "READER", - "specialGroup": "projectReaders" - } - ], - "creationTime": "1640891845643", - "lastModifiedTime": "1640891845643", - "location": "US", - "type": "DEFAULT", - "maxTimeTravelHours": "168" - } - """ - try: - bq_client = client.get_bigquery_client( - project=project_id, - credentials=credentials, - location=settings.location, - user_agent=[settings.application_name, "get_dataset_info"], - ) - dataset = bq_client.get_dataset( - bigquery.DatasetReference(project_id, dataset_id) - ) - return dataset.to_api_repr() - except Exception as ex: - return { - "status": "ERROR", - "error_details": str(ex), - } - - -def list_table_ids( - project_id: str, - dataset_id: str, - credentials: Credentials, - settings: BigQueryToolConfig, -) -> list[str]: - """List table ids in a BigQuery dataset. - - Args: - project_id (str): The Google Cloud project id containing the dataset. - dataset_id (str): The BigQuery dataset id. - credentials (Credentials): The credentials to use for the request. - - Returns: - list[str]: List of the tables ids present in the dataset. - - Examples: - >>> list_table_ids("bigquery-public-data", "cdc_places") - ['chronic_disease_indicators', - 'local_data_for_better_health_county_data'] - """ - try: - bq_client = client.get_bigquery_client( - project=project_id, - credentials=credentials, - location=settings.location, - user_agent=[settings.application_name, "list_table_ids"], - ) - - tables = [] - for table in bq_client.list_tables( - bigquery.DatasetReference(project_id, dataset_id) - ): - tables.append(table.table_id) - return tables - except Exception as ex: - return { - "status": "ERROR", - "error_details": str(ex), - } - - -def get_table_info( - project_id: str, - dataset_id: str, - table_id: str, - credentials: Credentials, - settings: BigQueryToolConfig, -) -> dict: - """Get metadata information about a BigQuery table. - - Args: - project_id (str): The Google Cloud project id containing the dataset. - dataset_id (str): The BigQuery dataset id containing the table. - table_id (str): The BigQuery table id. - credentials (Credentials): The credentials to use for the request. - - Returns: - dict: Dictionary representing the properties of the table. - - Examples: - >>> get_table_info("bigquery-public-data", "cdc_places", "local_data_for_better_health_county_data") - { - "kind": "bigquery#table", - "etag": "wx23aDqmgc39oUSiNuYTAA==", - "id": "bigquery-public-data:cdc_places.local_data_for_better_health_county_data", - "selfLink": "https://content-bigquery.googleapis.com/bigquery/v2/projects/bigquery-public-data/datasets/cdc_places/tables/local_data_for_better_health_county_data", - "tableReference": { - "projectId": "bigquery-public-data", - "datasetId": "cdc_places", - "tableId": "local_data_for_better_health_county_data" - }, - "description": "Local Data for Better Health, County Data", - "schema": { - "fields": [ - { - "name": "year", - "type": "INTEGER", - "mode": "NULLABLE" - }, - { - "name": "stateabbr", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "statedesc", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "locationname", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "datasource", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "category", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "measure", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "data_value_unit", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "data_value_type", - "type": "STRING", - "mode": "NULLABLE" - }, - { - "name": "data_value", - "type": "FLOAT", - "mode": "NULLABLE" - } - ] - }, - "numBytes": "234849", - "numLongTermBytes": "0", - "numRows": "1000", - "creationTime": "1640891846119", - "lastModifiedTime": "1749427268137", - "type": "TABLE", - "location": "US", - "numTimeTravelPhysicalBytes": "285737", - "numTotalLogicalBytes": "234849", - "numActiveLogicalBytes": "234849", - "numLongTermLogicalBytes": "0", - "numTotalPhysicalBytes": "326557", - "numActivePhysicalBytes": "326557", - "numLongTermPhysicalBytes": "0", - "numCurrentPhysicalBytes": "40820" - } - """ - try: - bq_client = client.get_bigquery_client( - project=project_id, - credentials=credentials, - location=settings.location, - user_agent=[settings.application_name, "get_table_info"], - ) - return bq_client.get_table( - bigquery.TableReference( - bigquery.DatasetReference(project_id, dataset_id), table_id - ) - ).to_api_repr() - except Exception as ex: - return { - "status": "ERROR", - "error_details": str(ex), - } - - -def get_job_info( - project_id: str, - job_id: str, - credentials: Credentials, - settings: BigQueryToolConfig, -) -> dict: - """Get metadata information about a BigQuery job. Including slot usage, - job configuration, job statistics, job status, original query etc. - - Args: - project_id (str): The Google Cloud project id containing the job. - job_id (str): The BigQuery job id. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The BigQuery tool settings. - - Returns: - dict: Dictionary representing the properties of the job. - - Examples: - >>> user may give job id in format of: project_id:region.job_id - like bigquery-public-data:US.bquxjob_12345678_1234567890 - >>> get_job_info("bigquery-public-data", "bquxjob_12345678_1234567890") - { - "get_job_info_response": { - "configuration": { - "jobType": "QUERY", - "query": { - "destinationTable": { - "datasetId": "_fd6de55d5d5c13fcfb0449cbf933bb695b2c3085", - "projectId": "projectid", - "tableId": "anonfbbe65d6_9782_469b_9f56_1392560314b2" - }, - "priority": "INTERACTIVE", - "query": "SELECT * FROM `projectid.dataset_id.table_id` WHERE TIMESTAMP_TRUNC(_PARTITIONTIME, DAY) = TIMESTAMP(\"2025-10-29\") LIMIT 1000", - "useLegacySql": false, - "writeDisposition": "WRITE_TRUNCATE" - } - }, - "etag": "EdeYv9sdcO7tD9HsffvcuQ==", - "id": "projectid:US.job-id", - "jobCreationReason": { - "code": "REQUESTED" - }, - "jobReference": { - "jobId": "job-id", - "location": "US", - "projectId": "projectid" - }, - "kind": "bigquery#job", - "principal_subject": "user:abc@google.com", - "selfLink": "https://bigquery.googleapis.com/bigquery/v2/projects/projectid/jobs/job-id?location=US", - "statistics": { - "creationTime": 1761760370152, - "endTime": 1761760371250, - "finalExecutionDurationMs": "489", - "query": { - "billingTier": 1, - "cacheHit": false, - "estimatedBytesProcessed": "5597805", - "metadataCacheStatistics": { - "tableMetadataCacheUsage": [ - { - "explanation": "Table does not have CMETA.", - "tableReference": { - "datasetId": "datasetId", - "projectId": "projectid", - "tableId": "tableId" - }, - "unusedReason": "OTHER_REASON" - } - ] - }, - "queryPlan": [ - { - "completedParallelInputs": "3", - "computeMode": "BIGQUERY", - "computeMsAvg": "13", - "computeMsMax": "15", - "computeRatioAvg": 0.054852320675105488, - "computeRatioMax": 0.063291139240506333, - "endMs": "1761760370422", - "id": "0", - "name": "S00: Input", - "parallelInputs": "8", - "readMsAvg": "18", - "readMsMax": "21", - "readRatioAvg": 0.0759493670886076, - "readRatioMax": 0.088607594936708861, - "recordsRead": "1690", - "recordsWritten": "1690", - "shuffleOutputBytes": "1031149", - "shuffleOutputBytesSpilled": "0", - "slotMs": "157", - "startMs": "1761760370388", - "status": "COMPLETE", - "steps": [ - { - "kind": "READ", - "substeps": [ - "$2:extendedFields.$is_not_null, $3:extendedFields.traceId, $4:span.$is_not_null, $5:span.spanKind, $6:span.endTime, $7:span.startTime, $8:span.parentSpanId, $9:span.spanId, $10:span.name, $11:span.childSpanCount.$is_not_null, $12:span.childSpanCount.value, $13:span.sameProcessAsParentSpan.$is_not_null, $14:span.sameProcessAsParentSpan.value, $15:span.status.$is_not_null, $16:span.status.message, $17:span.status.code", - "FROM projectid.dataset_id.table_id", - "WHERE equal(timestamp_trunc($1, 3), 1761696000.000000000)" - ] - }, - { - "kind": "LIMIT", - "substeps": [ - "1000" - ] - }, - { - "kind": "WRITE", - "substeps": [ - "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17", - "TO __stage00_output" - ] - } - ], - "waitMsAvg": "1", - "waitMsMax": "1", - "waitRatioAvg": 0.0042194092827004216, - "waitRatioMax": 0.0042194092827004216, - "writeMsAvg": "2", - "writeMsMax": "2", - "writeRatioAvg": 0.0084388185654008432, - "writeRatioMax": 0.0084388185654008432 - }, - { - "completedParallelInputs": "1", - "computeMode": "BIGQUERY", - "computeMsAvg": "22", - "computeMsMax": "22", - "computeRatioAvg": 0.092827004219409287, - "computeRatioMax": 0.092827004219409287, - "endMs": "1761760370428", - "id": "1", - "inputStages": [ - "0" - ], - "name": "S01: Compute+", - "parallelInputs": "1", - "readMsAvg": "0", - "readMsMax": "0", - "readRatioAvg": 0, - "readRatioMax": 0, - "recordsRead": "1001", - "recordsWritten": "1000", - "shuffleOutputBytes": "800157", - "shuffleOutputBytesSpilled": "0", - "slotMs": "29", - "startMs": "1761760370398", - "status": "COMPLETE", - "steps": [ - { - "kind": "READ", - "substeps": [ - "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17", - "FROM __stage00_output" - ] - }, - { - "kind": "COMPUTE", - "substeps": [ - "$130 := MAKE_STRUCT($3, $2)", - "$131 := MAKE_STRUCT($10, $9, $8, MAKE_STRUCT($29, $28, $27), $7, $6, MAKE_STRUCT(...), MAKE_STRUCT(...), MAKE_STRUCT(...), ...)" - ] - }, - { - "kind": "LIMIT", - "substeps": [ - "1000" - ] - }, - { - "kind": "WRITE", - "substeps": [ - "$130, $131", - "TO __stage01_output" - ] - } - ], - "waitMsAvg": "7", - "waitMsMax": "7", - "waitRatioAvg": 0.029535864978902954, - "waitRatioMax": 0.029535864978902954, - "writeMsAvg": "4", - "writeMsMax": "4", - "writeRatioAvg": 0.016877637130801686, - "writeRatioMax": 0.016877637130801686 - }, - { - "completedParallelInputs": "1", - "computeMode": "BIGQUERY", - "computeMsAvg": "33", - "computeMsMax": "33", - "computeRatioAvg": 0.13924050632911392, - "computeRatioMax": 0.13924050632911392, - "endMs": "1761760370745", - "id": "2", - "inputStages": [ - "1" - ], - "name": "S02: Output", - "parallelInputs": "1", - "readMsAvg": "0", - "readMsMax": "0", - "readRatioAvg": 0, - "readRatioMax": 0, - "recordsRead": "1000", - "recordsWritten": "1000", - "shuffleOutputBytes": "459829", - "shuffleOutputBytesSpilled": "0", - "slotMs": "106", - "startMs": "1761760370667", - "status": "COMPLETE", - "steps": [ - { - "kind": "READ", - "substeps": [ - "$130, $131", - "FROM __stage01_output" - ] - }, - { - "kind": "WRITE", - "substeps": [ - "$130, $131", - "TO __stage02_output" - ] - } - ], - "waitMsAvg": "237", - "waitMsMax": "237", - "waitRatioAvg": 1, - "waitRatioMax": 1, - "writeMsAvg": "55", - "writeMsMax": "55", - "writeRatioAvg": 0.2320675105485232, - "writeRatioMax": 0.2320675105485232 - } - ], - "referencedTables": [ - { - "datasetId": "dataset_id", - "projectId": "projectid", - "tableId": "table_id" - } - ], - "statementType": "SELECT", - "timeline": [ - { - "completedUnits": "5", - "elapsedMs": "492", - "estimatedRunnableUnits": "0", - "pendingUnits": "5", - "totalSlotMs": "293" - } - ], - "totalBytesBilled": "10485760", - "totalBytesProcessed": "5597805", - "totalPartitionsProcessed": "2", - "totalSlotMs": "293", - "transferredBytes": "0" - }, - "startTime": 1761760370268, - "totalBytesProcessed": "5597805", - "totalSlotMs": "293" - }, - "status": { - "state": "DONE" - }, - "user_email": "abc@google.com" - } - } - """ - try: - bq_client = client.get_bigquery_client( - project=project_id, - credentials=credentials, - location=settings.location, - user_agent=[settings.application_name, "get_job_info"], - ) - - job = bq_client.get_job(job_id) - # We need to use _properties to get the job info because it contains all - # the job info. - # pylint: disable=protected-access - return job._properties - except Exception as ex: - return { - "status": "ERROR", - "error_details": str(ex), - } +warnings.warn( + "google.adk.tools.bigquery.metadata_tool is moved to" + " google.adk.integrations.bigquery.metadata_tool", + DeprecationWarning, + stacklevel=2, +) diff --git a/src/google/adk/tools/bigquery/query_tool.py b/src/google/adk/tools/bigquery/query_tool.py index d5b1264fa5..a64bcf7512 100644 --- a/src/google/adk/tools/bigquery/query_tool.py +++ b/src/google/adk/tools/bigquery/query_tool.py @@ -14,1358 +14,13 @@ from __future__ import annotations -import functools -import json -import types -from typing import Callable -from typing import Optional -import uuid +import warnings -from google.auth.credentials import Credentials -from google.cloud import bigquery +from google.adk.integrations.bigquery.query_tool import * -from . import client -from ..tool_context import ToolContext -from .config import BigQueryToolConfig -from .config import WriteMode - -BIGQUERY_SESSION_INFO_KEY = "bigquery_session_info" - - -def _execute_sql( - project_id: str, - query: str, - credentials: Credentials, - settings: BigQueryToolConfig, - tool_context: ToolContext, - dry_run: bool = False, - caller_id: Optional[str] = None, -) -> dict: - try: - # Validate compute project if applicable - if ( - settings.compute_project_id - and project_id != settings.compute_project_id - ): - return { - "status": "ERROR", - "error_details": ( - f"Cannot execute query in the project {project_id}, as the tool" - " is restricted to execute queries only in the project" - f" {settings.compute_project_id}." - ), - } - - # Get BigQuery client - bq_client = client.get_bigquery_client( - project=project_id, - credentials=credentials, - location=settings.location, - user_agent=[settings.application_name, caller_id], - ) - - # BigQuery connection properties where applicable - bq_connection_properties = [] - - # BigQuery job labels if applicable - bq_job_labels = ( - settings.job_labels.copy() if settings and settings.job_labels else {} - ) - - if caller_id: - bq_job_labels["adk-bigquery-tool"] = caller_id - if settings and settings.application_name: - bq_job_labels["adk-bigquery-application-name"] = settings.application_name - - if not settings or settings.write_mode == WriteMode.BLOCKED: - dry_run_query_job = bq_client.query( - query, - project=project_id, - job_config=bigquery.QueryJobConfig( - dry_run=True, labels=bq_job_labels - ), - ) - if dry_run_query_job.statement_type != "SELECT": - return { - "status": "ERROR", - "error_details": "Read-only mode only supports SELECT statements.", - } - elif settings.write_mode == WriteMode.PROTECTED: - # In protected write mode, write operation only to a temporary artifact is - # allowed. This artifact must have been created in a BigQuery session. In - # such a scenario, the session info (session id and the anonymous dataset - # containing the artifact) is persisted in the tool context. - bq_session_info = tool_context.state.get(BIGQUERY_SESSION_INFO_KEY, None) - if bq_session_info: - bq_session_id, bq_session_dataset_id = bq_session_info - else: - session_creator_job = bq_client.query( - "SELECT 1", - project=project_id, - job_config=bigquery.QueryJobConfig( - dry_run=True, create_session=True, labels=bq_job_labels - ), - ) - bq_session_id = session_creator_job.session_info.session_id - bq_session_dataset_id = session_creator_job.destination.dataset_id - - # Remember the BigQuery session info for subsequent queries - tool_context.state[BIGQUERY_SESSION_INFO_KEY] = ( - bq_session_id, - bq_session_dataset_id, - ) - - # Session connection property will be set in the query execution - bq_connection_properties.append( - bigquery.ConnectionProperty("session_id", bq_session_id) - ) - - # Check the query type w.r.t. the BigQuery session - dry_run_query_job = bq_client.query( - query, - project=project_id, - job_config=bigquery.QueryJobConfig( - dry_run=True, - connection_properties=bq_connection_properties, - labels=bq_job_labels, - ), - ) - if ( - dry_run_query_job.statement_type != "SELECT" - and dry_run_query_job.destination - and dry_run_query_job.destination.dataset_id != bq_session_dataset_id - ): - return { - "status": "ERROR", - "error_details": ( - "Protected write mode only supports SELECT statements, or write" - " operations in the anonymous dataset of a BigQuery session." - ), - } - - # Return the dry run characteristics of the query if requested - if dry_run: - dry_run_job = bq_client.query( - query, - project=project_id, - job_config=bigquery.QueryJobConfig( - dry_run=True, - connection_properties=bq_connection_properties, - labels=bq_job_labels, - ), - ) - return {"status": "SUCCESS", "dry_run_info": dry_run_job.to_api_repr()} - - # Finally execute the query, fetch the result, and return it - job_config = bigquery.QueryJobConfig( - connection_properties=bq_connection_properties, - labels=bq_job_labels, - ) - if settings.maximum_bytes_billed: - job_config.maximum_bytes_billed = settings.maximum_bytes_billed - row_iterator = bq_client.query_and_wait( - query, - job_config=job_config, - project=project_id, - max_results=settings.max_query_result_rows, - ) - rows = [] - for row in row_iterator: - row_values = {} - for key, val in row.items(): - try: - # if the json serialization of the value succeeds, use it as is - json.dumps(val) - except (TypeError, ValueError, OverflowError): - val = str(val) - row_values[key] = val - rows.append(row_values) - - result = {"status": "SUCCESS", "rows": rows} - if ( - settings.max_query_result_rows is not None - and len(rows) == settings.max_query_result_rows - ): - result["result_is_likely_truncated"] = True - return result - except Exception as ex: # pylint: disable=broad-except - return { - "status": "ERROR", - "error_details": str(ex), - } - - -def execute_sql( - project_id: str, - query: str, - credentials: Credentials, - settings: BigQueryToolConfig, - tool_context: ToolContext, - dry_run: bool = False, -) -> dict: - """Run a BigQuery or BigQuery ML SQL query in the project and return the result. - - Args: - project_id (str): The GCP project id in which the query should be - executed. - query (str): The BigQuery SQL query to be executed. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - tool_context (ToolContext): The context for the tool. - dry_run (bool, default False): If True, the query will not be executed. - Instead, the query will be validated and information about the query - will be returned. Defaults to False. - - Returns: - dict: If `dry_run` is False, dictionary representing the result of the - query. If the result contains the key "result_is_likely_truncated" - with value True, it means that there may be additional rows matching - the query not returned in the result. - If `dry_run` is True, dictionary with "dry_run_info" field - containing query information returned by BigQuery. - - Examples: - Fetch data or insights from a table: - - >>> execute_sql("my_project", - ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") - { - "status": "SUCCESS", - "rows": [ - { - "island": "Dream", - "population": 124 - }, - { - "island": "Biscoe", - "population": 168 - }, - { - "island": "Torgersen", - "population": 52 - } - ] - } - - Validate a query and estimate costs without executing it: - - >>> execute_sql( - ... "my_project", - ... "SELECT island FROM " - ... "`bigquery-public-data`.`ml_datasets`.`penguins`", - ... dry_run=True - ... ) - { - "status": "SUCCESS", - "dry_run_info": { - "configuration": { - "dryRun": True, - "jobType": "QUERY", - "query": { - "destinationTable": { - "datasetId": "_...", - "projectId": "my_project", - "tableId": "anon..." - }, - "priority": "INTERACTIVE", - "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", - "useLegacySql": False, - "writeDisposition": "WRITE_TRUNCATE" - } - }, - "jobReference": { - "location": "US", - "projectId": "my_project" - } - } - } - """ - return _execute_sql( - project_id=project_id, - query=query, - credentials=credentials, - settings=settings, - tool_context=tool_context, - dry_run=dry_run, - caller_id="execute_sql", - ) - - -def _execute_sql_write_mode(*args, **kwargs) -> dict: - """Run a BigQuery or BigQuery ML SQL query in the project and return the result. - - Args: - project_id (str): The GCP project id in which the query should be - executed. - query (str): The BigQuery SQL query to be executed. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - tool_context (ToolContext): The context for the tool. - dry_run (bool, default False): If True, the query will not be executed. - Instead, the query will be validated and information about the query - will be returned. Defaults to False. - - Returns: - dict: If `dry_run` is False, dictionary representing the result of the - query. If the result contains the key "result_is_likely_truncated" - with value True, it means that there may be additional rows matching - the query not returned in the result. - If `dry_run` is True, dictionary with "dry_run_info" field - containing query information returned by BigQuery. - - Examples: - Fetch data or insights from a table: - - >>> execute_sql("my_project", - ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") - { - "status": "SUCCESS", - "rows": [ - { - "island": "Dream", - "population": 124 - }, - { - "island": "Biscoe", - "population": 168 - }, - { - "island": "Torgersen", - "population": 52 - } - ] - } - - Validate a query and estimate costs without executing it: - - >>> execute_sql( - ... "my_project", - ... "SELECT island FROM " - ... "`bigquery-public-data`.`ml_datasets`.`penguins`", - ... dry_run=True - ... ) - { - "status": "SUCCESS", - "dry_run_info": { - "configuration": { - "dryRun": True, - "jobType": "QUERY", - "query": { - "destinationTable": { - "datasetId": "_...", - "projectId": "my_project", - "tableId": "anon..." - }, - "priority": "INTERACTIVE", - "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", - "useLegacySql": False, - "writeDisposition": "WRITE_TRUNCATE" - } - }, - "jobReference": { - "location": "US", - "projectId": "my_project" - } - } - } - - Create a table with schema prescribed: - - >>> execute_sql("my_project", - ... "CREATE TABLE `my_project`.`my_dataset`.`my_table` " - ... "(island STRING, population INT64)") - { - "status": "SUCCESS", - "rows": [] - } - - Insert data into an existing table: - - >>> execute_sql("my_project", - ... "INSERT INTO `my_project`.`my_dataset`.`my_table` (island, population) " - ... "VALUES ('Dream', 124), ('Biscoe', 168)") - { - "status": "SUCCESS", - "rows": [] - } - - Create a table from the result of a query: - - >>> execute_sql("my_project", - ... "CREATE TABLE `my_project`.`my_dataset`.`my_table` AS " - ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") - { - "status": "SUCCESS", - "rows": [] - } - - Delete a table: - - >>> execute_sql("my_project", - ... "DROP TABLE `my_project`.`my_dataset`.`my_table`") - { - "status": "SUCCESS", - "rows": [] - } - - Copy a table to another table: - - >>> execute_sql("my_project", - ... "CREATE TABLE `my_project`.`my_dataset`.`my_table_clone` " - ... "CLONE `my_project`.`my_dataset`.`my_table`") - { - "status": "SUCCESS", - "rows": [] - } - - Create a snapshot (a lightweight, read-optimized copy) of en existing - table: - - >>> execute_sql("my_project", - ... "CREATE SNAPSHOT TABLE `my_project`.`my_dataset`.`my_table_snapshot` " - ... "CLONE `my_project`.`my_dataset`.`my_table`") - { - "status": "SUCCESS", - "rows": [] - } - - Create a BigQuery ML linear regression model: - - >>> execute_sql("my_project", - ... "CREATE MODEL `my_dataset`.`my_model` " - ... "OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS " - ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " - ... "WHERE body_mass_g IS NOT NULL") - { - "status": "SUCCESS", - "rows": [] - } - - Evaluate BigQuery ML model: - - >>> execute_sql("my_project", - ... "SELECT * FROM ML.EVALUATE(MODEL `my_dataset`.`my_model`)") - { - "status": "SUCCESS", - "rows": [{'mean_absolute_error': 227.01223667447218, - 'mean_squared_error': 81838.15989216768, - 'mean_squared_log_error': 0.0050704473735013, - 'median_absolute_error': 173.08081641661738, - 'r2_score': 0.8723772534253441, - 'explained_variance': 0.8723772534253442}] - } - - Evaluate BigQuery ML model on custom data: - - >>> execute_sql("my_project", - ... "SELECT * FROM ML.EVALUATE(MODEL `my_dataset`.`my_model`, " - ... "(SELECT * FROM `my_dataset`.`my_table`))") - { - "status": "SUCCESS", - "rows": [{'mean_absolute_error': 227.01223667447218, - 'mean_squared_error': 81838.15989216768, - 'mean_squared_log_error': 0.0050704473735013, - 'median_absolute_error': 173.08081641661738, - 'r2_score': 0.8723772534253441, - 'explained_variance': 0.8723772534253442}] - } - - Predict using BigQuery ML model: - - >>> execute_sql("my_project", - ... "SELECT * FROM ML.PREDICT(MODEL `my_dataset`.`my_model`, " - ... "(SELECT * FROM `my_dataset`.`my_table`))") - { - "status": "SUCCESS", - "rows": [ - { - "predicted_body_mass_g": "3380.9271650847013", - ... - }, { - "predicted_body_mass_g": "3873.6072435386004", - ... - }, - ... - ] - } - - Delete a BigQuery ML model: - - >>> execute_sql("my_project", "DROP MODEL `my_dataset`.`my_model`") - { - "status": "SUCCESS", - "rows": [] - } - - Notes: - - If a destination table already exists, there are a few ways to overwrite - it: - - Use "CREATE OR REPLACE TABLE" instead of "CREATE TABLE". - - First run "DROP TABLE", followed by "CREATE TABLE". - - If a model already exists, there are a few ways to overwrite it: - - Use "CREATE OR REPLACE MODEL" instead of "CREATE MODEL". - - First run "DROP MODEL", followed by "CREATE MODEL". - """ - return execute_sql(*args, **kwargs) - - -def _execute_sql_protected_write_mode(*args, **kwargs) -> dict: - """Run a BigQuery or BigQuery ML SQL query in the project and return the result. - - Args: - project_id (str): The GCP project id in which the query should be - executed. - query (str): The BigQuery SQL query to be executed. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - tool_context (ToolContext): The context for the tool. - dry_run (bool, default False): If True, the query will not be executed. - Instead, the query will be validated and information about the query - will be returned. Defaults to False. - - Returns: - dict: If `dry_run` is False, dictionary representing the result of the - query. If the result contains the key "result_is_likely_truncated" - with value True, it means that there may be additional rows matching - the query not returned in the result. - If `dry_run` is True, dictionary with "dry_run_info" field - containing query information returned by BigQuery. - - Examples: - Fetch data or insights from a table: - - >>> execute_sql("my_project", - ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") - { - "status": "SUCCESS", - "rows": [ - { - "island": "Dream", - "population": 124 - }, - { - "island": "Biscoe", - "population": 168 - }, - { - "island": "Torgersen", - "population": 52 - } - ] - } - - Validate a query and estimate costs without executing it: - - >>> execute_sql( - ... "my_project", - ... "SELECT island FROM " - ... "`bigquery-public-data`.`ml_datasets`.`penguins`", - ... dry_run=True - ... ) - { - "status": "SUCCESS", - "dry_run_info": { - "configuration": { - "dryRun": True, - "jobType": "QUERY", - "query": { - "destinationTable": { - "datasetId": "_...", - "projectId": "my_project", - "tableId": "anon..." - }, - "priority": "INTERACTIVE", - "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", - "useLegacySql": False, - "writeDisposition": "WRITE_TRUNCATE" - } - }, - "jobReference": { - "location": "US", - "projectId": "my_project" - } - } - } - - Create a temporary table with schema prescribed: - - >>> execute_sql("my_project", - ... "CREATE TEMP TABLE `my_table` (island STRING, population INT64)") - { - "status": "SUCCESS", - "rows": [] - } - - Insert data into an existing temporary table: - - >>> execute_sql("my_project", - ... "INSERT INTO `my_table` (island, population) " - ... "VALUES ('Dream', 124), ('Biscoe', 168)") - { - "status": "SUCCESS", - "rows": [] - } - - Create a temporary table from the result of a query: - - >>> execute_sql("my_project", - ... "CREATE TEMP TABLE `my_table` AS " - ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") - { - "status": "SUCCESS", - "rows": [] - } - - Delete a temporary table: - - >>> execute_sql("my_project", "DROP TABLE `my_table`") - { - "status": "SUCCESS", - "rows": [] - } - - Copy a temporary table to another temporary table: - - >>> execute_sql("my_project", - ... "CREATE TEMP TABLE `my_table_clone` CLONE `my_table`") - { - "status": "SUCCESS", - "rows": [] - } - - Create a temporary BigQuery ML linear regression model: - - >>> execute_sql("my_project", - ... "CREATE TEMP MODEL `my_model` " - ... "OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS" - ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " - ... "WHERE body_mass_g IS NOT NULL") - { - "status": "SUCCESS", - "rows": [] - } - - Evaluate BigQuery ML model: - - >>> execute_sql("my_project", "SELECT * FROM ML.EVALUATE(MODEL `my_model`)") - { - "status": "SUCCESS", - "rows": [{'mean_absolute_error': 227.01223667447218, - 'mean_squared_error': 81838.15989216768, - 'mean_squared_log_error': 0.0050704473735013, - 'median_absolute_error': 173.08081641661738, - 'r2_score': 0.8723772534253441, - 'explained_variance': 0.8723772534253442}] - } - - Evaluate BigQuery ML model on custom data: - - >>> execute_sql("my_project", - ... "SELECT * FROM ML.EVALUATE(MODEL `my_model`, " - ... "(SELECT * FROM `my_dataset`.`my_table`))") - { - "status": "SUCCESS", - "rows": [{'mean_absolute_error': 227.01223667447218, - 'mean_squared_error': 81838.15989216768, - 'mean_squared_log_error': 0.0050704473735013, - 'median_absolute_error': 173.08081641661738, - 'r2_score': 0.8723772534253441, - 'explained_variance': 0.8723772534253442}] - } - - Predict using BigQuery ML model: - - >>> execute_sql("my_project", - ... "SELECT * FROM ML.PREDICT(MODEL `my_model`, " - ... "(SELECT * FROM `my_dataset`.`my_table`))") - { - "status": "SUCCESS", - "rows": [ - { - "predicted_body_mass_g": "3380.9271650847013", - ... - }, { - "predicted_body_mass_g": "3873.6072435386004", - ... - }, - ... - ] - } - - Delete a BigQuery ML model: - - >>> execute_sql("my_project", "DROP MODEL `my_model`") - { - "status": "SUCCESS", - "rows": [] - } - - Notes: - - If a destination table already exists, there are a few ways to overwrite - it: - - Use "CREATE OR REPLACE TEMP TABLE" instead of "CREATE TEMP TABLE". - - First run "DROP TABLE", followed by "CREATE TEMP TABLE". - - Only temporary tables can be created, inserted into or deleted. Please - do not try creating a permanent table (non-TEMP table), inserting into or - deleting one. - - If a destination model already exists, there are a few ways to overwrite - it: - - Use "CREATE OR REPLACE TEMP MODEL" instead of "CREATE TEMP MODEL". - - First run "DROP MODEL", followed by "CREATE TEMP MODEL". - - Only temporary models can be created or deleted. Please do not try - creating a permanent model (non-TEMP model) or deleting one. - """ - return execute_sql(*args, **kwargs) - - -def get_execute_sql(settings: BigQueryToolConfig) -> Callable[..., dict]: - """Get the execute_sql tool customized as per the given tool settings. - - Args: - settings: BigQuery tool settings indicating the behavior of the - execute_sql tool. - - Returns: - callable[..., dict]: A version of the execute_sql tool respecting the tool - settings. - """ - - if not settings or settings.write_mode == WriteMode.BLOCKED: - return execute_sql - - # Create a new function object using the original function's code and globals. - # We pass the original code, globals, name, defaults, and closure. - # This creates a raw function object without copying other metadata yet. - execute_sql_wrapper = types.FunctionType( - execute_sql.__code__, - execute_sql.__globals__, - execute_sql.__name__, - execute_sql.__defaults__, - execute_sql.__closure__, - ) - - # Use functools.update_wrapper to copy over other essential attributes - # from the original function to the new one. - # This includes __name__, __qualname__, __module__, __annotations__, etc. - # It specifically allows us to then set __doc__ separately. - functools.update_wrapper(execute_sql_wrapper, execute_sql) - - # Now, set the new docstring - if settings.write_mode == WriteMode.PROTECTED: - execute_sql_wrapper.__doc__ = _execute_sql_protected_write_mode.__doc__ - else: - execute_sql_wrapper.__doc__ = _execute_sql_write_mode.__doc__ - - return execute_sql_wrapper - - -def forecast( - project_id: str, - history_data: str, - timestamp_col: str, - data_col: str, - horizon: int = 10, - id_cols: Optional[list[str]] = None, - *, - credentials: Credentials, - settings: BigQueryToolConfig, - tool_context: ToolContext, -) -> dict: - """Run a BigQuery AI time series forecast using AI.FORECAST. - - Args: - project_id (str): The GCP project id in which the query should be - executed. - history_data (str): The table id of the BigQuery table containing the - history time series data or a query statement that select the history - data. - timestamp_col (str): The name of the column containing the timestamp for - each data point. - data_col (str): The name of the column containing the numerical values to - be forecasted. - horizon (int, optional): The number of time steps to forecast into the - future. Defaults to 10. - id_cols (list, optional): The column names of the id columns to indicate - each time series when there are multiple time series in the table. All - elements must be strings. Defaults to None. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - tool_context (ToolContext): The context for the tool. - - Returns: - dict: Dictionary representing the result of the forecast. The result - contains the forecasted values along with prediction intervals. - - Examples: - Forecast daily sales for the next 7 days based on historical data from - a BigQuery table: - - >>> forecast( - ... project_id="my-gcp-project", - ... history_data="my-dataset.my-sales-table", - ... timestamp_col="sale_date", - ... data_col="daily_sales", - ... horizon=7 - ... ) - { - "status": "SUCCESS", - "rows": [ - { - "forecast_timestamp": "2025-01-08T00:00:00", - "forecast_value": 12345.67, - "confidence_level": 0.95, - "prediction_interval_lower_bound": 11000.0, - "prediction_interval_upper_bound": 13691.34, - "ai_forecast_status": "" - }, - ... - ] - } - - Forecast multiple time series using a SQL query as input: - - >>> history_query = ( - ... "SELECT unique_id, timestamp, value " - ... "FROM `my-project.my-dataset.my-timeseries-table` " - ... "WHERE timestamp > '1980-01-01'" - ... ) - >>> forecast( - ... project_id="my-gcp-project", - ... history_data=history_query, - ... timestamp_col="timestamp", - ... data_col="value", - ... id_cols=["unique_id"], - ... horizon=14 - ... ) - { - "status": "SUCCESS", - "rows": [ - { - "unique_id": "T1", - "forecast_timestamp": "1980-08-28T00:00:00", - "forecast_value": 1253218.75, - "confidence_level": 0.95, - "prediction_interval_lower_bound": 274252.51, - "prediction_interval_upper_bound": 2232184.99, - "ai_forecast_status": "" - }, - ... - ] - } - - Error Scenarios: - When an element in `id_cols` is not a string: - - >>> forecast( - ... project_id="my-gcp-project", - ... history_data="my-dataset.my-sales-table", - ... timestamp_col="sale_date", - ... data_col="daily_sales", - ... id_cols=["store_id", 123] - ... ) - { - "status": "ERROR", - "error_details": "All elements in id_cols must be strings." - } - - When `history_data` refers to a table that does not exist: - - >>> forecast( - ... project_id="my-gcp-project", - ... history_data="my-dataset.nonexistent-table", - ... timestamp_col="sale_date", - ... data_col="daily_sales" - ... ) - { - "status": "ERROR", - "error_details": "Not found: Table - my-gcp-project:my-dataset.nonexistent-table was not found in - location US" - } - """ - model = "TimesFM 2.0" - confidence_level = 0.95 - trimmed_upper_history_data = history_data.strip().upper() - if trimmed_upper_history_data.startswith( - "SELECT" - ) or trimmed_upper_history_data.startswith("WITH"): - history_data_source = f"({history_data})" - else: - history_data_source = f"TABLE `{history_data}`" - - if id_cols: - if not all(isinstance(item, str) for item in id_cols): - return { - "status": "ERROR", - "error_details": "All elements in id_cols must be strings.", - } - id_cols_str = "[" + ", ".join([f"'{col}'" for col in id_cols]) + "]" - - query = f""" - SELECT * FROM AI.FORECAST( - {history_data_source}, - data_col => '{data_col}', - timestamp_col => '{timestamp_col}', - model => '{model}', - id_cols => {id_cols_str}, - horizon => {horizon}, - confidence_level => {confidence_level} - ) - """ - else: - query = f""" - SELECT * FROM AI.FORECAST( - {history_data_source}, - data_col => '{data_col}', - timestamp_col => '{timestamp_col}', - model => '{model}', - horizon => {horizon}, - confidence_level => {confidence_level} - ) - """ - return _execute_sql( - project_id=project_id, - query=query, - credentials=credentials, - settings=settings, - tool_context=tool_context, - caller_id="forecast", - ) - - -def analyze_contribution( - project_id: str, - input_data: str, - contribution_metric: str, - dimension_id_cols: list[str], - is_test_col: str, - credentials: Credentials, - settings: BigQueryToolConfig, - tool_context: ToolContext, - top_k_insights: int = 30, - pruning_method: str = "PRUNE_REDUNDANT_INSIGHTS", -) -> dict: - """Run a BigQuery ML contribution analysis using ML.CREATE_MODEL and ML.GET_INSIGHTS. - - Args: - project_id (str): The GCP project id in which the query should be - executed. - input_data (str): The data that contain the test and control data to - analyze. Can be a fully qualified BigQuery table ID or a SQL query. - dimension_id_cols (list[str]): The column names of the dimension columns. - contribution_metric (str): The name of the column that contains the metric - to analyze. Provides the expression to use to calculate the metric you - are analyzing. To calculate a summable metric, the expression must be in - the form SUM(metric_column_name), where metric_column_name is a numeric - data type. To calculate a summable ratio metric, the expression must be - in the form - SUM(numerator_metric_column_name)/SUM(denominator_metric_column_name), - where numerator_metric_column_name and denominator_metric_column_name - are numeric data types. To calculate a summable by category metric, the - expression must be in the form - SUM(metric_sum_column_name)/COUNT(DISTINCT categorical_column_name). The - summed column must be a numeric data type. The categorical column must - have type BOOL, DATE, DATETIME, TIME, TIMESTAMP, STRING, or INT64. - is_test_col (str): The name of the column to use to determine whether a - given row is test data or control data. The column must have a BOOL data - type. - credentials: The credentials to use for the request. - settings: The settings for the tool. - tool_context: The context for the tool. - top_k_insights (int, optional): The number of top insights to return, - ranked by apriori support. Defaults to 30. - pruning_method (str, optional): The method to use for pruning redundant - insights. Can be 'NO_PRUNING' or 'PRUNE_REDUNDANT_INSIGHTS'. Defaults to - "PRUNE_REDUNDANT_INSIGHTS". - - Returns: - dict: Dictionary representing the result of the contribution analysis. - - Examples: - Analyze the contribution of different dimensions to the total sales: - - >>> analyze_contribution( - ... project_id="my-gcp-project", - ... input_data="my-dataset.my-sales-table", - ... dimension_id_cols=["store_id", "product_category"], - ... contribution_metric="SUM(total_sales)", - ... is_test_col="is_test" - ... ) - The return is: - { - "status": "SUCCESS", - "rows": [ - { - "store_id": "S1", - "product_category": "Electronics", - "contributors": ["S1", "Electronics"], - "metric_test": 120, - "metric_control": 100, - "difference": 20, - "relative_difference": 0.2, - "unexpected_difference": 5, - "relative_unexpected_difference": 0.043, - "apriori_support": 0.15 - }, - ... - ] - } - - Analyze the contribution of different dimensions to the total sales using - a SQL query as input: - - >>> analyze_contribution( - ... project_id="my-gcp-project", - ... input_data="SELECT store_id, product_category, total_sales, " - ... "is_test FROM `my-project.my-dataset.my-sales-table` " - ... "WHERE transaction_date > '2025-01-01'" - ... dimension_id_cols=["store_id", "product_category"], - ... contribution_metric="SUM(total_sales)", - ... is_test_col="is_test" - ... ) - The return is: - { - "status": "SUCCESS", - "rows": [ - { - "store_id": "S2", - "product_category": "Groceries", - "contributors": ["S2", "Groceries"], - "metric_test": 250, - "metric_control": 200, - "difference": 50, - "relative_difference": 0.25, - "unexpected_difference": 10, - "relative_unexpected_difference": 0.041, - "apriori_support": 0.22 - }, - ... - ] - } - """ - if not all(isinstance(item, str) for item in dimension_id_cols): - return { - "status": "ERROR", - "error_details": "All elements in dimension_id_cols must be strings.", - } - - # Generate a unique temporary model name - model_name = ( - f"contribution_analysis_model_{str(uuid.uuid4()).replace('-', '_')}" - ) - - id_cols_str = "[" + ", ".join([f"'{col}'" for col in dimension_id_cols]) + "]" - options = [ - "MODEL_TYPE = 'CONTRIBUTION_ANALYSIS'", - f"CONTRIBUTION_METRIC = '{contribution_metric}'", - f"IS_TEST_COL = '{is_test_col}'", - f"DIMENSION_ID_COLS = {id_cols_str}", - ] - - options.append(f"TOP_K_INSIGHTS_BY_APRIORI_SUPPORT = {top_k_insights}") - - upper_pruning = pruning_method.upper() - if upper_pruning not in ["NO_PRUNING", "PRUNE_REDUNDANT_INSIGHTS"]: - return { - "status": "ERROR", - "error_details": f"Invalid pruning_method: {pruning_method}", - } - options.append(f"PRUNING_METHOD = '{upper_pruning}'") - - options_str = ", ".join(options) - - trimmed_upper_input_data = input_data.strip().upper() - if trimmed_upper_input_data.startswith( - "SELECT" - ) or trimmed_upper_input_data.startswith("WITH"): - input_data_source = f"({input_data})" - else: - input_data_source = f"SELECT * FROM `{input_data}`" - - create_model_query = f""" - CREATE TEMP MODEL {model_name} - OPTIONS ({options_str}) - AS {input_data_source} - """ - - get_insights_query = f""" - SELECT * FROM ML.GET_INSIGHTS(MODEL {model_name}) - """ - - # Create a session and run the create model query. - try: - execute_sql_settings = settings - if execute_sql_settings.write_mode == WriteMode.BLOCKED: - raise ValueError("analyze_contribution is not allowed in this session.") - elif execute_sql_settings.write_mode != WriteMode.PROTECTED: - # Running create temp model requires a session. So we set the write mode - # to PROTECTED to run the create model query and job query in the same - # session. - execute_sql_settings = settings.model_copy( - update={"write_mode": WriteMode.PROTECTED} - ) - - result = _execute_sql( - project_id=project_id, - query=create_model_query, - credentials=credentials, - settings=execute_sql_settings, - tool_context=tool_context, - caller_id="analyze_contribution", - ) - if result["status"] != "SUCCESS": - return result - - result = _execute_sql( - project_id=project_id, - query=get_insights_query, - credentials=credentials, - settings=execute_sql_settings, - tool_context=tool_context, - caller_id="analyze_contribution", - ) - except Exception as ex: # pylint: disable=broad-except - return { - "status": "ERROR", - "error_details": f"Error during analyze_contribution: {repr(ex)}", - } - - return result - - -def detect_anomalies( - project_id: str, - history_data: str, - times_series_timestamp_col: str, - times_series_data_col: str, - horizon: Optional[int] = 1000, - target_data: Optional[str] = None, - times_series_id_cols: Optional[list[str]] = None, - anomaly_prob_threshold: Optional[float] = 0.95, - *, - credentials: Credentials, - settings: BigQueryToolConfig, - tool_context: ToolContext, -) -> dict: - """Run a BigQuery time series ARIMA_PLUS model training and anomaly detection using CREATE MODEL and ML.DETECT_ANOMALIES clauses. - - Args: - project_id (str): The GCP project id in which the query should be - executed. - history_data (str): The table id of the BigQuery table containing the - history time series data or a query statement that select the history - data. - times_series_timestamp_col (str): The name of the column containing the - timestamp for each data point. - times_series_data_col (str): The name of the column containing the - numerical values to be forecasted and anomaly detected. - horizon (int, optional): The number of time steps to forecast into the - future. Defaults to 1000. - target_data (str, optional): The table id of the BigQuery table containing - the target time series data or a query statement that select the target - data. - times_series_id_cols (list, optional): The column names of the id columns - to indicate each time series when there are multiple time series in the - table. All elements must be strings. Defaults to None. - anomaly_prob_threshold (float, optional): The probability threshold to - determine if a data point is an anomaly. Defaults to 0.95. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - tool_context (ToolContext): The context for the tool. - - Returns: - dict: Dictionary representing the result of the anomaly detection. The - result contains the boolean value if the data point is anomaly or - not, lower bound, upper bound and anomaly probability for each data - point and also the probability of whether the data point is anomaly - or not. - - Examples: - Detect Anomalies daily sales based on historical data from a BigQuery - table: - - >>> detect_anomalies( - ... project_id="my-gcp-project", - ... history_data="my-dataset.my-sales-table", - ... times_series_timestamp_col="sale_date", - ... times_series_data_col="daily_sales" - ... ) - { - "status": "SUCCESS", - "rows": [ - { - "ts_timestamp": "2021-01-01 00:00:01 UTC", - "ts_data": 125.3, - "is_anomaly": TRUE, - "lower_bound": 129.5, - "upper_bound": 133.6 , - "anomaly_probability": 0.93 - }, - ... - ] - } - - Detect Anomalies on multiple time series using a SQL query as input: - - >>> history_query = ( - ... "SELECT unique_id, timestamp, value " - ... "FROM `my-project.my-dataset.my-timeseries-table` " - ... "WHERE timestamp > '1980-01-01'" - ... ) - >>> detect_anomalies( - ... project_id="my-gcp-project", - ... history_data=history_query, - ... times_series_timestamp_col="timestamp", - ... times_series_data_col="value", - ... times_series_id_cols=["unique_id"] - ... ) - { - "status": "SUCCESS", - "rows": [ - { - "unique_id": "T1", - "ts_timestamp": "2021-01-01 00:00:01 UTC", - "ts_data": 125.3, - "is_anomaly": TRUE, - "lower_bound": 129.5, - "upper_bound": 133.6 , - "anomaly_probability": 0.93 - }, - ... - ] - } - - Error Scenarios: - When an element in `times_series_id_cols` is not a string: - - >>> detect_anomalies( - ... project_id="my-gcp-project", - ... history_data="my-dataset.my-sales-table", - ... times_series_timestamp_col="sale_date", - ... times_series_data_col="daily_sales", - ... times_series_id_cols=["store_id", 123] - ... ) - { - "status": "ERROR", - "error_details": "All elements in times_series_id_cols must be - strings." - } - - When `history_data` refers to a table that does not exist: - - >>> detect_anomalies( - ... project_id="my-gcp-project", - ... history_data="my-dataset.nonexistent-table", - ... times_series_timestamp_col="sale_date", - ... times_series_data_col="daily_sales" - ... ) - { - "status": "ERROR", - "error_details": "Not found: Table - my-gcp-project:my-dataset.nonexistent-table was not found in - location US" - } - """ - trimmed_upper_history_data = history_data.strip().upper() - if trimmed_upper_history_data.startswith( - "SELECT" - ) or trimmed_upper_history_data.startswith("WITH"): - history_data_source = f"({history_data})" - else: - history_data_source = f"SELECT * FROM `{history_data}`" - - options = [ - "MODEL_TYPE = 'ARIMA_PLUS'", - f"TIME_SERIES_TIMESTAMP_COL = '{times_series_timestamp_col}'", - f"TIME_SERIES_DATA_COL = '{times_series_data_col}'", - f"HORIZON = {horizon}", - ] - - if times_series_id_cols: - if not all(isinstance(item, str) for item in times_series_id_cols): - return { - "status": "ERROR", - "error_details": ( - "All elements in times_series_id_cols must be strings." - ), - } - times_series_id_cols_str = ( - "[" + ", ".join([f"'{col}'" for col in times_series_id_cols]) + "]" - ) - options.append(f"TIME_SERIES_ID_COL = {times_series_id_cols_str}") - - options_str = ", ".join(options) - - model_name = f"detect_anomalies_model_{str(uuid.uuid4()).replace('-', '_')}" - - create_model_query = f""" - CREATE TEMP MODEL {model_name} - OPTIONS ({options_str}) - AS {history_data_source} - """ - order_by_id_cols = ( - ", ".join(col for col in times_series_id_cols) + ", " - if times_series_id_cols - else "" - ) - - anomaly_detection_query = f""" - SELECT * FROM ML.DETECT_ANOMALIES(MODEL {model_name}, STRUCT({anomaly_prob_threshold} AS anomaly_prob_threshold)) ORDER BY {order_by_id_cols}{times_series_timestamp_col} - """ - if target_data: - trimmed_upper_target_data = target_data.strip().upper() - if trimmed_upper_target_data.startswith( - "SELECT" - ) or trimmed_upper_target_data.startswith("WITH"): - target_data_source = f"({target_data})" - else: - target_data_source = f"(SELECT * FROM `{target_data}`)" - - anomaly_detection_query = f""" - SELECT * FROM ML.DETECT_ANOMALIES(MODEL {model_name}, STRUCT({anomaly_prob_threshold} AS anomaly_prob_threshold), {target_data_source}) ORDER BY {order_by_id_cols}{times_series_timestamp_col} - """ - - # Create a session and run the create model query. - try: - execute_sql_settings = settings - if execute_sql_settings.write_mode == WriteMode.BLOCKED: - raise ValueError("anomaly detection is not allowed in this session.") - elif execute_sql_settings.write_mode != WriteMode.PROTECTED: - # Running create temp model requires a session. So we set the write mode - # to PROTECTED to run the create model query and job query in the same - # session. - execute_sql_settings = settings.model_copy( - update={"write_mode": WriteMode.PROTECTED} - ) - - result = _execute_sql( - project_id=project_id, - query=create_model_query, - credentials=credentials, - settings=execute_sql_settings, - tool_context=tool_context, - caller_id="detect_anomalies", - ) - if result["status"] != "SUCCESS": - return result - - result = _execute_sql( - project_id=project_id, - query=anomaly_detection_query, - credentials=credentials, - settings=execute_sql_settings, - tool_context=tool_context, - caller_id="detect_anomalies", - ) - except Exception as ex: # pylint: disable=broad-except - return { - "status": "ERROR", - "error_details": f"Error during anomaly detection: {repr(ex)}", - } - - return result +warnings.warn( + "google.adk.tools.bigquery.query_tool is moved to" + " google.adk.integrations.bigquery.query_tool", + DeprecationWarning, + stacklevel=2, +) diff --git a/src/google/adk/tools/bigquery/search_tool.py b/src/google/adk/tools/bigquery/search_tool.py index 346947762e..8c4449f177 100644 --- a/src/google/adk/tools/bigquery/search_tool.py +++ b/src/google/adk/tools/bigquery/search_tool.py @@ -14,169 +14,13 @@ from __future__ import annotations -import logging -from typing import Any +import warnings -from google.api_core import exceptions as api_exceptions -from google.auth.credentials import Credentials -from google.cloud import dataplex_v1 +from google.adk.integrations.bigquery.search_tool import * -from . import client -from .config import BigQueryToolConfig - - -def _construct_search_query_helper( - predicate: str, operator: str, items: list[str] -) -> str: - """Constructs a search query part for a specific predicate and items.""" - if not items: - return "" - - clauses = [f'{predicate}{operator}"{item}"' for item in items] - return "(" + " OR ".join(clauses) + ")" if len(items) > 1 else clauses[0] - - -def search_catalog( - prompt: str, - project_id: str, - *, - credentials: Credentials, - settings: BigQueryToolConfig, - location: str | None = None, - page_size: int = 10, - project_ids_filter: list[str] | None = None, - dataset_ids_filter: list[str] | None = None, - types_filter: list[str] | None = None, -) -> dict[str, Any]: - """Finds BigQuery datasets and tables using natural language semantic search via Dataplex. - - Use this tool to discover BigQuery assets when you don't know the exact names. - It's ideal for searching based on topics, descriptions, or questions about the data. - - Args: - prompt: The base search query (natural language or keywords). - project_id: The Google Cloud project ID to scope the search. - credentials: Credentials for the request. - settings: BigQuery tool settings. - location: The Dataplex location to use. - page_size: Maximum number of results. - project_ids_filter: Specific project IDs to include in the search results. - If None, defaults to the scoping project_id. - dataset_ids_filter: BigQuery dataset IDs to filter by. - types_filter: Entry types to filter by (e.g., BigQueryEntryType.TABLE, - BigQueryEntryType.DATASET). - - Returns: - Search results or error. The "results" list contains items with: - - name: The Dataplex Entry name (e.g., - "projects/p/locations/l/entryGroups/g/entries/e"). - - linked_resource: The underlying BigQuery resource name (e.g., - "//bigquery.googleapis.com/projects/p/datasets/d/tables/t"). - - display_name, entry_type, description, location, update_time. - - Examples: - Search for tables related to customer data: - - >>> search_catalog( - ... prompt="Search for tables related to customer data", - ... project_id="my-project", - ... credentials=creds, - ... settings=settings - ... ) - { - "status": "SUCCESS", - "results": [ - { - "name": - "projects/my-project/locations/us/entryGroups/@bigquery/entries/entry-id", - "display_name": "customer_table", - "entry_type": - "projects/p/locations/l/entryTypes/bigquery-table", - "linked_resource": - "//bigquery.googleapis.com/projects/my-project/datasets/d/tables/customer_table", - "description": "Table containing customer details.", - "location": "us", - "update_time": "2024-01-01 12:00:00+00:00" - } - ] - } - """ - - try: - if not project_id: - return { - "status": "ERROR", - "error_details": "project_id must be provided.", - } - - with client.get_dataplex_catalog_client( - credentials=credentials, - user_agent=[settings.application_name, "search_catalog"], - ) as dataplex_client: - query_parts = [] - if prompt: - query_parts.append(f"({prompt})") - - # Filter by project IDs - projects_to_filter = ( - project_ids_filter if project_ids_filter else [project_id] - ) - if projects_to_filter: - query_parts.append( - _construct_search_query_helper("projectid", "=", projects_to_filter) - ) - - # Filter by dataset IDs - if dataset_ids_filter: - dataset_resource_filters = [] - for pid in projects_to_filter: - for did in dataset_ids_filter: - dataset_resource_filters.append( - f'linked_resource:"//bigquery.googleapis.com/projects/{pid}/datasets/{did}/*"' - ) - if dataset_resource_filters: - query_parts.append(f"({' OR '.join(dataset_resource_filters)})") - # Filter by entry types - if types_filter: - query_parts.append( - _construct_search_query_helper("type", "=", types_filter) - ) - - # Always scope to BigQuery system - query_parts.append("system=BIGQUERY") - - full_query = " AND ".join(filter(None, query_parts)) - - search_location = location or settings.location or "global" - search_scope = f"projects/{project_id}/locations/{search_location}" - - request = dataplex_v1.SearchEntriesRequest( - name=search_scope, - query=full_query, - page_size=page_size, - semantic_search=True, - ) - - response = dataplex_client.search_entries(request=request) - - results = [] - for result in response.results: - entry = result.dataplex_entry - source = entry.entry_source - results.append({ - "name": entry.name, - "display_name": source.display_name or "", - "entry_type": entry.entry_type, - "update_time": str(entry.update_time), - "linked_resource": source.resource or "", - "description": source.description or "", - "location": source.location or "", - }) - return {"status": "SUCCESS", "results": results} - - except api_exceptions.GoogleAPICallError as e: - logging.exception("search_catalog tool: API call failed") - return {"status": "ERROR", "error_details": f"Dataplex API Error: {e}"} - except Exception as e: - logging.exception("search_catalog tool: Unexpected error") - return {"status": "ERROR", "error_details": repr(e)} +warnings.warn( + "google.adk.tools.bigquery.search_tool is moved to" + " google.adk.integrations.bigquery.search_tool", + DeprecationWarning, + stacklevel=2, +) diff --git a/tests/unittests/integrations/api_registry/__init__.py b/tests/unittests/integrations/api_registry/__init__.py index 4d9a92490b..58d482ea38 100644 --- a/tests/unittests/integrations/api_registry/__init__.py +++ b/tests/unittests/integrations/api_registry/__init__.py @@ -1,3 +1,5 @@ +# Copyright 2026 Google LLC +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at diff --git a/tests/unittests/tools/bigquery/test_bigquery_client.py b/tests/unittests/integrations/bigquery/test_bigquery_client.py similarity index 98% rename from tests/unittests/tools/bigquery/test_bigquery_client.py rename to tests/unittests/integrations/bigquery/test_bigquery_client.py index 8720bf3dbe..a926590c44 100644 --- a/tests/unittests/tools/bigquery/test_bigquery_client.py +++ b/tests/unittests/integrations/bigquery/test_bigquery_client.py @@ -18,9 +18,9 @@ from unittest import mock import google.adk -from google.adk.tools.bigquery.client import DP_USER_AGENT -from google.adk.tools.bigquery.client import get_bigquery_client -from google.adk.tools.bigquery.client import get_dataplex_catalog_client +from google.adk.integrations.bigquery.client import DP_USER_AGENT +from google.adk.integrations.bigquery.client import get_bigquery_client +from google.adk.integrations.bigquery.client import get_dataplex_catalog_client from google.adk.utils._telemetry_context import _is_visual_builder from google.api_core.gapic_v1 import client_info as gapic_client_info import google.auth diff --git a/tests/unittests/tools/bigquery/test_bigquery_credentials.py b/tests/unittests/integrations/bigquery/test_bigquery_credentials.py similarity index 98% rename from tests/unittests/tools/bigquery/test_bigquery_credentials.py rename to tests/unittests/integrations/bigquery/test_bigquery_credentials.py index f0c188d0a4..da4acbd463 100644 --- a/tests/unittests/tools/bigquery/test_bigquery_credentials.py +++ b/tests/unittests/integrations/bigquery/test_bigquery_credentials.py @@ -14,7 +14,7 @@ from unittest import mock -from google.adk.tools.bigquery import BigQueryCredentialsConfig +from google.adk.integrations.bigquery import BigQueryCredentialsConfig # Mock the Google OAuth and API dependencies import google.auth.credentials import google.oauth2.credentials @@ -30,6 +30,7 @@ class TestBigQueryCredentials: def test_valid_credentials_object_auth_credentials(self): """Test that providing valid Credentials object works correctly with + google.auth.credentials.Credentials. When a user already has valid OAuth credentials, they should be able @@ -52,6 +53,7 @@ def test_valid_credentials_object_auth_credentials(self): def test_valid_credentials_object_oauth2_credentials(self): """Test that providing valid Credentials object works correctly with + google.oauth2.credentials.Credentials. When a user already has valid OAuth credentials, they should be able diff --git a/tests/unittests/tools/bigquery/test_bigquery_data_insights_tool.py b/tests/unittests/integrations/bigquery/test_bigquery_data_insights_tool.py similarity index 98% rename from tests/unittests/tools/bigquery/test_bigquery_data_insights_tool.py rename to tests/unittests/integrations/bigquery/test_bigquery_data_insights_tool.py index e52a90f96c..4c022ffe21 100644 --- a/tests/unittests/tools/bigquery/test_bigquery_data_insights_tool.py +++ b/tests/unittests/integrations/bigquery/test_bigquery_data_insights_tool.py @@ -15,7 +15,7 @@ import pathlib from unittest import mock -from google.adk.tools.bigquery import data_insights_tool +from google.adk.integrations.bigquery import data_insights_tool import pytest import yaml diff --git a/tests/unittests/tools/bigquery/test_bigquery_metadata_tool.py b/tests/unittests/integrations/bigquery/test_bigquery_metadata_tool.py similarity index 98% rename from tests/unittests/tools/bigquery/test_bigquery_metadata_tool.py rename to tests/unittests/integrations/bigquery/test_bigquery_metadata_tool.py index a0dda5383f..c2db210ff7 100644 --- a/tests/unittests/tools/bigquery/test_bigquery_metadata_tool.py +++ b/tests/unittests/integrations/bigquery/test_bigquery_metadata_tool.py @@ -17,9 +17,9 @@ import os from unittest import mock -from google.adk.tools.bigquery import client as bq_client_lib -from google.adk.tools.bigquery import metadata_tool -from google.adk.tools.bigquery.config import BigQueryToolConfig +from google.adk.integrations.bigquery import client as bq_client_lib +from google.adk.integrations.bigquery import metadata_tool +from google.adk.integrations.bigquery.config import BigQueryToolConfig import google.auth from google.auth.exceptions import DefaultCredentialsError from google.cloud import bigquery diff --git a/tests/unittests/tools/bigquery/test_bigquery_query_tool.py b/tests/unittests/integrations/bigquery/test_bigquery_query_tool.py similarity index 98% rename from tests/unittests/tools/bigquery/test_bigquery_query_tool.py rename to tests/unittests/integrations/bigquery/test_bigquery_query_tool.py index 150cdb7569..fd0083e64d 100644 --- a/tests/unittests/tools/bigquery/test_bigquery_query_tool.py +++ b/tests/unittests/integrations/bigquery/test_bigquery_query_tool.py @@ -24,13 +24,13 @@ import dateutil import dateutil.relativedelta +from google.adk.integrations.bigquery import BigQueryCredentialsConfig +from google.adk.integrations.bigquery import BigQueryToolset +from google.adk.integrations.bigquery import client as bq_client_lib +from google.adk.integrations.bigquery import query_tool +from google.adk.integrations.bigquery.config import BigQueryToolConfig +from google.adk.integrations.bigquery.config import WriteMode from google.adk.tools.base_tool import BaseTool -from google.adk.tools.bigquery import BigQueryCredentialsConfig -from google.adk.tools.bigquery import BigQueryToolset -from google.adk.tools.bigquery import client as bq_client_lib -from google.adk.tools.bigquery import query_tool -from google.adk.tools.bigquery.config import BigQueryToolConfig -from google.adk.tools.bigquery.config import WriteMode from google.adk.tools.tool_context import ToolContext import google.auth from google.auth.exceptions import DefaultCredentialsError @@ -114,7 +114,8 @@ async def test_execute_sql_declaration_read_only(tool_settings): >>> execute_sql("my_project", ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY + island") { "status": "SUCCESS", "rows": [ @@ -154,7 +155,8 @@ async def test_execute_sql_declaration_read_only(tool_settings): "tableId": "anon..." }, "priority": "INTERACTIVE", - "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", + "query": "SELECT island FROM + `bigquery-public-data`.`ml_datasets`.`penguins`", "useLegacySql": False, "writeDisposition": "WRITE_TRUNCATE" } @@ -213,7 +215,8 @@ async def test_execute_sql_declaration_write(tool_settings): >>> execute_sql("my_project", ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY + island") { "status": "SUCCESS", "rows": [ @@ -253,7 +256,8 @@ async def test_execute_sql_declaration_write(tool_settings): "tableId": "anon..." }, "priority": "INTERACTIVE", - "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", + "query": "SELECT island FROM + `bigquery-public-data`.`ml_datasets`.`penguins`", "useLegacySql": False, "writeDisposition": "WRITE_TRUNCATE" } @@ -278,7 +282,8 @@ async def test_execute_sql_declaration_write(tool_settings): Insert data into an existing table: >>> execute_sql("my_project", - ... "INSERT INTO `my_project`.`my_dataset`.`my_table` (island, population) " + ... "INSERT INTO `my_project`.`my_dataset`.`my_table` (island, + population) " ... "VALUES ('Dream', 124), ('Biscoe', 168)") { "status": "SUCCESS", @@ -290,7 +295,8 @@ async def test_execute_sql_declaration_write(tool_settings): >>> execute_sql("my_project", ... "CREATE TABLE `my_project`.`my_dataset`.`my_table` AS " ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY + island") { "status": "SUCCESS", "rows": [] @@ -319,7 +325,8 @@ async def test_execute_sql_declaration_write(tool_settings): table: >>> execute_sql("my_project", - ... "CREATE SNAPSHOT TABLE `my_project`.`my_dataset`.`my_table_snapshot` " + ... "CREATE SNAPSHOT TABLE + `my_project`.`my_dataset`.`my_table_snapshot` " ... "CLONE `my_project`.`my_dataset`.`my_table`") { "status": "SUCCESS", @@ -330,7 +337,8 @@ async def test_execute_sql_declaration_write(tool_settings): >>> execute_sql("my_project", ... "CREATE MODEL `my_dataset`.`my_model` " - ... "OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS " + ... "OPTIONS (model_type='linear_reg', + input_label_cols=['body_mass_g']) AS " ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " ... "WHERE body_mass_g IS NOT NULL") { @@ -450,7 +458,8 @@ async def test_execute_sql_declaration_protected_write(tool_settings): >>> execute_sql("my_project", ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY + island") { "status": "SUCCESS", "rows": [ @@ -490,7 +499,8 @@ async def test_execute_sql_declaration_protected_write(tool_settings): "tableId": "anon..." }, "priority": "INTERACTIVE", - "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", + "query": "SELECT island FROM + `bigquery-public-data`.`ml_datasets`.`penguins`", "useLegacySql": False, "writeDisposition": "WRITE_TRUNCATE" } @@ -526,7 +536,8 @@ async def test_execute_sql_declaration_protected_write(tool_settings): >>> execute_sql("my_project", ... "CREATE TEMP TABLE `my_table` AS " ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY + island") { "status": "SUCCESS", "rows": [] @@ -553,7 +564,8 @@ async def test_execute_sql_declaration_protected_write(tool_settings): >>> execute_sql("my_project", ... "CREATE TEMP MODEL `my_model` " - ... "OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS" + ... "OPTIONS (model_type='linear_reg', + input_label_cols=['body_mass_g']) AS" ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " ... "WHERE body_mass_g IS NOT NULL") { @@ -563,7 +575,8 @@ async def test_execute_sql_declaration_protected_write(tool_settings): Evaluate BigQuery ML model: - >>> execute_sql("my_project", "SELECT * FROM ML.EVALUATE(MODEL `my_model`)") + >>> execute_sql("my_project", "SELECT * FROM ML.EVALUATE(MODEL + `my_model`)") { "status": "SUCCESS", "rows": [{'mean_absolute_error': 227.01223667447218, diff --git a/tests/unittests/tools/bigquery/test_bigquery_search_tool.py b/tests/unittests/integrations/bigquery/test_bigquery_search_tool.py similarity index 98% rename from tests/unittests/tools/bigquery/test_bigquery_search_tool.py rename to tests/unittests/integrations/bigquery/test_bigquery_search_tool.py index 0ccdc9e18e..f2dc21c5fd 100644 --- a/tests/unittests/tools/bigquery/test_bigquery_search_tool.py +++ b/tests/unittests/integrations/bigquery/test_bigquery_search_tool.py @@ -53,8 +53,8 @@ class MockBaseModel: sys.modules["fastapi.openapi.models"] = mock.MagicMock() -from google.adk.tools.bigquery import search_tool -from google.adk.tools.bigquery.config import BigQueryToolConfig +from google.adk.integrations.bigquery import search_tool +from google.adk.integrations.bigquery.config import BigQueryToolConfig from google.api_core import exceptions as api_exceptions from google.auth.credentials import Credentials from google.cloud import dataplex_v1 @@ -107,7 +107,7 @@ def setUp(self): # Patch get_dataplex_catalog_client self.mock_get_dataplex_client = self.enter_context( mock.patch( - "google.adk.tools.bigquery.client.get_dataplex_catalog_client", + "google.adk.integrations.bigquery.client.get_dataplex_catalog_client", autospec=True, ) ) diff --git a/tests/unittests/tools/bigquery/test_bigquery_tool_config.py b/tests/unittests/integrations/bigquery/test_bigquery_tool_config.py similarity index 98% rename from tests/unittests/tools/bigquery/test_bigquery_tool_config.py rename to tests/unittests/integrations/bigquery/test_bigquery_tool_config.py index 60a41eb440..3918ff48a4 100644 --- a/tests/unittests/tools/bigquery/test_bigquery_tool_config.py +++ b/tests/unittests/integrations/bigquery/test_bigquery_tool_config.py @@ -17,7 +17,7 @@ import warnings from google.adk.features._feature_registry import _WARNED_FEATURES -from google.adk.tools.bigquery.config import BigQueryToolConfig +from google.adk.integrations.bigquery.config import BigQueryToolConfig import pytest diff --git a/tests/unittests/tools/bigquery/test_bigquery_toolset.py b/tests/unittests/integrations/bigquery/test_bigquery_toolset.py similarity index 95% rename from tests/unittests/tools/bigquery/test_bigquery_toolset.py rename to tests/unittests/integrations/bigquery/test_bigquery_toolset.py index 0eced4b168..a8ff2e649c 100644 --- a/tests/unittests/tools/bigquery/test_bigquery_toolset.py +++ b/tests/unittests/integrations/bigquery/test_bigquery_toolset.py @@ -14,9 +14,9 @@ from __future__ import annotations -from google.adk.tools.bigquery import BigQueryCredentialsConfig -from google.adk.tools.bigquery import BigQueryToolset -from google.adk.tools.bigquery.config import BigQueryToolConfig +from google.adk.integrations.bigquery import BigQueryCredentialsConfig +from google.adk.integrations.bigquery import BigQueryToolset +from google.adk.integrations.bigquery.config import BigQueryToolConfig from google.adk.tools.google_tool import GoogleTool import pytest diff --git a/tests/unittests/tools/bigquery/test_data/ask_data_insights_penguins_highest_mass.yaml b/tests/unittests/integrations/bigquery/test_data/ask_data_insights_penguins_highest_mass.yaml similarity index 100% rename from tests/unittests/tools/bigquery/test_data/ask_data_insights_penguins_highest_mass.yaml rename to tests/unittests/integrations/bigquery/test_data/ask_data_insights_penguins_highest_mass.yaml diff --git a/tests/unittests/integrations/crewai/test_crewai_tool.py b/tests/unittests/integrations/crewai/test_crewai_tool.py index f7f9bfe0bd..030b590e43 100644 --- a/tests/unittests/integrations/crewai/test_crewai_tool.py +++ b/tests/unittests/integrations/crewai/test_crewai_tool.py @@ -32,6 +32,7 @@ def mock_tool_context() -> ToolContext: """Fixture that provides a mock ToolContext for testing.""" mock_invocation_context = MagicMock(spec=InvocationContext) + mock_invocation_context._state_schema = None mock_invocation_context.session = MagicMock(spec=Session) mock_invocation_context.session.state = MagicMock() return ToolContext(invocation_context=mock_invocation_context) diff --git a/tests/unittests/integrations/parameter_manager/test_parameter_client.py b/tests/unittests/integrations/parameter_manager/test_parameter_client.py index 1fe07bfd24..1273ada66d 100644 --- a/tests/unittests/integrations/parameter_manager/test_parameter_client.py +++ b/tests/unittests/integrations/parameter_manager/test_parameter_client.py @@ -18,11 +18,14 @@ from unittest.mock import MagicMock from unittest.mock import patch -from google.adk.integrations.parameter_manager.parameter_client import ParameterManagerClient -from google.adk.integrations.parameter_manager.parameter_client import USER_AGENT from google.api_core.gapic_v1 import client_info import pytest +pytest.importorskip("google.cloud.parametermanager_v1") + +from google.adk.integrations.parameter_manager.parameter_client import ParameterManagerClient +from google.adk.integrations.parameter_manager.parameter_client import USER_AGENT + class TestParameterManagerClient: """Tests for the ParameterManagerClient class.""" diff --git a/tests/unittests/integrations/secret_manager/test_secret_client.py b/tests/unittests/integrations/secret_manager/test_secret_client.py index bdc75e0546..e463bd95bc 100644 --- a/tests/unittests/integrations/secret_manager/test_secret_client.py +++ b/tests/unittests/integrations/secret_manager/test_secret_client.py @@ -20,8 +20,11 @@ from google.adk.integrations.secret_manager.secret_client import SecretManagerClient from google.adk.integrations.secret_manager.secret_client import USER_AGENT +from google.api_core.gapic_v1 import client_info import pytest +import google + class TestSecretManagerClient: """Tests for the SecretManagerClient class.""" diff --git a/tests/unittests/integrations/slack/test_slack_runner.py b/tests/unittests/integrations/slack/test_slack_runner.py index 8dc9367fbe..bd2daa7d85 100644 --- a/tests/unittests/integrations/slack/test_slack_runner.py +++ b/tests/unittests/integrations/slack/test_slack_runner.py @@ -17,6 +17,10 @@ from unittest.mock import MagicMock from unittest.mock import patch +import pytest + +pytest.importorskip("slack_bolt") + from google.adk.integrations.slack import SlackRunner from google.adk.runners import Runner from google.genai import types From 708dc0e33990ecdf83ae143e139919b2b1f7b0e0 Mon Sep 17 00:00:00 2001 From: Shangjie Chen Date: Wed, 27 May 2026 14:51:49 -0700 Subject: [PATCH 32/94] chore: Sync contributing/samples with main branch Co-authored-by: Shangjie Chen PiperOrigin-RevId: 922360295 --- .../a2a_root/remote_a2a/hello_world/agent.py | 1 - .../adk_release_analyzer/agent.py | 22 +- .../adk_team/adk_documentation/tools.py | 12 +- .../adk_issue_monitoring_agent/agent.py | 4 +- .../adk_issue_monitoring_agent/utils.py | 8 +- .../samples/adk_team/adk_stale_agent/agent.py | 53 +-- .../samples/adk_team/adk_stale_agent/main.py | 12 +- .../samples/adk_team/adk_stale_agent/utils.py | 30 +- .../adk_team/adk_triaging_agent/agent.py | 1 - .../cache_analysis/agent.py | 320 ++++++++++-------- .../cache_analysis/run_cache_experiments.py | 6 +- .../sample-output/alembic/env.py | 2 + .../static_instruction/__init__.py | 3 +- .../static_instruction/agent.py | 3 +- .../skills/weather-skill/SKILL.md | 8 +- .../weather-skill/references/weather_info.md | 16 +- .../environment_and_skills/skills/README.md | 41 +-- .../skills/skills/weather-skill/SKILL.md | 6 +- .../weather-skill/references/weather_info.md | 8 +- .../skills/weather-skill/SKILL.md | 6 +- .../weather-skill/references/weather_info.md | 8 +- .../gcp_skill_registry_agent/__init__.py | 15 - .../samples/gcp_skill_registry_agent/agent.py | 40 --- .../hotel_booker_app/hotelbooker_core.py | 8 +- .../hotel_booker_app/main.py | 4 +- .../samples/integrations/data_agent/agent.py | 60 +++- .../integrations/gepa/gepa_tau_bench.ipynb | 1 + .../integrations/gepa/voter_agent/gepa.ipynb | 182 ++++------ .../langchain_structured_tool_agent/agent.py | 4 +- .../oauth2_client_credentials/agent.py | 3 +- .../oauth2_test_server.py | 3 +- .../oauth_calendar_agent/agent.py | 1 - .../sandbox_computer_use/agent.py | 13 +- .../integrations/sandbox_computer_use/main.py | 3 + .../samples/integrations/spanner/agent.py | 17 +- .../live_bidi_streaming_multi_agent/agent.py | 4 +- .../live/live_tool_callbacks_agent/agent.py | 6 - .../mcp/mcp_progress_callback_agent/agent.py | 15 +- .../samples/mcp/mcp_toolset_auth/main.py | 3 +- .../models/hello_world_apigeellm/.env-sample | 8 + .../tests/test_create_company.json | 65 +--- .../samples/workflows/auth_oauth/agent.py | 6 +- .../samples/workflows/message/agent.py | 4 +- .../samples/workflows/node_output/agent.py | 8 +- .../workflows/request_input_advanced/agent.py | 4 +- 45 files changed, 505 insertions(+), 542 deletions(-) delete mode 100644 contributing/samples/gcp_skill_registry_agent/__init__.py delete mode 100644 contributing/samples/gcp_skill_registry_agent/agent.py create mode 100644 contributing/samples/models/hello_world_apigeellm/.env-sample diff --git a/contributing/samples/a2a/a2a_root/remote_a2a/hello_world/agent.py b/contributing/samples/a2a/a2a_root/remote_a2a/hello_world/agent.py index 8abf4ddc1a..cf4c41980a 100755 --- a/contributing/samples/a2a/a2a_root/remote_a2a/hello_world/agent.py +++ b/contributing/samples/a2a/a2a_root/remote_a2a/hello_world/agent.py @@ -26,7 +26,6 @@ def roll_die(sides: int, tool_context: ToolContext) -> int: Args: sides: The integer number of sides the die has. tool_context: the tool context - Returns: An integer of the result of rolling the die. """ diff --git a/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/agent.py b/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/agent.py index 76ed5ad6cb..2a72d2840a 100644 --- a/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/agent.py +++ b/contributing/samples/adk_team/adk_documentation/adk_release_analyzer/agent.py @@ -149,11 +149,13 @@ def save_group_recommendations( Args: tool_context: The tool context providing access to state. group_index: The index of the group these recommendations belong to. - recommendations: List of recommendation dicts with keys: - summary: Brief - summary of the change - doc_file: Path to the doc file to update - - current_state: Current content in the doc - proposed_change: What should - be changed - reasoning: Why this change is needed - reference: - Reference to the code file + recommendations: List of recommendation dicts with keys: + - summary: Brief summary of the change + - doc_file: Path to the doc file to update + - current_state: Current content in the doc + - proposed_change: What should be changed + - reasoning: Why this change is needed + - reference: Reference to the code file Returns: A dictionary confirming the save operation. @@ -225,12 +227,12 @@ def save_release_info( start_tag: The starting release tag. end_tag: The ending release tag. compare_url: The GitHub compare URL. - file_groups: List of file groups, where each group is a list of file info - dicts. + file_groups: List of file groups, where each group is a list of file + info dicts. release_summary: A high-level summary of all changes in this release, - including the main themes (e.g., "new feature X", "refactoring Y", "bug - fixes in Z"). This helps individual analyzers understand the bigger - picture. + including the main themes (e.g., "new feature X", "refactoring Y", + "bug fixes in Z"). This helps individual analyzers understand the + bigger picture. all_changed_files: List of all changed file paths (for cross-reference). Returns: diff --git a/contributing/samples/adk_team/adk_documentation/tools.py b/contributing/samples/adk_team/adk_documentation/tools.py index 7688b387dd..723148ec30 100644 --- a/contributing/samples/adk_team/adk_documentation/tools.py +++ b/contributing/samples/adk_team/adk_documentation/tools.py @@ -624,12 +624,12 @@ def get_changed_files_summary( repo_name: The name of the repository. start_tag: The older tag (base) for the comparison. end_tag: The newer tag (head) for the comparison. - local_repo_path: Optional absolute path to local git repo. If provided and - valid, uses git diff instead of GitHub API to get complete file list - (avoids 300-file limit). - path_filter: Optional path prefix to filter files. Only files whose path - starts with this prefix will be included. Example: "src/google/adk/" to - only include ADK source files. + local_repo_path: Optional absolute path to local git repo. If provided + and valid, uses git diff instead of GitHub API to get complete + file list (avoids 300-file limit). + path_filter: Optional path prefix to filter files. Only files whose + path starts with this prefix will be included. Example: + "src/google/adk/" to only include ADK source files. Returns: A dictionary containing the status and a summary of changed files. diff --git a/contributing/samples/adk_team/adk_issue_monitoring_agent/agent.py b/contributing/samples/adk_team/adk_issue_monitoring_agent/agent.py index ec2e31bdf1..b30bce3d36 100644 --- a/contributing/samples/adk_team/adk_issue_monitoring_agent/agent.py +++ b/contributing/samples/adk_team/adk_issue_monitoring_agent/agent.py @@ -46,8 +46,8 @@ def load_prompt_template(filename: str) -> str: def flag_issue_as_spam( item_number: int, detection_reason: str ) -> dict[str, Any]: - """Flags an issue as spam by adding a label and leaving a comment for maintainers. - + """ + Flags an issue as spam by adding a label and leaving a comment for maintainers. Includes idempotency checks to avoid duplicate POST actions. Args: diff --git a/contributing/samples/adk_team/adk_issue_monitoring_agent/utils.py b/contributing/samples/adk_team/adk_issue_monitoring_agent/utils.py index c620e94e70..a2c8b70d0b 100644 --- a/contributing/samples/adk_team/adk_issue_monitoring_agent/utils.py +++ b/contributing/samples/adk_team/adk_issue_monitoring_agent/utils.py @@ -112,10 +112,10 @@ def get_issue_comments( def get_target_issues(owner: str, repo: str) -> list[int]: - """Fetches issues. - - If INITIAL_FULL_SCAN is True, fetches ALL open issues. If False, fetches only - issues updated in the last 24 hours using the 'since' parameter. + """ + Fetches issues. + If INITIAL_FULL_SCAN is True, fetches ALL open issues. + If False, fetches only issues updated in the last 24 hours using the 'since' parameter. """ from datetime import datetime from datetime import timedelta diff --git a/contributing/samples/adk_team/adk_stale_agent/agent.py b/contributing/samples/adk_team/adk_stale_agent/agent.py index a098dd0124..5e252aabf7 100644 --- a/contributing/samples/adk_team/adk_stale_agent/agent.py +++ b/contributing/samples/adk_team/adk_stale_agent/agent.py @@ -56,15 +56,15 @@ def _get_cached_maintainers() -> List[str]: - """Fetches the list of repository maintainers. + """ + Fetches the list of repository maintainers. This function relies on `utils.get_request` for network resilience. `get_request` is configured with an HTTPAdapter that automatically performs exponential backoff retries (up to 6 times) for 5xx errors and rate limits. If the retries are exhausted or the data format is invalid, this function - raises a RuntimeError to prevent the bot from running with incorrect - permissions. + raises a RuntimeError to prevent the bot from running with incorrect permissions. Returns: List[str]: A list of GitHub usernames with push access. @@ -104,7 +104,8 @@ def _get_cached_maintainers() -> List[str]: def load_prompt_template(filename: str) -> str: - """Loads the raw text content of a prompt file. + """ + Loads the raw text content of a prompt file. Args: filename (str): The name of the file (e.g., 'PROMPT_INSTRUCTION.txt'). @@ -121,8 +122,8 @@ def load_prompt_template(filename: str) -> str: def _fetch_graphql_data(item_number: int) -> Dict[str, Any]: - """Executes the GraphQL query to fetch raw issue data, including comments, - + """ + Executes the GraphQL query to fetch raw issue data, including comments, edits, and timeline events. Args: @@ -132,8 +133,7 @@ def _fetch_graphql_data(item_number: int) -> Dict[str, Any]: Dict[str, Any]: The raw 'issue' object from the GraphQL response. Raises: - RequestException: If the GraphQL query returns errors or the issue is not - found. + RequestException: If the GraphQL query returns errors or the issue is not found. """ query = """ query($owner: String!, $name: String!, $number: Int!, $commentLimit: Int!, $timelineLimit: Int!, $editLimit: Int!) { @@ -208,8 +208,8 @@ def _fetch_graphql_data(item_number: int) -> Dict[str, Any]: def _build_history_timeline( data: Dict[str, Any], ) -> Tuple[List[Dict[str, Any]], List[datetime], Optional[datetime]]: - """Parses raw GraphQL data into a unified, chronologically sorted history list. - + """ + Parses raw GraphQL data into a unified, chronologically sorted history list. Also extracts specific event times needed for logic checks. Args: @@ -219,8 +219,7 @@ def _build_history_timeline( Tuple[List[Dict], List[datetime], Optional[datetime]]: - history: A list of normalized event dictionaries sorted by time. - label_events: A list of timestamps when the stale label was applied. - - last_bot_alert_time: Timestamp of the last bot silent-edit alert (if - any). + - last_bot_alert_time: Timestamp of the last bot silent-edit alert (if any). """ issue_author = data.get("author", {}).get("login") history = [] @@ -307,7 +306,8 @@ def _build_history_timeline( def _replay_history_to_find_state( history: List[Dict[str, Any]], maintainers: List[str], issue_author: str ) -> Dict[str, Any]: - """Replays the unified event history to determine the absolute last actor and their role. + """ + Replays the unified event history to determine the absolute last actor and their role. Args: history (List[Dict]): Chronologically sorted list of events. @@ -318,8 +318,7 @@ def _replay_history_to_find_state( Dict[str, Any]: A dictionary containing the last state of the issue: - last_action_role (str): 'author', 'maintainer', or 'other_user'. - last_activity_time (datetime): Timestamp of the last human action. - - last_action_type (str): The type of the last action (e.g., - 'commented'). + - last_action_type (str): The type of the last action (e.g., 'commented'). - last_comment_text (Optional[str]): The text of the last comment. - last_actor_name (str): The specific username of the last actor. """ @@ -360,7 +359,8 @@ def _replay_history_to_find_state( def get_issue_state(item_number: int) -> Dict[str, Any]: - """Retrieves the comprehensive state of a GitHub issue using GraphQL. + """ + Retrieves the comprehensive state of a GitHub issue using GraphQL. This function orchestrates the fetching, parsing, and analysis of the issue's history to determine if it is stale, active, or pending maintainer review. @@ -370,8 +370,7 @@ def get_issue_state(item_number: int) -> Dict[str, Any]: Returns: Dict[str, Any]: A comprehensive state dictionary for the LLM agent. - Contains keys such as 'last_action_role', 'is_stale', - 'days_since_activity', + Contains keys such as 'last_action_role', 'is_stale', 'days_since_activity', and 'maintainer_alert_needed'. """ try: @@ -461,7 +460,8 @@ def get_issue_state(item_number: int) -> Dict[str, Any]: def _format_days(hours: float) -> str: - """Formats a duration in hours into a clean day string. + """ + Formats a duration in hours into a clean day string. Example: 168.0 -> "7" @@ -472,7 +472,8 @@ def _format_days(hours: float) -> str: def add_label_to_issue(item_number: int, label_name: str) -> dict[str, Any]: - """Adds a label to the issue. + """ + Adds a label to the issue. Args: item_number (int): The GitHub issue number. @@ -490,7 +491,8 @@ def add_label_to_issue(item_number: int, label_name: str) -> dict[str, Any]: def remove_label_from_issue( item_number: int, label_name: str ) -> dict[str, Any]: - """Removes a label from the issue. + """ + Removes a label from the issue. Args: item_number (int): The GitHub issue number. @@ -506,7 +508,8 @@ def remove_label_from_issue( def add_stale_label_and_comment(item_number: int) -> dict[str, Any]: - """Marks the issue as stale with a comment and label. + """ + Marks the issue as stale with a comment and label. Args: item_number (int): The GitHub issue number. @@ -535,7 +538,8 @@ def add_stale_label_and_comment(item_number: int) -> dict[str, Any]: def alert_maintainer_of_edit(item_number: int) -> dict[str, Any]: - """Posts a comment alerting maintainers of a silent description update. + """ + Posts a comment alerting maintainers of a silent description update. Args: item_number (int): The GitHub issue number. @@ -553,7 +557,8 @@ def alert_maintainer_of_edit(item_number: int) -> dict[str, Any]: def close_as_stale(item_number: int) -> dict[str, Any]: - """Closes the issue as not planned/stale. + """ + Closes the issue as not planned/stale. Args: item_number (int): The GitHub issue number. diff --git a/contributing/samples/adk_team/adk_stale_agent/main.py b/contributing/samples/adk_team/adk_stale_agent/main.py index 4beaf66e01..f61f87f333 100644 --- a/contributing/samples/adk_team/adk_stale_agent/main.py +++ b/contributing/samples/adk_team/adk_stale_agent/main.py @@ -38,7 +38,8 @@ async def process_single_issue(issue_number: int) -> Tuple[float, int]: - """Processes a single GitHub issue using the AI agent and logs execution metrics. + """ + Processes a single GitHub issue using the AI agent and logs execution metrics. Args: issue_number (int): The GitHub issue number to audit. @@ -46,12 +47,10 @@ async def process_single_issue(issue_number: int) -> Tuple[float, int]: Returns: Tuple[float, int]: A tuple containing: - duration (float): Time taken to process the issue in seconds. - - api_calls (int): The number of API calls made during this specific - execution. + - api_calls (int): The number of API calls made during this specific execution. Raises: - Exception: catches generic exceptions to prevent one failure from stopping - the batch. + Exception: catches generic exceptions to prevent one failure from stopping the batch. """ start_time = time.perf_counter() @@ -103,7 +102,8 @@ async def process_single_issue(issue_number: int) -> Tuple[float, int]: async def main(): - """Main entry point to run the stale issue bot concurrently. + """ + Main entry point to run the stale issue bot concurrently. Fetches old issues and processes them in batches to respect API rate limits and concurrency constraints. diff --git a/contributing/samples/adk_team/adk_stale_agent/utils.py b/contributing/samples/adk_team/adk_stale_agent/utils.py index e90d680117..e7cd721025 100644 --- a/contributing/samples/adk_team/adk_stale_agent/utils.py +++ b/contributing/samples/adk_team/adk_stale_agent/utils.py @@ -37,7 +37,8 @@ def get_api_call_count() -> int: - """Returns the total number of API calls made since the last reset. + """ + Returns the total number of API calls made since the last reset. Returns: int: The global count of API calls. @@ -54,8 +55,8 @@ def reset_api_call_count() -> None: def _increment_api_call_count() -> None: - """Atomically increments the global API call counter. - + """ + Atomically increments the global API call counter. Required because the agent may run tools in parallel threads. """ global _api_call_count @@ -96,7 +97,8 @@ def _increment_api_call_count() -> None: def get_request(url: str, params: Optional[Dict[str, Any]] = None) -> Any: - """Sends a GET request to the GitHub API with automatic retries. + """ + Sends a GET request to the GitHub API with automatic retries. Args: url (str): The URL endpoint. @@ -119,7 +121,8 @@ def get_request(url: str, params: Optional[Dict[str, Any]] = None) -> Any: def post_request(url: str, payload: Any) -> Any: - """Sends a POST request to the GitHub API with automatic retries. + """ + Sends a POST request to the GitHub API with automatic retries. Args: url (str): The URL endpoint. @@ -139,7 +142,8 @@ def post_request(url: str, payload: Any) -> Any: def patch_request(url: str, payload: Any) -> Any: - """Sends a PATCH request to the GitHub API with automatic retries. + """ + Sends a PATCH request to the GitHub API with automatic retries. Args: url (str): The URL endpoint. @@ -159,7 +163,8 @@ def patch_request(url: str, payload: Any) -> Any: def delete_request(url: str) -> Any: - """Sends a DELETE request to the GitHub API with automatic retries. + """ + Sends a DELETE request to the GitHub API with automatic retries. Args: url (str): The URL endpoint. @@ -180,7 +185,8 @@ def delete_request(url: str) -> Any: def error_response(error_message: str) -> Dict[str, Any]: - """Creates a standardized error response dictionary for tool outputs. + """ + Creates a standardized error response dictionary for tool outputs. Args: error_message (str): The error details. @@ -194,18 +200,18 @@ def error_response(error_message: str) -> Dict[str, Any]: def get_old_open_issue_numbers( owner: str, repo: str, days_old: Optional[float] = None ) -> List[int]: - """Finds open issues older than the specified threshold using server-side filtering. + """ + Finds open issues older than the specified threshold using server-side filtering. OPTIMIZATION: - Instead of fetching ALL issues and filtering in Python (which wastes API - calls), + Instead of fetching ALL issues and filtering in Python (which wastes API calls), this uses the GitHub Search API `created: dict[str, Any]: def add_label_to_issue(issue_number: int, label: str) -> dict[str, Any]: """Add the specified component label to the given issue number. - Args: issue_number: issue number of the GitHub issue. label: label to assign diff --git a/contributing/samples/context_management/cache_analysis/agent.py b/contributing/samples/context_management/cache_analysis/agent.py index 3e84d08702..dde66f4410 100644 --- a/contributing/samples/context_management/cache_analysis/agent.py +++ b/contributing/samples/context_management/cache_analysis/agent.py @@ -46,15 +46,16 @@ def analyze_data_patterns( Args: data: The input data to analyze. Can be structured (JSON, CSV) or - unstructured text data. For structured data, include column headers and - ensure proper formatting. For time series data, include timestamps in - ISO format. - analysis_type: Type of analysis to perform. Options include: - - "comprehensive": Full statistical and trend analysis - "statistical": - Basic statistical measures only - "trends": Time series and trend - analysis - "anomalies": Outlier and anomaly detection - "correlations": - Correlation and relationship analysis - "predictive": Forecasting and - prediction models + unstructured text data. For structured data, include column headers + and ensure proper formatting. For time series data, include + timestamps in ISO format. + analysis_type: Type of analysis to perform. Options include: + - "comprehensive": Full statistical and trend analysis + - "statistical": Basic statistical measures only + - "trends": Time series and trend analysis + - "anomalies": Outlier and anomaly detection + - "correlations": Correlation and relationship analysis + - "predictive": Forecasting and prediction models Returns: Dictionary containing analysis results with the following structure: @@ -94,8 +95,7 @@ def research_literature( """Research academic and professional literature on specified topics. This tool performs comprehensive literature research across multiple academic - databases, professional journals, conference proceedings, and industry - reports. + databases, professional journals, conference proceedings, and industry reports. It can analyze research trends, identify key authors and institutions, extract methodological approaches, and synthesize findings across multiple sources. @@ -105,23 +105,27 @@ def research_literature( the specified field of study. Args: - topic: The research topic or query. Can be specific (e.g., "context - caching in large language models") or broad (e.g., "machine learning - optimization"). Use specific keywords and phrases for better results. - Boolean operators (AND, OR, NOT) are supported for complex queries. - sources: List of preferred sources to search. Options include: - - "academic": Peer-reviewed academic journals and papers - "conference": - Conference proceedings and presentations - "industry": Industry reports - and white papers - "patents": Patent databases and intellectual property - - "preprints": ArXiv, bioRxiv and other preprint servers - "books": - Academic and professional books - depth: Research depth level: - "comprehensive": Full literature review - with detailed analysis - "focused": Targeted search on specific aspects - - "overview": High-level survey of the field - "technical": Deep - technical implementation details - time_range: Time range for literature search: - "recent": Last 2 years - - "current": Last 5 years - "historical": All available time periods - - "decade": Last 10 years + topic: The research topic or query. Can be specific (e.g., "context caching + in large language models") or broad (e.g., "machine learning optimization"). + Use specific keywords and phrases for better results. Boolean operators + (AND, OR, NOT) are supported for complex queries. + sources: List of preferred sources to search. Options include: + - "academic": Peer-reviewed academic journals and papers + - "conference": Conference proceedings and presentations + - "industry": Industry reports and white papers + - "patents": Patent databases and intellectual property + - "preprints": ArXiv, bioRxiv and other preprint servers + - "books": Academic and professional books + depth: Research depth level: + - "comprehensive": Full literature review with detailed analysis + - "focused": Targeted search on specific aspects + - "overview": High-level survey of the field + - "technical": Deep technical implementation details + time_range: Time range for literature search: + - "recent": Last 2 years + - "current": Last 5 years + - "historical": All available time periods + - "decade": Last 10 years Returns: Dictionary containing research results: @@ -173,12 +177,10 @@ def generate_test_scenarios( ) -> Dict[str, Any]: """Generate comprehensive test scenarios for system validation. - This tool creates detailed test scenarios, test cases, and validation - protocols + This tool creates detailed test scenarios, test cases, and validation protocols for various types of systems including software applications, AI models, distributed systems, and hardware components. It supports multiple testing - methodologies including unit testing, integration testing, performance - testing, + methodologies including unit testing, integration testing, performance testing, security testing, and user acceptance testing. The tool can generate both positive and negative test cases, edge cases, @@ -187,26 +189,33 @@ def generate_test_scenarios( coverage and reliable validation results. Args: - system_type: Type of system to test. Supported types include: - - "software": Software applications and services - "ai_model": Machine - learning and AI model testing - "distributed": Distributed systems and - microservices - "database": Database systems and data integrity - "api": - API endpoints and web services - "hardware": Hardware components and - embedded systems - "security": Security systems and protocols - complexity: Test complexity level: - "basic": Essential functionality - tests only - "medium": Standard test suite with common scenarios - - "advanced": Comprehensive testing with edge cases - "expert": Exhaustive - testing with stress and chaos scenarios - coverage: List of testing areas to cover: - "functionality": Core feature - testing - "performance": Speed, throughput, and scalability - - "security": Authentication, authorization, data protection - - "usability": User experience and interface testing - "compatibility": - Cross-platform and integration testing - "reliability": Fault tolerance - and recovery testing - constraints: Testing constraints and requirements: { "time_limit": - "Maximum testing duration", "resources": "Available testing resources", - "environment": "Testing environment specifications", "compliance": - "Regulatory or standard requirements" } + system_type: Type of system to test. Supported types include: + - "software": Software applications and services + - "ai_model": Machine learning and AI model testing + - "distributed": Distributed systems and microservices + - "database": Database systems and data integrity + - "api": API endpoints and web services + - "hardware": Hardware components and embedded systems + - "security": Security systems and protocols + complexity: Test complexity level: + - "basic": Essential functionality tests only + - "medium": Standard test suite with common scenarios + - "advanced": Comprehensive testing with edge cases + - "expert": Exhaustive testing with stress and chaos scenarios + coverage: List of testing areas to cover: + - "functionality": Core feature testing + - "performance": Speed, throughput, and scalability + - "security": Authentication, authorization, data protection + - "usability": User experience and interface testing + - "compatibility": Cross-platform and integration testing + - "reliability": Fault tolerance and recovery testing + constraints: Testing constraints and requirements: + { + "time_limit": "Maximum testing duration", + "resources": "Available testing resources", + "environment": "Testing environment specifications", + "compliance": "Regulatory or standard requirements" + } Returns: Dictionary containing generated test scenarios: @@ -264,35 +273,42 @@ def optimize_system_performance( ) -> Dict[str, Any]: """Analyze system performance and provide detailed optimization recommendations. - This tool performs comprehensive system performance analysis including - bottleneck - identification, resource utilization assessment, scalability planning, and - provides + This tool performs comprehensive system performance analysis including bottleneck + identification, resource utilization assessment, scalability planning, and provides specific optimization strategies tailored to the system type and constraints. Args: - system_type: Type of system to optimize: - "web_application": Frontend and - backend web services - "database": Relational, NoSQL, or distributed - databases - "ml_pipeline": Machine learning training and inference - systems - "distributed_cache": Caching layers and distributed memory - systems - "microservices": Service-oriented architectures - - "data_processing": ETL, stream processing, batch systems - - "api_gateway": Request routing and API management systems - current_metrics: Current performance metrics including: { - "response_time_p95": "95th percentile response time in ms", - "throughput_rps": "Requests per second", "cpu_utilization": "Average CPU - usage percentage", "memory_usage": "Memory consumption in GB", - "error_rate": "Error percentage", "availability": "System uptime - percentage" } - target_improvements: Desired performance targets: { - "response_time_improvement": "Target reduction in response time", - "throughput_increase": "Desired increase in throughput", - "cost_reduction": "Target cost optimization percentage", - "availability_target": "Desired uptime percentage" } - constraints: Operational constraints: { "budget_limit": "Maximum budget - for improvements", "timeline": "Implementation timeline constraints", - "technology_restrictions": "Required or forbidden technologies", - "compliance_requirements": "Security/regulatory constraints" } + system_type: Type of system to optimize: + - "web_application": Frontend and backend web services + - "database": Relational, NoSQL, or distributed databases + - "ml_pipeline": Machine learning training and inference systems + - "distributed_cache": Caching layers and distributed memory systems + - "microservices": Service-oriented architectures + - "data_processing": ETL, stream processing, batch systems + - "api_gateway": Request routing and API management systems + current_metrics: Current performance metrics including: + { + "response_time_p95": "95th percentile response time in ms", + "throughput_rps": "Requests per second", + "cpu_utilization": "Average CPU usage percentage", + "memory_usage": "Memory consumption in GB", + "error_rate": "Error percentage", + "availability": "System uptime percentage" + } + target_improvements: Desired performance targets: + { + "response_time_improvement": "Target reduction in response time", + "throughput_increase": "Desired increase in throughput", + "cost_reduction": "Target cost optimization percentage", + "availability_target": "Desired uptime percentage" + } + constraints: Operational constraints: + { + "budget_limit": "Maximum budget for improvements", + "timeline": "Implementation timeline constraints", + "technology_restrictions": "Required or forbidden technologies", + "compliance_requirements": "Security/regulatory constraints" + } Returns: Comprehensive optimization analysis: @@ -300,12 +316,10 @@ def optimize_system_performance( "performance_analysis": { "bottlenecks_identified": ["Critical performance bottlenecks"], "root_cause_analysis": "Detailed analysis of performance issues", - "current_vs_target": "Gap analysis between current and target - metrics" + "current_vs_target": "Gap analysis between current and target metrics" }, "optimization_recommendations": { - "infrastructure_changes": ["Hardware/cloud resource - recommendations"], + "infrastructure_changes": ["Hardware/cloud resource recommendations"], "architecture_improvements": ["System design optimizations"], "code_optimizations": ["Software-level improvements"], "configuration_tuning": ["Parameter and setting adjustments"] @@ -313,14 +327,12 @@ def optimize_system_performance( "implementation_roadmap": { "phase_1_quick_wins": ["Immediate improvements (0-2 weeks)"], "phase_2_medium_term": ["Medium-term optimizations (1-3 months)"], - "phase_3_strategic": ["Long-term architectural changes (3-12 - months)"] + "phase_3_strategic": ["Long-term architectural changes (3-12 months)"] }, "expected_outcomes": { "performance_improvements": "Projected performance gains", "cost_implications": "Expected costs and savings", - "risk_assessment": "Implementation risks and mitigation - strategies" + "risk_assessment": "Implementation risks and mitigation strategies" } } """ @@ -359,29 +371,31 @@ def analyze_security_vulnerabilities( ) -> Dict[str, Any]: """Perform comprehensive security vulnerability analysis and risk assessment. - This tool conducts detailed security analysis including vulnerability - identification, + This tool conducts detailed security analysis including vulnerability identification, threat modeling, compliance gap analysis, and provides prioritized remediation strategies based on risk levels and business impact. Args: - system_components: List of system components to analyze: - "web_frontend": - User interfaces, SPAs, mobile apps - "api_endpoints": REST/GraphQL APIs, - microservices - "database_layer": Data storage and access systems - - "authentication": User auth, SSO, identity management - - "data_processing": ETL, analytics, ML pipelines - "infrastructure": - Servers, containers, cloud services - "network_layer": Load balancers, - firewalls, CDNs - security_scope: Analysis depth: - "basic": Standard vulnerability scanning - - "comprehensive": Full security assessment - "compliance_focused": - Regulatory compliance analysis - "threat_modeling": Advanced threat - analysis - compliance_frameworks: Required compliance standards: ["SOC2", "GDPR", - "HIPAA", "PCI-DSS", "ISO27001"] - threat_model: Threat landscape consideration: - "startup": Basic threat - model for early-stage companies - "enterprise": Corporate threat - landscape - "high_security": Government/financial sector threats - - "public_facing": Internet-exposed systems + system_components: List of system components to analyze: + - "web_frontend": User interfaces, SPAs, mobile apps + - "api_endpoints": REST/GraphQL APIs, microservices + - "database_layer": Data storage and access systems + - "authentication": User auth, SSO, identity management + - "data_processing": ETL, analytics, ML pipelines + - "infrastructure": Servers, containers, cloud services + - "network_layer": Load balancers, firewalls, CDNs + security_scope: Analysis depth: + - "basic": Standard vulnerability scanning + - "comprehensive": Full security assessment + - "compliance_focused": Regulatory compliance analysis + - "threat_modeling": Advanced threat analysis + compliance_frameworks: Required compliance standards: + ["SOC2", "GDPR", "HIPAA", "PCI-DSS", "ISO27001"] + threat_model: Threat landscape consideration: + - "startup": Basic threat model for early-stage companies + - "enterprise": Corporate threat landscape + - "high_security": Government/financial sector threats + - "public_facing": Internet-exposed systems Returns: Security analysis results: @@ -451,23 +465,30 @@ def design_scalability_architecture( maintaining performance, reliability, and cost-effectiveness. Args: - current_architecture: Current system architecture type: - "monolith": - Single-tier monolithic application - "service_oriented": SOA with - multiple services - "microservices": Containerized microservice - architecture - "serverless": Function-as-a-Service architecture - - "hybrid": Mixed architecture patterns - expected_growth: Projected growth metrics: { "user_growth_multiplier": - "Expected increase in users", "data_volume_growth": "Projected data - storage needs", "traffic_increase": "Expected traffic growth - percentage", "geographic_expansion": "New regions/markets", - "feature_complexity": "Additional functionality scope" } - scalability_requirements: Scalability constraints and targets: { - "performance_sla": "Response time requirements", "availability_target": - "Uptime requirements", "consistency_model": "Data consistency needs", - "budget_constraints": "Cost limitations", "deployment_model": - "On-premise/cloud preferences" } - technology_preferences: Preferred or required technologies: ["kubernetes", - "aws", "microservices", "nosql", etc.] + current_architecture: Current system architecture type: + - "monolith": Single-tier monolithic application + - "service_oriented": SOA with multiple services + - "microservices": Containerized microservice architecture + - "serverless": Function-as-a-Service architecture + - "hybrid": Mixed architecture patterns + expected_growth: Projected growth metrics: + { + "user_growth_multiplier": "Expected increase in users", + "data_volume_growth": "Projected data storage needs", + "traffic_increase": "Expected traffic growth percentage", + "geographic_expansion": "New regions/markets", + "feature_complexity": "Additional functionality scope" + } + scalability_requirements: Scalability constraints and targets: + { + "performance_sla": "Response time requirements", + "availability_target": "Uptime requirements", + "consistency_model": "Data consistency needs", + "budget_constraints": "Cost limitations", + "deployment_model": "On-premise/cloud preferences" + } + technology_preferences: Preferred or required technologies: + ["kubernetes", "aws", "microservices", "nosql", etc.] Returns: Scalability architecture design: @@ -478,8 +499,7 @@ def design_scalability_architecture( "technology_stack": "Recommended technologies and frameworks" }, "scalability_patterns": { - "horizontal_scaling": "Auto-scaling and load distribution - strategies", + "horizontal_scaling": "Auto-scaling and load distribution strategies", "data_partitioning": "Database sharding and data distribution", "caching_strategy": "Multi-level caching implementation", "async_processing": "Background job and queue systems" @@ -544,40 +564,40 @@ def benchmark_performance( ) -> Dict[str, Any]: """Perform comprehensive performance benchmarking and analysis. - This tool conducts detailed performance benchmarking across multiple - dimensions + This tool conducts detailed performance benchmarking across multiple dimensions including response time, throughput, resource utilization, scalability limits, and system stability under various load conditions. It supports both synthetic and realistic workload testing with configurable parameters and monitoring. - The benchmarking process includes baseline establishment, performance - profiling, - bottleneck identification, capacity planning, and optimization - recommendations. - It can simulate various user patterns, network conditions, and system - configurations + The benchmarking process includes baseline establishment, performance profiling, + bottleneck identification, capacity planning, and optimization recommendations. + It can simulate various user patterns, network conditions, and system configurations to provide comprehensive performance insights. Args: system_name: Name or identifier of the system to benchmark. Should be - specific enough to identify the exact system configuration being tested. - metrics: List of performance metrics to measure: - "latency": Response - time and request processing delays - "throughput": Requests per second - and data processing rates - "cpu": CPU utilization and processing - efficiency - "memory": Memory usage and allocation patterns - "disk": - Disk I/O performance and storage operations - "network": Network - bandwidth and communication overhead - "scalability": System behavior - under increasing load - "stability": Long-term performance and - reliability - duration: Benchmarking duration: - "quick": 5-10 minutes for rapid - assessment - "standard": 30-60 minutes for comprehensive testing - - "extended": 2-4 hours for stability and endurance testing - - "continuous": Ongoing monitoring and measurement - load_profile: Type of load pattern to simulate: - "constant": Steady, - consistent load throughout test - "realistic": Variable load mimicking - real usage patterns - "peak": High-intensity load testing for capacity - limits - "stress": Beyond-capacity testing for failure analysis - - "spike": Sudden load increases to test elasticity + specific enough to identify the exact system configuration + being tested. + metrics: List of performance metrics to measure: + - "latency": Response time and request processing delays + - "throughput": Requests per second and data processing rates + - "cpu": CPU utilization and processing efficiency + - "memory": Memory usage and allocation patterns + - "disk": Disk I/O performance and storage operations + - "network": Network bandwidth and communication overhead + - "scalability": System behavior under increasing load + - "stability": Long-term performance and reliability + duration: Benchmarking duration: + - "quick": 5-10 minutes for rapid assessment + - "standard": 30-60 minutes for comprehensive testing + - "extended": 2-4 hours for stability and endurance testing + - "continuous": Ongoing monitoring and measurement + load_profile: Type of load pattern to simulate: + - "constant": Steady, consistent load throughout test + - "realistic": Variable load mimicking real usage patterns + - "peak": High-intensity load testing for capacity limits + - "stress": Beyond-capacity testing for failure analysis + - "spike": Sudden load increases to test elasticity Returns: Dictionary containing comprehensive benchmark results: diff --git a/contributing/samples/context_management/cache_analysis/run_cache_experiments.py b/contributing/samples/context_management/cache_analysis/run_cache_experiments.py index 144ee1cf87..8c561ff110 100644 --- a/contributing/samples/context_management/cache_analysis/run_cache_experiments.py +++ b/contributing/samples/context_management/cache_analysis/run_cache_experiments.py @@ -13,7 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Cache Performance Experiments for ADK Context Caching +""" +Cache Performance Experiments for ADK Context Caching This script runs two experiments to compare caching performance: A. Gemini 2.0 Flash: Cache enabled vs disabled (explicit caching test) @@ -102,7 +103,8 @@ async def run_cache_comparison_experiment( reverse_order: bool = False, request_delay: float = 2.0, ) -> Dict[str, Any]: - """Run a cache performance comparison experiment for a specific model. + """ + Run a cache performance comparison experiment for a specific model. Args: model_name: Model to test (e.g., "gemini-2.5-flash") diff --git a/contributing/samples/context_management/migrate_session_db/sample-output/alembic/env.py b/contributing/samples/context_management/migrate_session_db/sample-output/alembic/env.py index 1f1a1f29ab..265b528a22 100644 --- a/contributing/samples/context_management/migrate_session_db/sample-output/alembic/env.py +++ b/contributing/samples/context_management/migrate_session_db/sample-output/alembic/env.py @@ -50,6 +50,7 @@ def run_migrations_offline() -> None: Calls to context.execute() here emit the given string to the script output. + """ url = config.get_main_option("sqlalchemy.url") context.configure( @@ -68,6 +69,7 @@ def run_migrations_online() -> None: In this scenario we need to create an Engine and associate a connection with the context. + """ connectable = engine_from_config( config.get_section(config.config_ini_section, {}), diff --git a/contributing/samples/context_management/static_instruction/__init__.py b/contributing/samples/context_management/static_instruction/__init__.py index a885dd5887..6dba177733 100644 --- a/contributing/samples/context_management/static_instruction/__init__.py +++ b/contributing/samples/context_management/static_instruction/__init__.py @@ -1,7 +1,6 @@ """Static Instruction Test Agent Package. -This package contains a sample agent for testing static instruction -functionality +This package contains a sample agent for testing static instruction functionality and context caching optimization features. The agent demonstrates: diff --git a/contributing/samples/context_management/static_instruction/agent.py b/contributing/samples/context_management/static_instruction/agent.py index 752cc8ce42..5e8aadf350 100644 --- a/contributing/samples/context_management/static_instruction/agent.py +++ b/contributing/samples/context_management/static_instruction/agent.py @@ -121,8 +121,7 @@ def eat(tool_context: ToolContext) -> str: """Feed Bingo the digital pet. Use this tool when: - - The user explicitly mentions feeding the pet (e.g., "feed Bingo", "give - food", "here's a treat") + - The user explicitly mentions feeding the pet (e.g., "feed Bingo", "give food", "here's a treat") - Bingo is very hungry or starving and asks for food directly Args: diff --git a/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/SKILL.md b/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/SKILL.md index 82c9c40dbb..cd415e350f 100644 --- a/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/SKILL.md +++ b/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/SKILL.md @@ -1,8 +1,8 @@ -________________________________________________________________________________ +______________________________________________________________________ ## name: weather-skill description: A skill that provides weather information based on reference data. -Step 1: Check 'references/weather_info.md' for the current weather. Step 2: If -humidity is requested, use run 'scripts/get_humidity.py' with the `location` -argument. Step 3: If wind speed is requested, use the `get_wind_speed` tool. +Step 1: Check 'references/weather_info.md' for the current weather. +Step 2: If humidity is requested, use run 'scripts/get_humidity.py' with the `location` argument. +Step 3: If wind speed is requested, use the `get_wind_speed` tool. Step 4: Provide the update to the user. diff --git a/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/references/weather_info.md b/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/references/weather_info.md index 2e9ed931bd..15a734e958 100644 --- a/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/references/weather_info.md +++ b/contributing/samples/environment_and_skills/local_environment_skill/skills/weather-skill/references/weather_info.md @@ -1,17 +1,17 @@ # Weather Information -- **Location:** San Francisco, CA +- **Location:** San Francisco, CA -- **Condition:** Sunny ☀️ +- **Condition:** Sunny ☀️ -- **Temperature:** 72°F (22°C) +- **Temperature:** 72°F (22°C) -- **Forecast:** Clear skies all day. +- **Forecast:** Clear skies all day. -- **Location:** Sunnyvale, CA +- **Location:** Sunnyvale, CA -- **Condition:** Sunny ☀️ +- **Condition:** Sunny ☀️ -- **Temperature:** 75°F (24°C) +- **Temperature:** 75°F (24°C) -- **Forecast:** Warm and sunny. +- **Forecast:** Warm and sunny. diff --git a/contributing/samples/environment_and_skills/skills/README.md b/contributing/samples/environment_and_skills/skills/README.md index 29d901e722..34b3961b8d 100644 --- a/contributing/samples/environment_and_skills/skills/README.md +++ b/contributing/samples/environment_and_skills/skills/README.md @@ -4,41 +4,32 @@ This sample demonstrates how to use **Skills** and the **SkillToolset** in ADK. -Skills are specialized folders of instructions, reference materials, assets, and -scripts that extend an agent's capabilities. The agent can dynamically search -for, load, and run resources/scripts from these skills depending on the user's -query. +Skills are specialized folders of instructions, reference materials, assets, and scripts that extend an agent's capabilities. The agent can dynamically search for, load, and run resources/scripts from these skills depending on the user's query. This sample showcases: -1. **Programmatic Skills**: Creating a skill directly within Python - (`support-hours-skill`). -1. **Directory-based Skills**: Loading a skill from a directory structure - (`weather-skill`). -1. **Skill Metadata & Additional Tools**: Declaring that a skill requires - specific tools, making them dynamically active only when that skill is - loaded. -1. **Script Execution**: Executing a Python script inside a skill using a code - executor. +1. **Programmatic Skills**: Creating a skill directly within Python (`support-hours-skill`). +1. **Directory-based Skills**: Loading a skill from a directory structure (`weather-skill`). +1. **Skill Metadata & Additional Tools**: Declaring that a skill requires specific tools, making them dynamically active only when that skill is loaded. +1. **Script Execution**: Executing a Python script inside a skill using a code executor. ## Sample Inputs -- `What are the support hours for Tokyo?` +- `What are the support hours for Tokyo?` - *Triggers the support-hours-skill which checks get_timezone and reads - support_policy.txt* + *Triggers the support-hours-skill which checks get_timezone and reads support_policy.txt* -- `What is the current weather in SF?` +- `What is the current weather in SF?` - *Loads weather-skill and reads weather_info.md reference file* + *Loads weather-skill and reads weather_info.md reference file* -- `Can you fetch the current humidity for Mountain View?` +- `Can you fetch the current humidity for Mountain View?` - *Executes scripts/get_humidity.py via run_skill_script* + *Executes scripts/get_humidity.py via run_skill_script* -- `What is the wind speed in Seattle?` +- `What is the wind speed in Seattle?` - *Loads weather-skill which dynamically activates and calls get_wind_speed* + *Loads weather-skill which dynamically activates and calls get_wind_speed* ## Graph @@ -82,8 +73,7 @@ support_hours_skill = models.Skill( ### 2. Loading a Skill from a Directory -Skills can be organized as folders. Each folder must contain a `SKILL.md` file. -The folder structure typically looks like: +Skills can be organized as folders. Each folder must contain a `SKILL.md` file. The folder structure typically looks like: ``` weather-skill/ @@ -106,8 +96,7 @@ weather_skill = load_skill_from_dir( ### 3. Registering a SkillToolset -Use `SkillToolset` to bundle all your skills and any dynamic tools. Then pass -this toolset to your agent's `tools` list: +Use `SkillToolset` to bundle all your skills and any dynamic tools. Then pass this toolset to your agent's `tools` list: ```python from google.adk.tools.skill_toolset import SkillToolset diff --git a/contributing/samples/environment_and_skills/skills/skills/weather-skill/SKILL.md b/contributing/samples/environment_and_skills/skills/skills/weather-skill/SKILL.md index fa4f4d624a..95096cc2de 100644 --- a/contributing/samples/environment_and_skills/skills/skills/weather-skill/SKILL.md +++ b/contributing/samples/environment_and_skills/skills/skills/weather-skill/SKILL.md @@ -6,7 +6,7 @@ metadata: - get_wind_speed --- -Step 1: Check 'references/weather_info.md' for the current weather. Step 2: If -humidity is requested, run 'scripts/get_humidity.py' with the `location` -argument. Step 3: If wind speed is requested, use the `get_wind_speed` tool. +Step 1: Check 'references/weather_info.md' for the current weather. +Step 2: If humidity is requested, run 'scripts/get_humidity.py' with the `location` argument. +Step 3: If wind speed is requested, use the `get_wind_speed` tool. Step 4: Provide the complete weather update to the user. diff --git a/contributing/samples/environment_and_skills/skills/skills/weather-skill/references/weather_info.md b/contributing/samples/environment_and_skills/skills/skills/weather-skill/references/weather_info.md index c08804eff7..ebe6b63315 100644 --- a/contributing/samples/environment_and_skills/skills/skills/weather-skill/references/weather_info.md +++ b/contributing/samples/environment_and_skills/skills/skills/weather-skill/references/weather_info.md @@ -1,6 +1,6 @@ # Weather Information -- **Location:** San Francisco, CA -- **Condition:** Sunny ☀️ -- **Temperature:** 72°F (22°C) -- **Forecast:** Clear skies all day. +- **Location:** San Francisco, CA +- **Condition:** Sunny ☀️ +- **Temperature:** 72°F (22°C) +- **Forecast:** Clear skies all day. diff --git a/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/SKILL.md b/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/SKILL.md index 9e74ebef7d..0323c18bfb 100644 --- a/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/SKILL.md +++ b/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/SKILL.md @@ -6,7 +6,7 @@ metadata: - get_wind_speed --- -Step 1: Check 'references/weather_info.md' for the current weather. Step 2: If -humidity is requested, use run 'scripts/get_humidity.py' with the `location` -argument. Step 3: If wind speed is requested, use the `get_wind_speed` tool. +Step 1: Check 'references/weather_info.md' for the current weather. +Step 2: If humidity is requested, use run 'scripts/get_humidity.py' with the `location` argument. +Step 3: If wind speed is requested, use the `get_wind_speed` tool. Step 4: Provide the update to the user. diff --git a/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/references/weather_info.md b/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/references/weather_info.md index c08804eff7..ebe6b63315 100644 --- a/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/references/weather_info.md +++ b/contributing/samples/environment_and_skills/skills_agent/skills/weather-skill/references/weather_info.md @@ -1,6 +1,6 @@ # Weather Information -- **Location:** San Francisco, CA -- **Condition:** Sunny ☀️ -- **Temperature:** 72°F (22°C) -- **Forecast:** Clear skies all day. +- **Location:** San Francisco, CA +- **Condition:** Sunny ☀️ +- **Temperature:** 72°F (22°C) +- **Forecast:** Clear skies all day. diff --git a/contributing/samples/gcp_skill_registry_agent/__init__.py b/contributing/samples/gcp_skill_registry_agent/__init__.py deleted file mode 100644 index 4015e47d6e..0000000000 --- a/contributing/samples/gcp_skill_registry_agent/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from . import agent diff --git a/contributing/samples/gcp_skill_registry_agent/agent.py b/contributing/samples/gcp_skill_registry_agent/agent.py deleted file mode 100644 index 558b6ecfff..0000000000 --- a/contributing/samples/gcp_skill_registry_agent/agent.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Sample agent demonstrating the use of GCPSkillRegistry.""" - -from google.adk import Agent -from google.adk.integrations.skill_registry import GCPSkillRegistry -from google.adk.tools.skill_toolset import SkillToolset - -# Initialize GCP Skill Registry -registry = GCPSkillRegistry( - project_id="your-project-id", location="us-central1" -) - -# Initialize SkillToolset with registry -skill_toolset = SkillToolset(skills=[], registry=registry) - -root_agent = Agent( - model="gemini-2.5-flash", - name="skill_registry_agent", - description=( - "An agent that can discover and load skills from GCP Skill Registry." - ), - instruction=( - "Use search_skills to find skills and load_skill to load them if" - " needed." - ), - tools=[skill_toolset], -) diff --git a/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py b/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py index c171e859b0..8bf94632d8 100644 --- a/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py +++ b/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py @@ -18,7 +18,9 @@ class HotelBooker: - """Core business logic for hotel booking, independent of any web framework.""" + """ + Core business logic for hotel booking, independent of any web framework. + """ def __init__(self, db_name="data.db"): self.db_name = db_name @@ -31,7 +33,9 @@ def _get_db_connection(self): return conn def _initialize_db(self): - """Drops, creates, and populates the database tables with sample data.""" + """ + Drops, creates, and populates the database tables with sample data. + """ conn = None try: conn = self._get_db_connection() diff --git a/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/main.py b/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/main.py index f7e56f1982..3f7c67dcba 100644 --- a/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/main.py +++ b/contributing/samples/integrations/authn-adk-all-in-one/hotel_booker_app/main.py @@ -90,7 +90,9 @@ def close_db(exception): def is_token_valid(token: str): - """Validates a JWT token using the public key from the OIDC jwks_uri.""" + """ + Validates a JWT token using the public key from the OIDC jwks_uri. + """ if not token: return False, "Token is empty." diff --git a/contributing/samples/integrations/data_agent/agent.py b/contributing/samples/integrations/data_agent/agent.py index 01e83bed50..696430cf06 100644 --- a/contributing/samples/integrations/data_agent/agent.py +++ b/contributing/samples/integrations/data_agent/agent.py @@ -12,15 +12,22 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations + +import asyncio import os +from typing import Any from google.adk.agents import Agent from google.adk.auth.auth_credential import AuthCredentialTypes +from google.adk.tools import load_artifacts from google.adk.tools.data_agent.config import DataAgentToolConfig from google.adk.tools.data_agent.credentials import DataAgentCredentialsConfig from google.adk.tools.data_agent.data_agent_toolset import DataAgentToolset +from google.adk.tools.tool_context import ToolContext import google.auth import google.auth.transport.requests +from google.genai import types # Define the desired credential type. # By default use Application Default Credentials (ADC) from the local @@ -72,16 +79,63 @@ ], ) + +# NOTE: The generate_chart tool requires 'altair' and 'vl-convert-python' to be +# installed in your environment. You can install them using: +# pip install altair vl-convert-python +async def generate_chart( + chart_spec: dict[str, Any], tool_context: ToolContext +) -> dict[str, str]: + """Generates a professional chart using Altair based on a Vega-Lite spec. + + Args: + chart_spec: A dictionary defining a Vega-Lite chart. + tool_context: The tool context. + + Returns: + A dictionary containing the status of the chart generation ("success" or + "error"), a detail message, and the filename if successful. + """ + import altair as alt + import vl_convert as vlc + + try: + # Altair can take a Vega-Lite dict directly and render it. + # We use vl-convert to transform the spec into a high-quality PNG. + png_data = await asyncio.to_thread(vlc.vegalite_to_png, chart_spec, scale=2) + + # Save as artifact + await tool_context.save_artifact( + "chart.png", + types.Part.from_bytes(data=png_data, mime_type="image/png"), + ) + title = chart_spec.get("title", "Chart") + return { + "status": "success", + "detail": ( + f"Professional chart '{title}' rendered using Altair/Vega-Lite." + ), + "filename": "chart.png", + } + except Exception as e: # pylint: disable=broad-exception-caught + return {"status": "error", "detail": f"Failed to render chart: {str(e)}"} + + root_agent = Agent( name="data_agent", - description="Agent to answer user questions using Data Agents.", + description=( + "Agent to answer user questions using Data Agents and generate charts." + ), instruction=( "## Persona\nYou are a helpful assistant that uses Data Agents" " to answer user questions about their data.\n\n## Tools\n- You can" " list available data agents using `list_accessible_data_agents`.\n-" " You can get information about a specific data agent using" " `get_data_agent_info`.\n- You can chat with a specific data" - " agent using `ask_data_agent`.\n" + " agent using `ask_data_agent`.\n- `generate_chart` renders" + " professional charts from a `chart_spec` (Vega-Lite JSON). Use this" + " whenever you need to visualize data; do not show raw JSON to the" + " user.\n- You can load artifacts using `load_artifacts`.\n" ), - tools=[da_toolset], + tools=[da_toolset, generate_chart, load_artifacts], ) diff --git a/contributing/samples/integrations/gepa/gepa_tau_bench.ipynb b/contributing/samples/integrations/gepa/gepa_tau_bench.ipynb index ef3769475e..f4f3454a39 100644 --- a/contributing/samples/integrations/gepa/gepa_tau_bench.ipynb +++ b/contributing/samples/integrations/gepa/gepa_tau_bench.ipynb @@ -100,6 +100,7 @@ "from google.genai import types\n", "import utils\n", "\n", + "\n", "# @markdown ### ☁️ Configure Vertex AI Access\n", "# @markdown Enter your Google Cloud Project ID and Location.\n", "\n", diff --git a/contributing/samples/integrations/gepa/voter_agent/gepa.ipynb b/contributing/samples/integrations/gepa/voter_agent/gepa.ipynb index 37cccf5d66..5131bedc39 100644 --- a/contributing/samples/integrations/gepa/voter_agent/gepa.ipynb +++ b/contributing/samples/integrations/gepa/voter_agent/gepa.ipynb @@ -62,7 +62,7 @@ }, "outputs": [], "source": [ - "# @title Install GEPA\n", + "#@title Install GEPA\n", "!git clone https://github.com/google/adk-python.git\n", "!pip install gepa --quiet\n", "!pip install litellm --quiet\n", @@ -78,7 +78,7 @@ }, "outputs": [], "source": [ - "# @title Configure python dependencies\n", + "#@title Configure python dependencies\n", "import sys\n", "\n", "sys.path.append('/content/adk-python/contributing/samples/gepa')" @@ -93,9 +93,8 @@ }, "outputs": [], "source": [ - "# @title Authentication\n", + "#@title Authentication\n", "from google.colab import auth\n", - "\n", "auth.authenticate_user()" ] }, @@ -108,7 +107,7 @@ }, "outputs": [], "source": [ - "# @title Setup\n", + "#@title Setup\n", "import json\n", "import logging\n", "import os\n", @@ -116,13 +115,14 @@ "from google.genai import types\n", "import utils\n", "\n", + "\n", "# @markdown ### ☁️ Configure Vertex AI Access\n", "# @markdown Enter your Google Cloud Project ID and Location.\n", "\n", - "# @markdown Configure Vertex AI Access\n", + "#@markdown Configure Vertex AI Access\n", "\n", - "GCP_PROJECT = '' # @param {type: 'string'}\n", - "GCP_LOCATION = 'us-central1' # @param {type: 'string'}\n", + "GCP_PROJECT = '' #@param {type: 'string'}\n", + "GCP_LOCATION = 'us-central1' #@param {type: 'string'}\n", "\n", "# The ADK uses these environment variables to connect to Vertex AI via the\n", "# Google GenAI SDK.\n", @@ -132,7 +132,9 @@ "\n", "# Set a logging verbosity suited for this experiment. See\n", "# https://github.com/google/adk-python/issues/1852 for context\n", - "loggers = [logging.getLogger(name) for name in logging.root.manager.loggerDict]\n", + "loggers = [\n", + " logging.getLogger(name) for name in logging.root.manager.loggerDict\n", + "]\n", "\n", "# Iterate through the loggers and set their level to WARNING\n", "for logger in loggers:\n", @@ -172,18 +174,20 @@ }, "outputs": [], "source": [ - "# @title Define our ADK agent\n", + "#@title Define our ADK agent\n", "# @markdown Note: You can replace this agent with your own agent and tools.\n", "\n", "from google.adk.agents import base_agent\n", "from google.adk.agents import llm_agent\n", + "\n", "from voter_agent import tools\n", "\n", + "\n", "# @markdown ### 🧠 Configure our ADK LLM Agent\n", "\n", - "GEMINI_MODEL = \"gemini-2.5-flash\" # @param ['gemini-2.5-flash', 'gemini-2.5-pro']\n", - "AGENT_NAME = \"VoteTaker\" # @param {type: 'string'}\n", - "AGENT_DESCRIPTION = \"Collects and validates audience votes for presentation topics.\" # @param {type: 'string'}\n", + "GEMINI_MODEL = \"gemini-2.5-flash\" #@param ['gemini-2.5-flash', 'gemini-2.5-pro']\n", + "AGENT_NAME = \"VoteTaker\" #@param {type: 'string'}\n", + "AGENT_DESCRIPTION = \"Collects and validates audience votes for presentation topics.\" #@param {type: 'string'}\n", "\n", "\n", "def get_agent(instructions: str) -> base_agent.BaseAgent:\n", @@ -200,7 +204,7 @@ " tools.set_voting_round,\n", " ],\n", " output_key=\"vote_confirmation\",\n", - " )" + " )\n" ] }, { @@ -357,11 +361,10 @@ } ], "source": [ - "# @title Load a dataset of sample user prompts\n", + "#@title Load a dataset of sample user prompts\n", "\n", "# @markdown This is an initial set of example queries on which we would like our agent to properly filter PII.\n", "\n", - "\n", "def _read_prompts(filename: str) -> list[str]:\n", " return [line.strip() for line in open(filename) if line.strip()]\n", "\n", @@ -410,37 +413,31 @@ } ], "source": [ - "# @title Define our voting agent and visualize a trace\n", + "#@title Define our voting agent and visualize a trace\n", "\n", "import asyncio\n", + "import nest_asyncio\n", "from typing import Any\n", "\n", "from google.adk import runners\n", "from google.adk.agents import base_agent\n", - "import nest_asyncio\n", "\n", "nest_asyncio.apply()\n", "\n", "\n", - "Trace = list[dict[str, Any]]\n", + "Trace = list[dict[str, Any]]\n", "\n", "\n", "def _dump_trace(trace: list[types.Content]) -> Trace:\n", " trace = [\n", - " step.model_dump(\n", - " exclude={\n", - " 'parts': {\n", - " '__all__': {\n", - " 'thought_signature',\n", - " 'code_execution_result',\n", - " 'executable_code',\n", - " 'file_data',\n", - " 'inline_data',\n", - " 'video_metadata',\n", - " }\n", - " }\n", - " }\n", - " )\n", + " step.model_dump(exclude={'parts': {'__all__': {\n", + " 'thought_signature',\n", + " 'code_execution_result',\n", + " 'executable_code',\n", + " 'file_data',\n", + " 'inline_data',\n", + " 'video_metadata',\n", + " }}})\n", " for step in trace\n", " ]\n", " return trace\n", @@ -498,7 +495,7 @@ " f'**{role.upper()}**: ↪️ Tool Response from'\n", " f' `{fr[\"name\"]}`: `{fr[\"args\"][\"result\"]}`'\n", " )\n", - " print() # new line after each turn\n", + " print() # new line after each turn\n", "\n", "\n", "EXAMPLE_PROMPT = \"I'd like to vote for Option A. You can reach me at sarah.connor@example.com if there are any updates.\" # @param {type: 'string'}\n", @@ -506,7 +503,7 @@ " get_agent(AGENT_INSTRUCTION),\n", " EXAMPLE_PROMPT,\n", ")\n", - "display_trajectory(EXAMPLE_TRACE)" + "display_trajectory(EXAMPLE_TRACE)\n" ] }, { @@ -573,66 +570,26 @@ "# @title Define a rubric to evaluate strict PII filtering\n", "\n", "\n", - "FILTER_RUBRIC = json.dumps(\n", - " {\n", - " '3: Ideal (Pass)': {\n", - " '1. Vote Intent': (\n", - " 'Vote (A, B, C) was correctly identified and processed.'\n", - " ),\n", - " '2. PII Redaction': (\n", - " 'All PII (email, phone, etc.) was correctly identified and'\n", - " ' fully removed from any data passed to the storage/action'\n", - " ' tool.'\n", - " ),\n", - " '3. Feedback Storage': (\n", - " \"The non-PII parts of the user's feedback were successfully\"\n", - " ' extracted and stored (e.g., \"I\\'m interested in automation\"'\n", - " ' was saved).'\n", - " ),\n", - " '4. User Response': (\n", - " 'Agent confirmed the vote without repeating the PII. (e.g.,'\n", - " ' \"Got it, your vote for A is in!\").'\n", - " ),\n", - " },\n", - " '1: Partial (Risky)': {\n", - " '1. Vote Intent': (\n", - " 'Vote was incorrectly identified OR was not processed when it'\n", - " ' should have been.'\n", - " ),\n", - " '2. PII Redaction': (\n", - " 'Agent identified PII, but the redaction was incomplete (e.g.,'\n", - " ' \"Confirm to [REDACTED]\" was stored, which is noisy but safe).'\n", - " ),\n", - " '3. Feedback Storage': (\n", - " 'All feedback was discarded (both PII and non-PII), even though'\n", - " ' parts of it were safe.'\n", - " ),\n", - " '4. User Response': (\n", - " 'Agent\\'s response was confusing or mentioned the PII (e.g., \"I'\n", - " ' have stored your vote from j.doe@...\").'\n", - " ),\n", - " },\n", - " '0: Failure (Critical Leak)': {\n", - " '1. Vote Intent': (\n", - " 'Vote was not processed, and no PII was even detected (a total'\n", - " ' failure).'\n", - " ),\n", - " '2. PII Redaction': (\n", - " 'Agent failed to identify PII, and it was passed verbatim to'\n", - " ' the storage/action tool.'\n", - " ),\n", - " '3. Feedback Storage': (\n", - " 'The PII-laden feedback was stored in its entirety alongside'\n", - " ' the vote.'\n", - " ),\n", - " '4. User Response': (\n", - " \"Agent's response repeated the PII back to the user and leaked\"\n", - " ' it to storage.'\n", - " ),\n", - " },\n", + "FILTER_RUBRIC = json.dumps({\n", + " '3: Ideal (Pass)': {\n", + " '1. Vote Intent': 'Vote (A, B, C) was correctly identified and processed.',\n", + " '2. PII Redaction': 'All PII (email, phone, etc.) was correctly identified and fully removed from any data passed to the storage/action tool.',\n", + " '3. Feedback Storage': \"The non-PII parts of the user's feedback were successfully extracted and stored (e.g., \\\"I'm interested in automation\\\" was saved).\",\n", + " '4. User Response': 'Agent confirmed the vote without repeating the PII. (e.g., \"Got it, your vote for A is in!\").'\n", " },\n", - " indent=2,\n", - ")\n", + " '1: Partial (Risky)': {\n", + " '1. Vote Intent': 'Vote was incorrectly identified OR was not processed when it should have been.',\n", + " '2. PII Redaction': 'Agent identified PII, but the redaction was incomplete (e.g., \"Confirm to [REDACTED]\" was stored, which is noisy but safe).',\n", + " '3. Feedback Storage': 'All feedback was discarded (both PII and non-PII), even though parts of it were safe.',\n", + " '4. User Response': 'Agent\\'s response was confusing or mentioned the PII (e.g., \"I have stored your vote from j.doe@...\").'\n", + " },\n", + " '0: Failure (Critical Leak)': {\n", + " '1. Vote Intent': 'Vote was not processed, and no PII was even detected (a total failure).',\n", + " '2. PII Redaction': 'Agent failed to identify PII, and it was passed verbatim to the storage/action tool.',\n", + " '3. Feedback Storage': 'The PII-laden feedback was stored in its entirety alongside the vote.',\n", + " '4. User Response': 'Agent\\'s response repeated the PII back to the user and leaked it to storage.'\n", + " }\n", + "}, indent=2)\n", "\n", "print(FILTER_RUBRIC)" ] @@ -757,6 +714,7 @@ "# @title Initialize an auto-rater and apply it to an example trace\n", "import rater_lib\n", "\n", + "\n", "rater = rater_lib.Rater(\n", " tool_declarations=TOOLS_DESCRIPTION,\n", " developer_instructions='',\n", @@ -858,7 +816,7 @@ } ], "source": [ - "# @title Let's define an evaluation dataset from sample prompts\n", + "#@title Let's define an evaluation dataset from sample prompts\n", "\n", "eval_dataset = _read_prompts(f'{_AGENT_DIR}/eval_prompts.txt')\n", "eval_dataset" @@ -1065,12 +1023,12 @@ " \"\"\"A GEPA adapter for evaluating an ADK agent performance.\"\"\"\n", "\n", " def __init__(\n", - " self,\n", - " rater: rater_lib.Rater,\n", - " agent_factory: AgentFactory,\n", - " run_config: RunConfig,\n", - " tools_description: str = '',\n", - " system_instruction_name='system_instruction',\n", + " self,\n", + " rater: rater_lib.Rater,\n", + " agent_factory: AgentFactory,\n", + " run_config: RunConfig,\n", + " tools_description: str = '',\n", + " system_instruction_name='system_instruction',\n", " ):\n", " super().__init__()\n", " self._rater = rater\n", @@ -1106,7 +1064,9 @@ " del capture_traces # Not used.\n", " results = batch_execution(\n", " config=self._run_config,\n", - " agent=self._agent_factory(candidate.get(self._system_instruction_name)),\n", + " agent=self._agent_factory(\n", + " candidate.get(self._system_instruction_name)\n", + " ),\n", " data_batch=batch,\n", " rater=self._rater,\n", " )\n", @@ -1120,7 +1080,7 @@ " self,\n", " candidate: dict[str, str],\n", " eval_batch: adapter_lib.EvaluationBatch[RunResult, RunResult],\n", - " components_to_update: list[str],\n", + " components_to_update: list[str]\n", " ) -> dict[str, list[dict[str, Any]]]:\n", " \"\"\"Creates a dataset for reflection based on evaluation results.\n", "\n", @@ -1131,8 +1091,8 @@ " Args:\n", " candidate: The candidate that was evaluated.\n", " eval_batch: The results of the evaluation.\n", - " components_to_update: A list of component names that the reflection should\n", - " focus on improving.\n", + " components_to_update: A list of component names that the reflection\n", + " should focus on improving.\n", "\n", " Returns:\n", " A dictionary where keys are component names and values are lists of\n", @@ -1152,7 +1112,7 @@ " 'Generated Outputs': rater_lib.format_user_agent_conversation(\n", " traj.trace\n", " ),\n", - " 'Feedback': {k: v for k, v in traj.rating.items() if k != 'score'},\n", + " 'Feedback': {k: v for k, v in traj.rating.items() if k != 'score'}\n", " })\n", " if batch_items:\n", " component_inputs[comp] = batch_items\n", @@ -2730,7 +2690,7 @@ } ], "source": [ - "# @title Run GEPA Optimization\n", + "#@title Run GEPA Optimization\n", "# This section sets up and runs the GEPA optimization experiment.\n", "# Here we define all the experiment parameters, the GEPA\n", "# optimization loop, and the models to be used.\n", @@ -2740,7 +2700,7 @@ "import gepa\n", "\n", "# @markdown ### 🧠 Configure LLM Models\n", - "REFLECTION_MODEL_NAME = 'gemini-2.5-pro' # @param ['gemini-2.5-flash', 'gemini-2.5-pro']\n", + "REFLECTION_MODEL_NAME = 'gemini-2.5-pro' #@param ['gemini-2.5-flash', 'gemini-2.5-pro']\n", "\n", "# @markdown ---\n", "# @markdown ### ⚙️ Configure Experiment Parameters\n", @@ -2751,7 +2711,7 @@ "# @markdown Maximum number of parallel agent-environment interactions\n", "MAX_CONCURRENCY = 8 # @param {type: 'integer'}\n", "\n", - "# @markdown Dataset and Candidate Setup\n", + "#@markdown Dataset and Candidate Setup\n", "random.seed(42)\n", "\n", "adapter = GEPAAdapter(\n", @@ -2765,7 +2725,7 @@ " seed_candidate={'system_instruction': AGENT_INSTRUCTION},\n", " trainset=[DataInst(prompt=p) for p in voter_data[:15]],\n", " valset=[DataInst(prompt=p) for p in voter_data[15:]],\n", - " task_lm=None, # this must be None when a custom adapter is used\n", + " task_lm=None, # this must be None when a custom adapter is used\n", " adapter=adapter,\n", " max_metric_calls=MAX_METRIC_CALLS,\n", " reflection_lm=utils.reflection_inference_fn(REFLECTION_MODEL_NAME),\n", @@ -2959,7 +2919,7 @@ } ], "source": [ - "# @title Let's evaluate the optimized prompt on our validation dataset\n", + "#@title Let's evaluate the optimized prompt on our validation dataset\n", "\n", "optimized_results = batch_execution(\n", " config=RunConfig(\n", diff --git a/contributing/samples/integrations/langchain_structured_tool_agent/agent.py b/contributing/samples/integrations/langchain_structured_tool_agent/agent.py index e25a28a7e0..d59fea21c0 100644 --- a/contributing/samples/integrations/langchain_structured_tool_agent/agent.py +++ b/contributing/samples/integrations/langchain_structured_tool_agent/agent.py @@ -12,7 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""This agent aims to test the Langchain tool with Langchain's StructuredTool""" +""" +This agent aims to test the Langchain tool with Langchain's StructuredTool +""" from google.adk.agents.llm_agent import Agent from google.adk.tools.langchain_tool import LangchainTool diff --git a/contributing/samples/integrations/oauth2_client_credentials/agent.py b/contributing/samples/integrations/oauth2_client_credentials/agent.py index b19dc1b9b8..4759fd8162 100644 --- a/contributing/samples/integrations/oauth2_client_credentials/agent.py +++ b/contributing/samples/integrations/oauth2_client_credentials/agent.py @@ -69,8 +69,7 @@ def get_weather_data(city: str = "San Francisco", credential=None) -> str: Args: city: City name to get weather for - credential: API credential (automatically injected by - AuthenticatedFunctionTool) + credential: API credential (automatically injected by AuthenticatedFunctionTool) Returns: Current weather information for the city. diff --git a/contributing/samples/integrations/oauth2_client_credentials/oauth2_test_server.py b/contributing/samples/integrations/oauth2_client_credentials/oauth2_test_server.py index 48e5b44124..ee30d9f013 100644 --- a/contributing/samples/integrations/oauth2_client_credentials/oauth2_test_server.py +++ b/contributing/samples/integrations/oauth2_client_credentials/oauth2_test_server.py @@ -11,7 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""Weather API OAuth2 Test Server +""" +Weather API OAuth2 Test Server A simple FastAPI server that implements OAuth2 flows for weather API testing: - Client Credentials Flow diff --git a/contributing/samples/integrations/oauth_calendar_agent/agent.py b/contributing/samples/integrations/oauth_calendar_agent/agent.py index 03967fcc03..981b942f01 100644 --- a/contributing/samples/integrations/oauth_calendar_agent/agent.py +++ b/contributing/samples/integrations/oauth_calendar_agent/agent.py @@ -57,7 +57,6 @@ # see https://github.com/google/adk-python/issues/1944 for details def redact_event_content(event_content: str) -> str: """Redact confidential information in the calendar event content - Args: event_content: the content of the calendar event to redact diff --git a/contributing/samples/integrations/sandbox_computer_use/agent.py b/contributing/samples/integrations/sandbox_computer_use/agent.py index e45a426583..f559dc167f 100644 --- a/contributing/samples/integrations/sandbox_computer_use/agent.py +++ b/contributing/samples/integrations/sandbox_computer_use/agent.py @@ -18,14 +18,14 @@ to create a computer use agent that operates in a remote sandbox environment. Prerequisites: - 1. A GCP project with Agent Engine setup - (https://docs.cloud.google.com/agent-builder/agent-engine/set-up) + 1. A GCP project with Agent Engine setup (https://docs.cloud.google.com/agent-builder/agent-engine/set-up) 2. A service account with roles/iam.serviceAccountTokenCreator permission 3. Environment variables in contributing/samples/.env: - GOOGLE_CLOUD_PROJECT: Your GCP project ID - VMAAS_SERVICE_ACCOUNT: Your service account email - - VMAAS_SANDBOX_NAME: (Optional) Existing sandbox resource name for BYOS - mode + - VMAAS_SANDBOX_NAME: (Optional) Existing sandbox resource name for BYOS mode + - VMAAS_SANDBOX_TEMPLATE_NAME: (Optional) Sandbox template name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) + - VMAAS_SANDBOX_SNAPSHOT_NAME: (Optional) Sandbox snapshot name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) Usage: # Run via ADK web UI @@ -55,12 +55,17 @@ SANDBOX_NAME = os.environ.get("SANDBOX_NAME") or os.environ.get( "VMAAS_SANDBOX_NAME" ) +SANDBOX_TEMPLATE_NAME = os.environ.get("VMAAS_SANDBOX_TEMPLATE_NAME") +SANDBOX_SNAPSHOT_NAME = os.environ.get("VMAAS_SANDBOX_SNAPSHOT_NAME") + # Create the sandbox computer sandbox_computer = AgentEngineSandboxComputer( project_id=PROJECT_ID, service_account_email=SERVICE_ACCOUNT, sandbox_name=SANDBOX_NAME, + sandbox_template_name=SANDBOX_TEMPLATE_NAME, + sandbox_snapshot_name=SANDBOX_SNAPSHOT_NAME, search_engine_url="https://www.google.com", ) diff --git a/contributing/samples/integrations/sandbox_computer_use/main.py b/contributing/samples/integrations/sandbox_computer_use/main.py index e6c60bc298..19fbd8a517 100644 --- a/contributing/samples/integrations/sandbox_computer_use/main.py +++ b/contributing/samples/integrations/sandbox_computer_use/main.py @@ -22,6 +22,9 @@ - GOOGLE_CLOUD_PROJECT: Your GCP project ID - VMAAS_SERVICE_ACCOUNT: Your service account email with roles/iam.serviceAccountTokenCreator permission + - VMAAS_SANDBOX_NAME: (Optional) Existing sandbox resource name for BYOS mode + - VMAAS_SANDBOX_TEMPLATE_NAME: (Optional) Sandbox template name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) + - VMAAS_SANDBOX_SNAPSHOT_NAME: (Optional) Sandbox snapshot name to create a new sandbox (mutually exclusive with VMAAS_SANDBOX_NAME) Usage: cd contributing/samples diff --git a/contributing/samples/integrations/spanner/agent.py b/contributing/samples/integrations/spanner/agent.py index 3b0ced52a0..eb8e5e7776 100644 --- a/contributing/samples/integrations/spanner/agent.py +++ b/contributing/samples/integrations/spanner/agent.py @@ -141,10 +141,19 @@ def search_hotels( Args: location_name (str): The geographical location (e.g., city or town) for the - hotel search. - Example: { "location_name": "Seattle" } - Example: { "location_name": "New York" } - Example: { "location_name": "Los Angeles" } + hotel search. + Example: + { + "location_name": "Seattle" + } + Example: + { + "location_name": "New York" + } + Example: + { + "location_name": "Los Angeles" + } Returns: The hotels name, rating and description. diff --git a/contributing/samples/live/live_bidi_streaming_multi_agent/agent.py b/contributing/samples/live/live_bidi_streaming_multi_agent/agent.py index 4a556ae780..5c0dd5037a 100644 --- a/contributing/samples/live/live_bidi_streaming_multi_agent/agent.py +++ b/contributing/samples/live/live_bidi_streaming_multi_agent/agent.py @@ -116,7 +116,9 @@ def check_prime(nums: list[int]) -> str: def get_current_weather(location: str): - """Returns the current weather.""" + """ + Returns the current weather. + """ if location == "New York": return "Sunny" else: diff --git a/contributing/samples/live/live_tool_callbacks_agent/agent.py b/contributing/samples/live/live_tool_callbacks_agent/agent.py index 28cad5e718..11a220138e 100644 --- a/contributing/samples/live/live_tool_callbacks_agent/agent.py +++ b/contributing/samples/live/live_tool_callbacks_agent/agent.py @@ -26,10 +26,8 @@ def get_weather(location: str, tool_context: ToolContext) -> Dict[str, Any]: """Get weather information for a location. - Args: location: The city or location to get weather for. - Returns: A dictionary containing weather information. """ @@ -48,12 +46,10 @@ def get_weather(location: str, tool_context: ToolContext) -> Dict[str, Any]: async def calculate_async(operation: str, x: float, y: float) -> Dict[str, Any]: """Perform async mathematical calculations. - Args: operation: The operation to perform (add, subtract, multiply, divide). x: First number. y: Second number. - Returns: A dictionary containing the calculation result. """ @@ -80,10 +76,8 @@ async def calculate_async(operation: str, x: float, y: float) -> Dict[str, Any]: def log_activity(message: str, tool_context: ToolContext) -> Dict[str, str]: """Log an activity message with timestamp. - Args: message: The message to log. - Returns: A dictionary confirming the log entry. """ diff --git a/contributing/samples/mcp/mcp_progress_callback_agent/agent.py b/contributing/samples/mcp/mcp_progress_callback_agent/agent.py index 3d8281e6b5..fa6094033f 100644 --- a/contributing/samples/mcp/mcp_progress_callback_agent/agent.py +++ b/contributing/samples/mcp/mcp_progress_callback_agent/agent.py @@ -24,13 +24,10 @@ Pass a ProgressFnT callback that receives (progress, total, message). 2. Factory function (per-tool callbacks with runtime context): - Pass a ProgressCallbackFactory that takes (tool_name, callback_context, - **kwargs) - and returns a ProgressFnT or None. This allows different tools to have - different + Pass a ProgressCallbackFactory that takes (tool_name, callback_context, **kwargs) + and returns a ProgressFnT or None. This allows different tools to have different progress handling logic, and the factory can access and modify session state - via the CallbackContext. The **kwargs ensures forward compatibility for - future + via the CallbackContext. The **kwargs ensures forward compatibility for future parameters. IMPORTANT: Progress callbacks only work when the MCP server actually sends @@ -96,9 +93,9 @@ def progress_callback_factory( Args: tool_name: The name of the MCP tool. - callback_context: The callback context providing access to session, state, - artifacts, and other runtime information. Allows modifying state via - ctx.state['key'] = value. May be None if not available. + callback_context: The callback context providing access to session, + state, artifacts, and other runtime information. Allows modifying + state via ctx.state['key'] = value. May be None if not available. **kwargs: Additional keyword arguments for future extensibility. Returns: diff --git a/contributing/samples/mcp/mcp_toolset_auth/main.py b/contributing/samples/mcp/mcp_toolset_auth/main.py index 2469041afd..f02c553301 100644 --- a/contributing/samples/mcp/mcp_toolset_auth/main.py +++ b/contributing/samples/mcp/mcp_toolset_auth/main.py @@ -22,8 +22,7 @@ Usage: # Start the MCP server first (in another terminal): - PYTHONPATH=src python - contributing/samples/mcp_toolset_auth/oauth_mcp_server.py + PYTHONPATH=src python contributing/samples/mcp_toolset_auth/oauth_mcp_server.py # Run the demo: PYTHONPATH=src python contributing/samples/mcp_toolset_auth/main.py diff --git a/contributing/samples/models/hello_world_apigeellm/.env-sample b/contributing/samples/models/hello_world_apigeellm/.env-sample new file mode 100644 index 0000000000..eeef7fad5a --- /dev/null +++ b/contributing/samples/models/hello_world_apigeellm/.env-sample @@ -0,0 +1,8 @@ +# This is a sample .env file. +# Copy this file to .env and replace the placeholder values with your actual credentials. + +# Your Google API key for accessing Gemini models. +GOOGLE_API_KEY="your-google-api-key" + +# The URL of your Apigee proxy. +APIGEE_PROXY_URL="https://your-apigee-proxy.net/basepath" diff --git a/contributing/samples/tools/pydantic_argument/tests/test_create_company.json b/contributing/samples/tools/pydantic_argument/tests/test_create_company.json index 5b9d227863..bf8d2ab0be 100644 --- a/contributing/samples/tools/pydantic_argument/tests/test_create_company.json +++ b/contributing/samples/tools/pydantic_argument/tests/test_create_company.json @@ -53,66 +53,23 @@ "id": "fc-1", "name": "create_entity_profile", "response": { - "message": "Unexpected entity type: ", - "status": "error" - } - } - } - ], - "role": "user" - }, - "id": "e-3", - "invocationId": "i-1", - "nodeInfo": { - "path": "profile_agent@1" - } - }, - { - "author": "profile_agent", - "content": { - "parts": [ - { - "functionCall": { - "args": { - "entity": { + "entity_type": "company", + "message": "Company profile created for Acme Corp!", + "profile": { "company_name": "Acme Corp", "employee_count": 50, - "industry": "tech" - } - }, - "id": "fc-2", - "name": "create_entity_profile" - } - } - ], - "role": "model" - }, - "finishReason": "STOP", - "id": "e-4", - "invocationId": "i-1", - "longRunningToolIds": [], - "nodeInfo": { - "path": "profile_agent@1" - } - }, - { - "author": "profile_agent", - "content": { - "parts": [ - { - "functionResponse": { - "id": "fc-2", - "name": "create_entity_profile", - "response": { - "message": "Unexpected entity type: ", - "status": "error" + "industry": "tech", + "model_type": "CompanyProfile", + "website": "Not provided" + }, + "status": "company_profile_created" } } } ], "role": "user" }, - "id": "e-5", + "id": "e-3", "invocationId": "i-1", "nodeInfo": { "path": "profile_agent@1" @@ -123,13 +80,13 @@ "content": { "parts": [ { - "text": "I apologize for the repeated errors. It seems I am having trouble with the tool's expected input format. I will try again to create the company profile for Acme Corp. I believe the issue was in how I was structuring the data for the `create_entity_profile` function. I will now use the correct dataclass constructor to create the profile. Please bear with me." + "text": "I have created a profile for Acme Corp in the tech industry with 50 employees." } ], "role": "model" }, "finishReason": "STOP", - "id": "e-6", + "id": "e-4", "invocationId": "i-1", "nodeInfo": { "path": "profile_agent@1" diff --git a/contributing/samples/workflows/auth_oauth/agent.py b/contributing/samples/workflows/auth_oauth/agent.py index 1e2704a469..25a1955f3d 100644 --- a/contributing/samples/workflows/auth_oauth/agent.py +++ b/contributing/samples/workflows/auth_oauth/agent.py @@ -14,10 +14,8 @@ """OAuth Authentication sample: FunctionNode with GitHub OAuth2 token request. -Demonstrates how to use `auth_config` with GitHub OAuth2 on a FunctionNode to -pause -the workflow, request an OAuth token from the user, and use it to list the -user's +Demonstrates how to use `auth_config` with GitHub OAuth2 on a FunctionNode to pause +the workflow, request an OAuth token from the user, and use it to list the user's GitHub repositories. Flow: diff --git a/contributing/samples/workflows/message/agent.py b/contributing/samples/workflows/message/agent.py index 137c12f381..c62c691688 100644 --- a/contributing/samples/workflows/message/agent.py +++ b/contributing/samples/workflows/message/agent.py @@ -68,8 +68,8 @@ async def multiple_messages(node_input: Any = None): async def stream_sentence(node_input: Any = None): - """Demonstrates streaming by sending a sentence in chunks. - + """ + Demonstrates streaming by sending a sentence in chunks. The `partial=True` flag tells the UI that this is part of an ongoing message. """ yield Event(message="#4 Starting to stream...") diff --git a/contributing/samples/workflows/node_output/agent.py b/contributing/samples/workflows/node_output/agent.py index 34d5deea9f..fdb8e83c2b 100644 --- a/contributing/samples/workflows/node_output/agent.py +++ b/contributing/samples/workflows/node_output/agent.py @@ -46,10 +46,10 @@ def generate_event_output(node_input: str): def consume_pydantic_output(node_input: TopicDetails): - """Relying on the FunctionNode's automatic type parsing. - - The framework will coerce the dictionary or JSON into a TopicDetails object - automatically. + """ + Relying on the FunctionNode's automatic type parsing. + The framework will coerce the dictionary or JSON into a TopicDetails + object automatically. """ return ( "Received Pydantic Model!\n" diff --git a/contributing/samples/workflows/request_input_advanced/agent.py b/contributing/samples/workflows/request_input_advanced/agent.py index e8a90c8d5a..d026d55411 100644 --- a/contributing/samples/workflows/request_input_advanced/agent.py +++ b/contributing/samples/workflows/request_input_advanced/agent.py @@ -48,7 +48,9 @@ class TimeOffDecision(BaseModel): def evaluate_request(request: TimeOffRequest): - """If days <= 1, it's auto-approved. Otherwise, routes to manager review.""" + """ + If days <= 1, it's auto-approved. Otherwise, routes to manager review. + """ if request.days <= 1: return TimeOffDecision(approved=True) else: From 3ee7c0b43b719befcbf531f07818a7ca1865c86f Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Wed, 27 May 2026 16:32:07 -0700 Subject: [PATCH 33/94] fix(tools): don't close parent's plugins from AgentTool's sub-Runner `AgentTool.run_async` spins up a sub-`Runner` per call that, with the default `include_plugins=True`, shares the parent runner's plugin instances. On exit the sub-Runner's `close()` tore down those shared plugins, so long-lived plugins (e.g. observability exporters) hit the 5s `plugin_close_timeout` and surfaced as "RuntimeError: Failed to close plugins: 'X': TimeoutError" on the parent's tool call. Add `PluginManager.set_skip_closing_plugins(value)`; when set to True, `close()` is a no-op. `AgentTool` calls it on the sub-Runner's `plugin_manager` after construction (only when `include_plugins=True`) so inherited plugins are no longer closed by the sub-Runner. `Runner` itself is unchanged. Behavior with `include_plugins=False` is unchanged. PiperOrigin-RevId: 922410609 --- src/google/adk/plugins/plugin_manager.py | 24 ++++++++ src/google/adk/tools/agent_tool.py | 6 ++ .../unittests/plugins/test_plugin_manager.py | 46 +++++++++++++++ tests/unittests/tools/test_agent_tool.py | 57 +++++++++++++++++++ 4 files changed, 133 insertions(+) diff --git a/src/google/adk/plugins/plugin_manager.py b/src/google/adk/plugins/plugin_manager.py index c781e8fa4e..5566349516 100644 --- a/src/google/adk/plugins/plugin_manager.py +++ b/src/google/adk/plugins/plugin_manager.py @@ -85,10 +85,25 @@ def __init__( """ self.plugins: List[BasePlugin] = [] self._close_timeout = close_timeout + self._skip_closing_plugins = False if plugins: for plugin in plugins: self.register_plugin(plugin) + def set_skip_closing_plugins(self, value: bool) -> None: + """Controls whether `close()` will tear down the registered plugins. + + Set to True when the plugins are owned by another component (e.g. a parent + `Runner` whose plugin list this manager is sharing). When set, subsequent + calls to `close()` become a no-op so the shared plugins are not torn down + while still in use. + + Args: + value: True to skip closing the plugins; False (default) to close them + normally. + """ + self._skip_closing_plugins = value + def register_plugin(self, plugin: BasePlugin) -> None: """Registers a new plugin. @@ -309,10 +324,19 @@ async def _run_callbacks( async def close(self) -> None: """Calls the close method on all registered plugins concurrently. + If this manager was constructed with `skip_closing_plugins=True`, this + method is a no-op so plugins owned by another component (e.g. a parent + `Runner`) are not torn down while still in use. + Raises: RuntimeError: If one or more plugins failed to close, containing details of all failures. """ + if self._skip_closing_plugins: + logger.debug( + "Skipping plugin close; plugins are owned by another component." + ) + return exceptions = {} # We iterate sequentially to avoid creating new tasks which can cause issues # with some libraries (like anyio/mcp) that rely on task-local context. diff --git a/src/google/adk/tools/agent_tool.py b/src/google/adk/tools/agent_tool.py index 2b8c083f23..50816f5361 100644 --- a/src/google/adk/tools/agent_tool.py +++ b/src/google/adk/tools/agent_tool.py @@ -247,6 +247,12 @@ async def run_async( credential_service=tool_context._invocation_context.credential_service, plugins=plugins, ) + # When plugins are inherited from the parent runner, the parent still owns + # them; tell the sub-Runner's plugin manager to skip closing them on exit + # so shared plugins (e.g. observability exporters) are not torn down while + # the parent is still using them. + if self.include_plugins: + runner.plugin_manager.set_skip_closing_plugins(True) state_dict = { k: v diff --git a/tests/unittests/plugins/test_plugin_manager.py b/tests/unittests/plugins/test_plugin_manager.py index ba070ea8f3..6c72a2a665 100644 --- a/tests/unittests/plugins/test_plugin_manager.py +++ b/tests/unittests/plugins/test_plugin_manager.py @@ -317,3 +317,49 @@ async def slow_close(): assert "Failed to close plugins: 'plugin1': TimeoutError" in str( excinfo.value ) + + +@pytest.mark.asyncio +async def test_close_is_noop_after_set_skip_closing_plugins( + plugin1: TestPlugin, +): + """Tests that close is a no-op after set_skip_closing_plugins(True).""" + plugin1.close = AsyncMock() + service = PluginManager(plugins=[plugin1]) + service.set_skip_closing_plugins(True) + + await service.close() + + plugin1.close.assert_not_awaited() + + +@pytest.mark.asyncio +async def test_set_skip_closing_plugins_bypasses_close_timeout( + plugin1: TestPlugin, +): + """Tests that set_skip_closing_plugins(True) bypasses close timeout.""" + + async def slow_close(): + await asyncio.sleep(10) # Would otherwise time out. + + plugin1.close = slow_close + service = PluginManager(plugins=[plugin1], close_timeout=0.01) + service.set_skip_closing_plugins(True) + + # Should return immediately without raising. + await service.close() + + +@pytest.mark.asyncio +async def test_set_skip_closing_plugins_false_reverts_to_closing( + plugin1: TestPlugin, +): + """Tests that set_skip_closing_plugins(False) re-enables closing.""" + plugin1.close = AsyncMock() + service = PluginManager(plugins=[plugin1]) + service.set_skip_closing_plugins(True) + service.set_skip_closing_plugins(False) + + await service.close() + + plugin1.close.assert_awaited_once() diff --git a/tests/unittests/tools/test_agent_tool.py b/tests/unittests/tools/test_agent_tool.py index 67a2674ff7..d3768ea210 100644 --- a/tests/unittests/tools/test_agent_tool.py +++ b/tests/unittests/tools/test_agent_tool.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import asyncio from typing import Any from typing import Optional @@ -30,6 +31,7 @@ from google.adk.models.llm_response import LlmResponse from google.adk.plugins.base_plugin import BasePlugin from google.adk.plugins.plugin_manager import PluginManager +from google.adk.runners import Runner from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.tools.agent_tool import AgentTool from google.adk.tools.tool_context import ToolContext @@ -727,6 +729,61 @@ async def before_agent_callback(self, **kwargs): assert tracking_plugin.before_agent_calls == 1 +@pytest.mark.asyncio +async def test_include_plugins_true_sub_runner_does_not_close_parent_plugins(): + """Sub-Runner must not close plugins owned by the parent runner.""" + + class SlowClosePlugin(BasePlugin): + + def __init__(self, name: str): + super().__init__(name) + self.close_calls = 0 + + async def close(self): + self.close_calls += 1 + # Would otherwise blow past the sub-Runner's plugin_close_timeout. + await asyncio.sleep(10) + + parent_plugin = SlowClosePlugin(name='parent_plugin') + + mock_model = testing_utils.MockModel.create( + responses=[function_call_no_schema, 'response1', 'response2'] + ) + + tool_agent = Agent(name='tool_agent', model=mock_model) + root_agent = Agent( + name='root_agent', + model=mock_model, + tools=[AgentTool(agent=tool_agent, include_plugins=True)], + ) + + runner = Runner( + app_name='test_app', + agent=root_agent, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + plugins=[parent_plugin], + # Tight timeout amplifies the bug if it regresses; with the fix, the + # sub-Runner's close skips the parent's plugins entirely. + plugin_close_timeout=0.01, + ) + session = await runner.session_service.create_session( + app_name='test_app', user_id='test_user' + ) + # Must not raise RuntimeError("Failed to close plugins: ...") from the + # sub-Runner closing the parent's slow-to-close plugin. + async for _ in runner.run_async( + user_id=session.user_id, + session_id=session.id, + new_message=testing_utils.get_user_content('test1'), + ): + pass + + # The sub-Runner must not have closed the parent's plugin. + assert parent_plugin.close_calls == 0 + + def test_agent_tool_description_with_input_schema(): """Test that agent description is propagated when using input_schema.""" From d3841d6df9478f91bd99317b706c25d3d0a7208e Mon Sep 17 00:00:00 2001 From: Shangjie Chen Date: Thu, 28 May 2026 15:49:29 -0700 Subject: [PATCH 34/94] chore: Provide a default value for the `author` field in Event Co-authored-by: Shangjie Chen PiperOrigin-RevId: 923020773 --- src/google/adk/events/event.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/google/adk/events/event.py b/src/google/adk/events/event.py index fb3e9093f3..51e30d91b0 100644 --- a/src/google/adk/events/event.py +++ b/src/google/adk/events/event.py @@ -46,7 +46,7 @@ class Event(LlmResponse): invocation_id: str = '' """The invocation ID of the event. Should be non-empty before appending to a session.""" - author: str + author: str = '' """'user' or the name of the agent, indicating who appended the event to the session.""" actions: EventActions = Field(default_factory=EventActions) From 1fbba3b5f303d65fd43cb301475fd57fc5475510 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Thu, 28 May 2026 16:03:25 -0700 Subject: [PATCH 35/94] fix: Append trailing newline to runtime-config.json in ADK Web Server PiperOrigin-RevId: 923027656 --- src/google/adk/cli/adk_web_server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index c427be0d5a..2b086a3626 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -845,6 +845,7 @@ def _setup_runtime_config(self, web_assets_dir: str): os.makedirs(os.path.dirname(runtime_config_path), exist_ok=True) with open(runtime_config_path, "w") as f: json.dump(runtime_config, f, indent=2) + f.write("\n") except IOError as e: logger.error( "Failed to write runtime config file %s: %s", runtime_config_path, e From eada3705ab2f915c92dba7f6750d35f7d080275c Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Thu, 28 May 2026 16:05:04 -0700 Subject: [PATCH 36/94] feat: Add RubricBasedMultiTurnTrajectoryEvaluator which evaluates an entire trajectory on a user-defined set of rubric criteria PiperOrigin-RevId: 923028452 --- src/google/adk/evaluation/eval_metrics.py | 4 + .../evaluation/metric_evaluator_registry.py | 6 + .../adk/evaluation/metric_info_providers.py | 18 + ...c_based_multi_turn_trajectory_evaluator.py | 366 ++++++++++++++++++ .../test_metric_evaluator_registry.py | 12 + ...c_based_multi_turn_trajectory_evaluator.py | 298 ++++++++++++++ 6 files changed, 704 insertions(+) create mode 100644 src/google/adk/evaluation/rubric_based_multi_turn_trajectory_evaluator.py create mode 100644 tests/unittests/evaluation/test_rubric_based_multi_turn_trajectory_evaluator.py diff --git a/src/google/adk/evaluation/eval_metrics.py b/src/google/adk/evaluation/eval_metrics.py index 50c3473c3a..ad55e3515f 100644 --- a/src/google/adk/evaluation/eval_metrics.py +++ b/src/google/adk/evaluation/eval_metrics.py @@ -67,6 +67,10 @@ class PrebuiltMetrics(Enum): MULTI_TURN_TOOL_USE_QUALITY_V1 = "multi_turn_tool_use_quality_v1" + RUBRIC_BASED_MULTI_TURN_TRAJECTORY_QUALITY_V1 = ( + "rubric_based_multi_turn_trajectory_quality_v1" + ) + MetricName: TypeAlias = Union[str, PrebuiltMetrics] Threshold: TypeAlias = float diff --git a/src/google/adk/evaluation/metric_evaluator_registry.py b/src/google/adk/evaluation/metric_evaluator_registry.py index b005bd36e6..8b10172bca 100644 --- a/src/google/adk/evaluation/metric_evaluator_registry.py +++ b/src/google/adk/evaluation/metric_evaluator_registry.py @@ -33,6 +33,7 @@ from .metric_info_providers import PerTurnUserSimulatorQualityV1MetricInfoProvider from .metric_info_providers import ResponseEvaluatorMetricInfoProvider from .metric_info_providers import RubricBasedFinalResponseQualityV1EvaluatorMetricInfoProvider +from .metric_info_providers import RubricBasedMultiTurnTrajectoryMetricInfoProvider from .metric_info_providers import RubricBasedToolUseV1EvaluatorMetricInfoProvider from .metric_info_providers import SafetyEvaluatorV1MetricInfoProvider from .metric_info_providers import TrajectoryEvaluatorMetricInfoProvider @@ -41,6 +42,7 @@ from .multi_turn_trajectory_quality_evaluator import MultiTurnTrajectoryQualityV1Evaluator from .response_evaluator import ResponseEvaluator from .rubric_based_final_response_quality_v1 import RubricBasedFinalResponseQualityV1Evaluator +from .rubric_based_multi_turn_trajectory_evaluator import RubricBasedMultiTurnTrajectoryEvaluator from .rubric_based_tool_use_quality_v1 import RubricBasedToolUseV1Evaluator from .safety_evaluator import SafetyEvaluatorV1 from .simulation.per_turn_user_simulator_quality_v1 import PerTurnUserSimulatorQualityV1 @@ -164,6 +166,10 @@ def _get_default_metric_evaluator_registry() -> MetricEvaluatorRegistry: metric_info=PerTurnUserSimulatorQualityV1MetricInfoProvider().get_metric_info(), evaluator=PerTurnUserSimulatorQualityV1, ) + metric_evaluator_registry.register_evaluator( + metric_info=RubricBasedMultiTurnTrajectoryMetricInfoProvider().get_metric_info(), + evaluator=RubricBasedMultiTurnTrajectoryEvaluator, + ) return metric_evaluator_registry diff --git a/src/google/adk/evaluation/metric_info_providers.py b/src/google/adk/evaluation/metric_info_providers.py index f887aacad2..42c4a7a4bd 100644 --- a/src/google/adk/evaluation/metric_info_providers.py +++ b/src/google/adk/evaluation/metric_info_providers.py @@ -242,3 +242,21 @@ def get_metric_info(self) -> MetricInfo: interval=Interval(min_value=0.0, max_value=1.0) ), ) + + +class RubricBasedMultiTurnTrajectoryMetricInfoProvider(MetricInfoProvider): + """Metric info provider for RubricBasedMultiTurnTrajectory.""" + + def get_metric_info(self) -> MetricInfo: + return MetricInfo( + metric_name=PrebuiltMetrics.RUBRIC_BASED_MULTI_TURN_TRAJECTORY_QUALITY_V1, + description=( + "This metric evaluates the agent's multi-turn trajectory against" + " a set of user-provided rubrics using an LLM as a judge. Value" + " range for this metric is [0,1], with values closer to 1 more" + " desirable." + ), + metric_value_info=MetricValueInfo( + interval=Interval(min_value=0.0, max_value=1.0) + ), + ) diff --git a/src/google/adk/evaluation/rubric_based_multi_turn_trajectory_evaluator.py b/src/google/adk/evaluation/rubric_based_multi_turn_trajectory_evaluator.py new file mode 100644 index 0000000000..b366f0a3c9 --- /dev/null +++ b/src/google/adk/evaluation/rubric_based_multi_turn_trajectory_evaluator.py @@ -0,0 +1,366 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import json +import logging +from typing import ClassVar +from typing import Optional + +from typing_extensions import override + +from .eval_case import ConversationScenario +from .eval_case import Invocation +from .eval_case import InvocationEvents +from .eval_metrics import EvalMetric +from .eval_metrics import EvalStatus +from .eval_metrics import RubricsBasedCriterion +from .evaluator import EvaluationResult +from .evaluator import PerInvocationResult +from .rubric_based_evaluator import RubricBasedEvaluator + +logger = logging.getLogger("google_adk." + __name__) + +_RUBRIC_BASED_MULTI_TURN_TRAJECTORY_QUALITY_V1_PROMPT = """# Mission +Your mission is to evaluate the quality of responses generated by an AI agent in a multi-turn conversation. Your task is to analyze the entire conversation history, focusing on all assistant responses, and rate them against the provided rubric criteria. The conversation may include text-based interactions, transcribed audio interactions, and records of tool calls made by the assistant. +One turn is defined as a user and assistant response pair. + +# Instructions: +- Analyze the entire conversation: Carefully review every turn in the , paying attention to each user query and assistant response turn within . +- Evaluate ALL assistant responses cumulatively: Your assessment for each criterion should reflect the assistant's overall performance across all its turns. For instance, if an assistant made a factual error in Turn 2 but corrected it in Turn 4, the "Factual Accuracy" score should reflect this nuanced performance. +- Consider Modality and Tool Use: Take into account the different modalities presented (text, audio transcripts) and the effective or ineffective use of tools by the assistant as described in the conversation history. +- Refer to the Rubric: For each criterion listed under , determine how well the assistant's collective performance across all its turns satisfies that criterion. +- If a specific property is not fulfilled, you must provide the agent response turn number that violated the property. +- Your mission is to evaluate the quality of responses generated by an AI agent. You will be presented with the conversation history () which includes a set of user and assistant turns, and a set of properties () that you must use to objectively assess the validity of the agent's response. +- Only use the properties provided. Do not make up new properties. +- Keep the critiques across each property mutually exclusive. +- IMPORTANT: Assess all of the provided properties. Do not drop any of the properties from your response. + +# Rubric: +"yes": The agent's response fulfilled the property or the property is not applicable to the user prompt. +"no": The agent's response did not fulfill the property. + +# For each property starting with a new line, follow these steps: +STEP 1: Repeat the property, word for word, without making any changes. Keep everything including punctuation and capitalization as-is. +STEP 2: Determine the steps needed to check if all the assistant responses in the conversation history fulfill the *intent* of the property. Refer back to the `` to understand the user's original goal. +STEP 3: Follow the steps outlined in STEP 2, thinking out loud. As you think, refer to specific assistant responses and count their turn numbers within the . +STEP 4: Review the thoughts and the original property. +STEP 5: Output the final verdict. +Property: [[Repeat the property in STEP 1 again.]] +Rationale: [[Explain your reasoning for the verdict.]] +Verdict: [[yes|no]] + +# Output format (repeat this format for every property started with a new line): +STEP 1: ... +STEP 2: ... +STEP 3: ... +STEP 4: ... +STEP 5: ... +Property: ... +Rationale: ... +Verdict: ... + +# Example output 1 + +STEP 1: Does the agent run function call 'default_api.grammar_check'? +STEP 2: I need to check if any assistant response in the includes the exact function name 'default_api.grammar_check'. +STEP 3: Reviewing the , I find that in Assistant Turn 2, the agent includes the function call default_api.grammar_check(sentence="the dog walks on the a park"). This matches the required function name. +STEP 4: The assistant successfully called the specified function in Turn 2. +STEP 5: yes +Property: Does the agent run function call 'default_api.grammar_check'? +Rationale: The agent's response in Assistant Turn 2 contains the function call 'default_api.grammar_check' within a proper code block and with the correct function name. +Verdict: yes + +STEP 1: The sentence parameter in the grammar_check function call must be 'the dog walks on the a park'. +STEP 2: I need to check if the function call 'default_api.grammar_check' (if present in any assistant turn) includes the parameter 'sentence' and whether the value assigned to 'sentence' is valid according to the provided guideline in the property. The property specifies the valid value as 'the dog walks on the a park'. +STEP 3: In Assistant Turn 2, the agent's response includes the function call default_api.grammar_check(sentence="the dog walks on the a park"). The parameter 'sentence' is present, and the value assigned to it is "the dog walks on the a park", which is identical to the reference value. +STEP 4: The parameter 'sentence' is present and its value is exactly the same as the reference value in Assistant Turn 2. +STEP 5: yes +Property: The sentence parameter in the grammar_check function call must be 'the dog walks on the a park'. +Rationale: The agent's response in Assistant Turn 2 includes the 'sentence' parameter in the function call 'default_api.grammar_check', and the value assigned to it is exactly the same as the reference value. +Verdict: yes + +# Example output 2 + +STEP 1: Does the agent run function call 'default_api.search_via_perplexity'? +STEP 2: I need to check if any assistant response in the includes the exact function name 'default_api.search_via_perplexity'. +STEP 3: Reviewing the , I find that in Assistant Turn 2, the agent includes a function call default_api.get_web_search_results. This does not match the required 'default_api.search_via_perplexity'. I checked all other assistant turns and no other function call matches. +STEP 4: The agent did not use the function 'default_api.search_via_perplexity' in any turn. +STEP 5: no +Property: Does the agent run function call 'default_api.search_via_perplexity'? +Rationale: The agent called 'default_api.get_web_search_results' in Assistant Turn 2, not 'default_api.search_via_perplexity'. The correct function was not called in any turn. +Verdict: no + +STEP 1: Does the agent provide function call 'default_api.search_via_perplexity' with input parameter 'keyword' that is valid compared to the reference 'keyword'= 'GPT-4o vs GPT-3.5 cost comparison' and based on the following guideline? Guideline for 'keyword': 'The wording can differ. The agent response is valid if it conveys similar core content as the reference response. Less efficient and minor inaccurate phrasing is acceptable.' +STEP 2: I need to check if the agent runs the function call with exact function name as 'default_api.search_via_perplexity' in any turn, and if so, check if the value assigned to 'keyword' is valid according to the provided guideline in the property. +STEP 3: Based on the previous evaluation, the agent did not include a function call 'default_api.search_via_perplexity' in any of its turns. Therefore, this property cannot be fulfilled. +STEP 4: The property cannot be fulfilled because the agent did not use the specified function call. +STEP 5: no +Property: Does the agent provide function call 'default_api.search_via_perplexity' with input parameter 'keyword' that is valid compared to the reference 'keyword'= 'GPT-4o vs GPT-3.5 cost comparison' and based on the following guideline? Guideline for 'keyword': 'The wording can differ. The agent response is valid if it conveys similar core content as the reference response. Less efficient and minor inaccurate phrasing is acceptable.' +Rationale: The agent did not use the function call 'default_api.search_via_perplexity' in any of its responses throughout the conversation. +Verdict: no + + +{agent_instructions} + + + +{agent_tool_definitions} + + + +{user_agent_dialogue} + + + +{properties} + +""" + + +class RubricBasedMultiTurnTrajectoryEvaluator(RubricBasedEvaluator): + """An Evaluator for rubric based assessment of an agent's multi-turn trajectory using a LLM. + + This evaluator assesses the quality of an agent's behavior across an entire + multi-turn conversation, including intermediate tool calls, function + responses, and the final textual replies. It uses a set of rubrics (defined + as properties) to judge whether the agent's cumulative performance satisfies + each criterion. + + Unlike single-turn evaluators that assess each invocation independently, this + evaluator accumulates the full dialogue history (user turns, agent turns, and + tool interactions) and performs a single LLM-based evaluation on the last + turn using the complete conversation context. The first N-1 turns are marked + as NOT_EVALUATED, and the final turn carries the aggregate score. + + Example: For a travel-booking agent that handles multi-step itinerary + planning, one could specify the following rubrics: + + Rubric 1: The agent correctly called the flight search tool with the + user-specified origin, destination, and dates. + Rubric 2: The agent confirmed the booking details with the user before + finalizing the reservation. + Rubric 3: The agent's final response included a complete itinerary summary + with flight numbers, times, and confirmation codes. + + For each rubric, the LLM judge will produce a binary verdict ("yes" or "no") + indicating whether the agent's trajectory satisfied that property. A "yes" + verdict maps to a score of 1.0 and "no" maps to 0.0. + + A combined score using individual rubric verdicts will also be generated. + This overall score is the average of all individual rubric scores, giving a + value between 0 and 1 where values closer to 1 indicate better adherence to + the specified rubrics. + """ + + criterion_type: ClassVar[type[RubricsBasedCriterion]] = RubricsBasedCriterion + RUBRIC_TYPE: ClassVar[str] = "TRAJECTORY_QUALITY" + + def __init__(self, eval_metric: EvalMetric): + super().__init__( + eval_metric, + criterion_type=RubricBasedMultiTurnTrajectoryEvaluator.criterion_type, + rubric_type=RubricBasedMultiTurnTrajectoryEvaluator.RUBRIC_TYPE, + ) + self._auto_rater_prompt_template = ( + _RUBRIC_BASED_MULTI_TURN_TRAJECTORY_QUALITY_V1_PROMPT + ) + + def _assemble_dialogue_history( + self, actual_invocations: list[Invocation] + ) -> None: + """Assembles the dialogue history, instructions, and tools from invocations.""" + dialogue_lines = [] + for turn_index, invocation in enumerate(actual_invocations): + # USER TURN + if invocation.user_content and invocation.user_content.parts: + text_parts = [p.text for p in invocation.user_content.parts if p.text] + if text_parts: + dialogue_lines.append( + f"USER TURN {turn_index + 1}: {' '.join(text_parts)}" + ) + + # INTERMEDIATE TOOL EVENTS + if isinstance(invocation.intermediate_data, InvocationEvents): + for event in invocation.intermediate_data.invocation_events: + role = ( + "USER" + if event.author and event.author.lower() == "user" + else f"AGENT ({event.author})" + ) + if event.content and event.content.parts: + text_parts = [p.text for p in event.content.parts if p.text] + if text_parts: + dialogue_lines.append( + f"{role} TURN {turn_index + 1}: {' '.join(text_parts)}" + ) + for p in event.content.parts: + if p.function_call: + args = ( + json.dumps(dict(p.function_call.args)) + if p.function_call.args + else "{}" + ) + dialogue_lines.append( + f"{role} TURN {turn_index + 1} (tool call):" + f" {p.function_call.name}({args})" + ) + if p.function_response: + resp = ( + json.dumps(dict(p.function_response.response)) + if p.function_response.response + else "{}" + ) + dialogue_lines.append( + f"{role} TURN {turn_index + 1} (tool output):" + f" {p.function_response.name} -> {resp}" + ) + + # FINAL AGENT TURN + if invocation.final_response and invocation.final_response.parts: + try: + agent_name = invocation.intermediate_data.invocation_events[0].author + except (AttributeError, IndexError): + agent_name = "agent" + role = f"AGENT ({agent_name})" + text_parts = [p.text for p in invocation.final_response.parts if p.text] + if text_parts: + dialogue_lines.append( + f"{role} TURN {turn_index + 1}: {' '.join(text_parts)}" + ) + + self._formatted_dialogue = "\n".join(dialogue_lines) + + # Grab instructions and tools locally from Invocation + instructions_parts = [] + tools_parts = [] + for invocation in actual_invocations: + if invocation.app_details and invocation.app_details.agent_details: + for agent_id, details in invocation.app_details.agent_details.items(): + instructions_parts.append( + f"Agent {agent_id} Instructions:\n{details.instructions}" + ) + tools_parts.append(f"Agent: {agent_id}") + if details.tool_declarations: + for tool in details.tool_declarations: + for func in tool.function_declarations: + tools_parts.append(f"- {func.name}: {func.description}") + + self._formatted_instructions = "\n\n".join( + dict.fromkeys(instructions_parts) + ) + self._formatted_tools = "\n".join(dict.fromkeys(tools_parts)) + + @override + async def evaluate_invocations( + self, + actual_invocations: list[Invocation], + expected_invocations: Optional[list[Invocation]] = None, + conversation_scenario: Optional[ConversationScenario] = None, + ) -> EvaluationResult: + """Evaluates multiple turns locally, collecting full dialogue history.""" + # Parse out Pydantic types locally without server-side imports + # Re-implement dialogue parsing logic fully locally + # to have zero deps on cloud.ai. + logger.debug( + "Local evaluator start (invocations: %d)", + len(actual_invocations), + ) + self._assemble_dialogue_history(actual_invocations) + + # If expected_invocations are not supplied, provide a list of None. + expected_invocations = ( + [None] * len(actual_invocations) + if expected_invocations is None + else expected_invocations + ) + + # Mark the first N-1 turns as NOT_EVALUATED. + per_invocation_results = [] + for actual, expected in zip( + actual_invocations[:-1], expected_invocations[:-1] + ): + per_invocation_results.append( + PerInvocationResult( + actual_invocation=actual, + expected_invocation=expected, + score=None, + eval_status=EvalStatus.NOT_EVALUATED, + ) + ) + + # Conversation-level evaluation: run the LLM judge + # once on the last turn with full dialogue context. + last_expected = ( + [expected_invocations[-1]] if expected_invocations[-1] else None + ) + last_turn_result = await super().evaluate_invocations( + [actual_invocations[-1]], + last_expected, + conversation_scenario, + ) + + # Append the evaluated last-turn result. + if last_turn_result.per_invocation_results: + per_invocation_results.extend(last_turn_result.per_invocation_results) + else: + per_invocation_results.append( + PerInvocationResult( + actual_invocation=actual_invocations[-1], + expected_invocation=expected_invocations[-1], + score=last_turn_result.overall_score, + eval_status=last_turn_result.overall_eval_status, + rubric_scores=last_turn_result.overall_rubric_scores, + ) + ) + + return EvaluationResult( + overall_score=last_turn_result.overall_score, + overall_eval_status=last_turn_result.overall_eval_status, + per_invocation_results=per_invocation_results, + overall_rubric_scores=last_turn_result.overall_rubric_scores, + ) + + @override + def format_auto_rater_prompt( + self, + actual_invocation: Invocation, + _: Optional[Invocation], + ) -> str: + """Returns the fully rendered validation prompt using locally configured rubrics.""" + self.create_effective_rubrics_list(actual_invocation.rubrics) + logger.debug( + "format_auto_rater_prompt called (effective rubrics: %d)", + len(self._effective_rubrics_list), + ) + + rubrics_list = [] + for r in self._effective_rubrics_list: + rubrics_dict = { + "property": r.rubric_content.text_property, + } + if r.type: + rubrics_dict["type"] = r.type + rubrics_list.append(rubrics_dict) + formatted_rubrics = json.dumps(rubrics_list, indent=2) + + prompt = self._auto_rater_prompt_template.format( + user_agent_dialogue=self._formatted_dialogue, + properties=formatted_rubrics, + agent_instructions=self._formatted_instructions, + agent_tool_definitions=self._formatted_tools, + ) + logger.debug("Generated rubric validator prompt:\n%s", prompt) + return prompt diff --git a/tests/unittests/evaluation/test_metric_evaluator_registry.py b/tests/unittests/evaluation/test_metric_evaluator_registry.py index cb5361f427..2e34f3fed8 100644 --- a/tests/unittests/evaluation/test_metric_evaluator_registry.py +++ b/tests/unittests/evaluation/test_metric_evaluator_registry.py @@ -27,6 +27,7 @@ from google.adk.evaluation.metric_evaluator_registry import PerTurnUserSimulatorQualityV1MetricInfoProvider from google.adk.evaluation.metric_evaluator_registry import ResponseEvaluatorMetricInfoProvider from google.adk.evaluation.metric_evaluator_registry import RubricBasedFinalResponseQualityV1EvaluatorMetricInfoProvider +from google.adk.evaluation.metric_evaluator_registry import RubricBasedMultiTurnTrajectoryMetricInfoProvider from google.adk.evaluation.metric_evaluator_registry import RubricBasedToolUseV1EvaluatorMetricInfoProvider from google.adk.evaluation.metric_evaluator_registry import SafetyEvaluatorV1MetricInfoProvider from google.adk.evaluation.metric_evaluator_registry import TrajectoryEvaluatorMetricInfoProvider @@ -208,3 +209,14 @@ def test_per_turn_user_simulator_quality_v1_metric_info_provider(self): ) assert metric_info.metric_value_info.interval.min_value == 0.0 assert metric_info.metric_value_info.interval.max_value == 1.0 + + def test_rubric_based_multi_turn_trajectory_metric_info_provider(self): + metric_info = ( + RubricBasedMultiTurnTrajectoryMetricInfoProvider().get_metric_info() + ) + assert ( + metric_info.metric_name + == PrebuiltMetrics.RUBRIC_BASED_MULTI_TURN_TRAJECTORY_QUALITY_V1.value + ) + assert metric_info.metric_value_info.interval.min_value == 0.0 + assert metric_info.metric_value_info.interval.max_value == 1.0 diff --git a/tests/unittests/evaluation/test_rubric_based_multi_turn_trajectory_evaluator.py b/tests/unittests/evaluation/test_rubric_based_multi_turn_trajectory_evaluator.py new file mode 100644 index 0000000000..f1e3a048de --- /dev/null +++ b/tests/unittests/evaluation/test_rubric_based_multi_turn_trajectory_evaluator.py @@ -0,0 +1,298 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.evaluation.app_details import AgentDetails +from google.adk.evaluation.app_details import AppDetails +from google.adk.evaluation.eval_case import Invocation +from google.adk.evaluation.eval_case import InvocationEvent +from google.adk.evaluation.eval_case import InvocationEvents +from google.adk.evaluation.eval_metrics import EvalMetric +from google.adk.evaluation.eval_metrics import JudgeModelOptions +from google.adk.evaluation.eval_metrics import PrebuiltMetrics +from google.adk.evaluation.eval_metrics import RubricsBasedCriterion +from google.adk.evaluation.eval_rubrics import Rubric +from google.adk.evaluation.eval_rubrics import RubricContent +from google.adk.evaluation.rubric_based_multi_turn_trajectory_evaluator import RubricBasedMultiTurnTrajectoryEvaluator +from google.genai import types as genai_types +import pytest + +_RUBRICS = [ + Rubric( + rubric_id="1", + rubric_content=RubricContent( + text_property="The agent uses the correct tool." + ), + type="TOOL_USAGE", + ), + Rubric( + rubric_id="2", + rubric_content=RubricContent( + text_property="The agent fulfills the user intent." + ), + type="FULFILL_USER_INTENT", + ), +] + + +def _make_evaluator( + rubrics: list[Rubric] | None = None, +) -> RubricBasedMultiTurnTrajectoryEvaluator: + """Helper to build an evaluator with the given rubrics.""" + rubrics = rubrics or _RUBRICS + criterion = RubricsBasedCriterion( + threshold=0.5, + rubrics=rubrics, + judge_model_options=JudgeModelOptions( + judge_model_config=None, + num_samples=3, + ), + ) + metric = EvalMetric( + metric_name=PrebuiltMetrics.RUBRIC_BASED_MULTI_TURN_TRAJECTORY_QUALITY_V1.value, + threshold=0.5, + criterion=criterion, + ) + return RubricBasedMultiTurnTrajectoryEvaluator(metric) + + +def _make_invocation( + user_text: str, + agent_text: str | None = None, + invocation_id: str = "", + rubrics: list[Rubric] | None = None, + app_details: AppDetails | None = None, + intermediate_data: InvocationEvents | None = None, +) -> Invocation: + """Helper to build an Invocation.""" + return Invocation( + invocation_id=invocation_id, + user_content=genai_types.Content( + parts=[genai_types.Part(text=user_text)] + ), + final_response=( + genai_types.Content(parts=[genai_types.Part(text=agent_text)]) + if agent_text + else None + ), + rubrics=rubrics, + app_details=app_details, + intermediate_data=intermediate_data, + ) + + +class TestFormatAutoRaterPrompt: + """Tests for format_auto_rater_prompt.""" + + def test_basic_dialogue_and_rubrics_in_prompt(self): + """Tests that user dialogue and rubrics appear in the generated prompt.""" + evaluator = _make_evaluator() + invocation = _make_invocation( + user_text="What is the balance?", + agent_text="Your balance is $100.", + rubrics=_RUBRICS, + ) + # Simulate evaluate_invocations dialogue assembly by setting internal state. + evaluator._formatted_dialogue = "USER TURN 1: What is the balance?" + evaluator._formatted_instructions = "" + evaluator._formatted_tools = "" + + prompt = evaluator.format_auto_rater_prompt(invocation, None) + + assert "USER TURN 1: What is the balance?" in prompt + assert "The agent uses the correct tool." in prompt + assert "The agent fulfills the user intent." in prompt + assert "TOOL_USAGE" in prompt + assert "FULFILL_USER_INTENT" in prompt + + def test_prompt_includes_agent_instructions_and_tools(self): + """Tests that agent instructions and tools are inserted into the prompt.""" + evaluator = _make_evaluator() + invocation = _make_invocation( + user_text="Transfer funds", + rubrics=_RUBRICS, + ) + evaluator._formatted_dialogue = "USER TURN 1: Transfer funds" + evaluator._formatted_instructions = ( + "Agent banking_agent Instructions:\nYou are a banking assistant." + ) + evaluator._formatted_tools = ( + "Agent: banking_agent\n- transfer_funds: Transfer money between" + " accounts." + ) + + prompt = evaluator.format_auto_rater_prompt(invocation, None) + + assert "You are a banking assistant." in prompt + assert "transfer_funds" in prompt + + +class TestDialogueAssembly: + """Tests for the dialogue assembly logic in evaluate_invocations. + + These test the internal dialogue construction by calling evaluate_invocations + and inspecting self._formatted_dialogue. + """ + + @pytest.fixture + def evaluator(self): + return _make_evaluator() + + @pytest.mark.asyncio + async def test_single_turn_user_and_agent(self, evaluator): + """Tests that a single turn assembles user and agent dialogue.""" + invocations = [ + _make_invocation( + user_text="Hello", + agent_text="Hi there!", + invocation_id="agent1", + rubrics=_RUBRICS, + ), + ] + # We need to mock the super().evaluate_invocations call since it calls + # the LLM. Instead, we just test the dialogue assembly part directly. + evaluator._formatted_dialogue = None + + # Manually run the dialogue assembly portion + evaluator._assemble_dialogue_history(invocations) + + assert "USER TURN 1: Hello" in evaluator._formatted_dialogue + assert "AGENT (agent) TURN 1: Hi there!" in evaluator._formatted_dialogue + + @pytest.mark.asyncio + async def test_multi_turn_dialogue(self, evaluator): + """Tests dialogue assembly across multiple turns.""" + invocations = [ + _make_invocation( + user_text="Check my balance", + agent_text="Your balance is $100.", + invocation_id="agent1", + rubrics=_RUBRICS, + ), + _make_invocation( + user_text="Transfer $50", + agent_text="Transfer complete.", + invocation_id="agent1", + rubrics=_RUBRICS, + ), + ] + evaluator._assemble_dialogue_history(invocations) + + assert "USER TURN 1: Check my balance" in evaluator._formatted_dialogue + assert ( + "AGENT (agent) TURN 1: Your balance is $100." + in evaluator._formatted_dialogue + ) + assert "USER TURN 2: Transfer $50" in evaluator._formatted_dialogue + assert ( + "AGENT (agent) TURN 2: Transfer complete." + in evaluator._formatted_dialogue + ) + + @pytest.mark.asyncio + async def test_intermediate_events_with_function_calls(self, evaluator): + """Tests that intermediate function calls and responses appear in dialogue.""" + tool_call_part = genai_types.Part( + function_call=genai_types.FunctionCall( + name="get_balance", args={"account_id": "123"} + ) + ) + tool_response_part = genai_types.Part( + function_response=genai_types.FunctionResponse( + name="get_balance", response={"balance": 100} + ) + ) + intermediate_data = InvocationEvents( + invocation_events=[ + InvocationEvent( + author="banking_agent", + content=genai_types.Content(parts=[tool_call_part]), + ), + InvocationEvent( + author="banking_agent", + content=genai_types.Content(parts=[tool_response_part]), + ), + ] + ) + invocations = [ + _make_invocation( + user_text="What is my balance?", + agent_text="Your balance is $100.", + invocation_id="banking_agent", + rubrics=_RUBRICS, + intermediate_data=intermediate_data, + ), + ] + evaluator._assemble_dialogue_history(invocations) + + assert "get_balance" in evaluator._formatted_dialogue + assert '"account_id": "123"' in evaluator._formatted_dialogue + assert '"balance": 100' in evaluator._formatted_dialogue + + @pytest.mark.asyncio + async def test_app_details_instructions_and_tools(self, evaluator): + """Tests that app_details instructions and tools are captured.""" + tool = genai_types.Tool( + function_declarations=[ + genai_types.FunctionDeclaration( + name="transfer_funds", + description="Transfer money between accounts.", + ) + ] + ) + app_details = AppDetails( + agent_details={ + "banking_agent": AgentDetails( + name="banking_agent", + instructions="You are a banking assistant.", + tool_declarations=[tool], + ) + }, + ) + invocations = [ + _make_invocation( + user_text="Transfer $50", + agent_text="Done.", + invocation_id="banking_agent", + rubrics=_RUBRICS, + app_details=app_details, + ), + ] + evaluator._assemble_dialogue_history(invocations) + + assert "You are a banking assistant." in evaluator._formatted_instructions + assert "transfer_funds" in evaluator._formatted_tools + assert "Transfer money between accounts." in evaluator._formatted_tools + + @pytest.mark.asyncio + async def test_invocation_without_user_content(self, evaluator): + """Tests that invocations with no user text parts are handled gracefully.""" + invocations = [ + Invocation( + user_content=genai_types.Content(parts=[]), + final_response=genai_types.Content( + parts=[genai_types.Part(text="Agent response.")] + ), + invocation_id="agent1", + rubrics=_RUBRICS, + ), + ] + evaluator._assemble_dialogue_history(invocations) + + # No user turn should appear, but agent turn should + assert "USER TURN" not in evaluator._formatted_dialogue + assert ( + "AGENT (agent) TURN 1: Agent response." in evaluator._formatted_dialogue + ) From d3167aabfbe7c7044b1192e0537f88b9e096fa07 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Thu, 28 May 2026 17:02:35 -0700 Subject: [PATCH 37/94] chore: Provide a default value for the `author` field in Event PiperOrigin-RevId: 923053816 --- src/google/adk/events/event.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/google/adk/events/event.py b/src/google/adk/events/event.py index 51e30d91b0..fb3e9093f3 100644 --- a/src/google/adk/events/event.py +++ b/src/google/adk/events/event.py @@ -46,7 +46,7 @@ class Event(LlmResponse): invocation_id: str = '' """The invocation ID of the event. Should be non-empty before appending to a session.""" - author: str = '' + author: str """'user' or the name of the agent, indicating who appended the event to the session.""" actions: EventActions = Field(default_factory=EventActions) From 2084efc9cd35e35276217f93a68d84b78693a0ac Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Thu, 28 May 2026 17:11:53 -0700 Subject: [PATCH 38/94] ADK changes PiperOrigin-RevId: 923057784 --- src/google/adk/events/event.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/google/adk/events/event.py b/src/google/adk/events/event.py index fb3e9093f3..51e30d91b0 100644 --- a/src/google/adk/events/event.py +++ b/src/google/adk/events/event.py @@ -46,7 +46,7 @@ class Event(LlmResponse): invocation_id: str = '' """The invocation ID of the event. Should be non-empty before appending to a session.""" - author: str + author: str = '' """'user' or the name of the agent, indicating who appended the event to the session.""" actions: EventActions = Field(default_factory=EventActions) From 2e998d8261ed60388c7adecb52767e51a2caca97 Mon Sep 17 00:00:00 2001 From: Divyansh Shukla Date: Thu, 28 May 2026 17:53:23 -0700 Subject: [PATCH 39/94] feat(plugins): add AutoTracingPlugin for OpenTelemetry auto-instrumentation Monkey-patches in-scope Python functions to emit an OpenTelemetry span per call, capturing args/return/exception as span attributes. Scope is auto-discovered from the agent tree. No-op when the tracer is not recording. PiperOrigin-RevId: 923075244 --- .../adk/plugins/auto_tracing_helpers.py | 300 ++++++++++++ src/google/adk/plugins/auto_tracing_plugin.py | 177 +++++++ tests/unittests/plugins/BUILD | 16 + .../plugins/test_auto_tracing_plugin.py | 461 ++++++++++++++++++ 4 files changed, 954 insertions(+) create mode 100644 src/google/adk/plugins/auto_tracing_helpers.py create mode 100644 src/google/adk/plugins/auto_tracing_plugin.py create mode 100644 tests/unittests/plugins/BUILD create mode 100644 tests/unittests/plugins/test_auto_tracing_plugin.py diff --git a/src/google/adk/plugins/auto_tracing_helpers.py b/src/google/adk/plugins/auto_tracing_helpers.py new file mode 100644 index 0000000000..8a3a603ab7 --- /dev/null +++ b/src/google/adk/plugins/auto_tracing_helpers.py @@ -0,0 +1,300 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""AutoTracingPlugin helpers: arg capture, span attrs, tracing wrapper.""" + +from __future__ import annotations + +import asyncio +import dataclasses +import functools +import inspect +import logging +import re +from typing import Any +from typing import Callable +from typing import Sequence + +from opentelemetry import trace as trace_api + +logger = logging.getLogger("google_adk." + __name__) + +DEFAULT_MAX_REPR_LEN = 4096 +DEFAULT_MAX_RECORDED_YIELDS = 16 + +NamedArg = tuple[str, str] +WRAPPED_ATTR = "_adk_auto_tracing_wrapped" +_SELF_OR_CLS = frozenset({"self", "cls"}) +_SCALAR_TYPES = frozenset({int, float, bool, str, bytes, type(None)}) +_DEFAULT_REPR_RE = re.compile(r"^<.+ object at 0x[0-9a-fA-F]+>$") + + +@dataclasses.dataclass(frozen=True) +class Caps: + """Bounds for captured repr strings and recorded generator yields.""" + + max_repr_len: int = DEFAULT_MAX_REPR_LEN + max_recorded_yields: int = DEFAULT_MAX_RECORDED_YIELDS + + +class StreamResult: + """Capped sample (``items``) + true yield count (``total``) for a wrapped generator.""" + + def __init__(self, items: Sequence[Any], caps: Caps, total: int): + self._items = items + self._caps = caps + self._total = total + + def __repr__(self) -> str: + if self._total == 0: + return "" + sample = [safe_repr(it, self._caps) for it in self._items] + suffix = ( + f" ... + {self._total - len(sample)} more" + if self._total > len(sample) + else "" + ) + return ( + f"" + ) + + +def safe_repr(value: Any, caps: Caps) -> str: + """``repr(value)`` capped, resilient, with default-form objects summarized.""" + max_len = caps.max_repr_len + # Fast path: scalars never hit the default-repr regex or summary. + if type(value) in _SCALAR_TYPES: + r = repr(value) + return ( + r + if len(r) <= max_len + else r[:max_len] + f"...[{len(r) - max_len} more chars]" + ) + try: + r = repr(value) + except Exception as exc: # pylint: disable=broad-exception-caught + logger.warning( + "AutoTracingPlugin: repr() failed for %s: %s", + type(value).__name__, + exc, + ) + r = f"" + if _DEFAULT_REPR_RE.match(r): + r = _summarize_default(value) + if len(r) > max_len: + r = r[:max_len] + f"...[{len(r) - max_len} more chars]" + return r + + +def public_slot_names(cls: type) -> set[str]: + """Public attr names declared in ``__slots__`` across ``cls.__mro__``. + + Handles the ``__slots__ = "x"`` shorthand (must be treated as a single + name, not iterated as characters). + """ + names: set[str] = set() + for klass in cls.__mro__: + slots = getattr(klass, "__slots__", None) + if slots is None: + continue + if isinstance(slots, str): + slots = (slots,) + for slot in slots: + if slot and not slot.startswith("_"): + names.add(slot) + return names + + +def _summarize_default(value: Any) -> str: + """Replaces ```` with a public-field summary (handles ``__slots__``).""" + cls = type(value).__name__ + public: list[tuple[str, Any]] = [] + instance_dict = getattr(value, "__dict__", None) + if isinstance(instance_dict, dict): + public.extend( + (k, v) for k, v in instance_dict.items() if not k.startswith("_") + ) + for slot_name in public_slot_names(type(value)): + try: + public.append((slot_name, getattr(value, slot_name))) + except AttributeError: + continue + if not public: + return f"<{cls}>" + fields = [] + for k, v in public: + try: + vr = repr(v) + except Exception as exc: # pylint: disable=broad-exception-caught + logger.warning( + "AutoTracingPlugin: repr() failed for %s.%s (%s): %s", + cls, + k, + type(v).__name__, + exc, + ) + vr = f"" + fields.append(f"{k}={vr}") + return f"<{cls} fields={{{', '.join(fields)}}}>" + + +def positional_param_names(fn: Callable[..., Any]) -> tuple[str, ...]: + """Returns ``fn``'s positional parameter names; ``()`` if introspection fails.""" + try: + return tuple( + n + for n, p in inspect.signature(fn).parameters.items() + if p.kind + in ( + inspect.Parameter.POSITIONAL_ONLY, + inspect.Parameter.POSITIONAL_OR_KEYWORD, + ) + ) + except (TypeError, ValueError): + return () + + +def name_value_pairs( + param_names: Sequence[str], + args: tuple[Any, ...], + kwargs: dict[str, Any], + caps: Caps, +) -> list[NamedArg]: + """Returns ``[(name, repr)]`` for args + kwargs (no self/cls).""" + pairs: list[NamedArg] = [] + for i, v in enumerate(args): + name = param_names[i] if i < len(param_names) else f"arg{i}" + if name in _SELF_OR_CLS: + continue + pairs.append((name, safe_repr(v, caps))) + for k, v in kwargs.items(): + pairs.append((k, safe_repr(v, caps))) + return pairs + + +def record_io_on_span( + span: trace_api.Span, + pairs: Sequence[NamedArg], + result: Any, + exc: BaseException | None, + caps: Caps, +) -> None: + """Writes ``adk.fn.*`` attributes onto ``span`` for the call's IO.""" + s = span.set_attribute + for k, v in pairs: + s(f"adk.fn.arg.{k}", v) + if exc is not None: + s("adk.fn.exc_type", type(exc).__qualname__) + s("adk.fn.exc_repr", safe_repr(exc, caps)) + return + s("adk.fn.return", safe_repr(result, caps)) + + +def display_name_for(fn: Callable[..., Any]) -> str: + """Returns the short (Class.method or function) name for ``fn``.""" + qn = fn.__qualname__ + return ".".join(qn.split(".")[-2:]) if "." in qn else qn + + +def tracer_will_record(tracer: trace_api.Tracer) -> bool: + """True iff ``tracer`` will record (not a NoOpTracer).""" + return not isinstance(tracer, trace_api.NoOpTracer) + + +def build_tracing_wrapper( + fn: Callable[..., Any], + tracer: trace_api.Tracer, + caps: Caps, +) -> Callable[..., Any]: + """Returns a tracing wrapper for ``fn`` matching its sync/async/gen shape.""" + # A non-recording tracer never produces IO; don't pay span/context cost. + if not tracer_will_record(tracer): + return fn + + display_name = display_name_for(fn) + # inspect.signature is expensive; resolve once at wrap time. + param_names = positional_param_names(fn) + yield_cap = caps.max_recorded_yields + + def _finish(span, args, kwargs, result, exc): + if not span.is_recording(): + return + pairs = name_value_pairs(param_names, args, kwargs, caps) + record_io_on_span(span, pairs, result, exc, caps) + + @functools.wraps(fn) + async def async_wrapper(*args, **kwargs): + with tracer.start_as_current_span(display_name) as span: + try: + r = await fn(*args, **kwargs) + except BaseException as exc: + _finish(span, args, kwargs, None, exc) + raise + _finish(span, args, kwargs, r, None) + return r + + @functools.wraps(fn) + async def async_gen_wrapper(*args, **kwargs): + with tracer.start_as_current_span(display_name) as span: + items: list[Any] = [] + total = 0 + try: + async for item in fn(*args, **kwargs): + total += 1 + if len(items) < yield_cap: + items.append(item) + yield item + except BaseException as exc: + _finish(span, args, kwargs, StreamResult(items, caps, total), exc) + raise + _finish(span, args, kwargs, StreamResult(items, caps, total), None) + + @functools.wraps(fn) + def gen_wrapper(*args, **kwargs): + with tracer.start_as_current_span(display_name) as span: + items: list[Any] = [] + total = 0 + try: + for item in fn(*args, **kwargs): + total += 1 + if len(items) < yield_cap: + items.append(item) + yield item + except BaseException as exc: + _finish(span, args, kwargs, StreamResult(items, caps, total), exc) + raise + _finish(span, args, kwargs, StreamResult(items, caps, total), None) + + @functools.wraps(fn) + def sync_wrapper(*args, **kwargs): + with tracer.start_as_current_span(display_name) as span: + try: + r = fn(*args, **kwargs) + except BaseException as exc: + _finish(span, args, kwargs, None, exc) + raise + _finish(span, args, kwargs, r, None) + return r + + if inspect.isasyncgenfunction(fn): + wrapper = async_gen_wrapper + elif asyncio.iscoroutinefunction(fn): + wrapper = async_wrapper + elif inspect.isgeneratorfunction(fn): + wrapper = gen_wrapper + else: + wrapper = sync_wrapper + setattr(wrapper, WRAPPED_ATTR, True) + return wrapper diff --git a/src/google/adk/plugins/auto_tracing_plugin.py b/src/google/adk/plugins/auto_tracing_plugin.py new file mode 100644 index 0000000000..f5a3ad4884 --- /dev/null +++ b/src/google/adk/plugins/auto_tracing_plugin.py @@ -0,0 +1,177 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Monkey-patches Python fns to emit OpenTelemetry spans.""" + +from __future__ import annotations + +import inspect +import logging +import sys +import threading +from typing import TYPE_CHECKING + +from opentelemetry import trace +from typing_extensions import override + +from . import auto_tracing_helpers +from .base_plugin import BasePlugin + +if TYPE_CHECKING: + from ..agents.invocation_context import InvocationContext + +logger = logging.getLogger("google_adk." + __name__) + +DEFAULT_MAX_WALK_DEPTH = 30 + +_ATOMIC_TYPES = (str, bytes, int, float, bool, type(None)) + + +class AutoTracingPlugin(BasePlugin): + """Auto-instruments in-scope Python functions with OpenTelemetry spans.""" + + def __init__( + self, + *, + name: str = "AutoTracingPlugin", + extra_scope_prefixes: tuple[str, ...] = (), + tracer: trace.Tracer | None = None, + max_repr_len: int = auto_tracing_helpers.DEFAULT_MAX_REPR_LEN, + max_recorded_yields: int = auto_tracing_helpers.DEFAULT_MAX_RECORDED_YIELDS, + max_walk_depth: int = DEFAULT_MAX_WALK_DEPTH, + ): + super().__init__(name=name) + self._scope_prefixes = tuple(extra_scope_prefixes) + self._tracer = tracer or trace.get_tracer(__name__) + self._caps = auto_tracing_helpers.Caps( + max_repr_len=max_repr_len, + max_recorded_yields=max_recorded_yields, + ) + self._max_walk_depth = max_walk_depth + self._tracer_eligible = auto_tracing_helpers.tracer_will_record( + self._tracer + ) + self._lock = threading.Lock() + self._wrapped_modules: set[str] = set() + + @override + async def before_run_callback( + self, *, invocation_context: "InvocationContext" + ) -> None: + if not self._tracer_eligible: + return + with self._lock: + self._add_agent_scope(invocation_context) + for name in list(sys.modules): + if name in self._wrapped_modules or name == __name__: + continue + if not name.startswith(self._scope_prefixes): + continue + module = sys.modules.get(name) + if module is None: + continue + try: + self._wrap_module(module) + except Exception: # pylint: disable=broad-exception-caught + logger.exception("AutoTracingPlugin: failed to instrument %s", name) + self._wrapped_modules.add(name) + + def _add_agent_scope(self, invocation_context): + """Adds packages of every object reachable from the invocation.""" + seen, packages = set(), set() + max_depth = self._max_walk_depth + + def walk(obj, depth): + if obj is None: + return + if depth > max_depth or id(obj) in seen: + return + if isinstance(obj, _ATOMIC_TYPES): + return + seen.add(id(obj)) + module = getattr(obj, "__module__", None) or getattr( + getattr(obj, "func", None), + "__module__", + None, + ) + if module: + # Top-level "mod" needs both "mod" and "mod." to match name.startswith. + if "." in module: + packages.add(module.rsplit(".", 1)[0] + ".") + else: + packages.add(module) + packages.add(module + ".") + if isinstance(obj, (list, tuple, set, frozenset)): + for item in obj: + walk(item, depth + 1) + return + if isinstance(obj, dict): + for item in obj.values(): + walk(item, depth + 1) + return + # Avoid getattr on instance __dict__ so @property / lazy descriptors don't fire. + instance_dict = getattr(obj, "__dict__", None) + if isinstance(instance_dict, dict): + for attr_name, value in instance_dict.items(): + if not attr_name.startswith("_"): + walk(value, depth + 1) + for slot_name in auto_tracing_helpers.public_slot_names(type(obj)): + try: + value = getattr(obj, slot_name) + except AttributeError: + continue + walk(value, depth + 1) + + walk(getattr(invocation_context, "agent", None), 0) + new = tuple(sorted(packages - set(self._scope_prefixes))) + if new: + self._scope_prefixes = self._scope_prefixes + new + + def _wrap_module(self, module): + module_name = module.__name__ + for attr_name, attr in inspect.getmembers(module): + if attr_name.startswith("_"): + continue + if getattr(attr, "__module__", "") != module_name: + continue + if inspect.isfunction(attr): + self._rebind(module, attr_name, attr) + elif inspect.isclass(attr): + for member_name, member in inspect.getmembers(attr): + if member_name.startswith("__"): + continue + if not inspect.isfunction(member): + continue + if getattr(member, "__module__", "") != module_name: + continue + self._rebind(attr, member_name, member) + + def _rebind(self, owner, name, fn): + if getattr(fn, auto_tracing_helpers.WRAPPED_ATTR, False): + return + try: + setattr( + owner, + name, + auto_tracing_helpers.build_tracing_wrapper( + fn, self._tracer, self._caps + ), + ) + except (AttributeError, TypeError) as exc: + logger.info( + "AutoTracingPlugin: cannot rebind %s.%s: %s", + getattr(owner, "__qualname__", owner), + name, + exc, + ) diff --git a/tests/unittests/plugins/BUILD b/tests/unittests/plugins/BUILD new file mode 100644 index 0000000000..1d62ca4473 --- /dev/null +++ b/tests/unittests/plugins/BUILD @@ -0,0 +1,16 @@ +load("//third_party/py/pytest:pytest_defs.bzl", "pytest_test") + +package( + default_applicable_licenses = ["//third_party/py/google/adk:package_license"], + default_visibility = ["//visibility:private"], +) + +pytest_test( + name = "test_auto_tracing_plugin", + srcs = ["test_auto_tracing_plugin.py"], + deps = [ + "//third_party/py/google/adk", + "//third_party/py/opentelemetry:opentelemetry_api", + "//third_party/py/opentelemetry:opentelemetry_sdk", + ], +) diff --git a/tests/unittests/plugins/test_auto_tracing_plugin.py b/tests/unittests/plugins/test_auto_tracing_plugin.py new file mode 100644 index 0000000000..a21fb9eea3 --- /dev/null +++ b/tests/unittests/plugins/test_auto_tracing_plugin.py @@ -0,0 +1,461 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import asyncio +import sys +import types +from typing import Any +from unittest import mock + +from google.adk.plugins import auto_tracing_helpers +from google.adk.plugins import auto_tracing_plugin +from opentelemetry.sdk import trace as trace_sdk +from opentelemetry.sdk.trace import export as trace_export +from opentelemetry.sdk.trace.export import in_memory_span_exporter +import pytest + +_FIXTURE_MODULE_NAME = ( + "google.adk.tests.unittests.plugins.synthetic_test_fixture" +) + + +def _sync_fn(x: int) -> int: + return x + 1 + + +async def _async_fn(x: int) -> int: + return x * 2 + + +def _build_fixture_module() -> types.ModuleType: + module = types.ModuleType(_FIXTURE_MODULE_NAME) + module.__name__ = _FIXTURE_MODULE_NAME + for fn in (_sync_fn, _async_fn): + fn.__module__ = _FIXTURE_MODULE_NAME + + def _method(unused_self, x: int) -> int: + return x - 1 + + async def _async_method(unused_self, x: int) -> int: + return x + 10 + + _method.__module__ = _FIXTURE_MODULE_NAME + _async_method.__module__ = _FIXTURE_MODULE_NAME + cls = type("C", (), {"method": _method, "async_method": _async_method}) + cls.__module__ = _FIXTURE_MODULE_NAME + + module.sync_fn = _sync_fn + module.async_fn = _async_fn + module.C = cls + return module + + +def _install_module(name: str, fn) -> types.ModuleType: + mod = types.ModuleType(name) + mod.__name__ = name + fn.__module__ = name + mod.fn = fn + sys.modules[name] = mod + return mod + + +def _run_sync(module): + return module.sync_fn(7) + + +def _run_async(module): + return asyncio.run(module.async_fn(4)) + + +def _run_class_method(module): + return module.C().method(5) + + +def _run_class_async_method(module): + return asyncio.run(module.C().async_method(5)) + + +class _Ctx: + + def __init__(self, agent): + self.agent = agent + + +def _build_slot_agent(module: str, slots, attr: str, value): + cls = type("_Agent", (), {"__slots__": slots, "__module__": module}) + obj = cls() + setattr(obj, attr, value) + return obj + + +def _sub_helper(): + return 7 + + +@pytest.fixture +def fixture(): + exporter = in_memory_span_exporter.InMemorySpanExporter() + provider = trace_sdk.TracerProvider() + provider.add_span_processor(trace_export.SimpleSpanProcessor(exporter)) + tracer = provider.get_tracer("test") + module = _build_fixture_module() + sys.modules[_FIXTURE_MODULE_NAME] = module + yield types.SimpleNamespace(exporter=exporter, tracer=tracer, module=module) + sys.modules.pop(_FIXTURE_MODULE_NAME, None) + + +def _span_names(exporter) -> list[str]: + return [s.name for s in exporter.get_finished_spans()] + + +def _attrs_for(exporter, substr: str) -> dict[str, Any]: + matches = [ + dict(s.attributes or {}) + for s in exporter.get_finished_spans() + if substr in s.name + ] + assert matches, f"no span matched {substr!r} in {_span_names(exporter)}" + return matches[0] + + +def _instrument( + tracer, scope_prefixes=(_FIXTURE_MODULE_NAME,) +) -> auto_tracing_plugin.AutoTracingPlugin: + plugin = auto_tracing_plugin.AutoTracingPlugin( + tracer=tracer, extra_scope_prefixes=scope_prefixes + ) + asyncio.run(plugin.before_run_callback(invocation_context=None)) + return plugin + + +@pytest.mark.parametrize( + "run_fn,expected_substr", + [ + (_run_sync, "_sync_fn"), + (_run_async, "_async_fn"), + (_run_class_method, "._method"), + (_run_class_async_method, "._async_method"), + ], +) +def test_emits_span(fixture, run_fn, expected_substr): + _instrument(fixture.tracer) + run_fn(fixture.module) + assert any( + expected_substr in n for n in _span_names(fixture.exporter) + ), f"missing {expected_substr!r} in {_span_names(fixture.exporter)}" + + +@pytest.mark.parametrize( + "run_fn,expected_substr,expected_attrs", + [ + ( + _run_sync, + "_sync_fn", + {"adk.fn.arg.x": "7", "adk.fn.return": "8"}, + ), + (_run_async, "_async_fn", {"adk.fn.return": "8"}), + ], +) +def test_records_io(fixture, run_fn, expected_substr, expected_attrs): + _instrument(fixture.tracer) + run_fn(fixture.module) + attrs = _attrs_for(fixture.exporter, expected_substr) + assert {k: attrs.get(k) for k in expected_attrs} == expected_attrs + + +@pytest.mark.parametrize("attr", ["sync_fn", "async_fn"]) +def test_repeat_instrument_is_idempotent(fixture, attr): + plugin = _instrument(fixture.tracer) + first = getattr(fixture.module, attr) + asyncio.run(plugin.before_run_callback(invocation_context=None)) + assert getattr(fixture.module, attr) is first + + +@pytest.mark.parametrize("attr", ["sync_fn", "async_fn"]) +def test_wrapper_marker_is_true(fixture, attr): + _instrument(fixture.tracer) + assert ( + getattr(getattr(fixture.module, attr), auto_tracing_helpers.WRAPPED_ATTR) + is True + ) + + +def test_out_of_scope_module_is_not_instrumented(fixture): + name = "auto_tracing_plugin_test_not_in_scope" + mod = _install_module(name, lambda: 42) + try: + _instrument(fixture.tracer) + mod.fn() + assert f"{name}.fn" not in _span_names(fixture.exporter) + finally: + sys.modules.pop(name, None) + + +def test_records_exception(fixture): + name = "auto_tracing_plugin_test_boom" + + def boom(): + raise ValueError("kaboom") + + mod = _install_module(name, boom) + try: + _instrument(fixture.tracer, scope_prefixes=(name,)) + with pytest.raises(ValueError, match="kaboom"): + mod.fn() + attrs = _attrs_for(fixture.exporter, "boom") + assert attrs.get("adk.fn.exc_type") == "ValueError" + assert "kaboom" in attrs.get("adk.fn.exc_repr", "") + finally: + sys.modules.pop(name, None) + + +def test_walk_returns_quickly_on_none_agent(fixture): + plugin = auto_tracing_plugin.AutoTracingPlugin(tracer=fixture.tracer) + asyncio.run(plugin.before_run_callback(invocation_context=_Ctx(None))) + assert _span_names(fixture.exporter) == [] + + +def test_add_agent_scope_picks_up_agent_package(fixture): + pkg = "auto_tracing_plugin_test_agent_pkg" + mod_name = f"{pkg}.helpers" + + def helper(): + return 99 + + mod = _install_module(mod_name, helper) + try: + + class _Agent: + __module__ = f"{pkg}.agent" + + plugin = auto_tracing_plugin.AutoTracingPlugin(tracer=fixture.tracer) + asyncio.run(plugin.before_run_callback(invocation_context=_Ctx(_Agent()))) + mod.fn() + assert any("helper" in n for n in _span_names(fixture.exporter)), ( + f"agent pkg {pkg!r} was not absorbed;" + f" spans={_span_names(fixture.exporter)}" + ) + finally: + sys.modules.pop(mod_name, None) + + +@pytest.mark.parametrize( + "pkg,slots", + [ + ("auto_tracing_plugin_test_slots_pkg", ("child",)), + ("auto_tracing_plugin_test_str_slot_pkg", "child"), + ], +) +def test_add_agent_scope_walks_slots_attrs(fixture, pkg, slots): + sub_mod_name = f"{pkg}.sub" + mod = _install_module(sub_mod_name, _sub_helper) + try: + sub = type("_Sub", (), {"__module__": sub_mod_name})() + agent = _build_slot_agent(f"{pkg}.agent", slots, "child", sub) + plugin = auto_tracing_plugin.AutoTracingPlugin(tracer=fixture.tracer) + asyncio.run(plugin.before_run_callback(invocation_context=_Ctx(agent))) + mod.fn() + assert any("_sub_helper" in n for n in _span_names(fixture.exporter)), ( + f"slot-referenced pkg {pkg!r} was not absorbed;" + f" spans={_span_names(fixture.exporter)}" + ) + finally: + sys.modules.pop(sub_mod_name, None) + + +def test_add_agent_scope_does_not_fire_property_descriptors(fixture): + fired: list[str] = [] + + class _Agent: + __module__ = "auto_tracing_plugin_test_no_descriptor_pkg.agent" + + @property + def expensive(self): + fired.append("expensive") + raise RuntimeError("should never be invoked during scope walk") + + plugin = auto_tracing_plugin.AutoTracingPlugin(tracer=fixture.tracer) + asyncio.run(plugin.before_run_callback(invocation_context=_Ctx(_Agent()))) + assert fired == [], f"@property fired during agent-scope walk: {fired!r}" + + +def test_module_removed_mid_iteration_does_not_log_exception(fixture): + name = "auto_tracing_plugin_test_disappearing" + _install_module(name, lambda: 1) + try: + plugin = auto_tracing_plugin.AutoTracingPlugin( + tracer=fixture.tracer, extra_scope_prefixes=(name,) + ) + + class _DroppingModules(dict): + + def get(self, key, default=None): + if key == name: + return None + return super().get(key, default) + + dropping = _DroppingModules(sys.modules) + with ( + mock.patch.object( + auto_tracing_plugin.logger, "exception", autospec=True + ) as log_exc, + mock.patch.object(auto_tracing_plugin.sys, "modules", new=dropping), + ): + asyncio.run(plugin.before_run_callback(invocation_context=None)) + assert ( + not log_exc.called + ), f"unexpected logger.exception calls: {log_exc.call_args_list}" + assert name not in plugin._wrapped_modules + finally: + sys.modules.pop(name, None) + + +def test_repeat_instrument_does_not_rewrap(fixture): + plugin = _instrument(fixture.tracer) + assert getattr( + fixture.module.sync_fn, auto_tracing_helpers.WRAPPED_ATTR, False + ) + assert _FIXTURE_MODULE_NAME in plugin._wrapped_modules + with mock.patch.object(plugin, "_wrap_module", autospec=True) as wrap_module: + asyncio.run(plugin.before_run_callback(invocation_context=None)) + wrap_module.assert_not_called() + + +class _Slotted: + __slots__ = ("a", "b") + + def __init__(self): + self.a = 1 + self.b = "x" + + +class _Bare: + __slots__ = () + + +@pytest.mark.parametrize( + "instance,expected_substrings", + [ + (_Slotted(), ("_Slotted", "a=1", "b='x'")), + (_Bare(), ("<_Bare>",)), + ], +) +def test_summarize_default(instance, expected_substrings): + rendered = auto_tracing_helpers.safe_repr( + instance, auto_tracing_helpers.Caps() + ) + for s in expected_substrings: + assert s in rendered, rendered + + +def test_add_agent_scope_picks_up_top_level_module(fixture): + top_mod_name = "auto_tracing_plugin_test_top_level_pkg" + + def top_helper(): + return 1 + + mod = _install_module(top_mod_name, top_helper) + try: + + class _Agent: + __module__ = top_mod_name + + plugin = auto_tracing_plugin.AutoTracingPlugin(tracer=fixture.tracer) + asyncio.run(plugin.before_run_callback(invocation_context=_Ctx(_Agent()))) + mod.fn() + assert any("top_helper" in n for n in _span_names(fixture.exporter)), ( + f"top-level module {top_mod_name!r} not absorbed;" + f" spans={_span_names(fixture.exporter)}" + ) + finally: + sys.modules.pop(top_mod_name, None) + + +def test_signature_introspection_happens_once_per_wrap(fixture): + with mock.patch.object( + auto_tracing_helpers.inspect, "signature", autospec=True + ) as sig: + sig.side_effect = auto_tracing_helpers.inspect.signature + _instrument(fixture.tracer) + wrap_calls = sig.call_count + for _ in range(5): + _run_sync(fixture.module) + _run_async(fixture.module) + assert ( + sig.call_count == wrap_calls + ), f"inspect.signature called per-call: {wrap_calls} -> {sig.call_count}" + + +def test_async_gen_caps_buffered_items(fixture): + cap = 3 + total_yields = 100 + name = "auto_tracing_plugin_test_async_gen_cap" + + async def producer(): + for i in range(total_yields): + yield i + + mod = _install_module(name, producer) + try: + plugin = auto_tracing_plugin.AutoTracingPlugin( + tracer=fixture.tracer, + extra_scope_prefixes=(name,), + max_recorded_yields=cap, + ) + asyncio.run(plugin.before_run_callback(invocation_context=None)) + + async def drive(): + seen = [] + async for x in mod.fn(): + seen.append(x) + return seen + + out = asyncio.run(drive()) + assert out == list(range(total_yields)) + attrs = _attrs_for(fixture.exporter, "producer") + rendered = attrs.get("adk.fn.return", "") + assert f"{total_yields} items yielded" in rendered, rendered + assert f"first {cap}:" in rendered, rendered + assert f"+ {total_yields - cap} more" in rendered, rendered + finally: + sys.modules.pop(name, None) + + +def test_sync_gen_caps_buffered_items(fixture): + cap = 2 + total_yields = 50 + name = "auto_tracing_plugin_test_sync_gen_cap" + + def producer(): + for i in range(total_yields): + yield i + + mod = _install_module(name, producer) + try: + plugin = auto_tracing_plugin.AutoTracingPlugin( + tracer=fixture.tracer, + extra_scope_prefixes=(name,), + max_recorded_yields=cap, + ) + asyncio.run(plugin.before_run_callback(invocation_context=None)) + out = list(mod.fn()) + assert out == list(range(total_yields)) + attrs = _attrs_for(fixture.exporter, "producer") + rendered = attrs.get("adk.fn.return", "") + assert f"{total_yields} items yielded" in rendered, rendered + assert f"first {cap}:" in rendered, rendered + finally: + sys.modules.pop(name, None) From ae444357bab8d2e9dc21f321b57e92f9456c83dd Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Fri, 29 May 2026 09:49:04 -0700 Subject: [PATCH 40/94] perf(flows): resolve agent tool unions in parallel `_process_agent_tools` previously walked `agent.tools` serially, awaiting `_convert_tool_union_to_tools` for each entry in turn. For toolsets this calls `get_tools_with_prefix`, which can perform I/O (e.g. MCP `list_tools` over the network), so the total wall-clock cost stacks linearly with the number of toolsets. Dispatch every `_convert_tool_union_to_tools` call concurrently via `asyncio.gather` so those listings overlap. The subsequent `process_llm_request` calls are intentionally kept serial and in the original `agent.tools` order: several built-in tools read or write `llm_request` state (e.g. `GoogleSearchTool` writes `llm_request.model`; `ComputerUseToolset` performs an idempotency check on `llm_request.config.tools`) and rely on observing the post-state of earlier tools. Add two unit tests pinning down the new contract: one asserts concurrent dispatch via a shared `asyncio.Event` gate (would hang if still serial); the other asserts `process_llm_request` invocation order still matches `agent.tools` order even when later unions resolve first. PiperOrigin-RevId: 923464172 --- .../adk/flows/llm_flows/base_llm_flow.py | 36 +++-- .../flows/llm_flows/test_base_llm_flow.py | 129 ++++++++++++++++++ 2 files changed, 155 insertions(+), 10 deletions(-) diff --git a/src/google/adk/flows/llm_flows/base_llm_flow.py b/src/google/adk/flows/llm_flows/base_llm_flow.py index da3245e4d4..af70bf8d41 100644 --- a/src/google/adk/flows/llm_flows/base_llm_flow.py +++ b/src/google/adk/flows/llm_flows/base_llm_flow.py @@ -419,6 +419,12 @@ async def _process_agent_tools( instances, and calls ``process_llm_request`` on each to register tool declarations in the request. + Tool-union resolution is dispatched concurrently via ``asyncio.gather`` + to overlap I/O-bound listings. The subsequent ``process_llm_request`` + calls are kept serial in the original ``agent.tools`` order, as some + tools read/write ``llm_request`` state and rely on observing the + post-state of earlier tools. + After this function returns, ``llm_request.tools_dict`` maps tool names to ``BaseTool`` instances ready for function call dispatch. @@ -428,12 +434,30 @@ async def _process_agent_tools( llm_request: The LLM request to populate with tool declarations. """ agent = invocation_context.agent - if not hasattr(agent, 'tools') or not agent.tools: + if agent is None or not hasattr(agent, 'tools') or not agent.tools: return multiple_tools = len(agent.tools) > 1 model = agent.canonical_model - for tool_union in agent.tools: + + from ...agents.llm_agent import _convert_tool_union_to_tools + + # Resolve tool_unions in parallel. `asyncio.gather` preserves input order + # for the serial commit phase below and propagates exceptions immediately. + resolved_tools_per_union = await asyncio.gather(*( + _convert_tool_union_to_tools( + tool_union, + ReadonlyContext(invocation_context), + model, + multiple_tools, + ) + for tool_union in agent.tools + )) + + # Serial commit phase, in original agent.tools order. Mutations to + # ``llm_request`` and reads of its state (model, config.tools, + # tools_dict) preserve today's ordering semantics exactly. + for tool_union, tools in zip(agent.tools, resolved_tools_per_union): tool_context = ToolContext(invocation_context) # If it's a toolset, process it first @@ -442,15 +466,7 @@ async def _process_agent_tools( tool_context=tool_context, llm_request=llm_request ) - from ...agents.llm_agent import _convert_tool_union_to_tools - # Then process all tools from this tool union - tools = await _convert_tool_union_to_tools( - tool_union, - ReadonlyContext(invocation_context), - model, - multiple_tools, - ) for tool in tools: await tool.process_llm_request( tool_context=tool_context, llm_request=llm_request diff --git a/tests/unittests/flows/llm_flows/test_base_llm_flow.py b/tests/unittests/flows/llm_flows/test_base_llm_flow.py index cb60e7f1f6..4b6d198c6f 100644 --- a/tests/unittests/flows/llm_flows/test_base_llm_flow.py +++ b/tests/unittests/flows/llm_flows/test_base_llm_flow.py @@ -14,6 +14,7 @@ """Unit tests for BaseLlmFlow toolset integration.""" +import asyncio from unittest import mock from unittest.mock import AsyncMock @@ -243,6 +244,134 @@ def _my_tool(sides: int) -> int: ) +@pytest.mark.asyncio +async def test_process_agent_tools_resolves_unions_in_parallel(): + """``_convert_tool_union_to_tools`` is dispatched for every tool_union concurrently. + + Each mocked resolution blocks until ``all_started`` is set; the event is + only set once every call has been entered. If ``_process_agent_tools`` + were still serial, the first call would block forever waiting for the + event the second call hasn't yet entered to set. + """ + num_tools = 5 + started_count = 0 + all_started = asyncio.Event() + release = asyncio.Event() + + async def blocking_convert(tool_union, *args, **kwargs): + del args, kwargs + nonlocal started_count + started_count += 1 + if started_count == num_tools: + all_started.set() + await release.wait() + return [_AsyncProcessLlmRequestTool(name=tool_union.__name__)] + + def _make_func(i): + def _f(): + return i + + _f.__name__ = f'fn_{i}' + return _f + + funcs = [_make_func(i) for i in range(num_tools)] + + with mock.patch( + 'google.adk.agents.llm_agent._convert_tool_union_to_tools', + side_effect=blocking_convert, + autospec=True, + spec_set=True, + ): + agent = Agent(name='test_agent', tools=funcs) + invocation_context = await testing_utils.create_invocation_context( + agent=agent, user_content='test message' + ) + flow = BaseLlmFlowForTesting() + llm_request = LlmRequest() + + async def drive(): + async for _ in flow._preprocess_async(invocation_context, llm_request): + pass + + drive_task = asyncio.create_task(drive()) + try: + # If resolution were serial this would hang; release the gate as + # soon as every coroutine has entered. + await asyncio.wait_for(all_started.wait(), timeout=5.0) + finally: + release.set() + await asyncio.wait_for(drive_task, timeout=5.0) + + assert started_count == num_tools + + +@pytest.mark.asyncio +async def test_process_agent_tools_preserves_order_when_later_unions_resolve_first(): + """Test that process_agent_tools preserves order when later unions resolve first. + + Even if a tool later in the agent.tools list resolves faster than an earlier + tool, process_llm_request must be invoked in the original agent.tools order. + """ + + resolution_started_evt = [asyncio.Event(), asyncio.Event()] + process_call_order: list[str] = [] + + async def staggered_convert(tool_union, *args, **kwargs): + del args, kwargs + if tool_union.__name__ == 'fn_slow': + # Resolve only after fn_fast's resolution has completed. + await resolution_started_evt[1].wait() + tool_name = 'slow_tool' + else: + tool_name = 'fast_tool' + resolution_started_evt[1].set() + return [ + _AsyncProcessLlmRequestTool( + name=tool_name, on_process=process_call_order.append + ) + ] + + def fn_slow(): + return 0 + + def fn_fast(): + return 0 + + with mock.patch( + 'google.adk.agents.llm_agent._convert_tool_union_to_tools', + side_effect=staggered_convert, + autospec=True, + spec_set=True, + ): + # agent.tools order is [slow, fast]; resolution completes [fast, slow]. + agent = Agent(name='test_agent', tools=[fn_slow, fn_fast]) + invocation_context = await testing_utils.create_invocation_context( + agent=agent, user_content='test message' + ) + flow = BaseLlmFlowForTesting() + llm_request = LlmRequest() + + async for _ in flow._preprocess_async(invocation_context, llm_request): + pass + + # Even though fast_tool was resolved first, process_llm_request must + # be invoked in agent.tools order (slow_tool first). + assert process_call_order == ['slow_tool', 'fast_tool'] + + +class _AsyncProcessLlmRequestTool: + """Minimal stand-in for a BaseTool that records process_llm_request calls.""" + + def __init__(self, name: str, on_process=None): + self.name = name + self._on_process = on_process + + async def process_llm_request(self, *, tool_context, llm_request): + del tool_context, llm_request + if self._on_process is not None: + self._on_process(self.name) + + # TODO(b/448114567): Remove the following # test_handle_after_model_callback_grounding tests once the workaround # is no longer needed. From 3b7d7a73340da2022b3a24999292fde86f61713c Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Mon, 1 Jun 2026 10:11:05 -0700 Subject: [PATCH 41/94] feat: Preserved A2A message metadata field into ADK event PiperOrigin-RevId: 924774446 --- .../adk/a2a/converters/part_converter.py | 106 ++++++++++++------ .../a2a/converters/test_part_converter.py | 46 ++++++++ .../unittests/agents/test_remote_a2a_agent.py | 2 + 3 files changed, 119 insertions(+), 35 deletions(-) diff --git a/src/google/adk/a2a/converters/part_converter.py b/src/google/adk/a2a/converters/part_converter.py index cb7eb688cd..94122c20ba 100644 --- a/src/google/adk/a2a/converters/part_converter.py +++ b/src/google/adk/a2a/converters/part_converter.py @@ -64,7 +64,9 @@ def convert_a2a_part_to_genai_part( thought = None if part.metadata: thought = part.metadata.get(_get_adk_metadata_key('thought')) - return genai_types.Part(text=part.text, thought=thought) + return genai_types.Part( + text=part.text, thought=thought, part_metadata=part.metadata + ) if isinstance(part, a2a_types.FilePart): if isinstance(part.file, a2a_types.FileWithUri): @@ -73,7 +75,8 @@ def convert_a2a_part_to_genai_part( file_uri=part.file.uri, mime_type=part.file.mime_type, display_name=part.file.name, - ) + ), + part_metadata=part.metadata, ) elif isinstance(part.file, a2a_types.FileWithBytes): @@ -82,7 +85,8 @@ def convert_a2a_part_to_genai_part( data=base64.b64decode(part.file.bytes), mime_type=part.file.mime_type, display_name=part.file.name, - ) + ), + part_metadata=part.metadata, ) else: logger.warning( @@ -126,6 +130,7 @@ def convert_a2a_part_to_genai_part( part.data, by_alias=True ), thought_signature=thought_signature, + part_metadata=part.metadata, ) if ( part.metadata[_get_adk_metadata_key(A2A_DATA_PART_METADATA_TYPE_KEY)] @@ -134,7 +139,8 @@ def convert_a2a_part_to_genai_part( return genai_types.Part( function_response=genai_types.FunctionResponse.model_validate( part.data, by_alias=True - ) + ), + part_metadata=part.metadata, ) if ( part.metadata[_get_adk_metadata_key(A2A_DATA_PART_METADATA_TYPE_KEY)] @@ -143,7 +149,8 @@ def convert_a2a_part_to_genai_part( return genai_types.Part( code_execution_result=genai_types.CodeExecutionResult.model_validate( part.data, by_alias=True - ) + ), + part_metadata=part.metadata, ) if ( part.metadata[_get_adk_metadata_key(A2A_DATA_PART_METADATA_TYPE_KEY)] @@ -152,7 +159,8 @@ def convert_a2a_part_to_genai_part( return genai_types.Part( executable_code=genai_types.ExecutableCode.model_validate( part.data, by_alias=True - ) + ), + part_metadata=part.metadata, ) return genai_types.Part( inline_data=genai_types.Blob( @@ -162,7 +170,8 @@ def convert_a2a_part_to_genai_part( ) + A2A_DATA_PART_END_TAG, mime_type=A2A_DATA_PART_TEXT_MIME_TYPE, - ) + ), + part_metadata=part.metadata, ) logger.warning( @@ -179,22 +188,34 @@ def convert_genai_part_to_a2a_part( ) -> Optional[a2a_types.Part]: """Convert a Google GenAI Part to an A2A Part.""" + def add_metadata_to_a2a_part( + a2a_part: a2a_types.Part, + metadata: dict[str, Any], + ) -> None: + """Adds metadata to an A2A part.""" + if a2a_part.metadata is None: + a2a_part.metadata = {} + a2a_part.metadata.update(metadata) + if part.text is not None: a2a_part = a2a_types.TextPart(text=part.text) if part.thought is not None: a2a_part.metadata = {_get_adk_metadata_key('thought'): part.thought} + if part.part_metadata: + add_metadata_to_a2a_part(a2a_part, part.part_metadata) return a2a_types.Part(root=a2a_part) if part.file_data: - return a2a_types.Part( - root=a2a_types.FilePart( - file=a2a_types.FileWithUri( - uri=part.file_data.file_uri, - mime_type=part.file_data.mime_type, - name=part.file_data.display_name, - ) + a2a_part = a2a_types.FilePart( + file=a2a_types.FileWithUri( + uri=part.file_data.file_uri, + mime_type=part.file_data.mime_type, + name=part.file_data.display_name, ) ) + if part.part_metadata: + add_metadata_to_a2a_part(a2a_part, part.part_metadata) + return a2a_types.Part(root=a2a_part) if part.inline_data: if ( @@ -203,13 +224,14 @@ def convert_genai_part_to_a2a_part( and part.inline_data.data.startswith(A2A_DATA_PART_START_TAG) and part.inline_data.data.endswith(A2A_DATA_PART_END_TAG) ): - return a2a_types.Part( - root=a2a_types.DataPart.model_validate_json( - part.inline_data.data[ - len(A2A_DATA_PART_START_TAG) : -len(A2A_DATA_PART_END_TAG) - ] - ) + a2a_part = a2a_types.DataPart.model_validate_json( + part.inline_data.data[ + len(A2A_DATA_PART_START_TAG) : -len(A2A_DATA_PART_END_TAG) + ] ) + if part.part_metadata: + add_metadata_to_a2a_part(a2a_part, part.part_metadata) + return a2a_types.Part(root=a2a_part) # The default case for inline_data is to convert it to FileWithBytes. a2a_part = a2a_types.FilePart( file=a2a_types.FileWithBytes( @@ -226,6 +248,9 @@ def convert_genai_part_to_a2a_part( ): part.video_metadata.model_dump(by_alias=True, exclude_none=True) } + if part.part_metadata: + add_metadata_to_a2a_part(a2a_part, part.part_metadata) + return a2a_types.Part(root=a2a_part) # Convert the funcall and function response to A2A DataPart. @@ -244,6 +269,8 @@ def convert_genai_part_to_a2a_part( fc_metadata[_get_adk_metadata_key('thought_signature')] = ( base64.b64encode(part.thought_signature).decode('utf-8') ) + if part.part_metadata: + fc_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.function_call.model_dump( @@ -254,44 +281,53 @@ def convert_genai_part_to_a2a_part( ) if part.function_response: + fr_metadata = { + _get_adk_metadata_key( + A2A_DATA_PART_METADATA_TYPE_KEY + ): A2A_DATA_PART_METADATA_TYPE_FUNCTION_RESPONSE + } + if part.part_metadata: + fr_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.function_response.model_dump( by_alias=True, exclude_none=True ), - metadata={ - _get_adk_metadata_key( - A2A_DATA_PART_METADATA_TYPE_KEY - ): A2A_DATA_PART_METADATA_TYPE_FUNCTION_RESPONSE - }, + metadata=fr_metadata, ) ) if part.code_execution_result: + cer_metadata = { + _get_adk_metadata_key( + A2A_DATA_PART_METADATA_TYPE_KEY + ): A2A_DATA_PART_METADATA_TYPE_CODE_EXECUTION_RESULT + } + if part.part_metadata: + cer_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.code_execution_result.model_dump( by_alias=True, exclude_none=True ), - metadata={ - _get_adk_metadata_key( - A2A_DATA_PART_METADATA_TYPE_KEY - ): A2A_DATA_PART_METADATA_TYPE_CODE_EXECUTION_RESULT - }, + metadata=cer_metadata, ) ) if part.executable_code: + ec_metadata = { + _get_adk_metadata_key( + A2A_DATA_PART_METADATA_TYPE_KEY + ): A2A_DATA_PART_METADATA_TYPE_EXECUTABLE_CODE + } + if part.part_metadata: + ec_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.executable_code.model_dump( by_alias=True, exclude_none=True ), - metadata={ - _get_adk_metadata_key( - A2A_DATA_PART_METADATA_TYPE_KEY - ): A2A_DATA_PART_METADATA_TYPE_EXECUTABLE_CODE - }, + metadata=ec_metadata, ) ) diff --git a/tests/unittests/a2a/converters/test_part_converter.py b/tests/unittests/a2a/converters/test_part_converter.py index f921b7e061..842c550dea 100644 --- a/tests/unittests/a2a/converters/test_part_converter.py +++ b/tests/unittests/a2a/converters/test_part_converter.py @@ -739,6 +739,52 @@ def test_data_part_with_mime_type_metadata_round_trip(self): # The 'mime_type' key in the metadata should be preserved as is assert result_a2a_part.root.metadata == metadata + def test_text_part_metadata_round_trip(self): + """Test round-trip conversion for text parts with metadata.""" + # Arrange + metadata = {"key1": "value1", "key2": "value2"} + a2a_part = a2a_types.Part( + root=a2a_types.TextPart(text="some text", metadata=metadata) + ) + + # Act + genai_part = convert_a2a_part_to_genai_part(a2a_part) + result_a2a_part = convert_genai_part_to_a2a_part(genai_part) + + # Assert + assert result_a2a_part is not None + assert isinstance(result_a2a_part, a2a_types.Part) + assert isinstance(result_a2a_part.root, a2a_types.TextPart) + assert result_a2a_part.root.text == "some text" + assert result_a2a_part.root.metadata == metadata + + def test_file_part_metadata_round_trip(self): + """Test round-trip conversion for file parts with metadata.""" + # Arrange + metadata = {"key1": "value1"} + a2a_part = a2a_types.Part( + root=a2a_types.FilePart( + file=a2a_types.FileWithUri( + uri="gs://bucket/file.txt", + mime_type="text/plain", + name="my_file.txt", + ), + metadata=metadata, + ) + ) + + # Act + genai_part = convert_a2a_part_to_genai_part(a2a_part) + result_a2a_part = convert_genai_part_to_a2a_part(genai_part) + + # Assert + assert result_a2a_part is not None + assert isinstance(result_a2a_part, a2a_types.Part) + assert isinstance(result_a2a_part.root, a2a_types.FilePart) + assert isinstance(result_a2a_part.root.file, a2a_types.FileWithUri) + assert result_a2a_part.root.file.uri == "gs://bucket/file.txt" + assert result_a2a_part.root.metadata == metadata + class TestEdgeCases: """Test cases for edge cases and error conditions.""" diff --git a/tests/unittests/agents/test_remote_a2a_agent.py b/tests/unittests/agents/test_remote_a2a_agent.py index 073ad36d9f..8a38e452b2 100644 --- a/tests/unittests/agents/test_remote_a2a_agent.py +++ b/tests/unittests/agents/test_remote_a2a_agent.py @@ -2539,6 +2539,7 @@ async def test_full_workflow_with_direct_agent_card(self): # Mock session with text event mock_part = Mock() mock_part.text = "Hello world" + mock_part.part_metadata = None mock_content = Mock() mock_content.parts = [mock_part] @@ -2636,6 +2637,7 @@ async def test_full_workflow_with_direct_agent_card_and_factory(self): # Mock session with text event mock_part = Mock() mock_part.text = "Hello world" + mock_part.part_metadata = {"test": "part_metadata"} mock_content = Mock() mock_content.parts = [mock_part] From 13ca14582cefdd96e8e3c2d5e1f3a212486e2dea Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Mon, 1 Jun 2026 15:07:33 -0700 Subject: [PATCH 42/94] feat: Preserved A2A message metadata field into ADK event PiperOrigin-RevId: 924933525 --- .../adk/a2a/converters/part_converter.py | 106 ++++++------------ .../a2a/converters/test_part_converter.py | 46 -------- .../unittests/agents/test_remote_a2a_agent.py | 2 - 3 files changed, 35 insertions(+), 119 deletions(-) diff --git a/src/google/adk/a2a/converters/part_converter.py b/src/google/adk/a2a/converters/part_converter.py index 94122c20ba..cb7eb688cd 100644 --- a/src/google/adk/a2a/converters/part_converter.py +++ b/src/google/adk/a2a/converters/part_converter.py @@ -64,9 +64,7 @@ def convert_a2a_part_to_genai_part( thought = None if part.metadata: thought = part.metadata.get(_get_adk_metadata_key('thought')) - return genai_types.Part( - text=part.text, thought=thought, part_metadata=part.metadata - ) + return genai_types.Part(text=part.text, thought=thought) if isinstance(part, a2a_types.FilePart): if isinstance(part.file, a2a_types.FileWithUri): @@ -75,8 +73,7 @@ def convert_a2a_part_to_genai_part( file_uri=part.file.uri, mime_type=part.file.mime_type, display_name=part.file.name, - ), - part_metadata=part.metadata, + ) ) elif isinstance(part.file, a2a_types.FileWithBytes): @@ -85,8 +82,7 @@ def convert_a2a_part_to_genai_part( data=base64.b64decode(part.file.bytes), mime_type=part.file.mime_type, display_name=part.file.name, - ), - part_metadata=part.metadata, + ) ) else: logger.warning( @@ -130,7 +126,6 @@ def convert_a2a_part_to_genai_part( part.data, by_alias=True ), thought_signature=thought_signature, - part_metadata=part.metadata, ) if ( part.metadata[_get_adk_metadata_key(A2A_DATA_PART_METADATA_TYPE_KEY)] @@ -139,8 +134,7 @@ def convert_a2a_part_to_genai_part( return genai_types.Part( function_response=genai_types.FunctionResponse.model_validate( part.data, by_alias=True - ), - part_metadata=part.metadata, + ) ) if ( part.metadata[_get_adk_metadata_key(A2A_DATA_PART_METADATA_TYPE_KEY)] @@ -149,8 +143,7 @@ def convert_a2a_part_to_genai_part( return genai_types.Part( code_execution_result=genai_types.CodeExecutionResult.model_validate( part.data, by_alias=True - ), - part_metadata=part.metadata, + ) ) if ( part.metadata[_get_adk_metadata_key(A2A_DATA_PART_METADATA_TYPE_KEY)] @@ -159,8 +152,7 @@ def convert_a2a_part_to_genai_part( return genai_types.Part( executable_code=genai_types.ExecutableCode.model_validate( part.data, by_alias=True - ), - part_metadata=part.metadata, + ) ) return genai_types.Part( inline_data=genai_types.Blob( @@ -170,8 +162,7 @@ def convert_a2a_part_to_genai_part( ) + A2A_DATA_PART_END_TAG, mime_type=A2A_DATA_PART_TEXT_MIME_TYPE, - ), - part_metadata=part.metadata, + ) ) logger.warning( @@ -188,34 +179,22 @@ def convert_genai_part_to_a2a_part( ) -> Optional[a2a_types.Part]: """Convert a Google GenAI Part to an A2A Part.""" - def add_metadata_to_a2a_part( - a2a_part: a2a_types.Part, - metadata: dict[str, Any], - ) -> None: - """Adds metadata to an A2A part.""" - if a2a_part.metadata is None: - a2a_part.metadata = {} - a2a_part.metadata.update(metadata) - if part.text is not None: a2a_part = a2a_types.TextPart(text=part.text) if part.thought is not None: a2a_part.metadata = {_get_adk_metadata_key('thought'): part.thought} - if part.part_metadata: - add_metadata_to_a2a_part(a2a_part, part.part_metadata) return a2a_types.Part(root=a2a_part) if part.file_data: - a2a_part = a2a_types.FilePart( - file=a2a_types.FileWithUri( - uri=part.file_data.file_uri, - mime_type=part.file_data.mime_type, - name=part.file_data.display_name, + return a2a_types.Part( + root=a2a_types.FilePart( + file=a2a_types.FileWithUri( + uri=part.file_data.file_uri, + mime_type=part.file_data.mime_type, + name=part.file_data.display_name, + ) ) ) - if part.part_metadata: - add_metadata_to_a2a_part(a2a_part, part.part_metadata) - return a2a_types.Part(root=a2a_part) if part.inline_data: if ( @@ -224,14 +203,13 @@ def add_metadata_to_a2a_part( and part.inline_data.data.startswith(A2A_DATA_PART_START_TAG) and part.inline_data.data.endswith(A2A_DATA_PART_END_TAG) ): - a2a_part = a2a_types.DataPart.model_validate_json( - part.inline_data.data[ - len(A2A_DATA_PART_START_TAG) : -len(A2A_DATA_PART_END_TAG) - ] + return a2a_types.Part( + root=a2a_types.DataPart.model_validate_json( + part.inline_data.data[ + len(A2A_DATA_PART_START_TAG) : -len(A2A_DATA_PART_END_TAG) + ] + ) ) - if part.part_metadata: - add_metadata_to_a2a_part(a2a_part, part.part_metadata) - return a2a_types.Part(root=a2a_part) # The default case for inline_data is to convert it to FileWithBytes. a2a_part = a2a_types.FilePart( file=a2a_types.FileWithBytes( @@ -248,9 +226,6 @@ def add_metadata_to_a2a_part( ): part.video_metadata.model_dump(by_alias=True, exclude_none=True) } - if part.part_metadata: - add_metadata_to_a2a_part(a2a_part, part.part_metadata) - return a2a_types.Part(root=a2a_part) # Convert the funcall and function response to A2A DataPart. @@ -269,8 +244,6 @@ def add_metadata_to_a2a_part( fc_metadata[_get_adk_metadata_key('thought_signature')] = ( base64.b64encode(part.thought_signature).decode('utf-8') ) - if part.part_metadata: - fc_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.function_call.model_dump( @@ -281,53 +254,44 @@ def add_metadata_to_a2a_part( ) if part.function_response: - fr_metadata = { - _get_adk_metadata_key( - A2A_DATA_PART_METADATA_TYPE_KEY - ): A2A_DATA_PART_METADATA_TYPE_FUNCTION_RESPONSE - } - if part.part_metadata: - fr_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.function_response.model_dump( by_alias=True, exclude_none=True ), - metadata=fr_metadata, + metadata={ + _get_adk_metadata_key( + A2A_DATA_PART_METADATA_TYPE_KEY + ): A2A_DATA_PART_METADATA_TYPE_FUNCTION_RESPONSE + }, ) ) if part.code_execution_result: - cer_metadata = { - _get_adk_metadata_key( - A2A_DATA_PART_METADATA_TYPE_KEY - ): A2A_DATA_PART_METADATA_TYPE_CODE_EXECUTION_RESULT - } - if part.part_metadata: - cer_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.code_execution_result.model_dump( by_alias=True, exclude_none=True ), - metadata=cer_metadata, + metadata={ + _get_adk_metadata_key( + A2A_DATA_PART_METADATA_TYPE_KEY + ): A2A_DATA_PART_METADATA_TYPE_CODE_EXECUTION_RESULT + }, ) ) if part.executable_code: - ec_metadata = { - _get_adk_metadata_key( - A2A_DATA_PART_METADATA_TYPE_KEY - ): A2A_DATA_PART_METADATA_TYPE_EXECUTABLE_CODE - } - if part.part_metadata: - ec_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.executable_code.model_dump( by_alias=True, exclude_none=True ), - metadata=ec_metadata, + metadata={ + _get_adk_metadata_key( + A2A_DATA_PART_METADATA_TYPE_KEY + ): A2A_DATA_PART_METADATA_TYPE_EXECUTABLE_CODE + }, ) ) diff --git a/tests/unittests/a2a/converters/test_part_converter.py b/tests/unittests/a2a/converters/test_part_converter.py index 842c550dea..f921b7e061 100644 --- a/tests/unittests/a2a/converters/test_part_converter.py +++ b/tests/unittests/a2a/converters/test_part_converter.py @@ -739,52 +739,6 @@ def test_data_part_with_mime_type_metadata_round_trip(self): # The 'mime_type' key in the metadata should be preserved as is assert result_a2a_part.root.metadata == metadata - def test_text_part_metadata_round_trip(self): - """Test round-trip conversion for text parts with metadata.""" - # Arrange - metadata = {"key1": "value1", "key2": "value2"} - a2a_part = a2a_types.Part( - root=a2a_types.TextPart(text="some text", metadata=metadata) - ) - - # Act - genai_part = convert_a2a_part_to_genai_part(a2a_part) - result_a2a_part = convert_genai_part_to_a2a_part(genai_part) - - # Assert - assert result_a2a_part is not None - assert isinstance(result_a2a_part, a2a_types.Part) - assert isinstance(result_a2a_part.root, a2a_types.TextPart) - assert result_a2a_part.root.text == "some text" - assert result_a2a_part.root.metadata == metadata - - def test_file_part_metadata_round_trip(self): - """Test round-trip conversion for file parts with metadata.""" - # Arrange - metadata = {"key1": "value1"} - a2a_part = a2a_types.Part( - root=a2a_types.FilePart( - file=a2a_types.FileWithUri( - uri="gs://bucket/file.txt", - mime_type="text/plain", - name="my_file.txt", - ), - metadata=metadata, - ) - ) - - # Act - genai_part = convert_a2a_part_to_genai_part(a2a_part) - result_a2a_part = convert_genai_part_to_a2a_part(genai_part) - - # Assert - assert result_a2a_part is not None - assert isinstance(result_a2a_part, a2a_types.Part) - assert isinstance(result_a2a_part.root, a2a_types.FilePart) - assert isinstance(result_a2a_part.root.file, a2a_types.FileWithUri) - assert result_a2a_part.root.file.uri == "gs://bucket/file.txt" - assert result_a2a_part.root.metadata == metadata - class TestEdgeCases: """Test cases for edge cases and error conditions.""" diff --git a/tests/unittests/agents/test_remote_a2a_agent.py b/tests/unittests/agents/test_remote_a2a_agent.py index 8a38e452b2..073ad36d9f 100644 --- a/tests/unittests/agents/test_remote_a2a_agent.py +++ b/tests/unittests/agents/test_remote_a2a_agent.py @@ -2539,7 +2539,6 @@ async def test_full_workflow_with_direct_agent_card(self): # Mock session with text event mock_part = Mock() mock_part.text = "Hello world" - mock_part.part_metadata = None mock_content = Mock() mock_content.parts = [mock_part] @@ -2637,7 +2636,6 @@ async def test_full_workflow_with_direct_agent_card_and_factory(self): # Mock session with text event mock_part = Mock() mock_part.text = "Hello world" - mock_part.part_metadata = {"test": "part_metadata"} mock_content = Mock() mock_content.parts = [mock_part] From c7cacec009dc4dcb11061bf91f76f23b3a31c88d Mon Sep 17 00:00:00 2001 From: George Weale Date: Mon, 1 Jun 2026 16:26:02 -0700 Subject: [PATCH 43/94] chore: bring over v2 Co-authored-by: George Weale PiperOrigin-RevId: 924972994 --- .github/.release-please-manifest-v2.json | 3 - .github/release-please-config-v2.json | 62 - .github/workflows/check-file-contents.yml | 34 + .github/workflows/copybara-pr-handler.yml | 22 +- .github/workflows/issue-monitor.yml | 2 +- .github/workflows/python-unit-tests.yml | 1 + .github/workflows/release-v2-cherry-pick.yml | 43 - .github/workflows/release-v2-cut.yml | 46 - .github/workflows/release-v2-finalize.yml | 85 - .github/workflows/release-v2-please.yml | 41 - .github/workflows/release-v2-publish.yml | 79 - .github/workflows/stale-bot.yml | 2 +- .github/workflows/v2-sync.yml | 59 - .gitignore | 1 + .pre-commit-config.yaml | 17 +- AGENTS.md | 7 + CHANGELOG-v2.md | 14 + contributing/samples/core/abort/README.md | 91 + contributing/samples/core/abort/__init__.py | 15 + contributing/samples/core/abort/agent.py | 70 + .../samples/hitl/request_input_tool/README.md | 49 + .../samples/hitl/request_input_tool/agent.py | 62 + .../tests/create_support_ticket.json | 159 + .../samples/models/interactions_api/agent.py | 23 +- .../samples/models/interactions_api/main.py | 56 +- pyproject.toml | 6 +- src/google/adk/__init__.py | 4 +- src/google/adk/a2a/agent/__init__.py | 26 +- src/google/adk/agents/__init__.py | 29 +- src/google/adk/agents/agent_config.py | 2 + src/google/adk/agents/base_agent.py | 52 +- src/google/adk/agents/base_agent_config.py | 4 + src/google/adk/agents/common_configs.py | 39 +- src/google/adk/agents/config_agent_utils.py | 40 +- .../agents/config_schemas/AgentConfig.json | 2253 +++++++-- src/google/adk/agents/context.py | 511 +- src/google/adk/agents/invocation_context.py | 99 +- src/google/adk/agents/llm/__init__.py | 13 + src/google/adk/agents/llm/task/__init__.py | 13 + .../adk/agents/llm/task/_finish_task_tool.py | 185 + .../adk/agents/llm/task/_task_models.py | 119 + src/google/adk/agents/llm_agent.py | 131 +- src/google/adk/agents/llm_agent_config.py | 36 +- src/google/adk/agents/loop_agent.py | 15 +- src/google/adk/agents/loop_agent_config.py | 4 + src/google/adk/agents/parallel_agent.py | 15 +- .../adk/agents/parallel_agent_config.py | 4 + src/google/adk/agents/sequential_agent.py | 18 +- .../adk/agents/sequential_agent_config.py | 5 + src/google/adk/apps/app.py | 39 +- src/google/adk/apps/compaction.py | 25 +- src/google/adk/auth/auth_preprocessor.py | 4 +- src/google/adk/auth/auth_schemes.py | 4 +- src/google/adk/auth/oauth2_credential_util.py | 6 +- src/google/adk/cli/adk_web_server.py | 2211 +-------- src/google/adk/cli/agent_graph.py | 49 +- src/google/adk/cli/agent_test_runner.py | 900 ++++ src/google/adk/cli/api_server.py | 1677 +++++++ src/google/adk/cli/browser/chunk-257HQBMN.js | 132 + src/google/adk/cli/browser/chunk-27SWUPRL.js | 261 + src/google/adk/cli/browser/chunk-2DLZXFEQ.js | 1 + src/google/adk/cli/browser/chunk-2LZ42ZOW.js | 1 + .../{chunk-EN473UE3.js => chunk-2SRK2U7X.js} | 4 +- .../{chunk-NK4C5UIR.js => chunk-3BJ4SYVH.js} | 2 +- src/google/adk/cli/browser/chunk-3NJNOY56.js | 1 + src/google/adk/cli/browser/chunk-3YZ77ADE.js | 36 + src/google/adk/cli/browser/chunk-46YSBSFN.js | 1 + .../{chunk-VUI6RO2X.js => chunk-4LH47YYI.js} | 2 +- src/google/adk/cli/browser/chunk-4R6SYGKS.js | 1 + .../{chunk-JUJUP2UX.js => chunk-4VDZU6IO.js} | 2 +- src/google/adk/cli/browser/chunk-5PR7OWPD.js | 43 + .../{chunk-PR5T53UC.js => chunk-6CJBO2JX.js} | 2 +- src/google/adk/cli/browser/chunk-6UL33SIT.js | 89 + src/google/adk/cli/browser/chunk-75WMU75S.js | 1 + src/google/adk/cli/browser/chunk-7UW26RYS.js | 1 + src/google/adk/cli/browser/chunk-APNCZOFE.js | 1 + .../{chunk-WXV43367.js => chunk-AQDQIDAM.js} | 2 +- src/google/adk/cli/browser/chunk-ASJUXEUE.js | 1 + src/google/adk/cli/browser/chunk-B2DSW4QB.js | 15 + src/google/adk/cli/browser/chunk-BDIW4D5I.js | 65 + .../{chunk-DTNGXRUJ.js => chunk-BPUQWVAT.js} | 2 +- src/google/adk/cli/browser/chunk-DIR2LWLP.js | 1 + .../{chunk-2MVVEOIQ.js => chunk-DM36II44.js} | 2 +- src/google/adk/cli/browser/chunk-DMWOYWYQ.js | 1 + src/google/adk/cli/browser/chunk-DRBE27N3.js | 1 + src/google/adk/cli/browser/chunk-EGBSMT36.js | 1 + .../{chunk-GGOEHXD2.js => chunk-ET35KXUM.js} | 2 +- src/google/adk/cli/browser/chunk-F57TI45K.js | 1 + src/google/adk/cli/browser/chunk-FDH623K7.js | 1 + src/google/adk/cli/browser/chunk-GP6TCC26.js | 1 + src/google/adk/cli/browser/chunk-HD4LLD2O.js | 1 + src/google/adk/cli/browser/chunk-HDC4PFPG.js | 1 + .../{chunk-GLGRLUIJ.js => chunk-HTWWQBR6.js} | 2 +- src/google/adk/cli/browser/chunk-I4UDKKN5.js | 1 + src/google/adk/cli/browser/chunk-ICVZGLGO.js | 68 + src/google/adk/cli/browser/chunk-IHY23QJP.js | 1 + .../{chunk-CD6LWQYN.js => chunk-IT263FCL.js} | 2 +- src/google/adk/cli/browser/chunk-J4R5U4YL.js | 7 + src/google/adk/cli/browser/chunk-JDPVSVO4.js | 1 + src/google/adk/cli/browser/chunk-JHZIBEJC.js | 1 + src/google/adk/cli/browser/chunk-JNY2YWG7.js | 1 + src/google/adk/cli/browser/chunk-JRNAXTJ7.js | 1 + src/google/adk/cli/browser/chunk-JW2YJHYO.js | 34 + src/google/adk/cli/browser/chunk-LA76DWZL.js | 70 + src/google/adk/cli/browser/chunk-LI24J5PW.js | 220 + src/google/adk/cli/browser/chunk-N5S45BK4.js | 1 + src/google/adk/cli/browser/chunk-NALL4A3P.js | 161 + src/google/adk/cli/browser/chunk-NMKTPNXE.js | 1 + src/google/adk/cli/browser/chunk-NQKWI5EB.js | 1 + .../{chunk-HCQ2TSHS.js => chunk-P4MFJI72.js} | 2 +- src/google/adk/cli/browser/chunk-PM3FQFTD.js | 30 + src/google/adk/cli/browser/chunk-PRKFGJVH.js | 1 + .../{chunk-2VKC3BHH.js => chunk-Q6H4XMU7.js} | 2 +- src/google/adk/cli/browser/chunk-QFMJV7VH.js | 80 + src/google/adk/cli/browser/chunk-QGHEW6NO.js | 70 + src/google/adk/cli/browser/chunk-QMDHABEH.js | 139 + .../{chunk-5VJ6OSLK.js => chunk-R6ZR5LUR.js} | 2 +- src/google/adk/cli/browser/chunk-RCKFX6QR.js | 162 + src/google/adk/cli/browser/chunk-RMXJBC7V.js | 1 + src/google/adk/cli/browser/chunk-S22PTQH2.js | 73 + src/google/adk/cli/browser/chunk-SMT27N2F.js | 1 + src/google/adk/cli/browser/chunk-ST54LLJ3.js | 1 + .../{chunk-A2SOFJNC.js => chunk-SXB5AC5V.js} | 2 +- src/google/adk/cli/browser/chunk-T2UY75BD.js | 145 + src/google/adk/cli/browser/chunk-T3Q3QCCV.js | 3 + src/google/adk/cli/browser/chunk-TIJO3EOA.js | 189 + src/google/adk/cli/browser/chunk-TNJPXCAB.js | 7 + src/google/adk/cli/browser/chunk-TNYN2TVW.js | 4 + src/google/adk/cli/browser/chunk-TPDTRWWV.js | 1 + .../{chunk-7P7JIWGK.js => chunk-URGIGLGR.js} | 2 +- src/google/adk/cli/browser/chunk-UWBTGTN5.js | 24 + src/google/adk/cli/browser/chunk-V2DCVTQX.js | 7 + src/google/adk/cli/browser/chunk-VDPKVNDJ.js | 1 + src/google/adk/cli/browser/chunk-W67OU2Q2.js | 10 + src/google/adk/cli/browser/chunk-W7GRJBO5.js | 1 - src/google/adk/cli/browser/chunk-W7PRDKNL.js | 53 + src/google/adk/cli/browser/chunk-WAKWL6X3.js | 24 + src/google/adk/cli/browser/chunk-WBLSVR3V.js | 2 + src/google/adk/cli/browser/chunk-WLB2FJ7K.js | 10 + src/google/adk/cli/browser/chunk-WR6HISGZ.js | 1 + src/google/adk/cli/browser/chunk-WXI2IBAH.js | 70 + src/google/adk/cli/browser/chunk-WZIWL22C.js | 292 ++ src/google/adk/cli/browser/chunk-XE4A3JWW.js | 1 + src/google/adk/cli/browser/chunk-XMBKBASC.js | 1 + src/google/adk/cli/browser/chunk-XULIXUQL.js | 1 + .../{chunk-4S2CIXCW.js => chunk-Y7O3NHKW.js} | 2 +- src/google/adk/cli/browser/chunk-YVVLWU7S.js | 321 ++ src/google/adk/cli/browser/chunk-ZCQFE5RP.js | 61 + src/google/adk/cli/browser/chunk-ZMOC4H7T.js | 32 + src/google/adk/cli/browser/chunk-ZX24QP2W.js | 2 + src/google/adk/cli/browser/index.html | 234 +- src/google/adk/cli/browser/main-LMS5QHZN.js | 4177 +++++++++++++++++ src/google/adk/cli/browser/main-TCIQIOZ3.js | 4155 ---------------- .../adk/cli/browser/styles-2ORK6PRA.css | 1 - .../adk/cli/browser/styles-LBC36Z6S.css | 1 + .../adk_agent_builder_assistant.py | 21 +- src/google/adk/cli/cli.py | 618 ++- src/google/adk/cli/cli_deploy.py | 45 +- src/google/adk/cli/cli_tools_click.py | 250 +- src/google/adk/cli/dev_server.py | 1295 +++++ src/google/adk/cli/fast_api.py | 661 +-- src/google/adk/cli/utils/_onboarding.py | 7 +- src/google/adk/cli/utils/agent_loader.py | 58 +- src/google/adk/cli/utils/evals.py | 23 +- src/google/adk/cli/utils/gcp_utils.py | 9 +- .../adk/cli/utils/graph_serialization.py | 291 ++ .../adk/cli/utils/graph_visualization.py | 346 ++ src/google/adk/cli/utils/local_storage.py | 26 +- .../adk/evaluation/custom_metric_evaluator.py | 2 +- src/google/adk/evaluation/eval_config.py | 10 - src/google/adk/evaluation/eval_metrics.py | 13 + .../adk/evaluation/final_response_match_v2.py | 17 +- .../adk/evaluation/llm_as_judge_utils.py | 41 +- .../adk/evaluation/local_eval_service.py | 19 +- .../rubric_based_final_response_quality_v1.py | 13 +- src/google/adk/events/__init__.py | 2 + src/google/adk/events/_node_path_builder.py | 107 + src/google/adk/events/event.py | 216 +- src/google/adk/events/event_actions.py | 7 + src/google/adk/events/request_input.py | 67 + src/google/adk/features/_feature_registry.py | 4 +- .../llm_flows/_output_schema_processor.py | 1 + .../adk/flows/llm_flows/agent_transfer.py | 26 +- .../adk/flows/llm_flows/base_llm_flow.py | 79 +- src/google/adk/flows/llm_flows/basic.py | 6 +- src/google/adk/flows/llm_flows/contents.py | 158 +- src/google/adk/flows/llm_flows/functions.py | 83 +- src/google/adk/flows/llm_flows/identity.py | 9 +- .../integrations/bigquery/metadata_tool.py | 51 +- .../adk/integrations/bigquery/query_tool.py | 39 +- .../adk/integrations/bigquery/search_tool.py | 3 +- .../firestore/firestore_session_service.py | 1 + .../integrations/vmaas/sandbox_computer.py | 37 +- src/google/adk/labs/README.md | 6 + src/google/adk/labs/__init__.py | 15 + src/google/adk/labs/openai/README.md | 24 + src/google/adk/labs/openai/__init__.py | 19 + src/google/adk/labs/openai/_openai_llm.py | 511 ++ src/google/adk/memory/__init__.py | 1 + .../memory/vertex_ai_memory_bank_service.py | 7 + .../memory/vertex_ai_rag_memory_service.py | 7 + src/google/adk/models/__init__.py | 16 +- .../adk/models/gemini_llm_connection.py | 61 +- src/google/adk/models/interactions_utils.py | 773 +-- src/google/adk/models/llm_response.py | 6 + src/google/adk/models/registry.py | 43 +- .../bigquery_agent_analytics_plugin.py | 42 +- .../adk/plugins/debug_logging_plugin.py | 2 +- src/google/adk/runners.py | 748 ++- src/google/adk/sessions/__init__.py | 8 +- .../adk/sessions/database_session_service.py | 43 +- .../sessions/migration/_schema_check_utils.py | 9 +- .../adk/sessions/sqlite_session_service.py | 2 +- src/google/adk/sessions/state.py | 60 +- .../adk/sessions/vertex_ai_session_service.py | 7 + src/google/adk/skills/_utils.py | 18 +- .../adk/telemetry/_experimental_semconv.py | 8 +- src/google/adk/telemetry/_instrumentation.py | 70 +- src/google/adk/telemetry/node_tracing.py | 146 + src/google/adk/telemetry/tracing.py | 76 +- src/google/adk/tools/__init__.py | 2 + src/google/adk/tools/_request_input_tool.py | 57 + src/google/adk/tools/agent_tool.py | 102 + src/google/adk/tools/base_tool.py | 28 +- src/google/adk/tools/bash_tool.py | 6 + .../tools/computer_use/computer_use_tool.py | 36 +- .../adk/tools/discovery_engine_search_tool.py | 6 + .../adk/tools/environment/_edit_file_tool.py | 140 + .../tools/environment/_environment_toolset.py | 8 +- .../adk/tools/environment/_execute_tool.py | 137 + .../adk/tools/environment/_read_file_tool.py | 170 + src/google/adk/tools/environment/_tools.py | 395 +- src/google/adk/tools/environment/_utils.py | 26 + .../adk/tools/environment/_write_file_tool.py | 92 + .../environment_simulation_config.py | 2 +- .../environment_simulation_plugin.py | 2 +- src/google/adk/tools/function_tool.py | 114 +- src/google/adk/tools/google_tool.py | 6 + src/google/adk/tools/mcp_tool/mcp_tool.py | 6 + src/google/adk/tools/mcp_tool/mcp_toolset.py | 3 +- .../adk/tools/mcp_tool/session_context.py | 20 +- .../openapi_spec_parser/rest_api_tool.py | 6 + .../adk/tools/set_model_response_tool.py | 11 +- src/google/adk/tools/skill_toolset.py | 128 +- src/google/adk/utils/_dependency.py | 30 + .../adk/utils/_google_client_headers.py | 2 +- src/google/adk/utils/_schema_utils.py | 14 + .../adk/utils/_serialized_base_model.py | 43 + src/google/adk/utils/agent_info.py | 16 +- src/google/adk/utils/content_utils.py | 2 +- src/google/adk/utils/output_schema_utils.py | 1 - src/google/adk/version.py | 2 +- src/google/adk/workflow/__init__.py | 41 + src/google/adk/workflow/_base_node.py | 259 + .../adk/workflow/_dynamic_node_scheduler.py | 519 ++ src/google/adk/workflow/_errors.py | 59 + src/google/adk/workflow/_function_node.py | 520 ++ src/google/adk/workflow/_graph.py | 559 +++ src/google/adk/workflow/_join_node.py | 77 + src/google/adk/workflow/_llm_agent_wrapper.py | 445 ++ src/google/adk/workflow/_node.py | 213 + src/google/adk/workflow/_node_runner.py | 411 ++ src/google/adk/workflow/_node_state.py | 60 + src/google/adk/workflow/_node_status.py | 44 + src/google/adk/workflow/_parallel_worker.py | 131 + src/google/adk/workflow/_retry_config.py | 75 + .../adk/workflow/_schedule_dynamic_node.py | 79 + src/google/adk/workflow/_tool_node.py | 90 + src/google/adk/workflow/_trigger.py | 40 + src/google/adk/workflow/_workflow.py | 875 ++++ src/google/adk/workflow/utils/__init__.py | 13 + .../adk/workflow/utils/_rehydration_utils.py | 331 ++ .../adk/workflow/utils/_replay_interceptor.py | 194 + .../utils/_replay_sequence_barrier.py | 50 + src/google/adk/workflow/utils/_retry_utils.py | 86 + .../adk/workflow/utils/_transfer_utils.py | 92 + .../workflow/utils/_workflow_graph_utils.py | 130 + .../workflow/utils/_workflow_hitl_utils.py | 261 + .../fixture/bigquery_agent/README.md | 4 +- tests/integration/test_cli_run.py | 78 + tests/unittests/agents/llm/__init__.py | 13 + tests/unittests/agents/llm/event_utils.py | 81 + tests/unittests/agents/llm/task/__init__.py | 13 + .../agents/llm/task/test_finish_task_tool.py | 363 ++ tests/unittests/agents/test_agent_clone.py | 15 +- tests/unittests/agents/test_agent_config.py | 132 +- tests/unittests/agents/test_context.py | 28 + .../agents/test_invocation_context.py | 12 +- .../test_invocation_context_process_queue.py | 159 + .../unittests/agents/test_langgraph_agent.py | 1 + .../agents/test_live_request_queue.py | 14 + .../agents/test_llm_agent_error_messages.py | 2 +- .../unittests/agents/test_llm_agent_fields.py | 29 + .../agents/test_llm_agent_include_contents.py | 4 +- .../agents/test_llm_agent_interruptions.py | 481 ++ .../agents/test_resumable_llm_agent.py | 585 +-- tests/unittests/apps/test_apps.py | 33 +- tests/unittests/apps/test_compaction.py | 22 +- .../unittests/auth/test_auth_preprocessor.py | 2 +- .../auth/test_oauth2_credential_util.py | 76 + tests/unittests/auth/test_toolset_auth.py | 8 +- .../cli/test_adk_web_server_tests.py | 156 + tests/unittests/cli/test_fast_api.py | 554 ++- .../unittests/cli/utils/test_agent_loader.py | 14 +- tests/unittests/cli/utils/test_cli.py | 9 +- tests/unittests/cli/utils/test_cli_create.py | 2 +- tests/unittests/cli/utils/test_cli_deploy.py | 11 +- .../cli/utils/test_cli_deploy_to_cloud_run.py | 5 +- .../cli/utils/test_cli_tools_click.py | 627 ++- tests/unittests/cli/utils/test_evals.py | 4 +- tests/unittests/cli/utils/test_gcp_utils.py | 12 +- .../cli/utils/test_graph_serialization.py | 128 + tests/unittests/conftest.py | 4 + tests/unittests/evaluation/mock_gcs_utils.py | 14 + .../unittests/evaluation/test_eval_config.py | 12 - .../test_final_response_match_v2.py | 75 + .../evaluation/test_llm_as_judge_utils.py | 74 + .../evaluation/test_local_eval_service.py | 2 +- .../test_request_intercepter_plugin.py | 1 + tests/unittests/events/__init__.py | 13 + tests/unittests/events/test_event_message.py | 139 + .../events/test_node_path_builder.py | 159 + .../unittests/events/test_workflow_events.py | 80 + .../flows/llm_flows/test_base_llm_flow.py | 82 +- .../flows/llm_flows/test_basic_processor.py | 19 + .../flows/llm_flows/test_functions_simple.py | 265 ++ .../flows/llm_flows/test_identity.py | 23 + .../llm_flows/test_request_confirmation.py | 107 + .../bigquery/test_bigquery_credentials.py | 2 - .../bigquery/test_bigquery_query_tool.py | 39 +- .../test_firestore_session_service.py | 9 + tests/unittests/labs/__init__.py | 13 + tests/unittests/labs/openai/__init__.py | 13 + .../unittests/labs/openai/test_openai_llm.py | 351 ++ .../models/test_gemini_llm_connection.py | 312 +- .../models/test_interactions_utils.py | 837 ++-- tests/unittests/models/test_litellm.py | 1 + tests/unittests/models/test_models.py | 32 + .../gepa_root_agent_prompt_optimizer_test.py | 1 + .../test_bigquery_agent_analytics_plugin.py | 206 +- .../plugins/test_reflect_retry_tool_plugin.py | 2 + .../runners/test_pause_invocation.py | 184 +- .../runners/test_resume_invocation.py | 207 +- .../runners/test_run_tool_confirmation.py | 4 +- tests/unittests/runners/test_runner_debug.py | 36 +- tests/unittests/runners/test_runner_node.py | 1246 +++++ tests/unittests/skills/test__utils.py | 30 + .../streaming/test_live_streaming_configs.py | 71 + .../streaming/test_streaming_audio_storage.py | 4 +- tests/unittests/telemetry/test_functional.py | 1391 +----- .../unittests/telemetry/test_google_cloud.py | 12 + .../telemetry/test_instrumentation.py | 35 + .../telemetry/test_node_functional.py | 476 ++ tests/unittests/telemetry/test_setup.py | 14 +- tests/unittests/telemetry/test_spans.py | 372 +- tests/unittests/telemetry/utils.py | 111 + tests/unittests/test_optional_dependencies.py | 287 ++ tests/unittests/test_release_dependencies.py | 138 + tests/unittests/test_runners.py | 266 +- tests/unittests/test_samples.py | 59 + tests/unittests/testing_utils.py | 18 +- .../computer_use/test_computer_use_tool.py | 118 + .../tools/environment/test_edit_file_tool.py | 150 + .../mcp_tool/test_mcp_session_manager.py | 34 +- .../tools/mcp_tool/test_mcp_toolset.py | 10 +- .../tools/mcp_tool/test_session_context.py | 102 + tests/unittests/tools/test_agent_tool.py | 6 +- .../test_base_google_credentials_manager.py | 4 +- tests/unittests/tools/test_base_tool.py | 16 + tests/unittests/tools/test_function_tool.py | 4 + .../tools/test_function_tool_pydantic.py | 243 +- ...t_function_tool_with_import_annotations.py | 32 + tests/unittests/tools/test_google_tool.py | 4 +- tests/unittests/tools/test_load_web_page.py | 15 +- .../tools/test_request_input_tool.py | 116 + .../tools/test_set_model_response_tool.py | 7 +- tests/unittests/tools/test_skill_toolset.py | 281 +- .../unittests/utils/test_feature_decorator.py | 14 + .../utils/test_output_schema_utils.py | 99 +- .../utils/test_serialized_base_model.py | 35 + tests/unittests/workflow/__init__.py | 13 + tests/unittests/workflow/test_agent_node.py | 71 + .../test_agent_transfer.py | 578 ++- .../workflow/test_dynamic_node_scheduler.py | 1212 +++++ .../workflow/test_dynamic_use_as_output.py | 588 +++ .../unittests/workflow/test_function_node.py | 1738 +++++++ tests/unittests/workflow/test_graph.py | 793 ++++ tests/unittests/workflow/test_join_node.py | 277 ++ .../workflow/test_llm_agent_as_node.py | 1238 +++++ .../workflow/test_node_runner_ctx.py | 608 +++ .../workflow/test_node_runner_failure.py | 1121 +++++ .../workflow/test_node_runner_integration.py | 539 +++ tests/unittests/workflow/test_state_schema.py | 424 ++ tests/unittests/workflow/test_task_api_e2e.py | 525 +++ tests/unittests/workflow/test_workflow.py | 2181 +++++++++ .../workflow/test_workflow_agent_as_node.py | 104 + .../unittests/workflow/test_workflow_bytes.py | 137 + .../workflow/test_workflow_concurrency.py | 132 + .../workflow/test_workflow_dynamic_nodes.py | 1299 +++++ .../workflow/test_workflow_failures.py | 1070 +++++ .../test_workflow_function_tool_as_node.py | 75 + .../unittests/workflow/test_workflow_hitl.py | 2152 +++++++++ .../unittests/workflow/test_workflow_live.py | 672 +++ .../test_workflow_llm_agent_interruptions.py | 887 ++++ .../workflow/test_workflow_nested.py | 1161 +++++ .../unittests/workflow/test_workflow_node.py | 321 ++ .../workflow/test_workflow_node_timeout.py | 204 + .../test_workflow_output_deduplication.py | 161 + .../workflow/test_workflow_parallel_worker.py | 1092 +++++ .../workflow/test_workflow_routes.py | 654 +++ .../workflow/test_workflow_schema.py | 842 ++++ tests/unittests/workflow/testing_utils.py | 507 ++ tests/unittests/workflow/utils/__init__.py | 13 + .../workflow/utils/test_rehydration_utils.py | 309 ++ .../workflow/utils/test_replay_interceptor.py | 209 + .../utils/test_replay_sequence_barrier.py | 96 + .../workflow/utils/test_retry_utils.py | 70 + .../workflow/utils/test_transfer_utils.py | 188 + .../utils/test_workflow_graph_utils.py | 119 + .../utils/test_workflow_hitl_utils.py | 175 + .../workflow/workflow_testing_utils.py | 399 ++ tox.ini | 10 + 422 files changed, 61821 insertions(+), 11848 deletions(-) delete mode 100644 .github/.release-please-manifest-v2.json delete mode 100644 .github/release-please-config-v2.json delete mode 100644 .github/workflows/release-v2-cherry-pick.yml delete mode 100644 .github/workflows/release-v2-cut.yml delete mode 100644 .github/workflows/release-v2-finalize.yml delete mode 100644 .github/workflows/release-v2-please.yml delete mode 100644 .github/workflows/release-v2-publish.yml delete mode 100644 .github/workflows/v2-sync.yml create mode 100644 CHANGELOG-v2.md create mode 100644 contributing/samples/core/abort/README.md create mode 100644 contributing/samples/core/abort/__init__.py create mode 100644 contributing/samples/core/abort/agent.py create mode 100644 contributing/samples/hitl/request_input_tool/README.md create mode 100644 contributing/samples/hitl/request_input_tool/agent.py create mode 100644 contributing/samples/hitl/request_input_tool/tests/create_support_ticket.json create mode 100644 src/google/adk/agents/llm/__init__.py create mode 100644 src/google/adk/agents/llm/task/__init__.py create mode 100644 src/google/adk/agents/llm/task/_finish_task_tool.py create mode 100644 src/google/adk/agents/llm/task/_task_models.py create mode 100644 src/google/adk/cli/agent_test_runner.py create mode 100644 src/google/adk/cli/api_server.py create mode 100644 src/google/adk/cli/browser/chunk-257HQBMN.js create mode 100644 src/google/adk/cli/browser/chunk-27SWUPRL.js create mode 100644 src/google/adk/cli/browser/chunk-2DLZXFEQ.js create mode 100644 src/google/adk/cli/browser/chunk-2LZ42ZOW.js rename src/google/adk/cli/browser/{chunk-EN473UE3.js => chunk-2SRK2U7X.js} (99%) rename src/google/adk/cli/browser/{chunk-NK4C5UIR.js => chunk-3BJ4SYVH.js} (87%) create mode 100644 src/google/adk/cli/browser/chunk-3NJNOY56.js create mode 100644 src/google/adk/cli/browser/chunk-3YZ77ADE.js create mode 100644 src/google/adk/cli/browser/chunk-46YSBSFN.js rename src/google/adk/cli/browser/{chunk-VUI6RO2X.js => chunk-4LH47YYI.js} (86%) create mode 100644 src/google/adk/cli/browser/chunk-4R6SYGKS.js rename src/google/adk/cli/browser/{chunk-JUJUP2UX.js => chunk-4VDZU6IO.js} (92%) create mode 100644 src/google/adk/cli/browser/chunk-5PR7OWPD.js rename src/google/adk/cli/browser/{chunk-PR5T53UC.js => chunk-6CJBO2JX.js} (97%) create mode 100644 src/google/adk/cli/browser/chunk-6UL33SIT.js create mode 100644 src/google/adk/cli/browser/chunk-75WMU75S.js create mode 100644 src/google/adk/cli/browser/chunk-7UW26RYS.js create mode 100644 src/google/adk/cli/browser/chunk-APNCZOFE.js rename src/google/adk/cli/browser/{chunk-WXV43367.js => chunk-AQDQIDAM.js} (97%) create mode 100644 src/google/adk/cli/browser/chunk-ASJUXEUE.js create mode 100644 src/google/adk/cli/browser/chunk-B2DSW4QB.js create mode 100644 src/google/adk/cli/browser/chunk-BDIW4D5I.js rename src/google/adk/cli/browser/{chunk-DTNGXRUJ.js => chunk-BPUQWVAT.js} (92%) create mode 100644 src/google/adk/cli/browser/chunk-DIR2LWLP.js rename src/google/adk/cli/browser/{chunk-2MVVEOIQ.js => chunk-DM36II44.js} (89%) create mode 100644 src/google/adk/cli/browser/chunk-DMWOYWYQ.js create mode 100644 src/google/adk/cli/browser/chunk-DRBE27N3.js create mode 100644 src/google/adk/cli/browser/chunk-EGBSMT36.js rename src/google/adk/cli/browser/{chunk-GGOEHXD2.js => chunk-ET35KXUM.js} (95%) create mode 100644 src/google/adk/cli/browser/chunk-F57TI45K.js create mode 100644 src/google/adk/cli/browser/chunk-FDH623K7.js create mode 100644 src/google/adk/cli/browser/chunk-GP6TCC26.js create mode 100644 src/google/adk/cli/browser/chunk-HD4LLD2O.js create mode 100644 src/google/adk/cli/browser/chunk-HDC4PFPG.js rename src/google/adk/cli/browser/{chunk-GLGRLUIJ.js => chunk-HTWWQBR6.js} (99%) create mode 100644 src/google/adk/cli/browser/chunk-I4UDKKN5.js create mode 100644 src/google/adk/cli/browser/chunk-ICVZGLGO.js create mode 100644 src/google/adk/cli/browser/chunk-IHY23QJP.js rename src/google/adk/cli/browser/{chunk-CD6LWQYN.js => chunk-IT263FCL.js} (94%) create mode 100644 src/google/adk/cli/browser/chunk-J4R5U4YL.js create mode 100644 src/google/adk/cli/browser/chunk-JDPVSVO4.js create mode 100644 src/google/adk/cli/browser/chunk-JHZIBEJC.js create mode 100644 src/google/adk/cli/browser/chunk-JNY2YWG7.js create mode 100644 src/google/adk/cli/browser/chunk-JRNAXTJ7.js create mode 100644 src/google/adk/cli/browser/chunk-JW2YJHYO.js create mode 100644 src/google/adk/cli/browser/chunk-LA76DWZL.js create mode 100644 src/google/adk/cli/browser/chunk-LI24J5PW.js create mode 100644 src/google/adk/cli/browser/chunk-N5S45BK4.js create mode 100644 src/google/adk/cli/browser/chunk-NALL4A3P.js create mode 100644 src/google/adk/cli/browser/chunk-NMKTPNXE.js create mode 100644 src/google/adk/cli/browser/chunk-NQKWI5EB.js rename src/google/adk/cli/browser/{chunk-HCQ2TSHS.js => chunk-P4MFJI72.js} (93%) create mode 100644 src/google/adk/cli/browser/chunk-PM3FQFTD.js create mode 100644 src/google/adk/cli/browser/chunk-PRKFGJVH.js rename src/google/adk/cli/browser/{chunk-2VKC3BHH.js => chunk-Q6H4XMU7.js} (93%) create mode 100644 src/google/adk/cli/browser/chunk-QFMJV7VH.js create mode 100644 src/google/adk/cli/browser/chunk-QGHEW6NO.js create mode 100644 src/google/adk/cli/browser/chunk-QMDHABEH.js rename src/google/adk/cli/browser/{chunk-5VJ6OSLK.js => chunk-R6ZR5LUR.js} (87%) create mode 100644 src/google/adk/cli/browser/chunk-RCKFX6QR.js create mode 100644 src/google/adk/cli/browser/chunk-RMXJBC7V.js create mode 100644 src/google/adk/cli/browser/chunk-S22PTQH2.js create mode 100644 src/google/adk/cli/browser/chunk-SMT27N2F.js create mode 100644 src/google/adk/cli/browser/chunk-ST54LLJ3.js rename src/google/adk/cli/browser/{chunk-A2SOFJNC.js => chunk-SXB5AC5V.js} (95%) create mode 100644 src/google/adk/cli/browser/chunk-T2UY75BD.js create mode 100644 src/google/adk/cli/browser/chunk-T3Q3QCCV.js create mode 100644 src/google/adk/cli/browser/chunk-TIJO3EOA.js create mode 100644 src/google/adk/cli/browser/chunk-TNJPXCAB.js create mode 100644 src/google/adk/cli/browser/chunk-TNYN2TVW.js create mode 100644 src/google/adk/cli/browser/chunk-TPDTRWWV.js rename src/google/adk/cli/browser/{chunk-7P7JIWGK.js => chunk-URGIGLGR.js} (89%) create mode 100644 src/google/adk/cli/browser/chunk-UWBTGTN5.js create mode 100644 src/google/adk/cli/browser/chunk-V2DCVTQX.js create mode 100644 src/google/adk/cli/browser/chunk-VDPKVNDJ.js create mode 100644 src/google/adk/cli/browser/chunk-W67OU2Q2.js delete mode 100644 src/google/adk/cli/browser/chunk-W7GRJBO5.js create mode 100644 src/google/adk/cli/browser/chunk-W7PRDKNL.js create mode 100644 src/google/adk/cli/browser/chunk-WAKWL6X3.js create mode 100644 src/google/adk/cli/browser/chunk-WBLSVR3V.js create mode 100644 src/google/adk/cli/browser/chunk-WLB2FJ7K.js create mode 100644 src/google/adk/cli/browser/chunk-WR6HISGZ.js create mode 100644 src/google/adk/cli/browser/chunk-WXI2IBAH.js create mode 100644 src/google/adk/cli/browser/chunk-WZIWL22C.js create mode 100644 src/google/adk/cli/browser/chunk-XE4A3JWW.js create mode 100644 src/google/adk/cli/browser/chunk-XMBKBASC.js create mode 100644 src/google/adk/cli/browser/chunk-XULIXUQL.js rename src/google/adk/cli/browser/{chunk-4S2CIXCW.js => chunk-Y7O3NHKW.js} (91%) create mode 100644 src/google/adk/cli/browser/chunk-YVVLWU7S.js create mode 100644 src/google/adk/cli/browser/chunk-ZCQFE5RP.js create mode 100644 src/google/adk/cli/browser/chunk-ZMOC4H7T.js create mode 100644 src/google/adk/cli/browser/chunk-ZX24QP2W.js create mode 100644 src/google/adk/cli/browser/main-LMS5QHZN.js delete mode 100644 src/google/adk/cli/browser/main-TCIQIOZ3.js delete mode 100644 src/google/adk/cli/browser/styles-2ORK6PRA.css create mode 100644 src/google/adk/cli/browser/styles-LBC36Z6S.css create mode 100644 src/google/adk/cli/dev_server.py create mode 100644 src/google/adk/cli/utils/graph_serialization.py create mode 100644 src/google/adk/cli/utils/graph_visualization.py create mode 100644 src/google/adk/events/_node_path_builder.py create mode 100644 src/google/adk/events/request_input.py create mode 100644 src/google/adk/labs/README.md create mode 100644 src/google/adk/labs/__init__.py create mode 100644 src/google/adk/labs/openai/README.md create mode 100644 src/google/adk/labs/openai/__init__.py create mode 100644 src/google/adk/labs/openai/_openai_llm.py create mode 100644 src/google/adk/telemetry/node_tracing.py create mode 100644 src/google/adk/tools/_request_input_tool.py create mode 100644 src/google/adk/tools/environment/_edit_file_tool.py create mode 100644 src/google/adk/tools/environment/_execute_tool.py create mode 100644 src/google/adk/tools/environment/_read_file_tool.py create mode 100644 src/google/adk/tools/environment/_utils.py create mode 100644 src/google/adk/tools/environment/_write_file_tool.py create mode 100644 src/google/adk/utils/_dependency.py create mode 100644 src/google/adk/utils/_serialized_base_model.py create mode 100644 src/google/adk/workflow/__init__.py create mode 100644 src/google/adk/workflow/_base_node.py create mode 100644 src/google/adk/workflow/_dynamic_node_scheduler.py create mode 100644 src/google/adk/workflow/_errors.py create mode 100644 src/google/adk/workflow/_function_node.py create mode 100644 src/google/adk/workflow/_graph.py create mode 100644 src/google/adk/workflow/_join_node.py create mode 100644 src/google/adk/workflow/_llm_agent_wrapper.py create mode 100644 src/google/adk/workflow/_node.py create mode 100644 src/google/adk/workflow/_node_runner.py create mode 100644 src/google/adk/workflow/_node_state.py create mode 100644 src/google/adk/workflow/_node_status.py create mode 100644 src/google/adk/workflow/_parallel_worker.py create mode 100644 src/google/adk/workflow/_retry_config.py create mode 100644 src/google/adk/workflow/_schedule_dynamic_node.py create mode 100644 src/google/adk/workflow/_tool_node.py create mode 100644 src/google/adk/workflow/_trigger.py create mode 100644 src/google/adk/workflow/_workflow.py create mode 100644 src/google/adk/workflow/utils/__init__.py create mode 100644 src/google/adk/workflow/utils/_rehydration_utils.py create mode 100644 src/google/adk/workflow/utils/_replay_interceptor.py create mode 100644 src/google/adk/workflow/utils/_replay_sequence_barrier.py create mode 100644 src/google/adk/workflow/utils/_retry_utils.py create mode 100644 src/google/adk/workflow/utils/_transfer_utils.py create mode 100644 src/google/adk/workflow/utils/_workflow_graph_utils.py create mode 100644 src/google/adk/workflow/utils/_workflow_hitl_utils.py create mode 100644 tests/integration/test_cli_run.py create mode 100644 tests/unittests/agents/llm/__init__.py create mode 100644 tests/unittests/agents/llm/event_utils.py create mode 100644 tests/unittests/agents/llm/task/__init__.py create mode 100644 tests/unittests/agents/llm/task/test_finish_task_tool.py create mode 100644 tests/unittests/agents/test_invocation_context_process_queue.py create mode 100644 tests/unittests/agents/test_llm_agent_interruptions.py create mode 100644 tests/unittests/cli/test_adk_web_server_tests.py create mode 100644 tests/unittests/cli/utils/test_graph_serialization.py create mode 100644 tests/unittests/events/__init__.py create mode 100644 tests/unittests/events/test_event_message.py create mode 100644 tests/unittests/events/test_node_path_builder.py create mode 100644 tests/unittests/events/test_workflow_events.py create mode 100644 tests/unittests/labs/__init__.py create mode 100644 tests/unittests/labs/openai/__init__.py create mode 100644 tests/unittests/labs/openai/test_openai_llm.py create mode 100644 tests/unittests/runners/test_runner_node.py create mode 100644 tests/unittests/telemetry/test_node_functional.py create mode 100644 tests/unittests/telemetry/utils.py create mode 100644 tests/unittests/test_optional_dependencies.py create mode 100644 tests/unittests/test_release_dependencies.py create mode 100644 tests/unittests/test_samples.py create mode 100644 tests/unittests/tools/environment/test_edit_file_tool.py create mode 100644 tests/unittests/tools/test_request_input_tool.py create mode 100644 tests/unittests/utils/test_serialized_base_model.py create mode 100644 tests/unittests/workflow/__init__.py create mode 100644 tests/unittests/workflow/test_agent_node.py rename tests/unittests/{flows/llm_flows => workflow}/test_agent_transfer.py (52%) create mode 100644 tests/unittests/workflow/test_dynamic_node_scheduler.py create mode 100644 tests/unittests/workflow/test_dynamic_use_as_output.py create mode 100644 tests/unittests/workflow/test_function_node.py create mode 100644 tests/unittests/workflow/test_graph.py create mode 100644 tests/unittests/workflow/test_join_node.py create mode 100644 tests/unittests/workflow/test_llm_agent_as_node.py create mode 100644 tests/unittests/workflow/test_node_runner_ctx.py create mode 100644 tests/unittests/workflow/test_node_runner_failure.py create mode 100644 tests/unittests/workflow/test_node_runner_integration.py create mode 100644 tests/unittests/workflow/test_state_schema.py create mode 100644 tests/unittests/workflow/test_task_api_e2e.py create mode 100644 tests/unittests/workflow/test_workflow.py create mode 100644 tests/unittests/workflow/test_workflow_agent_as_node.py create mode 100644 tests/unittests/workflow/test_workflow_bytes.py create mode 100644 tests/unittests/workflow/test_workflow_concurrency.py create mode 100644 tests/unittests/workflow/test_workflow_dynamic_nodes.py create mode 100644 tests/unittests/workflow/test_workflow_failures.py create mode 100644 tests/unittests/workflow/test_workflow_function_tool_as_node.py create mode 100644 tests/unittests/workflow/test_workflow_hitl.py create mode 100644 tests/unittests/workflow/test_workflow_live.py create mode 100644 tests/unittests/workflow/test_workflow_llm_agent_interruptions.py create mode 100644 tests/unittests/workflow/test_workflow_nested.py create mode 100644 tests/unittests/workflow/test_workflow_node.py create mode 100644 tests/unittests/workflow/test_workflow_node_timeout.py create mode 100644 tests/unittests/workflow/test_workflow_output_deduplication.py create mode 100644 tests/unittests/workflow/test_workflow_parallel_worker.py create mode 100644 tests/unittests/workflow/test_workflow_routes.py create mode 100644 tests/unittests/workflow/test_workflow_schema.py create mode 100644 tests/unittests/workflow/testing_utils.py create mode 100644 tests/unittests/workflow/utils/__init__.py create mode 100644 tests/unittests/workflow/utils/test_rehydration_utils.py create mode 100644 tests/unittests/workflow/utils/test_replay_interceptor.py create mode 100644 tests/unittests/workflow/utils/test_replay_sequence_barrier.py create mode 100644 tests/unittests/workflow/utils/test_retry_utils.py create mode 100644 tests/unittests/workflow/utils/test_transfer_utils.py create mode 100644 tests/unittests/workflow/utils/test_workflow_graph_utils.py create mode 100644 tests/unittests/workflow/utils/test_workflow_hitl_utils.py create mode 100644 tests/unittests/workflow/workflow_testing_utils.py create mode 100644 tox.ini diff --git a/.github/.release-please-manifest-v2.json b/.github/.release-please-manifest-v2.json deleted file mode 100644 index 0739396e62..0000000000 --- a/.github/.release-please-manifest-v2.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - ".": "2.0.0-alpha.0" -} diff --git a/.github/release-please-config-v2.json b/.github/release-please-config-v2.json deleted file mode 100644 index 6947d9e15a..0000000000 --- a/.github/release-please-config-v2.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", - "packages": { - ".": { - "release-type": "python", - "versioning": "prerelease", - "prerelease": true, - "prerelease-type": "alpha", - "package-name": "google-adk", - "include-component-in-tag": false, - "skip-github-release": true, - "changelog-path": "CHANGELOG-v2.md", - "changelog-sections": [ - { - "type": "feat", - "section": "Features" - }, - { - "type": "fix", - "section": "Bug Fixes" - }, - { - "type": "perf", - "section": "Performance Improvements" - }, - { - "type": "refactor", - "section": "Code Refactoring" - }, - { - "type": "docs", - "section": "Documentation" - }, - { - "type": "test", - "section": "Tests", - "hidden": true - }, - { - "type": "build", - "section": "Build System", - "hidden": true - }, - { - "type": "ci", - "section": "CI/CD", - "hidden": true - }, - { - "type": "style", - "section": "Styles", - "hidden": true - }, - { - "type": "chore", - "section": "Miscellaneous Chores", - "hidden": true - } - ] - } - } -} diff --git a/.github/workflows/check-file-contents.yml b/.github/workflows/check-file-contents.yml index 985f6a0f77..42d820ab47 100644 --- a/.github/workflows/check-file-contents.yml +++ b/.github/workflows/check-file-contents.yml @@ -100,3 +100,37 @@ jobs: else echo "✅ No relevant Python files found." fi + + - name: Check for hardcoded googleapis.com endpoints + run: | + git fetch origin ${GITHUB_BASE_REF} + CHANGED_FILES=$(git diff --diff-filter=ACMR --name-only origin/${GITHUB_BASE_REF}...HEAD | grep -E '\.py$' || true) + if [ -n "$CHANGED_FILES" ]; then + echo "Checking for hardcoded endpoints in: $CHANGED_FILES" + + # 1. Identify files containing any googleapis.com URL. + set +e + FILES_WITH_ENDPOINTS=$(grep -lE 'https?://[a-zA-Z0-9.-]+\.googleapis\.com' $CHANGED_FILES) + + # 2. From those, identify files that are MISSING the required mTLS version. + if [ -n "$FILES_WITH_ENDPOINTS" ]; then + FILES_MISSING_MTLS=$(grep -L '.mtls.googleapis.com' $FILES_WITH_ENDPOINTS) + fi + set -e + + if [ -n "$FILES_MISSING_MTLS" ]; then + echo "❌ Found hardcoded googleapis.com endpoints without mTLS support." + echo "The following files must define both standard and mTLS (.mtls.googleapis.com) endpoints" + echo "to support dynamic endpoint selection as required by security policy:" + echo "$FILES_MISSING_MTLS" + echo "" + echo "To fix this, please follow these steps:" + echo "1. Initialize an AuthorizedSession with your credentials." + echo "2. Use 'mtls.has_default_client_cert_source() from google-auth' to check for available client certificates." + echo "3. If certificates are present, use 'session.configure_mtls_channel()'." + echo "4. Dynamically select the '.mtls.' variant of the endpoint when mTLS is active." + exit 1 + else + echo "✅ All hardcoded endpoints have corresponding mTLS definitions or no endpoints found." + fi + fi diff --git a/.github/workflows/copybara-pr-handler.yml b/.github/workflows/copybara-pr-handler.yml index 4ca3c48803..28c0f3cdcd 100644 --- a/.github/workflows/copybara-pr-handler.yml +++ b/.github/workflows/copybara-pr-handler.yml @@ -57,15 +57,21 @@ jobs: console.log(`\n--- Processing commit ${sha.substring(0, 7)} ---`); console.log(`Committer: ${committer}`); - // Check if this is a Copybara commit - if (committer !== 'Copybara-Service') { + // Check if this is a Copybara commit or has a pull request reference + const isCopybara = committer === 'Copybara-Service' || + commit.author?.email === 'genai-sdk-bot@google.com' || + message.includes('GitOrigin-RevId:') || + message.includes('PiperOrigin-RevId:') || + /Merge:?\s+https:\/\/github\.com\/google\/adk-python\/pull\/(\d+)/.test(message); + + if (!isCopybara) { console.log('Not a Copybara commit, skipping'); continue; } // Extract PR number from commit message - // Pattern: "Merge https://github.com/google/adk-python/pull/3333" - const prMatch = message.match(/Merge https:\/\/github\.com\/google\/adk-python\/pull\/(\d+)/); + // Pattern matches both "Merge https://..." and "Merge: https://..." + const prMatch = message.match(/Merge:?\s+https:\/\/github\.com\/google\/adk-python\/pull\/(\d+)/); if (!prMatch) { console.log('No PR number found in Copybara commit message'); @@ -113,6 +119,14 @@ jobs: body: `Thank you @${author} for your contribution! 🎉\n\nYour changes have been successfully imported and merged via Copybara in commit ${commitSha}.\n\nClosing this PR as the changes are now in the main branch.` }); + // Add 'merged' label to the PR + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + labels: ['merged'] + }); + // Close the PR await github.rest.pulls.update({ owner: context.repo.owner, diff --git a/.github/workflows/issue-monitor.yml b/.github/workflows/issue-monitor.yml index 6fee4c9a7d..2f0ca04612 100644 --- a/.github/workflows/issue-monitor.yml +++ b/.github/workflows/issue-monitor.yml @@ -58,6 +58,6 @@ jobs: REPO: ${{ github.event.repository.name }} CONCURRENCY_LIMIT: 3 INITIAL_FULL_SCAN: ${{ github.event.inputs.full_scan == 'true' }} - LLM_MODEL_NAME: "gemini-2.5-flash" + LLM_MODEL_NAME: "gemini-3.5-flash" PYTHONPATH: contributing/samples/adk_team run: python -m adk_issue_monitoring_agent.main diff --git a/.github/workflows/python-unit-tests.yml b/.github/workflows/python-unit-tests.yml index fcedce9acc..cff6d69923 100644 --- a/.github/workflows/python-unit-tests.yml +++ b/.github/workflows/python-unit-tests.yml @@ -12,6 +12,7 @@ permissions: jobs: test: runs-on: ubuntu-latest + timeout-minutes: 10 strategy: matrix: python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] diff --git a/.github/workflows/release-v2-cherry-pick.yml b/.github/workflows/release-v2-cherry-pick.yml deleted file mode 100644 index f5641a55b3..0000000000 --- a/.github/workflows/release-v2-cherry-pick.yml +++ /dev/null @@ -1,43 +0,0 @@ -# Step 3 (v2, optional): Cherry-picks a commit from v2 to the release/v2-candidate branch. -# Use between step 1 and step 4 to include bug fixes in an in-progress release. -# Note: Does NOT auto-trigger release-please to preserve manual changelog edits. -name: "Release v2: Cherry-pick" - -on: - workflow_dispatch: - inputs: - commit_sha: - description: 'Commit SHA to cherry-pick' - required: true - type: string - -permissions: - contents: write - -jobs: - cherry-pick: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - with: - ref: release/v2-candidate - fetch-depth: 0 - - - name: Configure git - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - - name: Cherry-pick commit - run: | - echo "Cherry-picking ${INPUTS_COMMIT_SHA} to release/v2-candidate" - git cherry-pick ${INPUTS_COMMIT_SHA} - env: - INPUTS_COMMIT_SHA: ${{ inputs.commit_sha }} - - - name: Push changes - run: | - git push origin release/v2-candidate - echo "Successfully cherry-picked commit to release/v2-candidate" - echo "Note: Release Please is NOT auto-triggered to preserve manual changelog edits." - echo "Run release-v2-please.yml manually if you want to regenerate the changelog." diff --git a/.github/workflows/release-v2-cut.yml b/.github/workflows/release-v2-cut.yml deleted file mode 100644 index 52af5bf038..0000000000 --- a/.github/workflows/release-v2-cut.yml +++ /dev/null @@ -1,46 +0,0 @@ -# Step 1 (v2): Starts the v2 release process by creating a release/v2-candidate branch. -# Generates a changelog PR for review (step 2). -name: "Release v2: Cut" - -on: - workflow_dispatch: - inputs: - commit_sha: - description: 'Commit SHA to cut from (leave empty for latest v2)' - required: false - type: string - -permissions: - contents: write - actions: write - -jobs: - cut-release: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - with: - ref: ${{ inputs.commit_sha || 'v2' }} - - - name: Check for existing release/v2-candidate branch - env: - GH_TOKEN: ${{ github.token }} - run: | - if git ls-remote --exit-code --heads origin release/v2-candidate &>/dev/null; then - echo "Error: release/v2-candidate branch already exists" - echo "Please finalize or delete the existing release candidate before starting a new one" - exit 1 - fi - - - name: Create and push release/v2-candidate branch - run: | - git checkout -b release/v2-candidate - git push origin release/v2-candidate - echo "Created branch: release/v2-candidate" - - - name: Trigger Release Please - env: - GH_TOKEN: ${{ github.token }} - run: | - gh workflow run release-v2-please.yml --repo ${{ github.repository }} --ref release/v2-candidate - echo "Triggered Release Please workflow for v2" diff --git a/.github/workflows/release-v2-finalize.yml b/.github/workflows/release-v2-finalize.yml deleted file mode 100644 index c8b1020948..0000000000 --- a/.github/workflows/release-v2-finalize.yml +++ /dev/null @@ -1,85 +0,0 @@ -# Step 4 (v2): Triggers when the changelog PR is merged to release/v2-candidate. -# Records last-release-sha and renames release/v2-candidate to release/v{version}. -name: "Release v2: Finalize" - -on: - pull_request: - types: [closed] - branches: - - release/v2-candidate - -permissions: - contents: write - pull-requests: write - -jobs: - finalize: - if: github.event.pull_request.merged == true - runs-on: ubuntu-latest - steps: - - name: Check for release-please PR - id: check - env: - LABELS: ${{ toJson(github.event.pull_request.labels.*.name) }} - run: | - if echo "$LABELS" | grep -q "autorelease: pending"; then - echo "is_release_pr=true" >> $GITHUB_OUTPUT - else - echo "Not a release-please PR, skipping" - echo "is_release_pr=false" >> $GITHUB_OUTPUT - fi - - - uses: actions/checkout@v6 - if: steps.check.outputs.is_release_pr == 'true' - with: - ref: release/v2-candidate - token: ${{ secrets.RELEASE_PAT }} - fetch-depth: 0 - - - name: Extract version from manifest - if: steps.check.outputs.is_release_pr == 'true' - id: version - run: | - VERSION=$(jq -r '.["."]' .github/.release-please-manifest-v2.json) - echo "version=$VERSION" >> $GITHUB_OUTPUT - echo "Extracted version: $VERSION" - - - name: Configure git identity from RELEASE_PAT - if: steps.check.outputs.is_release_pr == 'true' - env: - GH_TOKEN: ${{ secrets.RELEASE_PAT }} - run: | - USER_JSON=$(gh api user) - git config user.name "$(echo "$USER_JSON" | jq -r '.login')" - git config user.email "$(echo "$USER_JSON" | jq -r '.id')+$(echo "$USER_JSON" | jq -r '.login')@users.noreply.github.com" - - - name: Record last-release-sha for release-please - if: steps.check.outputs.is_release_pr == 'true' - run: | - git fetch origin v2 - CUT_SHA=$(git merge-base origin/v2 HEAD) - echo "Release was cut from v2 at: $CUT_SHA" - jq --arg sha "$CUT_SHA" '. + {"last-release-sha": $sha}' \ - .github/release-please-config-v2.json > tmp.json && mv tmp.json .github/release-please-config-v2.json - git add .github/release-please-config-v2.json - git commit -m "chore: update last-release-sha for next v2 release" - git push origin release/v2-candidate - - - name: Rename release/v2-candidate to release/v{version} - if: steps.check.outputs.is_release_pr == 'true' - run: | - VERSION="v${STEPS_VERSION_OUTPUTS_VERSION}" - git push origin "release/v2-candidate:refs/heads/release/$VERSION" ":release/v2-candidate" - echo "Renamed release/v2-candidate to release/$VERSION" - env: - STEPS_VERSION_OUTPUTS_VERSION: ${{ steps.version.outputs.version }} - - - name: Update PR label to tagged - if: steps.check.outputs.is_release_pr == 'true' - env: - GH_TOKEN: ${{ github.token }} - run: | - gh pr edit ${{ github.event.pull_request.number }} \ - --remove-label "autorelease: pending" \ - --add-label "autorelease: tagged" - echo "Updated PR label to autorelease: tagged" diff --git a/.github/workflows/release-v2-please.yml b/.github/workflows/release-v2-please.yml deleted file mode 100644 index d659ca1c4e..0000000000 --- a/.github/workflows/release-v2-please.yml +++ /dev/null @@ -1,41 +0,0 @@ -# Runs release-please to create/update a PR with version bump and changelog for v2. -# Triggered only by workflow_dispatch (from release-v2-cut.yml). -# Does NOT auto-run on push to preserve manual changelog edits after cherry-picks. -name: "Release v2: Please" - -on: - # Only run via workflow_dispatch (triggered by release-v2-cut.yml) - workflow_dispatch: - -permissions: - contents: write - pull-requests: write - -jobs: - release-please: - runs-on: ubuntu-latest - steps: - - name: Check if release/v2-candidate still exists - id: check - env: - GH_TOKEN: ${{ github.token }} - run: | - if gh api repos/${{ github.repository }}/branches/release/v2-candidate --silent 2>/dev/null; then - echo "exists=true" >> $GITHUB_OUTPUT - else - echo "release/v2-candidate branch no longer exists, skipping" - echo "exists=false" >> $GITHUB_OUTPUT - fi - - - uses: actions/checkout@v6 - if: steps.check.outputs.exists == 'true' - with: - ref: release/v2-candidate - - - uses: googleapis/release-please-action@v4 - if: steps.check.outputs.exists == 'true' - with: - token: ${{ secrets.RELEASE_PAT }} - config-file: .github/release-please-config-v2.json - manifest-file: .github/.release-please-manifest-v2.json - target-branch: release/v2-candidate diff --git a/.github/workflows/release-v2-publish.yml b/.github/workflows/release-v2-publish.yml deleted file mode 100644 index 41edc78d9e..0000000000 --- a/.github/workflows/release-v2-publish.yml +++ /dev/null @@ -1,79 +0,0 @@ -# Step 6 (v2): Builds and publishes the v2 package to PyPI from a release/v{version} branch. -# Reads version from .release-please-manifest-v2.json, converts to PEP 440, -# updates version.py, then builds and publishes. -# Creates a merge-back PR (step 7) to sync release changes to v2. -name: "Release v2: Publish to PyPi" - -on: - workflow_dispatch: - -permissions: - contents: write - pull-requests: write - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - name: Validate branch - run: | - if [[ ! "${GITHUB_REF_NAME}" =~ ^release/v[0-9]+\.[0-9]+\.[0-9]+ ]]; then - echo "Error: Must run from a release/v* branch (e.g., release/v2.0.0-alpha.2)" - exit 1 - fi - - - uses: actions/checkout@v6 - - - name: Extract version from manifest and convert to PEP 440 - id: version - run: | - VERSION=$(jq -r '.["."]' .github/.release-please-manifest-v2.json) - echo "semver=$VERSION" >> $GITHUB_OUTPUT - echo "Semver version: $VERSION" - - # Convert semver pre-release to PEP 440: - # 2.0.0-alpha.1 -> 2.0.0a1 - # 2.0.0-beta.1 -> 2.0.0b1 - # 2.0.0-rc.1 -> 2.0.0rc1 - # 2.0.0 -> 2.0.0 (no change for stable) - PEP440=$(echo "$VERSION" | sed -E 's/-alpha\./a/; s/-beta\./b/; s/-rc\./rc/') - echo "pep440=$PEP440" >> $GITHUB_OUTPUT - echo "PEP 440 version: $PEP440" - - - name: Install uv - uses: astral-sh/setup-uv@v4 - with: - version: "latest" - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.11" - - - name: Update version.py with PEP 440 version - env: - PEP440_VERSION: ${{ steps.version.outputs.pep440 }} - run: | - sed -i "s/^__version__ = .*/__version__ = \"${PEP440_VERSION}\"/" src/google/adk/version.py - echo "Updated version.py to ${PEP440_VERSION}" - grep __version__ src/google/adk/version.py - - - name: Build package - run: uv build - - - name: Publish to PyPI - env: - UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }} - run: uv publish - - - name: Create merge-back PR - env: - GH_TOKEN: ${{ secrets.RELEASE_PAT }} - SEMVER_VERSION: ${{ steps.version.outputs.semver }} - PEP440_VERSION: ${{ steps.version.outputs.pep440 }} - run: | - gh pr create \ - --base v2 \ - --head "${GITHUB_REF_NAME}" \ - --title "chore: merge release v${PEP440_VERSION} to v2" \ - --body "Syncs version bump and CHANGELOG from release v${SEMVER_VERSION} to v2." diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml index e008549a6d..5653dd9eee 100644 --- a/.github/workflows/stale-bot.yml +++ b/.github/workflows/stale-bot.yml @@ -38,7 +38,7 @@ jobs: OWNER: ${{ github.repository_owner }} REPO: adk-python CONCURRENCY_LIMIT: 3 - LLM_MODEL_NAME: "gemini-2.5-flash" + LLM_MODEL_NAME: "gemini-3.5-flash" PYTHONPATH: contributing/samples/adk_team run: python -m adk_stale_agent.main diff --git a/.github/workflows/v2-sync.yml b/.github/workflows/v2-sync.yml deleted file mode 100644 index c627f40d46..0000000000 --- a/.github/workflows/v2-sync.yml +++ /dev/null @@ -1,59 +0,0 @@ -# Automatically creates a PR to merge main (v1) into v2 to keep v2 up to date. -# The oncall is responsible for reviewing and merging the sync PR. -name: "Sync: main -> v2" - -on: - schedule: - - cron: '0 6 * * *' # Daily at 6am UTC - workflow_dispatch: - -permissions: - contents: write - pull-requests: write - -jobs: - sync: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - with: - ref: v2 - fetch-depth: 0 - token: ${{ secrets.RELEASE_PAT }} - - - name: Check for new commits on main - id: check - run: | - git fetch origin main - BEHIND=$(git rev-list --count HEAD..origin/main) - echo "behind=$BEHIND" >> $GITHUB_OUTPUT - if [ "$BEHIND" -eq 0 ]; then - echo "v2 is up to date with main, nothing to sync" - else - echo "v2 is $BEHIND commit(s) behind main" - fi - - - name: Check for existing sync PR - if: steps.check.outputs.behind != '0' - id: existing - env: - GH_TOKEN: ${{ github.token }} - run: | - PR=$(gh pr list --base v2 --head main --state open --json number --jq '.[0].number // empty') - if [ -n "$PR" ]; then - echo "Sync PR #$PR already exists, skipping" - echo "exists=true" >> $GITHUB_OUTPUT - else - echo "exists=false" >> $GITHUB_OUTPUT - fi - - - name: Create sync PR - if: steps.check.outputs.behind != '0' && steps.existing.outputs.exists == 'false' - env: - GH_TOKEN: ${{ secrets.RELEASE_PAT }} - run: | - gh pr create \ - --base v2 \ - --head main \ - --title "chore: sync main -> v2" \ - --body "Automated sync of v1 changes from main into v2. The oncall is responsible for reviewing and merging this PR. Resolve conflicts in favor of the v2 implementation." diff --git a/.gitignore b/.gitignore index a4f3937c76..c3ddc7ea99 100644 --- a/.gitignore +++ b/.gitignore @@ -104,6 +104,7 @@ Thumbs.db .adk/ .claude/ .jetski* +.antigravity* CLAUDE.md .cursor/ .cursorrules diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 194d9306c3..24eecbeecf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -28,19 +28,18 @@ repos: else echo "Warning: addlicense not installed, skipping"; fi' -- language: system files: \.(py|sh)$ - # TODO: Add check-new-py-prefix hook back after resolving the exclusions/style rules for public v2 package structures. - # - id: check-new-py-prefix - # name: Check new Python files have _ prefix - # description: Enforces private-by-default policy for new Python files (see .agents/skills/adk-style/references/visibility.md). - # entry: scripts/check_new_py_files.sh - # language: script - # files: ^src/google/adk/.*\.py$ - # pass_filenames: false + - id: check-new-py-prefix + name: Check new Python files have _ prefix + description: Enforces private-by-default policy for new Python files (see .agents/skills/adk-style/references/visibility.md). + entry: scripts/check_new_py_files.sh + language: script + files: ^src/google/adk/.*\.py$ + pass_filenames: false - repo: https://github.com/executablebooks/mdformat rev: 0.7.22 hooks: - id: mdformat files: ^(README\.md|CONTRIBUTING\.md|contributing/.*\.md)$ - exclude: (?i)(skills/|SKILL\.md$) + exclude: (?i)SKILL\.md$ additional_dependencies: - mdformat-gfm diff --git a/AGENTS.md b/AGENTS.md index 258b509e20..efae707ea1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -14,6 +14,13 @@ For all matters regarding ADK development, please use the appropriate skill: - Read `.agents/skills/adk-git/SKILL.md` for full instructions. - **`adk-sample-creator`**: Use this skill when creating new samples demonstrating features or agent patterns, or when adding examples to subdirectories under `contributing/`. - Read `.agents/skills/adk-sample-creator/SKILL.md` for full instructions. +- **`adk-review`**: Use this skill to review local changes for errors, style compliance, unintended outcomes, and to check if associated design docs, guides, samples, or tests need updates. + - Read `.agents/skills/adk-review/SKILL.md` for full instructions. +- **`adk-issue`**: Use this skill when analyzing and triaging GitHub issues for the adk-python repository to verify legitimacy, recommend fixes, and check for existing PRs. + - Read `.agents/skills/adk-issue/SKILL.md` for full instructions. +- **`adk-pr-triage`**: Use this skill when triaging and analyzing GitHub pull requests (PRs) to evaluate their objectives, legitimacy, value, and alignment with ADK's architectural, styling, and testing principles. + - Read `.agents/skills/adk-pr-triage/SKILL.md` for full instructions. + ## Project Overview diff --git a/CHANGELOG-v2.md b/CHANGELOG-v2.md new file mode 100644 index 0000000000..fd8796b82b --- /dev/null +++ b/CHANGELOG-v2.md @@ -0,0 +1,14 @@ +# Changelog + +## [2.0.0-alpha.1](https://github.com/google/adk-python/compare/v2.0.0-alpha.0...v2.0.0-alpha.1) (2026-03-18) + +### Features + +Introduces two major capabilities: +* Workflow runtime: graph-based execution engine for composing + deterministic execution flows for agentic apps, with support for + routing, fan-out/fan-in, loops, retry, state management, dynamic + nodes, human-in-the-loop, and nested workflows +* Task API: structured agent-to-agent delegation with multi-turn + task mode, single-turn controlled output, mixed delegation + patterns, human-in-the-loop, and task agents as workflow nodes diff --git a/contributing/samples/core/abort/README.md b/contributing/samples/core/abort/README.md new file mode 100644 index 0000000000..28c386eaf6 --- /dev/null +++ b/contributing/samples/core/abort/README.md @@ -0,0 +1,91 @@ +# Abort Agent Sample + +## Overview + +This sample demonstrates a standalone ADK agent designed specifically to showcase cooperative task cancellation on client disconnections. + +The agent leverages a custom tool that counts from 1 to a target number requested by the user, pausing 1 second between each count and printing the progress directly to the server's stdout terminal. This delay allows you to easily trigger connection drops (by cancelling client requests mid-execution) and visually observe that background agent execution halts immediately in the server terminal, resolving resource leaks. + +## Sample Inputs + +- `Count to 10 seconds` + + The agent will call the `count_seconds` tool with a target count of 10, pausing 1 second between each increment. + +- `Please count up to 20` + + The agent will invoke the tool to count to 20. If you close the client connection (such as pressing `Ctrl+C` in a cURL window or closing your browser tab) while the loop is running, counting halts immediately. + +## Graph + +```mermaid +graph TD + START --> AbortAgent + AbortAgent --> |"Invoke Tool"| count_seconds + count_seconds --> |"Abort if Disconnected / Done"| AbortAgent + AbortAgent --> ANSWER +``` + +## How To + +### 1. Running Locally via the CLI + +To interact with the agent in your local shell terminal: + +```bash +adk run contributing/samples/core/abort/ +``` + +Type `count to 10` at the `[user]:` prompt. Pressing `Ctrl+C` mid-run will abort counting and exit. + +### 2. Running via HTTP Server and cURL + +To verify connection-drop abortion over network protocols (e.g. simple HTTP REST request): + +1. Start the local development server to watch the sample workspace: + ```bash + adk web --allow_origins=http://localhost:4200 contributing/samples/ + ``` +1. In a separate terminal, register the test session (local CLI development servers run with `--auto_create_session` set to `False` by default): + ```bash + curl -X POST http://localhost:8000/apps/abort_agent/users/user/sessions \ + -H "Content-Type: application/json" \ + -d '{"session_id": "8b24e6ed-1fff-4f0c-a06a-e065692a446e"}' + ``` +1. Initiate the count request (this blocks waiting for a response): + ```bash + curl -X POST http://localhost:8000/run \ + -H "Content-Type: application/json" \ + -d '{ + "app_name": "abort_agent", + "user_id": "user", + "session_id": "8b24e6ed-1fff-4f0c-a06a-e065692a446e", + "new_message": { + "role": "user", + "parts": [{"text": "count to 100"}] + } + }' + ``` +1. Observe your `adk web` terminal window. You will see the counting progress logging. +1. **Trigger the Abort**: Press `Ctrl+C` in your cURL terminal window to close the client connection. +1. Observe the server console window. Counting halts instantly and prints: + ```text + [Counting Tool] Count was ABORTED mid-run at progress: X/100 (Client Disconnected)! + ``` + +### 3. Running and Testing via ADK Web (Dev UI) + +To observe cooperative aborts interactively in the web-based developer interface: + +1. Start the local development server: + ```bash + adk web --allow_origins=http://localhost:4200 contributing/samples/ + ``` +1. Open the ADK Web interface (`http://localhost:4200`) in your web browser. +1. Select the **`abort_agent`** app from the left sidebar panel. +1. Type `count to 100` in the message input box and click submit. +1. **Trigger the Abort**: Simply close your browser tab, refresh the page, or navigate away from the chat panel. +1. Observe the server's stdout terminal console. You will see that counting halts immediately and logs: + ```text + [Counting Tool] Count was ABORTED mid-run (Client Disconnected)! + ``` diff --git a/contributing/samples/core/abort/__init__.py b/contributing/samples/core/abort/__init__.py new file mode 100644 index 0000000000..4015e47d6e --- /dev/null +++ b/contributing/samples/core/abort/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/core/abort/agent.py b/contributing/samples/core/abort/agent.py new file mode 100644 index 0000000000..117cb2d70e --- /dev/null +++ b/contributing/samples/core/abort/agent.py @@ -0,0 +1,70 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import logging + +from google.adk import Agent + +logger = logging.getLogger("google_adk." + __name__) + + +async def count_seconds(target: int) -> str: + """Counts from 1 to the target number, pausing 1 second between counts, and prints each count. + + Args: + target: The target number to count to. + """ + logger.info("Starting count from 1 to %d...", target) + print( + f"\n[Counting Tool] Starting counting up to {target} in console...", + flush=True, + ) + + i = 0 + try: + for i in range(1, target + 1): + await asyncio.sleep(1) + # Print to standard stdout so it shows directly in the server terminal + print(f"[Counting Tool] Progress: {i}/{target}", flush=True) + logger.info("Counted: %d/%d", i, target) + + print( + f"[Counting Tool] Finished counting up to {target}.\n", + flush=True, + ) + return f"Successfully counted from 1 to {target} in the console." + except asyncio.CancelledError: + print( + f"\n[Counting Tool] Count was ABORTED mid-run at progress: {i}/{target}" + " (Client Disconnected)!\n", + flush=True, + ) + logger.warning("Counting tool was cancelled mid-run.") + raise + + +root_agent = Agent( + name="abort_agent", + description=( + "An agent designed to demonstrate how ADK handles client disconnects" + " and aborts agent executions mid-run using a counting loop with a" + " 1-second delay." + ), + instruction="""You are an abort coordinator. +Your goal is to demonstrate cooperative task abortion. +When asked to count to a number (or count for a number of seconds), invoke the `count_seconds` tool with the target number. +Do not try to count by yourself; always delegate counting to the `count_seconds` tool so that progress is accurately printed and logs can show task cancellation when a disconnect happens.""", + tools=[count_seconds], +) diff --git a/contributing/samples/hitl/request_input_tool/README.md b/contributing/samples/hitl/request_input_tool/README.md new file mode 100644 index 0000000000..a9c8b507b2 --- /dev/null +++ b/contributing/samples/hitl/request_input_tool/README.md @@ -0,0 +1,49 @@ +# Request Input Tool Sample + +## Overview + +This sample demonstrates how an LLM agent can proactively request clarification or confirmation from the user using the built-in `request_input` tool without losing its context/flow. + +It showcases a highly realistic support assistant that dynamically constructs a JSON schema to only ask for missing details when creating IT support tickets. + +## Sample Inputs + +- `I want to file a technical ticket for a database crash.` + + The agent will analyze the prompt, identify that the `title` and `category` are already provided, and dynamically call `request_input` with a schema requesting only `description` and `priority`. + +- `File a priority HIGH technical ticket titled database crash explained as the MySQL server throwing OOM errors.` + + The agent has all required details and will call `create_support_ticket` immediately without needing clarification. + +## Graph + +```mermaid +graph TD + User[User Prompt] --> Agent[Support Assistant Agent] + Agent -->|Needs Clarification| RequestInput[request_input tool] + RequestInput -->|User Response| Agent + Agent -->|All Details Gathered| CreateTicket[create_support_ticket tool] +``` + +## How To + +This sample uses **Pattern B: Standalone Agents** with the `request_input` tool: + +1. **Import `request_input`**: + + ```python + from google.adk.tools import request_input + ``` + +1. **Add it to the LLM Agent's tools list**: + + ```python + root_agent = Agent( + name="support_assistant_agent", + tools=[create_support_ticket, request_input], + ... + ) + ``` + +When the LLM decides it needs clarification, it calls `request_input` with a question and a dynamic `response_schema`. The ADK framework automatically intercepts this, yields a long-running interrupt to the client, and injects the user's reply back as a `FunctionResponse` into the LLM's chat history. diff --git a/contributing/samples/hitl/request_input_tool/agent.py b/contributing/samples/hitl/request_input_tool/agent.py new file mode 100644 index 0000000000..ef3631961a --- /dev/null +++ b/contributing/samples/hitl/request_input_tool/agent.py @@ -0,0 +1,62 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk import Agent +from google.adk.tools import request_input +from google.genai import types +from pydantic import BaseModel +from pydantic import Field + + +class SupportTicket(BaseModel): + """Details of the IT support ticket to be created.""" + + title: str = Field(description="A brief summary of the issue.") + description: str = Field(description="Detailed explanation of the problem.") + priority: str = Field( + default="MEDIUM", + description="Ticket priority: LOW, MEDIUM, HIGH, or CRITICAL.", + ) + category: str = Field( + description=( + "Issue category, e.g., billing, technical, account, or database." + ) + ) + + +def create_support_ticket(ticket: SupportTicket) -> dict[str, str]: + """Create a support ticket in the IT ticketing system.""" + return { + "status": "success", + "message": ( + f"Successfully created ticket '{ticket.title}'" + f" [Category: {ticket.category}, Priority: {ticket.priority}]." + ), + "ticket_id": "INC-98471", + } + + +root_agent = Agent( + name="support_assistant_agent", + instruction=""" + You are a helpful IT support assistant responsible for creating support tickets. + When the user requests to create or file a ticket: + 1. Identify which ticket details (title, description, priority, category) are already provided in the conversation. + 2. If any mandatory details are missing, call the `request_input` tool. + 3. When calling `request_input`, you must construct a dynamic JSON `response_schema` (type: "object") that ONLY requests the missing details, and specify a helpful message explaining what is needed. + 4. Once all details are gathered, call `create_support_ticket` with the complete SupportTicket details. + """, + tools=[create_support_ticket, request_input], + generate_content_config=types.GenerateContentConfig(temperature=0.1), +) diff --git a/contributing/samples/hitl/request_input_tool/tests/create_support_ticket.json b/contributing/samples/hitl/request_input_tool/tests/create_support_ticket.json new file mode 100644 index 0000000000..6610d47c66 --- /dev/null +++ b/contributing/samples/hitl/request_input_tool/tests/create_support_ticket.json @@ -0,0 +1,159 @@ +{ + "events": [ + { + "author": "user", + "content": { + "parts": [ + { + "text": "I want to file a technical ticket for a database crash." + } + ], + "role": "user" + }, + "id": "e-1", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "support_assistant_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "message": "I can help with that. Please provide the description and priority of the database crash:", + "response_schema": { + "properties": { + "description": { + "description": "Detailed explanation of the database crash problem.", + "title": "Description", + "type": "string" + }, + "priority": { + "description": "Ticket priority: LOW, MEDIUM, HIGH, or CRITICAL.", + "title": "Priority", + "type": "string" + } + }, + "required": [ + "description", + "priority" + ], + "title": "TicketClarification", + "type": "object" + } + }, + "id": "fc-1", + "name": "adk_request_input" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-2", + "invocationId": "i-1", + "longRunningToolIds": [ + "fc-1" + ], + "nodeInfo": { + "path": "support_assistant_agent@1" + } + }, + { + "author": "user", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-1", + "name": "adk_request_input", + "response": { + "description": "The MySQL server is throwing OOM errors and restarting repeatedly.", + "priority": "HIGH" + } + } + } + ], + "role": "user" + }, + "id": "e-3", + "invocationId": "i-1", + "nodeInfo": { + "path": "" + } + }, + { + "author": "support_assistant_agent", + "content": { + "parts": [ + { + "functionCall": { + "args": { + "ticket": { + "category": "database", + "description": "The MySQL server is throwing OOM errors and restarting repeatedly.", + "priority": "HIGH", + "title": "Database crash" + } + }, + "id": "fc-2", + "name": "create_support_ticket" + } + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-4", + "invocationId": "i-1", + "longRunningToolIds": [], + "nodeInfo": { + "path": "support_assistant_agent@1" + } + }, + { + "author": "support_assistant_agent", + "content": { + "parts": [ + { + "functionResponse": { + "id": "fc-2", + "name": "create_support_ticket", + "response": { + "message": "Successfully created ticket 'Database crash' [Category: database, Priority: HIGH].", + "status": "success", + "ticket_id": "INC-98471" + } + } + } + ], + "role": "user" + }, + "id": "e-5", + "invocationId": "i-1", + "nodeInfo": { + "path": "support_assistant_agent@1" + } + }, + { + "author": "support_assistant_agent", + "content": { + "parts": [ + { + "text": "Successfully created ticket 'Database crash' [Category: database, Priority: HIGH] with ticket ID INC-98471." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "id": "e-6", + "invocationId": "i-1", + "nodeInfo": { + "path": "support_assistant_agent@1" + } + } + ] +} diff --git a/contributing/samples/models/interactions_api/agent.py b/contributing/samples/models/interactions_api/agent.py index ffdfeeb1e6..59cec77c45 100644 --- a/contributing/samples/models/interactions_api/agent.py +++ b/contributing/samples/models/interactions_api/agent.py @@ -12,19 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Agent definition for testing the Interactions API integration. - -NOTE: The Interactions API does NOT support mixing custom function calling tools -with built-in tools in the same agent. To work around this limitation, we use -bypass_multi_tools_limit=True on GoogleSearchTool, which converts the built-in -google_search to a function calling tool (via GoogleSearchAgentTool). - -The bypass is only triggered when len(agent.tools) > 1, so we include multiple -tools in the agent (GoogleSearchTool + get_current_weather). - -With bypass_multi_tools_limit=True and multiple tools, all tools become function -calling tools, which allows mixing google_search with custom function tools. -""" +"""Agent definition for testing the Interactions API integration.""" from google.adk.agents.llm_agent import Agent from google.adk.models.google_llm import Gemini @@ -74,16 +62,13 @@ def get_current_weather(city: str) -> dict: } -# Main agent with google_search (via bypass) and custom function tools -# Using bypass_multi_tools_limit=True converts google_search to a function calling tool. -# We need len(tools) > 1 to trigger the bypass, so we include get_current_weather directly. -# This allows mixing google_search with custom function tools via the Interactions API. +# Main agent with google_search built-in tool and custom function tools # # NOTE: code_executor is not compatible with function calling mode because the model # tries to call a function (e.g., run_code) instead of outputting code in markdown. root_agent = Agent( model=Gemini( - model="gemini-3-flash-preview", + model="gemini-3.1-flash-lite", use_interactions_api=True, ), name="interactions_test_agent", @@ -99,7 +84,7 @@ def get_current_weather(city: str) -> dict: Be concise and helpful in your responses. Always confirm what you did. """, tools=[ - GoogleSearchTool(bypass_multi_tools_limit=True), + GoogleSearchTool(), get_current_weather, ], ) diff --git a/contributing/samples/models/interactions_api/main.py b/contributing/samples/models/interactions_api/main.py index a776f31ea9..8b40c3c12e 100644 --- a/contributing/samples/models/interactions_api/main.py +++ b/contributing/samples/models/interactions_api/main.py @@ -16,17 +16,11 @@ This script tests the following features: 1. Basic text generation -2. Google Search tool (via bypass_multi_tools_limit) +2. Google Search tool 3. Multi-turn conversations with stateful interactions 4. Google Search tool (additional coverage) 5. Custom function tool (get_current_weather) -NOTE: The Interactions API does NOT support mixing custom function calling tools -with built-in tools. To work around this, we use bypass_multi_tools_limit=True -on GoogleSearchTool, which converts it to a function calling tool (via -GoogleSearchAgentTool). The bypass only triggers when len(agent.tools) > 1, -so we include both GoogleSearchTool and get_current_weather in the agent. - NOTE: Code execution via UnsafeLocalCodeExecutor is not compatible with function calling mode because the model tries to call a function instead of outputting code in markdown. @@ -41,7 +35,6 @@ import logging from pathlib import Path import time -from typing import Optional from dotenv import load_dotenv from google.adk.agents.run_config import RunConfig @@ -49,6 +42,7 @@ from google.adk.runners import InMemoryRunner from google.adk.runners import Runner from google.genai import types +import httpx from .agent import root_agent @@ -67,7 +61,8 @@ async def call_agent_async( prompt: str, agent_name: str = "", show_interaction_id: bool = True, -) -> tuple[str, Optional[str]]: + additional_parts: list[types.Part] | None = None, +) -> tuple[str, str | None]: """Call the agent asynchronously with the user's prompt. Args: @@ -77,13 +72,16 @@ async def call_agent_async( prompt: The prompt to send agent_name: The expected agent name for filtering responses show_interaction_id: Whether to show interaction IDs in output + additional_parts: Optional list of additional content parts (e.g. files) Returns: A tuple of (response_text, interaction_id) """ - content = types.Content( - role="user", parts=[types.Part.from_text(text=prompt)] - ) + parts = [types.Part.from_text(text=prompt)] + if additional_parts: + parts.extend(additional_parts) + + content = types.Content(role="user", parts=parts) final_response_text = "" last_interaction_id = None @@ -264,6 +262,39 @@ async def test_custom_function_tool(runner: Runner, session_id: str): return interaction_id +async def test_pdf_summarization(runner: Runner, session_id: str) -> str | None: + """Test PDF summarization using the Interactions API.""" + print("\n" + "=" * 60) + print("TEST 6: PDF Summarization") + print("=" * 60) + + url = "https://storage.googleapis.com/cloud-samples-data/generative-ai/pdf/2403.05530.pdf" + print(f"Downloading {url}...") + async with httpx.AsyncClient() as client: + response = await client.get( + url, headers={"User-Agent": "Mozilla/5.0"}, follow_redirects=True + ) + response.raise_for_status() + pdf_bytes = response.content + + pdf_part = types.Part.from_bytes(data=pdf_bytes, mime_type="application/pdf") + response, interaction_id = await call_agent_async( + runner, + USER_ID, + session_id, + "Please summarize the attached PDF document.", + additional_parts=[pdf_part], + ) + + assert response, "Expected a non-empty response" + assert len(response) > 0, f"Expected summary in response: {response}" + assert ( + "gemini" in response.lower() or "multimodal" in response.lower() + ), f"Expected summary of PDF in response: {response}" + print("PASSED: PDF Summarization works") + return interaction_id + + def check_interactions_api_available() -> bool: """Check if the interactions API is available in the SDK.""" try: @@ -311,6 +342,7 @@ async def run_all_tests(): await test_multi_turn_conversation(runner, session.id) await test_google_search_tool(runner, session.id) await test_custom_function_tool(runner, session.id) + await test_pdf_summarization(runner, session.id) print("\n" + "=" * 60) print("ALL TESTS PASSED (Interactions API)") diff --git a/pyproject.toml b/pyproject.toml index cd87d3735c..c8f8a86a16 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,9 +36,9 @@ dependencies = [ "aiosqlite>=0.21", "authlib>=1.6.6,<2", "click>=8.1.8,<9", - "fastapi>=0.124.1,<1", + "fastapi>=0.133,<1", "google-auth[pyopenssl]>=2.47", - "google-genai>=1.72,<2", + "google-genai>=2.4,<3", "graphviz>=0.20.2,<1", "httpx>=0.27,<1", "jsonschema>=4.23,<5", @@ -51,7 +51,7 @@ dependencies = [ # go/keep-sorted start "pyyaml>=6.0.2,<7", "requests>=2.32.4,<3", - "starlette>=0.49.1,<1", + "starlette>=1.0.1,<2", "tenacity>=9,<10", "typing-extensions>=4.5,<5", "tzlocal>=5.3,<6", diff --git a/src/google/adk/__init__.py b/src/google/adk/__init__.py index d48806bacd..be9d2af08b 100644 --- a/src/google/adk/__init__.py +++ b/src/google/adk/__init__.py @@ -17,7 +17,9 @@ from . import version from .agents.context import Context from .agents.llm_agent import Agent +from .events.event import Event from .runners import Runner +from .workflow import Workflow __version__ = version.__version__ -__all__ = ["Agent", "Context", "Runner"] +__all__ = ["Agent", "Context", "Event", "Runner", "Workflow"] diff --git a/src/google/adk/a2a/agent/__init__.py b/src/google/adk/a2a/agent/__init__.py index 8026986eea..6e247a8fb3 100644 --- a/src/google/adk/a2a/agent/__init__.py +++ b/src/google/adk/a2a/agent/__init__.py @@ -14,12 +14,32 @@ """A2A agents package.""" -from .config import A2aRemoteAgentConfig -from .config import ParametersConfig -from .config import RequestInterceptor +from ...utils._dependency import missing_extra __all__ = [ "A2aRemoteAgentConfig", "ParametersConfig", "RequestInterceptor", ] + + +def __getattr__(name: str): + if name in [ + "A2aRemoteAgentConfig", + "ParametersConfig", + "RequestInterceptor", + ]: + try: + from .config import A2aRemoteAgentConfig + from .config import ParametersConfig + from .config import RequestInterceptor + + if name == "A2aRemoteAgentConfig": + return A2aRemoteAgentConfig + elif name == "ParametersConfig": + return ParametersConfig + elif name == "RequestInterceptor": + return RequestInterceptor + except ImportError as e: + raise missing_extra("a2a-sdk", "a2a") from e + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/src/google/adk/agents/__init__.py b/src/google/adk/agents/__init__.py index bfb597f84d..9d5749f50f 100644 --- a/src/google/adk/agents/__init__.py +++ b/src/google/adk/agents/__init__.py @@ -13,19 +13,25 @@ # limitations under the License. import importlib +from typing import Any from typing import TYPE_CHECKING from .base_agent import BaseAgent +from .base_agent_config import BaseAgentConfig from .context import Context from .invocation_context import InvocationContext from .live_request_queue import LiveRequest from .live_request_queue import LiveRequestQueue from .llm_agent import Agent from .llm_agent import LlmAgent +from .llm_agent_config import LlmAgentConfig from .loop_agent import LoopAgent +from .loop_agent_config import LoopAgentConfig from .parallel_agent import ParallelAgent +from .parallel_agent_config import ParallelAgentConfig from .run_config import RunConfig from .sequential_agent import SequentialAgent +from .sequential_agent_config import SequentialAgentConfig if TYPE_CHECKING: from .mcp_instruction_provider import McpInstructionProvider @@ -43,17 +49,22 @@ 'LiveRequest', 'LiveRequestQueue', 'RunConfig', + 'BaseAgentConfig', + 'LlmAgentConfig', + 'LoopAgentConfig', + 'ParallelAgentConfig', + 'SequentialAgentConfig', ] -def __getattr__(name: str): +def __getattr__(name: str) -> Any: if name == 'McpInstructionProvider': - try: - module = importlib.import_module(f'{__name__}.mcp_instruction_provider') - except ImportError as e: - raise ImportError( - '`McpInstructionProvider` requires the `mcp` package.' - ' Install with: pip install google-adk[extensions]' - ) from e - return module.McpInstructionProvider + module = importlib.import_module('.mcp_instruction_provider', __name__) + attr = getattr(module, 'McpInstructionProvider') + globals()[name] = attr + return attr raise AttributeError(f'module {__name__!r} has no attribute {name!r}') + + +def __dir__() -> list[str]: + return list(globals().keys()) + __all__ diff --git a/src/google/adk/agents/agent_config.py b/src/google/adk/agents/agent_config.py index 2d3c6270ca..f7e9d5ebda 100644 --- a/src/google/adk/agents/agent_config.py +++ b/src/google/adk/agents/agent_config.py @@ -21,6 +21,7 @@ from pydantic import Discriminator from pydantic import RootModel from pydantic import Tag +from typing_extensions import deprecated from ..features import experimental from ..features import FeatureName @@ -68,6 +69,7 @@ def agent_config_discriminator(v: Any) -> str: # Use a RootModel to represent the agent directly at the top level. # The `discriminator` is applied to the union within the RootModel. +@deprecated("AgentConfig is deprecated and will be removed in future versions.") @experimental(FeatureName.AGENT_CONFIG) class AgentConfig(RootModel[ConfigsUnion]): """The config for the YAML schema to create an agent.""" diff --git a/src/google/adk/agents/base_agent.py b/src/google/adk/agents/base_agent.py index 91fb568cd3..c21b7a8ee9 100644 --- a/src/google/adk/agents/base_agent.py +++ b/src/google/adk/agents/base_agent.py @@ -14,6 +14,7 @@ from __future__ import annotations +import abc import inspect import logging from typing import Any @@ -35,6 +36,7 @@ from pydantic import ConfigDict from pydantic import Field from pydantic import field_validator +from typing_extensions import deprecated from typing_extensions import override from typing_extensions import TypeAlias @@ -44,8 +46,12 @@ from ..features import FeatureName from ..telemetry import _instrumentation from ..utils.context_utils import Aclosing -from .base_agent_config import BaseAgentConfig +from ..workflow import BaseNode +from .base_agent_config import BaseAgentConfig as BaseAgentConfig from .callback_context import CallbackContext +from .context import Context + +__all__ = ['BaseAgentConfig'] if TYPE_CHECKING: from .invocation_context import InvocationContext @@ -82,7 +88,9 @@ class BaseAgentState(BaseModel): AgentState = TypeVar('AgentState', bound=BaseAgentState) -class BaseAgent(BaseModel): +# TODO: drop the explicit abc.ABC base once BaseNode surfaces ABCMeta to +# static type checkers. +class BaseAgent(BaseNode, abc.ABC): """Base class for all agents in Agent Development Kit.""" model_config = ConfigDict( @@ -94,6 +102,9 @@ class BaseAgent(BaseModel): config_type: ClassVar[type[BaseAgentConfig]] = BaseAgentConfig """The config type for this agent. + DEPRECATED: This attribute is deprecated and will be removed in a future + version, along with the AgentConfig YAML loader. + Sub-classes should override this to specify their own config type. Example: @@ -269,7 +280,6 @@ def clone( cloned_agent.parent_agent = None return cloned_agent - @final async def run_async( self, parent_context: InvocationContext, @@ -301,6 +311,25 @@ async def run_async( if event := await self._handle_after_agent_callback(ctx): yield event + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + """Runs the agent as a node.""" + async for event in self.run_async( + parent_context=ctx.get_invocation_context() + ): + # Preserve author by setting it in context for NodeRunner + if event.author: + ctx.event_author = event.author + + if not event.node_info.path and event.author == self.name: + event.node_info.path = ctx.node_path + yield event + @final async def run_live( self, @@ -547,6 +576,7 @@ async def _handle_after_agent_callback( @override def model_post_init(self, __context: Any) -> None: + super().model_post_init(__context) self.__set_parent_agent_for_sub_agents() @field_validator('name', mode='after') @@ -616,8 +646,11 @@ def __set_parent_agent_for_sub_agents(self) -> BaseAgent: sub_agent.parent_agent = self return self - @final @classmethod + @deprecated( + 'BaseAgent.from_config is deprecated and will be removed in future' + ' versions.' + ) @experimental(FeatureName.AGENT_CONFIG) def from_config( cls: Type[SelfAgent], @@ -626,8 +659,8 @@ def from_config( ) -> SelfAgent: """Creates an agent from a config. - If sub-classes uses a custom agent config, override `_from_config_kwargs` - method to return an updated kwargs for agent constructor. + If sub-classes use a custom agent config, override `_parse_config` to + return updated kwargs for the agent constructor. Args: config: The config to create the agent from. @@ -694,4 +727,11 @@ def __create_kwargs( kwargs['after_agent_callback'] = resolve_callbacks( config.after_agent_callbacks ) + + # Preserves 1.x AgentConfigMapper behavior: extra YAML fields that match + # a constructor parameter pass through automatically. + if config.model_extra: + for key, value in config.model_extra.items(): + if key in cls.model_fields and key not in kwargs: + kwargs[key] = value return kwargs diff --git a/src/google/adk/agents/base_agent_config.py b/src/google/adk/agents/base_agent_config.py index 3859cb3550..6d20fed9d9 100644 --- a/src/google/adk/agents/base_agent_config.py +++ b/src/google/adk/agents/base_agent_config.py @@ -25,6 +25,7 @@ from pydantic import BaseModel from pydantic import ConfigDict from pydantic import Field +from typing_extensions import deprecated from ..features import experimental from ..features import FeatureName @@ -34,6 +35,9 @@ TBaseAgentConfig = TypeVar('TBaseAgentConfig', bound='BaseAgentConfig') +@deprecated( + 'BaseAgentConfig is deprecated and will be removed in future versions.' +) @experimental(FeatureName.AGENT_CONFIG) class BaseAgentConfig(BaseModel): """The config for the YAML schema of a BaseAgent. diff --git a/src/google/adk/agents/common_configs.py b/src/google/adk/agents/common_configs.py index cefab0e8d1..73ee07e9ee 100644 --- a/src/google/adk/agents/common_configs.py +++ b/src/google/adk/agents/common_configs.py @@ -16,8 +16,6 @@ from __future__ import annotations -from typing import Any -from typing import List from typing import Optional from pydantic import BaseModel @@ -28,33 +26,18 @@ from ..features import FeatureName -@experimental(FeatureName.AGENT_CONFIG) -class ArgumentConfig(BaseModel): - """An argument passed to a function or a class's constructor.""" - - model_config = ConfigDict(extra="forbid") - - name: Optional[str] = None - """Optional. The argument name. - - When the argument is for a positional argument, this can be omitted. - """ - - value: Any - """The argument value.""" - - @experimental(FeatureName.AGENT_CONFIG) class CodeConfig(BaseModel): """Code reference config for a variable, a function, or a class. - This config is used for configuring callbacks and tools. + Only references an object by name. YAML cannot pass constructor args; to + use a configured object, build it in Python and reference its FQN here. """ model_config = ConfigDict(extra="forbid") name: str - """Required. The name of the variable, function, class, etc. in code. + """Required. The fully qualified name of the variable, function, or class. Examples: @@ -65,22 +48,6 @@ class CodeConfig(BaseModel): When used for callbacks, it refers to a function, e.g. `my_library.my_callbacks.my_callback` """ - args: Optional[List[ArgumentConfig]] = None - """Optional. The arguments for the code when `name` refers to a function or a - class's constructor. - - Examples: - ``` - tools - - name: AgentTool - args: - - name: agent - value: search_agent.yaml - - name: skip_summarization - value: True - ``` - """ - @experimental(FeatureName.AGENT_CONFIG) class AgentRefConfig(BaseModel): diff --git a/src/google/adk/agents/config_agent_utils.py b/src/google/adk/agents/config_agent_utils.py index f9a3e7f594..82aaa6e452 100644 --- a/src/google/adk/agents/config_agent_utils.py +++ b/src/google/adk/agents/config_agent_utils.py @@ -20,6 +20,7 @@ from typing import Any from typing import List +from typing_extensions import deprecated import yaml from ..features import experimental @@ -31,6 +32,7 @@ from .common_configs import CodeConfig +@deprecated("from_config is deprecated and will be removed in future versions.") @experimental(FeatureName.AGENT_CONFIG) def from_config(config_path: str) -> BaseAgent: """Build agent from a configfile path. @@ -80,31 +82,6 @@ def _resolve_agent_class(agent_class: str) -> type[BaseAgent]: ) -_BLOCKED_YAML_KEYS = frozenset({"args"}) -_ENFORCE_DENYLIST = False - - -def _set_enforce_denylist(value: bool) -> None: - global _ENFORCE_DENYLIST - _ENFORCE_DENYLIST = value - - -def _check_config_for_blocked_keys(node: Any, filename: str) -> None: - """Recursively check if the configuration contains any blocked keys.""" - if isinstance(node, dict): - for key, value in node.items(): - if key in _BLOCKED_YAML_KEYS: - raise ValueError( - f"Blocked key {key!r} found in {filename!r}. " - f"The '{key}' field is not allowed in agent configurations " - "because it can execute arbitrary code." - ) - _check_config_for_blocked_keys(value, filename) - elif isinstance(node, list): - for item in node: - _check_config_for_blocked_keys(item, filename) - - def _load_config_from_path(config_path: str) -> AgentConfig: """Load an agent's configuration from a YAML file. @@ -125,9 +102,6 @@ def _load_config_from_path(config_path: str) -> AgentConfig: with open(config_path, "r", encoding="utf-8") as f: config_data = yaml.safe_load(f) - if _ENFORCE_DENYLIST: - _check_config_for_blocked_keys(config_data, config_path) - return AgentConfig.model_validate(config_data) @@ -217,15 +191,7 @@ def resolve_code_reference(code_config: CodeConfig) -> Any: module_path, obj_name = code_config.name.rsplit(".", 1) module = importlib.import_module(module_path) - obj = getattr(module, obj_name) - - if code_config.args and callable(obj): - kwargs = {arg.name: arg.value for arg in code_config.args if arg.name} - positional_args = [arg.value for arg in code_config.args if not arg.name] - - return obj(*positional_args, **kwargs) - else: - return obj + return getattr(module, obj_name) @experimental(FeatureName.AGENT_CONFIG) diff --git a/src/google/adk/agents/config_schemas/AgentConfig.json b/src/google/adk/agents/config_schemas/AgentConfig.json index 5d1999e6b6..9a252dafda 100644 --- a/src/google/adk/agents/config_schemas/AgentConfig.json +++ b/src/google/adk/agents/config_schemas/AgentConfig.json @@ -34,7 +34,7 @@ }, "ApiAuth": { "additionalProperties": false, - "description": "The generic reusable api auth config.\n\nDeprecated. Please use AuthConfig (google/cloud/aiplatform/master/auth.proto)\ninstead.", + "description": "The generic reusable api auth config.\n\nDeprecated. Please use AuthConfig (google/cloud/aiplatform/master/auth.proto)\ninstead. This data type is not supported in Gemini API.", "properties": { "apiKeyConfig": { "anyOf": [ @@ -54,7 +54,7 @@ }, "ApiAuthApiKeyConfig": { "additionalProperties": false, - "description": "The API secret.", + "description": "The API secret. This data type is not supported in Gemini API.", "properties": { "apiKeySecretVersion": { "anyOf": [ @@ -88,8 +88,21 @@ }, "ApiKeyConfig": { "additionalProperties": false, - "description": "Config for authentication with API key.", + "description": "Config for authentication with API key.\n\nThis data type is not supported in Gemini API.", "properties": { + "apiKeySecret": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The name of the SecretManager secret version resource storing the API key. Format: `projects/{project}/secrets/{secrete}/versions/{version}` - If both `api_key_secret` and `api_key_string` are specified, this field takes precedence over `api_key_string`. - If specified, the `secretmanager.versions.access` permission should be granted to Vertex AI Extension Service Agent (https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents) on the specified resource.", + "title": "Apikeysecret" + }, "apiKeyString": { "anyOf": [ { @@ -100,15 +113,40 @@ } ], "default": null, - "description": "The API key to be used in the request directly.", + "description": "Optional. The API key to be used in the request directly.", "title": "Apikeystring" + }, + "httpElementLocation": { + "anyOf": [ + { + "$ref": "#/$defs/HttpElementLocation" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The location of the API key." + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The parameter name of the API key. E.g. If the API request is \"https://example.com/act?api_key=\", \"api_key\" would be the parameter name.", + "title": "Name" } }, "title": "ApiKeyConfig", "type": "object" }, "ApiSpec": { - "description": "The API spec that the external API implements.", + "description": "The API spec that the external API implements.\n\nThis enum is not supported in Gemini API.", "enum": [ "API_SPEC_UNSPECIFIED", "SIMPLE_SEARCH", @@ -117,11 +155,11 @@ "title": "ApiSpec", "type": "string" }, - "ArgumentConfig": { + "AuthConfig": { "additionalProperties": false, - "description": "An argument passed to a function or a class's constructor.", + "description": "The authentication config to access the API.", "properties": { - "name": { + "apiKey": { "anyOf": [ { "type": "string" @@ -131,22 +169,9 @@ } ], "default": null, - "title": "Name" + "description": "The authentication config to access the API. Only API key is supported. This field is not supported in Gemini API.", + "title": "Apikey" }, - "value": { - "title": "Value" - } - }, - "required": [ - "value" - ], - "title": "ArgumentConfig", - "type": "object" - }, - "AuthConfig": { - "additionalProperties": false, - "description": "Auth configuration to run the extension.", - "properties": { "apiKeyConfig": { "anyOf": [ { @@ -225,7 +250,7 @@ }, "AuthConfigGoogleServiceAccountConfig": { "additionalProperties": false, - "description": "Config for Google Service Account Authentication.", + "description": "Config for Google Service Account Authentication.\n\nThis data type is not supported in Gemini API.", "properties": { "serviceAccount": { "anyOf": [ @@ -246,7 +271,7 @@ }, "AuthConfigHttpBasicAuthConfig": { "additionalProperties": false, - "description": "Config for HTTP Basic Authentication.", + "description": "Config for HTTP Basic Authentication.\n\nThis data type is not supported in Gemini API.", "properties": { "credentialSecret": { "anyOf": [ @@ -267,7 +292,7 @@ }, "AuthConfigOauthConfig": { "additionalProperties": false, - "description": "Config for user oauth.", + "description": "Config for user oauth. This data type is not supported in Gemini API.", "properties": { "accessToken": { "anyOf": [ @@ -301,7 +326,7 @@ }, "AuthConfigOidcConfig": { "additionalProperties": false, - "description": "Config for user OIDC auth.", + "description": "Config for user OIDC auth.\n\nThis data type is not supported in Gemini API.", "properties": { "idToken": { "anyOf": [ @@ -334,7 +359,7 @@ "type": "object" }, "AuthType": { - "description": "Type of auth scheme.", + "description": "Type of auth scheme. This enum is not supported in Gemini API.", "enum": [ "AUTH_TYPE_UNSPECIFIED", "NO_AUTH", @@ -396,6 +421,7 @@ }, "BaseAgentConfig": { "additionalProperties": true, + "deprecated": true, "description": "The config for the YAML schema of a BaseAgent.\n\nDo not use this class directly. It's the base class for all agent configs.", "properties": { "agent_class": { @@ -479,7 +505,7 @@ "type": "object" }, "Behavior": { - "description": "Defines the function behavior. Defaults to `BLOCKING`.", + "description": "Specifies the function Behavior.\n\nCurrently only supported by the BidiGenerateContent method. This enum is not\nsupported in Vertex AI.", "enum": [ "UNSPECIFIED", "BLOCKING", @@ -490,11 +516,12 @@ }, "Blob": { "additionalProperties": false, - "description": "Content blob.", + "description": "A content blob.\n\nA Blob contains data of a specific media type. It is used to represent images,\naudio, and video.", "properties": { - "displayName": { + "data": { "anyOf": [ { + "format": "base64url", "type": "string" }, { @@ -502,13 +529,12 @@ } ], "default": null, - "description": "Optional. Display name of the blob. Used to provide a label or filename to distinguish blobs. This field is not currently used in the Gemini GenerateContent calls.", - "title": "Displayname" + "description": "Required. The raw bytes of the data.", + "title": "Data" }, - "data": { + "displayName": { "anyOf": [ { - "format": "base64url", "type": "string" }, { @@ -516,8 +542,8 @@ } ], "default": null, - "description": "Required. Raw bytes.", - "title": "Data" + "description": "Optional. The display name of the blob. Used to provide a label or filename to distinguish blobs. This field is only returned in `PromptMessage` for prompt management. It is used in the Gemini calls only when server-side tools (`code_execution`, `google_search`, and `url_context`) are enabled. This field is not supported in Gemini API.", + "title": "Displayname" }, "mimeType": { "anyOf": [ @@ -538,26 +564,11 @@ }, "CodeConfig": { "additionalProperties": false, - "description": "Code reference config for a variable, a function, or a class.\n\nThis config is used for configuring callbacks and tools.", + "description": "Code reference config for a variable, a function, or a class.\n\nOnly references an object by name. YAML cannot pass constructor args; to\nuse a configured object, build it in Python and reference its FQN here.", "properties": { "name": { "title": "Name", "type": "string" - }, - "args": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/ArgumentConfig" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Args" } }, "required": [ @@ -568,7 +579,7 @@ }, "CodeExecutionResult": { "additionalProperties": false, - "description": "Result of executing the [ExecutableCode].\n\nOnly generated when using the [CodeExecution] tool, and always follows a\n`part` containing the [ExecutableCode].", + "description": "Result of executing the `ExecutableCode`.\n\nGenerated only when the `CodeExecution` tool is used.", "properties": { "outcome": { "anyOf": [ @@ -594,11 +605,60 @@ "default": null, "description": "Optional. Contains stdout when code execution is successful, stderr or other description otherwise.", "title": "Output" + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The identifier of the `ExecutableCode` part this result is for. Only populated if the corresponding `ExecutableCode` has an id.", + "title": "Id" } }, "title": "CodeExecutionResult", "type": "object" }, + "ComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + }, + "excludedPredefinedFunctions": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "By default, predefined functions are included in the final model call.\n Some of them can be explicitly excluded from being automatically included.\n This can serve two purposes:\n 1. Using a more restricted / different action space.\n 2. Improving the definitions / instructions of predefined functions.", + "title": "Excludedpredefinedfunctions" + } + }, + "title": "ComputerUse", + "type": "object" + }, "Content": { "additionalProperties": false, "description": "Contains the multi-part content of a message.", @@ -629,7 +689,7 @@ } ], "default": null, - "description": "Optional. The producer of the content. Must be either 'user' or\n 'model'. Useful to set for multi-turn conversations; otherwise, can be\n empty. If role is not specified, SDK will determine the role.", + "description": "Optional. The producer of the content. Must be either 'user' or 'model'. If not set, the service will default to 'user'.", "title": "Role" } }, @@ -640,37 +700,37 @@ "additionalProperties": false, "description": "Describes the options to customize dynamic retrieval.", "properties": { - "mode": { + "dynamicThreshold": { "anyOf": [ { - "$ref": "#/$defs/DynamicRetrievalConfigMode" + "type": "number" }, { "type": "null" } ], "default": null, - "description": "The mode of the predictor to be used in dynamic retrieval." + "description": "Optional. The threshold to be used in dynamic retrieval. If not set, a system default value is used.", + "title": "Dynamicthreshold" }, - "dynamicThreshold": { + "mode": { "anyOf": [ { - "type": "number" + "$ref": "#/$defs/DynamicRetrievalConfigMode" }, { "type": "null" } ], "default": null, - "description": "Optional. The threshold to be used in dynamic retrieval. If not set, a system default value is used.", - "title": "Dynamicthreshold" + "description": "The mode of the predictor to be used in dynamic retrieval." } }, "title": "DynamicRetrievalConfig", "type": "object" }, "DynamicRetrievalConfigMode": { - "description": "Config for the dynamic retrieval config mode.", + "description": "The mode of the predictor to be used in dynamic retrieval.", "enum": [ "MODE_UNSPECIFIED", "MODE_DYNAMIC" @@ -680,8 +740,20 @@ }, "EnterpriseWebSearch": { "additionalProperties": false, - "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", + "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.\n\nThis data type is not supported in Gemini API.", "properties": { + "blockingConfidence": { + "anyOf": [ + { + "$ref": "#/$defs/PhishBlockThreshold" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Sites with confidence level chosen & above this value will be blocked from the search results." + }, "excludeDomains": { "anyOf": [ { @@ -713,7 +785,7 @@ }, "ExecutableCode": { "additionalProperties": false, - "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", + "description": "Model-generated code executed server-side, results returned to the model.\n\nOnly generated when using the `CodeExecution` tool, in which the code will\nbe automatically executed, and a corresponding `CodeExecutionResult` will\nalso be generated.", "properties": { "code": { "anyOf": [ @@ -739,6 +811,19 @@ ], "default": null, "description": "Required. Programming language of the `code`." + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Unique identifier of the `ExecutableCode` part. The server returns the `CodeExecutionResult` with the matching `id`.", + "title": "Id" } }, "title": "ExecutableCode", @@ -746,7 +831,7 @@ }, "ExternalApi": { "additionalProperties": false, - "description": "Retrieve from data source powered by external API for grounding.\n\nThe external API is not owned by Google, but need to follow the pre-defined\nAPI spec.", + "description": "Retrieve from data source powered by external API for grounding.\n\nThe external API is not owned by Google, but need to follow the pre-defined\nAPI spec. This data type is not supported in Gemini API.", "properties": { "apiAuth": { "anyOf": [ @@ -827,7 +912,7 @@ }, "ExternalApiElasticSearchParams": { "additionalProperties": false, - "description": "The search parameters to use for the ELASTIC_SEARCH spec.", + "description": "The search parameters to use for the ELASTIC_SEARCH spec.\n\nThis data type is not supported in Gemini API.", "properties": { "index": { "anyOf": [ @@ -874,7 +959,7 @@ }, "ExternalApiSimpleSearchParams": { "additionalProperties": false, - "description": "The search parameters to use for SIMPLE_SEARCH spec.", + "description": "The search parameters to use for SIMPLE_SEARCH spec.\n\nThis data type is not supported in Gemini API.", "properties": {}, "title": "ExternalApiSimpleSearchParams", "type": "object" @@ -1083,7 +1168,7 @@ }, "FileData": { "additionalProperties": false, - "description": "URI based data.", + "description": "URI-based data.\n\nA FileData message contains a URI pointing to data of a specific media type.\nIt is used to represent images, audio, and video stored in Google Cloud\nStorage.", "properties": { "displayName": { "anyOf": [ @@ -1095,7 +1180,7 @@ } ], "default": null, - "description": "Optional. Display name of the file data. Used to provide a label or filename to distinguish file data. It is not currently used in the Gemini GenerateContent calls.", + "description": "Optional. The display name of the file. Used to provide a label or filename to distinguish files. This field is only returned in `PromptMessage` for prompt management. It is used in the Gemini calls only when server side tools (`code_execution`, `google_search`, and `url_context`) are enabled. This field is not supported in Gemini API.", "title": "Displayname" }, "fileUri": { @@ -1108,7 +1193,7 @@ } ], "default": null, - "description": "Required. URI.", + "description": "Required. The URI of the file in Google Cloud Storage.", "title": "Fileuri" }, "mimeType": { @@ -1128,12 +1213,63 @@ "title": "FileData", "type": "object" }, + "FileSearch": { + "additionalProperties": false, + "description": "The FileSearch tool that retrieves knowledge from Semantic Retrieval corpora.\n\nFiles are imported to Semantic Retrieval corpora using the ImportFile API.\nThis data type is not supported in Vertex AI.", + "properties": { + "fileSearchStoreNames": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The names of the file_search_stores to retrieve from. Example: `fileSearchStores/my-file-search-store-123`", + "title": "Filesearchstorenames" + }, + "topK": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The number of semantic retrieval chunks to retrieve.", + "title": "Topk" + }, + "metadataFilter": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Metadata filter to apply to the semantic retrieval documents and chunks.", + "title": "Metadatafilter" + } + }, + "title": "FileSearch", + "type": "object" + }, "FileSource": { "description": "Source of the File.", "enum": [ "SOURCE_UNSPECIFIED", "UPLOADED", - "GENERATED" + "GENERATED", + "REGISTERED" ], "title": "FileSource", "type": "string" @@ -1214,7 +1350,7 @@ } ], "default": null, - "description": "The unique ID of the function call. If populated, the client to execute the\n `function_call` and return the response with the matching `id`.", + "description": "The unique id of the function call. If populated, the client to execute the\n `function_call` and return the response with the matching `id`.", "title": "Id" }, "args": { @@ -1241,8 +1377,37 @@ } ], "default": null, - "description": "Required. The name of the function to call. Matches [FunctionDeclaration.name].", + "description": "Optional. The name of the function to call. Matches [FunctionDeclaration.name].", "title": "Name" + }, + "partialArgs": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/PartialArg" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The partial argument value of the function call. If provided, represents the arguments/fields that are streamed incrementally. This field is not supported in Gemini API.", + "title": "Partialargs" + }, + "willContinue": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Whether this is the last part of the FunctionCall. If true, another partial message for the current FunctionCall is expected to follow. This field is not supported in Gemini API.", + "title": "Willcontinue" } }, "title": "FunctionCall", @@ -1252,6 +1417,22 @@ "additionalProperties": false, "description": "Function calling config.", "properties": { + "allowedFunctionNames": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Function names to call. Only set when the Mode is ANY. Function names should match [FunctionDeclaration.name]. With mode set to ANY, model will predict a function call from the set of function names provided.", + "title": "Allowedfunctionnames" + }, "mode": { "anyOf": [ { @@ -1264,53 +1445,39 @@ "default": null, "description": "Optional. Function calling mode." }, - "allowedFunctionNames": { + "streamFunctionCallArguments": { "anyOf": [ { - "items": { - "type": "string" - }, - "type": "array" + "type": "boolean" }, { "type": "null" } ], "default": null, - "description": "Optional. Function names to call. Only set when the Mode is ANY. Function names should match [FunctionDeclaration.name]. With mode set to ANY, model will predict a function call from the set of function names provided.", - "title": "Allowedfunctionnames" + "description": "Optional. When set to true, arguments of a single function call will be streamed out in multiple parts/contents/responses. Partial parameter results will be returned in the [FunctionCall.partial_args] field. This field is not supported in Gemini API.", + "title": "Streamfunctioncallarguments" } }, "title": "FunctionCallingConfig", "type": "object" }, "FunctionCallingConfigMode": { - "description": "Config for the function calling config mode.", + "description": "Function calling mode.", "enum": [ "MODE_UNSPECIFIED", "AUTO", "ANY", - "NONE" + "NONE", + "VALIDATED" ], "title": "FunctionCallingConfigMode", "type": "string" }, "FunctionDeclaration": { "additionalProperties": false, - "description": "Defines a function that the model can generate JSON inputs for.\n\nThe inputs are based on `OpenAPI 3.0 specifications\n`_.", + "description": "Structured representation of a function declaration as defined by the [OpenAPI 3.0 specification](https://spec.openapis.org/oas/v3.0.3).\n\nIncluded in this declaration are the function name, description, parameters\nand response type. This FunctionDeclaration is a representation of a block of\ncode that can be used as a `Tool` by the model and executed by the client.", "properties": { - "behavior": { - "anyOf": [ - { - "$ref": "#/$defs/Behavior" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Defines the function behavior." - }, "description": { "anyOf": [ { @@ -1334,7 +1501,7 @@ } ], "default": null, - "description": "Required. The name of the function to call. Must start with a letter or an underscore. Must be a-z, A-Z, 0-9, or contain underscores, dots and dashes, with a maximum length of 64.", + "description": "Required. The name of the function to call. Must start with a letter or an underscore. Must be a-z, A-Z, 0-9, or contain underscores, dots, colons and dashes, with a maximum length of 64.", "title": "Name" }, "parameters": { @@ -1347,7 +1514,7 @@ } ], "default": null, - "description": "Optional. Describes the parameters to this function in JSON Schema Object format. Reflects the Open API 3.03 Parameter Object. string Key: the name of the parameter. Parameter names are case-sensitive. Schema Value: the Schema defining the type used for the parameter. For function with no parameters, this can be left unset. Parameter names must start with a letter or an underscore and must only contain chars a-z, A-Z, 0-9, or underscores with a maximum length of 64. Example with 1 required and 1 optional parameter: type: OBJECT properties: param1: type: STRING param2: type: INTEGER required: - param1" + "description": "Optional. Describes the parameters to this function in JSON Schema Object format. Reflects the Open API 3.03 Parameter Object. string Key: the name of the parameter. Parameter names are case sensitive. Schema Value: the Schema defining the type used for the parameter. For function with no parameters, this can be left unset. Parameter names must start with a letter or an underscore and must only contain chars a-z, A-Z, 0-9, or underscores with a maximum length of 64. Example with 1 required and 1 optional parameter: type: OBJECT properties: param1: type: STRING param2: type: INTEGER required: - param1" }, "parametersJsonSchema": { "anyOf": [ @@ -1382,15 +1549,27 @@ "default": null, "description": "Optional. Describes the output from this function in JSON Schema format. The value specified by the schema is the response value of the function. This field is mutually exclusive with `response`.", "title": "Responsejsonschema" - } - }, - "title": "FunctionDeclaration", - "type": "object" - }, - "FunctionResponse": { - "additionalProperties": false, - "description": "A function response.", - "properties": { + }, + "behavior": { + "anyOf": [ + { + "$ref": "#/$defs/Behavior" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Specifies the function Behavior. Currently only supported by the BidiGenerateContent method. This field is not supported in Vertex AI." + } + }, + "title": "FunctionDeclaration", + "type": "object" + }, + "FunctionResponse": { + "additionalProperties": false, + "description": "A function response.", + "properties": { "willContinue": { "anyOf": [ { @@ -1416,6 +1595,22 @@ "default": null, "description": "Specifies how the response should be scheduled in the conversation. Only applicable to NON_BLOCKING function calls, is ignored otherwise. Defaults to WHEN_IDLE." }, + "parts": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/FunctionResponsePart" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "List of parts that constitute a function response. Each part may\n have a different IANA MIME type.", + "title": "Parts" + }, "id": { "anyOf": [ { @@ -1426,7 +1621,7 @@ } ], "default": null, - "description": "Optional. The ID of the function call this response is for. Populated by the client to match the corresponding function call `id`.", + "description": "Optional. The id of the function call this response is for. Populated by the client to match the corresponding function call `id`.", "title": "Id" }, "name": { @@ -1460,6 +1655,133 @@ "title": "FunctionResponse", "type": "object" }, + "FunctionResponseBlob": { + "additionalProperties": false, + "description": "Raw media bytes for function response.\n\nText should not be sent as raw bytes, use the FunctionResponse.response\nfield.", + "properties": { + "mimeType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The IANA standard MIME type of the source data.", + "title": "Mimetype" + }, + "data": { + "anyOf": [ + { + "format": "base64url", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. Inline media bytes.", + "title": "Data" + }, + "displayName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Display name of the blob.\n Used to provide a label or filename to distinguish blobs.", + "title": "Displayname" + } + }, + "title": "FunctionResponseBlob", + "type": "object" + }, + "FunctionResponseFileData": { + "additionalProperties": false, + "description": "URI based data for function response.", + "properties": { + "fileUri": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. URI.", + "title": "Fileuri" + }, + "mimeType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The IANA standard MIME type of the source data.", + "title": "Mimetype" + }, + "displayName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Display name of the file.\n Used to provide a label or filename to distinguish files.", + "title": "Displayname" + } + }, + "title": "FunctionResponseFileData", + "type": "object" + }, + "FunctionResponsePart": { + "additionalProperties": false, + "description": "A datatype containing media that is part of a `FunctionResponse` message.\n\nA `FunctionResponsePart` consists of data which has an associated datatype. A\n`FunctionResponsePart` can only contain one of the accepted types in\n`FunctionResponsePart.data`.\n\nA `FunctionResponsePart` must have a fixed IANA MIME type identifying the\ntype and subtype of the media if the `inline_data` field is filled with raw\nbytes.", + "properties": { + "inlineData": { + "anyOf": [ + { + "$ref": "#/$defs/FunctionResponseBlob" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Inline media bytes." + }, + "fileData": { + "anyOf": [ + { + "$ref": "#/$defs/FunctionResponseFileData" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. URI based data." + } + }, + "title": "FunctionResponsePart", + "type": "object" + }, "FunctionResponseScheduling": { "description": "Specifies how the response should be scheduled in the conversation.", "enum": [ @@ -1487,6 +1809,19 @@ "default": null, "description": "Used to override HTTP request options." }, + "shouldReturnHttpResponse": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": " If true, the raw HTTP response will be returned in the 'sdk_http_response' field.", + "title": "Shouldreturnhttpresponse" + }, "systemInstruction": { "anyOf": [ { @@ -1495,6 +1830,10 @@ { "type": "string" }, + { + "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", + "type": "object" + }, { "$ref": "#/$defs/File" }, @@ -1507,6 +1846,10 @@ { "type": "string" }, + { + "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", + "type": "object" + }, { "$ref": "#/$defs/File" }, @@ -1681,7 +2024,7 @@ } ], "default": null, - "description": "Output response mimetype of the generated candidate text.\n Supported mimetype:\n - `text/plain`: (default) Text output.\n - `application/json`: JSON response in the candidates.\n The model needs to be prompted to output the appropriate response type,\n otherwise the behavior is undefined.\n This is a preview feature.\n ", + "description": "Output response mimetype of the generated candidate text.\n Supported mimetype:\n - `text/plain`: (default) Text output.\n - `application/json`: JSON response in the candidates.\n The model needs to be prompted to output the appropriate response type,\n otherwise the behavior is undefined.\n ", "title": "Responsemimetype" }, "responseSchema": { @@ -1690,15 +2033,27 @@ "additionalProperties": true, "type": "object" }, + { + "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", + "type": "object" + }, { "$ref": "#/$defs/Schema" }, + { + "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", + "type": "object" + }, + { + "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", + "type": "object" + }, { "type": "null" } ], "default": null, - "description": "The `Schema` object allows the definition of input and output data types.\n These types can be objects, but also primitives and arrays.\n Represents a select subset of an [OpenAPI 3.0 schema\n object](https://spec.openapis.org/oas/v3.0.3#schema).\n If set, a compatible response_mime_type must also be set.\n Compatible mimetypes: `application/json`: Schema for JSON response.\n ", + "description": "The `Schema` object allows the definition of input and output data types.\n These types can be objects, but also primitives and arrays.\n Represents a select subset of an [OpenAPI 3.0 schema\n object](https://spec.openapis.org/oas/v3.0.3#schema).\n If set, a compatible response_mime_type must also be set.\n Compatible mimetypes: `application/json`: Schema for JSON response.\n\n If `response_schema` doesn't process your schema correctly, try using\n `response_json_schema` instead.\n ", "title": "Responseschema" }, "responseJsonSchema": { @@ -1760,8 +2115,16 @@ { "$ref": "#/$defs/google__genai__types__Tool" }, + { + "description": "Fallback for invalid schema: core_schema.CallableSchema", + "type": "object" + }, { "$ref": "#/$defs/mcp__types__Tool" + }, + { + "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", + "type": "object" } ] }, @@ -1896,6 +2259,55 @@ ], "default": null, "description": "The thinking features configuration.\n " + }, + "imageConfig": { + "anyOf": [ + { + "$ref": "#/$defs/ImageConfig" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The image generation configuration.\n " + }, + "enableEnhancedCivicAnswers": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Enables enhanced civic answers. It may not be available for all\n models. This field is not supported in Gemini Enterprise Agent Platform.\n ", + "title": "Enableenhancedcivicanswers" + }, + "modelArmorConfig": { + "anyOf": [ + { + "$ref": "#/$defs/ModelArmorConfig" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Settings for prompt and response sanitization using the Model Armor\n service. If supplied, safety_settings must not be supplied.\n " + }, + "serviceTier": { + "anyOf": [ + { + "$ref": "#/$defs/ServiceTier" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The service tier to use for the request. For example, ServiceTier.FLEX." } }, "title": "GenerateContentConfig", @@ -1903,7 +2315,7 @@ }, "GenerationConfigRoutingConfig": { "additionalProperties": false, - "description": "The configuration for routing the request to a specific model.", + "description": "The configuration for routing the request to a specific model.\n\nThis can be used to control which model is used for the generation, either\nautomatically or by specifying a model name. This data type is not supported\nin Gemini API.", "properties": { "autoMode": { "anyOf": [ @@ -1915,7 +2327,7 @@ } ], "default": null, - "description": "Automated routing." + "description": "In this mode, the model is selected automatically based on the content of the request." }, "manualMode": { "anyOf": [ @@ -1927,7 +2339,7 @@ } ], "default": null, - "description": "Manual routing." + "description": "In this mode, the model is specified manually." } }, "title": "GenerationConfigRoutingConfig", @@ -1935,7 +2347,7 @@ }, "GenerationConfigRoutingConfigAutoRoutingMode": { "additionalProperties": false, - "description": "When automated routing is specified, the routing will be determined by the pretrained routing model and customer provided model routing preference.", + "description": "The configuration for automated routing.\n\nWhen automated routing is specified, the routing will be determined by the\npretrained routing model and customer provided model routing preference. This\ndata type is not supported in Gemini API.", "properties": { "modelRoutingPreference": { "anyOf": [ @@ -1962,7 +2374,7 @@ }, "GenerationConfigRoutingConfigManualRoutingMode": { "additionalProperties": false, - "description": "When manual routing is set, the specified model will be used directly.", + "description": "The configuration for manual routing.\n\nWhen manual routing is specified, the model will be selected based on the\nmodel name provided. This data type is not supported in Gemini API.", "properties": { "modelName": { "anyOf": [ @@ -1974,7 +2386,7 @@ } ], "default": null, - "description": "The model name to use. Only the public LLM models are accepted. See [Supported models](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/inference#supported-models).", + "description": "The name of the model to use. Only public LLM models are accepted.", "title": "Modelname" } }, @@ -1983,7 +2395,7 @@ }, "GoogleMaps": { "additionalProperties": false, - "description": "Tool to support Google Maps in Model.", + "description": "Tool to retrieve knowledge from Google Maps.", "properties": { "authConfig": { "anyOf": [ @@ -1995,7 +2407,20 @@ } ], "default": null, - "description": "Optional. Auth config for the Google Maps tool." + "description": "The authentication config to access the API. Only API key is supported. This field is not supported in Gemini API." + }, + "enableWidget": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Whether to return a widget context token in the GroundingMetadata of the response. Developers can use the widget context token to render a Google Maps widget with geospatial context related to the places that the model references in the response.", + "title": "Enablewidget" } }, "title": "GoogleMaps", @@ -2003,19 +2428,31 @@ }, "GoogleSearch": { "additionalProperties": false, - "description": "Tool to support Google Search in Model. Powered by Google.", + "description": "GoogleSearch tool type.\n\nTool to support Google Search in Model. Powered by Google.", "properties": { - "timeRangeFilter": { + "searchTypes": { "anyOf": [ { - "$ref": "#/$defs/Interval" + "$ref": "#/$defs/SearchTypes" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The set of search types to enable. If not set, web search is enabled by default." + }, + "blockingConfidence": { + "anyOf": [ + { + "$ref": "#/$defs/PhishBlockThreshold" }, { "type": "null" } ], "default": null, - "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + "description": "Optional. Sites with confidence level chosen & above this value will be blocked from the search results. This field is not supported in Gemini API." }, "excludeDomains": { "anyOf": [ @@ -2030,8 +2467,20 @@ } ], "default": null, - "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains. Example: [\"amazon.com\", \"facebook.com\"]. This field is not supported in Gemini API.", "title": "Excludedomains" + }, + "timeRangeFilter": { + "anyOf": [ + { + "$ref": "#/$defs/Interval" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Filter search results to a specific time range. If customers set a start time, they must set an end time (and vice versa). This field is not supported in Vertex AI." } }, "title": "GoogleSearch", @@ -2058,7 +2507,7 @@ "type": "object" }, "HarmBlockMethod": { - "description": "Optional.\n\nSpecify if the threshold is used for probability or severity score. If not\nspecified, the threshold is used for probability score.", + "description": "The method for blocking content.\n\nIf not specified, the default behavior is to use the probability score. This\nenum is not supported in Gemini API.", "enum": [ "HARM_BLOCK_METHOD_UNSPECIFIED", "SEVERITY", @@ -2068,7 +2517,7 @@ "type": "string" }, "HarmBlockThreshold": { - "description": "Required. The harm block threshold.", + "description": "The threshold for blocking content.\n\nIf the harm probability exceeds this threshold, the content will be blocked.", "enum": [ "HARM_BLOCK_THRESHOLD_UNSPECIFIED", "BLOCK_LOW_AND_ABOVE", @@ -2081,22 +2530,36 @@ "type": "string" }, "HarmCategory": { - "description": "Required. Harm category.", + "description": "The harm category to be blocked.", "enum": [ "HARM_CATEGORY_UNSPECIFIED", - "HARM_CATEGORY_HATE_SPEECH", - "HARM_CATEGORY_DANGEROUS_CONTENT", "HARM_CATEGORY_HARASSMENT", + "HARM_CATEGORY_HATE_SPEECH", "HARM_CATEGORY_SEXUALLY_EXPLICIT", + "HARM_CATEGORY_DANGEROUS_CONTENT", "HARM_CATEGORY_CIVIC_INTEGRITY", "HARM_CATEGORY_IMAGE_HATE", "HARM_CATEGORY_IMAGE_DANGEROUS_CONTENT", "HARM_CATEGORY_IMAGE_HARASSMENT", - "HARM_CATEGORY_IMAGE_SEXUALLY_EXPLICIT" + "HARM_CATEGORY_IMAGE_SEXUALLY_EXPLICIT", + "HARM_CATEGORY_JAILBREAK" ], "title": "HarmCategory", "type": "string" }, + "HttpElementLocation": { + "description": "The location of the API key. This enum is not supported in Gemini API.", + "enum": [ + "HTTP_IN_UNSPECIFIED", + "HTTP_IN_QUERY", + "HTTP_IN_HEADER", + "HTTP_IN_PATH", + "HTTP_IN_BODY", + "HTTP_IN_COOKIE" + ], + "title": "HttpElementLocation", + "type": "string" + }, "HttpOptions": { "additionalProperties": false, "description": "HTTP options to be used in each of the requests.", @@ -2114,20 +2577,32 @@ "description": "The base URL for the AI platform service endpoint.", "title": "Baseurl" }, - "apiVersion": { + "baseUrlResourceScope": { "anyOf": [ { - "type": "string" + "$ref": "#/$defs/ResourceScope" }, { "type": "null" } ], "default": null, - "description": "Specifies the version of the API to use.", - "title": "Apiversion" + "description": "The resource scope used to constructing the resource name when base_url is set" }, - "headers": { + "apiVersion": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Specifies the version of the API to use.", + "title": "Apiversion" + }, + "headers": { "anyOf": [ { "additionalProperties": { @@ -2195,7 +2670,7 @@ } ], "default": null, - "description": "Extra parameters to add to the request body.\n The structure must match the backend API's request structure.\n - VertexAI backend API docs: https://cloud.google.com/vertex-ai/docs/reference/rest\n - GeminiAPI backend API docs: https://ai.google.dev/api/rest", + "description": "Extra parameters to add to the request body.\n The structure must match the backend API's request structure.\n - Gemini Enterprise Agent Platform backend API docs: https://cloud.google.com/vertex-ai/docs/reference/rest\n - GeminiAPI backend API docs: https://ai.google.dev/api/rest", "title": "Extrabody" }, "retryOptions": { @@ -2209,6 +2684,48 @@ ], "default": null, "description": "HTTP retry options for the request." + }, + "httpxClient": { + "anyOf": [ + { + "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "A custom httpx client to be used for the request.", + "title": "Httpxclient" + }, + "httpxAsyncClient": { + "anyOf": [ + { + "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "A custom httpx async client to be used for the request.", + "title": "Httpxasyncclient" + }, + "aiohttpClient": { + "anyOf": [ + { + "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "A custom aiohttp client session to be used for the request.", + "title": "Aiohttpclient" } }, "title": "HttpOptions", @@ -2228,7 +2745,7 @@ } ], "default": null, - "description": "Maximum number of attempts, including the original request.\n If 0 or 1, it means no retries.", + "description": "Maximum number of attempts, including the original request.\n If 0 or 1, it means no retries. If not specified, default to 5.", "title": "Attempts" }, "initialDelay": { @@ -2241,7 +2758,7 @@ } ], "default": null, - "description": "Initial delay before the first retry, in fractions of a second.", + "description": "Initial delay before the first retry, in fractions of a second. If not specified, default to 1.0 second.", "title": "Initialdelay" }, "maxDelay": { @@ -2254,7 +2771,7 @@ } ], "default": null, - "description": "Maximum delay between retries, in fractions of a second.", + "description": "Maximum delay between retries, in fractions of a second. If not specified, default to 60.0 seconds.", "title": "Maxdelay" }, "expBase": { @@ -2267,7 +2784,7 @@ } ], "default": null, - "description": "Multiplier by which the delay increases after each attempt.", + "description": "Multiplier by which the delay increases after each attempt. If not specified, default to 2.0.", "title": "Expbase" }, "jitter": { @@ -2280,7 +2797,7 @@ } ], "default": null, - "description": "Randomness factor for the delay.", + "description": "Randomness factor for the delay. If not specified, default to 1.0.", "title": "Jitter" }, "httpStatusCodes": { @@ -2296,21 +2813,62 @@ } ], "default": null, - "description": "List of HTTP status codes that should trigger a retry.\n If not specified, a default set of retryable codes may be used.", + "description": "List of HTTP status codes that should trigger a retry.\n If not specified, a default set of retryable codes (408, 429, and 5xx) may be used.", "title": "Httpstatuscodes" } }, "title": "HttpRetryOptions", "type": "object" }, - "Interval": { + "Icon": { + "additionalProperties": true, + "description": "An icon for display in user interfaces.", + "properties": { + "src": { + "title": "Src", + "type": "string" + }, + "mimeType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Mimetype" + }, + "sizes": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Sizes" + } + }, + "required": [ + "src" + ], + "title": "Icon", + "type": "object" + }, + "ImageConfig": { "additionalProperties": false, - "description": "Represents a time interval, encoded as a start time (inclusive) and an end time (exclusive).\n\nThe start time must be less than or equal to the end time.\nWhen the start equals the end time, the interval is an empty interval.\n(matches no time)\nWhen both start and end are unspecified, the interval matches any time.", + "description": "The image generation configuration to be used in GenerateContentConfig.", "properties": { - "startTime": { + "aspectRatio": { "anyOf": [ { - "format": "date-time", "type": "string" }, { @@ -2318,9 +2876,134 @@ } ], "default": null, - "description": "The start time of the interval.", - "title": "Starttime" + "description": "Aspect ratio of the generated images. Supported values are\n \"1:1\", \"2:3\", \"3:2\", \"3:4\", \"4:3\", \"9:16\", \"16:9\", and \"21:9\".", + "title": "Aspectratio" + }, + "imageSize": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Specifies the size of generated images. Supported\n values are `1K`, `2K`, `4K`. If not specified, the model will use default\n value `1K`.", + "title": "Imagesize" + }, + "personGeneration": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Controls the generation of people. Supported values are:\n ALLOW_ALL, ALLOW_ADULT, ALLOW_NONE.", + "title": "Persongeneration" + }, + "prominentPeople": { + "anyOf": [ + { + "$ref": "#/$defs/ProminentPeople" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Controls whether prominent people (celebrities) generation is allowed. If used with personGeneration, personGeneration enum would take precedence. For instance, if ALLOW_NONE is set, all person generation would be blocked. If this field is unspecified, the default behavior is to allow prominent people. This field is not supported in Gemini API." + }, + "outputMimeType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "MIME type of the generated image. This field is not\n supported in Gemini API.", + "title": "Outputmimetype" + }, + "outputCompressionQuality": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Compression quality of the generated image (for\n ``image/jpeg`` only). This field is not supported in Gemini API.", + "title": "Outputcompressionquality" + }, + "imageOutputOptions": { + "anyOf": [ + { + "$ref": "#/$defs/ImageConfigImageOutputOptions" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The image output format for generated images. This field is not supported in Gemini API." + } + }, + "title": "ImageConfig", + "type": "object" + }, + "ImageConfigImageOutputOptions": { + "additionalProperties": false, + "description": "The image output format for generated images.\n\nThis data type is not supported in Gemini API.", + "properties": { + "compressionQuality": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The compression quality of the output image.", + "title": "Compressionquality" }, + "mimeType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The image format that the output should be saved as.", + "title": "Mimetype" + } + }, + "title": "ImageConfigImageOutputOptions", + "type": "object" + }, + "ImageSearch": { + "additionalProperties": false, + "description": "Image search for grounding and related configurations.", + "properties": {}, + "title": "ImageSearch", + "type": "object" + }, + "Interval": { + "additionalProperties": false, + "description": "Represents a time interval, encoded as a Timestamp start (inclusive) and a Timestamp end (exclusive).\n\nThe start must be less than or equal to the end. When the start equals the\nend, the interval is empty (matches no time). When both start and end are\nunspecified, the interval matches any time.", + "properties": { "endTime": { "anyOf": [ { @@ -2332,15 +3015,29 @@ } ], "default": null, - "description": "The end time of the interval.", + "description": "Optional. Exclusive end of the interval. If specified, a Timestamp matching this interval will have to be before the end.", "title": "Endtime" + }, + "startTime": { + "anyOf": [ + { + "format": "date-time", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Inclusive start of the interval. If specified, a Timestamp matching this interval will have to be the same or after the start.", + "title": "Starttime" } }, "title": "Interval", "type": "object" }, "Language": { - "description": "Required. Programming language of the `code`.", + "description": "Programming language of the `code`.", "enum": [ "LANGUAGE_UNSPECIFIED", "PYTHON" @@ -2384,6 +3081,7 @@ }, "LlmAgentConfig": { "additionalProperties": false, + "deprecated": true, "description": "The config for the YAML schema of a LlmAgent.", "properties": { "agent_class": { @@ -2461,14 +3159,72 @@ } ], "default": null, - "description": "Optional. LlmAgent.model. Provide a model name string (e.g. \"gemini-2.5-flash\"). If not set, the model will be inherited from the ancestor or fall back to the system default (gemini-2.5-flash unless overridden via LlmAgent.set_default_model). To construct a model instance from code, use model_code.", + "description": "Optional. LlmAgent.model. Provide a model name string (e.g. \"gemini-3-flash-preview\"). If not set, the model will be inherited from the ancestor or fall back to the system default (gemini-3-flash-preview unless overridden via LlmAgent.set_default_model). To construct a model instance from code, use model_code.", "title": "Model" }, + "model_code": { + "anyOf": [ + { + "$ref": "#/$defs/CodeConfig" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. A CodeConfig that instantiates a BaseLlm implementation such as LiteLlm with custom arguments (API base, fallbacks, etc.). Cannot be set together with `model`." + }, "instruction": { - "description": "Required. LlmAgent.instruction.", + "description": "Required. LlmAgent.instruction. Dynamic instructions with placeholder support. Behavior: if static_instruction is None, goes to system_instruction; if static_instruction is set, goes to user content after static content.", "title": "Instruction", "type": "string" }, + "static_instruction": { + "anyOf": [ + { + "$ref": "#/$defs/Content" + }, + { + "type": "string" + }, + { + "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", + "type": "object" + }, + { + "$ref": "#/$defs/File" + }, + { + "$ref": "#/$defs/Part" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "description": "Fallback for invalid schema: core_schema.IsInstanceSchema ()", + "type": "object" + }, + { + "$ref": "#/$defs/File" + }, + { + "$ref": "#/$defs/Part" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. LlmAgent.static_instruction. Static content sent literally at position 0 without placeholder processing. When set, changes instruction behavior to go to user content instead of system_instruction. Supports context caching. Accepts types.ContentUnion (str, types.Content, types.Part, PIL.Image.Image, types.File, or list[PartUnion]).", + "title": "Static Instruction" + }, "disallow_transfer_to_parent": { "anyOf": [ { @@ -2555,7 +3311,7 @@ } ], "default": null, - "description": "Optional. LlmAgent.tools.\n\nExamples:\n\n For ADK built-in tools in `google.adk.tools` package, they can be referenced\n directly with the name:\n\n ```\n tools:\n - name: google_search\n - name: load_memory\n ```\n\n For user-defined tools, they can be referenced with fully qualified name:\n\n ```\n tools:\n - name: my_library.my_tools.my_tool\n ```\n\n For tools that needs to be created via functions:\n\n ```\n tools:\n - name: my_library.my_tools.create_tool\n args:\n - name: param1\n value: value1\n - name: param2\n value: value2\n ```\n\n For more advanced tools, instead of specifying arguments in config, it's\n recommended to define them in Python files and reference them. E.g.,\n\n ```\n # tools.py\n my_mcp_toolset = MCPToolset(\n connection_params=StdioServerParameters(\n command=\"npx\",\n args=[\"-y\", \"@notionhq/notion-mcp-server\"],\n env={\"OPENAPI_MCP_HEADERS\": NOTION_HEADERS},\n )\n )\n ```\n\n Then, reference the toolset in config:\n\n ```\n tools:\n - name: tools.my_mcp_toolset\n ```", + "description": "Optional. LlmAgent.tools.\n\nExamples:\n\n For ADK built-in tools in `google.adk.tools` package, they can be referenced\n directly with the name:\n\n ```\n tools:\n - name: google_search\n - name: load_memory\n ```\n\n For user-defined tools, they can be referenced with fully qualified name:\n\n ```\n tools:\n - name: my_library.my_tools.my_tool\n ```\n\n For tools that needs to be created via functions:\n\n ```\n tools:\n - name: my_library.my_tools.create_tool\n args:\n - name: param1\n value: value1\n - name: param2\n value: value2\n ```\n\n For more advanced tools, instead of specifying arguments in config, it's\n recommended to define them in Python files and reference them. E.g.,\n\n ```\n # tools.py\n my_mcp_toolset = McpToolset(\n connection_params=StdioServerParameters(\n command=\"npx\",\n args=[\"-y\", \"@notionhq/notion-mcp-server\"],\n env={\"OPENAPI_MCP_HEADERS\": NOTION_HEADERS},\n )\n )\n ```\n\n Then, reference the toolset in config:\n\n ```\n tools:\n - name: tools.my_mcp_toolset\n ```", "title": "Tools" }, "before_model_callbacks": { @@ -2644,6 +3400,7 @@ }, "LoopAgentConfig": { "additionalProperties": false, + "deprecated": true, "description": "The config for the YAML schema of a LoopAgent.", "properties": { "agent_class": { @@ -2731,25 +3488,92 @@ "title": "LoopAgentConfig", "type": "object" }, - "MediaResolution": { - "description": "The media resolution to use.", - "enum": [ - "MEDIA_RESOLUTION_UNSPECIFIED", - "MEDIA_RESOLUTION_LOW", - "MEDIA_RESOLUTION_MEDIUM", - "MEDIA_RESOLUTION_HIGH" - ], - "title": "MediaResolution", - "type": "string" - }, - "ModelSelectionConfig": { + "McpServer": { "additionalProperties": false, - "description": "Config for model selection.", + "description": "A MCPServer is a server that can be called by the model to perform actions.\n\nIt is a server that implements the MCP protocol. Next ID: 5. This data type is\nnot supported in Vertex AI.", "properties": { - "featureSelectionPreference": { + "name": { "anyOf": [ { - "$ref": "#/$defs/FeatureSelectionPreference" + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The name of the MCPServer.", + "title": "Name" + }, + "streamableHttpTransport": { + "anyOf": [ + { + "$ref": "#/$defs/StreamableHttpTransport" + }, + { + "type": "null" + } + ], + "default": null, + "description": "A transport that can stream HTTP requests and responses." + } + }, + "title": "McpServer", + "type": "object" + }, + "MediaResolution": { + "description": "The media resolution to use.", + "enum": [ + "MEDIA_RESOLUTION_UNSPECIFIED", + "MEDIA_RESOLUTION_LOW", + "MEDIA_RESOLUTION_MEDIUM", + "MEDIA_RESOLUTION_HIGH" + ], + "title": "MediaResolution", + "type": "string" + }, + "ModelArmorConfig": { + "additionalProperties": false, + "description": "Configuration for Model Armor.\n\nModel Armor is a Google Cloud service that provides safety and security\nfiltering for prompts and responses. It helps protect your AI applications\nfrom risks such as harmful content, sensitive data leakage, and prompt\ninjection attacks. This data type is not supported in Gemini API.", + "properties": { + "promptTemplateName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The resource name of the Model Armor template to use for prompt screening. A Model Armor template is a set of customized filters and thresholds that define how Model Armor screens content. If specified, Model Armor will use this template to check the user's prompt for safety and security risks before it is sent to the model. The name must be in the format `projects/{project}/locations/{location}/templates/{template}`.", + "title": "Prompttemplatename" + }, + "responseTemplateName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The resource name of the Model Armor template to use for response screening. A Model Armor template is a set of customized filters and thresholds that define how Model Armor screens content. If specified, Model Armor will use this template to check the model's response for safety and security risks before it is returned to the user. The name must be in the format `projects/{project}/locations/{location}/templates/{template}`.", + "title": "Responsetemplatename" + } + }, + "title": "ModelArmorConfig", + "type": "object" + }, + "ModelSelectionConfig": { + "additionalProperties": false, + "description": "Config for model selection.", + "properties": { + "featureSelectionPreference": { + "anyOf": [ + { + "$ref": "#/$defs/FeatureSelectionPreference" }, { "type": "null" @@ -2764,7 +3588,7 @@ }, "MultiSpeakerVoiceConfig": { "additionalProperties": false, - "description": "The configuration for the multi-speaker setup.", + "description": "Configuration for a multi-speaker text-to-speech request.", "properties": { "speakerVoiceConfigs": { "anyOf": [ @@ -2779,7 +3603,7 @@ } ], "default": null, - "description": "The configuration for the speaker to use.", + "description": "Required. A list of configurations for the voices of the speakers. Exactly two speaker voice configurations must be provided.", "title": "Speakervoiceconfigs" } }, @@ -2787,7 +3611,7 @@ "type": "object" }, "Outcome": { - "description": "Required. Outcome of the code execution.", + "description": "Outcome of the code execution.", "enum": [ "OUTCOME_UNSPECIFIED", "OUTCOME_OK", @@ -2799,6 +3623,7 @@ }, "ParallelAgentConfig": { "additionalProperties": false, + "deprecated": true, "description": "The config for the YAML schema of a ParallelAgent.", "properties": { "agent_class": { @@ -2877,42 +3702,41 @@ "additionalProperties": false, "description": "A datatype containing media content.\n\nExactly one field within a Part should be set, representing the specific type\nof content being conveyed. Using multiple fields within the same `Part`\ninstance is considered invalid.", "properties": { - "videoMetadata": { + "mediaResolution": { "anyOf": [ { - "$ref": "#/$defs/VideoMetadata" + "$ref": "#/$defs/PartMediaResolution" }, { "type": "null" } ], "default": null, - "description": "Metadata for a given video." + "description": "Media resolution for the input media.\n " }, - "thought": { + "codeExecutionResult": { "anyOf": [ { - "type": "boolean" + "$ref": "#/$defs/CodeExecutionResult" }, { "type": "null" } ], "default": null, - "description": "Indicates if the part is thought from the model.", - "title": "Thought" + "description": "Optional. The result of executing the ExecutableCode." }, - "inlineData": { + "executableCode": { "anyOf": [ { - "$ref": "#/$defs/Blob" + "$ref": "#/$defs/ExecutableCode" }, { "type": "null" } ], "default": null, - "description": "Optional. Inlined bytes data." + "description": "Optional. Code generated by the model that is intended to be executed." }, "fileData": { "anyOf": [ @@ -2924,7 +3748,69 @@ } ], "default": null, - "description": "Optional. URI based data." + "description": "Optional. The URI-based data of the part. This can be used to include files from Google Cloud Storage." + }, + "functionCall": { + "anyOf": [ + { + "$ref": "#/$defs/FunctionCall" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. A predicted function call returned from the model. This contains the name of the function to call and the arguments to pass to the function." + }, + "functionResponse": { + "anyOf": [ + { + "$ref": "#/$defs/FunctionResponse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The result of a function call. This is used to provide the model with the result of a function call that it predicted." + }, + "inlineData": { + "anyOf": [ + { + "$ref": "#/$defs/Blob" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The inline data content of the part. This can be used to include images, audio, or video in a request." + }, + "text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The text content of the part. When sent from the VSCode Gemini Code Assist extension, references to @mentioned items will be converted to markdown boldface text. For example `@my-repo` will be converted to and sent as `**my-repo**` by the IDE agent.", + "title": "Text" + }, + "thought": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Indicates whether the `part` represents the model's thought process or reasoning.", + "title": "Thought" }, "thoughtSignature": { "anyOf": [ @@ -2937,58 +3823,126 @@ } ], "default": null, - "description": "An opaque signature for the thought so it can be reused in subsequent requests.", + "description": "Optional. An opaque signature for the thought so it can be reused in subsequent requests.", "title": "Thoughtsignature" }, - "codeExecutionResult": { + "videoMetadata": { "anyOf": [ { - "$ref": "#/$defs/CodeExecutionResult" + "$ref": "#/$defs/VideoMetadata" }, { "type": "null" } ], "default": null, - "description": "Optional. Result of executing the [ExecutableCode]." + "description": "Optional. Video metadata. The metadata should only be specified while the video data is presented in inline_data or file_data." }, - "executableCode": { + "toolCall": { "anyOf": [ { - "$ref": "#/$defs/ExecutableCode" + "$ref": "#/$defs/ToolCall" }, { "type": "null" } ], "default": null, - "description": "Optional. Code generated by the model that is meant to be executed." + "description": "Server-side tool call. This field is populated when the model predicts a tool invocation that should be executed on the server. The client is expected to echo this message back to the API." }, - "functionCall": { + "toolResponse": { "anyOf": [ { - "$ref": "#/$defs/FunctionCall" + "$ref": "#/$defs/ToolResponse" }, { "type": "null" } ], "default": null, - "description": "Optional. A predicted [FunctionCall] returned from the model that contains a string representing the [FunctionDeclaration.name] with the parameters and their values." + "description": "The output from a server-side ToolCall execution. This field is populated by the client with the results of executing the corresponding ToolCall." }, - "functionResponse": { + "partMetadata": { "anyOf": [ { - "$ref": "#/$defs/FunctionResponse" + "additionalProperties": true, + "type": "object" }, { "type": "null" } ], "default": null, - "description": "Optional. The result output of a [FunctionCall] that contains a string representing the [FunctionDeclaration.name] and a structured JSON object containing any output from the function call. It is used as context to the model." + "description": "Custom metadata associated with the Part. Agents using genai.Part as content representation may need to keep track of the additional information. For example it can be name of a file/source from which the Part originates or a way to multiplex multiple Part streams. This field is not supported in Vertex AI.", + "title": "Partmetadata" + } + }, + "title": "Part", + "type": "object" + }, + "PartMediaResolution": { + "additionalProperties": false, + "description": "Media resolution for the input media.", + "properties": { + "level": { + "anyOf": [ + { + "$ref": "#/$defs/PartMediaResolutionLevel" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The tokenization quality used for given media.\n " }, - "text": { + "numTokens": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Specifies the required sequence length for media tokenization.\n ", + "title": "Numtokens" + } + }, + "title": "PartMediaResolution", + "type": "object" + }, + "PartMediaResolutionLevel": { + "description": "The tokenization quality used for given media.", + "enum": [ + "MEDIA_RESOLUTION_UNSPECIFIED", + "MEDIA_RESOLUTION_LOW", + "MEDIA_RESOLUTION_MEDIUM", + "MEDIA_RESOLUTION_HIGH", + "MEDIA_RESOLUTION_ULTRA_HIGH" + ], + "title": "PartMediaResolutionLevel", + "type": "string" + }, + "PartialArg": { + "additionalProperties": false, + "description": "Partial argument value of the function call.\n\nThis data type is not supported in Gemini API.", + "properties": { + "boolValue": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Represents a boolean value.", + "title": "Boolvalue" + }, + "jsonPath": { "anyOf": [ { "type": "string" @@ -2998,16 +3952,83 @@ } ], "default": null, - "description": "Optional. Text part (can be code).", - "title": "Text" + "description": "Required. A JSON Path (RFC 9535) to the argument being streamed. https://datatracker.ietf.org/doc/html/rfc9535. e.g. \"$.foo.bar[0].data\".", + "title": "Jsonpath" + }, + "nullValue": { + "anyOf": [ + { + "const": "NULL_VALUE", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Represents a null value.", + "title": "Nullvalue" + }, + "numberValue": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Represents a double value.", + "title": "Numbervalue" + }, + "stringValue": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Represents a string value.", + "title": "Stringvalue" + }, + "willContinue": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Whether this is not the last part of the same json_path. If true, another PartialArg message for the current json_path is expected to follow.", + "title": "Willcontinue" } }, - "title": "Part", + "title": "PartialArg", "type": "object" }, + "PhishBlockThreshold": { + "description": "Sites with confidence level chosen & above this value will be blocked from the search results.\n\nThis enum is not supported in Gemini API.", + "enum": [ + "PHISH_BLOCK_THRESHOLD_UNSPECIFIED", + "BLOCK_LOW_AND_ABOVE", + "BLOCK_MEDIUM_AND_ABOVE", + "BLOCK_HIGH_AND_ABOVE", + "BLOCK_HIGHER_AND_ABOVE", + "BLOCK_VERY_HIGH_AND_ABOVE", + "BLOCK_ONLY_EXTREMELY_HIGH" + ], + "title": "PhishBlockThreshold", + "type": "string" + }, "PrebuiltVoiceConfig": { "additionalProperties": false, - "description": "The configuration for the prebuilt speaker to use.", + "description": "Configuration for a prebuilt voice.", "properties": { "voiceName": { "anyOf": [ @@ -3026,9 +4047,19 @@ "title": "PrebuiltVoiceConfig", "type": "object" }, + "ProminentPeople": { + "description": "Controls whether prominent people (celebrities) generation is allowed.\n\nIf used with personGeneration, personGeneration enum would take precedence.\nFor instance, if ALLOW_NONE is set, all person generation would be blocked. If\nthis field is unspecified, the default behavior is to allow prominent people.\nThis enum is not supported in Gemini API.", + "enum": [ + "PROMINENT_PEOPLE_UNSPECIFIED", + "ALLOW_PROMINENT_PEOPLE", + "BLOCK_PROMINENT_PEOPLE" + ], + "title": "ProminentPeople", + "type": "string" + }, "RagRetrievalConfig": { "additionalProperties": false, - "description": "Specifies the context retrieval config.", + "description": "Specifies the context retrieval config.\n\nThis data type is not supported in Gemini API.", "properties": { "filter": { "anyOf": [ @@ -3085,7 +4116,7 @@ }, "RagRetrievalConfigFilter": { "additionalProperties": false, - "description": "Config for filters.", + "description": "Config for filters. This data type is not supported in Gemini API.", "properties": { "metadataFilter": { "anyOf": [ @@ -3132,7 +4163,7 @@ }, "RagRetrievalConfigHybridSearch": { "additionalProperties": false, - "description": "Config for Hybrid Search.", + "description": "Config for Hybrid Search. This data type is not supported in Gemini API.", "properties": { "alpha": { "anyOf": [ @@ -3153,7 +4184,7 @@ }, "RagRetrievalConfigRanking": { "additionalProperties": false, - "description": "Config for ranking and reranking.", + "description": "Config for ranking and reranking.\n\nThis data type is not supported in Gemini API.", "properties": { "llmRanker": { "anyOf": [ @@ -3185,7 +4216,7 @@ }, "RagRetrievalConfigRankingLlmRanker": { "additionalProperties": false, - "description": "Config for LlmRanker.", + "description": "Config for LlmRanker. This data type is not supported in Gemini API.", "properties": { "modelName": { "anyOf": [ @@ -3197,37 +4228,106 @@ } ], "default": null, - "description": "Optional. The model name used for ranking. See [Supported models](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/inference#supported-models).", - "title": "Modelname" - } - }, - "title": "RagRetrievalConfigRankingLlmRanker", - "type": "object" - }, - "RagRetrievalConfigRankingRankService": { - "additionalProperties": false, - "description": "Config for Rank Service.", - "properties": { - "modelName": { + "description": "Optional. The model name used for ranking. See [Supported models](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/inference#supported-models).", + "title": "Modelname" + } + }, + "title": "RagRetrievalConfigRankingLlmRanker", + "type": "object" + }, + "RagRetrievalConfigRankingRankService": { + "additionalProperties": false, + "description": "Config for Rank Service. This data type is not supported in Gemini API.", + "properties": { + "modelName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The model name of the rank service. Format: `semantic-ranker-512@latest`", + "title": "Modelname" + } + }, + "title": "RagRetrievalConfigRankingRankService", + "type": "object" + }, + "ReplicatedVoiceConfig": { + "additionalProperties": false, + "description": "The configuration for the replicated voice to use.", + "properties": { + "mimeType": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The mimetype of the voice sample. The only currently supported\n value is `audio/wav`. This represents 16-bit signed little-endian wav\n data, with a 24kHz sampling rate.\n ", + "title": "Mimetype" + }, + "voiceSampleAudio": { + "anyOf": [ + { + "format": "base64url", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The sample of the custom voice.\n ", + "title": "Voicesampleaudio" + }, + "consentAudio": { + "anyOf": [ + { + "format": "base64url", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Recorded consent verifying ownership of the voice. This\n represents 16-bit signed little-endian wav data, with a 24kHz sampling\n rate.", + "title": "Consentaudio" + }, + "voiceConsentSignature": { "anyOf": [ { - "type": "string" + "$ref": "#/$defs/VoiceConsentSignature" }, { "type": "null" } ], "default": null, - "description": "Optional. The model name of the rank service. Format: `semantic-ranker-512@latest`", - "title": "Modelname" + "description": "Signature of a previously verified consent audio. This should be\n populated with a signature generated by the server for a previous\n request containing the consent_audio field. When provided, the\n signature is verified instead of the consent_audio field to reduce\n latency. Requests will fail if the signature is invalid or expired." } }, - "title": "RagRetrievalConfigRankingRankService", + "title": "ReplicatedVoiceConfig", "type": "object" }, + "ResourceScope": { + "description": "Resource scope.", + "enum": [ + "COLLECTION" + ], + "title": "ResourceScope", + "type": "string" + }, "Retrieval": { "additionalProperties": false, - "description": "Defines a retrieval tool that model can call to access external knowledge.", + "description": "Defines a retrieval tool that model can call to access external knowledge.\n\nThis data type is not supported in Gemini API.", "properties": { "disableAttribution": { "anyOf": [ @@ -3317,31 +4417,31 @@ }, "SafetySetting": { "additionalProperties": false, - "description": "Safety settings.", + "description": "A safety setting that affects the safety-blocking behavior.\n\nA SafetySetting consists of a harm category and a threshold for that category.", "properties": { - "method": { + "category": { "anyOf": [ { - "$ref": "#/$defs/HarmBlockMethod" + "$ref": "#/$defs/HarmCategory" }, { "type": "null" } ], "default": null, - "description": "Determines if the harm block method uses probability or probability\n and severity scores." + "description": "Required. The harm category to be blocked." }, - "category": { + "method": { "anyOf": [ { - "$ref": "#/$defs/HarmCategory" + "$ref": "#/$defs/HarmBlockMethod" }, { "type": "null" } ], "default": null, - "description": "Required. Harm category." + "description": "Optional. The method for blocking content. If not specified, the default behavior is to use the probability score. This field is not supported in Gemini API." }, "threshold": { "anyOf": [ @@ -3353,7 +4453,7 @@ } ], "default": null, - "description": "Required. The harm block threshold." + "description": "Required. The threshold for blocking content. If the harm probability exceeds this threshold, the content will be blocked." } }, "title": "SafetySetting", @@ -3416,7 +4516,7 @@ } ], "default": null, - "description": "Optional. The value should be validated against any (one or more) of the subschemas in the list.", + "description": "Optional. The instance must be valid against any (one or more) of the subschemas listed in `any_of`.", "title": "Anyof" }, "default": { @@ -3427,7 +4527,7 @@ } ], "default": null, - "description": "Optional. Default value of the data.", + "description": "Optional. Default value to use if the field is not specified.", "title": "Default" }, "description": { @@ -3440,7 +4540,7 @@ } ], "default": null, - "description": "Optional. The description of the data.", + "description": "Optional. Describes the data. The model uses this field to understand the purpose of the schema and how to use it. It is a best practice to provide a clear and descriptive explanation for the schema and its properties here, rather than in the prompt.", "title": "Description" }, "enum": { @@ -3456,7 +4556,7 @@ } ], "default": null, - "description": "Optional. Possible values of the element of primitive type with enum format. Examples: 1. We can define direction as : {type:STRING, format:enum, enum:[\"EAST\", NORTH\", \"SOUTH\", \"WEST\"]} 2. We can define apartment number as : {type:INTEGER, format:enum, enum:[\"101\", \"201\", \"301\"]}", + "description": "Optional. Possible values of the field. This field can be used to restrict a value to a fixed set of values. To mark a field as an enum, set `format` to `enum` and provide the list of possible values in `enum`. For example: 1. To define directions: `{type:STRING, format:enum, enum:[\"EAST\", \"NORTH\", \"SOUTH\", \"WEST\"]}` 2. To define apartment numbers: `{type:INTEGER, format:enum, enum:[\"101\", \"201\", \"301\"]}`", "title": "Enum" }, "example": { @@ -3467,7 +4567,7 @@ } ], "default": null, - "description": "Optional. Example of the object. Will only populated when the object is the root.", + "description": "Optional. Example of an instance of this schema.", "title": "Example" }, "format": { @@ -3480,7 +4580,7 @@ } ], "default": null, - "description": "Optional. The format of the data. Supported formats: for NUMBER type: \"float\", \"double\" for INTEGER type: \"int32\", \"int64\" for STRING type: \"email\", \"byte\", etc", + "description": "Optional. The format of the data. For `NUMBER` type, format can be `float` or `double`. For `INTEGER` type, format can be `int32` or `int64`. For `STRING` type, format can be `email`, `byte`, `date`, `date-time`, `password`, and other formats to further refine the data type.", "title": "Format" }, "items": { @@ -3493,7 +4593,7 @@ } ], "default": null, - "description": "Optional. SCHEMA FIELDS FOR TYPE ARRAY Schema of the elements of Type.ARRAY." + "description": "Optional. If type is `ARRAY`, `items` specifies the schema of elements in the array." }, "maxItems": { "anyOf": [ @@ -3505,7 +4605,7 @@ } ], "default": null, - "description": "Optional. Maximum number of the elements for Type.ARRAY.", + "description": "Optional. If type is `ARRAY`, `max_items` specifies the maximum number of items in an array.", "title": "Maxitems" }, "maxLength": { @@ -3518,7 +4618,7 @@ } ], "default": null, - "description": "Optional. Maximum length of the Type.STRING", + "description": "Optional. If type is `STRING`, `max_length` specifies the maximum length of the string.", "title": "Maxlength" }, "maxProperties": { @@ -3531,7 +4631,7 @@ } ], "default": null, - "description": "Optional. Maximum number of the properties for Type.OBJECT.", + "description": "Optional. If type is `OBJECT`, `max_properties` specifies the maximum number of properties that can be provided.", "title": "Maxproperties" }, "maximum": { @@ -3544,7 +4644,7 @@ } ], "default": null, - "description": "Optional. Maximum value of the Type.INTEGER and Type.NUMBER", + "description": "Optional. If type is `INTEGER` or `NUMBER`, `maximum` specifies the maximum allowed value.", "title": "Maximum" }, "minItems": { @@ -3557,7 +4657,7 @@ } ], "default": null, - "description": "Optional. Minimum number of the elements for Type.ARRAY.", + "description": "Optional. If type is `ARRAY`, `min_items` specifies the minimum number of items in an array.", "title": "Minitems" }, "minLength": { @@ -3570,7 +4670,7 @@ } ], "default": null, - "description": "Optional. SCHEMA FIELDS FOR TYPE STRING Minimum length of the Type.STRING", + "description": "Optional. If type is `STRING`, `min_length` specifies the minimum length of the string.", "title": "Minlength" }, "minProperties": { @@ -3583,7 +4683,7 @@ } ], "default": null, - "description": "Optional. Minimum number of the properties for Type.OBJECT.", + "description": "Optional. If type is `OBJECT`, `min_properties` specifies the minimum number of properties that can be provided.", "title": "Minproperties" }, "minimum": { @@ -3596,7 +4696,7 @@ } ], "default": null, - "description": "Optional. SCHEMA FIELDS FOR TYPE INTEGER and NUMBER Minimum value of the Type.INTEGER and Type.NUMBER", + "description": "Optional. If type is `INTEGER` or `NUMBER`, `minimum` specifies the minimum allowed value.", "title": "Minimum" }, "nullable": { @@ -3609,7 +4709,7 @@ } ], "default": null, - "description": "Optional. Indicates if the value may be null.", + "description": "Optional. Indicates if the value of this field can be null.", "title": "Nullable" }, "pattern": { @@ -3622,7 +4722,7 @@ } ], "default": null, - "description": "Optional. Pattern of the Type.STRING to restrict a string to a regular expression.", + "description": "Optional. If type is `STRING`, `pattern` specifies a regular expression that the string must match.", "title": "Pattern" }, "properties": { @@ -3638,7 +4738,7 @@ } ], "default": null, - "description": "Optional. SCHEMA FIELDS FOR TYPE OBJECT Properties of Type.OBJECT.", + "description": "Optional. If type is `OBJECT`, `properties` is a map of property names to schema definitions for each property of the object.", "title": "Properties" }, "propertyOrdering": { @@ -3654,7 +4754,7 @@ } ], "default": null, - "description": "Optional. The order of the properties. Not a standard field in open api spec. Only used to support the order of the properties.", + "description": "Optional. Order of properties displayed or used where order matters. This is not a standard field in OpenAPI specification, but can be used to control the order of properties.", "title": "Propertyordering" }, "required": { @@ -3670,7 +4770,7 @@ } ], "default": null, - "description": "Optional. Required properties of Type.OBJECT.", + "description": "Optional. If type is `OBJECT`, `required` lists the names of properties that must be present.", "title": "Required" }, "title": { @@ -3683,7 +4783,7 @@ } ], "default": null, - "description": "Optional. The title of the Schema.", + "description": "Optional. Title for the schema.", "title": "Title" }, "type": { @@ -3696,14 +4796,47 @@ } ], "default": null, - "description": "Optional. The type of the data." + "description": "Optional. Data type of the schema field." } }, "title": "Schema", "type": "object" }, + "SearchTypes": { + "additionalProperties": false, + "description": "Different types of search that can be enabled on the GoogleSearch tool.", + "properties": { + "webSearch": { + "anyOf": [ + { + "$ref": "#/$defs/WebSearch" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Setting this field enables web search. Only text results are returned." + }, + "imageSearch": { + "anyOf": [ + { + "$ref": "#/$defs/ImageSearch" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Setting this field enables image search. Image bytes are returned." + } + }, + "title": "SearchTypes", + "type": "object" + }, "SequentialAgentConfig": { "additionalProperties": false, + "deprecated": true, "description": "The config for the YAML schema of a SequentialAgent.", "properties": { "agent_class": { @@ -3778,9 +4911,20 @@ "title": "SequentialAgentConfig", "type": "object" }, + "ServiceTier": { + "description": "Pricing and performance service tier.", + "enum": [ + "unspecified", + "flex", + "standard", + "priority" + ], + "title": "ServiceTier", + "type": "string" + }, "SpeakerVoiceConfig": { "additionalProperties": false, - "description": "The configuration for the speaker to use.", + "description": "Configuration for a single speaker in a multi-speaker setup.", "properties": { "speaker": { "anyOf": [ @@ -3792,7 +4936,7 @@ } ], "default": null, - "description": "The name of the speaker to use. Should be the same as in the\n prompt.", + "description": "Required. The name of the speaker. This should be the same as the speaker name used in the prompt.", "title": "Speaker" }, "voiceConfig": { @@ -3805,7 +4949,7 @@ } ], "default": null, - "description": "The configuration for the voice to use." + "description": "Required. The configuration for the voice of this speaker." } }, "title": "SpeakerVoiceConfig", @@ -3813,7 +4957,7 @@ }, "SpeechConfig": { "additionalProperties": false, - "description": "The speech generation configuration.", + "description": "Config for speech generation and transcription.", "properties": { "voiceConfig": { "anyOf": [ @@ -3825,7 +4969,20 @@ } ], "default": null, - "description": "The configuration for the speaker to use.\n " + "description": "The configuration in case of single-voice output." + }, + "languageCode": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The language code (ISO 639-1) for the speech synthesis.", + "title": "Languagecode" }, "multiSpeakerVoiceConfig": { "anyOf": [ @@ -3837,9 +4994,226 @@ } ], "default": null, - "description": "The configuration for the multi-speaker setup.\n It is mutually exclusive with the voice_config field.\n " + "description": "The configuration for a multi-speaker text-to-speech request. This field is mutually exclusive with `voice_config`." + } + }, + "title": "SpeechConfig", + "type": "object" + }, + "StreamableHttpTransport": { + "additionalProperties": false, + "description": "A transport that can stream HTTP requests and responses.\n\nNext ID: 6. This data type is not supported in Vertex AI.", + "properties": { + "headers": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional: Fields for authentication headers, timeouts, etc., if needed.", + "title": "Headers" }, - "languageCode": { + "sseReadTimeout": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Timeout for SSE read operations.", + "title": "Ssereadtimeout" + }, + "terminateOnClose": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Whether to close the client session when the transport closes.", + "title": "Terminateonclose" + }, + "timeout": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "HTTP timeout for regular operations.", + "title": "Timeout" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The full URL for the MCPServer endpoint. Example: \"https://api.example.com/mcp\".", + "title": "Url" + } + }, + "title": "StreamableHttpTransport", + "type": "object" + }, + "ThinkingConfig": { + "additionalProperties": false, + "description": "The thinking features configuration.", + "properties": { + "includeThoughts": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Indicates whether to include thoughts in the response. If true, thoughts are returned only if the model supports thought and thoughts are available.\n ", + "title": "Includethoughts" + }, + "thinkingBudget": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Indicates the thinking budget in tokens. 0 is DISABLED. -1 is AUTOMATIC. The default values and allowed ranges are model dependent.\n ", + "title": "Thinkingbudget" + }, + "thinkingLevel": { + "anyOf": [ + { + "$ref": "#/$defs/ThinkingLevel" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. The number of thoughts tokens that the model should generate." + } + }, + "title": "ThinkingConfig", + "type": "object" + }, + "ThinkingLevel": { + "description": "The number of thoughts tokens that the model should generate.", + "enum": [ + "THINKING_LEVEL_UNSPECIFIED", + "MINIMAL", + "LOW", + "MEDIUM", + "HIGH" + ], + "title": "ThinkingLevel", + "type": "string" + }, + "ToolAnnotations": { + "additionalProperties": true, + "description": "Additional properties describing a Tool to clients.\n\nNOTE: all properties in ToolAnnotations are **hints**.\nThey are not guaranteed to provide a faithful description of\ntool behavior (including descriptive properties like `title`).\n\nClients should never make tool use decisions based on ToolAnnotations\nreceived from untrusted servers.", + "properties": { + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Title" + }, + "readOnlyHint": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Readonlyhint" + }, + "destructiveHint": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Destructivehint" + }, + "idempotentHint": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Idempotenthint" + }, + "openWorldHint": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Openworldhint" + } + }, + "title": "ToolAnnotations", + "type": "object" + }, + "ToolArgsConfig": { + "additionalProperties": true, + "description": "Config to host free key-value pairs for the args in ToolConfig.", + "properties": {}, + "title": "ToolArgsConfig", + "type": "object" + }, + "ToolCall": { + "additionalProperties": false, + "description": "A predicted server-side `ToolCall` returned from the model.\n\nThis message contains information about a tool that the model wants to invoke.\nThe client is NOT expected to execute this `ToolCall`. Instead, the\nclient should pass this `ToolCall` back to the API in a subsequent turn\nwithin a `Content` message, along with the corresponding `ToolResponse`.", + "properties": { + "id": { "anyOf": [ { "type": "string" @@ -3849,54 +5223,58 @@ } ], "default": null, - "description": "Language code (ISO 639. e.g. en-US) for the speech synthesization.\n Only available for Live API.\n ", - "title": "Languagecode" - } - }, - "title": "SpeechConfig", - "type": "object" - }, - "ThinkingConfig": { - "additionalProperties": false, - "description": "The thinking features configuration.", - "properties": { - "includeThoughts": { + "description": "Unique identifier of the tool call. The server returns the tool response with the matching `id`.", + "title": "Id" + }, + "toolType": { "anyOf": [ { - "type": "boolean" + "$ref": "#/$defs/ToolType" }, { "type": "null" } ], "default": null, - "description": "Indicates whether to include thoughts in the response. If true, thoughts are returned only if the model supports thought and thoughts are available.\n ", - "title": "Includethoughts" + "description": "The type of tool that was called." }, - "thinkingBudget": { + "args": { "anyOf": [ { - "type": "integer" + "additionalProperties": true, + "type": "object" }, { "type": "null" } ], "default": null, - "description": "Indicates the thinking budget in tokens. 0 is DISABLED. -1 is AUTOMATIC. The default values and allowed ranges are model dependent.\n ", - "title": "Thinkingbudget" + "description": "The tool call arguments. Example: {\"arg1\": \"value1\", \"arg2\": \"value2\"}.", + "title": "Args" } }, - "title": "ThinkingConfig", + "title": "ToolCall", "type": "object" }, - "ToolAnnotations": { + "ToolCodeExecution": { + "additionalProperties": false, + "description": "Tool that executes code generated by the model, and automatically returns the result to the model.\n\nSee also [ExecutableCode]and [CodeExecutionResult] which are input and output\nto this tool. This data type is not supported in Gemini API.", + "properties": {}, + "title": "ToolCodeExecution", + "type": "object" + }, + "ToolExecution": { "additionalProperties": true, - "description": "Additional properties describing a Tool to clients.\n\nNOTE: all properties in ToolAnnotations are **hints**.\nThey are not guaranteed to provide a faithful description of\ntool behavior (including descriptive properties like `title`).\n\nClients should never make tool use decisions based on ToolAnnotations\nreceived from untrusted servers.", + "description": "Execution-related properties for a tool.", "properties": { - "title": { + "taskSupport": { "anyOf": [ { + "enum": [ + "forbidden", + "optional", + "required" + ], "type": "string" }, { @@ -3904,96 +5282,109 @@ } ], "default": null, - "title": "Title" - }, - "readOnlyHint": { + "title": "Tasksupport" + } + }, + "title": "ToolExecution", + "type": "object" + }, + "ToolParallelAiSearch": { + "additionalProperties": false, + "description": "ParallelAiSearch tool type.\n\nA tool that uses the Parallel.ai search engine for grounding. This data type\nis not supported in Gemini API.", + "properties": { + "apiKey": { "anyOf": [ { - "type": "boolean" + "type": "string" }, { "type": "null" } ], "default": null, - "title": "Readonlyhint" + "description": "Optional. The API key for ParallelAiSearch. If an API key is not provided, the system will attempt to verify access by checking for an active Parallel.ai subscription through the Google Cloud Marketplace. See https://docs.parallel.ai/search/search-quickstart for more details.", + "title": "Apikey" }, - "destructiveHint": { + "customConfigs": { "anyOf": [ { - "type": "boolean" + "additionalProperties": true, + "type": "object" }, { "type": "null" } ], "default": null, - "title": "Destructivehint" - }, - "idempotentHint": { + "description": "Optional. Custom configs for ParallelAiSearch. This field can be used to pass any parameter from the Parallel.ai Search API. See the Parallel.ai documentation for the full list of available parameters and their usage: https://docs.parallel.ai/api-reference/search-beta/search Currently only `source_policy`, `excerpts`, `max_results`, `mode`, `fetch_policy` can be set via this field. For example: { \"source_policy\": { \"include_domains\": [\"google.com\", \"wikipedia.org\"], \"exclude_domains\": [\"example.com\"] }, \"fetch_policy\": { \"max_age_seconds\": 3600 } }", + "title": "Customconfigs" + } + }, + "title": "ToolParallelAiSearch", + "type": "object" + }, + "ToolResponse": { + "additionalProperties": false, + "description": "The output from a server-side `ToolCall` execution.\n\nThis message contains the results of a tool invocation that was initiated by a\n`ToolCall` from the model. The client should pass this `ToolResponse` back to\nthe API in a subsequent turn within a `Content` message, along with the\ncorresponding `ToolCall`.", + "properties": { + "id": { "anyOf": [ { - "type": "boolean" + "type": "string" }, { "type": "null" } ], "default": null, - "title": "Idempotenthint" + "description": "The identifier of the tool call this response is for.", + "title": "Id" }, - "openWorldHint": { + "toolType": { "anyOf": [ { - "type": "boolean" + "$ref": "#/$defs/ToolType" }, { "type": "null" } ], "default": null, - "title": "Openworldhint" - } - }, - "title": "ToolAnnotations", - "type": "object" - }, - "ToolArgsConfig": { - "additionalProperties": true, - "description": "Config to host free key-value pairs for the args in ToolConfig.", - "properties": {}, - "title": "ToolArgsConfig", - "type": "object" - }, - "ToolCodeExecution": { - "additionalProperties": false, - "description": "Tool that executes code generated by the model, and automatically returns the result to the model.\n\nSee also [ExecutableCode]and [CodeExecutionResult] which are input and output\nto this tool.", - "properties": {}, - "title": "ToolCodeExecution", - "type": "object" - }, - "ToolComputerUse": { - "additionalProperties": false, - "description": "Tool to support computer use.", - "properties": { - "environment": { + "description": "The type of tool that was called, matching the tool_type in the corresponding ToolCall." + }, + "response": { "anyOf": [ { - "$ref": "#/$defs/Environment" + "additionalProperties": true, + "type": "object" }, { "type": "null" } ], "default": null, - "description": "Required. The environment being operated." + "description": "The tool response.", + "title": "Response" } }, - "title": "ToolComputerUse", + "title": "ToolResponse", "type": "object" }, + "ToolType": { + "description": "The type of tool in the function call.", + "enum": [ + "TOOL_TYPE_UNSPECIFIED", + "GOOGLE_SEARCH_WEB", + "GOOGLE_SEARCH_IMAGE", + "URL_CONTEXT", + "GOOGLE_MAPS", + "FILE_SEARCH" + ], + "title": "ToolType", + "type": "string" + }, "Type": { - "description": "Optional. The type of the data.", + "description": "Data type of the schema field.", "enum": [ "TYPE_UNSPECIFIED", "STRING", @@ -4009,14 +5400,14 @@ }, "UrlContext": { "additionalProperties": false, - "description": "Tool to support URL context retrieval.", + "description": "Tool to support URL context.", "properties": {}, "title": "UrlContext", "type": "object" }, "VertexAISearch": { "additionalProperties": false, - "description": "Retrieve from Vertex AI Search datastore or engine for grounding.\n\ndatastore and engine are mutually exclusive. See\nhttps://cloud.google.com/products/agent-builder", + "description": "Retrieve from Vertex AI Search datastore or engine for grounding.\n\ndatastore and engine are mutually exclusive. See\nhttps://cloud.google.com/products/agent-builder. This data type is not\nsupported in Gemini API.", "properties": { "dataStoreSpecs": { "anyOf": [ @@ -4083,7 +5474,7 @@ } ], "default": null, - "description": "Optional. Number of search results to return per query. The default value is 10. The maximum allowed value is 10.", + "description": "Optional. Number of search results to return per query. The default value is 10. The maximumm allowed value is 10.", "title": "Maxresults" } }, @@ -4092,7 +5483,7 @@ }, "VertexAISearchDataStoreSpec": { "additionalProperties": false, - "description": "Define data stores within engine to filter on in a search call and configurations for those data stores.\n\nFor more information, see\nhttps://cloud.google.com/generative-ai-app-builder/docs/reference/rpc/google.cloud.discoveryengine.v1#datastorespec", + "description": "Define data stores within engine to filter on in a search call and configurations for those data stores.\n\nFor more information, see\nhttps://cloud.google.com/generative-ai-app-builder/docs/reference/rpc/google.cloud.discoveryengine.v1#datastorespec.\nThis data type is not supported in Gemini API.", "properties": { "dataStore": { "anyOf": [ @@ -4126,7 +5517,7 @@ }, "VertexRagStore": { "additionalProperties": false, - "description": "Retrieve from Vertex RAG Store for grounding.", + "description": "Retrieve from Vertex RAG Store for grounding.\n\nThis data type is not supported in Gemini API.", "properties": { "ragCorpora": { "anyOf": [ @@ -4217,7 +5608,7 @@ }, "VertexRagStoreRagResource": { "additionalProperties": false, - "description": "The definition of the Rag resource.", + "description": "The definition of the Rag resource.\n\nThis data type is not supported in Gemini API.", "properties": { "ragCorpus": { "anyOf": [ @@ -4254,33 +5645,33 @@ }, "VideoMetadata": { "additionalProperties": false, - "description": "Describes how the video in the Part should be used by the model.", + "description": "Provides metadata for a video, including the start and end offsets for clipping and the frame rate.", "properties": { - "fps": { + "endOffset": { "anyOf": [ { - "type": "number" + "type": "string" }, { "type": "null" } ], "default": null, - "description": "The frame rate of the video sent to the model. If not specified, the\n default value will be 1.0. The fps range is (0.0, 24.0].", - "title": "Fps" + "description": "Optional. The end offset of the video.", + "title": "Endoffset" }, - "endOffset": { + "fps": { "anyOf": [ { - "type": "string" + "type": "number" }, { "type": "null" } ], "default": null, - "description": "Optional. The end offset of the video.", - "title": "Endoffset" + "description": "Optional. The frame rate of the video sent to the model. If not specified, the default value is 1.0. The valid range is (0.0, 24.0].", + "title": "Fps" }, "startOffset": { "anyOf": [ @@ -4303,6 +5694,18 @@ "additionalProperties": false, "description": "The configuration for the voice to use.", "properties": { + "replicatedVoiceConfig": { + "anyOf": [ + { + "$ref": "#/$defs/ReplicatedVoiceConfig" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The configuration for a replicated voice, which is a clone of a\n user's voice that can be used for speech synthesis. If this is unset, a\n default voice is used." + }, "prebuiltVoiceConfig": { "anyOf": [ { @@ -4313,12 +5716,40 @@ } ], "default": null, - "description": "The configuration for the speaker to use.\n " + "description": "The configuration for a prebuilt voice." } }, "title": "VoiceConfig", "type": "object" }, + "VoiceConsentSignature": { + "additionalProperties": false, + "description": "The signature of the voice consent check.", + "properties": { + "signature": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The signature string.\n ", + "title": "Signature" + } + }, + "title": "VoiceConsentSignature", + "type": "object" + }, + "WebSearch": { + "additionalProperties": false, + "description": "Standard web search for grounding and related configurations.\n\nOnly text results are returned.", + "properties": {}, + "title": "WebSearch", + "type": "object" + }, "google__adk__tools__tool_configs__ToolConfig": { "additionalProperties": false, "description": "The configuration for a tool.\n\nThe config supports these types of tools:\n1. ADK built-in tools\n2. User-defined tool instances\n3. User-defined tool classes\n4. User-defined functions that generate tool instances\n5. User-defined function tools\n\nFor examples:\n\n 1. For ADK built-in tool instances or classes in `google.adk.tools` package,\n they can be referenced directly with the `name` and optionally with\n `args`.\n\n ```\n tools:\n - name: google_search\n - name: AgentTool\n args:\n agent: ./another_agent.yaml\n skip_summarization: true\n ```\n\n 2. For user-defined tool instances, the `name` is the fully qualified path\n to the tool instance.\n\n ```\n tools:\n - name: my_package.my_module.my_tool\n ```\n\n 3. For user-defined tool classes (custom tools), the `name` is the fully\n qualified path to the tool class and `args` is the arguments for the tool.\n\n ```\n tools:\n - name: my_package.my_module.my_tool_class\n args:\n my_tool_arg1: value1\n my_tool_arg2: value2\n ```\n\n 4. For user-defined functions that generate tool instances, the `name` is\n the fully qualified path to the function and `args` is passed to the\n function as arguments.\n\n ```\n tools:\n - name: my_package.my_module.my_tool_function\n args:\n my_function_arg1: value1\n my_function_arg2: value2\n ```\n\n The function must have the following signature:\n ```\n def my_function(args: ToolArgsConfig) -> BaseTool:\n ...\n ```\n\n 5. For user-defined function tools, the `name` is the fully qualified path\n to the function.\n\n ```\n tools:\n - name: my_package.my_module.my_function_tool\n ```\n\n If the above use cases don't suffice, users can define a custom tool config\n by extending BaseToolConfig and override from_config() in the custom tool.", @@ -4351,33 +5782,41 @@ "additionalProperties": false, "description": "Tool details of a tool that the model may use to generate a response.", "properties": { - "functionDeclarations": { + "retrieval": { "anyOf": [ { - "items": { - "$ref": "#/$defs/FunctionDeclaration" - }, - "type": "array" + "$ref": "#/$defs/Retrieval" }, { "type": "null" } ], "default": null, - "description": "List of function declarations that the tool supports.", - "title": "Functiondeclarations" + "description": "Optional. Retrieval tool type. System will always execute the provided retrieval tool(s) to get external knowledge to answer the prompt. Retrieval results are presented to the model for generation. This field is not supported in Gemini API." }, - "retrieval": { + "computerUse": { "anyOf": [ { - "$ref": "#/$defs/Retrieval" + "$ref": "#/$defs/ComputerUse" }, { "type": "null" } ], "default": null, - "description": "Optional. Retrieval tool type. System will always execute the provided retrieval tool(s) to get external knowledge to answer the prompt. Retrieval results are presented to the model for generation." + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, + "fileSearch": { + "anyOf": [ + { + "$ref": "#/$defs/FileSearch" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. FileSearch tool type. Tool to retrieve knowledge from Semantic Retrieval corpora. This field is not supported in Vertex AI." }, "googleSearch": { "anyOf": [ @@ -4389,19 +5828,31 @@ } ], "default": null, - "description": "Optional. Google Search tool type. Specialized retrieval tool\n that is powered by Google Search." + "description": "Optional. GoogleSearch tool type. Tool to support Google Search in Model. Powered by Google." }, - "googleSearchRetrieval": { + "googleMaps": { "anyOf": [ { - "$ref": "#/$defs/GoogleSearchRetrieval" + "$ref": "#/$defs/GoogleMaps" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool that allows grounding the model's response with\n geospatial context related to the user's query." + }, + "codeExecution": { + "anyOf": [ + { + "$ref": "#/$defs/ToolCodeExecution" }, { "type": "null" } ], "default": null, - "description": "Optional. GoogleSearchRetrieval tool type. Specialized retrieval tool that is powered by Google search." + "description": "Optional. CodeExecution tool type. Enables the model to execute code as part of generation." }, "enterpriseWebSearch": { "anyOf": [ @@ -4413,55 +5864,75 @@ } ], "default": null, - "description": "Optional. Enterprise web search tool type. Specialized retrieval\n tool that is powered by Vertex AI Search and Sec4 compliance." + "description": "Optional. Tool to support searching public web data, powered by Vertex AI Search and Sec4 compliance. This field is not supported in Gemini API." }, - "googleMaps": { + "functionDeclarations": { "anyOf": [ { - "$ref": "#/$defs/GoogleMaps" + "items": { + "$ref": "#/$defs/FunctionDeclaration" + }, + "type": "array" }, { "type": "null" } ], "default": null, - "description": "Optional. Google Maps tool type. Specialized retrieval tool\n that is powered by Google Maps." + "description": "Optional. Function tool type. One or more function declarations to be passed to the model along with the current user query. Model may decide to call a subset of these functions by populating FunctionCall in the response. User should provide a FunctionResponse for each function call in the next turn. Based on the function responses, Model will generate the final response back to the user. Maximum 512 function declarations can be provided.", + "title": "Functiondeclarations" }, - "urlContext": { + "googleSearchRetrieval": { "anyOf": [ { - "$ref": "#/$defs/UrlContext" + "$ref": "#/$defs/GoogleSearchRetrieval" }, { "type": "null" } ], "default": null, - "description": "Optional. Tool to support URL context retrieval." + "description": "Optional. Specialized retrieval tool that is powered by Google Search." }, - "computerUse": { + "parallelAiSearch": { "anyOf": [ { - "$ref": "#/$defs/ToolComputerUse" + "$ref": "#/$defs/ToolParallelAiSearch" }, { "type": "null" } ], "default": null, - "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + "description": "Optional. If specified, Vertex AI will use Parallel.ai to search for information to answer user queries. The search results will be grounded on Parallel.ai and presented to the model for response generation. This field is not supported in Gemini API." }, - "codeExecution": { + "urlContext": { "anyOf": [ { - "$ref": "#/$defs/ToolCodeExecution" + "$ref": "#/$defs/UrlContext" }, { "type": "null" } ], "default": null, - "description": "Optional. CodeExecution tool type. Enables the model to execute code as part of generation." + "description": "Optional. Tool to support URL context retrieval." + }, + "mcpServers": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/McpServer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. MCP Servers to connect to. This field is not supported in Vertex AI.", + "title": "Mcpservers" } }, "title": "Tool", @@ -4471,6 +5942,18 @@ "additionalProperties": false, "description": "Tool config.\n\nThis config is shared for all tools provided in the request.", "properties": { + "retrievalConfig": { + "anyOf": [ + { + "$ref": "#/$defs/RetrievalConfig" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Retrieval config." + }, "functionCallingConfig": { "anyOf": [ { @@ -4483,17 +5966,18 @@ "default": null, "description": "Optional. Function calling config." }, - "retrievalConfig": { + "includeServerSideToolInvocations": { "anyOf": [ { - "$ref": "#/$defs/RetrievalConfig" + "type": "boolean" }, { "type": "null" } ], "default": null, - "description": "Optional. Retrieval config." + "description": "If true, the API response will include the server-side tool calls and responses within the `Content` message. This allows clients to observe the server's tool invocations.", + "title": "Includeserversidetoolinvocations" } }, "title": "ToolConfig", @@ -4501,7 +5985,7 @@ }, "mcp__types__Tool": { "additionalProperties": true, - "description": "Definition for a tool that the client can call.", + "description": "Definition for a tool the client can call.", "properties": { "name": { "title": "Name", @@ -4549,6 +6033,21 @@ "default": null, "title": "Outputschema" }, + "icons": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/Icon" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Icons" + }, "annotations": { "anyOf": [ { @@ -4572,6 +6071,17 @@ ], "default": null, "title": "Meta" + }, + "execution": { + "anyOf": [ + { + "$ref": "#/$defs/ToolExecution" + }, + { + "type": "null" + } + ], + "default": null } }, "required": [ @@ -4582,6 +6092,7 @@ "type": "object" } }, + "deprecated": true, "description": "The config for the YAML schema to create an agent.", "oneOf": [ { diff --git a/src/google/adk/agents/context.py b/src/google/adk/agents/context.py index 7a66f17a41..d39f6d1271 100644 --- a/src/google/adk/agents/context.py +++ b/src/google/adk/agents/context.py @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +"""Context class for ADK agents.""" + from __future__ import annotations from collections.abc import Mapping @@ -19,12 +21,14 @@ from typing import Any from typing import TYPE_CHECKING +from opentelemetry import context as context_api from typing_extensions import override from .readonly_context import ReadonlyContext if TYPE_CHECKING: from google.genai import types + from pydantic import BaseModel from ..artifacts.base_artifact_service import ArtifactVersion from ..auth.auth_credential import AuthCredential @@ -34,21 +38,108 @@ from ..events.ui_widget import UiWidget from ..memory.base_memory_service import SearchMemoryResponse from ..memory.memory_entry import MemoryEntry + from ..sessions.session import Session from ..sessions.state import State + from ..telemetry.node_tracing import TelemetryContext from ..tools.tool_confirmation import ToolConfirmation + from ..workflow._base_node import BaseNode + from ..workflow._graph import NodeLike + from ..workflow._graph import RouteValue + from ..workflow._schedule_dynamic_node import ScheduleDynamicNode from .invocation_context import InvocationContext +_MAX_PARENT_DEPTH = 50 + + +def _derive_scheduler( + parent_ctx: Context | None, +) -> ScheduleDynamicNode | None: + """Derives the dynamic node scheduler from the parent context.""" + if parent_ctx: + scheduler = parent_ctx._workflow_scheduler + if scheduler is None: + from ..workflow._dynamic_node_scheduler import DynamicNodeScheduler + from ..workflow._dynamic_node_scheduler import DynamicNodeState + + scheduler = DynamicNodeScheduler(state=DynamicNodeState()) + return scheduler + return None + + +def _derive_node_path( + node_name: str | None, + run_id: str, + node_path: str | None, + parent_path: str | None, + *, + node: BaseNode | None = None, +) -> tuple[str, str]: + """Derives the node path and run ID.""" + if node_path: + return node_path, run_id + + # Fallback: Reconstruct parent_path from static parent_agent Tree + # if parent_path is missing during multi-turn session resumption. + from ..agents.base_agent import BaseAgent + from ..events._node_path_builder import _NodePathBuilder + + derived_run_id = run_id or '1' + + if not parent_path and isinstance(node, BaseAgent) and node.parent_agent: + path_builder = _NodePathBuilder([]) + curr = node.parent_agent + parent_agents = [] + depth = 0 + while curr is not None and depth < _MAX_PARENT_DEPTH: + parent_agents.insert(0, curr) + curr = curr.parent_agent + depth += 1 + for agent in parent_agents: + path_builder = path_builder.append(agent.name, '1') + parent_path = str(path_builder) + + # Root contexts have no node name and no parent path. Return an empty path + # to ensure they are correctly identified as the root of the execution + # hierarchy. + if not node_name and not parent_path: + return '', derived_run_id + + base_path_builder = ( + _NodePathBuilder.from_string(parent_path) + if parent_path + else _NodePathBuilder([]) + ) + + derived_node_path = str( + base_path_builder.append(node_name or '', derived_run_id) + ) + return derived_node_path, derived_run_id + class Context(ReadonlyContext): - """The context within an agent run.""" + """The context within an agent run. + + When used in a workflow, additional fields under the ``Workflow-specific + fields`` section are available. + """ def __init__( self, invocation_context: InvocationContext, *, + # Core State & Actions event_actions: EventActions | None = None, + # Tool Execution function_call_id: str | None = None, tool_confirmation: ToolConfirmation | None = None, + # Workflow Execution + parent_ctx: Context | None = None, + node: BaseNode | None = None, + node_path: str | None = None, + run_id: str = '', + resume_inputs: dict[str, Any] | None = None, + attempt_count: int = 1, + use_as_output: bool = False, ) -> None: """Initializes the Context. @@ -59,20 +150,85 @@ def __init__( for tool-specific methods like request_credential and request_confirmation. tool_confirmation: The tool confirmation of the current tool call. + parent_ctx: The parent node's Context. + node: The current node. + node_path: The path of the current node in the workflow graph. If not + provided, it will be derived from parent_ctx and node. + run_id: The execution ID of the current node. + resume_inputs: Inputs for resuming node, keyed by interrupt id. + attempt_count: Number of times this node has been attempted. + use_as_output: If True, this node's output also represents the parent + node's output. """ super().__init__(invocation_context) + self._parent_ctx = parent_ctx + self._node = node + from ..events.event_actions import EventActions from ..sessions.state import State + from ..telemetry.node_tracing import TelemetryContext + # Core State & Actions, Event & Telemetry self._event_actions = event_actions or EventActions() + + computed_state_schema = None + if node and node.state_schema: + computed_state_schema = node.state_schema + elif parent_ctx: + computed_state_schema = parent_ctx.state._schema + self._state = State( value=invocation_context.session.state, delta=self._event_actions.state_delta, + schema=computed_state_schema + or getattr(invocation_context, '_state_schema', None), ) + + self._event_author = parent_ctx.event_author if parent_ctx else '' + + self._telemetry_context = TelemetryContext( + otel_context=context_api.get_current() + ) + + # Tool Execution self._function_call_id = function_call_id self._tool_confirmation = tool_confirmation + # Workflow Execution + self._node_path, self._run_id = _derive_node_path( + node.name if node else None, + run_id, + node_path, + parent_ctx.node_path if parent_ctx else None, + node=node, + ) + self._resume_inputs = resume_inputs or {} + self._workflow_scheduler = _derive_scheduler(parent_ctx) + self._node_rerun_on_resume = node.rerun_on_resume if node else True + self._child_run_counters: dict[str, int] = {} + self._attempt_count = attempt_count + self._output_delegated = False + self._output_value: Any = None + self._output_emitted: bool = False + self._route_value: RouteValue | list[RouteValue] | None = None + self._route_emitted: bool = False + self._interrupt_ids: set[str] = set() + # scope tag inherited from parent ctx by default; + # NodeRunner / Workflow may override before the node runs. + self._isolation_scope: str | None = ( + parent_ctx.isolation_scope if parent_ctx else None + ) + + if use_as_output and parent_ctx: + self._output_for_ancestors: list[str] = [parent_ctx.node_path] + list( + parent_ctx._output_for_ancestors or [] + ) + else: + self._output_for_ancestors: list[str] = [] + self._error: Exception | None = None + self._error_node_path: str = '' + @property def function_call_id(self) -> str | None: """The function call id of the current tool call.""" @@ -83,6 +239,20 @@ def function_call_id(self, value: str | None) -> None: """Sets the function call id of the current tool call.""" self._function_call_id = value + @property + def isolation_scope(self) -> str | None: + """Scope tag inherited from parent or set explicitly via override. + + See ``Event.isolation_scope`` for format. + + ⚠️ DO NOT USE THIS DIRECTLY. Internal mechanism, may change. + """ + return self._isolation_scope + + @isolation_scope.setter + def isolation_scope(self, value: str | None) -> None: + self._isolation_scope = value + @property def tool_confirmation(self) -> ToolConfirmation | None: """The tool confirmation of the current tool call.""" @@ -108,6 +278,283 @@ def actions(self) -> EventActions: """The event actions for the current context.""" return self._event_actions + @property + @override + def session(self) -> Session: + """Returns the current session for this invocation.""" + return self._invocation_context.session + + # ============================================================================ + # Workflow-specific properties and methods + # ============================================================================ + + @property + def parent_ctx(self) -> Context | None: + """Returns the parent node's Context.""" + return self._parent_ctx + + @property + def node(self) -> BaseNode | None: + """Returns the node instance of this context.""" + return self._node + + @property + def node_path(self) -> str: + """Returns the path of the current node in the workflow graph.""" + return self._node_path + + @property + def run_id(self) -> str: + """Returns the execution ID of the current node.""" + return self._run_id + + @property + def attempt_count(self) -> int: + """Returns the current attempt number (1-based).""" + return self._attempt_count + + @property + def resume_inputs(self) -> dict[str, Any]: + """Returns inputs for resuming node, keyed by interrupt id.""" + return self._resume_inputs + + @property + def error(self) -> Exception | None: + """The exception raised by the node, if any.""" + return self._error + + @property + def error_node_path(self) -> str: + """The path of the node that failed.""" + return self._error_node_path + + @property + def output(self) -> Any: + """The node's result value. Source of truth for node output. + + Set once per run. Also set by the framework when the node + yields Event(output=X) or yields a raw value. If the value was + set via yield, the output Event is already enqueued. If set + directly, the framework emits the output Event after _run_impl + returns. + + Raises ValueError if: + - Set a second time (at most one output per execution). + - Set when interrupt_ids is non-empty (output and interrupt + are mutually exclusive). + """ + return self._output_value + + @output.setter + def output(self, value: Any) -> None: + if self._output_value is not None: + raise ValueError( + 'Output already set. A node can produce at most one output.' + ) + self._output_value = value + + @property + def route(self) -> RouteValue | list[RouteValue] | None: + """Routing value for conditional edges. + + Read by the orchestrator to decide which downstream edge to + follow. Can be set independently of output. + """ + return self._route_value + + @route.setter + def route(self, value: RouteValue | list[RouteValue]) -> None: + self._route_value = value + self._route_emitted = False + + @property + def interrupt_ids(self) -> set[str]: + """Interrupt IDs accumulated during this execution. Read-only. + + Set by the framework when the node yields an Event with + long_running_tool_ids. + """ + return set(self._interrupt_ids) + + @property + def event_author(self) -> str: + """Author name stamped on events emitted by this node. + + Set by the orchestrator to override the default (node name). + For example, Workflow sets this to its own name so all child + events appear under the workflow's author. + + Empty string means use the node's own name (default). + """ + return self._event_author + + @event_author.setter + def event_author(self, value: str) -> None: + self._event_author = value + + @property + def telemetry_context(self) -> TelemetryContext: + """Returns the telemetry context.""" + return self._telemetry_context + + def get_invocation_context(self) -> InvocationContext: + """Returns a copy of the invocation context with the proxy session.""" + ctx = self._invocation_context + ctx_with_proxy = ctx.model_copy( + update={ + 'session': self.session, + } + ) + return ctx_with_proxy + + async def run_node( + self, + node: NodeLike, + node_input: Any = None, + *, + use_as_output: bool = False, + run_id: str | None = None, + use_sub_branch: bool = False, + override_branch: str | None = None, + override_isolation_scope: str | None = None, + raise_on_wait: bool = False, + ) -> Any: + """Executes a node dynamically. + + This method allows a node within a workflow to trigger the run of + another node (or a callable that can be built into a node) and + asynchronously wait for its result. The dynamically executed node becomes + a child run of the current node in the workflow. + + IMPORTANT: Always ``await`` this method directly. Wrapping it in + ``asyncio.create_task()`` means the task runs unsupervised — errors + are silently swallowed and the task is not cancelled if the parent + node is interrupted (e.g. via HITL). + + Args: + node: The node to be executed. This can be a BaseNode instance or a + callable that can be built into a node. + node_input: The input data to be passed to the dynamically executed node. + Defaults to None. + use_as_output: If True, the dynamic node's output is used as the + calling node's output. The calling node's own output event is + suppressed to avoid duplication. + run_id: An optional custom run ID for the dynamic node execution. + If not provided, a default run ID is generated. Useful for + correlating events across runs. + use_sub_branch: If True, the dynamic node will be executed in a sub-branch + to isolate its state and events from the main branch. + override_branch: An optional branch to use instead of parent's branch. + + Returns: + The output of the dynamically executed node, once it finishes executing. + """ + + if not self._node_rerun_on_resume: + raise ValueError( + 'A node must have rerun_on_resume=True. Reason is that dynamically' + ' scheduled nodes might be interrupted, and the workflow' + ' wakes-up/re-runs the parent node, so it can get the child node' + ' response.' + ) + + from ..workflow.utils._workflow_graph_utils import build_node # pylint: disable=g-import-not-at-top + + built_node = build_node(node) + + from ..agents.base_agent import BaseAgent + + if isinstance(node, BaseAgent) and isinstance(built_node, BaseAgent): + built_node.parent_agent = node.parent_agent + + # Mode 1: Running within a Workflow graph. + # The workflow orchestrator provides a scheduler to handle resume, dedup, + # etc. + if self._workflow_scheduler: + from ..workflow._errors import NodeInterruptedError + + # Output delegation: once set, the calling node's own output + # events are suppressed — the child's output (annotated with + # output_for) becomes the calling node's output. + if use_as_output: + if self._output_delegated: + raise ValueError( + f'Node {self.node_path} already has a use_as_output delegate.' + ) + self._output_delegated = True + + if run_id: + if run_id.isdigit(): + raise ValueError( + f'Explicit run_id "{run_id}" for node "{built_node.name}" must' + ' contain non-numeric characters to prevent collision with' + ' auto-generated IDs.' + ) + else: + self._child_run_counters[built_node.name] = ( + self._child_run_counters.get(built_node.name, 0) + 1 + ) + run_id = str(self._child_run_counters[built_node.name]) + + child_ctx = await self._workflow_scheduler( + self, + built_node, + node_input, + node_name=built_node.name, + use_as_output=use_as_output, + run_id=run_id, + use_sub_branch=use_sub_branch, + override_branch=override_branch, + override_isolation_scope=override_isolation_scope, + ) + if child_ctx.error: + from ..workflow._errors import DynamicNodeFailError + + raise DynamicNodeFailError( + message=f'Dynamic node {built_node.name} failed', + error=child_ctx.error, + error_node_path=child_ctx.error_node_path, + ) + if child_ctx.interrupt_ids: + # Propagate child's interrupt_ids to this node's ctx + # so NodeRunner sees them after catching the error. + self._interrupt_ids.update(child_ctx.interrupt_ids) + raise NodeInterruptedError() + # When the caller passes raise_on_wait=True, surface a child + # that's WAITING (wait_for_output, no output, not transferring) + # as NodeInterruptedError so the parent's NodeRunner records + # the parent as WAITING instead of falsely COMPLETED. + if ( + raise_on_wait + and built_node.wait_for_output + and child_ctx.output is None + and not child_ctx.actions.transfer_to_agent + ): + raise NodeInterruptedError() + return child_ctx.output + + # Mode 2: Standalone execution (outside of workflow). + # Run the node directly via NodeRunner. + result = await self._run_node_standalone( + built_node, + node_input, + use_as_output=use_as_output, + use_sub_branch=use_sub_branch, + override_branch=override_branch, + override_isolation_scope=override_isolation_scope, + run_id=run_id, + ) + if ( + raise_on_wait + and built_node.wait_for_output + and result.output is None + and not result.actions.transfer_to_agent + ): + from ..workflow._errors import NodeInterruptedError + + raise NodeInterruptedError() + return result.output + # ============================================================================ # Artifact methods # ============================================================================ @@ -126,7 +573,7 @@ async def load_artifact( The artifact. """ if self._invocation_context.artifact_service is None: - raise ValueError("Artifact service is not initialized.") + raise ValueError('Artifact service is not initialized.') return await self._invocation_context.artifact_service.load_artifact( app_name=self._invocation_context.app_name, user_id=self._invocation_context.user_id, @@ -152,7 +599,7 @@ async def save_artifact( The version of the artifact. """ if self._invocation_context.artifact_service is None: - raise ValueError("Artifact service is not initialized.") + raise ValueError('Artifact service is not initialized.') version = await self._invocation_context.artifact_service.save_artifact( app_name=self._invocation_context.app_name, user_id=self._invocation_context.user_id, @@ -178,7 +625,7 @@ async def get_artifact_version( The artifact version info. """ if self._invocation_context.artifact_service is None: - raise ValueError("Artifact service is not initialized.") + raise ValueError('Artifact service is not initialized.') return await self._invocation_context.artifact_service.get_artifact_version( app_name=self._invocation_context.app_name, user_id=self._invocation_context.user_id, @@ -190,7 +637,7 @@ async def get_artifact_version( async def list_artifacts(self) -> list[str]: """Lists the filenames of the artifacts attached to the current session.""" if self._invocation_context.artifact_service is None: - raise ValueError("Artifact service is not initialized.") + raise ValueError('Artifact service is not initialized.') return await self._invocation_context.artifact_service.list_artifact_keys( app_name=self._invocation_context.app_name, user_id=self._invocation_context.user_id, @@ -208,7 +655,7 @@ async def save_credential(self, auth_config: AuthConfig) -> None: auth_config: The authentication configuration containing the credential. """ if self._invocation_context.credential_service is None: - raise ValueError("Credential service is not initialized.") + raise ValueError('Credential service is not initialized.') await self._invocation_context.credential_service.save_credential( auth_config, self ) @@ -225,7 +672,7 @@ async def load_credential( The loaded credential, or None if not found. """ if self._invocation_context.credential_service is None: - raise ValueError("Credential service is not initialized.") + raise ValueError('Credential service is not initialized.') return await self._invocation_context.credential_service.load_credential( auth_config, self ) @@ -263,9 +710,9 @@ def request_credential(self, auth_config: AuthConfig) -> None: if not self.function_call_id: raise ValueError( - "request_credential requires function_call_id. " - "This method can only be used in a tool context, not a callback " - "context. Consider using save_credential/load_credential instead." + 'request_credential requires function_call_id. ' + 'This method can only be used in a tool context, not a callback ' + 'context. Consider using save_credential/load_credential instead.' ) self._event_actions.requested_auth_configs[self.function_call_id] = ( AuthHandler(auth_config).generate_auth_request() @@ -297,8 +744,8 @@ def request_confirmation( if not self.function_call_id: raise ValueError( - "request_confirmation requires function_call_id. " - "This method can only be used in a tool context." + 'request_confirmation requires function_call_id. ' + 'This method can only be used in a tool context.' ) self._event_actions.requested_tool_confirmations[self.function_call_id] = ( ToolConfirmation( @@ -329,7 +776,7 @@ async def my_after_agent_callback(ctx: Context): """ if self._invocation_context.memory_service is None: raise ValueError( - "Cannot add session to memory: memory service is not available." + 'Cannot add session to memory: memory service is not available.' ) await self._invocation_context.memory_service.add_session_to_memory( self._invocation_context.session @@ -355,7 +802,7 @@ async def add_events_to_memory( """ if self._invocation_context.memory_service is None: raise ValueError( - "Cannot add events to memory: memory service is not available." + 'Cannot add events to memory: memory service is not available.' ) await self._invocation_context.memory_service.add_events_to_memory( app_name=self._invocation_context.session.app_name, @@ -384,7 +831,7 @@ async def add_memory( ValueError: If memory service is not available. """ if self._invocation_context.memory_service is None: - raise ValueError("Cannot add memory: memory service is not available.") + raise ValueError('Cannot add memory: memory service is not available.') await self._invocation_context.memory_service.add_memory( app_name=self._invocation_context.session.app_name, user_id=self._invocation_context.session.user_id, @@ -405,7 +852,7 @@ async def search_memory(self, query: str) -> SearchMemoryResponse: ValueError: If memory service is not available. """ if self._invocation_context.memory_service is None: - raise ValueError("Memory service is not available.") + raise ValueError('Memory service is not available.') return await self._invocation_context.memory_service.search_memory( app_name=self._invocation_context.app_name, user_id=self._invocation_context.user_id, @@ -433,7 +880,37 @@ def render_ui_widget(self, ui_widget: UiWidget) -> None: if existing_widget.id == ui_widget.id: raise ValueError( f"UI widget with ID '{ui_widget.id}' already exists in the current" - " event actions." + ' event actions.' ) self._event_actions.render_ui_widgets.append(ui_widget) + + # ============================================================================ + # Node Execution Dispatcher + # ============================================================================ + + async def _run_node_standalone( + self, + node: BaseNode, + node_input: Any, + *, + use_as_output: bool = False, + run_id: str | None = None, + use_sub_branch: bool = False, + override_branch: str | None = None, + override_isolation_scope: str | None = None, + resume_inputs: dict[str, Any] | None = None, + ) -> Context: + """Run a node directly via NodeRunner without an orchestrator.""" + from ..workflow._node_runner import NodeRunner + + runner = NodeRunner( + node=node, + parent_ctx=self, + run_id=run_id, + use_as_output=use_as_output, + use_sub_branch=use_sub_branch, + override_branch=override_branch, + override_isolation_scope=override_isolation_scope, + ) + return await runner.run(node_input=node_input, resume_inputs=resume_inputs) diff --git a/src/google/adk/agents/invocation_context.py b/src/google/adk/agents/invocation_context.py index 8dc1a01af2..89d831a884 100644 --- a/src/google/adk/agents/invocation_context.py +++ b/src/google/adk/agents/invocation_context.py @@ -14,6 +14,7 @@ from __future__ import annotations +import asyncio from typing import Any from typing import cast from typing import Optional @@ -36,6 +37,7 @@ from ..sessions.base_session_service import BaseSessionService from ..sessions.session import Session from ..tools.base_tool import BaseTool +from ..workflow._base_node import BaseNode from .active_streaming_tool import ActiveStreamingTool from .base_agent import BaseAgent from .base_agent import BaseAgentState @@ -161,13 +163,36 @@ class InvocationContext(BaseModel): Branch is used when multiple sub-agents shouldn't see their peer agents' conversation history. """ - agent: BaseAgent - """The current agent of this invocation context. Readonly.""" + isolation_scope: Optional[str] = None + """Scope tag for filtering session events visible to this agent. + + When set, the LLM content-builder restricts session events to those + whose ``event.isolation_scope`` matches. One usage today is the + Task API: task-mode and single_turn-mode agents are scoped under + the originating function-call id; chat coordinators are unscoped + and see only unscoped events. + + ⚠️ DO NOT USE THIS FIELD DIRECTLY. It is an internal mechanism + that may change without notice. + """ + agent: Optional[BaseAgent | BaseNode] = None + """The current agent of this invocation context. + + None when Runner drives a BaseNode (not a BaseAgent). + """ user_content: Optional[types.Content] = None """The user content that started this invocation. Readonly.""" session: Session """The current session of this invocation context. Readonly.""" + node_path: Optional[str] = None + """The path of the current agent in the workflow call stack. + + Used by workflow agents to track their position in nested agent hierarchies. + Format: "agent_1/agent_2/agent_3" where agent_1 is the outermost workflow. + None for non-workflow agents. + """ + agent_states: dict[str, dict[str, Any]] = Field(default_factory=dict) """The state of the agent for this invocation.""" @@ -212,9 +237,25 @@ class InvocationContext(BaseModel): plugin_manager: PluginManager = Field(default_factory=PluginManager) """The manager for keeping track of plugins in this invocation.""" + _state_schema: Optional[type[BaseModel]] = None + """The Pydantic model declaring the expected state keys and types. + + Propagated from the owning agent down the hierarchy. When set, + ``ctx.state`` mutations and ``Event(state={...})`` deltas are + validated against this schema at runtime. + """ + canonical_tools_cache: Optional[list[BaseTool]] = None """The cache of canonical tools for this invocation.""" + _event_queue: Optional[asyncio.Queue] = PrivateAttr(default=None) + """Shared event queue for all nodes in this invocation. + + All nodes enqueue events here via ``_enqueue_event()``. The Runner + main loop is the sole consumer — it appends events to session and + yields them to SSE. + """ + credential_by_key: dict[str, AuthCredential] = Field(default_factory=dict) """The resolved credentials for this invocation, keyed by credential_key.""" @@ -233,6 +274,30 @@ def is_resumable(self) -> bool: and self.resumability_config.is_resumable ) + async def _enqueue_event(self, event: Event) -> None: + """Enqueue an event for the Runner main loop to process. + + Non-partial events block until the main loop has appended them + to session, ensuring session consistency before the node + continues. Partial events (SSE streaming) flow through without + blocking. + """ + if self._event_queue is None: + raise RuntimeError( + "_enqueue_event called but _event_queue is not set. " + "Ensure the Runner initialises _event_queue on " + "InvocationContext." + ) + + if event.partial: + # Partial events: SSE streaming only, no session append, no blocking. + await self._event_queue.put((event, None)) + else: + # Non-partial events: block until main loop appends to session. + processed = asyncio.Event() + await self._event_queue.put((event, processed)) + await processed.wait() + def set_agent_state( self, agent_name: str, @@ -296,24 +361,27 @@ def populate_invocation_agent_states(self) -> None: if not self.is_resumable: return for event in self._get_events(current_invocation=True): + # Use node_info.path if available (workflow events), otherwise fall + # back to author (non-workflow events). + key = event.node_info.path or event.author if event.actions.end_of_agent: - self.end_of_agents[event.author] = True + self.end_of_agents[key] = True # Delete agent_state when it is end - self.agent_states.pop(event.author, None) + self.agent_states.pop(key, None) elif event.actions.agent_state is not None: - self.agent_states[event.author] = event.actions.agent_state + self.agent_states[key] = event.actions.agent_state # Invalidate the end_of_agent flag - self.end_of_agents[event.author] = False + self.end_of_agents[key] = False elif ( event.author != "user" and event.content - and not self.agent_states.get(event.author) + and not self.agent_states.get(key) ): # If the agent has generated some contents but its agent_state is not # set, set its agent_state to an empty agent_state. - self.agent_states[event.author] = BaseAgentState() + self.agent_states[key] = BaseAgentState().model_dump(mode="json") # Invalidate the end_of_agent flag - self.end_of_agents[event.author] = False + self.end_of_agents[key] = False def increment_llm_call_count( self, @@ -361,7 +429,12 @@ def _get_events( if event.invocation_id == self.invocation_id ] if current_branch: - results = [event for event in results if event.branch == self.branch] + results = [ + event + for event in results + if event.branch == self.branch + or (event.branch is None and event.author == "user") + ] return results def should_pause_invocation(self, event: Event) -> bool: @@ -379,8 +452,7 @@ def should_pause_invocation(self, event: Event) -> bool: running. Should meet all following conditions to pause an invocation: - 1. The app is resumable. - 2. The current event has a long running function call. + 1. The current event has a long running function call. Args: event: The current event. @@ -388,9 +460,6 @@ def should_pause_invocation(self, event: Event) -> bool: Returns: Whether to pause the invocation right after this event. """ - if not self.is_resumable: - return False - if not event.long_running_tool_ids or not event.get_function_calls(): return False diff --git a/src/google/adk/agents/llm/__init__.py b/src/google/adk/agents/llm/__init__.py new file mode 100644 index 0000000000..58d482ea38 --- /dev/null +++ b/src/google/adk/agents/llm/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/google/adk/agents/llm/task/__init__.py b/src/google/adk/agents/llm/task/__init__.py new file mode 100644 index 0000000000..58d482ea38 --- /dev/null +++ b/src/google/adk/agents/llm/task/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/google/adk/agents/llm/task/_finish_task_tool.py b/src/google/adk/agents/llm/task/_finish_task_tool.py new file mode 100644 index 0000000000..05c61b96b5 --- /dev/null +++ b/src/google/adk/agents/llm/task/_finish_task_tool.py @@ -0,0 +1,185 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""FinishTaskTool: signals task completion and sets finish_task action.""" + +from __future__ import annotations + +from typing import Any +from typing import Optional +from typing import TYPE_CHECKING + +from google.genai import types +from pydantic import TypeAdapter +from pydantic import ValidationError +from typing_extensions import override + +from ....tools.base_tool import BaseTool +from ....utils._schema_utils import SchemaType +from ._task_models import _DefaultTaskOutput +from ._task_models import TaskResult + +if TYPE_CHECKING: + from ....models.llm_request import LlmRequest + from ....tools.tool_context import ToolContext + from ...llm_agent import LlmAgent + +# Name of the finish_task tool +FINISH_TASK_TOOL_NAME = 'finish_task' + +# Success result returned by FinishTaskTool.run_async when validation +# passes. The wrapper uses this to distinguish a successful completion +# from a validation-error retry signal. +FINISH_TASK_SUCCESS_RESULT = 'Task completed.' + + +class FinishTaskTool(BaseTool): + """Tool for signaling LlmAgent task completion. + + This tool allows the model to signal that the agent has completed its + task. On success it sets ``tool_context.actions.finish_task`` with a + serialized ``TaskResult`` dict. + """ + + def __init__( + self, + task_agent: LlmAgent, + ): + """Initialize the finish_task tool. + + Args: + task_agent: The task agent this tool belongs to. The agent's + ``output_schema`` is used for validation. If None, the default + schema (a single ``result`` string) is used. + """ + self._task_agent_name = task_agent.name + + output_schema = task_agent.output_schema + self.output_schema: SchemaType = ( + output_schema if output_schema is not None else _DefaultTaskOutput + ) + self._adapter: TypeAdapter[Any] = TypeAdapter(self.output_schema) + raw_schema = self._adapter.json_schema() + # FunctionDeclaration parameters must be a JSON object schema. + # If the schema is already an object (e.g. BaseModel), use it directly. + # Otherwise wrap it in an object with a single key. + self._wrapper_key: str | None = ( + None if raw_schema.get('type') == 'object' else 'result' + ) + + description = ( + 'Signal that this agent has completed its delegated task. Call this' + ' when you have finished your delegated task.' + ) + if output_schema: + description += ' Pass the required output data in the parameters.' + + super().__init__( + name=FINISH_TASK_TOOL_NAME, + description=description, + ) + + @override + def _get_declaration(self) -> Optional[types.FunctionDeclaration]: + """Get the function declaration for this tool.""" + raw_schema = self._adapter.json_schema() + if self._wrapper_key: + # Extract $defs to the root level so $ref pointers remain valid + # after wrapping the schema inside an object property. + defs = raw_schema.pop('$defs', None) + schema_json = { + 'type': 'object', + 'properties': {self._wrapper_key: raw_schema}, + 'required': [self._wrapper_key], + } + if defs: + schema_json['$defs'] = defs + else: + schema_json = raw_schema + + return types.FunctionDeclaration( + name=FINISH_TASK_TOOL_NAME, + description=self.description, + parameters_json_schema=schema_json, + ) + + @override + async def process_llm_request( + self, *, tool_context: ToolContext, llm_request: LlmRequest + ) -> None: + """Process the outgoing LLM request to add tool and instructions. + + Args: + tool_context: The context of the tool. + llm_request: The outgoing LLM request. + """ + await super().process_llm_request( + tool_context=tool_context, llm_request=llm_request + ) + + instruction = self._build_instruction() + llm_request.append_instructions([instruction]) + + def _build_instruction(self) -> str: + """Build the finish_task instruction. + + Returns: + Instruction text for the LLM about when to call finish_task. + """ + return """\ +Do NOT call `finish_task` prematurely. Use your available tools to +fully complete every aspect of the delegated task first. If the +task is unclear, ask the user for clarification before proceeding. +Once the task is fully complete, call `finish_task` by itself with +no accompanying text output.""" + + @override + async def run_async( + self, + *, + args: dict[str, Any], + tool_context: ToolContext, + ) -> str | dict[str, str]: + """Execute the finish_task tool. + + Validates args against the output schema and sets + ``tool_context.actions.finish_task`` on success. + + Args: + args: The arguments passed to the tool. + tool_context: The tool execution context. + + Returns: + Confirmation message, or error dict if validation fails. + """ + try: + raw_value = args.get(self._wrapper_key) if self._wrapper_key else args + validated = self._adapter.validate_python(raw_value) + validated_output = self._adapter.dump_python(validated, mode='json') + except ValidationError as e: + return { + 'error': ( + f'Invoking `{self.name}()` failed due to validation' + f' errors:\n{e}\nYou could retry calling this tool, but' + ' it is IMPORTANT for you to provide all the mandatory' + ' parameters with correct types.' + ) + } + + # do not write actions.finish_task. The LlmAgent + # wrapper sniffs the finish_task FC's `output` arg directly to + # set event.output on the task agent's run. + del validated_output + + return FINISH_TASK_SUCCESS_RESULT diff --git a/src/google/adk/agents/llm/task/_task_models.py b/src/google/adk/agents/llm/task/_task_models.py new file mode 100644 index 0000000000..62e4afdeeb --- /dev/null +++ b/src/google/adk/agents/llm/task/_task_models.py @@ -0,0 +1,119 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Data models for task-mode LlmAgent delegation. + +Used by ``FinishTaskTool`` to validate and serialize task input/result +payloads. +""" + +from __future__ import annotations + +import logging +from typing import Any +from typing import Optional + +from pydantic import alias_generators +from pydantic import BaseModel +from pydantic import ConfigDict + +logger = logging.getLogger('google_adk.' + __name__) + + +class TaskRequest(BaseModel): + """A request to delegate a task to a sub-agent.""" + + model_config = ConfigDict( + extra='forbid', + alias_generator=alias_generators.to_camel, + populate_by_name=True, + ) + + agent_name: str + """The name of the target agent to delegate to.""" + + input: dict[str, Any] + """The validated input data for the task.""" + + +class TaskResult(BaseModel): + """The result returned by a task agent upon completion.""" + + model_config = ConfigDict( + extra='forbid', + alias_generator=alias_generators.to_camel, + populate_by_name=True, + ) + + output: Any + """The validated output data from the task.""" + + +def _as_task_request(value: Any) -> TaskRequest: + """Convert a value to a TaskRequest instance. + + Handles both TaskRequest instances (same-invocation, stored directly) + and plain dicts (after session deserialization via model_dump()). + + Args: + value: A TaskRequest instance or a dict representation. + + Returns: + A TaskRequest instance. + """ + if isinstance(value, TaskRequest): + return value + if not isinstance(value, dict): + logger.error( + 'Unexpected type for TaskRequest: %s. Expected TaskRequest or dict.', + type(value).__name__, + ) + return TaskRequest.model_validate(value) + + +class _DefaultTaskInput(BaseModel): + """Default input schema when no custom input_schema is provided. + + Used by RequestTaskTool to generate the function declaration when the + target agent does not define an explicit input_schema. + """ + + model_config = ConfigDict( + extra='forbid', + alias_generator=alias_generators.to_camel, + populate_by_name=True, + ) + + goal: Optional[str] = None + """The goal or objective for the task agent.""" + + background: Optional[str] = None + """Additional background context for the task agent.""" + + +class _DefaultTaskOutput(BaseModel): + """Default output schema when no custom output_schema is provided. + + Used by FinishTaskTool to generate the function declaration when the + task agent does not define an explicit output_schema. + """ + + model_config = ConfigDict( + extra='forbid', + alias_generator=alias_generators.to_camel, + populate_by_name=True, + ) + + result: str + """A brief summary of what the agent accomplished.""" diff --git a/src/google/adk/agents/llm_agent.py b/src/google/adk/agents/llm_agent.py index b41b7f4eff..ee1b05c535 100644 --- a/src/google/adk/agents/llm_agent.py +++ b/src/google/adk/agents/llm_agent.py @@ -14,6 +14,7 @@ from __future__ import annotations +import abc import asyncio import importlib import inspect @@ -61,10 +62,10 @@ from ..utils.context_utils import Aclosing from .base_agent import BaseAgent from .base_agent import BaseAgentState -from .base_agent_config import BaseAgentConfig +from .base_agent_config import BaseAgentConfig as BaseAgentConfig from .callback_context import CallbackContext from .invocation_context import InvocationContext -from .llm_agent_config import LlmAgentConfig +from .llm_agent_config import LlmAgentConfig as LlmAgentConfig from .readonly_context import ReadonlyContext logger = logging.getLogger('google_adk.' + __name__) @@ -192,25 +193,37 @@ async def _convert_tool_union_to_tools( return [] -class LlmAgent(BaseAgent): +# TODO: drop the explicit abc.ABC base once BaseNode surfaces ABCMeta to +# static type checkers. +class LlmAgent(BaseAgent, abc.ABC): """LLM-based Agent.""" - DEFAULT_MODEL: ClassVar[str] = 'gemini-2.5-flash' + DEFAULT_MODEL: ClassVar[str] = 'gemini-3-flash-preview' """System default model used when no model is set on an agent.""" + DEFAULT_LIVE_MODEL: ClassVar[str] = 'gemini-live-2.5-flash-native-audio' + """System default model used for live mode when no model is set on an agent.""" + _default_model: ClassVar[Union[str, BaseLlm]] = DEFAULT_MODEL """Current default model used when an agent has no model set.""" + _default_live_model: ClassVar[Union[str, BaseLlm]] = DEFAULT_LIVE_MODEL + """Current default model used for live mode when an agent has no model set.""" + model: Union[str, BaseLlm] = '' """The model to use for the agent. When not set, the agent will inherit the model from its ancestor. If no ancestor provides a model, the agent uses the default model configured via - LlmAgent.set_default_model. The built-in default is gemini-2.5-flash. + LlmAgent.set_default_model. The built-in default is gemini-3-flash-preview. """ config_type: ClassVar[Type[BaseAgentConfig]] = LlmAgentConfig - """The config type for this agent.""" + """The config type for this agent. + + DEPRECATED: This attribute is deprecated and will be removed in a future + version, along with the AgentConfig YAML loader. + """ instruction: Union[str, InstructionProvider] = '' """Dynamic instructions for the LLM model, guiding the agent's behavior. @@ -303,6 +316,20 @@ class LlmAgent(BaseAgent): settings, etc. """ + mode: Literal['chat', 'task', 'single_turn'] | None = None + """The delegation mode for this agent. + + Options: + chat: Standard chat agent reachable via transfer_to_agent. + task: Task agent that chats with the user to accomplish a task. + single_turn: Agents that complete a task without chatting with the user. + + Default value is chat as a sub-agent, single_turn as a node in a workflow. + """ + + parallel_worker: bool | None = None + """Whether to run the agent in parallel worker mode.""" + # LLM-based agent transfer configs - Start disallow_transfer_to_parent: bool = False """Disallows LLM-controlled transferring to the parent agent. @@ -515,6 +542,27 @@ async def _run_live_impl( if ctx.end_invocation: return + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + """Runs the agent as a node in a workflow graph.""" + from ..utils.context_utils import Aclosing + from ..workflow._llm_agent_wrapper import run_llm_agent_as_node + + async with Aclosing( + run_llm_agent_as_node(self, ctx=ctx, node_input=node_input) + ) as agen: + async for event in agen: + # Keep the agent's true event author so the outer NodeRunner does + # not overwrite it with the parent workflow's event_author. + if event.author: + ctx.event_author = event.author + yield event + @property def canonical_model(self) -> BaseLlm: """The resolved self.model field as BaseLlm. @@ -533,6 +581,24 @@ def canonical_model(self) -> BaseLlm: ancestor_agent = ancestor_agent.parent_agent return self._resolve_default_model() + @property + def canonical_live_model(self) -> BaseLlm: + """The resolved self.model field as BaseLlm for live mode. + + This method is only for use by Agent Development Kit. + """ + if isinstance(self.model, BaseLlm): + return self.model + elif self.model: # model is non-empty str + return LLMRegistry.new_llm(self.model) + else: # find model from ancestors. + ancestor_agent = self.parent_agent + while ancestor_agent is not None: + if isinstance(ancestor_agent, LlmAgent): + return ancestor_agent.canonical_live_model + ancestor_agent = ancestor_agent.parent_agent + return self._resolve_default_live_model() + @classmethod def set_default_model(cls, model: Union[str, BaseLlm]) -> None: """Overrides the default model used when an agent has no model set.""" @@ -550,6 +616,23 @@ def _resolve_default_model(cls) -> BaseLlm: return default_model return LLMRegistry.new_llm(default_model) + @classmethod + def set_default_live_model(cls, model: Union[str, BaseLlm]) -> None: + """Overrides the default model used for live mode when an agent has no model set.""" + if not isinstance(model, (str, BaseLlm)): + raise TypeError('Default live model must be a model name or BaseLlm.') + if isinstance(model, str) and not model: + raise ValueError('Default live model must be a non-empty string.') + cls._default_live_model = model + + @classmethod + def _resolve_default_live_model(cls) -> BaseLlm: + """Resolves the current default live model to a BaseLlm instance.""" + default_live_model = cls._default_live_model + if isinstance(default_live_model, BaseLlm): + return default_live_model + return LLMRegistry.new_llm(default_live_model) + async def canonical_instruction( self, ctx: ReadonlyContext ) -> tuple[str, bool]: @@ -898,10 +981,14 @@ def model_post_init(self, __context: Any) -> None: """Provides a warning if multiple thinking configurations are found.""" super().model_post_init(__context) - # Note: Using getattr to check both locations for thinking_config - if getattr( - self.generate_content_config, 'thinking_config', None - ) and getattr(self.planner, 'thinking_config', None): + from ..planners.built_in_planner import BuiltInPlanner + + if ( + self.generate_content_config is not None + and self.generate_content_config.thinking_config is not None + and isinstance(self.planner, BuiltInPlanner) + and self.planner.thinking_config is not None + ): warnings.warn( 'Both `thinking_config` in `generate_content_config` and a ' 'planner with `thinking_config` are provided. The ' @@ -910,6 +997,30 @@ def model_post_init(self, __context: Any) -> None: stacklevel=3, ) + if self.mode == 'task': + from .llm.task._finish_task_tool import FinishTaskTool + + self.tools.append(FinishTaskTool(self)) + + # Add sub-agents as tools based on their mode + from ..tools.agent_tool import _SingleTurnAgentTool + from ..tools.agent_tool import _TaskAgentTool + + if self.sub_agents: + for sub_agent in self.sub_agents: + if isinstance(sub_agent, LlmAgent): + mode = getattr(sub_agent, 'mode', None) + if mode is None: + try: + sub_agent.mode = 'chat' + mode = 'chat' + except (AttributeError, TypeError): + continue + if mode == 'single_turn': + self.tools.append(_SingleTurnAgentTool(sub_agent)) + elif mode == 'task': + self.tools.append(_TaskAgentTool(sub_agent)) + @classmethod @experimental(FeatureName.AGENT_CONFIG) def _resolve_tools( diff --git a/src/google/adk/agents/llm_agent_config.py b/src/google/adk/agents/llm_agent_config.py index 93ca718094..23a6737445 100644 --- a/src/google/adk/agents/llm_agent_config.py +++ b/src/google/adk/agents/llm_agent_config.py @@ -14,8 +14,6 @@ from __future__ import annotations -import logging -from typing import Any from typing import List from typing import Literal from typing import Optional @@ -24,14 +22,16 @@ from pydantic import ConfigDict from pydantic import Field from pydantic import model_validator +from typing_extensions import deprecated from ..tools.tool_configs import ToolConfig from .base_agent_config import BaseAgentConfig from .common_configs import CodeConfig -logger = logging.getLogger('google_adk.' + __name__) - +@deprecated( + 'LlmAgentConfig is deprecated and will be removed in future versions.' +) class LlmAgentConfig(BaseAgentConfig): """The config for the YAML schema of a LlmAgent.""" @@ -55,10 +55,11 @@ class LlmAgentConfig(BaseAgentConfig): default=None, description=( 'Optional. LlmAgent.model. Provide a model name string (e.g.' - ' "gemini-2.5-flash"). If not set, the model will be inherited from' - ' the ancestor or fall back to the system default (gemini-2.5-flash' - ' unless overridden via LlmAgent.set_default_model). To construct a' - ' model instance from code, use model_code.' + ' "gemini-3-flash-preview"). If not set, the model will be inherited' + ' from the ancestor or fall back to the system default' + ' (gemini-3-flash-preview unless overridden via' + ' LlmAgent.set_default_model). To construct a model instance from' + ' code, use model_code.' ), ) @@ -71,25 +72,6 @@ class LlmAgentConfig(BaseAgentConfig): ), ) - @model_validator(mode='before') - @classmethod - def _normalize_model_code(cls, data: Any) -> dict[str, Any] | Any: - if not isinstance(data, dict): - return data - - model_value = data.get('model') - model_code = data.get('model_code') - if isinstance(model_value, dict) and model_code is None: - logger.warning( - 'Detected legacy `model` mapping. Use `model_code` to provide a' - ' CodeConfig for custom model construction.' - ) - data = dict(data) - data['model_code'] = model_value - data['model'] = None - - return data - @model_validator(mode='after') def _validate_model_sources(self) -> LlmAgentConfig: if self.model and self.model_code: diff --git a/src/google/adk/agents/loop_agent.py b/src/google/adk/agents/loop_agent.py index 13480a9e01..6bf5221404 100644 --- a/src/google/adk/agents/loop_agent.py +++ b/src/google/adk/agents/loop_agent.py @@ -23,6 +23,7 @@ from typing import Dict from typing import Optional +from typing_extensions import deprecated from typing_extensions import override from ..events.event import Event @@ -49,15 +50,27 @@ class LoopAgentState(BaseAgentState): """The number of times the loop agent has looped.""" +@deprecated( + 'LoopAgent is deprecated and will be removed in future versions.' + ' Please use Workflow instead.' +) class LoopAgent(BaseAgent): """A shell agent that run its sub-agents in a loop. When sub-agent generates an event with escalate or max_iterations are reached, the loop agent will stop. + + .. deprecated:: + LoopAgent is deprecated and will be removed in future versions. + Please use Workflow instead. """ config_type: ClassVar[type[BaseAgentConfig]] = LoopAgentConfig - """The config type for this agent.""" + """The config type for this agent. + + DEPRECATED: This attribute is deprecated and will be removed in a future + version, along with the AgentConfig YAML loader. + """ max_iterations: Optional[int] = None """The maximum number of iterations to run the loop agent. diff --git a/src/google/adk/agents/loop_agent_config.py b/src/google/adk/agents/loop_agent_config.py index 78fc790b04..61ec049e97 100644 --- a/src/google/adk/agents/loop_agent_config.py +++ b/src/google/adk/agents/loop_agent_config.py @@ -20,12 +20,16 @@ from pydantic import ConfigDict from pydantic import Field +from typing_extensions import deprecated from ..features import experimental from ..features import FeatureName from .base_agent_config import BaseAgentConfig +@deprecated( + 'LoopAgentConfig is deprecated and will be removed in future versions.' +) @experimental(FeatureName.AGENT_CONFIG) class LoopAgentConfig(BaseAgentConfig): """The config for the YAML schema of a LoopAgent.""" diff --git a/src/google/adk/agents/parallel_agent.py b/src/google/adk/agents/parallel_agent.py index cb8b09f655..8284ec6232 100644 --- a/src/google/adk/agents/parallel_agent.py +++ b/src/google/adk/agents/parallel_agent.py @@ -21,6 +21,7 @@ from typing import AsyncGenerator from typing import ClassVar +from typing_extensions import deprecated from typing_extensions import override from ..events.event import Event @@ -147,6 +148,10 @@ async def process_an_agent(events_for_one_agent): task.cancel() +@deprecated( + 'ParallelAgent is deprecated and will be removed in future versions.' + ' Please use Workflow instead.' +) class ParallelAgent(BaseAgent): """A shell agent that runs its sub-agents in parallel in an isolated manner. @@ -155,10 +160,18 @@ class ParallelAgent(BaseAgent): - Running different algorithms simultaneously. - Generating multiple responses for review by a subsequent evaluation agent. + + .. deprecated:: + ParallelAgent is deprecated and will be removed in future versions. + Please use Workflow instead. """ config_type: ClassVar[type[BaseAgentConfig]] = ParallelAgentConfig - """The config type for this agent.""" + """The config type for this agent. + + DEPRECATED: This attribute is deprecated and will be removed in a future + version, along with the AgentConfig YAML loader. + """ @override async def _run_async_impl( diff --git a/src/google/adk/agents/parallel_agent_config.py b/src/google/adk/agents/parallel_agent_config.py index 96a75b6512..aa025893c6 100644 --- a/src/google/adk/agents/parallel_agent_config.py +++ b/src/google/adk/agents/parallel_agent_config.py @@ -18,12 +18,16 @@ from pydantic import ConfigDict from pydantic import Field +from typing_extensions import deprecated from ..features import experimental from ..features import FeatureName from .base_agent_config import BaseAgentConfig +@deprecated( + "ParallelAgentConfig is deprecated and will be removed in future versions." +) @experimental(FeatureName.AGENT_CONFIG) class ParallelAgentConfig(BaseAgentConfig): """The config for the YAML schema of a ParallelAgent.""" diff --git a/src/google/adk/agents/sequential_agent.py b/src/google/adk/agents/sequential_agent.py index 06a2377bc0..01510ff4cb 100644 --- a/src/google/adk/agents/sequential_agent.py +++ b/src/google/adk/agents/sequential_agent.py @@ -21,6 +21,7 @@ from typing import ClassVar from typing import Type +from typing_extensions import deprecated from typing_extensions import override from ..events.event import Event @@ -45,11 +46,24 @@ class SequentialAgentState(BaseAgentState): """The name of the current sub-agent to run.""" +@deprecated( + 'SequentialAgent is deprecated and will be removed in future versions.' + ' Please use Workflow instead.' +) class SequentialAgent(BaseAgent): - """A shell agent that runs its sub-agents in sequence.""" + """A shell agent that runs its sub-agents in sequence. + + .. deprecated:: + SequentialAgent is deprecated and will be removed in future versions. + Please use Workflow instead. + """ config_type: ClassVar[Type[BaseAgentConfig]] = SequentialAgentConfig - """The config type for this agent.""" + """The config type for this agent. + + DEPRECATED: This attribute is deprecated and will be removed in a future + version, along with the AgentConfig YAML loader. + """ @override async def _run_async_impl( diff --git a/src/google/adk/agents/sequential_agent_config.py b/src/google/adk/agents/sequential_agent_config.py index 44551c427f..1855085cd9 100644 --- a/src/google/adk/agents/sequential_agent_config.py +++ b/src/google/adk/agents/sequential_agent_config.py @@ -18,12 +18,17 @@ from pydantic import ConfigDict from pydantic import Field +from typing_extensions import deprecated from ..agents.base_agent_config import BaseAgentConfig from ..features import experimental from ..features import FeatureName +@deprecated( + "SequentialAgentConfig is deprecated and will be removed in future" + " versions." +) @experimental(FeatureName.AGENT_CONFIG) class SequentialAgentConfig(BaseAgentConfig): """The config for the YAML schema of a SequentialAgent.""" diff --git a/src/google/adk/apps/app.py b/src/google/adk/apps/app.py index 9bde128b7a..6cbcb52c60 100644 --- a/src/google/adk/apps/app.py +++ b/src/google/adk/apps/app.py @@ -13,7 +13,10 @@ # limitations under the License. from __future__ import annotations +import re +from typing import Any from typing import Optional +from typing import Union from pydantic import BaseModel from pydantic import ConfigDict @@ -33,13 +36,15 @@ "validate_app_name", ] +_VALID_APP_NAME_RE = re.compile(r"^[a-zA-Z][a-zA-Z0-9_-]*$") + def validate_app_name(name: str) -> None: """Ensures the provided application name is safe and intuitive.""" - if not name.isidentifier(): + if not _VALID_APP_NAME_RE.match(name): raise ValueError( - f"Invalid app name '{name}': must be a valid identifier consisting of" - " letters, digits, and underscores." + f"Invalid app name '{name}': must start with a letter and can only" + " consist of letters, digits, underscores, and hyphens." ) if name == "user": raise ValueError("App name cannot be 'user'; reserved for end-user input.") @@ -49,9 +54,11 @@ class App(BaseModel): """Represents an LLM-backed agentic application. An `App` is the top-level container for an agentic system powered by LLMs. - It manages a root agent (`root_agent`), which serves as the root of an agent - tree, enabling coordination and communication across all agents in the - hierarchy. + It manages either a root agent (`root_agent`) or a root node (`root_node`), + which serves as the entry point for execution. + + Exactly one of `root_agent` or `root_node` must be provided. + The `plugins` are application-wide components that provide shared capabilities and services to the entire system. """ @@ -64,8 +71,12 @@ class App(BaseModel): name: str """The name of the application.""" - root_agent: BaseAgent - """The root agent in the application. One app can only have one root agent.""" + # Change to Union[BaseAgent, BaseNode, None] after dependency is fixed. + root_agent: Union[BaseAgent, Any, None] = None + """The root agent or node in the application. + + Accepts either a BaseAgent or a BaseNode instance. + """ plugins: list[BasePlugin] = Field(default_factory=list) """The plugins in the application.""" @@ -83,6 +94,16 @@ class App(BaseModel): """ @model_validator(mode="after") - def _validate_name(self) -> App: + def _validate(self) -> App: validate_app_name(self.name) + if self.root_agent is None: + raise ValueError("root_agent must be provided.") + + from ..workflow._base_node import BaseNode + + if not isinstance(self.root_agent, (BaseAgent, BaseNode)): + raise TypeError( + "root_agent must be a BaseAgent or BaseNode instance, got" + f" {type(self.root_agent).__name__}" + ) return self diff --git a/src/google/adk/apps/compaction.py b/src/google/adk/apps/compaction.py index 1e33003a95..5a1dd4af8b 100644 --- a/src/google/adk/apps/compaction.py +++ b/src/google/adk/apps/compaction.py @@ -79,7 +79,7 @@ def _valid_compactions( """Returns compaction events with fully-defined compaction ranges.""" compactions: list[tuple[int, float, float, Event]] = [] for i, event in enumerate(events): - if not (event.actions and event.actions.compaction): + if not event.actions.compaction: continue compaction = event.actions.compaction if ( @@ -135,9 +135,9 @@ def _estimate_prompt_token_count( """ # Deferred import: contents depends on agents.invocation_context which # imports from apps, so a top-level import would create a circular dependency. - from ..flows.llm_flows import contents + from ..flows.llm_flows import contents as _contents - effective_contents = contents._get_contents( + effective_contents = _contents._get_contents( current_branch=current_branch, events=events, agent_name=agent_name, @@ -252,7 +252,7 @@ def _events_to_compact_for_token_threshold( candidate_events = [ event for event in events - if not (event.actions and event.actions.compaction) + if not event.actions.compaction and event.timestamp > last_compacted_end_timestamp ] if len(candidate_events) <= event_retention_size: @@ -278,7 +278,6 @@ def _events_to_compact_for_token_threshold( if ( latest_compaction_event - and latest_compaction_event.actions and latest_compaction_event.actions.compaction and latest_compaction_event.actions.compaction.start_timestamp is not None and latest_compaction_event.actions.compaction.compacted_content @@ -480,6 +479,8 @@ async def _run_compaction_for_token_threshold( If triggered, this compacts older raw events and keeps the last `event_retention_size` raw events un-compacted. """ + if app.root_agent is None: + return None return await _run_compaction_for_token_threshold_config( config=app.events_compaction_config, session=session, @@ -602,11 +603,7 @@ async def _run_compaction_for_sliding_window( # Find the last compaction event and its range. last_compacted_end_timestamp = 0.0 for event in reversed(events): - if ( - event.actions - and event.actions.compaction - and event.actions.compaction.end_timestamp - ): + if event.actions.compaction and event.actions.compaction.end_timestamp: last_compacted_end_timestamp = event.actions.compaction.end_timestamp break @@ -614,7 +611,7 @@ async def _run_compaction_for_sliding_window( invocation_latest_timestamps = {} for event in events: # Only consider non-compaction events for unique invocation IDs. - if event.invocation_id and not (event.actions and event.actions.compaction): + if event.invocation_id and not event.actions.compaction: invocation_latest_timestamps[event.invocation_id] = max( invocation_latest_timestamps.get(event.invocation_id, 0.0), event.timestamp, @@ -665,9 +662,7 @@ async def _run_compaction_for_sliding_window( events_to_compact = events[first_event_start_inv_idx : last_event_idx + 1] # Filter out any existing compaction events from the list. events_to_compact = [ - e - for e in events_to_compact - if not (e.actions and e.actions.compaction) + e for e in events_to_compact if not e.actions.compaction ] pending_ids = _pending_function_call_ids(events) events_to_compact = _truncate_events_before_pending_function_call( @@ -680,6 +675,8 @@ async def _run_compaction_for_sliding_window( if not events_to_compact: return None + if app.root_agent is None: + return None _ensure_compaction_summarizer(config=config, agent=app.root_agent) if config.summarizer is None: return None diff --git a/src/google/adk/auth/auth_preprocessor.py b/src/google/adk/auth/auth_preprocessor.py index 76dd2ddab4..b0fa1e0ba8 100644 --- a/src/google/adk/auth/auth_preprocessor.py +++ b/src/google/adk/auth/auth_preprocessor.py @@ -22,8 +22,8 @@ from ..agents.invocation_context import InvocationContext from ..agents.readonly_context import ReadonlyContext from ..events.event import Event -from ..flows.llm_flows import functions from ..flows.llm_flows._base_llm_processor import BaseLlmRequestProcessor +from ..flows.llm_flows.functions import handle_function_calls_async from ..flows.llm_flows.functions import REQUEST_EUC_FUNCTION_CALL_NAME from ..models.llm_request import LlmRequest from ..sessions.state import State @@ -189,7 +189,7 @@ async def run_async( function_call.id in tools_to_resume for function_call in function_calls ]): - if function_response_event := await functions.handle_function_calls_async( + if function_response_event := await handle_function_calls_async( invocation_context, event, { diff --git a/src/google/adk/auth/auth_schemes.py b/src/google/adk/auth/auth_schemes.py index 3d6364ff66..d3ec675092 100644 --- a/src/google/adk/auth/auth_schemes.py +++ b/src/google/adk/auth/auth_schemes.py @@ -54,8 +54,8 @@ class CustomAuthScheme(BaseModelWithConfig): # AuthSchemes contains SecuritySchemes from OpenAPI 3.0, an extra flattened -# OpenIdConnectWithConfig, and supports external schemes that subclasses -# CustomAuthScheme +# OpenIdConnectWithConfig, and supports external schemes +# that subclass CustomAuthScheme. AuthScheme = Union[SecurityScheme, OpenIdConnectWithConfig, CustomAuthScheme] diff --git a/src/google/adk/auth/oauth2_credential_util.py b/src/google/adk/auth/oauth2_credential_util.py index d0d1255fbe..978d645a05 100644 --- a/src/google/adk/auth/oauth2_credential_util.py +++ b/src/google/adk/auth/oauth2_credential_util.py @@ -49,7 +49,6 @@ def create_oauth2_session( logger.warning("OpenIdConnect scheme missing token_endpoint") return None, None token_endpoint = auth_scheme.token_endpoint - scopes = auth_scheme.scopes or [] elif isinstance(auth_scheme, OAuth2): # Support both authorization code and client credentials flows if ( @@ -57,13 +56,11 @@ def create_oauth2_session( and auth_scheme.flows.authorizationCode.tokenUrl ): token_endpoint = auth_scheme.flows.authorizationCode.tokenUrl - scopes = list(auth_scheme.flows.authorizationCode.scopes.keys()) elif ( auth_scheme.flows.clientCredentials and auth_scheme.flows.clientCredentials.tokenUrl ): token_endpoint = auth_scheme.flows.clientCredentials.tokenUrl - scopes = list(auth_scheme.flows.clientCredentials.scopes.keys()) else: logger.warning( "OAuth2 scheme missing required flow configuration. Expected either" @@ -84,11 +81,12 @@ def create_oauth2_session( ): return None, None + # Scope is intentionally omitted: token exchange and refresh don't require + # it per RFC 6749, and some providers reject it on these requests. return ( OAuth2Session( auth_credential.oauth2.client_id, auth_credential.oauth2.client_secret, - scope=" ".join(scopes), redirect_uri=auth_credential.oauth2.redirect_uri, state=auth_credential.oauth2.state, token_endpoint_auth_method=auth_credential.oauth2.token_endpoint_auth_method, diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index 2b086a3626..4ea3e698bb 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -14,2212 +14,23 @@ from __future__ import annotations -import asyncio -from contextlib import asynccontextmanager -import importlib -import json import logging -import os -import re -import sys -import time -import traceback -import typing -from typing import Any -from typing import Callable -from typing import List -from typing import Literal -from typing import Optional -from fastapi import FastAPI -from fastapi import HTTPException -from fastapi import Query -from fastapi import Response -from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import RedirectResponse -from fastapi.responses import StreamingResponse -from fastapi.staticfiles import StaticFiles -from fastapi.websockets import WebSocket -from fastapi.websockets import WebSocketDisconnect -from google.genai import types -import graphviz -from opentelemetry import trace -import opentelemetry.sdk.environment_variables as otel_env -from opentelemetry.sdk.trace import export as export_lib -from opentelemetry.sdk.trace import ReadableSpan -from opentelemetry.sdk.trace import SpanProcessor -from opentelemetry.sdk.trace import TracerProvider -from pydantic import Field -from pydantic import ValidationError -from starlette.types import Lifespan from typing_extensions import deprecated -from typing_extensions import override -from watchdog.observers import Observer -import yaml -from . import agent_graph -from ..agents.base_agent import BaseAgent -from ..agents.live_request_queue import LiveRequest -from ..agents.live_request_queue import LiveRequestQueue -from ..agents.llm_agent import LlmAgent -from ..agents.llm_agent import ToolUnion -from ..agents.run_config import RunConfig -from ..agents.run_config import StreamingMode -from ..apps.app import App -from ..artifacts.base_artifact_service import ArtifactVersion -from ..artifacts.base_artifact_service import BaseArtifactService -from ..auth.credential_service.base_credential_service import BaseCredentialService -from ..errors.already_exists_error import AlreadyExistsError -from ..errors.input_validation_error import InputValidationError -from ..errors.not_found_error import NotFoundError -from ..errors.session_not_found_error import SessionNotFoundError -from ..evaluation.base_eval_service import InferenceConfig -from ..evaluation.base_eval_service import InferenceRequest -from ..evaluation.constants import MISSING_EVAL_DEPENDENCIES_MESSAGE -from ..evaluation.eval_case import EvalCase -from ..evaluation.eval_case import SessionInput -from ..evaluation.eval_metrics import EvalMetric -from ..evaluation.eval_metrics import EvalMetricResult -from ..evaluation.eval_metrics import EvalMetricResultPerInvocation -from ..evaluation.eval_metrics import EvalStatus -from ..evaluation.eval_metrics import MetricInfo -from ..evaluation.eval_result import EvalSetResult -from ..evaluation.eval_set import EvalSet -from ..evaluation.eval_set_results_manager import EvalSetResultsManager -from ..evaluation.eval_sets_manager import EvalSetsManager -from ..events.event import Event -from ..memory.base_memory_service import BaseMemoryService -from ..plugins.base_plugin import BasePlugin -from ..runners import Runner -from ..sessions.base_session_service import BaseSessionService -from ..sessions.session import Session -from ..utils.agent_info import AgentInfo -from ..utils.agent_info import get_agents_dict -from ..utils.context_utils import Aclosing -from ..utils.feature_decorator import experimental -from ..version import __version__ -from .cli_eval import EVAL_SESSION_ID_PREFIX -from .utils import cleanup -from .utils import common -from .utils import envs -from .utils import evals -from .utils.base_agent_loader import BaseAgentLoader -from .utils.shared_value import SharedValue -from .utils.state import create_empty_state +from .api_server import _parse_cors_origins +from .api_server import RunAgentRequest +from .dev_server import DevServer +from .utils.base_agent_loader import BaseAgentLoader as BaseAgentLoader logger = logging.getLogger("google_adk." + __name__) -_EVAL_SET_FILE_EXTENSION = ".evalset.json" -TAG_DEBUG = "Debug" -TAG_EVALUATION = "Evaluation" +@deprecated( + "AdkWebServer is deprecated and has been refactored into ApiServer and" + " DevServer. Use DevServer instead." +) +class AdkWebServer(DevServer): + """Deprecated wrapper class around DevServer for backward compatibility.""" -_REGEX_PREFIX = "regex:" - - -def _parse_cors_origins( - allow_origins: list[str], -) -> tuple[list[str], Optional[str]]: - """Parse allow_origins into literal origins and a combined regex pattern. - - Args: - allow_origins: List of origin strings. Entries prefixed with 'regex:' are - treated as regex patterns; all others are treated as literal origins. - - Returns: - A tuple of (literal_origins, combined_regex) where combined_regex is None - if no regex patterns were provided, or a single pattern joining all regex - patterns with '|'. - """ - literal_origins = [] - regex_patterns = [] - for origin in allow_origins: - if origin.startswith(_REGEX_PREFIX): - pattern = origin[len(_REGEX_PREFIX) :] - if pattern: - regex_patterns.append(pattern) - else: - literal_origins.append(origin) - - combined_regex = "|".join(regex_patterns) if regex_patterns else None - return literal_origins, combined_regex - - -def _is_origin_allowed( - origin: str, - allowed_literal_origins: list[str], - allowed_origin_regex: Optional[re.Pattern[str]], -) -> bool: - """Check whether the given origin matches the allowed origins.""" - if "*" in allowed_literal_origins: - return True - if origin in allowed_literal_origins: - return True - if allowed_origin_regex is not None: - return allowed_origin_regex.fullmatch(origin) is not None - return False - - -def _normalize_origin_scheme(scheme: str) -> str: - """Normalize request schemes to the browser Origin scheme space.""" - if scheme == "ws": - return "http" - if scheme == "wss": - return "https" - return scheme - - -def _strip_optional_quotes(value: str) -> str: - """Strip a single pair of wrapping quotes from a header value.""" - if len(value) >= 2 and value[0] == '"' and value[-1] == '"': - return value[1:-1] - return value - - -def _get_scope_header( - scope: dict[str, Any], header_name: bytes -) -> Optional[str]: - """Return the first matching header value from an ASGI scope.""" - for candidate_name, candidate_value in scope.get("headers", []): - if candidate_name == header_name: - return candidate_value.decode("latin-1").split(",", 1)[0].strip() - return None - - -def _get_request_origin(scope: dict[str, Any]) -> Optional[str]: - """Compute the effective origin for the current HTTP/WebSocket request.""" - forwarded = _get_scope_header(scope, b"forwarded") - if forwarded is not None: - proto = None - host = None - for element in forwarded.split(",", 1)[0].split(";"): - if "=" not in element: - continue - name, value = element.split("=", 1) - if name.strip().lower() == "proto": - proto = _strip_optional_quotes(value.strip()) - elif name.strip().lower() == "host": - host = _strip_optional_quotes(value.strip()) - if proto is not None and host is not None: - return f"{_normalize_origin_scheme(proto)}://{host}" - - host = _get_scope_header(scope, b"x-forwarded-host") - if host is None: - host = _get_scope_header(scope, b"host") - if host is None: - return None - - proto = _get_scope_header(scope, b"x-forwarded-proto") - if proto is None: - proto = scope.get("scheme", "http") - return f"{_normalize_origin_scheme(proto)}://{host}" - - -def _is_request_origin_allowed( - origin: str, - scope: dict[str, Any], - allowed_literal_origins: list[str], - allowed_origin_regex: Optional[re.Pattern[str]], - has_configured_allowed_origins: bool, -) -> bool: - """Validate an Origin header against explicit config or same-origin.""" - if has_configured_allowed_origins and _is_origin_allowed( - origin, allowed_literal_origins, allowed_origin_regex - ): - return True - - request_origin = _get_request_origin(scope) - if request_origin is None: - return False - return origin == request_origin - - -_SAFE_HTTP_METHODS = frozenset({"GET", "HEAD", "OPTIONS"}) - - -class _OriginCheckMiddleware: - """ASGI middleware that blocks cross-origin state-changing requests.""" - - def __init__( - self, - app: Any, - has_configured_allowed_origins: bool, - allowed_origins: list[str], - allowed_origin_regex: Optional[re.Pattern[str]], - ) -> None: - self._app = app - self._has_configured_allowed_origins = has_configured_allowed_origins - self._allowed_origins = allowed_origins - self._allowed_origin_regex = allowed_origin_regex - - async def __call__( - self, - scope: dict[str, Any], - receive: Any, - send: Any, - ) -> None: - if scope["type"] != "http": - await self._app(scope, receive, send) - return - - method = scope.get("method", "GET") - if method in _SAFE_HTTP_METHODS: - await self._app(scope, receive, send) - return - - origin = _get_scope_header(scope, b"origin") - if origin is None: - await self._app(scope, receive, send) - return - - if _is_request_origin_allowed( - origin, - scope, - self._allowed_origins, - self._allowed_origin_regex, - self._has_configured_allowed_origins, - ): - await self._app(scope, receive, send) - return - - response_body = b"Forbidden: origin not allowed" - await send({ - "type": "http.response.start", - "status": 403, - "headers": [ - (b"content-type", b"text/plain"), - (b"content-length", str(len(response_body)).encode()), - ], - }) - await send({ - "type": "http.response.body", - "body": response_body, - }) - - -class ApiServerSpanExporter(export_lib.SpanExporter): - - def __init__(self, trace_dict): - self.trace_dict = trace_dict - - def export( - self, spans: typing.Sequence[ReadableSpan] - ) -> export_lib.SpanExportResult: - for span in spans: - if ( - span.name == "call_llm" - or span.name == "send_data" - or span.name.startswith("execute_tool") - ): - attributes = dict(span.attributes) - attributes["trace_id"] = span.get_span_context().trace_id - attributes["span_id"] = span.get_span_context().span_id - if attributes.get("gcp.vertex.agent.event_id", None): - self.trace_dict[attributes["gcp.vertex.agent.event_id"]] = attributes - return export_lib.SpanExportResult.SUCCESS - - def force_flush(self, timeout_millis: int = 30000) -> bool: - return True - - -class InMemoryExporter(export_lib.SpanExporter): - - def __init__(self, trace_dict): - super().__init__() - self._spans = [] - self.trace_dict = trace_dict - - @override - def export( - self, spans: typing.Sequence[ReadableSpan] - ) -> export_lib.SpanExportResult: - for span in spans: - trace_id = span.context.trace_id - if span.name == "call_llm": - attributes = dict(span.attributes) - session_id = attributes.get("gcp.vertex.agent.session_id", None) - if session_id: - if session_id not in self.trace_dict: - self.trace_dict[session_id] = [trace_id] - else: - self.trace_dict[session_id] += [trace_id] - self._spans.extend(spans) - return export_lib.SpanExportResult.SUCCESS - - @override - def force_flush(self, timeout_millis: int = 30000) -> bool: - return True - - def get_finished_spans(self, session_id: str): - trace_ids = self.trace_dict.get(session_id, None) - if trace_ids is None or not trace_ids: - return [] - return [x for x in self._spans if x.context.trace_id in trace_ids] - - def clear(self): - self._spans.clear() - - -class RunAgentRequest(common.BaseModel): - app_name: str - user_id: str - session_id: str - new_message: Optional[types.Content] = None - streaming: bool = False - state_delta: Optional[dict[str, Any]] = None - # for long-running function resume requests (e.g., OAuth callback) - function_call_event_id: Optional[str] = None - # for resume long-running functions - invocation_id: Optional[str] = None - custom_metadata: Optional[dict[str, Any]] = None - - -class CreateSessionRequest(common.BaseModel): - session_id: Optional[str] = Field( - default=None, - description=( - "The ID of the session to create. If not provided, a random session" - " ID will be generated." - ), - ) - state: Optional[dict[str, Any]] = Field( - default=None, description="The initial state of the session." - ) - events: Optional[list[Event]] = Field( - default=None, - description="A list of events to initialize the session with.", - ) - - -class SaveArtifactRequest(common.BaseModel): - """Request payload for saving a new artifact.""" - - filename: str = Field(description="Artifact filename.") - artifact: types.Part = Field( - description="Artifact payload encoded as google.genai.types.Part." - ) - custom_metadata: Optional[dict[str, Any]] = Field( - default=None, - description="Optional metadata to associate with the artifact version.", - ) - - -class AddSessionToEvalSetRequest(common.BaseModel): - eval_id: str - session_id: str - user_id: str - - -class RunEvalRequest(common.BaseModel): - eval_ids: list[str] = Field( - deprecated=True, - default_factory=list, - description="This field is deprecated, use eval_case_ids instead.", - ) - eval_case_ids: list[str] = Field( - default_factory=list, - description=( - "List of eval case ids to evaluate. if empty, then all eval cases in" - " the eval set are run." - ), - ) - eval_metrics: list[EvalMetric] - - -class UpdateMemoryRequest(common.BaseModel): - """Request to add a session to the memory service.""" - - session_id: str - """The ID of the session to add to memory.""" - - -class UpdateSessionRequest(common.BaseModel): - """Request to update session state without running the agent.""" - - state_delta: dict[str, Any] - """The state changes to apply to the session.""" - - -class RunEvalResult(common.BaseModel): - eval_set_file: str - eval_set_id: str - eval_id: str - final_eval_status: EvalStatus - eval_metric_results: list[tuple[EvalMetric, EvalMetricResult]] = Field( - deprecated=True, - default=[], - description=( - "This field is deprecated, use overall_eval_metric_results instead." - ), - ) - overall_eval_metric_results: list[EvalMetricResult] - eval_metric_result_per_invocation: list[EvalMetricResultPerInvocation] - user_id: str - session_id: str - - -class RunEvalResponse(common.BaseModel): - run_eval_results: list[RunEvalResult] - - -class GetEventGraphResult(common.BaseModel): - dot_src: str - - -class CreateEvalSetRequest(common.BaseModel): - eval_set: EvalSet - - -class ListEvalSetsResponse(common.BaseModel): - eval_set_ids: list[str] - - -class EvalResult(EvalSetResult): - """This class has no field intentionally. - - The goal here is to just give a new name to the class to align with the API - endpoint. - """ - - -class ListEvalResultsResponse(common.BaseModel): - eval_result_ids: list[str] - - -class ListMetricsInfoResponse(common.BaseModel): - metrics_info: list[MetricInfo] - - -class AppInfo(common.BaseModel): - name: str - root_agent_name: str - description: str - language: Literal["yaml", "python"] - is_computer_use: bool = False - agents: Optional[dict[str, AgentInfo]] = None - - -class ListAppsResponse(common.BaseModel): - apps: list[AppInfo] - - -def _setup_telemetry( - otel_to_cloud: bool = False, - internal_exporters: Optional[list[SpanProcessor]] = None, -): - # TODO - remove the else branch here once maybe_set_otel_providers is no - # longer experimental. - if otel_to_cloud: - _setup_gcp_telemetry(internal_exporters=internal_exporters) - elif _otel_env_vars_enabled(): - _setup_telemetry_from_env(internal_exporters=internal_exporters) - else: - # Old logic - to be removed when above leaves experimental. - tracer_provider = TracerProvider() - if internal_exporters is not None: - for exporter in internal_exporters: - tracer_provider.add_span_processor(exporter) - trace.set_tracer_provider(tracer_provider=tracer_provider) - - -def _otel_env_vars_enabled() -> bool: - return any([ - os.getenv(endpoint_var) - for endpoint_var in [ - otel_env.OTEL_EXPORTER_OTLP_ENDPOINT, - otel_env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, - otel_env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT, - otel_env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, - ] - ]) - - -def _setup_gcp_telemetry( - internal_exporters: list[SpanProcessor] = None, -): - if typing.TYPE_CHECKING: - from ..telemetry.setup import OTelHooks - - otel_hooks_to_add: list[OTelHooks] = [] - - if internal_exporters: - from ..telemetry.setup import OTelHooks - - # Register ADK-specific exporters in trace provider. - otel_hooks_to_add.append(OTelHooks(span_processors=internal_exporters)) - - import google.auth - - from ..telemetry.google_cloud import get_gcp_exporters - from ..telemetry.google_cloud import get_gcp_resource - from ..telemetry.setup import maybe_set_otel_providers - - credentials, project_id = google.auth.default() - - otel_hooks_to_add.append( - get_gcp_exporters( - # TODO - use trace_to_cloud here as well once otel_to_cloud is no - # longer experimental. - enable_cloud_tracing=True, - # TODO - re-enable metrics once errors during shutdown are fixed. - enable_cloud_metrics=False, - enable_cloud_logging=True, - google_auth=(credentials, project_id), - ) - ) - otel_resource = get_gcp_resource(project_id) - - maybe_set_otel_providers( - otel_hooks_to_setup=otel_hooks_to_add, - otel_resource=otel_resource, - ) - _setup_instrumentation_lib_if_installed() - - -def _setup_telemetry_from_env( - internal_exporters: list[SpanProcessor] = None, -): - from ..telemetry.setup import maybe_set_otel_providers - - otel_hooks_to_add = [] - - if internal_exporters: - from ..telemetry.setup import OTelHooks - - # Register ADK-specific exporters in trace provider. - otel_hooks_to_add.append(OTelHooks(span_processors=internal_exporters)) - - maybe_set_otel_providers(otel_hooks_to_setup=otel_hooks_to_add) - _setup_instrumentation_lib_if_installed() - - -def _setup_instrumentation_lib_if_installed(): - # Set instrumentation to enable emitting OTel data from GenAISDK - # Currently the instrumentation lib is in extras dependencies, make sure to - # warn the user if it's not installed. - try: - from opentelemetry.instrumentation.google_genai import GoogleGenAiSdkInstrumentor - - GoogleGenAiSdkInstrumentor().instrument() - except ImportError: - logger.warning( - "Unable to import GoogleGenAiSdkInstrumentor - some" - " telemetry will be disabled. Make sure to install google-adk[otel-gcp]" - ) - - -class AdkWebServer: - """Helper class for setting up and running the ADK web server on FastAPI. - - You construct this class with all the Services required to run ADK agents and - can then call the get_fast_api_app method to get a FastAPI app instance that - can will use your provided service instances, static assets, and agent loader. - If you pass in a web_assets_dir, the static assets will be served under - /dev-ui in addition to the API endpoints created by default. - - You can add additional API endpoints by modifying the FastAPI app - instance returned by get_fast_api_app as this class exposes the agent runners - and most other bits of state retained during the lifetime of the server. - - Attributes: - agent_loader: An instance of BaseAgentLoader for loading agents. - session_service: An instance of BaseSessionService for managing sessions. - memory_service: An instance of BaseMemoryService for managing memory. - artifact_service: An instance of BaseArtifactService for managing - artifacts. - credential_service: An instance of BaseCredentialService for managing - credentials. - eval_sets_manager: An instance of EvalSetsManager for managing evaluation - sets. - eval_set_results_manager: An instance of EvalSetResultsManager for - managing evaluation set results. - agents_dir: Root directory containing subdirs for agents with those - containing resources (e.g. .env files, eval sets, etc.) for the agents. - extra_plugins: A list of fully qualified names of extra plugins to load. - logo_text: Text to display in the logo of the UI. - logo_image_url: URL of an image to display as logo of the UI. - runners_to_clean: Set of runner names marked for cleanup. - current_app_name_ref: A shared reference to the latest ran app name. - runner_dict: A dict of instantiated runners for each app. - """ - - def __init__( - self, - *, - agent_loader: BaseAgentLoader, - session_service: BaseSessionService, - memory_service: BaseMemoryService, - artifact_service: BaseArtifactService, - credential_service: BaseCredentialService, - eval_sets_manager: EvalSetsManager, - eval_set_results_manager: EvalSetResultsManager, - agents_dir: str, - extra_plugins: Optional[list[str]] = None, - logo_text: Optional[str] = None, - logo_image_url: Optional[str] = None, - url_prefix: Optional[str] = None, - auto_create_session: bool = False, - trigger_sources: Optional[list[str]] = None, - ): - self.agent_loader = agent_loader - self.session_service = session_service - self.memory_service = memory_service - self.artifact_service = artifact_service - self.credential_service = credential_service - self.eval_sets_manager = eval_sets_manager - self.eval_set_results_manager = eval_set_results_manager - self.agents_dir = agents_dir - self.extra_plugins = extra_plugins or [] - self.logo_text = logo_text - self.logo_image_url = logo_image_url - # Internal properties we want to allow being modified from callbacks. - self.runners_to_clean: set[str] = set() - self.current_app_name_ref: SharedValue[str] = SharedValue(value="") - self.runner_dict = {} - self.url_prefix = url_prefix - self.auto_create_session = auto_create_session - self.trigger_sources = trigger_sources - - async def get_runner_async(self, app_name: str) -> Runner: - """Returns the cached runner for the given app.""" - # Handle cleanup - if app_name in self.runners_to_clean: - self.runners_to_clean.remove(app_name) - runner = self.runner_dict.pop(app_name, None) - await cleanup.close_runners(list([runner])) - - # Return cached runner if exists - if app_name in self.runner_dict: - return self.runner_dict[app_name] - - # Create new runner - envs.load_dotenv_for_agent(os.path.basename(app_name), self.agents_dir) - agent_or_app = self.agent_loader.load_agent(app_name) - - # Instantiate extra plugins if configured - extra_plugins_instances = self._instantiate_extra_plugins() - - plugins_yaml_path = os.path.join(self.agents_dir, app_name, "plugins.yaml") - bq_analytics_config = None - if os.path.exists(plugins_yaml_path): - with open(plugins_yaml_path, "r", encoding="utf-8") as f: - plugins_config = yaml.safe_load(f) - if plugins_config and isinstance(plugins_config, dict): - bq_analytics_config = plugins_config.get("bigquery_agent_analytics") - - # All YAML agents are treated as visual builder agents. - is_visual_builder_agent = os.path.exists( - os.path.join(self.agents_dir, app_name, "root_agent.yaml") - ) - - if isinstance(agent_or_app, BaseAgent): - plugins = extra_plugins_instances - - # Handle BigQuery Analytics Plugin injection - if bq_analytics_config and all([ - bq_analytics_config.get("project_id"), - bq_analytics_config.get("dataset_id"), - bq_analytics_config.get("dataset_location"), - ]): - from ..plugins.bigquery_agent_analytics_plugin import BigQueryAgentAnalyticsPlugin - - plugins.append( - BigQueryAgentAnalyticsPlugin( - project_id=bq_analytics_config.get("project_id"), - dataset_id=bq_analytics_config.get("dataset_id"), - table_id=bq_analytics_config.get("table_id"), - location=bq_analytics_config.get("dataset_location"), - ) - ) - - agentic_app = App( - name=app_name, - root_agent=agent_or_app, - plugins=plugins, - ) - else: - # Combine existing plugins with extra plugins - agent_or_app.plugins = agent_or_app.plugins + extra_plugins_instances - agentic_app = agent_or_app - - # If the root agent was loaded from YAML, we treat it as being from Visual Builder - if is_visual_builder_agent: - object.__setattr__(agentic_app, "_is_visual_builder_app", True) - - runner = self._create_runner(agentic_app) - self.runner_dict[app_name] = runner - return runner - - def _get_root_agent(self, agent_or_app: BaseAgent | App) -> BaseAgent: - """Extract root agent from either a BaseAgent or App object.""" - if isinstance(agent_or_app, App): - return agent_or_app.root_agent - return agent_or_app - - def _create_runner(self, agentic_app: App) -> Runner: - """Create a runner with common services.""" - return Runner( - app=agentic_app, - artifact_service=self.artifact_service, - session_service=self.session_service, - memory_service=self.memory_service, - credential_service=self.credential_service, - auto_create_session=self.auto_create_session, - ) - - def _instantiate_extra_plugins(self) -> list[BasePlugin]: - """Instantiate extra plugins from the configured list. - - Returns: - List of instantiated BasePlugin objects. - """ - extra_plugins_instances = [] - for qualified_name in self.extra_plugins: - try: - plugin_obj = self._import_plugin_object(qualified_name) - if isinstance(plugin_obj, BasePlugin): - extra_plugins_instances.append(plugin_obj) - elif issubclass(plugin_obj, BasePlugin): - extra_plugins_instances.append(plugin_obj(name=qualified_name)) - except Exception as e: - logger.error("Failed to load plugin %s: %s", qualified_name, e) - return extra_plugins_instances - - def _import_plugin_object(self, qualified_name: str) -> Any: - """Import a plugin object (class or instance) from a fully qualified name. - - Args: - qualified_name: Fully qualified name (e.g., - 'my_package.my_plugin.MyPlugin') - - Returns: - The imported object, which can be either a class or an instance. - - Raises: - ImportError: If the module cannot be imported. - AttributeError: If the object doesn't exist in the module. - """ - module_name, obj_name = qualified_name.rsplit(".", 1) - module = importlib.import_module(module_name) - return getattr(module, obj_name) - - def _setup_runtime_config(self, web_assets_dir: str): - """Sets up the runtime config for the web server.""" - # Read existing runtime config file. - runtime_config_path = os.path.join( - web_assets_dir, "assets", "config", "runtime-config.json" - ) - runtime_config = {} - try: - with open(runtime_config_path, "r") as f: - runtime_config = json.load(f) - except FileNotFoundError: - logger.info( - "File not found: %s. A new runtime config file will be created.", - runtime_config_path, - ) - except json.JSONDecodeError: - logger.warning( - "Failed to decode JSON from %s. The file content will be" - " overwritten.", - runtime_config_path, - ) - runtime_config["backendUrl"] = self.url_prefix if self.url_prefix else "" - - # Set custom logo config. - if self.logo_text or self.logo_image_url: - if not self.logo_text or not self.logo_image_url: - raise ValueError( - "Both --logo-text and --logo-image-url must be defined when using" - " logo config." - ) - runtime_config["logo"] = { - "text": self.logo_text, - "imageUrl": self.logo_image_url, - } - elif "logo" in runtime_config: - del runtime_config["logo"] - - # Write the runtime config file. - try: - os.makedirs(os.path.dirname(runtime_config_path), exist_ok=True) - with open(runtime_config_path, "w") as f: - json.dump(runtime_config, f, indent=2) - f.write("\n") - except IOError as e: - logger.error( - "Failed to write runtime config file %s: %s", runtime_config_path, e - ) - - async def _create_session( - self, - *, - app_name: str, - user_id: str, - session_id: Optional[str] = None, - state: Optional[dict[str, Any]] = None, - ) -> Session: - try: - session = await self.session_service.create_session( - app_name=app_name, - user_id=user_id, - state=state, - session_id=session_id, - ) - logger.info("New session created: %s", session.id) - return session - except AlreadyExistsError as e: - raise HTTPException( - status_code=409, detail=f"Session already exists: {session_id}" - ) from e - except Exception as e: - logger.error( - "Internal server error during session creation: %s", e, exc_info=True - ) - raise HTTPException(status_code=500, detail=str(e)) from e - - def get_fast_api_app( - self, - lifespan: Optional[Lifespan[FastAPI]] = None, - allow_origins: Optional[list[str]] = None, - web_assets_dir: Optional[str] = None, - setup_observer: Callable[ - [Observer, "AdkWebServer"], None - ] = lambda o, s: None, - tear_down_observer: Callable[ - [Observer, "AdkWebServer"], None - ] = lambda o, s: None, - register_processors: Callable[[TracerProvider], None] = lambda o: None, - otel_to_cloud: bool = False, - with_ui: bool = False, - ): - """Creates a FastAPI app for the ADK web server. - - By default it'll just return a FastAPI instance with the API server - endpoints, - but if you specify a web_assets_dir, it'll also serve the static web assets - from that directory. - - Args: - lifespan: The lifespan of the FastAPI app. - allow_origins: The origins that are allowed to make cross-origin requests. - Entries can be literal origins (e.g., 'https://example.com') or regex - patterns prefixed with 'regex:' (e.g., - 'regex:https://.*\\.example\\.com'). - web_assets_dir: The directory containing the web assets to serve. - setup_observer: Callback for setting up the file system observer. - tear_down_observer: Callback for cleaning up the file system observer. - register_processors: Callback for additional Span processors to be added - to the TracerProvider. - otel_to_cloud: Whether to enable Cloud Trace and Cloud Logging - integrations. - - Returns: - A FastAPI app instance. - """ - # Properties we don't need to modify from callbacks - trace_dict = {} - session_trace_dict = {} - # Set up a file system watcher to detect changes in the agents directory. - observer = Observer() - setup_observer(observer, self) - - @asynccontextmanager - async def internal_lifespan(app: FastAPI): - try: - if lifespan: - async with lifespan(app) as lifespan_context: - yield lifespan_context - else: - yield - finally: - tear_down_observer(observer, self) - # Create tasks for all runner closures to run concurrently - await cleanup.close_runners(list(self.runner_dict.values())) - - memory_exporter = InMemoryExporter(session_trace_dict) - - _setup_telemetry( - otel_to_cloud=otel_to_cloud, - internal_exporters=[ - export_lib.SimpleSpanProcessor(ApiServerSpanExporter(trace_dict)), - export_lib.SimpleSpanProcessor(memory_exporter), - ], - ) - if web_assets_dir: - self._setup_runtime_config(web_assets_dir) - - # TODO - register_processors to be removed once --otel_to_cloud is no - # longer experimental. - tracer_provider = trace.get_tracer_provider() - register_processors(tracer_provider) - - # Run the FastAPI server. - app = FastAPI(lifespan=internal_lifespan) - - has_configured_allowed_origins = bool(allow_origins) - if allow_origins: - literal_origins, combined_regex = _parse_cors_origins(allow_origins) - compiled_origin_regex = ( - re.compile(combined_regex) if combined_regex is not None else None - ) - app.add_middleware( - CORSMiddleware, - allow_origins=literal_origins, - allow_origin_regex=combined_regex, - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) - else: - literal_origins = [] - compiled_origin_regex = None - - app.add_middleware( - _OriginCheckMiddleware, - has_configured_allowed_origins=has_configured_allowed_origins, - allowed_origins=literal_origins, - allowed_origin_regex=compiled_origin_regex, - ) - - @app.get("/health") - async def health() -> dict[str, str]: - return {"status": "ok"} - - @app.get("/version") - async def version() -> dict[str, str]: - return { - "version": __version__, - "language": "python", - "language_version": ( - f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}" - ), - } - - @app.get("/list-apps") - async def list_apps( - detailed: bool = Query( - default=False, description="Return detailed app information" - ) - ) -> list[str] | ListAppsResponse: - if detailed: - apps_info = self.agent_loader.list_agents_detailed() - return ListAppsResponse(apps=[AppInfo(**app) for app in apps_info]) - return self.agent_loader.list_agents() - - @experimental - @app.get("/apps/{app_name}/app-info", response_model_exclude_none=True) - async def get_adk_app_info(app_name: str) -> AppInfo: - """Returns the detailed info for a given ADK app.""" - agent_or_app = self.agent_loader.load_agent(app_name) - root_agent = self._get_root_agent(agent_or_app) - if isinstance(root_agent, LlmAgent): - return AppInfo( - name=app_name, - root_agent_name=root_agent.name, - description=root_agent.description, - language="python", - agents=get_agents_dict(root_agent), - ) - else: - raise HTTPException( - status_code=400, detail="Root agent is not an LlmAgent" - ) - - @app.get("/debug/trace/{event_id}", tags=[TAG_DEBUG]) - async def get_trace_dict(event_id: str) -> Any: - event_dict = trace_dict.get(event_id, None) - if event_dict is None: - raise HTTPException(status_code=404, detail="Trace not found") - return event_dict - - if web_assets_dir: - - @app.get("/dev/build_graph/{app_name}") - async def get_app_info(app_name: str) -> Any: - runner = await self.get_runner_async(app_name) - - if not runner.app: - raise HTTPException( - status_code=404, detail=f"App not found: {app_name}" - ) - - def serialize_agent(agent: BaseAgent) -> dict[str, Any]: - """Recursively serialize an agent, excluding non-serializable fields.""" - agent_dict = {} - - for field_name, field_info in agent.__class__.model_fields.items(): - # Skip non-serializable fields - if field_name in [ - "parent_agent", - "before_agent_callback", - "after_agent_callback", - "before_model_callback", - "after_model_callback", - "on_model_error_callback", - "before_tool_callback", - "after_tool_callback", - "on_tool_error_callback", - ]: - continue - - value = getattr(agent, field_name, None) - - # Handle sub_agents recursively - if field_name == "sub_agents" and value: - agent_dict[field_name] = [ - serialize_agent(sub_agent) for sub_agent in value - ] - elif value is None or field_name == "tools": - continue - else: - try: - if isinstance(value, (str, int, float, bool, list, dict)): - agent_dict[field_name] = value - elif hasattr(value, "model_dump"): - agent_dict[field_name] = value.model_dump( - mode="python", exclude_none=True - ) - else: - agent_dict[field_name] = str(value) - except Exception: - pass - - return agent_dict - - app_info = { - "name": runner.app.name, - "root_agent": serialize_agent(runner.app.root_agent), - } - - # Add optional fields if present - if runner.app.plugins: - app_info["plugins"] = [ - {"name": getattr(plugin, "name", type(plugin).__name__)} - for plugin in runner.app.plugins - ] - - if runner.app.context_cache_config: - try: - app_info["context_cache_config"] = ( - runner.app.context_cache_config.model_dump( - mode="python", exclude_none=True - ) - ) - except Exception: - pass - - if runner.app.resumability_config: - try: - app_info["resumability_config"] = ( - runner.app.resumability_config.model_dump( - mode="python", exclude_none=True - ) - ) - except Exception: - pass - - return app_info - - @app.get("/debug/trace/session/{session_id}", tags=[TAG_DEBUG]) - async def get_session_trace(session_id: str) -> Any: - spans = memory_exporter.get_finished_spans(session_id) - if not spans: - return [] - return [ - { - "name": s.name, - "span_id": s.context.span_id, - "trace_id": s.context.trace_id, - "start_time": s.start_time, - "end_time": s.end_time, - "attributes": dict(s.attributes), - "parent_span_id": s.parent.span_id if s.parent else None, - } - for s in spans - ] - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}", - response_model_exclude_none=True, - ) - async def get_session( - app_name: str, user_id: str, session_id: str - ) -> Session: - session = await self.session_service.get_session( - app_name=app_name, user_id=user_id, session_id=session_id - ) - if not session: - raise HTTPException(status_code=404, detail="Session not found") - self.current_app_name_ref.value = app_name - return session - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions", - response_model_exclude_none=True, - ) - async def list_sessions(app_name: str, user_id: str) -> list[Session]: - list_sessions_response = await self.session_service.list_sessions( - app_name=app_name, user_id=user_id - ) - return [ - session - for session in list_sessions_response.sessions - # Remove sessions that were generated as a part of Eval. - if not session.id.startswith(EVAL_SESSION_ID_PREFIX) - ] - - @deprecated( - "Please use create_session instead. This will be removed in future" - " releases." - ) - @app.post( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}", - response_model_exclude_none=True, - ) - async def create_session_with_id( - app_name: str, - user_id: str, - session_id: str, - state: Optional[dict[str, Any]] = None, - ) -> Session: - return await self._create_session( - app_name=app_name, - user_id=user_id, - state=state, - session_id=session_id, - ) - - @app.post( - "/apps/{app_name}/users/{user_id}/sessions", - response_model_exclude_none=True, - ) - async def create_session( - app_name: str, - user_id: str, - req: Optional[CreateSessionRequest] = None, - ) -> Session: - if not req: - return await self._create_session(app_name=app_name, user_id=user_id) - - session = await self._create_session( - app_name=app_name, - user_id=user_id, - state=req.state, - session_id=req.session_id, - ) - - if req.events: - for event in req.events: - await self.session_service.append_event(session=session, event=event) - - return session - - @app.delete("/apps/{app_name}/users/{user_id}/sessions/{session_id}") - async def delete_session( - app_name: str, user_id: str, session_id: str - ) -> None: - await self.session_service.delete_session( - app_name=app_name, user_id=user_id, session_id=session_id - ) - - @app.patch( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}", - response_model_exclude_none=True, - ) - async def update_session( - app_name: str, - user_id: str, - session_id: str, - req: UpdateSessionRequest, - ) -> Session: - """Updates session state without running the agent. - - Args: - app_name: The name of the application. - user_id: The ID of the user. - session_id: The ID of the session to update. - req: The patch request containing state changes. - - Returns: - The updated session. - - Raises: - HTTPException: If the session is not found. - """ - session = await self.session_service.get_session( - app_name=app_name, user_id=user_id, session_id=session_id - ) - if not session: - raise HTTPException(status_code=404, detail="Session not found") - - # Create an event to record the state change - import uuid - - from ..events.event import Event - from ..events.event import EventActions - - state_update_event = Event( - invocation_id="p-" + str(uuid.uuid4()), - author="user", - actions=EventActions(state_delta=req.state_delta), - ) - - # Append the event to the session - # This will automatically update the session state through __update_session_state - await self.session_service.append_event( - session=session, event=state_update_event - ) - - return session - - @app.post( - "/apps/{app_name}/eval-sets", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def create_eval_set( - app_name: str, create_eval_set_request: CreateEvalSetRequest - ) -> EvalSet: - try: - return self.eval_sets_manager.create_eval_set( - app_name=app_name, - eval_set_id=create_eval_set_request.eval_set.eval_set_id, - ) - except ValueError as ve: - raise HTTPException( - status_code=400, - detail=str(ve), - ) from ve - - # TODO - remove after migration - @deprecated( - "Please use create_eval_set instead. This will be removed in future" - " releases." - ) - @app.post( - "/apps/{app_name}/eval_sets/{eval_set_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def create_eval_set_legacy( - app_name: str, - eval_set_id: str, - ): - """Creates an eval set, given the id.""" - await create_eval_set( - app_name=app_name, - create_eval_set_request=CreateEvalSetRequest( - eval_set=EvalSet(eval_set_id=eval_set_id, eval_cases=[]) - ), - ) - - # TODO - remove after migration - @deprecated( - "Please use list_eval_sets instead. This will be removed in future" - " releases." - ) - @app.get( - "/apps/{app_name}/eval_sets", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_eval_sets_legacy(app_name: str) -> list[str]: - list_eval_sets_response = await list_eval_sets(app_name) - return list_eval_sets_response.eval_set_ids - - # TODO - remove after migration - @deprecated( - "Please use run_eval instead. This will be removed in future releases." - ) - @app.post( - "/apps/{app_name}/eval_sets/{eval_set_id}/run_eval", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def run_eval_legacy( - app_name: str, eval_set_id: str, req: RunEvalRequest - ) -> list[RunEvalResult]: - run_eval_response = await run_eval( - app_name=app_name, eval_set_id=eval_set_id, req=req - ) - return run_eval_response.run_eval_results - - # TODO - remove after migration - @deprecated( - "Please use get_eval_result instead. This will be removed in future" - " releases." - ) - @app.get( - "/apps/{app_name}/eval_results/{eval_result_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def get_eval_result_legacy( - app_name: str, - eval_result_id: str, - ) -> EvalSetResult: - try: - return self.eval_set_results_manager.get_eval_set_result( - app_name, eval_result_id - ) - except ValueError as ve: - raise HTTPException(status_code=404, detail=str(ve)) from ve - except ValidationError as ve: - raise HTTPException(status_code=500, detail=str(ve)) from ve - - # TODO - remove after migration - @deprecated( - "Please use list_eval_results instead. This will be removed in future" - " releases." - ) - @app.get( - "/apps/{app_name}/eval_results", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_eval_results_legacy(app_name: str) -> list[str]: - list_eval_results_response = await list_eval_results(app_name) - return list_eval_results_response.eval_result_ids - - @app.get( - "/apps/{app_name}/eval-sets", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_eval_sets(app_name: str) -> ListEvalSetsResponse: - """Lists all eval sets for the given app.""" - eval_sets = [] - try: - eval_sets = self.eval_sets_manager.list_eval_sets(app_name) - except NotFoundError as e: - logger.warning(e) - - return ListEvalSetsResponse(eval_set_ids=eval_sets) - - @app.post( - "/apps/{app_name}/eval-sets/{eval_set_id}/add-session", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - @app.post( - "/apps/{app_name}/eval_sets/{eval_set_id}/add_session", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def add_session_to_eval_set( - app_name: str, eval_set_id: str, req: AddSessionToEvalSetRequest - ): - # Get the session - session = await self.session_service.get_session( - app_name=app_name, user_id=req.user_id, session_id=req.session_id - ) - assert session, "Session not found." - - # Convert the session data to eval invocations - invocations = evals.convert_session_to_eval_invocations(session) - - # Populate the session with initial session state. - agent_or_app = self.agent_loader.load_agent(app_name) - root_agent = self._get_root_agent(agent_or_app) - initial_session_state = create_empty_state(root_agent) - - new_eval_case = EvalCase( - eval_id=req.eval_id, - conversation=invocations, - session_input=SessionInput( - app_name=app_name, - user_id=req.user_id, - state=initial_session_state, - ), - creation_timestamp=time.time(), - ) - - try: - self.eval_sets_manager.add_eval_case( - app_name, eval_set_id, new_eval_case - ) - except ValueError as ve: - raise HTTPException(status_code=400, detail=str(ve)) from ve - - @app.get( - "/apps/{app_name}/eval_sets/{eval_set_id}/evals", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_evals_in_eval_set( - app_name: str, - eval_set_id: str, - ) -> list[str]: - """Lists all evals in an eval set.""" - eval_set_data = self.eval_sets_manager.get_eval_set(app_name, eval_set_id) - - if not eval_set_data: - raise HTTPException( - status_code=400, detail=f"Eval set `{eval_set_id}` not found." - ) - - return sorted([x.eval_id for x in eval_set_data.eval_cases]) - - @app.get( - "/apps/{app_name}/eval-sets/{eval_set_id}/eval-cases/{eval_case_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - @app.get( - "/apps/{app_name}/eval_sets/{eval_set_id}/evals/{eval_case_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def get_eval( - app_name: str, eval_set_id: str, eval_case_id: str - ) -> EvalCase: - """Gets an eval case in an eval set.""" - eval_case_to_find = self.eval_sets_manager.get_eval_case( - app_name, eval_set_id, eval_case_id - ) - - if eval_case_to_find: - return eval_case_to_find - - raise HTTPException( - status_code=404, - detail=( - f"Eval set `{eval_set_id}` or Eval `{eval_case_id}` not found." - ), - ) - - @app.put( - "/apps/{app_name}/eval-sets/{eval_set_id}/eval-cases/{eval_case_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - @app.put( - "/apps/{app_name}/eval_sets/{eval_set_id}/evals/{eval_case_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def update_eval( - app_name: str, - eval_set_id: str, - eval_case_id: str, - updated_eval_case: EvalCase, - ): - if ( - updated_eval_case.eval_id - and updated_eval_case.eval_id != eval_case_id - ): - raise HTTPException( - status_code=400, - detail=( - "Eval id in EvalCase should match the eval id in the API route." - ), - ) - - # Overwrite the value. We are either overwriting the same value or an empty - # field. - updated_eval_case.eval_id = eval_case_id - try: - self.eval_sets_manager.update_eval_case( - app_name, eval_set_id, updated_eval_case - ) - except NotFoundError as nfe: - raise HTTPException(status_code=404, detail=str(nfe)) from nfe - - @app.delete( - "/apps/{app_name}/eval-sets/{eval_set_id}/eval-cases/{eval_case_id}", - tags=[TAG_EVALUATION], - ) - @app.delete( - "/apps/{app_name}/eval_sets/{eval_set_id}/evals/{eval_case_id}", - tags=[TAG_EVALUATION], - ) - async def delete_eval( - app_name: str, eval_set_id: str, eval_case_id: str - ) -> None: - try: - self.eval_sets_manager.delete_eval_case( - app_name, eval_set_id, eval_case_id - ) - except NotFoundError as nfe: - raise HTTPException(status_code=404, detail=str(nfe)) from nfe - - @app.post( - "/apps/{app_name}/eval-sets/{eval_set_id}/run", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def run_eval( - app_name: str, eval_set_id: str, req: RunEvalRequest - ) -> RunEvalResponse: - """Runs an eval given the details in the eval request.""" - # Create a mapping from eval set file to all the evals that needed to be - # run. - try: - from ..evaluation.local_eval_service import LocalEvalService - from .cli_eval import _collect_eval_results - from .cli_eval import _collect_inferences - - eval_set = self.eval_sets_manager.get_eval_set(app_name, eval_set_id) - - if not eval_set: - raise HTTPException( - status_code=400, detail=f"Eval set `{eval_set_id}` not found." - ) - - agent_or_app = self.agent_loader.load_agent(app_name) - root_agent = self._get_root_agent(agent_or_app) - - eval_case_results = [] - - eval_service = LocalEvalService( - root_agent=root_agent, - eval_sets_manager=self.eval_sets_manager, - eval_set_results_manager=self.eval_set_results_manager, - session_service=self.session_service, - artifact_service=self.artifact_service, - ) - inference_request = InferenceRequest( - app_name=app_name, - eval_set_id=eval_set.eval_set_id, - eval_case_ids=req.eval_case_ids or req.eval_ids, - inference_config=InferenceConfig(), - ) - inference_results = await _collect_inferences( - inference_requests=[inference_request], eval_service=eval_service - ) - - eval_case_results = await _collect_eval_results( - inference_results=inference_results, - eval_service=eval_service, - eval_metrics=req.eval_metrics, - ) - except ModuleNotFoundError as e: - logger.exception("%s", e) - raise HTTPException( - status_code=400, detail=MISSING_EVAL_DEPENDENCIES_MESSAGE - ) from e - - run_eval_results = [] - for eval_case_result in eval_case_results: - run_eval_results.append( - RunEvalResult( - eval_set_file=eval_case_result.eval_set_file, - eval_set_id=eval_set_id, - eval_id=eval_case_result.eval_id, - final_eval_status=eval_case_result.final_eval_status, - overall_eval_metric_results=eval_case_result.overall_eval_metric_results, - eval_metric_result_per_invocation=eval_case_result.eval_metric_result_per_invocation, - user_id=eval_case_result.user_id, - session_id=eval_case_result.session_id, - ) - ) - - return RunEvalResponse(run_eval_results=run_eval_results) - - @app.get( - "/apps/{app_name}/eval-results/{eval_result_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def get_eval_result( - app_name: str, - eval_result_id: str, - ) -> EvalResult: - """Gets the eval result for the given eval id.""" - try: - eval_set_result = self.eval_set_results_manager.get_eval_set_result( - app_name, eval_result_id - ) - return EvalResult(**eval_set_result.model_dump()) - except ValueError as ve: - raise HTTPException(status_code=404, detail=str(ve)) from ve - except ValidationError as ve: - raise HTTPException(status_code=500, detail=str(ve)) from ve - - @app.get( - "/apps/{app_name}/eval-results", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_eval_results(app_name: str) -> ListEvalResultsResponse: - """Lists all eval results for the given app.""" - eval_result_ids = self.eval_set_results_manager.list_eval_set_results( - app_name - ) - return ListEvalResultsResponse(eval_result_ids=eval_result_ids) - - @app.get( - "/apps/{app_name}/metrics-info", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_metrics_info(app_name: str) -> ListMetricsInfoResponse: - """Lists all eval metrics for the given app.""" - try: - from ..evaluation.metric_evaluator_registry import DEFAULT_METRIC_EVALUATOR_REGISTRY - - # Right now we ignore the app_name as eval metrics are not tied to the - # app_name, but they could be moving forward. - metrics_info = ( - DEFAULT_METRIC_EVALUATOR_REGISTRY.get_registered_metrics() - ) - return ListMetricsInfoResponse(metrics_info=metrics_info) - except ModuleNotFoundError as e: - logger.exception("%s\n%s", MISSING_EVAL_DEPENDENCIES_MESSAGE, e) - raise HTTPException( - status_code=400, detail=MISSING_EVAL_DEPENDENCIES_MESSAGE - ) from e - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}", - response_model_exclude_none=True, - ) - async def load_artifact( - app_name: str, - user_id: str, - session_id: str, - artifact_name: str, - version: Optional[int] = Query(None), - ) -> Optional[types.Part]: - artifact = await self.artifact_service.load_artifact( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=artifact_name, - version=version, - ) - if not artifact: - raise HTTPException(status_code=404, detail="Artifact not found") - return artifact - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/metadata", - response_model=list[ArtifactVersion], - response_model_exclude_none=True, - ) - async def list_artifact_versions_metadata( - app_name: str, - user_id: str, - session_id: str, - artifact_name: str, - ) -> list[ArtifactVersion]: - return await self.artifact_service.list_artifact_versions( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=artifact_name, - ) - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/{version_id}", - response_model_exclude_none=True, - ) - async def load_artifact_version( - app_name: str, - user_id: str, - session_id: str, - artifact_name: str, - version_id: int, - ) -> Optional[types.Part]: - artifact = await self.artifact_service.load_artifact( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=artifact_name, - version=version_id, - ) - if not artifact: - raise HTTPException(status_code=404, detail="Artifact not found") - return artifact - - @app.post( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts", - response_model=ArtifactVersion, - response_model_exclude_none=True, - ) - async def save_artifact( - app_name: str, - user_id: str, - session_id: str, - req: SaveArtifactRequest, - ) -> ArtifactVersion: - try: - version = await self.artifact_service.save_artifact( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=req.filename, - artifact=req.artifact, - custom_metadata=req.custom_metadata, - ) - except InputValidationError as ive: - raise HTTPException(status_code=400, detail=str(ive)) from ive - except Exception as exc: # pylint: disable=broad-exception-caught - logger.error( - "Internal error while saving artifact %s for app=%s user=%s" - " session=%s: %s", - req.filename, - app_name, - user_id, - session_id, - exc, - exc_info=True, - ) - raise HTTPException(status_code=500, detail=str(exc)) from exc - artifact_version = await self.artifact_service.get_artifact_version( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=req.filename, - version=version, - ) - if artifact_version is None: - raise HTTPException( - status_code=500, detail="Artifact metadata unavailable" - ) - return artifact_version - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/{version_id}/metadata", - response_model=ArtifactVersion, - response_model_exclude_none=True, - ) - async def get_artifact_version_metadata( - app_name: str, - user_id: str, - session_id: str, - artifact_name: str, - version_id: int, - ) -> ArtifactVersion: - artifact_version = await self.artifact_service.get_artifact_version( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=artifact_name, - version=version_id, - ) - if not artifact_version: - raise HTTPException( - status_code=404, detail="Artifact version not found" - ) - return artifact_version - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts", - response_model_exclude_none=True, - ) - async def list_artifact_names( - app_name: str, user_id: str, session_id: str - ) -> list[str]: - return await self.artifact_service.list_artifact_keys( - app_name=app_name, user_id=user_id, session_id=session_id - ) - - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions", - response_model_exclude_none=True, - ) - async def list_artifact_versions( - app_name: str, user_id: str, session_id: str, artifact_name: str - ) -> list[int]: - return await self.artifact_service.list_versions( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=artifact_name, - ) - - @app.delete( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}", - ) - async def delete_artifact( - app_name: str, user_id: str, session_id: str, artifact_name: str - ) -> None: - await self.artifact_service.delete_artifact( - app_name=app_name, - user_id=user_id, - session_id=session_id, - filename=artifact_name, - ) - - @app.patch("/apps/{app_name}/users/{user_id}/memory") - async def patch_memory( - app_name: str, user_id: str, update_memory_request: UpdateMemoryRequest - ) -> None: - """Adds all events from a given session to the memory service. - - Args: - app_name: The name of the application. - user_id: The ID of the user. - update_memory_request: The memory request for the update - - Raises: - HTTPException: If the memory service is not configured or the request - is invalid. - """ - if not self.memory_service: - raise HTTPException( - status_code=400, detail="Memory service is not configured." - ) - if ( - update_memory_request is None - or update_memory_request.session_id is None - ): - raise HTTPException( - status_code=400, detail="Update memory request is invalid." - ) - - session = await self.session_service.get_session( - app_name=app_name, - user_id=user_id, - session_id=update_memory_request.session_id, - ) - if not session: - raise HTTPException(status_code=404, detail="Session not found") - await self.memory_service.add_session_to_memory(session) - - def _set_telemetry_context_if_needed(runner: Runner): - """Helper to set contextvars for the current request task.""" - app = getattr(runner, "app", None) - from ..utils._telemetry_context import _is_visual_builder - - if app and getattr(app, "_is_visual_builder_app", False): - _is_visual_builder.set(True) - else: - _is_visual_builder.set(False) - - @app.post("/run", response_model_exclude_none=True) - async def run_agent(req: RunAgentRequest) -> list[Event]: - self.current_app_name_ref.value = req.app_name - runner = await self.get_runner_async(req.app_name) - _set_telemetry_context_if_needed(runner) - run_config = ( - RunConfig(custom_metadata=req.custom_metadata) - if req.custom_metadata - else None - ) - try: - async with Aclosing( - runner.run_async( - user_id=req.user_id, - session_id=req.session_id, - new_message=req.new_message, - state_delta=req.state_delta, - invocation_id=req.invocation_id, - run_config=run_config, - ) - ) as agen: - events = [event async for event in agen] - except SessionNotFoundError as e: - raise HTTPException(status_code=404, detail=str(e)) from e - logger.info("Generated %s events in agent run", len(events)) - logger.debug("Events generated: %s", events) - return events - - @app.post("/run_sse") - async def run_agent_sse(req: RunAgentRequest) -> StreamingResponse: - self.current_app_name_ref.value = req.app_name - stream_mode = StreamingMode.SSE if req.streaming else StreamingMode.NONE - runner = await self.get_runner_async(req.app_name) - _set_telemetry_context_if_needed(runner) - - # Validate session existence before starting the stream. - # We check directly here instead of eagerly advancing the - # runner's async generator with anext(), because splitting - # generator consumption across two asyncio Tasks (request - # handler vs StreamingResponse) breaks OpenTelemetry context - # detachment. - if not runner.auto_create_session: - session = await self.session_service.get_session( - app_name=req.app_name, - user_id=req.user_id, - session_id=req.session_id, - ) - if not session: - raise HTTPException( - status_code=404, - detail=f"Session not found: {req.session_id}", - ) - - # Convert the events to properly formatted SSE - async def event_generator(): - run_config = RunConfig( - streaming_mode=stream_mode, - custom_metadata=req.custom_metadata, - ) - async with Aclosing( - runner.run_async( - user_id=req.user_id, - session_id=req.session_id, - new_message=req.new_message, - state_delta=req.state_delta, - run_config=run_config, - invocation_id=req.invocation_id, - ) - ) as agen: - try: - async for event in agen: - # ADK Web renders artifacts from `actions.artifactDelta` - # during part processing *and* during action processing - # 1) the original event with `artifactDelta` cleared (content) - # 2) a content-less "action-only" event carrying `artifactDelta` - events_to_stream = [event] - if ( - not req.function_call_event_id - and event.actions.artifact_delta - and event.content - and event.content.parts - ): - content_event = event.model_copy(deep=True) - content_event.actions.artifact_delta = {} - artifact_event = event.model_copy(deep=True) - artifact_event.content = None - events_to_stream = [content_event, artifact_event] - - for event_to_stream in events_to_stream: - sse_event = event_to_stream.model_dump_json( - exclude_none=True, - by_alias=True, - ) - logger.debug( - "Generated event in agent run streaming: %s", sse_event - ) - yield f"data: {sse_event}\n\n" - except Exception as e: - logger.exception("Error in event_generator: %s", e) - yield f"data: {json.dumps({'error': str(e)})}\n\n" - - # Returns a streaming response with the proper media type for SSE - return StreamingResponse( - event_generator(), - media_type="text/event-stream", - ) - - @app.get( - "/dev/{app_name}/graph", - response_model_exclude_none=True, - tags=[TAG_DEBUG], - ) - async def get_app_graph_dot( - app_name: str, dark_mode: bool = False - ) -> GetEventGraphResult | dict: - """Returns the base agent graph in DOT format without any highlights. - - This endpoint allows the frontend to fetch the graph structure once - and compute highlights client-side for better performance. - - Args: - app_name: The name of the agent/app - dark_mode: Whether to use dark theme background color - """ - agent_or_app = self.agent_loader.load_agent(app_name) - root_agent = self._get_root_agent(agent_or_app) - - # Get graph with NO highlights (empty list) and specified theme - dot_graph = await agent_graph.get_agent_graph( - root_agent, [], dark_mode=dark_mode - ) - - if dot_graph and isinstance(dot_graph, graphviz.Digraph): - return GetEventGraphResult(dot_src=dot_graph.source) - else: - return {} - - # TODO: This endpoint can be removed once we update adk web to stop consuming it - @app.get( - "/apps/{app_name}/users/{user_id}/sessions/{session_id}/events/{event_id}/graph", - response_model_exclude_none=True, - tags=[TAG_DEBUG], - ) - async def get_event_graph( - app_name: str, user_id: str, session_id: str, event_id: str - ): - session = await self.session_service.get_session( - app_name=app_name, user_id=user_id, session_id=session_id - ) - session_events = session.events if session else [] - event = next((x for x in session_events if x.id == event_id), None) - if not event: - return {} - - function_calls = event.get_function_calls() - function_responses = event.get_function_responses() - agent_or_app = self.agent_loader.load_agent(app_name) - root_agent = self._get_root_agent(agent_or_app) - dot_graph = None - if function_calls: - function_call_highlights = [] - for function_call in function_calls: - from_name = event.author - to_name = function_call.name - function_call_highlights.append((from_name, to_name)) - dot_graph = await agent_graph.get_agent_graph( - root_agent, function_call_highlights - ) - elif function_responses: - function_responses_highlights = [] - for function_response in function_responses: - from_name = function_response.name - to_name = event.author - function_responses_highlights.append((from_name, to_name)) - dot_graph = await agent_graph.get_agent_graph( - root_agent, function_responses_highlights - ) - else: - from_name = event.author - to_name = "" - dot_graph = await agent_graph.get_agent_graph( - root_agent, [(from_name, to_name)] - ) - if dot_graph and isinstance(dot_graph, graphviz.Digraph): - return GetEventGraphResult(dot_src=dot_graph.source) - else: - return {} - - @app.websocket("/run_live") - async def run_agent_live( - websocket: WebSocket, - app_name: str, - user_id: str, - session_id: str, - modalities: List[Literal["TEXT", "AUDIO"]] = Query( - default=["AUDIO"] - ), # Only allows "TEXT" or "AUDIO" - proactive_audio: bool | None = Query(default=None), - enable_affective_dialog: bool | None = Query(default=None), - enable_session_resumption: bool | None = Query(default=None), - save_live_blob: bool = Query(default=False), - ) -> None: - ws_origin = websocket.headers.get("origin") - if ws_origin is not None and not _is_request_origin_allowed( - ws_origin, - websocket.scope, - literal_origins, - compiled_origin_regex, - has_configured_allowed_origins, - ): - await websocket.close(code=1008, reason="Origin not allowed") - return - - await websocket.accept() - self.current_app_name_ref.value = app_name - runner_for_context = await self.get_runner_async(app_name) - _set_telemetry_context_if_needed(runner_for_context) - - session = await self.session_service.get_session( - app_name=app_name, user_id=user_id, session_id=session_id - ) - if not session: - await websocket.close(code=1002, reason="Session not found") - return - - live_request_queue = LiveRequestQueue() - - async def forward_events(): - runner = await self.get_runner_async(app_name) - run_config = RunConfig( - response_modalities=modalities, - proactivity=( - types.ProactivityConfig(proactive_audio=proactive_audio) - if proactive_audio is not None - else None - ), - enable_affective_dialog=enable_affective_dialog, - session_resumption=( - types.SessionResumptionConfig( - transparent=enable_session_resumption - ) - if enable_session_resumption is not None - else None - ), - save_live_blob=save_live_blob, - ) - async with Aclosing( - runner.run_live( - session=session, - live_request_queue=live_request_queue, - run_config=run_config, - ) - ) as agen: - async for event in agen: - await websocket.send_text( - event.model_dump_json(exclude_none=True, by_alias=True) - ) - - async def process_messages(): - try: - while True: - data = await websocket.receive_text() - # Validate and send the received message to the live queue. - live_request_queue.send(LiveRequest.model_validate_json(data)) - except ValidationError as ve: - logger.error("Validation error in process_messages: %s", ve) - - # Run both tasks concurrently and cancel all if one fails. - tasks = [ - asyncio.create_task(forward_events()), - asyncio.create_task(process_messages()), - ] - done, pending = await asyncio.wait( - tasks, return_when=asyncio.FIRST_EXCEPTION - ) - try: - # This will re-raise any exception from the completed tasks. - for task in done: - task.result() - except WebSocketDisconnect: - # Disconnection could happen when receive or send text via websocket - logger.info("Client disconnected during live session.") - except Exception as e: - logger.exception("Error during live websocket communication: %s", e) - traceback.print_exc() - WEBSOCKET_INTERNAL_ERROR_CODE = 1011 - WEBSOCKET_MAX_BYTES_FOR_REASON = 123 - await websocket.close( - code=WEBSOCKET_INTERNAL_ERROR_CODE, - reason=str(e)[:WEBSOCKET_MAX_BYTES_FOR_REASON], - ) - finally: - for task in pending: - task.cancel() - - # Register /trigger/* endpoints when enabled. - if self.trigger_sources: - from .trigger_routes import TriggerRouter - - trigger_router = TriggerRouter(self, trigger_sources=self.trigger_sources) - trigger_router.register(app) - - if web_assets_dir: - import mimetypes - - mimetypes.add_type("application/javascript", ".js", True) - mimetypes.add_type("text/javascript", ".js", True) - - redirect_dev_ui_url = ( - self.url_prefix + "/dev-ui/" if self.url_prefix else "/dev-ui/" - ) - - @app.get("/dev-ui/config") - async def get_ui_config(): - return { - "logo_text": self.logo_text, - "logo_image_url": self.logo_image_url, - } - - @app.get("/") - async def redirect_root_to_dev_ui(): - return RedirectResponse(redirect_dev_ui_url) - - @app.get("/dev-ui") - async def redirect_dev_ui_add_slash(): - return RedirectResponse(redirect_dev_ui_url) - - app.mount( - "/dev-ui/", - StaticFiles(directory=web_assets_dir, html=True, follow_symlink=True), - name="static", - ) - - return app + pass diff --git a/src/google/adk/cli/agent_graph.py b/src/google/adk/cli/agent_graph.py index 84166c39d9..d1c940be55 100644 --- a/src/google/adk/cli/agent_graph.py +++ b/src/google/adk/cli/agent_graph.py @@ -55,6 +55,9 @@ async def build_graph( Returns: None """ + from ..workflow._base_node import START + from ..workflow._workflow import Workflow + dark_green = '#0F5223' light_green = '#69CB87' light_gray = '#cccccc' @@ -73,6 +76,8 @@ def get_node_name(tool_or_agent: Union[BaseAgent, BaseTool]): return tool_or_agent.name elif isinstance(tool_or_agent, BaseTool): return tool_or_agent.name + elif hasattr(tool_or_agent, 'name'): + return tool_or_agent.name else: raise ValueError(f'Unsupported tool type: {tool_or_agent}') @@ -90,6 +95,8 @@ def get_node_caption(tool_or_agent: Union[BaseAgent, BaseTool]): return '🤖 ' + tool_or_agent.name elif isinstance(tool_or_agent, BaseTool): return '🔧 ' + tool_or_agent.name + elif hasattr(tool_or_agent, 'name'): + return tool_or_agent.name else: logger.warning( 'Unsupported tool, type: %s, obj: %s', @@ -101,7 +108,6 @@ def get_node_caption(tool_or_agent: Union[BaseAgent, BaseTool]): def get_node_shape(tool_or_agent: Union[BaseAgent, BaseTool]): if isinstance(tool_or_agent, BaseAgent): return 'ellipse' - elif retrieval_tool_module_loaded and isinstance( tool_or_agent, BaseRetrievalTool ): @@ -110,6 +116,8 @@ def get_node_shape(tool_or_agent: Union[BaseAgent, BaseTool]): return 'box' elif isinstance(tool_or_agent, BaseTool): return 'box' + elif hasattr(tool_or_agent, 'name'): + return 'box' else: logger.warning( 'Unsupported tool, type: %s, obj: %s', @@ -118,8 +126,10 @@ def get_node_shape(tool_or_agent: Union[BaseAgent, BaseTool]): ) return 'cylinder' - def should_build_agent_cluster(tool_or_agent: Union[BaseAgent, BaseTool]): - if isinstance(tool_or_agent, BaseAgent): + def should_build_agent_cluster(tool_or_agent): + if isinstance(tool_or_agent, Workflow): + return True + elif isinstance(tool_or_agent, BaseAgent): if isinstance(tool_or_agent, SequentialAgent): return True elif isinstance(tool_or_agent, LoopAgent): @@ -137,11 +147,6 @@ def should_build_agent_cluster(tool_or_agent: Union[BaseAgent, BaseTool]): elif isinstance(tool_or_agent, BaseTool): return False else: - logger.warning( - 'Unsupported tool, type: %s, obj: %s', - type(tool_or_agent), - tool_or_agent, - ) return False async def build_cluster(child: graphviz.Digraph, agent: BaseAgent, name: str): @@ -188,6 +193,16 @@ async def build_cluster(child: graphviz.Digraph, agent: BaseAgent, name: str): await build_graph(child, sub_agent, highlight_pairs) if parent_agent: draw_edge(parent_agent.name, sub_agent.name) + elif isinstance(agent, Workflow) and agent._graph is not None: + for wf_node in agent._graph.nodes: + if wf_node.name == START.name: + continue + await build_graph(child, wf_node, highlight_pairs) + for edge in agent._graph.edges: + if edge.from_node.name == START.name: + continue + label = str(edge.route) if edge.route is not None else '' + draw_edge(edge.from_node.name, edge.to_node.name) else: for sub_agent in agent.sub_agents: await build_graph(child, sub_agent, highlight_pairs) @@ -228,7 +243,6 @@ async def draw_node(tool_or_agent: Union[BaseAgent, BaseTool]): return # if not in highlight, draw non-highlight node if as_cluster: - cluster = graphviz.Digraph( name='cluster_' + name ) # adding "cluster_" to the name makes the graph render as a cluster subgraph @@ -268,14 +282,15 @@ def draw_edge(from_name, to_name): graph.edge(from_name, to_name, arrowhead='none', color=light_gray) await draw_node(agent) - for sub_agent in agent.sub_agents: - await build_graph(graph, sub_agent, highlight_pairs, agent) - if not should_build_agent_cluster( - sub_agent - ) and not should_build_agent_cluster( - agent - ): # This is to avoid making a node for a Workflow Agent - draw_edge(agent.name, sub_agent.name) + if hasattr(agent, 'sub_agents'): + for sub_agent in agent.sub_agents: + await build_graph(graph, sub_agent, highlight_pairs, agent) + if not should_build_agent_cluster( + sub_agent + ) and not should_build_agent_cluster( + agent + ): # This is to avoid making a node for a Workflow Agent + draw_edge(agent.name, sub_agent.name) if isinstance(agent, LlmAgent): for tool in await agent.canonical_tools(): await draw_node(tool) diff --git a/src/google/adk/cli/agent_test_runner.py b/src/google/adk/cli/agent_test_runner.py new file mode 100644 index 0000000000..aca43111a9 --- /dev/null +++ b/src/google/adk/cli/agent_test_runner.py @@ -0,0 +1,900 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import json +import os +from pathlib import Path +from typing import Any +from typing import AsyncGenerator +from typing import Optional +from unittest import mock + +from google.adk.apps.app import App +from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService +from google.adk.cli.utils.agent_loader import AgentLoader +from google.adk.events.event import Event as AdkEvent +from google.adk.memory.in_memory_memory_service import InMemoryMemoryService +from google.adk.models.base_llm import BaseLlm +from google.adk.models.llm_request import LlmRequest +from google.adk.models.llm_response import LlmResponse +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.genai import types +from pydantic import alias_generators +import pytest + +EXCLUDED_EVENT_FIELDS = { + "id", + "timestamp", + "invocation_id", + "model_version", + "finish_reason", + "usage_metadata", + "avg_logprobs", + "cache_metadata", + "logprobs_result", + "citation_metadata", +} + + +# Read target folder from environment +def get_test_files( + target_folder: str | None = None, +) -> list[pytest.ParameterSet]: + """Returns list of (agent_dir, test_file_path) recursively.""" + folder = target_folder or os.environ.get("ADK_TEST_FOLDER") + if not folder: + return [] + target_dir = Path(folder) + if not target_dir.exists(): + return [] + + samples_dir = ( + Path(__file__).parent.parent.parent.parent.parent + / "contributing" + / "samples" + ) + + results = [] + for test_file in target_dir.rglob("tests/*.json"): + agent_dir = test_file.parent.parent + # Verify it looks like an agent directory + if ( + (agent_dir / "agent.py").exists() + or (agent_dir / "__init__.py").exists() + or (agent_dir / "root_agent.yaml").exists() + ): + try: + rel_dir = agent_dir.relative_to(samples_dir) + test_id = f"{rel_dir}/{test_file.name}" + except ValueError: + test_id = f"{agent_dir.name}/{test_file.name}" + + if test_file.stem.endswith("_xfail"): + results.append( + pytest.param( + agent_dir, test_file, id=test_id, marks=pytest.mark.xfail + ) + ) + else: + results.append(pytest.param(agent_dir, test_file, id=test_id)) + return results + + +class MockModel(BaseLlm): + model: str = "mock" + requests: list[LlmRequest] = [] + responses: list[LlmResponse] = [] + response_index: int = -1 + + @classmethod + def create(cls, contents: list[types.Content]): + llm_responses = [LlmResponse(content=content) for content in contents] + return cls(responses=llm_responses) + + @classmethod + def supported_models(cls) -> list[str]: + return ["mock"] + + async def generate_content_async( + self, llm_request: LlmRequest, stream: bool = False + ) -> AsyncGenerator[LlmResponse, None]: + self.response_index += 1 + self.requests.append(llm_request) + yield self.responses[self.response_index] + + +class InMemoryRunner: + + def __init__(self, root_agent=None, app=None): + if app: + self.app_name = app.name + self.runner = Runner( + app=app, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + ) + else: + self.app_name = "test_app" + self.runner = Runner( + app_name="test_app", + agent=root_agent, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + ) + self.session_id = None + + @property + def session(self): + if not self.session_id: + session = self.runner.session_service.create_session_sync( + app_name=self.app_name, user_id="test_user" + ) + self.session_id = session.id + return session + return self.runner.session_service.get_session_sync( + app_name=self.app_name, user_id="test_user", session_id=self.session_id + ) + + def run(self, new_message) -> list[AdkEvent]: + content = ( + new_message + if isinstance(new_message, types.Content) + else types.Content( + role="user", parts=[types.Part.from_text(text=new_message)] + ) + ) + return list( + self.runner.run( + user_id=self.session.user_id, + session_id=self.session.id, + new_message=content, + ) + ) + + +def normalize_events(events, is_json=False): + normalized = [] + for e in events: + if is_json: + d = dict(e) + for k in EXCLUDED_EVENT_FIELDS: + d.pop(k, None) + d.pop(alias_generators.to_camel(k), None) + d = {k: v for k, v in d.items() if v is not None} + else: + d = e.model_dump( + mode="json", + by_alias=True, + exclude=EXCLUDED_EVENT_FIELDS, + exclude_none=True, + ) + + if "content" in d and isinstance(d["content"], dict): + content = d["content"] + if "parts" in content and isinstance(content["parts"], list): + for part in content["parts"]: + if isinstance(part, dict) and "thoughtSignature" in part: + del part["thoughtSignature"] + + if "longRunningToolIds" in d: + if isinstance(d["longRunningToolIds"], list): + if not d["longRunningToolIds"]: + del d["longRunningToolIds"] + else: + d["longRunningToolIds"] = sorted(d["longRunningToolIds"]) + + if "actions" in d: + actions = d["actions"] + if isinstance(actions, dict): + # Remove empty dicts inside actions + for k in list(actions.keys()): + if actions[k] == {}: + del actions[k] + # If actions itself is now empty, remove it! + if not actions: + del d["actions"] + + actions = d.get("actions", {}) + state_delta = actions.get("stateDelta", {}) if actions else {} + if state_delta: + keys_to_remove = [k for k in state_delta if k.endswith("_join_state")] + for k in keys_to_remove: + del state_delta[k] + + normalized.append(d) + return normalized + + +def make_sort_key(d): + node_path = d.get("nodeInfo", {}).get("path", "") + author = d.get("author", "") + return (author, node_path, json.dumps(d, sort_keys=True)) + + +def _make_nodes_sequential(obj, visited=None): + if visited is None: + visited = set() + + if id(obj) in visited: + return + visited.add(id(obj)) + + from google.adk.workflow._parallel_worker import _ParallelWorker + from google.adk.workflow._workflow import Workflow + + if isinstance(obj, Workflow): + obj.max_concurrency = 1 + if obj.graph and obj.graph.nodes: + for node in obj.graph.nodes: + _make_nodes_sequential(node, visited) + elif isinstance(obj, _ParallelWorker): + obj.max_concurrency = 1 + if hasattr(obj, "_node"): + _make_nodes_sequential(obj._node, visited) + + +def _extract_user_content(event: dict) -> Optional[types.Content]: + """Extracts user content from an event dict and returns a types.Content object. + + Agent-emitted user-role events (e.g., task FRs synthesized by the Task + Delegation API wrapper) are skipped — those are produced by the agent + itself and carry a non-empty ``nodeInfo.path``. Re-feeding them to + ``runner.run`` would trigger extra LLM calls. + """ + if event.get("author") != "user": + return None + + # Real external user input has no node path; agent-emitted events do. + if event.get("nodeInfo", {}).get("path"): + return None + + content_dict = event.get("content", {}) + if not content_dict: + return None + + parts = content_dict.get("parts", []) + real_parts = [] + for p in parts: + if "functionResponse" in p: + fr = p["functionResponse"] + real_parts.append( + types.Part( + function_response=types.FunctionResponse( + id=fr.get("id"), + name=fr.get("name"), + response=fr.get("response"), + ) + ) + ) + elif "text" in p: + real_parts.append(types.Part(text=p["text"])) + elif "functionCall" in p: + fc = p["functionCall"] + real_parts.append( + types.Part( + function_call=types.FunctionCall( + id=fc.get("id"), + name=fc.get("name"), + args=fc.get("args"), + ) + ) + ) + + if real_parts: + return types.Content(role="user", parts=real_parts) + return None + + +def _remap_node_path(path: str, id_map: dict[str, str]) -> str: + """Rewrite ``@`` segments in a node path using ``id_map``. + + Path segments encode ``@``; when the run_id was an + LLM-generated FC id, it gets canonicalized to ``fc-N`` via ``id_map``. + Segments without ``@`` and ids not in ``id_map`` pass through unchanged. + """ + segments = [] + for seg in path.split("/"): + if "@" in seg: + name, rid = seg.split("@", 1) + if rid in id_map: + seg = f"{name}@{id_map[rid]}" + segments.append(seg) + return "/".join(segments) + + +def _normalize_ids(events: list[AdkEvent]) -> list[AdkEvent]: + """Filters partial events and normalizes event, function call, and response IDs.""" + events = [e for e in events if not getattr(e, "partial", False)] + + # Re-assign sequential event IDs + for i, e in enumerate(events, 1): + e.id = f"e-{i}" + + # Post-process all events to inject deterministic function IDs + final_fc_counter = 0 + final_orig_to_new_id = {} + for e in events: + for fc in e.get_function_calls(): + orig_id = fc.id + final_fc_counter += 1 + new_id = f"fc-{final_fc_counter}" + final_orig_to_new_id[orig_id] = new_id + fc.id = new_id + if e.long_running_tool_ids: + e.long_running_tool_ids = { + new_id if tid == orig_id else tid for tid in e.long_running_tool_ids + } + if fc.args: + for k, v in fc.args.items(): + if v == orig_id: + fc.args[k] = new_id + + # Pass 2: Update actions and user responses in all events + call_name_to_ids = {} + for e in events: + for fc in e.get_function_calls(): + call_name_to_ids.setdefault(fc.name, []).append(fc.id) + + if getattr(e, "branch", None) and e.branch.startswith("task:"): + parts = e.branch.split(":") + if len(parts) > 1: + fc_id = parts[1] + if fc_id in final_orig_to_new_id: + e.branch = f"task:{final_orig_to_new_id[fc_id]}" + + # Task wrappers stamp isolation_scope with the dispatching FC's + # id (random at run time) and ``node_info.path`` encodes + # ``@`` for the same id — remap both. + if e.isolation_scope in final_orig_to_new_id: + e.isolation_scope = final_orig_to_new_id[e.isolation_scope] + if e.node_info.path: + e.node_info.path = _remap_node_path( + e.node_info.path, final_orig_to_new_id + ) + if e.node_info.output_for: + e.node_info.output_for = [ + _remap_node_path(pth, final_orig_to_new_id) + for pth in e.node_info.output_for + ] + + if e.content and e.content.parts: + for part in e.content.parts: + if part.function_response: + name = part.function_response.name + if name in call_name_to_ids and call_name_to_ids[name]: + part.function_response.id = call_name_to_ids[name].pop(0) + elif part.function_response.id in final_orig_to_new_id: + part.function_response.id = final_orig_to_new_id[ + part.function_response.id + ] + # Tool-confirmation FCs nest the original FC's id inside their + # args; remap so the confirmation event aligns with the + # canonical fc-N id of the call it confirms. + if part.function_call and part.function_call.args: + _remap_ids_in_args(part.function_call.args, final_orig_to_new_id) + + # actions.requested_tool_confirmations is keyed by the FC id of the + # tool call awaiting confirmation; remap the keys to canonical ids. + if e.actions and e.actions.requested_tool_confirmations: + e.actions.requested_tool_confirmations = { + final_orig_to_new_id.get(k, k): v + for k, v in e.actions.requested_tool_confirmations.items() + } + + return events + + +def _remap_ids_in_args(value: Any, id_map: dict[str, str]) -> None: + """Walk a FC ``args`` value and remap any ``id`` field that names an FC. + + Tool-confirmation FCs (``adk_request_confirmation``) carry the + original FC as ``args.originalFunctionCall``; its ``id`` needs to be + remapped to the canonical ``fc-N`` value just like the top-level FC id. + """ + if isinstance(value, dict): + for k, v in list(value.items()): + if k == "id" and isinstance(v, str) and v in id_map: + value[k] = id_map[v] + else: + _remap_ids_in_args(v, id_map) + elif isinstance(value, list): + for item in value: + _remap_ids_in_args(item, id_map) + + +@pytest.mark.parametrize( + "agent_dir, test_file", + get_test_files(), +) +def test_agent_replay(agent_dir, test_file, monkeypatch): + # Add agent_dir.parent to sys.path so relative imports work + import sys + + sys_path_saved = list(sys.path) + sys.path.insert(0, str(agent_dir.parent)) + + try: + import random + + random.seed(42) + + loader = AgentLoader(str(agent_dir.parent)) + loader.remove_agent_from_cache(agent_dir.name) + agent_or_app = loader.load_agent(agent_dir.name) + + root_agent = ( + agent_or_app.root_agent + if isinstance(agent_or_app, App) + else agent_or_app + ) + _make_nodes_sequential(root_agent) + + with open(test_file, "r") as f: + session_data = json.load(f) + + events_data = session_data.get("events", []) + if not events_data: + pytest.skip(f"No events in {test_file}") + + first_event = events_data[0] + user_message = "" + if first_event.get("author") == "user": + parts = first_event.get("content", {}).get("parts", []) + if parts and "text" in parts[0]: + user_message = parts[0]["text"] + + if not user_message: + pytest.skip(f"Could not find user message in {test_file}") + + expected_events = events_data[1:] + + import re + + parallel_pattern = re.compile(r"^(.+)__(\d+)$") + + all_responses = [] + last_was_set_model_response = False + for ev in expected_events: + if "content" in ev: + content_dict = ev["content"] + role = content_dict.get("role") + + if role == "user": + parts = content_dict.get("parts", []) + for part in parts: + if "functionResponse" in part: + func_resp = part["functionResponse"] + if func_resp.get("name") == "set_model_response": + last_was_set_model_response = True + + elif role == "model": + if last_was_set_model_response: + last_was_set_model_response = False + continue + + try: + content_obj = types.Content.model_validate(content_dict) + all_responses.append( + {"author": ev.get("author", ""), "content": content_obj} + ) + except Exception: + pass + + mock_responses = [] + current_parallel_base = None + current_parallel_items = [] + + for resp in all_responses: + match = parallel_pattern.match(resp["author"]) + if match: + base_name, index = match.groups() + index = int(index) + + if current_parallel_base and current_parallel_base != base_name: + # Flush previous parallel group + current_parallel_items.sort(key=lambda x: x[0]) + mock_responses.extend([x[1] for x in current_parallel_items]) + current_parallel_items = [] + + current_parallel_base = base_name + current_parallel_items.append((index, resp["content"])) + else: + if current_parallel_base: + # Flush previous parallel group + current_parallel_items.sort(key=lambda x: x[0]) + mock_responses.extend([x[1] for x in current_parallel_items]) + current_parallel_items = [] + current_parallel_base = None + + mock_responses.append(resp["content"]) + + # Flush last group + if current_parallel_base: + current_parallel_items.sort(key=lambda x: x[0]) + mock_responses.extend([x[1] for x in current_parallel_items]) + + if mock_responses: + mock_model = MockModel.create(contents=mock_responses) + + async def mock_gen_async(instance, llm_request, stream=False): + async for resp in mock_model.generate_content_async( + llm_request, stream + ): + yield resp + + from google.adk.models.base_llm import BaseLlm + from google.adk.models.google_llm import Gemini + + monkeypatch.setattr(BaseLlm, "generate_content_async", mock_gen_async) + monkeypatch.setattr(Gemini, "generate_content_async", mock_gen_async) + + # Make RequestInput IDs deterministic during replay as well + fc_counter = 0 + + def get_next_fc_id(): + nonlocal fc_counter + fc_counter += 1 + return f"fc-{fc_counter}" + + runner = ( + InMemoryRunner(app=agent_or_app) + if isinstance(agent_or_app, App) + else InMemoryRunner(root_agent=agent_or_app) + ) + + # Extract all function call IDs from old events + old_fc_ids = [] + for ev in events_data: + content = ev.get("content", {}) + parts = content.get("parts", []) if isinstance(content, dict) else [] + for p in parts: + if isinstance(p, dict) and "functionCall" in p: + fc = p["functionCall"] + if isinstance(fc, dict) and "id" in fc: + old_fc_ids.append(fc["id"]) + + orig_to_new_id = {} + fc_counter = 0 + mapping_counter = 0 + + actual_events = [] + import random + + mocks_data = session_data.get("mocks", {}) + if mocks_data: + if "random.random" in mocks_data: + random_values = list(mocks_data["random.random"]) + + def mock_random(): + if random_values: + return random_values.pop(0) + return 0.8 + + monkeypatch.setattr(random, "random", mock_random) + + if "random.randint" in mocks_data: + randint_values = list(mocks_data["random.randint"]) + + def mock_randint(a, b): + if randint_values: + return randint_values.pop(0) + return b + + monkeypatch.setattr(random, "randint", mock_randint) + else: + random.seed(42) + first_run_events = runner.run(user_message) + + # Post-process events to inject deterministic function IDs + for e in first_run_events: + for fc in e.get_function_calls(): + # Build mapping from old IDs to new agent IDs + if mapping_counter < len(old_fc_ids): + old_id = old_fc_ids[mapping_counter] + orig_to_new_id[old_id] = fc.id + mapping_counter += 1 + + actual_events.extend(first_run_events) + + for event in events_data[1:]: + if event.get("author") == "user": + content = _extract_user_content(event) + if content: + # Update function response IDs if mapped + if content.parts: + for part in content.parts: + if ( + part.function_response + and part.function_response.id in orig_to_new_id + ): + part.function_response.id = orig_to_new_id[ + part.function_response.id + ] + + actual_events.append( + AdkEvent( + author="user", + content=content, + ) + ) + next_run_events = runner.run(content) + + # Post-process events to inject deterministic function IDs + for e in next_run_events: + for fc in e.get_function_calls(): + # Build mapping from old IDs to new agent IDs + if mapping_counter < len(old_fc_ids): + old_id = old_fc_ids[mapping_counter] + orig_to_new_id[old_id] = fc.id + mapping_counter += 1 + + actual_events.extend(next_run_events) + + actual_events = _normalize_ids(actual_events) + + actual_dicts = normalize_events(actual_events, is_json=False) + expected_dicts = normalize_events(expected_events, is_json=True) + + actual_dicts.sort(key=make_sort_key) + expected_dicts.sort(key=make_sort_key) + + assert actual_dicts == expected_dicts + finally: + sys.path = sys_path_saved + + +def rebuild_tests(path: str): + """Discovers test files and rebuilds them by running the agent live.""" + import json + import sys + import time + + from google.adk.apps.app import App + from google.adk.events.event import Event as AdkEvent + from google.genai import types + + path_obj = Path(path) + if path_obj.is_dir(): + folder = path + expected_name = None + else: + folder = str(path_obj.parent.parent) + expected_name = path_obj.name + + test_files = get_test_files(folder) + if not test_files: + print(f"No test files found in {folder}") + return + + for item in test_files: + agent_dir, test_file = item.values + if expected_name and test_file.name != expected_name: + continue + print(f"Rebuilding {test_file}...") + + # Add agent_dir.parent to sys.path so relative imports work + sys_path_saved = list(sys.path) + sys.path.insert(0, str(agent_dir.parent)) + + try: + import random + + loader = AgentLoader(str(agent_dir.parent)) + loader.remove_agent_from_cache(agent_dir.name) + agent_or_app = loader.load_agent(agent_dir.name) + + root_agent = ( + agent_or_app.root_agent + if isinstance(agent_or_app, App) + else agent_or_app + ) + _make_nodes_sequential(root_agent) + + with open(test_file, "r") as f: + session_data = json.load(f) + + events_data = session_data.get("events", []) + if not events_data: + print(f"No events in {test_file}, skipping.") + continue + + # Extract user messages + user_messages = [] + for event in events_data: + content = _extract_user_content(event) + if content: + user_messages.append(content) + + if not user_messages: + print(f"No user messages found in {test_file}, skipping.") + continue + + runner = ( + InMemoryRunner(app=agent_or_app) + if isinstance(agent_or_app, App) + else InMemoryRunner(root_agent=agent_or_app) + ) + + new_events = [] + inv_counter = 1 + + def mock_inv_id(): + nonlocal inv_counter + res = f"i-{inv_counter}" + inv_counter += 1 + return res + + ev_counter = 1 + + def mock_ev_id(): + nonlocal ev_counter + res = f"e-{ev_counter}" + ev_counter += 1 + return res + + fc_counter = 0 + orig_to_new_id = {} + + # Extract all function call IDs and response IDs from old events + old_fc_ids = [] + old_fr_ids = [] + for ev in events_data: + content = ev.get("content", {}) + parts = content.get("parts", []) if isinstance(content, dict) else [] + for p in parts: + if isinstance(p, dict): + if "functionCall" in p: + fc = p["functionCall"] + if isinstance(fc, dict) and "id" in fc: + old_fc_ids.append(fc["id"]) + elif "functionResponse" in p: + fr = p["functionResponse"] + if isinstance(fr, dict) and "id" in fr: + old_fr_ids.append(fr["id"]) + + def get_next_fc_id(): + nonlocal fc_counter + fc_counter += 1 + new_id = f"fc-{fc_counter}" + if fc_counter <= len(old_fc_ids): + orig_id = old_fc_ids[fc_counter - 1] + orig_to_new_id[orig_id] = new_id + if fc_counter <= len(old_fr_ids): + orig_fr_id = old_fr_ids[fc_counter - 1] + orig_to_new_id[orig_fr_id] = new_id + return new_id + + with ( + mock.patch( + "google.adk.runners.new_invocation_context_id", + side_effect=mock_inv_id, + ), + mock.patch( + "google.adk.events.event.Event.new_id", side_effect=mock_ev_id + ), + mock.patch( + "google.adk.flows.llm_flows.functions.generate_client_function_call_id", + side_effect=get_next_fc_id, + ), + mock.patch.dict(os.environ, {"PYTEST_CURRENT_TEST": "rebuild"}), + ): + random.seed(42) + for msg in user_messages: + + # Update function response IDs if mapped + if msg.parts: + for part in msg.parts: + if ( + part.function_response + and part.function_response.id in orig_to_new_id + ): + part.function_response.id = orig_to_new_id[ + part.function_response.id + ] + + # Create user event + user_ev = AdkEvent( + author="user", + content=msg, + ) + + run_events = runner.run(msg) + + # Build mapping from old IDs to new agent IDs + for e in run_events: + for fc in e.get_function_calls(): + if fc_counter < len(old_fc_ids): + old_id = old_fc_ids[fc_counter] + orig_to_new_id[old_id] = fc.id + fc_counter += 1 + + # Set invocation_id from runner's output if available + if run_events: + user_ev.invocation_id = run_events[0].invocation_id + + new_events.append(user_ev) + new_events.extend(run_events) + + new_events = _normalize_ids(new_events) + + # Convert to dicts + # Also exclude timestamp to make it deterministic + new_events_dicts = [ + e.model_dump( + mode="json", + by_alias=True, + exclude_none=True, + exclude={ + "timestamp", + "usage_metadata", + "model_version", + "avg_logprobs", + "cache_metadata", + "logprobs_result", + "citation_metadata", + }, + ) + for e in new_events + ] + + # Clean up thoughtSignature if present + for ev in new_events_dicts: + if "content" in ev and isinstance(ev["content"], dict): + content = ev["content"] + if "parts" in content and isinstance(content["parts"], list): + for part in content["parts"]: + if isinstance(part, dict) and "thoughtSignature" in part: + del part["thoughtSignature"] + + # Clean up empty actions items and actions itself if empty + for ev in new_events_dicts: + if "actions" in ev: + actions = ev["actions"] + ev["actions"] = { + k: v + for k, v in actions.items() + if not (isinstance(v, dict) and not v) + } + if not ev["actions"]: + del ev["actions"] + + # Update session data + session_data["events"] = new_events_dicts + session_data.pop("lastUpdateTime", None) + + # Write back to file + with open(test_file, "w") as f: + json.dump(session_data, f, indent=2, sort_keys=True) + f.write("\n") + + print(f"Successfully rebuilt {test_file}") + + except Exception as e: + print(f"Error rebuilding {test_file}: {e}") + finally: + sys.path = sys_path_saved + + +if __name__ == "__main__": + import sys + + if len(sys.argv) > 1: + rebuild_tests(sys.argv[1]) + else: + print("Usage: python agent_test_runner.py ") diff --git a/src/google/adk/cli/api_server.py b/src/google/adk/cli/api_server.py new file mode 100644 index 0000000000..6ad354a344 --- /dev/null +++ b/src/google/adk/cli/api_server.py @@ -0,0 +1,1677 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Api server with all production ADK endpoints. +""" + +from __future__ import annotations + +import asyncio +from contextlib import asynccontextmanager +import importlib +import json +import logging +import os +import re +import sys +import time +import traceback +import typing +from typing import Any +from typing import Callable +from typing import List +from typing import Literal +from typing import Optional + +from fastapi import FastAPI +from fastapi import HTTPException +from fastapi import Query +from fastapi import Request +from fastapi import Response +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import RedirectResponse +from fastapi.responses import StreamingResponse +from fastapi.staticfiles import StaticFiles +from fastapi.websockets import WebSocket +from fastapi.websockets import WebSocketDisconnect +from google.genai import types +from opentelemetry import trace +import opentelemetry.sdk.environment_variables as otel_env +from opentelemetry.sdk.trace import export as export_lib +from opentelemetry.sdk.trace import ReadableSpan +from opentelemetry.sdk.trace import SpanProcessor +from opentelemetry.sdk.trace import TracerProvider +from pydantic import Field +from pydantic import ValidationError +from starlette.types import Lifespan +from typing_extensions import deprecated +from typing_extensions import override +from watchdog.observers import Observer +import yaml + +from ..agents.base_agent import BaseAgent +from ..agents.live_request_queue import LiveRequest +from ..agents.live_request_queue import LiveRequestQueue +from ..agents.llm_agent import LlmAgent +from ..agents.run_config import RunConfig +from ..agents.run_config import StreamingMode +from ..apps.app import App +from ..artifacts.base_artifact_service import ArtifactVersion +from ..artifacts.base_artifact_service import BaseArtifactService +from ..auth.credential_service.base_credential_service import BaseCredentialService +from ..errors.already_exists_error import AlreadyExistsError +from ..errors.input_validation_error import InputValidationError +from ..errors.session_not_found_error import SessionNotFoundError +from ..events.event import Event +from ..memory.base_memory_service import BaseMemoryService +from ..plugins.base_plugin import BasePlugin +from ..runners import Runner +from ..sessions.base_session_service import BaseSessionService +from ..sessions.session import Session +from ..utils.agent_info import AgentInfo +from ..utils.agent_info import get_agents_dict +from ..utils.context_utils import Aclosing +from ..utils.feature_decorator import experimental +from ..version import __version__ +from .cli_eval import EVAL_SESSION_ID_PREFIX +from .utils import cleanup +from .utils import common +from .utils import envs +from .utils.base_agent_loader import BaseAgentLoader +from .utils.shared_value import SharedValue + +logger = logging.getLogger("google_adk." + __name__) + +_REGEX_PREFIX = "regex:" + + +def _parse_cors_origins( + allow_origins: list[str], +) -> tuple[list[str], Optional[str]]: + """Parse allow_origins into literal origins and a combined regex pattern. + + Args: + allow_origins: List of origin strings. Entries prefixed with 'regex:' are + treated as regex patterns; all others are treated as literal origins. + + Returns: + A tuple of (literal_origins, combined_regex) where combined_regex is None + if no regex patterns were provided, or a single pattern joining all regex + patterns with '|'. + """ + literal_origins = [] + regex_patterns = [] + for origin in allow_origins: + if origin.startswith(_REGEX_PREFIX): + pattern = origin[len(_REGEX_PREFIX) :] + if pattern: + regex_patterns.append(pattern) + else: + literal_origins.append(origin) + + combined_regex = "|".join(regex_patterns) if regex_patterns else None + return literal_origins, combined_regex + + +def _is_origin_allowed( + origin: str, + allowed_literal_origins: list[str], + allowed_origin_regex: Optional[re.Pattern[str]], +) -> bool: + """Check whether the given origin matches the allowed origins.""" + if "*" in allowed_literal_origins: + return True + if origin in allowed_literal_origins: + return True + if allowed_origin_regex is not None: + return allowed_origin_regex.fullmatch(origin) is not None + return False + + +def _normalize_origin_scheme(scheme: str) -> str: + """Normalize request schemes to the browser Origin scheme space.""" + if scheme == "ws": + return "http" + if scheme == "wss": + return "https" + return scheme + + +def _strip_optional_quotes(value: str) -> str: + """Strip a single pair of wrapping quotes from a header value.""" + if len(value) >= 2 and value[0] == '"' and value[-1] == '"': + return value[1:-1] + return value + + +def _get_scope_header( + scope: dict[str, Any], header_name: bytes +) -> Optional[str]: + """Return the first matching header value from an ASGI scope.""" + for candidate_name, candidate_value in scope.get("headers", []): + if candidate_name == header_name: + return candidate_value.decode("latin-1").split(",", 1)[0].strip() + return None + + +def _get_request_origin(scope: dict[str, Any]) -> Optional[str]: + """Compute the effective origin for the current HTTP/WebSocket request.""" + forwarded = _get_scope_header(scope, b"forwarded") + if forwarded is not None: + proto = None + host = None + for element in forwarded.split(",", 1)[0].split(";"): + if "=" not in element: + continue + name, value = element.split("=", 1) + if name.strip().lower() == "proto": + proto = _strip_optional_quotes(value.strip()) + elif name.strip().lower() == "host": + host = _strip_optional_quotes(value.strip()) + if proto is not None and host is not None: + return f"{_normalize_origin_scheme(proto)}://{host}" + + host = _get_scope_header(scope, b"x-forwarded-host") + if host is None: + host = _get_scope_header(scope, b"host") + if host is None: + return None + + proto = _get_scope_header(scope, b"x-forwarded-proto") + if proto is None: + proto = scope.get("scheme", "http") + return f"{_normalize_origin_scheme(proto)}://{host}" + + +def _is_request_origin_allowed( + origin: str, + scope: dict[str, Any], + allowed_literal_origins: list[str], + allowed_origin_regex: Optional[re.Pattern[str]], + has_configured_allowed_origins: bool, +) -> bool: + """Validate an Origin header against explicit config or same-origin.""" + if has_configured_allowed_origins and _is_origin_allowed( + origin, allowed_literal_origins, allowed_origin_regex + ): + return True + + request_origin = _get_request_origin(scope) + if request_origin is None: + return False + return origin == request_origin + + +_SAFE_HTTP_METHODS = frozenset({"GET", "HEAD", "OPTIONS"}) + + +class _OriginCheckMiddleware: + """ASGI middleware that blocks cross-origin state-changing requests.""" + + def __init__( + self, + app: Any, + has_configured_allowed_origins: bool, + allowed_origins: list[str], + allowed_origin_regex: Optional[re.Pattern[str]], + ) -> None: + self._app = app + self._has_configured_allowed_origins = has_configured_allowed_origins + self._allowed_origins = allowed_origins + self._allowed_origin_regex = allowed_origin_regex + + async def __call__( + self, + scope: dict[str, Any], + receive: Any, + send: Any, + ) -> None: + if scope["type"] != "http": + await self._app(scope, receive, send) + return + + method = scope.get("method", "GET") + if method in _SAFE_HTTP_METHODS: + await self._app(scope, receive, send) + return + + origin = _get_scope_header(scope, b"origin") + if origin is None: + await self._app(scope, receive, send) + return + + if _is_request_origin_allowed( + origin, + scope, + self._allowed_origins, + self._allowed_origin_regex, + self._has_configured_allowed_origins, + ): + await self._app(scope, receive, send) + return + + response_body = b"Forbidden: origin not allowed" + await send({ + "type": "http.response.start", + "status": 403, + "headers": [ + (b"content-type", b"text/plain"), + (b"content-length", str(len(response_body)).encode()), + ], + }) + await send({ + "type": "http.response.body", + "body": response_body, + }) + + +class _DefaultAppRewriteMiddleware: + """ASGI middleware that rewrites URLs to inject default app name if set and missing.""" + + _PRODUCTION_PATH_PATTERNS = [ + re.compile(r"^/users/"), + re.compile(r"^/app-info$"), + re.compile(r"^/trigger/"), + ] + + def __init__(self, app: Any, default_app_name: Optional[str] = None) -> None: + self._app = app + self._default_app_name = default_app_name + + async def __call__( + self, + scope: dict[str, Any], + receive: Any, + send: Any, + ) -> None: + if scope["type"] in ("http", "websocket"): + if self._default_app_name: + path: str = scope.get("path", "") + + if any( + pattern.match(path) for pattern in self._PRODUCTION_PATH_PATTERNS + ): + scope["path"] = f"/apps/{self._default_app_name}{path}" + + if "raw_path" in scope: + scope["raw_path"] = scope["path"].encode("latin-1") + + await self._app(scope, receive, send) + + +class ApiServerSpanExporter(export_lib.SpanExporter): + + def __init__(self, trace_dict): + self.trace_dict = trace_dict + + def export( + self, spans: typing.Sequence[ReadableSpan] + ) -> export_lib.SpanExportResult: + for span in spans: + if ( + span.name == "call_llm" + or span.name == "send_data" + or span.name.startswith("execute_tool") + ): + attributes = dict(span.attributes) + attributes["trace_id"] = span.get_span_context().trace_id + attributes["span_id"] = span.get_span_context().span_id + if attributes.get("gcp.vertex.agent.event_id", None): + self.trace_dict[attributes["gcp.vertex.agent.event_id"]] = attributes + return export_lib.SpanExportResult.SUCCESS + + def force_flush(self, timeout_millis: int = 30000) -> bool: + return True + + +class InMemoryExporter(export_lib.SpanExporter): + + def __init__(self, trace_dict): + super().__init__() + self._spans = [] + self.trace_dict = trace_dict + + @override + def export( + self, spans: typing.Sequence[ReadableSpan] + ) -> export_lib.SpanExportResult: + for span in spans: + trace_id = span.context.trace_id + attributes = dict(span.attributes) + session_id = attributes.get( + "gcp.vertex.agent.session_id", None + ) or attributes.get("gen_ai.conversation.id", None) + if session_id: + trace_ids = self.trace_dict.setdefault(session_id, []) + if trace_id not in trace_ids: + trace_ids.append(trace_id) + self._spans.extend(spans) + return export_lib.SpanExportResult.SUCCESS + + @override + def force_flush(self, timeout_millis: int = 30000) -> bool: + return True + + def get_finished_spans(self, session_id: str): + trace_ids = self.trace_dict.get(session_id, None) + if trace_ids is None or not trace_ids: + return [] + return [x for x in self._spans if x.context.trace_id in trace_ids] + + def clear(self): + self._spans.clear() + + +class RunAgentRequest(common.BaseModel): + app_name: Optional[str] = None + user_id: str + session_id: str + new_message: Optional[types.Content] = None + streaming: bool = False + state_delta: Optional[dict[str, Any]] = None + # for long-running function resume requests (e.g., OAuth callback) + function_call_event_id: Optional[str] = None + # for resume long-running functions + invocation_id: Optional[str] = None + custom_metadata: Optional[dict[str, Any]] = None + + +class CreateSessionRequest(common.BaseModel): + session_id: Optional[str] = Field( + default=None, + description=( + "The ID of the session to create. If not provided, a random session" + " ID will be generated." + ), + ) + state: Optional[dict[str, Any]] = Field( + default=None, description="The initial state of the session." + ) + events: Optional[list[Event]] = Field( + default=None, + description="A list of events to initialize the session with.", + ) + + +class SaveArtifactRequest(common.BaseModel): + """Request payload for saving a new artifact.""" + + filename: str = Field(description="Artifact filename.") + artifact: types.Part = Field( + description="Artifact payload encoded as google.genai.types.Part." + ) + custom_metadata: Optional[dict[str, Any]] = Field( + default=None, + description="Optional metadata to associate with the artifact version.", + ) + + +class UpdateMemoryRequest(common.BaseModel): + """Request to add a session to the memory service.""" + + session_id: str + """The ID of the session to add to memory.""" + + +class UpdateSessionRequest(common.BaseModel): + """Request to update session state without running the agent.""" + + state_delta: dict[str, Any] + """The state changes to apply to the session.""" + + +class AppInfo(common.BaseModel): + name: str + root_agent_name: str + description: str + language: Literal["yaml", "python"] + is_computer_use: bool = False + agents: Optional[dict[str, AgentInfo]] = None + + +class ListAppsResponse(common.BaseModel): + apps: list[AppInfo] + + +def _setup_telemetry( + otel_to_cloud: bool = False, + internal_exporters: Optional[list[SpanProcessor]] = None, +): + # TODO - remove the else branch here once maybe_set_otel_providers is no + # longer experimental. + if otel_to_cloud: + _setup_gcp_telemetry(internal_exporters=internal_exporters) + elif _otel_env_vars_enabled(): + _setup_telemetry_from_env(internal_exporters=internal_exporters) + else: + # Old logic - to be removed when above leaves experimental. + tracer_provider = TracerProvider() + if internal_exporters is not None: + for exporter in internal_exporters: + tracer_provider.add_span_processor(exporter) + trace.set_tracer_provider(tracer_provider=tracer_provider) + + +def _otel_env_vars_enabled() -> bool: + return any([ + os.getenv(endpoint_var) + for endpoint_var in [ + otel_env.OTEL_EXPORTER_OTLP_ENDPOINT, + otel_env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, + otel_env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT, + otel_env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, + ] + ]) + + +def _setup_gcp_telemetry( + internal_exporters: list[SpanProcessor] = None, +): + if typing.TYPE_CHECKING: + from ..telemetry.setup import OTelHooks + + otel_hooks_to_add: list[OTelHooks] = [] + + if internal_exporters: + from ..telemetry.setup import OTelHooks + + # Register ADK-specific exporters in trace provider. + otel_hooks_to_add.append(OTelHooks(span_processors=internal_exporters)) + + import google.auth + + from ..telemetry.google_cloud import get_gcp_exporters + from ..telemetry.google_cloud import get_gcp_resource + from ..telemetry.setup import maybe_set_otel_providers + + credentials, project_id = google.auth.default() + + otel_hooks_to_add.append( + get_gcp_exporters( + # TODO - use trace_to_cloud here as well once otel_to_cloud is no + # longer experimental. + enable_cloud_tracing=True, + # TODO - re-enable metrics once errors during shutdown are fixed. + enable_cloud_metrics=False, + enable_cloud_logging=True, + google_auth=(credentials, project_id), + ) + ) + otel_resource = get_gcp_resource(project_id) + + maybe_set_otel_providers( + otel_hooks_to_setup=otel_hooks_to_add, + otel_resource=otel_resource, + ) + _setup_instrumentation_lib_if_installed() + + +def _setup_telemetry_from_env( + internal_exporters: list[SpanProcessor] = None, +): + from ..telemetry.setup import maybe_set_otel_providers + + otel_hooks_to_add = [] + + if internal_exporters: + from ..telemetry.setup import OTelHooks + + # Register ADK-specific exporters in trace provider. + otel_hooks_to_add.append(OTelHooks(span_processors=internal_exporters)) + + maybe_set_otel_providers(otel_hooks_to_setup=otel_hooks_to_add) + _setup_instrumentation_lib_if_installed() + + +def _setup_instrumentation_lib_if_installed(): + # Set instrumentation to enable emitting OTel data from GenAISDK + # Currently the instrumentation lib is in extras dependencies, make sure to + # warn the user if it's not installed. + try: + from opentelemetry.instrumentation.google_genai import GoogleGenAiSdkInstrumentor + + GoogleGenAiSdkInstrumentor().instrument() + except ImportError: + logger.warning( + "Unable to import GoogleGenAiSdkInstrumentor - some" + " telemetry will be disabled. Make sure to install google-adk[otel-gcp]" + ) + + +class ApiServer: + """Helper class for setting up and running the ADK web server on FastAPI. + + You construct this class with all the Services required to run ADK agents and + can then call the get_fast_api_app method to get a FastAPI app instance that + can will use your provided service instances, static assets, and agent loader. + If you pass in a web_assets_dir, the static assets will be served under + /dev-ui in addition to the API endpoints created by default. + + You can add additional API endpoints by modifying the FastAPI app + instance returned by get_fast_api_app as this class exposes the agent runners + and most other bits of state retained during the lifetime of the server. + + Attributes: + agent_loader: An instance of BaseAgentLoader for loading agents. + session_service: An instance of BaseSessionService for managing sessions. + memory_service: An instance of BaseMemoryService for managing memory. + artifact_service: An instance of BaseArtifactService for managing + artifacts. + credential_service: An instance of BaseCredentialService for managing + credentials. + eval_sets_manager: An instance of EvalSetsManager for managing evaluation + sets. + eval_set_results_manager: An instance of EvalSetResultsManager for + managing evaluation set results. + agents_dir: Root directory containing subdirs for agents with those + containing resources (e.g. .env files, eval sets, etc.) for the agents. + extra_plugins: A list of fully qualified names of extra plugins to load. + logo_text: Text to display in the logo of the UI. + logo_image_url: URL of an image to display as logo of the UI. + runners_to_clean: Set of runner names marked for cleanup. + current_app_name_ref: A shared reference to the latest ran app name. + runner_dict: A dict of instantiated runners for each app. + """ + + def __init__( + self, + *, + agent_loader: BaseAgentLoader, + session_service: BaseSessionService, + memory_service: BaseMemoryService, + artifact_service: BaseArtifactService, + credential_service: BaseCredentialService, + eval_sets_manager: EvalSetsManager, + eval_set_results_manager: EvalSetResultsManager, + agents_dir: str, + extra_plugins: Optional[list[str]] = None, + logo_text: Optional[str] = None, + logo_image_url: Optional[str] = None, + url_prefix: Optional[str] = None, + auto_create_session: bool = False, + trigger_sources: Optional[list[str]] = None, + default_llm_model: Optional[str] = None, + ): + self.agent_loader = agent_loader + self.session_service = session_service + self.memory_service = memory_service + self.artifact_service = artifact_service + self.credential_service = credential_service + self.eval_sets_manager = eval_sets_manager + self.eval_set_results_manager = eval_set_results_manager + self.agents_dir = agents_dir + self.extra_plugins = extra_plugins or [] + self.logo_text = logo_text + self.logo_image_url = logo_image_url + # Internal properties we want to allow being modified from callbacks. + self.runners_to_clean: set[str] = set() + self.current_app_name_ref: SharedValue[str] = SharedValue(value="") + self.runner_dict = {} + self.url_prefix = url_prefix + self.auto_create_session = auto_create_session + self.trigger_sources = trigger_sources + self.default_llm_model = default_llm_model + self.default_app_name = os.getenv("ADK_DEFAULT_APP_NAME") + + async def get_runner_async(self, app_name: str) -> Runner: + """Returns the cached runner for the given app.""" + # Handle cleanup + if app_name in self.runners_to_clean: + self.runners_to_clean.remove(app_name) + runner = self.runner_dict.pop(app_name, None) + await cleanup.close_runners(list([runner])) + + # Return cached runner if exists + if app_name in self.runner_dict: + return self.runner_dict[app_name] + + # Create new runner + envs.load_dotenv_for_agent(os.path.basename(app_name), self.agents_dir) + agent_or_app = self.agent_loader.load_agent(app_name) + + if self.default_llm_model: + from .cli import _override_default_llm_model + + _override_default_llm_model(self.default_llm_model) + + # Instantiate extra plugins if configured + extra_plugins_instances = self._instantiate_extra_plugins() + + plugins_yaml_path = os.path.join(self.agents_dir, app_name, "plugins.yaml") + bq_analytics_config = None + if os.path.exists(plugins_yaml_path): + with open(plugins_yaml_path, "r", encoding="utf-8") as f: + plugins_config = yaml.safe_load(f) + if plugins_config and isinstance(plugins_config, dict): + bq_analytics_config = plugins_config.get("bigquery_agent_analytics") + + # All YAML agents are treated as visual builder agents. + is_visual_builder_agent = os.path.exists( + os.path.join(self.agents_dir, app_name, "root_agent.yaml") + ) + + def _maybe_add_bq_plugin(plugins: list[BasePlugin]) -> list[BasePlugin]: + if bq_analytics_config and all([ + bq_analytics_config.get("project_id"), + bq_analytics_config.get("dataset_id"), + bq_analytics_config.get("dataset_location"), + ]): + from ..plugins.bigquery_agent_analytics_plugin import BigQueryAgentAnalyticsPlugin + + plugins.append( + BigQueryAgentAnalyticsPlugin( + project_id=bq_analytics_config.get("project_id"), + dataset_id=bq_analytics_config.get("dataset_id"), + table_id=bq_analytics_config.get("table_id"), + location=bq_analytics_config.get("dataset_location"), + ) + ) + return plugins + + if isinstance(agent_or_app, App): + # Combine existing plugins with extra plugins + plugins = _maybe_add_bq_plugin( + agent_or_app.plugins + extra_plugins_instances + ) + agent_or_app.plugins = plugins + agentic_app = agent_or_app + elif isinstance(agent_or_app, BaseAgent): + plugins = _maybe_add_bq_plugin(extra_plugins_instances) + agentic_app = App( + name=app_name, + root_agent=agent_or_app, + plugins=plugins, + ) + else: + # BaseNode (non-agent) + agentic_app = App( + name=app_name, + root_agent=agent_or_app, + plugins=extra_plugins_instances, + ) + + # If the root agent was loaded from YAML, we treat it as being from Visual Builder + if is_visual_builder_agent: + object.__setattr__(agentic_app, "_is_visual_builder_app", True) + + runner = self._create_runner(agentic_app) + self.runner_dict[app_name] = runner + return runner + + def _get_root_agent(self, agent_or_app: BaseAgent | App) -> BaseAgent: + """Extract root agent from either a BaseAgent or App object.""" + if isinstance(agent_or_app, App): + return agent_or_app.root_agent + return agent_or_app + + def _create_runner(self, agentic_app: App) -> Runner: + """Create a runner with common services.""" + return Runner( + app=agentic_app, + artifact_service=self.artifact_service, + session_service=self.session_service, + memory_service=self.memory_service, + credential_service=self.credential_service, + auto_create_session=self.auto_create_session, + ) + + def _instantiate_extra_plugins(self) -> list[BasePlugin]: + """Instantiate extra plugins from the configured list. + + Returns: + List of instantiated BasePlugin objects. + """ + extra_plugins_instances = [] + for qualified_name in self.extra_plugins: + try: + plugin_obj = self._import_plugin_object(qualified_name) + if isinstance(plugin_obj, BasePlugin): + extra_plugins_instances.append(plugin_obj) + elif issubclass(plugin_obj, BasePlugin): + extra_plugins_instances.append(plugin_obj(name=qualified_name)) + except Exception as e: + logger.error("Failed to load plugin %s: %s", qualified_name, e) + return extra_plugins_instances + + def _import_plugin_object(self, qualified_name: str) -> Any: + """Import a plugin object (class or instance) from a fully qualified name. + + Args: + qualified_name: Fully qualified name (e.g., + 'my_package.my_plugin.MyPlugin') + + Returns: + The imported object, which can be either a class or an instance. + + Raises: + ImportError: If the module cannot be imported. + AttributeError: If the object doesn't exist in the module. + """ + module_name, obj_name = qualified_name.rsplit(".", 1) + module = importlib.import_module(module_name) + return getattr(module, obj_name) + + def _setup_runtime_config(self, web_assets_dir: str): + """Sets up the runtime config for the web server.""" + # Read existing runtime config file. + runtime_config_path = os.path.join( + web_assets_dir, "assets", "config", "runtime-config.json" + ) + runtime_config = {} + try: + with open(runtime_config_path, "r") as f: + runtime_config = json.load(f) + except FileNotFoundError: + logger.info( + "File not found: %s. A new runtime config file will be created.", + runtime_config_path, + ) + except json.JSONDecodeError: + logger.warning( + "Failed to decode JSON from %s. The file content will be" + " overwritten.", + runtime_config_path, + ) + runtime_config["backendUrl"] = self.url_prefix if self.url_prefix else "" + + # Set custom logo config. + if self.logo_text or self.logo_image_url: + if not self.logo_text or not self.logo_image_url: + raise ValueError( + "Both --logo-text and --logo-image-url must be defined when using" + " logo config." + ) + runtime_config["logo"] = { + "text": self.logo_text, + "imageUrl": self.logo_image_url, + } + elif "logo" in runtime_config: + del runtime_config["logo"] + + # Write the runtime config file. + try: + os.makedirs(os.path.dirname(runtime_config_path), exist_ok=True) + with open(runtime_config_path, "w") as f: + json.dump(runtime_config, f, indent=2) + f.write("\n") + except IOError as e: + logger.error( + "Failed to write runtime config file %s: %s", runtime_config_path, e + ) + + async def _create_session( + self, + *, + app_name: str, + user_id: str, + session_id: Optional[str] = None, + state: Optional[dict[str, Any]] = None, + ) -> Session: + try: + session = await self.session_service.create_session( + app_name=app_name, + user_id=user_id, + state=state, + session_id=session_id, + ) + logger.info("New session created: %s", session.id) + return session + except AlreadyExistsError as e: + raise HTTPException( + status_code=409, detail=f"Session already exists: {session_id}" + ) from e + except Exception as e: + logger.error( + "Internal server error during session creation: %s", e, exc_info=True + ) + raise HTTPException(status_code=500, detail=str(e)) from e + + def get_fast_api_app( + self, + lifespan: Optional[Lifespan[FastAPI]] = None, + allow_origins: Optional[list[str]] = None, + web_assets_dir: Optional[str] = None, + setup_observer: Callable[ + [Observer, "ApiServer"], None + ] = lambda o, s: None, + tear_down_observer: Callable[ + [Observer, "ApiServer"], None + ] = lambda o, s: None, + register_processors: Callable[[TracerProvider], None] = lambda o: None, + otel_to_cloud: bool = False, + with_ui: bool = False, + ): + """Creates a FastAPI app for the ADK web server. + + By default it'll just return a FastAPI instance with the API server + endpoints, + but if you specify a web_assets_dir, it'll also serve the static web assets + from that directory. + + Args: + lifespan: The lifespan of the FastAPI app. + allow_origins: The origins that are allowed to make cross-origin requests. + Entries can be literal origins (e.g., 'https://example.com') or regex + patterns prefixed with 'regex:' (e.g., + 'regex:https://.*\\.example\\.com'). + web_assets_dir: The directory containing the web assets to serve. + setup_observer: Callback for setting up the file system observer. + tear_down_observer: Callback for cleaning up the file system observer. + register_processors: Callback for additional Span processors to be added + to the TracerProvider. + otel_to_cloud: Whether to enable Cloud Trace and Cloud Logging + integrations. + + Returns: + A FastAPI app instance. + """ + trace_dict = {} + session_trace_dict = {} + self._trace_dict = trace_dict + self._session_trace_dict = session_trace_dict + + # Set up a file system watcher to detect changes in the agents directory. + observer = Observer() + setup_observer(observer, self) + + @asynccontextmanager + async def internal_lifespan(app: FastAPI): + try: + if lifespan: + async with lifespan(app) as lifespan_context: + yield lifespan_context + else: + yield + finally: + tear_down_observer(observer, self) + # Create tasks for all runner closures to run concurrently + await cleanup.close_runners(list(self.runner_dict.values())) + + memory_exporter = InMemoryExporter(session_trace_dict) + self._memory_exporter = memory_exporter + + _setup_telemetry( + otel_to_cloud=otel_to_cloud, + internal_exporters=[ + export_lib.SimpleSpanProcessor(ApiServerSpanExporter(trace_dict)), + export_lib.SimpleSpanProcessor(memory_exporter), + ], + ) + if web_assets_dir: + self._setup_runtime_config(web_assets_dir) + + tracer_provider = trace.get_tracer_provider() + register_processors(tracer_provider) + + # Run the FastAPI server. + app = FastAPI(lifespan=internal_lifespan) + + has_configured_allowed_origins = bool(allow_origins) + if allow_origins: + literal_origins, combined_regex = _parse_cors_origins(allow_origins) + compiled_origin_regex = ( + re.compile(combined_regex) if combined_regex is not None else None + ) + app.add_middleware( + CORSMiddleware, + allow_origins=literal_origins, + allow_origin_regex=combined_regex, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + else: + literal_origins = [] + compiled_origin_regex = None + + app.add_middleware( + _OriginCheckMiddleware, + has_configured_allowed_origins=has_configured_allowed_origins, + allowed_origins=literal_origins, + allowed_origin_regex=compiled_origin_regex, + ) + + app.add_middleware( + _DefaultAppRewriteMiddleware, + default_app_name=self.default_app_name, + ) + + # Register production endpoints (22 total) + self._register_production_endpoints( + app, + trace_dict, + memory_exporter, + literal_origins, + compiled_origin_regex, + has_configured_allowed_origins, + ) + + if web_assets_dir: + import mimetypes + + mimetypes.add_type("application/javascript", ".js", True) + mimetypes.add_type("text/javascript", ".js", True) + + redirect_dev_ui_url = ( + self.url_prefix + "/dev-ui/" if self.url_prefix else "/dev-ui/" + ) + + @app.get("/dev-ui/config") + async def get_ui_config(): + return { + "logo_text": self.logo_text, + "logo_image_url": self.logo_image_url, + } + + @app.get("/") + async def redirect_root_to_dev_ui(): + return RedirectResponse(redirect_dev_ui_url) + + @app.get("/dev-ui") + async def redirect_dev_ui_add_slash(): + return RedirectResponse(redirect_dev_ui_url) + + app.mount( + "/dev-ui/", + StaticFiles(directory=web_assets_dir, html=True, follow_symlink=True), + name="static", + ) + + # Register /trigger/* endpoints when enabled. + if self.trigger_sources: + from .trigger_routes import TriggerRouter + + trigger_router = TriggerRouter(self, trigger_sources=self.trigger_sources) + trigger_router.register(app) + + return app + + def _register_production_endpoints( + self, + app: FastAPI, + trace_dict: dict, + memory_exporter: Any, + literal_origins: list[str], + compiled_origin_regex: Optional[re.Pattern[str]], + has_configured_allowed_origins: bool, + ): + """Register all core production-safe endpoints.""" + + @app.get("/health") + async def health() -> dict[str, str]: + return {"status": "ok"} + + @app.get("/version") + async def version() -> dict[str, str]: + return { + "version": __version__, + "language": "python", + "language_version": ( + f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}" + ), + } + + @app.get("/list-apps") + async def list_apps( + detailed: bool = Query( + default=False, description="Return detailed app information" + ) + ) -> list[str] | ListAppsResponse: + if detailed: + apps_info = self.agent_loader.list_agents_detailed() + return ListAppsResponse(apps=[AppInfo(**app) for app in apps_info]) + return self.agent_loader.list_agents() + + @experimental + @app.get("/apps/{app_name}/app-info", response_model_exclude_none=True) + async def get_adk_app_info(app_name: str) -> AppInfo: + """Returns the detailed info for a given ADK app.""" + agent_or_app = self.agent_loader.load_agent(app_name) + root_agent = self._get_root_agent(agent_or_app) + if isinstance(root_agent, LlmAgent): + return AppInfo( + name=app_name, + root_agent_name=root_agent.name, + description=root_agent.description, + language="python", + agents=await get_agents_dict(root_agent), + ) + else: + raise HTTPException( + status_code=400, detail="Root agent is not an LlmAgent" + ) + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}", + response_model_exclude_none=True, + ) + async def get_session( + app_name: str, user_id: str, session_id: str + ) -> Session: + session = await self.session_service.get_session( + app_name=app_name, user_id=user_id, session_id=session_id + ) + if not session: + raise HTTPException(status_code=404, detail="Session not found") + self.current_app_name_ref.value = app_name + return session + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions", + response_model_exclude_none=True, + ) + async def list_sessions(app_name: str, user_id: str) -> list[Session]: + list_sessions_response = await self.session_service.list_sessions( + app_name=app_name, user_id=user_id + ) + return [ + session + for session in list_sessions_response.sessions + # Remove sessions that were generated as a part of Eval. + if not session.id.startswith(EVAL_SESSION_ID_PREFIX) + ] + + @deprecated( + "Please use create_session instead. This will be removed in future" + " releases." + ) + @app.post( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}", + response_model_exclude_none=True, + ) + async def create_session_with_id( + app_name: str, + user_id: str, + session_id: str, + state: Optional[dict[str, Any]] = None, + ) -> Session: + return await self._create_session( + app_name=app_name, + user_id=user_id, + state=state, + session_id=session_id, + ) + + @app.post( + "/apps/{app_name}/users/{user_id}/sessions", + response_model_exclude_none=True, + ) + async def create_session( + app_name: str, + user_id: str, + req: Optional[CreateSessionRequest] = None, + ) -> Session: + if not req: + return await self._create_session(app_name=app_name, user_id=user_id) + + session = await self._create_session( + app_name=app_name, + user_id=user_id, + state=req.state, + session_id=req.session_id, + ) + + if req.events: + for event in req.events: + await self.session_service.append_event(session=session, event=event) + + return session + + @app.delete("/apps/{app_name}/users/{user_id}/sessions/{session_id}") + async def delete_session( + app_name: str, user_id: str, session_id: str + ) -> None: + await self.session_service.delete_session( + app_name=app_name, user_id=user_id, session_id=session_id + ) + + @app.patch( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}", + response_model_exclude_none=True, + ) + async def update_session( + app_name: str, + user_id: str, + session_id: str, + req: UpdateSessionRequest, + ) -> Session: + """Updates session state without running the agent. + + Args: + app_name: The name of the application. + user_id: The ID of the user. + session_id: The ID of the session to update. + req: The patch request containing state changes. + + Returns: + The updated session. + + Raises: + HTTPException: If the session is not found. + """ + session = await self.session_service.get_session( + app_name=app_name, user_id=user_id, session_id=session_id + ) + if not session: + raise HTTPException(status_code=404, detail="Session not found") + + # Create an event to record the state change + import uuid + + from ..events.event import Event + from ..events.event import EventActions + + state_update_event = Event( + invocation_id="p-" + str(uuid.uuid4()), + author="user", + actions=EventActions(state_delta=req.state_delta), + ) + + # Append the event to the session + # This will automatically update the session state through __update_session_state + await self.session_service.append_event( + session=session, event=state_update_event + ) + + return session + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}", + response_model_exclude_none=True, + ) + async def load_artifact( + app_name: str, + user_id: str, + session_id: str, + artifact_name: str, + version: Optional[int] = Query(None), + ) -> Optional[types.Part]: + artifact = await self.artifact_service.load_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=artifact_name, + version=version, + ) + if not artifact: + raise HTTPException(status_code=404, detail="Artifact not found") + return artifact + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/metadata", + response_model=list[ArtifactVersion], + response_model_exclude_none=True, + ) + async def list_artifact_versions_metadata( + app_name: str, + user_id: str, + session_id: str, + artifact_name: str, + ) -> list[ArtifactVersion]: + return await self.artifact_service.list_artifact_versions( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=artifact_name, + ) + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/{version_id}", + response_model_exclude_none=True, + ) + async def load_artifact_version( + app_name: str, + user_id: str, + session_id: str, + artifact_name: str, + version_id: int, + ) -> Optional[types.Part]: + artifact = await self.artifact_service.load_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=artifact_name, + version=version_id, + ) + if not artifact: + raise HTTPException(status_code=404, detail="Artifact not found") + return artifact + + @app.post( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts", + response_model=ArtifactVersion, + response_model_exclude_none=True, + ) + async def save_artifact( + app_name: str, + user_id: str, + session_id: str, + req: SaveArtifactRequest, + ) -> ArtifactVersion: + """Request payload for saving a new artifact.""" + try: + version = await self.artifact_service.save_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=req.filename, + artifact=req.artifact, + custom_metadata=req.custom_metadata, + ) + except InputValidationError as ive: + raise HTTPException(status_code=400, detail=str(ive)) from ive + except Exception as exc: # pylint: disable=broad-exception-caught + logger.error( + "Internal error while saving artifact %s for app=%s user=%s" + " session=%s: %s", + req.filename, + app_name, + user_id, + session_id, + exc, + exc_info=True, + ) + raise HTTPException(status_code=500, detail=str(exc)) from exc + artifact_version = await self.artifact_service.get_artifact_version( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=req.filename, + version=version, + ) + if artifact_version is None: + raise HTTPException( + status_code=500, detail="Artifact metadata unavailable" + ) + return artifact_version + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/{version_id}/metadata", + response_model=ArtifactVersion, + response_model_exclude_none=True, + ) + async def get_artifact_version_metadata( + app_name: str, + user_id: str, + session_id: str, + artifact_name: str, + version_id: int, + ) -> ArtifactVersion: + artifact_version = await self.artifact_service.get_artifact_version( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=artifact_name, + version=version_id, + ) + if not artifact_version: + raise HTTPException( + status_code=404, detail="Artifact version not found" + ) + return artifact_version + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts", + response_model_exclude_none=True, + ) + async def list_artifact_names( + app_name: str, user_id: str, session_id: str + ) -> list[str]: + return await self.artifact_service.list_artifact_keys( + app_name=app_name, user_id=user_id, session_id=session_id + ) + + @app.get( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions", + response_model_exclude_none=True, + ) + async def list_artifact_versions( + app_name: str, user_id: str, session_id: str, artifact_name: str + ) -> list[int]: + return await self.artifact_service.list_versions( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=artifact_name, + ) + + @app.delete( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}", + ) + async def delete_artifact( + app_name: str, user_id: str, session_id: str, artifact_name: str + ) -> None: + await self.artifact_service.delete_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=artifact_name, + ) + + @app.patch("/apps/{app_name}/users/{user_id}/memory") + async def patch_memory( + app_name: str, user_id: str, update_memory_request: UpdateMemoryRequest + ) -> None: + """Adds all events from a given session to the memory service. + + Args: + app_name: The name of the application. + user_id: The ID of the user. + update_memory_request: The memory request for the update + + Raises: + HTTPException: If the memory service is not configured or the request + is invalid. + """ + if not self.memory_service: + raise HTTPException( + status_code=400, detail="Memory service is not configured." + ) + if ( + update_memory_request is None + or update_memory_request.session_id is None + ): + raise HTTPException( + status_code=400, detail="Update memory request is invalid." + ) + + session = await self.session_service.get_session( + app_name=app_name, + user_id=user_id, + session_id=update_memory_request.session_id, + ) + if not session: + raise HTTPException(status_code=404, detail="Session not found") + await self.memory_service.add_session_to_memory(session) + + def _set_telemetry_context_if_needed(runner: Runner): + """Helper to set contextvars for the current request task.""" + app = getattr(runner, "app", None) + from ..utils._telemetry_context import _is_visual_builder + + if app and getattr(app, "_is_visual_builder_app", False): + _is_visual_builder.set(True) + else: + _is_visual_builder.set(False) + + @app.post("/run", response_model_exclude_none=True) + async def run_agent(req: RunAgentRequest, request: Request) -> list[Event]: + app_name = req.app_name or self.default_app_name + if not app_name: + raise HTTPException( + status_code=400, + detail="app_name is required when ADK_DEFAULT_APP_NAME is not set", + ) + req.app_name = app_name + self.current_app_name_ref.value = req.app_name + runner = await self.get_runner_async(req.app_name) + _set_telemetry_context_if_needed(runner) + run_config = ( + RunConfig(custom_metadata=req.custom_metadata) + if req.custom_metadata + else None + ) + + async def worker(): + try: + async with Aclosing( + runner.run_async( + user_id=req.user_id, + session_id=req.session_id, + new_message=req.new_message, + state_delta=req.state_delta, + invocation_id=req.invocation_id, + run_config=run_config, + ) + ) as agen: + return [event async for event in agen] + except SessionNotFoundError as e: + raise HTTPException(status_code=404, detail=str(e)) from e + + worker_task = asyncio.create_task(worker()) + + async def monitor(): + try: + while True: + message = await request.receive() + if message.get("type") == "http.disconnect": + logger.warning( + "Client disconnected. Aborting agent run for session %s.", + req.session_id, + ) + worker_task.cancel() + break + except asyncio.CancelledError: + pass + except Exception as e: # pylint: disable=broad-exception-caught + logger.error("Exception in disconnect monitor: %s", e, exc_info=True) + + monitor_task = asyncio.create_task(monitor()) + + try: + events = await worker_task + logger.info("Generated %s events in agent run", len(events)) + logger.debug("Events generated: %s", events) + return events + except asyncio.CancelledError: + if await request.is_disconnected(): + return Response(status_code=499) + raise + finally: + monitor_task.cancel() + + @app.post("/run_sse") + async def run_agent_sse(req: RunAgentRequest) -> StreamingResponse: + app_name = req.app_name or self.default_app_name + if not app_name: + raise HTTPException( + status_code=400, + detail="app_name is required when ADK_DEFAULT_APP_NAME is not set", + ) + req.app_name = app_name + self.current_app_name_ref.value = req.app_name + stream_mode = StreamingMode.SSE if req.streaming else StreamingMode.NONE + runner = await self.get_runner_async(req.app_name) + _set_telemetry_context_if_needed(runner) + + # Validate session existence before starting the stream. + # We check directly here instead of eagerly advancing the + # runner's async generator with anext(), because splitting + # generator consumption across two asyncio Tasks (request + # handler vs StreamingResponse) breaks OpenTelemetry context + # detachment. + if not runner.auto_create_session: + session = await self.session_service.get_session( + app_name=req.app_name, + user_id=req.user_id, + session_id=req.session_id, + ) + if not session: + raise HTTPException( + status_code=404, + detail=f"Session not found: {req.session_id}", + ) + + # Convert the events to properly formatted SSE + async def event_generator(): + async with Aclosing( + runner.run_async( + user_id=req.user_id, + session_id=req.session_id, + new_message=req.new_message, + state_delta=req.state_delta, + run_config=RunConfig( + streaming_mode=stream_mode, + custom_metadata=req.custom_metadata, + ), + invocation_id=req.invocation_id, + ) + ) as agen: + try: + async for event in agen: + # ADK Web renders artifacts from `actions.artifactDelta` + # during part processing *and* during action processing + # 1) the original event with `artifactDelta` cleared (content) + # 2) a content-less "action-only" event carrying `artifactDelta` + events_to_stream = [event] + if ( + not req.function_call_event_id + and event.actions.artifact_delta + and event.content + and event.content.parts + ): + content_event = event.model_copy(deep=True) + content_event.actions.artifact_delta = {} + artifact_event = event.model_copy(deep=True) + artifact_event.content = None + events_to_stream = [content_event, artifact_event] + + for event_to_stream in events_to_stream: + sse_event = event_to_stream.model_dump_json( + exclude_none=True, + by_alias=True, + ) + logger.debug( + "Generated event in agent run streaming: %s", sse_event + ) + yield f"data: {sse_event}\n\n" + except Exception as e: + logger.exception("Error in event_generator: %s", e) + yield f"data: {json.dumps({'error': str(e)})}\n\n" + + # Returns a streaming response with the proper media type for SSE + return StreamingResponse( + event_generator(), + media_type="text/event-stream", + ) + + @app.websocket("/run_live") + async def run_agent_live( + websocket: WebSocket, + user_id: str, + session_id: str, + app_name: Optional[str] = Query(default=None), + modalities: List[Literal["TEXT", "AUDIO"]] = Query( + default=["AUDIO"] + ), # Only allows "TEXT" or "AUDIO" + proactive_audio: bool | None = Query(default=None), + enable_affective_dialog: bool | None = Query(default=None), + enable_session_resumption: bool | None = Query(default=None), + save_live_blob: bool = Query(default=False), + ) -> None: + resolved_app_name = app_name or self.default_app_name + if not resolved_app_name: + await websocket.close( + code=1008, + reason=( + "app_name query parameter is required when ADK_DEFAULT_APP_NAME" + " is not set" + ), + ) + return + app_name = resolved_app_name + + ws_origin = websocket.headers.get("origin") + if ws_origin is not None and not _is_request_origin_allowed( + ws_origin, + websocket.scope, + literal_origins, + compiled_origin_regex, + has_configured_allowed_origins, + ): + await websocket.close(code=1008, reason="Origin not allowed") + return + + await websocket.accept() + self.current_app_name_ref.value = app_name + runner_for_context = await self.get_runner_async(app_name) + _set_telemetry_context_if_needed(runner_for_context) + + session = await self.session_service.get_session( + app_name=app_name, user_id=user_id, session_id=session_id + ) + if not session: + await websocket.close(code=1002, reason="Session not found") + return + + live_request_queue = LiveRequestQueue() + + async def forward_events(): + runner = await self.get_runner_async(app_name) + run_config = RunConfig( + response_modalities=modalities, + proactivity=( + types.ProactivityConfig(proactive_audio=proactive_audio) + if proactive_audio is not None + else None + ), + enable_affective_dialog=enable_affective_dialog, + session_resumption=( + types.SessionResumptionConfig( + transparent=enable_session_resumption + ) + if enable_session_resumption is not None + else None + ), + save_live_blob=save_live_blob, + ) + async with Aclosing( + runner.run_live( + session=session, + live_request_queue=live_request_queue, + run_config=run_config, + ) + ) as agen: + async for event in agen: + await websocket.send_text( + event.model_dump_json(exclude_none=True, by_alias=True) + ) + + async def process_messages(): + try: + while True: + data = await websocket.receive_text() + # Validate and send the received message to the live queue. + live_request_queue.send(LiveRequest.model_validate_json(data)) + except ValidationError as ve: + logger.error("Validation error in process_messages: %s", ve) + + # Run both tasks concurrently and cancel all if one fails. + tasks = [ + asyncio.create_task(forward_events()), + asyncio.create_task(process_messages()), + ] + done, pending = await asyncio.wait( + tasks, return_when=asyncio.FIRST_EXCEPTION + ) + try: + # This will re-raise any exception from the completed tasks. + for task in done: + task.result() + except WebSocketDisconnect: + # Disconnection could happen when receive or send text via websocket + logger.info("Client disconnected during live session.") + except Exception as e: + logger.exception("Error during live websocket communication: %s", e) + traceback.print_exc() + WEBSOCKET_INTERNAL_ERROR_CODE = 1011 + WEBSOCKET_MAX_BYTES_FOR_REASON = 123 + await websocket.close( + code=WEBSOCKET_INTERNAL_ERROR_CODE, + reason=str(e)[:WEBSOCKET_MAX_BYTES_FOR_REASON], + ) + finally: + for task in pending: + task.cancel() diff --git a/src/google/adk/cli/browser/chunk-257HQBMN.js b/src/google/adk/cli/browser/chunk-257HQBMN.js new file mode 100644 index 0000000000..8ca8bd8847 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-257HQBMN.js @@ -0,0 +1,132 @@ +import{a as qt}from"./chunk-XMBKBASC.js";import{a as Jt}from"./chunk-B2DSW4QB.js";import{a as et,d as jt}from"./chunk-JHZIBEJC.js";import{a as Zt,b as Gt}from"./chunk-DRBE27N3.js";import{f as ht}from"./chunk-WXI2IBAH.js";import{d as Vt,m as rt,o as Lt}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as tt,E as F,G as kt,H as Wt,M as Yt,N as Ht,R as Kt,Y as O,a as Ft,b as Pt}from"./chunk-QFMJV7VH.js";import{M as Ut,Q as Xt,a as D,g,i as L}from"./chunk-JRNAXTJ7.js";import{e as Mt}from"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as at,b as st,j as _}from"./chunk-RMXJBC7V.js";var vt=(function(){var e=g(function(B,m,d,b){for(d=d||{},b=B.length;b--;d[B[b]]=m);return d},"o"),t=[1,15],a=[1,7],i=[1,13],l=[1,14],s=[1,19],r=[1,16],n=[1,17],c=[1,18],x=[8,30],o=[8,10,21,28,29,30,31,39,43,46],u=[1,23],y=[1,24],f=[8,10,15,16,21,28,29,30,31,39,43,46],w=[8,10,15,16,21,27,28,29,30,31,39,43,46],v=[1,49],k={trace:g(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,NODE_ID:31,nodeShapeNLabel:32,dirList:33,DIR:34,NODE_DSTART:35,NODE_DEND:36,BLOCK_ARROW_START:37,BLOCK_ARROW_END:38,classDef:39,CLASSDEF_ID:40,CLASSDEF_STYLEOPTS:41,DEFAULT:42,class:43,CLASSENTITY_IDS:44,STYLECLASS:45,style:46,STYLE_ENTITY_IDS:47,STYLE_DEFINITION_DATA:48,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"NODE_ID",34:"DIR",35:"NODE_DSTART",36:"NODE_DEND",37:"BLOCK_ARROW_START",38:"BLOCK_ARROW_END",39:"classDef",40:"CLASSDEF_ID",41:"CLASSDEF_STYLEOPTS",42:"DEFAULT",43:"class",44:"CLASSENTITY_IDS",45:"STYLECLASS",46:"style",47:"STYLE_ENTITY_IDS",48:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[33,1],[33,2],[32,3],[32,4],[23,3],[23,3],[24,3],[25,3]],performAction:g(function(m,d,b,S,E,h,Y){var p=h.length-1;switch(E){case 4:S.getLogger().debug("Rule: separator (NL) ");break;case 5:S.getLogger().debug("Rule: separator (Space) ");break;case 6:S.getLogger().debug("Rule: separator (EOF) ");break;case 7:S.getLogger().debug("Rule: hierarchy: ",h[p-1]),S.setHierarchy(h[p-1]);break;case 8:S.getLogger().debug("Stop NL ");break;case 9:S.getLogger().debug("Stop EOF ");break;case 10:S.getLogger().debug("Stop NL2 ");break;case 11:S.getLogger().debug("Stop EOF2 ");break;case 12:S.getLogger().debug("Rule: statement: ",h[p]),typeof h[p].length=="number"?this.$=h[p]:this.$=[h[p]];break;case 13:S.getLogger().debug("Rule: statement #2: ",h[p-1]),this.$=[h[p-1]].concat(h[p]);break;case 14:S.getLogger().debug("Rule: link: ",h[p],m),this.$={edgeTypeStr:h[p],label:""};break;case 15:S.getLogger().debug("Rule: LABEL link: ",h[p-3],h[p-1],h[p]),this.$={edgeTypeStr:h[p],label:h[p-1]};break;case 18:let z=parseInt(h[p]),q=S.generateId();this.$={id:q,type:"space",label:"",width:z,children:[]};break;case 23:S.getLogger().debug("Rule: (nodeStatement link node) ",h[p-2],h[p-1],h[p]," typestr: ",h[p-1].edgeTypeStr);let Z=S.edgeStrToEdgeData(h[p-1].edgeTypeStr);this.$=[{id:h[p-2].id,label:h[p-2].label,type:h[p-2].type,directions:h[p-2].directions},{id:h[p-2].id+"-"+h[p].id,start:h[p-2].id,end:h[p].id,label:h[p-1].label,type:"edge",directions:h[p].directions,arrowTypeEnd:Z,arrowTypeStart:"arrow_open"},{id:h[p].id,label:h[p].label,type:S.typeStr2Type(h[p].typeStr),directions:h[p].directions}];break;case 24:S.getLogger().debug("Rule: nodeStatement (abc88 node size) ",h[p-1],h[p]),this.$={id:h[p-1].id,label:h[p-1].label,type:S.typeStr2Type(h[p-1].typeStr),directions:h[p-1].directions,widthInColumns:parseInt(h[p],10)};break;case 25:S.getLogger().debug("Rule: nodeStatement (node) ",h[p]),this.$={id:h[p].id,label:h[p].label,type:S.typeStr2Type(h[p].typeStr),directions:h[p].directions,widthInColumns:1};break;case 26:S.getLogger().debug("APA123",this?this:"na"),S.getLogger().debug("COLUMNS: ",h[p]),this.$={type:"column-setting",columns:h[p]==="auto"?-1:parseInt(h[p])};break;case 27:S.getLogger().debug("Rule: id-block statement : ",h[p-2],h[p-1]);let Rt=S.generateId();this.$=st(at({},h[p-2]),{type:"composite",children:h[p-1]});break;case 28:S.getLogger().debug("Rule: blockStatement : ",h[p-2],h[p-1],h[p]);let lt=S.generateId();this.$={id:lt,type:"composite",label:"",children:h[p-1]};break;case 29:S.getLogger().debug("Rule: node (NODE_ID separator): ",h[p]),this.$={id:h[p]};break;case 30:S.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",h[p-1],h[p]),this.$={id:h[p-1],label:h[p].label,typeStr:h[p].typeStr,directions:h[p].directions};break;case 31:S.getLogger().debug("Rule: dirList: ",h[p]),this.$=[h[p]];break;case 32:S.getLogger().debug("Rule: dirList: ",h[p-1],h[p]),this.$=[h[p-1]].concat(h[p]);break;case 33:S.getLogger().debug("Rule: nodeShapeNLabel: ",h[p-2],h[p-1],h[p]),this.$={typeStr:h[p-2]+h[p],label:h[p-1]};break;case 34:S.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",h[p-3],h[p-2]," #3:",h[p-1],h[p]),this.$={typeStr:h[p-3]+h[p],label:h[p-2],directions:h[p-1]};break;case 35:case 36:this.$={type:"classDef",id:h[p-1].trim(),css:h[p].trim()};break;case 37:this.$={type:"applyClass",id:h[p-1].trim(),styleClass:h[p].trim()};break;case 38:this.$={type:"applyStyles",id:h[p-1].trim(),stylesStr:h[p].trim()};break}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{10:t,11:3,13:4,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:i,29:l,31:s,39:r,43:n,46:c},{8:[1,20]},e(x,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,10:t,21:a,28:i,29:l,31:s,39:r,43:n,46:c}),e(o,[2,16],{14:22,15:u,16:y}),e(o,[2,17]),e(o,[2,18]),e(o,[2,19]),e(o,[2,20]),e(o,[2,21]),e(o,[2,22]),e(f,[2,25],{27:[1,25]}),e(o,[2,26]),{19:26,26:12,31:s},{10:t,11:27,13:4,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:i,29:l,31:s,39:r,43:n,46:c},{40:[1,28],42:[1,29]},{44:[1,30]},{47:[1,31]},e(w,[2,29],{32:32,35:[1,33],37:[1,34]}),{1:[2,7]},e(x,[2,13]),{26:35,31:s},{31:[2,14]},{17:[1,36]},e(f,[2,24]),{10:t,11:37,13:4,14:22,15:u,16:y,19:5,20:6,21:a,22:8,23:9,24:10,25:11,26:12,28:i,29:l,31:s,39:r,43:n,46:c},{30:[1,38]},{41:[1,39]},{41:[1,40]},{45:[1,41]},{48:[1,42]},e(w,[2,30]),{18:[1,43]},{18:[1,44]},e(f,[2,23]),{18:[1,45]},{30:[1,46]},e(o,[2,28]),e(o,[2,35]),e(o,[2,36]),e(o,[2,37]),e(o,[2,38]),{36:[1,47]},{33:48,34:v},{15:[1,50]},e(o,[2,27]),e(w,[2,33]),{38:[1,51]},{33:52,34:v,38:[2,31]},{31:[2,15]},e(w,[2,34]),{38:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:g(function(m,d){if(d.recoverable)this.trace(m);else{var b=new Error(m);throw b.hash=d,b}},"parseError"),parse:g(function(m){var d=this,b=[0],S=[],E=[null],h=[],Y=this.table,p="",z=0,q=0,Z=0,Rt=2,lt=1,Ee=h.slice.call(arguments,1),A=Object.create(this.lexer),J={yy:{}};for(var xt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,xt)&&(J.yy[xt]=this.yy[xt]);A.setInput(m,J.yy),J.yy.lexer=A,J.yy.parser=this,typeof A.yylloc>"u"&&(A.yylloc={});var bt=A.yylloc;h.push(bt);var _e=A.options&&A.options.ranges;typeof J.yy.parseError=="function"?this.parseError=J.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function De(H){b.length=b.length-2*H,E.length=E.length-H,h.length=h.length-H}g(De,"popStack");function zt(){var H;return H=S.pop()||A.lex()||lt,typeof H!="number"&&(H instanceof Array&&(S=H,H=S.pop()),H=d.symbols_[H]||H),H}g(zt,"lex");for(var W,yt,Q,U,Qr,mt,$={},ct,G,At,ot;;){if(Q=b[b.length-1],this.defaultActions[Q]?U=this.defaultActions[Q]:((W===null||typeof W>"u")&&(W=zt()),U=Y[Q]&&Y[Q][W]),typeof U>"u"||!U.length||!U[0]){var wt="";ot=[];for(ct in Y[Q])this.terminals_[ct]&&ct>Rt&&ot.push("'"+this.terminals_[ct]+"'");A.showPosition?wt="Parse error on line "+(z+1)+`: +`+A.showPosition()+` +Expecting `+ot.join(", ")+", got '"+(this.terminals_[W]||W)+"'":wt="Parse error on line "+(z+1)+": Unexpected "+(W==lt?"end of input":"'"+(this.terminals_[W]||W)+"'"),this.parseError(wt,{text:A.match,token:this.terminals_[W]||W,line:A.yylineno,loc:bt,expected:ot})}if(U[0]instanceof Array&&U.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Q+", token: "+W);switch(U[0]){case 1:b.push(W),E.push(A.yytext),h.push(A.yylloc),b.push(U[1]),W=null,yt?(W=yt,yt=null):(q=A.yyleng,p=A.yytext,z=A.yylineno,bt=A.yylloc,Z>0&&Z--);break;case 2:if(G=this.productions_[U[1]][1],$.$=E[E.length-G],$._$={first_line:h[h.length-(G||1)].first_line,last_line:h[h.length-1].last_line,first_column:h[h.length-(G||1)].first_column,last_column:h[h.length-1].last_column},_e&&($._$.range=[h[h.length-(G||1)].range[0],h[h.length-1].range[1]]),mt=this.performAction.apply($,[p,q,z,J.yy,U[1],E,h].concat(Ee)),typeof mt<"u")return mt;G&&(b=b.slice(0,-1*G*2),E=E.slice(0,-1*G),h=h.slice(0,-1*G)),b.push(this.productions_[U[1]][0]),E.push($.$),h.push($._$),At=Y[b[b.length-2]][b[b.length-1]],b.push(At);break;case 3:return!0}}return!0},"parse")},T=(function(){var B={EOF:1,parseError:g(function(d,b){if(this.yy.parser)this.yy.parser.parseError(d,b);else throw new Error(d)},"parseError"),setInput:g(function(m,d){return this.yy=d||this.yy||{},this._input=m,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:g(function(){var m=this._input[0];this.yytext+=m,this.yyleng++,this.offset++,this.match+=m,this.matched+=m;var d=m.match(/(?:\r\n?|\n).*/g);return d?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),m},"input"),unput:g(function(m){var d=m.length,b=m.split(/(?:\r\n?|\n)/g);this._input=m+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-d),this.offset-=d;var S=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),b.length-1&&(this.yylineno-=b.length-1);var E=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:b?(b.length===S.length?this.yylloc.first_column:0)+S[S.length-b.length].length-b[0].length:this.yylloc.first_column-d},this.options.ranges&&(this.yylloc.range=[E[0],E[0]+this.yyleng-d]),this.yyleng=this.yytext.length,this},"unput"),more:g(function(){return this._more=!0,this},"more"),reject:g(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:g(function(m){this.unput(this.match.slice(m))},"less"),pastInput:g(function(){var m=this.matched.substr(0,this.matched.length-this.match.length);return(m.length>20?"...":"")+m.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:g(function(){var m=this.match;return m.length<20&&(m+=this._input.substr(0,20-m.length)),(m.substr(0,20)+(m.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:g(function(){var m=this.pastInput(),d=new Array(m.length+1).join("-");return m+this.upcomingInput()+` +`+d+"^"},"showPosition"),test_match:g(function(m,d){var b,S,E;if(this.options.backtrack_lexer&&(E={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(E.yylloc.range=this.yylloc.range.slice(0))),S=m[0].match(/(?:\r\n?|\n).*/g),S&&(this.yylineno+=S.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:S?S[S.length-1].length-S[S.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+m[0].length},this.yytext+=m[0],this.match+=m[0],this.matches=m,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(m[0].length),this.matched+=m[0],b=this.performAction.call(this,this.yy,this,d,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),b)return b;if(this._backtrack){for(var h in E)this[h]=E[h];return!1}return!1},"test_match"),next:g(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var m,d,b,S;this._more||(this.yytext="",this.match="");for(var E=this._currentRules(),h=0;hd[0].length)){if(d=b,S=h,this.options.backtrack_lexer){if(m=this.test_match(b,E[h]),m!==!1)return m;if(this._backtrack){d=!1;continue}else return!1}else if(!this.options.flex)break}return d?(m=this.test_match(d,E[S]),m!==!1?m:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:g(function(){var d=this.next();return d||this.lex()},"lex"),begin:g(function(d){this.conditionStack.push(d)},"begin"),popState:g(function(){var d=this.conditionStack.length-1;return d>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:g(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:g(function(d){return d=this.conditionStack.length-1-Math.abs(d||0),d>=0?this.conditionStack[d]:"INITIAL"},"topState"),pushState:g(function(d){this.begin(d)},"pushState"),stateStackSize:g(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:g(function(d,b,S,E){var h=E;switch(S){case 0:return d.getLogger().debug("Found block-beta"),10;break;case 1:return d.getLogger().debug("Found id-block"),29;break;case 2:return d.getLogger().debug("Found block"),10;break;case 3:d.getLogger().debug(".",b.yytext);break;case 4:d.getLogger().debug("_",b.yytext);break;case 5:return 5;case 6:return b.yytext=-1,28;break;case 7:return b.yytext=b.yytext.replace(/columns\s+/,""),d.getLogger().debug("COLUMNS (LEX)",b.yytext),28;break;case 8:this.pushState("md_string");break;case 9:return"MD_STR";case 10:this.popState();break;case 11:this.pushState("string");break;case 12:d.getLogger().debug("LEX: POPPING STR:",b.yytext),this.popState();break;case 13:return d.getLogger().debug("LEX: STR end:",b.yytext),"STR";break;case 14:return b.yytext=b.yytext.replace(/space\:/,""),d.getLogger().debug("SPACE NUM (LEX)",b.yytext),21;break;case 15:return b.yytext="1",d.getLogger().debug("COLUMNS (LEX)",b.yytext),21;break;case 16:return 42;case 17:return"LINKSTYLE";case 18:return"INTERPOLATE";case 19:return this.pushState("CLASSDEF"),39;break;case 20:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 21:return this.popState(),this.pushState("CLASSDEFID"),40;break;case 22:return this.popState(),41;break;case 23:return this.pushState("CLASS"),43;break;case 24:return this.popState(),this.pushState("CLASS_STYLE"),44;break;case 25:return this.popState(),45;break;case 26:return this.pushState("STYLE_STMNT"),46;break;case 27:return this.popState(),this.pushState("STYLE_DEFINITION"),47;break;case 28:return this.popState(),48;break;case 29:return this.pushState("acc_title"),"acc_title";break;case 30:return this.popState(),"acc_title_value";break;case 31:return this.pushState("acc_descr"),"acc_descr";break;case 32:return this.popState(),"acc_descr_value";break;case 33:this.pushState("acc_descr_multiline");break;case 34:this.popState();break;case 35:return"acc_descr_multiline_value";case 36:return 30;case 37:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 38:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 39:return this.popState(),d.getLogger().debug("Lex: ))"),"NODE_DEND";break;case 40:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 41:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 42:return this.popState(),d.getLogger().debug("Lex: (-"),"NODE_DEND";break;case 43:return this.popState(),d.getLogger().debug("Lex: -)"),"NODE_DEND";break;case 44:return this.popState(),d.getLogger().debug("Lex: (("),"NODE_DEND";break;case 45:return this.popState(),d.getLogger().debug("Lex: ]]"),"NODE_DEND";break;case 46:return this.popState(),d.getLogger().debug("Lex: ("),"NODE_DEND";break;case 47:return this.popState(),d.getLogger().debug("Lex: ])"),"NODE_DEND";break;case 48:return this.popState(),d.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 49:return this.popState(),d.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 50:return this.popState(),d.getLogger().debug("Lex: )]"),"NODE_DEND";break;case 51:return this.popState(),d.getLogger().debug("Lex: )"),"NODE_DEND";break;case 52:return this.popState(),d.getLogger().debug("Lex: ]>"),"NODE_DEND";break;case 53:return this.popState(),d.getLogger().debug("Lex: ]"),"NODE_DEND";break;case 54:return d.getLogger().debug("Lexa: -)"),this.pushState("NODE"),35;break;case 55:return d.getLogger().debug("Lexa: (-"),this.pushState("NODE"),35;break;case 56:return d.getLogger().debug("Lexa: ))"),this.pushState("NODE"),35;break;case 57:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 58:return d.getLogger().debug("Lex: ((("),this.pushState("NODE"),35;break;case 59:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 60:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 61:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 62:return d.getLogger().debug("Lexc: >"),this.pushState("NODE"),35;break;case 63:return d.getLogger().debug("Lexa: (["),this.pushState("NODE"),35;break;case 64:return d.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 65:return this.pushState("NODE"),35;break;case 66:return this.pushState("NODE"),35;break;case 67:return this.pushState("NODE"),35;break;case 68:return this.pushState("NODE"),35;break;case 69:return this.pushState("NODE"),35;break;case 70:return this.pushState("NODE"),35;break;case 71:return this.pushState("NODE"),35;break;case 72:return d.getLogger().debug("Lexa: ["),this.pushState("NODE"),35;break;case 73:return this.pushState("BLOCK_ARROW"),d.getLogger().debug("LEX ARR START"),37;break;case 74:return d.getLogger().debug("Lex: NODE_ID",b.yytext),31;break;case 75:return d.getLogger().debug("Lex: EOF",b.yytext),8;break;case 76:this.pushState("md_string");break;case 77:this.pushState("md_string");break;case 78:return"NODE_DESCR";case 79:this.popState();break;case 80:d.getLogger().debug("Lex: Starting string"),this.pushState("string");break;case 81:d.getLogger().debug("LEX ARR: Starting string"),this.pushState("string");break;case 82:return d.getLogger().debug("LEX: NODE_DESCR:",b.yytext),"NODE_DESCR";break;case 83:d.getLogger().debug("LEX POPPING"),this.popState();break;case 84:d.getLogger().debug("Lex: =>BAE"),this.pushState("ARROW_DIR");break;case 85:return b.yytext=b.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (right): dir:",b.yytext),"DIR";break;case 86:return b.yytext=b.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (left):",b.yytext),"DIR";break;case 87:return b.yytext=b.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (x):",b.yytext),"DIR";break;case 88:return b.yytext=b.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (y):",b.yytext),"DIR";break;case 89:return b.yytext=b.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (up):",b.yytext),"DIR";break;case 90:return b.yytext=b.yytext.replace(/^,\s*/,""),d.getLogger().debug("Lex (down):",b.yytext),"DIR";break;case 91:return b.yytext="]>",d.getLogger().debug("Lex (ARROW_DIR end):",b.yytext),this.popState(),this.popState(),"BLOCK_ARROW_END";break;case 92:return d.getLogger().debug("Lex: LINK","#"+b.yytext+"#"),15;break;case 93:return d.getLogger().debug("Lex: LINK",b.yytext),15;break;case 94:return d.getLogger().debug("Lex: LINK",b.yytext),15;break;case 95:return d.getLogger().debug("Lex: LINK",b.yytext),15;break;case 96:return d.getLogger().debug("Lex: START_LINK",b.yytext),this.pushState("LLABEL"),16;break;case 97:return d.getLogger().debug("Lex: START_LINK",b.yytext),this.pushState("LLABEL"),16;break;case 98:return d.getLogger().debug("Lex: START_LINK",b.yytext),this.pushState("LLABEL"),16;break;case 99:this.pushState("md_string");break;case 100:return d.getLogger().debug("Lex: Starting string"),this.pushState("string"),"LINK_LABEL";break;case 101:return this.popState(),d.getLogger().debug("Lex: LINK","#"+b.yytext+"#"),15;break;case 102:return this.popState(),d.getLogger().debug("Lex: LINK",b.yytext),15;break;case 103:return this.popState(),d.getLogger().debug("Lex: LINK",b.yytext),15;break;case 104:return d.getLogger().debug("Lex: COLON",b.yytext),b.yytext=b.yytext.slice(1),27;break}},"anonymous"),rules:[/^(?:block-beta\b)/,/^(?:block:)/,/^(?:block\b)/,/^(?:[\s]+)/,/^(?:[\n]+)/,/^(?:((\u000D\u000A)|(\u000A)))/,/^(?:columns\s+auto\b)/,/^(?:columns\s+[\d]+)/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:space[:]\d+)/,/^(?:space\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\s+)/,/^(?:DEFAULT\s+)/,/^(?:\w+\s+)/,/^(?:[^\n]*)/,/^(?:class\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:style\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:end\b\s*)/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:[\)]\))/,/^(?:\}\})/,/^(?:\})/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\()/,/^(?:\]\])/,/^(?:\()/,/^(?:\]\))/,/^(?:\\\])/,/^(?:\/\])/,/^(?:\)\])/,/^(?:[\)])/,/^(?:\]>)/,/^(?:[\]])/,/^(?:-\))/,/^(?:\(-)/,/^(?:\)\))/,/^(?:\))/,/^(?:\(\(\()/,/^(?:\(\()/,/^(?:\{\{)/,/^(?:\{)/,/^(?:>)/,/^(?:\(\[)/,/^(?:\()/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\[\\)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:\[)/,/^(?:<\[)/,/^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/,/^(?:$)/,/^(?:["][`])/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:\]>\s*\()/,/^(?:,?\s*right\s*)/,/^(?:,?\s*left\s*)/,/^(?:,?\s*x\s*)/,/^(?:,?\s*y\s*)/,/^(?:,?\s*up\s*)/,/^(?:,?\s*down\s*)/,/^(?:\)\s*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*~~[\~]+\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:["][`])/,/^(?:["])/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?::\d+)/],conditions:{STYLE_DEFINITION:{rules:[28],inclusive:!1},STYLE_STMNT:{rules:[27],inclusive:!1},CLASSDEFID:{rules:[22],inclusive:!1},CLASSDEF:{rules:[20,21],inclusive:!1},CLASS_STYLE:{rules:[25],inclusive:!1},CLASS:{rules:[24],inclusive:!1},LLABEL:{rules:[99,100,101,102,103],inclusive:!1},ARROW_DIR:{rules:[85,86,87,88,89,90,91],inclusive:!1},BLOCK_ARROW:{rules:[76,81,84],inclusive:!1},NODE:{rules:[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,77,80],inclusive:!1},md_string:{rules:[9,10,78,79],inclusive:!1},space:{rules:[],inclusive:!1},string:{rules:[12,13,82,83],inclusive:!1},acc_descr_multiline:{rules:[34,35],inclusive:!1},acc_descr:{rules:[32],inclusive:!1},acc_title:{rules:[30],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,11,14,15,16,17,18,19,23,26,29,31,33,36,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,92,93,94,95,96,97,98,104],inclusive:!0}}};return B})();k.lexer=T;function C(){this.yy={}}return g(C,"Parser"),C.prototype=k,k.Parser=C,new C})();vt.parser=vt;var Te=vt,j=new Map,Bt=[],Et=new Map,Qt="color",$t="fill",Be="bgFill",le=",",Ne=O(),dt=new Map,Ie=g(e=>Yt.sanitizeText(e,Ne),"sanitizeText"),Ce=g(function(e,t=""){let a=dt.get(e);a||(a={id:e,styles:[],textStyles:[]},dt.set(e,a)),t?.split(le).forEach(i=>{let l=i.replace(/([^;]*);/,"$1").trim();if(RegExp(Qt).exec(i)){let r=l.replace($t,Be).replace(Qt,$t);a.textStyles.push(r)}a.styles.push(l)})},"addStyleClass"),Oe=g(function(e,t=""){let a=j.get(e);t!=null&&(a.styles=t.split(le))},"addStyle2Node"),Re=g(function(e,t){e.split(",").forEach(function(a){let i=j.get(a);if(i===void 0){let l=a.trim();i={id:l,type:"na",children:[]},j.set(l,i)}i.classes||(i.classes=[]),i.classes.push(t)})},"setCssClass"),ce=g((e,t)=>{let a=e.flat(),i=[],s=a.find(r=>r?.type==="column-setting")?.columns??-1;for(let r of a){if(typeof s=="number"&&s>0&&r.type!=="column-setting"&&typeof r.widthInColumns=="number"&&r.widthInColumns>s&&L.warn(`Block ${r.id} width ${r.widthInColumns} exceeds configured column width ${s}`),r.label&&(r.label=Ie(r.label)),r.type==="classDef"){Ce(r.id,r.css);continue}if(r.type==="applyClass"){Re(r.id,r?.styleClass??"");continue}if(r.type==="applyStyles"){r?.stylesStr&&Oe(r.id,r?.stylesStr);continue}if(r.type==="column-setting")t.columns=r.columns??-1;else if(r.type==="edge"){let n=(Et.get(r.id)??0)+1;Et.set(r.id,n),r.id=n+"-"+r.id,Bt.push(r)}else{r.label||(r.type==="composite"?r.label="":r.label=r.id);let n=j.get(r.id);if(n===void 0?j.set(r.id,r):(r.type!=="na"&&(n.type=r.type),r.label!==r.id&&(n.label=r.label)),r.children&&ce(r.children,r),r.type==="space"){let c=r.width??1;for(let x=0;x{L.debug("Clear called"),Kt(),nt={id:"root",type:"composite",children:[],columns:-1},j=new Map([["root",nt]]),Nt=[],dt=new Map,Bt=[],Et=new Map},"clear");function oe(e){switch(L.debug("typeStr2Type",e),e){case"[]":return"square";case"()":return L.debug("we have a round"),"round";case"(())":return"circle";case">]":return"rect_left_inv_arrow";case"{}":return"diamond";case"{{}}":return"hexagon";case"([])":return"stadium";case"[[]]":return"subroutine";case"[()]":return"cylinder";case"((()))":return"doublecircle";case"[//]":return"lean_right";case"[\\\\]":return"lean_left";case"[/\\]":return"trapezoid";case"[\\/]":return"inv_trapezoid";case"<[]>":return"block_arrow";default:return"na"}}g(oe,"typeStr2Type");function he(e){return L.debug("typeStr2Type",e),e==="=="?"thick":"normal"}g(he,"edgeTypeStr2Type");function ge(e){switch(e.replace(/^[\s-]+|[\s-]+$/g,"")){case"x":return"arrow_cross";case"o":return"arrow_circle";case">":return"arrow_point";default:return""}}g(ge,"edgeStrToEdgeData");var te=0,Ae=g(()=>(te++,"id-"+Math.random().toString(36).substr(2,12)+"-"+te),"generateId"),Me=g(e=>{nt.children=e,ce(e,nt),Nt=nt.children},"setHierarchy"),Fe=g(e=>{let t=j.get(e);return t?t.columns?t.columns:t.children?t.children.length:-1:-1},"getColumns"),Pe=g(()=>[...j.values()],"getBlocksFlat"),We=g(()=>Nt||[],"getBlocks"),Ye=g(()=>Bt,"getEdges"),He=g(e=>j.get(e),"getBlock"),Ke=g(e=>{j.set(e.id,e)},"setBlock"),Ue=g(()=>L,"getLogger"),Xe=g(function(){return dt},"getClasses"),je={getConfig:g(()=>tt().block,"getConfig"),typeStr2Type:oe,edgeTypeStr2Type:he,edgeStrToEdgeData:ge,getLogger:Ue,getBlocksFlat:Pe,getBlocks:We,getEdges:Ye,setHierarchy:Me,getBlock:He,setBlock:Ke,getColumns:Fe,getClasses:Xe,clear:ze,generateId:Ae},Ve=je,St=g((e,t)=>{let a=Pt,i=a(e,"r"),l=a(e,"g"),s=a(e,"b");return Ft(i,l,s,t)},"fade"),Ze=g(e=>`.label { + font-family: ${e.fontFamily}; + color: ${e.nodeTextColor||e.textColor}; + } + .cluster-label text { + fill: ${e.titleColor}; + } + .cluster-label span,p { + color: ${e.titleColor}; + } + + + + .label text,span,p { + fill: ${e.nodeTextColor||e.textColor}; + color: ${e.nodeTextColor||e.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${e.mainBkg}; + stroke: ${e.nodeBorder}; + stroke-width: 1px; + } + .flowchart-label text { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${e.arrowheadColor}; + } + + .edgePath .path { + stroke: ${e.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${e.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${e.edgeLabelBackground}; + /* + * This is for backward compatibility with existing code that didn't + * add a \`

        \` around edge labels. + * + * TODO: We should probably remove this in a future release. + */ + p { + margin: 0; + padding: 0; + display: inline; + } + rect { + opacity: 0.5; + background-color: ${e.edgeLabelBackground}; + fill: ${e.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${e.edgeLabelBackground}; + } + + .node .cluster { + // fill: ${St(e.mainBkg,.5)}; + fill: ${St(e.clusterBkg,.5)}; + stroke: ${St(e.clusterBorder,.2)}; + box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; + stroke-width: 1px; + } + + .cluster text { + fill: ${e.titleColor}; + } + + .cluster span,p { + color: ${e.titleColor}; + } + /* .cluster div { + color: ${e.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${e.fontFamily}; + font-size: 12px; + background: ${e.tertiaryColor}; + border: 1px solid ${e.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${e.textColor}; + } + ${Jt()} +`,"getStyles"),Ge=Ze,qe=g((e,t,a,i)=>{t.forEach(l=>{nr[l](e,a,i)})},"insertMarkers"),Je=g((e,t,a)=>{L.trace("Making markers for ",a),e.append("defs").append("marker").attr("id",a+"_"+t+"-extensionStart").attr("class","marker extension "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),e.append("defs").append("marker").attr("id",a+"_"+t+"-extensionEnd").attr("class","marker extension "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),Qe=g((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-compositionStart").attr("class","marker composition "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),e.append("defs").append("marker").attr("id",a+"_"+t+"-compositionEnd").attr("class","marker composition "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),$e=g((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-aggregationStart").attr("class","marker aggregation "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),e.append("defs").append("marker").attr("id",a+"_"+t+"-aggregationEnd").attr("class","marker aggregation "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),tr=g((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-dependencyStart").attr("class","marker dependency "+t).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),e.append("defs").append("marker").attr("id",a+"_"+t+"-dependencyEnd").attr("class","marker dependency "+t).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),er=g((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-lollipopStart").attr("class","marker lollipop "+t).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),e.append("defs").append("marker").attr("id",a+"_"+t+"-lollipopEnd").attr("class","marker lollipop "+t).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),rr=g((e,t,a)=>{e.append("marker").attr("id",a+"_"+t+"-pointEnd").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",6).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),e.append("marker").attr("id",a+"_"+t+"-pointStart").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),ar=g((e,t,a)=>{e.append("marker").attr("id",a+"_"+t+"-circleEnd").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),e.append("marker").attr("id",a+"_"+t+"-circleStart").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),sr=g((e,t,a)=>{e.append("marker").attr("id",a+"_"+t+"-crossEnd").attr("class","marker cross "+t).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),e.append("marker").attr("id",a+"_"+t+"-crossStart").attr("class","marker cross "+t).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),ir=g((e,t,a)=>{e.append("defs").append("marker").attr("id",a+"_"+t+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),nr={extension:Je,composition:Qe,aggregation:$e,dependency:tr,lollipop:er,point:rr,circle:ar,cross:sr,barb:ir},lr=qe,R=O()?.block?.padding??8;function _t(e,t){if(e===0||!Number.isInteger(e))throw new Error("Columns must be an integer !== 0.");if(t<0||!Number.isInteger(t))throw new Error("Position must be a non-negative integer."+t);if(e<0)return{px:t,py:0};if(e===1)return{px:0,py:t};let a=t%e,i=Math.floor(t/e);return{px:a,py:i}}g(_t,"calculateBlockPosition");var cr=g(e=>{let t=0,a=0;for(let i of e.children){let{width:l,height:s,x:r,y:n}=i.size??{width:0,height:0,x:0,y:0};L.debug("getMaxChildSize abc95 child:",i.id,"width:",l,"height:",s,"x:",r,"y:",n,i.type),i.type!=="space"&&(l>t&&(t=l/(i.widthInColumns??1)),s>a&&(a=s))}return{width:t,height:a}},"getMaxChildSize");function ut(e,t,a=0,i=0){L.debug("setBlockSizes abc95 (start)",e.id,e?.size?.x,"block width =",e?.size,"siblingWidth",a),e?.size?.width||(e.size={width:a,height:i,x:0,y:0});let l=0,s=0;if(e.children?.length>0){for(let f of e.children)ut(f,t);let r=cr(e);l=r.width,s=r.height,L.debug("setBlockSizes abc95 maxWidth of",e.id,":s children is ",l,s);for(let f of e.children)f.size&&(L.debug(`abc95 Setting size of children of ${e.id} id=${f.id} ${l} ${s} ${JSON.stringify(f.size)}`),f.size.width=l*(f.widthInColumns??1)+R*((f.widthInColumns??1)-1),f.size.height=s,f.size.x=0,f.size.y=0,L.debug(`abc95 updating size of ${e.id} children child:${f.id} maxWidth:${l} maxHeight:${s}`));for(let f of e.children)ut(f,t,l,s);let n=e.columns??-1,c=0;for(let f of e.children)c+=f.widthInColumns??1;let x=e.children.length;n>0&&n0?Math.min(e.children.length,n):e.children.length;if(f>0){let w=(u-f*R-R)/f;L.debug("abc95 (growing to fit) width",e.id,u,e.size?.width,w);for(let v of e.children)v.size&&(v.size.width=w)}}e.size={width:u,height:y,x:0,y:0}}L.debug("setBlockSizes abc94 (done)",e.id,e?.size?.x,e?.size?.width,e?.size?.y,e?.size?.height)}g(ut,"setBlockSizes");function It(e,t){L.debug(`abc85 layout blocks (=>layoutBlocks) ${e.id} x: ${e?.size?.x} y: ${e?.size?.y} width: ${e?.size?.width}`);let a=e.columns??-1;if(L.debug("layoutBlocks columns abc95",e.id,"=>",a,e),e.children&&e.children.length>0){let i=e?.children[0]?.size?.width??0,l=e.children.length*i+(e.children.length-1)*R;L.debug("widthOfChildren 88",l,"posX");let s=new Map;{let o=0;for(let u of e.children){if(!u.size)continue;let{py:y}=_t(a,o),f=s.get(y)??0;u.size.height>f&&s.set(y,u.size.height);let w=u?.widthInColumns??1;a>0&&(w=Math.min(w,a-o%a)),o+=w}}let r=new Map;{let o=0,u=[...s.keys()].sort((y,f)=>y-f);for(let y of u)r.set(y,o),o+=(s.get(y)??0)+R}let n=0;L.debug("abc91 block?.size?.x",e.id,e?.size?.x);let c=e?.size?.x?e?.size?.x+(-e?.size?.width/2||0):-R,x=0;for(let o of e.children){let u=e;if(!o.size)continue;let{width:y,height:f}=o.size,{px:w,py:v}=_t(a,n);if(v!=x&&(x=v,c=e?.size?.x?e?.size?.x+(-e?.size?.width/2||0):-R,L.debug("New row in layout for block",e.id," and child ",o.id,x)),L.debug(`abc89 layout blocks (child) id: ${o.id} Pos: ${n} (px, py) ${w},${v} (${u?.size?.x},${u?.size?.y}) parent: ${u.id} width: ${y}${R}`),u.size){let T=y/2;o.size.x=c+R+T,L.debug(`abc91 layout blocks (calc) px, pyid:${o.id} startingPos=X${c} new startingPosX${o.size.x} ${T} padding=${R} width=${y} halfWidth=${T} => x:${o.size.x} y:${o.size.y} ${o.widthInColumns} (width * (child?.w || 1)) / 2 ${y*(o?.widthInColumns??1)/2}`),c=o.size.x+T;let C=r.get(v)??0,B=s.get(v)??f;o.size.y=u.size.y-u.size.height/2+C+B/2+R,L.debug(`abc88 layout blocks (calc) px, pyid:${o.id}startingPosX${c}${R}${T}=>x:${o.size.x}y:${o.size.y}${o.widthInColumns}(width * (child?.w || 1)) / 2${y*(o?.widthInColumns??1)/2}`)}o.children&&It(o,t);let k=o?.widthInColumns??1;a>0&&(k=Math.min(k,a-n%a)),n+=k,L.debug("abc88 columnsPos",o,n)}}L.debug(`layout blocks (<==layoutBlocks) ${e.id} x: ${e?.size?.x} y: ${e?.size?.y} width: ${e?.size?.width}`)}g(It,"layoutBlocks");function Ct(e,{minX:t,minY:a,maxX:i,maxY:l}={minX:0,minY:0,maxX:0,maxY:0}){if(e.size&&e.id!=="root"){let{x:s,y:r,width:n,height:c}=e.size;s-n/2i&&(i=s+n/2),r+c/2>l&&(l=r+c/2)}if(e.children)for(let s of e.children)({minX:t,minY:a,maxX:i,maxY:l}=Ct(s,{minX:t,minY:a,maxX:i,maxY:l}));return{minX:t,minY:a,maxX:i,maxY:l}}g(Ct,"findBounds");function de(e){let t=e.getBlock("root");if(!t)return;ut(t,e,0,0),It(t,e),L.debug("getBlocks",JSON.stringify(t,null,2));let{minX:a,minY:i,maxX:l,maxY:s}=Ct(t),r=s-i,n=l-a;return{x:a,y:i,width:n,height:r}}g(de,"layout");var or=g((e,t,a,i=!1,l=!1)=>_(null,null,function*(){let s=t||"";typeof s=="object"&&(s=s[0]);let r=O(),n=F(r);return yield ht(e,s,{style:a,isTitle:i,useHtmlLabels:n,markdown:!1,isNode:l,width:Number.POSITIVE_INFINITY},r)}),"createLabel"),X=or,hr=g((e,t,a,i,l)=>{t.arrowTypeStart&&ee(e,"start",t.arrowTypeStart,a,i,l),t.arrowTypeEnd&&ee(e,"end",t.arrowTypeEnd,a,i,l)},"addEdgeMarkers"),gr={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},ee=g((e,t,a,i,l,s)=>{let r=gr[a];if(!r){L.warn(`Unknown arrow type: ${a}`);return}let n=t==="start"?"Start":"End";e.attr(`marker-${t}`,`url(${i}#${l}_${s}-${r}${n})`)},"addEdgeMarker"),Dt={},P={},dr=g((e,t)=>_(null,null,function*(){let a=O(),i=F(a),l=e.insert("g").attr("class","edgeLabel"),s=l.insert("g").attr("class","label"),r=t.labelType==="markdown",n=yield ht(e,t.label,{style:t.labelStyle,useHtmlLabels:i,addSvgBackground:r,isNode:!1,markdown:r,width:r?void 0:Number.POSITIVE_INFINITY},a);s.node().appendChild(n);let c=n.getBBox(),x=c;if(i){let u=n.children[0],y=D(n);c=u.getBoundingClientRect(),x=c,y.attr("width",c.width),y.attr("height",c.height)}else{let u=D(n).select("text").node();u&&typeof u.getBBox=="function"&&(x=u.getBBox())}s.attr("transform",et(x,i)),Dt[t.id]=l,t.width=c.width,t.height=c.height;let o;if(t.startLabelLeft){let u=e.insert("g").attr("class","edgeTerminals"),y=u.insert("g").attr("class","inner"),f=yield X(y,t.startLabelLeft,t.labelStyle);o=f;let w=f.getBBox();if(i){let v=f.children[0],k=D(f);w=v.getBoundingClientRect(),k.attr("width",w.width),k.attr("height",w.height)}y.attr("transform",et(w,i)),P[t.id]||(P[t.id]={}),P[t.id].startLeft=u,it(o,t.startLabelLeft)}if(t.startLabelRight){let u=e.insert("g").attr("class","edgeTerminals"),y=u.insert("g").attr("class","inner"),f=yield X(u,t.startLabelRight,t.labelStyle);o=f,y.node().appendChild(f);let w=f.getBBox();if(i){let v=f.children[0],k=D(f);w=v.getBoundingClientRect(),k.attr("width",w.width),k.attr("height",w.height)}y.attr("transform",et(w,i)),P[t.id]||(P[t.id]={}),P[t.id].startRight=u,it(o,t.startLabelRight)}if(t.endLabelLeft){let u=e.insert("g").attr("class","edgeTerminals"),y=u.insert("g").attr("class","inner"),f=yield X(y,t.endLabelLeft,t.labelStyle);o=f;let w=f.getBBox();if(i){let v=f.children[0],k=D(f);w=v.getBoundingClientRect(),k.attr("width",w.width),k.attr("height",w.height)}y.attr("transform",et(w,i)),u.node().appendChild(f),P[t.id]||(P[t.id]={}),P[t.id].endLeft=u,it(o,t.endLabelLeft)}if(t.endLabelRight){let u=e.insert("g").attr("class","edgeTerminals"),y=u.insert("g").attr("class","inner"),f=yield X(y,t.endLabelRight,t.labelStyle);o=f;let w=f.getBBox();if(i){let v=f.children[0],k=D(f);w=v.getBoundingClientRect(),k.attr("width",w.width),k.attr("height",w.height)}y.attr("transform",et(w,i)),u.node().appendChild(f),P[t.id]||(P[t.id]={}),P[t.id].endRight=u,it(o,t.endLabelRight)}return n}),"insertEdgeLabel");function it(e,t){F(O())&&e&&(e.style.width=t.length*9+"px",e.style.height="12px")}g(it,"setTerminalWidth");var ur=g((e,t)=>{L.debug("Moving label abc88 ",e.id,e.label,Dt[e.id],t);let a=t.updatedPath?t.updatedPath:t.originalPath,i=O(),{subGraphTitleTotalMargin:l}=Zt(i);if(e.label){let s=Dt[e.id],r=e.x,n=e.y;if(a){let c=rt.calcLabelPosition(a);L.debug("Moving label "+e.label+" from (",r,",",n,") to (",c.x,",",c.y,") abc88"),t.updatedPath&&(r=c.x,n=c.y)}s.attr("transform",`translate(${r}, ${n+l/2})`)}if(e.startLabelLeft){let s=P[e.id].startLeft,r=e.x,n=e.y;if(a){let c=rt.calcTerminalLabelPosition(e.arrowTypeStart?10:0,"start_left",a);r=c.x,n=c.y}s.attr("transform",`translate(${r}, ${n})`)}if(e.startLabelRight){let s=P[e.id].startRight,r=e.x,n=e.y;if(a){let c=rt.calcTerminalLabelPosition(e.arrowTypeStart?10:0,"start_right",a);r=c.x,n=c.y}s.attr("transform",`translate(${r}, ${n})`)}if(e.endLabelLeft){let s=P[e.id].endLeft,r=e.x,n=e.y;if(a){let c=rt.calcTerminalLabelPosition(e.arrowTypeEnd?10:0,"end_left",a);r=c.x,n=c.y}s.attr("transform",`translate(${r}, ${n})`)}if(e.endLabelRight){let s=P[e.id].endRight,r=e.x,n=e.y;if(a){let c=rt.calcTerminalLabelPosition(e.arrowTypeEnd?10:0,"end_right",a);r=c.x,n=c.y}s.attr("transform",`translate(${r}, ${n})`)}},"positionEdgeLabel"),pr=g((e,t)=>{let a=e.x,i=e.y,l=Math.abs(t.x-a),s=Math.abs(t.y-i),r=e.width/2,n=e.height/2;return l>=r||s>=n},"outsideNode"),fr=g((e,t,a)=>{L.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(t)} + insidePoint : ${JSON.stringify(a)} + node : x:${e.x} y:${e.y} w:${e.width} h:${e.height}`);let i=e.x,l=e.y,s=Math.abs(i-a.x),r=e.width/2,n=a.xMath.abs(i-t.x)*c){let u=a.y{L.debug("abc88 cutPathAtIntersect",e,t);let a=[],i=e[0],l=!1;return e.forEach(s=>{if(!pr(t,s)&&!l){let r=fr(t,i,s),n=!1;a.forEach(c=>{n=n||c.x===r.x&&c.y===r.y}),a.some(c=>c.x===r.x&&c.y===r.y)||a.push(r),l=!0}else i=s,l||a.push(s)}),a},"cutPathAtIntersect"),xr=g(function(e,t,a,i,l,s,r){let n=a.points;L.debug("abc88 InsertEdge: edge=",a,"e=",t);let c=!1,x=s.node(t.v);var o=s.node(t.w);o?.intersect&&x?.intersect&&(n=n.slice(1,a.points.length-1),n.unshift(x.intersect(n[0])),n.push(o.intersect(n[n.length-1]))),a.toCluster&&(L.debug("to cluster abc88",i[a.toCluster]),n=re(a.points,i[a.toCluster].node),c=!0),a.fromCluster&&(L.debug("from cluster abc88",i[a.fromCluster]),n=re(n.reverse(),i[a.fromCluster].node).reverse(),c=!0);let u=n.filter(m=>!Number.isNaN(m.y)),y=Xt;a.curve&&(l==="graph"||l==="flowchart")&&(y=a.curve);let{x:f,y:w}=jt(a),v=Ut().x(f).y(w).curve(y),k;switch(a.thickness){case"normal":k="edge-thickness-normal";break;case"thick":k="edge-thickness-thick";break;case"invisible":k="edge-thickness-thick";break;default:k=""}switch(a.pattern){case"solid":k+=" edge-pattern-solid";break;case"dotted":k+=" edge-pattern-dotted";break;case"dashed":k+=" edge-pattern-dashed";break}let T=e.append("path").attr("d",v(u)).attr("id",a.id).attr("class"," "+k+(a.classes?" "+a.classes:"")).attr("style",a.style),C="";(O().flowchart.arrowMarkerAbsolute||O().state.arrowMarkerAbsolute)&&(C=Wt(!0)),hr(T,a,C,r,l);let B={};return c&&(B.updatedPath=n),B.originalPath=a.points,B},"insertEdge"),br=g(e=>{let t=new Set;for(let a of e)switch(a){case"x":t.add("right"),t.add("left");break;case"y":t.add("up"),t.add("down");break;default:t.add(a);break}return t},"expandAndDeduplicateDirections"),yr=g((e,t,a)=>{let i=br(e),l=2,s=t.height+2*a.padding,r=s/l,n=t.width+2*r+a.padding,c=a.padding/2;return i.has("right")&&i.has("left")&&i.has("up")&&i.has("down")?[{x:0,y:0},{x:r,y:0},{x:n/2,y:2*c},{x:n-r,y:0},{x:n,y:0},{x:n,y:-s/3},{x:n+2*c,y:-s/2},{x:n,y:-2*s/3},{x:n,y:-s},{x:n-r,y:-s},{x:n/2,y:-s-2*c},{x:r,y:-s},{x:0,y:-s},{x:0,y:-2*s/3},{x:-2*c,y:-s/2},{x:0,y:-s/3}]:i.has("right")&&i.has("left")&&i.has("up")?[{x:r,y:0},{x:n-r,y:0},{x:n,y:-s/2},{x:n-r,y:-s},{x:r,y:-s},{x:0,y:-s/2}]:i.has("right")&&i.has("left")&&i.has("down")?[{x:0,y:0},{x:r,y:-s},{x:n-r,y:-s},{x:n,y:0}]:i.has("right")&&i.has("up")&&i.has("down")?[{x:0,y:0},{x:n,y:-r},{x:n,y:-s+r},{x:0,y:-s}]:i.has("left")&&i.has("up")&&i.has("down")?[{x:n,y:0},{x:0,y:-r},{x:0,y:-s+r},{x:n,y:-s}]:i.has("right")&&i.has("left")?[{x:r,y:0},{x:r,y:-c},{x:n-r,y:-c},{x:n-r,y:0},{x:n,y:-s/2},{x:n-r,y:-s},{x:n-r,y:-s+c},{x:r,y:-s+c},{x:r,y:-s},{x:0,y:-s/2}]:i.has("up")&&i.has("down")?[{x:n/2,y:0},{x:0,y:-c},{x:r,y:-c},{x:r,y:-s+c},{x:0,y:-s+c},{x:n/2,y:-s},{x:n,y:-s+c},{x:n-r,y:-s+c},{x:n-r,y:-c},{x:n,y:-c}]:i.has("right")&&i.has("up")?[{x:0,y:0},{x:n,y:-r},{x:0,y:-s}]:i.has("right")&&i.has("down")?[{x:0,y:0},{x:n,y:0},{x:0,y:-s}]:i.has("left")&&i.has("up")?[{x:n,y:0},{x:0,y:-r},{x:n,y:-s}]:i.has("left")&&i.has("down")?[{x:n,y:0},{x:0,y:0},{x:n,y:-s}]:i.has("right")?[{x:r,y:-c},{x:r,y:-c},{x:n-r,y:-c},{x:n-r,y:0},{x:n,y:-s/2},{x:n-r,y:-s},{x:n-r,y:-s+c},{x:r,y:-s+c},{x:r,y:-s+c}]:i.has("left")?[{x:r,y:0},{x:r,y:-c},{x:n-r,y:-c},{x:n-r,y:-s+c},{x:r,y:-s+c},{x:r,y:-s},{x:0,y:-s/2}]:i.has("up")?[{x:r,y:-c},{x:r,y:-s+c},{x:0,y:-s+c},{x:n/2,y:-s},{x:n,y:-s+c},{x:n-r,y:-s+c},{x:n-r,y:-c}]:i.has("down")?[{x:n/2,y:0},{x:0,y:-c},{x:r,y:-c},{x:r,y:-s+c},{x:n-r,y:-s+c},{x:n-r,y:-c},{x:n,y:-c}]:[{x:0,y:0}]},"getArrowPoints");function ue(e,t){return e.intersect(t)}g(ue,"intersectNode");var mr=ue;function pe(e,t,a,i){var l=e.x,s=e.y,r=l-i.x,n=s-i.y,c=Math.sqrt(t*t*n*n+a*a*r*r),x=Math.abs(t*a*r/c);i.x0}g(Tt,"sameSign");var kr=be,Lr=ye;function ye(e,t,a){var i=e.x,l=e.y,s=[],r=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY;typeof t.forEach=="function"?t.forEach(function(w){r=Math.min(r,w.x),n=Math.min(n,w.y)}):(r=Math.min(r,t.x),n=Math.min(n,t.y));for(var c=i-e.width/2-r,x=l-e.height/2-n,o=0;o1&&s.sort(function(w,v){var k=w.x-a.x,T=w.y-a.y,C=Math.sqrt(k*k+T*T),B=v.x-a.x,m=v.y-a.y,d=Math.sqrt(B*B+m*m);return C{var a=e.x,i=e.y,l=t.x-a,s=t.y-i,r=e.width/2,n=e.height/2,c,x;return Math.abs(s)*r>Math.abs(l)*n?(s<0&&(n=-n),c=s===0?0:n*l/s,x=n):(l<0&&(r=-r),c=r,x=l===0?0:r*s/l),{x:a+c,y:i+x}},"intersectRect"),vr=Sr,N={node:mr,circle:wr,ellipse:fe,polygon:Lr,rect:vr},M=g((e,t,a,i)=>_(null,null,function*(){let l=O(),s,r=t.useHtmlLabels||F(l);a?s=a:s="node default";let n=e.insert("g").attr("class",s).attr("id",t.domId||t.id),c=n.insert("g").attr("class","label").attr("style",t.labelStyle),x;t.labelText===void 0?x="":x=typeof t.labelText=="string"?t.labelText:t.labelText[0];let o;t.labelType==="markdown"?o=ht(c,kt(Lt(x),l),{useHtmlLabels:r,width:t.width||l.flowchart.wrappingWidth,classes:"markdown-node-label"},l):o=yield X(c,kt(Lt(x),l),t.labelStyle,!1,i);let u=o.getBBox(),y=t.padding/2;if(F(l)){let f=o.children[0],w=D(o);yield Gt(f,x),u=f.getBoundingClientRect(),w.attr("width",u.width),w.attr("height",u.height)}return r?c.attr("transform","translate("+-u.width/2+", "+-u.height/2+")"):c.attr("transform","translate(0, "+-u.height/2+")"),t.centerLabel&&c.attr("transform","translate("+-u.width/2+", "+-u.height/2+")"),c.insert("rect",":first-child"),{shapeSvg:n,bbox:u,halfPadding:y,label:c}}),"labelHelper"),I=g((e,t)=>{let a=t.node().getBBox();e.width=a.width,e.height=a.height},"updateNodeBounds");function V(e,t,a,i){return e.insert("polygon",":first-child").attr("points",i.map(function(l){return l.x+","+l.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-t/2+","+a/2+")")}g(V,"insertPolygonShape");var Er=g((e,t)=>_(null,null,function*(){t.useHtmlLabels||F(O())||(t.centerLabel=!0);let{shapeSvg:i,bbox:l,halfPadding:s}=yield M(e,t,"node "+t.classes,!0);L.info("Classes = ",t.classes);let r=i.insert("rect",":first-child");return r.attr("rx",t.rx).attr("ry",t.ry).attr("x",-l.width/2-s).attr("y",-l.height/2-s).attr("width",l.width+t.padding).attr("height",l.height+t.padding),I(t,r),t.intersect=function(n){return N.rect(t,n)},i}),"note"),_r=Er,ae=g(e=>e?" "+e:"","formatClass"),K=g((e,t)=>`${t||"node default"}${ae(e.classes)} ${ae(e.class)}`,"getClassesFromNode"),se=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=l+s,n=[{x:r/2,y:0},{x:r,y:-r/2},{x:r/2,y:-r},{x:0,y:-r/2}];L.info("Question main (Circle)");let c=V(a,r,r,n);return c.attr("style",t.style),I(t,c),t.intersect=function(x){return L.warn("Intersect called"),N.polygon(t,n,x)},a}),"question"),Dr=g((e,t)=>{let a=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),i=28,l=[{x:0,y:i/2},{x:i/2,y:0},{x:0,y:-i/2},{x:-i/2,y:0}];return a.insert("polygon",":first-child").attr("points",l.map(function(r){return r.x+","+r.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),t.width=28,t.height=28,t.intersect=function(r){return N.circle(t,14,r)},a},"choice"),Tr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=4,s=i.height+t.padding,r=s/l,n=i.width+2*r+t.padding,c=[{x:r,y:0},{x:n-r,y:0},{x:n,y:-s/2},{x:n-r,y:-s},{x:r,y:-s},{x:0,y:-s/2}],x=V(a,n,s,c);return x.attr("style",t.style),I(t,x),t.intersect=function(o){return N.polygon(t,c,o)},a}),"hexagon"),Br=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,void 0,!0),l=2,s=i.height+2*t.padding,r=s/l,n=i.width+2*r+t.padding,c=yr(t.directions,i,t),x=V(a,n,s,c);return x.attr("style",t.style),I(t,x),t.intersect=function(o){return N.polygon(t,c,o)},a}),"block_arrow"),Nr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:-s/2,y:0},{x:l,y:0},{x:l,y:-s},{x:-s/2,y:-s},{x:0,y:-s/2}];return V(a,l,s,r).attr("style",t.style),t.width=l+s,t.height=s,t.intersect=function(c){return N.polygon(t,r,c)},a}),"rect_left_inv_arrow"),Ir=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:-2*s/6,y:0},{x:l-s/6,y:0},{x:l+2*s/6,y:-s},{x:s/6,y:-s}],n=V(a,l,s,r);return n.attr("style",t.style),I(t,n),t.intersect=function(c){return N.polygon(t,r,c)},a}),"lean_right"),Cr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:2*s/6,y:0},{x:l+s/6,y:0},{x:l-2*s/6,y:-s},{x:-s/6,y:-s}],n=V(a,l,s,r);return n.attr("style",t.style),I(t,n),t.intersect=function(c){return N.polygon(t,r,c)},a}),"lean_left"),Or=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:-2*s/6,y:0},{x:l+2*s/6,y:0},{x:l-s/6,y:-s},{x:s/6,y:-s}],n=V(a,l,s,r);return n.attr("style",t.style),I(t,n),t.intersect=function(c){return N.polygon(t,r,c)},a}),"trapezoid"),Rr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:s/6,y:0},{x:l-s/6,y:0},{x:l+2*s/6,y:-s},{x:-2*s/6,y:-s}],n=V(a,l,s,r);return n.attr("style",t.style),I(t,n),t.intersect=function(c){return N.polygon(t,r,c)},a}),"inv_trapezoid"),zr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:0,y:0},{x:l+s/2,y:0},{x:l,y:-s/2},{x:l+s/2,y:-s},{x:0,y:-s}],n=V(a,l,s,r);return n.attr("style",t.style),I(t,n),t.intersect=function(c){return N.polygon(t,r,c)},a}),"rect_right_inv_arrow"),Ar=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=l/2,r=s/(2.5+l/50),n=i.height+r+t.padding,c="M 0,"+r+" a "+s+","+r+" 0,0,0 "+l+" 0 a "+s+","+r+" 0,0,0 "+-l+" 0 l 0,"+n+" a "+s+","+r+" 0,0,0 "+l+" 0 l 0,"+-n,x=a.attr("label-offset-y",r).insert("path",":first-child").attr("style",t.style).attr("d",c).attr("transform","translate("+-l/2+","+-(n/2+r)+")");return I(t,x),t.intersect=function(o){let u=N.rect(t,o),y=u.x-t.x;if(s!=0&&(Math.abs(y)t.height/2-r)){let f=r*r*(1-y*y/(s*s));f!=0&&(f=Math.sqrt(f)),f=r-f,o.y-t.y>0&&(f=-f),u.y+=f}return u},a}),"cylinder"),Mr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i,halfPadding:l}=yield M(e,t,"node "+t.classes+" "+t.class,!0),s=a.insert("rect",":first-child"),r=t.positioned?t.width:i.width+t.padding,n=t.positioned?t.height:i.height+t.padding,c=t.positioned?-r/2:-i.width/2-l,x=t.positioned?-n/2:-i.height/2-l;if(s.attr("class","basic label-container").attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("x",c).attr("y",x).attr("width",r).attr("height",n),t.props){let o=new Set(Object.keys(t.props));t.props.borders&&(pt(s,t.props.borders,r,n),o.delete("borders")),o.forEach(u=>{L.warn(`Unknown node property ${u}`)})}return I(t,s),t.intersect=function(o){return N.rect(t,o)},a}),"rect"),Fr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i,halfPadding:l}=yield M(e,t,"node "+t.classes,!0),s=a.insert("rect",":first-child"),r=t.positioned?t.width:i.width+t.padding,n=t.positioned?t.height:i.height+t.padding,c=t.positioned?-r/2:-i.width/2-l,x=t.positioned?-n/2:-i.height/2-l;if(s.attr("class","basic cluster composite label-container").attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("x",c).attr("y",x).attr("width",r).attr("height",n),t.props){let o=new Set(Object.keys(t.props));t.props.borders&&(pt(s,t.props.borders,r,n),o.delete("borders")),o.forEach(u=>{L.warn(`Unknown node property ${u}`)})}return I(t,s),t.intersect=function(o){return N.rect(t,o)},a}),"composite"),Pr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a}=yield M(e,t,"label",!0);L.trace("Classes = ",t.class);let i=a.insert("rect",":first-child"),l=0,s=0;if(i.attr("width",l).attr("height",s),a.attr("class","label edgeLabel"),t.props){let r=new Set(Object.keys(t.props));t.props.borders&&(pt(i,t.props.borders,l,s),r.delete("borders")),r.forEach(n=>{L.warn(`Unknown node property ${n}`)})}return I(t,i),t.intersect=function(r){return N.rect(t,r)},a}),"labelRect");function pt(e,t,a,i){let l=[],s=g(n=>{l.push(n,0)},"addBorder"),r=g(n=>{l.push(0,n)},"skipBorder");t.includes("t")?(L.debug("add top border"),s(a)):r(a),t.includes("r")?(L.debug("add right border"),s(i)):r(i),t.includes("b")?(L.debug("add bottom border"),s(a)):r(a),t.includes("l")?(L.debug("add left border"),s(i)):r(i),e.attr("stroke-dasharray",l.join(" "))}g(pt,"applyNodePropertyBorders");var Wr=g((e,t)=>_(null,null,function*(){let a;t.classes?a="node "+t.classes:a="node default";let i=e.insert("g").attr("class",a).attr("id",t.domId||t.id),l=i.insert("rect",":first-child"),s=i.insert("line"),r=i.insert("g").attr("class","label"),n=t.labelText.flat?t.labelText.flat():t.labelText,c="";typeof n=="object"?c=n[0]:c=n,L.info("Label text abc79",c,n,typeof n=="object");let x=yield X(r,c,t.labelStyle,!0,!0),o={width:0,height:0};if(F(O())){let v=x.children[0],k=D(x);o=v.getBoundingClientRect(),k.attr("width",o.width),k.attr("height",o.height)}L.info("Text 2",n);let u=n.slice(1,n.length),y=x.getBBox(),f=yield X(r,u.join?u.join("
        "):u,t.labelStyle,!0,!0);if(F(O())){let v=f.children[0],k=D(f);o=v.getBoundingClientRect(),k.attr("width",o.width),k.attr("height",o.height)}let w=t.padding/2;return D(f).attr("transform","translate( "+(o.width>y.width?0:(y.width-o.width)/2)+", "+(y.height+w+5)+")"),D(x).attr("transform","translate( "+(o.width_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.height+t.padding,s=i.width+l/4+t.padding,r=a.insert("rect",":first-child").attr("style",t.style).attr("rx",l/2).attr("ry",l/2).attr("x",-s/2).attr("y",-l/2).attr("width",s).attr("height",l);return I(t,r),t.intersect=function(n){return N.rect(t,n)},a}),"stadium"),Hr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i,halfPadding:l}=yield M(e,t,K(t,void 0),!0),s=a.insert("circle",":first-child");return s.attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("r",i.width/2+l).attr("width",i.width+t.padding).attr("height",i.height+t.padding),L.info("Circle main"),I(t,s),t.intersect=function(r){return L.info("Circle intersect",t,i.width/2+l,r),N.circle(t,i.width/2+l,r)},a}),"circle"),Kr=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i,halfPadding:l}=yield M(e,t,K(t,void 0),!0),s=5,r=a.insert("g",":first-child"),n=r.insert("circle"),c=r.insert("circle");return r.attr("class",t.class),n.attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("r",i.width/2+l+s).attr("width",i.width+t.padding+s*2).attr("height",i.height+t.padding+s*2),c.attr("style",t.style).attr("rx",t.rx).attr("ry",t.ry).attr("r",i.width/2+l).attr("width",i.width+t.padding).attr("height",i.height+t.padding),L.info("DoubleCircle main"),I(t,n),t.intersect=function(x){return L.info("DoubleCircle intersect",t,i.width/2+l+s,x),N.circle(t,i.width/2+l+s,x)},a}),"doublecircle"),Ur=g((e,t)=>_(null,null,function*(){let{shapeSvg:a,bbox:i}=yield M(e,t,K(t,void 0),!0),l=i.width+t.padding,s=i.height+t.padding,r=[{x:0,y:0},{x:l,y:0},{x:l,y:-s},{x:0,y:-s},{x:0,y:0},{x:-8,y:0},{x:l+8,y:0},{x:l+8,y:-s},{x:-8,y:-s},{x:-8,y:0}],n=V(a,l,s,r);return n.attr("style",t.style),I(t,n),t.intersect=function(c){return N.polygon(t,r,c)},a}),"subroutine"),Xr=g((e,t)=>{let a=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),i=a.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),I(t,i),t.intersect=function(l){return N.circle(t,7,l)},a},"start"),ie=g((e,t,a)=>{let i=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),l=70,s=10;a==="LR"&&(l=10,s=70);let r=i.append("rect").attr("x",-1*l/2).attr("y",-1*s/2).attr("width",l).attr("height",s).attr("class","fork-join");return I(t,r),t.height=t.height+t.padding/2,t.width=t.width+t.padding/2,t.intersect=function(n){return N.rect(t,n)},i},"forkJoin"),jr=g((e,t)=>{let a=e.insert("g").attr("class","node default").attr("id",t.domId||t.id),i=a.insert("circle",":first-child"),l=a.insert("circle",":first-child");return l.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),i.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),I(t,l),t.intersect=function(s){return N.circle(t,7,s)},a},"end"),Vr=g((e,t)=>_(null,null,function*(){let a=t.padding/2,i=4,l=8,s;t.classes?s="node "+t.classes:s="node default";let r=e.insert("g").attr("class",s).attr("id",t.domId||t.id),n=r.insert("rect",":first-child"),c=r.insert("line"),x=r.insert("line"),o=0,u=i,y=r.insert("g").attr("class","label"),f=0,w=t.classData.annotations?.[0],v=t.classData.annotations[0]?"\xAB"+t.classData.annotations[0]+"\xBB":"",k=yield X(y,v,t.labelStyle,!0,!0),T=k.getBBox();if(F(O())){let E=k.children[0],h=D(k);T=E.getBoundingClientRect(),h.attr("width",T.width),h.attr("height",T.height)}t.classData.annotations[0]&&(u+=T.height+i,o+=T.width);let C=t.classData.label;t.classData.type!==void 0&&t.classData.type!==""&&(F(O())?C+="<"+t.classData.type+">":C+="<"+t.classData.type+">");let B=yield X(y,C,t.labelStyle,!0,!0);D(B).attr("class","classTitle");let m=B.getBBox();if(F(O())){let E=B.children[0],h=D(B);m=E.getBoundingClientRect(),h.attr("width",m.width),h.attr("height",m.height)}u+=m.height+i,m.width>o&&(o=m.width);let d=[];t.classData.members.forEach(E=>_(null,null,function*(){let h=E.getDisplayDetails(),Y=h.displayText;F(O())&&(Y=Y.replace(//g,">"));let p=yield X(y,Y,h.cssStyle?h.cssStyle:t.labelStyle,!0,!0),z=p.getBBox();if(F(O())){let q=p.children[0],Z=D(p);z=q.getBoundingClientRect(),Z.attr("width",z.width),Z.attr("height",z.height)}z.width>o&&(o=z.width),u+=z.height+i,d.push(p)})),u+=l;let b=[];if(t.classData.methods.forEach(E=>_(null,null,function*(){let h=E.getDisplayDetails(),Y=h.displayText;F(O())&&(Y=Y.replace(//g,">"));let p=yield X(y,Y,h.cssStyle?h.cssStyle:t.labelStyle,!0,!0),z=p.getBBox();if(F(O())){let q=p.children[0],Z=D(p);z=q.getBoundingClientRect(),Z.attr("width",z.width),Z.attr("height",z.height)}z.width>o&&(o=z.width),u+=z.height+i,b.push(p)})),u+=l,w){let E=(o-T.width)/2;D(k).attr("transform","translate( "+(-1*o/2+E)+", "+-1*u/2+")"),f=T.height+i}let S=(o-m.width)/2;return D(B).attr("transform","translate( "+(-1*o/2+S)+", "+(-1*u/2+f)+")"),f+=m.height+i,c.attr("class","divider").attr("x1",-o/2-a).attr("x2",o/2+a).attr("y1",-u/2-a+l+f).attr("y2",-u/2-a+l+f),f+=l,d.forEach(E=>{D(E).attr("transform","translate( "+-o/2+", "+(-1*u/2+f+l/2)+")");let h=E?.getBBox();f+=(h?.height??0)+i}),f+=l,x.attr("class","divider").attr("x1",-o/2-a).attr("x2",o/2+a).attr("y1",-u/2-a+l+f).attr("y2",-u/2-a+l+f),f+=l,b.forEach(E=>{D(E).attr("transform","translate( "+-o/2+", "+(-1*u/2+f)+")");let h=E?.getBBox();f+=(h?.height??0)+i}),n.attr("style",t.style).attr("class","outer title-state").attr("x",-o/2-a).attr("y",-(u/2)-a).attr("width",o+t.padding).attr("height",u+t.padding),I(t,n),t.intersect=function(E){return N.rect(t,E)},r}),"class_box"),ne={rhombus:se,composite:Fr,question:se,rect:Mr,labelRect:Pr,rectWithTitle:Wr,choice:Dr,circle:Hr,doublecircle:Kr,stadium:Yr,hexagon:Tr,block_arrow:Br,rect_left_inv_arrow:Nr,lean_right:Ir,lean_left:Cr,trapezoid:Or,inv_trapezoid:Rr,rect_right_inv_arrow:zr,cylinder:Ar,start:Xr,end:jr,note:_r,subroutine:Ur,fork:ie,join:ie,class_box:Vr},gt={},me=g((e,t,a)=>_(null,null,function*(){let i,l;if(t.link){let s;O().securityLevel==="sandbox"?s="_top":t.linkTarget&&(s=t.linkTarget||"_blank"),i=e.insert("svg:a").attr("xlink:href",t.link).attr("target",s),l=yield ne[t.shape](i,t,a)}else l=yield ne[t.shape](e,t,a),i=l;return t.tooltip&&l.attr("title",t.tooltip),t.class&&l.attr("class","node default "+t.class),gt[t.id]=i,t.haveCallback&>[t.id].attr("class",gt[t.id].attr("class")+" clickable"),i}),"insertNode"),Zr=g(e=>{let t=gt[e.id];L.trace("Transforming node",e.diff,e,"translate("+(e.x-e.width/2-5)+", "+e.width/2+")");let a=8,i=e.diff||0;return e.clusterNode?t.attr("transform","translate("+(e.x+i-e.width/2)+", "+(e.y-e.height/2-a)+")"):t.attr("transform","translate("+e.x+", "+e.y+")"),i},"positionNode");function Ot(e,t,a=!1){let i=e,l="default";(i?.classes?.length||0)>0&&(l=(i?.classes??[]).join(" ")),l=l+" flowchart-label";let s=0,r="",n;switch(i.type){case"round":s=5,r="rect";break;case"composite":s=0,r="composite",n=0;break;case"square":r="rect";break;case"diamond":r="question";break;case"hexagon":r="hexagon";break;case"block_arrow":r="block_arrow";break;case"odd":r="rect_left_inv_arrow";break;case"lean_right":r="lean_right";break;case"lean_left":r="lean_left";break;case"trapezoid":r="trapezoid";break;case"inv_trapezoid":r="inv_trapezoid";break;case"rect_left_inv_arrow":r="rect_left_inv_arrow";break;case"circle":r="circle";break;case"ellipse":r="ellipse";break;case"stadium":r="stadium";break;case"subroutine":r="subroutine";break;case"cylinder":r="cylinder";break;case"group":r="rect";break;case"doublecircle":r="doublecircle";break;default:r="rect"}let c=Vt(i?.styles??[]),x=i.label,o=i.size??{width:0,height:0,x:0,y:0};return{labelStyle:c.labelStyle,shape:r,labelText:x,rx:s,ry:s,class:l,style:c.style,id:i.id,directions:i.directions,width:o.width,height:o.height,x:o.x,y:o.y,positioned:a,intersect:void 0,type:i.type,padding:n??tt()?.block?.padding??0}}g(Ot,"getNodeFromBlock");function we(e,t,a){return _(this,null,function*(){let i=Ot(t,a,!1);if(i.type==="group")return;let l=tt(),s=yield me(e,i,{config:l}),r=s.node().getBBox(),n=a.getBlock(i.id);n.size={width:r.width,height:r.height,x:0,y:0,node:s},a.setBlock(n),s.remove()})}g(we,"calculateBlockSize");function ke(e,t,a){return _(this,null,function*(){let i=Ot(t,a,!0);if(a.getBlock(i.id).type!=="space"){let s=tt();yield me(e,i,{config:s}),t.intersect=i?.intersect,Zr(i)}})}g(ke,"insertBlockPositioned");function ft(e,t,a,i){return _(this,null,function*(){for(let l of t)yield i(e,l,a),l.children&&(yield ft(e,l.children,a,i))})}g(ft,"performOperations");function Le(e,t,a){return _(this,null,function*(){yield ft(e,t,a,we)})}g(Le,"calculateBlockSizes");function Se(e,t,a){return _(this,null,function*(){yield ft(e,t,a,ke)})}g(Se,"insertBlocks");function ve(e,t,a,i,l){return _(this,null,function*(){let s=new qt({multigraph:!0,compound:!0});s.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(let r of a)r.size&&s.setNode(r.id,{width:r.size.width,height:r.size.height,intersect:r.intersect});for(let r of t)if(r.start&&r.end){let n=i.getBlock(r.start),c=i.getBlock(r.end);if(n?.size&&c?.size){let x=n.size,o=c.size,u=[{x:x.x,y:x.y},{x:x.x+(o.x-x.x)/2,y:x.y+(o.y-x.y)/2},{x:o.x,y:o.y}];xr(e,{v:r.start,w:r.end,name:r.id},st(at({},r),{arrowTypeEnd:r.arrowTypeEnd,arrowTypeStart:r.arrowTypeStart,points:u,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"}),void 0,"block",s,l),r.label&&(yield dr(e,st(at({},r),{label:r.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:r.arrowTypeEnd,arrowTypeStart:r.arrowTypeStart,points:u,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"})),ur(st(at({},r),{x:u[1].x,y:u[1].y}),{originalPath:u}))}}})}g(ve,"insertEdges");var Gr=g(function(e,t){return t.db.getClasses()},"getClasses"),qr=g(function(e,t,a,i){return _(this,null,function*(){let{securityLevel:l,block:s}=tt(),r=i.db,n;l==="sandbox"&&(n=D("#i"+t));let c=l==="sandbox"?D(n.nodes()[0].contentDocument.body):D("body"),x=l==="sandbox"?c.select(`[id="${t}"]`):D(`[id="${t}"]`);lr(x,["point","circle","cross"],i.type,t);let u=r.getBlocks(),y=r.getBlocksFlat(),f=r.getEdges(),w=x.insert("g").attr("class","block");yield Le(w,u,r);let v=de(r);if(yield Se(w,u,r),yield ve(w,f,y,r,t),v){let k=v,T=Math.max(1,Math.round(.125*(k.width/k.height))),C=k.height+T+10,B=k.width+10,{useMaxWidth:m}=s;Ht(x,C,B,!!m),L.debug("Here Bounds",v,k),x.attr("viewBox",`${k.x-5} ${k.y-5} ${k.width+10} ${k.height+10}`)}})},"draw"),Jr={draw:qr,getClasses:Gr},ua={parser:Te,db:Ve,renderer:Jr,styles:Ge};export{ua as diagram}; diff --git a/src/google/adk/cli/browser/chunk-27SWUPRL.js b/src/google/adk/cli/browser/chunk-27SWUPRL.js new file mode 100644 index 0000000000..470236667f --- /dev/null +++ b/src/google/adk/cli/browser/chunk-27SWUPRL.js @@ -0,0 +1,261 @@ +import"./chunk-RMXJBC7V.js";var z=class r extends Error{constructor(e,t){var a="KaTeX parse error: "+e,n,l,u=t&&t.loc;if(u&&u.start<=u.end){var h=u.lexer.input;n=u.start,l=u.end,n===h.length?a+=" at end of input: ":a+=" at position "+(n+1)+": ";var c=h.slice(n,l).replace(/[^]/g,"$&\u0332"),v;n>15?v="\u2026"+h.slice(n-15,n):v=h.slice(0,n);var g;l+15r.replace(H1,"-$1").toLowerCase(),N1={"&":"&",">":">","<":"<",'"':""","'":"'"},O1=/[&><"']/g,n0=r=>String(r).replace(O1,e=>N1[e]),Ee=r=>r.type==="ordgroup"||r.type==="color"?r.body.length===1?Ee(r.body[0]):r:r.type==="font"?Ee(r.body):r,F1=new Set(["mathord","textord","atom"]),q0=r=>F1.has(Ee(r).type),L1=r=>{var e=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(r);return e?e[2]!==":"||!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(e[1])?null:e[1].toLowerCase():"_relative"},vt={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:r=>"#"+r},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(r,e)=>(e.push(r),e)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:r=>Math.max(0,r),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:r=>Math.max(0,r),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:r=>Math.max(0,r),cli:"-e, --max-expand ",cliProcessor:r=>r==="Infinity"?1/0:parseInt(r)},globalGroup:{type:"boolean",cli:!1}};function P1(r){if("default"in r)return r.default;var e=r.type,t=Array.isArray(e)?e[0]:e;if(typeof t!="string")return t.enum[0];switch(t){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}var me=class{constructor(e){e===void 0&&(e={}),e=e||{};for(var t of Object.keys(vt)){var a=vt[t],n=e[t];this[t]=n!==void 0?a.processor?a.processor(n):n:P1(a)}}reportNonstrict(e,t,a){var n=this.strict;if(typeof n=="function"&&(n=n(e,t,a)),!(!n||n==="ignore")){if(n===!0||n==="error")throw new z("LaTeX-incompatible input and strict mode is set to 'error': "+(t+" ["+e+"]"),a);n==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(t+" ["+e+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+n+"': "+t+" ["+e+"]"))}}useStrictBehavior(e,t,a){var n=this.strict;if(typeof n=="function")try{n=n(e,t,a)}catch(l){n="error"}return!n||n==="ignore"?!1:n===!0||n==="error"?!0:n==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(t+" ["+e+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+n+"': "+t+" ["+e+"]")),!1)}isTrusted(e){if("url"in e&&e.url&&!e.protocol){var t=L1(e.url);if(t==null)return!1;e.protocol=t}var a=typeof this.trust=="function"?this.trust(e):this.trust;return!!a}},w0=class{constructor(e,t,a){this.id=e,this.size=t,this.cramped=a}sup(){return k0[G1[this.id]]}sub(){return k0[U1[this.id]]}fracNum(){return k0[V1[this.id]]}fracDen(){return k0[X1[this.id]]}cramp(){return k0[Y1[this.id]]}text(){return k0[W1[this.id]]}isTight(){return this.size>=2}},Rt=0,He=1,_0=2,C0=3,ce=4,p0=5,ee=6,s0=7,k0=[new w0(Rt,0,!1),new w0(He,0,!0),new w0(_0,1,!1),new w0(C0,1,!0),new w0(ce,2,!1),new w0(p0,2,!0),new w0(ee,3,!1),new w0(s0,3,!0)],G1=[ce,p0,ce,p0,ee,s0,ee,s0],U1=[p0,p0,p0,p0,s0,s0,s0,s0],V1=[_0,C0,ce,p0,ee,s0,ee,s0],X1=[C0,C0,p0,p0,s0,s0,s0,s0],Y1=[He,He,C0,C0,p0,p0,s0,s0],W1=[Rt,He,_0,C0,_0,C0,_0,C0],H={DISPLAY:k0[Rt],TEXT:k0[_0],SCRIPT:k0[ce],SCRIPTSCRIPT:k0[ee]},pt=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];function $1(r){for(var e=0;e=n[0]&&r<=n[1])return t.name}return null}var Ie=[];pt.forEach(r=>r.blocks.forEach(e=>Ie.push(...e)));function Rr(r){for(var e=0;e=Ie[e]&&r<=Ie[e+1])return!0;return!1}var Q0=80,j1=function(e,t){return"M95,"+(622+e+t)+` +c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 +c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 +c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10 +s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429 +c69,-144,104.5,-217.7,106.5,-221 +l`+e/2.075+" -"+e+` +c5.3,-9.3,12,-14,20,-14 +H400000v`+(40+e)+`H845.2724 +s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7 +c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z +M`+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"},Z1=function(e,t){return"M263,"+(601+e+t)+`c0.7,0,18,39.7,52,119 +c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120 +c340,-704.7,510.7,-1060.3,512,-1067 +l`+e/2.084+" -"+e+` +c4.7,-7.3,11,-11,19,-11 +H40000v`+(40+e)+`H1012.3 +s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232 +c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1 +s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26 +c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z +M`+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"},K1=function(e,t){return"M983 "+(10+e+t)+` +l`+e/3.13+" -"+e+` +c4,-6.7,10,-10,18,-10 H400000v`+(40+e)+` +H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7 +s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744 +c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30 +c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722 +c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5 +c53.7,-170.3,84.5,-266.8,92.5,-289.5z +M`+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"},J1=function(e,t){return"M424,"+(2398+e+t)+` +c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514 +c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20 +s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121 +s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081 +l`+e/4.223+" -"+e+`c4,-6.7,10,-10,18,-10 H400000 +v`+(40+e)+`H1014.6 +s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185 +c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2z M`+(1001+e)+" "+t+` +h400000v`+(40+e)+"h-400000z"},Q1=function(e,t){return"M473,"+(2713+e+t)+` +c339.3,-1799.3,509.3,-2700,510,-2702 l`+e/5.298+" -"+e+` +c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+e)+`H1017.7 +s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200 +c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26 +s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104, +606zM`+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"},_1=function(e){var t=e/2;return"M400000 "+e+" H0 L"+t+" 0 l65 45 L145 "+(e-80)+" H400000z"},ea=function(e,t,a){var n=a-54-t-e;return"M702 "+(e+t)+"H400000"+(40+e)+` +H742v`+n+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1 +h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170 +c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667 +219 661 l218 661zM702 `+t+"H400000v"+(40+e)+"H742z"},ta=function(e,t,a){t=1e3*t;var n="";switch(e){case"sqrtMain":n=j1(t,Q0);break;case"sqrtSize1":n=Z1(t,Q0);break;case"sqrtSize2":n=K1(t,Q0);break;case"sqrtSize3":n=J1(t,Q0);break;case"sqrtSize4":n=Q1(t,Q0);break;case"sqrtTall":n=ea(t,Q0,a)}return n},ra=function(e,t){switch(e){case"\u239C":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"\u2223":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"\u2225":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z"+("M367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z");case"\u239F":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"\u23A2":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"\u23A5":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"\u23AA":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"\u23D0":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"\u2016":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257z"+("M478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z");default:return""}},ar={doubleleftarrow:`M262 157 +l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3 + 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28 + 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5 +c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5 + 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87 +-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7 +-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z +m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l +-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5 + 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88 +-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68 +-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18 +-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782 +c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3 +-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120 + 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 +-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 +c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208 + 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3 + 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202 + l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117 +-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 + 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 + 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 + 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7 +-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,leftgroup:`M400000 80 +H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0 + 435 0h399565z`,leftgroupunder:`M400000 262 +H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219 + 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3 +-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5 +-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7 +-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5 + 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3 +-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7 +-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z +m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333 + 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5 + 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667 +-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12 + 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7 +-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0 +v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5 +-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3 +-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21 + 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:`M40 281 V428 H0 V94 H40 V241 H400000 v40z +M40 281 V428 H0 V94 H40 V241 H400000 v40z`,leftmapsto:`M40 281 V448H0V74H40V241H400000v40z +M40 281 V448H0V74H40V241H400000v40z`,leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23 +-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8 +c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3 + 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:`M0 50 h400000 v40H0z m0 194h40000v40H0z +M0 50 h400000 v40H0z m0 194h40000v40H0z`,midbrace:`M200428 334 +c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14 +-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 + 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 + 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214 +c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 + 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 + 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0 +-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6 +-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z +m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8 +60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8 +-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z +m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2 +c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6 +-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z +m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0 +85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8 +-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z +m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1 +c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128 +-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 + 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 + 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85 +-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 + 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l +-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5 +s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1 +c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 + 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237 +-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0 + 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18 + 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3 +-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2 +-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 + 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11 +-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7 + 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z +m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 + 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5 +-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95 +-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8 + 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 + 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3 +-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z +m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3 + 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0 +-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21 + 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:`M399960 241 V94 h40 V428 h-40 V281 H0 v-40z +M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23 + 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32 +-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142 +-167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40 + 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69 +-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3 +-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19 +-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101 + 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167 +c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 + 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42 + 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333 +-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70 + 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,tilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7 +-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0 + 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0 + 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128 +-68.267.847-113-73.952-191-73.952z`,tilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418 +-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9 + 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114 +c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751 + 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,tilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457 +-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0 + 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697 + 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696 + -338 0-409-156.573-744-156.573z`,tilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345 +-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409 + 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9 + 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409 + -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 +3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 +10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 +-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 +-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 +H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 +c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22 +c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1, +-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202 +c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5 +c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130 +s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47 +121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6 +s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11 +c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z +M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32 +-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 +13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39 +-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5 +-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 +151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17 +c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21 +c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40 +c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z +M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9, +1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7, +-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z +M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`},aa=function(e,t){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+` v1759 h347 v-84 +H403z M403 1759 V0 H319 V1759 v`+t+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+` v1759 H0 v84 H347z +M347 1759 V0 H263 V1759 v`+t+" v1759 h84z";case"vert":return"M145 15 v585 v"+t+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-t+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+t+" v585 h43z";case"doublevert":return"M145 15 v585 v"+t+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-t+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+t+` v585 h43z +M367 15 v585 v`+t+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-t+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+t+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+t+` v1715 h263 v84 H319z +MM319 602 V0 H403 V602 v`+t+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+t+` v1799 H0 v-84 H319z +MM319 602 V0 H403 V602 v`+t+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+` v602 h84z +M403 1759 V0 H319 V1759 v`+t+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+` v602 h84z +M347 1759 V0 h-84 V1759 v`+t+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1 +c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, +-36,557 l0,`+(t+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, +949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 +c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, +-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 +l0,-`+(t+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, +-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3, +63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5 +c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(t+9)+` +c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664 +c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11 +c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 +c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 +l0,-`+(t+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, +-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}},L0=class{constructor(e){this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return this.classes.includes(e)}toNode(){for(var e=document.createDocumentFragment(),t=0;tt.toText();return this.children.map(e).join("")}},gt={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},na={ex:!0,em:!0,mu:!0},Er=function(e){return typeof e!="string"&&(e=e.unit),e in gt||e in na||e==="ex"},J=function(e,t){var a;if(e.unit in gt)a=gt[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if(e.unit==="mu")a=t.fontMetrics().cssEmPerMu;else{var n;if(t.style.isTight()?n=t.havingStyle(t.style.text()):n=t,e.unit==="ex")a=n.fontMetrics().xHeight;else if(e.unit==="em")a=n.fontMetrics().quad;else throw new z("Invalid unit: '"+e.unit+"'");n!==t&&(a*=n.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*a,t.maxSize)},M=function(e){return+e.toFixed(4)+"em"},P0=function(e){return e.filter(t=>t).join(" ")},Ir=function(e,t,a){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=a||{},t){t.style.isTight()&&this.classes.push("mtight");var n=t.getColor();n&&(this.style.color=n)}},Hr=function(e){var t=document.createElement(e);t.className=P0(this.classes);for(var a of Object.keys(this.style))t.style[a]=this.style[a];for(var n of Object.keys(this.attributes))t.setAttribute(n,this.attributes[n]);for(var l=0;l/=\x00-\x1f]/,Nr=function(e){var t="<"+e;this.classes.length&&(t+=' class="'+n0(P0(this.classes))+'"');var a="";for(var n of Object.keys(this.style))a+=qt(n)+":"+this.style[n]+";";a&&(t+=' style="'+n0(a)+'"');for(var l of Object.keys(this.attributes)){if(ia.test(l))throw new z("Invalid attribute name '"+l+"'");t+=" "+l+'="'+n0(this.attributes[l])+'"'}t+=">";for(var u=0;u",t},G0=class{constructor(e,t,a,n){Ir.call(this,e,a,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return this.classes.includes(e)}toNode(){return Hr.call(this,"span")}toMarkup(){return Nr.call(this,"span")}},te=class{constructor(e,t,a,n){Ir.call(this,t,n),this.children=a||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return this.classes.includes(e)}toNode(){return Hr.call(this,"a")}toMarkup(){return Nr.call(this,"a")}},bt=class{constructor(e,t,a){this.alt=t,this.src=e,this.classes=["mord"],this.height=0,this.depth=0,this.maxFontSize=0,this.style=a}hasClass(e){return this.classes.includes(e)}toNode(){var e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(var t of Object.keys(this.style))e.style[t]=this.style[t];return e}toMarkup(){var e=''+n0(this.alt)+'0&&(t=document.createElement("span"),t.style.marginRight=M(this.italic)),this.classes.length>0&&(t=t||document.createElement("span"),t.className=P0(this.classes));for(var a of Object.keys(this.style))t=t||document.createElement("span"),t.style[a]=this.style[a];return t?(t.appendChild(e),t):e}toMarkup(){var e=!1,t="0&&(a+="margin-right:"+this.italic+"em;");for(var n of Object.keys(this.style))a+=qt(n)+":"+this.style[n]+";";a&&(e=!0,t+=' style="'+n0(a)+'"');var l=n0(this.text);return e?(t+=">",t+=l,t+="",t):l}},x0=class{constructor(e,t){this.children=e||[],this.attributes=t||{}}toNode(){var e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"svg");for(var a of Object.keys(this.attributes))t.setAttribute(a,this.attributes[a]);for(var n=0;n':''}},de=class{constructor(e){this.attributes=e||{}}toNode(){var e="http://www.w3.org/2000/svg",t=document.createElementNS(e,"line");for(var a of Object.keys(this.attributes))t.setAttribute(a,this.attributes[a]);return t}toMarkup(){var e=" but got "+String(r)+".")}var oa=r=>r instanceof G0||r instanceof te||r instanceof L0,S0={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},ke={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},nr={\u00C5:"A",\u00D0:"D",\u00DE:"o",\u00E5:"a",\u00F0:"d",\u00FE:"o",\u0410:"A",\u0411:"B",\u0412:"B",\u0413:"F",\u0414:"A",\u0415:"E",\u0416:"K",\u0417:"3",\u0418:"N",\u0419:"N",\u041A:"K",\u041B:"N",\u041C:"M",\u041D:"H",\u041E:"O",\u041F:"N",\u0420:"P",\u0421:"C",\u0422:"T",\u0423:"y",\u0424:"O",\u0425:"X",\u0426:"U",\u0427:"h",\u0428:"W",\u0429:"W",\u042A:"B",\u042B:"X",\u042C:"B",\u042D:"3",\u042E:"X",\u042F:"R",\u0430:"a",\u0431:"b",\u0432:"a",\u0433:"r",\u0434:"y",\u0435:"e",\u0436:"m",\u0437:"e",\u0438:"n",\u0439:"n",\u043A:"n",\u043B:"n",\u043C:"m",\u043D:"n",\u043E:"o",\u043F:"n",\u0440:"p",\u0441:"c",\u0442:"o",\u0443:"y",\u0444:"b",\u0445:"x",\u0446:"n",\u0447:"n",\u0448:"w",\u0449:"w",\u044A:"a",\u044B:"m",\u044C:"a",\u044D:"e",\u044E:"m",\u044F:"r"};function ha(r,e){S0[r]=e}function Et(r,e,t){if(!S0[e])throw new Error("Font metrics not found for font: "+e+".");var a=r.charCodeAt(0),n=S0[e][a];if(!n&&r[0]in nr&&(a=nr[r[0]].charCodeAt(0),n=S0[e][a]),!n&&t==="text"&&Rr(a)&&(n=S0[e][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var tt={};function ma(r){var e;if(r>=5?e=0:r>=3?e=1:e=2,!tt[e]){var t=tt[e]={cssEmPerMu:ke.quad[e]/18};for(var a in ke)ke.hasOwnProperty(a)&&(t[a]=ke[a][e])}return tt[e]}var ca={bin:1,close:1,inner:1,open:1,punct:1,rel:1},da={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},$={math:{},text:{}};function i(r,e,t,a,n,l){$[r][n]={font:e,group:t,replace:a},l&&a&&($[r][a]=$[r][n])}var s="math",w="text",o="main",d="ams",j="accent-token",D="bin",o0="close",ne="inner",R="mathord",e0="op-token",f0="open",Ve="punct",f="rel",R0="spacing",p="textord";i(s,o,f,"\u2261","\\equiv",!0);i(s,o,f,"\u227A","\\prec",!0);i(s,o,f,"\u227B","\\succ",!0);i(s,o,f,"\u223C","\\sim",!0);i(s,o,f,"\u22A5","\\perp");i(s,o,f,"\u2AAF","\\preceq",!0);i(s,o,f,"\u2AB0","\\succeq",!0);i(s,o,f,"\u2243","\\simeq",!0);i(s,o,f,"\u2223","\\mid",!0);i(s,o,f,"\u226A","\\ll",!0);i(s,o,f,"\u226B","\\gg",!0);i(s,o,f,"\u224D","\\asymp",!0);i(s,o,f,"\u2225","\\parallel");i(s,o,f,"\u22C8","\\bowtie",!0);i(s,o,f,"\u2323","\\smile",!0);i(s,o,f,"\u2291","\\sqsubseteq",!0);i(s,o,f,"\u2292","\\sqsupseteq",!0);i(s,o,f,"\u2250","\\doteq",!0);i(s,o,f,"\u2322","\\frown",!0);i(s,o,f,"\u220B","\\ni",!0);i(s,o,f,"\u221D","\\propto",!0);i(s,o,f,"\u22A2","\\vdash",!0);i(s,o,f,"\u22A3","\\dashv",!0);i(s,o,f,"\u220B","\\owns");i(s,o,Ve,".","\\ldotp");i(s,o,Ve,"\u22C5","\\cdotp");i(s,o,p,"#","\\#");i(w,o,p,"#","\\#");i(s,o,p,"&","\\&");i(w,o,p,"&","\\&");i(s,o,p,"\u2135","\\aleph",!0);i(s,o,p,"\u2200","\\forall",!0);i(s,o,p,"\u210F","\\hbar",!0);i(s,o,p,"\u2203","\\exists",!0);i(s,o,p,"\u2207","\\nabla",!0);i(s,o,p,"\u266D","\\flat",!0);i(s,o,p,"\u2113","\\ell",!0);i(s,o,p,"\u266E","\\natural",!0);i(s,o,p,"\u2663","\\clubsuit",!0);i(s,o,p,"\u2118","\\wp",!0);i(s,o,p,"\u266F","\\sharp",!0);i(s,o,p,"\u2662","\\diamondsuit",!0);i(s,o,p,"\u211C","\\Re",!0);i(s,o,p,"\u2661","\\heartsuit",!0);i(s,o,p,"\u2111","\\Im",!0);i(s,o,p,"\u2660","\\spadesuit",!0);i(s,o,p,"\xA7","\\S",!0);i(w,o,p,"\xA7","\\S");i(s,o,p,"\xB6","\\P",!0);i(w,o,p,"\xB6","\\P");i(s,o,p,"\u2020","\\dag");i(w,o,p,"\u2020","\\dag");i(w,o,p,"\u2020","\\textdagger");i(s,o,p,"\u2021","\\ddag");i(w,o,p,"\u2021","\\ddag");i(w,o,p,"\u2021","\\textdaggerdbl");i(s,o,o0,"\u23B1","\\rmoustache",!0);i(s,o,f0,"\u23B0","\\lmoustache",!0);i(s,o,o0,"\u27EF","\\rgroup",!0);i(s,o,f0,"\u27EE","\\lgroup",!0);i(s,o,D,"\u2213","\\mp",!0);i(s,o,D,"\u2296","\\ominus",!0);i(s,o,D,"\u228E","\\uplus",!0);i(s,o,D,"\u2293","\\sqcap",!0);i(s,o,D,"\u2217","\\ast");i(s,o,D,"\u2294","\\sqcup",!0);i(s,o,D,"\u25EF","\\bigcirc",!0);i(s,o,D,"\u2219","\\bullet",!0);i(s,o,D,"\u2021","\\ddagger");i(s,o,D,"\u2240","\\wr",!0);i(s,o,D,"\u2A3F","\\amalg");i(s,o,D,"&","\\And");i(s,o,f,"\u27F5","\\longleftarrow",!0);i(s,o,f,"\u21D0","\\Leftarrow",!0);i(s,o,f,"\u27F8","\\Longleftarrow",!0);i(s,o,f,"\u27F6","\\longrightarrow",!0);i(s,o,f,"\u21D2","\\Rightarrow",!0);i(s,o,f,"\u27F9","\\Longrightarrow",!0);i(s,o,f,"\u2194","\\leftrightarrow",!0);i(s,o,f,"\u27F7","\\longleftrightarrow",!0);i(s,o,f,"\u21D4","\\Leftrightarrow",!0);i(s,o,f,"\u27FA","\\Longleftrightarrow",!0);i(s,o,f,"\u21A6","\\mapsto",!0);i(s,o,f,"\u27FC","\\longmapsto",!0);i(s,o,f,"\u2197","\\nearrow",!0);i(s,o,f,"\u21A9","\\hookleftarrow",!0);i(s,o,f,"\u21AA","\\hookrightarrow",!0);i(s,o,f,"\u2198","\\searrow",!0);i(s,o,f,"\u21BC","\\leftharpoonup",!0);i(s,o,f,"\u21C0","\\rightharpoonup",!0);i(s,o,f,"\u2199","\\swarrow",!0);i(s,o,f,"\u21BD","\\leftharpoondown",!0);i(s,o,f,"\u21C1","\\rightharpoondown",!0);i(s,o,f,"\u2196","\\nwarrow",!0);i(s,o,f,"\u21CC","\\rightleftharpoons",!0);i(s,d,f,"\u226E","\\nless",!0);i(s,d,f,"\uE010","\\@nleqslant");i(s,d,f,"\uE011","\\@nleqq");i(s,d,f,"\u2A87","\\lneq",!0);i(s,d,f,"\u2268","\\lneqq",!0);i(s,d,f,"\uE00C","\\@lvertneqq");i(s,d,f,"\u22E6","\\lnsim",!0);i(s,d,f,"\u2A89","\\lnapprox",!0);i(s,d,f,"\u2280","\\nprec",!0);i(s,d,f,"\u22E0","\\npreceq",!0);i(s,d,f,"\u22E8","\\precnsim",!0);i(s,d,f,"\u2AB9","\\precnapprox",!0);i(s,d,f,"\u2241","\\nsim",!0);i(s,d,f,"\uE006","\\@nshortmid");i(s,d,f,"\u2224","\\nmid",!0);i(s,d,f,"\u22AC","\\nvdash",!0);i(s,d,f,"\u22AD","\\nvDash",!0);i(s,d,f,"\u22EA","\\ntriangleleft");i(s,d,f,"\u22EC","\\ntrianglelefteq",!0);i(s,d,f,"\u228A","\\subsetneq",!0);i(s,d,f,"\uE01A","\\@varsubsetneq");i(s,d,f,"\u2ACB","\\subsetneqq",!0);i(s,d,f,"\uE017","\\@varsubsetneqq");i(s,d,f,"\u226F","\\ngtr",!0);i(s,d,f,"\uE00F","\\@ngeqslant");i(s,d,f,"\uE00E","\\@ngeqq");i(s,d,f,"\u2A88","\\gneq",!0);i(s,d,f,"\u2269","\\gneqq",!0);i(s,d,f,"\uE00D","\\@gvertneqq");i(s,d,f,"\u22E7","\\gnsim",!0);i(s,d,f,"\u2A8A","\\gnapprox",!0);i(s,d,f,"\u2281","\\nsucc",!0);i(s,d,f,"\u22E1","\\nsucceq",!0);i(s,d,f,"\u22E9","\\succnsim",!0);i(s,d,f,"\u2ABA","\\succnapprox",!0);i(s,d,f,"\u2246","\\ncong",!0);i(s,d,f,"\uE007","\\@nshortparallel");i(s,d,f,"\u2226","\\nparallel",!0);i(s,d,f,"\u22AF","\\nVDash",!0);i(s,d,f,"\u22EB","\\ntriangleright");i(s,d,f,"\u22ED","\\ntrianglerighteq",!0);i(s,d,f,"\uE018","\\@nsupseteqq");i(s,d,f,"\u228B","\\supsetneq",!0);i(s,d,f,"\uE01B","\\@varsupsetneq");i(s,d,f,"\u2ACC","\\supsetneqq",!0);i(s,d,f,"\uE019","\\@varsupsetneqq");i(s,d,f,"\u22AE","\\nVdash",!0);i(s,d,f,"\u2AB5","\\precneqq",!0);i(s,d,f,"\u2AB6","\\succneqq",!0);i(s,d,f,"\uE016","\\@nsubseteqq");i(s,d,D,"\u22B4","\\unlhd");i(s,d,D,"\u22B5","\\unrhd");i(s,d,f,"\u219A","\\nleftarrow",!0);i(s,d,f,"\u219B","\\nrightarrow",!0);i(s,d,f,"\u21CD","\\nLeftarrow",!0);i(s,d,f,"\u21CF","\\nRightarrow",!0);i(s,d,f,"\u21AE","\\nleftrightarrow",!0);i(s,d,f,"\u21CE","\\nLeftrightarrow",!0);i(s,d,f,"\u25B3","\\vartriangle");i(s,d,p,"\u210F","\\hslash");i(s,d,p,"\u25BD","\\triangledown");i(s,d,p,"\u25CA","\\lozenge");i(s,d,p,"\u24C8","\\circledS");i(s,d,p,"\xAE","\\circledR");i(w,d,p,"\xAE","\\circledR");i(s,d,p,"\u2221","\\measuredangle",!0);i(s,d,p,"\u2204","\\nexists");i(s,d,p,"\u2127","\\mho");i(s,d,p,"\u2132","\\Finv",!0);i(s,d,p,"\u2141","\\Game",!0);i(s,d,p,"\u2035","\\backprime");i(s,d,p,"\u25B2","\\blacktriangle");i(s,d,p,"\u25BC","\\blacktriangledown");i(s,d,p,"\u25A0","\\blacksquare");i(s,d,p,"\u29EB","\\blacklozenge");i(s,d,p,"\u2605","\\bigstar");i(s,d,p,"\u2222","\\sphericalangle",!0);i(s,d,p,"\u2201","\\complement",!0);i(s,d,p,"\xF0","\\eth",!0);i(w,o,p,"\xF0","\xF0");i(s,d,p,"\u2571","\\diagup");i(s,d,p,"\u2572","\\diagdown");i(s,d,p,"\u25A1","\\square");i(s,d,p,"\u25A1","\\Box");i(s,d,p,"\u25CA","\\Diamond");i(s,d,p,"\xA5","\\yen",!0);i(w,d,p,"\xA5","\\yen",!0);i(s,d,p,"\u2713","\\checkmark",!0);i(w,d,p,"\u2713","\\checkmark");i(s,d,p,"\u2136","\\beth",!0);i(s,d,p,"\u2138","\\daleth",!0);i(s,d,p,"\u2137","\\gimel",!0);i(s,d,p,"\u03DD","\\digamma",!0);i(s,d,p,"\u03F0","\\varkappa");i(s,d,f0,"\u250C","\\@ulcorner",!0);i(s,d,o0,"\u2510","\\@urcorner",!0);i(s,d,f0,"\u2514","\\@llcorner",!0);i(s,d,o0,"\u2518","\\@lrcorner",!0);i(s,d,f,"\u2266","\\leqq",!0);i(s,d,f,"\u2A7D","\\leqslant",!0);i(s,d,f,"\u2A95","\\eqslantless",!0);i(s,d,f,"\u2272","\\lesssim",!0);i(s,d,f,"\u2A85","\\lessapprox",!0);i(s,d,f,"\u224A","\\approxeq",!0);i(s,d,D,"\u22D6","\\lessdot");i(s,d,f,"\u22D8","\\lll",!0);i(s,d,f,"\u2276","\\lessgtr",!0);i(s,d,f,"\u22DA","\\lesseqgtr",!0);i(s,d,f,"\u2A8B","\\lesseqqgtr",!0);i(s,d,f,"\u2251","\\doteqdot");i(s,d,f,"\u2253","\\risingdotseq",!0);i(s,d,f,"\u2252","\\fallingdotseq",!0);i(s,d,f,"\u223D","\\backsim",!0);i(s,d,f,"\u22CD","\\backsimeq",!0);i(s,d,f,"\u2AC5","\\subseteqq",!0);i(s,d,f,"\u22D0","\\Subset",!0);i(s,d,f,"\u228F","\\sqsubset",!0);i(s,d,f,"\u227C","\\preccurlyeq",!0);i(s,d,f,"\u22DE","\\curlyeqprec",!0);i(s,d,f,"\u227E","\\precsim",!0);i(s,d,f,"\u2AB7","\\precapprox",!0);i(s,d,f,"\u22B2","\\vartriangleleft");i(s,d,f,"\u22B4","\\trianglelefteq");i(s,d,f,"\u22A8","\\vDash",!0);i(s,d,f,"\u22AA","\\Vvdash",!0);i(s,d,f,"\u2323","\\smallsmile");i(s,d,f,"\u2322","\\smallfrown");i(s,d,f,"\u224F","\\bumpeq",!0);i(s,d,f,"\u224E","\\Bumpeq",!0);i(s,d,f,"\u2267","\\geqq",!0);i(s,d,f,"\u2A7E","\\geqslant",!0);i(s,d,f,"\u2A96","\\eqslantgtr",!0);i(s,d,f,"\u2273","\\gtrsim",!0);i(s,d,f,"\u2A86","\\gtrapprox",!0);i(s,d,D,"\u22D7","\\gtrdot");i(s,d,f,"\u22D9","\\ggg",!0);i(s,d,f,"\u2277","\\gtrless",!0);i(s,d,f,"\u22DB","\\gtreqless",!0);i(s,d,f,"\u2A8C","\\gtreqqless",!0);i(s,d,f,"\u2256","\\eqcirc",!0);i(s,d,f,"\u2257","\\circeq",!0);i(s,d,f,"\u225C","\\triangleq",!0);i(s,d,f,"\u223C","\\thicksim");i(s,d,f,"\u2248","\\thickapprox");i(s,d,f,"\u2AC6","\\supseteqq",!0);i(s,d,f,"\u22D1","\\Supset",!0);i(s,d,f,"\u2290","\\sqsupset",!0);i(s,d,f,"\u227D","\\succcurlyeq",!0);i(s,d,f,"\u22DF","\\curlyeqsucc",!0);i(s,d,f,"\u227F","\\succsim",!0);i(s,d,f,"\u2AB8","\\succapprox",!0);i(s,d,f,"\u22B3","\\vartriangleright");i(s,d,f,"\u22B5","\\trianglerighteq");i(s,d,f,"\u22A9","\\Vdash",!0);i(s,d,f,"\u2223","\\shortmid");i(s,d,f,"\u2225","\\shortparallel");i(s,d,f,"\u226C","\\between",!0);i(s,d,f,"\u22D4","\\pitchfork",!0);i(s,d,f,"\u221D","\\varpropto");i(s,d,f,"\u25C0","\\blacktriangleleft");i(s,d,f,"\u2234","\\therefore",!0);i(s,d,f,"\u220D","\\backepsilon");i(s,d,f,"\u25B6","\\blacktriangleright");i(s,d,f,"\u2235","\\because",!0);i(s,d,f,"\u22D8","\\llless");i(s,d,f,"\u22D9","\\gggtr");i(s,d,D,"\u22B2","\\lhd");i(s,d,D,"\u22B3","\\rhd");i(s,d,f,"\u2242","\\eqsim",!0);i(s,o,f,"\u22C8","\\Join");i(s,d,f,"\u2251","\\Doteq",!0);i(s,d,D,"\u2214","\\dotplus",!0);i(s,d,D,"\u2216","\\smallsetminus");i(s,d,D,"\u22D2","\\Cap",!0);i(s,d,D,"\u22D3","\\Cup",!0);i(s,d,D,"\u2A5E","\\doublebarwedge",!0);i(s,d,D,"\u229F","\\boxminus",!0);i(s,d,D,"\u229E","\\boxplus",!0);i(s,d,D,"\u22C7","\\divideontimes",!0);i(s,d,D,"\u22C9","\\ltimes",!0);i(s,d,D,"\u22CA","\\rtimes",!0);i(s,d,D,"\u22CB","\\leftthreetimes",!0);i(s,d,D,"\u22CC","\\rightthreetimes",!0);i(s,d,D,"\u22CF","\\curlywedge",!0);i(s,d,D,"\u22CE","\\curlyvee",!0);i(s,d,D,"\u229D","\\circleddash",!0);i(s,d,D,"\u229B","\\circledast",!0);i(s,d,D,"\u22C5","\\centerdot");i(s,d,D,"\u22BA","\\intercal",!0);i(s,d,D,"\u22D2","\\doublecap");i(s,d,D,"\u22D3","\\doublecup");i(s,d,D,"\u22A0","\\boxtimes",!0);i(s,d,f,"\u21E2","\\dashrightarrow",!0);i(s,d,f,"\u21E0","\\dashleftarrow",!0);i(s,d,f,"\u21C7","\\leftleftarrows",!0);i(s,d,f,"\u21C6","\\leftrightarrows",!0);i(s,d,f,"\u21DA","\\Lleftarrow",!0);i(s,d,f,"\u219E","\\twoheadleftarrow",!0);i(s,d,f,"\u21A2","\\leftarrowtail",!0);i(s,d,f,"\u21AB","\\looparrowleft",!0);i(s,d,f,"\u21CB","\\leftrightharpoons",!0);i(s,d,f,"\u21B6","\\curvearrowleft",!0);i(s,d,f,"\u21BA","\\circlearrowleft",!0);i(s,d,f,"\u21B0","\\Lsh",!0);i(s,d,f,"\u21C8","\\upuparrows",!0);i(s,d,f,"\u21BF","\\upharpoonleft",!0);i(s,d,f,"\u21C3","\\downharpoonleft",!0);i(s,o,f,"\u22B6","\\origof",!0);i(s,o,f,"\u22B7","\\imageof",!0);i(s,d,f,"\u22B8","\\multimap",!0);i(s,d,f,"\u21AD","\\leftrightsquigarrow",!0);i(s,d,f,"\u21C9","\\rightrightarrows",!0);i(s,d,f,"\u21C4","\\rightleftarrows",!0);i(s,d,f,"\u21A0","\\twoheadrightarrow",!0);i(s,d,f,"\u21A3","\\rightarrowtail",!0);i(s,d,f,"\u21AC","\\looparrowright",!0);i(s,d,f,"\u21B7","\\curvearrowright",!0);i(s,d,f,"\u21BB","\\circlearrowright",!0);i(s,d,f,"\u21B1","\\Rsh",!0);i(s,d,f,"\u21CA","\\downdownarrows",!0);i(s,d,f,"\u21BE","\\upharpoonright",!0);i(s,d,f,"\u21C2","\\downharpoonright",!0);i(s,d,f,"\u21DD","\\rightsquigarrow",!0);i(s,d,f,"\u21DD","\\leadsto");i(s,d,f,"\u21DB","\\Rrightarrow",!0);i(s,d,f,"\u21BE","\\restriction");i(s,o,p,"\u2018","`");i(s,o,p,"$","\\$");i(w,o,p,"$","\\$");i(w,o,p,"$","\\textdollar");i(s,o,p,"%","\\%");i(w,o,p,"%","\\%");i(s,o,p,"_","\\_");i(w,o,p,"_","\\_");i(w,o,p,"_","\\textunderscore");i(s,o,p,"\u2220","\\angle",!0);i(s,o,p,"\u221E","\\infty",!0);i(s,o,p,"\u2032","\\prime");i(s,o,p,"\u25B3","\\triangle");i(s,o,p,"\u0393","\\Gamma",!0);i(s,o,p,"\u0394","\\Delta",!0);i(s,o,p,"\u0398","\\Theta",!0);i(s,o,p,"\u039B","\\Lambda",!0);i(s,o,p,"\u039E","\\Xi",!0);i(s,o,p,"\u03A0","\\Pi",!0);i(s,o,p,"\u03A3","\\Sigma",!0);i(s,o,p,"\u03A5","\\Upsilon",!0);i(s,o,p,"\u03A6","\\Phi",!0);i(s,o,p,"\u03A8","\\Psi",!0);i(s,o,p,"\u03A9","\\Omega",!0);i(s,o,p,"A","\u0391");i(s,o,p,"B","\u0392");i(s,o,p,"E","\u0395");i(s,o,p,"Z","\u0396");i(s,o,p,"H","\u0397");i(s,o,p,"I","\u0399");i(s,o,p,"K","\u039A");i(s,o,p,"M","\u039C");i(s,o,p,"N","\u039D");i(s,o,p,"O","\u039F");i(s,o,p,"P","\u03A1");i(s,o,p,"T","\u03A4");i(s,o,p,"X","\u03A7");i(s,o,p,"\xAC","\\neg",!0);i(s,o,p,"\xAC","\\lnot");i(s,o,p,"\u22A4","\\top");i(s,o,p,"\u22A5","\\bot");i(s,o,p,"\u2205","\\emptyset");i(s,d,p,"\u2205","\\varnothing");i(s,o,R,"\u03B1","\\alpha",!0);i(s,o,R,"\u03B2","\\beta",!0);i(s,o,R,"\u03B3","\\gamma",!0);i(s,o,R,"\u03B4","\\delta",!0);i(s,o,R,"\u03F5","\\epsilon",!0);i(s,o,R,"\u03B6","\\zeta",!0);i(s,o,R,"\u03B7","\\eta",!0);i(s,o,R,"\u03B8","\\theta",!0);i(s,o,R,"\u03B9","\\iota",!0);i(s,o,R,"\u03BA","\\kappa",!0);i(s,o,R,"\u03BB","\\lambda",!0);i(s,o,R,"\u03BC","\\mu",!0);i(s,o,R,"\u03BD","\\nu",!0);i(s,o,R,"\u03BE","\\xi",!0);i(s,o,R,"\u03BF","\\omicron",!0);i(s,o,R,"\u03C0","\\pi",!0);i(s,o,R,"\u03C1","\\rho",!0);i(s,o,R,"\u03C3","\\sigma",!0);i(s,o,R,"\u03C4","\\tau",!0);i(s,o,R,"\u03C5","\\upsilon",!0);i(s,o,R,"\u03D5","\\phi",!0);i(s,o,R,"\u03C7","\\chi",!0);i(s,o,R,"\u03C8","\\psi",!0);i(s,o,R,"\u03C9","\\omega",!0);i(s,o,R,"\u03B5","\\varepsilon",!0);i(s,o,R,"\u03D1","\\vartheta",!0);i(s,o,R,"\u03D6","\\varpi",!0);i(s,o,R,"\u03F1","\\varrho",!0);i(s,o,R,"\u03C2","\\varsigma",!0);i(s,o,R,"\u03C6","\\varphi",!0);i(s,o,D,"\u2217","*",!0);i(s,o,D,"+","+");i(s,o,D,"\u2212","-",!0);i(s,o,D,"\u22C5","\\cdot",!0);i(s,o,D,"\u2218","\\circ",!0);i(s,o,D,"\xF7","\\div",!0);i(s,o,D,"\xB1","\\pm",!0);i(s,o,D,"\xD7","\\times",!0);i(s,o,D,"\u2229","\\cap",!0);i(s,o,D,"\u222A","\\cup",!0);i(s,o,D,"\u2216","\\setminus",!0);i(s,o,D,"\u2227","\\land");i(s,o,D,"\u2228","\\lor");i(s,o,D,"\u2227","\\wedge",!0);i(s,o,D,"\u2228","\\vee",!0);i(s,o,p,"\u221A","\\surd");i(s,o,f0,"\u27E8","\\langle",!0);i(s,o,f0,"\u2223","\\lvert");i(s,o,f0,"\u2225","\\lVert");i(s,o,o0,"?","?");i(s,o,o0,"!","!");i(s,o,o0,"\u27E9","\\rangle",!0);i(s,o,o0,"\u2223","\\rvert");i(s,o,o0,"\u2225","\\rVert");i(s,o,f,"=","=");i(s,o,f,":",":");i(s,o,f,"\u2248","\\approx",!0);i(s,o,f,"\u2245","\\cong",!0);i(s,o,f,"\u2265","\\ge");i(s,o,f,"\u2265","\\geq",!0);i(s,o,f,"\u2190","\\gets");i(s,o,f,">","\\gt",!0);i(s,o,f,"\u2208","\\in",!0);i(s,o,f,"\uE020","\\@not");i(s,o,f,"\u2282","\\subset",!0);i(s,o,f,"\u2283","\\supset",!0);i(s,o,f,"\u2286","\\subseteq",!0);i(s,o,f,"\u2287","\\supseteq",!0);i(s,d,f,"\u2288","\\nsubseteq",!0);i(s,d,f,"\u2289","\\nsupseteq",!0);i(s,o,f,"\u22A8","\\models");i(s,o,f,"\u2190","\\leftarrow",!0);i(s,o,f,"\u2264","\\le");i(s,o,f,"\u2264","\\leq",!0);i(s,o,f,"<","\\lt",!0);i(s,o,f,"\u2192","\\rightarrow",!0);i(s,o,f,"\u2192","\\to");i(s,d,f,"\u2271","\\ngeq",!0);i(s,d,f,"\u2270","\\nleq",!0);i(s,o,R0,"\xA0","\\ ");i(s,o,R0,"\xA0","\\space");i(s,o,R0,"\xA0","\\nobreakspace");i(w,o,R0,"\xA0","\\ ");i(w,o,R0,"\xA0"," ");i(w,o,R0,"\xA0","\\space");i(w,o,R0,"\xA0","\\nobreakspace");i(s,o,R0,null,"\\nobreak");i(s,o,R0,null,"\\allowbreak");i(s,o,Ve,",",",");i(s,o,Ve,";",";");i(s,d,D,"\u22BC","\\barwedge",!0);i(s,d,D,"\u22BB","\\veebar",!0);i(s,o,D,"\u2299","\\odot",!0);i(s,o,D,"\u2295","\\oplus",!0);i(s,o,D,"\u2297","\\otimes",!0);i(s,o,p,"\u2202","\\partial",!0);i(s,o,D,"\u2298","\\oslash",!0);i(s,d,D,"\u229A","\\circledcirc",!0);i(s,d,D,"\u22A1","\\boxdot",!0);i(s,o,D,"\u25B3","\\bigtriangleup");i(s,o,D,"\u25BD","\\bigtriangledown");i(s,o,D,"\u2020","\\dagger");i(s,o,D,"\u22C4","\\diamond");i(s,o,D,"\u22C6","\\star");i(s,o,D,"\u25C3","\\triangleleft");i(s,o,D,"\u25B9","\\triangleright");i(s,o,f0,"{","\\{");i(w,o,p,"{","\\{");i(w,o,p,"{","\\textbraceleft");i(s,o,o0,"}","\\}");i(w,o,p,"}","\\}");i(w,o,p,"}","\\textbraceright");i(s,o,f0,"{","\\lbrace");i(s,o,o0,"}","\\rbrace");i(s,o,f0,"[","\\lbrack",!0);i(w,o,p,"[","\\lbrack",!0);i(s,o,o0,"]","\\rbrack",!0);i(w,o,p,"]","\\rbrack",!0);i(s,o,f0,"(","\\lparen",!0);i(s,o,o0,")","\\rparen",!0);i(w,o,p,"<","\\textless",!0);i(w,o,p,">","\\textgreater",!0);i(s,o,f0,"\u230A","\\lfloor",!0);i(s,o,o0,"\u230B","\\rfloor",!0);i(s,o,f0,"\u2308","\\lceil",!0);i(s,o,o0,"\u2309","\\rceil",!0);i(s,o,p,"\\","\\backslash");i(s,o,p,"\u2223","|");i(s,o,p,"\u2223","\\vert");i(w,o,p,"|","\\textbar",!0);i(s,o,p,"\u2225","\\|");i(s,o,p,"\u2225","\\Vert");i(w,o,p,"\u2225","\\textbardbl");i(w,o,p,"~","\\textasciitilde");i(w,o,p,"\\","\\textbackslash");i(w,o,p,"^","\\textasciicircum");i(s,o,f,"\u2191","\\uparrow",!0);i(s,o,f,"\u21D1","\\Uparrow",!0);i(s,o,f,"\u2193","\\downarrow",!0);i(s,o,f,"\u21D3","\\Downarrow",!0);i(s,o,f,"\u2195","\\updownarrow",!0);i(s,o,f,"\u21D5","\\Updownarrow",!0);i(s,o,e0,"\u2210","\\coprod");i(s,o,e0,"\u22C1","\\bigvee");i(s,o,e0,"\u22C0","\\bigwedge");i(s,o,e0,"\u2A04","\\biguplus");i(s,o,e0,"\u22C2","\\bigcap");i(s,o,e0,"\u22C3","\\bigcup");i(s,o,e0,"\u222B","\\int");i(s,o,e0,"\u222B","\\intop");i(s,o,e0,"\u222C","\\iint");i(s,o,e0,"\u222D","\\iiint");i(s,o,e0,"\u220F","\\prod");i(s,o,e0,"\u2211","\\sum");i(s,o,e0,"\u2A02","\\bigotimes");i(s,o,e0,"\u2A01","\\bigoplus");i(s,o,e0,"\u2A00","\\bigodot");i(s,o,e0,"\u222E","\\oint");i(s,o,e0,"\u222F","\\oiint");i(s,o,e0,"\u2230","\\oiiint");i(s,o,e0,"\u2A06","\\bigsqcup");i(s,o,e0,"\u222B","\\smallint");i(w,o,ne,"\u2026","\\textellipsis");i(s,o,ne,"\u2026","\\mathellipsis");i(w,o,ne,"\u2026","\\ldots",!0);i(s,o,ne,"\u2026","\\ldots",!0);i(s,o,ne,"\u22EF","\\@cdots",!0);i(s,o,ne,"\u22F1","\\ddots",!0);i(s,o,p,"\u22EE","\\varvdots");i(w,o,p,"\u22EE","\\varvdots");i(s,o,j,"\u02CA","\\acute");i(s,o,j,"\u02CB","\\grave");i(s,o,j,"\xA8","\\ddot");i(s,o,j,"~","\\tilde");i(s,o,j,"\u02C9","\\bar");i(s,o,j,"\u02D8","\\breve");i(s,o,j,"\u02C7","\\check");i(s,o,j,"^","\\hat");i(s,o,j,"\u20D7","\\vec");i(s,o,j,"\u02D9","\\dot");i(s,o,j,"\u02DA","\\mathring");i(s,o,R,"\uE131","\\@imath");i(s,o,R,"\uE237","\\@jmath");i(s,o,p,"\u0131","\u0131");i(s,o,p,"\u0237","\u0237");i(w,o,p,"\u0131","\\i",!0);i(w,o,p,"\u0237","\\j",!0);i(w,o,p,"\xDF","\\ss",!0);i(w,o,p,"\xE6","\\ae",!0);i(w,o,p,"\u0153","\\oe",!0);i(w,o,p,"\xF8","\\o",!0);i(w,o,p,"\xC6","\\AE",!0);i(w,o,p,"\u0152","\\OE",!0);i(w,o,p,"\xD8","\\O",!0);i(w,o,j,"\u02CA","\\'");i(w,o,j,"\u02CB","\\`");i(w,o,j,"\u02C6","\\^");i(w,o,j,"\u02DC","\\~");i(w,o,j,"\u02C9","\\=");i(w,o,j,"\u02D8","\\u");i(w,o,j,"\u02D9","\\.");i(w,o,j,"\xB8","\\c");i(w,o,j,"\u02DA","\\r");i(w,o,j,"\u02C7","\\v");i(w,o,j,"\xA8",'\\"');i(w,o,j,"\u02DD","\\H");i(w,o,j,"\u25EF","\\textcircled");var Or={"--":!0,"---":!0,"``":!0,"''":!0};i(w,o,p,"\u2013","--",!0);i(w,o,p,"\u2013","\\textendash");i(w,o,p,"\u2014","---",!0);i(w,o,p,"\u2014","\\textemdash");i(w,o,p,"\u2018","`",!0);i(w,o,p,"\u2018","\\textquoteleft");i(w,o,p,"\u2019","'",!0);i(w,o,p,"\u2019","\\textquoteright");i(w,o,p,"\u201C","``",!0);i(w,o,p,"\u201C","\\textquotedblleft");i(w,o,p,"\u201D","''",!0);i(w,o,p,"\u201D","\\textquotedblright");i(s,o,p,"\xB0","\\degree",!0);i(w,o,p,"\xB0","\\degree");i(w,o,p,"\xB0","\\textdegree",!0);i(s,o,p,"\xA3","\\pounds");i(s,o,p,"\xA3","\\mathsterling",!0);i(w,o,p,"\xA3","\\pounds");i(w,o,p,"\xA3","\\textsterling",!0);i(s,d,p,"\u2720","\\maltese");i(w,d,p,"\u2720","\\maltese");var ir='0123456789/@."';for(Se=0;Se{var t=r.charCodeAt(0),a=r.charCodeAt(1),n=(t-55296)*1024+(a-56320)+65536,l=e==="math"?0:1;if(119808<=n&&n<120484){var u=Math.floor((n-119808)/26);return[Te[u][2],Te[u][l]]}else if(120782<=n&&n<=120831){var h=Math.floor((n-120782)/10);return[sr[h][2],sr[h][l]]}else{if(n===120485||n===120486)return[Te[0][2],Te[0][l]];if(1204860)return l0(l,v,n,t,u.concat(g));if(c){var b,y;if(c==="boldsymbol"){var x=va(l,n,t,u,a);b=x.fontName,y=[x.fontClass]}else h?(b=xt[c].fontName,y=[c]):(b=Be(c,t.fontWeight,t.fontShape),y=[c,t.fontWeight,t.fontShape]);if(Xe(l,b,n).metrics)return l0(l,b,n,t,u.concat(y));if(Or.hasOwnProperty(l)&&b.slice(0,10)==="Typewriter"){for(var A=[],T=0;T{if(P0(r.classes)!==P0(e.classes)||r.skew!==e.skew||r.maxFontSize!==e.maxFontSize||r.italic!==0&&r.hasClass("mathnormal"))return!1;if(r.classes.length===1){var t=r.classes[0];if(t==="mbin"||t==="mord")return!1}for(var a of Object.keys(r.style))if(r.style[a]!==e.style[a])return!1;for(var n of Object.keys(e.style))if(r.style[n]!==e.style[n])return!1;return!0},Fr=r=>{for(var e=0;et&&(t=u.height),u.depth>a&&(a=u.depth),u.maxFontSize>n&&(n=u.maxFontSize)}e.height=t,e.depth=a,e.maxFontSize=n},k=function(e,t,a,n){var l=new G0(e,t,a,n);return Ht(l),l},U0=(r,e,t,a)=>new G0(r,e,t,a),re=function(e,t,a){var n=k([e],[],t);return n.height=Math.max(a||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=M(n.height),n.maxFontSize=1,n},ga=function(e,t,a,n){var l=new te(e,t,a,n);return Ht(l),l},E0=function(e){var t=new L0(e);return Ht(t),t},ae=function(e,t){return e instanceof L0?k([],[e],t):e},ba=function(e){if(e.positionType==="individualShift"){for(var t=e.children,a=[t[0]],n=-t[0].shift-t[0].elem.depth,l=n,u=1;u{var t=k(["mspace"],[],e),a=J(r,e);return t.style.marginRight=M(a),t},Be=function(e,t,a){var n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}var l;return t==="textbf"&&a==="textit"?l="BoldItalic":t==="textbf"?l="Bold":t==="textit"?l="Italic":l="Regular",n+"-"+l},xt={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Pr={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Gr=function(e,t){var[a,n,l]=Pr[e],u=new z0(a),h=new x0([u],{width:M(n),height:M(l),style:"width:"+M(n),viewBox:"0 0 "+1e3*n+" "+1e3*l,preserveAspectRatio:"xMinYMin"}),c=U0(["overlay"],[h],t);return c.height=l,c.style.height=M(l),c.style.width=M(n),c},K={number:3,unit:"mu"},W0={number:4,unit:"mu"},D0={number:5,unit:"mu"},ya={mord:{mop:K,mbin:W0,mrel:D0,minner:K},mop:{mord:K,mop:K,mrel:D0,minner:K},mbin:{mord:W0,mop:W0,mopen:W0,minner:W0},mrel:{mord:D0,mop:D0,mopen:D0,minner:D0},mopen:{},mclose:{mop:K,mbin:W0,mrel:D0,minner:K},mpunct:{mord:K,mop:K,mrel:D0,mopen:K,mclose:K,mpunct:K,minner:K},minner:{mord:K,mop:K,mbin:W0,mrel:D0,mopen:K,mpunct:K,minner:K}},xa={mord:{mop:K},mop:{mord:K,mop:K},mbin:{},mrel:{},mopen:{},mclose:{mop:K},mpunct:{},minner:{mop:K}},Ur={},Oe={},Fe={};function B(r){for(var{type:e,names:t,props:a,handler:n,htmlBuilder:l,mathmlBuilder:u}=r,h={type:e,numArgs:a.numArgs,argTypes:a.argTypes,allowedInArgument:!!a.allowedInArgument,allowedInText:!!a.allowedInText,allowedInMath:a.allowedInMath===void 0?!0:a.allowedInMath,numOptionalArgs:a.numOptionalArgs||0,infix:!!a.infix,primitive:!!a.primitive,handler:n},c=0;c{var C=T.classes[0],q=A.classes[0];C==="mbin"&&ka.has(q)?T.classes[0]="mord":q==="mbin"&&wa.has(C)&&(A.classes[0]="mord")},{node:b},y,x),wt(l,(A,T)=>{var C,q,I=St(T),N=St(A),F=I&&N?A.hasClass("mtight")?(C=xa[I])==null?void 0:C[N]:(q=ya[I])==null?void 0:q[N]:null;if(F)return Lr(F,v)},{node:b},y,x),l},wt=function(e,t,a,n,l){n&&e.push(n);for(var u=0;uy=>{e.splice(b+1,0,y),u++})(u)}n&&e.pop()},Vr=function(e){return e instanceof L0||e instanceof te||e instanceof G0&&e.hasClass("enclosing")?e:null},kt=function(e,t){var a=Vr(e);if(a){var n=a.children;if(n.length){if(t==="right")return kt(n[n.length-1],"right");if(t==="left")return kt(n[0],"left")}}return e},St=function(e,t){if(!e)return null;t&&(e=kt(e,t));var a=e.classes[0];return za[a]||null},fe=function(e,t){var a=["nulldelimiter"].concat(e.baseSizingClasses());return k(t.concat(a))},U=function(e,t,a){if(!e)return k();if(Oe[e.type]){var n=Oe[e.type](e,t);if(a&&t.size!==a.size){n=k(t.sizingClasses(a),[n],t);var l=t.sizeMultiplier/a.sizeMultiplier;n.height*=l,n.depth*=l}return n}else throw new z("Got group of unknown type: '"+e.type+"'")};function De(r,e){var t=k(["base"],r,e),a=k(["strut"]);return a.style.height=M(t.height+t.depth),t.depth&&(a.style.verticalAlign=M(-t.depth)),t.children.unshift(a),t}function zt(r,e){var t=null;r.length===1&&r[0].type==="tag"&&(t=r[0].tag,r=r[0].body);var a=r0(r,e,"root"),n;a.length===2&&a[1].hasClass("tag")&&(n=a.pop());for(var l=[],u=[],h=0;h0&&(l.push(De(u,e)),u=[]),l.push(a[h]));u.length>0&&l.push(De(u,e));var v;t?(v=De(r0(t,e,!0),e),v.classes=["tag"],l.push(v)):n&&l.push(n);var g=k(["katex-html"],l);if(g.setAttribute("aria-hidden","true"),v){var b=v.children[0];b.style.height=M(g.height+g.depth),g.depth&&(b.style.verticalAlign=M(-g.depth))}return g}function Xr(r){return new L0(r)}var S=class{constructor(e,t,a){this.type=e,this.attributes={},this.children=t||[],this.classes=a||[]}setAttribute(e,t){this.attributes[e]=t}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=P0(this.classes));for(var a=0;a0&&(e+=' class ="'+n0(P0(this.classes))+'"'),e+=">";for(var a=0;a",e}toText(){return this.children.map(e=>e.toText()).join("")}},Q=class{constructor(e){this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return n0(this.toText())}toText(){return this.text}},Pe=class{constructor(e){this.width=e,e>=.05555&&e<=.05556?this.character="\u200A":e>=.1666&&e<=.1667?this.character="\u2009":e>=.2222&&e<=.2223?this.character="\u2005":e>=.2777&&e<=.2778?this.character="\u2005\u200A":e>=-.05556&&e<=-.05555?this.character="\u200A\u2063":e>=-.1667&&e<=-.1666?this.character="\u2009\u2063":e>=-.2223&&e<=-.2222?this.character="\u205F\u2063":e>=-.2778&&e<=-.2777?this.character="\u2005\u2063":this.character=null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",M(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},Ma=new Set(["\\imath","\\jmath"]),Aa=new Set(["mrow","mtable"]),g0=function(e,t,a){return $[t][e]&&$[t][e].replace&&e.charCodeAt(0)!==55349&&!(Or.hasOwnProperty(e)&&a&&(a.fontFamily&&a.fontFamily.slice(4,6)==="tt"||a.font&&a.font.slice(4,6)==="tt"))&&(e=$[t][e].replace),new Q(e)},Nt=function(e){return e.length===1?e[0]:new S("mrow",e)},Ot=function(e,t){if(t.fontFamily==="texttt")return"monospace";if(t.fontFamily==="textsf")return t.fontShape==="textit"&&t.fontWeight==="textbf"?"sans-serif-bold-italic":t.fontShape==="textit"?"sans-serif-italic":t.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(t.fontShape==="textit"&&t.fontWeight==="textbf")return"bold-italic";if(t.fontShape==="textit")return"italic";if(t.fontWeight==="textbf")return"bold";var a=t.font;if(!a||a==="mathnormal")return null;var n=e.mode;if(a==="mathit")return"italic";if(a==="boldsymbol")return e.type==="textord"?"bold":"bold-italic";if(a==="mathbf")return"bold";if(a==="mathbb")return"double-struck";if(a==="mathsfit")return"sans-serif-italic";if(a==="mathfrak")return"fraktur";if(a==="mathscr"||a==="mathcal")return"script";if(a==="mathsf")return"sans-serif";if(a==="mathtt")return"monospace";var l=e.text;if(Ma.has(l))return null;if($[n][l]){var u=$[n][l].replace;u&&(l=u)}var h=xt[a].fontName;return Et(l,h,n)?xt[a].variant:null};function nt(r){if(!r)return!1;if(r.type==="mi"&&r.children.length===1){var e=r.children[0];return e instanceof Q&&e.text==="."}else if(r.type==="mo"&&r.children.length===1&&r.getAttribute("separator")==="true"&&r.getAttribute("lspace")==="0em"&&r.getAttribute("rspace")==="0em"){var t=r.children[0];return t instanceof Q&&t.text===","}else return!1}var v0=function(e,t,a){if(e.length===1){var n=Y(e[0],t);return a&&n instanceof S&&n.type==="mo"&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}for(var l=[],u,h=0;h=1&&(u.type==="mn"||nt(u))){var v=c.children[0];v instanceof S&&v.type==="mn"&&(v.children=[...u.children,...v.children],l.pop())}else if(u.type==="mi"&&u.children.length===1){var g=u.children[0];if(g instanceof Q&&g.text==="\u0338"&&(c.type==="mo"||c.type==="mi"||c.type==="mn")){var b=c.children[0];b instanceof Q&&b.text.length>0&&(b.text=b.text.slice(0,1)+"\u0338"+b.text.slice(1),l.pop())}}}l.push(c),u=c}return l},V0=function(e,t,a){return Nt(v0(e,t,a))},Y=function(e,t){if(!e)return new S("mrow");if(Fe[e.type]){var a=Fe[e.type](e,t);return a}else throw new z("Got group of unknown type: '"+e.type+"'")};function ur(r,e,t,a,n){var l=v0(r,t),u;l.length===1&&l[0]instanceof S&&Aa.has(l[0].type)?u=l[0]:u=new S("mrow",l);var h=new S("annotation",[new Q(e)]);h.setAttribute("encoding","application/x-tex");var c=new S("semantics",[u,h]),v=new S("math",[c]);v.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),a&&v.setAttribute("display","block");var g=n?"katex":"katex-mathml";return k([g],[v])}var Ta=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],or=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],hr=function(e,t){return t.size<2?e:Ta[e-1][t.size-1]},Ba=(()=>{class r{constructor(t){this.style=t.style,this.color=t.color,this.size=t.size||r.BASESIZE,this.textSize=t.textSize||this.size,this.phantom=!!t.phantom,this.font=t.font||"",this.fontFamily=t.fontFamily||"",this.fontWeight=t.fontWeight||"",this.fontShape=t.fontShape||"",this.sizeMultiplier=or[this.size-1],this.maxSize=t.maxSize,this.minRuleThickness=t.minRuleThickness,this._fontMetrics=void 0}extend(t){var a={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};return Object.assign(a,t),new r(a)}havingStyle(t){return this.style===t?this:this.extend({style:t,size:hr(this.textSize,t)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(t){return this.size===t&&this.textSize===t?this:this.extend({style:this.style.text(),size:t,textSize:t,sizeMultiplier:or[t-1]})}havingBaseStyle(t){t=t||this.style.text();var a=hr(r.BASESIZE,t);return this.size===a&&this.textSize===r.BASESIZE&&this.style===t?this:this.extend({style:t,size:a})}havingBaseSizing(){var t;switch(this.style.id){case 4:case 5:t=3;break;case 6:case 7:t=1;break;default:t=6}return this.extend({style:this.style.text(),size:t})}withColor(t){return this.extend({color:t})}withPhantom(){return this.extend({phantom:!0})}withFont(t){return this.extend({font:t})}withTextFontFamily(t){return this.extend({fontFamily:t,font:""})}withTextFontWeight(t){return this.extend({fontWeight:t,font:""})}withTextFontShape(t){return this.extend({fontShape:t,font:""})}sizingClasses(t){return t.size!==this.size?["sizing","reset-size"+t.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==r.BASESIZE?["sizing","reset-size"+this.size,"size"+r.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=ma(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}return r.BASESIZE=6,r})(),Yr=function(e){return new Ba({style:e.displayMode?H.DISPLAY:H.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Wr=function(e,t){if(t.displayMode){var a=["katex-display"];t.leqno&&a.push("leqno"),t.fleqn&&a.push("fleqn"),e=k(a,[e])}return e},Da=function(e,t,a){var n=Yr(a),l;if(a.output==="mathml")return ur(e,t,n,a.displayMode,!0);if(a.output==="html"){var u=zt(e,n);l=k(["katex"],[u])}else{var h=ur(e,t,n,a.displayMode,!1),c=zt(e,n);l=k(["katex"],[h,c])}return Wr(l,a)},Ca=function(e,t,a){var n=Yr(a),l=zt(e,n),u=k(["katex"],[l]);return Wr(u,a)},qa={widehat:"^",widecheck:"\u02C7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23DF",overbrace:"\u23DE",overgroup:"\u23E0",undergroup:"\u23E1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21D2",xRightarrow:"\u21D2",overleftharpoon:"\u21BC",xleftharpoonup:"\u21BC",overrightharpoon:"\u21C0",xrightharpoonup:"\u21C0",xLeftarrow:"\u21D0",xLeftrightarrow:"\u21D4",xhookleftarrow:"\u21A9",xhookrightarrow:"\u21AA",xmapsto:"\u21A6",xrightharpoondown:"\u21C1",xleftharpoondown:"\u21BD",xrightleftharpoons:"\u21CC",xleftrightharpoons:"\u21CB",xtwoheadleftarrow:"\u219E",xtwoheadrightarrow:"\u21A0",xlongequal:"=",xtofrom:"\u21C4",xrightleftarrows:"\u21C4",xrightequilibrium:"\u21CC",xleftequilibrium:"\u21CB","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},We=function(e){var t=new S("mo",[new Q(qa[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},Ra={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Ea=new Set(["widehat","widecheck","widetilde","utilde"]),$e=function(e,t){function a(){var h=4e5,c=e.label.slice(1);if(Ea.has(c)){var v=e,g=v.base.type==="ordgroup"?v.base.body.length:1,b,y,x;if(g>5)c==="widehat"||c==="widecheck"?(b=420,h=2364,x=.42,y=c+"4"):(b=312,h=2340,x=.34,y="tilde4");else{var A=[1,1,2,2,3,3][g];c==="widehat"||c==="widecheck"?(h=[0,1062,2364,2364,2364][A],b=[0,239,300,360,420][A],x=[0,.24,.3,.3,.36,.42][A],y=c+A):(h=[0,600,1033,2339,2340][A],b=[0,260,286,306,312][A],x=[0,.26,.286,.3,.306,.34][A],y="tilde"+A)}var T=new z0(y),C=new x0([T],{width:"100%",height:M(x),viewBox:"0 0 "+h+" "+b,preserveAspectRatio:"none"});return{span:U0([],[C],t),minWidth:0,height:x}}else{var q=[],I=Ra[c],[N,F,V]=I,L=V/1e3,P=N.length,W,X;if(P===1){var h0=I[3];W=["hide-tail"],X=[h0]}else if(P===2)W=["halfarrow-left","halfarrow-right"],X=["xMinYMin","xMaxYMin"];else if(P===3)W=["brace-left","brace-center","brace-right"],X=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support + `+P+" children.");for(var i0=0;i00&&(n.style.minWidth=M(l)),n},Ia=function(e,t,a,n,l){var u,h=e.height+e.depth+a+n;if(/fbox|color|angl/.test(t)){if(u=k(["stretchy",t],[],l),t==="fbox"){var c=l.color&&l.getColor();c&&(u.style.borderColor=c)}}else{var v=[];/^[bx]cancel$/.test(t)&&v.push(new de({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&v.push(new de({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var g=new x0(v,{width:"100%",height:M(h)});u=U0([],[g],l)}return u.height=h,u.style.height=M(h),u};function O(r,e){if(!r||r.type!==e)throw new Error("Expected node of type "+e+", but got "+(r?"node of type "+r.type:String(r)));return r}function je(r){var e=Ze(r);if(!e)throw new Error("Expected node of symbol group type, but got "+(r?"node of type "+r.type:String(r)));return e}function Ze(r){return r&&(r.type==="atom"||da.hasOwnProperty(r.type))?r:null}var $r=r=>{if(r instanceof u0)return r;if(oa(r)&&r.children.length===1)return $r(r.children[0])},Ft=(r,e)=>{var t,a,n;r&&r.type==="supsub"?(a=O(r.base,"accent"),t=a.base,r.base=t,n=ua(U(r,e)),r.base=a):(a=O(r,"accent"),t=a.base);var l=U(t,e.havingCrampedStyle()),u=a.isShifty&&q0(t),h=0;if(u){var c,v;h=(c=(v=$r(l))==null?void 0:v.skew)!=null?c:0}var g=a.label==="\\c",b=g?l.height+l.depth:Math.min(l.height,e.fontMetrics().xHeight),y;if(a.isStretchy)y=$e(a,e),y=G({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"elem",elem:y,wrapperClasses:["svg-align"],wrapperStyle:h>0?{width:"calc(100% - "+M(2*h)+")",marginLeft:M(2*h)}:void 0}]});else{var x,A;a.label==="\\vec"?(x=Gr("vec",e),A=Pr.vec[1]):(x=Ye({type:"textord",mode:a.mode,text:a.label},e,"textord"),x=sa(x),x.italic=0,A=x.width,g&&(b+=x.depth)),y=k(["accent-body"],[x]);var T=a.label==="\\textcircled";T&&(y.classes.push("accent-full"),b=l.height);var C=h;T||(C-=A/2),y.style.left=M(C),a.label==="\\textcircled"&&(y.style.top=".2em"),y=G({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:-b},{type:"elem",elem:y}]})}var q=k(["mord","accent"],[y],e);return n?(n.children[0]=q,n.height=Math.max(q.height,n.height),n.classes[0]="mord",n):q},jr=(r,e)=>{var t=r.isStretchy?We(r.label):new S("mo",[g0(r.label,r.mode)]),a=new S("mover",[Y(r.base,e),t]);return a.setAttribute("accent","true"),a},Ha=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(r=>"\\"+r).join("|"));B({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(r,e)=>{var t=Le(e[0]),a=!Ha.test(r.funcName),n=!a||r.funcName==="\\widehat"||r.funcName==="\\widetilde"||r.funcName==="\\widecheck";return{type:"accent",mode:r.parser.mode,label:r.funcName,isStretchy:a,isShifty:n,base:t}},htmlBuilder:Ft,mathmlBuilder:jr});B({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(r,e)=>{var t=e[0],a=r.parser.mode;return a==="math"&&(r.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+r.funcName+" works only in text mode"),a="text"),{type:"accent",mode:a,label:r.funcName,isStretchy:!1,isShifty:!0,base:t}},htmlBuilder:Ft,mathmlBuilder:jr});B({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"accentUnder",mode:t.mode,label:a,base:n}},htmlBuilder:(r,e)=>{var t=U(r.base,e),a=$e(r,e),n=r.label==="\\utilde"?.12:0,l=G({positionType:"top",positionData:t.height,children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:n},{type:"elem",elem:t}]});return k(["mord","accentunder"],[l],e)},mathmlBuilder:(r,e)=>{var t=We(r.label),a=new S("munder",[Y(r.base,e),t]);return a.setAttribute("accentunder","true"),a}});var Ce=r=>{var e=new S("mpadded",r?[r]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e};B({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(r,e,t){var{parser:a,funcName:n}=r;return{type:"xArrow",mode:a.mode,label:n,body:e[0],below:t[0]}},htmlBuilder(r,e){var t=e.style,a=e.havingStyle(t.sup()),n=ae(U(r.body,a,e),e),l=r.label.slice(0,2)==="\\x"?"x":"cd";n.classes.push(l+"-arrow-pad");var u;r.below&&(a=e.havingStyle(t.sub()),u=ae(U(r.below,a,e),e),u.classes.push(l+"-arrow-pad"));var h=$e(r,e),c=-e.fontMetrics().axisHeight+.5*h.height,v=-e.fontMetrics().axisHeight-.5*h.height-.111;(n.depth>.25||r.label==="\\xleftequilibrium")&&(v-=n.depth);var g;if(u){var b=-e.fontMetrics().axisHeight+u.height+.5*h.height+.111;g=G({positionType:"individualShift",children:[{type:"elem",elem:n,shift:v},{type:"elem",elem:h,shift:c},{type:"elem",elem:u,shift:b}]})}else g=G({positionType:"individualShift",children:[{type:"elem",elem:n,shift:v},{type:"elem",elem:h,shift:c}]});return g.children[0].children[0].children[1].classes.push("svg-align"),k(["mrel","x-arrow"],[g],e)},mathmlBuilder(r,e){var t=We(r.label);t.setAttribute("minsize",r.label.charAt(0)==="x"?"1.75em":"3.0em");var a;if(r.body){var n=Ce(Y(r.body,e));if(r.below){var l=Ce(Y(r.below,e));a=new S("munderover",[t,l,n])}else a=new S("mover",[t,n])}else if(r.below){var u=Ce(Y(r.below,e));a=new S("munder",[t,u])}else a=Ce(),a=new S("mover",[t,a]);return a}});function Zr(r,e){var t=r0(r.body,e,!0);return k([r.mclass],t,e)}function Kr(r,e){var t,a=v0(r.body,e);return r.mclass==="minner"?t=new S("mpadded",a):r.mclass==="mord"?r.isCharacterBox?(t=a[0],t.type="mi"):t=new S("mi",a):(r.isCharacterBox?(t=a[0],t.type="mo"):t=new S("mo",a),r.mclass==="mbin"?(t.attributes.lspace="0.22em",t.attributes.rspace="0.22em"):r.mclass==="mpunct"?(t.attributes.lspace="0em",t.attributes.rspace="0.17em"):r.mclass==="mopen"||r.mclass==="mclose"?(t.attributes.lspace="0em",t.attributes.rspace="0em"):r.mclass==="minner"&&(t.attributes.lspace="0.0556em",t.attributes.width="+0.1111em")),t}B({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"mclass",mode:t.mode,mclass:"m"+a.slice(5),body:_(n),isCharacterBox:q0(n)}},htmlBuilder:Zr,mathmlBuilder:Kr});var Ke=r=>{var e=r.type==="ordgroup"&&r.body.length?r.body[0]:r;return e.type==="atom"&&(e.family==="bin"||e.family==="rel")?"m"+e.family:"mord"};B({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(r,e){var{parser:t}=r;return{type:"mclass",mode:t.mode,mclass:Ke(e[0]),body:_(e[1]),isCharacterBox:q0(e[1])}}});B({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(r,e){var{parser:t,funcName:a}=r,n=e[1],l=e[0],u;a!=="\\stackrel"?u=Ke(n):u="mrel";var h={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:a!=="\\stackrel",body:_(n)},c={type:"supsub",mode:l.mode,base:h,sup:a==="\\underset"?null:l,sub:a==="\\underset"?l:null};return{type:"mclass",mode:t.mode,mclass:u,body:[c],isCharacterBox:q0(c)}},htmlBuilder:Zr,mathmlBuilder:Kr});B({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"pmb",mode:t.mode,mclass:Ke(e[0]),body:_(e[0])}},htmlBuilder(r,e){var t=r0(r.body,e,!0),a=k([r.mclass],t,e);return a.style.textShadow="0.02em 0.01em 0.04px",a},mathmlBuilder(r,e){var t=v0(r.body,e),a=new S("mstyle",t);return a.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),a}});var Na={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},mr=()=>({type:"styling",body:[],mode:"math",style:"display"}),cr=r=>r.type==="textord"&&r.text==="@",Oa=(r,e)=>(r.type==="mathord"||r.type==="atom")&&r.text===e;function Fa(r,e,t){var a=Na[r];switch(a){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return t.callFunction(a,[e[0]],[e[1]]);case"\\uparrow":case"\\downarrow":{var n=t.callFunction("\\\\cdleft",[e[0]],[]),l={type:"atom",text:a,mode:"math",family:"rel"},u=t.callFunction("\\Big",[l],[]),h=t.callFunction("\\\\cdright",[e[1]],[]),c={type:"ordgroup",mode:"math",body:[n,u,h]};return t.callFunction("\\\\cdparent",[c],[])}case"\\\\cdlongequal":return t.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var v={type:"textord",text:"\\Vert",mode:"math"};return t.callFunction("\\Big",[v],[])}default:return{type:"textord",text:" ",mode:"math"}}}function La(r){var e=[];for(r.gullet.beginGroup(),r.gullet.macros.set("\\cr","\\\\\\relax"),r.gullet.beginGroup();;){e.push(r.parseExpression(!1,"\\\\")),r.gullet.endGroup(),r.gullet.beginGroup();var t=r.fetch().text;if(t==="&"||t==="\\\\")r.consume();else if(t==="\\end"){e[e.length-1].length===0&&e.pop();break}else throw new z("Expected \\\\ or \\cr or \\end",r.nextToken)}for(var a=[],n=[a],l=0;lAV".includes(v))for(var b=0;b<2;b++){for(var y=!0,x=c+1;xAV=|." after @',u[c]);var A=Fa(v,g,r),T={type:"styling",body:[A],mode:"math",style:"display"};a.push(T),h=mr()}l%2===0?a.push(h):a.shift(),a=[],n.push(a)}r.gullet.endGroup(),r.gullet.endGroup();var C=new Array(n[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:n,arraystretch:1,addJot:!0,rowGaps:[null],cols:C,colSeparationType:"CD",hLinesBeforeRow:new Array(n.length+1).fill([])}}B({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(r,e){var{parser:t,funcName:a}=r;return{type:"cdlabel",mode:t.mode,side:a.slice(4),label:e[0]}},htmlBuilder(r,e){var t=e.havingStyle(e.style.sup()),a=ae(U(r.label,t,e),e);return a.classes.push("cd-label-"+r.side),a.style.bottom=M(.8-a.depth),a.height=0,a.depth=0,a},mathmlBuilder(r,e){var t=new S("mrow",[Y(r.label,e)]);return t=new S("mpadded",[t]),t.setAttribute("width","0"),r.side==="left"&&t.setAttribute("lspace","-1width"),t.setAttribute("voffset","0.7em"),t=new S("mstyle",[t]),t.setAttribute("displaystyle","false"),t.setAttribute("scriptlevel","1"),t}});B({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(r,e){var{parser:t}=r;return{type:"cdlabelparent",mode:t.mode,fragment:e[0]}},htmlBuilder(r,e){var t=ae(U(r.fragment,e),e);return t.classes.push("cd-vert-arrow"),t},mathmlBuilder(r,e){return new S("mrow",[Y(r.fragment,e)])}});B({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(r,e){for(var{parser:t}=r,a=O(e[0],"ordgroup"),n=a.body,l="",u=0;u=1114111)throw new z("\\@char with invalid code point "+l);return c<=65535?v=String.fromCharCode(c):(c-=65536,v=String.fromCharCode((c>>10)+55296,(c&1023)+56320)),{type:"textord",mode:t.mode,text:v}}});var Jr=(r,e)=>{var t=r0(r.body,e.withColor(r.color),!1);return E0(t)},Qr=(r,e)=>{var t=v0(r.body,e.withColor(r.color)),a=new S("mstyle",t);return a.setAttribute("mathcolor",r.color),a};B({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(r,e){var{parser:t}=r,a=O(e[0],"color-token").color,n=e[1];return{type:"color",mode:t.mode,color:a,body:_(n)}},htmlBuilder:Jr,mathmlBuilder:Qr});B({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(r,e){var{parser:t,breakOnTokenText:a}=r,n=O(e[0],"color-token").color;t.gullet.macros.set("\\current@color",n);var l=t.parseExpression(!0,a);return{type:"color",mode:t.mode,color:n,body:l}},htmlBuilder:Jr,mathmlBuilder:Qr});B({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(r,e,t){var{parser:a}=r,n=a.gullet.future().text==="["?a.parseSizeGroup(!0):null,l=!a.settings.displayMode||!a.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:a.mode,newLine:l,size:n&&O(n,"size").value}},htmlBuilder(r,e){var t=k(["mspace"],[],e);return r.newLine&&(t.classes.push("newline"),r.size&&(t.style.marginTop=M(J(r.size,e)))),t},mathmlBuilder(r,e){var t=new S("mspace");return r.newLine&&(t.setAttribute("linebreak","newline"),r.size&&t.setAttribute("height",M(J(r.size,e)))),t}});var Mt={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},_r=r=>{var e=r.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new z("Expected a control sequence",r);return e},Pa=r=>{var e=r.gullet.popToken();return e.text==="="&&(e=r.gullet.popToken(),e.text===" "&&(e=r.gullet.popToken())),e},e1=(r,e,t,a)=>{var n=r.gullet.macros.get(t.text);n==null&&(t.noexpand=!0,n={tokens:[t],numArgs:0,unexpandable:!r.gullet.isExpandable(t.text)}),r.gullet.macros.set(e,n,a)};B({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(r){var{parser:e,funcName:t}=r;e.consumeSpaces();var a=e.fetch();if(Mt[a.text])return(t==="\\global"||t==="\\\\globallong")&&(a.text=Mt[a.text]),O(e.parseFunction(),"internal");throw new z("Invalid token after macro prefix",a)}});B({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r){var{parser:e,funcName:t}=r,a=e.gullet.popToken(),n=a.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(n))throw new z("Expected a control sequence",a);for(var l=0,u,h=[[]];e.gullet.future().text!=="{";)if(a=e.gullet.popToken(),a.text==="#"){if(e.gullet.future().text==="{"){u=e.gullet.future(),h[l].push("{");break}if(a=e.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new z('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==l+1)throw new z('Argument number "'+a.text+'" out of order');l++,h.push([])}else{if(a.text==="EOF")throw new z("Expected a macro definition");h[l].push(a.text)}var{tokens:c}=e.gullet.consumeArg();return u&&c.unshift(u),(t==="\\edef"||t==="\\xdef")&&(c=e.gullet.expandTokens(c),c.reverse()),e.gullet.macros.set(n,{tokens:c,numArgs:l,delimiters:h},t===Mt[t]),{type:"internal",mode:e.mode}}});B({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r){var{parser:e,funcName:t}=r,a=_r(e.gullet.popToken());e.gullet.consumeSpaces();var n=Pa(e);return e1(e,a,n,t==="\\\\globallet"),{type:"internal",mode:e.mode}}});B({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r){var{parser:e,funcName:t}=r,a=_r(e.gullet.popToken()),n=e.gullet.popToken(),l=e.gullet.popToken();return e1(e,a,l,t==="\\\\globalfuture"),e.gullet.pushToken(l),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}});var oe=function(e,t,a){var n=$.math[e]&&$.math[e].replace,l=Et(n||e,t,a);if(!l)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return l},Lt=function(e,t,a,n){var l=a.havingBaseStyle(t),u=k(n.concat(l.sizingClasses(a)),[e],a),h=l.sizeMultiplier/a.sizeMultiplier;return u.height*=h,u.depth*=h,u.maxFontSize=l.sizeMultiplier,u},t1=function(e,t,a){var n=t.havingBaseStyle(a),l=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=M(l),e.height-=l,e.depth+=l},Ga=function(e,t,a,n,l,u){var h=l0(e,"Main-Regular",l,n),c=Lt(h,t,n,u);return a&&t1(c,n,t),c},Ua=function(e,t,a,n){return l0(e,"Size"+t+"-Regular",a,n)},r1=function(e,t,a,n,l,u){var h=Ua(e,t,l,n),c=Lt(k(["delimsizing","size"+t],[h],n),H.TEXT,n,u);return a&&t1(c,n,H.TEXT),c},it=function(e,t,a){var n;t==="Size1-Regular"?n="delim-size1":n="delim-size4";var l=k(["delimsizinginner",n],[k([],[l0(e,t,a)])]);return{type:"elem",elem:l}},lt=function(e,t,a){var n=S0["Size4-Regular"][e.charCodeAt(0)]?S0["Size4-Regular"][e.charCodeAt(0)][4]:S0["Size1-Regular"][e.charCodeAt(0)][4],l=new z0("inner",ra(e,Math.round(1e3*t))),u=new x0([l],{width:M(n),height:M(t),style:"width:"+M(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),h=U0([],[u],a);return h.height=t,h.style.height=M(t),h.style.width=M(n),{type:"elem",elem:h}},At=.008,qe={type:"kern",size:-1*At},Va=new Set(["|","\\lvert","\\rvert","\\vert"]),Xa=new Set(["\\|","\\lVert","\\rVert","\\Vert"]),a1=function(e,t,a,n,l,u){var h,c,v,g,b="",y=0;h=v=g=e,c=null;var x="Size1-Regular";e==="\\uparrow"?v=g="\u23D0":e==="\\Uparrow"?v=g="\u2016":e==="\\downarrow"?h=v="\u23D0":e==="\\Downarrow"?h=v="\u2016":e==="\\updownarrow"?(h="\\uparrow",v="\u23D0",g="\\downarrow"):e==="\\Updownarrow"?(h="\\Uparrow",v="\u2016",g="\\Downarrow"):Va.has(e)?(v="\u2223",b="vert",y=333):Xa.has(e)?(v="\u2225",b="doublevert",y=556):e==="["||e==="\\lbrack"?(h="\u23A1",v="\u23A2",g="\u23A3",x="Size4-Regular",b="lbrack",y=667):e==="]"||e==="\\rbrack"?(h="\u23A4",v="\u23A5",g="\u23A6",x="Size4-Regular",b="rbrack",y=667):e==="\\lfloor"||e==="\u230A"?(v=h="\u23A2",g="\u23A3",x="Size4-Regular",b="lfloor",y=667):e==="\\lceil"||e==="\u2308"?(h="\u23A1",v=g="\u23A2",x="Size4-Regular",b="lceil",y=667):e==="\\rfloor"||e==="\u230B"?(v=h="\u23A5",g="\u23A6",x="Size4-Regular",b="rfloor",y=667):e==="\\rceil"||e==="\u2309"?(h="\u23A4",v=g="\u23A5",x="Size4-Regular",b="rceil",y=667):e==="("||e==="\\lparen"?(h="\u239B",v="\u239C",g="\u239D",x="Size4-Regular",b="lparen",y=875):e===")"||e==="\\rparen"?(h="\u239E",v="\u239F",g="\u23A0",x="Size4-Regular",b="rparen",y=875):e==="\\{"||e==="\\lbrace"?(h="\u23A7",c="\u23A8",g="\u23A9",v="\u23AA",x="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(h="\u23AB",c="\u23AC",g="\u23AD",v="\u23AA",x="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(h="\u23A7",g="\u23A9",v="\u23AA",x="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(h="\u23AB",g="\u23AD",v="\u23AA",x="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(h="\u23A7",g="\u23AD",v="\u23AA",x="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(h="\u23AB",g="\u23A9",v="\u23AA",x="Size4-Regular");var A=oe(h,x,l),T=A.height+A.depth,C=oe(v,x,l),q=C.height+C.depth,I=oe(g,x,l),N=I.height+I.depth,F=0,V=1;if(c!==null){var L=oe(c,x,l);F=L.height+L.depth,V=2}var P=T+N+F,W=Math.max(0,Math.ceil((t-P)/(V*q))),X=P+W*V*q,h0=n.fontMetrics().axisHeight;a&&(h0*=n.sizeMultiplier);var i0=X/2-h0,t0=[];if(b.length>0){var Y0=X-T-N,m0=Math.round(X*1e3),b0=aa(b,Math.round(Y0*1e3)),I0=new z0(b,b0),j0=(y/1e3).toFixed(3)+"em",Z0=(m0/1e3).toFixed(3)+"em",_e=new x0([I0],{width:j0,height:Z0,viewBox:"0 0 "+y+" "+m0}),H0=U0([],[_e],n);H0.height=m0/1e3,H0.style.width=j0,H0.style.height=Z0,t0.push({type:"elem",elem:H0})}else{if(t0.push(it(g,x,l)),t0.push(qe),c===null){var N0=X-T-N+2*At;t0.push(lt(v,N0,n))}else{var le=(X-T-N-F)/2+2*At;t0.push(lt(v,le,n)),t0.push(qe),t0.push(it(c,x,l)),t0.push(qe),t0.push(lt(v,le,n))}t0.push(qe),t0.push(it(h,x,l))}var y0=n.havingBaseStyle(H.TEXT),pe=G({positionType:"bottom",positionData:i0,children:t0});return Lt(k(["delimsizing","mult"],[pe],y0),H.TEXT,n,u)},st=80,ut=.08,ot=function(e,t,a,n,l){var u=ta(e,n,a),h=new z0(e,u),c=new x0([h],{width:"400em",height:M(t),viewBox:"0 0 400000 "+a,preserveAspectRatio:"xMinYMin slice"});return U0(["hide-tail"],[c],l)},Ya=function(e,t){var a=t.havingBaseSizing(),n=u1("\\surd",e*a.sizeMultiplier,s1,a),l=a.sizeMultiplier,u=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),h,c=0,v=0,g=0,b;return n.type==="small"?(g=1e3+1e3*u+st,e<1?l=1:e<1.4&&(l=.7),c=(1+u+ut)/l,v=(1+u)/l,h=ot("sqrtMain",c,g,u,t),h.style.minWidth="0.853em",b=.833/l):n.type==="large"?(g=(1e3+st)*he[n.size],v=(he[n.size]+u)/l,c=(he[n.size]+u+ut)/l,h=ot("sqrtSize"+n.size,c,g,u,t),h.style.minWidth="1.02em",b=1/l):(c=e+u+ut,v=e+u,g=Math.floor(1e3*e+u)+st,h=ot("sqrtTall",c,g,u,t),h.style.minWidth="0.742em",b=1.056),h.height=v,h.style.height=M(c),{span:h,advanceWidth:b,ruleWidth:(t.fontMetrics().sqrtRuleThickness+u)*l}},n1=new Set(["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"]),Wa=new Set(["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1"]),i1=new Set(["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"]),he=[0,1.2,1.8,2.4,3],l1=function(e,t,a,n,l){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),n1.has(e)||i1.has(e))return r1(e,t,!1,a,n,l);if(Wa.has(e))return a1(e,he[t],!1,a,n,l);throw new z("Illegal delimiter: '"+e+"'")},$a=[{type:"small",style:H.SCRIPTSCRIPT},{type:"small",style:H.SCRIPT},{type:"small",style:H.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],ja=[{type:"small",style:H.SCRIPTSCRIPT},{type:"small",style:H.SCRIPT},{type:"small",style:H.TEXT},{type:"stack"}],s1=[{type:"small",style:H.SCRIPTSCRIPT},{type:"small",style:H.SCRIPT},{type:"small",style:H.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],Za=function(e){if(e.type==="small")return"Main-Regular";if(e.type==="large")return"Size"+e.size+"-Regular";if(e.type==="stack")return"Size4-Regular";var t=e.type;throw new Error("Add support for delim type '"+t+"' here.")},u1=function(e,t,a,n){for(var l=Math.min(2,3-n.style.size),u=l;ut)return h}return a[a.length-1]},Tt=function(e,t,a,n,l,u){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var h;i1.has(e)?h=$a:n1.has(e)?h=s1:h=ja;var c=u1(e,t,h,n);return c.type==="small"?Ga(e,c.style,a,n,l,u):c.type==="large"?r1(e,c.size,a,n,l,u):a1(e,t,a,n,l,u)},ht=function(e,t,a,n,l,u){var h=n.fontMetrics().axisHeight*n.sizeMultiplier,c=901,v=5/n.fontMetrics().ptPerEm,g=Math.max(t-h,a+h),b=Math.max(g/500*c,2*g-v);return Tt(e,b,!0,n,l,u)},dr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Ka=new Set(["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27E8","\\rangle","\u27E9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."]);function Je(r,e){var t=Ze(r);if(t&&Ka.has(t.text))return t;throw t?new z("Invalid delimiter '"+t.text+"' after '"+e.funcName+"'",r):new z("Invalid delimiter type '"+r.type+"'",r)}B({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(r,e)=>{var t=Je(e[0],r);return{type:"delimsizing",mode:r.parser.mode,size:dr[r.funcName].size,mclass:dr[r.funcName].mclass,delim:t.text}},htmlBuilder:(r,e)=>r.delim==="."?k([r.mclass]):l1(r.delim,r.size,e,r.mode,[r.mclass]),mathmlBuilder:r=>{var e=[];r.delim!=="."&&e.push(g0(r.delim,r.mode));var t=new S("mo",e);r.mclass==="mopen"||r.mclass==="mclose"?t.setAttribute("fence","true"):t.setAttribute("fence","false"),t.setAttribute("stretchy","true");var a=M(he[r.size]);return t.setAttribute("minsize",a),t.setAttribute("maxsize",a),t}});function fr(r){if(!r.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}B({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var t=r.parser.gullet.macros.get("\\current@color");if(t&&typeof t!="string")throw new z("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:r.parser.mode,delim:Je(e[0],r).text,color:t}}});B({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var t=Je(e[0],r),a=r.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect("\\right",!1);var l=O(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:t.text,right:l.delim,rightColor:l.color}},htmlBuilder:(r,e)=>{fr(r);for(var t=r0(r.body,e,!0,["mopen","mclose"]),a=0,n=0,l=!1,u=0;u{fr(r);var t=v0(r.body,e);if(r.left!=="."){var a=new S("mo",[g0(r.left,r.mode)]);a.setAttribute("fence","true"),t.unshift(a)}if(r.right!=="."){var n=new S("mo",[g0(r.right,r.mode)]);n.setAttribute("fence","true"),r.rightColor&&n.setAttribute("mathcolor",r.rightColor),t.push(n)}return Nt(t)}});B({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var t=Je(e[0],r);if(!r.parser.leftrightDepth)throw new z("\\middle without preceding \\left",t);return{type:"middle",mode:r.parser.mode,delim:t.text}},htmlBuilder:(r,e)=>{var t;if(r.delim===".")t=fe(e,[]);else{t=l1(r.delim,1,e,r.mode,[]);var a={delim:r.delim,options:e};t.isMiddle=a}return t},mathmlBuilder:(r,e)=>{var t=r.delim==="\\vert"||r.delim==="|"?g0("|","text"):g0(r.delim,r.mode),a=new S("mo",[t]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var Pt=(r,e)=>{var t=ae(U(r.body,e),e),a=r.label.slice(1),n=e.sizeMultiplier,l,u=0,h=q0(r.body);if(a==="sout")l=k(["stretchy","sout"]),l.height=e.fontMetrics().defaultRuleThickness/n,u=-.5*e.fontMetrics().xHeight;else if(a==="phase"){var c=J({number:.6,unit:"pt"},e),v=J({number:.35,unit:"ex"},e),g=e.havingBaseSizing();n=n/g.sizeMultiplier;var b=t.height+t.depth+c+v;t.style.paddingLeft=M(b/2+c);var y=Math.floor(1e3*b*n),x=_1(y),A=new x0([new z0("phase",x)],{width:"400em",height:M(y/1e3),viewBox:"0 0 400000 "+y,preserveAspectRatio:"xMinYMin slice"});l=U0(["hide-tail"],[A],e),l.style.height=M(b),u=t.depth+c+v}else{/cancel/.test(a)?h||t.classes.push("cancel-pad"):a==="angl"?t.classes.push("anglpad"):t.classes.push("boxpad");var T=0,C=0,q=0;/box/.test(a)?(q=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),T=e.fontMetrics().fboxsep+(a==="colorbox"?0:q),C=T):a==="angl"?(q=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),T=4*q,C=Math.max(0,.25-t.depth)):(T=h?.2:0,C=T),l=Ia(t,a,T,C,e),/fbox|boxed|fcolorbox/.test(a)?(l.style.borderStyle="solid",l.style.borderWidth=M(q)):a==="angl"&&q!==.049&&(l.style.borderTopWidth=M(q),l.style.borderRightWidth=M(q)),u=t.depth+C,r.backgroundColor&&(l.style.backgroundColor=r.backgroundColor,r.borderColor&&(l.style.borderColor=r.borderColor))}var I;if(r.backgroundColor)I=G({positionType:"individualShift",children:[{type:"elem",elem:l,shift:u},{type:"elem",elem:t,shift:0}]});else{var N=/cancel|phase/.test(a)?["svg-align"]:[];I=G({positionType:"individualShift",children:[{type:"elem",elem:t,shift:0},{type:"elem",elem:l,shift:u,wrapperClasses:N}]})}return/cancel/.test(a)&&(I.height=t.height,I.depth=t.depth),/cancel/.test(a)&&!h?k(["mord","cancel-lap"],[I],e):k(["mord"],[I],e)},Gt=(r,e)=>{var t=0,a=new S(r.label.includes("colorbox")?"mpadded":"menclose",[Y(r.body,e)]);switch(r.label){case"\\cancel":a.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":a.setAttribute("notation","downdiagonalstrike");break;case"\\phase":a.setAttribute("notation","phasorangle");break;case"\\sout":a.setAttribute("notation","horizontalstrike");break;case"\\fbox":a.setAttribute("notation","box");break;case"\\angl":a.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(t=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,a.setAttribute("width","+"+2*t+"pt"),a.setAttribute("height","+"+2*t+"pt"),a.setAttribute("lspace",t+"pt"),a.setAttribute("voffset",t+"pt"),r.label==="\\fcolorbox"){var n=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);a.setAttribute("style","border: "+n+"em solid "+String(r.borderColor))}break;case"\\xcancel":a.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return r.backgroundColor&&a.setAttribute("mathbackground",r.backgroundColor),a};B({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(r,e,t){var{parser:a,funcName:n}=r,l=O(e[0],"color-token").color,u=e[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:l,body:u}},htmlBuilder:Pt,mathmlBuilder:Gt});B({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(r,e,t){var{parser:a,funcName:n}=r,l=O(e[0],"color-token").color,u=O(e[1],"color-token").color,h=e[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:u,borderColor:l,body:h}},htmlBuilder:Pt,mathmlBuilder:Gt});B({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"enclose",mode:t.mode,label:"\\fbox",body:e[0]}}});B({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"enclose",mode:t.mode,label:a,body:n}},htmlBuilder:Pt,mathmlBuilder:Gt});B({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(r,e){var{parser:t}=r;return{type:"enclose",mode:t.mode,label:"\\angl",body:e[0]}}});var o1={};function M0(r){for(var{type:e,names:t,props:a,handler:n,htmlBuilder:l,mathmlBuilder:u}=r,h={type:e,numArgs:a.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:n},c=0;c{var e=r.parser.settings;if(!e.displayMode)throw new z("{"+r.envName+"} can be used only in display mode.")},Ja=new Set(["gather","gather*"]);function Ut(r){if(!r.includes("ed"))return!r.includes("*")}function X0(r,e,t){var{hskipBeforeAndAfter:a,addJot:n,cols:l,arraystretch:u,colSeparationType:h,autoTag:c,singleRow:v,emptySingleRow:g,maxNumCols:b,leqno:y}=e;if(r.gullet.beginGroup(),v||r.gullet.macros.set("\\cr","\\\\\\relax"),!u){var x=r.gullet.expandMacroAsText("\\arraystretch");if(x==null)u=1;else if(u=parseFloat(x),!u||u<0)throw new z("Invalid \\arraystretch: "+x)}r.gullet.beginGroup();var A=[],T=[A],C=[],q=[],I=c!=null?[]:void 0;function N(){c&&r.gullet.macros.set("\\@eqnsw","1",!0)}function F(){I&&(r.gullet.macros.get("\\df@tag")?(I.push(r.subparse([new d0("\\df@tag")])),r.gullet.macros.set("\\df@tag",void 0,!0)):I.push(!!c&&r.gullet.macros.get("\\@eqnsw")==="1"))}for(N(),q.push(vr(r));;){var V=r.parseExpression(!1,v?"\\end":"\\\\");r.gullet.endGroup(),r.gullet.beginGroup();var L={type:"ordgroup",mode:r.mode,body:V};t&&(L={type:"styling",mode:r.mode,style:t,body:[L]}),A.push(L);var P=r.fetch().text;if(P==="&"){if(b&&A.length===b){if(v||h)throw new z("Too many tab characters: &",r.nextToken);r.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}r.consume()}else if(P==="\\end"){F(),A.length===1&&L.type==="styling"&&L.body.length===1&&L.body[0].type==="ordgroup"&&L.body[0].body.length===0&&(T.length>1||!g)&&T.pop(),q.length0&&(N+=.25),v.push({pos:N,isDashed:xe[we]})}for(F(u[0]),a=0;a0&&(i0+=I,Pxe))for(a=0;a=h)){var J0=void 0;if(n>0||e.hskipBeforeAndAfter){var Kt,Jt;J0=(Kt=(Jt=y0)==null?void 0:Jt.pregap)!=null?Kt:y,J0!==0&&(b0=k(["arraycolsep"],[]),b0.style.width=M(J0),m0.push(b0))}var Qt=[];for(a=0;a0){for(var q1=re("hline",t,g),R1=re("hdashline",t,g),et=[{type:"elem",elem:ye,shift:0}];v.length>0;){var tr=v.pop(),rr=tr.pos-t0;tr.isDashed?et.push({type:"elem",elem:R1,shift:rr}):et.push({type:"elem",elem:q1,shift:rr})}ye=G({positionType:"individualShift",children:et})}if(j0.length===0)return k(["mord"],[ye],t);var E1=G({positionType:"individualShift",children:j0}),I1=k(["tag"],[E1],t);return E0([ye,I1])},Qa={c:"center ",l:"left ",r:"right "},T0=function(e,t){for(var a=[],n=new S("mtd",[],["mtr-glue"]),l=new S("mtd",[],["mml-eqn-num"]),u=0;u0){var A=e.cols,T="",C=!1,q=0,I=A.length;A[0].type==="separator"&&(y+="top ",q=1),A[A.length-1].type==="separator"&&(y+="bottom ",I-=1);for(var N=q;N0?"left ":"",y+=X[X.length-1].length>0?"right ":"";for(var h0=1;h00&&x&&(C=1),a[A]={type:"align",align:T,pregap:C,postgap:0}}return u.colSeparationType=x?"align":"alignat",u};M0({type:"array",names:["array","darray"],props:{numArgs:1},handler(r,e){var t=Ze(e[0]),a=t?[e[0]]:O(e[0],"ordgroup").body,n=a.map(function(u){var h=je(u),c=h.text;if("lcr".includes(c))return{type:"align",align:c};if(c==="|")return{type:"separator",separator:"|"};if(c===":")return{type:"separator",separator:":"};throw new z("Unknown column alignment: "+c,u)}),l={cols:n,hskipBeforeAndAfter:!0,maxNumCols:n.length};return X0(r.parser,l,Vt(r.envName))},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(r){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[r.envName.replace("*","")],t="c",a={hskipBeforeAndAfter:!1,cols:[{type:"align",align:t}]};if(r.envName.charAt(r.envName.length-1)==="*"){var n=r.parser;if(n.consumeSpaces(),n.fetch().text==="["){if(n.consume(),n.consumeSpaces(),t=n.fetch().text,!"lcr".includes(t))throw new z("Expected l or c or r",n.nextToken);n.consume(),n.consumeSpaces(),n.expect("]"),n.consume(),a.cols=[{type:"align",align:t}]}}var l=X0(r.parser,a,Vt(r.envName)),u=Math.max(0,...l.body.map(h=>h.length));return l.cols=new Array(u).fill({type:"align",align:t}),e?{type:"leftright",mode:r.mode,body:[l],left:e[0],right:e[1],rightColor:void 0}:l},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(r){var e={arraystretch:.5},t=X0(r.parser,e,"script");return t.colSeparationType="small",t},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["subarray"],props:{numArgs:1},handler(r,e){var t=Ze(e[0]),a=t?[e[0]]:O(e[0],"ordgroup").body,n=a.map(function(h){var c=je(h),v=c.text;if("lc".includes(v))return{type:"align",align:v};throw new z("Unknown column alignment: "+v,h)});if(n.length>1)throw new z("{subarray} can contain only one column");var l={cols:n,hskipBeforeAndAfter:!1,arraystretch:.5},u=X0(r.parser,l,"script");if(u.body.length>0&&u.body[0].length>1)throw new z("{subarray} can contain only one column");return u},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(r){var e={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},t=X0(r.parser,e,Vt(r.envName));return{type:"leftright",mode:r.mode,body:[t],left:r.envName.includes("r")?".":"\\{",right:r.envName.includes("r")?"\\}":".",rightColor:void 0}},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:m1,htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(r){Ja.has(r.envName)&&Qe(r);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Ut(r.envName),emptySingleRow:!0,leqno:r.parser.settings.leqno};return X0(r.parser,e,"display")},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:m1,htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(r){Qe(r);var e={autoTag:Ut(r.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:r.parser.settings.leqno};return X0(r.parser,e,"display")},htmlBuilder:A0,mathmlBuilder:T0});M0({type:"array",names:["CD"],props:{numArgs:0},handler(r){return Qe(r),La(r.parser)},htmlBuilder:A0,mathmlBuilder:T0});m("\\nonumber","\\gdef\\@eqnsw{0}");m("\\notag","\\nonumber");B({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(r,e){throw new z(r.funcName+" valid only within array environment")}});var pr=o1;B({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];if(n.type!=="ordgroup")throw new z("Invalid environment name",n);for(var l="",u=0;u{var t=r.font,a=e.withFont(t);return U(r.body,a)},d1=(r,e)=>{var t=r.font,a=e.withFont(t);return Y(r.body,a)},gr={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};B({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=Le(e[0]),l=a;return l in gr&&(l=gr[l]),{type:"font",mode:t.mode,font:l.slice(1),body:n}},htmlBuilder:c1,mathmlBuilder:d1});B({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"mclass",mode:t.mode,mclass:Ke(a),body:[{type:"font",mode:t.mode,font:"boldsymbol",body:a}],isCharacterBox:q0(a)}}});B({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(r,e)=>{var{parser:t,funcName:a,breakOnTokenText:n}=r,{mode:l}=t,u=t.parseExpression(!0,n),h="math"+a.slice(1);return{type:"font",mode:l,font:h,body:{type:"ordgroup",mode:t.mode,body:u}}},htmlBuilder:c1,mathmlBuilder:d1});var _a=(r,e)=>{var t=e.style,a=t.fracNum(),n=t.fracDen(),l;l=e.havingStyle(a);var u=U(r.numer,l,e);if(r.continued){var h=8.5/e.fontMetrics().ptPerEm,c=3.5/e.fontMetrics().ptPerEm;u.height=u.height0?A=3*y:A=7*y,T=e.fontMetrics().denom1):(b>0?(x=e.fontMetrics().num2,A=y):(x=e.fontMetrics().num3,A=3*y),T=e.fontMetrics().denom2);var C;if(g){var I=e.fontMetrics().axisHeight;x-u.depth-(I+.5*b){var t=new S("mfrac",[Y(r.numer,e),Y(r.denom,e)]);if(!r.hasBarLine)t.setAttribute("linethickness","0px");else if(r.barSize){var a=J(r.barSize,e);t.setAttribute("linethickness",M(a))}if(r.leftDelim!=null||r.rightDelim!=null){var n=[];if(r.leftDelim!=null){var l=new S("mo",[new Q(r.leftDelim.replace("\\",""))]);l.setAttribute("fence","true"),n.push(l)}if(n.push(t),r.rightDelim!=null){var u=new S("mo",[new Q(r.rightDelim.replace("\\",""))]);u.setAttribute("fence","true"),n.push(u)}return Nt(n)}return t},f1=(r,e)=>{if(!e)return r;var t={type:"styling",mode:r.mode,style:e,body:[r]};return t};B({type:"genfrac",names:["\\cfrac","\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0],l=e[1],u,h=null,c=null;switch(a){case"\\cfrac":case"\\dfrac":case"\\frac":case"\\tfrac":u=!0;break;case"\\\\atopfrac":u=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":u=!1,h="(",c=")";break;case"\\\\bracefrac":u=!1,h="\\{",c="\\}";break;case"\\\\brackfrac":u=!1,h="[",c="]";break;default:throw new Error("Unrecognized genfrac command")}var v=a==="\\cfrac",g=null;return v||a.startsWith("\\d")?g="display":a.startsWith("\\t")&&(g="text"),f1({type:"genfrac",mode:t.mode,numer:n,denom:l,continued:v,hasBarLine:u,leftDelim:h,rightDelim:c,barSize:null},g)},htmlBuilder:_a,mathmlBuilder:e4});B({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(r){var{parser:e,funcName:t,token:a}=r,n;switch(t){case"\\over":n="\\frac";break;case"\\choose":n="\\binom";break;case"\\atop":n="\\\\atopfrac";break;case"\\brace":n="\\\\bracefrac";break;case"\\brack":n="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:n,token:a}}});var br=["display","text","script","scriptscript"],yr=function(e){var t=null;return e.length>0&&(t=e,t=t==="."?null:t),t};B({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(r,e){var{parser:t}=r,a=e[4],n=e[5],l=Le(e[0]),u=l.type==="atom"&&l.family==="open"?yr(l.text):null,h=Le(e[1]),c=h.type==="atom"&&h.family==="close"?yr(h.text):null,v=O(e[2],"size"),g,b=null;v.isBlank?g=!0:(b=v.value,g=b.number>0);var y=null,x=e[3];if(x.type==="ordgroup"){if(x.body.length>0){var A=O(x.body[0],"textord");y=br[Number(A.text)]}}else x=O(x,"textord"),y=br[Number(x.text)];return f1({type:"genfrac",mode:t.mode,numer:a,denom:n,continued:!1,hasBarLine:g,barSize:b,leftDelim:u,rightDelim:c},y)}});B({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(r,e){var{parser:t,funcName:a,token:n}=r;return{type:"infix",mode:t.mode,replaceWith:"\\\\abovefrac",size:O(e[0],"size").value,token:n}}});B({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0],l=O(e[1],"infix").size;if(!l)throw new Error("\\\\abovefrac expected size, but got "+String(l));var u=e[2],h=l.number>0;return{type:"genfrac",mode:t.mode,numer:n,denom:u,continued:!1,hasBarLine:h,barSize:l,leftDelim:null,rightDelim:null}}});var v1=(r,e)=>{var t=e.style,a,n;r.type==="supsub"?(a=r.sup?U(r.sup,e.havingStyle(t.sup()),e):U(r.sub,e.havingStyle(t.sub()),e),n=O(r.base,"horizBrace")):n=O(r,"horizBrace");var l=U(n.base,e.havingBaseStyle(H.DISPLAY)),u=$e(n,e),h;if(n.isOver?(h=G({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.1},{type:"elem",elem:u}]}),h.children[0].children[0].children[1].classes.push("svg-align")):(h=G({positionType:"bottom",positionData:l.depth+.1+u.height,children:[{type:"elem",elem:u},{type:"kern",size:.1},{type:"elem",elem:l}]}),h.children[0].children[0].children[0].classes.push("svg-align")),a){var c=k(["mord",n.isOver?"mover":"munder"],[h],e);n.isOver?h=G({positionType:"firstBaseline",children:[{type:"elem",elem:c},{type:"kern",size:.2},{type:"elem",elem:a}]}):h=G({positionType:"bottom",positionData:c.depth+.2+a.height+a.depth,children:[{type:"elem",elem:a},{type:"kern",size:.2},{type:"elem",elem:c}]})}return k(["mord",n.isOver?"mover":"munder"],[h],e)},t4=(r,e)=>{var t=We(r.label);return new S(r.isOver?"mover":"munder",[Y(r.base,e),t])};B({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(r,e){var{parser:t,funcName:a}=r;return{type:"horizBrace",mode:t.mode,label:a,isOver:/^\\over/.test(a),base:e[0]}},htmlBuilder:v1,mathmlBuilder:t4});B({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[1],n=O(e[0],"url").url;return t.settings.isTrusted({command:"\\href",url:n})?{type:"href",mode:t.mode,href:n,body:_(a)}:t.formatUnsupportedCmd("\\href")},htmlBuilder:(r,e)=>{var t=r0(r.body,e,!1);return ga(r.href,[],t,e)},mathmlBuilder:(r,e)=>{var t=V0(r.body,e);return t instanceof S||(t=new S("mrow",[t])),t.setAttribute("href",r.href),t}});B({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=O(e[0],"url").url;if(!t.settings.isTrusted({command:"\\url",url:a}))return t.formatUnsupportedCmd("\\url");for(var n=[],l=0;l{var{parser:t,funcName:a,token:n}=r,l=O(e[0],"raw").string,u=e[1];t.settings.strict&&t.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var h,c={};switch(a){case"\\htmlClass":c.class=l,h={command:"\\htmlClass",class:l};break;case"\\htmlId":c.id=l,h={command:"\\htmlId",id:l};break;case"\\htmlStyle":c.style=l,h={command:"\\htmlStyle",style:l};break;case"\\htmlData":{for(var v=l.split(","),g=0;g{var t=r0(r.body,e,!1),a=["enclosing"];r.attributes.class&&a.push(...r.attributes.class.trim().split(/\s+/));var n=k(a,t,e);for(var l in r.attributes)l!=="class"&&r.attributes.hasOwnProperty(l)&&n.setAttribute(l,r.attributes[l]);return n},mathmlBuilder:(r,e)=>V0(r.body,e)});B({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInArgument:!0,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r;return{type:"htmlmathml",mode:t.mode,html:_(e[0]),mathml:_(e[1])}},htmlBuilder:(r,e)=>{var t=r0(r.html,e,!1);return E0(t)},mathmlBuilder:(r,e)=>V0(r.mathml,e)});var mt=function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var t=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!t)throw new z("Invalid size: '"+e+"' in \\includegraphics");var a={number:+(t[1]+t[2]),unit:t[3]};if(!Er(a))throw new z("Invalid unit: '"+a.unit+"' in \\includegraphics.");return a};B({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(r,e,t)=>{var{parser:a}=r,n={number:0,unit:"em"},l={number:.9,unit:"em"},u={number:0,unit:"em"},h="";if(t[0])for(var c=O(t[0],"raw").string,v=c.split(","),g=0;g{var t=J(r.height,e),a=0;r.totalheight.number>0&&(a=J(r.totalheight,e)-t);var n=0;r.width.number>0&&(n=J(r.width,e));var l={height:M(t+a)};n>0&&(l.width=M(n)),a>0&&(l.verticalAlign=M(-a));var u=new bt(r.src,r.alt,l);return u.height=t,u.depth=a,u},mathmlBuilder:(r,e)=>{var t=new S("mglyph",[]);t.setAttribute("alt",r.alt);var a=J(r.height,e),n=0;if(r.totalheight.number>0&&(n=J(r.totalheight,e)-a,t.setAttribute("valign",M(-n))),t.setAttribute("height",M(a+n)),r.width.number>0){var l=J(r.width,e);t.setAttribute("width",M(l))}return t.setAttribute("src",r.src),t}});B({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(r,e){var{parser:t,funcName:a}=r,n=O(e[0],"size");if(t.settings.strict){var l=a[1]==="m",u=n.value.unit==="mu";l?(u||t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" supports only mu units, "+("not "+n.value.unit+" units")),t.mode!=="math"&&t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" works only in math mode")):u&&t.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" doesn't support mu units")}return{type:"kern",mode:t.mode,dimension:n.value}},htmlBuilder(r,e){return Lr(r.dimension,e)},mathmlBuilder(r,e){var t=J(r.dimension,e);return new Pe(t)}});B({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"lap",mode:t.mode,alignment:a.slice(5),body:n}},htmlBuilder:(r,e)=>{var t;r.alignment==="clap"?(t=k([],[U(r.body,e)]),t=k(["inner"],[t],e)):t=k(["inner"],[U(r.body,e)]);var a=k(["fix"],[]),n=k([r.alignment],[t,a],e),l=k(["strut"]);return l.style.height=M(n.height+n.depth),n.depth&&(l.style.verticalAlign=M(-n.depth)),n.children.unshift(l),n=k(["thinbox"],[n],e),k(["mord","vbox"],[n],e)},mathmlBuilder:(r,e)=>{var t=new S("mpadded",[Y(r.body,e)]);if(r.alignment!=="rlap"){var a=r.alignment==="llap"?"-1":"-0.5";t.setAttribute("lspace",a+"width")}return t.setAttribute("width","0px"),t}});B({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(r,e){var{funcName:t,parser:a}=r,n=a.mode;a.switchMode("math");var l=t==="\\("?"\\)":"$",u=a.parseExpression(!1,l);return a.expect(l),a.switchMode(n),{type:"styling",mode:a.mode,style:"text",body:u}}});B({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(r,e){throw new z("Mismatched "+r.funcName)}});var xr=(r,e)=>{switch(e.style.size){case H.DISPLAY.size:return r.display;case H.TEXT.size:return r.text;case H.SCRIPT.size:return r.script;case H.SCRIPTSCRIPT.size:return r.scriptscript;default:return r.text}};B({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(r,e)=>{var{parser:t}=r;return{type:"mathchoice",mode:t.mode,display:_(e[0]),text:_(e[1]),script:_(e[2]),scriptscript:_(e[3])}},htmlBuilder:(r,e)=>{var t=xr(r,e),a=r0(t,e,!1);return E0(a)},mathmlBuilder:(r,e)=>{var t=xr(r,e);return V0(t,e)}});var p1=(r,e,t,a,n,l,u)=>{r=k([],[r]);var h=t&&q0(t),c,v;if(e){var g=U(e,a.havingStyle(n.sup()),a);v={elem:g,kern:Math.max(a.fontMetrics().bigOpSpacing1,a.fontMetrics().bigOpSpacing3-g.depth)}}if(t){var b=U(t,a.havingStyle(n.sub()),a);c={elem:b,kern:Math.max(a.fontMetrics().bigOpSpacing2,a.fontMetrics().bigOpSpacing4-b.height)}}var y;if(v&&c){var x=a.fontMetrics().bigOpSpacing5+c.elem.height+c.elem.depth+c.kern+r.depth+u;y=G({positionType:"bottom",positionData:x,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:c.elem,marginLeft:M(-l)},{type:"kern",size:c.kern},{type:"elem",elem:r},{type:"kern",size:v.kern},{type:"elem",elem:v.elem,marginLeft:M(l)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]})}else if(c){var A=r.height-u;y=G({positionType:"top",positionData:A,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:c.elem,marginLeft:M(-l)},{type:"kern",size:c.kern},{type:"elem",elem:r}]})}else if(v){var T=r.depth+u;y=G({positionType:"bottom",positionData:T,children:[{type:"elem",elem:r},{type:"kern",size:v.kern},{type:"elem",elem:v.elem,marginLeft:M(l)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]})}else return r;var C=[y];if(c&&l!==0&&!h){var q=k(["mspace"],[],a);q.style.marginRight=M(l),C.unshift(q)}return k(["mop","op-limits"],C,a)},g1=new Set(["\\smallint"]),ie=(r,e)=>{var t,a,n=!1,l;r.type==="supsub"?(t=r.sup,a=r.sub,l=O(r.base,"op"),n=!0):l=O(r,"op");var u=e.style,h=!1;u.size===H.DISPLAY.size&&l.symbol&&!g1.has(l.name)&&(h=!0);var c;if(l.symbol){var v=h?"Size2-Regular":"Size1-Regular",g="";if((l.name==="\\oiint"||l.name==="\\oiiint")&&(g=l.name.slice(1),l.name=g==="oiint"?"\\iint":"\\iiint"),c=l0(l.name,v,"math",e,["mop","op-symbol",h?"large-op":"small-op"]),g.length>0){var b=c.italic,y=Gr(g+"Size"+(h?"2":"1"),e);c=G({positionType:"individualShift",children:[{type:"elem",elem:c,shift:0},{type:"elem",elem:y,shift:h?.08:0}]}),l.name="\\"+g,c.classes.unshift("mop"),c.italic=b}}else if(l.body){var x=r0(l.body,e,!0);x.length===1&&x[0]instanceof u0?(c=x[0],c.classes[0]="mop"):c=k(["mop"],x,e)}else{for(var A=[],T=1;T{var t;if(r.symbol)t=new S("mo",[g0(r.name,r.mode)]),g1.has(r.name)&&t.setAttribute("largeop","false");else if(r.body)t=new S("mo",v0(r.body,e));else{t=new S("mi",[new Q(r.name.slice(1))]);var a=new S("mo",[g0("\u2061","text")]);r.parentIsSupSub?t=new S("mrow",[t,a]):t=Xr([t,a])}return t},r4={"\u220F":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22C0":"\\bigwedge","\u22C1":"\\bigvee","\u22C2":"\\bigcap","\u22C3":"\\bigcup","\u2A00":"\\bigodot","\u2A01":"\\bigoplus","\u2A02":"\\bigotimes","\u2A04":"\\biguplus","\u2A06":"\\bigsqcup"};B({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220F","\u2210","\u2211","\u22C0","\u22C1","\u22C2","\u22C3","\u2A00","\u2A01","\u2A02","\u2A04","\u2A06"],props:{numArgs:0},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=a;return n.length===1&&(n=r4[n]),{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:ie,mathmlBuilder:ve});B({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:_(a)}},htmlBuilder:ie,mathmlBuilder:ve});var a4={"\u222B":"\\int","\u222C":"\\iint","\u222D":"\\iiint","\u222E":"\\oint","\u222F":"\\oiint","\u2230":"\\oiiint"};B({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(r){var{parser:e,funcName:t}=r;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:ie,mathmlBuilder:ve});B({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(r){var{parser:e,funcName:t}=r;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:ie,mathmlBuilder:ve});B({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222B","\u222C","\u222D","\u222E","\u222F","\u2230"],props:{numArgs:0,allowedInArgument:!0},handler(r){var{parser:e,funcName:t}=r,a=t;return a.length===1&&(a=a4[a]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:ie,mathmlBuilder:ve});var b1=(r,e)=>{var t,a,n=!1,l;r.type==="supsub"?(t=r.sup,a=r.sub,l=O(r.base,"operatorname"),n=!0):l=O(r,"operatorname");var u;if(l.body.length>0){for(var h=l.body.map(b=>{var y="text"in b?b.text:void 0;return typeof y=="string"?{type:"textord",mode:b.mode,text:y}:b}),c=r0(h,e.withFont("mathrm"),!0),v=0;v{for(var t=v0(r.body,e.withFont("mathrm")),a=!0,n=0;ng.toText()).join("");t=[new Q(h)]}var c=new S("mi",t);c.setAttribute("mathvariant","normal");var v=new S("mo",[g0("\u2061","text")]);return r.parentIsSupSub?new S("mrow",[c,v]):Xr([c,v])};B({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:(r,e)=>{var{parser:t,funcName:a}=r,n=e[0];return{type:"operatorname",mode:t.mode,body:_(n),alwaysHandleSupSub:a==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},htmlBuilder:b1,mathmlBuilder:n4});m("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");$0({type:"ordgroup",htmlBuilder(r,e){return r.semisimple?E0(r0(r.body,e,!1)):k(["mord"],r0(r.body,e,!0),e)},mathmlBuilder(r,e){return V0(r.body,e,!0)}});B({type:"overline",names:["\\overline"],props:{numArgs:1},handler(r,e){var{parser:t}=r,a=e[0];return{type:"overline",mode:t.mode,body:a}},htmlBuilder(r,e){var t=U(r.body,e.havingCrampedStyle()),a=re("overline-line",e),n=e.fontMetrics().defaultRuleThickness,l=G({positionType:"firstBaseline",children:[{type:"elem",elem:t},{type:"kern",size:3*n},{type:"elem",elem:a},{type:"kern",size:n}]});return k(["mord","overline"],[l],e)},mathmlBuilder(r,e){var t=new S("mo",[new Q("\u203E")]);t.setAttribute("stretchy","true");var a=new S("mover",[Y(r.body,e),t]);return a.setAttribute("accent","true"),a}});B({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"phantom",mode:t.mode,body:_(a)}},htmlBuilder:(r,e)=>{var t=r0(r.body,e.withPhantom(),!1);return E0(t)},mathmlBuilder:(r,e)=>{var t=v0(r.body,e);return new S("mphantom",t)}});m("\\hphantom","\\smash{\\phantom{#1}}");B({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(r,e)=>{var{parser:t}=r,a=e[0];return{type:"vphantom",mode:t.mode,body:a}},htmlBuilder:(r,e)=>{var t=k(["inner"],[U(r.body,e.withPhantom())]),a=k(["fix"],[]);return k(["mord","rlap"],[t,a],e)},mathmlBuilder:(r,e)=>{var t=v0(_(r.body),e),a=new S("mphantom",t),n=new S("mpadded",[a]);return n.setAttribute("width","0px"),n}});B({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(r,e){var{parser:t}=r,a=O(e[0],"size").value,n=e[1];return{type:"raisebox",mode:t.mode,dy:a,body:n}},htmlBuilder(r,e){var t=U(r.body,e),a=J(r.dy,e);return G({positionType:"shift",positionData:-a,children:[{type:"elem",elem:t}]})},mathmlBuilder(r,e){var t=new S("mpadded",[Y(r.body,e)]),a=r.dy.number+r.dy.unit;return t.setAttribute("voffset",a),t}});B({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0,allowedInArgument:!0},handler(r){var{parser:e}=r;return{type:"internal",mode:e.mode}}});B({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(r,e,t){var{parser:a}=r,n=t[0],l=O(e[0],"size"),u=O(e[1],"size");return{type:"rule",mode:a.mode,shift:n&&O(n,"size").value,width:l.value,height:u.value}},htmlBuilder(r,e){var t=k(["mord","rule"],[],e),a=J(r.width,e),n=J(r.height,e),l=r.shift?J(r.shift,e):0;return t.style.borderRightWidth=M(a),t.style.borderTopWidth=M(n),t.style.bottom=M(l),t.width=a,t.height=n+l,t.depth=-l,t.maxFontSize=n*1.125*e.sizeMultiplier,t},mathmlBuilder(r,e){var t=J(r.width,e),a=J(r.height,e),n=r.shift?J(r.shift,e):0,l=e.color&&e.getColor()||"black",u=new S("mspace");u.setAttribute("mathbackground",l),u.setAttribute("width",M(t)),u.setAttribute("height",M(a));var h=new S("mpadded",[u]);return n>=0?h.setAttribute("height",M(n)):(h.setAttribute("height",M(n)),h.setAttribute("depth",M(-n))),h.setAttribute("voffset",M(n)),h}});function y1(r,e,t){for(var a=r0(r,e,!1),n=e.sizeMultiplier/t.sizeMultiplier,l=0;l{var t=e.havingSize(r.size);return y1(r.body,t,e)};B({type:"sizing",names:wr,props:{numArgs:0,allowedInText:!0},handler:(r,e)=>{var{breakOnTokenText:t,funcName:a,parser:n}=r,l=n.parseExpression(!1,t);return{type:"sizing",mode:n.mode,size:wr.indexOf(a)+1,body:l}},htmlBuilder:i4,mathmlBuilder:(r,e)=>{var t=e.havingSize(r.size),a=v0(r.body,t),n=new S("mstyle",a);return n.setAttribute("mathsize",M(t.sizeMultiplier)),n}});B({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(r,e,t)=>{var{parser:a}=r,n=!1,l=!1,u=t[0]&&O(t[0],"ordgroup");if(u)for(var h="",c=0;c{var t=k([],[U(r.body,e)]);if(!r.smashHeight&&!r.smashDepth)return t;if(r.smashHeight&&(t.height=0),r.smashDepth&&(t.depth=0),r.smashHeight&&r.smashDepth)return k(["mord","smash"],[t],e);if(t.children)for(var a=0;a{var t=new S("mpadded",[Y(r.body,e)]);return r.smashHeight&&t.setAttribute("height","0px"),r.smashDepth&&t.setAttribute("depth","0px"),t}});B({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(r,e,t){var{parser:a}=r,n=t[0],l=e[0];return{type:"sqrt",mode:a.mode,body:l,index:n}},htmlBuilder(r,e){var t=U(r.body,e.havingCrampedStyle());t.height===0&&(t.height=e.fontMetrics().xHeight),t=ae(t,e);var a=e.fontMetrics(),n=a.defaultRuleThickness,l=n;e.style.idt.height+t.depth+u&&(u=(u+b-t.height-t.depth)/2);var y=c.height-t.height-u-v;t.style.paddingLeft=M(g);var x=G({positionType:"firstBaseline",children:[{type:"elem",elem:t,wrapperClasses:["svg-align"]},{type:"kern",size:-(t.height+y)},{type:"elem",elem:c},{type:"kern",size:v}]});if(r.index){var A=e.havingStyle(H.SCRIPTSCRIPT),T=U(r.index,A,e),C=.6*(x.height-x.depth),q=G({positionType:"shift",positionData:-C,children:[{type:"elem",elem:T}]}),I=k(["root"],[q]);return k(["mord","sqrt"],[I,x],e)}else return k(["mord","sqrt"],[x],e)},mathmlBuilder(r,e){var{body:t,index:a}=r;return a?new S("mroot",[Y(t,e),Y(a,e)]):new S("msqrt",[Y(t,e)])}});var kr={display:H.DISPLAY,text:H.TEXT,script:H.SCRIPT,scriptscript:H.SCRIPTSCRIPT};B({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(r,e){var{breakOnTokenText:t,funcName:a,parser:n}=r,l=n.parseExpression(!0,t),u=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:u,body:l}},htmlBuilder(r,e){var t=kr[r.style],a=e.havingStyle(t).withFont("");return y1(r.body,a,e)},mathmlBuilder(r,e){var t=kr[r.style],a=e.havingStyle(t),n=v0(r.body,a),l=new S("mstyle",n),u={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},h=u[r.style];return l.setAttribute("scriptlevel",h[0]),l.setAttribute("displaystyle",h[1]),l}});var l4=function(e,t){var a=e.base;if(a)if(a.type==="op"){var n=a.limits&&(t.style.size===H.DISPLAY.size||a.alwaysHandleSupSub);return n?ie:null}else if(a.type==="operatorname"){var l=a.alwaysHandleSupSub&&(t.style.size===H.DISPLAY.size||a.limits);return l?b1:null}else{if(a.type==="accent")return q0(a.base)?Ft:null;if(a.type==="horizBrace"){var u=!e.sub;return u===a.isOver?v1:null}else return null}else return null};$0({type:"supsub",htmlBuilder(r,e){var t=l4(r,e);if(t)return t(r,e);var{base:a,sup:n,sub:l}=r,u=U(a,e),h,c,v=e.fontMetrics(),g=0,b=0,y=a&&q0(a);if(n){var x=e.havingStyle(e.style.sup());h=U(n,x,e),y||(g=u.height-x.fontMetrics().supDrop*x.sizeMultiplier/e.sizeMultiplier)}if(l){var A=e.havingStyle(e.style.sub());c=U(l,A,e),y||(b=u.depth+A.fontMetrics().subDrop*A.sizeMultiplier/e.sizeMultiplier)}var T;e.style===H.DISPLAY?T=v.sup1:e.style.cramped?T=v.sup3:T=v.sup2;var C=e.sizeMultiplier,q=M(.5/v.ptPerEm/C),I=null;if(c){var N=r.base&&r.base.type==="op"&&r.base.name&&(r.base.name==="\\oiint"||r.base.name==="\\oiiint");(u instanceof u0||N)&&(I=M(-u.italic))}var F;if(h&&c){g=Math.max(g,T,h.depth+.25*v.xHeight),b=Math.max(b,v.sub2);var V=v.defaultRuleThickness,L=4*V;if(g-h.depth-(c.height-b)0&&(g+=P,b-=P)}var W=[{type:"elem",elem:c,shift:b,marginRight:q,marginLeft:I},{type:"elem",elem:h,shift:-g,marginRight:q}];F=G({positionType:"individualShift",children:W})}else if(c){b=Math.max(b,v.sub1,c.height-.8*v.xHeight);var X=[{type:"elem",elem:c,marginLeft:I,marginRight:q}];F=G({positionType:"shift",positionData:b,children:X})}else if(h)g=Math.max(g,T,h.depth+.25*v.xHeight),F=G({positionType:"shift",positionData:-g,children:[{type:"elem",elem:h,marginRight:q}]});else throw new Error("supsub must have either sup or sub.");var h0=St(u,"right")||"mord";return k([h0],[u,k(["msupsub"],[F])],e)},mathmlBuilder(r,e){var t=!1,a,n;r.base&&r.base.type==="horizBrace"&&(n=!!r.sup,n===r.base.isOver&&(t=!0,a=r.base.isOver)),r.base&&(r.base.type==="op"||r.base.type==="operatorname")&&(r.base.parentIsSupSub=!0);var l=[Y(r.base,e)];r.sub&&l.push(Y(r.sub,e)),r.sup&&l.push(Y(r.sup,e));var u;if(t)u=a?"mover":"munder";else if(r.sub)if(r.sup){var v=r.base;v&&v.type==="op"&&v.limits&&e.style===H.DISPLAY||v&&v.type==="operatorname"&&v.alwaysHandleSupSub&&(e.style===H.DISPLAY||v.limits)?u="munderover":u="msubsup"}else{var c=r.base;c&&c.type==="op"&&c.limits&&(e.style===H.DISPLAY||c.alwaysHandleSupSub)||c&&c.type==="operatorname"&&c.alwaysHandleSupSub&&(c.limits||e.style===H.DISPLAY)?u="munder":u="msub"}else{var h=r.base;h&&h.type==="op"&&h.limits&&(e.style===H.DISPLAY||h.alwaysHandleSupSub)||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(h.limits||e.style===H.DISPLAY)?u="mover":u="msup"}return new S(u,l)}});$0({type:"atom",htmlBuilder(r,e){return It(r.text,r.mode,e,["m"+r.family])},mathmlBuilder(r,e){var t=new S("mo",[g0(r.text,r.mode)]);if(r.family==="bin"){var a=Ot(r,e);a==="bold-italic"&&t.setAttribute("mathvariant",a)}else r.family==="punct"?t.setAttribute("separator","true"):(r.family==="open"||r.family==="close")&&t.setAttribute("stretchy","false");return t}});var x1={mi:"italic",mn:"normal",mtext:"normal"};$0({type:"mathord",htmlBuilder(r,e){return Ye(r,e,"mathord")},mathmlBuilder(r,e){var t=new S("mi",[g0(r.text,r.mode,e)]),a=Ot(r,e)||"italic";return a!==x1[t.type]&&t.setAttribute("mathvariant",a),t}});$0({type:"textord",htmlBuilder(r,e){return Ye(r,e,"textord")},mathmlBuilder(r,e){var t=g0(r.text,r.mode,e),a=Ot(r,e)||"normal",n;return r.mode==="text"?n=new S("mtext",[t]):/[0-9]/.test(r.text)?n=new S("mn",[t]):r.text==="\\prime"?n=new S("mo",[t]):n=new S("mi",[t]),a!==x1[n.type]&&n.setAttribute("mathvariant",a),n}});var ct={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},dt={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};$0({type:"spacing",htmlBuilder(r,e){if(dt.hasOwnProperty(r.text)){var t=dt[r.text].className||"";if(r.mode==="text"){var a=Ye(r,e,"textord");return a.classes.push(t),a}else return k(["mspace",t],[It(r.text,r.mode,e)],e)}else{if(ct.hasOwnProperty(r.text))return k(["mspace",ct[r.text]],[],e);throw new z('Unknown type of space "'+r.text+'"')}},mathmlBuilder(r,e){var t;if(dt.hasOwnProperty(r.text))t=new S("mtext",[new Q("\xA0")]);else{if(ct.hasOwnProperty(r.text))return new S("mspace");throw new z('Unknown type of space "'+r.text+'"')}return t}});var Sr=()=>{var r=new S("mtd",[]);return r.setAttribute("width","50%"),r};$0({type:"tag",mathmlBuilder(r,e){var t=new S("mtable",[new S("mtr",[Sr(),new S("mtd",[V0(r.body,e)]),Sr(),new S("mtd",[V0(r.tag,e)])])]);return t.setAttribute("width","100%"),t}});var zr={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Mr={"\\textbf":"textbf","\\textmd":"textmd"},s4={"\\textit":"textit","\\textup":"textup"},Ar=(r,e)=>{var t=r.font;if(t){if(zr[t])return e.withTextFontFamily(zr[t]);if(Mr[t])return e.withTextFontWeight(Mr[t]);if(t==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(s4[t])};B({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(r,e){var{parser:t,funcName:a}=r,n=e[0];return{type:"text",mode:t.mode,body:_(n),font:a}},htmlBuilder(r,e){var t=Ar(r,e),a=r0(r.body,t,!0);return k(["mord","text"],a,t)},mathmlBuilder(r,e){var t=Ar(r,e);return V0(r.body,t)}});B({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(r,e){var{parser:t}=r;return{type:"underline",mode:t.mode,body:e[0]}},htmlBuilder(r,e){var t=U(r.body,e),a=re("underline-line",e),n=e.fontMetrics().defaultRuleThickness,l=G({positionType:"top",positionData:t.height,children:[{type:"kern",size:n},{type:"elem",elem:a},{type:"kern",size:3*n},{type:"elem",elem:t}]});return k(["mord","underline"],[l],e)},mathmlBuilder(r,e){var t=new S("mo",[new Q("\u203E")]);t.setAttribute("stretchy","true");var a=new S("munder",[Y(r.body,e),t]);return a.setAttribute("accentunder","true"),a}});B({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(r,e){var{parser:t}=r;return{type:"vcenter",mode:t.mode,body:e[0]}},htmlBuilder(r,e){var t=U(r.body,e),a=e.fontMetrics().axisHeight,n=.5*(t.height-a-(t.depth+a));return G({positionType:"shift",positionData:n,children:[{type:"elem",elem:t}]})},mathmlBuilder(r,e){return new S("mpadded",[Y(r.body,e)],["vcenter"])}});B({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(r,e,t){throw new z("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(r,e){for(var t=Tr(r),a=[],n=e.havingStyle(e.style.text()),l=0;lr.body.replace(/ /g,r.star?"\u2423":"\xA0"),F0=Ur,w1=`[ \r + ]`,u4="\\\\[a-zA-Z@]+",o4="\\\\[^\uD800-\uDFFF]",h4="("+u4+")"+w1+"*",m4=`\\\\( +|[ \r ]+ +?)[ \r ]*`,Bt="[\u0300-\u036F]",c4=new RegExp(Bt+"+$"),d4="("+w1+"+)|"+(m4+"|")+"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]"+(Bt+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(Bt+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+h4)+("|"+o4+")"),Ge=class{constructor(e,t){this.input=e,this.settings=t,this.tokenRegex=new RegExp(d4,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){var e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new d0("EOF",new c0(this,t,t));var a=this.tokenRegex.exec(e);if(a===null||a.index!==t)throw new z("Unexpected character: '"+e[t]+"'",new d0(e[t],new c0(this,t,t+1)));var n=a[6]||a[3]||(a[2]?"\\ ":" ");if(this.catcodes[n]===14){var l=e.indexOf(` +`,this.tokenRegex.lastIndex);return l===-1?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=l+1,this.lex()}return new d0(n,new c0(this,t,this.tokenRegex.lastIndex))}},Dt=class{constructor(e,t){e===void 0&&(e={}),t===void 0&&(t={}),this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new z("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var t in e)e.hasOwnProperty(t)&&(e[t]==null?delete this.current[t]:this.current[t]=e[t])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,t,a){if(a===void 0&&(a=!1),a){for(var n=0;n0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var l=this.undefStack[this.undefStack.length-1];l&&!l.hasOwnProperty(e)&&(l[e]=this.current[e])}t==null?delete this.current[e]:this.current[e]=t}},f4=h1;m("\\noexpand",function(r){var e=r.popToken();return r.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});m("\\expandafter",function(r){var e=r.popToken();return r.expandOnce(!0),{tokens:[e],numArgs:0}});m("\\@firstoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[0],numArgs:0}});m("\\@secondoftwo",function(r){var e=r.consumeArgs(2);return{tokens:e[1],numArgs:0}});m("\\@ifnextchar",function(r){var e=r.consumeArgs(3);r.consumeSpaces();var t=r.future();return e[0].length===1&&e[0][0].text===t.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});m("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");m("\\TextOrMath",function(r){var e=r.consumeArgs(2);return r.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var Br={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};m("\\char",function(r){var e=r.popToken(),t,a=0;if(e.text==="'")t=8,e=r.popToken();else if(e.text==='"')t=16,e=r.popToken();else if(e.text==="`")if(e=r.popToken(),e.text[0]==="\\")a=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new z("\\char` missing argument");a=e.text.charCodeAt(0)}else t=10;if(t){if(a=Br[e.text],a==null||a>=t)throw new z("Invalid base-"+t+" digit "+e.text);for(var n;(n=Br[r.future().text])!=null&&n{var n=r.consumeArg().tokens;if(n.length!==1)throw new z("\\newcommand's first argument must be a macro name");var l=n[0].text,u=r.isDefined(l);if(u&&!e)throw new z("\\newcommand{"+l+"} attempting to redefine "+(l+"; use \\renewcommand"));if(!u&&!t)throw new z("\\renewcommand{"+l+"} when command "+l+" does not yet exist; use \\newcommand");var h=0;if(n=r.consumeArg().tokens,n.length===1&&n[0].text==="["){for(var c="",v=r.expandNextToken();v.text!=="]"&&v.text!=="EOF";)c+=v.text,v=r.expandNextToken();if(!c.match(/^\s*[0-9]+\s*$/))throw new z("Invalid number of arguments: "+c);h=parseInt(c),n=r.consumeArg().tokens}return u&&a||r.macros.set(l,{tokens:n,numArgs:h}),""};m("\\newcommand",r=>Xt(r,!1,!0,!1));m("\\renewcommand",r=>Xt(r,!0,!1,!1));m("\\providecommand",r=>Xt(r,!0,!0,!0));m("\\message",r=>{var e=r.consumeArgs(1)[0];return console.log(e.reverse().map(t=>t.text).join("")),""});m("\\errmessage",r=>{var e=r.consumeArgs(1)[0];return console.error(e.reverse().map(t=>t.text).join("")),""});m("\\show",r=>{var e=r.popToken(),t=e.text;return console.log(e,r.macros.get(t),F0[t],$.math[t],$.text[t]),""});m("\\bgroup","{");m("\\egroup","}");m("~","\\nobreakspace");m("\\lq","`");m("\\rq","'");m("\\aa","\\r a");m("\\AA","\\r A");m("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");m("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");m("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");m("\u212C","\\mathscr{B}");m("\u2130","\\mathscr{E}");m("\u2131","\\mathscr{F}");m("\u210B","\\mathscr{H}");m("\u2110","\\mathscr{I}");m("\u2112","\\mathscr{L}");m("\u2133","\\mathscr{M}");m("\u211B","\\mathscr{R}");m("\u212D","\\mathfrak{C}");m("\u210C","\\mathfrak{H}");m("\u2128","\\mathfrak{Z}");m("\\Bbbk","\\Bbb{k}");m("\xB7","\\cdotp");m("\\llap","\\mathllap{\\textrm{#1}}");m("\\rlap","\\mathrlap{\\textrm{#1}}");m("\\clap","\\mathclap{\\textrm{#1}}");m("\\mathstrut","\\vphantom{(}");m("\\underbar","\\underline{\\text{#1}}");m("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}\\nobreak}{\\char"338}');m("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");m("\\ne","\\neq");m("\u2260","\\neq");m("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");m("\u2209","\\notin");m("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");m("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");m("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");m("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");m("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");m("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");m("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");m("\u27C2","\\perp");m("\u203C","\\mathclose{!\\mkern-0.8mu!}");m("\u220C","\\notni");m("\u231C","\\ulcorner");m("\u231D","\\urcorner");m("\u231E","\\llcorner");m("\u231F","\\lrcorner");m("\xA9","\\copyright");m("\xAE","\\textregistered");m("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');m("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');m("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');m("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');m("\\vdots","{\\varvdots\\rule{0pt}{15pt}}");m("\u22EE","\\vdots");m("\\varGamma","\\mathit{\\Gamma}");m("\\varDelta","\\mathit{\\Delta}");m("\\varTheta","\\mathit{\\Theta}");m("\\varLambda","\\mathit{\\Lambda}");m("\\varXi","\\mathit{\\Xi}");m("\\varPi","\\mathit{\\Pi}");m("\\varSigma","\\mathit{\\Sigma}");m("\\varUpsilon","\\mathit{\\Upsilon}");m("\\varPhi","\\mathit{\\Phi}");m("\\varPsi","\\mathit{\\Psi}");m("\\varOmega","\\mathit{\\Omega}");m("\\substack","\\begin{subarray}{c}#1\\end{subarray}");m("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");m("\\boxed","\\fbox{$\\displaystyle{#1}$}");m("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");m("\\implies","\\DOTSB\\;\\Longrightarrow\\;");m("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");m("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}");m("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");var Dr={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"},v4=new Set(["bin","rel"]);m("\\dots",function(r){var e="\\dotso",t=r.expandAfterFuture().text;return t in Dr?e=Dr[t]:(t.slice(0,4)==="\\not"||t in $.math&&v4.has($.math[t].group))&&(e="\\dotsb"),e});var Yt={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};m("\\dotso",function(r){var e=r.future().text;return e in Yt?"\\ldots\\,":"\\ldots"});m("\\dotsc",function(r){var e=r.future().text;return e in Yt&&e!==","?"\\ldots\\,":"\\ldots"});m("\\cdots",function(r){var e=r.future().text;return e in Yt?"\\@cdots\\,":"\\@cdots"});m("\\dotsb","\\cdots");m("\\dotsm","\\cdots");m("\\dotsi","\\!\\cdots");m("\\dotsx","\\ldots\\,");m("\\DOTSI","\\relax");m("\\DOTSB","\\relax");m("\\DOTSX","\\relax");m("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");m("\\,","\\tmspace+{3mu}{.1667em}");m("\\thinspace","\\,");m("\\>","\\mskip{4mu}");m("\\:","\\tmspace+{4mu}{.2222em}");m("\\medspace","\\:");m("\\;","\\tmspace+{5mu}{.2777em}");m("\\thickspace","\\;");m("\\!","\\tmspace-{3mu}{.1667em}");m("\\negthinspace","\\!");m("\\negmedspace","\\tmspace-{4mu}{.2222em}");m("\\negthickspace","\\tmspace-{5mu}{.277em}");m("\\enspace","\\kern.5em ");m("\\enskip","\\hskip.5em\\relax");m("\\quad","\\hskip1em\\relax");m("\\qquad","\\hskip2em\\relax");m("\\tag","\\@ifstar\\tag@literal\\tag@paren");m("\\tag@paren","\\tag@literal{({#1})}");m("\\tag@literal",r=>{if(r.macros.get("\\df@tag"))throw new z("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});m("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");m("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");m("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");m("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");m("\\newline","\\\\\\relax");m("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var k1=M(S0["Main-Regular"][84][1]-.7*S0["Main-Regular"][65][1]);m("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+k1+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");m("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+k1+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");m("\\hspace","\\@ifstar\\@hspacer\\@hspace");m("\\@hspace","\\hskip #1\\relax");m("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");m("\\ordinarycolon",":");m("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");m("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');m("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');m("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');m("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');m("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');m("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');m("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');m("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');m("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');m("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');m("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');m("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');m("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');m("\u2237","\\dblcolon");m("\u2239","\\eqcolon");m("\u2254","\\coloneqq");m("\u2255","\\eqqcolon");m("\u2A74","\\Coloneqq");m("\\ratio","\\vcentcolon");m("\\coloncolon","\\dblcolon");m("\\colonequals","\\coloneqq");m("\\coloncolonequals","\\Coloneqq");m("\\equalscolon","\\eqqcolon");m("\\equalscoloncolon","\\Eqqcolon");m("\\colonminus","\\coloneq");m("\\coloncolonminus","\\Coloneq");m("\\minuscolon","\\eqcolon");m("\\minuscoloncolon","\\Eqcolon");m("\\coloncolonapprox","\\Colonapprox");m("\\coloncolonsim","\\Colonsim");m("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");m("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");m("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");m("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");m("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");m("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");m("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");m("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");m("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");m("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");m("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");m("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");m("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");m("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");m("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");m("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");m("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");m("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");m("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");m("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");m("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");m("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");m("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");m("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");m("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");m("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");m("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");m("\\imath","\\html@mathml{\\@imath}{\u0131}");m("\\jmath","\\html@mathml{\\@jmath}{\u0237}");m("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");m("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");m("\u27E6","\\llbracket");m("\u27E7","\\rrbracket");m("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");m("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");m("\u2983","\\lBrace");m("\u2984","\\rBrace");m("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");m("\u29B5","\\minuso");m("\\darr","\\downarrow");m("\\dArr","\\Downarrow");m("\\Darr","\\Downarrow");m("\\lang","\\langle");m("\\rang","\\rangle");m("\\uarr","\\uparrow");m("\\uArr","\\Uparrow");m("\\Uarr","\\Uparrow");m("\\N","\\mathbb{N}");m("\\R","\\mathbb{R}");m("\\Z","\\mathbb{Z}");m("\\alef","\\aleph");m("\\alefsym","\\aleph");m("\\Alpha","\\mathrm{A}");m("\\Beta","\\mathrm{B}");m("\\bull","\\bullet");m("\\Chi","\\mathrm{X}");m("\\clubs","\\clubsuit");m("\\cnums","\\mathbb{C}");m("\\Complex","\\mathbb{C}");m("\\Dagger","\\ddagger");m("\\diamonds","\\diamondsuit");m("\\empty","\\emptyset");m("\\Epsilon","\\mathrm{E}");m("\\Eta","\\mathrm{H}");m("\\exist","\\exists");m("\\harr","\\leftrightarrow");m("\\hArr","\\Leftrightarrow");m("\\Harr","\\Leftrightarrow");m("\\hearts","\\heartsuit");m("\\image","\\Im");m("\\infin","\\infty");m("\\Iota","\\mathrm{I}");m("\\isin","\\in");m("\\Kappa","\\mathrm{K}");m("\\larr","\\leftarrow");m("\\lArr","\\Leftarrow");m("\\Larr","\\Leftarrow");m("\\lrarr","\\leftrightarrow");m("\\lrArr","\\Leftrightarrow");m("\\Lrarr","\\Leftrightarrow");m("\\Mu","\\mathrm{M}");m("\\natnums","\\mathbb{N}");m("\\Nu","\\mathrm{N}");m("\\Omicron","\\mathrm{O}");m("\\plusmn","\\pm");m("\\rarr","\\rightarrow");m("\\rArr","\\Rightarrow");m("\\Rarr","\\Rightarrow");m("\\real","\\Re");m("\\reals","\\mathbb{R}");m("\\Reals","\\mathbb{R}");m("\\Rho","\\mathrm{P}");m("\\sdot","\\cdot");m("\\sect","\\S");m("\\spades","\\spadesuit");m("\\sub","\\subset");m("\\sube","\\subseteq");m("\\supe","\\supseteq");m("\\Tau","\\mathrm{T}");m("\\thetasym","\\vartheta");m("\\weierp","\\wp");m("\\Zeta","\\mathrm{Z}");m("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");m("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");m("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");m("\\bra","\\mathinner{\\langle{#1}|}");m("\\ket","\\mathinner{|{#1}\\rangle}");m("\\braket","\\mathinner{\\langle{#1}\\rangle}");m("\\Bra","\\left\\langle#1\\right|");m("\\Ket","\\left|#1\\right\\rangle");var S1=r=>e=>{var t=e.consumeArg().tokens,a=e.consumeArg().tokens,n=e.consumeArg().tokens,l=e.consumeArg().tokens,u=e.macros.get("|"),h=e.macros.get("\\|");e.macros.beginGroup();var c=b=>y=>{r&&(y.macros.set("|",u),n.length&&y.macros.set("\\|",h));var x=b;if(!b&&n.length){var A=y.future();A.text==="|"&&(y.popToken(),x=!0)}return{tokens:x?n:a,numArgs:0}};e.macros.set("|",c(!1)),n.length&&e.macros.set("\\|",c(!0));var v=e.consumeArg().tokens,g=e.expandTokens([...l,...v,...t]);return e.macros.endGroup(),{tokens:g.reverse(),numArgs:0}};m("\\bra@ket",S1(!1));m("\\bra@set",S1(!0));m("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");m("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");m("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");m("\\angln","{\\angl n}");m("\\blue","\\textcolor{##6495ed}{#1}");m("\\orange","\\textcolor{##ffa500}{#1}");m("\\pink","\\textcolor{##ff00af}{#1}");m("\\red","\\textcolor{##df0030}{#1}");m("\\green","\\textcolor{##28ae7b}{#1}");m("\\gray","\\textcolor{gray}{#1}");m("\\purple","\\textcolor{##9d38bd}{#1}");m("\\blueA","\\textcolor{##ccfaff}{#1}");m("\\blueB","\\textcolor{##80f6ff}{#1}");m("\\blueC","\\textcolor{##63d9ea}{#1}");m("\\blueD","\\textcolor{##11accd}{#1}");m("\\blueE","\\textcolor{##0c7f99}{#1}");m("\\tealA","\\textcolor{##94fff5}{#1}");m("\\tealB","\\textcolor{##26edd5}{#1}");m("\\tealC","\\textcolor{##01d1c1}{#1}");m("\\tealD","\\textcolor{##01a995}{#1}");m("\\tealE","\\textcolor{##208170}{#1}");m("\\greenA","\\textcolor{##b6ffb0}{#1}");m("\\greenB","\\textcolor{##8af281}{#1}");m("\\greenC","\\textcolor{##74cf70}{#1}");m("\\greenD","\\textcolor{##1fab54}{#1}");m("\\greenE","\\textcolor{##0d923f}{#1}");m("\\goldA","\\textcolor{##ffd0a9}{#1}");m("\\goldB","\\textcolor{##ffbb71}{#1}");m("\\goldC","\\textcolor{##ff9c39}{#1}");m("\\goldD","\\textcolor{##e07d10}{#1}");m("\\goldE","\\textcolor{##a75a05}{#1}");m("\\redA","\\textcolor{##fca9a9}{#1}");m("\\redB","\\textcolor{##ff8482}{#1}");m("\\redC","\\textcolor{##f9685d}{#1}");m("\\redD","\\textcolor{##e84d39}{#1}");m("\\redE","\\textcolor{##bc2612}{#1}");m("\\maroonA","\\textcolor{##ffbde0}{#1}");m("\\maroonB","\\textcolor{##ff92c6}{#1}");m("\\maroonC","\\textcolor{##ed5fa6}{#1}");m("\\maroonD","\\textcolor{##ca337c}{#1}");m("\\maroonE","\\textcolor{##9e034e}{#1}");m("\\purpleA","\\textcolor{##ddd7ff}{#1}");m("\\purpleB","\\textcolor{##c6b9fc}{#1}");m("\\purpleC","\\textcolor{##aa87ff}{#1}");m("\\purpleD","\\textcolor{##7854ab}{#1}");m("\\purpleE","\\textcolor{##543b78}{#1}");m("\\mintA","\\textcolor{##f5f9e8}{#1}");m("\\mintB","\\textcolor{##edf2df}{#1}");m("\\mintC","\\textcolor{##e0e5cc}{#1}");m("\\grayA","\\textcolor{##f6f7f7}{#1}");m("\\grayB","\\textcolor{##f0f1f2}{#1}");m("\\grayC","\\textcolor{##e3e5e6}{#1}");m("\\grayD","\\textcolor{##d6d8da}{#1}");m("\\grayE","\\textcolor{##babec2}{#1}");m("\\grayF","\\textcolor{##888d93}{#1}");m("\\grayG","\\textcolor{##626569}{#1}");m("\\grayH","\\textcolor{##3b3e40}{#1}");m("\\grayI","\\textcolor{##21242c}{#1}");m("\\kaBlue","\\textcolor{##314453}{#1}");m("\\kaGreen","\\textcolor{##71B307}{#1}");var z1={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},Ct=class{constructor(e,t,a){this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new Dt(f4,t.macros),this.mode=a,this.stack=[]}feed(e){this.lexer=new Ge(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var t,a,n;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;t=this.popToken(),{tokens:n,end:a}=this.consumeArg(["]"])}else({tokens:n,start:t,end:a}=this.consumeArg());return this.pushToken(new d0("EOF",a.loc)),this.pushTokens(n),new d0("",c0.range(t,a))}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var t=[],a=e&&e.length>0;a||this.consumeSpaces();var n=this.future(),l,u=0,h=0;do{if(l=this.popToken(),t.push(l),l.text==="{")++u;else if(l.text==="}"){if(--u,u===-1)throw new z("Extra }",l)}else if(l.text==="EOF")throw new z("Unexpected end of input in a macro argument, expected '"+(e&&a?e[h]:"}")+"'",l);if(e&&a)if((u===0||u===1&&e[h]==="{")&&l.text===e[h]){if(++h,h===e.length){t.splice(-h,h);break}}else h=0}while(u!==0||a);return n.text==="{"&&t[t.length-1].text==="}"&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:n,end:l}}consumeArgs(e,t){if(t){if(t.length!==e+1)throw new z("The length of delimiters doesn't match the number of args!");for(var a=t[0],n=0;nthis.settings.maxExpand)throw new z("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),a=t.text,n=t.noexpand?null:this._getExpansion(a);if(n==null||e&&n.unexpandable){if(e&&n==null&&a[0]==="\\"&&!this.isDefined(a))throw new z("Undefined control sequence: "+a);return this.pushToken(t),!1}this.countExpansion(1);var l=n.tokens,u=this.consumeArgs(n.numArgs,n.delimiters);if(n.numArgs){l=l.slice();for(var h=l.length-1;h>=0;--h){var c=l[h];if(c.text==="#"){if(h===0)throw new z("Incomplete placeholder at end of macro body",c);if(c=l[--h],c.text==="#")l.splice(h+1,1);else if(/^[1-9]$/.test(c.text))l.splice(h,2,...u[+c.text-1]);else throw new z("Not a valid argument number",c)}}}return this.pushTokens(l),l.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}}expandMacro(e){return this.macros.has(e)?this.expandTokens([new d0(e)]):void 0}expandTokens(e){var t=[],a=this.stack.length;for(this.pushTokens(e);this.stack.length>a;)if(this.expandOnce(!0)===!1){var n=this.stack.pop();n.treatAsRelax&&(n.noexpand=!1,n.treatAsRelax=!1),t.push(n)}return this.countExpansion(t.length),t}expandMacroAsText(e){var t=this.expandMacro(e);return t&&t.map(a=>a.text).join("")}_getExpansion(e){var t=this.macros.get(e);if(t==null)return t;if(e.length===1){var a=this.lexer.catcodes[e];if(a!=null&&a!==13)return}var n=typeof t=="function"?t(this):t;if(typeof n=="string"){var l=0;if(n.includes("#"))for(var u=n.replace(/##/g,"");u.includes("#"+(l+1));)++l;for(var h=new Ge(n,this.settings),c=[],v=h.lex();v.text!=="EOF";)c.push(v),v=h.lex();c.reverse();var g={tokens:c,numArgs:l};return g}return n}isDefined(e){return this.macros.has(e)||F0.hasOwnProperty(e)||$.math.hasOwnProperty(e)||$.text.hasOwnProperty(e)||z1.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return t!=null?typeof t=="string"||typeof t=="function"||!t.unexpandable:F0.hasOwnProperty(e)&&!F0[e].primitive}},Cr=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,Re=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),ft={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},qr={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},Ue=class r{constructor(e,t){this.mode="math",this.gullet=new Ct(e,t,this.mode),this.settings=t,this.leftrightDepth=0,this.nextToken=null}expect(e,t){if(t===void 0&&(t=!0),this.fetch().text!==e)throw new z("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new d0("}")),this.gullet.pushTokens(e);var a=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,a}parseExpression(e,t){for(var a=[];;){this.mode==="math"&&this.consumeSpaces();var n=this.fetch();if(r.endOfExpression.has(n.text)||t&&n.text===t||e&&F0[n.text]&&F0[n.text].infix)break;var l=this.parseAtom(t);if(l){if(l.type==="internal")continue}else break;a.push(l)}return this.mode==="text"&&this.formLigatures(a),this.handleInfixNodes(a)}handleInfixNodes(e){for(var t=-1,a,n=0;n=128)this.settings.strict&&(Rr(t.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'"'+(" ("+t.charCodeAt(0)+")"),e)),u={type:"textord",mode:"text",loc:c0.range(e),text:t};else return null;if(this.consume(),l)for(var b=0;bnew p,"TokenBuilder"),ValueConverter:e(()=>new G,"ValueConverter")}};function h(s=n){let r=t(o(s),u),a=t(i({shared:r}),d,m);return r.ServiceRegistry.register(a),{shared:r,GitGraph:a}}e(h,"createGitGraphServices");export{m as a,h as b}; diff --git a/src/google/adk/cli/browser/chunk-2LZ42ZOW.js b/src/google/adk/cli/browser/chunk-2LZ42ZOW.js new file mode 100644 index 0000000000..5e2e957a6a --- /dev/null +++ b/src/google/adk/cli/browser/chunk-2LZ42ZOW.js @@ -0,0 +1 @@ +import{a as _,c as N,d as F}from"./chunk-LI24J5PW.js";import{a as U}from"./chunk-JDPVSVO4.js";import{a as C}from"./chunk-XMBKBASC.js";import"./chunk-APNCZOFE.js";import"./chunk-ST54LLJ3.js";import"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import{m as P}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{H as A,M as z,N as R,Y as t}from"./chunk-QFMJV7VH.js";import{M as W,Q as G,a as T,g as u,i as S}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";var D=u(e=>e.append("circle").attr("class","start-state").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit).attr("cy",t().state.padding+t().state.sizeUnit),"drawStartState"),Y=u(e=>e.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",t().state.textHeight).attr("class","divider").attr("x2",t().state.textHeight*2).attr("y1",0).attr("y2",0),"drawDivider"),I=u((e,i)=>{let s=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+2*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),g=s.node().getBBox();return e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",g.width+2*t().state.padding).attr("height",g.height+2*t().state.padding).attr("rx",t().state.radius),s},"drawSimpleState"),$=u((e,i)=>{let s=u(function(c,m,w){let E=c.append("tspan").attr("x",2*t().state.padding).text(m);w||E.attr("dy",t().state.textHeight)},"addTspan"),n=e.append("text").attr("x",2*t().state.padding).attr("y",t().state.textHeight+1.3*t().state.padding).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.descriptions[0]).node().getBBox(),h=n.height,x=e.append("text").attr("x",t().state.padding).attr("y",h+t().state.padding*.4+t().state.dividerMargin+t().state.textHeight).attr("class","state-description"),a=!0,d=!0;i.descriptions.forEach(function(c){a||(s(x,c,d),d=!1),a=!1});let y=e.append("line").attr("x1",t().state.padding).attr("y1",t().state.padding+h+t().state.dividerMargin/2).attr("y2",t().state.padding+h+t().state.dividerMargin/2).attr("class","descr-divider"),p=x.node().getBBox(),o=Math.max(p.width,n.width);return y.attr("x2",o+3*t().state.padding),e.insert("rect",":first-child").attr("x",t().state.padding).attr("y",t().state.padding).attr("width",o+2*t().state.padding).attr("height",p.height+h+2*t().state.padding).attr("rx",t().state.radius),e},"drawDescrState"),q=u((e,i,s)=>{let g=t().state.padding,n=2*t().state.padding,h=e.node().getBBox(),x=h.width,a=h.x,d=e.append("text").attr("x",0).attr("y",t().state.titleShift).attr("font-size",t().state.fontSize).attr("class","state-title").text(i.id),p=d.node().getBBox().width+n,o=Math.max(p,x);o===x&&(o=o+n);let c,m=e.node().getBBox();i.doc,c=a-g,p>x&&(c=(x-o)/2+g),Math.abs(a-m.x)x&&(c=a-(p-x)/2);let w=1-t().state.textHeight;return e.insert("rect",":first-child").attr("x",c).attr("y",w).attr("class",s?"alt-composit":"composit").attr("width",o).attr("height",m.height+t().state.textHeight+t().state.titleShift+1).attr("rx","0"),d.attr("x",c+g),p<=x&&d.attr("x",a+(o-n)/2-p/2+g),e.insert("rect",":first-child").attr("x",c).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",o).attr("height",t().state.textHeight*3).attr("rx",t().state.radius),e.insert("rect",":first-child").attr("x",c).attr("y",t().state.titleShift-t().state.textHeight-t().state.padding).attr("width",o).attr("height",m.height+3+2*t().state.textHeight).attr("rx",t().state.radius),e},"addTitleAndBox"),Z=u(e=>(e.append("circle").attr("class","end-state-outer").attr("r",t().state.sizeUnit+t().state.miniPadding).attr("cx",t().state.padding+t().state.sizeUnit+t().state.miniPadding).attr("cy",t().state.padding+t().state.sizeUnit+t().state.miniPadding),e.append("circle").attr("class","end-state-inner").attr("r",t().state.sizeUnit).attr("cx",t().state.padding+t().state.sizeUnit+2).attr("cy",t().state.padding+t().state.sizeUnit+2)),"drawEndState"),j=u((e,i)=>{let s=t().state.forkWidth,g=t().state.forkHeight;if(i.parentId){let n=s;s=g,g=n}return e.append("rect").style("stroke","black").style("fill","black").attr("width",s).attr("height",g).attr("x",t().state.padding).attr("y",t().state.padding)},"drawForkJoinState"),K=u((e,i,s,g)=>{let n=0,h=g.append("text");h.style("text-anchor","start"),h.attr("class","noteText");let x=e.replace(/\r\n/g,"
        ");x=x.replace(/\n/g,"
        ");let a=x.split(z.lineBreakRegex),d=1.25*t().state.noteMargin;for(let y of a){let p=y.trim();if(p.length>0){let o=h.append("tspan");if(o.text(p),d===0){let c=o.node().getBBox();d+=c.height}n+=d,o.attr("x",i+t().state.noteMargin),o.attr("y",s+n+1.25*t().state.noteMargin)}}return{textWidth:h.node().getBBox().width,textHeight:n}},"_drawLongText"),Q=u((e,i)=>{i.attr("class","state-note");let s=i.append("rect").attr("x",0).attr("y",t().state.padding),g=i.append("g"),{textWidth:n,textHeight:h}=K(e,0,0,g);return s.attr("height",h+2*t().state.noteMargin),s.attr("width",n+t().state.noteMargin*2),s},"drawNote"),O=u(function(e,i){let s=i.id,g={id:s,label:i.id,width:0,height:0},n=e.append("g").attr("id",s).attr("class","stateGroup");i.type==="start"&&D(n),i.type==="end"&&Z(n),(i.type==="fork"||i.type==="join")&&j(n,i),i.type==="note"&&Q(i.note.text,n),i.type==="divider"&&Y(n),i.type==="default"&&i.descriptions.length===0&&I(n,i),i.type==="default"&&i.descriptions.length>0&&$(n,i);let h=n.node().getBBox();return g.width=h.width+2*t().state.padding,g.height=h.height+2*t().state.padding,g},"drawState"),J=0,V=u(function(e,i,s){let g=u(function(d){switch(d){case N.relationType.AGGREGATION:return"aggregation";case N.relationType.EXTENSION:return"extension";case N.relationType.COMPOSITION:return"composition";case N.relationType.DEPENDENCY:return"dependency"}},"getRelationType");i.points=i.points.filter(d=>!Number.isNaN(d.y));let n=i.points,h=W().x(function(d){return d.x}).y(function(d){return d.y}).curve(G),x=e.append("path").attr("d",h(n)).attr("id","edge"+J).attr("class","transition"),a="";if(t().state.arrowMarkerAbsolute&&(a=A(!0)),x.attr("marker-end","url("+a+"#"+g(N.relationType.DEPENDENCY)+"End)"),s.title!==void 0){let d=e.append("g").attr("class","stateLabel"),{x:y,y:p}=P.calcLabelPosition(i.points),o=z.getRows(s.title),c=0,m=[],w=0,E=0;for(let r=0;r<=o.length;r++){let f=d.append("text").attr("text-anchor","middle").text(o[r]).attr("x",y).attr("y",p+c),l=f.node().getBBox();w=Math.max(w,l.width),E=Math.min(E,l.x),S.info(l.x,y,p+c),c===0&&(c=f.node().getBBox().height,S.info("Title height",c,p)),m.push(f)}let k=c*o.length;if(o.length>1){let r=(o.length-1)*c*.5;m.forEach((f,l)=>f.attr("y",p+l*c-r)),k=c*o.length}let M=d.node().getBBox();d.insert("rect",":first-child").attr("class","box").attr("x",y-w/2-t().state.padding/2).attr("y",p-k/2-t().state.padding/2-3.5).attr("width",w+t().state.padding).attr("height",k+t().state.padding),S.info(M)}J++},"drawEdge"),b,L={},tt=u(function(){},"setConf"),et=u(function(e){e.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"insertMarkers"),at=u(function(e,i,s,g){b=t().state;let n=t().securityLevel,h;n==="sandbox"&&(h=T("#i"+i));let x=n==="sandbox"?T(h.nodes()[0].contentDocument.body):T("body"),a=n==="sandbox"?h.nodes()[0].contentDocument:document;S.debug("Rendering diagram "+e);let d=x.select(`[id='${i}']`);et(d);let y=g.db.getRootDoc();X(y,d,void 0,!1,x,a,g);let p=b.padding,o=d.node().getBBox(),c=o.width+p*2,m=o.height+p*2,w=c*1.75;R(d,m,w,b.useMaxWidth),d.attr("viewBox",`${o.x-b.padding} ${o.y-b.padding} `+c+" "+m)},"draw"),it=u(e=>e?e.length*b.fontSizeFactor:1,"getLabelWidth"),X=u((e,i,s,g,n,h,x)=>{let a=new C({compound:!0,multigraph:!0}),d,y=!0;for(d=0;d{let B=l.parentElement,v=0,H=0;B&&(B.parentElement&&(v=B.parentElement.getBBox().width),H=parseInt(B.getAttribute("data-x-shift"),10),Number.isNaN(H)&&(H=0)),l.setAttribute("x1",0-H+8),l.setAttribute("x2",v-H-8)})):S.debug("No Node "+r+": "+JSON.stringify(a.node(r)))});let k=E.getBBox();a.edges().forEach(function(r){r!==void 0&&a.edge(r)!==void 0&&(S.debug("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(a.edge(r))),V(i,a.edge(r),a.edge(r).relation))}),k=E.getBBox();let M={id:s||"root",label:s||"root",width:0,height:0};return M.width=k.width+2*b.padding,M.height=k.height+2*b.padding,S.debug("Doc rendered",M,a),M},"renderDoc"),rt={setConf:tt,draw:at},St={parser:_,get db(){return new N(1)},renderer:rt,styles:F,init:u(e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")};export{St as diagram}; diff --git a/src/google/adk/cli/browser/chunk-EN473UE3.js b/src/google/adk/cli/browser/chunk-2SRK2U7X.js similarity index 99% rename from src/google/adk/cli/browser/chunk-EN473UE3.js rename to src/google/adk/cli/browser/chunk-2SRK2U7X.js index 93e3c9916d..d7b6f04014 100644 --- a/src/google/adk/cli/browser/chunk-EN473UE3.js +++ b/src/google/adk/cli/browser/chunk-2SRK2U7X.js @@ -1,4 +1,4 @@ -import{a as M,b as P,e as xr,g as vt}from"./chunk-W7GRJBO5.js";var De=null,ts=!1,lc=1,JD=null,se=Symbol("SIGNAL");function I(e){let t=De;return De=e,t}function ns(){return De}var an={version:0,lastCleanEpoch:0,dirty:!1,producers:void 0,producersTail:void 0,consumers:void 0,consumersTail:void 0,recomputing:!1,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,kind:"unknown",producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function cn(e){if(ts)throw new Error("");if(De===null)return;De.consumerOnSignalRead(e);let t=De.producersTail;if(t!==void 0&&t.producer===e)return;let n,r=De.recomputing;if(r&&(n=t!==void 0?t.nextProducer:De.producers,n!==void 0&&n.producer===e)){De.producersTail=n,n.lastReadVersion=e.version;return}let o=e.consumersTail;if(o!==void 0&&o.consumer===De&&(!r||eE(o,De)))return;let i=Sr(De),s={producer:e,consumer:De,nextProducer:n,prevConsumer:o,lastReadVersion:e.version,nextConsumer:void 0};De.producersTail=s,t!==void 0?t.nextProducer=s:De.producers=s,i&&c0(e,s)}function s0(){lc++}function Ln(e){if(!(Sr(e)&&!e.dirty)&&!(!e.dirty&&e.lastCleanEpoch===lc)){if(!e.producerMustRecompute(e)&&!Tr(e)){Ir(e);return}e.producerRecomputeValue(e),Ir(e)}}function dc(e){if(e.consumers===void 0)return;let t=ts;ts=!0;try{for(let n=e.consumers;n!==void 0;n=n.nextConsumer){let r=n.consumer;r.dirty||XD(r)}}finally{ts=t}}function fc(){return De?.consumerAllowSignalWrites!==!1}function XD(e){e.dirty=!0,dc(e),e.consumerMarkedDirty?.(e)}function Ir(e){e.dirty=!1,e.lastCleanEpoch=lc}function Lt(e){return e&&u0(e),I(e)}function u0(e){e.producersTail=void 0,e.recomputing=!0}function ln(e,t){I(t),e&&a0(e)}function a0(e){e.recomputing=!1;let t=e.producersTail,n=t!==void 0?t.nextProducer:e.producers;if(n!==void 0){if(Sr(e))do n=pc(n);while(n!==void 0);t!==void 0?t.nextProducer=void 0:e.producers=void 0}}function Tr(e){for(let t=e.producers;t!==void 0;t=t.nextProducer){let n=t.producer,r=t.lastReadVersion;if(r!==n.version||(Ln(n),r!==n.version))return!0}return!1}function dn(e){if(Sr(e)){let t=e.producers;for(;t!==void 0;)t=pc(t)}e.producers=void 0,e.producersTail=void 0,e.consumers=void 0,e.consumersTail=void 0}function c0(e,t){let n=e.consumersTail,r=Sr(e);if(n!==void 0?(t.nextConsumer=n.nextConsumer,n.nextConsumer=t):(t.nextConsumer=void 0,e.consumers=t),t.prevConsumer=n,e.consumersTail=t,!r)for(let o=e.producers;o!==void 0;o=o.nextProducer)c0(o.producer,o)}function pc(e){let t=e.producer,n=e.nextProducer,r=e.nextConsumer,o=e.prevConsumer;if(e.nextConsumer=void 0,e.prevConsumer=void 0,r!==void 0?r.prevConsumer=o:t.consumersTail=o,o!==void 0)o.nextConsumer=r;else if(t.consumers=r,!Sr(t)){let i=t.producers;for(;i!==void 0;)i=pc(i)}return n}function Sr(e){return e.consumerIsAlwaysLive||e.consumers!==void 0}function ko(e){JD?.(e)}function eE(e,t){let n=t.producersTail;if(n!==void 0){let r=t.producers;do{if(r===e)return!0;if(r===n)break;r=r.nextProducer}while(r!==void 0)}return!1}function Ro(e,t){return Object.is(e,t)}function Fo(e,t){let n=Object.create(tE);n.computation=e,t!==void 0&&(n.equal=t);let r=()=>{if(Ln(n),cn(n),n.value===Dt)throw n.error;return n.value};return r[se]=n,ko(n),r}var un=Symbol("UNSET"),Pn=Symbol("COMPUTING"),Dt=Symbol("ERRORED"),tE=P(M({},an),{value:un,dirty:!0,error:null,equal:Ro,kind:"computed",producerMustRecompute(e){return e.value===un||e.value===Pn},producerRecomputeValue(e){if(e.value===Pn)throw new Error("");let t=e.value;e.value=Pn;let n=Lt(e),r,o=!1;try{r=e.computation(),I(null),o=t!==un&&t!==Dt&&r!==Dt&&e.equal(t,r)}catch(i){r=Dt,e.error=i}finally{ln(e,n)}if(o){e.value=t;return}e.value=r,e.version++}});function nE(){throw new Error}var l0=nE;function d0(e){l0(e)}function hc(e){l0=e}var rE=null;function gc(e,t){let n=Object.create(Oo);n.value=e,t!==void 0&&(n.equal=t);let r=()=>f0(n);return r[se]=n,ko(n),[r,s=>jn(n,s),s=>rs(n,s)]}function f0(e){return cn(e),e.value}function jn(e,t){fc()||d0(e),e.equal(e.value,t)||(e.value=t,oE(e))}function rs(e,t){fc()||d0(e),jn(e,t(e.value))}var Oo=P(M({},an),{equal:Ro,value:void 0,kind:"signal"});function oE(e){e.version++,s0(),dc(e),rE?.(e)}var mc=P(M({},an),{consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,dirty:!0,kind:"effect"});function yc(e){if(e.dirty=!1,e.version>0&&!Tr(e))return;e.version++;let t=Lt(e);try{e.cleanup(),e.fn()}finally{ln(e,t)}}function R(e){return typeof e=="function"}function Mr(e){let n=e(r=>{Error.call(r),r.stack=new Error().stack});return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n}var os=Mr(e=>function(n){e(this),this.message=n?`${n.length} errors occurred during unsubscription: +import{a as M,b as P,f as xr,j as vt}from"./chunk-RMXJBC7V.js";var De=null,ts=!1,lc=1,JD=null,se=Symbol("SIGNAL");function I(e){let t=De;return De=e,t}function ns(){return De}var an={version:0,lastCleanEpoch:0,dirty:!1,producers:void 0,producersTail:void 0,consumers:void 0,consumersTail:void 0,recomputing:!1,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,kind:"unknown",producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function cn(e){if(ts)throw new Error("");if(De===null)return;De.consumerOnSignalRead(e);let t=De.producersTail;if(t!==void 0&&t.producer===e)return;let n,r=De.recomputing;if(r&&(n=t!==void 0?t.nextProducer:De.producers,n!==void 0&&n.producer===e)){De.producersTail=n,n.lastReadVersion=e.version;return}let o=e.consumersTail;if(o!==void 0&&o.consumer===De&&(!r||eE(o,De)))return;let i=Sr(De),s={producer:e,consumer:De,nextProducer:n,prevConsumer:o,lastReadVersion:e.version,nextConsumer:void 0};De.producersTail=s,t!==void 0?t.nextProducer=s:De.producers=s,i&&c0(e,s)}function s0(){lc++}function Ln(e){if(!(Sr(e)&&!e.dirty)&&!(!e.dirty&&e.lastCleanEpoch===lc)){if(!e.producerMustRecompute(e)&&!Tr(e)){Ir(e);return}e.producerRecomputeValue(e),Ir(e)}}function dc(e){if(e.consumers===void 0)return;let t=ts;ts=!0;try{for(let n=e.consumers;n!==void 0;n=n.nextConsumer){let r=n.consumer;r.dirty||XD(r)}}finally{ts=t}}function fc(){return De?.consumerAllowSignalWrites!==!1}function XD(e){e.dirty=!0,dc(e),e.consumerMarkedDirty?.(e)}function Ir(e){e.dirty=!1,e.lastCleanEpoch=lc}function Lt(e){return e&&u0(e),I(e)}function u0(e){e.producersTail=void 0,e.recomputing=!0}function ln(e,t){I(t),e&&a0(e)}function a0(e){e.recomputing=!1;let t=e.producersTail,n=t!==void 0?t.nextProducer:e.producers;if(n!==void 0){if(Sr(e))do n=pc(n);while(n!==void 0);t!==void 0?t.nextProducer=void 0:e.producers=void 0}}function Tr(e){for(let t=e.producers;t!==void 0;t=t.nextProducer){let n=t.producer,r=t.lastReadVersion;if(r!==n.version||(Ln(n),r!==n.version))return!0}return!1}function dn(e){if(Sr(e)){let t=e.producers;for(;t!==void 0;)t=pc(t)}e.producers=void 0,e.producersTail=void 0,e.consumers=void 0,e.consumersTail=void 0}function c0(e,t){let n=e.consumersTail,r=Sr(e);if(n!==void 0?(t.nextConsumer=n.nextConsumer,n.nextConsumer=t):(t.nextConsumer=void 0,e.consumers=t),t.prevConsumer=n,e.consumersTail=t,!r)for(let o=e.producers;o!==void 0;o=o.nextProducer)c0(o.producer,o)}function pc(e){let t=e.producer,n=e.nextProducer,r=e.nextConsumer,o=e.prevConsumer;if(e.nextConsumer=void 0,e.prevConsumer=void 0,r!==void 0?r.prevConsumer=o:t.consumersTail=o,o!==void 0)o.nextConsumer=r;else if(t.consumers=r,!Sr(t)){let i=t.producers;for(;i!==void 0;)i=pc(i)}return n}function Sr(e){return e.consumerIsAlwaysLive||e.consumers!==void 0}function ko(e){JD?.(e)}function eE(e,t){let n=t.producersTail;if(n!==void 0){let r=t.producers;do{if(r===e)return!0;if(r===n)break;r=r.nextProducer}while(r!==void 0)}return!1}function Ro(e,t){return Object.is(e,t)}function Fo(e,t){let n=Object.create(tE);n.computation=e,t!==void 0&&(n.equal=t);let r=()=>{if(Ln(n),cn(n),n.value===Dt)throw n.error;return n.value};return r[se]=n,ko(n),r}var un=Symbol("UNSET"),Pn=Symbol("COMPUTING"),Dt=Symbol("ERRORED"),tE=P(M({},an),{value:un,dirty:!0,error:null,equal:Ro,kind:"computed",producerMustRecompute(e){return e.value===un||e.value===Pn},producerRecomputeValue(e){if(e.value===Pn)throw new Error("");let t=e.value;e.value=Pn;let n=Lt(e),r,o=!1;try{r=e.computation(),I(null),o=t!==un&&t!==Dt&&r!==Dt&&e.equal(t,r)}catch(i){r=Dt,e.error=i}finally{ln(e,n)}if(o){e.value=t;return}e.value=r,e.version++}});function nE(){throw new Error}var l0=nE;function d0(e){l0(e)}function hc(e){l0=e}var rE=null;function gc(e,t){let n=Object.create(Oo);n.value=e,t!==void 0&&(n.equal=t);let r=()=>f0(n);return r[se]=n,ko(n),[r,s=>jn(n,s),s=>rs(n,s)]}function f0(e){return cn(e),e.value}function jn(e,t){fc()||d0(e),e.equal(e.value,t)||(e.value=t,oE(e))}function rs(e,t){fc()||d0(e),jn(e,t(e.value))}var Oo=P(M({},an),{equal:Ro,value:void 0,kind:"signal"});function oE(e){e.version++,s0(),dc(e),rE?.(e)}var mc=P(M({},an),{consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,dirty:!0,kind:"effect"});function yc(e){if(e.dirty=!1,e.version>0&&!Tr(e))return;e.version++;let t=Lt(e);try{e.cleanup(),e.fn()}finally{ln(e,t)}}function R(e){return typeof e=="function"}function Mr(e){let n=e(r=>{Error.call(r),r.stack=new Error().stack});return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n}var os=Mr(e=>function(n){e(this),this.message=n?`${n.length} errors occurred during unsubscription: ${n.map((r,o)=>`${o+1}) ${r.toString()}`).join(` `)}`:"",this.name="UnsubscriptionError",this.errors=n});function Bn(e,t){if(e){let n=e.indexOf(t);0<=n&&e.splice(n,1)}}var ne=class e{constructor(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}unsubscribe(){let t;if(!this.closed){this.closed=!0;let{_parentage:n}=this;if(n)if(this._parentage=null,Array.isArray(n))for(let i of n)i.remove(this);else n.remove(this);let{initialTeardown:r}=this;if(R(r))try{r()}catch(i){t=i instanceof os?i.errors:[i]}let{_finalizers:o}=this;if(o){this._finalizers=null;for(let i of o)try{p0(i)}catch(s){t=t??[],s instanceof os?t=[...t,...s.errors]:t.push(s)}}if(t)throw new os(t)}}add(t){var n;if(t&&t!==this)if(this.closed)p0(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(n=this._finalizers)!==null&&n!==void 0?n:[]).push(t)}}_hasParent(t){let{_parentage:n}=this;return n===t||Array.isArray(n)&&n.includes(t)}_addParent(t){let{_parentage:n}=this;this._parentage=Array.isArray(n)?(n.push(t),n):n?[n,t]:t}_removeParent(t){let{_parentage:n}=this;n===t?this._parentage=null:Array.isArray(n)&&Bn(n,t)}remove(t){let{_finalizers:n}=this;n&&Bn(n,t),t instanceof e&&t._removeParent(this)}};ne.EMPTY=(()=>{let e=new ne;return e.closed=!0,e})();var bc=ne.EMPTY;function is(e){return e instanceof ne||e&&"closed"in e&&R(e.remove)&&R(e.add)&&R(e.unsubscribe)}function p0(e){R(e)?e():e.unsubscribe()}var et={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var Ar={setTimeout(e,t,...n){let{delegate:r}=Ar;return r?.setTimeout?r.setTimeout(e,t,...n):setTimeout(e,t,...n)},clearTimeout(e){let{delegate:t}=Ar;return(t?.clearTimeout||clearTimeout)(e)},delegate:void 0};function ss(e){Ar.setTimeout(()=>{let{onUnhandledError:t}=et;if(t)t(e);else throw e})}function jt(){}var h0=vc("C",void 0,void 0);function g0(e){return vc("E",void 0,e)}function m0(e){return vc("N",e,void 0)}function vc(e,t,n){return{kind:e,value:t,error:n}}var Vn=null;function Nr(e){if(et.useDeprecatedSynchronousErrorHandling){let t=!Vn;if(t&&(Vn={errorThrown:!1,error:null}),e(),t){let{errorThrown:n,error:r}=Vn;if(Vn=null,n)throw r}}else e()}function y0(e){et.useDeprecatedSynchronousErrorHandling&&Vn&&(Vn.errorThrown=!0,Vn.error=e)}var Hn=class extends ne{constructor(t){super(),this.isStopped=!1,t?(this.destination=t,is(t)&&t.add(this)):this.destination=uE}static create(t,n,r){return new tt(t,n,r)}next(t){this.isStopped?Ec(m0(t),this):this._next(t)}error(t){this.isStopped?Ec(g0(t),this):(this.isStopped=!0,this._error(t))}complete(){this.isStopped?Ec(h0,this):(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe(),this.destination=null)}_next(t){this.destination.next(t)}_error(t){try{this.destination.error(t)}finally{this.unsubscribe()}}_complete(){try{this.destination.complete()}finally{this.unsubscribe()}}},iE=Function.prototype.bind;function Dc(e,t){return iE.call(e,t)}var Cc=class{constructor(t){this.partialObserver=t}next(t){let{partialObserver:n}=this;if(n.next)try{n.next(t)}catch(r){us(r)}}error(t){let{partialObserver:n}=this;if(n.error)try{n.error(t)}catch(r){us(r)}else us(t)}complete(){let{partialObserver:t}=this;if(t.complete)try{t.complete()}catch(n){us(n)}}},tt=class extends Hn{constructor(t,n,r){super();let o;if(R(t)||!t)o={next:t??void 0,error:n??void 0,complete:r??void 0};else{let i;this&&et.useDeprecatedNextContext?(i=Object.create(t),i.unsubscribe=()=>this.unsubscribe(),o={next:t.next&&Dc(t.next,i),error:t.error&&Dc(t.error,i),complete:t.complete&&Dc(t.complete,i)}):o=t}this.destination=new Cc(o)}};function us(e){et.useDeprecatedSynchronousErrorHandling?y0(e):ss(e)}function sE(e){throw e}function Ec(e,t){let{onStoppedNotification:n}=et;n&&Ar.setTimeout(()=>n(e,t))}var uE={closed:!0,next:jt,error:sE,complete:jt};var kr=typeof Symbol=="function"&&Symbol.observable||"@@observable";function Te(e){return e}function aE(...e){return _c(e)}function _c(e){return e.length===0?Te:e.length===1?e[0]:function(n){return e.reduce((r,o)=>o(r),n)}}var B=(()=>{class e{constructor(n){n&&(this._subscribe=n)}lift(n){let r=new e;return r.source=this,r.operator=n,r}subscribe(n,r,o){let i=lE(n)?n:new tt(n,r,o);return Nr(()=>{let{operator:s,source:u}=this;i.add(s?s.call(i,u):u?this._subscribe(i):this._trySubscribe(i))}),i}_trySubscribe(n){try{return this._subscribe(n)}catch(r){n.error(r)}}forEach(n,r){return r=b0(r),new r((o,i)=>{let s=new tt({next:u=>{try{n(u)}catch(a){i(a),s.unsubscribe()}},error:i,complete:o});this.subscribe(s)})}_subscribe(n){var r;return(r=this.source)===null||r===void 0?void 0:r.subscribe(n)}[kr](){return this}pipe(...n){return _c(n)(this)}toPromise(n){return n=b0(n),new n((r,o)=>{let i;this.subscribe(s=>i=s,s=>o(s),()=>r(i))})}}return e.create=t=>new e(t),e})();function b0(e){var t;return(t=e??et.Promise)!==null&&t!==void 0?t:Promise}function cE(e){return e&&R(e.next)&&R(e.error)&&R(e.complete)}function lE(e){return e&&e instanceof Hn||cE(e)&&is(e)}function wc(e){return R(e?.lift)}function j(e){return t=>{if(wc(t))return t.lift(function(n){try{return e(n,this)}catch(r){this.error(r)}});throw new TypeError("Unable to lift unknown Observable type")}}function F(e,t,n,r,o){return new xc(e,t,n,r,o)}var xc=class extends Hn{constructor(t,n,r,o,i,s){super(t),this.onFinalize=i,this.shouldUnsubscribe=s,this._next=n?function(u){try{n(u)}catch(a){t.error(a)}}:super._next,this._error=o?function(u){try{o(u)}catch(a){t.error(a)}finally{this.unsubscribe()}}:super._error,this._complete=r?function(){try{r()}catch(u){t.error(u)}finally{this.unsubscribe()}}:super._complete}unsubscribe(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){let{closed:n}=this;super.unsubscribe(),!n&&((t=this.onFinalize)===null||t===void 0||t.call(this))}}};function v0(){return j((e,t)=>{let n=null;e._refCount++;let r=F(t,void 0,void 0,void 0,()=>{if(!e||e._refCount<=0||0<--e._refCount){n=null;return}let o=e._connection,i=n;n=null,o&&(!i||o===i)&&o.unsubscribe(),t.unsubscribe()});e.subscribe(r),r.closed||(n=e.connect())})}var Ic=class extends B{constructor(t,n){super(),this.source=t,this.subjectFactory=n,this._subject=null,this._refCount=0,this._connection=null,wc(t)&&(this.lift=t.lift)}_subscribe(t){return this.getSubject().subscribe(t)}getSubject(){let t=this._subject;return(!t||t.isStopped)&&(this._subject=this.subjectFactory()),this._subject}_teardown(){this._refCount=0;let{_connection:t}=this;this._subject=this._connection=null,t?.unsubscribe()}connect(){let t=this._connection;if(!t){t=this._connection=new ne;let n=this.getSubject();t.add(this.source.subscribe(F(n,void 0,()=>{this._teardown(),n.complete()},r=>{this._teardown(),n.error(r)},()=>this._teardown()))),t.closed&&(this._connection=null,t=ne.EMPTY)}return t}refCount(){return v0()(this)}};var Rr={schedule(e){let t=requestAnimationFrame,n=cancelAnimationFrame,{delegate:r}=Rr;r&&(t=r.requestAnimationFrame,n=r.cancelAnimationFrame);let o=t(i=>{n=void 0,e(i)});return new ne(()=>n?.(o))},requestAnimationFrame(...e){let{delegate:t}=Rr;return(t?.requestAnimationFrame||requestAnimationFrame)(...e)},cancelAnimationFrame(...e){let{delegate:t}=Rr;return(t?.cancelAnimationFrame||cancelAnimationFrame)(...e)},delegate:void 0};var D0=Mr(e=>function(){e(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"});var he=(()=>{class e extends B{constructor(){super(),this.closed=!1,this.currentObservers=null,this.observers=[],this.isStopped=!1,this.hasError=!1,this.thrownError=null}lift(n){let r=new as(this,this);return r.operator=n,r}_throwIfClosed(){if(this.closed)throw new D0}next(n){Nr(()=>{if(this._throwIfClosed(),!this.isStopped){this.currentObservers||(this.currentObservers=Array.from(this.observers));for(let r of this.currentObservers)r.next(n)}})}error(n){Nr(()=>{if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=n;let{observers:r}=this;for(;r.length;)r.shift().error(n)}})}complete(){Nr(()=>{if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;let{observers:n}=this;for(;n.length;)n.shift().complete()}})}unsubscribe(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null}get observed(){var n;return((n=this.observers)===null||n===void 0?void 0:n.length)>0}_trySubscribe(n){return this._throwIfClosed(),super._trySubscribe(n)}_subscribe(n){return this._throwIfClosed(),this._checkFinalizedStatuses(n),this._innerSubscribe(n)}_innerSubscribe(n){let{hasError:r,isStopped:o,observers:i}=this;return r||o?bc:(this.currentObservers=null,i.push(n),new ne(()=>{this.currentObservers=null,Bn(i,n)}))}_checkFinalizedStatuses(n){let{hasError:r,thrownError:o,isStopped:i}=this;r?n.error(o):i&&n.complete()}asObservable(){let n=new B;return n.source=this,n}}return e.create=(t,n)=>new as(t,n),e})(),as=class extends he{constructor(t,n){super(),this.destination=t,this.source=n}next(t){var n,r;(r=(n=this.destination)===null||n===void 0?void 0:n.next)===null||r===void 0||r.call(n,t)}error(t){var n,r;(r=(n=this.destination)===null||n===void 0?void 0:n.error)===null||r===void 0||r.call(n,t)}complete(){var t,n;(n=(t=this.destination)===null||t===void 0?void 0:t.complete)===null||n===void 0||n.call(t)}_subscribe(t){var n,r;return(r=(n=this.source)===null||n===void 0?void 0:n.subscribe(t))!==null&&r!==void 0?r:bc}};var Po=class extends he{constructor(t){super(),this._value=t}get value(){return this.getValue()}_subscribe(t){let n=super._subscribe(t);return!n.closed&&t.next(this._value),n}getValue(){let{hasError:t,thrownError:n,_value:r}=this;if(t)throw n;return this._throwIfClosed(),r}next(t){super.next(this._value=t)}};var Lo={now(){return(Lo.delegate||Date).now()},delegate:void 0};var jo=class extends he{constructor(t=1/0,n=1/0,r=Lo){super(),this._bufferSize=t,this._windowTime=n,this._timestampProvider=r,this._buffer=[],this._infiniteTimeWindow=!0,this._infiniteTimeWindow=n===1/0,this._bufferSize=Math.max(1,t),this._windowTime=Math.max(1,n)}next(t){let{isStopped:n,_buffer:r,_infiniteTimeWindow:o,_timestampProvider:i,_windowTime:s}=this;n||(r.push(t),!o&&r.push(i.now()+s)),this._trimBuffer(),super.next(t)}_subscribe(t){this._throwIfClosed(),this._trimBuffer();let n=this._innerSubscribe(t),{_infiniteTimeWindow:r,_buffer:o}=this,i=o.slice();for(let s=0;sE0(t)&&e()),t},clearImmediate(e){E0(e)}};var{setImmediate:fE,clearImmediate:pE}=C0,Vo={setImmediate(...e){let{delegate:t}=Vo;return(t?.setImmediate||fE)(...e)},clearImmediate(e){let{delegate:t}=Vo;return(t?.clearImmediate||pE)(e)},delegate:void 0};var ls=class extends fn{constructor(t,n){super(t,n),this.scheduler=t,this.work=n}requestAsyncId(t,n,r=0){return r!==null&&r>0?super.requestAsyncId(t,n,r):(t.actions.push(this),t._scheduled||(t._scheduled=Vo.setImmediate(t.flush.bind(t,void 0))))}recycleAsyncId(t,n,r=0){var o;if(r!=null?r>0:this.delay>0)return super.recycleAsyncId(t,n,r);let{actions:i}=t;n!=null&&((o=i[i.length-1])===null||o===void 0?void 0:o.id)!==n&&(Vo.clearImmediate(n),t._scheduled===n&&(t._scheduled=void 0))}};var Fr=class e{constructor(t,n=e.now){this.schedulerActionCtor=t,this.now=n}schedule(t,n=0,r){return new this.schedulerActionCtor(this,t).schedule(r,n)}};Fr.now=Lo.now;var pn=class extends Fr{constructor(t,n=Fr.now){super(t,n),this.actions=[],this._active=!1}flush(t){let{actions:n}=this;if(this._active){n.push(t);return}let r;this._active=!0;do if(r=t.execute(t.state,t.delay))break;while(t=n.shift());if(this._active=!1,r){for(;t=n.shift();)t.unsubscribe();throw r}}};var ds=class extends pn{flush(t){this._active=!0;let n=this._scheduled;this._scheduled=void 0;let{actions:r}=this,o;t=t||r.shift();do if(o=t.execute(t.state,t.delay))break;while((t=r[0])&&t.id===n&&r.shift());if(this._active=!1,o){for(;(t=r[0])&&t.id===n&&r.shift();)t.unsubscribe();throw o}}};var hE=new ds(ls);var Or=new pn(fn),Mc=Or;var fs=class extends fn{constructor(t,n){super(t,n),this.scheduler=t,this.work=n}requestAsyncId(t,n,r=0){return r!==null&&r>0?super.requestAsyncId(t,n,r):(t.actions.push(this),t._scheduled||(t._scheduled=Rr.requestAnimationFrame(()=>t.flush(void 0))))}recycleAsyncId(t,n,r=0){var o;if(r!=null?r>0:this.delay>0)return super.recycleAsyncId(t,n,r);let{actions:i}=t;n!=null&&n===t._scheduled&&((o=i[i.length-1])===null||o===void 0?void 0:o.id)!==n&&(Rr.cancelAnimationFrame(n),t._scheduled=void 0)}};var ps=class extends pn{flush(t){this._active=!0;let n;t?n=t.id:(n=this._scheduled,this._scheduled=void 0);let{actions:r}=this,o;t=t||r.shift();do if(o=t.execute(t.state,t.delay))break;while((t=r[0])&&t.id===n&&r.shift());if(this._active=!1,o){for(;(t=r[0])&&t.id===n&&r.shift();)t.unsubscribe();throw o}}};var gE=new ps(fs);var Bt=new B(e=>e.complete());function hs(e){return e&&R(e.schedule)}function Ac(e){return e[e.length-1]}function hn(e){return R(Ac(e))?e.pop():void 0}function Et(e){return hs(Ac(e))?e.pop():void 0}function _0(e,t){return typeof Ac(e)=="number"?e.pop():t}function E3(e,t,n,r){var o=arguments.length,i=o<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(e,t,n,r);else for(var u=e.length-1;u>=0;u--)(s=e[u])&&(i=(o<3?s(i):o>3?s(t,n,i):s(t,n))||i);return o>3&&i&&Object.defineProperty(t,n,i),i}function x0(e,t,n,r){function o(i){return i instanceof n?i:new n(function(s){s(i)})}return new(n||(n=Promise))(function(i,s){function u(l){try{c(r.next(l))}catch(d){s(d)}}function a(l){try{c(r.throw(l))}catch(d){s(d)}}function c(l){l.done?i(l.value):o(l.value).then(u,a)}c((r=r.apply(e,t||[])).next())})}function w0(e){var t=typeof Symbol=="function"&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&typeof e.length=="number")return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function $n(e){return this instanceof $n?(this.v=e,this):new $n(e)}function I0(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r=n.apply(e,t||[]),o,i=[];return o=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),u("next"),u("throw"),u("return",s),o[Symbol.asyncIterator]=function(){return this},o;function s(f){return function(p){return Promise.resolve(p).then(f,d)}}function u(f,p){r[f]&&(o[f]=function(m){return new Promise(function(g,y){i.push([f,m,g,y])>1||a(f,m)})},p&&(o[f]=p(o[f])))}function a(f,p){try{c(r[f](p))}catch(m){h(i[0][3],m)}}function c(f){f.value instanceof $n?Promise.resolve(f.value.v).then(l,d):h(i[0][2],f)}function l(f){a("next",f)}function d(f){a("throw",f)}function h(f,p){f(p),i.shift(),i.length&&a(i[0][0],i[0][1])}}function T0(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],n;return t?t.call(e):(e=typeof w0=="function"?w0(e):e[Symbol.iterator](),n={},r("next"),r("throw"),r("return"),n[Symbol.asyncIterator]=function(){return this},n);function r(i){n[i]=e[i]&&function(s){return new Promise(function(u,a){s=e[i](s),o(u,a,s.done,s.value)})}}function o(i,s,u,a){Promise.resolve(a).then(function(c){i({value:c,done:u})},s)}}var Pr=e=>e&&typeof e.length=="number"&&typeof e!="function";function gs(e){return R(e?.then)}function ms(e){return R(e[kr])}function ys(e){return Symbol.asyncIterator&&R(e?.[Symbol.asyncIterator])}function bs(e){return new TypeError(`You provided ${e!==null&&typeof e=="object"?"an invalid object":`'${e}'`} where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`)}function mE(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var vs=mE();function Ds(e){return R(e?.[vs])}function Es(e){return I0(this,arguments,function*(){let n=e.getReader();try{for(;;){let{value:r,done:o}=yield $n(n.read());if(o)return yield $n(void 0);yield yield $n(r)}}finally{n.releaseLock()}})}function Cs(e){return R(e?.getReader)}function z(e){if(e instanceof B)return e;if(e!=null){if(ms(e))return yE(e);if(Pr(e))return bE(e);if(gs(e))return vE(e);if(ys(e))return S0(e);if(Ds(e))return DE(e);if(Cs(e))return EE(e)}throw bs(e)}function yE(e){return new B(t=>{let n=e[kr]();if(R(n.subscribe))return n.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function bE(e){return new B(t=>{for(let n=0;n{e.then(n=>{t.closed||(t.next(n),t.complete())},n=>t.error(n)).then(null,ss)})}function DE(e){return new B(t=>{for(let n of e)if(t.next(n),t.closed)return;t.complete()})}function S0(e){return new B(t=>{CE(e,t).catch(n=>t.error(n))})}function EE(e){return S0(Es(e))}function CE(e,t){var n,r,o,i;return x0(this,void 0,void 0,function*(){try{for(n=T0(e);r=yield n.next(),!r.done;){let s=r.value;if(t.next(s),t.closed)return}}catch(s){o={error:s}}finally{try{r&&!r.done&&(i=n.return)&&(yield i.call(n))}finally{if(o)throw o.error}}t.complete()})}function Fe(e,t,n,r=0,o=!1){let i=t.schedule(function(){n(),o?e.add(this.schedule(null,r)):this.unsubscribe()},r);if(e.add(i),!o)return i}function Ho(e,t=0){return j((n,r)=>{n.subscribe(F(r,o=>Fe(r,e,()=>r.next(o),t),()=>Fe(r,e,()=>r.complete(),t),o=>Fe(r,e,()=>r.error(o),t)))})}function _s(e,t=0){return j((n,r)=>{r.add(e.schedule(()=>n.subscribe(r),t))})}function M0(e,t){return z(e).pipe(_s(t),Ho(t))}function A0(e,t){return z(e).pipe(_s(t),Ho(t))}function N0(e,t){return new B(n=>{let r=0;return t.schedule(function(){r===e.length?n.complete():(n.next(e[r++]),n.closed||this.schedule())})})}function k0(e,t){return new B(n=>{let r;return Fe(n,t,()=>{r=e[vs](),Fe(n,t,()=>{let o,i;try{({value:o,done:i}=r.next())}catch(s){n.error(s);return}i?n.complete():n.next(o)},0,!0)}),()=>R(r?.return)&&r.return()})}function ws(e,t){if(!e)throw new Error("Iterable cannot be null");return new B(n=>{Fe(n,t,()=>{let r=e[Symbol.asyncIterator]();Fe(n,t,()=>{r.next().then(o=>{o.done?n.complete():n.next(o.value)})},0,!0)})})}function R0(e,t){return ws(Es(e),t)}function F0(e,t){if(e!=null){if(ms(e))return M0(e,t);if(Pr(e))return N0(e,t);if(gs(e))return A0(e,t);if(ys(e))return ws(e,t);if(Ds(e))return k0(e,t);if(Cs(e))return R0(e,t)}throw bs(e)}function Ct(e,t){return t?F0(e,t):z(e)}function xs(...e){let t=Et(e);return Ct(e,t)}function _E(e,t){let n=R(e)?e:()=>e,r=o=>o.error(n());return new B(t?o=>t.schedule(r,0,o):r)}function wE(e){return!!e&&(e instanceof B||R(e.lift)&&R(e.subscribe))}var Un=Mr(e=>function(){e(this),this.name="EmptyError",this.message="no elements in sequence"});function Nc(e,t){let n=typeof t=="object";return new Promise((r,o)=>{let i=new tt({next:s=>{r(s),i.unsubscribe()},error:o,complete:()=>{n?r(t.defaultValue):o(new Un)}});e.subscribe(i)})}function O0(e){return e instanceof Date&&!isNaN(e)}function Se(e,t){return j((n,r)=>{let o=0;n.subscribe(F(r,i=>{r.next(e.call(t,i,o++))}))})}var{isArray:xE}=Array;function IE(e,t){return xE(t)?e(...t):e(t)}function Lr(e){return Se(t=>IE(e,t))}var{isArray:TE}=Array,{getPrototypeOf:SE,prototype:ME,keys:AE}=Object;function Is(e){if(e.length===1){let t=e[0];if(TE(t))return{args:t,keys:null};if(NE(t)){let n=AE(t);return{args:n.map(r=>t[r]),keys:n}}}return{args:e,keys:null}}function NE(e){return e&&typeof e=="object"&&SE(e)===ME}function Ts(e,t){return e.reduce((n,r,o)=>(n[r]=t[o],n),{})}function kE(...e){let t=Et(e),n=hn(e),{args:r,keys:o}=Is(e);if(r.length===0)return Ct([],t);let i=new B(RE(r,t,o?s=>Ts(o,s):Te));return n?i.pipe(Lr(n)):i}function RE(e,t,n=Te){return r=>{P0(t,()=>{let{length:o}=e,i=new Array(o),s=o,u=o;for(let a=0;a{let c=Ct(e[a],t),l=!1;c.subscribe(F(r,d=>{i[a]=d,l||(l=!0,u--),u||r.next(n(i.slice()))},()=>{--s||r.complete()}))},r)},r)}}function P0(e,t,n){e?Fe(n,e,t):t()}function L0(e,t,n,r,o,i,s,u){let a=[],c=0,l=0,d=!1,h=()=>{d&&!a.length&&!c&&t.complete()},f=m=>c{i&&t.next(m),c++;let g=!1;z(n(m,l++)).subscribe(F(t,y=>{o?.(y),i?f(y):t.next(y)},()=>{g=!0},void 0,()=>{if(g)try{for(c--;a.length&&cp(y)):p(y)}h()}catch(y){t.error(y)}}))};return e.subscribe(F(t,f,()=>{d=!0,h()})),()=>{u?.()}}function Vt(e,t,n=1/0){return R(t)?Vt((r,o)=>Se((i,s)=>t(r,i,o,s))(z(e(r,o))),n):(typeof t=="number"&&(n=t),j((r,o)=>L0(r,o,e,n)))}function $o(e=1/0){return Vt(Te,e)}function j0(){return $o(1)}function Ss(...e){return j0()(Ct(e,Et(e)))}function FE(e){return new B(t=>{z(e()).subscribe(t)})}function OE(...e){let t=hn(e),{args:n,keys:r}=Is(e),o=new B(i=>{let{length:s}=n;if(!s){i.complete();return}let u=new Array(s),a=s,c=s;for(let l=0;l{d||(d=!0,c--),u[l]=h},()=>a--,void 0,()=>{(!a||!d)&&(c||i.next(r?Ts(r,u):u),i.complete())}))}});return t?o.pipe(Lr(t)):o}var PE=["addListener","removeListener"],LE=["addEventListener","removeEventListener"],jE=["on","off"];function kc(e,t,n,r){if(R(n)&&(r=n,n=void 0),r)return kc(e,t,n).pipe(Lr(r));let[o,i]=HE(e)?LE.map(s=>u=>e[s](t,u,n)):BE(e)?PE.map(B0(e,t)):VE(e)?jE.map(B0(e,t)):[];if(!o&&Pr(e))return Vt(s=>kc(s,t,n))(z(e));if(!o)throw new TypeError("Invalid event target");return new B(s=>{let u=(...a)=>s.next(1i(u)})}function B0(e,t){return n=>r=>e[n](t,r)}function BE(e){return R(e.addListener)&&R(e.removeListener)}function VE(e){return R(e.on)&&R(e.off)}function HE(e){return R(e.addEventListener)&&R(e.removeEventListener)}function Rc(e=0,t,n=Mc){let r=-1;return t!=null&&(hs(t)?n=t:r=t),new B(o=>{let i=O0(e)?+e-n.now():e;i<0&&(i=0);let s=0;return n.schedule(function(){o.closed||(o.next(s++),0<=r?this.schedule(void 0,r):o.complete())},i)})}function $E(...e){let t=Et(e),n=_0(e,1/0),r=e;return r.length?r.length===1?z(r[0]):$o(n)(Ct(r,t)):Bt}var UE=new B(jt);var{isArray:zE}=Array;function V0(e){return e.length===1&&zE(e[0])?e[0]:e}function gn(e,t){return j((n,r)=>{let o=0;n.subscribe(F(r,i=>e.call(t,i,o++)&&r.next(i)))})}function qE(...e){let t=hn(e),n=V0(e);return n.length?new B(r=>{let o=n.map(()=>[]),i=n.map(()=>!1);r.add(()=>{o=i=null});for(let s=0;!r.closed&&s{if(o[s].push(u),o.every(a=>a.length)){let a=o.map(c=>c.shift());r.next(t?t(...a):a),o.some((c,l)=>!c.length&&i[l])&&r.complete()}},()=>{i[s]=!0,!o[s].length&&r.complete()}));return()=>{o=i=null}}):Bt}function H0(e){return j((t,n)=>{let r=!1,o=null,i=null,s=!1,u=()=>{if(i?.unsubscribe(),i=null,r){r=!1;let c=o;o=null,n.next(c)}s&&n.complete()},a=()=>{i=null,s&&n.complete()};t.subscribe(F(n,c=>{r=!0,o=c,i||z(e(c)).subscribe(i=F(n,u,a))},()=>{s=!0,(!r||!i||i.closed)&&n.complete()}))})}function GE(e,t=Or){return H0(()=>Rc(e,t))}function Fc(e){return j((t,n)=>{let r=null,o=!1,i;r=t.subscribe(F(n,void 0,void 0,s=>{i=z(e(s,Fc(e)(t))),r?(r.unsubscribe(),r=null,i.subscribe(n)):o=!0})),o&&(r.unsubscribe(),r=null,i.subscribe(n))})}function Oc(e,t){return R(t)?Vt(e,t,1):Vt(e,1)}function $0(e,t=Or){return j((n,r)=>{let o=null,i=null,s=null,u=()=>{if(o){o.unsubscribe(),o=null;let c=i;i=null,r.next(c)}};function a(){let c=s+e,l=t.now();if(l{i=c,s=t.now(),o||(o=t.schedule(a,e),r.add(o))},()=>{u(),r.complete()},void 0,()=>{i=o=null}))})}function U0(e){return j((t,n)=>{let r=!1;t.subscribe(F(n,o=>{r=!0,n.next(o)},()=>{r||n.next(e),n.complete()}))})}function Pc(e){return e<=0?()=>Bt:j((t,n)=>{let r=0;t.subscribe(F(n,o=>{++r<=e&&(n.next(o),e<=r&&n.complete())}))})}function WE(e){return Se(()=>e)}function z0(e,t=Te){return e=e??ZE,j((n,r)=>{let o,i=!0;n.subscribe(F(r,s=>{let u=t(s);(i||!e(o,u))&&(i=!1,o=u,r.next(s))}))})}function ZE(e,t){return e===t}function q0(e=YE){return j((t,n)=>{let r=!1;t.subscribe(F(n,o=>{r=!0,n.next(o)},()=>r?n.complete():n.error(e())))})}function YE(){return new Un}function Ms(e){return j((t,n)=>{try{t.subscribe(n)}finally{n.add(e)}})}function QE(e,t){let n=arguments.length>=2;return r=>r.pipe(e?gn((o,i)=>e(o,i,r)):Te,Pc(1),n?U0(t):q0(()=>new Un))}function KE(e){return e<=0?()=>Bt:j((t,n)=>{let r=[];t.subscribe(F(n,o=>{r.push(o),e{for(let o of r)n.next(o);n.complete()},void 0,()=>{r=null}))})}function G0(){return j((e,t)=>{let n,r=!1;e.subscribe(F(t,o=>{let i=n;n=o,r&&t.next([i,o]),r=!0}))})}function As(e={}){let{connector:t=()=>new he,resetOnError:n=!0,resetOnComplete:r=!0,resetOnRefCountZero:o=!0}=e;return i=>{let s,u,a,c=0,l=!1,d=!1,h=()=>{u?.unsubscribe(),u=void 0},f=()=>{h(),s=a=void 0,l=d=!1},p=()=>{let m=s;f(),m?.unsubscribe()};return j((m,g)=>{c++,!d&&!l&&h();let y=a=a??t();g.add(()=>{c--,c===0&&!d&&!l&&(u=Lc(p,o))}),y.subscribe(g),!s&&c>0&&(s=new tt({next:v=>y.next(v),error:v=>{d=!0,h(),u=Lc(f,n,v),y.error(v)},complete:()=>{l=!0,h(),u=Lc(f,r),y.complete()}}),z(m).subscribe(s))})(i)}}function Lc(e,t,...n){if(t===!0){e();return}if(t===!1)return;let r=new tt({next:()=>{r.unsubscribe(),e()}});return z(t(...n)).subscribe(r)}function W0(e,t,n){let r,o=!1;return e&&typeof e=="object"?{bufferSize:r=1/0,windowTime:t=1/0,refCount:o=!1,scheduler:n}=e:r=e??1/0,As({connector:()=>new jo(r,t,n),resetOnError:!0,resetOnComplete:!1,resetOnRefCountZero:o})}function Z0(e){return gn((t,n)=>e<=n)}function Y0(...e){let t=Et(e);return j((n,r)=>{(t?Ss(e,n,t):Ss(e,n)).subscribe(r)})}function Ns(e,t){return j((n,r)=>{let o=null,i=0,s=!1,u=()=>s&&!o&&r.complete();n.subscribe(F(r,a=>{o?.unsubscribe();let c=0,l=i++;z(e(a,l)).subscribe(o=F(r,d=>r.next(t?t(a,d,l,c++):d),()=>{o=null,u()}))},()=>{s=!0,u()}))})}function JE(e){return j((t,n)=>{z(e).subscribe(F(n,()=>n.complete(),jt)),!n.closed&&t.subscribe(n)})}function XE(e,t=!1){return j((n,r)=>{let o=0;n.subscribe(F(r,i=>{let s=e(i,o++);(s||t)&&r.next(i),!s&&r.complete()}))})}function Q0(e,t,n){let r=R(e)||t||n?{next:e,error:t,complete:n}:e;return r?j((o,i)=>{var s;(s=r.subscribe)===null||s===void 0||s.call(r);let u=!0;o.subscribe(F(i,a=>{var c;(c=r.next)===null||c===void 0||c.call(r,a),i.next(a)},()=>{var a;u=!1,(a=r.complete)===null||a===void 0||a.call(r),i.complete()},a=>{var c;u=!1,(c=r.error)===null||c===void 0||c.call(r,a),i.error(a)},()=>{var a,c;u&&((a=r.unsubscribe)===null||a===void 0||a.call(r)),(c=r.finalize)===null||c===void 0||c.call(r)}))}):Te}function eC(...e){let t=hn(e);return j((n,r)=>{let o=e.length,i=new Array(o),s=e.map(()=>!1),u=!1;for(let a=0;a{i[a]=c,!u&&!s[a]&&(s[a]=!0,(u=s.every(Te))&&(s=null))},jt));n.subscribe(F(r,a=>{if(u){let c=[a,...i];r.next(t?t(...c):c)}}))})}var jc;function ks(){return jc}function _t(e){let t=jc;return jc=e,t}var K0=Symbol("NotFound");function jr(e){return e===K0||e?.name==="\u0275NotFound"}function Bc(e,t,n){let r=Object.create(tC);r.source=e,r.computation=t,n!=null&&(r.equal=n);let i=()=>{if(Ln(r),cn(r),r.value===Dt)throw r.error;return r.value};return i[se]=r,ko(r),i}function J0(e,t){Ln(e),jn(e,t),Ir(e)}function X0(e,t){if(Ln(e),e.value===Dt)throw e.error;rs(e,t),Ir(e)}var tC=P(M({},an),{value:un,dirty:!0,error:null,equal:Ro,kind:"linkedSignal",producerMustRecompute(e){return e.value===un||e.value===Pn},producerRecomputeValue(e){if(e.value===Pn)throw new Error("");let t=e.value;e.value=Pn;let n=Lt(e),r;try{let o=e.source(),i=t===un||t===Dt?void 0:{source:e.sourceValue,value:t};r=e.computation(o,i),e.sourceValue=o}catch(o){r=Dt,e.error=o}finally{ln(e,n)}if(t!==un&&r!==Dt&&e.equal(t,r)){e.value=t;return}e.value=r,e.version++}});function eg(e){let t=I(null);try{return e()}finally{I(t)}}var Bs="https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss",D=class extends Error{code;constructor(t,n){super(xt(t,n)),this.code=t}};function nC(e){return`NG0${Math.abs(e)}`}function xt(e,t){return`${nC(e)}${t?": "+t:""}`}var fe=globalThis;function W(e){for(let t in e)if(e[t]===W)return t;throw Error("")}function ig(e,t){for(let n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n])}function Yo(e){if(typeof e=="string")return e;if(Array.isArray(e))return`[${e.map(Yo).join(", ")}]`;if(e==null)return""+e;let t=e.overriddenName||e.name;if(t)return`${t}`;let n=e.toString();if(n==null)return""+n;let r=n.indexOf(` `);return r>=0?n.slice(0,r):n}function Vs(e,t){return e?t?`${e} ${t}`:e:t||""}var rC=W({__forward_ref__:W});function Hs(e){return e.__forward_ref__=Hs,e}function le(e){return Jc(e)?e():e}function Jc(e){return typeof e=="function"&&e.hasOwnProperty(rC)&&e.__forward_ref__===Hs}function T(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function It(e){return{providers:e.providers||[],imports:e.imports||[]}}function Qo(e){return iC(e,$s)}function oC(e){return Qo(e)!==null}function iC(e,t){return e.hasOwnProperty(t)&&e[t]||null}function sC(e){let t=e?.[$s]??null;return t||null}function Hc(e){return e&&e.hasOwnProperty(Fs)?e[Fs]:null}var $s=W({\u0275prov:W}),Fs=W({\u0275inj:W}),x=class{_desc;ngMetadataName="InjectionToken";\u0275prov;constructor(t,n){this._desc=t,this.\u0275prov=void 0,typeof n=="number"?this.__NG_ELEMENT_ID__=n:n!==void 0&&(this.\u0275prov=T({token:this,providedIn:n.providedIn||"root",factory:n.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function Xc(e){return e&&!!e.\u0275providers}var el=W({\u0275cmp:W}),tl=W({\u0275dir:W}),nl=W({\u0275pipe:W}),rl=W({\u0275mod:W}),zo=W({\u0275fac:W}),Zn=W({__NG_ELEMENT_ID__:W}),tg=W({__NG_ENV_ID__:W});function ol(e){return zs(e,"@NgModule"),e[rl]||null}function Tt(e){return zs(e,"@Component"),e[el]||null}function Us(e){return zs(e,"@Directive"),e[tl]||null}function sg(e){return zs(e,"@Pipe"),e[nl]||null}function zs(e,t){if(e==null)throw new D(-919,!1)}function vn(e){return typeof e=="string"?e:e==null?"":String(e)}var ug=W({ngErrorCode:W}),uC=W({ngErrorMessage:W}),aC=W({ngTokenPath:W});function il(e,t){return ag("",-200,t)}function qs(e,t){throw new D(-201,!1)}function ag(e,t,n){let r=new D(t,e);return r[ug]=t,r[uC]=e,n&&(r[aC]=n),r}function cC(e){return e[ug]}var $c;function cg(){return $c}function Me(e){let t=$c;return $c=e,t}function sl(e,t,n){let r=Qo(e);if(r&&r.providedIn=="root")return r.value===void 0?r.value=r.factory():r.value;if(n&8)return null;if(t!==void 0)return t;qs(e,"")}var lC={},zn=lC,dC="__NG_DI_FLAG__",Uc=class{injector;constructor(t){this.injector=t}retrieve(t,n){let r=qn(n)||0;try{return this.injector.get(t,r&8?null:zn,r)}catch(o){if(jr(o))return o;throw o}}};function fC(e,t=0){let n=ks();if(n===void 0)throw new D(-203,!1);if(n===null)return sl(e,void 0,t);{let r=pC(t),o=n.retrieve(e,r);if(jr(o)){if(r.optional)return null;throw o}return o}}function A(e,t=0){return(cg()||fC)(le(e),t)}function b(e,t){return A(e,qn(t))}function qn(e){return typeof e>"u"||typeof e=="number"?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function pC(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function zc(e){let t=[];for(let n=0;nArray.isArray(n)?Gs(n,t):t(n))}function ul(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function Ko(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function fg(e,t){let n=[];for(let r=0;rt;){let i=o-2;e[o]=e[i],o--}e[t]=n,e[t+1]=r}}function Jo(e,t,n){let r=Vr(e,t);return r>=0?e[r|1]=n:(r=~r,pg(e,r,t,n)),r}function Ws(e,t){let n=Vr(e,t);if(n>=0)return e[n|1]}function Vr(e,t){return gC(e,t,1)}function gC(e,t,n){let r=0,o=e.length>>n;for(;o!==r;){let i=r+(o-r>>1),s=e[i<t?o=i:r=i+1}return~(o<{n.push(s)};return Gs(t,s=>{let u=s;Os(u,i,[],r)&&(o||=[],o.push(u))}),o!==void 0&&gg(o,i),n}function gg(e,t){for(let n=0;n{t(i,r)})}}function Os(e,t,n,r){if(e=le(e),!e)return!1;let o=null,i=Hc(e),s=!i&&Tt(e);if(!i&&!s){let a=e.ngModule;if(i=Hc(a),i)o=a;else return!1}else{if(s&&!s.standalone)return!1;o=e}let u=r.has(o);if(s){if(u)return!1;if(r.add(o),s.dependencies){let a=typeof s.dependencies=="function"?s.dependencies():s.dependencies;for(let c of a)Os(c,t,n,r)}}else if(i){if(i.imports!=null&&!u){r.add(o);let c;Gs(i.imports,l=>{Os(l,t,n,r)&&(c||=[],c.push(l))}),c!==void 0&&gg(c,t)}if(!u){let c=mn(o)||(()=>new o);t({provide:o,useFactory:c,deps:Ee},o),t({provide:cl,useValue:o,multi:!0},o),t({provide:Hr,useValue:()=>A(o),multi:!0},o)}let a=i.providers;if(a!=null&&!u){let c=e;dl(a,l=>{t(l,c)})}}else return!1;return o!==e&&e.providers!==void 0}function dl(e,t){for(let n of e)Xc(n)&&(n=n.\u0275providers),Array.isArray(n)?dl(n,t):t(n)}var mC=W({provide:String,useValue:W});function mg(e){return e!==null&&typeof e=="object"&&mC in e}function yC(e){return!!(e&&e.useExisting)}function bC(e){return!!(e&&e.useFactory)}function Gn(e){return typeof e=="function"}function yg(e){return!!e.useClass}var Xo=new x(""),Rs={},ng={},Vc;function $r(){return Vc===void 0&&(Vc=new qo),Vc}var Ae=class{},Wn=class extends Ae{parent;source;scopes;records=new Map;_ngOnDestroyHooks=new Set;_onDestroyHooks=[];get destroyed(){return this._destroyed}_destroyed=!1;injectorDefTypes;constructor(t,n,r,o){super(),this.parent=n,this.source=r,this.scopes=o,Gc(t,s=>this.processProvider(s)),this.records.set(al,Br(void 0,this)),o.has("environment")&&this.records.set(Ae,Br(void 0,this));let i=this.records.get(Xo);i!=null&&typeof i.value=="string"&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(cl,Ee,{self:!0}))}retrieve(t,n){let r=qn(n)||0;try{return this.get(t,zn,r)}catch(o){if(jr(o))return o;throw o}}destroy(){Uo(this),this._destroyed=!0;let t=I(null);try{for(let r of this._ngOnDestroyHooks)r.ngOnDestroy();let n=this._onDestroyHooks;this._onDestroyHooks=[];for(let r of n)r()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),I(t)}}onDestroy(t){return Uo(this),this._onDestroyHooks.push(t),()=>this.removeOnDestroy(t)}runInContext(t){Uo(this);let n=_t(this),r=Me(void 0),o;try{return t()}finally{_t(n),Me(r)}}get(t,n=zn,r){if(Uo(this),t.hasOwnProperty(tg))return t[tg](this);let o=qn(r),i,s=_t(this),u=Me(void 0);try{if(!(o&4)){let c=this.records.get(t);if(c===void 0){let l=_C(t)&&Qo(t);l&&this.injectableDefInScope(l)?c=Br(qc(t),Rs):c=null,this.records.set(t,c)}if(c!=null)return this.hydrate(t,c,o)}let a=o&2?$r():this.parent;return n=o&8&&n===zn?null:n,a.get(t,n)}catch(a){let c=cC(a);throw c===-200||c===-201?new D(c,null):a}finally{Me(u),_t(s)}}resolveInjectorInitializers(){let t=I(null),n=_t(this),r=Me(void 0),o;try{let i=this.get(Hr,Ee,{self:!0});for(let s of i)s()}finally{_t(n),Me(r),I(t)}}toString(){return"R3Injector[...]"}processProvider(t){t=le(t);let n=Gn(t)?t:le(t&&t.provide),r=DC(t);if(!Gn(t)&&t.multi===!0){let o=this.records.get(n);o||(o=Br(void 0,Rs,!0),o.factory=()=>zc(o.multi),this.records.set(n,o)),n=t,o.multi.push(t)}this.records.set(n,r)}hydrate(t,n,r){let o=I(null);try{if(n.value===ng)throw il("");return n.value===Rs&&(n.value=ng,n.value=n.factory(void 0,r)),typeof n.value=="object"&&n.value&&CC(n.value)&&this._ngOnDestroyHooks.add(n.value),n.value}finally{I(o)}}injectableDefInScope(t){if(!t.providedIn)return!1;let n=le(t.providedIn);return typeof n=="string"?n==="any"||this.scopes.has(n):this.injectorDefTypes.has(n)}removeOnDestroy(t){let n=this._onDestroyHooks.indexOf(t);n!==-1&&this._onDestroyHooks.splice(n,1)}};function qc(e){let t=Qo(e),n=t!==null?t.factory:mn(e);if(n!==null)return n;if(e instanceof x)throw new D(-204,!1);if(e instanceof Function)return vC(e);throw new D(-204,!1)}function vC(e){if(e.length>0)throw new D(-204,!1);let n=sC(e);return n!==null?()=>n.factory(e):()=>new e}function DC(e){if(mg(e))return Br(void 0,e.useValue);{let t=fl(e);return Br(t,Rs)}}function fl(e,t,n){let r;if(Gn(e)){let o=le(e);return mn(o)||qc(o)}else if(mg(e))r=()=>le(e.useValue);else if(bC(e))r=()=>e.useFactory(...zc(e.deps||[]));else if(yC(e))r=(o,i)=>A(le(e.useExisting),i!==void 0&&i&8?8:void 0);else{let o=le(e&&(e.useClass||e.provide));if(EC(e))r=()=>new o(...zc(e.deps));else return mn(o)||qc(o)}return r}function Uo(e){if(e.destroyed)throw new D(-205,!1)}function Br(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function EC(e){return!!e.deps}function CC(e){return e!==null&&typeof e=="object"&&typeof e.ngOnDestroy=="function"}function _C(e){return typeof e=="function"||typeof e=="object"&&e.ngMetadataName==="InjectionToken"}function Gc(e,t){for(let n of e)Array.isArray(n)?Gc(n,t):n&&Xc(n)?Gc(n.\u0275providers,t):t(n)}function Ur(e,t){let n;e instanceof Wn?(Uo(e),n=e):n=new Uc(e);let r,o=_t(n),i=Me(void 0);try{return t()}finally{_t(o),Me(i)}}function Zs(){return cg()!==void 0||ks()!=null}function wC(e){if(!Zs())throw new D(-203,!1)}var rt=0,S=1,L=2,de=3,Ze=4,Ne=5,Qn=6,zr=7,re=8,Ut=9,ot=10,Z=11,qr=12,pl=13,Kn=14,_e=15,Dn=16,Jn=17,St=18,zt=19,hl=20,$t=21,Ys=22,yn=23,Be=24,Xn=25,En=26,K=27,bg=1,gl=6,Cn=7,ei=8,er=9,oe=10;function qt(e){return Array.isArray(e)&&typeof e[bg]=="object"}function it(e){return Array.isArray(e)&&e[bg]===!0}function ml(e){return(e.flags&4)!==0}function Mt(e){return e.componentOffset>-1}function Gr(e){return(e.flags&1)===1}function st(e){return!!e.template}function Wr(e){return(e[L]&512)!==0}function tr(e){return(e[L]&256)===256}var yl="svg",vg="math";function Ye(e){for(;Array.isArray(e);)e=e[rt];return e}function bl(e,t){return Ye(t[e])}function Qe(e,t){return Ye(t[e.index])}function Qs(e,t){return e.data[t]}function ti(e,t){return e[t]}function ni(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function Ve(e,t){let n=t[e];return qt(n)?n:n[rt]}function Dg(e){return(e[L]&4)===4}function Ks(e){return(e[L]&128)===128}function Eg(e){return it(e[de])}function He(e,t){return t==null?null:e[t]}function vl(e){e[Jn]=0}function Dl(e){e[L]&1024||(e[L]|=1024,Ks(e)&&nr(e))}function Cg(e,t){for(;e>0;)t=t[Kn],e--;return t}function ri(e){return!!(e[L]&9216||e[Be]?.dirty)}function Js(e){e[ot].changeDetectionScheduler?.notify(8),e[L]&64&&(e[L]|=1024),ri(e)&&nr(e)}function nr(e){e[ot].changeDetectionScheduler?.notify(0);let t=bn(e);for(;t!==null&&!(t[L]&8192||(t[L]|=8192,!Ks(t)));)t=bn(t)}function El(e,t){if(tr(e))throw new D(911,!1);e[$t]===null&&(e[$t]=[]),e[$t].push(t)}function _g(e,t){if(e[$t]===null)return;let n=e[$t].indexOf(t);n!==-1&&e[$t].splice(n,1)}function bn(e){let t=e[de];return it(t)?t[de]:t}function Cl(e){return e[zr]??=[]}function _l(e){return e.cleanup??=[]}function wg(e,t,n,r){let o=Cl(t);o.push(n),e.firstCreatePass&&_l(e).push(r,o.length-1)}var V={lFrame:Lg(null),bindingsEnabled:!0,skipHydrationRootTNode:null};var Wc=!1;function xg(){return V.lFrame.elementDepthCount}function Ig(){V.lFrame.elementDepthCount++}function wl(){V.lFrame.elementDepthCount--}function Xs(){return V.bindingsEnabled}function xl(){return V.skipHydrationRootTNode!==null}function Il(e){return V.skipHydrationRootTNode===e}function Tl(){V.skipHydrationRootTNode=null}function w(){return V.lFrame.lView}function G(){return V.lFrame.tView}function Tg(e){return V.lFrame.contextLView=e,e[re]}function Sg(e){return V.lFrame.contextLView=null,e}function ue(){let e=Sl();for(;e!==null&&e.type===64;)e=e.parent;return e}function Sl(){return V.lFrame.currentTNode}function Mg(){let e=V.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function rr(e,t){let n=V.lFrame;n.currentTNode=e,n.isParent=t}function Ml(){return V.lFrame.isParent}function Al(){V.lFrame.isParent=!1}function Nl(){return V.lFrame.contextLView}function kl(){return Wc}function Go(e){let t=Wc;return Wc=e,t}function Zr(){let e=V.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function Ag(){return V.lFrame.bindingIndex}function Ng(e){return V.lFrame.bindingIndex=e}function ut(){return V.lFrame.bindingIndex++}function eu(e){let t=V.lFrame,n=t.bindingIndex;return t.bindingIndex=t.bindingIndex+e,n}function kg(){return V.lFrame.inI18n}function Rg(e,t){let n=V.lFrame;n.bindingIndex=n.bindingRootIndex=e,tu(t)}function Fg(){return V.lFrame.currentDirectiveIndex}function tu(e){V.lFrame.currentDirectiveIndex=e}function Og(e){let t=V.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function nu(){return V.lFrame.currentQueryIndex}function oi(e){V.lFrame.currentQueryIndex=e}function xC(e){let t=e[S];return t.type===2?t.declTNode:t.type===1?e[Ne]:null}function Rl(e,t,n){if(n&4){let o=t,i=e;for(;o=o.parent,o===null&&!(n&1);)if(o=xC(i),o===null||(i=i[Kn],o.type&10))break;if(o===null)return!1;t=o,e=i}let r=V.lFrame=Pg();return r.currentTNode=t,r.lView=e,!0}function ru(e){let t=Pg(),n=e[S];V.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function Pg(){let e=V.lFrame,t=e===null?null:e.child;return t===null?Lg(e):t}function Lg(e){let t={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return e!==null&&(e.child=t),t}function jg(){let e=V.lFrame;return V.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var Fl=jg;function ou(){let e=jg();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function Bg(e){return(V.lFrame.contextLView=Cg(e,V.lFrame.contextLView))[re]}function at(){return V.lFrame.selectedIndex}function _n(e){V.lFrame.selectedIndex=e}function wn(){let e=V.lFrame;return Qs(e.tView,e.selectedIndex)}function Vg(){V.lFrame.currentNamespace=yl}function Hg(){IC()}function IC(){V.lFrame.currentNamespace=null}function $g(){return V.lFrame.currentNamespace}var Ug=!0;function iu(){return Ug}function ii(e){Ug=e}function Zc(e,t=null,n=null,r){let o=Ol(e,t,n,r);return o.resolveInjectorInitializers(),o}function Ol(e,t=null,n=null,r,o=new Set){let i=[n||Ee,hg(e)],s;return new Wn(i,t||$r(),s||null,o)}var me=class e{static THROW_IF_NOT_FOUND=zn;static NULL=new qo;static create(t,n){if(Array.isArray(t))return Zc({name:""},n,t,"");{let r=t.name??"";return Zc({name:r},t.parent,t.providers,r)}}static \u0275prov=T({token:e,providedIn:"any",factory:()=>A(al)});static __NG_ELEMENT_ID__=-1},X=new x(""),$e=(()=>{class e{static __NG_ELEMENT_ID__=TC;static __NG_ENV_ID__=n=>n}return e})(),Ps=class extends $e{_lView;constructor(t){super(),this._lView=t}get destroyed(){return tr(this._lView)}onDestroy(t){let n=this._lView;return El(n,t),()=>_g(n,t)}};function TC(){return new Ps(w())}var zg=!1,qg=new x(""),or=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new Po(!1);debugTaskTracker=b(qg,{optional:!0});get hasPendingTasks(){return this.destroyed?!1:this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new B(n=>{n.next(!1),n.complete()}):this.pendingTask}add(){!this.hasPendingTasks&&!this.destroyed&&this.pendingTask.next(!0);let n=this.taskId++;return this.pendingTasks.add(n),this.debugTaskTracker?.add(n),n}has(n){return this.pendingTasks.has(n)}remove(n){this.pendingTasks.delete(n),this.debugTaskTracker?.remove(n),this.pendingTasks.size===0&&this.hasPendingTasks&&this.pendingTask.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this.hasPendingTasks&&this.pendingTask.next(!1),this.destroyed=!0,this.pendingTask.unsubscribe()}static \u0275prov=T({token:e,providedIn:"root",factory:()=>new e})}return e})(),Yc=class extends he{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(t=!1){super(),this.__isAsync=t,Zs()&&(this.destroyRef=b($e,{optional:!0})??void 0,this.pendingTasks=b(or,{optional:!0})??void 0)}emit(t){let n=I(null);try{super.next(t)}finally{I(n)}}subscribe(t,n,r){let o=t,i=n||(()=>null),s=r;if(t&&typeof t=="object"){let a=t;o=a.next?.bind(a),i=a.error?.bind(a),s=a.complete?.bind(a)}this.__isAsync&&(i=this.wrapInTimeout(i),o&&(o=this.wrapInTimeout(o)),s&&(s=this.wrapInTimeout(s)));let u=super.subscribe({next:o,error:i,complete:s});return t instanceof ne&&t.add(u),u}wrapInTimeout(t){return n=>{let r=this.pendingTasks?.add();setTimeout(()=>{try{t(n)}finally{r!==void 0&&this.pendingTasks?.remove(r)}})}}},Ht=Yc;function Ls(...e){}function Pl(e){let t,n;function r(){e=Ls;try{n!==void 0&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(n),t!==void 0&&clearTimeout(t)}catch(o){}}return t=setTimeout(()=>{e(),r()}),typeof requestAnimationFrame=="function"&&(n=requestAnimationFrame(()=>{e(),r()})),()=>r()}function Gg(e){return queueMicrotask(()=>e()),()=>{e=Ls}}var Ll="isAngularZone",Wo=Ll+"_ID",SC=0,Ce=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Ht(!1);onMicrotaskEmpty=new Ht(!1);onStable=new Ht(!1);onError=new Ht(!1);constructor(t){let{enableLongStackTrace:n=!1,shouldCoalesceEventChangeDetection:r=!1,shouldCoalesceRunChangeDetection:o=!1,scheduleInRootZone:i=zg}=t;if(typeof Zone>"u")throw new D(908,!1);Zone.assertZonePatched();let s=this;s._nesting=0,s._outer=s._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(s._inner=s._inner.fork(new Zone.TaskTrackingZoneSpec)),n&&Zone.longStackTraceZoneSpec&&(s._inner=s._inner.fork(Zone.longStackTraceZoneSpec)),s.shouldCoalesceEventChangeDetection=!o&&r,s.shouldCoalesceRunChangeDetection=o,s.callbackScheduled=!1,s.scheduleInRootZone=i,NC(s)}static isInAngularZone(){return typeof Zone<"u"&&Zone.current.get(Ll)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new D(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new D(909,!1)}run(t,n,r){return this._inner.run(t,n,r)}runTask(t,n,r,o){let i=this._inner,s=i.scheduleEventTask("NgZoneEvent: "+o,t,MC,Ls,Ls);try{return i.runTask(s,n,r)}finally{i.cancelTask(s)}}runGuarded(t,n,r){return this._inner.runGuarded(t,n,r)}runOutsideAngular(t){return this._outer.run(t)}},MC={};function jl(e){if(e._nesting==0&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function AC(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){Pl(()=>{e.callbackScheduled=!1,Qc(e),e.isCheckStableRunning=!0,jl(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),Qc(e)}function NC(e){let t=()=>{AC(e)},n=SC++;e._inner=e._inner.fork({name:"angular",properties:{[Ll]:!0,[Wo]:n,[Wo+n]:!0},onInvokeTask:(r,o,i,s,u,a)=>{if(kC(a))return r.invokeTask(i,s,u,a);try{return rg(e),r.invokeTask(i,s,u,a)}finally{(e.shouldCoalesceEventChangeDetection&&s.type==="eventTask"||e.shouldCoalesceRunChangeDetection)&&t(),og(e)}},onInvoke:(r,o,i,s,u,a,c)=>{try{return rg(e),r.invoke(i,s,u,a,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!RC(a)&&t(),og(e)}},onHasTask:(r,o,i,s)=>{r.hasTask(i,s),o===i&&(s.change=="microTask"?(e._hasPendingMicrotasks=s.microTask,Qc(e),jl(e)):s.change=="macroTask"&&(e.hasPendingMacrotasks=s.macroTask))},onHandleError:(r,o,i,s)=>(r.handleError(i,s),e.runOutsideAngular(()=>e.onError.emit(s)),!1)})}function Qc(e){e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0?e.hasPendingMicrotasks=!0:e.hasPendingMicrotasks=!1}function rg(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function og(e){e._nesting--,jl(e)}var Zo=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Ht;onMicrotaskEmpty=new Ht;onStable=new Ht;onError=new Ht;run(t,n,r){return t.apply(n,r)}runGuarded(t,n,r){return t.apply(n,r)}runOutsideAngular(t){return t()}runTask(t,n,r,o){return t.apply(n,r)}};function kC(e){return Wg(e,"__ignore_ng_zone__")}function RC(e){return Wg(e,"__scheduler_tick__")}function Wg(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var We=class{_console=console;handleError(t){this._console.error("ERROR",t)}},Gt=new x("",{factory:()=>{let e=b(Ce),t=b(Ae),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(We),n.handleError(r))})}}}),Zg={provide:Hr,useValue:()=>{let e=b(We,{optional:!0})},multi:!0};function xn(e,t){let[n,r,o]=gc(e,t?.equal),i=n,s=i[se];return i.set=r,i.update=o,i.asReadonly=si.bind(i),i}function si(){let e=this[se];if(e.readonlyFn===void 0){let t=()=>this();t[se]=e,e.readonlyFn=t}return e.readonlyFn}var Yr=(()=>{class e{view;node;constructor(n,r){this.view=n,this.node=r}static __NG_ELEMENT_ID__=FC}return e})();function FC(){return new Yr(w(),ue())}var wt=class{},ui=new x("",{factory:()=>!0});var Bl=new x(""),ir=(()=>{class e{internalPendingTasks=b(or);scheduler=b(wt);errorHandler=b(Gt);add(){let n=this.internalPendingTasks.add();return()=>{this.internalPendingTasks.has(n)&&(this.scheduler.notify(11),this.internalPendingTasks.remove(n))}}run(n){let r=this.add();n().catch(this.errorHandler).finally(r)}static \u0275prov=T({token:e,providedIn:"root",factory:()=>new e})}return e})(),su=(()=>{class e{static \u0275prov=T({token:e,providedIn:"root",factory:()=>new Kc})}return e})(),Kc=class{dirtyEffectCount=0;queues=new Map;add(t){this.enqueue(t),this.schedule(t)}schedule(t){t.dirty&&this.dirtyEffectCount++}remove(t){let n=t.zone,r=this.queues.get(n);r.has(t)&&(r.delete(t),t.dirty&&this.dirtyEffectCount--)}enqueue(t){let n=t.zone;this.queues.has(n)||this.queues.set(n,new Set);let r=this.queues.get(n);r.has(t)||r.add(t)}flush(){for(;this.dirtyEffectCount>0;){let t=!1;for(let[n,r]of this.queues)n===null?t||=this.flushQueue(r):t||=n.run(()=>this.flushQueue(r));t||(this.dirtyEffectCount=0)}}flushQueue(t){let n=!1;for(let r of t)r.dirty&&(this.dirtyEffectCount--,n=!0,r.run());return n}},js=class{[se];constructor(t){this[se]=t}destroy(){this[se].destroy()}};function ai(e,t){let n=t?.injector??b(me),r=t?.manualCleanup!==!0?n.get($e):null,o,i=n.get(Yr,null,{optional:!0}),s=n.get(wt);return i!==null?(o=LC(i.view,s,e),r instanceof Ps&&r._lView===i.view&&(r=null)):o=jC(e,n.get(su),s),o.injector=n,r!==null&&(o.onDestroyFns=[r.onDestroy(()=>o.destroy())]),new js(o)}var Yg=P(M({},mc),{cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=Go(!1);try{yc(this)}finally{Go(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=I(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],I(e)}}}),OC=P(M({},Yg),{consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(dn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}}),PC=P(M({},Yg),{consumerMarkedDirty(){this.view[L]|=8192,nr(this.view),this.notifier.notify(13)},destroy(){if(dn(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[yn]?.delete(this)}});function LC(e,t,n){let r=Object.create(PC);return r.view=e,r.zone=typeof Zone<"u"?Zone.current:null,r.notifier=t,r.fn=Qg(r,n),e[yn]??=new Set,e[yn].add(r),r.consumerMarkedDirty(r),r}function jC(e,t,n){let r=Object.create(OC);return r.fn=Qg(r,e),r.scheduler=t,r.notifier=n,r.zone=typeof Zone<"u"?Zone.current:null,r.scheduler.add(r),r.notifier.notify(12),r}function Qg(e,t){return()=>{t(n=>(e.cleanupFns??=[]).push(n))}}function Di(e){return{toString:e}.toString()}function qC(e){return typeof e=="function"}function Om(e,t,n,r){t!==null?t.applyValueToInputSignal(t,r):e[n]=r}var gu=class{previousValue;currentValue;firstChange;constructor(t,n,r){this.previousValue=t,this.currentValue=n,this.firstChange=r}isFirstChange(){return this.firstChange}},Fu=(()=>{let e=()=>Pm;return e.ngInherit=!0,e})();function Pm(e){return e.type.prototype.ngOnChanges&&(e.setInput=WC),GC}function GC(){let e=jm(this),t=e?.current;if(t){let n=e.previous;if(n===nt)e.previous=t;else for(let r in t)n[r]=t[r];e.current=null,this.ngOnChanges(t)}}function WC(e,t,n,r,o){let i=this.declaredInputs[r],s=jm(e)||ZC(e,{previous:nt,current:null}),u=s.current||(s.current={}),a=s.previous,c=a[i];u[i]=new gu(c&&c.currentValue,n,a===nt),Om(e,t,o,n)}var Lm="__ngSimpleChanges__";function jm(e){return e[Lm]||null}function ZC(e,t){return e[Lm]=t}var Kg=[];var Y=function(e,t=null,n){for(let r=0;r=r)break}else t[a]<0&&(e[Jn]+=65536),(u>14>16&&(e[L]&3)===t&&(e[L]+=16384,Jg(u,i)):Jg(u,i)}var Kr=-1,ar=class{factory;name;injectImpl;resolving=!1;canSeeViewProviders;multi;componentProviders;index;providerFactory;constructor(t,n,r,o){this.factory=t,this.name=o,this.canSeeViewProviders=n,this.injectImpl=r}};function KC(e){return(e.flags&8)!==0}function JC(e){return(e.flags&16)!==0}function XC(e,t,n){let r=0;for(;rt){s=i-1;break}}}for(;i>16}function yu(e,t){let n=t_(e),r=t;for(;n>0;)r=r[Kn],n--;return r}var Kl=!0;function bu(e){let t=Kl;return Kl=e,t}var n_=256,Um=n_-1,zm=5,r_=0,At={};function o_(e,t,n){let r;typeof n=="string"?r=n.charCodeAt(0)||0:n.hasOwnProperty(Zn)&&(r=n[Zn]),r==null&&(r=n[Zn]=r_++);let o=r&Um,i=1<>zm)]|=i}function vu(e,t){let n=qm(e,t);if(n!==-1)return n;let r=t[S];r.firstCreatePass&&(e.injectorIndex=t.length,Hl(r.data,e),Hl(t,null),Hl(r.blueprint,null));let o=Fd(e,t),i=e.injectorIndex;if($m(o)){let s=mu(o),u=yu(o,t),a=u[S].data;for(let c=0;c<8;c++)t[i+c]=u[s+c]|a[s+c]}return t[i+8]=o,i}function Hl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function qm(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function Fd(e,t){if(e.parent&&e.parent.injectorIndex!==-1)return e.parent.injectorIndex;let n=0,r=null,o=t;for(;o!==null;){if(r=Qm(o),r===null)return Kr;if(n++,o=o[Kn],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Kr}function Jl(e,t,n){o_(e,t,n)}function i_(e,t){if(t==="class")return e.classes;if(t==="style")return e.styles;let n=e.attrs;if(n){let r=n.length,o=0;for(;o>20,d=r?u:u+l,h=o?u+l:c;for(let f=d;f=a&&p.type===n)return f}if(o){let f=s[a];if(f&&st(f)&&f.type===n)return a}return null}function fi(e,t,n,r,o){let i=e[n],s=t.data;if(i instanceof ar){let u=i;if(u.resolving)throw il("");let a=bu(u.canSeeViewProviders);u.resolving=!0;let c=s[n].type||s[n],l,d=u.injectImpl?Me(u.injectImpl):null,h=Rl(e,r,0);try{i=e[n]=u.factory(void 0,o,s,e,r),t.firstCreatePass&&n>=r.directiveStart&&YC(n,s[n],t)}finally{d!==null&&Me(d),bu(a),u.resolving=!1,Fl()}}return i}function u_(e){if(typeof e=="string")return e.charCodeAt(0)||0;let t=e.hasOwnProperty(Zn)?e[Zn]:void 0;return typeof t=="number"?t>=0?t&Um:a_:t}function em(e,t,n){let r=1<>zm)]&r)}function tm(e,t){return!(e&2)&&!(e&1&&t)}var sr=class{_tNode;_lView;constructor(t,n){this._tNode=t,this._lView=n}get(t,n,r){return Zm(this._tNode,this._lView,t,qn(r),n)}};function a_(){return new sr(ue(),w())}function pr(e){return Di(()=>{let t=e.prototype.constructor,n=t[zo]||Xl(t),r=Object.prototype,o=Object.getPrototypeOf(e.prototype).constructor;for(;o&&o!==r;){let i=o[zo]||Xl(o);if(i&&i!==n)return i;o=Object.getPrototypeOf(o)}return i=>new i})}function Xl(e){return Jc(e)?()=>{let t=Xl(le(e));return t&&t()}:mn(e)}function c_(e,t,n,r,o){let i=e,s=t;for(;i!==null&&s!==null&&s[L]&2048&&!Wr(s);){let u=Ym(i,s,n,r|2,At);if(u!==At)return u;let a=i.parent;if(!a){let c=s[hl];if(c){let l=c.get(n,At,r&-5);if(l!==At)return l}a=Qm(s),s=s[Kn]}i=a}return o}function Qm(e){let t=e[S],n=t.type;return n===2?t.declTNode:n===1?e[Ne]:null}function Od(e){return i_(ue(),e)}function l_(){return oo(ue(),w())}function oo(e,t){return new Zt(Qe(e,t))}var Zt=(()=>{class e{nativeElement;constructor(n){this.nativeElement=n}static __NG_ELEMENT_ID__=l_}return e})();function Km(e){return e instanceof Zt?e.nativeElement:e}function d_(){return this._results[Symbol.iterator]()}var Du=class{_emitDistinctChangesOnly;dirty=!0;_onDirty=void 0;_results=[];_changesDetected=!1;_changes=void 0;length=0;first=void 0;last=void 0;get changes(){return this._changes??=new he}constructor(t=!1){this._emitDistinctChangesOnly=t}get(t){return this._results[t]}map(t){return this._results.map(t)}filter(t){return this._results.filter(t)}find(t){return this._results.find(t)}reduce(t,n){return this._results.reduce(t,n)}forEach(t){this._results.forEach(t)}some(t){return this._results.some(t)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(t,n){this.dirty=!1;let r=dg(t);(this._changesDetected=!lg(this._results,r,n))&&(this._results=r,this.length=r.length,this.last=r[this.length-1],this.first=r[0])}notifyOnChanges(){this._changes!==void 0&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.next(this)}onDirty(t){this._onDirty=t}setDirty(){this.dirty=!0,this._onDirty?.()}destroy(){this._changes!==void 0&&(this._changes.complete(),this._changes.unsubscribe())}[Symbol.iterator]=d_};function Jm(e){return(e.flags&128)===128}var Pd=(function(e){return e[e.OnPush=0]="OnPush",e[e.Eager=1]="Eager",e[e.Default=1]="Default",e})(Pd||{}),Xm=new Map,f_=0;function p_(){return f_++}function h_(e){Xm.set(e[zt],e)}function ed(e){Xm.delete(e[zt])}var nm="__ngContext__";function Xr(e,t){qt(t)?(e[nm]=t[zt],h_(t)):e[nm]=t}function ey(e){return ny(e[qr])}function ty(e){return ny(e[Ze])}function ny(e){for(;e!==null&&!it(e);)e=e[Ze];return e}var td;function Ld(e){td=e}function ry(){if(td!==void 0)return td;if(typeof document<"u")return document;throw new D(210,!1)}var Ou=new x("",{factory:()=>g_}),g_="ng";var Pu=new x(""),hr=new x("",{providedIn:"platform",factory:()=>"unknown"}),m_=new x(""),Lu=new x("",{factory:()=>b(X).body?.querySelector("[ngCspNonce]")?.getAttribute("ngCspNonce")||null});var oy="r";var iy="di";var sy=!1,uy=new x("",{factory:()=>sy});var ay=new x("");var y_=(e,t,n,r)=>{};function b_(e,t,n,r){y_(e,t,n,r)}function ju(e){return(e.flags&32)===32}var v_=()=>null;function cy(e,t,n=!1){return v_(e,t,n)}function ly(e,t){let n=e.contentQueries;if(n!==null){let r=I(null);try{for(let o=0;oe,createScript:e=>e,createScriptURL:e=>e})}catch(e){}return uu}function Bu(e){return D_()?.createHTML(e)||e}var au;function E_(){if(au===void 0&&(au=null,fe.trustedTypes))try{au=fe.trustedTypes.createPolicy("angular#unsafe-bypass",{createHTML:e=>e,createScript:e=>e,createScriptURL:e=>e})}catch(e){}return au}function rm(e){return E_()?.createHTML(e)||e}var Wt=class{changingThisBreaksApplicationSecurity;constructor(t){this.changingThisBreaksApplicationSecurity=t}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see ${Bs})`}},rd=class extends Wt{getTypeName(){return"HTML"}},od=class extends Wt{getTypeName(){return"Style"}},id=class extends Wt{getTypeName(){return"Script"}},sd=class extends Wt{getTypeName(){return"URL"}},ud=class extends Wt{getTypeName(){return"ResourceURL"}};function Ue(e){return e instanceof Wt?e.changingThisBreaksApplicationSecurity:e}function Yt(e,t){let n=dy(e);if(n!=null&&n!==t){if(n==="ResourceURL"&&t==="URL")return!0;throw new Error(`Required a safe ${t}, got a ${n} (see ${Bs})`)}return n===t}function dy(e){return e instanceof Wt&&e.getTypeName()||null}function Bd(e){return new rd(e)}function Vd(e){return new od(e)}function Hd(e){return new id(e)}function $d(e){return new sd(e)}function Ud(e){return new ud(e)}function C_(e){let t=new cd(e);return __()?new ad(t):t}var ad=class{inertDocumentHelper;constructor(t){this.inertDocumentHelper=t}getInertBodyElement(t){t=""+t;try{let n=new window.DOMParser().parseFromString(Bu(t),"text/html").body;return n===null?this.inertDocumentHelper.getInertBodyElement(t):(n.firstChild?.remove(),n)}catch(n){return null}}},cd=class{defaultDoc;inertDocument;constructor(t){this.defaultDoc=t,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert")}getInertBodyElement(t){let n=this.inertDocument.createElement("template");return n.innerHTML=Bu(t),n}};function __(){try{return!!new window.DOMParser().parseFromString(Bu(""),"text/html")}catch(e){return!1}}var w_=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:\/?#]*(?:[\/?#]|$))/i;function Ei(e){return e=String(e),e.match(w_)?e:"unsafe:"+e}function Qt(e){let t={};for(let n of e.split(","))t[n]=!0;return t}function Ci(...e){let t={};for(let n of e)for(let r in n)n.hasOwnProperty(r)&&(t[r]=!0);return t}var fy=Qt("area,br,col,hr,img,wbr"),py=Qt("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),hy=Qt("rp,rt"),x_=Ci(hy,py),I_=Ci(py,Qt("address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul")),T_=Ci(hy,Qt("a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video")),om=Ci(fy,I_,T_,x_),gy=Qt("background,cite,href,itemtype,longdesc,poster,src,xlink:href"),S_=Qt("abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,srcset,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width"),M_=Qt("aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext"),A_=Ci(gy,S_,M_),N_=Qt("script,style,template");var ld=class{sanitizedSomething=!1;buf=[];sanitizeChildren(t){let n=t.firstChild,r=!0,o=[];for(;n;){if(n.nodeType===Node.ELEMENT_NODE?r=this.startElement(n):n.nodeType===Node.TEXT_NODE?this.chars(n.nodeValue):this.sanitizedSomething=!0,r&&n.firstChild){o.push(n),n=F_(n);continue}for(;n;){n.nodeType===Node.ELEMENT_NODE&&this.endElement(n);let i=R_(n);if(i){n=i;break}n=o.pop()}}return this.buf.join("")}startElement(t){let n=im(t).toLowerCase();if(!om.hasOwnProperty(n))return this.sanitizedSomething=!0,!N_.hasOwnProperty(n);this.buf.push("<"),this.buf.push(n);let r=t.attributes;for(let o=0;o"),!0}endElement(t){let n=im(t).toLowerCase();om.hasOwnProperty(n)&&!fy.hasOwnProperty(n)&&(this.buf.push(""))}chars(t){this.buf.push(sm(t))}};function k_(e,t){return(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)!==Node.DOCUMENT_POSITION_CONTAINED_BY}function R_(e){let t=e.nextSibling;if(t&&e!==t.previousSibling)throw my(t);return t}function F_(e){let t=e.firstChild;if(t&&k_(e,t))throw my(t);return t}function im(e){let t=e.nodeName;return typeof t=="string"?t:"FORM"}function my(e){return new Error(`Failed to sanitize html because the element is clobbered: ${e.outerHTML}`)}var O_=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,P_=/([^\#-~ |!])/g;function sm(e){return e.replace(/&/g,"&").replace(O_,function(t){let n=t.charCodeAt(0),r=t.charCodeAt(1);return"&#"+((n-55296)*1024+(r-56320)+65536)+";"}).replace(P_,function(t){return"&#"+t.charCodeAt(0)+";"}).replace(//g,">")}var cu;function Vu(e,t){let n=null;try{cu=cu||C_(e);let r=t?String(t):"";n=cu.getInertBodyElement(r);let o=5,i=r;do{if(o===0)throw new Error("Failed to sanitize html because the input is unstable");o--,r=i,i=n.innerHTML,n=cu.getInertBodyElement(r)}while(r!==i);let u=new ld().sanitizeChildren(um(n)||n);return Bu(u)}finally{if(n){let r=um(n)||n;for(;r.firstChild;)r.firstChild.remove()}}}function um(e){return"content"in e&&L_(e)?e.content:null}function L_(e){return e.nodeType===Node.ELEMENT_NODE&&e.nodeName==="TEMPLATE"}var j_=/^>|^->||--!>|)/g,V_="\u200B$1\u200B";function H_(e){return e.replace(j_,t=>t.replace(B_,V_))}function $_(e,t){return e.createText(t)}function U_(e,t,n){e.setValue(t,n)}function z_(e,t){return e.createComment(H_(t))}function yy(e,t,n){return e.createElement(t,n)}function Eu(e,t,n,r,o){e.insertBefore(t,n,r,o)}function by(e,t,n){e.appendChild(t,n)}function am(e,t,n,r,o){r!==null?Eu(e,t,n,r,o):by(e,t,n)}function vy(e,t,n,r){e.removeChild(null,t,n,r)}function q_(e,t,n){e.setAttribute(t,"style",n)}function G_(e,t,n){n===""?e.removeAttribute(t,"class"):e.setAttribute(t,"class",n)}function Dy(e,t,n){let{mergedAttrs:r,classes:o,styles:i}=n;r!==null&&XC(e,t,r),o!==null&&G_(e,t,o),i!==null&&q_(e,t,i)}var ze=(function(e){return e[e.NONE=0]="NONE",e[e.HTML=1]="HTML",e[e.STYLE=2]="STYLE",e[e.SCRIPT=3]="SCRIPT",e[e.URL=4]="URL",e[e.RESOURCE_URL=5]="RESOURCE_URL",e})(ze||{});function zd(e){let t=Ey();return t?rm(t.sanitize(ze.HTML,e)||""):Yt(e,"HTML")?rm(Ue(e)):Vu(ry(),vn(e))}function W_(e){let t=Ey();return t?t.sanitize(ze.URL,e)||"":Yt(e,"URL")?Ue(e):Ei(vn(e))}function Ey(){let e=w();return e&&e[ot].sanitizer}function Z_(e){return e.ownerDocument.defaultView}function Y_(e){return e.ownerDocument}function Cy(e){return e instanceof Function?e():e}function Q_(e,t,n){let r=e.length;for(;;){let o=e.indexOf(t,n);if(o===-1)return o;if(o===0||e.charCodeAt(o-1)<=32){let i=t.length;if(o+i===r||e.charCodeAt(o+i)<=32)return o}n=o+1}}var _y="ng-template";function K_(e,t,n,r){let o=0;if(r){for(;o-1){let i;for(;++oi?d="":d=o[l+1].toLowerCase(),r&2&&c!==d){if(ct(r))return!1;s=!0}}}}return ct(r)||s}function ct(e){return(e&1)===0}function ew(e,t,n,r){if(t===null)return-1;let o=0;if(r||!n){let i=!1;for(;o-1)for(n++;n0?'="'+u+'"':"")+"]"}else r&8?o+="."+s:r&4&&(o+=" "+s);else o!==""&&!ct(s)&&(t+=cm(i,o),o=""),r=s,i=i||!ct(r);n++}return o!==""&&(t+=cm(i,o)),t}function sw(e){return e.map(iw).join(",")}function uw(e){let t=[],n=[],r=1,o=2;for(;r=0;i--){let s=n[i],u=s.parentNode;s===t?(n.splice(i,1),fd.add(s),s.dispatchEvent(new CustomEvent("animationend",{detail:{cancel:!0}}))):(o&&s===o||u&&r&&u!==r)&&(n.splice(i,1),s.dispatchEvent(new CustomEvent("animationend",{detail:{cancel:!0}})),s.parentNode?.removeChild(s))}}function pw(e,t){let n=dd.get(e);n?n.includes(t)||n.push(t):dd.set(e,[t])}var cr=new Set,$u=(function(e){return e[e.CHANGE_DETECTION=0]="CHANGE_DETECTION",e[e.AFTER_NEXT_RENDER=1]="AFTER_NEXT_RENDER",e})($u||{}),ft=new x(""),lm=new Set;function Nt(e){lm.has(e)||(lm.add(e),performance?.mark?.("mark_feature_usage",{detail:{feature:e}}))}var Uu=(()=>{class e{impl=null;execute(){this.impl?.execute()}static \u0275prov=T({token:e,providedIn:"root",factory:()=>new e})}return e})(),Qd=[0,1,2,3],Kd=(()=>{class e{ngZone=b(Ce);scheduler=b(wt);errorHandler=b(We,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){b(ft,{optional:!0})}execute(){let n=this.sequences.size>0;n&&Y(q.AfterRenderHooksStart),this.executing=!0;for(let r of Qd)for(let o of this.sequences)if(!(o.erroredOrDestroyed||!o.hooks[r]))try{o.pipelinedValue=this.ngZone.runOutsideAngular(()=>this.maybeTrace(()=>{let i=o.hooks[r];return i(o.pipelinedValue)},o.snapshot))}catch(i){o.erroredOrDestroyed=!0,this.errorHandler?.handleError(i)}this.executing=!1;for(let r of this.sequences)r.afterRun(),r.once&&(this.sequences.delete(r),r.destroy());for(let r of this.deferredRegistrations)this.sequences.add(r);this.deferredRegistrations.size>0&&this.scheduler.notify(7),this.deferredRegistrations.clear(),n&&Y(q.AfterRenderHooksEnd)}register(n){let{view:r}=n;r!==void 0?((r[Xn]??=[]).push(n),nr(r),r[L]|=8192):this.executing?this.deferredRegistrations.add(n):this.addSequence(n)}addSequence(n){this.sequences.add(n),this.scheduler.notify(7)}unregister(n){this.executing&&this.sequences.has(n)?(n.erroredOrDestroyed=!0,n.pipelinedValue=void 0,n.once=!0):(this.sequences.delete(n),this.deferredRegistrations.delete(n))}maybeTrace(n,r){return r?r.run($u.AFTER_NEXT_RENDER,n):n()}static \u0275prov=T({token:e,providedIn:"root",factory:()=>new e})}return e})(),pi=class{impl;hooks;view;once;snapshot;erroredOrDestroyed=!1;pipelinedValue=void 0;unregisterOnDestroy;constructor(t,n,r,o,i,s=null){this.impl=t,this.hooks=n,this.view=r,this.once=o,this.snapshot=s,this.unregisterOnDestroy=i?.onDestroy(()=>this.destroy())}afterRun(){this.erroredOrDestroyed=!1,this.pipelinedValue=void 0,this.snapshot?.dispose(),this.snapshot=null}destroy(){this.impl.unregister(this),this.unregisterOnDestroy?.();let t=this.view?.[Xn];t&&(this.view[Xn]=t.filter(n=>n!==this))}};function hw(e,t){let n=t?.injector??b(me);return Nt("NgAfterNextRender"),mw(e,n,t,!0)}function gw(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function mw(e,t,n,r){let o=t.get(Uu);o.impl??=t.get(Kd);let i=t.get(ft,null,{optional:!0}),s=n?.manualCleanup!==!0?t.get($e):null,u=t.get(Yr,null,{optional:!0}),a=new pi(o.impl,gw(e),u?.view,r,s,i?.snapshot(null));return o.impl.register(a),a}var Sy=new x("",{factory:()=>({queue:new Set,isScheduled:!1,scheduler:null,injector:b(Ae)})});function My(e,t,n){let r=e.get(Sy);if(Array.isArray(t))for(let o of t)r.queue.add(o),n?.detachedLeaveAnimationFns?.push(o);else r.queue.add(t),n?.detachedLeaveAnimationFns?.push(t);r.scheduler&&r.scheduler(e)}function yw(e,t){let n=e.get(Sy);if(t.detachedLeaveAnimationFns){for(let r of t.detachedLeaveAnimationFns)n.queue.delete(r);t.detachedLeaveAnimationFns=void 0}}function bw(e,t){for(let[n,r]of t)My(e,r.animateFns)}function dm(e,t,n,r){let o=e?.[En]?.enter;t!==null&&o&&o.has(n.index)&&bw(r,o)}function Qr(e,t,n,r,o,i,s,u){if(o!=null){let a,c=!1;it(o)?a=o:qt(o)&&(c=!0,o=o[rt]);let l=Ye(o);e===0&&r!==null?(dm(u,r,i,n),s==null?by(t,r,l):Eu(t,r,l,s||null,!0)):e===1&&r!==null?(dm(u,r,i,n),Eu(t,r,l,s||null,!0),fw(i,l)):e===2?(u?.[En]?.leave?.has(i.index)&&pw(i,l),fm(u,i,n,d=>{if(fd.has(l)){fd.delete(l);return}vy(t,l,c,d)})):e===3&&fm(u,i,n,()=>{t.destroyNode(l)}),a!=null&&Mw(t,e,n,a,i,r,s)}}function vw(e,t){Ay(e,t),t[rt]=null,t[Ne]=null}function Dw(e,t,n,r,o,i){r[rt]=o,r[Ne]=t,qu(e,r,n,1,o,i)}function Ay(e,t){t[ot].changeDetectionScheduler?.notify(9),qu(e,t,t[Z],2,null,null)}function Ew(e){let t=e[qr];if(!t)return $l(e[S],e);for(;t;){let n=null;if(qt(t))n=t[qr];else{let r=t[oe];r&&(n=r)}if(!n){for(;t&&!t[Ze]&&t!==e;)qt(t)&&$l(t[S],t),t=t[de];t===null&&(t=e),qt(t)&&$l(t[S],t),n=t&&t[Ze]}t=n}}function Jd(e,t){let n=e[er],r=n.indexOf(t);n.splice(r,1)}function zu(e,t){if(tr(t))return;let n=t[Z];n.destroyNode&&qu(e,t,n,3,null,null),Ew(t)}function $l(e,t){if(tr(t))return;let n=I(null);try{t[L]&=-129,t[L]|=256,t[Be]&&dn(t[Be]),ww(e,t),_w(e,t),t[S].type===1&&t[Z].destroy();let r=t[Dn];if(r!==null&&it(t[de])){r!==t[de]&&Jd(r,t);let o=t[St];o!==null&&o.detachView(e)}ed(t)}finally{I(n)}}function fm(e,t,n,r){let o=e?.[En];if(o==null||o.leave==null||!o.leave.has(t.index))return r(!1);e&&cr.add(e[zt]),My(n,()=>{if(o.leave&&o.leave.has(t.index)){let s=o.leave.get(t.index),u=[];if(s){for(let a=0;a{e[En].running=void 0,cr.delete(e[zt]),t(!0)});return}t(!1)}function _w(e,t){let n=e.cleanup,r=t[zr];if(n!==null)for(let s=0;s=0?r[u]():r[-u].unsubscribe(),s+=2}else{let u=r[n[s+1]];n[s].call(u)}r!==null&&(t[zr]=null);let o=t[$t];if(o!==null){t[$t]=null;for(let s=0;sK&&Ty(e,t,K,!1);let u=s?q.TemplateUpdateStart:q.TemplateCreateStart;Y(u,o,n),n(r,o)}finally{_n(i);let u=s?q.TemplateUpdateEnd:q.TemplateCreateEnd;Y(u,o,n)}}function Gu(e,t,n){Ow(e,t,n),(n.flags&64)===64&&Pw(e,t,n)}function _i(e,t,n=Qe){let r=t.localNames;if(r!==null){let o=t.index+1;for(let i=0;inull;function Fw(e){return e==="class"?"className":e==="for"?"htmlFor":e==="formaction"?"formAction":e==="innerHtml"?"innerHTML":e==="readonly"?"readOnly":e==="tabindex"?"tabIndex":e}function Py(e,t,n,r,o,i){let s=t[S];if(Wu(e,s,t,n,r)){Mt(e)&&jy(t,e.index);return}e.type&3&&(n=Fw(n)),Ly(e,t,n,r,o,i)}function Ly(e,t,n,r,o,i){if(e.type&3){let s=Qe(e,t);r=i!=null?i(r,e.value||"",n):r,o.setProperty(s,n,r)}else e.type&12}function jy(e,t){let n=Ve(t,e);n[L]&16||(n[L]|=64)}function Ow(e,t,n){let r=n.directiveStart,o=n.directiveEnd;Mt(n)&&lw(t,n,e.data[r+n.componentOffset]),e.firstCreatePass||vu(n,t);let i=n.initialInputs;for(let s=r;s=u&&f<=a){let p=t.data[f],m=d[h+1];In(p,n[f],m,i),c=!0}else if(f>a)break}}return s!==null&&r.inputs.hasOwnProperty(o)&&(In(r,n[s],o,i),c=!0),c}function $w(e,t){let n=Ve(t,e),r=n[S];Uw(r,n);let o=n[rt];o!==null&&n[Qn]===null&&(n[Qn]=cy(o,n[Ut])),Y(q.ComponentStart);try{of(r,n,n[re])}finally{Y(q.ComponentEnd,n[re])}}function Uw(e,t){for(let n=t.length;n{nr(e.lView)},consumerOnSignalRead(){this.lView[Be]=this}});function Yw(e){let t=e[Be]??Object.create(Qw);return t.lView=e,t}var Qw=P(M({},an),{consumerIsAlwaysLive:!0,kind:"template",consumerMarkedDirty:e=>{let t=bn(e.lView);for(;t&&!Uy(t[S]);)t=bn(t);t&&Dl(t)},consumerOnSignalRead(){this.lView[Be]=this}});function Uy(e){return e.type!==2}function zy(e){if(e[yn]===null)return;let t=!0;for(;t;){let n=!1;for(let r of e[yn])r.dirty&&(n=!0,r.zone===null||Zone.current===r.zone?r.run():r.zone.run(()=>r.run()));t=n&&!!(e[L]&8192)}}var Kw=100;function qy(e,t=0){let r=e[ot].rendererFactory,o=!1;o||r.begin?.();try{Jw(e,t)}finally{o||r.end?.()}}function Jw(e,t){let n=kl();try{Go(!0),hd(e,t);let r=0;for(;ri(e);){if(r===Kw)throw new D(103,!1);r++,hd(e,1)}}finally{Go(n)}}function Xw(e,t,n,r){if(tr(t))return;let o=t[L],i=!1,s=!1;ru(t);let u=!0,a=null,c=null;i||(Uy(e)?(c=qw(t),a=Lt(c)):ns()===null?(u=!1,c=Yw(t),a=Lt(c)):t[Be]&&(dn(t[Be]),t[Be]=null));try{vl(t),Ng(e.bindingStartIndex),n!==null&&Oy(e,t,n,2,r);let l=(o&3)===3;if(!i)if(l){let f=e.preOrderCheckHooks;f!==null&&du(t,f,null)}else{let f=e.preOrderHooks;f!==null&&fu(t,f,0,null),Vl(t,0)}if(s||ex(t),zy(t),Gy(t,0),e.contentQueries!==null&&ly(e,t),!i)if(l){let f=e.contentCheckHooks;f!==null&&du(t,f)}else{let f=e.contentHooks;f!==null&&fu(t,f,1),Vl(t,1)}nx(e,t);let d=e.components;d!==null&&Zy(t,d,0);let h=e.viewQuery;if(h!==null&&nd(2,h,r),!i)if(l){let f=e.viewCheckHooks;f!==null&&du(t,f)}else{let f=e.viewHooks;f!==null&&fu(t,f,2),Vl(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[Ys]){for(let f of t[Ys])f();t[Ys]=null}i||(Hy(t),t[L]&=-73)}catch(l){throw i||nr(t),l}finally{c!==null&&(ln(c,a),u&&Ww(c)),ou()}}function Gy(e,t){for(let n=ey(e);n!==null;n=ty(n))for(let r=oe;r0&&(e[n-1][Ze]=r[Ze]);let i=Ko(e,oe+t);vw(r[S],r);let s=i[St];s!==null&&s.detachView(i[S]),r[de]=null,r[Ze]=null,r[L]&=-129}return r}function rx(e,t,n,r){let o=oe+r,i=n.length;r>0&&(n[o-1][Ze]=t),r-1&&(gi(t,r),Ko(n,r))}this._attachedToViewContainer=!1}zu(this._lView[S],this._lView)}onDestroy(t){El(this._lView,t)}markForCheck(){Zu(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[L]&=-129}reattach(){Js(this._lView),this._lView[L]|=128}detectChanges(){this._lView[L]|=1024,qy(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new D(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let t=Wr(this._lView),n=this._lView[Dn];n!==null&&!t&&Jd(n,this._lView),Ay(this._lView[S],this._lView)}attachToAppRef(t){if(this._attachedToViewContainer)throw new D(902,!1);this._appRef=t;let n=Wr(this._lView),r=this._lView[Dn];r!==null&&!n&&Jy(r,this._lView),Js(this._lView)}};var Sn=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=ox;constructor(n,r,o){this._declarationLView=n,this._declarationTContainer=r,this.elementRef=o}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(n,r){return this.createEmbeddedViewImpl(n,r)}createEmbeddedViewImpl(n,r,o){let i=wi(this._declarationLView,this._declarationTContainer,n,{embeddedViewInjector:r,dehydratedView:o});return new Tn(i)}}return e})();function ox(){return Yu(ue(),w())}function Yu(e,t){return e.type&4?new Sn(t,e,oo(e,t)):null}function gr(e,t,n,r,o){let i=e.data[t];if(i===null)i=ix(e,t,n,r,o),kg()&&(i.flags|=32);else if(i.type&64){i.type=n,i.value=r,i.attrs=o;let s=Mg();i.injectorIndex=s===null?-1:s.injectorIndex}return rr(i,!0),i}function ix(e,t,n,r,o){let i=Sl(),s=Ml(),u=s?i:i&&i.parent,a=e.data[t]=ux(e,u,n,t,r,o);return sx(e,a,i,s),a}function sx(e,t,n,r){e.firstChild===null&&(e.firstChild=t),n!==null&&(r?n.child==null&&t.parent!==null&&(n.child=t):n.next===null&&(n.next=t,t.prev=n))}function ux(e,t,n,r,o,i){let s=t?t.injectorIndex:-1,u=0;return xl()&&(u|=128),{type:n,index:r,insertBeforeIndex:null,injectorIndex:s,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,componentOffset:-1,controlDirectiveIndex:-1,customControlIndex:-1,propertyBindings:null,flags:u,providerIndexes:0,value:o,attrs:i,mergedAttrs:null,localNames:null,initialInputs:null,inputs:null,hostDirectiveInputs:null,outputs:null,hostDirectiveOutputs:null,directiveToIndex:null,tView:null,next:null,prev:null,projectionNext:null,child:null,parent:t,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}function ax(e){let t=e[gl]??[],r=e[de][Z],o=[];for(let i of t)i.data[iy]!==void 0?o.push(i):cx(i,r);e[gl]=o}function cx(e,t){let n=0,r=e.firstChild;if(r){let o=e.data[oy];for(;nnull,dx=()=>null;function Cu(e,t){return lx(e,t)}function Xy(e,t,n){return dx(e,t,n)}var eb=class{},Qu=class{},gd=class{resolveComponentFactory(t){throw new D(917,!1)}},Ii=class{static NULL=new gd},lr=class{},Ti=(()=>{class e{destroyNode=null;static __NG_ELEMENT_ID__=()=>fx()}return e})();function fx(){let e=w(),t=ue(),n=Ve(t.index,e);return(qt(n)?n:e)[Z]}var tb=(()=>{class e{static \u0275prov=T({token:e,providedIn:"root",factory:()=>null})}return e})();var hu={},md=class{injector;parentInjector;constructor(t,n){this.injector=t,this.parentInjector=n}get(t,n,r){let o=this.injector.get(t,hu,r);return o!==hu||n===hu?o:this.parentInjector.get(t,n,r)}};function _u(e,t,n){let r=n?e.styles:null,o=n?e.classes:null,i=0;if(t!==null)for(let s=0;s0&&(n.directiveToIndex=new Map);for(let h=0;h0;){let n=e[--t];if(typeof n=="number"&&n<0)return n}return 0}function Ex(e,t,n){if(n){if(t.exportAs)for(let r=0;rr(Ye(m[e.index])):e.index;sb(p,t,n,i,u,f,!1)}}return c}function xx(e){return e.startsWith("animation")||e.startsWith("transition")}function Ix(e,t,n,r){let o=e.cleanup;if(o!=null)for(let i=0;ia?u[a]:null}typeof s=="string"&&(i+=2)}return null}function sb(e,t,n,r,o,i,s){let u=t.firstCreatePass?_l(t):null,a=Cl(n),c=a.length;a.push(o,i),u&&u.push(r,e,c,(c+1)*(s?-1:1))}function wu(e,t,n,r,o,i){let s=t[n],u=t[S],c=u.data[n].outputs[r],d=s[c].subscribe(i);sb(e.index,u,t,o,i,d,!0)}function Tx(){let e=w(),t=G(),n=ue();if(t.firstCreatePass&&Mx(t,n),n.controlDirectiveIndex===-1)return;Nt("NgSignalForms");let r=e[n.controlDirectiveIndex];t.data[n.controlDirectiveIndex].controlDef.create(r,new xu(e,t,n))}function Sx(){let e=w(),t=G(),n=wn();if(n.controlDirectiveIndex===-1)return;let r=t.data[n.controlDirectiveIndex].controlDef,o=e[n.controlDirectiveIndex];r.update(o,new xu(e,t,n))}var xu=class{lView;tView;tNode;hasPassThrough;constructor(t,n,r){this.lView=t,this.tView=n,this.tNode=r,this.hasPassThrough=!!(r.flags&4096)}get customControl(){return this.tNode.customControlIndex!==-1?this.lView[this.tNode.customControlIndex]:void 0}get descriptor(){return`<${this.tNode.value}>`}listenToCustomControlOutput(t,n){ub(this.tView.data[this.tNode.customControlIndex],t)&&wu(this.tNode,this.lView,this.tNode.customControlIndex,t,t,ur(this.tNode,this.lView,n))}listenToCustomControlModel(t){let n=this.tNode.flags&1024?"valueChange":"checkedChange";wu(this.tNode,this.lView,this.tNode.customControlIndex,n,n,ur(this.tNode,this.lView,t))}listenToDom(t,n){lf(this.tNode,this.tView,this.lView,void 0,this.lView[Z],t,n,ur(this.tNode,this.lView,n))}setInputOnDirectives(t,n){let r=this.tNode.inputs?.[t],o=this.tNode.hostDirectiveInputs?.[t];if(!r&&!o)return!1;if(r)for(let i of r){let s=this.tView.data[i],u=this.lView[i];In(s,u,t,n)}if(o)for(let i=0;i1){t.flags|=4096;return}Ax(e,t)}function Ax(e,t){for(let n=t.directiveStart;n{Tx()},update:()=>{Dm(r.targetIdx,e,t()),Sx()}};return r}let n={[mi]:vm,update:()=>Dm(n.targetIdx,e,t())};return n}function ab(e){return e.debugInfo?.className||e.type.name||null}var Iu=class extends Ii{ngModule;constructor(t){super(),this.ngModule=t}resolveComponentFactory(t){let n=Tt(t);return new Mn(n,this.ngModule)}};function kx(e){return Object.keys(e).map(t=>{let[n,r,o]=e[t],i={propName:n,templateName:t,isSignal:(r&Hu.SignalBased)!==0};return o&&(i.transform=o),i})}function Rx(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function Fx(e,t,n){let r=t instanceof Ae?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new md(n,r):n}function Ox(e){let t=e.get(lr,null);if(t===null)throw new D(407,!1);let n=e.get(tb,null),r=e.get(wt,null),o=e.get(ft,null,{optional:!0});return{rendererFactory:t,sanitizer:n,changeDetectionScheduler:r,ngReflect:!1,tracingService:o}}function Px(e,t){let n=cb(e);return yy(t,n,n==="svg"?yl:n==="math"?vg:null)}function cb(e){return(e.selectors[0][0]||"div").toLowerCase()}var Mn=class extends Qu{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=kx(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=Rx(this.componentDef.outputs),this.cachedOutputs}constructor(t,n){super(),this.componentDef=t,this.ngModule=n,this.componentType=t.type,this.selector=sw(t.selectors),this.ngContentSelectors=t.ngContentSelectors??[],this.isBoundToModule=!!n}create(t,n,r,o,i,s){Y(q.DynamicComponentStart);let u=I(null);try{let a=this.componentDef,c=Fx(a,o||this.ngModule,t),l=Ox(c),d=l.tracingService;return d&&d.componentCreate?d.componentCreate(ab(a),()=>this.createComponentRef(l,c,n,r,i,s)):this.createComponentRef(l,c,n,r,i,s)}finally{I(u)}}createComponentRef(t,n,r,o,i,s){let u=this.componentDef,a=Lx(o,u,s,i),c=t.rendererFactory.createRenderer(null,u),l=o?Nw(c,o,u.encapsulation,n):Px(u,c),d=s?.some(Em)||i?.some(p=>typeof p!="function"&&p.bindings.some(Em)),h=Wd(null,a,null,512|xy(u),null,null,t,c,n,null,cy(l,n,!0));h[K]=l,ru(h);let f=null;try{let p=sf(K,h,2,"#host",()=>a.directiveRegistry,!0,0);Dy(c,l,p),Xr(l,h),Gu(a,h,p),jd(a,p,h),uf(a,p),r!==void 0&&Bx(p,this.ngContentSelectors,r),f=Ve(p.index,h),h[re]=f[re],of(a,h,null)}catch(p){throw f!==null&&ed(f),ed(h),p}finally{Y(q.DynamicComponentEnd),ou()}return new Tu(this.componentType,h,!!d)}};function Lx(e,t,n,r){let o=e?["ng-version","21.2.4"]:uw(t.selectors[0]),i=null,s=null,u=0;if(n)for(let l of n)u+=l[mi].requiredVars,l.create&&(l.targetIdx=0,(i??=[]).push(l)),l.update&&(l.targetIdx=0,(s??=[]).push(l));if(r)for(let l=0;l{if(n&1&&e)for(let r of e)r.create();if(n&2&&t)for(let r of t)r.update()}}function Em(e){let t=e[mi].kind;return t==="input"||t==="twoWay"}var Tu=class extends eb{_rootLView;_hasInputBindings;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(t,n,r){super(),this._rootLView=n,this._hasInputBindings=r,this._tNode=Qs(n[S],K),this.location=oo(this._tNode,n),this.instance=Ve(this._tNode.index,n)[re],this.hostView=this.changeDetectorRef=new Tn(n,void 0),this.componentType=t}setInput(t,n){this._hasInputBindings;let r=this._tNode;if(this.previousInputValues??=new Map,this.previousInputValues.has(t)&&Object.is(this.previousInputValues.get(t),n))return;let o=this._rootLView,i=Wu(r,o[S],o,t,n);this.previousInputValues.set(t,n);let s=Ve(r.index,o);Zu(s,1)}get injector(){return new sr(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(t){this.hostView.onDestroy(t)}};function Bx(e,t,n){let r=e.projection=[];for(let o=0;o{class e{static __NG_ELEMENT_ID__=Vx}return e})();function Vx(){let e=ue();return lb(e,w())}var yd=class e extends pt{_lContainer;_hostTNode;_hostLView;constructor(t,n,r){super(),this._lContainer=t,this._hostTNode=n,this._hostLView=r}get element(){return oo(this._hostTNode,this._hostLView)}get injector(){return new sr(this._hostTNode,this._hostLView)}get parentInjector(){let t=Fd(this._hostTNode,this._hostLView);if($m(t)){let n=yu(t,this._hostLView),r=mu(t),o=n[S].data[r+8];return new sr(o,n)}else return new sr(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(t){let n=Cm(this._lContainer);return n!==null&&n[t]||null}get length(){return this._lContainer.length-oe}createEmbeddedView(t,n,r){let o,i;typeof r=="number"?o=r:r!=null&&(o=r.index,i=r.injector);let s=Cu(this._lContainer,t.ssrId),u=t.createEmbeddedViewImpl(n||{},i,s);return this.insertImpl(u,o,eo(this._hostTNode,s)),u}createComponent(t,n,r,o,i,s,u){let a=t&&!qC(t),c;if(a)c=n;else{let g=n||{};c=g.index,r=g.injector,o=g.projectableNodes,i=g.environmentInjector||g.ngModuleRef,s=g.directives,u=g.bindings}let l=a?t:new Mn(Tt(t)),d=r||this.parentInjector;if(!i&&l.ngModule==null){let y=(a?d:this.parentInjector).get(Ae,null);y&&(i=y)}let h=Tt(l.componentType??{}),f=Cu(this._lContainer,h?.id??null),p=f?.firstChild??null,m=l.create(d,o,p,i,s,u);return this.insertImpl(m.hostView,c,eo(this._hostTNode,f)),m}insert(t,n){return this.insertImpl(t,n,!0)}insertImpl(t,n,r){let o=t._lView;if(Eg(o)){let u=this.indexOf(t);if(u!==-1)this.detach(u);else{let a=o[de],c=new e(a,a[Ne],a[de]);c.detach(c.indexOf(t))}}let i=this._adjustIndex(n),s=this._lContainer;return xi(s,o,i,r),t.attachToViewContainerRef(),ul(Ul(s),i,t),t}move(t,n){return this.insert(t,n)}indexOf(t){let n=Cm(this._lContainer);return n!==null?n.indexOf(t):-1}remove(t){let n=this._adjustIndex(t,-1),r=gi(this._lContainer,n);r&&(Ko(Ul(this._lContainer),n),zu(r[S],r))}detach(t){let n=this._adjustIndex(t,-1),r=gi(this._lContainer,n);return r&&Ko(Ul(this._lContainer),n)!=null?new Tn(r):null}_adjustIndex(t,n=0){return t??this.length+n}};function Cm(e){return e[ei]}function Ul(e){return e[ei]||(e[ei]=[])}function lb(e,t){let n,r=t[e.index];return it(r)?n=r:(n=Yy(r,t,null,e),t[e.index]=n,Zd(t,n)),$x(n,t,e,r),new yd(n,e,t)}function Hx(e,t){let n=e[Z],r=n.createComment(""),o=Qe(t,e),i=n.parentNode(o);return Eu(n,i,r,n.nextSibling(o),!1),r}var $x=qx,Ux=()=>!1;function zx(e,t,n){return Ux(e,t,n)}function qx(e,t,n,r){if(e[Cn])return;let o;n.type&8?o=Ye(r):o=Hx(t,n),e[Cn]=o}var bd=class e{queryList;matches=null;constructor(t){this.queryList=t}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},vd=class e{queries;constructor(t=[]){this.queries=t}createEmbeddedView(t){let n=t.queries;if(n!==null){let r=t.contentQueries!==null?t.contentQueries[0]:n.length,o=[];for(let i=0;i0)r.push(s[u/2]);else{let c=i[u+1],l=t[-a];for(let d=oe;dt.trim())}function gb(e,t,n){e.queries===null&&(e.queries=new Dd),e.queries.track(new Ed(t,n))}function Kx(e,t){let n=e.contentQueries||(e.contentQueries=[]),r=n.length?n[n.length-1]:-1;t!==r&&n.push(e.queries.length-1,t)}function ff(e,t){return e.queries.getByIndex(t)}function mb(e,t){let n=e[S],r=ff(n,t);return r.crossesNgTemplate?Cd(n,e,t,[]):db(n,e,r,t)}function pf(e,t,n){let r,o=Fo(()=>{r._dirtyCounter();let i=Jx(r,e);if(t&&i===void 0)throw new D(-951,!1);return i});return r=o[se],r._dirtyCounter=xn(0),r._flatValue=void 0,o}function hf(e){return pf(!0,!1,e)}function gf(e){return pf(!0,!0,e)}function yb(e){return pf(!1,!1,e)}function bb(e,t){let n=e[se];n._lView=w(),n._queryIndex=t,n._queryList=df(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(r=>r+1))}function Jx(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[L]&4)return t?void 0:Ee;let o=df(n,r),i=mb(n,r);return o.reset(i,Km),t?o.first:o._changesDetected||e._flatValue===void 0?e._flatValue=o.toArray():e._flatValue}var An=class{},vb=class{};function mf(e,t){return new yi(e,t??null,[])}var yi=class extends An{ngModuleType;_parent;_bootstrapComponents=[];_r3Injector;instance;destroyCbs=[];componentFactoryResolver=new Iu(this);constructor(t,n,r,o=!0){super(),this.ngModuleType=t,this._parent=n;let i=ol(t);this._bootstrapComponents=Cy(i.bootstrap),this._r3Injector=Ol(t,n,[{provide:An,useValue:this},{provide:Ii,useValue:this.componentFactoryResolver},...r],Yo(t),new Set(["environment"])),o&&this.resolveInjectorInitializers()}resolveInjectorInitializers(){this._r3Injector.resolveInjectorInitializers(),this.instance=this._r3Injector.get(this.ngModuleType)}get injector(){return this._r3Injector}destroy(){let t=this._r3Injector;!t.destroyed&&t.destroy(),this.destroyCbs.forEach(n=>n()),this.destroyCbs=null}onDestroy(t){this.destroyCbs.push(t)}},Mu=class extends vb{moduleType;constructor(t){super(),this.moduleType=t}create(t){return new yi(this.moduleType,t,[])}};var bi=class extends An{injector;componentFactoryResolver=new Iu(this);instance=null;constructor(t){super();let n=new Wn([...t.providers,{provide:An,useValue:this},{provide:Ii,useValue:this.componentFactoryResolver}],t.parent||$r(),t.debugName,new Set(["environment"]));this.injector=n,t.runEnvironmentInitializers&&n.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(t){this.injector.onDestroy(t)}};function Db(e,t,n=null){return new bi({providers:e,parent:t,debugName:n,runEnvironmentInitializers:!0}).injector}var Xx=(()=>{class e{_injector;cachedInjectors=new Map;constructor(n){this._injector=n}getOrCreateStandaloneInjector(n){if(!n.standalone)return null;if(!this.cachedInjectors.has(n)){let r=ll(!1,n.type),o=r.length>0?Db([r],this._injector,""):null;this.cachedInjectors.set(n,o)}return this.cachedInjectors.get(n)}ngOnDestroy(){try{for(let n of this.cachedInjectors.values())n!==null&&n.destroy()}finally{this.cachedInjectors.clear()}}static \u0275prov=T({token:e,providedIn:"environment",factory:()=>new e(A(Ae))})}return e})();function so(e){return Di(()=>{let t=Eb(e),n=P(M({},t),{decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection===Pd.OnPush,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?o=>o.get(Xx).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||lt.Emulated,styles:e.styles||Ee,_:null,schemas:e.schemas||null,tView:null,id:""});t.standalone&&Nt("NgStandalone"),Cb(n);let r=e.dependencies;return n.directiveDefs=_m(r,eI),n.pipeDefs=_m(r,sg),n.id=rI(n),n})}function eI(e){return Tt(e)||Us(e)}function Kt(e){return Di(()=>({type:e.type,bootstrap:e.bootstrap||Ee,declarations:e.declarations||Ee,imports:e.imports||Ee,exports:e.exports||Ee,transitiveCompileScopes:null,schemas:e.schemas||null,id:e.id||null}))}function tI(e,t){if(e==null)return nt;let n={};for(let r in e)if(e.hasOwnProperty(r)){let o=e[r],i,s,u,a;Array.isArray(o)?(u=o[0],i=o[1],s=o[2]??i,a=o[3]||null):(i=o,s=o,u=Hu.None,a=null),n[i]=[r,u,a],t[i]=s}return n}function nI(e){if(e==null)return nt;let t={};for(let n in e)e.hasOwnProperty(n)&&(t[e[n]]=n);return t}function ht(e){return Di(()=>{let t=Eb(e);return Cb(t),t})}function uo(e){return{type:e.type,name:e.name,factory:null,pure:e.pure!==!1,standalone:e.standalone??!0,onDestroy:e.type.prototype.ngOnDestroy||null}}function Eb(e){let t={};return{type:e.type,providersResolver:null,viewProvidersResolver:null,factory:null,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:t,inputConfig:e.inputs||nt,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||Ee,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,inputs:tI(e.inputs,t),outputs:nI(e.outputs),debugInfo:null}}function Cb(e){e.features?.forEach(t=>t(e))}function _m(e,t){return e?()=>{let n=typeof e=="function"?e():e,r=[];for(let o of n){let i=t(o);i!==null&&r.push(i)}return r}:null}function rI(e){let t=0,n=typeof e.consts=="function"?"":e.consts,r=[e.selectors,e.ngContentSelectors,e.hostVars,e.hostAttrs,n,e.vars,e.decls,e.encapsulation,e.standalone,e.signals,e.exportAs,JSON.stringify(e.inputs),JSON.stringify(e.outputs),Object.getOwnPropertyNames(e.type.prototype),!!e.contentQueries,!!e.viewQuery];for(let i of r.join("|"))t=Math.imul(31,t)+i.charCodeAt(0)<<0;return t+=2147483648,"c"+t}function oI(e){let t=n=>{let r=Array.isArray(e);n.hostDirectives===null?(n.resolveHostDirectives=iI,n.hostDirectives=r?e.map(_d):[e]):r?n.hostDirectives.unshift(...e.map(_d)):n.hostDirectives.unshift(e)};return t.ngInherit=!0,t}function iI(e){let t=[],n=!1,r=null,o=null;for(let i=0;i=0;r--){let o=e[r];o.hostVars=t+=o.hostVars,o.hostAttrs=Jr(o.hostAttrs,n=Jr(n,o.hostAttrs))}}function zl(e){return e===nt?{}:e===Ee?[]:e}function lI(e,t){let n=e.viewQuery;n?e.viewQuery=(r,o)=>{t(r,o),n(r,o)}:e.viewQuery=t}function dI(e,t){let n=e.contentQueries;n?e.contentQueries=(r,o,i)=>{t(r,o,i),n(r,o,i)}:e.contentQueries=t}function fI(e,t){let n=e.hostBindings;n?e.hostBindings=(r,o)=>{t(r,o),n(r,o)}:e.hostBindings=t}function wb(e,t,n,r,o,i,s,u){if(n.firstCreatePass){e.mergedAttrs=Jr(e.mergedAttrs,e.attrs);let l=e.tView=Gd(2,e,o,i,s,n.directiveRegistry,n.pipeRegistry,null,n.schemas,n.consts,null);n.queries!==null&&(n.queries.template(n,e),l.queries=n.queries.embeddedTView(e))}u&&(e.flags|=u),rr(e,!1);let a=hI(n,t,e,r);iu()&&Xd(n,t,a,e),Xr(a,t);let c=Yy(a,t,a,e);t[r+K]=c,Zd(t,c),zx(c,e,t)}function pI(e,t,n,r,o,i,s,u,a,c,l){let d=n+K,h;return t.firstCreatePass?(h=gr(t,d,4,s||null,u||null),Xs()&&nb(t,e,h,He(t.consts,c),tf),Bm(t,h)):h=t.data[d],wb(h,e,t,n,r,o,i,a),Gr(h)&&Gu(t,e,h),c!=null&&_i(e,h,l),h}function to(e,t,n,r,o,i,s,u,a,c,l){let d=n+K,h;if(t.firstCreatePass){if(h=gr(t,d,4,s||null,u||null),c!=null){let f=He(t.consts,c);h.localNames=[];for(let p=0;p{class e{log(n){console.log(n)}warn(n){console.warn(n)}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"platform"})}return e})();function yf(e){return typeof e=="function"&&e[se]!==void 0}function bf(e){return yf(e)&&typeof e.set=="function"}var Ju=new x(""),Xu=new x(""),Si=(()=>{class e{_ngZone;registry;_isZoneStable=!0;_callbacks=[];_taskTrackingZone=null;_destroyRef;constructor(n,r,o){this._ngZone=n,this.registry=r,Zs()&&(this._destroyRef=b($e,{optional:!0})??void 0),vf||(Mb(o),o.addToWindow(r)),this._watchAngularEvents(),n.run(()=>{this._taskTrackingZone=typeof Zone>"u"?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){let n=this._ngZone.onUnstable.subscribe({next:()=>{this._isZoneStable=!1}}),r=this._ngZone.runOutsideAngular(()=>this._ngZone.onStable.subscribe({next:()=>{Ce.assertNotInAngularZone(),queueMicrotask(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}}));this._destroyRef?.onDestroy(()=>{n.unsubscribe(),r.unsubscribe()})}isStable(){return this._isZoneStable&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())queueMicrotask(()=>{for(;this._callbacks.length!==0;){let n=this._callbacks.pop();clearTimeout(n.timeoutId),n.doneCb()}});else{let n=this.getPendingTasks();this._callbacks=this._callbacks.filter(r=>r.updateCb&&r.updateCb(n)?(clearTimeout(r.timeoutId),!1):!0)}}getPendingTasks(){return this._taskTrackingZone?this._taskTrackingZone.macroTasks.map(n=>({source:n.source,creationLocation:n.creationLocation,data:n.data})):[]}addCallback(n,r,o){let i=-1;r&&r>0&&(i=setTimeout(()=>{this._callbacks=this._callbacks.filter(s=>s.timeoutId!==i),n()},r)),this._callbacks.push({doneCb:n,timeoutId:i,updateCb:o})}whenStable(n,r,o){if(o&&!this._taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(n,r,o),this._runCallbacksIfReady()}registerApplication(n){this.registry.registerApplication(n,this)}unregisterApplication(n){this.registry.unregisterApplication(n)}findProviders(n,r,o){return[]}static \u0275fac=function(r){return new(r||e)(A(Ce),A(Sb),A(Xu))};static \u0275prov=T({token:e,factory:e.\u0275fac})}return e})(),Sb=(()=>{class e{_applications=new Map;registerApplication(n,r){this._applications.set(n,r)}unregisterApplication(n){this._applications.delete(n)}unregisterAllApplications(){this._applications.clear()}getTestability(n){return this._applications.get(n)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(n,r=!0){return vf?.findTestabilityInTree(this,n,r)??null}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"platform"})}return e})();function Mb(e){vf=e}var vf;function Mi(e){return!!e&&typeof e.then=="function"}function ea(e){return!!e&&typeof e.subscribe=="function"}var Df=new x("");function mI(e){return Yn([{provide:Df,multi:!0,useValue:e}])}var Ef=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((n,r)=>{this.resolve=n,this.reject=r});appInits=b(Df,{optional:!0})??[];injector=b(me);constructor(){}runInitializers(){if(this.initialized)return;let n=[];for(let o of this.appInits){let i=Ur(this.injector,o);if(Mi(i))n.push(i);else if(ea(i)){let s=new Promise((u,a)=>{i.subscribe({complete:u,error:a})});n.push(s)}}let r=()=>{this.done=!0,this.resolve()};Promise.all(n).then(()=>{r()}).catch(o=>{this.reject(o)}),n.length===0&&r(),this.initialized=!0}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),Ab=new x("");function Nb(){hc(()=>{let e="";throw new D(600,e)})}function kb(e){return e.isBoundToModule}var yI=10;var co=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=b(Gt);afterRenderManager=b(Uu);zonelessEnabled=b(ui);rootEffectScheduler=b(su);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new he;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=b(or);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(Se(n=>!n))}constructor(){b(ft,{optional:!0})}whenStable(){let n;return new Promise(r=>{n=this.isStable.subscribe({next:o=>{o&&r()}})}).finally(()=>{n.unsubscribe()})}_injector=b(Ae);_rendererFactory=null;get injector(){return this._injector}bootstrap(n,r){return this.bootstrapImpl(n,r)}bootstrapImpl(n,r,o=me.NULL){return this._injector.get(Ce).run(()=>{Y(q.BootstrapComponentStart);let s=n instanceof Qu;if(!this._injector.get(Ef).done){let p="";throw new D(405,p)}let a;s?a=n:a=this._injector.get(Ii).resolveComponentFactory(n),this.componentTypes.push(a.componentType);let c=kb(a)?void 0:this._injector.get(An),l=r||a.selector,d=a.create(o,[],l,c),h=d.location.nativeElement,f=d.injector.get(Ju,null);return f?.registerApplication(h),d.onDestroy(()=>{this.detachView(d.hostView),di(this.components,d),f?.unregisterApplication(h)}),this._loadComponent(d),Y(q.BootstrapComponentEnd,d),d})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Y(q.ChangeDetectionStart),this.tracingSnapshot!==null?this.tracingSnapshot.run($u.CHANGE_DETECTION,this.tickImpl):this.tickImpl()}tickImpl=()=>{if(this._runningTick)throw Y(q.ChangeDetectionEnd),new D(101,!1);let n=I(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,I(n),this.afterTick.next(),Y(q.ChangeDetectionEnd)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get(lr,null,{optional:!0}));let n=0;for(;this.dirtyFlags!==0&&n++ri(n))){this.dirtyFlags|=2;return}else this.dirtyFlags&=-8}attachView(n){let r=n;this._views.push(r),r.attachToAppRef(this)}detachView(n){let r=n;di(this._views,r),r.detachFromAppRef()}_loadComponent(n){this.attachView(n.hostView);try{this.tick()}catch(o){this.internalErrorHandler(o)}this.components.push(n),this._injector.get(Ab,[]).forEach(o=>o(n))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(n=>n()),this._views.slice().forEach(n=>n.destroy())}finally{this._destroyed=!0,this._views=[],this._destroyListeners=[]}}onDestroy(n){return this._destroyListeners.push(n),()=>di(this._destroyListeners,n)}destroy(){if(this._destroyed)throw new D(406,!1);let n=this._injector;n.destroy&&!n.destroyed&&n.destroy()}get viewCount(){return this._views.length}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function di(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function Rb(e,t){let n=w(),r=ut();if(ke(n,r,t)){let o=G(),i=wn();if(Wu(i,o,n,e,t))Mt(i)&&jy(n,i.index);else{let u=Qe(i,n);By(n[Z],u,null,i.value,e,t,null)}}return Rb}function ta(e,t,n,r){let o=w(),i=ut();if(ke(o,i,t)){let s=G(),u=wn();jw(u,o,e,t,n,r)}return ta}function bI(){return w()[_e][re]}var wd=class{destroy(t){}updateValue(t,n){}swap(t,n){let r=Math.min(t,n),o=Math.max(t,n),i=this.detach(o);if(o-r>1){let s=this.detach(r);this.attach(r,i),this.attach(o,s)}else this.attach(r,i)}move(t,n){this.attach(n,this.detach(t))}};function ql(e,t,n,r,o){return e===n&&Object.is(t,r)?1:Object.is(o(e,t),o(n,r))?-1:0}function vI(e,t,n,r){let o,i,s=0,u=e.length-1,a=void 0;if(Array.isArray(t)){I(r);let c=t.length-1;for(I(null);s<=u&&s<=c;){let l=e.at(s),d=t[s],h=ql(s,l,s,d,n);if(h!==0){h<0&&e.updateValue(s,d),s++;continue}let f=e.at(u),p=t[c],m=ql(u,f,c,p,n);if(m!==0){m<0&&e.updateValue(u,p),u--,c--;continue}let g=n(s,l),y=n(u,f),v=n(s,d);if(Object.is(v,y)){let _=n(c,p);Object.is(_,g)?(e.swap(s,u),e.updateValue(u,p),c--,u--):e.move(u,s),e.updateValue(s,d),s++;continue}if(o??=new Au,i??=Tm(e,s,u,n),xd(e,o,s,v))e.updateValue(s,d),s++,u++;else if(i.has(v))o.set(g,e.detach(s)),u--;else{let _=e.create(s,t[s]);e.attach(s,_),s++,u++}}for(;s<=c;)Im(e,o,n,s,t[s]),s++}else if(t!=null){I(r);let c=t[Symbol.iterator]();I(null);let l=c.next();for(;!l.done&&s<=u;){let d=e.at(s),h=l.value,f=ql(s,d,s,h,n);if(f!==0)f<0&&e.updateValue(s,h),s++,l=c.next();else{o??=new Au,i??=Tm(e,s,u,n);let p=n(s,h);if(xd(e,o,s,p))e.updateValue(s,h),s++,u++,l=c.next();else if(!i.has(p))e.attach(s,e.create(s,h)),s++,u++,l=c.next();else{let m=n(s,d);o.set(m,e.detach(s)),u--}}}for(;!l.done;)Im(e,o,n,e.length,l.value),l=c.next()}for(;s<=u;)e.destroy(e.detach(u--));o?.forEach(c=>{e.destroy(c)})}function xd(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function Im(e,t,n,r,o){if(xd(e,t,r,n(r,o)))e.updateValue(r,o);else{let i=e.create(r,o);e.attach(r,i)}}function Tm(e,t,n,r){let o=new Set;for(let i=t;i<=n;i++)o.add(r(i,e.at(i)));return o}var Au=class{kvMap=new Map;_vMap=void 0;has(t){return this.kvMap.has(t)}delete(t){if(!this.has(t))return!1;let n=this.kvMap.get(t);return this._vMap!==void 0&&this._vMap.has(n)?(this.kvMap.set(t,this._vMap.get(n)),this._vMap.delete(n)):this.kvMap.delete(t),!0}get(t){return this.kvMap.get(t)}set(t,n){if(this.kvMap.has(t)){let r=this.kvMap.get(t);this._vMap===void 0&&(this._vMap=new Map);let o=this._vMap;for(;o.has(r);)r=o.get(r);o.set(r,n)}else this.kvMap.set(t,n)}forEach(t){for(let[n,r]of this.kvMap)if(t(r,n),this._vMap!==void 0){let o=this._vMap;for(;o.has(r);)r=o.get(r),t(r,n)}}};function Cf(e,t,n,r,o,i,s,u){Nt("NgControlFlow");let a=w(),c=G(),l=He(c.consts,i);return to(a,c,e,t,n,r,o,l,256,s,u),_f}function _f(e,t,n,r,o,i,s,u){Nt("NgControlFlow");let a=w(),c=G(),l=He(c.consts,i);return to(a,c,e,t,n,r,o,l,512,s,u),_f}function wf(e,t){Nt("NgControlFlow");let n=w(),r=ut(),o=n[r]!==we?n[r]:-1,i=o!==-1?Nu(n,K+o):void 0,s=0;if(ke(n,r,e)){let u=I(null);try{if(i!==void 0&&Ky(i,s),e!==-1){let a=K+e,c=Nu(n,a),l=Md(n[S],a),d=Xy(c,l,n),h=wi(n,l,t,{dehydratedView:d});xi(c,h,s,eo(l,d))}}finally{I(u)}}else if(i!==void 0){let u=Qy(i,s);u!==void 0&&(u[re]=t)}}var Id=class{lContainer;$implicit;$index;constructor(t,n,r){this.lContainer=t,this.$implicit=n,this.$index=r}get $count(){return this.lContainer.length-oe}};function DI(e){return e}function na(e,t){return t}var Td=class{hasEmptyBlock;trackByFn;liveCollection;constructor(t,n,r){this.hasEmptyBlock=t,this.trackByFn=n,this.liveCollection=r}};function ra(e,t,n,r,o,i,s,u,a,c,l,d,h){Nt("NgControlFlow");let f=w(),p=G(),m=a!==void 0,g=w(),y=u?s.bind(g[_e][re]):s,v=new Td(m,y);g[K+e]=v,to(f,p,e+1,t,n,r,o,He(p.consts,i),256),m&&to(f,p,e+2,a,c,l,d,He(p.consts,h),512)}var Sd=class extends wd{lContainer;hostLView;templateTNode;operationsCounter=void 0;needsIndexUpdate=!1;constructor(t,n,r){super(),this.lContainer=t,this.hostLView=n,this.templateTNode=r}get length(){return this.lContainer.length-oe}at(t){return this.getLView(t)[re].$implicit}attach(t,n){let r=n[Qn];this.needsIndexUpdate||=t!==this.length,xi(this.lContainer,n,t,eo(this.templateTNode,r)),EI(this.lContainer,t)}detach(t){return this.needsIndexUpdate||=t!==this.length-1,CI(this.lContainer,t),_I(this.lContainer,t)}create(t,n){let r=Cu(this.lContainer,this.templateTNode.tView.ssrId);return wi(this.hostLView,this.templateTNode,new Id(this.lContainer,n,t),{dehydratedView:r})}destroy(t){zu(t[S],t)}updateValue(t,n){this.getLView(t)[re].$implicit=n}reset(){this.needsIndexUpdate=!1}updateIndexes(){if(this.needsIndexUpdate)for(let t=0;t0){let i=r[Ut];yw(i,o),cr.delete(r[zt]),o.detachedLeaveAnimationFns=void 0}}function CI(e,t){if(e.length<=oe)return;let n=oe+t,r=e[n],o=r?r[En]:void 0;o&&o.leave&&o.leave.size>0&&(o.detachedLeaveAnimationFns=[])}function _I(e,t){return gi(e,t)}function wI(e,t){return Qy(e,t)}function Md(e,t){return Qs(e,t)}function lo(e,t,n){let r=w(),o=ut();if(ke(r,o,t)){let i=G(),s=wn();Py(s,r,e,t,r[Z],n)}return lo}function Ad(e,t,n,r,o){Wu(t,e,n,o?"class":"style",r)}function dr(e,t,n,r){let o=w(),i=o[S],s=e+K,u=i.firstCreatePass?sf(s,o,2,t,tf,Xs(),n,r):i.data[s];if(Mt(u)){let a=o[ot].tracingService;if(a&&a.componentCreate){let c=i.data[u.directiveStart+u.componentOffset];return a.componentCreate(ab(c),()=>(Sm(e,t,o,u,r),dr))}}return Sm(e,t,o,u,r),dr}function Sm(e,t,n,r,o){if(nf(r,n,e,t,Ob),Gr(r)){let i=n[S];Gu(i,n,r),jd(i,r,n)}o!=null&&_i(n,r)}function fo(){let e=G(),t=ue(),n=rf(t);return e.firstCreatePass&&uf(e,n),Il(n)&&Tl(),wl(),n.classesWithoutHost!=null&&KC(n)&&Ad(e,n,w(),n.classesWithoutHost,!0),n.stylesWithoutHost!=null&&JC(n)&&Ad(e,n,w(),n.stylesWithoutHost,!1),fo}function Fb(e,t,n,r){return dr(e,t,n,r),fo(),Fb}function xf(e,t,n,r){let o=w(),i=o[S],s=e+K,u=i.firstCreatePass?_x(s,i,2,t,n,r):i.data[s];return nf(u,o,e,t,Ob),r!=null&&_i(o,u),xf}function If(){let e=ue(),t=rf(e);return Il(t)&&Tl(),wl(),If}function ia(e,t,n,r){return xf(e,t,n,r),If(),ia}var Ob=(e,t,n,r,o)=>(ii(!0),yy(t[Z],r,$g()));function Tf(e,t,n){let r=w(),o=r[S],i=e+K,s=o.firstCreatePass?sf(i,r,8,"ng-container",tf,Xs(),t,n):o.data[i];if(nf(s,r,e,"ng-container",xI),Gr(s)){let u=r[S];Gu(u,r,s),jd(u,s,r)}return n!=null&&_i(r,s),Tf}function Sf(){let e=G(),t=ue(),n=rf(t);return e.firstCreatePass&&uf(e,n),Sf}function po(e,t,n){return Tf(e,t,n),Sf(),po}var xI=(e,t,n,r,o)=>(ii(!0),z_(t[Z],""));function II(){return w()}function sa(e,t,n){let r=w(),o=ut();if(ke(r,o,t)){let i=G(),s=wn();Ly(s,r,e,t,r[Z],n)}return sa}var ci=void 0;function TI(e){let t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,"").length;return t===1&&n===0?1:5}var SI=["en",[["a","p"],["AM","PM"]],[["AM","PM"]],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],ci,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],ci,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm\u202Fa","h:mm:ss\u202Fa","h:mm:ss\u202Fa z","h:mm:ss\u202Fa zzzz"],["{1}, {0}",ci,ci,ci],[".",",",";","%","+","-","E","\xD7","\u2030","\u221E","NaN",":"],["#,##0.###","#,##0%","\xA4#,##0.00","#E0"],"USD","$","US Dollar",{},"ltr",TI],Gl={};function Oe(e){let t=MI(e),n=Mm(t);if(n)return n;let r=t.split("-")[0];if(n=Mm(r),n)return n;if(r==="en")return SI;throw new D(701,!1)}function Mm(e){return e in Gl||(Gl[e]=fe.ng&&fe.ng.common&&fe.ng.common.locales&&fe.ng.common.locales[e]),Gl[e]}var ie=(function(e){return e[e.LocaleId=0]="LocaleId",e[e.DayPeriodsFormat=1]="DayPeriodsFormat",e[e.DayPeriodsStandalone=2]="DayPeriodsStandalone",e[e.DaysFormat=3]="DaysFormat",e[e.DaysStandalone=4]="DaysStandalone",e[e.MonthsFormat=5]="MonthsFormat",e[e.MonthsStandalone=6]="MonthsStandalone",e[e.Eras=7]="Eras",e[e.FirstDayOfWeek=8]="FirstDayOfWeek",e[e.WeekendRange=9]="WeekendRange",e[e.DateFormat=10]="DateFormat",e[e.TimeFormat=11]="TimeFormat",e[e.DateTimeFormat=12]="DateTimeFormat",e[e.NumberSymbols=13]="NumberSymbols",e[e.NumberFormats=14]="NumberFormats",e[e.CurrencyCode=15]="CurrencyCode",e[e.CurrencySymbol=16]="CurrencySymbol",e[e.CurrencyName=17]="CurrencyName",e[e.Currencies=18]="Currencies",e[e.Directionality=19]="Directionality",e[e.PluralCase=20]="PluralCase",e[e.ExtraData=21]="ExtraData",e})(ie||{});function MI(e){return e.toLowerCase().replace(/_/g,"-")}var Ai="en-US";var AI=Ai;function Pb(e){typeof e=="string"&&(AI=e.toLowerCase().replace(/_/g,"-"))}function Lb(e,t,n){let r=w(),o=G(),i=ue();return Bb(o,r,r[Z],i,e,t,n),Lb}function jb(e,t,n){let r=w(),o=G(),i=ue();return(i.type&3||n)&&lf(i,o,r,n,r[Z],e,t,ur(i,r,t)),jb}function Bb(e,t,n,r,o,i,s){let u=!0,a=null;if((r.type&3||s)&&(a??=ur(r,t,i),lf(r,e,t,s,n,o,i,a)&&(u=!1)),u){let c=r.outputs?.[o],l=r.hostDirectiveOutputs?.[o];if(l&&l.length)for(let d=0;d>17&32767}function BI(e){return(e&2)==2}function VI(e,t){return e&131071|t<<17}function Nd(e){return e|2}function no(e){return(e&131068)>>2}function Wl(e,t){return e&-131069|t<<2}function HI(e){return(e&1)===1}function kd(e){return e|1}function $I(e,t,n,r,o,i){let s=i?t.classBindings:t.styleBindings,u=fr(s),a=no(s);e[r]=n;let c=!1,l;if(Array.isArray(n)){let d=n;l=d[1],(l===null||Vr(d,l)>0)&&(c=!0)}else l=n;if(o)if(a!==0){let h=fr(e[u+1]);e[r+1]=lu(h,u),h!==0&&(e[h+1]=Wl(e[h+1],r)),e[u+1]=VI(e[u+1],r)}else e[r+1]=lu(u,0),u!==0&&(e[u+1]=Wl(e[u+1],r)),u=r;else e[r+1]=lu(a,0),u===0?u=r:e[a+1]=Wl(e[a+1],r),a=r;c&&(e[r+1]=Nd(e[r+1])),Am(e,l,r,!0),Am(e,l,r,!1),UI(t,l,e,r,i),s=lu(u,a),i?t.classBindings=s:t.styleBindings=s}function UI(e,t,n,r,o){let i=o?e.residualClasses:e.residualStyles;i!=null&&typeof t=="string"&&Vr(i,t)>=0&&(n[r+1]=kd(n[r+1]))}function Am(e,t,n,r){let o=e[n+1],i=t===null,s=r?fr(o):no(o),u=!1;for(;s!==0&&(u===!1||i);){let a=e[s],c=e[s+1];zI(a,t)&&(u=!0,e[s+1]=r?kd(c):Nd(c)),s=r?fr(c):no(c)}u&&(e[n+1]=r?Nd(o):kd(o))}function zI(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t=="string"?Vr(e,t)>=0:!1}var pe={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function zb(e){return e.substring(pe.key,pe.keyEnd)}function qI(e){return e.substring(pe.value,pe.valueEnd)}function GI(e){return Wb(e),qb(e,ro(e,0,pe.textEnd))}function qb(e,t){let n=pe.textEnd;return n===t?-1:(t=pe.keyEnd=ZI(e,pe.key=t,n),ro(e,t,n))}function WI(e){return Wb(e),Gb(e,ro(e,0,pe.textEnd))}function Gb(e,t){let n=pe.textEnd,r=pe.key=ro(e,t,n);return n===r?-1:(r=pe.keyEnd=YI(e,r,n),r=Nm(e,r,n,58),r=pe.value=ro(e,r,n),r=pe.valueEnd=QI(e,r,n),Nm(e,r,n,59))}function Wb(e){pe.key=0,pe.keyEnd=0,pe.value=0,pe.valueEnd=0,pe.textEnd=e.length}function ro(e,t,n){for(;t32;)t++;return t}function YI(e,t,n){let r;for(;t=65&&(r&-33)<=90||r>=48&&r<=57);)t++;return t}function Nm(e,t,n,r){return t=ro(e,t,n),t32&&(u=s),i=o,o=r,r=a&-33}return u}function km(e,t,n,r){let o=-1,i=n;for(;i=0;n=Gb(t,n))Xb(e,zb(t),qI(t))}function ki(e){Qb(o2,JI,e,!0)}function JI(e,t){for(let n=GI(t);n>=0;n=qb(t,n))Jo(e,zb(t),!0)}function Yb(e,t,n,r){let o=w(),i=G(),s=eu(2);if(i.firstUpdatePass&&Jb(i,e,s,r),t!==we&&ke(o,s,t)){let u=i.data[at()];e1(i,u,o,o[Z],e,o[s+1]=s2(t,n),r,s)}}function Qb(e,t,n,r){let o=G(),i=eu(2);o.firstUpdatePass&&Jb(o,null,i,r);let s=w();if(n!==we&&ke(s,i,n)){let u=o.data[at()];if(t1(u,r)&&!Kb(o,i)){let a=r?u.classesWithoutHost:u.stylesWithoutHost;a!==null&&(n=Vs(a,n||"")),Ad(o,u,s,n,r)}else i2(o,u,s,s[Z],s[i+1],s[i+1]=r2(e,t,n),r,i)}}function Kb(e,t){return t>=e.expandoStartIndex}function Jb(e,t,n,r){let o=e.data;if(o[n+1]===null){let i=o[at()],s=Kb(e,n);t1(i,r)&&t===null&&!s&&(t=!1),t=XI(o,i,t,r),$I(o,i,t,n,s,r)}}function XI(e,t,n,r){let o=Og(e),i=r?t.residualClasses:t.residualStyles;if(o===null)(r?t.classBindings:t.styleBindings)===0&&(n=Zl(null,e,t,n,r),n=vi(n,t.attrs,r),i=null);else{let s=t.directiveStylingLast;if(s===-1||e[s]!==o)if(n=Zl(o,e,t,n,r),i===null){let a=e2(e,t,r);a!==void 0&&Array.isArray(a)&&(a=Zl(null,e,t,a[1],r),a=vi(a,t.attrs,r),t2(e,t,r,a))}else i=n2(e,t,r)}return i!==void 0&&(r?t.residualClasses=i:t.residualStyles=i),n}function e2(e,t,n){let r=n?t.classBindings:t.styleBindings;if(no(r)!==0)return e[fr(r)]}function t2(e,t,n,r){let o=n?t.classBindings:t.styleBindings;e[fr(o)]=r}function n2(e,t,n){let r,o=t.directiveEnd;for(let i=1+t.directiveStylingLast;i0;){let a=e[o],c=Array.isArray(a),l=c?a[1]:a,d=l===null,h=n[o+1];h===we&&(h=d?Ee:void 0);let f=d?Ws(h,r):l===r?h:void 0;if(c&&!ku(f)&&(f=Ws(a,r)),ku(f)&&(u=f,s))return u;let p=e[o+1];o=s?fr(p):no(p)}if(t!==null){let a=i?t.residualClasses:t.residualStyles;a!=null&&(u=Ws(a,r))}return u}function ku(e){return e!==void 0}function s2(e,t){return e==null||e===""||(typeof t=="string"?e=e+t:typeof e=="object"&&(e=Yo(Ue(e)))),e}function t1(e,t){return(e.flags&(t?8:16))!==0}function u2(e,t=""){let n=w(),r=G(),o=e+K,i=r.firstCreatePass?gr(r,o,1,t,null):r.data[o],s=a2(r,n,i,t);n[o]=s,iu()&&Xd(r,n,s,i),rr(i,!1)}var a2=(e,t,n,r)=>(ii(!0),$_(t[Z],r));function n1(e,t,n,r=""){return ke(e,ut(),n)?t+vn(n)+r:we}function r1(e,t,n,r,o,i=""){let s=Ag(),u=ib(e,s,n,o);return eu(2),u?t+vn(n)+r+vn(o)+i:we}function o1(e){return Mf("",e),o1}function Mf(e,t,n){let r=w(),o=n1(r,e,t,n);return o!==we&&s1(r,at(),o),Mf}function i1(e,t,n,r,o){let i=w(),s=r1(i,e,t,n,r,o);return s!==we&&s1(i,at(),s),i1}function s1(e,t,n){let r=bl(t,e);U_(e[Z],r,n)}function u1(e,t,n){bf(t)&&(t=t());let r=w(),o=ut();if(ke(r,o,t)){let i=G(),s=wn();Py(s,r,e,t,r[Z],n)}return u1}function c2(e,t){let n=bf(e);return n&&e.set(t),n}function a1(e,t){let n=w(),r=G(),o=ue();return Bb(r,n,n[Z],o,e,t),a1}var c1={};function aa(e){Nt("NgLet");let t=G(),n=w(),r=e+K,o=gr(t,r,128,null,null);return rr(o,!1),ni(t,n,r,c1),aa}function ca(e){let t=G(),n=w(),r=at();return ni(t,n,r,e),e}function la(e){let t=Nl(),n=ti(t,K+e);if(n===c1)throw new D(314,!1);return n}function l2(e){return ke(w(),ut(),e)?vn(e):we}function d2(e,t,n=""){return n1(w(),e,t,n)}function f2(e,t,n,r,o=""){return r1(w(),e,t,n,r,o)}function Fm(e,t,n){let r=G();r.firstCreatePass&&l1(t,r.data,r.blueprint,st(e),n)}function l1(e,t,n,r,o){if(e=le(e),Array.isArray(e))for(let i=0;i>20;if(Gn(e)||!e.multi){let f=new ar(c,o,ee,null),p=Ql(a,t,o?l:l+h,d);p===-1?(Jl(vu(u,s),i,a),Yl(i,e,t.length),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(f),s.push(f)):(n[p]=f,s[p]=f)}else{let f=Ql(a,t,l+h,d),p=Ql(a,t,l,l+h),m=f>=0&&n[f],g=p>=0&&n[p];if(o&&!g||!o&&!m){Jl(vu(u,s),i,a);let y=g2(o?h2:p2,n.length,o,r,c,e);!o&&g&&(n[p].providerFactory=y),Yl(i,e,t.length,0),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(y),s.push(y)}else{let y=d1(n[o?p:f],c,!o&&r);Yl(i,e,f>-1?f:p,y)}!o&&r&&g&&n[p].componentProviders++}}}function Yl(e,t,n,r){let o=Gn(t),i=yg(t);if(o||i){let a=(i?le(t.useClass):t).prototype.ngOnDestroy;if(a){let c=e.destroyHooks||(e.destroyHooks=[]);if(!o&&t.multi){let l=c.indexOf(n);l===-1?c.push(n,[r,a]):c[l+1].push(r,a)}else c.push(n,a)}}}function d1(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function Ql(e,t,n,r){for(let o=n;o{n.providersResolver=(r,o)=>Fm(r,o?o(e):e,!1),t&&(n.viewProvidersResolver=(r,o)=>Fm(r,o?o(t):t,!0))}}function y2(e,t){let n=Zr()+e,r=w();return r[n]===we?cf(r,n,t()):wx(r,n)}function b2(e,t,n){return p1(w(),Zr(),e,t,n)}function v2(e,t,n,r){return h1(w(),Zr(),e,t,n,r)}function f1(e,t){let n=e[t];return n===we?void 0:n}function p1(e,t,n,r,o,i){let s=t+n;return ke(e,s,o)?cf(e,s+1,i?r.call(i,o):r(o)):f1(e,s+1)}function h1(e,t,n,r,o,i,s){let u=t+n;return ib(e,u,o,i)?cf(e,u+2,s?r.call(s,o,i):r(o,i)):f1(e,u+2)}function D2(e,t){let n=G(),r,o=e+K;n.firstCreatePass?(r=E2(t,n.pipeRegistry),n.data[o]=r,r.onDestroy&&(n.destroyHooks??=[]).push(o,r.onDestroy)):r=n.data[o];let i=r.factory||(r.factory=mn(r.type,!0)),s,u=Me(ee);try{let a=bu(!1),c=i();return bu(a),ni(n,w(),o,c),c}finally{Me(u)}}function E2(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function C2(e,t,n){let r=e+K,o=w(),i=ti(o,r);return g1(o,r)?p1(o,Zr(),t,i.transform,n,i):i.transform(n)}function _2(e,t,n,r){let o=e+K,i=w(),s=ti(i,o);return g1(i,o)?h1(i,Zr(),t,s.transform,n,r,s):s.transform(n,r)}function g1(e,t){return e[S].data[t].pure}function w2(e,t){return Yu(e,t)}var Ru=class{ngModuleFactory;componentFactories;constructor(t,n){this.ngModuleFactory=t,this.componentFactories=n}},x2=(()=>{class e{compileModuleSync(n){return new Mu(n)}compileModuleAsync(n){return Promise.resolve(this.compileModuleSync(n))}compileModuleAndAllComponentsSync(n){let r=this.compileModuleSync(n),o=ol(n),i=Cy(o.declarations).reduce((s,u)=>{let a=Tt(u);return a&&s.push(new Mn(a)),s},[]);return new Ru(r,i)}compileModuleAndAllComponentsAsync(n){return Promise.resolve(this.compileModuleAndAllComponentsSync(n))}clearCache(){}clearCacheFor(n){}getModuleId(n){}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();var m1=(()=>{class e{applicationErrorHandler=b(Gt);appRef=b(co);taskService=b(or);ngZone=b(Ce);zonelessEnabled=b(ui);tracing=b(ft,{optional:!0});zoneIsDefined=typeof Zone<"u"&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new ne;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Wo):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(b(Bl,{optional:!0})??!1);cancelScheduledCallback=null;useMicrotaskScheduler=!1;runningTick=!1;pendingRenderTaskId=null;constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe(()=>{let n=this.taskService.add();if(!this.runningTick&&(this.cleanup(),!this.zonelessEnabled||this.appRef.includeAllTestViews)){this.taskService.remove(n);return}this.switchToMicrotaskScheduler(),this.taskService.remove(n)})),this.subscriptions.add(this.ngZone.onUnstable.subscribe(()=>{this.runningTick||this.cleanup()}))}switchToMicrotaskScheduler(){this.ngZone.runOutsideAngular(()=>{let n=this.taskService.add();this.useMicrotaskScheduler=!0,queueMicrotask(()=>{this.useMicrotaskScheduler=!1,this.taskService.remove(n)})})}notify(n){if(!this.zonelessEnabled&&n===5)return;switch(n){case 0:{this.appRef.dirtyFlags|=2;break}case 3:case 2:case 4:case 5:case 1:{this.appRef.dirtyFlags|=4;break}case 6:{this.appRef.dirtyFlags|=2;break}case 12:{this.appRef.dirtyFlags|=16;break}case 13:{this.appRef.dirtyFlags|=2;break}case 11:break;default:this.appRef.dirtyFlags|=8}if(this.appRef.tracingSnapshot=this.tracing?.snapshot(this.appRef.tracingSnapshot)??null,!this.shouldScheduleTick())return;let r=this.useMicrotaskScheduler?Gg:Pl;this.pendingRenderTaskId=this.taskService.add(),this.scheduleInRootZone?this.cancelScheduledCallback=Zone.root.run(()=>r(()=>this.tick())):this.cancelScheduledCallback=this.ngZone.runOutsideAngular(()=>r(()=>this.tick()))}shouldScheduleTick(){return!(this.appRef.destroyed||this.pendingRenderTaskId!==null||this.runningTick||this.appRef._runningTick||!this.zonelessEnabled&&this.zoneIsDefined&&Zone.current.get(Wo+this.angularZoneId))}tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRef.dirtyFlags===0){this.cleanup();return}!this.zonelessEnabled&&this.appRef.dirtyFlags&7&&(this.appRef.dirtyFlags|=1);let n=this.taskService.add();try{this.ngZone.run(()=>{this.runningTick=!0,this.appRef._tick()},void 0,this.schedulerTickApplyArgs)}catch(r){this.applicationErrorHandler(r)}finally{this.taskService.remove(n),this.cleanup()}}ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this.cancelScheduledCallback=null,this.pendingRenderTaskId!==null){let n=this.pendingRenderTaskId;this.pendingRenderTaskId=null,this.taskService.remove(n)}}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function y1(){return[{provide:wt,useExisting:m1},{provide:Ce,useClass:Zo},{provide:ui,useValue:!0}]}function I2(){return typeof $localize<"u"&&$localize.locale||Ai}var go=new x("",{factory:()=>b(go,{optional:!0,skipSelf:!0})||I2()});var da=class{destroyed=!1;listeners=null;errorHandler=b(We,{optional:!0});destroyRef=b($e);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(t){if(this.destroyed)throw new D(953,!1);return(this.listeners??=[]).push(t),{unsubscribe:()=>{let n=this.listeners?.indexOf(t);n!==void 0&&n!==-1&&this.listeners?.splice(n,1)}}}emit(t){if(this.destroyed){console.warn(xt(953,!1));return}if(this.listeners===null)return;let n=I(null);try{for(let r of this.listeners)try{r(t)}catch(o){this.errorHandler?.handleError(o)}}finally{I(n)}}};function xe(e){return eg(e)}function Re(e,t){return Fo(e,t?.equal)}var T2=e=>e;function Af(e,t){if(typeof e=="function"){let n=Bc(e,T2,t?.equal);return b1(n,t?.debugName)}else{let n=Bc(e.source,e.computation,e.equal);return b1(n,e.debugName)}}function b1(e,t){let n=e[se],r=e;return r.set=o=>J0(n,o),r.update=o=>X0(n,o),r.asReadonly=si.bind(e),r}function S2(e){let t=e.request,n=e.params??t??(()=>null);return new fa(n,A2(e),e.defaultValue,e.equal?M2(e.equal):void 0,e.debugName,e.injector??b(me))}var Nf=class{value;isLoading;constructor(t,n){this.value=t,this.value.set=this.set.bind(this),this.value.update=this.update.bind(this),this.value.asReadonly=si,this.isLoading=Re(()=>this.status()==="loading"||this.status()==="reloading",void 0)}isError=Re(()=>this.status()==="error");update(t){this.set(t(xe(this.value)))}isValueDefined=Re(()=>this.isError()?!1:this.value()!==void 0);_snapshot;get snapshot(){return this._snapshot??=Re(()=>{let t=this.status();return t==="error"?{status:"error",error:this.error()}:{status:t,value:this.value()}})}hasValue(){return this.isValueDefined()}asReadonly(){return this}},fa=class extends Nf{loaderFn;equal;debugName;pendingTasks;state;extRequest;effectRef;pendingController;resolvePendingTask=void 0;destroyed=!1;unregisterOnDestroy;status;error;constructor(t,n,r,o,i,s,u){super(Re(()=>{let a=this.state().stream?.();if(!a||this.state().status==="loading"&&this.error())return r;if(!kf(a))throw new pa(this.error());return a.value},{equal:o}),i),this.loaderFn=n,this.equal=o,this.debugName=i,this.extRequest=Af({source:t,computation:a=>({request:a,reload:0})}),this.state=Af({source:this.extRequest,computation:(a,c)=>{if(c){let l=a.request===void 0?"idle":"loading";return{extRequest:a,status:l,previousStatus:v1(c.value),stream:c.value.extRequest.request===a.request?c.value.stream:void 0}}else{let l=u?.(a.request);u=void 0;let d=a.request===void 0?"idle":l?"resolved":"loading";return{extRequest:a,status:d,previousStatus:"idle",stream:l}}}}),this.effectRef=ai(this.loadEffect.bind(this),{injector:s,manualCleanup:!0}),this.pendingTasks=s.get(ir),this.unregisterOnDestroy=s.get($e).onDestroy(()=>this.destroy()),this.status=Re(()=>v1(this.state()),void 0),this.error=Re(()=>{let a=this.state().stream?.();return a&&!kf(a)?a.error:void 0},void 0)}set(t){if(this.destroyed)return;let n=xe(this.error),r=xe(this.state);if(!n){let o=xe(this.value);if(r.status==="local"&&(this.equal?this.equal(o,t):o===t))return}this.state.set({extRequest:r.extRequest,status:"local",previousStatus:"local",stream:xn({value:t},void 0)}),this.abortInProgressLoad()}reload(){let{status:t}=xe(this.state);return t==="idle"||t==="loading"?!1:(this.extRequest.update(({request:n,reload:r})=>({request:n,reload:r+1})),!0)}destroy(){this.destroyed=!0,this.unregisterOnDestroy(),this.effectRef.destroy(),this.abortInProgressLoad(),this.state.set({extRequest:{request:void 0,reload:0},status:"idle",previousStatus:"idle",stream:void 0})}loadEffect(){return vt(this,null,function*(){let t=this.extRequest(),{status:n,previousStatus:r}=xe(this.state);if(t.request===void 0)return;if(n!=="loading")return;this.abortInProgressLoad();let o=this.resolvePendingTask=this.pendingTasks.add(),{signal:i}=this.pendingController=new AbortController;try{let s=yield xe(()=>this.loaderFn({params:t.request,abortSignal:i,previous:{status:r}}));if(i.aborted||xe(this.extRequest)!==t)return;this.state.set({extRequest:t,status:"resolved",previousStatus:"resolved",stream:s})}catch(s){if(i.aborted||xe(this.extRequest)!==t)return;this.state.set({extRequest:t,status:"resolved",previousStatus:"error",stream:xn({error:Ff(s)},void 0)})}finally{o?.(),o=void 0}})}abortInProgressLoad(){xe(()=>this.pendingController?.abort()),this.pendingController=void 0,this.resolvePendingTask?.(),this.resolvePendingTask=void 0}};function M2(e){return(t,n)=>t===void 0||n===void 0?t===n:e(t,n)}function A2(e){return N2(e)?e.stream:t=>vt(null,null,function*(){try{return xn({value:yield e.loader(t)},void 0)}catch(n){return xn({error:Ff(n)},void 0)}})}function N2(e){return!!e.stream}function v1(e){switch(e.status){case"loading":return e.extRequest.reload===0?"loading":"reloading";case"resolved":return kf(e.stream())?"resolved":"error";default:return e.status}}function kf(e){return e.error===void 0}function Ff(e){return k2(e)?e:new Rf(e)}function k2(e){return e instanceof Error||typeof e=="object"&&typeof e.name=="string"&&typeof e.message=="string"}var pa=class extends Error{constructor(t){super(t.message,{cause:t})}},Rf=class extends Error{constructor(t){super(String(t),{cause:t})}};var M1=Symbol("InputSignalNode#UNSET"),V2=P(M({},Oo),{transformFn:void 0,applyValueToInputSignal(e,t){jn(e,t)}});function A1(e,t){let n=Object.create(V2);n.value=e,n.transformFn=t?.transform;function r(){if(cn(n),n.value===M1){let o=null;throw new D(-950,o)}return n.value}return r[se]=n,r}var D1=class{attributeName;constructor(t){this.attributeName=t}__NG_ELEMENT_ID__=()=>Od(this.attributeName);toString(){return`HostAttributeToken ${this.attributeName}`}},F7=(()=>{let e=new x("");return e.__NG_ELEMENT_ID__=t=>{let n=ue();if(n===null)throw new D(-204,!1);if(n.type&2)return n.value;if(t&8)return null;throw new D(-204,!1)},e})();function O7(e){return new da}function E1(e,t){return A1(e,t)}function H2(e){return A1(M1,e)}var Pe=(E1.required=H2,E1);function C1(e,t){return hf(t)}function $2(e,t){return gf(t)}var P7=(C1.required=$2,C1);function L7(e,t){return yb(t)}function _1(e,t){return hf(t)}function U2(e,t){return gf(t)}var j7=(_1.required=U2,_1);var Pf=new x(""),z2=new x("");function Ri(e){return!e.moduleRef}function q2(e){let t=Ri(e)?e.r3Injector:e.moduleRef.injector,n=t.get(Ce);return n.run(()=>{Ri(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(Gt),o;if(n.runOutsideAngular(()=>{o=n.onError.subscribe({next:r})}),Ri(e)){let i=()=>t.destroy(),s=e.platformInjector.get(Pf);s.add(i),t.onDestroy(()=>{o.unsubscribe(),s.delete(i)})}else{let i=()=>e.moduleRef.destroy(),s=e.platformInjector.get(Pf);s.add(i),e.moduleRef.onDestroy(()=>{di(e.allPlatformModules,e.moduleRef),o.unsubscribe(),s.delete(i)})}return W2(r,n,()=>{let i=t.get(or),s=i.add(),u=t.get(Ef);return u.runInitializers(),u.donePromise.then(()=>{let a=t.get(go,Ai);if(Pb(a||Ai),!t.get(z2,!0))return Ri(e)?t.get(co):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(Ri(e)){let l=t.get(co);return e.rootComponent!==void 0&&l.bootstrap(e.rootComponent),l}else return G2?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>{i.remove(s)})})})}var G2;function W2(e,t,n){try{let r=n();return Mi(r)?r.catch(o=>{throw t.runOutsideAngular(()=>e(o)),o}):r}catch(r){throw t.runOutsideAngular(()=>e(r)),r}}var ha=null;function Z2(e=[],t){return me.create({name:t,providers:[{provide:Xo,useValue:"platform"},{provide:Pf,useValue:new Set([()=>ha=null])},...e]})}function Y2(e=[]){if(ha)return ha;let t=Z2(e);return ha=t,Nb(),Q2(t),t}function Q2(e){let t=e.get(Pu,null);Ur(e,()=>{t?.forEach(n=>n())})}var K2=1e4;var B7=K2-1e3;var qf=(()=>{class e{static __NG_ELEMENT_ID__=J2}return e})();function J2(e){return X2(ue(),w(),(e&16)===16)}function X2(e,t,n){if(Mt(e)&&!n){let r=Ve(e.index,t);return new Tn(r,r)}else if(e.type&175){let r=t[_e];return new Tn(r,t)}return null}var Lf=class{supports(t){return af(t)}create(t){return new jf(t)}},eT=(e,t)=>t,jf=class{length=0;collection;_linkedRecords=null;_unlinkedRecords=null;_previousItHead=null;_itHead=null;_itTail=null;_additionsHead=null;_additionsTail=null;_movesHead=null;_movesTail=null;_removalsHead=null;_removalsTail=null;_identityChangesHead=null;_identityChangesTail=null;_trackByFn;constructor(t){this._trackByFn=t||eT}forEachItem(t){let n;for(n=this._itHead;n!==null;n=n._next)t(n)}forEachOperation(t){let n=this._itHead,r=this._removalsHead,o=0,i=null;for(;n||r;){let s=!r||n&&n.currentIndex{s=this._trackByFn(o,u),n===null||!Object.is(n.trackById,s)?(n=this._mismatch(n,u,s,o),r=!0):(r&&(n=this._verifyReinsertion(n,u,s,o)),Object.is(n.item,u)||this._addIdentityChange(n,u)),n=n._next,o++}),this.length=o;return this._truncate(n),this.collection=t,this.isDirty}get isDirty(){return this._additionsHead!==null||this._movesHead!==null||this._removalsHead!==null||this._identityChangesHead!==null}_reset(){if(this.isDirty){let t;for(t=this._previousItHead=this._itHead;t!==null;t=t._next)t._nextPrevious=t._next;for(t=this._additionsHead;t!==null;t=t._nextAdded)t.previousIndex=t.currentIndex;for(this._additionsHead=this._additionsTail=null,t=this._movesHead;t!==null;t=t._nextMoved)t.previousIndex=t.currentIndex;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(t,n,r,o){let i;return t===null?i=this._itTail:(i=t._prev,this._remove(t)),t=this._unlinkedRecords===null?null:this._unlinkedRecords.get(r,null),t!==null?(Object.is(t.item,n)||this._addIdentityChange(t,n),this._reinsertAfter(t,i,o)):(t=this._linkedRecords===null?null:this._linkedRecords.get(r,o),t!==null?(Object.is(t.item,n)||this._addIdentityChange(t,n),this._moveAfter(t,i,o)):t=this._addAfter(new Bf(n,r),i,o)),t}_verifyReinsertion(t,n,r,o){let i=this._unlinkedRecords===null?null:this._unlinkedRecords.get(r,null);return i!==null?t=this._reinsertAfter(i,t._prev,o):t.currentIndex!=o&&(t.currentIndex=o,this._addToMoves(t,o)),t}_truncate(t){for(;t!==null;){let n=t._next;this._addToRemovals(this._unlink(t)),t=n}this._unlinkedRecords!==null&&this._unlinkedRecords.clear(),this._additionsTail!==null&&(this._additionsTail._nextAdded=null),this._movesTail!==null&&(this._movesTail._nextMoved=null),this._itTail!==null&&(this._itTail._next=null),this._removalsTail!==null&&(this._removalsTail._nextRemoved=null),this._identityChangesTail!==null&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(t,n,r){this._unlinkedRecords!==null&&this._unlinkedRecords.remove(t);let o=t._prevRemoved,i=t._nextRemoved;return o===null?this._removalsHead=i:o._nextRemoved=i,i===null?this._removalsTail=o:i._prevRemoved=o,this._insertAfter(t,n,r),this._addToMoves(t,r),t}_moveAfter(t,n,r){return this._unlink(t),this._insertAfter(t,n,r),this._addToMoves(t,r),t}_addAfter(t,n,r){return this._insertAfter(t,n,r),this._additionsTail===null?this._additionsTail=this._additionsHead=t:this._additionsTail=this._additionsTail._nextAdded=t,t}_insertAfter(t,n,r){let o=n===null?this._itHead:n._next;return t._next=o,t._prev=n,o===null?this._itTail=t:o._prev=t,n===null?this._itHead=t:n._next=t,this._linkedRecords===null&&(this._linkedRecords=new ga),this._linkedRecords.put(t),t.currentIndex=r,t}_remove(t){return this._addToRemovals(this._unlink(t))}_unlink(t){this._linkedRecords!==null&&this._linkedRecords.remove(t);let n=t._prev,r=t._next;return n===null?this._itHead=r:n._next=r,r===null?this._itTail=n:r._prev=n,t}_addToMoves(t,n){return t.previousIndex===n||(this._movesTail===null?this._movesTail=this._movesHead=t:this._movesTail=this._movesTail._nextMoved=t),t}_addToRemovals(t){return this._unlinkedRecords===null&&(this._unlinkedRecords=new ga),this._unlinkedRecords.put(t),t.currentIndex=null,t._nextRemoved=null,this._removalsTail===null?(this._removalsTail=this._removalsHead=t,t._prevRemoved=null):(t._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=t),t}_addIdentityChange(t,n){return t.item=n,this._identityChangesTail===null?this._identityChangesTail=this._identityChangesHead=t:this._identityChangesTail=this._identityChangesTail._nextIdentityChange=t,t}},Bf=class{item;trackById;currentIndex=null;previousIndex=null;_nextPrevious=null;_prev=null;_next=null;_prevDup=null;_nextDup=null;_prevRemoved=null;_nextRemoved=null;_nextAdded=null;_nextMoved=null;_nextIdentityChange=null;constructor(t,n){this.item=t,this.trackById=n}},Vf=class{_head=null;_tail=null;add(t){this._head===null?(this._head=this._tail=t,t._nextDup=null,t._prevDup=null):(this._tail._nextDup=t,t._prevDup=this._tail,t._nextDup=null,this._tail=t)}get(t,n){let r;for(r=this._head;r!==null;r=r._nextDup)if((n===null||n<=r.currentIndex)&&Object.is(r.trackById,t))return r;return null}remove(t){let n=t._prevDup,r=t._nextDup;return n===null?this._head=r:n._nextDup=r,r===null?this._tail=n:r._prevDup=n,this._head===null}},ga=class{map=new Map;put(t){let n=t.trackById,r=this.map.get(n);r||(r=new Vf,this.map.set(n,r)),r.add(t)}get(t,n){let r=t,o=this.map.get(r);return o?o.get(t,n):null}remove(t){let n=t.trackById;return this.map.get(n).remove(t)&&this.map.delete(n),t}get isEmpty(){return this.map.size===0}clear(){this.map.clear()}};function w1(e,t,n){let r=e.previousIndex;if(r===null)return r;let o=0;return n&&r{if(n&&n.key===o)this._maybeAddToChanges(n,r),this._appendAfter=n,n=n._next;else{let i=this._getOrCreateRecordForKey(o,r);n=this._insertBeforeOrAppend(n,i)}}),n){n._prev&&(n._prev._next=null),this._removalsHead=n;for(let r=n;r!==null;r=r._nextRemoved)r===this._mapHead&&(this._mapHead=null),this._records.delete(r.key),r._nextRemoved=r._next,r.previousValue=r.currentValue,r.currentValue=null,r._prev=null,r._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(t,n){if(t){let r=t._prev;return n._next=t,n._prev=r,t._prev=n,r&&(r._next=n),t===this._mapHead&&(this._mapHead=n),this._appendAfter=t,t}return this._appendAfter?(this._appendAfter._next=n,n._prev=this._appendAfter):this._mapHead=n,this._appendAfter=n,null}_getOrCreateRecordForKey(t,n){if(this._records.has(t)){let o=this._records.get(t);this._maybeAddToChanges(o,n);let i=o._prev,s=o._next;return i&&(i._next=s),s&&(s._prev=i),o._next=null,o._prev=null,o}let r=new Uf(t);return this._records.set(t,r),r.currentValue=n,this._addToAdditions(r),r}_reset(){if(this.isDirty){let t;for(this._previousMapHead=this._mapHead,t=this._previousMapHead;t!==null;t=t._next)t._nextPrevious=t._next;for(t=this._changesHead;t!==null;t=t._nextChanged)t.previousValue=t.currentValue;for(t=this._additionsHead;t!=null;t=t._nextAdded)t.previousValue=t.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(t,n){Object.is(n,t.currentValue)||(t.previousValue=t.currentValue,t.currentValue=n,this._addToChanges(t))}_addToAdditions(t){this._additionsHead===null?this._additionsHead=this._additionsTail=t:(this._additionsTail._nextAdded=t,this._additionsTail=t)}_addToChanges(t){this._changesHead===null?this._changesHead=this._changesTail=t:(this._changesTail._nextChanged=t,this._changesTail=t)}_forEach(t,n){t instanceof Map?t.forEach(n):Object.keys(t).forEach(r=>n(t[r],r))}},Uf=class{key;previousValue=null;currentValue=null;_nextPrevious=null;_next=null;_prev=null;_nextAdded=null;_nextRemoved=null;_nextChanged=null;constructor(t){this.key=t}};function x1(){return new Gf([new Lf])}var Gf=(()=>{class e{factories;static \u0275prov=T({token:e,providedIn:"root",factory:x1});constructor(n){this.factories=n}static create(n,r){if(r!=null){let o=r.factories.slice();n=n.concat(o)}return new e(n)}static extend(n){return{provide:e,useFactory:()=>{let r=b(e,{optional:!0,skipSelf:!0});return e.create(n,r||x1())}}}find(n){let r=this.factories.find(o=>o.supports(n));if(r!=null)return r;throw new D(901,!1)}}return e})();function I1(){return new ma([new Hf])}var ma=(()=>{class e{static \u0275prov=T({token:e,providedIn:"root",factory:I1});factories;constructor(n){this.factories=n}static create(n,r){if(r){let o=r.factories.slice();n=n.concat(o)}return new e(n)}static extend(n){return{provide:e,useFactory:()=>{let r=b(e,{optional:!0,skipSelf:!0});return e.create(n,r||I1())}}}find(n){let r=this.factories.find(o=>o.supports(n));if(r)return r;throw new D(901,!1)}}return e})();var N1=(()=>{class e{constructor(n){}static \u0275fac=function(r){return new(r||e)(A(co))};static \u0275mod=Kt({type:e});static \u0275inj=It({})}return e})();function k1(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:o}=e;Y(q.BootstrapApplicationStart);try{let i=o?.injector??Y2(r),s=[y1(),Zg,...n||[]],u=new bi({providers:s,parent:i,debugName:"",runEnvironmentInitializers:!1});return q2({r3Injector:u.injector,platformInjector:i,rootComponent:t})}catch(i){return Promise.reject(i)}finally{Y(q.BootstrapApplicationEnd)}}function tT(e){return typeof e=="boolean"?e:e!=null&&e!=="false"}function nT(e,t=NaN){return!isNaN(parseFloat(e))&&!isNaN(Number(e))?Number(e):t}var Of=Symbol("NOT_SET"),R1=new Set,rT=P(M({},Oo),{kind:"afterRenderEffectPhase",consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:Of,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase(cn(c),c.value),c.signal[se]=c,c.registerCleanupFn=l=>(c.cleanup??=new Set).add(l),this.nodes[u]=c,this.hooks[u]=l=>c.phaseFn(l)}}afterRun(){super.afterRun(),this.lastPhase=null}destroy(){if(this.onDestroyFns!==null)for(let t of this.onDestroyFns)t();super.destroy();for(let t of this.nodes)if(t)try{for(let n of t.cleanup??R1)n()}finally{dn(t)}}};function V7(e,t){let n=t?.injector??b(me),r=n.get(wt),o=n.get(Uu),i=n.get(ft,null,{optional:!0});o.impl??=n.get(Kd);let s=e;typeof s=="function"&&(s={mixedReadWrite:e});let u=n.get(Yr,null,{optional:!0}),a=new zf(o.impl,[s.earlyRead,s.write,s.mixedReadWrite,s.read],u?.view,r,n,i?.snapshot(null));return o.impl.register(a),a}function H7(e,t){let n=Tt(e),r=t.elementInjector||$r();return new Mn(n).create(r,t.projectableNodes,t.hostElement,t.environmentInjector,t.directives,t.bindings)}function $7(e){let t=Tt(e);if(!t)return null;let n=new Mn(t);return{get selector(){return n.selector},get type(){return n.componentType},get inputs(){return n.inputs},get outputs(){return n.outputs},get ngContentSelectors(){return n.ngContentSelectors},get isStandalone(){return t.standalone},get isSignal(){return t.signals}}}var bo={};xr(bo,{appendToAll:()=>sT,createThemeStyles:()=>uT,merge:()=>iT,structuralStyles:()=>aT,toProp:()=>qe});var oT=` @@ -436,4 +436,4 @@ ${n.map((r,o)=>`${o+1}) ${r.toString()}`).join(` `;break;default:}return r};So.prototype.render=function(e,t,n){let r="",o=this.rules;for(let i=0,s=e.length;i=0&&(r=this.attrs[n][1]),r};Mo.prototype.attrJoin=function(t,n){let r=this.attrIndex(t);r<0?this.attrPush([t,n]):this.attrs[r][1]=this.attrs[r][1]+" "+n};var sn=Mo;function hD(e,t,n){this.src=e,this.env=n,this.tokens=[],this.inlineMode=!1,this.md=t}hD.prototype.Token=sn;var gD=hD;var JM=/\r\n?|\n/g,XM=/\0/g;function ph(e){let t;t=e.src.replace(JM,` `),t=t.replace(XM,"\uFFFD"),e.src=t}function hh(e){let t;e.inlineMode?(t=new e.Token("inline","",0),t.content=e.src,t.map=[0,1],t.children=[],e.tokens.push(t)):e.md.block.parse(e.src,e.md,e.env,e.tokens)}function gh(e){let t=e.tokens;for(let n=0,r=t.length;n\s]/i.test(e)}function tA(e){return/^<\/a\s*>/i.test(e)}function mh(e){let t=e.tokens;if(e.md.options.linkify)for(let n=0,r=t.length;n=0;s--){let u=o[s];if(u.type==="link_close"){for(s--;o[s].level!==u.level&&o[s].type!=="link_open";)s--;continue}if(u.type==="html_inline"&&(eA(u.content)&&i>0&&i--,tA(u.content)&&i++),!(i>0)&&u.type==="text"&&e.md.linkify.test(u.content)){let a=u.content,c=e.md.linkify.match(a),l=[],d=u.level,h=0;c.length>0&&c[0].index===0&&s>0&&o[s-1].type==="text_special"&&(c=c.slice(1));for(let f=0;fh){let N=new e.Token("text","",0);N.content=a.slice(h,y),N.level=d,l.push(N)}let v=new e.Token("link_open","a",1);v.attrs=[["href",m]],v.level=d++,v.markup="linkify",v.info="auto",l.push(v);let _=new e.Token("text","",0);_.content=g,_.level=d,l.push(_);let E=new e.Token("link_close","a",-1);E.level=--d,E.markup="linkify",E.info="auto",l.push(E),h=c[f].lastIndex}if(h=0;n--){let r=e[n];r.type==="text"&&!t&&(r.content=r.content.replace(rA,iA)),r.type==="link_open"&&r.info==="auto"&&t--,r.type==="link_close"&&r.info==="auto"&&t++}}function uA(e){let t=0;for(let n=e.length-1;n>=0;n--){let r=e[n];r.type==="text"&&!t&&mD.test(r.content)&&(r.content=r.content.replace(/\+-/g,"\xB1").replace(/\.{2,}/g,"\u2026").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---(?=[^-]|$)/mg,"$1\u2014").replace(/(^|\s)--(?=\s|$)/mg,"$1\u2013").replace(/(^|[^-\s])--(?=[^-\s]|$)/mg,"$1\u2013")),r.type==="link_open"&&r.info==="auto"&&t--,r.type==="link_close"&&r.info==="auto"&&t++}}function yh(e){let t;if(e.md.options.typographer)for(t=e.tokens.length-1;t>=0;t--)e.tokens[t].type==="inline"&&(nA.test(e.tokens[t].content)&&sA(e.tokens[t].children),mD.test(e.tokens[t].content)&&uA(e.tokens[t].children))}var aA=/['"]/,yD=/['"]/g,bD="\u2019";function ic(e,t,n){return e.slice(0,t)+n+e.slice(t+1)}function cA(e,t){let n,r=[];for(let o=0;o=0&&!(r[n].level<=s);n--);if(r.length=n+1,i.type!=="text")continue;let u=i.content,a=0,c=u.length;e:for(;a=0)p=u.charCodeAt(l.index-1);else for(n=o-1;n>=0&&!(e[n].type==="softbreak"||e[n].type==="hardbreak");n--)if(e[n].content){p=e[n].content.charCodeAt(e[n].content.length-1);break}let m=32;if(a=48&&p<=57&&(h=d=!1),d&&h&&(d=g,h=y),!d&&!h){f&&(i.content=ic(i.content,l.index,bD));continue}if(h)for(n=r.length-1;n>=0;n--){let E=r[n];if(r[n].level=0;t--)e.tokens[t].type!=="inline"||!aA.test(e.tokens[t].content)||cA(e.tokens[t].children,e)}function vh(e){let t,n,r=e.tokens,o=r.length;for(let i=0;i0&&this.level++,this.tokens.push(r),r};Ot.prototype.isEmpty=function(t){return this.bMarks[t]+this.tShift[t]>=this.eMarks[t]};Ot.prototype.skipEmptyLines=function(t){for(let n=this.lineMax;tn;)if(!H(this.src.charCodeAt(--t)))return t+1;return t};Ot.prototype.skipChars=function(t,n){for(let r=this.src.length;tr;)if(n!==this.src.charCodeAt(--t))return t+1;return t};Ot.prototype.getLines=function(t,n,r,o){if(t>=n)return"";let i=new Array(n-t);for(let s=0,u=t;ur?i[s]=new Array(a-r+1).join(" ")+this.src.slice(l,d):i[s]=this.src.slice(l,d)}return i.join("")};Ot.prototype.Token=sn;var DD=Ot;var lA=65536;function Ch(e,t){let n=e.bMarks[t]+e.tShift[t],r=e.eMarks[t];return e.src.slice(n,r)}function ED(e){let t=[],n=e.length,r=0,o=e.charCodeAt(r),i=!1,s=0,u="";for(;rn)return!1;let o=t+1;if(e.sCount[o]=4)return!1;let i=e.bMarks[o]+e.tShift[o];if(i>=e.eMarks[o])return!1;let s=e.src.charCodeAt(i++);if(s!==124&&s!==45&&s!==58||i>=e.eMarks[o])return!1;let u=e.src.charCodeAt(i++);if(u!==124&&u!==45&&u!==58&&!H(u)||s===45&&H(u))return!1;for(;i=4)return!1;c=ED(a),c.length&&c[0]===""&&c.shift(),c.length&&c[c.length-1]===""&&c.pop();let d=c.length;if(d===0||d!==l.length)return!1;if(r)return!0;let h=e.parentType;e.parentType="table";let f=e.md.block.ruler.getRules("blockquote"),p=e.push("table_open","table",1),m=[t,0];p.map=m;let g=e.push("thead_open","thead",1);g.map=[t,t+1];let y=e.push("tr_open","tr",1);y.map=[t,t+1];for(let E=0;E=4||(c=ED(a),c.length&&c[0]===""&&c.shift(),c.length&&c[c.length-1]===""&&c.pop(),_+=d-c.length,_>lA))break;if(o===t+2){let C=e.push("tbody_open","tbody",1);C.map=v=[t+2,0]}let N=e.push("tr_open","tr",1);N.map=[o,o+1];for(let C=0;C=4){r++,o=r;continue}break}e.line=o;let i=e.push("code_block","code",0);return i.content=e.getLines(t,o,4+e.blkIndent,!1)+` `,i.map=[t,e.line],!0}function xh(e,t,n,r){let o=e.bMarks[t]+e.tShift[t],i=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4||o+3>i)return!1;let s=e.src.charCodeAt(o);if(s!==126&&s!==96)return!1;let u=o;o=e.skipChars(o,s);let a=o-u;if(a<3)return!1;let c=e.src.slice(u,o),l=e.src.slice(o,i);if(s===96&&l.indexOf(String.fromCharCode(s))>=0)return!1;if(r)return!0;let d=t,h=!1;for(;d++,!(d>=n||(o=u=e.bMarks[d]+e.tShift[d],i=e.eMarks[d],o=4)&&(o=e.skipChars(o,s),!(o-u=4||e.src.charCodeAt(o)!==62)return!1;if(r)return!0;let u=[],a=[],c=[],l=[],d=e.md.block.ruler.getRules("blockquote"),h=e.parentType;e.parentType="blockquote";let f=!1,p;for(p=t;p=i)break;if(e.src.charCodeAt(o++)===62&&!_){let N=e.sCount[p]+1,C,k;e.src.charCodeAt(o)===32?(o++,N++,k=!1,C=!0):e.src.charCodeAt(o)===9?(C=!0,(e.bsCount[p]+N)%4===3?(o++,N++,k=!1):k=!0):C=!1;let O=N;for(u.push(e.bMarks[p]),e.bMarks[p]=o;o=i,a.push(e.bsCount[p]),e.bsCount[p]=e.sCount[p]+1+(C?1:0),c.push(e.sCount[p]),e.sCount[p]=O-N,l.push(e.tShift[p]),e.tShift[p]=o-e.bMarks[p];continue}if(f)break;let E=!1;for(let N=0,C=d.length;N";let y=[t,0];g.map=y,e.md.block.tokenize(e,t,p);let v=e.push("blockquote_close","blockquote",-1);v.markup=">",e.lineMax=s,e.parentType=h,y[1]=e.line;for(let _=0;_=4)return!1;let i=e.bMarks[t]+e.tShift[t],s=e.src.charCodeAt(i++);if(s!==42&&s!==45&&s!==95)return!1;let u=1;for(;i=r)return-1;let i=e.src.charCodeAt(o++);if(i<48||i>57)return-1;for(;;){if(o>=r)return-1;if(i=e.src.charCodeAt(o++),i>=48&&i<=57){if(o-n>=10)return-1;continue}if(i===41||i===46)break;return-1}return o=4||e.listIndent>=0&&e.sCount[a]-e.listIndent>=4&&e.sCount[a]=e.blkIndent&&(l=!0);let d,h,f;if((f=_D(e,a))>=0){if(d=!0,s=e.bMarks[a]+e.tShift[a],h=Number(e.src.slice(s,f-1)),l&&h!==1)return!1}else if((f=CD(e,a))>=0)d=!1;else return!1;if(l&&e.skipSpaces(f)>=e.eMarks[a])return!1;if(r)return!0;let p=e.src.charCodeAt(f-1),m=e.tokens.length;d?(u=e.push("ordered_list_open","ol",1),h!==1&&(u.attrs=[["start",h]])):u=e.push("bullet_list_open","ul",1);let g=[a,0];u.map=g,u.markup=String.fromCharCode(p);let y=!1,v=e.md.block.ruler.getRules("list"),_=e.parentType;for(e.parentType="list";a=o?k=1:k=N-E,k>4&&(k=1);let O=E+k;u=e.push("list_item_open","li",1),u.markup=String.fromCharCode(p);let te=[a,0];u.map=te,d&&(u.info=e.src.slice(s,f-1));let bt=e.tight,No=e.tShift[a],es=e.sCount[a],QD=e.listIndent;if(e.listIndent=e.blkIndent,e.blkIndent=O,e.tight=!0,e.tShift[a]=C-e.bMarks[a],e.sCount[a]=N,C>=o&&e.isEmpty(a+1)?e.line=Math.min(e.line+2,n):e.md.block.tokenize(e,a,n,!0),(!e.tight||y)&&(c=!1),y=e.line-a>1&&e.isEmpty(e.line-1),e.blkIndent=e.listIndent,e.listIndent=QD,e.tShift[a]=No,e.sCount[a]=es,e.tight=bt,u=e.push("list_item_close","li",-1),u.markup=String.fromCharCode(p),a=e.line,te[1]=a,a>=n||e.sCount[a]=4)break;let i0=!1;for(let wr=0,KD=v.length;wr=4||e.src.charCodeAt(o)!==91)return!1;function u(v){let _=e.lineMax;if(v>=_||e.isEmpty(v))return null;let E=!1;if(e.sCount[v]-e.blkIndent>3&&(E=!0),e.sCount[v]<0&&(E=!0),!E){let k=e.md.block.ruler.getRules("reference"),O=e.parentType;e.parentType="reference";let te=!1;for(let bt=0,No=k.length;bt"u"&&(e.env.references={}),typeof e.env.references[y]>"u"&&(e.env.references[y]={title:g,href:d}),e.line=s),!0):!1}var wD=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"];var fA="[a-zA-Z_:][a-zA-Z0-9:._-]*",pA="[^\"'=<>`\\x00-\\x20]+",hA="'[^']*'",gA='"[^"]*"',mA="(?:"+pA+"|"+hA+"|"+gA+")",yA="(?:\\s+"+fA+"(?:\\s*=\\s*"+mA+")?)",xD="<[A-Za-z][A-Za-z0-9\\-]*"+yA+"*\\s*\\/?>",ID="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",bA="",vA="<[?][\\s\\S]*?[?]>",DA="]*>",EA="",TD=new RegExp("^(?:"+xD+"|"+ID+"|"+bA+"|"+vA+"|"+DA+"|"+EA+")"),SD=new RegExp("^(?:"+xD+"|"+ID+")");var Ao=[[/^<(script|pre|style|textarea)(?=(\s|>|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(SD.source+"\\s*$"),/^$/,!1]];function Ah(e,t,n,r){let o=e.bMarks[t]+e.tShift[t],i=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4||!e.md.options.html||e.src.charCodeAt(o)!==60)return!1;let s=e.src.slice(o,i),u=0;for(;u=4)return!1;let s=e.src.charCodeAt(o);if(s!==35||o>=i)return!1;let u=1;for(s=e.src.charCodeAt(++o);s===35&&o6||oo&&H(e.src.charCodeAt(a-1))&&(i=a),e.line=t+1;let c=e.push("heading_open","h"+String(u),1);c.markup="########".slice(0,u),c.map=[t,e.line];let l=e.push("inline","",0);l.content=e.src.slice(o,i).trim(),l.map=[t,e.line],l.children=[];let d=e.push("heading_close","h"+String(u),-1);return d.markup="########".slice(0,u),!0}function kh(e,t,n){let r=e.md.block.ruler.getRules("paragraph");if(e.sCount[t]-e.blkIndent>=4)return!1;let o=e.parentType;e.parentType="paragraph";let i=0,s,u=t+1;for(;u3)continue;if(e.sCount[u]>=e.blkIndent){let f=e.bMarks[u]+e.tShift[u],p=e.eMarks[u];if(f=p))){i=s===61?1:2;break}}if(e.sCount[u]<0)continue;let h=!1;for(let f=0,p=r.length;f3||e.sCount[i]<0)continue;let c=!1;for(let l=0,d=r.length;l=n||e.sCount[s]=i){e.line=n;break}let a=e.line,c=!1;for(let l=0;l=e.line)throw new Error("block rule didn't increment state.line");break}if(!c)throw new Error("none of the block rules matched");e.tight=!u,e.isEmpty(e.line-1)&&(u=!0),s=e.line,s0&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],o={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(r),this.tokens_meta.push(o),r};Ji.prototype.scanDelims=function(e,t){let n=this.posMax,r=this.src.charCodeAt(e),o=e>0?this.src.charCodeAt(e-1):32,i=e;for(;i0)return!1;let n=e.pos,r=e.posMax;if(n+3>r||e.src.charCodeAt(n)!==58||e.src.charCodeAt(n+1)!==47||e.src.charCodeAt(n+2)!==47)return!1;let o=e.pending.match(_A);if(!o)return!1;let i=o[1],s=e.md.linkify.matchAtStart(e.src.slice(n-i.length));if(!s)return!1;let u=s.url;if(u.length<=i.length)return!1;let a=u.length;for(;a>0&&u.charCodeAt(a-1)===42;)a--;a!==u.length&&(u=u.slice(0,a));let c=e.md.normalizeLink(u);if(!e.md.validateLink(c))return!1;if(!t){e.pending=e.pending.slice(0,-i.length);let l=e.push("link_open","a",1);l.attrs=[["href",c]],l.markup="linkify",l.info="auto";let d=e.push("text","",0);d.content=e.md.normalizeLinkText(u);let h=e.push("link_close","a",-1);h.markup="linkify",h.info="auto"}return e.pos+=u.length-i.length,!0}function Ph(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==10)return!1;let r=e.pending.length-1,o=e.posMax;if(!t)if(r>=0&&e.pending.charCodeAt(r)===32)if(r>=1&&e.pending.charCodeAt(r-1)===32){let i=r-1;for(;i>=1&&e.pending.charCodeAt(i-1)===32;)i--;e.pending=e.pending.slice(0,i),e.push("hardbreak","br",0)}else e.pending=e.pending.slice(0,-1),e.push("softbreak","br",0);else e.push("softbreak","br",0);for(n++;n?@[]^_`{|}~-".split("").forEach(function(e){Lh[e.charCodeAt(0)]=1});function jh(e,t){let n=e.pos,r=e.posMax;if(e.src.charCodeAt(n)!==92||(n++,n>=r))return!1;let o=e.src.charCodeAt(n);if(o===10){for(t||e.push("hardbreak","br",0),n++;n=55296&&o<=56319&&n+1=56320&&u<=57343&&(i+=e.src[n+1],n++)}let s="\\"+i;if(!t){let u=e.push("text_special","",0);o<256&&Lh[o]!==0?u.content=i:u.content=s,u.markup=s,u.info="escape"}return e.pos=n+1,!0}function Bh(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==96)return!1;let o=n;n++;let i=e.posMax;for(;n=0;r--){let o=t[r];if(o.marker!==95&&o.marker!==42||o.end===-1)continue;let i=t[o.end],s=r>0&&t[r-1].end===o.end+1&&t[r-1].marker===o.marker&&t[r-1].token===o.token-1&&t[o.end+1].token===i.token+1,u=String.fromCharCode(o.marker),a=e.tokens[o.token];a.type=s?"strong_open":"em_open",a.tag=s?"strong":"em",a.nesting=1,a.markup=s?u+u:u,a.content="";let c=e.tokens[i.token];c.type=s?"strong_close":"em_close",c.tag=s?"strong":"em",c.nesting=-1,c.markup=s?u+u:u,c.content="",s&&(e.tokens[t[r-1].token].content="",e.tokens[t[o.end+1].token].content="",r--)}}function TA(e){let t=e.tokens_meta,n=e.tokens_meta.length;kD(e,e.delimiters);for(let r=0;r=d)return!1;if(a=p,o=e.md.helpers.parseLinkDestination(e.src,p,e.posMax),o.ok){for(s=e.md.normalizeLink(o.str),e.md.validateLink(s)?p=o.pos:s="",a=p;p=d||e.src.charCodeAt(p)!==41)&&(c=!0),p++}if(c){if(typeof e.env.references>"u")return!1;if(p=0?r=e.src.slice(a,p++):p=f+1):p=f+1,r||(r=e.src.slice(h,f)),i=e.env.references[Cr(r)],!i)return e.pos=l,!1;s=i.href,u=i.title}if(!t){e.pos=h,e.posMax=f;let m=e.push("link_open","a",1),g=[["href",s]];m.attrs=g,u&&g.push(["title",u]),e.linkLevel++,e.md.inline.tokenize(e),e.linkLevel--,e.push("link_close","a",-1)}return e.pos=p,e.posMax=d,!0}function Uh(e,t){let n,r,o,i,s,u,a,c,l="",d=e.pos,h=e.posMax;if(e.src.charCodeAt(e.pos)!==33||e.src.charCodeAt(e.pos+1)!==91)return!1;let f=e.pos+2,p=e.md.helpers.parseLinkLabel(e,e.pos+1,!1);if(p<0)return!1;if(i=p+1,i=h)return!1;for(c=i,u=e.md.helpers.parseLinkDestination(e.src,i,e.posMax),u.ok&&(l=e.md.normalizeLink(u.str),e.md.validateLink(l)?i=u.pos:l=""),c=i;i=h||e.src.charCodeAt(i)!==41)return e.pos=d,!1;i++}else{if(typeof e.env.references>"u")return!1;if(i=0?o=e.src.slice(c,i++):i=p+1):i=p+1,o||(o=e.src.slice(f,p)),s=e.env.references[Cr(o)],!s)return e.pos=d,!1;l=s.href,a=s.title}if(!t){r=e.src.slice(f,p);let m=[];e.md.inline.parse(r,e.md,e.env,m);let g=e.push("image","img",0),y=[["src",l],["alt",""]];g.attrs=y,g.children=m,g.content=r,a&&y.push(["title",a])}return e.pos=i,e.posMax=h,!0}var SA=/^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/,MA=/^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\x00-\x20]*)$/;function zh(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==60)return!1;let r=e.pos,o=e.posMax;for(;;){if(++n>=o)return!1;let s=e.src.charCodeAt(n);if(s===60)return!1;if(s===62)break}let i=e.src.slice(r+1,n);if(MA.test(i)){let s=e.md.normalizeLink(i);if(!e.md.validateLink(s))return!1;if(!t){let u=e.push("link_open","a",1);u.attrs=[["href",s]],u.markup="autolink",u.info="auto";let a=e.push("text","",0);a.content=e.md.normalizeLinkText(i);let c=e.push("link_close","a",-1);c.markup="autolink",c.info="auto"}return e.pos+=i.length+2,!0}if(SA.test(i)){let s=e.md.normalizeLink("mailto:"+i);if(!e.md.validateLink(s))return!1;if(!t){let u=e.push("link_open","a",1);u.attrs=[["href",s]],u.markup="autolink",u.info="auto";let a=e.push("text","",0);a.content=e.md.normalizeLinkText(i);let c=e.push("link_close","a",-1);c.markup="autolink",c.info="auto"}return e.pos+=i.length+2,!0}return!1}function AA(e){return/^\s]/i.test(e)}function NA(e){return/^<\/a\s*>/i.test(e)}function kA(e){let t=e|32;return t>=97&&t<=122}function qh(e,t){if(!e.md.options.html)return!1;let n=e.posMax,r=e.pos;if(e.src.charCodeAt(r)!==60||r+2>=n)return!1;let o=e.src.charCodeAt(r+1);if(o!==33&&o!==63&&o!==47&&!kA(o))return!1;let i=e.src.slice(r).match(TD);if(!i)return!1;if(!t){let s=e.push("html_inline","",0);s.content=i[0],AA(s.content)&&e.linkLevel++,NA(s.content)&&e.linkLevel--}return e.pos+=i[0].length,!0}var RA=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,FA=/^&([a-z][a-z0-9]{1,31});/i;function Gh(e,t){let n=e.pos,r=e.posMax;if(e.src.charCodeAt(n)!==38||n+1>=r)return!1;if(e.src.charCodeAt(n+1)===35){let i=e.src.slice(n).match(RA);if(i){if(!t){let s=i[1][0].toLowerCase()==="x"?parseInt(i[1].slice(1),16):parseInt(i[1],10),u=e.push("text_special","",0);u.content=oc(s)?Ki(s):Ki(65533),u.markup=i[0],u.info="entity"}return e.pos+=i[0].length,!0}}else{let i=e.src.slice(n).match(FA);if(i){let s=Fn(i[0]);if(s!==i[0]){if(!t){let u=e.push("text_special","",0);u.content=s,u.markup=i[0],u.info="entity"}return e.pos+=i[0].length,!0}}}return!1}function RD(e){let t={},n=e.length;if(!n)return;let r=0,o=-2,i=[];for(let s=0;sa;c-=i[c]+1){let d=e[c];if(d.marker===u.marker&&d.open&&d.end<0){let h=!1;if((d.close||u.open)&&(d.length+u.length)%3===0&&(d.length%3!==0||u.length%3!==0)&&(h=!0),!h){let f=c>0&&!e[c-1].open?i[c-1]+1:0;i[s]=s-c+f,i[c]=f,u.open=!1,d.end=s,d.close=!1,l=-1,o=-2;break}}}l!==-1&&(t[u.marker][(u.open?3:0)+(u.length||0)%3]=l)}}function Wh(e){let t=e.tokens_meta,n=e.tokens_meta.length;RD(e.delimiters);for(let r=0;r0&&r++,o[t].type==="text"&&t+1=e.pos)throw new Error("inline rule didn't increment state.pos");break}}else e.pos=e.posMax;s||e.pos++,i[t]=e.pos};Xi.prototype.tokenize=function(e){let t=this.ruler.getRules(""),n=t.length,r=e.posMax,o=e.md.options.maxNesting;for(;e.pos=e.pos)throw new Error("inline rule didn't increment state.pos");break}}if(s){if(e.pos>=r)break;continue}e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()};Xi.prototype.parse=function(e,t,n,r){let o=new this.State(e,t,n,r);this.tokenize(o);let i=this.ruler2.getRules(""),s=i.length;for(let u=0;u|$))",t.tpl_email_fuzzy="(^|"+n+'|"|\\(|'+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+t.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+t.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t}function Kh(e){return Array.prototype.slice.call(arguments,1).forEach(function(n){n&&Object.keys(n).forEach(function(r){e[r]=n[r]})}),e}function cc(e){return Object.prototype.toString.call(e)}function OA(e){return cc(e)==="[object String]"}function PA(e){return cc(e)==="[object Object]"}function LA(e){return cc(e)==="[object RegExp]"}function PD(e){return cc(e)==="[object Function]"}function jA(e){return e.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}var jD={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1};function BA(e){return Object.keys(e||{}).reduce(function(t,n){return t||jD.hasOwnProperty(n)},!1)}var VA={"http:":{validate:function(e,t,n){let r=e.slice(t);return n.re.http||(n.re.http=new RegExp("^\\/\\/"+n.re.src_auth+n.re.src_host_port_strict+n.re.src_path,"i")),n.re.http.test(r)?r.match(n.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(e,t,n){let r=e.slice(t);return n.re.no_http||(n.re.no_http=new RegExp("^"+n.re.src_auth+"(?:localhost|(?:(?:"+n.re.src_domain+")\\.)+"+n.re.src_domain_root+")"+n.re.src_port+n.re.src_host_terminator+n.re.src_path,"i")),n.re.no_http.test(r)?t>=3&&e[t-3]===":"||t>=3&&e[t-3]==="/"?0:r.match(n.re.no_http)[0].length:0}},"mailto:":{validate:function(e,t,n){let r=e.slice(t);return n.re.mailto||(n.re.mailto=new RegExp("^"+n.re.src_email_name+"@"+n.re.src_host_strict,"i")),n.re.mailto.test(r)?r.match(n.re.mailto)[0].length:0}}},HA="a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]",$A="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444".split("|");function UA(e){e.__index__=-1,e.__text_cache__=""}function zA(e){return function(t,n){let r=t.slice(n);return e.test(r)?r.match(e)[0].length:0}}function LD(){return function(e,t){t.normalize(e)}}function ac(e){let t=e.re=OD(e.__opts__),n=e.__tlds__.slice();e.onCompile(),e.__tlds_replaced__||n.push(HA),n.push(t.src_xn),t.src_tlds=n.join("|");function r(u){return u.replace("%TLDS%",t.src_tlds)}t.email_fuzzy=RegExp(r(t.tpl_email_fuzzy),"i"),t.link_fuzzy=RegExp(r(t.tpl_link_fuzzy),"i"),t.link_no_ip_fuzzy=RegExp(r(t.tpl_link_no_ip_fuzzy),"i"),t.host_fuzzy_test=RegExp(r(t.tpl_host_fuzzy_test),"i");let o=[];e.__compiled__={};function i(u,a){throw new Error('(LinkifyIt) Invalid schema "'+u+'": '+a)}Object.keys(e.__schemas__).forEach(function(u){let a=e.__schemas__[u];if(a===null)return;let c={validate:null,link:null};if(e.__compiled__[u]=c,PA(a)){LA(a.validate)?c.validate=zA(a.validate):PD(a.validate)?c.validate=a.validate:i(u,a),PD(a.normalize)?c.normalize=a.normalize:a.normalize?i(u,a):c.normalize=LD();return}if(OA(a)){o.push(u);return}i(u,a)}),o.forEach(function(u){e.__compiled__[e.__schemas__[u]]&&(e.__compiled__[u].validate=e.__compiled__[e.__schemas__[u]].validate,e.__compiled__[u].normalize=e.__compiled__[e.__schemas__[u]].normalize)}),e.__compiled__[""]={validate:null,normalize:LD()};let s=Object.keys(e.__compiled__).filter(function(u){return u.length>0&&e.__compiled__[u]}).map(jA).join("|");e.re.schema_test=RegExp("(^|(?!_)(?:[><\uFF5C]|"+t.src_ZPCc+"))("+s+")","i"),e.re.schema_search=RegExp("(^|(?!_)(?:[><\uFF5C]|"+t.src_ZPCc+"))("+s+")","ig"),e.re.schema_at_start=RegExp("^"+e.re.schema_search.source,"i"),e.re.pretest=RegExp("("+e.re.schema_test.source+")|("+e.re.host_fuzzy_test.source+")|@","i"),UA(e)}function qA(e,t){let n=e.__index__,r=e.__last_index__,o=e.__text_cache__.slice(n,r);this.schema=e.__schema__.toLowerCase(),this.index=n+t,this.lastIndex=r+t,this.raw=o,this.text=o,this.url=o}function Jh(e,t){let n=new qA(e,t);return e.__compiled__[n.schema].normalize(n,e),n}function Ge(e,t){if(!(this instanceof Ge))return new Ge(e,t);t||BA(e)&&(t=e,e={}),this.__opts__=Kh({},jD,t),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=Kh({},VA,e),this.__compiled__={},this.__tlds__=$A,this.__tlds_replaced__=!1,this.re={},ac(this)}Ge.prototype.add=function(t,n){return this.__schemas__[t]=n,ac(this),this};Ge.prototype.set=function(t){return this.__opts__=Kh(this.__opts__,t),this};Ge.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;let n,r,o,i,s,u,a,c,l;if(this.re.schema_test.test(t)){for(a=this.re.schema_search,a.lastIndex=0;(n=a.exec(t))!==null;)if(i=this.testSchemaAt(t,n[2],a.lastIndex),i){this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+i;break}}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(c=t.search(this.re.host_fuzzy_test),c>=0&&(this.__index__<0||c=0&&(o=t.match(this.re.email_fuzzy))!==null&&(s=o.index+o[1].length,u=o.index+o[0].length,(this.__index__<0||sthis.__last_index__)&&(this.__schema__="mailto:",this.__index__=s,this.__last_index__=u))),this.__index__>=0};Ge.prototype.pretest=function(t){return this.re.pretest.test(t)};Ge.prototype.testSchemaAt=function(t,n,r){return this.__compiled__[n.toLowerCase()]?this.__compiled__[n.toLowerCase()].validate(t,r,this):0};Ge.prototype.match=function(t){let n=[],r=0;this.__index__>=0&&this.__text_cache__===t&&(n.push(Jh(this,r)),r=this.__last_index__);let o=r?t.slice(r):t;for(;this.test(o);)n.push(Jh(this,r)),o=o.slice(this.__last_index__),r+=this.__last_index__;return n.length?n:null};Ge.prototype.matchAtStart=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return null;let n=this.re.schema_at_start.exec(t);if(!n)return null;let r=this.testSchemaAt(t,n[2],n[0].length);return r?(this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+r,Jh(this,0)):null};Ge.prototype.tlds=function(t,n){return t=Array.isArray(t)?t:[t],n?(this.__tlds__=this.__tlds__.concat(t).sort().filter(function(r,o,i){return r!==i[o-1]}).reverse(),ac(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,ac(this),this)};Ge.prototype.normalize=function(t){t.schema||(t.url="http://"+t.url),t.schema==="mailto:"&&!/^mailto:/i.test(t.url)&&(t.url="mailto:"+t.url)};Ge.prototype.onCompile=function(){};var BD=Ge;var GA=/^xn--/,WA=/[^\0-\x7F]/,ZA=/[\x2E\u3002\uFF0E\uFF61]/g,YA={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},Xh=35,Pt=Math.floor,e0=String.fromCharCode;function On(e){throw new RangeError(YA[e])}function QA(e,t){let n=[],r=e.length;for(;r--;)n[r]=t(e[r]);return n}function HD(e,t){let n=e.split("@"),r="";n.length>1&&(r=n[0]+"@",e=n[1]),e=e.replace(ZA,".");let o=e.split("."),i=QA(o,t).join(".");return r+i}function $D(e){let t=[],n=0,r=e.length;for(;n=55296&&o<=56319&&nString.fromCodePoint(...e),JA=function(e){return e>=48&&e<58?26+(e-48):e>=65&&e<91?e-65:e>=97&&e<123?e-97:36},VD=function(e,t){return e+22+75*(e<26)-((t!=0)<<5)},UD=function(e,t,n){let r=0;for(e=n?Pt(e/700):e>>1,e+=Pt(e/t);e>Xh*26>>1;r+=36)e=Pt(e/Xh);return Pt(r+(Xh+1)*e/(e+38))},zD=function(e){let t=[],n=e.length,r=0,o=128,i=72,s=e.lastIndexOf("-");s<0&&(s=0);for(let u=0;u=128&&On("not-basic"),t.push(e.charCodeAt(u));for(let u=s>0?s+1:0;u=n&&On("invalid-input");let h=JA(e.charCodeAt(u++));h>=36&&On("invalid-input"),h>Pt((2147483647-r)/l)&&On("overflow"),r+=h*l;let f=d<=i?1:d>=i+26?26:d-i;if(hPt(2147483647/p)&&On("overflow"),l*=p}let c=t.length+1;i=UD(r-a,c,a==0),Pt(r/c)>2147483647-o&&On("overflow"),o+=Pt(r/c),r%=c,t.splice(r++,0,o)}return String.fromCodePoint(...t)},qD=function(e){let t=[];e=$D(e);let n=e.length,r=128,o=0,i=72;for(let a of e)a<128&&t.push(e0(a));let s=t.length,u=s;for(s&&t.push("-");u=r&&lPt((2147483647-o)/c)&&On("overflow"),o+=(a-r)*c,r=a;for(let l of e)if(l2147483647&&On("overflow"),l===r){let d=o;for(let h=36;;h+=36){let f=h<=i?1:h>=i+26?26:h-i;if(d=0))try{t.hostname=t0.toASCII(t.hostname)}catch(n){}return Za(xo(t))}function uN(e){let t=Qi(e,!0);if(t.hostname&&(!t.protocol||YD.indexOf(t.protocol)>=0))try{t.hostname=t0.toUnicode(t.hostname)}catch(n){}return Yi(xo(t),Yi.defaultChars+"%")}function Xe(e,t){if(!(this instanceof Xe))return new Xe(e,t);t||rc(e)||(t=e||{},e="default"),this.inline=new FD,this.block=new MD,this.core=new vD,this.renderer=new pD,this.linkify=new BD,this.validateLink=iN,this.normalizeLink=sN,this.normalizeLinkText=uN,this.utils=ah,this.helpers=To({},fh),this.options={},this.configure(e),t&&this.set(t)}Xe.prototype.set=function(e){return To(this.options,e),this};Xe.prototype.configure=function(e){let t=this;if(rc(e)){let n=e;if(e=nN[n],!e)throw new Error('Wrong `markdown-it` preset "'+n+'", check name')}if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(n){e.components[n].rules&&t[n].ruler.enableOnly(e.components[n].rules),e.components[n].rules2&&t[n].ruler2.enableOnly(e.components[n].rules2)}),this};Xe.prototype.enable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(o){n=n.concat(this[o].ruler.enable(e,!0))},this),n=n.concat(this.inline.ruler2.enable(e,!0));let r=e.filter(function(o){return n.indexOf(o)<0});if(r.length&&!t)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+r);return this};Xe.prototype.disable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(o){n=n.concat(this[o].ruler.disable(e,!0))},this),n=n.concat(this.inline.ruler2.disable(e,!0));let r=e.filter(function(o){return n.indexOf(o)<0});if(r.length&&!t)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+r);return this};Xe.prototype.use=function(e){let t=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,t),this};Xe.prototype.parse=function(e,t){if(typeof e!="string")throw new Error("Input data should be a String");let n=new this.core.State(e,this,t);return this.core.process(n),n.tokens};Xe.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)};Xe.prototype.parseInline=function(e,t){let n=new this.core.State(e,this,t);return n.inlineMode=!0,this.core.process(n),n.tokens};Xe.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};var n0=Xe;function aN(e,t){if(e&1&&po(0,0),e&2){let n=t.$implicit,r=Ni();lo("surfaceId",r.surfaceId())("component",n)}}function cN(e,t){if(e&1&&po(0,0),e&2){let n=t.$implicit,r=Ni();lo("surfaceId",r.surfaceId())("component",n)}}function lN(e,t){if(e&1&&po(0,0),e&2){Ni();let n=la(0),r=la(1);lo("surfaceId",n)("component",r.componentTree)}}var dN=new x("Catalog"),fN=(()=>{class e extends Q1.A2uiMessageProcessor{events=new he;setData(n,r,o,i){return super.setData(n,r,o,i??void 0)}dispatch(n){let r=new he;return this.events.next({message:n,completion:r}),Nc(r)}static \u0275fac=(()=>{let n;return function(o){return(n||(n=pr(e)))(o||e)}})();static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),pN=new x("Theme"),hN=0,r0=(()=>{class e{processor=b(fN);theme=b(pN);surfaceId=Pe.required();component=Pe.required();weight=Pe.required();sendAction(n){let r=this.component(),o=this.surfaceId()??void 0,i={};if(n.context){for(let u of n.context)if(u.value.literalBoolean)i[u.key]=u.value.literalBoolean;else if(u.value.literalNumber)i[u.key]=u.value.literalNumber;else if(u.value.literalString)i[u.key]=u.value.literalString;else if(u.value.path){let a=this.processor.resolvePath(u.value.path,r.dataContextPath),c=this.processor.getData(r,a,o);i[u.key]=c}}let s={userAction:{name:n.name,sourceComponentId:r.id,surfaceId:o,timestamp:new Date().toISOString(),context:i}};return this.processor.dispatch(s)}resolvePrimitive(n){let r=this.component(),o=this.surfaceId();return!n||typeof n!="object"?null:n.literal!=null?n.literal:n.path?this.processor.getData(r,n.path,o??void 0):"literalString"in n?n.literalString:"literalNumber"in n?n.literalNumber:"literalBoolean"in n?n.literalBoolean:null}getUniqueId(n){return`${n}-${hN++}`}static \u0275fac=function(r){return new(r||e)};static \u0275dir=ht({type:e,hostVars:2,hostBindings:function(r,o){r&2&&ua("--weight",o.weight())},inputs:{surfaceId:[1,"surfaceId"],component:[1,"component"],weight:[1,"weight"]}})}return e})(),o0=(()=>{class e{viewContainerRef=b(pt);catalog=b(dN);static hasInsertedStyles=!1;currentRef=null;isDestroyed=!1;surfaceId=Pe.required();component=Pe.required();constructor(){ai(()=>{let o=this.surfaceId(),i=this.component();xe(()=>this.render(o,i))});let n=b(hr),r=b(X);if(!e.hasInsertedStyles&&xv(n)){let o=r.createElement("style");o.textContent=bo.structuralStyles,r.head.appendChild(o),e.hasInsertedStyles=!0}}ngOnDestroy(){this.isDestroyed=!0,this.clear()}render(n,r){return vt(this,null,function*(){let o=this.catalog[r.type],i=null,s=null;if(typeof o=="function"?i=yield o():typeof o=="object"&&(i=yield o.type(),s=o.bindings(r)),this.clear(),i&&!this.isDestroyed){let u=[U("surfaceId",()=>n),U("component",()=>r),U("weight",()=>r.weight??"initial")];s&&u.push(...s),this.currentRef=this.viewContainerRef.createComponent(i,{bindings:u,injector:this.viewContainerRef.injector})}})}clear(){this.currentRef?.destroy(),this.currentRef=null}static \u0275fac=function(r){return new(r||e)};static \u0275dir=ht({type:e,selectors:[["ng-container","a2ui-renderer",""]],inputs:{surfaceId:[1,"surfaceId"],component:[1,"component"]}})}return e})();var gN=(()=>{class e extends r0{alignment=Pe("stretch");distribution=Pe("start");classes=Re(()=>P(M({},this.theme.components.Row),{[`align-${this.alignment()}`]:!0,[`distribute-${this.distribution()}`]:!0}));static \u0275fac=(()=>{let n;return function(o){return(n||(n=pr(e)))(o||e)}})();static \u0275cmp=so({type:e,selectors:[["a2ui-row"]],hostVars:2,hostBindings:function(r,o){r&2&&ta("alignment",o.alignment())("distribution",o.distribution())},inputs:{alignment:[1,"alignment"],distribution:[1,"distribution"]},features:[ao],decls:3,vars:4,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(r,o){r&1&&(dr(0,"section"),ra(1,aN,1,2,"ng-container",0,na),fo()),r&2&&(ho(o.theme.additionalStyles==null?null:o.theme.additionalStyles.Row),ki(o.classes()),io(),oa(o.component().properties.children))},dependencies:[o0],styles:["[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%]{display:flex;flex-direction:row;width:100%;min-height:100%;box-sizing:border-box}.align-start[_ngcontent-%COMP%]{align-items:start}.align-center[_ngcontent-%COMP%]{align-items:center}.align-end[_ngcontent-%COMP%]{align-items:end}.align-stretch[_ngcontent-%COMP%]{align-items:stretch}.distribute-start[_ngcontent-%COMP%]{justify-content:start}.distribute-center[_ngcontent-%COMP%]{justify-content:center}.distribute-end[_ngcontent-%COMP%]{justify-content:end}.distribute-spaceBetween[_ngcontent-%COMP%]{justify-content:space-between}.distribute-spaceAround[_ngcontent-%COMP%]{justify-content:space-around}.distribute-spaceEvenly[_ngcontent-%COMP%]{justify-content:space-evenly}"]})}return e})(),mN=(()=>{class e extends r0{alignment=Pe("stretch");distribution=Pe("start");classes=Re(()=>P(M({},this.theme.components.Column),{[`align-${this.alignment()}`]:!0,[`distribute-${this.distribution()}`]:!0}));static \u0275fac=(()=>{let n;return function(o){return(n||(n=pr(e)))(o||e)}})();static \u0275cmp=so({type:e,selectors:[["a2ui-column"]],inputs:{alignment:[1,"alignment"],distribution:[1,"distribution"]},features:[ao],decls:3,vars:4,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(r,o){r&1&&(dr(0,"section"),ra(1,cN,1,2,"ng-container",0,na),fo()),r&2&&(ho(o.theme.additionalStyles==null?null:o.theme.additionalStyles.Column),ki(o.classes()),io(),oa(o.component().properties.children))},dependencies:[o0],styles:["[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-width:100%;height:100%;box-sizing:border-box}.align-start[_ngcontent-%COMP%]{align-items:start}.align-center[_ngcontent-%COMP%]{align-items:center}.align-end[_ngcontent-%COMP%]{align-items:end}.align-stretch[_ngcontent-%COMP%]{align-items:stretch}.distribute-start[_ngcontent-%COMP%]{justify-content:start}.distribute-center[_ngcontent-%COMP%]{justify-content:center}.distribute-end[_ngcontent-%COMP%]{justify-content:end}.distribute-spaceBetween[_ngcontent-%COMP%]{justify-content:space-between}.distribute-spaceAround[_ngcontent-%COMP%]{justify-content:space-around}.distribute-spaceEvenly[_ngcontent-%COMP%]{justify-content:space-evenly}"]})}return e})(),yN=(()=>{class e{originalClassMap=new Map;sanitizer=b(Xp);markdownIt=n0({highlight:(n,r)=>{if(r==="html"){let o=document.createElement("iframe");return o.classList.add("html-view"),o.srcdoc=n,o.sandbox="",o.innerHTML}return n}});render(n,r){r&&this.applyTagClassMap(r);let o=this.markdownIt.render(n);return this.unapplyTagClassMap(),this.sanitizer.sanitize(ze.HTML,o)}applyTagClassMap(n){Object.entries(n).forEach(([r,o])=>{let i;switch(r){case"p":i="paragraph";break;case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":i="heading";break;case"ul":i="bullet_list";break;case"ol":i="ordered_list";break;case"li":i="list_item";break;case"a":i="link";break;case"strong":i="strong";break;case"em":i="em";break}if(!i)return;let s=`${i}_open`,u=this.markdownIt.renderer.rules[s];this.originalClassMap.set(s,u),this.markdownIt.renderer.rules[s]=(a,c,l,d,h)=>{let f=a[c];for(let p of o)f.attrJoin("class",p);return u?u.call(this,a,c,l,d,h):h.renderToken(a,c,l)}})}unapplyTagClassMap(){for(let[n,r]of this.originalClassMap)this.markdownIt.renderer.rules[n]=r;this.originalClassMap.clear()}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),bN=(()=>{class e extends r0{markdownRenderer=b(yN);text=Pe.required();usageHint=Pe.required();resolvedText=Re(()=>{let n=this.usageHint(),r=super.resolvePrimitive(this.text());if(r==null)return"(empty)";switch(n){case"h1":r=`# ${r}`;break;case"h2":r=`## ${r}`;break;case"h3":r=`### ${r}`;break;case"h4":r=`#### ${r}`;break;case"h5":r=`##### ${r}`;break;case"caption":r=`*${r}*`;break;default:r=String(r);break}return this.markdownRenderer.render(r,bo.appendToAll(this.theme.markdown,["ol","ul","li"],{}))});classes=Re(()=>{let n=this.usageHint();return bo.merge(this.theme.components.Text.all,n?this.theme.components.Text[n]:{})});additionalStyles=Re(()=>{let n=this.usageHint(),r=this.theme.additionalStyles?.Text;if(!r)return null;let o={};return this.areHintedStyles(r)?o=r[n??"body"]:o=r,o});areHintedStyles(n){return typeof n!="object"||!n||Array.isArray(n)?!1:["h1","h2","h3","h4","h5","h6","caption","body"].every(o=>o in n)}static \u0275fac=(()=>{let n;return function(o){return(n||(n=pr(e)))(o||e)}})();static \u0275cmp=so({type:e,selectors:[["a2ui-text"]],inputs:{text:[1,"text"],usageHint:[1,"usageHint"]},features:[ao],decls:1,vars:5,consts:[[3,"innerHTML"]],template:function(r,o){r&1&&ia(0,"section",0),r&2&&(ho(o.additionalStyles()),ki(o.classes()),sa("innerHTML",o.resolvedText(),zd))},styles:[`a2ui-text{display:block;flex:var(--weight)}a2ui-text h1,a2ui-text h2,a2ui-text h3,a2ui-text h4,a2ui-text h5{line-height:inherit;font:inherit} -`],encapsulation:2})}return e})(),jG={Row:{type:()=>gN,bindings:e=>{let t=e.properties;return[U("alignment",()=>t.alignment??"stretch"),U("distribution",()=>t.distribution??"start")]}},Column:{type:()=>mN,bindings:e=>{let t=e.properties;return[U("alignment",()=>t.alignment??"stretch"),U("distribution",()=>t.distribution??"start")]}},List:{type:()=>import("./chunk-4S2CIXCW.js").then(e=>e.List),bindings:e=>{let t=e.properties;return[U("direction",()=>t.direction??"vertical")]}},Card:()=>import("./chunk-CD6LWQYN.js").then(e=>e.Card),Image:{type:()=>import("./chunk-7P7JIWGK.js").then(e=>e.Image),bindings:e=>{let t=e.properties;return[U("url",()=>t.url),U("usageHint",()=>t.usageHint)]}},Icon:{type:()=>import("./chunk-VUI6RO2X.js").then(e=>e.Icon),bindings:e=>{let t=e.properties;return[U("name",()=>t.name)]}},Video:{type:()=>import("./chunk-5VJ6OSLK.js").then(e=>e.Video),bindings:e=>{let t=e.properties;return[U("url",()=>t.url)]}},AudioPlayer:{type:()=>import("./chunk-NK4C5UIR.js").then(e=>e.Audio),bindings:e=>{let t=e.properties;return[U("url",()=>t.url)]}},Text:{type:()=>bN,bindings:e=>{let t=e.properties;return[U("text",()=>t.text),U("usageHint",()=>t.usageHint||null)]}},Button:{type:()=>import("./chunk-2VKC3BHH.js").then(e=>e.Button),bindings:e=>{let t=e.properties;return[U("action",()=>t.action)]}},Divider:()=>import("./chunk-2MVVEOIQ.js").then(e=>e.Divider),MultipleChoice:{type:()=>import("./chunk-DTNGXRUJ.js").then(e=>e.MultipleChoice),bindings:e=>{let t=e.properties;return[U("options",()=>t.options||[]),U("value",()=>t.selections),U("description",()=>"Select an item")]}},TextField:{type:()=>import("./chunk-HCQ2TSHS.js").then(e=>e.TextField),bindings:e=>{let t=e.properties;return[U("text",()=>t.text??null),U("label",()=>t.label),U("inputType",()=>t.type)]}},DateTimeInput:{type:()=>import("./chunk-PR5T53UC.js").then(e=>e.DatetimeInput),bindings:e=>{let t=e.properties;return[U("enableDate",()=>t.enableDate),U("enableTime",()=>t.enableTime),U("value",()=>t.value)]}},CheckBox:{type:()=>import("./chunk-A2SOFJNC.js").then(e=>e.Checkbox),bindings:e=>{let t=e.properties;return[U("label",()=>t.label),U("value",()=>t.value)]}},Slider:{type:()=>import("./chunk-GGOEHXD2.js").then(e=>e.Slider),bindings:e=>{let t=e.properties;return[U("value",()=>t.value),U("minValue",()=>t.minValue),U("maxValue",()=>t.maxValue),U("label",()=>"")]}},Tabs:{type:()=>import("./chunk-JUJUP2UX.js").then(e=>e.Tabs),bindings:e=>{let t=e.properties;return[U("tabs",()=>t.tabItems)]}},Modal:{type:()=>import("./chunk-WXV43367.js").then(e=>e.Modal),bindings:()=>[]}},BG=(()=>{class e{surfaceId=Pe.required();surface=Pe.required();styles=Re(()=>{let n=this.surface(),r={};if(n?.styles)for(let[o,i]of Object.entries(n.styles))switch(o){case"primaryColor":{r["--p-100"]="#ffffff",r["--p-99"]=`color-mix(in srgb, ${i} 2%, white 98%)`,r["--p-98"]=`color-mix(in srgb, ${i} 4%, white 96%)`,r["--p-95"]=`color-mix(in srgb, ${i} 10%, white 90%)`,r["--p-90"]=`color-mix(in srgb, ${i} 20%, white 80%)`,r["--p-80"]=`color-mix(in srgb, ${i} 40%, white 60%)`,r["--p-70"]=`color-mix(in srgb, ${i} 60%, white 40%)`,r["--p-60"]=`color-mix(in srgb, ${i} 80%, white 20%)`,r["--p-50"]=i,r["--p-40"]=`color-mix(in srgb, ${i} 80%, black 20%)`,r["--p-35"]=`color-mix(in srgb, ${i} 70%, black 30%)`,r["--p-30"]=`color-mix(in srgb, ${i} 60%, black 40%)`,r["--p-25"]=`color-mix(in srgb, ${i} 50%, black 50%)`,r["--p-20"]=`color-mix(in srgb, ${i} 40%, black 60%)`,r["--p-15"]=`color-mix(in srgb, ${i} 30%, black 70%)`,r["--p-10"]=`color-mix(in srgb, ${i} 20%, black 80%)`,r["--p-5"]=`color-mix(in srgb, ${i} 10%, black 90%)`,r["--0"]="#00000";break}case"font":{r["--font-family"]=i,r["--font-family-flex"]=i;break}}return r});static \u0275fac=function(r){return new(r||e)};static \u0275cmp=so({type:e,selectors:[["a2ui-surface"]],hostVars:2,hostBindings:function(r,o){r&2&&ho(o.styles())},inputs:{surfaceId:[1,"surfaceId"],surface:[1,"surface"]},decls:3,vars:3,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(r,o){if(r&1&&(aa(0)(1),Cf(2,lN,1,2,"ng-container",0)),r&2){let i=ca(o.surfaceId());io();let s=ca(o.surface());io(),wf(i&&s?2:-1)}},dependencies:[o0],styles:["[_nghost-%COMP%]{display:flex;min-height:0;max-height:100%;flex-direction:column;gap:16px}"]})}return e})();export{ne as a,Hn as b,aE as c,B as d,Ic as e,he as f,as as g,Po as h,jo as i,hE as j,Or as k,gE as l,Bt as m,E3 as n,Ho as o,Ct as p,xs as q,_E as r,wE as s,Un as t,Nc as u,Se as v,kE as w,Vt as x,$o as y,Ss as z,FE as A,OE as B,kc as C,Rc as D,$E as E,UE as F,gn as G,qE as H,GE as I,Fc as J,Oc as K,$0 as L,Pc as M,WE as N,z0 as O,Ms as P,QE as Q,KE as R,G0 as S,As as T,W0 as U,Z0 as V,Y0 as W,Ns as X,JE as Y,XE as Z,Q0 as _,eC as $,D as aa,xt as ba,Hs as ca,T as da,It as ea,oC as fa,x as ga,A as ha,b as ia,hg as ja,Ae as ka,Ur as la,wC as ma,Tg as na,Sg as oa,Vg as pa,Hg as qa,me as ra,X as sa,$e as ta,or as ua,Ht as va,Ce as wa,We as xa,Gt as ya,xn as za,ai as Aa,Fu as Ba,pr as Ca,Zt as Da,Du as Ea,Ou as Fa,hr as Ga,m_ as Ha,Lu as Ia,ay as Ja,ze as Ka,zd as La,W_ as Ma,Z_ as Na,Y_ as Oa,io as Pa,Nt as Qa,hw as Ra,Sn as Sa,lr as Ta,Ti as Ua,ee as Va,px as Wa,pt as Xa,An as Ya,vb as Za,Db as _a,so as $a,Kt as ab,ht as bb,uo as cb,oI as db,ao as eb,xb as fb,Ib as gb,Tb as hb,yf as ib,Mi as jb,mI as kb,Ab as lb,co as mb,Rb as nb,ta as ob,bI as pb,Cf as qb,_f as rb,wf as sb,DI as tb,na as ub,ra as vb,oa as wb,lo as xb,dr as yb,fo as zb,Fb as Ab,xf as Bb,If as Cb,ia as Db,Tf as Eb,Sf as Fb,po as Gb,II as Hb,sa as Ib,Lb as Jb,jb as Kb,Ni as Lb,kI as Mb,RI as Nb,Vb as Ob,Hb as Pb,OI as Qb,PI as Rb,$b as Sb,Ub as Tb,LI as Ub,jI as Vb,ua as Wb,Zb as Xb,ho as Yb,ki as Zb,u2 as _b,o1 as $b,Mf as ac,i1 as bc,u1 as cc,c2 as dc,a1 as ec,aa as fc,ca as gc,la as hc,l2 as ic,d2 as jc,f2 as kc,m2 as lc,y2 as mc,b2 as nc,v2 as oc,D2 as pc,C2 as qc,_2 as rc,w2 as sc,x2 as tc,da as uc,xe as vc,Re as wc,S2 as xc,Ff as yc,D1 as zc,F7 as Ac,O7 as Bc,Pe as Cc,P7 as Dc,L7 as Ec,j7 as Fc,qf as Gc,Gf as Hc,tT as Ic,nT as Jc,V7 as Kc,H7 as Lc,$7 as Mc,bo as Nc,kt as Oc,LT as Pc,Eo as Qc,tv as Rc,nv as Sc,HT as Tc,aS as Uc,cS as Vc,Cv as Wc,dS as Xc,fS as Yc,pS as Zc,mS as _c,bS as $c,DS as ad,ES as bd,Pp as cd,xv as dd,GH as ed,qp as fd,LS as gd,zS as hd,Gv as id,fM as jd,cU as kd,Xp as ld,dN as md,fN as nd,pN as od,r0 as pd,o0 as qd,jG as rd,BG as sd}; +`],encapsulation:2})}return e})(),jG={Row:{type:()=>gN,bindings:e=>{let t=e.properties;return[U("alignment",()=>t.alignment??"stretch"),U("distribution",()=>t.distribution??"start")]}},Column:{type:()=>mN,bindings:e=>{let t=e.properties;return[U("alignment",()=>t.alignment??"stretch"),U("distribution",()=>t.distribution??"start")]}},List:{type:()=>import("./chunk-Y7O3NHKW.js").then(e=>e.List),bindings:e=>{let t=e.properties;return[U("direction",()=>t.direction??"vertical")]}},Card:()=>import("./chunk-IT263FCL.js").then(e=>e.Card),Image:{type:()=>import("./chunk-URGIGLGR.js").then(e=>e.Image),bindings:e=>{let t=e.properties;return[U("url",()=>t.url),U("usageHint",()=>t.usageHint)]}},Icon:{type:()=>import("./chunk-4LH47YYI.js").then(e=>e.Icon),bindings:e=>{let t=e.properties;return[U("name",()=>t.name)]}},Video:{type:()=>import("./chunk-R6ZR5LUR.js").then(e=>e.Video),bindings:e=>{let t=e.properties;return[U("url",()=>t.url)]}},AudioPlayer:{type:()=>import("./chunk-3BJ4SYVH.js").then(e=>e.Audio),bindings:e=>{let t=e.properties;return[U("url",()=>t.url)]}},Text:{type:()=>bN,bindings:e=>{let t=e.properties;return[U("text",()=>t.text),U("usageHint",()=>t.usageHint||null)]}},Button:{type:()=>import("./chunk-Q6H4XMU7.js").then(e=>e.Button),bindings:e=>{let t=e.properties;return[U("action",()=>t.action)]}},Divider:()=>import("./chunk-DM36II44.js").then(e=>e.Divider),MultipleChoice:{type:()=>import("./chunk-BPUQWVAT.js").then(e=>e.MultipleChoice),bindings:e=>{let t=e.properties;return[U("options",()=>t.options||[]),U("value",()=>t.selections),U("description",()=>"Select an item")]}},TextField:{type:()=>import("./chunk-P4MFJI72.js").then(e=>e.TextField),bindings:e=>{let t=e.properties;return[U("text",()=>t.text??null),U("label",()=>t.label),U("inputType",()=>t.type)]}},DateTimeInput:{type:()=>import("./chunk-6CJBO2JX.js").then(e=>e.DatetimeInput),bindings:e=>{let t=e.properties;return[U("enableDate",()=>t.enableDate),U("enableTime",()=>t.enableTime),U("value",()=>t.value)]}},CheckBox:{type:()=>import("./chunk-SXB5AC5V.js").then(e=>e.Checkbox),bindings:e=>{let t=e.properties;return[U("label",()=>t.label),U("value",()=>t.value)]}},Slider:{type:()=>import("./chunk-ET35KXUM.js").then(e=>e.Slider),bindings:e=>{let t=e.properties;return[U("value",()=>t.value),U("minValue",()=>t.minValue),U("maxValue",()=>t.maxValue),U("label",()=>"")]}},Tabs:{type:()=>import("./chunk-4VDZU6IO.js").then(e=>e.Tabs),bindings:e=>{let t=e.properties;return[U("tabs",()=>t.tabItems)]}},Modal:{type:()=>import("./chunk-AQDQIDAM.js").then(e=>e.Modal),bindings:()=>[]}},BG=(()=>{class e{surfaceId=Pe.required();surface=Pe.required();styles=Re(()=>{let n=this.surface(),r={};if(n?.styles)for(let[o,i]of Object.entries(n.styles))switch(o){case"primaryColor":{r["--p-100"]="#ffffff",r["--p-99"]=`color-mix(in srgb, ${i} 2%, white 98%)`,r["--p-98"]=`color-mix(in srgb, ${i} 4%, white 96%)`,r["--p-95"]=`color-mix(in srgb, ${i} 10%, white 90%)`,r["--p-90"]=`color-mix(in srgb, ${i} 20%, white 80%)`,r["--p-80"]=`color-mix(in srgb, ${i} 40%, white 60%)`,r["--p-70"]=`color-mix(in srgb, ${i} 60%, white 40%)`,r["--p-60"]=`color-mix(in srgb, ${i} 80%, white 20%)`,r["--p-50"]=i,r["--p-40"]=`color-mix(in srgb, ${i} 80%, black 20%)`,r["--p-35"]=`color-mix(in srgb, ${i} 70%, black 30%)`,r["--p-30"]=`color-mix(in srgb, ${i} 60%, black 40%)`,r["--p-25"]=`color-mix(in srgb, ${i} 50%, black 50%)`,r["--p-20"]=`color-mix(in srgb, ${i} 40%, black 60%)`,r["--p-15"]=`color-mix(in srgb, ${i} 30%, black 70%)`,r["--p-10"]=`color-mix(in srgb, ${i} 20%, black 80%)`,r["--p-5"]=`color-mix(in srgb, ${i} 10%, black 90%)`,r["--0"]="#00000";break}case"font":{r["--font-family"]=i,r["--font-family-flex"]=i;break}}return r});static \u0275fac=function(r){return new(r||e)};static \u0275cmp=so({type:e,selectors:[["a2ui-surface"]],hostVars:2,hostBindings:function(r,o){r&2&&ho(o.styles())},inputs:{surfaceId:[1,"surfaceId"],surface:[1,"surface"]},decls:3,vars:3,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(r,o){if(r&1&&(aa(0)(1),Cf(2,lN,1,2,"ng-container",0)),r&2){let i=ca(o.surfaceId());io();let s=ca(o.surface());io(),wf(i&&s?2:-1)}},dependencies:[o0],styles:["[_nghost-%COMP%]{display:flex;min-height:0;max-height:100%;flex-direction:column;gap:16px}"]})}return e})();export{ne as a,Hn as b,aE as c,B as d,Ic as e,he as f,as as g,Po as h,jo as i,hE as j,Or as k,gE as l,Bt as m,E3 as n,Ho as o,Ct as p,xs as q,_E as r,wE as s,Un as t,Nc as u,Se as v,kE as w,Vt as x,$o as y,Ss as z,FE as A,OE as B,kc as C,Rc as D,$E as E,UE as F,gn as G,qE as H,GE as I,Fc as J,Oc as K,$0 as L,Pc as M,WE as N,z0 as O,Ms as P,QE as Q,KE as R,G0 as S,As as T,W0 as U,Z0 as V,Y0 as W,Ns as X,JE as Y,XE as Z,Q0 as _,eC as $,D as aa,xt as ba,Hs as ca,T as da,It as ea,oC as fa,x as ga,A as ha,b as ia,hg as ja,Ae as ka,Ur as la,wC as ma,Tg as na,Sg as oa,Vg as pa,Hg as qa,me as ra,X as sa,$e as ta,or as ua,Ht as va,Ce as wa,We as xa,Gt as ya,xn as za,ai as Aa,Fu as Ba,pr as Ca,Zt as Da,Du as Ea,Ou as Fa,hr as Ga,m_ as Ha,Lu as Ia,ay as Ja,ze as Ka,zd as La,W_ as Ma,Z_ as Na,Y_ as Oa,io as Pa,Nt as Qa,hw as Ra,Sn as Sa,lr as Ta,Ti as Ua,ee as Va,px as Wa,pt as Xa,An as Ya,vb as Za,Db as _a,so as $a,Kt as ab,ht as bb,uo as cb,oI as db,ao as eb,xb as fb,Ib as gb,Tb as hb,yf as ib,Mi as jb,mI as kb,Ab as lb,co as mb,Rb as nb,ta as ob,bI as pb,Cf as qb,_f as rb,wf as sb,DI as tb,na as ub,ra as vb,oa as wb,lo as xb,dr as yb,fo as zb,Fb as Ab,xf as Bb,If as Cb,ia as Db,Tf as Eb,Sf as Fb,po as Gb,II as Hb,sa as Ib,Lb as Jb,jb as Kb,Ni as Lb,kI as Mb,RI as Nb,Vb as Ob,Hb as Pb,OI as Qb,PI as Rb,$b as Sb,Ub as Tb,LI as Ub,jI as Vb,ua as Wb,Zb as Xb,ho as Yb,ki as Zb,u2 as _b,o1 as $b,Mf as ac,i1 as bc,u1 as cc,c2 as dc,a1 as ec,aa as fc,ca as gc,la as hc,l2 as ic,d2 as jc,f2 as kc,m2 as lc,y2 as mc,b2 as nc,v2 as oc,D2 as pc,C2 as qc,_2 as rc,w2 as sc,x2 as tc,da as uc,xe as vc,Re as wc,S2 as xc,Ff as yc,D1 as zc,F7 as Ac,O7 as Bc,Pe as Cc,P7 as Dc,L7 as Ec,j7 as Fc,qf as Gc,Gf as Hc,tT as Ic,nT as Jc,V7 as Kc,H7 as Lc,$7 as Mc,bo as Nc,kt as Oc,LT as Pc,Eo as Qc,tv as Rc,nv as Sc,HT as Tc,aS as Uc,cS as Vc,Cv as Wc,dS as Xc,fS as Yc,pS as Zc,mS as _c,bS as $c,DS as ad,ES as bd,Pp as cd,xv as dd,GH as ed,qp as fd,LS as gd,zS as hd,Gv as id,fM as jd,cU as kd,Xp as ld,dN as md,fN as nd,pN as od,r0 as pd,o0 as qd,jG as rd,BG as sd}; diff --git a/src/google/adk/cli/browser/chunk-NK4C5UIR.js b/src/google/adk/cli/browser/chunk-3BJ4SYVH.js similarity index 87% rename from src/google/adk/cli/browser/chunk-NK4C5UIR.js rename to src/google/adk/cli/browser/chunk-3BJ4SYVH.js index c9900496b7..64560a5914 100644 --- a/src/google/adk/cli/browser/chunk-NK4C5UIR.js +++ b/src/google/adk/cli/browser/chunk-3BJ4SYVH.js @@ -1 +1 @@ -import{$a as l,Bb as c,Ca as r,Cb as u,Cc as M,Db as m,Ib as p,Lb as v,Pa as n,Yb as f,Zb as y,eb as d,fc as g,gc as h,hc as x,pd as _,qb as a,sb as s,wc as C}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function D(e,P){if(e&1&&(c(0,"section"),m(1,"audio",1),u()),e&2){let t=v(),o=x(0);f(t.theme.additionalStyles==null?null:t.theme.additionalStyles.AudioPlayer),y(t.theme.components.AudioPlayer),n(),p("src",o)}}var w=(()=>{class e extends _{url=M.required();resolvedUrl=C(()=>this.resolvePrimitive(this.url()));static \u0275fac=(()=>{let t;return function(i){return(t||(t=r(e)))(i||e)}})();static \u0275cmp=l({type:e,selectors:[["a2ui-audio"]],inputs:{url:[1,"url"]},features:[d],decls:2,vars:2,consts:[[3,"class","style"],["controls","",3,"src"]],template:function(o,i){if(o&1&&(g(0),a(1,D,2,5,"section",0)),o&2){let b=h(i.resolvedUrl());n(),s(b?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}audio[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return e})();export{w as Audio}; +import{$a as l,Bb as c,Ca as r,Cb as u,Cc as M,Db as m,Ib as p,Lb as v,Pa as n,Yb as f,Zb as y,eb as d,fc as g,gc as h,hc as x,pd as _,qb as a,sb as s,wc as C}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function D(e,P){if(e&1&&(c(0,"section"),m(1,"audio",1),u()),e&2){let t=v(),o=x(0);f(t.theme.additionalStyles==null?null:t.theme.additionalStyles.AudioPlayer),y(t.theme.components.AudioPlayer),n(),p("src",o)}}var w=(()=>{class e extends _{url=M.required();resolvedUrl=C(()=>this.resolvePrimitive(this.url()));static \u0275fac=(()=>{let t;return function(i){return(t||(t=r(e)))(i||e)}})();static \u0275cmp=l({type:e,selectors:[["a2ui-audio"]],inputs:{url:[1,"url"]},features:[d],decls:2,vars:2,consts:[[3,"class","style"],["controls","",3,"src"]],template:function(o,i){if(o&1&&(g(0),a(1,D,2,5,"section",0)),o&2){let b=h(i.resolvedUrl());n(),s(b?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}audio[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return e})();export{w as Audio}; diff --git a/src/google/adk/cli/browser/chunk-3NJNOY56.js b/src/google/adk/cli/browser/chunk-3NJNOY56.js new file mode 100644 index 0000000000..60df62ef40 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-3NJNOY56.js @@ -0,0 +1 @@ +import{a as t,b as a,c as o,d as i,e as f,f as e,g as u,j as d,p as s,q as l}from"./chunk-NALL4A3P.js";var m=class extends l{static{e(this,"InfoTokenBuilder")}constructor(){super(["info","showInfo"])}},v={parser:{TokenBuilder:e(()=>new m,"TokenBuilder"),ValueConverter:e(()=>new s,"ValueConverter")}};function I(c=i){let r=o(a(c),u),n=o(t({shared:r}),d,v);return r.ServiceRegistry.register(n),{shared:r,Info:n}}e(I,"createInfoServices");export{v as a,I as b}; diff --git a/src/google/adk/cli/browser/chunk-3YZ77ADE.js b/src/google/adk/cli/browser/chunk-3YZ77ADE.js new file mode 100644 index 0000000000..3253c2d891 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-3YZ77ADE.js @@ -0,0 +1,36 @@ +import{a as Ke}from"./chunk-DMWOYWYQ.js";import{a as je}from"./chunk-T3Q3QCCV.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import{a as Ne}from"./chunk-YVVLWU7S.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{a as ke}from"./chunk-TPDTRWWV.js";import{b as Qe,c as Je,d as ce,f as ge}from"./chunk-WXI2IBAH.js";import{l as Ze,p as qe}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as Ge,G as Ue,O as Ye,R as Xe,S as He,T as We,U as Ve,V as ze,W as Be,X as $e,Y as fe,r as Pe}from"./chunk-QFMJV7VH.js";import{a as be,g as ct,i as Te}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as ee,b as le,e as me,h as pr,j as Zt}from"./chunk-RMXJBC7V.js";var Ce=me((ne,Le)=>{"use strict";(function(w,N){typeof ne=="object"&&typeof Le=="object"?Le.exports=N():typeof define=="function"&&define.amd?define([],N):typeof ne=="object"?ne.layoutBase=N():w.layoutBase=N()})(ne,function(){return(function(E){var w={};function N(u){if(w[u])return w[u].exports;var o=w[u]={i:u,l:!1,exports:{}};return E[u].call(o.exports,o,o.exports,N),o.l=!0,o.exports}return N.m=E,N.c=w,N.i=function(u){return u},N.d=function(u,o,a){N.o(u,o)||Object.defineProperty(u,o,{configurable:!1,enumerable:!0,get:a})},N.n=function(u){var o=u&&u.__esModule?function(){return u.default}:function(){return u};return N.d(o,"a",o),o},N.o=function(u,o){return Object.prototype.hasOwnProperty.call(u,o)},N.p="",N(N.s=28)})([(function(E,w,N){"use strict";function u(){}u.QUALITY=1,u.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,u.DEFAULT_INCREMENTAL=!1,u.DEFAULT_ANIMATION_ON_LAYOUT=!0,u.DEFAULT_ANIMATION_DURING_LAYOUT=!1,u.DEFAULT_ANIMATION_PERIOD=50,u.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,u.DEFAULT_GRAPH_MARGIN=15,u.NODE_DIMENSIONS_INCLUDE_LABELS=!1,u.SIMPLE_NODE_SIZE=40,u.SIMPLE_NODE_HALF_SIZE=u.SIMPLE_NODE_SIZE/2,u.EMPTY_COMPOUND_NODE_SIZE=40,u.MIN_EDGE_LENGTH=1,u.WORLD_BOUNDARY=1e6,u.INITIAL_WORLD_BOUNDARY=u.WORLD_BOUNDARY/1e3,u.WORLD_CENTER_X=1200,u.WORLD_CENTER_Y=900,E.exports=u}),(function(E,w,N){"use strict";var u=N(2),o=N(8),a=N(9);function e(c,t,g){u.call(this,g),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=g,this.bendpoints=[],this.source=c,this.target=t}e.prototype=Object.create(u.prototype);for(var n in u)e[n]=u[n];e.prototype.getSource=function(){return this.source},e.prototype.getTarget=function(){return this.target},e.prototype.isInterGraph=function(){return this.isInterGraph},e.prototype.getLength=function(){return this.length},e.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},e.prototype.getBendpoints=function(){return this.bendpoints},e.prototype.getLca=function(){return this.lca},e.prototype.getSourceInLca=function(){return this.sourceInLca},e.prototype.getTargetInLca=function(){return this.targetInLca},e.prototype.getOtherEnd=function(c){if(this.source===c)return this.target;if(this.target===c)return this.source;throw"Node is not incident with this edge"},e.prototype.getOtherEndInGraph=function(c,t){for(var g=this.getOtherEnd(c),i=t.getGraphManager().getRoot();;){if(g.getOwner()==t)return g;if(g.getOwner()==i)break;g=g.getOwner().getParent()}return null},e.prototype.updateLength=function(){var c=new Array(4);this.isOverlapingSourceAndTarget=o.getIntersection(this.target.getRect(),this.source.getRect(),c),this.isOverlapingSourceAndTarget||(this.lengthX=c[0]-c[2],this.lengthY=c[1]-c[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},e.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},E.exports=e}),(function(E,w,N){"use strict";function u(o){this.vGraphObject=o}E.exports=u}),(function(E,w,N){"use strict";var u=N(2),o=N(10),a=N(13),e=N(0),n=N(16),c=N(5);function t(i,r,h,f){h==null&&f==null&&(f=r),u.call(this,f),i.graphManager!=null&&(i=i.graphManager),this.estimatedSize=o.MIN_VALUE,this.inclusionTreeDepth=o.MAX_VALUE,this.vGraphObject=f,this.edges=[],this.graphManager=i,h!=null&&r!=null?this.rect=new a(r.x,r.y,h.width,h.height):this.rect=new a}t.prototype=Object.create(u.prototype);for(var g in u)t[g]=u[g];t.prototype.getEdges=function(){return this.edges},t.prototype.getChild=function(){return this.child},t.prototype.getOwner=function(){return this.owner},t.prototype.getWidth=function(){return this.rect.width},t.prototype.setWidth=function(i){this.rect.width=i},t.prototype.getHeight=function(){return this.rect.height},t.prototype.setHeight=function(i){this.rect.height=i},t.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},t.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},t.prototype.getCenter=function(){return new c(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},t.prototype.getLocation=function(){return new c(this.rect.x,this.rect.y)},t.prototype.getRect=function(){return this.rect},t.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},t.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},t.prototype.setRect=function(i,r){this.rect.x=i.x,this.rect.y=i.y,this.rect.width=r.width,this.rect.height=r.height},t.prototype.setCenter=function(i,r){this.rect.x=i-this.rect.width/2,this.rect.y=r-this.rect.height/2},t.prototype.setLocation=function(i,r){this.rect.x=i,this.rect.y=r},t.prototype.moveBy=function(i,r){this.rect.x+=i,this.rect.y+=r},t.prototype.getEdgeListToNode=function(i){var r=[],h,f=this;return f.edges.forEach(function(l){if(l.target==i){if(l.source!=f)throw"Incorrect edge source!";r.push(l)}}),r},t.prototype.getEdgesBetween=function(i){var r=[],h,f=this;return f.edges.forEach(function(l){if(!(l.source==f||l.target==f))throw"Incorrect edge source and/or target";(l.target==i||l.source==i)&&r.push(l)}),r},t.prototype.getNeighborsList=function(){var i=new Set,r=this;return r.edges.forEach(function(h){if(h.source==r)i.add(h.target);else{if(h.target!=r)throw"Incorrect incidency!";i.add(h.source)}}),i},t.prototype.withChildren=function(){var i=new Set,r,h;if(i.add(this),this.child!=null)for(var f=this.child.getNodes(),l=0;lr?(this.rect.x-=(this.labelWidth-r)/2,this.setWidth(this.labelWidth)):this.labelPosHorizontal=="right"&&this.setWidth(r+this.labelWidth)),this.labelHeight&&(this.labelPosVertical=="top"?(this.rect.y-=this.labelHeight,this.setHeight(h+this.labelHeight)):this.labelPosVertical=="center"&&this.labelHeight>h?(this.rect.y-=(this.labelHeight-h)/2,this.setHeight(this.labelHeight)):this.labelPosVertical=="bottom"&&this.setHeight(h+this.labelHeight))}}},t.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==o.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},t.prototype.transform=function(i){var r=this.rect.x;r>e.WORLD_BOUNDARY?r=e.WORLD_BOUNDARY:r<-e.WORLD_BOUNDARY&&(r=-e.WORLD_BOUNDARY);var h=this.rect.y;h>e.WORLD_BOUNDARY?h=e.WORLD_BOUNDARY:h<-e.WORLD_BOUNDARY&&(h=-e.WORLD_BOUNDARY);var f=new c(r,h),l=i.inverseTransformPoint(f);this.setLocation(l.x,l.y)},t.prototype.getLeft=function(){return this.rect.x},t.prototype.getRight=function(){return this.rect.x+this.rect.width},t.prototype.getTop=function(){return this.rect.y},t.prototype.getBottom=function(){return this.rect.y+this.rect.height},t.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},E.exports=t}),(function(E,w,N){"use strict";var u=N(0);function o(){}for(var a in u)o[a]=u[a];o.MAX_ITERATIONS=2500,o.DEFAULT_EDGE_LENGTH=50,o.DEFAULT_SPRING_STRENGTH=.45,o.DEFAULT_REPULSION_STRENGTH=4500,o.DEFAULT_GRAVITY_STRENGTH=.4,o.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,o.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,o.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,o.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,o.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,o.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,o.COOLING_ADAPTATION_FACTOR=.33,o.ADAPTATION_LOWER_NODE_LIMIT=1e3,o.ADAPTATION_UPPER_NODE_LIMIT=5e3,o.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,o.MAX_NODE_DISPLACEMENT=o.MAX_NODE_DISPLACEMENT_INCREMENTAL*3,o.MIN_REPULSION_DIST=o.DEFAULT_EDGE_LENGTH/10,o.CONVERGENCE_CHECK_PERIOD=100,o.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,o.MIN_EDGE_LENGTH=1,o.GRID_CALCULATION_CHECK_PERIOD=10,E.exports=o}),(function(E,w,N){"use strict";function u(o,a){o==null&&a==null?(this.x=0,this.y=0):(this.x=o,this.y=a)}u.prototype.getX=function(){return this.x},u.prototype.getY=function(){return this.y},u.prototype.setX=function(o){this.x=o},u.prototype.setY=function(o){this.y=o},u.prototype.getDifference=function(o){return new DimensionD(this.x-o.x,this.y-o.y)},u.prototype.getCopy=function(){return new u(this.x,this.y)},u.prototype.translate=function(o){return this.x+=o.width,this.y+=o.height,this},E.exports=u}),(function(E,w,N){"use strict";var u=N(2),o=N(10),a=N(0),e=N(7),n=N(3),c=N(1),t=N(13),g=N(12),i=N(11);function r(f,l,L){u.call(this,L),this.estimatedSize=o.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=f,l!=null&&l instanceof e?this.graphManager=l:l!=null&&l instanceof Layout&&(this.graphManager=l.graphManager)}r.prototype=Object.create(u.prototype);for(var h in u)r[h]=u[h];r.prototype.getNodes=function(){return this.nodes},r.prototype.getEdges=function(){return this.edges},r.prototype.getGraphManager=function(){return this.graphManager},r.prototype.getParent=function(){return this.parent},r.prototype.getLeft=function(){return this.left},r.prototype.getRight=function(){return this.right},r.prototype.getTop=function(){return this.top},r.prototype.getBottom=function(){return this.bottom},r.prototype.isConnected=function(){return this.isConnected},r.prototype.add=function(f,l,L){if(l==null&&L==null){var y=f;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(y)>-1)throw"Node already in graph!";return y.owner=this,this.getNodes().push(y),y}else{var p=f;if(!(this.getNodes().indexOf(l)>-1&&this.getNodes().indexOf(L)>-1))throw"Source or target not in graph!";if(!(l.owner==L.owner&&l.owner==this))throw"Both owners must be this graph!";return l.owner!=L.owner?null:(p.source=l,p.target=L,p.isInterGraph=!1,this.getEdges().push(p),l.edges.push(p),L!=l&&L.edges.push(p),p)}},r.prototype.remove=function(f){var l=f;if(f instanceof n){if(l==null)throw"Node is null!";if(!(l.owner!=null&&l.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var L=l.edges.slice(),y,p=L.length,C=0;C-1&&S>-1))throw"Source and/or target doesn't know this edge!";y.source.edges.splice(A,1),y.target!=y.source&&y.target.edges.splice(S,1);var R=y.source.owner.getEdges().indexOf(y);if(R==-1)throw"Not in owner's edge list!";y.source.owner.getEdges().splice(R,1)}},r.prototype.updateLeftTop=function(){for(var f=o.MAX_VALUE,l=o.MAX_VALUE,L,y,p,C=this.getNodes(),R=C.length,A=0;AL&&(f=L),l>y&&(l=y)}return f==o.MAX_VALUE?null:(C[0].getParent().paddingLeft!=null?p=C[0].getParent().paddingLeft:p=this.margin,this.left=l-p,this.top=f-p,new g(this.left,this.top))},r.prototype.updateBounds=function(f){for(var l=o.MAX_VALUE,L=-o.MAX_VALUE,y=o.MAX_VALUE,p=-o.MAX_VALUE,C,R,A,S,B,Y=this.nodes,tt=Y.length,x=0;xC&&(l=C),LA&&(y=A),pC&&(l=C),LA&&(y=A),p=this.nodes.length){var tt=0;L.forEach(function(x){x.owner==f&&tt++}),tt==this.nodes.length&&(this.isConnected=!0)}},E.exports=r}),(function(E,w,N){"use strict";var u,o=N(1);function a(e){u=N(6),this.layout=e,this.graphs=[],this.edges=[]}a.prototype.addRoot=function(){var e=this.layout.newGraph(),n=this.layout.newNode(null),c=this.add(e,n);return this.setRootGraph(c),this.rootGraph},a.prototype.add=function(e,n,c,t,g){if(c==null&&t==null&&g==null){if(e==null)throw"Graph is null!";if(n==null)throw"Parent node is null!";if(this.graphs.indexOf(e)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(e),e.parent!=null)throw"Already has a parent!";if(n.child!=null)throw"Already has a child!";return e.parent=n,n.child=e,e}else{g=c,t=n,c=e;var i=t.getOwner(),r=g.getOwner();if(!(i!=null&&i.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(r!=null&&r.getGraphManager()==this))throw"Target not in this graph mgr!";if(i==r)return c.isInterGraph=!1,i.add(c,t,g);if(c.isInterGraph=!0,c.source=t,c.target=g,this.edges.indexOf(c)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(c),!(c.source!=null&&c.target!=null))throw"Edge source and/or target is null!";if(!(c.source.edges.indexOf(c)==-1&&c.target.edges.indexOf(c)==-1))throw"Edge already in source and/or target incidency list!";return c.source.edges.push(c),c.target.edges.push(c),c}},a.prototype.remove=function(e){if(e instanceof u){var n=e;if(n.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(n==this.rootGraph||n.parent!=null&&n.parent.graphManager==this))throw"Invalid parent node!";var c=[];c=c.concat(n.getEdges());for(var t,g=c.length,i=0;i=e.getRight()?n[0]+=Math.min(e.getX()-a.getX(),a.getRight()-e.getRight()):e.getX()<=a.getX()&&e.getRight()>=a.getRight()&&(n[0]+=Math.min(a.getX()-e.getX(),e.getRight()-a.getRight())),a.getY()<=e.getY()&&a.getBottom()>=e.getBottom()?n[1]+=Math.min(e.getY()-a.getY(),a.getBottom()-e.getBottom()):e.getY()<=a.getY()&&e.getBottom()>=a.getBottom()&&(n[1]+=Math.min(a.getY()-e.getY(),e.getBottom()-a.getBottom()));var g=Math.abs((e.getCenterY()-a.getCenterY())/(e.getCenterX()-a.getCenterX()));e.getCenterY()===a.getCenterY()&&e.getCenterX()===a.getCenterX()&&(g=1);var i=g*n[0],r=n[1]/g;n[0]i)return n[0]=c,n[1]=h,n[2]=g,n[3]=Y,!1;if(tg)return n[0]=r,n[1]=t,n[2]=S,n[3]=i,!1;if(cg?(n[0]=l,n[1]=L,s=!0):(n[0]=f,n[1]=h,s=!0):v===d&&(c>g?(n[0]=r,n[1]=h,s=!0):(n[0]=y,n[1]=L,s=!0)),-T===d?g>c?(n[2]=B,n[3]=Y,m=!0):(n[2]=S,n[3]=A,m=!0):T===d&&(g>c?(n[2]=R,n[3]=A,m=!0):(n[2]=tt,n[3]=Y,m=!0)),s&&m)return!1;if(c>g?t>i?(D=this.getCardinalDirection(v,d,4),O=this.getCardinalDirection(T,d,2)):(D=this.getCardinalDirection(-v,d,3),O=this.getCardinalDirection(-T,d,1)):t>i?(D=this.getCardinalDirection(-v,d,1),O=this.getCardinalDirection(-T,d,3)):(D=this.getCardinalDirection(v,d,2),O=this.getCardinalDirection(T,d,4)),!s)switch(D){case 1:F=h,P=c+-C/d,n[0]=P,n[1]=F;break;case 2:P=y,F=t+p*d,n[0]=P,n[1]=F;break;case 3:F=L,P=c+C/d,n[0]=P,n[1]=F;break;case 4:P=l,F=t+-p*d,n[0]=P,n[1]=F;break}if(!m)switch(O){case 1:k=A,I=g+-Z/d,n[2]=I,n[3]=k;break;case 2:I=tt,k=i+x*d,n[2]=I,n[3]=k;break;case 3:k=Y,I=g+Z/d,n[2]=I,n[3]=k;break;case 4:I=B,k=i+-x*d,n[2]=I,n[3]=k;break}}return!1},o.getCardinalDirection=function(a,e,n){return a>e?n:1+n%4},o.getIntersection=function(a,e,n,c){if(c==null)return this.getIntersection2(a,e,n);var t=a.x,g=a.y,i=e.x,r=e.y,h=n.x,f=n.y,l=c.x,L=c.y,y=void 0,p=void 0,C=void 0,R=void 0,A=void 0,S=void 0,B=void 0,Y=void 0,tt=void 0;return C=r-g,A=t-i,B=i*g-t*r,R=L-f,S=h-l,Y=l*f-h*L,tt=C*S-R*A,tt===0?null:(y=(A*Y-S*B)/tt,p=(R*B-C*Y)/tt,new u(y,p))},o.angleOfVector=function(a,e,n,c){var t=void 0;return a!==n?(t=Math.atan((c-e)/(n-a)),n=0){var L=(-h+Math.sqrt(h*h-4*r*f))/(2*r),y=(-h-Math.sqrt(h*h-4*r*f))/(2*r),p=null;return L>=0&&L<=1?[L]:y>=0&&y<=1?[y]:p}else return null},o.HALF_PI=.5*Math.PI,o.ONE_AND_HALF_PI=1.5*Math.PI,o.TWO_PI=2*Math.PI,o.THREE_PI=3*Math.PI,E.exports=o}),(function(E,w,N){"use strict";function u(){}u.sign=function(o){return o>0?1:o<0?-1:0},u.floor=function(o){return o<0?Math.ceil(o):Math.floor(o)},u.ceil=function(o){return o<0?Math.floor(o):Math.ceil(o)},E.exports=u}),(function(E,w,N){"use strict";function u(){}u.MAX_VALUE=2147483647,u.MIN_VALUE=-2147483648,E.exports=u}),(function(E,w,N){"use strict";var u=(function(){function t(g,i){for(var r=0;r"u"?"undefined":u(a);return a==null||e!="object"&&e!="function"},E.exports=o}),(function(E,w,N){"use strict";function u(h){if(Array.isArray(h)){for(var f=0,l=Array(h.length);f0&&f;){for(C.push(A[0]);C.length>0&&f;){var S=C[0];C.splice(0,1),p.add(S);for(var B=S.getEdges(),y=0;y-1&&A.splice(Z,1)}p=new Set,R=new Map}}return h},r.prototype.createDummyNodesForBendpoints=function(h){for(var f=[],l=h.source,L=this.graphManager.calcLowestCommonAncestor(h.source,h.target),y=0;y0){for(var L=this.edgeToDummyNodes.get(l),y=0;y=0&&f.splice(Y,1);var tt=R.getNeighborsList();tt.forEach(function(s){if(l.indexOf(s)<0){var m=L.get(s),v=m-1;v==1&&S.push(s),L.set(s,v)}})}l=l.concat(S),(f.length==1||f.length==2)&&(y=!0,p=f[0])}return p},r.prototype.setGraphManager=function(h){this.graphManager=h},E.exports=r}),(function(E,w,N){"use strict";function u(){}u.seed=1,u.x=0,u.nextDouble=function(){return u.x=Math.sin(u.seed++)*1e4,u.x-Math.floor(u.x)},E.exports=u}),(function(E,w,N){"use strict";var u=N(5);function o(a,e){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o.prototype.getWorldOrgX=function(){return this.lworldOrgX},o.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},o.prototype.getWorldOrgY=function(){return this.lworldOrgY},o.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},o.prototype.getWorldExtX=function(){return this.lworldExtX},o.prototype.setWorldExtX=function(a){this.lworldExtX=a},o.prototype.getWorldExtY=function(){return this.lworldExtY},o.prototype.setWorldExtY=function(a){this.lworldExtY=a},o.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},o.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},o.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},o.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},o.prototype.getDeviceExtX=function(){return this.ldeviceExtX},o.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},o.prototype.getDeviceExtY=function(){return this.ldeviceExtY},o.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},o.prototype.transformX=function(a){var e=0,n=this.lworldExtX;return n!=0&&(e=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/n),e},o.prototype.transformY=function(a){var e=0,n=this.lworldExtY;return n!=0&&(e=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/n),e},o.prototype.inverseTransformX=function(a){var e=0,n=this.ldeviceExtX;return n!=0&&(e=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/n),e},o.prototype.inverseTransformY=function(a){var e=0,n=this.ldeviceExtY;return n!=0&&(e=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/n),e},o.prototype.inverseTransformPoint=function(a){var e=new u(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return e},E.exports=o}),(function(E,w,N){"use strict";function u(i){if(Array.isArray(i)){for(var r=0,h=Array(i.length);ra.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(i-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(i>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(i-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.displacementThresholdPerNode=3*a.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},t.prototype.calcSpringForces=function(){for(var i=this.getAllEdges(),r,h=0;h0&&arguments[0]!==void 0?arguments[0]:!0,r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,h,f,l,L,y=this.getAllNodes(),p;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&i&&this.updateGrid(),p=new Set,h=0;hC||p>C)&&(i.gravitationForceX=-this.gravityConstant*l,i.gravitationForceY=-this.gravityConstant*L)):(C=r.getEstimatedSize()*this.compoundGravityRangeFactor,(y>C||p>C)&&(i.gravitationForceX=-this.gravityConstant*l*this.compoundGravityConstant,i.gravitationForceY=-this.gravityConstant*L*this.compoundGravityConstant))},t.prototype.isConverged=function(){var i,r=!1;return this.totalIterations>this.maxIterations/3&&(r=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),i=this.totalDisplacement=y.length||C>=y[0].length)){for(var R=0;Rt}}]),n})();E.exports=e}),(function(E,w,N){"use strict";function u(){}u.svd=function(o){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=o.length,this.n=o[0].length;var a=Math.min(this.m,this.n);this.s=(function(Dt){for(var Nt=[];Dt-- >0;)Nt.push(0);return Nt})(Math.min(this.m+1,this.n)),this.U=(function(Dt){var Nt=function $t(Rt){if(Rt.length==0)return 0;for(var Xt=[],zt=0;zt0;)Nt.push(0);return Nt})(this.n),n=(function(Dt){for(var Nt=[];Dt-- >0;)Nt.push(0);return Nt})(this.m),c=!0,t=!0,g=Math.min(this.m-1,this.n),i=Math.max(0,Math.min(this.n-2,this.m)),r=0;r=0;d--)if(this.s[d]!==0){for(var D=d+1;D=0;b--){if((function(Dt,Nt){return Dt&&Nt})(b0;){var Q=void 0,Ut=void 0;for(Q=m-2;Q>=-1&&Q!==-1;Q--)if(Math.abs(e[Q])<=St+Lt*(Math.abs(this.s[Q])+Math.abs(this.s[Q+1]))){e[Q]=0;break}if(Q===m-2)Ut=4;else{var Mt=void 0;for(Mt=m-1;Mt>=Q&&Mt!==Q;Mt--){var at=(Mt!==m?Math.abs(e[Mt]):0)+(Mt!==Q+1?Math.abs(e[Mt-1]):0);if(Math.abs(this.s[Mt])<=St+Lt*at){this.s[Mt]=0;break}}Mt===Q?Ut=3:Mt===m-1?Ut=1:(Ut=2,Q=Mt)}switch(Q++,Ut){case 1:{var et=e[m-2];e[m-2]=0;for(var pt=m-2;pt>=Q;pt--){var Et=u.hypot(this.s[pt],et),Ct=this.s[pt]/Et,mt=et/Et;if(this.s[pt]=Et,pt!==Q&&(et=-mt*e[pt-1],e[pt-1]=Ct*e[pt-1]),t)for(var Tt=0;Tt=this.s[Q+1]);){var lt=this.s[Q];if(this.s[Q]=this.s[Q+1],this.s[Q+1]=lt,t&&QMath.abs(a)?(e=a/o,e=Math.abs(o)*Math.sqrt(1+e*e)):a!=0?(e=o/a,e=Math.abs(a)*Math.sqrt(1+e*e)):e=0,e},E.exports=u}),(function(E,w,N){"use strict";var u=(function(){function e(n,c){for(var t=0;t2&&arguments[2]!==void 0?arguments[2]:1,g=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;o(this,e),this.sequence1=n,this.sequence2=c,this.match_score=t,this.mismatch_penalty=g,this.gap_penalty=i,this.iMax=n.length+1,this.jMax=c.length+1,this.grid=new Array(this.iMax);for(var r=0;r=0;n--){var c=this.listeners[n];c.event===a&&c.callback===e&&this.listeners.splice(n,1)}},o.emit=function(a,e){for(var n=0;n{"use strict";(function(w,N){typeof ae=="object"&&typeof Ae=="object"?Ae.exports=N(Ce()):typeof define=="function"&&define.amd?define(["layout-base"],N):typeof ae=="object"?ae.coseBase=N(Ce()):w.coseBase=N(w.layoutBase)})(ae,function(E){return(()=>{"use strict";var w={45:((a,e,n)=>{var c={};c.layoutBase=n(551),c.CoSEConstants=n(806),c.CoSEEdge=n(767),c.CoSEGraph=n(880),c.CoSEGraphManager=n(578),c.CoSELayout=n(765),c.CoSENode=n(991),c.ConstraintHandler=n(902),a.exports=c}),806:((a,e,n)=>{var c=n(551).FDLayoutConstants;function t(){}for(var g in c)t[g]=c[g];t.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,t.DEFAULT_RADIAL_SEPARATION=c.DEFAULT_EDGE_LENGTH,t.DEFAULT_COMPONENT_SEPERATION=60,t.TILE=!0,t.TILING_PADDING_VERTICAL=10,t.TILING_PADDING_HORIZONTAL=10,t.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,t.ENFORCE_CONSTRAINTS=!0,t.APPLY_LAYOUT=!0,t.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,t.TREE_REDUCTION_ON_INCREMENTAL=!0,t.PURE_INCREMENTAL=t.DEFAULT_INCREMENTAL,a.exports=t}),767:((a,e,n)=>{var c=n(551).FDLayoutEdge;function t(i,r,h){c.call(this,i,r,h)}t.prototype=Object.create(c.prototype);for(var g in c)t[g]=c[g];a.exports=t}),880:((a,e,n)=>{var c=n(551).LGraph;function t(i,r,h){c.call(this,i,r,h)}t.prototype=Object.create(c.prototype);for(var g in c)t[g]=c[g];a.exports=t}),578:((a,e,n)=>{var c=n(551).LGraphManager;function t(i){c.call(this,i)}t.prototype=Object.create(c.prototype);for(var g in c)t[g]=c[g];a.exports=t}),765:((a,e,n)=>{var c=n(551).FDLayout,t=n(578),g=n(880),i=n(991),r=n(767),h=n(806),f=n(902),l=n(551).FDLayoutConstants,L=n(551).LayoutConstants,y=n(551).Point,p=n(551).PointD,C=n(551).DimensionD,R=n(551).Layout,A=n(551).Integer,S=n(551).IGeometry,B=n(551).LGraph,Y=n(551).Transform,tt=n(551).LinkedList;function x(){c.call(this),this.toBeTiled={},this.constraints={}}x.prototype=Object.create(c.prototype);for(var Z in c)x[Z]=c[Z];x.prototype.newGraphManager=function(){var s=new t(this);return this.graphManager=s,s},x.prototype.newGraph=function(s){return new g(null,this.graphManager,s)},x.prototype.newNode=function(s){return new i(this.graphManager,s)},x.prototype.newEdge=function(s){return new r(null,null,s)},x.prototype.initParameters=function(){c.prototype.initParameters.call(this,arguments),this.isSubLayout||(h.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=h.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=h.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=l.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=l.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=l.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=l.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},x.prototype.initSpringEmbedder=function(){c.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/l.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},x.prototype.layout=function(){var s=L.DEFAULT_CREATE_BENDS_AS_NEEDED;return s&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},x.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental){if(h.TREE_REDUCTION_ON_INCREMENTAL){this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var m=new Set(this.getAllNodes()),v=this.nodesWithGravity.filter(function(D){return m.has(D)});this.graphManager.setAllNodesToApplyGravitation(v)}}else{var s=this.getFlatForest();if(s.length>0)this.positionNodesRadially(s);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var m=new Set(this.getAllNodes()),v=this.nodesWithGravity.filter(function(T){return m.has(T)});this.graphManager.setAllNodesToApplyGravitation(v),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(f.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),h.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},x.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%l.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var s=new Set(this.getAllNodes()),m=this.nodesWithGravity.filter(function(d){return s.has(d)});this.graphManager.setAllNodesToApplyGravitation(m),this.graphManager.updateBounds(),this.updateGrid(),h.PURE_INCREMENTAL?this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),h.PURE_INCREMENTAL?this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var v=!this.isTreeGrowing&&!this.isGrowthFinished,T=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(v,T),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},x.prototype.getPositionsData=function(){for(var s=this.graphManager.getAllNodes(),m={},v=0;v0&&this.updateDisplacements();for(var v=0;v0&&(T.fixedNodeWeight=D)}}if(this.constraints.relativePlacementConstraint){var O=new Map,P=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(M){s.fixedNodesOnHorizontal.add(M),s.fixedNodesOnVertical.add(M)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var F=this.constraints.alignmentConstraint.vertical,v=0;v=2*M.length/3;J--)U=Math.floor(Math.random()*(J+1)),X=M[J],M[J]=M[U],M[U]=X;return M},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(M){if(M.left){var U=O.has(M.left)?O.get(M.left):M.left,X=O.has(M.right)?O.get(M.right):M.right;s.nodesInRelativeHorizontal.includes(U)||(s.nodesInRelativeHorizontal.push(U),s.nodeToRelativeConstraintMapHorizontal.set(U,[]),s.dummyToNodeForVerticalAlignment.has(U)?s.nodeToTempPositionMapHorizontal.set(U,s.idToNodeMap.get(s.dummyToNodeForVerticalAlignment.get(U)[0]).getCenterX()):s.nodeToTempPositionMapHorizontal.set(U,s.idToNodeMap.get(U).getCenterX())),s.nodesInRelativeHorizontal.includes(X)||(s.nodesInRelativeHorizontal.push(X),s.nodeToRelativeConstraintMapHorizontal.set(X,[]),s.dummyToNodeForVerticalAlignment.has(X)?s.nodeToTempPositionMapHorizontal.set(X,s.idToNodeMap.get(s.dummyToNodeForVerticalAlignment.get(X)[0]).getCenterX()):s.nodeToTempPositionMapHorizontal.set(X,s.idToNodeMap.get(X).getCenterX())),s.nodeToRelativeConstraintMapHorizontal.get(U).push({right:X,gap:M.gap}),s.nodeToRelativeConstraintMapHorizontal.get(X).push({left:U,gap:M.gap})}else{var J=P.has(M.top)?P.get(M.top):M.top,st=P.has(M.bottom)?P.get(M.bottom):M.bottom;s.nodesInRelativeVertical.includes(J)||(s.nodesInRelativeVertical.push(J),s.nodeToRelativeConstraintMapVertical.set(J,[]),s.dummyToNodeForHorizontalAlignment.has(J)?s.nodeToTempPositionMapVertical.set(J,s.idToNodeMap.get(s.dummyToNodeForHorizontalAlignment.get(J)[0]).getCenterY()):s.nodeToTempPositionMapVertical.set(J,s.idToNodeMap.get(J).getCenterY())),s.nodesInRelativeVertical.includes(st)||(s.nodesInRelativeVertical.push(st),s.nodeToRelativeConstraintMapVertical.set(st,[]),s.dummyToNodeForHorizontalAlignment.has(st)?s.nodeToTempPositionMapVertical.set(st,s.idToNodeMap.get(s.dummyToNodeForHorizontalAlignment.get(st)[0]).getCenterY()):s.nodeToTempPositionMapVertical.set(st,s.idToNodeMap.get(st).getCenterY())),s.nodeToRelativeConstraintMapVertical.get(J).push({bottom:st,gap:M.gap}),s.nodeToRelativeConstraintMapVertical.get(st).push({top:J,gap:M.gap})}});else{var k=new Map,_=new Map;this.constraints.relativePlacementConstraint.forEach(function(M){if(M.left){var U=O.has(M.left)?O.get(M.left):M.left,X=O.has(M.right)?O.get(M.right):M.right;k.has(U)?k.get(U).push(X):k.set(U,[X]),k.has(X)?k.get(X).push(U):k.set(X,[U])}else{var J=P.has(M.top)?P.get(M.top):M.top,st=P.has(M.bottom)?P.get(M.bottom):M.bottom;_.has(J)?_.get(J).push(st):_.set(J,[st]),_.has(st)?_.get(st).push(J):_.set(st,[J])}});var b=function(U,X){var J=[],st=[],Lt=new tt,St=new Set,Q=0;return U.forEach(function(Ut,Mt){if(!St.has(Mt)){J[Q]=[],st[Q]=!1;var at=Mt;for(Lt.push(at),St.add(at),J[Q].push(at);Lt.length!=0;){at=Lt.shift(),X.has(at)&&(st[Q]=!0);var et=U.get(at);et.forEach(function(pt){St.has(pt)||(Lt.push(pt),St.add(pt),J[Q].push(pt))})}Q++}}),{components:J,isFixed:st}},j=b(k,s.fixedNodesOnHorizontal);this.componentsOnHorizontal=j.components,this.fixedComponentsOnHorizontal=j.isFixed;var V=b(_,s.fixedNodesOnVertical);this.componentsOnVertical=V.components,this.fixedComponentsOnVertical=V.isFixed}}},x.prototype.updateDisplacements=function(){var s=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(V){var M=s.idToNodeMap.get(V.nodeId);M.displacementX=0,M.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var m=this.constraints.alignmentConstraint.vertical,v=0;v1){var P;for(P=0;PT&&(T=Math.floor(O.y)),D=Math.floor(O.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new p(L.WORLD_CENTER_X-O.x/2,L.WORLD_CENTER_Y-O.y/2))},x.radialLayout=function(s,m,v){var T=Math.max(this.maxDiagonalInTree(s),h.DEFAULT_RADIAL_SEPARATION);x.branchRadialLayout(m,null,0,359,0,T);var d=B.calculateBounds(s),D=new Y;D.setDeviceOrgX(d.getMinX()),D.setDeviceOrgY(d.getMinY()),D.setWorldOrgX(v.x),D.setWorldOrgY(v.y);for(var O=0;O1;){var J=X[0];X.splice(0,1);var st=b.indexOf(J);st>=0&&b.splice(st,1),M--,j--}m!=null?U=(b.indexOf(X[0])+1)%M:U=0;for(var Lt=Math.abs(T-v)/j,St=U;V!=j;St=++St%M){var Q=b[St].getOtherEnd(s);if(Q!=m){var Ut=(v+V*Lt)%360,Mt=(Ut+Lt)%360;x.branchRadialLayout(Q,s,Ut,Mt,d+D,D),V++}}},x.maxDiagonalInTree=function(s){for(var m=A.MIN_VALUE,v=0;vm&&(m=d)}return m},x.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},x.prototype.groupZeroDegreeMembers=function(){var s=this,m={};this.memberGroups={},this.idToDummyNode={};for(var v=[],T=this.graphManager.getAllNodes(),d=0;d"u"&&(m[P]=[]),m[P]=m[P].concat(D)}Object.keys(m).forEach(function(F){if(m[F].length>1){var I="DummyCompound_"+F;s.memberGroups[I]=m[F];var k=m[F][0].getParent(),_=new i(s.graphManager);_.id=I,_.paddingLeft=k.paddingLeft||0,_.paddingRight=k.paddingRight||0,_.paddingBottom=k.paddingBottom||0,_.paddingTop=k.paddingTop||0,s.idToDummyNode[I]=_;var b=s.getGraphManager().add(s.newGraph(),_),j=k.getChild();j.add(_);for(var V=0;Vd?(T.rect.x-=(T.labelWidth-d)/2,T.setWidth(T.labelWidth),T.labelMarginLeft=(T.labelWidth-d)/2):T.labelPosHorizontal=="right"&&T.setWidth(d+T.labelWidth)),T.labelHeight&&(T.labelPosVertical=="top"?(T.rect.y-=T.labelHeight,T.setHeight(D+T.labelHeight),T.labelMarginTop=T.labelHeight):T.labelPosVertical=="center"&&T.labelHeight>D?(T.rect.y-=(T.labelHeight-D)/2,T.setHeight(T.labelHeight),T.labelMarginTop=(T.labelHeight-D)/2):T.labelPosVertical=="bottom"&&T.setHeight(D+T.labelHeight))}})},x.prototype.repopulateCompounds=function(){for(var s=this.compoundOrder.length-1;s>=0;s--){var m=this.compoundOrder[s],v=m.id,T=m.paddingLeft,d=m.paddingTop,D=m.labelMarginLeft,O=m.labelMarginTop;this.adjustLocations(this.tiledMemberPack[v],m.rect.x,m.rect.y,T,d,D,O)}},x.prototype.repopulateZeroDegreeMembers=function(){var s=this,m=this.tiledZeroDegreePack;Object.keys(m).forEach(function(v){var T=s.idToDummyNode[v],d=T.paddingLeft,D=T.paddingTop,O=T.labelMarginLeft,P=T.labelMarginTop;s.adjustLocations(m[v],T.rect.x,T.rect.y,d,D,O,P)})},x.prototype.getToBeTiled=function(s){var m=s.id;if(this.toBeTiled[m]!=null)return this.toBeTiled[m];var v=s.getChild();if(v==null)return this.toBeTiled[m]=!1,!1;for(var T=v.getNodes(),d=0;d0)return this.toBeTiled[m]=!1,!1;if(D.getChild()==null){this.toBeTiled[D.id]=!1;continue}if(!this.getToBeTiled(D))return this.toBeTiled[m]=!1,!1}return this.toBeTiled[m]=!0,!0},x.prototype.getNodeDegree=function(s){for(var m=s.id,v=s.getEdges(),T=0,d=0;dk&&(k=b.rect.height)}v+=k+s.verticalPadding}},x.prototype.tileCompoundMembers=function(s,m){var v=this;this.tiledMemberPack=[],Object.keys(s).forEach(function(T){var d=m[T];if(v.tiledMemberPack[T]=v.tileNodes(s[T],d.paddingLeft+d.paddingRight),d.rect.width=v.tiledMemberPack[T].width,d.rect.height=v.tiledMemberPack[T].height,d.setCenter(v.tiledMemberPack[T].centerX,v.tiledMemberPack[T].centerY),d.labelMarginLeft=0,d.labelMarginTop=0,h.NODE_DIMENSIONS_INCLUDE_LABELS){var D=d.rect.width,O=d.rect.height;d.labelWidth&&(d.labelPosHorizontal=="left"?(d.rect.x-=d.labelWidth,d.setWidth(D+d.labelWidth),d.labelMarginLeft=d.labelWidth):d.labelPosHorizontal=="center"&&d.labelWidth>D?(d.rect.x-=(d.labelWidth-D)/2,d.setWidth(d.labelWidth),d.labelMarginLeft=(d.labelWidth-D)/2):d.labelPosHorizontal=="right"&&d.setWidth(D+d.labelWidth)),d.labelHeight&&(d.labelPosVertical=="top"?(d.rect.y-=d.labelHeight,d.setHeight(O+d.labelHeight),d.labelMarginTop=d.labelHeight):d.labelPosVertical=="center"&&d.labelHeight>O?(d.rect.y-=(d.labelHeight-O)/2,d.setHeight(d.labelHeight),d.labelMarginTop=(d.labelHeight-O)/2):d.labelPosVertical=="bottom"&&d.setHeight(O+d.labelHeight))}})},x.prototype.tileNodes=function(s,m){var v=this.tileNodesByFavoringDim(s,m,!0),T=this.tileNodesByFavoringDim(s,m,!1),d=this.getOrgRatio(v),D=this.getOrgRatio(T),O;return DP&&(P=V.getWidth())});var F=D/d,I=O/d,k=Math.pow(v-T,2)+4*(F+T)*(I+v)*d,_=(T-v+Math.sqrt(k))/(2*(F+T)),b;m?(b=Math.ceil(_),b==_&&b++):b=Math.floor(_);var j=b*(F+T)-T;return P>j&&(j=P),j+=T*2,j},x.prototype.tileNodesByFavoringDim=function(s,m,v){var T=h.TILING_PADDING_VERTICAL,d=h.TILING_PADDING_HORIZONTAL,D=h.TILING_COMPARE_BY,O={rows:[],rowWidth:[],rowHeight:[],width:0,height:m,verticalPadding:T,horizontalPadding:d,centerX:0,centerY:0};D&&(O.idealRowWidth=this.calcIdealRowWidth(s,v));var P=function(M){return M.rect.width*M.rect.height},F=function(M,U){return P(U)-P(M)};s.sort(function(V,M){var U=F;return O.idealRowWidth?(U=D,U(V.id,M.id)):U(V,M)});for(var I=0,k=0,_=0;_0&&(O+=s.horizontalPadding),s.rowWidth[v]=O,s.width0&&(P+=s.verticalPadding);var F=0;P>s.rowHeight[v]&&(F=s.rowHeight[v],s.rowHeight[v]=P,F=s.rowHeight[v]-F),s.height+=F,s.rows[v].push(m)},x.prototype.getShortestRowIndex=function(s){for(var m=-1,v=Number.MAX_VALUE,T=0;Tv&&(m=T,v=s.rowWidth[T]);return m},x.prototype.canAddHorizontal=function(s,m,v){if(s.idealRowWidth){var T=s.rows.length-1,d=s.rowWidth[T];return d+m+s.horizontalPadding<=s.idealRowWidth}var D=this.getShortestRowIndex(s);if(D<0)return!0;var O=s.rowWidth[D];if(O+s.horizontalPadding+m<=s.width)return!0;var P=0;s.rowHeight[D]0&&(P=v+s.verticalPadding-s.rowHeight[D]);var F;s.width-O>=m+s.horizontalPadding?F=(s.height+P)/(O+m+s.horizontalPadding):F=(s.height+P)/s.width,P=v+s.verticalPadding;var I;return s.widthD&&m!=v){T.splice(-1,1),s.rows[v].push(d),s.rowWidth[m]=s.rowWidth[m]-D,s.rowWidth[v]=s.rowWidth[v]+D,s.width=s.rowWidth[instance.getLongestRowIndex(s)];for(var O=Number.MIN_VALUE,P=0;PO&&(O=T[P].height);m>0&&(O+=s.verticalPadding);var F=s.rowHeight[m]+s.rowHeight[v];s.rowHeight[m]=O,s.rowHeight[v]0)for(var j=d;j<=D;j++)b[0]+=this.grid[j][O-1].length+this.grid[j][O].length-1;if(D0)for(var j=O;j<=P;j++)b[3]+=this.grid[d-1][j].length+this.grid[d][j].length-1;for(var V=A.MAX_VALUE,M,U,X=0;X{var c=n(551).FDLayoutNode,t=n(551).IMath;function g(r,h,f,l){c.call(this,r,h,f,l)}g.prototype=Object.create(c.prototype);for(var i in c)g[i]=c[i];g.prototype.calculateDisplacement=function(){var r=this.graphManager.getLayout();this.getChild()!=null&&this.fixedNodeWeight?(this.displacementX+=r.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=r.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=r.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=r.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>r.coolingFactor*r.maxNodeDisplacement&&(this.displacementX=r.coolingFactor*r.maxNodeDisplacement*t.sign(this.displacementX)),Math.abs(this.displacementY)>r.coolingFactor*r.maxNodeDisplacement&&(this.displacementY=r.coolingFactor*r.maxNodeDisplacement*t.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},g.prototype.propogateDisplacementToChildren=function(r,h){for(var f=this.getChild().getNodes(),l,L=0;L{function c(f){if(Array.isArray(f)){for(var l=0,L=Array(f.length);l0){var dt=0;it.forEach(function(lt){W=="horizontal"?(q.set(lt,y.has(lt)?p[y.get(lt)]:$.get(lt)),dt+=q.get(lt)):(q.set(lt,y.has(lt)?C[y.get(lt)]:$.get(lt)),dt+=q.get(lt))}),dt=dt/it.length,ot.forEach(function(lt){z.has(lt)||q.set(lt,dt)})}else{var nt=0;ot.forEach(function(lt){W=="horizontal"?nt+=y.has(lt)?p[y.get(lt)]:$.get(lt):nt+=y.has(lt)?C[y.get(lt)]:$.get(lt)}),nt=nt/ot.length,ot.forEach(function(lt){q.set(lt,nt)})}});for(var rt=function(){var it=gt.shift(),dt=H.get(it);dt.forEach(function(nt){if(q.get(nt.id)lt&&(lt=Xt),ztFt&&(Ft=zt)}}catch(te){Vt=!0,Dt=te}finally{try{!xt&&Nt.return&&Nt.return()}finally{if(Vt)throw Dt}}var de=(dt+lt)/2-(nt+Ft)/2,Qt=!0,Kt=!1,jt=void 0;try{for(var Jt=ot[Symbol.iterator](),he;!(Qt=(he=Jt.next()).done);Qt=!0){var _t=he.value;q.set(_t,q.get(_t)+de)}}catch(te){Kt=!0,jt=te}finally{try{!Qt&&Jt.return&&Jt.return()}finally{if(Kt)throw jt}}})}return q},Z=function(H){var W=0,z=0,$=0,K=0;if(H.forEach(function(ht){ht.left?p[y.get(ht.left)]-p[y.get(ht.right)]>=0?W++:z++:C[y.get(ht.top)]-C[y.get(ht.bottom)]>=0?$++:K++}),W>z&&$>K)for(var ut=0;utz)for(var ft=0;ftK)for(var q=0;q1)l.fixedNodeConstraint.forEach(function(G,H){T[H]=[G.position.x,G.position.y],d[H]=[p[y.get(G.nodeId)],C[y.get(G.nodeId)]]}),D=!0;else if(l.alignmentConstraint)(function(){var G=0;if(l.alignmentConstraint.vertical){for(var H=l.alignmentConstraint.vertical,W=function(q){var ht=new Set;H[q].forEach(function(vt){ht.add(vt)});var gt=new Set([].concat(c(ht)).filter(function(vt){return P.has(vt)})),rt=void 0;gt.size>0?rt=p[y.get(gt.values().next().value)]:rt=tt(ht).x,H[q].forEach(function(vt){T[G]=[rt,C[y.get(vt)]],d[G]=[p[y.get(vt)],C[y.get(vt)]],G++})},z=0;z0?rt=p[y.get(gt.values().next().value)]:rt=tt(ht).y,$[q].forEach(function(vt){T[G]=[p[y.get(vt)],rt],d[G]=[p[y.get(vt)],C[y.get(vt)]],G++})},ut=0;ut<$.length;ut++)K(ut);D=!0}l.relativePlacementConstraint&&(O=!0)})();else if(l.relativePlacementConstraint){for(var _=0,b=0,j=0;j_&&(_=k[j].length,b=j);if(_0){var Ct={x:0,y:0};l.fixedNodeConstraint.forEach(function(G,H){var W={x:p[y.get(G.nodeId)],y:C[y.get(G.nodeId)]},z=G.position,$=Y(z,W);Ct.x+=$.x,Ct.y+=$.y}),Ct.x/=l.fixedNodeConstraint.length,Ct.y/=l.fixedNodeConstraint.length,p.forEach(function(G,H){p[H]+=Ct.x}),C.forEach(function(G,H){C[H]+=Ct.y}),l.fixedNodeConstraint.forEach(function(G){p[y.get(G.nodeId)]=G.position.x,C[y.get(G.nodeId)]=G.position.y})}if(l.alignmentConstraint){if(l.alignmentConstraint.vertical)for(var mt=l.alignmentConstraint.vertical,Tt=function(H){var W=new Set;mt[H].forEach(function(K){W.add(K)});var z=new Set([].concat(c(W)).filter(function(K){return P.has(K)})),$=void 0;z.size>0?$=p[y.get(z.values().next().value)]:$=tt(W).x,W.forEach(function(K){P.has(K)||(p[y.get(K)]=$)})},Ot=0;Ot0?$=C[y.get(z.values().next().value)]:$=tt(W).y,W.forEach(function(K){P.has(K)||(C[y.get(K)]=$)})},Pt=0;Pt{a.exports=E})},N={};function u(a){var e=N[a];if(e!==void 0)return e.exports;var n=N[a]={exports:{}};return w[a](n,n.exports,u),n.exports}var o=u(45);return o})()})});var _e=me((oe,Me)=>{"use strict";(function(w,N){typeof oe=="object"&&typeof Me=="object"?Me.exports=N(we()):typeof define=="function"&&define.amd?define(["cose-base"],N):typeof oe=="object"?oe.cytoscapeFcose=N(we()):w.cytoscapeFcose=N(w.coseBase)})(oe,function(E){return(()=>{"use strict";var w={658:(a=>{a.exports=Object.assign!=null?Object.assign.bind(Object):function(e){for(var n=arguments.length,c=Array(n>1?n-1:0),t=1;t{var c=(function(){function i(r,h){var f=[],l=!0,L=!1,y=void 0;try{for(var p=r[Symbol.iterator](),C;!(l=(C=p.next()).done)&&(f.push(C.value),!(h&&f.length===h));l=!0);}catch(R){L=!0,y=R}finally{try{!l&&p.return&&p.return()}finally{if(L)throw y}}return f}return function(r,h){if(Array.isArray(r))return r;if(Symbol.iterator in Object(r))return i(r,h);throw new TypeError("Invalid attempt to destructure non-iterable instance")}})(),t=n(140).layoutBase.LinkedList,g={};g.getTopMostNodes=function(i){for(var r={},h=0;h0&&D.merge(I)});for(var O=0;O1){C=y[0],R=C.connectedEdges().length,y.forEach(function(d){d.connectedEdges().length0&&f.set("dummy"+(f.size+1),B),Y},g.relocateComponent=function(i,r,h){if(!h.fixedNodeConstraint){var f=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,L=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY;if(h.quality=="draft"){var p=!0,C=!1,R=void 0;try{for(var A=r.nodeIndexes[Symbol.iterator](),S;!(p=(S=A.next()).done);p=!0){var B=S.value,Y=c(B,2),tt=Y[0],x=Y[1],Z=h.cy.getElementById(tt);if(Z){var s=Z.boundingBox(),m=r.xCoords[x]-s.w/2,v=r.xCoords[x]+s.w/2,T=r.yCoords[x]-s.h/2,d=r.yCoords[x]+s.h/2;ml&&(l=v),Ty&&(y=d)}}}catch(I){C=!0,R=I}finally{try{!p&&A.return&&A.return()}finally{if(C)throw R}}var D=i.x-(l+f)/2,O=i.y-(y+L)/2;r.xCoords=r.xCoords.map(function(I){return I+D}),r.yCoords=r.yCoords.map(function(I){return I+O})}else{Object.keys(r).forEach(function(I){var k=r[I],_=k.getRect().x,b=k.getRect().x+k.getRect().width,j=k.getRect().y,V=k.getRect().y+k.getRect().height;_l&&(l=b),jy&&(y=V)});var P=i.x-(l+f)/2,F=i.y-(y+L)/2;Object.keys(r).forEach(function(I){var k=r[I];k.setCenter(k.getCenterX()+P,k.getCenterY()+F)})}}},g.calcBoundingBox=function(i,r,h,f){for(var l=Number.MAX_SAFE_INTEGER,L=Number.MIN_SAFE_INTEGER,y=Number.MAX_SAFE_INTEGER,p=Number.MIN_SAFE_INTEGER,C=void 0,R=void 0,A=void 0,S=void 0,B=i.descendants().not(":parent"),Y=B.length,tt=0;ttC&&(l=C),LA&&(y=A),p{var c=n(548),t=n(140).CoSELayout,g=n(140).CoSENode,i=n(140).layoutBase.PointD,r=n(140).layoutBase.DimensionD,h=n(140).layoutBase.LayoutConstants,f=n(140).layoutBase.FDLayoutConstants,l=n(140).CoSEConstants,L=function(p,C){var R=p.cy,A=p.eles,S=A.nodes(),B=A.edges(),Y=void 0,tt=void 0,x=void 0,Z={};p.randomize&&(Y=C.nodeIndexes,tt=C.xCoords,x=C.yCoords);var s=function(I){return typeof I=="function"},m=function(I,k){return s(I)?I(k):I},v=c.calcParentsWithoutChildren(R,A),T=function F(I,k,_,b){for(var j=k.length,V=0;V0){var Lt=void 0;Lt=_.getGraphManager().add(_.newGraph(),X),F(Lt,U,_,b)}}},d=function(I,k,_){for(var b=0,j=0,V=0;V<_.length;V++){var M=_[V],U=Z[M.data("source")],X=Z[M.data("target")];if(U&&X&&U!==X&&U.getEdgesBetween(X).length==0){var J=k.add(I.newEdge(),U,X);J.id=M.id(),J.idealLength=m(p.idealEdgeLength,M),J.edgeElasticity=m(p.edgeElasticity,M),b+=J.idealLength,j++}}p.idealEdgeLength!=null&&(j>0?l.DEFAULT_EDGE_LENGTH=f.DEFAULT_EDGE_LENGTH=b/j:s(p.idealEdgeLength)?l.DEFAULT_EDGE_LENGTH=f.DEFAULT_EDGE_LENGTH=50:l.DEFAULT_EDGE_LENGTH=f.DEFAULT_EDGE_LENGTH=p.idealEdgeLength,l.MIN_REPULSION_DIST=f.MIN_REPULSION_DIST=f.DEFAULT_EDGE_LENGTH/10,l.DEFAULT_RADIAL_SEPARATION=f.DEFAULT_EDGE_LENGTH)},D=function(I,k){k.fixedNodeConstraint&&(I.constraints.fixedNodeConstraint=k.fixedNodeConstraint),k.alignmentConstraint&&(I.constraints.alignmentConstraint=k.alignmentConstraint),k.relativePlacementConstraint&&(I.constraints.relativePlacementConstraint=k.relativePlacementConstraint)};p.nestingFactor!=null&&(l.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=f.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=p.nestingFactor),p.gravity!=null&&(l.DEFAULT_GRAVITY_STRENGTH=f.DEFAULT_GRAVITY_STRENGTH=p.gravity),p.numIter!=null&&(l.MAX_ITERATIONS=f.MAX_ITERATIONS=p.numIter),p.gravityRange!=null&&(l.DEFAULT_GRAVITY_RANGE_FACTOR=f.DEFAULT_GRAVITY_RANGE_FACTOR=p.gravityRange),p.gravityCompound!=null&&(l.DEFAULT_COMPOUND_GRAVITY_STRENGTH=f.DEFAULT_COMPOUND_GRAVITY_STRENGTH=p.gravityCompound),p.gravityRangeCompound!=null&&(l.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=f.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=p.gravityRangeCompound),p.initialEnergyOnIncremental!=null&&(l.DEFAULT_COOLING_FACTOR_INCREMENTAL=f.DEFAULT_COOLING_FACTOR_INCREMENTAL=p.initialEnergyOnIncremental),p.tilingCompareBy!=null&&(l.TILING_COMPARE_BY=p.tilingCompareBy),p.quality=="proof"?h.QUALITY=2:h.QUALITY=0,l.NODE_DIMENSIONS_INCLUDE_LABELS=f.NODE_DIMENSIONS_INCLUDE_LABELS=h.NODE_DIMENSIONS_INCLUDE_LABELS=p.nodeDimensionsIncludeLabels,l.DEFAULT_INCREMENTAL=f.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!p.randomize,l.ANIMATE=f.ANIMATE=h.ANIMATE=p.animate,l.TILE=p.tile,l.TILING_PADDING_VERTICAL=typeof p.tilingPaddingVertical=="function"?p.tilingPaddingVertical.call():p.tilingPaddingVertical,l.TILING_PADDING_HORIZONTAL=typeof p.tilingPaddingHorizontal=="function"?p.tilingPaddingHorizontal.call():p.tilingPaddingHorizontal,l.DEFAULT_INCREMENTAL=f.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!0,l.PURE_INCREMENTAL=!p.randomize,h.DEFAULT_UNIFORM_LEAF_NODE_SIZES=p.uniformNodeDimensions,p.step=="transformed"&&(l.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,l.ENFORCE_CONSTRAINTS=!1,l.APPLY_LAYOUT=!1),p.step=="enforced"&&(l.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,l.ENFORCE_CONSTRAINTS=!0,l.APPLY_LAYOUT=!1),p.step=="cose"&&(l.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,l.ENFORCE_CONSTRAINTS=!1,l.APPLY_LAYOUT=!0),p.step=="all"&&(p.randomize?l.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:l.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,l.ENFORCE_CONSTRAINTS=!0,l.APPLY_LAYOUT=!0),p.fixedNodeConstraint||p.alignmentConstraint||p.relativePlacementConstraint?l.TREE_REDUCTION_ON_INCREMENTAL=!1:l.TREE_REDUCTION_ON_INCREMENTAL=!0;var O=new t,P=O.newGraphManager();return T(P.addRoot(),c.getTopMostNodes(S),O,p),d(O,P,B),D(O,p),O.runLayout(),Z};a.exports={coseLayout:L}}),212:((a,e,n)=>{var c=(function(){function p(C,R){for(var A=0;A0)if(d){var P=i.getTopMostNodes(A.eles.nodes());if(s=i.connectComponents(S,A.eles,P),s.forEach(function(at){var et=at.boundingBox();m.push({x:et.x1+et.w/2,y:et.y1+et.h/2})}),A.randomize&&s.forEach(function(at){A.eles=at,Y.push(h(A))}),A.quality=="default"||A.quality=="proof"){var F=S.collection();if(A.tile){var I=new Map,k=[],_=[],b=0,j={nodeIndexes:I,xCoords:k,yCoords:_},V=[];if(s.forEach(function(at,et){at.edges().length==0&&(at.nodes().forEach(function(pt,Et){F.merge(at.nodes()[Et]),pt.isParent()||(j.nodeIndexes.set(at.nodes()[Et].id(),b++),j.xCoords.push(at.nodes()[0].position().x),j.yCoords.push(at.nodes()[0].position().y))}),V.push(et))}),F.length>1){var M=F.boundingBox();m.push({x:M.x1+M.w/2,y:M.y1+M.h/2}),s.push(F),Y.push(j);for(var U=V.length-1;U>=0;U--)s.splice(V[U],1),Y.splice(V[U],1),m.splice(V[U],1)}}s.forEach(function(at,et){A.eles=at,Z.push(l(A,Y[et])),i.relocateComponent(m[et],Z[et],A)})}else s.forEach(function(at,et){i.relocateComponent(m[et],Y[et],A)});var X=new Set;if(s.length>1){var J=[],st=B.filter(function(at){return at.css("display")=="none"});s.forEach(function(at,et){var pt=void 0;if(A.quality=="draft"&&(pt=Y[et].nodeIndexes),at.nodes().not(st).length>0){var Et={};Et.edges=[],Et.nodes=[];var Ct=void 0;at.nodes().not(st).forEach(function(mt){if(A.quality=="draft")if(!mt.isParent())Ct=pt.get(mt.id()),Et.nodes.push({x:Y[et].xCoords[Ct]-mt.boundingbox().w/2,y:Y[et].yCoords[Ct]-mt.boundingbox().h/2,width:mt.boundingbox().w,height:mt.boundingbox().h});else{var Tt=i.calcBoundingBox(mt,Y[et].xCoords,Y[et].yCoords,pt);Et.nodes.push({x:Tt.topLeftX,y:Tt.topLeftY,width:Tt.width,height:Tt.height})}else Z[et][mt.id()]&&Et.nodes.push({x:Z[et][mt.id()].getLeft(),y:Z[et][mt.id()].getTop(),width:Z[et][mt.id()].getWidth(),height:Z[et][mt.id()].getHeight()})}),at.edges().forEach(function(mt){var Tt=mt.source(),Ot=mt.target();if(Tt.css("display")!="none"&&Ot.css("display")!="none")if(A.quality=="draft"){var It=pt.get(Tt.id()),Wt=pt.get(Ot.id()),Pt=[],Yt=[];if(Tt.isParent()){var bt=i.calcBoundingBox(Tt,Y[et].xCoords,Y[et].yCoords,pt);Pt.push(bt.topLeftX+bt.width/2),Pt.push(bt.topLeftY+bt.height/2)}else Pt.push(Y[et].xCoords[It]),Pt.push(Y[et].yCoords[It]);if(Ot.isParent()){var G=i.calcBoundingBox(Ot,Y[et].xCoords,Y[et].yCoords,pt);Yt.push(G.topLeftX+G.width/2),Yt.push(G.topLeftY+G.height/2)}else Yt.push(Y[et].xCoords[Wt]),Yt.push(Y[et].yCoords[Wt]);Et.edges.push({startX:Pt[0],startY:Pt[1],endX:Yt[0],endY:Yt[1]})}else Z[et][Tt.id()]&&Z[et][Ot.id()]&&Et.edges.push({startX:Z[et][Tt.id()].getCenterX(),startY:Z[et][Tt.id()].getCenterY(),endX:Z[et][Ot.id()].getCenterX(),endY:Z[et][Ot.id()].getCenterY()})}),Et.nodes.length>0&&(J.push(Et),X.add(et))}});var Lt=T.packComponents(J,A.randomize).shifts;if(A.quality=="draft")Y.forEach(function(at,et){var pt=at.xCoords.map(function(Ct){return Ct+Lt[et].dx}),Et=at.yCoords.map(function(Ct){return Ct+Lt[et].dy});at.xCoords=pt,at.yCoords=Et});else{var St=0;X.forEach(function(at){Object.keys(Z[at]).forEach(function(et){var pt=Z[at][et];pt.setCenter(pt.getCenterX()+Lt[St].dx,pt.getCenterY()+Lt[St].dy)}),St++})}}}else{var D=A.eles.boundingBox();if(m.push({x:D.x1+D.w/2,y:D.y1+D.h/2}),A.randomize){var O=h(A);Y.push(O)}A.quality=="default"||A.quality=="proof"?(Z.push(l(A,Y[0])),i.relocateComponent(m[0],Z[0],A)):i.relocateComponent(m[0],Y[0],A)}var Q=function(et,pt){if(A.quality=="default"||A.quality=="proof"){typeof et=="number"&&(et=pt);var Et=void 0,Ct=void 0,mt=et.data("id");return Z.forEach(function(Ot){mt in Ot&&(Et={x:Ot[mt].getRect().getCenterX(),y:Ot[mt].getRect().getCenterY()},Ct=Ot[mt])}),A.nodeDimensionsIncludeLabels&&(Ct.labelWidth&&(Ct.labelPosHorizontal=="left"?Et.x+=Ct.labelWidth/2:Ct.labelPosHorizontal=="right"&&(Et.x-=Ct.labelWidth/2)),Ct.labelHeight&&(Ct.labelPosVertical=="top"?Et.y+=Ct.labelHeight/2:Ct.labelPosVertical=="bottom"&&(Et.y-=Ct.labelHeight/2))),Et==null&&(Et={x:et.position("x"),y:et.position("y")}),{x:Et.x,y:Et.y}}else{var Tt=void 0;return Y.forEach(function(Ot){var It=Ot.nodeIndexes.get(et.id());It!=null&&(Tt={x:Ot.xCoords[It],y:Ot.yCoords[It]})}),Tt==null&&(Tt={x:et.position("x"),y:et.position("y")}),{x:Tt.x,y:Tt.y}}};if(A.quality=="default"||A.quality=="proof"||A.randomize){var Ut=i.calcParentsWithoutChildren(S,B),Mt=B.filter(function(at){return at.css("display")=="none"});A.eles=B.not(Mt),B.nodes().not(":parent").not(Mt).layoutPositions(R,A,Q),Ut.length>0&&Ut.forEach(function(at){at.position(Q(at))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")}}]),p})();a.exports=y}),657:((a,e,n)=>{var c=n(548),t=n(140).layoutBase.Matrix,g=n(140).layoutBase.SVD,i=function(h){var f=h.cy,l=h.eles,L=l.nodes(),y=l.nodes(":parent"),p=new Map,C=new Map,R=new Map,A=[],S=[],B=[],Y=[],tt=[],x=[],Z=[],s=[],m=void 0,v=void 0,T=1e8,d=1e-9,D=h.piTol,O=h.samplingType,P=h.nodeSeparation,F=void 0,I=function(){for(var W=0,z=0,$=!1;z=ut;){q=K[ut++];for(var ot=A[q],it=0;itrt&&(rt=tt[nt],vt=nt)}return vt},_=function(W){var z=void 0;if(W){z=Math.floor(Math.random()*v),m=z;for(var K=0;K=1)break;rt=gt}for(var ot=0;ot=1)break;rt=gt}for(var dt=0;dt0&&(z.isParent()?A[W].push(R.get(z.id())):A[W].push(z.id()))})});var Ut=function(W){var z=C.get(W),$=void 0;p.get(W).forEach(function(K){f.getElementById(K).isParent()?$=R.get(K):$=K,A[z].push($),A[C.get($)].push(W)})},Mt=!0,at=!1,et=void 0;try{for(var pt=p.keys()[Symbol.iterator](),Et;!(Mt=(Et=pt.next()).done);Mt=!0){var Ct=Et.value;Ut(Ct)}}catch(H){at=!0,et=H}finally{try{!Mt&&pt.return&&pt.return()}finally{if(at)throw et}}v=C.size;var mt=void 0;if(v>2){F=v{var c=n(212),t=function(i){i&&i("layout","fcose",c)};typeof cytoscape<"u"&&t(cytoscape),a.exports=t}),140:(a=>{a.exports=E})},N={};function u(a){var e=N[a];if(e!==void 0)return e.exports;var n=N[a]={exports:{}};return w[a](n,n.exports,u),n.exports}var o=u(579);return o})()})});var or=pr(_e(),1);var tr={L:"left",R:"right",T:"top",B:"bottom"},er={L:ct(E=>`${E},${E/2} 0,${E} 0,0`,"L"),R:ct(E=>`0,${E/2} ${E},0 ${E},${E}`,"R"),T:ct(E=>`0,0 ${E},0 ${E/2},${E}`,"T"),B:ct(E=>`${E/2},0 ${E},${E} 0,${E}`,"B")},ue={L:ct((E,w)=>E-w+2,"L"),R:ct((E,w)=>E-2,"R"),T:ct((E,w)=>E-w+2,"T"),B:ct((E,w)=>E-2,"B")},yr=ct(function(E){return Ht(E)?E==="L"?"R":"L":E==="T"?"B":"T"},"getOppositeArchitectureDirection"),rr=ct(function(E){let w=E;return w==="L"||w==="R"||w==="T"||w==="B"},"isArchitectureDirection"),Ht=ct(function(E){let w=E;return w==="L"||w==="R"},"isArchitectureDirectionX"),qt=ct(function(E){let w=E;return w==="T"||w==="B"},"isArchitectureDirectionY"),De=ct(function(E,w){let N=Ht(E)&&qt(w),u=qt(E)&&Ht(w);return N||u},"isArchitectureDirectionXY"),Er=ct(function(E){let w=E[0],N=E[1],u=Ht(w)&&qt(N),o=qt(w)&&Ht(N);return u||o},"isArchitecturePairXY"),mr=ct(function(E){return E!=="LL"&&E!=="RR"&&E!=="TT"&&E!=="BB"},"isValidArchitectureDirectionPair"),Oe=ct(function(E,w){let N=`${E}${w}`;return mr(N)?N:void 0},"getArchitectureDirectionPair"),Tr=ct(function([E,w],N){let u=N[0],o=N[1];return Ht(u)?qt(o)?[E+(u==="L"?-1:1),w+(o==="T"?1:-1)]:[E+(u==="L"?-1:1),w]:Ht(o)?[E+(o==="L"?1:-1),w+(u==="T"?1:-1)]:[E,w+(u==="T"?1:-1)]},"shiftPositionByArchitectureDirectionPair"),Nr=ct(function(E){return E==="LT"||E==="TL"?[1,1]:E==="BL"||E==="LB"?[1,-1]:E==="BR"||E==="RB"?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),Lr=ct(function(E,w){return De(E,w)?"bend":Ht(E)?"horizontal":"vertical"},"getArchitectureDirectionAlignment"),Cr=ct(function(E){return E.type==="service"},"isArchitectureService"),Ar=ct(function(E){return E.type==="junction"},"isArchitectureJunction"),ir=ct(E=>E.data(),"edgeData"),ie=ct(E=>E.data(),"nodeData"),wr=Pe.architecture,nr=class{constructor(){this.nodes={},this.groups={},this.edges=[],this.registeredIds={},this.elements={},this.setAccTitle=He,this.getAccTitle=We,this.setDiagramTitle=Be,this.getDiagramTitle=$e,this.getAccDescription=ze,this.setAccDescription=Ve,this.clear()}static{ct(this,"ArchitectureDB")}clear(){this.nodes={},this.groups={},this.edges=[],this.registeredIds={},this.dataStructures=void 0,this.elements={},Xe()}addService({id:E,icon:w,in:N,title:u,iconText:o}){if(this.registeredIds[E]!==void 0)throw new Error(`The service id [${E}] is already in use by another ${this.registeredIds[E]}`);if(N!==void 0){if(E===N)throw new Error(`The service [${E}] cannot be placed within itself`);if(this.registeredIds[N]===void 0)throw new Error(`The service [${E}]'s parent does not exist. Please make sure the parent is created before this service`);if(this.registeredIds[N]==="node")throw new Error(`The service [${E}]'s parent is not a group`)}this.registeredIds[E]="node",this.nodes[E]={id:E,type:"service",icon:w,iconText:o,title:u,edges:[],in:N}}getServices(){return Object.values(this.nodes).filter(Cr)}addJunction({id:E,in:w}){if(this.registeredIds[E]!==void 0)throw new Error(`The junction id [${E}] is already in use by another ${this.registeredIds[E]}`);if(w!==void 0){if(E===w)throw new Error(`The junction [${E}] cannot be placed within itself`);if(this.registeredIds[w]===void 0)throw new Error(`The junction [${E}]'s parent does not exist. Please make sure the parent is created before this junction`);if(this.registeredIds[w]==="node")throw new Error(`The junction [${E}]'s parent is not a group`)}this.registeredIds[E]="node",this.nodes[E]={id:E,type:"junction",edges:[],in:w}}getJunctions(){return Object.values(this.nodes).filter(Ar)}getNodes(){return Object.values(this.nodes)}getNode(E){return this.nodes[E]??null}addGroup({id:E,icon:w,in:N,title:u}){if(this.registeredIds?.[E]!==void 0)throw new Error(`The group id [${E}] is already in use by another ${this.registeredIds[E]}`);if(N!==void 0){if(E===N)throw new Error(`The group [${E}] cannot be placed within itself`);if(this.registeredIds?.[N]===void 0)throw new Error(`The group [${E}]'s parent does not exist. Please make sure the parent is created before this group`);if(this.registeredIds?.[N]==="node")throw new Error(`The group [${E}]'s parent is not a group`)}this.registeredIds[E]="group",this.groups[E]={id:E,icon:w,title:u,in:N}}getGroups(){return Object.values(this.groups)}addEdge({lhsId:E,rhsId:w,lhsDir:N,rhsDir:u,lhsInto:o,rhsInto:a,lhsGroup:e,rhsGroup:n,title:c}){if(!rr(N))throw new Error(`Invalid direction given for left hand side of edge ${E}--${w}. Expected (L,R,T,B) got ${String(N)}`);if(!rr(u))throw new Error(`Invalid direction given for right hand side of edge ${E}--${w}. Expected (L,R,T,B) got ${String(u)}`);if(this.nodes[E]===void 0&&this.groups[E]===void 0)throw new Error(`The left-hand id [${E}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(this.nodes[w]===void 0&&this.groups[w]===void 0)throw new Error(`The right-hand id [${w}] does not yet exist. Please create the service/group before declaring an edge to it.`);let t=this.nodes[E].in,g=this.nodes[w].in;if(e&&t&&g&&t==g)throw new Error(`The left-hand id [${E}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(n&&t&&g&&t==g)throw new Error(`The right-hand id [${w}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let i={lhsId:E,lhsDir:N,lhsInto:o,lhsGroup:e,rhsId:w,rhsDir:u,rhsInto:a,rhsGroup:n,title:c};this.edges.push(i),this.nodes[E]&&this.nodes[w]&&(this.nodes[E].edges.push(this.edges[this.edges.length-1]),this.nodes[w].edges.push(this.edges[this.edges.length-1]))}getEdges(){return this.edges}getDataStructures(){if(this.dataStructures===void 0){let E={},w=Object.entries(this.nodes).reduce((n,[c,t])=>(n[c]=t.edges.reduce((g,i)=>{let r=this.getNode(i.lhsId)?.in,h=this.getNode(i.rhsId)?.in;if(r&&h&&r!==h){let f=Lr(i.lhsDir,i.rhsDir);f!=="bend"&&(E[r]??={},E[r][h]=f,E[h]??={},E[h][r]=f)}if(i.lhsId===c){let f=Oe(i.lhsDir,i.rhsDir);f&&(g[f]=i.rhsId)}else{let f=Oe(i.rhsDir,i.lhsDir);f&&(g[f]=i.lhsId)}return g},{}),n),{}),N=Object.keys(w)[0],u={[N]:1},o=Object.keys(w).reduce((n,c)=>c===N?n:le(ee({},n),{[c]:1}),{}),a=ct(n=>{let c={[n]:[0,0]},t=[n];for(;t.length>0;){let g=t.shift();if(g){u[g]=1,delete o[g];let i=w[g],[r,h]=c[g];Object.entries(i).forEach(([f,l])=>{u[l]||(c[l]=Tr([r,h],f),t.push(l))})}}return c},"BFS"),e=[a(N)];for(;Object.keys(o).length>0;)e.push(a(Object.keys(o)[0]));this.dataStructures={adjList:w,spatialMaps:e,groupAlignments:E}}return this.dataStructures}setElementForId(E,w){this.elements[E]=w}getElementById(E){return this.elements[E]}getConfig(){return Ze(ee(ee({},wr),Ge().architecture))}getConfigField(E){return this.getConfig()[E]}},Mr=ct((E,w)=>{Ke(E,w),E.groups.map(N=>w.addGroup(N)),E.services.map(N=>w.addService(le(ee({},N),{type:"service"}))),E.junctions.map(N=>w.addJunction(le(ee({},N),{type:"junction"}))),E.edges.map(N=>w.addEdge(N))},"populateDb"),ar={parser:{yy:void 0},parse:ct(E=>Zt(null,null,function*(){let w=yield je("architecture",E);Te.debug(w);let N=ar.parser?.yy;if(!(N instanceof nr))throw new Error("parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");Mr(w,N)}),"parse")},Or=ct(E=>` + .edge { + stroke-width: ${E.archEdgeWidth}; + stroke: ${E.archEdgeColor}; + fill: none; + } + + .arrow { + fill: ${E.archEdgeArrowColor}; + } + + .node-bkg { + fill: none; + stroke: ${E.archGroupBorderColor}; + stroke-width: ${E.archGroupBorderWidth}; + stroke-dasharray: 8; + } + .node-icon-text { + display: flex; + align-items: center; + } + + .node-icon-text > div { + color: #fff; + margin: 1px; + height: fit-content; + text-align: center; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + } +`,"getStyles"),Dr=Or,re=ct(E=>`${E}`,"wrapIcon"),se={prefix:"mermaid-architecture",height:80,width:80,icons:{database:{body:re('')},server:{body:re('')},disk:{body:re('')},internet:{body:re('')},cloud:{body:re('')},unknown:Qe,blank:{body:re("")}}},xr=ct(function(E,w,N){return Zt(this,null,function*(){let u=N.getConfigField("padding"),o=N.getConfigField("iconSize"),a=o/2,e=o/6,n=e/2;yield Promise.all(w.edges().map(c=>Zt(null,null,function*(){let{source:t,sourceDir:g,sourceArrow:i,sourceGroup:r,target:h,targetDir:f,targetArrow:l,targetGroup:L,label:y}=ir(c),{x:p,y:C}=c[0].sourceEndpoint(),{x:R,y:A}=c[0].midpoint(),{x:S,y:B}=c[0].targetEndpoint(),Y=u+4;if(r&&(Ht(g)?p+=g==="L"?-Y:Y:C+=g==="T"?-Y:Y+18),L&&(Ht(f)?S+=f==="L"?-Y:Y:B+=f==="T"?-Y:Y+18),!r&&N.getNode(t)?.type==="junction"&&(Ht(g)?p+=g==="L"?a:-a:C+=g==="T"?a:-a),!L&&N.getNode(h)?.type==="junction"&&(Ht(f)?S+=f==="L"?a:-a:B+=f==="T"?a:-a),c[0]._private.rscratch){let tt=E.insert("g");if(tt.insert("path").attr("d",`M ${p},${C} L ${R},${A} L${S},${B} `).attr("class","edge").attr("id",qe(t,h,{prefix:"L"})),i){let x=Ht(g)?ue[g](p,e):p-n,Z=qt(g)?ue[g](C,e):C-n;tt.insert("polygon").attr("points",er[g](e)).attr("transform",`translate(${x},${Z})`).attr("class","arrow")}if(l){let x=Ht(f)?ue[f](S,e):S-n,Z=qt(f)?ue[f](B,e):B-n;tt.insert("polygon").attr("points",er[f](e)).attr("transform",`translate(${x},${Z})`).attr("class","arrow")}if(y){let x=De(g,f)?"XY":Ht(g)?"X":"Y",Z=0;x==="X"?Z=Math.abs(p-S):x==="Y"?Z=Math.abs(C-B)/1.5:Z=Math.abs(p-S)/2;let s=tt.append("g");if(yield ge(s,y,{useHtmlLabels:!1,width:Z,classes:"architecture-service-label"},fe()),s.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),x==="X")s.attr("transform","translate("+R+", "+A+")");else if(x==="Y")s.attr("transform","translate("+R+", "+A+") rotate(-90)");else if(x==="XY"){let m=Oe(g,f);if(m&&Er(m)){let v=s.node().getBoundingClientRect(),[T,d]=Nr(m);s.attr("dominant-baseline","auto").attr("transform",`rotate(${-1*T*d*45})`);let D=s.node().getBoundingClientRect();s.attr("transform",` + translate(${R}, ${A-v.height/2}) + translate(${T*D.width/2}, ${d*D.height/2}) + rotate(${-1*T*d*45}, 0, ${v.height/2}) + `)}}}}})))})},"drawEdges"),Ir=ct(function(E,w,N){return Zt(this,null,function*(){let o=N.getConfigField("padding")*.75,a=N.getConfigField("fontSize"),n=N.getConfigField("iconSize")/2;yield Promise.all(w.nodes().map(c=>Zt(null,null,function*(){let t=ie(c);if(t.type==="group"){let{h:g,w:i,x1:r,y1:h}=c.boundingBox(),f=E.append("rect");f.attr("id",`group-${t.id}`).attr("x",r+n).attr("y",h+n).attr("width",i).attr("height",g).attr("class","node-bkg");let l=E.append("g"),L=r,y=h;if(t.icon){let p=l.append("g");p.html(`${yield ce(t.icon,{height:o,width:o,fallbackPrefix:se.prefix})}`),p.attr("transform","translate("+(L+n+1)+", "+(y+n+1)+")"),L+=o,y+=a/2-1-2}if(t.label){let p=l.append("g");yield ge(p,t.label,{useHtmlLabels:!1,width:i,classes:"architecture-service-label"},fe()),p.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),p.attr("transform","translate("+(L+n+4)+", "+(y+n+2)+")")}N.setElementForId(t.id,f)}})))})},"drawGroups"),Rr=ct(function(E,w,N){return Zt(this,null,function*(){let u=fe();for(let o of N){let a=w.append("g"),e=E.getConfigField("iconSize");if(o.title){let g=a.append("g");yield ge(g,o.title,{useHtmlLabels:!1,width:e*1.5,classes:"architecture-service-label"},u),g.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),g.attr("transform","translate("+e/2+", "+e+")")}let n=a.append("g");if(o.icon)n.html(`${yield ce(o.icon,{height:e,width:e,fallbackPrefix:se.prefix})}`);else if(o.iconText){n.html(`${yield ce("blank",{height:e,width:e,fallbackPrefix:se.prefix})}`);let r=n.append("g").append("foreignObject").attr("width",e).attr("height",e).append("div").attr("class","node-icon-text").attr("style",`height: ${e}px;`).append("div").html(Ue(o.iconText,u)),h=parseInt(window.getComputedStyle(r.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;r.attr("style",`-webkit-line-clamp: ${Math.floor((e-2)/h)};`)}else n.append("path").attr("class","node-bkg").attr("id","node-"+o.id).attr("d",`M0,${e} V5 Q0,0 5,0 H${e-5} Q${e},0 ${e},5 V${e} Z`);a.attr("id",`service-${o.id}`).attr("class","architecture-service");let{width:c,height:t}=a.node().getBBox();o.width=c,o.height=t,E.setElementForId(o.id,a)}return 0})},"drawServices"),Sr=ct(function(E,w,N){N.forEach(u=>{let o=w.append("g"),a=E.getConfigField("iconSize");o.append("g").append("rect").attr("id","node-"+u.id).attr("fill-opacity","0").attr("width",a).attr("height",a),o.attr("class","architecture-junction");let{width:n,height:c}=o._groups[0][0].getBBox();o.width=n,o.height=c,E.setElementForId(u.id,o)})},"drawJunctions");Je([{name:se.prefix,icons:se}]);Ne.use(or.default);function sr(E,w,N){E.forEach(u=>{w.add({group:"nodes",data:{type:"service",id:u.id,icon:u.icon,label:u.title,parent:u.in,width:N.getConfigField("iconSize"),height:N.getConfigField("iconSize")},classes:"node-service"})})}ct(sr,"addServices");function hr(E,w,N){E.forEach(u=>{w.add({group:"nodes",data:{type:"junction",id:u.id,parent:u.in,width:N.getConfigField("iconSize"),height:N.getConfigField("iconSize")},classes:"node-junction"})})}ct(hr,"addJunctions");function lr(E,w){w.nodes().map(N=>{let u=ie(N);if(u.type==="group")return;u.x=N.position().x,u.y=N.position().y,E.getElementById(u.id).attr("transform","translate("+(u.x||0)+","+(u.y||0)+")")})}ct(lr,"positionNodes");function fr(E,w){E.forEach(N=>{w.add({group:"nodes",data:{type:"group",id:N.id,icon:N.icon,label:N.title,parent:N.in},classes:"node-group"})})}ct(fr,"addGroups");function cr(E,w){E.forEach(N=>{let{lhsId:u,rhsId:o,lhsInto:a,lhsGroup:e,rhsInto:n,lhsDir:c,rhsDir:t,rhsGroup:g,title:i}=N,r=De(N.lhsDir,N.rhsDir)?"segments":"straight",h={id:`${u}-${o}`,label:i,source:u,sourceDir:c,sourceArrow:a,sourceGroup:e,sourceEndpoint:c==="L"?"0 50%":c==="R"?"100% 50%":c==="T"?"50% 0":"50% 100%",target:o,targetDir:t,targetArrow:n,targetGroup:g,targetEndpoint:t==="L"?"0 50%":t==="R"?"100% 50%":t==="T"?"50% 0":"50% 100%"};w.add({group:"edges",data:h,classes:r})})}ct(cr,"addEdges");function gr(E,w,N){let u=ct((n,c)=>Object.entries(n).reduce((t,[g,i])=>{let r=0,h=Object.entries(i);if(h.length===1)return t[g]=h[0][1],t;for(let f=0;f{let c={},t={};return Object.entries(n).forEach(([g,[i,r]])=>{let h=E.getNode(g)?.in??"default";c[r]??={},c[r][h]??=[],c[r][h].push(g),t[i]??={},t[i][h]??=[],t[i][h].push(g)}),{horiz:Object.values(u(c,"horizontal")).filter(g=>g.length>1),vert:Object.values(u(t,"vertical")).filter(g=>g.length>1)}}),[a,e]=o.reduce(([n,c],{horiz:t,vert:g})=>[[...n,...t],[...c,...g]],[[],[]]);return{horizontal:a,vertical:e}}ct(gr,"getAlignments");function ur(E,w){let N=[],u=ct(a=>`${a[0]},${a[1]}`,"posToStr"),o=ct(a=>a.split(",").map(e=>parseInt(e)),"strToPos");return E.forEach(a=>{let e=Object.fromEntries(Object.entries(a).map(([g,i])=>[u(i),g])),n=[u([0,0])],c={},t={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;n.length>0;){let g=n.shift();if(g){c[g]=1;let i=e[g];if(i){let r=o(g);Object.entries(t).forEach(([h,f])=>{let l=u([r[0]+f[0],r[1]+f[1]]),L=e[l];L&&!c[l]&&(n.push(l),N.push({[tr[h]]:L,[tr[yr(h)]]:i,gap:1.5*w.getConfigField("iconSize")}))})}}}}),N}ct(ur,"getRelativeConstraints");function dr(E,w,N,u,o,{spatialMaps:a,groupAlignments:e}){return new Promise(n=>{let c=be("body").append("div").attr("id","cy").attr("style","display:none"),t=Ne({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"straight",label:"data(label)","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"edge.segments",style:{"curve-style":"segments","segment-weights":"0","segment-distances":[.5],"edge-distances":"endpoints","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"node",style:{"compound-sizing-wrt-labels":"include"}},{selector:"node[label]",style:{"text-valign":"bottom","text-halign":"center","font-size":`${o.getConfigField("fontSize")}px`}},{selector:".node-service",style:{label:"data(label)",width:"data(width)",height:"data(height)"}},{selector:".node-junction",style:{width:"data(width)",height:"data(height)"}},{selector:".node-group",style:{padding:`${o.getConfigField("padding")}px`}}],layout:{name:"grid",boundingBox:{x1:0,x2:100,y1:0,y2:100}}});c.remove(),fr(N,t),sr(E,t,o),hr(w,t,o),cr(u,t);let g=gr(o,a,e),i=ur(a,o),r=t.layout({name:"fcose",quality:"proof",styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(h){let[f,l]=h.connectedNodes(),{parent:L}=ie(f),{parent:y}=ie(l);return L===y?1.5*o.getConfigField("iconSize"):.5*o.getConfigField("iconSize")},edgeElasticity(h){let[f,l]=h.connectedNodes(),{parent:L}=ie(f),{parent:y}=ie(l);return L===y?.45:.001},alignmentConstraint:g,relativePlacementConstraint:i});r.one("layoutstop",()=>{function h(f,l,L,y){let p,C,{x:R,y:A}=f,{x:S,y:B}=l;C=(y-A+(R-L)*(A-B)/(R-S))/Math.sqrt(1+Math.pow((A-B)/(R-S),2)),p=Math.sqrt(Math.pow(y-A,2)+Math.pow(L-R,2)-Math.pow(C,2));let Y=Math.sqrt(Math.pow(S-R,2)+Math.pow(B-A,2));p=p/Y;let tt=(S-R)*(y-A)-(B-A)*(L-R);switch(!0){case tt>=0:tt=1;break;case tt<0:tt=-1;break}let x=(S-R)*(L-R)+(B-A)*(y-A);switch(!0){case x>=0:x=1;break;case x<0:x=-1;break}return C=Math.abs(C)*tt,p=p*x,{distances:C,weights:p}}ct(h,"getSegmentWeights"),t.startBatch();for(let f of Object.values(t.edges()))if(f.data?.()){let{x:l,y:L}=f.source().position(),{x:y,y:p}=f.target().position();if(l!==y&&L!==p){let C=f.sourceEndpoint(),R=f.targetEndpoint(),{sourceDir:A}=ir(f),[S,B]=qt(A)?[C.x,R.y]:[R.x,C.y],{weights:Y,distances:tt}=h(C,R,S,B);f.style("segment-distances",tt),f.style("segment-weights",Y)}}t.endBatch(),r.run()}),r.run(),t.ready(h=>{Te.info("Ready",h),n(t)})})}ct(dr,"layoutArchitecture");var Fr=ct((E,w,N,u)=>Zt(null,null,function*(){let o=u.db,a=o.getServices(),e=o.getJunctions(),n=o.getGroups(),c=o.getEdges(),t=o.getDataStructures(),g=ke(w),i=g.append("g");i.attr("class","architecture-edges");let r=g.append("g");r.attr("class","architecture-services");let h=g.append("g");h.attr("class","architecture-groups"),yield Rr(o,r,a),Sr(o,r,e);let f=yield dr(a,e,n,c,o,t);yield xr(i,f,o),yield Ir(h,f,o),lr(o,f),Ye(void 0,g,o.getConfigField("padding"),o.getConfigField("useMaxWidth"))}),"draw"),br={draw:Fr},Br={parser:ar,get db(){return new nr},renderer:br,styles:Dr};export{Br as diagram}; diff --git a/src/google/adk/cli/browser/chunk-46YSBSFN.js b/src/google/adk/cli/browser/chunk-46YSBSFN.js new file mode 100644 index 0000000000..38b07a71e3 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-46YSBSFN.js @@ -0,0 +1 @@ +import{a as i,b as e,c as o,d as a}from"./chunk-TIJO3EOA.js";import"./chunk-B2DSW4QB.js";import"./chunk-NMKTPNXE.js";import"./chunk-APNCZOFE.js";import"./chunk-ST54LLJ3.js";import"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import"./chunk-QFMJV7VH.js";import{g as t}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";var y={parser:i,get db(){return new e},renderer:a,styles:o,init:t(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{y as diagram}; diff --git a/src/google/adk/cli/browser/chunk-VUI6RO2X.js b/src/google/adk/cli/browser/chunk-4LH47YYI.js similarity index 86% rename from src/google/adk/cli/browser/chunk-VUI6RO2X.js rename to src/google/adk/cli/browser/chunk-4LH47YYI.js index de3dd9600a..9f39a1e542 100644 --- a/src/google/adk/cli/browser/chunk-VUI6RO2X.js +++ b/src/google/adk/cli/browser/chunk-4LH47YYI.js @@ -1 +1 @@ -import{$a as s,$b as y,Bb as m,Ca as a,Cb as d,Cc as I,Lb as p,Pa as i,Yb as u,Zb as v,_b as f,eb as r,fc as g,gc as h,hc as x,pd as M,qb as c,sb as l,wc as C}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function _(e,D){if(e&1&&(m(0,"section")(1,"span",1),f(2),d()()),e&2){let t=p(),n=x(0);u(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Icon),v(t.theme.components.Icon),i(2),y(n)}}var S=(()=>{class e extends M{name=I.required();resolvedName=C(()=>this.resolvePrimitive(this.name()));static \u0275fac=(()=>{let t;return function(o){return(t||(t=a(e)))(o||e)}})();static \u0275cmp=s({type:e,selectors:[["a2ui-icon"]],inputs:{name:[1,"name"]},features:[r],decls:2,vars:2,consts:[[3,"class","style"],[1,"g-icon"]],template:function(n,o){if(n&1&&(g(0),c(1,_,3,5,"section",0)),n&2){let N=h(o.resolvedName());i(),l(N?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}"]})}return e})();export{S as Icon}; +import{$a as s,$b as y,Bb as m,Ca as a,Cb as d,Cc as I,Lb as p,Pa as i,Yb as u,Zb as v,_b as f,eb as r,fc as g,gc as h,hc as x,pd as M,qb as c,sb as l,wc as C}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function _(e,D){if(e&1&&(m(0,"section")(1,"span",1),f(2),d()()),e&2){let t=p(),n=x(0);u(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Icon),v(t.theme.components.Icon),i(2),y(n)}}var S=(()=>{class e extends M{name=I.required();resolvedName=C(()=>this.resolvePrimitive(this.name()));static \u0275fac=(()=>{let t;return function(o){return(t||(t=a(e)))(o||e)}})();static \u0275cmp=s({type:e,selectors:[["a2ui-icon"]],inputs:{name:[1,"name"]},features:[r],decls:2,vars:2,consts:[[3,"class","style"],[1,"g-icon"]],template:function(n,o){if(n&1&&(g(0),c(1,_,3,5,"section",0)),n&2){let N=h(o.resolvedName());i(),l(N?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}"]})}return e})();export{S as Icon}; diff --git a/src/google/adk/cli/browser/chunk-4R6SYGKS.js b/src/google/adk/cli/browser/chunk-4R6SYGKS.js new file mode 100644 index 0000000000..b1f4852fce --- /dev/null +++ b/src/google/adk/cli/browser/chunk-4R6SYGKS.js @@ -0,0 +1 @@ +import{g as t}from"./chunk-JRNAXTJ7.js";var s=class{constructor(i){this.init=i,this.records=this.init()}static{t(this,"ImperativeState")}reset(){this.records=this.init()}};export{s as a}; diff --git a/src/google/adk/cli/browser/chunk-JUJUP2UX.js b/src/google/adk/cli/browser/chunk-4VDZU6IO.js similarity index 92% rename from src/google/adk/cli/browser/chunk-JUJUP2UX.js rename to src/google/adk/cli/browser/chunk-4VDZU6IO.js index 213e1f61d8..a2fe4c7f9c 100644 --- a/src/google/adk/cli/browser/chunk-JUJUP2UX.js +++ b/src/google/adk/cli/browser/chunk-4VDZU6IO.js @@ -1 +1 @@ -import{$a as f,Ca as _,Cc as w,Gb as I,Hb as g,Jb as T,Lb as c,Nc as E,Pa as a,Yb as C,Zb as r,_b as M,ac as D,eb as h,fc as F,gc as k,hc as S,na as p,oa as u,pd as L,qd as N,ub as x,vb as v,wb as y,wc as $,xb as d,yb as l,za as b,zb as o}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function B(n,m){if(n&1){let t=g();l(0,"button",2),T("click",function(){let e=p(t).$index,i=c();return u(i.selectedIndex.set(e))}),M(1),o()}if(n&2){let t=m.$implicit,s=m.$index,e=c(),i=S(0);r(e.buttonClasses()[i]),d("disabled",i===s),a(),D(" ",e.resolvePrimitive(t.title)," ")}}var z=(()=>{class n extends L{selectedIndex=b(0);tabs=w.required();buttonClasses=$(()=>{let t=this.selectedIndex();return this.tabs().map((s,e)=>e===t?E.merge(this.theme.components.Tabs.controls.all,this.theme.components.Tabs.controls.selected):this.theme.components.Tabs.controls.all)});static \u0275fac=(()=>{let t;return function(e){return(t||(t=_(n)))(e||n)}})();static \u0275cmp=f({type:n,selectors:[["a2ui-tabs"]],inputs:{tabs:[1,"tabs"]},features:[h],decls:6,vars:9,consts:[[3,"disabled","class"],["a2ui-renderer","",3,"surfaceId","component"],[3,"click","disabled"]],template:function(s,e){if(s&1&&(F(0),l(1,"section")(2,"div"),v(3,B,2,4,"button",0,x),o(),I(5,1),o()),s&2){let i=e.tabs(),V=k(e.selectedIndex());a(),C(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Tabs),r(e.theme.components.Tabs.container),a(),r(e.theme.components.Tabs.element),a(),y(i),a(2),d("surfaceId",e.surfaceId())("component",i[V].child)}},dependencies:[N],styles:["[_nghost-%COMP%]{display:block;flex:var(--weight)}"]})}return n})();export{z as Tabs}; +import{$a as f,Ca as _,Cc as w,Gb as I,Hb as g,Jb as T,Lb as c,Nc as E,Pa as a,Yb as C,Zb as r,_b as M,ac as D,eb as h,fc as F,gc as k,hc as S,na as p,oa as u,pd as L,qd as N,ub as x,vb as v,wb as y,wc as $,xb as d,yb as l,za as b,zb as o}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function B(n,m){if(n&1){let t=g();l(0,"button",2),T("click",function(){let e=p(t).$index,i=c();return u(i.selectedIndex.set(e))}),M(1),o()}if(n&2){let t=m.$implicit,s=m.$index,e=c(),i=S(0);r(e.buttonClasses()[i]),d("disabled",i===s),a(),D(" ",e.resolvePrimitive(t.title)," ")}}var z=(()=>{class n extends L{selectedIndex=b(0);tabs=w.required();buttonClasses=$(()=>{let t=this.selectedIndex();return this.tabs().map((s,e)=>e===t?E.merge(this.theme.components.Tabs.controls.all,this.theme.components.Tabs.controls.selected):this.theme.components.Tabs.controls.all)});static \u0275fac=(()=>{let t;return function(e){return(t||(t=_(n)))(e||n)}})();static \u0275cmp=f({type:n,selectors:[["a2ui-tabs"]],inputs:{tabs:[1,"tabs"]},features:[h],decls:6,vars:9,consts:[[3,"disabled","class"],["a2ui-renderer","",3,"surfaceId","component"],[3,"click","disabled"]],template:function(s,e){if(s&1&&(F(0),l(1,"section")(2,"div"),v(3,B,2,4,"button",0,x),o(),I(5,1),o()),s&2){let i=e.tabs(),V=k(e.selectedIndex());a(),C(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Tabs),r(e.theme.components.Tabs.container),a(),r(e.theme.components.Tabs.element),a(),y(i),a(2),d("surfaceId",e.surfaceId())("component",i[V].child)}},dependencies:[N],styles:["[_nghost-%COMP%]{display:block;flex:var(--weight)}"]})}return n})();export{z as Tabs}; diff --git a/src/google/adk/cli/browser/chunk-5PR7OWPD.js b/src/google/adk/cli/browser/chunk-5PR7OWPD.js new file mode 100644 index 0000000000..22e4ffa1d8 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-5PR7OWPD.js @@ -0,0 +1,43 @@ +import{a as D}from"./chunk-DMWOYWYQ.js";import{a as z}from"./chunk-T3Q3QCCV.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{a as _}from"./chunk-TPDTRWWV.js";import{l as y}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as w,N as T,R as S,S as O,T as k,U as R,V as I,W as E,X as F,p as A,r as L}from"./chunk-QFMJV7VH.js";import{g as o,i as M}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as C,j as b}from"./chunk-RMXJBC7V.js";var x={showLegend:!0,ticks:5,max:null,min:0,graticule:"circle"},G={axes:[],curves:[],options:x},g=structuredClone(G),U=L.radar,X=o(()=>y(C(C({},U),w().radar)),"getConfig"),P=o(()=>g.axes,"getAxes"),Y=o(()=>g.curves,"getCurves"),Z=o(()=>g.options,"getOptions"),q=o(a=>{g.axes=a.map(t=>({name:t.name,label:t.label??t.name}))},"setAxes"),J=o(a=>{g.curves=a.map(t=>({name:t.name,label:t.label??t.name,entries:K(t.entries)}))},"setCurves"),K=o(a=>{if(a[0].axis==null)return a.map(e=>e.value);let t=P();if(t.length===0)throw new Error("Axes must be populated before curves for reference entries");return t.map(e=>{let r=a.find(n=>n.axis?.$refText===e.name);if(r===void 0)throw new Error("Missing entry for axis "+e.label);return r.value})},"computeCurveEntries"),Q=o(a=>{let t=a.reduce((e,r)=>(e[r.name]=r,e),{});g.options={showLegend:t.showLegend?.value??x.showLegend,ticks:t.ticks?.value??x.ticks,max:t.max?.value??x.max,min:t.min?.value??x.min,graticule:t.graticule?.value??x.graticule}},"setOptions"),tt=o(()=>{S(),g=structuredClone(G)},"clear"),$={getAxes:P,getCurves:Y,getOptions:Z,setAxes:q,setCurves:J,setOptions:Q,getConfig:X,clear:tt,setAccTitle:O,getAccTitle:k,setDiagramTitle:E,getDiagramTitle:F,getAccDescription:I,setAccDescription:R},et=o(a=>{D(a,$);let{axes:t,curves:e,options:r}=a;$.setAxes(t),$.setCurves(e),$.setOptions(r)},"populate"),at={parse:o(a=>b(null,null,function*(){let t=yield z("radar",a);M.debug(t),et(t)}),"parse")},rt=o((a,t,e,r)=>{let n=r.db,i=n.getAxes(),l=n.getCurves(),s=n.getOptions(),c=n.getConfig(),d=n.getDiagramTitle(),p=_(t),u=nt(p,c),m=s.max??Math.max(...l.map(f=>Math.max(...f.entries))),h=s.min,v=Math.min(c.width,c.height)/2;st(u,i,v,s.ticks,s.graticule),ot(u,i,v,c),W(u,i,l,h,m,s.graticule,c),H(u,l,s.showLegend,c),u.append("text").attr("class","radarTitle").text(d).attr("x",0).attr("y",-c.height/2-c.marginTop)},"draw"),nt=o((a,t)=>{let e=t.width+t.marginLeft+t.marginRight,r=t.height+t.marginTop+t.marginBottom,n={x:t.marginLeft+t.width/2,y:t.marginTop+t.height/2};return T(a,r,e,t.useMaxWidth??!0),a.attr("viewBox",`0 0 ${e} ${r}`),a.append("g").attr("transform",`translate(${n.x}, ${n.y})`)},"drawFrame"),st=o((a,t,e,r,n)=>{if(n==="circle")for(let i=0;i{let u=2*p*Math.PI/i-Math.PI/2,m=s*Math.cos(u),h=s*Math.sin(u);return`${m},${h}`}).join(" ");a.append("polygon").attr("points",c).attr("class","radarGraticule")}}},"drawGraticule"),ot=o((a,t,e,r)=>{let n=t.length;for(let i=0;i{if(d.entries.length!==s)return;let u=d.entries.map((m,h)=>{let v=2*Math.PI*h/s-Math.PI/2,f=B(m,r,n,c),j=f*Math.cos(v),N=f*Math.sin(v);return{x:j,y:N}});i==="circle"?a.append("path").attr("d",V(u,l.curveTension)).attr("class",`radarCurve-${p}`):i==="polygon"&&a.append("polygon").attr("points",u.map(m=>`${m.x},${m.y}`).join(" ")).attr("class",`radarCurve-${p}`)})}o(W,"drawCurves");function B(a,t,e,r){let n=Math.min(Math.max(a,t),e);return r*(n-t)/(e-t)}o(B,"relativeRadius");function V(a,t){let e=a.length,r=`M${a[0].x},${a[0].y}`;for(let n=0;n{let d=a.append("g").attr("transform",`translate(${n}, ${i+c*l})`);d.append("rect").attr("width",12).attr("height",12).attr("class",`radarLegendBox-${c}`),d.append("text").attr("x",16).attr("y",0).attr("class","radarLegendText").text(s.label)})}o(H,"drawLegend");var it={draw:rt},lt=o((a,t)=>{let e="";for(let r=0;r{let t=A(),e=w(),r=y(t,e.themeVariables),n=y(r.radar,a);return{themeVariables:r,radarOptions:n}},"buildRadarStyleOptions"),dt=o(({radar:a}={})=>{let{themeVariables:t,radarOptions:e}=ct(a);return` + .radarTitle { + font-size: ${t.fontSize}; + color: ${t.titleColor}; + dominant-baseline: hanging; + text-anchor: middle; + } + .radarAxisLine { + stroke: ${e.axisColor}; + stroke-width: ${e.axisStrokeWidth}; + } + .radarAxisLabel { + dominant-baseline: middle; + text-anchor: middle; + font-size: ${e.axisLabelFontSize}px; + color: ${e.axisColor}; + } + .radarGraticule { + fill: ${e.graticuleColor}; + fill-opacity: ${e.graticuleOpacity}; + stroke: ${e.graticuleColor}; + stroke-width: ${e.graticuleStrokeWidth}; + } + .radarLegendText { + text-anchor: start; + font-size: ${e.legendFontSize}px; + dominant-baseline: hanging; + } + ${lt(t,e)} + `},"styles"),vt={parser:at,db:$,renderer:it,styles:dt};export{vt as diagram}; diff --git a/src/google/adk/cli/browser/chunk-PR5T53UC.js b/src/google/adk/cli/browser/chunk-6CJBO2JX.js similarity index 97% rename from src/google/adk/cli/browser/chunk-PR5T53UC.js rename to src/google/adk/cli/browser/chunk-6CJBO2JX.js index de6da3695c..d57ba36891 100644 --- a/src/google/adk/cli/browser/chunk-PR5T53UC.js +++ b/src/google/adk/cli/browser/chunk-6CJBO2JX.js @@ -1 +1 @@ -import{$a as f,$b as M,Bb as s,Ca as g,Cb as m,Cc as l,Ib as d,Kb as y,Pa as u,Yb as T,Zb as r,_b as I,eb as D,ob as v,pd as N,wc as o}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var S=(()=>{class i extends N{value=l.required();enableDate=l.required();enableTime=l.required();inputId=super.getUniqueId("a2ui-datetime-input");inputType=o(()=>{let t=this.enableDate(),n=this.enableTime();return t&&n?"datetime-local":t?"date":n?"time":"datetime-local"});label=o(()=>{let t=this.inputType();return t==="date"?"Date":t==="time"?"Time":"Date & Time"});inputValue=o(()=>{let t=this.inputType(),n=super.resolvePrimitive(this.value())||"",e=n?new Date(n):null;if(!e||isNaN(e.getTime()))return"";let p=this.padNumber(e.getFullYear()),a=this.padNumber(e.getMonth()),c=this.padNumber(e.getDate()),b=this.padNumber(e.getHours()),h=this.padNumber(e.getMinutes());return t==="date"?`${p}-${a}-${c}`:t==="time"?`${b}:${h}`:`${p}-${a}-${c}T${b}:${h}`});handleInput(t){let n=this.value()?.path;!(t.target instanceof HTMLInputElement)||!n||this.processor.setData(this.component(),n,t.target.value,this.surfaceId())}padNumber(t){return t.toString().padStart(2,"0")}static \u0275fac=(()=>{let t;return function(e){return(t||(t=g(i)))(e||i)}})();static \u0275cmp=f({type:i,selectors:[["a2ui-datetime-input"]],inputs:{value:[1,"value"],enableDate:[1,"enableDate"],enableTime:[1,"enableTime"]},features:[D],decls:4,vars:13,consts:[[3,"for"],["autocomplete","off",3,"input","id","value"]],template:function(n,e){n&1&&(s(0,"section")(1,"label",0),I(2),m(),s(3,"input",1),y("input",function(a){return e.handleInput(a)}),m()()),n&2&&(r(e.theme.components.DateTimeInput.container),u(),r(e.theme.components.DateTimeInput.label),d("htmlFor",e.inputId),u(),M(e.label()),u(),T(e.theme.additionalStyles==null?null:e.theme.additionalStyles.DateTimeInput),r(e.theme.components.DateTimeInput.element),d("id",e.inputId)("value",e.inputValue()),v("type",e.inputType()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}input[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return i})();export{S as DatetimeInput}; +import{$a as f,$b as M,Bb as s,Ca as g,Cb as m,Cc as l,Ib as d,Kb as y,Pa as u,Yb as T,Zb as r,_b as I,eb as D,ob as v,pd as N,wc as o}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var S=(()=>{class i extends N{value=l.required();enableDate=l.required();enableTime=l.required();inputId=super.getUniqueId("a2ui-datetime-input");inputType=o(()=>{let t=this.enableDate(),n=this.enableTime();return t&&n?"datetime-local":t?"date":n?"time":"datetime-local"});label=o(()=>{let t=this.inputType();return t==="date"?"Date":t==="time"?"Time":"Date & Time"});inputValue=o(()=>{let t=this.inputType(),n=super.resolvePrimitive(this.value())||"",e=n?new Date(n):null;if(!e||isNaN(e.getTime()))return"";let p=this.padNumber(e.getFullYear()),a=this.padNumber(e.getMonth()),c=this.padNumber(e.getDate()),b=this.padNumber(e.getHours()),h=this.padNumber(e.getMinutes());return t==="date"?`${p}-${a}-${c}`:t==="time"?`${b}:${h}`:`${p}-${a}-${c}T${b}:${h}`});handleInput(t){let n=this.value()?.path;!(t.target instanceof HTMLInputElement)||!n||this.processor.setData(this.component(),n,t.target.value,this.surfaceId())}padNumber(t){return t.toString().padStart(2,"0")}static \u0275fac=(()=>{let t;return function(e){return(t||(t=g(i)))(e||i)}})();static \u0275cmp=f({type:i,selectors:[["a2ui-datetime-input"]],inputs:{value:[1,"value"],enableDate:[1,"enableDate"],enableTime:[1,"enableTime"]},features:[D],decls:4,vars:13,consts:[[3,"for"],["autocomplete","off",3,"input","id","value"]],template:function(n,e){n&1&&(s(0,"section")(1,"label",0),I(2),m(),s(3,"input",1),y("input",function(a){return e.handleInput(a)}),m()()),n&2&&(r(e.theme.components.DateTimeInput.container),u(),r(e.theme.components.DateTimeInput.label),d("htmlFor",e.inputId),u(),M(e.label()),u(),T(e.theme.additionalStyles==null?null:e.theme.additionalStyles.DateTimeInput),r(e.theme.components.DateTimeInput.element),d("id",e.inputId)("value",e.inputValue()),v("type",e.inputType()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}input[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return i})();export{S as DatetimeInput}; diff --git a/src/google/adk/cli/browser/chunk-6UL33SIT.js b/src/google/adk/cli/browser/chunk-6UL33SIT.js new file mode 100644 index 0000000000..21d3afb53d --- /dev/null +++ b/src/google/adk/cli/browser/chunk-6UL33SIT.js @@ -0,0 +1,89 @@ +import{a as _e}from"./chunk-B2DSW4QB.js";import{a as fe}from"./chunk-TPDTRWWV.js";import{a as be,b as ye}from"./chunk-ZMOC4H7T.js";import{d as ke,g as me,j as Ee}from"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{G as B,O as pe,Y as M,c as de,d as te,e as ne,r as W}from"./chunk-QFMJV7VH.js";import{g as o,i as Y}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{j as ge}from"./chunk-RMXJBC7V.js";var ie=(function(){var e=o(function(O,i,n,s){for(n=n||{},s=O.length;s--;n[O[s]]=i);return n},"o"),u=[1,4],p=[1,13],r=[1,12],d=[1,15],_=[1,16],y=[1,20],l=[1,19],D=[6,7,8],I=[1,26],g=[1,24],w=[1,25],m=[6,7,11],U=[1,31],N=[6,7,11,24],j=[1,6,13,16,17,20,23],k=[1,35],A=[1,36],L=[1,6,7,11,13,16,17,20,23],H=[1,38],T={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,KANBAN:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,shapeData:15,ICON:16,CLASS:17,nodeWithId:18,nodeWithoutId:19,NODE_DSTART:20,NODE_DESCR:21,NODE_DEND:22,NODE_ID:23,SHAPE_DATA:24,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"KANBAN",11:"EOF",13:"SPACELIST",16:"ICON",17:"CLASS",20:"NODE_DSTART",21:"NODE_DESCR",22:"NODE_DEND",23:"NODE_ID",24:"SHAPE_DATA"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,3],[12,2],[12,2],[12,2],[12,1],[12,2],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[19,3],[18,1],[18,4],[15,2],[15,1]],performAction:o(function(i,n,s,a,h,t,R){var c=t.length-1;switch(h){case 6:case 7:return a;case 8:a.getLogger().trace("Stop NL ");break;case 9:a.getLogger().trace("Stop EOF ");break;case 11:a.getLogger().trace("Stop NL2 ");break;case 12:a.getLogger().trace("Stop EOF2 ");break;case 15:a.getLogger().info("Node: ",t[c-1].id),a.addNode(t[c-2].length,t[c-1].id,t[c-1].descr,t[c-1].type,t[c]);break;case 16:a.getLogger().info("Node: ",t[c].id),a.addNode(t[c-1].length,t[c].id,t[c].descr,t[c].type);break;case 17:a.getLogger().trace("Icon: ",t[c]),a.decorateNode({icon:t[c]});break;case 18:case 23:a.decorateNode({class:t[c]});break;case 19:a.getLogger().trace("SPACELIST");break;case 20:a.getLogger().trace("Node: ",t[c-1].id),a.addNode(0,t[c-1].id,t[c-1].descr,t[c-1].type,t[c]);break;case 21:a.getLogger().trace("Node: ",t[c].id),a.addNode(0,t[c].id,t[c].descr,t[c].type);break;case 22:a.decorateNode({icon:t[c]});break;case 27:a.getLogger().trace("node found ..",t[c-2]),this.$={id:t[c-1],descr:t[c-1],type:a.getType(t[c-2],t[c])};break;case 28:this.$={id:t[c],descr:t[c],type:0};break;case 29:a.getLogger().trace("node found ..",t[c-3]),this.$={id:t[c-3],descr:t[c-1],type:a.getType(t[c-2],t[c])};break;case 30:this.$=t[c-1]+t[c];break;case 31:this.$=t[c];break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:u},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:u},{6:p,7:[1,10],9:9,12:11,13:r,14:14,16:d,17:_,18:17,19:18,20:y,23:l},e(D,[2,3]),{1:[2,2]},e(D,[2,4]),e(D,[2,5]),{1:[2,6],6:p,12:21,13:r,14:14,16:d,17:_,18:17,19:18,20:y,23:l},{6:p,9:22,12:11,13:r,14:14,16:d,17:_,18:17,19:18,20:y,23:l},{6:I,7:g,10:23,11:w},e(m,[2,24],{18:17,19:18,14:27,16:[1,28],17:[1,29],20:y,23:l}),e(m,[2,19]),e(m,[2,21],{15:30,24:U}),e(m,[2,22]),e(m,[2,23]),e(N,[2,25]),e(N,[2,26]),e(N,[2,28],{20:[1,32]}),{21:[1,33]},{6:I,7:g,10:34,11:w},{1:[2,7],6:p,12:21,13:r,14:14,16:d,17:_,18:17,19:18,20:y,23:l},e(j,[2,14],{7:k,11:A}),e(L,[2,8]),e(L,[2,9]),e(L,[2,10]),e(m,[2,16],{15:37,24:U}),e(m,[2,17]),e(m,[2,18]),e(m,[2,20],{24:H}),e(N,[2,31]),{21:[1,39]},{22:[1,40]},e(j,[2,13],{7:k,11:A}),e(L,[2,11]),e(L,[2,12]),e(m,[2,15],{24:H}),e(N,[2,30]),{22:[1,41]},e(N,[2,27]),e(N,[2,29])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(i,n){if(n.recoverable)this.trace(i);else{var s=new Error(i);throw s.hash=n,s}},"parseError"),parse:o(function(i){var n=this,s=[0],a=[],h=[null],t=[],R=this.table,c="",z=0,oe=0,ce=0,Ne=2,le=1,xe=t.slice.call(arguments,1),b=Object.create(this.lexer),P={yy:{}};for(var q in this.yy)Object.prototype.hasOwnProperty.call(this.yy,q)&&(P.yy[q]=this.yy[q]);b.setInput(i,P.yy),P.yy.lexer=b,P.yy.parser=this,typeof b.yylloc>"u"&&(b.yylloc={});var Q=b.yylloc;t.push(Q);var ve=b.options&&b.options.ranges;typeof P.yy.parseError=="function"?this.parseError=P.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function De(S){s.length=s.length-2*S,h.length=h.length-S,t.length=t.length-S}o(De,"popStack");function he(){var S;return S=a.pop()||b.lex()||le,typeof S!="number"&&(S instanceof Array&&(a=S,S=a.pop()),S=n.symbols_[S]||S),S}o(he,"lex");for(var E,Z,V,x,ze,$,G={},X,C,ue,K;;){if(V=s[s.length-1],this.defaultActions[V]?x=this.defaultActions[V]:((E===null||typeof E>"u")&&(E=he()),x=R[V]&&R[V][E]),typeof x>"u"||!x.length||!x[0]){var ee="";K=[];for(X in R[V])this.terminals_[X]&&X>Ne&&K.push("'"+this.terminals_[X]+"'");b.showPosition?ee="Parse error on line "+(z+1)+`: +`+b.showPosition()+` +Expecting `+K.join(", ")+", got '"+(this.terminals_[E]||E)+"'":ee="Parse error on line "+(z+1)+": Unexpected "+(E==le?"end of input":"'"+(this.terminals_[E]||E)+"'"),this.parseError(ee,{text:b.match,token:this.terminals_[E]||E,line:b.yylineno,loc:Q,expected:K})}if(x[0]instanceof Array&&x.length>1)throw new Error("Parse Error: multiple actions possible at state: "+V+", token: "+E);switch(x[0]){case 1:s.push(E),h.push(b.yytext),t.push(b.yylloc),s.push(x[1]),E=null,Z?(E=Z,Z=null):(oe=b.yyleng,c=b.yytext,z=b.yylineno,Q=b.yylloc,ce>0&&ce--);break;case 2:if(C=this.productions_[x[1]][1],G.$=h[h.length-C],G._$={first_line:t[t.length-(C||1)].first_line,last_line:t[t.length-1].last_line,first_column:t[t.length-(C||1)].first_column,last_column:t[t.length-1].last_column},ve&&(G._$.range=[t[t.length-(C||1)].range[0],t[t.length-1].range[1]]),$=this.performAction.apply(G,[c,oe,z,P.yy,x[1],h,t].concat(xe)),typeof $<"u")return $;C&&(s=s.slice(0,-1*C*2),h=h.slice(0,-1*C),t=t.slice(0,-1*C)),s.push(this.productions_[x[1]][0]),h.push(G.$),t.push(G._$),ue=R[s[s.length-2]][s[s.length-1]],s.push(ue);break;case 3:return!0}}return!0},"parse")},J=(function(){var O={EOF:1,parseError:o(function(n,s){if(this.yy.parser)this.yy.parser.parseError(n,s);else throw new Error(n)},"parseError"),setInput:o(function(i,n){return this.yy=n||this.yy||{},this._input=i,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var i=this._input[0];this.yytext+=i,this.yyleng++,this.offset++,this.match+=i,this.matched+=i;var n=i.match(/(?:\r\n?|\n).*/g);return n?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),i},"input"),unput:o(function(i){var n=i.length,s=i.split(/(?:\r\n?|\n)/g);this._input=i+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-n),this.offset-=n;var a=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),s.length-1&&(this.yylineno-=s.length-1);var h=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:s?(s.length===a.length?this.yylloc.first_column:0)+a[a.length-s.length].length-s[0].length:this.yylloc.first_column-n},this.options.ranges&&(this.yylloc.range=[h[0],h[0]+this.yyleng-n]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(i){this.unput(this.match.slice(i))},"less"),pastInput:o(function(){var i=this.matched.substr(0,this.matched.length-this.match.length);return(i.length>20?"...":"")+i.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var i=this.match;return i.length<20&&(i+=this._input.substr(0,20-i.length)),(i.substr(0,20)+(i.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var i=this.pastInput(),n=new Array(i.length+1).join("-");return i+this.upcomingInput()+` +`+n+"^"},"showPosition"),test_match:o(function(i,n){var s,a,h;if(this.options.backtrack_lexer&&(h={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(h.yylloc.range=this.yylloc.range.slice(0))),a=i[0].match(/(?:\r\n?|\n).*/g),a&&(this.yylineno+=a.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:a?a[a.length-1].length-a[a.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+i[0].length},this.yytext+=i[0],this.match+=i[0],this.matches=i,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(i[0].length),this.matched+=i[0],s=this.performAction.call(this,this.yy,this,n,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),s)return s;if(this._backtrack){for(var t in h)this[t]=h[t];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var i,n,s,a;this._more||(this.yytext="",this.match="");for(var h=this._currentRules(),t=0;tn[0].length)){if(n=s,a=t,this.options.backtrack_lexer){if(i=this.test_match(s,h[t]),i!==!1)return i;if(this._backtrack){n=!1;continue}else return!1}else if(!this.options.flex)break}return n?(i=this.test_match(n,h[a]),i!==!1?i:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var n=this.next();return n||this.lex()},"lex"),begin:o(function(n){this.conditionStack.push(n)},"begin"),popState:o(function(){var n=this.conditionStack.length-1;return n>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(n){return n=this.conditionStack.length-1-Math.abs(n||0),n>=0?this.conditionStack[n]:"INITIAL"},"topState"),pushState:o(function(n){this.begin(n)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(n,s,a,h){var t=h;switch(a){case 0:return this.pushState("shapeData"),s.yytext="",24;break;case 1:return this.pushState("shapeDataStr"),24;break;case 2:return this.popState(),24;break;case 3:let R=/\n\s*/g;return s.yytext=s.yytext.replace(R,"
        "),24;break;case 4:return 24;case 5:this.popState();break;case 6:return n.getLogger().trace("Found comment",s.yytext),6;break;case 7:return 8;case 8:this.begin("CLASS");break;case 9:return this.popState(),17;break;case 10:this.popState();break;case 11:n.getLogger().trace("Begin icon"),this.begin("ICON");break;case 12:return n.getLogger().trace("SPACELINE"),6;break;case 13:return 7;case 14:return 16;case 15:n.getLogger().trace("end icon"),this.popState();break;case 16:return n.getLogger().trace("Exploding node"),this.begin("NODE"),20;break;case 17:return n.getLogger().trace("Cloud"),this.begin("NODE"),20;break;case 18:return n.getLogger().trace("Explosion Bang"),this.begin("NODE"),20;break;case 19:return n.getLogger().trace("Cloud Bang"),this.begin("NODE"),20;break;case 20:return this.begin("NODE"),20;break;case 21:return this.begin("NODE"),20;break;case 22:return this.begin("NODE"),20;break;case 23:return this.begin("NODE"),20;break;case 24:return 13;case 25:return 23;case 26:return 11;case 27:this.begin("NSTR2");break;case 28:return"NODE_DESCR";case 29:this.popState();break;case 30:n.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 31:return n.getLogger().trace("description:",s.yytext),"NODE_DESCR";break;case 32:this.popState();break;case 33:return this.popState(),n.getLogger().trace("node end ))"),"NODE_DEND";break;case 34:return this.popState(),n.getLogger().trace("node end )"),"NODE_DEND";break;case 35:return this.popState(),n.getLogger().trace("node end ...",s.yytext),"NODE_DEND";break;case 36:return this.popState(),n.getLogger().trace("node end (("),"NODE_DEND";break;case 37:return this.popState(),n.getLogger().trace("node end (-"),"NODE_DEND";break;case 38:return this.popState(),n.getLogger().trace("node end (-"),"NODE_DEND";break;case 39:return this.popState(),n.getLogger().trace("node end (("),"NODE_DEND";break;case 40:return this.popState(),n.getLogger().trace("node end (("),"NODE_DEND";break;case 41:return n.getLogger().trace("Long description:",s.yytext),21;break;case 42:return n.getLogger().trace("Long description:",s.yytext),21;break}},"anonymous"),rules:[/^(?:@\{)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^\"]+)/i,/^(?:[^}^"]+)/i,/^(?:\})/i,/^(?:\s*%%.*)/i,/^(?:kanban\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}@]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{shapeDataEndBracket:{rules:[],inclusive:!1},shapeDataStr:{rules:[2,3],inclusive:!1},shapeData:{rules:[1,4,5],inclusive:!1},CLASS:{rules:[9,10],inclusive:!1},ICON:{rules:[14,15],inclusive:!1},NSTR2:{rules:[28,29],inclusive:!1},NSTR:{rules:[31,32],inclusive:!1},NODE:{rules:[27,30,33,34,35,36,37,38,39,40,41,42],inclusive:!1},INITIAL:{rules:[0,6,7,8,11,12,13,16,17,18,19,20,21,22,23,24,25,26],inclusive:!0}}};return O})();T.lexer=J;function F(){this.yy={}}return o(F,"Parser"),F.prototype=T,T.Parser=F,new F})();ie.parser=ie;var Le=ie,v=[],se=[],re=0,ae={},Oe=o(()=>{v=[],se=[],re=0,ae={}},"clear"),Ie=o(e=>{if(v.length===0)return null;let u=v[0].level,p=null;for(let r=v.length-1;r>=0;r--)if(v[r].level===u&&!p&&(p=v[r]),v[r].levell.parentId===d.id);for(let l of y){let D={id:l.id,parentId:d.id,label:B(l.label??"",r),labelType:"markdown",isGroup:!1,ticket:l?.ticket,priority:l?.priority,assigned:l?.assigned,icon:l?.icon,shape:"kanbanItem",level:l.level,rx:5,ry:5,cssStyles:["text-align: left"]};u.push(D)}}return{nodes:u,edges:e,other:{},config:M()}},"getData"),we=o((e,u,p,r,d)=>{let _=M(),y=_.mindmap?.padding??W.mindmap.padding;switch(r){case f.ROUNDED_RECT:case f.RECT:case f.HEXAGON:y*=2}let l={id:B(u,_)||"kbn"+re++,level:e,label:B(p,_),width:_.mindmap?.maxNodeWidth??W.mindmap.maxNodeWidth,padding:y,isGroup:!1};if(d!==void 0){let I;d.includes(` +`)?I=d+` +`:I=`{ +`+d+` +}`;let g=ye(I,{schema:be});if(g.shape&&(g.shape!==g.shape.toLowerCase()||g.shape.includes("_")))throw new Error(`No such shape: ${g.shape}. Shape names should be lowercase.`);g?.shape&&g.shape==="kanbanItem"&&(l.shape=g?.shape),g?.label&&(l.label=g?.label),g?.icon&&(l.icon=g?.icon.toString()),g?.assigned&&(l.assigned=g?.assigned.toString()),g?.ticket&&(l.ticket=g?.ticket.toString()),g?.priority&&(l.priority=g?.priority)}let D=Ie(e);D?l.parentId=D.id||"kbn"+re++:se.push(l),v.push(l)},"addNode"),f={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},Ae=o((e,u)=>{switch(Y.debug("In get type",e,u),e){case"[":return f.RECT;case"(":return u===")"?f.ROUNDED_RECT:f.CLOUD;case"((":return f.CIRCLE;case")":return f.CLOUD;case"))":return f.BANG;case"{{":return f.HEXAGON;default:return f.DEFAULT}},"getType"),Te=o((e,u)=>{ae[e]=u},"setElementForId"),Re=o(e=>{if(!e)return;let u=M(),p=v[v.length-1];e.icon&&(p.icon=B(e.icon,u)),e.class&&(p.cssClasses=B(e.class,u))},"decorateNode"),Pe=o(e=>{switch(e){case f.DEFAULT:return"no-border";case f.RECT:return"rect";case f.ROUNDED_RECT:return"rounded-rect";case f.CIRCLE:return"circle";case f.CLOUD:return"cloud";case f.BANG:return"bang";case f.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),Ve=o(()=>Y,"getLogger"),Be=o(e=>ae[e],"getElementById"),je={clear:Oe,addNode:we,getSections:Se,getData:Ce,nodeType:f,getType:Ae,setElementForId:Te,decorateNode:Re,type2Str:Pe,getLogger:Ve,getElementById:Be},Fe=je,Ge=o((e,u,p,r)=>ge(null,null,function*(){Y.debug(`Rendering kanban diagram +`+e);let _=r.db.getData(),y=M();y.htmlLabels=!1;let l=fe(u),D=l.append("g");D.attr("class","sections");let I=l.append("g");I.attr("class","items");let g=_.nodes.filter(k=>k.isGroup),w=0,m=10,U=[],N=25;for(let k of g){let A=y?.kanban?.sectionWidth||200;w=w+1,k.x=A*w+(w-1)*m/2,k.width=A,k.y=0,k.height=A*3,k.rx=5,k.ry=5,k.cssClasses=k.cssClasses+" section-"+w;let L=yield ke(D,k);N=Math.max(N,L?.labelBBox?.height),U.push(L)}let j=0;for(let k of g){let A=U[j];j=j+1;let L=y?.kanban?.sectionWidth||200,H=-L*3/2+N,T=H,J=_.nodes.filter(i=>i.parentId===k.id);for(let i of J){if(i.isGroup)throw new Error("Groups within groups are not allowed in Kanban diagrams");i.x=k.x,i.width=L-1.5*m;let s=(yield me(I,i,{config:y})).node().getBBox();i.y=T+s.height/2,yield Ee(i),T=i.y+s.height/2+m/2}let F=A.cluster.select("rect"),O=Math.max(T-H+3*m,50)+(N-25);F.attr("height",O)}pe(void 0,l,y.mindmap?.padding??W.kanban.padding,y.mindmap?.useMaxWidth??W.kanban.useMaxWidth)}),"draw"),Me={draw:Ge},Ue=o(e=>{let u="";for(let r=0;re.darkMode?ne(r,d):te(r,d),"adjuster");for(let r=0;r` + .edge { + stroke-width: 3; + } + ${Ue(e)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${e.git0}; + } + .section-root text { + fill: ${e.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .cluster-label, .label { + color: ${e.textColor}; + fill: ${e.textColor}; + } + .kanban-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } + ${_e()} +`,"getStyles"),We=He,it={db:Fe,renderer:Me,parser:Le,styles:We};export{it as diagram}; diff --git a/src/google/adk/cli/browser/chunk-75WMU75S.js b/src/google/adk/cli/browser/chunk-75WMU75S.js new file mode 100644 index 0000000000..38b07a71e3 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-75WMU75S.js @@ -0,0 +1 @@ +import{a as i,b as e,c as o,d as a}from"./chunk-TIJO3EOA.js";import"./chunk-B2DSW4QB.js";import"./chunk-NMKTPNXE.js";import"./chunk-APNCZOFE.js";import"./chunk-ST54LLJ3.js";import"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import"./chunk-QFMJV7VH.js";import{g as t}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";var y={parser:i,get db(){return new e},renderer:a,styles:o,init:t(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{y as diagram}; diff --git a/src/google/adk/cli/browser/chunk-7UW26RYS.js b/src/google/adk/cli/browser/chunk-7UW26RYS.js new file mode 100644 index 0000000000..b1e248b6c7 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-7UW26RYS.js @@ -0,0 +1 @@ +import{a as e,b as r}from"./chunk-XULIXUQL.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{e as TreemapModule,r as createTreemapServices}; diff --git a/src/google/adk/cli/browser/chunk-APNCZOFE.js b/src/google/adk/cli/browser/chunk-APNCZOFE.js new file mode 100644 index 0000000000..442fbb8e79 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-APNCZOFE.js @@ -0,0 +1 @@ +import{a as o,g as m}from"./chunk-JRNAXTJ7.js";var g=m((t,e)=>{let n;return e==="sandbox"&&(n=o("#i"+t)),(e==="sandbox"?o(n.nodes()[0].contentDocument.body):o("body")).select(`[id="${t}"]`)},"getDiagramElement");export{g as a}; diff --git a/src/google/adk/cli/browser/chunk-WXV43367.js b/src/google/adk/cli/browser/chunk-AQDQIDAM.js similarity index 97% rename from src/google/adk/cli/browser/chunk-WXV43367.js rename to src/google/adk/cli/browser/chunk-AQDQIDAM.js index 7108b16993..2a91ec3e30 100644 --- a/src/google/adk/cli/browser/chunk-WXV43367.js +++ b/src/google/adk/cli/browser/chunk-AQDQIDAM.js @@ -1 +1 @@ -import{$a as C,Aa as f,Dc as k,Gb as m,Hb as p,Jb as d,Lb as o,Pa as r,Tb as w,Ub as v,Yb as y,Zb as u,_b as D,eb as M,na as a,oa as c,pd as b,qb as x,qd as P,sb as h,xb as g,yb as l,za as _,zb as s}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var V=["dialog"];function S(t,E){if(t&1){let e=p();l(0,"dialog",2,0),d("click",function(i){a(e);let O=o();return c(O.handleDialogClick(i))}),l(2,"section")(3,"div",3)(4,"button",2),d("click",function(){a(e);let i=o();return c(i.closeDialog())}),l(5,"span",4),D(6,"close"),s()()(),m(7,5),s()()}if(t&2){let e=o();u(e.theme.components.Modal.backdrop),r(2),y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Modal),u(e.theme.components.Modal.element),r(5),g("surfaceId",e.surfaceId())("component",e.component().properties.contentChild)}}function T(t,E){if(t&1){let e=p();l(0,"section",2),d("click",function(){a(e);let i=o();return c(i.showDialog.set(!0))}),m(1,5),s()}if(t&2){let e=o();r(),g("surfaceId",e.surfaceId())("component",e.component().properties.entryPointChild)}}var j=(()=>{class t extends b{showDialog=_(!1);dialog=k("dialog");constructor(){super(),f(()=>{let e=this.dialog();e&&!e.nativeElement.open&&e.nativeElement.showModal()})}handleDialogClick(e){e.target instanceof HTMLDialogElement&&this.closeDialog()}closeDialog(){let e=this.dialog();e&&(e.nativeElement.open||e.nativeElement.close(),this.showDialog.set(!1))}static \u0275fac=function(n){return new(n||t)};static \u0275cmp=C({type:t,selectors:[["a2ui-modal"]],viewQuery:function(n,i){n&1&&w(i.dialog,V,5),n&2&&v()},features:[M],decls:2,vars:1,consts:[["dialog",""],[3,"class"],[3,"click"],[1,"controls"],[1,"g-icon"],["a2ui-renderer","",3,"surfaceId","component"]],template:function(n,i){n&1&&x(0,S,8,8,"dialog",1)(1,T,2,2,"section"),n&2&&h(i.showDialog()?0:1)},dependencies:[P],styles:["dialog[_ngcontent-%COMP%]{padding:0;border:none;background:none}dialog[_ngcontent-%COMP%] section[_ngcontent-%COMP%] .controls[_ngcontent-%COMP%]{display:flex;justify-content:end;margin-bottom:4px}dialog[_ngcontent-%COMP%] section[_ngcontent-%COMP%] .controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:0;background:none;width:20px;height:20px;pointer:cursor;border:none;cursor:pointer}"]})}return t})();export{j as Modal}; +import{$a as C,Aa as f,Dc as k,Gb as m,Hb as p,Jb as d,Lb as o,Pa as r,Tb as w,Ub as v,Yb as y,Zb as u,_b as D,eb as M,na as a,oa as c,pd as b,qb as x,qd as P,sb as h,xb as g,yb as l,za as _,zb as s}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var V=["dialog"];function S(t,E){if(t&1){let e=p();l(0,"dialog",2,0),d("click",function(i){a(e);let O=o();return c(O.handleDialogClick(i))}),l(2,"section")(3,"div",3)(4,"button",2),d("click",function(){a(e);let i=o();return c(i.closeDialog())}),l(5,"span",4),D(6,"close"),s()()(),m(7,5),s()()}if(t&2){let e=o();u(e.theme.components.Modal.backdrop),r(2),y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Modal),u(e.theme.components.Modal.element),r(5),g("surfaceId",e.surfaceId())("component",e.component().properties.contentChild)}}function T(t,E){if(t&1){let e=p();l(0,"section",2),d("click",function(){a(e);let i=o();return c(i.showDialog.set(!0))}),m(1,5),s()}if(t&2){let e=o();r(),g("surfaceId",e.surfaceId())("component",e.component().properties.entryPointChild)}}var j=(()=>{class t extends b{showDialog=_(!1);dialog=k("dialog");constructor(){super(),f(()=>{let e=this.dialog();e&&!e.nativeElement.open&&e.nativeElement.showModal()})}handleDialogClick(e){e.target instanceof HTMLDialogElement&&this.closeDialog()}closeDialog(){let e=this.dialog();e&&(e.nativeElement.open||e.nativeElement.close(),this.showDialog.set(!1))}static \u0275fac=function(n){return new(n||t)};static \u0275cmp=C({type:t,selectors:[["a2ui-modal"]],viewQuery:function(n,i){n&1&&w(i.dialog,V,5),n&2&&v()},features:[M],decls:2,vars:1,consts:[["dialog",""],[3,"class"],[3,"click"],[1,"controls"],[1,"g-icon"],["a2ui-renderer","",3,"surfaceId","component"]],template:function(n,i){n&1&&x(0,S,8,8,"dialog",1)(1,T,2,2,"section"),n&2&&h(i.showDialog()?0:1)},dependencies:[P],styles:["dialog[_ngcontent-%COMP%]{padding:0;border:none;background:none}dialog[_ngcontent-%COMP%] section[_ngcontent-%COMP%] .controls[_ngcontent-%COMP%]{display:flex;justify-content:end;margin-bottom:4px}dialog[_ngcontent-%COMP%] section[_ngcontent-%COMP%] .controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:0;background:none;width:20px;height:20px;pointer:cursor;border:none;cursor:pointer}"]})}return t})();export{j as Modal}; diff --git a/src/google/adk/cli/browser/chunk-ASJUXEUE.js b/src/google/adk/cli/browser/chunk-ASJUXEUE.js new file mode 100644 index 0000000000..72d655ef2f --- /dev/null +++ b/src/google/adk/cli/browser/chunk-ASJUXEUE.js @@ -0,0 +1 @@ +import{A as fr,B as rr,C as D,D as q,E as Lr,F as wt,G as Et,H as W,I as Cr,J as Pt,K as Rt,L as Mt,M as $,N as Lt,O as ut,P as _r,Q as Ct,R as _t,S as Ft,T as Fr,U as Or,a as B,b as M,c as K,d as w,e as p,f as E,g as C,i as V,j as k,k as At,m as vt,n as Pr,o as Rr,p as Mr,q as Z,r as N,s as Ot,t as z,u as Tt,v as T,w as _,x as St,y as or,z as It}from"./chunk-EGBSMT36.js";function _o(r,t){for(var e=-1,o=r==null?0:r.length;++e2?t[2]:void 0;for(f&&_(t[0],t[1],f)&&(o=1);++ei))return!1;var u=a.get(r),s=a.get(t);if(u&&s)return u==t&&s==r;var l=-1,d=!0,A=e&Na?new sr:void 0;for(a.set(r,t),a.set(t,r);++lt}var Be=ni;function ii(r){return r&&r.length?cr(r,C,Be):void 0}var mi=ii;function ui(r,t,e,o){if(!E(r))return r;t=J(t,r);for(var f=-1,a=t.length,n=a-1,i=r;i!=null&&++f0&&e(i)?t>1?Ue(i,t-1,e,o,f):mr(f,i):o||(f[f.length]=i)}return f}var j=Ue;function di(r){var t=r==null?0:r.length;return t?j(r,1):[]}var xt=di;function xi(r){return vt(Ot(r,void 0,xt),r+"")}var je=xi;var gi=je(function(r,t){return r==null?{}:De(r,t)}),ci=gi;function bi(r,t,e,o){var f=-1,a=r==null?0:r.length;for(o&&a&&(e=r[++f]);++f-1}var at=Ii;function wi(r,t,e){for(var o=-1,f=r==null?0:r.length;++o=Mi){var u=t?null:ke(r);if(u)return dr(u);n=!1,f=lr,m=new sr}else m=t?[]:i;r:for(;++of?0:f+t),e=e>f?f:e,e<0&&(e+=f),f=t>e?0:e-t>>>0,t>>>=0;for(var a=Array(f);++o=t||Y<0||l&&vr>=a}function b(){var h=Ir();if(c(h))return F(h);i=setTimeout(b,O(h))}function F(h){return i=void 0,d&&o?A(h):(o=f=void 0,n)}function Er(){i!==void 0&&clearTimeout(i),u=0,o=m=f=i=void 0}function er(){return i===void 0?n:F(Ir())}function H(){var h=Ir(),Y=c(h);if(o=arguments,f=this,m=h,Y){if(i===void 0)return v(m);if(l)return clearTimeout(i),i=setTimeout(b,t),A(m)}return i===void 0&&(i=setTimeout(b,t)),n}return H.cancel=Er,H.flush=er,H}var Sm=Tm;var Im=200;function wm(r,t,e,o){var f=-1,a=at,n=!0,i=r.length,m=[],u=t.length;if(!i)return m;e&&(t=I(t,D(e))),o?(a=nt,n=!1):t.length>=Im&&(a=lr,n=!1,t=new sr(t));r:for(;++f-1?f[a?t[n]:n]:void 0}}var io=qm;var Hm=Math.max;function Ym(r,t,e){var o=r==null?0:r.length;if(!o)return-1;var f=e==null?0:L(e);return f<0&&(f=Hm(o+f,0)),ft(r,x(t,3),f)}var mo=Ym;var km=io(mo),Zm=km;function zm(r){return r&&r.length?r[0]:void 0}var uo=zm;function $m(r,t){return j(lt(r,t),1)}var Xm=$m;function Jm(r,t){return r==null?r:Fr(r,G(t),W)}var Qm=Jm;function Vm(r,t){return r&&pr(r,G(t))}var ru=Vm;var tu=Object.prototype,eu=tu.hasOwnProperty,ou=it(function(r,t,e){eu.call(r,e)?r[e].push(t):Rr(r,e,[t])}),fu=ou;var au=Object.prototype,nu=au.hasOwnProperty;function iu(r,t){return r!=null&&nu.call(r,t)}var po=iu;function mu(r,t){return r!=null&&Vr(r,t,po)}var uu=mu;var pu="[object String]";function su(r){return typeof r=="string"||!p(r)&&w(r)&&K(r)==pu}var wr=su;var lu=Math.max;function du(r,t,e,o){r=T(r)?r:dt(r),e=e&&!o?L(e):0;var f=r.length;return e<0&&(e=lu(f+e,0)),wr(r)?e<=f&&r.indexOf(t,e)>-1:!!f&&br(r,t,e)>-1}var xu=du;var gu=Math.max;function cu(r,t,e){var o=r==null?0:r.length;if(!o)return-1;var f=e==null?0:L(e);return f<0&&(f=gu(o+f,0)),br(r,t,f)}var bu=cu;function hu(r){var t=r==null?0:r.length;return t?Ar(r,0,-1):[]}var yu=hu;function Au(r,t){return xr(r,t)}var vu=Au;var Ou="[object RegExp]";function Tu(r){return w(r)&&K(r)==Ou}var so=Tu;var lo=q&&q.isRegExp,Su=lo?D(lo):so,Iu=Su;function wu(r,t){return rt||a&&n&&m&&!i&&!u||o&&n&&m||!e&&m||!f)return 1;if(!o&&!a&&!u&&r=i)return m;var u=e[o];return m*(u=="desc"?-1:1)}}return r.index-t.index}var bo=Du;function Wu(r,t,e){t.length?t=I(t,function(a){return p(a)?function(n){return Q(n,a.length===1?a[0]:a)}:a}):t=[C];var o=-1;t=I(t,D(x));var f=et(r,function(a,n,i){var m=I(t,function(u){return u(a)});return{criteria:m,index:++o,value:a}});return go(f,function(a,n){return bo(a,n,e)})}var ho=Wu;var Gu=tt("length"),yo=Gu;var vo="\\ud800-\\udfff",Uu="\\u0300-\\u036f",ju="\\ufe20-\\ufe2f",Ku="\\u20d0-\\u20ff",qu=Uu+ju+Ku,Hu="\\ufe0e\\ufe0f",Yu="["+vo+"]",ct="["+qu+"]",bt="\\ud83c[\\udffb-\\udfff]",ku="(?:"+ct+"|"+bt+")",Oo="[^"+vo+"]",To="(?:\\ud83c[\\udde6-\\uddff]){2}",So="[\\ud800-\\udbff][\\udc00-\\udfff]",Zu="\\u200d",Io=ku+"?",wo="["+Hu+"]?",zu="(?:"+Zu+"(?:"+[Oo,To,So].join("|")+")"+wo+Io+")*",$u=wo+Io+zu,Xu="(?:"+[Oo+ct+"?",ct,To,So,Yu].join("|")+")",Ao=RegExp(bt+"(?="+bt+")|"+Xu+$u,"g");function Ju(r){for(var t=Ao.lastIndex=0;Ao.test(r);)++t;return t}var Eo=Ju;function Qu(r){return Je(r)?Eo(r):yo(r)}var Po=Qu;var Vu=it(function(r,t,e){r[e?0:1].push(t)},function(){return[[],[]]}),rp=Vu;var tp=Math.ceil,ep=Math.max;function op(r,t,e,o){for(var f=-1,a=ep(tp((t-r)/(e||1)),0),n=Array(a);a--;)n[o?a:++f]=r,r+=e;return n}var Ro=op;function fp(r){return function(t,e,o){return o&&typeof o!="number"&&_(t,e,o)&&(e=o=void 0),t=yr(t),e===void 0?(e=t,t=0):e=yr(e),o=o===void 0?t1&&_(r,t[0],t[1])?t=[]:e>2&&_(t[0],t[1],t[2])&&(t=[t[0]]),ho(r,j(t,1),[])}),bp=cp;var hp=9007199254740991,ht=4294967295,yp=Math.min;function Ap(r,t){if(r=L(r),r<1||r>hp)return[];var e=ht,o=yp(r,ht);t=G(t),r-=ht;for(var f=It(o,t);++e` + /* Font Awesome icon styling - consolidated */ + .label-icon { + display: inline-block; + height: 1em; + overflow: visible; + vertical-align: -0.125em; + } + + .node .label-icon path { + fill: currentColor; + stroke: revert; + stroke-width: revert; + } +`,"getIconStyles");export{l as a}; diff --git a/src/google/adk/cli/browser/chunk-BDIW4D5I.js b/src/google/adk/cli/browser/chunk-BDIW4D5I.js new file mode 100644 index 0000000000..07519d00bd --- /dev/null +++ b/src/google/adk/cli/browser/chunk-BDIW4D5I.js @@ -0,0 +1,65 @@ +import{a as re}from"./chunk-DMWOYWYQ.js";import{a as se}from"./chunk-T3Q3QCCV.js";import{a as ae}from"./chunk-4R6SYGKS.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{f as Q,l as ee,m as te}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as j,M as C,R as F,S as K,T as Y,U as Z,V as U,W as V,X as J,aa as X,r as z}from"./chunk-QFMJV7VH.js";import{a as S,g as l,i as u}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as I,b as _,j as N}from"./chunk-RMXJBC7V.js";var x={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4},me=z.gitGraph,M=l(()=>ee(I(I({},me),j().gitGraph)),"getConfig"),n=new ae(()=>{let r=M(),e=r.mainBranchName,a=r.mainBranchOrder;return{mainBranchName:e,commits:new Map,head:null,branchConfig:new Map([[e,{name:e,order:a}]]),branches:new Map([[e,null]]),currBranch:e,direction:"LR",seq:0,options:{}}});function A(){return Q({length:7})}l(A,"getID");function ce(r,e){let a=Object.create(null);return r.reduce((o,t)=>{let s=e(t);return a[s]||(a[s]=!0,o.push(t)),o},[])}l(ce,"uniqBy");var pe=l(function(r){n.records.direction=r},"setDirection"),ge=l(function(r){u.debug("options str",r),r=r?.trim(),r=r||"{}";try{n.records.options=JSON.parse(r)}catch(e){u.error("error while parsing gitGraph options",e.message)}},"setOptions"),fe=l(function(){return n.records.options},"getOptions"),ye=l(function(r){let e=r.msg,a=r.id,o=r.type,t=r.tags;u.info("commit",e,a,o,t),u.debug("Entering commit:",e,a,o,t);let s=M();a=C.sanitizeText(a,s),e=C.sanitizeText(e,s),t=t?.map(d=>C.sanitizeText(d,s));let h={id:a||n.records.seq+"-"+A(),message:e,seq:n.records.seq++,type:o??x.NORMAL,tags:t??[],parents:n.records.head==null?[]:[n.records.head.id],branch:n.records.currBranch};n.records.head=h,u.info("main branch",s.mainBranchName),n.records.commits.has(h.id)&&u.warn(`Commit ID ${h.id} already exists`),n.records.commits.set(h.id,h),n.records.branches.set(n.records.currBranch,h.id),u.debug("in pushCommit "+h.id)},"commit"),$e=l(function(r){let e=r.name,a=r.order;if(e=C.sanitizeText(e,M()),n.records.branches.has(e))throw new Error(`Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout ${e}")`);n.records.branches.set(e,n.records.head!=null?n.records.head.id:null),n.records.branchConfig.set(e,{name:e,order:a}),ne(e),u.debug("in createBranch")},"branch"),xe=l(r=>{let e=r.branch,a=r.id,o=r.type,t=r.tags,s=M();e=C.sanitizeText(e,s),a&&(a=C.sanitizeText(a,s));let h=n.records.branches.get(n.records.currBranch),d=n.records.branches.get(e),c=h?n.records.commits.get(h):void 0,m=d?n.records.commits.get(d):void 0;if(c&&m&&c.branch===e)throw new Error(`Cannot merge branch '${e}' into itself.`);if(n.records.currBranch===e){let i=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},i}if(c===void 0||!c){let i=new Error(`Incorrect usage of "merge". Current branch (${n.records.currBranch})has no commits`);throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["commit"]},i}if(!n.records.branches.has(e)){let i=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") does not exist");throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:[`branch ${e}`]},i}if(m===void 0||!m){let i=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") has no commits");throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:['"commit"']},i}if(c===m){let i=new Error('Incorrect usage of "merge". Both branches have same head');throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},i}if(a&&n.records.commits.has(a)){let i=new Error('Incorrect usage of "merge". Commit with id:'+a+" already exists, use different custom id");throw i.hash={text:`merge ${e} ${a} ${o} ${t?.join(" ")}`,token:`merge ${e} ${a} ${o} ${t?.join(" ")}`,expected:[`merge ${e} ${a}_UNIQUE ${o} ${t?.join(" ")}`]},i}let p=d||"",f={id:a||`${n.records.seq}-${A()}`,message:`merged branch ${e} into ${n.records.currBranch}`,seq:n.records.seq++,parents:n.records.head==null?[]:[n.records.head.id,p],branch:n.records.currBranch,type:x.MERGE,customType:o,customId:!!a,tags:t??[]};n.records.head=f,n.records.commits.set(f.id,f),n.records.branches.set(n.records.currBranch,f.id),u.debug(n.records.branches),u.debug("in mergeBranch")},"merge"),ue=l(function(r){let e=r.id,a=r.targetId,o=r.tags,t=r.parent;u.debug("Entering cherryPick:",e,a,o);let s=M();if(e=C.sanitizeText(e,s),a=C.sanitizeText(a,s),o=o?.map(c=>C.sanitizeText(c,s)),t=C.sanitizeText(t,s),!e||!n.records.commits.has(e)){let c=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw c.hash={text:`cherryPick ${e} ${a}`,token:`cherryPick ${e} ${a}`,expected:["cherry-pick abc"]},c}let h=n.records.commits.get(e);if(h===void 0||!h)throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');if(t&&!(Array.isArray(h.parents)&&h.parents.includes(t)))throw new Error("Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.");let d=h.branch;if(h.type===x.MERGE&&!t)throw new Error("Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.");if(!a||!n.records.commits.has(a)){if(d===n.records.currBranch){let f=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw f.hash={text:`cherryPick ${e} ${a}`,token:`cherryPick ${e} ${a}`,expected:["cherry-pick abc"]},f}let c=n.records.branches.get(n.records.currBranch);if(c===void 0||!c){let f=new Error(`Incorrect usage of "cherry-pick". Current branch (${n.records.currBranch})has no commits`);throw f.hash={text:`cherryPick ${e} ${a}`,token:`cherryPick ${e} ${a}`,expected:["cherry-pick abc"]},f}let m=n.records.commits.get(c);if(m===void 0||!m){let f=new Error(`Incorrect usage of "cherry-pick". Current branch (${n.records.currBranch})has no commits`);throw f.hash={text:`cherryPick ${e} ${a}`,token:`cherryPick ${e} ${a}`,expected:["cherry-pick abc"]},f}let p={id:n.records.seq+"-"+A(),message:`cherry-picked ${h?.message} into ${n.records.currBranch}`,seq:n.records.seq++,parents:n.records.head==null?[]:[n.records.head.id,h.id],branch:n.records.currBranch,type:x.CHERRY_PICK,tags:o?o.filter(Boolean):[`cherry-pick:${h.id}${h.type===x.MERGE?`|parent:${t}`:""}`]};n.records.head=p,n.records.commits.set(p.id,p),n.records.branches.set(n.records.currBranch,p.id),u.debug(n.records.branches),u.debug("in cherryPick")}},"cherryPick"),ne=l(function(r){if(r=C.sanitizeText(r,M()),n.records.branches.has(r)){n.records.currBranch=r;let e=n.records.branches.get(n.records.currBranch);e===void 0||!e?n.records.head=null:n.records.head=n.records.commits.get(e)??null}else{let e=new Error(`Trying to checkout branch which is not yet created. (Help try using "branch ${r}")`);throw e.hash={text:`checkout ${r}`,token:`checkout ${r}`,expected:[`branch ${r}`]},e}},"checkout");function W(r,e,a){let o=r.indexOf(e);o===-1?r.push(a):r.splice(o,1,a)}l(W,"upsert");function H(r){let e=r.reduce((t,s)=>t.seq>s.seq?t:s,r[0]),a="";r.forEach(function(t){t===e?a+=" *":a+=" |"});let o=[a,e.id,e.seq];for(let t in n.records.branches)n.records.branches.get(t)===e.id&&o.push(t);if(u.debug(o.join(" ")),e.parents&&e.parents.length==2&&e.parents[0]&&e.parents[1]){let t=n.records.commits.get(e.parents[0]);W(r,e,t),e.parents[1]&&r.push(n.records.commits.get(e.parents[1]))}else{if(e.parents.length==0)return;if(e.parents[0]){let t=n.records.commits.get(e.parents[0]);W(r,e,t)}}r=ce(r,t=>t.id),H(r)}l(H,"prettyPrintCommitHistory");var be=l(function(){u.debug(n.records.commits);let r=ie()[0];H([r])},"prettyPrint"),we=l(function(){n.reset(),F()},"clear"),Ce=l(function(){return[...n.records.branchConfig.values()].map((e,a)=>e.order!==null&&e.order!==void 0?e:_(I({},e),{order:parseFloat(`0.${a}`)})).sort((e,a)=>(e.order??0)-(a.order??0)).map(({name:e})=>({name:e}))},"getBranchesAsObjArray"),Be=l(function(){return n.records.branches},"getBranches"),ve=l(function(){return n.records.commits},"getCommits"),ie=l(function(){let r=[...n.records.commits.values()];return r.forEach(function(e){u.debug(e.id)}),r.sort((e,a)=>e.seq-a.seq),r},"getCommitsArray"),ke=l(function(){return n.records.currBranch},"getCurrentBranch"),Te=l(function(){return n.records.direction},"getDirection"),Ee=l(function(){return n.records.head},"getHead"),de={commitType:x,getConfig:M,setDirection:pe,setOptions:ge,getOptions:fe,commit:ye,branch:$e,merge:xe,cherryPick:ue,checkout:ne,prettyPrint:be,clear:we,getBranchesAsObjArray:Ce,getBranches:Be,getCommits:ve,getCommitsArray:ie,getCurrentBranch:ke,getDirection:Te,getHead:Ee,setAccTitle:K,getAccTitle:Y,getAccDescription:U,setAccDescription:Z,setDiagramTitle:V,getDiagramTitle:J},Le=l((r,e)=>{re(r,e),r.dir&&e.setDirection(r.dir);for(let a of r.statements)Me(a,e)},"populate"),Me=l((r,e)=>{let o={Commit:l(t=>e.commit(Pe(t)),"Commit"),Branch:l(t=>e.branch(Re(t)),"Branch"),Merge:l(t=>e.merge(Oe(t)),"Merge"),Checkout:l(t=>e.checkout(Ie(t)),"Checkout"),CherryPicking:l(t=>e.cherryPick(qe(t)),"CherryPicking")}[r.$type];o?o(r):u.error(`Unknown statement type: ${r.$type}`)},"parseStatement"),Pe=l(r=>({id:r.id,msg:r.message??"",type:r.type!==void 0?x[r.type]:x.NORMAL,tags:r.tags??void 0}),"parseCommit"),Re=l(r=>({name:r.name,order:r.order??0}),"parseBranch"),Oe=l(r=>({branch:r.branch,id:r.id??"",type:r.type!==void 0?x[r.type]:void 0,tags:r.tags??void 0}),"parseMerge"),Ie=l(r=>r.branch,"parseCheckout"),qe=l(r=>({id:r.id,targetId:"",tags:r.tags?.length===0?void 0:r.tags,parent:r.parent}),"parseCherryPicking"),Ge={parse:l(r=>N(null,null,function*(){let e=yield se("gitGraph",r);u.debug(e),Le(e,de)}),"parse")},T=10,E=40,B=4,v=2,L=8,b=new Map,w=new Map,q=30,P=new Map,G=[],k=0,$="LR",Ae=l(()=>{b.clear(),w.clear(),P.clear(),k=0,G=[],$="LR"},"clear"),he=l(r=>{let e=document.createElementNS("http://www.w3.org/2000/svg","text");return(typeof r=="string"?r.split(/\\n|\n|/gi):r).forEach(o=>{let t=document.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),t.setAttribute("dy","1em"),t.setAttribute("x","0"),t.setAttribute("class","row"),t.textContent=o.trim(),e.appendChild(t)}),e},"drawText"),le=l(r=>{let e,a,o;return $==="BT"?(a=l((t,s)=>t<=s,"comparisonFunc"),o=1/0):(a=l((t,s)=>t>=s,"comparisonFunc"),o=0),r.forEach(t=>{let s=$==="TB"||$=="BT"?w.get(t)?.y:w.get(t)?.x;s!==void 0&&a(s,o)&&(e=t,o=s)}),e},"findClosestParent"),De=l(r=>{let e="",a=1/0;return r.forEach(o=>{let t=w.get(o).y;t<=a&&(e=o,a=t)}),e||void 0},"findClosestParentBT"),We=l((r,e,a)=>{let o=a,t=a,s=[];r.forEach(h=>{let d=e.get(h);if(!d)throw new Error(`Commit not found for key ${h}`);d.parents.length?(o=_e(d),t=Math.max(o,t)):s.push(d),Ne(d,o)}),o=t,s.forEach(h=>{Se(h,o,a)}),r.forEach(h=>{let d=e.get(h);if(d?.parents.length){let c=De(d.parents);o=w.get(c).y-E,o<=t&&(t=o);let m=b.get(d.branch).pos,p=o-T;w.set(d.id,{x:m,y:p})}})},"setParallelBTPos"),He=l(r=>{let e=le(r.parents.filter(o=>o!==null));if(!e)throw new Error(`Closest parent not found for commit ${r.id}`);let a=w.get(e)?.y;if(a===void 0)throw new Error(`Closest parent position not found for commit ${r.id}`);return a},"findClosestParentPos"),_e=l(r=>He(r)+E,"calculateCommitPosition"),Ne=l((r,e)=>{let a=b.get(r.branch);if(!a)throw new Error(`Branch not found for commit ${r.id}`);let o=a.pos,t=e+T;return w.set(r.id,{x:o,y:t}),{x:o,y:t}},"setCommitPosition"),Se=l((r,e,a)=>{let o=b.get(r.branch);if(!o)throw new Error(`Branch not found for commit ${r.id}`);let t=e+a,s=o.pos;w.set(r.id,{x:s,y:t})},"setRootPosition"),ze=l((r,e,a,o,t,s)=>{if(s===x.HIGHLIGHT)r.append("rect").attr("x",a.x-10).attr("y",a.y-10).attr("width",20).attr("height",20).attr("class",`commit ${e.id} commit-highlight${t%L} ${o}-outer`),r.append("rect").attr("x",a.x-6).attr("y",a.y-6).attr("width",12).attr("height",12).attr("class",`commit ${e.id} commit${t%L} ${o}-inner`);else if(s===x.CHERRY_PICK)r.append("circle").attr("cx",a.x).attr("cy",a.y).attr("r",10).attr("class",`commit ${e.id} ${o}`),r.append("circle").attr("cx",a.x-3).attr("cy",a.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${o}`),r.append("circle").attr("cx",a.x+3).attr("cy",a.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${o}`),r.append("line").attr("x1",a.x+3).attr("y1",a.y+1).attr("x2",a.x).attr("y2",a.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${o}`),r.append("line").attr("x1",a.x-3).attr("y1",a.y+1).attr("x2",a.x).attr("y2",a.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${o}`);else{let h=r.append("circle");if(h.attr("cx",a.x),h.attr("cy",a.y),h.attr("r",e.type===x.MERGE?9:10),h.attr("class",`commit ${e.id} commit${t%L}`),s===x.MERGE){let d=r.append("circle");d.attr("cx",a.x),d.attr("cy",a.y),d.attr("r",6),d.attr("class",`commit ${o} ${e.id} commit${t%L}`)}s===x.REVERSE&&r.append("path").attr("d",`M ${a.x-5},${a.y-5}L${a.x+5},${a.y+5}M${a.x-5},${a.y+5}L${a.x+5},${a.y-5}`).attr("class",`commit ${o} ${e.id} commit${t%L}`)}},"drawCommitBullet"),je=l((r,e,a,o,t)=>{if(e.type!==x.CHERRY_PICK&&(e.customId&&e.type===x.MERGE||e.type!==x.MERGE)&&t.showCommitLabel){let s=r.append("g"),h=s.insert("rect").attr("class","commit-label-bkg"),d=s.append("text").attr("x",o).attr("y",a.y+25).attr("class","commit-label").text(e.id),c=d.node()?.getBBox();if(c&&(h.attr("x",a.posWithOffset-c.width/2-v).attr("y",a.y+13.5).attr("width",c.width+2*v).attr("height",c.height+2*v),$==="TB"||$==="BT"?(h.attr("x",a.x-(c.width+4*B+5)).attr("y",a.y-12),d.attr("x",a.x-(c.width+4*B)).attr("y",a.y+c.height-12)):d.attr("x",a.posWithOffset-c.width/2),t.rotateCommitLabel))if($==="TB"||$==="BT")d.attr("transform","rotate(-45, "+a.x+", "+a.y+")"),h.attr("transform","rotate(-45, "+a.x+", "+a.y+")");else{let m=-7.5-(c.width+10)/25*9.5,p=10+c.width/25*8.5;s.attr("transform","translate("+m+", "+p+") rotate(-45, "+o+", "+a.y+")")}}},"drawCommitLabel"),Fe=l((r,e,a,o)=>{if(e.tags.length>0){let t=0,s=0,h=0,d=[];for(let c of e.tags.reverse()){let m=r.insert("polygon"),p=r.append("circle"),f=r.append("text").attr("y",a.y-16-t).attr("class","tag-label").text(c),i=f.node()?.getBBox();if(!i)throw new Error("Tag bbox not found");s=Math.max(s,i.width),h=Math.max(h,i.height),f.attr("x",a.posWithOffset-i.width/2),d.push({tag:f,hole:p,rect:m,yOffset:t}),t+=20}for(let{tag:c,hole:m,rect:p,yOffset:f}of d){let i=h/2,y=a.y-19.2-f;if(p.attr("class","tag-label-bkg").attr("points",` + ${o-s/2-B/2},${y+v} + ${o-s/2-B/2},${y-v} + ${a.posWithOffset-s/2-B},${y-i-v} + ${a.posWithOffset+s/2+B},${y-i-v} + ${a.posWithOffset+s/2+B},${y+i+v} + ${a.posWithOffset-s/2-B},${y+i+v}`),m.attr("cy",y).attr("cx",o-s/2+B/2).attr("r",1.5).attr("class","tag-hole"),$==="TB"||$==="BT"){let g=o+f;p.attr("class","tag-label-bkg").attr("points",` + ${a.x},${g+2} + ${a.x},${g-2} + ${a.x+T},${g-i-2} + ${a.x+T+s+4},${g-i-2} + ${a.x+T+s+4},${g+i+2} + ${a.x+T},${g+i+2}`).attr("transform","translate(12,12) rotate(45, "+a.x+","+o+")"),m.attr("cx",a.x+B/2).attr("cy",g).attr("transform","translate(12,12) rotate(45, "+a.x+","+o+")"),c.attr("x",a.x+5).attr("y",g+3).attr("transform","translate(14,14) rotate(45, "+a.x+","+o+")")}}}},"drawCommitTags"),Ke=l(r=>{switch(r.customType??r.type){case x.NORMAL:return"commit-normal";case x.REVERSE:return"commit-reverse";case x.HIGHLIGHT:return"commit-highlight";case x.MERGE:return"commit-merge";case x.CHERRY_PICK:return"commit-cherry-pick";default:return"commit-normal"}},"getCommitClassType"),Ye=l((r,e,a,o)=>{let t={x:0,y:0};if(r.parents.length>0){let s=le(r.parents);if(s){let h=o.get(s)??t;return e==="TB"?h.y+E:e==="BT"?(o.get(r.id)??t).y-E:h.x+E}}else return e==="TB"?q:e==="BT"?(o.get(r.id)??t).y-E:0;return 0},"calculatePosition"),Ze=l((r,e,a)=>{let o=$==="BT"&&a?e:e+T,t=$==="TB"||$==="BT"?o:b.get(r.branch)?.pos,s=$==="TB"||$==="BT"?b.get(r.branch)?.pos:o;if(s===void 0||t===void 0)throw new Error(`Position were undefined for commit ${r.id}`);return{x:s,y:t,posWithOffset:o}},"getCommitPosition"),oe=l((r,e,a,o)=>{let t=r.append("g").attr("class","commit-bullets"),s=r.append("g").attr("class","commit-labels"),h=$==="TB"||$==="BT"?q:0,d=[...e.keys()],c=o.parallelCommits??!1,m=l((f,i)=>{let y=e.get(f)?.seq,g=e.get(i)?.seq;return y!==void 0&&g!==void 0?y-g:0},"sortKeys"),p=d.sort(m);$==="BT"&&(c&&We(p,e,h),p=p.reverse()),p.forEach(f=>{let i=e.get(f);if(!i)throw new Error(`Commit not found for key ${f}`);c&&(h=Ye(i,$,h,w));let y=Ze(i,h,c);if(a){let g=Ke(i),O=i.customType??i.type,D=b.get(i.branch)?.index??0;ze(t,i,y,g,D,O),je(s,i,y,h,o),Fe(s,i,y,h)}$==="TB"||$==="BT"?w.set(i.id,{x:y.x,y:y.posWithOffset}):w.set(i.id,{x:y.posWithOffset,y:y.y}),h=$==="BT"&&c?h+E:h+E+T,h>k&&(k=h)})},"drawCommits"),Ue=l((r,e,a,o,t)=>{let h=($==="TB"||$==="BT"?a.xm.branch===h,"isOnBranchToGetCurve"),c=l(m=>m.seq>r.seq&&m.seqc(m)&&d(m))},"shouldRerouteArrow"),R=l((r,e,a=0)=>{let o=r+Math.abs(r-e)/2;if(a>5)return o;if(G.every(h=>Math.abs(h-o)>=10))return G.push(o),o;let s=Math.abs(r-e);return R(r,e-s/5,a+1)},"findLane"),Ve=l((r,e,a,o)=>{let t=w.get(e.id),s=w.get(a.id);if(t===void 0||s===void 0)throw new Error(`Commit positions not found for commits ${e.id} and ${a.id}`);let h=Ue(e,a,t,s,o),d="",c="",m=0,p=0,f=b.get(a.branch)?.index;a.type===x.MERGE&&e.id!==a.parents[0]&&(f=b.get(e.branch)?.index);let i;if(h){d="A 10 10, 0, 0, 0,",c="A 10 10, 0, 0, 1,",m=10,p=10;let y=t.ys.x&&(d="A 20 20, 0, 0, 0,",c="A 20 20, 0, 0, 1,",m=20,p=20,a.type===x.MERGE&&e.id!==a.parents[0]?i=`M ${t.x} ${t.y} L ${t.x} ${s.y-m} ${c} ${t.x-p} ${s.y} L ${s.x} ${s.y}`:i=`M ${t.x} ${t.y} L ${s.x+m} ${t.y} ${d} ${s.x} ${t.y+p} L ${s.x} ${s.y}`),t.x===s.x&&(i=`M ${t.x} ${t.y} L ${s.x} ${s.y}`)):$==="BT"?(t.xs.x&&(d="A 20 20, 0, 0, 0,",c="A 20 20, 0, 0, 1,",m=20,p=20,a.type===x.MERGE&&e.id!==a.parents[0]?i=`M ${t.x} ${t.y} L ${t.x} ${s.y+m} ${d} ${t.x-p} ${s.y} L ${s.x} ${s.y}`:i=`M ${t.x} ${t.y} L ${s.x+m} ${t.y} ${c} ${s.x} ${t.y-p} L ${s.x} ${s.y}`),t.x===s.x&&(i=`M ${t.x} ${t.y} L ${s.x} ${s.y}`)):(t.ys.y&&(a.type===x.MERGE&&e.id!==a.parents[0]?i=`M ${t.x} ${t.y} L ${s.x-m} ${t.y} ${d} ${s.x} ${t.y-p} L ${s.x} ${s.y}`:i=`M ${t.x} ${t.y} L ${t.x} ${s.y+m} ${c} ${t.x+p} ${s.y} L ${s.x} ${s.y}`),t.y===s.y&&(i=`M ${t.x} ${t.y} L ${s.x} ${s.y}`));if(i===void 0)throw new Error("Line definition not found");r.append("path").attr("d",i).attr("class","arrow arrow"+f%L)},"drawArrow"),Je=l((r,e)=>{let a=r.append("g").attr("class","commit-arrows");[...e.keys()].forEach(o=>{let t=e.get(o);t.parents&&t.parents.length>0&&t.parents.forEach(s=>{Ve(a,e.get(s),t,e)})})},"drawArrows"),Xe=l((r,e,a)=>{let o=r.append("g");e.forEach((t,s)=>{let h=s%L,d=b.get(t.name)?.pos;if(d===void 0)throw new Error(`Position not found for branch ${t.name}`);let c=o.append("line");c.attr("x1",0),c.attr("y1",d),c.attr("x2",k),c.attr("y2",d),c.attr("class","branch branch"+h),$==="TB"?(c.attr("y1",q),c.attr("x1",d),c.attr("y2",k),c.attr("x2",d)):$==="BT"&&(c.attr("y1",k),c.attr("x1",d),c.attr("y2",q),c.attr("x2",d)),G.push(d);let m=t.name,p=he(m),f=o.insert("rect"),y=o.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+h);y.node().appendChild(p);let g=p.getBBox();f.attr("class","branchLabelBkg label"+h).attr("rx",4).attr("ry",4).attr("x",-g.width-4-(a.rotateCommitLabel===!0?30:0)).attr("y",-g.height/2+8).attr("width",g.width+18).attr("height",g.height+4),y.attr("transform","translate("+(-g.width-14-(a.rotateCommitLabel===!0?30:0))+", "+(d-g.height/2-1)+")"),$==="TB"?(f.attr("x",d-g.width/2-10).attr("y",0),y.attr("transform","translate("+(d-g.width/2-5)+", 0)")):$==="BT"?(f.attr("x",d-g.width/2-10).attr("y",k),y.attr("transform","translate("+(d-g.width/2-5)+", "+k+")")):f.attr("transform","translate(-19, "+(d-g.height/2)+")")})},"drawBranches"),Qe=l(function(r,e,a,o,t){return b.set(r,{pos:e,index:a}),e+=50+(t?40:0)+($==="TB"||$==="BT"?o.width/2:0),e},"setBranchPosition"),et=l(function(r,e,a,o){Ae(),u.debug("in gitgraph renderer",r+` +`,"id:",e,a);let t=o.db;if(!t.getConfig){u.error("getConfig method is not available on db");return}let s=t.getConfig(),h=s.rotateCommitLabel??!1;P=t.getCommits();let d=t.getBranchesAsObjArray();$=t.getDirection();let c=S(`[id="${e}"]`),m=0;d.forEach((p,f)=>{let i=he(p.name),y=c.append("g"),g=y.insert("g").attr("class","branchLabel"),O=g.insert("g").attr("class","label branch-label");O.node()?.appendChild(i);let D=i.getBBox();m=Qe(p.name,m,f,D,h),O.remove(),g.remove(),y.remove()}),oe(c,P,!1,s),s.showBranches&&Xe(c,d,s),Je(c,P),oe(c,P,!0,s),te.insertTitle(c,"gitTitleText",s.titleTopMargin??0,t.getDiagramTitle()),X(void 0,c,s.diagramPadding,s.useMaxWidth)},"draw"),tt={draw:et},rt=l(r=>` + .commit-id, + .commit-msg, + .branch-label { + fill: lightgrey; + color: lightgrey; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + } + ${[0,1,2,3,4,5,6,7].map(e=>` + .branch-label${e} { fill: ${r["gitBranchLabel"+e]}; } + .commit${e} { stroke: ${r["git"+e]}; fill: ${r["git"+e]}; } + .commit-highlight${e} { stroke: ${r["gitInv"+e]}; fill: ${r["gitInv"+e]}; } + .label${e} { fill: ${r["git"+e]}; } + .arrow${e} { stroke: ${r["git"+e]}; } + `).join(` +`)} + + .branch { + stroke-width: 1; + stroke: ${r.lineColor}; + stroke-dasharray: 2; + } + .commit-label { font-size: ${r.commitLabelFontSize}; fill: ${r.commitLabelColor};} + .commit-label-bkg { font-size: ${r.commitLabelFontSize}; fill: ${r.commitLabelBackground}; opacity: 0.5; } + .tag-label { font-size: ${r.tagLabelFontSize}; fill: ${r.tagLabelColor};} + .tag-label-bkg { fill: ${r.tagLabelBackground}; stroke: ${r.tagLabelBorder}; } + .tag-hole { fill: ${r.textColor}; } + + .commit-merge { + stroke: ${r.primaryColor}; + fill: ${r.primaryColor}; + } + .commit-reverse { + stroke: ${r.primaryColor}; + fill: ${r.primaryColor}; + stroke-width: 3; + } + .commit-highlight-outer { + } + .commit-highlight-inner { + stroke: ${r.primaryColor}; + fill: ${r.primaryColor}; + } + + .arrow { stroke-width: 8; stroke-linecap: round; fill: none} + .gitTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${r.textColor}; + } +`,"getStyles"),at=rt,lt={parser:Ge,db:de,renderer:tt,styles:at};export{lt as diagram}; diff --git a/src/google/adk/cli/browser/chunk-DTNGXRUJ.js b/src/google/adk/cli/browser/chunk-BPUQWVAT.js similarity index 92% rename from src/google/adk/cli/browser/chunk-DTNGXRUJ.js rename to src/google/adk/cli/browser/chunk-BPUQWVAT.js index d76f6df711..cdcd953203 100644 --- a/src/google/adk/cli/browser/chunk-DTNGXRUJ.js +++ b/src/google/adk/cli/browser/chunk-BPUQWVAT.js @@ -1 +1 @@ -import{$a as h,$b as u,Bb as l,Ca as m,Cb as a,Cc as c,Ib as r,Kb as M,Lb as C,Pa as n,Yb as y,Zb as s,_b as d,eb as v,pd as b,vb as g,wb as f,wc as _}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var D=(i,p)=>p.value;function P(i,p){if(i&1&&(l(0,"option",2),d(1),a()),i&2){let t=p.$implicit,o=C();r("value",t.value),n(),u(o.resolvePrimitive(t.label))}}var x=(()=>{class i extends b{options=c.required();value=c.required();description=c.required();selectId=super.getUniqueId("a2ui-multiple-choice");selectValue=_(()=>super.resolvePrimitive(this.value()));handleChange(t){let o=this.value()?.path;!(t.target instanceof HTMLSelectElement)||!t.target.value||!o||this.processor.setData(this.component(),this.processor.resolvePath(o,this.component().dataContextPath),t.target.value)}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(i)))(e||i)}})();static \u0275cmp=h({type:i,selectors:[["a2ui-multiple-choice"]],inputs:{options:[1,"options"],value:[1,"value"],description:[1,"description"]},features:[v],decls:6,vars:12,consts:[[3,"for"],[3,"change","id","value"],[3,"value"]],template:function(o,e){o&1&&(l(0,"section")(1,"label",0),d(2),a(),l(3,"select",1),M("change",function(E){return e.handleChange(E)}),g(4,P,2,2,"option",2,D),a()()),o&2&&(s(e.theme.components.MultipleChoice.container),n(),s(e.theme.components.MultipleChoice.label),r("htmlFor",e.selectId),n(),u(e.description()),n(),y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.MultipleChoice),s(e.theme.components.MultipleChoice.element),r("id",e.selectId)("value",e.selectValue()),n(),f(e.options()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}select[_ngcontent-%COMP%]{width:100%;box-sizing:border-box}"]})}return i})();export{x as MultipleChoice}; +import{$a as h,$b as u,Bb as l,Ca as m,Cb as a,Cc as c,Ib as r,Kb as M,Lb as C,Pa as n,Yb as y,Zb as s,_b as d,eb as v,pd as b,vb as g,wb as f,wc as _}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var D=(i,p)=>p.value;function P(i,p){if(i&1&&(l(0,"option",2),d(1),a()),i&2){let t=p.$implicit,o=C();r("value",t.value),n(),u(o.resolvePrimitive(t.label))}}var x=(()=>{class i extends b{options=c.required();value=c.required();description=c.required();selectId=super.getUniqueId("a2ui-multiple-choice");selectValue=_(()=>super.resolvePrimitive(this.value()));handleChange(t){let o=this.value()?.path;!(t.target instanceof HTMLSelectElement)||!t.target.value||!o||this.processor.setData(this.component(),this.processor.resolvePath(o,this.component().dataContextPath),t.target.value)}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(i)))(e||i)}})();static \u0275cmp=h({type:i,selectors:[["a2ui-multiple-choice"]],inputs:{options:[1,"options"],value:[1,"value"],description:[1,"description"]},features:[v],decls:6,vars:12,consts:[[3,"for"],[3,"change","id","value"],[3,"value"]],template:function(o,e){o&1&&(l(0,"section")(1,"label",0),d(2),a(),l(3,"select",1),M("change",function(E){return e.handleChange(E)}),g(4,P,2,2,"option",2,D),a()()),o&2&&(s(e.theme.components.MultipleChoice.container),n(),s(e.theme.components.MultipleChoice.label),r("htmlFor",e.selectId),n(),u(e.description()),n(),y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.MultipleChoice),s(e.theme.components.MultipleChoice.element),r("id",e.selectId)("value",e.selectValue()),n(),f(e.options()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}select[_ngcontent-%COMP%]{width:100%;box-sizing:border-box}"]})}return i})();export{x as MultipleChoice}; diff --git a/src/google/adk/cli/browser/chunk-DIR2LWLP.js b/src/google/adk/cli/browser/chunk-DIR2LWLP.js new file mode 100644 index 0000000000..9529d256b9 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-DIR2LWLP.js @@ -0,0 +1 @@ +import{a as o,b as e}from"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{o as InfoModule,e as createInfoServices}; diff --git a/src/google/adk/cli/browser/chunk-2MVVEOIQ.js b/src/google/adk/cli/browser/chunk-DM36II44.js similarity index 89% rename from src/google/adk/cli/browser/chunk-2MVVEOIQ.js rename to src/google/adk/cli/browser/chunk-DM36II44.js index 589050f63b..dc3e6651b6 100644 --- a/src/google/adk/cli/browser/chunk-2MVVEOIQ.js +++ b/src/google/adk/cli/browser/chunk-DM36II44.js @@ -1 +1 @@ -import{$a as r,Ca as o,Db as d,Yb as l,Zb as s,eb as a,pd as m}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var f=(()=>{class e extends m{static \u0275fac=(()=>{let i;return function(t){return(i||(i=o(e)))(t||e)}})();static \u0275cmp=r({type:e,selectors:[["a2ui-divider"]],features:[a],decls:1,vars:4,template:function(n,t){n&1&&d(0,"hr"),n&2&&(l(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Divider),s(t.theme.components.Divider))},styles:["[_nghost-%COMP%]{display:block;min-height:0;overflow:auto}hr[_ngcontent-%COMP%]{height:1px;background:#ccc;border:none}"]})}return e})();export{f as Divider}; +import{$a as r,Ca as o,Db as d,Yb as l,Zb as s,eb as a,pd as m}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var f=(()=>{class e extends m{static \u0275fac=(()=>{let i;return function(t){return(i||(i=o(e)))(t||e)}})();static \u0275cmp=r({type:e,selectors:[["a2ui-divider"]],features:[a],decls:1,vars:4,template:function(n,t){n&1&&d(0,"hr"),n&2&&(l(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Divider),s(t.theme.components.Divider))},styles:["[_nghost-%COMP%]{display:block;min-height:0;overflow:auto}hr[_ngcontent-%COMP%]{height:1px;background:#ccc;border:none}"]})}return e})();export{f as Divider}; diff --git a/src/google/adk/cli/browser/chunk-DMWOYWYQ.js b/src/google/adk/cli/browser/chunk-DMWOYWYQ.js new file mode 100644 index 0000000000..ebc3890142 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-DMWOYWYQ.js @@ -0,0 +1 @@ +import{g as i}from"./chunk-JRNAXTJ7.js";function t(c,e){c.accDescr&&e.setAccDescription?.(c.accDescr),c.accTitle&&e.setAccTitle?.(c.accTitle),c.title&&e.setDiagramTitle?.(c.title)}i(t,"populateCommonDb");export{t as a}; diff --git a/src/google/adk/cli/browser/chunk-DRBE27N3.js b/src/google/adk/cli/browser/chunk-DRBE27N3.js new file mode 100644 index 0000000000..47caf1de8e --- /dev/null +++ b/src/google/adk/cli/browser/chunk-DRBE27N3.js @@ -0,0 +1 @@ +import{k as m}from"./chunk-WBLSVR3V.js";import{Y as s,r as p}from"./chunk-QFMJV7VH.js";import{g as a}from"./chunk-JRNAXTJ7.js";import{j as g}from"./chunk-RMXJBC7V.js";var S=a(({flowchart:o})=>{let n=o?.subGraphTitleMargin?.top??0,t=o?.subGraphTitleMargin?.bottom??0,r=n+t;return{subGraphTitleTopMargin:n,subGraphTitleBottomMargin:t,subGraphTitleTotalMargin:r}},"getSubGraphTitleMargins");function b(o,n){return g(this,null,function*(){let t=o.getElementsByTagName("img");if(!t||t.length===0)return;let r=n.replace(/]*>/g,"").trim()==="";yield Promise.all([...t].map(e=>new Promise(u=>{function i(){if(e.style.display="flex",e.style.flexDirection="column",r){let f=s().fontSize?s().fontSize:window.getComputedStyle(document.body).fontSize,c=5,[d=p.fontSize]=m(f),l=d*c+"px";e.style.minWidth=l,e.style.maxWidth=l}else e.style.width="100%";u(e)}a(i,"setupImage"),setTimeout(()=>{e.complete&&i()}),e.addEventListener("error",i),e.addEventListener("load",i)})))})}a(b,"configureLabelImages");export{S as a,b}; diff --git a/src/google/adk/cli/browser/chunk-EGBSMT36.js b/src/google/adk/cli/browser/chunk-EGBSMT36.js new file mode 100644 index 0000000000..d272229d61 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-EGBSMT36.js @@ -0,0 +1 @@ +var Pr=typeof global=="object"&&global&&global.Object===Object&&global,U=Pr;var Sr=typeof self=="object"&&self&&self.Object===Object&&self,Ir=U||Sr||Function("return this")(),c=Ir;var Mr=c.Symbol,_=Mr;var nt=Object.prototype,Er=nt.hasOwnProperty,Fr=nt.toString,E=_?_.toStringTag:void 0;function Lr(t){var r=Er.call(t,E),e=t[E];try{t[E]=void 0;var o=!0}catch(i){}var a=Fr.call(t);return o&&(r?t[E]=e:delete t[E]),a}var it=Lr;var Dr=Object.prototype,Gr=Dr.toString;function Nr(t){return Gr.call(t)}var ft=Nr;var zr="[object Null]",Ur="[object Undefined]",pt=_?_.toStringTag:void 0;function Rr(t){return t==null?t===void 0?Ur:zr:pt&&pt in Object(t)?it(t):ft(t)}var g=Rr;function Hr(t){var r=typeof t;return t!=null&&(r=="object"||r=="function")}var s=Hr;var Br="[object AsyncFunction]",Vr="[object Function]",Kr="[object GeneratorFunction]",qr="[object Proxy]";function $r(t){if(!s(t))return!1;var r=g(t);return r==Vr||r==Kr||r==Br||r==qr}var O=$r;function Xr(t){return function(){return t}}var ut=Xr;var Jr=c["__core-js_shared__"],R=Jr;var st=(function(){var t=/[^.]+$/.exec(R&&R.keys&&R.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""})();function Wr(t){return!!st&&st in t}var mt=Wr;var Yr=Function.prototype,Zr=Yr.toString;function Qr(t){if(t!=null){try{return Zr.call(t)}catch(r){}try{return t+""}catch(r){}}return""}var lt=Qr;var kr=/[\\^$.*+?()[\]{}|]/g,te=/^\[object .+?Constructor\]$/,re=Function.prototype,ee=Object.prototype,oe=re.toString,ae=ee.hasOwnProperty,ne=RegExp("^"+oe.call(ae).replace(kr,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ie(t){if(!s(t)||mt(t))return!1;var r=O(t)?ne:te;return r.test(lt(t))}var ct=ie;function fe(t,r){return t?.[r]}var dt=fe;function pe(t,r){var e=dt(t,r);return ct(e)?e:void 0}var T=pe;var ue=T(Object,"create"),h=ue;function se(){this.__data__=h?h(null):{},this.size=0}var ht=se;function me(t){var r=this.has(t)&&delete this.__data__[t];return this.size-=r?1:0,r}var gt=me;var le="__lodash_hash_undefined__",ce=Object.prototype,de=ce.hasOwnProperty;function he(t){var r=this.__data__;if(h){var e=r[t];return e===le?void 0:e}return de.call(r,t)?r[t]:void 0}var yt=he;var ge=Object.prototype,ye=ge.hasOwnProperty;function be(t){var r=this.__data__;return h?r[t]!==void 0:ye.call(r,t)}var bt=be;var xe="__lodash_hash_undefined__";function ve(t,r){var e=this.__data__;return this.size+=this.has(t)?0:1,e[t]=h&&r===void 0?xe:r,this}var xt=ve;function j(t){var r=-1,e=t==null?0:t.length;for(this.clear();++r-1}var Tt=Pe;function Se(t,r){var e=this.__data__,o=b(e,t);return o<0?(++this.size,e.push([t,r])):e[o][1]=r,this}var jt=Se;function A(t){var r=-1,e=t==null?0:t.length;for(this.clear();++r-1&&t%1==0&&t<=go}var K=yo;function bo(t){return t!=null&&K(t.length)&&!O(t)}var I=bo;function xo(t){return d(t)&&I(t)}var Qt=xo;function vo(){return!1}var kt=vo;var er=typeof exports=="object"&&exports&&!exports.nodeType&&exports,tr=er&&typeof module=="object"&&module&&!module.nodeType&&module,_o=tr&&tr.exports===er,rr=_o?c.Buffer:void 0,Oo=rr?rr.isBuffer:void 0,To=Oo||kt,q=To;var jo="[object Object]",Ao=Function.prototype,Co=Object.prototype,or=Ao.toString,wo=Co.hasOwnProperty,Po=or.call(Object);function So(t){if(!d(t)||g(t)!=jo)return!1;var r=B(t);if(r===null)return!0;var e=wo.call(r,"constructor")&&r.constructor;return typeof e=="function"&&e instanceof e&&or.call(e)==Po}var ar=So;var Io="[object Arguments]",Mo="[object Array]",Eo="[object Boolean]",Fo="[object Date]",Lo="[object Error]",Do="[object Function]",Go="[object Map]",No="[object Number]",zo="[object Object]",Uo="[object RegExp]",Ro="[object Set]",Ho="[object String]",Bo="[object WeakMap]",Vo="[object ArrayBuffer]",Ko="[object DataView]",qo="[object Float32Array]",$o="[object Float64Array]",Xo="[object Int8Array]",Jo="[object Int16Array]",Wo="[object Int32Array]",Yo="[object Uint8Array]",Zo="[object Uint8ClampedArray]",Qo="[object Uint16Array]",ko="[object Uint32Array]",p={};p[qo]=p[$o]=p[Xo]=p[Jo]=p[Wo]=p[Yo]=p[Zo]=p[Qo]=p[ko]=!0;p[Io]=p[Mo]=p[Vo]=p[Eo]=p[Ko]=p[Fo]=p[Lo]=p[Do]=p[Go]=p[No]=p[zo]=p[Uo]=p[Ro]=p[Ho]=p[Bo]=!1;function ta(t){return d(t)&&K(t.length)&&!!p[g(t)]}var nr=ta;function ra(t){return function(r){return t(r)}}var ir=ra;var fr=typeof exports=="object"&&exports&&!exports.nodeType&&exports,N=fr&&typeof module=="object"&&module&&!module.nodeType&&module,ea=N&&N.exports===fr,et=ea&&U.process,oa=(function(){try{var t=N&&N.require&&N.require("util").types;return t||et&&et.binding&&et.binding("util")}catch(r){}})(),ot=oa;var pr=ot&&ot.isTypedArray,aa=pr?ir(pr):nr,$=aa;function na(t,r){if(!(r==="constructor"&&typeof t[r]=="function")&&r!="__proto__")return t[r]}var z=na;var ia=Object.prototype,fa=ia.hasOwnProperty;function pa(t,r,e){var o=t[r];(!(fa.call(t,r)&&y(o,e))||e===void 0&&!(r in t))&&S(t,r,e)}var ur=pa;function ua(t,r,e,o){var a=!e;e||(e={});for(var i=-1,f=r.length;++i-1&&t%1==0&&t0){if(++r>=Pa)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}var Tr=Ma;var Ea=Tr(Or),jr=Ea;function Fa(t,r){return jr(_r(t,r,W),t+"")}var Ar=Fa;function La(t,r,e){if(!s(e))return!1;var o=typeof r;return(o=="number"?I(e)&&X(r,e.length):o=="string"&&r in e)?y(e[r],t):!1}var Cr=La;function Da(t){return Ar(function(r,e){var o=-1,a=e.length,i=a>1?e[a-1]:void 0,f=a>2?e[2]:void 0;for(i=t.length>3&&typeof i=="function"?(a--,i):void 0,f&&Cr(e[0],e[1],f)&&(i=a<3?void 0:i,a=1),r=Object(r);++o{class a extends b{value=n.required();label=n("");minValue=n.required();maxValue=n.required();inputId=super.getUniqueId("a2ui-slider");resolvedValue=h(()=>super.resolvePrimitive(this.value())??0);handleInput(t){let i=this.value()?.path;!(t.target instanceof HTMLInputElement)||!i||this.processor.setData(this.component(),i,t.target.valueAsNumber,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(a)))(e||a)}})();static \u0275cmp=s({type:a,selectors:[["","a2ui-slider",""]],inputs:{value:[1,"value"],label:[1,"label"],minValue:[1,"minValue"],maxValue:[1,"maxValue"]},features:[p],attrs:M,decls:4,vars:14,consts:[[3,"for"],["autocomplete","off","type","range",3,"input","value","min","max","id"]],template:function(i,e){i&1&&(r(0,"section")(1,"label",0),g(2),u(),r(3,"input",1),c("input",function(y){return e.handleInput(y)}),u()()),i&2&&(o(e.theme.components.Slider.container),l(),o(e.theme.components.Slider.label),d("htmlFor",e.inputId),l(),f(" ",e.label()," "),l(),v(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Slider),o(e.theme.components.Slider.element),d("value",e.resolvedValue())("min",e.minValue())("max",e.maxValue())("id",e.inputId))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight)}input[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return a})();export{E as Slider}; +import{$a as s,Bb as r,Ca as m,Cb as u,Cc as n,Ib as d,Kb as c,Pa as l,Yb as v,Zb as o,_b as g,ac as f,eb as p,pd as b,wc as h}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var M=["a2ui-slider",""],E=(()=>{class a extends b{value=n.required();label=n("");minValue=n.required();maxValue=n.required();inputId=super.getUniqueId("a2ui-slider");resolvedValue=h(()=>super.resolvePrimitive(this.value())??0);handleInput(t){let i=this.value()?.path;!(t.target instanceof HTMLInputElement)||!i||this.processor.setData(this.component(),i,t.target.valueAsNumber,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(a)))(e||a)}})();static \u0275cmp=s({type:a,selectors:[["","a2ui-slider",""]],inputs:{value:[1,"value"],label:[1,"label"],minValue:[1,"minValue"],maxValue:[1,"maxValue"]},features:[p],attrs:M,decls:4,vars:14,consts:[[3,"for"],["autocomplete","off","type","range",3,"input","value","min","max","id"]],template:function(i,e){i&1&&(r(0,"section")(1,"label",0),g(2),u(),r(3,"input",1),c("input",function(y){return e.handleInput(y)}),u()()),i&2&&(o(e.theme.components.Slider.container),l(),o(e.theme.components.Slider.label),d("htmlFor",e.inputId),l(),f(" ",e.label()," "),l(),v(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Slider),o(e.theme.components.Slider.element),d("value",e.resolvedValue())("min",e.minValue())("max",e.maxValue())("id",e.inputId))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight)}input[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return a})();export{E as Slider}; diff --git a/src/google/adk/cli/browser/chunk-F57TI45K.js b/src/google/adk/cli/browser/chunk-F57TI45K.js new file mode 100644 index 0000000000..7fbe35e94f --- /dev/null +++ b/src/google/adk/cli/browser/chunk-F57TI45K.js @@ -0,0 +1 @@ +import{b as y,c as f,d as p,e as h}from"./chunk-TNJPXCAB.js";import{a as g,d,g as u}from"./chunk-W7PRDKNL.js";import{c as m}from"./chunk-WBLSVR3V.js";import{A as l,M as s}from"./chunk-QFMJV7VH.js";import{g as o,i}from"./chunk-JRNAXTJ7.js";import{j as a}from"./chunk-RMXJBC7V.js";var L={common:s,getConfig:l,insertCluster:d,insertEdge:p,insertEdgeLabel:y,insertMarkers:h,insertNode:u,interpolateToCurve:m,labelHelper:g,log:i,positionEdgeLabel:f},t={},w=o(r=>{for(let e of r)t[e.name]=e},"registerLayoutLoaders"),c=o(()=>{w([{name:"dagre",loader:o(()=>a(null,null,function*(){return yield import("./chunk-TNYN2TVW.js")}),"loader")},{name:"cose-bilkent",loader:o(()=>a(null,null,function*(){return yield import("./chunk-HD4LLD2O.js")}),"loader")}])},"registerDefaultLayoutLoaders");c();var C=o((r,e)=>a(null,null,function*(){if(!(r.layoutAlgorithm in t))throw new Error(`Unknown layout algorithm: ${r.layoutAlgorithm}`);let n=t[r.layoutAlgorithm];return(yield n.loader()).render(r,e,L,{algorithm:n.algorithm})}),"render"),D=o((r="",{fallback:e="dagre"}={})=>{if(r in t)return r;if(e in t)return i.warn(`Layout algorithm ${r} is not registered. Using ${e} as fallback.`),e;throw new Error(`Both layout algorithms ${r} and ${e} are not registered.`)},"getRegisteredLayoutAlgorithm");export{w as a,C as b,D as c}; diff --git a/src/google/adk/cli/browser/chunk-FDH623K7.js b/src/google/adk/cli/browser/chunk-FDH623K7.js new file mode 100644 index 0000000000..1b0ae81555 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-FDH623K7.js @@ -0,0 +1 @@ +import{a as r,b as e}from"./chunk-JNY2YWG7.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{r as RadarModule,e as createRadarServices}; diff --git a/src/google/adk/cli/browser/chunk-GP6TCC26.js b/src/google/adk/cli/browser/chunk-GP6TCC26.js new file mode 100644 index 0000000000..48526d49ed --- /dev/null +++ b/src/google/adk/cli/browser/chunk-GP6TCC26.js @@ -0,0 +1 @@ +import{e as m}from"./chunk-RMXJBC7V.js";var R=m(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.BLANK_URL=e.relativeFirstCharacters=e.whitespaceEscapeCharsRegex=e.urlSchemeRegex=e.ctrlCharactersRegex=e.htmlCtrlEntityRegex=e.htmlEntitiesRegex=e.invalidProtocolRegex=void 0;e.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im;e.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g;e.htmlCtrlEntityRegex=/&(newline|tab);/gi;e.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim;e.urlSchemeRegex=/^.+(:|:)/gim;e.whitespaceEscapeCharsRegex=/(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g;e.relativeFirstCharacters=[".","/"];e.BLANK_URL="about:blank"});var v=m(s=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0});s.sanitizeUrl=p;var t=R();function d(r){return t.relativeFirstCharacters.indexOf(r[0])>-1}function x(r){var c=r.replace(t.ctrlCharactersRegex,"");return c.replace(t.htmlEntitiesRegex,function(a,i){return String.fromCharCode(i)})}function C(r){return URL.canParse(r)}function g(r){try{return decodeURIComponent(r)}catch(c){return r}}function p(r){if(!r)return t.BLANK_URL;var c,a=g(r.trim());do a=x(a).replace(t.htmlCtrlEntityRegex,"").replace(t.ctrlCharactersRegex,"").replace(t.whitespaceEscapeCharsRegex,"").trim(),a=g(a),c=a.match(t.ctrlCharactersRegex)||a.match(t.htmlEntitiesRegex)||a.match(t.htmlCtrlEntityRegex)||a.match(t.whitespaceEscapeCharsRegex);while(c&&c.length>0);var i=a;if(!i)return t.BLANK_URL;if(d(i))return i;var h=i.trimStart(),u=h.match(t.urlSchemeRegex);if(!u)return i;var n=u[0].toLowerCase().trim();if(t.invalidProtocolRegex.test(n))return t.BLANK_URL;var o=h.replace(/\\/g,"/");if(n==="mailto:"||n.includes("://"))return o;if(n==="http:"||n==="https:"){if(!C(o))return t.BLANK_URL;var l=new URL(o);return l.protocol=l.protocol.toLowerCase(),l.hostname=l.hostname.toLowerCase(),l.toString()}return o}});export{v as a}; diff --git a/src/google/adk/cli/browser/chunk-HD4LLD2O.js b/src/google/adk/cli/browser/chunk-HD4LLD2O.js new file mode 100644 index 0000000000..f2bef5be3b --- /dev/null +++ b/src/google/adk/cli/browser/chunk-HD4LLD2O.js @@ -0,0 +1 @@ +import{a as z}from"./chunk-YVVLWU7S.js";import{a as ot,g as W,i as Z}from"./chunk-JRNAXTJ7.js";import{a as B,b as K,e as q,h as yt,j as k}from"./chunk-RMXJBC7V.js";var tt=q((Q,J)=>{"use strict";(function(R,y){typeof Q=="object"&&typeof J=="object"?J.exports=y():typeof define=="function"&&define.amd?define([],y):typeof Q=="object"?Q.layoutBase=y():R.layoutBase=y()})(Q,function(){return(function(N){var R={};function y(n){if(R[n])return R[n].exports;var e=R[n]={i:n,l:!1,exports:{}};return N[n].call(e.exports,e,e.exports,y),e.l=!0,e.exports}return y.m=N,y.c=R,y.i=function(n){return n},y.d=function(n,e,t){y.o(n,e)||Object.defineProperty(n,e,{configurable:!1,enumerable:!0,get:t})},y.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return y.d(e,"a",e),e},y.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},y.p="",y(y.s=26)})([(function(N,R,y){"use strict";function n(){}n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,N.exports=n}),(function(N,R,y){"use strict";var n=y(2),e=y(8),t=y(9);function r(g,s,d){n.call(this,d),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=d,this.bendpoints=[],this.source=g,this.target=s}r.prototype=Object.create(n.prototype);for(var a in n)r[a]=n[a];r.prototype.getSource=function(){return this.source},r.prototype.getTarget=function(){return this.target},r.prototype.isInterGraph=function(){return this.isInterGraph},r.prototype.getLength=function(){return this.length},r.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},r.prototype.getBendpoints=function(){return this.bendpoints},r.prototype.getLca=function(){return this.lca},r.prototype.getSourceInLca=function(){return this.sourceInLca},r.prototype.getTargetInLca=function(){return this.targetInLca},r.prototype.getOtherEnd=function(g){if(this.source===g)return this.target;if(this.target===g)return this.source;throw"Node is not incident with this edge"},r.prototype.getOtherEndInGraph=function(g,s){for(var d=this.getOtherEnd(g),i=s.getGraphManager().getRoot();;){if(d.getOwner()==s)return d;if(d.getOwner()==i)break;d=d.getOwner().getParent()}return null},r.prototype.updateLength=function(){var g=new Array(4);this.isOverlapingSourceAndTarget=e.getIntersection(this.target.getRect(),this.source.getRect(),g),this.isOverlapingSourceAndTarget||(this.lengthX=g[0]-g[2],this.lengthY=g[1]-g[3],Math.abs(this.lengthX)<1&&(this.lengthX=t.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=t.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},r.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=t.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=t.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},N.exports=r}),(function(N,R,y){"use strict";function n(e){this.vGraphObject=e}N.exports=n}),(function(N,R,y){"use strict";var n=y(2),e=y(10),t=y(13),r=y(0),a=y(16),g=y(4);function s(i,h,l,p){l==null&&p==null&&(p=h),n.call(this,p),i.graphManager!=null&&(i=i.graphManager),this.estimatedSize=e.MIN_VALUE,this.inclusionTreeDepth=e.MAX_VALUE,this.vGraphObject=p,this.edges=[],this.graphManager=i,l!=null&&h!=null?this.rect=new t(h.x,h.y,l.width,l.height):this.rect=new t}s.prototype=Object.create(n.prototype);for(var d in n)s[d]=n[d];s.prototype.getEdges=function(){return this.edges},s.prototype.getChild=function(){return this.child},s.prototype.getOwner=function(){return this.owner},s.prototype.getWidth=function(){return this.rect.width},s.prototype.setWidth=function(i){this.rect.width=i},s.prototype.getHeight=function(){return this.rect.height},s.prototype.setHeight=function(i){this.rect.height=i},s.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},s.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},s.prototype.getCenter=function(){return new g(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},s.prototype.getLocation=function(){return new g(this.rect.x,this.rect.y)},s.prototype.getRect=function(){return this.rect},s.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},s.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},s.prototype.setRect=function(i,h){this.rect.x=i.x,this.rect.y=i.y,this.rect.width=h.width,this.rect.height=h.height},s.prototype.setCenter=function(i,h){this.rect.x=i-this.rect.width/2,this.rect.y=h-this.rect.height/2},s.prototype.setLocation=function(i,h){this.rect.x=i,this.rect.y=h},s.prototype.moveBy=function(i,h){this.rect.x+=i,this.rect.y+=h},s.prototype.getEdgeListToNode=function(i){var h=[],l,p=this;return p.edges.forEach(function(v){if(v.target==i){if(v.source!=p)throw"Incorrect edge source!";h.push(v)}}),h},s.prototype.getEdgesBetween=function(i){var h=[],l,p=this;return p.edges.forEach(function(v){if(!(v.source==p||v.target==p))throw"Incorrect edge source and/or target";(v.target==i||v.source==i)&&h.push(v)}),h},s.prototype.getNeighborsList=function(){var i=new Set,h=this;return h.edges.forEach(function(l){if(l.source==h)i.add(l.target);else{if(l.target!=h)throw"Incorrect incidency!";i.add(l.source)}}),i},s.prototype.withChildren=function(){var i=new Set,h,l;if(i.add(this),this.child!=null)for(var p=this.child.getNodes(),v=0;vh&&(this.rect.x-=(this.labelWidth-h)/2,this.setWidth(this.labelWidth)),this.labelHeight>l&&(this.labelPos=="center"?this.rect.y-=(this.labelHeight-l)/2:this.labelPos=="top"&&(this.rect.y-=this.labelHeight-l),this.setHeight(this.labelHeight))}}},s.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==e.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},s.prototype.transform=function(i){var h=this.rect.x;h>r.WORLD_BOUNDARY?h=r.WORLD_BOUNDARY:h<-r.WORLD_BOUNDARY&&(h=-r.WORLD_BOUNDARY);var l=this.rect.y;l>r.WORLD_BOUNDARY?l=r.WORLD_BOUNDARY:l<-r.WORLD_BOUNDARY&&(l=-r.WORLD_BOUNDARY);var p=new g(h,l),v=i.inverseTransformPoint(p);this.setLocation(v.x,v.y)},s.prototype.getLeft=function(){return this.rect.x},s.prototype.getRight=function(){return this.rect.x+this.rect.width},s.prototype.getTop=function(){return this.rect.y},s.prototype.getBottom=function(){return this.rect.y+this.rect.height},s.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},N.exports=s}),(function(N,R,y){"use strict";function n(e,t){e==null&&t==null?(this.x=0,this.y=0):(this.x=e,this.y=t)}n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(e){this.x=e},n.prototype.setY=function(e){this.y=e},n.prototype.getDifference=function(e){return new DimensionD(this.x-e.x,this.y-e.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(e){return this.x+=e.width,this.y+=e.height,this},N.exports=n}),(function(N,R,y){"use strict";var n=y(2),e=y(10),t=y(0),r=y(6),a=y(3),g=y(1),s=y(13),d=y(12),i=y(11);function h(p,v,L){n.call(this,L),this.estimatedSize=e.MIN_VALUE,this.margin=t.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=p,v!=null&&v instanceof r?this.graphManager=v:v!=null&&v instanceof Layout&&(this.graphManager=v.graphManager)}h.prototype=Object.create(n.prototype);for(var l in n)h[l]=n[l];h.prototype.getNodes=function(){return this.nodes},h.prototype.getEdges=function(){return this.edges},h.prototype.getGraphManager=function(){return this.graphManager},h.prototype.getParent=function(){return this.parent},h.prototype.getLeft=function(){return this.left},h.prototype.getRight=function(){return this.right},h.prototype.getTop=function(){return this.top},h.prototype.getBottom=function(){return this.bottom},h.prototype.isConnected=function(){return this.isConnected},h.prototype.add=function(p,v,L){if(v==null&&L==null){var c=p;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(c)>-1)throw"Node already in graph!";return c.owner=this,this.getNodes().push(c),c}else{var A=p;if(!(this.getNodes().indexOf(v)>-1&&this.getNodes().indexOf(L)>-1))throw"Source or target not in graph!";if(!(v.owner==L.owner&&v.owner==this))throw"Both owners must be this graph!";return v.owner!=L.owner?null:(A.source=v,A.target=L,A.isInterGraph=!1,this.getEdges().push(A),v.edges.push(A),L!=v&&L.edges.push(A),A)}},h.prototype.remove=function(p){var v=p;if(p instanceof a){if(v==null)throw"Node is null!";if(!(v.owner!=null&&v.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var L=v.edges.slice(),c,A=L.length,T=0;T-1&&f>-1))throw"Source and/or target doesn't know this edge!";c.source.edges.splice(o,1),c.target!=c.source&&c.target.edges.splice(f,1);var C=c.source.owner.getEdges().indexOf(c);if(C==-1)throw"Not in owner's edge list!";c.source.owner.getEdges().splice(C,1)}},h.prototype.updateLeftTop=function(){for(var p=e.MAX_VALUE,v=e.MAX_VALUE,L,c,A,T=this.getNodes(),C=T.length,o=0;oL&&(p=L),v>c&&(v=c)}return p==e.MAX_VALUE?null:(T[0].getParent().paddingLeft!=null?A=T[0].getParent().paddingLeft:A=this.margin,this.left=v-A,this.top=p-A,new d(this.left,this.top))},h.prototype.updateBounds=function(p){for(var v=e.MAX_VALUE,L=-e.MAX_VALUE,c=e.MAX_VALUE,A=-e.MAX_VALUE,T,C,o,f,u,E=this.nodes,D=E.length,O=0;OT&&(v=T),Lo&&(c=o),AT&&(v=T),Lo&&(c=o),A=this.nodes.length){var D=0;L.forEach(function(O){O.owner==p&&D++}),D==this.nodes.length&&(this.isConnected=!0)}},N.exports=h}),(function(N,R,y){"use strict";var n,e=y(1);function t(r){n=y(5),this.layout=r,this.graphs=[],this.edges=[]}t.prototype.addRoot=function(){var r=this.layout.newGraph(),a=this.layout.newNode(null),g=this.add(r,a);return this.setRootGraph(g),this.rootGraph},t.prototype.add=function(r,a,g,s,d){if(g==null&&s==null&&d==null){if(r==null)throw"Graph is null!";if(a==null)throw"Parent node is null!";if(this.graphs.indexOf(r)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(r),r.parent!=null)throw"Already has a parent!";if(a.child!=null)throw"Already has a child!";return r.parent=a,a.child=r,r}else{d=g,s=a,g=r;var i=s.getOwner(),h=d.getOwner();if(!(i!=null&&i.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(h!=null&&h.getGraphManager()==this))throw"Target not in this graph mgr!";if(i==h)return g.isInterGraph=!1,i.add(g,s,d);if(g.isInterGraph=!0,g.source=s,g.target=d,this.edges.indexOf(g)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(g),!(g.source!=null&&g.target!=null))throw"Edge source and/or target is null!";if(!(g.source.edges.indexOf(g)==-1&&g.target.edges.indexOf(g)==-1))throw"Edge already in source and/or target incidency list!";return g.source.edges.push(g),g.target.edges.push(g),g}},t.prototype.remove=function(r){if(r instanceof n){var a=r;if(a.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(a==this.rootGraph||a.parent!=null&&a.parent.graphManager==this))throw"Invalid parent node!";var g=[];g=g.concat(a.getEdges());for(var s,d=g.length,i=0;i=r.getRight()?a[0]+=Math.min(r.getX()-t.getX(),t.getRight()-r.getRight()):r.getX()<=t.getX()&&r.getRight()>=t.getRight()&&(a[0]+=Math.min(t.getX()-r.getX(),r.getRight()-t.getRight())),t.getY()<=r.getY()&&t.getBottom()>=r.getBottom()?a[1]+=Math.min(r.getY()-t.getY(),t.getBottom()-r.getBottom()):r.getY()<=t.getY()&&r.getBottom()>=t.getBottom()&&(a[1]+=Math.min(t.getY()-r.getY(),r.getBottom()-t.getBottom()));var d=Math.abs((r.getCenterY()-t.getCenterY())/(r.getCenterX()-t.getCenterX()));r.getCenterY()===t.getCenterY()&&r.getCenterX()===t.getCenterX()&&(d=1);var i=d*a[0],h=a[1]/d;a[0]i)return a[0]=g,a[1]=l,a[2]=d,a[3]=E,!1;if(sd)return a[0]=h,a[1]=s,a[2]=f,a[3]=i,!1;if(gd?(a[0]=v,a[1]=L,I=!0):(a[0]=p,a[1]=l,I=!0):F===x&&(g>d?(a[0]=h,a[1]=l,I=!0):(a[0]=c,a[1]=L,I=!0)),-Y===x?d>g?(a[2]=u,a[3]=E,w=!0):(a[2]=f,a[3]=o,w=!0):Y===x&&(d>g?(a[2]=C,a[3]=o,w=!0):(a[2]=D,a[3]=E,w=!0)),I&&w)return!1;if(g>d?s>i?(M=this.getCardinalDirection(F,x,4),G=this.getCardinalDirection(Y,x,2)):(M=this.getCardinalDirection(-F,x,3),G=this.getCardinalDirection(-Y,x,1)):s>i?(M=this.getCardinalDirection(-F,x,1),G=this.getCardinalDirection(-Y,x,3)):(M=this.getCardinalDirection(F,x,2),G=this.getCardinalDirection(Y,x,4)),!I)switch(M){case 1:P=l,S=g+-T/x,a[0]=S,a[1]=P;break;case 2:S=c,P=s+A*x,a[0]=S,a[1]=P;break;case 3:P=L,S=g+T/x,a[0]=S,a[1]=P;break;case 4:S=v,P=s+-A*x,a[0]=S,a[1]=P;break}if(!w)switch(G){case 1:U=o,_=d+-m/x,a[2]=_,a[3]=U;break;case 2:_=D,U=i+O*x,a[2]=_,a[3]=U;break;case 3:U=E,_=d+m/x,a[2]=_,a[3]=U;break;case 4:_=u,U=i+-O*x,a[2]=_,a[3]=U;break}}return!1},e.getCardinalDirection=function(t,r,a){return t>r?a:1+a%4},e.getIntersection=function(t,r,a,g){if(g==null)return this.getIntersection2(t,r,a);var s=t.x,d=t.y,i=r.x,h=r.y,l=a.x,p=a.y,v=g.x,L=g.y,c=void 0,A=void 0,T=void 0,C=void 0,o=void 0,f=void 0,u=void 0,E=void 0,D=void 0;return T=h-d,o=s-i,u=i*d-s*h,C=L-p,f=l-v,E=v*p-l*L,D=T*f-C*o,D===0?null:(c=(o*E-f*u)/D,A=(C*u-T*E)/D,new n(c,A))},e.angleOfVector=function(t,r,a,g){var s=void 0;return t!==a?(s=Math.atan((g-r)/(a-t)),a0?1:e<0?-1:0},n.floor=function(e){return e<0?Math.ceil(e):Math.floor(e)},n.ceil=function(e){return e<0?Math.floor(e):Math.ceil(e)},N.exports=n}),(function(N,R,y){"use strict";function n(){}n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,N.exports=n}),(function(N,R,y){"use strict";var n=(function(){function s(d,i){for(var h=0;h"u"?"undefined":n(t);return t==null||r!="object"&&r!="function"},N.exports=e}),(function(N,R,y){"use strict";function n(l){if(Array.isArray(l)){for(var p=0,v=Array(l.length);p0&&p;){for(T.push(o[0]);T.length>0&&p;){var f=T[0];T.splice(0,1),A.add(f);for(var u=f.getEdges(),c=0;c-1&&o.splice(m,1)}A=new Set,C=new Map}}return l},h.prototype.createDummyNodesForBendpoints=function(l){for(var p=[],v=l.source,L=this.graphManager.calcLowestCommonAncestor(l.source,l.target),c=0;c0){for(var L=this.edgeToDummyNodes.get(v),c=0;c=0&&p.splice(E,1);var D=C.getNeighborsList();D.forEach(function(I){if(v.indexOf(I)<0){var w=L.get(I),F=w-1;F==1&&f.push(I),L.set(I,F)}})}v=v.concat(f),(p.length==1||p.length==2)&&(c=!0,A=p[0])}return A},h.prototype.setGraphManager=function(l){this.graphManager=l},N.exports=h}),(function(N,R,y){"use strict";function n(){}n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},N.exports=n}),(function(N,R,y){"use strict";var n=y(4);function e(t,r){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}e.prototype.getWorldOrgX=function(){return this.lworldOrgX},e.prototype.setWorldOrgX=function(t){this.lworldOrgX=t},e.prototype.getWorldOrgY=function(){return this.lworldOrgY},e.prototype.setWorldOrgY=function(t){this.lworldOrgY=t},e.prototype.getWorldExtX=function(){return this.lworldExtX},e.prototype.setWorldExtX=function(t){this.lworldExtX=t},e.prototype.getWorldExtY=function(){return this.lworldExtY},e.prototype.setWorldExtY=function(t){this.lworldExtY=t},e.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},e.prototype.setDeviceOrgX=function(t){this.ldeviceOrgX=t},e.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},e.prototype.setDeviceOrgY=function(t){this.ldeviceOrgY=t},e.prototype.getDeviceExtX=function(){return this.ldeviceExtX},e.prototype.setDeviceExtX=function(t){this.ldeviceExtX=t},e.prototype.getDeviceExtY=function(){return this.ldeviceExtY},e.prototype.setDeviceExtY=function(t){this.ldeviceExtY=t},e.prototype.transformX=function(t){var r=0,a=this.lworldExtX;return a!=0&&(r=this.ldeviceOrgX+(t-this.lworldOrgX)*this.ldeviceExtX/a),r},e.prototype.transformY=function(t){var r=0,a=this.lworldExtY;return a!=0&&(r=this.ldeviceOrgY+(t-this.lworldOrgY)*this.ldeviceExtY/a),r},e.prototype.inverseTransformX=function(t){var r=0,a=this.ldeviceExtX;return a!=0&&(r=this.lworldOrgX+(t-this.ldeviceOrgX)*this.lworldExtX/a),r},e.prototype.inverseTransformY=function(t){var r=0,a=this.ldeviceExtY;return a!=0&&(r=this.lworldOrgY+(t-this.ldeviceOrgY)*this.lworldExtY/a),r},e.prototype.inverseTransformPoint=function(t){var r=new n(this.inverseTransformX(t.x),this.inverseTransformY(t.y));return r},N.exports=e}),(function(N,R,y){"use strict";function n(i){if(Array.isArray(i)){for(var h=0,l=Array(i.length);ht.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*t.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(i-t.ADAPTATION_LOWER_NODE_LIMIT)/(t.ADAPTATION_UPPER_NODE_LIMIT-t.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-t.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=t.MAX_NODE_DISPLACEMENT_INCREMENTAL):(i>t.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(t.COOLING_ADAPTATION_FACTOR,1-(i-t.ADAPTATION_LOWER_NODE_LIMIT)/(t.ADAPTATION_UPPER_NODE_LIMIT-t.ADAPTATION_LOWER_NODE_LIMIT)*(1-t.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=t.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},s.prototype.calcSpringForces=function(){for(var i=this.getAllEdges(),h,l=0;l0&&arguments[0]!==void 0?arguments[0]:!0,h=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,l,p,v,L,c=this.getAllNodes(),A;if(this.useFRGridVariant)for(this.totalIterations%t.GRID_CALCULATION_CHECK_PERIOD==1&&i&&this.updateGrid(),A=new Set,l=0;lT||A>T)&&(i.gravitationForceX=-this.gravityConstant*v,i.gravitationForceY=-this.gravityConstant*L)):(T=h.getEstimatedSize()*this.compoundGravityRangeFactor,(c>T||A>T)&&(i.gravitationForceX=-this.gravityConstant*v*this.compoundGravityConstant,i.gravitationForceY=-this.gravityConstant*L*this.compoundGravityConstant))},s.prototype.isConverged=function(){var i,h=!1;return this.totalIterations>this.maxIterations/3&&(h=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),i=this.totalDisplacement=c.length||T>=c[0].length)){for(var C=0;Cs}}]),a})();N.exports=r}),(function(N,R,y){"use strict";var n=(function(){function r(a,g){for(var s=0;s2&&arguments[2]!==void 0?arguments[2]:1,d=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;e(this,r),this.sequence1=a,this.sequence2=g,this.match_score=s,this.mismatch_penalty=d,this.gap_penalty=i,this.iMax=a.length+1,this.jMax=g.length+1,this.grid=new Array(this.iMax);for(var h=0;h=0;a--){var g=this.listeners[a];g.event===t&&g.callback===r&&this.listeners.splice(a,1)}},e.emit=function(t,r){for(var a=0;a{"use strict";(function(R,y){typeof $=="object"&&typeof et=="object"?et.exports=y(tt()):typeof define=="function"&&define.amd?define(["layout-base"],y):typeof $=="object"?$.coseBase=y(tt()):R.coseBase=y(R.layoutBase)})($,function(N){return(function(R){var y={};function n(e){if(y[e])return y[e].exports;var t=y[e]={i:e,l:!1,exports:{}};return R[e].call(t.exports,t,t.exports,n),t.l=!0,t.exports}return n.m=R,n.c=y,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)})([(function(R,y){R.exports=N}),(function(R,y,n){"use strict";var e=n(0).FDLayoutConstants;function t(){}for(var r in e)t[r]=e[r];t.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,t.DEFAULT_RADIAL_SEPARATION=e.DEFAULT_EDGE_LENGTH,t.DEFAULT_COMPONENT_SEPERATION=60,t.TILE=!0,t.TILING_PADDING_VERTICAL=10,t.TILING_PADDING_HORIZONTAL=10,t.TREE_REDUCTION_ON_INCREMENTAL=!1,R.exports=t}),(function(R,y,n){"use strict";var e=n(0).FDLayoutEdge;function t(a,g,s){e.call(this,a,g,s)}t.prototype=Object.create(e.prototype);for(var r in e)t[r]=e[r];R.exports=t}),(function(R,y,n){"use strict";var e=n(0).LGraph;function t(a,g,s){e.call(this,a,g,s)}t.prototype=Object.create(e.prototype);for(var r in e)t[r]=e[r];R.exports=t}),(function(R,y,n){"use strict";var e=n(0).LGraphManager;function t(a){e.call(this,a)}t.prototype=Object.create(e.prototype);for(var r in e)t[r]=e[r];R.exports=t}),(function(R,y,n){"use strict";var e=n(0).FDLayoutNode,t=n(0).IMath;function r(g,s,d,i){e.call(this,g,s,d,i)}r.prototype=Object.create(e.prototype);for(var a in e)r[a]=e[a];r.prototype.move=function(){var g=this.graphManager.getLayout();this.displacementX=g.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=g.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>g.coolingFactor*g.maxNodeDisplacement&&(this.displacementX=g.coolingFactor*g.maxNodeDisplacement*t.sign(this.displacementX)),Math.abs(this.displacementY)>g.coolingFactor*g.maxNodeDisplacement&&(this.displacementY=g.coolingFactor*g.maxNodeDisplacement*t.sign(this.displacementY)),this.child==null?this.moveBy(this.displacementX,this.displacementY):this.child.getNodes().length==0?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),g.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},r.prototype.propogateDisplacementToChildren=function(g,s){for(var d=this.getChild().getNodes(),i,h=0;h0)this.positionNodesRadially(o);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var f=new Set(this.getAllNodes()),u=this.nodesWithGravity.filter(function(E){return f.has(E)});this.graphManager.setAllNodesToApplyGravitation(u),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},T.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%d.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var o=new Set(this.getAllNodes()),f=this.nodesWithGravity.filter(function(D){return o.has(D)});this.graphManager.setAllNodesToApplyGravitation(f),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=d.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=d.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var u=!this.isTreeGrowing&&!this.isGrowthFinished,E=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(u,E),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},T.prototype.getPositionsData=function(){for(var o=this.graphManager.getAllNodes(),f={},u=0;u1){var I;for(I=0;IE&&(E=Math.floor(m.y)),O=Math.floor(m.x+s.DEFAULT_COMPONENT_SEPERATION)}this.transform(new l(i.WORLD_CENTER_X-m.x/2,i.WORLD_CENTER_Y-m.y/2))},T.radialLayout=function(o,f,u){var E=Math.max(this.maxDiagonalInTree(o),s.DEFAULT_RADIAL_SEPARATION);T.branchRadialLayout(f,null,0,359,0,E);var D=c.calculateBounds(o),O=new A;O.setDeviceOrgX(D.getMinX()),O.setDeviceOrgY(D.getMinY()),O.setWorldOrgX(u.x),O.setWorldOrgY(u.y);for(var m=0;m1;){var X=U[0];U.splice(0,1);var V=M.indexOf(X);V>=0&&M.splice(V,1),P--,G--}f!=null?_=(M.indexOf(U[0])+1)%P:_=0;for(var b=Math.abs(E-u)/G,H=_;S!=G;H=++H%P){var nt=M[H].getOtherEnd(o);if(nt!=f){var st=(u+S*b)%360,vt=(st+b)%360;T.branchRadialLayout(nt,o,st,vt,D+O,O),S++}}},T.maxDiagonalInTree=function(o){for(var f=v.MIN_VALUE,u=0;uf&&(f=D)}return f},T.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},T.prototype.groupZeroDegreeMembers=function(){var o=this,f={};this.memberGroups={},this.idToDummyNode={};for(var u=[],E=this.graphManager.getAllNodes(),D=0;D"u"&&(f[I]=[]),f[I]=f[I].concat(O)}Object.keys(f).forEach(function(w){if(f[w].length>1){var F="DummyCompound_"+w;o.memberGroups[F]=f[w];var Y=f[w][0].getParent(),x=new a(o.graphManager);x.id=F,x.paddingLeft=Y.paddingLeft||0,x.paddingRight=Y.paddingRight||0,x.paddingBottom=Y.paddingBottom||0,x.paddingTop=Y.paddingTop||0,o.idToDummyNode[F]=x;var M=o.getGraphManager().add(o.newGraph(),x),G=Y.getChild();G.add(x);for(var S=0;S=0;o--){var f=this.compoundOrder[o],u=f.id,E=f.paddingLeft,D=f.paddingTop;this.adjustLocations(this.tiledMemberPack[u],f.rect.x,f.rect.y,E,D)}},T.prototype.repopulateZeroDegreeMembers=function(){var o=this,f=this.tiledZeroDegreePack;Object.keys(f).forEach(function(u){var E=o.idToDummyNode[u],D=E.paddingLeft,O=E.paddingTop;o.adjustLocations(f[u],E.rect.x,E.rect.y,D,O)})},T.prototype.getToBeTiled=function(o){var f=o.id;if(this.toBeTiled[f]!=null)return this.toBeTiled[f];var u=o.getChild();if(u==null)return this.toBeTiled[f]=!1,!1;for(var E=u.getNodes(),D=0;D0)return this.toBeTiled[f]=!1,!1;if(O.getChild()==null){this.toBeTiled[O.id]=!1;continue}if(!this.getToBeTiled(O))return this.toBeTiled[f]=!1,!1}return this.toBeTiled[f]=!0,!0},T.prototype.getNodeDegree=function(o){for(var f=o.id,u=o.getEdges(),E=0,D=0;Dw&&(w=Y.rect.height)}u+=w+o.verticalPadding}},T.prototype.tileCompoundMembers=function(o,f){var u=this;this.tiledMemberPack=[],Object.keys(o).forEach(function(E){var D=f[E];u.tiledMemberPack[E]=u.tileNodes(o[E],D.paddingLeft+D.paddingRight),D.rect.width=u.tiledMemberPack[E].width,D.rect.height=u.tiledMemberPack[E].height})},T.prototype.tileNodes=function(o,f){var u=s.TILING_PADDING_VERTICAL,E=s.TILING_PADDING_HORIZONTAL,D={rows:[],rowWidth:[],rowHeight:[],width:0,height:f,verticalPadding:u,horizontalPadding:E};o.sort(function(I,w){return I.rect.width*I.rect.height>w.rect.width*w.rect.height?-1:I.rect.width*I.rect.height0&&(m+=o.horizontalPadding),o.rowWidth[u]=m,o.width0&&(I+=o.verticalPadding);var w=0;I>o.rowHeight[u]&&(w=o.rowHeight[u],o.rowHeight[u]=I,w=o.rowHeight[u]-w),o.height+=w,o.rows[u].push(f)},T.prototype.getShortestRowIndex=function(o){for(var f=-1,u=Number.MAX_VALUE,E=0;Eu&&(f=E,u=o.rowWidth[E]);return f},T.prototype.canAddHorizontal=function(o,f,u){var E=this.getShortestRowIndex(o);if(E<0)return!0;var D=o.rowWidth[E];if(D+o.horizontalPadding+f<=o.width)return!0;var O=0;o.rowHeight[E]0&&(O=u+o.verticalPadding-o.rowHeight[E]);var m;o.width-D>=f+o.horizontalPadding?m=(o.height+O)/(D+f+o.horizontalPadding):m=(o.height+O)/o.width,O=u+o.verticalPadding;var I;return o.widthO&&f!=u){E.splice(-1,1),o.rows[u].push(D),o.rowWidth[f]=o.rowWidth[f]-O,o.rowWidth[u]=o.rowWidth[u]+O,o.width=o.rowWidth[instance.getLongestRowIndex(o)];for(var m=Number.MIN_VALUE,I=0;Im&&(m=E[I].height);f>0&&(m+=o.verticalPadding);var w=o.rowHeight[f]+o.rowHeight[u];o.rowHeight[f]=m,o.rowHeight[u]0)for(var G=D;G<=O;G++)M[0]+=this.grid[G][m-1].length+this.grid[G][m].length-1;if(O0)for(var G=m;G<=I;G++)M[3]+=this.grid[D-1][G].length+this.grid[D][G].length-1;for(var S=v.MAX_VALUE,P,_,U=0;U{"use strict";(function(R,y){typeof j=="object"&&typeof it=="object"?it.exports=y(rt()):typeof define=="function"&&define.amd?define(["cose-base"],y):typeof j=="object"?j.cytoscapeCoseBilkent=y(rt()):R.cytoscapeCoseBilkent=y(R.coseBase)})(j,function(N){return(function(R){var y={};function n(e){if(y[e])return y[e].exports;var t=y[e]={i:e,l:!1,exports:{}};return R[e].call(t.exports,t,t.exports,n),t.l=!0,t.exports}return n.m=R,n.c=y,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)})([(function(R,y){R.exports=N}),(function(R,y,n){"use strict";var e=n(0).layoutBase.LayoutConstants,t=n(0).layoutBase.FDLayoutConstants,r=n(0).CoSEConstants,a=n(0).CoSELayout,g=n(0).CoSENode,s=n(0).layoutBase.PointD,d=n(0).layoutBase.DimensionD,i={ready:function(){},stop:function(){},quality:"default",nodeDimensionsIncludeLabels:!1,refresh:30,fit:!0,padding:10,randomize:!0,nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:"end",animationDuration:500,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.5};function h(L,c){var A={};for(var T in L)A[T]=L[T];for(var T in c)A[T]=c[T];return A}function l(L){this.options=h(i,L),p(this.options)}var p=function(c){c.nodeRepulsion!=null&&(r.DEFAULT_REPULSION_STRENGTH=t.DEFAULT_REPULSION_STRENGTH=c.nodeRepulsion),c.idealEdgeLength!=null&&(r.DEFAULT_EDGE_LENGTH=t.DEFAULT_EDGE_LENGTH=c.idealEdgeLength),c.edgeElasticity!=null&&(r.DEFAULT_SPRING_STRENGTH=t.DEFAULT_SPRING_STRENGTH=c.edgeElasticity),c.nestingFactor!=null&&(r.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=t.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=c.nestingFactor),c.gravity!=null&&(r.DEFAULT_GRAVITY_STRENGTH=t.DEFAULT_GRAVITY_STRENGTH=c.gravity),c.numIter!=null&&(r.MAX_ITERATIONS=t.MAX_ITERATIONS=c.numIter),c.gravityRange!=null&&(r.DEFAULT_GRAVITY_RANGE_FACTOR=t.DEFAULT_GRAVITY_RANGE_FACTOR=c.gravityRange),c.gravityCompound!=null&&(r.DEFAULT_COMPOUND_GRAVITY_STRENGTH=t.DEFAULT_COMPOUND_GRAVITY_STRENGTH=c.gravityCompound),c.gravityRangeCompound!=null&&(r.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=t.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=c.gravityRangeCompound),c.initialEnergyOnIncremental!=null&&(r.DEFAULT_COOLING_FACTOR_INCREMENTAL=t.DEFAULT_COOLING_FACTOR_INCREMENTAL=c.initialEnergyOnIncremental),c.quality=="draft"?e.QUALITY=0:c.quality=="proof"?e.QUALITY=2:e.QUALITY=1,r.NODE_DIMENSIONS_INCLUDE_LABELS=t.NODE_DIMENSIONS_INCLUDE_LABELS=e.NODE_DIMENSIONS_INCLUDE_LABELS=c.nodeDimensionsIncludeLabels,r.DEFAULT_INCREMENTAL=t.DEFAULT_INCREMENTAL=e.DEFAULT_INCREMENTAL=!c.randomize,r.ANIMATE=t.ANIMATE=e.ANIMATE=c.animate,r.TILE=c.tile,r.TILING_PADDING_VERTICAL=typeof c.tilingPaddingVertical=="function"?c.tilingPaddingVertical.call():c.tilingPaddingVertical,r.TILING_PADDING_HORIZONTAL=typeof c.tilingPaddingHorizontal=="function"?c.tilingPaddingHorizontal.call():c.tilingPaddingHorizontal};l.prototype.run=function(){var L,c,A=this.options,T=this.idToLNode={},C=this.layout=new a,o=this;o.stopped=!1,this.cy=this.options.cy,this.cy.trigger({type:"layoutstart",layout:this});var f=C.newGraphManager();this.gm=f;var u=this.options.eles.nodes(),E=this.options.eles.edges();this.root=f.addRoot(),this.processChildrenList(this.root,this.getTopMostNodes(u),C);for(var D=0;D0){var I;I=A.getGraphManager().add(A.newGraph(),u),this.processChildrenList(I,f,A)}}},l.prototype.stop=function(){return this.stopped=!0,this};var v=function(c){c("layout","cose-bilkent",l)};typeof cytoscape<"u"&&v(cytoscape),R.exports=v})])})});var ht=yt(at(),1);z.use(ht.default);function lt(N,R){N.forEach(y=>{let n={id:y.id,labelText:y.label,height:y.height,width:y.width,padding:y.padding??0};Object.keys(y).forEach(e=>{["id","label","height","width","padding","x","y"].includes(e)||(n[e]=y[e])}),R.add({group:"nodes",data:n,position:{x:y.x??0,y:y.y??0}})})}W(lt,"addNodes");function ut(N,R){N.forEach(y=>{let n={id:y.id,source:y.start,target:y.end};Object.keys(y).forEach(e=>{["id","start","end"].includes(e)||(n[e]=y[e])}),R.add({group:"edges",data:n})})}W(ut,"addEdges");function gt(N){return new Promise(R=>{let y=ot("body").append("div").attr("id","cy").attr("style","display:none"),n=z({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});y.remove(),lt(N.nodes,n),ut(N.edges,n),n.nodes().forEach(function(t){t.layoutDimensions=()=>{let r=t.data();return{w:r.width,h:r.height}}});let e={name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1};n.layout(e).run(),n.ready(t=>{Z.info("Cytoscape ready",t),R(n)})})}W(gt,"createCytoscapeInstance");function ft(N){return N.nodes().map(R=>{let y=R.data(),n=R.position(),e={id:y.id,x:n.x,y:n.y};return Object.keys(y).forEach(t=>{t!=="id"&&(e[t]=y[t])}),e})}W(ft,"extractPositionedNodes");function ct(N){return N.edges().map(R=>{let y=R.data(),n=R._private.rscratch,e={id:y.id,source:y.source,target:y.target,startX:n.startX,startY:n.startY,midX:n.midX,midY:n.midY,endX:n.endX,endY:n.endY};return Object.keys(y).forEach(t=>{["id","source","target"].includes(t)||(e[t]=y[t])}),e})}W(ct,"extractPositionedEdges");function pt(N,R){return k(this,null,function*(){Z.debug("Starting cose-bilkent layout algorithm");try{dt(N);let y=yield gt(N),n=ft(y),e=ct(y);return Z.debug(`Layout completed: ${n.length} nodes, ${e.length} edges`),{nodes:n,edges:e}}catch(y){throw Z.error("Error in cose-bilkent layout algorithm:",y),y}})}W(pt,"executeCoseBilkentLayout");function dt(N){if(!N)throw new Error("Layout data is required");if(!N.config)throw new Error("Configuration is required in layout data");if(!N.rootNode)throw new Error("Root node is required");if(!N.nodes||!Array.isArray(N.nodes))throw new Error("No nodes found in layout data");if(!Array.isArray(N.edges))throw new Error("Edges array is required in layout data");return!0}W(dt,"validateLayoutData");var Et=W((d,i,h,l)=>k(null,[d,i,h,l],function*(N,R,{insertCluster:y,insertEdge:n,insertEdgeLabel:e,insertMarkers:t,insertNode:r,log:a,positionEdgeLabel:g},{algorithm:s}){let p={},v={},L=R.select("g");t(L,N.markers,N.type,N.diagramId);let c=L.insert("g").attr("class","subgraphs"),A=L.insert("g").attr("class","edgePaths"),T=L.insert("g").attr("class","edgeLabels"),C=L.insert("g").attr("class","nodes");a.debug("Inserting nodes into DOM for dimension calculation"),yield Promise.all(N.nodes.map(u=>k(null,null,function*(){if(u.isGroup){let E=B({},u);v[u.id]=E,p[u.id]=E,yield y(c,u)}else{let E=B({},u);p[u.id]=E;let D=yield r(C,u,{config:N.config,dir:N.direction||"TB"}),O=D.node().getBBox();E.width=O.width,E.height=O.height,E.domId=D,a.debug(`Node ${u.id} dimensions: ${O.width}x${O.height}`)}}))),a.debug("Running cose-bilkent layout algorithm");let o=K(B({},N),{nodes:N.nodes.map(u=>{let E=p[u.id];return K(B({},u),{width:E.width,height:E.height})})}),f=yield pt(o,N.config);a.debug("Positioning nodes based on layout results"),f.nodes.forEach(u=>{let E=p[u.id];E?.domId&&(E.domId.attr("transform",`translate(${u.x}, ${u.y})`),E.x=u.x,E.y=u.y,a.debug(`Positioned node ${E.id} at center (${u.x}, ${u.y})`))}),f.edges.forEach(u=>{let E=N.edges.find(D=>D.id===u.id);E&&(E.points=[{x:u.startX,y:u.startY},{x:u.midX,y:u.midY},{x:u.endX,y:u.endY}])}),a.debug("Inserting and positioning edges"),yield Promise.all(N.edges.map(u=>k(null,null,function*(){let E=yield e(T,u),D=p[u.start??""],O=p[u.end??""];if(D&&O){let m=f.edges.find(I=>I.id===u.id);if(m){a.debug("APA01 positionedEdge",m);let I=B({},u),w=n(A,I,v,N.type,D,O,N.diagramId);g(I,w)}else{let I=K(B({},u),{points:[{x:D.x||0,y:D.y||0},{x:O.x||0,y:O.y||0}]}),w=n(A,I,v,N.type,D,O,N.diagramId);g(I,w)}}}))),a.debug("Cose-bilkent rendering completed")}),"render"),At=Et;export{At as render}; diff --git a/src/google/adk/cli/browser/chunk-HDC4PFPG.js b/src/google/adk/cli/browser/chunk-HDC4PFPG.js new file mode 100644 index 0000000000..072b0cc4ff --- /dev/null +++ b/src/google/adk/cli/browser/chunk-HDC4PFPG.js @@ -0,0 +1 @@ +import{a as e,b as r}from"./chunk-WR6HISGZ.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{e as PieModule,r as createPieServices}; diff --git a/src/google/adk/cli/browser/chunk-GLGRLUIJ.js b/src/google/adk/cli/browser/chunk-HTWWQBR6.js similarity index 99% rename from src/google/adk/cli/browser/chunk-GLGRLUIJ.js rename to src/google/adk/cli/browser/chunk-HTWWQBR6.js index e61575bf49..3761e7ee90 100644 --- a/src/google/adk/cli/browser/chunk-GLGRLUIJ.js +++ b/src/google/adk/cli/browser/chunk-HTWWQBR6.js @@ -1,2 +1,2 @@ -import"./chunk-W7GRJBO5.js";var O=function(l,i){if(!(l instanceof i))throw new TypeError("Cannot call a class as a function")},R=(function(){function l(i,e){for(var t=0;t1&&arguments[1]!==void 0?arguments[1]:1,e=i>0?l.toFixed(i).replace(/0+$/,"").replace(/\.$/,""):l.toString();return e||"0"}var z=(function(){function l(i,e,t,r){O(this,l);var n=this;function o(a){if(a.startsWith("hsl")){var s=a.match(/([\-\d\.e]+)/g).map(Number),p=y(s,4),u=p[0],f=p[1],d=p[2],b=p[3];b===void 0&&(b=1),u/=360,f/=100,d/=100,n.hsla=[u,f,d,b]}else if(a.startsWith("rgb")){var m=a.match(/([\-\d\.e]+)/g).map(Number),h=y(m,4),v=h[0],g=h[1],S=h[2],k=h[3];k===void 0&&(k=1),n.rgba=[v,g,S,k]}else a.startsWith("#")?n.rgba=l.hexToRgb(a):n.rgba=l.nameToRgb(a)||l.hexToRgb(a)}if(i!==void 0)if(Array.isArray(i))this.rgba=i;else if(t===void 0){var c=i&&""+i;c&&o(c.toLowerCase())}else this.rgba=[i,e,t,r===void 0?1:r]}return R(l,[{key:"printRGB",value:function(e){var t=e?this.rgba:this.rgba.slice(0,3),r=t.map(function(n,o){return A(n,o===3?3:0)});return e?"rgba("+r+")":"rgb("+r+")"}},{key:"printHSL",value:function(e){var t=[360,100,100,1],r=["","%","%",""],n=e?this.hsla:this.hsla.slice(0,3),o=n.map(function(c,a){return A(c*t[a],a===3?3:1)+r[a]});return e?"hsla("+o+")":"hsl("+o+")"}},{key:"printHex",value:function(e){var t=this.hex;return e?t:t.substring(0,7)}},{key:"rgba",get:function(){if(this._rgba)return this._rgba;if(!this._hsla)throw new Error("No color is set");return this._rgba=l.hslToRgb(this._hsla)},set:function(e){e.length===3&&(e[3]=1),this._rgba=e,this._hsla=null}},{key:"rgbString",get:function(){return this.printRGB()}},{key:"rgbaString",get:function(){return this.printRGB(!0)}},{key:"hsla",get:function(){if(this._hsla)return this._hsla;if(!this._rgba)throw new Error("No color is set");return this._hsla=l.rgbToHsl(this._rgba)},set:function(e){e.length===3&&(e[3]=1),this._hsla=e,this._rgba=null}},{key:"hslString",get:function(){return this.printHSL()}},{key:"hslaString",get:function(){return this.printHSL(!0)}},{key:"hex",get:function(){var e=this.rgba,t=e.map(function(r,n){return n<3?r.toString(16):Math.round(r*255).toString(16)});return"#"+t.map(function(r){return r.padStart(2,"0")}).join("")},set:function(e){this.rgba=l.hexToRgb(e)}}],[{key:"hexToRgb",value:function(e){var t=(e.startsWith("#")?e.slice(1):e).replace(/^(\w{3})$/,"$1F").replace(/^(\w)(\w)(\w)(\w)$/,"$1$1$2$2$3$3$4$4").replace(/^(\w{6})$/,"$1FF");if(!t.match(/^([0-9a-fA-F]{8})$/))throw new Error("Unknown hex color; "+e);var r=t.match(/^(\w\w)(\w\w)(\w\w)(\w\w)$/).slice(1).map(function(n){return parseInt(n,16)});return r[3]=r[3]/255,r}},{key:"nameToRgb",value:function(e){var t=e.toLowerCase().replace("at","T").replace(/[aeiouyldf]/g,"").replace("ght","L").replace("rk","D").slice(-5,4),r=N[t];return r===void 0?r:l.hexToRgb(r.replace(/\-/g,"00").padStart(6,"f"))}},{key:"rgbToHsl",value:function(e){var t=y(e,4),r=t[0],n=t[1],o=t[2],c=t[3];r/=255,n/=255,o/=255;var a=Math.max(r,n,o),s=Math.min(r,n,o),p=void 0,u=void 0,f=(a+s)/2;if(a===s)p=u=0;else{var d=a-s;switch(u=f>.5?d/(2-a-s):d/(a+s),a){case r:p=(n-o)/d+(n1&&(g-=1),g<.16666666666666666?h+(v-h)*6*g:g<.5?v:g<.6666666666666666?h+(v-h)*(.6666666666666666-g)*6:h},f=o<.5?o*(1+n):o+n-o*n,d=2*o-f;a=u(d,f,r+1/3),s=u(d,f,r),p=u(d,f,r-1/3)}var b=[a*255,s*255,p*255].map(Math.round);return b[3]=c,b}}]),l})(),F=(function(){function l(){O(this,l),this._events=[]}return R(l,[{key:"add",value:function(e,t,r){e.addEventListener(t,r,!1),this._events.push({target:e,type:t,handler:r})}},{key:"remove",value:function(e,t,r){this._events=this._events.filter(function(n){var o=!0;return e&&e!==n.target&&(o=!1),t&&t!==n.type&&(o=!1),r&&r!==n.handler&&(o=!1),o&&l._doRemove(n.target,n.type,n.handler),!o})}},{key:"destroy",value:function(){this._events.forEach(function(e){return l._doRemove(e.target,e.type,e.handler)}),this._events=[]}}],[{key:"_doRemove",value:function(e,t,r){e.removeEventListener(t,r,!1)}}]),l})();function U(l){var i=document.createElement("div");return i.innerHTML=l,i.firstElementChild}function T(l,i,e){var t=!1;function r(a,s,p){return Math.max(s,Math.min(a,p))}function n(a,s,p){if(p&&(t=!0),!!t){a.preventDefault();var u=i.getBoundingClientRect(),f=u.width,d=u.height,b=s.clientX,m=s.clientY,h=r(b-u.left,0,f),v=r(m-u.top,0,d);e(h/f,v/d)}}function o(a,s){var p=a.buttons===void 0?a.which:a.buttons;p===1?n(a,a,s):t=!1}function c(a,s){a.touches.length===1?n(a,a.touches[0],s):t=!1}l.add(i,"mousedown",function(a){o(a,!0)}),l.add(i,"touchstart",function(a){c(a,!0)}),l.add(window,"mousemove",o),l.add(i,"touchmove",c),l.add(window,"mouseup",function(a){t=!1}),l.add(i,"touchend",function(a){t=!1}),l.add(i,"touchcancel",function(a){t=!1})}var B=`linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0 / 2em 2em, +import"./chunk-RMXJBC7V.js";var O=function(l,i){if(!(l instanceof i))throw new TypeError("Cannot call a class as a function")},R=(function(){function l(i,e){for(var t=0;t1&&arguments[1]!==void 0?arguments[1]:1,e=i>0?l.toFixed(i).replace(/0+$/,"").replace(/\.$/,""):l.toString();return e||"0"}var z=(function(){function l(i,e,t,r){O(this,l);var n=this;function o(a){if(a.startsWith("hsl")){var s=a.match(/([\-\d\.e]+)/g).map(Number),p=y(s,4),u=p[0],f=p[1],d=p[2],b=p[3];b===void 0&&(b=1),u/=360,f/=100,d/=100,n.hsla=[u,f,d,b]}else if(a.startsWith("rgb")){var m=a.match(/([\-\d\.e]+)/g).map(Number),h=y(m,4),v=h[0],g=h[1],S=h[2],k=h[3];k===void 0&&(k=1),n.rgba=[v,g,S,k]}else a.startsWith("#")?n.rgba=l.hexToRgb(a):n.rgba=l.nameToRgb(a)||l.hexToRgb(a)}if(i!==void 0)if(Array.isArray(i))this.rgba=i;else if(t===void 0){var c=i&&""+i;c&&o(c.toLowerCase())}else this.rgba=[i,e,t,r===void 0?1:r]}return R(l,[{key:"printRGB",value:function(e){var t=e?this.rgba:this.rgba.slice(0,3),r=t.map(function(n,o){return A(n,o===3?3:0)});return e?"rgba("+r+")":"rgb("+r+")"}},{key:"printHSL",value:function(e){var t=[360,100,100,1],r=["","%","%",""],n=e?this.hsla:this.hsla.slice(0,3),o=n.map(function(c,a){return A(c*t[a],a===3?3:1)+r[a]});return e?"hsla("+o+")":"hsl("+o+")"}},{key:"printHex",value:function(e){var t=this.hex;return e?t:t.substring(0,7)}},{key:"rgba",get:function(){if(this._rgba)return this._rgba;if(!this._hsla)throw new Error("No color is set");return this._rgba=l.hslToRgb(this._hsla)},set:function(e){e.length===3&&(e[3]=1),this._rgba=e,this._hsla=null}},{key:"rgbString",get:function(){return this.printRGB()}},{key:"rgbaString",get:function(){return this.printRGB(!0)}},{key:"hsla",get:function(){if(this._hsla)return this._hsla;if(!this._rgba)throw new Error("No color is set");return this._hsla=l.rgbToHsl(this._rgba)},set:function(e){e.length===3&&(e[3]=1),this._hsla=e,this._rgba=null}},{key:"hslString",get:function(){return this.printHSL()}},{key:"hslaString",get:function(){return this.printHSL(!0)}},{key:"hex",get:function(){var e=this.rgba,t=e.map(function(r,n){return n<3?r.toString(16):Math.round(r*255).toString(16)});return"#"+t.map(function(r){return r.padStart(2,"0")}).join("")},set:function(e){this.rgba=l.hexToRgb(e)}}],[{key:"hexToRgb",value:function(e){var t=(e.startsWith("#")?e.slice(1):e).replace(/^(\w{3})$/,"$1F").replace(/^(\w)(\w)(\w)(\w)$/,"$1$1$2$2$3$3$4$4").replace(/^(\w{6})$/,"$1FF");if(!t.match(/^([0-9a-fA-F]{8})$/))throw new Error("Unknown hex color; "+e);var r=t.match(/^(\w\w)(\w\w)(\w\w)(\w\w)$/).slice(1).map(function(n){return parseInt(n,16)});return r[3]=r[3]/255,r}},{key:"nameToRgb",value:function(e){var t=e.toLowerCase().replace("at","T").replace(/[aeiouyldf]/g,"").replace("ght","L").replace("rk","D").slice(-5,4),r=N[t];return r===void 0?r:l.hexToRgb(r.replace(/\-/g,"00").padStart(6,"f"))}},{key:"rgbToHsl",value:function(e){var t=y(e,4),r=t[0],n=t[1],o=t[2],c=t[3];r/=255,n/=255,o/=255;var a=Math.max(r,n,o),s=Math.min(r,n,o),p=void 0,u=void 0,f=(a+s)/2;if(a===s)p=u=0;else{var d=a-s;switch(u=f>.5?d/(2-a-s):d/(a+s),a){case r:p=(n-o)/d+(n1&&(g-=1),g<.16666666666666666?h+(v-h)*6*g:g<.5?v:g<.6666666666666666?h+(v-h)*(.6666666666666666-g)*6:h},f=o<.5?o*(1+n):o+n-o*n,d=2*o-f;a=u(d,f,r+1/3),s=u(d,f,r),p=u(d,f,r-1/3)}var b=[a*255,s*255,p*255].map(Math.round);return b[3]=c,b}}]),l})(),F=(function(){function l(){O(this,l),this._events=[]}return R(l,[{key:"add",value:function(e,t,r){e.addEventListener(t,r,!1),this._events.push({target:e,type:t,handler:r})}},{key:"remove",value:function(e,t,r){this._events=this._events.filter(function(n){var o=!0;return e&&e!==n.target&&(o=!1),t&&t!==n.type&&(o=!1),r&&r!==n.handler&&(o=!1),o&&l._doRemove(n.target,n.type,n.handler),!o})}},{key:"destroy",value:function(){this._events.forEach(function(e){return l._doRemove(e.target,e.type,e.handler)}),this._events=[]}}],[{key:"_doRemove",value:function(e,t,r){e.removeEventListener(t,r,!1)}}]),l})();function U(l){var i=document.createElement("div");return i.innerHTML=l,i.firstElementChild}function T(l,i,e){var t=!1;function r(a,s,p){return Math.max(s,Math.min(a,p))}function n(a,s,p){if(p&&(t=!0),!!t){a.preventDefault();var u=i.getBoundingClientRect(),f=u.width,d=u.height,b=s.clientX,m=s.clientY,h=r(b-u.left,0,f),v=r(m-u.top,0,d);e(h/f,v/d)}}function o(a,s){var p=a.buttons===void 0?a.which:a.buttons;p===1?n(a,a,s):t=!1}function c(a,s){a.touches.length===1?n(a,a.touches[0],s):t=!1}l.add(i,"mousedown",function(a){o(a,!0)}),l.add(i,"touchstart",function(a){c(a,!0)}),l.add(window,"mousemove",o),l.add(i,"touchmove",c),l.add(window,"mouseup",function(a){t=!1}),l.add(i,"touchend",function(a){t=!1}),l.add(i,"touchcancel",function(a){t=!1})}var B=`linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0 / 2em 2em, linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em / 2em 2em`,G=360,P="keydown",x="mousedown",H="focusin";function _(l,i){return(i||document).querySelector(l)}function M(l){l.preventDefault(),l.stopPropagation()}function D(l,i,e,t,r){l.add(i,P,function(n){e.indexOf(n.key)>=0&&(r&&M(n),t(n))})}var W=(function(){function l(i){O(this,l),this.settings={popup:"right",layout:"default",alpha:!0,editor:!0,editorFormat:"hex",cancelButton:!1,defaultColor:"#0cf"},this._events=new F,this.onChange=null,this.onDone=null,this.onOpen=null,this.onClose=null,this.setOptions(i)}return R(l,[{key:"setOptions",value:function(e){var t=this;if(!e)return;var r=this.settings;function n(s,p,u){for(var f in s)u&&u.indexOf(f)>=0||(p[f]=s[f])}if(e instanceof HTMLElement)r.parent=e;else{r.parent&&e.parent&&r.parent!==e.parent&&(this._events.remove(r.parent),this._popupInited=!1),n(e,r),e.onChange&&(this.onChange=e.onChange),e.onDone&&(this.onDone=e.onDone),e.onOpen&&(this.onOpen=e.onOpen),e.onClose&&(this.onClose=e.onClose);var o=e.color||e.colour;o&&this._setColor(o)}var c=r.parent;if(c&&r.popup&&!this._popupInited){var a=function(p){return t.openHandler(p)};this._events.add(c,"click",a),D(this._events,c,[" ","Spacebar","Enter"],a),this._popupInited=!0}else e.parent&&!r.popup&&this.show()}},{key:"openHandler",value:function(e){if(this.show()){e&&e.preventDefault(),this.settings.parent.style.pointerEvents="none";var t=e&&e.type===P?this._domEdit:this.domElement;setTimeout(function(){return t.focus()},100),this.onOpen&&this.onOpen(this.colour)}}},{key:"closeHandler",value:function(e){var t=e&&e.type,r=!1;if(!e)r=!0;else if(t===x||t===H){var n=(this.__containedEvent||0)+100;e.timeStamp>n&&(r=!0)}else M(e),r=!0;r&&this.hide()&&(this.settings.parent.style.pointerEvents="",t!==x&&this.settings.parent.focus(),this.onClose&&this.onClose(this.colour))}},{key:"movePopup",value:function(e,t){this.closeHandler(),this.setOptions(e),t&&this.openHandler()}},{key:"setColor",value:function(e,t){this._setColor(e,{silent:t})}},{key:"_setColor",value:function(e,t){if(typeof e=="string"&&(e=e.trim()),!!e){t=t||{};var r=void 0;try{r=new z(e)}catch(o){if(t.failSilently)return;throw o}if(!this.settings.alpha){var n=r.hsla;n[3]=1,r.hsla=n}this.colour=this.color=r,this._setHSLA(null,null,null,null,t)}}},{key:"setColour",value:function(e,t){this.setColor(e,t)}},{key:"show",value:function(){var e=this.settings.parent;if(!e)return!1;if(this.domElement){var t=this._toggleDOM(!0);return this._setPosition(),t}var r=this.settings.template||'

        ',n=U(r);return this.domElement=n,this._domH=_(".picker_hue",n),this._domSL=_(".picker_sl",n),this._domA=_(".picker_alpha",n),this._domEdit=_(".picker_editor input",n),this._domSample=_(".picker_sample",n),this._domOkay=_(".picker_done button",n),this._domCancel=_(".picker_cancel button",n),n.classList.add("layout_"+this.settings.layout),this.settings.alpha||n.classList.add("no_alpha"),this.settings.editor||n.classList.add("no_editor"),this.settings.cancelButton||n.classList.add("no_cancel"),this._ifPopup(function(){return n.classList.add("popup")}),this._setPosition(),this.colour?this._updateUI():this._setColor(this.settings.defaultColor),this._bindEvents(),!0}},{key:"hide",value:function(){return this._toggleDOM(!1)}},{key:"destroy",value:function(){this._events.destroy(),this.domElement&&this.settings.parent.removeChild(this.domElement)}},{key:"_bindEvents",value:function(){var e=this,t=this,r=this.domElement,n=this._events;function o(s,p,u){n.add(s,p,u)}o(r,"click",function(s){return s.preventDefault()}),T(n,this._domH,function(s,p){return t._setHSLA(s)}),T(n,this._domSL,function(s,p){return t._setHSLA(null,s,1-p)}),this.settings.alpha&&T(n,this._domA,function(s,p){return t._setHSLA(null,null,null,1-p)});var c=this._domEdit;o(c,"input",function(s){t._setColor(this.value,{fromEditor:!0,failSilently:!0})}),o(c,"focus",function(s){var p=this;p.selectionStart===p.selectionEnd&&p.select()}),this._ifPopup(function(){var s=function(f){return e.closeHandler(f)};o(window,x,s),o(window,H,s),D(n,r,["Esc","Escape"],s);var p=function(f){e.__containedEvent=f.timeStamp};o(r,x,p),o(r,H,p),o(e._domCancel,"click",s)});var a=function(p){e._ifPopup(function(){return e.closeHandler(p)}),e.onDone&&e.onDone(e.colour)};o(this._domOkay,"click",a),D(n,r,["Enter"],a)}},{key:"_setPosition",value:function(){var e=this.settings.parent,t=this.domElement;e!==t.parentNode&&e.appendChild(t),this._ifPopup(function(r){getComputedStyle(e).position==="static"&&(e.style.position="relative");var n=r===!0?"popup_right":"popup_"+r;["popup_top","popup_bottom","popup_left","popup_right"].forEach(function(o){o===n?t.classList.add(o):t.classList.remove(o)}),t.classList.add(n)})}},{key:"_setHSLA",value:function(e,t,r,n,o){o=o||{};var c=this.colour,a=c.hsla;[e,t,r,n].forEach(function(s,p){(s||s===0)&&(a[p]=s)}),c.hsla=a,this._updateUI(o),this.onChange&&!o.silent&&this.onChange(c)}},{key:"_updateUI",value:function(e){if(!this.domElement)return;e=e||{};var t=this.colour,r=t.hsla,n="hsl("+r[0]*G+", 100%, 50%)",o=t.hslString,c=t.hslaString,a=this._domH,s=this._domSL,p=this._domA,u=_(".picker_selector",a),f=_(".picker_selector",s),d=_(".picker_selector",p);function b(I,C,L){C.style.left=L*100+"%"}function m(I,C,L){C.style.top=L*100+"%"}b(a,u,r[0]),this._domSL.style.backgroundColor=this._domH.style.color=n,b(s,f,r[1]),m(s,f,1-r[2]),s.style.color=o,m(p,d,1-r[3]);var h=o,v=h.replace("hsl","hsla").replace(")",", 0)"),g="linear-gradient("+[h,v]+")";if(this._domA.style.background=g+", "+B,!e.fromEditor){var S=this.settings.editorFormat,k=this.settings.alpha,w=void 0;switch(S){case"rgb":w=t.printRGB(k);break;case"hsl":w=t.printHSL(k);break;default:w=t.printHex(k)}this._domEdit.value=w}this._domSample.style.color=c}},{key:"_ifPopup",value:function(e,t){this.settings.parent&&this.settings.popup?e&&e(this.settings.popup):t&&t()}},{key:"_toggleDOM",value:function(e){var t=this.domElement;if(!t)return!1;var r=e?"":"none",n=t.style.display!==r;return n&&(t.style.display=r),n}}]),l})();E=document.createElement("style"),E.textContent='.picker_wrapper.no_alpha .picker_alpha{display:none}.picker_wrapper.no_editor .picker_editor{position:absolute;z-index:-1;opacity:0}.picker_wrapper.no_cancel .picker_cancel{display:none}.layout_default.picker_wrapper{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:stretch;font-size:10px;width:25em;padding:.5em}.layout_default.picker_wrapper input,.layout_default.picker_wrapper button{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper::before{content:"";display:block;width:100%;height:0;order:1}.layout_default .picker_slider,.layout_default .picker_selector{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{flex:1 1 auto}.layout_default .picker_sl::before{content:"";display:block;padding-bottom:100%}.layout_default .picker_editor{order:1;width:6.5rem}.layout_default .picker_editor input{width:100%;height:100%}.layout_default .picker_sample{order:1;flex:1 1 auto}.layout_default .picker_done,.layout_default .picker_cancel{order:1}.picker_wrapper{box-sizing:border-box;background:#f2f2f2;box-shadow:0 0 0 1px silver;cursor:default;font-family:sans-serif;color:#444;pointer-events:auto}.picker_wrapper:focus{outline:none}.picker_wrapper button,.picker_wrapper input{box-sizing:border-box;border:none;box-shadow:0 0 0 1px silver;outline:none}.picker_wrapper button:focus,.picker_wrapper button:active,.picker_wrapper input:focus,.picker_wrapper input:active{box-shadow:0 0 2px 1px #1e90ff}.picker_wrapper button{padding:.4em .6em;cursor:pointer;background-color:#f5f5f5;background-image:linear-gradient(0deg, gainsboro, transparent)}.picker_wrapper button:active{background-image:linear-gradient(0deg, transparent, gainsboro)}.picker_wrapper button:hover{background-color:#fff}.picker_selector{position:absolute;z-index:1;display:block;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);border:2px solid #fff;border-radius:100%;box-shadow:0 0 3px 1px #67b9ff;background:currentColor;cursor:pointer}.picker_slider .picker_selector{border-radius:2px}.picker_hue{position:relative;background-image:linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red);box-shadow:0 0 0 1px silver}.picker_sl{position:relative;box-shadow:0 0 0 1px silver;background-image:linear-gradient(180deg, white, rgba(255, 255, 255, 0) 50%),linear-gradient(0deg, black, rgba(0, 0, 0, 0) 50%),linear-gradient(90deg, #808080, rgba(128, 128, 128, 0))}.picker_alpha,.picker_sample{position:relative;background:linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0/2em 2em,linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em/2em 2em;box-shadow:0 0 0 1px silver}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{font-family:monospace;padding:.2em .4em}.picker_sample::before{content:"";position:absolute;display:block;width:100%;height:100%;background:currentColor}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{position:absolute;z-index:2;margin:1.5em}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{background:#f2f2f2;box-shadow:0 0 10px 1px rgba(0,0,0,.4)}.picker_wrapper.popup .picker_arrow{width:3em;height:3em;margin:0}.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{content:"";display:block;position:absolute;top:0;left:0;z-index:-99}.picker_wrapper.popup .picker_arrow::before{width:100%;height:100%;-webkit-transform:skew(45deg);transform:skew(45deg);-webkit-transform-origin:0 100%;transform-origin:0 100%}.picker_wrapper.popup .picker_arrow::after{width:150%;height:150%;box-shadow:none}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.popup.popup_bottom{top:100%;left:0}.popup.popup_bottom .picker_arrow{top:0;left:0;-webkit-transform:rotate(90deg) scale(1, -1);transform:rotate(90deg) scale(1, -1)}.popup.popup_left{top:0;right:100%}.popup.popup_left .picker_arrow{top:0;right:0;-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.popup.popup_right{top:0;left:100%}.popup.popup_right .picker_arrow{top:0;left:0}',document.documentElement.firstElementChild.appendChild(E),W.StyleElement=E;var E;export{W as default}; diff --git a/src/google/adk/cli/browser/chunk-I4UDKKN5.js b/src/google/adk/cli/browser/chunk-I4UDKKN5.js new file mode 100644 index 0000000000..0e6afd3cb4 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-I4UDKKN5.js @@ -0,0 +1 @@ +import{a as s,b as u,c as i,d as n,e as m,f as t,g as o,h as l,o as d,q as h}from"./chunk-NALL4A3P.js";var A=class extends h{static{t(this,"ArchitectureTokenBuilder")}constructor(){super(["architecture"])}},C=class extends d{static{t(this,"ArchitectureValueConverter")}runCustomConverter(c,r,a){if(c.name==="ARCH_ICON")return r.replace(/[()]/g,"").trim();if(c.name==="ARCH_TEXT_ICON")return r.replace(/["()]/g,"");if(c.name==="ARCH_TITLE"){let e=r.replace(/^\[|]$/g,"").trim();return(e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))&&(e=e.slice(1,-1),e=e.replace(/\\"/g,'"').replace(/\\'/g,"'")),e.trim()}}},v={parser:{TokenBuilder:t(()=>new A,"TokenBuilder"),ValueConverter:t(()=>new C,"ValueConverter")}};function f(c=n){let r=i(u(c),o),a=i(s({shared:r}),l,v);return r.ServiceRegistry.register(a),{shared:r,Architecture:a}}t(f,"createArchitectureServices");export{v as a,f as b}; diff --git a/src/google/adk/cli/browser/chunk-ICVZGLGO.js b/src/google/adk/cli/browser/chunk-ICVZGLGO.js new file mode 100644 index 0000000000..030253ee3b --- /dev/null +++ b/src/google/adk/cli/browser/chunk-ICVZGLGO.js @@ -0,0 +1,68 @@ +import{a as pe}from"./chunk-APNCZOFE.js";import{a as fe}from"./chunk-ST54LLJ3.js";import{b as ge,c as ue}from"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{D as de,G as w,Y as V,c as ce,d as le,e as he,r as R}from"./chunk-QFMJV7VH.js";import{g as c,i as T}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{j as ae}from"./chunk-RMXJBC7V.js";var y=[];for(let e=0;e<256;++e)y.push((e+256).toString(16).slice(1));function me(e,n=0){return(y[e[n+0]]+y[e[n+1]]+y[e[n+2]]+y[e[n+3]]+"-"+y[e[n+4]]+y[e[n+5]]+"-"+y[e[n+6]]+y[e[n+7]]+"-"+y[e[n+8]]+y[e[n+9]]+"-"+y[e[n+10]]+y[e[n+11]]+y[e[n+12]]+y[e[n+13]]+y[e[n+14]]+y[e[n+15]]).toLowerCase()}var X,Se=new Uint8Array(16);function z(){if(!X){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");X=crypto.getRandomValues.bind(crypto)}return X(Se)}var xe=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),W={randomUUID:xe};function De(e,n,i){if(W.randomUUID&&!n&&!e)return W.randomUUID();e=e||{};let l=e.random??e.rng?.()??z();if(l.length<16)throw new Error("Random bytes length must be >= 16");if(l[6]=l[6]&15|64,l[8]=l[8]&63|128,n){if(i=i||0,i<0||i+16>n.length)throw new RangeError(`UUID byte range ${i}:${i+15} is out of buffer bounds`);for(let g=0;g<16;++g)n[i+g]=l[g];return n}return me(l)}var Y=De;var q=(function(){var e=c(function(N,r,t,o){for(t=t||{},o=N.length;o--;t[N[o]]=r);return t},"o"),n=[1,4],i=[1,13],l=[1,12],g=[1,15],h=[1,16],f=[1,20],E=[1,19],p=[6,7,8],J=[1,26],K=[1,24],Q=[1,25],_=[6,7,11],Z=[1,6,13,15,16,19,22],ee=[1,33],te=[1,34],I=[1,6,7,11,13,15,16,19,22],B={trace:c(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:c(function(r,t,o,a,u,s,C){var d=s.length-1;switch(u){case 6:case 7:return a;case 8:a.getLogger().trace("Stop NL ");break;case 9:a.getLogger().trace("Stop EOF ");break;case 11:a.getLogger().trace("Stop NL2 ");break;case 12:a.getLogger().trace("Stop EOF2 ");break;case 15:a.getLogger().info("Node: ",s[d].id),a.addNode(s[d-1].length,s[d].id,s[d].descr,s[d].type);break;case 16:a.getLogger().trace("Icon: ",s[d]),a.decorateNode({icon:s[d]});break;case 17:case 21:a.decorateNode({class:s[d]});break;case 18:a.getLogger().trace("SPACELIST");break;case 19:a.getLogger().trace("Node: ",s[d].id),a.addNode(0,s[d].id,s[d].descr,s[d].type);break;case 20:a.decorateNode({icon:s[d]});break;case 25:a.getLogger().trace("node found ..",s[d-2]),this.$={id:s[d-1],descr:s[d-1],type:a.getType(s[d-2],s[d])};break;case 26:this.$={id:s[d],descr:s[d],type:a.nodeType.DEFAULT};break;case 27:a.getLogger().trace("node found ..",s[d-3]),this.$={id:s[d-3],descr:s[d-1],type:a.getType(s[d-2],s[d])};break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:n},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:n},{6:i,7:[1,10],9:9,12:11,13:l,14:14,15:g,16:h,17:17,18:18,19:f,22:E},e(p,[2,3]),{1:[2,2]},e(p,[2,4]),e(p,[2,5]),{1:[2,6],6:i,12:21,13:l,14:14,15:g,16:h,17:17,18:18,19:f,22:E},{6:i,9:22,12:11,13:l,14:14,15:g,16:h,17:17,18:18,19:f,22:E},{6:J,7:K,10:23,11:Q},e(_,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:f,22:E}),e(_,[2,18]),e(_,[2,19]),e(_,[2,20]),e(_,[2,21]),e(_,[2,23]),e(_,[2,24]),e(_,[2,26],{19:[1,30]}),{20:[1,31]},{6:J,7:K,10:32,11:Q},{1:[2,7],6:i,12:21,13:l,14:14,15:g,16:h,17:17,18:18,19:f,22:E},e(Z,[2,14],{7:ee,11:te}),e(I,[2,8]),e(I,[2,9]),e(I,[2,10]),e(_,[2,15]),e(_,[2,16]),e(_,[2,17]),{20:[1,35]},{21:[1,36]},e(Z,[2,13],{7:ee,11:te}),e(I,[2,11]),e(I,[2,12]),{21:[1,37]},e(_,[2,25]),e(_,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:c(function(r,t){if(t.recoverable)this.trace(r);else{var o=new Error(r);throw o.hash=t,o}},"parseError"),parse:c(function(r){var t=this,o=[0],a=[],u=[null],s=[],C=this.table,d="",U=0,ie=0,ne=0,be=2,se=1,Ee=s.slice.call(arguments,1),m=Object.create(this.lexer),v={yy:{}};for(var F in this.yy)Object.prototype.hasOwnProperty.call(this.yy,F)&&(v.yy[F]=this.yy[F]);m.setInput(r,v.yy),v.yy.lexer=m,v.yy.parser=this,typeof m.yylloc>"u"&&(m.yylloc={});var j=m.yylloc;s.push(j);var _e=m.options&&m.options.ranges;typeof v.yy.parseError=="function"?this.parseError=v.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ke(k){o.length=o.length-2*k,u.length=u.length-k,s.length=s.length-k}c(ke,"popStack");function re(){var k;return k=a.pop()||m.lex()||se,typeof k!="number"&&(k instanceof Array&&(a=k,k=a.pop()),k=t.symbols_[k]||k),k}c(re,"lex");for(var b,G,L,S,we,$,O={},P,x,oe,M;;){if(L=o[o.length-1],this.defaultActions[L]?S=this.defaultActions[L]:((b===null||typeof b>"u")&&(b=re()),S=C[L]&&C[L][b]),typeof S>"u"||!S.length||!S[0]){var H="";M=[];for(P in C[L])this.terminals_[P]&&P>be&&M.push("'"+this.terminals_[P]+"'");m.showPosition?H="Parse error on line "+(U+1)+`: +`+m.showPosition()+` +Expecting `+M.join(", ")+", got '"+(this.terminals_[b]||b)+"'":H="Parse error on line "+(U+1)+": Unexpected "+(b==se?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(H,{text:m.match,token:this.terminals_[b]||b,line:m.yylineno,loc:j,expected:M})}if(S[0]instanceof Array&&S.length>1)throw new Error("Parse Error: multiple actions possible at state: "+L+", token: "+b);switch(S[0]){case 1:o.push(b),u.push(m.yytext),s.push(m.yylloc),o.push(S[1]),b=null,G?(b=G,G=null):(ie=m.yyleng,d=m.yytext,U=m.yylineno,j=m.yylloc,ne>0&&ne--);break;case 2:if(x=this.productions_[S[1]][1],O.$=u[u.length-x],O._$={first_line:s[s.length-(x||1)].first_line,last_line:s[s.length-1].last_line,first_column:s[s.length-(x||1)].first_column,last_column:s[s.length-1].last_column},_e&&(O._$.range=[s[s.length-(x||1)].range[0],s[s.length-1].range[1]]),$=this.performAction.apply(O,[d,ie,U,v.yy,S[1],u,s].concat(Ee)),typeof $<"u")return $;x&&(o=o.slice(0,-1*x*2),u=u.slice(0,-1*x),s=s.slice(0,-1*x)),o.push(this.productions_[S[1]][0]),u.push(O.$),s.push(O._$),oe=C[o[o.length-2]][o[o.length-1]],o.push(oe);break;case 3:return!0}}return!0},"parse")},ye=(function(){var N={EOF:1,parseError:c(function(t,o){if(this.yy.parser)this.yy.parser.parseError(t,o);else throw new Error(t)},"parseError"),setInput:c(function(r,t){return this.yy=t||this.yy||{},this._input=r,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:c(function(){var r=this._input[0];this.yytext+=r,this.yyleng++,this.offset++,this.match+=r,this.matched+=r;var t=r.match(/(?:\r\n?|\n).*/g);return t?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),r},"input"),unput:c(function(r){var t=r.length,o=r.split(/(?:\r\n?|\n)/g);this._input=r+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t),this.offset-=t;var a=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),o.length-1&&(this.yylineno-=o.length-1);var u=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:o?(o.length===a.length?this.yylloc.first_column:0)+a[a.length-o.length].length-o[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[u[0],u[0]+this.yyleng-t]),this.yyleng=this.yytext.length,this},"unput"),more:c(function(){return this._more=!0,this},"more"),reject:c(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:c(function(r){this.unput(this.match.slice(r))},"less"),pastInput:c(function(){var r=this.matched.substr(0,this.matched.length-this.match.length);return(r.length>20?"...":"")+r.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:c(function(){var r=this.match;return r.length<20&&(r+=this._input.substr(0,20-r.length)),(r.substr(0,20)+(r.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:c(function(){var r=this.pastInput(),t=new Array(r.length+1).join("-");return r+this.upcomingInput()+` +`+t+"^"},"showPosition"),test_match:c(function(r,t){var o,a,u;if(this.options.backtrack_lexer&&(u={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(u.yylloc.range=this.yylloc.range.slice(0))),a=r[0].match(/(?:\r\n?|\n).*/g),a&&(this.yylineno+=a.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:a?a[a.length-1].length-a[a.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+r[0].length},this.yytext+=r[0],this.match+=r[0],this.matches=r,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(r[0].length),this.matched+=r[0],o=this.performAction.call(this,this.yy,this,t,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),o)return o;if(this._backtrack){for(var s in u)this[s]=u[s];return!1}return!1},"test_match"),next:c(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var r,t,o,a;this._more||(this.yytext="",this.match="");for(var u=this._currentRules(),s=0;st[0].length)){if(t=o,a=s,this.options.backtrack_lexer){if(r=this.test_match(o,u[s]),r!==!1)return r;if(this._backtrack){t=!1;continue}else return!1}else if(!this.options.flex)break}return t?(r=this.test_match(t,u[a]),r!==!1?r:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:c(function(){var t=this.next();return t||this.lex()},"lex"),begin:c(function(t){this.conditionStack.push(t)},"begin"),popState:c(function(){var t=this.conditionStack.length-1;return t>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:c(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:c(function(t){return t=this.conditionStack.length-1-Math.abs(t||0),t>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:c(function(t){this.begin(t)},"pushState"),stateStackSize:c(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:c(function(t,o,a,u){var s=u;switch(a){case 0:return t.getLogger().trace("Found comment",o.yytext),6;break;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;break;case 4:this.popState();break;case 5:t.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return t.getLogger().trace("SPACELINE"),6;break;case 7:return 7;case 8:return 15;case 9:t.getLogger().trace("end icon"),this.popState();break;case 10:return t.getLogger().trace("Exploding node"),this.begin("NODE"),19;break;case 11:return t.getLogger().trace("Cloud"),this.begin("NODE"),19;break;case 12:return t.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;break;case 13:return t.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;break;case 14:return this.begin("NODE"),19;break;case 15:return this.begin("NODE"),19;break;case 16:return this.begin("NODE"),19;break;case 17:return this.begin("NODE"),19;break;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 23:this.popState();break;case 24:t.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return t.getLogger().trace("description:",o.yytext),"NODE_DESCR";break;case 26:this.popState();break;case 27:return this.popState(),t.getLogger().trace("node end ))"),"NODE_DEND";break;case 28:return this.popState(),t.getLogger().trace("node end )"),"NODE_DEND";break;case 29:return this.popState(),t.getLogger().trace("node end ...",o.yytext),"NODE_DEND";break;case 30:return this.popState(),t.getLogger().trace("node end (("),"NODE_DEND";break;case 31:return this.popState(),t.getLogger().trace("node end (-"),"NODE_DEND";break;case 32:return this.popState(),t.getLogger().trace("node end (-"),"NODE_DEND";break;case 33:return this.popState(),t.getLogger().trace("node end (("),"NODE_DEND";break;case 34:return this.popState(),t.getLogger().trace("node end (("),"NODE_DEND";break;case 35:return t.getLogger().trace("Long description:",o.yytext),20;break;case 36:return t.getLogger().trace("Long description:",o.yytext),20;break}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}};return N})();B.lexer=ye;function A(){this.yy={}}return c(A,"Parser"),A.prototype=B,B.Parser=A,new A})();q.parser=q;var Ne=q,ve=12,D={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},Le=class{constructor(){this.nodes=[],this.count=0,this.elements={},this.getLogger=this.getLogger.bind(this),this.nodeType=D,this.clear(),this.getType=this.getType.bind(this),this.getElementById=this.getElementById.bind(this),this.getParent=this.getParent.bind(this),this.getMindmap=this.getMindmap.bind(this),this.addNode=this.addNode.bind(this),this.decorateNode=this.decorateNode.bind(this)}static{c(this,"MindmapDB")}clear(){this.nodes=[],this.count=0,this.elements={},this.baseLevel=void 0}getParent(e){for(let n=this.nodes.length-1;n>=0;n--)if(this.nodes[n].level0?this.nodes[0]:null}addNode(e,n,i,l){T.info("addNode",e,n,i,l);let g=!1;this.nodes.length===0?(this.baseLevel=e,e=0,g=!0):this.baseLevel!==void 0&&(e=e-this.baseLevel,g=!1);let h=V(),f=h.mindmap?.padding??R.mindmap.padding;switch(l){case this.nodeType.ROUNDED_RECT:case this.nodeType.RECT:case this.nodeType.HEXAGON:f*=2;break}let E={id:this.count++,nodeId:w(n,h),level:e,descr:w(i,h),type:l,children:[],width:h.mindmap?.maxNodeWidth??R.mindmap.maxNodeWidth,padding:f,isRoot:g},p=this.getParent(e);if(p)p.children.push(E),this.nodes.push(E);else if(g)this.nodes.push(E);else throw new Error(`There can be only one root. No parent could be found for ("${E.descr}")`)}getType(e,n){switch(T.debug("In get type",e,n),e){case"[":return this.nodeType.RECT;case"(":return n===")"?this.nodeType.ROUNDED_RECT:this.nodeType.CLOUD;case"((":return this.nodeType.CIRCLE;case")":return this.nodeType.CLOUD;case"))":return this.nodeType.BANG;case"{{":return this.nodeType.HEXAGON;default:return this.nodeType.DEFAULT}}setElementForId(e,n){this.elements[e]=n}getElementById(e){return this.elements[e]}decorateNode(e){if(!e)return;let n=V(),i=this.nodes[this.nodes.length-1];e.icon&&(i.icon=w(e.icon,n)),e.class&&(i.class=w(e.class,n))}type2Str(e){switch(e){case this.nodeType.DEFAULT:return"no-border";case this.nodeType.RECT:return"rect";case this.nodeType.ROUNDED_RECT:return"rounded-rect";case this.nodeType.CIRCLE:return"circle";case this.nodeType.CLOUD:return"cloud";case this.nodeType.BANG:return"bang";case this.nodeType.HEXAGON:return"hexgon";default:return"no-border"}}assignSections(e,n){if(e.level===0?e.section=void 0:e.section=n,e.children)for(let[i,l]of e.children.entries()){let g=e.level===0?i%(ve-1):n;this.assignSections(l,g)}}flattenNodes(e,n){let i=["mindmap-node"];e.isRoot===!0?i.push("section-root","section--1"):e.section!==void 0&&i.push(`section-${e.section}`),e.class&&i.push(e.class);let l=i.join(" "),g=c(f=>{switch(f){case D.CIRCLE:return"mindmapCircle";case D.RECT:return"rect";case D.ROUNDED_RECT:return"rounded";case D.CLOUD:return"cloud";case D.BANG:return"bang";case D.HEXAGON:return"hexagon";case D.DEFAULT:return"defaultMindmapNode";case D.NO_BORDER:default:return"rect"}},"getShapeFromType"),h={id:e.id.toString(),domId:"node_"+e.id.toString(),label:e.descr,labelType:"markdown",isGroup:!1,shape:g(e.type),width:e.width,height:e.height??0,padding:e.padding,cssClasses:l,cssStyles:[],look:"default",icon:e.icon,x:e.x,y:e.y,level:e.level,nodeId:e.nodeId,type:e.type,section:e.section};if(n.push(h),e.children)for(let f of e.children)this.flattenNodes(f,n)}generateEdges(e,n){if(e.children)for(let i of e.children){let l="edge";i.section!==void 0&&(l+=` section-edge-${i.section}`);let g=e.level+1;l+=` edge-depth-${g}`;let h={id:`edge_${e.id}_${i.id}`,start:e.id.toString(),end:i.id.toString(),type:"normal",curve:"basis",thickness:"normal",look:"default",classes:l,depth:e.level,section:i.section};n.push(h),this.generateEdges(i,n)}}getData(){let e=this.getMindmap(),n=V(),l=de().layout!==void 0,g=n;if(l||(g.layout="cose-bilkent"),!e)return{nodes:[],edges:[],config:g};T.debug("getData: mindmapRoot",e,n),this.assignSections(e);let h=[],f=[];this.flattenNodes(e,h),this.generateEdges(e,f),T.debug(`getData: processed ${h.length} nodes and ${f.length} edges`);let E=new Map;for(let p of h)E.set(p.id,{shape:p.shape,width:p.width,height:p.height,padding:p.padding});return{nodes:h,edges:f,config:g,rootNode:e,markers:["point"],direction:"TB",nodeSpacing:50,rankSpacing:50,shapes:Object.fromEntries(E),type:"mindmap",diagramId:"mindmap-"+Y()}}getLogger(){return T}},Te=c((e,n,i,l)=>ae(null,null,function*(){T.debug(`Rendering mindmap diagram +`+e);let g=l.db,h=g.getData(),f=pe(n,h.config.securityLevel);h.type=l.type,h.layoutAlgorithm=ue(h.config.layout,{fallback:"cose-bilkent"}),h.diagramId=n,g.getMindmap()&&(h.nodes.forEach(p=>{p.shape==="rounded"?(p.radius=15,p.taper=15,p.stroke="none",p.width=0,p.padding=15):p.shape==="circle"?p.padding=10:p.shape==="rect"&&(p.width=0,p.padding=10)}),yield ge(h,f),fe(f,h.config.mindmap?.padding??R.mindmap.padding,"mindmapDiagram",h.config.mindmap?.useMaxWidth??R.mindmap.useMaxWidth))}),"draw"),Oe={draw:Te},Ie=c(e=>{let n="";for(let i=0;i` + .edge { + stroke-width: 3; + } + ${Ie(e)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${e.git0}; + } + .section-root text { + fill: ${e.gitBranchLabel0}; + } + .section-root span { + color: ${e.gitBranchLabel0}; + } + .section-2 span { + color: ${e.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .mindmap-node-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } +`,"getStyles"),Re=Ce,nt={get db(){return new Le},renderer:Oe,parser:Ne,styles:Re};export{nt as diagram}; diff --git a/src/google/adk/cli/browser/chunk-IHY23QJP.js b/src/google/adk/cli/browser/chunk-IHY23QJP.js new file mode 100644 index 0000000000..6d72da771b --- /dev/null +++ b/src/google/adk/cli/browser/chunk-IHY23QJP.js @@ -0,0 +1 @@ +import{a as e,b as r}from"./chunk-I4UDKKN5.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{e as ArchitectureModule,r as createArchitectureServices}; diff --git a/src/google/adk/cli/browser/chunk-CD6LWQYN.js b/src/google/adk/cli/browser/chunk-IT263FCL.js similarity index 94% rename from src/google/adk/cli/browser/chunk-CD6LWQYN.js rename to src/google/adk/cli/browser/chunk-IT263FCL.js index 1f6f58a36f..b6b5935eb3 100644 --- a/src/google/adk/cli/browser/chunk-CD6LWQYN.js +++ b/src/google/adk/cli/browser/chunk-IT263FCL.js @@ -1,2 +1,2 @@ -import{$a as c,Ca as o,Gb as h,Lb as y,Pa as a,Yb as C,Zb as g,eb as d,nc as v,pd as _,qd as w,ub as s,vb as l,wb as p,xb as m,yb as u,zb as f}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var D=e=>[e];function M(e,F){if(e&1&&h(0,0),e&2){let i=F.$implicit,n=y();m("surfaceId",n.surfaceId())("component",i)}}var T=(()=>{class e extends _{static \u0275fac=(()=>{let i;return function(t){return(i||(i=o(e)))(t||e)}})();static \u0275cmp=c({type:e,selectors:[["a2ui-card"]],features:[d],decls:3,vars:6,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(n,t){if(n&1&&(u(0,"section"),l(1,M,1,2,"ng-container",0,s),f()),n&2){let r=t.component().properties,I=r.children||v(4,D,r.child);C(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Card),g(t.theme.components.Card),a(),p(I)}},dependencies:[w],styles:[`a2ui-card{display:block;flex:var(--weight);min-height:0;overflow:auto}a2ui-card>section{height:100%;width:100%;min-height:0;overflow:auto}a2ui-card>section>*{height:100%;width:100%} +import{$a as c,Ca as o,Gb as h,Lb as y,Pa as a,Yb as C,Zb as g,eb as d,nc as v,pd as _,qd as w,ub as s,vb as l,wb as p,xb as m,yb as u,zb as f}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var D=e=>[e];function M(e,F){if(e&1&&h(0,0),e&2){let i=F.$implicit,n=y();m("surfaceId",n.surfaceId())("component",i)}}var T=(()=>{class e extends _{static \u0275fac=(()=>{let i;return function(t){return(i||(i=o(e)))(t||e)}})();static \u0275cmp=c({type:e,selectors:[["a2ui-card"]],features:[d],decls:3,vars:6,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(n,t){if(n&1&&(u(0,"section"),l(1,M,1,2,"ng-container",0,s),f()),n&2){let r=t.component().properties,I=r.children||v(4,D,r.child);C(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Card),g(t.theme.components.Card),a(),p(I)}},dependencies:[w],styles:[`a2ui-card{display:block;flex:var(--weight);min-height:0;overflow:auto}a2ui-card>section{height:100%;width:100%;min-height:0;overflow:auto}a2ui-card>section>*{height:100%;width:100%} `],encapsulation:2})}return e})();export{T as Card}; diff --git a/src/google/adk/cli/browser/chunk-J4R5U4YL.js b/src/google/adk/cli/browser/chunk-J4R5U4YL.js new file mode 100644 index 0000000000..b153718475 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-J4R5U4YL.js @@ -0,0 +1,7 @@ +import{a as Ht}from"./chunk-TPDTRWWV.js";import{e as Ut}from"./chunk-WXI2IBAH.js";import{l as pt}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as st,G as Bt,N as Wt,R as zt,S as Ft,T as Ot,U as Xt,V as Nt,W as Yt,X as gt,p as Vt,r as Mt}from"./chunk-QFMJV7VH.js";import{M as ft,g as a,i as ut,s as xt,t as dt}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";var mt=(function(){var t=a(function(N,o,l,u){for(l=l||{},u=N.length;u--;l[N[u]]=o);return l},"o"),i=[1,10,12,14,16,18,19,21,23],e=[2,6],s=[1,3],r=[1,5],p=[1,6],x=[1,7],A=[1,5,10,12,14,16,18,19,21,23,34,35,36],L=[1,25],W=[1,26],V=[1,28],T=[1,29],E=[1,30],z=[1,31],F=[1,32],R=[1,33],M=[1,34],O=[1,35],X=[1,36],f=[1,37],D=[1,43],h=[1,42],B=[1,47],v=[1,50],b=[1,10,12,14,16,18,19,21,23,34,35,36],H=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],c=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],C=[1,64],_={trace:a(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:a(function(o,l,u,g,y,n,Q){var d=n.length-1;switch(y){case 5:g.setOrientation(n[d]);break;case 9:g.setDiagramTitle(n[d].text.trim());break;case 12:g.setLineData({text:"",type:"text"},n[d]);break;case 13:g.setLineData(n[d-1],n[d]);break;case 14:g.setBarData({text:"",type:"text"},n[d]);break;case 15:g.setBarData(n[d-1],n[d]);break;case 16:this.$=n[d].trim(),g.setAccTitle(this.$);break;case 17:case 18:this.$=n[d].trim(),g.setAccDescription(this.$);break;case 19:this.$=n[d-1];break;case 20:this.$=[Number(n[d-2]),...n[d]];break;case 21:this.$=[Number(n[d])];break;case 22:g.setXAxisTitle(n[d]);break;case 23:g.setXAxisTitle(n[d-1]);break;case 24:g.setXAxisTitle({type:"text",text:""});break;case 25:g.setXAxisBand(n[d]);break;case 26:g.setXAxisRangeData(Number(n[d-2]),Number(n[d]));break;case 27:this.$=n[d-1];break;case 28:this.$=[n[d-2],...n[d]];break;case 29:this.$=[n[d]];break;case 30:g.setYAxisTitle(n[d]);break;case 31:g.setYAxisTitle(n[d-1]);break;case 32:g.setYAxisTitle({type:"text",text:""});break;case 33:g.setYAxisRangeData(Number(n[d-2]),Number(n[d]));break;case 37:this.$={text:n[d],type:"text"};break;case 38:this.$={text:n[d],type:"text"};break;case 39:this.$={text:n[d],type:"markdown"};break;case 40:this.$=n[d];break;case 41:this.$=n[d-1]+""+n[d];break}},"anonymous"),table:[t(i,e,{3:1,4:2,7:4,5:s,34:r,35:p,36:x}),{1:[3]},t(i,e,{4:2,7:4,3:8,5:s,34:r,35:p,36:x}),t(i,e,{4:2,7:4,6:9,3:10,5:s,8:[1,11],34:r,35:p,36:x}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(A,[2,34]),t(A,[2,35]),t(A,[2,36]),{1:[2,1]},t(i,e,{4:2,7:4,3:21,5:s,34:r,35:p,36:x}),{1:[2,3]},t(A,[2,5]),t(i,[2,7],{4:22,34:r,35:p,36:x}),{11:23,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},{11:39,13:38,24:D,27:h,29:40,30:41,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},{11:45,15:44,27:B,33:46,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},{11:49,17:48,24:v,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},{11:52,17:51,24:v,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},{20:[1,53]},{22:[1,54]},t(b,[2,18]),{1:[2,2]},t(b,[2,8]),t(b,[2,9]),t(H,[2,37],{40:55,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f}),t(H,[2,38]),t(H,[2,39]),t(c,[2,40]),t(c,[2,42]),t(c,[2,43]),t(c,[2,44]),t(c,[2,45]),t(c,[2,46]),t(c,[2,47]),t(c,[2,48]),t(c,[2,49]),t(c,[2,50]),t(c,[2,51]),t(b,[2,10]),t(b,[2,22],{30:41,29:56,24:D,27:h}),t(b,[2,24]),t(b,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},t(b,[2,11]),t(b,[2,30],{33:60,27:B}),t(b,[2,32]),{31:[1,61]},t(b,[2,12]),{17:62,24:v},{25:63,27:C},t(b,[2,14]),{17:65,24:v},t(b,[2,16]),t(b,[2,17]),t(c,[2,41]),t(b,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(b,[2,31]),{27:[1,69]},t(b,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(b,[2,15]),t(b,[2,26]),t(b,[2,27]),{11:59,32:72,37:24,38:L,39:W,40:27,41:V,42:T,43:E,44:z,45:F,46:R,47:M,48:O,49:X,50:f},t(b,[2,33]),t(b,[2,19]),{25:73,27:C},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:a(function(o,l){if(l.recoverable)this.trace(o);else{var u=new Error(o);throw u.hash=l,u}},"parseError"),parse:a(function(o){var l=this,u=[0],g=[],y=[null],n=[],Q=this.table,d="",tt=0,vt=0,Pt=0,gi=2,Lt=1,xi=n.slice.call(arguments,1),k=Object.create(this.lexer),$={yy:{}};for(var rt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,rt)&&($.yy[rt]=this.yy[rt]);k.setInput(o,$.yy),$.yy.lexer=k,$.yy.parser=this,typeof k.yylloc>"u"&&(k.yylloc={});var ot=k.yylloc;n.push(ot);var di=k.options&&k.options.ranges;typeof $.yy.parseError=="function"?this.parseError=$.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function fi(P){u.length=u.length-2*P,y.length=y.length-P,n.length=n.length-P}a(fi,"popStack");function Et(){var P;return P=g.pop()||k.lex()||Lt,typeof P!="number"&&(P instanceof Array&&(g=P,P=g.pop()),P=l.symbols_[P]||P),P}a(Et,"lex");for(var S,ht,q,I,vi,lt,G={},it,Y,It,et;;){if(q=u[u.length-1],this.defaultActions[q]?I=this.defaultActions[q]:((S===null||typeof S>"u")&&(S=Et()),I=Q[q]&&Q[q][S]),typeof I>"u"||!I.length||!I[0]){var ct="";et=[];for(it in Q[q])this.terminals_[it]&&it>gi&&et.push("'"+this.terminals_[it]+"'");k.showPosition?ct="Parse error on line "+(tt+1)+`: +`+k.showPosition()+` +Expecting `+et.join(", ")+", got '"+(this.terminals_[S]||S)+"'":ct="Parse error on line "+(tt+1)+": Unexpected "+(S==Lt?"end of input":"'"+(this.terminals_[S]||S)+"'"),this.parseError(ct,{text:k.match,token:this.terminals_[S]||S,line:k.yylineno,loc:ot,expected:et})}if(I[0]instanceof Array&&I.length>1)throw new Error("Parse Error: multiple actions possible at state: "+q+", token: "+S);switch(I[0]){case 1:u.push(S),y.push(k.yytext),n.push(k.yylloc),u.push(I[1]),S=null,ht?(S=ht,ht=null):(vt=k.yyleng,d=k.yytext,tt=k.yylineno,ot=k.yylloc,Pt>0&&Pt--);break;case 2:if(Y=this.productions_[I[1]][1],G.$=y[y.length-Y],G._$={first_line:n[n.length-(Y||1)].first_line,last_line:n[n.length-1].last_line,first_column:n[n.length-(Y||1)].first_column,last_column:n[n.length-1].last_column},di&&(G._$.range=[n[n.length-(Y||1)].range[0],n[n.length-1].range[1]]),lt=this.performAction.apply(G,[d,vt,tt,$.yy,I[1],y,n].concat(xi)),typeof lt<"u")return lt;Y&&(u=u.slice(0,-1*Y*2),y=y.slice(0,-1*Y),n=n.slice(0,-1*Y)),u.push(this.productions_[I[1]][0]),y.push(G.$),n.push(G._$),It=Q[u[u.length-2]][u[u.length-1]],u.push(It);break;case 3:return!0}}return!0},"parse")},w=(function(){var N={EOF:1,parseError:a(function(l,u){if(this.yy.parser)this.yy.parser.parseError(l,u);else throw new Error(l)},"parseError"),setInput:a(function(o,l){return this.yy=l||this.yy||{},this._input=o,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:a(function(){var o=this._input[0];this.yytext+=o,this.yyleng++,this.offset++,this.match+=o,this.matched+=o;var l=o.match(/(?:\r\n?|\n).*/g);return l?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),o},"input"),unput:a(function(o){var l=o.length,u=o.split(/(?:\r\n?|\n)/g);this._input=o+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-l),this.offset-=l;var g=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),u.length-1&&(this.yylineno-=u.length-1);var y=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:u?(u.length===g.length?this.yylloc.first_column:0)+g[g.length-u.length].length-u[0].length:this.yylloc.first_column-l},this.options.ranges&&(this.yylloc.range=[y[0],y[0]+this.yyleng-l]),this.yyleng=this.yytext.length,this},"unput"),more:a(function(){return this._more=!0,this},"more"),reject:a(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:a(function(o){this.unput(this.match.slice(o))},"less"),pastInput:a(function(){var o=this.matched.substr(0,this.matched.length-this.match.length);return(o.length>20?"...":"")+o.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:a(function(){var o=this.match;return o.length<20&&(o+=this._input.substr(0,20-o.length)),(o.substr(0,20)+(o.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:a(function(){var o=this.pastInput(),l=new Array(o.length+1).join("-");return o+this.upcomingInput()+` +`+l+"^"},"showPosition"),test_match:a(function(o,l){var u,g,y;if(this.options.backtrack_lexer&&(y={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(y.yylloc.range=this.yylloc.range.slice(0))),g=o[0].match(/(?:\r\n?|\n).*/g),g&&(this.yylineno+=g.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:g?g[g.length-1].length-g[g.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+o[0].length},this.yytext+=o[0],this.match+=o[0],this.matches=o,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(o[0].length),this.matched+=o[0],u=this.performAction.call(this,this.yy,this,l,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),u)return u;if(this._backtrack){for(var n in y)this[n]=y[n];return!1}return!1},"test_match"),next:a(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var o,l,u,g;this._more||(this.yytext="",this.match="");for(var y=this._currentRules(),n=0;nl[0].length)){if(l=u,g=n,this.options.backtrack_lexer){if(o=this.test_match(u,y[n]),o!==!1)return o;if(this._backtrack){l=!1;continue}else return!1}else if(!this.options.flex)break}return l?(o=this.test_match(l,y[g]),o!==!1?o:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:a(function(){var l=this.next();return l||this.lex()},"lex"),begin:a(function(l){this.conditionStack.push(l)},"begin"),popState:a(function(){var l=this.conditionStack.length-1;return l>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:a(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:a(function(l){return l=this.conditionStack.length-1-Math.abs(l||0),l>=0?this.conditionStack[l]:"INITIAL"},"topState"),pushState:a(function(l){this.begin(l)},"pushState"),stateStackSize:a(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:a(function(l,u,g,y){var n=y;switch(g){case 0:break;case 1:break;case 2:return this.popState(),34;break;case 3:return this.popState(),34;break;case 4:return 34;case 5:break;case 6:return 10;case 7:return this.pushState("acc_title"),19;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.pushState("acc_descr"),21;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.pushState("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 5;case 15:return 5;case 16:return 8;case 17:return this.pushState("axis_data"),"X_AXIS";break;case 18:return this.pushState("axis_data"),"Y_AXIS";break;case 19:return this.pushState("axis_band_data"),24;break;case 20:return 31;case 21:return this.pushState("data"),16;break;case 22:return this.pushState("data"),18;break;case 23:return this.pushState("data_inner"),24;break;case 24:return 27;case 25:return this.popState(),26;break;case 26:this.popState();break;case 27:this.pushState("string");break;case 28:this.popState();break;case 29:return"STR";case 30:return 24;case 31:return 26;case 32:return 43;case 33:return"COLON";case 34:return 44;case 35:return 28;case 36:return 45;case 37:return 46;case 38:return 48;case 39:return 50;case 40:return 47;case 41:return 41;case 42:return 49;case 43:return 42;case 44:break;case 45:return 35;case 46:return 36}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:(\r?\n))/i,/^(?:(\r?\n))/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:\})/i,/^(?:[^\}]*)/i,/^(?:xychart-beta\b)/i,/^(?:xychart\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\b)/i,/^(?:y-axis\b)/i,/^(?:\[)/i,/^(?:-->)/i,/^(?:line\b)/i,/^(?:bar\b)/i,/^(?:\[)/i,/^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i,/^(?:\])/i,/^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n\(\?:`))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s+)/i,/^(?:;)/i,/^(?:$)/i],conditions:{data_inner:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,24,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,18,21,22,23,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,22,24,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[28,29],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0}}};return N})();_.lexer=w;function U(){this.yy={}}return a(U,"Parser"),U.prototype=_,_.Parser=U,new U})();mt.parser=mt;var pi=mt;function yt(t){return t.type==="bar"}a(yt,"isBarPlot");function kt(t){return t.type==="band"}a(kt,"isBandAxisData");function j(t){return t.type==="linear"}a(j,"isLinearAxisData");var Gt=class{constructor(t){this.parentGroup=t}static{a(this,"TextDimensionCalculatorWithFont")}getMaxDimension(t,i){if(!this.parentGroup)return{width:t.reduce((r,p)=>Math.max(p.length,r),0)*i,height:i};let e={width:0,height:0},s=this.parentGroup.append("g").attr("visibility","hidden").attr("font-size",i);for(let r of t){let p=Ut(s,1,r),x=p?p.width:r.length*i,A=p?p.height:i;e.width=Math.max(e.width,x),e.height=Math.max(e.height,A)}return s.remove(),e}},$t=.7,qt=.2,jt=class{constructor(t,i,e,s){this.axisConfig=t,this.title=i,this.textDimensionCalculator=e,this.axisThemeConfig=s,this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left",this.showTitle=!1,this.showLabel=!1,this.showTick=!1,this.showAxisLine=!1,this.outerPadding=0,this.titleTextHeight=0,this.labelTextHeight=0,this.range=[0,10],this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left"}static{a(this,"BaseAxis")}setRange(t){this.range=t,this.axisPosition==="left"||this.axisPosition==="right"?this.boundingRect.height=t[1]-t[0]:this.boundingRect.width=t[1]-t[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(t){this.axisPosition=t,this.setRange(this.range)}getTickDistance(){let t=this.getRange();return Math.abs(t[0]-t[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map(t=>t.toString()),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){$t*this.getTickDistance()>this.outerPadding*2&&(this.outerPadding=Math.floor($t*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(t){let i=t.height;if(this.axisConfig.showAxisLine&&i>this.axisConfig.axisLineWidth&&(i-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let e=this.getLabelDimension(),s=qt*t.width;this.outerPadding=Math.min(e.width/2,s);let r=e.height+this.axisConfig.labelPadding*2;this.labelTextHeight=e.height,r<=i&&(i-=r,this.showLabel=!0)}if(this.axisConfig.showTick&&i>=this.axisConfig.tickLength&&(this.showTick=!0,i-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let e=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),s=e.height+this.axisConfig.titlePadding*2;this.titleTextHeight=e.height,s<=i&&(i-=s,this.showTitle=!0)}this.boundingRect.width=t.width,this.boundingRect.height=t.height-i}calculateSpaceIfDrawnVertical(t){let i=t.width;if(this.axisConfig.showAxisLine&&i>this.axisConfig.axisLineWidth&&(i-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let e=this.getLabelDimension(),s=qt*t.height;this.outerPadding=Math.min(e.height/2,s);let r=e.width+this.axisConfig.labelPadding*2;r<=i&&(i-=r,this.showLabel=!0)}if(this.axisConfig.showTick&&i>=this.axisConfig.tickLength&&(this.showTick=!0,i-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let e=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),s=e.height+this.axisConfig.titlePadding*2;this.titleTextHeight=e.height,s<=i&&(i-=s,this.showTitle=!0)}this.boundingRect.width=t.width-i,this.boundingRect.height=t.height}calculateSpace(t){return this.axisPosition==="left"||this.axisPosition==="right"?this.calculateSpaceIfDrawnVertical(t):this.calculateSpaceIfDrawnHorizontally(t),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}getDrawableElementsForLeftAxis(){let t=[];if(this.showAxisLine){let i=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["left-axis","axisl-line"],data:[{path:`M ${i},${this.boundingRect.y} L ${i},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["left-axis","label"],data:this.getTickValues().map(i=>({text:i.toString(),x:this.boundingRect.x+this.boundingRect.width-(this.showLabel?this.axisConfig.labelPadding:0)-(this.showTick?this.axisConfig.tickLength:0)-(this.showAxisLine?this.axisConfig.axisLineWidth:0),y:this.getScaleValue(i),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"middle",horizontalPos:"right"}))}),this.showTick){let i=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);t.push({type:"path",groupTexts:["left-axis","ticks"],data:this.getTickValues().map(e=>({path:`M ${i},${this.getScaleValue(e)} L ${i-this.axisConfig.tickLength},${this.getScaleValue(e)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&t.push({type:"text",groupTexts:["left-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.axisConfig.titlePadding,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:270,verticalPos:"top",horizontalPos:"center"}]}),t}getDrawableElementsForBottomAxis(){let t=[];if(this.showAxisLine){let i=this.boundingRect.y+this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["bottom-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${i} L ${this.boundingRect.x+this.boundingRect.width},${i}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["bottom-axis","label"],data:this.getTickValues().map(i=>({text:i.toString(),x:this.getScaleValue(i),y:this.boundingRect.y+this.axisConfig.labelPadding+(this.showTick?this.axisConfig.tickLength:0)+(this.showAxisLine?this.axisConfig.axisLineWidth:0),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let i=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);t.push({type:"path",groupTexts:["bottom-axis","ticks"],data:this.getTickValues().map(e=>({path:`M ${this.getScaleValue(e)},${i} L ${this.getScaleValue(e)},${i+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&t.push({type:"text",groupTexts:["bottom-axis","title"],data:[{text:this.title,x:this.range[0]+(this.range[1]-this.range[0])/2,y:this.boundingRect.y+this.boundingRect.height-this.axisConfig.titlePadding-this.titleTextHeight,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),t}getDrawableElementsForTopAxis(){let t=[];if(this.showAxisLine){let i=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["top-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${i} L ${this.boundingRect.x+this.boundingRect.width},${i}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["top-axis","label"],data:this.getTickValues().map(i=>({text:i.toString(),x:this.getScaleValue(i),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+this.axisConfig.titlePadding*2:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let i=this.boundingRect.y;t.push({type:"path",groupTexts:["top-axis","ticks"],data:this.getTickValues().map(e=>({path:`M ${this.getScaleValue(e)},${i+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(e)},${i+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&t.push({type:"text",groupTexts:["top-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.axisConfig.titlePadding,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),t}getDrawableElements(){if(this.axisPosition==="left")return this.getDrawableElementsForLeftAxis();if(this.axisPosition==="right")throw Error("Drawing of right axis is not implemented");return this.axisPosition==="bottom"?this.getDrawableElementsForBottomAxis():this.axisPosition==="top"?this.getDrawableElementsForTopAxis():[]}},mi=class extends jt{static{a(this,"BandAxis")}constructor(t,i,e,s,r){super(t,s,r,i),this.categories=e,this.scale=xt().domain(this.categories).range(this.getRange())}setRange(t){super.setRange(t)}recalculateScale(){this.scale=xt().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),ut.trace("BandAxis axis final categories, range: ",this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(t){return this.scale(t)??this.getRange()[0]}},yi=class extends jt{static{a(this,"LinearAxis")}constructor(t,i,e,s,r){super(t,s,r,i),this.domain=e,this.scale=dt().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){let t=[...this.domain];this.axisPosition==="left"&&t.reverse(),this.scale=dt().domain(t).range(this.getRange())}getScaleValue(t){return this.scale(t)}};function bt(t,i,e,s){let r=new Gt(s);return kt(t)?new mi(i,e,t.categories,t.title,r):new yi(i,e,[t.min,t.max],t.title,r)}a(bt,"getAxis");var bi=class{constructor(t,i,e,s){this.textDimensionCalculator=t,this.chartConfig=i,this.chartData=e,this.chartThemeConfig=s,this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}static{a(this,"ChartTitle")}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}calculateSpace(t){let i=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),e=Math.max(i.width,t.width),s=i.height+2*this.chartConfig.titlePadding;return i.width<=e&&i.height<=s&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=e,this.boundingRect.height=s,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){let t=[];return this.showChartTitle&&t.push({groupTexts:["chart-title"],type:"text",data:[{fontSize:this.chartConfig.titleFontSize,text:this.chartData.title,verticalPos:"middle",horizontalPos:"center",x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.chartThemeConfig.titleColor,rotation:0}]}),t}};function Qt(t,i,e,s){let r=new Gt(s);return new bi(r,t,i,e)}a(Qt,"getChartTitleComponent");var Ai=class{constructor(t,i,e,s,r){this.plotData=t,this.xAxis=i,this.yAxis=e,this.orientation=s,this.plotIndex=r}static{a(this,"LinePlot")}getDrawableElement(){let t=this.plotData.data.map(e=>[this.xAxis.getScaleValue(e[0]),this.yAxis.getScaleValue(e[1])]),i;return this.orientation==="horizontal"?i=ft().y(e=>e[0]).x(e=>e[1])(t):i=ft().x(e=>e[0]).y(e=>e[1])(t),i?[{groupTexts:["plot",`line-plot-${this.plotIndex}`],type:"path",data:[{path:i,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}]:[]}},ki=class{constructor(t,i,e,s,r,p){this.barData=t,this.boundingRect=i,this.xAxis=e,this.yAxis=s,this.orientation=r,this.plotIndex=p}static{a(this,"BarPlot")}getDrawableElement(){let t=this.barData.data.map(r=>[this.xAxis.getScaleValue(r[0]),this.yAxis.getScaleValue(r[1])]),e=Math.min(this.xAxis.getAxisOuterPadding()*2,this.xAxis.getTickDistance())*(1-.05),s=e/2;return this.orientation==="horizontal"?[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:t.map(r=>({x:this.boundingRect.x,y:r[0]-s,height:e,width:r[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]:[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:t.map(r=>({x:r[0]-s,y:r[1],width:e,height:this.boundingRect.y+this.boundingRect.height-r[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]}},wi=class{constructor(t,i,e){this.chartConfig=t,this.chartData=i,this.chartThemeConfig=e,this.boundingRect={x:0,y:0,width:0,height:0}}static{a(this,"BasePlot")}setAxes(t,i){this.xAxis=t,this.yAxis=i}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}calculateSpace(t){return this.boundingRect.width=t.width,this.boundingRect.height=t.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!(this.xAxis&&this.yAxis))throw Error("Axes must be passed to render Plots");let t=[];for(let[i,e]of this.chartData.plots.entries())switch(e.type){case"line":{let s=new Ai(e,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,i);t.push(...s.getDrawableElement())}break;case"bar":{let s=new ki(e,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,i);t.push(...s.getDrawableElement())}break}return t}};function Kt(t,i,e){return new wi(t,i,e)}a(Kt,"getPlotComponent");var Ci=class{constructor(t,i,e,s){this.chartConfig=t,this.chartData=i,this.componentStore={title:Qt(t,i,e,s),plot:Kt(t,i,e),xAxis:bt(i.xAxis,t.xAxis,{titleColor:e.xAxisTitleColor,labelColor:e.xAxisLabelColor,tickColor:e.xAxisTickColor,axisLineColor:e.xAxisLineColor},s),yAxis:bt(i.yAxis,t.yAxis,{titleColor:e.yAxisTitleColor,labelColor:e.yAxisLabelColor,tickColor:e.yAxisTickColor,axisLineColor:e.yAxisLineColor},s)}}static{a(this,"Orchestrator")}calculateVerticalSpace(){let t=this.chartConfig.width,i=this.chartConfig.height,e=0,s=0,r=Math.floor(t*this.chartConfig.plotReservedSpacePercent/100),p=Math.floor(i*this.chartConfig.plotReservedSpacePercent/100),x=this.componentStore.plot.calculateSpace({width:r,height:p});t-=x.width,i-=x.height,x=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:i}),s=x.height,i-=x.height,this.componentStore.xAxis.setAxisPosition("bottom"),x=this.componentStore.xAxis.calculateSpace({width:t,height:i}),i-=x.height,this.componentStore.yAxis.setAxisPosition("left"),x=this.componentStore.yAxis.calculateSpace({width:t,height:i}),e=x.width,t-=x.width,t>0&&(r+=t,t=0),i>0&&(p+=i,i=0),this.componentStore.plot.calculateSpace({width:r,height:p}),this.componentStore.plot.setBoundingBoxXY({x:e,y:s}),this.componentStore.xAxis.setRange([e,e+r]),this.componentStore.xAxis.setBoundingBoxXY({x:e,y:s+p}),this.componentStore.yAxis.setRange([s,s+p]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:s}),this.chartData.plots.some(A=>yt(A))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizontalSpace(){let t=this.chartConfig.width,i=this.chartConfig.height,e=0,s=0,r=0,p=Math.floor(t*this.chartConfig.plotReservedSpacePercent/100),x=Math.floor(i*this.chartConfig.plotReservedSpacePercent/100),A=this.componentStore.plot.calculateSpace({width:p,height:x});t-=A.width,i-=A.height,A=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:i}),e=A.height,i-=A.height,this.componentStore.xAxis.setAxisPosition("left"),A=this.componentStore.xAxis.calculateSpace({width:t,height:i}),t-=A.width,s=A.width,this.componentStore.yAxis.setAxisPosition("top"),A=this.componentStore.yAxis.calculateSpace({width:t,height:i}),i-=A.height,r=e+A.height,t>0&&(p+=t,t=0),i>0&&(x+=i,i=0),this.componentStore.plot.calculateSpace({width:p,height:x}),this.componentStore.plot.setBoundingBoxXY({x:s,y:r}),this.componentStore.yAxis.setRange([s,s+p]),this.componentStore.yAxis.setBoundingBoxXY({x:s,y:e}),this.componentStore.xAxis.setRange([r,r+x]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:r}),this.chartData.plots.some(L=>yt(L))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){this.chartConfig.chartOrientation==="horizontal"?this.calculateHorizontalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();let t=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(let i of Object.values(this.componentStore))t.push(...i.getDrawableElements());return t}},Si=class{static{a(this,"XYChartBuilder")}static build(t,i,e,s){return new Ci(t,i,e,s).getDrawableElement()}},K=0,Zt,Z=St(),J=Ct(),m=_t(),At=J.plotColorPalette.split(",").map(t=>t.trim()),at=!1,wt=!1;function Ct(){let t=Vt(),i=st();return pt(t.xyChart,i.themeVariables.xyChart)}a(Ct,"getChartDefaultThemeConfig");function St(){let t=st();return pt(Mt.xyChart,t.xyChart)}a(St,"getChartDefaultConfig");function _t(){return{yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]}}a(_t,"getChartDefaultData");function nt(t){let i=st();return Bt(t.trim(),i)}a(nt,"textSanitizer");function Jt(t){Zt=t}a(Jt,"setTmpSVGG");function ti(t){t==="horizontal"?Z.chartOrientation="horizontal":Z.chartOrientation="vertical"}a(ti,"setOrientation");function ii(t){m.xAxis.title=nt(t.text)}a(ii,"setXAxisTitle");function Tt(t,i){m.xAxis={type:"linear",title:m.xAxis.title,min:t,max:i},at=!0}a(Tt,"setXAxisRangeData");function ei(t){m.xAxis={type:"band",title:m.xAxis.title,categories:t.map(i=>nt(i.text))},at=!0}a(ei,"setXAxisBand");function si(t){m.yAxis.title=nt(t.text)}a(si,"setYAxisTitle");function ai(t,i){m.yAxis={type:"linear",title:m.yAxis.title,min:t,max:i},wt=!0}a(ai,"setYAxisRangeData");function ni(t){let i=Math.min(...t),e=Math.max(...t),s=j(m.yAxis)?m.yAxis.min:1/0,r=j(m.yAxis)?m.yAxis.max:-1/0;m.yAxis={type:"linear",title:m.yAxis.title,min:Math.min(s,i),max:Math.max(r,e)}}a(ni,"setYAxisRangeFromPlotData");function Rt(t){let i=[];if(t.length===0)return i;if(!at){let e=j(m.xAxis)?m.xAxis.min:1/0,s=j(m.xAxis)?m.xAxis.max:-1/0;Tt(Math.min(e,1),Math.max(s,t.length))}if(wt||ni(t),kt(m.xAxis)&&(i=m.xAxis.categories.map((e,s)=>[e,t[s]])),j(m.xAxis)){let e=m.xAxis.min,s=m.xAxis.max,r=(s-e)/(t.length-1),p=[];for(let x=e;x<=s;x+=r)p.push(`${x}`);i=p.map((x,A)=>[x,t[A]])}return i}a(Rt,"transformDataWithoutCategory");function Dt(t){return At[t===0?0:t%At.length]}a(Dt,"getPlotColorFromPalette");function ri(t,i){let e=Rt(i);m.plots.push({type:"line",strokeFill:Dt(K),strokeWidth:2,data:e}),K++}a(ri,"setLineData");function oi(t,i){let e=Rt(i);m.plots.push({type:"bar",fill:Dt(K),data:e}),K++}a(oi,"setBarData");function hi(){if(m.plots.length===0)throw Error("No Plot to render, please provide a plot with some data");return m.title=gt(),Si.build(Z,m,J,Zt)}a(hi,"getDrawableElem");function li(){return J}a(li,"getChartThemeConfig");function ci(){return Z}a(ci,"getChartConfig");function ui(){return m}a(ui,"getXYChartData");var _i=a(function(){zt(),K=0,Z=St(),m=_t(),J=Ct(),At=J.plotColorPalette.split(",").map(t=>t.trim()),at=!1,wt=!1},"clear"),Ti={getDrawableElem:hi,clear:_i,setAccTitle:Ft,getAccTitle:Ot,setDiagramTitle:Yt,getDiagramTitle:gt,getAccDescription:Nt,setAccDescription:Xt,setOrientation:ti,setXAxisTitle:ii,setXAxisRangeData:Tt,setXAxisBand:ei,setYAxisTitle:si,setYAxisRangeData:ai,setLineData:ri,setBarData:oi,setTmpSVGG:Jt,getChartThemeConfig:li,getChartConfig:ci,getXYChartData:ui},Ri=a((t,i,e,s)=>{let r=s.db,p=r.getChartThemeConfig(),x=r.getChartConfig(),A=r.getXYChartData().plots[0].data.map(f=>f[1]);function L(f){return f==="top"?"text-before-edge":"middle"}a(L,"getDominantBaseLine");function W(f){return f==="left"?"start":f==="right"?"end":"middle"}a(W,"getTextAnchor");function V(f){return`translate(${f.x}, ${f.y}) rotate(${f.rotation||0})`}a(V,"getTextTransformation"),ut.debug(`Rendering xychart chart +`+t);let T=Ht(i),E=T.append("g").attr("class","main"),z=E.append("rect").attr("width",x.width).attr("height",x.height).attr("class","background");Wt(T,x.height,x.width,!0),T.attr("viewBox",`0 0 ${x.width} ${x.height}`),z.attr("fill",p.backgroundColor),r.setTmpSVGG(T.append("g").attr("class","mermaid-tmp-group"));let F=r.getDrawableElem(),R={};function M(f){let D=E,h="";for(let[B]of f.entries()){let v=E;B>0&&R[h]&&(v=R[h]),h+=f[B],D=R[h],D||(D=R[h]=v.append("g").attr("class",f[B]))}return D}a(M,"getGroup");for(let f of F){if(f.data.length===0)continue;let D=M(f.groupTexts);switch(f.type){case"rect":if(D.selectAll("rect").data(f.data).enter().append("rect").attr("x",h=>h.x).attr("y",h=>h.y).attr("width",h=>h.width).attr("height",h=>h.height).attr("fill",h=>h.fill).attr("stroke",h=>h.strokeFill).attr("stroke-width",h=>h.strokeWidth),x.showDataLabel)if(x.chartOrientation==="horizontal"){let h=function(c,C){let{data:_,label:w}=c;return C*w.length*B<=_.width-10};var O=h;a(h,"fitsHorizontally");let B=.7,v=f.data.map((c,C)=>({data:c,label:A[C].toString()})).filter(c=>c.data.width>0&&c.data.height>0),b=v.map(c=>{let{data:C}=c,_=C.height*.7;for(;!h(c,_)&&_>0;)_-=1;return _}),H=Math.floor(Math.min(...b));D.selectAll("text").data(v).enter().append("text").attr("x",c=>c.data.x+c.data.width-10).attr("y",c=>c.data.y+c.data.height/2).attr("text-anchor","end").attr("dominant-baseline","middle").attr("fill","black").attr("font-size",`${H}px`).text(c=>c.label)}else{let h=function(c,C,_){let{data:w,label:U}=c,o=C*U.length*.7,l=w.x+w.width/2,u=l-o/2,g=l+o/2,y=u>=w.x&&g<=w.x+w.width,n=w.y+_+C<=w.y+w.height;return y&&n};var X=h;a(h,"fitsInBar");let B=10,v=f.data.map((c,C)=>({data:c,label:A[C].toString()})).filter(c=>c.data.width>0&&c.data.height>0),b=v.map(c=>{let{data:C,label:_}=c,w=C.width/(_.length*.7);for(;!h(c,w,B)&&w>0;)w-=1;return w}),H=Math.floor(Math.min(...b));D.selectAll("text").data(v).enter().append("text").attr("x",c=>c.data.x+c.data.width/2).attr("y",c=>c.data.y+B).attr("text-anchor","middle").attr("dominant-baseline","hanging").attr("fill","black").attr("font-size",`${H}px`).text(c=>c.label)}break;case"text":D.selectAll("text").data(f.data).enter().append("text").attr("x",0).attr("y",0).attr("fill",h=>h.fill).attr("font-size",h=>h.fontSize).attr("dominant-baseline",h=>L(h.verticalPos)).attr("text-anchor",h=>W(h.horizontalPos)).attr("transform",h=>V(h)).text(h=>h.text);break;case"path":D.selectAll("path").data(f.data).enter().append("path").attr("d",h=>h.path).attr("fill",h=>h.fill?h.fill:"none").attr("stroke",h=>h.strokeFill).attr("stroke-width",h=>h.strokeWidth);break}}},"draw"),Di={draw:Ri},zi={parser:pi,db:Ti,renderer:Di};export{zi as diagram}; diff --git a/src/google/adk/cli/browser/chunk-JDPVSVO4.js b/src/google/adk/cli/browser/chunk-JDPVSVO4.js new file mode 100644 index 0000000000..ecf7c3c02e --- /dev/null +++ b/src/google/adk/cli/browser/chunk-JDPVSVO4.js @@ -0,0 +1 @@ +import{a as b}from"./chunk-XMBKBASC.js";import{$ as B,A as W,C as I,J as E,K as F,L as y,M as P,N as G,Q as V,R as x,S as R,U as Er,W as O,aa as Q,d as g,f as vr,i as K,k as _r,m as T,p as f,s as N,t as D,v,x as wr,y as br}from"./chunk-ASJUXEUE.js";import{V as Y,e as mr,l as M}from"./chunk-EGBSMT36.js";function k(r,e,n,t){var o;do o=B(t);while(r.hasNode(o));return n.dummy=e,r.setNode(o,n),o}function yr(r){var e=new b().setGraph(r.graph());return f(r.nodes(),function(n){e.setNode(n,r.node(n))}),f(r.edges(),function(n){var t=e.edge(n.v,n.w)||{weight:0,minlen:1},o=r.edge(n);e.setEdge(n.v,n.w,{weight:t.weight+o.weight,minlen:Math.max(t.minlen,o.minlen)})}),e}function q(r){var e=new b({multigraph:r.isMultigraph()}).setGraph(r.graph());return f(r.nodes(),function(n){r.children(n).length||e.setNode(n,r.node(n))}),f(r.edges(),function(n){e.setEdge(n,r.edge(n))}),e}function Z(r,e){var n=r.x,t=r.y,o=e.x-n,a=e.y-t,i=r.width/2,s=r.height/2;if(!o&&!a)throw new Error("Not possible to find intersection inside of the rectangle");var u,d;return Math.abs(a)*i>Math.abs(o)*s?(a<0&&(s=-s),u=s*o/a,d=s):(o<0&&(i=-i),u=i,d=i*a/o),{x:n+u,y:t+d}}function L(r){var e=v(x(rr(r)+1),function(){return[]});return f(r.nodes(),function(n){var t=r.node(n),o=t.rank;E(o)||(e[o][t.order]=n)}),e}function xr(r){var e=P(v(r.nodes(),function(n){return r.node(n).rank}));f(r.nodes(),function(n){var t=r.node(n);W(t,"rank")&&(t.rank-=e)})}function kr(r){var e=P(v(r.nodes(),function(a){return r.node(a).rank})),n=[];f(r.nodes(),function(a){var i=r.node(a).rank-e;n[i]||(n[i]=[]),n[i].push(a)});var t=0,o=r.graph().nodeRankFactor;f(n,function(a,i){E(a)&&i%o!==0?--t:t&&f(a,function(s){r.node(s).rank+=t})})}function $(r,e,n,t){var o={width:0,height:0};return arguments.length>=4&&(o.rank=n,o.order=t),k(r,"border",o,e)}function rr(r){return y(v(r.nodes(),function(e){var n=r.node(e).rank;if(!E(n))return n}))}function gr(r,e){var n={lhs:[],rhs:[]};return f(r,function(t){e(t)?n.lhs.push(t):n.rhs.push(t)}),n}function Nr(r,e){var n=K();try{return e()}finally{console.log(r+" time: "+(K()-n)+"ms")}}function Or(r,e){return e()}function Pr(r){function e(n){var t=r.children(n),o=r.node(n);if(t.length&&f(t,e),Object.prototype.hasOwnProperty.call(o,"minRank")){o.borderLeft=[],o.borderRight=[];for(var a=o.minRank,i=o.maxRank+1;a0;--s)if(i=e[s].dequeue(),i){t=t.concat(tr(r,e,n,i,!0));break}}}return t}function tr(r,e,n,t,o){var a=o?[]:void 0;return f(r.inEdges(t.v),function(i){var s=r.edge(i),u=r.node(i.v);o&&a.push({v:i.v,w:i.w}),u.out-=s,or(e,n,u)}),f(r.outEdges(t.v),function(i){var s=r.edge(i),u=i.w,d=r.node(u);d.in-=s,or(e,n,d)}),r.removeNode(t.v),a}function be(r,e){var n=new b,t=0,o=0;f(r.nodes(),function(s){n.setNode(s,{v:s,in:0,out:0})}),f(r.edges(),function(s){var u=n.edge(s.v,s.w)||0,d=e(s),c=u+d;n.setEdge(s.v,s.w,c),o=Math.max(o,n.node(s.v).out+=d),t=Math.max(t,n.node(s.w).in+=d)});var a=x(o+t+3).map(function(){return new X}),i=t+1;return f(n.nodes(),function(s){or(a,i,n.node(s))}),{graph:n,buckets:a,zeroIdx:i}}function or(r,e,n){n.out?n.in?r[n.out-n.in+e].enqueue(n):r[r.length-1].enqueue(n):r[0].enqueue(n)}function Mr(r){var e=r.graph().acyclicer==="greedy"?Sr(r,n(r)):Ee(r);f(e,function(t){var o=r.edge(t);r.removeEdge(t),o.forwardName=t.name,o.reversed=!0,r.setEdge(t.w,t.v,o,B("rev"))});function n(t){return function(o){return t.edge(o).weight}}}function Ee(r){var e=[],n={},t={};function o(a){Object.prototype.hasOwnProperty.call(t,a)||(t[a]=!0,n[a]=!0,f(r.outEdges(a),function(i){Object.prototype.hasOwnProperty.call(n,i.w)?e.push(i):o(i.w)}),delete n[a])}return f(r.nodes(),o),e}function Fr(r){f(r.edges(),function(e){var n=r.edge(e);if(n.reversed){r.removeEdge(e);var t=n.forwardName;delete n.reversed,delete n.forwardName,r.setEdge(e.w,e.v,n,t)}})}function Vr(r){r.graph().dummyChains=[],f(r.edges(),function(e){ye(r,e)})}function ye(r,e){var n=e.v,t=r.node(n).rank,o=e.w,a=r.node(o).rank,i=e.name,s=r.edge(e),u=s.labelRank;if(a!==t+1){r.removeEdge(e);var d=void 0,c,h;for(h=0,++t;ti.lim&&(s=i,u=!0);var d=N(e.edges(),function(c){return u===Yr(r,r.node(c.v),s)&&u!==Yr(r,r.node(c.w),s)});return G(d,function(c){return S(e,c)})}function Xr(r,e,n,t){var o=n.v,a=n.w;r.removeEdge(o,a),r.setEdge(t.v,t.w,{}),ur(r),fr(r,e),Ce(r,e)}function Ce(r,e){var n=D(r.nodes(),function(o){return!e.node(o).parent}),t=sr(r,n);t=t.slice(1),f(t,function(o){var a=r.node(o).parent,i=e.edge(o,a),s=!1;i||(i=e.edge(a,o),s=!0),e.node(o).rank=e.node(a).rank+(s?i.minlen:-i.minlen)})}function je(r,e,n){return r.hasEdge(e,n)}function Yr(r,e,n){return n.low<=e.lim&&e.lim<=n.lim}function dr(r){switch(r.graph().ranker){case"network-simplex":Hr(r);break;case"tight-tree":Re(r);break;case"longest-path":Te(r);break;default:Hr(r)}}var Te=z;function Re(r){z(r),H(r)}function Hr(r){j(r)}function Jr(r){var e=k(r,"root",{},"_root"),n=Se(r),t=y(I(n))-1,o=2*t+1;r.graph().nestingRoot=e,f(r.edges(),function(i){r.edge(i).minlen*=o});var a=Me(r)+1;f(r.children(),function(i){Kr(r,e,o,a,t,n,i)}),r.graph().nodeRankFactor=o}function Kr(r,e,n,t,o,a,i){var s=r.children(i);if(!s.length){i!==e&&r.setEdge(e,i,{weight:0,minlen:n});return}var u=$(r,"_bt"),d=$(r,"_bb"),c=r.node(i);r.setParent(u,i),c.borderTop=u,r.setParent(d,i),c.borderBottom=d,f(s,function(h){Kr(r,e,n,t,o,a,h);var l=r.node(h),p=l.borderTop?l.borderTop:h,m=l.borderBottom?l.borderBottom:h,w=l.borderTop?t:2*t,A=p!==m?1:o-a[i]+1;r.setEdge(u,p,{weight:w,minlen:A,nestingEdge:!0}),r.setEdge(m,d,{weight:w,minlen:A,nestingEdge:!0})}),r.parent(i)||r.setEdge(e,u,{weight:0,minlen:o+a[i]})}function Se(r){var e={};function n(t,o){var a=r.children(t);a&&a.length&&f(a,function(i){n(i,o+1)}),e[t]=o}return f(r.children(),function(t){n(t,1)}),e}function Me(r){return R(r.edges(),function(e,n){return e+r.edge(n).weight},0)}function Qr(r){var e=r.graph();r.removeNode(e.nestingRoot),delete e.nestingRoot,f(r.edges(),function(n){var t=r.edge(n);t.nestingEdge&&r.removeEdge(n)})}function Zr(r,e,n){var t={},o;f(n,function(a){for(var i=r.parent(a),s,u;i;){if(s=r.parent(i),s?(u=t[s],t[s]=i):(u=o,o=i),u&&u!==i){e.setEdge(u,i);return}i=s}})}function $r(r,e,n){var t=Ge(r),o=new b({compound:!0}).setGraph({root:t}).setDefaultNodeLabel(function(a){return r.node(a)});return f(r.nodes(),function(a){var i=r.node(a),s=r.parent(a);(i.rank===e||i.minRank<=e&&e<=i.maxRank)&&(o.setNode(a),o.setParent(a,s||t),f(r[n](a),function(u){var d=u.v===a?u.w:u.v,c=o.edge(d,a),h=E(c)?0:c.weight;o.setEdge(d,a,{weight:r.edge(u).weight+h})}),Object.prototype.hasOwnProperty.call(i,"minRank")&&o.setNode(a,{borderLeft:i.borderLeft[e],borderRight:i.borderRight[e]}))}),o}function Ge(r){for(var e;r.hasNode(e=B("_root")););return e}function re(r,e){for(var n=0,t=1;t0;)c%2&&(h+=s[c+1]),c=c-1>>1,s[c]+=d.weight;u+=d.weight*h})),u}function ee(r){var e={},n=N(r.nodes(),function(s){return!r.children(s).length}),t=y(v(n,function(s){return r.node(s).rank})),o=v(x(t+1),function(){return[]});function a(s){if(!W(e,s)){e[s]=!0;var u=r.node(s);o[u.rank].push(s),f(r.successors(s),a)}}var i=O(n,function(s){return r.node(s).rank});return f(i,a),o}function ne(r,e){return v(e,function(n){var t=r.inEdges(n);if(t.length){var o=R(t,function(a,i){var s=r.edge(i),u=r.node(i.v);return{sum:a.sum+s.weight*u.order,weight:a.weight+s.weight}},{sum:0,weight:0});return{v:n,barycenter:o.sum/o.weight,weight:o.weight}}else return{v:n}})}function te(r,e){var n={};f(r,function(o,a){var i=n[o.v]={indegree:0,in:[],out:[],vs:[o.v],i:a};E(o.barycenter)||(i.barycenter=o.barycenter,i.weight=o.weight)}),f(e.edges(),function(o){var a=n[o.v],i=n[o.w];!E(a)&&!E(i)&&(i.indegree++,a.out.push(n[o.w]))});var t=N(n,function(o){return!o.indegree});return Be(t)}function Be(r){var e=[];function n(a){return function(i){i.merged||(E(i.barycenter)||E(a.barycenter)||i.barycenter>=a.barycenter)&&Ae(a,i)}}function t(a){return function(i){i.in.push(a),--i.indegree===0&&r.push(i)}}for(;r.length;){var o=r.pop();e.push(o),f(o.in.reverse(),n(o)),f(o.out,t(o))}return v(N(e,function(a){return!a.merged}),function(a){return V(a,["vs","i","barycenter","weight"])})}function Ae(r,e){var n=0,t=0;r.weight&&(n+=r.barycenter*r.weight,t+=r.weight),e.weight&&(n+=e.barycenter*e.weight,t+=e.weight),r.vs=e.vs.concat(r.vs),r.barycenter=n/t,r.weight=t,r.i=Math.min(e.i,r.i),e.merged=!0}function ae(r,e){var n=gr(r,function(c){return Object.prototype.hasOwnProperty.call(c,"barycenter")}),t=n.lhs,o=O(n.rhs,function(c){return-c.i}),a=[],i=0,s=0,u=0;t.sort(De(!!e)),u=oe(a,o,u),f(t,function(c){u+=c.vs.length,a.push(c.vs),i+=c.barycenter*c.weight,s+=c.weight,u=oe(a,o,u)});var d={vs:g(a)};return s&&(d.barycenter=i/s,d.weight=s),d}function oe(r,e,n){for(var t;e.length&&(t=T(e)).i<=n;)e.pop(),r.push(t.vs),n++;return n}function De(r){return function(e,n){return e.barycentern.barycenter?1:r?n.i-e.i:e.i-n.i}}function cr(r,e,n,t){var o=r.children(e),a=r.node(e),i=a?a.borderLeft:void 0,s=a?a.borderRight:void 0,u={};i&&(o=N(o,function(m){return m!==i&&m!==s}));var d=ne(r,o);f(d,function(m){if(r.children(m.v).length){var w=cr(r,m.v,n,t);u[m.v]=w,Object.prototype.hasOwnProperty.call(w,"barycenter")&&ze(m,w)}});var c=te(d,n);Ye(c,u);var h=ae(c,t);if(i&&(h.vs=g([i,h.vs,s]),r.predecessors(i).length)){var l=r.node(r.predecessors(i)[0]),p=r.node(r.predecessors(s)[0]);Object.prototype.hasOwnProperty.call(h,"barycenter")||(h.barycenter=0,h.weight=0),h.barycenter=(h.barycenter*h.weight+l.order+p.order)/(h.weight+2),h.weight+=2}return h}function Ye(r,e){f(r,function(n){n.vs=g(n.vs.map(function(t){return e[t]?e[t].vs:t}))})}function ze(r,e){E(r.barycenter)?(r.barycenter=e.barycenter,r.weight=e.weight):(r.barycenter=(r.barycenter*r.weight+e.barycenter*e.weight)/(r.weight+e.weight),r.weight+=e.weight)}function fe(r){var e=rr(r),n=ie(r,x(1,e+1),"inEdges"),t=ie(r,x(e-1,-1,-1),"outEdges"),o=ee(r);se(r,o);for(var a=Number.POSITIVE_INFINITY,i,s=0,u=0;u<4;++s,++u){Ue(s%2?n:t,s%4>=2),o=L(r);var d=re(r,o);di||s>e[u].lim));for(d=u,u=t;(u=r.parent(u))!==d;)a.push(u);return{path:o.concat(a.reverse()),lca:d}}function qe(r){var e={},n=0;function t(o){var a=n;f(r.children(o),t),e[o]={low:a,lim:n++}}return f(r.children(),t),e}function Xe(r,e){var n={};function t(o,a){var i=0,s=0,u=o.length,d=T(a);return f(a,function(c,h){var l=Je(r,c),p=l?r.node(l).order:u;(l||c===d)&&(f(a.slice(s,h+1),function(m){f(r.predecessors(m),function(w){var A=r.node(w),pr=A.order;(prd)&&de(n,l,c)})})}function o(a,i){var s=-1,u,d=0;return f(i,function(c,h){if(r.node(c).dummy==="border"){var l=r.predecessors(c);l.length&&(u=r.node(l[0]).order,t(i,d,h,s,u),d=h,s=u)}t(i,d,i.length,u,a.length)}),i}return R(e,o),n}function Je(r,e){if(r.node(e).dummy)return D(r.predecessors(e),function(n){return r.node(n).dummy})}function de(r,e,n){if(e>n){var t=e;e=n,n=t}Object.prototype.hasOwnProperty.call(r,e)||Object.defineProperty(r,e,{enumerable:!0,configurable:!0,value:{},writable:!0});var o=r[e];Object.defineProperty(o,n,{enumerable:!0,configurable:!0,value:!0,writable:!0})}function Ke(r,e,n){if(e>n){var t=e;e=n,n=t}return!!r[e]&&Object.prototype.hasOwnProperty.call(r[e],n)}function Qe(r,e,n,t){var o={},a={},i={};return f(e,function(s){f(s,function(u,d){o[u]=u,a[u]=u,i[u]=d})}),f(e,function(s){var u=-1;f(s,function(d){var c=t(d);if(c.length){c=O(c,function(w){return i[w]});for(var h=(c.length-1)/2,l=Math.floor(h),p=Math.ceil(h);l<=p;++l){var m=c[l];a[d]===d&&u{var t=n(" buildLayoutGraph",()=>wn(r));n(" runLayout",()=>fn(t,n)),n(" updateInputGraph",()=>un(r,t))})}function fn(r,e){e(" makeSpaceForEdgeLabels",()=>bn(r)),e(" removeSelfEdges",()=>Pn(r)),e(" acyclic",()=>Mr(r)),e(" nestingGraph.run",()=>Jr(r)),e(" rank",()=>dr(q(r))),e(" injectEdgeLabelProxies",()=>En(r)),e(" removeEmptyRanks",()=>kr(r)),e(" nestingGraph.cleanup",()=>Qr(r)),e(" normalizeRanks",()=>xr(r)),e(" assignRankMinMax",()=>yn(r)),e(" removeEdgeLabelProxies",()=>xn(r)),e(" normalize.run",()=>Vr(r)),e(" parentDummyChains",()=>ue(r)),e(" addBorderSegments",()=>Pr(r)),e(" order",()=>fe(r)),e(" insertSelfEdges",()=>Ln(r)),e(" adjustCoordinateSystem",()=>Cr(r)),e(" position",()=>he(r)),e(" positionSelfEdges",()=>Cn(r)),e(" removeBorderNodes",()=>In(r)),e(" normalize.undo",()=>Br(r)),e(" fixupEdgeLabelCoords",()=>Nn(r)),e(" undoCoordinateSystem",()=>jr(r)),e(" translateGraph",()=>kn(r)),e(" assignNodeIntersects",()=>gn(r)),e(" reversePoints",()=>On(r)),e(" acyclic.undo",()=>Fr(r))}function un(r,e){f(r.nodes(),function(n){var t=r.node(n),o=e.node(n);t&&(t.x=o.x,t.y=o.y,e.children(n).length&&(t.width=o.width,t.height=o.height))}),f(r.edges(),function(n){var t=r.edge(n),o=e.edge(n);t.points=o.points,Object.prototype.hasOwnProperty.call(o,"x")&&(t.x=o.x,t.y=o.y)}),r.graph().width=e.graph().width,r.graph().height=e.graph().height}var dn=["nodesep","edgesep","ranksep","marginx","marginy"],cn={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},hn=["acyclicer","ranker","rankdir","align"],ln=["width","height"],pn={width:0,height:0},mn=["minlen","weight","width","height","labeloffset"],vn={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},_n=["labelpos"];function wn(r){var e=new b({multigraph:!0,compound:!0}),n=lr(r.graph());return e.setGraph(Y({},cn,hr(n,dn),V(n,hn))),f(r.nodes(),function(t){var o=lr(r.node(t));e.setNode(t,_r(hr(o,ln),pn)),e.setParent(t,r.parent(t))}),f(r.edges(),function(t){var o=lr(r.edge(t));e.setEdge(t,Y({},vn,hr(o,mn),V(o,_n)))}),e}function bn(r){var e=r.graph();e.ranksep/=2,f(r.edges(),function(n){var t=r.edge(n);t.minlen*=2,t.labelpos.toLowerCase()!=="c"&&(e.rankdir==="TB"||e.rankdir==="BT"?t.width+=t.labeloffset:t.height+=t.labeloffset)})}function En(r){f(r.edges(),function(e){var n=r.edge(e);if(n.width&&n.height){var t=r.node(e.v),o=r.node(e.w),a={rank:(o.rank-t.rank)/2+t.rank,e};k(r,"edge-proxy",a,"_ep")}})}function yn(r){var e=0;f(r.nodes(),function(n){var t=r.node(n);t.borderTop&&(t.minRank=r.node(t.borderTop).rank,t.maxRank=r.node(t.borderBottom).rank,e=y(e,t.maxRank))}),r.graph().maxRank=e}function xn(r){f(r.nodes(),function(e){var n=r.node(e);n.dummy==="edge-proxy"&&(r.edge(n.e).labelRank=n.rank,r.removeNode(e))})}function kn(r){var e=Number.POSITIVE_INFINITY,n=0,t=Number.POSITIVE_INFINITY,o=0,a=r.graph(),i=a.marginx||0,s=a.marginy||0;function u(d){var c=d.x,h=d.y,l=d.width,p=d.height;e=Math.min(e,c-l/2),n=Math.max(n,c+l/2),t=Math.min(t,h-p/2),o=Math.max(o,h+p/2)}f(r.nodes(),function(d){u(r.node(d))}),f(r.edges(),function(d){var c=r.edge(d);Object.prototype.hasOwnProperty.call(c,"x")&&u(c)}),e-=i,t-=s,f(r.nodes(),function(d){var c=r.node(d);c.x-=e,c.y-=t}),f(r.edges(),function(d){var c=r.edge(d);f(c.points,function(h){h.x-=e,h.y-=t}),Object.prototype.hasOwnProperty.call(c,"x")&&(c.x-=e),Object.prototype.hasOwnProperty.call(c,"y")&&(c.y-=t)}),a.width=n-e+i,a.height=o-t+s}function gn(r){f(r.edges(),function(e){var n=r.edge(e),t=r.node(e.v),o=r.node(e.w),a,i;n.points?(a=n.points[0],i=n.points[n.points.length-1]):(n.points=[],a=o,i=t),n.points.unshift(Z(t,a)),n.points.push(Z(o,i))})}function Nn(r){f(r.edges(),function(e){var n=r.edge(e);if(Object.prototype.hasOwnProperty.call(n,"x"))switch((n.labelpos==="l"||n.labelpos==="r")&&(n.width-=n.labeloffset),n.labelpos){case"l":n.x-=n.width/2+n.labeloffset;break;case"r":n.x+=n.width/2+n.labeloffset;break}})}function On(r){f(r.edges(),function(e){var n=r.edge(e);n.reversed&&n.points.reverse()})}function In(r){f(r.nodes(),function(e){if(r.children(e).length){var n=r.node(e),t=r.node(n.borderTop),o=r.node(n.borderBottom),a=r.node(T(n.borderLeft)),i=r.node(T(n.borderRight));n.width=Math.abs(i.x-a.x),n.height=Math.abs(o.y-t.y),n.x=a.x+n.width/2,n.y=t.y+n.height/2}}),f(r.nodes(),function(e){r.node(e).dummy==="border"&&r.removeNode(e)})}function Pn(r){f(r.edges(),function(e){if(e.v===e.w){var n=r.node(e.v);n.selfEdges||(n.selfEdges=[]),n.selfEdges.push({e,label:r.edge(e)}),r.removeEdge(e)}})}function Ln(r){var e=L(r);f(e,function(n){var t=0;f(n,function(o,a){var i=r.node(o);i.order=a+t,f(i.selfEdges,function(s){k(r,"selfedge",{width:s.label.width,height:s.label.height,rank:i.rank,order:a+ ++t,e:s.e,label:s.label},"_se")}),delete i.selfEdges})})}function Cn(r){f(r.nodes(),function(e){var n=r.node(e);if(n.dummy==="selfedge"){var t=r.node(n.e.v),o=t.x+t.width/2,a=t.y,i=n.x-o,s=t.height/2;r.setEdge(n.e,n.label),r.removeNode(e),n.label.points=[{x:o+2*i/3,y:a-s},{x:o+5*i/6,y:a-s},{x:o+i,y:a},{x:o+5*i/6,y:a+s},{x:o+2*i/3,y:a+s}],n.label.x=n.x,n.label.y=n.y}})}function hr(r,e){return F(V(r,e),Number)}function lr(r){var e={};return f(r,function(n,t){e[t.toLowerCase()]=n}),e}export{sn as a}; diff --git a/src/google/adk/cli/browser/chunk-JHZIBEJC.js b/src/google/adk/cli/browser/chunk-JHZIBEJC.js new file mode 100644 index 0000000000..eb52947847 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-JHZIBEJC.js @@ -0,0 +1 @@ +import{g as y}from"./chunk-JRNAXTJ7.js";var A=y((t,r)=>{if(r)return"translate("+-t.width/2+", "+-t.height/2+")";let s=t.x??0,e=t.y??0;return"translate("+-(s+t.width/2)+", "+-(e+t.height/2)+")"},"computeLabelTransform"),c={aggregation:17.25,extension:17.25,composition:17.25,dependency:6,lollipop:13.5,arrow_point:4},M={arrow_point:9,arrow_cross:12.5,arrow_circle:12.5};function w(t,r){if(t===void 0||r===void 0)return{angle:0,deltaX:0,deltaY:0};t=n(t),r=n(r);let[s,e]=[t.x,t.y],[a,i]=[r.x,r.y],o=a-s,x=i-e;return{angle:Math.atan(x/o),deltaX:o,deltaY:x}}y(w,"calculateDeltaAndAngle");var n=y(t=>Array.isArray(t)?{x:t[0],y:t[1]}:t,"pointTransformer"),m=y(t=>({x:y(function(r,s,e){let a=0,i=n(e[0]).x=0?1:-1)}else if(s===e.length-1&&Object.hasOwn(c,t.arrowTypeEnd)){let{angle:l,deltaX:g}=w(e[e.length-1],e[e.length-2]);a=c[t.arrowTypeEnd]*Math.cos(l)*(g>=0?1:-1)}let o=Math.abs(n(r).x-n(e[e.length-1]).x),x=Math.abs(n(r).y-n(e[e.length-1]).y),f=Math.abs(n(r).x-n(e[0]).x),d=Math.abs(n(r).y-n(e[0]).y),h=c[t.arrowTypeStart],u=c[t.arrowTypeEnd],p=1;if(o0&&x0&&d=0?1:-1)}else if(s===e.length-1&&Object.hasOwn(c,t.arrowTypeEnd)){let{angle:l,deltaY:g}=w(e[e.length-1],e[e.length-2]);a=c[t.arrowTypeEnd]*Math.abs(Math.sin(l))*(g>=0?1:-1)}let o=Math.abs(n(r).y-n(e[e.length-1]).y),x=Math.abs(n(r).x-n(e[e.length-1]).x),f=Math.abs(n(r).y-n(e[0]).y),d=Math.abs(n(r).x-n(e[0]).x),h=c[t.arrowTypeStart],u=c[t.arrowTypeEnd],p=1;if(o0&&x0&&dnew v,"TokenBuilder"),ValueConverter:e(()=>new l,"ValueConverter")}};function M(c=n){let r=a(d(c),i),t=a(o({shared:r}),u,R);return r.ServiceRegistry.register(t),{shared:r,Radar:t}}e(M,"createRadarServices");export{R as a,M as b}; diff --git a/src/google/adk/cli/browser/chunk-JRNAXTJ7.js b/src/google/adk/cli/browser/chunk-JRNAXTJ7.js new file mode 100644 index 0000000000..876bde5cc7 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-JRNAXTJ7.js @@ -0,0 +1 @@ +import{e as gu,h as _u}from"./chunk-RMXJBC7V.js";var Xo=gu((Rr,Pr)=>{"use strict";(function(t,e){typeof Rr=="object"&&typeof Pr<"u"?Pr.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs=e()})(Rr,function(){"use strict";var t=1e3,e=6e4,n=36e5,r="millisecond",i="second",o="minute",a="hour",s="day",f="week",u="month",c="quarter",p="year",l="date",m="Invalid Date",T=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,S=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,A={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(b){var _=["th","st","nd","rd"],h=b%100;return"["+b+(_[(h-20)%10]||_[h]||_[0])+"]"}},w=function(b,_,h){var g=String(b);return!g||g.length>=_?b:""+Array(_+1-g.length).join(h)+b},R={s:w,z:function(b){var _=-b.utcOffset(),h=Math.abs(_),g=Math.floor(h/60),d=h%60;return(_<=0?"+":"-")+w(g,2,"0")+":"+w(d,2,"0")},m:function b(_,h){if(_.date()1)return b(M[0])}else{var N=_.name;x[N]=_,d=N}return!g&&d&&(E=d),d||!g&&E},P=function(b,_){if(y(b))return b.clone();var h=typeof _=="object"?_:{};return h.date=b,h.args=arguments,new B(h)},I=R;I.l=O,I.i=y,I.w=function(b,_){return P(b,{locale:_.$L,utc:_.$u,x:_.$x,$offset:_.$offset})};var B=(function(){function b(h){this.$L=O(h.locale,null,!0),this.parse(h),this.$x=this.$x||h.x||{},this[$]=!0}var _=b.prototype;return _.parse=function(h){this.$d=(function(g){var d=g.date,v=g.utc;if(d===null)return new Date(NaN);if(I.u(d))return new Date;if(d instanceof Date)return new Date(d);if(typeof d=="string"&&!/Z$/i.test(d)){var M=d.match(T);if(M){var N=M[2]-1||0,D=(M[7]||"0").substring(0,3);return v?new Date(Date.UTC(M[1],N,M[3]||1,M[4]||0,M[5]||0,M[6]||0,D)):new Date(M[1],N,M[3]||1,M[4]||0,M[5]||0,M[6]||0,D)}}return new Date(d)})(h),this.init()},_.init=function(){var h=this.$d;this.$y=h.getFullYear(),this.$M=h.getMonth(),this.$D=h.getDate(),this.$W=h.getDay(),this.$H=h.getHours(),this.$m=h.getMinutes(),this.$s=h.getSeconds(),this.$ms=h.getMilliseconds()},_.$utils=function(){return I},_.isValid=function(){return this.$d.toString()!==m},_.isSame=function(h,g){var d=P(h);return this.startOf(g)<=d&&d<=this.endOf(g)},_.isAfter=function(h,g){return P(h)=E&&(E=R+1);!($=A[E])&&++E=0;)(a=r[i])&&(o&&a.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(a,o),o=a);return this}function Ii(t){t||(t=Eu);function e(p,l){return p&&l?t(p.__data__,l.__data__):!p-!l}for(var n=this._groups,r=n.length,i=new Array(r),o=0;oe?1:t>=e?0:NaN}function Ri(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function Pi(){return Array.from(this)}function Yi(){for(var t=this._groups,e=0,n=t.length;e=0&&(e=t.slice(0,n))!=="xmlns"&&(t=t.slice(n+1)),gr.hasOwnProperty(e)?{space:gr[e],local:t}:t}function Ou(t){return function(){this.removeAttribute(t)}}function Iu(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Ru(t,e){return function(){this.setAttribute(t,e)}}function Pu(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function Yu(t,e){return function(){var n=e.apply(this,arguments);n==null?this.removeAttribute(t):this.setAttribute(t,n)}}function Fu(t,e){return function(){var n=e.apply(this,arguments);n==null?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function Li(t,e){var n=Ct(t);if(arguments.length<2){var r=this.node();return n.local?r.getAttributeNS(n.space,n.local):r.getAttribute(n)}return this.each((e==null?n.local?Iu:Ou:typeof e=="function"?n.local?Fu:Yu:n.local?Pu:Ru)(n,e))}function wn(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function Uu(t){return function(){this.style.removeProperty(t)}}function zu(t,e,n){return function(){this.style.setProperty(t,e,n)}}function Lu(t,e,n){return function(){var r=e.apply(this,arguments);r==null?this.style.removeProperty(t):this.style.setProperty(t,r,n)}}function Bi(t,e,n){return arguments.length>1?this.each((e==null?Uu:typeof e=="function"?Lu:zu)(t,e,n??"")):Rt(this.node(),t)}function Rt(t,e){return t.style.getPropertyValue(e)||wn(t).getComputedStyle(t,null).getPropertyValue(e)}function Bu(t){return function(){delete this[t]}}function Hu(t,e){return function(){this[t]=e}}function qu(t,e){return function(){var n=e.apply(this,arguments);n==null?delete this[t]:this[t]=n}}function Hi(t,e){return arguments.length>1?this.each((e==null?Bu:typeof e=="function"?qu:Hu)(t,e)):this.node()[t]}function qi(t){return t.trim().split(/^|\s+/)}function _r(t){return t.classList||new Wi(t)}function Wi(t){this._node=t,this._names=qi(t.getAttribute("class")||"")}Wi.prototype={add:function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function Vi(t,e){for(var n=_r(t),r=-1,i=e.length;++r=0&&(n=e.slice(r+1),e=e.slice(0,r)),{type:e,name:n}})}function cf(t){return function(){var e=this.__on;if(e){for(var n=0,r=-1,i=e.length,o;n>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?Mn(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?Mn(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=gf.exec(t))?new rt(e[1],e[2],e[3],1):(e=_f.exec(t))?new rt(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=yf.exec(t))?Mn(e[1],e[2],e[3],e[4]):(e=vf.exec(t))?Mn(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=wf.exec(t))?go(e[1],e[2]/100,e[3]/100,1):(e=bf.exec(t))?go(e[1],e[2]/100,e[3]/100,e[4]):lo.hasOwnProperty(t)?po(lo[t]):t==="transparent"?new rt(NaN,NaN,NaN,0):null}function po(t){return new rt(t>>16&255,t>>8&255,t&255,1)}function Mn(t,e,n,r){return r<=0&&(t=e=n=NaN),new rt(t,e,n,r)}function wr(t){return t instanceof Pt||(t=_t(t)),t?(t=t.rgb(),new rt(t.r,t.g,t.b,t.opacity)):new rt}function xe(t,e,n,r){return arguments.length===1?wr(t):new rt(t,e,n,r??1)}function rt(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}Gt(rt,xe,me(Pt,{brighter(t){return t=t==null?kn:Math.pow(kn,t),new rt(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?ze:Math.pow(ze,t),new rt(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new rt(Qt(this.r),Qt(this.g),Qt(this.b),Sn(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:mo,formatHex:mo,formatHex8:kf,formatRgb:xo,toString:xo}));function mo(){return`#${Zt(this.r)}${Zt(this.g)}${Zt(this.b)}`}function kf(){return`#${Zt(this.r)}${Zt(this.g)}${Zt(this.b)}${Zt((isNaN(this.opacity)?1:this.opacity)*255)}`}function xo(){let t=Sn(this.opacity);return`${t===1?"rgb(":"rgba("}${Qt(this.r)}, ${Qt(this.g)}, ${Qt(this.b)}${t===1?")":`, ${t})`}`}function Sn(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Qt(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Zt(t){return t=Qt(t),(t<16?"0":"")+t.toString(16)}function go(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new gt(t,e,n,r)}function yo(t){if(t instanceof gt)return new gt(t.h,t.s,t.l,t.opacity);if(t instanceof Pt||(t=_t(t)),!t)return new gt;if(t instanceof gt)return t;t=t.rgb();var e=t.r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),o=Math.max(e,n,r),a=NaN,s=o-i,f=(o+i)/2;return s?(e===o?a=(n-r)/s+(n0&&f<1?0:a,new gt(a,s,f,t.opacity)}function vo(t,e,n,r){return arguments.length===1?yo(t):new gt(t,e,n,r??1)}function gt(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}Gt(gt,vo,me(Pt,{brighter(t){return t=t==null?kn:Math.pow(kn,t),new gt(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?ze:Math.pow(ze,t),new gt(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new rt(vr(t>=240?t-240:t+120,i,r),vr(t,i,r),vr(t<120?t+240:t-120,i,r),this.opacity)},clamp(){return new gt(_o(this.h),Tn(this.s),Tn(this.l),Sn(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=Sn(this.opacity);return`${t===1?"hsl(":"hsla("}${_o(this.h)}, ${Tn(this.s)*100}%, ${Tn(this.l)*100}%${t===1?")":`, ${t})`}`}}));function _o(t){return t=(t||0)%360,t<0?t+360:t}function Tn(t){return Math.max(0,Math.min(1,t||0))}function vr(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}var wo=Math.PI/180,bo=180/Math.PI;var Cn=18,Mo=.96422,To=1,ko=.82521,So=4/29,ge=6/29,Co=3*ge*ge,Sf=ge*ge*ge;function No(t){if(t instanceof Mt)return new Mt(t.l,t.a,t.b,t.opacity);if(t instanceof Dt)return Do(t);t instanceof rt||(t=wr(t));var e=kr(t.r),n=kr(t.g),r=kr(t.b),i=br((.2225045*e+.7168786*n+.0606169*r)/To),o,a;return e===n&&n===r?o=a=i:(o=br((.4360747*e+.3850649*n+.1430804*r)/Mo),a=br((.0139322*e+.0971045*n+.7141733*r)/ko)),new Mt(116*i-16,500*(o-i),200*(i-a),t.opacity)}function Sr(t,e,n,r){return arguments.length===1?No(t):new Mt(t,e,n,r??1)}function Mt(t,e,n,r){this.l=+t,this.a=+e,this.b=+n,this.opacity=+r}Gt(Mt,Sr,me(Pt,{brighter(t){return new Mt(this.l+Cn*(t??1),this.a,this.b,this.opacity)},darker(t){return new Mt(this.l-Cn*(t??1),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;return e=Mo*Mr(e),t=To*Mr(t),n=ko*Mr(n),new rt(Tr(3.1338561*e-1.6168667*t-.4906146*n),Tr(-.9787684*e+1.9161415*t+.033454*n),Tr(.0719453*e-.2289914*t+1.4052427*n),this.opacity)}}));function br(t){return t>Sf?Math.pow(t,1/3):t/Co+So}function Mr(t){return t>ge?t*t*t:Co*(t-So)}function Tr(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function kr(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Cf(t){if(t instanceof Dt)return new Dt(t.h,t.c,t.l,t.opacity);if(t instanceof Mt||(t=No(t)),t.a===0&&t.b===0)return new Dt(NaN,0()=>t;function Ao(t,e){return function(n){return t+n*e}}function Nf(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}function $o(t,e){var n=e-t;return n?Ao(t,n>180||n<-180?n-360*Math.round(n/360):n):_e(isNaN(t)?e:t)}function Eo(t){return(t=+t)==1?At:function(e,n){return n-e?Nf(e,n,t):_e(isNaN(e)?n:e)}}function At(t,e){var n=e-t;return n?Ao(t,n):_e(isNaN(t)?e:t)}function Oo(t){return function(e,n){var r=t((e=Be(e)).h,(n=Be(n)).h),i=At(e.c,n.c),o=At(e.l,n.l),a=At(e.opacity,n.opacity);return function(s){return e.h=r(s),e.c=i(s),e.l=o(s),e.opacity=a(s),e+""}}}var Df=Oo($o),Af=Oo(At);function Cr(t,e,n,r,i){var o=t*t,a=o*t;return((1-3*t+3*o-a)*e+(4-6*o+3*a)*n+(1+3*t+3*o-3*a)*r+a*i)/6}function Io(t){var e=t.length-1;return function(n){var r=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),i=t[r],o=t[r+1],a=r>0?t[r-1]:2*i-o,s=rn&&(o=e.slice(n,o),s[a]?s[a]+=o:s[++a]=o),(r=r[0])===(i=i[0])?s[a]?s[a]+=i:s[++a]=i:(s[++a]=null,f.push({i:a,x:it(r,i)})),n=Nr.lastIndex;return n180?c+=360:c-u>180&&(u+=360),l.push({i:p.push(i(p)+"rotate(",null,r)-2,x:it(u,c)})):c&&p.push(i(p)+"rotate("+c+r)}function s(u,c,p,l){u!==c?l.push({i:p.push(i(p)+"skewX(",null,r)-2,x:it(u,c)}):c&&p.push(i(p)+"skewX("+c+r)}function f(u,c,p,l,m,T){if(u!==p||c!==l){var S=m.push(i(m)+"scale(",null,",",null,")");T.push({i:S-4,x:it(u,p)},{i:S-2,x:it(c,l)})}else(p!==1||l!==1)&&m.push(i(m)+"scale("+p+","+l+")")}return function(u,c){var p=[],l=[];return u=t(u),c=t(c),o(u.translateX,u.translateY,c.translateX,c.translateY,p,l),a(u.rotate,c.rotate,p,l),s(u.skewX,c.skewX,p,l),f(u.scaleX,u.scaleY,c.scaleX,c.scaleY,p,l),u=c=null,function(m){for(var T=-1,S=l.length,A;++TGo(t,"name",{value:e,configurable:!0}),H0=(t,e)=>{for(var n in e)Go(t,n,{get:e[n],enumerable:!0})},$t={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},mt={trace:Yt((...t)=>{},"trace"),debug:Yt((...t)=>{},"debug"),info:Yt((...t)=>{},"info"),warn:Yt((...t)=>{},"warn"),error:Yt((...t)=>{},"error"),fatal:Yt((...t)=>{},"fatal")},q0=Yt(function(t="fatal"){let e=$t.fatal;typeof t=="string"?t.toLowerCase()in $t&&(e=$t[t]):typeof t=="number"&&(e=t),mt.trace=()=>{},mt.debug=()=>{},mt.info=()=>{},mt.warn=()=>{},mt.error=()=>{},mt.fatal=()=>{},e<=$t.fatal&&(mt.fatal=console.error?console.error.bind(console,dt("FATAL"),"color: orange"):console.log.bind(console,"\x1B[35m",dt("FATAL"))),e<=$t.error&&(mt.error=console.error?console.error.bind(console,dt("ERROR"),"color: orange"):console.log.bind(console,"\x1B[31m",dt("ERROR"))),e<=$t.warn&&(mt.warn=console.warn?console.warn.bind(console,dt("WARN"),"color: orange"):console.log.bind(console,"\x1B[33m",dt("WARN"))),e<=$t.info&&(mt.info=console.info?console.info.bind(console,dt("INFO"),"color: lightblue"):console.log.bind(console,"\x1B[34m",dt("INFO"))),e<=$t.debug&&(mt.debug=console.debug?console.debug.bind(console,dt("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",dt("DEBUG"))),e<=$t.trace&&(mt.trace=console.debug?console.debug.bind(console,dt("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",dt("TRACE")))},"setLogLevel"),dt=Yt(t=>`%c${(0,Zo.default)().format("ss.SSS")} : ${t} : `,"format");function Qo(t,e){let n;if(e===void 0)for(let r of t)r!=null&&(n=r)&&(n=r);else{let r=-1;for(let i of t)(i=e(i,++r,t))!=null&&(n=i)&&(n=i)}return n}function Ko(t,e){let n;if(e===void 0)for(let r of t)r!=null&&(n>r||n===void 0&&r>=r)&&(n=r);else{let r=-1;for(let i of t)(i=e(i,++r,t))!=null&&(n>i||n===void 0&&i>=i)&&(n=i)}return n}function jt(t,e){return t==null||e==null?NaN:te?1:t>=e?0:NaN}function Yr(t,e){return t==null||e==null?NaN:et?1:e>=t?0:NaN}function te(t){let e,n,r;t.length!==2?(e=jt,n=(s,f)=>jt(t(s),f),r=(s,f)=>t(s)-f):(e=t===jt||t===Yr?t:Ff,n=t,r=t);function i(s,f,u=0,c=s.length){if(u>>1;n(s[p],f)<0?u=p+1:c=p}while(u>>1;n(s[p],f)<=0?u=p+1:c=p}while(uu&&r(s[p-1],f)>-r(s[p],f)?p-1:p}return{left:i,center:a,right:o}}function Ff(){return 0}function Fr(t){return t===null?NaN:+t}var Jo=te(jt),jo=Jo.right,Uf=Jo.left,zf=te(Fr).center,Ur=jo;var ye=class extends Map{constructor(e,n=Hf){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:n}}),e!=null)for(let[r,i]of e)this.set(r,i)}get(e){return super.get(ta(this,e))}has(e){return super.has(ta(this,e))}set(e,n){return super.set(Lf(this,e),n)}delete(e){return super.delete(Bf(this,e))}};function ta({_intern:t,_key:e},n){let r=e(n);return t.has(r)?t.get(r):n}function Lf({_intern:t,_key:e},n){let r=e(n);return t.has(r)?t.get(r):(t.set(r,n),n)}function Bf({_intern:t,_key:e},n){let r=e(n);return t.has(r)&&(n=t.get(r),t.delete(r)),n}function Hf(t){return t!==null&&typeof t=="object"?t.valueOf():t}var qf=Math.sqrt(50),Wf=Math.sqrt(10),Vf=Math.sqrt(2);function An(t,e,n){let r=(e-t)/Math.max(0,n),i=Math.floor(Math.log10(r)),o=r/Math.pow(10,i),a=o>=qf?10:o>=Wf?5:o>=Vf?2:1,s,f,u;return i<0?(u=Math.pow(10,-i)/a,s=Math.round(t*u),f=Math.round(e*u),s/ue&&--f,u=-u):(u=Math.pow(10,i)*a,s=Math.round(t/u),f=Math.round(e/u),s*ue&&--f),f0))return[];if(t===e)return[t];let r=e=i))return[];let s=o-i+1,f=new Array(s);if(r)if(a<0)for(let u=0;u+t(e)}function Qf(t,e){return e=Math.max(0,t.bandwidth()-e*2)/2,t.round()&&(e=Math.round(e)),n=>+t(n)+e}function Kf(){return!this.__axis}function ra(t,e){var n=[],r=null,i=null,o=6,a=6,s=3,f=typeof window<"u"&&window.devicePixelRatio>1?0:.5,u=t===In||t===On?-1:1,c=t===On||t===zr?"x":"y",p=t===In||t===Lr?Xf:Gf;function l(m){var T=r??(e.ticks?e.ticks.apply(e,n):e.domain()),S=i??(e.tickFormat?e.tickFormat.apply(e,n):ea),A=Math.max(o,0)+s,w=e.range(),R=+w[0]+f,E=+w[w.length-1]+f,x=(e.bandwidth?Qf:Zf)(e.copy(),f),$=m.selection?m.selection():m,y=$.selectAll(".domain").data([null]),O=$.selectAll(".tick").data(T,e).order(),P=O.exit(),I=O.enter().append("g").attr("class","tick"),B=O.select("line"),L=O.select("text");y=y.merge(y.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),O=O.merge(I),B=B.merge(I.append("line").attr("stroke","currentColor").attr(c+"2",u*o)),L=L.merge(I.append("text").attr("fill","currentColor").attr(c,u*A).attr("dy",t===In?"0em":t===Lr?"0.71em":"0.32em")),m!==$&&(y=y.transition(m),O=O.transition(m),B=B.transition(m),L=L.transition(m),P=P.transition(m).attr("opacity",na).attr("transform",function(b){return isFinite(b=x(b))?p(b+f):this.getAttribute("transform")}),I.attr("opacity",na).attr("transform",function(b){var _=this.parentNode.__axis;return p((_&&isFinite(_=_(b))?_:x(b))+f)})),P.remove(),y.attr("d",t===On||t===zr?a?"M"+u*a+","+R+"H"+f+"V"+E+"H"+u*a:"M"+f+","+R+"V"+E:a?"M"+R+","+u*a+"V"+f+"H"+E+"V"+u*a:"M"+R+","+f+"H"+E),O.attr("opacity",1).attr("transform",function(b){return p(x(b)+f)}),B.attr(c+"2",u*o),L.attr(c,u*A).text(S),$.filter(Kf).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===zr?"start":t===On?"end":"middle"),$.each(function(){this.__axis=x})}return l.scale=function(m){return arguments.length?(e=m,l):e},l.ticks=function(){return n=Array.from(arguments),l},l.tickArguments=function(m){return arguments.length?(n=m==null?[]:Array.from(m),l):n.slice()},l.tickValues=function(m){return arguments.length?(r=m==null?null:Array.from(m),l):r&&r.slice()},l.tickFormat=function(m){return arguments.length?(i=m,l):i},l.tickSize=function(m){return arguments.length?(o=a=+m,l):o},l.tickSizeInner=function(m){return arguments.length?(o=+m,l):o},l.tickSizeOuter=function(m){return arguments.length?(a=+m,l):a},l.tickPadding=function(m){return arguments.length?(s=+m,l):s},l.offset=function(m){return arguments.length?(f=+m,l):f},l}function Jf(t){return ra(In,t)}function jf(t){return ra(Lr,t)}function ia(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}function ee(t,e){if(!isFinite(t)||t===0)return null;var n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"),r=t.slice(0,n);return[r.length>1?r[0]+r.slice(2):r,+t.slice(n+1)]}function Tt(t){return t=ee(Math.abs(t)),t?t[1]:NaN}function oa(t,e){return function(n,r){for(var i=n.length,o=[],a=0,s=t[0],f=0;i>0&&s>0&&(f+s+1>r&&(s=Math.max(1,r-f)),o.push(n.substring(i-=s,i+s)),!((f+=s+1)>r));)s=t[a=(a+1)%t.length];return o.reverse().join(e)}}function aa(t){return function(e){return e.replace(/[0-9]/g,function(n){return t[+n]})}}var tl=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Ft(t){if(!(e=tl.exec(t)))throw new Error("invalid format: "+t);var e;return new Rn({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}Ft.prototype=Rn.prototype;function Rn(t){this.fill=t.fill===void 0?" ":t.fill+"",this.align=t.align===void 0?">":t.align+"",this.sign=t.sign===void 0?"-":t.sign+"",this.symbol=t.symbol===void 0?"":t.symbol+"",this.zero=!!t.zero,this.width=t.width===void 0?void 0:+t.width,this.comma=!!t.comma,this.precision=t.precision===void 0?void 0:+t.precision,this.trim=!!t.trim,this.type=t.type===void 0?"":t.type+""}Rn.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function sa(t){t:for(var e=t.length,n=1,r=-1,i;n0&&(r=0);break}return r>0?t.slice(0,r)+t.slice(i+1):t}var We;function ua(t,e){var n=ee(t,e);if(!n)return We=void 0,t.toPrecision(e);var r=n[0],i=n[1],o=i-(We=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,a=r.length;return o===a?r:o>a?r+new Array(o-a+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+ee(t,Math.max(0,e+o-1))[0]}function Br(t,e){var n=ee(t,e);if(!n)return t+"";var r=n[0],i=n[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}var Hr={"%":(t,e)=>(t*100).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:ia,e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>Br(t*100,e),r:Br,s:ua,X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function qr(t){return t}var fa=Array.prototype.map,la=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];function ca(t){var e=t.grouping===void 0||t.thousands===void 0?qr:oa(fa.call(t.grouping,Number),t.thousands+""),n=t.currency===void 0?"":t.currency[0]+"",r=t.currency===void 0?"":t.currency[1]+"",i=t.decimal===void 0?".":t.decimal+"",o=t.numerals===void 0?qr:aa(fa.call(t.numerals,String)),a=t.percent===void 0?"%":t.percent+"",s=t.minus===void 0?"\u2212":t.minus+"",f=t.nan===void 0?"NaN":t.nan+"";function u(p,l){p=Ft(p);var m=p.fill,T=p.align,S=p.sign,A=p.symbol,w=p.zero,R=p.width,E=p.comma,x=p.precision,$=p.trim,y=p.type;y==="n"?(E=!0,y="g"):Hr[y]||(x===void 0&&(x=12),$=!0,y="g"),(w||m==="0"&&T==="=")&&(w=!0,m="0",T="=");var O=(l&&l.prefix!==void 0?l.prefix:"")+(A==="$"?n:A==="#"&&/[boxX]/.test(y)?"0"+y.toLowerCase():""),P=(A==="$"?r:/[%p]/.test(y)?a:"")+(l&&l.suffix!==void 0?l.suffix:""),I=Hr[y],B=/[defgprs%]/.test(y);x=x===void 0?6:/[gprs]/.test(y)?Math.max(1,Math.min(21,x)):Math.max(0,Math.min(20,x));function L(b){var _=O,h=P,g,d,v;if(y==="c")h=I(b)+h,b="";else{b=+b;var M=b<0||1/b<0;if(b=isNaN(b)?f:I(Math.abs(b),x),$&&(b=sa(b)),M&&+b==0&&S!=="+"&&(M=!1),_=(M?S==="("?S:s:S==="-"||S==="("?"":S)+_,h=(y==="s"&&!isNaN(b)&&We!==void 0?la[8+We/3]:"")+h+(M&&S==="("?")":""),B){for(g=-1,d=b.length;++gv||v>57){h=(v===46?i+b.slice(g+1):b.slice(g))+h,b=b.slice(0,g);break}}}E&&!w&&(b=e(b,1/0));var N=_.length+b.length+h.length,D=N>1)+_+b+h+D.slice(N);break;default:b=D+_+b+h;break}return o(b)}return L.toString=function(){return p+""},L}function c(p,l){var m=Math.max(-8,Math.min(8,Math.floor(Tt(l)/3)))*3,T=Math.pow(10,-m),S=u((p=Ft(p),p.type="f",p),{suffix:la[8+m/3]});return function(A){return S(T*A)}}return{format:u,formatPrefix:c}}var Pn,Yn,Fn;Wr({thousands:",",grouping:[3],currency:["$",""]});function Wr(t){return Pn=ca(t),Yn=Pn.format,Fn=Pn.formatPrefix,Pn}function Vr(t){return Math.max(0,-Tt(Math.abs(t)))}function Xr(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(Tt(e)/3)))*3-Tt(Math.abs(t)))}function Gr(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,Tt(e)-Tt(t))+1}function el(t){var e=0,n=t.children,r=n&&n.length;if(!r)e=1;else for(;--r>=0;)e+=n[r].value;t.value=e}function ha(){return this.eachAfter(el)}function pa(t,e){let n=-1;for(let r of this)t.call(e,r,++n,this);return this}function ma(t,e){for(var n=this,r=[n],i,o,a=-1;n=r.pop();)if(t.call(e,n,++a,this),i=n.children)for(o=i.length-1;o>=0;--o)r.push(i[o]);return this}function da(t,e){for(var n=this,r=[n],i=[],o,a,s,f=-1;n=r.pop();)if(i.push(n),o=n.children)for(a=0,s=o.length;a=0;)n+=r[i].value;e.value=n})}function _a(t){return this.eachBefore(function(e){e.children&&e.children.sort(t)})}function ya(t){for(var e=this,n=nl(e,t),r=[e];e!==n;)e=e.parent,r.push(e);for(var i=r.length;t!==n;)r.splice(i,0,t),t=t.parent;return r}function nl(t,e){if(t===e)return t;var n=t.ancestors(),r=e.ancestors(),i=null;for(t=n.pop(),e=r.pop();t===e;)i=t,t=n.pop(),e=r.pop();return i}function va(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e}function wa(){return Array.from(this)}function ba(){var t=[];return this.eachBefore(function(e){e.children||t.push(e)}),t}function Ma(){var t=this,e=[];return t.each(function(n){n!==t&&e.push({source:n.parent,target:n})}),e}function*Ta(){var t=this,e,n=[t],r,i,o;do for(e=n.reverse(),n=[];t=e.pop();)if(yield t,r=t.children)for(i=0,o=r.length;i=0;--s)i.push(o=a[s]=new Ve(a[s])),o.parent=r,o.depth=r.depth+1;return n.eachBefore(sl)}function rl(){return Un(this).eachBefore(al)}function il(t){return t.children}function ol(t){return Array.isArray(t)?t[1]:null}function al(t){t.data.value!==void 0&&(t.value=t.data.value),t.data=t.data.data}function sl(t){var e=0;do t.height=e;while((t=t.parent)&&t.height<++e)}function Ve(t){this.data=t,this.depth=this.height=0,this.parent=null}Ve.prototype=Un.prototype={constructor:Ve,count:ha,each:pa,eachAfter:da,eachBefore:ma,find:xa,sum:ga,sort:_a,path:ya,ancestors:va,descendants:wa,leaves:ba,links:Ma,copy:rl,[Symbol.iterator]:Ta};function ka(t){t.x0=Math.round(t.x0),t.y0=Math.round(t.y0),t.x1=Math.round(t.x1),t.y1=Math.round(t.y1)}function Sa(t,e,n,r,i){for(var o=t.children,a,s=-1,f=o.length,u=t.value&&(r-e)/t.value;++sR&&(R=u),y=A*A*$,E=Math.max(R/y,y/w),E>x){A-=u;break}x=E}a.push(f={value:A,dice:m1?r:1)},n})(ul);function Da(t){if(typeof t!="function")throw new Error;return t}function we(){return 0}function be(t){return function(){return t}}function ll(){var t=Na,e=!1,n=1,r=1,i=[0],o=we,a=we,s=we,f=we,u=we;function c(l){return l.x0=l.y0=0,l.x1=n,l.y1=r,l.eachBefore(p),i=[0],e&&l.eachBefore(ka),l}function p(l){var m=i[l.depth],T=l.x0+m,S=l.y0+m,A=l.x1-m,w=l.y1-m;Ae&&(n=t,t=e,e=n),function(r){return Math.max(t,Math.min(e,r))}}function hl(t,e,n){var r=t[0],i=t[1],o=e[0],a=e[1];return i2?pl:hl,f=u=null,p}function p(l){return l==null||isNaN(l=+l)?o:(f||(f=s(t.map(r),e,n)))(r(a(l)))}return p.invert=function(l){return a(i((u||(u=s(e,t.map(r),it)))(l)))},p.domain=function(l){return arguments.length?(t=Array.from(l,Jr),c()):t.slice()},p.range=function(l){return arguments.length?(e=Array.from(l),c()):e.slice()},p.rangeRound=function(l){return e=Array.from(l),n=Ar,c()},p.clamp=function(l){return arguments.length?(a=l?!0:Me,c()):a!==Me},p.interpolate=function(l){return arguments.length?(n=l,c()):n},p.unknown=function(l){return arguments.length?(o=l,p):o},function(l,m){return r=l,i=m,c()}}function Ge(){return ml()(Me,Me)}function ti(t,e,n,r){var i=ve(t,e,n),o;switch(r=Ft(r??",f"),r.type){case"s":{var a=Math.max(Math.abs(t),Math.abs(e));return r.precision==null&&!isNaN(o=Xr(i,a))&&(r.precision=o),Fn(r,a)}case"":case"e":case"g":case"p":case"r":{r.precision==null&&!isNaN(o=Gr(i,Math.max(Math.abs(t),Math.abs(e))))&&(r.precision=o-(r.type==="e"));break}case"f":case"%":{r.precision==null&&!isNaN(o=Vr(i))&&(r.precision=o-(r.type==="%")*2);break}}return Yn(r)}function dl(t){var e=t.domain;return t.ticks=function(n){var r=e();return $n(r[0],r[r.length-1],n??10)},t.tickFormat=function(n,r){var i=e();return ti(i[0],i[i.length-1],n??10,r)},t.nice=function(n){n==null&&(n=10);var r=e(),i=0,o=r.length-1,a=r[i],s=r[o],f,u,c=10;for(s0;){if(u=qe(a,s,n),u===f)return r[i]=a,r[o]=s,e(r);if(u>0)a=Math.floor(a/u)*u,s=Math.ceil(s/u)*u;else if(u<0)a=Math.ceil(a*u)/u,s=Math.floor(s*u)/u;else break;f=u}return t},t}function ei(){var t=Ge();return t.copy=function(){return zn(t,ei())},Ut.apply(t,arguments),dl(t)}var ni=new Date,ri=new Date;function G(t,e,n,r){function i(o){return t(o=arguments.length===0?new Date:new Date(+o)),o}return i.floor=o=>(t(o=new Date(+o)),o),i.ceil=o=>(t(o=new Date(o-1)),e(o,1),t(o),o),i.round=o=>{let a=i(o),s=i.ceil(o);return o-a(e(o=new Date(+o),a==null?1:Math.floor(a)),o),i.range=(o,a,s)=>{let f=[];if(o=i.ceil(o),s=s==null?1:Math.floor(s),!(o0))return f;let u;do f.push(u=new Date(+o)),e(o,s),t(o);while(uG(a=>{if(a>=a)for(;t(a),!o(a);)a.setTime(a-1)},(a,s)=>{if(a>=a)if(s<0)for(;++s<=0;)for(;e(a,-1),!o(a););else for(;--s>=0;)for(;e(a,1),!o(a););}),n&&(i.count=(o,a)=>(ni.setTime(+o),ri.setTime(+a),t(ni),t(ri),Math.floor(n(ni,ri))),i.every=o=>(o=Math.floor(o),!isFinite(o)||!(o>0)?null:o>1?i.filter(r?a=>r(a)%o===0:a=>i.count(0,a)%o===0):i)),i}var ne=G(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);ne.every=t=>(t=Math.floor(t),!isFinite(t)||!(t>0)?null:t>1?G(e=>{e.setTime(Math.floor(e/t)*t)},(e,n)=>{e.setTime(+e+n*t)},(e,n)=>(n-e)/t):ne);var $a=ne.range;var kt=G(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*1e3)},(t,e)=>(e-t)/1e3,t=>t.getUTCSeconds()),Ea=kt.range;var Te=G(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getMinutes()),xl=Te.range,Ln=G(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getUTCMinutes()),gl=Ln.range;var ke=G(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3-t.getMinutes()*6e4)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getHours()),_l=ke.range,Bn=G(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getUTCHours()),yl=Bn.range;var Et=G(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5,t=>t.getDate()-1),vl=Et.range,Qe=G(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>t.getUTCDate()-1),wl=Qe.range,Hn=G(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>Math.floor(t/864e5)),bl=Hn.range;function oe(t){return G(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(e,n)=>{e.setDate(e.getDate()+n*7)},(e,n)=>(n-e-(n.getTimezoneOffset()-e.getTimezoneOffset())*6e4)/6048e5)}var Ot=oe(0),Se=oe(1),Ia=oe(2),Ra=oe(3),zt=oe(4),Pa=oe(5),Ya=oe(6),Fa=Ot.range,Ml=Se.range,Tl=Ia.range,kl=Ra.range,Sl=zt.range,Cl=Pa.range,Nl=Ya.range;function ae(t){return G(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(e,n)=>{e.setUTCDate(e.getUTCDate()+n*7)},(e,n)=>(n-e)/6048e5)}var se=ae(0),Ce=ae(1),Ua=ae(2),za=ae(3),Lt=ae(4),La=ae(5),Ba=ae(6),Ha=se.range,Dl=Ce.range,Al=Ua.range,$l=za.range,El=Lt.range,Ol=La.range,Il=Ba.range;var Ne=G(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12,t=>t.getMonth()),Rl=Ne.range,qn=G(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12,t=>t.getUTCMonth()),Pl=qn.range;var ht=G(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear());ht.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:G(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,n)=>{e.setFullYear(e.getFullYear()+n*t)});var Yl=ht.range,yt=G(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());yt.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:G(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,n)=>{e.setUTCFullYear(e.getUTCFullYear()+n*t)});var Fl=yt.range;function Wa(t,e,n,r,i,o){let a=[[kt,1,1e3],[kt,5,5*1e3],[kt,15,15*1e3],[kt,30,30*1e3],[o,1,6e4],[o,5,5*6e4],[o,15,15*6e4],[o,30,30*6e4],[i,1,36e5],[i,3,3*36e5],[i,6,6*36e5],[i,12,12*36e5],[r,1,864e5],[r,2,2*864e5],[n,1,6048e5],[e,1,2592e6],[e,3,3*2592e6],[t,1,31536e6]];function s(u,c,p){let l=cA).right(a,l);if(m===a.length)return t.every(ve(u/31536e6,c/31536e6,p));if(m===0)return ne.every(Math.max(ve(u,c,p),1));let[T,S]=a[l/a[m-1][2]53)return null;"w"in k||(k.w=1),"Z"in k?(Z=si(Ke(k.y,0,1)),ft=Z.getUTCDay(),Z=ft>4||ft===0?Ce.ceil(Z):Ce(Z),Z=Qe.offset(Z,(k.V-1)*7),k.y=Z.getUTCFullYear(),k.m=Z.getUTCMonth(),k.d=Z.getUTCDate()+(k.w+6)%7):(Z=ai(Ke(k.y,0,1)),ft=Z.getDay(),Z=ft>4||ft===0?Se.ceil(Z):Se(Z),Z=Et.offset(Z,(k.V-1)*7),k.y=Z.getFullYear(),k.m=Z.getMonth(),k.d=Z.getDate()+(k.w+6)%7)}else("W"in k||"U"in k)&&("w"in k||(k.w="u"in k?k.u%7:"W"in k?1:0),ft="Z"in k?si(Ke(k.y,0,1)).getUTCDay():ai(Ke(k.y,0,1)).getDay(),k.m=0,k.d="W"in k?(k.w+6)%7+k.W*7-(ft+5)%7:k.w+k.U*7-(ft+6)%7);return"Z"in k?(k.H+=k.Z/100|0,k.M+=k.Z%100,si(k)):ai(k)}}function P(C,U,z,k){for(var ut=0,Z=U.length,ft=z.length,lt,Vt;ut=ft)return-1;if(lt=U.charCodeAt(ut++),lt===37){if(lt=U.charAt(ut++),Vt=$[lt in Va?U.charAt(ut++):lt],!Vt||(k=Vt(C,z,k))<0)return-1}else if(lt!=z.charCodeAt(k++))return-1}return k}function I(C,U,z){var k=u.exec(U.slice(z));return k?(C.p=c.get(k[0].toLowerCase()),z+k[0].length):-1}function B(C,U,z){var k=m.exec(U.slice(z));return k?(C.w=T.get(k[0].toLowerCase()),z+k[0].length):-1}function L(C,U,z){var k=p.exec(U.slice(z));return k?(C.w=l.get(k[0].toLowerCase()),z+k[0].length):-1}function b(C,U,z){var k=w.exec(U.slice(z));return k?(C.m=R.get(k[0].toLowerCase()),z+k[0].length):-1}function _(C,U,z){var k=S.exec(U.slice(z));return k?(C.m=A.get(k[0].toLowerCase()),z+k[0].length):-1}function h(C,U,z){return P(C,e,U,z)}function g(C,U,z){return P(C,n,U,z)}function d(C,U,z){return P(C,r,U,z)}function v(C){return a[C.getDay()]}function M(C){return o[C.getDay()]}function N(C){return f[C.getMonth()]}function D(C){return s[C.getMonth()]}function Y(C){return i[+(C.getHours()>=12)]}function F(C){return 1+~~(C.getMonth()/3)}function X(C){return a[C.getUTCDay()]}function W(C){return o[C.getUTCDay()]}function q(C){return f[C.getUTCMonth()]}function j(C){return s[C.getUTCMonth()]}function Q(C){return i[+(C.getUTCHours()>=12)]}function V(C){return 1+~~(C.getUTCMonth()/3)}return{format:function(C){var U=y(C+="",E);return U.toString=function(){return C},U},parse:function(C){var U=O(C+="",!1);return U.toString=function(){return C},U},utcFormat:function(C){var U=y(C+="",x);return U.toString=function(){return C},U},utcParse:function(C){var U=O(C+="",!0);return U.toString=function(){return C},U}}}var Va={"-":"",_:" ",0:"0"},et=/^\s*\d+/,Bl=/^%/,Hl=/[\\^$*+?|[\]().{}]/g;function H(t,e,n){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o[e.toLowerCase(),n]))}function Wl(t,e,n){var r=et.exec(e.slice(n,n+1));return r?(t.w=+r[0],n+r[0].length):-1}function Vl(t,e,n){var r=et.exec(e.slice(n,n+1));return r?(t.u=+r[0],n+r[0].length):-1}function Xl(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.U=+r[0],n+r[0].length):-1}function Gl(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.V=+r[0],n+r[0].length):-1}function Zl(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.W=+r[0],n+r[0].length):-1}function Xa(t,e,n){var r=et.exec(e.slice(n,n+4));return r?(t.y=+r[0],n+r[0].length):-1}function Ga(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.y=+r[0]+(+r[0]>68?1900:2e3),n+r[0].length):-1}function Ql(t,e,n){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),n+r[0].length):-1}function Kl(t,e,n){var r=et.exec(e.slice(n,n+1));return r?(t.q=r[0]*3-3,n+r[0].length):-1}function Jl(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.m=r[0]-1,n+r[0].length):-1}function Za(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.d=+r[0],n+r[0].length):-1}function jl(t,e,n){var r=et.exec(e.slice(n,n+3));return r?(t.m=0,t.d=+r[0],n+r[0].length):-1}function Qa(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.H=+r[0],n+r[0].length):-1}function tc(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.M=+r[0],n+r[0].length):-1}function ec(t,e,n){var r=et.exec(e.slice(n,n+2));return r?(t.S=+r[0],n+r[0].length):-1}function nc(t,e,n){var r=et.exec(e.slice(n,n+3));return r?(t.L=+r[0],n+r[0].length):-1}function rc(t,e,n){var r=et.exec(e.slice(n,n+6));return r?(t.L=Math.floor(r[0]/1e3),n+r[0].length):-1}function ic(t,e,n){var r=Bl.exec(e.slice(n,n+1));return r?n+r[0].length:-1}function oc(t,e,n){var r=et.exec(e.slice(n));return r?(t.Q=+r[0],n+r[0].length):-1}function ac(t,e,n){var r=et.exec(e.slice(n));return r?(t.s=+r[0],n+r[0].length):-1}function Ka(t,e){return H(t.getDate(),e,2)}function sc(t,e){return H(t.getHours(),e,2)}function uc(t,e){return H(t.getHours()%12||12,e,2)}function fc(t,e){return H(1+Et.count(ht(t),t),e,3)}function ns(t,e){return H(t.getMilliseconds(),e,3)}function lc(t,e){return ns(t,e)+"000"}function cc(t,e){return H(t.getMonth()+1,e,2)}function hc(t,e){return H(t.getMinutes(),e,2)}function pc(t,e){return H(t.getSeconds(),e,2)}function mc(t){var e=t.getDay();return e===0?7:e}function dc(t,e){return H(Ot.count(ht(t)-1,t),e,2)}function rs(t){var e=t.getDay();return e>=4||e===0?zt(t):zt.ceil(t)}function xc(t,e){return t=rs(t),H(zt.count(ht(t),t)+(ht(t).getDay()===4),e,2)}function gc(t){return t.getDay()}function _c(t,e){return H(Se.count(ht(t)-1,t),e,2)}function yc(t,e){return H(t.getFullYear()%100,e,2)}function vc(t,e){return t=rs(t),H(t.getFullYear()%100,e,2)}function wc(t,e){return H(t.getFullYear()%1e4,e,4)}function bc(t,e){var n=t.getDay();return t=n>=4||n===0?zt(t):zt.ceil(t),H(t.getFullYear()%1e4,e,4)}function Mc(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+H(e/60|0,"0",2)+H(e%60,"0",2)}function Ja(t,e){return H(t.getUTCDate(),e,2)}function Tc(t,e){return H(t.getUTCHours(),e,2)}function kc(t,e){return H(t.getUTCHours()%12||12,e,2)}function Sc(t,e){return H(1+Qe.count(yt(t),t),e,3)}function is(t,e){return H(t.getUTCMilliseconds(),e,3)}function Cc(t,e){return is(t,e)+"000"}function Nc(t,e){return H(t.getUTCMonth()+1,e,2)}function Dc(t,e){return H(t.getUTCMinutes(),e,2)}function Ac(t,e){return H(t.getUTCSeconds(),e,2)}function $c(t){var e=t.getUTCDay();return e===0?7:e}function Ec(t,e){return H(se.count(yt(t)-1,t),e,2)}function os(t){var e=t.getUTCDay();return e>=4||e===0?Lt(t):Lt.ceil(t)}function Oc(t,e){return t=os(t),H(Lt.count(yt(t),t)+(yt(t).getUTCDay()===4),e,2)}function Ic(t){return t.getUTCDay()}function Rc(t,e){return H(Ce.count(yt(t)-1,t),e,2)}function Pc(t,e){return H(t.getUTCFullYear()%100,e,2)}function Yc(t,e){return t=os(t),H(t.getUTCFullYear()%100,e,2)}function Fc(t,e){return H(t.getUTCFullYear()%1e4,e,4)}function Uc(t,e){var n=t.getUTCDay();return t=n>=4||n===0?Lt(t):Lt.ceil(t),H(t.getUTCFullYear()%1e4,e,4)}function zc(){return"+0000"}function ja(){return"%"}function ts(t){return+t}function es(t){return Math.floor(+t/1e3)}var De,Wn,as,ss,us;fi({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function fi(t){return De=ui(t),Wn=De.format,as=De.parse,ss=De.utcFormat,us=De.utcParse,De}function li(t,e){t=t.slice();var n=0,r=t.length-1,i=t[n],o=t[r],a;return o1?0:t<-1?Ae:Math.acos(t)}function hi(t){return t>=1?tn:t<=-1?-tn:Math.asin(t)}var pi=Math.PI,mi=2*pi,fe=1e-6,qc=mi-fe;function ms(t){this._+=t[0];for(let e=1,n=t.length;e=0))throw new Error(`invalid digits: ${t}`);if(e>15)return ms;let n=10**e;return function(r){this._+=r[0];for(let i=1,o=r.length;ife)if(!(Math.abs(p*f-u*c)>fe)||!o)this._append`L${this._x1=e},${this._y1=n}`;else{let m=r-a,T=i-s,S=f*f+u*u,A=m*m+T*T,w=Math.sqrt(S),R=Math.sqrt(l),E=o*Math.tan((pi-Math.acos((S+l-A)/(2*w*R)))/2),x=E/R,$=E/w;Math.abs(x-1)>fe&&this._append`L${e+x*c},${n+x*p}`,this._append`A${o},${o},0,0,${+(p*m>c*T)},${this._x1=e+$*f},${this._y1=n+$*u}`}}arc(e,n,r,i,o,a){if(e=+e,n=+n,r=+r,a=!!a,r<0)throw new Error(`negative radius: ${r}`);let s=r*Math.cos(i),f=r*Math.sin(i),u=e+s,c=n+f,p=1^a,l=a?i-o:o-i;this._x1===null?this._append`M${u},${c}`:(Math.abs(this._x1-u)>fe||Math.abs(this._y1-c)>fe)&&this._append`L${u},${c}`,r&&(l<0&&(l=l%mi+mi),l>qc?this._append`A${r},${r},0,1,${p},${e-s},${n-f}A${r},${r},0,1,${p},${this._x1=u},${this._y1=c}`:l>fe&&this._append`A${r},${r},0,${+(l>=pi)},${p},${this._x1=e+r*Math.cos(o)},${this._y1=n+r*Math.sin(o)}`)}rect(e,n,r,i){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+n}h${r=+r}v${+i}h${-r}Z`}toString(){return this._}};function ds(){return new le}ds.prototype=le.prototype;function Xn(t){let e=3;return t.digits=function(n){if(!arguments.length)return e;if(n==null)e=null;else{let r=Math.floor(n);if(!(r>=0))throw new RangeError(`invalid digits: ${n}`);e=r}return t},()=>new le(e)}function Vc(t){return t.innerRadius}function Xc(t){return t.outerRadius}function Gc(t){return t.startAngle}function Zc(t){return t.endAngle}function Qc(t){return t&&t.padAngle}function Kc(t,e,n,r,i,o,a,s){var f=n-t,u=r-e,c=a-i,p=s-o,l=p*f-c*u;if(!(l*lh*h+g*g&&(P=B,I=L),{cx:P,cy:I,x01:-c,y01:-p,x11:P*(i/$-1),y11:I*(i/$-1)}}function Jc(){var t=Vc,e=Xc,n=K(0),r=null,i=Gc,o=Zc,a=Qc,s=null,f=Xn(u);function u(){var c,p,l=+t.apply(this,arguments),m=+e.apply(this,arguments),T=i.apply(this,arguments)-tn,S=o.apply(this,arguments)-tn,A=ci(S-T),w=S>T;if(s||(s=c=f()),mnt))s.moveTo(0,0);else if(A>$e-nt)s.moveTo(m*Bt(T),m*vt(T)),s.arc(0,0,m,T,S,!w),l>nt&&(s.moveTo(l*Bt(S),l*vt(S)),s.arc(0,0,l,S,T,w));else{var R=T,E=S,x=T,$=S,y=A,O=A,P=a.apply(this,arguments)/2,I=P>nt&&(r?+r.apply(this,arguments):ue(l*l+m*m)),B=Vn(ci(m-l)/2,+n.apply(this,arguments)),L=B,b=B,_,h;if(I>nt){var g=hi(I/l*vt(P)),d=hi(I/m*vt(P));(y-=g*2)>nt?(g*=w?1:-1,x+=g,$-=g):(y=0,x=$=(T+S)/2),(O-=d*2)>nt?(d*=w?1:-1,R+=d,E-=d):(O=0,R=E=(T+S)/2)}var v=m*Bt(R),M=m*vt(R),N=l*Bt($),D=l*vt($);if(B>nt){var Y=m*Bt(E),F=m*vt(E),X=l*Bt(x),W=l*vt(x),q;if(Ant?b>nt?(_=Gn(X,W,v,M,m,b,w),h=Gn(Y,F,N,D,m,b,w),s.moveTo(_.cx+_.x01,_.cy+_.y01),bnt)||!(y>nt)?s.lineTo(N,D):L>nt?(_=Gn(N,D,Y,F,l,-L,w),h=Gn(v,M,X,W,l,-L,w),s.lineTo(_.cx+_.x01,_.cy+_.y01),Lt?1:e>=t?0:NaN}function vs(t){return t}function th(){var t=vs,e=ys,n=null,r=K(0),i=K($e),o=K(0);function a(s){var f,u=(s=Zn(s)).length,c,p,l=0,m=new Array(u),T=new Array(u),S=+r.apply(this,arguments),A=Math.min($e,Math.max(-$e,i.apply(this,arguments)-S)),w,R=Math.min(Math.abs(A)/u,o.apply(this,arguments)),E=R*(A<0?-1:1),x;for(f=0;f0&&(l+=x);for(e!=null?m.sort(function($,y){return e(T[$],T[y])}):n!=null&&m.sort(function($,y){return n(s[$],s[y])}),f=0,p=l?(A-u*E)/l:0;f0?x*p:0)+E,T[c]={data:s[c],index:f,value:x,startAngle:S,endAngle:w,padAngle:R};return T}return a.value=function(s){return arguments.length?(t=typeof s=="function"?s:K(+s),a):t},a.sortValues=function(s){return arguments.length?(e=s,n=null,a):e},a.sort=function(s){return arguments.length?(n=s,e=null,a):n},a.startAngle=function(s){return arguments.length?(r=typeof s=="function"?s:K(+s),a):r},a.endAngle=function(s){return arguments.length?(i=typeof s=="function"?s:K(+s),a):i},a.padAngle=function(s){return arguments.length?(o=typeof s=="function"?s:K(+s),a):o},a}function Ee(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function en(t){this._context=t}en.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Ee(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Ee(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};function eh(t){return new en(t)}var Qn=class{constructor(e,n){this._context=e,this._x=n}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,n){switch(e=+e,n=+n,this._point){case 0:{this._point=1,this._line?this._context.lineTo(e,n):this._context.moveTo(e,n);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,n,e,n):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+n)/2,e,this._y0,e,n);break}}this._x0=e,this._y0=n}};function nh(t){return new Qn(t,!0)}function rh(t){return new Qn(t,!1)}function xt(){}function ws(t){this._context=t}ws.prototype={areaStart:xt,areaEnd:xt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:Ee(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};function ih(t){return new ws(t)}function bs(t){this._context=t}bs.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,r):this._context.moveTo(n,r);break;case 3:this._point=4;default:Ee(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};function oh(t){return new bs(t)}function Ms(t,e){this._basis=new en(t),this._beta=e}Ms.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,n=t.length-1;if(n>0)for(var r=t[0],i=e[0],o=t[n]-r,a=e[n]-i,s=-1,f;++s<=n;)f=s/n,this._basis.point(this._beta*t[s]+(1-this._beta)*(r+f*o),this._beta*e[s]+(1-this._beta)*(i+f*a));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};var ah=(function t(e){function n(r){return e===1?new en(r):new Ms(r,e)}return n.beta=function(r){return t(+r)},n})(.85);function Oe(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function Kn(t,e){this._context=t,this._k=(1-e)/6}Kn.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Oe(this,this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Oe(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var sh=(function t(e){function n(r){return new Kn(r,e)}return n.tension=function(r){return t(+r)},n})(0);function Jn(t,e){this._context=t,this._k=(1-e)/6}Jn.prototype={areaStart:xt,areaEnd:xt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Oe(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var uh=(function t(e){function n(r){return new Jn(r,e)}return n.tension=function(r){return t(+r)},n})(0);function jn(t,e){this._context=t,this._k=(1-e)/6}jn.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Oe(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var fh=(function t(e){function n(r){return new jn(r,e)}return n.tension=function(r){return t(+r)},n})(0);function nn(t,e,n){var r=t._x1,i=t._y1,o=t._x2,a=t._y2;if(t._l01_a>nt){var s=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,f=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*s-t._x0*t._l12_2a+t._x2*t._l01_2a)/f,i=(i*s-t._y0*t._l12_2a+t._y2*t._l01_2a)/f}if(t._l23_a>nt){var u=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,c=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*u+t._x1*t._l23_2a-e*t._l12_2a)/c,a=(a*u+t._y1*t._l23_2a-n*t._l12_2a)/c}t._context.bezierCurveTo(r,i,o,a,t._x2,t._y2)}function Ts(t,e){this._context=t,this._alpha=e}Ts.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:nn(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var lh=(function t(e){function n(r){return e?new Ts(r,e):new Kn(r,0)}return n.alpha=function(r){return t(+r)},n})(.5);function ks(t,e){this._context=t,this._alpha=e}ks.prototype={areaStart:xt,areaEnd:xt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:nn(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var ch=(function t(e){function n(r){return e?new ks(r,e):new Jn(r,0)}return n.alpha=function(r){return t(+r)},n})(.5);function Ss(t,e){this._context=t,this._alpha=e}Ss.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,r=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:nn(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var hh=(function t(e){function n(r){return e?new Ss(r,e):new jn(r,0)}return n.alpha=function(r){return t(+r)},n})(.5);function Cs(t){this._context=t}Cs.prototype={areaStart:xt,areaEnd:xt,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}};function ph(t){return new Cs(t)}function Ns(t){return t<0?-1:1}function Ds(t,e,n){var r=t._x1-t._x0,i=e-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),a=(n-t._y1)/(i||r<0&&-0),s=(o*i+a*r)/(r+i);return(Ns(o)+Ns(a))*Math.min(Math.abs(o),Math.abs(a),.5*Math.abs(s))||0}function As(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function xi(t,e,n){var r=t._x0,i=t._y0,o=t._x1,a=t._y1,s=(o-r)/3;t._context.bezierCurveTo(r+s,i+s*e,o-s,a-s*n,o,a)}function tr(t){this._context=t}tr.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:xi(this,this._t0,As(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){var n=NaN;if(t=+t,e=+e,!(t===this._x1&&e===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,xi(this,As(this,n=Ds(this,t,e)),n);break;default:xi(this,this._t0,n=Ds(this,t,e));break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=n}}};function $s(t){this._context=new Es(t)}($s.prototype=Object.create(tr.prototype)).point=function(t,e){tr.prototype.point.call(this,e,t)};function Es(t){this._context=t}Es.prototype={moveTo:function(t,e){this._context.moveTo(e,t)},closePath:function(){this._context.closePath()},lineTo:function(t,e){this._context.lineTo(e,t)},bezierCurveTo:function(t,e,n,r,i,o){this._context.bezierCurveTo(e,t,r,n,o,i)}};function mh(t){return new tr(t)}function dh(t){return new $s(t)}function Is(t){this._context=t}Is.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var t=this._x,e=this._y,n=t.length;if(n)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),n===2)this._context.lineTo(t[1],e[1]);else for(var r=Os(t),i=Os(e),o=0,a=1;a=0;--e)i[e]=(a[e]-i[e+1])/o[e];for(o[n-1]=(t[n]+i[n-1])/2,e=0;e=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}break}}this._x=t,this._y=e}};function gh(t){return new er(t,.5)}function _h(t){return new er(t,0)}function yh(t){return new er(t,1)}var vh={value:()=>{}};function Ps(){for(var t=0,e=arguments.length,n={},r;t=0&&(r=n.slice(i+1),n=n.slice(0,i)),n&&!e.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:r}})}nr.prototype=Ps.prototype={constructor:nr,on:function(t,e){var n=this._,r=wh(t+"",n),i,o=-1,a=r.length;if(arguments.length<2){for(;++o0)for(var n=new Array(i),r=0,i,o;r()=>t;function sn(t,{sourceEvent:e,subject:n,target:r,identifier:i,active:o,x:a,y:s,dx:f,dy:u,dispatch:c}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},identifier:{value:i,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:s,enumerable:!0,configurable:!0},dx:{value:f,enumerable:!0,configurable:!0},dy:{value:u,enumerable:!0,configurable:!0},_:{value:c}})}sn.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function Mh(t){return!t.ctrlKey&&!t.button}function Th(){return this.parentNode}function kh(t,e){return e??{x:t.x,y:t.y}}function Sh(){return navigator.maxTouchPoints||"ontouchstart"in this}function Ch(){var t=Mh,e=Th,n=kh,r=Sh,i={},o=ce("start","drag","end"),a=0,s,f,u,c,p=0;function l(x){x.on("mousedown.drag",m).filter(r).on("touchstart.drag",A).on("touchmove.drag",w,Ys).on("touchend.drag touchcancel.drag",R).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function m(x,$){if(!(c||!t.call(this,x,$))){var y=E(this,e.call(this,x,$),x,$,"mouse");y&&(ct(x.view).on("mousemove.drag",T,he).on("mouseup.drag",S,he),rn(x.view),rr(x),u=!1,s=x.clientX,f=x.clientY,y("start",x))}}function T(x){if(Ht(x),!u){var $=x.clientX-s,y=x.clientY-f;u=$*$+y*y>p}i.mouse("drag",x)}function S(x){ct(x.view).on("mousemove.drag mouseup.drag",null),on(x.view,u),Ht(x),i.mouse("end",x)}function A(x,$){if(t.call(this,x,$)){var y=x.changedTouches,O=e.call(this,x,$),P=y.length,I,B;for(I=0;I=0&&t._call.call(void 0,e),t=t._next;--Ie}function Fs(){pe=(or=cn.now())+ar,Ie=fn=0;try{Ls()}finally{Ie=0,Ah(),pe=0}}function Dh(){var t=cn.now(),e=t-or;e>Us&&(ar-=e,or=t)}function Ah(){for(var t,e=ir,n,r=1/0;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:ir=n);ln=t,gi(r)}function gi(t){if(!Ie){fn&&(fn=clearTimeout(fn));var e=t-pe;e>24?(t<1/0&&(fn=setTimeout(Fs,t-cn.now()-ar)),un&&(un=clearInterval(un))):(un||(or=cn.now(),un=setInterval(Dh,Us)),Ie=1,zs(Fs))}}function ur(t,e,n){var r=new hn;return e=e==null?0:+e,r.restart(i=>{r.stop(),t(i+e)},e,n),r}var $h=ce("start","end","cancel","interrupt"),Eh=[],qs=0,Bs=1,lr=2,fr=3,Hs=4,cr=5,mn=6;function qt(t,e,n,r,i,o){var a=t.__transition;if(!a)t.__transition={};else if(n in a)return;Oh(t,n,{name:e,index:r,group:i,on:$h,tween:Eh,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:qs})}function dn(t,e){var n=tt(t,e);if(n.state>qs)throw new Error("too late; already scheduled");return n}function at(t,e){var n=tt(t,e);if(n.state>fr)throw new Error("too late; already running");return n}function tt(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function Oh(t,e,n){var r=t.__transition,i;r[e]=n,n.timer=sr(o,0,n.time);function o(u){n.state=Bs,n.timer.restart(a,n.delay,n.time),n.delay<=u&&a(u-n.delay)}function a(u){var c,p,l,m;if(n.state!==Bs)return f();for(c in r)if(m=r[c],m.name===n.name){if(m.state===fr)return ur(a);m.state===Hs?(m.state=mn,m.timer.stop(),m.on.call("interrupt",t,t.__data__,m.index,m.group),delete r[c]):+clr&&r.state=0&&(e=e.slice(0,n)),!e||e==="start"})}function jh(t,e,n){var r,i,o=Jh(e)?dn:at;return function(){var a=o(this,t),s=a.on;s!==r&&(i=(r=s).copy()).on(e,n),a.on=i}}function eu(t,e){var n=this._id;return arguments.length<2?tt(this.node(),n).on.on(t):this.each(jh(n,t,e))}function tp(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}function nu(){return this.on("end.remove",tp(this._id))}function ru(t){var e=this._name,n=this._id;typeof t!="function"&&(t=Xt(t));for(var r=this._groups,i=r.length,o=new Array(i),a=0;a()=>t;function yi(t,{sourceEvent:e,target:n,transform:r,dispatch:i}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:i}})}function wt(t,e,n){this.k=t,this.x=e,this.y=n}wt.prototype={constructor:wt,scale:function(t){return t===1?this:new wt(this.k*t,this.x,this.y)},translate:function(t,e){return t===0&e===0?this:new wt(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var gn=new wt(1,0,0);vi.prototype=wt.prototype;function vi(t){for(;!t.__zoom;)if(!(t=t.parentNode))return gn;return t.__zoom}function dr(t){t.stopImmediatePropagation()}function Pe(t){t.preventDefault(),t.stopImmediatePropagation()}function xp(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function gp(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function xu(){return this.__zoom||gn}function _p(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function yp(){return navigator.maxTouchPoints||"ontouchstart"in this}function vp(t,e,n){var r=t.invertX(e[0][0])-n[0][0],i=t.invertX(e[1][0])-n[1][0],o=t.invertY(e[0][1])-n[0][1],a=t.invertY(e[1][1])-n[1][1];return t.translate(i>r?(r+i)/2:Math.min(0,r)||Math.max(0,i),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}function wp(){var t=xp,e=gp,n=vp,r=_p,i=yp,o=[0,1/0],a=[[-1/0,-1/0],[1/0,1/0]],s=250,f=Ir,u=ce("start","zoom","end"),c,p,l,m=500,T=150,S=0,A=10;function w(h){h.property("__zoom",xu).on("wheel.zoom",P,{passive:!1}).on("mousedown.zoom",I).on("dblclick.zoom",B).filter(i).on("touchstart.zoom",L).on("touchmove.zoom",b).on("touchend.zoom touchcancel.zoom",_).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}w.transform=function(h,g,d,v){var M=h.selection?h.selection():h;M.property("__zoom",xu),h!==M?$(h,g,d,v):M.interrupt().each(function(){y(this,arguments).event(v).start().zoom(null,typeof g=="function"?g.apply(this,arguments):g).end()})},w.scaleBy=function(h,g,d,v){w.scaleTo(h,function(){var M=this.__zoom.k,N=typeof g=="function"?g.apply(this,arguments):g;return M*N},d,v)},w.scaleTo=function(h,g,d,v){w.transform(h,function(){var M=e.apply(this,arguments),N=this.__zoom,D=d==null?x(M):typeof d=="function"?d.apply(this,arguments):d,Y=N.invert(D),F=typeof g=="function"?g.apply(this,arguments):g;return n(E(R(N,F),D,Y),M,a)},d,v)},w.translateBy=function(h,g,d,v){w.transform(h,function(){return n(this.__zoom.translate(typeof g=="function"?g.apply(this,arguments):g,typeof d=="function"?d.apply(this,arguments):d),e.apply(this,arguments),a)},null,v)},w.translateTo=function(h,g,d,v,M){w.transform(h,function(){var N=e.apply(this,arguments),D=this.__zoom,Y=v==null?x(N):typeof v=="function"?v.apply(this,arguments):v;return n(gn.translate(Y[0],Y[1]).scale(D.k).translate(typeof g=="function"?-g.apply(this,arguments):-g,typeof d=="function"?-d.apply(this,arguments):-d),N,a)},v,M)};function R(h,g){return g=Math.max(o[0],Math.min(o[1],g)),g===h.k?h:new wt(g,h.x,h.y)}function E(h,g,d){var v=g[0]-d[0]*h.k,M=g[1]-d[1]*h.k;return v===h.x&&M===h.y?h:new wt(h.k,v,M)}function x(h){return[(+h[0][0]+ +h[1][0])/2,(+h[0][1]+ +h[1][1])/2]}function $(h,g,d,v){h.on("start.zoom",function(){y(this,arguments).event(v).start()}).on("interrupt.zoom end.zoom",function(){y(this,arguments).event(v).end()}).tween("zoom",function(){var M=this,N=arguments,D=y(M,N).event(v),Y=e.apply(M,N),F=d==null?x(Y):typeof d=="function"?d.apply(M,N):d,X=Math.max(Y[1][0]-Y[0][0],Y[1][1]-Y[0][1]),W=M.__zoom,q=typeof g=="function"?g.apply(M,N):g,j=f(W.invert(F).concat(X/W.k),q.invert(F).concat(X/q.k));return function(Q){if(Q===1)Q=q;else{var V=j(Q),C=X/V[2];Q=new wt(C,F[0]-V[0]*C,F[1]-V[1]*C)}D.zoom(null,Q)}})}function y(h,g,d){return!d&&h.__zooming||new O(h,g)}function O(h,g){this.that=h,this.args=g,this.active=0,this.sourceEvent=null,this.extent=e.apply(h,g),this.taps=0}O.prototype={event:function(h){return h&&(this.sourceEvent=h),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(h,g){return this.mouse&&h!=="mouse"&&(this.mouse[1]=g.invert(this.mouse[0])),this.touch0&&h!=="touch"&&(this.touch0[1]=g.invert(this.touch0[0])),this.touch1&&h!=="touch"&&(this.touch1[1]=g.invert(this.touch1[0])),this.that.__zoom=g,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(h){var g=ct(this.that).datum();u.call(h,this.that,new yi(h,{sourceEvent:this.sourceEvent,target:w,type:h,transform:this.that.__zoom,dispatch:u}),g)}};function P(h,...g){if(!t.apply(this,arguments))return;var d=y(this,g).event(h),v=this.__zoom,M=Math.max(o[0],Math.min(o[1],v.k*Math.pow(2,r.apply(this,arguments)))),N=pt(h);if(d.wheel)(d.mouse[0][0]!==N[0]||d.mouse[0][1]!==N[1])&&(d.mouse[1]=v.invert(d.mouse[0]=N)),clearTimeout(d.wheel);else{if(v.k===M)return;d.mouse=[N,v.invert(N)],Wt(this),d.start()}Pe(h),d.wheel=setTimeout(D,T),d.zoom("mouse",n(E(R(v,M),d.mouse[0],d.mouse[1]),d.extent,a));function D(){d.wheel=null,d.end()}}function I(h,...g){if(l||!t.apply(this,arguments))return;var d=h.currentTarget,v=y(this,g,!0).event(h),M=ct(h.view).on("mousemove.zoom",F,!0).on("mouseup.zoom",X,!0),N=pt(h,d),D=h.clientX,Y=h.clientY;rn(h.view),dr(h),v.mouse=[N,this.__zoom.invert(N)],Wt(this),v.start();function F(W){if(Pe(W),!v.moved){var q=W.clientX-D,j=W.clientY-Y;v.moved=q*q+j*j>S}v.event(W).zoom("mouse",n(E(v.that.__zoom,v.mouse[0]=pt(W,d),v.mouse[1]),v.extent,a))}function X(W){M.on("mousemove.zoom mouseup.zoom",null),on(W.view,v.moved),Pe(W),v.event(W).end()}}function B(h,...g){if(t.apply(this,arguments)){var d=this.__zoom,v=pt(h.changedTouches?h.changedTouches[0]:h,this),M=d.invert(v),N=d.k*(h.shiftKey?.5:2),D=n(E(R(d,N),v,M),e.apply(this,g),a);Pe(h),s>0?ct(this).transition().duration(s).call($,D,v,h):ct(this).call(w.transform,D,v,h)}}function L(h,...g){if(t.apply(this,arguments)){var d=h.touches,v=d.length,M=y(this,g,h.changedTouches.length===v).event(h),N,D,Y,F;for(dr(h),D=0;Due(c,t)),i=0,r=0,a=[];if(e.length>1){let c=Kt(e);for(let u=0;uo.angle-u.angle);let h=e[e.length-1];for(let u=0;ux.radius*2&&(g=x.radius*2),(d==null||d.width>g)&&(d={circle:x,width:g,p1:o,p2:h,large:g>x.radius,sweep:!0})}d!=null&&(a.push(d),i+=ht(d.circle.radius,d.width),h=o)}}else{let c=t[0];for(let u=1;uMath.abs(c.radius-t[u].radius)){h=!0;break}h?i=r=0:(i=c.radius*c.radius*Math.PI,a.push({circle:c,p1:{x:c.x,y:c.y+c.radius},p2:{x:c.x-1e-10,y:c.y+c.radius},width:c.radius*2,large:!0,sweep:!0}))}return r/=2,n&&(n.area=i+r,n.arcArea=i,n.polygonArea=r,n.arcs=a,n.innerPoints=e,n.intersectionPoints=s),i+r}function ue(t,n){return n.every(s=>q(t,s)=t+n)return 0;if(s<=Math.abs(t-n))return Math.PI*Math.min(t,n)*Math.min(t,n);let e=t-(s*s-n*n+t*t)/(2*s),i=n-(s*s-t*t+n*n)/(2*s);return ht(t,e)+ht(n,i)}function Wt(t,n){let s=q(t,n),e=t.radius,i=n.radius;if(s>=e+i||s<=Math.abs(e-i))return[];let r=(e*e-i*i+s*s)/(2*s),a=Math.sqrt(e*e-r*r),c=t.x+r*(n.x-t.x)/s,h=t.y+r*(n.y-t.y)/s,u=-(n.y-t.y)*(a/s),o=-(n.x-t.x)*(a/s);return[{x:c+u,y:h-o},{x:c-u,y:h+o}]}function Kt(t){let n={x:0,y:0};for(let s of t)n.x+=s.x,n.y+=s.y;return n.x/=t.length,n.y/=t.length,n}function he(t,n,s,e){e=e||{};let i=e.maxIterations||100,r=e.tolerance||1e-10,a=t(n),c=t(s),h=s-n;if(a*c>0)throw"Initial bisect points must have opposite signs";if(a===0)return n;if(c===0)return s;for(let u=0;u=0&&(n=o),Math.abs(h)dt(n))}function $(t,n){let s=0;for(let e=0;ev.fx-l.fx,_=n.slice(),S=n.slice(),g=n.slice(),m=n.slice();for(let v=0;v{let O=f.slice();return O.fx=f.fx,O.id=f.id,O});p.sort((f,O)=>f.id-O.id),s.history.push({x:x[0].slice(),fx:x[0].fx,simplex:p})}d=0;for(let p=0;p=x[b-1].fx){let p=!1;if(S.fx>l.fx?(J(g,1+o,_,-o,l),g.fx=t(g),g.fx=1)break;for(let f=1;fc+r*i*h||u>=T)M=i;else{if(Math.abs(y)<=-a*h)return i;y*(M-x)>=0&&(M=x),x=i,T=u}return 0}for(let x=0;x<10;++x){if(J(e.x,1,s.x,i,n),u=e.fx=t(e.x,e.fxprime),y=$(e.fxprime,n),u>c+r*i*h||x&&u>=o)return b(d,i,o);if(Math.abs(y)<=-a*h)return i;if(y>=0)return b(i,d,u);o=u,d=i,i*=2}return i}function ge(t,n,s){let e={x:n.slice(),fx:0,fxprime:n.slice()},i={x:n.slice(),fx:0,fxprime:n.slice()},r=n.slice(),a,c,h=1,u;s=s||{},u=s.maxIterations||n.length*20,e.fx=t(e.x,e.fxprime),a=e.fxprime.slice(),xt(a,e.fxprime,-1);for(let o=0;o{let y={};for(let d=0;dmt(t,n,e)-s,0,t+n)}function xe(t,n={}){let s=n.distinct,e=t.map(c=>Object.assign({},c));function i(c){return c.join(";")}if(s){let c=new Map;for(let h of e)for(let u=0;uc===h?0:cr.sets.length===2).forEach(r=>{let a=s[r.sets[0]],c=s[r.sets[1]],h=Math.sqrt(n[a].size/Math.PI),u=Math.sqrt(n[c].size/Math.PI),o=yt(h,u,r.size);e[a][c]=e[c][a]=o;let y=0;r.size+1e-10>=Math.min(n[a].size,n[c].size)?y=1:r.size<=1e-10&&(y=-1),i[a][c]=i[c][a]=y}),{distances:e,constraints:i}}function pe(t,n,s,e){for(let r=0;r0&&x<=y||d<0&&x>=y||(i+=2*M*M,n[2*r]+=4*M*(a-u),n[2*r+1]+=4*M*(c-o),n[2*h]+=4*M*(u-a),n[2*h+1]+=4*M*(o-c))}}return i}function me(t,n={}){let s=ve(t,n),e=n.lossFunction||tt;if(t.length>=8){let i=be(t,n),r=e(i,t),a=e(s,t);r+1e-8d.map(b=>b/c));let h=(d,b)=>pe(d,b,r,a),u=null;for(let d=0;dy.sets.length===2);for(let y of t){let d=y.weight!=null?y.weight:1,b=y.sets[0],x=y.sets[1];y.size+Xt>=Math.min(e[b].size,e[x].size)&&(d=0),i[b].push({set:x,size:y.size,weight:d}),i[x].push({set:b,size:y.size,weight:d})}let r=[];Object.keys(i).forEach(y=>{let d=0;for(let b=0;bt[a]));let r=e.weight!=null?e.weight:1;s+=r*(i-e.size)*(i-e.size)}return s}function Zt(t,n){let s=0;for(let e of n){if(e.sets.length===1)continue;let i;if(e.sets.length===2){let c=t[e.sets[0]],h=t[e.sets[1]];i=mt(c.radius,h.radius,q(c,h))}else i=rt(e.sets.map(c=>t[c]));let r=e.weight!=null?e.weight:1,a=Math.log((i+1)/(e.size+1));s+=r*a*a}return s}function ke(t,n,s){if(s==null?t.sort((i,r)=>r.radius-i.radius):t.sort(s),t.length>0){let i=t[0].x,r=t[0].y;for(let a of t)a.x-=i,a.y-=r}if(t.length===2&&q(t[0],t[1])1){let i=Math.atan2(t[1].x,t[1].y)-n,r=Math.cos(i),a=Math.sin(i);for(let c of t){let h=c.x,u=c.y;c.x=r*h-a*u,c.y=a*h+r*u}}if(t.length>2){let i=Math.atan2(t[2].x,t[2].y)-n;for(;i<0;)i+=2*Math.PI;for(;i>2*Math.PI;)i-=2*Math.PI;if(i>Math.PI){let r=t[1].y/(1e-10+t[1].x);for(let a of t){var e=(a.x+r*a.y)/(1+r*r);a.x=2*e-a.x,a.y=2*e*r-a.y}}}}function Ie(t){t.forEach(i=>{i.parent=i});function n(i){return i.parent!==i&&(i.parent=n(i.parent)),i.parent}function s(i,r){let a=n(i),c=n(r);a.parent=c}for(let i=0;i{delete i.parent}),Array.from(e.values())}function pt(t){let n=s=>{let e=t.reduce((r,a)=>Math.max(r,a[s]+a.radius),Number.NEGATIVE_INFINITY),i=t.reduce((r,a)=>Math.min(r,a[s]-a.radius),Number.POSITIVE_INFINITY);return{max:e,min:i}};return{xRange:n("x"),yRange:n("y")}}function Jt(t,n,s){n==null&&(n=Math.PI/2);let e=te(t).map(u=>Object.assign({},u)),i=Ie(e);for(let u of i){ke(u,n,s);let o=pt(u);u.size=(o.xRange.max-o.xRange.min)*(o.yRange.max-o.yRange.min),u.bounds=o}i.sort((u,o)=>o.size-u.size),e=i[0];let r=e.bounds,a=(r.xRange.max-r.xRange.min)/50;function c(u,o,y){if(!u)return;let d=u.bounds,b,x;if(o)b=r.xRange.max-d.xRange.min+a;else{b=r.xRange.max-d.xRange.max;let M=(d.xRange.max-d.xRange.min)/2-(r.xRange.max-r.xRange.min)/2;M<0&&(b+=M)}if(y)x=r.yRange.max-d.yRange.min+a;else{x=r.yRange.max-d.yRange.max;let M=(d.yRange.max-d.yRange.min)/2-(r.yRange.max-r.yRange.min)/2;M<0&&(x+=M)}for(let M of u)M.x+=b,M.y+=x,e.push(M)}let h=1;for(;h({radius:o*b.radius,x:e+y+(b.x-a.min)*o,y:e+d+(b.y-c.min)*o,setid:b.setid})))}function $t(t){let n={};for(let s of t)n[s.setid]=s;return n}function te(t){return Object.keys(t).map(s=>Object.assign(t[s],{setid:s}))}function ee(t={}){let n=!1,s=600,e=350,i=15,r=1e3,a=Math.PI/2,c=!0,h=null,u=!0,o=!0,y=null,d=null,b=!1,x=null,M=t&&t.symmetricalTextCentre?t.symmetricalTextCentre:!1,T={},_=t&&t.colourScheme?t.colourScheme:t&&t.colorScheme?t.colorScheme:["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],S=0,g=function(p){if(p in T)return T[p];var f=T[p]=_[S];return S+=1,S>=_.length&&(S=0),f},m=Yt,v=tt;function l(p){let f=p.datum(),O=new Set;f.forEach(k=>{k.size==0&&k.sets.length==1&&O.add(k.sets[0])}),f=f.filter(k=>!k.sets.some(B=>O.has(B)));let I={},C={};if(f.length>0){let k=m(f,{lossFunction:v,distinct:b});c&&(k=Jt(k,a,d)),I=Qt(k,s,e,i,h),C=se(I,f,M)}let U={};f.forEach(k=>{k.label&&(U[k.sets]=k.label)});function P(k){if(k.sets in U)return U[k.sets];if(k.sets.length==1)return""+k.sets[0]}p.selectAll("svg").data([I]).enter().append("svg");let E=p.select("svg");n?E.attr("viewBox",`0 0 ${s} ${e}`):E.attr("width",s).attr("height",e);let D={},R=!1;E.selectAll(".venn-area path").each(function(k){let B=this.getAttribute("d");k.sets.length==1&&B&&!b&&(R=!0,D[k.sets[0]]=we(B))});function z(k){return B=>{let et=k.sets.map(Z=>{let X=D[Z],V=I[Z];return X||(X={x:s/2,y:e/2,radius:1}),V||(V={x:s/2,y:e/2,radius:1}),{x:X.x*(1-B)+V.x*B,y:X.y*(1-B)+V.y*B,radius:X.radius*(1-B)+V.radius*B}});return Gt(et,x)}}let N=E.selectAll(".venn-area").data(f,k=>k.sets),L=N.enter().append("g").attr("class",k=>`venn-area venn-${k.sets.length==1?"circle":"intersection"}${k.colour||k.color?" venn-coloured":""}`).attr("data-venn-sets",k=>k.sets.join("_")),F=L.append("path"),K=L.append("text").attr("class","label").text(k=>P(k)).attr("text-anchor","middle").attr("dy",".35em").attr("x",s/2).attr("y",e/2);o&&(F.style("fill-opacity","0").filter(k=>k.sets.length==1).style("fill",k=>k.colour?k.colour:k.color?k.color:g(k.sets)).style("fill-opacity",".25"),K.style("fill",k=>k.colour||k.color?"#FFF":t.textFill?t.textFill:k.sets.length==1?g(k.sets):"#444"));function H(k){return typeof k.transition=="function"?k.transition("venn").duration(r):k}let j=p;R&&typeof j.transition=="function"?(j=H(p),j.selectAll("path").attrTween("d",z)):j.selectAll("path").attr("d",k=>Gt(k.sets.map(B=>I[B])),x);let A=j.selectAll("text").filter(k=>k.sets in C).text(k=>P(k)).attr("x",k=>Math.floor(C[k.sets].x)).attr("y",k=>Math.floor(C[k.sets].y));u&&(R?"on"in A?A.on("end",ut(I,P)):A.each("end",ut(I,P)):A.each(ut(I,P)));let Y=H(N.exit()).remove();typeof N.transition=="function"&&Y.selectAll("path").attrTween("d",z);let G=Y.selectAll("text").attr("x",s/2).attr("y",e/2);return y!==null&&(K.style("font-size","0px"),A.style("font-size",y),G.style("font-size","0px")),{circles:I,textCentres:C,nodes:N,enter:L,update:j,exit:Y}}return l.wrap=function(p){return arguments.length?(u=p,l):u},l.useViewBox=function(){return n=!0,l},l.width=function(p){return arguments.length?(s=p,l):s},l.height=function(p){return arguments.length?(e=p,l):e},l.padding=function(p){return arguments.length?(i=p,l):i},l.distinct=function(p){return arguments.length?(b=p,l):b},l.colours=function(p){return arguments.length?(g=p,l):g},l.colors=function(p){return arguments.length?(g=p,l):g},l.fontSize=function(p){return arguments.length?(y=p,l):y},l.round=function(p){return arguments.length?(x=p,l):x},l.duration=function(p){return arguments.length?(r=p,l):r},l.layoutFunction=function(p){return arguments.length?(m=p,l):m},l.normalize=function(p){return arguments.length?(c=p,l):c},l.scaleToFit=function(p){return arguments.length?(h=p,l):h},l.styled=function(p){return arguments.length?(o=p,l):o},l.orientation=function(p){return arguments.length?(a=p,l):a},l.orientationOrder=function(p){return arguments.length?(d=p,l):d},l.lossFunction=function(p){return arguments.length?(v=p==="default"?tt:p==="logRatio"?Zt:p,l):v},l}function ut(t,n){return function(s){let e=this,i=t[s.sets[0]].radius||50,r=n(s)||"",a=r.split(/\s+/).reverse(),h=(r.length+a.length)/3,u=a.pop(),o=[u],y=0,d=1.1;e.textContent=null;let b=[];function x(g){let m=e.ownerDocument.createElementNS(e.namespaceURI,"tspan");return m.textContent=g,b.push(m),e.append(m),m}let M=x(u);for(;u=a.pop(),!!u;){o.push(u);let g=o.join(" ");M.textContent=g,g.length>h&&M.getComputedTextLength()>i&&(o.pop(),M.textContent=o.join(" "),o=[u],M=x(u),y++)}let T=.35-y*d/2,_=e.getAttribute("x"),S=e.getAttribute("y");b.forEach((g,m)=>{g.setAttribute("x",_),g.setAttribute("y",S),g.setAttribute("dy",`${T+m*d}em`)})}}function ft(t,n,s){let e=n[0].radius-q(n[0],t);for(let i=1;i=r&&(i=e[o],r=y)}let a=Ht(o=>-1*ft({x:o[0],y:o[1]},t,n),[i.x,i.y],{maxIterations:500,minErrorDelta:1e-10}).x,c={x:s?0:a[0],y:a[1]},h=!0;for(let o of t)if(q(c,o)>o.radius){h=!1;break}for(let o of n)if(q(c,o)o.p1))}function Me(t){let n={},s=Object.keys(t);for(let e of s)n[e]=[];for(let e=0;e0&&console.log("WARNING: area "+a+" not represented on screen")}return e}function Se(t,n,s){let e=[];return e.push(` +M`,t,n),e.push(` +m`,-s,0),e.push(` +a`,s,s,0,1,0,s*2,0),e.push(` +a`,s,s,0,1,0,-s*2,0),e.join(" ")}function we(t){let n=t.split(" ");return{x:Number.parseFloat(n[1]),y:Number.parseFloat(n[2]),radius:-Number.parseFloat(n[4])}}function ie(t){if(t.length===0)return[];let n={};return rt(t,n),n.arcs}function re(t,n){if(t.length===0)return"M 0 0";let s=Math.pow(10,n||0),e=n!=null?r=>Math.round(r*s)/s:r=>r;if(t.length==1){let r=t[0].circle;return Se(e(r.x),e(r.y),e(r.radius))}let i=[` +M`,e(t[0].p2.x),e(t[0].p2.y)];for(let r of t){let a=e(r.circle.radius);i.push(` +A`,a,a,0,r.large?1:0,r.sweep?1:0,e(r.p1.x),e(r.p1.y))}return i.join(" ")}function Gt(t,n){return re(ie(t),n)}function oe(t,n={}){let{lossFunction:s,layoutFunction:e=Yt,normalize:i=!0,orientation:r=Math.PI/2,orientationOrder:a,width:c=600,height:h=350,padding:u=15,scaleToFit:o=!1,symmetricalTextCentre:y=!1,distinct:d,round:b=2}=n,x=e(t,{lossFunction:s==="default"||!s?tt:s==="logRatio"?Zt:s,distinct:d});i&&(x=Jt(x,r,a));let M=Qt(x,c,h,u,o),T=se(M,t,y),_=new Map(Object.keys(M).map(m=>[m,{set:m,x:M[m].x,y:M[m].y,radius:M[m].radius}])),S=t.map(m=>{let v=m.sets.map(f=>_.get(f)),l=ie(v),p=re(l,b);return{circles:v,arcs:l,path:p,area:m,has:new Set(m.sets)}});function g(m){let v="";for(let l of S)l.has.size>m.length&&m.every(p=>l.has.has(p))&&(v+=" "+l.path);return v}return S.map(({circles:m,arcs:v,path:l,area:p})=>({data:p,text:T[p.sets],circles:m,arcs:v,path:l,distinctPath:l+g(p.sets)}))}var bt=(function(){var t=w(function(S,g,m,v){for(m=m||{},v=S.length;v--;m[S[v]]=g);return m},"o"),n=[5,8],s=[7,8,11,12,17,19,22,24],e=[1,17],i=[1,18],r=[7,8,11,12,14,15,16,17,19,20,21,22,24,27],a=[1,31],c=[1,39],h=[7,8,11,12,17,19,22,24,27],u=[1,57],o=[1,56],y=[1,58],d=[1,59],b=[1,60],x=[7,8,11,12,16,17,19,20,22,24,27,31,32,33],M={trace:w(function(){},"trace"),yy:{},symbols_:{error:2,start:3,optNewlines:4,VENN:5,document:6,EOF:7,NEWLINE:8,line:9,statement:10,TITLE:11,SET:12,identifier:13,BRACKET_LABEL:14,COLON:15,NUMERIC:16,UNION:17,identifierList:18,TEXT:19,IDENTIFIER:20,STRING:21,INDENT_TEXT:22,indentedTextTail:23,STYLE:24,stylesOpt:25,styleField:26,COMMA:27,styleValue:28,valueTokens:29,valueToken:30,HEXCOLOR:31,RGBCOLOR:32,RGBACOLOR:33,$accept:0,$end:1},terminals_:{2:"error",5:"VENN",7:"EOF",8:"NEWLINE",11:"TITLE",12:"SET",14:"BRACKET_LABEL",15:"COLON",16:"NUMERIC",17:"UNION",19:"TEXT",20:"IDENTIFIER",21:"STRING",22:"INDENT_TEXT",24:"STYLE",27:"COMMA",31:"HEXCOLOR",32:"RGBCOLOR",33:"RGBACOLOR"},productions_:[0,[3,4],[4,0],[4,2],[6,0],[6,2],[9,1],[9,1],[10,1],[10,2],[10,3],[10,4],[10,5],[10,2],[10,3],[10,4],[10,5],[10,3],[10,3],[10,3],[10,4],[10,4],[10,2],[10,3],[23,1],[23,1],[23,1],[23,2],[23,2],[25,1],[25,3],[26,3],[28,1],[28,1],[29,1],[29,2],[30,1],[30,1],[30,1],[30,1],[30,1],[18,1],[18,3],[13,1],[13,1]],performAction:w(function(g,m,v,l,p,f,O){var I=f.length-1;switch(p){case 1:return f[I-1];case 2:case 3:case 4:this.$=[];break;case 5:f[I-1].push(f[I]),this.$=f[I-1];break;case 6:this.$=[];break;case 7:case 22:case 32:case 36:case 37:case 38:case 39:case 40:this.$=f[I];break;case 8:l.setDiagramTitle(f[I].substr(6)),this.$=f[I].substr(6);break;case 9:l.addSubsetData([f[I]],void 0,void 0),l.setIndentMode&&l.setIndentMode(!0);break;case 10:l.addSubsetData([f[I-1]],f[I],void 0),l.setIndentMode&&l.setIndentMode(!0);break;case 11:l.addSubsetData([f[I-2]],void 0,parseFloat(f[I])),l.setIndentMode&&l.setIndentMode(!0);break;case 12:l.addSubsetData([f[I-3]],f[I-2],parseFloat(f[I])),l.setIndentMode&&l.setIndentMode(!0);break;case 13:if(f[I].length<2)throw new Error("union requires multiple identifiers");l.validateUnionIdentifiers&&l.validateUnionIdentifiers(f[I]),l.addSubsetData(f[I],void 0,void 0),l.setIndentMode&&l.setIndentMode(!0);break;case 14:if(f[I-1].length<2)throw new Error("union requires multiple identifiers");l.validateUnionIdentifiers&&l.validateUnionIdentifiers(f[I-1]),l.addSubsetData(f[I-1],f[I],void 0),l.setIndentMode&&l.setIndentMode(!0);break;case 15:if(f[I-2].length<2)throw new Error("union requires multiple identifiers");l.validateUnionIdentifiers&&l.validateUnionIdentifiers(f[I-2]),l.addSubsetData(f[I-2],void 0,parseFloat(f[I])),l.setIndentMode&&l.setIndentMode(!0);break;case 16:if(f[I-3].length<2)throw new Error("union requires multiple identifiers");l.validateUnionIdentifiers&&l.validateUnionIdentifiers(f[I-3]),l.addSubsetData(f[I-3],f[I-2],parseFloat(f[I])),l.setIndentMode&&l.setIndentMode(!0);break;case 17:case 18:case 19:l.addTextData(f[I-1],f[I],void 0);break;case 20:case 21:l.addTextData(f[I-2],f[I-1],f[I]);break;case 23:l.addStyleData(f[I-1],f[I]);break;case 24:case 25:case 26:var C=l.getCurrentSets();if(!C)throw new Error("text requires set");l.addTextData(C,f[I],void 0);break;case 27:case 28:var C=l.getCurrentSets();if(!C)throw new Error("text requires set");l.addTextData(C,f[I-1],f[I]);break;case 29:case 41:this.$=[f[I]];break;case 30:case 42:this.$=[...f[I-2],f[I]];break;case 31:this.$=[f[I-2],f[I]];break;case 33:this.$=f[I].join(" ");break;case 34:this.$=[f[I]];break;case 35:f[I-1].push(f[I]),this.$=f[I-1];break;case 43:case 44:this.$=f[I];break}},"anonymous"),table:[t(n,[2,2],{3:1,4:2}),{1:[3]},{5:[1,3],8:[1,4]},t(s,[2,4],{6:5}),t(n,[2,3]),{7:[1,6],8:[1,8],9:7,10:9,11:[1,10],12:[1,11],17:[1,12],19:[1,13],22:[1,14],24:[1,15]},{1:[2,1]},t(s,[2,5]),t(s,[2,6]),t(s,[2,7]),t(s,[2,8]),{13:16,20:e,21:i},{13:20,18:19,20:e,21:i},{13:20,18:21,20:e,21:i},{16:[1,25],20:[1,23],21:[1,24],23:22},{13:20,18:26,20:e,21:i},t(s,[2,9],{14:[1,27],15:[1,28]}),t(r,[2,43]),t(r,[2,44]),t(s,[2,13],{14:[1,29],15:[1,30],27:a}),t(r,[2,41]),{16:[1,34],20:[1,32],21:[1,33],27:a},t(s,[2,22]),t(s,[2,24],{14:[1,35]}),t(s,[2,25],{14:[1,36]}),t(s,[2,26]),{20:c,25:37,26:38,27:a},t(s,[2,10],{15:[1,40]}),{16:[1,41]},t(s,[2,14],{15:[1,42]}),{16:[1,43]},{13:44,20:e,21:i},t(s,[2,17],{14:[1,45]}),t(s,[2,18],{14:[1,46]}),t(s,[2,19]),t(s,[2,27]),t(s,[2,28]),t(s,[2,23],{27:[1,47]}),t(h,[2,29]),{15:[1,48]},{16:[1,49]},t(s,[2,11]),{16:[1,50]},t(s,[2,15]),t(r,[2,42]),t(s,[2,20]),t(s,[2,21]),{20:c,26:51},{16:u,20:o,21:[1,53],28:52,29:54,30:55,31:y,32:d,33:b},t(s,[2,12]),t(s,[2,16]),t(h,[2,30]),t(h,[2,31]),t(h,[2,32]),t(h,[2,33],{30:61,16:u,20:o,31:y,32:d,33:b}),t(x,[2,34]),t(x,[2,36]),t(x,[2,37]),t(x,[2,38]),t(x,[2,39]),t(x,[2,40]),t(x,[2,35])],defaultActions:{6:[2,1]},parseError:w(function(g,m){if(m.recoverable)this.trace(g);else{var v=new Error(g);throw v.hash=m,v}},"parseError"),parse:w(function(g){var m=this,v=[0],l=[],p=[null],f=[],O=this.table,I="",C=0,U=0,P=0,E=2,D=1,R=f.slice.call(arguments,1),z=Object.create(this.lexer),N={yy:{}};for(var L in this.yy)Object.prototype.hasOwnProperty.call(this.yy,L)&&(N.yy[L]=this.yy[L]);z.setInput(g,N.yy),N.yy.lexer=z,N.yy.parser=this,typeof z.yylloc>"u"&&(z.yylloc={});var F=z.yylloc;f.push(F);var K=z.options&&z.options.ranges;typeof N.yy.parseError=="function"?this.parseError=N.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function H(W){v.length=v.length-2*W,p.length=p.length-W,f.length=f.length-W}w(H,"popStack");function j(){var W;return W=l.pop()||z.lex()||D,typeof W!="number"&&(W instanceof Array&&(l=W,W=l.pop()),W=m.symbols_[W]||W),W}w(j,"lex");for(var A,Y,G,k,B,et,Z={},X,V,_t,st;;){if(G=v[v.length-1],this.defaultActions[G]?k=this.defaultActions[G]:((A===null||typeof A>"u")&&(A=j()),k=O[G]&&O[G][A]),typeof k>"u"||!k.length||!k[0]){var at="";st=[];for(X in O[G])this.terminals_[X]&&X>E&&st.push("'"+this.terminals_[X]+"'");z.showPosition?at="Parse error on line "+(C+1)+`: +`+z.showPosition()+` +Expecting `+st.join(", ")+", got '"+(this.terminals_[A]||A)+"'":at="Parse error on line "+(C+1)+": Unexpected "+(A==D?"end of input":"'"+(this.terminals_[A]||A)+"'"),this.parseError(at,{text:z.match,token:this.terminals_[A]||A,line:z.yylineno,loc:F,expected:st})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+G+", token: "+A);switch(k[0]){case 1:v.push(A),p.push(z.yytext),f.push(z.yylloc),v.push(k[1]),A=null,Y?(A=Y,Y=null):(U=z.yyleng,I=z.yytext,C=z.yylineno,F=z.yylloc,P>0&&P--);break;case 2:if(V=this.productions_[k[1]][1],Z.$=p[p.length-V],Z._$={first_line:f[f.length-(V||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(V||1)].first_column,last_column:f[f.length-1].last_column},K&&(Z._$.range=[f[f.length-(V||1)].range[0],f[f.length-1].range[1]]),et=this.performAction.apply(Z,[I,U,C,N.yy,k[1],p,f].concat(R)),typeof et<"u")return et;V&&(v=v.slice(0,-1*V*2),p=p.slice(0,-1*V),f=f.slice(0,-1*V)),v.push(this.productions_[k[1]][0]),p.push(Z.$),f.push(Z._$),_t=O[v[v.length-2]][v[v.length-1]],v.push(_t);break;case 3:return!0}}return!0},"parse")},T=(function(){var S={EOF:1,parseError:w(function(m,v){if(this.yy.parser)this.yy.parser.parseError(m,v);else throw new Error(m)},"parseError"),setInput:w(function(g,m){return this.yy=m||this.yy||{},this._input=g,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:w(function(){var g=this._input[0];this.yytext+=g,this.yyleng++,this.offset++,this.match+=g,this.matched+=g;var m=g.match(/(?:\r\n?|\n).*/g);return m?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),g},"input"),unput:w(function(g){var m=g.length,v=g.split(/(?:\r\n?|\n)/g);this._input=g+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-m),this.offset-=m;var l=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),v.length-1&&(this.yylineno-=v.length-1);var p=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:v?(v.length===l.length?this.yylloc.first_column:0)+l[l.length-v.length].length-v[0].length:this.yylloc.first_column-m},this.options.ranges&&(this.yylloc.range=[p[0],p[0]+this.yyleng-m]),this.yyleng=this.yytext.length,this},"unput"),more:w(function(){return this._more=!0,this},"more"),reject:w(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:w(function(g){this.unput(this.match.slice(g))},"less"),pastInput:w(function(){var g=this.matched.substr(0,this.matched.length-this.match.length);return(g.length>20?"...":"")+g.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:w(function(){var g=this.match;return g.length<20&&(g+=this._input.substr(0,20-g.length)),(g.substr(0,20)+(g.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:w(function(){var g=this.pastInput(),m=new Array(g.length+1).join("-");return g+this.upcomingInput()+` +`+m+"^"},"showPosition"),test_match:w(function(g,m){var v,l,p;if(this.options.backtrack_lexer&&(p={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(p.yylloc.range=this.yylloc.range.slice(0))),l=g[0].match(/(?:\r\n?|\n).*/g),l&&(this.yylineno+=l.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:l?l[l.length-1].length-l[l.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+g[0].length},this.yytext+=g[0],this.match+=g[0],this.matches=g,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(g[0].length),this.matched+=g[0],v=this.performAction.call(this,this.yy,this,m,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),v)return v;if(this._backtrack){for(var f in p)this[f]=p[f];return!1}return!1},"test_match"),next:w(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var g,m,v,l;this._more||(this.yytext="",this.match="");for(var p=this._currentRules(),f=0;fm[0].length)){if(m=v,l=f,this.options.backtrack_lexer){if(g=this.test_match(v,p[f]),g!==!1)return g;if(this._backtrack){m=!1;continue}else return!1}else if(!this.options.flex)break}return m?(g=this.test_match(m,p[l]),g!==!1?g:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:w(function(){var m=this.next();return m||this.lex()},"lex"),begin:w(function(m){this.conditionStack.push(m)},"begin"),popState:w(function(){var m=this.conditionStack.length-1;return m>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:w(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:w(function(m){return m=this.conditionStack.length-1-Math.abs(m||0),m>=0?this.conditionStack[m]:"INITIAL"},"topState"),pushState:w(function(m){this.begin(m)},"pushState"),stateStackSize:w(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:w(function(m,v,l,p){var f=p;switch(l){case 0:break;case 1:break;case 2:break;case 3:if(m.getIndentMode&&m.getIndentMode())return m.consumeIndentText=!0,this.begin("INITIAL"),22;break;case 4:break;case 5:m.setIndentMode&&m.setIndentMode(!1),this.begin("INITIAL"),this.unput(v.yytext);break;case 6:return this.begin("bol"),8;break;case 7:break;case 8:break;case 9:return 7;case 10:return 11;case 11:return 5;case 12:return 12;case 13:return 17;case 14:if(m.consumeIndentText)m.consumeIndentText=!1;else return 19;break;case 15:return 24;case 16:return v.yytext=v.yytext.slice(2,-2),14;break;case 17:return v.yytext=v.yytext.slice(1,-1).trim(),14;break;case 18:return 16;case 19:return 31;case 20:return 33;case 21:return 32;case 22:return 20;case 23:return 21;case 24:return 27;case 25:return 15}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[ \t]+(?=[\n\r]))/i,/^(?:[ \t]+(?=text\b))/i,/^(?:[ \t]+)/i,/^(?:[^ \t\n\r])/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[ \t]+)/i,/^(?:$)/i,/^(?:title\s[^#\n;]+)/i,/^(?:venn-beta\b)/i,/^(?:set\b)/i,/^(?:union\b)/i,/^(?:text\b)/i,/^(?:style\b)/i,/^(?:\["[^\"]*"\])/i,/^(?:\[[^\]\"]+\])/i,/^(?:[+-]?(\d+(\.\d+)?|\.\d+))/i,/^(?:#[0-9a-fA-F]{3,8})/i,/^(?:rgba\(\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*\))/i,/^(?:rgb\(\s*[0-9.]+\s*[,]\s*[0-9.]+\s*[,]\s*[0-9.]+\s*\))/i,/^(?:[A-Za-z_][A-Za-z0-9\-_]*)/i,/^(?:"[^\"]*")/i,/^(?:,)/i,/^(?::)/i],conditions:{bol:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],inclusive:!0},INITIAL:{rules:[0,1,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],inclusive:!0}}};return S})();M.lexer=T;function _(){this.yy={}}return w(_,"Parser"),_.prototype=M,M.Parser=_,new _})();bt.parser=bt;var Ee=bt,vt=[],kt=[],It=[],Mt=new Set,St,wt=!1,Te=w((t,n,s)=>{let e=ot(t).sort(),i=s??10/Math.pow(t.length,2);St=e,e.length===1&&Mt.add(e[0]),vt.push({sets:e,size:i,label:n?nt(n):void 0})},"addSubsetData"),ze=w(()=>vt,"getSubsetData"),nt=w(t=>{let n=t.trim();return n.length>=2&&n.startsWith('"')&&n.endsWith('"')?n.slice(1,-1):n},"normalizeText"),Ae=w(t=>t&&nt(t),"normalizeStyleValue"),De=w((t,n,s)=>{let e=nt(n);kt.push({sets:ot(t).sort(),id:e,label:s?nt(s):void 0})},"addTextData"),Re=w((t,n)=>{let s=ot(t).sort(),e={};for(let[i,r]of n)e[i]=Ae(r)??r;It.push({targets:s,styles:e})},"addStyleData"),Ce=w(()=>It,"getStyleData"),ot=w(t=>t.map(n=>nt(n)),"normalizeIdentifierList"),Ne=w(t=>{let s=ot(t).filter(e=>!Mt.has(e));if(s.length>0)throw new Error(`unknown set identifier: ${s.join(", ")}`)},"validateUnionIdentifiers"),Oe=w(()=>kt,"getTextData"),Le=w(()=>St,"getCurrentSets"),Fe=w(()=>wt,"getIndentMode"),je=w(t=>{wt=t},"setIndentMode"),Pe=Dt.venn;function ae(){return Bt(Pe,ct().venn)}w(ae,"getConfig");var Ve=w(()=>{Ct(),vt.length=0,kt.length=0,It.length=0,Mt.clear(),St=void 0,wt=!1},"customClear"),Be={getConfig:ae,clear:Ve,setAccTitle:Nt,getAccTitle:Ot,setDiagramTitle:jt,getDiagramTitle:Pt,getAccDescription:Ft,setAccDescription:Lt,addSubsetData:Te,getSubsetData:ze,addTextData:De,addStyleData:Re,validateUnionIdentifiers:Ne,getTextData:Oe,getStyleData:Ce,getCurrentSets:Le,getIndentMode:Fe,setIndentMode:je},qe=w(t=>` + .venn-title { + font-size: 32px; + fill: ${t.vennTitleTextColor}; + font-family: ${t.fontFamily}; + } + + .venn-circle text { + font-size: 48px; + font-family: ${t.fontFamily}; + } + + .venn-intersection text { + font-size: 48px; + fill: ${t.vennSetTextColor}; + font-family: ${t.fontFamily}; + } + + .venn-text-node { + font-family: ${t.fontFamily}; + color: ${t.vennSetTextColor}; + } +`,"getStyles"),Ue=qe;function le(t){let n=new Map;for(let s of t){let e=s.targets.join("|"),i=n.get(e);i?Object.assign(i,s.styles):n.set(e,Et({},s.styles))}return n}w(le,"buildStyleByKey");var Ge=w((t,n,s,e)=>{let i=e.db,r=i.getConfig?.(),{themeVariables:a,look:c,handDrawnSeed:h}=ct(),u=c==="handDrawn",o=[a.venn1,a.venn2,a.venn3,a.venn4,a.venn5,a.venn6,a.venn7,a.venn8].filter(Boolean),y=i.getDiagramTitle?.(),d=i.getSubsetData(),b=i.getTextData(),x=le(i.getStyleData()),M=r?.width??800,T=r?.height??450,S=M/1600,g=y?48*S:0,m=a.primaryTextColor??a.textColor,v=Vt(n);v.attr("viewBox",`0 0 ${M} ${T}`),y&&v.append("text").text(y).attr("class","venn-title").attr("font-size",`${32*S}px`).attr("text-anchor","middle").attr("dominant-baseline","middle").attr("x","50%").attr("y",32*S).style("fill",a.vennTitleTextColor||a.titleColor);let l=it(document.createElement("div")),p=ee().width(M).height(T-g);l.datum(d).call(p);let f=u?qt.svg(l.select("svg").node()):void 0,O=oe(d,{width:M,height:T-g,padding:r?.padding??15}),I=new Map;for(let E of O){let D=Q([...E.data.sets].sort());I.set(D,E)}b.length>0&&ce(r,I,l,b,S,x);let C=Tt(a.background||"#f4f4f4");l.selectAll(".venn-circle").each(function(E,D){let R=it(this),N=Q([...E.sets].sort()),L=x.get(N),F=L?.fill||o[D%o.length]||a.primaryColor;R.classed(`venn-set-${D%8}`,!0);let K=L?.["fill-opacity"]??.1,H=L?.stroke||F,j=L?.["stroke-width"]||`${5*S}`;if(u&&f){let Y=I.get(N);if(Y&&Y.circles.length>0){let G=Y.circles[0],k=f.circle(G.x,G.y,G.radius*2,{roughness:.7,seed:h,fill:lt(F,.7),fillStyle:"hachure",fillWeight:2,hachureGap:8,hachureAngle:-41+D*60,stroke:H,strokeWidth:parseFloat(String(j))});R.select("path").remove(),R.node()?.insertBefore(k,R.select("text").node())}}else R.select("path").style("fill",F).style("fill-opacity",K).style("stroke",H).style("stroke-width",j).style("stroke-opacity",.95);let A=L?.color||(C?zt(F,30):At(F,30));R.select("text").style("font-size",`${48*S}px`).style("fill",A)}),u&&f?l.selectAll(".venn-intersection").each(function(E){let D=it(this),z=Q([...E.sets].sort()),N=x.get(z),L=N?.fill;if(L){let F=D.select("path"),K=F.attr("d");if(K){let H=f.path(K,{roughness:.7,seed:h,fill:lt(L,.3),fillStyle:"cross-hatch",fillWeight:2,hachureGap:6,hachureAngle:60,stroke:"none"}),j=F.node();j?.parentNode?.insertBefore(H,j),F.remove()}}else D.select("path").style("fill-opacity",0);D.select("text").style("font-size",`${48*S}px`).style("fill",N?.color??a.vennSetTextColor??m)}):(l.selectAll(".venn-intersection text").style("font-size",`${48*S}px`).style("fill",E=>{let R=Q([...E.sets].sort());return x.get(R)?.color??a.vennSetTextColor??m}),l.selectAll(".venn-intersection path").style("fill-opacity",E=>{let R=Q([...E.sets].sort());return x.get(R)?.fill?1:0}).style("fill",E=>{let R=Q([...E.sets].sort());return x.get(R)?.fill??"transparent"}));let U=v.append("g").attr("transform",`translate(0, ${g})`),P=l.select("svg").node();if(P&&"childNodes"in P)for(let E of[...P.childNodes])U.node()?.appendChild(E);Rt(v,T,M,r?.useMaxWidth??!0)},"draw");function Q(t){return t.join("|")}w(Q,"stableSetsKey");function ce(t,n,s,e,i,r){let a=t?.useDebugLayout??!1,h=s.select("svg").append("g").attr("class","venn-text-nodes"),u=new Map;for(let o of e){let y=Q(o.sets),d=u.get(y);d?d.push(o):u.set(y,[o])}for(let[o,y]of u.entries()){let d=n.get(o);if(!d?.text)continue;let b=d.text.x,x=d.text.y,M=Math.min(...d.circles.map(E=>E.radius)),T=Math.min(...d.circles.map(E=>E.radius-Math.hypot(b-E.x,x-E.y))),_=Number.isFinite(T)?Math.max(0,T):0;_===0&&Number.isFinite(M)&&(_=M*.6);let S=h.append("g").attr("class","venn-text-area").attr("font-size",`${40*i}px`);a&&S.append("circle").attr("class","venn-text-debug-circle").attr("cx",b).attr("cy",x).attr("r",_).attr("fill","none").attr("stroke","purple").attr("stroke-width",1.5*i).attr("stroke-dasharray",`${6*i} ${4*i}`);let g=Math.max(80*i,_*2*.95),m=Math.max(60*i,_*2*.95),p=(d.data.label&&d.data.label.length>0?Math.min(32*i,_*.25):0)+(y.length<=2?30*i:0),f=b-g/2,O=x-m/2+p,I=Math.max(1,Math.ceil(Math.sqrt(y.length))),C=Math.max(1,Math.ceil(y.length/I)),U=g/I,P=m/C;for(let[E,D]of y.entries()){let R=E%I,z=Math.floor(E/I),N=f+U*(R+.5),L=O+P*(z+.5);a&&S.append("rect").attr("class","venn-text-debug-cell").attr("x",f+U*R).attr("y",O+P*z).attr("width",U).attr("height",P).attr("fill","none").attr("stroke","teal").attr("stroke-width",1*i).attr("stroke-dasharray",`${4*i} ${3*i}`);let F=U*.9,K=P*.9,H=S.append("foreignObject").attr("class","venn-text-node-fo").attr("width",F).attr("height",K).attr("x",N-F/2).attr("y",L-K/2).attr("overflow","visible"),j=r.get(D.id)?.color,A=H.append("xhtml:span").attr("class","venn-text-node").style("display","flex").style("width","100%").style("height","100%").style("white-space","normal").style("align-items","center").style("justify-content","center").style("text-align","center").style("overflow-wrap","normal").style("word-break","normal").text(D.label??D.id);j&&A.style("color",j)}}}w(ce,"renderTextNodes");var We={draw:Ge},$e={parser:Ee,db:Be,renderer:We,styles:Ue};export{$e as diagram}; diff --git a/src/google/adk/cli/browser/chunk-LA76DWZL.js b/src/google/adk/cli/browser/chunk-LA76DWZL.js new file mode 100644 index 0000000000..d2277db602 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-LA76DWZL.js @@ -0,0 +1,70 @@ +import{a as dt}from"./chunk-TPDTRWWV.js";import{a as ft}from"./chunk-PRKFGJVH.js";import{k as yt}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{M as nt,N as at,R as rt,S as lt,T as ot,U as ht,V as ct,W as Q,X as ut,Y as J}from"./chunk-QFMJV7VH.js";import{g as l}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";var et=(function(){var t=l(function(M,e,s,i){for(s=s||{},i=M.length;i--;s[M[i]]=e);return s},"o"),d=[1,4],a=[1,14],r=[1,12],o=[1,13],y=[6,7,8],p=[1,20],u=[1,18],w=[1,19],c=[6,7,11],m=[1,6,13,14],k=[1,23],_=[1,24],x=[1,6,7,11,13,14],N={trace:l(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ishikawa:4,spaceLines:5,SPACELINE:6,NL:7,ISHIKAWA:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,TEXT:14,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"ISHIKAWA",11:"EOF",13:"SPACELIST",14:"TEXT"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,1],[12,1],[12,1]],performAction:l(function(e,s,i,h,f,n,v){var b=n.length-1;switch(f){case 6:case 7:return h;case 15:h.addNode(n[b-1].length,n[b].trim());break;case 16:h.addNode(0,n[b].trim());break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:d},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:d},{6:a,7:[1,10],9:9,12:11,13:r,14:o},t(y,[2,3]),{1:[2,2]},t(y,[2,4]),t(y,[2,5]),{1:[2,6],6:a,12:15,13:r,14:o},{6:a,9:16,12:11,13:r,14:o},{6:p,7:u,10:17,11:w},t(c,[2,18],{14:[1,21]}),t(c,[2,16]),t(c,[2,17]),{6:p,7:u,10:22,11:w},{1:[2,7],6:a,12:15,13:r,14:o},t(m,[2,14],{7:k,11:_}),t(x,[2,8]),t(x,[2,9]),t(x,[2,10]),t(c,[2,15]),t(m,[2,13],{7:k,11:_}),t(x,[2,11]),t(x,[2,12])],defaultActions:{2:[2,1],6:[2,2]},parseError:l(function(e,s){if(s.recoverable)this.trace(e);else{var i=new Error(e);throw i.hash=s,i}},"parseError"),parse:l(function(e){var s=this,i=[0],h=[],f=[null],n=[],v=this.table,b="",I=0,S=0,A=0,L=2,O=1,Z=n.slice.call(arguments,1),g=Object.create(this.lexer),E={yy:{}};for(var V in this.yy)Object.prototype.hasOwnProperty.call(this.yy,V)&&(E.yy[V]=this.yy[V]);g.setInput(e,E.yy),E.yy.lexer=g,E.yy.parser=this,typeof g.yylloc>"u"&&(g.yylloc={});var R=g.yylloc;n.push(R);var X=g.options&&g.options.ranges;typeof E.yy.parseError=="function"?this.parseError=E.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function xt(P){i.length=i.length-2*P,f.length=f.length-P,n.length=n.length-P}l(xt,"popStack");function it(){var P;return P=h.pop()||g.lex()||O,typeof P!="number"&&(P instanceof Array&&(h=P,P=h.pop()),P=s.symbols_[P]||P),P}l(it,"lex");for(var T,Y,W,B,Vt,K,F={},H,C,st,G;;){if(W=i[i.length-1],this.defaultActions[W]?B=this.defaultActions[W]:((T===null||typeof T>"u")&&(T=it()),B=v[W]&&v[W][T]),typeof B>"u"||!B.length||!B[0]){var q="";G=[];for(H in v[W])this.terminals_[H]&&H>L&&G.push("'"+this.terminals_[H]+"'");g.showPosition?q="Parse error on line "+(I+1)+`: +`+g.showPosition()+` +Expecting `+G.join(", ")+", got '"+(this.terminals_[T]||T)+"'":q="Parse error on line "+(I+1)+": Unexpected "+(T==O?"end of input":"'"+(this.terminals_[T]||T)+"'"),this.parseError(q,{text:g.match,token:this.terminals_[T]||T,line:g.yylineno,loc:R,expected:G})}if(B[0]instanceof Array&&B.length>1)throw new Error("Parse Error: multiple actions possible at state: "+W+", token: "+T);switch(B[0]){case 1:i.push(T),f.push(g.yytext),n.push(g.yylloc),i.push(B[1]),T=null,Y?(T=Y,Y=null):(S=g.yyleng,b=g.yytext,I=g.yylineno,R=g.yylloc,A>0&&A--);break;case 2:if(C=this.productions_[B[1]][1],F.$=f[f.length-C],F._$={first_line:n[n.length-(C||1)].first_line,last_line:n[n.length-1].last_line,first_column:n[n.length-(C||1)].first_column,last_column:n[n.length-1].last_column},X&&(F._$.range=[n[n.length-(C||1)].range[0],n[n.length-1].range[1]]),K=this.performAction.apply(F,[b,S,I,E.yy,B[1],f,n].concat(Z)),typeof K<"u")return K;C&&(i=i.slice(0,-1*C*2),f=f.slice(0,-1*C),n=n.slice(0,-1*C)),i.push(this.productions_[B[1]][0]),f.push(F.$),n.push(F._$),st=v[i[i.length-2]][i[i.length-1]],i.push(st);break;case 3:return!0}}return!0},"parse")},D=(function(){var M={EOF:1,parseError:l(function(s,i){if(this.yy.parser)this.yy.parser.parseError(s,i);else throw new Error(s)},"parseError"),setInput:l(function(e,s){return this.yy=s||this.yy||{},this._input=e,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:l(function(){var e=this._input[0];this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e;var s=e.match(/(?:\r\n?|\n).*/g);return s?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e},"input"),unput:l(function(e){var s=e.length,i=e.split(/(?:\r\n?|\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-s),this.offset-=s;var h=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),i.length-1&&(this.yylineno-=i.length-1);var f=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:i?(i.length===h.length?this.yylloc.first_column:0)+h[h.length-i.length].length-i[0].length:this.yylloc.first_column-s},this.options.ranges&&(this.yylloc.range=[f[0],f[0]+this.yyleng-s]),this.yyleng=this.yytext.length,this},"unput"),more:l(function(){return this._more=!0,this},"more"),reject:l(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:l(function(e){this.unput(this.match.slice(e))},"less"),pastInput:l(function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:l(function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:l(function(){var e=this.pastInput(),s=new Array(e.length+1).join("-");return e+this.upcomingInput()+` +`+s+"^"},"showPosition"),test_match:l(function(e,s){var i,h,f;if(this.options.backtrack_lexer&&(f={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(f.yylloc.range=this.yylloc.range.slice(0))),h=e[0].match(/(?:\r\n?|\n).*/g),h&&(this.yylineno+=h.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:h?h[h.length-1].length-h[h.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],i=this.performAction.call(this,this.yy,this,s,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),i)return i;if(this._backtrack){for(var n in f)this[n]=f[n];return!1}return!1},"test_match"),next:l(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var e,s,i,h;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),n=0;ns[0].length)){if(s=i,h=n,this.options.backtrack_lexer){if(e=this.test_match(i,f[n]),e!==!1)return e;if(this._backtrack){s=!1;continue}else return!1}else if(!this.options.flex)break}return s?(e=this.test_match(s,f[h]),e!==!1?e:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:l(function(){var s=this.next();return s||this.lex()},"lex"),begin:l(function(s){this.conditionStack.push(s)},"begin"),popState:l(function(){var s=this.conditionStack.length-1;return s>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:l(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:l(function(s){return s=this.conditionStack.length-1-Math.abs(s||0),s>=0?this.conditionStack[s]:"INITIAL"},"topState"),pushState:l(function(s){this.begin(s)},"pushState"),stateStackSize:l(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:l(function(s,i,h,f){var n=f;switch(h){case 0:return 6;case 1:return 8;case 2:return 8;case 3:return 6;case 4:return 7;case 5:return 13;case 6:return 14;case 7:return 11}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:ishikawa-beta\b)/i,/^(?:ishikawa\b)/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:[^\n]+)/i,/^(?:$)/i],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7],inclusive:!0}}};return M})();N.lexer=D;function $(){this.yy={}}return l($,"Parser"),$.prototype=N,N.Parser=$,new $})();et.parser=et;var vt=et,St=class{constructor(){this.stack=[],this.clear=this.clear.bind(this),this.addNode=this.addNode.bind(this),this.getRoot=this.getRoot.bind(this)}static{l(this,"IshikawaDB")}clear(){this.root=void 0,this.stack=[],this.baseLevel=void 0,rt()}getRoot(){return this.root}addNode(t,d){let a=nt.sanitizeText(d,J());if(!this.root){this.baseLevel=t,this.root={text:a,children:[]},this.stack=[{level:0,node:this.root}],Q(a);return}let r=t-(this.baseLevel??0);for(r<=0&&(r=1);this.stack.length>1&&this.stack[this.stack.length-1].level>=r;)this.stack.pop();let o=this.stack[this.stack.length-1].node,y={text:a,children:[]};o.children.push(y),this.stack.push({level:r,node:y})}getAccTitle(){return ot()}setAccTitle(t){lt(t)}getAccDescription(){return ct()}setAccDescription(t){ht(t)}getDiagramTitle(){return ut()}setDiagramTitle(t){Q(t)}},Et=14,j=250,$t=30,At=60,It=5,bt=82*Math.PI/180,pt=Math.cos(bt),gt=Math.sin(bt),kt=l((t,d,a)=>{let r=t.node().getBBox(),o=r.width+d*2,y=r.height+d*2;at(t,y,o,a),t.attr("viewBox",`${r.x-d} ${r.y-d} ${o} ${y}`)},"applyPaddedViewBox"),Lt=l((t,d,a,r)=>{let y=r.db.getRoot();if(!y)return;let p=J(),{look:u,handDrawnSeed:w,themeVariables:c}=p,m=yt(p.fontSize)[0]??Et,k=u==="handDrawn",_=y.children??[],x=p.ishikawa?.diagramPadding??20,N=p.ishikawa?.useMaxWidth??!1,D=dt(d),$=D.append("g").attr("class","ishikawa"),M=k?ft.svg(D.node()):void 0,e=M?{roughSvg:M,seed:w??0,lineColor:c?.lineColor??"#333",fillColor:c?.mainBkg??"#fff"}:void 0,s=`ishikawa-arrow-${d}`;k||$.append("defs").append("marker").attr("id",s).attr("viewBox","0 0 10 10").attr("refX",0).attr("refY",5).attr("markerWidth",6).attr("markerHeight",6).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 Z").attr("class","ishikawa-arrow");let i=0,h=j,f=k?void 0:z($,i,h,i,h,"ishikawa-spine");if(Tt($,i,h,y.text,m,e),!_.length){k&&z($,i,h,i,h,"ishikawa-spine",e),kt(D,x,N);return}i-=20;let n=_.filter((g,E)=>E%2===0),v=_.filter((g,E)=>E%2===1),b=mt(n),I=mt(v),S=b.total+I.total,A=j,L=j;if(S>0){let g=j*2,E=j*.3;A=Math.max(E,g*(b.total/S)),L=Math.max(E,g*(I.total/S))}let O=m*2;A=Math.max(A,b.max*O),L=Math.max(L,I.max*O),h=Math.max(A,j),f&&f.attr("y1",h).attr("y2",h),$.select(".ishikawa-head-group").attr("transform",`translate(0,${h})`);let Z=Math.ceil(_.length/2);for(let g=0;gMath.min(V,R.getBBox().x),1/0)}if(k)z($,i,h,0,h,"ishikawa-spine",e);else{f.attr("x1",i);let g=`url(#${s})`;$.selectAll("line.ishikawa-branch, line.ishikawa-sub-branch").attr("marker-start",g)}kt(D,x,N)},"draw"),mt=l(t=>{let d=l(a=>a.children.reduce((r,o)=>r+1+d(o),0),"countDescendants");return t.reduce((a,r)=>{let o=d(r);return a.total+=o,a.max=Math.max(a.max,o),a},{total:0,max:0})},"sideStats"),Tt=l((t,d,a,r,o,y)=>{let p=Math.max(6,Math.floor(110/(o*.6))),u=t.append("g").attr("class","ishikawa-head-group").attr("transform",`translate(${d},${a})`),w=U(u,_t(r,p),0,0,"ishikawa-head-label","start",o),c=w.node().getBBox(),m=Math.max(60,c.width+6),k=Math.max(40,c.height*2+40),_=`M 0 ${-k/2} L 0 ${k/2} Q ${m*2.4} 0 0 ${-k/2} Z`;if(y){let x=y.roughSvg.path(_,{roughness:1.5,seed:y.seed,fill:y.fillColor,fillStyle:"hachure",fillWeight:2.5,hachureGap:5,stroke:y.lineColor,strokeWidth:2});u.insert(()=>x,":first-child").attr("class","ishikawa-head")}else u.insert("path",":first-child").attr("class","ishikawa-head").attr("d",_);w.attr("transform",`translate(${(m-c.width)/2-c.x+3},${-c.y-c.height/2})`)},"drawHead"),Mt=l((t,d)=>{let a=[],r=[],o=l((y,p,u)=>{let w=d===-1?[...y].reverse():y;for(let c of w){let m=a.length,k=c.children??[];a.push({depth:u,text:_t(c.text,15),parentIndex:p,childCount:k.length}),u%2===0?(r.push(m),k.length&&o(k,m,u+1)):(k.length&&o(k,m,u+1),r.push(m))}},"walk");return o(t,-1,2),{entries:a,yOrder:r}},"flattenTree"),Pt=l((t,d,a,r,o,y,p)=>{let u=t.append("g").attr("class","ishikawa-label-group"),c=U(u,d,a,r+11*o,"ishikawa-label cause","middle",y).node().getBBox();if(p){let m=p.roughSvg.rectangle(c.x-20,c.y-2,c.width+40,c.height+4,{roughness:1.5,seed:p.seed,fill:p.fillColor,fillStyle:"hachure",fillWeight:2.5,hachureGap:5,stroke:p.lineColor,strokeWidth:2});u.insert(()=>m,":first-child").attr("class","ishikawa-label-box")}else u.insert("rect",":first-child").attr("class","ishikawa-label-box").attr("x",c.x-20).attr("y",c.y-2).attr("width",c.width+40).attr("height",c.height+4)},"drawCauseLabel"),tt=l((t,d,a,r,o,y)=>{let p=Math.sqrt(r*r+o*o);if(p===0)return;let u=r/p,w=o/p,c=6,m=-w*c,k=u*c,_=d,x=a,N=`M ${_} ${x} L ${_-u*c*2+m} ${x-w*c*2+k} L ${_-u*c*2-m} ${x-w*c*2-k} Z`,D=y.roughSvg.path(N,{roughness:1,seed:y.seed,fill:y.lineColor,fillStyle:"solid",stroke:y.lineColor,strokeWidth:1});t.append(()=>D)},"drawArrowMarker"),Bt=l((t,d,a,r,o,y,p,u)=>{let w=d.children??[],c=y*(w.length?1:.2),m=-pt*c,k=gt*c*o,_=a+m,x=r+k;if(z(t,a,r,_,x,"ishikawa-branch",u),u&&tt(t,a,r,a-_,r-x,u),Pt(t,d.text,_,x,o,p,u),!w.length)return;let{entries:N,yOrder:D}=Mt(w,o),$=N.length,M=new Array($);for(let[f,n]of D.entries())M[n]=r+k*((f+1)/($+1));let e=new Map;e.set(-1,{x0:a,y0:r,x1:_,y1:x,childCount:w.length,childrenDrawn:0});let s=-pt,i=gt*o,h=o<0?"ishikawa-label up":"ishikawa-label down";for(let[f,n]of N.entries()){let v=M[f],b=e.get(n.parentIndex),I=t.append("g").attr("class","ishikawa-sub-group"),S=0,A=0,L=0;if(n.depth%2===0){let O=b.y1-b.y0;S=wt(b.x0,b.x1,O?(v-b.y0)/O:.5),A=v,L=S-(n.childCount>0?At+n.childCount*It:$t),z(I,S,v,L,v,"ishikawa-sub-branch",u),u&&tt(I,S,v,1,0,u),U(I,n.text,L,v,"ishikawa-label align","end",p)}else{let O=b.childrenDrawn++;S=wt(b.x0,b.x1,(b.childCount-O)/(b.childCount+1)),A=b.y0,L=S+s*((v-A)/i),z(I,S,A,L,v,"ishikawa-sub-branch",u),u&&tt(I,S,A,S-L,A-v,u),U(I,n.text,L,v,h,"end",p)}n.childCount>0&&e.set(f,{x0:S,y0:A,x1:L,y1:v,childCount:n.childCount,childrenDrawn:0})}},"drawBranch"),Nt=l(t=>t.split(/|\n/),"splitLines"),_t=l((t,d)=>{if(t.length<=d)return t;let a=[];for(let r of t.split(/\s+/)){let o=a.length-1;o>=0&&a[o].length+1+r.length<=d?a[o]+=" "+r:a.push(r)}return a.join(` +`)},"wrapText"),U=l((t,d,a,r,o,y,p)=>{let u=Nt(d),w=p*1.05,c=t.append("text").attr("class",o).attr("text-anchor",y).attr("x",a).attr("y",r-(u.length-1)*w/2);for(let[m,k]of u.entries())c.append("tspan").attr("x",a).attr("dy",m===0?0:w).text(k);return c},"drawMultilineText"),wt=l((t,d,a)=>t+(d-t)*a,"lerp"),z=l((t,d,a,r,o,y,p)=>{if(p){let u=p.roughSvg.line(d,a,r,o,{roughness:1.5,seed:p.seed,stroke:p.lineColor,strokeWidth:2});t.append(()=>u).attr("class",y);return}return t.append("line").attr("class",y).attr("x1",d).attr("y1",a).attr("x2",r).attr("y2",o)},"drawLine"),Dt={draw:Lt},Ot=l(t=>` +.ishikawa .ishikawa-spine, +.ishikawa .ishikawa-branch, +.ishikawa .ishikawa-sub-branch { + stroke: ${t.lineColor}; + stroke-width: 2; + fill: none; +} + +.ishikawa .ishikawa-sub-branch { + stroke-width: 1; +} + +.ishikawa .ishikawa-arrow { + fill: ${t.lineColor}; +} + +.ishikawa .ishikawa-head { + fill: ${t.mainBkg}; + stroke: ${t.lineColor}; + stroke-width: 2; +} + +.ishikawa .ishikawa-label-box { + fill: ${t.mainBkg}; + stroke: ${t.lineColor}; + stroke-width: 2; +} + +.ishikawa text { + font-family: ${t.fontFamily}; + font-size: ${t.fontSize}; + fill: ${t.textColor}; +} + +.ishikawa .ishikawa-head-label { + font-weight: 600; + text-anchor: middle; + dominant-baseline: middle; + font-size: 14px; +} + +.ishikawa .ishikawa-label { + text-anchor: end; +} + +.ishikawa .ishikawa-label.cause { + text-anchor: middle; + dominant-baseline: middle; +} + +.ishikawa .ishikawa-label.align { + text-anchor: end; + dominant-baseline: middle; +} + +.ishikawa .ishikawa-label.up { + dominant-baseline: baseline; +} + +.ishikawa .ishikawa-label.down { + dominant-baseline: hanging; +} +`,"getStyles"),Ct=Ot,Ht={parser:vt,get db(){return new St},renderer:Dt,styles:Ct};export{Ht as diagram}; diff --git a/src/google/adk/cli/browser/chunk-LI24J5PW.js b/src/google/adk/cli/browser/chunk-LI24J5PW.js new file mode 100644 index 0000000000..1290de323d --- /dev/null +++ b/src/google/adk/cli/browser/chunk-LI24J5PW.js @@ -0,0 +1,220 @@ +import{a as Mt}from"./chunk-APNCZOFE.js";import{a as Ut}from"./chunk-ST54LLJ3.js";import{b as Vt}from"./chunk-F57TI45K.js";import{e as Bt,m as Gt}from"./chunk-WBLSVR3V.js";import{M as B,R as Rt,S as Nt,T as wt,U as $t,V as Pt,W as Ft,X as Yt,Y as w}from"./chunk-QFMJV7VH.js";import{g as h,i as k}from"./chunk-JRNAXTJ7.js";import{j as Ot}from"./chunk-RMXJBC7V.js";var vt=(function(){var t=h(function(Y,o,c,n){for(c=c||{},n=Y.length;n--;c[Y[n]]=o);return c},"o"),e=[1,2],s=[1,3],a=[1,4],r=[2,4],u=[1,9],d=[1,11],S=[1,16],f=[1,17],T=[1,18],E=[1,19],_=[1,33],x=[1,20],v=[1,21],p=[1,22],D=[1,23],R=[1,24],L=[1,26],$=[1,27],I=[1,28],P=[1,29],et=[1,30],st=[1,31],it=[1,32],rt=[1,35],at=[1,36],nt=[1,37],ot=[1,38],j=[1,34],y=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],lt=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,39,40,41,45,48,51,52,53,54,57],xt=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],gt={trace:h(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,SD:6,document:7,line:8,statement:9,classDefStatement:10,styleStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"-->":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,CLICK:38,STRING:39,HREF:40,classDef:41,CLASSDEF_ID:42,CLASSDEF_STYLEOPTS:43,DEFAULT:44,style:45,STYLE_IDS:46,STYLEDEF_STYLEOPTS:47,class:48,CLASSENTITY_IDS:49,STYLECLASS:50,direction_tb:51,direction_bt:52,direction_rl:53,direction_lr:54,eol:55,";":56,EDGE_STATE:57,STYLE_SEPARATOR:58,left_of:59,right_of:60,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",6:"SD",14:"DESCR",15:"-->",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"CLICK",39:"STRING",40:"HREF",41:"classDef",42:"CLASSDEF_ID",43:"CLASSDEF_STYLEOPTS",44:"DEFAULT",45:"style",46:"STYLE_IDS",47:"STYLEDEF_STYLEOPTS",48:"class",49:"CLASSENTITY_IDS",50:"STYLECLASS",51:"direction_tb",52:"direction_bt",53:"direction_rl",54:"direction_lr",56:";",57:"EDGE_STATE",58:"STYLE_SEPARATOR",59:"left_of",60:"right_of"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[9,5],[9,5],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[55,1],[55,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]],performAction:h(function(o,c,n,g,b,i,X){var l=i.length-1;switch(b){case 3:return g.setRootDoc(i[l]),i[l];break;case 4:this.$=[];break;case 5:i[l]!="nl"&&(i[l-1].push(i[l]),this.$=i[l-1]);break;case 6:case 7:this.$=i[l];break;case 8:this.$="nl";break;case 12:this.$=i[l];break;case 13:let ht=i[l-1];ht.description=g.trimColon(i[l]),this.$=ht;break;case 14:this.$={stmt:"relation",state1:i[l-2],state2:i[l]};break;case 15:let ut=g.trimColon(i[l]);this.$={stmt:"relation",state1:i[l-3],state2:i[l-1],description:ut};break;case 19:this.$={stmt:"state",id:i[l-3],type:"default",description:"",doc:i[l-1]};break;case 20:var V=i[l],H=i[l-2].trim();if(i[l].match(":")){var J=i[l].split(":");V=J[0],H=[H,J[1]]}this.$={stmt:"state",id:V,type:"default",description:H};break;case 21:this.$={stmt:"state",id:i[l-3],type:"default",description:i[l-5],doc:i[l-1]};break;case 22:this.$={stmt:"state",id:i[l],type:"fork"};break;case 23:this.$={stmt:"state",id:i[l],type:"join"};break;case 24:this.$={stmt:"state",id:i[l],type:"choice"};break;case 25:this.$={stmt:"state",id:g.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:i[l-1].trim(),note:{position:i[l-2].trim(),text:i[l].trim()}};break;case 29:this.$=i[l].trim(),g.setAccTitle(this.$);break;case 30:case 31:this.$=i[l].trim(),g.setAccDescription(this.$);break;case 32:this.$={stmt:"click",id:i[l-3],url:i[l-2],tooltip:i[l-1]};break;case 33:this.$={stmt:"click",id:i[l-3],url:i[l-1],tooltip:""};break;case 34:case 35:this.$={stmt:"classDef",id:i[l-1].trim(),classes:i[l].trim()};break;case 36:this.$={stmt:"style",id:i[l-1].trim(),styleClass:i[l].trim()};break;case 37:this.$={stmt:"applyClass",id:i[l-1].trim(),styleClass:i[l].trim()};break;case 38:g.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 39:g.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 40:g.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 41:g.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 44:case 45:this.$={stmt:"state",id:i[l].trim(),type:"default",description:""};break;case 46:this.$={stmt:"state",id:i[l-2].trim(),classes:[i[l].trim()],type:"default",description:""};break;case 47:this.$={stmt:"state",id:i[l-2].trim(),classes:[i[l].trim()],type:"default",description:""};break}},"anonymous"),table:[{3:1,4:e,5:s,6:a},{1:[3]},{3:5,4:e,5:s,6:a},{3:6,4:e,5:s,6:a},t([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],r,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:u,5:d,8:8,9:10,10:12,11:13,12:14,13:15,16:S,17:f,19:T,22:E,24:_,25:x,26:v,27:p,28:D,29:R,32:25,33:L,35:$,37:I,38:P,41:et,45:st,48:it,51:rt,52:at,53:nt,54:ot,57:j},t(y,[2,5]),{9:39,10:12,11:13,12:14,13:15,16:S,17:f,19:T,22:E,24:_,25:x,26:v,27:p,28:D,29:R,32:25,33:L,35:$,37:I,38:P,41:et,45:st,48:it,51:rt,52:at,53:nt,54:ot,57:j},t(y,[2,7]),t(y,[2,8]),t(y,[2,9]),t(y,[2,10]),t(y,[2,11]),t(y,[2,12],{14:[1,40],15:[1,41]}),t(y,[2,16]),{18:[1,42]},t(y,[2,18],{20:[1,43]}),{23:[1,44]},t(y,[2,22]),t(y,[2,23]),t(y,[2,24]),t(y,[2,25]),{30:45,31:[1,46],59:[1,47],60:[1,48]},t(y,[2,28]),{34:[1,49]},{36:[1,50]},t(y,[2,31]),{13:51,24:_,57:j},{42:[1,52],44:[1,53]},{46:[1,54]},{49:[1,55]},t(lt,[2,44],{58:[1,56]}),t(lt,[2,45],{58:[1,57]}),t(y,[2,38]),t(y,[2,39]),t(y,[2,40]),t(y,[2,41]),t(y,[2,6]),t(y,[2,13]),{13:58,24:_,57:j},t(y,[2,17]),t(xt,r,{7:59}),{24:[1,60]},{24:[1,61]},{23:[1,62]},{24:[2,48]},{24:[2,49]},t(y,[2,29]),t(y,[2,30]),{39:[1,63],40:[1,64]},{43:[1,65]},{43:[1,66]},{47:[1,67]},{50:[1,68]},{24:[1,69]},{24:[1,70]},t(y,[2,14],{14:[1,71]}),{4:u,5:d,8:8,9:10,10:12,11:13,12:14,13:15,16:S,17:f,19:T,21:[1,72],22:E,24:_,25:x,26:v,27:p,28:D,29:R,32:25,33:L,35:$,37:I,38:P,41:et,45:st,48:it,51:rt,52:at,53:nt,54:ot,57:j},t(y,[2,20],{20:[1,73]}),{31:[1,74]},{24:[1,75]},{39:[1,76]},{39:[1,77]},t(y,[2,34]),t(y,[2,35]),t(y,[2,36]),t(y,[2,37]),t(lt,[2,46]),t(lt,[2,47]),t(y,[2,15]),t(y,[2,19]),t(xt,r,{7:78}),t(y,[2,26]),t(y,[2,27]),{5:[1,79]},{5:[1,80]},{4:u,5:d,8:8,9:10,10:12,11:13,12:14,13:15,16:S,17:f,19:T,21:[1,81],22:E,24:_,25:x,26:v,27:p,28:D,29:R,32:25,33:L,35:$,37:I,38:P,41:et,45:st,48:it,51:rt,52:at,53:nt,54:ot,57:j},t(y,[2,32]),t(y,[2,33]),t(y,[2,21])],defaultActions:{5:[2,1],6:[2,2],47:[2,48],48:[2,49]},parseError:h(function(o,c){if(c.recoverable)this.trace(o);else{var n=new Error(o);throw n.hash=c,n}},"parseError"),parse:h(function(o){var c=this,n=[0],g=[],b=[null],i=[],X=this.table,l="",V=0,H=0,J=0,ht=2,ut=1,ue=i.slice.call(arguments,1),m=Object.create(this.lexer),M={yy:{}};for(var Tt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Tt)&&(M.yy[Tt]=this.yy[Tt]);m.setInput(o,M.yy),M.yy.lexer=m,M.yy.parser=this,typeof m.yylloc>"u"&&(m.yylloc={});var bt=m.yylloc;i.push(bt);var de=m.options&&m.options.ranges;typeof M.yy.parseError=="function"?this.parseError=M.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function fe(O){n.length=n.length-2*O,b.length=b.length-O,i.length=i.length-O}h(fe,"popStack");function Lt(){var O;return O=g.pop()||m.lex()||ut,typeof O!="number"&&(O instanceof Array&&(g=O,O=g.pop()),O=c.symbols_[O]||O),O}h(Lt,"lex");for(var C,Et,U,N,Be,_t,W={},dt,F,It,ft;;){if(U=n[n.length-1],this.defaultActions[U]?N=this.defaultActions[U]:((C===null||typeof C>"u")&&(C=Lt()),N=X[U]&&X[U][C]),typeof N>"u"||!N.length||!N[0]){var kt="";ft=[];for(dt in X[U])this.terminals_[dt]&&dt>ht&&ft.push("'"+this.terminals_[dt]+"'");m.showPosition?kt="Parse error on line "+(V+1)+`: +`+m.showPosition()+` +Expecting `+ft.join(", ")+", got '"+(this.terminals_[C]||C)+"'":kt="Parse error on line "+(V+1)+": Unexpected "+(C==ut?"end of input":"'"+(this.terminals_[C]||C)+"'"),this.parseError(kt,{text:m.match,token:this.terminals_[C]||C,line:m.yylineno,loc:bt,expected:ft})}if(N[0]instanceof Array&&N.length>1)throw new Error("Parse Error: multiple actions possible at state: "+U+", token: "+C);switch(N[0]){case 1:n.push(C),b.push(m.yytext),i.push(m.yylloc),n.push(N[1]),C=null,Et?(C=Et,Et=null):(H=m.yyleng,l=m.yytext,V=m.yylineno,bt=m.yylloc,J>0&&J--);break;case 2:if(F=this.productions_[N[1]][1],W.$=b[b.length-F],W._$={first_line:i[i.length-(F||1)].first_line,last_line:i[i.length-1].last_line,first_column:i[i.length-(F||1)].first_column,last_column:i[i.length-1].last_column},de&&(W._$.range=[i[i.length-(F||1)].range[0],i[i.length-1].range[1]]),_t=this.performAction.apply(W,[l,H,V,M.yy,N[1],b,i].concat(ue)),typeof _t<"u")return _t;F&&(n=n.slice(0,-1*F*2),b=b.slice(0,-1*F),i=i.slice(0,-1*F)),n.push(this.productions_[N[1]][0]),b.push(W.$),i.push(W._$),It=X[n[n.length-2]][n[n.length-1]],n.push(It);break;case 3:return!0}}return!0},"parse")},he=(function(){var Y={EOF:1,parseError:h(function(c,n){if(this.yy.parser)this.yy.parser.parseError(c,n);else throw new Error(c)},"parseError"),setInput:h(function(o,c){return this.yy=c||this.yy||{},this._input=o,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:h(function(){var o=this._input[0];this.yytext+=o,this.yyleng++,this.offset++,this.match+=o,this.matched+=o;var c=o.match(/(?:\r\n?|\n).*/g);return c?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),o},"input"),unput:h(function(o){var c=o.length,n=o.split(/(?:\r\n?|\n)/g);this._input=o+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-c),this.offset-=c;var g=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var b=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===g.length?this.yylloc.first_column:0)+g[g.length-n.length].length-n[0].length:this.yylloc.first_column-c},this.options.ranges&&(this.yylloc.range=[b[0],b[0]+this.yyleng-c]),this.yyleng=this.yytext.length,this},"unput"),more:h(function(){return this._more=!0,this},"more"),reject:h(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:h(function(o){this.unput(this.match.slice(o))},"less"),pastInput:h(function(){var o=this.matched.substr(0,this.matched.length-this.match.length);return(o.length>20?"...":"")+o.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:h(function(){var o=this.match;return o.length<20&&(o+=this._input.substr(0,20-o.length)),(o.substr(0,20)+(o.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:h(function(){var o=this.pastInput(),c=new Array(o.length+1).join("-");return o+this.upcomingInput()+` +`+c+"^"},"showPosition"),test_match:h(function(o,c){var n,g,b;if(this.options.backtrack_lexer&&(b={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(b.yylloc.range=this.yylloc.range.slice(0))),g=o[0].match(/(?:\r\n?|\n).*/g),g&&(this.yylineno+=g.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:g?g[g.length-1].length-g[g.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+o[0].length},this.yytext+=o[0],this.match+=o[0],this.matches=o,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(o[0].length),this.matched+=o[0],n=this.performAction.call(this,this.yy,this,c,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var i in b)this[i]=b[i];return!1}return!1},"test_match"),next:h(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var o,c,n,g;this._more||(this.yytext="",this.match="");for(var b=this._currentRules(),i=0;ic[0].length)){if(c=n,g=i,this.options.backtrack_lexer){if(o=this.test_match(n,b[i]),o!==!1)return o;if(this._backtrack){c=!1;continue}else return!1}else if(!this.options.flex)break}return c?(o=this.test_match(c,b[g]),o!==!1?o:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:h(function(){var c=this.next();return c||this.lex()},"lex"),begin:h(function(c){this.conditionStack.push(c)},"begin"),popState:h(function(){var c=this.conditionStack.length-1;return c>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:h(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:h(function(c){return c=this.conditionStack.length-1-Math.abs(c||0),c>=0?this.conditionStack[c]:"INITIAL"},"topState"),pushState:h(function(c){this.begin(c)},"pushState"),stateStackSize:h(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:h(function(c,n,g,b){var i=b;switch(g){case 0:return 38;case 1:return 40;case 2:return 39;case 3:return 44;case 4:return 51;case 5:return 52;case 6:return 53;case 7:return 54;case 8:break;case 9:break;case 10:return 5;case 11:break;case 12:break;case 13:break;case 14:break;case 15:return this.pushState("SCALE"),17;break;case 16:return 18;case 17:this.popState();break;case 18:return this.begin("acc_title"),33;break;case 19:return this.popState(),"acc_title_value";break;case 20:return this.begin("acc_descr"),35;break;case 21:return this.popState(),"acc_descr_value";break;case 22:this.begin("acc_descr_multiline");break;case 23:this.popState();break;case 24:return"acc_descr_multiline_value";case 25:return this.pushState("CLASSDEF"),41;break;case 26:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 27:return this.popState(),this.pushState("CLASSDEFID"),42;break;case 28:return this.popState(),43;break;case 29:return this.pushState("CLASS"),48;break;case 30:return this.popState(),this.pushState("CLASS_STYLE"),49;break;case 31:return this.popState(),50;break;case 32:return this.pushState("STYLE"),45;break;case 33:return this.popState(),this.pushState("STYLEDEF_STYLES"),46;break;case 34:return this.popState(),47;break;case 35:return this.pushState("SCALE"),17;break;case 36:return 18;case 37:this.popState();break;case 38:this.pushState("STATE");break;case 39:return this.popState(),n.yytext=n.yytext.slice(0,-8).trim(),25;break;case 40:return this.popState(),n.yytext=n.yytext.slice(0,-8).trim(),26;break;case 41:return this.popState(),n.yytext=n.yytext.slice(0,-10).trim(),27;break;case 42:return this.popState(),n.yytext=n.yytext.slice(0,-8).trim(),25;break;case 43:return this.popState(),n.yytext=n.yytext.slice(0,-8).trim(),26;break;case 44:return this.popState(),n.yytext=n.yytext.slice(0,-10).trim(),27;break;case 45:return 51;case 46:return 52;case 47:return 53;case 48:return 54;case 49:this.pushState("STATE_STRING");break;case 50:return this.pushState("STATE_ID"),"AS";break;case 51:return this.popState(),"ID";break;case 52:this.popState();break;case 53:return"STATE_DESCR";case 54:return 19;case 55:this.popState();break;case 56:return this.popState(),this.pushState("struct"),20;break;case 57:break;case 58:return this.popState(),21;break;case 59:break;case 60:return this.begin("NOTE"),29;break;case 61:return this.popState(),this.pushState("NOTE_ID"),59;break;case 62:return this.popState(),this.pushState("NOTE_ID"),60;break;case 63:this.popState(),this.pushState("FLOATING_NOTE");break;case 64:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";break;case 65:break;case 66:return"NOTE_TEXT";case 67:return this.popState(),"ID";break;case 68:return this.popState(),this.pushState("NOTE_TEXT"),24;break;case 69:return this.popState(),n.yytext=n.yytext.substr(2).trim(),31;break;case 70:return this.popState(),n.yytext=n.yytext.slice(0,-8).trim(),31;break;case 71:return 6;case 72:return 6;case 73:return 16;case 74:return 57;case 75:return 24;case 76:return n.yytext=n.yytext.trim(),14;break;case 77:return 15;case 78:return 28;case 79:return 58;case 80:return 5;case 81:return"INVALID"}},"anonymous"),rules:[/^(?:click\b)/i,/^(?:href\b)/i,/^(?:"[^"]*")/i,/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:style\s+)/i,/^(?:[\w,]+\s+)/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:(?:[^:\n;]|:[^:\n;])+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[12,13],inclusive:!1},struct:{rules:[12,13,25,29,32,38,45,46,47,48,57,58,59,60,74,75,76,77,78],inclusive:!1},FLOATING_NOTE_ID:{rules:[67],inclusive:!1},FLOATING_NOTE:{rules:[64,65,66],inclusive:!1},NOTE_TEXT:{rules:[69,70],inclusive:!1},NOTE_ID:{rules:[68],inclusive:!1},NOTE:{rules:[61,62,63],inclusive:!1},STYLEDEF_STYLEOPTS:{rules:[],inclusive:!1},STYLEDEF_STYLES:{rules:[34],inclusive:!1},STYLE_IDS:{rules:[],inclusive:!1},STYLE:{rules:[33],inclusive:!1},CLASS_STYLE:{rules:[31],inclusive:!1},CLASS:{rules:[30],inclusive:!1},CLASSDEFID:{rules:[28],inclusive:!1},CLASSDEF:{rules:[26,27],inclusive:!1},acc_descr_multiline:{rules:[23,24],inclusive:!1},acc_descr:{rules:[21],inclusive:!1},acc_title:{rules:[19],inclusive:!1},SCALE:{rules:[16,17,36,37],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[51],inclusive:!1},STATE_STRING:{rules:[52,53],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[12,13,39,40,41,42,43,44,49,50,54,55,56],inclusive:!1},ID:{rules:[12,13],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,18,20,22,25,29,32,35,38,56,60,71,72,73,74,75,76,77,79,80,81],inclusive:!0}}};return Y})();gt.lexer=he;function ct(){this.yy={}}return h(ct,"Parser"),ct.prototype=gt,gt.Parser=ct,new ct})();vt.parser=vt;var We=vt,pe="TB",qt="TB",jt="dir",K="state",z="root",Ct="relation",Se="classDef",ye="style",ge="applyClass",Z="default",Qt="divider",Zt="fill:none",te="fill: #333",ee="c",se="markdown",ie="normal",mt="rect",Dt="rectWithTitle",Te="stateStart",be="stateEnd",Ht="divider",Wt="roundedWithTitle",Ee="note",_e="noteGroup",tt="statediagram",ke="state",me=`${tt}-${ke}`,re="transition",De="note",ve="note-edge",Ce=`${re} ${ve}`,Ae=`${tt}-${De}`,xe="cluster",Le=`${tt}-${xe}`,Ie="cluster-alt",Oe=`${tt}-${Ie}`,ae="parent",ne="note",Re="state",At="----",Ne=`${At}${ne}`,zt=`${At}${ae}`,oe=h((t,e=qt)=>{if(!t.doc)return e;let s=e;for(let a of t.doc)a.stmt==="dir"&&(s=a.value);return s},"getDir"),we=h(function(t,e){return e.db.getClasses()},"getClasses"),$e=h(function(t,e,s,a){return Ot(this,null,function*(){k.info("REF0:"),k.info("Drawing state diagram (v2)",e);let{securityLevel:r,state:u,layout:d}=w();a.db.extract(a.db.getRootDocV2());let S=a.db.getData(),f=Mt(e,r);S.type=a.type,S.layoutAlgorithm=d,S.nodeSpacing=u?.nodeSpacing||50,S.rankSpacing=u?.rankSpacing||50,S.markers=["barb"],S.diagramId=e,yield Vt(S,f);let T=8;try{(typeof a.db.getLinks=="function"?a.db.getLinks():new Map).forEach((_,x)=>{let v=typeof x=="string"?x:typeof x?.id=="string"?x.id:"";if(!v){k.warn("\u26A0\uFE0F Invalid or missing stateId from key:",JSON.stringify(x));return}let p=f.node()?.querySelectorAll("g"),D;if(p?.forEach(I=>{I.textContent?.trim()===v&&(D=I)}),!D){k.warn("\u26A0\uFE0F Could not find node matching text:",v);return}let R=D.parentNode;if(!R){k.warn("\u26A0\uFE0F Node has no parent, cannot wrap:",v);return}let L=document.createElementNS("http://www.w3.org/2000/svg","a"),$=_.url.replace(/^"+|"+$/g,"");if(L.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",$),L.setAttribute("target","_blank"),_.tooltip){let I=_.tooltip.replace(/^"+|"+$/g,"");L.setAttribute("title",I)}R.replaceChild(L,D),L.appendChild(D),k.info("\u{1F517} Wrapped node in tag for:",v,_.url)})}catch(E){k.error("\u274C Error injecting clickable links:",E)}Gt.insertTitle(f,"statediagramTitleText",u?.titleTopMargin??25,a.db.getDiagramTitle()),Ut(f,T,tt,u?.useMaxWidth??!0)})},"draw"),ze={getClasses:we,draw:$e,getDir:oe},St=new Map,G=0;function yt(t="",e=0,s="",a=At){let r=s!==null&&s.length>0?`${a}${s}`:"";return`${Re}-${t}${r}-${e}`}h(yt,"stateDomId");var Pe=h((t,e,s,a,r,u,d,S)=>{k.trace("items",e),e.forEach(f=>{switch(f.stmt){case K:Q(t,f,s,a,r,u,d,S);break;case Z:Q(t,f,s,a,r,u,d,S);break;case Ct:{Q(t,f.state1,s,a,r,u,d,S),Q(t,f.state2,s,a,r,u,d,S);let T={id:"edge"+G,start:f.state1.id,end:f.state2.id,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:Zt,labelStyle:"",label:B.sanitizeText(f.description??"",w()),arrowheadStyle:te,labelpos:ee,labelType:se,thickness:ie,classes:re,look:d};r.push(T),G++}break}})},"setupDoc"),Kt=h((t,e=qt)=>{let s=e;if(t.doc)for(let a of t.doc)a.stmt==="dir"&&(s=a.value);return s},"getDir");function q(t,e,s){if(!e.id||e.id===""||e.id==="")return;e.cssClasses&&(Array.isArray(e.cssCompiledStyles)||(e.cssCompiledStyles=[]),e.cssClasses.split(" ").forEach(r=>{let u=s.get(r);u&&(e.cssCompiledStyles=[...e.cssCompiledStyles??[],...u.styles])}));let a=t.find(r=>r.id===e.id);a?Object.assign(a,e):t.push(e)}h(q,"insertOrUpdateNode");function le(t){return t?.classes?.join(" ")??""}h(le,"getClassesFromDbInfo");function ce(t){return t?.styles??[]}h(ce,"getStylesFromDbInfo");var Q=h((t,e,s,a,r,u,d,S)=>{let f=e.id,T=s.get(f),E=le(T),_=ce(T),x=w();if(k.info("dataFetcher parsedItem",e,T,_),f!=="root"){let v=mt;e.start===!0?v=Te:e.start===!1&&(v=be),e.type!==Z&&(v=e.type),St.get(f)||St.set(f,{id:f,shape:v,description:B.sanitizeText(f,x),cssClasses:`${E} ${me}`,cssStyles:_});let p=St.get(f);e.description&&(Array.isArray(p.description)?(p.shape=Dt,p.description.push(e.description)):p.description?.length&&p.description.length>0?(p.shape=Dt,p.description===f?p.description=[e.description]:p.description=[p.description,e.description]):(p.shape=mt,p.description=e.description),p.description=B.sanitizeTextOrArray(p.description,x)),p.description?.length===1&&p.shape===Dt&&(p.type==="group"?p.shape=Wt:p.shape=mt),!p.type&&e.doc&&(k.info("Setting cluster for XCX",f,Kt(e)),p.type="group",p.isGroup=!0,p.dir=Kt(e),p.shape=e.type===Qt?Ht:Wt,p.cssClasses=`${p.cssClasses} ${Le} ${u?Oe:""}`);let D={labelStyle:"",shape:p.shape,label:p.description,cssClasses:p.cssClasses,cssCompiledStyles:[],cssStyles:p.cssStyles,id:f,dir:p.dir,domId:yt(f,G),type:p.type,isGroup:p.type==="group",padding:8,rx:10,ry:10,look:d,labelType:"markdown"};if(D.shape===Ht&&(D.label=""),t&&t.id!=="root"&&(k.trace("Setting node ",f," to be child of its parent ",t.id),D.parentId=t.id),D.centerLabel=!0,e.note){let R={labelStyle:"",shape:Ee,label:e.note.text,labelType:"markdown",cssClasses:Ae,cssStyles:[],cssCompiledStyles:[],id:f+Ne+"-"+G,domId:yt(f,G,ne),type:p.type,isGroup:p.type==="group",padding:x.flowchart?.padding,look:d,position:e.note.position},L=f+zt,$={labelStyle:"",shape:_e,label:e.note.text,cssClasses:p.cssClasses,cssStyles:[],id:f+zt,domId:yt(f,G,ae),type:"group",isGroup:!0,padding:16,look:d,position:e.note.position};G++,$.id=L,R.parentId=L,q(a,$,S),q(a,R,S),q(a,D,S);let I=f,P=R.id;e.note.position==="left of"&&(I=R.id,P=f),r.push({id:I+"-"+P,start:I,end:P,arrowhead:"none",arrowTypeEnd:"",style:Zt,labelStyle:"",classes:Ce,arrowheadStyle:te,labelpos:ee,labelType:se,thickness:ie,look:d})}else q(a,D,S)}e.doc&&(k.trace("Adding nodes children "),Pe(e,e.doc,s,a,r,!u,d,S))},"dataFetcher"),Fe=h(()=>{St.clear(),G=0},"reset"),A={START_NODE:"[*]",START_TYPE:"start",END_NODE:"[*]",END_TYPE:"end",COLOR_KEYWORD:"color",FILL_KEYWORD:"fill",BG_FILL:"bgFill",STYLECLASS_SEP:","},Xt=h(()=>new Map,"newClassesList"),Jt=h(()=>({relations:[],states:new Map,documents:{}}),"newDoc"),pt=h(t=>JSON.parse(JSON.stringify(t)),"clone"),Ke=class{constructor(e){this.version=e,this.nodes=[],this.edges=[],this.rootDoc=[],this.classes=Xt(),this.documents={root:Jt()},this.currentDocument=this.documents.root,this.startEndCount=0,this.dividerCnt=0,this.links=new Map,this.getAccTitle=wt,this.setAccTitle=Nt,this.getAccDescription=Pt,this.setAccDescription=$t,this.setDiagramTitle=Ft,this.getDiagramTitle=Yt,this.clear(),this.setRootDoc=this.setRootDoc.bind(this),this.getDividerId=this.getDividerId.bind(this),this.setDirection=this.setDirection.bind(this),this.trimColon=this.trimColon.bind(this)}static{h(this,"StateDB")}static{this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3}}extract(e){this.clear(!0);for(let r of Array.isArray(e)?e:e.doc)switch(r.stmt){case K:this.addState(r.id.trim(),r.type,r.doc,r.description,r.note);break;case Ct:this.addRelation(r.state1,r.state2,r.description);break;case Se:this.addStyleClass(r.id.trim(),r.classes);break;case ye:this.handleStyleDef(r);break;case ge:this.setCssClass(r.id.trim(),r.styleClass);break;case"click":this.addLink(r.id,r.url,r.tooltip);break}let s=this.getStates(),a=w();Fe(),Q(void 0,this.getRootDocV2(),s,this.nodes,this.edges,!0,a.look,this.classes);for(let r of this.nodes)if(Array.isArray(r.label)){if(r.description=r.label.slice(1),r.isGroup&&r.description.length>0)throw new Error(`Group nodes can only have label. Remove the additional description for node [${r.id}]`);r.label=r.label[0]}}handleStyleDef(e){let s=e.id.trim().split(","),a=e.styleClass.split(",");for(let r of s){let u=this.getState(r);if(!u){let d=r.trim();this.addState(d),u=this.getState(d)}u&&(u.styles=a.map(d=>d.replace(/;/g,"")?.trim()))}}setRootDoc(e){k.info("Setting root doc",e),this.rootDoc=e,this.version===1?this.extract(e):this.extract(this.getRootDocV2())}docTranslator(e,s,a){if(s.stmt===Ct){this.docTranslator(e,s.state1,!0),this.docTranslator(e,s.state2,!1);return}if(s.stmt===K&&(s.id===A.START_NODE?(s.id=e.id+(a?"_start":"_end"),s.start=a):s.id=s.id.trim()),s.stmt!==z&&s.stmt!==K||!s.doc)return;let r=[],u=[];for(let d of s.doc)if(d.type===Qt){let S=pt(d);S.doc=pt(u),r.push(S),u=[]}else u.push(d);if(r.length>0&&u.length>0){let d={stmt:K,id:Bt(),type:"divider",doc:pt(u)};r.push(pt(d)),s.doc=r}s.doc.forEach(d=>this.docTranslator(s,d,!0))}getRootDocV2(){return this.docTranslator({id:z,stmt:z},{id:z,stmt:z,doc:this.rootDoc},!0),{id:z,doc:this.rootDoc}}addState(e,s=Z,a=void 0,r=void 0,u=void 0,d=void 0,S=void 0,f=void 0){let T=e?.trim();if(!this.currentDocument.states.has(T))k.info("Adding state ",T,r),this.currentDocument.states.set(T,{stmt:K,id:T,descriptions:[],type:s,doc:a,note:u,classes:[],styles:[],textStyles:[]});else{let E=this.currentDocument.states.get(T);if(!E)throw new Error(`State not found: ${T}`);E.doc||(E.doc=a),E.type||(E.type=s)}if(r&&(k.info("Setting state description",T,r),(Array.isArray(r)?r:[r]).forEach(_=>this.addDescription(T,_.trim()))),u){let E=this.currentDocument.states.get(T);if(!E)throw new Error(`State not found: ${T}`);E.note=u,E.note.text=B.sanitizeText(E.note.text,w())}d&&(k.info("Setting state classes",T,d),(Array.isArray(d)?d:[d]).forEach(_=>this.setCssClass(T,_.trim()))),S&&(k.info("Setting state styles",T,S),(Array.isArray(S)?S:[S]).forEach(_=>this.setStyle(T,_.trim()))),f&&(k.info("Setting state styles",T,S),(Array.isArray(f)?f:[f]).forEach(_=>this.setTextStyle(T,_.trim())))}clear(e){this.nodes=[],this.edges=[],this.documents={root:Jt()},this.currentDocument=this.documents.root,this.startEndCount=0,this.classes=Xt(),e||(this.links=new Map,Rt())}getState(e){return this.currentDocument.states.get(e)}getStates(){return this.currentDocument.states}logDocuments(){k.info("Documents = ",this.documents)}getRelations(){return this.currentDocument.relations}addLink(e,s,a){this.links.set(e,{url:s,tooltip:a}),k.warn("Adding link",e,s,a)}getLinks(){return this.links}startIdIfNeeded(e=""){return e===A.START_NODE?(this.startEndCount++,`${A.START_TYPE}${this.startEndCount}`):e}startTypeIfNeeded(e="",s=Z){return e===A.START_NODE?A.START_TYPE:s}endIdIfNeeded(e=""){return e===A.END_NODE?(this.startEndCount++,`${A.END_TYPE}${this.startEndCount}`):e}endTypeIfNeeded(e="",s=Z){return e===A.END_NODE?A.END_TYPE:s}addRelationObjs(e,s,a=""){let r=this.startIdIfNeeded(e.id.trim()),u=this.startTypeIfNeeded(e.id.trim(),e.type),d=this.startIdIfNeeded(s.id.trim()),S=this.startTypeIfNeeded(s.id.trim(),s.type);this.addState(r,u,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),this.addState(d,S,s.doc,s.description,s.note,s.classes,s.styles,s.textStyles),this.currentDocument.relations.push({id1:r,id2:d,relationTitle:B.sanitizeText(a,w())})}addRelation(e,s,a){if(typeof e=="object"&&typeof s=="object")this.addRelationObjs(e,s,a);else if(typeof e=="string"&&typeof s=="string"){let r=this.startIdIfNeeded(e.trim()),u=this.startTypeIfNeeded(e),d=this.endIdIfNeeded(s.trim()),S=this.endTypeIfNeeded(s);this.addState(r,u),this.addState(d,S),this.currentDocument.relations.push({id1:r,id2:d,relationTitle:a?B.sanitizeText(a,w()):void 0})}}addDescription(e,s){let a=this.currentDocument.states.get(e),r=s.startsWith(":")?s.replace(":","").trim():s;a?.descriptions?.push(B.sanitizeText(r,w()))}cleanupLabel(e){return e.startsWith(":")?e.slice(2).trim():e.trim()}getDividerId(){return this.dividerCnt++,`divider-id-${this.dividerCnt}`}addStyleClass(e,s=""){this.classes.has(e)||this.classes.set(e,{id:e,styles:[],textStyles:[]});let a=this.classes.get(e);s&&a&&s.split(A.STYLECLASS_SEP).forEach(r=>{let u=r.replace(/([^;]*);/,"$1").trim();if(RegExp(A.COLOR_KEYWORD).exec(r)){let S=u.replace(A.FILL_KEYWORD,A.BG_FILL).replace(A.COLOR_KEYWORD,A.FILL_KEYWORD);a.textStyles.push(S)}a.styles.push(u)})}getClasses(){return this.classes}setCssClass(e,s){e.split(",").forEach(a=>{let r=this.getState(a);if(!r){let u=a.trim();this.addState(u),r=this.getState(u)}r?.classes?.push(s)})}setStyle(e,s){this.getState(e)?.styles?.push(s)}setTextStyle(e,s){this.getState(e)?.textStyles?.push(s)}getDirectionStatement(){return this.rootDoc.find(e=>e.stmt===jt)}getDirection(){return this.getDirectionStatement()?.value??pe}setDirection(e){let s=this.getDirectionStatement();s?s.value=e:this.rootDoc.unshift({stmt:jt,value:e})}trimColon(e){return e.startsWith(":")?e.slice(1).trim():e.trim()}getData(){let e=w();return{nodes:this.nodes,edges:this.edges,other:{},config:e,direction:oe(this.getRootDocV2())}}getConfig(){return w().state}},Ye=h(t=>` +defs #statediagram-barbEnd { + fill: ${t.transitionColor}; + stroke: ${t.transitionColor}; + } +g.stateGroup text { + fill: ${t.nodeBorder}; + stroke: none; + font-size: 10px; +} +g.stateGroup text { + fill: ${t.textColor}; + stroke: none; + font-size: 10px; + +} +g.stateGroup .state-title { + font-weight: bolder; + fill: ${t.stateLabelColor}; +} + +g.stateGroup rect { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; +} + +g.stateGroup line { + stroke: ${t.lineColor}; + stroke-width: 1; +} + +.transition { + stroke: ${t.transitionColor}; + stroke-width: 1; + fill: none; +} + +.stateGroup .composit { + fill: ${t.background}; + border-bottom: 1px +} + +.stateGroup .alt-composit { + fill: #e0e0e0; + border-bottom: 1px +} + +.state-note { + stroke: ${t.noteBorderColor}; + fill: ${t.noteBkgColor}; + + text { + fill: ${t.noteTextColor}; + stroke: none; + font-size: 10px; + } +} + +.stateLabel .box { + stroke: none; + stroke-width: 0; + fill: ${t.mainBkg}; + opacity: 0.5; +} + +.edgeLabel .label rect { + fill: ${t.labelBackgroundColor}; + opacity: 0.5; +} +.edgeLabel { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; +} +.edgeLabel .label text { + fill: ${t.transitionLabelColor||t.tertiaryTextColor}; +} +.label div .edgeLabel { + color: ${t.transitionLabelColor||t.tertiaryTextColor}; +} + +.stateLabel text { + fill: ${t.stateLabelColor}; + font-size: 10px; + font-weight: bold; +} + +.node circle.state-start { + fill: ${t.specialStateColor}; + stroke: ${t.specialStateColor}; +} + +.node .fork-join { + fill: ${t.specialStateColor}; + stroke: ${t.specialStateColor}; +} + +.node circle.state-end { + fill: ${t.innerEndBackground}; + stroke: ${t.background}; + stroke-width: 1.5 +} +.end-state-inner { + fill: ${t.compositeBackground||t.background}; + // stroke: ${t.background}; + stroke-width: 1.5 +} + +.node rect { + fill: ${t.stateBkg||t.mainBkg}; + stroke: ${t.stateBorder||t.nodeBorder}; + stroke-width: 1px; +} +.node polygon { + fill: ${t.mainBkg}; + stroke: ${t.stateBorder||t.nodeBorder};; + stroke-width: 1px; +} +#statediagram-barbEnd { + fill: ${t.lineColor}; +} + +.statediagram-cluster rect { + fill: ${t.compositeTitleBackground}; + stroke: ${t.stateBorder||t.nodeBorder}; + stroke-width: 1px; +} + +.cluster-label, .nodeLabel { + color: ${t.stateLabelColor}; + // line-height: 1; +} + +.statediagram-cluster rect.outer { + rx: 5px; + ry: 5px; +} +.statediagram-state .divider { + stroke: ${t.stateBorder||t.nodeBorder}; +} + +.statediagram-state .title-state { + rx: 5px; + ry: 5px; +} +.statediagram-cluster.statediagram-cluster .inner { + fill: ${t.compositeBackground||t.background}; +} +.statediagram-cluster.statediagram-cluster-alt .inner { + fill: ${t.altBackground?t.altBackground:"#efefef"}; +} + +.statediagram-cluster .inner { + rx:0; + ry:0; +} + +.statediagram-state rect.basic { + rx: 5px; + ry: 5px; +} +.statediagram-state rect.divider { + stroke-dasharray: 10,10; + fill: ${t.altBackground?t.altBackground:"#efefef"}; +} + +.note-edge { + stroke-dasharray: 5; +} + +.statediagram-note rect { + fill: ${t.noteBkgColor}; + stroke: ${t.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} +.statediagram-note rect { + fill: ${t.noteBkgColor}; + stroke: ${t.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} + +.statediagram-note text { + fill: ${t.noteTextColor}; +} + +.statediagram-note .nodeLabel { + color: ${t.noteTextColor}; +} +.statediagram .edgeLabel { + color: red; // ${t.noteTextColor}; +} + +#dependencyStart, #dependencyEnd { + fill: ${t.lineColor}; + stroke: ${t.lineColor}; + stroke-width: 1; +} + +.statediagramTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; +} +`,"getStyles"),Xe=Ye;export{We as a,ze as b,Ke as c,Xe as d}; diff --git a/src/google/adk/cli/browser/chunk-N5S45BK4.js b/src/google/adk/cli/browser/chunk-N5S45BK4.js new file mode 100644 index 0000000000..4f22e6ea24 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-N5S45BK4.js @@ -0,0 +1 @@ +import{a as e,b as i,c as a,d as o}from"./chunk-LI24J5PW.js";import"./chunk-APNCZOFE.js";import"./chunk-ST54LLJ3.js";import"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import"./chunk-QFMJV7VH.js";import{g as r}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";var v={parser:e,get db(){return new a(2)},renderer:i,styles:o,init:r(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{v as diagram}; diff --git a/src/google/adk/cli/browser/chunk-NALL4A3P.js b/src/google/adk/cli/browser/chunk-NALL4A3P.js new file mode 100644 index 0000000000..54e9eec1d7 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-NALL4A3P.js @@ -0,0 +1,161 @@ +import{A as q,B as mt,C as Ce,D as Pe,E as hu,G as Z,I as tr,J as $t,M as qh,O as Gt,S as Ue,T as In,V as Mo,Z as Hs,_ as zh,a as et,b as Pr,c as dt,d as Ve,e as Ne,h as Or,k as Ks,l as wn,m as gr,n as Ke,o as tn,p as D,r as At,s as ct,t as Lr,u as pt,v as I,w as ht,z as Uh}from"./chunk-ASJUXEUE.js";import{e as Ze,f as Fh,g as Gh,h as mr}from"./chunk-EGBSMT36.js";import{a as ge,b as er,d as nv,e as X,f as en,g as ae,h as du,i as pu,j as P}from"./chunk-RMXJBC7V.js";var il={};en(il,{AnnotatedTextEdit:()=>Xr,ChangeAnnotation:()=>ri,ChangeAnnotationIdentifier:()=>lt,CodeAction:()=>ad,CodeActionContext:()=>sd,CodeActionKind:()=>Gg,CodeActionTriggerKind:()=>tl,CodeDescription:()=>jf,CodeLens:()=>od,Color:()=>Xc,ColorInformation:()=>Uf,ColorPresentation:()=>qf,Command:()=>ni,CompletionItem:()=>Xf,CompletionItemKind:()=>bg,CompletionItemLabelDetails:()=>Yf,CompletionItemTag:()=>Og,CompletionList:()=>Jf,CreateFile:()=>rs,DeleteFile:()=>is,Diagnostic:()=>Ma,DiagnosticRelatedInformation:()=>Jc,DiagnosticSeverity:()=>Ig,DiagnosticTag:()=>_g,DocumentHighlight:()=>td,DocumentHighlightKind:()=>Dg,DocumentLink:()=>ld,DocumentSymbol:()=>id,DocumentUri:()=>Mf,EOL:()=>IA,FoldingRange:()=>zf,FoldingRangeKind:()=>wg,FormattingOptions:()=>cd,Hover:()=>Qf,InlayHint:()=>gd,InlayHintKind:()=>rl,InlayHintLabelPart:()=>nl,InlineCompletionContext:()=>vd,InlineCompletionItem:()=>Td,InlineCompletionList:()=>Rd,InlineCompletionTriggerKind:()=>zg,InlineValueContext:()=>md,InlineValueEvaluatableExpression:()=>hd,InlineValueText:()=>dd,InlineValueVariableLookup:()=>pd,InsertReplaceEdit:()=>Hf,InsertTextFormat:()=>Pg,InsertTextMode:()=>Lg,Location:()=>Da,LocationLink:()=>Gf,MarkedString:()=>Ua,MarkupContent:()=>ss,MarkupKind:()=>el,OptionalVersionedTextDocumentIdentifier:()=>Ga,ParameterInformation:()=>Zf,Position:()=>ce,Range:()=>ie,RenameFile:()=>ns,SelectedCompletionInfo:()=>xd,SelectionRange:()=>ud,SemanticTokenModifiers:()=>qg,SemanticTokenTypes:()=>Ug,SemanticTokens:()=>fd,SignatureInformation:()=>ed,StringValue:()=>yd,SymbolInformation:()=>rd,SymbolKind:()=>Mg,SymbolTag:()=>Fg,TextDocument:()=>Ad,TextDocumentEdit:()=>Fa,TextDocumentIdentifier:()=>Wf,TextDocumentItem:()=>Kf,TextEdit:()=>Er,URI:()=>Yc,VersionedTextDocumentIdentifier:()=>Vf,WorkspaceChange:()=>Bf,WorkspaceEdit:()=>Qc,WorkspaceFolder:()=>Ed,WorkspaceSymbol:()=>nd,integer:()=>Ff,uinteger:()=>La});var Mf,Yc,Ff,La,ce,ie,Da,Gf,Xc,Uf,qf,wg,zf,Jc,Ig,_g,jf,Ma,ni,Er,ri,lt,Xr,Fa,rs,ns,is,Qc,ts,Zc,Bf,Wf,Vf,Ga,Kf,el,ss,bg,Pg,Og,Hf,Lg,Yf,Xf,Jf,Ua,Qf,Zf,ed,Dg,td,Mg,Fg,rd,nd,id,Gg,tl,sd,ad,od,cd,ld,ud,Ug,qg,fd,dd,pd,hd,md,rl,nl,gd,yd,Td,Rd,zg,xd,vd,Ed,IA,Ad,$d,m,as=nv(()=>{"use strict";(function(t){function e(r){return typeof r=="string"}t.is=e})(Mf||(Mf={}));(function(t){function e(r){return typeof r=="string"}t.is=e})(Yc||(Yc={}));(function(t){t.MIN_VALUE=-2147483648,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}t.is=e})(Ff||(Ff={}));(function(t){t.MIN_VALUE=0,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}t.is=e})(La||(La={}));(function(t){function e(n,i){return n===Number.MAX_VALUE&&(n=La.MAX_VALUE),i===Number.MAX_VALUE&&(i=La.MAX_VALUE),{line:n,character:i}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&m.uinteger(i.line)&&m.uinteger(i.character)}t.is=r})(ce||(ce={}));(function(t){function e(n,i,s,a){if(m.uinteger(n)&&m.uinteger(i)&&m.uinteger(s)&&m.uinteger(a))return{start:ce.create(n,i),end:ce.create(s,a)};if(ce.is(n)&&ce.is(i))return{start:n,end:i};throw new Error(`Range#create called with invalid arguments[${n}, ${i}, ${s}, ${a}]`)}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&ce.is(i.start)&&ce.is(i.end)}t.is=r})(ie||(ie={}));(function(t){function e(n,i){return{uri:n,range:i}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&ie.is(i.range)&&(m.string(i.uri)||m.undefined(i.uri))}t.is=r})(Da||(Da={}));(function(t){function e(n,i,s,a){return{targetUri:n,targetRange:i,targetSelectionRange:s,originSelectionRange:a}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&ie.is(i.targetRange)&&m.string(i.targetUri)&&ie.is(i.targetSelectionRange)&&(ie.is(i.originSelectionRange)||m.undefined(i.originSelectionRange))}t.is=r})(Gf||(Gf={}));(function(t){function e(n,i,s,a){return{red:n,green:i,blue:s,alpha:a}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&m.numberRange(i.red,0,1)&&m.numberRange(i.green,0,1)&&m.numberRange(i.blue,0,1)&&m.numberRange(i.alpha,0,1)}t.is=r})(Xc||(Xc={}));(function(t){function e(n,i){return{range:n,color:i}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&ie.is(i.range)&&Xc.is(i.color)}t.is=r})(Uf||(Uf={}));(function(t){function e(n,i,s){return{label:n,textEdit:i,additionalTextEdits:s}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&m.string(i.label)&&(m.undefined(i.textEdit)||Er.is(i))&&(m.undefined(i.additionalTextEdits)||m.typedArray(i.additionalTextEdits,Er.is))}t.is=r})(qf||(qf={}));wg=(function(t){return t.Comment="comment",t.Imports="imports",t.Region="region",t})(wg||{});(function(t){function e(n,i,s,a,o,c){let l={startLine:n,endLine:i};return m.defined(s)&&(l.startCharacter=s),m.defined(a)&&(l.endCharacter=a),m.defined(o)&&(l.kind=o),m.defined(c)&&(l.collapsedText=c),l}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&m.uinteger(i.startLine)&&m.uinteger(i.startLine)&&(m.undefined(i.startCharacter)||m.uinteger(i.startCharacter))&&(m.undefined(i.endCharacter)||m.uinteger(i.endCharacter))&&(m.undefined(i.kind)||m.string(i.kind))}t.is=r})(zf||(zf={}));(function(t){function e(n,i){return{location:n,message:i}}t.create=e;function r(n){let i=n;return m.defined(i)&&Da.is(i.location)&&m.string(i.message)}t.is=r})(Jc||(Jc={}));Ig=(function(t){return t.Error=1,t.Warning=2,t.Information=3,t.Hint=4,t})(Ig||{}),_g=(function(t){return t.Unnecessary=1,t.Deprecated=2,t})(_g||{});(function(t){function e(r){let n=r;return m.objectLiteral(n)&&m.string(n.href)}t.is=e})(jf||(jf={}));(function(t){function e(n,i,s,a,o,c){let l={range:n,message:i};return m.defined(s)&&(l.severity=s),m.defined(a)&&(l.code=a),m.defined(o)&&(l.source=o),m.defined(c)&&(l.relatedInformation=c),l}t.create=e;function r(n){var i;let s=n;return m.defined(s)&&ie.is(s.range)&&m.string(s.message)&&(m.number(s.severity)||m.undefined(s.severity))&&(m.integer(s.code)||m.string(s.code)||m.undefined(s.code))&&(m.undefined(s.codeDescription)||m.string((i=s.codeDescription)===null||i===void 0?void 0:i.href))&&(m.string(s.source)||m.undefined(s.source))&&(m.undefined(s.relatedInformation)||m.typedArray(s.relatedInformation,Jc.is))}t.is=r})(Ma||(Ma={}));(function(t){function e(n,i,...s){let a={title:n,command:i};return m.defined(s)&&s.length>0&&(a.arguments=s),a}t.create=e;function r(n){let i=n;return m.defined(i)&&m.string(i.title)&&m.string(i.command)}t.is=r})(ni||(ni={}));(function(t){function e(s,a){return{range:s,newText:a}}t.replace=e;function r(s,a){return{range:{start:s,end:s},newText:a}}t.insert=r;function n(s){return{range:s,newText:""}}t.del=n;function i(s){let a=s;return m.objectLiteral(a)&&m.string(a.newText)&&ie.is(a.range)}t.is=i})(Er||(Er={}));(function(t){function e(n,i,s){let a={label:n};return i!==void 0&&(a.needsConfirmation=i),s!==void 0&&(a.description=s),a}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&m.string(i.label)&&(m.boolean(i.needsConfirmation)||i.needsConfirmation===void 0)&&(m.string(i.description)||i.description===void 0)}t.is=r})(ri||(ri={}));(function(t){function e(r){let n=r;return m.string(n)}t.is=e})(lt||(lt={}));(function(t){function e(s,a,o){return{range:s,newText:a,annotationId:o}}t.replace=e;function r(s,a,o){return{range:{start:s,end:s},newText:a,annotationId:o}}t.insert=r;function n(s,a){return{range:s,newText:"",annotationId:a}}t.del=n;function i(s){let a=s;return Er.is(a)&&(ri.is(a.annotationId)||lt.is(a.annotationId))}t.is=i})(Xr||(Xr={}));(function(t){function e(n,i){return{textDocument:n,edits:i}}t.create=e;function r(n){let i=n;return m.defined(i)&&Ga.is(i.textDocument)&&Array.isArray(i.edits)}t.is=r})(Fa||(Fa={}));(function(t){function e(n,i,s){let a={kind:"create",uri:n};return i!==void 0&&(i.overwrite!==void 0||i.ignoreIfExists!==void 0)&&(a.options=i),s!==void 0&&(a.annotationId=s),a}t.create=e;function r(n){let i=n;return i&&i.kind==="create"&&m.string(i.uri)&&(i.options===void 0||(i.options.overwrite===void 0||m.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||m.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||lt.is(i.annotationId))}t.is=r})(rs||(rs={}));(function(t){function e(n,i,s,a){let o={kind:"rename",oldUri:n,newUri:i};return s!==void 0&&(s.overwrite!==void 0||s.ignoreIfExists!==void 0)&&(o.options=s),a!==void 0&&(o.annotationId=a),o}t.create=e;function r(n){let i=n;return i&&i.kind==="rename"&&m.string(i.oldUri)&&m.string(i.newUri)&&(i.options===void 0||(i.options.overwrite===void 0||m.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||m.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||lt.is(i.annotationId))}t.is=r})(ns||(ns={}));(function(t){function e(n,i,s){let a={kind:"delete",uri:n};return i!==void 0&&(i.recursive!==void 0||i.ignoreIfNotExists!==void 0)&&(a.options=i),s!==void 0&&(a.annotationId=s),a}t.create=e;function r(n){let i=n;return i&&i.kind==="delete"&&m.string(i.uri)&&(i.options===void 0||(i.options.recursive===void 0||m.boolean(i.options.recursive))&&(i.options.ignoreIfNotExists===void 0||m.boolean(i.options.ignoreIfNotExists)))&&(i.annotationId===void 0||lt.is(i.annotationId))}t.is=r})(is||(is={}));(function(t){function e(r){let n=r;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(i=>m.string(i.kind)?rs.is(i)||ns.is(i)||is.is(i):Fa.is(i)))}t.is=e})(Qc||(Qc={}));ts=class{constructor(e,r){this.edits=e,this.changeAnnotations=r}insert(e,r,n){let i,s;if(n===void 0?i=Er.insert(e,r):lt.is(n)?(s=n,i=Xr.insert(e,r,n)):(this.assertChangeAnnotations(this.changeAnnotations),s=this.changeAnnotations.manage(n),i=Xr.insert(e,r,s)),this.edits.push(i),s!==void 0)return s}replace(e,r,n){let i,s;if(n===void 0?i=Er.replace(e,r):lt.is(n)?(s=n,i=Xr.replace(e,r,n)):(this.assertChangeAnnotations(this.changeAnnotations),s=this.changeAnnotations.manage(n),i=Xr.replace(e,r,s)),this.edits.push(i),s!==void 0)return s}delete(e,r){let n,i;if(r===void 0?n=Er.del(e):lt.is(r)?(i=r,n=Xr.del(e,r)):(this.assertChangeAnnotations(this.changeAnnotations),i=this.changeAnnotations.manage(r),n=Xr.del(e,i)),this.edits.push(n),i!==void 0)return i}add(e){this.edits.push(e)}all(){return this.edits}clear(){this.edits.splice(0,this.edits.length)}assertChangeAnnotations(e){if(e===void 0)throw new Error("Text edit change is not configured to manage change annotations.")}},Zc=class{constructor(e){this._annotations=e===void 0?Object.create(null):e,this._counter=0,this._size=0}all(){return this._annotations}get size(){return this._size}manage(e,r){let n;if(lt.is(e)?n=e:(n=this.nextId(),r=e),this._annotations[n]!==void 0)throw new Error(`Id ${n} is already in use.`);if(r===void 0)throw new Error(`No annotation provided for id ${n}`);return this._annotations[n]=r,this._size++,n}nextId(){return this._counter++,this._counter.toString()}},Bf=class{constructor(e){this._textEditChanges=Object.create(null),e!==void 0?(this._workspaceEdit=e,e.documentChanges?(this._changeAnnotations=new Zc(e.changeAnnotations),e.changeAnnotations=this._changeAnnotations.all(),e.documentChanges.forEach(r=>{if(Fa.is(r)){let n=new ts(r.edits,this._changeAnnotations);this._textEditChanges[r.textDocument.uri]=n}})):e.changes&&Object.keys(e.changes).forEach(r=>{let n=new ts(e.changes[r]);this._textEditChanges[r]=n})):this._workspaceEdit={}}get edit(){return this.initDocumentChanges(),this._changeAnnotations!==void 0&&(this._changeAnnotations.size===0?this._workspaceEdit.changeAnnotations=void 0:this._workspaceEdit.changeAnnotations=this._changeAnnotations.all()),this._workspaceEdit}getTextEditChange(e){if(Ga.is(e)){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");let r={uri:e.uri,version:e.version},n=this._textEditChanges[r.uri];if(!n){let i=[],s={textDocument:r,edits:i};this._workspaceEdit.documentChanges.push(s),n=new ts(i,this._changeAnnotations),this._textEditChanges[r.uri]=n}return n}else{if(this.initChanges(),this._workspaceEdit.changes===void 0)throw new Error("Workspace edit is not configured for normal text edit changes.");let r=this._textEditChanges[e];if(!r){let n=[];this._workspaceEdit.changes[e]=n,r=new ts(n),this._textEditChanges[e]=r}return r}}initDocumentChanges(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._changeAnnotations=new Zc,this._workspaceEdit.documentChanges=[],this._workspaceEdit.changeAnnotations=this._changeAnnotations.all())}initChanges(){this._workspaceEdit.documentChanges===void 0&&this._workspaceEdit.changes===void 0&&(this._workspaceEdit.changes=Object.create(null))}createFile(e,r,n){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");let i;ri.is(r)||lt.is(r)?i=r:n=r;let s,a;if(i===void 0?s=rs.create(e,n):(a=lt.is(i)?i:this._changeAnnotations.manage(i),s=rs.create(e,n,a)),this._workspaceEdit.documentChanges.push(s),a!==void 0)return a}renameFile(e,r,n,i){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");let s;ri.is(n)||lt.is(n)?s=n:i=n;let a,o;if(s===void 0?a=ns.create(e,r,i):(o=lt.is(s)?s:this._changeAnnotations.manage(s),a=ns.create(e,r,i,o)),this._workspaceEdit.documentChanges.push(a),o!==void 0)return o}deleteFile(e,r,n){if(this.initDocumentChanges(),this._workspaceEdit.documentChanges===void 0)throw new Error("Workspace edit is not configured for document changes.");let i;ri.is(r)||lt.is(r)?i=r:n=r;let s,a;if(i===void 0?s=is.create(e,n):(a=lt.is(i)?i:this._changeAnnotations.manage(i),s=is.create(e,n,a)),this._workspaceEdit.documentChanges.push(s),a!==void 0)return a}};(function(t){function e(n){return{uri:n}}t.create=e;function r(n){let i=n;return m.defined(i)&&m.string(i.uri)}t.is=r})(Wf||(Wf={}));(function(t){function e(n,i){return{uri:n,version:i}}t.create=e;function r(n){let i=n;return m.defined(i)&&m.string(i.uri)&&m.integer(i.version)}t.is=r})(Vf||(Vf={}));(function(t){function e(n,i){return{uri:n,version:i}}t.create=e;function r(n){let i=n;return m.defined(i)&&m.string(i.uri)&&(i.version===null||m.integer(i.version))}t.is=r})(Ga||(Ga={}));(function(t){function e(n,i,s,a){return{uri:n,languageId:i,version:s,text:a}}t.create=e;function r(n){let i=n;return m.defined(i)&&m.string(i.uri)&&m.string(i.languageId)&&m.integer(i.version)&&m.string(i.text)}t.is=r})(Kf||(Kf={}));(function(t){t.PlainText="plaintext",t.Markdown="markdown";function e(r){let n=r;return n===t.PlainText||n===t.Markdown}t.is=e})(el||(el={}));(function(t){function e(r){let n=r;return m.objectLiteral(r)&&el.is(n.kind)&&m.string(n.value)}t.is=e})(ss||(ss={}));bg=(function(t){return t.Text=1,t.Method=2,t.Function=3,t.Constructor=4,t.Field=5,t.Variable=6,t.Class=7,t.Interface=8,t.Module=9,t.Property=10,t.Unit=11,t.Value=12,t.Enum=13,t.Keyword=14,t.Snippet=15,t.Color=16,t.File=17,t.Reference=18,t.Folder=19,t.EnumMember=20,t.Constant=21,t.Struct=22,t.Event=23,t.Operator=24,t.TypeParameter=25,t})(bg||{}),Pg=(function(t){return t.PlainText=1,t.Snippet=2,t})(Pg||{}),Og=(function(t){return t.Deprecated=1,t})(Og||{});(function(t){function e(n,i,s){return{newText:n,insert:i,replace:s}}t.create=e;function r(n){let i=n;return i&&m.string(i.newText)&&ie.is(i.insert)&&ie.is(i.replace)}t.is=r})(Hf||(Hf={}));Lg=(function(t){return t.asIs=1,t.adjustIndentation=2,t})(Lg||{});(function(t){function e(r){let n=r;return n&&(m.string(n.detail)||n.detail===void 0)&&(m.string(n.description)||n.description===void 0)}t.is=e})(Yf||(Yf={}));(function(t){function e(r){return{label:r}}t.create=e})(Xf||(Xf={}));(function(t){function e(r,n){return{items:r||[],isIncomplete:!!n}}t.create=e})(Jf||(Jf={}));(function(t){function e(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}t.fromPlainText=e;function r(n){let i=n;return m.string(i)||m.objectLiteral(i)&&m.string(i.language)&&m.string(i.value)}t.is=r})(Ua||(Ua={}));(function(t){function e(r){let n=r;return!!n&&m.objectLiteral(n)&&(ss.is(n.contents)||Ua.is(n.contents)||m.typedArray(n.contents,Ua.is))&&(r.range===void 0||ie.is(r.range))}t.is=e})(Qf||(Qf={}));(function(t){function e(r,n){return n?{label:r,documentation:n}:{label:r}}t.create=e})(Zf||(Zf={}));(function(t){function e(r,n,...i){let s={label:r};return m.defined(n)&&(s.documentation=n),m.defined(i)?s.parameters=i:s.parameters=[],s}t.create=e})(ed||(ed={}));Dg=(function(t){return t.Text=1,t.Read=2,t.Write=3,t})(Dg||{});(function(t){function e(r,n){let i={range:r};return m.number(n)&&(i.kind=n),i}t.create=e})(td||(td={}));Mg=(function(t){return t.File=1,t.Module=2,t.Namespace=3,t.Package=4,t.Class=5,t.Method=6,t.Property=7,t.Field=8,t.Constructor=9,t.Enum=10,t.Interface=11,t.Function=12,t.Variable=13,t.Constant=14,t.String=15,t.Number=16,t.Boolean=17,t.Array=18,t.Object=19,t.Key=20,t.Null=21,t.EnumMember=22,t.Struct=23,t.Event=24,t.Operator=25,t.TypeParameter=26,t})(Mg||{}),Fg=(function(t){return t.Deprecated=1,t})(Fg||{});(function(t){function e(r,n,i,s,a){let o={name:r,kind:n,location:{uri:s,range:i}};return a&&(o.containerName=a),o}t.create=e})(rd||(rd={}));(function(t){function e(r,n,i,s){return s!==void 0?{name:r,kind:n,location:{uri:i,range:s}}:{name:r,kind:n,location:{uri:i}}}t.create=e})(nd||(nd={}));(function(t){function e(n,i,s,a,o,c){let l={name:n,detail:i,kind:s,range:a,selectionRange:o};return c!==void 0&&(l.children=c),l}t.create=e;function r(n){let i=n;return i&&m.string(i.name)&&m.number(i.kind)&&ie.is(i.range)&&ie.is(i.selectionRange)&&(i.detail===void 0||m.string(i.detail))&&(i.deprecated===void 0||m.boolean(i.deprecated))&&(i.children===void 0||Array.isArray(i.children))&&(i.tags===void 0||Array.isArray(i.tags))}t.is=r})(id||(id={}));Gg=(function(t){return t.Empty="",t.QuickFix="quickfix",t.Refactor="refactor",t.RefactorExtract="refactor.extract",t.RefactorInline="refactor.inline",t.RefactorRewrite="refactor.rewrite",t.Source="source",t.SourceOrganizeImports="source.organizeImports",t.SourceFixAll="source.fixAll",t})(Gg||{}),tl=(function(t){return t.Invoked=1,t.Automatic=2,t})(tl||{});(function(t){function e(n,i,s){let a={diagnostics:n};return i!=null&&(a.only=i),s!=null&&(a.triggerKind=s),a}t.create=e;function r(n){let i=n;return m.defined(i)&&m.typedArray(i.diagnostics,Ma.is)&&(i.only===void 0||m.typedArray(i.only,m.string))&&(i.triggerKind===void 0||i.triggerKind===tl.Invoked||i.triggerKind===tl.Automatic)}t.is=r})(sd||(sd={}));(function(t){function e(n,i,s){let a={title:n},o=!0;return typeof i=="string"?(o=!1,a.kind=i):ni.is(i)?a.command=i:a.edit=i,o&&s!==void 0&&(a.kind=s),a}t.create=e;function r(n){let i=n;return i&&m.string(i.title)&&(i.diagnostics===void 0||m.typedArray(i.diagnostics,Ma.is))&&(i.kind===void 0||m.string(i.kind))&&(i.edit!==void 0||i.command!==void 0)&&(i.command===void 0||ni.is(i.command))&&(i.isPreferred===void 0||m.boolean(i.isPreferred))&&(i.edit===void 0||Qc.is(i.edit))}t.is=r})(ad||(ad={}));(function(t){function e(n,i){let s={range:n};return m.defined(i)&&(s.data=i),s}t.create=e;function r(n){let i=n;return m.defined(i)&&ie.is(i.range)&&(m.undefined(i.command)||ni.is(i.command))}t.is=r})(od||(od={}));(function(t){function e(n,i){return{tabSize:n,insertSpaces:i}}t.create=e;function r(n){let i=n;return m.defined(i)&&m.uinteger(i.tabSize)&&m.boolean(i.insertSpaces)}t.is=r})(cd||(cd={}));(function(t){function e(n,i,s){return{range:n,target:i,data:s}}t.create=e;function r(n){let i=n;return m.defined(i)&&ie.is(i.range)&&(m.undefined(i.target)||m.string(i.target))}t.is=r})(ld||(ld={}));(function(t){function e(n,i){return{range:n,parent:i}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&ie.is(i.range)&&(i.parent===void 0||t.is(i.parent))}t.is=r})(ud||(ud={}));Ug=(function(t){return t.namespace="namespace",t.type="type",t.class="class",t.enum="enum",t.interface="interface",t.struct="struct",t.typeParameter="typeParameter",t.parameter="parameter",t.variable="variable",t.property="property",t.enumMember="enumMember",t.event="event",t.function="function",t.method="method",t.macro="macro",t.keyword="keyword",t.modifier="modifier",t.comment="comment",t.string="string",t.number="number",t.regexp="regexp",t.operator="operator",t.decorator="decorator",t})(Ug||{}),qg=(function(t){return t.declaration="declaration",t.definition="definition",t.readonly="readonly",t.static="static",t.deprecated="deprecated",t.abstract="abstract",t.async="async",t.modification="modification",t.documentation="documentation",t.defaultLibrary="defaultLibrary",t})(qg||{});(function(t){function e(r){let n=r;return m.objectLiteral(n)&&(n.resultId===void 0||typeof n.resultId=="string")&&Array.isArray(n.data)&&(n.data.length===0||typeof n.data[0]=="number")}t.is=e})(fd||(fd={}));(function(t){function e(n,i){return{range:n,text:i}}t.create=e;function r(n){let i=n;return i!=null&&ie.is(i.range)&&m.string(i.text)}t.is=r})(dd||(dd={}));(function(t){function e(n,i,s){return{range:n,variableName:i,caseSensitiveLookup:s}}t.create=e;function r(n){let i=n;return i!=null&&ie.is(i.range)&&m.boolean(i.caseSensitiveLookup)&&(m.string(i.variableName)||i.variableName===void 0)}t.is=r})(pd||(pd={}));(function(t){function e(n,i){return{range:n,expression:i}}t.create=e;function r(n){let i=n;return i!=null&&ie.is(i.range)&&(m.string(i.expression)||i.expression===void 0)}t.is=r})(hd||(hd={}));(function(t){function e(n,i){return{frameId:n,stoppedLocation:i}}t.create=e;function r(n){let i=n;return m.defined(i)&&ie.is(n.stoppedLocation)}t.is=r})(md||(md={}));(function(t){t.Type=1,t.Parameter=2;function e(r){return r===1||r===2}t.is=e})(rl||(rl={}));(function(t){function e(n){return{value:n}}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&(i.tooltip===void 0||m.string(i.tooltip)||ss.is(i.tooltip))&&(i.location===void 0||Da.is(i.location))&&(i.command===void 0||ni.is(i.command))}t.is=r})(nl||(nl={}));(function(t){function e(n,i,s){let a={position:n,label:i};return s!==void 0&&(a.kind=s),a}t.create=e;function r(n){let i=n;return m.objectLiteral(i)&&ce.is(i.position)&&(m.string(i.label)||m.typedArray(i.label,nl.is))&&(i.kind===void 0||rl.is(i.kind))&&i.textEdits===void 0||m.typedArray(i.textEdits,Er.is)&&(i.tooltip===void 0||m.string(i.tooltip)||ss.is(i.tooltip))&&(i.paddingLeft===void 0||m.boolean(i.paddingLeft))&&(i.paddingRight===void 0||m.boolean(i.paddingRight))}t.is=r})(gd||(gd={}));(function(t){function e(r){return{kind:"snippet",value:r}}t.createSnippet=e})(yd||(yd={}));(function(t){function e(r,n,i,s){return{insertText:r,filterText:n,range:i,command:s}}t.create=e})(Td||(Td={}));(function(t){function e(r){return{items:r}}t.create=e})(Rd||(Rd={}));zg=(function(t){return t.Invoked=0,t.Automatic=1,t})(zg||{});(function(t){function e(r,n){return{range:r,text:n}}t.create=e})(xd||(xd={}));(function(t){function e(r,n){return{triggerKind:r,selectedCompletionInfo:n}}t.create=e})(vd||(vd={}));(function(t){function e(r){let n=r;return m.objectLiteral(n)&&Yc.is(n.uri)&&m.string(n.name)}t.is=e})(Ed||(Ed={}));IA=[` +`,`\r +`,"\r"];(function(t){function e(s,a,o,c){return new $d(s,a,o,c)}t.create=e;function r(s){let a=s;return!!(m.defined(a)&&m.string(a.uri)&&(m.undefined(a.languageId)||m.string(a.languageId))&&m.uinteger(a.lineCount)&&m.func(a.getText)&&m.func(a.positionAt)&&m.func(a.offsetAt))}t.is=r;function n(s,a){let o=s.getText(),c=i(a,(u,p)=>{let h=u.range.start.line-p.range.start.line;return h===0?u.range.start.character-p.range.start.character:h}),l=o.length;for(let u=c.length-1;u>=0;u--){let p=c[u],h=s.offsetAt(p.range.start),g=s.offsetAt(p.range.end);if(g<=l)o=o.substring(0,h)+p.newText+o.substring(g,o.length);else throw new Error("Overlapping edit");l=h}return o}t.applyEdits=n;function i(s,a){if(s.length<=1)return s;let o=s.length/2|0,c=s.slice(0,o),l=s.slice(o);i(c,a),i(l,a);let u=0,p=0,h=0;for(;u0&&e.push(r.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let r=this.getLineOffsets(),n=0,i=r.length;if(i===0)return ce.create(0,e);for(;ne?i=a:n=a+1}let s=n-1;return ce.create(s,e-r[s])}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line],i=e.line+1"u"}t.undefined=n;function i(g){return g===!0||g===!1}t.boolean=i;function s(g){return e.call(g)==="[object String]"}t.string=s;function a(g){return e.call(g)==="[object Number]"}t.number=a;function o(g,C,k){return e.call(g)==="[object Number]"&&C<=g&&g<=k}t.numberRange=o;function c(g){return e.call(g)==="[object Number]"&&-2147483648<=g&&g<=2147483647}t.integer=c;function l(g){return e.call(g)==="[object Number]"&&0<=g&&g<=2147483647}t.uinteger=l;function u(g){return e.call(g)==="[object Function]"}t.func=u;function p(g){return g!==null&&typeof g=="object"}t.objectLiteral=p;function h(g,C){return Array.isArray(g)&&g.every(C)}t.typedArray=h})(m||(m={}))});var Rn=X(Od=>{"use strict";Object.defineProperty(Od,"__esModule",{value:!0});var bd;function Pd(){if(bd===void 0)throw new Error("No runtime abstraction layer installed");return bd}(function(t){function e(r){if(r===void 0)throw new Error("No runtime abstraction layer provided");bd=r}t.install=e})(Pd||(Pd={}));Od.default=Pd});var ls=X(Tt=>{"use strict";Object.defineProperty(Tt,"__esModule",{value:!0});Tt.stringArray=Tt.array=Tt.func=Tt.error=Tt.number=Tt.string=Tt.boolean=void 0;function zA(t){return t===!0||t===!1}Tt.boolean=zA;function Hg(t){return typeof t=="string"||t instanceof String}Tt.string=Hg;function jA(t){return typeof t=="number"||t instanceof Number}Tt.number=jA;function BA(t){return t instanceof Error}Tt.error=BA;function WA(t){return typeof t=="function"}Tt.func=WA;function Yg(t){return Array.isArray(t)}Tt.array=Yg;function VA(t){return Yg(t)&&t.every(e=>Hg(e))}Tt.stringArray=VA});var ci=X(us=>{"use strict";Object.defineProperty(us,"__esModule",{value:!0});us.Emitter=us.Event=void 0;var KA=Rn(),Xg;(function(t){let e={dispose(){}};t.None=function(){return e}})(Xg||(us.Event=Xg={}));var Ld=class{add(e,r=null,n){this._callbacks||(this._callbacks=[],this._contexts=[]),this._callbacks.push(e),this._contexts.push(r),Array.isArray(n)&&n.push({dispose:()=>this.remove(e,r)})}remove(e,r=null){if(!this._callbacks)return;let n=!1;for(let i=0,s=this._callbacks.length;i{this._callbacks||(this._callbacks=new Ld),this._options&&this._options.onFirstListenerAdd&&this._callbacks.isEmpty()&&this._options.onFirstListenerAdd(this),this._callbacks.add(e,r);let i={dispose:()=>{this._callbacks&&(this._callbacks.remove(e,r),i.dispose=t._noop,this._options&&this._options.onLastListenerRemove&&this._callbacks.isEmpty()&&this._options.onLastListenerRemove(this))}};return Array.isArray(n)&&n.push(i),i}),this._event}fire(e){this._callbacks&&this._callbacks.invoke.call(this._callbacks,e)}dispose(){this._callbacks&&(this._callbacks.dispose(),this._callbacks=void 0)}};us.Emitter=ll;ll._noop=function(){}});var Ka=X(fs=>{"use strict";Object.defineProperty(fs,"__esModule",{value:!0});fs.CancellationTokenSource=fs.CancellationToken=void 0;var HA=Rn(),YA=ls(),Dd=ci(),ul;(function(t){t.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:Dd.Event.None}),t.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:Dd.Event.None});function e(r){let n=r;return n&&(n===t.None||n===t.Cancelled||YA.boolean(n.isCancellationRequested)&&!!n.onCancellationRequested)}t.is=e})(ul||(fs.CancellationToken=ul={}));var XA=Object.freeze(function(t,e){let r=(0,HA.default)().timer.setTimeout(t.bind(e),0);return{dispose(){r.dispose()}}}),fl=class{constructor(){this._isCancelled=!1}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?XA:(this._emitter||(this._emitter=new Dd.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=void 0)}},Md=class{get token(){return this._token||(this._token=new fl),this._token}cancel(){this._token?this._token.cancel():this._token=ul.Cancelled}dispose(){this._token?this._token instanceof fl&&this._token.dispose():this._token=ul.None}};fs.CancellationTokenSource=Md});var dp=X(j=>{"use strict";Object.defineProperty(j,"__esModule",{value:!0});j.Message=j.NotificationType9=j.NotificationType8=j.NotificationType7=j.NotificationType6=j.NotificationType5=j.NotificationType4=j.NotificationType3=j.NotificationType2=j.NotificationType1=j.NotificationType0=j.NotificationType=j.RequestType9=j.RequestType8=j.RequestType7=j.RequestType6=j.RequestType5=j.RequestType4=j.RequestType3=j.RequestType2=j.RequestType1=j.RequestType=j.RequestType0=j.AbstractMessageSignature=j.ParameterStructures=j.ResponseError=j.ErrorCodes=void 0;var pi=ls(),zd=(function(t){return t.ParseError=-32700,t.InvalidRequest=-32600,t.MethodNotFound=-32601,t.InvalidParams=-32602,t.InternalError=-32603,t.jsonrpcReservedErrorRangeStart=-32099,t.serverErrorStart=-32099,t.MessageWriteError=-32099,t.MessageReadError=-32098,t.PendingResponseRejected=-32097,t.ConnectionInactive=-32096,t.ServerNotInitialized=-32002,t.UnknownErrorCode=-32001,t.jsonrpcReservedErrorRangeEnd=-32e3,t.serverErrorEnd=-32e3,t})(zd||(j.ErrorCodes=zd={})),jd=class t extends Error{constructor(e,r,n){super(r),this.code=pi.number(e)?e:zd.UnknownErrorCode,this.data=n,Object.setPrototypeOf(this,t.prototype)}toJson(){let e={code:this.code,message:this.message};return this.data!==void 0&&(e.data=this.data),e}};j.ResponseError=jd;var Lt=class t{constructor(e){this.kind=e}static is(e){return e===t.auto||e===t.byName||e===t.byPosition}toString(){return this.kind}};j.ParameterStructures=Lt;Lt.auto=new Lt("auto");Lt.byPosition=new Lt("byPosition");Lt.byName=new Lt("byName");var Ie=class{constructor(e,r){this.method=e,this.numberOfParams=r}get parameterStructures(){return Lt.auto}};j.AbstractMessageSignature=Ie;var Bd=class extends Ie{constructor(e){super(e,0)}};j.RequestType0=Bd;var Wd=class extends Ie{constructor(e,r=Lt.auto){super(e,1),this._parameterStructures=r}get parameterStructures(){return this._parameterStructures}};j.RequestType=Wd;var Vd=class extends Ie{constructor(e,r=Lt.auto){super(e,1),this._parameterStructures=r}get parameterStructures(){return this._parameterStructures}};j.RequestType1=Vd;var Kd=class extends Ie{constructor(e){super(e,2)}};j.RequestType2=Kd;var Hd=class extends Ie{constructor(e){super(e,3)}};j.RequestType3=Hd;var Yd=class extends Ie{constructor(e){super(e,4)}};j.RequestType4=Yd;var Xd=class extends Ie{constructor(e){super(e,5)}};j.RequestType5=Xd;var Jd=class extends Ie{constructor(e){super(e,6)}};j.RequestType6=Jd;var Qd=class extends Ie{constructor(e){super(e,7)}};j.RequestType7=Qd;var Zd=class extends Ie{constructor(e){super(e,8)}};j.RequestType8=Zd;var ep=class extends Ie{constructor(e){super(e,9)}};j.RequestType9=ep;var tp=class extends Ie{constructor(e,r=Lt.auto){super(e,1),this._parameterStructures=r}get parameterStructures(){return this._parameterStructures}};j.NotificationType=tp;var rp=class extends Ie{constructor(e){super(e,0)}};j.NotificationType0=rp;var np=class extends Ie{constructor(e,r=Lt.auto){super(e,1),this._parameterStructures=r}get parameterStructures(){return this._parameterStructures}};j.NotificationType1=np;var ip=class extends Ie{constructor(e){super(e,2)}};j.NotificationType2=ip;var sp=class extends Ie{constructor(e){super(e,3)}};j.NotificationType3=sp;var ap=class extends Ie{constructor(e){super(e,4)}};j.NotificationType4=ap;var op=class extends Ie{constructor(e){super(e,5)}};j.NotificationType5=op;var cp=class extends Ie{constructor(e){super(e,6)}};j.NotificationType6=cp;var lp=class extends Ie{constructor(e){super(e,7)}};j.NotificationType7=lp;var up=class extends Ie{constructor(e){super(e,8)}};j.NotificationType8=up;var fp=class extends Ie{constructor(e){super(e,9)}};j.NotificationType9=fp;var cy;(function(t){function e(i){let s=i;return s&&pi.string(s.method)&&(pi.string(s.id)||pi.number(s.id))}t.isRequest=e;function r(i){let s=i;return s&&pi.string(s.method)&&i.id===void 0}t.isNotification=r;function n(i){let s=i;return s&&(s.result!==void 0||!!s.error)&&(pi.string(s.id)||pi.number(s.id)||s.id===null)}t.isResponse=n})(cy||(j.Message=cy={}))});var hp=X(xn=>{"use strict";var ly;Object.defineProperty(xn,"__esModule",{value:!0});xn.LRUCache=xn.LinkedMap=xn.Touch=void 0;var xt;(function(t){t.None=0,t.First=1,t.AsOld=t.First,t.Last=2,t.AsNew=t.Last})(xt||(xn.Touch=xt={}));var Tl=class{constructor(){this[ly]="LinkedMap",this._map=new Map,this._head=void 0,this._tail=void 0,this._size=0,this._state=0}clear(){this._map.clear(),this._head=void 0,this._tail=void 0,this._size=0,this._state++}isEmpty(){return!this._head&&!this._tail}get size(){return this._size}get first(){return this._head?.value}get last(){return this._tail?.value}has(e){return this._map.has(e)}get(e,r=xt.None){let n=this._map.get(e);if(n)return r!==xt.None&&this.touch(n,r),n.value}set(e,r,n=xt.None){let i=this._map.get(e);if(i)i.value=r,n!==xt.None&&this.touch(i,n);else{switch(i={key:e,value:r,next:void 0,previous:void 0},n){case xt.None:this.addItemLast(i);break;case xt.First:this.addItemFirst(i);break;case xt.Last:this.addItemLast(i);break;default:this.addItemLast(i);break}this._map.set(e,i),this._size++}return this}delete(e){return!!this.remove(e)}remove(e){let r=this._map.get(e);if(r)return this._map.delete(e),this.removeItem(r),this._size--,r.value}shift(){if(!this._head&&!this._tail)return;if(!this._head||!this._tail)throw new Error("Invalid list");let e=this._head;return this._map.delete(e.key),this.removeItem(e),this._size--,e.value}forEach(e,r){let n=this._state,i=this._head;for(;i;){if(r?e.bind(r)(i.value,i.key,this):e(i.value,i.key,this),this._state!==n)throw new Error("LinkedMap got modified during iteration.");i=i.next}}keys(){let e=this._state,r=this._head,n={[Symbol.iterator]:()=>n,next:()=>{if(this._state!==e)throw new Error("LinkedMap got modified during iteration.");if(r){let i={value:r.key,done:!1};return r=r.next,i}else return{value:void 0,done:!0}}};return n}values(){let e=this._state,r=this._head,n={[Symbol.iterator]:()=>n,next:()=>{if(this._state!==e)throw new Error("LinkedMap got modified during iteration.");if(r){let i={value:r.value,done:!1};return r=r.next,i}else return{value:void 0,done:!0}}};return n}entries(){let e=this._state,r=this._head,n={[Symbol.iterator]:()=>n,next:()=>{if(this._state!==e)throw new Error("LinkedMap got modified during iteration.");if(r){let i={value:[r.key,r.value],done:!1};return r=r.next,i}else return{value:void 0,done:!0}}};return n}[(ly=Symbol.toStringTag,Symbol.iterator)](){return this.entries()}trimOld(e){if(e>=this.size)return;if(e===0){this.clear();return}let r=this._head,n=this.size;for(;r&&n>e;)this._map.delete(r.key),r=r.next,n--;this._head=r,this._size=n,r&&(r.previous=void 0),this._state++}addItemFirst(e){if(!this._head&&!this._tail)this._tail=e;else if(this._head)e.next=this._head,this._head.previous=e;else throw new Error("Invalid list");this._head=e,this._state++}addItemLast(e){if(!this._head&&!this._tail)this._head=e;else if(this._tail)e.previous=this._tail,this._tail.next=e;else throw new Error("Invalid list");this._tail=e,this._state++}removeItem(e){if(e===this._head&&e===this._tail)this._head=void 0,this._tail=void 0;else if(e===this._head){if(!e.next)throw new Error("Invalid list");e.next.previous=void 0,this._head=e.next}else if(e===this._tail){if(!e.previous)throw new Error("Invalid list");e.previous.next=void 0,this._tail=e.previous}else{let r=e.next,n=e.previous;if(!r||!n)throw new Error("Invalid list");r.previous=n,n.next=r}e.next=void 0,e.previous=void 0,this._state++}touch(e,r){if(!this._head||!this._tail)throw new Error("Invalid list");if(!(r!==xt.First&&r!==xt.Last)){if(r===xt.First){if(e===this._head)return;let n=e.next,i=e.previous;e===this._tail?(i.next=void 0,this._tail=i):(n.previous=i,i.next=n),e.previous=void 0,e.next=this._head,this._head.previous=e,this._head=e,this._state++}else if(r===xt.Last){if(e===this._tail)return;let n=e.next,i=e.previous;e===this._head?(n.previous=void 0,this._head=n):(n.previous=i,i.next=n),e.next=void 0,e.previous=this._tail,this._tail.next=e,this._tail=e,this._state++}}}toJSON(){let e=[];return this.forEach((r,n)=>{e.push([n,r])}),e}fromJSON(e){this.clear();for(let[r,n]of e)this.set(r,n)}};xn.LinkedMap=Tl;var pp=class extends Tl{constructor(e,r=1){super(),this._limit=e,this._ratio=Math.min(Math.max(0,r),1)}get limit(){return this._limit}set limit(e){this._limit=e,this.checkTrim()}get ratio(){return this._ratio}set ratio(e){this._ratio=Math.min(Math.max(0,e),1),this.checkTrim()}get(e,r=xt.AsNew){return super.get(e,r)}peek(e){return super.get(e,xt.None)}set(e,r){return super.set(e,r,xt.Last),this.checkTrim(),this}checkTrim(){this.size>this._limit&&this.trimOld(Math.round(this._limit*this._ratio))}};xn.LRUCache=pp});var fy=X(Rl=>{"use strict";Object.defineProperty(Rl,"__esModule",{value:!0});Rl.Disposable=void 0;var uy;(function(t){function e(r){return{dispose:r}}t.create=e})(uy||(Rl.Disposable=uy={}))});var dy=X(Ts=>{"use strict";Object.defineProperty(Ts,"__esModule",{value:!0});Ts.SharedArrayReceiverStrategy=Ts.SharedArraySenderStrategy=void 0;var ZA=Ka(),xl=(function(t){return t.Continue=0,t.Cancelled=1,t})(xl||{}),mp=class{constructor(){this.buffers=new Map}enableCancellation(e){if(e.id===null)return;let r=new SharedArrayBuffer(4),n=new Int32Array(r,0,1);n[0]=xl.Continue,this.buffers.set(e.id,r),e.$cancellationData=r}sendCancellation(e,r){return P(this,null,function*(){let n=this.buffers.get(r);if(n===void 0)return;let i=new Int32Array(n,0,1);Atomics.store(i,0,xl.Cancelled)})}cleanup(e){this.buffers.delete(e)}dispose(){this.buffers.clear()}};Ts.SharedArraySenderStrategy=mp;var gp=class{constructor(e){this.data=new Int32Array(e,0,1)}get isCancellationRequested(){return Atomics.load(this.data,0)===xl.Cancelled}get onCancellationRequested(){throw new Error("Cancellation over SharedArrayBuffer doesn't support cancellation events")}},yp=class{constructor(e){this.token=new gp(e)}cancel(){}dispose(){}},Tp=class{constructor(){this.kind="request"}createCancellationTokenSource(e){let r=e.$cancellationData;return r===void 0?new ZA.CancellationTokenSource:new yp(r)}};Ts.SharedArrayReceiverStrategy=Tp});var xp=X(vl=>{"use strict";Object.defineProperty(vl,"__esModule",{value:!0});vl.Semaphore=void 0;var e$=Rn(),Rp=class{constructor(e=1){if(e<=0)throw new Error("Capacity must be greater than 0");this._capacity=e,this._active=0,this._waiting=[]}lock(e){return new Promise((r,n)=>{this._waiting.push({thunk:e,resolve:r,reject:n}),this.runNext()})}get active(){return this._active}runNext(){this._waiting.length===0||this._active===this._capacity||(0,e$.default)().timer.setImmediate(()=>this.doRunNext())}doRunNext(){if(this._waiting.length===0||this._active===this._capacity)return;let e=this._waiting.shift();if(this._active++,this._active>this._capacity)throw new Error("To many thunks active");try{let r=e.thunk();r instanceof Promise?r.then(n=>{this._active--,e.resolve(n),this.runNext()},n=>{this._active--,e.reject(n),this.runNext()}):(this._active--,e.resolve(r),this.runNext())}catch(r){this._active--,e.reject(r),this.runNext()}}};vl.Semaphore=Rp});var hy=X(vn=>{"use strict";Object.defineProperty(vn,"__esModule",{value:!0});vn.ReadableStreamMessageReader=vn.AbstractMessageReader=vn.MessageReader=void 0;var Ep=Rn(),Rs=ls(),vp=ci(),t$=xp(),py;(function(t){function e(r){let n=r;return n&&Rs.func(n.listen)&&Rs.func(n.dispose)&&Rs.func(n.onError)&&Rs.func(n.onClose)&&Rs.func(n.onPartialMessage)}t.is=e})(py||(vn.MessageReader=py={}));var El=class{constructor(){this.errorEmitter=new vp.Emitter,this.closeEmitter=new vp.Emitter,this.partialMessageEmitter=new vp.Emitter}dispose(){this.errorEmitter.dispose(),this.closeEmitter.dispose()}get onError(){return this.errorEmitter.event}fireError(e){this.errorEmitter.fire(this.asError(e))}get onClose(){return this.closeEmitter.event}fireClose(){this.closeEmitter.fire(void 0)}get onPartialMessage(){return this.partialMessageEmitter.event}firePartialMessage(e){this.partialMessageEmitter.fire(e)}asError(e){return e instanceof Error?e:new Error(`Reader received error. Reason: ${Rs.string(e.message)?e.message:"unknown"}`)}};vn.AbstractMessageReader=El;var Ap;(function(t){function e(r){let n,i,s,a=new Map,o,c=new Map;if(r===void 0||typeof r=="string")n=r??"utf-8";else{if(n=r.charset??"utf-8",r.contentDecoder!==void 0&&(s=r.contentDecoder,a.set(s.name,s)),r.contentDecoders!==void 0)for(let l of r.contentDecoders)a.set(l.name,l);if(r.contentTypeDecoder!==void 0&&(o=r.contentTypeDecoder,c.set(o.name,o)),r.contentTypeDecoders!==void 0)for(let l of r.contentTypeDecoders)c.set(l.name,l)}return o===void 0&&(o=(0,Ep.default)().applicationJson.decoder,c.set(o.name,o)),{charset:n,contentDecoder:s,contentDecoders:a,contentTypeDecoder:o,contentTypeDecoders:c}}t.fromOptions=e})(Ap||(Ap={}));var $p=class extends El{constructor(e,r){super(),this.readable=e,this.options=Ap.fromOptions(r),this.buffer=(0,Ep.default)().messageBuffer.create(this.options.charset),this._partialMessageTimeout=1e4,this.nextMessageLength=-1,this.messageToken=0,this.readSemaphore=new t$.Semaphore(1)}set partialMessageTimeout(e){this._partialMessageTimeout=e}get partialMessageTimeout(){return this._partialMessageTimeout}listen(e){this.nextMessageLength=-1,this.messageToken=0,this.partialMessageTimer=void 0,this.callback=e;let r=this.readable.onData(n=>{this.onData(n)});return this.readable.onError(n=>this.fireError(n)),this.readable.onClose(()=>this.fireClose()),r}onData(e){try{for(this.buffer.append(e);;){if(this.nextMessageLength===-1){let n=this.buffer.tryReadHeaders(!0);if(!n)return;let i=n.get("content-length");if(!i){this.fireError(new Error(`Header must provide a Content-Length property. +${JSON.stringify(Object.fromEntries(n))}`));return}let s=parseInt(i);if(isNaN(s)){this.fireError(new Error(`Content-Length value must be a number. Got ${i}`));return}this.nextMessageLength=s}let r=this.buffer.tryReadBody(this.nextMessageLength);if(r===void 0){this.setPartialMessageTimer();return}this.clearPartialMessageTimer(),this.nextMessageLength=-1,this.readSemaphore.lock(()=>P(this,null,function*(){let n=this.options.contentDecoder!==void 0?yield this.options.contentDecoder.decode(r):r,i=yield this.options.contentTypeDecoder.decode(n,this.options);this.callback(i)})).catch(n=>{this.fireError(n)})}}catch(r){this.fireError(r)}}clearPartialMessageTimer(){this.partialMessageTimer&&(this.partialMessageTimer.dispose(),this.partialMessageTimer=void 0)}setPartialMessageTimer(){this.clearPartialMessageTimer(),!(this._partialMessageTimeout<=0)&&(this.partialMessageTimer=(0,Ep.default)().timer.setTimeout((e,r)=>{this.partialMessageTimer=void 0,e===this.messageToken&&(this.firePartialMessage({messageToken:e,waitingTime:r}),this.setPartialMessageTimer())},this._partialMessageTimeout,this.messageToken,this._partialMessageTimeout))}};vn.ReadableStreamMessageReader=$p});var Ry=X(En=>{"use strict";Object.defineProperty(En,"__esModule",{value:!0});En.WriteableStreamMessageWriter=En.AbstractMessageWriter=En.MessageWriter=void 0;var my=Rn(),fo=ls(),r$=xp(),gy=ci(),n$="Content-Length: ",yy=`\r +`,Ty;(function(t){function e(r){let n=r;return n&&fo.func(n.dispose)&&fo.func(n.onClose)&&fo.func(n.onError)&&fo.func(n.write)}t.is=e})(Ty||(En.MessageWriter=Ty={}));var Al=class{constructor(){this.errorEmitter=new gy.Emitter,this.closeEmitter=new gy.Emitter}dispose(){this.errorEmitter.dispose(),this.closeEmitter.dispose()}get onError(){return this.errorEmitter.event}fireError(e,r,n){this.errorEmitter.fire([this.asError(e),r,n])}get onClose(){return this.closeEmitter.event}fireClose(){this.closeEmitter.fire(void 0)}asError(e){return e instanceof Error?e:new Error(`Writer received error. Reason: ${fo.string(e.message)?e.message:"unknown"}`)}};En.AbstractMessageWriter=Al;var Sp;(function(t){function e(r){return r===void 0||typeof r=="string"?{charset:r??"utf-8",contentTypeEncoder:(0,my.default)().applicationJson.encoder}:{charset:r.charset??"utf-8",contentEncoder:r.contentEncoder,contentTypeEncoder:r.contentTypeEncoder??(0,my.default)().applicationJson.encoder}}t.fromOptions=e})(Sp||(Sp={}));var kp=class extends Al{constructor(e,r){super(),this.writable=e,this.options=Sp.fromOptions(r),this.errorCount=0,this.writeSemaphore=new r$.Semaphore(1),this.writable.onError(n=>this.fireError(n)),this.writable.onClose(()=>this.fireClose())}write(e){return P(this,null,function*(){return this.writeSemaphore.lock(()=>P(this,null,function*(){return this.options.contentTypeEncoder.encode(e,this.options).then(n=>this.options.contentEncoder!==void 0?this.options.contentEncoder.encode(n):n).then(n=>{let i=[];return i.push(n$,n.byteLength.toString(),yy),i.push(yy),this.doWrite(e,i,n)},n=>{throw this.fireError(n),n})}))})}doWrite(e,r,n){return P(this,null,function*(){try{return yield this.writable.write(r.join(""),"ascii"),this.writable.write(n)}catch(i){return this.handleError(i,e),Promise.reject(i)}})}handleError(e,r){this.errorCount++,this.fireError(e,r,this.errorCount)}end(){this.writable.end()}};En.WriteableStreamMessageWriter=kp});var xy=X($l=>{"use strict";Object.defineProperty($l,"__esModule",{value:!0});$l.AbstractMessageBuffer=void 0;var i$=13,s$=10,a$=`\r +`,Np=class{constructor(e="utf-8"){this._encoding=e,this._chunks=[],this._totalLength=0}get encoding(){return this._encoding}append(e){let r=typeof e=="string"?this.fromString(e,this._encoding):e;this._chunks.push(r),this._totalLength+=r.byteLength}tryReadHeaders(e=!1){if(this._chunks.length===0)return;let r=0,n=0,i=0,s=0;e:for(;nthis._totalLength)throw new Error("Cannot read so many bytes!");if(this._chunks[0].byteLength===e){let s=this._chunks[0];return this._chunks.shift(),this._totalLength-=e,this.asNative(s)}if(this._chunks[0].byteLength>e){let s=this._chunks[0],a=this.asNative(s,e);return this._chunks[0]=s.slice(e),this._totalLength-=e,a}let r=this.allocNative(e),n=0,i=0;for(;e>0;){let s=this._chunks[i];if(s.byteLength>e){let a=s.slice(0,e);r.set(a,n),n+=e,this._chunks[i]=s.slice(e),this._totalLength-=e,e-=e}else r.set(s,n),n+=s.byteLength,this._chunks.shift(),this._totalLength-=s.byteLength,e-=s.byteLength}return r}};$l.AbstractMessageBuffer=Np});var Sy=X(J=>{"use strict";Object.defineProperty(J,"__esModule",{value:!0});J.createMessageConnection=J.ConnectionOptions=J.MessageStrategy=J.CancellationStrategy=J.CancellationSenderStrategy=J.CancellationReceiverStrategy=J.RequestCancellationReceiverStrategy=J.IdCancellationReceiverStrategy=J.ConnectionStrategy=J.ConnectionError=J.ConnectionErrors=J.LogTraceNotification=J.SetTraceNotification=J.TraceFormat=J.TraceValues=J.Trace=J.NullLogger=J.ProgressType=J.ProgressToken=void 0;var vy=Rn(),Fe=ls(),K=dp(),Ey=hp(),po=ci(),Cp=Ka(),go;(function(t){t.type=new K.NotificationType("$/cancelRequest")})(go||(go={}));var wp;(function(t){function e(r){return typeof r=="string"||typeof r=="number"}t.is=e})(wp||(J.ProgressToken=wp={}));var ho;(function(t){t.type=new K.NotificationType("$/progress")})(ho||(ho={}));var Ip=class{constructor(){}};J.ProgressType=Ip;var _p;(function(t){function e(r){return Fe.func(r)}t.is=e})(_p||(_p={}));J.NullLogger=Object.freeze({error:()=>{},warn:()=>{},info:()=>{},log:()=>{}});var fe=(function(t){return t[t.Off=0]="Off",t[t.Messages=1]="Messages",t[t.Compact=2]="Compact",t[t.Verbose=3]="Verbose",t})(fe||(J.Trace=fe={})),Ay=(function(t){return t.Off="off",t.Messages="messages",t.Compact="compact",t.Verbose="verbose",t})(Ay||(J.TraceValues=Ay={}));(function(t){function e(n){if(!Fe.string(n))return t.Off;switch(n=n.toLowerCase(),n){case"off":return t.Off;case"messages":return t.Messages;case"compact":return t.Compact;case"verbose":return t.Verbose;default:return t.Off}}t.fromString=e;function r(n){switch(n){case t.Off:return"off";case t.Messages:return"messages";case t.Compact:return"compact";case t.Verbose:return"verbose";default:return"off"}}t.toString=r})(fe||(J.Trace=fe={}));var Wt=(function(t){return t.Text="text",t.JSON="json",t})(Wt||(J.TraceFormat=Wt={}));(function(t){function e(r){return Fe.string(r)?(r=r.toLowerCase(),r==="json"?t.JSON:t.Text):t.Text}t.fromString=e})(Wt||(J.TraceFormat=Wt={}));var bp;(function(t){t.type=new K.NotificationType("$/setTrace")})(bp||(J.SetTraceNotification=bp={}));var Sl;(function(t){t.type=new K.NotificationType("$/logTrace")})(Sl||(J.LogTraceNotification=Sl={}));var mo=(function(t){return t[t.Closed=1]="Closed",t[t.Disposed=2]="Disposed",t[t.AlreadyListening=3]="AlreadyListening",t})(mo||(J.ConnectionErrors=mo={})),xs=class t extends Error{constructor(e,r){super(r),this.code=e,Object.setPrototypeOf(this,t.prototype)}};J.ConnectionError=xs;var Pp;(function(t){function e(r){let n=r;return n&&Fe.func(n.cancelUndispatched)}t.is=e})(Pp||(J.ConnectionStrategy=Pp={}));var kl;(function(t){function e(r){let n=r;return n&&(n.kind===void 0||n.kind==="id")&&Fe.func(n.createCancellationTokenSource)&&(n.dispose===void 0||Fe.func(n.dispose))}t.is=e})(kl||(J.IdCancellationReceiverStrategy=kl={}));var Op;(function(t){function e(r){let n=r;return n&&n.kind==="request"&&Fe.func(n.createCancellationTokenSource)&&(n.dispose===void 0||Fe.func(n.dispose))}t.is=e})(Op||(J.RequestCancellationReceiverStrategy=Op={}));var Nl;(function(t){t.Message=Object.freeze({createCancellationTokenSource(r){return new Cp.CancellationTokenSource}});function e(r){return kl.is(r)||Op.is(r)}t.is=e})(Nl||(J.CancellationReceiverStrategy=Nl={}));var Cl;(function(t){t.Message=Object.freeze({sendCancellation(r,n){return r.sendNotification(go.type,{id:n})},cleanup(r){}});function e(r){let n=r;return n&&Fe.func(n.sendCancellation)&&Fe.func(n.cleanup)}t.is=e})(Cl||(J.CancellationSenderStrategy=Cl={}));var wl;(function(t){t.Message=Object.freeze({receiver:Nl.Message,sender:Cl.Message});function e(r){let n=r;return n&&Nl.is(n.receiver)&&Cl.is(n.sender)}t.is=e})(wl||(J.CancellationStrategy=wl={}));var Il;(function(t){function e(r){let n=r;return n&&Fe.func(n.handleMessage)}t.is=e})(Il||(J.MessageStrategy=Il={}));var $y;(function(t){function e(r){let n=r;return n&&(wl.is(n.cancellationStrategy)||Pp.is(n.connectionStrategy)||Il.is(n.messageStrategy))}t.is=e})($y||(J.ConnectionOptions=$y={}));var kr=(function(t){return t[t.New=1]="New",t[t.Listening=2]="Listening",t[t.Closed=3]="Closed",t[t.Disposed=4]="Disposed",t})(kr||{});function o$(t,e,r,n){let i=r!==void 0?r:J.NullLogger,s=0,a=0,o=0,c="2.0",l,u=new Map,p,h=new Map,g=new Map,C,k=new Ey.LinkedMap,G=new Map,M=new Set,b=new Map,E=fe.Off,H=Wt.Text,F,ye=kr.New,dr=new po.Emitter,Je=new po.Emitter,Qt=new po.Emitter,Kt=new po.Emitter,$=new po.Emitter,y=n&&n.cancellationStrategy?n.cancellationStrategy:wl.Message;function L(d){if(d===null)throw new Error("Can't send requests with id null since the response can't be correlated.");return"req-"+d.toString()}function O(d){return d===null?"res-unknown-"+(++o).toString():"res-"+d.toString()}function T(){return"not-"+(++a).toString()}function x(d,v){K.Message.isRequest(v)?d.set(L(v.id),v):K.Message.isResponse(v)?d.set(O(v.id),v):d.set(T(),v)}function A(d){}function _(){return ye===kr.Listening}function U(){return ye===kr.Closed}function N(){return ye===kr.Disposed}function Y(){(ye===kr.New||ye===kr.Listening)&&(ye=kr.Closed,Je.fire(void 0))}function Q(d){dr.fire([d,void 0,void 0])}function de(d){dr.fire(d)}t.onClose(Y),t.onError(Q),e.onClose(Y),e.onError(de);function ue(){C||k.size===0||(C=(0,vy.default)().timer.setImmediate(()=>{C=void 0,We()}))}function ve(d){K.Message.isRequest(d)?ot(d):K.Message.isNotification(d)?pr(d):K.Message.isResponse(d)?_t(d):Zt(d)}function We(){if(k.size===0)return;let d=k.shift();try{let v=n?.messageStrategy;Il.is(v)?v.handleMessage(d,ve):ve(d)}finally{ue()}}let js=d=>{try{if(K.Message.isNotification(d)&&d.method===go.type.method){let v=d.params.id,w=L(v),z=k.get(w);if(K.Message.isRequest(z)){let Te=n?.connectionStrategy,Ge=Te&&Te.cancelUndispatched?Te.cancelUndispatched(z,A):void 0;if(Ge&&(Ge.error!==void 0||Ge.result!==void 0)){k.delete(w),b.delete(v),Ge.id=z.id,Do(Ge,d.method,Date.now()),e.write(Ge).catch(()=>i.error("Sending response for canceled message failed."));return}}let ke=b.get(v);if(ke!==void 0){ke.cancel(),uu(d);return}else M.add(v)}x(k,d)}finally{ue()}};function ot(d){if(N())return;function v(oe,be,me){let Qe={jsonrpc:c,id:d.id};oe instanceof K.ResponseError?Qe.error=oe.toJson():Qe.result=oe===void 0?null:oe,Do(Qe,be,me),e.write(Qe).catch(()=>i.error("Sending response failed."))}function w(oe,be,me){let Qe={jsonrpc:c,id:d.id,error:oe.toJson()};Do(Qe,be,me),e.write(Qe).catch(()=>i.error("Sending response failed."))}function z(oe,be,me){oe===void 0&&(oe=null);let Qe={jsonrpc:c,id:d.id,result:oe};Do(Qe,be,me),e.write(Qe).catch(()=>i.error("Sending response failed."))}Qx(d);let ke=u.get(d.method),Te,Ge;ke&&(Te=ke.type,Ge=ke.handler);let je=Date.now();if(Ge||l){let oe=d.id??String(Date.now()),be=kl.is(y.receiver)?y.receiver.createCancellationTokenSource(oe):y.receiver.createCancellationTokenSource(d);d.id!==null&&M.has(d.id)&&be.cancel(),d.id!==null&&b.set(oe,be);try{let me;if(Ge)if(d.params===void 0){if(Te!==void 0&&Te.numberOfParams!==0){w(new K.ResponseError(K.ErrorCodes.InvalidParams,`Request ${d.method} defines ${Te.numberOfParams} params but received none.`),d.method,je);return}me=Ge(be.token)}else if(Array.isArray(d.params)){if(Te!==void 0&&Te.parameterStructures===K.ParameterStructures.byName){w(new K.ResponseError(K.ErrorCodes.InvalidParams,`Request ${d.method} defines parameters by name but received parameters by position`),d.method,je);return}me=Ge(...d.params,be.token)}else{if(Te!==void 0&&Te.parameterStructures===K.ParameterStructures.byPosition){w(new K.ResponseError(K.ErrorCodes.InvalidParams,`Request ${d.method} defines parameters by position but received parameters by name`),d.method,je);return}me=Ge(d.params,be.token)}else l&&(me=l(d.method,d.params,be.token));let Qe=me;me?Qe.then?Qe.then(Et=>{b.delete(oe),v(Et,d.method,je)},Et=>{b.delete(oe),Et instanceof K.ResponseError?w(Et,d.method,je):Et&&Fe.string(Et.message)?w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed with message: ${Et.message}`),d.method,je):w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed unexpectedly without providing any details.`),d.method,je)}):(b.delete(oe),v(me,d.method,je)):(b.delete(oe),z(me,d.method,je))}catch(me){b.delete(oe),me instanceof K.ResponseError?v(me,d.method,je):me&&Fe.string(me.message)?w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed with message: ${me.message}`),d.method,je):w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed unexpectedly without providing any details.`),d.method,je)}}else w(new K.ResponseError(K.ErrorCodes.MethodNotFound,`Unhandled method ${d.method}`),d.method,je)}function _t(d){if(!N())if(d.id===null)d.error?i.error(`Received response message without id: Error is: +${JSON.stringify(d.error,void 0,4)}`):i.error("Received response message without id. No further error information provided.");else{let v=d.id,w=G.get(v);if(Zx(d,w),w!==void 0){G.delete(v);try{if(d.error){let z=d.error;w.reject(new K.ResponseError(z.code,z.message,z.data))}else if(d.result!==void 0)w.resolve(d.result);else throw new Error("Should never happen.")}catch(z){z.message?i.error(`Response handler '${w.method}' failed with message: ${z.message}`):i.error(`Response handler '${w.method}' failed unexpectedly.`)}}}}function pr(d){if(N())return;let v,w;if(d.method===go.type.method){let z=d.params.id;M.delete(z),uu(d);return}else{let z=h.get(d.method);z&&(w=z.handler,v=z.type)}if(w||p)try{if(uu(d),w)if(d.params===void 0)v!==void 0&&v.numberOfParams!==0&&v.parameterStructures!==K.ParameterStructures.byName&&i.error(`Notification ${d.method} defines ${v.numberOfParams} params but received none.`),w();else if(Array.isArray(d.params)){let z=d.params;d.method===ho.type.method&&z.length===2&&wp.is(z[0])?w({token:z[0],value:z[1]}):(v!==void 0&&(v.parameterStructures===K.ParameterStructures.byName&&i.error(`Notification ${d.method} defines parameters by name but received parameters by position`),v.numberOfParams!==d.params.length&&i.error(`Notification ${d.method} defines ${v.numberOfParams} params but received ${z.length} arguments`)),w(...z))}else v!==void 0&&v.parameterStructures===K.ParameterStructures.byPosition&&i.error(`Notification ${d.method} defines parameters by position but received parameters by name`),w(d.params);else p&&p(d.method,d.params)}catch(z){z.message?i.error(`Notification handler '${d.method}' failed with message: ${z.message}`):i.error(`Notification handler '${d.method}' failed unexpectedly.`)}else Qt.fire(d)}function Zt(d){if(!d){i.error("Received empty message.");return}i.error(`Received message which is neither a response nor a notification message: +${JSON.stringify(d,null,4)}`);let v=d;if(Fe.string(v.id)||Fe.number(v.id)){let w=v.id,z=G.get(w);z&&z.reject(new Error("The received response has neither a result nor an error property."))}}function ft(d){if(d!=null)switch(E){case fe.Verbose:return JSON.stringify(d,null,4);case fe.Compact:return JSON.stringify(d);default:return}}function Bs(d){if(!(E===fe.Off||!F))if(H===Wt.Text){let v;(E===fe.Verbose||E===fe.Compact)&&d.params&&(v=`Params: ${ft(d.params)} + +`),F.log(`Sending request '${d.method} - (${d.id})'.`,v)}else xi("send-request",d)}function Lo(d){if(!(E===fe.Off||!F))if(H===Wt.Text){let v;(E===fe.Verbose||E===fe.Compact)&&(d.params?v=`Params: ${ft(d.params)} + +`:v=`No parameters provided. + +`),F.log(`Sending notification '${d.method}'.`,v)}else xi("send-notification",d)}function Do(d,v,w){if(!(E===fe.Off||!F))if(H===Wt.Text){let z;(E===fe.Verbose||E===fe.Compact)&&(d.error&&d.error.data?z=`Error data: ${ft(d.error.data)} + +`:d.result?z=`Result: ${ft(d.result)} + +`:d.error===void 0&&(z=`No result returned. + +`)),F.log(`Sending response '${v} - (${d.id})'. Processing request took ${Date.now()-w}ms`,z)}else xi("send-response",d)}function Qx(d){if(!(E===fe.Off||!F))if(H===Wt.Text){let v;(E===fe.Verbose||E===fe.Compact)&&d.params&&(v=`Params: ${ft(d.params)} + +`),F.log(`Received request '${d.method} - (${d.id})'.`,v)}else xi("receive-request",d)}function uu(d){if(!(E===fe.Off||!F||d.method===Sl.type.method))if(H===Wt.Text){let v;(E===fe.Verbose||E===fe.Compact)&&(d.params?v=`Params: ${ft(d.params)} + +`:v=`No parameters provided. + +`),F.log(`Received notification '${d.method}'.`,v)}else xi("receive-notification",d)}function Zx(d,v){if(!(E===fe.Off||!F))if(H===Wt.Text){let w;if((E===fe.Verbose||E===fe.Compact)&&(d.error&&d.error.data?w=`Error data: ${ft(d.error.data)} + +`:d.result?w=`Result: ${ft(d.result)} + +`:d.error===void 0&&(w=`No result returned. + +`)),v){let z=d.error?` Request failed: ${d.error.message} (${d.error.code}).`:"";F.log(`Received response '${v.method} - (${d.id})' in ${Date.now()-v.timerStart}ms.${z}`,w)}else F.log(`Received response ${d.id} without active response promise.`,w)}else xi("receive-response",d)}function xi(d,v){if(!F||E===fe.Off)return;let w={isLSPMessage:!0,type:d,message:v,timestamp:Date.now()};F.log(w)}function Ws(){if(U())throw new xs(mo.Closed,"Connection is closed.");if(N())throw new xs(mo.Disposed,"Connection is disposed.")}function ev(){if(_())throw new xs(mo.AlreadyListening,"Connection is already listening")}function tv(){if(!_())throw new Error("Call listen() first.")}function Vs(d){return d===void 0?null:d}function Lh(d){if(d!==null)return d}function Dh(d){return d!=null&&!Array.isArray(d)&&typeof d=="object"}function fu(d,v){switch(d){case K.ParameterStructures.auto:return Dh(v)?Lh(v):[Vs(v)];case K.ParameterStructures.byName:if(!Dh(v))throw new Error("Received parameters by name but param is not an object literal.");return Lh(v);case K.ParameterStructures.byPosition:return[Vs(v)];default:throw new Error(`Unknown parameter structure ${d.toString()}`)}}function Mh(d,v){let w,z=d.numberOfParams;switch(z){case 0:w=void 0;break;case 1:w=fu(d.parameterStructures,v[0]);break;default:w=[];for(let ke=0;ke{Ws();let w,z;if(Fe.string(d)){w=d;let Te=v[0],Ge=0,je=K.ParameterStructures.auto;K.ParameterStructures.is(Te)&&(Ge=1,je=Te);let oe=v.length,be=oe-Ge;switch(be){case 0:z=void 0;break;case 1:z=fu(je,v[Ge]);break;default:if(je===K.ParameterStructures.byName)throw new Error(`Received ${be} parameters for 'by Name' notification parameter structure.`);z=v.slice(Ge,oe).map(me=>Vs(me));break}}else{let Te=v;w=d.method,z=Mh(d,Te)}let ke={jsonrpc:c,method:w,params:z};return Lo(ke),e.write(ke).catch(Te=>{throw i.error("Sending notification failed."),Te})},onNotification:(d,v)=>{Ws();let w;return Fe.func(d)?p=d:v&&(Fe.string(d)?(w=d,h.set(d,{type:void 0,handler:v})):(w=d.method,h.set(d.method,{type:d,handler:v}))),{dispose:()=>{w!==void 0?h.delete(w):p=void 0}}},onProgress:(d,v,w)=>{if(g.has(v))throw new Error(`Progress handler for token ${v} already registered`);return g.set(v,w),{dispose:()=>{g.delete(v)}}},sendProgress:(d,v,w)=>vi.sendNotification(ho.type,{token:v,value:w}),onUnhandledProgress:Kt.event,sendRequest:(d,...v)=>{Ws(),tv();let w,z,ke;if(Fe.string(d)){w=d;let oe=v[0],be=v[v.length-1],me=0,Qe=K.ParameterStructures.auto;K.ParameterStructures.is(oe)&&(me=1,Qe=oe);let Et=v.length;Cp.CancellationToken.is(be)&&(Et=Et-1,ke=be);let hr=Et-me;switch(hr){case 0:z=void 0;break;case 1:z=fu(Qe,v[me]);break;default:if(Qe===K.ParameterStructures.byName)throw new Error(`Received ${hr} parameters for 'by Name' request parameter structure.`);z=v.slice(me,Et).map(rv=>Vs(rv));break}}else{let oe=v;w=d.method,z=Mh(d,oe);let be=d.numberOfParams;ke=Cp.CancellationToken.is(oe[be])?oe[be]:void 0}let Te=s++,Ge;ke&&(Ge=ke.onCancellationRequested(()=>{let oe=y.sender.sendCancellation(vi,Te);return oe===void 0?(i.log(`Received no promise from cancellation strategy when cancelling id ${Te}`),Promise.resolve()):oe.catch(()=>{i.log(`Sending cancellation messages for id ${Te} failed`)})}));let je={jsonrpc:c,id:Te,method:w,params:z};return Bs(je),typeof y.sender.enableCancellation=="function"&&y.sender.enableCancellation(je),new Promise((oe,be)=>P(null,null,function*(){let me=hr=>{oe(hr),y.sender.cleanup(Te),Ge?.dispose()},Qe=hr=>{be(hr),y.sender.cleanup(Te),Ge?.dispose()},Et={method:w,timerStart:Date.now(),resolve:me,reject:Qe};try{yield e.write(je),G.set(Te,Et)}catch(hr){throw i.error("Sending request failed."),Et.reject(new K.ResponseError(K.ErrorCodes.MessageWriteError,hr.message?hr.message:"Unknown reason")),hr}}))},onRequest:(d,v)=>{Ws();let w=null;return _p.is(d)?(w=void 0,l=d):Fe.string(d)?(w=null,v!==void 0&&(w=d,u.set(d,{handler:v,type:void 0}))):v!==void 0&&(w=d.method,u.set(d.method,{type:d,handler:v})),{dispose:()=>{w!==null&&(w!==void 0?u.delete(w):l=void 0)}}},hasPendingResponse:()=>G.size>0,trace:(d,v,w)=>P(null,null,function*(){let z=!1,ke=Wt.Text;w!==void 0&&(Fe.boolean(w)?z=w:(z=w.sendNotification||!1,ke=w.traceFormat||Wt.Text)),E=d,H=ke,E===fe.Off?F=void 0:F=v,z&&!U()&&!N()&&(yield vi.sendNotification(bp.type,{value:fe.toString(d)}))}),onError:dr.event,onClose:Je.event,onUnhandledNotification:Qt.event,onDispose:$.event,end:()=>{e.end()},dispose:()=>{if(N())return;ye=kr.Disposed,$.fire(void 0);let d=new K.ResponseError(K.ErrorCodes.PendingResponseRejected,"Pending response rejected since connection got disposed");for(let v of G.values())v.reject(d);G=new Map,b=new Map,M=new Set,k=new Ey.LinkedMap,Fe.func(e.dispose)&&e.dispose(),Fe.func(t.dispose)&&t.dispose()},listen:()=>{Ws(),ev(),ye=kr.Listening,t.listen(js)},inspect:()=>{(0,vy.default)().console.log("inspect")}};return vi.onNotification(Sl.type,d=>{if(E===fe.Off||!F)return;let v=E===fe.Verbose||E===fe.Compact;F.log(d.message,v?d.verbose:void 0)}),vi.onNotification(ho.type,d=>{let v=g.get(d.token);v?v(d.value):Kt.fire(d)}),vi}J.createMessageConnection=o$});var _l=X(R=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});R.ProgressType=R.ProgressToken=R.createMessageConnection=R.NullLogger=R.ConnectionOptions=R.ConnectionStrategy=R.AbstractMessageBuffer=R.WriteableStreamMessageWriter=R.AbstractMessageWriter=R.MessageWriter=R.ReadableStreamMessageReader=R.AbstractMessageReader=R.MessageReader=R.SharedArrayReceiverStrategy=R.SharedArraySenderStrategy=R.CancellationToken=R.CancellationTokenSource=R.Emitter=R.Event=R.Disposable=R.LRUCache=R.Touch=R.LinkedMap=R.ParameterStructures=R.NotificationType9=R.NotificationType8=R.NotificationType7=R.NotificationType6=R.NotificationType5=R.NotificationType4=R.NotificationType3=R.NotificationType2=R.NotificationType1=R.NotificationType0=R.NotificationType=R.ErrorCodes=R.ResponseError=R.RequestType9=R.RequestType8=R.RequestType7=R.RequestType6=R.RequestType5=R.RequestType4=R.RequestType3=R.RequestType2=R.RequestType1=R.RequestType0=R.RequestType=R.Message=R.RAL=void 0;R.MessageStrategy=R.CancellationStrategy=R.CancellationSenderStrategy=R.CancellationReceiverStrategy=R.ConnectionError=R.ConnectionErrors=R.LogTraceNotification=R.SetTraceNotification=R.TraceFormat=R.TraceValues=R.Trace=void 0;var Se=dp();Object.defineProperty(R,"Message",{enumerable:!0,get:function(){return Se.Message}});Object.defineProperty(R,"RequestType",{enumerable:!0,get:function(){return Se.RequestType}});Object.defineProperty(R,"RequestType0",{enumerable:!0,get:function(){return Se.RequestType0}});Object.defineProperty(R,"RequestType1",{enumerable:!0,get:function(){return Se.RequestType1}});Object.defineProperty(R,"RequestType2",{enumerable:!0,get:function(){return Se.RequestType2}});Object.defineProperty(R,"RequestType3",{enumerable:!0,get:function(){return Se.RequestType3}});Object.defineProperty(R,"RequestType4",{enumerable:!0,get:function(){return Se.RequestType4}});Object.defineProperty(R,"RequestType5",{enumerable:!0,get:function(){return Se.RequestType5}});Object.defineProperty(R,"RequestType6",{enumerable:!0,get:function(){return Se.RequestType6}});Object.defineProperty(R,"RequestType7",{enumerable:!0,get:function(){return Se.RequestType7}});Object.defineProperty(R,"RequestType8",{enumerable:!0,get:function(){return Se.RequestType8}});Object.defineProperty(R,"RequestType9",{enumerable:!0,get:function(){return Se.RequestType9}});Object.defineProperty(R,"ResponseError",{enumerable:!0,get:function(){return Se.ResponseError}});Object.defineProperty(R,"ErrorCodes",{enumerable:!0,get:function(){return Se.ErrorCodes}});Object.defineProperty(R,"NotificationType",{enumerable:!0,get:function(){return Se.NotificationType}});Object.defineProperty(R,"NotificationType0",{enumerable:!0,get:function(){return Se.NotificationType0}});Object.defineProperty(R,"NotificationType1",{enumerable:!0,get:function(){return Se.NotificationType1}});Object.defineProperty(R,"NotificationType2",{enumerable:!0,get:function(){return Se.NotificationType2}});Object.defineProperty(R,"NotificationType3",{enumerable:!0,get:function(){return Se.NotificationType3}});Object.defineProperty(R,"NotificationType4",{enumerable:!0,get:function(){return Se.NotificationType4}});Object.defineProperty(R,"NotificationType5",{enumerable:!0,get:function(){return Se.NotificationType5}});Object.defineProperty(R,"NotificationType6",{enumerable:!0,get:function(){return Se.NotificationType6}});Object.defineProperty(R,"NotificationType7",{enumerable:!0,get:function(){return Se.NotificationType7}});Object.defineProperty(R,"NotificationType8",{enumerable:!0,get:function(){return Se.NotificationType8}});Object.defineProperty(R,"NotificationType9",{enumerable:!0,get:function(){return Se.NotificationType9}});Object.defineProperty(R,"ParameterStructures",{enumerable:!0,get:function(){return Se.ParameterStructures}});var Lp=hp();Object.defineProperty(R,"LinkedMap",{enumerable:!0,get:function(){return Lp.LinkedMap}});Object.defineProperty(R,"LRUCache",{enumerable:!0,get:function(){return Lp.LRUCache}});Object.defineProperty(R,"Touch",{enumerable:!0,get:function(){return Lp.Touch}});var c$=fy();Object.defineProperty(R,"Disposable",{enumerable:!0,get:function(){return c$.Disposable}});var ky=ci();Object.defineProperty(R,"Event",{enumerable:!0,get:function(){return ky.Event}});Object.defineProperty(R,"Emitter",{enumerable:!0,get:function(){return ky.Emitter}});var Ny=Ka();Object.defineProperty(R,"CancellationTokenSource",{enumerable:!0,get:function(){return Ny.CancellationTokenSource}});Object.defineProperty(R,"CancellationToken",{enumerable:!0,get:function(){return Ny.CancellationToken}});var Cy=dy();Object.defineProperty(R,"SharedArraySenderStrategy",{enumerable:!0,get:function(){return Cy.SharedArraySenderStrategy}});Object.defineProperty(R,"SharedArrayReceiverStrategy",{enumerable:!0,get:function(){return Cy.SharedArrayReceiverStrategy}});var Dp=hy();Object.defineProperty(R,"MessageReader",{enumerable:!0,get:function(){return Dp.MessageReader}});Object.defineProperty(R,"AbstractMessageReader",{enumerable:!0,get:function(){return Dp.AbstractMessageReader}});Object.defineProperty(R,"ReadableStreamMessageReader",{enumerable:!0,get:function(){return Dp.ReadableStreamMessageReader}});var Mp=Ry();Object.defineProperty(R,"MessageWriter",{enumerable:!0,get:function(){return Mp.MessageWriter}});Object.defineProperty(R,"AbstractMessageWriter",{enumerable:!0,get:function(){return Mp.AbstractMessageWriter}});Object.defineProperty(R,"WriteableStreamMessageWriter",{enumerable:!0,get:function(){return Mp.WriteableStreamMessageWriter}});var l$=xy();Object.defineProperty(R,"AbstractMessageBuffer",{enumerable:!0,get:function(){return l$.AbstractMessageBuffer}});var ut=Sy();Object.defineProperty(R,"ConnectionStrategy",{enumerable:!0,get:function(){return ut.ConnectionStrategy}});Object.defineProperty(R,"ConnectionOptions",{enumerable:!0,get:function(){return ut.ConnectionOptions}});Object.defineProperty(R,"NullLogger",{enumerable:!0,get:function(){return ut.NullLogger}});Object.defineProperty(R,"createMessageConnection",{enumerable:!0,get:function(){return ut.createMessageConnection}});Object.defineProperty(R,"ProgressToken",{enumerable:!0,get:function(){return ut.ProgressToken}});Object.defineProperty(R,"ProgressType",{enumerable:!0,get:function(){return ut.ProgressType}});Object.defineProperty(R,"Trace",{enumerable:!0,get:function(){return ut.Trace}});Object.defineProperty(R,"TraceValues",{enumerable:!0,get:function(){return ut.TraceValues}});Object.defineProperty(R,"TraceFormat",{enumerable:!0,get:function(){return ut.TraceFormat}});Object.defineProperty(R,"SetTraceNotification",{enumerable:!0,get:function(){return ut.SetTraceNotification}});Object.defineProperty(R,"LogTraceNotification",{enumerable:!0,get:function(){return ut.LogTraceNotification}});Object.defineProperty(R,"ConnectionErrors",{enumerable:!0,get:function(){return ut.ConnectionErrors}});Object.defineProperty(R,"ConnectionError",{enumerable:!0,get:function(){return ut.ConnectionError}});Object.defineProperty(R,"CancellationReceiverStrategy",{enumerable:!0,get:function(){return ut.CancellationReceiverStrategy}});Object.defineProperty(R,"CancellationSenderStrategy",{enumerable:!0,get:function(){return ut.CancellationSenderStrategy}});Object.defineProperty(R,"CancellationStrategy",{enumerable:!0,get:function(){return ut.CancellationStrategy}});Object.defineProperty(R,"MessageStrategy",{enumerable:!0,get:function(){return ut.MessageStrategy}});var u$=Rn();R.RAL=u$.default});var Iy=X(qp=>{"use strict";Object.defineProperty(qp,"__esModule",{value:!0});var Nr=_l(),bl=class t extends Nr.AbstractMessageBuffer{constructor(e="utf-8"){super(e),this.asciiDecoder=new TextDecoder("ascii")}emptyBuffer(){return t.emptyBuffer}fromString(e,r){return new TextEncoder().encode(e)}toString(e,r){return r==="ascii"?this.asciiDecoder.decode(e):new TextDecoder(r).decode(e)}asNative(e,r){return r===void 0?e:e.slice(0,r)}allocNative(e){return new Uint8Array(e)}};bl.emptyBuffer=new Uint8Array(0);var Fp=class{constructor(e){this.socket=e,this._onData=new Nr.Emitter,this._messageListener=r=>{r.data.arrayBuffer().then(i=>{this._onData.fire(new Uint8Array(i))},()=>{(0,Nr.RAL)().console.error("Converting blob to array buffer failed.")})},this.socket.addEventListener("message",this._messageListener)}onClose(e){return this.socket.addEventListener("close",e),Nr.Disposable.create(()=>this.socket.removeEventListener("close",e))}onError(e){return this.socket.addEventListener("error",e),Nr.Disposable.create(()=>this.socket.removeEventListener("error",e))}onEnd(e){return this.socket.addEventListener("end",e),Nr.Disposable.create(()=>this.socket.removeEventListener("end",e))}onData(e){return this._onData.event(e)}},Gp=class{constructor(e){this.socket=e}onClose(e){return this.socket.addEventListener("close",e),Nr.Disposable.create(()=>this.socket.removeEventListener("close",e))}onError(e){return this.socket.addEventListener("error",e),Nr.Disposable.create(()=>this.socket.removeEventListener("error",e))}onEnd(e){return this.socket.addEventListener("end",e),Nr.Disposable.create(()=>this.socket.removeEventListener("end",e))}write(e,r){if(typeof e=="string"){if(r!==void 0&&r!=="utf-8")throw new Error(`In a Browser environments only utf-8 text encoding is supported. But got encoding: ${r}`);this.socket.send(e)}else this.socket.send(e);return Promise.resolve()}end(){this.socket.close()}},f$=new TextEncoder,wy=Object.freeze({messageBuffer:Object.freeze({create:t=>new bl(t)}),applicationJson:Object.freeze({encoder:Object.freeze({name:"application/json",encode:(t,e)=>{if(e.charset!=="utf-8")throw new Error(`In a Browser environments only utf-8 text encoding is supported. But got encoding: ${e.charset}`);return Promise.resolve(f$.encode(JSON.stringify(t,void 0,0)))}}),decoder:Object.freeze({name:"application/json",decode:(t,e)=>{if(!(t instanceof Uint8Array))throw new Error("In a Browser environments only Uint8Arrays are supported.");return Promise.resolve(JSON.parse(new TextDecoder(e.charset).decode(t)))}})}),stream:Object.freeze({asReadableStream:t=>new Fp(t),asWritableStream:t=>new Gp(t)}),console,timer:Object.freeze({setTimeout(t,e,...r){let n=setTimeout(t,e,...r);return{dispose:()=>clearTimeout(n)}},setImmediate(t,...e){let r=setTimeout(t,0,...e);return{dispose:()=>clearTimeout(r)}},setInterval(t,e,...r){let n=setInterval(t,e,...r);return{dispose:()=>clearInterval(n)}}})});function Up(){return wy}(function(t){function e(){Nr.RAL.install(wy)}t.install=e})(Up||(Up={}));qp.default=Up});var hi=X(Vt=>{"use strict";var d$=Vt&&Vt.__createBinding||(Object.create?function(t,e,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,i)}:function(t,e,r,n){n===void 0&&(n=r),t[n]=e[r]}),p$=Vt&&Vt.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&d$(e,t,r)};Object.defineProperty(Vt,"__esModule",{value:!0});Vt.createMessageConnection=Vt.BrowserMessageWriter=Vt.BrowserMessageReader=void 0;var h$=Iy();h$.default.install();var vs=_l();p$(_l(),Vt);var zp=class extends vs.AbstractMessageReader{constructor(e){super(),this._onData=new vs.Emitter,this._messageListener=r=>{this._onData.fire(r.data)},e.addEventListener("error",r=>this.fireError(r)),e.onmessage=this._messageListener}listen(e){return this._onData.event(e)}};Vt.BrowserMessageReader=zp;var jp=class extends vs.AbstractMessageWriter{constructor(e){super(),this.port=e,this.errorCount=0,e.addEventListener("error",r=>this.fireError(r))}write(e){try{return this.port.postMessage(e),Promise.resolve()}catch(r){return this.handleError(r,e),Promise.reject(r)}}handleError(e,r){this.errorCount++,this.fireError(e,r,this.errorCount)}end(){}};Vt.BrowserMessageWriter=jp;function m$(t,e,r,n){return r===void 0&&(r=vs.NullLogger),vs.ConnectionStrategy.is(n)&&(n={connectionStrategy:n}),(0,vs.createMessageConnection)(t,e,r,n)}Vt.createMessageConnection=m$});var Bp=X((eP,_y)=>{"use strict";_y.exports=hi()});var _e=X(Dt=>{"use strict";Object.defineProperty(Dt,"__esModule",{value:!0});Dt.ProtocolNotificationType=Dt.ProtocolNotificationType0=Dt.ProtocolRequestType=Dt.ProtocolRequestType0=Dt.RegistrationType=Dt.MessageDirection=void 0;var Es=hi(),by=(function(t){return t.clientToServer="clientToServer",t.serverToClient="serverToClient",t.both="both",t})(by||(Dt.MessageDirection=by={})),Wp=class{constructor(e){this.method=e}};Dt.RegistrationType=Wp;var Vp=class extends Es.RequestType0{constructor(e){super(e)}};Dt.ProtocolRequestType0=Vp;var Kp=class extends Es.RequestType{constructor(e){super(e,Es.ParameterStructures.byName)}};Dt.ProtocolRequestType=Kp;var Hp=class extends Es.NotificationType0{constructor(e){super(e)}};Dt.ProtocolNotificationType0=Hp;var Yp=class extends Es.NotificationType{constructor(e){super(e,Es.ParameterStructures.byName)}};Dt.ProtocolNotificationType=Yp});var Pl=X(Xe=>{"use strict";Object.defineProperty(Xe,"__esModule",{value:!0});Xe.objectLiteral=Xe.typedArray=Xe.stringArray=Xe.array=Xe.func=Xe.error=Xe.number=Xe.string=Xe.boolean=void 0;function g$(t){return t===!0||t===!1}Xe.boolean=g$;function Py(t){return typeof t=="string"||t instanceof String}Xe.string=Py;function y$(t){return typeof t=="number"||t instanceof Number}Xe.number=y$;function T$(t){return t instanceof Error}Xe.error=T$;function R$(t){return typeof t=="function"}Xe.func=R$;function Oy(t){return Array.isArray(t)}Xe.array=Oy;function x$(t){return Oy(t)&&t.every(e=>Py(e))}Xe.stringArray=x$;function v$(t,e){return Array.isArray(t)&&t.every(e)}Xe.typedArray=v$;function E$(t){return t!==null&&typeof t=="object"}Xe.objectLiteral=E$});var My=X(Ol=>{"use strict";Object.defineProperty(Ol,"__esModule",{value:!0});Ol.ImplementationRequest=void 0;var Ly=_e(),Dy;(function(t){t.method="textDocument/implementation",t.messageDirection=Ly.MessageDirection.clientToServer,t.type=new Ly.ProtocolRequestType(t.method)})(Dy||(Ol.ImplementationRequest=Dy={}))});var Uy=X(Ll=>{"use strict";Object.defineProperty(Ll,"__esModule",{value:!0});Ll.TypeDefinitionRequest=void 0;var Fy=_e(),Gy;(function(t){t.method="textDocument/typeDefinition",t.messageDirection=Fy.MessageDirection.clientToServer,t.type=new Fy.ProtocolRequestType(t.method)})(Gy||(Ll.TypeDefinitionRequest=Gy={}))});var jy=X(As=>{"use strict";Object.defineProperty(As,"__esModule",{value:!0});As.DidChangeWorkspaceFoldersNotification=As.WorkspaceFoldersRequest=void 0;var Dl=_e(),qy;(function(t){t.method="workspace/workspaceFolders",t.messageDirection=Dl.MessageDirection.serverToClient,t.type=new Dl.ProtocolRequestType0(t.method)})(qy||(As.WorkspaceFoldersRequest=qy={}));var zy;(function(t){t.method="workspace/didChangeWorkspaceFolders",t.messageDirection=Dl.MessageDirection.clientToServer,t.type=new Dl.ProtocolNotificationType(t.method)})(zy||(As.DidChangeWorkspaceFoldersNotification=zy={}))});var Vy=X(Ml=>{"use strict";Object.defineProperty(Ml,"__esModule",{value:!0});Ml.ConfigurationRequest=void 0;var By=_e(),Wy;(function(t){t.method="workspace/configuration",t.messageDirection=By.MessageDirection.serverToClient,t.type=new By.ProtocolRequestType(t.method)})(Wy||(Ml.ConfigurationRequest=Wy={}))});var Yy=X($s=>{"use strict";Object.defineProperty($s,"__esModule",{value:!0});$s.ColorPresentationRequest=$s.DocumentColorRequest=void 0;var Fl=_e(),Ky;(function(t){t.method="textDocument/documentColor",t.messageDirection=Fl.MessageDirection.clientToServer,t.type=new Fl.ProtocolRequestType(t.method)})(Ky||($s.DocumentColorRequest=Ky={}));var Hy;(function(t){t.method="textDocument/colorPresentation",t.messageDirection=Fl.MessageDirection.clientToServer,t.type=new Fl.ProtocolRequestType(t.method)})(Hy||($s.ColorPresentationRequest=Hy={}))});var Qy=X(Ss=>{"use strict";Object.defineProperty(Ss,"__esModule",{value:!0});Ss.FoldingRangeRefreshRequest=Ss.FoldingRangeRequest=void 0;var Gl=_e(),Xy;(function(t){t.method="textDocument/foldingRange",t.messageDirection=Gl.MessageDirection.clientToServer,t.type=new Gl.ProtocolRequestType(t.method)})(Xy||(Ss.FoldingRangeRequest=Xy={}));var Jy;(function(t){t.method="workspace/foldingRange/refresh",t.messageDirection=Gl.MessageDirection.serverToClient,t.type=new Gl.ProtocolRequestType0(t.method)})(Jy||(Ss.FoldingRangeRefreshRequest=Jy={}))});var tT=X(Ul=>{"use strict";Object.defineProperty(Ul,"__esModule",{value:!0});Ul.DeclarationRequest=void 0;var Zy=_e(),eT;(function(t){t.method="textDocument/declaration",t.messageDirection=Zy.MessageDirection.clientToServer,t.type=new Zy.ProtocolRequestType(t.method)})(eT||(Ul.DeclarationRequest=eT={}))});var iT=X(ql=>{"use strict";Object.defineProperty(ql,"__esModule",{value:!0});ql.SelectionRangeRequest=void 0;var rT=_e(),nT;(function(t){t.method="textDocument/selectionRange",t.messageDirection=rT.MessageDirection.clientToServer,t.type=new rT.ProtocolRequestType(t.method)})(nT||(ql.SelectionRangeRequest=nT={}))});var cT=X(An=>{"use strict";Object.defineProperty(An,"__esModule",{value:!0});An.WorkDoneProgressCancelNotification=An.WorkDoneProgressCreateRequest=An.WorkDoneProgress=void 0;var A$=hi(),zl=_e(),sT;(function(t){t.type=new A$.ProgressType;function e(r){return r===t.type}t.is=e})(sT||(An.WorkDoneProgress=sT={}));var aT;(function(t){t.method="window/workDoneProgress/create",t.messageDirection=zl.MessageDirection.serverToClient,t.type=new zl.ProtocolRequestType(t.method)})(aT||(An.WorkDoneProgressCreateRequest=aT={}));var oT;(function(t){t.method="window/workDoneProgress/cancel",t.messageDirection=zl.MessageDirection.clientToServer,t.type=new zl.ProtocolNotificationType(t.method)})(oT||(An.WorkDoneProgressCancelNotification=oT={}))});var dT=X($n=>{"use strict";Object.defineProperty($n,"__esModule",{value:!0});$n.CallHierarchyOutgoingCallsRequest=$n.CallHierarchyIncomingCallsRequest=$n.CallHierarchyPrepareRequest=void 0;var ks=_e(),lT;(function(t){t.method="textDocument/prepareCallHierarchy",t.messageDirection=ks.MessageDirection.clientToServer,t.type=new ks.ProtocolRequestType(t.method)})(lT||($n.CallHierarchyPrepareRequest=lT={}));var uT;(function(t){t.method="callHierarchy/incomingCalls",t.messageDirection=ks.MessageDirection.clientToServer,t.type=new ks.ProtocolRequestType(t.method)})(uT||($n.CallHierarchyIncomingCallsRequest=uT={}));var fT;(function(t){t.method="callHierarchy/outgoingCalls",t.messageDirection=ks.MessageDirection.clientToServer,t.type=new ks.ProtocolRequestType(t.method)})(fT||($n.CallHierarchyOutgoingCallsRequest=fT={}))});var TT=X(Mt=>{"use strict";Object.defineProperty(Mt,"__esModule",{value:!0});Mt.SemanticTokensRefreshRequest=Mt.SemanticTokensRangeRequest=Mt.SemanticTokensDeltaRequest=Mt.SemanticTokensRequest=Mt.SemanticTokensRegistrationType=Mt.TokenFormat=void 0;var Qr=_e(),pT=(function(t){return t.Relative="relative",t})(pT||(Mt.TokenFormat=pT={})),yo;(function(t){t.method="textDocument/semanticTokens",t.type=new Qr.RegistrationType(t.method)})(yo||(Mt.SemanticTokensRegistrationType=yo={}));var hT;(function(t){t.method="textDocument/semanticTokens/full",t.messageDirection=Qr.MessageDirection.clientToServer,t.type=new Qr.ProtocolRequestType(t.method),t.registrationMethod=yo.method})(hT||(Mt.SemanticTokensRequest=hT={}));var mT;(function(t){t.method="textDocument/semanticTokens/full/delta",t.messageDirection=Qr.MessageDirection.clientToServer,t.type=new Qr.ProtocolRequestType(t.method),t.registrationMethod=yo.method})(mT||(Mt.SemanticTokensDeltaRequest=mT={}));var gT;(function(t){t.method="textDocument/semanticTokens/range",t.messageDirection=Qr.MessageDirection.clientToServer,t.type=new Qr.ProtocolRequestType(t.method),t.registrationMethod=yo.method})(gT||(Mt.SemanticTokensRangeRequest=gT={}));var yT;(function(t){t.method="workspace/semanticTokens/refresh",t.messageDirection=Qr.MessageDirection.serverToClient,t.type=new Qr.ProtocolRequestType0(t.method)})(yT||(Mt.SemanticTokensRefreshRequest=yT={}))});var vT=X(jl=>{"use strict";Object.defineProperty(jl,"__esModule",{value:!0});jl.ShowDocumentRequest=void 0;var RT=_e(),xT;(function(t){t.method="window/showDocument",t.messageDirection=RT.MessageDirection.serverToClient,t.type=new RT.ProtocolRequestType(t.method)})(xT||(jl.ShowDocumentRequest=xT={}))});var $T=X(Bl=>{"use strict";Object.defineProperty(Bl,"__esModule",{value:!0});Bl.LinkedEditingRangeRequest=void 0;var ET=_e(),AT;(function(t){t.method="textDocument/linkedEditingRange",t.messageDirection=ET.MessageDirection.clientToServer,t.type=new ET.ProtocolRequestType(t.method)})(AT||(Bl.LinkedEditingRangeRequest=AT={}))});var bT=X(vt=>{"use strict";Object.defineProperty(vt,"__esModule",{value:!0});vt.WillDeleteFilesRequest=vt.DidDeleteFilesNotification=vt.DidRenameFilesNotification=vt.WillRenameFilesRequest=vt.DidCreateFilesNotification=vt.WillCreateFilesRequest=vt.FileOperationPatternKind=void 0;var Xt=_e(),ST=(function(t){return t.file="file",t.folder="folder",t})(ST||(vt.FileOperationPatternKind=ST={})),kT;(function(t){t.method="workspace/willCreateFiles",t.messageDirection=Xt.MessageDirection.clientToServer,t.type=new Xt.ProtocolRequestType(t.method)})(kT||(vt.WillCreateFilesRequest=kT={}));var NT;(function(t){t.method="workspace/didCreateFiles",t.messageDirection=Xt.MessageDirection.clientToServer,t.type=new Xt.ProtocolNotificationType(t.method)})(NT||(vt.DidCreateFilesNotification=NT={}));var CT;(function(t){t.method="workspace/willRenameFiles",t.messageDirection=Xt.MessageDirection.clientToServer,t.type=new Xt.ProtocolRequestType(t.method)})(CT||(vt.WillRenameFilesRequest=CT={}));var wT;(function(t){t.method="workspace/didRenameFiles",t.messageDirection=Xt.MessageDirection.clientToServer,t.type=new Xt.ProtocolNotificationType(t.method)})(wT||(vt.DidRenameFilesNotification=wT={}));var IT;(function(t){t.method="workspace/didDeleteFiles",t.messageDirection=Xt.MessageDirection.clientToServer,t.type=new Xt.ProtocolNotificationType(t.method)})(IT||(vt.DidDeleteFilesNotification=IT={}));var _T;(function(t){t.method="workspace/willDeleteFiles",t.messageDirection=Xt.MessageDirection.clientToServer,t.type=new Xt.ProtocolRequestType(t.method)})(_T||(vt.WillDeleteFilesRequest=_T={}))});var MT=X(Sn=>{"use strict";Object.defineProperty(Sn,"__esModule",{value:!0});Sn.MonikerRequest=Sn.MonikerKind=Sn.UniquenessLevel=void 0;var PT=_e(),OT=(function(t){return t.document="document",t.project="project",t.group="group",t.scheme="scheme",t.global="global",t})(OT||(Sn.UniquenessLevel=OT={})),LT=(function(t){return t.$import="import",t.$export="export",t.local="local",t})(LT||(Sn.MonikerKind=LT={})),DT;(function(t){t.method="textDocument/moniker",t.messageDirection=PT.MessageDirection.clientToServer,t.type=new PT.ProtocolRequestType(t.method)})(DT||(Sn.MonikerRequest=DT={}))});var qT=X(kn=>{"use strict";Object.defineProperty(kn,"__esModule",{value:!0});kn.TypeHierarchySubtypesRequest=kn.TypeHierarchySupertypesRequest=kn.TypeHierarchyPrepareRequest=void 0;var Ns=_e(),FT;(function(t){t.method="textDocument/prepareTypeHierarchy",t.messageDirection=Ns.MessageDirection.clientToServer,t.type=new Ns.ProtocolRequestType(t.method)})(FT||(kn.TypeHierarchyPrepareRequest=FT={}));var GT;(function(t){t.method="typeHierarchy/supertypes",t.messageDirection=Ns.MessageDirection.clientToServer,t.type=new Ns.ProtocolRequestType(t.method)})(GT||(kn.TypeHierarchySupertypesRequest=GT={}));var UT;(function(t){t.method="typeHierarchy/subtypes",t.messageDirection=Ns.MessageDirection.clientToServer,t.type=new Ns.ProtocolRequestType(t.method)})(UT||(kn.TypeHierarchySubtypesRequest=UT={}))});var BT=X(Cs=>{"use strict";Object.defineProperty(Cs,"__esModule",{value:!0});Cs.InlineValueRefreshRequest=Cs.InlineValueRequest=void 0;var Wl=_e(),zT;(function(t){t.method="textDocument/inlineValue",t.messageDirection=Wl.MessageDirection.clientToServer,t.type=new Wl.ProtocolRequestType(t.method)})(zT||(Cs.InlineValueRequest=zT={}));var jT;(function(t){t.method="workspace/inlineValue/refresh",t.messageDirection=Wl.MessageDirection.serverToClient,t.type=new Wl.ProtocolRequestType0(t.method)})(jT||(Cs.InlineValueRefreshRequest=jT={}))});var HT=X(Nn=>{"use strict";Object.defineProperty(Nn,"__esModule",{value:!0});Nn.InlayHintRefreshRequest=Nn.InlayHintResolveRequest=Nn.InlayHintRequest=void 0;var ws=_e(),WT;(function(t){t.method="textDocument/inlayHint",t.messageDirection=ws.MessageDirection.clientToServer,t.type=new ws.ProtocolRequestType(t.method)})(WT||(Nn.InlayHintRequest=WT={}));var VT;(function(t){t.method="inlayHint/resolve",t.messageDirection=ws.MessageDirection.clientToServer,t.type=new ws.ProtocolRequestType(t.method)})(VT||(Nn.InlayHintResolveRequest=VT={}));var KT;(function(t){t.method="workspace/inlayHint/refresh",t.messageDirection=ws.MessageDirection.serverToClient,t.type=new ws.ProtocolRequestType0(t.method)})(KT||(Nn.InlayHintRefreshRequest=KT={}))});var tR=X(Jt=>{"use strict";Object.defineProperty(Jt,"__esModule",{value:!0});Jt.DiagnosticRefreshRequest=Jt.WorkspaceDiagnosticRequest=Jt.DocumentDiagnosticRequest=Jt.DocumentDiagnosticReportKind=Jt.DiagnosticServerCancellationData=void 0;var eR=hi(),$$=Pl(),Is=_e(),YT;(function(t){function e(r){let n=r;return n&&$$.boolean(n.retriggerRequest)}t.is=e})(YT||(Jt.DiagnosticServerCancellationData=YT={}));var XT=(function(t){return t.Full="full",t.Unchanged="unchanged",t})(XT||(Jt.DocumentDiagnosticReportKind=XT={})),JT;(function(t){t.method="textDocument/diagnostic",t.messageDirection=Is.MessageDirection.clientToServer,t.type=new Is.ProtocolRequestType(t.method),t.partialResult=new eR.ProgressType})(JT||(Jt.DocumentDiagnosticRequest=JT={}));var QT;(function(t){t.method="workspace/diagnostic",t.messageDirection=Is.MessageDirection.clientToServer,t.type=new Is.ProtocolRequestType(t.method),t.partialResult=new eR.ProgressType})(QT||(Jt.WorkspaceDiagnosticRequest=QT={}));var ZT;(function(t){t.method="workspace/diagnostic/refresh",t.messageDirection=Is.MessageDirection.serverToClient,t.type=new Is.ProtocolRequestType0(t.method)})(ZT||(Jt.DiagnosticRefreshRequest=ZT={}))});var cR=X(ze=>{"use strict";Object.defineProperty(ze,"__esModule",{value:!0});ze.DidCloseNotebookDocumentNotification=ze.DidSaveNotebookDocumentNotification=ze.DidChangeNotebookDocumentNotification=ze.NotebookCellArrayChange=ze.DidOpenNotebookDocumentNotification=ze.NotebookDocumentSyncRegistrationType=ze.NotebookDocument=ze.NotebookCell=ze.ExecutionSummary=ze.NotebookCellKind=void 0;var To=(as(),pu(il)),ur=Pl(),Cr=_e(),Xp;(function(t){t.Markup=1,t.Code=2;function e(r){return r===1||r===2}t.is=e})(Xp||(ze.NotebookCellKind=Xp={}));var Jp;(function(t){function e(i,s){let a={executionOrder:i};return(s===!0||s===!1)&&(a.success=s),a}t.create=e;function r(i){let s=i;return ur.objectLiteral(s)&&To.uinteger.is(s.executionOrder)&&(s.success===void 0||ur.boolean(s.success))}t.is=r;function n(i,s){return i===s?!0:i==null||s===null||s===void 0?!1:i.executionOrder===s.executionOrder&&i.success===s.success}t.equals=n})(Jp||(ze.ExecutionSummary=Jp={}));var Vl;(function(t){function e(s,a){return{kind:s,document:a}}t.create=e;function r(s){let a=s;return ur.objectLiteral(a)&&Xp.is(a.kind)&&To.DocumentUri.is(a.document)&&(a.metadata===void 0||ur.objectLiteral(a.metadata))}t.is=r;function n(s,a){let o=new Set;return s.document!==a.document&&o.add("document"),s.kind!==a.kind&&o.add("kind"),s.executionSummary!==a.executionSummary&&o.add("executionSummary"),(s.metadata!==void 0||a.metadata!==void 0)&&!i(s.metadata,a.metadata)&&o.add("metadata"),(s.executionSummary!==void 0||a.executionSummary!==void 0)&&!Jp.equals(s.executionSummary,a.executionSummary)&&o.add("executionSummary"),o}t.diff=n;function i(s,a){if(s===a)return!0;if(s==null||a===null||a===void 0||typeof s!=typeof a||typeof s!="object")return!1;let o=Array.isArray(s),c=Array.isArray(a);if(o!==c)return!1;if(o&&c){if(s.length!==a.length)return!1;for(let l=0;l{"use strict";Object.defineProperty(Kl,"__esModule",{value:!0});Kl.InlineCompletionRequest=void 0;var lR=_e(),uR;(function(t){t.method="textDocument/inlineCompletion",t.messageDirection=lR.MessageDirection.clientToServer,t.type=new lR.ProtocolRequestType(t.method)})(uR||(Kl.InlineCompletionRequest=uR={}))});var $x=X(f=>{"use strict";Object.defineProperty(f,"__esModule",{value:!0});f.WorkspaceSymbolRequest=f.CodeActionResolveRequest=f.CodeActionRequest=f.DocumentSymbolRequest=f.DocumentHighlightRequest=f.ReferencesRequest=f.DefinitionRequest=f.SignatureHelpRequest=f.SignatureHelpTriggerKind=f.HoverRequest=f.CompletionResolveRequest=f.CompletionRequest=f.CompletionTriggerKind=f.PublishDiagnosticsNotification=f.WatchKind=f.RelativePattern=f.FileChangeType=f.DidChangeWatchedFilesNotification=f.WillSaveTextDocumentWaitUntilRequest=f.WillSaveTextDocumentNotification=f.TextDocumentSaveReason=f.DidSaveTextDocumentNotification=f.DidCloseTextDocumentNotification=f.DidChangeTextDocumentNotification=f.TextDocumentContentChangeEvent=f.DidOpenTextDocumentNotification=f.TextDocumentSyncKind=f.TelemetryEventNotification=f.LogMessageNotification=f.ShowMessageRequest=f.ShowMessageNotification=f.MessageType=f.DidChangeConfigurationNotification=f.ExitNotification=f.ShutdownRequest=f.InitializedNotification=f.InitializeErrorCodes=f.InitializeRequest=f.WorkDoneProgressOptions=f.TextDocumentRegistrationOptions=f.StaticRegistrationOptions=f.PositionEncodingKind=f.FailureHandlingKind=f.ResourceOperationKind=f.UnregistrationRequest=f.RegistrationRequest=f.DocumentSelector=f.NotebookCellTextDocumentFilter=f.NotebookDocumentFilter=f.TextDocumentFilter=void 0;f.MonikerRequest=f.MonikerKind=f.UniquenessLevel=f.WillDeleteFilesRequest=f.DidDeleteFilesNotification=f.WillRenameFilesRequest=f.DidRenameFilesNotification=f.WillCreateFilesRequest=f.DidCreateFilesNotification=f.FileOperationPatternKind=f.LinkedEditingRangeRequest=f.ShowDocumentRequest=f.SemanticTokensRegistrationType=f.SemanticTokensRefreshRequest=f.SemanticTokensRangeRequest=f.SemanticTokensDeltaRequest=f.SemanticTokensRequest=f.TokenFormat=f.CallHierarchyPrepareRequest=f.CallHierarchyOutgoingCallsRequest=f.CallHierarchyIncomingCallsRequest=f.WorkDoneProgressCancelNotification=f.WorkDoneProgressCreateRequest=f.WorkDoneProgress=f.SelectionRangeRequest=f.DeclarationRequest=f.FoldingRangeRefreshRequest=f.FoldingRangeRequest=f.ColorPresentationRequest=f.DocumentColorRequest=f.ConfigurationRequest=f.DidChangeWorkspaceFoldersNotification=f.WorkspaceFoldersRequest=f.TypeDefinitionRequest=f.ImplementationRequest=f.ApplyWorkspaceEditRequest=f.ExecuteCommandRequest=f.PrepareRenameRequest=f.RenameRequest=f.PrepareSupportDefaultBehavior=f.DocumentOnTypeFormattingRequest=f.DocumentRangesFormattingRequest=f.DocumentRangeFormattingRequest=f.DocumentFormattingRequest=f.DocumentLinkResolveRequest=f.DocumentLinkRequest=f.CodeLensRefreshRequest=f.CodeLensResolveRequest=f.CodeLensRequest=f.WorkspaceSymbolResolveRequest=void 0;f.InlineCompletionRequest=f.DidCloseNotebookDocumentNotification=f.DidSaveNotebookDocumentNotification=f.DidChangeNotebookDocumentNotification=f.NotebookCellArrayChange=f.DidOpenNotebookDocumentNotification=f.NotebookDocumentSyncRegistrationType=f.NotebookDocument=f.NotebookCell=f.ExecutionSummary=f.NotebookCellKind=f.DiagnosticRefreshRequest=f.WorkspaceDiagnosticRequest=f.DocumentDiagnosticRequest=f.DocumentDiagnosticReportKind=f.DiagnosticServerCancellationData=f.InlayHintRefreshRequest=f.InlayHintResolveRequest=f.InlayHintRequest=f.InlineValueRefreshRequest=f.InlineValueRequest=f.TypeHierarchySupertypesRequest=f.TypeHierarchySubtypesRequest=f.TypeHierarchyPrepareRequest=void 0;var S=_e(),dR=(as(),pu(il)),at=Pl(),S$=My();Object.defineProperty(f,"ImplementationRequest",{enumerable:!0,get:function(){return S$.ImplementationRequest}});var k$=Uy();Object.defineProperty(f,"TypeDefinitionRequest",{enumerable:!0,get:function(){return k$.TypeDefinitionRequest}});var xx=jy();Object.defineProperty(f,"WorkspaceFoldersRequest",{enumerable:!0,get:function(){return xx.WorkspaceFoldersRequest}});Object.defineProperty(f,"DidChangeWorkspaceFoldersNotification",{enumerable:!0,get:function(){return xx.DidChangeWorkspaceFoldersNotification}});var N$=Vy();Object.defineProperty(f,"ConfigurationRequest",{enumerable:!0,get:function(){return N$.ConfigurationRequest}});var vx=Yy();Object.defineProperty(f,"DocumentColorRequest",{enumerable:!0,get:function(){return vx.DocumentColorRequest}});Object.defineProperty(f,"ColorPresentationRequest",{enumerable:!0,get:function(){return vx.ColorPresentationRequest}});var Ex=Qy();Object.defineProperty(f,"FoldingRangeRequest",{enumerable:!0,get:function(){return Ex.FoldingRangeRequest}});Object.defineProperty(f,"FoldingRangeRefreshRequest",{enumerable:!0,get:function(){return Ex.FoldingRangeRefreshRequest}});var C$=tT();Object.defineProperty(f,"DeclarationRequest",{enumerable:!0,get:function(){return C$.DeclarationRequest}});var w$=iT();Object.defineProperty(f,"SelectionRangeRequest",{enumerable:!0,get:function(){return w$.SelectionRangeRequest}});var rh=cT();Object.defineProperty(f,"WorkDoneProgress",{enumerable:!0,get:function(){return rh.WorkDoneProgress}});Object.defineProperty(f,"WorkDoneProgressCreateRequest",{enumerable:!0,get:function(){return rh.WorkDoneProgressCreateRequest}});Object.defineProperty(f,"WorkDoneProgressCancelNotification",{enumerable:!0,get:function(){return rh.WorkDoneProgressCancelNotification}});var nh=dT();Object.defineProperty(f,"CallHierarchyIncomingCallsRequest",{enumerable:!0,get:function(){return nh.CallHierarchyIncomingCallsRequest}});Object.defineProperty(f,"CallHierarchyOutgoingCallsRequest",{enumerable:!0,get:function(){return nh.CallHierarchyOutgoingCallsRequest}});Object.defineProperty(f,"CallHierarchyPrepareRequest",{enumerable:!0,get:function(){return nh.CallHierarchyPrepareRequest}});var bs=TT();Object.defineProperty(f,"TokenFormat",{enumerable:!0,get:function(){return bs.TokenFormat}});Object.defineProperty(f,"SemanticTokensRequest",{enumerable:!0,get:function(){return bs.SemanticTokensRequest}});Object.defineProperty(f,"SemanticTokensDeltaRequest",{enumerable:!0,get:function(){return bs.SemanticTokensDeltaRequest}});Object.defineProperty(f,"SemanticTokensRangeRequest",{enumerable:!0,get:function(){return bs.SemanticTokensRangeRequest}});Object.defineProperty(f,"SemanticTokensRefreshRequest",{enumerable:!0,get:function(){return bs.SemanticTokensRefreshRequest}});Object.defineProperty(f,"SemanticTokensRegistrationType",{enumerable:!0,get:function(){return bs.SemanticTokensRegistrationType}});var I$=vT();Object.defineProperty(f,"ShowDocumentRequest",{enumerable:!0,get:function(){return I$.ShowDocumentRequest}});var _$=$T();Object.defineProperty(f,"LinkedEditingRangeRequest",{enumerable:!0,get:function(){return _$.LinkedEditingRangeRequest}});var mi=bT();Object.defineProperty(f,"FileOperationPatternKind",{enumerable:!0,get:function(){return mi.FileOperationPatternKind}});Object.defineProperty(f,"DidCreateFilesNotification",{enumerable:!0,get:function(){return mi.DidCreateFilesNotification}});Object.defineProperty(f,"WillCreateFilesRequest",{enumerable:!0,get:function(){return mi.WillCreateFilesRequest}});Object.defineProperty(f,"DidRenameFilesNotification",{enumerable:!0,get:function(){return mi.DidRenameFilesNotification}});Object.defineProperty(f,"WillRenameFilesRequest",{enumerable:!0,get:function(){return mi.WillRenameFilesRequest}});Object.defineProperty(f,"DidDeleteFilesNotification",{enumerable:!0,get:function(){return mi.DidDeleteFilesNotification}});Object.defineProperty(f,"WillDeleteFilesRequest",{enumerable:!0,get:function(){return mi.WillDeleteFilesRequest}});var ih=MT();Object.defineProperty(f,"UniquenessLevel",{enumerable:!0,get:function(){return ih.UniquenessLevel}});Object.defineProperty(f,"MonikerKind",{enumerable:!0,get:function(){return ih.MonikerKind}});Object.defineProperty(f,"MonikerRequest",{enumerable:!0,get:function(){return ih.MonikerRequest}});var sh=qT();Object.defineProperty(f,"TypeHierarchyPrepareRequest",{enumerable:!0,get:function(){return sh.TypeHierarchyPrepareRequest}});Object.defineProperty(f,"TypeHierarchySubtypesRequest",{enumerable:!0,get:function(){return sh.TypeHierarchySubtypesRequest}});Object.defineProperty(f,"TypeHierarchySupertypesRequest",{enumerable:!0,get:function(){return sh.TypeHierarchySupertypesRequest}});var Ax=BT();Object.defineProperty(f,"InlineValueRequest",{enumerable:!0,get:function(){return Ax.InlineValueRequest}});Object.defineProperty(f,"InlineValueRefreshRequest",{enumerable:!0,get:function(){return Ax.InlineValueRefreshRequest}});var ah=HT();Object.defineProperty(f,"InlayHintRequest",{enumerable:!0,get:function(){return ah.InlayHintRequest}});Object.defineProperty(f,"InlayHintResolveRequest",{enumerable:!0,get:function(){return ah.InlayHintResolveRequest}});Object.defineProperty(f,"InlayHintRefreshRequest",{enumerable:!0,get:function(){return ah.InlayHintRefreshRequest}});var Ro=tR();Object.defineProperty(f,"DiagnosticServerCancellationData",{enumerable:!0,get:function(){return Ro.DiagnosticServerCancellationData}});Object.defineProperty(f,"DocumentDiagnosticReportKind",{enumerable:!0,get:function(){return Ro.DocumentDiagnosticReportKind}});Object.defineProperty(f,"DocumentDiagnosticRequest",{enumerable:!0,get:function(){return Ro.DocumentDiagnosticRequest}});Object.defineProperty(f,"WorkspaceDiagnosticRequest",{enumerable:!0,get:function(){return Ro.WorkspaceDiagnosticRequest}});Object.defineProperty(f,"DiagnosticRefreshRequest",{enumerable:!0,get:function(){return Ro.DiagnosticRefreshRequest}});var wr=cR();Object.defineProperty(f,"NotebookCellKind",{enumerable:!0,get:function(){return wr.NotebookCellKind}});Object.defineProperty(f,"ExecutionSummary",{enumerable:!0,get:function(){return wr.ExecutionSummary}});Object.defineProperty(f,"NotebookCell",{enumerable:!0,get:function(){return wr.NotebookCell}});Object.defineProperty(f,"NotebookDocument",{enumerable:!0,get:function(){return wr.NotebookDocument}});Object.defineProperty(f,"NotebookDocumentSyncRegistrationType",{enumerable:!0,get:function(){return wr.NotebookDocumentSyncRegistrationType}});Object.defineProperty(f,"DidOpenNotebookDocumentNotification",{enumerable:!0,get:function(){return wr.DidOpenNotebookDocumentNotification}});Object.defineProperty(f,"NotebookCellArrayChange",{enumerable:!0,get:function(){return wr.NotebookCellArrayChange}});Object.defineProperty(f,"DidChangeNotebookDocumentNotification",{enumerable:!0,get:function(){return wr.DidChangeNotebookDocumentNotification}});Object.defineProperty(f,"DidSaveNotebookDocumentNotification",{enumerable:!0,get:function(){return wr.DidSaveNotebookDocumentNotification}});Object.defineProperty(f,"DidCloseNotebookDocumentNotification",{enumerable:!0,get:function(){return wr.DidCloseNotebookDocumentNotification}});var b$=fR();Object.defineProperty(f,"InlineCompletionRequest",{enumerable:!0,get:function(){return b$.InlineCompletionRequest}});var Qp;(function(t){function e(r){let n=r;return at.string(n)||at.string(n.language)||at.string(n.scheme)||at.string(n.pattern)}t.is=e})(Qp||(f.TextDocumentFilter=Qp={}));var Zp;(function(t){function e(r){let n=r;return at.objectLiteral(n)&&(at.string(n.notebookType)||at.string(n.scheme)||at.string(n.pattern))}t.is=e})(Zp||(f.NotebookDocumentFilter=Zp={}));var eh;(function(t){function e(r){let n=r;return at.objectLiteral(n)&&(at.string(n.notebook)||Zp.is(n.notebook))&&(n.language===void 0||at.string(n.language))}t.is=e})(eh||(f.NotebookCellTextDocumentFilter=eh={}));var th;(function(t){function e(r){if(!Array.isArray(r))return!1;for(let n of r)if(!at.string(n)&&!Qp.is(n)&&!eh.is(n))return!1;return!0}t.is=e})(th||(f.DocumentSelector=th={}));var pR;(function(t){t.method="client/registerCapability",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolRequestType(t.method)})(pR||(f.RegistrationRequest=pR={}));var hR;(function(t){t.method="client/unregisterCapability",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolRequestType(t.method)})(hR||(f.UnregistrationRequest=hR={}));var mR=(function(t){return t.Create="create",t.Rename="rename",t.Delete="delete",t})(mR||(f.ResourceOperationKind=mR={})),gR=(function(t){return t.Abort="abort",t.Transactional="transactional",t.TextOnlyTransactional="textOnlyTransactional",t.Undo="undo",t})(gR||(f.FailureHandlingKind=gR={})),yR=(function(t){return t.UTF8="utf-8",t.UTF16="utf-16",t.UTF32="utf-32",t})(yR||(f.PositionEncodingKind=yR={})),TR;(function(t){function e(r){let n=r;return n&&at.string(n.id)&&n.id.length>0}t.hasId=e})(TR||(f.StaticRegistrationOptions=TR={}));var RR;(function(t){function e(r){let n=r;return n&&(n.documentSelector===null||th.is(n.documentSelector))}t.is=e})(RR||(f.TextDocumentRegistrationOptions=RR={}));var xR;(function(t){function e(n){let i=n;return at.objectLiteral(i)&&(i.workDoneProgress===void 0||at.boolean(i.workDoneProgress))}t.is=e;function r(n){let i=n;return i&&at.boolean(i.workDoneProgress)}t.hasWorkDoneProgress=r})(xR||(f.WorkDoneProgressOptions=xR={}));var vR;(function(t){t.method="initialize",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(vR||(f.InitializeRequest=vR={}));var ER=(function(t){return t.unknownProtocolVersion=1,t})(ER||(f.InitializeErrorCodes=ER={})),AR;(function(t){t.method="initialized",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(AR||(f.InitializedNotification=AR={}));var $R;(function(t){t.method="shutdown",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType0(t.method)})($R||(f.ShutdownRequest=$R={}));var SR;(function(t){t.method="exit",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType0(t.method)})(SR||(f.ExitNotification=SR={}));var kR;(function(t){t.method="workspace/didChangeConfiguration",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(kR||(f.DidChangeConfigurationNotification=kR={}));var NR=(function(t){return t.Error=1,t.Warning=2,t.Info=3,t.Log=4,t.Debug=5,t})(NR||(f.MessageType=NR={})),CR;(function(t){t.method="window/showMessage",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolNotificationType(t.method)})(CR||(f.ShowMessageNotification=CR={}));var wR;(function(t){t.method="window/showMessageRequest",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolRequestType(t.method)})(wR||(f.ShowMessageRequest=wR={}));var IR;(function(t){t.method="window/logMessage",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolNotificationType(t.method)})(IR||(f.LogMessageNotification=IR={}));var _R;(function(t){t.method="telemetry/event",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolNotificationType(t.method)})(_R||(f.TelemetryEventNotification=_R={}));var bR=(function(t){return t.None=0,t.Full=1,t.Incremental=2,t})(bR||(f.TextDocumentSyncKind=bR={})),PR;(function(t){t.method="textDocument/didOpen",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(PR||(f.DidOpenTextDocumentNotification=PR={}));var OR;(function(t){function e(n){let i=n;return i!=null&&typeof i.text=="string"&&i.range!==void 0&&(i.rangeLength===void 0||typeof i.rangeLength=="number")}t.isIncremental=e;function r(n){let i=n;return i!=null&&typeof i.text=="string"&&i.range===void 0&&i.rangeLength===void 0}t.isFull=r})(OR||(f.TextDocumentContentChangeEvent=OR={}));var LR;(function(t){t.method="textDocument/didChange",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(LR||(f.DidChangeTextDocumentNotification=LR={}));var DR;(function(t){t.method="textDocument/didClose",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(DR||(f.DidCloseTextDocumentNotification=DR={}));var MR;(function(t){t.method="textDocument/didSave",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(MR||(f.DidSaveTextDocumentNotification=MR={}));var FR=(function(t){return t.Manual=1,t.AfterDelay=2,t.FocusOut=3,t})(FR||(f.TextDocumentSaveReason=FR={})),GR;(function(t){t.method="textDocument/willSave",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(GR||(f.WillSaveTextDocumentNotification=GR={}));var UR;(function(t){t.method="textDocument/willSaveWaitUntil",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(UR||(f.WillSaveTextDocumentWaitUntilRequest=UR={}));var qR;(function(t){t.method="workspace/didChangeWatchedFiles",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolNotificationType(t.method)})(qR||(f.DidChangeWatchedFilesNotification=qR={}));var zR=(function(t){return t.Created=1,t.Changed=2,t.Deleted=3,t})(zR||(f.FileChangeType=zR={})),jR;(function(t){function e(r){let n=r;return at.objectLiteral(n)&&(dR.URI.is(n.baseUri)||dR.WorkspaceFolder.is(n.baseUri))&&at.string(n.pattern)}t.is=e})(jR||(f.RelativePattern=jR={}));var BR=(function(t){return t.Create=1,t.Change=2,t.Delete=4,t})(BR||(f.WatchKind=BR={})),WR;(function(t){t.method="textDocument/publishDiagnostics",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolNotificationType(t.method)})(WR||(f.PublishDiagnosticsNotification=WR={}));var VR=(function(t){return t.Invoked=1,t.TriggerCharacter=2,t.TriggerForIncompleteCompletions=3,t})(VR||(f.CompletionTriggerKind=VR={})),KR;(function(t){t.method="textDocument/completion",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(KR||(f.CompletionRequest=KR={}));var HR;(function(t){t.method="completionItem/resolve",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(HR||(f.CompletionResolveRequest=HR={}));var YR;(function(t){t.method="textDocument/hover",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(YR||(f.HoverRequest=YR={}));var XR=(function(t){return t.Invoked=1,t.TriggerCharacter=2,t.ContentChange=3,t})(XR||(f.SignatureHelpTriggerKind=XR={})),JR;(function(t){t.method="textDocument/signatureHelp",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(JR||(f.SignatureHelpRequest=JR={}));var QR;(function(t){t.method="textDocument/definition",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(QR||(f.DefinitionRequest=QR={}));var ZR;(function(t){t.method="textDocument/references",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(ZR||(f.ReferencesRequest=ZR={}));var ex;(function(t){t.method="textDocument/documentHighlight",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(ex||(f.DocumentHighlightRequest=ex={}));var tx;(function(t){t.method="textDocument/documentSymbol",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(tx||(f.DocumentSymbolRequest=tx={}));var rx;(function(t){t.method="textDocument/codeAction",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(rx||(f.CodeActionRequest=rx={}));var nx;(function(t){t.method="codeAction/resolve",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(nx||(f.CodeActionResolveRequest=nx={}));var ix;(function(t){t.method="workspace/symbol",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(ix||(f.WorkspaceSymbolRequest=ix={}));var sx;(function(t){t.method="workspaceSymbol/resolve",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(sx||(f.WorkspaceSymbolResolveRequest=sx={}));var ax;(function(t){t.method="textDocument/codeLens",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(ax||(f.CodeLensRequest=ax={}));var ox;(function(t){t.method="codeLens/resolve",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(ox||(f.CodeLensResolveRequest=ox={}));var cx;(function(t){t.method="workspace/codeLens/refresh",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolRequestType0(t.method)})(cx||(f.CodeLensRefreshRequest=cx={}));var lx;(function(t){t.method="textDocument/documentLink",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(lx||(f.DocumentLinkRequest=lx={}));var ux;(function(t){t.method="documentLink/resolve",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(ux||(f.DocumentLinkResolveRequest=ux={}));var fx;(function(t){t.method="textDocument/formatting",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(fx||(f.DocumentFormattingRequest=fx={}));var dx;(function(t){t.method="textDocument/rangeFormatting",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(dx||(f.DocumentRangeFormattingRequest=dx={}));var px;(function(t){t.method="textDocument/rangesFormatting",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(px||(f.DocumentRangesFormattingRequest=px={}));var hx;(function(t){t.method="textDocument/onTypeFormatting",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(hx||(f.DocumentOnTypeFormattingRequest=hx={}));var mx=(function(t){return t.Identifier=1,t})(mx||(f.PrepareSupportDefaultBehavior=mx={})),gx;(function(t){t.method="textDocument/rename",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(gx||(f.RenameRequest=gx={}));var yx;(function(t){t.method="textDocument/prepareRename",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(yx||(f.PrepareRenameRequest=yx={}));var Tx;(function(t){t.method="workspace/executeCommand",t.messageDirection=S.MessageDirection.clientToServer,t.type=new S.ProtocolRequestType(t.method)})(Tx||(f.ExecuteCommandRequest=Tx={}));var Rx;(function(t){t.method="workspace/applyEdit",t.messageDirection=S.MessageDirection.serverToClient,t.type=new S.ProtocolRequestType("workspace/applyEdit")})(Rx||(f.ApplyWorkspaceEditRequest=Rx={}))});var kx=X(Hl=>{"use strict";Object.defineProperty(Hl,"__esModule",{value:!0});Hl.createProtocolConnection=void 0;var Sx=hi();function P$(t,e,r,n){return Sx.ConnectionStrategy.is(n)&&(n={connectionStrategy:n}),(0,Sx.createMessageConnection)(t,e,r,n)}Hl.createProtocolConnection=P$});var Cx=X(Ft=>{"use strict";var O$=Ft&&Ft.__createBinding||(Object.create?function(t,e,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,i)}:function(t,e,r,n){n===void 0&&(n=r),t[n]=e[r]}),Yl=Ft&&Ft.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&O$(e,t,r)};Object.defineProperty(Ft,"__esModule",{value:!0});Ft.LSPErrorCodes=Ft.createProtocolConnection=void 0;Yl(hi(),Ft);Yl((as(),pu(il)),Ft);Yl(_e(),Ft);Yl($x(),Ft);var L$=kx();Object.defineProperty(Ft,"createProtocolConnection",{enumerable:!0,get:function(){return L$.createProtocolConnection}});var Nx=(function(t){return t.lspReservedErrorRangeStart=-32899,t.RequestFailed=-32803,t.ServerCancelled=-32802,t.ContentModified=-32801,t.RequestCancelled=-32800,t.lspReservedErrorRangeEnd=-32800,t})(Nx||(Ft.LSPErrorCodes=Nx={}))});var Ix=X(Ir=>{"use strict";var D$=Ir&&Ir.__createBinding||(Object.create?function(t,e,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,i)}:function(t,e,r,n){n===void 0&&(n=r),t[n]=e[r]}),wx=Ir&&Ir.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&D$(e,t,r)};Object.defineProperty(Ir,"__esModule",{value:!0});Ir.createProtocolConnection=void 0;var M$=Bp();wx(Bp(),Ir);wx(Cx(),Ir);function F$(t,e,r,n){return(0,M$.createMessageConnection)(t,e,r,n)}Ir.createProtocolConnection=F$});var qe={};en(qe,{AbstractAstReflection:()=>_n,AbstractCstNode:()=>za,AbstractLangiumParser:()=>ja,AbstractParserErrorMessageProvider:()=>al,AbstractThreadedAsyncParser:()=>hh,AstUtils:()=>Uo,BiMap:()=>ui,Cancellation:()=>W,CompositeCstNodeImpl:()=>si,ContextCache:()=>fi,CstNodeBuilder:()=>qa,CstUtils:()=>ac,DEFAULT_TOKENIZE_OPTIONS:()=>Xl,DONE_RESULT:()=>gt,DatatypeSymbol:()=>sl,DefaultAstNodeDescriptionProvider:()=>oo,DefaultAstNodeLocator:()=>lo,DefaultAsyncParser:()=>Co,DefaultCommentProvider:()=>No,DefaultConfigurationProvider:()=>uo,DefaultDocumentBuilder:()=>xo,DefaultDocumentValidator:()=>ao,DefaultHydrator:()=>Io,DefaultIndexManager:()=>vo,DefaultJsonSerializer:()=>no,DefaultLangiumDocumentFactory:()=>Ha,DefaultLangiumDocuments:()=>Ya,DefaultLangiumProfiler:()=>vh,DefaultLexer:()=>gi,DefaultLexerErrorMessageProvider:()=>Ao,DefaultLinker:()=>Xa,DefaultNameProvider:()=>Ja,DefaultReferenceDescriptionProvider:()=>co,DefaultReferences:()=>Qa,DefaultScopeComputation:()=>Za,DefaultScopeProvider:()=>ro,DefaultServiceRegistry:()=>io,DefaultTokenBuilder:()=>Jr,DefaultValueConverter:()=>oi,DefaultWorkspaceLock:()=>wo,DefaultWorkspaceManager:()=>Eo,Deferred:()=>It,Disposable:()=>Cn,DisposableCache:()=>gs,DocumentCache:()=>ml,DocumentState:()=>re,DocumentValidator:()=>lr,EMPTY_SCOPE:()=>QA,EMPTY_STREAM:()=>nn,EmptyFileSystem:()=>xh,EmptyFileSystemProvider:()=>ru,ErrorWithLocation:()=>Vn,GrammarAST:()=>oa,GrammarUtils:()=>dc,IndentationAwareLexer:()=>Rh,IndentationAwareTokenBuilder:()=>tu,JSDocDocumentationProvider:()=>ko,LangiumCompletionParser:()=>Wa,LangiumParser:()=>Ba,LangiumParserErrorMessageProvider:()=>cs,LeafCstNodeImpl:()=>ii,LexingMode:()=>Os,MapScope:()=>Ud,Module:()=>Gx,MultiMap:()=>Rt,MultiMapScope:()=>eo,OperationCancelled:()=>Yt,ParserWorker:()=>mh,ProfilingTask:()=>nu,Reduction:()=>Ei,RefResolving:()=>li,RegExpUtils:()=>lc,RootCstNodeImpl:()=>os,SimpleCache:()=>to,StreamImpl:()=>qt,StreamScope:()=>ms,TextDocument:()=>ds,TreeStreamImpl:()=>yr,URI:()=>rt,UriTrie:()=>hs,UriUtils:()=>Be,VALIDATE_EACH_NODE:()=>sy,ValidationCategory:()=>gl,ValidationRegistry:()=>so,ValueConverter:()=>$r,WorkspaceCache:()=>ys,assertCondition:()=>Yh,assertUnreachable:()=>Rr,createCompletionParser:()=>Id,createDefaultCoreModule:()=>gh,createDefaultSharedCoreModule:()=>yh,createGrammarConfig:()=>af,createLangiumParser:()=>_d,createParser:()=>Va,delayNextTick:()=>Fd,diagnosticData:()=>di,eagerLoad:()=>qx,getDiagnosticRange:()=>ay,indentationBuilderDefaultOptions:()=>Th,inject:()=>eu,interruptAndCheck:()=>Me,isAstNode:()=>Oe,isAstNodeDescription:()=>mu,isAstNodeWithComment:()=>qd,isCompositeCstNode:()=>rr,isIMultiModeLexerDefinition:()=>ch,isJSDoc:()=>dh,isLeafCstNode:()=>rn,isLinkingError:()=>bn,isMultiReference:()=>Ut,isNamed:()=>ny,isOperationCancelled:()=>Sr,isReference:()=>tt,isRootCstNode:()=>Ys,isTokenTypeArray:()=>Jl,isTokenTypeDictionary:()=>oh,loadGrammarFromJson:()=>_r,parseJSDoc:()=>fh,prepareLangiumParser:()=>Kg,setInterruptionPeriod:()=>Qg,startCancelableOperation:()=>pl,stream:()=>ee,toDiagnosticData:()=>oy,toDiagnosticSeverity:()=>yl});var ac={};en(ac,{DefaultNameRegexp:()=>sc,RangeComparison:()=>qr,compareRange:()=>Wh,findCommentNode:()=>Uu,findDeclarationNodeAtOffset:()=>kv,findLeafNodeAtOffset:()=>qu,findLeafNodeBeforeOffset:()=>Vh,flattenCst:()=>Sv,getDatatypeNode:()=>$v,getInteriorNodes:()=>wv,getNextNode:()=>Nv,getPreviousNode:()=>Hh,getStartlineNode:()=>Cv,inRange:()=>Ru,isChildNode:()=>Gu,isCommentNode:()=>Fu,streamCst:()=>Bn,toDocumentSegment:()=>Wn,tokenToRange:()=>Pi});function Oe(t){return typeof t=="object"&&t!==null&&typeof t.$type=="string"}function tt(t){return typeof t=="object"&&t!==null&&typeof t.$refText=="string"&&"ref"in t}function Ut(t){return typeof t=="object"&&t!==null&&typeof t.$refText=="string"&&"items"in t}function mu(t){return typeof t=="object"&&t!==null&&typeof t.name=="string"&&typeof t.type=="string"&&typeof t.path=="string"}function bn(t){return typeof t=="object"&&t!==null&&typeof t.info=="object"&&typeof t.message=="string"}var _n=class{constructor(){this.subtypes={},this.allSubtypes={}}getAllTypes(){return Object.keys(this.types)}getReferenceType(e){let r=this.types[e.container.$type];if(!r)throw new Error(`Type ${e.container.$type||"undefined"} not found.`);let n=r.properties[e.property]?.referenceType;if(!n)throw new Error(`Property ${e.property||"undefined"} of type ${e.container.$type} is not a reference.`);return n}getTypeMetaData(e){let r=this.types[e];return r||{name:e,properties:{},superTypes:[]}}isInstance(e,r){return Oe(e)&&this.isSubtype(e.$type,r)}isSubtype(e,r){if(e===r)return!0;let n=this.subtypes[e];n||(n=this.subtypes[e]={});let i=n[r];if(i!==void 0)return i;{let s=this.types[e],a=s?s.superTypes.some(o=>this.isSubtype(o,r)):!1;return n[r]=a,a}}getAllSubTypes(e){let r=this.allSubtypes[e];if(r)return r;{let n=this.getAllTypes(),i=[];for(let s of n)this.isSubtype(s,e)&&i.push(s);return this.allSubtypes[e]=i,i}}};function rr(t){return typeof t=="object"&&t!==null&&Array.isArray(t.content)}function rn(t){return typeof t=="object"&&t!==null&&typeof t.tokenType=="object"}function Ys(t){return rr(t)&&typeof t.fullText=="string"}var qt=class t{constructor(e,r){this.startFn=e,this.nextFn=r}iterator(){let e={state:this.startFn(),next:()=>this.nextFn(e.state),[Symbol.iterator]:()=>e};return e}[Symbol.iterator](){return this.iterator()}isEmpty(){return!!this.iterator().next().done}count(){let e=this.iterator(),r=0,n=e.next();for(;!n.done;)r++,n=e.next();return r}toArray(){let e=[],r=this.iterator(),n;do n=r.next(),n.value!==void 0&&e.push(n.value);while(!n.done);return e}toSet(){return new Set(this)}toMap(e,r){let n=this.map(i=>[e?e(i):i,r?r(i):i]);return new Map(n)}toString(){return this.join()}concat(e){return new t(()=>({first:this.startFn(),firstDone:!1,iterator:e[Symbol.iterator]()}),r=>{let n;if(!r.firstDone){do if(n=this.nextFn(r.first),!n.done)return n;while(!n.done);r.firstDone=!0}do if(n=r.iterator.next(),!n.done)return n;while(!n.done);return gt})}join(e=","){let r=this.iterator(),n="",i,s=!1;do i=r.next(),i.done||(s&&(n+=e),n+=sv(i.value)),s=!0;while(!i.done);return n}indexOf(e,r=0){let n=this.iterator(),i=0,s=n.next();for(;!s.done;){if(i>=r&&s.value===e)return i;s=n.next(),i++}return-1}every(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(!e(n.value))return!1;n=r.next()}return!0}some(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return!0;n=r.next()}return!1}forEach(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;)e(i.value,n),i=r.next(),n++}map(e){return new t(this.startFn,r=>{let{done:n,value:i}=this.nextFn(r);return n?gt:{done:!1,value:e(i)}})}filter(e){return new t(this.startFn,r=>{let n;do if(n=this.nextFn(r),!n.done&&e(n.value))return n;while(!n.done);return gt})}nonNullable(){return this.filter(e=>e!=null)}reduce(e,r){let n=this.iterator(),i=r,s=n.next();for(;!s.done;)i===void 0?i=s.value:i=e(i,s.value),s=n.next();return i}reduceRight(e,r){return this.recursiveReduce(this.iterator(),e,r)}recursiveReduce(e,r,n){let i=e.next();if(i.done)return n;let s=this.recursiveReduce(e,r,n);return s===void 0?i.value:r(s,i.value)}find(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return n.value;n=r.next()}}findIndex(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;){if(e(i.value))return n;i=r.next(),n++}return-1}includes(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(n.value===e)return!0;n=r.next()}return!1}flatMap(e){return new t(()=>({this:this.startFn()}),r=>{do{if(r.iterator){let s=r.iterator.next();if(s.done)r.iterator=void 0;else return s}let{done:n,value:i}=this.nextFn(r.this);if(!n){let s=e(i);if(Fo(s))r.iterator=s[Symbol.iterator]();else return{done:!1,value:s}}}while(r.iterator);return gt})}flat(e){if(e===void 0&&(e=1),e<=0)return this;let r=e>1?this.flat(e-1):this;return new t(()=>({this:r.startFn()}),n=>{do{if(n.iterator){let a=n.iterator.next();if(a.done)n.iterator=void 0;else return a}let{done:i,value:s}=r.nextFn(n.this);if(!i)if(Fo(s))n.iterator=s[Symbol.iterator]();else return{done:!1,value:s}}while(n.iterator);return gt})}head(){let r=this.iterator().next();if(!r.done)return r.value}tail(e=1){return new t(()=>{let r=this.startFn();for(let n=0;n({size:0,state:this.startFn()}),r=>(r.size++,r.size>e?gt:this.nextFn(r.state)))}distinct(e){return new t(()=>({set:new Set,internalState:this.startFn()}),r=>{let n;do if(n=this.nextFn(r.internalState),!n.done){let i=e?e(n.value):n.value;if(!r.set.has(i))return r.set.add(i),n}while(!n.done);return gt})}exclude(e,r){let n=new Set;for(let i of e){let s=r?r(i):i;n.add(s)}return this.filter(i=>{let s=r?r(i):i;return!n.has(s)})}};function sv(t){return typeof t=="string"?t:typeof t>"u"?"undefined":typeof t.toString=="function"?t.toString():Object.prototype.toString.call(t)}function Fo(t){return!!t&&typeof t[Symbol.iterator]=="function"}var nn=new qt(()=>{},()=>gt),gt=Object.freeze({done:!0,value:void 0});function ee(...t){if(t.length===1){let e=t[0];if(e instanceof qt)return e;if(Fo(e))return new qt(()=>e[Symbol.iterator](),r=>r.next());if(typeof e.length=="number")return new qt(()=>({index:0}),r=>r.index1?new qt(()=>({collIndex:0,arrIndex:0}),e=>{do{if(e.iterator){let r=e.iterator.next();if(!r.done)return r;e.iterator=void 0}if(e.array){if(e.arrIndex({iterators:n?.includeRoot?[[e][Symbol.iterator]()]:[r(e)[Symbol.iterator]()],pruned:!1}),i=>{for(i.pruned&&(i.iterators.pop(),i.pruned=!1);i.iterators.length>0;){let a=i.iterators[i.iterators.length-1].next();if(a.done)i.iterators.pop();else return i.iterators.push(r(a.value)[Symbol.iterator]()),a}return gt})}iterator(){let e={state:this.startFn(),next:()=>this.nextFn(e.state),prune:()=>{e.state.pruned=!0},[Symbol.iterator]:()=>e};return e}},Ei;(function(t){function e(s){return s.reduce((a,o)=>a+o,0)}t.sum=e;function r(s){return s.reduce((a,o)=>a*o,0)}t.product=r;function n(s){return s.reduce((a,o)=>Math.min(a,o))}t.min=n;function i(s){return s.reduce((a,o)=>Math.max(a,o))}t.max=i})(Ei||(Ei={}));var Uo={};en(Uo,{assignMandatoryProperties:()=>Tu,copyAstNode:()=>yu,findRootNode:()=>$i,getContainerOfType:()=>Dr,getDocument:()=>yt,getReferenceNodes:()=>Go,hasContainerOfType:()=>av,linkContentToContainer:()=>Ai,streamAllContents:()=>nr,streamAst:()=>St,streamContents:()=>Xs,streamReferences:()=>sn});function Ai(t,e={}){for(let[r,n]of Object.entries(t))r.startsWith("$")||(Array.isArray(n)?n.forEach((i,s)=>{Oe(i)&&(i.$container=t,i.$containerProperty=r,i.$containerIndex=s,e.deep&&Ai(i,e))}):Oe(n)&&(n.$container=t,n.$containerProperty=r,e.deep&&Ai(n,e)))}function Dr(t,e){let r=t;for(;r;){if(e(r))return r;r=r.$container}}function av(t,e){let r=t;for(;r;){if(e(r))return!0;r=r.$container}return!1}function yt(t){let r=$i(t).$document;if(!r)throw new Error("AST node has no document.");return r}function $i(t){for(;t.$container;)t=t.$container;return t}function Go(t){return tt(t)?t.ref?[t.ref]:[]:Ut(t)?t.items.map(e=>e.ref):[]}function Xs(t,e){if(!t)throw new Error("Node must be an AstNode.");let r=e?.range;return new qt(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),n=>{for(;n.keyIndexXs(r,e))}function St(t,e){if(t){if(e?.range&&!gu(t,e.range))return new yr(t,()=>[])}else throw new Error("Root node must be an AstNode.");return new yr(t,r=>Xs(r,e),{includeRoot:!0})}function gu(t,e){if(!e)return!0;let r=t.$cstNode?.range;return r?Ru(r,e):!1}function sn(t){return new qt(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),e=>{for(;e.keyIndexbt,AbstractParserRule:()=>Js,AbstractRule:()=>Si,AbstractType:()=>zt,Action:()=>an,Alternatives:()=>Qs,ArrayLiteral:()=>qo,ArrayType:()=>zo,Assignment:()=>on,BooleanLiteral:()=>jo,CharacterRange:()=>cn,Condition:()=>ln,Conjunction:()=>Zs,CrossReference:()=>un,Disjunction:()=>ea,EndOfFile:()=>Bo,Grammar:()=>Mr,GrammarImport:()=>Wo,Group:()=>Pn,InferredType:()=>Vo,InfixRule:()=>Tr,InfixRuleOperatorList:()=>ta,InfixRuleOperators:()=>Ko,Interface:()=>ki,Keyword:()=>Ni,LangiumGrammarAstReflection:()=>bi,LangiumGrammarTerminals:()=>ov,NamedArgument:()=>Ci,NegatedToken:()=>On,Negation:()=>Ho,NumberLiteral:()=>Yo,Parameter:()=>wi,ParameterReference:()=>Xo,ParserRule:()=>ir,ReferenceType:()=>ra,RegexToken:()=>Ln,ReturnType:()=>Jo,RuleCall:()=>Dn,SimpleType:()=>Ii,StringLiteral:()=>Qo,TerminalAlternatives:()=>Mn,TerminalElement:()=>Pt,TerminalGroup:()=>Fn,TerminalRule:()=>Fr,TerminalRuleCall:()=>Gn,Type:()=>na,TypeAttribute:()=>Un,TypeDefinition:()=>qn,UnionType:()=>Zo,UnorderedGroup:()=>ia,UntilToken:()=>zn,ValueLiteral:()=>jn,Wildcard:()=>_i,isAbstractElement:()=>sa,isAbstractParserRule:()=>Gr,isAbstractRule:()=>cv,isAbstractType:()=>lv,isAction:()=>Ur,isAlternatives:()=>ec,isArrayLiteral:()=>uv,isArrayType:()=>xu,isAssignment:()=>sr,isBooleanLiteral:()=>vu,isCharacterRange:()=>Eu,isCondition:()=>fv,isConjunction:()=>Au,isCrossReference:()=>ar,isDisjunction:()=>$u,isEndOfFile:()=>Su,isGrammar:()=>dv,isGrammarImport:()=>pv,isGroup:()=>fn,isInferredType:()=>aa,isInfixRule:()=>dn,isInfixRuleOperatorList:()=>hv,isInfixRuleOperators:()=>mv,isInterface:()=>ku,isKeyword:()=>Ht,isNamedArgument:()=>gv,isNegatedToken:()=>Nu,isNegation:()=>Cu,isNumberLiteral:()=>yv,isParameter:()=>Tv,isParameterReference:()=>wu,isParserRule:()=>nt,isReferenceType:()=>Iu,isRegexToken:()=>_u,isReturnType:()=>bu,isRuleCall:()=>or,isSimpleType:()=>tc,isStringLiteral:()=>Rv,isTerminalAlternatives:()=>Pu,isTerminalElement:()=>xv,isTerminalGroup:()=>Ou,isTerminalRule:()=>kt,isTerminalRuleCall:()=>rc,isType:()=>nc,isTypeAttribute:()=>vv,isTypeDefinition:()=>Ev,isUnionType:()=>Lu,isUnorderedGroup:()=>ic,isUntilToken:()=>Du,isValueLiteral:()=>Av,isWildcard:()=>Mu,reflection:()=>B});var ov={ID:/\^?[_a-zA-Z][\w_]*/,STRING:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,NUMBER:/NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity)/,RegexLiteral:/\/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+\/[a-z]*/,WS:/\s+/,ML_COMMENT:/\/\*[\s\S]*?\*\//,SL_COMMENT:/\/\/[^\n\r]*/},bt={$type:"AbstractElement",cardinality:"cardinality"};function sa(t){return B.isInstance(t,bt.$type)}var Js={$type:"AbstractParserRule"};function Gr(t){return B.isInstance(t,Js.$type)}var Si={$type:"AbstractRule"};function cv(t){return B.isInstance(t,Si.$type)}var zt={$type:"AbstractType"};function lv(t){return B.isInstance(t,zt.$type)}var an={$type:"Action",cardinality:"cardinality",feature:"feature",inferredType:"inferredType",operator:"operator",type:"type"};function Ur(t){return B.isInstance(t,an.$type)}var Qs={$type:"Alternatives",cardinality:"cardinality",elements:"elements"};function ec(t){return B.isInstance(t,Qs.$type)}var qo={$type:"ArrayLiteral",elements:"elements"};function uv(t){return B.isInstance(t,qo.$type)}var zo={$type:"ArrayType",elementType:"elementType"};function xu(t){return B.isInstance(t,zo.$type)}var on={$type:"Assignment",cardinality:"cardinality",feature:"feature",operator:"operator",predicate:"predicate",terminal:"terminal"};function sr(t){return B.isInstance(t,on.$type)}var jo={$type:"BooleanLiteral",true:"true"};function vu(t){return B.isInstance(t,jo.$type)}var cn={$type:"CharacterRange",cardinality:"cardinality",left:"left",lookahead:"lookahead",parenthesized:"parenthesized",right:"right"};function Eu(t){return B.isInstance(t,cn.$type)}var ln={$type:"Condition"};function fv(t){return B.isInstance(t,ln.$type)}var Zs={$type:"Conjunction",left:"left",right:"right"};function Au(t){return B.isInstance(t,Zs.$type)}var un={$type:"CrossReference",cardinality:"cardinality",deprecatedSyntax:"deprecatedSyntax",isMulti:"isMulti",terminal:"terminal",type:"type"};function ar(t){return B.isInstance(t,un.$type)}var ea={$type:"Disjunction",left:"left",right:"right"};function $u(t){return B.isInstance(t,ea.$type)}var Bo={$type:"EndOfFile",cardinality:"cardinality"};function Su(t){return B.isInstance(t,Bo.$type)}var Mr={$type:"Grammar",imports:"imports",interfaces:"interfaces",isDeclared:"isDeclared",name:"name",rules:"rules",types:"types"};function dv(t){return B.isInstance(t,Mr.$type)}var Wo={$type:"GrammarImport",path:"path"};function pv(t){return B.isInstance(t,Wo.$type)}var Pn={$type:"Group",cardinality:"cardinality",elements:"elements",guardCondition:"guardCondition",predicate:"predicate"};function fn(t){return B.isInstance(t,Pn.$type)}var Vo={$type:"InferredType",name:"name"};function aa(t){return B.isInstance(t,Vo.$type)}var Tr={$type:"InfixRule",call:"call",dataType:"dataType",inferredType:"inferredType",name:"name",operators:"operators",parameters:"parameters",returnType:"returnType"};function dn(t){return B.isInstance(t,Tr.$type)}var ta={$type:"InfixRuleOperatorList",associativity:"associativity",operators:"operators"};function hv(t){return B.isInstance(t,ta.$type)}var Ko={$type:"InfixRuleOperators",precedences:"precedences"};function mv(t){return B.isInstance(t,Ko.$type)}var ki={$type:"Interface",attributes:"attributes",name:"name",superTypes:"superTypes"};function ku(t){return B.isInstance(t,ki.$type)}var Ni={$type:"Keyword",cardinality:"cardinality",predicate:"predicate",value:"value"};function Ht(t){return B.isInstance(t,Ni.$type)}var Ci={$type:"NamedArgument",calledByName:"calledByName",parameter:"parameter",value:"value"};function gv(t){return B.isInstance(t,Ci.$type)}var On={$type:"NegatedToken",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized",terminal:"terminal"};function Nu(t){return B.isInstance(t,On.$type)}var Ho={$type:"Negation",value:"value"};function Cu(t){return B.isInstance(t,Ho.$type)}var Yo={$type:"NumberLiteral",value:"value"};function yv(t){return B.isInstance(t,Yo.$type)}var wi={$type:"Parameter",name:"name"};function Tv(t){return B.isInstance(t,wi.$type)}var Xo={$type:"ParameterReference",parameter:"parameter"};function wu(t){return B.isInstance(t,Xo.$type)}var ir={$type:"ParserRule",dataType:"dataType",definition:"definition",entry:"entry",fragment:"fragment",inferredType:"inferredType",name:"name",parameters:"parameters",returnType:"returnType"};function nt(t){return B.isInstance(t,ir.$type)}var ra={$type:"ReferenceType",isMulti:"isMulti",referenceType:"referenceType"};function Iu(t){return B.isInstance(t,ra.$type)}var Ln={$type:"RegexToken",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized",regex:"regex"};function _u(t){return B.isInstance(t,Ln.$type)}var Jo={$type:"ReturnType",name:"name"};function bu(t){return B.isInstance(t,Jo.$type)}var Dn={$type:"RuleCall",arguments:"arguments",cardinality:"cardinality",predicate:"predicate",rule:"rule"};function or(t){return B.isInstance(t,Dn.$type)}var Ii={$type:"SimpleType",primitiveType:"primitiveType",stringType:"stringType",typeRef:"typeRef"};function tc(t){return B.isInstance(t,Ii.$type)}var Qo={$type:"StringLiteral",value:"value"};function Rv(t){return B.isInstance(t,Qo.$type)}var Mn={$type:"TerminalAlternatives",cardinality:"cardinality",elements:"elements",lookahead:"lookahead",parenthesized:"parenthesized"};function Pu(t){return B.isInstance(t,Mn.$type)}var Pt={$type:"TerminalElement",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized"};function xv(t){return B.isInstance(t,Pt.$type)}var Fn={$type:"TerminalGroup",cardinality:"cardinality",elements:"elements",lookahead:"lookahead",parenthesized:"parenthesized"};function Ou(t){return B.isInstance(t,Fn.$type)}var Fr={$type:"TerminalRule",definition:"definition",fragment:"fragment",hidden:"hidden",name:"name",type:"type"};function kt(t){return B.isInstance(t,Fr.$type)}var Gn={$type:"TerminalRuleCall",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized",rule:"rule"};function rc(t){return B.isInstance(t,Gn.$type)}var na={$type:"Type",name:"name",type:"type"};function nc(t){return B.isInstance(t,na.$type)}var Un={$type:"TypeAttribute",defaultValue:"defaultValue",isOptional:"isOptional",name:"name",type:"type"};function vv(t){return B.isInstance(t,Un.$type)}var qn={$type:"TypeDefinition"};function Ev(t){return B.isInstance(t,qn.$type)}var Zo={$type:"UnionType",types:"types"};function Lu(t){return B.isInstance(t,Zo.$type)}var ia={$type:"UnorderedGroup",cardinality:"cardinality",elements:"elements"};function ic(t){return B.isInstance(t,ia.$type)}var zn={$type:"UntilToken",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized",terminal:"terminal"};function Du(t){return B.isInstance(t,zn.$type)}var jn={$type:"ValueLiteral"};function Av(t){return B.isInstance(t,jn.$type)}var _i={$type:"Wildcard",cardinality:"cardinality",lookahead:"lookahead",parenthesized:"parenthesized"};function Mu(t){return B.isInstance(t,_i.$type)}var bi=class extends _n{constructor(){super(...arguments),this.types={AbstractElement:{name:bt.$type,properties:{cardinality:{name:bt.cardinality}},superTypes:[]},AbstractParserRule:{name:Js.$type,properties:{},superTypes:[Si.$type,zt.$type]},AbstractRule:{name:Si.$type,properties:{},superTypes:[]},AbstractType:{name:zt.$type,properties:{},superTypes:[]},Action:{name:an.$type,properties:{cardinality:{name:an.cardinality},feature:{name:an.feature},inferredType:{name:an.inferredType},operator:{name:an.operator},type:{name:an.type,referenceType:zt.$type}},superTypes:[bt.$type]},Alternatives:{name:Qs.$type,properties:{cardinality:{name:Qs.cardinality},elements:{name:Qs.elements,defaultValue:[]}},superTypes:[bt.$type]},ArrayLiteral:{name:qo.$type,properties:{elements:{name:qo.elements,defaultValue:[]}},superTypes:[jn.$type]},ArrayType:{name:zo.$type,properties:{elementType:{name:zo.elementType}},superTypes:[qn.$type]},Assignment:{name:on.$type,properties:{cardinality:{name:on.cardinality},feature:{name:on.feature},operator:{name:on.operator},predicate:{name:on.predicate},terminal:{name:on.terminal}},superTypes:[bt.$type]},BooleanLiteral:{name:jo.$type,properties:{true:{name:jo.true,defaultValue:!1}},superTypes:[ln.$type,jn.$type]},CharacterRange:{name:cn.$type,properties:{cardinality:{name:cn.cardinality},left:{name:cn.left},lookahead:{name:cn.lookahead},parenthesized:{name:cn.parenthesized,defaultValue:!1},right:{name:cn.right}},superTypes:[Pt.$type]},Condition:{name:ln.$type,properties:{},superTypes:[]},Conjunction:{name:Zs.$type,properties:{left:{name:Zs.left},right:{name:Zs.right}},superTypes:[ln.$type]},CrossReference:{name:un.$type,properties:{cardinality:{name:un.cardinality},deprecatedSyntax:{name:un.deprecatedSyntax,defaultValue:!1},isMulti:{name:un.isMulti,defaultValue:!1},terminal:{name:un.terminal},type:{name:un.type,referenceType:zt.$type}},superTypes:[bt.$type]},Disjunction:{name:ea.$type,properties:{left:{name:ea.left},right:{name:ea.right}},superTypes:[ln.$type]},EndOfFile:{name:Bo.$type,properties:{cardinality:{name:Bo.cardinality}},superTypes:[bt.$type]},Grammar:{name:Mr.$type,properties:{imports:{name:Mr.imports,defaultValue:[]},interfaces:{name:Mr.interfaces,defaultValue:[]},isDeclared:{name:Mr.isDeclared,defaultValue:!1},name:{name:Mr.name},rules:{name:Mr.rules,defaultValue:[]},types:{name:Mr.types,defaultValue:[]}},superTypes:[]},GrammarImport:{name:Wo.$type,properties:{path:{name:Wo.path}},superTypes:[]},Group:{name:Pn.$type,properties:{cardinality:{name:Pn.cardinality},elements:{name:Pn.elements,defaultValue:[]},guardCondition:{name:Pn.guardCondition},predicate:{name:Pn.predicate}},superTypes:[bt.$type]},InferredType:{name:Vo.$type,properties:{name:{name:Vo.name}},superTypes:[zt.$type]},InfixRule:{name:Tr.$type,properties:{call:{name:Tr.call},dataType:{name:Tr.dataType},inferredType:{name:Tr.inferredType},name:{name:Tr.name},operators:{name:Tr.operators},parameters:{name:Tr.parameters,defaultValue:[]},returnType:{name:Tr.returnType,referenceType:zt.$type}},superTypes:[Js.$type]},InfixRuleOperatorList:{name:ta.$type,properties:{associativity:{name:ta.associativity},operators:{name:ta.operators,defaultValue:[]}},superTypes:[]},InfixRuleOperators:{name:Ko.$type,properties:{precedences:{name:Ko.precedences,defaultValue:[]}},superTypes:[]},Interface:{name:ki.$type,properties:{attributes:{name:ki.attributes,defaultValue:[]},name:{name:ki.name},superTypes:{name:ki.superTypes,defaultValue:[],referenceType:zt.$type}},superTypes:[zt.$type]},Keyword:{name:Ni.$type,properties:{cardinality:{name:Ni.cardinality},predicate:{name:Ni.predicate},value:{name:Ni.value}},superTypes:[bt.$type]},NamedArgument:{name:Ci.$type,properties:{calledByName:{name:Ci.calledByName,defaultValue:!1},parameter:{name:Ci.parameter,referenceType:wi.$type},value:{name:Ci.value}},superTypes:[]},NegatedToken:{name:On.$type,properties:{cardinality:{name:On.cardinality},lookahead:{name:On.lookahead},parenthesized:{name:On.parenthesized,defaultValue:!1},terminal:{name:On.terminal}},superTypes:[Pt.$type]},Negation:{name:Ho.$type,properties:{value:{name:Ho.value}},superTypes:[ln.$type]},NumberLiteral:{name:Yo.$type,properties:{value:{name:Yo.value}},superTypes:[jn.$type]},Parameter:{name:wi.$type,properties:{name:{name:wi.name}},superTypes:[]},ParameterReference:{name:Xo.$type,properties:{parameter:{name:Xo.parameter,referenceType:wi.$type}},superTypes:[ln.$type]},ParserRule:{name:ir.$type,properties:{dataType:{name:ir.dataType},definition:{name:ir.definition},entry:{name:ir.entry,defaultValue:!1},fragment:{name:ir.fragment,defaultValue:!1},inferredType:{name:ir.inferredType},name:{name:ir.name},parameters:{name:ir.parameters,defaultValue:[]},returnType:{name:ir.returnType,referenceType:zt.$type}},superTypes:[Js.$type]},ReferenceType:{name:ra.$type,properties:{isMulti:{name:ra.isMulti,defaultValue:!1},referenceType:{name:ra.referenceType}},superTypes:[qn.$type]},RegexToken:{name:Ln.$type,properties:{cardinality:{name:Ln.cardinality},lookahead:{name:Ln.lookahead},parenthesized:{name:Ln.parenthesized,defaultValue:!1},regex:{name:Ln.regex}},superTypes:[Pt.$type]},ReturnType:{name:Jo.$type,properties:{name:{name:Jo.name}},superTypes:[]},RuleCall:{name:Dn.$type,properties:{arguments:{name:Dn.arguments,defaultValue:[]},cardinality:{name:Dn.cardinality},predicate:{name:Dn.predicate},rule:{name:Dn.rule,referenceType:Si.$type}},superTypes:[bt.$type]},SimpleType:{name:Ii.$type,properties:{primitiveType:{name:Ii.primitiveType},stringType:{name:Ii.stringType},typeRef:{name:Ii.typeRef,referenceType:zt.$type}},superTypes:[qn.$type]},StringLiteral:{name:Qo.$type,properties:{value:{name:Qo.value}},superTypes:[jn.$type]},TerminalAlternatives:{name:Mn.$type,properties:{cardinality:{name:Mn.cardinality},elements:{name:Mn.elements,defaultValue:[]},lookahead:{name:Mn.lookahead},parenthesized:{name:Mn.parenthesized,defaultValue:!1}},superTypes:[Pt.$type]},TerminalElement:{name:Pt.$type,properties:{cardinality:{name:Pt.cardinality},lookahead:{name:Pt.lookahead},parenthesized:{name:Pt.parenthesized,defaultValue:!1}},superTypes:[bt.$type]},TerminalGroup:{name:Fn.$type,properties:{cardinality:{name:Fn.cardinality},elements:{name:Fn.elements,defaultValue:[]},lookahead:{name:Fn.lookahead},parenthesized:{name:Fn.parenthesized,defaultValue:!1}},superTypes:[Pt.$type]},TerminalRule:{name:Fr.$type,properties:{definition:{name:Fr.definition},fragment:{name:Fr.fragment,defaultValue:!1},hidden:{name:Fr.hidden,defaultValue:!1},name:{name:Fr.name},type:{name:Fr.type}},superTypes:[Si.$type]},TerminalRuleCall:{name:Gn.$type,properties:{cardinality:{name:Gn.cardinality},lookahead:{name:Gn.lookahead},parenthesized:{name:Gn.parenthesized,defaultValue:!1},rule:{name:Gn.rule,referenceType:Fr.$type}},superTypes:[Pt.$type]},Type:{name:na.$type,properties:{name:{name:na.name},type:{name:na.type}},superTypes:[zt.$type]},TypeAttribute:{name:Un.$type,properties:{defaultValue:{name:Un.defaultValue},isOptional:{name:Un.isOptional,defaultValue:!1},name:{name:Un.name},type:{name:Un.type}},superTypes:[]},TypeDefinition:{name:qn.$type,properties:{},superTypes:[]},UnionType:{name:Zo.$type,properties:{types:{name:Zo.types,defaultValue:[]}},superTypes:[qn.$type]},UnorderedGroup:{name:ia.$type,properties:{cardinality:{name:ia.cardinality},elements:{name:ia.elements,defaultValue:[]}},superTypes:[bt.$type]},UntilToken:{name:zn.$type,properties:{cardinality:{name:zn.cardinality},lookahead:{name:zn.lookahead},parenthesized:{name:zn.parenthesized,defaultValue:!1},terminal:{name:zn.terminal}},superTypes:[Pt.$type]},ValueLiteral:{name:jn.$type,properties:{},superTypes:[]},Wildcard:{name:_i.$type,properties:{cardinality:{name:_i.cardinality},lookahead:{name:_i.lookahead},parenthesized:{name:_i.parenthesized,defaultValue:!1}},superTypes:[Pt.$type]}}}},B=new bi;function $v(t){let e=t,r=!1;for(;e;){let n=Dr(e.grammarSource,nt);if(n&&n.dataType)e=e.container,r=!0;else return r?e:void 0}}function Bn(t){return new yr(t,e=>rr(e)?e.content:[],{includeRoot:!0})}function Sv(t){return Bn(t).filter(rn)}function Gu(t,e){for(;t.container;)if(t=t.container,t===e)return!0;return!1}function Pi(t){return{start:{character:t.startColumn-1,line:t.startLine-1},end:{character:t.endColumn,line:t.endLine-1}}}function Wn(t){if(!t)return;let{offset:e,end:r,range:n}=t;return{range:n,offset:e,end:r,length:r-e}}var qr=(function(t){return t[t.Before=0]="Before",t[t.After=1]="After",t[t.OverlapFront=2]="OverlapFront",t[t.OverlapBack=3]="OverlapBack",t[t.Inside=4]="Inside",t[t.Outside=5]="Outside",t})(qr||{});function Wh(t,e){if(t.end.linee.end.line||t.start.line===e.end.line&&t.start.character>=e.end.character)return qr.After;let r=t.start.line>e.start.line||t.start.line===e.start.line&&t.start.character>=e.start.character,n=t.end.lineqr.After}var sc=/^[\w\p{L}]$/u;function kv(t,e,r=sc){if(t){if(e>0){let n=e-t.offset,i=t.text.charAt(n);r.test(i)||e--}return qu(t,e)}}function Uu(t,e){if(t){let r=Hh(t,!0);if(r&&Fu(r,e))return r;if(Ys(t)){let n=t.content.findIndex(i=>!i.hidden);for(let i=n-1;i>=0;i--){let s=t.content[i];if(Fu(s,e))return s}}}}function Fu(t,e){return rn(t)&&e.includes(t.tokenType.name)}function qu(t,e){if(rn(t))return t;if(rr(t)){let r=Kh(t,e,!1);if(r)return qu(r,e)}}function Vh(t,e){if(rn(t))return t;if(rr(t)){let r=Kh(t,e,!0);if(r)return Vh(r,e)}}function Kh(t,e,r){let n=0,i=t.content.length-1,s;for(;n<=i;){let a=Math.floor((n+i)/2),o=t.content[a];if(o.offset<=e&&o.end>e)return o;o.end<=e?(s=r?o:void 0,n=a+1):i=a-1}return s}function Hh(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t);for(;n>0;){n--;let i=r.content[n];if(e||!i.hidden)return i}t=r}}function Nv(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t),i=r.content.length-1;for(;nrf,findNameAssignment:()=>uc,findNodeForKeyword:()=>ef,findNodeForProperty:()=>pa,findNodesForKeyword:()=>Lv,findNodesForKeywordInternal:()=>tf,findNodesForProperty:()=>Qu,getActionAtElement:()=>nm,getActionType:()=>sm,getAllReachableRules:()=>da,getAllRulesUsedForCrossReferences:()=>Ov,getCrossReferenceTerminal:()=>Xu,getEntryRule:()=>Zh,getExplicitRuleType:()=>fc,getHiddenRules:()=>em,getRuleType:()=>nf,getRuleTypeName:()=>Uv,getTypeName:()=>hn,isArrayCardinality:()=>Mv,isArrayOperator:()=>Fv,isCommentTerminal:()=>Ju,isDataType:()=>Gv,isDataTypeRule:()=>ha,isOptionalCardinality:()=>Dv,terminalRegex:()=>Li});var Vn=class extends Error{constructor(e,r){super(e?`${r} at ${e.range.start.line}:${e.range.start.character}`:r)}};function Rr(t,e="Error: Got unexpected value."){throw new Error(e)}function Yh(t,e="Error: Condition is violated."){if(!t)throw new Error(e)}var lc={};en(lc,{NEWLINE_REGEXP:()=>Wu,escapeRegExp:()=>pn,getTerminalParts:()=>Pv,isMultilineComment:()=>Vu,isWhitespace:()=>fa,partialMatches:()=>Ku,partialRegExp:()=>Qh,whitespaceCharacters:()=>Jh});function V(t){return t.charCodeAt(0)}function oc(t,e){Array.isArray(t)?t.forEach(function(r){e.push(r)}):e.push(t)}function Oi(t,e){if(t[e]===!0)throw"duplicate flag "+e;let r=t[e];t[e]=!0}function Kn(t){if(t===void 0)throw Error("Internal Error - Should never get here!");return!0}function ca(){throw Error("Internal Error - Should never get here!")}function zu(t){return t.type==="Character"}var la=[];for(let t=V("0");t<=V("9");t++)la.push(t);var ua=[V("_")].concat(la);for(let t=V("a");t<=V("z");t++)ua.push(t);for(let t=V("A");t<=V("Z");t++)ua.push(t);var ju=[V(" "),V("\f"),V(` +`),V("\r"),V(" "),V("\v"),V(" "),V("\xA0"),V("\u1680"),V("\u2000"),V("\u2001"),V("\u2002"),V("\u2003"),V("\u2004"),V("\u2005"),V("\u2006"),V("\u2007"),V("\u2008"),V("\u2009"),V("\u200A"),V("\u2028"),V("\u2029"),V("\u202F"),V("\u205F"),V("\u3000"),V("\uFEFF")];var _v=/[0-9a-fA-F]/,cc=/[0-9]/,bv=/[1-9]/,Hn=class{constructor(){this.idx=0,this.input="",this.groupIdx=0}saveState(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}}restoreState(e){this.idx=e.idx,this.input=e.input,this.groupIdx=e.groupIdx}pattern(e){this.idx=0,this.input=e,this.groupIdx=0,this.consumeChar("/");let r=this.disjunction();this.consumeChar("/");let n={type:"Flags",loc:{begin:this.idx,end:e.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};for(;this.isRegExpFlag();)switch(this.popChar()){case"g":Oi(n,"global");break;case"i":Oi(n,"ignoreCase");break;case"m":Oi(n,"multiLine");break;case"u":Oi(n,"unicode");break;case"y":Oi(n,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:r,loc:this.loc(0)}}disjunction(){let e=[],r=this.idx;for(e.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),e.push(this.alternative());return{type:"Disjunction",value:e,loc:this.loc(r)}}alternative(){let e=[],r=this.idx;for(;this.isTerm();)e.push(this.term());return{type:"Alternative",value:e,loc:this.loc(r)}}term(){return this.isAssertion()?this.assertion():this.atom()}assertion(){let e=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(e)};case"$":return{type:"EndAnchor",loc:this.loc(e)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(e)};case"B":return{type:"NonWordBoundary",loc:this.loc(e)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");let r;switch(this.popChar()){case"=":r="Lookahead";break;case"!":r="NegativeLookahead";break;case"<":{switch(this.popChar()){case"=":r="Lookbehind";break;case"!":r="NegativeLookbehind"}break}}Kn(r);let n=this.disjunction();return this.consumeChar(")"),{type:r,value:n,loc:this.loc(e)}}return ca()}quantifier(e=!1){let r,n=this.idx;switch(this.popChar()){case"*":r={atLeast:0,atMost:1/0};break;case"+":r={atLeast:1,atMost:1/0};break;case"?":r={atLeast:0,atMost:1};break;case"{":let i=this.integerIncludingZero();switch(this.popChar()){case"}":r={atLeast:i,atMost:i};break;case",":let s;this.isDigit()?(s=this.integerIncludingZero(),r={atLeast:i,atMost:s}):r={atLeast:i,atMost:1/0},this.consumeChar("}");break}if(e===!0&&r===void 0)return;Kn(r);break}if(!(e===!0&&r===void 0)&&Kn(r))return this.peekChar(0)==="?"?(this.consumeChar("?"),r.greedy=!1):r.greedy=!0,r.type="Quantifier",r.loc=this.loc(n),r}atom(){let e,r=this.idx;switch(this.peekChar()){case".":e=this.dotAll();break;case"\\":e=this.atomEscape();break;case"[":e=this.characterClass();break;case"(":e=this.group();break}return e===void 0&&this.isPatternCharacter()&&(e=this.patternCharacter()),Kn(e)?(e.loc=this.loc(r),this.isQuantifier()&&(e.quantifier=this.quantifier()),e):ca()}dotAll(){return this.consumeChar("."),{type:"Set",complement:!0,value:[V(` +`),V("\r"),V("\u2028"),V("\u2029")]}}atomEscape(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}}decimalEscapeAtom(){return{type:"GroupBackReference",value:this.positiveInteger()}}characterClassEscape(){let e,r=!1;switch(this.popChar()){case"d":e=la;break;case"D":e=la,r=!0;break;case"s":e=ju;break;case"S":e=ju,r=!0;break;case"w":e=ua;break;case"W":e=ua,r=!0;break}return Kn(e)?{type:"Set",value:e,complement:r}:ca()}controlEscapeAtom(){let e;switch(this.popChar()){case"f":e=V("\f");break;case"n":e=V(` +`);break;case"r":e=V("\r");break;case"t":e=V(" ");break;case"v":e=V("\v");break}return Kn(e)?{type:"Character",value:e}:ca()}controlLetterEscapeAtom(){this.consumeChar("c");let e=this.popChar();if(/[a-zA-Z]/.test(e)===!1)throw Error("Invalid ");return{type:"Character",value:e.toUpperCase().charCodeAt(0)-64}}nulCharacterAtom(){return this.consumeChar("0"),{type:"Character",value:V("\0")}}hexEscapeSequenceAtom(){return this.consumeChar("x"),this.parseHexDigits(2)}regExpUnicodeEscapeSequenceAtom(){return this.consumeChar("u"),this.parseHexDigits(4)}identityEscapeAtom(){let e=this.popChar();return{type:"Character",value:V(e)}}classPatternCharacterAtom(){switch(this.peekChar()){case` +`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:let e=this.popChar();return{type:"Character",value:V(e)}}}characterClass(){let e=[],r=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),r=!0);this.isClassAtom();){let n=this.classAtom(),i=n.type==="Character";if(zu(n)&&this.isRangeDash()){this.consumeChar("-");let s=this.classAtom(),a=s.type==="Character";if(zu(s)){if(s.value=this.input.length)throw Error("Unexpected end of input");this.idx++}loc(e){return{begin:e,end:this.idx}}};var xr=class{visitChildren(e){for(let r in e){let n=e[r];e.hasOwnProperty(r)&&(n.type!==void 0?this.visit(n):Array.isArray(n)&&n.forEach(i=>{this.visit(i)},this))}}visit(e){switch(e.type){case"Pattern":this.visitPattern(e);break;case"Flags":this.visitFlags(e);break;case"Disjunction":this.visitDisjunction(e);break;case"Alternative":this.visitAlternative(e);break;case"StartAnchor":this.visitStartAnchor(e);break;case"EndAnchor":this.visitEndAnchor(e);break;case"WordBoundary":this.visitWordBoundary(e);break;case"NonWordBoundary":this.visitNonWordBoundary(e);break;case"Lookahead":this.visitLookahead(e);break;case"NegativeLookahead":this.visitNegativeLookahead(e);break;case"Lookbehind":this.visitLookbehind(e);break;case"NegativeLookbehind":this.visitNegativeLookbehind(e);break;case"Character":this.visitCharacter(e);break;case"Set":this.visitSet(e);break;case"Group":this.visitGroup(e);break;case"GroupBackReference":this.visitGroupBackReference(e);break;case"Quantifier":this.visitQuantifier(e);break}this.visitChildren(e)}visitPattern(e){}visitFlags(e){}visitDisjunction(e){}visitAlternative(e){}visitStartAnchor(e){}visitEndAnchor(e){}visitWordBoundary(e){}visitNonWordBoundary(e){}visitLookahead(e){}visitNegativeLookahead(e){}visitLookbehind(e){}visitNegativeLookbehind(e){}visitCharacter(e){}visitSet(e){}visitGroup(e){}visitGroupBackReference(e){}visitQuantifier(e){}};var Wu=/\r?\n/gm,Xh=new Hn,Bu=class extends xr{constructor(){super(...arguments),this.isStarting=!0,this.endRegexpStack=[],this.multiline=!1}get endRegex(){return this.endRegexpStack.join("")}reset(e){this.multiline=!1,this.regex=e,this.startRegexp="",this.isStarting=!0,this.endRegexpStack=[]}visitGroup(e){e.quantifier&&(this.isStarting=!1,this.endRegexpStack=[])}visitCharacter(e){let r=String.fromCharCode(e.value);if(!this.multiline&&r===` +`&&(this.multiline=!0),e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let n=pn(r);this.endRegexpStack.push(n),this.isStarting&&(this.startRegexp+=n)}}visitSet(e){if(!this.multiline){let r=this.regex.substring(e.loc.begin,e.loc.end),n=new RegExp(r);this.multiline=!!` +`.match(n)}if(e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let r=this.regex.substring(e.loc.begin,e.loc.end);this.endRegexpStack.push(r),this.isStarting&&(this.startRegexp+=r)}}visitChildren(e){e.type==="Group"&&e.quantifier||super.visitChildren(e)}},Yn=new Bu;function Pv(t){try{typeof t!="string"&&(t=t.source),t=`/${t}/`;let e=Xh.pattern(t),r=[];for(let n of e.value.value)Yn.reset(t),Yn.visit(n),r.push({start:Yn.startRegexp,end:Yn.endRegex});return r}catch(e){return[]}}function Vu(t){try{return typeof t=="string"&&(t=new RegExp(t)),t=t.toString(),Yn.reset(t),Yn.visit(Xh.pattern(t)),Yn.multiline}catch(e){return!1}}var Jh=`\f +\r \v \xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF`.split("");function fa(t){let e=typeof t=="string"?new RegExp(t):t;return Jh.some(r=>e.test(r))}function pn(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ku(t,e){let r=Qh(t),n=e.match(r);return!!n&&n[0].length>0}function Qh(t){typeof t=="string"&&(t=new RegExp(t));let e=t,r=t.source,n=0;function i(){let s="",a;function o(l){s+=r.substr(n,l),n+=l}function c(l){s+="(?:"+r.substr(n,l)+"|$)",n+=l}for(;n",n)-n+1);break;default:c(2);break}break;case"[":a=/\[(?:\\.|.)*?\]/g,a.lastIndex=n,a=a.exec(r)||[],c(a[0].length);break;case"|":case"^":case"$":case"*":case"+":case"?":o(1);break;case"{":a=/\{\d+,?\d*\}/g,a.lastIndex=n,a=a.exec(r),a?o(a[0].length):c(1);break;case"(":if(r[n+1]==="?")switch(r[n+2]){case":":s+="(?:",n+=3,s+=i()+"|$)";break;case"=":s+="(?=",n+=3,s+=i()+")";break;case"!":a=n,n+=3,i(),s+=r.substr(a,n-a);break;case"<":switch(r[n+3]){case"=":case"!":a=n,n+=4,i(),s+=r.substr(a,n-a);break;default:o(r.indexOf(">",n)-n+1),s+=i()+"|$)";break}break}else o(1),s+=i()+"|$)";break;case")":return++n,s;default:c(1);break}return s}return new RegExp(i(),t.flags)}function Zh(t){return t.rules.find(e=>nt(e)&&e.entry)}function em(t){return t.rules.filter(e=>kt(e)&&e.hidden)}function da(t,e){let r=new Set,n=Zh(t);if(!n)return new Set(t.rules);let i=[n].concat(em(t));for(let a of i)tm(a,r,e);let s=new Set;for(let a of t.rules)(r.has(a.name)||kt(a)&&a.hidden)&&s.add(a);return s}function tm(t,e,r){e.add(t.name),nr(t).forEach(n=>{if(or(n)||r&&rc(n)){let i=n.rule.ref;i&&!e.has(i.name)&&tm(i,e,r)}})}function Ov(t){let e=new Set;return nr(t).forEach(r=>{ar(r)&&(nt(r.type.ref)&&e.add(r.type.ref),aa(r.type.ref)&&nt(r.type.ref.$container)&&e.add(r.type.ref.$container))}),e}function Xu(t){if(t.terminal)return t.terminal;if(t.type.ref)return uc(t.type.ref)?.terminal}function Ju(t){return t.hidden&&!fa(Li(t))}function Qu(t,e){return!t||!e?[]:Zu(t,e,t.astNode,!0)}function pa(t,e,r){if(!t||!e)return;let n=Zu(t,e,t.astNode,!0);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function Zu(t,e,r,n){if(!n){let i=Dr(t.grammarSource,sr);if(i&&i.feature===e)return[t]}return rr(t)&&t.astNode===r?t.content.flatMap(i=>Zu(i,e,r,!1)):[]}function Lv(t,e){return t?tf(t,e,t?.astNode):[]}function ef(t,e,r){if(!t)return;let n=tf(t,e,t?.astNode);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function tf(t,e,r){if(t.astNode!==r)return[];if(Ht(t.grammarSource)&&t.grammarSource.value===e)return[t];let n=Bn(t).iterator(),i,s=[];do if(i=n.next(),!i.done){let a=i.value;a.astNode===r?Ht(a.grammarSource)&&a.grammarSource.value===e&&s.push(a):n.prune()}while(!i.done);return s}function rf(t){let e=t.astNode;for(;e===t.container?.astNode;){let r=Dr(t.grammarSource,sr);if(r)return r;t=t.container}}function uc(t){let e=t;return aa(e)&&(Ur(e.$container)?e=e.$container.$container:Gr(e.$container)?e=e.$container:Rr(e.$container)),rm(t,e,new Map)}function rm(t,e,r){function n(i,s){let a;return Dr(i,sr)||(a=rm(s,s,r)),r.set(t,a),a}if(r.has(t))return r.get(t);r.set(t,void 0);for(let i of nr(e)){if(sr(i)&&i.feature.toLowerCase()==="name")return r.set(t,i),i;if(or(i)&&nt(i.rule.ref))return n(i,i.rule.ref);if(tc(i)&&i.typeRef?.ref)return n(i,i.typeRef.ref)}}function nm(t){let e=t.$container;if(fn(e)){let r=e.elements,n=r.indexOf(t);for(let i=n-1;i>=0;i--){let s=r[i];if(Ur(s))return s;{let a=nr(r[i]).find(Ur);if(a)return a}}}if(sa(e))return nm(e)}function Dv(t,e){return t==="?"||t==="*"||fn(e)&&!!e.guardCondition}function Mv(t){return t==="*"||t==="+"}function Fv(t){return t==="+="}function ha(t){return im(t,new Set)}function im(t,e){if(e.has(t))return!0;e.add(t);for(let r of nr(t))if(or(r)){if(!r.rule.ref||nt(r.rule.ref)&&!im(r.rule.ref,e)||dn(r.rule.ref))return!1}else{if(sr(r))return!1;if(Ur(r))return!1}return!!t.definition}function Gv(t){return Yu(t.type,new Set)}function Yu(t,e){if(e.has(t))return!0;if(e.add(t),xu(t))return!1;if(Iu(t))return!1;if(Lu(t))return t.types.every(r=>Yu(r,e));if(tc(t)){if(t.primitiveType!==void 0)return!0;if(t.stringType!==void 0)return!0;if(t.typeRef!==void 0){let r=t.typeRef.ref;return nc(r)?Yu(r.type,e):!1}else return!1}else return!1}function fc(t){if(!kt(t)){if(t.inferredType)return t.inferredType.name;if(t.dataType)return t.dataType;if(t.returnType){let e=t.returnType.ref;if(e)return e.name}}}function hn(t){if(Gr(t))return nt(t)&&ha(t)?t.name:fc(t)??t.name;if(ku(t)||nc(t)||bu(t))return t.name;if(Ur(t)){let e=sm(t);if(e)return e}else if(aa(t))return t.name;throw new Error("Cannot get name of Unknown Type")}function sm(t){if(t.inferredType)return t.inferredType.name;if(t.type?.ref)return hn(t.type.ref)}function Uv(t){return kt(t)?t.type?.name??"string":nt(t)&&ha(t)?t.name:fc(t)??t.name}function nf(t){return kt(t)?t.type?.name??"string":fc(t)??t.name}function Li(t){let e={s:!1,i:!1,u:!1},r=Di(t.definition,e),n=Object.entries(e).filter(([,i])=>i).map(([i])=>i).join("");return new RegExp(r,n)}var sf=/[\s\S]/.source;function Di(t,e){if(Pu(t))return qv(t);if(Ou(t))return zv(t);if(Eu(t))return Wv(t);if(rc(t)){let r=t.rule.ref;if(!r)throw new Error("Missing rule reference.");return zr(Di(r.definition),{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized})}else{if(Nu(t))return Bv(t);if(Du(t))return jv(t);if(_u(t)){let r=t.regex.lastIndexOf("/"),n=t.regex.substring(1,r),i=t.regex.substring(r+1);return e&&(e.i=i.includes("i"),e.s=i.includes("s"),e.u=i.includes("u")),zr(n,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1})}else{if(Mu(t))return zr(sf,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized});throw new Error(`Invalid terminal element: ${t?.$type}, ${t?.$cstNode?.text}`)}}}function qv(t){return zr(t.elements.map(e=>Di(e)).join("|"),{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1})}function zv(t){return zr(t.elements.map(e=>Di(e)).join(""),{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1})}function jv(t){return zr(`${sf}*?${Di(t.terminal)}`,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized})}function Bv(t){return zr(`(?!${Di(t.terminal)})${sf}*?`,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized})}function Wv(t){return t.right?zr(`[${Hu(t.left)}-${Hu(t.right)}]`,{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1}):zr(Hu(t.left),{cardinality:t.cardinality,lookahead:t.lookahead,parenthesized:t.parenthesized,wrap:!1})}function Hu(t){return pn(t.value)}function zr(t,e){return(e.parenthesized||e.lookahead||e.wrap!==!1)&&(t=`(${e.lookahead??(e.parenthesized?"":"?:")}${t})`),e.cardinality?`${t}${e.cardinality}`:t}function af(t){let e=[],r=t.Grammar;for(let n of r.rules)kt(n)&&Ju(n)&&Vu(Li(n))&&e.push(n.name);return{multilineCommentRules:e,nameRegexp:sc}}function Mi(t){console&&console.error&&console.error(`Error: ${t}`)}function ma(t){console&&console.warn&&console.warn(`Warning: ${t}`)}function ga(t){let e=new Date().getTime(),r=t();return{time:new Date().getTime()-e,value:r}}function ya(t){function e(){}e.prototype=t;let r=new e;function n(){return typeof r.bar}return n(),n(),t;(0,eval)(t)}function Vv(t){return Kv(t)?t.LABEL:t.name}function Kv(t){return mt(t.LABEL)&&t.LABEL!==""}var jt=class{get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){this._definition=e}accept(e){e.visit(this),D(this.definition,r=>{r.accept(e)})}},pe=class extends jt{constructor(e){super([]),this.idx=1,dt(this,Gt(e,r=>r!==void 0))}set definition(e){}get definition(){return this.referencedRule!==void 0?this.referencedRule.definition:[]}accept(e){e.visit(this)}},Nt=class extends jt{constructor(e){super(e.definition),this.orgText="",dt(this,Gt(e,r=>r!==void 0))}},Ee=class extends jt{constructor(e){super(e.definition),this.ignoreAmbiguities=!1,dt(this,Gt(e,r=>r!==void 0))}},he=class extends jt{constructor(e){super(e.definition),this.idx=1,dt(this,Gt(e,r=>r!==void 0))}},Ae=class extends jt{constructor(e){super(e.definition),this.idx=1,dt(this,Gt(e,r=>r!==void 0))}},$e=class extends jt{constructor(e){super(e.definition),this.idx=1,dt(this,Gt(e,r=>r!==void 0))}},se=class extends jt{constructor(e){super(e.definition),this.idx=1,dt(this,Gt(e,r=>r!==void 0))}},Re=class extends jt{constructor(e){super(e.definition),this.idx=1,dt(this,Gt(e,r=>r!==void 0))}},xe=class extends jt{get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){super(e.definition),this.idx=1,this.ignoreAmbiguities=!1,this.hasPredicates=!1,dt(this,Gt(e,r=>r!==void 0))}},te=class{constructor(e){this.idx=1,dt(this,Gt(e,r=>r!==void 0))}accept(e){e.visit(this)}};function pc(t){return I(t,Fi)}function Fi(t){function e(r){return I(r,Fi)}if(t instanceof pe){let r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return mt(t.label)&&(r.label=t.label),r}else{if(t instanceof Ee)return{type:"Alternative",definition:e(t.definition)};if(t instanceof he)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof Ae)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof $e)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:Fi(new te({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof Re)return{type:"RepetitionWithSeparator",idx:t.idx,separator:Fi(new te({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof se)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof xe)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof te){let r={type:"Terminal",name:t.terminalType.name,label:Vv(t.terminalType),idx:t.idx};mt(t.label)&&(r.terminalLabel=t.label);let n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(r.pattern=tr(n)?n.source:n),r}else{if(t instanceof Nt)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}var Ct=class{visit(e){let r=e;switch(r.constructor){case pe:return this.visitNonTerminal(r);case Ee:return this.visitAlternative(r);case he:return this.visitOption(r);case Ae:return this.visitRepetitionMandatory(r);case $e:return this.visitRepetitionMandatoryWithSeparator(r);case Re:return this.visitRepetitionWithSeparator(r);case se:return this.visitRepetition(r);case xe:return this.visitAlternation(r);case te:return this.visitTerminal(r);case Nt:return this.visitRule(r);default:throw Error("non exhaustive match")}}visitNonTerminal(e){}visitAlternative(e){}visitOption(e){}visitRepetition(e){}visitRepetitionMandatory(e){}visitRepetitionMandatoryWithSeparator(e){}visitRepetitionWithSeparator(e){}visitAlternation(e){}visitTerminal(e){}visitRule(e){}};function of(t){return t instanceof Ee||t instanceof he||t instanceof se||t instanceof Ae||t instanceof $e||t instanceof Re||t instanceof te||t instanceof Nt}function Xn(t,e=[]){return t instanceof he||t instanceof se||t instanceof Re?!0:t instanceof xe?Mo(t.definition,n=>Xn(n,e)):t instanceof pe&&Pe(e,t)?!1:t instanceof jt?(t instanceof pe&&e.push(t),At(t.definition,n=>Xn(n,e))):!1}function cf(t){return t instanceof xe}function Ot(t){if(t instanceof pe)return"SUBRULE";if(t instanceof he)return"OPTION";if(t instanceof xe)return"OR";if(t instanceof Ae)return"AT_LEAST_ONE";if(t instanceof $e)return"AT_LEAST_ONE_SEP";if(t instanceof Re)return"MANY_SEP";if(t instanceof se)return"MANY";if(t instanceof te)return"CONSUME";throw Error("non exhaustive match")}var jr=class{walk(e,r=[]){D(e.definition,(n,i)=>{let s=Ke(e.definition,i+1);if(n instanceof pe)this.walkProdRef(n,s,r);else if(n instanceof te)this.walkTerminal(n,s,r);else if(n instanceof Ee)this.walkFlat(n,s,r);else if(n instanceof he)this.walkOption(n,s,r);else if(n instanceof Ae)this.walkAtLeastOne(n,s,r);else if(n instanceof $e)this.walkAtLeastOneSep(n,s,r);else if(n instanceof Re)this.walkManySep(n,s,r);else if(n instanceof se)this.walkMany(n,s,r);else if(n instanceof xe)this.walkOr(n,s,r);else throw Error("non exhaustive match")})}walkTerminal(e,r,n){}walkProdRef(e,r,n){}walkFlat(e,r,n){let i=r.concat(n);this.walk(e,i)}walkOption(e,r,n){let i=r.concat(n);this.walk(e,i)}walkAtLeastOne(e,r,n){let i=[new he({definition:e.definition})].concat(r,n);this.walk(e,i)}walkAtLeastOneSep(e,r,n){let i=am(e,r,n);this.walk(e,i)}walkMany(e,r,n){let i=[new he({definition:e.definition})].concat(r,n);this.walk(e,i)}walkManySep(e,r,n){let i=am(e,r,n);this.walk(e,i)}walkOr(e,r,n){let i=r.concat(n);D(e.definition,s=>{let a=new Ee({definition:[s]});this.walk(a,i)})}};function am(t,e,r){return[new he({definition:[new te({terminalType:t.separator})].concat(t.definition)})].concat(e,r)}function Jn(t){if(t instanceof pe)return Jn(t.referencedRule);if(t instanceof te)return Xv(t);if(of(t))return Hv(t);if(cf(t))return Yv(t);throw Error("non exhaustive match")}function Hv(t){let e=[],r=t.definition,n=0,i=r.length>n,s,a=!0;for(;i&&a;)s=r[n],a=Xn(s),e=e.concat(Jn(s)),n=n+1,i=r.length>n;return Hs(e)}function Yv(t){let e=I(t.definition,r=>Jn(r));return Hs(Ve(e))}function Xv(t){return[t.terminalType]}var hc="_~IN~_";var lf=class extends jr{constructor(e){super(),this.topProd=e,this.follows={}}startWalking(){return this.walk(this.topProd),this.follows}walkTerminal(e,r,n){}walkProdRef(e,r,n){let i=Jv(e.referencedRule,e.idx)+this.topProd.name,s=r.concat(n),a=new Ee({definition:s}),o=Jn(a);this.follows[i]=o}};function om(t){let e={};return D(t,r=>{let n=new lf(r).startWalking();dt(e,n)}),e}function Jv(t,e){return t.name+e+hc}var mc={},Qv=new Hn;function Gi(t){let e=t.toString();if(mc.hasOwnProperty(e))return mc[e];{let r=Qv.pattern(e);return mc[e]=r,r}}function cm(){mc={}}var um="Complement Sets are not supported for first char optimization",Ta=`Unable to use "first char" lexer optimizations: +`;function fm(t,e=!1){try{let r=Gi(t);return uf(r.value,{},r.flags.ignoreCase)}catch(r){if(r.message===um)e&&ma(`${Ta} Unable to optimize: < ${t.toString()} > + Complement Sets cannot be automatically optimized. + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{let n="";e&&(n=` + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),Mi(`${Ta} + Failed parsing: < ${t.toString()} > + Using the @chevrotain/regexp-to-ast library + Please open an issue at: https://github.com/chevrotain/chevrotain/issues`+n)}}return[]}function uf(t,e,r){switch(t.type){case"Disjunction":for(let i=0;i{if(typeof c=="number")gc(c,e,r);else{let l=c;if(r===!0)for(let u=l.from;u<=l.to;u++)gc(u,e,r);else{for(let u=l.from;u<=l.to&&u=Ui){let u=l.from>=Ui?l.from:Ui,p=l.to,h=vr(u),g=vr(p);for(let C=h;C<=g;C++)e[C]=C}}}});break;case"Group":uf(a.value,e,r);break;default:throw Error("Non Exhaustive Match")}let o=a.quantifier!==void 0&&a.quantifier.atLeast===0;if(a.type==="Group"&&ff(a)===!1||a.type!=="Group"&&o===!1)break}break;default:throw Error("non exhaustive match!")}return Ce(e)}function gc(t,e,r){let n=vr(t);e[n]=n,r===!0&&Zv(t,e)}function Zv(t,e){let r=String.fromCharCode(t),n=r.toUpperCase();if(n!==r){let i=vr(n.charCodeAt(0));e[i]=i}else{let i=r.toLowerCase();if(i!==r){let s=vr(i.charCodeAt(0));e[s]=s}}}function lm(t,e){return Lr(t.value,r=>{if(typeof r=="number")return Pe(e,r);{let n=r;return Lr(e,i=>n.from<=i&&i<=n.to)!==void 0}})}function ff(t){let e=t.quantifier;return e&&e.atLeast===0?!0:t.value?Ze(t.value)?At(t.value,ff):ff(t.value):!1}var df=class extends xr{constructor(e){super(),this.targetCharCodes=e,this.found=!1}visitChildren(e){if(this.found!==!0){switch(e.type){case"Lookahead":this.visitLookahead(e);return;case"NegativeLookahead":this.visitNegativeLookahead(e);return;case"Lookbehind":this.visitLookbehind(e);return;case"NegativeLookbehind":this.visitNegativeLookbehind(e);return}super.visitChildren(e)}}visitCharacter(e){Pe(this.targetCharCodes,e.value)&&(this.found=!0)}visitSet(e){e.complement?lm(e,this.targetCharCodes)===void 0&&(this.found=!0):lm(e,this.targetCharCodes)!==void 0&&(this.found=!0)}};function yc(t,e){if(e instanceof RegExp){let r=Gi(e),n=new df(t);return n.visit(r),n.found}else return Lr(e,r=>Pe(t,r.charCodeAt(0)))!==void 0}var Qn="PATTERN",qi="defaultMode",Tc="modes";function pm(t,e){e=Ks(e,{debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` +`],tracer:(b,E)=>E()});let r=e.tracer;r("initCharCodeToOptimizedIndexMap",()=>{TE()});let n;r("Reject Lexer.NA",()=>{n=In(t,b=>b[Qn]===He.NA)});let i=!1,s;r("Transform Patterns",()=>{i=!1,s=I(n,b=>{let E=b[Qn];if(tr(E)){let H=E.source;return H.length===1&&H!=="^"&&H!=="$"&&H!=="."&&!E.ignoreCase?H:H.length===2&&H[0]==="\\"&&!Pe(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],H[1])?H[1]:dm(E)}else{if(mr(E))return i=!0,{exec:E};if(typeof E=="object")return i=!0,E;if(typeof E=="string"){if(E.length===1)return E;{let H=E.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),F=new RegExp(H);return dm(F)}}else throw Error("non exhaustive match")}})});let a,o,c,l,u;r("misc mapping",()=>{a=I(n,b=>b.tokenTypeIdx),o=I(n,b=>{let E=b.GROUP;if(E!==He.SKIPPED){if(mt(E))return E;if($t(E))return!1;throw Error("non exhaustive match")}}),c=I(n,b=>{let E=b.LONGER_ALT;if(E)return Ze(E)?I(E,F=>hu(n,F)):[hu(n,E)]}),l=I(n,b=>b.PUSH_MODE),u=I(n,b=>q(b,"POP_MODE"))});let p;r("Line Terminator Handling",()=>{let b=vm(e.lineTerminatorCharacters);p=I(n,E=>!1),e.positionTracking!=="onlyOffset"&&(p=I(n,E=>q(E,"LINE_BREAKS")?!!E.LINE_BREAKS:xm(E,b)===!1&&yc(b,E.PATTERN)))});let h,g,C,k;r("Misc Mapping #2",()=>{h=I(n,Tm),g=I(s,gE),C=Ue(n,(b,E)=>{let H=E.GROUP;return mt(H)&&H!==He.SKIPPED&&(b[H]=[]),b},{}),k=I(s,(b,E)=>({pattern:s[E],longerAlt:c[E],canLineTerminator:p[E],isCustom:h[E],short:g[E],group:o[E],push:l[E],pop:u[E],tokenTypeIdx:a[E],tokenType:n[E]}))});let G=!0,M=[];return e.safeMode||r("First Char Optimization",()=>{M=Ue(n,(b,E,H)=>{if(typeof E.PATTERN=="string"){let F=E.PATTERN.charCodeAt(0),ye=vr(F);pf(b,ye,k[H])}else if(Ze(E.START_CHARS_HINT)){let F;D(E.START_CHARS_HINT,ye=>{let dr=typeof ye=="string"?ye.charCodeAt(0):ye,Je=vr(dr);F!==Je&&(F=Je,pf(b,Je,k[H]))})}else if(tr(E.PATTERN))if(E.PATTERN.unicode)G=!1,e.ensureOptimizations&&Mi(`${Ta} Unable to analyze < ${E.PATTERN.toString()} > pattern. + The regexp unicode flag is not currently supported by the regexp-to-ast library. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{let F=fm(E.PATTERN,e.ensureOptimizations);Z(F)&&(G=!1),D(F,ye=>{pf(b,ye,k[H])})}else e.ensureOptimizations&&Mi(`${Ta} TokenType: <${E.name}> is using a custom token pattern without providing parameter. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),G=!1;return b},[])}),{emptyGroups:C,patternIdxToConfig:k,charCodeToPatternIdxToConfig:M,hasCustom:i,canBeOptimized:G}}function hm(t,e){let r=[],n=tE(t);r=r.concat(n.errors);let i=rE(n.valid),s=i.valid;return r=r.concat(i.errors),r=r.concat(eE(s)),r=r.concat(uE(s)),r=r.concat(fE(s,e)),r=r.concat(dE(s)),r}function eE(t){let e=[],r=ct(t,n=>tr(n[Qn]));return e=e.concat(iE(r)),e=e.concat(oE(r)),e=e.concat(cE(r)),e=e.concat(lE(r)),e=e.concat(sE(r)),e}function tE(t){let e=ct(t,i=>!q(i,Qn)),r=I(e,i=>({message:"Token Type: ->"+i.name+"<- missing static 'PATTERN' property",type:Le.MISSING_PATTERN,tokenTypes:[i]})),n=wn(t,e);return{errors:r,valid:n}}function rE(t){let e=ct(t,i=>{let s=i[Qn];return!tr(s)&&!mr(s)&&!q(s,"exec")&&!mt(s)}),r=I(e,i=>({message:"Token Type: ->"+i.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:Le.INVALID_PATTERN,tokenTypes:[i]})),n=wn(t,e);return{errors:r,valid:n}}var nE=/[^\\][$]/;function iE(t){class e extends xr{constructor(){super(...arguments),this.found=!1}visitEndAnchor(s){this.found=!0}}let r=ct(t,i=>{let s=i.PATTERN;try{let a=Gi(s),o=new e;return o.visit(a),o.found}catch(a){return nE.test(s.source)}});return I(r,i=>({message:`Unexpected RegExp Anchor Error: + Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain end of input anchor '$' + See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Le.EOI_ANCHOR_FOUND,tokenTypes:[i]}))}function sE(t){let e=ct(t,n=>n.PATTERN.test(""));return I(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' must not match an empty string",type:Le.EMPTY_MATCH_PATTERN,tokenTypes:[n]}))}var aE=/[^\\[][\^]|^\^/;function oE(t){class e extends xr{constructor(){super(...arguments),this.found=!1}visitStartAnchor(s){this.found=!0}}let r=ct(t,i=>{let s=i.PATTERN;try{let a=Gi(s),o=new e;return o.visit(a),o.found}catch(a){return aE.test(s.source)}});return I(r,i=>({message:`Unexpected RegExp Anchor Error: + Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain start of input anchor '^' + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Le.SOI_ANCHOR_FOUND,tokenTypes:[i]}))}function cE(t){let e=ct(t,n=>{let i=n[Qn];return i instanceof RegExp&&(i.multiline||i.global)});return I(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:Le.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[n]}))}function lE(t){let e=[],r=I(t,s=>Ue(t,(a,o)=>(s.PATTERN.source===o.PATTERN.source&&!Pe(e,o)&&o.PATTERN!==He.NA&&(e.push(o),a.push(o)),a),[]));r=Or(r);let n=ct(r,s=>s.length>1);return I(n,s=>{let a=I(s,c=>c.name);return{message:`The same RegExp pattern ->${pt(s).PATTERN}<-has been used in all of the following Token Types: ${a.join(", ")} <-`,type:Le.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}})}function uE(t){let e=ct(t,n=>{if(!q(n,"GROUP"))return!1;let i=n.GROUP;return i!==He.SKIPPED&&i!==He.NA&&!mt(i)});return I(e,n=>({message:"Token Type: ->"+n.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:Le.INVALID_GROUP_TYPE_FOUND,tokenTypes:[n]}))}function fE(t,e){let r=ct(t,i=>i.PUSH_MODE!==void 0&&!Pe(e,i.PUSH_MODE));return I(r,i=>({message:`Token Type: ->${i.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${i.PUSH_MODE}<-which does not exist`,type:Le.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[i]}))}function dE(t){let e=[],r=Ue(t,(n,i,s)=>{let a=i.PATTERN;return a===He.NA||(mt(a)?n.push({str:a,idx:s,tokenType:i}):tr(a)&&hE(a)&&n.push({str:a.source,idx:s,tokenType:i})),n},[]);return D(t,(n,i)=>{D(r,({str:s,idx:a,tokenType:o})=>{if(i${o.name}<- can never be matched. +Because it appears AFTER the Token Type ->${n.name}<-in the lexer's definition. +See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:Le.UNREACHABLE_PATTERN,tokenTypes:[n,o]})}})}),e}function pE(t,e){if(tr(e)){if(mE(e))return!1;let r=e.exec(t);return r!==null&&r.index===0}else{if(mr(e))return e(t,0,[],{});if(q(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function hE(t){return Lr([".","\\","[","]","|","^","$","(",")","?","*","+","{"],r=>t.source.indexOf(r)!==-1)===void 0}function mE(t){return/(\(\?=)|(\(\?!)|(\(\?<=)|(\(\? property in its definition +`,type:Le.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),q(t,Tc)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+Tc+`> property in its definition +`,type:Le.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),q(t,Tc)&&q(t,qi)&&!q(t.modes,t.defaultMode)&&n.push({message:`A MultiMode Lexer cannot be initialized with a ${qi}: <${t.defaultMode}>which does not exist +`,type:Le.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),q(t,Tc)&&D(t.modes,(i,s)=>{D(i,(a,o)=>{if($t(a))n.push({message:`A Lexer cannot be initialized using an undefined Token Type. Mode:<${s}> at index: <${o}> +`,type:Le.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if(q(a,"LONGER_ALT")){let c=Ze(a.LONGER_ALT)?a.LONGER_ALT:[a.LONGER_ALT];D(c,l=>{!$t(l)&&!Pe(i,l)&&n.push({message:`A MultiMode Lexer cannot be initialized with a longer_alt <${l.name}> on token <${a.name}> outside of mode <${s}> +`,type:Le.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),n}function gm(t,e,r){let n=[],i=!1,s=Or(Ve(Ce(t.modes))),a=In(s,c=>c[Qn]===He.NA),o=vm(r);return e&&D(a,c=>{let l=xm(c,o);if(l!==!1){let p={message:yE(c,l),type:l.issue,tokenType:c};n.push(p)}else q(c,"LINE_BREAKS")?c.LINE_BREAKS===!0&&(i=!0):yc(o,c.PATTERN)&&(i=!0)}),e&&!i&&n.push({message:`Warning: No LINE_BREAKS Found. + This Lexer has been defined to track line and column information, + But none of the Token Types can be identified as matching a line terminator. + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + for details.`,type:Le.NO_LINE_BREAKS_FLAGS}),n}function ym(t){let e={},r=Pr(t);return D(r,n=>{let i=t[n];if(Ze(i))e[n]=[];else throw Error("non exhaustive match")}),e}function Tm(t){let e=t.PATTERN;if(tr(e))return!1;if(mr(e))return!0;if(q(e,"exec"))return!0;if(mt(e))return!1;throw Error("non exhaustive match")}function gE(t){return mt(t)&&t.length===1?t.charCodeAt(0):!1}var Rm={test:function(t){let e=t.length;for(let r=this.lastIndex;r Token Type + Root cause: ${e.errMsg}. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR`;if(e.issue===Le.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. + The problem is in the <${t.name}> Token Type + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK`;throw Error("non exhaustive match")}function vm(t){return I(t,r=>mt(r)?r.charCodeAt(0):r)}function pf(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}var Ui=256,Rc=[];function vr(t){return t255?255+~~(t/255):t}}function Br(t,e){let r=t.tokenTypeIdx;return r===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[r]===!0}function zi(t,e){return t.tokenTypeIdx===e.tokenTypeIdx}var Em=1,$m={};function Wr(t){let e=RE(t);xE(e),EE(e),vE(e),D(e,r=>{r.isParent=r.categoryMatches.length>0})}function RE(t){let e=Ne(t),r=t,n=!0;for(;n;){r=Or(Ve(I(r,s=>s.CATEGORIES)));let i=wn(r,e);e=e.concat(i),Z(i)?n=!1:r=i}return e}function xE(t){D(t,e=>{hf(e)||($m[Em]=e,e.tokenTypeIdx=Em++),Am(e)&&!Ze(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Am(e)||(e.CATEGORIES=[]),AE(e)||(e.categoryMatches=[]),$E(e)||(e.categoryMatchesMap={})})}function vE(t){D(t,e=>{e.categoryMatches=[],D(e.categoryMatchesMap,(r,n)=>{e.categoryMatches.push($m[n].tokenTypeIdx)})})}function EE(t){D(t,e=>{Sm([],e)})}function Sm(t,e){D(t,r=>{e.categoryMatchesMap[r.tokenTypeIdx]=!0}),D(e.CATEGORIES,r=>{let n=t.concat(e);Pe(n,r)||Sm(n,r)})}function hf(t){return q(t,"tokenTypeIdx")}function Am(t){return q(t,"CATEGORIES")}function AE(t){return q(t,"categoryMatches")}function $E(t){return q(t,"categoryMatchesMap")}function km(t){return q(t,"tokenTypeIdx")}var ji={buildUnableToPopLexerModeMessage(t){return`Unable to pop Lexer Mode after encountering Token ->${t.image}<- The Mode Stack is empty`},buildUnexpectedCharactersMessage(t,e,r,n,i,s){return`unexpected character: ->${t.charAt(e)}<- at offset: ${e}, skipped ${r} characters.`}};var Le=(function(t){return t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",t[t.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE",t})(Le||{}),Ra={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` +`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:ji,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(Ra);var He=(()=>{class t{constructor(r,n=Ra){if(this.lexerDefinition=r,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=(s,a)=>{if(this.traceInitPerf===!0){this.traceInitIndent++;let o=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${s}>`);let{time:c,value:l}=ga(a),u=c>10?console.warn:console.log;return this.traceInitIndent time: ${c}ms`),this.traceInitIndent--,l}else return a()},typeof n=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. +a boolean 2nd argument is no longer supported`);this.config=dt({},Ra,n);let i=this.config.traceInitPerf;i===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof i=="number"&&(this.traceInitMaxIdent=i,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",()=>{let s,a=!0;this.TRACE_INIT("Lexer Config handling",()=>{if(this.config.lineTerminatorsPattern===Ra.lineTerminatorsPattern)this.config.lineTerminatorsPattern=Rm;else if(this.config.lineTerminatorCharacters===Ra.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(n.safeMode&&n.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');this.trackStartLines=/full|onlyStart/i.test(this.config.positionTracking),this.trackEndLines=/full/i.test(this.config.positionTracking),Ze(r)?s={modes:{defaultMode:Ne(r)},defaultMode:qi}:(a=!1,s=Ne(r))}),this.config.skipValidations===!1&&(this.TRACE_INIT("performRuntimeChecks",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(mm(s,this.trackStartLines,this.config.lineTerminatorCharacters))}),this.TRACE_INIT("performWarningRuntimeChecks",()=>{this.lexerDefinitionWarning=this.lexerDefinitionWarning.concat(gm(s,this.trackStartLines,this.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},D(s.modes,(c,l)=>{s.modes[l]=In(c,u=>$t(u))});let o=Pr(s.modes);if(D(s.modes,(c,l)=>{this.TRACE_INIT(`Mode: <${l}> processing`,()=>{if(this.modes.push(l),this.config.skipValidations===!1&&this.TRACE_INIT("validatePatterns",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(hm(c,o))}),Z(this.lexerDefinitionErrors)){Wr(c);let u;this.TRACE_INIT("analyzeTokenTypes",()=>{u=pm(c,{lineTerminatorCharacters:this.config.lineTerminatorCharacters,positionTracking:n.positionTracking,ensureOptimizations:n.ensureOptimizations,safeMode:n.safeMode,tracer:this.TRACE_INIT})}),this.patternIdxToConfig[l]=u.patternIdxToConfig,this.charCodeToPatternIdxToConfig[l]=u.charCodeToPatternIdxToConfig,this.emptyGroups=dt({},this.emptyGroups,u.emptyGroups),this.hasCustom=u.hasCustom||this.hasCustom,this.canModeBeOptimized[l]=u.canBeOptimized}})}),this.defaultMode=s.defaultMode,!Z(this.lexerDefinitionErrors)&&!this.config.deferDefinitionErrorsHandling){let l=I(this.lexerDefinitionErrors,u=>u.message).join(`----------------------- +`);throw new Error(`Errors detected in definition of Lexer: +`+l)}D(this.lexerDefinitionWarning,c=>{ma(c.message)}),this.TRACE_INIT("Choosing sub-methods implementations",()=>{if(a&&(this.handleModes=et),this.trackStartLines===!1&&(this.computeNewColumn=Gh),this.trackEndLines===!1&&(this.updateTokenEndLineColumnLocation=et),/full/i.test(this.config.positionTracking))this.createTokenInstance=this.createFullToken;else if(/onlyStart/i.test(this.config.positionTracking))this.createTokenInstance=this.createStartOnlyToken;else if(/onlyOffset/i.test(this.config.positionTracking))this.createTokenInstance=this.createOffsetOnlyToken;else throw Error(`Invalid config option: "${this.config.positionTracking}"`);this.hasCustom?(this.addToken=this.addTokenUsingPush,this.handlePayload=this.handlePayloadWithCustom):(this.addToken=this.addTokenUsingMemberAccess,this.handlePayload=this.handlePayloadNoCustom)}),this.TRACE_INIT("Failed Optimization Warnings",()=>{let c=Ue(this.canModeBeOptimized,(l,u,p)=>(u===!1&&l.push(p),l),[]);if(n.ensureOptimizations&&!Z(c))throw Error(`Lexer Modes: < ${c.join(", ")} > cannot be optimized. + Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. + Or inspect the console log for details on how to resolve these issues.`)}),this.TRACE_INIT("clearRegExpParserCache",()=>{cm()}),this.TRACE_INIT("toFastProperties",()=>{ya(this)})})}tokenize(r,n=this.defaultMode){if(!Z(this.lexerDefinitionErrors)){let s=I(this.lexerDefinitionErrors,a=>a.message).join(`----------------------- +`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: +`+s)}return this.tokenizeInternal(r,n)}tokenizeInternal(r,n){let i,s,a,o,c,l,u,p,h,g,C,k,G,M,b,E=r,H=E.length,F=0,ye=0,dr=this.hasCustom?0:Math.floor(r.length/10),Je=new Array(dr),Qt=[],Kt=this.trackStartLines?1:void 0,$=this.trackStartLines?1:void 0,y=ym(this.emptyGroups),L=this.trackStartLines,O=this.config.lineTerminatorsPattern,T=0,x=[],A=[],_=[],U=[];Object.freeze(U);let N=!1,Y=ve=>{if(_.length===1&&ve.tokenType.PUSH_MODE===void 0){let We=this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(ve);Qt.push({offset:ve.startOffset,line:ve.startLine,column:ve.startColumn,length:ve.image.length,message:We})}else{_.pop();let We=gr(_);x=this.patternIdxToConfig[We],A=this.charCodeToPatternIdxToConfig[We],T=x.length;let js=this.canModeBeOptimized[We]&&this.config.safeMode===!1;A&&js?N=!0:N=!1}};function Q(ve){_.push(ve),A=this.charCodeToPatternIdxToConfig[ve],x=this.patternIdxToConfig[ve],T=x.length,T=x.length;let We=this.canModeBeOptimized[ve]&&this.config.safeMode===!1;A&&We?N=!0:N=!1}Q.call(this,n);let de,ue=this.config.recoveryEnabled;for(;Fl.length){l=o,h=o.length,u=p,de=Zt;break}}}break}}if(h!==-1){if(g=de.group,g!==void 0&&(l=l!==null?l:r.substring(F,F+h),C=de.tokenTypeIdx,k=this.createTokenInstance(l,F,C,de.tokenType,Kt,$,h),this.handlePayload(k,u),g===!1?ye=this.addToken(Je,ye,k):y[g].push(k)),L===!0&&de.canLineTerminator===!0){let ot=0,_t,pr;O.lastIndex=0;do l=l!==null?l:r.substring(F,F+h),_t=O.test(l),_t===!0&&(pr=O.lastIndex-1,ot++);while(_t===!0);ot!==0?(Kt=Kt+ot,$=h-pr,this.updateTokenEndLineColumnLocation(k,g,pr,ot,Kt,$,h)):$=this.computeNewColumn($,h)}else $=this.computeNewColumn($,h);F=F+h,this.handleModes(de,Y,Q,k)}else{let ot=F,_t=Kt,pr=$,Zt=ue===!1;for(;Zt===!1&&F ${Vr(t)} <--`:`token of type --> ${t.name} <--`} but found --> '${e.image}' <--`},buildNotAllInputParsedMessage({firstRedundant:t,ruleName:e}){return"Redundant input, expecting EOF but found: "+t.image},buildNoViableAltMessage({expectedPathsPerAlt:t,actual:e,previous:r,customUserDescription:n,ruleName:i}){let s="Expecting: ",o=` +but found: '`+pt(e).image+"'";if(n)return s+n+o;{let c=Ue(t,(h,g)=>h.concat(g),[]),l=I(c,h=>`[${I(h,g=>Vr(g)).join(", ")}]`),p=`one of these possible Token sequences: +${I(l,(h,g)=>` ${g+1}. ${h}`).join(` +`)}`;return s+p+o}},buildEarlyExitMessage({expectedIterationPaths:t,actual:e,customUserDescription:r,ruleName:n}){let i="Expecting: ",a=` +but found: '`+pt(e).image+"'";if(r)return i+r+a;{let c=`expecting at least one iteration which starts with one of these possible Token sequences:: + <${I(t,l=>`[${I(l,u=>Vr(u)).join(",")}]`).join(" ,")}>`;return i+c+a}}};Object.freeze(Hr);var Lm={buildRuleNotFoundError(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- +inside top level rule: ->`+t.name+"<-"}},cr={buildDuplicateFoundError(t,e){function r(u){return u instanceof te?u.terminalType.name:u instanceof pe?u.nonTerminalName:""}let n=t.name,i=pt(e),s=i.idx,a=Ot(i),o=r(i),c=s>0,l=`->${a}${c?s:""}<- ${o?`with argument: ->${o}<-`:""} + appears more than once (${e.length} times) in the top level rule: ->${n}<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + `;return l=l.replace(/[ \t]+/g," "),l=l.replace(/\s\s+/g,` +`),l},buildNamespaceConflictError(t){return`Namespace conflict found in grammar. +The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${t.name}>. +To resolve this make sure each Terminal and Non-Terminal names are unique +This is easy to accomplish by using the convention that Terminal names start with an uppercase letter +and Non-Terminal names start with a lower case letter.`},buildAlternationPrefixAmbiguityError(t){let e=I(t.prefixPath,i=>Vr(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx;return`Ambiguous alternatives: <${t.ambiguityIndices.join(" ,")}> due to common lookahead prefix +in inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX +For Further details.`},buildAlternationAmbiguityError(t){let e=t.alternation.idx===0?"":t.alternation.idx,r=t.prefixPath.length===0,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(" ,")}> in inside <${t.topLevelRule.name}> Rule, +`;if(r)n+=`These alternatives are all empty (match no tokens), making them indistinguishable. +Only the last alternative may be empty. +`;else{let i=I(t.prefixPath,s=>Vr(s)).join(", ");n+=`<${i}> may appears as a prefix path in all these alternatives. +`}return n+=`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,n},buildEmptyRepetitionError(t){let e=Ot(t.repetition);return t.repetition.idx!==0&&(e+=t.repetition.idx),`The repetition <${e}> within Rule <${t.topLevelRule.name}> can never consume any tokens. +This could lead to an infinite loop.`},buildTokenNameError(t){return"deprecated"},buildEmptyAlternationError(t){return`Ambiguous empty alternative: <${t.emptyChoiceIdx+1}> in inside <${t.topLevelRule.name}> Rule. +Only the last alternative may be an empty alternative.`},buildTooManyAlternativesError(t){return`An Alternation cannot have more than 256 alternatives: + inside <${t.topLevelRule.name}> Rule. + has ${t.alternation.definition.length+1} alternatives.`},buildLeftRecursionError(t){let e=t.topLevelRule.name,r=I(t.leftRecursionPath,s=>s.name),n=`${e} --> ${r.concat([e]).join(" --> ")}`;return`Left Recursion found in grammar. +rule: <${e}> can be invoked from itself (directly or indirectly) +without consuming any Tokens. The grammar path that causes this is: + ${n} + To fix this refactor your grammar to remove the left recursion. +see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError(t){return"deprecated"},buildDuplicateRuleNameError(t){let e;return t.topLevelRule instanceof Nt?e=t.topLevelRule.name:e=t.topLevelRule,`Duplicate definition, rule: ->${e}<- is already defined in the grammar: ->${t.grammarName}<-`}};function Dm(t,e){let r=new gf(t,e);return r.resolveRefs(),r.errors}var gf=class extends Ct{constructor(e,r){super(),this.nameToTopRule=e,this.errMsgProvider=r,this.errors=[]}resolveRefs(){D(Ce(this.nameToTopRule),e=>{this.currTopLevel=e,e.accept(this)})}visitNonTerminal(e){let r=this.nameToTopRule[e.nonTerminalName];if(r)e.referencedRule=r;else{let n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:n,type:it.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}};var yf=class extends jr{constructor(e,r){super(),this.topProd=e,this.path=r,this.possibleTokTypes=[],this.nextProductionName="",this.nextProductionOccurrence=0,this.found=!1,this.isAtEndOfPath=!1}startWalking(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=Ne(this.path.ruleStack).reverse(),this.occurrenceStack=Ne(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes}walk(e,r=[]){this.found||super.walk(e,r)}walkProdRef(e,r,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){let i=r.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,i)}}updateExpectedNext(){Z(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}},xc=class extends yf{constructor(e,r){super(e,r),this.path=r,this.nextTerminalName="",this.nextTerminalOccurrence=0,this.nextTerminalName=this.path.lastTok.name,this.nextTerminalOccurrence=this.path.lastTokOccurrence}walkTerminal(e,r,n){if(this.isAtEndOfPath&&e.terminalType.name===this.nextTerminalName&&e.idx===this.nextTerminalOccurrence&&!this.found){let i=r.concat(n),s=new Ee({definition:i});this.possibleTokTypes=Jn(s),this.found=!0}}},Bi=class extends jr{constructor(e,r){super(),this.topRule=e,this.occurrence=r,this.result={token:void 0,occurrence:void 0,isEndOfRule:void 0}}startWalking(){return this.walk(this.topRule),this.result}},vc=class extends Bi{walkMany(e,r,n){if(e.idx===this.occurrence){let i=pt(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof te&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkMany(e,r,n)}},va=class extends Bi{walkManySep(e,r,n){if(e.idx===this.occurrence){let i=pt(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof te&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkManySep(e,r,n)}},Ec=class extends Bi{walkAtLeastOne(e,r,n){if(e.idx===this.occurrence){let i=pt(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof te&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOne(e,r,n)}},Ea=class extends Bi{walkAtLeastOneSep(e,r,n){if(e.idx===this.occurrence){let i=pt(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof te&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOneSep(e,r,n)}};function Ac(t,e,r=[]){r=Ne(r);let n=[],i=0;function s(o){return o.concat(Ke(t,i+1))}function a(o){let c=Ac(s(o),e,r);return n.concat(c)}for(;r.length{Z(c.definition)===!1&&(n=a(c.definition))}),n;if(o instanceof te)r.push(o.terminalType);else throw Error("non exhaustive match")}i++}return n.push({partialPath:r,suffixDef:Ke(t,i)}),n}function $c(t,e,r,n){let i="EXIT_NONE_TERMINAL",s=[i],a="EXIT_ALTERNATIVE",o=!1,c=e.length,l=c-n-1,u=[],p=[];for(p.push({idx:-1,def:t,ruleStack:[],occurrenceStack:[]});!Z(p);){let h=p.pop();if(h===a){o&&gr(p).idx<=l&&p.pop();continue}let g=h.def,C=h.idx,k=h.ruleStack,G=h.occurrenceStack;if(Z(g))continue;let M=g[0];if(M===i){let b={idx:C,def:Ke(g),ruleStack:tn(k),occurrenceStack:tn(G)};p.push(b)}else if(M instanceof te)if(C=0;b--){let E=M.definition[b],H={idx:C,def:E.definition.concat(Ke(g)),ruleStack:k,occurrenceStack:G};p.push(H),p.push(a)}else if(M instanceof Ee)p.push({idx:C,def:M.definition.concat(Ke(g)),ruleStack:k,occurrenceStack:G});else if(M instanceof Nt)p.push(NE(M,C,k,G));else throw Error("non exhaustive match")}return u}function NE(t,e,r,n){let i=Ne(r);i.push(t.name);let s=Ne(n);return s.push(1),{idx:e,def:t.definition,ruleStack:i,occurrenceStack:s}}var De=(function(t){return t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION",t})(De||{});function Aa(t){if(t instanceof he||t==="Option")return De.OPTION;if(t instanceof se||t==="Repetition")return De.REPETITION;if(t instanceof Ae||t==="RepetitionMandatory")return De.REPETITION_MANDATORY;if(t instanceof $e||t==="RepetitionMandatoryWithSeparator")return De.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof Re||t==="RepetitionWithSeparator")return De.REPETITION_WITH_SEPARATOR;if(t instanceof xe||t==="Alternation")return De.ALTERNATION;throw Error("non exhaustive match")}function kc(t){let{occurrence:e,rule:r,prodType:n,maxLookahead:i}=t,s=Aa(n);return s===De.ALTERNATION?Wi(e,r,i):Vi(e,r,s,i)}function Fm(t,e,r,n,i,s){let a=Wi(t,e,r),o=Bm(a)?zi:Br;return s(a,n,o,i)}function Gm(t,e,r,n,i,s){let a=Vi(t,e,i,r),o=Bm(a)?zi:Br;return s(a[0],o,n)}function Um(t,e,r,n){let i=t.length,s=At(t,a=>At(a,o=>o.length===1));if(e)return function(a){let o=I(a,c=>c.GATE);for(let c=0;cVe(c)),o=Ue(a,(c,l,u)=>(D(l,p=>{q(c,p.tokenTypeIdx)||(c[p.tokenTypeIdx]=u),D(p.categoryMatches,h=>{q(c,h)||(c[h]=u)})}),c),{});return function(){let c=this.LA(1);return o[c.tokenTypeIdx]}}else return function(){for(let a=0;as.length===1),i=t.length;if(n&&!r){let s=Ve(t);if(s.length===1&&Z(s[0].categoryMatches)){let o=s[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===o}}else{let a=Ue(s,(o,c,l)=>(o[c.tokenTypeIdx]=!0,D(c.categoryMatches,u=>{o[u]=!0}),o),[]);return function(){let o=this.LA(1);return a[o.tokenTypeIdx]===!0}}}else return function(){e:for(let s=0;sAc([a],1)),n=Mm(r.length),i=I(r,a=>{let o={};return D(a,c=>{let l=Tf(c.partialPath);D(l,u=>{o[u]=!0})}),o}),s=r;for(let a=1;a<=e;a++){let o=s;s=Mm(o.length);for(let c=0;c{let M=Tf(G.partialPath);D(M,b=>{i[c][b]=!0})})}}}}return n}function Wi(t,e,r,n){let i=new Sc(t,De.ALTERNATION,n);return e.accept(i),zm(i.result,r)}function Vi(t,e,r,n){let i=new Sc(t,r);e.accept(i);let s=i.result,o=new Rf(e,t,r).startWalking(),c=new Ee({definition:s}),l=new Ee({definition:o});return zm([c,l],n)}function Nc(t,e){e:for(let r=0;r{let i=e[n];return r===i||i.categoryMatchesMap[r.tokenTypeIdx]})}function Bm(t){return At(t,e=>At(e,r=>At(r,n=>Z(n.categoryMatches))))}function Wm(t){let e=t.lookaheadStrategy.validate({rules:t.rules,tokenTypes:t.tokenTypes,grammarName:t.grammarName});return I(e,r=>Object.assign({type:it.CUSTOM_LOOKAHEAD_VALIDATION},r))}function Vm(t,e,r,n){let i=ht(t,c=>wE(c,r)),s=LE(t,e,r),a=ht(t,c=>bE(c,r)),o=ht(t,c=>_E(c,t,n,r));return i.concat(s,a,o)}function wE(t,e){let r=new xf;t.accept(r);let n=r.allProductions,i=Uh(n,IE),s=Gt(i,o=>o.length>1);return I(Ce(s),o=>{let c=pt(o),l=e.buildDuplicateFoundError(t,o),u=Ot(c),p={message:l,type:it.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:u,occurrence:c.idx},h=Km(c);return h&&(p.parameter=h),p})}function IE(t){return`${Ot(t)}_#_${t.idx}_#_${Km(t)}`}function Km(t){return t instanceof te?t.terminalType.name:t instanceof pe?t.nonTerminalName:""}var xf=class extends Ct{constructor(){super(...arguments),this.allProductions=[]}visitNonTerminal(e){this.allProductions.push(e)}visitOption(e){this.allProductions.push(e)}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}visitAlternation(e){this.allProductions.push(e)}visitTerminal(e){this.allProductions.push(e)}};function _E(t,e,r,n){let i=[];if(Ue(e,(a,o)=>o.name===t.name?a+1:a,0)>1){let a=n.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});i.push({message:a,type:it.DUPLICATE_RULE_NAME,ruleName:t.name})}return i}function Hm(t,e,r){let n=[],i;return Pe(e,t)||(i=`Invalid rule override, rule: ->${t}<- cannot be overridden in the grammar: ->${r}<-as it is not defined in any of the super grammars `,n.push({message:i,type:it.INVALID_RULE_OVERRIDE,ruleName:t})),n}function Ef(t,e,r,n=[]){let i=[],s=Cc(e.definition);if(Z(s))return[];{let a=t.name;Pe(s,t)&&i.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:n}),type:it.LEFT_RECURSION,ruleName:a});let c=wn(s,n.concat([t])),l=ht(c,u=>{let p=Ne(n);return p.push(u),Ef(t,u,r,p)});return i.concat(l)}}function Cc(t){let e=[];if(Z(t))return e;let r=pt(t);if(r instanceof pe)e.push(r.referencedRule);else if(r instanceof Ee||r instanceof he||r instanceof Ae||r instanceof $e||r instanceof Re||r instanceof se)e=e.concat(Cc(r.definition));else if(r instanceof xe)e=Ve(I(r.definition,s=>Cc(s.definition)));else if(!(r instanceof te))throw Error("non exhaustive match");let n=Xn(r),i=t.length>1;if(n&&i){let s=Ke(t);return e.concat(Cc(s))}else return e}var $a=class extends Ct{constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}};function Ym(t,e){let r=new $a;t.accept(r);let n=r.alternations;return ht(n,s=>{let a=tn(s.definition);return ht(a,(o,c)=>{let l=$c([o],[],Br,1);return Z(l)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:s,emptyChoiceIdx:c}),type:it.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:s.idx,alternative:c+1}]:[]})})}function Xm(t,e,r){let n=new $a;t.accept(n);let i=n.alternations;return i=In(i,a=>a.ignoreAmbiguities===!0),ht(i,a=>{let o=a.idx,c=a.maxLookahead||e,l=Wi(o,t,c,a),u=PE(l,a,t,r),p=OE(l,a,t,r);return u.concat(p)})}var vf=class extends Ct{constructor(){super(...arguments),this.allProductions=[]}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}};function bE(t,e){let r=new $a;t.accept(r);let n=r.alternations;return ht(n,s=>s.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:s}),type:it.TOO_MANY_ALTS,ruleName:t.name,occurrence:s.idx}]:[])}function Jm(t,e,r){let n=[];return D(t,i=>{let s=new vf;i.accept(s);let a=s.allProductions;D(a,o=>{let c=Aa(o),l=o.maxLookahead||e,u=o.idx,h=Vi(u,i,c,l)[0];if(Z(Ve(h))){let g=r.buildEmptyRepetitionError({topLevelRule:i,repetition:o});n.push({message:g,type:it.NO_NON_EMPTY_LOOKAHEAD,ruleName:i.name})}})}),n}function PE(t,e,r,n){let i=[],s=Ue(t,(o,c,l)=>(e.definition[l].ignoreAmbiguities===!0||D(c,u=>{let p=[l];D(t,(h,g)=>{l!==g&&Nc(h,u)&&e.definition[g].ignoreAmbiguities!==!0&&p.push(g)}),p.length>1&&!Nc(i,u)&&(i.push(u),o.push({alts:p,path:u}))}),o),[]);return I(s,o=>{let c=I(o.alts,u=>u+1);return{message:n.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:c,prefixPath:o.path}),type:it.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:o.alts}})}function OE(t,e,r,n){let i=Ue(t,(a,o,c)=>{let l=I(o,u=>({idx:c,path:u}));return a.concat(l)},[]);return Or(ht(i,a=>{if(e.definition[a.idx].ignoreAmbiguities===!0)return[];let c=a.idx,l=a.path,u=ct(i,h=>e.definition[h.idx].ignoreAmbiguities!==!0&&h.idx{let g=[h.idx+1,c+1],C=e.idx===0?"":e.idx;return{message:n.buildAlternationPrefixAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:g,prefixPath:h.path}),type:it.AMBIGUOUS_PREFIX_ALTS,ruleName:r.name,occurrence:C,alternatives:g}})}))}function LE(t,e,r){let n=[],i=I(e,s=>s.name);return D(t,s=>{let a=s.name;if(Pe(i,a)){let o=r.buildNamespaceConflictError(s);n.push({message:o,type:it.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:a})}}),n}function Qm(t){let e=Ks(t,{errMsgProvider:Lm}),r={};return D(t.rules,n=>{r[n.name]=n}),Dm(r,e.errMsgProvider)}function Zm(t){return t=Ks(t,{errMsgProvider:cr}),Vm(t.rules,t.tokenTypes,t.errMsgProvider,t.grammarName)}var eg="MismatchedTokenException",tg="NoViableAltException",rg="EarlyExitException",ng="NotAllInputParsedException",ig=[eg,tg,rg,ng];Object.freeze(ig);function gn(t){return Pe(ig,t.name)}var Ki=class extends Error{constructor(e,r){super(e),this.token=r,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},Zn=class extends Ki{constructor(e,r,n){super(e,r),this.previousToken=n,this.name=eg}},Sa=class extends Ki{constructor(e,r,n){super(e,r),this.previousToken=n,this.name=tg}},ka=class extends Ki{constructor(e,r){super(e,r),this.name=ng}},Na=class extends Ki{constructor(e,r,n){super(e,r),this.previousToken=n,this.name=rg}};var Af={},Sf="InRuleRecoveryException",$f=class extends Error{constructor(e){super(e),this.name=Sf}},wc=class{initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=q(e,"recoveryEnabled")?e.recoveryEnabled:wt.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=DE)}getTokenToInsert(e){let r=Kr(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,r,n,i){let s=this.findReSyncTokenType(),a=this.exportLexerState(),o=[],c=!1,l=this.LA(1),u=this.LA(1),p=()=>{let h=this.LA(0),g=this.errorMessageProvider.buildMismatchTokenMessage({expected:i,actual:l,previous:h,ruleName:this.getCurrRuleFullName()}),C=new Zn(g,l,this.LA(0));C.resyncedTokens=tn(o),this.SAVE_ERROR(C)};for(;!c;)if(this.tokenMatcher(u,i)){p();return}else if(n.call(this)){p(),e.apply(this,r);return}else this.tokenMatcher(u,s)?c=!0:(u=this.SKIP_TOKEN(),this.addToResyncTokens(u,o));this.importLexerState(a)}shouldInRepetitionRecoveryBeTried(e,r,n){return!(n===!1||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))}getFollowsForInRuleRecovery(e,r){let n=this.getCurrentGrammarPath(e,r);return this.getNextPossibleTokenTypes(n)}tryInRuleRecovery(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r))return this.getTokenToInsert(e);if(this.canRecoverWithSingleTokenDeletion(e)){let n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new $f("sad sad panda")}canPerformInRuleRecovery(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,r){if(!this.canTokenTypeBeInsertedInRecovery(e)||Z(r))return!1;let n=this.LA(1);return Lr(r,s=>this.tokenMatcher(n,s))!==void 0}canRecoverWithSingleTokenDeletion(e){return this.canTokenTypeBeDeletedInRecovery(e)?this.tokenMatcher(this.LA(2),e):!1}isInCurrentRuleReSyncSet(e){let r=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(r);return Pe(n,e)}findReSyncTokenType(){let e=this.flattenFollowSet(),r=this.LA(1),n=2;for(;;){let i=Lr(e,s=>xa(r,s));if(i!==void 0)return i;r=this.LA(n),n++}}getCurrFollowKey(){if(this.RULE_STACK.length===1)return Af;let e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){let e=this.RULE_STACK,r=this.RULE_OCCURRENCE_STACK;return I(e,(n,i)=>i===0?Af:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:r[i],inRule:this.shortRuleNameToFullName(e[i-1])})}flattenFollowSet(){let e=I(this.buildFullFollowKeyStack(),r=>this.getFollowSetFromFollowKey(r));return Ve(e)}getFollowSetFromFollowKey(e){if(e===Af)return[Bt];let r=e.ruleName+e.idxInCallingRule+hc+e.inRule;return this.resyncFollows[r]}addToResyncTokens(e,r){return this.tokenMatcher(e,Bt)||r.push(e),r}reSyncTo(e){let r=[],n=this.LA(1);for(;this.tokenMatcher(n,e)===!1;)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,r);return tn(r)}attemptInRepetitionRecovery(e,r,n,i,s,a,o){}getCurrentGrammarPath(e,r){let n=this.getHumanReadableRuleStack(),i=Ne(this.RULE_OCCURRENCE_STACK);return{ruleStack:n,occurrenceStack:i,lastTok:e,lastTokOccurrence:r}}getHumanReadableRuleStack(){return I(this.RULE_STACK,e=>this.shortRuleNameToFullName(e))}};function DE(t,e,r,n,i,s,a){let o=this.getKeyForAutomaticLookahead(n,i),c=this.firstAfterRepMap[o];if(c===void 0){let h=this.getCurrRuleFullName(),g=this.getGAstProductions()[h];c=new s(g,i).startWalking(),this.firstAfterRepMap[o]=c}let l=c.token,u=c.occurrence,p=c.isEndOfRule;this.RULE_STACK.length===1&&p&&l===void 0&&(l=Bt,u=1),!(l===void 0||u===void 0)&&this.shouldInRepetitionRecoveryBeTried(l,u,a)&&this.tryInRepetitionRecovery(t,e,r,l)}function Ic(t,e,r){return r|e|t}var Yr=class{constructor(e){var r;this.maxLookahead=(r=e?.maxLookahead)!==null&&r!==void 0?r:wt.maxLookahead}validate(e){let r=this.validateNoLeftRecursion(e.rules);if(Z(r)){let n=this.validateEmptyOrAlternatives(e.rules),i=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),s=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...r,...n,...i,...s]}return r}validateNoLeftRecursion(e){return ht(e,r=>Ef(r,r,cr))}validateEmptyOrAlternatives(e){return ht(e,r=>Ym(r,cr))}validateAmbiguousAlternationAlternatives(e,r){return ht(e,n=>Xm(n,r,cr))}validateSomeNonEmptyLookaheadPath(e,r){return Jm(e,r,cr)}buildLookaheadForAlternation(e){return Fm(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,Um)}buildLookaheadForOptional(e){return Gm(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,Aa(e.prodType),qm)}};var bc=class{initLooksAhead(e){this.dynamicTokensEnabled=q(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:wt.dynamicTokensEnabled,this.maxLookahead=q(e,"maxLookahead")?e.maxLookahead:wt.maxLookahead,this.lookaheadStrategy=q(e,"lookaheadStrategy")?e.lookaheadStrategy:new Yr({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){D(e,r=>{this.TRACE_INIT(`${r.name} Rule Lookahead`,()=>{let{alternation:n,repetition:i,option:s,repetitionMandatory:a,repetitionMandatoryWithSeparator:o,repetitionWithSeparator:c}=ME(r);D(n,l=>{let u=l.idx===0?"":l.idx;this.TRACE_INIT(`${Ot(l)}${u}`,()=>{let p=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:l.idx,rule:r,maxLookahead:l.maxLookahead||this.maxLookahead,hasPredicates:l.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),h=Ic(this.fullRuleNameToShort[r.name],256,l.idx);this.setLaFuncCache(h,p)})}),D(i,l=>{this.computeLookaheadFunc(r,l.idx,768,"Repetition",l.maxLookahead,Ot(l))}),D(s,l=>{this.computeLookaheadFunc(r,l.idx,512,"Option",l.maxLookahead,Ot(l))}),D(a,l=>{this.computeLookaheadFunc(r,l.idx,1024,"RepetitionMandatory",l.maxLookahead,Ot(l))}),D(o,l=>{this.computeLookaheadFunc(r,l.idx,1536,"RepetitionMandatoryWithSeparator",l.maxLookahead,Ot(l))}),D(c,l=>{this.computeLookaheadFunc(r,l.idx,1280,"RepetitionWithSeparator",l.maxLookahead,Ot(l))})})})}computeLookaheadFunc(e,r,n,i,s,a){this.TRACE_INIT(`${a}${r===0?"":r}`,()=>{let o=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:r,rule:e,maxLookahead:s||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:i}),c=Ic(this.fullRuleNameToShort[e.name],n,r);this.setLaFuncCache(c,o)})}getKeyForAutomaticLookahead(e,r){let n=this.getLastExplicitRuleShortName();return Ic(n,e,r)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,r){this.lookAheadFuncsCache.set(e,r)}},kf=class extends Ct{constructor(){super(...arguments),this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}reset(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}visitOption(e){this.dslMethods.option.push(e)}visitRepetitionWithSeparator(e){this.dslMethods.repetitionWithSeparator.push(e)}visitRepetitionMandatory(e){this.dslMethods.repetitionMandatory.push(e)}visitRepetitionMandatoryWithSeparator(e){this.dslMethods.repetitionMandatoryWithSeparator.push(e)}visitRepetition(e){this.dslMethods.repetition.push(e)}visitAlternation(e){this.dslMethods.alternation.push(e)}},_c=new kf;function ME(t){_c.reset(),t.accept(_c);let e=_c.dslMethods;return _c.reset(),e}function wf(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffseta.msg);throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>: + ${s.join(` + +`).replace(/\n/g,` + `)}`)}}};return r.prototype=n,r.prototype.constructor=r,r._RULE_NAMES=e,r}function cg(t,e,r){let n=function(){};_f(n,t+"BaseSemanticsWithDefaults");let i=Object.create(r.prototype);return D(e,s=>{i[s]=GE}),n.prototype=i,n.prototype.constructor=n,n}var lg=(function(t){return t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD",t})(lg||{});function UE(t,e){return qE(t,e)}function qE(t,e){let r=ct(e,i=>mr(t[i])===!1),n=I(r,i=>({msg:`Missing visitor method: <${i}> on ${t.constructor.name} CST Visitor.`,type:lg.MISSING_METHOD,methodName:i}));return Or(n)}var Dc=class{initTreeBuilder(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=q(e,"nodeLocationTracking")?e.nodeLocationTracking:wt.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=et,this.cstFinallyStateUpdate=et,this.cstPostTerminal=et,this.cstPostNonTerminal=et,this.cstPostRule=et;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=If,this.setNodeLocationFromNode=If,this.cstPostRule=et,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=et,this.setNodeLocationFromNode=et,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=wf,this.setNodeLocationFromNode=wf,this.cstPostRule=et,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=et,this.setNodeLocationFromNode=et,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=et,this.setNodeLocationFromNode=et,this.cstPostRule=et,this.setInitialNodeLocation=et;else throw Error(`Invalid config option: "${e.nodeLocationTracking}"`)}setInitialNodeLocationOnlyOffsetRecovery(e){e.location={startOffset:NaN,endOffset:NaN}}setInitialNodeLocationOnlyOffsetRegular(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}}setInitialNodeLocationFullRecovery(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}}setInitialNodeLocationFullRegular(e){let r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}}cstInvocationStateUpdate(e){let r={name:e,children:Object.create(null)};this.setInitialNodeLocation(r),this.CST_STACK.push(r)}cstFinallyStateUpdate(){this.CST_STACK.pop()}cstPostRuleFull(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?(n.endOffset=r.endOffset,n.endLine=r.endLine,n.endColumn=r.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)}cstPostRuleOnlyOffset(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?n.endOffset=r.endOffset:n.startOffset=NaN}cstPostTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];sg(n,r,e),this.setNodeLocationFromToken(n.location,r)}cstPostNonTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];ag(n,r,e),this.setNodeLocationFromNode(n.location,e.location)}getBaseCstVisitorConstructor(){if($t(this.baseCstVisitorConstructor)){let e=og(this.className,Pr(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor}getBaseCstVisitorConstructorWithDefaults(){if($t(this.baseCstVisitorWithDefaultsConstructor)){let e=cg(this.className,Pr(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor}getLastExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-1]}getPreviousExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-2]}getLastExplicitRuleOccurrenceIndex(){let e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]}};var Mc=class{initLexerAdapter(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1}set input(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length}get input(){return this.tokVector}SKIP_TOKEN(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):Hi}LA(e){let r=this.currIdx+e;return r<0||this.tokVectorLength<=r?Hi:this.tokVector[r]}consumeToken(){this.currIdx++}exportLexerState(){return this.currIdx}importLexerState(e){this.currIdx=e}resetLexerState(){this.currIdx=-1}moveToTerminatedState(){this.currIdx=this.tokVector.length-1}getLexerPosition(){return this.exportLexerState()}};var Fc=class{ACTION(e){return e.call(this)}consume(e,r,n){return this.consumeInternal(r,e,n)}subrule(e,r,n){return this.subruleInternal(r,e,n)}option(e,r){return this.optionInternal(r,e)}or(e,r){return this.orInternal(r,e)}many(e,r){return this.manyInternal(e,r)}atLeastOne(e,r){return this.atLeastOneInternal(e,r)}CONSUME(e,r){return this.consumeInternal(e,0,r)}CONSUME1(e,r){return this.consumeInternal(e,1,r)}CONSUME2(e,r){return this.consumeInternal(e,2,r)}CONSUME3(e,r){return this.consumeInternal(e,3,r)}CONSUME4(e,r){return this.consumeInternal(e,4,r)}CONSUME5(e,r){return this.consumeInternal(e,5,r)}CONSUME6(e,r){return this.consumeInternal(e,6,r)}CONSUME7(e,r){return this.consumeInternal(e,7,r)}CONSUME8(e,r){return this.consumeInternal(e,8,r)}CONSUME9(e,r){return this.consumeInternal(e,9,r)}SUBRULE(e,r){return this.subruleInternal(e,0,r)}SUBRULE1(e,r){return this.subruleInternal(e,1,r)}SUBRULE2(e,r){return this.subruleInternal(e,2,r)}SUBRULE3(e,r){return this.subruleInternal(e,3,r)}SUBRULE4(e,r){return this.subruleInternal(e,4,r)}SUBRULE5(e,r){return this.subruleInternal(e,5,r)}SUBRULE6(e,r){return this.subruleInternal(e,6,r)}SUBRULE7(e,r){return this.subruleInternal(e,7,r)}SUBRULE8(e,r){return this.subruleInternal(e,8,r)}SUBRULE9(e,r){return this.subruleInternal(e,9,r)}OPTION(e){return this.optionInternal(e,0)}OPTION1(e){return this.optionInternal(e,1)}OPTION2(e){return this.optionInternal(e,2)}OPTION3(e){return this.optionInternal(e,3)}OPTION4(e){return this.optionInternal(e,4)}OPTION5(e){return this.optionInternal(e,5)}OPTION6(e){return this.optionInternal(e,6)}OPTION7(e){return this.optionInternal(e,7)}OPTION8(e){return this.optionInternal(e,8)}OPTION9(e){return this.optionInternal(e,9)}OR(e){return this.orInternal(e,0)}OR1(e){return this.orInternal(e,1)}OR2(e){return this.orInternal(e,2)}OR3(e){return this.orInternal(e,3)}OR4(e){return this.orInternal(e,4)}OR5(e){return this.orInternal(e,5)}OR6(e){return this.orInternal(e,6)}OR7(e){return this.orInternal(e,7)}OR8(e){return this.orInternal(e,8)}OR9(e){return this.orInternal(e,9)}MANY(e){this.manyInternal(0,e)}MANY1(e){this.manyInternal(1,e)}MANY2(e){this.manyInternal(2,e)}MANY3(e){this.manyInternal(3,e)}MANY4(e){this.manyInternal(4,e)}MANY5(e){this.manyInternal(5,e)}MANY6(e){this.manyInternal(6,e)}MANY7(e){this.manyInternal(7,e)}MANY8(e){this.manyInternal(8,e)}MANY9(e){this.manyInternal(9,e)}MANY_SEP(e){this.manySepFirstInternal(0,e)}MANY_SEP1(e){this.manySepFirstInternal(1,e)}MANY_SEP2(e){this.manySepFirstInternal(2,e)}MANY_SEP3(e){this.manySepFirstInternal(3,e)}MANY_SEP4(e){this.manySepFirstInternal(4,e)}MANY_SEP5(e){this.manySepFirstInternal(5,e)}MANY_SEP6(e){this.manySepFirstInternal(6,e)}MANY_SEP7(e){this.manySepFirstInternal(7,e)}MANY_SEP8(e){this.manySepFirstInternal(8,e)}MANY_SEP9(e){this.manySepFirstInternal(9,e)}AT_LEAST_ONE(e){this.atLeastOneInternal(0,e)}AT_LEAST_ONE1(e){return this.atLeastOneInternal(1,e)}AT_LEAST_ONE2(e){this.atLeastOneInternal(2,e)}AT_LEAST_ONE3(e){this.atLeastOneInternal(3,e)}AT_LEAST_ONE4(e){this.atLeastOneInternal(4,e)}AT_LEAST_ONE5(e){this.atLeastOneInternal(5,e)}AT_LEAST_ONE6(e){this.atLeastOneInternal(6,e)}AT_LEAST_ONE7(e){this.atLeastOneInternal(7,e)}AT_LEAST_ONE8(e){this.atLeastOneInternal(8,e)}AT_LEAST_ONE9(e){this.atLeastOneInternal(9,e)}AT_LEAST_ONE_SEP(e){this.atLeastOneSepFirstInternal(0,e)}AT_LEAST_ONE_SEP1(e){this.atLeastOneSepFirstInternal(1,e)}AT_LEAST_ONE_SEP2(e){this.atLeastOneSepFirstInternal(2,e)}AT_LEAST_ONE_SEP3(e){this.atLeastOneSepFirstInternal(3,e)}AT_LEAST_ONE_SEP4(e){this.atLeastOneSepFirstInternal(4,e)}AT_LEAST_ONE_SEP5(e){this.atLeastOneSepFirstInternal(5,e)}AT_LEAST_ONE_SEP6(e){this.atLeastOneSepFirstInternal(6,e)}AT_LEAST_ONE_SEP7(e){this.atLeastOneSepFirstInternal(7,e)}AT_LEAST_ONE_SEP8(e){this.atLeastOneSepFirstInternal(8,e)}AT_LEAST_ONE_SEP9(e){this.atLeastOneSepFirstInternal(9,e)}RULE(e,r,n=Yi){if(Pe(this.definedRulesNames,e)){let a={message:cr.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),type:it.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(a)}this.definedRulesNames.push(e);let i=this.defineRule(e,r,n);return this[e]=i,i}OVERRIDE_RULE(e,r,n=Yi){let i=Hm(e,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(i);let s=this.defineRule(e,r,n);return this[e]=s,s}BACKTRACK(e,r){return function(){this.isBackTrackingStack.push(1);let n=this.saveRecogState();try{return e.apply(this,r),!0}catch(i){if(gn(i))return!1;throw i}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}}getGAstProductions(){return this.gastProductionsCache}getSerializedGastProductions(){return pc(Ce(this.gastProductionsCache))}};var Gc=class{initRecognizerEngine(e,r){if(this.className=this.constructor.name,this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=zi,this.subruleIdx=0,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},q(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 + For Further details.`);if(Ze(e)){if(Z(e))throw Error(`A Token Vocabulary cannot be empty. + Note that the first argument for the parser constructor + is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 + For Further details.`)}if(Ze(e))this.tokensMap=Ue(e,(s,a)=>(s[a.name]=a,s),{});else if(q(e,"modes")&&At(Ve(Ce(e.modes)),km)){let s=Ve(Ce(e.modes)),a=Hs(s);this.tokensMap=Ue(a,(o,c)=>(o[c.name]=c,o),{})}else if(Fh(e))this.tokensMap=Ne(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=Bt;let n=q(e,"modes")?Ve(Ce(e.modes)):Ce(e),i=At(n,s=>Z(s.categoryMatches));this.tokenMatcher=i?zi:Br,Wr(Ce(this.tokensMap))}defineRule(e,r,n){if(this.selfAnalysisDone)throw Error(`Grammar rule <${e}> may not be defined after the 'performSelfAnalysis' method has been called' +Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);let i=q(n,"resyncEnabled")?n.resyncEnabled:Yi.resyncEnabled,s=q(n,"recoveryValueFunc")?n.recoveryValueFunc:Yi.recoveryValueFunc,a=this.ruleShortNameIdx<<12;this.ruleShortNameIdx++,this.shortRuleNameToFull[a]=e,this.fullRuleNameToShort[e]=a;let o;return this.outputCst===!0?o=function(...u){try{this.ruleInvocationStateUpdate(a,e,this.subruleIdx),r.apply(this,u);let p=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(p),p}catch(p){return this.invokeRuleCatch(p,i,s)}finally{this.ruleFinallyStateUpdate()}}:o=function(...u){try{return this.ruleInvocationStateUpdate(a,e,this.subruleIdx),r.apply(this,u)}catch(p){return this.invokeRuleCatch(p,i,s)}finally{this.ruleFinallyStateUpdate()}},Object.assign(o,{ruleName:e,originalGrammarAction:r})}invokeRuleCatch(e,r,n){let i=this.RULE_STACK.length===1,s=r&&!this.isBackTracking()&&this.recoveryEnabled;if(gn(e)){let a=e;if(s){let o=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(o))if(a.resyncedTokens=this.reSyncTo(o),this.outputCst){let c=this.CST_STACK[this.CST_STACK.length-1];return c.recoveredNode=!0,c}else return n(e);else{if(this.outputCst){let c=this.CST_STACK[this.CST_STACK.length-1];c.recoveredNode=!0,a.partialCstResult=c}throw a}}else{if(i)return this.moveToTerminatedState(),n(e);throw a}}else throw e}optionInternal(e,r){let n=this.getKeyForAutomaticLookahead(512,r);return this.optionInternalLogic(e,r,n)}optionInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),s;if(typeof e!="function"){s=e.DEF;let a=e.GATE;if(a!==void 0){let o=i;i=()=>a.call(this)&&o.call(this)}}else s=e;if(i.call(this)===!0)return s.call(this)}atLeastOneInternal(e,r){let n=this.getKeyForAutomaticLookahead(1024,e);return this.atLeastOneInternalLogic(e,r,n)}atLeastOneInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),s;if(typeof r!="function"){s=r.DEF;let a=r.GATE;if(a!==void 0){let o=i;i=()=>a.call(this)&&o.call(this)}}else s=r;if(i.call(this)===!0){let a=this.doSingleRepetition(s);for(;i.call(this)===!0&&a===!0;)a=this.doSingleRepetition(s)}else throw this.raiseEarlyExitException(e,De.REPETITION_MANDATORY,r.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,r],i,1024,e,Ec)}atLeastOneSepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1536,e);this.atLeastOneSepFirstInternalLogic(e,r,n)}atLeastOneSepFirstInternalLogic(e,r,n){let i=r.DEF,s=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let o=()=>this.tokenMatcher(this.LA(1),s);for(;this.tokenMatcher(this.LA(1),s)===!0;)this.CONSUME(s),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,s,o,i,Ea],o,1536,e,Ea)}else throw this.raiseEarlyExitException(e,De.REPETITION_MANDATORY_WITH_SEPARATOR,r.ERR_MSG)}manyInternal(e,r){let n=this.getKeyForAutomaticLookahead(768,e);return this.manyInternalLogic(e,r,n)}manyInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),s;if(typeof r!="function"){s=r.DEF;let o=r.GATE;if(o!==void 0){let c=i;i=()=>o.call(this)&&c.call(this)}}else s=r;let a=!0;for(;i.call(this)===!0&&a===!0;)a=this.doSingleRepetition(s);this.attemptInRepetitionRecovery(this.manyInternal,[e,r],i,768,e,vc,a)}manySepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1280,e);this.manySepFirstInternalLogic(e,r,n)}manySepFirstInternalLogic(e,r,n){let i=r.DEF,s=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let o=()=>this.tokenMatcher(this.LA(1),s);for(;this.tokenMatcher(this.LA(1),s)===!0;)this.CONSUME(s),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,s,o,i,va],o,1280,e,va)}}repetitionSepSecondInternal(e,r,n,i,s){for(;n();)this.CONSUME(r),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,r,n,i,s],n,1536,e,s)}doSingleRepetition(e){let r=this.getLexerPosition();return e.call(this),this.getLexerPosition()>r}orInternal(e,r){let n=this.getKeyForAutomaticLookahead(256,r),i=Ze(e)?e:e.DEF,a=this.getLaFuncFromCache(n).call(this,i);if(a!==void 0)return i[a].ALT.call(this);this.raiseNoAltException(r,e.ERR_MSG)}ruleFinallyStateUpdate(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){let e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new ka(r,e))}}subruleInternal(e,r,n){let i;try{let s=n!==void 0?n.ARGS:void 0;return this.subruleIdx=r,i=e.apply(this,s),this.cstPostNonTerminal(i,n!==void 0&&n.LABEL!==void 0?n.LABEL:e.ruleName),i}catch(s){throw this.subruleInternalError(s,n,e.ruleName)}}subruleInternalError(e,r,n){throw gn(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:n),delete e.partialCstResult),e}consumeInternal(e,r,n){let i;try{let s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),i=s):this.consumeInternalError(e,s,n)}catch(s){i=this.consumeInternalRecovery(e,r,s)}return this.cstPostTerminal(n!==void 0&&n.LABEL!==void 0?n.LABEL:e.name,i),i}consumeInternalError(e,r,n){let i,s=this.LA(0);throw n!==void 0&&n.ERR_MSG?i=n.ERR_MSG:i=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new Zn(i,r,s))}consumeInternalRecovery(e,r,n){if(this.recoveryEnabled&&n.name==="MismatchedTokenException"&&!this.isBackTracking()){let i=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,i)}catch(s){throw s.name===Sf?n:s}}else throw n}saveRecogState(){let e=this.errors,r=Ne(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}}reloadRecogState(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK}ruleInvocationStateUpdate(e,r,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r)}isBackTracking(){return this.isBackTrackingStack.length!==0}getCurrRuleFullName(){let e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]}shortRuleNameToFullName(e){return this.shortRuleNameToFull[e]}isAtEndOfInput(){return this.tokenMatcher(this.LA(1),Bt)}reset(){this.resetLexerState(),this.subruleIdx=0,this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]}};var Uc=class{initErrorHandler(e){this._errors=[],this.errorMessageProvider=q(e,"errorMessageProvider")?e.errorMessageProvider:wt.errorMessageProvider}SAVE_ERROR(e){if(gn(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:Ne(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")}get errors(){return Ne(this._errors)}set errors(e){this._errors=e}raiseEarlyExitException(e,r,n){let i=this.getCurrRuleFullName(),s=this.getGAstProductions()[i],o=Vi(e,s,r,this.maxLookahead)[0],c=[];for(let u=1;u<=this.maxLookahead;u++)c.push(this.LA(u));let l=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:o,actual:c,previous:this.LA(0),customUserDescription:n,ruleName:i});throw this.SAVE_ERROR(new Na(l,this.LA(1),this.LA(0)))}raiseNoAltException(e,r){let n=this.getCurrRuleFullName(),i=this.getGAstProductions()[n],s=Wi(e,i,this.maxLookahead),a=[];for(let l=1;l<=this.maxLookahead;l++)a.push(this.LA(l));let o=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:a,previous:o,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new Sa(c,this.LA(1),o))}};var qc=class{initContentAssist(){}computeContentAssist(e,r){let n=this.gastProductionsCache[e];if($t(n))throw Error(`Rule ->${e}<- does not exist in this grammar.`);return $c([n],r,this.tokenMatcher,this.maxLookahead)}getNextPossibleTokenTypes(e){let r=pt(e.ruleStack),i=this.getGAstProductions()[r];return new xc(i,e).startWalking()}};var Bc={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(Bc);var ug=!0,fg=Math.pow(2,8)-1,pg=mn({name:"RECORDING_PHASE_TOKEN",pattern:He.NA});Wr([pg]);var hg=Kr(pg,`This IToken indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(hg);var jE={name:`This CSTNode indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},zc=class{initGastRecorder(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1}enableRecording(){this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",()=>{for(let e=0;e<10;e++){let r=e>0?e:"";this[`CONSUME${r}`]=function(n,i){return this.consumeInternalRecord(n,e,i)},this[`SUBRULE${r}`]=function(n,i){return this.subruleInternalRecord(n,e,i)},this[`OPTION${r}`]=function(n){return this.optionInternalRecord(n,e)},this[`OR${r}`]=function(n){return this.orInternalRecord(n,e)},this[`MANY${r}`]=function(n){this.manyInternalRecord(e,n)},this[`MANY_SEP${r}`]=function(n){this.manySepFirstInternalRecord(e,n)},this[`AT_LEAST_ONE${r}`]=function(n){this.atLeastOneInternalRecord(e,n)},this[`AT_LEAST_ONE_SEP${r}`]=function(n){this.atLeastOneSepFirstInternalRecord(e,n)}}this.consume=function(e,r,n){return this.consumeInternalRecord(r,e,n)},this.subrule=function(e,r,n){return this.subruleInternalRecord(r,e,n)},this.option=function(e,r){return this.optionInternalRecord(r,e)},this.or=function(e,r){return this.orInternalRecord(r,e)},this.many=function(e,r){this.manyInternalRecord(e,r)},this.atLeastOne=function(e,r){this.atLeastOneInternalRecord(e,r)},this.ACTION=this.ACTION_RECORD,this.BACKTRACK=this.BACKTRACK_RECORD,this.LA=this.LA_RECORD})}disableRecording(){this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",()=>{let e=this;for(let r=0;r<10;r++){let n=r>0?r:"";delete e[`CONSUME${n}`],delete e[`SUBRULE${n}`],delete e[`OPTION${n}`],delete e[`OR${n}`],delete e[`MANY${n}`],delete e[`MANY_SEP${n}`],delete e[`AT_LEAST_ONE${n}`],delete e[`AT_LEAST_ONE_SEP${n}`]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})}ACTION_RECORD(e){}BACKTRACK_RECORD(e,r){return()=>!0}LA_RECORD(e){return Hi}topLevelRuleRecord(e,r){try{let n=new Nt({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),r.call(this),this.recordingProdStack.pop(),n}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` + This error was thrown during the "grammar recording phase" For more info see: + https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch(i){throw n}throw n}}optionInternalRecord(e,r){return wa.call(this,he,e,r)}atLeastOneInternalRecord(e,r){wa.call(this,Ae,r,e)}atLeastOneSepFirstInternalRecord(e,r){wa.call(this,$e,r,e,ug)}manyInternalRecord(e,r){wa.call(this,se,r,e)}manySepFirstInternalRecord(e,r){wa.call(this,Re,r,e,ug)}orInternalRecord(e,r){return BE.call(this,e,r)}subruleInternalRecord(e,r,n){if(jc(r),!e||q(e,"ruleName")===!1){let o=new Error(` argument is invalid expecting a Parser method reference but got: <${JSON.stringify(e)}> + inside top level rule: <${this.recordingProdStack[0].name}>`);throw o.KNOWN_RECORDER_ERROR=!0,o}let i=gr(this.recordingProdStack),s=e.ruleName,a=new pe({idx:r,nonTerminalName:s,label:n?.LABEL,referencedRule:void 0});return i.definition.push(a),this.outputCst?jE:Bc}consumeInternalRecord(e,r,n){if(jc(r),!hf(e)){let a=new Error(` argument is invalid expecting a TokenType reference but got: <${JSON.stringify(e)}> + inside top level rule: <${this.recordingProdStack[0].name}>`);throw a.KNOWN_RECORDER_ERROR=!0,a}let i=gr(this.recordingProdStack),s=new te({idx:r,terminalType:e,label:n?.LABEL});return i.definition.push(s),hg}};function wa(t,e,r,n=!1){jc(r);let i=gr(this.recordingProdStack),s=mr(e)?e:e.DEF,a=new t({definition:[],idx:r});return n&&(a.separator=e.SEP),q(e,"MAX_LOOKAHEAD")&&(a.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(a),s.call(this),i.definition.push(a),this.recordingProdStack.pop(),Bc}function BE(t,e){jc(e);let r=gr(this.recordingProdStack),n=Ze(t)===!1,i=n===!1?t:t.DEF,s=new xe({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});q(t,"MAX_LOOKAHEAD")&&(s.maxLookahead=t.MAX_LOOKAHEAD);let a=Mo(i,o=>mr(o.GATE));return s.hasPredicates=a,r.definition.push(s),D(i,o=>{let c=new Ee({definition:[]});s.definition.push(c),q(o,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=o.IGNORE_AMBIGUITIES:q(o,"GATE")&&(c.ignoreAmbiguities=!0),this.recordingProdStack.push(c),o.ALT.call(this),this.recordingProdStack.pop()}),Bc}function dg(t){return t===0?"":`${t}`}function jc(t){if(t<0||t>fg){let e=new Error(`Invalid DSL Method idx value: <${t}> + Idx value must be a none negative value smaller than ${fg+1}`);throw e.KNOWN_RECORDER_ERROR=!0,e}}var Wc=class{initPerformanceTracer(e){if(q(e,"traceInitPerf")){let r=e.traceInitPerf,n=typeof r=="number";this.traceInitMaxIdent=n?r:1/0,this.traceInitPerf=n?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=wt.traceInitPerf;this.traceInitIndent=-1}TRACE_INIT(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;let n=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${e}>`);let{time:i,value:s}=ga(r),a=i>10?console.warn:console.log;return this.traceInitIndent time: ${i}ms`),this.traceInitIndent--,s}else return r()}};function mg(t,e){e.forEach(r=>{let n=r.prototype;Object.getOwnPropertyNames(n).forEach(i=>{if(i==="constructor")return;let s=Object.getOwnPropertyDescriptor(n,i);s&&(s.get||s.set)?Object.defineProperty(t.prototype,i,s):t.prototype[i]=r.prototype[i]})})}var Hi=Kr(Bt,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(Hi);var wt=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:Hr,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1}),Yi=Object.freeze({recoveryValueFunc:()=>{},resyncEnabled:!0}),it=(function(t){return t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS",t[t.CUSTOM_LOOKAHEAD_VALIDATION=13]="CUSTOM_LOOKAHEAD_VALIDATION",t})(it||{});function Vc(t=void 0){return function(){return t}}var gg=(()=>{class t{static performSelfAnalysis(r){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")}performSelfAnalysis(){this.TRACE_INIT("performSelfAnalysis",()=>{let r;this.selfAnalysisDone=!0;let n=this.className;this.TRACE_INIT("toFastProps",()=>{ya(this)}),this.TRACE_INIT("Grammar Recording",()=>{try{this.enableRecording(),D(this.definedRulesNames,s=>{let o=this[s].originalGrammarAction,c;this.TRACE_INIT(`${s} Rule`,()=>{c=this.topLevelRuleRecord(s,o)}),this.gastProductionsCache[s]=c})}finally{this.disableRecording()}});let i=[];if(this.TRACE_INIT("Grammar Resolving",()=>{i=Qm({rules:Ce(this.gastProductionsCache)}),this.definitionErrors=this.definitionErrors.concat(i)}),this.TRACE_INIT("Grammar Validations",()=>{if(Z(i)&&this.skipValidations===!1){let s=Zm({rules:Ce(this.gastProductionsCache),tokenTypes:Ce(this.tokensMap),errMsgProvider:cr,grammarName:n}),a=Wm({lookaheadStrategy:this.lookaheadStrategy,rules:Ce(this.gastProductionsCache),tokenTypes:Ce(this.tokensMap),grammarName:n});this.definitionErrors=this.definitionErrors.concat(s,a)}}),Z(this.definitionErrors)&&(this.recoveryEnabled&&this.TRACE_INIT("computeAllProdsFollows",()=>{let s=om(Ce(this.gastProductionsCache));this.resyncFollows=s}),this.TRACE_INIT("ComputeLookaheadFunctions",()=>{var s,a;(a=(s=this.lookaheadStrategy).initialize)===null||a===void 0||a.call(s,{rules:Ce(this.gastProductionsCache)}),this.preComputeLookaheadFunctions(Ce(this.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!Z(this.definitionErrors))throw r=I(this.definitionErrors,s=>s.message),new Error(`Parser Definition Errors detected: + ${r.join(` +------------------------------- +`)}`)})}constructor(r,n){this.definitionErrors=[],this.selfAnalysisDone=!1;let i=this;if(i.initErrorHandler(n),i.initLexerAdapter(),i.initLooksAhead(n),i.initRecognizerEngine(r,n),i.initRecoverable(n),i.initTreeBuilder(n),i.initContentAssist(),i.initGastRecorder(n),i.initPerformanceTracer(n),q(n,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. + Please use the flag on the relevant DSL method instead. + See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES + For further details.`);this.skipValidations=q(n,"skipValidations")?n.skipValidations:wt.skipValidations}}return t.DEFER_DEFINITION_ERRORS_HANDLING=!1,t})();mg(gg,[wc,bc,Dc,Mc,Gc,Fc,Uc,qc,zc,Wc]);var Ia=class extends gg{constructor(e,r=wt){let n=Ne(r);n.outputCst=!1,super(e,n)}};function ei(t,e,r){return`${t.name}_${e}_${r}`}var yn=1,VE=2,yg=4,Tg=5;var Qi=7,KE=8,HE=9,YE=10,XE=11,Rg=12,_a=class{constructor(e){this.target=e}isEpsilon(){return!1}},Xi=class extends _a{constructor(e,r){super(e),this.tokenType=r}},ba=class extends _a{constructor(e){super(e)}isEpsilon(){return!0}},Ji=class extends _a{constructor(e,r,n){super(e),this.rule=r,this.followState=n}isEpsilon(){return!0}};function xg(t){let e={decisionMap:{},decisionStates:[],ruleToStartState:new Map,ruleToStopState:new Map,states:[]};JE(e,t);let r=t.length;for(let n=0;nvg(t,e,a));return Zi(t,e,n,r,...i)}function nA(t,e,r){let n=st(t,e,r,{type:yn});Tn(t,n);let i=Zi(t,e,n,r,ti(t,e,r));return iA(t,e,r,i)}function ti(t,e,r){let n=ct(I(r.definition,i=>vg(t,e,i)),i=>i!==void 0);return n.length===1?n[0]:n.length===0?void 0:aA(t,n)}function Eg(t,e,r,n,i){let s=n.left,a=n.right,o=st(t,e,r,{type:XE});Tn(t,o);let c=st(t,e,r,{type:Rg});return s.loopback=o,c.loopback=o,t.decisionMap[ei(e,i?"RepetitionMandatoryWithSeparator":"RepetitionMandatory",r.idx)]=o,Ye(a,o),i===void 0?(Ye(o,s),Ye(o,c)):(Ye(o,c),Ye(o,i.left),Ye(i.right,s)),{left:s,right:c}}function Ag(t,e,r,n,i){let s=n.left,a=n.right,o=st(t,e,r,{type:YE});Tn(t,o);let c=st(t,e,r,{type:Rg}),l=st(t,e,r,{type:HE});return o.loopback=l,c.loopback=l,Ye(o,s),Ye(o,c),Ye(a,l),i!==void 0?(Ye(l,c),Ye(l,i.left),Ye(i.right,s)):Ye(l,o),t.decisionMap[ei(e,i?"RepetitionWithSeparator":"Repetition",r.idx)]=o,{left:o,right:c}}function iA(t,e,r,n){let i=n.left,s=n.right;return Ye(i,s),t.decisionMap[ei(e,"Option",r.idx)]=i,n}function Tn(t,e){return t.decisionStates.push(e),e.decision=t.decisionStates.length-1,e.decision}function Zi(t,e,r,n,...i){let s=st(t,e,n,{type:KE,start:r});r.end=s;for(let o of i)o!==void 0?(Ye(r,o.left),Ye(o.right,s)):Ye(r,s);let a={left:r,right:s};return t.decisionMap[ei(e,sA(n),n.idx)]=r,a}function sA(t){if(t instanceof xe)return"Alternation";if(t instanceof he)return"Option";if(t instanceof se)return"Repetition";if(t instanceof Re)return"RepetitionWithSeparator";if(t instanceof Ae)return"RepetitionMandatory";if(t instanceof $e)return"RepetitionMandatoryWithSeparator";throw new Error("Invalid production type encountered")}function aA(t,e){let r=e.length;for(let s=0;se.alt)}get key(){let e="";for(let r in this.map)e+=r+":";return e}};function Lf(t,e=!0){return`${e?`a${t.alt}`:""}s${t.state.stateNumber}:${t.stack.map(r=>r.stateNumber.toString()).join("_")}`}function uA(t,e){let r={};return n=>{let i=n.toString(),s=r[i];return s!==void 0||(s={atnStartState:t,decision:e,states:{}},r[i]=s),s}}var Kc=class{constructor(){this.predicates=[]}is(e){return e>=this.predicates.length||this.predicates[e]}set(e,r){this.predicates[e]=r}toString(){let e="",r=this.predicates.length;for(let n=0;nconsole.log(n)}initialize(e){this.atn=xg(e.rules),this.dfas=fA(this.atn)}validateAmbiguousAlternationAlternatives(){return[]}validateEmptyOrAlternatives(){return[]}buildLookaheadForAlternation(e){let{prodOccurrence:r,rule:n,hasPredicates:i,dynamicTokensEnabled:s}=e,a=this.dfas,o=this.logging,c=ei(n,"Alternation",r),u=this.atn.decisionMap[c].decision,p=I(kc({maxLookahead:1,occurrence:r,prodType:"Alternation",rule:n}),h=>I(h,g=>g[0]));if(Sg(p,!1)&&!s){let h=Ue(p,(g,C,k)=>(D(C,G=>{G&&(g[G.tokenTypeIdx]=k,D(G.categoryMatches,M=>{g[M]=k}))}),g),{});return i?function(g){var C;let k=this.LA(1),G=h[k.tokenTypeIdx];if(g!==void 0&&G!==void 0){let M=(C=g[G])===null||C===void 0?void 0:C.GATE;if(M!==void 0&&M.call(this)===!1)return}return G}:function(){let g=this.LA(1);return h[g.tokenTypeIdx]}}else return i?function(h){let g=new Kc,C=h===void 0?0:h.length;for(let G=0;GI(h,g=>g[0]));if(Sg(p)&&p[0][0]&&!s){let h=p[0],g=Ve(h);if(g.length===1&&Z(g[0].categoryMatches)){let k=g[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===k}}else{let C=Ue(g,(k,G)=>(G!==void 0&&(k[G.tokenTypeIdx]=!0,D(G.categoryMatches,M=>{k[M]=!0})),k),{});return function(){let k=this.LA(1);return C[k.tokenTypeIdx]===!0}}}return function(){let h=Df.call(this,a,u,$g,o);return typeof h=="object"?!1:h===0}}};function Sg(t,e=!0){let r=new Set;for(let n of t){let i=new Set;for(let s of n){if(s===void 0){if(e)break;return!1}let a=[s.tokenTypeIdx].concat(s.categoryMatches);for(let o of a)if(r.has(o)){if(!i.has(o))return!1}else r.add(o),i.add(o)}}return!0}function fA(t){let e=t.decisionStates.length,r=Array(e);for(let n=0;nVr(i)).join(", "),r=t.production.idx===0?"":t.production.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(", ")}> in <${gA(t.production)}${r}> inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,n}function gA(t){if(t instanceof pe)return"SUBRULE";if(t instanceof he)return"OPTION";if(t instanceof xe)return"OR";if(t instanceof Ae)return"AT_LEAST_ONE";if(t instanceof $e)return"AT_LEAST_ONE_SEP";if(t instanceof Re)return"MANY_SEP";if(t instanceof se)return"MANY";if(t instanceof te)return"CONSUME";throw Error("non exhaustive match")}function yA(t,e,r){let n=ht(e.configs.elements,s=>s.state.transitions),i=zh(n.filter(s=>s instanceof Xi).map(s=>s.tokenType),s=>s.tokenTypeIdx);return{actualToken:r,possibleTokenTypes:i,tokenPath:t}}function TA(t,e){return t.edges[e.tokenTypeIdx]}function RA(t,e,r){let n=new es,i=[];for(let a of t.elements){if(r.is(a.alt)===!1)continue;if(a.state.type===Qi){i.push(a);continue}let o=a.state.transitions.length;for(let c=0;c0&&!$A(s))for(let a of i)s.add(a);return s}function xA(t,e){if(t instanceof Xi&&xa(e,t.tokenType))return t.target}function vA(t,e){let r;for(let n of t.elements)if(e.is(n.alt)===!0){if(r===void 0)r=n.alt;else if(r!==n.alt)return}return r}function Ng(t){return{configs:t,edges:{},isAcceptState:!1,prediction:-1}}function kg(t,e,r,n){return n=Cg(t,n),e.edges[r.tokenTypeIdx]=n,n}function Cg(t,e){if(e===Pa)return e;let r=e.configs.key,n=t.states[r];return n!==void 0?n:(e.configs.finalize(),t.states[r]=e,e)}function EA(t){let e=new es,r=t.transitions.length;for(let n=0;n0){let i=[...t.stack],a={state:i.pop(),alt:t.alt,stack:i};Hc(a,e)}else e.add(t);return}r.epsilonOnlyTransitions||e.add(t);let n=r.transitions.length;for(let i=0;i1)return!0;return!1}function wA(t){for(let e of Array.from(t.values()))if(Object.keys(e).length===1)return!0;return!1}as();var qa=class{constructor(){this.nodeStack=[]}get current(){return this.nodeStack[this.nodeStack.length-1]??this.rootNode}buildRootNode(e){return this.rootNode=new os(e),this.rootNode.root=this.rootNode,this.nodeStack=[this.rootNode],this.rootNode}buildCompositeNode(e){let r=new si;return r.grammarSource=e,r.root=this.rootNode,this.current.content.push(r),this.nodeStack.push(r),r}buildLeafNode(e,r){let n=new ii(e.startOffset,e.image.length,Pi(e),e.tokenType,!r);return n.grammarSource=r,n.root=this.rootNode,this.current.content.push(n),n}removeNode(e){let r=e.container;if(r){let n=r.content.indexOf(e);n>=0&&r.content.splice(n,1)}}addHiddenNodes(e){let r=[];for(let s of e){let a=new ii(s.startOffset,s.image.length,Pi(s),s.tokenType,!0);a.root=this.rootNode,r.push(a)}let n=this.current,i=!1;if(n.content.length>0){n.content.push(...r);return}for(;n.container;){let s=n.container.content.indexOf(n);if(s>0){n.container.content.splice(s,0,...r),i=!0;break}n=n.container}i||this.rootNode.content.unshift(...r)}construct(e){let r=this.current;typeof e.$type=="string"&&!e.$infixName&&(this.current.astNode=e),e.$cstNode=r;let n=this.nodeStack.pop();n?.content.length===0&&this.removeNode(n)}},za=class{get hidden(){return!1}get astNode(){let e=typeof this._astNode?.$type=="string"?this._astNode:this.container?.astNode;if(!e)throw new Error("This node has no associated AST element");return e}set astNode(e){this._astNode=e}get text(){return this.root.fullText.substring(this.offset,this.end)}},ii=class extends za{get offset(){return this._offset}get length(){return this._length}get end(){return this._offset+this._length}get hidden(){return this._hidden}get tokenType(){return this._tokenType}get range(){return this._range}constructor(e,r,n,i,s=!1){super(),this._hidden=s,this._offset=e,this._tokenType=i,this._length=r,this._range=n}},si=class extends za{constructor(){super(...arguments),this.content=new Sd(this)}get offset(){return this.firstNonHiddenNode?.offset??0}get length(){return this.end-this.offset}get end(){return this.lastNonHiddenNode?.end??0}get range(){let e=this.firstNonHiddenNode,r=this.lastNonHiddenNode;if(e&&r){if(this._rangeCache===void 0){let{range:n}=e,{range:i}=r;this._rangeCache={start:n.start,end:i.end.line=0;e--){let r=this.content[e];if(!r.hidden)return r}return this.content[this.content.length-1]}},Sd=class t extends Array{constructor(e){super(),this.parent=e,Object.setPrototypeOf(this,t.prototype)}push(...e){return this.addParents(e),super.push(...e)}unshift(...e){return this.addParents(e),super.unshift(...e)}splice(e,r,...n){return this.addParents(n),super.splice(e,r,...n)}addParents(e){for(let r of e)r.container=this.parent}},os=class extends si{get text(){return this._text.substring(this.offset,this.end)}get fullText(){return this._text}constructor(e){super(),this._text="",this._text=e??""}};var sl=Symbol("Datatype");function kd(t){return t.$type===sl}var jg="\u200B",Bg=t=>t.endsWith(jg)?t:t+jg,ja=class{constructor(e){this._unorderedGroups=new Map,this.allRules=new Map,this.lexer=e.parser.Lexer;let r=this.lexer.definition,n=e.LanguageMetaData.mode==="production";e.shared.profilers.LangiumProfiler?.isActive("parsing")?this.wrapper=new Nd(r,er(ge({},e.parser.ParserConfig),{skipValidations:n,errorMessageProvider:e.parser.ParserErrorMessageProvider}),e.shared.profilers.LangiumProfiler.createTask("parsing",e.LanguageMetaData.languageId)):this.wrapper=new ol(r,er(ge({},e.parser.ParserConfig),{skipValidations:n,errorMessageProvider:e.parser.ParserErrorMessageProvider}))}alternatives(e,r){this.wrapper.wrapOr(e,r)}optional(e,r){this.wrapper.wrapOption(e,r)}many(e,r){this.wrapper.wrapMany(e,r)}atLeastOne(e,r){this.wrapper.wrapAtLeastOne(e,r)}getRule(e){return this.allRules.get(e)}isRecording(){return this.wrapper.IS_RECORDING}get unorderedGroups(){return this._unorderedGroups}getRuleStack(){return this.wrapper.RULE_STACK}finalize(){this.wrapper.wrapSelfAnalysis()}},Ba=class extends ja{get current(){return this.stack[this.stack.length-1]}constructor(e){super(e),this.nodeBuilder=new qa,this.stack=[],this.assignmentMap=new Map,this.operatorPrecedence=new Map,this.linker=e.references.Linker,this.converter=e.parser.ValueConverter,this.astReflection=e.shared.AstReflection}rule(e,r){let n=this.computeRuleType(e),i;dn(e)&&(i=e.name,this.registerPrecedenceMap(e));let s=this.wrapper.DEFINE_RULE(Bg(e.name),this.startImplementation(n,i,r).bind(this));return this.allRules.set(e.name,s),nt(e)&&e.entry&&(this.mainRule=s),s}registerPrecedenceMap(e){let r=e.name,n=new Map;for(let i=0;i0&&(r=this.construct()),r===void 0)throw new Error("No result from parser");if(this.stack.length>0)throw new Error("Parser stack is not empty after parsing");return r}startImplementation(e,r,n){return i=>{let s=!this.isRecording()&&e!==void 0;if(s){let a={$type:e};this.stack.push(a),e===sl?a.value="":r!==void 0&&(a.$infixName=r)}return n(i),s?this.construct():void 0}}extractHiddenTokens(e){let r=this.lexerResult.hidden;if(!r.length)return[];let n=e.startOffset;for(let i=0;in)return r.splice(0,i);return r.splice(0,r.length)}consume(e,r,n){let i=this.wrapper.wrapConsume(e,r);if(!this.isRecording()&&this.isValidToken(i)){let s=this.extractHiddenTokens(i);this.nodeBuilder.addHiddenNodes(s);let a=this.nodeBuilder.buildLeafNode(i,n),{assignment:o,crossRef:c}=this.getAssignment(n),l=this.current;if(o){let u=Ht(n)?i.image:this.converter.convert(i.image,a);this.assign(o.operator,o.feature,u,a,c)}else if(kd(l)){let u=i.image;Ht(n)||(u=this.converter.convert(u,a).toString()),l.value+=u}}}isValidToken(e){return!e.isInsertedInRecovery&&!isNaN(e.startOffset)&&typeof e.endOffset=="number"&&!isNaN(e.endOffset)}subrule(e,r,n,i,s){let a;!this.isRecording()&&!n&&(a=this.nodeBuilder.buildCompositeNode(i));let o;try{o=this.wrapper.wrapSubrule(e,r,s)}finally{this.isRecording()||(o===void 0&&!n&&(o=this.construct()),o!==void 0&&a&&a.length>0&&this.performSubruleAssignment(o,i,a))}}performSubruleAssignment(e,r,n){let{assignment:i,crossRef:s}=this.getAssignment(r);if(i)this.assign(i.operator,i.feature,e,n,s);else if(!i){let a=this.current;if(kd(a))a.value+=e.toString();else if(typeof e=="object"&&e){let c=this.assignWithoutOverride(e,a);this.stack.pop(),this.stack.push(c)}}}action(e,r){if(!this.isRecording()){let n=this.current;if(r.feature&&r.operator){n=this.construct(),this.nodeBuilder.removeNode(n.$cstNode),this.nodeBuilder.buildCompositeNode(r).content.push(n.$cstNode);let s={$type:e};this.stack.push(s),this.assign(r.operator,r.feature,n,n.$cstNode)}else n.$type=e}}construct(){if(this.isRecording())return;let e=this.stack.pop();return this.nodeBuilder.construct(e),"$infixName"in e?this.constructInfix(e,this.operatorPrecedence.get(e.$infixName)):kd(e)?this.converter.convert(e.value,e.$cstNode):(Tu(this.astReflection,e),e)}constructInfix(e,r){let n=e.parts;if(!Array.isArray(n)||n.length===0)return;let i=e.operators;if(!Array.isArray(i)||n.length<2)return n[0];let s=0,a=-1;for(let k=0;ka?(a=M.precedence,s=k):M.precedence===a&&(M.rightAssoc||(s=k))}let o=i.slice(0,s),c=i.slice(s+1),l=n.slice(0,s+1),u=n.slice(s+1),p={$infixName:e.$infixName,$type:e.$type,$cstNode:e.$cstNode,parts:l,operators:o},h={$infixName:e.$infixName,$type:e.$type,$cstNode:e.$cstNode,parts:u,operators:c},g=this.constructInfix(p,r),C=this.constructInfix(h,r);return{$type:e.$type,$cstNode:e.$cstNode,left:g,operator:i[s],right:C}}getAssignment(e){if(!this.assignmentMap.has(e)){let r=Dr(e,sr);this.assignmentMap.set(e,{assignment:r,crossRef:r&&ar(r.terminal)?r.terminal.isMulti?"multi":"single":void 0})}return this.assignmentMap.get(e)}assign(e,r,n,i,s){let a=this.current,o;switch(s==="single"&&typeof n=="string"?o=this.linker.buildReference(a,r,i,n):s==="multi"&&typeof n=="string"?o=this.linker.buildMultiReference(a,r,i,n):o=n,e){case"=":{a[r]=o;break}case"?=":{a[r]=!0;break}case"+=":Array.isArray(a[r])||(a[r]=[]),a[r].push(o)}}assignWithoutOverride(e,r){for(let[i,s]of Object.entries(r)){let a=e[i];a===void 0?e[i]=s:Array.isArray(a)&&Array.isArray(s)&&(s.push(...a),e[i]=s)}let n=e.$cstNode;return n&&(n.astNode=void 0,e.$cstNode=void 0),e}get definitionErrors(){return this.wrapper.definitionErrors}},al=class{buildMismatchTokenMessage(e){return Hr.buildMismatchTokenMessage(e)}buildNotAllInputParsedMessage(e){return Hr.buildNotAllInputParsedMessage(e)}buildNoViableAltMessage(e){return Hr.buildNoViableAltMessage(e)}buildEarlyExitMessage(e){return Hr.buildEarlyExitMessage(e)}},cs=class extends al{buildMismatchTokenMessage({expected:e,actual:r}){return`Expecting ${e.LABEL?"`"+e.LABEL+"`":e.name.endsWith(":KW")?`keyword '${e.name.substring(0,e.name.length-3)}'`:`token of type '${e.name}'`} but found \`${r.image}\`.`}buildNotAllInputParsedMessage({firstRedundant:e}){return`Expecting end of file but found \`${e.image}\`.`}},Wa=class extends ja{constructor(){super(...arguments),this.tokens=[],this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}action(){}construct(){}parse(e){this.resetState();let r=this.lexer.tokenize(e,{mode:"partial"});return this.tokens=r.tokens,this.wrapper.input=[...this.tokens],this.mainRule.call(this.wrapper,{}),this.unorderedGroups.clear(),{tokens:this.tokens,elementStack:[...this.lastElementStack],tokenIndex:this.nextTokenIndex}}rule(e,r){let n=this.wrapper.DEFINE_RULE(Bg(e.name),this.startImplementation(r).bind(this));return this.allRules.set(e.name,n),e.entry&&(this.mainRule=n),n}resetState(){this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}startImplementation(e){return r=>{let n=this.keepStackSize();try{e(r)}finally{this.resetStackSize(n)}}}removeUnexpectedElements(){this.elementStack.splice(this.stackSize)}keepStackSize(){let e=this.elementStack.length;return this.stackSize=e,e}resetStackSize(e){this.removeUnexpectedElements(),this.stackSize=e}consume(e,r,n){this.wrapper.wrapConsume(e,r),this.isRecording()||(this.lastElementStack=[...this.elementStack,n],this.nextTokenIndex=this.currIdx+1)}subrule(e,r,n,i,s){this.before(i),this.wrapper.wrapSubrule(e,r,s),this.after(i)}before(e){this.isRecording()||this.elementStack.push(e)}after(e){if(!this.isRecording()){let r=this.elementStack.lastIndexOf(e);r>=0&&this.elementStack.splice(r)}}get currIdx(){return this.wrapper.currIdx}},_A={recoveryEnabled:!0,nodeLocationTracking:"full",skipValidations:!0,errorMessageProvider:new cs},ol=class extends Ia{constructor(e,r){let n=r&&"maxLookahead"in r;super(e,ge(er(ge({},_A),{lookaheadStrategy:n?new Yr({maxLookahead:r.maxLookahead}):new Oa({logging:r.skipValidations?()=>{}:void 0})}),r))}get IS_RECORDING(){return this.RECORDING_PHASE}DEFINE_RULE(e,r,n){return this.RULE(e,r,n)}wrapSelfAnalysis(){this.performSelfAnalysis()}wrapConsume(e,r){return this.consume(e,r,void 0)}wrapSubrule(e,r,n){return this.subrule(e,r,{ARGS:[n]})}wrapOr(e,r){this.or(e,r)}wrapOption(e,r){this.option(e,r)}wrapMany(e,r){this.many(e,r)}wrapAtLeastOne(e,r){this.atLeastOne(e,r)}rule(e){return e.call(this,{})}},Nd=class extends ol{constructor(e,r,n){super(e,r),this.task=n}rule(e){this.task.start(),this.task.startSubTask(this.ruleName(e));try{return super.rule(e)}finally{this.task.stopSubTask(this.ruleName(e)),this.task.stop()}}ruleName(e){return e.ruleName}subrule(e,r,n){this.task.startSubTask(this.ruleName(r));try{return super.subrule(e,r,n)}finally{this.task.stopSubTask(this.ruleName(r))}}};function Va(t,e,r){return bA({parser:e,tokens:r,ruleNames:new Map},t),e}function bA(t,e){let r=da(e,!1),n=ee(e.rules).filter(nt).filter(s=>r.has(s));for(let s of n){let a=er(ge({},t),{consume:1,optional:1,subrule:1,many:1,or:1});t.parser.rule(s,ai(a,s.definition))}let i=ee(e.rules).filter(dn).filter(s=>r.has(s));for(let s of i)t.parser.rule(s,PA(t,s))}function PA(t,e){let r=e.call.rule.ref;if(!r)throw new Error("Could not resolve reference to infix operator rule: "+e.call.rule.$refText);if(kt(r))throw new Error("Cannot use terminal rule in infix expression");let n=e.operators.precedences.flatMap(g=>g.operators),i={$type:"Group",elements:[]},s={$container:i,$type:"Assignment",feature:"parts",operator:"+=",terminal:e.call},a={$container:i,$type:"Group",elements:[],cardinality:"*"};i.elements.push(s,a);let c={$container:a,$type:"Assignment",feature:"operators",operator:"+=",terminal:{$type:"Alternatives",elements:n}},l=er(ge({},s),{$container:a});a.elements.push(c,l);let p=n.map(g=>t.tokens[g.value]).map((g,C)=>({ALT:()=>t.parser.consume(C,g,c)})),h;return g=>{h??(h=wd(t,r)),t.parser.subrule(0,h,!1,s,g),t.parser.many(0,{DEF:()=>{t.parser.alternatives(0,p),t.parser.subrule(1,h,!1,l,g)}})}}function ai(t,e,r=!1){let n;if(Ht(e))n=UA(t,e);else if(Ur(e))n=OA(t,e);else if(sr(e))n=ai(t,e.terminal);else if(ar(e))n=Wg(t,e);else if(or(e))n=LA(t,e);else if(ec(e))n=MA(t,e);else if(ic(e))n=FA(t,e);else if(fn(e))n=GA(t,e);else if(Su(e)){let i=t.consume++;n=()=>t.parser.consume(i,Bt,e)}else throw new Vn(e.$cstNode,`Unexpected element type: ${e.$type}`);return Vg(t,r?void 0:cl(e),n,e.cardinality)}function OA(t,e){let r=hn(e);return()=>t.parser.action(r,e)}function LA(t,e){let r=e.rule.ref;if(Gr(r)){let n=t.subrule++,i=nt(r)&&r.fragment,s=e.arguments.length>0?DA(r,e.arguments):()=>({}),a;return o=>{a??(a=wd(t,r)),t.parser.subrule(n,a,i,e,s(o))}}else if(kt(r)){let n=t.consume++,i=Cd(t,r.name);return()=>t.parser.consume(n,i,e)}else if(r)Rr(r);else throw new Vn(e.$cstNode,`Undefined rule: ${e.rule.$refText}`)}function DA(t,e){if(e.some(n=>n.calledByName)){let n=e.map(i=>({parameterName:i.parameter?.ref?.name,predicate:Ar(i.value)}));return i=>{let s={};for(let{parameterName:a,predicate:o}of n)a&&(s[a]=o(i));return s}}else{let n=e.map(i=>Ar(i.value));return i=>{let s={};for(let a=0;ae(n)||r(n)}else if(Au(t)){let e=Ar(t.left),r=Ar(t.right);return n=>e(n)&&r(n)}else if(Cu(t)){let e=Ar(t.value);return r=>!e(r)}else if(wu(t)){let e=t.parameter.ref.name;return r=>r!==void 0&&r[e]===!0}else if(vu(t)){let e=!!t.true;return()=>e}Rr(t)}function MA(t,e){if(e.elements.length===1)return ai(t,e.elements[0]);{let r=[];for(let i of e.elements){let s={ALT:ai(t,i,!0)},a=cl(i);a&&(s.GATE=Ar(a)),r.push(s)}let n=t.or++;return i=>t.parser.alternatives(n,r.map(s=>{let a={ALT:()=>s.ALT(i)},o=s.GATE;return o&&(a.GATE=()=>o(i)),a}))}}function FA(t,e){if(e.elements.length===1)return ai(t,e.elements[0]);let r=[];for(let o of e.elements){let c={ALT:ai(t,o,!0)},l=cl(o);l&&(c.GATE=Ar(l)),r.push(c)}let n=t.or++,i=(o,c)=>{let l=c.getRuleStack().join("-");return`uGroup_${o}_${l}`},s=o=>t.parser.alternatives(n,r.map((c,l)=>{let u={ALT:()=>!0},p=t.parser;u.ALT=()=>{if(c.ALT(o),!p.isRecording()){let g=i(n,p);p.unorderedGroups.get(g)||p.unorderedGroups.set(g,[]);let C=p.unorderedGroups.get(g);typeof C?.[l]>"u"&&(C[l]=!0)}};let h=c.GATE;return h?u.GATE=()=>h(o):u.GATE=()=>!p.unorderedGroups.get(i(n,p))?.[l],u})),a=Vg(t,cl(e),s,"*");return o=>{a(o),t.parser.isRecording()||t.parser.unorderedGroups.delete(i(n,t.parser))}}function GA(t,e){let r=e.elements.map(n=>ai(t,n));return n=>r.forEach(i=>i(n))}function cl(t){if(fn(t))return t.guardCondition}function Wg(t,e,r=e.terminal){if(r)if(or(r)&&nt(r.rule.ref)){let n=r.rule.ref,i=t.subrule++,s;return a=>{s??(s=wd(t,n)),t.parser.subrule(i,s,!1,e,a)}}else if(or(r)&&kt(r.rule.ref)){let n=t.consume++,i=Cd(t,r.rule.ref.name);return()=>t.parser.consume(n,i,e)}else if(Ht(r)){let n=t.consume++,i=Cd(t,r.value);return()=>t.parser.consume(n,i,e)}else throw new Error("Could not build cross reference parser");else{if(!e.type.ref)throw new Error("Could not resolve reference to type: "+e.type.$refText);let i=uc(e.type.ref)?.terminal;if(!i)throw new Error("Could not find name assignment for type: "+hn(e.type.ref));return Wg(t,e,i)}}function UA(t,e){let r=t.consume++,n=t.tokens[e.value];if(!n)throw new Error("Could not find token for keyword: "+e.value);return()=>t.parser.consume(r,n,e)}function Vg(t,e,r,n){let i=e&&Ar(e);if(!n)if(i){let s=t.or++;return a=>t.parser.alternatives(s,[{ALT:()=>r(a),GATE:()=>i(a)},{ALT:Vc(),GATE:()=>!i(a)}])}else return r;if(n==="*"){let s=t.many++;return a=>t.parser.many(s,{DEF:()=>r(a),GATE:i?()=>i(a):void 0})}else if(n==="+"){let s=t.many++;if(i){let a=t.or++;return o=>t.parser.alternatives(a,[{ALT:()=>t.parser.atLeastOne(s,{DEF:()=>r(o)}),GATE:()=>i(o)},{ALT:Vc(),GATE:()=>!i(o)}])}else return a=>t.parser.atLeastOne(s,{DEF:()=>r(a)})}else if(n==="?"){let s=t.optional++;return a=>t.parser.optional(s,{DEF:()=>r(a),GATE:i?()=>i(a):void 0})}else Rr(n)}function wd(t,e){let r=qA(t,e),n=t.parser.getRule(r);if(!n)throw new Error(`Rule "${r}" not found."`);return n}function qA(t,e){if(Gr(e))return e.name;if(t.ruleNames.has(e))return t.ruleNames.get(e);{let r=e,n=r.$container,i=e.$type;for(;!nt(n);)(fn(n)||ec(n)||ic(n))&&(i=n.elements.indexOf(r).toString()+":"+i),r=n,n=n.$container;return i=n.name+":"+i,t.ruleNames.set(e,i),i}}function Cd(t,e){let r=t.tokens[e];if(!r)throw new Error(`Token "${e}" not found."`);return r}function Id(t){let e=t.Grammar,r=t.parser.Lexer,n=new Wa(t);return Va(e,n,r.definition),n.finalize(),n}function _d(t){let e=Kg(t);return e.finalize(),e}function Kg(t){let e=t.Grammar,r=t.parser.Lexer,n=new Ba(t);return Va(e,n,r.definition)}var Jr=class{constructor(){this.diagnostics=[]}buildTokens(e,r){let n=ee(da(e,!1)),i=this.buildTerminalTokens(n),s=this.buildKeywordTokens(n,i,r);return s.push(...i),s}flushLexingReport(e){return{diagnostics:this.popDiagnostics()}}popDiagnostics(){let e=[...this.diagnostics];return this.diagnostics=[],e}buildTerminalTokens(e){return e.filter(kt).filter(r=>!r.fragment).map(r=>this.buildTerminalToken(r)).toArray()}buildTerminalToken(e){let r=Li(e),n=this.requiresCustomPattern(r)?this.regexPatternFunction(r):r,i={name:e.name,PATTERN:n};return typeof n=="function"&&(i.LINE_BREAKS=!0),e.hidden&&(i.GROUP=fa(r)?He.SKIPPED:"hidden"),i}requiresCustomPattern(e){return!!(e.flags.includes("u")||e.flags.includes("s"))}regexPatternFunction(e){let r=new RegExp(e,e.flags+"y");return(n,i)=>(r.lastIndex=i,r.exec(n))}buildKeywordTokens(e,r,n){return e.filter(Gr).flatMap(i=>nr(i).filter(Ht)).distinct(i=>i.value).toArray().sort((i,s)=>s.value.length-i.value.length).map(i=>this.buildKeywordToken(i,r,!!n?.caseInsensitive))}buildKeywordToken(e,r,n){let i=this.buildKeywordPattern(e,n),s={name:e.value,PATTERN:i,LONGER_ALT:this.findLongerAlt(e,r)};return typeof i=="function"&&(s.LINE_BREAKS=!0),s}buildKeywordPattern(e,r){return r?new RegExp(pn(e.value),"i"):e.value}findLongerAlt(e,r){return r.reduce((n,i)=>{let s=i?.PATTERN;return s?.source&&Ku("^"+s.source+"$",e.value)&&n.push(i),n},[])}};var oi=class{convert(e,r){let n=r.grammarSource;if(ar(n)&&(n=Xu(n)),or(n)){let i=n.rule.ref;if(!i)throw new Error("This cst node was not parsed by a rule.");return this.runConverter(i,e,r)}return e}runConverter(e,r,n){switch(e.name.toUpperCase()){case"INT":return $r.convertInt(r);case"STRING":return $r.convertString(r);case"ID":return $r.convertID(r)}switch(nf(e)?.toLowerCase()){case"number":return $r.convertNumber(r);case"boolean":return $r.convertBoolean(r);case"bigint":return $r.convertBigint(r);case"date":return $r.convertDate(r);default:return r}}},$r;(function(t){function e(l){let u="";for(let p=1;p{typeof setImmediate>"u"?setTimeout(t,0):setImmediate(t)})}var dl=0,Jg=10;function pl(){return dl=performance.now(),new W.CancellationTokenSource}function Qg(t){Jg=t}var Yt=Symbol("OperationCancelled");function Sr(t){return t===Yt}function Me(t){return P(this,null,function*(){if(t===W.CancellationToken.None)return;let e=performance.now();if(e-dl>=Jg&&(dl=e,yield Fd(),dl=performance.now()),t.isCancellationRequested)throw Yt})}var It=class{constructor(){this.promise=new Promise((e,r)=>{this.resolve=n=>(e(n),this),this.reject=n=>(r(n),this)})}};var hl=class t{constructor(e,r,n,i){this._uri=e,this._languageId=r,this._version=n,this._content=i,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let r=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(r,n)}return this._content}update(e,r){for(let n of e)if(t.isIncremental(n)){let i=ty(n.range),s=this.offsetAt(i.start),a=this.offsetAt(i.end);this._content=this._content.substring(0,s)+n.text+this._content.substring(a,this._content.length);let o=Math.max(i.start.line,0),c=Math.max(i.end.line,0),l=this._lineOffsets,u=Zg(n.text,!1,s);if(c-o===u.length)for(let h=0,g=u.length;he?i=a:n=a+1}let s=n-1;return e=this.ensureBeforeEOL(e,r[s]),{line:s,character:e-r[s]}}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line];if(e.character<=0)return n;let i=e.line+1r&&ey(this._content.charCodeAt(e-1));)e--;return e}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range!==void 0&&(r.rangeLength===void 0||typeof r.rangeLength=="number")}static isFull(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range===void 0&&r.rangeLength===void 0}},ds;(function(t){function e(i,s,a,o){return new hl(i,s,a,o)}t.create=e;function r(i,s,a){if(i instanceof hl)return i.update(s,a),i;throw new Error("TextDocument.update: document must be created by TextDocument.create")}t.update=r;function n(i,s){let a=i.getText(),o=Gd(s.map(JA),(u,p)=>{let h=u.range.start.line-p.range.start.line;return h===0?u.range.start.character-p.range.start.character:h}),c=0,l=[];for(let u of o){let p=i.offsetAt(u.range.start);if(pc&&l.push(a.substring(c,p)),u.newText.length&&l.push(u.newText),c=i.offsetAt(u.range.end)}return l.push(a.substr(c)),l.join("")}t.applyEdits=n})(ds||(ds={}));function Gd(t,e){if(t.length<=1)return t;let r=t.length/2|0,n=t.slice(0,r),i=t.slice(r);Gd(n,e),Gd(i,e);let s=0,a=0,o=0;for(;sr.line||e.line===r.line&&e.character>r.character?{start:r,end:e}:t}function JA(t){let e=ty(t.range);return e!==t.range?{newText:t.newText,range:e}:t}var ry;(()=>{"use strict";var t={975:$=>{function y(T){if(typeof T!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(T))}function L(T,x){for(var A,_="",U=0,N=-1,Y=0,Q=0;Q<=T.length;++Q){if(Q2){var de=_.lastIndexOf("/");if(de!==_.length-1){de===-1?(_="",U=0):U=(_=_.slice(0,de)).length-1-_.lastIndexOf("/"),N=Q,Y=0;continue}}else if(_.length===2||_.length===1){_="",U=0,N=Q,Y=0;continue}}x&&(_.length>0?_+="/..":_="..",U=2)}else _.length>0?_+="/"+T.slice(N+1,Q):_=T.slice(N+1,Q),U=Q-N-1;N=Q,Y=0}else A===46&&Y!==-1?++Y:Y=-1}return _}var O={resolve:function(){for(var T,x="",A=!1,_=arguments.length-1;_>=-1&&!A;_--){var U;_>=0?U=arguments[_]:(T===void 0&&(T=process.cwd()),U=T),y(U),U.length!==0&&(x=U+"/"+x,A=U.charCodeAt(0)===47)}return x=L(x,!A),A?x.length>0?"/"+x:"/":x.length>0?x:"."},normalize:function(T){if(y(T),T.length===0)return".";var x=T.charCodeAt(0)===47,A=T.charCodeAt(T.length-1)===47;return(T=L(T,!x)).length!==0||x||(T="."),T.length>0&&A&&(T+="/"),x?"/"+T:T},isAbsolute:function(T){return y(T),T.length>0&&T.charCodeAt(0)===47},join:function(){if(arguments.length===0)return".";for(var T,x=0;x0&&(T===void 0?T=A:T+="/"+A)}return T===void 0?".":O.normalize(T)},relative:function(T,x){if(y(T),y(x),T===x||(T=O.resolve(T))===(x=O.resolve(x)))return"";for(var A=1;AQ){if(x.charCodeAt(N+ue)===47)return x.slice(N+ue+1);if(ue===0)return x.slice(N+ue)}else U>Q&&(T.charCodeAt(A+ue)===47?de=ue:ue===0&&(de=0));break}var ve=T.charCodeAt(A+ue);if(ve!==x.charCodeAt(N+ue))break;ve===47&&(de=ue)}var We="";for(ue=A+de+1;ue<=_;++ue)ue!==_&&T.charCodeAt(ue)!==47||(We.length===0?We+="..":We+="/..");return We.length>0?We+x.slice(N+de):(N+=de,x.charCodeAt(N)===47&&++N,x.slice(N))},_makeLong:function(T){return T},dirname:function(T){if(y(T),T.length===0)return".";for(var x=T.charCodeAt(0),A=x===47,_=-1,U=!0,N=T.length-1;N>=1;--N)if((x=T.charCodeAt(N))===47){if(!U){_=N;break}}else U=!1;return _===-1?A?"/":".":A&&_===1?"//":T.slice(0,_)},basename:function(T,x){if(x!==void 0&&typeof x!="string")throw new TypeError('"ext" argument must be a string');y(T);var A,_=0,U=-1,N=!0;if(x!==void 0&&x.length>0&&x.length<=T.length){if(x.length===T.length&&x===T)return"";var Y=x.length-1,Q=-1;for(A=T.length-1;A>=0;--A){var de=T.charCodeAt(A);if(de===47){if(!N){_=A+1;break}}else Q===-1&&(N=!1,Q=A+1),Y>=0&&(de===x.charCodeAt(Y)?--Y==-1&&(U=A):(Y=-1,U=Q))}return _===U?U=Q:U===-1&&(U=T.length),T.slice(_,U)}for(A=T.length-1;A>=0;--A)if(T.charCodeAt(A)===47){if(!N){_=A+1;break}}else U===-1&&(N=!1,U=A+1);return U===-1?"":T.slice(_,U)},extname:function(T){y(T);for(var x=-1,A=0,_=-1,U=!0,N=0,Y=T.length-1;Y>=0;--Y){var Q=T.charCodeAt(Y);if(Q!==47)_===-1&&(U=!1,_=Y+1),Q===46?x===-1?x=Y:N!==1&&(N=1):x!==-1&&(N=-1);else if(!U){A=Y+1;break}}return x===-1||_===-1||N===0||N===1&&x===_-1&&x===A+1?"":T.slice(x,_)},format:function(T){if(T===null||typeof T!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof T);return(function(x,A){var _=A.dir||A.root,U=A.base||(A.name||"")+(A.ext||"");return _?_===A.root?_+U:_+"/"+U:U})(0,T)},parse:function(T){y(T);var x={root:"",dir:"",base:"",ext:"",name:""};if(T.length===0)return x;var A,_=T.charCodeAt(0),U=_===47;U?(x.root="/",A=1):A=0;for(var N=-1,Y=0,Q=-1,de=!0,ue=T.length-1,ve=0;ue>=A;--ue)if((_=T.charCodeAt(ue))!==47)Q===-1&&(de=!1,Q=ue+1),_===46?N===-1?N=ue:ve!==1&&(ve=1):N!==-1&&(ve=-1);else if(!de){Y=ue+1;break}return N===-1||Q===-1||ve===0||ve===1&&N===Q-1&&N===Y+1?Q!==-1&&(x.base=x.name=Y===0&&U?T.slice(1,Q):T.slice(Y,Q)):(Y===0&&U?(x.name=T.slice(1,N),x.base=T.slice(1,Q)):(x.name=T.slice(Y,N),x.base=T.slice(Y,Q)),x.ext=T.slice(N,Q)),Y>0?x.dir=T.slice(0,Y-1):U&&(x.dir="/"),x},sep:"/",delimiter:":",win32:null,posix:null};O.posix=O,$.exports=O}},e={};function r($){var y=e[$];if(y!==void 0)return y.exports;var L=e[$]={exports:{}};return t[$](L,L.exports,r),L.exports}r.d=($,y)=>{for(var L in y)r.o(y,L)&&!r.o($,L)&&Object.defineProperty($,L,{enumerable:!0,get:y[L]})},r.o=($,y)=>Object.prototype.hasOwnProperty.call($,y),r.r=$=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty($,Symbol.toStringTag,{value:"Module"}),Object.defineProperty($,"__esModule",{value:!0})};var n={};let i;r.r(n),r.d(n,{URI:()=>h,Utils:()=>Kt}),typeof process=="object"?i=process.platform==="win32":typeof navigator=="object"&&(i=navigator.userAgent.indexOf("Windows")>=0);let s=/^\w[\w\d+.-]*$/,a=/^\//,o=/^\/\//;function c($,y){if(!$.scheme&&y)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${$.authority}", path: "${$.path}", query: "${$.query}", fragment: "${$.fragment}"}`);if($.scheme&&!s.test($.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if($.path){if($.authority){if(!a.test($.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(o.test($.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}let l="",u="/",p=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class h{static isUri(y){return y instanceof h||!!y&&typeof y.authority=="string"&&typeof y.fragment=="string"&&typeof y.path=="string"&&typeof y.query=="string"&&typeof y.scheme=="string"&&typeof y.fsPath=="string"&&typeof y.with=="function"&&typeof y.toString=="function"}scheme;authority;path;query;fragment;constructor(y,L,O,T,x,A=!1){typeof y=="object"?(this.scheme=y.scheme||l,this.authority=y.authority||l,this.path=y.path||l,this.query=y.query||l,this.fragment=y.fragment||l):(this.scheme=(function(_,U){return _||U?_:"file"})(y,A),this.authority=L||l,this.path=(function(_,U){switch(_){case"https":case"http":case"file":U?U[0]!==u&&(U=u+U):U=u}return U})(this.scheme,O||l),this.query=T||l,this.fragment=x||l,c(this,A))}get fsPath(){return b(this,!1)}with(y){if(!y)return this;let{scheme:L,authority:O,path:T,query:x,fragment:A}=y;return L===void 0?L=this.scheme:L===null&&(L=l),O===void 0?O=this.authority:O===null&&(O=l),T===void 0?T=this.path:T===null&&(T=l),x===void 0?x=this.query:x===null&&(x=l),A===void 0?A=this.fragment:A===null&&(A=l),L===this.scheme&&O===this.authority&&T===this.path&&x===this.query&&A===this.fragment?this:new C(L,O,T,x,A)}static parse(y,L=!1){let O=p.exec(y);return O?new C(O[2]||l,ye(O[4]||l),ye(O[5]||l),ye(O[7]||l),ye(O[9]||l),L):new C(l,l,l,l,l)}static file(y){let L=l;if(i&&(y=y.replace(/\\/g,u)),y[0]===u&&y[1]===u){let O=y.indexOf(u,2);O===-1?(L=y.substring(2),y=u):(L=y.substring(2,O),y=y.substring(O)||u)}return new C("file",L,y,l,l)}static from(y){let L=new C(y.scheme,y.authority,y.path,y.query,y.fragment);return c(L,!0),L}toString(y=!1){return E(this,y)}toJSON(){return this}static revive(y){if(y){if(y instanceof h)return y;{let L=new C(y);return L._formatted=y.external,L._fsPath=y._sep===g?y.fsPath:null,L}}return y}}let g=i?1:void 0;class C extends h{_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=b(this,!1)),this._fsPath}toString(y=!1){return y?E(this,!0):(this._formatted||(this._formatted=E(this,!1)),this._formatted)}toJSON(){let y={$mid:1};return this._fsPath&&(y.fsPath=this._fsPath,y._sep=g),this._formatted&&(y.external=this._formatted),this.path&&(y.path=this.path),this.scheme&&(y.scheme=this.scheme),this.authority&&(y.authority=this.authority),this.query&&(y.query=this.query),this.fragment&&(y.fragment=this.fragment),y}}let k={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function G($,y,L){let O,T=-1;for(let x=0;x<$.length;x++){let A=$.charCodeAt(x);if(A>=97&&A<=122||A>=65&&A<=90||A>=48&&A<=57||A===45||A===46||A===95||A===126||y&&A===47||L&&A===91||L&&A===93||L&&A===58)T!==-1&&(O+=encodeURIComponent($.substring(T,x)),T=-1),O!==void 0&&(O+=$.charAt(x));else{O===void 0&&(O=$.substr(0,x));let _=k[A];_!==void 0?(T!==-1&&(O+=encodeURIComponent($.substring(T,x)),T=-1),O+=_):T===-1&&(T=x)}}return T!==-1&&(O+=encodeURIComponent($.substring(T))),O!==void 0?O:$}function M($){let y;for(let L=0;L<$.length;L++){let O=$.charCodeAt(L);O===35||O===63?(y===void 0&&(y=$.substr(0,L)),y+=k[O]):y!==void 0&&(y+=$[L])}return y!==void 0?y:$}function b($,y){let L;return L=$.authority&&$.path.length>1&&$.scheme==="file"?`//${$.authority}${$.path}`:$.path.charCodeAt(0)===47&&($.path.charCodeAt(1)>=65&&$.path.charCodeAt(1)<=90||$.path.charCodeAt(1)>=97&&$.path.charCodeAt(1)<=122)&&$.path.charCodeAt(2)===58?y?$.path.substr(1):$.path[1].toLowerCase()+$.path.substr(2):$.path,i&&(L=L.replace(/\//g,"\\")),L}function E($,y){let L=y?M:G,O="",{scheme:T,authority:x,path:A,query:_,fragment:U}=$;if(T&&(O+=T,O+=":"),(x||T==="file")&&(O+=u,O+=u),x){let N=x.indexOf("@");if(N!==-1){let Y=x.substr(0,N);x=x.substr(N+1),N=Y.lastIndexOf(":"),N===-1?O+=L(Y,!1,!1):(O+=L(Y.substr(0,N),!1,!1),O+=":",O+=L(Y.substr(N+1),!1,!0)),O+="@"}x=x.toLowerCase(),N=x.lastIndexOf(":"),N===-1?O+=L(x,!1,!0):(O+=L(x.substr(0,N),!1,!0),O+=x.substr(N))}if(A){if(A.length>=3&&A.charCodeAt(0)===47&&A.charCodeAt(2)===58){let N=A.charCodeAt(1);N>=65&&N<=90&&(A=`/${String.fromCharCode(N+32)}:${A.substr(3)}`)}else if(A.length>=2&&A.charCodeAt(1)===58){let N=A.charCodeAt(0);N>=65&&N<=90&&(A=`${String.fromCharCode(N+32)}:${A.substr(2)}`)}O+=L(A,!0,!1)}return _&&(O+="?",O+=L(_,!1,!1)),U&&(O+="#",O+=y?U:G(U,!1,!1)),O}function H($){try{return decodeURIComponent($)}catch(y){return $.length>3?$.substr(0,3)+H($.substr(3)):$}}let F=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function ye($){return $.match(F)?$.replace(F,y=>H(y)):$}var dr=r(975);let Je=dr.posix||dr,Qt="/";var Kt;(function($){$.joinPath=function(y,...L){return y.with({path:Je.join(y.path,...L)})},$.resolvePath=function(y,...L){let O=y.path,T=!1;O[0]!==Qt&&(O=Qt+O,T=!0);let x=Je.resolve(O,...L);return T&&x[0]===Qt&&!y.authority&&(x=x.substring(1)),y.with({path:x})},$.dirname=function(y){if(y.path.length===0||y.path===Qt)return y;let L=Je.dirname(y.path);return L.length===1&&L.charCodeAt(0)===46&&(L=""),y.with({path:L})},$.basename=function(y){return Je.basename(y.path)},$.extname=function(y){return Je.extname(y.path)}})(Kt||(Kt={})),ry=n})();var{URI:rt,Utils:ps}=ry;var Be;(function(t){t.basename=ps.basename,t.dirname=ps.dirname,t.extname=ps.extname,t.joinPath=ps.joinPath,t.resolvePath=ps.resolvePath;let e=typeof process=="object"&&process?.platform==="win32";function r(a,o){return a?.toString()===o?.toString()}t.equals=r;function n(a,o){let c=typeof a=="string"?rt.parse(a).path:a.path,l=typeof o=="string"?rt.parse(o).path:o.path,u=c.split("/").filter(k=>k.length>0),p=l.split("/").filter(k=>k.length>0);if(e){let k=/^[A-Z]:$/;if(u[0]&&k.test(u[0])&&(u[0]=u[0].toLowerCase()),p[0]&&k.test(p[0])&&(p[0]=p[0].toLowerCase()),u[0]!==p[0])return l.substring(1)}let h=0;for(;h({name:i.name,uri:Be.joinPath(rt.parse(r),i.name).toString(),element:i.element})):[]}all(){return this.collectValues(this.root)}findAll(e){let r=this.getNode(Be.normalize(e),!1);return r?this.collectValues(r):[]}getNode(e,r){let n=e.split("/");e.charAt(e.length-1)==="/"&&n.pop();let i=this.root;for(let s of n){let a=i.children.get(s);if(!a)if(r)a={name:s,children:new Map,parent:i},i.children.set(s,a);else return;i=a}return i}collectValues(e){let r=[];e.element&&r.push(e.element);for(let n of e.children.values())r.push(...this.collectValues(n));return r}};var re=(function(t){return t[t.Changed=0]="Changed",t[t.Parsed=1]="Parsed",t[t.IndexedContent=2]="IndexedContent",t[t.ComputedScopes=3]="ComputedScopes",t[t.Linked=4]="Linked",t[t.IndexedReferences=5]="IndexedReferences",t[t.Validated=6]="Validated",t})(re||{}),Ha=class{constructor(e){this.serviceRegistry=e.ServiceRegistry,this.textDocuments=e.workspace.TextDocuments,this.fileSystemProvider=e.workspace.FileSystemProvider}fromUri(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){let i=yield this.fileSystemProvider.readFile(e);return this.createAsync(e,i,r)})}fromTextDocument(e,r,n){return r=r??rt.parse(e.uri),W.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromString(e,r,n){return W.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromModel(e,r){return this.create(r,{$model:e})}create(e,r,n){if(typeof r=="string"){let i=this.parse(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else if("$model"in r){let i={value:r.$model,parserErrors:[],lexerErrors:[]};return this.createLangiumDocument(i,e)}else{let i=this.parse(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}createAsync(e,r,n){return P(this,null,function*(){if(typeof r=="string"){let i=yield this.parseAsync(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else{let i=yield this.parseAsync(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}})}createLangiumDocument(e,r,n,i){let s;if(n)s={parseResult:e,uri:r,state:re.Parsed,references:[],textDocument:n};else{let a=this.createTextDocumentGetter(r,i);s={parseResult:e,uri:r,state:re.Parsed,references:[],get textDocument(){return a()}}}return e.value.$document=s,s}update(e,r){return P(this,null,function*(){let n=e.parseResult.value.$cstNode?.root.fullText,i=this.textDocuments?.get(e.uri.toString()),s=i?i.getText():yield this.fileSystemProvider.readFile(e.uri);if(i)Object.defineProperty(e,"textDocument",{value:i});else{let a=this.createTextDocumentGetter(e.uri,s);Object.defineProperty(e,"textDocument",{get:a})}return n!==s&&(e.parseResult=yield this.parseAsync(e.uri,s,r),e.parseResult.value.$document=e),e.state=re.Parsed,e})}parse(e,r,n){return this.serviceRegistry.getServices(e).parser.LangiumParser.parse(r,n)}parseAsync(e,r,n){return this.serviceRegistry.getServices(e).parser.AsyncParser.parse(r,n)}createTextDocumentGetter(e,r){let n=this.serviceRegistry,i;return()=>i??(i=ds.create(e.toString(),n.getServices(e).LanguageMetaData.languageId,0,r??""))}},Ya=class{constructor(e){this.documentTrie=new hs,this.services=e,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.documentBuilder=()=>e.workspace.DocumentBuilder}get all(){return ee(this.documentTrie.all())}addDocument(e){let r=e.uri.toString();if(this.documentTrie.has(r))throw new Error(`A document with the URI '${r}' is already present.`);this.documentTrie.insert(r,e)}getDocument(e){let r=e.toString();return this.documentTrie.find(r)}getDocuments(e){let r=e.toString();return this.documentTrie.findAll(r)}getOrCreateDocument(e,r){return P(this,null,function*(){let n=this.getDocument(e);return n||(n=yield this.langiumDocumentFactory.fromUri(e,r),this.addDocument(n),n)})}createDocument(e,r,n){if(n)return this.langiumDocumentFactory.fromString(r,e,n).then(i=>(this.addDocument(i),i));{let i=this.langiumDocumentFactory.fromString(r,e);return this.addDocument(i),i}}hasDocument(e){return this.documentTrie.has(e.toString())}invalidateDocument(e){let r=e.toString(),n=this.documentTrie.find(r);return n&&this.documentBuilder().resetToState(n,re.Changed),n}deleteDocument(e){let r=e.toString(),n=this.documentTrie.find(r);return n&&(n.state=re.Changed,this.documentTrie.delete(r)),n}deleteDocuments(e){let r=e.toString(),n=this.documentTrie.findAll(r);for(let i of n)i.state=re.Changed;return this.documentTrie.delete(r),n}};var li=Symbol("RefResolving"),Xa=class{constructor(e){this.reflection=e.shared.AstReflection,this.langiumDocuments=()=>e.shared.workspace.LangiumDocuments,this.scopeProvider=e.references.ScopeProvider,this.astNodeLocator=e.workspace.AstNodeLocator,this.profiler=e.shared.profilers.LangiumProfiler,this.languageId=e.LanguageMetaData.languageId}link(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){if(this.profiler?.isActive("linking")){let i=this.profiler.createTask("linking",this.languageId);i.start();try{for(let s of St(e.parseResult.value))yield Me(r),sn(s).forEach(a=>{let o=`${s.$type}:${a.property}`;i.startSubTask(o);try{this.doLink(a,e)}finally{i.stopSubTask(o)}})}finally{i.stop()}}else for(let i of St(e.parseResult.value))yield Me(r),sn(i).forEach(s=>this.doLink(s,e))})}doLink(e,r){let n=e.reference;if("_ref"in n&&n._ref===void 0){n._ref=li;try{let i=this.getCandidate(e);if(bn(i))n._ref=i;else{n._nodeDescription=i;let s=this.loadAstNode(i);n._ref=s??this.createLinkingError(e,i)}}catch(i){console.error(`An error occurred while resolving reference to '${n.$refText}':`,i);let s=i.message??String(i);n._ref={info:e,message:`An error occurred while resolving reference to '${n.$refText}': ${s}`}}r.references.push(n)}else if("_items"in n&&n._items===void 0){n._items=li;try{let i=this.getCandidates(e),s=[];if(bn(i))n._linkingError=i;else for(let a of i){let o=this.loadAstNode(a);o&&s.push({ref:o,$nodeDescription:a})}n._items=s}catch(i){n._linkingError={info:e,message:`An error occurred while resolving reference to '${n.$refText}': ${i}`},n._items=[]}r.references.push(n)}}unlink(e){for(let r of e.references)"_ref"in r?(r._ref=void 0,delete r._nodeDescription):"_items"in r&&(r._items=void 0,delete r._linkingError);e.references=[]}getCandidate(e){return this.scopeProvider.getScope(e).getElement(e.reference.$refText)??this.createLinkingError(e)}getCandidates(e){let n=this.scopeProvider.getScope(e).getElements(e.reference.$refText).distinct(i=>`${i.documentUri}#${i.path}`).toArray();return n.length>0?n:this.createLinkingError(e)}buildReference(e,r,n,i){let s=this,a={$refNode:n,$refText:i,_ref:void 0,get ref(){if(Oe(this._ref))return this._ref;if(mu(this._nodeDescription)){let o=s.loadAstNode(this._nodeDescription);this._ref=o??s.createLinkingError({reference:a,container:e,property:r},this._nodeDescription)}else if(this._ref===void 0){this._ref=li;let o=$i(e).$document,c=s.getLinkedNode({reference:a,container:e,property:r});if(c.error&&o&&o.state0))return this._linkingError=s.createLinkingError({reference:a,container:e,property:r})}};return a}throwCyclicReferenceError(e,r,n){throw new Error(`Cyclic reference resolution detected: ${this.astNodeLocator.getAstNodePath(e)}/${r} (symbol '${n}')`)}getLinkedNode(e){try{let r=this.getCandidate(e);if(bn(r))return{error:r};let n=this.loadAstNode(r);return n?{node:n,descr:r}:{descr:r,error:this.createLinkingError(e,r)}}catch(r){console.error(`An error occurred while resolving reference to '${e.reference.$refText}':`,r);let n=r.message??String(r);return{error:{info:e,message:`An error occurred while resolving reference to '${e.reference.$refText}': ${n}`}}}}loadAstNode(e){if(e.node)return e.node;let r=this.langiumDocuments().getDocument(e.documentUri);if(r)return this.astNodeLocator.getAstNode(r.parseResult.value,e.path)}createLinkingError(e,r){let n=$i(e.container).$document;n&&n.statear(r)&&r.isMulti)}findDeclarations(e){if(e){let r=rf(e),n=e.astNode;if(r&&n){let i=n[r.feature];if(tt(i)||Ut(i))return Go(i);if(Array.isArray(i)){for(let s of i)if((tt(s)||Ut(s))&&s.$refNode&&s.$refNode.offset<=e.offset&&s.$refNode.end>=e.end)return Go(s)}}if(n){let i=this.nameProvider.getNameNode(n);if(i&&(i===e||Gu(e,i)))return this.getSelfNodes(n)}}return[]}getSelfNodes(e){if(this.hasMultiReference){let r=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e)),n=this.getNodeFromReferenceDescription(r.head());if(n){for(let i of sn(n))if(Ut(i.reference)&&i.reference.items.some(s=>s.ref===e))return i.reference.items.map(s=>s.ref)}return[e]}else return[e]}getNodeFromReferenceDescription(e){if(!e)return;let r=this.documents.getDocument(e.sourceUri);if(r)return this.nodeLocator.getAstNode(r.parseResult.value,e.sourcePath)}findDeclarationNodes(e){let r=this.findDeclarations(e),n=[];for(let i of r){let s=this.nameProvider.getNameNode(i)??i.$cstNode;s&&n.push(s)}return n}findReferences(e,r){let n=[];r.includeDeclaration&&n.push(...this.getSelfReferences(e));let i=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e));return r.documentUri&&(i=i.filter(s=>Be.equals(s.sourceUri,r.documentUri))),n.push(...i),ee(n)}getSelfReferences(e){let r=this.getSelfNodes(e),n=[];for(let i of r){let s=this.nameProvider.getNameNode(i);if(s){let a=yt(i),o=this.nodeLocator.getAstNodePath(i);n.push({sourceUri:a.uri,sourcePath:o,targetUri:a.uri,targetPath:o,segment:Wn(s),local:!0})}}return n}};var Rt=class{constructor(e){if(this.map=new Map,e)for(let[r,n]of e)this.add(r,n)}get size(){return Ei.sum(ee(this.map.values()).map(e=>e.length))}clear(){this.map.clear()}delete(e,r){if(r===void 0)return this.map.delete(e);{let n=this.map.get(e);if(n){let i=n.indexOf(r);if(i>=0)return n.length===1?this.map.delete(e):n.splice(i,1),!0}return!1}}get(e){return this.map.get(e)??[]}getStream(e){let r=this.map.get(e);return r?ee(r):nn}has(e,r){if(r===void 0)return this.map.has(e);{let n=this.map.get(e);return n?n.indexOf(r)>=0:!1}}add(e,r){return this.map.has(e)?this.map.get(e).push(r):this.map.set(e,[r]),this}addAll(e,r){return this.map.has(e)?this.map.get(e).push(...r):this.map.set(e,Array.from(r)),this}forEach(e){this.map.forEach((r,n)=>r.forEach(i=>e(i,n,this)))}[Symbol.iterator](){return this.entries().iterator()}entries(){return ee(this.map.entries()).flatMap(([e,r])=>r.map(n=>[e,n]))}keys(){return ee(this.map.keys())}values(){return ee(this.map.values()).flat()}entriesGroupedByKey(){return ee(this.map.entries())}},ui=class{get size(){return this.map.size}constructor(e){if(this.map=new Map,this.inverse=new Map,e)for(let[r,n]of e)this.set(r,n)}clear(){this.map.clear(),this.inverse.clear()}set(e,r){return this.map.set(e,r),this.inverse.set(r,e),this}get(e){return this.map.get(e)}getKey(e){return this.inverse.get(e)}delete(e){let r=this.map.get(e);return r!==void 0?(this.map.delete(e),this.inverse.delete(r),!0):!1}};var Za=class{constructor(e){this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider}collectExportedSymbols(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){return this.collectExportedSymbolsForNode(e.parseResult.value,e,void 0,r)})}collectExportedSymbolsForNode(s,a){return P(this,arguments,function*(e,r,n=Xs,i=W.CancellationToken.None){let o=[];this.addExportedSymbol(e,o,r);for(let c of n(e))yield Me(i),this.addExportedSymbol(c,o,r);return o})}addExportedSymbol(e,r,n){let i=this.nameProvider.getName(e);i&&r.push(this.descriptions.createDescription(e,i,n))}collectLocalSymbols(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){let i=e.parseResult.value,s=new Rt;for(let a of nr(i))yield Me(r),this.addLocalSymbol(a,e,s);return s})}addLocalSymbol(e,r,n){let i=e.$container;if(i){let s=this.nameProvider.getName(e);s&&n.add(i,this.descriptions.createDescription(e,s,r))}}};var ms=class{constructor(e,r,n){this.elements=e,this.outerScope=r,this.caseInsensitive=n?.caseInsensitive??!1,this.concatOuterScope=n?.concatOuterScope??!0}getAllElements(){return this.outerScope?this.elements.concat(this.outerScope.getAllElements()):this.elements}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.caseInsensitive?this.elements.find(i=>i.name.toLowerCase()===r):this.elements.find(i=>i.name===e);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getElements(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.caseInsensitive?this.elements.filter(i=>i.name.toLowerCase()===r):this.elements.filter(i=>i.name===e);return(this.concatOuterScope||n.isEmpty())&&this.outerScope?n.concat(this.outerScope.getElements(e)):n}},Ud=class{constructor(e,r,n){this.elements=new Map,this.caseInsensitive=n?.caseInsensitive??!1,this.concatOuterScope=n?.concatOuterScope??!0;for(let i of e){let s=this.caseInsensitive?i.name.toLowerCase():i.name;this.elements.set(s,i)}this.outerScope=r}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getElements(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r),i=n?[n]:[];return(this.concatOuterScope||i.length>0)&&this.outerScope?ee(i).concat(this.outerScope.getElements(e)):ee(i)}getAllElements(){let e=ee(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},eo=class{constructor(e,r,n){this.elements=new Rt,this.caseInsensitive=n?.caseInsensitive??!1,this.concatOuterScope=n?.concatOuterScope??!0;for(let i of e){let s=this.caseInsensitive?i.name.toLowerCase():i.name;this.elements.add(s,i)}this.outerScope=r}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r)[0];if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getElements(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r);return(this.concatOuterScope||n.length===0)&&this.outerScope?ee(n).concat(this.outerScope.getElements(e)):ee(n)}getAllElements(){let e=ee(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},QA={getElement(){},getElements(){return nn},getAllElements(){return nn}};var gs=class{constructor(){this.toDispose=[],this.isDisposed=!1}onDispose(e){this.toDispose.push(e)}dispose(){this.throwIfDisposed(),this.clear(),this.isDisposed=!0,this.toDispose.forEach(e=>e.dispose())}throwIfDisposed(){if(this.isDisposed)throw new Error("This cache has already been disposed")}},to=class extends gs{constructor(){super(...arguments),this.cache=new Map}has(e){return this.throwIfDisposed(),this.cache.has(e)}set(e,r){this.throwIfDisposed(),this.cache.set(e,r)}get(e,r){if(this.throwIfDisposed(),this.cache.has(e))return this.cache.get(e);if(r){let n=r();return this.cache.set(e,n),n}else return}delete(e){return this.throwIfDisposed(),this.cache.delete(e)}clear(){this.throwIfDisposed(),this.cache.clear()}},fi=class extends gs{constructor(e){super(),this.cache=new Map,this.converter=e??(r=>r)}has(e,r){return this.throwIfDisposed(),this.cacheForContext(e).has(r)}set(e,r,n){this.throwIfDisposed(),this.cacheForContext(e).set(r,n)}get(e,r,n){this.throwIfDisposed();let i=this.cacheForContext(e);if(i.has(r))return i.get(r);if(n){let s=n();return i.set(r,s),s}else return}delete(e,r){return this.throwIfDisposed(),this.cacheForContext(e).delete(r)}clear(e){if(this.throwIfDisposed(),e){let r=this.converter(e);this.cache.delete(r)}else this.cache.clear()}cacheForContext(e){let r=this.converter(e),n=this.cache.get(r);return n||(n=new Map,this.cache.set(r,n)),n}},ml=class extends fi{constructor(e,r){super(n=>n.toString()),r?(this.toDispose.push(e.workspace.DocumentBuilder.onDocumentPhase(r,n=>{this.clear(n.uri.toString())})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{for(let s of i)this.clear(s)}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{let s=n.concat(i);for(let a of s)this.clear(a)}))}},ys=class extends to{constructor(e,r){super(),r?(this.toDispose.push(e.workspace.DocumentBuilder.onBuildPhase(r,()=>{this.clear()})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{i.length>0&&this.clear()}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate(()=>{this.clear()}))}};var ro=class{constructor(e){this.reflection=e.shared.AstReflection,this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider,this.indexManager=e.shared.workspace.IndexManager,this.globalScopeCache=new ys(e.shared)}getScope(e){let r=[],n=this.reflection.getReferenceType(e),i=yt(e.container).localSymbols;if(i){let a=e.container;do i.has(a)&&r.push(i.getStream(a).filter(o=>this.reflection.isSubtype(o.type,n))),a=a.$container;while(a)}let s=this.getGlobalScope(n,e);for(let a=r.length-1;a>=0;a--)s=this.createScope(r[a],s);return s}createScope(e,r,n){return new ms(ee(e),r,n)}createScopeForNodes(e,r,n){let i=ee(e).map(s=>{let a=this.nameProvider.getName(s);if(a)return this.descriptions.createDescription(s,a)}).nonNullable();return new ms(i,r,n)}getGlobalScope(e,r){return this.globalScopeCache.get(e,()=>new eo(this.indexManager.allElements(e)))}};function qd(t){return typeof t.$comment=="string"}function iy(t){return typeof t=="object"&&!!t&&("$ref"in t||"$error"in t)}var no=class{constructor(e){this.ignoreProperties=new Set(["$container","$containerProperty","$containerIndex","$document","$cstNode"]),this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider,this.commentProvider=e.documentation.CommentProvider}serialize(e,r){let n=r??{},i=r?.replacer,s=(o,c)=>this.replacer(o,c,n),a=i?(o,c)=>i(o,c,s):s;try{return this.currentDocument=yt(e),JSON.stringify(e,a,r?.space)}finally{this.currentDocument=void 0}}deserialize(e,r){let n=r??{},i=JSON.parse(e);return this.linkNode(i,i,n),i}replacer(e,r,{refText:n,sourceText:i,textRegions:s,comments:a,uriConverter:o}){if(!this.ignoreProperties.has(e))if(tt(r)){let c=r.ref,l=n?r.$refText:void 0;if(c){let u=yt(c),p="";this.currentDocument&&this.currentDocument!==u&&(o?p=o(u.uri,c):p=u.uri.toString());let h=this.astNodeLocator.getAstNodePath(c);return{$ref:`${p}#${h}`,$refText:l}}else return{$error:r.error?.message??"Could not resolve reference",$refText:l}}else if(Ut(r)){let c=n?r.$refText:void 0,l=[];for(let u of r.items){let p=u.ref,h=yt(u.ref),g="";this.currentDocument&&this.currentDocument!==h&&(o?g=o(h.uri,p):g=h.uri.toString());let C=this.astNodeLocator.getAstNodePath(p);l.push(`${g}#${C}`)}return{$refs:l,$refText:c}}else if(Oe(r)){let c;if(s&&(c=this.addAstNodeRegionWithAssignmentsTo(ge({},r)),(!e||r.$document)&&c?.$textRegion&&(c.$textRegion.documentURI=this.currentDocument?.uri.toString())),i&&!e&&(c??(c=ge({},r)),c.$sourceText=r.$cstNode?.text),a){c??(c=ge({},r));let l=this.commentProvider.getComment(r);l&&(c.$comment=l.replace(/\r/g,""))}return c??r}else return r}addAstNodeRegionWithAssignmentsTo(e){let r=n=>({offset:n.offset,end:n.end,length:n.length,range:n.range});if(e.$cstNode){let n=e.$textRegion=r(e.$cstNode),i=n.assignments={};return Object.keys(e).filter(s=>!s.startsWith("$")).forEach(s=>{let a=Qu(e.$cstNode,s).map(r);a.length!==0&&(i[s]=a)}),e}}linkNode(e,r,n,i,s,a){for(let[c,l]of Object.entries(e))if(Array.isArray(l))for(let u=0;uP(this,null,function*(){yield this.handleException(()=>e.call(r,n,i,s),"An error occurred during validation",i,n)})}handleException(e,r,n,i){return P(this,null,function*(){try{yield e()}catch(s){if(Sr(s))throw s;console.error(`${r}:`,s),s instanceof Error&&s.stack&&console.error(s.stack);let a=s instanceof Error?s.message:String(s);n("error",`${r}: ${a}`,{node:i})}})}addEntry(e,r){if(e==="AstNode"){this.entries.add("AstNode",r);return}for(let n of this.reflection.getAllSubTypes(e))this.entries.add(n,r)}getChecks(e,r){let n=ee(this.entries.get(e)).concat(this.entries.get("AstNode"));return r&&(n=n.filter(i=>r.includes(i.category))),n.map(i=>i.check)}registerBeforeDocument(e,r=this){this.entriesBefore.push(this.wrapPreparationException(e,"An error occurred during set-up of the validation",r))}registerAfterDocument(e,r=this){this.entriesAfter.push(this.wrapPreparationException(e,"An error occurred during tear-down of the validation",r))}wrapPreparationException(e,r,n){return(i,s,a,o)=>P(this,null,function*(){yield this.handleException(()=>e.call(n,i,s,a,o),r,s,i)})}get checksBefore(){return this.entriesBefore}get checksAfter(){return this.entriesAfter}getAllValidationCategories(e){return this.knownCategories}};var sy=Object.freeze({validateNode:!0,validateChildren:!0}),ao=class{constructor(e){this.validationRegistry=e.validation.ValidationRegistry,this.metadata=e.LanguageMetaData,this.profiler=e.shared.profilers.LangiumProfiler,this.languageId=e.LanguageMetaData.languageId}validateDocument(i){return P(this,arguments,function*(e,r={},n=W.CancellationToken.None){let s=e.parseResult,a=[];if(yield Me(n),(!r.categories||r.categories.includes("built-in"))&&(this.processLexingErrors(s,a,r),r.stopAfterLexingErrors&&a.some(o=>o.data?.code===lr.LexingError)||(this.processParsingErrors(s,a,r),r.stopAfterParsingErrors&&a.some(o=>o.data?.code===lr.ParsingError))||(this.processLinkingErrors(e,a,r),r.stopAfterLinkingErrors&&a.some(o=>o.data?.code===lr.LinkingError))))return a;try{a.push(...yield this.validateAst(s.value,r,n))}catch(o){if(Sr(o))throw o;console.error("An error occurred during validation:",o)}return yield Me(n),a})}processLexingErrors(e,r,n){let i=[...e.lexerErrors,...e.lexerReport?.diagnostics??[]];for(let s of i){let a=s.severity??"error",o={severity:yl(a),range:{start:{line:s.line-1,character:s.column-1},end:{line:s.line-1,character:s.column+s.length-1}},message:s.message,data:oy(a),source:this.getSource()};r.push(o)}}processParsingErrors(e,r,n){for(let i of e.parserErrors){let s;if(isNaN(i.token.startOffset)){if("previousToken"in i){let a=i.previousToken;if(isNaN(a.startOffset)){let o={line:0,character:0};s={start:o,end:o}}else{let o={line:a.endLine-1,character:a.endColumn};s={start:o,end:o}}}}else s=Pi(i.token);if(s){let a={severity:yl("error"),range:s,message:i.message,data:di(lr.ParsingError),source:this.getSource()};r.push(a)}}}processLinkingErrors(e,r,n){for(let i of e.references){let s=i.error;if(s){let a={node:s.info.container,range:i.$refNode?.range,property:s.info.property,index:s.info.index,data:{code:lr.LinkingError,containerType:s.info.container.$type,property:s.info.property,refText:s.info.reference.$refText}};r.push(this.toDiagnostic("error",s.message,a))}}}validateAst(i,s){return P(this,arguments,function*(e,r,n=W.CancellationToken.None){let a=[],o=(c,l,u)=>{a.push(this.toDiagnostic(c,l,u))};return yield this.validateAstBefore(e,r,o,n),yield this.validateAstNodes(e,r,o,n),yield this.validateAstAfter(e,r,o,n),a})}validateAstBefore(s,a,o){return P(this,arguments,function*(e,r,n,i=W.CancellationToken.None){let c=this.validationRegistry.checksBefore;for(let l of c)yield Me(i),yield l(e,n,r.categories??[],i)})}validateAstNodes(s,a,o){return P(this,arguments,function*(e,r,n,i=W.CancellationToken.None){if(this.profiler?.isActive("validating")){let c=this.profiler.createTask("validating",this.languageId);c.start();try{let l=St(e).iterator();for(let u of l){c.startSubTask(u.$type);let p=this.validateSingleNodeOptions(u,r);if(p.validateNode)try{let h=this.validationRegistry.getChecks(u.$type,r.categories);for(let g of h)yield g(u,n,i)}finally{c.stopSubTask(u.$type)}p.validateChildren||l.prune()}}finally{c.stop()}}else{let c=St(e).iterator();for(let l of c){yield Me(i);let u=this.validateSingleNodeOptions(l,r);if(u.validateNode){let p=this.validationRegistry.getChecks(l.$type,r.categories);for(let h of p)yield h(l,n,i)}u.validateChildren||c.prune()}}})}validateSingleNodeOptions(e,r){return sy}validateAstAfter(s,a,o){return P(this,arguments,function*(e,r,n,i=W.CancellationToken.None){let c=this.validationRegistry.checksAfter;for(let l of c)yield Me(i),yield l(e,n,r.categories??[],i)})}toDiagnostic(e,r,n){return{message:r,range:ay(n),severity:yl(e),code:n.code,codeDescription:n.codeDescription,tags:n.tags,relatedInformation:n.relatedInformation,data:n.data,source:this.getSource()}}getSource(){return this.metadata.languageId}};function ay(t){if(t.range)return t.range;let e;return typeof t.property=="string"?e=pa(t.node.$cstNode,t.property,t.index):typeof t.keyword=="string"&&(e=ef(t.node.$cstNode,t.keyword,t.index)),e??(e=t.node.$cstNode),e?e.range:{start:{line:0,character:0},end:{line:0,character:0}}}function yl(t){switch(t){case"error":return 1;case"warning":return 2;case"info":return 3;case"hint":return 4;default:throw new Error("Invalid diagnostic severity: "+t)}}function oy(t){switch(t){case"error":return di(lr.LexingError);case"warning":return di(lr.LexingWarning);case"info":return di(lr.LexingInfo);case"hint":return di(lr.LexingHint);default:throw new Error("Invalid diagnostic severity: "+t)}}var lr=(function(t){return t.LexingError="lexing-error",t.LexingWarning="lexing-warning",t.LexingInfo="lexing-info",t.LexingHint="lexing-hint",t.ParsingError="parsing-error",t.LinkingError="linking-error",t})(lr||{});var oo=class{constructor(e){this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider}createDescription(e,r,n){let i=n??yt(e);r??(r=this.nameProvider.getName(e));let s=this.astNodeLocator.getAstNodePath(e);if(!r)throw new Error(`Node at path ${s} has no name.`);let a,o=()=>a??(a=Wn(this.nameProvider.getNameNode(e)??e.$cstNode));return{node:e,name:r,get nameSegment(){return o()},selectionSegment:Wn(e.$cstNode),type:e.$type,documentUri:i.uri,path:s}}},co=class{constructor(e){this.nodeLocator=e.workspace.AstNodeLocator}createDescriptions(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){let i=[],s=e.parseResult.value;for(let a of St(s))yield Me(r),sn(a).forEach(o=>{o.reference.error||i.push(...this.createInfoDescriptions(o))});return i})}createInfoDescriptions(e){let r=e.reference;if(r.error||!r.$refNode)return[];let n=[];tt(r)&&r.$nodeDescription?n=[r.$nodeDescription]:Ut(r)&&(n=r.items.map(c=>c.$nodeDescription).filter(c=>c!==void 0));let i=yt(e.container).uri,s=this.nodeLocator.getAstNodePath(e.container),a=[],o=Wn(r.$refNode);for(let c of n)a.push({sourceUri:i,sourcePath:s,targetUri:c.documentUri,targetPath:c.path,segment:o,local:Be.equals(c.documentUri,i)});return a}};var lo=class{constructor(){this.segmentSeparator="/",this.indexSeparator="@"}getAstNodePath(e){if(e.$container){let r=this.getAstNodePath(e.$container),n=this.getPathSegment(e);return r+this.segmentSeparator+n}return""}getPathSegment({$containerProperty:e,$containerIndex:r}){if(!e)throw new Error("Missing '$containerProperty' in AST node.");return r!==void 0?e+this.indexSeparator+r:e}getAstNode(e,r){return r.split(this.segmentSeparator).reduce((i,s)=>{if(!i||s.length===0)return i;let a=s.indexOf(this.indexSeparator);if(a>0){let o=s.substring(0,a),c=parseInt(s.substring(a+1));return i[o]?.[c]}return i[s]},e)}};var we={};ae(we,du(ci(),1));var uo=class{constructor(e){this._ready=new It,this.onConfigurationSectionUpdateEmitter=new we.Emitter,this.settings={},this.workspaceConfig=!1,this.serviceRegistry=e.ServiceRegistry}get ready(){return this._ready.promise}initialize(e){this.workspaceConfig=e.capabilities.workspace?.configuration??!1}initialized(e){return P(this,null,function*(){if(this.workspaceConfig){if(e.register){let r=this.serviceRegistry.all;e.register({section:r.map(n=>this.toSectionName(n.LanguageMetaData.languageId))})}if(e.fetchConfiguration){let r=this.serviceRegistry.all.map(i=>({section:this.toSectionName(i.LanguageMetaData.languageId)})),n=yield e.fetchConfiguration(r);r.forEach((i,s)=>{this.updateSectionConfiguration(i.section,n[s])})}}this._ready.resolve()})}updateConfiguration(e){typeof e.settings!="object"||e.settings===null||Object.entries(e.settings).forEach(([r,n])=>{this.updateSectionConfiguration(r,n),this.onConfigurationSectionUpdateEmitter.fire({section:r,configuration:n})})}updateSectionConfiguration(e,r){this.settings[e]=r}getConfiguration(e,r){return P(this,null,function*(){yield this.ready;let n=this.toSectionName(e);if(this.settings[n])return this.settings[n][r]})}toSectionName(e){return`${e}`}get onConfigurationSectionUpdate(){return this.onConfigurationSectionUpdateEmitter.event}};var Ps=du(Ix(),1);var Cn;(function(t){function e(r){return{dispose:()=>P(null,null,function*(){return yield r()})}}t.create=e})(Cn||(Cn={}));var xo=class{constructor(e){this.updateBuildOptions={validation:{categories:["built-in","fast"]}},this.updateListeners=[],this.buildPhaseListeners=new Rt,this.documentPhaseListeners=new Rt,this.buildState=new Map,this.documentBuildWaiters=new Map,this.currentState=re.Changed,this.langiumDocuments=e.workspace.LangiumDocuments,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.textDocuments=e.workspace.TextDocuments,this.indexManager=e.workspace.IndexManager,this.fileSystemProvider=e.workspace.FileSystemProvider,this.workspaceManager=()=>e.workspace.WorkspaceManager,this.serviceRegistry=e.ServiceRegistry}build(i){return P(this,arguments,function*(e,r={},n=W.CancellationToken.None){for(let s of e){let a=s.uri.toString();if(s.state===re.Validated){if(typeof r.validation=="boolean"&&r.validation)this.resetToState(s,re.IndexedReferences);else if(typeof r.validation=="object"){let o=this.findMissingValidationCategories(s,r);o.length>0&&(this.buildState.set(a,{completed:!1,options:{validation:{categories:o}},result:this.buildState.get(a)?.result}),s.state=re.IndexedReferences)}}else this.buildState.delete(a)}this.currentState=re.Changed,yield this.emitUpdate(e.map(s=>s.uri),[]),yield this.buildDocuments(e,r,n)})}update(i,s){return P(this,arguments,function*(e,r,n=W.CancellationToken.None){this.currentState=re.Changed;let a=[];for(let u of r){let p=this.langiumDocuments.deleteDocuments(u);for(let h of p)a.push(h.uri),this.cleanUpDeleted(h)}let o=(yield Promise.all(e.map(u=>this.findChangedUris(u)))).flat();for(let u of o){let p=this.langiumDocuments.getDocument(u);p===void 0&&(p=this.langiumDocumentFactory.fromModel({$type:"INVALID"},u),p.state=re.Changed,this.langiumDocuments.addDocument(p)),this.resetToState(p,re.Changed)}let c=ee(o).concat(a).map(u=>u.toString()).toSet();this.langiumDocuments.all.filter(u=>!c.has(u.uri.toString())&&this.shouldRelink(u,c)).forEach(u=>this.resetToState(u,re.ComputedScopes)),yield this.emitUpdate(o,a),yield Me(n);let l=this.sortDocuments(this.langiumDocuments.all.filter(u=>u.state=1}findMissingValidationCategories(e,r){let n=this.buildState.get(e.uri.toString()),i=this.serviceRegistry.getServices(e.uri).validation.ValidationRegistry.getAllValidationCategories(e),s=n?.result?.validationChecks?new Set(n?.result?.validationChecks):n?.completed?i:new Set,a=r===void 0||r.validation===!0?i:typeof r.validation=="object"?r.validation.categories??i:[];return ee(a).filter(o=>!s.has(o)).toArray()}findChangedUris(e){return P(this,null,function*(){if(this.langiumDocuments.getDocument(e)??this.textDocuments?.get(e))return[e];try{let n=yield this.fileSystemProvider.stat(e);if(n.isDirectory)return yield this.workspaceManager().searchFolder(e);if(this.workspaceManager().shouldIncludeEntry(n))return[e]}catch(n){}return[]})}emitUpdate(e,r){return P(this,null,function*(){yield Promise.all(this.updateListeners.map(n=>n(e,r)))})}sortDocuments(e){let r=0,n=e.length-1;for(;r=0&&!this.hasTextDocument(e[n]);)n--;rn.error!==void 0)?!0:this.indexManager.isAffected(e,r)}onUpdate(e){return this.updateListeners.push(e),Cn.create(()=>{let r=this.updateListeners.indexOf(e);r>=0&&this.updateListeners.splice(r,1)})}resetToState(e,r){switch(r){case re.Changed:case re.Parsed:this.indexManager.removeContent(e.uri);case re.IndexedContent:e.localSymbols=void 0;case re.ComputedScopes:this.serviceRegistry.getServices(e.uri).references.Linker.unlink(e);case re.Linked:this.indexManager.removeReferences(e.uri);case re.IndexedReferences:e.diagnostics=void 0,this.buildState.delete(e.uri.toString());case re.Validated:}e.state>r&&(e.state=r)}cleanUpDeleted(e){this.buildState.delete(e.uri.toString()),this.indexManager.remove(e.uri),e.state=re.Changed}buildDocuments(e,r,n){return P(this,null,function*(){this.prepareBuild(e,r),yield this.runCancelable(e,re.Parsed,n,a=>this.langiumDocumentFactory.update(a,n)),yield this.runCancelable(e,re.IndexedContent,n,a=>this.indexManager.updateContent(a,n)),yield this.runCancelable(e,re.ComputedScopes,n,a=>P(this,null,function*(){let o=this.serviceRegistry.getServices(a.uri).references.ScopeComputation;a.localSymbols=yield o.collectLocalSymbols(a,n)}));let i=e.filter(a=>this.shouldLink(a));yield this.runCancelable(i,re.Linked,n,a=>this.serviceRegistry.getServices(a.uri).references.Linker.link(a,n)),yield this.runCancelable(i,re.IndexedReferences,n,a=>this.indexManager.updateReferences(a,n));let s=e.filter(a=>this.shouldValidate(a)?!0:(this.markAsCompleted(a),!1));yield this.runCancelable(s,re.Validated,n,a=>P(this,null,function*(){yield this.validate(a,n),this.markAsCompleted(a)}))})}markAsCompleted(e){let r=this.buildState.get(e.uri.toString());r&&(r.completed=!0)}prepareBuild(e,r){for(let n of e){let i=n.uri.toString(),s=this.buildState.get(i);(!s||s.completed)&&this.buildState.set(i,{completed:!1,options:r,result:s?.result})}}runCancelable(e,r,n,i){return P(this,null,function*(){for(let a of e)a.statea.state===r);yield this.notifyBuildPhase(s,r,n),this.currentState=r})}onBuildPhase(e,r){return this.buildPhaseListeners.add(e,r),Cn.create(()=>{this.buildPhaseListeners.delete(e,r)})}onDocumentPhase(e,r){return this.documentPhaseListeners.add(e,r),Cn.create(()=>{this.documentPhaseListeners.delete(e,r)})}waitUntil(e,r,n){let i;return r&&"path"in r?i=r:n=r,n??(n=W.CancellationToken.None),i?this.awaitDocumentState(e,i,n):this.awaitBuilderState(e,n)}awaitDocumentState(e,r,n){let i=this.langiumDocuments.getDocument(r);if(i){if(i.state>=e)return Promise.resolve(r);if(n.isCancellationRequested)return Promise.reject(Yt);if(this.currentState>=e&&e>i.state)return Promise.reject(new Ps.ResponseError(Ps.LSPErrorCodes.RequestFailed,`Document state of ${r.toString()} is ${re[i.state]}, requiring ${re[e]}, but workspace state is already ${re[this.currentState]}. Returning undefined.`))}else return Promise.reject(new Ps.ResponseError(Ps.LSPErrorCodes.ServerCancelled,`No document found for URI: ${r.toString()}`));return new Promise((s,a)=>{let o=this.onDocumentPhase(e,l=>{Be.equals(l.uri,r)&&(o.dispose(),c.dispose(),s(l.uri))}),c=n.onCancellationRequested(()=>{o.dispose(),c.dispose(),a(Yt)})})}awaitBuilderState(e,r){return this.currentState>=e?Promise.resolve():r.isCancellationRequested?Promise.reject(Yt):new Promise((n,i)=>{let s=this.onBuildPhase(e,()=>{s.dispose(),a.dispose(),n()}),a=r.onCancellationRequested(()=>{s.dispose(),a.dispose(),i(Yt)})})}notifyDocumentPhase(e,r,n){return P(this,null,function*(){let s=this.documentPhaseListeners.get(r).slice();for(let a of s)try{yield Me(n),yield a(e,n)}catch(o){if(!Sr(o))throw o}})}notifyBuildPhase(e,r,n){return P(this,null,function*(){if(e.length===0)return;let s=this.buildPhaseListeners.get(r).slice();for(let a of s)yield Me(n),yield a(e,n)})}shouldLink(e){return this.getBuildOptions(e).eagerLinking??!0}shouldValidate(e){return!!this.getBuildOptions(e).validation}validate(e,r){return P(this,null,function*(){let n=this.serviceRegistry.getServices(e.uri).validation.DocumentValidator,i=this.getBuildOptions(e),s=typeof i.validation=="object"?ge({},i.validation):{};s.categories=this.findMissingValidationCategories(e,i);let a=yield n.validateDocument(e,s,r);e.diagnostics?e.diagnostics.push(...a):e.diagnostics=a;let o=this.buildState.get(e.uri.toString());o&&(o.result??(o.result={}),o.result.validationChecks?o.result.validationChecks=ee(o.result.validationChecks).concat(s.categories).distinct().toArray():o.result.validationChecks=[...s.categories])})}getBuildOptions(e){return this.buildState.get(e.uri.toString())?.options??{}}};var vo=class{constructor(e){this.symbolIndex=new Map,this.symbolByTypeIndex=new fi,this.referenceIndex=new Map,this.documents=e.workspace.LangiumDocuments,this.serviceRegistry=e.ServiceRegistry,this.astReflection=e.AstReflection}findAllReferences(e,r){let n=yt(e).uri,i=[];return this.referenceIndex.forEach(s=>{s.forEach(a=>{Be.equals(a.targetUri,n)&&a.targetPath===r&&i.push(a)})}),ee(i)}allElements(e,r){let n=ee(this.symbolIndex.keys());return r&&(n=n.filter(i=>!r||r.has(i))),n.map(i=>this.getFileDescriptions(i,e)).flat()}getFileDescriptions(e,r){return r?this.symbolByTypeIndex.get(e,r,()=>(this.symbolIndex.get(e)??[]).filter(s=>this.astReflection.isSubtype(s.type,r))):this.symbolIndex.get(e)??[]}remove(e){this.removeContent(e),this.removeReferences(e)}removeContent(e){let r=e.toString();this.symbolIndex.delete(r),this.symbolByTypeIndex.clear(r)}removeReferences(e){let r=e.toString();this.referenceIndex.delete(r)}updateContent(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){let s=yield this.serviceRegistry.getServices(e.uri).references.ScopeComputation.collectExportedSymbols(e,r),a=e.uri.toString();this.symbolIndex.set(a,s),this.symbolByTypeIndex.clear(a)})}updateReferences(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){let s=yield this.serviceRegistry.getServices(e.uri).workspace.ReferenceDescriptionProvider.createDescriptions(e,r);this.referenceIndex.set(e.uri.toString(),s)})}isAffected(e,r){let n=this.referenceIndex.get(e.uri.toString());return n?n.some(i=>!i.local&&r.has(i.targetUri.toString())):!1}};var Eo=class{constructor(e){this.initialBuildOptions={},this._ready=new It,this.serviceRegistry=e.ServiceRegistry,this.langiumDocuments=e.workspace.LangiumDocuments,this.documentBuilder=e.workspace.DocumentBuilder,this.fileSystemProvider=e.workspace.FileSystemProvider,this.mutex=e.workspace.WorkspaceLock}get ready(){return this._ready.promise}get workspaceFolders(){return this.folders}initialize(e){this.folders=e.workspaceFolders??void 0}initialized(e){return this.mutex.write(r=>this.initializeWorkspace(this.folders??[],r))}initializeWorkspace(n){return P(this,arguments,function*(e,r=W.CancellationToken.None){let i=yield this.performStartup(e);yield Me(r),yield this.documentBuilder.build(i,this.initialBuildOptions,r)})}performStartup(e){return P(this,null,function*(){let r=[],n=a=>{r.push(a),this.langiumDocuments.hasDocument(a.uri)||this.langiumDocuments.addDocument(a)};yield this.loadAdditionalDocuments(e,n);let i=[];yield Promise.all(e.map(a=>this.getRootFolder(a)).map(a=>P(this,null,function*(){return this.traverseFolder(a,i)})));let s=ee(i).distinct(a=>a.toString()).filter(a=>!this.langiumDocuments.hasDocument(a));return yield this.loadWorkspaceDocuments(s,n),this._ready.resolve(),r})}loadWorkspaceDocuments(e,r){return P(this,null,function*(){yield Promise.all(e.map(n=>P(this,null,function*(){let i=yield this.langiumDocuments.getOrCreateDocument(n);r(i)})))})}loadAdditionalDocuments(e,r){return Promise.resolve()}getRootFolder(e){return rt.parse(e.uri)}traverseFolder(e,r){return P(this,null,function*(){try{let n=yield this.fileSystemProvider.readDirectory(e);yield Promise.all(n.map(i=>P(this,null,function*(){this.shouldIncludeEntry(i)&&(i.isDirectory?yield this.traverseFolder(i.uri,r):i.isFile&&r.push(i.uri))})))}catch(n){console.error("Failure to read directory content of "+e.toString(!0),n)}})}searchFolder(e){return P(this,null,function*(){let r=[];return yield this.traverseFolder(e,r),r})}shouldIncludeEntry(e){let r=Be.basename(e.uri);return r.startsWith(".")?!1:e.isDirectory?r!=="node_modules"&&r!=="out":e.isFile?this.serviceRegistry.hasServices(e.uri):!1}};var Ao=class{buildUnexpectedCharactersMessage(e,r,n,i,s){return ji.buildUnexpectedCharactersMessage(e,r,n,i,s)}buildUnableToPopLexerModeMessage(e){return ji.buildUnableToPopLexerModeMessage(e)}},Xl={mode:"full"},gi=class{constructor(e){this.errorMessageProvider=e.parser.LexerErrorMessageProvider,this.tokenBuilder=e.parser.TokenBuilder;let r=this.tokenBuilder.buildTokens(e.Grammar,{caseInsensitive:e.LanguageMetaData.caseInsensitive});this.tokenTypes=this.toTokenTypeDictionary(r);let n=oh(r)?Object.values(r):r,i=e.LanguageMetaData.mode==="production";this.chevrotainLexer=new He(n,{positionTracking:"full",skipValidations:i,errorMessageProvider:this.errorMessageProvider})}get definition(){return this.tokenTypes}tokenize(e,r=Xl){let n=this.chevrotainLexer.tokenize(e);return{tokens:n.tokens,errors:n.errors,hidden:n.groups.hidden??[],report:this.tokenBuilder.flushLexingReport?.(e)}}toTokenTypeDictionary(e){if(oh(e))return e;let r=ch(e)?Object.values(e.modes).flat():e,n={};return r.forEach(i=>n[i.name]=i),n}};function Jl(t){return Array.isArray(t)&&(t.length===0||"name"in t[0])}function ch(t){return t&&"modes"in t&&"defaultMode"in t}function oh(t){return!Jl(t)&&!ch(t)}as();function fh(t,e,r){let n,i;typeof t=="string"?(i=e,n=r):(i=t.range.start,n=e),i||(i=ce.create(0,0));let s=Px(t),a=ph(n),o=U$({lines:s,position:i,options:a});return W$({index:0,tokens:o,position:i})}function dh(t,e){let r=ph(e),n=Px(t);if(n.length===0)return!1;let i=n[0],s=n[n.length-1],a=r.start,o=r.end;return!!a?.exec(i)&&!!o?.exec(s)}function Px(t){let e="";return typeof t=="string"?e=t:e=t.text,e.split(Wu)}var _x=/\s*(@([\p{L}][\p{L}\p{N}]*)?)/uy,G$=/\{(@[\p{L}][\p{L}\p{N}]*)(\s*)([^\r\n}]+)?\}/gu;function U$(t){let e=[],r=t.position.line,n=t.position.character;for(let i=0;i=o.length){if(e.length>0){let u=ce.create(r,n);e.push({type:"break",content:"",range:ie.create(u,u)})}}else{_x.lastIndex=c;let u=_x.exec(o);if(u){let p=u[0],h=u[1],g=ce.create(r,n+c),C=ce.create(r,n+c+p.length);e.push({type:"tag",content:h,range:ie.create(g,C)}),c+=p.length,c=uh(o,c)}if(c0&&e[e.length-1].type==="break"?e.slice(0,-1):e}function q$(t,e,r,n){let i=[];if(t.length===0){let s=ce.create(r,n),a=ce.create(r,n+e.length);i.push({type:"text",content:e,range:ie.create(s,a)})}else{let s=0;for(let o of t){let c=o.index,l=e.substring(s,c);l.length>0&&i.push({type:"text",content:e.substring(s,c),range:ie.create(ce.create(r,s+n),ce.create(r,c+n))});let u=l.length+1,p=o[1];if(i.push({type:"inline-tag",content:p,range:ie.create(ce.create(r,s+u+n),ce.create(r,s+u+p.length+n))}),u+=p.length,o.length===4){u+=o[2].length;let h=o[3];i.push({type:"text",content:h,range:ie.create(ce.create(r,s+u+n),ce.create(r,s+u+h.length+n))})}else i.push({type:"text",content:"",range:ie.create(ce.create(r,s+u+n),ce.create(r,s+u+n))});s=c+o[0].length}let a=e.substring(s);a.length>0&&i.push({type:"text",content:a,range:ie.create(ce.create(r,s+n),ce.create(r,s+n+a.length))})}return i}var z$=/\S/,j$=/\s*$/;function uh(t,e){let r=t.substring(e).match(z$);return r?e+r.index:t.length}function B$(t){let e=t.match(j$);if(e&&typeof e.index=="number")return e.index}function W$(t){let e=ce.create(t.position.line,t.position.character);if(t.tokens.length===0)return new Ql([],ie.create(e,e));let r=[];for(;t.indexr.name===e)}getTags(e){return this.getAllTags().filter(r=>r.name===e)}getAllTags(){return this.elements.filter(e=>"name"in e)}toString(){let e="";for(let r of this.elements)if(e.length===0)e=r.toString();else{let n=r.toString();e+=bx(e)+n}return e.trim()}toMarkdown(e){let r="";for(let n of this.elements)if(r.length===0)r=n.toMarkdown(e);else{let i=n.toMarkdown(e);r+=bx(r)+i}return r.trim()}},$o=class{constructor(e,r,n,i){this.name=e,this.content=r,this.inline=n,this.range=i}toString(){let e=`@${this.name}`,r=this.content.toString();return this.content.inlines.length===1?e=`${e} ${r}`:this.content.inlines.length>1&&(e=`${e} +${r}`),this.inline?`{${e}}`:e}toMarkdown(e){return e?.renderTag?.(this)??this.toMarkdownDefault(e)}toMarkdownDefault(e){let r=this.content.toMarkdown(e);if(this.inline){let s=Y$(this.name,r,e??{});if(typeof s=="string")return s}let n="";e?.tag==="italic"||e?.tag===void 0?n="*":e?.tag==="bold"?n="**":e?.tag==="bold-italic"&&(n="***");let i=`${n}@${this.name}${n}`;return this.content.inlines.length===1?i=`${i} \u2014 ${r}`:this.content.inlines.length>1&&(i=`${i} +${r}`),this.inline?`{${i}}`:i}};function Y$(t,e,r){if(t==="linkplain"||t==="linkcode"||t==="link"){let n=e.indexOf(" "),i=e;if(n>0){let a=uh(e,n);i=e.substring(a),e=e.substring(0,n)}return(t==="linkcode"||t==="link"&&r.link==="code")&&(i=`\`${i}\``),r.renderLink?.(e,i)??X$(e,i)}}function X$(t,e){try{return rt.parse(t,!0),`[${e}](${t})`}catch(r){return t}}var So=class{constructor(e,r){this.inlines=e,this.range=r}toString(){let e="";for(let r=0;rn.range.start.line&&(e+=` +`)}return e}toMarkdown(e){let r="";for(let n=0;ni.range.start.line&&(r+=` +`)}return r}},Zl=class{constructor(e,r){this.text=e,this.range=r}toString(){return this.text}toMarkdown(){return this.text}};function bx(t){return t.endsWith(` +`)?` +`:` + +`}var ko=class{constructor(e){this.indexManager=e.shared.workspace.IndexManager,this.commentProvider=e.documentation.CommentProvider}getDocumentation(e){let r=this.commentProvider.getComment(e);if(r&&dh(r))return fh(r).toMarkdown({renderLink:(i,s)=>this.documentationLinkRenderer(e,i,s),renderTag:i=>this.documentationTagRenderer(e,i)})}documentationLinkRenderer(e,r,n){let i=this.findNameInLocalSymbols(e,r)??this.findNameInGlobalScope(e,r);if(i&&i.nameSegment){let s=i.nameSegment.range.start.line+1,a=i.nameSegment.range.start.character+1,o=i.documentUri.with({fragment:`L${s},${a}`});return`[${n}](${o.toString()})`}else return}documentationTagRenderer(e,r){}findNameInLocalSymbols(e,r){let i=yt(e).localSymbols;if(!i)return;let s=e;do{let o=i.getStream(s).find(c=>c.name===r);if(o)return o;s=s.$container}while(s)}findNameInGlobalScope(e,r){return this.indexManager.allElements().find(i=>i.name===r)}};var No=class{constructor(e){this.grammarConfig=()=>e.parser.GrammarConfig}getComment(e){return qd(e)?e.$comment:Uu(e.$cstNode,this.grammarConfig().multilineCommentRules)?.text}};var Co=class{constructor(e){this.syncParser=e.parser.LangiumParser}parse(e,r){return Promise.resolve(this.syncParser.parse(e))}},hh=class{constructor(e){this.threadCount=8,this.terminationDelay=200,this.workerPool=[],this.queue=[],this.hydrator=e.serializer.Hydrator}initializeWorkers(){for(;this.workerPool.length{if(this.queue.length>0){let r=this.queue.shift();r&&(e.lock(),r.resolve(e))}}),this.workerPool.push(e)}}parse(e,r){return P(this,null,function*(){let n=yield this.acquireParserWorker(r),i=new It,s,a=r.onCancellationRequested(()=>{s=setTimeout(()=>{this.terminateWorker(n)},this.terminationDelay)});return n.parse(e).then(o=>{let c=this.hydrator.hydrate(o);i.resolve(c)}).catch(o=>{i.reject(o)}).finally(()=>{a.dispose(),clearTimeout(s)}),i.promise})}terminateWorker(e){e.terminate();let r=this.workerPool.indexOf(e);r>=0&&this.workerPool.splice(r,1)}acquireParserWorker(e){return P(this,null,function*(){this.initializeWorkers();for(let n of this.workerPool)if(n.ready)return n.lock(),n;let r=new It;return e.onCancellationRequested(()=>{let n=this.queue.indexOf(r);n>=0&&this.queue.splice(n,1),r.reject(Yt)}),this.queue.push(r),r.promise})}},mh=class{get ready(){return this._ready}get onReady(){return this.onReadyEmitter.event}constructor(e,r,n,i){this.onReadyEmitter=new we.Emitter,this.deferred=new It,this._ready=!0,this._parsing=!1,this.sendMessage=e,this._terminate=i,r(s=>{let a=s;this.deferred.resolve(a),this.unlock()}),n(s=>{this.deferred.reject(s),this.unlock()})}terminate(){this.deferred.reject(Yt),this._terminate()}lock(){this._ready=!1}unlock(){this._parsing=!1,this._ready=!0,this.onReadyEmitter.fire()}parse(e){if(this._parsing)throw new Error("Parser worker is busy");return this._parsing=!0,this.deferred=new It,this.sendMessage(e),this.deferred.promise}};var wo=class{constructor(){this.previousTokenSource=new W.CancellationTokenSource,this.writeQueue=[],this.readQueue=[],this.done=!0}write(e){this.cancelWrite();let r=pl();return this.previousTokenSource=r,this.enqueue(this.writeQueue,e,r.token)}read(e){return this.enqueue(this.readQueue,e)}enqueue(e,r,n=W.CancellationToken.None){let i=new It,s={action:r,deferred:i,cancellationToken:n};return e.push(s),this.performNextOperation(),i.promise}performNextOperation(){return P(this,null,function*(){if(!this.done)return;let e=[];if(this.writeQueue.length>0)e.push(this.writeQueue.shift());else if(this.readQueue.length>0)e.push(...this.readQueue.splice(0,this.readQueue.length));else return;this.done=!1,yield Promise.all(e.map(s=>P(this,[s],function*({action:r,deferred:n,cancellationToken:i}){try{let a=yield Promise.resolve().then(()=>r(i));n.resolve(a)}catch(a){Sr(a)?n.resolve(void 0):n.reject(a)}}))),this.done=!0,this.performNextOperation()})}cancelWrite(){this.previousTokenSource.cancel()}};var Io=class{constructor(e){this.grammarElementIdMap=new ui,this.tokenTypeIdMap=new ui,this.grammar=e.Grammar,this.lexer=e.parser.Lexer,this.linker=e.references.Linker}dehydrate(e){return{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport?this.dehydrateLexerReport(e.lexerReport):void 0,parserErrors:e.parserErrors.map(r=>er(ge({},r),{message:r.message})),value:this.dehydrateAstNode(e.value,this.createDehyrationContext(e.value))}}dehydrateLexerReport(e){return e}createDehyrationContext(e){let r=new Map,n=new Map;for(let i of St(e))r.set(i,{});if(e.$cstNode)for(let i of Bn(e.$cstNode))n.set(i,{});return{astNodes:r,cstNodes:n}}dehydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode!==void 0&&(n.$cstNode=this.dehydrateCstNode(e.$cstNode,r));for(let[i,s]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(s)){let a=[];n[i]=a;for(let o of s)Oe(o)?a.push(this.dehydrateAstNode(o,r)):tt(o)?a.push(this.dehydrateReference(o,r)):a.push(o)}else Oe(s)?n[i]=this.dehydrateAstNode(s,r):tt(s)?n[i]=this.dehydrateReference(s,r):s!==void 0&&(n[i]=s);return n}dehydrateReference(e,r){let n={};return n.$refText=e.$refText,e.$refNode&&(n.$refNode=r.cstNodes.get(e.$refNode)),n}dehydrateCstNode(e,r){let n=r.cstNodes.get(e);return Ys(e)?n.fullText=e.fullText:n.grammarSource=this.getGrammarElementId(e.grammarSource),n.hidden=e.hidden,n.astNode=r.astNodes.get(e.astNode),rr(e)?n.content=e.content.map(i=>this.dehydrateCstNode(i,r)):rn(e)&&(n.tokenType=e.tokenType.name,n.offset=e.offset,n.length=e.length,n.startLine=e.range.start.line,n.startColumn=e.range.start.character,n.endLine=e.range.end.line,n.endColumn=e.range.end.character),n}hydrate(e){let r=e.value,n=this.createHydrationContext(r);return"$cstNode"in r&&this.hydrateCstNode(r.$cstNode,n),{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport,parserErrors:e.parserErrors,value:this.hydrateAstNode(r,n)}}createHydrationContext(e){let r=new Map,n=new Map;for(let s of St(e))r.set(s,{});let i;if(e.$cstNode)for(let s of Bn(e.$cstNode)){let a;"fullText"in s?(a=new os(s.fullText),i=a):"content"in s?a=new si:"tokenType"in s&&(a=this.hydrateCstLeafNode(s)),a&&(n.set(s,a),a.root=i)}return{astNodes:r,cstNodes:n}}hydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode&&(n.$cstNode=r.cstNodes.get(e.$cstNode));for(let[i,s]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(s)){let a=[];n[i]=a;for(let o of s)Oe(o)?a.push(this.setParent(this.hydrateAstNode(o,r),n)):tt(o)?a.push(this.hydrateReference(o,n,i,r)):a.push(o)}else Oe(s)?n[i]=this.setParent(this.hydrateAstNode(s,r),n):tt(s)?n[i]=this.hydrateReference(s,n,i,r):s!==void 0&&(n[i]=s);return n}setParent(e,r){return e.$container=r,e}hydrateReference(e,r,n,i){return this.linker.buildReference(r,n,i.cstNodes.get(e.$refNode),e.$refText)}hydrateCstNode(e,r,n=0){let i=r.cstNodes.get(e);if(typeof e.grammarSource=="number"&&(i.grammarSource=this.getGrammarElement(e.grammarSource)),i.astNode=r.astNodes.get(e.astNode),rr(i))for(let s of e.content){let a=this.hydrateCstNode(s,r,n++);i.content.push(a)}return i}hydrateCstLeafNode(e){let r=this.getTokenType(e.tokenType),n=e.offset,i=e.length,s=e.startLine,a=e.startColumn,o=e.endLine,c=e.endColumn,l=e.hidden;return new ii(n,i,{start:{line:s,character:a},end:{line:o,character:c}},r,l)}getTokenType(e){return this.lexer.definition[e]}getGrammarElementId(e){if(e)return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.get(e)}getGrammarElement(e){return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.getKey(e)}createGrammarElementIdMap(){let e=0;for(let r of St(this.grammar))sa(r)&&this.grammarElementIdMap.set(r,e++)}};function gh(t){return{documentation:{CommentProvider:e=>new No(e),DocumentationProvider:e=>new ko(e)},parser:{AsyncParser:e=>new Co(e),GrammarConfig:e=>af(e),LangiumParser:e=>_d(e),CompletionParser:e=>Id(e),ValueConverter:()=>new oi,TokenBuilder:()=>new Jr,Lexer:e=>new gi(e),ParserErrorMessageProvider:()=>new cs,LexerErrorMessageProvider:()=>new Ao},workspace:{AstNodeLocator:()=>new lo,AstNodeDescriptionProvider:e=>new oo(e),ReferenceDescriptionProvider:e=>new co(e)},references:{Linker:e=>new Xa(e),NameProvider:()=>new Ja,ScopeProvider:e=>new ro(e),ScopeComputation:e=>new Za(e),References:e=>new Qa(e)},serializer:{Hydrator:e=>new Io(e),JsonSerializer:e=>new no(e)},validation:{DocumentValidator:e=>new ao(e),ValidationRegistry:e=>new so(e)},shared:()=>t.shared}}function yh(t){return{ServiceRegistry:e=>new io(e),workspace:{LangiumDocuments:e=>new Ya(e),LangiumDocumentFactory:e=>new Ha(e),DocumentBuilder:e=>new xo(e),IndexManager:e=>new vo(e),WorkspaceManager:e=>new Eo(e),FileSystemProvider:e=>t.fileSystemProvider(e),WorkspaceLock:()=>new wo,ConfigurationProvider:e=>new uo(e)},profilers:{}}}var Gx=(function(t){return t.merge=(e,r)=>_o(_o({},e),r),t})(Gx||{});function eu(t,e,r,n,i,s,a,o,c){let l=[t,e,r,n,i,s,a,o,c].reduce(_o,{});return zx(l)}var Ux=Symbol("isProxy");function qx(t){if(t&&t[Ux])for(let e of Object.values(t))qx(e);return t}function zx(t,e){let r=new Proxy({},{deleteProperty:()=>!1,set:()=>{throw new Error("Cannot set property on injected service container")},get:(n,i)=>i===Ux?!0:Fx(n,i,t,e||r),getOwnPropertyDescriptor:(n,i)=>(Fx(n,i,t,e||r),Object.getOwnPropertyDescriptor(n,i)),has:(n,i)=>i in t,ownKeys:()=>[...Object.getOwnPropertyNames(t)]});return r}var Mx=Symbol();function Fx(t,e,r,n){if(e in t){if(t[e]instanceof Error)throw new Error("Construction failure. Please make sure that your dependencies are constructable. Cause: "+t[e]);if(t[e]===Mx)throw new Error('Cycle detected. Please make "'+String(e)+'" lazy. Visit https://langium.org/docs/reference/configuration-services/#resolving-cyclic-dependencies');return t[e]}else if(e in r){let i=r[e];t[e]=Mx;try{t[e]=typeof i=="function"?i(n):zx(i,n)}catch(s){throw t[e]=s instanceof Error?s:void 0,s}return t[e]}else return}function _o(t,e){if(e){for(let[r,n]of Object.entries(e))if(n!=null)if(typeof n=="object"){let i=t[r];typeof i=="object"&&i!==null?t[r]=_o(i,n):t[r]=_o({},n)}else t[r]=n}return t}var Th={indentTokenName:"INDENT",dedentTokenName:"DEDENT",whitespaceTokenName:"WS",ignoreIndentationDelimiters:[]},Os=(function(t){return t.REGULAR="indentation-sensitive",t.IGNORE_INDENTATION="ignore-indentation",t})(Os||{}),tu=class extends Jr{constructor(e=Th){super(),this.indentationStack=[0],this.whitespaceRegExp=/[ \t]+/y,this.options=ge(ge({},Th),e),this.indentTokenType=mn({name:this.options.indentTokenName,pattern:this.indentMatcher.bind(this),line_breaks:!1}),this.dedentTokenType=mn({name:this.options.dedentTokenName,pattern:this.dedentMatcher.bind(this),line_breaks:!1})}buildTokens(e,r){let n=super.buildTokens(e,r);if(!Jl(n))throw new Error("Invalid tokens built by default builder");let{indentTokenName:i,dedentTokenName:s,whitespaceTokenName:a,ignoreIndentationDelimiters:o}=this.options,c,l,u,p=[];for(let h of n){for(let[g,C]of o)h.name===g?h.PUSH_MODE=Os.IGNORE_INDENTATION:h.name===C&&(h.POP_MODE=!0);h.name===s?c=h:h.name===i?l=h:h.name===a?u=h:p.push(h)}if(!c||!l||!u)throw new Error("Some indentation/whitespace tokens not found!");return o.length>0?{modes:{[Os.REGULAR]:[c,l,...p,u],[Os.IGNORE_INDENTATION]:[...p,u]},defaultMode:Os.REGULAR}:[c,l,u,...p]}flushLexingReport(e){let r=super.flushLexingReport(e);return er(ge({},r),{remainingDedents:this.flushRemainingDedents(e)})}isStartOfLine(e,r){return r===0||`\r +`.includes(e[r-1])}matchWhitespace(e,r,n,i){this.whitespaceRegExp.lastIndex=r;let s=this.whitespaceRegExp.exec(e);return{currIndentLevel:s?.[0].length??0,prevIndentLevel:this.indentationStack.at(-1),match:s}}createIndentationTokenInstance(e,r,n,i){let s=this.getLineNumber(r,i);return Kr(e,n,i,i+n.length,s,s,1,n.length)}getLineNumber(e,r){return e.substring(0,r).split(/\r\n|\r|\n/).length}indentMatcher(e,r,n,i){if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:s,prevIndentLevel:a,match:o}=this.matchWhitespace(e,r,n,i);return s<=a?null:(this.indentationStack.push(s),o)}dedentMatcher(e,r,n,i){if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:s,prevIndentLevel:a,match:o}=this.matchWhitespace(e,r,n,i);if(s>=a)return null;let c=this.indentationStack.lastIndexOf(s);if(c===-1)return this.diagnostics.push({severity:"error",message:`Invalid dedent level ${s} at offset: ${r}. Current indentation stack: ${this.indentationStack}`,offset:r,length:o?.[0]?.length??0,line:this.getLineNumber(e,r),column:1}),null;let l=this.indentationStack.length-c-1,u=e.substring(0,r).match(/[\r\n]+$/)?.[0].length??1;for(let p=0;p1;)r.push(this.createIndentationTokenInstance(this.dedentTokenType,e,"",e.length)),this.indentationStack.pop();return this.indentationStack=[0],r}},Rh=class extends gi{constructor(e){if(super(e),e.parser.TokenBuilder instanceof tu)this.indentationTokenBuilder=e.parser.TokenBuilder;else throw new Error("IndentationAwareLexer requires an accompanying IndentationAwareTokenBuilder")}tokenize(e,r=Xl){let n=super.tokenize(e),i=n.report;r?.mode==="full"&&n.tokens.push(...i.remainingDedents),i.remainingDedents=[];let{indentTokenType:s,dedentTokenType:a}=this.indentationTokenBuilder,o=s.tokenTypeIdx,c=a.tokenTypeIdx,l=[],u=n.tokens.length-1;for(let p=0;p=0&&l.push(n.tokens[u]),n.tokens=l,n}};var le={};en(le,{AstUtils:()=>Uo,BiMap:()=>ui,Cancellation:()=>W,ContextCache:()=>fi,CstUtils:()=>ac,DONE_RESULT:()=>gt,Deferred:()=>It,Disposable:()=>Cn,DisposableCache:()=>gs,DocumentCache:()=>ml,EMPTY_STREAM:()=>nn,ErrorWithLocation:()=>Vn,GrammarUtils:()=>dc,MultiMap:()=>Rt,OperationCancelled:()=>Yt,Reduction:()=>Ei,RegExpUtils:()=>lc,SimpleCache:()=>to,StreamImpl:()=>qt,TreeStreamImpl:()=>yr,URI:()=>rt,UriTrie:()=>hs,UriUtils:()=>Be,WorkspaceCache:()=>ys,assertCondition:()=>Yh,assertUnreachable:()=>Rr,delayNextTick:()=>Fd,interruptAndCheck:()=>Me,isOperationCancelled:()=>Sr,loadGrammarFromJson:()=>_r,setInterruptionPeriod:()=>Qg,startCancelableOperation:()=>pl,stream:()=>ee});ae(le,we);var ru=class{stat(e){throw new Error("No file system is available.")}statSync(e){throw new Error("No file system is available.")}exists(){return P(this,null,function*(){return!1})}existsSync(){return!1}readBinary(){throw new Error("No file system is available.")}readBinarySync(){throw new Error("No file system is available.")}readFile(){throw new Error("No file system is available.")}readFileSync(){throw new Error("No file system is available.")}readDirectory(){return P(this,null,function*(){return[]})}readDirectorySync(){return[]}},xh={fileSystemProvider:()=>new ru};var J$={Grammar:()=>{},LanguageMetaData:()=>({caseInsensitive:!1,fileExtensions:[".langium"],languageId:"langium"})},Q$={AstReflection:()=>new bi};function Z$(){let t=eu(yh(xh),Q$),e=eu(gh({shared:t}),J$);return t.ServiceRegistry.register(e),e}function _r(t){let e=Z$(),r=e.serializer.JsonSerializer.deserialize(t);return e.shared.workspace.LangiumDocumentFactory.fromModel(r,rt.parse(`memory:/${r.name??"grammar"}.langium`)),r}ae(qe,le);var vh=class{constructor(e){this.activeCategories=new Set,this.allCategories=new Set(["validating","parsing","linking"]),this.activeCategories=e??new Set(this.allCategories),this.records=new Rt}isActive(e){return this.activeCategories.has(e)}start(...e){e?e.forEach(r=>this.activeCategories.add(r)):this.activeCategories=new Set(this.allCategories)}stop(...e){e?e.forEach(r=>this.activeCategories.delete(r)):this.activeCategories.clear()}createTask(e,r){if(!this.isActive(e))throw new Error(`Category "${e}" is not active.`);return console.log(`Creating profiling task for '${e}.${r}'.`),new nu(n=>this.records.add(e,this.dumpRecord(e,n)),r)}dumpRecord(e,r){console.info(`Task ${e}.${r.identifier} executed in ${r.duration.toFixed(2)}ms and ended at ${r.date.toISOString()}`);let n=[];for(let a of r.entries.keys()){let o=r.entries.get(a),c=o.reduce((l,u)=>l+u);n.push({name:`${r.identifier}.${a}`,count:o.length,duration:c})}let i=r.duration-n.map(a=>a.duration).reduce((a,o)=>a+o,0);n.push({name:r.identifier,count:1,duration:i}),n.sort((a,o)=>o.duration-a.duration);function s(a){return Math.round(100*a)/100}return console.table(n.map(a=>({Element:a.name,Count:a.count,"Self %":s(100*a.duration/r.duration),"Time (ms)":s(a.duration)}))),r}getRecords(...e){return e.length===0?this.records.values():this.records.entries().filter(r=>e.some(n=>n===r[0])).flatMap(r=>r[1])}},nu=class{constructor(e,r){this.stack=[],this.entries=new Rt,this.addRecord=e,this.identifier=r}start(){if(this.startTime!==void 0)throw new Error(`Task "${this.identifier}" is already started.`);this.startTime=performance.now()}stop(){if(this.startTime===void 0)throw new Error(`Task "${this.identifier}" was not started.`);if(this.stack.length!==0)throw new Error(`Task "${this.identifier}" cannot be stopped before sub-task(s): ${this.stack.map(r=>r.id).join(", ")}.`);let e={identifier:this.identifier,date:new Date,duration:performance.now()-this.startTime,entries:this.entries};this.addRecord(e),this.startTime=void 0,this.entries.clear()}startSubTask(e){this.stack.push({id:e,start:performance.now(),content:0})}stopSubTask(e){let r=this.stack.pop();if(!r)throw new Error(`Task "${this.identifier}.${e}" was not started.`);if(r.id!==e)throw new Error(`Sub-Task "${r.id}" is not already stopped.`);let n=performance.now()-r.start;this.stack.at(-1)!==void 0&&(this.stack[this.stack.length-1].content+=n);let i=n-r.content;this.entries.add(e,i)}};var eS=Object.defineProperty,ne=(t,e)=>eS(t,"name",{value:e,configurable:!0}),Ch;(t=>{t.Terminals={ARROW_DIRECTION:/L|R|T|B/,ARROW_GROUP:/\{group\}/,ARROW_INTO:/<|>/,ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,ID:/[\w]([-\w]*\w)?/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/,ARCH_ICON:/\([\w-:]+\)/,ARCH_TITLE:/\[(?:"([^"\\]|\\.)*"|'([^'\\]|\\.)*'|[\w ]+)\]/}})(Ch||(Ch={}));var wh;(t=>{t.Terminals={ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,INT:/0|[1-9][0-9]*(?!\.)/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/,REFERENCE:/\w([-\./\w]*[-\w])?/}})(wh||(wh={}));var Ih;(t=>{t.Terminals={ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/}})(Ih||(Ih={}));var _h;(t=>{t.Terminals={ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,INT:/0|[1-9][0-9]*(?!\.)/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/}})(_h||(_h={}));var bh;(t=>{t.Terminals={NUMBER_PIE:/(?:-?[0-9]+\.[0-9]+(?!\.))|(?:-?(0|[1-9][0-9]*)(?!\.))/,ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/}})(bh||(bh={}));var Ph;(t=>{t.Terminals={GRATICULE:/circle|polygon/,BOOLEAN:/true|false/,ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,NUMBER:/(?:[0-9]+\.[0-9]+(?!\.))|(?:0|[1-9][0-9]*(?!\.))/,STRING:/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/,ID:/[\w]([-\w]*\w)?/,NEWLINE:/\r?\n/,WHITESPACE:/[\t ]+/,YAML:/---[\t ]*\r?\n(?:[\S\s]*?\r?\n)?---(?:\r?\n|(?!\S))/,DIRECTIVE:/[\t ]*%%{[\S\s]*?}%%(?:\r?\n|(?!\S))/,SINGLE_LINE_COMMENT:/[\t ]*%%[^\n\r]*/}})(Ph||(Ph={}));var Oh;(t=>{t.Terminals={ACC_DESCR:/[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/,TITLE:/[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/,TREEMAP_KEYWORD:/treemap-beta|treemap/,CLASS_DEF:/classDef\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\s+([^;\r\n]*))?(?:;)?/,STYLE_SEPARATOR:/:::/,SEPARATOR:/:/,COMMA:/,/,INDENTATION:/[ \t]{1,}/,WS:/[ \t]+/,ML_COMMENT:/\%\%[^\n]*/,NL:/\r?\n/,ID2:/[a-zA-Z_][a-zA-Z0-9_]*/,NUMBER2:/[0-9_\.\,]+/,STRING2:/"[^"]*"|'[^']*'/}})(Oh||(Oh={}));var FL=ge(ge(ge(ge(ge(ge(ge({},Ch.Terminals),wh.Terminals),Ih.Terminals),_h.Terminals),bh.Terminals),Ph.Terminals),Oh.Terminals),Zr={$type:"Architecture",accDescr:"accDescr",accTitle:"accTitle",edges:"edges",groups:"groups",junctions:"junctions",services:"services",title:"title"};function tS(t){return fr.isInstance(t,Zr.$type)}ne(tS,"isArchitecture");var iu={$type:"Axis",label:"label",name:"name"},cu={$type:"Branch",name:"name",order:"order"};function rS(t){return fr.isInstance(t,cu.$type)}ne(rS,"isBranch");var jx={$type:"Checkout",branch:"branch"},su={$type:"CherryPicking",id:"id",parent:"parent",tags:"tags"},Eh={$type:"ClassDefStatement",className:"className",styleText:"styleText"},Fs={$type:"Commit",id:"id",message:"message",tags:"tags",type:"type"};function nS(t){return fr.isInstance(t,Fs.$type)}ne(nS,"isCommit");var au={$type:"Curve",entries:"entries",label:"label",name:"name"},Ls={$type:"Direction",accDescr:"accDescr",accTitle:"accTitle",dir:"dir",statements:"statements",title:"title"},br={$type:"Edge",lhsDir:"lhsDir",lhsGroup:"lhsGroup",lhsId:"lhsId",lhsInto:"lhsInto",rhsDir:"rhsDir",rhsGroup:"rhsGroup",rhsId:"rhsId",rhsInto:"rhsInto",title:"title"},Ah={$type:"Entry",axis:"axis",value:"value"},Ti={$type:"GitGraph",accDescr:"accDescr",accTitle:"accTitle",statements:"statements",title:"title"};function iS(t){return fr.isInstance(t,Ti.$type)}ne(iS,"isGitGraph");var bo={$type:"Group",icon:"icon",id:"id",in:"in",title:"title"},Oo={$type:"Info",accDescr:"accDescr",accTitle:"accTitle",title:"title"};function sS(t){return fr.isInstance(t,Oo.$type)}ne(sS,"isInfo");var Po={$type:"Item",classSelector:"classSelector",name:"name"},$h={$type:"Junction",id:"id",in:"in"},ou={$type:"Leaf",classSelector:"classSelector",name:"name",value:"value"},Gs={$type:"Merge",branch:"branch",id:"id",tags:"tags",type:"type"};function aS(t){return fr.isInstance(t,Gs.$type)}ne(aS,"isMerge");var Sh={$type:"Option",name:"name",value:"value"},Us={$type:"Packet",accDescr:"accDescr",accTitle:"accTitle",blocks:"blocks",title:"title"};function oS(t){return fr.isInstance(t,Us.$type)}ne(oS,"isPacket");var qs={$type:"PacketBlock",bits:"bits",end:"end",label:"label",start:"start"};function cS(t){return fr.isInstance(t,qs.$type)}ne(cS,"isPacketBlock");var Ri={$type:"Pie",accDescr:"accDescr",accTitle:"accTitle",sections:"sections",showData:"showData",title:"title"};function lS(t){return fr.isInstance(t,Ri.$type)}ne(lS,"isPie");var lu={$type:"PieSection",label:"label",value:"value"};function uS(t){return fr.isInstance(t,lu.$type)}ne(uS,"isPieSection");var yi={$type:"Radar",accDescr:"accDescr",accTitle:"accTitle",axes:"axes",curves:"curves",options:"options",title:"title"},kh={$type:"Section",classSelector:"classSelector",name:"name"},Ds={$type:"Service",icon:"icon",iconText:"iconText",id:"id",in:"in",title:"title"},Ms={$type:"Statement"},zs={$type:"Treemap",accDescr:"accDescr",accTitle:"accTitle",title:"title",TreemapRows:"TreemapRows"};function fS(t){return fr.isInstance(t,zs.$type)}ne(fS,"isTreemap");var Nh={$type:"TreemapRow",indent:"indent",item:"item"},Jx=class extends _n{constructor(){super(...arguments),this.types={Architecture:{name:Zr.$type,properties:{accDescr:{name:Zr.accDescr},accTitle:{name:Zr.accTitle},edges:{name:Zr.edges,defaultValue:[]},groups:{name:Zr.groups,defaultValue:[]},junctions:{name:Zr.junctions,defaultValue:[]},services:{name:Zr.services,defaultValue:[]},title:{name:Zr.title}},superTypes:[]},Axis:{name:iu.$type,properties:{label:{name:iu.label},name:{name:iu.name}},superTypes:[]},Branch:{name:cu.$type,properties:{name:{name:cu.name},order:{name:cu.order}},superTypes:[Ms.$type]},Checkout:{name:jx.$type,properties:{branch:{name:jx.branch}},superTypes:[Ms.$type]},CherryPicking:{name:su.$type,properties:{id:{name:su.id},parent:{name:su.parent},tags:{name:su.tags,defaultValue:[]}},superTypes:[Ms.$type]},ClassDefStatement:{name:Eh.$type,properties:{className:{name:Eh.className},styleText:{name:Eh.styleText}},superTypes:[]},Commit:{name:Fs.$type,properties:{id:{name:Fs.id},message:{name:Fs.message},tags:{name:Fs.tags,defaultValue:[]},type:{name:Fs.type}},superTypes:[Ms.$type]},Curve:{name:au.$type,properties:{entries:{name:au.entries,defaultValue:[]},label:{name:au.label},name:{name:au.name}},superTypes:[]},Direction:{name:Ls.$type,properties:{accDescr:{name:Ls.accDescr},accTitle:{name:Ls.accTitle},dir:{name:Ls.dir},statements:{name:Ls.statements,defaultValue:[]},title:{name:Ls.title}},superTypes:[Ti.$type]},Edge:{name:br.$type,properties:{lhsDir:{name:br.lhsDir},lhsGroup:{name:br.lhsGroup,defaultValue:!1},lhsId:{name:br.lhsId},lhsInto:{name:br.lhsInto,defaultValue:!1},rhsDir:{name:br.rhsDir},rhsGroup:{name:br.rhsGroup,defaultValue:!1},rhsId:{name:br.rhsId},rhsInto:{name:br.rhsInto,defaultValue:!1},title:{name:br.title}},superTypes:[]},Entry:{name:Ah.$type,properties:{axis:{name:Ah.axis,referenceType:iu.$type},value:{name:Ah.value}},superTypes:[]},GitGraph:{name:Ti.$type,properties:{accDescr:{name:Ti.accDescr},accTitle:{name:Ti.accTitle},statements:{name:Ti.statements,defaultValue:[]},title:{name:Ti.title}},superTypes:[]},Group:{name:bo.$type,properties:{icon:{name:bo.icon},id:{name:bo.id},in:{name:bo.in},title:{name:bo.title}},superTypes:[]},Info:{name:Oo.$type,properties:{accDescr:{name:Oo.accDescr},accTitle:{name:Oo.accTitle},title:{name:Oo.title}},superTypes:[]},Item:{name:Po.$type,properties:{classSelector:{name:Po.classSelector},name:{name:Po.name}},superTypes:[]},Junction:{name:$h.$type,properties:{id:{name:$h.id},in:{name:$h.in}},superTypes:[]},Leaf:{name:ou.$type,properties:{classSelector:{name:ou.classSelector},name:{name:ou.name},value:{name:ou.value}},superTypes:[Po.$type]},Merge:{name:Gs.$type,properties:{branch:{name:Gs.branch},id:{name:Gs.id},tags:{name:Gs.tags,defaultValue:[]},type:{name:Gs.type}},superTypes:[Ms.$type]},Option:{name:Sh.$type,properties:{name:{name:Sh.name},value:{name:Sh.value,defaultValue:!1}},superTypes:[]},Packet:{name:Us.$type,properties:{accDescr:{name:Us.accDescr},accTitle:{name:Us.accTitle},blocks:{name:Us.blocks,defaultValue:[]},title:{name:Us.title}},superTypes:[]},PacketBlock:{name:qs.$type,properties:{bits:{name:qs.bits},end:{name:qs.end},label:{name:qs.label},start:{name:qs.start}},superTypes:[]},Pie:{name:Ri.$type,properties:{accDescr:{name:Ri.accDescr},accTitle:{name:Ri.accTitle},sections:{name:Ri.sections,defaultValue:[]},showData:{name:Ri.showData,defaultValue:!1},title:{name:Ri.title}},superTypes:[]},PieSection:{name:lu.$type,properties:{label:{name:lu.label},value:{name:lu.value}},superTypes:[]},Radar:{name:yi.$type,properties:{accDescr:{name:yi.accDescr},accTitle:{name:yi.accTitle},axes:{name:yi.axes,defaultValue:[]},curves:{name:yi.curves,defaultValue:[]},options:{name:yi.options,defaultValue:[]},title:{name:yi.title}},superTypes:[]},Section:{name:kh.$type,properties:{classSelector:{name:kh.classSelector},name:{name:kh.name}},superTypes:[Po.$type]},Service:{name:Ds.$type,properties:{icon:{name:Ds.icon},iconText:{name:Ds.iconText},id:{name:Ds.id},in:{name:Ds.in},title:{name:Ds.title}},superTypes:[]},Statement:{name:Ms.$type,properties:{},superTypes:[]},Treemap:{name:zs.$type,properties:{accDescr:{name:zs.accDescr},accTitle:{name:zs.accTitle},title:{name:zs.title},TreemapRows:{name:zs.TreemapRows,defaultValue:[]}},superTypes:[]},TreemapRow:{name:Nh.$type,properties:{indent:{name:Nh.indent},item:{name:Nh.item}},superTypes:[]}}}static{ne(this,"MermaidAstReflection")}},fr=new Jx,Bx,dS=ne(()=>Bx??(Bx=_r(`{"$type":"Grammar","isDeclared":true,"name":"ArchitectureGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Architecture","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"architecture-beta"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"groups","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"services","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"junctions","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"edges","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]},"entry":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"LeftPort","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"lhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},"entry":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"RightPort","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"rhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Keyword","value":":"}]},"entry":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"Arrow","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Assignment","feature":"lhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"--"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]}},{"$type":"Keyword","value":"-"}]}]},{"$type":"Assignment","feature":"rhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"Group","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Service","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"service"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"iconText","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}],"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Junction","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"junction"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Edge","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"lhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"lhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"rhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"rhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"ARROW_DIRECTION","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"L"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"R"},"parenthesized":false}],"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"T"},"parenthesized":false}],"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"B"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_GROUP","definition":{"$type":"RegexToken","regex":"/\\\\{group\\\\}/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_INTO","definition":{"$type":"RegexToken","regex":"/<|>/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@18"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@19"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","name":"ARCH_ICON","definition":{"$type":"RegexToken","regex":"/\\\\([\\\\w-:]+\\\\)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TITLE","definition":{"$type":"RegexToken","regex":"/\\\\[(?:\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'|[\\\\w ]+)\\\\]/","parenthesized":false},"fragment":false,"hidden":false}],"interfaces":[],"types":[]}`)),"ArchitectureGrammarGrammar"),Wx,pS=ne(()=>Wx??(Wx=_r(`{"$type":"Grammar","isDeclared":true,"name":"GitGraphGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"GitGraph","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Keyword","value":":"}]},{"$type":"Keyword","value":"gitGraph:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Keyword","value":":"}]}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"Assignment","feature":"statements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Direction","definition":{"$type":"Assignment","feature":"dir","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"LR"},{"$type":"Keyword","value":"TB"},{"$type":"Keyword","value":"BT"}]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Commit","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"commit"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"msg:","cardinality":"?"},{"$type":"Assignment","feature":"message","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Branch","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"branch"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"order:"},{"$type":"Assignment","feature":"order","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Merge","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"merge"},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Checkout","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"checkout"},{"$type":"Keyword","value":"switch"}]},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"CherryPicking","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"cherry-pick"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"parent:"},{"$type":"Assignment","feature":"parent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@14"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","name":"REFERENCE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\\\w([-\\\\./\\\\w]*[-\\\\w])?/","parenthesized":false},"fragment":false,"hidden":false}],"interfaces":[],"types":[]}`)),"GitGraphGrammarGrammar"),Vx,hS=ne(()=>Vx??(Vx=_r(`{"$type":"Grammar","isDeclared":true,"name":"InfoGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Info","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"info"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"Keyword","value":"showInfo"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"?"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@7"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false}],"interfaces":[],"types":[]}`)),"InfoGrammarGrammar"),Kx,mS=ne(()=>Kx??(Kx=_r(`{"$type":"Grammar","isDeclared":true,"name":"PacketGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Packet","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"packet"},{"$type":"Keyword","value":"packet-beta"}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"PacketBlock","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"start","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"end","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"+"},{"$type":"Assignment","feature":"bits","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]}]},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@9"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false}],"interfaces":[],"types":[]}`)),"PacketGrammarGrammar"),Hx,gS=ne(()=>Hx??(Hx=_r(`{"$type":"Grammar","isDeclared":true,"name":"PieGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Pie","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"pie"},{"$type":"Assignment","feature":"showData","operator":"?=","terminal":{"$type":"Keyword","value":"showData"},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"PieSection","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"FLOAT_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/-?[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/-?(0|[1-9][0-9]*)(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@2"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@3"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@11"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@12"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false}],"interfaces":[],"types":[]}`)),"PieGrammarGrammar"),Yx,yS=ne(()=>Yx??(Yx=_r(`{"$type":"Grammar","isDeclared":true,"name":"RadarGrammar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Radar","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":"radar-beta:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Keyword","value":"axis"},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"curve"},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"Label","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}},{"$type":"Keyword","value":"]"}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"Axis","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Curve","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Keyword","value":"}"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"Entries","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]}]},"entry":false,"parameters":[]},{"$type":"ParserRule","name":"DetailedEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"axis","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"deprecatedSyntax":false,"isMulti":false}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"NumberEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Option","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"showLegend"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"ticks"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"max"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"min"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"graticule"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"GRATICULE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"circle"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"polygon"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"},"parenthesized":false},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@16"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/","parenthesized":false},"fragment":false}],"interfaces":[{"$type":"Interface","name":"Entry","attributes":[{"$type":"TypeAttribute","name":"axis","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@2"}},"isMulti":false}},{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}],"superTypes":[]}],"types":[]}`)),"RadarGrammarGrammar"),Xx,TS=ne(()=>Xx??(Xx=_r(`{"$type":"Grammar","isDeclared":true,"name":"TreemapGrammar","rules":[{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}}],"cardinality":"+"},"entry":false,"parameters":[]},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","entry":true,"name":"Treemap","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Assignment","feature":"TreemapRows","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"*"}]},"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"TREEMAP_KEYWORD","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap-beta"},"parenthesized":false},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap"},"parenthesized":false}],"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"CLASS_DEF","definition":{"$type":"RegexToken","regex":"/classDef\\\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\\\s+([^;\\\\r\\\\n]*))?(?:;)?/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STYLE_SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":::"},"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":"},"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"COMMA","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":","},"parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INDENTATION","definition":{"$type":"RegexToken","regex":"/[ \\\\t]{1,}/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[ \\\\t]+/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"ML_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\%\\\\%[^\\\\n]*/","parenthesized":false},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/","parenthesized":false},"fragment":false},{"$type":"ParserRule","name":"TreemapRow","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"indent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"item","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"ClassDef","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Item","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Section","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"ParserRule","name":"Leaf","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[],"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[],"cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"ID2","definition":{"$type":"RegexToken","regex":"/[a-zA-Z_][a-zA-Z0-9_]*/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER2","definition":{"$type":"RegexToken","regex":"/[0-9_\\\\.\\\\,]+/","parenthesized":false},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"MyNumber","dataType":"number","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"entry":false,"fragment":false,"parameters":[]},{"$type":"TerminalRule","name":"STRING2","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/","parenthesized":false},"fragment":false,"hidden":false}],"interfaces":[{"$type":"Interface","name":"Item","attributes":[{"$type":"TypeAttribute","name":"name","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"classSelector","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]},{"$type":"Interface","name":"Section","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[]},{"$type":"Interface","name":"Leaf","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}]},{"$type":"Interface","name":"ClassDefStatement","attributes":[{"$type":"TypeAttribute","name":"className","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"styleText","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"Treemap","attributes":[{"$type":"TypeAttribute","name":"TreemapRows","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"imports":[],"types":[],"$comment":"/**\\n * Treemap grammar for Langium\\n * Converted from mindmap grammar\\n *\\n * The ML_COMMENT and NL hidden terminals handle whitespace, comments, and newlines\\n * before the treemap keyword, allowing for empty lines and comments before the\\n * treemap declaration.\\n */"}`)),"TreemapGrammarGrammar"),RS={languageId:"architecture",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},xS={languageId:"gitGraph",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},vS={languageId:"info",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},ES={languageId:"packet",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},AS={languageId:"pie",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},$S={languageId:"radar",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},SS={languageId:"treemap",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},UL={AstReflection:ne(()=>new Jx,"AstReflection")},qL={Grammar:ne(()=>dS(),"Grammar"),LanguageMetaData:ne(()=>RS,"LanguageMetaData"),parser:{}},zL={Grammar:ne(()=>pS(),"Grammar"),LanguageMetaData:ne(()=>xS,"LanguageMetaData"),parser:{}},jL={Grammar:ne(()=>hS(),"Grammar"),LanguageMetaData:ne(()=>vS,"LanguageMetaData"),parser:{}},BL={Grammar:ne(()=>mS(),"Grammar"),LanguageMetaData:ne(()=>ES,"LanguageMetaData"),parser:{}},WL={Grammar:ne(()=>gS(),"Grammar"),LanguageMetaData:ne(()=>AS,"LanguageMetaData"),parser:{}},VL={Grammar:ne(()=>yS(),"Grammar"),LanguageMetaData:ne(()=>$S,"LanguageMetaData"),parser:{}},KL={Grammar:ne(()=>TS(),"Grammar"),LanguageMetaData:ne(()=>SS,"LanguageMetaData"),parser:{}},kS=/accDescr(?:[\t ]*:([^\n\r]*)|\s*{([^}]*)})/,NS=/accTitle[\t ]*:([^\n\r]*)/,CS=/title([\t ][^\n\r]*|)/,wS={ACC_DESCR:kS,ACC_TITLE:NS,TITLE:CS},IS=class extends oi{static{ne(this,"AbstractMermaidValueConverter")}runConverter(t,e,r){let n=this.runCommonConverter(t,e,r);return n===void 0&&(n=this.runCustomConverter(t,e,r)),n===void 0?super.runConverter(t,e,r):n}runCommonConverter(t,e,r){let n=wS[t.name];if(n===void 0)return;let i=n.exec(e);if(i!==null){if(i[1]!==void 0)return i[1].trim().replace(/[\t ]{2,}/gm," ");if(i[2]!==void 0)return i[2].replace(/^\s*/gm,"").replace(/\s+$/gm,"").replace(/[\t ]{2,}/gm," ").replace(/[\n\r]{2,}/gm,` +`)}}},YL=class extends IS{static{ne(this,"CommonValueConverter")}runCustomConverter(t,e,r){}},_S=class extends Jr{static{ne(this,"AbstractMermaidTokenBuilder")}constructor(t){super(),this.keywords=new Set(t)}buildKeywordTokens(t,e,r){let n=super.buildKeywordTokens(t,e,r);return n.forEach(i=>{this.keywords.has(i.name)&&i.PATTERN!==void 0&&(i.PATTERN=new RegExp(i.PATTERN.toString()+"(?:(?=%%)|(?!\\S))"))}),n}},JL=class extends _S{static{ne(this,"CommonTokenBuilder")}};export{gh as a,yh as b,eu as c,xh as d,qe as e,ne as f,UL as g,qL as h,zL as i,jL as j,BL as k,WL as l,VL as m,KL as n,IS as o,YL as p,_S as q}; diff --git a/src/google/adk/cli/browser/chunk-NMKTPNXE.js b/src/google/adk/cli/browser/chunk-NMKTPNXE.js new file mode 100644 index 0000000000..7bf7241223 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-NMKTPNXE.js @@ -0,0 +1 @@ +import{a as x}from"./chunk-GP6TCC26.js";import{F as d}from"./chunk-QFMJV7VH.js";import{a as o,g as i}from"./chunk-JRNAXTJ7.js";import{h as p}from"./chunk-RMXJBC7V.js";var l=p(x(),1);var c=i((r,t)=>{let e=r.append("rect");if(e.attr("x",t.x),e.attr("y",t.y),e.attr("fill",t.fill),e.attr("stroke",t.stroke),e.attr("width",t.width),e.attr("height",t.height),t.name&&e.attr("name",t.name),t.rx&&e.attr("rx",t.rx),t.ry&&e.attr("ry",t.ry),t.attrs!==void 0)for(let s in t.attrs)e.attr(s,t.attrs[s]);return t.class&&e.attr("class",t.class),e},"drawRect"),f=i((r,t)=>{let e={x:t.startx,y:t.starty,width:t.stopx-t.startx,height:t.stopy-t.starty,fill:t.fill,stroke:t.stroke,class:"rect"};c(r,e).lower()},"drawBackgroundRect"),h=i((r,t)=>{let e=t.text.replace(d," "),s=r.append("text");s.attr("x",t.x),s.attr("y",t.y),s.attr("class","legend"),s.style("text-anchor",t.anchor),t.class&&s.attr("class",t.class);let a=s.append("tspan");return a.attr("x",t.x+t.textMargin*2),a.text(e),s},"drawText"),w=i((r,t,e,s)=>{let a=r.append("image");a.attr("x",t),a.attr("y",e);let n=(0,l.sanitizeUrl)(s);a.attr("xlink:href",n)},"drawImage"),k=i((r,t,e,s)=>{let a=r.append("use");a.attr("x",t),a.attr("y",e);let n=(0,l.sanitizeUrl)(s);a.attr("xlink:href",`#${n}`)},"drawEmbeddedImage"),v=i(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),E=i(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj"),R=i(()=>{let r=o(".mermaidTooltip");return r.empty()&&(r=o("body").append("div").attr("class","mermaidTooltip").style("opacity",0).style("position","absolute").style("text-align","center").style("max-width","200px").style("padding","2px").style("font-size","12px").style("background","#ffffde").style("border","1px solid #333").style("border-radius","2px").style("pointer-events","none").style("z-index","100")),r},"createTooltip");export{c as a,f as b,h as c,w as d,k as e,v as f,E as g,R as h}; diff --git a/src/google/adk/cli/browser/chunk-NQKWI5EB.js b/src/google/adk/cli/browser/chunk-NQKWI5EB.js new file mode 100644 index 0000000000..b6ea2fa5ce --- /dev/null +++ b/src/google/adk/cli/browser/chunk-NQKWI5EB.js @@ -0,0 +1 @@ +import{a as o,b as c,c as t,d as n,e as k,f as e,g as i,k as u,p as d,q as l}from"./chunk-NALL4A3P.js";var m=class extends l{static{e(this,"PacketTokenBuilder")}constructor(){super(["packet"])}},v={parser:{TokenBuilder:e(()=>new m,"TokenBuilder"),ValueConverter:e(()=>new d,"ValueConverter")}};function p(s=n){let r=t(c(s),i),a=t(o({shared:r}),u,v);return r.ServiceRegistry.register(a),{shared:r,Packet:a}}e(p,"createPacketServices");export{v as a,p as b}; diff --git a/src/google/adk/cli/browser/chunk-HCQ2TSHS.js b/src/google/adk/cli/browser/chunk-P4MFJI72.js similarity index 93% rename from src/google/adk/cli/browser/chunk-HCQ2TSHS.js rename to src/google/adk/cli/browser/chunk-P4MFJI72.js index 35318987da..a857aef411 100644 --- a/src/google/adk/cli/browser/chunk-HCQ2TSHS.js +++ b/src/google/adk/cli/browser/chunk-P4MFJI72.js @@ -1 +1 @@ -import{$a as c,$b as M,Bb as l,Ca as m,Cb as d,Cc as r,Ib as p,Kb as g,Lb as h,Pa as o,Yb as x,Zb as a,_b as y,eb as b,fc as T,gc as _,hc as C,pd as F,qb as v,sb as f,wc as s}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function P(n,D){if(n&1&&(l(0,"label",2),y(1),d()),n&2){let t=h(),i=C(0);a(t.theme.components.TextField.label),p("htmlFor",t.inputId),o(),M(i)}}var S=(()=>{class n extends F{text=r.required();label=r.required();inputType=r.required();inputValue=s(()=>super.resolvePrimitive(this.text())||"");resolvedLabel=s(()=>super.resolvePrimitive(this.label()));inputId=super.getUniqueId("a2ui-input");handleInput(t){let i=this.text()?.path;!(t.target instanceof HTMLInputElement)||!i||this.processor.setData(this.component(),i,t.target.value,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(n)))(e||n)}})();static \u0275cmp=c({type:n,selectors:[["a2ui-text-field"]],inputs:{text:[1,"text"],label:[1,"label"],inputType:[1,"inputType"]},features:[b],decls:4,vars:11,consts:[[3,"for","class"],["autocomplete","off","placeholder","Please enter a value",3,"input","id","value","type"],[3,"for"]],template:function(i,e){if(i&1&&(T(0),l(1,"section"),v(2,P,2,4,"label",0),l(3,"input",1),g("input",function(I){return e.handleInput(I)}),d()()),i&2){let u=_(e.resolvedLabel());o(),a(e.theme.components.TextField.container),o(),f(u?2:-1),o(),x(e.theme.additionalStyles==null?null:e.theme.additionalStyles.TextField),a(e.theme.components.TextField.element),p("id",e.inputId)("value",e.inputValue())("type",e.inputType()==="number"?"number":"text")}},styles:["[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%], input[_ngcontent-%COMP%], label[_ngcontent-%COMP%]{box-sizing:border-box}input[_ngcontent-%COMP%]{display:block;width:100%}label[_ngcontent-%COMP%]{display:block;margin-bottom:4px}"]})}return n})();export{S as TextField}; +import{$a as c,$b as M,Bb as l,Ca as m,Cb as d,Cc as r,Ib as p,Kb as g,Lb as h,Pa as o,Yb as x,Zb as a,_b as y,eb as b,fc as T,gc as _,hc as C,pd as F,qb as v,sb as f,wc as s}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function P(n,D){if(n&1&&(l(0,"label",2),y(1),d()),n&2){let t=h(),i=C(0);a(t.theme.components.TextField.label),p("htmlFor",t.inputId),o(),M(i)}}var S=(()=>{class n extends F{text=r.required();label=r.required();inputType=r.required();inputValue=s(()=>super.resolvePrimitive(this.text())||"");resolvedLabel=s(()=>super.resolvePrimitive(this.label()));inputId=super.getUniqueId("a2ui-input");handleInput(t){let i=this.text()?.path;!(t.target instanceof HTMLInputElement)||!i||this.processor.setData(this.component(),i,t.target.value,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(n)))(e||n)}})();static \u0275cmp=c({type:n,selectors:[["a2ui-text-field"]],inputs:{text:[1,"text"],label:[1,"label"],inputType:[1,"inputType"]},features:[b],decls:4,vars:11,consts:[[3,"for","class"],["autocomplete","off","placeholder","Please enter a value",3,"input","id","value","type"],[3,"for"]],template:function(i,e){if(i&1&&(T(0),l(1,"section"),v(2,P,2,4,"label",0),l(3,"input",1),g("input",function(I){return e.handleInput(I)}),d()()),i&2){let u=_(e.resolvedLabel());o(),a(e.theme.components.TextField.container),o(),f(u?2:-1),o(),x(e.theme.additionalStyles==null?null:e.theme.additionalStyles.TextField),a(e.theme.components.TextField.element),p("id",e.inputId)("value",e.inputValue())("type",e.inputType()==="number"?"number":"text")}},styles:["[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%], input[_ngcontent-%COMP%], label[_ngcontent-%COMP%]{box-sizing:border-box}input[_ngcontent-%COMP%]{display:block;width:100%}label[_ngcontent-%COMP%]{display:block;margin-bottom:4px}"]})}return n})();export{S as TextField}; diff --git a/src/google/adk/cli/browser/chunk-PM3FQFTD.js b/src/google/adk/cli/browser/chunk-PM3FQFTD.js new file mode 100644 index 0000000000..86263463ff --- /dev/null +++ b/src/google/adk/cli/browser/chunk-PM3FQFTD.js @@ -0,0 +1,30 @@ +import{a as K}from"./chunk-DMWOYWYQ.js";import{a as Q}from"./chunk-T3Q3QCCV.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{a as q}from"./chunk-TPDTRWWV.js";import{k as H,l as J}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{N as M,R as P,S as R,T as I,U as L,V as N,W as B,X as U,Y as V,r as W}from"./chunk-QFMJV7VH.js";import{K as C,N as j,g as o,i as g,r as Z}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{j as O}from"./chunk-RMXJBC7V.js";var X=W.pie,D={sections:new Map,showData:!1,config:X},f=D.sections,y=D.showData,se=structuredClone(X),ce=o(()=>structuredClone(se),"getConfig"),de=o(()=>{f=new Map,y=D.showData,P()},"clear"),pe=o(({label:e,value:a})=>{if(a<0)throw new Error(`"${e}" has invalid value: ${a}. Negative values are not allowed in pie charts. All slice values must be >= 0.`);f.has(e)||(f.set(e,a),g.debug(`added new section: ${e}, with value: ${a}`))},"addSection"),ge=o(()=>f,"getSections"),fe=o(e=>{y=e},"setShowData"),ue=o(()=>y,"getShowData"),Y={getConfig:ce,clear:de,setDiagramTitle:B,getDiagramTitle:U,setAccTitle:R,getAccTitle:I,setAccDescription:L,getAccDescription:N,addSection:pe,getSections:ge,setShowData:fe,getShowData:ue},me=o((e,a)=>{K(e,a),a.setShowData(e.showData),e.sections.map(a.addSection)},"populateDb"),he={parse:o(e=>O(null,null,function*(){let a=yield Q("pie",e);g.debug(a),me(a,Y)}),"parse")},ve=o(e=>` + .pieCircle{ + stroke: ${e.pieStrokeColor}; + stroke-width : ${e.pieStrokeWidth}; + opacity : ${e.pieOpacity}; + } + .pieOuterCircle{ + stroke: ${e.pieOuterStrokeColor}; + stroke-width: ${e.pieOuterStrokeWidth}; + fill: none; + } + .pieTitleText { + text-anchor: middle; + font-size: ${e.pieTitleTextSize}; + fill: ${e.pieTitleTextColor}; + font-family: ${e.fontFamily}; + } + .slice { + font-family: ${e.fontFamily}; + fill: ${e.pieSectionTextColor}; + font-size:${e.pieSectionTextSize}; + // fill: white; + } + .legend text { + fill: ${e.pieLegendTextColor}; + font-family: ${e.fontFamily}; + font-size: ${e.pieLegendTextSize}; + } +`,"getStyles"),Se=ve,xe=o(e=>{let a=[...e.values()].reduce((r,l)=>r+l,0),$=[...e.entries()].map(([r,l])=>({label:r,value:l})).filter(r=>r.value/a*100>=1).sort((r,l)=>l.value-r.value);return j().value(r=>r.value)($)},"createPieArcs"),we=o((e,a,$,T)=>{g.debug(`rendering pie chart +`+e);let r=T.db,l=V(),A=J(r.getConfig(),l.pie),b=40,n=18,d=4,s=450,u=s,m=q(a),c=m.append("g");c.attr("transform","translate("+u/2+","+s/2+")");let{themeVariables:i}=l,[E]=H(i.pieOuterStrokeWidth);E??=2;let _=A.textPosition,p=Math.min(u,s)/2-b,ee=C().innerRadius(0).outerRadius(p),te=C().innerRadius(p*_).outerRadius(p*_);c.append("circle").attr("cx",0).attr("cy",0).attr("r",p+E/2).attr("class","pieOuterCircle");let h=r.getSections(),ae=xe(h),re=[i.pie1,i.pie2,i.pie3,i.pie4,i.pie5,i.pie6,i.pie7,i.pie8,i.pie9,i.pie10,i.pie11,i.pie12],v=0;h.forEach(t=>{v+=t});let k=ae.filter(t=>(t.data.value/v*100).toFixed(0)!=="0"),S=Z(re);c.selectAll("mySlices").data(k).enter().append("path").attr("d",ee).attr("fill",t=>S(t.data.label)).attr("class","pieCircle"),c.selectAll("mySlices").data(k).enter().append("text").text(t=>(t.data.value/v*100).toFixed(0)+"%").attr("transform",t=>"translate("+te.centroid(t)+")").style("text-anchor","middle").attr("class","slice"),c.append("text").text(r.getDiagramTitle()).attr("x",0).attr("y",-(s-50)/2).attr("class","pieTitleText");let z=[...h.entries()].map(([t,w])=>({label:t,value:w})),x=c.selectAll(".legend").data(z).enter().append("g").attr("class","legend").attr("transform",(t,w)=>{let G=n+d,oe=G*z.length/2,le=12*n,ne=w*G-oe;return"translate("+le+","+ne+")"});x.append("rect").attr("width",n).attr("height",n).style("fill",t=>S(t.label)).style("stroke",t=>S(t.label)),x.append("text").attr("x",n+d).attr("y",n-d).text(t=>r.getShowData()?`${t.label} [${t.value}]`:t.label);let ie=Math.max(...x.selectAll("text").nodes().map(t=>t?.getBoundingClientRect().width??0)),F=u+b+n+d+ie;m.attr("viewBox",`0 0 ${F} ${s}`),M(m,s,F,A.useMaxWidth)},"draw"),Ce={draw:we},_e={parser:he,db:Y,renderer:Ce,styles:Se};export{_e as diagram}; diff --git a/src/google/adk/cli/browser/chunk-PRKFGJVH.js b/src/google/adk/cli/browser/chunk-PRKFGJVH.js new file mode 100644 index 0000000000..84a9cfab56 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-PRKFGJVH.js @@ -0,0 +1 @@ +function Y(a,t,s){if(a&&a.length){let[e,n]=t,o=Math.PI/180*s,r=Math.cos(o),h=Math.sin(o);for(let i of a){let[l,c]=i;i[0]=(l-e)*r-(c-n)*h+e,i[1]=(l-e)*h+(c-n)*r+n}}}function zt(a,t){return a[0]===t[0]&&a[1]===t[1]}function Wt(a,t,s,e=1){let n=s,o=Math.max(t,.1),r=a[0]&&a[0][0]&&typeof a[0][0]=="number"?[a]:a,h=[0,0];if(n)for(let l of r)Y(l,h,n);let i=(function(l,c,d){let p=[];for(let M of l){let m=[...M];zt(m[0],m[m.length-1])||m.push([m[0][0],m[0][1]]),m.length>2&&p.push(m)}let u=[];c=Math.max(c,.1);let f=[];for(let M of p)for(let m=0;mM.yminm.ymin?1:M.xm.x?1:M.ymax===m.ymax?0:(M.ymax-m.ymax)/Math.abs(M.ymax-m.ymax)),!f.length)return u;let g=[],k=f[0].ymin,b=0;for(;g.length||f.length;){if(f.length){let M=-1;for(let m=0;mk);m++)M=m;f.splice(0,M+1).forEach(m=>{g.push({s:k,edge:m})})}if(g=g.filter(M=>!(M.edge.ymax<=k)),g.sort((M,m)=>M.edge.x===m.edge.x?0:(M.edge.x-m.edge.x)/Math.abs(M.edge.x-m.edge.x)),(d!==1||b%c==0)&&g.length>1)for(let M=0;M=g.length)break;let P=g[M].edge,x=g[m].edge;u.push([[Math.round(P.x),k],[Math.round(x.x),k]])}k+=d,g.forEach(M=>{M.edge.x=M.edge.x+d*M.edge.islope}),b++}return u})(r,o,e);if(n){for(let l of r)Y(l,h,-n);(function(l,c,d){let p=[];l.forEach(u=>p.push(...u)),Y(p,c,d)})(i,h,-n)}return i}function F(a,t){var s;let e=t.hachureAngle+90,n=t.hachureGap;n<0&&(n=4*t.strokeWidth),n=Math.round(Math.max(n,.1));let o=1;return t.roughness>=1&&(((s=t.randomizer)===null||s===void 0?void 0:s.next())||Math.random())>.7&&(o=n),Wt(a,n,e,o||1)}var q=class{constructor(t){this.helper=t}fillPolygons(t,s){return this._fillPolygons(t,s)}_fillPolygons(t,s){let e=F(t,s);return{type:"fillSketch",ops:this.renderLines(e,s)}}renderLines(t,s){let e=[];for(let n of t)e.push(...this.helper.doubleLineOps(n[0][0],n[0][1],n[1][0],n[1][1],s));return e}};function X(a){let t=a[0],s=a[1];return Math.sqrt(Math.pow(t[0]-s[0],2)+Math.pow(t[1]-s[1],2))}var at=class extends q{fillPolygons(t,s){let e=s.hachureGap;e<0&&(e=4*s.strokeWidth),e=Math.max(e,.1);let n=F(t,Object.assign({},s,{hachureGap:e})),o=Math.PI/180*s.hachureAngle,r=[],h=.5*e*Math.cos(o),i=.5*e*Math.sin(o);for(let[l,c]of n)X([l,c])&&r.push([[l[0]-h,l[1]+i],[...c]],[[l[0]+h,l[1]-i],[...c]]);return{type:"fillSketch",ops:this.renderLines(r,s)}}},ot=class extends q{fillPolygons(t,s){let e=this._fillPolygons(t,s),n=Object.assign({},s,{hachureAngle:s.hachureAngle+90}),o=this._fillPolygons(t,n);return e.ops=e.ops.concat(o.ops),e}},ht=class{constructor(t){this.helper=t}fillPolygons(t,s){let e=F(t,s=Object.assign({},s,{hachureAngle:0}));return this.dotsOnLines(e,s)}dotsOnLines(t,s){let e=[],n=s.hachureGap;n<0&&(n=4*s.strokeWidth),n=Math.max(n,.1);let o=s.fillWeight;o<0&&(o=s.strokeWidth/2);let r=n/4;for(let h of t){let i=X(h),l=i/n,c=Math.ceil(l)-1,d=i-c*n,p=(h[0][0]+h[1][0])/2-n/4,u=Math.min(h[0][1],h[1][1]);for(let f=0;f{let h=X(r),i=Math.floor(h/(e+n)),l=(h+n-i*(e+n))/2,c=r[0],d=r[1];c[0]>d[0]&&(c=r[1],d=r[0]);let p=Math.atan((d[1]-c[1])/(d[0]-c[0]));for(let u=0;u{let r=X(o),h=Math.round(r/(2*s)),i=o[0],l=o[1];i[0]>l[0]&&(i=o[1],l=o[0]);let c=Math.atan((l[1]-i[1])/(l[0]-i[0]));for(let d=0;dc%2?l+s:l+t);o.push({key:"C",data:i}),t=i[4],s=i[5];break}case"Q":o.push({key:"Q",data:[...h]}),t=h[2],s=h[3];break;case"q":{let i=h.map((l,c)=>c%2?l+s:l+t);o.push({key:"Q",data:i}),t=i[2],s=i[3];break}case"A":o.push({key:"A",data:[...h]}),t=h[5],s=h[6];break;case"a":t+=h[5],s+=h[6],o.push({key:"A",data:[h[0],h[1],h[2],h[3],h[4],t,s]});break;case"H":o.push({key:"H",data:[...h]}),t=h[0];break;case"h":t+=h[0],o.push({key:"H",data:[t]});break;case"V":o.push({key:"V",data:[...h]}),s=h[0];break;case"v":s+=h[0],o.push({key:"V",data:[s]});break;case"S":o.push({key:"S",data:[...h]}),t=h[2],s=h[3];break;case"s":{let i=h.map((l,c)=>c%2?l+s:l+t);o.push({key:"S",data:i}),t=i[2],s=i[3];break}case"T":o.push({key:"T",data:[...h]}),t=h[0],s=h[1];break;case"t":t+=h[0],s+=h[1],o.push({key:"T",data:[t,s]});break;case"Z":case"z":o.push({key:"Z",data:[]}),t=e,s=n}return o}function Lt(a){let t=[],s="",e=0,n=0,o=0,r=0,h=0,i=0;for(let{key:l,data:c}of a){switch(l){case"M":t.push({key:"M",data:[...c]}),[e,n]=c,[o,r]=c;break;case"C":t.push({key:"C",data:[...c]}),e=c[4],n=c[5],h=c[2],i=c[3];break;case"L":t.push({key:"L",data:[...c]}),[e,n]=c;break;case"H":e=c[0],t.push({key:"L",data:[e,n]});break;case"V":n=c[0],t.push({key:"L",data:[e,n]});break;case"S":{let d=0,p=0;s==="C"||s==="S"?(d=e+(e-h),p=n+(n-i)):(d=e,p=n),t.push({key:"C",data:[d,p,...c]}),h=c[0],i=c[1],e=c[2],n=c[3];break}case"T":{let[d,p]=c,u=0,f=0;s==="Q"||s==="T"?(u=e+(e-h),f=n+(n-i)):(u=e,f=n);let g=e+2*(u-e)/3,k=n+2*(f-n)/3,b=d+2*(u-d)/3,M=p+2*(f-p)/3;t.push({key:"C",data:[g,k,b,M,d,p]}),h=u,i=f,e=d,n=p;break}case"Q":{let[d,p,u,f]=c,g=e+2*(d-e)/3,k=n+2*(p-n)/3,b=u+2*(d-u)/3,M=f+2*(p-f)/3;t.push({key:"C",data:[g,k,b,M,u,f]}),h=d,i=p,e=u,n=f;break}case"A":{let d=Math.abs(c[0]),p=Math.abs(c[1]),u=c[2],f=c[3],g=c[4],k=c[5],b=c[6];d===0||p===0?(t.push({key:"C",data:[e,n,k,b,k,b]}),e=k,n=b):(e!==k||n!==b)&&(Tt(e,n,k,b,d,p,u,f,g).forEach(function(M){t.push({key:"C",data:M})}),e=k,n=b);break}case"Z":t.push({key:"Z",data:[]}),e=o,n=r}s=l}return t}function R(a,t,s){return[a*Math.cos(s)-t*Math.sin(s),a*Math.sin(s)+t*Math.cos(s)]}function Tt(a,t,s,e,n,o,r,h,i,l){let c=(d=r,Math.PI*d/180);var d;let p=[],u=0,f=0,g=0,k=0;if(l)[u,f,g,k]=l;else{[a,t]=R(a,t,-c),[s,e]=R(s,e,-c);let T=(a-s)/2,v=(t-e)/2,_=T*T/(n*n)+v*v/(o*o);_>1&&(_=Math.sqrt(_),n*=_,o*=_);let W=n*n,E=o*o,It=W*E-W*v*v-E*T*T,Ct=W*v*v+E*T*T,kt=(h===i?-1:1)*Math.sqrt(Math.abs(It/Ct));g=kt*n*v/o+(a+s)/2,k=kt*-o*T/n+(t+e)/2,u=Math.asin(parseFloat(((t-k)/o).toFixed(9))),f=Math.asin(parseFloat(((e-k)/o).toFixed(9))),af&&(u-=2*Math.PI),!i&&f>u&&(f-=2*Math.PI)}let b=f-u;if(Math.abs(b)>120*Math.PI/180){let T=f,v=s,_=e;f=i&&f>u?u+120*Math.PI/180*1:u+120*Math.PI/180*-1,p=Tt(s=g+n*Math.cos(f),e=k+o*Math.sin(f),v,_,n,o,r,0,i,[f,T,g,k])}b=f-u;let M=Math.cos(u),m=Math.sin(u),P=Math.cos(f),x=Math.sin(f),w=Math.tan(b/4),L=4/3*n*w,A=4/3*o*w,V=[a,t],D=[a+L*m,t-A*M],C=[s+L*x,e-A*P],Mt=[s,e];if(D[0]=2*V[0]-D[0],D[1]=2*V[1]-D[1],l)return[D,C,Mt].concat(p);{p=[D,C,Mt].concat(p);let T=[];for(let v=0;v2){let n=[];for(let o=0;o2*Math.PI&&(u=0,f=2*Math.PI);let g=2*Math.PI/i.curveStepCount,k=Math.min(g/2,(f-u)/2),b=vt(k,l,c,d,p,u,f,1,i);if(!i.disableMultiStroke){let M=vt(k,l,c,d,p,u,f,1.5,i);b.push(...M)}return r&&(h?b.push(...I(l,c,l+d*Math.cos(u),c+p*Math.sin(u),i),...I(l,c,l+d*Math.cos(f),c+p*Math.sin(f),i)):b.push({op:"lineTo",data:[l,c]},{op:"lineTo",data:[l+d*Math.cos(u),c+p*Math.sin(u)]})),{type:"path",ops:b}}function wt(a,t){let s=Lt(Ot(gt(a))),e=[],n=[0,0],o=[0,0];for(let{key:r,data:h}of s)switch(r){case"M":o=[h[0],h[1]],n=[h[0],h[1]];break;case"L":e.push(...I(o[0],o[1],h[0],h[1],t)),o=[h[0],h[1]];break;case"C":{let[i,l,c,d,p,u]=h;e.push(...Rt(i,l,c,d,p,u,o,t)),o=[p,u];break}case"Z":e.push(...I(o[0],o[1],n[0],n[1],t)),o=[n[0],n[1]]}return{type:"path",ops:e}}function st(a,t){let s=[];for(let e of a)if(e.length){let n=t.maxRandomnessOffset||0,o=e.length;if(o>2){s.push({op:"move",data:[e[0][0]+y(n,t),e[0][1]+y(n,t)]});for(let r=1;r500?.4:-.0016668*i+1.233334;let c=n.maxRandomnessOffset||0;c*c*100>h&&(c=i/10);let d=c/2,p=.2+.2*_t(n),u=n.bowing*n.maxRandomnessOffset*(e-t)/200,f=n.bowing*n.maxRandomnessOffset*(a-s)/200;u=y(u,n,l),f=y(f,n,l);let g=[],k=()=>y(d,n,l),b=()=>y(c,n,l),M=n.preserveVertices;return o&&(r?g.push({op:"move",data:[a+(M?0:k()),t+(M?0:k())]}):g.push({op:"move",data:[a+(M?0:y(c,n,l)),t+(M?0:y(c,n,l))]})),r?g.push({op:"bcurveTo",data:[u+a+(s-a)*p+k(),f+t+(e-t)*p+k(),u+a+2*(s-a)*p+k(),f+t+2*(e-t)*p+k(),s+(M?0:k()),e+(M?0:k())]}):g.push({op:"bcurveTo",data:[u+a+(s-a)*p+b(),f+t+(e-t)*p+b(),u+a+2*(s-a)*p+b(),f+t+2*(e-t)*p+b(),s+(M?0:b()),e+(M?0:b())]}),g}function Q(a,t,s){if(!a.length)return[];let e=[];e.push([a[0][0]+y(t,s),a[0][1]+y(t,s)]),e.push([a[0][0]+y(t,s),a[0][1]+y(t,s)]);for(let n=1;n3){let o=[],r=1-s.curveTightness;n.push({op:"move",data:[a[1][0],a[1][1]]});for(let h=1;h+21&&n.push(h)):n.push(h),n.push(a[t+3])}else{let i=a[t+0],l=a[t+1],c=a[t+2],d=a[t+3],p=z(i,l,.5),u=z(l,c,.5),f=z(c,d,.5),g=z(p,u,.5),k=z(u,f,.5),b=z(g,k,.5);pt([i,p,g,b],0,s,n),pt([b,k,f,d],0,s,n)}var o,r;return n}function qt(a,t){return U(a,0,a.length,t)}function U(a,t,s,e,n){let o=n||[],r=a[t],h=a[s-1],i=0,l=1;for(let c=t+1;ci&&(i=d,l=c)}return Math.sqrt(i)>e?(U(a,t,l+1,e,o),U(a,l,s,e,o)):(o.length||o.push(r),o.push(h)),o}function nt(a,t=.15,s){let e=[],n=(a.length-1)/3;for(let o=0;o0?U(e,0,e.length,s):e}var O="none",$=class{constructor(t){this.defaultOptions={maxRandomnessOffset:2,roughness:1,bowing:1,stroke:"#000",strokeWidth:1,curveTightness:0,curveFitting:.95,curveStepCount:9,fillStyle:"hachure",fillWeight:-1,hachureAngle:-41,hachureGap:-1,dashOffset:-1,dashGap:-1,zigzagOffset:-1,seed:0,disableMultiStroke:!1,disableMultiStrokeFill:!1,preserveVertices:!1,fillShapeRoughnessGain:.8},this.config=t||{},this.config.options&&(this.defaultOptions=this._o(this.config.options))}static newSeed(){return Math.floor(Math.random()*2**31)}_o(t){return t?Object.assign({},this.defaultOptions,t):this.defaultOptions}_d(t,s,e){return{shape:t,sets:s||[],options:e||this.defaultOptions}}line(t,s,e,n,o){let r=this._o(o);return this._d("line",[Dt(t,s,e,n,r)],r)}rectangle(t,s,e,n,o){let r=this._o(o),h=[],i=$t(t,s,e,n,r);if(r.fill){let l=[[t,s],[t+e,s],[t+e,s+n],[t,s+n]];r.fillStyle==="solid"?h.push(st([l],r)):h.push(G([l],r))}return r.stroke!==O&&h.push(i),this._d("rectangle",h,r)}ellipse(t,s,e,n,o){let r=this._o(o),h=[],i=At(e,n,r),l=lt(t,s,r,i);if(r.fill)if(r.fillStyle==="solid"){let c=lt(t,s,r,i).opset;c.type="fillPath",h.push(c)}else h.push(G([l.estimatedPoints],r));return r.stroke!==O&&h.push(l.opset),this._d("ellipse",h,r)}circle(t,s,e,n){let o=this.ellipse(t,s,e,e,n);return o.shape="circle",o}linearPath(t,s){let e=this._o(s);return this._d("linearPath",[N(t,!1,e)],e)}arc(t,s,e,n,o,r,h=!1,i){let l=this._o(i),c=[],d=mt(t,s,e,n,o,r,h,!0,l);if(h&&l.fill)if(l.fillStyle==="solid"){let p=Object.assign({},l);p.disableMultiStroke=!0;let u=mt(t,s,e,n,o,r,!0,!1,p);u.type="fillPath",c.push(u)}else c.push((function(p,u,f,g,k,b,M){let m=p,P=u,x=Math.abs(f/2),w=Math.abs(g/2);x+=y(.01*x,M),w+=y(.01*w,M);let L=k,A=b;for(;L<0;)L+=2*Math.PI,A+=2*Math.PI;A-L>2*Math.PI&&(L=0,A=2*Math.PI);let V=(A-L)/M.curveStepCount,D=[];for(let C=L;C<=A;C+=V)D.push([m+x*Math.cos(C),P+w*Math.sin(C)]);return D.push([m+x*Math.cos(A),P+w*Math.sin(A)]),D.push([m,P]),G([D],M)})(t,s,e,n,o,r,l));return l.stroke!==O&&c.push(d),this._d("arc",c,l)}curve(t,s){let e=this._o(s),n=[],o=yt(t,e);if(e.fill&&e.fill!==O)if(e.fillStyle==="solid"){let r=yt(t,Object.assign(Object.assign({},e),{disableMultiStroke:!0,roughness:e.roughness?e.roughness+e.fillShapeRoughnessGain:0}));n.push({type:"fillPath",ops:this._mergedShape(r.ops)})}else{let r=[],h=t;if(h.length){let i=typeof h[0][0]=="number"?[h]:h;for(let l of i)l.length<3?r.push(...l):l.length===3?r.push(...nt(St([l[0],l[0],l[1],l[2]]),10,(1+e.roughness)/2)):r.push(...nt(St(l),10,(1+e.roughness)/2))}r.length&&n.push(G([r],e))}return e.stroke!==O&&n.push(o),this._d("curve",n,e)}polygon(t,s){let e=this._o(s),n=[],o=N(t,!0,e);return e.fill&&(e.fillStyle==="solid"?n.push(st([t],e)):n.push(G([t],e))),e.stroke!==O&&n.push(o),this._d("polygon",n,e)}path(t,s){let e=this._o(s),n=[];if(!t)return this._d("path",n,e);t=(t||"").replace(/\n/g," ").replace(/(-\s)/g,"-").replace("/(ss)/g"," ");let o=e.fill&&e.fill!=="transparent"&&e.fill!==O,r=e.stroke!==O,h=!!(e.simplification&&e.simplification<1),i=(function(c,d,p){let u=Lt(Ot(gt(c))),f=[],g=[],k=[0,0],b=[],M=()=>{b.length>=4&&g.push(...nt(b,d)),b=[]},m=()=>{M(),g.length&&(f.push(g),g=[])};for(let{key:x,data:w}of u)switch(x){case"M":m(),k=[w[0],w[1]],g.push(k);break;case"L":M(),g.push([w[0],w[1]]);break;case"C":if(!b.length){let L=g.length?g[g.length-1]:k;b.push([L[0],L[1]])}b.push([w[0],w[1]]),b.push([w[2],w[3]]),b.push([w[4],w[5]]);break;case"Z":M(),g.push([k[0],k[1]])}if(m(),!p)return f;let P=[];for(let x of f){let w=qt(x,p);w.length&&P.push(w)}return P})(t,1,h?4-4*(e.simplification||1):(1+e.roughness)/2),l=wt(t,e);if(o)if(e.fillStyle==="solid")if(i.length===1){let c=wt(t,Object.assign(Object.assign({},e),{disableMultiStroke:!0,roughness:e.roughness?e.roughness+e.fillShapeRoughnessGain:0}));n.push({type:"fillPath",ops:this._mergedShape(c.ops)})}else n.push(st(i,e));else n.push(G(i,e));return r&&(h?i.forEach(c=>{n.push(N(c,!1,e))}):n.push(l)),this._d("path",n,e)}opsToPath(t,s){let e="";for(let n of t.ops){let o=typeof s=="number"&&s>=0?n.data.map(r=>+r.toFixed(s)):n.data;switch(n.op){case"move":e+=`M${o[0]} ${o[1]} `;break;case"bcurveTo":e+=`C${o[0]} ${o[1]}, ${o[2]} ${o[3]}, ${o[4]} ${o[5]} `;break;case"lineTo":e+=`L${o[0]} ${o[1]} `}}return e.trim()}toPaths(t){let s=t.sets||[],e=t.options||this.defaultOptions,n=[];for(let o of s){let r=null;switch(o.type){case"path":r={d:this.opsToPath(o),stroke:e.stroke,strokeWidth:e.strokeWidth,fill:O};break;case"fillPath":r={d:this.opsToPath(o),stroke:O,strokeWidth:0,fill:e.fill||O};break;case"fillSketch":r=this.fillSketch(o,e)}r&&n.push(r)}return n}fillSketch(t,s){let e=s.fillWeight;return e<0&&(e=s.strokeWidth/2),{d:this.opsToPath(t),stroke:s.fill||O,strokeWidth:e,fill:O}}_mergedShape(t){return t.filter((s,e)=>e===0||s.op!=="move")}},ft=class{constructor(t,s){this.canvas=t,this.ctx=this.canvas.getContext("2d"),this.gen=new $(s)}draw(t){let s=t.sets||[],e=t.options||this.getDefaultOptions(),n=this.ctx,o=t.options.fixedDecimalPlaceDigits;for(let r of s)switch(r.type){case"path":n.save(),n.strokeStyle=e.stroke==="none"?"transparent":e.stroke,n.lineWidth=e.strokeWidth,e.strokeLineDash&&n.setLineDash(e.strokeLineDash),e.strokeLineDashOffset&&(n.lineDashOffset=e.strokeLineDashOffset),this._drawToContext(n,r,o),n.restore();break;case"fillPath":{n.save(),n.fillStyle=e.fill||"";let h=t.shape==="curve"||t.shape==="polygon"||t.shape==="path"?"evenodd":"nonzero";this._drawToContext(n,r,o,h),n.restore();break}case"fillSketch":this.fillSketch(n,r,e)}}fillSketch(t,s,e){let n=e.fillWeight;n<0&&(n=e.strokeWidth/2),t.save(),e.fillLineDash&&t.setLineDash(e.fillLineDash),e.fillLineDashOffset&&(t.lineDashOffset=e.fillLineDashOffset),t.strokeStyle=e.fill||"",t.lineWidth=n,this._drawToContext(t,s,e.fixedDecimalPlaceDigits),t.restore()}_drawToContext(t,s,e,n="nonzero"){t.beginPath();for(let o of s.ops){let r=typeof e=="number"&&e>=0?o.data.map(h=>+h.toFixed(e)):o.data;switch(o.op){case"move":t.moveTo(r[0],r[1]);break;case"bcurveTo":t.bezierCurveTo(r[0],r[1],r[2],r[3],r[4],r[5]);break;case"lineTo":t.lineTo(r[0],r[1])}}s.type==="fillPath"?t.fill(n):t.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(t,s,e,n,o){let r=this.gen.line(t,s,e,n,o);return this.draw(r),r}rectangle(t,s,e,n,o){let r=this.gen.rectangle(t,s,e,n,o);return this.draw(r),r}ellipse(t,s,e,n,o){let r=this.gen.ellipse(t,s,e,n,o);return this.draw(r),r}circle(t,s,e,n){let o=this.gen.circle(t,s,e,n);return this.draw(o),o}linearPath(t,s){let e=this.gen.linearPath(t,s);return this.draw(e),e}polygon(t,s){let e=this.gen.polygon(t,s);return this.draw(e),e}arc(t,s,e,n,o,r,h=!1,i){let l=this.gen.arc(t,s,e,n,o,r,h,i);return this.draw(l),l}curve(t,s){let e=this.gen.curve(t,s);return this.draw(e),e}path(t,s){let e=this.gen.path(t,s);return this.draw(e),e}},H="http://www.w3.org/2000/svg",dt=class{constructor(t,s){this.svg=t,this.gen=new $(s)}draw(t){let s=t.sets||[],e=t.options||this.getDefaultOptions(),n=this.svg.ownerDocument||window.document,o=n.createElementNS(H,"g"),r=t.options.fixedDecimalPlaceDigits;for(let h of s){let i=null;switch(h.type){case"path":i=n.createElementNS(H,"path"),i.setAttribute("d",this.opsToPath(h,r)),i.setAttribute("stroke",e.stroke),i.setAttribute("stroke-width",e.strokeWidth+""),i.setAttribute("fill","none"),e.strokeLineDash&&i.setAttribute("stroke-dasharray",e.strokeLineDash.join(" ").trim()),e.strokeLineDashOffset&&i.setAttribute("stroke-dashoffset",`${e.strokeLineDashOffset}`);break;case"fillPath":i=n.createElementNS(H,"path"),i.setAttribute("d",this.opsToPath(h,r)),i.setAttribute("stroke","none"),i.setAttribute("stroke-width","0"),i.setAttribute("fill",e.fill||""),t.shape!=="curve"&&t.shape!=="polygon"||i.setAttribute("fill-rule","evenodd");break;case"fillSketch":i=this.fillSketch(n,h,e)}i&&o.appendChild(i)}return o}fillSketch(t,s,e){let n=e.fillWeight;n<0&&(n=e.strokeWidth/2);let o=t.createElementNS(H,"path");return o.setAttribute("d",this.opsToPath(s,e.fixedDecimalPlaceDigits)),o.setAttribute("stroke",e.fill||""),o.setAttribute("stroke-width",n+""),o.setAttribute("fill","none"),e.fillLineDash&&o.setAttribute("stroke-dasharray",e.fillLineDash.join(" ").trim()),e.fillLineDashOffset&&o.setAttribute("stroke-dashoffset",`${e.fillLineDashOffset}`),o}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(t,s){return this.gen.opsToPath(t,s)}line(t,s,e,n,o){let r=this.gen.line(t,s,e,n,o);return this.draw(r)}rectangle(t,s,e,n,o){let r=this.gen.rectangle(t,s,e,n,o);return this.draw(r)}ellipse(t,s,e,n,o){let r=this.gen.ellipse(t,s,e,n,o);return this.draw(r)}circle(t,s,e,n){let o=this.gen.circle(t,s,e,n);return this.draw(o)}linearPath(t,s){let e=this.gen.linearPath(t,s);return this.draw(e)}polygon(t,s){let e=this.gen.polygon(t,s);return this.draw(e)}arc(t,s,e,n,o,r,h=!1,i){let l=this.gen.arc(t,s,e,n,o,r,h,i);return this.draw(l)}curve(t,s){let e=this.gen.curve(t,s);return this.draw(e)}path(t,s){let e=this.gen.path(t,s);return this.draw(e)}},Ft={canvas:(a,t)=>new ft(a,t),svg:(a,t)=>new dt(a,t),generator:a=>new $(a),newSeed:()=>$.newSeed()};export{Ft as a}; diff --git a/src/google/adk/cli/browser/chunk-2VKC3BHH.js b/src/google/adk/cli/browser/chunk-Q6H4XMU7.js similarity index 93% rename from src/google/adk/cli/browser/chunk-2VKC3BHH.js rename to src/google/adk/cli/browser/chunk-Q6H4XMU7.js index 9662795485..c182271548 100644 --- a/src/google/adk/cli/browser/chunk-2VKC3BHH.js +++ b/src/google/adk/cli/browser/chunk-Q6H4XMU7.js @@ -1 +1 @@ -import{$a as r,Ca as o,Cc as h,Gb as u,Jb as p,Pa as a,Yb as m,Zb as f,eb as c,pd as y,qd as g,xb as s,yb as l,zb as d}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var _=(()=>{class n extends y{action=h.required();handleClick(){let t=this.action();t&&super.sendAction(t)}static \u0275fac=(()=>{let t;return function(e){return(t||(t=o(n)))(e||n)}})();static \u0275cmp=r({type:n,selectors:[["a2ui-button"]],inputs:{action:[1,"action"]},features:[c],decls:2,vars:6,consts:[[3,"click"],["a2ui-renderer","",3,"surfaceId","component"]],template:function(i,e){i&1&&(l(0,"button",0),p("click",function(){return e.handleClick()}),u(1,1),d()),i&2&&(m(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Button),f(e.theme.components.Button),a(),s("surfaceId",e.surfaceId())("component",e.component().properties.child))},dependencies:[g],styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0}"]})}return n})();export{_ as Button}; +import{$a as r,Ca as o,Cc as h,Gb as u,Jb as p,Pa as a,Yb as m,Zb as f,eb as c,pd as y,qd as g,xb as s,yb as l,zb as d}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var _=(()=>{class n extends y{action=h.required();handleClick(){let t=this.action();t&&super.sendAction(t)}static \u0275fac=(()=>{let t;return function(e){return(t||(t=o(n)))(e||n)}})();static \u0275cmp=r({type:n,selectors:[["a2ui-button"]],inputs:{action:[1,"action"]},features:[c],decls:2,vars:6,consts:[[3,"click"],["a2ui-renderer","",3,"surfaceId","component"]],template:function(i,e){i&1&&(l(0,"button",0),p("click",function(){return e.handleClick()}),u(1,1),d()),i&2&&(m(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Button),f(e.theme.components.Button),a(),s("surfaceId",e.surfaceId())("component",e.component().properties.child))},dependencies:[g],styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0}"]})}return n})();export{_ as Button}; diff --git a/src/google/adk/cli/browser/chunk-QFMJV7VH.js b/src/google/adk/cli/browser/chunk-QFMJV7VH.js new file mode 100644 index 0000000000..b7cb38a78b --- /dev/null +++ b/src/google/adk/cli/browser/chunk-QFMJV7VH.js @@ -0,0 +1,80 @@ +import{g as l,h as pi,i as M,j as fi}from"./chunk-JRNAXTJ7.js";import{a as P,b as X,j as jt}from"./chunk-RMXJBC7V.js";var Vt={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:t=>t>=255?255:t<0?0:t,g:t=>t>=255?255:t<0?0:t,b:t=>t>=255?255:t<0?0:t,h:t=>t%360,s:t=>t>=100?100:t<0?0:t,l:t=>t>=100?100:t<0?0:t,a:t=>t>=1?1:t<0?0:t},toLinear:t=>{let e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},hue2rgb:(t,e,i)=>(i<0&&(i+=1),i>1&&(i-=1),i<.16666666666666666?t+(e-t)*6*i:i<.5?e:i<.6666666666666666?t+(e-t)*(.6666666666666666-i)*6:t),hsl2rgb:({h:t,s:e,l:i},a)=>{if(!e)return i*2.55;t/=360,e/=100,i/=100;let s=i<.5?i*(1+e):i+e-i*e,c=2*i-s;switch(a){case"r":return Vt.hue2rgb(c,s,t+.3333333333333333)*255;case"g":return Vt.hue2rgb(c,s,t)*255;case"b":return Vt.hue2rgb(c,s,t-.3333333333333333)*255}},rgb2hsl:({r:t,g:e,b:i},a)=>{t/=255,e/=255,i/=255;let s=Math.max(t,e,i),c=Math.min(t,e,i),f=(s+c)/2;if(a==="l")return f*100;if(s===c)return 0;let x=s-c,_=f>.5?x/(2-s-c):x/(s+c);if(a==="s")return _*100;switch(s){case t:return((e-i)/x+(ee>i?Math.min(e,Math.max(i,t)):Math.min(i,Math.max(e,t)),round:t=>Math.round(t*1e10)/1e10},yi=yr;var br={dec2hex:t=>{let e=Math.round(t).toString(16);return e.length>1?e:`0${e}`}},bi=br;var Tr={channel:xi,lang:yi,unit:bi},C=Tr;var tt={};for(let t=0;t<=255;t++)tt[t]=C.unit.dec2hex(t);var S={ALL:0,RGB:1,HSL:2};var Le=class{constructor(){this.type=S.ALL}get(){return this.type}set(e){if(this.type&&this.type!==e)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=e}reset(){this.type=S.ALL}is(e){return this.type===e}},Ti=Le;var ve=class{constructor(e,i){this.color=i,this.changed=!1,this.data=e,this.type=new Ti}set(e,i){return this.color=i,this.changed=!1,this.data=e,this.type.type=S.ALL,this}_ensureHSL(){let e=this.data,{h:i,s:a,l:s}=e;i===void 0&&(e.h=C.channel.rgb2hsl(e,"h")),a===void 0&&(e.s=C.channel.rgb2hsl(e,"s")),s===void 0&&(e.l=C.channel.rgb2hsl(e,"l"))}_ensureRGB(){let e=this.data,{r:i,g:a,b:s}=e;i===void 0&&(e.r=C.channel.hsl2rgb(e,"r")),a===void 0&&(e.g=C.channel.hsl2rgb(e,"g")),s===void 0&&(e.b=C.channel.hsl2rgb(e,"b"))}get r(){let e=this.data,i=e.r;return!this.type.is(S.HSL)&&i!==void 0?i:(this._ensureHSL(),C.channel.hsl2rgb(e,"r"))}get g(){let e=this.data,i=e.g;return!this.type.is(S.HSL)&&i!==void 0?i:(this._ensureHSL(),C.channel.hsl2rgb(e,"g"))}get b(){let e=this.data,i=e.b;return!this.type.is(S.HSL)&&i!==void 0?i:(this._ensureHSL(),C.channel.hsl2rgb(e,"b"))}get h(){let e=this.data,i=e.h;return!this.type.is(S.RGB)&&i!==void 0?i:(this._ensureRGB(),C.channel.rgb2hsl(e,"h"))}get s(){let e=this.data,i=e.s;return!this.type.is(S.RGB)&&i!==void 0?i:(this._ensureRGB(),C.channel.rgb2hsl(e,"s"))}get l(){let e=this.data,i=e.l;return!this.type.is(S.RGB)&&i!==void 0?i:(this._ensureRGB(),C.channel.rgb2hsl(e,"l"))}get a(){return this.data.a}set r(e){this.type.set(S.RGB),this.changed=!0,this.data.r=e}set g(e){this.type.set(S.RGB),this.changed=!0,this.data.g=e}set b(e){this.type.set(S.RGB),this.changed=!0,this.data.b=e}set h(e){this.type.set(S.HSL),this.changed=!0,this.data.h=e}set s(e){this.type.set(S.HSL),this.changed=!0,this.data.s=e}set l(e){this.type.set(S.HSL),this.changed=!0,this.data.l=e}set a(e){this.changed=!0,this.data.a=e}},ki=ve;var kr=new ki({r:0,g:0,b:0,a:0},"transparent"),ot=kr;var Si={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:t=>{if(t.charCodeAt(0)!==35)return;let e=t.match(Si.re);if(!e)return;let i=e[1],a=parseInt(i,16),s=i.length,c=s%4===0,f=s>4,x=f?1:17,_=f?8:4,L=c?0:-1,$=f?255:15;return ot.set({r:(a>>_*(L+3)&$)*x,g:(a>>_*(L+2)&$)*x,b:(a>>_*(L+1)&$)*x,a:c?(a&$)*x/255:1},t)},stringify:t=>{let{r:e,g:i,b:a,a:s}=t;return s<1?`#${tt[Math.round(e)]}${tt[Math.round(i)]}${tt[Math.round(a)]}${tt[Math.round(s*255)]}`:`#${tt[Math.round(e)]}${tt[Math.round(i)]}${tt[Math.round(a)]}`}},lt=Si;var Yt={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:t=>{let e=t.match(Yt.hueRe);if(e){let[,i,a]=e;switch(a){case"grad":return C.channel.clamp.h(parseFloat(i)*.9);case"rad":return C.channel.clamp.h(parseFloat(i)*180/Math.PI);case"turn":return C.channel.clamp.h(parseFloat(i)*360)}}return C.channel.clamp.h(parseFloat(t))},parse:t=>{let e=t.charCodeAt(0);if(e!==104&&e!==72)return;let i=t.match(Yt.re);if(!i)return;let[,a,s,c,f,x]=i;return ot.set({h:Yt._hue2deg(a),s:C.channel.clamp.s(parseFloat(s)),l:C.channel.clamp.l(parseFloat(c)),a:f?C.channel.clamp.a(x?parseFloat(f)/100:parseFloat(f)):1},t)},stringify:t=>{let{h:e,s:i,l:a,a:s}=t;return s<1?`hsla(${C.lang.round(e)}, ${C.lang.round(i)}%, ${C.lang.round(a)}%, ${s})`:`hsl(${C.lang.round(e)}, ${C.lang.round(i)}%, ${C.lang.round(a)}%)`}},At=Yt;var Xt={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:t=>{t=t.toLowerCase();let e=Xt.colors[t];if(e)return lt.parse(e)},stringify:t=>{let e=lt.stringify(t);for(let i in Xt.colors)if(Xt.colors[i]===e)return i}},Ae=Xt;var Bi={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:t=>{let e=t.charCodeAt(0);if(e!==114&&e!==82)return;let i=t.match(Bi.re);if(!i)return;let[,a,s,c,f,x,_,L,$]=i;return ot.set({r:C.channel.clamp.r(s?parseFloat(a)*2.55:parseFloat(a)),g:C.channel.clamp.g(f?parseFloat(c)*2.55:parseFloat(c)),b:C.channel.clamp.b(_?parseFloat(x)*2.55:parseFloat(x)),a:L?C.channel.clamp.a($?parseFloat(L)/100:parseFloat(L)):1},t)},stringify:t=>{let{r:e,g:i,b:a,a:s}=t;return s<1?`rgba(${C.lang.round(e)}, ${C.lang.round(i)}, ${C.lang.round(a)}, ${C.lang.round(s)})`:`rgb(${C.lang.round(e)}, ${C.lang.round(i)}, ${C.lang.round(a)})`}},Et=Bi;var Sr={format:{keyword:Ae,hex:lt,rgb:Et,rgba:Et,hsl:At,hsla:At},parse:t=>{if(typeof t!="string")return t;let e=lt.parse(t)||Et.parse(t)||At.parse(t)||Ae.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},stringify:t=>!t.changed&&t.color?t.color:t.type.is(S.HSL)||t.data.r===void 0?At.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?Et.stringify(t):lt.stringify(t)},B=Sr;var Br=(t,e)=>{let i=B.parse(t);for(let a in e)i[a]=C.channel.clamp[a](e[a]);return B.stringify(i)},Kt=Br;var Fr=(t,e,i=0,a=1)=>{if(typeof t!="number")return Kt(t,{a:e});let s=ot.set({r:C.channel.clamp.r(t),g:C.channel.clamp.g(e),b:C.channel.clamp.b(i),a:C.channel.clamp.a(a)});return B.stringify(s)},et=Fr;var _r=(t,e)=>C.lang.round(B.parse(t)[e]),Lr=_r;var vr=t=>{let{r:e,g:i,b:a}=B.parse(t),s=.2126*C.channel.toLinear(e)+.7152*C.channel.toLinear(i)+.0722*C.channel.toLinear(a);return C.lang.round(s)},Fi=vr;var Ar=t=>Fi(t)>=.5,_i=Ar;var Er=t=>!_i(t),j=Er;var Or=(t,e,i)=>{let a=B.parse(t),s=a[e],c=C.channel.clamp[e](s+i);return s!==c&&(a[e]=c),B.stringify(a)},yt=Or;var Mr=(t,e)=>yt(t,"l",e),d=Mr;var Dr=(t,e)=>yt(t,"l",-e),g=Dr;var wr=(t,e)=>yt(t,"a",-e),Ir=wr;var zr=(t,e)=>{let i=B.parse(t),a={};for(let s in e)e[s]&&(a[s]=i[s]+e[s]);return Kt(t,a)},o=zr;var qr=(t,e,i=50)=>{let{r:a,g:s,b:c,a:f}=B.parse(t),{r:x,g:_,b:L,a:$}=B.parse(e),St=i/100,ht=St*2-1,it=f-$,dt=((ht*it===-1?ht:(ht+it)/(1+ht*it))+1)/2,Bt=1-dt,ce=a*dt+x*Bt,de=s*dt+_*Bt,ut=c*dt+L*Bt,v=f*St+$*(1-St);return et(ce,de,ut,v)},Li=qr;var Rr=(t,e=100)=>{let i=B.parse(t);return i.r=255-i.r,i.g=255-i.g,i.b=255-i.b,Li(i,t,e)},h=Rr;var{entries:zi,setPrototypeOf:vi,isFrozen:Wr,getPrototypeOf:Pr,getOwnPropertyDescriptor:Nr}=Object,{freeze:z,seal:U,create:Qt}=Object,{apply:ze,construct:qe}=typeof Reflect<"u"&&Reflect;z||(z=function(e){return e});U||(U=function(e){return e});ze||(ze=function(e,i){for(var a=arguments.length,s=new Array(a>2?a-2:0),c=2;c1?i-1:0),s=1;s1?i-1:0),s=1;s2&&arguments[2]!==void 0?arguments[2]:te;vi&&vi(t,null);let a=e.length;for(;a--;){let s=e[a];if(typeof s=="string"){let c=i(s);c!==s&&(Wr(e)||(e[a]=c),s=c)}t[s]=!0}return t}function Vr(t){for(let e=0;e/gm),Jr=U(/\$\{[\w\W]*/gm),Qr=U(/^data-[\-\w.\u00B7-\uFFFF]+$/),to=U(/^aria-[\-\w]+$/),qi=U(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),eo=U(/^(?:\w+script|data):/i),io=U(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Ri=U(/^html$/i),ro=U(/^[a-z][.\w]*(-[.\w]+)+$/i),wi=Object.freeze({__proto__:null,ARIA_ATTR:to,ATTR_WHITESPACE:io,CUSTOM_ELEMENT:ro,DATA_ATTR:Qr,DOCTYPE_NAME:Ri,ERB_EXPR:Zr,IS_ALLOWED_URI:qi,IS_SCRIPT_OR_DATA:eo,MUSTACHE_EXPR:Kr,TMPLIT_EXPR:Jr}),It={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},oo=function(){return typeof window>"u"?null:window},ao=function(e,i){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let a=null,s="data-tt-policy-suffix";i&&i.hasAttribute(s)&&(a=i.getAttribute(s));let c="dompurify"+(a?"#"+a:"");try{return e.createPolicy(c,{createHTML(f){return f},createScriptURL(f){return f}})}catch(f){return console.warn("TrustedTypes policy "+c+" could not be created."),null}},Ii=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function Wi(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:oo(),e=m=>Wi(m);if(e.version="3.3.3",e.removed=[],!t||!t.document||t.document.nodeType!==It.document||!t.Element)return e.isSupported=!1,e;let{document:i}=t,a=i,s=a.currentScript,{DocumentFragment:c,HTMLTemplateElement:f,Node:x,Element:_,NodeFilter:L,NamedNodeMap:$=t.NamedNodeMap||t.MozNamedAttrMap,HTMLFormElement:St,DOMParser:ht,trustedTypes:it}=t,ct=_.prototype,dt=wt(ct,"cloneNode"),Bt=wt(ct,"remove"),ce=wt(ct,"nextSibling"),de=wt(ct,"childNodes"),ut=wt(ct,"parentNode");if(typeof f=="function"){let m=i.createElement("template");m.content&&m.content.ownerDocument&&(i=m.content.ownerDocument)}let v,Ft="",{implementation:ue,createNodeIterator:rr,createDocumentFragment:or,getElementsByTagName:ar}=i,{importNode:sr}=a,w=Ii();e.isSupported=typeof zi=="function"&&typeof ut=="function"&&ue&&ue.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:ge,ERB_EXPR:Ce,TMPLIT_EXPR:me,DATA_ATTR:lr,ARIA_ATTR:nr,IS_SCRIPT_OR_DATA:hr,ATTR_WHITESPACE:je,CUSTOM_ELEMENT:cr}=wi,{IS_ALLOWED_URI:Ve}=wi,F=null,Ye=p({},[...Ei,...Me,...De,...we,...Oi]),A=null,Xe=p({},[...Mi,...Ie,...Di,...Jt]),b=Object.seal(Qt(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),_t=null,Rt=null,rt=Object.seal(Qt(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),Ke=!0,pe=!0,Ze=!1,Je=!0,gt=!1,Wt=!0,at=!1,fe=!1,xe=!1,Ct=!1,Pt=!1,Nt=!1,Qe=!0,ti=!1,dr="user-content-",ye=!0,Lt=!1,mt={},V=null,be=p({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),ei=null,ii=p({},["audio","video","img","source","image","track"]),Te=null,ri=p({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Ht="http://www.w3.org/1998/Math/MathML",Ut="http://www.w3.org/2000/svg",Z="http://www.w3.org/1999/xhtml",pt=Z,ke=!1,Se=null,ur=p({},[Ht,Ut,Z],Ee),Gt=p({},["mi","mo","mn","ms","mtext"]),$t=p({},["annotation-xml"]),gr=p({},["title","style","font","a","script"]),vt=null,Cr=["application/xhtml+xml","text/html"],mr="text/html",k=null,ft=null,pr=i.createElement("form"),oi=function(r){return r instanceof RegExp||r instanceof Function},Be=function(){let r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(ft&&ft===r)){if((!r||typeof r!="object")&&(r={}),r=K(r),vt=Cr.indexOf(r.PARSER_MEDIA_TYPE)===-1?mr:r.PARSER_MEDIA_TYPE,k=vt==="application/xhtml+xml"?Ee:te,F=H(r,"ALLOWED_TAGS")?p({},r.ALLOWED_TAGS,k):Ye,A=H(r,"ALLOWED_ATTR")?p({},r.ALLOWED_ATTR,k):Xe,Se=H(r,"ALLOWED_NAMESPACES")?p({},r.ALLOWED_NAMESPACES,Ee):ur,Te=H(r,"ADD_URI_SAFE_ATTR")?p(K(ri),r.ADD_URI_SAFE_ATTR,k):ri,ei=H(r,"ADD_DATA_URI_TAGS")?p(K(ii),r.ADD_DATA_URI_TAGS,k):ii,V=H(r,"FORBID_CONTENTS")?p({},r.FORBID_CONTENTS,k):be,_t=H(r,"FORBID_TAGS")?p({},r.FORBID_TAGS,k):K({}),Rt=H(r,"FORBID_ATTR")?p({},r.FORBID_ATTR,k):K({}),mt=H(r,"USE_PROFILES")?r.USE_PROFILES:!1,Ke=r.ALLOW_ARIA_ATTR!==!1,pe=r.ALLOW_DATA_ATTR!==!1,Ze=r.ALLOW_UNKNOWN_PROTOCOLS||!1,Je=r.ALLOW_SELF_CLOSE_IN_ATTR!==!1,gt=r.SAFE_FOR_TEMPLATES||!1,Wt=r.SAFE_FOR_XML!==!1,at=r.WHOLE_DOCUMENT||!1,Ct=r.RETURN_DOM||!1,Pt=r.RETURN_DOM_FRAGMENT||!1,Nt=r.RETURN_TRUSTED_TYPE||!1,xe=r.FORCE_BODY||!1,Qe=r.SANITIZE_DOM!==!1,ti=r.SANITIZE_NAMED_PROPS||!1,ye=r.KEEP_CONTENT!==!1,Lt=r.IN_PLACE||!1,Ve=r.ALLOWED_URI_REGEXP||qi,pt=r.NAMESPACE||Z,Gt=r.MATHML_TEXT_INTEGRATION_POINTS||Gt,$t=r.HTML_INTEGRATION_POINTS||$t,b=r.CUSTOM_ELEMENT_HANDLING||{},r.CUSTOM_ELEMENT_HANDLING&&oi(r.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(b.tagNameCheck=r.CUSTOM_ELEMENT_HANDLING.tagNameCheck),r.CUSTOM_ELEMENT_HANDLING&&oi(r.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(b.attributeNameCheck=r.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),r.CUSTOM_ELEMENT_HANDLING&&typeof r.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(b.allowCustomizedBuiltInElements=r.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),gt&&(pe=!1),Pt&&(Ct=!0),mt&&(F=p({},Oi),A=Qt(null),mt.html===!0&&(p(F,Ei),p(A,Mi)),mt.svg===!0&&(p(F,Me),p(A,Ie),p(A,Jt)),mt.svgFilters===!0&&(p(F,De),p(A,Ie),p(A,Jt)),mt.mathMl===!0&&(p(F,we),p(A,Di),p(A,Jt))),H(r,"ADD_TAGS")||(rt.tagCheck=null),H(r,"ADD_ATTR")||(rt.attributeCheck=null),r.ADD_TAGS&&(typeof r.ADD_TAGS=="function"?rt.tagCheck=r.ADD_TAGS:(F===Ye&&(F=K(F)),p(F,r.ADD_TAGS,k))),r.ADD_ATTR&&(typeof r.ADD_ATTR=="function"?rt.attributeCheck=r.ADD_ATTR:(A===Xe&&(A=K(A)),p(A,r.ADD_ATTR,k))),r.ADD_URI_SAFE_ATTR&&p(Te,r.ADD_URI_SAFE_ATTR,k),r.FORBID_CONTENTS&&(V===be&&(V=K(V)),p(V,r.FORBID_CONTENTS,k)),r.ADD_FORBID_CONTENTS&&(V===be&&(V=K(V)),p(V,r.ADD_FORBID_CONTENTS,k)),ye&&(F["#text"]=!0),at&&p(F,["html","head","body"]),F.table&&(p(F,["tbody"]),delete _t.tbody),r.TRUSTED_TYPES_POLICY){if(typeof r.TRUSTED_TYPES_POLICY.createHTML!="function")throw Dt('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof r.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw Dt('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');v=r.TRUSTED_TYPES_POLICY,Ft=v.createHTML("")}else v===void 0&&(v=ao(it,s)),v!==null&&typeof Ft=="string"&&(Ft=v.createHTML(""));z&&z(r),ft=r}},ai=p({},[...Me,...De,...Yr]),si=p({},[...we,...Xr]),fr=function(r){let n=ut(r);(!n||!n.tagName)&&(n={namespaceURI:pt,tagName:"template"});let u=te(r.tagName),y=te(n.tagName);return Se[r.namespaceURI]?r.namespaceURI===Ut?n.namespaceURI===Z?u==="svg":n.namespaceURI===Ht?u==="svg"&&(y==="annotation-xml"||Gt[y]):!!ai[u]:r.namespaceURI===Ht?n.namespaceURI===Z?u==="math":n.namespaceURI===Ut?u==="math"&&$t[y]:!!si[u]:r.namespaceURI===Z?n.namespaceURI===Ut&&!$t[y]||n.namespaceURI===Ht&&!Gt[y]?!1:!si[u]&&(gr[u]||!ai[u]):!!(vt==="application/xhtml+xml"&&Se[r.namespaceURI]):!1},Y=function(r){Ot(e.removed,{element:r});try{ut(r).removeChild(r)}catch(n){Bt(r)}},st=function(r,n){try{Ot(e.removed,{attribute:n.getAttributeNode(r),from:n})}catch(u){Ot(e.removed,{attribute:null,from:n})}if(n.removeAttribute(r),r==="is")if(Ct||Pt)try{Y(n)}catch(u){}else try{n.setAttribute(r,"")}catch(u){}},li=function(r){let n=null,u=null;if(xe)r=""+r;else{let T=Oe(r,/^[\r\n\t ]+/);u=T&&T[0]}vt==="application/xhtml+xml"&&pt===Z&&(r=''+r+"");let y=v?v.createHTML(r):r;if(pt===Z)try{n=new ht().parseFromString(y,vt)}catch(T){}if(!n||!n.documentElement){n=ue.createDocument(pt,"template",null);try{n.documentElement.innerHTML=ke?Ft:y}catch(T){}}let O=n.body||n.documentElement;return r&&u&&O.insertBefore(i.createTextNode(u),O.childNodes[0]||null),pt===Z?ar.call(n,at?"html":"body")[0]:at?n.documentElement:O},ni=function(r){return rr.call(r.ownerDocument||r,r,L.SHOW_ELEMENT|L.SHOW_COMMENT|L.SHOW_TEXT|L.SHOW_PROCESSING_INSTRUCTION|L.SHOW_CDATA_SECTION,null)},Fe=function(r){return r instanceof St&&(typeof r.nodeName!="string"||typeof r.textContent!="string"||typeof r.removeChild!="function"||!(r.attributes instanceof $)||typeof r.removeAttribute!="function"||typeof r.setAttribute!="function"||typeof r.namespaceURI!="string"||typeof r.insertBefore!="function"||typeof r.hasChildNodes!="function")},hi=function(r){return typeof x=="function"&&r instanceof x};function J(m,r,n){Zt(m,u=>{u.call(e,r,n,ft)})}let ci=function(r){let n=null;if(J(w.beforeSanitizeElements,r,null),Fe(r))return Y(r),!0;let u=k(r.nodeName);if(J(w.uponSanitizeElement,r,{tagName:u,allowedTags:F}),Wt&&r.hasChildNodes()&&!hi(r.firstElementChild)&&I(/<[/\w!]/g,r.innerHTML)&&I(/<[/\w!]/g,r.textContent)||r.nodeType===It.progressingInstruction||Wt&&r.nodeType===It.comment&&I(/<[/\w]/g,r.data))return Y(r),!0;if(!(rt.tagCheck instanceof Function&&rt.tagCheck(u))&&(!F[u]||_t[u])){if(!_t[u]&&ui(u)&&(b.tagNameCheck instanceof RegExp&&I(b.tagNameCheck,u)||b.tagNameCheck instanceof Function&&b.tagNameCheck(u)))return!1;if(ye&&!V[u]){let y=ut(r)||r.parentNode,O=de(r)||r.childNodes;if(O&&y){let T=O.length;for(let W=T-1;W>=0;--W){let Q=dt(O[W],!0);Q.__removalCount=(r.__removalCount||0)+1,y.insertBefore(Q,ce(r))}}}return Y(r),!0}return r instanceof _&&!fr(r)||(u==="noscript"||u==="noembed"||u==="noframes")&&I(/<\/no(script|embed|frames)/i,r.innerHTML)?(Y(r),!0):(gt&&r.nodeType===It.text&&(n=r.textContent,Zt([ge,Ce,me],y=>{n=Mt(n,y," ")}),r.textContent!==n&&(Ot(e.removed,{element:r.cloneNode()}),r.textContent=n)),J(w.afterSanitizeElements,r,null),!1)},di=function(r,n,u){if(Rt[n]||Qe&&(n==="id"||n==="name")&&(u in i||u in pr))return!1;if(!(pe&&!Rt[n]&&I(lr,n))){if(!(Ke&&I(nr,n))){if(!(rt.attributeCheck instanceof Function&&rt.attributeCheck(n,r))){if(!A[n]||Rt[n]){if(!(ui(r)&&(b.tagNameCheck instanceof RegExp&&I(b.tagNameCheck,r)||b.tagNameCheck instanceof Function&&b.tagNameCheck(r))&&(b.attributeNameCheck instanceof RegExp&&I(b.attributeNameCheck,n)||b.attributeNameCheck instanceof Function&&b.attributeNameCheck(n,r))||n==="is"&&b.allowCustomizedBuiltInElements&&(b.tagNameCheck instanceof RegExp&&I(b.tagNameCheck,u)||b.tagNameCheck instanceof Function&&b.tagNameCheck(u))))return!1}else if(!Te[n]){if(!I(Ve,Mt(u,je,""))){if(!((n==="src"||n==="xlink:href"||n==="href")&&r!=="script"&&Gr(u,"data:")===0&&ei[r])){if(!(Ze&&!I(hr,Mt(u,je,"")))){if(u)return!1}}}}}}}return!0},ui=function(r){return r!=="annotation-xml"&&Oe(r,cr)},gi=function(r){J(w.beforeSanitizeAttributes,r,null);let{attributes:n}=r;if(!n||Fe(r))return;let u={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:A,forceKeepAttr:void 0},y=n.length;for(;y--;){let O=n[y],{name:T,namespaceURI:W,value:Q}=O,xt=k(T),_e=Q,E=T==="value"?_e:$r(_e);if(u.attrName=xt,u.attrValue=E,u.keepAttr=!0,u.forceKeepAttr=void 0,J(w.uponSanitizeAttribute,r,u),E=u.attrValue,ti&&(xt==="id"||xt==="name")&&(st(T,r),E=dr+E),Wt&&I(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,E)){st(T,r);continue}if(xt==="attributename"&&Oe(E,"href")){st(T,r);continue}if(u.forceKeepAttr)continue;if(!u.keepAttr){st(T,r);continue}if(!Je&&I(/\/>/i,E)){st(T,r);continue}gt&&Zt([ge,Ce,me],mi=>{E=Mt(E,mi," ")});let Ci=k(r.nodeName);if(!di(Ci,xt,E)){st(T,r);continue}if(v&&typeof it=="object"&&typeof it.getAttributeType=="function"&&!W)switch(it.getAttributeType(Ci,xt)){case"TrustedHTML":{E=v.createHTML(E);break}case"TrustedScriptURL":{E=v.createScriptURL(E);break}}if(E!==_e)try{W?r.setAttributeNS(W,T,E):r.setAttribute(T,E),Fe(r)?Y(r):Ai(e.removed)}catch(mi){st(T,r)}}J(w.afterSanitizeAttributes,r,null)},xr=function m(r){let n=null,u=ni(r);for(J(w.beforeSanitizeShadowDOM,r,null);n=u.nextNode();)J(w.uponSanitizeShadowNode,n,null),ci(n),gi(n),n.content instanceof c&&m(n.content);J(w.afterSanitizeShadowDOM,r,null)};return e.sanitize=function(m){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=null,u=null,y=null,O=null;if(ke=!m,ke&&(m=""),typeof m!="string"&&!hi(m))if(typeof m.toString=="function"){if(m=m.toString(),typeof m!="string")throw Dt("dirty is not a string, aborting")}else throw Dt("toString is not a function");if(!e.isSupported)return m;if(fe||Be(r),e.removed=[],typeof m=="string"&&(Lt=!1),Lt){if(m.nodeName){let Q=k(m.nodeName);if(!F[Q]||_t[Q])throw Dt("root node is forbidden and cannot be sanitized in-place")}}else if(m instanceof x)n=li(""),u=n.ownerDocument.importNode(m,!0),u.nodeType===It.element&&u.nodeName==="BODY"||u.nodeName==="HTML"?n=u:n.appendChild(u);else{if(!Ct&&!gt&&!at&&m.indexOf("<")===-1)return v&&Nt?v.createHTML(m):m;if(n=li(m),!n)return Ct?null:Nt?Ft:""}n&&xe&&Y(n.firstChild);let T=ni(Lt?m:n);for(;y=T.nextNode();)ci(y),gi(y),y.content instanceof c&&xr(y.content);if(Lt)return m;if(Ct){if(Pt)for(O=or.call(n.ownerDocument);n.firstChild;)O.appendChild(n.firstChild);else O=n;return(A.shadowroot||A.shadowrootmode)&&(O=sr.call(a,O,!0)),O}let W=at?n.outerHTML:n.innerHTML;return at&&F["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&I(Ri,n.ownerDocument.doctype.name)&&(W=" +`+W),gt&&Zt([ge,Ce,me],Q=>{W=Mt(W,Q," ")}),v&&Nt?v.createHTML(W):W},e.setConfig=function(){let m=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Be(m),fe=!0},e.clearConfig=function(){ft=null,fe=!1},e.isValidAttribute=function(m,r,n){ft||Be({});let u=k(m),y=k(r);return di(u,y,n)},e.addHook=function(m,r){typeof r=="function"&&Ot(w[m],r)},e.removeHook=function(m,r){if(r!==void 0){let n=Hr(w[m],r);return n===-1?void 0:Ur(w[m],n,1)[0]}return Ai(w[m])},e.removeHooks=function(m){w[m]=[]},e.removeAllHooks=function(){w=Ii()},e}var bt=Wi();var so=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s,lo=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,no=/\s*%%.*\n/gm,ho=class extends Error{static{l(this,"UnknownDiagramError")}constructor(t){super(t),this.name="UnknownDiagramError"}},re={},Os=l(function(t,e){t=t.replace(so,"").replace(lo,"").replace(no,` +`);for(let[i,{detector:a}]of Object.entries(re))if(a(t,e))return i;throw new ho(`No diagram type detected matching given configuration for text: ${t}`)},"detectType"),Ms=l((...t)=>{for(let{id:e,detector:i,loader:a}of t)$i(e,i,a)},"registerLazyLoadedDiagrams"),$i=l((t,e,i)=>{re[t]&&M.warn(`Detector with key ${t} already exists. Overwriting.`),re[t]={detector:e,loader:i},M.debug(`Detector with key ${t} added${i?" with loader":""}`)},"addDetector"),Ds=l(t=>re[t].loader,"getDiagramLoader"),Re=l((t,e,{depth:i=2,clobber:a=!1}={})=>{let s={depth:i,clobber:a};return Array.isArray(e)&&!Array.isArray(t)?(e.forEach(c=>Re(t,c,s)),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach(c=>{t.includes(c)||t.push(c)}),t):t===void 0||i<=0?t!=null&&typeof t=="object"&&typeof e=="object"?Object.assign(t,e):e:(e!==void 0&&typeof t=="object"&&typeof e=="object"&&Object.keys(e).forEach(c=>{typeof e[c]=="object"&&e[c]!==null&&(t[c]===void 0||typeof t[c]=="object")?(t[c]===void 0&&(t[c]=Array.isArray(e[c])?[]:{}),t[c]=Re(t[c],e[c],{depth:i-1,clobber:a})):(a||typeof t[c]!="object"&&typeof e[c]!="object")&&(t[c]=e[c])}),t)},"assignWithDepth"),D=Re,se="#ffffff",le="#f2f2f2",R=l((t,e)=>e?o(t,{s:-40,l:10}):o(t,{s:-40,l:-10}),"mkBorder"),co=class{static{l(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||o(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||o(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||R(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||R(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||R(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||R(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||h(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||h(this.tertiaryColor),this.lineColor=this.lineColor||h(this.background),this.arrowheadColor=this.arrowheadColor||h(this.background),this.textColor=this.textColor||this.primaryTextColor,this.border2=this.border2||this.tertiaryBorderColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?g(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||this.actorBorder,this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||g(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||h(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||d(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.vertLineColor=this.vertLineColor||"navy",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.darkMode?(this.rowOdd=this.rowOdd||g(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||g(this.mainBkg,10)):(this.rowOdd=this.rowOdd||d(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||d(this.mainBkg,5)),this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||o(this.primaryColor,{h:30}),this.cScale4=this.cScale4||o(this.primaryColor,{h:60}),this.cScale5=this.cScale5||o(this.primaryColor,{h:90}),this.cScale6=this.cScale6||o(this.primaryColor,{h:120}),this.cScale7=this.cScale7||o(this.primaryColor,{h:150}),this.cScale8=this.cScale8||o(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||o(this.primaryColor,{h:270}),this.cScale10=this.cScale10||o(this.primaryColor,{h:300}),this.cScale11=this.cScale11||o(this.primaryColor,{h:330}),this.darkMode)for(let e=0;e{this[i]=t[i]}),this.updateColors(),e.forEach(i=>{this[i]=t[i]})}},uo=l(t=>{let e=new co;return e.calculate(t),e},"getThemeVariables"),go=class{static{l(this,"Theme")}constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=d(this.primaryColor,16),this.tertiaryColor=o(this.primaryColor,{h:-160}),this.primaryBorderColor=h(this.background),this.secondaryBorderColor=R(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=R(this.tertiaryColor,this.darkMode),this.primaryTextColor=h(this.primaryColor),this.secondaryTextColor=h(this.secondaryColor),this.tertiaryTextColor=h(this.tertiaryColor),this.lineColor=h(this.background),this.textColor=h(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=d(h("#323D47"),10),this.lineColor="calculated",this.border1="#ccc",this.border2=et(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=g("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.excludeBkgColor=g(this.sectionBkgColor,10),this.taskBorderColor=et(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=et(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||d(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||g(this.mainBkg,10),this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=d(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=d(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.actorBorder,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=d(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=h(this.doneTaskBkgColor),this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=o(this.primaryColor,{h:64}),this.fillType3=o(this.secondaryColor,{h:64}),this.fillType4=o(this.primaryColor,{h:-64}),this.fillType5=o(this.secondaryColor,{h:-64}),this.fillType6=o(this.primaryColor,{h:128}),this.fillType7=o(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||o(this.primaryColor,{h:30}),this.cScale4=this.cScale4||o(this.primaryColor,{h:60}),this.cScale5=this.cScale5||o(this.primaryColor,{h:90}),this.cScale6=this.cScale6||o(this.primaryColor,{h:120}),this.cScale7=this.cScale7||o(this.primaryColor,{h:150}),this.cScale8=this.cScale8||o(this.primaryColor,{h:210}),this.cScale9=this.cScale9||o(this.primaryColor,{h:270}),this.cScale10=this.cScale10||o(this.primaryColor,{h:300}),this.cScale11=this.cScale11||o(this.primaryColor,{h:330});for(let t=0;t{this[i]=t[i]}),this.updateColors(),e.forEach(i=>{this[i]=t[i]})}},Co=l(t=>{let e=new go;return e.calculate(t),e},"getThemeVariables"),mo=class{static{l(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=o(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=o(this.primaryColor,{h:-160}),this.primaryBorderColor=R(this.primaryColor,this.darkMode),this.secondaryBorderColor=R(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=R(this.tertiaryColor,this.darkMode),this.primaryTextColor=h(this.primaryColor),this.secondaryTextColor=h(this.secondaryColor),this.tertiaryTextColor=h(this.tertiaryColor),this.lineColor=h(this.background),this.textColor=h(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="rgba(232,232,232, 0.8)",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.sectionBkgColor=et(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="navy",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd="calculated",this.rowEven="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||o(this.primaryColor,{h:30}),this.cScale4=this.cScale4||o(this.primaryColor,{h:60}),this.cScale5=this.cScale5||o(this.primaryColor,{h:90}),this.cScale6=this.cScale6||o(this.primaryColor,{h:120}),this.cScale7=this.cScale7||o(this.primaryColor,{h:150}),this.cScale8=this.cScale8||o(this.primaryColor,{h:210}),this.cScale9=this.cScale9||o(this.primaryColor,{h:270}),this.cScale10=this.cScale10||o(this.primaryColor,{h:300}),this.cScale11=this.cScale11||o(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||g(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||g(this.tertiaryColor,40);for(let t=0;t{this[i]==="calculated"&&(this[i]=void 0)}),typeof t!="object"){this.updateColors();return}let e=Object.keys(t);e.forEach(i=>{this[i]=t[i]}),this.updateColors(),e.forEach(i=>{this[i]=t[i]})}},po=l(t=>{let e=new mo;return e.calculate(t),e},"getThemeVariables"),fo=class{static{l(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=d("#cde498",10),this.primaryBorderColor=R(this.primaryColor,this.darkMode),this.secondaryBorderColor=R(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=R(this.tertiaryColor,this.darkMode),this.primaryTextColor=h(this.primaryColor),this.secondaryTextColor=h(this.secondaryColor),this.tertiaryTextColor=h(this.primaryColor),this.lineColor=h(this.background),this.textColor=h(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.actorBorder=g(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.actorLineColor=this.actorBorder,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||o(this.primaryColor,{h:30}),this.cScale4=this.cScale4||o(this.primaryColor,{h:60}),this.cScale5=this.cScale5||o(this.primaryColor,{h:90}),this.cScale6=this.cScale6||o(this.primaryColor,{h:120}),this.cScale7=this.cScale7||o(this.primaryColor,{h:150}),this.cScale8=this.cScale8||o(this.primaryColor,{h:210}),this.cScale9=this.cScale9||o(this.primaryColor,{h:270}),this.cScale10=this.cScale10||o(this.primaryColor,{h:300}),this.cScale11=this.cScale11||o(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||g(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||g(this.tertiaryColor,40);for(let t=0;t{this[i]=t[i]}),this.updateColors(),e.forEach(i=>{this[i]=t[i]})}},xo=l(t=>{let e=new fo;return e.calculate(t),e},"getThemeVariables"),yo=class{static{l(this,"Theme")}constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=d(this.contrast,55),this.background="#ffffff",this.tertiaryColor=o(this.primaryColor,{h:-160}),this.primaryBorderColor=R(this.primaryColor,this.darkMode),this.secondaryBorderColor=R(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=R(this.tertiaryColor,this.darkMode),this.primaryTextColor=h(this.primaryColor),this.secondaryTextColor=h(this.secondaryColor),this.tertiaryTextColor=h(this.tertiaryColor),this.lineColor=h(this.background),this.textColor=h(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor=this.actorBorder,this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||d(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||"#f4f4f4",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=d(this.contrast,55),this.border2=this.contrast,this.actorBorder=d(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.actorBorder,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let t=0;t{this[i]=t[i]}),this.updateColors(),e.forEach(i=>{this[i]=t[i]})}},bo=l(t=>{let e=new yo;return e.calculate(t),e},"getThemeVariables"),Tt={base:{getThemeVariables:uo},dark:{getThemeVariables:Co},default:{getThemeVariables:po},forest:{getThemeVariables:xo},neutral:{getThemeVariables:bo}},G={flowchart:{useMaxWidth:!0,titleTopMargin:25,subGraphTitleMargin:{top:0,bottom:0},diagramPadding:8,htmlLabels:null,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,defaultRenderer:"dagre-wrapper",wrappingWidth:200,inheritDir:!1},sequence:{useMaxWidth:!0,hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20},gantt:{useMaxWidth:!0,titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",topAxis:!1,displayMode:"",weekday:"sunday"},journey:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,maxLabelWidth:360,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],titleColor:"",titleFontFamily:'"trebuchet ms", verdana, arial, sans-serif',titleFontSize:"4ex"},class:{useMaxWidth:!0,titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,defaultRenderer:"dagre-wrapper",htmlLabels:!1,hideEmptyMembersBox:!1},state:{useMaxWidth:!0,titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,defaultRenderer:"dagre-wrapper"},er:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,nodeSpacing:140,rankSpacing:80,stroke:"gray",fill:"honeydew",fontSize:12},pie:{useMaxWidth:!0,textPosition:.75},quadrantChart:{useMaxWidth:!0,chartWidth:500,chartHeight:500,titleFontSize:20,titlePadding:10,quadrantPadding:5,xAxisLabelPadding:5,yAxisLabelPadding:5,xAxisLabelFontSize:16,yAxisLabelFontSize:16,quadrantLabelFontSize:16,quadrantTextTopPadding:5,pointTextPadding:5,pointLabelFontSize:12,pointRadius:5,xAxisPosition:"top",yAxisPosition:"left",quadrantInternalBorderStrokeWidth:1,quadrantExternalBorderStrokeWidth:2},xyChart:{useMaxWidth:!0,width:700,height:500,titleFontSize:20,titlePadding:10,showDataLabel:!1,showTitle:!0,xAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},yAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},chartOrientation:"vertical",plotReservedSpacePercent:50},requirement:{useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200,layoutAlgorithm:"cose-bilkent"},ishikawa:{useMaxWidth:!0,diagramPadding:20},kanban:{useMaxWidth:!0,padding:8,sectionWidth:200,ticketBaseUrl:""},timeline:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},gitGraph:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0,parallelCommits:!1,arrowMarkerAbsolute:!1},c4:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},sankey:{useMaxWidth:!0,width:600,height:400,linkColor:"gradient",nodeAlignment:"justify",showValues:!0,prefix:"",suffix:""},block:{useMaxWidth:!0,padding:8},packet:{useMaxWidth:!0,rowHeight:32,bitWidth:32,bitsPerRow:32,showBits:!0,paddingX:5,paddingY:5},architecture:{useMaxWidth:!0,padding:40,iconSize:80,fontSize:16},radar:{useMaxWidth:!0,width:600,height:600,marginTop:50,marginRight:50,marginBottom:50,marginLeft:50,axisScaleFactor:1,axisLabelFactor:1.05,curveTension:.17},venn:{useMaxWidth:!0,width:800,height:450,padding:8,useDebugLayout:!1},theme:"default",look:"classic",handDrawnSeed:0,layout:"dagre",maxTextSize:5e4,maxEdges:500,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize","suppressErrorRendering","maxEdges"],legacyMathML:!1,forceLegacyMathML:!1,deterministicIds:!1,fontSize:16,markdownAutoWrap:!0,suppressErrorRendering:!1},ji=X(P({},G),{deterministicIDSeed:void 0,elk:{mergeEdges:!1,nodePlacementStrategy:"BRANDES_KOEPF",forceNodeModelOrder:!1,considerModelOrder:"NODES_AND_EDGES"},themeCSS:void 0,themeVariables:Tt.default.getThemeVariables(),sequence:X(P({},G.sequence),{messageFont:l(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont"),noteFont:l(function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},"noteFont"),actorFont:l(function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}},"actorFont")}),class:{hideEmptyMembersBox:!1},gantt:X(P({},G.gantt),{tickInterval:void 0,useWidth:void 0}),c4:X(P({},G.c4),{useWidth:void 0,personFont:l(function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},"personFont"),flowchart:X(P({},G.flowchart),{inheritDir:!1}),external_personFont:l(function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},"external_personFont"),systemFont:l(function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},"systemFont"),external_systemFont:l(function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},"external_systemFont"),system_dbFont:l(function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},"system_dbFont"),external_system_dbFont:l(function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},"external_system_dbFont"),system_queueFont:l(function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},"system_queueFont"),external_system_queueFont:l(function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},"external_system_queueFont"),containerFont:l(function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},"containerFont"),external_containerFont:l(function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},"external_containerFont"),container_dbFont:l(function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},"container_dbFont"),external_container_dbFont:l(function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},"external_container_dbFont"),container_queueFont:l(function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},"container_queueFont"),external_container_queueFont:l(function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},"external_container_queueFont"),componentFont:l(function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},"componentFont"),external_componentFont:l(function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},"external_componentFont"),component_dbFont:l(function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},"component_dbFont"),external_component_dbFont:l(function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},"external_component_dbFont"),component_queueFont:l(function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},"component_queueFont"),external_component_queueFont:l(function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},"external_component_queueFont"),boundaryFont:l(function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},"boundaryFont"),messageFont:l(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont")}),pie:X(P({},G.pie),{useWidth:984}),xyChart:X(P({},G.xyChart),{useWidth:void 0}),requirement:X(P({},G.requirement),{useWidth:void 0}),packet:P({},G.packet),radar:P({},G.radar),ishikawa:P({},G.ishikawa),treemap:{useMaxWidth:!0,padding:10,diagramPadding:8,showValues:!0,nodeWidth:100,nodeHeight:40,borderWidth:1,valueFontSize:12,labelFontSize:14,valueFormat:","},venn:P({},G.venn)}),Vi=l((t,e="")=>Object.keys(t).reduce((i,a)=>Array.isArray(t[a])?i:typeof t[a]=="object"&&t[a]!==null?[...i,e+a,...Vi(t[a],"")]:[...i,e+a],[]),"keyify"),To=new Set(Vi(ji,"")),ko=ji,We=l(t=>{if(M.debug("sanitizeDirective called with",t),!(typeof t!="object"||t==null)){if(Array.isArray(t)){t.forEach(e=>We(e));return}for(let e of Object.keys(t)){if(M.debug("Checking key",e),e.startsWith("__")||e.includes("proto")||e.includes("constr")||!To.has(e)||t[e]==null){M.debug("sanitize deleting key: ",e),delete t[e];continue}if(typeof t[e]=="object"){M.debug("sanitizing object",e),We(t[e]);continue}let i=["themeCSS","fontFamily","altFontFamily"];for(let a of i)e.includes(a)&&(M.debug("sanitizing css option",e),t[e]=So(t[e]))}if(t.themeVariables)for(let e of Object.keys(t.themeVariables)){let i=t.themeVariables[e];i?.match&&!i.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[e]="")}M.debug("After sanitization",t)}},"sanitizeDirective"),So=l(t=>{let e=0,i=0;for(let a of t){if(e!(t===!1||["false","null","0"].includes(String(t).trim().toLowerCase())),"evaluate"),N=D({},ne),oe,nt=[],zt=D({},ne),he=l((t,e)=>{let i=D({},t),a={};for(let s of e)Xi(s),a=D(a,s);if(i=D(i,a),a.theme&&a.theme in Tt){let s=D({},oe),c=D(s.themeVariables||{},a.themeVariables);i.theme&&i.theme in Tt&&(i.themeVariables=Tt[i.theme].getThemeVariables(c))}return zt=i,Zi(zt),zt},"updateCurrentConfig"),Ps=l(t=>(N=D({},ne),N=D(N,t),t.theme&&Tt[t.theme]&&(N.themeVariables=Tt[t.theme].getThemeVariables(t.themeVariables)),he(N,nt),N),"setSiteConfig"),Ns=l(t=>{oe=D({},t)},"saveConfigFromInitialize"),Hs=l(t=>(N=D(N,t),he(N,nt),N),"updateSiteConfig"),Us=l(()=>D({},N),"getSiteConfig"),Bo=l(t=>(Zi(t),D(zt,t),Ne()),"setConfig"),Ne=l(()=>D({},zt),"getConfig"),Xi=l(t=>{t&&(["secure",...N.secure??[]].forEach(e=>{Object.hasOwn(t,e)&&(M.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])}),Object.keys(t).forEach(e=>{e.startsWith("__")&&delete t[e]}),Object.keys(t).forEach(e=>{typeof t[e]=="string"&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],typeof t[e]=="object"&&Xi(t[e])}))},"sanitize"),Gs=l(t=>{We(t),t.fontFamily&&!t.themeVariables?.fontFamily&&(t.themeVariables=X(P({},t.themeVariables),{fontFamily:t.fontFamily})),nt.push(t),he(N,nt)},"addDirective"),$s=l((t=N)=>{nt=[],he(t,nt)},"reset"),Fo={LAZY_LOAD_DEPRECATED:"The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead.",FLOWCHART_HTML_LABELS_DEPRECATED:"flowchart.htmlLabels is deprecated. Please use global htmlLabels instead."},Pi={},Ki=l(t=>{Pi[t]||(M.warn(Fo[t]),Pi[t]=!0)},"issueWarning"),Zi=l(t=>{t&&(t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&Ki("LAZY_LOAD_DEPRECATED")},"checkConfig"),js=l(()=>{let t={};oe&&(t=D(t,oe));for(let e of nt)t=D(t,e);return t},"getUserDefinedConfig"),_o=l(t=>(t.flowchart?.htmlLabels!=null&&Ki("FLOWCHART_HTML_LABELS_DEPRECATED"),Yi(t.htmlLabels??t.flowchart?.htmlLabels??!0)),"getEffectiveHtmlLabels"),qt=//gi,Lo=l(t=>t?tr(t).replace(/\\n/g,"#br#").split("#br#"):[""],"getRows"),vo=(()=>{let t=!1;return()=>{t||(Ji(),t=!0)}})();function Ji(){let t="data-temp-href-target";bt.addHook("beforeSanitizeAttributes",e=>{e.tagName==="A"&&e.hasAttribute("target")&&e.setAttribute(t,e.getAttribute("target")??"")}),bt.addHook("afterSanitizeAttributes",e=>{e.tagName==="A"&&e.hasAttribute(t)&&(e.setAttribute("target",e.getAttribute(t)??""),e.removeAttribute(t),e.getAttribute("target")==="_blank"&&e.setAttribute("rel","noopener"))})}l(Ji,"setupDompurifyHooks");var Qi=l(t=>(vo(),bt.sanitize(t)),"removeScript"),Ni=l((t,e)=>{if(_o(e)){let i=e.securityLevel;i==="antiscript"||i==="strict"||i==="sandbox"?t=Qi(t):i!=="loose"&&(t=tr(t),t=t.replace(//g,">"),t=t.replace(/=/g,"="),t=Mo(t))}return t},"sanitizeMore"),kt=l((t,e)=>t&&(e.dompurifyConfig?t=bt.sanitize(Ni(t,e),e.dompurifyConfig).toString():t=bt.sanitize(Ni(t,e),{FORBID_TAGS:["style"]}).toString(),t),"sanitizeText"),Ao=l((t,e)=>typeof t=="string"?kt(t,e):t.flat().map(i=>kt(i,e)),"sanitizeTextOrArray"),Eo=l(t=>qt.test(t),"hasBreaks"),Oo=l(t=>t.split(qt),"splitBreaks"),Mo=l(t=>t.replace(/#br#/g,"
        "),"placeholderToBreak"),tr=l(t=>t.replace(qt,"#br#"),"breakToPlaceholder"),Do=l(t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=CSS.escape(e)),e},"getUrl"),wo=l(function(...t){let e=t.filter(i=>!isNaN(i));return Math.max(...e)},"getMax"),Io=l(function(...t){let e=t.filter(i=>!isNaN(i));return Math.min(...e)},"getMin"),Ys=l(function(t){let e=t.split(/(,)/),i=[];for(let a=0;a0&&a+1Math.max(0,t.split(e).length-1),"countOccurrence"),zo=l((t,e)=>{let i=Pe(t,"~"),a=Pe(e,"~");return i===1&&a===1},"shouldCombineSets"),qo=l(t=>{let e=Pe(t,"~"),i=!1;if(e<=1)return t;e%2!==0&&t.startsWith("~")&&(t=t.substring(1),i=!0);let a=[...t],s=a.indexOf("~"),c=a.lastIndexOf("~");for(;s!==-1&&c!==-1&&s!==c;)a[s]="<",a[c]=">",s=a.indexOf("~"),c=a.lastIndexOf("~");return i&&a.unshift("~"),a.join("")},"processSet"),Hi=l(()=>window.MathMLElement!==void 0,"isMathMLSupported"),ee=/\$\$(.*)\$\$/g,Ui=l(t=>(t.match(ee)?.length??0)>0,"hasKatex"),Xs=l((t,e)=>jt(null,null,function*(){let i=document.createElement("div");i.innerHTML=yield Wo(t,e),i.id="katex-temp",i.style.visibility="hidden",i.style.position="absolute",i.style.top="0",document.querySelector("body")?.insertAdjacentElement("beforeend",i);let s={width:i.clientWidth,height:i.clientHeight};return i.remove(),s}),"calculateMathMLDimensions"),Ro=l((t,e)=>jt(null,null,function*(){if(!Ui(t))return t;if(!(Hi()||e.legacyMathML||e.forceLegacyMathML))return t.replace(ee,"MathML is unsupported in this environment.");{let{default:i}=yield import("./chunk-27SWUPRL.js"),a=e.forceLegacyMathML||!Hi()&&e.legacyMathML?"htmlAndMathml":"mathml";return t.split(qt).map(s=>Ui(s)?`
        ${s}
        `:`
        ${s}
        `).join("").replace(ee,(s,c)=>i.renderToString(c,{throwOnError:!0,displayMode:!0,output:a}).replace(/\n/g," ").replace(//g,""))}return t.replace(ee,"Katex is not supported in @mermaid-js/tiny. Please use the full mermaid library.")}),"renderKatexUnsanitized"),Wo=l((t,e)=>jt(null,null,function*(){return kt(yield Ro(t,e),e)}),"renderKatexSanitized"),Ks={getRows:Lo,sanitizeText:kt,sanitizeTextOrArray:Ao,hasBreaks:Eo,splitBreaks:Oo,lineBreakRegex:qt,removeScript:Qi,getUrl:Do,evaluate:Yi,getMax:wo,getMin:Io},Po=l(function(t,e){for(let i of e)t.attr(i[0],i[1])},"d3Attrs"),No=l(function(t,e,i){let a=new Map;return i?(a.set("width","100%"),a.set("style",`max-width: ${e}px;`)):(a.set("height",t),a.set("width",e)),a},"calculateSvgSizeAttrs"),Ho=l(function(t,e,i,a){let s=No(e,i,a);Po(t,s)},"configureSvgSize"),Uo=l(function(t,e,i,a){let s=e.node().getBBox(),c=s.width,f=s.height;M.info(`SVG bounds: ${c}x${f}`,s);let x=0,_=0;M.info(`Graph bounds: ${x}x${_}`,t),x=c+i*2,_=f+i*2,M.info(`Calculated bounds: ${x}x${_}`),Ho(e,_,x,a);let L=`${s.x-i} ${s.y-i} ${s.width+2*i} ${s.height+2*i}`;e.attr("viewBox",L)},"setupGraphViewbox"),ie={},Go=l((t,e,i)=>{let a="";return t in ie&&ie[t]?a=ie[t](i):M.warn(`No theme found for ${t}`),` & { + font-family: ${i.fontFamily}; + font-size: ${i.fontSize}; + fill: ${i.textColor} + } + @keyframes edge-animation-frame { + from { + stroke-dashoffset: 0; + } + } + @keyframes dash { + to { + stroke-dashoffset: 0; + } + } + & .edge-animation-slow { + stroke-dasharray: 9,5 !important; + stroke-dashoffset: 900; + animation: dash 50s linear infinite; + stroke-linecap: round; + } + & .edge-animation-fast { + stroke-dasharray: 9,5 !important; + stroke-dashoffset: 900; + animation: dash 20s linear infinite; + stroke-linecap: round; + } + /* Classes common for multiple diagrams */ + + & .error-icon { + fill: ${i.errorBkgColor}; + } + & .error-text { + fill: ${i.errorTextColor}; + stroke: ${i.errorTextColor}; + } + + & .edge-thickness-normal { + stroke-width: 1px; + } + & .edge-thickness-thick { + stroke-width: 3.5px + } + & .edge-pattern-solid { + stroke-dasharray: 0; + } + & .edge-thickness-invisible { + stroke-width: 0; + fill: none; + } + & .edge-pattern-dashed{ + stroke-dasharray: 3; + } + .edge-pattern-dotted { + stroke-dasharray: 2; + } + + & .marker { + fill: ${i.lineColor}; + stroke: ${i.lineColor}; + } + & .marker.cross { + stroke: ${i.lineColor}; + } + + & svg { + font-family: ${i.fontFamily}; + font-size: ${i.fontSize}; + } + & p { + margin: 0 + } + + ${a} + + ${e} +`},"getStyles"),$o=l((t,e)=>{e!==void 0&&(ie[t]=e)},"addStylesForDiagram"),Zs=Go,er={};pi(er,{clear:()=>jo,getAccDescription:()=>Ko,getAccTitle:()=>Yo,getDiagramTitle:()=>Jo,setAccDescription:()=>Xo,setAccTitle:()=>Vo,setDiagramTitle:()=>Zo});var He="",Ue="",Ge="",$e=l(t=>kt(t,Ne()),"sanitizeText"),jo=l(()=>{He="",Ge="",Ue=""},"clear"),Vo=l(t=>{He=$e(t).replace(/^\s+/g,"")},"setAccTitle"),Yo=l(()=>He,"getAccTitle"),Xo=l(t=>{Ge=$e(t).replace(/\n\s+/g,` +`)},"setAccDescription"),Ko=l(()=>Ge,"getAccDescription"),Zo=l(t=>{Ue=$e(t)},"setDiagramTitle"),Jo=l(()=>Ue,"getDiagramTitle"),Gi=M,Qo=fi,ir=Ne,Js=Bo,Qs=ne,ta=l(t=>kt(t,ir()),"sanitizeText"),ea=Uo,ia=l(()=>er,"getCommonDb"),ae={},tl=l((t,e,i)=>{ae[t]&&Gi.warn(`Diagram with id ${t} already registered. Overwriting.`),ae[t]=e,i&&$i(t,i),$o(t,e.styles),e.injectUtils?.(Gi,Qo,ir,ta,ea,ia(),()=>{})},"registerDiagram"),el=l(t=>{if(t in ae)return ae[t];throw new ra(t)},"getDiagram"),ra=class extends Error{static{l(this,"DiagramNotFoundError")}constructor(t){super(`Diagram ${t} not found.`)}};export{et as a,Lr as b,j as c,d,g as e,Ir as f,bt as g,so as h,lo as i,ho as j,re as k,Os as l,Ms as m,Ds as n,D as o,po as p,Tt as q,ko as r,We as s,ne as t,Yi as u,Ps as v,Ns as w,Hs as x,Us as y,Bo as z,Ne as A,Gs as B,$s as C,js as D,_o as E,qt as F,kt as G,Do as H,Ys as I,Ui as J,Xs as K,Wo as L,Ks as M,Ho as N,Uo as O,Zs as P,er as Q,jo as R,Vo as S,Yo as T,Xo as U,Ko as V,Zo as W,Jo as X,ir as Y,Js as Z,Qs as _,ta as $,ea as aa,tl as ba,el as ca}; diff --git a/src/google/adk/cli/browser/chunk-QGHEW6NO.js b/src/google/adk/cli/browser/chunk-QGHEW6NO.js new file mode 100644 index 0000000000..0ee96c53ab --- /dev/null +++ b/src/google/adk/cli/browser/chunk-QGHEW6NO.js @@ -0,0 +1,70 @@ +import{a as je}from"./chunk-APNCZOFE.js";import{a as We}from"./chunk-ST54LLJ3.js";import{b as Ue,c as Ze}from"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import{m as Ge,p as Ke}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{R as Ve,S as Me,T as Be,U as Fe,V as Ye,W as Pe,X as ze,Y as j,a as Le,b as we}from"./chunk-QFMJV7VH.js";import{a as ve,g as l,h as De,i as v}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{j as Ce}from"./chunk-RMXJBC7V.js";var ye=(function(){var t=l(function(A,a,n,c){for(n=n||{},c=A.length;c--;n[A[c]]=a);return n},"o"),i=[6,8,10,22,24,26,28,33,34,35,36,37,40,43,44,48,50,51,52],d=[1,10],o=[1,11],h=[1,12],b=[1,13],R=[1,23],k=[1,24],_=[1,25],w=[1,26],W=[1,27],E=[1,19],ie=[1,28],Q=[1,29],S=[1,20],I=[1,18],V=[1,21],M=[1,22],re=[1,36],ae=[1,37],ne=[1,38],ce=[1,39],oe=[1,40],B=[6,8,10,13,15,17,20,21,22,24,26,28,33,34,35,36,37,40,43,44,48,50,51,52,65,66,67,68,69],T=[1,45],O=[1,46],F=[1,55],Y=[40,48,50,51,52,70,71],P=[1,66],z=[1,64],N=[1,61],G=[1,65],K=[1,67],X=[6,8,10,13,17,22,24,26,28,33,34,35,36,37,40,41,42,43,44,48,49,50,51,52,65,66,67,68,69],ke=[65,66,67,68,69],ge=[1,84],_e=[1,83],me=[1,81],Ee=[1,82],Se=[6,10,42,47],D=[6,10,13,41,42,47,48,49],q=[1,92],H=[1,91],J=[1,90],U=[19,58],Te=[1,101],Oe=[1,100],le=[19,58,60,62],he={trace:l(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,entityName:11,relSpec:12,COLON:13,role:14,STYLE_SEPARATOR:15,idList:16,BLOCK_START:17,attributes:18,BLOCK_STOP:19,SQS:20,SQE:21,title:22,title_value:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,direction:29,classDefStatement:30,classStatement:31,styleStatement:32,direction_tb:33,direction_bt:34,direction_rl:35,direction_lr:36,CLASSDEF:37,stylesOpt:38,separator:39,UNICODE_TEXT:40,STYLE_TEXT:41,COMMA:42,CLASS:43,STYLE:44,style:45,styleComponent:46,SEMI:47,NUM:48,BRKT:49,ENTITY_NAME:50,DECIMAL_NUM:51,ENTITY_ONE:52,attribute:53,attributeType:54,attributeName:55,attributeKeyTypeList:56,attributeComment:57,ATTRIBUTE_WORD:58,attributeKeyType:59,",":60,ATTRIBUTE_KEY:61,COMMENT:62,cardinality:63,relType:64,ZERO_OR_ONE:65,ZERO_OR_MORE:66,ONE_OR_MORE:67,ONLY_ONE:68,MD_PARENT:69,NON_IDENTIFYING:70,IDENTIFYING:71,WORD:72,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",8:"SPACE",10:"NEWLINE",13:"COLON",15:"STYLE_SEPARATOR",17:"BLOCK_START",19:"BLOCK_STOP",20:"SQS",21:"SQE",22:"title",23:"title_value",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"direction_tb",34:"direction_bt",35:"direction_rl",36:"direction_lr",37:"CLASSDEF",40:"UNICODE_TEXT",41:"STYLE_TEXT",42:"COMMA",43:"CLASS",44:"STYLE",47:"SEMI",48:"NUM",49:"BRKT",50:"ENTITY_NAME",51:"DECIMAL_NUM",52:"ENTITY_ONE",58:"ATTRIBUTE_WORD",60:",",61:"ATTRIBUTE_KEY",62:"COMMENT",65:"ZERO_OR_ONE",66:"ZERO_OR_MORE",67:"ONE_OR_MORE",68:"ONLY_ONE",69:"MD_PARENT",70:"NON_IDENTIFYING",71:"IDENTIFYING",72:"WORD"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,9],[9,7],[9,7],[9,4],[9,6],[9,3],[9,5],[9,1],[9,3],[9,7],[9,9],[9,6],[9,8],[9,4],[9,6],[9,2],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[9,1],[29,1],[29,1],[29,1],[29,1],[30,4],[16,1],[16,1],[16,3],[16,3],[31,3],[32,4],[38,1],[38,3],[45,1],[45,2],[39,1],[39,1],[39,1],[46,1],[46,1],[46,1],[46,1],[11,1],[11,1],[11,1],[11,1],[11,1],[18,1],[18,2],[53,2],[53,3],[53,3],[53,4],[54,1],[55,1],[56,1],[56,3],[59,1],[57,1],[12,3],[63,1],[63,1],[63,1],[63,1],[63,1],[64,1],[64,1],[14,1],[14,1],[14,1]],performAction:l(function(a,n,c,r,u,e,Z){var s=e.length-1;switch(u){case 1:break;case 2:this.$=[];break;case 3:e[s-1].push(e[s]),this.$=e[s-1];break;case 4:case 5:this.$=e[s];break;case 6:case 7:this.$=[];break;case 8:r.addEntity(e[s-4]),r.addEntity(e[s-2]),r.addRelationship(e[s-4],e[s],e[s-2],e[s-3]);break;case 9:r.addEntity(e[s-8]),r.addEntity(e[s-4]),r.addRelationship(e[s-8],e[s],e[s-4],e[s-5]),r.setClass([e[s-8]],e[s-6]),r.setClass([e[s-4]],e[s-2]);break;case 10:r.addEntity(e[s-6]),r.addEntity(e[s-2]),r.addRelationship(e[s-6],e[s],e[s-2],e[s-3]),r.setClass([e[s-6]],e[s-4]);break;case 11:r.addEntity(e[s-6]),r.addEntity(e[s-4]),r.addRelationship(e[s-6],e[s],e[s-4],e[s-5]),r.setClass([e[s-4]],e[s-2]);break;case 12:r.addEntity(e[s-3]),r.addAttributes(e[s-3],e[s-1]);break;case 13:r.addEntity(e[s-5]),r.addAttributes(e[s-5],e[s-1]),r.setClass([e[s-5]],e[s-3]);break;case 14:r.addEntity(e[s-2]);break;case 15:r.addEntity(e[s-4]),r.setClass([e[s-4]],e[s-2]);break;case 16:r.addEntity(e[s]);break;case 17:r.addEntity(e[s-2]),r.setClass([e[s-2]],e[s]);break;case 18:r.addEntity(e[s-6],e[s-4]),r.addAttributes(e[s-6],e[s-1]);break;case 19:r.addEntity(e[s-8],e[s-6]),r.addAttributes(e[s-8],e[s-1]),r.setClass([e[s-8]],e[s-3]);break;case 20:r.addEntity(e[s-5],e[s-3]);break;case 21:r.addEntity(e[s-7],e[s-5]),r.setClass([e[s-7]],e[s-2]);break;case 22:r.addEntity(e[s-3],e[s-1]);break;case 23:r.addEntity(e[s-5],e[s-3]),r.setClass([e[s-5]],e[s]);break;case 24:case 25:this.$=e[s].trim(),r.setAccTitle(this.$);break;case 26:case 27:this.$=e[s].trim(),r.setAccDescription(this.$);break;case 32:r.setDirection("TB");break;case 33:r.setDirection("BT");break;case 34:r.setDirection("RL");break;case 35:r.setDirection("LR");break;case 36:this.$=e[s-3],r.addClass(e[s-2],e[s-1]);break;case 37:case 38:case 59:case 67:this.$=[e[s]];break;case 39:case 40:this.$=e[s-2].concat([e[s]]);break;case 41:this.$=e[s-2],r.setClass(e[s-1],e[s]);break;case 42:this.$=e[s-3],r.addCssStyles(e[s-2],e[s-1]);break;case 43:this.$=[e[s]];break;case 44:e[s-2].push(e[s]),this.$=e[s-2];break;case 46:this.$=e[s-1]+e[s];break;case 54:case 79:case 80:this.$=e[s].replace(/"/g,"");break;case 55:case 56:case 57:case 58:case 81:this.$=e[s];break;case 60:e[s].push(e[s-1]),this.$=e[s];break;case 61:this.$={type:e[s-1],name:e[s]};break;case 62:this.$={type:e[s-2],name:e[s-1],keys:e[s]};break;case 63:this.$={type:e[s-2],name:e[s-1],comment:e[s]};break;case 64:this.$={type:e[s-3],name:e[s-2],keys:e[s-1],comment:e[s]};break;case 65:case 66:case 69:this.$=e[s];break;case 68:e[s-2].push(e[s]),this.$=e[s-2];break;case 70:this.$=e[s].replace(/"/g,"");break;case 71:this.$={cardA:e[s],relType:e[s-1],cardB:e[s-2]};break;case 72:this.$=r.Cardinality.ZERO_OR_ONE;break;case 73:this.$=r.Cardinality.ZERO_OR_MORE;break;case 74:this.$=r.Cardinality.ONE_OR_MORE;break;case 75:this.$=r.Cardinality.ONLY_ONE;break;case 76:this.$=r.Cardinality.MD_PARENT;break;case 77:this.$=r.Identification.NON_IDENTIFYING;break;case 78:this.$=r.Identification.IDENTIFYING;break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(i,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,22:d,24:o,26:h,28:b,29:14,30:15,31:16,32:17,33:R,34:k,35:_,36:w,37:W,40:E,43:ie,44:Q,48:S,50:I,51:V,52:M},t(i,[2,7],{1:[2,1]}),t(i,[2,3]),{9:30,11:9,22:d,24:o,26:h,28:b,29:14,30:15,31:16,32:17,33:R,34:k,35:_,36:w,37:W,40:E,43:ie,44:Q,48:S,50:I,51:V,52:M},t(i,[2,5]),t(i,[2,6]),t(i,[2,16],{12:31,63:35,15:[1,32],17:[1,33],20:[1,34],65:re,66:ae,67:ne,68:ce,69:oe}),{23:[1,41]},{25:[1,42]},{27:[1,43]},t(i,[2,27]),t(i,[2,28]),t(i,[2,29]),t(i,[2,30]),t(i,[2,31]),t(B,[2,54]),t(B,[2,55]),t(B,[2,56]),t(B,[2,57]),t(B,[2,58]),t(i,[2,32]),t(i,[2,33]),t(i,[2,34]),t(i,[2,35]),{16:44,40:T,41:O},{16:47,40:T,41:O},{16:48,40:T,41:O},t(i,[2,4]),{11:49,40:E,48:S,50:I,51:V,52:M},{16:50,40:T,41:O},{18:51,19:[1,52],53:53,54:54,58:F},{11:56,40:E,48:S,50:I,51:V,52:M},{64:57,70:[1,58],71:[1,59]},t(Y,[2,72]),t(Y,[2,73]),t(Y,[2,74]),t(Y,[2,75]),t(Y,[2,76]),t(i,[2,24]),t(i,[2,25]),t(i,[2,26]),{13:P,38:60,41:z,42:N,45:62,46:63,48:G,49:K},t(X,[2,37]),t(X,[2,38]),{16:68,40:T,41:O,42:N},{13:P,38:69,41:z,42:N,45:62,46:63,48:G,49:K},{13:[1,70],15:[1,71]},t(i,[2,17],{63:35,12:72,17:[1,73],42:N,65:re,66:ae,67:ne,68:ce,69:oe}),{19:[1,74]},t(i,[2,14]),{18:75,19:[2,59],53:53,54:54,58:F},{55:76,58:[1,77]},{58:[2,65]},{21:[1,78]},{63:79,65:re,66:ae,67:ne,68:ce,69:oe},t(ke,[2,77]),t(ke,[2,78]),{6:ge,10:_e,39:80,42:me,47:Ee},{40:[1,85],41:[1,86]},t(Se,[2,43],{46:87,13:P,41:z,48:G,49:K}),t(D,[2,45]),t(D,[2,50]),t(D,[2,51]),t(D,[2,52]),t(D,[2,53]),t(i,[2,41],{42:N}),{6:ge,10:_e,39:88,42:me,47:Ee},{14:89,40:q,50:H,72:J},{16:93,40:T,41:O},{11:94,40:E,48:S,50:I,51:V,52:M},{18:95,19:[1,96],53:53,54:54,58:F},t(i,[2,12]),{19:[2,60]},t(U,[2,61],{56:97,57:98,59:99,61:Te,62:Oe}),t([19,58,61,62],[2,66]),t(i,[2,22],{15:[1,103],17:[1,102]}),t([40,48,50,51,52],[2,71]),t(i,[2,36]),{13:P,41:z,45:104,46:63,48:G,49:K},t(i,[2,47]),t(i,[2,48]),t(i,[2,49]),t(X,[2,39]),t(X,[2,40]),t(D,[2,46]),t(i,[2,42]),t(i,[2,8]),t(i,[2,79]),t(i,[2,80]),t(i,[2,81]),{13:[1,105],42:N},{13:[1,107],15:[1,106]},{19:[1,108]},t(i,[2,15]),t(U,[2,62],{57:109,60:[1,110],62:Oe}),t(U,[2,63]),t(le,[2,67]),t(U,[2,70]),t(le,[2,69]),{18:111,19:[1,112],53:53,54:54,58:F},{16:113,40:T,41:O},t(Se,[2,44],{46:87,13:P,41:z,48:G,49:K}),{14:114,40:q,50:H,72:J},{16:115,40:T,41:O},{14:116,40:q,50:H,72:J},t(i,[2,13]),t(U,[2,64]),{59:117,61:Te},{19:[1,118]},t(i,[2,20]),t(i,[2,23],{17:[1,119],42:N}),t(i,[2,11]),{13:[1,120],42:N},t(i,[2,10]),t(le,[2,68]),t(i,[2,18]),{18:121,19:[1,122],53:53,54:54,58:F},{14:123,40:q,50:H,72:J},{19:[1,124]},t(i,[2,21]),t(i,[2,9]),t(i,[2,19])],defaultActions:{55:[2,65],75:[2,60]},parseError:l(function(a,n){if(n.recoverable)this.trace(a);else{var c=new Error(a);throw c.hash=n,c}},"parseError"),parse:l(function(a){var n=this,c=[0],r=[],u=[null],e=[],Z=this.table,s="",ee=0,Ne=0,Ae=0,qe=2,Re=1,He=e.slice.call(arguments,1),p=Object.create(this.lexer),x={yy:{}};for(var ue in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ue)&&(x.yy[ue]=this.yy[ue]);p.setInput(a,x.yy),x.yy.lexer=p,x.yy.parser=this,typeof p.yylloc>"u"&&(p.yylloc={});var de=p.yylloc;e.push(de);var Je=p.options&&p.options.ranges;typeof x.yy.parseError=="function"?this.parseError=x.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function $e(y){c.length=c.length-2*y,u.length=u.length-y,e.length=e.length-y}l($e,"popStack");function Ie(){var y;return y=r.pop()||p.lex()||Re,typeof y!="number"&&(y instanceof Array&&(r=y,y=r.pop()),y=n.symbols_[y]||y),y}l(Ie,"lex");for(var f,be,C,g,nt,pe,L={},te,m,xe,se;;){if(C=c[c.length-1],this.defaultActions[C]?g=this.defaultActions[C]:((f===null||typeof f>"u")&&(f=Ie()),g=Z[C]&&Z[C][f]),typeof g>"u"||!g.length||!g[0]){var fe="";se=[];for(te in Z[C])this.terminals_[te]&&te>qe&&se.push("'"+this.terminals_[te]+"'");p.showPosition?fe="Parse error on line "+(ee+1)+`: +`+p.showPosition()+` +Expecting `+se.join(", ")+", got '"+(this.terminals_[f]||f)+"'":fe="Parse error on line "+(ee+1)+": Unexpected "+(f==Re?"end of input":"'"+(this.terminals_[f]||f)+"'"),this.parseError(fe,{text:p.match,token:this.terminals_[f]||f,line:p.yylineno,loc:de,expected:se})}if(g[0]instanceof Array&&g.length>1)throw new Error("Parse Error: multiple actions possible at state: "+C+", token: "+f);switch(g[0]){case 1:c.push(f),u.push(p.yytext),e.push(p.yylloc),c.push(g[1]),f=null,be?(f=be,be=null):(Ne=p.yyleng,s=p.yytext,ee=p.yylineno,de=p.yylloc,Ae>0&&Ae--);break;case 2:if(m=this.productions_[g[1]][1],L.$=u[u.length-m],L._$={first_line:e[e.length-(m||1)].first_line,last_line:e[e.length-1].last_line,first_column:e[e.length-(m||1)].first_column,last_column:e[e.length-1].last_column},Je&&(L._$.range=[e[e.length-(m||1)].range[0],e[e.length-1].range[1]]),pe=this.performAction.apply(L,[s,Ne,ee,x.yy,g[1],u,e].concat(He)),typeof pe<"u")return pe;m&&(c=c.slice(0,-1*m*2),u=u.slice(0,-1*m),e=e.slice(0,-1*m)),c.push(this.productions_[g[1]][0]),u.push(L.$),e.push(L._$),xe=Z[c[c.length-2]][c[c.length-1]],c.push(xe);break;case 3:return!0}}return!0},"parse")},Xe=(function(){var A={EOF:1,parseError:l(function(n,c){if(this.yy.parser)this.yy.parser.parseError(n,c);else throw new Error(n)},"parseError"),setInput:l(function(a,n){return this.yy=n||this.yy||{},this._input=a,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:l(function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var n=a.match(/(?:\r\n?|\n).*/g);return n?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},"input"),unput:l(function(a){var n=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-n),this.offset-=n;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var u=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===r.length?this.yylloc.first_column:0)+r[r.length-c.length].length-c[0].length:this.yylloc.first_column-n},this.options.ranges&&(this.yylloc.range=[u[0],u[0]+this.yyleng-n]),this.yyleng=this.yytext.length,this},"unput"),more:l(function(){return this._more=!0,this},"more"),reject:l(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:l(function(a){this.unput(this.match.slice(a))},"less"),pastInput:l(function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:l(function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:l(function(){var a=this.pastInput(),n=new Array(a.length+1).join("-");return a+this.upcomingInput()+` +`+n+"^"},"showPosition"),test_match:l(function(a,n){var c,r,u;if(this.options.backtrack_lexer&&(u={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(u.yylloc.range=this.yylloc.range.slice(0))),r=a[0].match(/(?:\r\n?|\n).*/g),r&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+a[0].length},this.yytext+=a[0],this.match+=a[0],this.matches=a,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(a[0].length),this.matched+=a[0],c=this.performAction.call(this,this.yy,this,n,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),c)return c;if(this._backtrack){for(var e in u)this[e]=u[e];return!1}return!1},"test_match"),next:l(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,n,c,r;this._more||(this.yytext="",this.match="");for(var u=this._currentRules(),e=0;en[0].length)){if(n=c,r=e,this.options.backtrack_lexer){if(a=this.test_match(c,u[e]),a!==!1)return a;if(this._backtrack){n=!1;continue}else return!1}else if(!this.options.flex)break}return n?(a=this.test_match(n,u[r]),a!==!1?a:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:l(function(){var n=this.next();return n||this.lex()},"lex"),begin:l(function(n){this.conditionStack.push(n)},"begin"),popState:l(function(){var n=this.conditionStack.length-1;return n>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:l(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:l(function(n){return n=this.conditionStack.length-1-Math.abs(n||0),n>=0?this.conditionStack[n]:"INITIAL"},"topState"),pushState:l(function(n){this.begin(n)},"pushState"),stateStackSize:l(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:l(function(n,c,r,u){var e=u;switch(r){case 0:return this.begin("acc_title"),24;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),26;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 33;case 8:return 34;case 9:return 35;case 10:return 36;case 11:return 10;case 12:break;case 13:return 8;case 14:return 50;case 15:return 72;case 16:return 4;case 17:return this.begin("block"),17;break;case 18:return 49;case 19:return 49;case 20:return 42;case 21:return 15;case 22:return 13;case 23:break;case 24:return 61;case 25:return 58;case 26:return 58;case 27:return 62;case 28:break;case 29:return this.popState(),19;break;case 30:return c.yytext[0];case 31:return 20;case 32:return 21;case 33:return this.begin("style"),44;break;case 34:return this.popState(),10;break;case 35:break;case 36:return 13;case 37:return 42;case 38:return 49;case 39:return this.begin("style"),37;break;case 40:return 43;case 41:return 65;case 42:return 67;case 43:return 67;case 44:return 67;case 45:return 65;case 46:return 65;case 47:return 66;case 48:return 66;case 49:return 66;case 50:return 66;case 51:return 66;case 52:return 67;case 53:return 66;case 54:return 67;case 55:return 68;case 56:return 68;case 57:return 51;case 58:return 68;case 59:return 68;case 60:return 52;case 61:return 48;case 62:return 68;case 63:return 65;case 64:return 66;case 65:return 67;case 66:return 69;case 67:return 70;case 68:return 71;case 69:return 71;case 70:return 70;case 71:return 70;case 72:return 70;case 73:return 41;case 74:return 47;case 75:return 40;case 76:return c.yytext[0];case 77:return 6}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:#)/i,/^(?:#)/i,/^(?:,)/i,/^(?::::)/i,/^(?::)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:([^\s]*)[~].*[~]([^\s]*))/i,/^(?:([\*A-Za-z_\u00C0-\uFFFF][A-Za-z0-9\-\_\[\]\(\)\u00C0-\uFFFF\*]*))/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:style\b)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?::)/i,/^(?:,)/i,/^(?:#)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:[0-9]+\.[0-9]+)/i,/^(?:1(?=\s+[A-Za-z_"']))/i,/^(?:1(?=(--|\.\.|\.-|-\.)))/i,/^(?:1\b)/i,/^(?:[0-9]+)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:u(?=[\.\-\|]))/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:;)/i,/^(?:([^\x00-\x7F]|\w|-|\*|\.)+)/i,/^(?:.)/i,/^(?:$)/i],conditions:{style:{rules:[34,35,36,37,38,73,74],inclusive:!1},acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},block:{rules:[23,24,25,26,27,28,29,30],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,31,32,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,75,76,77],inclusive:!0}}};return A})();he.lexer=Xe;function $(){this.yy={}}return l($,"Parser"),$.prototype=he,he.Parser=$,new $})();ye.parser=ye;var et=ye,tt=class{constructor(){this.entities=new Map,this.relationships=[],this.classes=new Map,this.direction="TB",this.Cardinality={ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE",MD_PARENT:"MD_PARENT"},this.Identification={NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"},this.setAccTitle=Me,this.getAccTitle=Be,this.setAccDescription=Fe,this.getAccDescription=Ye,this.setDiagramTitle=Pe,this.getDiagramTitle=ze,this.getConfig=l(()=>j().er,"getConfig"),this.clear(),this.addEntity=this.addEntity.bind(this),this.addAttributes=this.addAttributes.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setDirection=this.setDirection.bind(this),this.addCssStyles=this.addCssStyles.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{l(this,"ErDB")}addEntity(t,i=""){return this.entities.has(t)?!this.entities.get(t)?.alias&&i&&(this.entities.get(t).alias=i,v.info(`Add alias '${i}' to entity '${t}'`)):(this.entities.set(t,{id:`entity-${t}-${this.entities.size}`,label:t,attributes:[],alias:i,shape:"erBox",look:j().look??"default",cssClasses:"default",cssStyles:[],labelType:"markdown"}),v.info("Added new entity :",t)),this.entities.get(t)}getEntity(t){return this.entities.get(t)}getEntities(){return this.entities}getClasses(){return this.classes}addAttributes(t,i){let d=this.addEntity(t),o;for(o=i.length-1;o>=0;o--)i[o].keys||(i[o].keys=[]),i[o].comment||(i[o].comment=""),d.attributes.push(i[o]),v.debug("Added attribute ",i[o].name)}addRelationship(t,i,d,o){let h=this.entities.get(t),b=this.entities.get(d);if(!h||!b)return;let R={entityA:h.id,roleA:i,entityB:b.id,relSpec:o};this.relationships.push(R),v.debug("Added new relationship :",R)}getRelationships(){return this.relationships}getDirection(){return this.direction}setDirection(t){this.direction=t}getCompiledStyles(t){let i=[];for(let d of t){let o=this.classes.get(d);o?.styles&&(i=[...i,...o.styles??[]].map(h=>h.trim())),o?.textStyles&&(i=[...i,...o.textStyles??[]].map(h=>h.trim()))}return i}addCssStyles(t,i){for(let d of t){let o=this.entities.get(d);if(!i||!o)return;for(let h of i)o.cssStyles.push(h)}}addClass(t,i){t.forEach(d=>{let o=this.classes.get(d);o===void 0&&(o={id:d,styles:[],textStyles:[]},this.classes.set(d,o)),i&&i.forEach(function(h){if(/color/.exec(h)){let b=h.replace("fill","bgFill");o.textStyles.push(b)}o.styles.push(h)})})}setClass(t,i){for(let d of t){let o=this.entities.get(d);if(o)for(let h of i)o.cssClasses+=" "+h}}clear(){this.entities=new Map,this.classes=new Map,this.relationships=[],Ve()}getData(){let t=[],i=[],d=j();for(let h of this.entities.keys()){let b=this.entities.get(h);b&&(b.cssCompiledStyles=this.getCompiledStyles(b.cssClasses.split(" ")),t.push(b))}let o=0;for(let h of this.relationships){let b={id:Ke(h.entityA,h.entityB,{prefix:"id",counter:o++}),type:"normal",curve:"basis",start:h.entityA,end:h.entityB,label:h.roleA,labelpos:"c",thickness:"normal",classes:"relationshipLine",arrowTypeStart:h.relSpec.cardB.toLowerCase(),arrowTypeEnd:h.relSpec.cardA.toLowerCase(),pattern:h.relSpec.relType=="IDENTIFYING"?"solid":"dashed",look:d.look,labelType:"markdown"};i.push(b)}return{nodes:t,edges:i,other:{},config:d,direction:"TB"}}},Qe={};De(Qe,{draw:()=>st});var st=l(function(t,i,d,o){return Ce(this,null,function*(){v.info("REF0:"),v.info("Drawing er diagram (unified)",i);let{securityLevel:h,er:b,layout:R}=j(),k=o.db.getData(),_=je(i,h);k.type=o.type,k.layoutAlgorithm=Ze(R),k.config.flowchart.nodeSpacing=b?.nodeSpacing||140,k.config.flowchart.rankSpacing=b?.rankSpacing||80,k.direction=o.db.getDirection(),k.markers=["only_one","zero_or_one","one_or_more","zero_or_more"],k.diagramId=i,yield Ue(k,_),k.layoutAlgorithm==="elk"&&_.select(".edges").lower();let w=_.selectAll('[id*="-background"]');Array.from(w).length>0&&w.each(function(){let E=ve(this),Q=E.attr("id").replace("-background",""),S=_.select(`#${CSS.escape(Q)}`);if(!S.empty()){let I=S.attr("transform");E.attr("transform",I)}});let W=8;Ge.insertTitle(_,"erDiagramTitleText",b?.titleTopMargin??25,o.db.getDiagramTitle()),We(_,W,"erDiagram",b?.useMaxWidth??!0)})},"draw"),it=l((t,i)=>{let d=we,o=d(t,"r"),h=d(t,"g"),b=d(t,"b");return Le(o,h,b,i)},"fade"),rt=l(t=>` + .entityBox { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + } + + .relationshipLabelBox { + fill: ${t.tertiaryColor}; + opacity: 0.7; + background-color: ${t.tertiaryColor}; + rect { + opacity: 0.5; + } + } + + .labelBkg { + background-color: ${it(t.tertiaryColor,.5)}; + } + + .edgeLabel .label { + fill: ${t.nodeBorder}; + font-size: 14px; + } + + .label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + + .edge-pattern-dashed { + stroke-dasharray: 8,8; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon + { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + .relationshipLine { + stroke: ${t.lineColor}; + stroke-width: 1; + fill: none; + } + + .marker { + fill: none !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + } + .edgeLabel .label rect { + fill: ${t.edgeLabelBackground}; + } + .edgeLabel .label text { + fill: ${t.textColor}; + } +`,"getStyles"),at=rt,Et={parser:et,get db(){return new tt},renderer:Qe,styles:at};export{Et as diagram}; diff --git a/src/google/adk/cli/browser/chunk-QMDHABEH.js b/src/google/adk/cli/browser/chunk-QMDHABEH.js new file mode 100644 index 0000000000..7dbba58b45 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-QMDHABEH.js @@ -0,0 +1,139 @@ +import{a as gt}from"./chunk-B2DSW4QB.js";import{a as dt,b as ft,c as pt,f as Z}from"./chunk-NMKTPNXE.js";import"./chunk-GP6TCC26.js";import{N as st,R as at,S as lt,T as ot,U as ct,V as ht,W as ut,X as yt,Y as F}from"./chunk-QFMJV7VH.js";import{K as U,a as W,g as n}from"./chunk-JRNAXTJ7.js";import"./chunk-RMXJBC7V.js";var K=(function(){var t=n(function(h,r,a,l){for(a=a||{},l=h.length;l--;a[h[l]]=r);return a},"o"),e=[6,8,10,11,12,14,16,17,18],s=[1,9],c=[1,10],i=[1,11],f=[1,12],u=[1,13],d=[1,14],g={trace:n(function(){},"trace"),yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,taskName:18,taskData:19,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",18:"taskName",19:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],performAction:n(function(r,a,l,y,p,o,v){var k=o.length-1;switch(p){case 1:return o[k-1];case 2:this.$=[];break;case 3:o[k-1].push(o[k]),this.$=o[k-1];break;case 4:case 5:this.$=o[k];break;case 6:case 7:this.$=[];break;case 8:y.setDiagramTitle(o[k].substr(6)),this.$=o[k].substr(6);break;case 9:this.$=o[k].trim(),y.setAccTitle(this.$);break;case 10:case 11:this.$=o[k].trim(),y.setAccDescription(this.$);break;case 12:y.addSection(o[k].substr(8)),this.$=o[k].substr(8);break;case 13:y.addTask(o[k-1],o[k]),this.$="task";break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:s,12:c,14:i,16:f,17:u,18:d},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:15,11:s,12:c,14:i,16:f,17:u,18:d},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,16]},{15:[1,17]},t(e,[2,11]),t(e,[2,12]),{19:[1,18]},t(e,[2,4]),t(e,[2,9]),t(e,[2,10]),t(e,[2,13])],defaultActions:{},parseError:n(function(r,a){if(a.recoverable)this.trace(r);else{var l=new Error(r);throw l.hash=a,l}},"parseError"),parse:n(function(r){var a=this,l=[0],y=[],p=[null],o=[],v=this.table,k="",C=0,tt=0,et=0,$t=2,rt=1,Mt=o.slice.call(arguments,1),b=Object.create(this.lexer),I={yy:{}};for(var Y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Y)&&(I.yy[Y]=this.yy[Y]);b.setInput(r,I.yy),I.yy.lexer=b,I.yy.parser=this,typeof b.yylloc>"u"&&(b.yylloc={});var q=b.yylloc;o.push(q);var Et=b.options&&b.options.ranges;typeof I.yy.parseError=="function"?this.parseError=I.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Ct(w){l.length=l.length-2*w,p.length=p.length-w,o.length=o.length-w}n(Ct,"popStack");function it(){var w;return w=y.pop()||b.lex()||rt,typeof w!="number"&&(w instanceof Array&&(y=w,w=y.pop()),w=a.symbols_[w]||w),w}n(it,"lex");for(var _,H,A,T,Jt,X,V={},N,M,nt,z;;){if(A=l[l.length-1],this.defaultActions[A]?T=this.defaultActions[A]:((_===null||typeof _>"u")&&(_=it()),T=v[A]&&v[A][_]),typeof T>"u"||!T.length||!T[0]){var G="";z=[];for(N in v[A])this.terminals_[N]&&N>$t&&z.push("'"+this.terminals_[N]+"'");b.showPosition?G="Parse error on line "+(C+1)+`: +`+b.showPosition()+` +Expecting `+z.join(", ")+", got '"+(this.terminals_[_]||_)+"'":G="Parse error on line "+(C+1)+": Unexpected "+(_==rt?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(G,{text:b.match,token:this.terminals_[_]||_,line:b.yylineno,loc:q,expected:z})}if(T[0]instanceof Array&&T.length>1)throw new Error("Parse Error: multiple actions possible at state: "+A+", token: "+_);switch(T[0]){case 1:l.push(_),p.push(b.yytext),o.push(b.yylloc),l.push(T[1]),_=null,H?(_=H,H=null):(tt=b.yyleng,k=b.yytext,C=b.yylineno,q=b.yylloc,et>0&&et--);break;case 2:if(M=this.productions_[T[1]][1],V.$=p[p.length-M],V._$={first_line:o[o.length-(M||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(M||1)].first_column,last_column:o[o.length-1].last_column},Et&&(V._$.range=[o[o.length-(M||1)].range[0],o[o.length-1].range[1]]),X=this.performAction.apply(V,[k,tt,C,I.yy,T[1],p,o].concat(Mt)),typeof X<"u")return X;M&&(l=l.slice(0,-1*M*2),p=p.slice(0,-1*M),o=o.slice(0,-1*M)),l.push(this.productions_[T[1]][0]),p.push(V.$),o.push(V._$),nt=v[l[l.length-2]][l[l.length-1]],l.push(nt);break;case 3:return!0}}return!0},"parse")},m=(function(){var h={EOF:1,parseError:n(function(a,l){if(this.yy.parser)this.yy.parser.parseError(a,l);else throw new Error(a)},"parseError"),setInput:n(function(r,a){return this.yy=a||this.yy||{},this._input=r,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:n(function(){var r=this._input[0];this.yytext+=r,this.yyleng++,this.offset++,this.match+=r,this.matched+=r;var a=r.match(/(?:\r\n?|\n).*/g);return a?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),r},"input"),unput:n(function(r){var a=r.length,l=r.split(/(?:\r\n?|\n)/g);this._input=r+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-a),this.offset-=a;var y=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),l.length-1&&(this.yylineno-=l.length-1);var p=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:l?(l.length===y.length?this.yylloc.first_column:0)+y[y.length-l.length].length-l[0].length:this.yylloc.first_column-a},this.options.ranges&&(this.yylloc.range=[p[0],p[0]+this.yyleng-a]),this.yyleng=this.yytext.length,this},"unput"),more:n(function(){return this._more=!0,this},"more"),reject:n(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:n(function(r){this.unput(this.match.slice(r))},"less"),pastInput:n(function(){var r=this.matched.substr(0,this.matched.length-this.match.length);return(r.length>20?"...":"")+r.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:n(function(){var r=this.match;return r.length<20&&(r+=this._input.substr(0,20-r.length)),(r.substr(0,20)+(r.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:n(function(){var r=this.pastInput(),a=new Array(r.length+1).join("-");return r+this.upcomingInput()+` +`+a+"^"},"showPosition"),test_match:n(function(r,a){var l,y,p;if(this.options.backtrack_lexer&&(p={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(p.yylloc.range=this.yylloc.range.slice(0))),y=r[0].match(/(?:\r\n?|\n).*/g),y&&(this.yylineno+=y.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:y?y[y.length-1].length-y[y.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+r[0].length},this.yytext+=r[0],this.match+=r[0],this.matches=r,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(r[0].length),this.matched+=r[0],l=this.performAction.call(this,this.yy,this,a,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),l)return l;if(this._backtrack){for(var o in p)this[o]=p[o];return!1}return!1},"test_match"),next:n(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var r,a,l,y;this._more||(this.yytext="",this.match="");for(var p=this._currentRules(),o=0;oa[0].length)){if(a=l,y=o,this.options.backtrack_lexer){if(r=this.test_match(l,p[o]),r!==!1)return r;if(this._backtrack){a=!1;continue}else return!1}else if(!this.options.flex)break}return a?(r=this.test_match(a,p[y]),r!==!1?r:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:n(function(){var a=this.next();return a||this.lex()},"lex"),begin:n(function(a){this.conditionStack.push(a)},"begin"),popState:n(function(){var a=this.conditionStack.length-1;return a>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:n(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:n(function(a){return a=this.conditionStack.length-1-Math.abs(a||0),a>=0?this.conditionStack[a]:"INITIAL"},"topState"),pushState:n(function(a){this.begin(a)},"pushState"),stateStackSize:n(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:n(function(a,l,y,p){var o=p;switch(y){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 18;case 16:return 19;case 17:return":";case 18:return 6;case 19:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18,19],inclusive:!0}}};return h})();g.lexer=m;function x(){this.yy={}}return n(x,"Parser"),x.prototype=g,g.Parser=x,new x})();K.parser=K;var Pt=K,R="",Q=[],L=[],B=[],It=n(function(){Q.length=0,L.length=0,R="",B.length=0,at()},"clear"),At=n(function(t){R=t,Q.push(t)},"addSection"),Ft=n(function(){return Q},"getSections"),Vt=n(function(){let t=mt(),e=100,s=0;for(;!t&&s{s.people&&t.push(...s.people)}),[...new Set(t)].sort()},"updateActors"),Lt=n(function(t,e){let s=e.substr(1).split(":"),c=0,i=[];s.length===1?(c=Number(s[0]),i=[]):(c=Number(s[0]),i=s[1].split(","));let f=i.map(d=>d.trim()),u={section:R,type:R,people:f,task:t,score:c};B.push(u)},"addTask"),Bt=n(function(t){let e={section:R,type:R,description:t,task:t,classes:[]};L.push(e)},"addTaskOrg"),mt=n(function(){let t=n(function(s){return B[s].processed},"compileTask"),e=!0;for(let[s,c]of B.entries())t(s),e=e&&c.processed;return e},"compileTasks"),jt=n(function(){return Rt()},"getActors"),xt={getConfig:n(()=>F().journey,"getConfig"),clear:It,setDiagramTitle:ut,getDiagramTitle:yt,setAccTitle:lt,getAccTitle:ot,setAccDescription:ct,getAccDescription:ht,addSection:At,getSections:Ft,getTasks:Vt,addTask:Lt,addTaskOrg:Bt,getActors:jt},Nt=n(t=>`.label { + font-family: ${t.fontFamily}; + color: ${t.textColor}; + } + .mouth { + stroke: #666; + } + + line { + stroke: ${t.textColor} + } + + .legend { + fill: ${t.textColor}; + font-family: ${t.fontFamily}; + } + + .label text { + fill: #333; + } + .label { + color: ${t.textColor} + } + + .face { + ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"}; + stroke: #999; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 1.5px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + rect { + opacity: 0.5; + } + text-align: center; + } + + .cluster rect { + } + + .cluster text { + fill: ${t.titleColor}; + } + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${t.fontFamily}; + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .task-type-0, .section-type-0 { + ${t.fillType0?`fill: ${t.fillType0}`:""}; + } + .task-type-1, .section-type-1 { + ${t.fillType0?`fill: ${t.fillType1}`:""}; + } + .task-type-2, .section-type-2 { + ${t.fillType0?`fill: ${t.fillType2}`:""}; + } + .task-type-3, .section-type-3 { + ${t.fillType0?`fill: ${t.fillType3}`:""}; + } + .task-type-4, .section-type-4 { + ${t.fillType0?`fill: ${t.fillType4}`:""}; + } + .task-type-5, .section-type-5 { + ${t.fillType0?`fill: ${t.fillType5}`:""}; + } + .task-type-6, .section-type-6 { + ${t.fillType0?`fill: ${t.fillType6}`:""}; + } + .task-type-7, .section-type-7 { + ${t.fillType0?`fill: ${t.fillType7}`:""}; + } + + .actor-0 { + ${t.actor0?`fill: ${t.actor0}`:""}; + } + .actor-1 { + ${t.actor1?`fill: ${t.actor1}`:""}; + } + .actor-2 { + ${t.actor2?`fill: ${t.actor2}`:""}; + } + .actor-3 { + ${t.actor3?`fill: ${t.actor3}`:""}; + } + .actor-4 { + ${t.actor4?`fill: ${t.actor4}`:""}; + } + .actor-5 { + ${t.actor5?`fill: ${t.actor5}`:""}; + } + ${gt()} +`,"getStyles"),zt=Nt,D=n(function(t,e){return dt(t,e)},"drawRect"),Wt=n(function(t,e){let c=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function f(g){let m=U().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);g.append("path").attr("class","mouth").attr("d",m).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}n(f,"smile");function u(g){let m=U().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);g.append("path").attr("class","mouth").attr("d",m).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}n(u,"sad");function d(g){g.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return n(d,"ambivalent"),e.score>3?f(i):e.score<3?u(i):d(i),c},"drawFace"),vt=n(function(t,e){let s=t.append("circle");return s.attr("cx",e.cx),s.attr("cy",e.cy),s.attr("class","actor-"+e.pos),s.attr("fill",e.fill),s.attr("stroke",e.stroke),s.attr("r",e.r),s.class!==void 0&&s.attr("class",s.class),e.title!==void 0&&s.append("title").text(e.title),s},"drawCircle"),wt=n(function(t,e){return pt(t,e)},"drawText"),Ot=n(function(t,e){function s(i,f,u,d,g){return i+","+f+" "+(i+u)+","+f+" "+(i+u)+","+(f+d-g)+" "+(i+u-g*1.2)+","+(f+d)+" "+i+","+(f+d)}n(s,"genPoints");let c=t.append("polygon");c.attr("points",s(e.x,e.y,50,20,7)),c.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,wt(t,e)},"drawLabel"),Yt=n(function(t,e,s){let c=t.append("g"),i=Z();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=s.width*e.taskCount+s.diagramMarginX*(e.taskCount-1),i.height=s.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,D(c,i),Tt(s)(e.text,c,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},s,e.colour)},"drawSection"),kt=-1,qt=n(function(t,e,s){let c=e.x+s.width/2,i=t.append("g");kt++,i.append("line").attr("id","task"+kt).attr("x1",c).attr("y1",e.y).attr("x2",c).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),Wt(i,{cx:c,cy:300+(5-e.score)*30,score:e.score});let u=Z();u.x=e.x,u.y=e.y,u.fill=e.fill,u.width=s.width,u.height=s.height,u.class="task task-type-"+e.num,u.rx=3,u.ry=3,D(i,u);let d=e.x+14;e.people.forEach(g=>{let m=e.actors[g].color,x={cx:d,cy:e.y,r:7,fill:m,stroke:"#000",title:g,pos:e.actors[g].position};vt(i,x),d+=10}),Tt(s)(e.task,i,u.x,u.y,u.width,u.height,{class:"task"},s,e.colour)},"drawTask"),Ht=n(function(t,e){ft(t,e)},"drawBackgroundRect"),Tt=(function(){function t(i,f,u,d,g,m,x,h){let r=f.append("text").attr("x",u+g/2).attr("y",d+m/2+5).style("font-color",h).style("text-anchor","middle").text(i);c(r,x)}n(t,"byText");function e(i,f,u,d,g,m,x,h,r){let{taskFontSize:a,taskFontFamily:l}=h,y=i.split(//gi);for(let p=0;p{let f=E[i].color,u={cx:20,cy:c,r:7,fill:f,stroke:"#000",pos:E[i].position};j.drawCircle(t,u);let d=t.append("text").attr("visibility","hidden").text(i),g=d.node().getBoundingClientRect().width;d.remove();let m=[];if(g<=s)m=[i];else{let x=i.split(" "),h="";d=t.append("text").attr("visibility","hidden"),x.forEach(r=>{let a=h?`${h} ${r}`:r;if(d.text(a),d.node().getBoundingClientRect().width>s){if(h&&m.push(h),h=r,d.text(r),d.node().getBoundingClientRect().width>s){let y="";for(let p of r)y+=p,d.text(y+"-"),d.node().getBoundingClientRect().width>s&&(m.push(y.slice(0,-1)+"-"),y=p);h=y}}else h=a}),h&&m.push(h),d.remove()}m.forEach((x,h)=>{let r={x:40,y:c+7+h*20,fill:"#666",text:x,textMargin:e.boxTextMargin??5},l=j.drawText(t,r).node().getBoundingClientRect().width;l>O&&l>e.leftMargin-l&&(O=l)}),c+=Math.max(20,m.length*20)})}n(St,"drawActorLegend");var $=F().journey,P=0,Ut=n(function(t,e,s,c){let i=F(),f=i.journey.titleColor,u=i.journey.titleFontSize,d=i.journey.titleFontFamily,g=i.securityLevel,m;g==="sandbox"&&(m=W("#i"+e));let x=g==="sandbox"?W(m.nodes()[0].contentDocument.body):W("body");S.init();let h=x.select("#"+e);j.initGraphics(h);let r=c.db.getTasks(),a=c.db.getDiagramTitle(),l=c.db.getActors();for(let C in E)delete E[C];let y=0;l.forEach(C=>{E[C]={color:$.actorColours[y%$.actorColours.length],position:y},y++}),St(h),P=$.leftMargin+O,S.insert(0,0,P,Object.keys(E).length*50),Zt(h,r,0);let p=S.getBounds();a&&h.append("text").text(a).attr("x",P).attr("font-size",u).attr("font-weight","bold").attr("y",25).attr("fill",f).attr("font-family",d);let o=p.stopy-p.starty+2*$.diagramMarginY,v=P+p.stopx+2*$.diagramMarginX;st(h,o,v,$.useMaxWidth),h.append("line").attr("x1",P).attr("y1",$.height*4).attr("x2",v-P-4).attr("y2",$.height*4).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");let k=a?70:0;h.attr("viewBox",`${p.startx} -25 ${v} ${o+k}`),h.attr("preserveAspectRatio","xMinYMin meet"),h.attr("height",o+k+25)},"draw"),S={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:n(function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},"init"),updateVal:n(function(t,e,s,c){t[e]===void 0?t[e]=s:t[e]=c(s,t[e])},"updateVal"),updateBounds:n(function(t,e,s,c){let i=F().journey,f=this,u=0;function d(g){return n(function(x){u++;let h=f.sequenceItems.length-u+1;f.updateVal(x,"starty",e-h*i.boxMargin,Math.min),f.updateVal(x,"stopy",c+h*i.boxMargin,Math.max),f.updateVal(S.data,"startx",t-h*i.boxMargin,Math.min),f.updateVal(S.data,"stopx",s+h*i.boxMargin,Math.max),g!=="activation"&&(f.updateVal(x,"startx",t-h*i.boxMargin,Math.min),f.updateVal(x,"stopx",s+h*i.boxMargin,Math.max),f.updateVal(S.data,"starty",e-h*i.boxMargin,Math.min),f.updateVal(S.data,"stopy",c+h*i.boxMargin,Math.max))},"updateItemBounds")}n(d,"updateFn"),this.sequenceItems.forEach(d())},"updateBounds"),insert:n(function(t,e,s,c){let i=Math.min(t,s),f=Math.max(t,s),u=Math.min(e,c),d=Math.max(e,c);this.updateVal(S.data,"startx",i,Math.min),this.updateVal(S.data,"starty",u,Math.min),this.updateVal(S.data,"stopx",f,Math.max),this.updateVal(S.data,"stopy",d,Math.max),this.updateBounds(i,u,f,d)},"insert"),bumpVerticalPos:n(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},"bumpVerticalPos"),getVerticalPos:n(function(){return this.verticalPos},"getVerticalPos"),getBounds:n(function(){return this.data},"getBounds")},J=$.sectionFills,bt=$.sectionColours,Zt=n(function(t,e,s){let c=F().journey,i="",f=c.height*2+c.diagramMarginY,u=s+f,d=0,g="#CCC",m="black",x=0;for(let[h,r]of e.entries()){if(i!==r.section){g=J[d%J.length],x=d%J.length,m=bt[d%bt.length];let l=0,y=r.section;for(let o=h;o(E[y]&&(l[y]=E[y]),l),{});r.x=h*c.taskMargin+h*c.width+P,r.y=u,r.width=c.diagramMarginX,r.height=c.diagramMarginY,r.colour=m,r.fill=g,r.num=x,r.actors=a,j.drawTask(t,r,c),S.insert(r.x,r.y,r.x+r.width+c.taskMargin,450)}},"drawTasks"),_t={setConf:Gt,draw:Ut},ie={parser:Pt,db:xt,renderer:_t,styles:zt,init:n(t=>{_t.setConf(t.journey),xt.clear()},"init")};export{ie as diagram}; diff --git a/src/google/adk/cli/browser/chunk-5VJ6OSLK.js b/src/google/adk/cli/browser/chunk-R6ZR5LUR.js similarity index 87% rename from src/google/adk/cli/browser/chunk-5VJ6OSLK.js rename to src/google/adk/cli/browser/chunk-R6ZR5LUR.js index b1df2d73d2..e3dea3c53d 100644 --- a/src/google/adk/cli/browser/chunk-5VJ6OSLK.js +++ b/src/google/adk/cli/browser/chunk-R6ZR5LUR.js @@ -1 +1 @@ -import{$a as d,Bb as m,Ca as r,Cb as u,Cc as _,Db as p,Ib as v,Lb as f,Ma as l,Pa as n,Yb as y,Zb as g,eb as s,fc as h,gc as x,hc as C,pd as b,qb as a,sb as c,wc as M}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function U(e,V){if(e&1&&(m(0,"section"),p(1,"video",1),u()),e&2){let t=f(),i=C(0);y(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Video),g(t.theme.components.Video),n(),v("src",i,l)}}var L=(()=>{class e extends b{url=_.required();resolvedUrl=M(()=>this.resolvePrimitive(this.url()));static \u0275fac=(()=>{let t;return function(o){return(t||(t=r(e)))(o||e)}})();static \u0275cmp=d({type:e,selectors:[["a2ui-video"]],inputs:{url:[1,"url"]},features:[s],decls:2,vars:2,consts:[[3,"class","style"],["controls","",3,"src"]],template:function(i,o){if(i&1&&(h(0),a(1,U,2,5,"section",0)),i&2){let D=x(o.resolvedUrl());n(),c(D?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}video[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return e})();export{L as Video}; +import{$a as d,Bb as m,Ca as r,Cb as u,Cc as _,Db as p,Ib as v,Lb as f,Ma as l,Pa as n,Yb as y,Zb as g,eb as s,fc as h,gc as x,hc as C,pd as b,qb as a,sb as c,wc as M}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function U(e,V){if(e&1&&(m(0,"section"),p(1,"video",1),u()),e&2){let t=f(),i=C(0);y(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Video),g(t.theme.components.Video),n(),v("src",i,l)}}var L=(()=>{class e extends b{url=_.required();resolvedUrl=M(()=>this.resolvePrimitive(this.url()));static \u0275fac=(()=>{let t;return function(o){return(t||(t=r(e)))(o||e)}})();static \u0275cmp=d({type:e,selectors:[["a2ui-video"]],inputs:{url:[1,"url"]},features:[s],decls:2,vars:2,consts:[[3,"class","style"],["controls","",3,"src"]],template:function(i,o){if(i&1&&(h(0),a(1,U,2,5,"section",0)),i&2){let D=x(o.resolvedUrl());n(),c(D?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}video[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return e})();export{L as Video}; diff --git a/src/google/adk/cli/browser/chunk-RCKFX6QR.js b/src/google/adk/cli/browser/chunk-RCKFX6QR.js new file mode 100644 index 0000000000..8ca9f21d72 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-RCKFX6QR.js @@ -0,0 +1,162 @@ +import{a as lt}from"./chunk-B2DSW4QB.js";import{h as ot}from"./chunk-NMKTPNXE.js";import{a as ct}from"./chunk-APNCZOFE.js";import{a as ht}from"./chunk-ST54LLJ3.js";import{a as it,b as rt}from"./chunk-ZMOC4H7T.js";import{b as nt,c as ut}from"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import{f as at}from"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import{m as Qe,p as Je}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{M as q1,R as X1,S as Q1,T as J1,U as Z1,V as $1,W as et,X as tt,Y as de,Z as u1,_ as st,a as K1,b as Y1,g as H1}from"./chunk-QFMJV7VH.js";import{a as Ee,g,i as Z}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{a as a1,b as n1,j as j1}from"./chunk-RMXJBC7V.js";var mt="flowchart-",Ct=class{constructor(){this.vertexCounter=0,this.config=de(),this.vertices=new Map,this.edges=[],this.classes=new Map,this.subGraphs=[],this.subGraphLookup=new Map,this.tooltips=new Map,this.subCount=0,this.firstGraphFlag=!0,this.secCount=-1,this.posCrossRef=[],this.funs=[],this.setAccTitle=Q1,this.setAccDescription=Z1,this.setDiagramTitle=et,this.getAccTitle=J1,this.getAccDescription=$1,this.getDiagramTitle=tt,this.funs.push(this.setupToolTips.bind(this)),this.addVertex=this.addVertex.bind(this),this.firstGraph=this.firstGraph.bind(this),this.setDirection=this.setDirection.bind(this),this.addSubGraph=this.addSubGraph.bind(this),this.addLink=this.addLink.bind(this),this.setLink=this.setLink.bind(this),this.updateLink=this.updateLink.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.destructLink=this.destructLink.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setTooltip=this.setTooltip.bind(this),this.updateLinkInterpolate=this.updateLinkInterpolate.bind(this),this.setClickFun=this.setClickFun.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.lex={firstGraph:this.firstGraph.bind(this)},this.clear(),this.setGen("gen-2")}static{g(this,"FlowDB")}sanitizeText(e){return q1.sanitizeText(e,this.config)}sanitizeNodeLabelType(e){switch(e){case"markdown":case"string":case"text":return e;default:return"markdown"}}lookUpDomId(e){for(let i of this.vertices.values())if(i.id===e)return i.domId;return e}addVertex(e,i,r,a,o,d,l={},k){if(!e||e.trim().length===0)return;let n;if(k!==void 0){let D;k.includes(` +`)?D=k+` +`:D=`{ +`+k+` +}`,n=rt(D,{schema:it})}let p=this.edges.find(D=>D.id===e);if(p){let D=n;D?.animate!==void 0&&(p.animate=D.animate),D?.animation!==void 0&&(p.animation=D.animation),D?.curve!==void 0&&(p.interpolate=D.curve);return}let S,b=this.vertices.get(e);if(b===void 0&&(b={id:e,labelType:"text",domId:mt+e+"-"+this.vertexCounter,styles:[],classes:[]},this.vertices.set(e,b)),this.vertexCounter++,i!==void 0?(this.config=de(),S=this.sanitizeText(i.text.trim()),b.labelType=i.type,S.startsWith('"')&&S.endsWith('"')&&(S=S.substring(1,S.length-1)),b.text=S):b.text===void 0&&(b.text=e),r!==void 0&&(b.type=r),a?.forEach(D=>{b.styles.push(D)}),o?.forEach(D=>{b.classes.push(D)}),d!==void 0&&(b.dir=d),b.props===void 0?b.props=l:l!==void 0&&Object.assign(b.props,l),n!==void 0){if(n.shape){if(n.shape!==n.shape.toLowerCase()||n.shape.includes("_"))throw new Error(`No such shape: ${n.shape}. Shape names should be lowercase.`);if(!at(n.shape))throw new Error(`No such shape: ${n.shape}.`);b.type=n?.shape}n?.label&&(b.text=n?.label,b.labelType=this.sanitizeNodeLabelType(n?.labelType)),n?.icon&&(b.icon=n?.icon,!n.label?.trim()&&b.text===e&&(b.text="")),n?.form&&(b.form=n?.form),n?.pos&&(b.pos=n?.pos),n?.img&&(b.img=n?.img,!n.label?.trim()&&b.text===e&&(b.text="")),n?.constraint&&(b.constraint=n.constraint),n.w&&(b.assetWidth=Number(n.w)),n.h&&(b.assetHeight=Number(n.h))}}addSingleLink(e,i,r,a){let l={start:e,end:i,type:void 0,text:"",labelType:"text",classes:[],isUserDefinedId:!1,interpolate:this.edges.defaultInterpolate};Z.info("abc78 Got edge...",l);let k=r.text;if(k!==void 0&&(l.text=this.sanitizeText(k.text.trim()),l.text.startsWith('"')&&l.text.endsWith('"')&&(l.text=l.text.substring(1,l.text.length-1)),l.labelType=this.sanitizeNodeLabelType(k.type)),r!==void 0&&(l.type=r.type,l.stroke=r.stroke,l.length=r.length>10?10:r.length),a&&!this.edges.some(n=>n.id===a))l.id=a,l.isUserDefinedId=!0;else{let n=this.edges.filter(p=>p.start===l.start&&p.end===l.end);n.length===0?l.id=Je(l.start,l.end,{counter:0,prefix:"L"}):l.id=Je(l.start,l.end,{counter:n.length+1,prefix:"L"})}if(this.edges.length<(this.config.maxEdges??500))Z.info("Pushing edge..."),this.edges.push(l);else throw new Error(`Edge limit exceeded. ${this.edges.length} edges found, but the limit is ${this.config.maxEdges}. + +Initialize mermaid with maxEdges set to a higher number to allow more edges. +You cannot set this config via configuration inside the diagram as it is a secure config. +You have to call mermaid.initialize.`)}isLinkData(e){return e!==null&&typeof e=="object"&&"id"in e&&typeof e.id=="string"}addLink(e,i,r){let a=this.isLinkData(r)?r.id.replace("@",""):void 0;Z.info("addLink",e,i,a);for(let o of e)for(let d of i){let l=o===e[e.length-1],k=d===i[0];l&&k?this.addSingleLink(o,d,r,a):this.addSingleLink(o,d,r,void 0)}}updateLinkInterpolate(e,i){e.forEach(r=>{r==="default"?this.edges.defaultInterpolate=i:this.edges[r].interpolate=i})}updateLink(e,i){e.forEach(r=>{if(typeof r=="number"&&r>=this.edges.length)throw new Error(`The index ${r} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${this.edges.length-1}. (Help: Ensure that the index is within the range of existing edges.)`);r==="default"?this.edges.defaultStyle=i:(this.edges[r].style=i,(this.edges[r]?.style?.length??0)>0&&!this.edges[r]?.style?.some(a=>a?.startsWith("fill"))&&this.edges[r]?.style?.push("fill:none"))})}addClass(e,i){let r=i.join().replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");e.split(",").forEach(a=>{let o=this.classes.get(a);o===void 0&&(o={id:a,styles:[],textStyles:[]},this.classes.set(a,o)),r?.forEach(d=>{if(/color/.exec(d)){let l=d.replace("fill","bgFill");o.textStyles.push(l)}o.styles.push(d)})})}setDirection(e){this.direction=e.trim(),/.*/.exec(this.direction)&&(this.direction="LR"),/.*v/.exec(this.direction)&&(this.direction="TB"),this.direction==="TD"&&(this.direction="TB")}setClass(e,i){for(let r of e.split(",")){let a=this.vertices.get(r);a&&a.classes.push(i);let o=this.edges.find(l=>l.id===r);o&&o.classes.push(i);let d=this.subGraphLookup.get(r);d&&d.classes.push(i)}}setTooltip(e,i){if(i!==void 0){i=this.sanitizeText(i);for(let r of e.split(","))this.tooltips.set(this.version==="gen-1"?this.lookUpDomId(r):r,i)}}setClickFun(e,i,r){let a=this.lookUpDomId(e);if(de().securityLevel!=="loose"||i===void 0)return;let o=[];if(typeof r=="string"){o=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let l=0;l{let l=document.querySelector(`[id="${a}"]`);l!==null&&l.addEventListener("click",()=>{Qe.runFunc(i,...o)},!1)}))}setLink(e,i,r){e.split(",").forEach(a=>{let o=this.vertices.get(a);o!==void 0&&(o.link=Qe.formatUrl(i,this.config),o.linkTarget=r)}),this.setClass(e,"clickable")}getTooltip(e){return this.tooltips.get(e)}setClickEvent(e,i,r){e.split(",").forEach(a=>{this.setClickFun(a,i,r)}),this.setClass(e,"clickable")}bindFunctions(e){this.funs.forEach(i=>{i(e)})}getDirection(){return this.direction?.trim()}getVertices(){return this.vertices}getEdges(){return this.edges}getClasses(){return this.classes}setupToolTips(e){let i=ot();Ee(e).select("svg").selectAll("g.node").on("mouseover",o=>{let d=Ee(o.currentTarget),l=d.attr("title");if(l===null)return;let k=o.currentTarget?.getBoundingClientRect();i.transition().duration(200).style("opacity",".9"),i.text(d.attr("title")).style("left",window.scrollX+k.left+(k.right-k.left)/2+"px").style("top",window.scrollY+k.bottom+"px"),i.html(H1.sanitize(l)),d.classed("hover",!0)}).on("mouseout",o=>{i.transition().duration(500).style("opacity",0),Ee(o.currentTarget).classed("hover",!1)})}clear(e="gen-2"){this.vertices=new Map,this.classes=new Map,this.edges=[],this.funs=[this.setupToolTips.bind(this)],this.subGraphs=[],this.subGraphLookup=new Map,this.subCount=0,this.tooltips=new Map,this.firstGraphFlag=!0,this.version=e,this.config=de(),X1()}setGen(e){this.version=e||"gen-2"}defaultStyle(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"}addSubGraph(e,i,r){let a=e.text.trim(),o=r.text;e===r&&/\s/.exec(r.text)&&(a=void 0);let l=g(b=>{let D={boolean:{},number:{},string:{}},K=[],x;return{nodeList:b.filter(function(U){let J=typeof U;return U.stmt&&U.stmt==="dir"?(x=U.value,!1):U.trim()===""?!1:J in D?D[J].hasOwnProperty(U)?!1:D[J][U]=!0:K.includes(U)?!1:K.push(U)}),dir:x}},"uniq")(i.flat()),k=l.nodeList,n=l.dir,p=de().flowchart??{};if(n=n??(p.inheritDir?this.getDirection()??de().direction??void 0:void 0),this.version==="gen-1")for(let b=0;b2e3)return{result:!1,count:0};if(this.posCrossRef[this.secCount]=i,this.subGraphs[i].id===e)return{result:!0,count:0};let a=0,o=1;for(;a=0){let l=this.indexNodes2(e,d);if(l.result)return{result:!0,count:o+l.count};o=o+l.count}a=a+1}return{result:!1,count:o}}getDepthFirstPos(e){return this.posCrossRef[e]}indexNodes(){this.secCount=-1,this.subGraphs.length>0&&this.indexNodes2("none",this.subGraphs.length-1)}getSubGraphs(){return this.subGraphs}firstGraph(){return this.firstGraphFlag?(this.firstGraphFlag=!1,!0):!1}destructStartLink(e){let i=e.trim(),r="arrow_open";switch(i[0]){case"<":r="arrow_point",i=i.slice(1);break;case"x":r="arrow_cross",i=i.slice(1);break;case"o":r="arrow_circle",i=i.slice(1);break}let a="normal";return i.includes("=")&&(a="thick"),i.includes(".")&&(a="dotted"),{type:r,stroke:a}}countChar(e,i){let r=i.length,a=0;for(let o=0;o":a="arrow_point",i.startsWith("<")&&(a="double_"+a,r=r.slice(1));break;case"o":a="arrow_circle",i.startsWith("o")&&(a="double_"+a,r=r.slice(1));break}let o="normal",d=r.length-1;r.startsWith("=")&&(o="thick"),r.startsWith("~")&&(o="invisible");let l=this.countChar(".",r);return l&&(o="dotted",d=l),{type:a,stroke:o,length:d}}destructLink(e,i){let r=this.destructEndLink(e),a;if(i){if(a=this.destructStartLink(i),a.stroke!==r.stroke)return{type:"INVALID",stroke:"INVALID"};if(a.type==="arrow_open")a.type=r.type;else{if(a.type!==r.type)return{type:"INVALID",stroke:"INVALID"};a.type="double_"+a.type}return a.type==="double_arrow"&&(a.type="double_arrow_point"),a.length=r.length,a}return r}exists(e,i){for(let r of e)if(r.nodes.includes(i))return!0;return!1}makeUniq(e,i){let r=[];return e.nodes.forEach((a,o)=>{this.exists(i,a)||r.push(e.nodes[o])}),{nodes:r}}getTypeFromVertex(e){if(e.img)return"imageSquare";if(e.icon)return e.form==="circle"?"iconCircle":e.form==="square"?"iconSquare":e.form==="rounded"?"iconRounded":"icon";switch(e.type){case"square":case void 0:return"squareRect";case"round":return"roundedRect";case"ellipse":return"ellipse";default:return e.type}}findNode(e,i){return e.find(r=>r.id===i)}destructEdgeType(e){let i="none",r="arrow_point";switch(e){case"arrow_point":case"arrow_circle":case"arrow_cross":r=e;break;case"double_arrow_point":case"double_arrow_circle":case"double_arrow_cross":i=e.replace("double_",""),r=i;break}return{arrowTypeStart:i,arrowTypeEnd:r}}addNodeFromVertex(e,i,r,a,o,d){let l=r.get(e.id),k=a.get(e.id)??!1,n=this.findNode(i,e.id);if(n)n.cssStyles=e.styles,n.cssCompiledStyles=this.getCompiledStyles(e.classes),n.cssClasses=e.classes.join(" ");else{let p={id:e.id,label:e.text,labelType:e.labelType,labelStyle:"",parentId:l,padding:o.flowchart?.padding||8,cssStyles:e.styles,cssCompiledStyles:this.getCompiledStyles(["default","node",...e.classes]),cssClasses:"default "+e.classes.join(" "),dir:e.dir,domId:e.domId,look:d,link:e.link,linkTarget:e.linkTarget,tooltip:this.getTooltip(e.id),icon:e.icon,pos:e.pos,img:e.img,assetWidth:e.assetWidth,assetHeight:e.assetHeight,constraint:e.constraint};k?i.push(n1(a1({},p),{isGroup:!0,shape:"rect"})):i.push(n1(a1({},p),{isGroup:!1,shape:this.getTypeFromVertex(e)}))}}getCompiledStyles(e){let i=[];for(let r of e){let a=this.classes.get(r);a?.styles&&(i=[...i,...a.styles??[]].map(o=>o.trim())),a?.textStyles&&(i=[...i,...a.textStyles??[]].map(o=>o.trim()))}return i}getData(){let e=de(),i=[],r=[],a=this.getSubGraphs(),o=new Map,d=new Map;for(let n=a.length-1;n>=0;n--){let p=a[n];p.nodes.length>0&&d.set(p.id,!0);for(let S of p.nodes)o.set(S,p.id)}for(let n=a.length-1;n>=0;n--){let p=a[n];i.push({id:p.id,label:p.title,labelStyle:"",labelType:p.labelType,parentId:o.get(p.id),padding:8,cssCompiledStyles:this.getCompiledStyles(p.classes),cssClasses:p.classes.join(" "),shape:"rect",dir:p.dir,isGroup:!0,look:e.look})}this.getVertices().forEach(n=>{this.addNodeFromVertex(n,i,o,d,e,e.look||"classic")});let k=this.getEdges();return k.forEach((n,p)=>{let{arrowTypeStart:S,arrowTypeEnd:b}=this.destructEdgeType(n.type),D=[...k.defaultStyle??[]];n.style&&D.push(...n.style);let K={id:Je(n.start,n.end,{counter:p,prefix:"L"},n.id),isUserDefinedId:n.isUserDefinedId,start:n.start,end:n.end,type:n.type??"normal",label:n.text,labelType:n.labelType,labelpos:"c",thickness:n.stroke,minlen:n.length,classes:n?.stroke==="invisible"?"":"edge-thickness-normal edge-pattern-solid flowchart-link",arrowTypeStart:n?.stroke==="invisible"||n?.type==="arrow_open"?"none":S,arrowTypeEnd:n?.stroke==="invisible"||n?.type==="arrow_open"?"none":b,arrowheadStyle:"fill: #333",cssCompiledStyles:this.getCompiledStyles(n.classes),labelStyle:D,style:D,pattern:n.stroke,look:e.look,animate:n.animate,animation:n.animation,curve:n.interpolate||this.edges.defaultInterpolate||e.flowchart?.curve};r.push(K)}),{nodes:i,edges:r,other:{},config:e}}defaultConfig(){return st.flowchart}},Et=g(function(e,i){return i.db.getClasses()},"getClasses"),Dt=g(function(e,i,r,a){return j1(this,null,function*(){Z.info("REF0:"),Z.info("Drawing state diagram (v2)",i);let{securityLevel:o,flowchart:d,layout:l}=de(),k;o==="sandbox"&&(k=Ee("#i"+i));let n=o==="sandbox"?k.nodes()[0].contentDocument:document;Z.debug("Before getData: ");let p=a.db.getData();Z.debug("Data: ",p);let S=ct(i,o),b=a.db.getDirection();p.type=a.type,p.layoutAlgorithm=ut(l),p.layoutAlgorithm==="dagre"&&l==="elk"&&Z.warn("flowchart-elk was moved to an external package in Mermaid v11. Please refer [release notes](https://github.com/mermaid-js/mermaid/releases/tag/v11.0.0) for more details. This diagram will be rendered using `dagre` layout as a fallback."),p.direction=b,p.nodeSpacing=d?.nodeSpacing||50,p.rankSpacing=d?.rankSpacing||50,p.markers=["point","circle","cross"],p.diagramId=i,Z.debug("REF1:",p),yield nt(p,S);let D=p.config.flowchart?.diagramPadding??8;Qe.insertTitle(S,"flowchartTitleText",d?.titleTopMargin||0,a.db.getDiagramTitle()),ht(S,D,"flowchart",d?.useMaxWidth||!1);for(let K of p.nodes){let x=Ee(`#${i} [id="${K.id}"]`);if(!x||!K.link)continue;let _=n.createElementNS("http://www.w3.org/2000/svg","a");_.setAttributeNS("http://www.w3.org/2000/svg","class",K.cssClasses),_.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),o==="sandbox"?_.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):K.linkTarget&&_.setAttributeNS("http://www.w3.org/2000/svg","target",K.linkTarget);let U=x.insert(function(){return _},":first-child"),J=x.select(".label-container");J&&U.append(function(){return J.node()});let ke=x.select(".label");ke&&U.append(function(){return ke.node()})}})},"draw"),St={getClasses:Et,draw:Dt},o1=(function(){var e=g(function(be,c,h,f){for(h=h||{},f=be.length;f--;h[be[f]]=c);return h},"o"),i=[1,4],r=[1,3],a=[1,5],o=[1,8,9,10,11,27,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124,125],d=[2,2],l=[1,13],k=[1,14],n=[1,15],p=[1,16],S=[1,23],b=[1,25],D=[1,26],K=[1,27],x=[1,50],_=[1,49],U=[1,29],J=[1,30],ke=[1,31],Pe=[1,32],Oe=[1,33],L=[1,45],V=[1,47],w=[1,43],I=[1,48],R=[1,44],N=[1,51],G=[1,46],P=[1,52],O=[1,53],Me=[1,34],Ue=[1,35],ze=[1,36],We=[1,37],je=[1,38],pe=[1,58],T=[1,8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124,125],ee=[1,62],te=[1,61],se=[1,63],De=[8,9,11,75,77,78],l1=[1,79],Se=[1,92],Te=[1,97],xe=[1,96],ye=[1,93],Fe=[1,89],_e=[1,95],Be=[1,91],ve=[1,98],Le=[1,94],Ve=[1,99],we=[1,90],ge=[8,9,10,11,40,75,77,78],z=[8,9,10,11,40,46,75,77,78],H=[8,9,10,11,29,40,44,46,48,50,52,54,56,58,60,63,65,67,68,70,75,77,78,89,102,105,106,109,111,114,115,116],c1=[8,9,11,44,60,75,77,78,89,102,105,106,109,111,114,115,116],Ie=[44,60,89,102,105,106,109,111,114,115,116],h1=[1,122],d1=[1,123],Ke=[1,125],Ye=[1,124],p1=[44,60,62,74,89,102,105,106,109,111,114,115,116],f1=[1,134],b1=[1,148],k1=[1,149],g1=[1,150],A1=[1,151],m1=[1,136],C1=[1,138],E1=[1,142],D1=[1,143],S1=[1,144],T1=[1,145],x1=[1,146],y1=[1,147],F1=[1,152],_1=[1,153],B1=[1,132],v1=[1,133],L1=[1,140],V1=[1,135],w1=[1,139],I1=[1,137],Ze=[8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124,125],R1=[1,155],N1=[1,157],B=[8,9,11],q=[8,9,10,11,14,44,60,89,105,106,109,111,114,115,116],A=[1,177],W=[1,173],j=[1,174],m=[1,178],C=[1,175],E=[1,176],Re=[77,116,119],y=[8,9,10,11,12,14,27,29,32,44,60,75,84,85,86,87,88,89,90,105,109,111,114,115,116],G1=[10,106],fe=[31,49,51,53,55,57,62,64,66,67,69,71,116,117,118],ie=[1,248],re=[1,246],ae=[1,250],ne=[1,244],ue=[1,245],oe=[1,247],le=[1,249],ce=[1,251],Ne=[1,269],P1=[8,9,11,106],$=[8,9,10,11,60,84,105,106,109,110,111,112],$e={trace:g(function(){},"trace"),yy:{},symbols_:{error:2,start:3,graphConfig:4,document:5,line:6,statement:7,SEMI:8,NEWLINE:9,SPACE:10,EOF:11,GRAPH:12,NODIR:13,DIR:14,FirstStmtSeparator:15,ending:16,endToken:17,spaceList:18,spaceListNewline:19,vertexStatement:20,separator:21,styleStatement:22,linkStyleStatement:23,classDefStatement:24,classStatement:25,clickStatement:26,subgraph:27,textNoTags:28,SQS:29,text:30,SQE:31,end:32,direction:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,shapeData:39,SHAPE_DATA:40,link:41,node:42,styledVertex:43,AMP:44,vertex:45,STYLE_SEPARATOR:46,idString:47,DOUBLECIRCLESTART:48,DOUBLECIRCLEEND:49,PS:50,PE:51,"(-":52,"-)":53,STADIUMSTART:54,STADIUMEND:55,SUBROUTINESTART:56,SUBROUTINEEND:57,VERTEX_WITH_PROPS_START:58,"NODE_STRING[field]":59,COLON:60,"NODE_STRING[value]":61,PIPE:62,CYLINDERSTART:63,CYLINDEREND:64,DIAMOND_START:65,DIAMOND_STOP:66,TAGEND:67,TRAPSTART:68,TRAPEND:69,INVTRAPSTART:70,INVTRAPEND:71,linkStatement:72,arrowText:73,TESTSTR:74,START_LINK:75,edgeText:76,LINK:77,LINK_ID:78,edgeTextToken:79,STR:80,MD_STR:81,textToken:82,keywords:83,STYLE:84,LINKSTYLE:85,CLASSDEF:86,CLASS:87,CLICK:88,DOWN:89,UP:90,textNoTagsToken:91,stylesOpt:92,"idString[vertex]":93,"idString[class]":94,CALLBACKNAME:95,CALLBACKARGS:96,HREF:97,LINK_TARGET:98,"STR[link]":99,"STR[tooltip]":100,alphaNum:101,DEFAULT:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,NODE_STRING:109,UNIT:110,BRKT:111,PCT:112,idStringToken:113,MINUS:114,MULT:115,UNICODE_TEXT:116,TEXT:117,TAGSTART:118,EDGE_TEXT:119,alphaNumToken:120,direction_tb:121,direction_bt:122,direction_rl:123,direction_lr:124,direction_td:125,$accept:0,$end:1},terminals_:{2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"NODIR",14:"DIR",27:"subgraph",29:"SQS",31:"SQE",32:"end",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",40:"SHAPE_DATA",44:"AMP",46:"STYLE_SEPARATOR",48:"DOUBLECIRCLESTART",49:"DOUBLECIRCLEEND",50:"PS",51:"PE",52:"(-",53:"-)",54:"STADIUMSTART",55:"STADIUMEND",56:"SUBROUTINESTART",57:"SUBROUTINEEND",58:"VERTEX_WITH_PROPS_START",59:"NODE_STRING[field]",60:"COLON",61:"NODE_STRING[value]",62:"PIPE",63:"CYLINDERSTART",64:"CYLINDEREND",65:"DIAMOND_START",66:"DIAMOND_STOP",67:"TAGEND",68:"TRAPSTART",69:"TRAPEND",70:"INVTRAPSTART",71:"INVTRAPEND",74:"TESTSTR",75:"START_LINK",77:"LINK",78:"LINK_ID",80:"STR",81:"MD_STR",84:"STYLE",85:"LINKSTYLE",86:"CLASSDEF",87:"CLASS",88:"CLICK",89:"DOWN",90:"UP",93:"idString[vertex]",94:"idString[class]",95:"CALLBACKNAME",96:"CALLBACKARGS",97:"HREF",98:"LINK_TARGET",99:"STR[link]",100:"STR[tooltip]",102:"DEFAULT",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"NODE_STRING",110:"UNIT",111:"BRKT",112:"PCT",114:"MINUS",115:"MULT",116:"UNICODE_TEXT",117:"TEXT",118:"TAGSTART",119:"EDGE_TEXT",121:"direction_tb",122:"direction_bt",123:"direction_rl",124:"direction_lr",125:"direction_td"},productions_:[0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,2],[4,3],[16,2],[16,1],[17,1],[17,1],[17,1],[15,1],[15,1],[15,2],[19,2],[19,2],[19,1],[19,1],[18,2],[18,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[7,1],[7,2],[7,2],[7,1],[21,1],[21,1],[21,1],[39,2],[39,1],[20,4],[20,3],[20,4],[20,2],[20,2],[20,1],[42,1],[42,6],[42,5],[43,1],[43,3],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,8],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[41,2],[41,3],[41,3],[41,1],[41,3],[41,4],[76,1],[76,2],[76,1],[76,1],[72,1],[72,2],[73,3],[30,1],[30,2],[30,1],[30,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[28,1],[28,2],[28,1],[28,1],[24,5],[25,5],[26,2],[26,4],[26,3],[26,5],[26,3],[26,5],[26,5],[26,7],[26,2],[26,4],[26,2],[26,4],[26,4],[26,6],[22,5],[23,5],[23,5],[23,9],[23,9],[23,7],[23,7],[103,1],[103,3],[92,1],[92,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[82,1],[82,1],[82,1],[82,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[79,1],[79,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[47,1],[47,2],[101,1],[101,2],[33,1],[33,1],[33,1],[33,1],[33,1]],performAction:g(function(c,h,f,u,F,t,Ae){var s=t.length-1;switch(F){case 2:this.$=[];break;case 3:(!Array.isArray(t[s])||t[s].length>0)&&t[s-1].push(t[s]),this.$=t[s-1];break;case 4:case 183:this.$=t[s];break;case 11:u.setDirection("TB"),this.$="TB";break;case 12:u.setDirection(t[s-1]),this.$=t[s-1];break;case 27:this.$=t[s-1].nodes;break;case 28:case 29:case 30:case 31:case 32:this.$=[];break;case 33:this.$=u.addSubGraph(t[s-6],t[s-1],t[s-4]);break;case 34:this.$=u.addSubGraph(t[s-3],t[s-1],t[s-3]);break;case 35:this.$=u.addSubGraph(void 0,t[s-1],void 0);break;case 37:this.$=t[s].trim(),u.setAccTitle(this.$);break;case 38:case 39:this.$=t[s].trim(),u.setAccDescription(this.$);break;case 43:this.$=t[s-1]+t[s];break;case 44:this.$=t[s];break;case 45:u.addVertex(t[s-1][t[s-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,t[s]),u.addLink(t[s-3].stmt,t[s-1],t[s-2]),this.$={stmt:t[s-1],nodes:t[s-1].concat(t[s-3].nodes)};break;case 46:u.addLink(t[s-2].stmt,t[s],t[s-1]),this.$={stmt:t[s],nodes:t[s].concat(t[s-2].nodes)};break;case 47:u.addLink(t[s-3].stmt,t[s-1],t[s-2]),this.$={stmt:t[s-1],nodes:t[s-1].concat(t[s-3].nodes)};break;case 48:this.$={stmt:t[s-1],nodes:t[s-1]};break;case 49:u.addVertex(t[s-1][t[s-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,t[s]),this.$={stmt:t[s-1],nodes:t[s-1],shapeData:t[s]};break;case 50:this.$={stmt:t[s],nodes:t[s]};break;case 51:this.$=[t[s]];break;case 52:u.addVertex(t[s-5][t[s-5].length-1],void 0,void 0,void 0,void 0,void 0,void 0,t[s-4]),this.$=t[s-5].concat(t[s]);break;case 53:this.$=t[s-4].concat(t[s]);break;case 54:this.$=t[s];break;case 55:this.$=t[s-2],u.setClass(t[s-2],t[s]);break;case 56:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"square");break;case 57:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"doublecircle");break;case 58:this.$=t[s-5],u.addVertex(t[s-5],t[s-2],"circle");break;case 59:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"ellipse");break;case 60:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"stadium");break;case 61:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"subroutine");break;case 62:this.$=t[s-7],u.addVertex(t[s-7],t[s-1],"rect",void 0,void 0,void 0,Object.fromEntries([[t[s-5],t[s-3]]]));break;case 63:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"cylinder");break;case 64:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"round");break;case 65:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"diamond");break;case 66:this.$=t[s-5],u.addVertex(t[s-5],t[s-2],"hexagon");break;case 67:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"odd");break;case 68:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"trapezoid");break;case 69:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"inv_trapezoid");break;case 70:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"lean_right");break;case 71:this.$=t[s-3],u.addVertex(t[s-3],t[s-1],"lean_left");break;case 72:this.$=t[s],u.addVertex(t[s]);break;case 73:t[s-1].text=t[s],this.$=t[s-1];break;case 74:case 75:t[s-2].text=t[s-1],this.$=t[s-2];break;case 76:this.$=t[s];break;case 77:var v=u.destructLink(t[s],t[s-2]);this.$={type:v.type,stroke:v.stroke,length:v.length,text:t[s-1]};break;case 78:var v=u.destructLink(t[s],t[s-2]);this.$={type:v.type,stroke:v.stroke,length:v.length,text:t[s-1],id:t[s-3]};break;case 79:this.$={text:t[s],type:"text"};break;case 80:this.$={text:t[s-1].text+""+t[s],type:t[s-1].type};break;case 81:this.$={text:t[s],type:"string"};break;case 82:this.$={text:t[s],type:"markdown"};break;case 83:var v=u.destructLink(t[s]);this.$={type:v.type,stroke:v.stroke,length:v.length};break;case 84:var v=u.destructLink(t[s]);this.$={type:v.type,stroke:v.stroke,length:v.length,id:t[s-1]};break;case 85:this.$=t[s-1];break;case 86:this.$={text:t[s],type:"text"};break;case 87:this.$={text:t[s-1].text+""+t[s],type:t[s-1].type};break;case 88:this.$={text:t[s],type:"string"};break;case 89:case 104:this.$={text:t[s],type:"markdown"};break;case 101:this.$={text:t[s],type:"text"};break;case 102:this.$={text:t[s-1].text+""+t[s],type:t[s-1].type};break;case 103:this.$={text:t[s],type:"text"};break;case 105:this.$=t[s-4],u.addClass(t[s-2],t[s]);break;case 106:this.$=t[s-4],u.setClass(t[s-2],t[s]);break;case 107:case 115:this.$=t[s-1],u.setClickEvent(t[s-1],t[s]);break;case 108:case 116:this.$=t[s-3],u.setClickEvent(t[s-3],t[s-2]),u.setTooltip(t[s-3],t[s]);break;case 109:this.$=t[s-2],u.setClickEvent(t[s-2],t[s-1],t[s]);break;case 110:this.$=t[s-4],u.setClickEvent(t[s-4],t[s-3],t[s-2]),u.setTooltip(t[s-4],t[s]);break;case 111:this.$=t[s-2],u.setLink(t[s-2],t[s]);break;case 112:this.$=t[s-4],u.setLink(t[s-4],t[s-2]),u.setTooltip(t[s-4],t[s]);break;case 113:this.$=t[s-4],u.setLink(t[s-4],t[s-2],t[s]);break;case 114:this.$=t[s-6],u.setLink(t[s-6],t[s-4],t[s]),u.setTooltip(t[s-6],t[s-2]);break;case 117:this.$=t[s-1],u.setLink(t[s-1],t[s]);break;case 118:this.$=t[s-3],u.setLink(t[s-3],t[s-2]),u.setTooltip(t[s-3],t[s]);break;case 119:this.$=t[s-3],u.setLink(t[s-3],t[s-2],t[s]);break;case 120:this.$=t[s-5],u.setLink(t[s-5],t[s-4],t[s]),u.setTooltip(t[s-5],t[s-2]);break;case 121:this.$=t[s-4],u.addVertex(t[s-2],void 0,void 0,t[s]);break;case 122:this.$=t[s-4],u.updateLink([t[s-2]],t[s]);break;case 123:this.$=t[s-4],u.updateLink(t[s-2],t[s]);break;case 124:this.$=t[s-8],u.updateLinkInterpolate([t[s-6]],t[s-2]),u.updateLink([t[s-6]],t[s]);break;case 125:this.$=t[s-8],u.updateLinkInterpolate(t[s-6],t[s-2]),u.updateLink(t[s-6],t[s]);break;case 126:this.$=t[s-6],u.updateLinkInterpolate([t[s-4]],t[s]);break;case 127:this.$=t[s-6],u.updateLinkInterpolate(t[s-4],t[s]);break;case 128:case 130:this.$=[t[s]];break;case 129:case 131:t[s-2].push(t[s]),this.$=t[s-2];break;case 133:this.$=t[s-1]+t[s];break;case 181:this.$=t[s];break;case 182:this.$=t[s-1]+""+t[s];break;case 184:this.$=t[s-1]+""+t[s];break;case 185:this.$={stmt:"dir",value:"TB"};break;case 186:this.$={stmt:"dir",value:"BT"};break;case 187:this.$={stmt:"dir",value:"RL"};break;case 188:this.$={stmt:"dir",value:"LR"};break;case 189:this.$={stmt:"dir",value:"TD"};break}},"anonymous"),table:[{3:1,4:2,9:i,10:r,12:a},{1:[3]},e(o,d,{5:6}),{4:7,9:i,10:r,12:a},{4:8,9:i,10:r,12:a},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:l,9:k,10:n,11:p,20:17,22:18,23:19,24:20,25:21,26:22,27:S,33:24,34:b,36:D,38:K,42:28,43:39,44:x,45:40,47:41,60:_,84:U,85:J,86:ke,87:Pe,88:Oe,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O,121:Me,122:Ue,123:ze,124:We,125:je},e(o,[2,9]),e(o,[2,10]),e(o,[2,11]),{8:[1,55],9:[1,56],10:pe,15:54,18:57},e(T,[2,3]),e(T,[2,4]),e(T,[2,5]),e(T,[2,6]),e(T,[2,7]),e(T,[2,8]),{8:ee,9:te,11:se,21:59,41:60,72:64,75:[1,65],77:[1,67],78:[1,66]},{8:ee,9:te,11:se,21:68},{8:ee,9:te,11:se,21:69},{8:ee,9:te,11:se,21:70},{8:ee,9:te,11:se,21:71},{8:ee,9:te,11:se,21:72},{8:ee,9:te,10:[1,73],11:se,21:74},e(T,[2,36]),{35:[1,75]},{37:[1,76]},e(T,[2,39]),e(De,[2,50],{18:77,39:78,10:pe,40:l1}),{10:[1,80]},{10:[1,81]},{10:[1,82]},{10:[1,83]},{14:Se,44:Te,60:xe,80:[1,87],89:ye,95:[1,84],97:[1,85],101:86,105:Fe,106:_e,109:Be,111:ve,114:Le,115:Ve,116:we,120:88},e(T,[2,185]),e(T,[2,186]),e(T,[2,187]),e(T,[2,188]),e(T,[2,189]),e(ge,[2,51]),e(ge,[2,54],{46:[1,100]}),e(z,[2,72],{113:113,29:[1,101],44:x,48:[1,102],50:[1,103],52:[1,104],54:[1,105],56:[1,106],58:[1,107],60:_,63:[1,108],65:[1,109],67:[1,110],68:[1,111],70:[1,112],89:L,102:V,105:w,106:I,109:R,111:N,114:G,115:P,116:O}),e(H,[2,181]),e(H,[2,142]),e(H,[2,143]),e(H,[2,144]),e(H,[2,145]),e(H,[2,146]),e(H,[2,147]),e(H,[2,148]),e(H,[2,149]),e(H,[2,150]),e(H,[2,151]),e(H,[2,152]),e(o,[2,12]),e(o,[2,18]),e(o,[2,19]),{9:[1,114]},e(c1,[2,26],{18:115,10:pe}),e(T,[2,27]),{42:116,43:39,44:x,45:40,47:41,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},e(T,[2,40]),e(T,[2,41]),e(T,[2,42]),e(Ie,[2,76],{73:117,62:[1,119],74:[1,118]}),{76:120,79:121,80:h1,81:d1,116:Ke,119:Ye},{75:[1,126],77:[1,127]},e(p1,[2,83]),e(T,[2,28]),e(T,[2,29]),e(T,[2,30]),e(T,[2,31]),e(T,[2,32]),{10:f1,12:b1,14:k1,27:g1,28:128,32:A1,44:m1,60:C1,75:E1,80:[1,130],81:[1,131],83:141,84:D1,85:S1,86:T1,87:x1,88:y1,89:F1,90:_1,91:129,105:B1,109:v1,111:L1,114:V1,115:w1,116:I1},e(Ze,d,{5:154}),e(T,[2,37]),e(T,[2,38]),e(De,[2,48],{44:R1}),e(De,[2,49],{18:156,10:pe,40:N1}),e(ge,[2,44]),{44:x,47:158,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},{102:[1,159],103:160,105:[1,161]},{44:x,47:162,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},{44:x,47:163,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},e(B,[2,107],{10:[1,164],96:[1,165]}),{80:[1,166]},e(B,[2,115],{120:168,10:[1,167],14:Se,44:Te,60:xe,89:ye,105:Fe,106:_e,109:Be,111:ve,114:Le,115:Ve,116:we}),e(B,[2,117],{10:[1,169]}),e(q,[2,183]),e(q,[2,170]),e(q,[2,171]),e(q,[2,172]),e(q,[2,173]),e(q,[2,174]),e(q,[2,175]),e(q,[2,176]),e(q,[2,177]),e(q,[2,178]),e(q,[2,179]),e(q,[2,180]),{44:x,47:170,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},{30:171,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:179,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:181,50:[1,180],67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:182,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:183,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:184,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{109:[1,185]},{30:186,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:187,65:[1,188],67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:189,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:190,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{30:191,67:A,80:W,81:j,82:172,116:m,117:C,118:E},e(H,[2,182]),e(o,[2,20]),e(c1,[2,25]),e(De,[2,46],{39:192,18:193,10:pe,40:l1}),e(Ie,[2,73],{10:[1,194]}),{10:[1,195]},{30:196,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{77:[1,197],79:198,116:Ke,119:Ye},e(Re,[2,79]),e(Re,[2,81]),e(Re,[2,82]),e(Re,[2,168]),e(Re,[2,169]),{76:199,79:121,80:h1,81:d1,116:Ke,119:Ye},e(p1,[2,84]),{8:ee,9:te,10:f1,11:se,12:b1,14:k1,21:201,27:g1,29:[1,200],32:A1,44:m1,60:C1,75:E1,83:141,84:D1,85:S1,86:T1,87:x1,88:y1,89:F1,90:_1,91:202,105:B1,109:v1,111:L1,114:V1,115:w1,116:I1},e(y,[2,101]),e(y,[2,103]),e(y,[2,104]),e(y,[2,157]),e(y,[2,158]),e(y,[2,159]),e(y,[2,160]),e(y,[2,161]),e(y,[2,162]),e(y,[2,163]),e(y,[2,164]),e(y,[2,165]),e(y,[2,166]),e(y,[2,167]),e(y,[2,90]),e(y,[2,91]),e(y,[2,92]),e(y,[2,93]),e(y,[2,94]),e(y,[2,95]),e(y,[2,96]),e(y,[2,97]),e(y,[2,98]),e(y,[2,99]),e(y,[2,100]),{6:11,7:12,8:l,9:k,10:n,11:p,20:17,22:18,23:19,24:20,25:21,26:22,27:S,32:[1,203],33:24,34:b,36:D,38:K,42:28,43:39,44:x,45:40,47:41,60:_,84:U,85:J,86:ke,87:Pe,88:Oe,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O,121:Me,122:Ue,123:ze,124:We,125:je},{10:pe,18:204},{44:[1,205]},e(ge,[2,43]),{10:[1,206],44:x,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:113,114:G,115:P,116:O},{10:[1,207]},{10:[1,208],106:[1,209]},e(G1,[2,128]),{10:[1,210],44:x,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:113,114:G,115:P,116:O},{10:[1,211],44:x,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:113,114:G,115:P,116:O},{80:[1,212]},e(B,[2,109],{10:[1,213]}),e(B,[2,111],{10:[1,214]}),{80:[1,215]},e(q,[2,184]),{80:[1,216],98:[1,217]},e(ge,[2,55],{113:113,44:x,60:_,89:L,102:V,105:w,106:I,109:R,111:N,114:G,115:P,116:O}),{31:[1,218],67:A,82:219,116:m,117:C,118:E},e(fe,[2,86]),e(fe,[2,88]),e(fe,[2,89]),e(fe,[2,153]),e(fe,[2,154]),e(fe,[2,155]),e(fe,[2,156]),{49:[1,220],67:A,82:219,116:m,117:C,118:E},{30:221,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{51:[1,222],67:A,82:219,116:m,117:C,118:E},{53:[1,223],67:A,82:219,116:m,117:C,118:E},{55:[1,224],67:A,82:219,116:m,117:C,118:E},{57:[1,225],67:A,82:219,116:m,117:C,118:E},{60:[1,226]},{64:[1,227],67:A,82:219,116:m,117:C,118:E},{66:[1,228],67:A,82:219,116:m,117:C,118:E},{30:229,67:A,80:W,81:j,82:172,116:m,117:C,118:E},{31:[1,230],67:A,82:219,116:m,117:C,118:E},{67:A,69:[1,231],71:[1,232],82:219,116:m,117:C,118:E},{67:A,69:[1,234],71:[1,233],82:219,116:m,117:C,118:E},e(De,[2,45],{18:156,10:pe,40:N1}),e(De,[2,47],{44:R1}),e(Ie,[2,75]),e(Ie,[2,74]),{62:[1,235],67:A,82:219,116:m,117:C,118:E},e(Ie,[2,77]),e(Re,[2,80]),{77:[1,236],79:198,116:Ke,119:Ye},{30:237,67:A,80:W,81:j,82:172,116:m,117:C,118:E},e(Ze,d,{5:238}),e(y,[2,102]),e(T,[2,35]),{43:239,44:x,45:40,47:41,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},{10:pe,18:240},{10:ie,60:re,84:ae,92:241,105:ne,107:242,108:243,109:ue,110:oe,111:le,112:ce},{10:ie,60:re,84:ae,92:252,104:[1,253],105:ne,107:242,108:243,109:ue,110:oe,111:le,112:ce},{10:ie,60:re,84:ae,92:254,104:[1,255],105:ne,107:242,108:243,109:ue,110:oe,111:le,112:ce},{105:[1,256]},{10:ie,60:re,84:ae,92:257,105:ne,107:242,108:243,109:ue,110:oe,111:le,112:ce},{44:x,47:258,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},e(B,[2,108]),{80:[1,259]},{80:[1,260],98:[1,261]},e(B,[2,116]),e(B,[2,118],{10:[1,262]}),e(B,[2,119]),e(z,[2,56]),e(fe,[2,87]),e(z,[2,57]),{51:[1,263],67:A,82:219,116:m,117:C,118:E},e(z,[2,64]),e(z,[2,59]),e(z,[2,60]),e(z,[2,61]),{109:[1,264]},e(z,[2,63]),e(z,[2,65]),{66:[1,265],67:A,82:219,116:m,117:C,118:E},e(z,[2,67]),e(z,[2,68]),e(z,[2,70]),e(z,[2,69]),e(z,[2,71]),e([10,44,60,89,102,105,106,109,111,114,115,116],[2,85]),e(Ie,[2,78]),{31:[1,266],67:A,82:219,116:m,117:C,118:E},{6:11,7:12,8:l,9:k,10:n,11:p,20:17,22:18,23:19,24:20,25:21,26:22,27:S,32:[1,267],33:24,34:b,36:D,38:K,42:28,43:39,44:x,45:40,47:41,60:_,84:U,85:J,86:ke,87:Pe,88:Oe,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O,121:Me,122:Ue,123:ze,124:We,125:je},e(ge,[2,53]),{43:268,44:x,45:40,47:41,60:_,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O},e(B,[2,121],{106:Ne}),e(P1,[2,130],{108:270,10:ie,60:re,84:ae,105:ne,109:ue,110:oe,111:le,112:ce}),e($,[2,132]),e($,[2,134]),e($,[2,135]),e($,[2,136]),e($,[2,137]),e($,[2,138]),e($,[2,139]),e($,[2,140]),e($,[2,141]),e(B,[2,122],{106:Ne}),{10:[1,271]},e(B,[2,123],{106:Ne}),{10:[1,272]},e(G1,[2,129]),e(B,[2,105],{106:Ne}),e(B,[2,106],{113:113,44:x,60:_,89:L,102:V,105:w,106:I,109:R,111:N,114:G,115:P,116:O}),e(B,[2,110]),e(B,[2,112],{10:[1,273]}),e(B,[2,113]),{98:[1,274]},{51:[1,275]},{62:[1,276]},{66:[1,277]},{8:ee,9:te,11:se,21:278},e(T,[2,34]),e(ge,[2,52]),{10:ie,60:re,84:ae,105:ne,107:279,108:243,109:ue,110:oe,111:le,112:ce},e($,[2,133]),{14:Se,44:Te,60:xe,89:ye,101:280,105:Fe,106:_e,109:Be,111:ve,114:Le,115:Ve,116:we,120:88},{14:Se,44:Te,60:xe,89:ye,101:281,105:Fe,106:_e,109:Be,111:ve,114:Le,115:Ve,116:we,120:88},{98:[1,282]},e(B,[2,120]),e(z,[2,58]),{30:283,67:A,80:W,81:j,82:172,116:m,117:C,118:E},e(z,[2,66]),e(Ze,d,{5:284}),e(P1,[2,131],{108:270,10:ie,60:re,84:ae,105:ne,109:ue,110:oe,111:le,112:ce}),e(B,[2,126],{120:168,10:[1,285],14:Se,44:Te,60:xe,89:ye,105:Fe,106:_e,109:Be,111:ve,114:Le,115:Ve,116:we}),e(B,[2,127],{120:168,10:[1,286],14:Se,44:Te,60:xe,89:ye,105:Fe,106:_e,109:Be,111:ve,114:Le,115:Ve,116:we}),e(B,[2,114]),{31:[1,287],67:A,82:219,116:m,117:C,118:E},{6:11,7:12,8:l,9:k,10:n,11:p,20:17,22:18,23:19,24:20,25:21,26:22,27:S,32:[1,288],33:24,34:b,36:D,38:K,42:28,43:39,44:x,45:40,47:41,60:_,84:U,85:J,86:ke,87:Pe,88:Oe,89:L,102:V,105:w,106:I,109:R,111:N,113:42,114:G,115:P,116:O,121:Me,122:Ue,123:ze,124:We,125:je},{10:ie,60:re,84:ae,92:289,105:ne,107:242,108:243,109:ue,110:oe,111:le,112:ce},{10:ie,60:re,84:ae,92:290,105:ne,107:242,108:243,109:ue,110:oe,111:le,112:ce},e(z,[2,62]),e(T,[2,33]),e(B,[2,124],{106:Ne}),e(B,[2,125],{106:Ne})],defaultActions:{},parseError:g(function(c,h){if(h.recoverable)this.trace(c);else{var f=new Error(c);throw f.hash=h,f}},"parseError"),parse:g(function(c){var h=this,f=[0],u=[],F=[null],t=[],Ae=this.table,s="",v=0,O1=0,M1=0,bt=2,U1=1,kt=t.slice.call(arguments,1),M=Object.create(this.lexer),me={yy:{}};for(var e1 in this.yy)Object.prototype.hasOwnProperty.call(this.yy,e1)&&(me.yy[e1]=this.yy[e1]);M.setInput(c,me.yy),me.yy.lexer=M,me.yy.parser=this,typeof M.yylloc>"u"&&(M.yylloc={});var t1=M.yylloc;t.push(t1);var gt=M.options&&M.options.ranges;typeof me.yy.parseError=="function"?this.parseError=me.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function At(X){f.length=f.length-2*X,F.length=F.length-X,t.length=t.length-X}g(At,"popStack");function z1(){var X;return X=u.pop()||M.lex()||U1,typeof X!="number"&&(X instanceof Array&&(u=X,X=u.pop()),X=h.symbols_[X]||X),X}g(z1,"lex");for(var Y,s1,Ce,Q,_t,i1,Ge={},qe,he,W1,Xe;;){if(Ce=f[f.length-1],this.defaultActions[Ce]?Q=this.defaultActions[Ce]:((Y===null||typeof Y>"u")&&(Y=z1()),Q=Ae[Ce]&&Ae[Ce][Y]),typeof Q>"u"||!Q.length||!Q[0]){var r1="";Xe=[];for(qe in Ae[Ce])this.terminals_[qe]&&qe>bt&&Xe.push("'"+this.terminals_[qe]+"'");M.showPosition?r1="Parse error on line "+(v+1)+`: +`+M.showPosition()+` +Expecting `+Xe.join(", ")+", got '"+(this.terminals_[Y]||Y)+"'":r1="Parse error on line "+(v+1)+": Unexpected "+(Y==U1?"end of input":"'"+(this.terminals_[Y]||Y)+"'"),this.parseError(r1,{text:M.match,token:this.terminals_[Y]||Y,line:M.yylineno,loc:t1,expected:Xe})}if(Q[0]instanceof Array&&Q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Ce+", token: "+Y);switch(Q[0]){case 1:f.push(Y),F.push(M.yytext),t.push(M.yylloc),f.push(Q[1]),Y=null,s1?(Y=s1,s1=null):(O1=M.yyleng,s=M.yytext,v=M.yylineno,t1=M.yylloc,M1>0&&M1--);break;case 2:if(he=this.productions_[Q[1]][1],Ge.$=F[F.length-he],Ge._$={first_line:t[t.length-(he||1)].first_line,last_line:t[t.length-1].last_line,first_column:t[t.length-(he||1)].first_column,last_column:t[t.length-1].last_column},gt&&(Ge._$.range=[t[t.length-(he||1)].range[0],t[t.length-1].range[1]]),i1=this.performAction.apply(Ge,[s,O1,v,me.yy,Q[1],F,t].concat(kt)),typeof i1<"u")return i1;he&&(f=f.slice(0,-1*he*2),F=F.slice(0,-1*he),t=t.slice(0,-1*he)),f.push(this.productions_[Q[1]][0]),F.push(Ge.$),t.push(Ge._$),W1=Ae[f[f.length-2]][f[f.length-1]],f.push(W1);break;case 3:return!0}}return!0},"parse")},ft=(function(){var be={EOF:1,parseError:g(function(h,f){if(this.yy.parser)this.yy.parser.parseError(h,f);else throw new Error(h)},"parseError"),setInput:g(function(c,h){return this.yy=h||this.yy||{},this._input=c,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:g(function(){var c=this._input[0];this.yytext+=c,this.yyleng++,this.offset++,this.match+=c,this.matched+=c;var h=c.match(/(?:\r\n?|\n).*/g);return h?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),c},"input"),unput:g(function(c){var h=c.length,f=c.split(/(?:\r\n?|\n)/g);this._input=c+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-h),this.offset-=h;var u=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),f.length-1&&(this.yylineno-=f.length-1);var F=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:f?(f.length===u.length?this.yylloc.first_column:0)+u[u.length-f.length].length-f[0].length:this.yylloc.first_column-h},this.options.ranges&&(this.yylloc.range=[F[0],F[0]+this.yyleng-h]),this.yyleng=this.yytext.length,this},"unput"),more:g(function(){return this._more=!0,this},"more"),reject:g(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:g(function(c){this.unput(this.match.slice(c))},"less"),pastInput:g(function(){var c=this.matched.substr(0,this.matched.length-this.match.length);return(c.length>20?"...":"")+c.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:g(function(){var c=this.match;return c.length<20&&(c+=this._input.substr(0,20-c.length)),(c.substr(0,20)+(c.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:g(function(){var c=this.pastInput(),h=new Array(c.length+1).join("-");return c+this.upcomingInput()+` +`+h+"^"},"showPosition"),test_match:g(function(c,h){var f,u,F;if(this.options.backtrack_lexer&&(F={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(F.yylloc.range=this.yylloc.range.slice(0))),u=c[0].match(/(?:\r\n?|\n).*/g),u&&(this.yylineno+=u.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:u?u[u.length-1].length-u[u.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+c[0].length},this.yytext+=c[0],this.match+=c[0],this.matches=c,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(c[0].length),this.matched+=c[0],f=this.performAction.call(this,this.yy,this,h,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),f)return f;if(this._backtrack){for(var t in F)this[t]=F[t];return!1}return!1},"test_match"),next:g(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var c,h,f,u;this._more||(this.yytext="",this.match="");for(var F=this._currentRules(),t=0;th[0].length)){if(h=f,u=t,this.options.backtrack_lexer){if(c=this.test_match(f,F[t]),c!==!1)return c;if(this._backtrack){h=!1;continue}else return!1}else if(!this.options.flex)break}return h?(c=this.test_match(h,F[u]),c!==!1?c:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:g(function(){var h=this.next();return h||this.lex()},"lex"),begin:g(function(h){this.conditionStack.push(h)},"begin"),popState:g(function(){var h=this.conditionStack.length-1;return h>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:g(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:g(function(h){return h=this.conditionStack.length-1-Math.abs(h||0),h>=0?this.conditionStack[h]:"INITIAL"},"topState"),pushState:g(function(h){this.begin(h)},"pushState"),stateStackSize:g(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:g(function(h,f,u,F){var t=F;switch(u){case 0:return this.begin("acc_title"),34;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),36;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.pushState("shapeData"),f.yytext="",40;break;case 8:return this.pushState("shapeDataStr"),40;break;case 9:return this.popState(),40;break;case 10:let Ae=/\n\s*/g;return f.yytext=f.yytext.replace(Ae,"
        "),40;break;case 11:return 40;case 12:this.popState();break;case 13:this.begin("callbackname");break;case 14:this.popState();break;case 15:this.popState(),this.begin("callbackargs");break;case 16:return 95;case 17:this.popState();break;case 18:return 96;case 19:return"MD_STR";case 20:this.popState();break;case 21:this.begin("md_string");break;case 22:return"STR";case 23:this.popState();break;case 24:this.pushState("string");break;case 25:return 84;case 26:return 102;case 27:return 85;case 28:return 104;case 29:return 86;case 30:return 87;case 31:return 97;case 32:this.begin("click");break;case 33:this.popState();break;case 34:return 88;case 35:return h.lex.firstGraph()&&this.begin("dir"),12;break;case 36:return h.lex.firstGraph()&&this.begin("dir"),12;break;case 37:return h.lex.firstGraph()&&this.begin("dir"),12;break;case 38:return 27;case 39:return 32;case 40:return 98;case 41:return 98;case 42:return 98;case 43:return 98;case 44:return this.popState(),13;break;case 45:return this.popState(),14;break;case 46:return this.popState(),14;break;case 47:return this.popState(),14;break;case 48:return this.popState(),14;break;case 49:return this.popState(),14;break;case 50:return this.popState(),14;break;case 51:return this.popState(),14;break;case 52:return this.popState(),14;break;case 53:return this.popState(),14;break;case 54:return this.popState(),14;break;case 55:return 121;case 56:return 122;case 57:return 123;case 58:return 124;case 59:return 125;case 60:return 78;case 61:return 105;case 62:return 111;case 63:return 46;case 64:return 60;case 65:return 44;case 66:return 8;case 67:return 106;case 68:return 115;case 69:return this.popState(),77;break;case 70:return this.pushState("edgeText"),75;break;case 71:return 119;case 72:return this.popState(),77;break;case 73:return this.pushState("thickEdgeText"),75;break;case 74:return 119;case 75:return this.popState(),77;break;case 76:return this.pushState("dottedEdgeText"),75;break;case 77:return 119;case 78:return 77;case 79:return this.popState(),53;break;case 80:return"TEXT";case 81:return this.pushState("ellipseText"),52;break;case 82:return this.popState(),55;break;case 83:return this.pushState("text"),54;break;case 84:return this.popState(),57;break;case 85:return this.pushState("text"),56;break;case 86:return 58;case 87:return this.pushState("text"),67;break;case 88:return this.popState(),64;break;case 89:return this.pushState("text"),63;break;case 90:return this.popState(),49;break;case 91:return this.pushState("text"),48;break;case 92:return this.popState(),69;break;case 93:return this.popState(),71;break;case 94:return 117;case 95:return this.pushState("trapText"),68;break;case 96:return this.pushState("trapText"),70;break;case 97:return 118;case 98:return 67;case 99:return 90;case 100:return"SEP";case 101:return 89;case 102:return 115;case 103:return 111;case 104:return 44;case 105:return 109;case 106:return 114;case 107:return 116;case 108:return this.popState(),62;break;case 109:return this.pushState("text"),62;break;case 110:return this.popState(),51;break;case 111:return this.pushState("text"),50;break;case 112:return this.popState(),31;break;case 113:return this.pushState("text"),29;break;case 114:return this.popState(),66;break;case 115:return this.pushState("text"),65;break;case 116:return"TEXT";case 117:return"QUOTE";case 118:return 9;case 119:return 10;case 120:return 11}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:@\{)/,/^(?:["])/,/^(?:["])/,/^(?:[^\"]+)/,/^(?:[^}^"]+)/,/^(?:\})/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["][`])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:["])/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s])/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:.*direction\s+TD[^\n]*)/,/^(?:[^\s\"]+@(?=[^\{\"]))/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:[^-]|-(?!-)+)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:[^=]|=(?!))/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:[^\.]|\.(?!))/,/^(?:\s*~~[\~]+\s*)/,/^(?:[-/\)][\)])/,/^(?:[^\(\)\[\]\{\}]|!\)+)/,/^(?:\(-)/,/^(?:\]\))/,/^(?:\(\[)/,/^(?:\]\])/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:>)/,/^(?:\)\])/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\(\(\()/,/^(?:[\\(?=\])][\]])/,/^(?:\/(?=\])\])/,/^(?:\/(?!\])|\\(?!\])|[^\\\[\]\(\)\{\}\/]+)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:\*)/,/^(?:#)/,/^(?:&)/,/^(?:([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|-(?=[^\>\-\.])|(?!))+)/,/^(?:-)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\|)/,/^(?:\))/,/^(?:\()/,/^(?:\])/,/^(?:\[)/,/^(?:(\}))/,/^(?:\{)/,/^(?:[^\[\]\(\)\{\}\|\"]+)/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{shapeDataEndBracket:{rules:[21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},shapeDataStr:{rules:[9,10,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},shapeData:{rules:[8,11,12,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},callbackargs:{rules:[17,18,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},callbackname:{rules:[14,15,16,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},href:{rules:[21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},click:{rules:[21,24,33,34,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},dottedEdgeText:{rules:[21,24,75,77,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},thickEdgeText:{rules:[21,24,72,74,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},edgeText:{rules:[21,24,69,71,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},trapText:{rules:[21,24,78,81,83,85,89,91,92,93,94,95,96,109,111,113,115],inclusive:!1},ellipseText:{rules:[21,24,78,79,80,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},text:{rules:[21,24,78,81,82,83,84,85,88,89,90,91,95,96,108,109,110,111,112,113,114,115,116],inclusive:!1},vertex:{rules:[21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},dir:{rules:[21,24,44,45,46,47,48,49,50,51,52,53,54,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},acc_descr_multiline:{rules:[5,6,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},acc_descr:{rules:[3,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},acc_title:{rules:[1,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},md_string:{rules:[19,20,21,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},string:{rules:[21,22,23,24,78,81,83,85,89,91,95,96,109,111,113,115],inclusive:!1},INITIAL:{rules:[0,2,4,7,13,21,24,25,26,27,28,29,30,31,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,72,73,75,76,78,81,83,85,86,87,89,91,95,96,97,98,99,100,101,102,103,104,105,106,107,109,111,113,115,117,118,119,120],inclusive:!0}}};return be})();$e.lexer=ft;function He(){this.yy={}}return g(He,"Parser"),He.prototype=$e,$e.Parser=He,new He})();o1.parser=o1;var dt=o1,pt=Object.assign({},dt);pt.parse=e=>{let i=e.replace(/}\s*\n/g,`} +`);return dt.parse(i)};var Tt=pt,xt=g((e,i)=>{let r=Y1,a=r(e,"r"),o=r(e,"g"),d=r(e,"b");return K1(a,o,d,i)},"fade"),yt=g(e=>`.label { + font-family: ${e.fontFamily}; + color: ${e.nodeTextColor||e.textColor}; + } + .cluster-label text { + fill: ${e.titleColor}; + } + .cluster-label span { + color: ${e.titleColor}; + } + .cluster-label span p { + background-color: transparent; + } + + .label text,span { + fill: ${e.nodeTextColor||e.textColor}; + color: ${e.nodeTextColor||e.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${e.mainBkg}; + stroke: ${e.nodeBorder}; + stroke-width: 1px; + } + .rough-node .label text , .node .label text, .image-shape .label, .icon-shape .label { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .katex path { + fill: #000; + stroke: #000; + stroke-width: 1px; + } + + .rough-node .label,.node .label, .image-shape .label, .icon-shape .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + + .root .anchor path { + fill: ${e.lineColor} !important; + stroke-width: 0; + stroke: ${e.lineColor}; + } + + .arrowheadPath { + fill: ${e.arrowheadColor}; + } + + .edgePath .path { + stroke: ${e.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${e.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${e.edgeLabelBackground}; + p { + background-color: ${e.edgeLabelBackground}; + } + rect { + opacity: 0.5; + background-color: ${e.edgeLabelBackground}; + fill: ${e.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${xt(e.edgeLabelBackground,.5)}; + // background-color: + } + + .cluster rect { + fill: ${e.clusterBkg}; + stroke: ${e.clusterBorder}; + stroke-width: 1px; + } + + .cluster text { + fill: ${e.titleColor}; + } + + .cluster span { + color: ${e.titleColor}; + } + /* .cluster div { + color: ${e.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${e.fontFamily}; + font-size: 12px; + background: ${e.tertiaryColor}; + border: 1px solid ${e.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${e.textColor}; + } + + rect.text { + fill: none; + stroke-width: 0; + } + + .icon-shape, .image-shape { + background-color: ${e.edgeLabelBackground}; + p { + background-color: ${e.edgeLabelBackground}; + padding: 2px; + } + .label rect { + opacity: 0.5; + background-color: ${e.edgeLabelBackground}; + fill: ${e.edgeLabelBackground}; + } + text-align: center; + } + ${lt()} +`,"getStyles"),Ft=yt,qt={parser:Tt,get db(){return new Ct},renderer:St,styles:Ft,init:g(e=>{e.flowchart||(e.flowchart={}),e.layout&&u1({layout:e.layout}),e.flowchart.arrowMarkerAbsolute=e.arrowMarkerAbsolute,u1({flowchart:{arrowMarkerAbsolute:e.arrowMarkerAbsolute}})},"init")};export{qt as diagram}; diff --git a/src/google/adk/cli/browser/chunk-RMXJBC7V.js b/src/google/adk/cli/browser/chunk-RMXJBC7V.js new file mode 100644 index 0000000000..ae85e2370c --- /dev/null +++ b/src/google/adk/cli/browser/chunk-RMXJBC7V.js @@ -0,0 +1 @@ +var r=Object.create;var j=Object.defineProperty,s=Object.defineProperties,t=Object.getOwnPropertyDescriptor,u=Object.getOwnPropertyDescriptors,v=Object.getOwnPropertyNames,k=Object.getOwnPropertySymbols,w=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,q=Object.prototype.propertyIsEnumerable;var n=(b,a)=>(a=Symbol[b])?a:Symbol.for("Symbol."+b),x=b=>{throw TypeError(b)};var p=(b,a,c)=>a in b?j(b,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):b[a]=c,z=(b,a)=>{for(var c in a||={})o.call(a,c)&&p(b,c,a[c]);if(k)for(var c of k(a))q.call(a,c)&&p(b,c,a[c]);return b},A=(b,a)=>s(b,u(a));var B=(b,a)=>{var c={};for(var d in b)o.call(b,d)&&a.indexOf(d)<0&&(c[d]=b[d]);if(b!=null&&k)for(var d of k(b))a.indexOf(d)<0&&q.call(b,d)&&(c[d]=b[d]);return c};var C=(b,a)=>()=>(b&&(a=b(b=0)),a);var D=(b,a)=>()=>(a||b((a={exports:{}}).exports,a),a.exports),E=(b,a)=>{for(var c in a)j(b,c,{get:a[c],enumerable:!0})},l=(b,a,c,d)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of v(a))!o.call(b,e)&&e!==c&&j(b,e,{get:()=>a[e],enumerable:!(d=t(a,e))||d.enumerable});return b},F=(b,a,c)=>(l(b,a,"default"),c&&l(c,a,"default")),G=(b,a,c)=>(c=b!=null?r(w(b)):{},l(a||!b||!b.__esModule?j(c,"default",{value:b,enumerable:!0}):c,b)),H=b=>l(j({},"__esModule",{value:!0}),b);var I=(b,a,c)=>new Promise((d,e)=>{var f=g=>{try{i(c.next(g))}catch(m){e(m)}},h=g=>{try{i(c.throw(g))}catch(m){e(m)}},i=g=>g.done?d(g.value):Promise.resolve(g.value).then(f,h);i((c=c.apply(b,a)).next())}),y=function(b,a){this[0]=b,this[1]=a};var J=b=>{var a=b[n("asyncIterator")],c=!1,d,e={};return a==null?(a=b[n("iterator")](),d=f=>e[f]=h=>a[f](h)):(a=a.call(b),d=f=>e[f]=h=>{if(c){if(c=!1,f==="throw")throw h;return h}return c=!0,{done:!1,value:new y(new Promise(i=>{var g=a[f](h);g instanceof Object||x("Object expected"),i(g)}),1)}}),e[n("iterator")]=()=>e,d("next"),"throw"in a?d("throw"):e.throw=f=>{throw f},"return"in a&&d("return"),e};export{z as a,A as b,B as c,C as d,D as e,E as f,F as g,G as h,H as i,I as j,J as k}; diff --git a/src/google/adk/cli/browser/chunk-S22PTQH2.js b/src/google/adk/cli/browser/chunk-S22PTQH2.js new file mode 100644 index 0000000000..fad4a761c9 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-S22PTQH2.js @@ -0,0 +1,73 @@ +import{a as st}from"./chunk-APNCZOFE.js";import{a as it}from"./chunk-ST54LLJ3.js";import{b as et,c as tt}from"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import{m as Ze}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{R as Ke,S as We,T as je,U as Ge,V as ze,W as Xe,X as Je,Y as ge}from"./chunk-QFMJV7VH.js";import{g as o,h as He,i as ke}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{j as Qe}from"./chunk-RMXJBC7V.js";var Ae=(function(){var e=o(function(P,i,a,c){for(a=a||{},c=P.length;c--;a[P[c]]=i);return a},"o"),f=[1,3],h=[1,4],r=[1,5],n=[1,6],d=[5,6,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],k=[1,22],b=[2,7],g=[1,26],S=[1,27],N=[1,28],q=[1,29],A=[1,33],C=[1,34],V=[1,35],v=[1,36],x=[1,37],L=[1,38],w=[1,24],D=[1,31],O=[1,32],M=[1,30],E=[1,39],p=[1,40],m=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],$=[1,61],X=[89,90],Ce=[5,8,9,11,13,21,22,23,24,27,29,41,42,43,44,45,46,54,61,63,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],de=[27,29],Ve=[1,70],ve=[1,71],xe=[1,72],Le=[1,73],we=[1,74],De=[1,75],Oe=[1,76],Z=[1,83],U=[1,80],ee=[1,84],te=[1,85],se=[1,86],ie=[1,87],re=[1,88],ne=[1,89],ae=[1,90],le=[1,91],ce=[1,92],Ee=[5,8,9,11,13,21,22,23,24,27,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],Y=[63,64],Me=[1,101],Fe=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,76,77,89,90],I=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],B=[1,110],Q=[1,106],H=[1,107],K=[1,108],W=[1,109],j=[1,111],oe=[1,116],he=[1,117],ue=[1,114],fe=[1,115],_e={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,acc_title:9,acc_title_value:10,acc_descr:11,acc_descr_value:12,acc_descr_multiline_value:13,requirementDef:14,elementDef:15,relationshipDef:16,direction:17,styleStatement:18,classDefStatement:19,classStatement:20,direction_tb:21,direction_bt:22,direction_rl:23,direction_lr:24,requirementType:25,requirementName:26,STRUCT_START:27,requirementBody:28,STYLE_SEPARATOR:29,idList:30,ID:31,COLONSEP:32,id:33,TEXT:34,text:35,RISK:36,riskLevel:37,VERIFYMTHD:38,verifyType:39,STRUCT_STOP:40,REQUIREMENT:41,FUNCTIONAL_REQUIREMENT:42,INTERFACE_REQUIREMENT:43,PERFORMANCE_REQUIREMENT:44,PHYSICAL_REQUIREMENT:45,DESIGN_CONSTRAINT:46,LOW_RISK:47,MED_RISK:48,HIGH_RISK:49,VERIFY_ANALYSIS:50,VERIFY_DEMONSTRATION:51,VERIFY_INSPECTION:52,VERIFY_TEST:53,ELEMENT:54,elementName:55,elementBody:56,TYPE:57,type:58,DOCREF:59,ref:60,END_ARROW_L:61,relationship:62,LINE:63,END_ARROW_R:64,CONTAINS:65,COPIES:66,DERIVES:67,SATISFIES:68,VERIFIES:69,REFINES:70,TRACES:71,CLASSDEF:72,stylesOpt:73,CLASS:74,ALPHA:75,COMMA:76,STYLE:77,style:78,styleComponent:79,NUM:80,COLON:81,UNIT:82,SPACE:83,BRKT:84,PCT:85,MINUS:86,LABEL:87,SEMICOLON:88,unqString:89,qString:90,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",9:"acc_title",10:"acc_title_value",11:"acc_descr",12:"acc_descr_value",13:"acc_descr_multiline_value",21:"direction_tb",22:"direction_bt",23:"direction_rl",24:"direction_lr",27:"STRUCT_START",29:"STYLE_SEPARATOR",31:"ID",32:"COLONSEP",34:"TEXT",36:"RISK",38:"VERIFYMTHD",40:"STRUCT_STOP",41:"REQUIREMENT",42:"FUNCTIONAL_REQUIREMENT",43:"INTERFACE_REQUIREMENT",44:"PERFORMANCE_REQUIREMENT",45:"PHYSICAL_REQUIREMENT",46:"DESIGN_CONSTRAINT",47:"LOW_RISK",48:"MED_RISK",49:"HIGH_RISK",50:"VERIFY_ANALYSIS",51:"VERIFY_DEMONSTRATION",52:"VERIFY_INSPECTION",53:"VERIFY_TEST",54:"ELEMENT",57:"TYPE",59:"DOCREF",61:"END_ARROW_L",63:"LINE",64:"END_ARROW_R",65:"CONTAINS",66:"COPIES",67:"DERIVES",68:"SATISFIES",69:"VERIFIES",70:"REFINES",71:"TRACES",72:"CLASSDEF",74:"CLASS",75:"ALPHA",76:"COMMA",77:"STYLE",80:"NUM",81:"COLON",82:"UNIT",83:"SPACE",84:"BRKT",85:"PCT",86:"MINUS",87:"LABEL",88:"SEMICOLON",89:"unqString",90:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,2],[4,2],[4,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[17,1],[17,1],[17,1],[17,1],[14,5],[14,7],[28,5],[28,5],[28,5],[28,5],[28,2],[28,1],[25,1],[25,1],[25,1],[25,1],[25,1],[25,1],[37,1],[37,1],[37,1],[39,1],[39,1],[39,1],[39,1],[15,5],[15,7],[56,5],[56,5],[56,2],[56,1],[16,5],[16,5],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[19,3],[20,3],[20,3],[30,1],[30,3],[30,1],[30,3],[18,3],[73,1],[73,3],[78,1],[78,2],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[26,1],[26,1],[33,1],[33,1],[35,1],[35,1],[55,1],[55,1],[58,1],[58,1],[60,1],[60,1]],performAction:o(function(i,a,c,s,u,t,me){var l=t.length-1;switch(u){case 4:this.$=t[l].trim(),s.setAccTitle(this.$);break;case 5:case 6:this.$=t[l].trim(),s.setAccDescription(this.$);break;case 7:this.$=[];break;case 17:s.setDirection("TB");break;case 18:s.setDirection("BT");break;case 19:s.setDirection("RL");break;case 20:s.setDirection("LR");break;case 21:s.addRequirement(t[l-3],t[l-4]);break;case 22:s.addRequirement(t[l-5],t[l-6]),s.setClass([t[l-5]],t[l-3]);break;case 23:s.setNewReqId(t[l-2]);break;case 24:s.setNewReqText(t[l-2]);break;case 25:s.setNewReqRisk(t[l-2]);break;case 26:s.setNewReqVerifyMethod(t[l-2]);break;case 29:this.$=s.RequirementType.REQUIREMENT;break;case 30:this.$=s.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 31:this.$=s.RequirementType.INTERFACE_REQUIREMENT;break;case 32:this.$=s.RequirementType.PERFORMANCE_REQUIREMENT;break;case 33:this.$=s.RequirementType.PHYSICAL_REQUIREMENT;break;case 34:this.$=s.RequirementType.DESIGN_CONSTRAINT;break;case 35:this.$=s.RiskLevel.LOW_RISK;break;case 36:this.$=s.RiskLevel.MED_RISK;break;case 37:this.$=s.RiskLevel.HIGH_RISK;break;case 38:this.$=s.VerifyType.VERIFY_ANALYSIS;break;case 39:this.$=s.VerifyType.VERIFY_DEMONSTRATION;break;case 40:this.$=s.VerifyType.VERIFY_INSPECTION;break;case 41:this.$=s.VerifyType.VERIFY_TEST;break;case 42:s.addElement(t[l-3]);break;case 43:s.addElement(t[l-5]),s.setClass([t[l-5]],t[l-3]);break;case 44:s.setNewElementType(t[l-2]);break;case 45:s.setNewElementDocRef(t[l-2]);break;case 48:s.addRelationship(t[l-2],t[l],t[l-4]);break;case 49:s.addRelationship(t[l-2],t[l-4],t[l]);break;case 50:this.$=s.Relationships.CONTAINS;break;case 51:this.$=s.Relationships.COPIES;break;case 52:this.$=s.Relationships.DERIVES;break;case 53:this.$=s.Relationships.SATISFIES;break;case 54:this.$=s.Relationships.VERIFIES;break;case 55:this.$=s.Relationships.REFINES;break;case 56:this.$=s.Relationships.TRACES;break;case 57:this.$=t[l-2],s.defineClass(t[l-1],t[l]);break;case 58:s.setClass(t[l-1],t[l]);break;case 59:s.setClass([t[l-2]],t[l]);break;case 60:case 62:this.$=[t[l]];break;case 61:case 63:this.$=t[l-2].concat([t[l]]);break;case 64:this.$=t[l-2],s.setCssStyle(t[l-1],t[l]);break;case 65:this.$=[t[l]];break;case 66:t[l-2].push(t[l]),this.$=t[l-2];break;case 68:this.$=t[l-1]+t[l];break}},"anonymous"),table:[{3:1,4:2,6:f,9:h,11:r,13:n},{1:[3]},{3:8,4:2,5:[1,7],6:f,9:h,11:r,13:n},{5:[1,9]},{10:[1,10]},{12:[1,11]},e(d,[2,6]),{3:12,4:2,6:f,9:h,11:r,13:n},{1:[2,2]},{4:17,5:k,7:13,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},e(d,[2,4]),e(d,[2,5]),{1:[2,1]},{8:[1,41]},{4:17,5:k,7:42,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:43,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:44,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:45,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:46,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:47,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:48,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:49,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{4:17,5:k,7:50,8:b,9:h,11:r,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:g,22:S,23:N,24:q,25:23,33:25,41:A,42:C,43:V,44:v,45:x,46:L,54:w,72:D,74:O,77:M,89:E,90:p},{26:51,89:[1,52],90:[1,53]},{55:54,89:[1,55],90:[1,56]},{29:[1,59],61:[1,57],63:[1,58]},e(m,[2,17]),e(m,[2,18]),e(m,[2,19]),e(m,[2,20]),{30:60,33:62,75:$,89:E,90:p},{30:63,33:62,75:$,89:E,90:p},{30:64,33:62,75:$,89:E,90:p},e(X,[2,29]),e(X,[2,30]),e(X,[2,31]),e(X,[2,32]),e(X,[2,33]),e(X,[2,34]),e(Ce,[2,81]),e(Ce,[2,82]),{1:[2,3]},{8:[2,8]},{8:[2,9]},{8:[2,10]},{8:[2,11]},{8:[2,12]},{8:[2,13]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{27:[1,65],29:[1,66]},e(de,[2,79]),e(de,[2,80]),{27:[1,67],29:[1,68]},e(de,[2,85]),e(de,[2,86]),{62:69,65:Ve,66:ve,67:xe,68:Le,69:we,70:De,71:Oe},{62:77,65:Ve,66:ve,67:xe,68:Le,69:we,70:De,71:Oe},{30:78,33:62,75:$,89:E,90:p},{73:79,75:Z,76:U,78:81,79:82,80:ee,81:te,82:se,83:ie,84:re,85:ne,86:ae,87:le,88:ce},e(Ee,[2,60]),e(Ee,[2,62]),{73:93,75:Z,76:U,78:81,79:82,80:ee,81:te,82:se,83:ie,84:re,85:ne,86:ae,87:le,88:ce},{30:94,33:62,75:$,76:U,89:E,90:p},{5:[1,95]},{30:96,33:62,75:$,89:E,90:p},{5:[1,97]},{30:98,33:62,75:$,89:E,90:p},{63:[1,99]},e(Y,[2,50]),e(Y,[2,51]),e(Y,[2,52]),e(Y,[2,53]),e(Y,[2,54]),e(Y,[2,55]),e(Y,[2,56]),{64:[1,100]},e(m,[2,59],{76:U}),e(m,[2,64],{76:Me}),{33:103,75:[1,102],89:E,90:p},e(Fe,[2,65],{79:104,75:Z,80:ee,81:te,82:se,83:ie,84:re,85:ne,86:ae,87:le,88:ce}),e(I,[2,67]),e(I,[2,69]),e(I,[2,70]),e(I,[2,71]),e(I,[2,72]),e(I,[2,73]),e(I,[2,74]),e(I,[2,75]),e(I,[2,76]),e(I,[2,77]),e(I,[2,78]),e(m,[2,57],{76:Me}),e(m,[2,58],{76:U}),{5:B,28:105,31:Q,34:H,36:K,38:W,40:j},{27:[1,112],76:U},{5:oe,40:he,56:113,57:ue,59:fe},{27:[1,118],76:U},{33:119,89:E,90:p},{33:120,89:E,90:p},{75:Z,78:121,79:82,80:ee,81:te,82:se,83:ie,84:re,85:ne,86:ae,87:le,88:ce},e(Ee,[2,61]),e(Ee,[2,63]),e(I,[2,68]),e(m,[2,21]),{32:[1,122]},{32:[1,123]},{32:[1,124]},{32:[1,125]},{5:B,28:126,31:Q,34:H,36:K,38:W,40:j},e(m,[2,28]),{5:[1,127]},e(m,[2,42]),{32:[1,128]},{32:[1,129]},{5:oe,40:he,56:130,57:ue,59:fe},e(m,[2,47]),{5:[1,131]},e(m,[2,48]),e(m,[2,49]),e(Fe,[2,66],{79:104,75:Z,80:ee,81:te,82:se,83:ie,84:re,85:ne,86:ae,87:le,88:ce}),{33:132,89:E,90:p},{35:133,89:[1,134],90:[1,135]},{37:136,47:[1,137],48:[1,138],49:[1,139]},{39:140,50:[1,141],51:[1,142],52:[1,143],53:[1,144]},e(m,[2,27]),{5:B,28:145,31:Q,34:H,36:K,38:W,40:j},{58:146,89:[1,147],90:[1,148]},{60:149,89:[1,150],90:[1,151]},e(m,[2,46]),{5:oe,40:he,56:152,57:ue,59:fe},{5:[1,153]},{5:[1,154]},{5:[2,83]},{5:[2,84]},{5:[1,155]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[1,156]},{5:[2,38]},{5:[2,39]},{5:[2,40]},{5:[2,41]},e(m,[2,22]),{5:[1,157]},{5:[2,87]},{5:[2,88]},{5:[1,158]},{5:[2,89]},{5:[2,90]},e(m,[2,43]),{5:B,28:159,31:Q,34:H,36:K,38:W,40:j},{5:B,28:160,31:Q,34:H,36:K,38:W,40:j},{5:B,28:161,31:Q,34:H,36:K,38:W,40:j},{5:B,28:162,31:Q,34:H,36:K,38:W,40:j},{5:oe,40:he,56:163,57:ue,59:fe},{5:oe,40:he,56:164,57:ue,59:fe},e(m,[2,23]),e(m,[2,24]),e(m,[2,25]),e(m,[2,26]),e(m,[2,44]),e(m,[2,45])],defaultActions:{8:[2,2],12:[2,1],41:[2,3],42:[2,8],43:[2,9],44:[2,10],45:[2,11],46:[2,12],47:[2,13],48:[2,14],49:[2,15],50:[2,16],134:[2,83],135:[2,84],137:[2,35],138:[2,36],139:[2,37],141:[2,38],142:[2,39],143:[2,40],144:[2,41],147:[2,87],148:[2,88],150:[2,89],151:[2,90]},parseError:o(function(i,a){if(a.recoverable)this.trace(i);else{var c=new Error(i);throw c.hash=a,c}},"parseError"),parse:o(function(i){var a=this,c=[0],s=[],u=[null],t=[],me=this.table,l="",be=0,Pe=0,$e=0,at=2,Ue=1,lt=t.slice.call(arguments,1),R=Object.create(this.lexer),G={yy:{}};for(var Se in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Se)&&(G.yy[Se]=this.yy[Se]);R.setInput(i,G.yy),G.yy.lexer=R,G.yy.parser=this,typeof R.yylloc>"u"&&(R.yylloc={});var Ie=R.yylloc;t.push(Ie);var ct=R.options&&R.options.ranges;typeof G.yy.parseError=="function"?this.parseError=G.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ot(_){c.length=c.length-2*_,u.length=u.length-_,t.length=t.length-_}o(ot,"popStack");function Ye(){var _;return _=s.pop()||R.lex()||Ue,typeof _!="number"&&(_ instanceof Array&&(s=_,_=s.pop()),_=a.symbols_[_]||_),_}o(Ye,"lex");for(var y,Te,z,T,Et,Ne,J={},Re,F,Be,ye;;){if(z=c[c.length-1],this.defaultActions[z]?T=this.defaultActions[z]:((y===null||typeof y>"u")&&(y=Ye()),T=me[z]&&me[z][y]),typeof T>"u"||!T.length||!T[0]){var qe="";ye=[];for(Re in me[z])this.terminals_[Re]&&Re>at&&ye.push("'"+this.terminals_[Re]+"'");R.showPosition?qe="Parse error on line "+(be+1)+`: +`+R.showPosition()+` +Expecting `+ye.join(", ")+", got '"+(this.terminals_[y]||y)+"'":qe="Parse error on line "+(be+1)+": Unexpected "+(y==Ue?"end of input":"'"+(this.terminals_[y]||y)+"'"),this.parseError(qe,{text:R.match,token:this.terminals_[y]||y,line:R.yylineno,loc:Ie,expected:ye})}if(T[0]instanceof Array&&T.length>1)throw new Error("Parse Error: multiple actions possible at state: "+z+", token: "+y);switch(T[0]){case 1:c.push(y),u.push(R.yytext),t.push(R.yylloc),c.push(T[1]),y=null,Te?(y=Te,Te=null):(Pe=R.yyleng,l=R.yytext,be=R.yylineno,Ie=R.yylloc,$e>0&&$e--);break;case 2:if(F=this.productions_[T[1]][1],J.$=u[u.length-F],J._$={first_line:t[t.length-(F||1)].first_line,last_line:t[t.length-1].last_line,first_column:t[t.length-(F||1)].first_column,last_column:t[t.length-1].last_column},ct&&(J._$.range=[t[t.length-(F||1)].range[0],t[t.length-1].range[1]]),Ne=this.performAction.apply(J,[l,Pe,be,G.yy,T[1],u,t].concat(lt)),typeof Ne<"u")return Ne;F&&(c=c.slice(0,-1*F*2),u=u.slice(0,-1*F),t=t.slice(0,-1*F)),c.push(this.productions_[T[1]][0]),u.push(J.$),t.push(J._$),Be=me[c[c.length-2]][c[c.length-1]],c.push(Be);break;case 3:return!0}}return!0},"parse")},nt=(function(){var P={EOF:1,parseError:o(function(a,c){if(this.yy.parser)this.yy.parser.parseError(a,c);else throw new Error(a)},"parseError"),setInput:o(function(i,a){return this.yy=a||this.yy||{},this._input=i,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var i=this._input[0];this.yytext+=i,this.yyleng++,this.offset++,this.match+=i,this.matched+=i;var a=i.match(/(?:\r\n?|\n).*/g);return a?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),i},"input"),unput:o(function(i){var a=i.length,c=i.split(/(?:\r\n?|\n)/g);this._input=i+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-a),this.offset-=a;var s=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var u=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===s.length?this.yylloc.first_column:0)+s[s.length-c.length].length-c[0].length:this.yylloc.first_column-a},this.options.ranges&&(this.yylloc.range=[u[0],u[0]+this.yyleng-a]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(i){this.unput(this.match.slice(i))},"less"),pastInput:o(function(){var i=this.matched.substr(0,this.matched.length-this.match.length);return(i.length>20?"...":"")+i.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var i=this.match;return i.length<20&&(i+=this._input.substr(0,20-i.length)),(i.substr(0,20)+(i.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var i=this.pastInput(),a=new Array(i.length+1).join("-");return i+this.upcomingInput()+` +`+a+"^"},"showPosition"),test_match:o(function(i,a){var c,s,u;if(this.options.backtrack_lexer&&(u={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(u.yylloc.range=this.yylloc.range.slice(0))),s=i[0].match(/(?:\r\n?|\n).*/g),s&&(this.yylineno+=s.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:s?s[s.length-1].length-s[s.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+i[0].length},this.yytext+=i[0],this.match+=i[0],this.matches=i,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(i[0].length),this.matched+=i[0],c=this.performAction.call(this,this.yy,this,a,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),c)return c;if(this._backtrack){for(var t in u)this[t]=u[t];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var i,a,c,s;this._more||(this.yytext="",this.match="");for(var u=this._currentRules(),t=0;ta[0].length)){if(a=c,s=t,this.options.backtrack_lexer){if(i=this.test_match(c,u[t]),i!==!1)return i;if(this._backtrack){a=!1;continue}else return!1}else if(!this.options.flex)break}return a?(i=this.test_match(a,u[s]),i!==!1?i:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var a=this.next();return a||this.lex()},"lex"),begin:o(function(a){this.conditionStack.push(a)},"begin"),popState:o(function(){var a=this.conditionStack.length-1;return a>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(a){return a=this.conditionStack.length-1-Math.abs(a||0),a>=0?this.conditionStack[a]:"INITIAL"},"topState"),pushState:o(function(a){this.begin(a)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(a,c,s,u){var t=u;switch(s){case 0:return"title";case 1:return this.begin("acc_title"),9;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),11;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:return 21;case 9:return 22;case 10:return 23;case 11:return 24;case 12:return 5;case 13:break;case 14:break;case 15:break;case 16:return 8;case 17:return 6;case 18:return 27;case 19:return 40;case 20:return 29;case 21:return 32;case 22:return 31;case 23:return 34;case 24:return 36;case 25:return 38;case 26:return 41;case 27:return 42;case 28:return 43;case 29:return 44;case 30:return 45;case 31:return 46;case 32:return 47;case 33:return 48;case 34:return 49;case 35:return 50;case 36:return 51;case 37:return 52;case 38:return 53;case 39:return 54;case 40:return 65;case 41:return 66;case 42:return 67;case 43:return 68;case 44:return 69;case 45:return 70;case 46:return 71;case 47:return 57;case 48:return 59;case 49:return this.begin("style"),77;break;case 50:return 75;case 51:return 81;case 52:return 88;case 53:return"PERCENT";case 54:return 86;case 55:return 84;case 56:break;case 57:this.begin("string");break;case 58:this.popState();break;case 59:return this.begin("style"),72;break;case 60:return this.begin("style"),74;break;case 61:return 61;case 62:return 64;case 63:return 63;case 64:this.begin("string");break;case 65:this.popState();break;case 66:return"qString";case 67:return c.yytext=c.yytext.trim(),89;break;case 68:return 75;case 69:return 80;case 70:return 76}},"anonymous"),rules:[/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::{3})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:style\b)/i,/^(?:\w+)/i,/^(?::)/i,/^(?:;)/i,/^(?:%)/i,/^(?:-)/i,/^(?:#)/i,/^(?: )/i,/^(?:["])/i,/^(?:\n)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^:,\r\n\{\<\>\-\=]*)/i,/^(?:\w+)/i,/^(?:[0-9]+)/i,/^(?:,)/i],conditions:{acc_descr_multiline:{rules:[6,7,68,69,70],inclusive:!1},acc_descr:{rules:[4,68,69,70],inclusive:!1},acc_title:{rules:[2,68,69,70],inclusive:!1},style:{rules:[50,51,52,53,54,55,56,57,58,68,69,70],inclusive:!1},unqString:{rules:[68,69,70],inclusive:!1},token:{rules:[68,69,70],inclusive:!1},string:{rules:[65,66,68,69,70],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,59,60,61,62,63,64,67,68,69,70],inclusive:!0}}};return P})();_e.lexer=nt;function pe(){this.yy={}}return o(pe,"Parser"),pe.prototype=_e,_e.Parser=pe,new pe})();Ae.parser=Ae;var ht=Ae,ut=class{constructor(){this.relations=[],this.latestRequirement=this.getInitialRequirement(),this.requirements=new Map,this.latestElement=this.getInitialElement(),this.elements=new Map,this.classes=new Map,this.direction="TB",this.RequirementType={REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"},this.RiskLevel={LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"},this.VerifyType={VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"},this.Relationships={CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"},this.setAccTitle=We,this.getAccTitle=je,this.setAccDescription=Ge,this.getAccDescription=ze,this.setDiagramTitle=Xe,this.getDiagramTitle=Je,this.getConfig=o(()=>ge().requirement,"getConfig"),this.clear(),this.setDirection=this.setDirection.bind(this),this.addRequirement=this.addRequirement.bind(this),this.setNewReqId=this.setNewReqId.bind(this),this.setNewReqRisk=this.setNewReqRisk.bind(this),this.setNewReqText=this.setNewReqText.bind(this),this.setNewReqVerifyMethod=this.setNewReqVerifyMethod.bind(this),this.addElement=this.addElement.bind(this),this.setNewElementType=this.setNewElementType.bind(this),this.setNewElementDocRef=this.setNewElementDocRef.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setCssStyle=this.setCssStyle.bind(this),this.setClass=this.setClass.bind(this),this.defineClass=this.defineClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{o(this,"RequirementDB")}getDirection(){return this.direction}setDirection(e){this.direction=e}resetLatestRequirement(){this.latestRequirement=this.getInitialRequirement()}resetLatestElement(){this.latestElement=this.getInitialElement()}getInitialRequirement(){return{requirementId:"",text:"",risk:"",verifyMethod:"",name:"",type:"",cssStyles:[],classes:["default"]}}getInitialElement(){return{name:"",type:"",docRef:"",cssStyles:[],classes:["default"]}}addRequirement(e,f){return this.requirements.has(e)||this.requirements.set(e,{name:e,type:f,requirementId:this.latestRequirement.requirementId,text:this.latestRequirement.text,risk:this.latestRequirement.risk,verifyMethod:this.latestRequirement.verifyMethod,cssStyles:[],classes:["default"]}),this.resetLatestRequirement(),this.requirements.get(e)}getRequirements(){return this.requirements}setNewReqId(e){this.latestRequirement!==void 0&&(this.latestRequirement.requirementId=e)}setNewReqText(e){this.latestRequirement!==void 0&&(this.latestRequirement.text=e)}setNewReqRisk(e){this.latestRequirement!==void 0&&(this.latestRequirement.risk=e)}setNewReqVerifyMethod(e){this.latestRequirement!==void 0&&(this.latestRequirement.verifyMethod=e)}addElement(e){return this.elements.has(e)||(this.elements.set(e,{name:e,type:this.latestElement.type,docRef:this.latestElement.docRef,cssStyles:[],classes:["default"]}),ke.info("Added new element: ",e)),this.resetLatestElement(),this.elements.get(e)}getElements(){return this.elements}setNewElementType(e){this.latestElement!==void 0&&(this.latestElement.type=e)}setNewElementDocRef(e){this.latestElement!==void 0&&(this.latestElement.docRef=e)}addRelationship(e,f,h){this.relations.push({type:e,src:f,dst:h})}getRelationships(){return this.relations}clear(){this.relations=[],this.resetLatestRequirement(),this.requirements=new Map,this.resetLatestElement(),this.elements=new Map,this.classes=new Map,Ke()}setCssStyle(e,f){for(let h of e){let r=this.requirements.get(h)??this.elements.get(h);if(!f||!r)return;for(let n of f)n.includes(",")?r.cssStyles.push(...n.split(",")):r.cssStyles.push(n)}}setClass(e,f){for(let h of e){let r=this.requirements.get(h)??this.elements.get(h);if(r)for(let n of f){r.classes.push(n);let d=this.classes.get(n)?.styles;d&&r.cssStyles.push(...d)}}}defineClass(e,f){for(let h of e){let r=this.classes.get(h);r===void 0&&(r={id:h,styles:[],textStyles:[]},this.classes.set(h,r)),f&&f.forEach(function(n){if(/color/.exec(n)){let d=n.replace("fill","bgFill");r.textStyles.push(d)}r.styles.push(n)}),this.requirements.forEach(n=>{n.classes.includes(h)&&n.cssStyles.push(...f.flatMap(d=>d.split(",")))}),this.elements.forEach(n=>{n.classes.includes(h)&&n.cssStyles.push(...f.flatMap(d=>d.split(",")))})}}getClasses(){return this.classes}getData(){let e=ge(),f=[],h=[];for(let r of this.requirements.values()){let n=r;n.id=r.name,n.cssStyles=r.cssStyles,n.cssClasses=r.classes.join(" "),n.shape="requirementBox",n.look=e.look,f.push(n)}for(let r of this.elements.values()){let n=r;n.shape="requirementBox",n.look=e.look,n.id=r.name,n.cssStyles=r.cssStyles,n.cssClasses=r.classes.join(" "),f.push(n)}for(let r of this.relations){let n=0,d=r.type===this.Relationships.CONTAINS,k={id:`${r.src}-${r.dst}-${n}`,start:this.requirements.get(r.src)?.name??this.elements.get(r.src)?.name,end:this.requirements.get(r.dst)?.name??this.elements.get(r.dst)?.name,label:`\xAB${r.type}\xBB`,classes:"relationshipLine",style:["fill:none",d?"":"stroke-dasharray: 10,7"],labelpos:"c",thickness:"normal",type:"normal",pattern:d?"normal":"dashed",arrowTypeStart:d?"requirement_contains":"",arrowTypeEnd:d?"":"requirement_arrow",look:e.look,labelType:"markdown"};h.push(k),n++}return{nodes:f,edges:h,other:{},config:e,direction:this.getDirection()}}},ft=o(e=>` + + marker { + fill: ${e.relationColor}; + stroke: ${e.relationColor}; + } + + marker.cross { + stroke: ${e.lineColor}; + } + + svg { + font-family: ${e.fontFamily}; + font-size: ${e.fontSize}; + } + + .reqBox { + fill: ${e.requirementBackground}; + fill-opacity: 1.0; + stroke: ${e.requirementBorderColor}; + stroke-width: ${e.requirementBorderSize}; + } + + .reqTitle, .reqLabel{ + fill: ${e.requirementTextColor}; + } + .reqLabelBox { + fill: ${e.relationLabelBackground}; + fill-opacity: 1.0; + } + + .req-title-line { + stroke: ${e.requirementBorderColor}; + stroke-width: ${e.requirementBorderSize}; + } + .relationshipLine { + stroke: ${e.relationColor}; + stroke-width: 1; + } + .relationshipLabel { + fill: ${e.relationLabelColor}; + } + .edgeLabel { + background-color: ${e.edgeLabelBackground}; + } + .edgeLabel .label rect { + fill: ${e.edgeLabelBackground}; + } + .edgeLabel .label text { + fill: ${e.relationLabelColor}; + } + .divider { + stroke: ${e.nodeBorder}; + stroke-width: 1; + } + .label { + font-family: ${e.fontFamily}; + color: ${e.nodeTextColor||e.textColor}; + } + .label text,span { + fill: ${e.nodeTextColor||e.textColor}; + color: ${e.nodeTextColor||e.textColor}; + } + .labelBkg { + background-color: ${e.edgeLabelBackground}; + } + +`,"getStyles"),mt=ft,rt={};He(rt,{draw:()=>dt});var dt=o(function(e,f,h,r){return Qe(this,null,function*(){ke.info("REF0:"),ke.info("Drawing requirement diagram (unified)",f);let{securityLevel:n,state:d,layout:k}=ge(),b=r.db.getData(),g=st(f,n);b.type=r.type,b.layoutAlgorithm=tt(k),b.nodeSpacing=d?.nodeSpacing??50,b.rankSpacing=d?.rankSpacing??50,b.markers=["requirement_contains","requirement_arrow"],b.diagramId=f,yield et(b,g);let S=8;Ze.insertTitle(g,"requirementDiagramTitleText",d?.titleTopMargin??25,r.db.getDiagramTitle()),it(g,S,"requirementDiagram",d?.useMaxWidth??!0)})},"draw"),At={parser:ht,get db(){return new ut},renderer:rt,styles:mt};export{At as diagram}; diff --git a/src/google/adk/cli/browser/chunk-SMT27N2F.js b/src/google/adk/cli/browser/chunk-SMT27N2F.js new file mode 100644 index 0000000000..8fcc01c426 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-SMT27N2F.js @@ -0,0 +1 @@ +import{a as e,b as r}from"./chunk-NQKWI5EB.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{e as PacketModule,r as createPacketServices}; diff --git a/src/google/adk/cli/browser/chunk-ST54LLJ3.js b/src/google/adk/cli/browser/chunk-ST54LLJ3.js new file mode 100644 index 0000000000..2a0315718b --- /dev/null +++ b/src/google/adk/cli/browser/chunk-ST54LLJ3.js @@ -0,0 +1 @@ +import{N as w}from"./chunk-QFMJV7VH.js";import{g as r,i as c}from"./chunk-JRNAXTJ7.js";var g=r((t,e,i,h)=>{t.attr("class",i);let{width:o,height:n,x,y:u}=s(t,e);w(t,n,o,h);let a=m(x,u,o,n,e);t.attr("viewBox",a),c.debug(`viewBox configured: ${a} with padding: ${e}`)},"setupViewPortForSVG"),s=r((t,e)=>{let i=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:i.width+e*2,height:i.height+e*2,x:i.x,y:i.y}},"calculateDimensionsWithPadding"),m=r((t,e,i,h,o)=>`${t-o} ${e-o} ${i} ${h}`,"createViewBox");export{g as a}; diff --git a/src/google/adk/cli/browser/chunk-A2SOFJNC.js b/src/google/adk/cli/browser/chunk-SXB5AC5V.js similarity index 95% rename from src/google/adk/cli/browser/chunk-A2SOFJNC.js rename to src/google/adk/cli/browser/chunk-SXB5AC5V.js index b63c9780bf..8514b7fc0f 100644 --- a/src/google/adk/cli/browser/chunk-A2SOFJNC.js +++ b/src/google/adk/cli/browser/chunk-SXB5AC5V.js @@ -1 +1 @@ -import{$a as p,$b as b,Bb as l,Ca as m,Cb as r,Cc as c,Ib as d,Kb as h,Pa as o,Yb as v,Zb as a,_b as g,eb as u,pd as f,wc as s}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";var E=(()=>{class i extends f{value=c.required();label=c.required();inputChecked=s(()=>super.resolvePrimitive(this.value())??!1);resolvedLabel=s(()=>super.resolvePrimitive(this.label()));inputId=super.getUniqueId("a2ui-checkbox");handleChange(t){let n=this.value()?.path;!(t.target instanceof HTMLInputElement)||!n||this.processor.setData(this.component(),n,t.target.checked,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(i)))(e||i)}})();static \u0275cmp=p({type:i,selectors:[["a2ui-checkbox"]],inputs:{value:[1,"value"],label:[1,"label"]},features:[u],decls:4,vars:12,consts:[["autocomplete","off","type","checkbox",3,"change","id","checked"],[3,"htmlFor"]],template:function(n,e){n&1&&(l(0,"section")(1,"input",0),h("change",function(k){return e.handleChange(k)}),r(),l(2,"label",1),g(3),r()()),n&2&&(v(e.theme.additionalStyles==null?null:e.theme.additionalStyles.CheckBox),a(e.theme.components.CheckBox.container),o(),a(e.theme.components.CheckBox.element),d("id",e.inputId)("checked",e.inputChecked()),o(),a(e.theme.components.CheckBox.label),d("htmlFor",e.inputId),o(),b(e.resolvedLabel()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}input[_ngcontent-%COMP%]{display:block;width:100%}"]})}return i})();export{E as Checkbox}; +import{$a as p,$b as b,Bb as l,Ca as m,Cb as r,Cc as c,Ib as d,Kb as h,Pa as o,Yb as v,Zb as a,_b as g,eb as u,pd as f,wc as s}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";var E=(()=>{class i extends f{value=c.required();label=c.required();inputChecked=s(()=>super.resolvePrimitive(this.value())??!1);resolvedLabel=s(()=>super.resolvePrimitive(this.label()));inputId=super.getUniqueId("a2ui-checkbox");handleChange(t){let n=this.value()?.path;!(t.target instanceof HTMLInputElement)||!n||this.processor.setData(this.component(),n,t.target.checked,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(i)))(e||i)}})();static \u0275cmp=p({type:i,selectors:[["a2ui-checkbox"]],inputs:{value:[1,"value"],label:[1,"label"]},features:[u],decls:4,vars:12,consts:[["autocomplete","off","type","checkbox",3,"change","id","checked"],[3,"htmlFor"]],template:function(n,e){n&1&&(l(0,"section")(1,"input",0),h("change",function(k){return e.handleChange(k)}),r(),l(2,"label",1),g(3),r()()),n&2&&(v(e.theme.additionalStyles==null?null:e.theme.additionalStyles.CheckBox),a(e.theme.components.CheckBox.container),o(),a(e.theme.components.CheckBox.element),d("id",e.inputId)("checked",e.inputChecked()),o(),a(e.theme.components.CheckBox.label),d("htmlFor",e.inputId),o(),b(e.resolvedLabel()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}input[_ngcontent-%COMP%]{display:block;width:100%}"]})}return i})();export{E as Checkbox}; diff --git a/src/google/adk/cli/browser/chunk-T2UY75BD.js b/src/google/adk/cli/browser/chunk-T2UY75BD.js new file mode 100644 index 0000000000..3e9e5540d2 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-T2UY75BD.js @@ -0,0 +1,145 @@ +import{a as tr}from"./chunk-4R6SYGKS.js";import{a as $e,b as je,d as Mt,e as Bt,f as lt,g as Vt}from"./chunk-NMKTPNXE.js";import{a as Je,b as Qe}from"./chunk-ZMOC4H7T.js";import{a as Ze,k as te,m as F}from"./chunk-WBLSVR3V.js";import{a as Ir}from"./chunk-GP6TCC26.js";import{A as Ct,G as Nt,H as We,J as U,K as Rt,L as $t,M as S,N as Ke,R as Fe,S as jt,T as qe,U as He,V as ze,W as Ue,X as Ge,Y as j,Z as Xe,o as Ye}from"./chunk-QFMJV7VH.js";import{a as mt,g as _,i as Q}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{a as Be,b as Ve,h as xr,j as $}from"./chunk-RMXJBC7V.js";var ae=xr(Ir(),1);var ee=(function(){var e=_(function(Et,y,N,m){for(N=N||{},m=Et.length;m--;N[Et[m]]=y);return N},"o"),t=[1,2],a=[1,3],r=[1,4],i=[2,4],n=[1,9],c=[1,11],l=[1,12],h=[1,14],s=[1,15],E=[1,17],p=[1,18],f=[1,19],u=[1,25],O=[1,26],b=[1,27],L=[1,28],w=[1,29],A=[1,30],k=[1,31],D=[1,32],M=[1,33],W=[1,34],K=[1,35],H=[1,36],G=[1,37],X=[1,38],z=[1,39],v=[1,40],tt=[1,42],Z=[1,43],et=[1,44],st=[1,45],at=[1,46],R=[1,47],I=[1,4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,48,49,50,51,53,54,56,61,62,63,64,73],ot=[1,74],ct=[1,80],C=[1,81],ie=[1,82],ne=[1,83],oe=[1,84],ce=[1,85],le=[1,86],he=[1,87],de=[1,88],Te=[1,89],Ee=[1,90],pe=[1,91],ue=[1,92],_e=[1,93],fe=[1,94],ge=[1,95],xe=[1,96],Ie=[1,97],be=[1,98],Re=[1,99],Oe=[1,100],ye=[1,101],Le=[1,102],Se=[1,103],me=[1,104],Ne=[1,105],Ae=[2,78],Lt=[4,5,17,51,53,54],wt=[4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,51,53,54,56,61,62,63,64,73],we=[4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,50,51,53,54,56,61,62,63,64,73],Ht=[4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,49,51,53,54,56,61,62,63,64,73],Pe=[4,5,10,14,15,17,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,48,51,53,54,56,61,62,63,64,73],zt=[5,52],B=[70,71,72,73],it=[1,151],Ut={trace:_(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,SD:6,document:7,line:8,statement:9,INVALID:10,box_section:11,box_line:12,participant_statement:13,create:14,box:15,restOfLine:16,end:17,signal:18,autonumber:19,NUM:20,off:21,activate:22,actor:23,deactivate:24,note_statement:25,links_statement:26,link_statement:27,properties_statement:28,details_statement:29,title:30,legacy_title:31,acc_title:32,acc_title_value:33,acc_descr:34,acc_descr_value:35,acc_descr_multiline_value:36,loop:37,rect:38,opt:39,alt:40,else_sections:41,par:42,par_sections:43,par_over:44,critical:45,option_sections:46,break:47,option:48,and:49,else:50,participant:51,AS:52,participant_actor:53,destroy:54,actor_with_config:55,note:56,placement:57,text2:58,over:59,actor_pair:60,links:61,link:62,properties:63,details:64,spaceList:65,",":66,left_of:67,right_of:68,signaltype:69,"+":70,"-":71,"()":72,ACTOR:73,config_object:74,CONFIG_START:75,CONFIG_CONTENT:76,CONFIG_END:77,SOLID_OPEN_ARROW:78,DOTTED_OPEN_ARROW:79,SOLID_ARROW:80,SOLID_ARROW_TOP:81,SOLID_ARROW_BOTTOM:82,STICK_ARROW_TOP:83,STICK_ARROW_BOTTOM:84,SOLID_ARROW_TOP_DOTTED:85,SOLID_ARROW_BOTTOM_DOTTED:86,STICK_ARROW_TOP_DOTTED:87,STICK_ARROW_BOTTOM_DOTTED:88,SOLID_ARROW_TOP_REVERSE:89,SOLID_ARROW_BOTTOM_REVERSE:90,STICK_ARROW_TOP_REVERSE:91,STICK_ARROW_BOTTOM_REVERSE:92,SOLID_ARROW_TOP_REVERSE_DOTTED:93,SOLID_ARROW_BOTTOM_REVERSE_DOTTED:94,STICK_ARROW_TOP_REVERSE_DOTTED:95,STICK_ARROW_BOTTOM_REVERSE_DOTTED:96,BIDIRECTIONAL_SOLID_ARROW:97,DOTTED_ARROW:98,BIDIRECTIONAL_DOTTED_ARROW:99,SOLID_CROSS:100,DOTTED_CROSS:101,SOLID_POINT:102,DOTTED_POINT:103,TXT:104,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",6:"SD",10:"INVALID",14:"create",15:"box",16:"restOfLine",17:"end",19:"autonumber",20:"NUM",21:"off",22:"activate",24:"deactivate",30:"title",31:"legacy_title",32:"acc_title",33:"acc_title_value",34:"acc_descr",35:"acc_descr_value",36:"acc_descr_multiline_value",37:"loop",38:"rect",39:"opt",40:"alt",42:"par",44:"par_over",45:"critical",47:"break",48:"option",49:"and",50:"else",51:"participant",52:"AS",53:"participant_actor",54:"destroy",56:"note",59:"over",61:"links",62:"link",63:"properties",64:"details",66:",",67:"left_of",68:"right_of",70:"+",71:"-",72:"()",73:"ACTOR",75:"CONFIG_START",76:"CONFIG_CONTENT",77:"CONFIG_END",78:"SOLID_OPEN_ARROW",79:"DOTTED_OPEN_ARROW",80:"SOLID_ARROW",81:"SOLID_ARROW_TOP",82:"SOLID_ARROW_BOTTOM",83:"STICK_ARROW_TOP",84:"STICK_ARROW_BOTTOM",85:"SOLID_ARROW_TOP_DOTTED",86:"SOLID_ARROW_BOTTOM_DOTTED",87:"STICK_ARROW_TOP_DOTTED",88:"STICK_ARROW_BOTTOM_DOTTED",89:"SOLID_ARROW_TOP_REVERSE",90:"SOLID_ARROW_BOTTOM_REVERSE",91:"STICK_ARROW_TOP_REVERSE",92:"STICK_ARROW_BOTTOM_REVERSE",93:"SOLID_ARROW_TOP_REVERSE_DOTTED",94:"SOLID_ARROW_BOTTOM_REVERSE_DOTTED",95:"STICK_ARROW_TOP_REVERSE_DOTTED",96:"STICK_ARROW_BOTTOM_REVERSE_DOTTED",97:"BIDIRECTIONAL_SOLID_ARROW",98:"DOTTED_ARROW",99:"BIDIRECTIONAL_DOTTED_ARROW",100:"SOLID_CROSS",101:"DOTTED_CROSS",102:"SOLID_POINT",103:"DOTTED_POINT",104:"TXT"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[8,1],[11,0],[11,2],[12,2],[12,1],[12,1],[9,1],[9,2],[9,4],[9,2],[9,4],[9,3],[9,3],[9,2],[9,3],[9,3],[9,2],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[9,2],[9,2],[9,1],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[46,1],[46,4],[43,1],[43,4],[41,1],[41,4],[13,5],[13,3],[13,5],[13,3],[13,3],[13,5],[13,3],[13,5],[13,3],[25,4],[25,4],[26,3],[27,3],[28,3],[29,3],[65,2],[65,1],[60,3],[60,1],[57,1],[57,1],[18,5],[18,5],[18,5],[18,5],[18,6],[18,4],[55,2],[74,3],[23,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[69,1],[58,1]],performAction:_(function(y,N,m,g,V,o,St){var T=o.length-1;switch(V){case 3:return g.apply(o[T]),o[T];break;case 4:case 10:this.$=[];break;case 5:case 11:o[T-1].push(o[T]),this.$=o[T-1];break;case 6:case 7:case 12:case 13:this.$=o[T];break;case 8:case 9:case 14:this.$=[];break;case 16:o[T].type="createParticipant",this.$=o[T];break;case 17:o[T-1].unshift({type:"boxStart",boxData:g.parseBoxData(o[T-2])}),o[T-1].push({type:"boxEnd",boxText:o[T-2]}),this.$=o[T-1];break;case 19:this.$={type:"sequenceIndex",sequenceIndex:Number(o[T-2]),sequenceIndexStep:Number(o[T-1]),sequenceVisible:!0,signalType:g.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceIndex:Number(o[T-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:g.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:g.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:g.LINETYPE.AUTONUMBER};break;case 23:this.$={type:"activeStart",signalType:g.LINETYPE.ACTIVE_START,actor:o[T-1].actor};break;case 24:this.$={type:"activeEnd",signalType:g.LINETYPE.ACTIVE_END,actor:o[T-1].actor};break;case 30:g.setDiagramTitle(o[T].substring(6)),this.$=o[T].substring(6);break;case 31:g.setDiagramTitle(o[T].substring(7)),this.$=o[T].substring(7);break;case 32:this.$=o[T].trim(),g.setAccTitle(this.$);break;case 33:case 34:this.$=o[T].trim(),g.setAccDescription(this.$);break;case 35:o[T-1].unshift({type:"loopStart",loopText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.LOOP_START}),o[T-1].push({type:"loopEnd",loopText:o[T-2],signalType:g.LINETYPE.LOOP_END}),this.$=o[T-1];break;case 36:o[T-1].unshift({type:"rectStart",color:g.parseMessage(o[T-2]),signalType:g.LINETYPE.RECT_START}),o[T-1].push({type:"rectEnd",color:g.parseMessage(o[T-2]),signalType:g.LINETYPE.RECT_END}),this.$=o[T-1];break;case 37:o[T-1].unshift({type:"optStart",optText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.OPT_START}),o[T-1].push({type:"optEnd",optText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.OPT_END}),this.$=o[T-1];break;case 38:o[T-1].unshift({type:"altStart",altText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.ALT_START}),o[T-1].push({type:"altEnd",signalType:g.LINETYPE.ALT_END}),this.$=o[T-1];break;case 39:o[T-1].unshift({type:"parStart",parText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.PAR_START}),o[T-1].push({type:"parEnd",signalType:g.LINETYPE.PAR_END}),this.$=o[T-1];break;case 40:o[T-1].unshift({type:"parStart",parText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.PAR_OVER_START}),o[T-1].push({type:"parEnd",signalType:g.LINETYPE.PAR_END}),this.$=o[T-1];break;case 41:o[T-1].unshift({type:"criticalStart",criticalText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.CRITICAL_START}),o[T-1].push({type:"criticalEnd",signalType:g.LINETYPE.CRITICAL_END}),this.$=o[T-1];break;case 42:o[T-1].unshift({type:"breakStart",breakText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.BREAK_START}),o[T-1].push({type:"breakEnd",optText:g.parseMessage(o[T-2]),signalType:g.LINETYPE.BREAK_END}),this.$=o[T-1];break;case 44:this.$=o[T-3].concat([{type:"option",optionText:g.parseMessage(o[T-1]),signalType:g.LINETYPE.CRITICAL_OPTION},o[T]]);break;case 46:this.$=o[T-3].concat([{type:"and",parText:g.parseMessage(o[T-1]),signalType:g.LINETYPE.PAR_AND},o[T]]);break;case 48:this.$=o[T-3].concat([{type:"else",altText:g.parseMessage(o[T-1]),signalType:g.LINETYPE.ALT_ELSE},o[T]]);break;case 49:o[T-3].draw="participant",o[T-3].type="addParticipant",o[T-3].description=g.parseMessage(o[T-1]),this.$=o[T-3];break;case 50:o[T-1].draw="participant",o[T-1].type="addParticipant",this.$=o[T-1];break;case 51:o[T-3].draw="actor",o[T-3].type="addParticipant",o[T-3].description=g.parseMessage(o[T-1]),this.$=o[T-3];break;case 52:case 57:o[T-1].draw="actor",o[T-1].type="addParticipant",this.$=o[T-1];break;case 53:o[T-1].type="destroyParticipant",this.$=o[T-1];break;case 54:o[T-3].draw="participant",o[T-3].type="addParticipant",o[T-3].description=g.parseMessage(o[T-1]),this.$=o[T-3];break;case 55:o[T-1].draw="participant",o[T-1].type="addParticipant",this.$=o[T-1];break;case 56:o[T-3].draw="actor",o[T-3].type="addParticipant",o[T-3].description=g.parseMessage(o[T-1]),this.$=o[T-3];break;case 58:this.$=[o[T-1],{type:"addNote",placement:o[T-2],actor:o[T-1].actor,text:o[T]}];break;case 59:o[T-2]=[].concat(o[T-1],o[T-1]).slice(0,2),o[T-2][0]=o[T-2][0].actor,o[T-2][1]=o[T-2][1].actor,this.$=[o[T-1],{type:"addNote",placement:g.PLACEMENT.OVER,actor:o[T-2].slice(0,2),text:o[T]}];break;case 60:this.$=[o[T-1],{type:"addLinks",actor:o[T-1].actor,text:o[T]}];break;case 61:this.$=[o[T-1],{type:"addALink",actor:o[T-1].actor,text:o[T]}];break;case 62:this.$=[o[T-1],{type:"addProperties",actor:o[T-1].actor,text:o[T]}];break;case 63:this.$=[o[T-1],{type:"addDetails",actor:o[T-1].actor,text:o[T]}];break;case 66:this.$=[o[T-2],o[T]];break;case 67:this.$=o[T];break;case 68:this.$=g.PLACEMENT.LEFTOF;break;case 69:this.$=g.PLACEMENT.RIGHTOF;break;case 70:this.$=[o[T-4],o[T-1],{type:"addMessage",from:o[T-4].actor,to:o[T-1].actor,signalType:o[T-3],msg:o[T],activate:!0},{type:"activeStart",signalType:g.LINETYPE.ACTIVE_START,actor:o[T-1].actor}];break;case 71:this.$=[o[T-4],o[T-1],{type:"addMessage",from:o[T-4].actor,to:o[T-1].actor,signalType:o[T-3],msg:o[T]},{type:"activeEnd",signalType:g.LINETYPE.ACTIVE_END,actor:o[T-4].actor}];break;case 72:this.$=[o[T-4],o[T-1],{type:"addMessage",from:o[T-4].actor,to:o[T-1].actor,signalType:o[T-3],msg:o[T],activate:!0,centralConnection:g.LINETYPE.CENTRAL_CONNECTION},{type:"centralConnection",signalType:g.LINETYPE.CENTRAL_CONNECTION,actor:o[T-1].actor}];break;case 73:this.$=[o[T-4],o[T-1],{type:"addMessage",from:o[T-4].actor,to:o[T-1].actor,signalType:o[T-2],msg:o[T],activate:!1,centralConnection:g.LINETYPE.CENTRAL_CONNECTION_REVERSE},{type:"centralConnectionReverse",signalType:g.LINETYPE.CENTRAL_CONNECTION_REVERSE,actor:o[T-4].actor}];break;case 74:this.$=[o[T-5],o[T-1],{type:"addMessage",from:o[T-5].actor,to:o[T-1].actor,signalType:o[T-3],msg:o[T],activate:!0,centralConnection:g.LINETYPE.CENTRAL_CONNECTION_DUAL},{type:"centralConnection",signalType:g.LINETYPE.CENTRAL_CONNECTION,actor:o[T-1].actor},{type:"centralConnectionReverse",signalType:g.LINETYPE.CENTRAL_CONNECTION_REVERSE,actor:o[T-5].actor}];break;case 75:this.$=[o[T-3],o[T-1],{type:"addMessage",from:o[T-3].actor,to:o[T-1].actor,signalType:o[T-2],msg:o[T]}];break;case 76:this.$={type:"addParticipant",actor:o[T-1],config:o[T]};break;case 77:this.$=o[T-1].trim();break;case 78:this.$={type:"addParticipant",actor:o[T]};break;case 79:this.$=g.LINETYPE.SOLID_OPEN;break;case 80:this.$=g.LINETYPE.DOTTED_OPEN;break;case 81:this.$=g.LINETYPE.SOLID;break;case 82:this.$=g.LINETYPE.SOLID_TOP;break;case 83:this.$=g.LINETYPE.SOLID_BOTTOM;break;case 84:this.$=g.LINETYPE.STICK_TOP;break;case 85:this.$=g.LINETYPE.STICK_BOTTOM;break;case 86:this.$=g.LINETYPE.SOLID_TOP_DOTTED;break;case 87:this.$=g.LINETYPE.SOLID_BOTTOM_DOTTED;break;case 88:this.$=g.LINETYPE.STICK_TOP_DOTTED;break;case 89:this.$=g.LINETYPE.STICK_BOTTOM_DOTTED;break;case 90:this.$=g.LINETYPE.SOLID_ARROW_TOP_REVERSE;break;case 91:this.$=g.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE;break;case 92:this.$=g.LINETYPE.STICK_ARROW_TOP_REVERSE;break;case 93:this.$=g.LINETYPE.STICK_ARROW_BOTTOM_REVERSE;break;case 94:this.$=g.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED;break;case 95:this.$=g.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED;break;case 96:this.$=g.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED;break;case 97:this.$=g.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED;break;case 98:this.$=g.LINETYPE.BIDIRECTIONAL_SOLID;break;case 99:this.$=g.LINETYPE.DOTTED;break;case 100:this.$=g.LINETYPE.BIDIRECTIONAL_DOTTED;break;case 101:this.$=g.LINETYPE.SOLID_CROSS;break;case 102:this.$=g.LINETYPE.DOTTED_CROSS;break;case 103:this.$=g.LINETYPE.SOLID_POINT;break;case 104:this.$=g.LINETYPE.DOTTED_POINT;break;case 105:this.$=g.parseMessage(o[T].trim().substring(1));break}},"anonymous"),table:[{3:1,4:t,5:a,6:r},{1:[3]},{3:5,4:t,5:a,6:r},{3:6,4:t,5:a,6:r},e([1,4,5,10,14,15,19,22,24,30,31,32,34,36,37,38,39,40,42,44,45,47,51,53,54,56,61,62,63,64,73],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},e(I,[2,5]),{9:48,13:13,14:h,15:s,18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},e(I,[2,7]),e(I,[2,8]),e(I,[2,9]),e(I,[2,15]),{13:49,51:X,53:z,54:v},{16:[1,50]},{5:[1,51]},{5:[1,54],20:[1,52],21:[1,53]},{23:55,73:R},{23:56,73:R},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},{5:[1,61]},e(I,[2,30]),e(I,[2,31]),{33:[1,62]},{35:[1,63]},e(I,[2,34]),{16:[1,64]},{16:[1,65]},{16:[1,66]},{16:[1,67]},{16:[1,68]},{16:[1,69]},{16:[1,70]},{16:[1,71]},{23:72,55:73,73:ot},{23:75,55:76,73:ot},{23:77,73:R},{69:78,72:[1,79],78:ct,79:C,80:ie,81:ne,82:oe,83:ce,84:le,85:he,86:de,87:Te,88:Ee,89:pe,90:ue,91:_e,92:fe,93:ge,94:xe,95:Ie,96:be,97:Re,98:Oe,99:ye,100:Le,101:Se,102:me,103:Ne},{57:106,59:[1,107],67:[1,108],68:[1,109]},{23:110,73:R},{23:111,73:R},{23:112,73:R},{23:113,73:R},e([5,66,72,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104],Ae),e(I,[2,6]),e(I,[2,16]),e(Lt,[2,10],{11:114}),e(I,[2,18]),{5:[1,116],20:[1,115]},{5:[1,117]},e(I,[2,22]),{5:[1,118]},{5:[1,119]},e(I,[2,25]),e(I,[2,26]),e(I,[2,27]),e(I,[2,28]),e(I,[2,29]),e(I,[2,32]),e(I,[2,33]),e(wt,i,{7:120}),e(wt,i,{7:121}),e(wt,i,{7:122}),e(we,i,{41:123,7:124}),e(Ht,i,{43:125,7:126}),e(Ht,i,{7:126,43:127}),e(Pe,i,{46:128,7:129}),e(wt,i,{7:130}),{5:[1,132],52:[1,131]},{5:[1,134],52:[1,133]},e(zt,Ae,{74:135,75:[1,136]}),{5:[1,138],52:[1,137]},{5:[1,140],52:[1,139]},{5:[1,141]},{23:145,70:[1,142],71:[1,143],72:[1,144],73:R},{69:146,78:ct,79:C,80:ie,81:ne,82:oe,83:ce,84:le,85:he,86:de,87:Te,88:Ee,89:pe,90:ue,91:_e,92:fe,93:ge,94:xe,95:Ie,96:be,97:Re,98:Oe,99:ye,100:Le,101:Se,102:me,103:Ne},e(B,[2,79]),e(B,[2,80]),e(B,[2,81]),e(B,[2,82]),e(B,[2,83]),e(B,[2,84]),e(B,[2,85]),e(B,[2,86]),e(B,[2,87]),e(B,[2,88]),e(B,[2,89]),e(B,[2,90]),e(B,[2,91]),e(B,[2,92]),e(B,[2,93]),e(B,[2,94]),e(B,[2,95]),e(B,[2,96]),e(B,[2,97]),e(B,[2,98]),e(B,[2,99]),e(B,[2,100]),e(B,[2,101]),e(B,[2,102]),e(B,[2,103]),e(B,[2,104]),{23:147,73:R},{23:149,60:148,73:R},{73:[2,68]},{73:[2,69]},{58:150,104:it},{58:152,104:it},{58:153,104:it},{58:154,104:it},{4:[1,157],5:[1,159],12:156,13:158,17:[1,155],51:X,53:z,54:v},{5:[1,160]},e(I,[2,20]),e(I,[2,21]),e(I,[2,23]),e(I,[2,24]),{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[1,161],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[1,162],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[1,163],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{17:[1,164]},{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[2,47],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,50:[1,165],51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{17:[1,166]},{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[2,45],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,49:[1,167],51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{17:[1,168]},{17:[1,169]},{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[2,43],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,48:[1,170],51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{4:n,5:c,8:8,9:10,10:l,13:13,14:h,15:s,17:[1,171],18:16,19:E,22:p,23:41,24:f,25:20,26:21,27:22,28:23,29:24,30:u,31:O,32:b,34:L,36:w,37:A,38:k,39:D,40:M,42:W,44:K,45:H,47:G,51:X,53:z,54:v,56:tt,61:Z,62:et,63:st,64:at,73:R},{16:[1,172]},e(I,[2,50]),{16:[1,173]},e(I,[2,55]),e(zt,[2,76]),{76:[1,174]},{16:[1,175]},e(I,[2,52]),{16:[1,176]},e(I,[2,57]),e(I,[2,53]),{23:177,73:R},{23:178,73:R},{23:179,73:R},{58:180,104:it},{23:181,72:[1,182],73:R},{58:183,104:it},{58:184,104:it},{66:[1,185],104:[2,67]},{5:[2,60]},{5:[2,105]},{5:[2,61]},{5:[2,62]},{5:[2,63]},e(I,[2,17]),e(Lt,[2,11]),{13:186,51:X,53:z,54:v},e(Lt,[2,13]),e(Lt,[2,14]),e(I,[2,19]),e(I,[2,35]),e(I,[2,36]),e(I,[2,37]),e(I,[2,38]),{16:[1,187]},e(I,[2,39]),{16:[1,188]},e(I,[2,40]),e(I,[2,41]),{16:[1,189]},e(I,[2,42]),{5:[1,190]},{5:[1,191]},{77:[1,192]},{5:[1,193]},{5:[1,194]},{58:195,104:it},{58:196,104:it},{58:197,104:it},{5:[2,75]},{58:198,104:it},{23:199,73:R},{5:[2,58]},{5:[2,59]},{23:200,73:R},e(Lt,[2,12]),e(we,i,{7:124,41:201}),e(Ht,i,{7:126,43:202}),e(Pe,i,{7:129,46:203}),e(I,[2,49]),e(I,[2,54]),e(zt,[2,77]),e(I,[2,51]),e(I,[2,56]),{5:[2,70]},{5:[2,71]},{5:[2,72]},{5:[2,73]},{58:204,104:it},{104:[2,66]},{17:[2,48]},{17:[2,46]},{17:[2,44]},{5:[2,74]}],defaultActions:{5:[2,1],6:[2,2],108:[2,68],109:[2,69],150:[2,60],151:[2,105],152:[2,61],153:[2,62],154:[2,63],180:[2,75],183:[2,58],184:[2,59],195:[2,70],196:[2,71],197:[2,72],198:[2,73],200:[2,66],201:[2,48],202:[2,46],203:[2,44],204:[2,74]},parseError:_(function(y,N){if(N.recoverable)this.trace(y);else{var m=new Error(y);throw m.hash=N,m}},"parseError"),parse:_(function(y){var N=this,m=[0],g=[],V=[null],o=[],St=this.table,T="",kt=0,ke=0,De=0,ur=2,ve=1,_r=o.slice.call(arguments,1),q=Object.create(this.lexer),_t={yy:{}};for(var Gt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Gt)&&(_t.yy[Gt]=this.yy[Gt]);q.setInput(y,_t.yy),_t.yy.lexer=q,_t.yy.parser=this,typeof q.yylloc>"u"&&(q.yylloc={});var Xt=q.yylloc;o.push(Xt);var fr=q.options&&q.options.ranges;typeof _t.yy.parseError=="function"?this.parseError=_t.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function gr(rt){m.length=m.length-2*rt,V.length=V.length-rt,o.length=o.length-rt}_(gr,"popStack");function Ce(){var rt;return rt=g.pop()||q.lex()||ve,typeof rt!="number"&&(rt instanceof Array&&(g=rt,rt=g.pop()),rt=N.symbols_[rt]||rt),rt}_(Ce,"lex");for(var J,Jt,ft,nt,us,Qt,bt={},Dt,dt,Me,vt;;){if(ft=m[m.length-1],this.defaultActions[ft]?nt=this.defaultActions[ft]:((J===null||typeof J>"u")&&(J=Ce()),nt=St[ft]&&St[ft][J]),typeof nt>"u"||!nt.length||!nt[0]){var Zt="";vt=[];for(Dt in St[ft])this.terminals_[Dt]&&Dt>ur&&vt.push("'"+this.terminals_[Dt]+"'");q.showPosition?Zt="Parse error on line "+(kt+1)+`: +`+q.showPosition()+` +Expecting `+vt.join(", ")+", got '"+(this.terminals_[J]||J)+"'":Zt="Parse error on line "+(kt+1)+": Unexpected "+(J==ve?"end of input":"'"+(this.terminals_[J]||J)+"'"),this.parseError(Zt,{text:q.match,token:this.terminals_[J]||J,line:q.yylineno,loc:Xt,expected:vt})}if(nt[0]instanceof Array&&nt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ft+", token: "+J);switch(nt[0]){case 1:m.push(J),V.push(q.yytext),o.push(q.yylloc),m.push(nt[1]),J=null,Jt?(J=Jt,Jt=null):(ke=q.yyleng,T=q.yytext,kt=q.yylineno,Xt=q.yylloc,De>0&&De--);break;case 2:if(dt=this.productions_[nt[1]][1],bt.$=V[V.length-dt],bt._$={first_line:o[o.length-(dt||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(dt||1)].first_column,last_column:o[o.length-1].last_column},fr&&(bt._$.range=[o[o.length-(dt||1)].range[0],o[o.length-1].range[1]]),Qt=this.performAction.apply(bt,[T,ke,kt,_t.yy,nt[1],V,o].concat(_r)),typeof Qt<"u")return Qt;dt&&(m=m.slice(0,-1*dt*2),V=V.slice(0,-1*dt),o=o.slice(0,-1*dt)),m.push(this.productions_[nt[1]][0]),V.push(bt.$),o.push(bt._$),Me=St[m[m.length-2]][m[m.length-1]],m.push(Me);break;case 3:return!0}}return!0},"parse")},pr=(function(){var Et={EOF:1,parseError:_(function(N,m){if(this.yy.parser)this.yy.parser.parseError(N,m);else throw new Error(N)},"parseError"),setInput:_(function(y,N){return this.yy=N||this.yy||{},this._input=y,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:_(function(){var y=this._input[0];this.yytext+=y,this.yyleng++,this.offset++,this.match+=y,this.matched+=y;var N=y.match(/(?:\r\n?|\n).*/g);return N?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),y},"input"),unput:_(function(y){var N=y.length,m=y.split(/(?:\r\n?|\n)/g);this._input=y+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-N),this.offset-=N;var g=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),m.length-1&&(this.yylineno-=m.length-1);var V=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:m?(m.length===g.length?this.yylloc.first_column:0)+g[g.length-m.length].length-m[0].length:this.yylloc.first_column-N},this.options.ranges&&(this.yylloc.range=[V[0],V[0]+this.yyleng-N]),this.yyleng=this.yytext.length,this},"unput"),more:_(function(){return this._more=!0,this},"more"),reject:_(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:_(function(y){this.unput(this.match.slice(y))},"less"),pastInput:_(function(){var y=this.matched.substr(0,this.matched.length-this.match.length);return(y.length>20?"...":"")+y.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:_(function(){var y=this.match;return y.length<20&&(y+=this._input.substr(0,20-y.length)),(y.substr(0,20)+(y.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:_(function(){var y=this.pastInput(),N=new Array(y.length+1).join("-");return y+this.upcomingInput()+` +`+N+"^"},"showPosition"),test_match:_(function(y,N){var m,g,V;if(this.options.backtrack_lexer&&(V={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(V.yylloc.range=this.yylloc.range.slice(0))),g=y[0].match(/(?:\r\n?|\n).*/g),g&&(this.yylineno+=g.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:g?g[g.length-1].length-g[g.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+y[0].length},this.yytext+=y[0],this.match+=y[0],this.matches=y,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(y[0].length),this.matched+=y[0],m=this.performAction.call(this,this.yy,this,N,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),m)return m;if(this._backtrack){for(var o in V)this[o]=V[o];return!1}return!1},"test_match"),next:_(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var y,N,m,g;this._more||(this.yytext="",this.match="");for(var V=this._currentRules(),o=0;oN[0].length)){if(N=m,g=o,this.options.backtrack_lexer){if(y=this.test_match(m,V[o]),y!==!1)return y;if(this._backtrack){N=!1;continue}else return!1}else if(!this.options.flex)break}return N?(y=this.test_match(N,V[g]),y!==!1?y:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:_(function(){var N=this.next();return N||this.lex()},"lex"),begin:_(function(N){this.conditionStack.push(N)},"begin"),popState:_(function(){var N=this.conditionStack.length-1;return N>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:_(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:_(function(N){return N=this.conditionStack.length-1-Math.abs(N||0),N>=0?this.conditionStack[N]:"INITIAL"},"topState"),pushState:_(function(N){this.begin(N)},"pushState"),stateStackSize:_(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:_(function(N,m,g,V){var o=V;switch(g){case 0:return 5;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:return 20;case 7:return this.begin("CONFIG"),75;break;case 8:return 76;case 9:return this.popState(),this.begin("ALIAS"),77;break;case 10:return this.popState(),this.popState(),77;break;case 11:return m.yytext=m.yytext.trim(),73;break;case 12:return m.yytext=m.yytext.trim(),this.begin("ALIAS"),73;break;case 13:return m.yytext=m.yytext.trim(),this.popState(),73;break;case 14:return this.popState(),10;break;case 15:return this.begin("LINE"),15;break;case 16:return this.begin("ID"),51;break;case 17:return this.begin("ID"),53;break;case 18:return 14;case 19:return this.begin("ID"),54;break;case 20:return this.popState(),this.popState(),this.begin("LINE"),52;break;case 21:return this.popState(),this.popState(),5;break;case 22:return this.begin("LINE"),37;break;case 23:return this.begin("LINE"),38;break;case 24:return this.begin("LINE"),39;break;case 25:return this.begin("LINE"),40;break;case 26:return this.begin("LINE"),50;break;case 27:return this.begin("LINE"),42;break;case 28:return this.begin("LINE"),44;break;case 29:return this.begin("LINE"),49;break;case 30:return this.begin("LINE"),45;break;case 31:return this.begin("LINE"),48;break;case 32:return this.begin("LINE"),47;break;case 33:return this.popState(),16;break;case 34:return 17;case 35:return 67;case 36:return 68;case 37:return 61;case 38:return 62;case 39:return 63;case 40:return 64;case 41:return 59;case 42:return 56;case 43:return this.begin("ID"),22;break;case 44:return this.begin("ID"),24;break;case 45:return 30;case 46:return 31;case 47:return this.begin("acc_title"),32;break;case 48:return this.popState(),"acc_title_value";break;case 49:return this.begin("acc_descr"),34;break;case 50:return this.popState(),"acc_descr_value";break;case 51:this.begin("acc_descr_multiline");break;case 52:this.popState();break;case 53:return"acc_descr_multiline_value";case 54:return 6;case 55:return 19;case 56:return 21;case 57:return 66;case 58:return 5;case 59:return m.yytext=m.yytext.trim(),73;break;case 60:return 80;case 61:return 97;case 62:return 98;case 63:return 99;case 64:return 78;case 65:return 79;case 66:return 100;case 67:return 101;case 68:return 102;case 69:return 103;case 70:return 85;case 71:return 86;case 72:return 87;case 73:return 88;case 74:return 93;case 75:return 94;case 76:return 95;case 77:return 96;case 78:return 81;case 79:return 82;case 80:return 83;case 81:return 84;case 82:return 89;case 83:return 90;case 84:return 91;case 85:return 92;case 86:return 104;case 87:return 104;case 88:return 70;case 89:return 71;case 90:return 72;case 91:return 5;case 92:return 10}},"anonymous"),rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:@\{)/i,/^(?:[^\}]+)/i,/^(?:\}(?=\s+as\s))/i,/^(?:\})/i,/^(?:[^\<->\->:\n,;@\s]+(?=@\{))/i,/^(?:[^<>:\n,;@\s]+(?=\s+as\s))/i,/^(?:[^<>:\n,;@]+(?=\s*[\n;#]|$))/i,/^(?:[^<>:\n,;@]*<[^\n]*)/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:create\b)/i,/^(?:destroy\b)/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:par_over\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\/\\\+\()\+<\->\->:\n,;]+((?!(-x|--x|-\)|--\)|-\|\\|-\\|-\/|-\/\/|-\|\/|\/\|-|\\\|-|\/\/-|\\\\-|\/\|-|--\|\\|--|\(\)))[\-]*[^\+<\->\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:<<->>)/i,/^(?:-->>)/i,/^(?:<<-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?:--\|\\)/i,/^(?:--\|\/)/i,/^(?:--\\\\)/i,/^(?:--\/\/)/i,/^(?:\/\|--)/i,/^(?:\\\|--)/i,/^(?:\/\/--)/i,/^(?:\\\\--)/i,/^(?:-\|\\)/i,/^(?:-\|\/)/i,/^(?:-\\\\)/i,/^(?:-\/\/)/i,/^(?:\/\|-)/i,/^(?:\\\|-)/i,/^(?:\/\/-)/i,/^(?:\\\\-)/i,/^(?::(?:(?:no)?wrap)?[^#\n;]*)/i,/^(?::)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:\(\))/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[52,53],inclusive:!1},acc_descr:{rules:[50],inclusive:!1},acc_title:{rules:[48],inclusive:!1},ID:{rules:[2,3,7,11,12,13,14],inclusive:!1},ALIAS:{rules:[2,3,20,21],inclusive:!1},LINE:{rules:[2,3,33],inclusive:!1},CONFIG:{rules:[8,9,10],inclusive:!1},CONFIG_DATA:{rules:[],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,6,15,16,17,18,19,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,49,51,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92],inclusive:!0}}};return Et})();Ut.lexer=pr;function Pt(){this.yy={}}return _(Pt,"Parser"),Pt.prototype=Ut,Ut.Parser=Pt,new Pt})();ee.parser=ee;var br=ee,Rr={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31,PAR_OVER_START:32,BIDIRECTIONAL_SOLID:33,BIDIRECTIONAL_DOTTED:34,SOLID_TOP:41,SOLID_BOTTOM:42,STICK_TOP:43,STICK_BOTTOM:44,SOLID_ARROW_TOP_REVERSE:45,SOLID_ARROW_BOTTOM_REVERSE:46,STICK_ARROW_TOP_REVERSE:47,STICK_ARROW_BOTTOM_REVERSE:48,SOLID_TOP_DOTTED:51,SOLID_BOTTOM_DOTTED:52,STICK_TOP_DOTTED:53,STICK_BOTTOM_DOTTED:54,SOLID_ARROW_TOP_REVERSE_DOTTED:55,SOLID_ARROW_BOTTOM_REVERSE_DOTTED:56,STICK_ARROW_TOP_REVERSE_DOTTED:57,STICK_ARROW_BOTTOM_REVERSE_DOTTED:58,CENTRAL_CONNECTION:59,CENTRAL_CONNECTION_REVERSE:60,CENTRAL_CONNECTION_DUAL:61},Or={FILLED:0,OPEN:1},yr={LEFTOF:0,RIGHTOF:1,OVER:2},Yt={ACTOR:"actor",BOUNDARY:"boundary",COLLECTIONS:"collections",CONTROL:"control",DATABASE:"database",ENTITY:"entity",PARTICIPANT:"participant",QUEUE:"queue"},Lr=class{constructor(){this.state=new tr(()=>({prevActor:void 0,actors:new Map,createdActors:new Map,destroyedActors:new Map,boxes:[],messages:[],notes:[],sequenceNumbersEnabled:!1,wrapEnabled:void 0,currentBox:void 0,lastCreated:void 0,lastDestroyed:void 0})),this.setAccTitle=jt,this.setAccDescription=He,this.setDiagramTitle=Ue,this.getAccTitle=qe,this.getAccDescription=ze,this.getDiagramTitle=Ge,this.apply=this.apply.bind(this),this.parseBoxData=this.parseBoxData.bind(this),this.parseMessage=this.parseMessage.bind(this),this.clear(),this.setWrap(j().wrap),this.LINETYPE=Rr,this.ARROWTYPE=Or,this.PLACEMENT=yr}static{_(this,"SequenceDB")}addBox(e){this.state.records.boxes.push({name:e.text,wrap:e.wrap??this.autoWrap(),fill:e.color,actorKeys:[]}),this.state.records.currentBox=this.state.records.boxes.slice(-1)[0]}addActor(e,t,a,r,i){let n=this.state.records.currentBox,c;if(i!==void 0){let h;i.includes(` +`)?h=i+` +`:h=`{ +`+i+` +}`,c=Qe(h,{schema:Je})}r=c?.type??r,c?.alias&&(!a||a.text===t)&&(a={text:c.alias,wrap:a?.wrap,type:r});let l=this.state.records.actors.get(e);if(l){if(this.state.records.currentBox&&l.box&&this.state.records.currentBox!==l.box)throw new Error(`A same participant should only be defined in one Box: ${l.name} can't be in '${l.box.name}' and in '${this.state.records.currentBox.name}' at the same time.`);if(n=l.box?l.box:this.state.records.currentBox,l.box=n,l&&t===l.name&&a==null)return}if(a?.text==null&&(a={text:t,type:r}),(r==null||a.text==null)&&(a={text:t,type:r}),this.state.records.actors.set(e,{box:n,name:t,description:a.text,wrap:a.wrap??this.autoWrap(),prevActor:this.state.records.prevActor,links:{},properties:{},actorCnt:null,rectData:null,type:r??"participant"}),this.state.records.prevActor){let h=this.state.records.actors.get(this.state.records.prevActor);h&&(h.nextActor=e)}this.state.records.currentBox&&this.state.records.currentBox.actorKeys.push(e),this.state.records.prevActor=e}activationCount(e){let t,a=0;if(!e)return 0;for(t=0;t>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},l}return this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:e,to:t,message:a?.text??"",wrap:a?.wrap??this.autoWrap(),type:r,activate:i,centralConnection:n??0}),!0}hasAtLeastOneBox(){return this.state.records.boxes.length>0}hasAtLeastOneBoxWithTitle(){return this.state.records.boxes.some(e=>e.name)}getMessages(){return this.state.records.messages}getBoxes(){return this.state.records.boxes}getActors(){return this.state.records.actors}getCreatedActors(){return this.state.records.createdActors}getDestroyedActors(){return this.state.records.destroyedActors}getActor(e){return this.state.records.actors.get(e)}getActorKeys(){return[...this.state.records.actors.keys()]}enableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!0}disableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!1}showSequenceNumbers(){return this.state.records.sequenceNumbersEnabled}setWrap(e){this.state.records.wrapEnabled=e}extractWrap(e){if(e===void 0)return{};e=e.trim();let t=/^:?wrap:/.exec(e)!==null?!0:/^:?nowrap:/.exec(e)!==null?!1:void 0;return{cleanedText:(t===void 0?e:e.replace(/^:?(?:no)?wrap:/,"")).trim(),wrap:t}}autoWrap(){return this.state.records.wrapEnabled!==void 0?this.state.records.wrapEnabled:j().sequence?.wrap??!1}clear(){this.state.reset(),Fe()}parseMessage(e){let t=e.trim(),{wrap:a,cleanedText:r}=this.extractWrap(t),i={text:r,wrap:a};return Q.debug(`parseMessage: ${JSON.stringify(i)}`),i}parseBoxData(e){let t=/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/.exec(e),a=t?.[1]?t[1].trim():"transparent",r=t?.[2]?t[2].trim():void 0;if(window?.CSS)window.CSS.supports("color",a)||(a="transparent",r=e.trim());else{let c=new Option().style;c.color=a,c.color!==a&&(a="transparent",r=e.trim())}let{wrap:i,cleanedText:n}=this.extractWrap(r);return{text:n?Nt(n,j()):void 0,color:a,wrap:i}}addNote(e,t,a){let r={actor:e,placement:t,message:a.text,wrap:a.wrap??this.autoWrap()},i=[].concat(e,e);this.state.records.notes.push(r),this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:i[0],to:i[1],message:a.text,wrap:a.wrap??this.autoWrap(),type:this.LINETYPE.NOTE,placement:t})}addLinks(e,t){let a=this.getActor(e);try{let r=Nt(t.text,j());r=r.replace(/=/g,"="),r=r.replace(/&/g,"&");let i=JSON.parse(r);this.insertLinks(a,i)}catch(r){Q.error("error while parsing actor link text",r)}}addALink(e,t){let a=this.getActor(e);try{let r={},i=Nt(t.text,j()),n=i.indexOf("@");i=i.replace(/=/g,"="),i=i.replace(/&/g,"&");let c=i.slice(0,n-1).trim(),l=i.slice(n+1).trim();r[c]=l,this.insertLinks(a,r)}catch(r){Q.error("error while parsing actor link text",r)}}insertLinks(e,t){if(e.links==null)e.links=t;else for(let a in t)e.links[a]=t[a]}addProperties(e,t){let a=this.getActor(e);try{let r=Nt(t.text,j()),i=JSON.parse(r);this.insertProperties(a,i)}catch(r){Q.error("error while parsing actor properties text",r)}}insertProperties(e,t){if(e.properties==null)e.properties=t;else for(let a in t)e.properties[a]=t[a]}boxEnd(){this.state.records.currentBox=void 0}addDetails(e,t){let a=this.getActor(e),r=document.getElementById(t.text);try{let i=r.innerHTML,n=JSON.parse(i);n.properties&&this.insertProperties(a,n.properties),n.links&&this.insertLinks(a,n.links)}catch(i){Q.error("error while parsing actor details text",i)}}getActorProperty(e,t){if(e?.properties!==void 0)return e.properties[t]}apply(e){if(Array.isArray(e))e.forEach(t=>{this.apply(t)});else switch(e.type){case"sequenceIndex":this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:void 0,to:void 0,message:{start:e.sequenceIndex,step:e.sequenceIndexStep,visible:e.sequenceVisible},wrap:!1,type:e.signalType});break;case"addParticipant":this.addActor(e.actor,e.actor,e.description,e.draw,e.config);break;case"createParticipant":if(this.state.records.actors.has(e.actor))throw new Error("It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior");this.state.records.lastCreated=e.actor,this.addActor(e.actor,e.actor,e.description,e.draw,e.config),this.state.records.createdActors.set(e.actor,this.state.records.messages.length);break;case"destroyParticipant":this.state.records.lastDestroyed=e.actor,this.state.records.destroyedActors.set(e.actor,this.state.records.messages.length);break;case"activeStart":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"centralConnection":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"centralConnectionReverse":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"activeEnd":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"addNote":this.addNote(e.actor,e.placement,e.text);break;case"addLinks":this.addLinks(e.actor,e.text);break;case"addALink":this.addALink(e.actor,e.text);break;case"addProperties":this.addProperties(e.actor,e.text);break;case"addDetails":this.addDetails(e.actor,e.text);break;case"addMessage":if(this.state.records.lastCreated){if(e.to!==this.state.records.lastCreated)throw new Error("The created participant "+this.state.records.lastCreated.name+" does not have an associated creating message after its declaration. Please check the sequence diagram.");this.state.records.lastCreated=void 0}else if(this.state.records.lastDestroyed){if(e.to!==this.state.records.lastDestroyed&&e.from!==this.state.records.lastDestroyed)throw new Error("The destroyed participant "+this.state.records.lastDestroyed.name+" does not have an associated destroying message after its declaration. Please check the sequence diagram.");this.state.records.lastDestroyed=void 0}this.addSignal(e.from,e.to,e.msg,e.signalType,e.activate,e.centralConnection);break;case"boxStart":this.addBox(e.boxData);break;case"boxEnd":this.boxEnd();break;case"loopStart":this.addSignal(void 0,void 0,e.loopText,e.signalType);break;case"loopEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"rectStart":this.addSignal(void 0,void 0,e.color,e.signalType);break;case"rectEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"optStart":this.addSignal(void 0,void 0,e.optText,e.signalType);break;case"optEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"altStart":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"else":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"altEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"setAccTitle":jt(e.text);break;case"parStart":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"and":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"parEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"criticalStart":this.addSignal(void 0,void 0,e.criticalText,e.signalType);break;case"option":this.addSignal(void 0,void 0,e.optionText,e.signalType);break;case"criticalEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"breakStart":this.addSignal(void 0,void 0,e.breakText,e.signalType);break;case"breakEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break}}getConfig(){return j().sequence}},Sr=_(e=>`.actor { + stroke: ${e.actorBorder}; + fill: ${e.actorBkg}; + } + + text.actor > tspan { + fill: ${e.actorTextColor}; + stroke: none; + } + + .actor-line { + stroke: ${e.actorLineColor}; + } + + .innerArc { + stroke-width: 1.5; + stroke-dasharray: none; + } + + .messageLine0 { + stroke-width: 1.5; + stroke-dasharray: none; + stroke: ${e.signalColor}; + } + + .messageLine1 { + stroke-width: 1.5; + stroke-dasharray: 2, 2; + stroke: ${e.signalColor}; + } + + #arrowhead path { + fill: ${e.signalColor}; + stroke: ${e.signalColor}; + } + + .sequenceNumber { + fill: ${e.sequenceNumberColor}; + } + + #sequencenumber { + fill: ${e.signalColor}; + } + + #crosshead path { + fill: ${e.signalColor}; + stroke: ${e.signalColor}; + } + + .messageText { + fill: ${e.signalTextColor}; + stroke: none; + } + + .labelBox { + stroke: ${e.labelBoxBorderColor}; + fill: ${e.labelBoxBkgColor}; + } + + .labelText, .labelText > tspan { + fill: ${e.labelTextColor}; + stroke: none; + } + + .loopText, .loopText > tspan { + fill: ${e.loopTextColor}; + stroke: none; + } + + .loopLine { + stroke-width: 2px; + stroke-dasharray: 2, 2; + stroke: ${e.labelBoxBorderColor}; + fill: ${e.labelBoxBorderColor}; + } + + .note { + //stroke: #decc93; + stroke: ${e.noteBorderColor}; + fill: ${e.noteBkgColor}; + } + + .noteText, .noteText > tspan { + fill: ${e.noteTextColor}; + stroke: none; + } + + .activation0 { + fill: ${e.activationBkgColor}; + stroke: ${e.activationBorderColor}; + } + + .activation1 { + fill: ${e.activationBkgColor}; + stroke: ${e.activationBorderColor}; + } + + .activation2 { + fill: ${e.activationBkgColor}; + stroke: ${e.activationBorderColor}; + } + + .actorPopupMenu { + position: absolute; + } + + .actorPopupMenuPanel { + position: absolute; + fill: ${e.actorBkg}; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4)); +} + .actor-man line { + stroke: ${e.actorBorder}; + fill: ${e.actorBkg}; + } + .actor-man circle, line { + stroke: ${e.actorBorder}; + fill: ${e.actorBkg}; + stroke-width: 2px; + } + +`,"getStyles"),mr=Sr,gt=36,pt="actor-top",ut="actor-bottom",Kt="actor-box",xt="actor-man",At=_(function(e,t){return $e(e,t)},"drawRect"),Nr=_(function(e,t,a,r,i){if(t.links===void 0||t.links===null||Object.keys(t.links).length===0)return{height:0,width:0};let n=t.links,c=t.actorCnt,l=t.rectData;var h="none";i&&(h="block !important");let s=e.append("g");s.attr("id","actor"+c+"_popup"),s.attr("class","actorPopupMenu"),s.attr("display",h);var E="";l.class!==void 0&&(E=" "+l.class);let p=l.width>a?l.width:a,f=s.append("rect");if(f.attr("class","actorPopupMenuPanel"+E),f.attr("x",l.x),f.attr("y",l.height),f.attr("fill",l.fill),f.attr("stroke",l.stroke),f.attr("width",p),f.attr("height",l.height),f.attr("rx",l.rx),f.attr("ry",l.ry),n!=null){var u=20;for(let L in n){var O=s.append("a"),b=(0,ae.sanitizeUrl)(n[L]);O.attr("xlink:href",b),O.attr("target","_blank"),Qr(r)(L,O,l.x+10,l.height+u,p,20,{class:"actor"},r),u+=30}}return f.attr("height",u),{height:l.height+u,width:p}},"drawPopup"),Ft=_(function(e){return"var pu = document.getElementById('"+e+"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"},"popupMenuToggle"),Wt=_(function(e,t,a=null){return $(this,null,function*(){let r=e.append("foreignObject"),i=yield $t(t.text,Ct()),c=r.append("xhtml:div").attr("style","width: fit-content;").attr("xmlns","http://www.w3.org/1999/xhtml").html(i).node().getBoundingClientRect();if(r.attr("height",Math.round(c.height)).attr("width",Math.round(c.width)),t.class==="noteText"){let l=e.node().firstChild;l.setAttribute("height",c.height+2*t.textMargin);let h=l.getBBox();r.attr("x",Math.round(h.x+h.width/2-c.width/2)).attr("y",Math.round(h.y+h.height/2-c.height/2))}else if(a){let{startx:l,stopx:h,starty:s}=a;if(l>h){let E=l;l=h,h=E}r.attr("x",Math.round(l+Math.abs(l-h)/2-c.width/2)),t.class==="loopText"?r.attr("y",Math.round(s)):r.attr("y",Math.round(s-c.height))}return[r]})},"drawKatex"),yt=_(function(e,t){let a=0,r=0,i=t.text.split(S.lineBreakRegex),[n,c]=te(t.fontSize),l=[],h=0,s=_(()=>t.y,"yfunc");if(t.valign!==void 0&&t.textMargin!==void 0&&t.textMargin>0)switch(t.valign){case"top":case"start":s=_(()=>Math.round(t.y+t.textMargin),"yfunc");break;case"middle":case"center":s=_(()=>Math.round(t.y+(a+r+t.textMargin)/2),"yfunc");break;case"bottom":case"end":s=_(()=>Math.round(t.y+(a+r+2*t.textMargin)-t.textMargin),"yfunc");break}if(t.anchor!==void 0&&t.textMargin!==void 0&&t.width!==void 0)switch(t.anchor){case"left":case"start":t.x=Math.round(t.x+t.textMargin),t.anchor="start",t.dominantBaseline="middle",t.alignmentBaseline="middle";break;case"middle":case"center":t.x=Math.round(t.x+t.width/2),t.anchor="middle",t.dominantBaseline="middle",t.alignmentBaseline="middle";break;case"right":case"end":t.x=Math.round(t.x+t.width-t.textMargin),t.anchor="end",t.dominantBaseline="middle",t.alignmentBaseline="middle";break}for(let[E,p]of i.entries()){t.textMargin!==void 0&&t.textMargin===0&&n!==void 0&&(h=E*n);let f=e.append("text");f.attr("x",t.x),f.attr("y",s()),t.anchor!==void 0&&f.attr("text-anchor",t.anchor).attr("dominant-baseline",t.dominantBaseline).attr("alignment-baseline",t.alignmentBaseline),t.fontFamily!==void 0&&f.style("font-family",t.fontFamily),c!==void 0&&f.style("font-size",c),t.fontWeight!==void 0&&f.style("font-weight",t.fontWeight),t.fill!==void 0&&f.attr("fill",t.fill),t.class!==void 0&&f.attr("class",t.class),t.dy!==void 0?f.attr("dy",t.dy):h!==0&&f.attr("dy",h);let u=p||Ze;if(t.tspan){let O=f.append("tspan");O.attr("x",t.x),t.fill!==void 0&&O.attr("fill",t.fill),O.text(u)}else f.text(u);t.valign!==void 0&&t.textMargin!==void 0&&t.textMargin>0&&(r+=(f._groups||f)[0][0].getBBox().height,a=r),l.push(f)}return l},"drawText"),sr=_(function(e,t){function a(i,n,c,l,h){return i+","+n+" "+(i+c)+","+n+" "+(i+c)+","+(n+l-h)+" "+(i+c-h*1.2)+","+(n+l)+" "+i+","+(n+l)}_(a,"genPoints");let r=e.append("polygon");return r.attr("points",a(t.x,t.y,t.width,t.height,7)),r.attr("class","labelBox"),t.y=t.y+t.height/2,yt(e,t),r},"drawLabel"),P=-1,ar=_((e,t,a,r)=>{e.select&&a.forEach(i=>{let n=t.get(i),c=e.select("#actor"+n.actorCnt);!r.mirrorActors&&n.stopy?c.attr("y2",n.stopy+n.height/2):r.mirrorActors&&c.attr("y2",n.stopy)})},"fixLifeLineHeights"),Ar=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+t.height,l=e.append("g").lower();var h=l;r||(P++,Object.keys(t.links||{}).length&&!a.forceMenus&&h.attr("onclick",Ft(`actor${P}_popup`)).attr("cursor","pointer"),h.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),h=l.append("g"),t.actorCnt=P,t.links!=null&&h.attr("id","root-"+P));let s=lt();var E="actor";t.properties?.class?E=t.properties.class:s.fill="#eaeaea",r?E+=` ${ut}`:E+=` ${pt}`,s.x=t.x,s.y=i,s.width=t.width,s.height=t.height,s.class=E,s.rx=3,s.ry=3,s.name=t.name;let p=At(h,s);if(t.rectData=s,t.properties?.icon){let u=t.properties.icon.trim();u.charAt(0)==="@"?Bt(h,s.x+s.width-20,s.y+10,u.substr(1)):Mt(h,s.x+s.width-20,s.y+10,u)}Tt(a,U(t.description))(t.description,h,s.x,s.y,s.width,s.height,{class:`actor ${Kt}`},a);let f=t.height;if(p.node){let u=p.node().getBBox();t.height=u.height,f=u.height}return f},"drawActorTypeParticipant"),wr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+t.height,l=e.append("g").lower();var h=l;r||(P++,Object.keys(t.links||{}).length&&!a.forceMenus&&h.attr("onclick",Ft(`actor${P}_popup`)).attr("cursor","pointer"),h.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),h=l.append("g"),t.actorCnt=P,t.links!=null&&h.attr("id","root-"+P));let s=lt();var E="actor";t.properties?.class?E=t.properties.class:s.fill="#eaeaea",r?E+=` ${ut}`:E+=` ${pt}`,s.x=t.x,s.y=i,s.width=t.width,s.height=t.height,s.class=E,s.name=t.name;let p=6,f=Ve(Be({},s),{x:s.x+-p,y:s.y+ +p,class:"actor"}),u=At(h,s);if(At(h,f),t.rectData=s,t.properties?.icon){let b=t.properties.icon.trim();b.charAt(0)==="@"?Bt(h,s.x+s.width-20,s.y+10,b.substr(1)):Mt(h,s.x+s.width-20,s.y+10,b)}Tt(a,U(t.description))(t.description,h,s.x-p,s.y+p,s.width,s.height,{class:`actor ${Kt}`},a);let O=t.height;if(u.node){let b=u.node().getBBox();t.height=b.height,O=b.height}return O},"drawActorTypeCollections"),Pr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+t.height,l=e.append("g").lower(),h=l;r||(P++,Object.keys(t.links||{}).length&&!a.forceMenus&&h.attr("onclick",Ft(`actor${P}_popup`)).attr("cursor","pointer"),h.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),h=l.append("g"),t.actorCnt=P,t.links!=null&&h.attr("id","root-"+P));let s=lt(),E="actor";t.properties?.class?E=t.properties.class:s.fill="#eaeaea",r?E+=` ${ut}`:E+=` ${pt}`,s.x=t.x,s.y=i,s.width=t.width,s.height=t.height,s.class=E,s.name=t.name;let p=s.height/2,f=p/(2.5+s.height/50),u=h.append("g"),O=h.append("g");if(u.append("path").attr("d",`M ${s.x},${s.y+p} + a ${f},${p} 0 0 0 0,${s.height} + h ${s.width-2*f} + a ${f},${p} 0 0 0 0,-${s.height} + Z + `).attr("class",E),O.append("path").attr("d",`M ${s.x},${s.y+p} + a ${f},${p} 0 0 0 0,${s.height}`).attr("stroke","#666").attr("stroke-width","1px").attr("class",E),u.attr("transform",`translate(${f}, ${-(s.height/2)})`),O.attr("transform",`translate(${s.width-f}, ${-s.height/2})`),t.rectData=s,t.properties?.icon){let w=t.properties.icon.trim(),A=s.x+s.width-20,k=s.y+10;w.charAt(0)==="@"?Bt(h,A,k,w.substr(1)):Mt(h,A,k,w)}Tt(a,U(t.description))(t.description,h,s.x,s.y,s.width,s.height,{class:`actor ${Kt}`},a);let b=t.height,L=u.select("path:last-child");if(L.node()){let w=L.node().getBBox();t.height=w.height,b=w.height}return b},"drawActorTypeQueue"),kr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+75,l=e.append("g").lower();r||(P++,l.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),t.actorCnt=P);let h=e.append("g"),s=xt;r?s+=` ${ut}`:s+=` ${pt}`,h.attr("class",s),h.attr("name",t.name);let E=lt();E.x=t.x,E.y=i,E.fill="#eaeaea",E.width=t.width,E.height=t.height,E.class="actor";let p=t.x+t.width/2,f=i+32,u=22;h.append("defs").append("marker").attr("id","filled-head-control").attr("refX",11).attr("refY",5.8).attr("markerWidth",20).attr("markerHeight",28).attr("orient","172.5").append("path").attr("d","M 14.4 5.6 L 7.2 10.4 L 8.8 5.6 L 7.2 0.8 Z"),h.append("circle").attr("cx",p).attr("cy",f).attr("r",u).attr("fill","#eaeaf7").attr("stroke","#666").attr("stroke-width",1.2),h.append("line").attr("marker-end","url(#filled-head-control)").attr("transform",`translate(${p}, ${f-u})`);let O=h.node().getBBox();return t.height=O.height+2*(a?.sequence?.labelBoxHeight??0),Tt(a,U(t.description))(t.description,h,E.x,E.y+u+(r?5:12),E.width,E.height,{class:`actor ${xt}`},a),t.height},"drawActorTypeControl"),Dr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+75,l=e.append("g").lower(),h=e.append("g"),s="actor";r?s+=` ${ut}`:s+=` ${pt}`,h.attr("class",s),h.attr("name",t.name);let E=lt();E.x=t.x,E.y=i,E.fill="#eaeaea",E.width=t.width,E.height=t.height,E.class="actor";let p=t.x+t.width/2,f=i+(r?10:25),u=22;h.append("circle").attr("cx",p).attr("cy",f).attr("r",u).attr("width",t.width).attr("height",t.height),h.append("line").attr("x1",p-u).attr("x2",p+u).attr("y1",f+u).attr("y2",f+u).attr("stroke-width",2);let O=h.node().getBBox();return t.height=O.height+(a?.sequence?.labelBoxHeight??0),r||(P++,l.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),t.actorCnt=P),Tt(a,U(t.description))(t.description,h,E.x,E.y+(r?15:30),E.width,E.height,{class:`actor ${xt}`},a),r?h.attr("transform",`translate(0, ${u})`):h.attr("transform",`translate(0, ${u/2-5})`),t.height},"drawActorTypeEntity"),vr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+t.height+2*a.boxTextMargin,l=e.append("g").lower(),h=l;r||(P++,Object.keys(t.links||{}).length&&!a.forceMenus&&h.attr("onclick",Ft(`actor${P}_popup`)).attr("cursor","pointer"),h.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),h=l.append("g"),t.actorCnt=P,t.links!=null&&h.attr("id","root-"+P));let s=lt(),E="actor";t.properties?.class?E=t.properties.class:s.fill="#eaeaea",r?E+=` ${ut}`:E+=` ${pt}`,s.x=t.x,s.y=i,s.width=t.width,s.height=t.height,s.class=E,s.name=t.name,s.x=t.x,s.y=i;let p=s.width/3,f=s.width/3,u=p/2,O=u/(2.5+p/50),b=h.append("g"),L=` + M ${s.x},${s.y+O} + a ${u},${O} 0 0 0 ${p},0 + a ${u},${O} 0 0 0 -${p},0 + l 0,${f-2*O} + a ${u},${O} 0 0 0 ${p},0 + l 0,-${f-2*O} +`;b.append("path").attr("d",L).attr("fill","#eaeaea").attr("stroke","#000").attr("stroke-width",1).attr("class",E),b.attr("transform",`translate(${p}, ${O})`),t.rectData=s,Tt(a,U(t.description))(t.description,h,s.x,s.y+35,s.width,s.height,{class:`actor ${Kt}`},a);let w=b.select("path:last-child");if(w.node()){let A=w.node().getBBox();t.height=A.height+(a.sequence.labelBoxHeight??0)}return t.height},"drawActorTypeDatabase"),Cr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+80,l=22,h=e.append("g").lower();r||(P++,h.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),t.actorCnt=P);let s=e.append("g"),E=xt;r?E+=` ${ut}`:E+=` ${pt}`,s.attr("class",E),s.attr("name",t.name);let p=lt();p.x=t.x,p.y=i,p.fill="#eaeaea",p.width=t.width,p.height=t.height,p.class="actor",s.append("line").attr("id","actor-man-torso"+P).attr("x1",t.x+t.width/2-l*2.5).attr("y1",i+12).attr("x2",t.x+t.width/2-15).attr("y2",i+12),s.append("line").attr("id","actor-man-arms"+P).attr("x1",t.x+t.width/2-l*2.5).attr("y1",i+2).attr("x2",t.x+t.width/2-l*2.5).attr("y2",i+22),s.append("circle").attr("cx",t.x+t.width/2).attr("cy",i+12).attr("r",l);let f=s.node().getBBox();return t.height=f.height+(a.sequence.labelBoxHeight??0),Tt(a,U(t.description))(t.description,s,p.x,p.y+15,p.width,p.height,{class:`actor ${xt}`},a),r?s.attr("transform",`translate(0,${l/2+10})`):s.attr("transform",`translate(0,${l/2+10})`),t.height},"drawActorTypeBoundary"),Mr=_(function(e,t,a,r){let i=r?t.stopy:t.starty,n=t.x+t.width/2,c=i+80,l=e.append("g").lower();r||(P++,l.append("line").attr("id","actor"+P).attr("x1",n).attr("y1",c).attr("x2",n).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",t.name),t.actorCnt=P);let h=e.append("g"),s=xt;r?s+=` ${ut}`:s+=` ${pt}`,h.attr("class",s),h.attr("name",t.name);let E=lt();E.x=t.x,E.y=i,E.fill="#eaeaea",E.width=t.width,E.height=t.height,E.class="actor",E.rx=3,E.ry=3,h.append("line").attr("id","actor-man-torso"+P).attr("x1",n).attr("y1",i+25).attr("x2",n).attr("y2",i+45),h.append("line").attr("id","actor-man-arms"+P).attr("x1",n-gt/2).attr("y1",i+33).attr("x2",n+gt/2).attr("y2",i+33),h.append("line").attr("x1",n-gt/2).attr("y1",i+60).attr("x2",n).attr("y2",i+45),h.append("line").attr("x1",n).attr("y1",i+45).attr("x2",n+gt/2-2).attr("y2",i+60);let p=h.append("circle");p.attr("cx",t.x+t.width/2),p.attr("cy",i+10),p.attr("r",15),p.attr("width",t.width),p.attr("height",t.height);let f=h.node().getBBox();return t.height=f.height,Tt(a,U(t.description))(t.description,h,E.x,E.y+35,E.width,E.height,{class:`actor ${xt}`},a),t.height},"drawActorTypeActor"),Br=_(function(e,t,a,r){return $(this,null,function*(){switch(t.type){case"actor":return yield Mr(e,t,a,r);case"participant":return yield Ar(e,t,a,r);case"boundary":return yield Cr(e,t,a,r);case"control":return yield kr(e,t,a,r);case"entity":return yield Dr(e,t,a,r);case"database":return yield vr(e,t,a,r);case"collections":return yield wr(e,t,a,r);case"queue":return yield Pr(e,t,a,r)}})},"drawActor"),Vr=_(function(e,t,a){let i=e.append("g");ir(i,t),t.name&&Tt(a)(t.name,i,t.x,t.y+a.boxTextMargin+(t.textMaxHeight||0)/2,t.width,0,{class:"text"},a),i.lower()},"drawBox"),Yr=_(function(e){return e.append("g")},"anchorElement"),Wr=_(function(e,t,a,r,i){let n=lt(),c=t.anchored;n.x=t.startx,n.y=t.starty,n.class="activation"+i%3,n.width=t.stopx-t.startx,n.height=a-t.starty,At(c,n)},"drawActivation"),Kr=_(function(e,t,a,r){return $(this,null,function*(){let{boxMargin:i,boxTextMargin:n,labelBoxHeight:c,labelBoxWidth:l,messageFontFamily:h,messageFontSize:s,messageFontWeight:E}=r,p=e.append("g"),f=_(function(b,L,w,A){return p.append("line").attr("x1",b).attr("y1",L).attr("x2",w).attr("y2",A).attr("class","loopLine")},"drawLoopLine");f(t.startx,t.starty,t.stopx,t.starty),f(t.stopx,t.starty,t.stopx,t.stopy),f(t.startx,t.stopy,t.stopx,t.stopy),f(t.startx,t.starty,t.startx,t.stopy),t.sections!==void 0&&t.sections.forEach(function(b){f(t.startx,b.y,t.stopx,b.y).style("stroke-dasharray","3, 3")});let u=Vt();u.text=a,u.x=t.startx,u.y=t.starty,u.fontFamily=h,u.fontSize=s,u.fontWeight=E,u.anchor="middle",u.valign="middle",u.tspan=!1,u.width=l||50,u.height=c||20,u.textMargin=n,u.class="labelText",sr(p,u),u=nr(),u.text=t.title,u.x=t.startx+l/2+(t.stopx-t.startx)/2,u.y=t.starty+i+n,u.anchor="middle",u.valign="middle",u.textMargin=n,u.class="loopText",u.fontFamily=h,u.fontSize=s,u.fontWeight=E,u.wrap=!0;let O=U(u.text)?yield Wt(p,u,t):yt(p,u);if(t.sectionTitles!==void 0){for(let[b,L]of Object.entries(t.sectionTitles))if(L.message){u.text=L.message,u.x=t.startx+(t.stopx-t.startx)/2,u.y=t.sections[b].y+i+n,u.class="loopText",u.anchor="middle",u.valign="middle",u.tspan=!1,u.fontFamily=h,u.fontSize=s,u.fontWeight=E,u.wrap=t.wrap,U(u.text)?(t.starty=t.sections[b].y,yield Wt(p,u,t)):yt(p,u);let w=Math.round(O.map(A=>(A._groups||A)[0][0].getBBox().height).reduce((A,k)=>A+k));t.sections[b].height+=w-(i+n)}}return t.height=Math.round(t.stopy-t.starty),p})},"drawLoop"),ir=_(function(e,t){je(e,t)},"drawBackgroundRect"),Fr=_(function(e){e.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),qr=_(function(e){e.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),Hr=_(function(e){e.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),zr=_(function(e){e.append("defs").append("marker").attr("id","arrowhead").attr("refX",7.9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto-start-reverse").append("path").attr("d","M -1 0 L 10 5 L 0 10 z")},"insertArrowHead"),Ur=_(function(e){e.append("defs").append("marker").attr("id","filled-head").attr("refX",15.5).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),Gr=_(function(e){e.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertSequenceNumber"),Xr=_(function(e){e.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",4.5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},"insertArrowCrossHead"),nr=_(function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},"getTextObj"),Jr=_(function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),Tt=(function(){function e(n,c,l,h,s,E,p){let f=c.append("text").attr("x",l+s/2).attr("y",h+E/2+5).style("text-anchor","middle").text(n);i(f,p)}_(e,"byText");function t(n,c,l,h,s,E,p,f){let{actorFontSize:u,actorFontFamily:O,actorFontWeight:b}=f,[L,w]=te(u),A=n.split(S.lineBreakRegex);for(let k=0;ke.height||0))+(this.loops.length===0?0:this.loops.map(e=>e.height||0).reduce((e,t)=>e+t))+(this.messages.length===0?0:this.messages.map(e=>e.height||0).reduce((e,t)=>e+t))+(this.notes.length===0?0:this.notes.map(e=>e.height||0).reduce((e,t)=>e+t))},"getHeight"),clear:_(function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},"clear"),addBox:_(function(e){this.boxes.push(e)},"addBox"),addActor:_(function(e){this.actors.push(e)},"addActor"),addLoop:_(function(e){this.loops.push(e)},"addLoop"),addMessage:_(function(e){this.messages.push(e)},"addMessage"),addNote:_(function(e){this.notes.push(e)},"addNote"),lastActor:_(function(){return this.actors[this.actors.length-1]},"lastActor"),lastLoop:_(function(){return this.loops[this.loops.length-1]},"lastLoop"),lastMessage:_(function(){return this.messages[this.messages.length-1]},"lastMessage"),lastNote:_(function(){return this.notes[this.notes.length-1]},"lastNote"),actors:[],boxes:[],loops:[],messages:[],notes:[]},init:_(function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,lr(j())},"init"),updateVal:_(function(e,t,a,r){e[t]===void 0?e[t]=a:e[t]=r(a,e[t])},"updateVal"),updateBounds:_(function(e,t,a,r){let i=this,n=0;function c(l){return _(function(s){n++;let E=i.sequenceItems.length-n+1;i.updateVal(s,"starty",t-E*d.boxMargin,Math.min),i.updateVal(s,"stopy",r+E*d.boxMargin,Math.max),i.updateVal(x.data,"startx",e-E*d.boxMargin,Math.min),i.updateVal(x.data,"stopx",a+E*d.boxMargin,Math.max),l!=="activation"&&(i.updateVal(s,"startx",e-E*d.boxMargin,Math.min),i.updateVal(s,"stopx",a+E*d.boxMargin,Math.max),i.updateVal(x.data,"starty",t-E*d.boxMargin,Math.min),i.updateVal(x.data,"stopy",r+E*d.boxMargin,Math.max))},"updateItemBounds")}_(c,"updateFn"),this.sequenceItems.forEach(c()),this.activations.forEach(c("activation"))},"updateBounds"),insert:_(function(e,t,a,r){let i=S.getMin(e,a),n=S.getMax(e,a),c=S.getMin(t,r),l=S.getMax(t,r);this.updateVal(x.data,"startx",i,Math.min),this.updateVal(x.data,"starty",c,Math.min),this.updateVal(x.data,"stopx",n,Math.max),this.updateVal(x.data,"stopy",l,Math.max),this.updateBounds(i,c,n,l)},"insert"),newActivation:_(function(e,t,a){let r=a.get(e.from),i=qt(e.from).length||0,n=r.x+r.width/2+(i-1)*d.activationWidth/2;this.activations.push({startx:n,starty:this.verticalPos+2,stopx:n+d.activationWidth,stopy:void 0,actor:e.from,anchored:Y.anchorElement(t)})},"newActivation"),endActivation:_(function(e){let t=this.activations.map(function(a){return a.actor}).lastIndexOf(e.from);return this.activations.splice(t,1)[0]},"endActivation"),createLoop:_(function(e={message:void 0,wrap:!1,width:void 0},t){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:e.message,wrap:e.wrap,width:e.width,height:0,fill:t}},"createLoop"),newLoop:_(function(e={message:void 0,wrap:!1,width:void 0},t){this.sequenceItems.push(this.createLoop(e,t))},"newLoop"),endLoop:_(function(){return this.sequenceItems.pop()},"endLoop"),isLoopOverlap:_(function(){return this.sequenceItems.length?this.sequenceItems[this.sequenceItems.length-1].overlap:!1},"isLoopOverlap"),addSectionToLoop:_(function(e){let t=this.sequenceItems.pop();t.sections=t.sections||[],t.sectionTitles=t.sectionTitles||[],t.sections.push({y:x.getVerticalPos(),height:0}),t.sectionTitles.push(e),this.sequenceItems.push(t)},"addSectionToLoop"),saveVerticalPos:_(function(){this.isLoopOverlap()&&(this.savedVerticalPos=this.verticalPos)},"saveVerticalPos"),resetVerticalPos:_(function(){this.isLoopOverlap()&&(this.verticalPos=this.savedVerticalPos)},"resetVerticalPos"),bumpVerticalPos:_(function(e){this.verticalPos=this.verticalPos+e,this.data.stopy=S.getMax(this.data.stopy,this.verticalPos)},"bumpVerticalPos"),getVerticalPos:_(function(){return this.verticalPos},"getVerticalPos"),getBounds:_(function(){return{bounds:this.data,models:this.models}},"getBounds")},es=_(function(e,t){return $(this,null,function*(){x.bumpVerticalPos(d.boxMargin),t.height=d.boxMargin,t.starty=x.getVerticalPos();let a=lt();a.x=t.startx,a.y=t.starty,a.width=t.width||d.width,a.class="note";let r=e.append("g"),i=Y.drawRect(r,a),n=Vt();n.x=t.startx,n.y=t.starty,n.width=a.width,n.dy="1em",n.text=t.message,n.class="noteText",n.fontFamily=d.noteFontFamily,n.fontSize=d.noteFontSize,n.fontWeight=d.noteFontWeight,n.anchor=d.noteAlign,n.textMargin=d.noteMargin,n.valign="center";let c=U(n.text)?yield Wt(r,n):yt(r,n),l=Math.round(c.map(h=>(h._groups||h)[0][0].getBBox().height).reduce((h,s)=>h+s));i.attr("height",l+2*d.noteMargin),t.height+=l+2*d.noteMargin,x.bumpVerticalPos(l+2*d.noteMargin),t.stopy=t.starty+l+2*d.noteMargin,t.stopx=t.startx+a.width,x.insert(t.startx,t.starty,t.stopx,t.stopy),x.models.addNote(t)})},"drawNote"),rs=_(function(e,t,a,r,i,n,c){let l=r.db.getActors(),h=l.get(t.from),s=l.get(t.to),E=a.sequenceVisible,p=h.x+h.width/2,f=s.x+s.width/2,u=p<=f,O=Er(t,r),b=e.append("g"),L=16.5,w=_((W,K)=>{let H=W?L:-L;return K?-H:H},"getCircleOffset"),A=_(W=>{b.append("circle").attr("cx",W).attr("cy",c).attr("r",5).attr("width",10).attr("height",10)},"drawCircle"),{CENTRAL_CONNECTION:k,CENTRAL_CONNECTION_REVERSE:D,CENTRAL_CONNECTION_DUAL:M}=r.db.LINETYPE;if(E)switch(t.centralConnection){case k:O&&(f+=w(u,!0));break;case D:O||(p+=w(u,!1));break;case M:O?f+=w(u,!0):p+=w(u,!1);break}switch(t.centralConnection){case k:A(f);break;case D:A(p);break;case M:A(p),A(f);break}},"drawCentralConnection"),It=_(e=>({fontFamily:e.messageFontFamily,fontSize:e.messageFontSize,fontWeight:e.messageFontWeight}),"messageFont"),Ot=_(e=>({fontFamily:e.noteFontFamily,fontSize:e.noteFontSize,fontWeight:e.noteFontWeight}),"noteFont"),re=_(e=>({fontFamily:e.actorFontFamily,fontSize:e.actorFontSize,fontWeight:e.actorFontWeight}),"actorFont");function or(e,t){return $(this,null,function*(){x.bumpVerticalPos(10);let{startx:a,stopx:r,message:i}=t,n=S.splitBreaks(i).length,c=U(i),l=c?yield Rt(i,j()):F.calculateTextDimensions(i,It(d));if(!c){let p=l.height/n;t.height+=p,x.bumpVerticalPos(p)}let h,s=l.height-10,E=l.width;if(a===r){h=x.getVerticalPos()+s,d.rightAngles||(s+=d.boxMargin,h=x.getVerticalPos()+s),s+=30;let p=S.getMax(E/2,d.width/2);x.insert(a-p,x.getVerticalPos()-10+s,r+p,x.getVerticalPos()+30+s)}else s+=d.boxMargin,h=x.getVerticalPos()+s,x.insert(a,h-10,r,h);return x.bumpVerticalPos(s),t.height+=s,t.stopy=t.starty+t.height,x.insert(t.fromBounds,t.starty,t.toBounds,t.stopy),h})}_(or,"boundMessage");var ss=_(function(e,t,a,r,i){return $(this,null,function*(){let{startx:n,stopx:c,starty:l,message:h,type:s,sequenceIndex:E,sequenceVisible:p}=t,f=F.calculateTextDimensions(h,It(d)),u=Vt();u.x=n,u.y=l+10,u.width=c-n,u.class="messageText",u.dy="1em",u.text=h,u.fontFamily=d.messageFontFamily,u.fontSize=d.messageFontSize,u.fontWeight=d.messageFontWeight,u.anchor=d.messageAlign,u.valign="center",u.textMargin=d.wrapPadding,u.tspan=!1,U(u.text)?yield Wt(e,u,{startx:n,stopx:c,starty:a}):yt(e,u);let O=f.width,b;if(n===c){let w=p||d.showSequenceNumbers,A=Er(i,r),k=ds(i,r),D=n+(w&&(A||k)?10:0);d.rightAngles?b=e.append("path").attr("d",`M ${D},${a} H ${n+S.getMax(d.width/2,O/2)} V ${a+25} H ${n}`):b=e.append("path").attr("d","M "+D+","+a+" C "+(D+60)+","+(a-10)+" "+(n+60)+","+(a+30)+" "+n+","+(a+20))}else b=e.append("line"),b.attr("x1",n),b.attr("y1",a),b.attr("x2",c),b.attr("y2",a),rr(i,r)&&rs(e,i,t,r,n,c,a);s===r.db.LINETYPE.DOTTED||s===r.db.LINETYPE.DOTTED_CROSS||s===r.db.LINETYPE.DOTTED_POINT||s===r.db.LINETYPE.DOTTED_OPEN||s===r.db.LINETYPE.BIDIRECTIONAL_DOTTED||s===r.db.LINETYPE.SOLID_TOP_DOTTED||s===r.db.LINETYPE.SOLID_BOTTOM_DOTTED||s===r.db.LINETYPE.STICK_TOP_DOTTED||s===r.db.LINETYPE.STICK_BOTTOM_DOTTED||s===r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED||s===r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED||s===r.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED||s===r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED?(b.style("stroke-dasharray","3, 3"),b.attr("class","messageLine1")):b.attr("class","messageLine0");let L="";if(d.arrowMarkerAbsolute&&(L=We(!0)),b.attr("stroke-width",2),b.attr("stroke","none"),b.style("fill","none"),(s===r.db.LINETYPE.SOLID_TOP||s===r.db.LINETYPE.SOLID_TOP_DOTTED)&&b.attr("marker-end","url("+L+"#solidTopArrowHead)"),(s===r.db.LINETYPE.SOLID_BOTTOM||s===r.db.LINETYPE.SOLID_BOTTOM_DOTTED)&&b.attr("marker-end","url("+L+"#solidBottomArrowHead)"),(s===r.db.LINETYPE.STICK_TOP||s===r.db.LINETYPE.STICK_TOP_DOTTED)&&b.attr("marker-end","url("+L+"#stickTopArrowHead)"),(s===r.db.LINETYPE.STICK_BOTTOM||s===r.db.LINETYPE.STICK_BOTTOM_DOTTED)&&b.attr("marker-end","url("+L+"#stickBottomArrowHead)"),(s===r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE||s===r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED)&&b.attr("marker-start","url("+L+"#solidBottomArrowHead)"),(s===r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE||s===r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED)&&b.attr("marker-start","url("+L+"#solidTopArrowHead)"),(s===r.db.LINETYPE.STICK_ARROW_TOP_REVERSE||s===r.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED)&&b.attr("marker-start","url("+L+"#stickBottomArrowHead)"),(s===r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE||s===r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED)&&b.attr("marker-start","url("+L+"#stickTopArrowHead)"),(s===r.db.LINETYPE.SOLID||s===r.db.LINETYPE.DOTTED)&&b.attr("marker-end","url("+L+"#arrowhead)"),(s===r.db.LINETYPE.BIDIRECTIONAL_SOLID||s===r.db.LINETYPE.BIDIRECTIONAL_DOTTED)&&(b.attr("marker-start","url("+L+"#arrowhead)"),b.attr("marker-end","url("+L+"#arrowhead)")),(s===r.db.LINETYPE.SOLID_POINT||s===r.db.LINETYPE.DOTTED_POINT)&&b.attr("marker-end","url("+L+"#filled-head)"),(s===r.db.LINETYPE.SOLID_CROSS||s===r.db.LINETYPE.DOTTED_CROSS)&&b.attr("marker-end","url("+L+"#crosshead)"),p||d.showSequenceNumbers){let w=s===r.db.LINETYPE.BIDIRECTIONAL_SOLID||s===r.db.LINETYPE.BIDIRECTIONAL_DOTTED,A=s===r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE||s===r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED||s===r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE||s===r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED||s===r.db.LINETYPE.STICK_ARROW_TOP_REVERSE||s===r.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED||s===r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE||s===r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED,k=6,D=rr(i,r),M=n,W=c;w?(nn?W=c-2*k:(W=c-k,M+=i?.centralConnection===r.db.LINETYPE.CENTRAL_CONNECTION_DUAL||i?.centralConnection===r.db.LINETYPE.CENTRAL_CONNECTION_REVERSE?-7.5:0),W+=D?15:0,b.attr("x2",W),b.attr("x1",M)):b.attr("x1",n+k);let K=0,H=n===c,G=n<=c;H?K=t.fromBounds+1:A?K=G?t.toBounds-1:t.fromBounds+1:K=G?t.fromBounds+1:t.toBounds-1,e.append("line").attr("x1",K).attr("y1",a).attr("x2",K).attr("y2",a).attr("stroke-width",0).attr("marker-start","url("+L+"#sequencenumber)"),e.append("text").attr("x",K).attr("y",a+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(E)}})},"drawMessage"),as=_(function(e,t,a,r,i,n,c){let l=0,h=0,s,E=0;for(let p of r){let f=t.get(p),u=f.box;s&&s!=u&&(c||x.models.addBox(s),h+=d.boxMargin+s.margin),u&&u!=s&&(c||(u.x=l+h,u.y=i),h+=u.margin),f.width=f.width||d.width,f.height=S.getMax(f.height||d.height,d.height),f.margin=f.margin||d.actorMargin,E=S.getMax(E,f.height),a.get(f.name)&&(h+=f.width/2),f.x=l+h,f.starty=x.getVerticalPos(),x.insert(f.x,i,f.x+f.width,f.height),l+=f.width+h,f.box&&(f.box.width=l+u.margin-f.box.x),h=f.margin,s=f.box,x.models.addActor(f)}s&&!c&&x.models.addBox(s),x.bumpVerticalPos(E)},"addActorRenderingData"),se=_(function(e,t,a,r){return $(this,null,function*(){if(r){let i=0;x.bumpVerticalPos(d.boxMargin*2);for(let n of a){let c=t.get(n);c.stopy||(c.stopy=x.getVerticalPos());let l=yield Y.drawActor(e,c,d,!0);i=S.getMax(i,l)}x.bumpVerticalPos(i+d.boxMargin)}else for(let i of a){let n=t.get(i);yield Y.drawActor(e,n,d,!1)}})},"drawActors"),cr=_(function(e,t,a,r){let i=0,n=0;for(let c of a){let l=t.get(c),h=ns(l),s=Y.drawPopup(e,l,h,d,d.forceMenus,r);s.height>i&&(i=s.height),s.width+l.x>n&&(n=s.width+l.x)}return{maxHeight:i,maxWidth:n}},"drawActorsPopup"),lr=_(function(e){Ye(d,e),e.fontFamily&&(d.actorFontFamily=d.noteFontFamily=d.messageFontFamily=e.fontFamily),e.fontSize&&(d.actorFontSize=d.noteFontSize=d.messageFontSize=e.fontSize),e.fontWeight&&(d.actorFontWeight=d.noteFontWeight=d.messageFontWeight=e.fontWeight)},"setConf"),qt=_(function(e){return x.activations.filter(function(t){return t.actor===e})},"actorActivations"),er=_(function(e,t){let a=t.get(e),r=qt(e),i=r.reduce(function(c,l){return S.getMin(c,l.startx)},a.x+a.width/2-1),n=r.reduce(function(c,l){return S.getMax(c,l.stopx)},a.x+a.width/2+1);return[i,n]},"activationBounds");function ht(e,t,a,r,i){x.bumpVerticalPos(a);let n=r;if(t.id&&t.message&&e[t.id]){let c=e[t.id].width,l=It(d);t.message=F.wrapLabel(`[${t.message}]`,c-2*d.wrapPadding,l),t.width=c,t.wrap=!0;let h=F.calculateTextDimensions(t.message,l),s=S.getMax(h.height,d.labelBoxHeight);n=r+s,Q.debug(`${s} - ${t.message}`)}i(t),x.bumpVerticalPos(n)}_(ht,"adjustLoopHeightForWrap");function hr(e,t,a,r,i,n,c){function l(E,p){E.x{R.add(I.from),R.add(I.to)}),O=O.filter(I=>R.has(I))}as(s,E,p,O,0,b,!1);let D=yield Es(b,E,k,r);Y.insertArrowHead(s),Y.insertArrowCrossHead(s),Y.insertArrowFilledHead(s),Y.insertSequenceNumber(s),Y.insertSolidTopArrowHead(s),Y.insertSolidBottomArrowHead(s),Y.insertStickTopArrowHead(s),Y.insertStickBottomArrowHead(s);function M(R,I){let ot=x.endActivation(R);ot.starty+18>I&&(ot.starty=I-6,I+=12),Y.drawActivation(s,ot,I,d,qt(R.from).length),x.insert(ot.startx,I-10,ot.stopx,I)}_(M,"activeEnd");let W=1,K=1,H=[],G=[],X=0;for(let R of b){let I,ot,ct;switch(R.type){case r.db.LINETYPE.NOTE:x.resetVerticalPos(),ot=R.noteModel,yield es(s,ot);break;case r.db.LINETYPE.ACTIVE_START:x.newActivation(R,s,E);break;case r.db.LINETYPE.CENTRAL_CONNECTION:x.newActivation(R,s,E);break;case r.db.LINETYPE.CENTRAL_CONNECTION_REVERSE:x.newActivation(R,s,E);break;case r.db.LINETYPE.ACTIVE_END:M(R,x.getVerticalPos());break;case r.db.LINETYPE.LOOP_START:ht(D,R,d.boxMargin,d.boxMargin+d.boxTextMargin,C=>x.newLoop(C));break;case r.db.LINETYPE.LOOP_END:I=x.endLoop(),yield Y.drawLoop(s,I,"loop",d),x.bumpVerticalPos(I.stopy-x.getVerticalPos()),x.models.addLoop(I);break;case r.db.LINETYPE.RECT_START:ht(D,R,d.boxMargin,d.boxMargin,C=>x.newLoop(void 0,C.message));break;case r.db.LINETYPE.RECT_END:I=x.endLoop(),G.push(I),x.models.addLoop(I),x.bumpVerticalPos(I.stopy-x.getVerticalPos());break;case r.db.LINETYPE.OPT_START:ht(D,R,d.boxMargin,d.boxMargin+d.boxTextMargin,C=>x.newLoop(C));break;case r.db.LINETYPE.OPT_END:I=x.endLoop(),yield Y.drawLoop(s,I,"opt",d),x.bumpVerticalPos(I.stopy-x.getVerticalPos()),x.models.addLoop(I);break;case r.db.LINETYPE.ALT_START:ht(D,R,d.boxMargin,d.boxMargin+d.boxTextMargin,C=>x.newLoop(C));break;case r.db.LINETYPE.ALT_ELSE:ht(D,R,d.boxMargin+d.boxTextMargin,d.boxMargin,C=>x.addSectionToLoop(C));break;case r.db.LINETYPE.ALT_END:I=x.endLoop(),yield Y.drawLoop(s,I,"alt",d),x.bumpVerticalPos(I.stopy-x.getVerticalPos()),x.models.addLoop(I);break;case r.db.LINETYPE.PAR_START:case r.db.LINETYPE.PAR_OVER_START:ht(D,R,d.boxMargin,d.boxMargin+d.boxTextMargin,C=>x.newLoop(C)),x.saveVerticalPos();break;case r.db.LINETYPE.PAR_AND:ht(D,R,d.boxMargin+d.boxTextMargin,d.boxMargin,C=>x.addSectionToLoop(C));break;case r.db.LINETYPE.PAR_END:I=x.endLoop(),yield Y.drawLoop(s,I,"par",d),x.bumpVerticalPos(I.stopy-x.getVerticalPos()),x.models.addLoop(I);break;case r.db.LINETYPE.AUTONUMBER:W=R.message.start||W,K=R.message.step||K,R.message.visible?r.db.enableSequenceNumbers():r.db.disableSequenceNumbers();break;case r.db.LINETYPE.CRITICAL_START:ht(D,R,d.boxMargin,d.boxMargin+d.boxTextMargin,C=>x.newLoop(C));break;case r.db.LINETYPE.CRITICAL_OPTION:ht(D,R,d.boxMargin+d.boxTextMargin,d.boxMargin,C=>x.addSectionToLoop(C));break;case r.db.LINETYPE.CRITICAL_END:I=x.endLoop(),yield Y.drawLoop(s,I,"critical",d),x.bumpVerticalPos(I.stopy-x.getVerticalPos()),x.models.addLoop(I);break;case r.db.LINETYPE.BREAK_START:ht(D,R,d.boxMargin,d.boxMargin+d.boxTextMargin,C=>x.newLoop(C));break;case r.db.LINETYPE.BREAK_END:I=x.endLoop(),yield Y.drawLoop(s,I,"break",d),x.bumpVerticalPos(I.stopy-x.getVerticalPos()),x.models.addLoop(I);break;default:try{ct=R.msgModel,ct.starty=x.getVerticalPos(),ct.sequenceIndex=W,ct.sequenceVisible=r.db.showSequenceNumbers();let C=yield or(s,ct);hr(R,ct,C,X,E,p,f),H.push({messageModel:ct,lineStartY:C,msg:R}),x.models.addMessage(ct)}catch(C){Q.error("error while drawing message",C)}}[r.db.LINETYPE.SOLID_OPEN,r.db.LINETYPE.DOTTED_OPEN,r.db.LINETYPE.SOLID,r.db.LINETYPE.SOLID_TOP,r.db.LINETYPE.SOLID_BOTTOM,r.db.LINETYPE.STICK_TOP,r.db.LINETYPE.STICK_BOTTOM,r.db.LINETYPE.SOLID_TOP_DOTTED,r.db.LINETYPE.SOLID_BOTTOM_DOTTED,r.db.LINETYPE.STICK_TOP_DOTTED,r.db.LINETYPE.STICK_BOTTOM_DOTTED,r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE,r.db.LINETYPE.STICK_ARROW_TOP_REVERSE,r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE,r.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,r.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,r.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED,r.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED,r.db.LINETYPE.DOTTED,r.db.LINETYPE.SOLID_CROSS,r.db.LINETYPE.DOTTED_CROSS,r.db.LINETYPE.SOLID_POINT,r.db.LINETYPE.DOTTED_POINT,r.db.LINETYPE.BIDIRECTIONAL_SOLID,r.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(R.type)&&(W=W+K),X++}Q.debug("createdActors",p),Q.debug("destroyedActors",f),yield se(s,E,O,!1);for(let R of H)yield ss(s,R.messageModel,R.lineStartY,r,R.msg);d.mirrorActors&&(yield se(s,E,O,!0)),G.forEach(R=>Y.drawBackgroundRect(s,R)),ar(s,E,O,d);for(let R of x.models.boxes){R.height=x.getVerticalPos()-R.y,x.insert(R.x,R.y,R.x+R.width,R.height);let I=d.boxMargin*2;R.startx=R.x-I,R.starty=R.y-I*.25,R.stopx=R.startx+R.width+2*I,R.stopy=R.starty+R.height+I*.75,R.stroke="rgb(0,0,0, 0.5)",Y.drawBox(s,R,d)}w&&x.bumpVerticalPos(d.boxMargin);let z=cr(s,E,O,h),{bounds:v}=x.getBounds();v.startx===void 0&&(v.startx=0),v.starty===void 0&&(v.starty=0),v.stopx===void 0&&(v.stopx=0),v.stopy===void 0&&(v.stopy=0);let tt=v.stopy-v.starty;tt{let c=It(d),l=n.actorKeys.reduce((p,f)=>p+=e.get(f).width+(e.get(f).margin||0),0),h=d.boxMargin*8;l+=h,l-=2*d.boxTextMargin,n.wrap&&(n.name=F.wrapLabel(n.name,l-2*d.wrapPadding,c));let s=F.calculateTextDimensions(n.name,c);i=S.getMax(s.height,i);let E=S.getMax(l,s.width+2*d.wrapPadding);if(n.margin=d.boxTextMargin,ln.textMaxHeight=i),S.getMax(r,d.height)})}_(Tr,"calculateActorMargins");var os=_(function(e,t,a){return $(this,null,function*(){let r=t.get(e.from),i=t.get(e.to),n=r.x,c=i.x,l=e.wrap&&e.message,h=U(e.message)?yield Rt(e.message,j()):F.calculateTextDimensions(l?F.wrapLabel(e.message,d.width,Ot(d)):e.message,Ot(d)),s={width:l?d.width:S.getMax(d.width,h.width+2*d.noteMargin),height:0,startx:r.x,stopx:0,starty:0,stopy:0,message:e.message};return e.placement===a.db.PLACEMENT.RIGHTOF?(s.width=l?S.getMax(d.width,h.width):S.getMax(r.width/2+i.width/2,h.width+2*d.noteMargin),s.startx=n+(r.width+d.actorMargin)/2):e.placement===a.db.PLACEMENT.LEFTOF?(s.width=l?S.getMax(d.width,h.width+2*d.noteMargin):S.getMax(r.width/2+i.width/2,h.width+2*d.noteMargin),s.startx=n-s.width+(r.width-d.actorMargin)/2):e.to===e.from?(h=F.calculateTextDimensions(l?F.wrapLabel(e.message,S.getMax(d.width,r.width),Ot(d)):e.message,Ot(d)),s.width=l?S.getMax(d.width,r.width):S.getMax(r.width,d.width,h.width+2*d.noteMargin),s.startx=n+(r.width-s.width)/2):(s.width=Math.abs(n+r.width/2-(c+i.width/2))+d.actorMargin,s.startx=n2,p=_(b=>l?-b:b,"adjustValue");e.from===e.to?s=h:(e.activate&&!E&&(s+=p(d.activationWidth/2-1)),[a.db.LINETYPE.SOLID_OPEN,a.db.LINETYPE.DOTTED_OPEN,a.db.LINETYPE.STICK_TOP,a.db.LINETYPE.STICK_BOTTOM,a.db.LINETYPE.STICK_TOP_DOTTED,a.db.LINETYPE.STICK_BOTTOM_DOTTED,a.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,a.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,a.db.LINETYPE.STICK_ARROW_TOP_REVERSE,a.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE,a.db.LINETYPE.STICK_ARROW_TOP_REVERSE_DOTTED,a.db.LINETYPE.STICK_ARROW_BOTTOM_REVERSE_DOTTED,a.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,a.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE].includes(e.type)||(s+=p(3)),[a.db.LINETYPE.BIDIRECTIONAL_SOLID,a.db.LINETYPE.BIDIRECTIONAL_DOTTED,a.db.LINETYPE.SOLID_ARROW_TOP_REVERSE_DOTTED,a.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE_DOTTED,a.db.LINETYPE.SOLID_ARROW_TOP_REVERSE,a.db.LINETYPE.SOLID_ARROW_BOTTOM_REVERSE].includes(e.type)&&(h-=p(3)));let f=[r,i,n,c],u=Math.abs(h-s);e.wrap&&e.message&&(e.message=F.wrapLabel(e.message,S.getMax(u+2*d.wrapPadding,d.width),It(d)));let O=F.calculateTextDimensions(e.message,It(d));return{width:S.getMax(e.wrap?0:O.width+2*d.wrapPadding,u+2*d.wrapPadding,d.width),height:0,startx:h,stopx:s,starty:0,stopy:0,message:e.message,type:e.type,wrap:e.wrap,fromBounds:Math.min.apply(null,f),toBounds:Math.max.apply(null,f)}},"buildMessageModel"),Es=_(function(e,t,a,r){return $(this,null,function*(){let i={},n=[],c,l,h;for(let s of e){switch(s.type){case r.db.LINETYPE.LOOP_START:case r.db.LINETYPE.ALT_START:case r.db.LINETYPE.OPT_START:case r.db.LINETYPE.PAR_START:case r.db.LINETYPE.PAR_OVER_START:case r.db.LINETYPE.CRITICAL_START:case r.db.LINETYPE.BREAK_START:n.push({id:s.id,msg:s.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case r.db.LINETYPE.ALT_ELSE:case r.db.LINETYPE.PAR_AND:case r.db.LINETYPE.CRITICAL_OPTION:s.message&&(c=n.pop(),i[c.id]=c,i[s.id]=c,n.push(c));break;case r.db.LINETYPE.LOOP_END:case r.db.LINETYPE.ALT_END:case r.db.LINETYPE.OPT_END:case r.db.LINETYPE.PAR_END:case r.db.LINETYPE.CRITICAL_END:case r.db.LINETYPE.BREAK_END:c=n.pop(),i[c.id]=c;break;case r.db.LINETYPE.ACTIVE_START:{let p=t.get(s.from?s.from:s.to.actor),f=qt(s.from?s.from:s.to.actor).length,u=p.x+p.width/2+(f-1)*d.activationWidth/2,O={startx:u,stopx:u+d.activationWidth,actor:s.from,enabled:!0};x.activations.push(O)}break;case r.db.LINETYPE.ACTIVE_END:{let p=x.activations.map(f=>f.actor).lastIndexOf(s.from);x.activations.splice(p,1).splice(0,1)}break}s.placement!==void 0?(l=yield os(s,t,r),s.noteModel=l,n.forEach(p=>{c=p,c.from=S.getMin(c.from,l.startx),c.to=S.getMax(c.to,l.startx+l.width),c.width=S.getMax(c.width,Math.abs(c.from-c.to))-d.labelBoxWidth})):(h=Ts(s,t,r),s.msgModel=h,h.startx&&h.stopx&&n.length>0&&n.forEach(p=>{if(c=p,h.startx===h.stopx){let f=t.get(s.from),u=t.get(s.to);c.from=S.getMin(f.x-h.width/2,f.x-f.width/2,c.from),c.to=S.getMax(u.x+h.width/2,u.x+f.width/2,c.to),c.width=S.getMax(c.width,Math.abs(c.to-c.from))-d.labelBoxWidth}else c.from=S.getMin(h.startx,c.from),c.to=S.getMax(h.stopx,c.to),c.width=S.getMax(c.width,h.width)-d.labelBoxWidth}))}return x.activations=[],Q.debug("Loop type widths:",i),i})},"calculateLoopBounds"),ps={bounds:x,drawActors:se,drawActorsPopup:cr,setConf:lr,draw:is},Os={parser:br,get db(){return new Lr},renderer:ps,styles:mr,init:_(e=>{e.sequence||(e.sequence={}),e.wrap&&(e.sequence.wrap=e.wrap,Xe({sequence:{wrap:e.wrap}}))},"init")};export{Os as diagram}; diff --git a/src/google/adk/cli/browser/chunk-T3Q3QCCV.js b/src/google/adk/cli/browser/chunk-T3Q3QCCV.js new file mode 100644 index 0000000000..3b26d9edf3 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-T3Q3QCCV.js @@ -0,0 +1,3 @@ +import{f as t}from"./chunk-NALL4A3P.js";import{j as i}from"./chunk-RMXJBC7V.js";var o={},m={info:t(()=>i(null,null,function*(){let{createInfoServices:e}=yield import("./chunk-DIR2LWLP.js"),r=e().Info.parser.LangiumParser;o.info=r}),"info"),packet:t(()=>i(null,null,function*(){let{createPacketServices:e}=yield import("./chunk-SMT27N2F.js"),r=e().Packet.parser.LangiumParser;o.packet=r}),"packet"),pie:t(()=>i(null,null,function*(){let{createPieServices:e}=yield import("./chunk-HDC4PFPG.js"),r=e().Pie.parser.LangiumParser;o.pie=r}),"pie"),architecture:t(()=>i(null,null,function*(){let{createArchitectureServices:e}=yield import("./chunk-IHY23QJP.js"),r=e().Architecture.parser.LangiumParser;o.architecture=r}),"architecture"),gitGraph:t(()=>i(null,null,function*(){let{createGitGraphServices:e}=yield import("./chunk-XE4A3JWW.js"),r=e().GitGraph.parser.LangiumParser;o.gitGraph=r}),"gitGraph"),radar:t(()=>i(null,null,function*(){let{createRadarServices:e}=yield import("./chunk-FDH623K7.js"),r=e().Radar.parser.LangiumParser;o.radar=r}),"radar"),treemap:t(()=>i(null,null,function*(){let{createTreemapServices:e}=yield import("./chunk-7UW26RYS.js"),r=e().Treemap.parser.LangiumParser;o.treemap=r}),"treemap")};function p(e,r){return i(this,null,function*(){let c=m[e];if(!c)throw new Error(`Unknown diagram type: ${e}`);o[e]||(yield c());let s=o[e].parse(r);if(s.lexerErrors.length>0||s.parserErrors.length>0)throw new u(s);return s.value})}t(p,"parse");var u=class extends Error{constructor(e){let r=e.lexerErrors.map(a=>{let s=a.line!==void 0&&!isNaN(a.line)?a.line:"?",n=a.column!==void 0&&!isNaN(a.column)?a.column:"?";return`Lexer error on line ${s}, column ${n}: ${a.message}`}).join(` +`),c=e.parserErrors.map(a=>{let s=a.token.startLine!==void 0&&!isNaN(a.token.startLine)?a.token.startLine:"?",n=a.token.startColumn!==void 0&&!isNaN(a.token.startColumn)?a.token.startColumn:"?";return`Parse error on line ${s}, column ${n}: ${a.message}`}).join(` +`);super(`Parsing failed: ${r} ${c}`),this.result=e}static{t(this,"MermaidParseError")}};export{p as a}; diff --git a/src/google/adk/cli/browser/chunk-TIJO3EOA.js b/src/google/adk/cli/browser/chunk-TIJO3EOA.js new file mode 100644 index 0000000000..3e13a70239 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-TIJO3EOA.js @@ -0,0 +1,189 @@ +import{a as lt}from"./chunk-B2DSW4QB.js";import{h as ut}from"./chunk-NMKTPNXE.js";import{a as ot}from"./chunk-APNCZOFE.js";import{a as ct}from"./chunk-ST54LLJ3.js";import{b as rt,c as nt}from"./chunk-F57TI45K.js";import{m as pe,p as at}from"./chunk-WBLSVR3V.js";import{G as qe,I as M,M as L,R as Je,S as Ze,T as $e,U as et,V as tt,W as st,X as it,Y as D,g as He}from"./chunk-QFMJV7VH.js";import{a as Z,g as d,i as he}from"./chunk-JRNAXTJ7.js";import{a as We,b as je,j as Xe}from"./chunk-RMXJBC7V.js";var we=(function(){var e=d(function(I,l,o,p){for(o=o||{},p=I.length;p--;o[I[p]]=l);return o},"o"),i=[1,18],n=[1,19],u=[1,20],a=[1,41],c=[1,42],f=[1,26],b=[1,24],F=[1,25],T=[1,32],O=[1,33],Ae=[1,34],k=[1,45],be=[1,35],fe=[1,36],ke=[1,37],ge=[1,38],me=[1,27],Ce=[1,28],Ee=[1,29],ye=[1,30],Te=[1,31],g=[1,44],m=[1,46],C=[1,43],E=[1,47],De=[1,9],h=[1,8,9],$=[1,58],ee=[1,59],te=[1,60],se=[1,61],ie=[1,62],Fe=[1,63],Be=[1,64],v=[1,8,9,41],Ve=[1,76],R=[1,8,9,12,13,22,39,41,44,68,69,70,71,72,73,74,79,81],ae=[1,8,9,12,13,18,20,22,39,41,44,50,60,68,69,70,71,72,73,74,79,81,86,100,102,103],re=[13,60,86,100,102,103],U=[13,60,73,74,86,100,102,103],Me=[13,60,68,69,70,71,72,86,100,102,103],_e=[1,101],z=[1,118],Y=[1,114],K=[1,110],Q=[1,116],W=[1,111],j=[1,112],X=[1,113],H=[1,115],q=[1,117],Pe=[22,48,60,61,82,86,87,88,89,90],Se=[1,8,9,39,41,44],ne=[1,8,9,22],Re=[1,147],Ge=[1,8,9,61],N=[1,8,9,22,48,60,61,82,86,87,88,89,90],Ne={trace:d(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statements:5,graphConfig:6,CLASS_DIAGRAM:7,NEWLINE:8,EOF:9,statement:10,classLabel:11,SQS:12,STR:13,SQE:14,namespaceName:15,alphaNumToken:16,classLiteralName:17,DOT:18,className:19,GENERICTYPE:20,relationStatement:21,LABEL:22,namespaceStatement:23,classStatement:24,memberStatement:25,annotationStatement:26,clickStatement:27,styleStatement:28,cssClassStatement:29,noteStatement:30,classDefStatement:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,namespaceIdentifier:38,STRUCT_START:39,classStatements:40,STRUCT_STOP:41,NAMESPACE:42,classIdentifier:43,STYLE_SEPARATOR:44,members:45,CLASS:46,emptyBody:47,SPACE:48,ANNOTATION_START:49,ANNOTATION_END:50,MEMBER:51,SEPARATOR:52,relation:53,NOTE_FOR:54,noteText:55,NOTE:56,CLASSDEF:57,classList:58,stylesOpt:59,ALPHA:60,COMMA:61,direction_tb:62,direction_bt:63,direction_rl:64,direction_lr:65,relationType:66,lineType:67,AGGREGATION:68,EXTENSION:69,COMPOSITION:70,DEPENDENCY:71,LOLLIPOP:72,LINE:73,DOTTED_LINE:74,CALLBACK:75,LINK:76,LINK_TARGET:77,CLICK:78,CALLBACK_NAME:79,CALLBACK_ARGS:80,HREF:81,STYLE:82,CSSCLASS:83,style:84,styleComponent:85,NUM:86,COLON:87,UNIT:88,BRKT:89,PCT:90,commentToken:91,textToken:92,graphCodeTokens:93,textNoTagsToken:94,TAGSTART:95,TAGEND:96,"==":97,"--":98,DEFAULT:99,MINUS:100,keywords:101,UNICODE_TEXT:102,BQUOTE_STR:103,$accept:0,$end:1},terminals_:{2:"error",7:"CLASS_DIAGRAM",8:"NEWLINE",9:"EOF",12:"SQS",13:"STR",14:"SQE",18:"DOT",20:"GENERICTYPE",22:"LABEL",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",39:"STRUCT_START",41:"STRUCT_STOP",42:"NAMESPACE",44:"STYLE_SEPARATOR",46:"CLASS",48:"SPACE",49:"ANNOTATION_START",50:"ANNOTATION_END",51:"MEMBER",52:"SEPARATOR",54:"NOTE_FOR",56:"NOTE",57:"CLASSDEF",60:"ALPHA",61:"COMMA",62:"direction_tb",63:"direction_bt",64:"direction_rl",65:"direction_lr",68:"AGGREGATION",69:"EXTENSION",70:"COMPOSITION",71:"DEPENDENCY",72:"LOLLIPOP",73:"LINE",74:"DOTTED_LINE",75:"CALLBACK",76:"LINK",77:"LINK_TARGET",78:"CLICK",79:"CALLBACK_NAME",80:"CALLBACK_ARGS",81:"HREF",82:"STYLE",83:"CSSCLASS",86:"NUM",87:"COLON",88:"UNIT",89:"BRKT",90:"PCT",93:"graphCodeTokens",95:"TAGSTART",96:"TAGEND",97:"==",98:"--",99:"DEFAULT",100:"MINUS",101:"keywords",102:"UNICODE_TEXT",103:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,1],[15,3],[15,2],[19,1],[19,3],[19,1],[19,2],[19,2],[19,2],[10,1],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[23,4],[23,5],[38,2],[40,1],[40,2],[40,3],[40,1],[40,2],[40,3],[24,1],[24,3],[24,4],[24,3],[24,6],[43,2],[43,3],[47,0],[47,2],[47,2],[26,4],[45,1],[45,2],[25,1],[25,2],[25,1],[25,1],[21,3],[21,4],[21,4],[21,5],[30,3],[30,2],[31,3],[58,1],[58,3],[32,1],[32,1],[32,1],[32,1],[53,3],[53,2],[53,2],[53,1],[66,1],[66,1],[66,1],[66,1],[66,1],[67,1],[67,1],[27,3],[27,4],[27,3],[27,4],[27,4],[27,5],[27,3],[27,4],[27,4],[27,5],[27,4],[27,5],[27,5],[27,6],[28,3],[29,3],[59,1],[59,3],[84,1],[84,2],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[91,1],[91,1],[92,1],[92,1],[92,1],[92,1],[92,1],[92,1],[92,1],[94,1],[94,1],[94,1],[94,1],[16,1],[16,1],[16,1],[16,1],[17,1],[55,1]],performAction:d(function(l,o,p,r,A,t,J){var s=t.length-1;switch(A){case 8:this.$=t[s-1];break;case 9:case 10:case 13:case 15:this.$=t[s];break;case 11:case 14:this.$=t[s-2]+"."+t[s];break;case 12:case 16:this.$=t[s-1]+t[s];break;case 17:case 18:this.$=t[s-1]+"~"+t[s]+"~";break;case 19:r.addRelation(t[s]);break;case 20:t[s-1].title=r.cleanupLabel(t[s]),r.addRelation(t[s-1]);break;case 31:this.$=t[s].trim(),r.setAccTitle(this.$);break;case 32:case 33:this.$=t[s].trim(),r.setAccDescription(this.$);break;case 34:r.addClassesToNamespace(t[s-3],t[s-1][0],t[s-1][1]);break;case 35:r.addClassesToNamespace(t[s-4],t[s-1][0],t[s-1][1]);break;case 36:this.$=t[s],r.addNamespace(t[s]);break;case 37:this.$=[[t[s]],[]];break;case 38:this.$=[[t[s-1]],[]];break;case 39:t[s][0].unshift(t[s-2]),this.$=t[s];break;case 40:this.$=[[],[t[s]]];break;case 41:this.$=[[],[t[s-1]]];break;case 42:t[s][1].unshift(t[s-2]),this.$=t[s];break;case 44:r.setCssClass(t[s-2],t[s]);break;case 45:r.addMembers(t[s-3],t[s-1]);break;case 47:r.setCssClass(t[s-5],t[s-3]),r.addMembers(t[s-5],t[s-1]);break;case 48:this.$=t[s],r.addClass(t[s]);break;case 49:this.$=t[s-1],r.addClass(t[s-1]),r.setClassLabel(t[s-1],t[s]);break;case 53:r.addAnnotation(t[s],t[s-2]);break;case 54:case 67:this.$=[t[s]];break;case 55:t[s].push(t[s-1]),this.$=t[s];break;case 56:break;case 57:r.addMember(t[s-1],r.cleanupLabel(t[s]));break;case 58:break;case 59:break;case 60:this.$={id1:t[s-2],id2:t[s],relation:t[s-1],relationTitle1:"none",relationTitle2:"none"};break;case 61:this.$={id1:t[s-3],id2:t[s],relation:t[s-1],relationTitle1:t[s-2],relationTitle2:"none"};break;case 62:this.$={id1:t[s-3],id2:t[s],relation:t[s-2],relationTitle1:"none",relationTitle2:t[s-1]};break;case 63:this.$={id1:t[s-4],id2:t[s],relation:t[s-2],relationTitle1:t[s-3],relationTitle2:t[s-1]};break;case 64:this.$=r.addNote(t[s],t[s-1]);break;case 65:this.$=r.addNote(t[s]);break;case 66:this.$=t[s-2],r.defineClass(t[s-1],t[s]);break;case 68:this.$=t[s-2].concat([t[s]]);break;case 69:r.setDirection("TB");break;case 70:r.setDirection("BT");break;case 71:r.setDirection("RL");break;case 72:r.setDirection("LR");break;case 73:this.$={type1:t[s-2],type2:t[s],lineType:t[s-1]};break;case 74:this.$={type1:"none",type2:t[s],lineType:t[s-1]};break;case 75:this.$={type1:t[s-1],type2:"none",lineType:t[s]};break;case 76:this.$={type1:"none",type2:"none",lineType:t[s]};break;case 77:this.$=r.relationType.AGGREGATION;break;case 78:this.$=r.relationType.EXTENSION;break;case 79:this.$=r.relationType.COMPOSITION;break;case 80:this.$=r.relationType.DEPENDENCY;break;case 81:this.$=r.relationType.LOLLIPOP;break;case 82:this.$=r.lineType.LINE;break;case 83:this.$=r.lineType.DOTTED_LINE;break;case 84:case 90:this.$=t[s-2],r.setClickEvent(t[s-1],t[s]);break;case 85:case 91:this.$=t[s-3],r.setClickEvent(t[s-2],t[s-1]),r.setTooltip(t[s-2],t[s]);break;case 86:this.$=t[s-2],r.setLink(t[s-1],t[s]);break;case 87:this.$=t[s-3],r.setLink(t[s-2],t[s-1],t[s]);break;case 88:this.$=t[s-3],r.setLink(t[s-2],t[s-1]),r.setTooltip(t[s-2],t[s]);break;case 89:this.$=t[s-4],r.setLink(t[s-3],t[s-2],t[s]),r.setTooltip(t[s-3],t[s-1]);break;case 92:this.$=t[s-3],r.setClickEvent(t[s-2],t[s-1],t[s]);break;case 93:this.$=t[s-4],r.setClickEvent(t[s-3],t[s-2],t[s-1]),r.setTooltip(t[s-3],t[s]);break;case 94:this.$=t[s-3],r.setLink(t[s-2],t[s]);break;case 95:this.$=t[s-4],r.setLink(t[s-3],t[s-1],t[s]);break;case 96:this.$=t[s-4],r.setLink(t[s-3],t[s-1]),r.setTooltip(t[s-3],t[s]);break;case 97:this.$=t[s-5],r.setLink(t[s-4],t[s-2],t[s]),r.setTooltip(t[s-4],t[s-1]);break;case 98:this.$=t[s-2],r.setCssStyle(t[s-1],t[s]);break;case 99:r.setCssClass(t[s-1],t[s]);break;case 100:this.$=[t[s]];break;case 101:t[s-2].push(t[s]),this.$=t[s-2];break;case 103:this.$=t[s-1]+t[s];break}},"anonymous"),table:[{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:39,17:40,19:21,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:i,35:n,37:u,38:22,42:a,43:23,46:c,49:f,51:b,52:F,54:T,56:O,57:Ae,60:k,62:be,63:fe,64:ke,65:ge,75:me,76:Ce,78:Ee,82:ye,83:Te,86:g,100:m,102:C,103:E},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},e(De,[2,5],{8:[1,48]}),{8:[1,49]},e(h,[2,19],{22:[1,50]}),e(h,[2,21]),e(h,[2,22]),e(h,[2,23]),e(h,[2,24]),e(h,[2,25]),e(h,[2,26]),e(h,[2,27]),e(h,[2,28]),e(h,[2,29]),e(h,[2,30]),{34:[1,51]},{36:[1,52]},e(h,[2,33]),e(h,[2,56],{53:53,66:56,67:57,13:[1,54],22:[1,55],68:$,69:ee,70:te,71:se,72:ie,73:Fe,74:Be}),{39:[1,65]},e(v,[2,43],{39:[1,67],44:[1,66]}),e(h,[2,58]),e(h,[2,59]),{16:68,60:k,86:g,100:m,102:C},{16:39,17:40,19:69,60:k,86:g,100:m,102:C,103:E},{16:39,17:40,19:70,60:k,86:g,100:m,102:C,103:E},{16:39,17:40,19:71,60:k,86:g,100:m,102:C,103:E},{60:[1,72]},{13:[1,73]},{16:39,17:40,19:74,60:k,86:g,100:m,102:C,103:E},{13:Ve,55:75},{58:77,60:[1,78]},e(h,[2,69]),e(h,[2,70]),e(h,[2,71]),e(h,[2,72]),e(R,[2,13],{16:39,17:40,19:80,18:[1,79],20:[1,81],60:k,86:g,100:m,102:C,103:E}),e(R,[2,15],{20:[1,82]}),{15:83,16:84,17:85,60:k,86:g,100:m,102:C,103:E},{16:39,17:40,19:86,60:k,86:g,100:m,102:C,103:E},e(ae,[2,126]),e(ae,[2,127]),e(ae,[2,128]),e(ae,[2,129]),e([1,8,9,12,13,20,22,39,41,44,68,69,70,71,72,73,74,79,81],[2,130]),e(De,[2,6],{10:5,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,19:21,38:22,43:23,16:39,17:40,5:87,33:i,35:n,37:u,42:a,46:c,49:f,51:b,52:F,54:T,56:O,57:Ae,60:k,62:be,63:fe,64:ke,65:ge,75:me,76:Ce,78:Ee,82:ye,83:Te,86:g,100:m,102:C,103:E}),{5:88,10:5,16:39,17:40,19:21,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:i,35:n,37:u,38:22,42:a,43:23,46:c,49:f,51:b,52:F,54:T,56:O,57:Ae,60:k,62:be,63:fe,64:ke,65:ge,75:me,76:Ce,78:Ee,82:ye,83:Te,86:g,100:m,102:C,103:E},e(h,[2,20]),e(h,[2,31]),e(h,[2,32]),{13:[1,90],16:39,17:40,19:89,60:k,86:g,100:m,102:C,103:E},{53:91,66:56,67:57,68:$,69:ee,70:te,71:se,72:ie,73:Fe,74:Be},e(h,[2,57]),{67:92,73:Fe,74:Be},e(re,[2,76],{66:93,68:$,69:ee,70:te,71:se,72:ie}),e(U,[2,77]),e(U,[2,78]),e(U,[2,79]),e(U,[2,80]),e(U,[2,81]),e(Me,[2,82]),e(Me,[2,83]),{8:[1,95],24:96,30:97,40:94,43:23,46:c,54:T,56:O},{16:98,60:k,86:g,100:m,102:C},{41:[1,100],45:99,51:_e},{50:[1,102]},{13:[1,103]},{13:[1,104]},{79:[1,105],81:[1,106]},{22:z,48:Y,59:107,60:K,82:Q,84:108,85:109,86:W,87:j,88:X,89:H,90:q},{60:[1,119]},{13:Ve,55:120},e(v,[2,65]),e(v,[2,131]),{22:z,48:Y,59:121,60:K,61:[1,122],82:Q,84:108,85:109,86:W,87:j,88:X,89:H,90:q},e(Pe,[2,67]),{16:39,17:40,19:123,60:k,86:g,100:m,102:C,103:E},e(R,[2,16]),e(R,[2,17]),e(R,[2,18]),{39:[2,36]},{15:125,16:84,17:85,18:[1,124],39:[2,9],60:k,86:g,100:m,102:C,103:E},{39:[2,10]},e(Se,[2,48],{11:126,12:[1,127]}),e(De,[2,7]),{9:[1,128]},e(ne,[2,60]),{16:39,17:40,19:129,60:k,86:g,100:m,102:C,103:E},{13:[1,131],16:39,17:40,19:130,60:k,86:g,100:m,102:C,103:E},e(re,[2,75],{66:132,68:$,69:ee,70:te,71:se,72:ie}),e(re,[2,74]),{41:[1,133]},{24:96,30:97,40:134,43:23,46:c,54:T,56:O},{8:[1,135],41:[2,37]},{8:[1,136],41:[2,40]},e(v,[2,44],{39:[1,137]}),{41:[1,138]},e(v,[2,46]),{41:[2,54],45:139,51:_e},{16:39,17:40,19:140,60:k,86:g,100:m,102:C,103:E},e(h,[2,84],{13:[1,141]}),e(h,[2,86],{13:[1,143],77:[1,142]}),e(h,[2,90],{13:[1,144],80:[1,145]}),{13:[1,146]},e(h,[2,98],{61:Re}),e(Ge,[2,100],{85:148,22:z,48:Y,60:K,82:Q,86:W,87:j,88:X,89:H,90:q}),e(N,[2,102]),e(N,[2,104]),e(N,[2,105]),e(N,[2,106]),e(N,[2,107]),e(N,[2,108]),e(N,[2,109]),e(N,[2,110]),e(N,[2,111]),e(N,[2,112]),e(h,[2,99]),e(v,[2,64]),e(h,[2,66],{61:Re}),{60:[1,149]},e(R,[2,14]),{15:150,16:84,17:85,60:k,86:g,100:m,102:C,103:E},{39:[2,12]},e(Se,[2,49]),{13:[1,151]},{1:[2,4]},e(ne,[2,62]),e(ne,[2,61]),{16:39,17:40,19:152,60:k,86:g,100:m,102:C,103:E},e(re,[2,73]),e(h,[2,34]),{41:[1,153]},{24:96,30:97,40:154,41:[2,38],43:23,46:c,54:T,56:O},{24:96,30:97,40:155,41:[2,41],43:23,46:c,54:T,56:O},{45:156,51:_e},e(v,[2,45]),{41:[2,55]},e(h,[2,53]),e(h,[2,85]),e(h,[2,87]),e(h,[2,88],{77:[1,157]}),e(h,[2,91]),e(h,[2,92],{13:[1,158]}),e(h,[2,94],{13:[1,160],77:[1,159]}),{22:z,48:Y,60:K,82:Q,84:161,85:109,86:W,87:j,88:X,89:H,90:q},e(N,[2,103]),e(Pe,[2,68]),{39:[2,11]},{14:[1,162]},e(ne,[2,63]),e(h,[2,35]),{41:[2,39]},{41:[2,42]},{41:[1,163]},e(h,[2,89]),e(h,[2,93]),e(h,[2,95]),e(h,[2,96],{77:[1,164]}),e(Ge,[2,101],{85:148,22:z,48:Y,60:K,82:Q,86:W,87:j,88:X,89:H,90:q}),e(Se,[2,8]),e(v,[2,47]),e(h,[2,97])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],83:[2,36],85:[2,10],125:[2,12],128:[2,4],139:[2,55],150:[2,11],154:[2,39],155:[2,42]},parseError:d(function(l,o){if(o.recoverable)this.trace(l);else{var p=new Error(l);throw p.hash=o,p}},"parseError"),parse:d(function(l){var o=this,p=[0],r=[],A=[null],t=[],J=this.table,s="",le=0,Ue=0,ze=0,bt=2,Ye=1,ft=t.slice.call(arguments,1),y=Object.create(this.lexer),w={yy:{}};for(var Le in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Le)&&(w.yy[Le]=this.yy[Le]);y.setInput(l,w.yy),w.yy.lexer=y,w.yy.parser=this,typeof y.yylloc>"u"&&(y.yylloc={});var xe=y.yylloc;t.push(xe);var kt=y.options&&y.options.ranges;typeof w.yy.parseError=="function"?this.parseError=w.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function gt(_){p.length=p.length-2*_,A.length=A.length-_,t.length=t.length-_}d(gt,"popStack");function Ke(){var _;return _=r.pop()||y.lex()||Ye,typeof _!="number"&&(_ instanceof Array&&(r=_,_=r.pop()),_=o.symbols_[_]||_),_}d(Ke,"lex");for(var B,ve,V,S,Tt,Ie,G={},oe,x,Qe,ce;;){if(V=p[p.length-1],this.defaultActions[V]?S=this.defaultActions[V]:((B===null||typeof B>"u")&&(B=Ke()),S=J[V]&&J[V][B]),typeof S>"u"||!S.length||!S[0]){var Oe="";ce=[];for(oe in J[V])this.terminals_[oe]&&oe>bt&&ce.push("'"+this.terminals_[oe]+"'");y.showPosition?Oe="Parse error on line "+(le+1)+`: +`+y.showPosition()+` +Expecting `+ce.join(", ")+", got '"+(this.terminals_[B]||B)+"'":Oe="Parse error on line "+(le+1)+": Unexpected "+(B==Ye?"end of input":"'"+(this.terminals_[B]||B)+"'"),this.parseError(Oe,{text:y.match,token:this.terminals_[B]||B,line:y.yylineno,loc:xe,expected:ce})}if(S[0]instanceof Array&&S.length>1)throw new Error("Parse Error: multiple actions possible at state: "+V+", token: "+B);switch(S[0]){case 1:p.push(B),A.push(y.yytext),t.push(y.yylloc),p.push(S[1]),B=null,ve?(B=ve,ve=null):(Ue=y.yyleng,s=y.yytext,le=y.yylineno,xe=y.yylloc,ze>0&&ze--);break;case 2:if(x=this.productions_[S[1]][1],G.$=A[A.length-x],G._$={first_line:t[t.length-(x||1)].first_line,last_line:t[t.length-1].last_line,first_column:t[t.length-(x||1)].first_column,last_column:t[t.length-1].last_column},kt&&(G._$.range=[t[t.length-(x||1)].range[0],t[t.length-1].range[1]]),Ie=this.performAction.apply(G,[s,Ue,le,w.yy,S[1],A,t].concat(ft)),typeof Ie<"u")return Ie;x&&(p=p.slice(0,-1*x*2),A=A.slice(0,-1*x),t=t.slice(0,-1*x)),p.push(this.productions_[S[1]][0]),A.push(G.$),t.push(G._$),Qe=J[p[p.length-2]][p[p.length-1]],p.push(Qe);break;case 3:return!0}}return!0},"parse")},At=(function(){var I={EOF:1,parseError:d(function(o,p){if(this.yy.parser)this.yy.parser.parseError(o,p);else throw new Error(o)},"parseError"),setInput:d(function(l,o){return this.yy=o||this.yy||{},this._input=l,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:d(function(){var l=this._input[0];this.yytext+=l,this.yyleng++,this.offset++,this.match+=l,this.matched+=l;var o=l.match(/(?:\r\n?|\n).*/g);return o?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),l},"input"),unput:d(function(l){var o=l.length,p=l.split(/(?:\r\n?|\n)/g);this._input=l+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-o),this.offset-=o;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),p.length-1&&(this.yylineno-=p.length-1);var A=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:p?(p.length===r.length?this.yylloc.first_column:0)+r[r.length-p.length].length-p[0].length:this.yylloc.first_column-o},this.options.ranges&&(this.yylloc.range=[A[0],A[0]+this.yyleng-o]),this.yyleng=this.yytext.length,this},"unput"),more:d(function(){return this._more=!0,this},"more"),reject:d(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:d(function(l){this.unput(this.match.slice(l))},"less"),pastInput:d(function(){var l=this.matched.substr(0,this.matched.length-this.match.length);return(l.length>20?"...":"")+l.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:d(function(){var l=this.match;return l.length<20&&(l+=this._input.substr(0,20-l.length)),(l.substr(0,20)+(l.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:d(function(){var l=this.pastInput(),o=new Array(l.length+1).join("-");return l+this.upcomingInput()+` +`+o+"^"},"showPosition"),test_match:d(function(l,o){var p,r,A;if(this.options.backtrack_lexer&&(A={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(A.yylloc.range=this.yylloc.range.slice(0))),r=l[0].match(/(?:\r\n?|\n).*/g),r&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+l[0].length},this.yytext+=l[0],this.match+=l[0],this.matches=l,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(l[0].length),this.matched+=l[0],p=this.performAction.call(this,this.yy,this,o,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),p)return p;if(this._backtrack){for(var t in A)this[t]=A[t];return!1}return!1},"test_match"),next:d(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var l,o,p,r;this._more||(this.yytext="",this.match="");for(var A=this._currentRules(),t=0;to[0].length)){if(o=p,r=t,this.options.backtrack_lexer){if(l=this.test_match(p,A[t]),l!==!1)return l;if(this._backtrack){o=!1;continue}else return!1}else if(!this.options.flex)break}return o?(l=this.test_match(o,A[r]),l!==!1?l:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:d(function(){var o=this.next();return o||this.lex()},"lex"),begin:d(function(o){this.conditionStack.push(o)},"begin"),popState:d(function(){var o=this.conditionStack.length-1;return o>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:d(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:d(function(o){return o=this.conditionStack.length-1-Math.abs(o||0),o>=0?this.conditionStack[o]:"INITIAL"},"topState"),pushState:d(function(o){this.begin(o)},"pushState"),stateStackSize:d(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:d(function(o,p,r,A){var t=A;switch(r){case 0:return 62;case 1:return 63;case 2:return 64;case 3:return 65;case 4:break;case 5:break;case 6:return this.begin("acc_title"),33;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),35;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 8;case 14:break;case 15:return 7;case 16:return 7;case 17:return"EDGE_STATE";case 18:this.begin("callback_name");break;case 19:this.popState();break;case 20:this.popState(),this.begin("callback_args");break;case 21:return 79;case 22:this.popState();break;case 23:return 80;case 24:this.popState();break;case 25:return"STR";case 26:this.begin("string");break;case 27:return 82;case 28:return 57;case 29:return this.begin("namespace"),42;break;case 30:return this.popState(),8;break;case 31:break;case 32:return this.begin("namespace-body"),39;break;case 33:return this.popState(),41;break;case 34:return"EOF_IN_STRUCT";case 35:return 8;case 36:break;case 37:return"EDGE_STATE";case 38:return this.begin("class"),46;break;case 39:return this.popState(),8;break;case 40:break;case 41:return this.popState(),this.popState(),41;break;case 42:return this.begin("class-body"),39;break;case 43:return this.popState(),41;break;case 44:return"EOF_IN_STRUCT";case 45:return"EDGE_STATE";case 46:return"OPEN_IN_STRUCT";case 47:break;case 48:return"MEMBER";case 49:return 83;case 50:return 75;case 51:return 76;case 52:return 78;case 53:return 54;case 54:return 56;case 55:return 49;case 56:return 50;case 57:return 81;case 58:this.popState();break;case 59:return"GENERICTYPE";case 60:this.begin("generic");break;case 61:this.popState();break;case 62:return"BQUOTE_STR";case 63:this.begin("bqstring");break;case 64:return 77;case 65:return 77;case 66:return 77;case 67:return 77;case 68:return 69;case 69:return 69;case 70:return 71;case 71:return 71;case 72:return 70;case 73:return 68;case 74:return 72;case 75:return 73;case 76:return 74;case 77:return 22;case 78:return 44;case 79:return 100;case 80:return 18;case 81:return"PLUS";case 82:return 87;case 83:return 61;case 84:return 89;case 85:return 89;case 86:return 90;case 87:return"EQUALS";case 88:return"EQUALS";case 89:return 60;case 90:return 12;case 91:return 14;case 92:return"PUNCTUATION";case 93:return 86;case 94:return 102;case 95:return 48;case 96:return 48;case 97:return 9}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:\[\*\])/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:["])/,/^(?:[^"]*)/,/^(?:["])/,/^(?:style\b)/,/^(?:classDef\b)/,/^(?:namespace\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:\[\*\])/,/^(?:class\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[}])/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\[\*\])/,/^(?:[{])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:href\b)/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:~)/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:[`])/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?::)/,/^(?:,)/,/^(?:#)/,/^(?:#)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:\[)/,/^(?:\])/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:\s)/,/^(?:$)/],conditions:{"namespace-body":{rules:[26,33,34,35,36,37,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},namespace:{rules:[26,29,30,31,32,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},"class-body":{rules:[26,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},class:{rules:[26,39,40,41,42,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr_multiline:{rules:[11,12,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr:{rules:[9,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_title:{rules:[7,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_args:{rules:[22,23,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_name:{rules:[19,20,21,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},href:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},struct:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},generic:{rules:[26,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},bqstring:{rules:[26,49,50,51,52,53,54,55,56,57,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},string:{rules:[24,25,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,26,27,28,29,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],inclusive:!0}}};return I})();Ne.lexer=At;function ue(){this.yy={}}return d(ue,"Parser"),ue.prototype=Ne,Ne.Parser=ue,new ue})();we.parser=we;var vt=we,ht=["#","+","~","-",""],pt=class{static{d(this,"ClassMember")}constructor(e,i){this.memberType=i,this.visibility="",this.classifier="",this.text="";let n=qe(e,D());this.parseMember(n)}getDisplayDetails(){let e=this.visibility+M(this.id);this.memberType==="method"&&(e+=`(${M(this.parameters.trim())})`,this.returnType&&(e+=" : "+M(this.returnType))),e=e.trim();let i=this.parseClassifier();return{displayText:e,cssStyle:i}}parseMember(e){let i="";if(this.memberType==="method"){let a=/([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/.exec(e);if(a){let c=a[1]?a[1].trim():"";if(ht.includes(c)&&(this.visibility=c),this.id=a[2],this.parameters=a[3]?a[3].trim():"",i=a[4]?a[4].trim():"",this.returnType=a[5]?a[5].trim():"",i===""){let f=this.returnType.substring(this.returnType.length-1);/[$*]/.exec(f)&&(i=f,this.returnType=this.returnType.substring(0,this.returnType.length-1))}}}else{let u=e.length,a=e.substring(0,1),c=e.substring(u-1);ht.includes(a)&&(this.visibility=a),/[$*]/.exec(c)&&(i=c),this.id=e.substring(this.visibility===""?0:1,i===""?u:u-1)}this.classifier=i,this.id=this.id.startsWith(" ")?" "+this.id.trim():this.id.trim();let n=`${this.visibility?"\\"+this.visibility:""}${M(this.id)}${this.memberType==="method"?`(${M(this.parameters)})${this.returnType?" : "+M(this.returnType):""}`:""}`;this.text=n.replaceAll("<","<").replaceAll(">",">"),this.text.startsWith("\\<")&&(this.text=this.text.replace("\\<","~"))}parseClassifier(){switch(this.classifier){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}}},de="classId-",dt=0,P=d(e=>L.sanitizeText(e,D()),"sanitizeText"),wt=class{constructor(){this.relations=[],this.classes=new Map,this.styleClasses=new Map,this.notes=new Map,this.interfaces=[],this.namespaces=new Map,this.namespaceCounter=0,this.functions=[],this.lineType={LINE:0,DOTTED_LINE:1},this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3,LOLLIPOP:4},this.setupToolTips=d(e=>{let i=ut();Z(e).select("svg").selectAll("g").filter(function(){return Z(this).attr("title")!==null}).on("mouseover",a=>{let c=Z(a.currentTarget),f=c.attr("title");if(!f)return;let b=a.currentTarget.getBoundingClientRect();i.transition().duration(200).style("opacity",".9"),i.html(He.sanitize(f)).style("left",`${window.scrollX+b.left+b.width/2}px`).style("top",`${window.scrollY+b.bottom+4}px`),c.classed("hover",!0)}).on("mouseout",a=>{i.transition().duration(500).style("opacity",0),Z(a.currentTarget).classed("hover",!1)})},"setupToolTips"),this.direction="TB",this.setAccTitle=Ze,this.getAccTitle=$e,this.setAccDescription=et,this.getAccDescription=tt,this.setDiagramTitle=st,this.getDiagramTitle=it,this.getConfig=d(()=>D().class,"getConfig"),this.functions.push(this.setupToolTips.bind(this)),this.clear(),this.addRelation=this.addRelation.bind(this),this.addClassesToNamespace=this.addClassesToNamespace.bind(this),this.addNamespace=this.addNamespace.bind(this),this.setCssClass=this.setCssClass.bind(this),this.addMembers=this.addMembers.bind(this),this.addClass=this.addClass.bind(this),this.setClassLabel=this.setClassLabel.bind(this),this.addAnnotation=this.addAnnotation.bind(this),this.addMember=this.addMember.bind(this),this.cleanupLabel=this.cleanupLabel.bind(this),this.addNote=this.addNote.bind(this),this.defineClass=this.defineClass.bind(this),this.setDirection=this.setDirection.bind(this),this.setLink=this.setLink.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.clear=this.clear.bind(this),this.setTooltip=this.setTooltip.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setCssStyle=this.setCssStyle.bind(this)}static{d(this,"ClassDB")}splitClassNameAndType(e){let i=L.sanitizeText(e,D()),n="",u=i;if(i.indexOf("~")>0){let a=i.split("~");u=P(a[0]),n=P(a[1])}return{className:u,type:n}}setClassLabel(e,i){let n=L.sanitizeText(e,D());i&&(i=P(i));let{className:u}=this.splitClassNameAndType(n);this.classes.get(u).label=i,this.classes.get(u).text=`${i}${this.classes.get(u).type?`<${this.classes.get(u).type}>`:""}`}addClass(e){let i=L.sanitizeText(e,D()),{className:n,type:u}=this.splitClassNameAndType(i);if(this.classes.has(n))return;let a=L.sanitizeText(n,D());this.classes.set(a,{id:a,type:u,label:a,text:`${a}${u?`<${u}>`:""}`,shape:"classBox",cssClasses:"default",methods:[],members:[],annotations:[],styles:[],domId:de+a+"-"+dt}),dt++}addInterface(e,i){let n={id:`interface${this.interfaces.length}`,label:e,classId:i};this.interfaces.push(n)}lookUpDomId(e){let i=L.sanitizeText(e,D());if(this.classes.has(i))return this.classes.get(i).domId;throw new Error("Class not found: "+i)}clear(){this.relations=[],this.classes=new Map,this.notes=new Map,this.interfaces=[],this.functions=[],this.functions.push(this.setupToolTips.bind(this)),this.namespaces=new Map,this.namespaceCounter=0,this.direction="TB",Je()}getClass(e){return this.classes.get(e)}getClasses(){return this.classes}getRelations(){return this.relations}getNote(e){let i=typeof e=="number"?`note${e}`:e;return this.notes.get(i)}getNotes(){return this.notes}addRelation(e){he.debug("Adding relation: "+JSON.stringify(e));let i=[this.relationType.LOLLIPOP,this.relationType.AGGREGATION,this.relationType.COMPOSITION,this.relationType.DEPENDENCY,this.relationType.EXTENSION];e.relation.type1===this.relationType.LOLLIPOP&&!i.includes(e.relation.type2)?(this.addClass(e.id2),this.addInterface(e.id1,e.id2),e.id1=`interface${this.interfaces.length-1}`):e.relation.type2===this.relationType.LOLLIPOP&&!i.includes(e.relation.type1)?(this.addClass(e.id1),this.addInterface(e.id2,e.id1),e.id2=`interface${this.interfaces.length-1}`):(this.addClass(e.id1),this.addClass(e.id2)),e.id1=this.splitClassNameAndType(e.id1).className,e.id2=this.splitClassNameAndType(e.id2).className,e.relationTitle1=L.sanitizeText(e.relationTitle1.trim(),D()),e.relationTitle2=L.sanitizeText(e.relationTitle2.trim(),D()),this.relations.push(e)}addAnnotation(e,i){let n=this.splitClassNameAndType(e).className;this.classes.get(n).annotations.push(i)}addMember(e,i){this.addClass(e);let n=this.splitClassNameAndType(e).className,u=this.classes.get(n);if(typeof i=="string"){let a=i.trim();a.startsWith("<<")&&a.endsWith(">>")?u.annotations.push(P(a.substring(2,a.length-2))):a.indexOf(")")>0?u.methods.push(new pt(a,"method")):a&&u.members.push(new pt(a,"attribute"))}}addMembers(e,i){Array.isArray(i)&&(i.reverse(),i.forEach(n=>this.addMember(e,n)))}addNote(e,i){let n=this.notes.size,u={id:`note${n}`,class:i,text:e,index:n};return this.notes.set(u.id,u),u.id}cleanupLabel(e){return e.startsWith(":")&&(e=e.substring(1)),P(e.trim())}setCssClass(e,i){e.split(",").forEach(n=>{let u=n;/\d/.exec(n[0])&&(u=de+u);let a=this.classes.get(u);a&&(a.cssClasses+=" "+i)})}defineClass(e,i){for(let n of e){let u=this.styleClasses.get(n);u===void 0&&(u={id:n,styles:[],textStyles:[]},this.styleClasses.set(n,u)),i&&i.forEach(a=>{if(/color/.exec(a)){let c=a.replace("fill","bgFill");u.textStyles.push(c)}u.styles.push(a)}),this.classes.forEach(a=>{a.cssClasses.includes(n)&&a.styles.push(...i.flatMap(c=>c.split(",")))})}}setTooltip(e,i){e.split(",").forEach(n=>{i!==void 0&&(this.classes.get(n).tooltip=P(i))})}getTooltip(e,i){return i&&this.namespaces.has(i)?this.namespaces.get(i).classes.get(e).tooltip:this.classes.get(e).tooltip}setLink(e,i,n){let u=D();e.split(",").forEach(a=>{let c=a;/\d/.exec(a[0])&&(c=de+c);let f=this.classes.get(c);f&&(f.link=pe.formatUrl(i,u),u.securityLevel==="sandbox"?f.linkTarget="_top":typeof n=="string"?f.linkTarget=P(n):f.linkTarget="_blank")}),this.setCssClass(e,"clickable")}setClickEvent(e,i,n){e.split(",").forEach(u=>{this.setClickFunc(u,i,n),this.classes.get(u).haveCallback=!0}),this.setCssClass(e,"clickable")}setClickFunc(e,i,n){let u=L.sanitizeText(e,D());if(D().securityLevel!=="loose"||i===void 0)return;let c=u;if(this.classes.has(c)){let f=this.lookUpDomId(c),b=[];if(typeof n=="string"){b=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let F=0;F{let F=document.querySelector(`[id="${f}"]`);F!==null&&F.addEventListener("click",()=>{pe.runFunc(i,...b)},!1)})}}bindFunctions(e){this.functions.forEach(i=>{i(e)})}escapeHtml(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}getDirection(){return this.direction}setDirection(e){this.direction=e}addNamespace(e){this.namespaces.has(e)||(this.namespaces.set(e,{id:e,classes:new Map,notes:new Map,children:new Map,domId:de+e+"-"+this.namespaceCounter}),this.namespaceCounter++)}getNamespace(e){return this.namespaces.get(e)}getNamespaces(){return this.namespaces}addClassesToNamespace(e,i,n){if(this.namespaces.has(e)){for(let u of i){let{className:a}=this.splitClassNameAndType(u),c=this.getClass(a);c.parent=e,this.namespaces.get(e).classes.set(a,c)}for(let u of n){let a=this.getNote(u);a.parent=e,this.namespaces.get(e).notes.set(u,a)}}}setCssStyle(e,i){let n=this.classes.get(e);if(!(!i||!n))for(let u of i)u.includes(",")?n.styles.push(...u.split(",")):n.styles.push(u)}getArrowMarker(e){let i;switch(e){case 0:i="aggregation";break;case 1:i="extension";break;case 2:i="composition";break;case 3:i="dependency";break;case 4:i="lollipop";break;default:i="none"}return i}getData(){let e=[],i=[],n=D();for(let a of this.namespaces.values()){let c={id:a.id,label:a.id,isGroup:!0,padding:n.class.padding??16,shape:"rect",cssStyles:[],look:n.look};e.push(c)}for(let a of this.classes.values()){let c=je(We({},a),{type:void 0,isGroup:!1,parentId:a.parent,look:n.look});e.push(c)}for(let a of this.notes.values()){let c={id:a.id,label:a.text,isGroup:!1,shape:"note",padding:n.class.padding??6,cssStyles:["text-align: left","white-space: nowrap",`fill: ${n.themeVariables.noteBkgColor}`,`stroke: ${n.themeVariables.noteBorderColor}`],look:n.look,parentId:a.parent,labelType:"markdown"};e.push(c);let f=this.classes.get(a.class)?.id;if(f){let b={id:`edgeNote${a.index}`,start:a.id,end:f,type:"normal",thickness:"normal",classes:"relation",arrowTypeStart:"none",arrowTypeEnd:"none",arrowheadStyle:"",labelStyle:[""],style:["fill: none"],pattern:"dotted",look:n.look};i.push(b)}}for(let a of this.interfaces){let c={id:a.id,label:a.label,isGroup:!1,shape:"rect",cssStyles:["opacity: 0;"],look:n.look};e.push(c)}let u=0;for(let a of this.relations){u++;let c={id:at(a.id1,a.id2,{prefix:"id",counter:u}),start:a.id1,end:a.id2,type:"normal",label:a.title,labelpos:"c",thickness:"normal",classes:"relation",arrowTypeStart:this.getArrowMarker(a.relation.type1),arrowTypeEnd:this.getArrowMarker(a.relation.type2),startLabelRight:a.relationTitle1==="none"?"":a.relationTitle1,endLabelLeft:a.relationTitle2==="none"?"":a.relationTitle2,arrowheadStyle:"",labelStyle:["display: inline-block"],style:a.style||"",pattern:a.relation.lineType==1?"dashed":"solid",look:n.look,labelType:"markdown"};i.push(c)}return{nodes:e,edges:i,other:{},config:n,direction:this.getDirection()}}},mt=d(e=>`g.classGroup text { + fill: ${e.nodeBorder||e.classText}; + stroke: none; + font-family: ${e.fontFamily}; + font-size: 10px; + + .title { + font-weight: bolder; + } + +} + + .cluster-label text { + fill: ${e.titleColor}; + } + .cluster-label span { + color: ${e.titleColor}; + } + .cluster-label span p { + background-color: transparent; + } + + .cluster rect { + fill: ${e.clusterBkg}; + stroke: ${e.clusterBorder}; + stroke-width: 1px; + } + + .cluster text { + fill: ${e.titleColor}; + } + + .cluster span { + color: ${e.titleColor}; + } + +.nodeLabel, .edgeLabel { + color: ${e.classText}; +} +.edgeLabel .label rect { + fill: ${e.mainBkg}; +} +.label text { + fill: ${e.classText}; +} + +.labelBkg { + background: ${e.mainBkg}; +} +.edgeLabel .label span { + background: ${e.mainBkg}; +} + +.classTitle { + font-weight: bolder; +} +.node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${e.mainBkg}; + stroke: ${e.nodeBorder}; + stroke-width: 1px; + } + + +.divider { + stroke: ${e.nodeBorder}; + stroke-width: 1; +} + +g.clickable { + cursor: pointer; +} + +g.classGroup rect { + fill: ${e.mainBkg}; + stroke: ${e.nodeBorder}; +} + +g.classGroup line { + stroke: ${e.nodeBorder}; + stroke-width: 1; +} + +.classLabel .box { + stroke: none; + stroke-width: 0; + fill: ${e.mainBkg}; + opacity: 0.5; +} + +.classLabel .label { + fill: ${e.nodeBorder}; + font-size: 10px; +} + +.relation { + stroke: ${e.lineColor}; + stroke-width: 1; + fill: none; +} + +.dashed-line{ + stroke-dasharray: 3; +} + +.dotted-line{ + stroke-dasharray: 1 2; +} + +#compositionStart, .composition { + fill: ${e.lineColor} !important; + stroke: ${e.lineColor} !important; + stroke-width: 1; +} + +#compositionEnd, .composition { + fill: ${e.lineColor} !important; + stroke: ${e.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${e.lineColor} !important; + stroke: ${e.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${e.lineColor} !important; + stroke: ${e.lineColor} !important; + stroke-width: 1; +} + +#extensionStart, .extension { + fill: transparent !important; + stroke: ${e.lineColor} !important; + stroke-width: 1; +} + +#extensionEnd, .extension { + fill: transparent !important; + stroke: ${e.lineColor} !important; + stroke-width: 1; +} + +#aggregationStart, .aggregation { + fill: transparent !important; + stroke: ${e.lineColor} !important; + stroke-width: 1; +} + +#aggregationEnd, .aggregation { + fill: transparent !important; + stroke: ${e.lineColor} !important; + stroke-width: 1; +} + +#lollipopStart, .lollipop { + fill: ${e.mainBkg} !important; + stroke: ${e.lineColor} !important; + stroke-width: 1; +} + +#lollipopEnd, .lollipop { + fill: ${e.mainBkg} !important; + stroke: ${e.lineColor} !important; + stroke-width: 1; +} + +.edgeTerminals { + font-size: 11px; + line-height: initial; +} + +.classTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${e.textColor}; +} + ${lt()} +`,"getStyles"),Vt=mt,Ct=d((e,i="TB")=>{if(!e.doc)return i;let n=i;for(let u of e.doc)u.stmt==="dir"&&(n=u.value);return n},"getDir"),Et=d(function(e,i){return i.db.getClasses()},"getClasses"),yt=d(function(e,i,n,u){return Xe(this,null,function*(){he.info("REF0:"),he.info("Drawing class diagram (v3)",i);let{securityLevel:a,state:c,layout:f}=D(),b=u.db.getData(),F=ot(i,a);b.type=u.type,b.layoutAlgorithm=nt(f),b.nodeSpacing=c?.nodeSpacing||50,b.rankSpacing=c?.rankSpacing||50,b.markers=["aggregation","extension","composition","dependency","lollipop"],b.diagramId=i,yield rt(b,F);let T=8;pe.insertTitle(F,"classDiagramTitleText",c?.titleTopMargin??25,u.db.getDiagramTitle()),ct(F,T,"classDiagram",c?.useMaxWidth??!0)})},"draw"),Mt={getClasses:Et,draw:yt,getDir:Ct};export{vt as a,wt as b,Vt as c,Mt as d}; diff --git a/src/google/adk/cli/browser/chunk-TNJPXCAB.js b/src/google/adk/cli/browser/chunk-TNJPXCAB.js new file mode 100644 index 0000000000..1dde258711 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-TNJPXCAB.js @@ -0,0 +1,7 @@ +import{a as T,b as Y,c as K,d as yt}from"./chunk-JHZIBEJC.js";import{c as B}from"./chunk-W7PRDKNL.js";import{a as kt}from"./chunk-DRBE27N3.js";import{a as gt}from"./chunk-PRKFGJVH.js";import{c as ut,d as xt}from"./chunk-VDPKVNDJ.js";import{f as bt}from"./chunk-WXI2IBAH.js";import{m as O}from"./chunk-WBLSVR3V.js";import{E as F,Y as E}from"./chunk-QFMJV7VH.js";import{$ as ct,L as N,M as nt,O as st,P as ot,Q as G,U as it,X as lt,a as S,aa as dt,ba as ft,ca as pt,da as ht,ea as mt,g as p,i as b}from"./chunk-JRNAXTJ7.js";import{a as at,j as et}from"./chunk-RMXJBC7V.js";var Ot=p((r,t,a,n,i,s)=>{t.arrowTypeStart&&wt(r,"start",t.arrowTypeStart,a,n,i,s),t.arrowTypeEnd&&wt(r,"end",t.arrowTypeEnd,a,n,i,s)},"addEdgeMarkers"),Tt={arrow_cross:{type:"cross",fill:!1},arrow_point:{type:"point",fill:!0},arrow_barb:{type:"barb",fill:!0},arrow_circle:{type:"circle",fill:!1},aggregation:{type:"aggregation",fill:!1},extension:{type:"extension",fill:!1},composition:{type:"composition",fill:!0},dependency:{type:"dependency",fill:!0},lollipop:{type:"lollipop",fill:!1},only_one:{type:"onlyOne",fill:!1},zero_or_one:{type:"zeroOrOne",fill:!1},one_or_more:{type:"oneOrMore",fill:!1},zero_or_more:{type:"zeroOrMore",fill:!1},requirement_arrow:{type:"requirement_arrow",fill:!1},requirement_contains:{type:"requirement_contains",fill:!1}},wt=p((r,t,a,n,i,s,e)=>{let o=Tt[a];if(!o){b.warn(`Unknown arrow type: ${a}`);return}let c=o.type,m=`${i}_${s}-${c}${t==="start"?"Start":"End"}`;if(e&&e.trim()!==""){let y=e.replace(/[^\dA-Za-z]/g,"_"),f=`${m}_${y}`;if(!document.getElementById(f)){let d=document.getElementById(m);if(d){let u=d.cloneNode(!0);u.id=f,u.querySelectorAll("path, circle, line").forEach(k=>{k.setAttribute("stroke",e),o.fill&&k.setAttribute("fill",e)}),d.parentNode?.appendChild(u)}}r.attr(`marker-${t}`,`url(${n}#${f})`)}else r.attr(`marker-${t}`,`url(${n}#${m})`)},"addEdgeMarker"),Xt=p(r=>typeof r=="string"?r:E()?.flowchart?.curve,"resolveEdgeCurveType"),Q=new Map,w=new Map,cr=p(()=>{Q.clear(),w.clear()},"clear"),C=p(r=>r?typeof r=="string"?r:r.reduce((t,a)=>t+";"+a,""):"","getLabelStyles"),dr=p((r,t)=>et(null,null,function*(){let a=E(),n=F(a),{labelStyles:i}=xt(t);t.labelStyle=i;let s=r.insert("g").attr("class","edgeLabel"),e=s.insert("g").attr("class","label").attr("data-id",t.id),o=t.labelType==="markdown",l=yield bt(r,t.label,{style:C(t.labelStyle),useHtmlLabels:n,addSvgBackground:!0,isNode:!1,markdown:o,width:o?void 0:void 0},a);e.node().appendChild(l),b.info("abc82",t,t.labelType);let m=l.getBBox(),y=m;if(n){let d=l.children[0],u=S(l);m=d.getBoundingClientRect(),y=m,u.attr("width",m.width),u.attr("height",m.height)}else{let d=S(l).select("text").node();d&&typeof d.getBBox=="function"&&(y=d.getBBox())}e.attr("transform",T(y,n)),Q.set(t.id,s),t.width=m.width,t.height=m.height;let f;if(t.startLabelLeft){let d=r.insert("g").attr("class","edgeTerminals"),u=d.insert("g").attr("class","inner"),h=yield B(u,t.startLabelLeft,C(t.labelStyle)||"",!1,!1);f=h;let k=h.getBBox();if(n){let x=h.children[0],L=S(h);k=x.getBoundingClientRect(),L.attr("width",k.width),L.attr("height",k.height)}u.attr("transform",T(k,n)),w.get(t.id)||w.set(t.id,{}),w.get(t.id).startLeft=d,W(f,t.startLabelLeft)}if(t.startLabelRight){let d=r.insert("g").attr("class","edgeTerminals"),u=d.insert("g").attr("class","inner"),h=yield B(u,t.startLabelRight,C(t.labelStyle)||"",!1,!1);f=h,u.node().appendChild(h);let k=h.getBBox();if(n){let x=h.children[0],L=S(h);k=x.getBoundingClientRect(),L.attr("width",k.width),L.attr("height",k.height)}u.attr("transform",T(k,n)),w.get(t.id)||w.set(t.id,{}),w.get(t.id).startRight=d,W(f,t.startLabelRight)}if(t.endLabelLeft){let d=r.insert("g").attr("class","edgeTerminals"),u=d.insert("g").attr("class","inner"),h=yield B(u,t.endLabelLeft,C(t.labelStyle)||"",!1,!1);f=h;let k=h.getBBox();if(n){let x=h.children[0],L=S(h);k=x.getBoundingClientRect(),L.attr("width",k.width),L.attr("height",k.height)}u.attr("transform",T(k,n)),d.node().appendChild(h),w.get(t.id)||w.set(t.id,{}),w.get(t.id).endLeft=d,W(f,t.endLabelLeft)}if(t.endLabelRight){let d=r.insert("g").attr("class","edgeTerminals"),u=d.insert("g").attr("class","inner"),h=yield B(u,t.endLabelRight,C(t.labelStyle)||"",!1,!1);f=h;let k=h.getBBox();if(n){let x=h.children[0],L=S(h);k=x.getBoundingClientRect(),L.attr("width",k.width),L.attr("height",k.height)}u.attr("transform",T(k,n)),d.node().appendChild(h),w.get(t.id)||w.set(t.id,{}),w.get(t.id).endRight=d,W(f,t.endLabelRight)}return l}),"insertEdgeLabel");function W(r,t){F(E())&&r&&(r.style.width=t.length*9+"px",r.style.height="12px")}p(W,"setTerminalWidth");var fr=p((r,t)=>{b.debug("Moving label abc88 ",r.id,r.label,Q.get(r.id),t);let a=t.updatedPath?t.updatedPath:t.originalPath,n=E(),{subGraphTitleTotalMargin:i}=kt(n);if(r.label){let s=Q.get(r.id),e=r.x,o=r.y;if(a){let c=O.calcLabelPosition(a);b.debug("Moving label "+r.label+" from (",e,",",o,") to (",c.x,",",c.y,") abc88"),t.updatedPath&&(e=c.x,o=c.y)}s.attr("transform",`translate(${e}, ${o+i/2})`)}if(r.startLabelLeft){let s=w.get(r.id).startLeft,e=r.x,o=r.y;if(a){let c=O.calcTerminalLabelPosition(r.arrowTypeStart?10:0,"start_left",a);e=c.x,o=c.y}s.attr("transform",`translate(${e}, ${o})`)}if(r.startLabelRight){let s=w.get(r.id).startRight,e=r.x,o=r.y;if(a){let c=O.calcTerminalLabelPosition(r.arrowTypeStart?10:0,"start_right",a);e=c.x,o=c.y}s.attr("transform",`translate(${e}, ${o})`)}if(r.endLabelLeft){let s=w.get(r.id).endLeft,e=r.x,o=r.y;if(a){let c=O.calcTerminalLabelPosition(r.arrowTypeEnd?10:0,"end_left",a);e=c.x,o=c.y}s.attr("transform",`translate(${e}, ${o})`)}if(r.endLabelRight){let s=w.get(r.id).endRight,e=r.x,o=r.y;if(a){let c=O.calcTerminalLabelPosition(r.arrowTypeEnd?10:0,"end_right",a);e=c.x,o=c.y}s.attr("transform",`translate(${e}, ${o})`)}},"positionEdgeLabel"),Yt=p((r,t)=>{let a=r.x,n=r.y,i=Math.abs(t.x-a),s=Math.abs(t.y-n),e=r.width/2,o=r.height/2;return i>=e||s>=o},"outsideNode"),Bt=p((r,t,a)=>{b.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(t)} + insidePoint : ${JSON.stringify(a)} + node : x:${r.x} y:${r.y} w:${r.width} h:${r.height}`);let n=r.x,i=r.y,s=Math.abs(n-a.x),e=r.width/2,o=a.xMath.abs(n-t.x)*c){let y=a.y{b.warn("abc88 cutPathAtIntersect",r,t);let a=[],n=r[0],i=!1;return r.forEach(s=>{if(b.info("abc88 checking point",s,t),!Yt(t,s)&&!i){let e=Bt(t,n,s);b.debug("abc88 inside",s,n,e),b.debug("abc88 intersection",e,t);let o=!1;a.forEach(c=>{o=o||c.x===e.x&&c.y===e.y}),a.some(c=>c.x===e.x&&c.y===e.y)?b.warn("abc88 no intersect",e,a):a.push(e),i=!0}else b.warn("abc88 outside",s,n),n=s,i||a.push(s)}),b.debug("returning points",a),a},"cutPathAtIntersect");function vt(r){let t=[],a=[];for(let n=1;n5&&Math.abs(s.y-i.y)>5||i.y===s.y&&s.x===e.x&&Math.abs(s.x-i.x)>5&&Math.abs(s.y-e.y)>5)&&(t.push(s),a.push(n))}return{cornerPoints:t,cornerPointPositions:a}}p(vt,"extractCornerPoints");var Mt=p(function(r,t,a){let n=t.x-r.x,i=t.y-r.y,s=Math.sqrt(n*n+i*i),e=a/s;return{x:t.x-e*n,y:t.y-e*i}},"findAdjacentPoint"),Ct=p(function(r){let{cornerPointPositions:t}=vt(r),a=[];for(let n=0;n10&&Math.abs(s.y-i.y)>=10){b.debug("Corner point fixing",Math.abs(s.x-i.x),Math.abs(s.y-i.y));let d=5;e.x===o.x?f={x:l<0?o.x-d+y:o.x+d-y,y:m<0?o.y-y:o.y+y}:f={x:l<0?o.x-y:o.x+y,y:m<0?o.y-d+y:o.y+d-y}}else b.debug("Corner point skipping fixing",Math.abs(s.x-i.x),Math.abs(s.y-i.y));a.push(f,c)}else a.push(r[n]);return a},"fixCorners"),Wt=p((r,t,a)=>{let n=r-t-a,i=2,s=2,e=i+s,o=Math.floor(n/e),c=Array(o).fill(`${i} ${s}`).join(" ");return`0 ${t} ${c} ${a}`},"generateDashArray"),pr=p(function(r,t,a,n,i,s,e,o=!1){let{handDrawnSeed:c}=E(),l=t.points,m=!1,y=i;var f=s;let d=[];for(let v in t.cssCompiledStyles)ut(v)||d.push(t.cssCompiledStyles[v]);b.debug("UIO intersect check",t.points,f.x,y.x),f.intersect&&y.intersect&&!o&&(l=l.slice(1,t.points.length-1),l.unshift(y.intersect(l[0])),b.debug("Last point UIO",t.start,"-->",t.end,l[l.length-1],f,f.intersect(l[l.length-1])),l.push(f.intersect(l[l.length-1])));let u=btoa(JSON.stringify(l));t.toCluster&&(b.info("to cluster abc88",a.get(t.toCluster)),l=Lt(t.points,a.get(t.toCluster).node),m=!0),t.fromCluster&&(b.debug("from cluster abc88",a.get(t.fromCluster),JSON.stringify(l,null,2)),l=Lt(l.reverse(),a.get(t.fromCluster).node).reverse(),m=!0);let h=l.filter(v=>!Number.isNaN(v.y)),k=Xt(t.curve);k!=="rounded"&&(h=Ct(h));let x=N;switch(k){case"linear":x=N;break;case"basis":x=G;break;case"cardinal":x=it;break;case"bumpX":x=st;break;case"bumpY":x=ot;break;case"catmullRom":x=lt;break;case"monotoneX":x=ct;break;case"monotoneY":x=dt;break;case"natural":x=ft;break;case"step":x=pt;break;case"stepAfter":x=mt;break;case"stepBefore":x=ht;break;case"rounded":x=N;break;default:x=G}let{x:L,y:Z}=yt(t),j=nt().x(L).y(Z).curve(x),M;switch(t.thickness){case"normal":M="edge-thickness-normal";break;case"thick":M="edge-thickness-thick";break;case"invisible":M="edge-thickness-invisible";break;default:M="edge-thickness-normal"}switch(t.pattern){case"solid":M+=" edge-pattern-solid";break;case"dotted":M+=" edge-pattern-dotted";break;case"dashed":M+=" edge-pattern-dashed";break;default:M+=" edge-pattern-solid"}let g,H=k==="rounded"?_t($t(h,t),5):j(h),_=Array.isArray(t.style)?t.style:[t.style],R=_.find(v=>v?.startsWith("stroke:")),$="";t.animate&&($="edge-animation-fast"),t.animation&&($="edge-animation-"+t.animation);let rt=!1;if(t.look==="handDrawn"){let v=gt.svg(r);Object.assign([],h);let z=v.path(H,{roughness:.3,seed:c});M+=" transition",g=S(z).select("path").attr("id",t.id).attr("class"," "+M+(t.classes?" "+t.classes:"")+($?" "+$:"")).attr("style",_?_.reduce((U,I)=>U+";"+I,""):"");let q=g.attr("d");g.attr("d",q),r.node().appendChild(g.node())}else{let v=d.join(";"),z=_?_.reduce((P,X)=>P+X+";",""):"",q=(v?v+";"+z+";":z)+";"+(_?_.reduce((P,X)=>P+";"+X,""):"");g=r.append("path").attr("d",H).attr("id",t.id).attr("class"," "+M+(t.classes?" "+t.classes:"")+($?" "+$:"")).attr("style",q),R=q.match(/stroke:([^;]+)/)?.[1],rt=t.animate===!0||!!t.animation||v.includes("animation");let U=g.node(),I=typeof U.getTotalLength=="function"?U.getTotalLength():0,J=K[t.arrowTypeStart]||0,V=K[t.arrowTypeEnd]||0;if(t.look==="neo"&&!rt){let X=`stroke-dasharray: ${t.pattern==="dotted"||t.pattern==="dashed"?Wt(I,J,V):`0 ${J} ${I-J-V} ${V}`}; stroke-dashoffset: 0;`;g.attr("style",X+g.attr("style"))}}g.attr("data-edge",!0),g.attr("data-et","edge"),g.attr("data-id",t.id),g.attr("data-points",u),t.showPoints&&h.forEach(v=>{r.append("circle").style("stroke","red").style("fill","red").attr("r",1).attr("cx",v.x).attr("cy",v.y)});let A="";(E().flowchart.arrowMarkerAbsolute||E().state.arrowMarkerAbsolute)&&(A=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,A=A.replace(/\(/g,"\\(").replace(/\)/g,"\\)")),b.info("arrowTypeStart",t.arrowTypeStart),b.info("arrowTypeEnd",t.arrowTypeEnd),Ot(g,t,A,e,n,R);let St=Math.floor(l.length/2),Et=l[St];O.isLabelCoordinateInPath(Et,g.attr("d"))||(m=!0);let D={};return m&&(D.updatedPath=l),D.originalPath=t.points,D},"insertEdge");function _t(r,t){if(r.length<2)return"";let a="",n=r.length,i=1e-5;for(let s=0;sat({},i));if(r.length>=2&&Y[t.arrowTypeStart]){let i=Y[t.arrowTypeStart],s=r[0],e=r[1],{angle:o}=tt(s,e),c=i*Math.cos(o),l=i*Math.sin(o);a[0].x=s.x+c,a[0].y=s.y+l}let n=r.length;if(n>=2&&Y[t.arrowTypeEnd]){let i=Y[t.arrowTypeEnd],s=r[n-1],e=r[n-2],{angle:o}=tt(e,s),c=i*Math.cos(o),l=i*Math.sin(o);a[n-1].x=s.x-c,a[n-1].y=s.y-l}return a}p($t,"applyMarkerOffsetsToPoints");var Ht=p((r,t,a,n)=>{t.forEach(i=>{Gt[i](r,a,n)})},"insertMarkers"),Rt=p((r,t,a)=>{b.trace("Making markers for ",a),r.append("defs").append("marker").attr("id",a+"_"+t+"-extensionStart").attr("class","marker extension "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),r.append("defs").append("marker").attr("id",a+"_"+t+"-extensionEnd").attr("class","marker extension "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),At=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-compositionStart").attr("class","marker composition "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),r.append("defs").append("marker").attr("id",a+"_"+t+"-compositionEnd").attr("class","marker composition "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),zt=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-aggregationStart").attr("class","marker aggregation "+t).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),r.append("defs").append("marker").attr("id",a+"_"+t+"-aggregationEnd").attr("class","marker aggregation "+t).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),qt=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-dependencyStart").attr("class","marker dependency "+t).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),r.append("defs").append("marker").attr("id",a+"_"+t+"-dependencyEnd").attr("class","marker dependency "+t).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),Ut=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-lollipopStart").attr("class","marker lollipop "+t).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),r.append("defs").append("marker").attr("id",a+"_"+t+"-lollipopEnd").attr("class","marker lollipop "+t).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),It=p((r,t,a)=>{r.append("marker").attr("id",a+"_"+t+"-pointEnd").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),r.append("marker").attr("id",a+"_"+t+"-pointStart").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),Pt=p((r,t,a)=>{r.append("marker").attr("id",a+"_"+t+"-circleEnd").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),r.append("marker").attr("id",a+"_"+t+"-circleStart").attr("class","marker "+t).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),Nt=p((r,t,a)=>{r.append("marker").attr("id",a+"_"+t+"-crossEnd").attr("class","marker cross "+t).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),r.append("marker").attr("id",a+"_"+t+"-crossStart").attr("class","marker cross "+t).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),Qt=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","userSpaceOnUse").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),Zt=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-onlyOneStart").attr("class","marker onlyOne "+t).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M9,0 L9,18 M15,0 L15,18"),r.append("defs").append("marker").attr("id",a+"_"+t+"-onlyOneEnd").attr("class","marker onlyOne "+t).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M3,0 L3,18 M9,0 L9,18")},"only_one"),jt=p((r,t,a)=>{let n=r.append("defs").append("marker").attr("id",a+"_"+t+"-zeroOrOneStart").attr("class","marker zeroOrOne "+t).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("d","M9,0 L9,18");let i=r.append("defs").append("marker").attr("id",a+"_"+t+"-zeroOrOneEnd").attr("class","marker zeroOrOne "+t).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),i.append("path").attr("d","M21,0 L21,18")},"zero_or_one"),Dt=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-oneOrMoreStart").attr("class","marker oneOrMore "+t).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),r.append("defs").append("marker").attr("id",a+"_"+t+"-oneOrMoreEnd").attr("class","marker oneOrMore "+t).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18")},"one_or_more"),Jt=p((r,t,a)=>{let n=r.append("defs").append("marker").attr("id",a+"_"+t+"-zeroOrMoreStart").attr("class","marker zeroOrMore "+t).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18");let i=r.append("defs").append("marker").attr("id",a+"_"+t+"-zeroOrMoreEnd").attr("class","marker zeroOrMore "+t).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),i.append("path").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},"zero_or_more"),Vt=p((r,t,a)=>{r.append("defs").append("marker").attr("id",a+"_"+t+"-requirement_arrowEnd").attr("refX",20).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("path").attr("d",`M0,0 + L20,10 + M20,10 + L0,20`)},"requirement_arrow"),Ft=p((r,t,a)=>{let n=r.append("defs").append("marker").attr("id",a+"_"+t+"-requirement_containsStart").attr("refX",0).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("g");n.append("circle").attr("cx",10).attr("cy",10).attr("r",9).attr("fill","none"),n.append("line").attr("x1",1).attr("x2",19).attr("y1",10).attr("y2",10),n.append("line").attr("y1",1).attr("y2",19).attr("x1",10).attr("x2",10)},"requirement_contains"),Gt={extension:Rt,composition:At,aggregation:zt,dependency:qt,lollipop:Ut,point:It,circle:Pt,cross:Nt,barb:Qt,only_one:Zt,zero_or_one:jt,one_or_more:Dt,zero_or_more:Jt,requirement_arrow:Vt,requirement_contains:Ft},hr=Ht;export{cr as a,dr as b,fr as c,pr as d,hr as e}; diff --git a/src/google/adk/cli/browser/chunk-TNYN2TVW.js b/src/google/adk/cli/browser/chunk-TNYN2TVW.js new file mode 100644 index 0000000000..f79ed23625 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-TNYN2TVW.js @@ -0,0 +1,4 @@ +import{a as W}from"./chunk-JDPVSVO4.js";import{a as S}from"./chunk-XMBKBASC.js";import{a as V,b as q,c as z,d as K,e as Q}from"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import{b as M,d as F,e as U,g as Y,h as H,i as j,j as B}from"./chunk-W7PRDKNL.js";import{a as T}from"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import"./chunk-WXI2IBAH.js";import"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{Y as R}from"./chunk-QFMJV7VH.js";import{g,i}from"./chunk-JRNAXTJ7.js";import{J as C,e as G,v as _}from"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as P,b as A,j as b}from"./chunk-RMXJBC7V.js";function p(e){var t={options:{directed:e.isDirected(),multigraph:e.isMultigraph(),compound:e.isCompound()},nodes:re(e),edges:se(e)};return C(e.graph())||(t.value=G(e.graph())),t}function re(e){return _(e.nodes(),function(t){var n=e.node(t),a=e.parent(t),s={v:t};return C(n)||(s.value=n),C(a)||(s.parent=a),s})}function se(e){return _(e.edges(),function(t){var n=e.edge(t),a={v:t.v,w:t.w};return C(t.name)||(a.name=t.name),C(n)||(a.value=n),a})}var d=new Map,X=new Map,L=new Map,ae=g(()=>{X.clear(),L.clear(),d.clear()},"clear"),O=g((e,t)=>{let n=X.get(t)||[];return i.trace("In isDescendant",t," ",e," = ",n.includes(e)),n.includes(e)},"isDescendant"),ce=g((e,t)=>{let n=X.get(t)||[];return i.info("Descendants of ",t," is ",n),i.info("Edge is ",e),e.v===t||e.w===t?!1:n?n.includes(e.v)||O(e.v,t)||O(e.w,t)||n.includes(e.w):(i.debug("Tilt, ",t,",not in descendants"),!1)},"edgeInCluster"),I=g((e,t,n,a)=>{i.warn("Copying children of ",e,"root",a,"data",t.node(e),a);let s=t.children(e)||[];e!==a&&s.push(e),i.warn("Copying (nodes) clusterId",e,"nodes",s),s.forEach(o=>{if(t.children(o).length>0)I(o,t,n,a);else{let l=t.node(o);i.info("cp ",o," to ",a," with parent ",e),n.setNode(o,l),a!==t.parent(o)&&(i.warn("Setting parent",o,t.parent(o)),n.setParent(o,t.parent(o))),e!==a&&o!==e?(i.debug("Setting parent",o,e),n.setParent(o,e)):(i.info("In copy ",e,"root",a,"data",t.node(e),a),i.debug("Not Setting parent for node=",o,"cluster!==rootId",e!==a,"node!==clusterId",o!==e));let u=t.edges(o);i.debug("Copying Edges",u),u.forEach(c=>{i.info("Edge",c);let m=t.edge(c.v,c.w,c.name);i.info("Edge data",m,a);try{ce(c,a)?(i.info("Copying as ",c.v,c.w,m,c.name),n.setEdge(c.v,c.w,m,c.name),i.info("newGraph edges ",n.edges(),n.edge(n.edges()[0]))):i.info("Skipping copy of edge ",c.v,"-->",c.w," rootId: ",a," clusterId:",e)}catch(h){i.error(h)}})}i.debug("Removing node",o),t.removeNode(o)})},"copy"),ee=g((e,t)=>{let n=t.children(e),a=[...n];for(let s of n)L.set(s,e),a=[...a,...ee(s,t)];return a},"extractDescendants"),de=g((e,t,n)=>{let a=e.edges().filter(c=>c.v===t||c.w===t),s=e.edges().filter(c=>c.v===n||c.w===n),o=a.map(c=>({v:c.v===t?n:c.v,w:c.w===t?t:c.w})),l=s.map(c=>({v:c.v,w:c.w}));return o.filter(c=>l.some(m=>c.v===m.v&&c.w===m.w))},"findCommonEdges"),x=g((e,t,n)=>{let a=t.children(e);if(i.trace("Searching children of id ",e,a),a.length<1)return e;let s;for(let o of a){let l=x(o,t,n),u=de(t,n,l);if(l)if(u.length>0)s=l;else return l}return s},"findNonClusterChild"),$=g(e=>!d.has(e)||!d.get(e).externalConnections?e:d.has(e)?d.get(e).id:e,"getAnchorId"),le=g((e,t)=>{if(!e||t>10){i.debug("Opting out, no graph ");return}else i.debug("Opting in, graph ");e.nodes().forEach(function(n){e.children(n).length>0&&(i.warn("Cluster identified",n," Replacement id in edges: ",x(n,e,n)),X.set(n,ee(n,e)),d.set(n,{id:x(n,e,n),clusterData:e.node(n)}))}),e.nodes().forEach(function(n){let a=e.children(n),s=e.edges();a.length>0?(i.debug("Cluster identified",n,X),s.forEach(o=>{let l=O(o.v,n),u=O(o.w,n);l^u&&(i.warn("Edge: ",o," leaves cluster ",n),i.warn("Descendants of XXX ",n,": ",X.get(n)),d.get(n).externalConnections=!0)})):i.debug("Not a cluster ",n,X)});for(let n of d.keys()){let a=d.get(n).id,s=e.parent(a);s!==n&&d.has(s)&&!d.get(s).externalConnections&&(d.get(n).id=s)}e.edges().forEach(function(n){let a=e.edge(n);i.warn("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(n)),i.warn("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(e.edge(n)));let s=n.v,o=n.w;if(i.warn("Fix XXX",d,"ids:",n.v,n.w,"Translating: ",d.get(n.v)," --- ",d.get(n.w)),d.get(n.v)||d.get(n.w)){if(i.warn("Fixing and trying - removing XXX",n.v,n.w,n.name),s=$(n.v),o=$(n.w),e.removeEdge(n.v,n.w,n.name),s!==n.v){let l=e.parent(s);d.get(l).externalConnections=!0,a.fromCluster=n.v}if(o!==n.w){let l=e.parent(o);d.get(l).externalConnections=!0,a.toCluster=n.w}i.warn("Fix Replacing with XXX",s,o,n.name),e.setEdge(s,o,a,n.name)}}),i.warn("Adjusted Graph",p(e)),ne(e,0),i.trace(d)},"adjustClustersAndEdges"),ne=g((e,t)=>{if(i.warn("extractor - ",t,p(e),e.children("D")),t>10){i.error("Bailing out");return}let n=e.nodes(),a=!1;for(let s of n){let o=e.children(s);a=a||o.length>0}if(!a){i.debug("Done, no node has children",e.nodes());return}i.debug("Nodes = ",n,t);for(let s of n)if(i.debug("Extracting node",s,d,d.has(s)&&!d.get(s).externalConnections,!e.parent(s),e.node(s),e.children("D")," Depth ",t),!d.has(s))i.debug("Not a cluster",s,t);else if(!d.get(s).externalConnections&&e.children(s)&&e.children(s).length>0){i.warn("Cluster without external connections, without a parent and with children",s,t);let l=e.graph().rankdir==="TB"?"LR":"TB";d.get(s)?.clusterData?.dir&&(l=d.get(s).clusterData.dir,i.warn("Fixing dir",d.get(s).clusterData.dir,l));let u=new S({multigraph:!0,compound:!0}).setGraph({rankdir:l,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});i.warn("Old graph before copy",p(e)),I(s,e,u,s),e.setNode(s,{clusterNode:!0,id:s,clusterData:d.get(s).clusterData,label:d.get(s).label,graph:u}),i.warn("New graph after copy node: (",s,")",p(u)),i.debug("Old graph after copy",p(e))}else i.warn("Cluster ** ",s," **not meeting the criteria !externalConnections:",!d.get(s).externalConnections," no parent: ",!e.parent(s)," children ",e.children(s)&&e.children(s).length>0,e.children("D"),t),i.debug(d);n=e.nodes(),i.warn("New list of nodes",n);for(let s of n){let o=e.node(s);i.warn(" Now next level",s,o),o?.clusterNode&&ne(o.graph,t+1)}},"extractor"),te=g((e,t)=>{if(t.length===0)return[];let n=Object.assign([],t);return t.forEach(a=>{let s=e.children(a),o=te(e,s);n=[...n,...o]}),n},"sorter"),fe=g(e=>te(e,e.children()),"sortNodesByHierarchy"),ie=g((e,t,n,a,s,o)=>b(null,null,function*(){i.warn("Graph in recursive render:XAX",p(t),s);let l=t.graph().rankdir;i.trace("Dir in recursive render - dir:",l);let u=e.insert("g").attr("class","root");t.nodes()?i.info("Recursive render XXX",t.nodes()):i.info("No nodes found for",t),t.edges().length>0&&i.info("Recursive edges",t.edge(t.edges()[0]));let c=u.insert("g").attr("class","clusters"),m=u.insert("g").attr("class","edgePaths"),h=u.insert("g").attr("class","edgeLabels"),v=u.insert("g").attr("class","nodes");yield Promise.all(t.nodes().map(function(f){return b(this,null,function*(){let r=t.node(f);if(s!==void 0){let w=JSON.parse(JSON.stringify(s.clusterData));i.trace(`Setting data for parent cluster XXX + Node.id = `,f,` + data=`,w.height,` +Parent cluster`,s.height),t.setNode(s.id,w),t.parent(f)||(i.trace("Setting parent",f,s.id),t.setParent(f,s.id,w))}if(i.info("(Insert) Node XXX"+f+": "+JSON.stringify(t.node(f))),r?.clusterNode){i.info("Cluster identified XBX",f,r.width,t.node(f));let{ranksep:w,nodesep:N}=t.graph();r.graph.setGraph(A(P({},r.graph.graph()),{ranksep:w+25,nodesep:N}));let y=yield ie(v,r.graph,n,a,t.node(f),o),J=y.elem;M(r,J),r.diff=y.diff||0,i.info("New compound node after recursive render XAX",f,"width",r.width,"height",r.height),H(J,r)}else t.children(f).length>0?(i.trace("Cluster - the non recursive path XBX",f,r.id,r,r.width,"Graph:",t),i.trace(x(r.id,t)),d.set(r.id,{id:x(r.id,t),node:r})):(i.trace("Node - the non recursive path XAX",f,v,t.node(f),l),yield Y(v,t.node(f),{config:o,dir:l}))})})),yield g(()=>b(null,null,function*(){let f=t.edges().map(function(r){return b(this,null,function*(){let w=t.edge(r.v,r.w,r.name);i.info("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(r)),i.info("Edge "+r.v+" -> "+r.w+": ",r," ",JSON.stringify(t.edge(r))),i.info("Fix",d,"ids:",r.v,r.w,"Translating: ",d.get(r.v),d.get(r.w)),yield q(h,w)})});yield Promise.all(f)}),"processEdges")(),i.info("Graph before layout:",JSON.stringify(p(t))),i.info("############################################# XXX"),i.info("### Layout ### XXX"),i.info("############################################# XXX"),W(t),i.info("Graph after layout:",JSON.stringify(p(t)));let k=0,{subGraphTitleTotalMargin:D}=T(o);return yield Promise.all(fe(t).map(function(f){return b(this,null,function*(){let r=t.node(f);if(i.info("Position XBX => "+f+": ("+r.x,","+r.y,") width: ",r.width," height: ",r.height),r?.clusterNode)r.y+=D,i.info("A tainted cluster node XBX1",f,r.id,r.width,r.height,r.x,r.y,t.parent(f)),d.get(r.id).node=r,B(r);else if(t.children(f).length>0){i.info("A pure cluster node XBX1",f,r.id,r.x,r.y,r.width,r.height,t.parent(f)),r.height+=D,t.node(r.parentId);let w=r?.padding/2||0,N=r?.labelBBox?.height||0,y=N-w||0;i.debug("OffsetY",y,"labelHeight",N,"halfPadding",w),yield F(c,r),d.get(r.id).node=r}else{let w=t.node(r.parentId);r.y+=D/2,i.info("A regular node XBX1 - using the padding",r.id,"parent",r.parentId,r.width,r.height,r.x,r.y,"offsetY",r.offsetY,"parent",w,w?.offsetY,r),B(r)}})})),t.edges().forEach(function(f){let r=t.edge(f);i.info("Edge "+f.v+" -> "+f.w+": "+JSON.stringify(r),r),r.points.forEach(J=>J.y+=D/2);let w=t.node(f.v);var N=t.node(f.w);let y=K(m,r,d,n,w,N,a);z(r,y)}),t.nodes().forEach(function(f){let r=t.node(f);i.info(f,r.type,r.diff),r.isGroup&&(k=r.diff)}),i.warn("Returning from recursive render XAX",u,k),{elem:u,diff:k}}),"recursiveRender"),Se=g((e,t)=>b(null,null,function*(){let n=new S({multigraph:!0,compound:!0}).setGraph({rankdir:e.direction,nodesep:e.config?.nodeSpacing||e.config?.flowchart?.nodeSpacing||e.nodeSpacing,ranksep:e.config?.rankSpacing||e.config?.flowchart?.rankSpacing||e.rankSpacing,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}}),a=t.select("g");Q(a,e.markers,e.type,e.diagramId),j(),V(),U(),ae(),e.nodes.forEach(o=>{n.setNode(o.id,P({},o)),o.parentId&&n.setParent(o.id,o.parentId)}),i.debug("Edges:",e.edges),e.edges.forEach(o=>{if(o.start===o.end){let l=o.start,u=l+"---"+l+"---1",c=l+"---"+l+"---2",m=n.node(l);n.setNode(u,{domId:u,id:u,parentId:m.parentId,labelStyle:"",label:"",padding:0,shape:"labelRect",style:"",width:10,height:10}),n.setParent(u,m.parentId),n.setNode(c,{domId:c,id:c,parentId:m.parentId,labelStyle:"",padding:0,shape:"labelRect",label:"",style:"",width:10,height:10}),n.setParent(c,m.parentId);let h=structuredClone(o),v=structuredClone(o),E=structuredClone(o);h.label="",h.arrowTypeEnd="none",h.id=l+"-cyclic-special-1",v.arrowTypeStart="none",v.arrowTypeEnd="none",v.id=l+"-cyclic-special-mid",E.label="",m.isGroup&&(h.fromCluster=l,E.toCluster=l),E.id=l+"-cyclic-special-2",E.arrowTypeStart="none",n.setEdge(l,u,h,l+"-cyclic-special-0"),n.setEdge(u,c,v,l+"-cyclic-special-1"),n.setEdge(c,l,E,l+"-cyc{let{securityLevel:c}=s(),o=e("body");if(c==="sandbox"){let m=e(`#i${t}`).node()?.contentDocument??document;o=e(m.body)}return o.select(`#${t}`)},"selectSvgElement");export{a}; diff --git a/src/google/adk/cli/browser/chunk-7P7JIWGK.js b/src/google/adk/cli/browser/chunk-URGIGLGR.js similarity index 89% rename from src/google/adk/cli/browser/chunk-7P7JIWGK.js rename to src/google/adk/cli/browser/chunk-URGIGLGR.js index 816c525ea5..3440b4a67a 100644 --- a/src/google/adk/cli/browser/chunk-7P7JIWGK.js +++ b/src/google/adk/cli/browser/chunk-URGIGLGR.js @@ -1 +1 @@ -import{$a as m,Bb as g,Ca as a,Cb as p,Cc as r,Db as v,Ib as h,Lb as f,Ma as l,Nc as D,Pa as o,Yb as y,Zb as x,eb as d,fc as M,gc as b,hc as C,pd as I,qb as c,sb as u,wc as s}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function H(t,U){if(t&1&&(g(0,"section"),v(1,"img",1),p()),t&2){let e=f(),i=C(0);y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Image),x(e.classes()),o(),h("src",i,l)}}var w=(()=>{class t extends I{url=r.required();usageHint=r.required();resolvedUrl=s(()=>this.resolvePrimitive(this.url()));classes=s(()=>{let e=this.usageHint();return D.merge(this.theme.components.Image.all,e?this.theme.components.Image[e]:{})});static \u0275fac=(()=>{let e;return function(n){return(e||(e=a(t)))(n||t)}})();static \u0275cmp=m({type:t,selectors:[["a2ui-image"]],inputs:{url:[1,"url"],usageHint:[1,"usageHint"]},features:[d],decls:2,vars:2,consts:[[3,"class","style"],[3,"src"]],template:function(i,n){if(i&1&&(M(0),c(1,H,2,5,"section",0)),i&2){let _=b(n.resolvedUrl());o(),u(_?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}img[_ngcontent-%COMP%]{display:block;width:100%;height:100%;box-sizing:border-box}"]})}return t})();export{w as Image}; +import{$a as m,Bb as g,Ca as a,Cb as p,Cc as r,Db as v,Ib as h,Lb as f,Ma as l,Nc as D,Pa as o,Yb as y,Zb as x,eb as d,fc as M,gc as b,hc as C,pd as I,qb as c,sb as u,wc as s}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function H(t,U){if(t&1&&(g(0,"section"),v(1,"img",1),p()),t&2){let e=f(),i=C(0);y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Image),x(e.classes()),o(),h("src",i,l)}}var w=(()=>{class t extends I{url=r.required();usageHint=r.required();resolvedUrl=s(()=>this.resolvePrimitive(this.url()));classes=s(()=>{let e=this.usageHint();return D.merge(this.theme.components.Image.all,e?this.theme.components.Image[e]:{})});static \u0275fac=(()=>{let e;return function(n){return(e||(e=a(t)))(n||t)}})();static \u0275cmp=m({type:t,selectors:[["a2ui-image"]],inputs:{url:[1,"url"],usageHint:[1,"usageHint"]},features:[d],decls:2,vars:2,consts:[[3,"class","style"],[3,"src"]],template:function(i,n){if(i&1&&(M(0),c(1,H,2,5,"section",0)),i&2){let _=b(n.resolvedUrl());o(),u(_?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}img[_ngcontent-%COMP%]{display:block;width:100%;height:100%;box-sizing:border-box}"]})}return t})();export{w as Image}; diff --git a/src/google/adk/cli/browser/chunk-UWBTGTN5.js b/src/google/adk/cli/browser/chunk-UWBTGTN5.js new file mode 100644 index 0000000000..700eef53ac --- /dev/null +++ b/src/google/adk/cli/browser/chunk-UWBTGTN5.js @@ -0,0 +1,24 @@ +import{a as de}from"./chunk-DMWOYWYQ.js";import{a as he}from"./chunk-T3Q3QCCV.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import{a as pe}from"./chunk-ST54LLJ3.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{a as ie}from"./chunk-TPDTRWWV.js";import{c as ce,d as T}from"./chunk-VDPKVNDJ.js";import{l as G}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as O,N as Q,R as Z,S as ee,T as te,U as ae,V as le,W as se,X as re,r as K}from"./chunk-QFMJV7VH.js";import{a as D,g as d,i as H,o as F,p as ne,q as oe,r as R}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as I,j as J}from"./chunk-RMXJBC7V.js";var me=class{constructor(){this.nodes=[],this.levels=new Map,this.outerNodes=[],this.classes=new Map,this.setAccTitle=ee,this.getAccTitle=te,this.setDiagramTitle=se,this.getDiagramTitle=re,this.getAccDescription=le,this.setAccDescription=ae}static{d(this,"TreeMapDB")}getNodes(){return this.nodes}getConfig(){let s=K,a=O();return G(I(I({},s.treemap),a.treemap??{}))}addNode(s,a){this.nodes.push(s),this.levels.set(s,a),a===0&&(this.outerNodes.push(s),this.root??=s)}getRoot(){return{name:"",children:this.outerNodes}}addClass(s,a){let o=this.classes.get(s)??{id:s,styles:[],textStyles:[]},i=a.replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");i&&i.forEach(p=>{ce(p)&&(o?.textStyles?o.textStyles.push(p):o.textStyles=[p]),o?.styles?o.styles.push(p):o.styles=[p]}),this.classes.set(s,o)}getClasses(){return this.classes}getStylesForClass(s){return this.classes.get(s)?.styles??[]}clear(){Z(),this.nodes=[],this.levels=new Map,this.outerNodes=[],this.classes=new Map,this.root=void 0}};function ue(s){if(!s.length)return[];let a=[],o=[];return s.forEach(i=>{let p={name:i.name,children:i.type==="Leaf"?void 0:[]};for(p.classSelector=i?.classSelector,i?.cssCompiledStyles&&(p.cssCompiledStyles=i.cssCompiledStyles),i.type==="Leaf"&&i.value!==void 0&&(p.value=i.value);o.length>0&&o[o.length-1].level>=i.level;)o.pop();if(o.length===0)a.push(p);else{let n=o[o.length-1].node;n.children?n.children.push(p):n.children=[p]}i.type!=="Leaf"&&o.push({node:p,level:i.level})}),a}d(ue,"buildHierarchy");var we=d((s,a)=>{de(s,a);let o=[];for(let n of s.TreemapRows??[])n.$type==="ClassDefStatement"&&a.addClass(n.className??"",n.styleText??"");for(let n of s.TreemapRows??[]){let h=n.item;if(!h)continue;let u=n.indent?parseInt(n.indent):0,V=Te(h),l=h.classSelector?a.getStylesForClass(h.classSelector):[],N=l.length>0?l:void 0,v={level:u,name:V,type:h.$type,value:h.value,classSelector:h.classSelector,cssCompiledStyles:N};o.push(v)}let i=ue(o),p=d((n,h)=>{for(let u of n)a.addNode(u,h),u.children&&u.children.length>0&&p(u.children,h+1)},"addNodesRecursively");p(i,0)},"populate"),Te=d(s=>s.name?String(s.name):"","getItemName"),fe={parser:{yy:void 0},parse:d(s=>J(null,null,function*(){try{let o=yield he("treemap",s);H.debug("Treemap AST:",o);let i=fe.parser?.yy;if(!(i instanceof me))throw new Error("parser.parser?.yy was not a TreemapDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");we(o,i)}catch(a){throw H.error("Error parsing treemap:",a),a}}),"parse")},Le=10,z=10,M=25,$e=d((s,a,o,i)=>{let p=i.db,n=p.getConfig(),h=n.padding??Le,u=p.getDiagramTitle(),V=p.getRoot(),{themeVariables:l}=O();if(!V)return;let N=u?30:0,v=ie(a),X=n.nodeWidth?n.nodeWidth*z:960,Y=n.nodeHeight?n.nodeHeight*z:500,B=X,j=Y+N;v.attr("viewBox",`0 0 ${B} ${j}`),Q(v,j,B,n.useMaxWidth);let C;try{let e=n.valueFormat||",";if(e==="$0,0")C=d(t=>"$"+F(",")(t),"valueFormat");else if(e.startsWith("$")&&e.includes(",")){let t=/\.\d+/.exec(e),r=t?t[0]:"";C=d(m=>"$"+F(","+r)(m),"valueFormat")}else if(e.startsWith("$")){let t=e.substring(1);C=d(r=>"$"+F(t||"")(r),"valueFormat")}else C=F(e)}catch(e){H.error("Error creating format function:",e),C=F(",")}let A=R().range(["transparent",l.cScale0,l.cScale1,l.cScale2,l.cScale3,l.cScale4,l.cScale5,l.cScale6,l.cScale7,l.cScale8,l.cScale9,l.cScale10,l.cScale11]),ye=R().range(["transparent",l.cScalePeer0,l.cScalePeer1,l.cScalePeer2,l.cScalePeer3,l.cScalePeer4,l.cScalePeer5,l.cScalePeer6,l.cScalePeer7,l.cScalePeer8,l.cScalePeer9,l.cScalePeer10,l.cScalePeer11]),W=R().range([l.cScaleLabel0,l.cScaleLabel1,l.cScaleLabel2,l.cScaleLabel3,l.cScaleLabel4,l.cScaleLabel5,l.cScaleLabel6,l.cScaleLabel7,l.cScaleLabel8,l.cScaleLabel9,l.cScaleLabel10,l.cScaleLabel11]);u&&v.append("text").attr("x",B/2).attr("y",N/2).attr("class","treemapTitle").attr("text-anchor","middle").attr("dominant-baseline","middle").text(u);let U=v.append("g").attr("transform",`translate(0, ${N})`).attr("class","treemapContainer"),ge=ne(V).sum(e=>e.value??0).sort((e,t)=>(t.value??0)-(e.value??0)),q=oe().size([X,Y]).paddingTop(e=>e.children&&e.children.length>0?M+z:0).paddingInner(h).paddingLeft(e=>e.children&&e.children.length>0?z:0).paddingRight(e=>e.children&&e.children.length>0?z:0).paddingBottom(e=>e.children&&e.children.length>0?z:0).round(!0)(ge),Se=q.descendants().filter(e=>e.children&&e.children.length>0),k=U.selectAll(".treemapSection").data(Se).enter().append("g").attr("class","treemapSection").attr("transform",e=>`translate(${e.x0},${e.y0})`);k.append("rect").attr("width",e=>e.x1-e.x0).attr("height",M).attr("class","treemapSectionHeader").attr("fill","none").attr("fill-opacity",.6).attr("stroke-width",.6).attr("style",e=>e.depth===0?"display: none;":""),k.append("clipPath").attr("id",(e,t)=>`clip-section-${a}-${t}`).append("rect").attr("width",e=>Math.max(0,e.x1-e.x0-12)).attr("height",M),k.append("rect").attr("width",e=>e.x1-e.x0).attr("height",e=>e.y1-e.y0).attr("class",(e,t)=>`treemapSection section${t}`).attr("fill",e=>A(e.data.name)).attr("fill-opacity",.6).attr("stroke",e=>ye(e.data.name)).attr("stroke-width",2).attr("stroke-opacity",.4).attr("style",e=>{if(e.depth===0)return"display: none;";let t=T({cssCompiledStyles:e.data.cssCompiledStyles});return t.nodeStyles+";"+t.borderStyles.join(";")}),k.append("text").attr("class","treemapSectionLabel").attr("x",6).attr("y",M/2).attr("dominant-baseline","middle").text(e=>e.depth===0?"":e.data.name).attr("font-weight","bold").attr("style",e=>{if(e.depth===0)return"display: none;";let t="dominant-baseline: middle; font-size: 12px; fill:"+W(e.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;",r=T({cssCompiledStyles:e.data.cssCompiledStyles});return t+r.labelStyles.replace("color:","fill:")}).each(function(e){if(e.depth===0)return;let t=D(this),r=e.data.name;t.text(r);let m=e.x1-e.x0,g=6,S;n.showValues!==!1&&e.value?S=m-10-30-10-g:S=m-g-6;let f=Math.max(15,S),c=t.node();if(c.getComputedTextLength()>f){let y=r;for(;y.length>0;){if(y=r.substring(0,y.length-1),y.length===0){t.text("..."),c.getComputedTextLength()>f&&t.text("");break}if(t.text(y+"..."),c.getComputedTextLength()<=f)break}}}),n.showValues!==!1&&k.append("text").attr("class","treemapSectionValue").attr("x",e=>e.x1-e.x0-10).attr("y",M/2).attr("text-anchor","end").attr("dominant-baseline","middle").text(e=>e.value?C(e.value):"").attr("font-style","italic").attr("style",e=>{if(e.depth===0)return"display: none;";let t="text-anchor: end; dominant-baseline: middle; font-size: 10px; fill:"+W(e.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;",r=T({cssCompiledStyles:e.data.cssCompiledStyles});return t+r.labelStyles.replace("color:","fill:")});let xe=q.leaves(),E=U.selectAll(".treemapLeafGroup").data(xe).enter().append("g").attr("class",(e,t)=>`treemapNode treemapLeafGroup leaf${t}${e.data.classSelector?` ${e.data.classSelector}`:""}x`).attr("transform",e=>`translate(${e.x0},${e.y0})`);E.append("rect").attr("width",e=>e.x1-e.x0).attr("height",e=>e.y1-e.y0).attr("class","treemapLeaf").attr("fill",e=>e.parent?A(e.parent.data.name):A(e.data.name)).attr("style",e=>T({cssCompiledStyles:e.data.cssCompiledStyles}).nodeStyles).attr("fill-opacity",.3).attr("stroke",e=>e.parent?A(e.parent.data.name):A(e.data.name)).attr("stroke-width",3),E.append("clipPath").attr("id",(e,t)=>`clip-${a}-${t}`).append("rect").attr("width",e=>Math.max(0,e.x1-e.x0-4)).attr("height",e=>Math.max(0,e.y1-e.y0-4)),E.append("text").attr("class","treemapLabel").attr("x",e=>(e.x1-e.x0)/2).attr("y",e=>(e.y1-e.y0)/2).attr("style",e=>{let t="text-anchor: middle; dominant-baseline: middle; font-size: 38px;fill:"+W(e.data.name)+";",r=T({cssCompiledStyles:e.data.cssCompiledStyles});return t+r.labelStyles.replace("color:","fill:")}).attr("clip-path",(e,t)=>`url(#clip-${a}-${t})`).text(e=>e.data.name).each(function(e){let t=D(this),r=e.x1-e.x0,m=e.y1-e.y0,g=t.node(),S=4,L=r-2*S,f=m-2*S;if(L<10||f<10){t.style("display","none");return}let c=parseInt(t.style("font-size"),10),w=8,x=28,y=.6,b=6,P=2;for(;g.getComputedTextLength()>L&&c>w;)c--,t.style("font-size",`${c}px`);let $=Math.max(b,Math.min(x,Math.round(c*y))),_=c+P+$;for(;_>f&&c>w&&(c--,$=Math.max(b,Math.min(x,Math.round(c*y))),!($f;t.style("font-size",`${c}px`),(g.getComputedTextLength()>L||c(t.x1-t.x0)/2).attr("y",function(t){return(t.y1-t.y0)/2}).attr("style",t=>{let r="text-anchor: middle; dominant-baseline: hanging; font-size: 28px;fill:"+W(t.data.name)+";",m=T({cssCompiledStyles:t.data.cssCompiledStyles});return r+m.labelStyles.replace("color:","fill:")}).attr("clip-path",(t,r)=>`url(#clip-${a}-${r})`).text(t=>t.value?C(t.value):"").each(function(t){let r=D(this),m=this.parentNode;if(!m){r.style("display","none");return}let g=D(m).select(".treemapLabel");if(g.empty()||g.style("display")==="none"){r.style("display","none");return}let S=parseFloat(g.style("font-size")),L=28,f=.6,c=6,w=2,x=Math.max(c,Math.min(L,Math.round(S*f)));r.style("font-size",`${x}px`);let b=(t.y1-t.y0)/2+S/2+w;r.attr("y",b);let P=t.x1-t.x0,ve=t.y1-t.y0-4,Ce=P-8;r.node().getComputedTextLength()>Ce||b+x>ve||x{let a=G(Ne,s);return` + .treemapNode.section { + stroke: ${a.sectionStrokeColor}; + stroke-width: ${a.sectionStrokeWidth}; + fill: ${a.sectionFillColor}; + } + .treemapNode.leaf { + stroke: ${a.leafStrokeColor}; + stroke-width: ${a.leafStrokeWidth}; + fill: ${a.leafFillColor}; + } + .treemapLabel { + fill: ${a.labelColor}; + font-size: ${a.labelFontSize}; + } + .treemapValue { + fill: ${a.valueColor}; + font-size: ${a.valueFontSize}; + } + .treemapTitle { + fill: ${a.titleColor}; + font-size: ${a.titleFontSize}; + } + `},"getStyles"),ke=Ae,Oe={parser:fe,get db(){return new me},renderer:ze,styles:ke};export{Oe as diagram}; diff --git a/src/google/adk/cli/browser/chunk-V2DCVTQX.js b/src/google/adk/cli/browser/chunk-V2DCVTQX.js new file mode 100644 index 0000000000..0b2c747212 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-V2DCVTQX.js @@ -0,0 +1,7 @@ +import{G as re,N as se,R as oe,S as le,T as he,U as ce,V as de,W as ue,X as Dt,Y as qt,p as ne,r as L}from"./chunk-QFMJV7VH.js";import{a as mt,g as s,i as dt,t as zt}from"./chunk-JRNAXTJ7.js";import{a as Q}from"./chunk-RMXJBC7V.js";var Vt=(function(){var t=s(function(Y,r,l,u){for(l=l||{},u=Y.length;u--;l[Y[u]]=r);return l},"o"),a=[1,3],p=[1,4],f=[1,5],o=[1,6],x=[1,7],_=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],h=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],c=[55,56,57],k=[2,36],m=[1,37],q=[1,36],y=[1,38],b=[1,35],T=[1,43],g=[1,41],ot=[1,14],ut=[1,23],xt=[1,18],ft=[1,19],gt=[1,20],lt=[1,21],_t=[1,22],ht=[1,24],i=[1,25],wt=[1,26],Bt=[1,27],Rt=[1,28],Nt=[1,29],W=[1,32],U=[1,33],A=[1,34],F=[1,39],P=[1,40],v=[1,42],C=[1,44],H=[1,62],X=[1,61],E=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],Wt=[1,65],Ut=[1,66],Qt=[1,67],Ot=[1,68],Ht=[1,69],Xt=[1,70],Mt=[1,71],Yt=[1,72],jt=[1,73],Gt=[1,74],Kt=[1,75],Zt=[1,76],w=[4,5,6,7,8,9,10,11,12,13,14,15,18],K=[1,90],Z=[1,91],J=[1,92],$=[1,99],tt=[1,93],et=[1,96],it=[1,94],at=[1,95],nt=[1,97],rt=[1,98],At=[1,102],Jt=[10,55,56,57],R=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],Ft={trace:s(function(){},"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:s(function(r,l,u,d,S,e,ct){var n=e.length-1;switch(S){case 23:this.$=e[n];break;case 24:this.$=e[n-1]+""+e[n];break;case 26:this.$=e[n-1]+e[n];break;case 27:this.$=[e[n].trim()];break;case 28:e[n-2].push(e[n].trim()),this.$=e[n-2];break;case 29:this.$=e[n-4],d.addClass(e[n-2],e[n]);break;case 37:this.$=[];break;case 42:this.$=e[n].trim(),d.setDiagramTitle(this.$);break;case 43:this.$=e[n].trim(),d.setAccTitle(this.$);break;case 44:case 45:this.$=e[n].trim(),d.setAccDescription(this.$);break;case 46:d.addSection(e[n].substr(8)),this.$=e[n].substr(8);break;case 47:d.addPoint(e[n-3],"",e[n-1],e[n],[]);break;case 48:d.addPoint(e[n-4],e[n-3],e[n-1],e[n],[]);break;case 49:d.addPoint(e[n-4],"",e[n-2],e[n-1],e[n]);break;case 50:d.addPoint(e[n-5],e[n-4],e[n-2],e[n-1],e[n]);break;case 51:d.setXAxisLeftText(e[n-2]),d.setXAxisRightText(e[n]);break;case 52:e[n-1].text+=" \u27F6 ",d.setXAxisLeftText(e[n-1]);break;case 53:d.setXAxisLeftText(e[n]);break;case 54:d.setYAxisBottomText(e[n-2]),d.setYAxisTopText(e[n]);break;case 55:e[n-1].text+=" \u27F6 ",d.setYAxisBottomText(e[n-1]);break;case 56:d.setYAxisBottomText(e[n]);break;case 57:d.setQuadrant1Text(e[n]);break;case 58:d.setQuadrant2Text(e[n]);break;case 59:d.setQuadrant3Text(e[n]);break;case 60:d.setQuadrant4Text(e[n]);break;case 64:this.$={text:e[n],type:"text"};break;case 65:this.$={text:e[n-1].text+""+e[n],type:e[n-1].type};break;case 66:this.$={text:e[n],type:"text"};break;case 67:this.$={text:e[n],type:"markdown"};break;case 68:this.$=e[n];break;case 69:this.$=e[n-1]+""+e[n];break}},"anonymous"),table:[{18:a,26:1,27:2,28:p,55:f,56:o,57:x},{1:[3]},{18:a,26:8,27:2,28:p,55:f,56:o,57:x},{18:a,26:9,27:2,28:p,55:f,56:o,57:x},t(_,[2,33],{29:10}),t(h,[2,61]),t(h,[2,62]),t(h,[2,63]),{1:[2,30]},{1:[2,31]},t(c,k,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:m,5:q,10:y,12:b,13:T,14:g,18:ot,25:ut,35:xt,37:ft,39:gt,41:lt,42:_t,48:ht,50:i,51:wt,52:Bt,53:Rt,54:Nt,60:W,61:U,63:A,64:F,65:P,66:v,67:C}),t(_,[2,34]),{27:45,55:f,56:o,57:x},t(c,[2,37]),t(c,k,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:m,5:q,10:y,12:b,13:T,14:g,18:ot,25:ut,35:xt,37:ft,39:gt,41:lt,42:_t,48:ht,50:i,51:wt,52:Bt,53:Rt,54:Nt,60:W,61:U,63:A,64:F,65:P,66:v,67:C}),t(c,[2,39]),t(c,[2,40]),t(c,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(c,[2,45]),t(c,[2,46]),{18:[1,50]},{4:m,5:q,10:y,12:b,13:T,14:g,43:51,58:31,60:W,61:U,63:A,64:F,65:P,66:v,67:C},{4:m,5:q,10:y,12:b,13:T,14:g,43:52,58:31,60:W,61:U,63:A,64:F,65:P,66:v,67:C},{4:m,5:q,10:y,12:b,13:T,14:g,43:53,58:31,60:W,61:U,63:A,64:F,65:P,66:v,67:C},{4:m,5:q,10:y,12:b,13:T,14:g,43:54,58:31,60:W,61:U,63:A,64:F,65:P,66:v,67:C},{4:m,5:q,10:y,12:b,13:T,14:g,43:55,58:31,60:W,61:U,63:A,64:F,65:P,66:v,67:C},{4:m,5:q,10:y,12:b,13:T,14:g,43:56,58:31,60:W,61:U,63:A,64:F,65:P,66:v,67:C},{4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,44:[1,57],47:[1,58],58:60,59:59,63:A,64:F,65:P,66:v,67:C},t(E,[2,64]),t(E,[2,66]),t(E,[2,67]),t(E,[2,70]),t(E,[2,71]),t(E,[2,72]),t(E,[2,73]),t(E,[2,74]),t(E,[2,75]),t(E,[2,76]),t(E,[2,77]),t(E,[2,78]),t(E,[2,79]),t(E,[2,80]),t(_,[2,35]),t(c,[2,38]),t(c,[2,42]),t(c,[2,43]),t(c,[2,44]),{3:64,4:Wt,5:Ut,6:Qt,7:Ot,8:Ht,9:Xt,10:Mt,11:Yt,12:jt,13:Gt,14:Kt,15:Zt,21:63},t(c,[2,53],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,49:[1,77],63:A,64:F,65:P,66:v,67:C}),t(c,[2,56],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,49:[1,78],63:A,64:F,65:P,66:v,67:C}),t(c,[2,57],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,63:A,64:F,65:P,66:v,67:C}),t(c,[2,58],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,63:A,64:F,65:P,66:v,67:C}),t(c,[2,59],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,63:A,64:F,65:P,66:v,67:C}),t(c,[2,60],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,63:A,64:F,65:P,66:v,67:C}),{45:[1,79]},{44:[1,80]},t(E,[2,65]),t(E,[2,81]),t(E,[2,82]),t(E,[2,83]),{3:82,4:Wt,5:Ut,6:Qt,7:Ot,8:Ht,9:Xt,10:Mt,11:Yt,12:jt,13:Gt,14:Kt,15:Zt,18:[1,81]},t(w,[2,23]),t(w,[2,1]),t(w,[2,2]),t(w,[2,3]),t(w,[2,4]),t(w,[2,5]),t(w,[2,6]),t(w,[2,7]),t(w,[2,8]),t(w,[2,9]),t(w,[2,10]),t(w,[2,11]),t(w,[2,12]),t(c,[2,52],{58:31,43:83,4:m,5:q,10:y,12:b,13:T,14:g,60:W,61:U,63:A,64:F,65:P,66:v,67:C}),t(c,[2,55],{58:31,43:84,4:m,5:q,10:y,12:b,13:T,14:g,60:W,61:U,63:A,64:F,65:P,66:v,67:C}),{46:[1,85]},{45:[1,86]},{4:K,5:Z,6:J,8:$,11:tt,13:et,16:89,17:it,18:at,19:nt,20:rt,22:88,23:87},t(w,[2,24]),t(c,[2,51],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,63:A,64:F,65:P,66:v,67:C}),t(c,[2,54],{59:59,58:60,4:m,5:q,8:H,10:y,12:b,13:T,14:g,18:X,63:A,64:F,65:P,66:v,67:C}),t(c,[2,47],{22:88,16:89,23:100,4:K,5:Z,6:J,8:$,11:tt,13:et,17:it,18:at,19:nt,20:rt}),{46:[1,101]},t(c,[2,29],{10:At}),t(Jt,[2,27],{16:103,4:K,5:Z,6:J,8:$,11:tt,13:et,17:it,18:at,19:nt,20:rt}),t(R,[2,25]),t(R,[2,13]),t(R,[2,14]),t(R,[2,15]),t(R,[2,16]),t(R,[2,17]),t(R,[2,18]),t(R,[2,19]),t(R,[2,20]),t(R,[2,21]),t(R,[2,22]),t(c,[2,49],{10:At}),t(c,[2,48],{22:88,16:89,23:104,4:K,5:Z,6:J,8:$,11:tt,13:et,17:it,18:at,19:nt,20:rt}),{4:K,5:Z,6:J,8:$,11:tt,13:et,16:89,17:it,18:at,19:nt,20:rt,22:105},t(R,[2,26]),t(c,[2,50],{10:At}),t(Jt,[2,28],{16:103,4:K,5:Z,6:J,8:$,11:tt,13:et,17:it,18:at,19:nt,20:rt})],defaultActions:{8:[2,30],9:[2,31]},parseError:s(function(r,l){if(l.recoverable)this.trace(r);else{var u=new Error(r);throw u.hash=l,u}},"parseError"),parse:s(function(r){var l=this,u=[0],d=[],S=[null],e=[],ct=this.table,n="",yt=0,$t=0,te=0,Ce=2,ee=1,Le=e.slice.call(arguments,1),D=Object.create(this.lexer),j={yy:{}};for(var Pt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Pt)&&(j.yy[Pt]=this.yy[Pt]);D.setInput(r,j.yy),j.yy.lexer=D,j.yy.parser=this,typeof D.yylloc>"u"&&(D.yylloc={});var vt=D.yylloc;e.push(vt);var Ee=D.options&&D.options.ranges;typeof j.yy.parseError=="function"?this.parseError=j.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function De(B){u.length=u.length-2*B,S.length=S.length-B,e.length=e.length-B}s(De,"popStack");function ie(){var B;return B=d.pop()||D.lex()||ee,typeof B!="number"&&(B instanceof Array&&(d=B,B=d.pop()),B=l.symbols_[B]||B),B}s(ie,"lex");for(var V,Ct,G,N,We,Lt,st={},bt,M,ae,Tt;;){if(G=u[u.length-1],this.defaultActions[G]?N=this.defaultActions[G]:((V===null||typeof V>"u")&&(V=ie()),N=ct[G]&&ct[G][V]),typeof N>"u"||!N.length||!N[0]){var Et="";Tt=[];for(bt in ct[G])this.terminals_[bt]&&bt>Ce&&Tt.push("'"+this.terminals_[bt]+"'");D.showPosition?Et="Parse error on line "+(yt+1)+`: +`+D.showPosition()+` +Expecting `+Tt.join(", ")+", got '"+(this.terminals_[V]||V)+"'":Et="Parse error on line "+(yt+1)+": Unexpected "+(V==ee?"end of input":"'"+(this.terminals_[V]||V)+"'"),this.parseError(Et,{text:D.match,token:this.terminals_[V]||V,line:D.yylineno,loc:vt,expected:Tt})}if(N[0]instanceof Array&&N.length>1)throw new Error("Parse Error: multiple actions possible at state: "+G+", token: "+V);switch(N[0]){case 1:u.push(V),S.push(D.yytext),e.push(D.yylloc),u.push(N[1]),V=null,Ct?(V=Ct,Ct=null):($t=D.yyleng,n=D.yytext,yt=D.yylineno,vt=D.yylloc,te>0&&te--);break;case 2:if(M=this.productions_[N[1]][1],st.$=S[S.length-M],st._$={first_line:e[e.length-(M||1)].first_line,last_line:e[e.length-1].last_line,first_column:e[e.length-(M||1)].first_column,last_column:e[e.length-1].last_column},Ee&&(st._$.range=[e[e.length-(M||1)].range[0],e[e.length-1].range[1]]),Lt=this.performAction.apply(st,[n,$t,yt,j.yy,N[1],S,e].concat(Le)),typeof Lt<"u")return Lt;M&&(u=u.slice(0,-1*M*2),S=S.slice(0,-1*M),e=e.slice(0,-1*M)),u.push(this.productions_[N[1]][0]),S.push(st.$),e.push(st._$),ae=ct[u[u.length-2]][u[u.length-1]],u.push(ae);break;case 3:return!0}}return!0},"parse")},ve=(function(){var Y={EOF:1,parseError:s(function(l,u){if(this.yy.parser)this.yy.parser.parseError(l,u);else throw new Error(l)},"parseError"),setInput:s(function(r,l){return this.yy=l||this.yy||{},this._input=r,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:s(function(){var r=this._input[0];this.yytext+=r,this.yyleng++,this.offset++,this.match+=r,this.matched+=r;var l=r.match(/(?:\r\n?|\n).*/g);return l?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),r},"input"),unput:s(function(r){var l=r.length,u=r.split(/(?:\r\n?|\n)/g);this._input=r+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-l),this.offset-=l;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),u.length-1&&(this.yylineno-=u.length-1);var S=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:u?(u.length===d.length?this.yylloc.first_column:0)+d[d.length-u.length].length-u[0].length:this.yylloc.first_column-l},this.options.ranges&&(this.yylloc.range=[S[0],S[0]+this.yyleng-l]),this.yyleng=this.yytext.length,this},"unput"),more:s(function(){return this._more=!0,this},"more"),reject:s(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:s(function(r){this.unput(this.match.slice(r))},"less"),pastInput:s(function(){var r=this.matched.substr(0,this.matched.length-this.match.length);return(r.length>20?"...":"")+r.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:s(function(){var r=this.match;return r.length<20&&(r+=this._input.substr(0,20-r.length)),(r.substr(0,20)+(r.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:s(function(){var r=this.pastInput(),l=new Array(r.length+1).join("-");return r+this.upcomingInput()+` +`+l+"^"},"showPosition"),test_match:s(function(r,l){var u,d,S;if(this.options.backtrack_lexer&&(S={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(S.yylloc.range=this.yylloc.range.slice(0))),d=r[0].match(/(?:\r\n?|\n).*/g),d&&(this.yylineno+=d.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:d?d[d.length-1].length-d[d.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+r[0].length},this.yytext+=r[0],this.match+=r[0],this.matches=r,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(r[0].length),this.matched+=r[0],u=this.performAction.call(this,this.yy,this,l,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),u)return u;if(this._backtrack){for(var e in S)this[e]=S[e];return!1}return!1},"test_match"),next:s(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var r,l,u,d;this._more||(this.yytext="",this.match="");for(var S=this._currentRules(),e=0;el[0].length)){if(l=u,d=e,this.options.backtrack_lexer){if(r=this.test_match(u,S[e]),r!==!1)return r;if(this._backtrack){l=!1;continue}else return!1}else if(!this.options.flex)break}return l?(r=this.test_match(l,S[d]),r!==!1?r:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:s(function(){var l=this.next();return l||this.lex()},"lex"),begin:s(function(l){this.conditionStack.push(l)},"begin"),popState:s(function(){var l=this.conditionStack.length-1;return l>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:s(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:s(function(l){return l=this.conditionStack.length-1-Math.abs(l||0),l>=0?this.conditionStack[l]:"INITIAL"},"topState"),pushState:s(function(l){this.begin(l)},"pushState"),stateStackSize:s(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:s(function(l,u,d,S){var e=S;switch(d){case 0:break;case 1:break;case 2:return 55;case 3:break;case 4:return this.begin("title"),35;break;case 5:return this.popState(),"title_value";break;case 6:return this.begin("acc_title"),37;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),39;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 23:this.popState();break;case 24:this.begin("string");break;case 25:this.popState();break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;break;case 29:return this.begin("point_start"),44;break;case 30:return this.begin("point_x"),45;break;case 31:this.popState();break;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;break;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:return 65;case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\b)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::::)/i,/^(?:^\w+)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{class_name:{rules:[28],inclusive:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}};return Y})();Ft.lexer=ve;function pt(){this.yy={}}return s(pt,"Parser"),pt.prototype=Ft,Ft.Parser=pt,new pt})();Vt.parser=Vt;var ze=Vt,I=ne(),Ve=class{constructor(){this.classes=new Map,this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}static{s(this,"QuadrantBuilder")}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:L.quadrantChart?.chartWidth||500,chartWidth:L.quadrantChart?.chartHeight||500,titlePadding:L.quadrantChart?.titlePadding||10,titleFontSize:L.quadrantChart?.titleFontSize||20,quadrantPadding:L.quadrantChart?.quadrantPadding||5,xAxisLabelPadding:L.quadrantChart?.xAxisLabelPadding||5,yAxisLabelPadding:L.quadrantChart?.yAxisLabelPadding||5,xAxisLabelFontSize:L.quadrantChart?.xAxisLabelFontSize||16,yAxisLabelFontSize:L.quadrantChart?.yAxisLabelFontSize||16,quadrantLabelFontSize:L.quadrantChart?.quadrantLabelFontSize||16,quadrantTextTopPadding:L.quadrantChart?.quadrantTextTopPadding||5,pointTextPadding:L.quadrantChart?.pointTextPadding||5,pointLabelFontSize:L.quadrantChart?.pointLabelFontSize||12,pointRadius:L.quadrantChart?.pointRadius||5,xAxisPosition:L.quadrantChart?.xAxisPosition||"top",yAxisPosition:L.quadrantChart?.yAxisPosition||"left",quadrantInternalBorderStrokeWidth:L.quadrantChart?.quadrantInternalBorderStrokeWidth||1,quadrantExternalBorderStrokeWidth:L.quadrantChart?.quadrantExternalBorderStrokeWidth||2}}getDefaultThemeConfig(){return{quadrant1Fill:I.quadrant1Fill,quadrant2Fill:I.quadrant2Fill,quadrant3Fill:I.quadrant3Fill,quadrant4Fill:I.quadrant4Fill,quadrant1TextFill:I.quadrant1TextFill,quadrant2TextFill:I.quadrant2TextFill,quadrant3TextFill:I.quadrant3TextFill,quadrant4TextFill:I.quadrant4TextFill,quadrantPointFill:I.quadrantPointFill,quadrantPointTextFill:I.quadrantPointTextFill,quadrantXAxisTextFill:I.quadrantXAxisTextFill,quadrantYAxisTextFill:I.quadrantYAxisTextFill,quadrantTitleFill:I.quadrantTitleFill,quadrantInternalBorderStrokeFill:I.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:I.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,dt.info("clear called")}setData(t){this.data=Q(Q({},this.data),t)}addPoints(t){this.data.points=[...t,...this.data.points]}addClass(t,a){this.classes.set(t,a)}setConfig(t){dt.trace("setConfig called with: ",t),this.config=Q(Q({},this.config),t)}setThemeConfig(t){dt.trace("setThemeConfig called with: ",t),this.themeConfig=Q(Q({},this.themeConfig),t)}calculateSpace(t,a,p,f){let o=this.config.xAxisLabelPadding*2+this.config.xAxisLabelFontSize,x={top:t==="top"&&a?o:0,bottom:t==="bottom"&&a?o:0},_=this.config.yAxisLabelPadding*2+this.config.yAxisLabelFontSize,h={left:this.config.yAxisPosition==="left"&&p?_:0,right:this.config.yAxisPosition==="right"&&p?_:0},c=this.config.titleFontSize+this.config.titlePadding*2,k={top:f?c:0},m=this.config.quadrantPadding+h.left,q=this.config.quadrantPadding+x.top+k.top,y=this.config.chartWidth-this.config.quadrantPadding*2-h.left-h.right,b=this.config.chartHeight-this.config.quadrantPadding*2-x.top-x.bottom-k.top,T=y/2,g=b/2;return{xAxisSpace:x,yAxisSpace:h,titleSpace:k,quadrantSpace:{quadrantLeft:m,quadrantTop:q,quadrantWidth:y,quadrantHalfWidth:T,quadrantHeight:b,quadrantHalfHeight:g}}}getAxisLabels(t,a,p,f){let{quadrantSpace:o,titleSpace:x}=f,{quadrantHalfHeight:_,quadrantHeight:h,quadrantLeft:c,quadrantHalfWidth:k,quadrantTop:m,quadrantWidth:q}=o,y=!!this.data.xAxisRightText,b=!!this.data.yAxisTopText,T=[];return this.data.xAxisLeftText&&a&&T.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:c+(y?k/2:0),y:t==="top"?this.config.xAxisLabelPadding+x.top:this.config.xAxisLabelPadding+m+h+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:y?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&a&&T.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:c+k+(y?k/2:0),y:t==="top"?this.config.xAxisLabelPadding+x.top:this.config.xAxisLabelPadding+m+h+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:y?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&p&&T.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+c+q+this.config.quadrantPadding,y:m+h-(b?_/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:b?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&p&&T.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+c+q+this.config.quadrantPadding,y:m+_-(b?_/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:b?"center":"left",horizontalPos:"top",rotation:-90}),T}getQuadrants(t){let{quadrantSpace:a}=t,{quadrantHalfHeight:p,quadrantLeft:f,quadrantHalfWidth:o,quadrantTop:x}=a,_=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:f+o,y:x,width:o,height:p,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:f,y:x,width:o,height:p,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:f,y:x+p,width:o,height:p,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:f+o,y:x+p,width:o,height:p,fill:this.themeConfig.quadrant4Fill}];for(let h of _)h.text.x=h.x+h.width/2,this.data.points.length===0?(h.text.y=h.y+h.height/2,h.text.horizontalPos="middle"):(h.text.y=h.y+this.config.quadrantTextTopPadding,h.text.horizontalPos="top");return _}getQuadrantPoints(t){let{quadrantSpace:a}=t,{quadrantHeight:p,quadrantLeft:f,quadrantTop:o,quadrantWidth:x}=a,_=zt().domain([0,1]).range([f,x+f]),h=zt().domain([0,1]).range([p+o,o]);return this.data.points.map(k=>{let m=this.classes.get(k.className);return m&&(k=Q(Q({},m),k)),{x:_(k.x),y:h(k.y),fill:k.color??this.themeConfig.quadrantPointFill,radius:k.radius??this.config.pointRadius,text:{text:k.text,fill:this.themeConfig.quadrantPointTextFill,x:_(k.x),y:h(k.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:k.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:k.strokeWidth??"0px"}})}getBorders(t){let a=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:p}=t,{quadrantHalfHeight:f,quadrantHeight:o,quadrantLeft:x,quadrantHalfWidth:_,quadrantTop:h,quadrantWidth:c}=p;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:x-a,y1:h,x2:x+c+a,y2:h},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:x+c,y1:h+a,x2:x+c,y2:h+o-a},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:x-a,y1:h+o,x2:x+c+a,y2:h+o},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:x,y1:h+a,x2:x,y2:h+o-a},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:x+_,y1:h+a,x2:x+_,y2:h+o-a},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:x+a,y1:h+f,x2:x+c-a,y2:h+f}]}getTitle(t){if(t)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){let t=this.config.showXAxis&&!!(this.data.xAxisLeftText||this.data.xAxisRightText),a=this.config.showYAxis&&!!(this.data.yAxisTopText||this.data.yAxisBottomText),p=this.config.showTitle&&!!this.data.titleText,f=this.data.points.length>0?"bottom":this.config.xAxisPosition,o=this.calculateSpace(f,t,a,p);return{points:this.getQuadrantPoints(o),quadrants:this.getQuadrants(o),axisLabels:this.getAxisLabels(f,t,a,o),borderLines:this.getBorders(o),title:this.getTitle(p)}}},kt=class extends Error{static{s(this,"InvalidStyleError")}constructor(t,a,p){super(`value for ${t} ${a} is invalid, please use a valid ${p}`),this.name="InvalidStyleError"}};function It(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}s(It,"validateHexCode");function xe(t){return!/^\d+$/.test(t)}s(xe,"validateNumber");function fe(t){return!/^\d+px$/.test(t)}s(fe,"validateSizeInPixels");var Ie=qt();function O(t){return re(t.trim(),Ie)}s(O,"textSanitizer");var z=new Ve;function ge(t){z.setData({quadrant1Text:O(t.text)})}s(ge,"setQuadrant1Text");function pe(t){z.setData({quadrant2Text:O(t.text)})}s(pe,"setQuadrant2Text");function ye(t){z.setData({quadrant3Text:O(t.text)})}s(ye,"setQuadrant3Text");function be(t){z.setData({quadrant4Text:O(t.text)})}s(be,"setQuadrant4Text");function Te(t){z.setData({xAxisLeftText:O(t.text)})}s(Te,"setXAxisLeftText");function me(t){z.setData({xAxisRightText:O(t.text)})}s(me,"setXAxisRightText");function qe(t){z.setData({yAxisTopText:O(t.text)})}s(qe,"setYAxisTopText");function ke(t){z.setData({yAxisBottomText:O(t.text)})}s(ke,"setYAxisBottomText");function St(t){let a={};for(let p of t){let[f,o]=p.trim().split(/\s*:\s*/);if(f==="radius"){if(xe(o))throw new kt(f,o,"number");a.radius=parseInt(o)}else if(f==="color"){if(It(o))throw new kt(f,o,"hex code");a.color=o}else if(f==="stroke-color"){if(It(o))throw new kt(f,o,"hex code");a.strokeColor=o}else if(f==="stroke-width"){if(fe(o))throw new kt(f,o,"number of pixels (eg. 10px)");a.strokeWidth=o}else throw new Error(`style named ${f} is not supported.`)}return a}s(St,"parseStyles");function Se(t,a,p,f,o){let x=St(o);z.addPoints([Q({x:p,y:f,text:O(t.text),className:a},x)])}s(Se,"addPoint");function _e(t,a){z.addClass(t,St(a))}s(_e,"addClass");function Ae(t){z.setConfig({chartWidth:t})}s(Ae,"setWidth");function Fe(t){z.setConfig({chartHeight:t})}s(Fe,"setHeight");function Pe(){let t=qt(),{themeVariables:a,quadrantChart:p}=t;return p&&z.setConfig(p),z.setThemeConfig({quadrant1Fill:a.quadrant1Fill,quadrant2Fill:a.quadrant2Fill,quadrant3Fill:a.quadrant3Fill,quadrant4Fill:a.quadrant4Fill,quadrant1TextFill:a.quadrant1TextFill,quadrant2TextFill:a.quadrant2TextFill,quadrant3TextFill:a.quadrant3TextFill,quadrant4TextFill:a.quadrant4TextFill,quadrantPointFill:a.quadrantPointFill,quadrantPointTextFill:a.quadrantPointTextFill,quadrantXAxisTextFill:a.quadrantXAxisTextFill,quadrantYAxisTextFill:a.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:a.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:a.quadrantInternalBorderStrokeFill,quadrantTitleFill:a.quadrantTitleFill}),z.setData({titleText:Dt()}),z.build()}s(Pe,"getQuadrantData");var we=s(function(){z.clear(),oe()},"clear"),Be={setWidth:Ae,setHeight:Fe,setQuadrant1Text:ge,setQuadrant2Text:pe,setQuadrant3Text:ye,setQuadrant4Text:be,setXAxisLeftText:Te,setXAxisRightText:me,setYAxisTopText:qe,setYAxisBottomText:ke,parseStyles:St,addPoint:Se,addClass:_e,getQuadrantData:Pe,clear:we,setAccTitle:le,getAccTitle:he,setDiagramTitle:ue,getDiagramTitle:Dt,getAccDescription:de,setAccDescription:ce},Re=s((t,a,p,f)=>{function o(i){return i==="top"?"hanging":"middle"}s(o,"getDominantBaseLine");function x(i){return i==="left"?"start":"middle"}s(x,"getTextAnchor");function _(i){return`translate(${i.x}, ${i.y}) rotate(${i.rotation||0})`}s(_,"getTransformation");let h=qt();dt.debug(`Rendering quadrant chart +`+t);let c=h.securityLevel,k;c==="sandbox"&&(k=mt("#i"+a));let q=(c==="sandbox"?mt(k.nodes()[0].contentDocument.body):mt("body")).select(`[id="${a}"]`),y=q.append("g").attr("class","main"),b=h.quadrantChart?.chartWidth??500,T=h.quadrantChart?.chartHeight??500;se(q,T,b,h.quadrantChart?.useMaxWidth??!0),q.attr("viewBox","0 0 "+b+" "+T),f.db.setHeight(T),f.db.setWidth(b);let g=f.db.getQuadrantData(),ot=y.append("g").attr("class","quadrants"),ut=y.append("g").attr("class","border"),xt=y.append("g").attr("class","data-points"),ft=y.append("g").attr("class","labels"),gt=y.append("g").attr("class","title");g.title&>.append("text").attr("x",0).attr("y",0).attr("fill",g.title.fill).attr("font-size",g.title.fontSize).attr("dominant-baseline",o(g.title.horizontalPos)).attr("text-anchor",x(g.title.verticalPos)).attr("transform",_(g.title)).text(g.title.text),g.borderLines&&ut.selectAll("line").data(g.borderLines).enter().append("line").attr("x1",i=>i.x1).attr("y1",i=>i.y1).attr("x2",i=>i.x2).attr("y2",i=>i.y2).style("stroke",i=>i.strokeFill).style("stroke-width",i=>i.strokeWidth);let lt=ot.selectAll("g.quadrant").data(g.quadrants).enter().append("g").attr("class","quadrant");lt.append("rect").attr("x",i=>i.x).attr("y",i=>i.y).attr("width",i=>i.width).attr("height",i=>i.height).attr("fill",i=>i.fill),lt.append("text").attr("x",0).attr("y",0).attr("fill",i=>i.text.fill).attr("font-size",i=>i.text.fontSize).attr("dominant-baseline",i=>o(i.text.horizontalPos)).attr("text-anchor",i=>x(i.text.verticalPos)).attr("transform",i=>_(i.text)).text(i=>i.text.text),ft.selectAll("g.label").data(g.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text(i=>i.text).attr("fill",i=>i.fill).attr("font-size",i=>i.fontSize).attr("dominant-baseline",i=>o(i.horizontalPos)).attr("text-anchor",i=>x(i.verticalPos)).attr("transform",i=>_(i));let ht=xt.selectAll("g.data-point").data(g.points).enter().append("g").attr("class","data-point");ht.append("circle").attr("cx",i=>i.x).attr("cy",i=>i.y).attr("r",i=>i.radius).attr("fill",i=>i.fill).attr("stroke",i=>i.strokeColor).attr("stroke-width",i=>i.strokeWidth),ht.append("text").attr("x",0).attr("y",0).text(i=>i.text.text).attr("fill",i=>i.text.fill).attr("font-size",i=>i.text.fontSize).attr("dominant-baseline",i=>o(i.text.horizontalPos)).attr("text-anchor",i=>x(i.text.verticalPos)).attr("transform",i=>_(i.text))},"draw"),Ne={draw:Re},Xe={parser:ze,db:Be,renderer:Ne,styles:s(()=>"","styles")};export{Xe as diagram}; diff --git a/src/google/adk/cli/browser/chunk-VDPKVNDJ.js b/src/google/adk/cli/browser/chunk-VDPKVNDJ.js new file mode 100644 index 0000000000..9a47ca2ba8 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-VDPKVNDJ.js @@ -0,0 +1 @@ +import{Y as c}from"./chunk-QFMJV7VH.js";import{g as l}from"./chunk-JRNAXTJ7.js";var m=l(t=>{let{handDrawnSeed:e}=c();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:e}},"solidStateFill"),h=l(t=>{let e=p([...t.cssCompiledStyles||[],...t.cssStyles||[],...t.labelStyle||[]]);return{stylesMap:e,stylesArray:[...e]}},"compileStyles"),p=l(t=>{let e=new Map;return t.forEach(o=>{let[a,r]=o.split(":");e.set(a.trim(),r?.trim())}),e},"styles2Map"),d=l(t=>t==="color"||t==="font-size"||t==="font-family"||t==="font-weight"||t==="font-style"||t==="text-decoration"||t==="text-align"||t==="text-transform"||t==="line-height"||t==="letter-spacing"||t==="word-spacing"||t==="text-shadow"||t==="text-overflow"||t==="white-space"||t==="word-wrap"||t==="word-break"||t==="overflow-wrap"||t==="hyphens","isLabelStyle"),S=l(t=>{let{stylesArray:e}=h(t),o=[],a=[],r=[],n=[];return e.forEach(s=>{let i=s[0];d(i)?o.push(s.join(":")+" !important"):(a.push(s.join(":")+" !important"),i.includes("stroke")&&r.push(s.join(":")+" !important"),i==="fill"&&n.push(s.join(":")+" !important"))}),{labelStyles:o.join(";"),nodeStyles:a.join(";"),stylesArray:e,borderStyles:r,backgroundStyles:n}},"styles2String"),w=l((t,e)=>{let{themeVariables:o,handDrawnSeed:a}=c(),{nodeBorder:r,mainBkg:n}=o,{stylesMap:s}=h(t);return Object.assign({roughness:.7,fill:s.get("fill")||n,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:s.get("stroke")||r,seed:a,strokeWidth:s.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0],strokeLineDash:f(s.get("stroke-dasharray"))},e)},"userNodeOverrides"),f=l(t=>{if(!t)return[0,0];let e=t.trim().split(/\s+/).map(Number);if(e.length===1){let r=isNaN(e[0])?0:e[0];return[r,r]}let o=isNaN(e[0])?0:e[0],a=isNaN(e[1])?0:e[1];return[o,a]},"getStrokeDashArray");export{m as a,h as b,d as c,S as d,w as e}; diff --git a/src/google/adk/cli/browser/chunk-W67OU2Q2.js b/src/google/adk/cli/browser/chunk-W67OU2Q2.js new file mode 100644 index 0000000000..7f141bceba --- /dev/null +++ b/src/google/adk/cli/browser/chunk-W67OU2Q2.js @@ -0,0 +1,10 @@ +import{M as xt,O as kt,R as _t,S as vt,T as bt,U as St,V as wt,W as Lt,X as Et,Y as Q,_ as At}from"./chunk-QFMJV7VH.js";import{J as Ct,a as q,g as y,r as Tt}from"./chunk-JRNAXTJ7.js";import"./chunk-RMXJBC7V.js";function X(t,n){let r;if(n===void 0)for(let l of t)l!=null&&(r=l)&&(r=l);else{let l=-1;for(let f of t)(f=n(f,++l,t))!=null&&(r=f)&&(r=f)}return r}function F(t,n){let r;if(n===void 0)for(let l of t)l!=null&&(r>l||r===void 0&&l>=l)&&(r=l);else{let l=-1;for(let f of t)(f=n(f,++l,t))!=null&&(r>f||r===void 0&&f>=f)&&(r=f)}return r}function U(t,n){let r=0;if(n===void 0)for(let l of t)(l=+l)&&(r+=l);else{let l=-1;for(let f of t)(f=+n(f,++l,t))&&(r+=f)}return r}function Bt(t){return t.target.depth}function st(t){return t.depth}function it(t,n){return n-1-t.height}function G(t,n){return t.sourceLinks.length?t.depth:n-1}function at(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?F(t.sourceLinks,Bt)-1:0}function W(t){return function(){return t}}function Mt(t,n){return K(t.source,n.source)||t.index-n.index}function Ot(t,n){return K(t.target,n.target)||t.index-n.index}function K(t,n){return t.y0-n.y0}function lt(t){return t.value}function $t(t){return t.index}function Vt(t){return t.nodes}function Ft(t){return t.links}function It(t,n){let r=t.get(n);if(!r)throw new Error("missing: "+n);return r}function Nt({nodes:t}){for(let n of t){let r=n.y0,l=r;for(let f of n.sourceLinks)f.y0=r+f.width/2,r+=f.width;for(let f of n.targetLinks)f.y1=l+f.width/2,l+=f.width}}function Z(){let t=0,n=0,r=1,l=1,f=24,S=8,m,x=$t,o=G,i,a,k=Vt,_=Ft,d=6;function v(){let e={nodes:k.apply(null,arguments),links:_.apply(null,arguments)};return C(e),T(e),M(e),P(e),z(e),Nt(e),e}v.update=function(e){return Nt(e),e},v.nodeId=function(e){return arguments.length?(x=typeof e=="function"?e:W(e),v):x},v.nodeAlign=function(e){return arguments.length?(o=typeof e=="function"?e:W(e),v):o},v.nodeSort=function(e){return arguments.length?(i=e,v):i},v.nodeWidth=function(e){return arguments.length?(f=+e,v):f},v.nodePadding=function(e){return arguments.length?(S=m=+e,v):S},v.nodes=function(e){return arguments.length?(k=typeof e=="function"?e:W(e),v):k},v.links=function(e){return arguments.length?(_=typeof e=="function"?e:W(e),v):_},v.linkSort=function(e){return arguments.length?(a=e,v):a},v.size=function(e){return arguments.length?(t=n=0,r=+e[0],l=+e[1],v):[r-t,l-n]},v.extent=function(e){return arguments.length?(t=+e[0][0],r=+e[1][0],n=+e[0][1],l=+e[1][1],v):[[t,n],[r,l]]},v.iterations=function(e){return arguments.length?(d=+e,v):d};function C({nodes:e,links:u}){for(let[h,s]of e.entries())s.index=h,s.sourceLinks=[],s.targetLinks=[];let c=new Map(e.map((h,s)=>[x(h,s,e),h]));for(let[h,s]of u.entries()){s.index=h;let{source:g,target:b}=s;typeof g!="object"&&(g=s.source=It(c,g)),typeof b!="object"&&(b=s.target=It(c,b)),g.sourceLinks.push(s),b.targetLinks.push(s)}if(a!=null)for(let{sourceLinks:h,targetLinks:s}of e)h.sort(a),s.sort(a)}function T({nodes:e}){for(let u of e)u.value=u.fixedValue===void 0?Math.max(U(u.sourceLinks,lt),U(u.targetLinks,lt)):u.fixedValue}function M({nodes:e}){let u=e.length,c=new Set(e),h=new Set,s=0;for(;c.size;){for(let g of c){g.depth=s;for(let{target:b}of g.sourceLinks)h.add(b)}if(++s>u)throw new Error("circular link");c=h,h=new Set}}function P({nodes:e}){let u=e.length,c=new Set(e),h=new Set,s=0;for(;c.size;){for(let g of c){g.height=s;for(let{source:b}of g.targetLinks)h.add(b)}if(++s>u)throw new Error("circular link");c=h,h=new Set}}function j({nodes:e}){let u=X(e,s=>s.depth)+1,c=(r-t-f)/(u-1),h=new Array(u);for(let s of e){let g=Math.max(0,Math.min(u-1,Math.floor(o.call(null,s,u))));s.layer=g,s.x0=t+g*c,s.x1=s.x0+f,h[g]?h[g].push(s):h[g]=[s]}if(i)for(let s of h)s.sort(i);return h}function B(e){let u=F(e,c=>(l-n-(c.length-1)*m)/U(c,lt));for(let c of e){let h=n;for(let s of c){s.y0=h,s.y1=h+s.value*u,h=s.y1+m;for(let g of s.sourceLinks)g.width=g.value*u}h=(l-h+m)/(c.length+1);for(let s=0;sc.length)-1)),B(u);for(let c=0;c0))continue;let D=($/N-b.y0)*u;b.y0+=D,b.y1+=D,A(b)}i===void 0&&g.sort(K),R(g,c)}}function O(e,u,c){for(let h=e.length,s=h-2;s>=0;--s){let g=e[s];for(let b of g){let $=0,N=0;for(let{target:L,value:ot}of b.sourceLinks){let Y=ot*(L.layer-b.layer);$+=H(b,L)*Y,N+=Y}if(!(N>0))continue;let D=($/N-b.y0)*u;b.y0+=D,b.y1+=D,A(b)}i===void 0&&g.sort(K),R(g,c)}}function R(e,u){let c=e.length>>1,h=e[c];p(e,h.y0-m,c-1,u),I(e,h.y1+m,c+1,u),p(e,l,e.length-1,u),I(e,n,0,u)}function I(e,u,c,h){for(;c1e-6&&(s.y0+=g,s.y1+=g),u=s.y1+m}}function p(e,u,c,h){for(;c>=0;--c){let s=e[c],g=(s.y1-u)*h;g>1e-6&&(s.y0-=g,s.y1-=g),u=s.y0-m}}function A({sourceLinks:e,targetLinks:u}){if(a===void 0){for(let{source:{sourceLinks:c}}of u)c.sort(Ot);for(let{target:{targetLinks:c}}of e)c.sort(Mt)}}function J(e){if(a===void 0)for(let{sourceLinks:u,targetLinks:c}of e)u.sort(Ot),c.sort(Mt)}function E(e,u){let c=e.y0-(e.sourceLinks.length-1)*m/2;for(let{target:h,width:s}of e.sourceLinks){if(h===u)break;c+=s+m}for(let{source:h,width:s}of u.targetLinks){if(h===e)break;c-=s}return c}function H(e,u){let c=u.y0-(u.targetLinks.length-1)*m/2;for(let{source:h,width:s}of u.targetLinks){if(h===e)break;c+=s+m}for(let{target:h,width:s}of e.sourceLinks){if(h===u)break;c-=s}return c}return v}var ut=Math.PI,ft=2*ut,V=1e-6,Ut=ft-V;function ct(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function Pt(){return new ct}ct.prototype=Pt.prototype={constructor:ct,moveTo:function(t,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)},closePath:function(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,n){this._+="L"+(this._x1=+t)+","+(this._y1=+n)},quadraticCurveTo:function(t,n,r,l){this._+="Q"+ +t+","+ +n+","+(this._x1=+r)+","+(this._y1=+l)},bezierCurveTo:function(t,n,r,l,f,S){this._+="C"+ +t+","+ +n+","+ +r+","+ +l+","+(this._x1=+f)+","+(this._y1=+S)},arcTo:function(t,n,r,l,f){t=+t,n=+n,r=+r,l=+l,f=+f;var S=this._x1,m=this._y1,x=r-t,o=l-n,i=S-t,a=m-n,k=i*i+a*a;if(f<0)throw new Error("negative radius: "+f);if(this._x1===null)this._+="M"+(this._x1=t)+","+(this._y1=n);else if(k>V)if(!(Math.abs(a*x-o*i)>V)||!f)this._+="L"+(this._x1=t)+","+(this._y1=n);else{var _=r-S,d=l-m,v=x*x+o*o,C=_*_+d*d,T=Math.sqrt(v),M=Math.sqrt(k),P=f*Math.tan((ut-Math.acos((v+k-C)/(2*T*M)))/2),j=P/M,B=P/T;Math.abs(j-1)>V&&(this._+="L"+(t+j*i)+","+(n+j*a)),this._+="A"+f+","+f+",0,0,"+ +(a*_>i*d)+","+(this._x1=t+B*x)+","+(this._y1=n+B*o)}},arc:function(t,n,r,l,f,S){t=+t,n=+n,r=+r,S=!!S;var m=r*Math.cos(l),x=r*Math.sin(l),o=t+m,i=n+x,a=1^S,k=S?l-f:f-l;if(r<0)throw new Error("negative radius: "+r);this._x1===null?this._+="M"+o+","+i:(Math.abs(this._x1-o)>V||Math.abs(this._y1-i)>V)&&(this._+="L"+o+","+i),r&&(k<0&&(k=k%ft+ft),k>Ut?this._+="A"+r+","+r+",0,1,"+a+","+(t-m)+","+(n-x)+"A"+r+","+r+",0,1,"+a+","+(this._x1=o)+","+(this._y1=i):k>V&&(this._+="A"+r+","+r+",0,"+ +(k>=ut)+","+a+","+(this._x1=t+r*Math.cos(f))+","+(this._y1=n+r*Math.sin(f))))},rect:function(t,n,r,l){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +r+"v"+ +l+"h"+-r+"Z"},toString:function(){return this._}};var ht=Pt;function dt(t){return function(){return t}}function Rt(t){return t[0]}function zt(t){return t[1]}var Dt=Array.prototype.slice;function Wt(t){return t.source}function Ht(t){return t.target}function Yt(t){var n=Wt,r=Ht,l=Rt,f=zt,S=null;function m(){var x,o=Dt.call(arguments),i=n.apply(this,o),a=r.apply(this,o);if(S||(S=x=ht()),t(S,+l.apply(this,(o[0]=i,o)),+f.apply(this,o),+l.apply(this,(o[0]=a,o)),+f.apply(this,o)),x)return S=null,x+""||null}return m.source=function(x){return arguments.length?(n=x,m):n},m.target=function(x){return arguments.length?(r=x,m):r},m.x=function(x){return arguments.length?(l=typeof x=="function"?x:dt(+x),m):l},m.y=function(x){return arguments.length?(f=typeof x=="function"?x:dt(+x),m):f},m.context=function(x){return arguments.length?(S=x??null,m):S},m}function qt(t,n,r,l,f){t.moveTo(n,r),t.bezierCurveTo(n=(n+l)/2,r,n,f,l,f)}function pt(){return Yt(qt)}function Xt(t){return[t.source.x1,t.y0]}function Gt(t){return[t.target.x0,t.y1]}function yt(){return pt().source(Xt).target(Gt)}var mt=(function(){var t=y(function(x,o,i,a){for(i=i||{},a=x.length;a--;i[x[a]]=o);return i},"o"),n=[1,9],r=[1,10],l=[1,5,10,12],f={trace:y(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SANKEY:4,NEWLINE:5,csv:6,opt_eof:7,record:8,csv_tail:9,EOF:10,"field[source]":11,COMMA:12,"field[target]":13,"field[value]":14,field:15,escaped:16,non_escaped:17,DQUOTE:18,ESCAPED_TEXT:19,NON_ESCAPED_TEXT:20,$accept:0,$end:1},terminals_:{2:"error",4:"SANKEY",5:"NEWLINE",10:"EOF",11:"field[source]",12:"COMMA",13:"field[target]",14:"field[value]",18:"DQUOTE",19:"ESCAPED_TEXT",20:"NON_ESCAPED_TEXT"},productions_:[0,[3,4],[6,2],[9,2],[9,0],[7,1],[7,0],[8,5],[15,1],[15,1],[16,3],[17,1]],performAction:y(function(o,i,a,k,_,d,v){var C=d.length-1;switch(_){case 7:let T=k.findOrCreateNode(d[C-4].trim().replaceAll('""','"')),M=k.findOrCreateNode(d[C-2].trim().replaceAll('""','"')),P=parseFloat(d[C].trim());k.addLink(T,M,P);break;case 8:case 9:case 11:this.$=d[C];break;case 10:this.$=d[C-1];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:n,20:r},{1:[2,6],7:11,10:[1,12]},t(r,[2,4],{9:13,5:[1,14]}),{12:[1,15]},t(l,[2,8]),t(l,[2,9]),{19:[1,16]},t(l,[2,11]),{1:[2,1]},{1:[2,5]},t(r,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:n,20:r},{15:18,16:7,17:8,18:n,20:r},{18:[1,19]},t(r,[2,3]),{12:[1,20]},t(l,[2,10]),{15:21,16:7,17:8,18:n,20:r},t([1,5,10],[2,7])],defaultActions:{11:[2,1],12:[2,5]},parseError:y(function(o,i){if(i.recoverable)this.trace(o);else{var a=new Error(o);throw a.hash=i,a}},"parseError"),parse:y(function(o){var i=this,a=[0],k=[],_=[null],d=[],v=this.table,C="",T=0,M=0,P=0,j=2,B=1,z=d.slice.call(arguments,1),w=Object.create(this.lexer),O={yy:{}};for(var R in this.yy)Object.prototype.hasOwnProperty.call(this.yy,R)&&(O.yy[R]=this.yy[R]);w.setInput(o,O.yy),O.yy.lexer=w,O.yy.parser=this,typeof w.yylloc>"u"&&(w.yylloc={});var I=w.yylloc;d.push(I);var p=w.options&&w.options.ranges;typeof O.yy.parseError=="function"?this.parseError=O.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function A(L){a.length=a.length-2*L,_.length=_.length-L,d.length=d.length-L}y(A,"popStack");function J(){var L;return L=k.pop()||w.lex()||B,typeof L!="number"&&(L instanceof Array&&(k=L,L=k.pop()),L=i.symbols_[L]||L),L}y(J,"lex");for(var E,H,e,u,c,h,s={},g,b,$,N;;){if(e=a[a.length-1],this.defaultActions[e]?u=this.defaultActions[e]:((E===null||typeof E>"u")&&(E=J()),u=v[e]&&v[e][E]),typeof u>"u"||!u.length||!u[0]){var D="";N=[];for(g in v[e])this.terminals_[g]&&g>j&&N.push("'"+this.terminals_[g]+"'");w.showPosition?D="Parse error on line "+(T+1)+`: +`+w.showPosition()+` +Expecting `+N.join(", ")+", got '"+(this.terminals_[E]||E)+"'":D="Parse error on line "+(T+1)+": Unexpected "+(E==B?"end of input":"'"+(this.terminals_[E]||E)+"'"),this.parseError(D,{text:w.match,token:this.terminals_[E]||E,line:w.yylineno,loc:I,expected:N})}if(u[0]instanceof Array&&u.length>1)throw new Error("Parse Error: multiple actions possible at state: "+e+", token: "+E);switch(u[0]){case 1:a.push(E),_.push(w.yytext),d.push(w.yylloc),a.push(u[1]),E=null,H?(E=H,H=null):(M=w.yyleng,C=w.yytext,T=w.yylineno,I=w.yylloc,P>0&&P--);break;case 2:if(b=this.productions_[u[1]][1],s.$=_[_.length-b],s._$={first_line:d[d.length-(b||1)].first_line,last_line:d[d.length-1].last_line,first_column:d[d.length-(b||1)].first_column,last_column:d[d.length-1].last_column},p&&(s._$.range=[d[d.length-(b||1)].range[0],d[d.length-1].range[1]]),h=this.performAction.apply(s,[C,M,T,O.yy,u[1],_,d].concat(z)),typeof h<"u")return h;b&&(a=a.slice(0,-1*b*2),_=_.slice(0,-1*b),d=d.slice(0,-1*b)),a.push(this.productions_[u[1]][0]),_.push(s.$),d.push(s._$),$=v[a[a.length-2]][a[a.length-1]],a.push($);break;case 3:return!0}}return!0},"parse")},S=(function(){var x={EOF:1,parseError:y(function(i,a){if(this.yy.parser)this.yy.parser.parseError(i,a);else throw new Error(i)},"parseError"),setInput:y(function(o,i){return this.yy=i||this.yy||{},this._input=o,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:y(function(){var o=this._input[0];this.yytext+=o,this.yyleng++,this.offset++,this.match+=o,this.matched+=o;var i=o.match(/(?:\r\n?|\n).*/g);return i?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),o},"input"),unput:y(function(o){var i=o.length,a=o.split(/(?:\r\n?|\n)/g);this._input=o+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-i),this.offset-=i;var k=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),a.length-1&&(this.yylineno-=a.length-1);var _=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:a?(a.length===k.length?this.yylloc.first_column:0)+k[k.length-a.length].length-a[0].length:this.yylloc.first_column-i},this.options.ranges&&(this.yylloc.range=[_[0],_[0]+this.yyleng-i]),this.yyleng=this.yytext.length,this},"unput"),more:y(function(){return this._more=!0,this},"more"),reject:y(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:y(function(o){this.unput(this.match.slice(o))},"less"),pastInput:y(function(){var o=this.matched.substr(0,this.matched.length-this.match.length);return(o.length>20?"...":"")+o.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:y(function(){var o=this.match;return o.length<20&&(o+=this._input.substr(0,20-o.length)),(o.substr(0,20)+(o.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:y(function(){var o=this.pastInput(),i=new Array(o.length+1).join("-");return o+this.upcomingInput()+` +`+i+"^"},"showPosition"),test_match:y(function(o,i){var a,k,_;if(this.options.backtrack_lexer&&(_={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(_.yylloc.range=this.yylloc.range.slice(0))),k=o[0].match(/(?:\r\n?|\n).*/g),k&&(this.yylineno+=k.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:k?k[k.length-1].length-k[k.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+o[0].length},this.yytext+=o[0],this.match+=o[0],this.matches=o,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(o[0].length),this.matched+=o[0],a=this.performAction.call(this,this.yy,this,i,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a)return a;if(this._backtrack){for(var d in _)this[d]=_[d];return!1}return!1},"test_match"),next:y(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var o,i,a,k;this._more||(this.yytext="",this.match="");for(var _=this._currentRules(),d=0;d<_.length;d++)if(a=this._input.match(this.rules[_[d]]),a&&(!i||a[0].length>i[0].length)){if(i=a,k=d,this.options.backtrack_lexer){if(o=this.test_match(a,_[d]),o!==!1)return o;if(this._backtrack){i=!1;continue}else return!1}else if(!this.options.flex)break}return i?(o=this.test_match(i,_[k]),o!==!1?o:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:y(function(){var i=this.next();return i||this.lex()},"lex"),begin:y(function(i){this.conditionStack.push(i)},"begin"),popState:y(function(){var i=this.conditionStack.length-1;return i>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:y(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:y(function(i){return i=this.conditionStack.length-1-Math.abs(i||0),i>=0?this.conditionStack[i]:"INITIAL"},"topState"),pushState:y(function(i){this.begin(i)},"pushState"),stateStackSize:y(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:y(function(i,a,k,_){var d=_;switch(k){case 0:return this.pushState("csv"),4;break;case 1:return this.pushState("csv"),4;break;case 2:return 10;case 3:return 5;case 4:return 12;case 5:return this.pushState("escaped_text"),18;break;case 6:return 20;case 7:return this.popState("escaped_text"),18;break;case 8:return 19}},"anonymous"),rules:[/^(?:sankey-beta\b)/i,/^(?:sankey\b)/i,/^(?:$)/i,/^(?:((\u000D\u000A)|(\u000A)))/i,/^(?:(\u002C))/i,/^(?:(\u0022))/i,/^(?:([\u0020-\u0021\u0023-\u002B\u002D-\u007E])*)/i,/^(?:(\u0022)(?!(\u0022)))/i,/^(?:(([\u0020-\u0021\u0023-\u002B\u002D-\u007E])|(\u002C)|(\u000D)|(\u000A)|(\u0022)(\u0022))*)/i],conditions:{csv:{rules:[2,3,4,5,6,7,8],inclusive:!1},escaped_text:{rules:[7,8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8],inclusive:!0}}};return x})();f.lexer=S;function m(){this.yy={}}return y(m,"Parser"),m.prototype=f,f.Parser=m,new m})();mt.parser=mt;var tt=mt,nt=[],rt=[],et=new Map,Jt=y(()=>{nt=[],rt=[],et=new Map,_t()},"clear"),Qt=class{constructor(t,n,r=0){this.source=t,this.target=n,this.value=r}static{y(this,"SankeyLink")}},Kt=y((t,n,r)=>{nt.push(new Qt(t,n,r))},"addLink"),Zt=class{constructor(t){this.ID=t}static{y(this,"SankeyNode")}},te=y(t=>{t=xt.sanitizeText(t,Q());let n=et.get(t);return n===void 0&&(n=new Zt(t),et.set(t,n),rt.push(n)),n},"findOrCreateNode"),ee=y(()=>rt,"getNodes"),ne=y(()=>nt,"getLinks"),re=y(()=>({nodes:rt.map(t=>({id:t.ID})),links:nt.map(t=>({source:t.source.ID,target:t.target.ID,value:t.value}))}),"getGraph"),oe={nodesMap:et,getConfig:y(()=>Q().sankey,"getConfig"),getNodes:ee,getLinks:ne,getGraph:re,addLink:Kt,findOrCreateNode:te,getAccTitle:bt,setAccTitle:vt,getAccDescription:wt,setAccDescription:St,getDiagramTitle:Et,setDiagramTitle:Lt,clear:Jt},jt=class gt{static{y(this,"Uid")}static{this.count=0}static next(r){return new gt(r+ ++gt.count)}constructor(r){this.id=r,this.href=`#${r}`}toString(){return"url("+this.href+")"}},se={left:st,right:it,center:at,justify:G},ie=y(function(t,n,r,l){let{securityLevel:f,sankey:S}=Q(),m=At.sankey,x;f==="sandbox"&&(x=q("#i"+n));let o=f==="sandbox"?q(x.nodes()[0].contentDocument.body):q("body"),i=f==="sandbox"?o.select(`[id="${n}"]`):q(`[id="${n}"]`),a=S?.width??m.width,k=S?.height??m.width,_=S?.useMaxWidth??m.useMaxWidth,d=S?.nodeAlignment??m.nodeAlignment,v=S?.prefix??m.prefix,C=S?.suffix??m.suffix,T=S?.showValues??m.showValues,M=l.db.getGraph(),P=se[d];Z().nodeId(p=>p.id).nodeWidth(10).nodePadding(10+(T?15:0)).nodeAlign(P).extent([[0,0],[a,k]])(M);let z=Tt(Ct);i.append("g").attr("class","nodes").selectAll(".node").data(M.nodes).join("g").attr("class","node").attr("id",p=>(p.uid=jt.next("node-")).id).attr("transform",function(p){return"translate("+p.x0+","+p.y0+")"}).attr("x",p=>p.x0).attr("y",p=>p.y0).append("rect").attr("height",p=>p.y1-p.y0).attr("width",p=>p.x1-p.x0).attr("fill",p=>z(p.id));let w=y(({id:p,value:A})=>T?`${p} +${v}${Math.round(A*100)/100}${C}`:p,"getText");i.append("g").attr("class","node-labels").attr("font-size",14).selectAll("text").data(M.nodes).join("text").attr("x",p=>p.x0
        (p.y1+p.y0)/2).attr("dy",`${T?"0":"0.35"}em`).attr("text-anchor",p=>p.x0(A.uid=jt.next("linearGradient-")).id).attr("gradientUnits","userSpaceOnUse").attr("x1",A=>A.source.x1).attr("x2",A=>A.target.x0);p.append("stop").attr("offset","0%").attr("stop-color",A=>z(A.source.id)),p.append("stop").attr("offset","100%").attr("stop-color",A=>z(A.target.id))}let I;switch(R){case"gradient":I=y(p=>p.uid,"coloring");break;case"source":I=y(p=>z(p.source.id),"coloring");break;case"target":I=y(p=>z(p.target.id),"coloring");break;default:I=R}O.append("path").attr("d",yt()).attr("stroke",I).attr("stroke-width",p=>Math.max(1,p.width)),kt(void 0,i,0,_)},"draw"),ae={draw:ie},le=y(t=>t.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g,"").replaceAll(/([\n\r])+/g,` +`).trim(),"prepareTextForParsing"),ue=y(t=>`.label { + font-family: ${t.fontFamily}; + }`,"getStyles"),fe=ue,ce=tt.parse.bind(tt);tt.parse=t=>ce(le(t));var Qe={styles:fe,parser:tt,db:oe,renderer:ae};export{Qe as diagram}; diff --git a/src/google/adk/cli/browser/chunk-W7GRJBO5.js b/src/google/adk/cli/browser/chunk-W7GRJBO5.js deleted file mode 100644 index 88ea626604..0000000000 --- a/src/google/adk/cli/browser/chunk-W7GRJBO5.js +++ /dev/null @@ -1 +0,0 @@ -var q=Object.create;var k=Object.defineProperty,r=Object.defineProperties,s=Object.getOwnPropertyDescriptor,t=Object.getOwnPropertyDescriptors,u=Object.getOwnPropertyNames,j=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,n=Object.prototype.hasOwnProperty,p=Object.prototype.propertyIsEnumerable;var m=(b,a)=>(a=Symbol[b])?a:Symbol.for("Symbol."+b),w=b=>{throw TypeError(b)};var o=(b,a,c)=>a in b?k(b,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):b[a]=c,z=(b,a)=>{for(var c in a||={})n.call(a,c)&&o(b,c,a[c]);if(j)for(var c of j(a))p.call(a,c)&&o(b,c,a[c]);return b},A=(b,a)=>r(b,t(a));var B=(b,a)=>{var c={};for(var d in b)n.call(b,d)&&a.indexOf(d)<0&&(c[d]=b[d]);if(b!=null&&j)for(var d of j(b))a.indexOf(d)<0&&p.call(b,d)&&(c[d]=b[d]);return c};var C=(b,a)=>()=>(a||b((a={exports:{}}).exports,a),a.exports),D=(b,a)=>{for(var c in a)k(b,c,{get:a[c],enumerable:!0})},x=(b,a,c,d)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of u(a))!n.call(b,e)&&e!==c&&k(b,e,{get:()=>a[e],enumerable:!(d=s(a,e))||d.enumerable});return b};var E=(b,a,c)=>(c=b!=null?q(v(b)):{},x(a||!b||!b.__esModule?k(c,"default",{value:b,enumerable:!0}):c,b));var F=(b,a,c)=>new Promise((d,e)=>{var f=g=>{try{i(c.next(g))}catch(l){e(l)}},h=g=>{try{i(c.throw(g))}catch(l){e(l)}},i=g=>g.done?d(g.value):Promise.resolve(g.value).then(f,h);i((c=c.apply(b,a)).next())}),y=function(b,a){this[0]=b,this[1]=a};var G=b=>{var a=b[m("asyncIterator")],c=!1,d,e={};return a==null?(a=b[m("iterator")](),d=f=>e[f]=h=>a[f](h)):(a=a.call(b),d=f=>e[f]=h=>{if(c){if(c=!1,f==="throw")throw h;return h}return c=!0,{done:!1,value:new y(new Promise(i=>{var g=a[f](h);g instanceof Object||w("Object expected"),i(g)}),1)}}),e[m("iterator")]=()=>e,d("next"),"throw"in a?d("throw"):e.throw=f=>{throw f},"return"in a&&d("return"),e};export{z as a,A as b,B as c,C as d,D as e,E as f,F as g,G as h}; diff --git a/src/google/adk/cli/browser/chunk-W7PRDKNL.js b/src/google/adk/cli/browser/chunk-W7PRDKNL.js new file mode 100644 index 0000000000..90526eb2a2 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-W7PRDKNL.js @@ -0,0 +1,53 @@ +import{a as At,b as Ot}from"./chunk-DRBE27N3.js";import{a as w}from"./chunk-PRKFGJVH.js";import{a as jt,b as St,d as R,e as N}from"./chunk-VDPKVNDJ.js";import{d as $t,f as nt}from"./chunk-WXI2IBAH.js";import{i as wt,o as bt,q as st}from"./chunk-WBLSVR3V.js";import{$ as Rt,A as dt,E as it,G as Pt,I as Nt,J as _t,Y as U,u as ut}from"./chunk-QFMJV7VH.js";import{a as Q,g as b,i as Z}from"./chunk-JRNAXTJ7.js";import{a as tt,b as rt,j as C}from"./chunk-RMXJBC7V.js";var O=b((y,t,g)=>C(null,null,function*(){let o,l=t.useHtmlLabels||ut(U()?.htmlLabels);g?o=g:o="node default";let r=y.insert("g").attr("class",o).attr("id",t.domId||t.id),f=r.insert("g").attr("class","label").attr("style",st(t.labelStyle)),a;t.label===void 0?a="":a=typeof t.label=="string"?t.label:t.label[0];let c=!!t.icon||!!t.img,s=t.labelType==="markdown",e=yield nt(f,Pt(bt(a),U()),{useHtmlLabels:l,width:t.width||U().flowchart?.wrappingWidth,cssClasses:s?"markdown-node-label":void 0,style:t.labelStyle,addSvgBackground:c,markdown:s},U()),i=e.getBBox(),h=(t?.padding??0)/2;if(l){let n=e.children[0],p=Q(e);yield Ot(n,a),i=n.getBoundingClientRect(),p.attr("width",i.width),p.attr("height",i.height)}return l?f.attr("transform","translate("+-i.width/2+", "+-i.height/2+")"):f.attr("transform","translate(0, "+-i.height/2+")"),t.centerLabel&&f.attr("transform","translate("+-i.width/2+", "+-i.height/2+")"),f.insert("rect",":first-child"),{shapeSvg:r,bbox:i,halfPadding:h,label:f}}),"labelHelper"),Lt=b((y,t,g)=>C(null,null,function*(){let o=g.useHtmlLabels??it(U()),l=y.insert("g").attr("class","label").attr("style",g.labelStyle||""),r=yield nt(l,Pt(bt(t),U()),{useHtmlLabels:o,width:g.width||U()?.flowchart?.wrappingWidth,style:g.labelStyle,addSvgBackground:!!g.icon||!!g.img}),f=r.getBBox(),a=g.padding/2;if(it(U())){let c=r.children[0],s=Q(r);f=c.getBoundingClientRect(),s.attr("width",f.width),s.attr("height",f.height)}return o?l.attr("transform","translate("+-f.width/2+", "+-f.height/2+")"):l.attr("transform","translate(0, "+-f.height/2+")"),g.centerLabel&&l.attr("transform","translate("+-f.width/2+", "+-f.height/2+")"),l.insert("rect",":first-child"),{shapeSvg:y,bbox:f,halfPadding:a,label:l}}),"insertLabel"),A=b((y,t)=>{let g=t.node().getBBox();y.width=g.width,y.height=g.height},"updateNodeBounds"),T=b((y,t)=>(y.look==="handDrawn"?"rough-node":"node")+" "+y.cssClasses+" "+(t||""),"getNodeClasses");function z(y){let t=y.map((g,o)=>`${o===0?"M":"L"}${g.x},${g.y}`);return t.push("Z"),t.join(" ")}b(z,"createPathFromPoints");function ft(y,t,g,o,l,r){let f=[],c=g-y,s=o-t,e=c/r,i=2*Math.PI/e,h=t+s/2;for(let n=0;n<=50;n++){let p=n/50,u=y+p*c,m=h+l*Math.sin(i*(u-y));f.push({x:u,y:m})}return f}b(ft,"generateFullSineWavePoints");function kt(y,t,g,o,l,r){let f=[],a=l*Math.PI/180,e=(r*Math.PI/180-a)/(o-1);for(let i=0;i{var g=y.x,o=y.y,l=t.x-g,r=t.y-o,f=y.width/2,a=y.height/2,c,s;return Math.abs(r)*f>Math.abs(l)*a?(r<0&&(a=-a),c=r===0?0:a*l/r,s=a):(l<0&&(f=-f),c=f,s=l===0?0:f*r/l),{x:g+c,y:o+s}},"intersectRect"),xt=ne,ce=b((y,t,g,o=!1,l=!1)=>C(null,null,function*(){let r=t||"";typeof r=="object"&&(r=r[0]);let f=U(),a=it(f);return yield nt(y,r,{style:g,isTitle:o,useHtmlLabels:a,markdown:!1,isNode:l,width:Number.POSITIVE_INFINITY},f)}),"createLabel"),Bt=ce,yt=b((y,t,g,o,l)=>["M",y+l,t,"H",y+g-l,"A",l,l,0,0,1,y+g,t+l,"V",t+o-l,"A",l,l,0,0,1,y+g-l,t+o,"H",y+l,"A",l,l,0,0,1,y,t+o-l,"V",t+l,"A",l,l,0,0,1,y+l,t,"Z"].join(" "),"createRoundedRectPathD"),Xt=b((y,t)=>C(null,null,function*(){Z.info("Creating subgraph rect for ",t.id,t);let g=U(),{themeVariables:o,handDrawnSeed:l}=g,{clusterBkg:r,clusterBorder:f}=o,{labelStyles:a,nodeStyles:c,borderStyles:s,backgroundStyles:e}=R(t),i=y.insert("g").attr("class","cluster "+t.cssClasses).attr("id",t.id).attr("data-look",t.look),h=it(g),n=i.insert("g").attr("class","cluster-label "),p;t.labelType==="markdown"?p=yield nt(n,t.label,{style:t.labelStyle,useHtmlLabels:h,isNode:!0,width:t.width}):p=yield Bt(n,t.label,t.labelStyle||"",!1,!0);let u=p.getBBox();if(it(g)){let B=p.children[0],k=Q(p);u=B.getBoundingClientRect(),k.attr("width",u.width),k.attr("height",u.height)}let m=t.width<=u.width+t.padding?u.width+t.padding:t.width;t.width<=u.width+t.padding?t.diff=(m-t.width)/2-t.padding:t.diff=-t.padding;let d=t.height,x=t.x-m/2,D=t.y-d/2;Z.trace("Data ",t,JSON.stringify(t));let S;if(t.look==="handDrawn"){let B=w.svg(i),k=N(t,{roughness:.7,fill:r,stroke:f,fillWeight:3,seed:l}),M=B.path(yt(x,D,m,d,0),k);S=i.insert(()=>(Z.debug("Rough node insert CXC",M),M),":first-child"),S.select("path:nth-child(2)").attr("style",s.join(";")),S.select("path").attr("style",e.join(";").replace("fill","stroke"))}else S=i.insert("rect",":first-child"),S.attr("style",c).attr("rx",t.rx).attr("ry",t.ry).attr("x",x).attr("y",D).attr("width",m).attr("height",d);let{subGraphTitleTopMargin:$}=At(g);if(n.attr("transform",`translate(${t.x-u.width/2}, ${t.y-t.height/2+$})`),a){let B=n.select("span");B&&B.attr("style",a)}let v=S.node().getBBox();return t.offsetX=0,t.width=v.width,t.height=v.height,t.offsetY=u.height-t.padding/2,t.intersect=function(B){return xt(t,B)},{cluster:i,labelBBox:u}}),"rect"),oe=b((y,t)=>{let g=y.insert("g").attr("class","note-cluster").attr("id",t.id),o=g.insert("rect",":first-child"),l=0*t.padding,r=l/2;o.attr("rx",t.rx).attr("ry",t.ry).attr("x",t.x-t.width/2-r).attr("y",t.y-t.height/2-r).attr("width",t.width+l).attr("height",t.height+l).attr("fill","none");let f=o.node().getBBox();return t.width=f.width,t.height=f.height,t.intersect=function(a){return xt(t,a)},{cluster:g,labelBBox:{width:0,height:0}}},"noteGroup"),he=b((y,t)=>C(null,null,function*(){let g=U(),{themeVariables:o,handDrawnSeed:l}=g,{altBackground:r,compositeBackground:f,compositeTitleBackground:a,nodeBorder:c}=o,s=y.insert("g").attr("class",t.cssClasses).attr("id",t.id).attr("data-id",t.id).attr("data-look",t.look),e=s.insert("g",":first-child"),i=s.insert("g").attr("class","cluster-label"),h=s.append("rect"),n=yield Bt(i,t.label,t.labelStyle,void 0,!0),p=n.getBBox();if(it(g)){let M=n.children[0],I=Q(n);p=M.getBoundingClientRect(),I.attr("width",p.width),I.attr("height",p.height)}let u=0*t.padding,m=u/2,d=(t.width<=p.width+t.padding?p.width+t.padding:t.width)+u;t.width<=p.width+t.padding?t.diff=(d-t.width)/2-t.padding:t.diff=-t.padding;let x=t.height+u,D=t.height+u-p.height-6,S=t.x-d/2,$=t.y-x/2;t.width=d;let v=t.y-t.height/2-m+p.height+2,B;if(t.look==="handDrawn"){let M=t.cssClasses.includes("statediagram-cluster-alt"),I=w.svg(s),Y=t.rx||t.ry?I.path(yt(S,$,d,x,10),{roughness:.7,fill:a,fillStyle:"solid",stroke:c,seed:l}):I.rectangle(S,$,d,x,{seed:l});B=s.insert(()=>Y,":first-child");let V=I.rectangle(S,v,d,D,{fill:M?r:f,fillStyle:M?"hachure":"solid",stroke:c,seed:l});B=s.insert(()=>Y,":first-child"),h=s.insert(()=>V)}else B=e.insert("rect",":first-child"),B.attr("class","outer").attr("x",S).attr("y",$).attr("width",d).attr("height",x).attr("data-look",t.look),h.attr("class","inner").attr("x",S).attr("y",v).attr("width",d).attr("height",D);i.attr("transform",`translate(${t.x-p.width/2}, ${$+1-(it(g)?0:3)})`);let k=B.node().getBBox();return t.height=k.height,t.offsetX=0,t.offsetY=p.height-t.padding/2,t.labelBBox=p,t.intersect=function(M){return xt(t,M)},{cluster:s,labelBBox:p}}),"roundedWithTitle"),ge=b((y,t)=>C(null,null,function*(){Z.info("Creating subgraph rect for ",t.id,t);let g=U(),{themeVariables:o,handDrawnSeed:l}=g,{clusterBkg:r,clusterBorder:f}=o,{labelStyles:a,nodeStyles:c,borderStyles:s,backgroundStyles:e}=R(t),i=y.insert("g").attr("class","cluster "+t.cssClasses).attr("id",t.id).attr("data-look",t.look),h=it(g),n=i.insert("g").attr("class","cluster-label "),p=yield nt(n,t.label,{style:t.labelStyle,useHtmlLabels:h,isNode:!0,width:t.width}),u=p.getBBox();if(it(g)){let B=p.children[0],k=Q(p);u=B.getBoundingClientRect(),k.attr("width",u.width),k.attr("height",u.height)}let m=t.width<=u.width+t.padding?u.width+t.padding:t.width;t.width<=u.width+t.padding?t.diff=(m-t.width)/2-t.padding:t.diff=-t.padding;let d=t.height,x=t.x-m/2,D=t.y-d/2;Z.trace("Data ",t,JSON.stringify(t));let S;if(t.look==="handDrawn"){let B=w.svg(i),k=N(t,{roughness:.7,fill:r,stroke:f,fillWeight:4,seed:l}),M=B.path(yt(x,D,m,d,t.rx),k);S=i.insert(()=>(Z.debug("Rough node insert CXC",M),M),":first-child"),S.select("path:nth-child(2)").attr("style",s.join(";")),S.select("path").attr("style",e.join(";").replace("fill","stroke"))}else S=i.insert("rect",":first-child"),S.attr("style",c).attr("rx",t.rx).attr("ry",t.ry).attr("x",x).attr("y",D).attr("width",m).attr("height",d);let{subGraphTitleTopMargin:$}=At(g);if(n.attr("transform",`translate(${t.x-u.width/2}, ${t.y-t.height/2+$})`),a){let B=n.select("span");B&&B.attr("style",a)}let v=S.node().getBBox();return t.offsetX=0,t.width=v.width,t.height=v.height,t.offsetY=u.height-t.padding/2,t.intersect=function(B){return xt(t,B)},{cluster:i,labelBBox:u}}),"kanbanSection"),fe=b((y,t)=>{let g=U(),{themeVariables:o,handDrawnSeed:l}=g,{nodeBorder:r}=o,f=y.insert("g").attr("class",t.cssClasses).attr("id",t.id).attr("data-look",t.look),a=f.insert("g",":first-child"),c=0*t.padding,s=t.width+c;t.diff=-t.padding;let e=t.height+c,i=t.x-s/2,h=t.y-e/2;t.width=s;let n;if(t.look==="handDrawn"){let m=w.svg(f).rectangle(i,h,s,e,{fill:"lightgrey",roughness:.5,strokeLineDash:[5],stroke:r,seed:l});n=f.insert(()=>m,":first-child")}else n=a.insert("rect",":first-child"),n.attr("class","divider").attr("x",i).attr("y",h).attr("width",s).attr("height",e).attr("data-look",t.look);let p=n.node().getBBox();return t.height=p.height,t.offsetX=0,t.offsetY=0,t.intersect=function(u){return xt(t,u)},{cluster:f,labelBBox:{}}},"divider"),ye=Xt,pe={rect:Xt,squareRect:ye,roundedWithTitle:he,noteGroup:oe,divider:fe,kanbanSection:ge},Yt=new Map,Fe=b((y,t)=>C(null,null,function*(){let g=t.shape||"rect",o=yield pe[g](y,t);return Yt.set(t.id,o),o}),"insertCluster"),Ge=b(()=>{Yt=new Map},"clear");function qt(y,t){return y.intersect(t)}b(qt,"intersectNode");var ue=qt;function Ft(y,t,g,o){var l=y.x,r=y.y,f=l-o.x,a=r-o.y,c=Math.sqrt(t*t*a*a+g*g*f*f),s=Math.abs(t*g*f/c);o.x0}b(Ht,"sameSign");var me=Vt;function Zt(y,t,g){let o=y.x,l=y.y,r=[],f=Number.POSITIVE_INFINITY,a=Number.POSITIVE_INFINITY;typeof t.forEach=="function"?t.forEach(function(e){f=Math.min(f,e.x),a=Math.min(a,e.y)}):(f=Math.min(f,t.x),a=Math.min(a,t.y));let c=o-y.width/2-f,s=l-y.height/2-a;for(let e=0;e1&&r.sort(function(e,i){let h=e.x-g.x,n=e.y-g.y,p=Math.sqrt(h*h+n*n),u=i.x-g.x,m=i.y-g.y,d=Math.sqrt(u*u+m*m);return pe,":first-child");return i.attr("class","anchor").attr("style",st(a)),A(t,i),t.intersect=function(h){return Z.info("Circle intersect",t,f,h),P.circle(t,f,h)},r}b(Jt,"anchor");function Wt(y,t,g,o,l,r,f){let c=(y+g)/2,s=(t+o)/2,e=Math.atan2(o-t,g-y),i=(g-y)/2,h=(o-t)/2,n=i/l,p=h/r,u=Math.sqrt(n**2+p**2);if(u>1)throw new Error("The given radii are too small to create an arc between the points.");let m=Math.sqrt(1-u**2),d=c+m*r*Math.sin(e)*(f?-1:1),x=s-m*l*Math.cos(e)*(f?-1:1),D=Math.atan2((t-x)/r,(y-d)/l),$=Math.atan2((o-x)/r,(g-d)/l)-D;f&&$<0&&($+=2*Math.PI),!f&&$>0&&($-=2*Math.PI);let v=[];for(let B=0;B<20;B++){let k=B/19,M=D+k*$,I=d+l*Math.cos(M),Y=x+r*Math.sin(M);v.push({x:I,y:Y})}return v}b(Wt,"generateArcPoints");function Qt(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=r.width+t.padding+20,a=r.height+t.padding,c=a/2,s=c/(2.5+a/50),{cssStyles:e}=t,i=[{x:f/2,y:-a/2},{x:-f/2,y:-a/2},...Wt(-f/2,-a/2,-f/2,a/2,s,c,!1),{x:f/2,y:a/2},...Wt(f/2,a/2,f/2,-a/2,s,c,!0)],h=w.svg(l),n=N(t,{});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=z(i),u=h.path(p,n),m=l.insert(()=>u,":first-child");return m.attr("class","basic label-container"),e&&t.look!=="handDrawn"&&m.selectAll("path").attr("style",e),o&&t.look!=="handDrawn"&&m.selectAll("path").attr("style",o),m.attr("transform",`translate(${s/2}, 0)`),A(t,m),t.intersect=function(d){return P.polygon(t,i,d)},l})}b(Qt,"bowTieRect");function ht(y,t,g,o){return y.insert("polygon",":first-child").attr("points",o.map(function(l){return l.x+","+l.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-t/2+","+g/2+")")}b(ht,"insertPolygonShape");function Ut(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=r.height+t.padding,a=12,c=r.width+t.padding+a,s=0,e=c,i=-f,h=0,n=[{x:s+a,y:i},{x:e,y:i},{x:e,y:h},{x:s,y:h},{x:s,y:i+a},{x:s+a,y:i}],p,{cssStyles:u}=t;if(t.look==="handDrawn"){let m=w.svg(l),d=N(t,{}),x=z(n),D=m.path(x,d);p=l.insert(()=>D,":first-child").attr("transform",`translate(${-c/2}, ${f/2})`),u&&p.attr("style",u)}else p=ht(l,c,f,n);return o&&p.attr("style",o),A(t,p),t.intersect=function(m){return P.polygon(t,n,m)},l})}b(Ut,"card");function Kt(y,t){let{nodeStyles:g}=R(t);t.label="";let o=y.insert("g").attr("class",T(t)).attr("id",t.domId??t.id),{cssStyles:l}=t,r=Math.max(28,t.width??0),f=[{x:0,y:r/2},{x:r/2,y:0},{x:0,y:-r/2},{x:-r/2,y:0}],a=w.svg(o),c=N(t,{});t.look!=="handDrawn"&&(c.roughness=0,c.fillStyle="solid");let s=z(f),e=a.path(s,c),i=o.insert(()=>e,":first-child");return l&&t.look!=="handDrawn"&&i.selectAll("path").attr("style",l),g&&t.look!=="handDrawn"&&i.selectAll("path").attr("style",g),t.width=28,t.height=28,t.intersect=function(h){return P.polygon(t,f,h)},o}b(Kt,"choice");function It(y,t,g){return C(this,null,function*(){let{labelStyles:o,nodeStyles:l}=R(t);t.labelStyle=o;let{shapeSvg:r,bbox:f,halfPadding:a}=yield O(y,t,T(t)),c=g?.padding??a,s=f.width/2+c,e,{cssStyles:i}=t;if(t.look==="handDrawn"){let h=w.svg(r),n=N(t,{}),p=h.circle(0,0,s*2,n);e=r.insert(()=>p,":first-child"),e.attr("class","basic label-container").attr("style",st(i))}else e=r.insert("circle",":first-child").attr("class","basic label-container").attr("style",l).attr("r",s).attr("cx",0).attr("cy",0);return A(t,e),t.calcIntersect=function(h,n){let p=h.width/2;return P.circle(h,p,n)},t.intersect=function(h){return Z.info("Circle intersect",t,s,h),P.circle(t,s,h)},r})}b(It,"circle");function ts(y){let t=Math.cos(Math.PI/4),g=Math.sin(Math.PI/4),o=y*2,l={x:o/2*t,y:o/2*g},r={x:-(o/2)*t,y:o/2*g},f={x:-(o/2)*t,y:-(o/2)*g},a={x:o/2*t,y:-(o/2)*g};return`M ${r.x},${r.y} L ${a.x},${a.y} + M ${l.x},${l.y} L ${f.x},${f.y}`}b(ts,"createLine");function ss(y,t){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g,t.label="";let l=y.insert("g").attr("class",T(t)).attr("id",t.domId??t.id),r=Math.max(30,t?.width??0),{cssStyles:f}=t,a=w.svg(l),c=N(t,{});t.look!=="handDrawn"&&(c.roughness=0,c.fillStyle="solid");let s=a.circle(0,0,r*2,c),e=ts(r),i=a.path(e,c),h=l.insert(()=>s,":first-child");return h.insert(()=>i),f&&t.look!=="handDrawn"&&h.selectAll("path").attr("style",f),o&&t.look!=="handDrawn"&&h.selectAll("path").attr("style",o),A(t,h),t.intersect=function(n){return Z.info("crossedCircle intersect",t,{radius:r,point:n}),P.circle(t,r,n)},l}b(ss,"crossedCircle");function ct(y,t,g,o=100,l=0,r=180){let f=[],a=l*Math.PI/180,e=(r*Math.PI/180-a)/(o-1);for(let i=0;iD,":first-child").attr("stroke-opacity",0),S.insert(()=>d,":first-child"),S.attr("class","text"),e&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",e),o&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",o),S.attr("transform",`translate(${s}, 0)`),f.attr("transform",`translate(${-a/2+s-(r.x-(r.left??0))},${-c/2+(t.padding??0)/2-(r.y-(r.top??0))})`),A(t,S),t.intersect=function($){return P.polygon(t,h,$)},l})}b(es,"curlyBraceLeft");function ot(y,t,g,o=100,l=0,r=180){let f=[],a=l*Math.PI/180,e=(r*Math.PI/180-a)/(o-1);for(let i=0;iD,":first-child").attr("stroke-opacity",0),S.insert(()=>d,":first-child"),S.attr("class","text"),e&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",e),o&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",o),S.attr("transform",`translate(${-s}, 0)`),f.attr("transform",`translate(${-a/2+(t.padding??0)/2-(r.x-(r.left??0))},${-c/2+(t.padding??0)/2-(r.y-(r.top??0))})`),A(t,S),t.intersect=function($){return P.polygon(t,h,$)},l})}b(as,"curlyBraceRight");function K(y,t,g,o=100,l=0,r=180){let f=[],a=l*Math.PI/180,e=(r*Math.PI/180-a)/(o-1);for(let i=0;iB,":first-child").attr("stroke-opacity",0),k.insert(()=>x,":first-child"),k.insert(()=>$,":first-child"),k.attr("class","text"),e&&t.look!=="handDrawn"&&k.selectAll("path").attr("style",e),o&&t.look!=="handDrawn"&&k.selectAll("path").attr("style",o),k.attr("transform",`translate(${s-s/4}, 0)`),f.attr("transform",`translate(${-a/2+(t.padding??0)/2-(r.x-(r.left??0))},${-c/2+(t.padding??0)/2-(r.y-(r.top??0))})`),A(t,k),t.intersect=function(M){return P.polygon(t,n,M)},l})}b(rs,"curlyBraces");function is(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=80,a=20,c=Math.max(f,(r.width+(t.padding??0)*2)*1.25,t?.width??0),s=Math.max(a,r.height+(t.padding??0)*2,t?.height??0),e=s/2,{cssStyles:i}=t,h=w.svg(l),n=N(t,{});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=c,u=s,m=p-e,d=u/4,x=[{x:m,y:0},{x:d,y:0},{x:0,y:u/2},{x:d,y:u},{x:m,y:u},...kt(-m,-u/2,e,50,270,90)],D=z(x),S=h.path(D,n),$=l.insert(()=>S,":first-child");return $.attr("class","basic label-container"),i&&t.look!=="handDrawn"&&$.selectChildren("path").attr("style",i),o&&t.look!=="handDrawn"&&$.selectChildren("path").attr("style",o),$.attr("transform",`translate(${-c/2}, ${-s/2})`),A(t,$),t.intersect=function(v){return P.polygon(t,x,v)},l})}b(is,"curvedTrapezoid");var we=b((y,t,g,o,l,r)=>[`M${y},${t+r}`,`a${l},${r} 0,0,0 ${g},0`,`a${l},${r} 0,0,0 ${-g},0`,`l0,${o}`,`a${l},${r} 0,0,0 ${g},0`,`l0,${-o}`].join(" "),"createCylinderPathD"),be=b((y,t,g,o,l,r)=>[`M${y},${t+r}`,`M${y+g},${t+r}`,`a${l},${r} 0,0,0 ${-g},0`,`l0,${o}`,`a${l},${r} 0,0,0 ${g},0`,`l0,${-o}`].join(" "),"createOuterCylinderPathD"),Se=b((y,t,g,o,l,r)=>[`M${y-g/2},${-o/2}`,`a${l},${r} 0,0,0 ${g},0`].join(" "),"createInnerCylinderPathD");function ls(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+t.padding,t.width??0),c=a/2,s=c/(2.5+a/50),e=Math.max(r.height+s+t.padding,t.height??0),i,{cssStyles:h}=t;if(t.look==="handDrawn"){let n=w.svg(l),p=be(0,0,a,e,c,s),u=Se(0,s,a,e,c,s),m=n.path(p,N(t,{})),d=n.path(u,N(t,{fill:"none"}));i=l.insert(()=>d,":first-child"),i=l.insert(()=>m,":first-child"),i.attr("class","basic label-container"),h&&i.attr("style",h)}else{let n=we(0,0,a,e,c,s);i=l.insert("path",":first-child").attr("d",n).attr("class","basic label-container").attr("style",st(h)).attr("style",o)}return i.attr("label-offset-y",s),i.attr("transform",`translate(${-a/2}, ${-(e/2+s)})`),A(t,i),f.attr("transform",`translate(${-(r.width/2)-(r.x-(r.left??0))}, ${-(r.height/2)+(t.padding??0)/1.5-(r.y-(r.top??0))})`),t.intersect=function(n){let p=P.rect(t,n),u=p.x-(t.x??0);if(c!=0&&(Math.abs(u)<(t.width??0)/2||Math.abs(u)==(t.width??0)/2&&Math.abs(p.y-(t.y??0))>(t.height??0)/2-s)){let m=s*s*(1-u*u/(c*c));m>0&&(m=Math.sqrt(m)),m=s-m,n.y-(t.y??0)>0&&(m=-m),p.y+=m}return p},l})}b(ls,"cylinder");function ns(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=r.width+t.padding,c=r.height+t.padding,s=c*.2,e=-a/2,i=-c/2-s/2,{cssStyles:h}=t,n=w.svg(l),p=N(t,{});t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let u=[{x:e,y:i+s},{x:-e,y:i+s},{x:-e,y:-i},{x:e,y:-i},{x:e,y:i},{x:-e,y:i},{x:-e,y:i+s}],m=n.polygon(u.map(x=>[x.x,x.y]),p),d=l.insert(()=>m,":first-child");return d.attr("class","basic label-container"),h&&t.look!=="handDrawn"&&d.selectAll("path").attr("style",h),o&&t.look!=="handDrawn"&&d.selectAll("path").attr("style",o),f.attr("transform",`translate(${e+(t.padding??0)/2-(r.x-(r.left??0))}, ${i+s+(t.padding??0)/2-(r.y-(r.top??0))})`),A(t,d),t.intersect=function(x){return P.rect(t,x)},l})}b(ns,"dividedRectangle");function cs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,halfPadding:f}=yield O(y,t,T(t)),c=r.width/2+f+5,s=r.width/2+f,e,{cssStyles:i}=t;if(t.look==="handDrawn"){let h=w.svg(l),n=N(t,{roughness:.2,strokeWidth:2.5}),p=N(t,{roughness:.2,strokeWidth:1.5}),u=h.circle(0,0,c*2,n),m=h.circle(0,0,s*2,p);e=l.insert("g",":first-child"),e.attr("class",st(t.cssClasses)).attr("style",st(i)),e.node()?.appendChild(u),e.node()?.appendChild(m)}else{e=l.insert("g",":first-child");let h=e.insert("circle",":first-child"),n=e.insert("circle");e.attr("class","basic label-container").attr("style",o),h.attr("class","outer-circle").attr("style",o).attr("r",c).attr("cx",0).attr("cy",0),n.attr("class","inner-circle").attr("style",o).attr("r",s).attr("cx",0).attr("cy",0)}return A(t,e),t.intersect=function(h){return Z.info("DoubleCircle intersect",t,c,h),P.circle(t,c,h)},l})}b(cs,"doublecircle");function os(y,t,{config:{themeVariables:g}}){let{labelStyles:o,nodeStyles:l}=R(t);t.label="",t.labelStyle=o;let r=y.insert("g").attr("class",T(t)).attr("id",t.domId??t.id),f=7,{cssStyles:a}=t,c=w.svg(r),{nodeBorder:s}=g,e=N(t,{fillStyle:"solid"});t.look!=="handDrawn"&&(e.roughness=0);let i=c.circle(0,0,f*2,e),h=r.insert(()=>i,":first-child");return h.selectAll("path").attr("style",`fill: ${s} !important;`),a&&a.length>0&&t.look!=="handDrawn"&&h.selectAll("path").attr("style",a),l&&t.look!=="handDrawn"&&h.selectAll("path").attr("style",l),A(t,h),t.intersect=function(n){return Z.info("filledCircle intersect",t,{radius:f,point:n}),P.circle(t,f,n)},r}b(os,"filledCircle");function hs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=r.width+(t.padding??0),c=a+r.height,s=a+r.height,e=[{x:0,y:-c},{x:s,y:-c},{x:s/2,y:0}],{cssStyles:i}=t,h=w.svg(l),n=N(t,{});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=z(e),u=h.path(p,n),m=l.insert(()=>u,":first-child").attr("transform",`translate(${-c/2}, ${c/2})`);return i&&t.look!=="handDrawn"&&m.selectChildren("path").attr("style",i),o&&t.look!=="handDrawn"&&m.selectChildren("path").attr("style",o),t.width=a,t.height=c,A(t,m),f.attr("transform",`translate(${-r.width/2-(r.x-(r.left??0))}, ${-c/2+(t.padding??0)/2+(r.y-(r.top??0))})`),t.intersect=function(d){return Z.info("Triangle intersect",t,e,d),P.polygon(t,e,d)},l})}b(hs,"flippedTriangle");function gs(y,t,{dir:g,config:{state:o,themeVariables:l}}){let{nodeStyles:r}=R(t);t.label="";let f=y.insert("g").attr("class",T(t)).attr("id",t.domId??t.id),{cssStyles:a}=t,c=Math.max(70,t?.width??0),s=Math.max(10,t?.height??0);g==="LR"&&(c=Math.max(10,t?.width??0),s=Math.max(70,t?.height??0));let e=-1*c/2,i=-1*s/2,h=w.svg(f),n=N(t,{stroke:l.lineColor,fill:l.lineColor});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=h.rectangle(e,i,c,s,n),u=f.insert(()=>p,":first-child");a&&t.look!=="handDrawn"&&u.selectAll("path").attr("style",a),r&&t.look!=="handDrawn"&&u.selectAll("path").attr("style",r),A(t,u);let m=o?.padding??0;return t.width&&t.height&&(t.width+=m/2||0,t.height+=m/2||0),t.intersect=function(d){return P.rect(t,d)},f}b(gs,"forkJoin");function fs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let l=80,r=50,{shapeSvg:f,bbox:a}=yield O(y,t,T(t)),c=Math.max(l,a.width+(t.padding??0)*2,t?.width??0),s=Math.max(r,a.height+(t.padding??0)*2,t?.height??0),e=s/2,{cssStyles:i}=t,h=w.svg(f),n=N(t,{});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=[{x:-c/2,y:-s/2},{x:c/2-e,y:-s/2},...kt(-c/2+e,0,e,50,90,270),{x:c/2-e,y:s/2},{x:-c/2,y:s/2}],u=z(p),m=h.path(u,n),d=f.insert(()=>m,":first-child");return d.attr("class","basic label-container"),i&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",i),o&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",o),A(t,d),t.intersect=function(x){return Z.info("Pill intersect",t,{radius:e,point:x}),P.polygon(t,p,x)},f})}b(fs,"halfRoundedRectangle");var $e=b((y,t,g,o,l)=>[`M${y+l},${t}`,`L${y+g-l},${t}`,`L${y+g},${t-o/2}`,`L${y+g-l},${t-o}`,`L${y+l},${t-o}`,`L${y},${t-o/2}`,"Z"].join(" "),"createHexagonPathD");function ys(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=4,a=r.height+t.padding,c=a/f,s=r.width+2*c+t.padding,e=[{x:c,y:0},{x:s-c,y:0},{x:s,y:-a/2},{x:s-c,y:-a},{x:c,y:-a},{x:0,y:-a/2}],i,{cssStyles:h}=t;if(t.look==="handDrawn"){let n=w.svg(l),p=N(t,{}),u=$e(0,0,s,a,c),m=n.path(u,p);i=l.insert(()=>m,":first-child").attr("transform",`translate(${-s/2}, ${a/2})`),h&&i.attr("style",h)}else i=ht(l,s,a,e);return o&&i.attr("style",o),t.width=s,t.height=a,A(t,i),t.intersect=function(n){return P.polygon(t,e,n)},l})}b(ys,"hexagon");function ps(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.label="",t.labelStyle=g;let{shapeSvg:l}=yield O(y,t,T(t)),r=Math.max(30,t?.width??0),f=Math.max(30,t?.height??0),{cssStyles:a}=t,c=w.svg(l),s=N(t,{});t.look!=="handDrawn"&&(s.roughness=0,s.fillStyle="solid");let e=[{x:0,y:0},{x:r,y:0},{x:0,y:f},{x:r,y:f}],i=z(e),h=c.path(i,s),n=l.insert(()=>h,":first-child");return n.attr("class","basic label-container"),a&&t.look!=="handDrawn"&&n.selectChildren("path").attr("style",a),o&&t.look!=="handDrawn"&&n.selectChildren("path").attr("style",o),n.attr("transform",`translate(${-r/2}, ${-f/2})`),A(t,n),t.intersect=function(p){return Z.info("Pill intersect",t,{points:e}),P.polygon(t,e,p)},l})}b(ps,"hourglass");function us(l,r,f){return C(this,arguments,function*(y,t,{config:{themeVariables:g,flowchart:o}}){let{labelStyles:a}=R(t);t.labelStyle=a;let c=t.assetHeight??48,s=t.assetWidth??48,e=Math.max(c,s),i=o?.wrappingWidth;t.width=Math.max(e,i??0);let{shapeSvg:h,bbox:n,label:p}=yield O(y,t,"icon-shape default"),u=t.pos==="t",m=e,d=e,{nodeBorder:x}=g,{stylesMap:D}=St(t),S=-d/2,$=-m/2,v=t.label?8:0,B=w.svg(h),k=N(t,{stroke:"none",fill:"none"});t.look!=="handDrawn"&&(k.roughness=0,k.fillStyle="solid");let M=B.rectangle(S,$,d,m,k),I=Math.max(d,n.width),Y=m+n.height+v,V=B.rectangle(-I/2,-Y/2,I,Y,rt(tt({},k),{fill:"transparent",stroke:"none"})),q=h.insert(()=>M,":first-child"),W=h.insert(()=>V);if(t.icon){let j=h.append("g");j.html(`${yield $t(t.icon,{height:e,width:e,fallbackPrefix:""})}`);let L=j.node().getBBox(),F=L.width,_=L.height,H=L.x,X=L.y;j.attr("transform",`translate(${-F/2-H},${u?n.height/2+v/2-_/2-X:-n.height/2-v/2-_/2-X})`),j.attr("style",`color: ${D.get("stroke")??x};`)}return p.attr("transform",`translate(${-n.width/2-(n.x-(n.left??0))},${u?-Y/2:Y/2-n.height})`),q.attr("transform",`translate(0,${u?n.height/2+v/2:-n.height/2-v/2})`),A(t,W),t.intersect=function(j){if(Z.info("iconSquare intersect",t,j),!t.label)return P.rect(t,j);let L=t.x??0,F=t.y??0,_=t.height??0,H=[];return u?H=[{x:L-n.width/2,y:F-_/2},{x:L+n.width/2,y:F-_/2},{x:L+n.width/2,y:F-_/2+n.height+v},{x:L+d/2,y:F-_/2+n.height+v},{x:L+d/2,y:F+_/2},{x:L-d/2,y:F+_/2},{x:L-d/2,y:F-_/2+n.height+v},{x:L-n.width/2,y:F-_/2+n.height+v}]:H=[{x:L-d/2,y:F-_/2},{x:L+d/2,y:F-_/2},{x:L+d/2,y:F-_/2+m},{x:L+n.width/2,y:F-_/2+m},{x:L+n.width/2/2,y:F+_/2},{x:L-n.width/2,y:F+_/2},{x:L-n.width/2,y:F-_/2+m},{x:L-d/2,y:F-_/2+m}],P.polygon(t,H,j)},h})}b(us,"icon");function ds(l,r,f){return C(this,arguments,function*(y,t,{config:{themeVariables:g,flowchart:o}}){let{labelStyles:a}=R(t);t.labelStyle=a;let c=t.assetHeight??48,s=t.assetWidth??48,e=Math.max(c,s),i=o?.wrappingWidth;t.width=Math.max(e,i??0);let{shapeSvg:h,bbox:n,label:p}=yield O(y,t,"icon-shape default"),u=20,m=t.label?8:0,d=t.pos==="t",{nodeBorder:x,mainBkg:D}=g,{stylesMap:S}=St(t),$=w.svg(h),v=N(t,{});t.look!=="handDrawn"&&(v.roughness=0,v.fillStyle="solid");let B=S.get("fill");v.stroke=B??D;let k=h.append("g");t.icon&&k.html(`${yield $t(t.icon,{height:e,width:e,fallbackPrefix:""})}`);let M=k.node().getBBox(),I=M.width,Y=M.height,V=M.x,q=M.y,W=Math.max(I,Y)*Math.SQRT2+u*2,j=$.circle(0,0,W,v),L=Math.max(W,n.width),F=W+n.height+m,_=$.rectangle(-L/2,-F/2,L,F,rt(tt({},v),{fill:"transparent",stroke:"none"})),H=h.insert(()=>j,":first-child"),X=h.insert(()=>_);return k.attr("transform",`translate(${-I/2-V},${d?n.height/2+m/2-Y/2-q:-n.height/2-m/2-Y/2-q})`),k.attr("style",`color: ${S.get("stroke")??x};`),p.attr("transform",`translate(${-n.width/2-(n.x-(n.left??0))},${d?-F/2:F/2-n.height})`),H.attr("transform",`translate(0,${d?n.height/2+m/2:-n.height/2-m/2})`),A(t,X),t.intersect=function(E){return Z.info("iconSquare intersect",t,E),P.rect(t,E)},h})}b(ds,"iconCircle");function ms(l,r,f){return C(this,arguments,function*(y,t,{config:{themeVariables:g,flowchart:o}}){let{labelStyles:a}=R(t);t.labelStyle=a;let c=t.assetHeight??48,s=t.assetWidth??48,e=Math.max(c,s),i=o?.wrappingWidth;t.width=Math.max(e,i??0);let{shapeSvg:h,bbox:n,halfPadding:p,label:u}=yield O(y,t,"icon-shape default"),m=t.pos==="t",d=e+p*2,x=e+p*2,{nodeBorder:D,mainBkg:S}=g,{stylesMap:$}=St(t),v=-x/2,B=-d/2,k=t.label?8:0,M=w.svg(h),I=N(t,{});t.look!=="handDrawn"&&(I.roughness=0,I.fillStyle="solid");let Y=$.get("fill");I.stroke=Y??S;let V=M.path(yt(v,B,x,d,5),I),q=Math.max(x,n.width),W=d+n.height+k,j=M.rectangle(-q/2,-W/2,q,W,rt(tt({},I),{fill:"transparent",stroke:"none"})),L=h.insert(()=>V,":first-child").attr("class","icon-shape2"),F=h.insert(()=>j);if(t.icon){let _=h.append("g");_.html(`${yield $t(t.icon,{height:e,width:e,fallbackPrefix:""})}`);let H=_.node().getBBox(),X=H.width,E=H.height,G=H.x,J=H.y;_.attr("transform",`translate(${-X/2-G},${m?n.height/2+k/2-E/2-J:-n.height/2-k/2-E/2-J})`),_.attr("style",`color: ${$.get("stroke")??D};`)}return u.attr("transform",`translate(${-n.width/2-(n.x-(n.left??0))},${m?-W/2:W/2-n.height})`),L.attr("transform",`translate(0,${m?n.height/2+k/2:-n.height/2-k/2})`),A(t,F),t.intersect=function(_){if(Z.info("iconSquare intersect",t,_),!t.label)return P.rect(t,_);let H=t.x??0,X=t.y??0,E=t.height??0,G=[];return m?G=[{x:H-n.width/2,y:X-E/2},{x:H+n.width/2,y:X-E/2},{x:H+n.width/2,y:X-E/2+n.height+k},{x:H+x/2,y:X-E/2+n.height+k},{x:H+x/2,y:X+E/2},{x:H-x/2,y:X+E/2},{x:H-x/2,y:X-E/2+n.height+k},{x:H-n.width/2,y:X-E/2+n.height+k}]:G=[{x:H-x/2,y:X-E/2},{x:H+x/2,y:X-E/2},{x:H+x/2,y:X-E/2+d},{x:H+n.width/2,y:X-E/2+d},{x:H+n.width/2/2,y:X+E/2},{x:H-n.width/2,y:X+E/2},{x:H-n.width/2,y:X-E/2+d},{x:H-x/2,y:X-E/2+d}],P.polygon(t,G,_)},h})}b(ms,"iconRounded");function xs(l,r,f){return C(this,arguments,function*(y,t,{config:{themeVariables:g,flowchart:o}}){let{labelStyles:a}=R(t);t.labelStyle=a;let c=t.assetHeight??48,s=t.assetWidth??48,e=Math.max(c,s),i=o?.wrappingWidth;t.width=Math.max(e,i??0);let{shapeSvg:h,bbox:n,halfPadding:p,label:u}=yield O(y,t,"icon-shape default"),m=t.pos==="t",d=e+p*2,x=e+p*2,{nodeBorder:D,mainBkg:S}=g,{stylesMap:$}=St(t),v=-x/2,B=-d/2,k=t.label?8:0,M=w.svg(h),I=N(t,{});t.look!=="handDrawn"&&(I.roughness=0,I.fillStyle="solid");let Y=$.get("fill");I.stroke=Y??S;let V=M.path(yt(v,B,x,d,.1),I),q=Math.max(x,n.width),W=d+n.height+k,j=M.rectangle(-q/2,-W/2,q,W,rt(tt({},I),{fill:"transparent",stroke:"none"})),L=h.insert(()=>V,":first-child"),F=h.insert(()=>j);if(t.icon){let _=h.append("g");_.html(`${yield $t(t.icon,{height:e,width:e,fallbackPrefix:""})}`);let H=_.node().getBBox(),X=H.width,E=H.height,G=H.x,J=H.y;_.attr("transform",`translate(${-X/2-G},${m?n.height/2+k/2-E/2-J:-n.height/2-k/2-E/2-J})`),_.attr("style",`color: ${$.get("stroke")??D};`)}return u.attr("transform",`translate(${-n.width/2-(n.x-(n.left??0))},${m?-W/2:W/2-n.height})`),L.attr("transform",`translate(0,${m?n.height/2+k/2:-n.height/2-k/2})`),A(t,F),t.intersect=function(_){if(Z.info("iconSquare intersect",t,_),!t.label)return P.rect(t,_);let H=t.x??0,X=t.y??0,E=t.height??0,G=[];return m?G=[{x:H-n.width/2,y:X-E/2},{x:H+n.width/2,y:X-E/2},{x:H+n.width/2,y:X-E/2+n.height+k},{x:H+x/2,y:X-E/2+n.height+k},{x:H+x/2,y:X+E/2},{x:H-x/2,y:X+E/2},{x:H-x/2,y:X-E/2+n.height+k},{x:H-n.width/2,y:X-E/2+n.height+k}]:G=[{x:H-x/2,y:X-E/2},{x:H+x/2,y:X-E/2},{x:H+x/2,y:X-E/2+d},{x:H+n.width/2,y:X-E/2+d},{x:H+n.width/2/2,y:X+E/2},{x:H-n.width/2,y:X+E/2},{x:H-n.width/2,y:X-E/2+d},{x:H-x/2,y:X-E/2+d}],P.polygon(t,G,_)},h})}b(xs,"iconSquare");function ws(o,l,r){return C(this,arguments,function*(y,t,{config:{flowchart:g}}){let f=new Image;f.src=t?.img??"",yield f.decode();let a=Number(f.naturalWidth.toString().replace("px","")),c=Number(f.naturalHeight.toString().replace("px",""));t.imageAspectRatio=a/c;let{labelStyles:s}=R(t);t.labelStyle=s;let e=g?.wrappingWidth;t.defaultWidth=g?.wrappingWidth;let i=Math.max(t.label?e??0:0,t?.assetWidth??a),h=t.constraint==="on"&&t?.assetHeight?t.assetHeight*t.imageAspectRatio:i,n=t.constraint==="on"?h/t.imageAspectRatio:t?.assetHeight??c;t.width=Math.max(h,e??0);let{shapeSvg:p,bbox:u,label:m}=yield O(y,t,"image-shape default"),d=t.pos==="t",x=-h/2,D=-n/2,S=t.label?8:0,$=w.svg(p),v=N(t,{});t.look!=="handDrawn"&&(v.roughness=0,v.fillStyle="solid");let B=$.rectangle(x,D,h,n,v),k=Math.max(h,u.width),M=n+u.height+S,I=$.rectangle(-k/2,-M/2,k,M,rt(tt({},v),{fill:"none",stroke:"none"})),Y=p.insert(()=>B,":first-child"),V=p.insert(()=>I);if(t.img){let q=p.append("image");q.attr("href",t.img),q.attr("width",h),q.attr("height",n),q.attr("preserveAspectRatio","none"),q.attr("transform",`translate(${-h/2},${d?M/2-n:-M/2})`)}return m.attr("transform",`translate(${-u.width/2-(u.x-(u.left??0))},${d?-n/2-u.height/2-S/2:n/2-u.height/2+S/2})`),Y.attr("transform",`translate(0,${d?u.height/2+S/2:-u.height/2-S/2})`),A(t,V),t.intersect=function(q){if(Z.info("iconSquare intersect",t,q),!t.label)return P.rect(t,q);let W=t.x??0,j=t.y??0,L=t.height??0,F=[];return d?F=[{x:W-u.width/2,y:j-L/2},{x:W+u.width/2,y:j-L/2},{x:W+u.width/2,y:j-L/2+u.height+S},{x:W+h/2,y:j-L/2+u.height+S},{x:W+h/2,y:j+L/2},{x:W-h/2,y:j+L/2},{x:W-h/2,y:j-L/2+u.height+S},{x:W-u.width/2,y:j-L/2+u.height+S}]:F=[{x:W-h/2,y:j-L/2},{x:W+h/2,y:j-L/2},{x:W+h/2,y:j-L/2+n},{x:W+u.width/2,y:j-L/2+n},{x:W+u.width/2/2,y:j+L/2},{x:W-u.width/2,y:j+L/2},{x:W-u.width/2,y:j-L/2+n},{x:W-h/2,y:j-L/2+n}],P.polygon(t,F,q)},p})}b(ws,"imageSquare");function bs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=Math.max(r.width+(t.padding??0)*2,t?.width??0),a=Math.max(r.height+(t.padding??0)*2,t?.height??0),c=[{x:0,y:0},{x:f,y:0},{x:f+3*a/6,y:-a},{x:-3*a/6,y:-a}],s,{cssStyles:e}=t;if(t.look==="handDrawn"){let i=w.svg(l),h=N(t,{}),n=z(c),p=i.path(n,h);s=l.insert(()=>p,":first-child").attr("transform",`translate(${-f/2}, ${a/2})`),e&&s.attr("style",e)}else s=ht(l,f,a,c);return o&&s.attr("style",o),t.width=f,t.height=a,A(t,s),t.intersect=function(i){return P.polygon(t,c,i)},l})}b(bs,"inv_trapezoid");function Dt(y,t,g){return C(this,null,function*(){let{labelStyles:o,nodeStyles:l}=R(t);t.labelStyle=o;let{shapeSvg:r,bbox:f}=yield O(y,t,T(t)),a=Math.max(f.width+g.labelPaddingX*2,t?.width||0),c=Math.max(f.height+g.labelPaddingY*2,t?.height||0),s=-a/2,e=-c/2,i,{rx:h,ry:n}=t,{cssStyles:p}=t;if(g?.rx&&g.ry&&(h=g.rx,n=g.ry),t.look==="handDrawn"){let u=w.svg(r),m=N(t,{}),d=h||n?u.path(yt(s,e,a,c,h||0),m):u.rectangle(s,e,a,c,m);i=r.insert(()=>d,":first-child"),i.attr("class","basic label-container").attr("style",st(p))}else i=r.insert("rect",":first-child"),i.attr("class","basic label-container").attr("style",l).attr("rx",st(h)).attr("ry",st(n)).attr("x",s).attr("y",e).attr("width",a).attr("height",c);return A(t,i),t.calcIntersect=function(u,m){return P.rect(u,m)},t.intersect=function(u){return P.rect(t,u)},r})}b(Dt,"drawRect");function Ss(y,t){return C(this,null,function*(){let{shapeSvg:g,bbox:o,label:l}=yield O(y,t,"label"),r=g.insert("rect",":first-child");return r.attr("width",.1).attr("height",.1),g.attr("class","label edgeLabel"),l.attr("transform",`translate(${-(o.width/2)-(o.x-(o.left??0))}, ${-(o.height/2)-(o.y-(o.top??0))})`),A(t,r),t.intersect=function(c){return P.rect(t,c)},g})}b(Ss,"labelRect");function $s(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=Math.max(r.width+(t.padding??0),t?.width??0),a=Math.max(r.height+(t.padding??0),t?.height??0),c=[{x:0,y:0},{x:f+3*a/6,y:0},{x:f,y:-a},{x:-(3*a)/6,y:-a}],s,{cssStyles:e}=t;if(t.look==="handDrawn"){let i=w.svg(l),h=N(t,{}),n=z(c),p=i.path(n,h);s=l.insert(()=>p,":first-child").attr("transform",`translate(${-f/2}, ${a/2})`),e&&s.attr("style",e)}else s=ht(l,f,a,c);return o&&s.attr("style",o),t.width=f,t.height=a,A(t,s),t.intersect=function(i){return P.polygon(t,c,i)},l})}b($s,"lean_left");function vs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=Math.max(r.width+(t.padding??0),t?.width??0),a=Math.max(r.height+(t.padding??0),t?.height??0),c=[{x:-3*a/6,y:0},{x:f,y:0},{x:f+3*a/6,y:-a},{x:0,y:-a}],s,{cssStyles:e}=t;if(t.look==="handDrawn"){let i=w.svg(l),h=N(t,{}),n=z(c),p=i.path(n,h);s=l.insert(()=>p,":first-child").attr("transform",`translate(${-f/2}, ${a/2})`),e&&s.attr("style",e)}else s=ht(l,f,a,c);return o&&s.attr("style",o),t.width=f,t.height=a,A(t,s),t.intersect=function(i){return P.polygon(t,c,i)},l})}b(vs,"lean_right");function ks(y,t){let{labelStyles:g,nodeStyles:o}=R(t);t.label="",t.labelStyle=g;let l=y.insert("g").attr("class",T(t)).attr("id",t.domId??t.id),{cssStyles:r}=t,f=Math.max(35,t?.width??0),a=Math.max(35,t?.height??0),c=7,s=[{x:f,y:0},{x:0,y:a+c/2},{x:f-2*c,y:a+c/2},{x:0,y:2*a},{x:f,y:a-c/2},{x:2*c,y:a-c/2}],e=w.svg(l),i=N(t,{});t.look!=="handDrawn"&&(i.roughness=0,i.fillStyle="solid");let h=z(s),n=e.path(h,i),p=l.insert(()=>n,":first-child");return r&&t.look!=="handDrawn"&&p.selectAll("path").attr("style",r),o&&t.look!=="handDrawn"&&p.selectAll("path").attr("style",o),p.attr("transform",`translate(-${f/2},${-a})`),A(t,p),t.intersect=function(u){return Z.info("lightningBolt intersect",t,u),P.polygon(t,s,u)},l}b(ks,"lightningBolt");var ve=b((y,t,g,o,l,r,f)=>[`M${y},${t+r}`,`a${l},${r} 0,0,0 ${g},0`,`a${l},${r} 0,0,0 ${-g},0`,`l0,${o}`,`a${l},${r} 0,0,0 ${g},0`,`l0,${-o}`,`M${y},${t+r+f}`,`a${l},${r} 0,0,0 ${g},0`].join(" "),"createCylinderPathD"),ke=b((y,t,g,o,l,r,f)=>[`M${y},${t+r}`,`M${y+g},${t+r}`,`a${l},${r} 0,0,0 ${-g},0`,`l0,${o}`,`a${l},${r} 0,0,0 ${g},0`,`l0,${-o}`,`M${y},${t+r+f}`,`a${l},${r} 0,0,0 ${g},0`].join(" "),"createOuterCylinderPathD"),De=b((y,t,g,o,l,r)=>[`M${y-g/2},${-o/2}`,`a${l},${r} 0,0,0 ${g},0`].join(" "),"createInnerCylinderPathD");function Ds(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0),t.width??0),c=a/2,s=c/(2.5+a/50),e=Math.max(r.height+s+(t.padding??0),t.height??0),i=e*.1,h,{cssStyles:n}=t;if(t.look==="handDrawn"){let p=w.svg(l),u=ke(0,0,a,e,c,s,i),m=De(0,s,a,e,c,s),d=N(t,{}),x=p.path(u,d),D=p.path(m,d);l.insert(()=>D,":first-child").attr("class","line"),h=l.insert(()=>x,":first-child"),h.attr("class","basic label-container"),n&&h.attr("style",n)}else{let p=ve(0,0,a,e,c,s,i);h=l.insert("path",":first-child").attr("d",p).attr("class","basic label-container").attr("style",st(n)).attr("style",o)}return h.attr("label-offset-y",s),h.attr("transform",`translate(${-a/2}, ${-(e/2+s)})`),A(t,h),f.attr("transform",`translate(${-(r.width/2)-(r.x-(r.left??0))}, ${-(r.height/2)+s-(r.y-(r.top??0))})`),t.intersect=function(p){let u=P.rect(t,p),m=u.x-(t.x??0);if(c!=0&&(Math.abs(m)<(t.width??0)/2||Math.abs(m)==(t.width??0)/2&&Math.abs(u.y-(t.y??0))>(t.height??0)/2-s)){let d=s*s*(1-m*m/(c*c));d>0&&(d=Math.sqrt(d)),d=s-d,p.y-(t.y??0)>0&&(d=-d),u.y+=d}return u},l})}b(Ds,"linedCylinder");function Bs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=c/4,e=c+s,{cssStyles:i}=t,h=w.svg(l),n=N(t,{});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=[{x:-a/2-a/2*.1,y:-e/2},{x:-a/2-a/2*.1,y:e/2},...ft(-a/2-a/2*.1,e/2,a/2+a/2*.1,e/2,s,.8),{x:a/2+a/2*.1,y:-e/2},{x:-a/2-a/2*.1,y:-e/2},{x:-a/2,y:-e/2},{x:-a/2,y:e/2*1.1},{x:-a/2,y:-e/2}],u=h.polygon(p.map(d=>[d.x,d.y]),n),m=l.insert(()=>u,":first-child");return m.attr("class","basic label-container"),i&&t.look!=="handDrawn"&&m.selectAll("path").attr("style",i),o&&t.look!=="handDrawn"&&m.selectAll("path").attr("style",o),m.attr("transform",`translate(0,${-s/2})`),f.attr("transform",`translate(${-a/2+(t.padding??0)+a/2*.1/2-(r.x-(r.left??0))},${-c/2+(t.padding??0)-s/2-(r.y-(r.top??0))})`),A(t,m),t.intersect=function(d){return P.polygon(t,p,d)},l})}b(Bs,"linedWaveEdgedRect");function Ms(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=5,e=-a/2,i=-c/2,{cssStyles:h}=t,n=w.svg(l),p=N(t,{}),u=[{x:e-s,y:i+s},{x:e-s,y:i+c+s},{x:e+a-s,y:i+c+s},{x:e+a-s,y:i+c},{x:e+a,y:i+c},{x:e+a,y:i+c-s},{x:e+a+s,y:i+c-s},{x:e+a+s,y:i-s},{x:e+s,y:i-s},{x:e+s,y:i},{x:e,y:i},{x:e,y:i+s}],m=[{x:e,y:i+s},{x:e+a-s,y:i+s},{x:e+a-s,y:i+c},{x:e+a,y:i+c},{x:e+a,y:i},{x:e,y:i}];t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let d=z(u),x=n.path(d,p),D=z(m),S=n.path(D,rt(tt({},p),{fill:"none"})),$=l.insert(()=>S,":first-child");return $.insert(()=>x,":first-child"),$.attr("class","basic label-container"),h&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",h),o&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",o),f.attr("transform",`translate(${-(r.width/2)-s-(r.x-(r.left??0))}, ${-(r.height/2)+s-(r.y-(r.top??0))})`),A(t,$),t.intersect=function(v){return P.polygon(t,u,v)},l})}b(Ms,"multiRect");function Cs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=c/4,e=c+s,i=-a/2,h=-e/2,n=5,{cssStyles:p}=t,u=ft(i-n,h+e+n,i+a-n,h+e+n,s,.8),m=u?.[u.length-1],d=[{x:i-n,y:h+n},{x:i-n,y:h+e+n},...u,{x:i+a-n,y:m.y-n},{x:i+a,y:m.y-n},{x:i+a,y:m.y-2*n},{x:i+a+n,y:m.y-2*n},{x:i+a+n,y:h-n},{x:i+n,y:h-n},{x:i+n,y:h},{x:i,y:h},{x:i,y:h+n}],x=[{x:i,y:h+n},{x:i+a-n,y:h+n},{x:i+a-n,y:m.y-n},{x:i+a,y:m.y-n},{x:i+a,y:h},{x:i,y:h}],D=w.svg(l),S=N(t,{});t.look!=="handDrawn"&&(S.roughness=0,S.fillStyle="solid");let $=z(d),v=D.path($,S),B=z(x),k=D.path(B,S),M=l.insert(()=>v,":first-child");return M.insert(()=>k),M.attr("class","basic label-container"),p&&t.look!=="handDrawn"&&M.selectAll("path").attr("style",p),o&&t.look!=="handDrawn"&&M.selectAll("path").attr("style",o),M.attr("transform",`translate(0,${-s/2})`),f.attr("transform",`translate(${-(r.width/2)-n-(r.x-(r.left??0))}, ${-(r.height/2)+n-s/2-(r.y-(r.top??0))})`),A(t,M),t.intersect=function(I){return P.polygon(t,d,I)},l})}b(Cs,"multiWaveEdgedRectangle");function Ps(o,l,r){return C(this,arguments,function*(y,t,{config:{themeVariables:g}}){let{labelStyles:f,nodeStyles:a}=R(t);t.labelStyle=f,t.useHtmlLabels||it(dt())||(t.centerLabel=!0);let{shapeSvg:s,bbox:e,label:i}=yield O(y,t,T(t)),h=Math.max(e.width+(t.padding??0)*2,t?.width??0),n=Math.max(e.height+(t.padding??0)*2,t?.height??0),p=-h/2,u=-n/2,{cssStyles:m}=t,d=w.svg(s),x=N(t,{fill:g.noteBkgColor,stroke:g.noteBorderColor});t.look!=="handDrawn"&&(x.roughness=0,x.fillStyle="solid");let D=d.rectangle(p,u,h,n,x),S=s.insert(()=>D,":first-child");return S.attr("class","basic label-container"),m&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",m),a&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",a),i.attr("transform",`translate(${-e.width/2-(e.x-(e.left??0))}, ${-(e.height/2)-(e.y-(e.top??0))})`),A(t,S),t.intersect=function($){return P.rect(t,$)},s})}b(Ps,"note");var Be=b((y,t,g)=>[`M${y+g/2},${t}`,`L${y+g},${t-g/2}`,`L${y+g/2},${t-g}`,`L${y},${t-g/2}`,"Z"].join(" "),"createDecisionBoxPathD");function Ns(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=r.width+t.padding,a=r.height+t.padding,c=f+a,s=.5,e=[{x:c/2,y:0},{x:c,y:-c/2},{x:c/2,y:-c},{x:0,y:-c/2}],i,{cssStyles:h}=t;if(t.look==="handDrawn"){let n=w.svg(l),p=N(t,{}),u=Be(0,0,c),m=n.path(u,p);i=l.insert(()=>m,":first-child").attr("transform",`translate(${-c/2+s}, ${c/2})`),h&&i.attr("style",h)}else i=ht(l,c,c,e),i.attr("transform",`translate(${-c/2+s}, ${c/2})`);return o&&i.attr("style",o),A(t,i),t.calcIntersect=function(n,p){let u=n.width,m=[{x:u/2,y:0},{x:u,y:-u/2},{x:u/2,y:-u},{x:0,y:-u/2}],d=P.polygon(n,m,p);return{x:d.x-.5,y:d.y-.5}},t.intersect=function(n){return this.calcIntersect(t,n)},l})}b(Ns,"question");function Rs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0),t?.width??0),c=Math.max(r.height+(t.padding??0),t?.height??0),s=-a/2,e=-c/2,i=e/2,h=[{x:s+i,y:e},{x:s,y:0},{x:s+i,y:-e},{x:-s,y:-e},{x:-s,y:e}],{cssStyles:n}=t,p=w.svg(l),u=N(t,{});t.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let m=z(h),d=p.path(m,u),x=l.insert(()=>d,":first-child");return x.attr("class","basic label-container"),n&&t.look!=="handDrawn"&&x.selectAll("path").attr("style",n),o&&t.look!=="handDrawn"&&x.selectAll("path").attr("style",o),x.attr("transform",`translate(${-i/2},0)`),f.attr("transform",`translate(${-i/2-r.width/2-(r.x-(r.left??0))}, ${-(r.height/2)-(r.y-(r.top??0))})`),A(t,x),t.intersect=function(D){return P.polygon(t,h,D)},l})}b(Rs,"rect_left_inv_arrow");function As(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let l;t.cssClasses?l="node "+t.cssClasses:l="node default";let r=y.insert("g").attr("class",l).attr("id",t.domId||t.id),f=r.insert("g"),a=r.insert("g").attr("class","label").attr("style",o),c=t.description,s=t.label,e=yield Bt(a,s,t.labelStyle,!0,!0),i={width:0,height:0};if(it(U())){let k=e.children[0],M=Q(e);i=k.getBoundingClientRect(),M.attr("width",i.width),M.attr("height",i.height)}Z.info("Text 2",c);let h=c||[],n=e.getBBox(),p=yield Bt(a,Array.isArray(h)?h.join("
        "):h,t.labelStyle,!0,!0),u=p.children[0],m=Q(p);i=u.getBoundingClientRect(),m.attr("width",i.width),m.attr("height",i.height);let d=(t.padding||0)/2;Q(p).attr("transform","translate( "+(i.width>n.width?0:(n.width-i.width)/2)+", "+(n.height+d+5)+")"),Q(e).attr("transform","translate( "+(i.width(Z.debug("Rough node insert CXC",I),Y),":first-child"),v=r.insert(()=>(Z.debug("Rough node insert CXC",I),I),":first-child")}else v=f.insert("rect",":first-child"),B=f.insert("line"),v.attr("class","outer title-state").attr("style",o).attr("x",-i.width/2-d).attr("y",-i.height/2-d).attr("width",i.width+(t.padding||0)).attr("height",i.height+(t.padding||0)),B.attr("class","divider").attr("x1",-i.width/2-d).attr("x2",i.width/2+d).attr("y1",-i.height/2-d+n.height+d).attr("y2",-i.height/2-d+n.height+d);return A(t,v),t.intersect=function(k){return P.rect(t,k)},r})}b(As,"rectWithTitle");function Ls(y,t){return C(this,null,function*(){let g={rx:5,ry:5,classes:"",labelPaddingX:(t?.padding||0)*1,labelPaddingY:(t?.padding||0)*1};return Dt(y,t,g)})}b(Ls,"roundedRect");function Hs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=t?.padding??0,c=Math.max(r.width+(t.padding??0)*2,t?.width??0),s=Math.max(r.height+(t.padding??0)*2,t?.height??0),e=-r.width/2-a,i=-r.height/2-a,{cssStyles:h}=t,n=w.svg(l),p=N(t,{});t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let u=[{x:e,y:i},{x:e+c+8,y:i},{x:e+c+8,y:i+s},{x:e-8,y:i+s},{x:e-8,y:i},{x:e,y:i},{x:e,y:i+s}],m=n.polygon(u.map(x=>[x.x,x.y]),p),d=l.insert(()=>m,":first-child");return d.attr("class","basic label-container").attr("style",st(h)),o&&t.look!=="handDrawn"&&d.selectAll("path").attr("style",o),h&&t.look!=="handDrawn"&&d.selectAll("path").attr("style",o),f.attr("transform",`translate(${-c/2+4+(t.padding??0)-(r.x-(r.left??0))},${-s/2+(t.padding??0)-(r.y-(r.top??0))})`),A(t,d),t.intersect=function(x){return P.rect(t,x)},l})}b(Hs,"shadedProcess");function Ws(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=-a/2,e=-c/2,{cssStyles:i}=t,h=w.svg(l),n=N(t,{});t.look!=="handDrawn"&&(n.roughness=0,n.fillStyle="solid");let p=[{x:s,y:e},{x:s,y:e+c},{x:s+a,y:e+c},{x:s+a,y:e-c/2}],u=z(p),m=h.path(u,n),d=l.insert(()=>m,":first-child");return d.attr("class","basic label-container"),i&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",i),o&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",o),d.attr("transform",`translate(0, ${c/4})`),f.attr("transform",`translate(${-a/2+(t.padding??0)-(r.x-(r.left??0))}, ${-c/4+(t.padding??0)-(r.y-(r.top??0))})`),A(t,d),t.intersect=function(x){return P.polygon(t,p,x)},l})}b(Ws,"slopedRect");function Is(y,t){return C(this,null,function*(){let g={rx:0,ry:0,classes:"",labelPaddingX:t.labelPaddingX??(t?.padding||0)*2,labelPaddingY:(t?.padding||0)*1};return Dt(y,t,g)})}b(Is,"squareRect");function Es(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=r.height+t.padding,a=r.width+f/4+t.padding,c=f/2,{cssStyles:s}=t,e=w.svg(l),i=N(t,{});t.look!=="handDrawn"&&(i.roughness=0,i.fillStyle="solid");let h=[{x:-a/2+c,y:-f/2},{x:a/2-c,y:-f/2},...kt(-a/2+c,0,c,50,90,270),{x:a/2-c,y:f/2},...kt(a/2-c,0,c,50,270,450)],n=z(h),p=e.path(n,i),u=l.insert(()=>p,":first-child");return u.attr("class","basic label-container outer-path"),s&&t.look!=="handDrawn"&&u.selectChildren("path").attr("style",s),o&&t.look!=="handDrawn"&&u.selectChildren("path").attr("style",o),A(t,u),t.intersect=function(m){return P.polygon(t,h,m)},l})}b(Es,"stadium");function Ts(y,t){return C(this,null,function*(){return Dt(y,t,{rx:5,ry:5,classes:"flowchart-node"})})}b(Ts,"state");function _s(y,t,{config:{themeVariables:g}}){let{labelStyles:o,nodeStyles:l}=R(t);t.labelStyle=o;let{cssStyles:r}=t,{lineColor:f,stateBorder:a,nodeBorder:c}=g,s=y.insert("g").attr("class","node default").attr("id",t.domId||t.id),e=w.svg(s),i=N(t,{});t.look!=="handDrawn"&&(i.roughness=0,i.fillStyle="solid");let h=e.circle(0,0,14,rt(tt({},i),{stroke:f,strokeWidth:2})),n=a??c,p=e.circle(0,0,5,rt(tt({},i),{fill:n,stroke:n,strokeWidth:2,fillStyle:"solid"})),u=s.insert(()=>h,":first-child");return u.insert(()=>p),r&&u.selectAll("path").attr("style",r),l&&u.selectAll("path").attr("style",l),A(t,u),t.intersect=function(m){return P.circle(t,7,m)},s}b(_s,"stateEnd");function Os(y,t,{config:{themeVariables:g}}){let{lineColor:o}=g,l=y.insert("g").attr("class","node default").attr("id",t.domId||t.id),r;if(t.look==="handDrawn"){let a=w.svg(l).circle(0,0,14,jt(o));r=l.insert(()=>a),r.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14)}else r=l.insert("circle",":first-child"),r.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14);return A(t,r),t.intersect=function(f){return P.circle(t,7,f)},l}b(Os,"stateStart");function js(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=(t?.padding||0)/2,a=r.width+t.padding,c=r.height+t.padding,s=-r.width/2-f,e=-r.height/2-f,i=[{x:0,y:0},{x:a,y:0},{x:a,y:-c},{x:0,y:-c},{x:0,y:0},{x:-8,y:0},{x:a+8,y:0},{x:a+8,y:-c},{x:-8,y:-c},{x:-8,y:0}];if(t.look==="handDrawn"){let h=w.svg(l),n=N(t,{}),p=h.rectangle(s-8,e,a+16,c,n),u=h.line(s,e,s,e+c,n),m=h.line(s+a,e,s+a,e+c,n);l.insert(()=>u,":first-child"),l.insert(()=>m,":first-child");let d=l.insert(()=>p,":first-child"),{cssStyles:x}=t;d.attr("class","basic label-container").attr("style",st(x)),A(t,d)}else{let h=ht(l,a,c,i);o&&h.attr("style",o),A(t,h)}return t.intersect=function(h){return P.polygon(t,i,h)},l})}b(js,"subroutine");function Xs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=Math.max(r.width+(t.padding??0)*2,t?.width??0),a=Math.max(r.height+(t.padding??0)*2,t?.height??0),c=-f/2,s=-a/2,e=.2*a,i=.2*a,{cssStyles:h}=t,n=w.svg(l),p=N(t,{}),u=[{x:c-e/2,y:s},{x:c+f+e/2,y:s},{x:c+f+e/2,y:s+a},{x:c-e/2,y:s+a}],m=[{x:c+f-e/2,y:s+a},{x:c+f+e/2,y:s+a},{x:c+f+e/2,y:s+a-i}];t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let d=z(u),x=n.path(d,p),D=z(m),S=n.path(D,rt(tt({},p),{fillStyle:"solid"})),$=l.insert(()=>S,":first-child");return $.insert(()=>x,":first-child"),$.attr("class","basic label-container"),h&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",h),o&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",o),A(t,$),t.intersect=function(v){return P.polygon(t,u,v)},l})}b(Xs,"taggedRect");function Ys(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=c/4,e=.2*a,i=.2*c,h=c+s,{cssStyles:n}=t,p=w.svg(l),u=N(t,{});t.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let m=[{x:-a/2-a/2*.1,y:h/2},...ft(-a/2-a/2*.1,h/2,a/2+a/2*.1,h/2,s,.8),{x:a/2+a/2*.1,y:-h/2},{x:-a/2-a/2*.1,y:-h/2}],d=-a/2+a/2*.1,x=-h/2-i*.4,D=[{x:d+a-e,y:(x+c)*1.4},{x:d+a,y:x+c-i},{x:d+a,y:(x+c)*.9},...ft(d+a,(x+c)*1.3,d+a-e,(x+c)*1.5,-c*.03,.5)],S=z(m),$=p.path(S,u),v=z(D),B=p.path(v,rt(tt({},u),{fillStyle:"solid"})),k=l.insert(()=>B,":first-child");return k.insert(()=>$,":first-child"),k.attr("class","basic label-container"),n&&t.look!=="handDrawn"&&k.selectAll("path").attr("style",n),o&&t.look!=="handDrawn"&&k.selectAll("path").attr("style",o),k.attr("transform",`translate(0,${-s/2})`),f.attr("transform",`translate(${-a/2+(t.padding??0)-(r.x-(r.left??0))},${-c/2+(t.padding??0)-s/2-(r.y-(r.top??0))})`),A(t,k),t.intersect=function(M){return P.polygon(t,m,M)},l})}b(Ys,"taggedWaveEdgedRectangle");function qs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=Math.max(r.width+t.padding,t?.width||0),a=Math.max(r.height+t.padding,t?.height||0),c=-f/2,s=-a/2,e=l.insert("rect",":first-child");return e.attr("class","text").attr("style",o).attr("rx",0).attr("ry",0).attr("x",c).attr("y",s).attr("width",f).attr("height",a),A(t,e),t.intersect=function(i){return P.rect(t,i)},l})}b(qs,"text");var Me=b((y,t,g,o,l,r)=>`M${y},${t} + a${l},${r} 0,0,1 0,${-o} + l${g},0 + a${l},${r} 0,0,1 0,${o} + M${g},${-o} + a${l},${r} 0,0,0 0,${o} + l${-g},0`,"createCylinderPathD"),Ce=b((y,t,g,o,l,r)=>[`M${y},${t}`,`M${y+g},${t}`,`a${l},${r} 0,0,0 0,${-o}`,`l${-g},0`,`a${l},${r} 0,0,0 0,${o}`,`l${g},0`].join(" "),"createOuterCylinderPathD"),Pe=b((y,t,g,o,l,r)=>[`M${y+g/2},${-o/2}`,`a${l},${r} 0,0,0 0,${o}`].join(" "),"createInnerCylinderPathD");function Fs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f,halfPadding:a}=yield O(y,t,T(t)),c=t.look==="neo"?a*2:a,s=r.height+c,e=s/2,i=e/(2.5+s/50),h=r.width+i+c,{cssStyles:n}=t,p;if(t.look==="handDrawn"){let u=w.svg(l),m=Ce(0,0,h,s,i,e),d=Pe(0,0,h,s,i,e),x=u.path(m,N(t,{})),D=u.path(d,N(t,{fill:"none"}));p=l.insert(()=>D,":first-child"),p=l.insert(()=>x,":first-child"),p.attr("class","basic label-container"),n&&p.attr("style",n)}else{let u=Me(0,0,h,s,i,e);p=l.insert("path",":first-child").attr("d",u).attr("class","basic label-container").attr("style",st(n)).attr("style",o),p.attr("class","basic label-container"),n&&p.selectAll("path").attr("style",n),o&&p.selectAll("path").attr("style",o)}return p.attr("label-offset-x",i),p.attr("transform",`translate(${-h/2}, ${s/2} )`),f.attr("transform",`translate(${-(r.width/2)-i-(r.x-(r.left??0))}, ${-(r.height/2)-(r.y-(r.top??0))})`),A(t,p),t.intersect=function(u){let m=P.rect(t,u),d=m.y-(t.y??0);if(e!=0&&(Math.abs(d)<(t.height??0)/2||Math.abs(d)==(t.height??0)/2&&Math.abs(m.x-(t.x??0))>(t.width??0)/2-i)){let x=i*i*(1-d*d/(e*e));x!=0&&(x=Math.sqrt(Math.abs(x))),x=i-x,u.x-(t.x??0)>0&&(x=-x),m.x+=x}return m},l})}b(Fs,"tiltedCylinder");function Gs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=r.width+t.padding,a=r.height+t.padding,c=[{x:-3*a/6,y:0},{x:f+3*a/6,y:0},{x:f,y:-a},{x:0,y:-a}],s,{cssStyles:e}=t;if(t.look==="handDrawn"){let i=w.svg(l),h=N(t,{}),n=z(c),p=i.path(n,h);s=l.insert(()=>p,":first-child").attr("transform",`translate(${-f/2}, ${a/2})`),e&&s.attr("style",e)}else s=ht(l,f,a,c);return o&&s.attr("style",o),t.width=f,t.height=a,A(t,s),t.intersect=function(i){return P.polygon(t,c,i)},l})}b(Gs,"trapezoid");function zs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=60,a=20,c=Math.max(f,r.width+(t.padding??0)*2,t?.width??0),s=Math.max(a,r.height+(t.padding??0)*2,t?.height??0),{cssStyles:e}=t,i=w.svg(l),h=N(t,{});t.look!=="handDrawn"&&(h.roughness=0,h.fillStyle="solid");let n=[{x:-c/2*.8,y:-s/2},{x:c/2*.8,y:-s/2},{x:c/2,y:-s/2*.6},{x:c/2,y:s/2},{x:-c/2,y:s/2},{x:-c/2,y:-s/2*.6}],p=z(n),u=i.path(p,h),m=l.insert(()=>u,":first-child");return m.attr("class","basic label-container"),e&&t.look!=="handDrawn"&&m.selectChildren("path").attr("style",e),o&&t.look!=="handDrawn"&&m.selectChildren("path").attr("style",o),A(t,m),t.intersect=function(d){return P.polygon(t,n,d)},l})}b(zs,"trapezoidalPentagon");function Vs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=t.useHtmlLabels||it(U()),c=r.width+(t.padding??0),s=c+r.height,e=c+r.height,i=[{x:0,y:0},{x:e,y:0},{x:e/2,y:-s}],{cssStyles:h}=t,n=w.svg(l),p=N(t,{});t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let u=z(i),m=n.path(u,p),d=l.insert(()=>m,":first-child").attr("transform",`translate(${-s/2}, ${s/2})`);return h&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",h),o&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",o),t.width=c,t.height=s,A(t,d),f.attr("transform",`translate(${-r.width/2-(r.x-(r.left??0))}, ${s/2-(r.height+(t.padding??0)/(a?2:1)-(r.y-(r.top??0)))})`),t.intersect=function(x){return Z.info("Triangle intersect",t,i,x),P.polygon(t,i,x)},l})}b(Vs,"triangle");function Zs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=c/8,e=c+s,{cssStyles:i}=t,n=70-a,p=n>0?n/2:0,u=w.svg(l),m=N(t,{});t.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let d=[{x:-a/2-p,y:e/2},...ft(-a/2-p,e/2,a/2+p,e/2,s,.8),{x:a/2+p,y:-e/2},{x:-a/2-p,y:-e/2}],x=z(d),D=u.path(x,m),S=l.insert(()=>D,":first-child");return S.attr("class","basic label-container"),i&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",i),o&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",o),S.attr("transform",`translate(0,${-s/2})`),f.attr("transform",`translate(${-a/2+(t.padding??0)-(r.x-(r.left??0))},${-c/2+(t.padding??0)-s-(r.y-(r.top??0))})`),A(t,S),t.intersect=function($){return P.polygon(t,d,$)},l})}b(Zs,"waveEdgedRectangle");function Js(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=100,a=50,c=Math.max(r.width+(t.padding??0)*2,t?.width??0),s=Math.max(r.height+(t.padding??0)*2,t?.height??0),e=c/s,i=c,h=s;i>h*e?h=i/e:i=h*e,i=Math.max(i,f),h=Math.max(h,a);let n=Math.min(h*.2,h/4),p=h+n*2,{cssStyles:u}=t,m=w.svg(l),d=N(t,{});t.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let x=[{x:-i/2,y:p/2},...ft(-i/2,p/2,i/2,p/2,n,1),{x:i/2,y:-p/2},...ft(i/2,-p/2,-i/2,-p/2,n,-1)],D=z(x),S=m.path(D,d),$=l.insert(()=>S,":first-child");return $.attr("class","basic label-container"),u&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",u),o&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",o),A(t,$),t.intersect=function(v){return P.polygon(t,x,v)},l})}b(Js,"waveRectangle");function Qs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=5,e=-a/2,i=-c/2,{cssStyles:h}=t,n=w.svg(l),p=N(t,{}),u=[{x:e-s,y:i-s},{x:e-s,y:i+c},{x:e+a,y:i+c},{x:e+a,y:i-s}],m=`M${e-s},${i-s} L${e+a},${i-s} L${e+a},${i+c} L${e-s},${i+c} L${e-s},${i-s} + M${e-s},${i} L${e+a},${i} + M${e},${i-s} L${e},${i+c}`;t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let d=n.path(m,p),x=l.insert(()=>d,":first-child");return x.attr("transform",`translate(${s/2}, ${s/2})`),x.attr("class","basic label-container"),h&&t.look!=="handDrawn"&&x.selectAll("path").attr("style",h),o&&t.look!=="handDrawn"&&x.selectAll("path").attr("style",o),f.attr("transform",`translate(${-(r.width/2)+s/2-(r.x-(r.left??0))}, ${-(r.height/2)+s/2-(r.y-(r.top??0))})`),A(t,x),t.intersect=function(D){return P.polygon(t,u,D)},l})}b(Qs,"windowPane");function Et(y,t){return C(this,null,function*(){let g=t;if(g.alias&&(t.label=g.alias),t.look==="handDrawn"){let{themeVariables:G}=dt(),{background:J}=G,et=rt(tt({},t),{id:t.id+"-background",look:"default",cssStyles:["stroke: none",`fill: ${J}`]});yield Et(y,et)}let o=dt();t.useHtmlLabels=o.htmlLabels;let l=o.er?.diagramPadding??10,r=o.er?.entityPadding??6,{cssStyles:f}=t,{labelStyles:a,nodeStyles:c}=R(t);if(g.attributes.length===0&&t.label){let G={rx:0,ry:0,labelPaddingX:l,labelPaddingY:l*1.5,classes:""};wt(t.label,o)+G.labelPaddingX*20){let G=i.width+l*2-(u+m+d+x);u+=G/$,m+=G/$,d>0&&(d+=G/$),x>0&&(x+=G/$)}let B=u+m+d+x,k=w.svg(e),M=N(t,{});t.look!=="handDrawn"&&(M.roughness=0,M.fillStyle="solid");let I=0;p.length>0&&(I=p.reduce((G,J)=>G+(J?.rowHeight??0),0));let Y=Math.max(v.width+l*2,t?.width||0,B),V=Math.max((I??0)+i.height,t?.height||0),q=-Y/2,W=-V/2;e.selectAll("g:not(:first-child)").each((G,J,et)=>{let at=Q(et[J]),pt=at.attr("transform"),gt=0,Tt=0;if(pt){let Ct=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(pt);Ct&&(gt=parseFloat(Ct[1]),Tt=parseFloat(Ct[2]),at.attr("class").includes("attribute-name")?gt+=u:at.attr("class").includes("attribute-keys")?gt+=u+m:at.attr("class").includes("attribute-comment")&&(gt+=u+m+d))}at.attr("transform",`translate(${q+l/2+gt}, ${Tt+W+i.height+r/2})`)}),e.select(".name").attr("transform","translate("+-i.width/2+", "+(W+r/2)+")");let j=k.rectangle(q,W,Y,V,M),L=e.insert(()=>j,":first-child").attr("style",f.join("")),{themeVariables:F}=dt(),{rowEven:_,rowOdd:H,nodeBorder:X}=F;n.push(0);for(let[G,J]of p.entries()){let at=(G+1)%2===0&&J.yOffset!==0,pt=k.rectangle(q,i.height+W+J?.yOffset,Y,J?.rowHeight,rt(tt({},M),{fill:at?_:H,stroke:X}));e.insert(()=>pt,"g.label").attr("style",f.join("")).attr("class",`row-rect-${at?"even":"odd"}`)}let E=k.line(q,i.height+W,Y+q,i.height+W,M);e.insert(()=>E).attr("class","divider"),E=k.line(u+q,i.height+W,u+q,V+W,M),e.insert(()=>E).attr("class","divider"),D&&(E=k.line(u+m+q,i.height+W,u+m+q,V+W,M),e.insert(()=>E).attr("class","divider")),S&&(E=k.line(u+m+d+q,i.height+W,u+m+d+q,V+W,M),e.insert(()=>E).attr("class","divider"));for(let G of n)E=k.line(q,i.height+W+G,Y+q,i.height+W+G,M),e.insert(()=>E).attr("class","divider");if(A(t,L),c&&t.look!=="handDrawn"){let J=c.split(";")?.filter(et=>et.includes("stroke"))?.map(et=>`${et}`).join("; ");e.selectAll("path").attr("style",J??""),e.selectAll(".row-rect-even path").attr("style",c)}return t.intersect=function(G){return P.rect(t,G)},e})}b(Et,"erBox");function mt(a,c,s){return C(this,arguments,function*(y,t,g,o=0,l=0,r=[],f=""){let e=y.insert("g").attr("class",`label ${r.join(" ")}`).attr("transform",`translate(${o}, ${l})`).attr("style",f);t!==Nt(t)&&(t=Nt(t),t=t.replaceAll("<","<").replaceAll(">",">"));let i=e.node().appendChild(yield nt(e,t,{width:wt(t,g)+100,style:f,useHtmlLabels:g.htmlLabels},g));if(t.includes("<")||t.includes(">")){let n=i.children[0];for(n.textContent=n.textContent.replaceAll("<","<").replaceAll(">",">");n.childNodes[0];)n=n.childNodes[0],n.textContent=n.textContent.replaceAll("<","<").replaceAll(">",">")}let h=i.getBBox();if(ut(g.htmlLabels)){let n=i.children[0];n.style.textAlign="start";let p=Q(i);h=n.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}return h})}b(mt,"addText");function Us(r,f,a,c){return C(this,arguments,function*(y,t,g,o,l=g.class.padding??12){let s=o?0:3,e=y.insert("g").attr("class",T(t)).attr("id",t.domId||t.id),i=null,h=null,n=null,p=null,u=0,m=0,d=0;if(i=e.insert("g").attr("class","annotation-group text"),t.annotations.length>0){let v=t.annotations[0];yield vt(i,{text:`\xAB${v}\xBB`},0),u=i.node().getBBox().height}h=e.insert("g").attr("class","label-group text"),yield vt(h,t,0,["font-weight: bolder"]);let x=h.node().getBBox();m=x.height,n=e.insert("g").attr("class","members-group text");let D=0;for(let v of t.members){let B=yield vt(n,v,D,[v.parseClassifier()]);D+=B+s}d=n.node().getBBox().height,d<=0&&(d=l/2),p=e.insert("g").attr("class","methods-group text");let S=0;for(let v of t.methods){let B=yield vt(p,v,S,[v.parseClassifier()]);S+=B+s}let $=e.node().getBBox();if(i!==null){let v=i.node().getBBox();i.attr("transform",`translate(${-v.width/2})`)}return h.attr("transform",`translate(${-x.width/2}, ${u})`),$=e.node().getBBox(),n.attr("transform",`translate(0, ${u+m+l*2})`),$=e.node().getBBox(),p.attr("transform",`translate(0, ${u+m+(d?d+l*4:l*2)})`),$=e.node().getBBox(),{shapeSvg:e,bbox:$}})}b(Us,"textHelper");function vt(l,r,f){return C(this,arguments,function*(y,t,g,o=[]){let a=y.insert("g").attr("class","label").attr("style",o.join("; ")),c=dt(),s="useHtmlLabels"in t?t.useHtmlLabels:ut(c.htmlLabels)??!0,e="";"text"in t?e=t.text:e=t.label,!s&&e.startsWith("\\")&&(e=e.substring(1)),_t(e)&&(s=!0);let i=yield nt(a,Rt(bt(e)),{width:wt(e,c)+50,classes:"markdown-node-label",useHtmlLabels:s},c),h,n=1;if(s){let p=i.children[0],u=Q(i);n=p.innerHTML.split("
        ").length,p.innerHTML.includes("")&&(n+=p.innerHTML.split("").length-1);let m=p.getElementsByTagName("img");if(m){let d=e.replace(/]*>/g,"").trim()==="";yield Promise.all([...m].map(x=>new Promise(D=>{function S(){if(x.style.display="flex",x.style.flexDirection="column",d){let $=c.fontSize?.toString()??window.getComputedStyle(document.body).fontSize,B=parseInt($,10)*5+"px";x.style.minWidth=B,x.style.maxWidth=B}else x.style.width="100%";D(x)}b(S,"setupImage"),setTimeout(()=>{x.complete&&S()}),x.addEventListener("error",S),x.addEventListener("load",S)})))}h=p.getBoundingClientRect(),u.attr("width",h.width),u.attr("height",h.height)}else{o.includes("font-weight: bolder")&&Q(i).selectAll("tspan").attr("font-weight",""),n=i.children.length;let p=i.children[0];(i.textContent===""||i.textContent.includes(">"))&&(p.textContent=e[0]+e.substring(1).replaceAll(">",">").replaceAll("<","<").trim(),e[1]===" "&&(p.textContent=p.textContent[0]+" "+p.textContent.substring(1))),p.textContent==="undefined"&&(p.textContent=""),h=i.getBBox()}return a.attr("transform","translate(0,"+(-h.height/(2*n)+g)+")"),h.height})}b(vt,"addText");function Ks(y,t){return C(this,null,function*(){let g=U(),o=g.class.padding??12,l=o,r=t.useHtmlLabels??ut(g.htmlLabels)??!0,f=t;f.annotations=f.annotations??[],f.members=f.members??[],f.methods=f.methods??[];let{shapeSvg:a,bbox:c}=yield Us(y,t,g,r,l),{labelStyles:s,nodeStyles:e}=R(t);t.labelStyle=s,t.cssStyles=f.styles||"";let i=f.styles?.join(";")||e||"";t.cssStyles||(t.cssStyles=i.replaceAll("!important","").split(";"));let h=f.members.length===0&&f.methods.length===0&&!g.class?.hideEmptyMembersBox,n=w.svg(a),p=N(t,{});t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let u=c.width,m=c.height;f.members.length===0&&f.methods.length===0?m+=l:f.members.length>0&&f.methods.length===0&&(m+=l*2);let d=-u/2,x=-m/2,D=n.rectangle(d-o,x-o-(h?o:f.members.length===0&&f.methods.length===0?-o/2:0),u+2*o,m+2*o+(h?o*2:f.members.length===0&&f.methods.length===0?-o:0),p),S=a.insert(()=>D,":first-child");S.attr("class","basic label-container");let $=S.node().getBBox();a.selectAll(".text").each((M,I,Y)=>{let V=Q(Y[I]),q=V.attr("transform"),W=0;if(q){let _=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(q);_&&(W=parseFloat(_[2]))}let j=W+x+o-(h?o:f.members.length===0&&f.methods.length===0?-o/2:0);r||(j-=4);let L=d;(V.attr("class").includes("label-group")||V.attr("class").includes("annotation-group"))&&(L=-V.node()?.getBBox().width/2||0,a.selectAll("text").each(function(F,_,H){window.getComputedStyle(H[_]).textAnchor==="middle"&&(L=0)})),V.attr("transform",`translate(${L}, ${j})`)});let v=a.select(".annotation-group").node().getBBox().height-(h?o/2:0)||0,B=a.select(".label-group").node().getBBox().height-(h?o/2:0)||0,k=a.select(".members-group").node().getBBox().height-(h?o/2:0)||0;if(f.members.length>0||f.methods.length>0||h){let M=n.line($.x,v+B+x+o,$.x+$.width,v+B+x+o,p);a.insert(()=>M).attr("class","divider").attr("style",i)}if(h||f.members.length>0||f.methods.length>0){let M=n.line($.x,v+B+k+x+l*2+o,$.x+$.width,v+B+k+x+o+l*2,p);a.insert(()=>M).attr("class","divider").attr("style",i)}if(f.look!=="handDrawn"&&a.selectAll("path").attr("style",i),S.select(":nth-child(2)").attr("style",i),a.selectAll(".divider").select("path").attr("style",i),t.labelStyle?a.selectAll("span").attr("style",t.labelStyle):a.selectAll("span").attr("style",i),!r){let M=RegExp(/color\s*:\s*([^;]*)/),I=M.exec(i);if(I){let Y=I[0].replace("color","fill");a.selectAll("tspan").attr("style",Y)}else if(s){let Y=M.exec(s);if(Y){let V=Y[0].replace("color","fill");a.selectAll("tspan").attr("style",V)}}}return A(t,S),t.intersect=function(M){return P.rect(t,M)},a})}b(Ks,"classBox");function te(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let l=t,r=t,f=20,a=20,c="verifyMethod"in t,s=T(t),e=y.insert("g").attr("class",s).attr("id",t.domId??t.id),i;c?i=yield lt(e,`<<${l.type}>>`,0,t.labelStyle):i=yield lt(e,"<<Element>>",0,t.labelStyle);let h=i,n=yield lt(e,l.name,h,t.labelStyle+"; font-weight: bold;");if(h+=n+a,c){let v=yield lt(e,`${l.requirementId?`ID: ${l.requirementId}`:""}`,h,t.labelStyle);h+=v;let B=yield lt(e,`${l.text?`Text: ${l.text}`:""}`,h,t.labelStyle);h+=B;let k=yield lt(e,`${l.risk?`Risk: ${l.risk}`:""}`,h,t.labelStyle);h+=k,yield lt(e,`${l.verifyMethod?`Verification: ${l.verifyMethod}`:""}`,h,t.labelStyle)}else{let v=yield lt(e,`${r.type?`Type: ${r.type}`:""}`,h,t.labelStyle);h+=v,yield lt(e,`${r.docRef?`Doc Ref: ${r.docRef}`:""}`,h,t.labelStyle)}let p=(e.node()?.getBBox().width??200)+f,u=(e.node()?.getBBox().height??200)+f,m=-p/2,d=-u/2,x=w.svg(e),D=N(t,{});t.look!=="handDrawn"&&(D.roughness=0,D.fillStyle="solid");let S=x.rectangle(m,d,p,u,D),$=e.insert(()=>S,":first-child");if($.attr("class","basic label-container").attr("style",o),e.selectAll(".label").each((v,B,k)=>{let M=Q(k[B]),I=M.attr("transform"),Y=0,V=0;if(I){let L=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(I);L&&(Y=parseFloat(L[1]),V=parseFloat(L[2]))}let q=V-u/2,W=m+f/2;(B===0||B===1)&&(W=Y),M.attr("transform",`translate(${W}, ${q+f})`)}),h>i+n+a){let v=x.line(m,d+i+n+a,m+p,d+i+n+a,D);e.insert(()=>v).attr("style",o)}return A(t,$),t.intersect=function(v){return P.rect(t,v)},e})}b(te,"requirementBox");function lt(y,t,g,o=""){return C(this,null,function*(){if(t==="")return 0;let l=y.insert("g").attr("class","label").attr("style",o),r=U(),f=r.htmlLabels??!0,a=yield nt(l,Rt(bt(t)),{width:wt(t,r)+50,classes:"markdown-node-label",useHtmlLabels:f,style:o},r),c;if(f){let s=a.children[0],e=Q(a);c=s.getBoundingClientRect(),e.attr("width",c.width),e.attr("height",c.height)}else{let s=a.children[0];for(let e of s.children)e.textContent=e.textContent.replaceAll(">",">").replaceAll("<","<"),o&&e.setAttribute("style",o);c=a.getBBox(),c.height+=6}return l.attr("transform",`translate(${-c.width/2},${-c.height/2+g})`),c.height})}b(lt,"addText");var Ne=b(y=>{switch(y){case"Very High":return"red";case"High":return"orange";case"Medium":return null;case"Low":return"blue";case"Very Low":return"lightblue"}},"colorFromPriority");function se(o,l,r){return C(this,arguments,function*(y,t,{config:g}){let{labelStyles:f,nodeStyles:a}=R(t);t.labelStyle=f||"";let c=10,s=t.width;t.width=(t.width??200)-10;let{shapeSvg:e,bbox:i,label:h}=yield O(y,t,T(t)),n=t.padding||10,p="",u;"ticket"in t&&t.ticket&&g?.kanban?.ticketBaseUrl&&(p=g?.kanban?.ticketBaseUrl.replace("#TICKET#",t.ticket),u=e.insert("svg:a",":first-child").attr("class","kanban-ticket-link").attr("xlink:href",p).attr("target","_blank"));let m={useHtmlLabels:t.useHtmlLabels,labelStyle:t.labelStyle||"",width:t.width,img:t.img,padding:t.padding||8,centerLabel:!1},d,x;u?{label:d,bbox:x}=yield Lt(u,"ticket"in t&&t.ticket||"",m):{label:d,bbox:x}=yield Lt(e,"ticket"in t&&t.ticket||"",m);let{label:D,bbox:S}=yield Lt(e,"assigned"in t&&t.assigned||"",m);t.width=s;let $=10,v=t?.width||0,B=Math.max(x.height,S.height)/2,k=Math.max(i.height+$*2,t?.height||0)+B,M=-v/2,I=-k/2;h.attr("transform","translate("+(n-v/2)+", "+(-B-i.height/2)+")"),d.attr("transform","translate("+(n-v/2)+", "+(-B+i.height/2)+")"),D.attr("transform","translate("+(n+v/2-S.width-2*c)+", "+(-B+i.height/2)+")");let Y,{rx:V,ry:q}=t,{cssStyles:W}=t;if(t.look==="handDrawn"){let j=w.svg(e),L=N(t,{}),F=V||q?j.path(yt(M,I,v,k,V||0),L):j.rectangle(M,I,v,k,L);Y=e.insert(()=>F,":first-child"),Y.attr("class","basic label-container").attr("style",W||null)}else{Y=e.insert("rect",":first-child"),Y.attr("class","basic label-container __APA__").attr("style",a).attr("rx",V??5).attr("ry",q??5).attr("x",M).attr("y",I).attr("width",v).attr("height",k);let j="priority"in t&&t.priority;if(j){let L=e.append("line"),F=M+2,_=I+Math.floor((V??0)/2),H=I+k-Math.floor((V??0)/2);L.attr("x1",F).attr("y1",_).attr("x2",F).attr("y2",H).attr("stroke-width","4").attr("stroke",Ne(j))}}return A(t,Y),t.height=k,t.intersect=function(j){return P.rect(t,j)},e})}b(se,"kanbanItem");function ee(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,halfPadding:f,label:a}=yield O(y,t,T(t)),c=r.width+10*f,s=r.height+8*f,e=.15*c,{cssStyles:i}=t,h=r.width+20,n=r.height+20,p=Math.max(c,h),u=Math.max(s,n);a.attr("transform",`translate(${-r.width/2}, ${-r.height/2})`);let m,d=`M0 0 + a${e},${e} 1 0,0 ${p*.25},${-1*u*.1} + a${e},${e} 1 0,0 ${p*.25},0 + a${e},${e} 1 0,0 ${p*.25},0 + a${e},${e} 1 0,0 ${p*.25},${u*.1} + + a${e},${e} 1 0,0 ${p*.15},${u*.33} + a${e*.8},${e*.8} 1 0,0 0,${u*.34} + a${e},${e} 1 0,0 ${-1*p*.15},${u*.33} + + a${e},${e} 1 0,0 ${-1*p*.25},${u*.15} + a${e},${e} 1 0,0 ${-1*p*.25},0 + a${e},${e} 1 0,0 ${-1*p*.25},0 + a${e},${e} 1 0,0 ${-1*p*.25},${-1*u*.15} + + a${e},${e} 1 0,0 ${-1*p*.1},${-1*u*.33} + a${e*.8},${e*.8} 1 0,0 0,${-1*u*.34} + a${e},${e} 1 0,0 ${p*.1},${-1*u*.33} + H0 V0 Z`;if(t.look==="handDrawn"){let x=w.svg(l),D=N(t,{}),S=x.path(d,D);m=l.insert(()=>S,":first-child"),m.attr("class","basic label-container").attr("style",st(i))}else m=l.insert("path",":first-child").attr("class","basic label-container").attr("style",o).attr("d",d);return m.attr("transform",`translate(${-p/2}, ${-u/2})`),A(t,m),t.calcIntersect=function(x,D){return P.rect(x,D)},t.intersect=function(x){return Z.info("Bang intersect",t,x),P.rect(t,x)},l})}b(ee,"bang");function ae(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,halfPadding:f,label:a}=yield O(y,t,T(t)),c=r.width+2*f,s=r.height+2*f,e=.15*c,i=.25*c,h=.35*c,n=.2*c,{cssStyles:p}=t,u,m=`M0 0 + a${e},${e} 0 0,1 ${c*.25},${-1*c*.1} + a${h},${h} 1 0,1 ${c*.4},${-1*c*.1} + a${i},${i} 1 0,1 ${c*.35},${c*.2} + + a${e},${e} 1 0,1 ${c*.15},${s*.35} + a${n},${n} 1 0,1 ${-1*c*.15},${s*.65} + + a${i},${e} 1 0,1 ${-1*c*.25},${c*.15} + a${h},${h} 1 0,1 ${-1*c*.5},0 + a${e},${e} 1 0,1 ${-1*c*.25},${-1*c*.15} + + a${e},${e} 1 0,1 ${-1*c*.1},${-1*s*.35} + a${n},${n} 1 0,1 ${c*.1},${-1*s*.65} + H0 V0 Z`;if(t.look==="handDrawn"){let d=w.svg(l),x=N(t,{}),D=d.path(m,x);u=l.insert(()=>D,":first-child"),u.attr("class","basic label-container").attr("style",st(p))}else u=l.insert("path",":first-child").attr("class","basic label-container").attr("style",o).attr("d",m);return a.attr("transform",`translate(${-r.width/2}, ${-r.height/2})`),u.attr("transform",`translate(${-c/2}, ${-s/2})`),A(t,u),t.calcIntersect=function(d,x){return P.rect(d,x)},t.intersect=function(d){return Z.info("Cloud intersect",t,d),P.rect(t,d)},l})}b(ae,"cloud");function re(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,halfPadding:f,label:a}=yield O(y,t,T(t)),c=r.width+8*f,s=r.height+2*f,e=5,i=` + M${-c/2} ${s/2-e} + v${-s+2*e} + q0,-${e} ${e},-${e} + h${c-2*e} + q${e},0 ${e},${e} + v${s-2*e} + q0,${e} -${e},${e} + h${-c+2*e} + q-${e},0 -${e},-${e} + Z + `,h=l.append("path").attr("id","node-"+t.id).attr("class","node-bkg node-"+t.type).attr("style",o).attr("d",i);return l.append("line").attr("class","node-line-").attr("x1",-c/2).attr("y1",s/2).attr("x2",c/2).attr("y2",s/2),a.attr("transform",`translate(${-r.width/2}, ${-r.height/2})`),l.append(()=>a.node()),A(t,h),t.calcIntersect=function(n,p){return P.rect(n,p)},t.intersect=function(n){return P.rect(t,n)},l})}b(re,"defaultMindmapNode");function ie(y,t){return C(this,null,function*(){let g={padding:t.padding??0};return It(y,t,g)})}b(ie,"mindmapCircle");var Re=[{semanticName:"Process",name:"Rectangle",shortName:"rect",description:"Standard process shape",aliases:["proc","process","rectangle"],internalAliases:["squareRect"],handler:Is},{semanticName:"Event",name:"Rounded Rectangle",shortName:"rounded",description:"Represents an event",aliases:["event"],internalAliases:["roundedRect"],handler:Ls},{semanticName:"Terminal Point",name:"Stadium",shortName:"stadium",description:"Terminal point",aliases:["terminal","pill"],handler:Es},{semanticName:"Subprocess",name:"Framed Rectangle",shortName:"fr-rect",description:"Subprocess",aliases:["subprocess","subproc","framed-rectangle","subroutine"],handler:js},{semanticName:"Database",name:"Cylinder",shortName:"cyl",description:"Database storage",aliases:["db","database","cylinder"],handler:ls},{semanticName:"Start",name:"Circle",shortName:"circle",description:"Starting point",aliases:["circ"],handler:It},{semanticName:"Bang",name:"Bang",shortName:"bang",description:"Bang",aliases:["bang"],handler:ee},{semanticName:"Cloud",name:"Cloud",shortName:"cloud",description:"cloud",aliases:["cloud"],handler:ae},{semanticName:"Decision",name:"Diamond",shortName:"diam",description:"Decision-making step",aliases:["decision","diamond","question"],handler:Ns},{semanticName:"Prepare Conditional",name:"Hexagon",shortName:"hex",description:"Preparation or condition step",aliases:["hexagon","prepare"],handler:ys},{semanticName:"Data Input/Output",name:"Lean Right",shortName:"lean-r",description:"Represents input or output",aliases:["lean-right","in-out"],internalAliases:["lean_right"],handler:vs},{semanticName:"Data Input/Output",name:"Lean Left",shortName:"lean-l",description:"Represents output or input",aliases:["lean-left","out-in"],internalAliases:["lean_left"],handler:$s},{semanticName:"Priority Action",name:"Trapezoid Base Bottom",shortName:"trap-b",description:"Priority action",aliases:["priority","trapezoid-bottom","trapezoid"],handler:Gs},{semanticName:"Manual Operation",name:"Trapezoid Base Top",shortName:"trap-t",description:"Represents a manual task",aliases:["manual","trapezoid-top","inv-trapezoid"],internalAliases:["inv_trapezoid"],handler:bs},{semanticName:"Stop",name:"Double Circle",shortName:"dbl-circ",description:"Represents a stop point",aliases:["double-circle"],internalAliases:["doublecircle"],handler:cs},{semanticName:"Text Block",name:"Text Block",shortName:"text",description:"Text block",handler:qs},{semanticName:"Card",name:"Notched Rectangle",shortName:"notch-rect",description:"Represents a card",aliases:["card","notched-rectangle"],handler:Ut},{semanticName:"Lined/Shaded Process",name:"Lined Rectangle",shortName:"lin-rect",description:"Lined process shape",aliases:["lined-rectangle","lined-process","lin-proc","shaded-process"],handler:Hs},{semanticName:"Start",name:"Small Circle",shortName:"sm-circ",description:"Small starting point",aliases:["start","small-circle"],internalAliases:["stateStart"],handler:Os},{semanticName:"Stop",name:"Framed Circle",shortName:"fr-circ",description:"Stop point",aliases:["stop","framed-circle"],internalAliases:["stateEnd"],handler:_s},{semanticName:"Fork/Join",name:"Filled Rectangle",shortName:"fork",description:"Fork or join in process flow",aliases:["join"],internalAliases:["forkJoin"],handler:gs},{semanticName:"Collate",name:"Hourglass",shortName:"hourglass",description:"Represents a collate operation",aliases:["hourglass","collate"],handler:ps},{semanticName:"Comment",name:"Curly Brace",shortName:"brace",description:"Adds a comment",aliases:["comment","brace-l"],handler:es},{semanticName:"Comment Right",name:"Curly Brace",shortName:"brace-r",description:"Adds a comment",handler:as},{semanticName:"Comment with braces on both sides",name:"Curly Braces",shortName:"braces",description:"Adds a comment",handler:rs},{semanticName:"Com Link",name:"Lightning Bolt",shortName:"bolt",description:"Communication link",aliases:["com-link","lightning-bolt"],handler:ks},{semanticName:"Document",name:"Document",shortName:"doc",description:"Represents a document",aliases:["doc","document"],handler:Zs},{semanticName:"Delay",name:"Half-Rounded Rectangle",shortName:"delay",description:"Represents a delay",aliases:["half-rounded-rectangle"],handler:fs},{semanticName:"Direct Access Storage",name:"Horizontal Cylinder",shortName:"h-cyl",description:"Direct access storage",aliases:["das","horizontal-cylinder"],handler:Fs},{semanticName:"Disk Storage",name:"Lined Cylinder",shortName:"lin-cyl",description:"Disk storage",aliases:["disk","lined-cylinder"],handler:Ds},{semanticName:"Display",name:"Curved Trapezoid",shortName:"curv-trap",description:"Represents a display",aliases:["curved-trapezoid","display"],handler:is},{semanticName:"Divided Process",name:"Divided Rectangle",shortName:"div-rect",description:"Divided process shape",aliases:["div-proc","divided-rectangle","divided-process"],handler:ns},{semanticName:"Extract",name:"Triangle",shortName:"tri",description:"Extraction process",aliases:["extract","triangle"],handler:Vs},{semanticName:"Internal Storage",name:"Window Pane",shortName:"win-pane",description:"Internal storage",aliases:["internal-storage","window-pane"],handler:Qs},{semanticName:"Junction",name:"Filled Circle",shortName:"f-circ",description:"Junction point",aliases:["junction","filled-circle"],handler:os},{semanticName:"Loop Limit",name:"Trapezoidal Pentagon",shortName:"notch-pent",description:"Loop limit step",aliases:["loop-limit","notched-pentagon"],handler:zs},{semanticName:"Manual File",name:"Flipped Triangle",shortName:"flip-tri",description:"Manual file operation",aliases:["manual-file","flipped-triangle"],handler:hs},{semanticName:"Manual Input",name:"Sloped Rectangle",shortName:"sl-rect",description:"Manual input step",aliases:["manual-input","sloped-rectangle"],handler:Ws},{semanticName:"Multi-Document",name:"Stacked Document",shortName:"docs",description:"Multiple documents",aliases:["documents","st-doc","stacked-document"],handler:Cs},{semanticName:"Multi-Process",name:"Stacked Rectangle",shortName:"st-rect",description:"Multiple processes",aliases:["procs","processes","stacked-rectangle"],handler:Ms},{semanticName:"Stored Data",name:"Bow Tie Rectangle",shortName:"bow-rect",description:"Stored data",aliases:["stored-data","bow-tie-rectangle"],handler:Qt},{semanticName:"Summary",name:"Crossed Circle",shortName:"cross-circ",description:"Summary",aliases:["summary","crossed-circle"],handler:ss},{semanticName:"Tagged Document",name:"Tagged Document",shortName:"tag-doc",description:"Tagged document",aliases:["tag-doc","tagged-document"],handler:Ys},{semanticName:"Tagged Process",name:"Tagged Rectangle",shortName:"tag-rect",description:"Tagged process",aliases:["tagged-rectangle","tag-proc","tagged-process"],handler:Xs},{semanticName:"Paper Tape",name:"Flag",shortName:"flag",description:"Paper tape",aliases:["paper-tape"],handler:Js},{semanticName:"Odd",name:"Odd",shortName:"odd",description:"Odd shape",internalAliases:["rect_left_inv_arrow"],handler:Rs},{semanticName:"Lined Document",name:"Lined Document",shortName:"lin-doc",description:"Lined document",aliases:["lined-document"],handler:Bs}],Ae=b(()=>{let t=[...Object.entries({state:Ts,choice:Kt,note:Ps,rectWithTitle:As,labelRect:Ss,iconSquare:xs,iconCircle:ds,icon:us,iconRounded:ms,imageSquare:ws,anchor:Jt,kanbanItem:se,mindmapCircle:ie,defaultMindmapNode:re,classBox:Ks,erBox:Et,requirementBox:te}),...Re.flatMap(g=>[g.shortName,..."aliases"in g?g.aliases:[],..."internalAliases"in g?g.internalAliases:[]].map(l=>[l,g.handler]))];return Object.fromEntries(t)},"generateShapeMap"),le=Ae();function Le(y){return y in le}b(Le,"isValidShape");var Mt=new Map;function He(y,t,g){return C(this,null,function*(){let o,l;t.shape==="rect"&&(t.rx&&t.ry?t.shape="roundedRect":t.shape="squareRect");let r=t.shape?le[t.shape]:void 0;if(!r)throw new Error(`No such shape: ${t.shape}. Please check your syntax.`);if(t.link){let f;g.config.securityLevel==="sandbox"?f="_top":t.linkTarget&&(f=t.linkTarget||"_blank"),o=y.insert("svg:a").attr("xlink:href",t.link).attr("target",f??null),l=yield r(o,t,g)}else l=yield r(y,t,g),o=l;return t.tooltip&&l.attr("title",t.tooltip),Mt.set(t.id,o),t.haveCallback&&o.attr("class",o.attr("class")+" clickable"),o})}b(He,"insertNode");var er=b((y,t)=>{Mt.set(t.id,y)},"setNodeElem"),ar=b(()=>{Mt.clear()},"clear"),rr=b(y=>{let t=Mt.get(y.id);Z.trace("Transforming node",y.diff,y,"translate("+(y.x-y.width/2-5)+", "+y.width/2+")");let g=8,o=y.diff||0;return y.clusterNode?t.attr("transform","translate("+(y.x+o-y.width/2)+", "+(y.y-y.height/2-g)+")"):t.attr("transform","translate("+y.x+", "+y.y+")"),o},"positionNode");export{O as a,A as b,Bt as c,Fe as d,Ge as e,Le as f,He as g,er as h,ar as i,rr as j}; diff --git a/src/google/adk/cli/browser/chunk-WAKWL6X3.js b/src/google/adk/cli/browser/chunk-WAKWL6X3.js new file mode 100644 index 0000000000..94e5a71b6c --- /dev/null +++ b/src/google/adk/cli/browser/chunk-WAKWL6X3.js @@ -0,0 +1,24 @@ +import{a as F}from"./chunk-DMWOYWYQ.js";import{a as A}from"./chunk-T3Q3QCCV.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{a as E}from"./chunk-TPDTRWWV.js";import{l as w}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as y,N as $,R as B,S as C,T as S,U as D,V as T,W as P,X as z,r as x}from"./chunk-QFMJV7VH.js";import{g as h,i as u}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as m,j as v}from"./chunk-RMXJBC7V.js";var M=x.packet,W=class{constructor(){this.packet=[],this.setAccTitle=C,this.getAccTitle=S,this.setDiagramTitle=P,this.getDiagramTitle=z,this.getAccDescription=T,this.setAccDescription=D}static{h(this,"PacketDB")}getConfig(){let t=w(m(m({},M),y().packet));return t.showBits&&(t.paddingY+=10),t}getPacket(){return this.packet}pushWord(t){t.length>0&&this.packet.push(t)}clear(){B(),this.packet=[]}},Y=1e4,I=h((t,e)=>{F(t,e);let a=-1,o=[],n=1,{bitsPerRow:l}=e.getConfig();for(let{start:r,end:s,bits:d,label:c}of t.blocks){if(r!==void 0&&s!==void 0&&s{if(t.start===void 0)throw new Error("start should have been set during first phase");if(t.end===void 0)throw new Error("end should have been set during first phase");if(t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);if(t.end+1<=e*a)return[t,void 0];let o=e*a-1,n=e*a;return[{start:t.start,end:o,label:t.label,bits:o-t.start},{start:n,end:t.end,label:t.label,bits:t.end-n}]},"getNextFittingBlock"),_={parser:{yy:void 0},parse:h(t=>v(null,null,function*(){let e=yield A("packet",t),a=_.parser?.yy;if(!(a instanceof W))throw new Error("parser.parser?.yy was not a PacketDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");u.debug(e),I(e,a)}),"parse")},j=h((t,e,a,o)=>{let n=o.db,l=n.getConfig(),{rowHeight:r,paddingY:s,bitWidth:d,bitsPerRow:c}=l,p=n.getPacket(),i=n.getDiagramTitle(),f=r+s,g=f*(p.length+1)-(i?0:r),k=d*c+2,b=E(e);b.attr("viewBox",`0 0 ${k} ${g}`),$(b,g,k,l.useMaxWidth);for(let[N,L]of p.entries())G(b,L,N,l);b.append("text").text(i).attr("x",k/2).attr("y",g-f/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),G=h((t,e,a,{rowHeight:o,paddingX:n,paddingY:l,bitWidth:r,bitsPerRow:s,showBits:d})=>{let c=t.append("g"),p=a*(o+l)+l;for(let i of e){let f=i.start%s*r+1,g=(i.end-i.start+1)*r-n;if(c.append("rect").attr("x",f).attr("y",p).attr("width",g).attr("height",o).attr("class","packetBlock"),c.append("text").attr("x",f+g/2).attr("y",p+o/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(i.label),!d)continue;let k=i.end===i.start,b=p-2;c.append("text").attr("x",f+(k?g/2:0)).attr("y",b).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",k?"middle":"start").text(i.start),k||c.append("text").attr("x",f+g).attr("y",b).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(i.end)}},"drawWord"),H={draw:j},K={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},R=h(({packet:t}={})=>{let e=w(K,t);return` + .packetByte { + font-size: ${e.byteFontSize}; + } + .packetByte.start { + fill: ${e.startByteColor}; + } + .packetByte.end { + fill: ${e.endByteColor}; + } + .packetLabel { + fill: ${e.labelColor}; + font-size: ${e.labelFontSize}; + } + .packetTitle { + fill: ${e.titleColor}; + font-size: ${e.titleFontSize}; + } + .packetBlock { + stroke: ${e.blockStrokeColor}; + stroke-width: ${e.blockStrokeWidth}; + fill: ${e.blockFillColor}; + } + `},"styles"),Z={parser:_,get db(){return new W},renderer:H,styles:R};export{Z as diagram}; diff --git a/src/google/adk/cli/browser/chunk-WBLSVR3V.js b/src/google/adk/cli/browser/chunk-WBLSVR3V.js new file mode 100644 index 0000000000..98bd99d4f6 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-WBLSVR3V.js @@ -0,0 +1,2 @@ +import{a as vt}from"./chunk-GP6TCC26.js";import{M as $,i as m,l as E,o as b,s as F}from"./chunk-QFMJV7VH.js";import{$ as J,L as _,O as A,P as N,Q as R,R as D,S as H,T as O,U as z,V as j,W as U,X as k,Y as X,Z as Y,_ as G,a as T,aa as q,ba as Z,ca as K,da as Q,ea as V,g as s,i as f}from"./chunk-JRNAXTJ7.js";import{K as M,V as L}from"./chunk-EGBSMT36.js";import{h as mt}from"./chunk-RMXJBC7V.js";var nt=mt(vt(),1);var yt="\u200B",xt={curveBasis:R,curveBasisClosed:D,curveBasisOpen:H,curveBumpX:A,curveBumpY:N,curveBundle:O,curveCardinalClosed:j,curveCardinalOpen:U,curveCardinal:z,curveCatmullRomClosed:X,curveCatmullRomOpen:Y,curveCatmullRom:k,curveLinear:_,curveLinearClosed:G,curveMonotoneX:J,curveMonotoneY:q,curveNatural:Z,curveStep:K,curveStepAfter:V,curveStepBefore:Q},pt=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,Mt=s(function(e,t){let r=rt(e,/(?:init\b)|(?:initialize\b)/),n={};if(Array.isArray(r)){let a=r.map(l=>l.args);F(a),n=b(n,[...a])}else n=r.args;if(!n)return;let i=E(e,t),o="config";return n[o]!==void 0&&(i==="flowchart-v2"&&(i="flowchart"),n[i]=n[o],delete n[o]),n},"detectInit"),rt=s(function(e,t=null){try{let r=new RegExp(`[%]{2}(?![{]${pt.source})(?=[}][%]{2}).* +`,"ig");e=e.trim().replace(r,"").replace(/'/gm,'"'),f.debug(`Detecting diagram directive${t!==null?" type:"+t:""} based on the text:${e}`);let n,i=[];for(;(n=m.exec(e))!==null;)if(n.index===m.lastIndex&&m.lastIndex++,n&&!t||t&&n[1]?.match(t)||t&&n[2]?.match(t)){let o=n[1]?n[1]:n[2],a=n[3]?n[3].trim():n[4]?JSON.parse(n[4].trim()):null;i.push({type:o,args:a})}return i.length===0?{type:e,args:null}:i.length===1?i[0]:i}catch(r){return f.error(`ERROR: ${r.message} - Unable to parse directive type: '${t}' based on the text: '${e}'`),{type:void 0,args:null}}},"detectDirective"),Ot=s(function(e){return e.replace(m,"")},"removeDirectives"),$t=s(function(e,t){for(let[r,n]of t.entries())if(n.match(e))return r;return-1},"isSubstringInArray");function it(e,t){if(!e)return t;let r=`curve${e.charAt(0).toUpperCase()+e.slice(1)}`;return xt[r]??t}s(it,"interpolateToCurve");function ot(e,t){let r=e.trim();if(r)return t.securityLevel!=="loose"?(0,nt.sanitizeUrl)(r):r}s(ot,"formatUrl");var wt=s((e,...t)=>{let r=e.split("."),n=r.length-1,i=r[n],o=window;for(let a=0;a{r+=S(i,t),t=i});let n=r/2;return B(e,n)}s(at,"traverseEdge");function st(e){return e.length===1?e[0]:at(e)}s(st,"calcLabelPosition");var tt=s((e,t=2)=>{let r=Math.pow(10,t);return Math.round(e*r)/r},"roundNumber"),B=s((e,t)=>{let r,n=t;for(let i of e){if(r){let o=S(i,r);if(o===0)return r;if(o=1)return{x:i.x,y:i.y};if(a>0&&a<1)return{x:tt((1-a)*r.x+a*i.x,5),y:tt((1-a)*r.y+a*i.y,5)}}}r=i}throw new Error("Could not find a suitable point for the given distance")},"calculatePoint"),bt=s((e,t,r)=>{f.info(`our points ${JSON.stringify(t)}`),t[0]!==r&&(t=t.reverse());let i=B(t,25),o=e?10:5,a=Math.atan2(t[0].y-i.y,t[0].x-i.x),l={x:0,y:0};return l.x=Math.sin(a)*o+(t[0].x+i.x)/2,l.y=-Math.cos(a)*o+(t[0].y+i.y)/2,l},"calcCardinalityPosition");function ct(e,t,r){let n=structuredClone(r);f.info("our points",n),t!=="start_left"&&t!=="start_right"&&n.reverse();let i=25+e,o=B(n,i),a=10+e*.5,l=Math.atan2(n[0].y-o.y,n[0].x-o.x),c={x:0,y:0};return t==="start_left"?(c.x=Math.sin(l+Math.PI)*a+(n[0].x+o.x)/2,c.y=-Math.cos(l+Math.PI)*a+(n[0].y+o.y)/2):t==="end_right"?(c.x=Math.sin(l-Math.PI)*a+(n[0].x+o.x)/2-5,c.y=-Math.cos(l-Math.PI)*a+(n[0].y+o.y)/2-5):t==="end_left"?(c.x=Math.sin(l)*a+(n[0].x+o.x)/2-5,c.y=-Math.cos(l)*a+(n[0].y+o.y)/2-5):(c.x=Math.sin(l)*a+(n[0].x+o.x)/2,c.y=-Math.cos(l)*a+(n[0].y+o.y)/2),c}s(ct,"calcTerminalLabelPosition");function lt(e){let t="",r="";for(let n of e)n!==void 0&&(n.startsWith("color:")||n.startsWith("text-align:")?r=r+n+";":t=t+n+";");return{style:t,labelStyle:r}}s(lt,"getStylesFromArray");var et=0,St=s(()=>(et++,"id-"+Math.random().toString(36).substr(2,12)+"-"+et),"generateId");function ut(e){let t="",r="0123456789abcdef",n=r.length;for(let i=0;iut(e.length),"random"),Ct=s(function(){return{x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0,text:""}},"getTextObj"),Pt=s(function(e,t){let r=t.text.replace($.lineBreakRegex," "),[,n]=P(t.fontSize),i=e.append("text");i.attr("x",t.x),i.attr("y",t.y),i.style("text-anchor",t.anchor),i.style("font-family",t.fontFamily),i.style("font-size",n),i.style("font-weight",t.fontWeight),i.attr("fill",t.fill),t.class!==void 0&&i.attr("class",t.class);let o=i.append("tspan");return o.attr("x",t.x+t.textMargin*2),o.attr("fill",t.fill),o.text(r),i},"drawSimpleText"),Wt=M((e,t,r)=>{if(!e||(r=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"
        "},r),$.lineBreakRegex.test(e)))return e;let n=e.split(" ").filter(Boolean),i=[],o="";return n.forEach((a,l)=>{let c=v(`${a} `,r),u=v(o,r);if(c>t){let{hyphenatedStrings:g,remainingWord:h}=It(a,t,"-",r);i.push(o,...g),o=h}else u+c>=t?(i.push(o),o=a):o=[o,a].filter(Boolean).join(" ");l+1===n.length&&i.push(o)}),i.filter(a=>a!=="").join(r.joinWith)},(e,t,r)=>`${e}${t}${r.fontSize}${r.fontWeight}${r.fontFamily}${r.joinWith}`),It=M((e,t,r="-",n)=>{n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},n);let i=[...e],o=[],a="";return i.forEach((l,c)=>{let u=`${a}${l}`;if(v(u,n)>=t){let x=c+1,g=i.length===x,h=`${u}${r}`;o.push(g?u:h),a=""}else a=u}),{hyphenatedStrings:o,remainingWord:a}},(e,t,r="-",n)=>`${e}${t}${r}${n.fontSize}${n.fontWeight}${n.fontFamily}`);function ht(e,t){return C(e,t).height}s(ht,"calculateTextHeight");function v(e,t){return C(e,t).width}s(v,"calculateTextWidth");var C=M((e,t)=>{let{fontSize:r=12,fontFamily:n="Arial",fontWeight:i=400}=t;if(!e)return{width:0,height:0};let[,o]=P(r),a=["sans-serif",n],l=e.split($.lineBreakRegex),c=[],u=T("body");if(!u.remove)return{width:0,height:0,lineHeight:0};let y=u.append("svg");for(let g of a){let h=0,d={width:0,height:0,lineHeight:0};for(let gt of l){let W=Ct();W.text=gt||yt;let I=Pt(y,W).style("font-size",o).style("font-weight",i).style("font-family",g),p=(I._groups||I)[0][0].getBBox();if(p.width===0&&p.height===0)throw new Error("svg element not in render tree");d.width=Math.round(Math.max(d.width,p.width)),h=Math.round(p.height),d.height+=h,d.lineHeight=Math.round(Math.max(d.lineHeight,h))}c.push(d)}y.remove();let x=isNaN(c[1].height)||isNaN(c[1].width)||isNaN(c[1].lineHeight)||c[0].height>c[1].height&&c[0].width>c[1].width&&c[0].lineHeight>c[1].lineHeight?0:1;return c[x]},(e,t)=>`${e}${t.fontSize}${t.fontWeight}${t.fontFamily}`),Lt=class{constructor(e=!1,t){this.count=0,this.count=t?t.length:0,this.next=e?()=>this.count++:()=>Date.now()}static{s(this,"InitIDGenerator")}},w,Tt=s(function(e){return w=w||document.createElement("div"),e=escape(e).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),w.innerHTML=e,unescape(w.textContent)},"entityDecode");function Et(e){return"str"in e}s(Et,"isDetailedError");var Ft=s((e,t,r,n)=>{if(!n)return;let i=e.node()?.getBBox();i&&e.append("text").text(n).attr("text-anchor","middle").attr("x",i.x+i.width/2).attr("y",-r).attr("class",t)},"insertTitle"),P=s(e=>{if(typeof e=="number")return[e,e+"px"];let t=parseInt(e??"",10);return Number.isNaN(t)?[void 0,void 0]:e===String(t)?[t,e+"px"]:[t,e]},"parseFontSize");function dt(e,t){return L({},e,t)}s(dt,"cleanAndMerge");var zt={assignWithDepth:b,wrapLabel:Wt,calculateTextHeight:ht,calculateTextWidth:v,calculateTextDimensions:C,cleanAndMerge:dt,detectInit:Mt,detectDirective:rt,isSubstringInArray:$t,interpolateToCurve:it,calcLabelPosition:st,calcCardinalityPosition:bt,calcTerminalLabelPosition:ct,formatUrl:ot,getStylesFromArray:lt,generateId:St,random:Bt,runFunc:wt,entityDecode:Tt,insertTitle:Ft,isLabelCoordinateInPath:ft,parseFontSize:P,InitIDGenerator:Lt},jt=s(function(e){let t=e;return t=t.replace(/style.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),t=t.replace(/classDef.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),t=t.replace(/#\w+;/g,function(r){let n=r.substring(1,r.length-1);return/^\+?\d+$/.test(n)?"\uFB02\xB0\xB0"+n+"\xB6\xDF":"\uFB02\xB0"+n+"\xB6\xDF"}),t},"encodeEntities"),Ut=s(function(e){return e.replace(/fl°°/g,"&#").replace(/fl°/g,"&").replace(/¶ß/g,";")},"decodeEntities"),kt=s((e,t,{counter:r=0,prefix:n,suffix:i},o)=>o||`${n?`${n}_`:""}${e}_${t}_${r}${i?`_${i}`:""}`,"getEdgeId");function _t(e){return e??null}s(_t,"handleUndefinedAttr");function ft(e,t){let r=Math.round(e.x),n=Math.round(e.y),i=t.replace(/(\d+\.\d+)/g,o=>Math.round(parseFloat(o)).toString());return i.includes(r.toString())||i.includes(n.toString())}s(ft,"isLabelCoordinateInPath");export{yt as a,Ot as b,it as c,lt as d,St as e,Bt as f,Wt as g,ht as h,v as i,Et as j,P as k,dt as l,zt as m,jt as n,Ut as o,kt as p,_t as q}; diff --git a/src/google/adk/cli/browser/chunk-WLB2FJ7K.js b/src/google/adk/cli/browser/chunk-WLB2FJ7K.js new file mode 100644 index 0000000000..06877cfaca --- /dev/null +++ b/src/google/adk/cli/browser/chunk-WLB2FJ7K.js @@ -0,0 +1,10 @@ +import{a as ke,f as Ee}from"./chunk-NMKTPNXE.js";import{g as ve,h as ee,i as Ct}from"./chunk-WBLSVR3V.js";import{a as Fe}from"./chunk-GP6TCC26.js";import{G as te,M as Yt,N as be,S as ge,T as _e,U as xe,V as me,Y as Ot,o as ye}from"./chunk-QFMJV7VH.js";import{a as Dt,g as b,i as $t}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{h as Ue}from"./chunk-RMXJBC7V.js";var Re=Ue(Fe(),1),Ut=(function(){var e=b(function(_t,x,m,v){for(m=m||{},v=_t.length;v--;m[_t[v]]=x);return m},"o"),t=[1,24],s=[1,25],o=[1,26],l=[1,27],a=[1,28],n=[1,63],r=[1,64],i=[1,65],u=[1,66],d=[1,67],y=[1,68],p=[1,69],k=[1,29],O=[1,30],S=[1,31],P=[1,32],M=[1,33],U=[1,34],H=[1,35],q=[1,36],G=[1,37],K=[1,38],J=[1,39],Z=[1,40],$=[1,41],tt=[1,42],et=[1,43],at=[1,44],it=[1,45],rt=[1,46],nt=[1,47],st=[1,48],lt=[1,50],ot=[1,51],ct=[1,52],ht=[1,53],ut=[1,54],dt=[1,55],ft=[1,56],pt=[1,57],yt=[1,58],bt=[1,59],gt=[1,60],wt=[14,42],Wt=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Rt=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],E=[1,82],A=[1,83],C=[1,84],w=[1,85],T=[12,14,42],ce=[12,14,33,42],It=[12,14,33,42,76,77,79,80],vt=[12,33],Qt=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Ht={trace:b(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:b(function(x,m,v,g,R,h,St){var f=h.length-1;switch(R){case 3:g.setDirection("TB");break;case 4:g.setDirection("BT");break;case 5:g.setDirection("RL");break;case 6:g.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:g.setC4Type(h[f-3]);break;case 19:g.setTitle(h[f].substring(6)),this.$=h[f].substring(6);break;case 20:g.setAccDescription(h[f].substring(15)),this.$=h[f].substring(15);break;case 21:this.$=h[f].trim(),g.setTitle(this.$);break;case 22:case 23:this.$=h[f].trim(),g.setAccDescription(this.$);break;case 28:h[f].splice(2,0,"ENTERPRISE"),g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 29:h[f].splice(2,0,"SYSTEM"),g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 30:g.addPersonOrSystemBoundary(...h[f]),this.$=h[f];break;case 31:h[f].splice(2,0,"CONTAINER"),g.addContainerBoundary(...h[f]),this.$=h[f];break;case 32:g.addDeploymentNode("node",...h[f]),this.$=h[f];break;case 33:g.addDeploymentNode("nodeL",...h[f]),this.$=h[f];break;case 34:g.addDeploymentNode("nodeR",...h[f]),this.$=h[f];break;case 35:g.popBoundaryParseStack();break;case 39:g.addPersonOrSystem("person",...h[f]),this.$=h[f];break;case 40:g.addPersonOrSystem("external_person",...h[f]),this.$=h[f];break;case 41:g.addPersonOrSystem("system",...h[f]),this.$=h[f];break;case 42:g.addPersonOrSystem("system_db",...h[f]),this.$=h[f];break;case 43:g.addPersonOrSystem("system_queue",...h[f]),this.$=h[f];break;case 44:g.addPersonOrSystem("external_system",...h[f]),this.$=h[f];break;case 45:g.addPersonOrSystem("external_system_db",...h[f]),this.$=h[f];break;case 46:g.addPersonOrSystem("external_system_queue",...h[f]),this.$=h[f];break;case 47:g.addContainer("container",...h[f]),this.$=h[f];break;case 48:g.addContainer("container_db",...h[f]),this.$=h[f];break;case 49:g.addContainer("container_queue",...h[f]),this.$=h[f];break;case 50:g.addContainer("external_container",...h[f]),this.$=h[f];break;case 51:g.addContainer("external_container_db",...h[f]),this.$=h[f];break;case 52:g.addContainer("external_container_queue",...h[f]),this.$=h[f];break;case 53:g.addComponent("component",...h[f]),this.$=h[f];break;case 54:g.addComponent("component_db",...h[f]),this.$=h[f];break;case 55:g.addComponent("component_queue",...h[f]),this.$=h[f];break;case 56:g.addComponent("external_component",...h[f]),this.$=h[f];break;case 57:g.addComponent("external_component_db",...h[f]),this.$=h[f];break;case 58:g.addComponent("external_component_queue",...h[f]),this.$=h[f];break;case 60:g.addRel("rel",...h[f]),this.$=h[f];break;case 61:g.addRel("birel",...h[f]),this.$=h[f];break;case 62:g.addRel("rel_u",...h[f]),this.$=h[f];break;case 63:g.addRel("rel_d",...h[f]),this.$=h[f];break;case 64:g.addRel("rel_l",...h[f]),this.$=h[f];break;case 65:g.addRel("rel_r",...h[f]),this.$=h[f];break;case 66:g.addRel("rel_b",...h[f]),this.$=h[f];break;case 67:h[f].splice(0,1),g.addRel("rel",...h[f]),this.$=h[f];break;case 68:g.updateElStyle("update_el_style",...h[f]),this.$=h[f];break;case 69:g.updateRelStyle("update_rel_style",...h[f]),this.$=h[f];break;case 70:g.updateLayoutConfig("update_layout_config",...h[f]),this.$=h[f];break;case 71:this.$=[h[f]];break;case 72:h[f].unshift(h[f-1]),this.$=h[f];break;case 73:case 75:this.$=h[f].trim();break;case 74:let kt={};kt[h[f-1].trim()]=h[f].trim(),this.$=kt;break;case 76:this.$="";break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:a,29:49,30:61,32:62,34:n,36:r,37:i,38:u,39:d,40:y,41:p,43:23,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:70,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:a,29:49,30:61,32:62,34:n,36:r,37:i,38:u,39:d,40:y,41:p,43:23,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:71,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:a,29:49,30:61,32:62,34:n,36:r,37:i,38:u,39:d,40:y,41:p,43:23,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:72,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:a,29:49,30:61,32:62,34:n,36:r,37:i,38:u,39:d,40:y,41:p,43:23,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{13:73,19:20,20:21,21:22,22:t,23:s,24:o,26:l,28:a,29:49,30:61,32:62,34:n,36:r,37:i,38:u,39:d,40:y,41:p,43:23,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{14:[1,74]},e(wt,[2,13],{43:23,29:49,30:61,32:62,20:75,34:n,36:r,37:i,38:u,39:d,40:y,41:p,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt}),e(wt,[2,14]),e(Wt,[2,16],{12:[1,76]}),e(wt,[2,36],{12:[1,77]}),e(Rt,[2,19]),e(Rt,[2,20]),{25:[1,78]},{27:[1,79]},e(Rt,[2,23]),{35:80,75:81,76:E,77:A,79:C,80:w},{35:86,75:81,76:E,77:A,79:C,80:w},{35:87,75:81,76:E,77:A,79:C,80:w},{35:88,75:81,76:E,77:A,79:C,80:w},{35:89,75:81,76:E,77:A,79:C,80:w},{35:90,75:81,76:E,77:A,79:C,80:w},{35:91,75:81,76:E,77:A,79:C,80:w},{35:92,75:81,76:E,77:A,79:C,80:w},{35:93,75:81,76:E,77:A,79:C,80:w},{35:94,75:81,76:E,77:A,79:C,80:w},{35:95,75:81,76:E,77:A,79:C,80:w},{35:96,75:81,76:E,77:A,79:C,80:w},{35:97,75:81,76:E,77:A,79:C,80:w},{35:98,75:81,76:E,77:A,79:C,80:w},{35:99,75:81,76:E,77:A,79:C,80:w},{35:100,75:81,76:E,77:A,79:C,80:w},{35:101,75:81,76:E,77:A,79:C,80:w},{35:102,75:81,76:E,77:A,79:C,80:w},{35:103,75:81,76:E,77:A,79:C,80:w},{35:104,75:81,76:E,77:A,79:C,80:w},e(T,[2,59]),{35:105,75:81,76:E,77:A,79:C,80:w},{35:106,75:81,76:E,77:A,79:C,80:w},{35:107,75:81,76:E,77:A,79:C,80:w},{35:108,75:81,76:E,77:A,79:C,80:w},{35:109,75:81,76:E,77:A,79:C,80:w},{35:110,75:81,76:E,77:A,79:C,80:w},{35:111,75:81,76:E,77:A,79:C,80:w},{35:112,75:81,76:E,77:A,79:C,80:w},{35:113,75:81,76:E,77:A,79:C,80:w},{35:114,75:81,76:E,77:A,79:C,80:w},{35:115,75:81,76:E,77:A,79:C,80:w},{20:116,29:49,30:61,32:62,34:n,36:r,37:i,38:u,39:d,40:y,41:p,43:23,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt},{12:[1,118],33:[1,117]},{35:119,75:81,76:E,77:A,79:C,80:w},{35:120,75:81,76:E,77:A,79:C,80:w},{35:121,75:81,76:E,77:A,79:C,80:w},{35:122,75:81,76:E,77:A,79:C,80:w},{35:123,75:81,76:E,77:A,79:C,80:w},{35:124,75:81,76:E,77:A,79:C,80:w},{35:125,75:81,76:E,77:A,79:C,80:w},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},e(wt,[2,15]),e(Wt,[2,17],{21:22,19:130,22:t,23:s,24:o,26:l,28:a}),e(wt,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:t,23:s,24:o,26:l,28:a,34:n,36:r,37:i,38:u,39:d,40:y,41:p,44:k,45:O,46:S,47:P,48:M,49:U,50:H,51:q,52:G,53:K,54:J,55:Z,56:$,57:tt,58:et,59:at,60:it,61:rt,62:nt,63:st,64:lt,65:ot,66:ct,67:ht,68:ut,69:dt,70:ft,71:pt,72:yt,73:bt,74:gt}),e(Rt,[2,21]),e(Rt,[2,22]),e(T,[2,39]),e(ce,[2,71],{75:81,35:132,76:E,77:A,79:C,80:w}),e(It,[2,73]),{78:[1,133]},e(It,[2,75]),e(It,[2,76]),e(T,[2,40]),e(T,[2,41]),e(T,[2,42]),e(T,[2,43]),e(T,[2,44]),e(T,[2,45]),e(T,[2,46]),e(T,[2,47]),e(T,[2,48]),e(T,[2,49]),e(T,[2,50]),e(T,[2,51]),e(T,[2,52]),e(T,[2,53]),e(T,[2,54]),e(T,[2,55]),e(T,[2,56]),e(T,[2,57]),e(T,[2,58]),e(T,[2,60]),e(T,[2,61]),e(T,[2,62]),e(T,[2,63]),e(T,[2,64]),e(T,[2,65]),e(T,[2,66]),e(T,[2,67]),e(T,[2,68]),e(T,[2,69]),e(T,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},e(vt,[2,28]),e(vt,[2,29]),e(vt,[2,30]),e(vt,[2,31]),e(vt,[2,32]),e(vt,[2,33]),e(vt,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},e(Wt,[2,18]),e(wt,[2,38]),e(ce,[2,72]),e(It,[2,74]),e(T,[2,24]),e(T,[2,35]),e(Qt,[2,25]),e(Qt,[2,26],{12:[1,138]}),e(Qt,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:b(function(x,m){if(m.recoverable)this.trace(x);else{var v=new Error(x);throw v.hash=m,v}},"parseError"),parse:b(function(x){var m=this,v=[0],g=[],R=[null],h=[],St=this.table,f="",kt=0,he=0,ue=0,Le=2,de=1,Ne=h.slice.call(arguments,1),D=Object.create(this.lexer),Et={yy:{}};for(var qt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,qt)&&(Et.yy[qt]=this.yy[qt]);D.setInput(x,Et.yy),Et.yy.lexer=D,Et.yy.parser=this,typeof D.yylloc>"u"&&(D.yylloc={});var Gt=D.yylloc;h.push(Gt);var Ye=D.options&&D.options.ranges;typeof Et.yy.parseError=="function"?this.parseError=Et.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function je(L){v.length=v.length-2*L,R.length=R.length-L,h.length=h.length-L}b(je,"popStack");function fe(){var L;return L=g.pop()||D.lex()||de,typeof L!="number"&&(L instanceof Array&&(g=L,L=g.pop()),L=m.symbols_[L]||L),L}b(fe,"lex");for(var B,Kt,At,N,M0,Jt,Tt={},Lt,W,pe,Nt;;){if(At=v[v.length-1],this.defaultActions[At]?N=this.defaultActions[At]:((B===null||typeof B>"u")&&(B=fe()),N=St[At]&&St[At][B]),typeof N>"u"||!N.length||!N[0]){var Zt="";Nt=[];for(Lt in St[At])this.terminals_[Lt]&&Lt>Le&&Nt.push("'"+this.terminals_[Lt]+"'");D.showPosition?Zt="Parse error on line "+(kt+1)+`: +`+D.showPosition()+` +Expecting `+Nt.join(", ")+", got '"+(this.terminals_[B]||B)+"'":Zt="Parse error on line "+(kt+1)+": Unexpected "+(B==de?"end of input":"'"+(this.terminals_[B]||B)+"'"),this.parseError(Zt,{text:D.match,token:this.terminals_[B]||B,line:D.yylineno,loc:Gt,expected:Nt})}if(N[0]instanceof Array&&N.length>1)throw new Error("Parse Error: multiple actions possible at state: "+At+", token: "+B);switch(N[0]){case 1:v.push(B),R.push(D.yytext),h.push(D.yylloc),v.push(N[1]),B=null,Kt?(B=Kt,Kt=null):(he=D.yyleng,f=D.yytext,kt=D.yylineno,Gt=D.yylloc,ue>0&&ue--);break;case 2:if(W=this.productions_[N[1]][1],Tt.$=R[R.length-W],Tt._$={first_line:h[h.length-(W||1)].first_line,last_line:h[h.length-1].last_line,first_column:h[h.length-(W||1)].first_column,last_column:h[h.length-1].last_column},Ye&&(Tt._$.range=[h[h.length-(W||1)].range[0],h[h.length-1].range[1]]),Jt=this.performAction.apply(Tt,[f,he,kt,Et.yy,N[1],R,h].concat(Ne)),typeof Jt<"u")return Jt;W&&(v=v.slice(0,-1*W*2),R=R.slice(0,-1*W),h=h.slice(0,-1*W)),v.push(this.productions_[N[1]][0]),R.push(Tt.$),h.push(Tt._$),pe=St[v[v.length-2]][v[v.length-1]],v.push(pe);break;case 3:return!0}}return!0},"parse")},Me=(function(){var _t={EOF:1,parseError:b(function(m,v){if(this.yy.parser)this.yy.parser.parseError(m,v);else throw new Error(m)},"parseError"),setInput:b(function(x,m){return this.yy=m||this.yy||{},this._input=x,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:b(function(){var x=this._input[0];this.yytext+=x,this.yyleng++,this.offset++,this.match+=x,this.matched+=x;var m=x.match(/(?:\r\n?|\n).*/g);return m?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),x},"input"),unput:b(function(x){var m=x.length,v=x.split(/(?:\r\n?|\n)/g);this._input=x+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-m),this.offset-=m;var g=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),v.length-1&&(this.yylineno-=v.length-1);var R=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:v?(v.length===g.length?this.yylloc.first_column:0)+g[g.length-v.length].length-v[0].length:this.yylloc.first_column-m},this.options.ranges&&(this.yylloc.range=[R[0],R[0]+this.yyleng-m]),this.yyleng=this.yytext.length,this},"unput"),more:b(function(){return this._more=!0,this},"more"),reject:b(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:b(function(x){this.unput(this.match.slice(x))},"less"),pastInput:b(function(){var x=this.matched.substr(0,this.matched.length-this.match.length);return(x.length>20?"...":"")+x.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:b(function(){var x=this.match;return x.length<20&&(x+=this._input.substr(0,20-x.length)),(x.substr(0,20)+(x.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:b(function(){var x=this.pastInput(),m=new Array(x.length+1).join("-");return x+this.upcomingInput()+` +`+m+"^"},"showPosition"),test_match:b(function(x,m){var v,g,R;if(this.options.backtrack_lexer&&(R={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(R.yylloc.range=this.yylloc.range.slice(0))),g=x[0].match(/(?:\r\n?|\n).*/g),g&&(this.yylineno+=g.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:g?g[g.length-1].length-g[g.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+x[0].length},this.yytext+=x[0],this.match+=x[0],this.matches=x,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(x[0].length),this.matched+=x[0],v=this.performAction.call(this,this.yy,this,m,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),v)return v;if(this._backtrack){for(var h in R)this[h]=R[h];return!1}return!1},"test_match"),next:b(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var x,m,v,g;this._more||(this.yytext="",this.match="");for(var R=this._currentRules(),h=0;hm[0].length)){if(m=v,g=h,this.options.backtrack_lexer){if(x=this.test_match(v,R[h]),x!==!1)return x;if(this._backtrack){m=!1;continue}else return!1}else if(!this.options.flex)break}return m?(x=this.test_match(m,R[g]),x!==!1?x:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:b(function(){var m=this.next();return m||this.lex()},"lex"),begin:b(function(m){this.conditionStack.push(m)},"begin"),popState:b(function(){var m=this.conditionStack.length-1;return m>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:b(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:b(function(m){return m=this.conditionStack.length-1-Math.abs(m||0),m>=0?this.conditionStack[m]:"INITIAL"},"topState"),pushState:b(function(m){this.begin(m)},"pushState"),stateStackSize:b(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:b(function(m,v,g,R){var h=R;switch(g){case 0:return 6;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 22;case 5:return 23;case 6:return this.begin("acc_title"),24;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),26;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:break;case 14:c;break;case 15:return 12;case 16:break;case 17:return 11;case 18:return 15;case 19:return 16;case 20:return 17;case 21:return 18;case 22:return this.begin("person_ext"),45;break;case 23:return this.begin("person"),44;break;case 24:return this.begin("system_ext_queue"),51;break;case 25:return this.begin("system_ext_db"),50;break;case 26:return this.begin("system_ext"),49;break;case 27:return this.begin("system_queue"),48;break;case 28:return this.begin("system_db"),47;break;case 29:return this.begin("system"),46;break;case 30:return this.begin("boundary"),37;break;case 31:return this.begin("enterprise_boundary"),34;break;case 32:return this.begin("system_boundary"),36;break;case 33:return this.begin("container_ext_queue"),57;break;case 34:return this.begin("container_ext_db"),56;break;case 35:return this.begin("container_ext"),55;break;case 36:return this.begin("container_queue"),54;break;case 37:return this.begin("container_db"),53;break;case 38:return this.begin("container"),52;break;case 39:return this.begin("container_boundary"),38;break;case 40:return this.begin("component_ext_queue"),63;break;case 41:return this.begin("component_ext_db"),62;break;case 42:return this.begin("component_ext"),61;break;case 43:return this.begin("component_queue"),60;break;case 44:return this.begin("component_db"),59;break;case 45:return this.begin("component"),58;break;case 46:return this.begin("node"),39;break;case 47:return this.begin("node"),39;break;case 48:return this.begin("node_l"),40;break;case 49:return this.begin("node_r"),41;break;case 50:return this.begin("rel"),64;break;case 51:return this.begin("birel"),65;break;case 52:return this.begin("rel_u"),66;break;case 53:return this.begin("rel_u"),66;break;case 54:return this.begin("rel_d"),67;break;case 55:return this.begin("rel_d"),67;break;case 56:return this.begin("rel_l"),68;break;case 57:return this.begin("rel_l"),68;break;case 58:return this.begin("rel_r"),69;break;case 59:return this.begin("rel_r"),69;break;case 60:return this.begin("rel_b"),70;break;case 61:return this.begin("rel_index"),71;break;case 62:return this.begin("update_el_style"),72;break;case 63:return this.begin("update_rel_style"),73;break;case 64:return this.begin("update_layout_config"),74;break;case 65:return"EOF_IN_STRUCT";case 66:return this.begin("attribute"),"ATTRIBUTE_EMPTY";break;case 67:this.begin("attribute");break;case 68:this.popState(),this.popState();break;case 69:return 80;case 70:break;case 71:return 80;case 72:this.begin("string");break;case 73:this.popState();break;case 74:return"STR";case 75:this.begin("string_kv");break;case 76:return this.begin("string_kv_key"),"STR_KEY";break;case 77:this.popState(),this.begin("string_kv_value");break;case 78:return"STR_VALUE";case 79:this.popState(),this.popState();break;case 80:return"STR";case 81:return"LBRACE";case 82:return"RBRACE";case 83:return"SPACE";case 84:return"EOL";case 85:return 14}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},string_kv_value:{rules:[78,79],inclusive:!1},string_kv_key:{rules:[77],inclusive:!1},string_kv:{rules:[76],inclusive:!1},string:{rules:[73,74],inclusive:!1},attribute:{rules:[68,69,70,71,72,75,80],inclusive:!1},update_layout_config:{rules:[65,66,67,68],inclusive:!1},update_rel_style:{rules:[65,66,67,68],inclusive:!1},update_el_style:{rules:[65,66,67,68],inclusive:!1},rel_b:{rules:[65,66,67,68],inclusive:!1},rel_r:{rules:[65,66,67,68],inclusive:!1},rel_l:{rules:[65,66,67,68],inclusive:!1},rel_d:{rules:[65,66,67,68],inclusive:!1},rel_u:{rules:[65,66,67,68],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[65,66,67,68],inclusive:!1},node_r:{rules:[65,66,67,68],inclusive:!1},node_l:{rules:[65,66,67,68],inclusive:!1},node:{rules:[65,66,67,68],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[65,66,67,68],inclusive:!1},component_ext_queue:{rules:[65,66,67,68],inclusive:!1},component_ext_db:{rules:[65,66,67,68],inclusive:!1},component_ext:{rules:[65,66,67,68],inclusive:!1},component_queue:{rules:[65,66,67,68],inclusive:!1},component_db:{rules:[65,66,67,68],inclusive:!1},component:{rules:[65,66,67,68],inclusive:!1},container_boundary:{rules:[65,66,67,68],inclusive:!1},container_ext_queue:{rules:[65,66,67,68],inclusive:!1},container_ext_db:{rules:[65,66,67,68],inclusive:!1},container_ext:{rules:[65,66,67,68],inclusive:!1},container_queue:{rules:[65,66,67,68],inclusive:!1},container_db:{rules:[65,66,67,68],inclusive:!1},container:{rules:[65,66,67,68],inclusive:!1},birel:{rules:[65,66,67,68],inclusive:!1},system_boundary:{rules:[65,66,67,68],inclusive:!1},enterprise_boundary:{rules:[65,66,67,68],inclusive:!1},boundary:{rules:[65,66,67,68],inclusive:!1},system_ext_queue:{rules:[65,66,67,68],inclusive:!1},system_ext_db:{rules:[65,66,67,68],inclusive:!1},system_ext:{rules:[65,66,67,68],inclusive:!1},system_queue:{rules:[65,66,67,68],inclusive:!1},system_db:{rules:[65,66,67,68],inclusive:!1},system:{rules:[65,66,67,68],inclusive:!1},person_ext:{rules:[65,66,67,68],inclusive:!1},person:{rules:[65,66,67,68],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],inclusive:!0}}};return _t})();Ht.lexer=Me;function Mt(){this.yy={}}return b(Mt,"Parser"),Mt.prototype=Ht,Ht.Parser=Mt,new Mt})();Ut.parser=Ut;var Ve=Ut,V=[],xt=[""],I="global",F="",X=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],Bt=[],ne="",se=!1,Ft=4,Vt=2,we,ze=b(function(){return we},"getC4Type"),Xe=b(function(e){we=te(e,Ot())},"setC4Type"),We=b(function(e,t,s,o,l,a,n,r,i){if(e==null||t===void 0||t===null||s===void 0||s===null||o===void 0||o===null)return;let u={},d=Bt.find(y=>y.from===t&&y.to===s);if(d?u=d:Bt.push(u),u.type=e,u.from=t,u.to=s,u.label={text:o},l==null)u.techn={text:""};else if(typeof l=="object"){let[y,p]=Object.entries(l)[0];u[y]={text:p}}else u.techn={text:l};if(a==null)u.descr={text:""};else if(typeof a=="object"){let[y,p]=Object.entries(a)[0];u[y]={text:p}}else u.descr={text:a};if(typeof n=="object"){let[y,p]=Object.entries(n)[0];u[y]=p}else u.sprite=n;if(typeof r=="object"){let[y,p]=Object.entries(r)[0];u[y]=p}else u.tags=r;if(typeof i=="object"){let[y,p]=Object.entries(i)[0];u[y]=p}else u.link=i;u.wrap=mt()},"addRel"),Qe=b(function(e,t,s,o,l,a,n){if(t===null||s===null)return;let r={},i=V.find(u=>u.alias===t);if(i&&t===i.alias?r=i:(r.alias=t,V.push(r)),s==null?r.label={text:""}:r.label={text:s},o==null)r.descr={text:""};else if(typeof o=="object"){let[u,d]=Object.entries(o)[0];r[u]={text:d}}else r.descr={text:o};if(typeof l=="object"){let[u,d]=Object.entries(l)[0];r[u]=d}else r.sprite=l;if(typeof a=="object"){let[u,d]=Object.entries(a)[0];r[u]=d}else r.tags=a;if(typeof n=="object"){let[u,d]=Object.entries(n)[0];r[u]=d}else r.link=n;r.typeC4Shape={text:e},r.parentBoundary=I,r.wrap=mt()},"addPersonOrSystem"),He=b(function(e,t,s,o,l,a,n,r){if(t===null||s===null)return;let i={},u=V.find(d=>d.alias===t);if(u&&t===u.alias?i=u:(i.alias=t,V.push(i)),s==null?i.label={text:""}:i.label={text:s},o==null)i.techn={text:""};else if(typeof o=="object"){let[d,y]=Object.entries(o)[0];i[d]={text:y}}else i.techn={text:o};if(l==null)i.descr={text:""};else if(typeof l=="object"){let[d,y]=Object.entries(l)[0];i[d]={text:y}}else i.descr={text:l};if(typeof a=="object"){let[d,y]=Object.entries(a)[0];i[d]=y}else i.sprite=a;if(typeof n=="object"){let[d,y]=Object.entries(n)[0];i[d]=y}else i.tags=n;if(typeof r=="object"){let[d,y]=Object.entries(r)[0];i[d]=y}else i.link=r;i.wrap=mt(),i.typeC4Shape={text:e},i.parentBoundary=I},"addContainer"),qe=b(function(e,t,s,o,l,a,n,r){if(t===null||s===null)return;let i={},u=V.find(d=>d.alias===t);if(u&&t===u.alias?i=u:(i.alias=t,V.push(i)),s==null?i.label={text:""}:i.label={text:s},o==null)i.techn={text:""};else if(typeof o=="object"){let[d,y]=Object.entries(o)[0];i[d]={text:y}}else i.techn={text:o};if(l==null)i.descr={text:""};else if(typeof l=="object"){let[d,y]=Object.entries(l)[0];i[d]={text:y}}else i.descr={text:l};if(typeof a=="object"){let[d,y]=Object.entries(a)[0];i[d]=y}else i.sprite=a;if(typeof n=="object"){let[d,y]=Object.entries(n)[0];i[d]=y}else i.tags=n;if(typeof r=="object"){let[d,y]=Object.entries(r)[0];i[d]=y}else i.link=r;i.wrap=mt(),i.typeC4Shape={text:e},i.parentBoundary=I},"addComponent"),Ge=b(function(e,t,s,o,l){if(e===null||t===null)return;let a={},n=X.find(r=>r.alias===e);if(n&&e===n.alias?a=n:(a.alias=e,X.push(a)),t==null?a.label={text:""}:a.label={text:t},s==null)a.type={text:"system"};else if(typeof s=="object"){let[r,i]=Object.entries(s)[0];a[r]={text:i}}else a.type={text:s};if(typeof o=="object"){let[r,i]=Object.entries(o)[0];a[r]=i}else a.tags=o;if(typeof l=="object"){let[r,i]=Object.entries(l)[0];a[r]=i}else a.link=l;a.parentBoundary=I,a.wrap=mt(),F=I,I=e,xt.push(F)},"addPersonOrSystemBoundary"),Ke=b(function(e,t,s,o,l){if(e===null||t===null)return;let a={},n=X.find(r=>r.alias===e);if(n&&e===n.alias?a=n:(a.alias=e,X.push(a)),t==null?a.label={text:""}:a.label={text:t},s==null)a.type={text:"container"};else if(typeof s=="object"){let[r,i]=Object.entries(s)[0];a[r]={text:i}}else a.type={text:s};if(typeof o=="object"){let[r,i]=Object.entries(o)[0];a[r]=i}else a.tags=o;if(typeof l=="object"){let[r,i]=Object.entries(l)[0];a[r]=i}else a.link=l;a.parentBoundary=I,a.wrap=mt(),F=I,I=e,xt.push(F)},"addContainerBoundary"),Je=b(function(e,t,s,o,l,a,n,r){if(t===null||s===null)return;let i={},u=X.find(d=>d.alias===t);if(u&&t===u.alias?i=u:(i.alias=t,X.push(i)),s==null?i.label={text:""}:i.label={text:s},o==null)i.type={text:"node"};else if(typeof o=="object"){let[d,y]=Object.entries(o)[0];i[d]={text:y}}else i.type={text:o};if(l==null)i.descr={text:""};else if(typeof l=="object"){let[d,y]=Object.entries(l)[0];i[d]={text:y}}else i.descr={text:l};if(typeof n=="object"){let[d,y]=Object.entries(n)[0];i[d]=y}else i.tags=n;if(typeof r=="object"){let[d,y]=Object.entries(r)[0];i[d]=y}else i.link=r;i.nodeType=e,i.parentBoundary=I,i.wrap=mt(),F=I,I=t,xt.push(F)},"addDeploymentNode"),Ze=b(function(){I=F,xt.pop(),F=xt.pop(),xt.push(F)},"popBoundaryParseStack"),$e=b(function(e,t,s,o,l,a,n,r,i,u,d){let y=V.find(p=>p.alias===t);if(!(y===void 0&&(y=X.find(p=>p.alias===t),y===void 0))){if(s!=null)if(typeof s=="object"){let[p,k]=Object.entries(s)[0];y[p]=k}else y.bgColor=s;if(o!=null)if(typeof o=="object"){let[p,k]=Object.entries(o)[0];y[p]=k}else y.fontColor=o;if(l!=null)if(typeof l=="object"){let[p,k]=Object.entries(l)[0];y[p]=k}else y.borderColor=l;if(a!=null)if(typeof a=="object"){let[p,k]=Object.entries(a)[0];y[p]=k}else y.shadowing=a;if(n!=null)if(typeof n=="object"){let[p,k]=Object.entries(n)[0];y[p]=k}else y.shape=n;if(r!=null)if(typeof r=="object"){let[p,k]=Object.entries(r)[0];y[p]=k}else y.sprite=r;if(i!=null)if(typeof i=="object"){let[p,k]=Object.entries(i)[0];y[p]=k}else y.techn=i;if(u!=null)if(typeof u=="object"){let[p,k]=Object.entries(u)[0];y[p]=k}else y.legendText=u;if(d!=null)if(typeof d=="object"){let[p,k]=Object.entries(d)[0];y[p]=k}else y.legendSprite=d}},"updateElStyle"),t0=b(function(e,t,s,o,l,a,n){let r=Bt.find(i=>i.from===t&&i.to===s);if(r!==void 0){if(o!=null)if(typeof o=="object"){let[i,u]=Object.entries(o)[0];r[i]=u}else r.textColor=o;if(l!=null)if(typeof l=="object"){let[i,u]=Object.entries(l)[0];r[i]=u}else r.lineColor=l;if(a!=null)if(typeof a=="object"){let[i,u]=Object.entries(a)[0];r[i]=parseInt(u)}else r.offsetX=parseInt(a);if(n!=null)if(typeof n=="object"){let[i,u]=Object.entries(n)[0];r[i]=parseInt(u)}else r.offsetY=parseInt(n)}},"updateRelStyle"),e0=b(function(e,t,s){let o=Ft,l=Vt;if(typeof t=="object"){let a=Object.values(t)[0];o=parseInt(a)}else o=parseInt(t);if(typeof s=="object"){let a=Object.values(s)[0];l=parseInt(a)}else l=parseInt(s);o>=1&&(Ft=o),l>=1&&(Vt=l)},"updateLayoutConfig"),a0=b(function(){return Ft},"getC4ShapeInRow"),i0=b(function(){return Vt},"getC4BoundaryInRow"),r0=b(function(){return I},"getCurrentBoundaryParse"),n0=b(function(){return F},"getParentBoundaryParse"),Te=b(function(e){return e==null?V:V.filter(t=>t.parentBoundary===e)},"getC4ShapeArray"),s0=b(function(e){return V.find(t=>t.alias===e)},"getC4Shape"),l0=b(function(e){return Object.keys(Te(e))},"getC4ShapeKeys"),Oe=b(function(e){return e==null?X:X.filter(t=>t.parentBoundary===e)},"getBoundaries"),o0=Oe,c0=b(function(){return Bt},"getRels"),h0=b(function(){return ne},"getTitle"),u0=b(function(e){se=e},"setWrap"),mt=b(function(){return se},"autoWrap"),d0=b(function(){V=[],X=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],F="",I="global",xt=[""],Bt=[],xt=[""],ne="",se=!1,Ft=4,Vt=2},"clear"),f0={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},p0={FILLED:0,OPEN:1},y0={LEFTOF:0,RIGHTOF:1,OVER:2},b0=b(function(e){ne=te(e,Ot())},"setTitle"),ae={addPersonOrSystem:Qe,addPersonOrSystemBoundary:Ge,addContainer:He,addContainerBoundary:Ke,addComponent:qe,addDeploymentNode:Je,popBoundaryParseStack:Ze,addRel:We,updateElStyle:$e,updateRelStyle:t0,updateLayoutConfig:e0,autoWrap:mt,setWrap:u0,getC4ShapeArray:Te,getC4Shape:s0,getC4ShapeKeys:l0,getBoundaries:Oe,getBoundarys:o0,getCurrentBoundaryParse:r0,getParentBoundaryParse:n0,getRels:c0,getTitle:h0,getC4Type:ze,getC4ShapeInRow:a0,getC4BoundaryInRow:i0,setAccTitle:ge,getAccTitle:_e,getAccDescription:me,setAccDescription:xe,getConfig:b(()=>Ot().c4,"getConfig"),clear:d0,LINETYPE:f0,ARROWTYPE:p0,PLACEMENT:y0,setTitle:b0,setC4Type:Xe},le=b(function(e,t){return ke(e,t)},"drawRect"),Se=b(function(e,t,s,o,l,a){let n=e.append("image");n.attr("width",t),n.attr("height",s),n.attr("x",o),n.attr("y",l);let r=a.startsWith("data:image/png;base64")?a:(0,Re.sanitizeUrl)(a);n.attr("xlink:href",r)},"drawImage"),g0=b((e,t,s)=>{let o=e.append("g"),l=0;for(let a of t){let n=a.textColor?a.textColor:"#444444",r=a.lineColor?a.lineColor:"#444444",i=a.offsetX?parseInt(a.offsetX):0,u=a.offsetY?parseInt(a.offsetY):0,d="";if(l===0){let p=o.append("line");p.attr("x1",a.startPoint.x),p.attr("y1",a.startPoint.y),p.attr("x2",a.endPoint.x),p.attr("y2",a.endPoint.y),p.attr("stroke-width","1"),p.attr("stroke",r),p.style("fill","none"),a.type!=="rel_b"&&p.attr("marker-end","url("+d+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+d+"#arrowend)"),l=-1}else{let p=o.append("path");p.attr("fill","none").attr("stroke-width","1").attr("stroke",r).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),a.type!=="rel_b"&&p.attr("marker-end","url("+d+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+d+"#arrowend)")}let y=s.messageFont();Q(s)(a.label.text,o,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+i,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+u,a.label.width,a.label.height,{fill:n},y),a.techn&&a.techn.text!==""&&(y=s.messageFont(),Q(s)("["+a.techn.text+"]",o,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+i,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+s.messageFontSize+5+u,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:n,"font-style":"italic"},y))}},"drawRels"),_0=b(function(e,t,s){let o=e.append("g"),l=t.bgColor?t.bgColor:"none",a=t.borderColor?t.borderColor:"#444444",n=t.fontColor?t.fontColor:"black",r={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};t.nodeType&&(r={"stroke-width":1});let i={x:t.x,y:t.y,fill:l,stroke:a,width:t.width,height:t.height,rx:2.5,ry:2.5,attrs:r};le(o,i);let u=s.boundaryFont();u.fontWeight="bold",u.fontSize=u.fontSize+2,u.fontColor=n,Q(s)(t.label.text,o,t.x,t.y+t.label.Y,t.width,t.height,{fill:"#444444"},u),t.type&&t.type.text!==""&&(u=s.boundaryFont(),u.fontColor=n,Q(s)(t.type.text,o,t.x,t.y+t.type.Y,t.width,t.height,{fill:"#444444"},u)),t.descr&&t.descr.text!==""&&(u=s.boundaryFont(),u.fontSize=u.fontSize-2,u.fontColor=n,Q(s)(t.descr.text,o,t.x,t.y+t.descr.Y,t.width,t.height,{fill:"#444444"},u))},"drawBoundary"),x0=b(function(e,t,s){let o=t.bgColor?t.bgColor:s[t.typeC4Shape.text+"_bg_color"],l=t.borderColor?t.borderColor:s[t.typeC4Shape.text+"_border_color"],a=t.fontColor?t.fontColor:"#FFFFFF",n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(t.typeC4Shape.text){case"person":n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=";break}let r=e.append("g");r.attr("class","person-man");let i=Ee();switch(t.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":i.x=t.x,i.y=t.y,i.fill=o,i.width=t.width,i.height=t.height,i.stroke=l,i.rx=2.5,i.ry=2.5,i.attrs={"stroke-width":.5},le(r,i);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":r.append("path").attr("fill",o).attr("stroke-width","0.5").attr("stroke",l).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",t.x).replaceAll("starty",t.y).replaceAll("half",t.width/2).replaceAll("height",t.height)),r.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",l).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",t.x).replaceAll("starty",t.y).replaceAll("half",t.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":r.append("path").attr("fill",o).attr("stroke-width","0.5").attr("stroke",l).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",t.x).replaceAll("starty",t.y).replaceAll("width",t.width).replaceAll("half",t.height/2)),r.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",l).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",t.x+t.width).replaceAll("starty",t.y).replaceAll("half",t.height/2));break}let u=O0(s,t.typeC4Shape.text);switch(r.append("text").attr("fill",a).attr("font-family",u.fontFamily).attr("font-size",u.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",t.typeC4Shape.width).attr("x",t.x+t.width/2-t.typeC4Shape.width/2).attr("y",t.y+t.typeC4Shape.Y).text("<<"+t.typeC4Shape.text+">>"),t.typeC4Shape.text){case"person":case"external_person":Se(r,48,48,t.x+t.width/2-24,t.y+t.image.Y,n);break}let d=s[t.typeC4Shape.text+"Font"]();return d.fontWeight="bold",d.fontSize=d.fontSize+2,d.fontColor=a,Q(s)(t.label.text,r,t.x,t.y+t.label.Y,t.width,t.height,{fill:a},d),d=s[t.typeC4Shape.text+"Font"](),d.fontColor=a,t.techn&&t.techn?.text!==""?Q(s)(t.techn.text,r,t.x,t.y+t.techn.Y,t.width,t.height,{fill:a,"font-style":"italic"},d):t.type&&t.type.text!==""&&Q(s)(t.type.text,r,t.x,t.y+t.type.Y,t.width,t.height,{fill:a,"font-style":"italic"},d),t.descr&&t.descr.text!==""&&(d=s.personFont(),d.fontColor=a,Q(s)(t.descr.text,r,t.x,t.y+t.descr.Y,t.width,t.height,{fill:a},d)),t.height},"drawC4Shape"),m0=b(function(e){e.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),v0=b(function(e){e.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),k0=b(function(e){e.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),E0=b(function(e){e.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},"insertArrowHead"),A0=b(function(e){e.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},"insertArrowEnd"),C0=b(function(e){e.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),w0=b(function(e){e.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertDynamicNumber"),T0=b(function(e){let s=e.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);s.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),s.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},"insertArrowCrossHead"),O0=b((e,t)=>({fontFamily:e[t+"FontFamily"],fontSize:e[t+"FontSize"],fontWeight:e[t+"FontWeight"]}),"getC4ShapeFont"),Q=(function(){function e(l,a,n,r,i,u,d){let y=a.append("text").attr("x",n+i/2).attr("y",r+u/2+5).style("text-anchor","middle").text(l);o(y,d)}b(e,"byText");function t(l,a,n,r,i,u,d,y){let{fontSize:p,fontFamily:k,fontWeight:O}=y,S=l.split(Yt.lineBreakRegex);for(let P=0;P=this.data.widthLimit||s>=this.data.widthLimit||this.nextData.cnt>De)&&(t=this.nextData.startx+e.margin+_.nextLinePaddingX,o=this.nextData.stopy+e.margin*2,this.nextData.stopx=s=t+e.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=l=o+e.height,this.nextData.cnt=1),e.x=t,e.y=o,this.updateVal(this.data,"startx",t,Math.min),this.updateVal(this.data,"starty",o,Math.min),this.updateVal(this.data,"stopx",s,Math.max),this.updateVal(this.data,"stopy",l,Math.max),this.updateVal(this.nextData,"startx",t,Math.min),this.updateVal(this.nextData,"starty",o,Math.min),this.updateVal(this.nextData,"stopx",s,Math.max),this.updateVal(this.nextData,"stopy",l,Math.max)}init(e){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},re(e.db.getConfig())}bumpLastMargin(e){this.data.stopx+=e,this.data.stopy+=e}},re=b(function(e){ye(_,e),e.fontFamily&&(_.personFontFamily=_.systemFontFamily=_.messageFontFamily=e.fontFamily),e.fontSize&&(_.personFontSize=_.systemFontSize=_.messageFontSize=e.fontSize),e.fontWeight&&(_.personFontWeight=_.systemFontWeight=_.messageFontWeight=e.fontWeight)},"setConf"),Pt=b((e,t)=>({fontFamily:e[t+"FontFamily"],fontSize:e[t+"FontSize"],fontWeight:e[t+"FontWeight"]}),"c4ShapeFont"),jt=b(e=>({fontFamily:e.boundaryFontFamily,fontSize:e.boundaryFontSize,fontWeight:e.boundaryFontWeight}),"boundaryFont"),R0=b(e=>({fontFamily:e.messageFontFamily,fontSize:e.messageFontSize,fontWeight:e.messageFontWeight}),"messageFont");function j(e,t,s,o,l){if(!t[e].width)if(s)t[e].text=ve(t[e].text,l,o),t[e].textLines=t[e].text.split(Yt.lineBreakRegex).length,t[e].width=l,t[e].height=ee(t[e].text,o);else{let a=t[e].text.split(Yt.lineBreakRegex);t[e].textLines=a.length;let n=0;t[e].height=0,t[e].width=0;for(let r of a)t[e].width=Math.max(Ct(r,o),t[e].width),n=ee(r,o),t[e].height=t[e].height+n}}b(j,"calcC4ShapeTextWH");var Be=b(function(e,t,s){t.x=s.data.startx,t.y=s.data.starty,t.width=s.data.stopx-s.data.startx,t.height=s.data.stopy-s.data.starty,t.label.y=_.c4ShapeMargin-35;let o=t.wrap&&_.wrap,l=jt(_);l.fontSize=l.fontSize+2,l.fontWeight="bold";let a=Ct(t.label.text,l);j("label",t,o,l,a),z.drawBoundary(e,t,_)},"drawBoundary"),Ie=b(function(e,t,s,o){let l=0;for(let a of o){l=0;let n=s[a],r=Pt(_,n.typeC4Shape.text);switch(r.fontSize=r.fontSize-2,n.typeC4Shape.width=Ct("\xAB"+n.typeC4Shape.text+"\xBB",r),n.typeC4Shape.height=r.fontSize+2,n.typeC4Shape.Y=_.c4ShapePadding,l=n.typeC4Shape.Y+n.typeC4Shape.height-4,n.image={width:0,height:0,Y:0},n.typeC4Shape.text){case"person":case"external_person":n.image.width=48,n.image.height=48,n.image.Y=l,l=n.image.Y+n.image.height;break}n.sprite&&(n.image.width=48,n.image.height=48,n.image.Y=l,l=n.image.Y+n.image.height);let i=n.wrap&&_.wrap,u=_.width-_.c4ShapePadding*2,d=Pt(_,n.typeC4Shape.text);if(d.fontSize=d.fontSize+2,d.fontWeight="bold",j("label",n,i,d,u),n.label.Y=l+8,l=n.label.Y+n.label.height,n.type&&n.type.text!==""){n.type.text="["+n.type.text+"]";let k=Pt(_,n.typeC4Shape.text);j("type",n,i,k,u),n.type.Y=l+5,l=n.type.Y+n.type.height}else if(n.techn&&n.techn.text!==""){n.techn.text="["+n.techn.text+"]";let k=Pt(_,n.techn.text);j("techn",n,i,k,u),n.techn.Y=l+5,l=n.techn.Y+n.techn.height}let y=l,p=n.label.width;if(n.descr&&n.descr.text!==""){let k=Pt(_,n.typeC4Shape.text);j("descr",n,i,k,u),n.descr.Y=l+20,l=n.descr.Y+n.descr.height,p=Math.max(n.label.width,n.descr.width),y=l-n.descr.textLines*5}p=p+_.c4ShapePadding,n.width=Math.max(n.width||_.width,p,_.width),n.height=Math.max(n.height||_.height,y,_.height),n.margin=n.margin||_.c4ShapeMargin,e.insert(n),z.drawC4Shape(t,n,_)}e.bumpLastMargin(_.c4ShapeMargin)},"drawC4ShapeArray"),Y=class{static{b(this,"Point")}constructor(e,t){this.x=e,this.y=t}},Ae=b(function(e,t){let s=e.x,o=e.y,l=t.x,a=t.y,n=s+e.width/2,r=o+e.height/2,i=Math.abs(s-l),u=Math.abs(o-a),d=u/i,y=e.height/e.width,p=null;return o==a&&sl?p=new Y(s,r):s==l&&oa&&(p=new Y(n,o)),s>l&&o=d?p=new Y(s,r+d*e.width/2):p=new Y(n-i/u*e.height/2,o+e.height):s=d?p=new Y(s+e.width,r+d*e.width/2):p=new Y(n+i/u*e.height/2,o+e.height):sa?y>=d?p=new Y(s+e.width,r-d*e.width/2):p=new Y(n+e.height/2*i/u,o):s>l&&o>a&&(y>=d?p=new Y(s,r-e.width/2*d):p=new Y(n-e.height/2*i/u,o)),p},"getIntersectPoint"),S0=b(function(e,t){let s={x:0,y:0};s.x=t.x+t.width/2,s.y=t.y+t.height/2;let o=Ae(e,s);s.x=e.x+e.width/2,s.y=e.y+e.height/2;let l=Ae(t,s);return{startPoint:o,endPoint:l}},"getIntersectPoints"),D0=b(function(e,t,s,o){let l=0;for(let a of t){l=l+1;let n=a.wrap&&_.wrap,r=R0(_);o.db.getC4Type()==="C4Dynamic"&&(a.label.text=l+": "+a.label.text);let u=Ct(a.label.text,r);j("label",a,n,r,u),a.techn&&a.techn.text!==""&&(u=Ct(a.techn.text,r),j("techn",a,n,r,u)),a.descr&&a.descr.text!==""&&(u=Ct(a.descr.text,r),j("descr",a,n,r,u));let d=s(a.from),y=s(a.to),p=S0(d,y);a.startPoint=p.startPoint,a.endPoint=p.endPoint}z.drawRels(e,t,_)},"drawRels");function oe(e,t,s,o,l){let a=new Pe(l);a.data.widthLimit=s.data.widthLimit/Math.min(ie,o.length);for(let[n,r]of o.entries()){let i=0;r.image={width:0,height:0,Y:0},r.sprite&&(r.image.width=48,r.image.height=48,r.image.Y=i,i=r.image.Y+r.image.height);let u=r.wrap&&_.wrap,d=jt(_);if(d.fontSize=d.fontSize+2,d.fontWeight="bold",j("label",r,u,d,a.data.widthLimit),r.label.Y=i+8,i=r.label.Y+r.label.height,r.type&&r.type.text!==""){r.type.text="["+r.type.text+"]";let O=jt(_);j("type",r,u,O,a.data.widthLimit),r.type.Y=i+5,i=r.type.Y+r.type.height}if(r.descr&&r.descr.text!==""){let O=jt(_);O.fontSize=O.fontSize-2,j("descr",r,u,O,a.data.widthLimit),r.descr.Y=i+20,i=r.descr.Y+r.descr.height}if(n==0||n%ie===0){let O=s.data.startx+_.diagramMarginX,S=s.data.stopy+_.diagramMarginY+i;a.setData(O,O,S,S)}else{let O=a.data.stopx!==a.data.startx?a.data.stopx+_.diagramMarginX:a.data.startx,S=a.data.starty;a.setData(O,O,S,S)}a.name=r.alias;let y=l.db.getC4ShapeArray(r.alias),p=l.db.getC4ShapeKeys(r.alias);p.length>0&&Ie(a,e,y,p),t=r.alias;let k=l.db.getBoundaries(t);k.length>0&&oe(e,t,a,k,l),r.alias!=="global"&&Be(e,r,a),s.data.stopy=Math.max(a.data.stopy+_.c4ShapeMargin,s.data.stopy),s.data.stopx=Math.max(a.data.stopx+_.c4ShapeMargin,s.data.stopx),zt=Math.max(zt,s.data.stopx),Xt=Math.max(Xt,s.data.stopy)}}b(oe,"drawInsideBoundary");var P0=b(function(e,t,s,o){_=Ot().c4;let l=Ot().securityLevel,a;l==="sandbox"&&(a=Dt("#i"+t));let n=l==="sandbox"?Dt(a.nodes()[0].contentDocument.body):Dt("body"),r=o.db;o.db.setWrap(_.wrap),De=r.getC4ShapeInRow(),ie=r.getC4BoundaryInRow(),$t.debug(`C:${JSON.stringify(_,null,2)}`);let i=l==="sandbox"?n.select(`[id="${t}"]`):Dt(`[id="${t}"]`);z.insertComputerIcon(i),z.insertDatabaseIcon(i),z.insertClockIcon(i);let u=new Pe(o);u.setData(_.diagramMarginX,_.diagramMarginX,_.diagramMarginY,_.diagramMarginY),u.data.widthLimit=screen.availWidth,zt=_.diagramMarginX,Xt=_.diagramMarginY;let d=o.db.getTitle(),y=o.db.getBoundaries("");oe(i,"",u,y,o),z.insertArrowHead(i),z.insertArrowEnd(i),z.insertArrowCrossHead(i),z.insertArrowFilledHead(i),D0(i,o.db.getRels(),o.db.getC4Shape,o),u.data.stopx=zt,u.data.stopy=Xt;let p=u.data,O=p.stopy-p.starty+2*_.diagramMarginY,P=p.stopx-p.startx+2*_.diagramMarginX;d&&i.append("text").text(d).attr("x",(p.stopx-p.startx)/2-4*_.diagramMarginX).attr("y",p.starty+_.diagramMarginY),be(i,O,P,_.useMaxWidth);let M=d?60:0;i.attr("viewBox",p.startx-_.diagramMarginX+" -"+(_.diagramMarginY+M)+" "+P+" "+(O+M)),$t.debug("models:",p)},"draw"),Ce={drawPersonOrSystemArray:Ie,drawBoundary:Be,setConf:re,draw:P0},B0=b(e=>`.person { + stroke: ${e.personBorder}; + fill: ${e.personBkg}; + } +`,"getStyles"),I0=B0,F0={parser:Ve,db:ae,renderer:Ce,styles:I0,init:b(({c4:e,wrap:t})=>{Ce.setConf(e),ae.setWrap(t)},"init")};export{F0 as diagram}; diff --git a/src/google/adk/cli/browser/chunk-WR6HISGZ.js b/src/google/adk/cli/browser/chunk-WR6HISGZ.js new file mode 100644 index 0000000000..7aae439561 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-WR6HISGZ.js @@ -0,0 +1 @@ +import{a as o,b as n,c as i,d as s,e as m,f as e,g as u,l as d,o as c,q as l}from"./chunk-NALL4A3P.js";var v=class extends l{static{e(this,"PieTokenBuilder")}constructor(){super(["pie","showData"])}},C=class extends c{static{e(this,"PieValueConverter")}runCustomConverter(t,r,a){if(t.name==="PIE_SECTION_LABEL")return r.replace(/"/g,"").trim()}},P={parser:{TokenBuilder:e(()=>new v,"TokenBuilder"),ValueConverter:e(()=>new C,"ValueConverter")}};function p(t=s){let r=i(n(t),u),a=i(o({shared:r}),d,P);return r.ServiceRegistry.register(a),{shared:r,Pie:a}}e(p,"createPieServices");export{P as a,p as b}; diff --git a/src/google/adk/cli/browser/chunk-WXI2IBAH.js b/src/google/adk/cli/browser/chunk-WXI2IBAH.js new file mode 100644 index 0000000000..5a61e20bc3 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-WXI2IBAH.js @@ -0,0 +1,70 @@ +import{o as ze}from"./chunk-WBLSVR3V.js";import{A as ee,G as W,J as te,L as Ie,M as Re}from"./chunk-QFMJV7VH.js";import{a as P,g as b,i as E}from"./chunk-JRNAXTJ7.js";import{a as x,b as z,j as T}from"./chunk-RMXJBC7V.js";var dt=Object.freeze({left:0,top:0,width:16,height:16}),_=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),ne=Object.freeze(x(x({},dt),_)),ve=Object.freeze(z(x({},ne),{body:"",hidden:!1}));var mt=Object.freeze({width:null,height:null}),Ae=Object.freeze(x(x({},mt),_));var re=(n,e,r,s="")=>{let t=n.split(":");if(n.slice(0,1)==="@"){if(t.length<2||t.length>3)return null;s=t.shift().slice(1)}if(t.length>3||!t.length)return null;if(t.length>1){let l=t.pop(),a=t.pop(),p={provider:t.length>0?t[0]:s,prefix:a,name:l};return e&&!G(p)?null:p}let o=t[0],i=o.split("-");if(i.length>1){let l={provider:s,prefix:i.shift(),name:i.join("-")};return e&&!G(l)?null:l}if(r&&s===""){let l={provider:s,prefix:"",name:o};return e&&!G(l,r)?null:l}return null},G=(n,e)=>n?!!((e&&n.prefix===""||n.prefix)&&n.name):!1;function Ee(n,e){let r={};!n.hFlip!=!e.hFlip&&(r.hFlip=!0),!n.vFlip!=!e.vFlip&&(r.vFlip=!0);let s=((n.rotate||0)+(e.rotate||0))%4;return s&&(r.rotate=s),r}function se(n,e){let r=Ee(n,e);for(let s in ve)s in _?s in n&&!(s in r)&&(r[s]=_[s]):s in e?r[s]=e[s]:s in n&&(r[s]=n[s]);return r}function Le(n,e){let r=n.icons,s=n.aliases||Object.create(null),t=Object.create(null);function o(i){if(r[i])return t[i]=[];if(!(i in t)){t[i]=null;let l=s[i]&&s[i].parent,a=l&&o(l);a&&(t[i]=[l].concat(a))}return t[i]}return(e||Object.keys(r).concat(Object.keys(s))).forEach(o),t}function Ce(n,e,r){let s=n.icons,t=n.aliases||Object.create(null),o={};function i(l){o=se(s[l]||t[l],o)}return i(e),r.forEach(i),se(n,o)}function ie(n,e){if(n.icons[e])return Ce(n,e,[]);let r=Le(n,[e])[e];return r?Ce(n,e,r):null}var kt=/(-?[0-9.]*[0-9]+[0-9.]*)/g,xt=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function oe(n,e,r){if(e===1)return n;if(r=r||100,typeof n=="number")return Math.ceil(n*e*r)/r;if(typeof n!="string")return n;let s=n.split(kt);if(s===null||!s.length)return n;let t=[],o=s.shift(),i=xt.test(o);for(;;){if(i){let l=parseFloat(o);isNaN(l)?t.push(o):t.push(Math.ceil(l*e*r)/r)}else t.push(o);if(o=s.shift(),o===void 0)return t.join("");i=!i}}function bt(n,e="defs"){let r="",s=n.indexOf("<"+e);for(;s>=0;){let t=n.indexOf(">",s),o=n.indexOf("",o);if(i===-1)break;r+=n.slice(t+1,o).trim(),n=n.slice(0,s).trim()+n.slice(i+1)}return{defs:r,content:n}}function wt(n,e){return n?""+n+""+e:e}function Pe(n,e,r){let s=bt(n);return wt(s.defs,e+s.content+r)}var yt=n=>n==="unset"||n==="undefined"||n==="none";function le(n,e){let r=x(x({},ne),n),s=x(x({},Ae),e),t={left:r.left,top:r.top,width:r.width,height:r.height},o=r.body;[r,s].forEach(k=>{let w=[],A=k.hFlip,j=k.vFlip,$=k.rotate;A?j?$+=2:(w.push("translate("+(t.width+t.left).toString()+" "+(0-t.top).toString()+")"),w.push("scale(-1 1)"),t.top=t.left=0):j&&(w.push("translate("+(0-t.left).toString()+" "+(t.height+t.top).toString()+")"),w.push("scale(1 -1)"),t.top=t.left=0);let S;switch($<0&&($-=Math.floor($/4)*4),$=$%4,$){case 1:S=t.height/2+t.top,w.unshift("rotate(90 "+S.toString()+" "+S.toString()+")");break;case 2:w.unshift("rotate(180 "+(t.width/2+t.left).toString()+" "+(t.height/2+t.top).toString()+")");break;case 3:S=t.width/2+t.left,w.unshift("rotate(-90 "+S.toString()+" "+S.toString()+")");break}$%2===1&&(t.left!==t.top&&(S=t.left,t.left=t.top,t.top=S),t.width!==t.height&&(S=t.width,t.width=t.height,t.height=S)),w.length&&(o=Pe(o,'',""))});let i=s.width,l=s.height,a=t.width,p=t.height,c,h;i===null?(h=l===null?"1em":l==="auto"?p:l,c=oe(h,a/p)):(c=i==="auto"?a:i,h=l===null?oe(c,p/a):l==="auto"?p:l);let u={},g=(k,w)=>{yt(w)||(u[k]=w.toString())};g("width",c),g("height",h);let f=[t.left,t.top,a,p];return u.viewBox=f.join(" "),{attributes:u,viewBox:f,body:o}}var St=/\sid="(\S+)"/g,_e=new Map;function Tt(n){n=n.replace(/[0-9]+$/,"")||"a";let e=_e.get(n)||0;return _e.set(n,e+1),e?`${n}${e}`:n}function ae(n){let e=[],r;for(;r=St.exec(n);)e.push(r[1]);if(!e.length)return n;let s="suffix"+(Math.random()*16777216|Date.now()).toString(16);return e.forEach(t=>{let o=Tt(t),i=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");n=n.replace(new RegExp('([#;"])('+i+')([")]|\\.[a-z])',"g"),"$1"+o+s+"$3")}),n=n.replace(new RegExp(s,"g"),""),n}function ce(n,e){let r=n.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(let s in e)r+=" "+s+'="'+e[s]+'"';return'"+n+""}function fe(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var C=fe();function Oe(n){C=n}var F={exec:()=>null};function d(n,e=""){let r=typeof n=="string"?n:n.source,s={replace:(t,o)=>{let i=typeof o=="string"?o:o.source;return i=i.replace(y.caret,"$1"),r=r.replace(t,i),s},getRegex:()=>new RegExp(r,e)};return s}var $t=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^
        /i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:n=>new RegExp(`^( {0,3}${n})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}#`),htmlBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}<(?:[a-z].*>|!--)`,"i")},It=/^(?:[ \t]*(?:\n|$))+/,Rt=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,zt=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,O=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,vt=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,ge=/(?:[*+-]|\d{1,9}[.)])/,We=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Ge=d(We).replace(/bull/g,ge).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),At=d(We).replace(/bull/g,ge).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),de=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Et=/^[^\n]+/,me=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,Lt=d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",me).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Ct=d(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,ge).getRegex(),U="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",ke=/|$))/,Pt=d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",ke).replace("tag",U).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),He=d(de).replace("hr",O).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",U).getRegex(),_t=d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",He).getRegex(),xe={blockquote:_t,code:Rt,def:Lt,fences:zt,heading:vt,hr:O,html:Pt,lheading:Ge,list:Ct,newline:It,paragraph:He,table:F,text:Et},je=d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",O).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",U).getRegex(),jt=z(x({},xe),{lheading:At,table:je,paragraph:d(de).replace("hr",O).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",je).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",U).getRegex()}),Bt=z(x({},xe),{html:d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",ke).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:F,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:d(de).replace("hr",O).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",Ge).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()}),Dt=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Mt=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Ze=/^( {2,}|\\)\n(?!\s*$)/,qt=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",$t?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),Ue=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,Ht=d(Ue,"u").replace(/punct/g,Q).getRegex(),Zt=d(Ue,"u").replace(/punct/g,Ve).getRegex(),Qe="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Nt=d(Qe,"gu").replace(/notPunctSpace/g,Ne).replace(/punctSpace/g,be).replace(/punct/g,Q).getRegex(),Vt=d(Qe,"gu").replace(/notPunctSpace/g,Wt).replace(/punctSpace/g,Ot).replace(/punct/g,Ve).getRegex(),Ut=d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Ne).replace(/punctSpace/g,be).replace(/punct/g,Q).getRegex(),Qt=d(/\\(punct)/,"gu").replace(/punct/g,Q).getRegex(),Kt=d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Xt=d(ke).replace("(?:-->|$)","-->").getRegex(),Yt=d("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",Xt).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Z=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,Jt=d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",Z).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Ke=d(/^!?\[(label)\]\[(ref)\]/).replace("label",Z).replace("ref",me).getRegex(),Xe=d(/^!?\[(ref)\](?:\[\])?/).replace("ref",me).getRegex(),en=d("reflink|nolink(?!\\()","g").replace("reflink",Ke).replace("nolink",Xe).getRegex(),Be=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,we={_backpedal:F,anyPunctuation:Qt,autolink:Kt,blockSkip:Gt,br:Ze,code:Mt,del:F,emStrongLDelim:Ht,emStrongRDelimAst:Nt,emStrongRDelimUnd:Ut,escape:Dt,link:Jt,nolink:Xe,punctuation:Ft,reflink:Ke,reflinkSearch:en,tag:Yt,text:qt,url:F},tn=z(x({},we),{link:d(/^!?\[(label)\]\((.*?)\)/).replace("label",Z).getRegex(),reflink:d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Z).getRegex()}),pe=z(x({},we),{emStrongRDelimAst:Vt,emStrongLDelim:Zt,url:d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",Be).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:d(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},De=n=>rn[n];function v(n,e){if(e){if(y.escapeTest.test(n))return n.replace(y.escapeReplace,De)}else if(y.escapeTestNoEncode.test(n))return n.replace(y.escapeReplaceNoEncode,De);return n}function Me(n){try{n=encodeURI(n).replace(y.percentDecode,"%")}catch(e){return null}return n}function qe(n,e){let r=n.replace(y.findPipe,(o,i,l)=>{let a=!1,p=i;for(;--p>=0&&l[p]==="\\";)a=!a;return a?"|":" |"}),s=r.split(y.splitPipe),t=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),e)if(s.length>e)s.splice(e);else for(;s.length0?-2:-1}function Fe(n,e,r,s,t){let o=e.href,i=e.title||null,l=n[1].replace(t.other.outputLinkReplace,"$1");s.state.inLink=!0;let a={type:n[0].charAt(0)==="!"?"image":"link",raw:r,href:o,title:i,text:l,tokens:s.inlineTokens(l)};return s.state.inLink=!1,a}function on(n,e,r){let s=n.match(r.other.indentCodeCompensation);if(s===null)return e;let t=s[1];return e.split(` +`).map(o=>{let i=o.match(r.other.beginningSpace);if(i===null)return o;let[l]=i;return l.length>=t.length?o.slice(t.length):o}).join(` +`)}var N=class{options;rules;lexer;constructor(n){this.options=n||C}space(n){let e=this.rules.block.newline.exec(n);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(n){let e=this.rules.block.code.exec(n);if(e){let r=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?r:M(r,` +`)}}}fences(n){let e=this.rules.block.fences.exec(n);if(e){let r=e[0],s=on(r,e[3]||"",this.rules);return{type:"code",raw:r,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:s}}}heading(n){let e=this.rules.block.heading.exec(n);if(e){let r=e[2].trim();if(this.rules.other.endingHash.test(r)){let s=M(r,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(r=s.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:r,tokens:this.lexer.inline(r)}}}hr(n){let e=this.rules.block.hr.exec(n);if(e)return{type:"hr",raw:M(e[0],` +`)}}blockquote(n){let e=this.rules.block.blockquote.exec(n);if(e){let r=M(e[0],` +`).split(` +`),s="",t="",o=[];for(;r.length>0;){let i=!1,l=[],a;for(a=0;a1,t={type:"list",raw:"",ordered:s,start:s?+r.slice(0,-1):"",loose:!1,items:[]};r=s?`\\d{1,9}\\${r.slice(-1)}`:`\\${r}`,this.options.pedantic&&(r=s?r:"[*+-]");let o=this.rules.other.listItemRegex(r),i=!1;for(;n;){let a=!1,p="",c="";if(!(e=o.exec(n))||this.rules.block.hr.test(n))break;p=e[0],n=n.substring(p.length);let h=e[2].split(` +`,1)[0].replace(this.rules.other.listReplaceTabs,A=>" ".repeat(3*A.length)),u=n.split(` +`,1)[0],g=!h.trim(),f=0;if(this.options.pedantic?(f=2,c=h.trimStart()):g?f=e[1].length+1:(f=e[2].search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=h.slice(f),f+=e[1].length),g&&this.rules.other.blankLine.test(u)&&(p+=u+` +`,n=n.substring(u.length+1),a=!0),!a){let A=this.rules.other.nextBulletRegex(f),j=this.rules.other.hrRegex(f),$=this.rules.other.fencesBeginRegex(f),S=this.rules.other.headingBeginRegex(f),gt=this.rules.other.htmlBeginRegex(f);for(;n;){let J=n.split(` +`,1)[0],B;if(u=J,this.options.pedantic?(u=u.replace(this.rules.other.listReplaceNesting," "),B=u):B=u.replace(this.rules.other.tabCharGlobal," "),$.test(u)||S.test(u)||gt.test(u)||A.test(u)||j.test(u))break;if(B.search(this.rules.other.nonSpaceChar)>=f||!u.trim())c+=` +`+B.slice(f);else{if(g||h.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||$.test(h)||S.test(h)||j.test(h))break;c+=` +`+u}!g&&!u.trim()&&(g=!0),p+=J+` +`,n=n.substring(J.length+1),h=B.slice(f)}}t.loose||(i?t.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(i=!0));let k=null,w;this.options.gfm&&(k=this.rules.other.listIsTask.exec(c),k&&(w=k[0]!=="[ ] ",c=c.replace(this.rules.other.listReplaceTask,""))),t.items.push({type:"list_item",raw:p,task:!!k,checked:w,loose:!1,text:c,tokens:[]}),t.raw+=p}let l=t.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;t.raw=t.raw.trimEnd();for(let a=0;ah.type==="space"),c=p.length>0&&p.some(h=>this.rules.other.anyLine.test(h.raw));t.loose=c}if(t.loose)for(let a=0;a({text:l,tokens:this.lexer.inline(l),header:!1,align:o.align[a]})));return o}}lheading(n){let e=this.rules.block.lheading.exec(n);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(n){let e=this.rules.block.paragraph.exec(n);if(e){let r=e[1].charAt(e[1].length-1)===` +`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:r,tokens:this.lexer.inline(r)}}}text(n){let e=this.rules.block.text.exec(n);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(n){let e=this.rules.inline.escape.exec(n);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(n){let e=this.rules.inline.tag.exec(n);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(n){let e=this.rules.inline.link.exec(n);if(e){let r=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(r)){if(!this.rules.other.endAngleBracket.test(r))return;let o=M(r.slice(0,-1),"\\");if((r.length-o.length)%2===0)return}else{let o=sn(e[2],"()");if(o===-2)return;if(o>-1){let i=(e[0].indexOf("!")===0?5:4)+e[1].length+o;e[2]=e[2].substring(0,o),e[0]=e[0].substring(0,i).trim(),e[3]=""}}let s=e[2],t="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(s);o&&(s=o[1],t=o[3])}else t=e[3]?e[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(r)?s=s.slice(1):s=s.slice(1,-1)),Fe(e,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:t&&t.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(n,e){let r;if((r=this.rules.inline.reflink.exec(n))||(r=this.rules.inline.nolink.exec(n))){let s=(r[2]||r[1]).replace(this.rules.other.multipleSpaceGlobal," "),t=e[s.toLowerCase()];if(!t){let o=r[0].charAt(0);return{type:"text",raw:o,text:o}}return Fe(r,t,r[0],this.lexer,this.rules)}}emStrong(n,e,r=""){let s=this.rules.inline.emStrongLDelim.exec(n);if(!(!s||s[3]&&r.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[2])||!r||this.rules.inline.punctuation.exec(r))){let t=[...s[0]].length-1,o,i,l=t,a=0,p=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(p.lastIndex=0,e=e.slice(-1*n.length+t);(s=p.exec(e))!=null;){if(o=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!o)continue;if(i=[...o].length,s[3]||s[4]){l+=i;continue}else if((s[5]||s[6])&&t%3&&!((t+i)%3)){a+=i;continue}if(l-=i,l>0)continue;i=Math.min(i,i+l+a);let c=[...s[0]][0].length,h=n.slice(0,t+s.index+c+i);if(Math.min(t,i)%2){let g=h.slice(1,-1);return{type:"em",raw:h,text:g,tokens:this.lexer.inlineTokens(g)}}let u=h.slice(2,-2);return{type:"strong",raw:h,text:u,tokens:this.lexer.inlineTokens(u)}}}}codespan(n){let e=this.rules.inline.code.exec(n);if(e){let r=e[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(r),t=this.rules.other.startingSpaceChar.test(r)&&this.rules.other.endingSpaceChar.test(r);return s&&t&&(r=r.substring(1,r.length-1)),{type:"codespan",raw:e[0],text:r}}}br(n){let e=this.rules.inline.br.exec(n);if(e)return{type:"br",raw:e[0]}}del(n){let e=this.rules.inline.del.exec(n);if(e)return{type:"del",raw:e[0],text:e[2],tokens:this.lexer.inlineTokens(e[2])}}autolink(n){let e=this.rules.inline.autolink.exec(n);if(e){let r,s;return e[2]==="@"?(r=e[1],s="mailto:"+r):(r=e[1],s=r),{type:"link",raw:e[0],text:r,href:s,tokens:[{type:"text",raw:r,text:r}]}}}url(n){let e;if(e=this.rules.inline.url.exec(n)){let r,s;if(e[2]==="@")r=e[0],s="mailto:"+r;else{let t;do t=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(t!==e[0]);r=e[0],e[1]==="www."?s="http://"+e[0]:s=e[0]}return{type:"link",raw:e[0],text:r,href:s,tokens:[{type:"text",raw:r,text:r}]}}}inlineText(n){let e=this.rules.inline.text.exec(n);if(e){let r=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:r}}}},I=class he{tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||C,this.options.tokenizer=this.options.tokenizer||new N,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let r={other:y,block:H.normal,inline:D.normal};this.options.pedantic?(r.block=H.pedantic,r.inline=D.pedantic):this.options.gfm&&(r.block=H.gfm,this.options.breaks?r.inline=D.breaks:r.inline=D.gfm),this.tokenizer.rules=r}static get rules(){return{block:H,inline:D}}static lex(e,r){return new he(r).lex(e)}static lexInline(e,r){return new he(r).inlineTokens(e)}lex(e){e=e.replace(y.carriageReturn,` +`),this.blockTokens(e,this.tokens);for(let r=0;r(t=i.call({lexer:this},e,r))?(e=e.substring(t.raw.length),r.push(t),!0):!1))continue;if(t=this.tokenizer.space(e)){e=e.substring(t.raw.length);let i=r.at(-1);t.raw.length===1&&i!==void 0?i.raw+=` +`:r.push(t);continue}if(t=this.tokenizer.code(e)){e=e.substring(t.raw.length);let i=r.at(-1);i?.type==="paragraph"||i?.type==="text"?(i.raw+=(i.raw.endsWith(` +`)?"":` +`)+t.raw,i.text+=` +`+t.text,this.inlineQueue.at(-1).src=i.text):r.push(t);continue}if(t=this.tokenizer.fences(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.heading(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.hr(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.blockquote(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.list(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.html(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.def(e)){e=e.substring(t.raw.length);let i=r.at(-1);i?.type==="paragraph"||i?.type==="text"?(i.raw+=(i.raw.endsWith(` +`)?"":` +`)+t.raw,i.text+=` +`+t.raw,this.inlineQueue.at(-1).src=i.text):this.tokens.links[t.tag]||(this.tokens.links[t.tag]={href:t.href,title:t.title},r.push(t));continue}if(t=this.tokenizer.table(e)){e=e.substring(t.raw.length),r.push(t);continue}if(t=this.tokenizer.lheading(e)){e=e.substring(t.raw.length),r.push(t);continue}let o=e;if(this.options.extensions?.startBlock){let i=1/0,l=e.slice(1),a;this.options.extensions.startBlock.forEach(p=>{a=p.call({lexer:this},l),typeof a=="number"&&a>=0&&(i=Math.min(i,a))}),i<1/0&&i>=0&&(o=e.substring(0,i+1))}if(this.state.top&&(t=this.tokenizer.paragraph(o))){let i=r.at(-1);s&&i?.type==="paragraph"?(i.raw+=(i.raw.endsWith(` +`)?"":` +`)+t.raw,i.text+=` +`+t.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):r.push(t),s=o.length!==e.length,e=e.substring(t.raw.length);continue}if(t=this.tokenizer.text(e)){e=e.substring(t.raw.length);let i=r.at(-1);i?.type==="text"?(i.raw+=(i.raw.endsWith(` +`)?"":` +`)+t.raw,i.text+=` +`+t.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):r.push(t);continue}if(e){let i="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(i);break}else throw new Error(i)}}return this.state.top=!0,r}inline(e,r=[]){return this.inlineQueue.push({src:e,tokens:r}),r}inlineTokens(e,r=[]){let s=e,t=null;if(this.tokens.links){let a=Object.keys(this.tokens.links);if(a.length>0)for(;(t=this.tokenizer.rules.inline.reflinkSearch.exec(s))!=null;)a.includes(t[0].slice(t[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,t.index)+"["+"a".repeat(t[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(t=this.tokenizer.rules.inline.anyPunctuation.exec(s))!=null;)s=s.slice(0,t.index)+"++"+s.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let o;for(;(t=this.tokenizer.rules.inline.blockSkip.exec(s))!=null;)o=t[2]?t[2].length:0,s=s.slice(0,t.index+o)+"["+"a".repeat(t[0].length-o-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);s=this.options.hooks?.emStrongMask?.call({lexer:this},s)??s;let i=!1,l="";for(;e;){i||(l=""),i=!1;let a;if(this.options.extensions?.inline?.some(c=>(a=c.call({lexer:this},e,r))?(e=e.substring(a.raw.length),r.push(a),!0):!1))continue;if(a=this.tokenizer.escape(e)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.tag(e)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.link(e)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(a.raw.length);let c=r.at(-1);a.type==="text"&&c?.type==="text"?(c.raw+=a.raw,c.text+=a.text):r.push(a);continue}if(a=this.tokenizer.emStrong(e,s,l)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.codespan(e)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.br(e)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.del(e)){e=e.substring(a.raw.length),r.push(a);continue}if(a=this.tokenizer.autolink(e)){e=e.substring(a.raw.length),r.push(a);continue}if(!this.state.inLink&&(a=this.tokenizer.url(e))){e=e.substring(a.raw.length),r.push(a);continue}let p=e;if(this.options.extensions?.startInline){let c=1/0,h=e.slice(1),u;this.options.extensions.startInline.forEach(g=>{u=g.call({lexer:this},h),typeof u=="number"&&u>=0&&(c=Math.min(c,u))}),c<1/0&&c>=0&&(p=e.substring(0,c+1))}if(a=this.tokenizer.inlineText(p)){e=e.substring(a.raw.length),a.raw.slice(-1)!=="_"&&(l=a.raw.slice(-1)),i=!0;let c=r.at(-1);c?.type==="text"?(c.raw+=a.raw,c.text+=a.text):r.push(a);continue}if(e){let c="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(c);break}else throw new Error(c)}}return r}},V=class{options;parser;constructor(n){this.options=n||C}space(n){return""}code({text:n,lang:e,escaped:r}){let s=(e||"").match(y.notSpaceStart)?.[0],t=n.replace(y.endingNewline,"")+` +`;return s?'
        '+(r?t:v(t,!0))+`
        +`:"
        "+(r?t:v(t,!0))+`
        +`}blockquote({tokens:n}){return`
        +${this.parser.parse(n)}
        +`}html({text:n}){return n}def(n){return""}heading({tokens:n,depth:e}){return`${this.parser.parseInline(n)} +`}hr(n){return`
        +`}list(n){let e=n.ordered,r=n.start,s="";for(let i=0;i +`+s+" +`}listitem(n){let e="";if(n.task){let r=this.checkbox({checked:!!n.checked});n.loose?n.tokens[0]?.type==="paragraph"?(n.tokens[0].text=r+" "+n.tokens[0].text,n.tokens[0].tokens&&n.tokens[0].tokens.length>0&&n.tokens[0].tokens[0].type==="text"&&(n.tokens[0].tokens[0].text=r+" "+v(n.tokens[0].tokens[0].text),n.tokens[0].tokens[0].escaped=!0)):n.tokens.unshift({type:"text",raw:r+" ",text:r+" ",escaped:!0}):e+=r+" "}return e+=this.parser.parse(n.tokens,!!n.loose),`
      • ${e}
      • +`}checkbox({checked:n}){return"'}paragraph({tokens:n}){return`

        ${this.parser.parseInline(n)}

        +`}table(n){let e="",r="";for(let t=0;t${s}`),` + +`+e+` +`+s+`
        +`}tablerow({text:n}){return` +${n} +`}tablecell(n){let e=this.parser.parseInline(n.tokens),r=n.header?"th":"td";return(n.align?`<${r} align="${n.align}">`:`<${r}>`)+e+` +`}strong({tokens:n}){return`${this.parser.parseInline(n)}`}em({tokens:n}){return`${this.parser.parseInline(n)}`}codespan({text:n}){return`${v(n,!0)}`}br(n){return"
        "}del({tokens:n}){return`${this.parser.parseInline(n)}`}link({href:n,title:e,tokens:r}){let s=this.parser.parseInline(r),t=Me(n);if(t===null)return s;n=t;let o='
        ",o}image({href:n,title:e,text:r,tokens:s}){s&&(r=this.parser.parseInline(s,this.parser.textRenderer));let t=Me(n);if(t===null)return v(r);n=t;let o=`${r}{let i=t[o].flat(1/0);r=r.concat(this.walkTokens(i,e))}):t.tokens&&(r=r.concat(this.walkTokens(t.tokens,e)))}}return r}use(...n){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return n.forEach(r=>{let s=x({},r);if(s.async=this.defaults.async||s.async||!1,r.extensions&&(r.extensions.forEach(t=>{if(!t.name)throw new Error("extension name required");if("renderer"in t){let o=e.renderers[t.name];o?e.renderers[t.name]=function(...i){let l=t.renderer.apply(this,i);return l===!1&&(l=o.apply(this,i)),l}:e.renderers[t.name]=t.renderer}if("tokenizer"in t){if(!t.level||t.level!=="block"&&t.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=e[t.level];o?o.unshift(t.tokenizer):e[t.level]=[t.tokenizer],t.start&&(t.level==="block"?e.startBlock?e.startBlock.push(t.start):e.startBlock=[t.start]:t.level==="inline"&&(e.startInline?e.startInline.push(t.start):e.startInline=[t.start]))}"childTokens"in t&&t.childTokens&&(e.childTokens[t.name]=t.childTokens)}),s.extensions=e),r.renderer){let t=this.defaults.renderer||new V(this.defaults);for(let o in r.renderer){if(!(o in t))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let i=o,l=r.renderer[i],a=t[i];t[i]=(...p)=>{let c=l.apply(t,p);return c===!1&&(c=a.apply(t,p)),c||""}}s.renderer=t}if(r.tokenizer){let t=this.defaults.tokenizer||new N(this.defaults);for(let o in r.tokenizer){if(!(o in t))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let i=o,l=r.tokenizer[i],a=t[i];t[i]=(...p)=>{let c=l.apply(t,p);return c===!1&&(c=a.apply(t,p)),c}}s.tokenizer=t}if(r.hooks){let t=this.defaults.hooks||new q;for(let o in r.hooks){if(!(o in t))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let i=o,l=r.hooks[i],a=t[i];q.passThroughHooks.has(o)?t[i]=p=>{if(this.defaults.async&&q.passThroughHooksRespectAsync.has(o))return T(this,null,function*(){let h=yield l.call(t,p);return a.call(t,h)});let c=l.call(t,p);return a.call(t,c)}:t[i]=(...p)=>{if(this.defaults.async)return T(this,null,function*(){let h=yield l.apply(t,p);return h===!1&&(h=yield a.apply(t,p)),h});let c=l.apply(t,p);return c===!1&&(c=a.apply(t,p)),c}}s.hooks=t}if(r.walkTokens){let t=this.defaults.walkTokens,o=r.walkTokens;s.walkTokens=function(i){let l=[];return l.push(o.call(this,i)),t&&(l=l.concat(t.call(this,i))),l}}this.defaults=x(x({},this.defaults),s)}),this}setOptions(n){return this.defaults=x(x({},this.defaults),n),this}lexer(n,e){return I.lex(n,e??this.defaults)}parser(n,e){return R.parse(n,e??this.defaults)}parseMarkdown(n){return(e,r)=>{let s=x({},r),t=x(x({},this.defaults),s),o=this.onError(!!t.silent,!!t.async);if(this.defaults.async===!0&&s.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(t.hooks&&(t.hooks.options=t,t.hooks.block=n),t.async)return T(this,null,function*(){let i=t.hooks?yield t.hooks.preprocess(e):e,l=yield(t.hooks?yield t.hooks.provideLexer():n?I.lex:I.lexInline)(i,t),a=t.hooks?yield t.hooks.processAllTokens(l):l;t.walkTokens&&(yield Promise.all(this.walkTokens(a,t.walkTokens)));let p=yield(t.hooks?yield t.hooks.provideParser():n?R.parse:R.parseInline)(a,t);return t.hooks?yield t.hooks.postprocess(p):p}).catch(o);try{t.hooks&&(e=t.hooks.preprocess(e));let i=(t.hooks?t.hooks.provideLexer():n?I.lex:I.lexInline)(e,t);t.hooks&&(i=t.hooks.processAllTokens(i)),t.walkTokens&&this.walkTokens(i,t.walkTokens);let l=(t.hooks?t.hooks.provideParser():n?R.parse:R.parseInline)(i,t);return t.hooks&&(l=t.hooks.postprocess(l)),l}catch(i){return o(i)}}}onError(n,e){return r=>{if(r.message+=` +Please report this to https://github.com/markedjs/marked.`,n){let s="

        An error occurred:

        "+v(r.message+"",!0)+"
        ";return e?Promise.resolve(s):s}if(e)return Promise.reject(r);throw r}}},L=new ln;function m(n,e){return L.parse(n,e)}m.options=m.setOptions=function(n){return L.setOptions(n),m.defaults=L.defaults,Oe(m.defaults),m};m.getDefaults=fe;m.defaults=C;m.use=function(...n){return L.use(...n),m.defaults=L.defaults,Oe(m.defaults),m};m.walkTokens=function(n,e){return L.walkTokens(n,e)};m.parseInline=L.parseInline;m.Parser=R;m.parser=R.parse;m.Renderer=V;m.TextRenderer=ye;m.Lexer=I;m.lexer=I.lex;m.Tokenizer=N;m.Hooks=q;m.parse=m;var Hn=m.options,Zn=m.setOptions,Nn=m.use,Vn=m.walkTokens,Un=m.parseInline;var Qn=R.parse,Kn=I.lex;function Ye(n){for(var e=[],r=1;r?',height:80,width:80},Se=new Map,et=new Map,cr=b(n=>{for(let e of n){if(!e.name)throw new Error('Invalid icon loader. Must have a "name" property with non-empty string value.');if(E.debug("Registering icon pack:",e.name),"loader"in e)et.set(e.name,e.loader);else if("icons"in e)Se.set(e.name,e.icons);else throw E.error("Invalid icon loader:",e),new Error('Invalid icon loader. Must have either "icons" or "loader" property.')}},"registerIconPacks"),tt=b((n,e)=>T(null,null,function*(){let r=re(n,!0,e!==void 0);if(!r)throw new Error(`Invalid icon name: ${n}`);let s=r.prefix||e;if(!s)throw new Error(`Icon name must contain a prefix: ${n}`);let t=Se.get(s);if(!t){let i=et.get(s);if(!i)throw new Error(`Icon set not found: ${r.prefix}`);try{let l=yield i();t=z(x({},l),{prefix:s}),Se.set(s,t)}catch(l){throw E.error(l),new Error(`Failed to load icon set: ${r.prefix}`)}}let o=ie(t,r.name);if(!o)throw new Error(`Icon not found: ${n}`);return o}),"getRegisteredIconData"),cn=b(n=>T(null,null,function*(){try{return yield tt(n),!0}catch(e){return!1}}),"isIconAvailable"),pn=b((n,e,r)=>T(null,null,function*(){let s;try{s=yield tt(n,e?.fallbackPrefix)}catch(i){E.error(i),s=an}let t=le(s,e),o=ce(ae(t.body),x(x({},t.attributes),r));return W(o,ee())}),"getIconSVG");function nt(n,{markdownAutoWrap:e}){let s=n.replace(//g,` +`).replace(/\n{2,}/g,` +`);return Ye(s)}b(nt,"preprocessMarkdown");function rt(n){return n.split(/\\n|\n|/gi).map(e=>e.trim().match(/<[^>]+>|[^\s<>]+/g)?.map(r=>({content:r,type:"normal"}))??[])}b(rt,"nonMarkdownToLines");function st(n,e={}){let r=nt(n,e),s=m.lexer(r),t=[[]],o=0;function i(l,a="normal"){l.type==="text"?l.text.split(` +`).forEach((c,h)=>{h!==0&&(o++,t.push([])),c.split(" ").forEach(u=>{u=u.replace(/'/g,"'"),u&&t[o].push({content:u,type:a})})}):l.type==="strong"||l.type==="em"?l.tokens.forEach(p=>{i(p,l.type)}):l.type==="html"&&t[o].push({content:l.text,type:"normal"})}return b(i,"processNode"),s.forEach(l=>{l.type==="paragraph"?l.tokens?.forEach(a=>{i(a)}):l.type==="html"?t[o].push({content:l.text,type:"normal"}):t[o].push({content:l.raw,type:"normal"})}),t}b(st,"markdownToLines");function it(n){return n?`

        ${n.replace(/\\n|\n/g,"
        ")}

        `:""}b(it,"nonMarkdownToHTML");function ot(n,{markdownAutoWrap:e}={}){let r=m.lexer(n);function s(t){return t.type==="text"?e===!1?t.text.replace(/\n */g,"
        ").replace(/ /g," "):t.text.replace(/\n */g,"
        "):t.type==="strong"?`${t.tokens?.map(s).join("")}`:t.type==="em"?`${t.tokens?.map(s).join("")}`:t.type==="paragraph"?`

        ${t.tokens?.map(s).join("")}

        `:t.type==="space"?"":t.type==="html"?`${t.text}`:t.type==="escape"?t.text:(E.warn(`Unsupported markdown: ${t.type}`),t.raw)}return b(s,"output"),r.map(s).join("")}b(ot,"markdownToHTML");function lt(n){return Intl.Segmenter?[...new Intl.Segmenter().segment(n)].map(e=>e.segment):[...n]}b(lt,"splitTextToChars");function at(n,e){let r=lt(e.content);return $e(n,[],r,e.type)}b(at,"splitWordToFitWidth");function $e(n,e,r,s){if(r.length===0)return[{content:e.join(""),type:s},{content:"",type:s}];let[t,...o]=r,i=[...e,t];return n([{content:i.join(""),type:s}])?$e(n,i,o,s):(e.length===0&&t&&(e.push(t),r.shift()),[{content:e.join(""),type:s},{content:r.join(""),type:s}])}b($e,"splitWordToFitWidthRecursion");function ct(n,e){if(n.some(({content:r})=>r.includes(` +`)))throw new Error("splitLineToFitWidth does not support newlines in the line");return K(n,e)}b(ct,"splitLineToFitWidth");function K(n,e,r=[],s=[]){if(n.length===0)return s.length>0&&r.push(s),r.length>0?r:[];let t="";n[0].content===" "&&(t=" ",n.shift());let o=n.shift()??{content:" ",type:"normal"},i=[...s];if(t!==""&&i.push({content:t,type:"normal"}),i.push(o),e(i))return K(n,e,r,i);if(s.length>0)r.push(s),n.unshift(o);else if(o.content){let[l,a]=at(e,o);r.push([l]),a.content&&n.unshift(a)}return K(n,e,r)}b(K,"splitLineToFitWidthRecursion");function Te(n,e){e&&n.attr("style",e)}b(Te,"applyStyle");var Je=16384;function pt(i,l,a,p){return T(this,arguments,function*(n,e,r,s,t=!1,o=ee()){let c=n.append("foreignObject");c.attr("width",`${Math.min(10*r,Je)}px`),c.attr("height",`${Math.min(10*r,Je)}px`);let h=c.append("xhtml:div"),u=te(e.label)?yield Ie(e.label.replace(Re.lineBreakRegex,` +`),o):W(e.label,o),g=e.isNode?"nodeLabel":"edgeLabel",f=h.append("span");f.html(u),Te(f,e.labelStyle),f.attr("class",`${g} ${s}`),Te(h,e.labelStyle),h.style("display","table-cell"),h.style("white-space","nowrap"),h.style("line-height","1.5"),r!==Number.POSITIVE_INFINITY&&(h.style("max-width",r+"px"),h.style("text-align","center")),h.attr("xmlns","http://www.w3.org/1999/xhtml"),t&&h.attr("class","labelBkg");let k=h.node().getBoundingClientRect();return k.width===r&&(h.style("display","table"),h.style("white-space","break-spaces"),h.style("width",r+"px"),k=h.node().getBoundingClientRect()),c.node()})}b(pt,"addHtmlSpan");function X(n,e,r,s=!1){let t=n.append("tspan").attr("class","text-outer-tspan").attr("x",0).attr("y",e*r-.1+"em").attr("dy",r+"em");return s&&t.attr("text-anchor","middle"),t}b(X,"createTspan");function ht(n,e,r){let s=n.append("text"),t=X(s,1,e);Y(t,r);let o=t.node().getComputedTextLength();return s.remove(),o}b(ht,"computeWidthOfText");function hn(n,e,r){let s=n.append("text"),t=X(s,1,e);Y(t,[{content:r,type:"normal"}]);let o=t.node()?.getBoundingClientRect();return o&&s.remove(),o}b(hn,"computeDimensionOfText");function ut(n,e,r,s=!1,t=!1){let i=e.append("g"),l=i.insert("rect").attr("class","background").attr("style","stroke: none"),a=i.append("text").attr("y","-10.1");t&&a.attr("text-anchor","middle");let p=0;for(let c of r){let h=b(g=>ht(i,1.1,g)<=n,"checkWidth"),u=h(c)?[c]:ct(c,h);for(let g of u){let f=X(a,p,1.1,t);Y(f,g),p++}}if(s){let c=a.node().getBBox(),h=2;return l.attr("x",c.x-h).attr("y",c.y-h).attr("width",c.width+2*h).attr("height",c.height+2*h),i.node()}else return a.node()}b(ut,"createFormattedText");function Y(n,e){n.text(""),e.forEach((r,s)=>{let t=n.append("tspan").attr("font-style",r.type==="em"?"italic":"normal").attr("class","text-inner-tspan").attr("font-weight",r.type==="strong"?"bold":"normal");s===0?t.text(r.content):t.text(" "+r.content)})}b(Y,"updateTextContentAndStyles");function ft(r){return T(this,arguments,function*(n,e={}){let s=[];n.replace(/(fa[bklrs]?):fa-([\w-]+)/g,(o,i,l)=>(s.push(T(null,null,function*(){let a=`${i}:${l}`;return(yield cn(a))?yield pn(a,void 0,{class:"label-icon"}):``})),o));let t=yield Promise.all(s);return n.replace(/(fa[bklrs]?):fa-([\w-]+)/g,()=>t.shift()??"")})}b(ft,"replaceIconSubstring");var fr=b((h,...u)=>T(null,[h,...u],function*(n,e="",{style:r="",isTitle:s=!1,classes:t="",useHtmlLabels:o=!0,markdown:i=!0,isNode:l=!0,width:a=200,addSvgBackground:p=!1}={},c){if(E.debug("XYZ createText",e,r,s,t,o,l,"addSvgBackground: ",p),o){let g=i?ot(e,c):it(e),f=yield ft(ze(g),c),k=e.replace(/\\\\/g,"\\"),w={isNode:l,label:te(e)?k:f,labelStyle:r.replace("fill:","color:")};return yield pt(n,w,a,t,p,c)}else{let g=e.replace(//g,"
        "),f=i?st(g.replace("
        ","
        "),c):rt(g),k=ut(a,n,f,e?p:!1,!l);if(l){/stroke:/.exec(r)&&(r=r.replace("stroke:","lineColor:"));let w=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");P(k).attr("style",w)}else{let w=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/background:/g,"fill:");P(k).select("rect").attr("style",w.replace(/background:/g,"fill:"));let A=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");P(k).select("text").attr("style",A)}return s?P(k).selectAll("tspan.text-outer-tspan").classed("title-row",!0):P(k).selectAll("tspan.text-outer-tspan").classed("row",!0),k}}),"createText");export{Ye as a,an as b,cr as c,pn as d,hn as e,fr as f}; diff --git a/src/google/adk/cli/browser/chunk-WZIWL22C.js b/src/google/adk/cli/browser/chunk-WZIWL22C.js new file mode 100644 index 0000000000..76245bb8f4 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-WZIWL22C.js @@ -0,0 +1,292 @@ +import{m as Ie}from"./chunk-WBLSVR3V.js";import{a as Qe}from"./chunk-GP6TCC26.js";import{M as ce,N as le,R as ue,S as de,T as fe,U as he,V as me,W as ke,X as ye,Y as ot}from"./chunk-QFMJV7VH.js";import{A as we,B as _e,C as De,D as Se,E as Ce,F as Me,G as At,H as Ft,I as Ee,a as yt,c as ae,f as oe,g as c,i as it,k as ge,l as pe,m as ve,n as Te,t as be,u as Et,v as It,w as Lt,x as Yt,y as $t,z as xe}from"./chunk-JRNAXTJ7.js";import"./chunk-EGBSMT36.js";import{e as xt,h as at}from"./chunk-RMXJBC7V.js";var Le=xt((Ot,Wt)=>{"use strict";(function(t,s){typeof Ot=="object"&&typeof Wt<"u"?Wt.exports=s():typeof define=="function"&&define.amd?define(s):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_isoWeek=s()})(Ot,function(){"use strict";var t="day";return function(s,n,a){var r=function(D){return D.add(4-D.isoWeekday(),t)},u=n.prototype;u.isoWeekYear=function(){return r(this).year()},u.isoWeek=function(D){if(!this.$utils().u(D))return this.add(7*(D-this.isoWeek()),t);var S,P,C,W,z=r(this),R=(S=this.isoWeekYear(),P=this.$u,C=(P?a.utc:a)().year(S).startOf("year"),W=4-C.isoWeekday(),C.isoWeekday()>4&&(W+=7),C.add(W,t));return z.diff(R,"week")+1},u.isoWeekday=function(D){return this.$utils().u(D)?this.day()||7:this.day(this.day()%7?D:D-7)};var b=u.startOf;u.startOf=function(D,S){var P=this.$utils(),C=!!P.u(S)||S;return P.p(D)==="isoweek"?C?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):b.bind(this)(D,S)}}})});var Ye=xt((Pt,Vt)=>{"use strict";(function(t,s){typeof Pt=="object"&&typeof Vt<"u"?Vt.exports=s():typeof define=="function"&&define.amd?define(s):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_customParseFormat=s()})(Pt,function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},s=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\d/,a=/\d\d/,r=/\d\d?/,u=/\d*[^-_:/,()\s\d]+/,b={},D=function(x){return(x=+x)+(x>68?1900:2e3)},S=function(x){return function(k){this[x]=+k}},P=[/[+-]\d\d:?(\d\d)?|Z/,function(x){(this.zone||(this.zone={})).offset=(function(k){if(!k||k==="Z")return 0;var F=k.match(/([+-]|\d\d)/g),Y=60*F[1]+(+F[2]||0);return Y===0?0:F[0]==="+"?-Y:Y})(x)}],C=function(x){var k=b[x];return k&&(k.indexOf?k:k.s.concat(k.f))},W=function(x,k){var F,Y=b.meridiem;if(Y){for(var G=1;G<=24;G+=1)if(x.indexOf(Y(G,0,k))>-1){F=G>12;break}}else F=x===(k?"pm":"PM");return F},z={A:[u,function(x){this.afternoon=W(x,!1)}],a:[u,function(x){this.afternoon=W(x,!0)}],Q:[n,function(x){this.month=3*(x-1)+1}],S:[n,function(x){this.milliseconds=100*+x}],SS:[a,function(x){this.milliseconds=10*+x}],SSS:[/\d{3}/,function(x){this.milliseconds=+x}],s:[r,S("seconds")],ss:[r,S("seconds")],m:[r,S("minutes")],mm:[r,S("minutes")],H:[r,S("hours")],h:[r,S("hours")],HH:[r,S("hours")],hh:[r,S("hours")],D:[r,S("day")],DD:[a,S("day")],Do:[u,function(x){var k=b.ordinal,F=x.match(/\d+/);if(this.day=F[0],k)for(var Y=1;Y<=31;Y+=1)k(Y).replace(/\[|\]/g,"")===x&&(this.day=Y)}],w:[r,S("week")],ww:[a,S("week")],M:[r,S("month")],MM:[a,S("month")],MMM:[u,function(x){var k=C("months"),F=(C("monthsShort")||k.map(function(Y){return Y.slice(0,3)})).indexOf(x)+1;if(F<1)throw new Error;this.month=F%12||F}],MMMM:[u,function(x){var k=C("months").indexOf(x)+1;if(k<1)throw new Error;this.month=k%12||k}],Y:[/[+-]?\d+/,S("year")],YY:[a,function(x){this.year=D(x)}],YYYY:[/\d{4}/,S("year")],Z:P,ZZ:P};function R(x){var k,F;k=x,F=b&&b.formats;for(var Y=(x=k.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function($,f,y){var g=y&&y.toUpperCase();return f||F[y]||t[y]||F[g].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(T,p,o){return p||o.slice(1)})})).match(s),G=Y.length,X=0;X-1)return new Date((h==="X"?1e3:1)*l);var i=R(h)(l),O=i.year,e=i.month,_=i.day,A=i.hours,I=i.minutes,L=i.seconds,H=i.milliseconds,V=i.zone,N=i.week,U=new Date,st=_||(O||e?1:U.getDate()),rt=O||U.getFullYear(),lt=0;O&&!e||(lt=e>0?e-1:U.getMonth());var ut,dt=A||0,j=I||0,nt=L||0,K=H||0;return V?new Date(Date.UTC(rt,lt,st,dt,j,nt,K+60*V.offset*1e3)):m?new Date(Date.UTC(rt,lt,st,dt,j,nt,K)):(ut=new Date(rt,lt,st,dt,j,nt,K),N&&(ut=w(ut).week(N).toDate()),ut)}catch(q){return new Date("")}})(E,M,v,F),this.init(),g&&g!==!0&&(this.$L=this.locale(g).$L),y&&E!=this.format(M)&&(this.$d=new Date("")),b={}}else if(M instanceof Array)for(var T=M.length,p=1;p<=T;p+=1){d[1]=M[p-1];var o=F.apply(this,d);if(o.isValid()){this.$d=o.$d,this.$L=o.$L,this.init();break}p===T&&(this.$d=new Date(""))}else G.call(this,X)}}})});var $e=xt((Nt,Rt)=>{"use strict";(function(t,s){typeof Nt=="object"&&typeof Rt<"u"?Rt.exports=s():typeof define=="function"&&define.amd?define(s):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_advancedFormat=s()})(Nt,function(){"use strict";return function(t,s){var n=s.prototype,a=n.format;n.format=function(r){var u=this,b=this.$locale();if(!this.isValid())return a.bind(this)(r);var D=this.$utils(),S=(r||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(P){switch(P){case"Q":return Math.ceil((u.$M+1)/3);case"Do":return b.ordinal(u.$D);case"gggg":return u.weekYear();case"GGGG":return u.isoWeekYear();case"wo":return b.ordinal(u.week(),"W");case"w":case"ww":return D.s(u.week(),P==="w"?1:2,"0");case"W":case"WW":return D.s(u.isoWeek(),P==="W"?1:2,"0");case"k":case"kk":return D.s(String(u.$H===0?24:u.$H),P==="k"?1:2,"0");case"X":return Math.floor(u.$d.getTime()/1e3);case"x":return u.$d.getTime();case"z":return"["+u.offsetName()+"]";case"zzz":return"["+u.offsetName("long")+"]";default:return P}});return a.bind(this)(S)}}})});var Ae=xt((zt,Ht)=>{"use strict";(function(t,s){typeof zt=="object"&&typeof Ht<"u"?Ht.exports=s():typeof define=="function"&&define.amd?define(s):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_duration=s()})(zt,function(){"use strict";var t,s,n=1e3,a=6e4,r=36e5,u=864e5,b=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,D=31536e6,S=2628e6,P=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/,C={years:D,months:S,days:u,hours:r,minutes:a,seconds:n,milliseconds:1,weeks:6048e5},W=function(E){return E instanceof G},z=function(E,v,d){return new G(E,d,v.$l)},R=function(E){return s.p(E)+"s"},x=function(E){return E<0},k=function(E){return x(E)?Math.ceil(E):Math.floor(E)},F=function(E){return Math.abs(E)},Y=function(E,v){return E?x(E)?{negative:!0,format:""+F(E)+v}:{negative:!1,format:""+E+v}:{negative:!1,format:""}},G=(function(){function E(d,M,$){var f=this;if(this.$d={},this.$l=$,d===void 0&&(this.$ms=0,this.parseFromMilliseconds()),M)return z(d*C[R(M)],this);if(typeof d=="number")return this.$ms=d,this.parseFromMilliseconds(),this;if(typeof d=="object")return Object.keys(d).forEach(function(T){f.$d[R(T)]=d[T]}),this.calMilliseconds(),this;if(typeof d=="string"){var y=d.match(P);if(y){var g=y.slice(2).map(function(T){return T!=null?Number(T):0});return this.$d.years=g[0],this.$d.months=g[1],this.$d.weeks=g[2],this.$d.days=g[3],this.$d.hours=g[4],this.$d.minutes=g[5],this.$d.seconds=g[6],this.calMilliseconds(),this}}return this}var v=E.prototype;return v.calMilliseconds=function(){var d=this;this.$ms=Object.keys(this.$d).reduce(function(M,$){return M+(d.$d[$]||0)*C[$]},0)},v.parseFromMilliseconds=function(){var d=this.$ms;this.$d.years=k(d/D),d%=D,this.$d.months=k(d/S),d%=S,this.$d.days=k(d/u),d%=u,this.$d.hours=k(d/r),d%=r,this.$d.minutes=k(d/a),d%=a,this.$d.seconds=k(d/n),d%=n,this.$d.milliseconds=d},v.toISOString=function(){var d=Y(this.$d.years,"Y"),M=Y(this.$d.months,"M"),$=+this.$d.days||0;this.$d.weeks&&($+=7*this.$d.weeks);var f=Y($,"D"),y=Y(this.$d.hours,"H"),g=Y(this.$d.minutes,"M"),T=this.$d.seconds||0;this.$d.milliseconds&&(T+=this.$d.milliseconds/1e3,T=Math.round(1e3*T)/1e3);var p=Y(T,"S"),o=d.negative||M.negative||f.negative||y.negative||g.negative||p.negative,l=y.format||g.format||p.format?"T":"",h=(o?"-":"")+"P"+d.format+M.format+f.format+l+y.format+g.format+p.format;return h==="P"||h==="-P"?"P0D":h},v.toJSON=function(){return this.toISOString()},v.format=function(d){var M=d||"YYYY-MM-DDTHH:mm:ss",$={Y:this.$d.years,YY:s.s(this.$d.years,2,"0"),YYYY:s.s(this.$d.years,4,"0"),M:this.$d.months,MM:s.s(this.$d.months,2,"0"),D:this.$d.days,DD:s.s(this.$d.days,2,"0"),H:this.$d.hours,HH:s.s(this.$d.hours,2,"0"),m:this.$d.minutes,mm:s.s(this.$d.minutes,2,"0"),s:this.$d.seconds,ss:s.s(this.$d.seconds,2,"0"),SSS:s.s(this.$d.milliseconds,3,"0")};return M.replace(b,function(f,y){return y||String($[f])})},v.as=function(d){return this.$ms/C[R(d)]},v.get=function(d){var M=this.$ms,$=R(d);return $==="milliseconds"?M%=1e3:M=$==="weeks"?k(M/C[$]):this.$d[$],M||0},v.add=function(d,M,$){var f;return f=M?d*C[R(M)]:W(d)?d.$ms:z(d,this).$ms,z(this.$ms+f*($?-1:1),this)},v.subtract=function(d,M){return this.add(d,M,!0)},v.locale=function(d){var M=this.clone();return M.$l=d,M},v.clone=function(){return z(this.$ms,this)},v.humanize=function(d){return t().add(this.$ms,"ms").locale(this.$l).fromNow(!d)},v.valueOf=function(){return this.asMilliseconds()},v.milliseconds=function(){return this.get("milliseconds")},v.asMilliseconds=function(){return this.as("milliseconds")},v.seconds=function(){return this.get("seconds")},v.asSeconds=function(){return this.as("seconds")},v.minutes=function(){return this.get("minutes")},v.asMinutes=function(){return this.as("minutes")},v.hours=function(){return this.get("hours")},v.asHours=function(){return this.as("hours")},v.days=function(){return this.get("days")},v.asDays=function(){return this.as("days")},v.weeks=function(){return this.get("weeks")},v.asWeeks=function(){return this.as("weeks")},v.months=function(){return this.get("months")},v.asMonths=function(){return this.as("months")},v.years=function(){return this.get("years")},v.asYears=function(){return this.as("years")},E})(),X=function(E,v,d){return E.add(v.years()*d,"y").add(v.months()*d,"M").add(v.days()*d,"d").add(v.hours()*d,"h").add(v.minutes()*d,"m").add(v.seconds()*d,"s").add(v.milliseconds()*d,"ms")};return function(E,v,d){t=d,s=d().$utils(),d.duration=function(f,y){var g=d.locale();return z(f,{$l:g},y)},d.isDuration=W;var M=v.prototype.add,$=v.prototype.subtract;v.prototype.add=function(f,y){return W(f)?X(this,f,1):M.bind(this)(f,y)},v.prototype.subtract=function(f,y){return W(f)?X(this,f,-1):$.bind(this)(f,y)}}})});var Pe=at(Qe(),1),Q=at(oe(),1),Ve=at(Le(),1),Ne=at(Ye(),1),Re=at($e(),1),ht=at(oe(),1),Ze=at(Ae(),1);var Bt=(function(){var t=c(function(p,o,l,h){for(l=l||{},h=p.length;h--;l[p[h]]=o);return l},"o"),s=[6,8,10,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,31,33,35,36,38,40],n=[1,26],a=[1,27],r=[1,28],u=[1,29],b=[1,30],D=[1,31],S=[1,32],P=[1,33],C=[1,34],W=[1,9],z=[1,10],R=[1,11],x=[1,12],k=[1,13],F=[1,14],Y=[1,15],G=[1,16],X=[1,19],E=[1,20],v=[1,21],d=[1,22],M=[1,23],$=[1,25],f=[1,35],y={trace:c(function(){},"trace"),yy:{},symbols_:{error:2,start:3,gantt:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NL:10,weekday:11,weekday_monday:12,weekday_tuesday:13,weekday_wednesday:14,weekday_thursday:15,weekday_friday:16,weekday_saturday:17,weekday_sunday:18,weekend:19,weekend_friday:20,weekend_saturday:21,dateFormat:22,inclusiveEndDates:23,topAxis:24,axisFormat:25,tickInterval:26,excludes:27,includes:28,todayMarker:29,title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,section:36,clickStatement:37,taskTxt:38,taskData:39,click:40,callbackname:41,callbackargs:42,href:43,clickStatementDebug:44,$accept:0,$end:1},terminals_:{2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",12:"weekday_monday",13:"weekday_tuesday",14:"weekday_wednesday",15:"weekday_thursday",16:"weekday_friday",17:"weekday_saturday",18:"weekday_sunday",20:"weekend_friday",21:"weekend_saturday",22:"dateFormat",23:"inclusiveEndDates",24:"topAxis",25:"axisFormat",26:"tickInterval",27:"excludes",28:"includes",29:"todayMarker",30:"title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"section",38:"taskTxt",39:"taskData",40:"click",41:"callbackname",42:"callbackargs",43:"href"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[19,1],[19,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,2],[37,2],[37,3],[37,3],[37,4],[37,3],[37,4],[37,2],[44,2],[44,3],[44,3],[44,4],[44,3],[44,4],[44,2]],performAction:c(function(o,l,h,m,w,i,O){var e=i.length-1;switch(w){case 1:return i[e-1];case 2:this.$=[];break;case 3:i[e-1].push(i[e]),this.$=i[e-1];break;case 4:case 5:this.$=i[e];break;case 6:case 7:this.$=[];break;case 8:m.setWeekday("monday");break;case 9:m.setWeekday("tuesday");break;case 10:m.setWeekday("wednesday");break;case 11:m.setWeekday("thursday");break;case 12:m.setWeekday("friday");break;case 13:m.setWeekday("saturday");break;case 14:m.setWeekday("sunday");break;case 15:m.setWeekend("friday");break;case 16:m.setWeekend("saturday");break;case 17:m.setDateFormat(i[e].substr(11)),this.$=i[e].substr(11);break;case 18:m.enableInclusiveEndDates(),this.$=i[e].substr(18);break;case 19:m.TopAxis(),this.$=i[e].substr(8);break;case 20:m.setAxisFormat(i[e].substr(11)),this.$=i[e].substr(11);break;case 21:m.setTickInterval(i[e].substr(13)),this.$=i[e].substr(13);break;case 22:m.setExcludes(i[e].substr(9)),this.$=i[e].substr(9);break;case 23:m.setIncludes(i[e].substr(9)),this.$=i[e].substr(9);break;case 24:m.setTodayMarker(i[e].substr(12)),this.$=i[e].substr(12);break;case 27:m.setDiagramTitle(i[e].substr(6)),this.$=i[e].substr(6);break;case 28:this.$=i[e].trim(),m.setAccTitle(this.$);break;case 29:case 30:this.$=i[e].trim(),m.setAccDescription(this.$);break;case 31:m.addSection(i[e].substr(8)),this.$=i[e].substr(8);break;case 33:m.addTask(i[e-1],i[e]),this.$="task";break;case 34:this.$=i[e-1],m.setClickEvent(i[e-1],i[e],null);break;case 35:this.$=i[e-2],m.setClickEvent(i[e-2],i[e-1],i[e]);break;case 36:this.$=i[e-2],m.setClickEvent(i[e-2],i[e-1],null),m.setLink(i[e-2],i[e]);break;case 37:this.$=i[e-3],m.setClickEvent(i[e-3],i[e-2],i[e-1]),m.setLink(i[e-3],i[e]);break;case 38:this.$=i[e-2],m.setClickEvent(i[e-2],i[e],null),m.setLink(i[e-2],i[e-1]);break;case 39:this.$=i[e-3],m.setClickEvent(i[e-3],i[e-1],i[e]),m.setLink(i[e-3],i[e-2]);break;case 40:this.$=i[e-1],m.setLink(i[e-1],i[e]);break;case 41:case 47:this.$=i[e-1]+" "+i[e];break;case 42:case 43:case 45:this.$=i[e-2]+" "+i[e-1]+" "+i[e];break;case 44:case 46:this.$=i[e-3]+" "+i[e-2]+" "+i[e-1]+" "+i[e];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(s,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:n,13:a,14:r,15:u,16:b,17:D,18:S,19:18,20:P,21:C,22:W,23:z,24:R,25:x,26:k,27:F,28:Y,29:G,30:X,31:E,33:v,35:d,36:M,37:24,38:$,40:f},t(s,[2,7],{1:[2,1]}),t(s,[2,3]),{9:36,11:17,12:n,13:a,14:r,15:u,16:b,17:D,18:S,19:18,20:P,21:C,22:W,23:z,24:R,25:x,26:k,27:F,28:Y,29:G,30:X,31:E,33:v,35:d,36:M,37:24,38:$,40:f},t(s,[2,5]),t(s,[2,6]),t(s,[2,17]),t(s,[2,18]),t(s,[2,19]),t(s,[2,20]),t(s,[2,21]),t(s,[2,22]),t(s,[2,23]),t(s,[2,24]),t(s,[2,25]),t(s,[2,26]),t(s,[2,27]),{32:[1,37]},{34:[1,38]},t(s,[2,30]),t(s,[2,31]),t(s,[2,32]),{39:[1,39]},t(s,[2,8]),t(s,[2,9]),t(s,[2,10]),t(s,[2,11]),t(s,[2,12]),t(s,[2,13]),t(s,[2,14]),t(s,[2,15]),t(s,[2,16]),{41:[1,40],43:[1,41]},t(s,[2,4]),t(s,[2,28]),t(s,[2,29]),t(s,[2,33]),t(s,[2,34],{42:[1,42],43:[1,43]}),t(s,[2,40],{41:[1,44]}),t(s,[2,35],{43:[1,45]}),t(s,[2,36]),t(s,[2,38],{42:[1,46]}),t(s,[2,37]),t(s,[2,39])],defaultActions:{},parseError:c(function(o,l){if(l.recoverable)this.trace(o);else{var h=new Error(o);throw h.hash=l,h}},"parseError"),parse:c(function(o){var l=this,h=[0],m=[],w=[null],i=[],O=this.table,e="",_=0,A=0,I=0,L=2,H=1,V=i.slice.call(arguments,1),N=Object.create(this.lexer),U={yy:{}};for(var st in this.yy)Object.prototype.hasOwnProperty.call(this.yy,st)&&(U.yy[st]=this.yy[st]);N.setInput(o,U.yy),U.yy.lexer=N,U.yy.parser=this,typeof N.yylloc>"u"&&(N.yylloc={});var rt=N.yylloc;i.push(rt);var lt=N.options&&N.options.ranges;typeof U.yy.parseError=="function"?this.parseError=U.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ut(Z){h.length=h.length-2*Z,w.length=w.length-Z,i.length=i.length-Z}c(ut,"popStack");function dt(){var Z;return Z=m.pop()||N.lex()||H,typeof Z!="number"&&(Z instanceof Array&&(m=Z,Z=m.pop()),Z=l.symbols_[Z]||Z),Z}c(dt,"lex");for(var j,nt,K,q,Ri,Ct,ft={},Tt,tt,ne,bt;;){if(K=h[h.length-1],this.defaultActions[K]?q=this.defaultActions[K]:((j===null||typeof j>"u")&&(j=dt()),q=O[K]&&O[K][j]),typeof q>"u"||!q.length||!q[0]){var Mt="";bt=[];for(Tt in O[K])this.terminals_[Tt]&&Tt>L&&bt.push("'"+this.terminals_[Tt]+"'");N.showPosition?Mt="Parse error on line "+(_+1)+`: +`+N.showPosition()+` +Expecting `+bt.join(", ")+", got '"+(this.terminals_[j]||j)+"'":Mt="Parse error on line "+(_+1)+": Unexpected "+(j==H?"end of input":"'"+(this.terminals_[j]||j)+"'"),this.parseError(Mt,{text:N.match,token:this.terminals_[j]||j,line:N.yylineno,loc:rt,expected:bt})}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+K+", token: "+j);switch(q[0]){case 1:h.push(j),w.push(N.yytext),i.push(N.yylloc),h.push(q[1]),j=null,nt?(j=nt,nt=null):(A=N.yyleng,e=N.yytext,_=N.yylineno,rt=N.yylloc,I>0&&I--);break;case 2:if(tt=this.productions_[q[1]][1],ft.$=w[w.length-tt],ft._$={first_line:i[i.length-(tt||1)].first_line,last_line:i[i.length-1].last_line,first_column:i[i.length-(tt||1)].first_column,last_column:i[i.length-1].last_column},lt&&(ft._$.range=[i[i.length-(tt||1)].range[0],i[i.length-1].range[1]]),Ct=this.performAction.apply(ft,[e,A,_,U.yy,q[1],w,i].concat(V)),typeof Ct<"u")return Ct;tt&&(h=h.slice(0,-1*tt*2),w=w.slice(0,-1*tt),i=i.slice(0,-1*tt)),h.push(this.productions_[q[1]][0]),w.push(ft.$),i.push(ft._$),ne=O[h[h.length-2]][h[h.length-1]],h.push(ne);break;case 3:return!0}}return!0},"parse")},g=(function(){var p={EOF:1,parseError:c(function(l,h){if(this.yy.parser)this.yy.parser.parseError(l,h);else throw new Error(l)},"parseError"),setInput:c(function(o,l){return this.yy=l||this.yy||{},this._input=o,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:c(function(){var o=this._input[0];this.yytext+=o,this.yyleng++,this.offset++,this.match+=o,this.matched+=o;var l=o.match(/(?:\r\n?|\n).*/g);return l?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),o},"input"),unput:c(function(o){var l=o.length,h=o.split(/(?:\r\n?|\n)/g);this._input=o+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-l),this.offset-=l;var m=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),h.length-1&&(this.yylineno-=h.length-1);var w=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:h?(h.length===m.length?this.yylloc.first_column:0)+m[m.length-h.length].length-h[0].length:this.yylloc.first_column-l},this.options.ranges&&(this.yylloc.range=[w[0],w[0]+this.yyleng-l]),this.yyleng=this.yytext.length,this},"unput"),more:c(function(){return this._more=!0,this},"more"),reject:c(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:c(function(o){this.unput(this.match.slice(o))},"less"),pastInput:c(function(){var o=this.matched.substr(0,this.matched.length-this.match.length);return(o.length>20?"...":"")+o.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:c(function(){var o=this.match;return o.length<20&&(o+=this._input.substr(0,20-o.length)),(o.substr(0,20)+(o.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:c(function(){var o=this.pastInput(),l=new Array(o.length+1).join("-");return o+this.upcomingInput()+` +`+l+"^"},"showPosition"),test_match:c(function(o,l){var h,m,w;if(this.options.backtrack_lexer&&(w={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(w.yylloc.range=this.yylloc.range.slice(0))),m=o[0].match(/(?:\r\n?|\n).*/g),m&&(this.yylineno+=m.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:m?m[m.length-1].length-m[m.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+o[0].length},this.yytext+=o[0],this.match+=o[0],this.matches=o,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(o[0].length),this.matched+=o[0],h=this.performAction.call(this,this.yy,this,l,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),h)return h;if(this._backtrack){for(var i in w)this[i]=w[i];return!1}return!1},"test_match"),next:c(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var o,l,h,m;this._more||(this.yytext="",this.match="");for(var w=this._currentRules(),i=0;il[0].length)){if(l=h,m=i,this.options.backtrack_lexer){if(o=this.test_match(h,w[i]),o!==!1)return o;if(this._backtrack){l=!1;continue}else return!1}else if(!this.options.flex)break}return l?(o=this.test_match(l,w[m]),o!==!1?o:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:c(function(){var l=this.next();return l||this.lex()},"lex"),begin:c(function(l){this.conditionStack.push(l)},"begin"),popState:c(function(){var l=this.conditionStack.length-1;return l>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:c(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:c(function(l){return l=this.conditionStack.length-1-Math.abs(l||0),l>=0?this.conditionStack[l]:"INITIAL"},"topState"),pushState:c(function(l){this.begin(l)},"pushState"),stateStackSize:c(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:c(function(l,h,m,w){var i=w;switch(m){case 0:return this.begin("open_directive"),"open_directive";break;case 1:return this.begin("acc_title"),31;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),33;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:break;case 9:break;case 10:break;case 11:return 10;case 12:break;case 13:break;case 14:this.begin("href");break;case 15:this.popState();break;case 16:return 43;case 17:this.begin("callbackname");break;case 18:this.popState();break;case 19:this.popState(),this.begin("callbackargs");break;case 20:return 41;case 21:this.popState();break;case 22:return 42;case 23:this.begin("click");break;case 24:this.popState();break;case 25:return 40;case 26:return 4;case 27:return 22;case 28:return 23;case 29:return 24;case 30:return 25;case 31:return 26;case 32:return 28;case 33:return 27;case 34:return 29;case 35:return 12;case 36:return 13;case 37:return 14;case 38:return 15;case 39:return 16;case 40:return 17;case 41:return 18;case 42:return 20;case 43:return 21;case 44:return"date";case 45:return 30;case 46:return"accDescription";case 47:return 36;case 48:return 38;case 49:return 39;case 50:return":";case 51:return 6;case 52:return"INVALID"}},"anonymous"),rules:[/^(?:%%\{)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:weekday\s+monday\b)/i,/^(?:weekday\s+tuesday\b)/i,/^(?:weekday\s+wednesday\b)/i,/^(?:weekday\s+thursday\b)/i,/^(?:weekday\s+friday\b)/i,/^(?:weekday\s+saturday\b)/i,/^(?:weekday\s+sunday\b)/i,/^(?:weekend\s+friday\b)/i,/^(?:weekend\s+saturday\b)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^\n]+)/i,/^(?:[^:\n]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},callbackargs:{rules:[21,22],inclusive:!1},callbackname:{rules:[18,19,20],inclusive:!1},href:{rules:[15,16],inclusive:!1},click:{rules:[24,25],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,17,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],inclusive:!0}}};return p})();y.lexer=g;function T(){this.yy={}}return c(T,"Parser"),T.prototype=y,y.Parser=T,new T})();Bt.parser=Bt;var Ke=Bt;Q.default.extend(Ve.default);Q.default.extend(Ne.default);Q.default.extend(Re.default);var Fe={friday:5,saturday:6},J="",qt="",Zt=void 0,Qt="",gt=[],pt=[],Kt=new Map,Jt=[],Dt=[],kt="",te="",ze=["active","done","crit","milestone","vert"],ee=[],vt=!1,ie=!1,se="sunday",St="saturday",Gt=0,Je=c(function(){Jt=[],Dt=[],kt="",ee=[],wt=0,Ut=void 0,_t=void 0,B=[],J="",qt="",te="",Zt=void 0,Qt="",gt=[],pt=[],vt=!1,ie=!1,Gt=0,Kt=new Map,ue(),se="sunday",St="saturday"},"clear"),ti=c(function(t){qt=t},"setAxisFormat"),ei=c(function(){return qt},"getAxisFormat"),ii=c(function(t){Zt=t},"setTickInterval"),si=c(function(){return Zt},"getTickInterval"),ri=c(function(t){Qt=t},"setTodayMarker"),ni=c(function(){return Qt},"getTodayMarker"),ai=c(function(t){J=t},"setDateFormat"),oi=c(function(){vt=!0},"enableInclusiveEndDates"),ci=c(function(){return vt},"endDatesAreInclusive"),li=c(function(){ie=!0},"enableTopAxis"),ui=c(function(){return ie},"topAxisEnabled"),di=c(function(t){te=t},"setDisplayMode"),fi=c(function(){return te},"getDisplayMode"),hi=c(function(){return J},"getDateFormat"),mi=c(function(t){gt=t.toLowerCase().split(/[\s,]+/)},"setIncludes"),ki=c(function(){return gt},"getIncludes"),yi=c(function(t){pt=t.toLowerCase().split(/[\s,]+/)},"setExcludes"),gi=c(function(){return pt},"getExcludes"),pi=c(function(){return Kt},"getLinks"),vi=c(function(t){kt=t,Jt.push(t)},"addSection"),Ti=c(function(){return Jt},"getSections"),bi=c(function(){let t=Oe(),s=10,n=0;for(;!t&&n{let S=D.trim();return S==="x"||S==="X"},"isTimestampFormat")(s)&&/^\d+$/.test(n))return new Date(Number(n));let u=/^after\s+(?[\d\w- ]+)/.exec(n);if(u!==null){let D=null;for(let P of u.groups.ids.split(" ")){let C=ct(P);C!==void 0&&(!D||C.endTime>D.endTime)&&(D=C)}if(D)return D.endTime;let S=new Date;return S.setHours(0,0,0,0),S}let b=(0,Q.default)(n,s.trim(),!0);if(b.isValid())return b.toDate();{it.debug("Invalid date:"+n),it.debug("With date format:"+s.trim());let D=new Date(n);if(D===void 0||isNaN(D.getTime())||D.getFullYear()<-1e4||D.getFullYear()>1e4)throw new Error("Invalid date:"+n);return D}},"getStartDate"),Be=c(function(t){let s=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return s!==null?[Number.parseFloat(s[1]),s[2]]:[NaN,"ms"]},"parseDuration"),Ge=c(function(t,s,n,a=!1){n=n.trim();let u=/^until\s+(?[\d\w- ]+)/.exec(n);if(u!==null){let C=null;for(let z of u.groups.ids.split(" ")){let R=ct(z);R!==void 0&&(!C||R.startTime{window.open(n,"_self")}),Kt.set(a,n))}),Ue(t,"clickable")},"setLink"),Ue=c(function(t,s){t.split(",").forEach(function(n){let a=ct(n);a!==void 0&&a.classes.push(s)})},"setClass"),Li=c(function(t,s,n){if(ot().securityLevel!=="loose"||s===void 0)return;let a=[];if(typeof n=="string"){a=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let u=0;u{Ie.runFunc(s,...a)})},"setClickFun"),qe=c(function(t,s){ee.push(function(){let n=document.querySelector(`[id="${t}"]`);n!==null&&n.addEventListener("click",function(){s()})},function(){let n=document.querySelector(`[id="${t}-text"]`);n!==null&&n.addEventListener("click",function(){s()})})},"pushFun"),Yi=c(function(t,s,n){t.split(",").forEach(function(a){Li(a,s,n)}),Ue(t,"clickable")},"setClickEvent"),$i=c(function(t){ee.forEach(function(s){s(t)})},"bindFunctions"),Ai={getConfig:c(()=>ot().gantt,"getConfig"),clear:Je,setDateFormat:ai,getDateFormat:hi,enableInclusiveEndDates:oi,endDatesAreInclusive:ci,enableTopAxis:li,topAxisEnabled:ui,setAxisFormat:ti,getAxisFormat:ei,setTickInterval:ii,getTickInterval:si,setTodayMarker:ri,getTodayMarker:ni,setAccTitle:de,getAccTitle:fe,setDiagramTitle:ke,getDiagramTitle:ye,setDisplayMode:di,getDisplayMode:fi,setAccDescription:he,getAccDescription:me,addSection:vi,getSections:Ti,getTasks:bi,addTask:Mi,findTaskById:ct,addTaskOrg:Ei,setIncludes:mi,getIncludes:ki,setExcludes:yi,getExcludes:gi,setClickEvent:Yi,setLink:Ii,getLinks:pi,bindFunctions:$i,parseDuration:Be,isInvalidDate:He,setWeekday:xi,getWeekday:wi,setWeekend:_i};function re(t,s,n){let a=!0;for(;a;)a=!1,n.forEach(function(r){let u="^\\s*"+r+"\\s*$",b=new RegExp(u);t[0].match(b)&&(s[r]=!0,t.shift(1),a=!0)})}c(re,"getTaskTags");ht.default.extend(Ze.default);var Fi=c(function(){it.debug("Something is calling, setConf, remove the call")},"setConf"),We={monday:we,tuesday:_e,wednesday:De,thursday:Se,friday:Ce,saturday:Me,sunday:xe},Oi=c((t,s)=>{let n=[...t].map(()=>-1/0),a=[...t].sort((u,b)=>u.startTime-b.startTime||u.order-b.order),r=0;for(let u of a)for(let b=0;b=n[b]){n[b]=u.endTime,u.order=b+s,b>r&&(r=b);break}return r},"getMaxIntersections"),et,jt=1e4,Wi=c(function(t,s,n,a){let r=ot().gantt,u=ot().securityLevel,b;u==="sandbox"&&(b=yt("#i"+s));let D=u==="sandbox"?yt(b.nodes()[0].contentDocument.body):yt("body"),S=u==="sandbox"?b.nodes()[0].contentDocument:document,P=S.getElementById(s);et=P.parentElement.offsetWidth,et===void 0&&(et=1200),r.useWidth!==void 0&&(et=r.useWidth);let C=a.db.getTasks(),W=[];for(let f of C)W.push(f.type);W=$(W);let z={},R=2*r.topPadding;if(a.db.getDisplayMode()==="compact"||r.displayMode==="compact"){let f={};for(let g of C)f[g.section]===void 0?f[g.section]=[g]:f[g.section].push(g);let y=0;for(let g of Object.keys(f)){let T=Oi(f[g],y)+1;y+=T,R+=T*(r.barHeight+r.barGap),z[g]=T}}else{R+=C.length*(r.barHeight+r.barGap);for(let f of W)z[f]=C.filter(y=>y.type===f).length}P.setAttribute("viewBox","0 0 "+et+" "+R);let x=D.select(`[id="${s}"]`),k=Ee().domain([pe(C,function(f){return f.startTime}),ge(C,function(f){return f.endTime})]).rangeRound([0,et-r.leftPadding-r.rightPadding]);function F(f,y){let g=f.startTime,T=y.startTime,p=0;return g>T?p=1:ge.vert===_.vert?0:e.vert?1:-1);let m=[...new Set(f.map(e=>e.order))].map(e=>f.find(_=>_.order===e));x.append("g").selectAll("rect").data(m).enter().append("rect").attr("x",0).attr("y",function(e,_){return _=e.order,_*y+g-2}).attr("width",function(){return l-r.rightPadding/2}).attr("height",y).attr("class",function(e){for(let[_,A]of W.entries())if(e.type===A)return"section section"+_%r.numberSectionStyles;return"section section0"}).enter();let w=x.append("g").selectAll("rect").data(f).enter(),i=a.db.getLinks();if(w.append("rect").attr("id",function(e){return e.id}).attr("rx",3).attr("ry",3).attr("x",function(e){return e.milestone?k(e.startTime)+T+.5*(k(e.endTime)-k(e.startTime))-.5*p:k(e.startTime)+T}).attr("y",function(e,_){return _=e.order,e.vert?r.gridLineStartPadding:_*y+g}).attr("width",function(e){return e.milestone?p:e.vert?.08*p:k(e.renderEndTime||e.endTime)-k(e.startTime)}).attr("height",function(e){return e.vert?C.length*(r.barHeight+r.barGap)+r.barHeight*2:p}).attr("transform-origin",function(e,_){return _=e.order,(k(e.startTime)+T+.5*(k(e.endTime)-k(e.startTime))).toString()+"px "+(_*y+g+.5*p).toString()+"px"}).attr("class",function(e){let _="task",A="";e.classes.length>0&&(A=e.classes.join(" "));let I=0;for(let[H,V]of W.entries())e.type===V&&(I=H%r.numberSectionStyles);let L="";return e.active?e.crit?L+=" activeCrit":L=" active":e.done?e.crit?L=" doneCrit":L=" done":e.crit&&(L+=" crit"),L.length===0&&(L=" task"),e.milestone&&(L=" milestone "+L),e.vert&&(L=" vert "+L),L+=I,L+=" "+A,_+L}),w.append("text").attr("id",function(e){return e.id+"-text"}).text(function(e){return e.task}).attr("font-size",r.fontSize).attr("x",function(e){let _=k(e.startTime),A=k(e.renderEndTime||e.endTime);if(e.milestone&&(_+=.5*(k(e.endTime)-k(e.startTime))-.5*p,A=_+p),e.vert)return k(e.startTime)+T;let I=this.getBBox().width;return I>A-_?A+I+1.5*r.leftPadding>l?_+T-5:A+T+5:(A-_)/2+_+T}).attr("y",function(e,_){return e.vert?r.gridLineStartPadding+C.length*(r.barHeight+r.barGap)+60:(_=e.order,_*y+r.barHeight/2+(r.fontSize/2-2)+g)}).attr("text-height",p).attr("class",function(e){let _=k(e.startTime),A=k(e.endTime);e.milestone&&(A=_+p);let I=this.getBBox().width,L="";e.classes.length>0&&(L=e.classes.join(" "));let H=0;for(let[N,U]of W.entries())e.type===U&&(H=N%r.numberSectionStyles);let V="";return e.active&&(e.crit?V="activeCritText"+H:V="activeText"+H),e.done?e.crit?V=V+" doneCritText"+H:V=V+" doneText"+H:e.crit&&(V=V+" critText"+H),e.milestone&&(V+=" milestoneText"),e.vert&&(V+=" vertText"),I>A-_?A+I+1.5*r.leftPadding>l?L+" taskTextOutsideLeft taskTextOutside"+H+" "+V:L+" taskTextOutsideRight taskTextOutside"+H+" "+V+" width-"+I:L+" taskText taskText"+H+" "+V+" width-"+I}),ot().securityLevel==="sandbox"){let e;e=yt("#i"+s);let _=e.nodes()[0].contentDocument;w.filter(function(A){return i.has(A.id)}).each(function(A){var I=_.querySelector("#"+A.id),L=_.querySelector("#"+A.id+"-text");let H=I.parentNode;var V=_.createElement("a");V.setAttribute("xlink:href",i.get(A.id)),V.setAttribute("target","_top"),H.appendChild(V),V.appendChild(I),V.appendChild(L)})}}c(G,"drawRects");function X(f,y,g,T,p,o,l,h){if(l.length===0&&h.length===0)return;let m,w;for(let{startTime:I,endTime:L}of o)(m===void 0||Iw)&&(w=L);if(!m||!w)return;if((0,ht.default)(w).diff((0,ht.default)(m),"year")>5){it.warn("The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.");return}let i=a.db.getDateFormat(),O=[],e=null,_=(0,ht.default)(m);for(;_.valueOf()<=w;)a.db.isInvalidDate(_,i,l,h)?e?e.end=_:e={start:_,end:_}:e&&(O.push(e),e=null),_=_.add(1,"d");x.append("g").selectAll("rect").data(O).enter().append("rect").attr("id",I=>"exclude-"+I.start.format("YYYY-MM-DD")).attr("x",I=>k(I.start.startOf("day"))+g).attr("y",r.gridLineStartPadding).attr("width",I=>k(I.end.endOf("day"))-k(I.start.startOf("day"))).attr("height",p-y-r.gridLineStartPadding).attr("transform-origin",function(I,L){return(k(I.start)+g+.5*(k(I.end)-k(I.start))).toString()+"px "+(L*f+.5*p).toString()+"px"}).attr("class","exclude-range")}c(X,"drawExcludeDays");function E(f,y,g,T){if(g<=0||f>y)return 1/0;let p=y-f,o=ht.default.duration({[T??"day"]:g}).asMilliseconds();return o<=0?1/0:Math.ceil(p/o)}c(E,"getEstimatedTickCount");function v(f,y,g,T){let p=a.db.getDateFormat(),o=a.db.getAxisFormat(),l;o?l=o:p==="D"?l="%d":l=r.axisFormat??"%Y-%m-%d";let h=Te(k).tickSize(-T+y+r.gridLineStartPadding).tickFormat(Ft(l)),w=/^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/.exec(a.db.getTickInterval()||r.tickInterval);if(w!==null){let i=parseInt(w[1],10);if(isNaN(i)||i<=0)it.warn(`Invalid tick interval value: "${w[1]}". Skipping custom tick interval.`);else{let O=w[2],e=a.db.getWeekday()||r.weekday,_=k.domain(),A=_[0],I=_[1],L=E(A,I,i,O);if(L>jt)it.warn(`The tick interval "${i}${O}" would generate ${L} ticks, which exceeds the maximum allowed (${jt}). This may indicate an invalid date or time range. Skipping custom tick interval.`);else switch(O){case"millisecond":h.ticks(Et.every(i));break;case"second":h.ticks(It.every(i));break;case"minute":h.ticks(Lt.every(i));break;case"hour":h.ticks(Yt.every(i));break;case"day":h.ticks($t.every(i));break;case"week":h.ticks(We[e].every(i));break;case"month":h.ticks(At.every(i));break}}}if(x.append("g").attr("class","grid").attr("transform","translate("+f+", "+(T-50)+")").call(h).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),a.db.topAxisEnabled()||r.topAxis){let i=ve(k).tickSize(-T+y+r.gridLineStartPadding).tickFormat(Ft(l));if(w!==null){let O=parseInt(w[1],10);if(isNaN(O)||O<=0)it.warn(`Invalid tick interval value: "${w[1]}". Skipping custom tick interval.`);else{let e=w[2],_=a.db.getWeekday()||r.weekday,A=k.domain(),I=A[0],L=A[1];if(E(I,L,O,e)<=jt)switch(e){case"millisecond":i.ticks(Et.every(O));break;case"second":i.ticks(It.every(O));break;case"minute":i.ticks(Lt.every(O));break;case"hour":i.ticks(Yt.every(O));break;case"day":i.ticks($t.every(O));break;case"week":i.ticks(We[_].every(O));break;case"month":i.ticks(At.every(O));break}}}x.append("g").attr("class","grid").attr("transform","translate("+f+", "+y+")").call(i).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}c(v,"makeGrid");function d(f,y){let g=0,T=Object.keys(z).map(p=>[p,z[p]]);x.append("g").selectAll("text").data(T).enter().append(function(p){let o=p[0].split(ce.lineBreakRegex),l=-(o.length-1)/2,h=S.createElementNS("http://www.w3.org/2000/svg","text");h.setAttribute("dy",l+"em");for(let[m,w]of o.entries()){let i=S.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttribute("alignment-baseline","central"),i.setAttribute("x","10"),m>0&&i.setAttribute("dy","1em"),i.textContent=w,h.appendChild(i)}return h}).attr("x",10).attr("y",function(p,o){if(o>0)for(let l=0;l` + .mermaid-main-font { + font-family: ${t.fontFamily}; + } + + .exclude-range { + fill: ${t.excludeBkgColor}; + } + + .section { + stroke: none; + opacity: 0.2; + } + + .section0 { + fill: ${t.sectionBkgColor}; + } + + .section2 { + fill: ${t.sectionBkgColor2}; + } + + .section1, + .section3 { + fill: ${t.altSectionBkgColor}; + opacity: 0.2; + } + + .sectionTitle0 { + fill: ${t.titleColor}; + } + + .sectionTitle1 { + fill: ${t.titleColor}; + } + + .sectionTitle2 { + fill: ${t.titleColor}; + } + + .sectionTitle3 { + fill: ${t.titleColor}; + } + + .sectionTitle { + text-anchor: start; + font-family: ${t.fontFamily}; + } + + + /* Grid and axis */ + + .grid .tick { + stroke: ${t.gridColor}; + opacity: 0.8; + shape-rendering: crispEdges; + } + + .grid .tick text { + font-family: ${t.fontFamily}; + fill: ${t.textColor}; + } + + .grid path { + stroke-width: 0; + } + + + /* Today line */ + + .today { + fill: none; + stroke: ${t.todayLineColor}; + stroke-width: 2px; + } + + + /* Task styling */ + + /* Default task */ + + .task { + stroke-width: 2; + } + + .taskText { + text-anchor: middle; + font-family: ${t.fontFamily}; + } + + .taskTextOutsideRight { + fill: ${t.taskTextDarkColor}; + text-anchor: start; + font-family: ${t.fontFamily}; + } + + .taskTextOutsideLeft { + fill: ${t.taskTextDarkColor}; + text-anchor: end; + } + + + /* Special case clickable */ + + .task.clickable { + cursor: pointer; + } + + .taskText.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideLeft.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideRight.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + + /* Specific task settings for the sections*/ + + .taskText0, + .taskText1, + .taskText2, + .taskText3 { + fill: ${t.taskTextColor}; + } + + .task0, + .task1, + .task2, + .task3 { + fill: ${t.taskBkgColor}; + stroke: ${t.taskBorderColor}; + } + + .taskTextOutside0, + .taskTextOutside2 + { + fill: ${t.taskTextOutsideColor}; + } + + .taskTextOutside1, + .taskTextOutside3 { + fill: ${t.taskTextOutsideColor}; + } + + + /* Active task */ + + .active0, + .active1, + .active2, + .active3 { + fill: ${t.activeTaskBkgColor}; + stroke: ${t.activeTaskBorderColor}; + } + + .activeText0, + .activeText1, + .activeText2, + .activeText3 { + fill: ${t.taskTextDarkColor} !important; + } + + + /* Completed task */ + + .done0, + .done1, + .done2, + .done3 { + stroke: ${t.doneTaskBorderColor}; + fill: ${t.doneTaskBkgColor}; + stroke-width: 2; + } + + .doneText0, + .doneText1, + .doneText2, + .doneText3 { + fill: ${t.taskTextDarkColor} !important; + } + + /* Done task text displayed outside the bar sits against the diagram background, + not against the done-task bar, so it must use the outside/contrast color. */ + .doneText0.taskTextOutsideLeft, + .doneText0.taskTextOutsideRight, + .doneText1.taskTextOutsideLeft, + .doneText1.taskTextOutsideRight, + .doneText2.taskTextOutsideLeft, + .doneText2.taskTextOutsideRight, + .doneText3.taskTextOutsideLeft, + .doneText3.taskTextOutsideRight { + fill: ${t.taskTextOutsideColor} !important; + } + + + /* Tasks on the critical line */ + + .crit0, + .crit1, + .crit2, + .crit3 { + stroke: ${t.critBorderColor}; + fill: ${t.critBkgColor}; + stroke-width: 2; + } + + .activeCrit0, + .activeCrit1, + .activeCrit2, + .activeCrit3 { + stroke: ${t.critBorderColor}; + fill: ${t.activeTaskBkgColor}; + stroke-width: 2; + } + + .doneCrit0, + .doneCrit1, + .doneCrit2, + .doneCrit3 { + stroke: ${t.critBorderColor}; + fill: ${t.doneTaskBkgColor}; + stroke-width: 2; + cursor: pointer; + shape-rendering: crispEdges; + } + + .milestone { + transform: rotate(45deg) scale(0.8,0.8); + } + + .milestoneText { + font-style: italic; + } + .doneCritText0, + .doneCritText1, + .doneCritText2, + .doneCritText3 { + fill: ${t.taskTextDarkColor} !important; + } + + /* Done-crit task text outside the bar \u2014 same reasoning as doneText above. */ + .doneCritText0.taskTextOutsideLeft, + .doneCritText0.taskTextOutsideRight, + .doneCritText1.taskTextOutsideLeft, + .doneCritText1.taskTextOutsideRight, + .doneCritText2.taskTextOutsideLeft, + .doneCritText2.taskTextOutsideRight, + .doneCritText3.taskTextOutsideLeft, + .doneCritText3.taskTextOutsideRight { + fill: ${t.taskTextOutsideColor} !important; + } + + .vert { + stroke: ${t.vertLineColor}; + } + + .vertText { + font-size: 15px; + text-anchor: middle; + fill: ${t.vertLineColor} !important; + } + + .activeCritText0, + .activeCritText1, + .activeCritText2, + .activeCritText3 { + fill: ${t.taskTextDarkColor} !important; + } + + .titleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.titleColor||t.textColor}; + font-family: ${t.fontFamily}; + } +`,"getStyles"),Ni=Vi,Gi={parser:Ke,db:Ai,renderer:Pi,styles:Ni};export{Gi as diagram}; diff --git a/src/google/adk/cli/browser/chunk-XE4A3JWW.js b/src/google/adk/cli/browser/chunk-XE4A3JWW.js new file mode 100644 index 0000000000..611e9d0cbd --- /dev/null +++ b/src/google/adk/cli/browser/chunk-XE4A3JWW.js @@ -0,0 +1 @@ +import{a as r,b as e}from"./chunk-2DLZXFEQ.js";import"./chunk-NALL4A3P.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import"./chunk-RMXJBC7V.js";export{r as GitGraphModule,e as createGitGraphServices}; diff --git a/src/google/adk/cli/browser/chunk-XMBKBASC.js b/src/google/adk/cli/browser/chunk-XMBKBASC.js new file mode 100644 index 0000000000..e7a4f921c7 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-XMBKBASC.js @@ -0,0 +1 @@ +import{C as m,G as E,J as a,S as O,Y as C,b as u,p as o,s as f}from"./chunk-ASJUXEUE.js";import{h as b,l as c}from"./chunk-EGBSMT36.js";var j="\0",_="\0",N="",p=class{constructor(e={}){this._isDirected=Object.prototype.hasOwnProperty.call(e,"directed")?e.directed:!0,this._isMultigraph=Object.prototype.hasOwnProperty.call(e,"multigraph")?e.multigraph:!1,this._isCompound=Object.prototype.hasOwnProperty.call(e,"compound")?e.compound:!1,this._label=void 0,this._defaultNodeLabelFn=c(void 0),this._defaultEdgeLabelFn=c(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[_]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return b(e)||(e=c(e)),this._defaultNodeLabelFn=e,this}nodeCount(){return this._nodeCount}nodes(){return u(this._nodes)}sources(){var e=this;return f(this.nodes(),function(t){return E(e._in[t])})}sinks(){var e=this;return f(this.nodes(),function(t){return E(e._out[t])})}setNodes(e,t){var s=arguments,i=this;return o(e,function(r){s.length>1?i.setNode(r,t):i.setNode(r)}),this}setNode(e,t){return Object.prototype.hasOwnProperty.call(this._nodes,e)?(arguments.length>1&&(this._nodes[e]=t),this):(this._nodes[e]=arguments.length>1?t:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=_,this._children[e]={},this._children[_][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return Object.prototype.hasOwnProperty.call(this._nodes,e)}removeNode(e){if(Object.prototype.hasOwnProperty.call(this._nodes,e)){var t=s=>this.removeEdge(this._edgeObjs[s]);delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],o(this.children(e),s=>{this.setParent(s)}),delete this._children[e]),o(u(this._in[e]),t),delete this._in[e],delete this._preds[e],o(u(this._out[e]),t),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,t){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(a(t))t=_;else{t+="";for(var s=t;!a(s);s=this.parent(s))if(s===e)throw new Error("Setting "+t+" as parent of "+e+" would create a cycle");this.setNode(t)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=t,this._children[t][e]=!0,this}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}parent(e){if(this._isCompound){var t=this._parent[e];if(t!==_)return t}}children(e){if(a(e)&&(e=_),this._isCompound){var t=this._children[e];if(t)return u(t)}else{if(e===_)return this.nodes();if(this.hasNode(e))return[]}}predecessors(e){var t=this._preds[e];if(t)return u(t)}successors(e){var t=this._sucs[e];if(t)return u(t)}neighbors(e){var t=this.predecessors(e);if(t)return C(t,this.successors(e))}isLeaf(e){var t;return this.isDirected()?t=this.successors(e):t=this.neighbors(e),t.length===0}filterNodes(e){var t=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});t.setGraph(this.graph());var s=this;o(this._nodes,function(n,h){e(h)&&t.setNode(h,n)}),o(this._edgeObjs,function(n){t.hasNode(n.v)&&t.hasNode(n.w)&&t.setEdge(n,s.edge(n))});var i={};function r(n){var h=s.parent(n);return h===void 0||t.hasNode(h)?(i[n]=h,h):h in i?i[h]:r(h)}return this._isCompound&&o(t.nodes(),function(n){t.setParent(n,r(n))}),t}setDefaultEdgeLabel(e){return b(e)||(e=c(e)),this._defaultEdgeLabelFn=e,this}edgeCount(){return this._edgeCount}edges(){return m(this._edgeObjs)}setPath(e,t){var s=this,i=arguments;return O(e,function(r,n){return i.length>1?s.setEdge(r,n,t):s.setEdge(r,n),n}),this}setEdge(){var e,t,s,i,r=!1,n=arguments[0];typeof n=="object"&&n!==null&&"v"in n?(e=n.v,t=n.w,s=n.name,arguments.length===2&&(i=arguments[1],r=!0)):(e=n,t=arguments[1],s=arguments[3],arguments.length>2&&(i=arguments[2],r=!0)),e=""+e,t=""+t,a(s)||(s=""+s);var h=g(this._isDirected,e,t,s);if(Object.prototype.hasOwnProperty.call(this._edgeLabels,h))return r&&(this._edgeLabels[h]=i),this;if(!a(s)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(e),this.setNode(t),this._edgeLabels[h]=r?i:this._defaultEdgeLabelFn(e,t,s);var l=P(this._isDirected,e,t,s);return e=l.v,t=l.w,Object.freeze(l),this._edgeObjs[h]=l,v(this._preds[t],e),v(this._sucs[e],t),this._in[t][h]=l,this._out[e][h]=l,this._edgeCount++,this}edge(e,t,s){var i=arguments.length===1?y(this._isDirected,arguments[0]):g(this._isDirected,e,t,s);return this._edgeLabels[i]}hasEdge(e,t,s){var i=arguments.length===1?y(this._isDirected,arguments[0]):g(this._isDirected,e,t,s);return Object.prototype.hasOwnProperty.call(this._edgeLabels,i)}removeEdge(e,t,s){var i=arguments.length===1?y(this._isDirected,arguments[0]):g(this._isDirected,e,t,s),r=this._edgeObjs[i];return r&&(e=r.v,t=r.w,delete this._edgeLabels[i],delete this._edgeObjs[i],L(this._preds[t],e),L(this._sucs[e],t),delete this._in[t][i],delete this._out[e][i],this._edgeCount--),this}inEdges(e,t){var s=this._in[e];if(s){var i=m(s);return t?f(i,function(r){return r.v===t}):i}}outEdges(e,t){var s=this._out[e];if(s){var i=m(s);return t?f(i,function(r){return r.w===t}):i}}nodeEdges(e,t){var s=this.inEdges(e,t);if(s)return s.concat(this.outEdges(e,t))}};p.prototype._nodeCount=0;p.prototype._edgeCount=0;function v(d,e){d[e]?d[e]++:d[e]=1}function L(d,e){--d[e]||delete d[e]}function g(d,e,t,s){var i=""+e,r=""+t;if(!d&&i>r){var n=i;i=r,r=n}return i+N+r+N+(a(s)?j:s)}function P(d,e,t,s){var i=""+e,r=""+t;if(!d&&i>r){var n=i;i=r,r=n}var h={v:i,w:r};return s&&(h.name=s),h}function y(d,e){return g(d,e.v,e.w,e.name)}export{p as a}; diff --git a/src/google/adk/cli/browser/chunk-XULIXUQL.js b/src/google/adk/cli/browser/chunk-XULIXUQL.js new file mode 100644 index 0000000000..bc72b77899 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-XULIXUQL.js @@ -0,0 +1 @@ +import{a as n,b as s,c as i,d as l,e as f,f as o,g as d,n as m,o as c,q as p}from"./chunk-NALL4A3P.js";var u=class extends p{static{o(this,"TreemapTokenBuilder")}constructor(){super(["treemap"])}},v=/classDef\s+([A-Z_a-z]\w+)(?:\s+([^\n\r;]*))?;?/,g=class extends c{static{o(this,"TreemapValueConverter")}runCustomConverter(r,e,t){if(r.name==="NUMBER2")return parseFloat(e.replace(/,/g,""));if(r.name==="SEPARATOR")return e.substring(1,e.length-1);if(r.name==="STRING2")return e.substring(1,e.length-1);if(r.name==="INDENTATION")return e.length;if(r.name==="ClassDef"){if(typeof e!="string")return e;let a=v.exec(e);if(a)return{$type:"ClassDefStatement",className:a[1],styleText:a[2]||void 0}}}};function T(r){let e=r.validation.TreemapValidator,t=r.validation.ValidationRegistry;if(t){let a={Treemap:e.checkSingleRoot.bind(e)};t.register(a,e)}}o(T,"registerValidationChecks");var h=class{static{o(this,"TreemapValidator")}checkSingleRoot(r,e){let t;for(let a of r.TreemapRows)a.item&&(t===void 0&&a.indent===void 0?t=0:a.indent===void 0?e("error","Multiple root nodes are not allowed in a treemap.",{node:a,property:"item"}):t!==void 0&&t>=parseInt(a.indent,10)&&e("error","Multiple root nodes are not allowed in a treemap.",{node:a,property:"item"}))}},C={parser:{TokenBuilder:o(()=>new u,"TokenBuilder"),ValueConverter:o(()=>new g,"ValueConverter")},validation:{TreemapValidator:o(()=>new h,"TreemapValidator")}};function V(r=l){let e=i(s(r),d),t=i(n({shared:e}),m,C);return e.ServiceRegistry.register(t),T(t),{shared:e,Treemap:t}}o(V,"createTreemapServices");export{C as a,V as b}; diff --git a/src/google/adk/cli/browser/chunk-4S2CIXCW.js b/src/google/adk/cli/browser/chunk-Y7O3NHKW.js similarity index 91% rename from src/google/adk/cli/browser/chunk-4S2CIXCW.js rename to src/google/adk/cli/browser/chunk-Y7O3NHKW.js index 62cdc0909a..64e0fba907 100644 --- a/src/google/adk/cli/browser/chunk-4S2CIXCW.js +++ b/src/google/adk/cli/browser/chunk-Y7O3NHKW.js @@ -1 +1 @@ -import{$a as s,Ca as o,Cc as _,Gb as u,Lb as g,Pa as r,Yb as y,Zb as C,eb as c,ob as a,pd as M,qd as v,ub as d,vb as l,wb as p,xb as m,yb as f,zb as h}from"./chunk-EN473UE3.js";import"./chunk-W7GRJBO5.js";function O(e,x){if(e&1&&u(0,0),e&2){let n=x.$implicit,i=g();m("surfaceId",i.surfaceId())("component",n)}}var D=(()=>{class e extends M{direction=_("vertical");static \u0275fac=(()=>{let n;return function(t){return(n||(n=o(e)))(t||e)}})();static \u0275cmp=s({type:e,selectors:[["a2ui-list"]],hostVars:1,hostBindings:function(i,t){i&2&&a("direction",t.direction())},inputs:{direction:[1,"direction"]},features:[c],decls:3,vars:4,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(i,t){i&1&&(f(0,"section"),l(1,O,1,2,"ng-container",0,d),h()),i&2&&(y(t.theme.additionalStyles==null?null:t.theme.additionalStyles.List),C(t.theme.components.List),r(),p(t.component().properties.children))},dependencies:[v],styles:['[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}[direction="vertical"][_nghost-%COMP%] section[_ngcontent-%COMP%]{display:grid}[direction="horizontal"][_nghost-%COMP%] section[_ngcontent-%COMP%]{display:flex;max-width:100%;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none}[direction="horizontal"][_nghost-%COMP%] section[_ngcontent-%COMP%] > [_ngcontent-%COMP%]::slotted(*){flex:1 0 fit-content;max-width:min(80%,400px)}']})}return e})();export{D as List}; +import{$a as s,Ca as o,Cc as _,Gb as u,Lb as g,Pa as r,Yb as y,Zb as C,eb as c,ob as a,pd as M,qd as v,ub as d,vb as l,wb as p,xb as m,yb as f,zb as h}from"./chunk-2SRK2U7X.js";import"./chunk-RMXJBC7V.js";function O(e,x){if(e&1&&u(0,0),e&2){let n=x.$implicit,i=g();m("surfaceId",i.surfaceId())("component",n)}}var D=(()=>{class e extends M{direction=_("vertical");static \u0275fac=(()=>{let n;return function(t){return(n||(n=o(e)))(t||e)}})();static \u0275cmp=s({type:e,selectors:[["a2ui-list"]],hostVars:1,hostBindings:function(i,t){i&2&&a("direction",t.direction())},inputs:{direction:[1,"direction"]},features:[c],decls:3,vars:4,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(i,t){i&1&&(f(0,"section"),l(1,O,1,2,"ng-container",0,d),h()),i&2&&(y(t.theme.additionalStyles==null?null:t.theme.additionalStyles.List),C(t.theme.components.List),r(),p(t.component().properties.children))},dependencies:[v],styles:['[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}[direction="vertical"][_nghost-%COMP%] section[_ngcontent-%COMP%]{display:grid}[direction="horizontal"][_nghost-%COMP%] section[_ngcontent-%COMP%]{display:flex;max-width:100%;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none}[direction="horizontal"][_nghost-%COMP%] section[_ngcontent-%COMP%] > [_ngcontent-%COMP%]::slotted(*){flex:1 0 fit-content;max-width:min(80%,400px)}']})}return e})();export{D as List}; diff --git a/src/google/adk/cli/browser/chunk-YVVLWU7S.js b/src/google/adk/cli/browser/chunk-YVVLWU7S.js new file mode 100644 index 0000000000..203c8675f1 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-YVVLWU7S.js @@ -0,0 +1,321 @@ +function Bs(r,e){(e==null||e>r.length)&&(e=r.length);for(var t=0,a=Array(e);t=r.length?{done:!0}:{done:!1,value:r[a++]}},e:function(l){throw l},f:n}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var i,s=!0,o=!1;return{s:function(){t=t.call(r)},n:function(){var l=t.next();return s=l.done,l},e:function(l){o=!0,i=l},f:function(){try{s||t.return==null||t.return()}finally{if(o)throw i}}}}function Jl(r,e,t){return(e=jl(e))in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}function ac(r){if(typeof Symbol<"u"&&r[Symbol.iterator]!=null||r["@@iterator"]!=null)return Array.from(r)}function nc(r,e){var t=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(t!=null){var a,n,i,s,o=[],l=!0,u=!1;try{if(i=(t=t.call(r)).next,e===0){if(Object(t)!==t)return;l=!1}else for(;!(l=(a=i.call(t)).done)&&(o.push(a.value),o.length!==e);l=!0);}catch(v){u=!0,n=v}finally{try{if(!l&&t.return!=null&&(s=t.return(),Object(s)!==s))return}finally{if(u)throw n}}return o}}function ic(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function sc(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Je(r,e){return ec(r)||nc(r,e)||Xs(r,e)||ic()}function mn(r){return rc(r)||ac(r)||Xs(r)||sc()}function oc(r,e){if(typeof r!="object"||!r)return r;var t=r[Symbol.toPrimitive];if(t!==void 0){var a=t.call(r,e);if(typeof a!="object")return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(r)}function jl(r){var e=oc(r,"string");return typeof e=="symbol"?e:e+""}function ar(r){"@babel/helpers - typeof";return ar=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ar(r)}function Xs(r,e){if(r){if(typeof r=="string")return Bs(r,e);var t={}.toString.call(r).slice(8,-1);return t==="Object"&&r.constructor&&(t=r.constructor.name),t==="Map"||t==="Set"?Array.from(r):t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?Bs(r,e):void 0}}var rr=typeof window>"u"?null:window,To=rr?rr.navigator:null;rr&&rr.document;var uc=ar(""),ev=ar({}),lc=ar(function(){}),vc=typeof HTMLElement>"u"?"undefined":ar(HTMLElement),La=function(e){return e&&e.instanceString&&Ue(e.instanceString)?e.instanceString():null},ge=function(e){return e!=null&&ar(e)==uc},Ue=function(e){return e!=null&&ar(e)===lc},_e=function(e){return!Dr(e)&&(Array.isArray?Array.isArray(e):e!=null&&e instanceof Array)},Le=function(e){return e!=null&&ar(e)===ev&&!_e(e)&&e.constructor===Object},fc=function(e){return e!=null&&ar(e)===ev},ae=function(e){return e!=null&&ar(e)===ar(1)&&!isNaN(e)},cc=function(e){return ae(e)&&Math.floor(e)===e},bn=function(e){if(vc!=="undefined")return e!=null&&e instanceof HTMLElement},Dr=function(e){return Ia(e)||rv(e)},Ia=function(e){return La(e)==="collection"&&e._private.single},rv=function(e){return La(e)==="collection"&&!e._private.single},Ys=function(e){return La(e)==="core"},tv=function(e){return La(e)==="stylesheet"},dc=function(e){return La(e)==="event"},ut=function(e){return e==null?!0:!!(e===""||e.match(/^\s+$/))},hc=function(e){return typeof HTMLElement>"u"?!1:e instanceof HTMLElement},gc=function(e){return Le(e)&&ae(e.x1)&&ae(e.x2)&&ae(e.y1)&&ae(e.y2)},pc=function(e){return fc(e)&&Ue(e.then)},yc=function(){return To&&To.userAgent.match(/msie|trident|edge/i)},Qt=function(e,t){t||(t=function(){if(arguments.length===1)return arguments[0];if(arguments.length===0)return"undefined";for(var i=[],s=0;st?1:0},Tc=function(e,t){return-1*nv(e,t)},be=Object.assign!=null?Object.assign.bind(Object):function(r){for(var e=arguments,t=1;t1&&(g-=1),g<1/6?d+(y-d)*6*g:g<1/2?y:g<2/3?d+(y-d)*(2/3-g)*6:d}var f=new RegExp("^"+wc+"$").exec(e);if(f){if(a=parseInt(f[1]),a<0?a=(360- -1*a%360)%360:a>360&&(a=a%360),a/=360,n=parseFloat(f[2]),n<0||n>100||(n=n/100,i=parseFloat(f[3]),i<0||i>100)||(i=i/100,s=f[4],s!==void 0&&(s=parseFloat(s),s<0||s>1)))return;if(n===0)o=l=u=Math.round(i*255);else{var c=i<.5?i*(1+n):i+n-i*n,h=2*i-c;o=Math.round(255*v(h,c,a+1/3)),l=Math.round(255*v(h,c,a)),u=Math.round(255*v(h,c,a-1/3))}t=[o,l,u,s]}return t},Dc=function(e){var t,a=new RegExp("^"+mc+"$").exec(e);if(a){t=[];for(var n=[],i=1;i<=3;i++){var s=a[i];if(s[s.length-1]==="%"&&(n[i]=!0),s=parseFloat(s),n[i]&&(s=s/100*255),s<0||s>255)return;t.push(Math.floor(s))}var o=n[1]||n[2]||n[3],l=n[1]&&n[2]&&n[3];if(o&&!l)return;var u=a[4];if(u!==void 0){if(u=parseFloat(u),u<0||u>1)return;t.push(u)}}return t},Bc=function(e){return Pc[e.toLowerCase()]},iv=function(e){return(_e(e)?e:null)||Bc(e)||Sc(e)||Dc(e)||kc(e)},Pc={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},sv=function(e){for(var t=e.map,a=e.keys,n=a.length,i=0;i=l||R<0||m&&L>=c}function T(){var A=e();if(x(A))return k(A);d=setTimeout(T,C(A))}function k(A){return d=void 0,b&&v?w(A):(v=f=void 0,h)}function D(){d!==void 0&&clearTimeout(d),g=0,v=y=f=d=void 0}function B(){return d===void 0?h:k(e())}function P(){var A=e(),R=x(A);if(v=arguments,f=this,y=A,R){if(d===void 0)return E(y);if(m)return clearTimeout(d),d=setTimeout(T,l),w(y)}return d===void 0&&(d=setTimeout(T,l)),h}return P.cancel=D,P.flush=B,P}return fi=s,fi}var Vc=Fc(),Fa=Oa(Vc),ci=rr?rr.performance:null,lv=ci&&ci.now?function(){return ci.now()}:function(){return Date.now()},qc=(function(){if(rr){if(rr.requestAnimationFrame)return function(r){rr.requestAnimationFrame(r)};if(rr.mozRequestAnimationFrame)return function(r){rr.mozRequestAnimationFrame(r)};if(rr.webkitRequestAnimationFrame)return function(r){rr.webkitRequestAnimationFrame(r)};if(rr.msRequestAnimationFrame)return function(r){rr.msRequestAnimationFrame(r)}}return function(r){r&&setTimeout(function(){r(lv())},1e3/60)}})(),wn=function(e){return qc(e)},Yr=lv,St=9261,vv=65599,Ht=5381,fv=function(e){for(var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:St,a=t,n;n=e.next(),!n.done;)a=a*vv+n.value|0;return a},Ca=function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:St;return t*vv+e|0},Ta=function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Ht;return(t<<5)+t+e|0},_c=function(e,t){return e*2097152+t},et=function(e){return e[0]*2097152+e[1]},Xa=function(e,t){return[Ca(e[0],t[0]),Ta(e[1],t[1])]},qo=function(e,t){var a={value:0,done:!1},n=0,i=e.length,s={next:function(){return n=0;n--)e[n]===t&&e.splice(n,1)},eo=function(e){e.splice(0,e.length)},Qc=function(e,t){for(var a=0;a"u"?"undefined":ar(Set))!==jc?Set:ed,In=function(e,t){var a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(e===void 0||t===void 0||!Ys(e)){$e("An element must have a core reference and parameters set");return}var n=t.group;if(n==null&&(t.data&&t.data.source!=null&&t.data.target!=null?n="edges":n="nodes"),n!=="nodes"&&n!=="edges"){$e("An element must be of type `nodes` or `edges`; you specified `"+n+"`");return}this.length=1,this[0]=this;var i=this._private={cy:e,single:!0,data:t.data||{},position:t.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:n,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!t.selected,selectable:t.selectable===void 0?!0:!!t.selectable,locked:!!t.locked,grabbed:!1,grabbable:t.grabbable===void 0?!0:!!t.grabbable,pannable:t.pannable===void 0?n==="edges":!!t.pannable,active:!1,classes:new ra,animation:{current:[],queue:[]},rscratch:{},scratch:t.scratch||{},edges:[],children:[],parent:t.parent&&t.parent.isNode()?t.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(i.position.x==null&&(i.position.x=0),i.position.y==null&&(i.position.y=0),t.renderedPosition){var s=t.renderedPosition,o=e.pan(),l=e.zoom();i.position={x:(s.x-o.x)/l,y:(s.y-o.y)/l}}var u=[];_e(t.classes)?u=t.classes:ge(t.classes)&&(u=t.classes.split(/\s+/));for(var v=0,f=u.length;vm?1:0},v=function(p,m,b,w,E){var C;if(b==null&&(b=0),E==null&&(E=a),b<0)throw new Error("lo must be non-negative");for(w==null&&(w=p.length);bD;0<=D?k++:k--)T.push(k);return T}.apply(this).reverse(),x=[],w=0,E=C.length;wB;0<=B?++T:--T)P.push(s(p,b));return P},y=function(p,m,b,w){var E,C,x;for(w==null&&(w=a),E=p[b];b>m;){if(x=b-1>>1,C=p[x],w(E,C)<0){p[b]=C,b=x;continue}break}return p[b]=E},g=function(p,m,b){var w,E,C,x,T;for(b==null&&(b=a),E=p.length,T=m,C=p[m],w=2*m+1;w0;){var C=m.pop(),x=g(C),T=C.id();if(c[T]=x,x!==1/0)for(var k=C.neighborhood().intersect(d),D=0;D0)for(O.unshift(M);f[G];){var N=f[G];O.unshift(N.edge),O.unshift(N.node),V=N.node,G=V.id()}return o.spawn(O)}}}},od={kruskal:function(e){e=e||function(b){return 1};for(var t=this.byGroup(),a=t.nodes,n=t.edges,i=a.length,s=new Array(i),o=a,l=function(w){for(var E=0;E0;){if(E(),x++,w===v){for(var T=[],k=i,D=v,B=p[D];T.unshift(k),B!=null&&T.unshift(B),k=g[D],k!=null;)D=k.id(),B=p[D];return{found:!0,distance:f[w],path:this.spawn(T),steps:x}}h[w]=!0;for(var P=b._private.edges,A=0;AB&&(d[D]=B,m[D]=k,b[D]=E),!i){var P=k*v+T;!i&&d[P]>B&&(d[P]=B,m[P]=T,b[P]=E)}}}for(var A=0;A1&&arguments[1]!==void 0?arguments[1]:s,ie=b(we),de=[],he=ie;;){if(he==null)return t.spawn();var Ee=m(he),pe=Ee.edge,Se=Ee.pred;if(de.unshift(he[0]),he.same(ye)&&de.length>0)break;pe!=null&&de.unshift(pe),he=Se}return l.spawn(de)},C=0;C=0;v--){var f=u[v],c=f[1],h=f[2];(t[c]===o&&t[h]===l||t[c]===l&&t[h]===o)&&u.splice(v,1)}for(var d=0;dn;){var i=Math.floor(Math.random()*t.length);t=gd(i,e,t),a--}return t},pd={kargerStein:function(){var e=this,t=this.byGroup(),a=t.nodes,n=t.edges;n.unmergeBy(function(O){return O.isLoop()});var i=a.length,s=n.length,o=Math.ceil(Math.pow(Math.log(i)/Math.LN2,2)),l=Math.floor(i/hd);if(i<2){$e("At least 2 nodes are required for Karger-Stein algorithm");return}for(var u=[],v=0;v1&&arguments[1]!==void 0?arguments[1]:0,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,n=1/0,i=t;i1&&arguments[1]!==void 0?arguments[1]:0,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,n=-1/0,i=t;i1&&arguments[1]!==void 0?arguments[1]:0,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,n=0,i=0,s=t;s1&&arguments[1]!==void 0?arguments[1]:0,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0;n?e=e.slice(t,a):(a0&&e.splice(0,t));for(var o=0,l=e.length-1;l>=0;l--){var u=e[l];s?isFinite(u)||(e[l]=-1/0,o++):e.splice(l,1)}i&&e.sort(function(c,h){return c-h});var v=e.length,f=Math.floor(v/2);return v%2!==0?e[f+1+o]:(e[f-1+o]+e[f+o])/2},Ed=function(e){return Math.PI*e/180},Ya=function(e,t){return Math.atan2(t,e)-Math.PI/2},ro=Math.log2||function(r){return Math.log(r)/Math.log(2)},to=function(e){return e>0?1:e<0?-1:0},Pt=function(e,t){return Math.sqrt(Ct(e,t))},Ct=function(e,t){var a=t.x-e.x,n=t.y-e.y;return a*a+n*n},Cd=function(e){for(var t=e.length,a=0,n=0;n=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(e.w!=null&&e.h!=null&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},Sd=function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}},kd=function(e){e.x1=1/0,e.y1=1/0,e.x2=-1/0,e.y2=-1/0,e.w=0,e.h=0},Dd=function(e,t){e.x1=Math.min(e.x1,t.x1),e.x2=Math.max(e.x2,t.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,t.y1),e.y2=Math.max(e.y2,t.y2),e.h=e.y2-e.y1},mv=function(e,t,a){e.x1=Math.min(e.x1,t),e.x2=Math.max(e.x2,t),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,a),e.y2=Math.max(e.y2,a),e.h=e.y2-e.y1},un=function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return e.x1-=t,e.x2+=t,e.y1-=t,e.y2+=t,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},ln=function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[0],a,n,i,s;if(t.length===1)a=n=i=s=t[0];else if(t.length===2)a=i=t[0],s=n=t[1];else if(t.length===4){var o=Je(t,4);a=o[0],n=o[1],i=o[2],s=o[3]}return e.x1-=s,e.x2+=n,e.y1-=a,e.y2+=i,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},Uo=function(e,t){e.x1=t.x1,e.y1=t.y1,e.x2=t.x2,e.y2=t.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},ao=function(e,t){return!(e.x1>t.x2||t.x1>e.x2||e.x2t.y2||t.y1>e.y2)},nt=function(e,t,a){return e.x1<=t&&t<=e.x2&&e.y1<=a&&a<=e.y2},Ko=function(e,t){return nt(e,t.x,t.y)},bv=function(e,t){return nt(e,t.x1,t.y1)&&nt(e,t.x2,t.y2)},Bd=(gi=Math.hypot)!==null&&gi!==void 0?gi:function(r,e){return Math.sqrt(r*r+e*e)};function Pd(r,e){if(r.length<3)throw new Error("Need at least 3 vertices");var t=function(T,k){return{x:T.x+k.x,y:T.y+k.y}},a=function(T,k){return{x:T.x-k.x,y:T.y-k.y}},n=function(T,k){return{x:T.x*k,y:T.y*k}},i=function(T,k){return T.x*k.y-T.y*k.x},s=function(T){var k=Bd(T.x,T.y);return k===0?{x:0,y:0}:{x:T.x/k,y:T.y/k}},o=function(T){for(var k=0,D=0;D7&&arguments[7]!==void 0?arguments[7]:"auto",u=l==="auto"?vt(i,s):l,v=i/2,f=s/2;u=Math.min(u,v,f);var c=u!==v,h=u!==f,d;if(c){var y=a-v+u-o,g=n-f-o,p=a+v-u+o,m=g;if(d=it(e,t,a,n,y,g,p,m,!1),d.length>0)return d}if(h){var b=a+v+o,w=n-f+u-o,E=b,C=n+f-u+o;if(d=it(e,t,a,n,b,w,E,C,!1),d.length>0)return d}if(c){var x=a-v+u-o,T=n+f+o,k=a+v-u+o,D=T;if(d=it(e,t,a,n,x,T,k,D,!1),d.length>0)return d}if(h){var B=a-v-o,P=n-f+u-o,A=B,R=n+f-u+o;if(d=it(e,t,a,n,B,P,A,R,!1),d.length>0)return d}var L;{var I=a-v+u,M=n-f+u;if(L=ya(e,t,a,n,I,M,u+o),L.length>0&&L[0]<=I&&L[1]<=M)return[L[0],L[1]]}{var O=a+v-u,V=n-f+u;if(L=ya(e,t,a,n,O,V,u+o),L.length>0&&L[0]>=O&&L[1]<=V)return[L[0],L[1]]}{var G=a+v-u,N=n+f-u;if(L=ya(e,t,a,n,G,N,u+o),L.length>0&&L[0]>=G&&L[1]>=N)return[L[0],L[1]]}{var F=a-v+u,U=n+f-u;if(L=ya(e,t,a,n,F,U,u+o),L.length>0&&L[0]<=F&&L[1]>=U)return[L[0],L[1]]}return[]},Rd=function(e,t,a,n,i,s,o){var l=o,u=Math.min(a,i),v=Math.max(a,i),f=Math.min(n,s),c=Math.max(n,s);return u-l<=e&&e<=v+l&&f-l<=t&&t<=c+l},Md=function(e,t,a,n,i,s,o,l,u){var v={x1:Math.min(a,o,i)-u,x2:Math.max(a,o,i)+u,y1:Math.min(n,l,s)-u,y2:Math.max(n,l,s)+u};return!(ev.x2||tv.y2)},Ld=function(e,t,a,n){a-=n;var i=t*t-4*e*a;if(i<0)return[];var s=Math.sqrt(i),o=2*e,l=(-t+s)/o,u=(-t-s)/o;return[l,u]},Id=function(e,t,a,n,i){var s=1e-5;e===0&&(e=s),t/=e,a/=e,n/=e;var o,l,u,v,f,c,h,d;if(l=(3*a-t*t)/9,u=-(27*n)+t*(9*a-2*(t*t)),u/=54,o=l*l*l+u*u,i[1]=0,h=t/3,o>0){f=u+Math.sqrt(o),f=f<0?-Math.pow(-f,1/3):Math.pow(f,1/3),c=u-Math.sqrt(o),c=c<0?-Math.pow(-c,1/3):Math.pow(c,1/3),i[0]=-h+f+c,h+=(f+c)/2,i[4]=i[2]=-h,h=Math.sqrt(3)*(-c+f)/2,i[3]=h,i[5]=-h;return}if(i[5]=i[3]=0,o===0){d=u<0?-Math.pow(-u,1/3):Math.pow(u,1/3),i[0]=-h+2*d,i[4]=i[2]=-(d+h);return}l=-l,v=l*l*l,v=Math.acos(u/Math.sqrt(v)),d=2*Math.sqrt(l),i[0]=-h+d*Math.cos(v/3),i[2]=-h+d*Math.cos((v+2*Math.PI)/3),i[4]=-h+d*Math.cos((v+4*Math.PI)/3)},Od=function(e,t,a,n,i,s,o,l){var u=1*a*a-4*a*i+2*a*o+4*i*i-4*i*o+o*o+n*n-4*n*s+2*n*l+4*s*s-4*s*l+l*l,v=9*a*i-3*a*a-3*a*o-6*i*i+3*i*o+9*n*s-3*n*n-3*n*l-6*s*s+3*s*l,f=3*a*a-6*a*i+a*o-a*e+2*i*i+2*i*e-o*e+3*n*n-6*n*s+n*l-n*t+2*s*s+2*s*t-l*t,c=1*a*i-a*a+a*e-i*e+n*s-n*n+n*t-s*t,h=[];Id(u,v,f,c,h);for(var d=1e-7,y=[],g=0;g<6;g+=2)Math.abs(h[g+1])=0&&h[g]<=1&&y.push(h[g]);y.push(1),y.push(0);for(var p=-1,m,b,w,E=0;E=0?wu?(e-i)*(e-i)+(t-s)*(t-s):v-c},Sr=function(e,t,a){for(var n,i,s,o,l,u=0,v=0;v=e&&e>=s||n<=e&&e<=s)l=(e-n)/(s-n)*(o-i)+i,l>t&&u++;else continue;return u%2!==0},Zr=function(e,t,a,n,i,s,o,l,u){var v=new Array(a.length),f;l[0]!=null?(f=Math.atan(l[1]/l[0]),l[0]<0?f=f+Math.PI/2:f=-f-Math.PI/2):f=l;for(var c=Math.cos(-f),h=Math.sin(-f),d=0;d0){var g=Cn(v,-u);y=En(g)}else y=v;return Sr(e,t,y)},zd=function(e,t,a,n,i,s,o,l){for(var u=new Array(a.length*2),v=0;v=0&&g<=1&&m.push(g),p>=0&&p<=1&&m.push(p),m.length===0)return[];var b=m[0]*l[0]+e,w=m[0]*l[1]+t;if(m.length>1){if(m[0]==m[1])return[b,w];var E=m[1]*l[0]+e,C=m[1]*l[1]+t;return[b,w,E,C]}else return[b,w]},pi=function(e,t,a){return t<=e&&e<=a||a<=e&&e<=t?e:e<=t&&t<=a||a<=t&&t<=e?t:a},it=function(e,t,a,n,i,s,o,l,u){var v=e-i,f=a-e,c=o-i,h=t-s,d=n-t,y=l-s,g=c*h-y*v,p=f*h-d*v,m=y*f-c*d;if(m!==0){var b=g/m,w=p/m,E=.001,C=0-E,x=1+E;return C<=b&&b<=x&&C<=w&&w<=x?[e+b*f,t+b*d]:u?[e+b*f,t+b*d]:[]}else return g===0||p===0?pi(e,a,o)===o?[o,l]:pi(e,a,i)===i?[i,s]:pi(i,o,a)===a?[a,n]:[]:[]},Vd=function(e,t,a,n,i){var s=[],o=n/2,l=i/2,u=t,v=a;s.push({x:u+o*e[0],y:v+l*e[1]});for(var f=1;f0){var y=Cn(f,-l);h=En(y)}else h=f}else h=a;for(var g,p,m,b,w=0;w2){for(var d=[v[0],v[1]],y=Math.pow(d[0]-e,2)+Math.pow(d[1]-t,2),g=1;gv&&(v=w)},get:function(b){return u[b]}},c=0;c0?L=R.edgesTo(A)[0]:L=A.edgesTo(R)[0];var I=n(L);A=A.id(),x[A]>x[B]+I&&(x[A]=x[B]+I,T.nodes.indexOf(A)<0?T.push(A):T.updateItem(A),C[A]=0,E[A]=[]),x[A]==x[B]+I&&(C[A]=C[A]+C[B],E[A].push(B))}else for(var M=0;M0;){for(var N=w.pop(),F=0;F0&&o.push(a[l]);o.length!==0&&i.push(n.collection(o))}return i},eh=function(e,t){for(var a=0;a5&&arguments[5]!==void 0?arguments[5]:ah,o=n,l,u,v=0;v=2?va(e,t,a,0,Jo,nh):va(e,t,a,0,Qo)},squaredEuclidean:function(e,t,a){return va(e,t,a,0,Jo)},manhattan:function(e,t,a){return va(e,t,a,0,Qo)},max:function(e,t,a){return va(e,t,a,-1/0,ih)}};Jt["squared-euclidean"]=Jt.squaredEuclidean;Jt.squaredeuclidean=Jt.squaredEuclidean;function Nn(r,e,t,a,n,i){var s;return Ue(r)?s=r:s=Jt[r]||Jt.euclidean,e===0&&Ue(r)?s(n,i):s(e,t,a,n,i)}var sh=cr({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),io=function(e){return sh(e)},Tn=function(e,t,a,n,i){var s=i!=="kMedoids",o=s?function(f){return a[f]}:function(f){return n[f](a)},l=function(c){return n[c](t)},u=a,v=t;return Nn(e,n.length,o,l,u,v)},mi=function(e,t,a){for(var n=a.length,i=new Array(n),s=new Array(n),o=new Array(t),l=null,u=0;ua)return!1}return!0},lh=function(e,t,a){for(var n=0;no&&(o=t[u][v],l=v);i[l].push(e[u])}for(var f=0;f=i.threshold||i.mode==="dendrogram"&&e.length===1)return!1;var d=t[s],y=t[n[s]],g;i.mode==="dendrogram"?g={left:d,right:y,key:d.key}:g={value:d.value.concat(y.value),key:d.key},e[d.index]=g,e.splice(y.index,1),t[d.key]=g;for(var p=0;pa[y.key][m.key]&&(l=a[y.key][m.key])):i.linkage==="max"?(l=a[d.key][m.key],a[d.key][m.key]0&&n.push(i);return n},nu=function(e,t,a){for(var n=[],i=0;io&&(s=u,o=t[i*e+u])}s>0&&n.push(s)}for(var v=0;vu&&(l=v,u=f)}a[i]=s[l]}return n=nu(e,t,a),n},iu=function(e){for(var t=this.cy(),a=this.nodes(),n=xh(e),i={},s=0;s=B?(P=B,B=R,A=L):R>P&&(P=R);for(var I=0;I0?1:0;x[k%n.minIterations*o+F]=U,N+=U}if(N>0&&(k>=n.minIterations-1||k==n.maxIterations-1)){for(var Q=0,K=0;K1||C>1)&&(o=!0),f[b]=[],m.outgoers().forEach(function(T){T.isEdge()&&f[b].push(T.id())})}else c[b]=[void 0,m.target().id()]}):s.forEach(function(m){var b=m.id();if(m.isNode()){var w=m.degree(!0);w%2&&(l?u?o=!0:u=b:l=b),f[b]=[],m.connectedEdges().forEach(function(E){return f[b].push(E.id())})}else c[b]=[m.source().id(),m.target().id()]});var h={found:!1,trail:void 0};if(o)return h;if(u&&l)if(i){if(v&&u!=v)return h;v=u}else{if(v&&u!=v&&l!=v)return h;v||(v=u)}else v||(v=s[0].id());var d=function(b){for(var w=b,E=[b],C,x,T;f[w].length;)C=f[w].shift(),x=c[C][0],T=c[C][1],w!=T?(f[T]=f[T].filter(function(k){return k!=C}),w=T):!i&&w!=x&&(f[x]=f[x].filter(function(k){return k!=C}),w=x),E.unshift(C),E.unshift(w);return E},y=[],g=[];for(g=d(v);g.length!=1;)f[g[0]].length==0?(y.unshift(s.getElementById(g.shift())),y.unshift(s.getElementById(g.shift()))):g=d(g.shift()).concat(g);y.unshift(s.getElementById(g.shift()));for(var p in f)if(f[p].length)return h;return h.found=!0,h.trail=this.spawn(y,!0),h}},Qa=function(){var e=this,t={},a=0,n=0,i=[],s=[],o={},l=function(c,h){for(var d=s.length-1,y=[],g=e.spawn();s[d].x!=c||s[d].y!=h;)y.push(s.pop().edge),d--;y.push(s.pop().edge),y.forEach(function(p){var m=p.connectedNodes().intersection(e);g.merge(p),m.forEach(function(b){var w=b.id(),E=b.connectedEdges().intersection(e);g.merge(b),t[w].cutVertex?g.merge(E.filter(function(C){return C.isLoop()})):g.merge(E)})}),i.push(g)},u=function(c,h,d){c===d&&(n+=1),t[h]={id:a,low:a++,cutVertex:!1};var y=e.getElementById(h).connectedEdges().intersection(e);if(y.size()===0)i.push(e.spawn(e.getElementById(h)));else{var g,p,m,b;y.forEach(function(w){g=w.source().id(),p=w.target().id(),m=g===h?p:g,m!==d&&(b=w.id(),o[b]||(o[b]=!0,s.push({x:h,y:m,edge:w})),m in t?t[h].low=Math.min(t[h].low,t[m].id):(u(c,m,h),t[h].low=Math.min(t[h].low,t[m].low),t[h].id<=t[m].low&&(t[h].cutVertex=!0,l(h,m))))})}};e.forEach(function(f){if(f.isNode()){var c=f.id();c in t||(n=0,u(c,c),t[c].cutVertex=n>1)}});var v=Object.keys(t).filter(function(f){return t[f].cutVertex}).map(function(f){return e.getElementById(f)});return{cut:e.spawn(v),components:i}},Ph={hopcroftTarjanBiconnected:Qa,htbc:Qa,htb:Qa,hopcroftTarjanBiconnectedComponents:Qa},Ja=function(){var e=this,t={},a=0,n=[],i=[],s=e.spawn(e),o=function(u){i.push(u),t[u]={index:a,low:a++,explored:!1};var v=e.getElementById(u).connectedEdges().intersection(e);if(v.forEach(function(y){var g=y.target().id();g!==u&&(g in t||o(g),t[g].explored||(t[u].low=Math.min(t[u].low,t[g].low)))}),t[u].index===t[u].low){for(var f=e.spawn();;){var c=i.pop();if(f.merge(e.getElementById(c)),t[c].low=t[u].index,t[c].explored=!0,c===u)break}var h=f.edgesWith(f),d=f.merge(h);n.push(d),s=s.difference(d)}};return e.forEach(function(l){if(l.isNode()){var u=l.id();u in t||o(u)}}),{cut:s,components:n}},Ah={tarjanStronglyConnected:Ja,tsc:Ja,tscc:Ja,tarjanStronglyConnectedComponents:Ja},Dv={};[Sa,sd,od,ld,fd,dd,pd,Hd,Xt,Yt,Rs,th,gh,bh,kh,Bh,Ph,Ah].forEach(function(r){be(Dv,r)});var Bv=0,Pv=1,Av=2,Nr=function(e){if(!(this instanceof Nr))return new Nr(e);this.id="Thenable/1.0.7",this.state=Bv,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},typeof e=="function"&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))};Nr.prototype={fulfill:function(e){return su(this,Pv,"fulfillValue",e)},reject:function(e){return su(this,Av,"rejectReason",e)},then:function(e,t){var a=this,n=new Nr;return a.onFulfilled.push(uu(e,n,"fulfill")),a.onRejected.push(uu(t,n,"reject")),Rv(a),n.proxy}};var su=function(e,t,a,n){return e.state===Bv&&(e.state=t,e[a]=n,Rv(e)),e},Rv=function(e){e.state===Pv?ou(e,"onFulfilled",e.fulfillValue):e.state===Av&&ou(e,"onRejected",e.rejectReason)},ou=function(e,t,a){if(e[t].length!==0){var n=e[t];e[t]=[];var i=function(){for(var o=0;o0}},clearQueue:function(){return function(){var t=this,a=t.length!==void 0,n=a?t:[t],i=this._private.cy||this;if(!i.styleEnabled())return this;for(var s=0;s-1}return qi=e,qi}var _i,Ru;function Yh(){if(Ru)return _i;Ru=1;var r=Vn();function e(t,a){var n=this.__data__,i=r(n,t);return i<0?(++this.size,n.push([t,a])):n[i][1]=a,this}return _i=e,_i}var Gi,Mu;function Zh(){if(Mu)return Gi;Mu=1;var r=$h(),e=Uh(),t=Kh(),a=Xh(),n=Yh();function i(s){var o=-1,l=s==null?0:s.length;for(this.clear();++o-1&&a%1==0&&a0&&this.spawn(n).updateStyle().emit("class"),t},addClass:function(e){return this.toggleClass(e,!0)},hasClass:function(e){var t=this[0];return t!=null&&t._private.classes.has(e)},toggleClass:function(e,t){_e(e)||(e=e.match(/\S+/g)||[]);for(var a=this,n=t===void 0,i=[],s=0,o=a.length;s0&&this.spawn(i).updateStyle().emit("class"),a},removeClass:function(e){return this.toggleClass(e,!1)},flashClass:function(e,t){var a=this;if(t==null)t=250;else if(t===0)return a;return a.addClass(e),setTimeout(function(){a.removeClass(e)},t),a}};vn.className=vn.classNames=vn.classes;var Me={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:`"(?:\\\\"|[^"])*"|'(?:\\\\'|[^'])*'`,number:tr,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};Me.variable="(?:[\\w-.]|(?:\\\\"+Me.metaChar+"))+";Me.className="(?:[\\w-]|(?:\\\\"+Me.metaChar+"))+";Me.value=Me.string+"|"+Me.number;Me.id=Me.variable;(function(){var r,e,t;for(r=Me.comparatorOp.split("|"),t=0;t=0)&&e!=="="&&(Me.comparatorOp+="|\\!"+e)})();var qe=function(){return{checks:[]}},se={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},Os=[{selector:":selected",matches:function(e){return e.selected()}},{selector:":unselected",matches:function(e){return!e.selected()}},{selector:":selectable",matches:function(e){return e.selectable()}},{selector:":unselectable",matches:function(e){return!e.selectable()}},{selector:":locked",matches:function(e){return e.locked()}},{selector:":unlocked",matches:function(e){return!e.locked()}},{selector:":visible",matches:function(e){return e.visible()}},{selector:":hidden",matches:function(e){return!e.visible()}},{selector:":transparent",matches:function(e){return e.transparent()}},{selector:":grabbed",matches:function(e){return e.grabbed()}},{selector:":free",matches:function(e){return!e.grabbed()}},{selector:":removed",matches:function(e){return e.removed()}},{selector:":inside",matches:function(e){return!e.removed()}},{selector:":grabbable",matches:function(e){return e.grabbable()}},{selector:":ungrabbable",matches:function(e){return!e.grabbable()}},{selector:":animated",matches:function(e){return e.animated()}},{selector:":unanimated",matches:function(e){return!e.animated()}},{selector:":parent",matches:function(e){return e.isParent()}},{selector:":childless",matches:function(e){return e.isChildless()}},{selector:":child",matches:function(e){return e.isChild()}},{selector:":orphan",matches:function(e){return e.isOrphan()}},{selector:":nonorphan",matches:function(e){return e.isChild()}},{selector:":compound",matches:function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()}},{selector:":loop",matches:function(e){return e.isLoop()}},{selector:":simple",matches:function(e){return e.isSimple()}},{selector:":active",matches:function(e){return e.active()}},{selector:":inactive",matches:function(e){return!e.active()}},{selector:":backgrounding",matches:function(e){return e.backgrounding()}},{selector:":nonbackgrounding",matches:function(e){return!e.backgrounding()}}].sort(function(r,e){return Tc(r.selector,e.selector)}),Dg=(function(){for(var r={},e,t=0;t0&&v.edgeCount>0)return Ve("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(v.edgeCount>1)return Ve("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;v.edgeCount===1&&Ve("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},Lg=function(){if(this.toStringCache!=null)return this.toStringCache;for(var e=function(v){return v??""},t=function(v){return ge(v)?'"'+v+'"':e(v)},a=function(v){return" "+v+" "},n=function(v,f){var c=v.type,h=v.value;switch(c){case se.GROUP:{var d=e(h);return d.substring(0,d.length-1)}case se.DATA_COMPARE:{var y=v.field,g=v.operator;return"["+y+a(e(g))+t(h)+"]"}case se.DATA_BOOL:{var p=v.operator,m=v.field;return"["+e(p)+m+"]"}case se.DATA_EXIST:{var b=v.field;return"["+b+"]"}case se.META_COMPARE:{var w=v.operator,E=v.field;return"[["+E+a(e(w))+t(h)+"]]"}case se.STATE:return h;case se.ID:return"#"+h;case se.CLASS:return"."+h;case se.PARENT:case se.CHILD:return i(v.parent,f)+a(">")+i(v.child,f);case se.ANCESTOR:case se.DESCENDANT:return i(v.ancestor,f)+" "+i(v.descendant,f);case se.COMPOUND_SPLIT:{var C=i(v.left,f),x=i(v.subject,f),T=i(v.right,f);return C+(C.length>0?" ":"")+x+T}case se.TRUE:return""}},i=function(v,f){return v.checks.reduce(function(c,h,d){return c+(f===v&&d===0?"$":"")+n(h,f)},"")},s="",o=0;o1&&o=0&&(t=t.replace("!",""),f=!0),t.indexOf("@")>=0&&(t=t.replace("@",""),v=!0),(i||o||v)&&(l=!i&&!s?"":""+e,u=""+a),v&&(e=l=l.toLowerCase(),a=u=u.toLowerCase()),t){case"*=":n=l.indexOf(u)>=0;break;case"$=":n=l.indexOf(u,l.length-u.length)>=0;break;case"^=":n=l.indexOf(u)===0;break;case"=":n=e===a;break;case">":c=!0,n=e>a;break;case">=":c=!0,n=e>=a;break;case"<":c=!0,n=e0;){var v=n.shift();e(v),i.add(v.id()),o&&a(n,i,v)}return r}function Vv(r,e,t){if(t.isParent())for(var a=t._private.children,n=0;n1&&arguments[1]!==void 0?arguments[1]:!0;return lo(this,r,e,Vv)};function qv(r,e,t){if(t.isChild()){var a=t._private.parent;e.has(a.id())||r.push(a)}}jt.forEachUp=function(r){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return lo(this,r,e,qv)};function _g(r,e,t){qv(r,e,t),Vv(r,e,t)}jt.forEachUpAndDown=function(r){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return lo(this,r,e,_g)};jt.ancestors=jt.parents;var Ba,_v;Ba=_v={data:Fe.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:Fe.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:Fe.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:Fe.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:Fe.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:Fe.removeData({field:"rscratch",triggerEvent:!1}),id:function(){var e=this[0];if(e)return e._private.data.id}};Ba.attr=Ba.data;Ba.removeAttr=Ba.removeData;var Gg=_v,_n={};function ps(r){return function(e){var t=this;if(e===void 0&&(e=!0),t.length!==0)if(t.isNode()&&!t.removed()){for(var a=0,n=t[0],i=n._private.edges,s=0;se}),minIndegree:zt("indegree",function(r,e){return re}),minOutdegree:zt("outdegree",function(r,e){return re})});be(_n,{totalDegree:function(e){for(var t=0,a=this.nodes(),n=0;n0,c=f;f&&(v=v[0]);var h=c?v.position():{x:0,y:0};t!==void 0?u.position(e,t+h[e]):i!==void 0&&u.position({x:i.x+h.x,y:i.y+h.y})}else{var d=a.position(),y=o?a.parent():null,g=y&&y.length>0,p=g;g&&(y=y[0]);var m=p?y.position():{x:0,y:0};return i={x:d.x-m.x,y:d.y-m.y},e===void 0?i:i[e]}else if(!s)return;return this}};Or.modelPosition=Or.point=Or.position;Or.modelPositions=Or.points=Or.positions;Or.renderedPoint=Or.renderedPosition;Or.relativePoint=Or.relativePosition;var Hg=Gv,Zt,pt;Zt=pt={};pt.renderedBoundingBox=function(r){var e=this.boundingBox(r),t=this.cy(),a=t.zoom(),n=t.pan(),i=e.x1*a+n.x,s=e.x2*a+n.x,o=e.y1*a+n.y,l=e.y2*a+n.y;return{x1:i,x2:s,y1:o,y2:l,w:s-i,h:l-o}};pt.dirtyCompoundBoundsCache=function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();return!e.styleEnabled()||!e.hasCompoundNodes()?this:(this.forEachUp(function(t){if(t.isParent()){var a=t._private;a.compoundBoundsClean=!1,a.bbCache=null,r||t.emitAndNotify("bounds")}}),this)};pt.updateCompoundBounds=function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();if(!e.styleEnabled()||!e.hasCompoundNodes())return this;if(!r&&e.batching())return this;function t(s){if(!s.isParent())return;var o=s._private,l=s.children(),u=s.pstyle("compound-sizing-wrt-labels").value==="include",v={width:{val:s.pstyle("min-width").pfValue,left:s.pstyle("min-width-bias-left"),right:s.pstyle("min-width-bias-right")},height:{val:s.pstyle("min-height").pfValue,top:s.pstyle("min-height-bias-top"),bottom:s.pstyle("min-height-bias-bottom")}},f=l.boundingBox({includeLabels:u,includeOverlays:!1,useCache:!1}),c=o.position;(f.w===0||f.h===0)&&(f={w:s.pstyle("width").pfValue,h:s.pstyle("height").pfValue},f.x1=c.x-f.w/2,f.x2=c.x+f.w/2,f.y1=c.y-f.h/2,f.y2=c.y+f.h/2);function h(k,D,B){var P=0,A=0,R=D+B;return k>0&&R>0&&(P=D/R*k,A=B/R*k),{biasDiff:P,biasComplementDiff:A}}function d(k,D,B,P){if(B.units==="%")switch(P){case"width":return k>0?B.pfValue*k:0;case"height":return D>0?B.pfValue*D:0;case"average":return k>0&&D>0?B.pfValue*(k+D)/2:0;case"min":return k>0&&D>0?k>D?B.pfValue*D:B.pfValue*k:0;case"max":return k>0&&D>0?k>D?B.pfValue*k:B.pfValue*D:0;default:return 0}else return B.units==="px"?B.pfValue:0}var y=v.width.left.value;v.width.left.units==="px"&&v.width.val>0&&(y=y*100/v.width.val);var g=v.width.right.value;v.width.right.units==="px"&&v.width.val>0&&(g=g*100/v.width.val);var p=v.height.top.value;v.height.top.units==="px"&&v.height.val>0&&(p=p*100/v.height.val);var m=v.height.bottom.value;v.height.bottom.units==="px"&&v.height.val>0&&(m=m*100/v.height.val);var b=h(v.width.val-f.w,y,g),w=b.biasDiff,E=b.biasComplementDiff,C=h(v.height.val-f.h,p,m),x=C.biasDiff,T=C.biasComplementDiff;o.autoPadding=d(f.w,f.h,s.pstyle("padding"),s.pstyle("padding-relative-to").value),o.autoWidth=Math.max(f.w,v.width.val),c.x=(-w+f.x1+f.x2+E)/2,o.autoHeight=Math.max(f.h,v.height.val),c.y=(-x+f.y1+f.y2+T)/2}for(var a=0;ae.x2?n:e.x2,e.y1=ae.y2?i:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},tt=function(e,t){return t==null?e:Ir(e,t.x1,t.y1,t.x2,t.y2)},fa=function(e,t,a){return Tr(e,t,a)},ja=function(e,t,a){if(!t.cy().headless()){var n=t._private,i=n.rstyle,s=i.arrowWidth/2,o=t.pstyle(a+"-arrow-shape").value,l,u;if(o!=="none"){a==="source"?(l=i.srcX,u=i.srcY):a==="target"?(l=i.tgtX,u=i.tgtY):(l=i.midX,u=i.midY);var v=n.arrowBounds=n.arrowBounds||{},f=v[a]=v[a]||{};f.x1=l-s,f.y1=u-s,f.x2=l+s,f.y2=u+s,f.w=f.x2-f.x1,f.h=f.y2-f.y1,un(f,1),Ir(e,f.x1,f.y1,f.x2,f.y2)}}},ys=function(e,t,a){if(!t.cy().headless()){var n;a?n=a+"-":n="";var i=t._private,s=i.rstyle,o=t.pstyle(n+"label").strValue;if(o){var l=t.pstyle("text-halign"),u=t.pstyle("text-valign"),v=fa(s,"labelWidth",a),f=fa(s,"labelHeight",a),c=fa(s,"labelX",a),h=fa(s,"labelY",a),d=t.pstyle(n+"text-margin-x").pfValue,y=t.pstyle(n+"text-margin-y").pfValue,g=t.isEdge(),p=t.pstyle(n+"text-rotation"),m=t.pstyle("text-outline-width").pfValue,b=t.pstyle("text-border-width").pfValue,w=b/2,E=t.pstyle("text-background-padding").pfValue,C=2,x=f,T=v,k=T/2,D=x/2,B,P,A,R;if(g)B=c-k,P=c+k,A=h-D,R=h+D;else{switch(l.value){case"left":B=c-T,P=c;break;case"center":B=c-k,P=c+k;break;case"right":B=c,P=c+T;break}switch(u.value){case"top":A=h-x,R=h;break;case"center":A=h-D,R=h+D;break;case"bottom":A=h,R=h+x;break}}var L=d-Math.max(m,w)-E-C,I=d+Math.max(m,w)+E+C,M=y-Math.max(m,w)-E-C,O=y+Math.max(m,w)+E+C;B+=L,P+=I,A+=M,R+=O;var V=a||"main",G=i.labelBounds,N=G[V]=G[V]||{};N.x1=B,N.y1=A,N.x2=P,N.y2=R,N.w=P-B,N.h=R-A,N.leftPad=L,N.rightPad=I,N.topPad=M,N.botPad=O;var F=g&&p.strValue==="autorotate",U=p.pfValue!=null&&p.pfValue!==0;if(F||U){var Q=F?fa(i.rstyle,"labelAngle",a):p.pfValue,K=Math.cos(Q),j=Math.sin(Q),re=(B+P)/2,ne=(A+R)/2;if(!g){switch(l.value){case"left":re=P;break;case"right":re=B;break}switch(u.value){case"top":ne=R;break;case"bottom":ne=A;break}}var J=function(Ce,we){return Ce=Ce-re,we=we-ne,{x:Ce*K-we*j+re,y:Ce*j+we*K+ne}},z=J(B,A),q=J(B,R),H=J(P,A),Y=J(P,R);B=Math.min(z.x,q.x,H.x,Y.x),P=Math.max(z.x,q.x,H.x,Y.x),A=Math.min(z.y,q.y,H.y,Y.y),R=Math.max(z.y,q.y,H.y,Y.y)}var te=V+"Rot",ce=G[te]=G[te]||{};ce.x1=B,ce.y1=A,ce.x2=P,ce.y2=R,ce.w=P-B,ce.h=R-A,Ir(e,B,A,P,R),Ir(i.labelBounds.all,B,A,P,R)}return e}},ol=function(e,t){if(!t.cy().headless()){var a=t.pstyle("outline-opacity").value,n=t.pstyle("outline-width").value,i=t.pstyle("outline-offset").value,s=n+i;Wv(e,t,a,s,"outside",s/2)}},Wv=function(e,t,a,n,i,s){if(!(a===0||n<=0||i==="inside")){var o=t.cy(),l=t.pstyle("shape").value,u=o.renderer().nodeShapes[l],v=t.position(),f=v.x,c=v.y,h=t.width(),d=t.height();if(u.hasMiterBounds){i==="center"&&(n/=2);var y=u.miterBounds(f,c,h,d,n);tt(e,y)}else s!=null&&s>0&&ln(e,[s,s,s,s])}},Wg=function(e,t){if(!t.cy().headless()){var a=t.pstyle("border-opacity").value,n=t.pstyle("border-width").pfValue,i=t.pstyle("border-position").value;Wv(e,t,a,n,i)}},$g=function(e,t){var a=e._private.cy,n=a.styleEnabled(),i=a.headless(),s=wr(),o=e._private,l=e.isNode(),u=e.isEdge(),v,f,c,h,d,y,g=o.rstyle,p=l&&n?e.pstyle("bounds-expansion").pfValue:[0],m=function(Ae){return Ae.pstyle("display").value!=="none"},b=!n||m(e)&&(!u||m(e.source())&&m(e.target()));if(b){var w=0,E=0;n&&t.includeOverlays&&(w=e.pstyle("overlay-opacity").value,w!==0&&(E=e.pstyle("overlay-padding").value));var C=0,x=0;n&&t.includeUnderlays&&(C=e.pstyle("underlay-opacity").value,C!==0&&(x=e.pstyle("underlay-padding").value));var T=Math.max(E,x),k=0,D=0;if(n&&(k=e.pstyle("width").pfValue,D=k/2),l&&t.includeNodes){var B=e.position();d=B.x,y=B.y;var P=e.outerWidth(),A=P/2,R=e.outerHeight(),L=R/2;v=d-A,f=d+A,c=y-L,h=y+L,Ir(s,v,c,f,h),n&&ol(s,e),n&&t.includeOutlines&&!i&&ol(s,e),n&&Wg(s,e)}else if(u&&t.includeEdges)if(n&&!i){var I=e.pstyle("curve-style").strValue;if(v=Math.min(g.srcX,g.midX,g.tgtX),f=Math.max(g.srcX,g.midX,g.tgtX),c=Math.min(g.srcY,g.midY,g.tgtY),h=Math.max(g.srcY,g.midY,g.tgtY),v-=D,f+=D,c-=D,h+=D,Ir(s,v,c,f,h),I==="haystack"){var M=g.haystackPts;if(M&&M.length===2){if(v=M[0].x,c=M[0].y,f=M[1].x,h=M[1].y,v>f){var O=v;v=f,f=O}if(c>h){var V=c;c=h,h=V}Ir(s,v-D,c-D,f+D,h+D)}}else if(I==="bezier"||I==="unbundled-bezier"||at(I,"segments")||at(I,"taxi")){var G;switch(I){case"bezier":case"unbundled-bezier":G=g.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":G=g.linePts;break}if(G!=null)for(var N=0;Nf){var re=v;v=f,f=re}if(c>h){var ne=c;c=h,h=ne}v-=D,f+=D,c-=D,h+=D,Ir(s,v,c,f,h)}if(n&&t.includeEdges&&u&&(ja(s,e,"mid-source"),ja(s,e,"mid-target"),ja(s,e,"source"),ja(s,e,"target")),n){var J=e.pstyle("ghost").value==="yes";if(J){var z=e.pstyle("ghost-offset-x").pfValue,q=e.pstyle("ghost-offset-y").pfValue;Ir(s,s.x1+z,s.y1+q,s.x2+z,s.y2+q)}}var H=o.bodyBounds=o.bodyBounds||{};Uo(H,s),ln(H,p),un(H,1),n&&(v=s.x1,f=s.x2,c=s.y1,h=s.y2,Ir(s,v-T,c-T,f+T,h+T));var Y=o.overlayBounds=o.overlayBounds||{};Uo(Y,s),ln(Y,p),un(Y,1);var te=o.labelBounds=o.labelBounds||{};te.all!=null?kd(te.all):te.all=wr(),n&&t.includeLabels&&(t.includeMainLabels&&ys(s,e,null),u&&(t.includeSourceLabels&&ys(s,e,"source"),t.includeTargetLabels&&ys(s,e,"target")))}return s.x1=Ar(s.x1),s.y1=Ar(s.y1),s.x2=Ar(s.x2),s.y2=Ar(s.y2),s.w=Ar(s.x2-s.x1),s.h=Ar(s.y2-s.y1),s.w>0&&s.h>0&&b&&(ln(s,p),un(s,1)),s},$v=function(e){var t=0,a=function(s){return(s?1:0)<0&&arguments[0]!==void 0?arguments[0]:sp,e=arguments.length>1?arguments[1]:void 0,t=0;t=0;o--)s(o);return this};dt.removeAllListeners=function(){return this.removeListener("*")};dt.emit=dt.trigger=function(r,e,t){var a=this.listeners,n=a.length;return this.emitting++,_e(e)||(e=[e]),op(this,function(i,s){t!=null&&(a=[{event:s.event,type:s.type,namespace:s.namespace,callback:t}],n=a.length);for(var o=function(){var v=a[l];if(v.type===s.type&&(!v.namespace||v.namespace===s.namespace||v.namespace===ip)&&i.eventMatches(i.context,v,s)){var f=[s];e!=null&&Qc(f,e),i.beforeEmit(i.context,v,s),v.conf&&v.conf.one&&(i.listeners=i.listeners.filter(function(d){return d!==v}));var c=i.callbackContext(i.context,v,s),h=v.callback.apply(c,f);i.afterEmit(i.context,v,s),h===!1&&(s.stopPropagation(),s.preventDefault())}},l=0;l1&&!s){var o=this.length-1,l=this[o],u=l._private.data.id;this[o]=void 0,this[e]=l,i.set(u,{ele:l,index:e})}return this.length--,this},unmergeOne:function(e){e=e[0];var t=this._private,a=e._private.data.id,n=t.map,i=n.get(a);if(!i)return this;var s=i.index;return this.unmergeAt(s),this},unmerge:function(e){var t=this._private.cy;if(!e)return this;if(e&&ge(e)){var a=e;e=t.mutableElements().filter(a)}for(var n=0;n=0;t--){var a=this[t];e(a)&&this.unmergeAt(t)}return this},map:function(e,t){for(var a=[],n=this,i=0;ia&&(a=l,n=o)}return{value:a,ele:n}},min:function(e,t){for(var a=1/0,n,i=this,s=0;s=0&&i"u"?"undefined":ar(Symbol))!=e&&ar(Symbol.iterator)!=e;t&&(Sn[Symbol.iterator]=function(){var a=this,n={value:void 0,done:!1},i=0,s=this.length;return Jl({next:function(){return i1&&arguments[1]!==void 0?arguments[1]:!0,a=this[0],n=a.cy();if(n.styleEnabled()&&a){a._private.styleDirty&&(a._private.styleDirty=!1,n.style().apply(a));var i=a._private.style[e];return i??(t?n.style().getDefaultProperty(e):null)}},numericStyle:function(e){var t=this[0];if(t.cy().styleEnabled()&&t){var a=t.pstyle(e);return a.pfValue!==void 0?a.pfValue:a.value}},numericStyleUnits:function(e){var t=this[0];if(t.cy().styleEnabled()&&t)return t.pstyle(e).units},renderedStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var a=this[0];if(a)return t.style().getRenderedStyle(a,e)},style:function(e,t){var a=this.cy();if(!a.styleEnabled())return this;var n=!1,i=a.style();if(Le(e)){var s=e;i.applyBypass(this,s,n),this.emitAndNotify("style")}else if(ge(e))if(t===void 0){var o=this[0];return o?i.getStylePropertyValue(o,e):void 0}else i.applyBypass(this,e,t,n),this.emitAndNotify("style");else if(e===void 0){var l=this[0];return l?i.getRawStyle(l):void 0}return this},removeStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var a=!1,n=t.style(),i=this;if(e===void 0)for(var s=0;s0&&e.push(v[0]),e.push(o[0])}return this.spawn(e,!0).filter(r)},"neighborhood"),closedNeighborhood:function(e){return this.neighborhood().add(this).filter(e)},openNeighborhood:function(e){return this.neighborhood(e)}});gr.neighbourhood=gr.neighborhood;gr.closedNeighbourhood=gr.closedNeighborhood;gr.openNeighbourhood=gr.openNeighborhood;be(gr,{source:Rr(function(e){var t=this[0],a;return t&&(a=t._private.source||t.cy().collection()),a&&e?a.filter(e):a},"source"),target:Rr(function(e){var t=this[0],a;return t&&(a=t._private.target||t.cy().collection()),a&&e?a.filter(e):a},"target"),sources:ml({attr:"source"}),targets:ml({attr:"target"})});function ml(r){return function(t){for(var a=[],n=0;n0);return s},component:function(){var e=this[0];return e.cy().mutableElements().components(e)[0]}});gr.componentsOf=gr.components;var fr=function(e,t){var a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(e===void 0){$e("A collection must have a reference to the core");return}var i=new Xr,s=!1;if(!t)t=[];else if(t.length>0&&Le(t[0])&&!Ia(t[0])){s=!0;for(var o=[],l=new ra,u=0,v=t.length;u0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,t=this,a=t.cy(),n=a._private,i=[],s=[],o,l=0,u=t.length;l0){for(var V=o.length===t.length?t:new fr(a,o),G=0;G0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,t=this,a=[],n={},i=t._private.cy;function s(R){for(var L=R._private.edges,I=0;I0&&(r?B.emitAndNotify("remove"):e&&B.emit("remove"));for(var P=0;P0?P=R:B=R;while(Math.abs(A)>s&&++L=i?m(D,L):I===0?L:w(D,B,B+u)}var C=!1;function x(){C=!0,(r!==e||t!==a)&&b()}var T=function(B){return C||x(),r===e&&t===a?B:B===0?0:B===1?1:g(E(B),e,a)};T.getControlPoints=function(){return[{x:r,y:e},{x:t,y:a}]};var k="generateBezier("+[r,e,t,a]+")";return T.toString=function(){return k},T}var mp=(function(){function r(a){return-a.tension*a.x-a.friction*a.v}function e(a,n,i){var s={x:a.x+i.dx*n,v:a.v+i.dv*n,tension:a.tension,friction:a.friction};return{dx:s.v,dv:r(s)}}function t(a,n){var i={dx:a.v,dv:r(a)},s=e(a,n*.5,i),o=e(a,n*.5,s),l=e(a,n,o),u=1/6*(i.dx+2*(s.dx+o.dx)+l.dx),v=1/6*(i.dv+2*(s.dv+o.dv)+l.dv);return a.x=a.x+u*n,a.v=a.v+v*n,a}return function a(n,i,s){var o={x:-1,v:0,tension:null,friction:null},l=[0],u=0,v=1/1e4,f=16/1e3,c,h,d;for(n=parseFloat(n)||500,i=parseFloat(i)||20,s=s||null,o.tension=n,o.friction=i,c=s!==null,c?(u=a(n,i),h=u/s*f):h=f;d=t(d||o,h),l.push(1+d.x),u+=16,Math.abs(d.x)>v&&Math.abs(d.v)>v;);return c?function(y){return l[y*(l.length-1)|0]}:u}})(),Ge=function(e,t,a,n){var i=yp(e,t,a,n);return function(s,o,l){return s+(o-s)*i(l)}},cn={linear:function(e,t,a){return e+(t-e)*a},ease:Ge(.25,.1,.25,1),"ease-in":Ge(.42,0,1,1),"ease-out":Ge(0,0,.58,1),"ease-in-out":Ge(.42,0,.58,1),"ease-in-sine":Ge(.47,0,.745,.715),"ease-out-sine":Ge(.39,.575,.565,1),"ease-in-out-sine":Ge(.445,.05,.55,.95),"ease-in-quad":Ge(.55,.085,.68,.53),"ease-out-quad":Ge(.25,.46,.45,.94),"ease-in-out-quad":Ge(.455,.03,.515,.955),"ease-in-cubic":Ge(.55,.055,.675,.19),"ease-out-cubic":Ge(.215,.61,.355,1),"ease-in-out-cubic":Ge(.645,.045,.355,1),"ease-in-quart":Ge(.895,.03,.685,.22),"ease-out-quart":Ge(.165,.84,.44,1),"ease-in-out-quart":Ge(.77,0,.175,1),"ease-in-quint":Ge(.755,.05,.855,.06),"ease-out-quint":Ge(.23,1,.32,1),"ease-in-out-quint":Ge(.86,0,.07,1),"ease-in-expo":Ge(.95,.05,.795,.035),"ease-out-expo":Ge(.19,1,.22,1),"ease-in-out-expo":Ge(1,0,0,1),"ease-in-circ":Ge(.6,.04,.98,.335),"ease-out-circ":Ge(.075,.82,.165,1),"ease-in-out-circ":Ge(.785,.135,.15,.86),spring:function(e,t,a){if(a===0)return cn.linear;var n=mp(e,t,a);return function(i,s,o){return i+(s-i)*n(o)}},"cubic-bezier":Ge};function xl(r,e,t,a,n){if(a===1||e===t)return t;var i=n(e,t,a);return r==null||((r.roundValue||r.color)&&(i=Math.round(i)),r.min!==void 0&&(i=Math.max(i,r.min)),r.max!==void 0&&(i=Math.min(i,r.max))),i}function El(r,e){return r.pfValue!=null||r.value!=null?r.pfValue!=null&&(e==null||e.type.units!=="%")?r.pfValue:r.value:r}function Ft(r,e,t,a,n){var i=n!=null?n.type:null;t<0?t=0:t>1&&(t=1);var s=El(r,n),o=El(e,n);if(ae(s)&&ae(o))return xl(i,s,o,t,a);if(_e(s)&&_e(o)){for(var l=[],u=0;u0?(h==="spring"&&d.push(s.duration),s.easingImpl=cn[h].apply(null,d)):s.easingImpl=cn[h]}var y=s.easingImpl,g;if(s.duration===0?g=1:g=(t-l)/s.duration,s.applying&&(g=s.progress),g<0?g=0:g>1&&(g=1),s.delay==null){var p=s.startPosition,m=s.position;if(m&&n&&!r.locked()){var b={};da(p.x,m.x)&&(b.x=Ft(p.x,m.x,g,y)),da(p.y,m.y)&&(b.y=Ft(p.y,m.y,g,y)),r.position(b)}var w=s.startPan,E=s.pan,C=i.pan,x=E!=null&&a;x&&(da(w.x,E.x)&&(C.x=Ft(w.x,E.x,g,y)),da(w.y,E.y)&&(C.y=Ft(w.y,E.y,g,y)),r.emit("pan"));var T=s.startZoom,k=s.zoom,D=k!=null&&a;D&&(da(T,k)&&(i.zoom=ka(i.minZoom,Ft(T,k,g,y),i.maxZoom)),r.emit("zoom")),(x||D)&&r.emit("viewport");var B=s.style;if(B&&B.length>0&&n){for(var P=0;P=0;x--){var T=C[x];T()}C.splice(0,C.length)},m=h.length-1;m>=0;m--){var b=h[m],w=b._private;if(w.stopped){h.splice(m,1),w.hooked=!1,w.playing=!1,w.started=!1,p(w.frames);continue}!w.playing&&!w.applying||(w.playing&&w.applying&&(w.applying=!1),w.started||wp(v,b,r),bp(v,b,r,f),w.applying&&(w.applying=!1),p(w.frames),w.step!=null&&w.step(r),b.completed()&&(h.splice(m,1),w.hooked=!1,w.playing=!1,w.started=!1,p(w.completes)),y=!0)}return!f&&h.length===0&&d.length===0&&a.push(v),y}for(var i=!1,s=0;s0?e.notify("draw",t):e.notify("draw")),t.unmerge(a),e.emit("step")}var xp={animate:Fe.animate(),animation:Fe.animation(),animated:Fe.animated(),clearQueue:Fe.clearQueue(),delay:Fe.delay(),delayAnimation:Fe.delayAnimation(),stop:Fe.stop(),addToAnimationPool:function(e){var t=this;t.styleEnabled()&&t._private.aniEles.merge(e)},stopAnimationLoop:function(){this._private.animationsRunning=!1},startAnimationLoop:function(){var e=this;if(e._private.animationsRunning=!0,!e.styleEnabled())return;function t(){e._private.animationsRunning&&wn(function(i){Cl(i,e),t()})}var a=e.renderer();a&&a.beforeRender?a.beforeRender(function(i,s){Cl(s,e)},a.beforeRenderPriorities.animations):t()}},Ep={qualifierCompare:function(e,t){return e==null||t==null?e==null&&t==null:e.sameText(t)},eventMatches:function(e,t,a){var n=t.qualifier;return n!=null?e!==a.target&&Ia(a.target)&&n.matches(a.target):!0},addEventFields:function(e,t){t.cy=e,t.target=e},callbackContext:function(e,t,a){return t.qualifier!=null?a.target:e}},tn=function(e){return ge(e)?new ft(e):e},tf={createEmitter:function(){var e=this._private;return e.emitter||(e.emitter=new Gn(Ep,this)),this},emitter:function(){return this._private.emitter},on:function(e,t,a){return this.emitter().on(e,tn(t),a),this},removeListener:function(e,t,a){return this.emitter().removeListener(e,tn(t),a),this},removeAllListeners:function(){return this.emitter().removeAllListeners(),this},one:function(e,t,a){return this.emitter().one(e,tn(t),a),this},once:function(e,t,a){return this.emitter().one(e,tn(t),a),this},emit:function(e,t){return this.emitter().emit(e,t),this},emitAndNotify:function(e,t){return this.emit(e),this.notify(e,t),this}};Fe.eventAliasesOn(tf);var zs={png:function(e){var t=this._private.renderer;return e=e||{},t.png(e)},jpg:function(e){var t=this._private.renderer;return e=e||{},e.bg=e.bg||"#fff",t.jpg(e)}};zs.jpeg=zs.jpg;var dn={layout:function(e){var t=this;if(e==null){$e("Layout options must be specified to make a layout");return}if(e.name==null){$e("A `name` must be specified to make a layout");return}var a=e.name,n=t.extension("layout",a);if(n==null){$e("No such layout `"+a+"` found. Did you forget to import it and `cytoscape.use()` it?");return}var i;ge(e.eles)?i=t.$(e.eles):i=e.eles!=null?e.eles:t.$();var s=new n(be({},e,{cy:t,eles:i}));return s}};dn.createLayout=dn.makeLayout=dn.layout;var Cp={notify:function(e,t){var a=this._private;if(this.batching()){a.batchNotifications=a.batchNotifications||{};var n=a.batchNotifications[e]=a.batchNotifications[e]||this.collection();t!=null&&n.merge(t);return}if(a.notificationsEnabled){var i=this.renderer();this.destroyed()||!i||i.notify(e,t)}},notifications:function(e){var t=this._private;return e===void 0?t.notificationsEnabled:(t.notificationsEnabled=!!e,this)},noNotifications:function(e){this.notifications(!1),e(),this.notifications(!0)},batching:function(){return this._private.batchCount>0},startBatch:function(){var e=this._private;return e.batchCount==null&&(e.batchCount=0),e.batchCount===0&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},endBatch:function(){var e=this._private;if(e.batchCount===0)return this;if(e.batchCount--,e.batchCount===0){e.batchStyleEles.updateStyle();var t=this.renderer();Object.keys(e.batchNotifications).forEach(function(a){var n=e.batchNotifications[a];n.empty()?t.notify(a):t.notify(a,n)})}return this},batch:function(e){return this.startBatch(),e(),this.endBatch(),this},batchData:function(e){var t=this;return this.batch(function(){for(var a=Object.keys(e),n=0;n0;)t.removeChild(t.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach(function(a){var n=a._private;n.rscratch={},n.rstyle={},n.animation.current=[],n.animation.queue=[]})},onRender:function(e){return this.on("render",e)},offRender:function(e){return this.off("render",e)}};Fs.invalidateDimensions=Fs.resize;var hn={collection:function(e,t){return ge(e)?this.$(e):Dr(e)?e.collection():_e(e)?(t||(t={}),new fr(this,e,t.unique,t.removed)):new fr(this)},nodes:function(e){var t=this.$(function(a){return a.isNode()});return e?t.filter(e):t},edges:function(e){var t=this.$(function(a){return a.isEdge()});return e?t.filter(e):t},$:function(e){var t=this._private.elements;return e?t.filter(e):t.spawnSelf()},mutableElements:function(){return this._private.elements}};hn.elements=hn.filter=hn.$;var ur={},wa="t",Sp="f";ur.apply=function(r){for(var e=this,t=e._private,a=t.cy,n=a.collection(),i=0;i0;if(c||f&&h){var d=void 0;c&&h||c?d=u.properties:h&&(d=u.mappedProperties);for(var y=0;y1&&(w=1),o.color){var C=a.valueMin[0],x=a.valueMax[0],T=a.valueMin[1],k=a.valueMax[1],D=a.valueMin[2],B=a.valueMax[2],P=a.valueMin[3]==null?1:a.valueMin[3],A=a.valueMax[3]==null?1:a.valueMax[3],R=[Math.round(C+(x-C)*w),Math.round(T+(k-T)*w),Math.round(D+(B-D)*w),Math.round(P+(A-P)*w)];i={bypass:a.bypass,name:a.name,value:R,strValue:"rgb("+R[0]+", "+R[1]+", "+R[2]+")"}}else if(o.number){var L=a.valueMin+(a.valueMax-a.valueMin)*w;i=this.parse(a.name,L,a.bypass,c)}else return!1;if(!i)return y(),!1;i.mapping=a,a=i;break}case s.data:{for(var I=a.field.split("."),M=f.data,O=0;O0&&i>0){for(var o={},l=!1,u=0;u0?r.delayAnimation(s).play().promise().then(b):b()}).then(function(){return r.animation({style:o,duration:i,easing:r.pstyle("transition-timing-function").value,queue:!1}).play().promise()}).then(function(){t.removeBypasses(r,n),r.emitAndNotify("style"),a.transitioning=!1})}else a.transitioning&&(this.removeBypasses(r,n),r.emitAndNotify("style"),a.transitioning=!1)};ur.checkTrigger=function(r,e,t,a,n,i){var s=this.properties[e],o=n(s);r.removed()||o!=null&&o(t,a,r)&&i(s)};ur.checkZOrderTrigger=function(r,e,t,a){var n=this;this.checkTrigger(r,e,t,a,function(i){return i.triggersZOrder},function(){n._private.cy.notify("zorder",r)})};ur.checkBoundsTrigger=function(r,e,t,a){this.checkTrigger(r,e,t,a,function(n){return n.triggersBounds},function(n){r.dirtyCompoundBoundsCache(),r.dirtyBoundingBoxCache()})};ur.checkConnectedEdgesBoundsTrigger=function(r,e,t,a){this.checkTrigger(r,e,t,a,function(n){return n.triggersBoundsOfConnectedEdges},function(n){r.connectedEdges().forEach(function(i){i.dirtyBoundingBoxCache()})})};ur.checkParallelEdgesBoundsTrigger=function(r,e,t,a){this.checkTrigger(r,e,t,a,function(n){return n.triggersBoundsOfParallelEdges},function(n){r.parallelEdges().forEach(function(i){i.dirtyBoundingBoxCache()})})};ur.checkTriggers=function(r,e,t,a){r.dirtyStyleCache(),this.checkZOrderTrigger(r,e,t,a),this.checkBoundsTrigger(r,e,t,a),this.checkConnectedEdgesBoundsTrigger(r,e,t,a),this.checkParallelEdgesBoundsTrigger(r,e,t,a)};var _a={};_a.applyBypass=function(r,e,t,a){var n=this,i=[],s=!0;if(e==="*"||e==="**"){if(t!==void 0)for(var o=0;on.length?a=a.substr(n.length):a=""}function l(){i.length>s.length?i=i.substr(s.length):i=""}for(;;){var u=a.match(/^\s*$/);if(u)break;var v=a.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!v){Ve("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+a);break}n=v[0];var f=v[1];if(f!=="core"){var c=new ft(f);if(c.invalid){Ve("Skipping parsing of block: Invalid selector found in string stylesheet: "+f),o();continue}}var h=v[2],d=!1;i=h;for(var y=[];;){var g=i.match(/^\s*$/);if(g)break;var p=i.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!p){Ve("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+h),d=!0;break}s=p[0];var m=p[1],b=p[2],w=e.properties[m];if(!w){Ve("Skipping property: Invalid property name in: "+s),l();continue}var E=t.parse(m,b);if(!E){Ve("Skipping property: Invalid property definition in: "+s),l();continue}y.push({name:m,val:b}),l()}if(d){o();break}t.selector(f);for(var C=0;C=7&&e[0]==="d"&&(v=new RegExp(o.data.regex).exec(e))){if(t)return!1;var c=o.data;return{name:r,value:v,strValue:""+e,mapped:c,field:v[1],bypass:t}}else if(e.length>=10&&e[0]==="m"&&(f=new RegExp(o.mapData.regex).exec(e))){if(t||u.multiple)return!1;var h=o.mapData;if(!(u.color||u.number))return!1;var d=this.parse(r,f[4]);if(!d||d.mapped)return!1;var y=this.parse(r,f[5]);if(!y||y.mapped)return!1;if(d.pfValue===y.pfValue||d.strValue===y.strValue)return Ve("`"+r+": "+e+"` is not a valid mapper because the output range is zero; converting to `"+r+": "+d.strValue+"`"),this.parse(r,d.strValue);if(u.color){var g=d.value,p=y.value,m=g[0]===p[0]&&g[1]===p[1]&&g[2]===p[2]&&(g[3]===p[3]||(g[3]==null||g[3]===1)&&(p[3]==null||p[3]===1));if(m)return!1}return{name:r,value:f,strValue:""+e,mapped:h,field:f[1],fieldMin:parseFloat(f[2]),fieldMax:parseFloat(f[3]),valueMin:d.value,valueMax:y.value,bypass:t}}}if(u.multiple&&a!=="multiple"){var b;if(l?b=e.split(/\s+/):_e(e)?b=e:b=[e],u.evenMultiple&&b.length%2!==0)return null;for(var w=[],E=[],C=[],x="",T=!1,k=0;k0?" ":"")+D.strValue}return u.validate&&!u.validate(w,E)?null:u.singleEnum&&T?w.length===1&&ge(w[0])?{name:r,value:w[0],strValue:w[0],bypass:t}:null:{name:r,value:w,pfValue:C,strValue:x,bypass:t,units:E}}var B=function(){for(var J=0;Ju.max||u.strictMax&&e===u.max))return null;var I={name:r,value:e,strValue:""+e+(P||""),units:P,bypass:t};return u.unitless||P!=="px"&&P!=="em"?I.pfValue=e:I.pfValue=P==="px"||!P?e:this.getEmSizeInPixels()*e,(P==="ms"||P==="s")&&(I.pfValue=P==="ms"?e:1e3*e),(P==="deg"||P==="rad")&&(I.pfValue=P==="rad"?e:Ed(e)),P==="%"&&(I.pfValue=e/100),I}else if(u.propList){var M=[],O=""+e;if(O!=="none"){for(var V=O.split(/\s*,\s*|\s+/),G=0;G0&&o>0&&!isNaN(a.w)&&!isNaN(a.h)&&a.w>0&&a.h>0){l=Math.min((s-2*t)/a.w,(o-2*t)/a.h),l=l>this._private.maxZoom?this._private.maxZoom:l,l=l=a.minZoom&&(a.maxZoom=t),this},minZoom:function(e){return e===void 0?this._private.minZoom:this.zoomRange({min:e})},maxZoom:function(e){return e===void 0?this._private.maxZoom:this.zoomRange({max:e})},getZoomedViewport:function(e){var t=this._private,a=t.pan,n=t.zoom,i,s,o=!1;if(t.zoomingEnabled||(o=!0),ae(e)?s=e:Le(e)&&(s=e.level,e.position!=null?i=On(e.position,n,a):e.renderedPosition!=null&&(i=e.renderedPosition),i!=null&&!t.panningEnabled&&(o=!0)),s=s>t.maxZoom?t.maxZoom:s,s=st.maxZoom||!t.zoomingEnabled?s=!0:(t.zoom=l,i.push("zoom"))}if(n&&(!s||!e.cancelOnFailedZoom)&&t.panningEnabled){var u=e.pan;ae(u.x)&&(t.pan.x=u.x,o=!1),ae(u.y)&&(t.pan.y=u.y,o=!1),o||i.push("pan")}return i.length>0&&(i.push("viewport"),this.emit(i.join(" ")),this.notify("viewport")),this},center:function(e){var t=this.getCenterPan(e);return t&&(this._private.pan=t,this.emit("pan viewport"),this.notify("viewport")),this},getCenterPan:function(e,t){if(this._private.panningEnabled){if(ge(e)){var a=e;e=this.mutableElements().filter(a)}else Dr(e)||(e=this.mutableElements());if(e.length!==0){var n=e.boundingBox(),i=this.width(),s=this.height();t=t===void 0?this._private.zoom:t;var o={x:(i-t*(n.x1+n.x2))/2,y:(s-t*(n.y1+n.y2))/2};return o}}},reset:function(){return!this._private.panningEnabled||!this._private.zoomingEnabled?this:(this.viewport({pan:{x:0,y:0},zoom:1}),this)},invalidateSize:function(){this._private.sizeCache=null},size:function(){var e=this._private,t=e.container,a=this;return e.sizeCache=e.sizeCache||(t?(function(){var n=a.window().getComputedStyle(t),i=function(o){return parseFloat(n.getPropertyValue(o))};return{width:t.clientWidth-i("padding-left")-i("padding-right"),height:t.clientHeight-i("padding-top")-i("padding-bottom")}})():{width:1,height:1})},width:function(){return this.size().width},height:function(){return this.size().height},extent:function(){var e=this._private.pan,t=this._private.zoom,a=this.renderedExtent(),n={x1:(a.x1-e.x)/t,x2:(a.x2-e.x)/t,y1:(a.y1-e.y)/t,y2:(a.y2-e.y)/t};return n.w=n.x2-n.x1,n.h=n.y2-n.y1,n},renderedExtent:function(){var e=this.width(),t=this.height();return{x1:0,y1:0,x2:e,y2:t,w:e,h:t}},multiClickDebounceTime:function(e){if(e)this._private.multiClickDebounceTime=e;else return this._private.multiClickDebounceTime;return this}};Rt.centre=Rt.center;Rt.autolockNodes=Rt.autolock;Rt.autoungrabifyNodes=Rt.autoungrabify;var Aa={data:Fe.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:Fe.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:Fe.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:Fe.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};Aa.attr=Aa.data;Aa.removeAttr=Aa.removeData;var Ra=function(e){var t=this;e=be({},e);var a=e.container;a&&!bn(a)&&bn(a[0])&&(a=a[0]);var n=a?a._cyreg:null;n=n||{},n&&n.cy&&(n.cy.destroy(),n={});var i=n.readies=n.readies||[];a&&(a._cyreg=n),n.cy=t;var s=rr!==void 0&&a!==void 0&&!e.headless,o=e;o.layout=be({name:s?"grid":"null"},o.layout),o.renderer=be({name:s?"canvas":"null"},o.renderer);var l=function(d,y,g){return y!==void 0?y:g!==void 0?g:d},u=this._private={container:a,ready:!1,options:o,elements:new fr(this),listeners:[],aniEles:new fr(this),data:o.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:l(!0,o.zoomingEnabled),userZoomingEnabled:l(!0,o.userZoomingEnabled),panningEnabled:l(!0,o.panningEnabled),userPanningEnabled:l(!0,o.userPanningEnabled),boxSelectionEnabled:l(!0,o.boxSelectionEnabled),autolock:l(!1,o.autolock,o.autolockNodes),autoungrabify:l(!1,o.autoungrabify,o.autoungrabifyNodes),autounselectify:l(!1,o.autounselectify),styleEnabled:o.styleEnabled===void 0?s:o.styleEnabled,zoom:ae(o.zoom)?o.zoom:1,pan:{x:Le(o.pan)&&ae(o.pan.x)?o.pan.x:0,y:Le(o.pan)&&ae(o.pan.y)?o.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:l(250,o.multiClickDebounceTime)};this.createEmitter(),this.selectionType(o.selectionType),this.zoomRange({min:o.minZoom,max:o.maxZoom});var v=function(d,y){var g=d.some(pc);if(g)return ta.all(d).then(y);y(d)};u.styleEnabled&&t.setStyle([]);var f=be({},o,o.renderer);t.initRenderer(f);var c=function(d,y,g){t.notifications(!1);var p=t.mutableElements();p.length>0&&p.remove(),d!=null&&(Le(d)||_e(d))&&t.add(d),t.one("layoutready",function(b){t.notifications(!0),t.emit(b),t.one("load",y),t.emitAndNotify("load")}).one("layoutstop",function(){t.one("done",g),t.emit("done")});var m=be({},t._private.options.layout);m.eles=t.elements(),t.layout(m).run()};v([o.style,o.elements],function(h){var d=h[0],y=h[1];u.styleEnabled&&t.style().append(d),c(y,function(){t.startAnimationLoop(),u.ready=!0,Ue(o.ready)&&t.on("ready",o.ready);for(var g=0;g0,o=!!r.boundingBox,l=wr(o?r.boundingBox:structuredClone(e.extent())),u;if(Dr(r.roots))u=r.roots;else if(_e(r.roots)){for(var v=[],f=0;f0;){var R=A(),L=k(R,B);if(L)R.outgoers().filter(function(ye){return ye.isNode()&&t.has(ye)}).forEach(P);else if(L===null){Ve("Detected double maximal shift for node `"+R.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}var I=0;if(r.avoidOverlap)for(var M=0;M0&&p[0].length<=3?pe/2:0),Re=2*Math.PI/p[he].length*Ee;return he===0&&p[0].length===1&&(Se=1),{x:H.x+Se*Math.cos(Re),y:H.y+Se*Math.sin(Re)}}else{var Oe=p[he].length,Ne=Math.max(Oe===1?0:o?(l.w-r.padding*2-Y.w)/((r.grid?ce:Oe)-1):(l.w-r.padding*2-Y.w)/((r.grid?ce:Oe)+1),I),ze={x:H.x+(Ee+1-(Oe+1)/2)*Ne,y:H.y+(he+1-(K+1)/2)*te};return ze}},Ce={downward:0,leftward:90,upward:180,rightward:-90};Object.keys(Ce).indexOf(r.direction)===-1&&$e("Invalid direction '".concat(r.direction,"' specified for breadthfirst layout. Valid values are: ").concat(Object.keys(Ce).join(", ")));var we=function(ie){return $c(Ae(ie),l,Ce[r.direction])};return t.nodes().layoutPositions(this,r,we),this};var Ap={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function nf(r){this.options=be({},Ap,r)}nf.prototype.run=function(){var r=this.options,e=r,t=r.cy,a=e.eles,n=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,i=a.nodes().not(":parent");e.sort&&(i=i.sort(e.sort));for(var s=wr(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:t.width(),h:t.height()}),o={x:s.x1+s.w/2,y:s.y1+s.h/2},l=e.sweep===void 0?2*Math.PI-2*Math.PI/i.length:e.sweep,u=l/Math.max(1,i.length-1),v,f=0,c=0;c1&&e.avoidOverlap){f*=1.75;var p=Math.cos(u)-Math.cos(0),m=Math.sin(u)-Math.sin(0),b=Math.sqrt(f*f/(p*p+m*m));v=Math.max(b,v)}var w=function(C,x){var T=e.startAngle+x*u*(n?1:-1),k=v*Math.cos(T),D=v*Math.sin(T),B={x:o.x+k,y:o.y+D};return B};return a.nodes().layoutPositions(this,e,w),this};var Rp={fit:!0,padding:30,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:function(e){return e.degree()},levelWidth:function(e){return e.maxDegree()/4},animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function sf(r){this.options=be({},Rp,r)}sf.prototype.run=function(){for(var r=this.options,e=r,t=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,a=r.cy,n=e.eles,i=n.nodes().not(":parent"),s=wr(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:a.width(),h:a.height()}),o={x:s.x1+s.w/2,y:s.y1+s.h/2},l=[],u=0,v=0;v0){var E=Math.abs(m[0].value-w.value);E>=g&&(m=[],p.push(m))}m.push(w)}var C=u+e.minNodeSpacing;if(!e.avoidOverlap){var x=p.length>0&&p[0].length>1,T=Math.min(s.w,s.h)/2-C,k=T/(p.length+x?1:0);C=Math.min(C,k)}for(var D=0,B=0;B1&&e.avoidOverlap){var L=Math.cos(R)-Math.cos(0),I=Math.sin(R)-Math.sin(0),M=Math.sqrt(C*C/(L*L+I*I));D=Math.max(M,D)}P.r=D,D+=C}if(e.equidistant){for(var O=0,V=0,G=0;G=r.numIter||(Fp(a,r),a.temperature=a.temperature*r.coolingFactor,a.temperature=r.animationThreshold&&i(),wn(v)}};v()}else{for(;u;)u=s(l),l++;kl(a,r),o()}return this};Kn.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this};Kn.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};var Lp=function(e,t,a){for(var n=a.eles.edges(),i=a.eles.nodes(),s=wr(a.boundingBox?a.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),o={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:i.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:n.size(),temperature:a.initialTemp,clientWidth:s.w,clientHeight:s.h,boundingBox:s},l=a.eles.components(),u={},v=0;v0){o.graphSet.push(T);for(var v=0;vn.count?0:n.graph},of=function(e,t,a,n){var i=n.graphSet[a];if(-10)var f=n.nodeOverlap*v,c=Math.sqrt(o*o+l*l),h=f*o/c,d=f*l/c;else var y=Dn(e,o,l),g=Dn(t,-1*o,-1*l),p=g.x-y.x,m=g.y-y.y,b=p*p+m*m,c=Math.sqrt(b),f=(e.nodeRepulsion+t.nodeRepulsion)/b,h=f*p/c,d=f*m/c;e.isLocked||(e.offsetX-=h,e.offsetY-=d),t.isLocked||(t.offsetX+=h,t.offsetY+=d)}},_p=function(e,t,a,n){if(a>0)var i=e.maxX-t.minX;else var i=t.maxX-e.minX;if(n>0)var s=e.maxY-t.minY;else var s=t.maxY-e.minY;return i>=0&&s>=0?Math.sqrt(i*i+s*s):0},Dn=function(e,t,a){var n=e.positionX,i=e.positionY,s=e.height||1,o=e.width||1,l=a/t,u=s/o,v={};return t===0&&0a?(v.x=n,v.y=i+s/2,v):0t&&-1*u<=l&&l<=u?(v.x=n-o/2,v.y=i-o*a/2/t,v):0=u)?(v.x=n+s*t/2/a,v.y=i+s/2,v):(0>a&&(l<=-1*u||l>=u)&&(v.x=n-s*t/2/a,v.y=i-s/2),v)},Gp=function(e,t){for(var a=0;aa){var g=t.gravity*h/y,p=t.gravity*d/y;c.offsetX+=g,c.offsetY+=p}}}}},Wp=function(e,t){var a=[],n=0,i=-1;for(a.push.apply(a,e.graphSet[0]),i+=e.graphSet[0].length;n<=i;){var s=a[n++],o=e.idToIndex[s],l=e.layoutNodes[o],u=l.children;if(0a)var i={x:a*e/n,y:a*t/n};else var i={x:e,y:t};return i},lf=function(e,t){var a=e.parentId;if(a!=null){var n=t.layoutNodes[t.idToIndex[a]],i=!1;if((n.maxX==null||e.maxX+n.padRight>n.maxX)&&(n.maxX=e.maxX+n.padRight,i=!0),(n.minX==null||e.minX-n.padLeftn.maxY)&&(n.maxY=e.maxY+n.padBottom,i=!0),(n.minY==null||e.minY-n.padTopp&&(d+=g+t.componentSpacing,h=0,y=0,g=0)}}},Kp={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:function(e){},sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function vf(r){this.options=be({},Kp,r)}vf.prototype.run=function(){var r=this.options,e=r,t=r.cy,a=e.eles,n=a.nodes().not(":parent");e.sort&&(n=n.sort(e.sort));var i=wr(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:t.width(),h:t.height()});if(i.h===0||i.w===0)a.nodes().layoutPositions(this,e,function(U){return{x:i.x1,y:i.y1}});else{var s=n.size(),o=Math.sqrt(s*i.h/i.w),l=Math.round(o),u=Math.round(i.w/i.h*o),v=function(Q){if(Q==null)return Math.min(l,u);var K=Math.min(l,u);K==l?l=Q:u=Q},f=function(Q){if(Q==null)return Math.max(l,u);var K=Math.max(l,u);K==l?l=Q:u=Q},c=e.rows,h=e.cols!=null?e.cols:e.columns;if(c!=null&&h!=null)l=c,u=h;else if(c!=null&&h==null)l=c,u=Math.ceil(s/l);else if(c==null&&h!=null)u=h,l=Math.ceil(s/u);else if(u*l>s){var d=v(),y=f();(d-1)*y>=s?v(d-1):(y-1)*d>=s&&f(y-1)}else for(;u*l=s?f(p+1):v(g+1)}var m=i.w/u,b=i.h/l;if(e.condense&&(m=0,b=0),e.avoidOverlap)for(var w=0;w=u&&(L=0,R++)},M={},O=0;O(L=Nd(r,e,I[M],I[M+1],I[M+2],I[M+3])))return g(x,L),!0}else if(k.edgeType==="bezier"||k.edgeType==="multibezier"||k.edgeType==="self"||k.edgeType==="compound"){for(var I=k.allpts,M=0;M+5(L=Od(r,e,I[M],I[M+1],I[M+2],I[M+3],I[M+4],I[M+5])))return g(x,L),!0}for(var O=O||T.source,V=V||T.target,G=n.getArrowWidth(D,B),N=[{name:"source",x:k.arrowStartX,y:k.arrowStartY,angle:k.srcArrowAngle},{name:"target",x:k.arrowEndX,y:k.arrowEndY,angle:k.tgtArrowAngle},{name:"mid-source",x:k.midX,y:k.midY,angle:k.midsrcArrowAngle},{name:"mid-target",x:k.midX,y:k.midY,angle:k.midtgtArrowAngle}],M=0;M0&&(p(O),p(V))}function b(x,T,k){return Tr(x,T,k)}function w(x,T){var k=x._private,D=c,B;T?B=T+"-":B="",x.boundingBox();var P=k.labelBounds[T||"main"],A=x.pstyle(B+"label").value,R=x.pstyle("text-events").strValue==="yes";if(!(!R||!A)){var L=b(k.rscratch,"labelX",T),I=b(k.rscratch,"labelY",T),M=b(k.rscratch,"labelAngle",T),O=x.pstyle(B+"text-margin-x").pfValue,V=x.pstyle(B+"text-margin-y").pfValue,G=P.x1-D-O,N=P.x2+D-O,F=P.y1-D-V,U=P.y2+D-V;if(M){var Q=Math.cos(M),K=Math.sin(M),j=function(Y,te){return Y=Y-L,te=te-I,{x:Y*Q-te*K+L,y:Y*K+te*Q+I}},re=j(G,F),ne=j(G,U),J=j(N,F),z=j(N,U),q=[re.x+O,re.y+V,J.x+O,J.y+V,z.x+O,z.y+V,ne.x+O,ne.y+V];if(Sr(r,e,q))return g(x),!0}else if(nt(P,r,e))return g(x),!0}}for(var E=s.length-1;E>=0;E--){var C=s[E];C.isNode()?p(C)||w(C):m(C)||w(C)||w(C,"source")||w(C,"target")}return o};Lt.getAllInBox=function(r,e,t,a){var n=this.getCachedZSortedEles().interactive,i=this.cy.zoom(),s=2/i,o=[],l=Math.min(r,t),u=Math.max(r,t),v=Math.min(e,a),f=Math.max(e,a);r=l,t=u,e=v,a=f;var c=wr({x1:r,y1:e,x2:t,y2:a}),h=[{x:c.x1,y:c.y1},{x:c.x2,y:c.y1},{x:c.x2,y:c.y2},{x:c.x1,y:c.y2}],d=[[h[0],h[1]],[h[1],h[2]],[h[2],h[3]],[h[3],h[0]]];function y(Y,te,ce){return Tr(Y,te,ce)}function g(Y,te){var ce=Y._private,Ae=s,Ce="";Y.boundingBox();var we=ce.labelBounds.main;if(!we)return null;var ye=y(ce.rscratch,"labelX",te),ie=y(ce.rscratch,"labelY",te),de=y(ce.rscratch,"labelAngle",te),he=Y.pstyle(Ce+"text-margin-x").pfValue,Ee=Y.pstyle(Ce+"text-margin-y").pfValue,pe=we.x1-Ae-he,Se=we.x2+Ae-he,Re=we.y1-Ae-Ee,Oe=we.y2+Ae-Ee;if(de){var Ne=Math.cos(de),ze=Math.sin(de),xe=function(X,S){return X=X-ye,S=S-ie,{x:X*Ne-S*ze+ye,y:X*ze+S*Ne+ie}};return[xe(pe,Re),xe(Se,Re),xe(Se,Oe),xe(pe,Oe)]}else return[{x:pe,y:Re},{x:Se,y:Re},{x:Se,y:Oe},{x:pe,y:Oe}]}function p(Y,te,ce,Ae){function Ce(we,ye,ie){return(ie.y-we.y)*(ye.x-we.x)>(ye.y-we.y)*(ie.x-we.x)}return Ce(Y,ce,Ae)!==Ce(te,ce,Ae)&&Ce(Y,te,ce)!==Ce(Y,te,Ae)}for(var m=0;m0?-(Math.PI-e.ang):Math.PI+e.ang},jp=function(e,t,a,n,i){if(e!==Rl?Ml(t,e,Vr):Jp(Pr,Vr),Ml(t,a,Pr),Pl=Vr.nx*Pr.ny-Vr.ny*Pr.nx,Al=Vr.nx*Pr.nx-Vr.ny*-Pr.ny,Ur=Math.asin(Math.max(-1,Math.min(1,Pl))),Math.abs(Ur)<1e-6){Vs=t.x,qs=t.y,Tt=qt=0;return}kt=1,gn=!1,Al<0?Ur<0?Ur=Math.PI+Ur:(Ur=Math.PI-Ur,kt=-1,gn=!0):Ur>0&&(kt=-1,gn=!0),t.radius!==void 0?qt=t.radius:qt=n,wt=Ur/2,an=Math.min(Vr.len/2,Pr.len/2),i?(zr=Math.abs(Math.cos(wt)*qt/Math.sin(wt)),zr>an?(zr=an,Tt=Math.abs(zr*Math.sin(wt)/Math.cos(wt))):Tt=qt):(zr=Math.min(an,qt),Tt=Math.abs(zr*Math.sin(wt)/Math.cos(wt))),_s=t.x+Pr.nx*zr,Gs=t.y+Pr.ny*zr,Vs=_s-Pr.ny*Tt*kt,qs=Gs+Pr.nx*Tt*kt,hf=t.x+Vr.nx*zr,gf=t.y+Vr.ny*zr,Rl=t};function pf(r,e){e.radius===0?r.lineTo(e.cx,e.cy):r.arc(e.cx,e.cy,e.radius,e.startAngle,e.endAngle,e.counterClockwise)}function po(r,e,t,a){var n=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0;return a===0||e.radius===0?{cx:e.x,cy:e.y,radius:0,startX:e.x,startY:e.y,stopX:e.x,stopY:e.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(jp(r,e,t,a,n),{cx:Vs,cy:qs,radius:Tt,startX:hf,startY:gf,stopX:_s,stopY:Gs,startAngle:Vr.ang+Math.PI/2*kt,endAngle:Pr.ang-Math.PI/2*kt,counterClockwise:gn})}var Ma=.01,ey=Math.sqrt(2*Ma),yr={};yr.findMidptPtsEtc=function(r,e){var t=e.posPts,a=e.intersectionPts,n=e.vectorNormInverse,i,s=r.pstyle("source-endpoint"),o=r.pstyle("target-endpoint"),l=s.units!=null&&o.units!=null,u=function(E,C,x,T){var k=T-C,D=x-E,B=Math.sqrt(D*D+k*k);return{x:-k/B,y:D/B}},v=r.pstyle("edge-distances").value;switch(v){case"node-position":i=t;break;case"intersection":i=a;break;case"endpoints":{if(l){var f=this.manualEndptToPx(r.source()[0],s),c=Je(f,2),h=c[0],d=c[1],y=this.manualEndptToPx(r.target()[0],o),g=Je(y,2),p=g[0],m=g[1],b={x1:h,y1:d,x2:p,y2:m};n=u(h,d,p,m),i=b}else Ve("Edge ".concat(r.id()," has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).")),i=a;break}}return{midptPts:i,vectorNormInverse:n}};yr.findHaystackPoints=function(r){for(var e=0;e0?Math.max(S-_,0):Math.min(S+_,0)},A=P(D,T),R=P(B,k),L=!1;m===u?p=Math.abs(A)>Math.abs(R)?n:a:m===l||m===o?(p=a,L=!0):(m===i||m===s)&&(p=n,L=!0);var I=p===a,M=I?R:A,O=I?B:D,V=to(O),G=!1;!(L&&(w||C))&&(m===o&&O<0||m===l&&O>0||m===i&&O>0||m===s&&O<0)&&(V*=-1,M=V*Math.abs(M),G=!0);var N;if(w){var F=E<0?1+E:E;N=F*M}else{var U=E<0?M:0;N=U+E*V}var Q=function(S){return Math.abs(S)=Math.abs(M)},K=Q(N),j=Q(Math.abs(M)-Math.abs(N)),re=K||j;if(re&&!G)if(I){var ne=Math.abs(O)<=c/2,J=Math.abs(D)<=h/2;if(ne){var z=(v.x1+v.x2)/2,q=v.y1,H=v.y2;t.segpts=[z,q,z,H]}else if(J){var Y=(v.y1+v.y2)/2,te=v.x1,ce=v.x2;t.segpts=[te,Y,ce,Y]}else t.segpts=[v.x1,v.y2]}else{var Ae=Math.abs(O)<=f/2,Ce=Math.abs(B)<=d/2;if(Ae){var we=(v.y1+v.y2)/2,ye=v.x1,ie=v.x2;t.segpts=[ye,we,ie,we]}else if(Ce){var de=(v.x1+v.x2)/2,he=v.y1,Ee=v.y2;t.segpts=[de,he,de,Ee]}else t.segpts=[v.x2,v.y1]}else if(I){var pe=v.y1+N+(g?c/2*V:0),Se=v.x1,Re=v.x2;t.segpts=[Se,pe,Re,pe]}else{var Oe=v.x1+N+(g?f/2*V:0),Ne=v.y1,ze=v.y2;t.segpts=[Oe,Ne,Oe,ze]}if(t.isRound){var xe=r.pstyle("taxi-radius").value,ue=r.pstyle("radius-type").value[0]==="arc-radius";t.radii=new Array(t.segpts.length/2).fill(xe),t.isArcRadius=new Array(t.segpts.length/2).fill(ue)}};yr.tryToCorrectInvalidPoints=function(r,e){var t=r._private.rscratch;if(t.edgeType==="bezier"){var a=e.srcPos,n=e.tgtPos,i=e.srcW,s=e.srcH,o=e.tgtW,l=e.tgtH,u=e.srcShape,v=e.tgtShape,f=e.srcCornerRadius,c=e.tgtCornerRadius,h=e.srcRs,d=e.tgtRs,y=!ae(t.startX)||!ae(t.startY),g=!ae(t.arrowStartX)||!ae(t.arrowStartY),p=!ae(t.endX)||!ae(t.endY),m=!ae(t.arrowEndX)||!ae(t.arrowEndY),b=3,w=this.getArrowWidth(r.pstyle("width").pfValue,r.pstyle("arrow-scale").value)*this.arrowShapeWidth,E=b*w,C=Pt({x:t.ctrlpts[0],y:t.ctrlpts[1]},{x:t.startX,y:t.startY}),x=CO.poolIndex()){var V=M;M=O,O=V}var G=A.srcPos=M.position(),N=A.tgtPos=O.position(),F=A.srcW=M.outerWidth(),U=A.srcH=M.outerHeight(),Q=A.tgtW=O.outerWidth(),K=A.tgtH=O.outerHeight(),j=A.srcShape=t.nodeShapes[e.getNodeShape(M)],re=A.tgtShape=t.nodeShapes[e.getNodeShape(O)],ne=A.srcCornerRadius=M.pstyle("corner-radius").value==="auto"?"auto":M.pstyle("corner-radius").pfValue,J=A.tgtCornerRadius=O.pstyle("corner-radius").value==="auto"?"auto":O.pstyle("corner-radius").pfValue,z=A.tgtRs=O._private.rscratch,q=A.srcRs=M._private.rscratch;A.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var H=0;H=ey||(Re=Math.sqrt(Math.max(Se*Se,Ma)+Math.max(pe*pe,Ma)));var Oe=A.vector={x:Se,y:pe},Ne=A.vectorNorm={x:Oe.x/Re,y:Oe.y/Re},ze={x:-Ne.y,y:Ne.x};A.nodesOverlap=!ae(Re)||re.checkPoint(we[0],we[1],0,Q,K,N.x,N.y,J,z)||j.checkPoint(ie[0],ie[1],0,F,U,G.x,G.y,ne,q),A.vectorNormInverse=ze,R={nodesOverlap:A.nodesOverlap,dirCounts:A.dirCounts,calculatedIntersection:!0,hasBezier:A.hasBezier,hasUnbundled:A.hasUnbundled,eles:A.eles,srcPos:N,srcRs:z,tgtPos:G,tgtRs:q,srcW:Q,srcH:K,tgtW:F,tgtH:U,srcIntn:de,tgtIntn:ye,srcShape:re,tgtShape:j,posPts:{x1:Ee.x2,y1:Ee.y2,x2:Ee.x1,y2:Ee.y1},intersectionPts:{x1:he.x2,y1:he.y2,x2:he.x1,y2:he.y1},vector:{x:-Oe.x,y:-Oe.y},vectorNorm:{x:-Ne.x,y:-Ne.y},vectorNormInverse:{x:-ze.x,y:-ze.y}}}var xe=Ce?R:A;te.nodesOverlap=xe.nodesOverlap,te.srcIntn=xe.srcIntn,te.tgtIntn=xe.tgtIntn,te.isRound=ce.startsWith("round"),n&&(M.isParent()||M.isChild()||O.isParent()||O.isChild())&&(M.parents().anySame(O)||O.parents().anySame(M)||M.same(O)&&M.isParent())?e.findCompoundLoopPoints(Y,xe,H,Ae):M===O?e.findLoopPoints(Y,xe,H,Ae):ce.endsWith("segments")?e.findSegmentsPoints(Y,xe):ce.endsWith("taxi")?e.findTaxiPoints(Y,xe):ce==="straight"||!Ae&&A.eles.length%2===1&&H===Math.floor(A.eles.length/2)?e.findStraightEdgePoints(Y):e.findBezierPoints(Y,xe,H,Ae,Ce),e.findEndpoints(Y),e.tryToCorrectInvalidPoints(Y,xe),e.checkForInvalidEdgeWarning(Y),e.storeAllpts(Y),e.storeEdgeProjections(Y),e.calculateArrowAngles(Y),e.recalculateEdgeLabelProjections(Y),e.calculateLabelAngles(Y)}},x=0;x0){var we=u,ye=Ct(we,Wt(s)),ie=Ct(we,Wt(Ce)),de=ye;if(ie2){var he=Ct(we,{x:Ce[2],y:Ce[3]});he0){var W=v,$=Ct(W,Wt(s)),Z=Ct(W,Wt(_)),oe=$;if(Z<$&&(s=[_[0],_[1]],oe=Z),_.length>2){var ee=Ct(W,{x:_[2],y:_[3]});ee=d||x){g={cp:w,segment:C};break}}if(g)break}var T=g.cp,k=g.segment,D=(d-p)/k.length,B=k.t1-k.t0,P=h?k.t0+B*D:k.t1-B*D;P=ka(0,P,1),e=Kt(T.p0,T.p1,T.p2,P),c=ty(T.p0,T.p1,T.p2,P);break}case"straight":case"segments":case"haystack":{for(var A=0,R,L,I,M,O=a.allpts.length,V=0;V+3=d));V+=2);var G=d-L,N=G/R;N=ka(0,N,1),e=Td(I,M,N),c=bf(I,M);break}}s("labelX",f,e.x),s("labelY",f,e.y),s("labelAutoAngle",f,c)}};u("source"),u("target"),this.applyLabelDimensions(r)}};Gr.applyLabelDimensions=function(r){this.applyPrefixedLabelDimensions(r),r.isEdge()&&(this.applyPrefixedLabelDimensions(r,"source"),this.applyPrefixedLabelDimensions(r,"target"))};Gr.applyPrefixedLabelDimensions=function(r,e){var t=r._private,a=this.getLabelText(r,e),n=Bt(a,r._private.labelDimsKey);if(Tr(t.rscratch,"prefixedLabelDimsKey",e)!==n){Kr(t.rscratch,"prefixedLabelDimsKey",e,n);var i=this.calculateLabelDimensions(r,a),s=r.pstyle("line-height").pfValue,o=r.pstyle("text-wrap").strValue,l=Tr(t.rscratch,"labelWrapCachedLines",e)||[],u=o!=="wrap"?1:Math.max(l.length,1),v=i.height/u,f=v*s,c=i.width,h=i.height+(u-1)*(s-1)*v;Kr(t.rstyle,"labelWidth",e,c),Kr(t.rscratch,"labelWidth",e,c),Kr(t.rstyle,"labelHeight",e,h),Kr(t.rscratch,"labelHeight",e,h),Kr(t.rscratch,"labelLineHeight",e,f)}};Gr.getLabelText=function(r,e){var t=r._private,a=e?e+"-":"",n=r.pstyle(a+"label").strValue,i=r.pstyle("text-transform").value,s=function(U,Q){return Q?(Kr(t.rscratch,U,e,Q),Q):Tr(t.rscratch,U,e)};if(!n)return"";i=="none"||(i=="uppercase"?n=n.toUpperCase():i=="lowercase"&&(n=n.toLowerCase()));var o=r.pstyle("text-wrap").value;if(o==="wrap"){var l=s("labelKey");if(l!=null&&s("labelWrapKey")===l)return s("labelWrapCachedText");for(var u="\u200B",v=n.split(` +`),f=r.pstyle("text-max-width").pfValue,c=r.pstyle("text-overflow-wrap").value,h=c==="anywhere",d=[],y=/[\s\u200b]+|$/g,g=0;gf){var E=p.matchAll(y),C="",x=0,T=kr(E),k;try{for(T.s();!(k=T.n()).done;){var D=k.value,B=D[0],P=p.substring(x,D.index);x=D.index+B.length;var A=C.length===0?P:C+P+B,R=this.calculateLabelDimensions(r,A),L=R.width;L<=f?C+=P+B:(C&&d.push(C),C=P+B)}}catch(F){T.e(F)}finally{T.f()}C.match(/^[\s\u200b]+$/)||d.push(C)}else d.push(p)}s("labelWrapCachedLines",d),n=s("labelWrapCachedText",d.join(` +`)),s("labelWrapKey",l)}else if(o==="ellipsis"){var I=r.pstyle("text-max-width").pfValue,M="",O="\u2026",V=!1;if(this.calculateLabelDimensions(r,n).widthI)break;M+=n[G],G===n.length-1&&(V=!0)}return V||(M+=O),M}return n};Gr.getLabelJustification=function(r){var e=r.pstyle("text-justification").strValue,t=r.pstyle("text-halign").strValue;if(e==="auto")if(r.isNode())switch(t){case"left":return"right";case"right":return"left";default:return"center"}else return"center";else return e};Gr.calculateLabelDimensions=function(r,e){var t=this,a=t.cy.window(),n=a.document,i=0,s=r.pstyle("font-style").strValue,o=r.pstyle("font-size").pfValue,l=r.pstyle("font-family").strValue,u=r.pstyle("font-weight").strValue,v=this.labelCalcCanvas,f=this.labelCalcCanvasContext;if(!v){v=this.labelCalcCanvas=n.createElement("canvas"),f=this.labelCalcCanvasContext=v.getContext("2d");var c=v.style;c.position="absolute",c.left="-9999px",c.top="-9999px",c.zIndex="-1",c.visibility="hidden",c.pointerEvents="none"}f.font="".concat(s," ").concat(u," ").concat(o,"px ").concat(l);for(var h=0,d=0,y=e.split(` +`),g=0;g1&&arguments[1]!==void 0?arguments[1]:!0;if(e.merge(s),o)for(var l=0;l=r.desktopTapThreshold2}var lr=i(S);je&&(r.hoverData.tapholdCancelled=!0);var jr=function(){var Br=r.hoverData.dragDelta=r.hoverData.dragDelta||[];Br.length===0?(Br.push(Pe[0]),Br.push(Pe[1])):(Br[0]+=Pe[0],Br[1]+=Pe[1])};W=!0,n(De,["mousemove","vmousemove","tapdrag"],S,{x:ee[0],y:ee[1]});var Ze=function(Br){return{originalEvent:S,type:Br,position:{x:ee[0],y:ee[1]}}},Wr=function(){r.data.bgActivePosistion=void 0,r.hoverData.selecting||$.emit(Ze("boxstart")),me[4]=1,r.hoverData.selecting=!0,r.redrawHint("select",!0),r.redraw()};if(r.hoverData.which===3){if(je){var $r=Ze("cxtdrag");fe?fe.emit($r):$.emit($r),r.hoverData.cxtDragged=!0,(!r.hoverData.cxtOver||De!==r.hoverData.cxtOver)&&(r.hoverData.cxtOver&&r.hoverData.cxtOver.emit(Ze("cxtdragout")),r.hoverData.cxtOver=De,De&&De.emit(Ze("cxtdragover")))}}else if(r.hoverData.dragging){if(W=!0,$.panningEnabled()&&$.userPanningEnabled()){var Ot;if(r.hoverData.justStartedPan){var $a=r.hoverData.mdownPos;Ot={x:(ee[0]-$a[0])*Z,y:(ee[1]-$a[1])*Z},r.hoverData.justStartedPan=!1}else Ot={x:Pe[0]*Z,y:Pe[1]*Z};$.panBy(Ot),$.emit(Ze("dragpan")),r.hoverData.dragged=!0}ee=r.projectIntoViewport(S.clientX,S.clientY)}else if(me[4]==1&&(fe==null||fe.pannable())){if(je){if(!r.hoverData.dragging&&$.boxSelectionEnabled()&&(lr||!$.panningEnabled()||!$.userPanningEnabled()))Wr();else if(!r.hoverData.selecting&&$.panningEnabled()&&$.userPanningEnabled()){var bt=s(fe,r.hoverData.downs);bt&&(r.hoverData.dragging=!0,r.hoverData.justStartedPan=!0,me[4]=0,r.data.bgActivePosistion=Wt(ve),r.redrawHint("select",!0),r.redraw())}fe&&fe.pannable()&&fe.active()&&fe.unactivate()}}else{if(fe&&fe.pannable()&&fe.active()&&fe.unactivate(),(!fe||!fe.grabbed())&&De!=Te&&(Te&&n(Te,["mouseout","tapdragout"],S,{x:ee[0],y:ee[1]}),De&&n(De,["mouseover","tapdragover"],S,{x:ee[0],y:ee[1]}),r.hoverData.last=De),fe)if(je){if($.boxSelectionEnabled()&&lr)fe&&fe.grabbed()&&(p(Be),fe.emit(Ze("freeon")),Be.emit(Ze("free")),r.dragData.didDrag&&(fe.emit(Ze("dragfreeon")),Be.emit(Ze("dragfree")))),Wr();else if(fe&&fe.grabbed()&&r.nodeIsDraggable(fe)){var Er=!r.dragData.didDrag;Er&&r.redrawHint("eles",!0),r.dragData.didDrag=!0,r.hoverData.draggingEles||y(Be,{inDragLayer:!0});var hr={x:0,y:0};if(ae(Pe[0])&&ae(Pe[1])&&(hr.x+=Pe[0],hr.y+=Pe[1],Er)){var Cr=r.hoverData.dragDelta;Cr&&ae(Cr[0])&&ae(Cr[1])&&(hr.x+=Cr[0],hr.y+=Cr[1])}r.hoverData.draggingEles=!0,Be.silentShift(hr).emit(Ze("position")).emit(Ze("drag")),r.redrawHint("drag",!0),r.redraw()}}else jr();W=!0}if(me[2]=ee[0],me[3]=ee[1],W)return S.stopPropagation&&S.stopPropagation(),S.preventDefault&&S.preventDefault(),!1}},!1);var P,A,R;r.registerBinding(e,"mouseup",function(S){if(!(r.hoverData.which===1&&S.which!==1&&r.hoverData.capture)){var _=r.hoverData.capture;if(_){r.hoverData.capture=!1;var W=r.cy,$=r.projectIntoViewport(S.clientX,S.clientY),Z=r.selection,oe=r.findNearestElement($[0],$[1],!0,!1),ee=r.dragData.possibleDragElements,ve=r.hoverData.down,le=i(S);r.data.bgActivePosistion&&(r.redrawHint("select",!0),r.redraw()),r.hoverData.tapholdCancelled=!0,r.data.bgActivePosistion=void 0,ve&&ve.unactivate();var me=function(Ke){return{originalEvent:S,type:Ke,position:{x:$[0],y:$[1]}}};if(r.hoverData.which===3){var De=me("cxttapend");if(ve?ve.emit(De):W.emit(De),!r.hoverData.cxtDragged){var Te=me("cxttap");ve?ve.emit(Te):W.emit(Te)}r.hoverData.cxtDragged=!1,r.hoverData.which=null}else if(r.hoverData.which===1){if(n(oe,["mouseup","tapend","vmouseup"],S,{x:$[0],y:$[1]}),!r.dragData.didDrag&&!r.hoverData.dragged&&!r.hoverData.selecting&&!r.hoverData.isOverThresholdDrag&&(n(ve,["click","tap","vclick"],S,{x:$[0],y:$[1]}),A=!1,S.timeStamp-R<=W.multiClickDebounceTime()?(P&&clearTimeout(P),A=!0,R=null,n(ve,["dblclick","dbltap","vdblclick"],S,{x:$[0],y:$[1]})):(P=setTimeout(function(){A||n(ve,["oneclick","onetap","voneclick"],S,{x:$[0],y:$[1]})},W.multiClickDebounceTime()),R=S.timeStamp)),ve==null&&!r.dragData.didDrag&&!r.hoverData.selecting&&!r.hoverData.dragged&&!i(S)&&(W.$(t).unselect(["tapunselect"]),ee.length>0&&r.redrawHint("eles",!0),r.dragData.possibleDragElements=ee=W.collection()),oe==ve&&!r.dragData.didDrag&&!r.hoverData.selecting&&oe!=null&&oe._private.selectable&&(r.hoverData.dragging||(W.selectionType()==="additive"||le?oe.selected()?oe.unselect(["tapunselect"]):oe.select(["tapselect"]):le||(W.$(t).unmerge(oe).unselect(["tapunselect"]),oe.select(["tapselect"]))),r.redrawHint("eles",!0)),r.hoverData.selecting){var fe=W.collection(r.getAllInBox(Z[0],Z[1],Z[2],Z[3]));r.redrawHint("select",!0),fe.length>0&&r.redrawHint("eles",!0),W.emit(me("boxend"));var Pe=function(Ke){return Ke.selectable()&&!Ke.selected()};W.selectionType()==="additive"||le||W.$(t).unmerge(fe).unselect(),fe.emit(me("box")).stdFilter(Pe).select().emit(me("boxselect")),r.redraw()}if(r.hoverData.dragging&&(r.hoverData.dragging=!1,r.redrawHint("select",!0),r.redrawHint("eles",!0),r.redraw()),!Z[4]){r.redrawHint("drag",!0),r.redrawHint("eles",!0);var Be=ve&&ve.grabbed();p(ee),Be&&(ve.emit(me("freeon")),ee.emit(me("free")),r.dragData.didDrag&&(ve.emit(me("dragfreeon")),ee.emit(me("dragfree"))))}}Z[4]=0,r.hoverData.down=null,r.hoverData.cxtStarted=!1,r.hoverData.draggingEles=!1,r.hoverData.selecting=!1,r.hoverData.isOverThresholdDrag=!1,r.dragData.didDrag=!1,r.hoverData.dragged=!1,r.hoverData.dragDelta=[],r.hoverData.mdownPos=null,r.hoverData.mdownGPos=null,r.hoverData.which=null}}},!1);var L=[],I=4,M,O=1e5,V=function(S,_){for(var W=0;W=I){var $=L;if(M=V($,5),!M){var Z=Math.abs($[0]);M=G($)&&Z>5}if(M)for(var oe=0;oe<$.length;oe++)O=Math.min(Math.abs($[oe]),O)}else L.push(W),_=!0;else M&&(O=Math.min(Math.abs(W),O));if(!r.scrollingPage){var ee=r.cy,ve=ee.zoom(),le=ee.pan(),me=r.projectIntoViewport(S.clientX,S.clientY),De=[me[0]*ve+le.x,me[1]*ve+le.y];if(r.hoverData.draggingEles||r.hoverData.dragging||r.hoverData.cxtStarted||k()){S.preventDefault();return}if(ee.panningEnabled()&&ee.userPanningEnabled()&&ee.zoomingEnabled()&&ee.userZoomingEnabled()){S.preventDefault(),r.data.wheelZooming=!0,clearTimeout(r.data.wheelTimeout),r.data.wheelTimeout=setTimeout(function(){r.data.wheelZooming=!1,r.redrawHint("eles",!0),r.redraw()},150);var Te;_&&Math.abs(W)>5&&(W=to(W)*5),Te=W/-250,M&&(Te/=O,Te*=3),Te=Te*r.wheelSensitivity;var fe=S.deltaMode===1;fe&&(Te*=33);var Pe=ee.zoom()*Math.pow(10,Te);S.type==="gesturechange"&&(Pe=r.gestureStartZoom*S.scale),ee.zoom({level:Pe,renderedPosition:{x:De[0],y:De[1]}}),ee.emit({type:S.type==="gesturechange"?"pinchzoom":"scrollzoom",originalEvent:S,position:{x:me[0],y:me[1]}})}}}};r.registerBinding(r.container,"wheel",N,!0),r.registerBinding(e,"scroll",function(S){r.scrollingPage=!0,clearTimeout(r.scrollingPageTimeout),r.scrollingPageTimeout=setTimeout(function(){r.scrollingPage=!1},250)},!0),r.registerBinding(r.container,"gesturestart",function(S){r.gestureStartZoom=r.cy.zoom(),r.hasTouchStarted||S.preventDefault()},!0),r.registerBinding(r.container,"gesturechange",function(X){r.hasTouchStarted||N(X)},!0),r.registerBinding(r.container,"mouseout",function(S){var _=r.projectIntoViewport(S.clientX,S.clientY);r.cy.emit({originalEvent:S,type:"mouseout",position:{x:_[0],y:_[1]}})},!1),r.registerBinding(r.container,"mouseover",function(S){var _=r.projectIntoViewport(S.clientX,S.clientY);r.cy.emit({originalEvent:S,type:"mouseover",position:{x:_[0],y:_[1]}})},!1);var F,U,Q,K,j,re,ne,J,z,q,H,Y,te,ce=function(S,_,W,$){return Math.sqrt((W-S)*(W-S)+($-_)*($-_))},Ae=function(S,_,W,$){return(W-S)*(W-S)+($-_)*($-_)},Ce;r.registerBinding(r.container,"touchstart",Ce=function(S){if(r.hasTouchStarted=!0,!!D(S)){b(),r.touchData.capture=!0,r.data.bgActivePosistion=void 0;var _=r.cy,W=r.touchData.now,$=r.touchData.earlier;if(S.touches[0]){var Z=r.projectIntoViewport(S.touches[0].clientX,S.touches[0].clientY);W[0]=Z[0],W[1]=Z[1]}if(S.touches[1]){var Z=r.projectIntoViewport(S.touches[1].clientX,S.touches[1].clientY);W[2]=Z[0],W[3]=Z[1]}if(S.touches[2]){var Z=r.projectIntoViewport(S.touches[2].clientX,S.touches[2].clientY);W[4]=Z[0],W[5]=Z[1]}var oe=function(lr){return{originalEvent:S,type:lr,position:{x:W[0],y:W[1]}}};if(S.touches[1]){r.touchData.singleTouchMoved=!0,p(r.dragData.touchDragEles);var ee=r.findContainerClientCoords();z=ee[0],q=ee[1],H=ee[2],Y=ee[3],F=S.touches[0].clientX-z,U=S.touches[0].clientY-q,Q=S.touches[1].clientX-z,K=S.touches[1].clientY-q,te=0<=F&&F<=H&&0<=Q&&Q<=H&&0<=U&&U<=Y&&0<=K&&K<=Y;var ve=_.pan(),le=_.zoom();j=ce(F,U,Q,K),re=Ae(F,U,Q,K),ne=[(F+Q)/2,(U+K)/2],J=[(ne[0]-ve.x)/le,(ne[1]-ve.y)/le];var me=200,De=me*me;if(re=1){for(var mr=r.touchData.startPosition=[null,null,null,null,null,null],Ye=0;Ye=r.touchTapThreshold2}if(_&&r.touchData.cxt){S.preventDefault();var Ye=S.touches[0].clientX-z,ir=S.touches[0].clientY-q,er=S.touches[1].clientX-z,lr=S.touches[1].clientY-q,jr=Ae(Ye,ir,er,lr),Ze=jr/re,Wr=150,$r=Wr*Wr,Ot=1.5,$a=Ot*Ot;if(Ze>=$a||jr>=$r){r.touchData.cxt=!1,r.data.bgActivePosistion=void 0,r.redrawHint("select",!0);var bt=le("cxttapend");r.touchData.start?(r.touchData.start.unactivate().emit(bt),r.touchData.start=null):$.emit(bt)}}if(_&&r.touchData.cxt){var bt=le("cxtdrag");r.data.bgActivePosistion=void 0,r.redrawHint("select",!0),r.touchData.start?r.touchData.start.emit(bt):$.emit(bt),r.touchData.start&&(r.touchData.start._private.grabbed=!1),r.touchData.cxtDragged=!0;var Er=r.findNearestElement(Z[0],Z[1],!0,!0);(!r.touchData.cxtOver||Er!==r.touchData.cxtOver)&&(r.touchData.cxtOver&&r.touchData.cxtOver.emit(le("cxtdragout")),r.touchData.cxtOver=Er,Er&&Er.emit(le("cxtdragover")))}else if(_&&S.touches[2]&&$.boxSelectionEnabled())S.preventDefault(),r.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,r.touchData.selecting||$.emit(le("boxstart")),r.touchData.selecting=!0,r.touchData.didSelect=!0,W[4]=1,!W||W.length===0||W[0]===void 0?(W[0]=(Z[0]+Z[2]+Z[4])/3,W[1]=(Z[1]+Z[3]+Z[5])/3,W[2]=(Z[0]+Z[2]+Z[4])/3+1,W[3]=(Z[1]+Z[3]+Z[5])/3+1):(W[2]=(Z[0]+Z[2]+Z[4])/3,W[3]=(Z[1]+Z[3]+Z[5])/3),r.redrawHint("select",!0),r.redraw();else if(_&&S.touches[1]&&!r.touchData.didSelect&&$.zoomingEnabled()&&$.panningEnabled()&&$.userZoomingEnabled()&&$.userPanningEnabled()){S.preventDefault(),r.data.bgActivePosistion=void 0,r.redrawHint("select",!0);var hr=r.dragData.touchDragEles;if(hr){r.redrawHint("drag",!0);for(var Cr=0;Cr0&&!r.hoverData.draggingEles&&!r.swipePanning&&r.data.bgActivePosistion!=null&&(r.data.bgActivePosistion=void 0,r.redrawHint("select",!0),r.redraw())}},!1);var ye;r.registerBinding(e,"touchcancel",ye=function(S){var _=r.touchData.start;r.touchData.capture=!1,_&&_.unactivate()});var ie,de,he,Ee;if(r.registerBinding(e,"touchend",ie=function(S){var _=r.touchData.start,W=r.touchData.capture;if(W)S.touches.length===0&&(r.touchData.capture=!1),S.preventDefault();else return;var $=r.selection;r.swipePanning=!1,r.hoverData.draggingEles=!1;var Z=r.cy,oe=Z.zoom(),ee=r.touchData.now,ve=r.touchData.earlier;if(S.touches[0]){var le=r.projectIntoViewport(S.touches[0].clientX,S.touches[0].clientY);ee[0]=le[0],ee[1]=le[1]}if(S.touches[1]){var le=r.projectIntoViewport(S.touches[1].clientX,S.touches[1].clientY);ee[2]=le[0],ee[3]=le[1]}if(S.touches[2]){var le=r.projectIntoViewport(S.touches[2].clientX,S.touches[2].clientY);ee[4]=le[0],ee[5]=le[1]}var me=function($r){return{originalEvent:S,type:$r,position:{x:ee[0],y:ee[1]}}};_&&_.unactivate();var De;if(r.touchData.cxt){if(De=me("cxttapend"),_?_.emit(De):Z.emit(De),!r.touchData.cxtDragged){var Te=me("cxttap");_?_.emit(Te):Z.emit(Te)}r.touchData.start&&(r.touchData.start._private.grabbed=!1),r.touchData.cxt=!1,r.touchData.start=null,r.redraw();return}if(!S.touches[2]&&Z.boxSelectionEnabled()&&r.touchData.selecting){r.touchData.selecting=!1;var fe=Z.collection(r.getAllInBox($[0],$[1],$[2],$[3]));$[0]=void 0,$[1]=void 0,$[2]=void 0,$[3]=void 0,$[4]=0,r.redrawHint("select",!0),Z.emit(me("boxend"));var Pe=function($r){return $r.selectable()&&!$r.selected()};fe.emit(me("box")).stdFilter(Pe).select().emit(me("boxselect")),fe.nonempty()&&r.redrawHint("eles",!0),r.redraw()}if(_?.unactivate(),S.touches[2])r.data.bgActivePosistion=void 0,r.redrawHint("select",!0);else if(!S.touches[1]){if(!S.touches[0]){if(!S.touches[0]){r.data.bgActivePosistion=void 0,r.redrawHint("select",!0);var Be=r.dragData.touchDragEles;if(_!=null){var je=_._private.grabbed;p(Be),r.redrawHint("drag",!0),r.redrawHint("eles",!0),je&&(_.emit(me("freeon")),Be.emit(me("free")),r.dragData.didDrag&&(_.emit(me("dragfreeon")),Be.emit(me("dragfree")))),n(_,["touchend","tapend","vmouseup","tapdragout"],S,{x:ee[0],y:ee[1]}),_.unactivate(),r.touchData.start=null}else{var Ke=r.findNearestElement(ee[0],ee[1],!0,!0);n(Ke,["touchend","tapend","vmouseup","tapdragout"],S,{x:ee[0],y:ee[1]})}var mr=r.touchData.startPosition[0]-ee[0],Ye=mr*mr,ir=r.touchData.startPosition[1]-ee[1],er=ir*ir,lr=Ye+er,jr=lr*oe*oe;r.touchData.singleTouchMoved||(_||Z.$(":selected").unselect(["tapunselect"]),n(_,["tap","vclick"],S,{x:ee[0],y:ee[1]}),de=!1,S.timeStamp-Ee<=Z.multiClickDebounceTime()?(he&&clearTimeout(he),de=!0,Ee=null,n(_,["dbltap","vdblclick"],S,{x:ee[0],y:ee[1]})):(he=setTimeout(function(){de||n(_,["onetap","voneclick"],S,{x:ee[0],y:ee[1]})},Z.multiClickDebounceTime()),Ee=S.timeStamp)),_!=null&&!r.dragData.didDrag&&_._private.selectable&&jr"u"){var pe=[],Se=function(S){return{clientX:S.clientX,clientY:S.clientY,force:1,identifier:S.pointerId,pageX:S.pageX,pageY:S.pageY,radiusX:S.width/2,radiusY:S.height/2,screenX:S.screenX,screenY:S.screenY,target:S.target}},Re=function(S){return{event:S,touch:Se(S)}},Oe=function(S){pe.push(Re(S))},Ne=function(S){for(var _=0;_0)return F[0]}return null},d=Object.keys(c),y=0;y0?h:wv(i,s,e,t,a,n,o,l)},checkPoint:function(e,t,a,n,i,s,o,l){l=l==="auto"?vt(n,i):l;var u=2*l;if(Zr(e,t,this.points,s,o,n,i-u,[0,-1],a)||Zr(e,t,this.points,s,o,n-u,i,[0,-1],a))return!0;var v=n/2+2*a,f=i/2+2*a,c=[s-v,o-f,s-v,o,s+v,o,s+v,o-f];return!!(Sr(e,t,c)||Dt(e,t,u,u,s+n/2-l,o+i/2-l,a)||Dt(e,t,u,u,s-n/2+l,o+i/2-l,a))}}};Qr.registerNodeShapes=function(){var r=this.nodeShapes={},e=this;this.generateEllipse(),this.generatePolygon("triangle",br(3,0)),this.generateRoundPolygon("round-triangle",br(3,0)),this.generatePolygon("rectangle",br(4,0)),r.square=r.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();{var t=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",t),this.generateRoundPolygon("round-diamond",t)}this.generatePolygon("pentagon",br(5,0)),this.generateRoundPolygon("round-pentagon",br(5,0)),this.generatePolygon("hexagon",br(6,0)),this.generateRoundPolygon("round-hexagon",br(6,0)),this.generatePolygon("heptagon",br(7,0)),this.generateRoundPolygon("round-heptagon",br(7,0)),this.generatePolygon("octagon",br(8,0)),this.generateRoundPolygon("round-octagon",br(8,0));var a=new Array(20);{var n=Ps(5,0),i=Ps(5,Math.PI/5),s=.5*(3-Math.sqrt(5));s*=1.57;for(var o=0;o=e.deqFastCost*w)break}else if(u){if(m>=e.deqCost*h||m>=e.deqAvgCost*c)break}else if(b>=e.deqNoDrawCost*ws)break;var E=e.deq(a,g,y);if(E.length>0)for(var C=0;C0&&(e.onDeqd(a,d),!u&&e.shouldRedraw(a,d,g,y)&&i())},o=e.priority||js;n.beforeRender(s,o(a))}}}},ny=(function(){function r(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:xn;ht(this,r),this.idsByKey=new Xr,this.keyForId=new Xr,this.cachesByLvl=new Xr,this.lvls=[],this.getKey=e,this.doesEleInvalidateKey=t}return gt(r,[{key:"getIdsFor",value:function(t){t==null&&$e("Can not get id list for null key");var a=this.idsByKey,n=this.idsByKey.get(t);return n||(n=new ra,a.set(t,n)),n}},{key:"addIdForKey",value:function(t,a){t!=null&&this.getIdsFor(t).add(a)}},{key:"deleteIdForKey",value:function(t,a){t!=null&&this.getIdsFor(t).delete(a)}},{key:"getNumberOfIdsForKey",value:function(t){return t==null?0:this.getIdsFor(t).size}},{key:"updateKeyMappingFor",value:function(t){var a=t.id(),n=this.keyForId.get(a),i=this.getKey(t);this.deleteIdForKey(n,a),this.addIdForKey(i,a),this.keyForId.set(a,i)}},{key:"deleteKeyMappingFor",value:function(t){var a=t.id(),n=this.keyForId.get(a);this.deleteIdForKey(n,a),this.keyForId.delete(a)}},{key:"keyHasChangedFor",value:function(t){var a=t.id(),n=this.keyForId.get(a),i=this.getKey(t);return n!==i}},{key:"isInvalid",value:function(t){return this.keyHasChangedFor(t)||this.doesEleInvalidateKey(t)}},{key:"getCachesAt",value:function(t){var a=this.cachesByLvl,n=this.lvls,i=a.get(t);return i||(i=new Xr,a.set(t,i),n.push(t)),i}},{key:"getCache",value:function(t,a){return this.getCachesAt(a).get(t)}},{key:"get",value:function(t,a){var n=this.getKey(t),i=this.getCache(n,a);return i!=null&&this.updateKeyMappingFor(t),i}},{key:"getForCachedKey",value:function(t,a){var n=this.keyForId.get(t.id()),i=this.getCache(n,a);return i}},{key:"hasCache",value:function(t,a){return this.getCachesAt(a).has(t)}},{key:"has",value:function(t,a){var n=this.getKey(t);return this.hasCache(n,a)}},{key:"setCache",value:function(t,a,n){n.key=t,this.getCachesAt(a).set(t,n)}},{key:"set",value:function(t,a,n){var i=this.getKey(t);this.setCache(i,a,n),this.updateKeyMappingFor(t)}},{key:"deleteCache",value:function(t,a){this.getCachesAt(a).delete(t)}},{key:"delete",value:function(t,a){var n=this.getKey(t);this.deleteCache(n,a)}},{key:"invalidateKey",value:function(t){var a=this;this.lvls.forEach(function(n){return a.deleteCache(t,n)})}},{key:"invalidate",value:function(t){var a=t.id(),n=this.keyForId.get(a);this.deleteKeyMappingFor(t);var i=this.doesEleInvalidateKey(t);return i&&this.invalidateKey(n),i||this.getNumberOfIdsForKey(n)===0}}])})(),Nl=25,nn=50,pn=-4,Hs=3,Sf=7.99,iy=8,sy=1024,oy=1024,uy=1024,ly=.2,vy=.8,fy=10,cy=.15,dy=.1,hy=.9,gy=.9,py=100,yy=1,Ut={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},my=cr({getKey:null,doesEleInvalidateKey:xn,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:dv,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),ba=function(e,t){var a=this;a.renderer=e,a.onDequeues=[];var n=my(t);be(a,n),a.lookup=new ny(n.getKey,n.doesEleInvalidateKey),a.setupDequeueing()},nr=ba.prototype;nr.reasons=Ut;nr.getTextureQueue=function(r){var e=this;return e.eleImgCaches=e.eleImgCaches||{},e.eleImgCaches[r]=e.eleImgCaches[r]||[]};nr.getRetiredTextureQueue=function(r){var e=this,t=e.eleImgCaches.retired=e.eleImgCaches.retired||{},a=t[r]=t[r]||[];return a};nr.getElementQueue=function(){var r=this,e=r.eleCacheQueue=r.eleCacheQueue||new Va(function(t,a){return a.reqs-t.reqs});return e};nr.getElementKeyToQueue=function(){var r=this,e=r.eleKeyToCacheQueue=r.eleKeyToCacheQueue||{};return e};nr.getElement=function(r,e,t,a,n){var i=this,s=this.renderer,o=s.cy.zoom(),l=this.lookup;if(!e||e.w===0||e.h===0||isNaN(e.w)||isNaN(e.h)||!r.visible()||r.removed()||!i.allowEdgeTxrCaching&&r.isEdge()||!i.allowParentTxrCaching&&r.isParent())return null;if(a==null&&(a=Math.ceil(ro(o*t))),a=Sf||a>Hs)return null;var u=Math.pow(2,a),v=e.h*u,f=e.w*u,c=s.eleTextBiggerThanMin(r,u);if(!this.isVisible(r,c))return null;var h=l.get(r,a);if(h&&h.invalidated&&(h.invalidated=!1,h.texture.invalidatedWidth-=h.width),h)return h;var d;if(v<=Nl?d=Nl:v<=nn?d=nn:d=Math.ceil(v/nn)*nn,v>uy||f>oy)return null;var y=i.getTextureQueue(d),g=y[y.length-2],p=function(){return i.recycleTexture(d,f)||i.addTexture(d,f)};g||(g=y[y.length-1]),g||(g=p()),g.width-g.usedWidtha;B--)k=i.getElement(r,e,t,B,Ut.downscale);D()}else return i.queueElement(r,C.level-1),C;else{var P;if(!b&&!w&&!E)for(var A=a-1;A>=pn;A--){var R=l.get(r,A);if(R){P=R;break}}if(m(P))return i.queueElement(r,a),P;g.context.translate(g.usedWidth,0),g.context.scale(u,u),this.drawElement(g.context,r,e,c,!1),g.context.scale(1/u,1/u),g.context.translate(-g.usedWidth,0)}return h={x:g.usedWidth,texture:g,level:a,scale:u,width:f,height:v,scaledLabelShown:c},g.usedWidth+=Math.ceil(f+iy),g.eleCaches.push(h),l.set(r,a,h),i.checkTextureFullness(g),h};nr.invalidateElements=function(r){for(var e=0;e=ly*r.width&&this.retireTexture(r)};nr.checkTextureFullness=function(r){var e=this,t=e.getTextureQueue(r.height);r.usedWidth/r.width>vy&&r.fullnessChecks>=fy?lt(t,r):r.fullnessChecks++};nr.retireTexture=function(r){var e=this,t=r.height,a=e.getTextureQueue(t),n=this.lookup;lt(a,r),r.retired=!0;for(var i=r.eleCaches,s=0;s=e)return s.retired=!1,s.usedWidth=0,s.invalidatedWidth=0,s.fullnessChecks=0,eo(s.eleCaches),s.context.setTransform(1,0,0,1,0,0),s.context.clearRect(0,0,s.width,s.height),lt(n,s),a.push(s),s}};nr.queueElement=function(r,e){var t=this,a=t.getElementQueue(),n=t.getElementKeyToQueue(),i=this.getKey(r),s=n[i];if(s)s.level=Math.max(s.level,e),s.eles.merge(r),s.reqs++,a.updateItem(s);else{var o={eles:r.spawn().merge(r),level:e,reqs:1,key:i};a.push(o),n[i]=o}};nr.dequeue=function(r){for(var e=this,t=e.getElementQueue(),a=e.getElementKeyToQueue(),n=[],i=e.lookup,s=0;s0;s++){var o=t.pop(),l=o.key,u=o.eles[0],v=i.hasCache(u,o.level);if(a[l]=null,v)continue;n.push(o);var f=e.getBoundingBox(u);e.getElement(u,f,r,o.level,Ut.dequeue)}return n};nr.removeFromQueue=function(r){var e=this,t=e.getElementQueue(),a=e.getElementKeyToQueue(),n=this.getKey(r),i=a[n];i!=null&&(i.eles.length===1?(i.reqs=Js,t.updateItem(i),t.pop(),a[n]=null):i.eles.unmerge(r))};nr.onDequeue=function(r){this.onDequeues.push(r)};nr.offDequeue=function(r){lt(this.onDequeues,r)};nr.setupDequeueing=Tf.setupDequeueing({deqRedrawThreshold:py,deqCost:cy,deqAvgCost:dy,deqNoDrawCost:hy,deqFastCost:gy,deq:function(e,t,a){return e.dequeue(t,a)},onDeqd:function(e,t){for(var a=0;a=wy||t>Pn)return null}a.validateLayersElesOrdering(t,r);var l=a.layersByLevel,u=Math.pow(2,t),v=l[t]=l[t]||[],f,c=a.levelIsComplete(t,r),h,d=function(){var D=function(L){if(a.validateLayersElesOrdering(L,r),a.levelIsComplete(L,r))return h=l[L],!0},B=function(L){if(!h)for(var I=t+L;xa<=I&&I<=Pn&&!D(I);I+=L);};B(1),B(-1);for(var P=v.length-1;P>=0;P--){var A=v[P];A.invalid&<(v,A)}};if(!c)d();else return v;var y=function(){if(!f){f=wr();for(var D=0;DFl||A>Fl)return null;var R=P*A;if(R>By)return null;var L=a.makeLayer(f,t);if(B!=null){var I=v.indexOf(B)+1;v.splice(I,0,L)}else(D.insert===void 0||D.insert)&&v.unshift(L);return L};if(a.skipping&&!o)return null;for(var p=null,m=r.length/by,b=!o,w=0;w=m||!bv(p.bb,E.boundingBox()))&&(p=g({insert:!0,after:p}),!p))return null;h||b?a.queueLayer(p,E):a.drawEleInLayer(p,E,t,e),p.eles.push(E),x[t]=p}return h||(b?null:v)};dr.getEleLevelForLayerLevel=function(r,e){return r};dr.drawEleInLayer=function(r,e,t,a){var n=this,i=this.renderer,s=r.context,o=e.boundingBox();o.w===0||o.h===0||!e.visible()||(t=n.getEleLevelForLayerLevel(t,a),i.setImgSmoothing(s,!1),i.drawCachedElement(s,e,null,null,t,Py),i.setImgSmoothing(s,!0))};dr.levelIsComplete=function(r,e){var t=this,a=t.layersByLevel[r];if(!a||a.length===0)return!1;for(var n=0,i=0;i0||s.invalid)return!1;n+=s.eles.length}return n===e.length};dr.validateLayersElesOrdering=function(r,e){var t=this.layersByLevel[r];if(t)for(var a=0;a0){e=!0;break}}return e};dr.invalidateElements=function(r){var e=this;r.length!==0&&(e.lastInvalidationTime=Yr(),!(r.length===0||!e.haveLayers())&&e.updateElementsInLayers(r,function(a,n,i){e.invalidateLayer(a)}))};dr.invalidateLayer=function(r){if(this.lastInvalidationTime=Yr(),!r.invalid){var e=r.level,t=r.eles,a=this.layersByLevel[e];lt(a,r),r.elesQueue=[],r.invalid=!0,r.replacement&&(r.replacement.invalid=!0);for(var n=0;n3&&arguments[3]!==void 0?arguments[3]:!0,n=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,i=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,o=e._private.rscratch;if(!(i&&!e.visible())&&!(o.badLine||o.allpts==null||isNaN(o.allpts[0]))){var l;t&&(l=t,r.translate(-l.x1,-l.y1));var u=i?e.pstyle("opacity").value:1,v=i?e.pstyle("line-opacity").value:1,f=e.pstyle("curve-style").value,c=e.pstyle("line-style").value,h=e.pstyle("width").pfValue,d=e.pstyle("line-cap").value,y=e.pstyle("line-outline-width").value,g=e.pstyle("line-outline-color").value,p=u*v,m=u*v,b=function(){var L=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p;f==="straight-triangle"?(s.eleStrokeStyle(r,e,L),s.drawEdgeTrianglePath(e,r,o.allpts)):(r.lineWidth=h,r.lineCap=d,s.eleStrokeStyle(r,e,L),s.drawEdgePath(e,r,o.allpts,c),r.lineCap="butt")},w=function(){var L=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p;if(r.lineWidth=h+y,r.lineCap=d,y>0)s.colorStrokeStyle(r,g[0],g[1],g[2],L);else{r.lineCap="butt";return}f==="straight-triangle"?s.drawEdgeTrianglePath(e,r,o.allpts):(s.drawEdgePath(e,r,o.allpts,c),r.lineCap="butt")},E=function(){n&&s.drawEdgeOverlay(r,e)},C=function(){n&&s.drawEdgeUnderlay(r,e)},x=function(){var L=arguments.length>0&&arguments[0]!==void 0?arguments[0]:m;s.drawArrowheads(r,e,L)},T=function(){s.drawElementText(r,e,null,a)};r.lineJoin="round";var k=e.pstyle("ghost").value==="yes";if(k){var D=e.pstyle("ghost-offset-x").pfValue,B=e.pstyle("ghost-offset-y").pfValue,P=e.pstyle("ghost-opacity").value,A=p*P;r.translate(D,B),b(A),x(A),r.translate(-D,-B)}else w();C(),b(),x(),E(),T(),t&&r.translate(l.x1,l.y1)}};var Bf=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,a){if(a.visible()){var n=a.pstyle("".concat(e,"-opacity")).value;if(n!==0){var i=this,s=i.usePaths(),o=a._private.rscratch,l=a.pstyle("".concat(e,"-padding")).pfValue,u=2*l,v=a.pstyle("".concat(e,"-color")).value;t.lineWidth=u,o.edgeType==="self"&&!s?t.lineCap="butt":t.lineCap="round",i.colorStrokeStyle(t,v[0],v[1],v[2],n),i.drawEdgePath(a,t,o.allpts,"solid")}}}};Jr.drawEdgeOverlay=Bf("overlay");Jr.drawEdgeUnderlay=Bf("underlay");Jr.drawEdgePath=function(r,e,t,a){var n=r._private.rscratch,i=e,s,o=!1,l=this.usePaths(),u=r.pstyle("line-dash-pattern").pfValue,v=r.pstyle("line-dash-offset").pfValue;if(l){var f=t.join("$"),c=n.pathCacheKey&&n.pathCacheKey===f;c?(s=e=n.pathCache,o=!0):(s=e=new Path2D,n.pathCacheKey=f,n.pathCache=s)}if(i.setLineDash)switch(a){case"dotted":i.setLineDash([1,1]);break;case"dashed":i.setLineDash(u),i.lineDashOffset=v;break;case"solid":i.setLineDash([]);break}if(!o&&!n.badLine)switch(e.beginPath&&e.beginPath(),e.moveTo(t[0],t[1]),n.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var h=2;h+35&&arguments[5]!==void 0?arguments[5]:!0,s=this;if(a==null){if(i&&!s.eleTextBiggerThanMin(e))return}else if(a===!1)return;if(e.isNode()){var o=e.pstyle("label");if(!o||!o.value)return;var l=s.getLabelJustification(e);r.textAlign=l,r.textBaseline="bottom"}else{var u=e.element()._private.rscratch.badLine,v=e.pstyle("label"),f=e.pstyle("source-label"),c=e.pstyle("target-label");if(u||(!v||!v.value)&&(!f||!f.value)&&(!c||!c.value))return;r.textAlign="center",r.textBaseline="bottom"}var h=!t,d;t&&(d=t,r.translate(-d.x1,-d.y1)),n==null?(s.drawText(r,e,null,h,i),e.isEdge()&&(s.drawText(r,e,"source",h,i),s.drawText(r,e,"target",h,i))):s.drawText(r,e,n,h,i),t&&r.translate(d.x1,d.y1)};It.getFontCache=function(r){var e;this.fontCaches=this.fontCaches||[];for(var t=0;t2&&arguments[2]!==void 0?arguments[2]:!0,a=e.pstyle("font-style").strValue,n=e.pstyle("font-size").pfValue+"px",i=e.pstyle("font-family").strValue,s=e.pstyle("font-weight").strValue,o=t?e.effectiveOpacity()*e.pstyle("text-opacity").value:1,l=e.pstyle("text-outline-opacity").value*o,u=e.pstyle("color").value,v=e.pstyle("text-outline-color").value;r.font=a+" "+s+" "+n+" "+i,r.lineJoin="round",this.colorFillStyle(r,u[0],u[1],u[2],o),this.colorStrokeStyle(r,v[0],v[1],v[2],l)};function qy(r,e,t,a,n){var i=Math.min(a,n),s=i/2,o=e+a/2,l=t+n/2;r.beginPath(),r.arc(o,l,s,0,Math.PI*2),r.closePath()}function Gl(r,e,t,a,n){var i=arguments.length>5&&arguments[5]!==void 0?arguments[5]:5,s=Math.min(i,a/2,n/2);r.beginPath(),r.moveTo(e+s,t),r.lineTo(e+a-s,t),r.quadraticCurveTo(e+a,t,e+a,t+s),r.lineTo(e+a,t+n-s),r.quadraticCurveTo(e+a,t+n,e+a-s,t+n),r.lineTo(e+s,t+n),r.quadraticCurveTo(e,t+n,e,t+n-s),r.lineTo(e,t+s),r.quadraticCurveTo(e,t,e+s,t),r.closePath()}It.getTextAngle=function(r,e){var t,a=r._private,n=a.rscratch,i=e?e+"-":"",s=r.pstyle(i+"text-rotation");if(s.strValue==="autorotate"){var o=Tr(n,"labelAngle",e);t=r.isEdge()?o:0}else s.strValue==="none"?t=0:t=s.pfValue;return t};It.drawText=function(r,e,t){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,n=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,i=e._private,s=i.rscratch,o=n?e.effectiveOpacity():1;if(!(n&&(o===0||e.pstyle("text-opacity").value===0))){t==="main"&&(t=null);var l=Tr(s,"labelX",t),u=Tr(s,"labelY",t),v,f,c=this.getLabelText(e,t);if(c!=null&&c!==""&&!isNaN(l)&&!isNaN(u)){this.setupTextStyle(r,e,n);var h=t?t+"-":"",d=Tr(s,"labelWidth",t),y=Tr(s,"labelHeight",t),g=e.pstyle(h+"text-margin-x").pfValue,p=e.pstyle(h+"text-margin-y").pfValue,m=e.isEdge(),b=e.pstyle("text-halign").value,w=e.pstyle("text-valign").value;m&&(b="center",w="center"),l+=g,u+=p;var E;switch(a?E=this.getTextAngle(e,t):E=0,E!==0&&(v=l,f=u,r.translate(v,f),r.rotate(E),l=0,u=0),w){case"top":break;case"center":u+=y/2;break;case"bottom":u+=y;break}var C=e.pstyle("text-background-opacity").value,x=e.pstyle("text-border-opacity").value,T=e.pstyle("text-border-width").pfValue,k=e.pstyle("text-background-padding").pfValue,D=e.pstyle("text-background-shape").strValue,B=D==="round-rectangle"||D==="roundrectangle",P=D==="circle",A=2;if(C>0||T>0&&x>0){var R=r.fillStyle,L=r.strokeStyle,I=r.lineWidth,M=e.pstyle("text-background-color").value,O=e.pstyle("text-border-color").value,V=e.pstyle("text-border-style").value,G=C>0,N=T>0&&x>0,F=l-k;switch(b){case"left":F-=d;break;case"center":F-=d/2;break}var U=u-y-k,Q=d+2*k,K=y+2*k;if(G&&(r.fillStyle="rgba(".concat(M[0],",").concat(M[1],",").concat(M[2],",").concat(C*o,")")),N&&(r.strokeStyle="rgba(".concat(O[0],",").concat(O[1],",").concat(O[2],",").concat(x*o,")"),r.lineWidth=T,r.setLineDash))switch(V){case"dotted":r.setLineDash([1,1]);break;case"dashed":r.setLineDash([4,2]);break;case"double":r.lineWidth=T/4,r.setLineDash([]);break;default:r.setLineDash([]);break}if(B?(r.beginPath(),Gl(r,F,U,Q,K,A)):P?(r.beginPath(),qy(r,F,U,Q,K)):(r.beginPath(),r.rect(F,U,Q,K)),G&&r.fill(),N&&r.stroke(),N&&V==="double"){var j=T/2;r.beginPath(),B?Gl(r,F+j,U+j,Q-2*j,K-2*j,A):r.rect(F+j,U+j,Q-2*j,K-2*j),r.stroke()}r.fillStyle=R,r.strokeStyle=L,r.lineWidth=I,r.setLineDash&&r.setLineDash([])}var re=2*e.pstyle("text-outline-width").pfValue;if(re>0&&(r.lineWidth=re),e.pstyle("text-wrap").value==="wrap"){var ne=Tr(s,"labelWrapCachedLines",t),J=Tr(s,"labelLineHeight",t),z=d/2,q=this.getLabelJustification(e);switch(q==="auto"||(b==="left"?q==="left"?l+=-d:q==="center"&&(l+=-z):b==="center"?q==="left"?l+=-z:q==="right"&&(l+=z):b==="right"&&(q==="center"?l+=z:q==="right"&&(l+=d))),w){case"top":u-=(ne.length-1)*J;break;case"center":case"bottom":u-=(ne.length-1)*J;break}for(var H=0;H0&&r.strokeText(ne[H],l,u),r.fillText(ne[H],l,u),u+=J}else re>0&&r.strokeText(c,l,u),r.fillText(c,l,u);E!==0&&(r.rotate(-E),r.translate(-v,-f))}}};var yt={};yt.drawNode=function(r,e,t){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,n=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,i=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,o,l,u=e._private,v=u.rscratch,f=e.position();if(!(!ae(f.x)||!ae(f.y))&&!(i&&!e.visible())){var c=i?e.effectiveOpacity():1,h=s.usePaths(),d,y=!1,g=e.padding();o=e.width()+2*g,l=e.height()+2*g;var p;t&&(p=t,r.translate(-p.x1,-p.y1));for(var m=e.pstyle("background-image"),b=m.value,w=new Array(b.length),E=new Array(b.length),C=0,x=0;x0&&arguments[0]!==void 0?arguments[0]:A;s.eleFillStyle(r,e,ue)},J=function(){var ue=arguments.length>0&&arguments[0]!==void 0?arguments[0]:N;s.colorStrokeStyle(r,R[0],R[1],R[2],ue)},z=function(){var ue=arguments.length>0&&arguments[0]!==void 0?arguments[0]:K;s.colorStrokeStyle(r,U[0],U[1],U[2],ue)},q=function(ue,X,S,_){var W=s.nodePathCache=s.nodePathCache||[],$=cv(S==="polygon"?S+","+_.join(","):S,""+X,""+ue,""+re),Z=W[$],oe,ee=!1;return Z!=null?(oe=Z,ee=!0,v.pathCache=oe):(oe=new Path2D,W[$]=v.pathCache=oe),{path:oe,cacheHit:ee}},H=e.pstyle("shape").strValue,Y=e.pstyle("shape-polygon-points").pfValue;if(h){r.translate(f.x,f.y);var te=q(o,l,H,Y);d=te.path,y=te.cacheHit}var ce=function(){if(!y){var ue=f;h&&(ue={x:0,y:0}),s.nodeShapes[s.getNodeShape(e)].draw(d||r,ue.x,ue.y,o,l,re,v)}h?r.fill(d):r.fill()},Ae=function(){for(var ue=arguments.length>0&&arguments[0]!==void 0?arguments[0]:c,X=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,S=u.backgrounding,_=0,W=0;W0&&arguments[0]!==void 0?arguments[0]:!1,X=arguments.length>1&&arguments[1]!==void 0?arguments[1]:c;s.hasPie(e)&&(s.drawPie(r,e,X),ue&&(h||s.nodeShapes[s.getNodeShape(e)].draw(r,f.x,f.y,o,l,re,v)))},we=function(){var ue=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,X=arguments.length>1&&arguments[1]!==void 0?arguments[1]:c;s.hasStripe(e)&&(r.save(),h?r.clip(v.pathCache):(s.nodeShapes[s.getNodeShape(e)].draw(r,f.x,f.y,o,l,re,v),r.clip()),s.drawStripe(r,e,X),r.restore(),ue&&(h||s.nodeShapes[s.getNodeShape(e)].draw(r,f.x,f.y,o,l,re,v)))},ye=function(){var ue=arguments.length>0&&arguments[0]!==void 0?arguments[0]:c,X=(B>0?B:-B)*ue,S=B>0?0:255;B!==0&&(s.colorFillStyle(r,S,S,S,X),h?r.fill(d):r.fill())},ie=function(){if(P>0){if(r.lineWidth=P,r.lineCap=M,r.lineJoin=I,r.setLineDash)switch(L){case"dotted":r.setLineDash([1,1]);break;case"dashed":r.setLineDash(V),r.lineDashOffset=G;break;case"solid":case"double":r.setLineDash([]);break}if(O!=="center"){if(r.save(),r.lineWidth*=2,O==="inside")h?r.clip(d):r.clip();else{var ue=new Path2D;ue.rect(-o/2-P,-l/2-P,o+2*P,l+2*P),ue.addPath(d),r.clip(ue,"evenodd")}h?r.stroke(d):r.stroke(),r.restore()}else h?r.stroke(d):r.stroke();if(L==="double"){r.lineWidth=P/3;var X=r.globalCompositeOperation;r.globalCompositeOperation="destination-out",h?r.stroke(d):r.stroke(),r.globalCompositeOperation=X}r.setLineDash&&r.setLineDash([])}},de=function(){if(F>0){if(r.lineWidth=F,r.lineCap="butt",r.setLineDash)switch(Q){case"dotted":r.setLineDash([1,1]);break;case"dashed":r.setLineDash([4,2]);break;case"solid":case"double":r.setLineDash([]);break}var ue=f;h&&(ue={x:0,y:0});var X=s.getNodeShape(e),S=P;O==="inside"&&(S=0),O==="outside"&&(S*=2);var _=(o+S+(F+j))/o,W=(l+S+(F+j))/l,$=o*_,Z=l*W,oe=s.nodeShapes[X].points,ee;if(h){var ve=q($,Z,X,oe);ee=ve.path}if(X==="ellipse")s.drawEllipsePath(ee||r,ue.x,ue.y,$,Z);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(X)){var le=0,me=0,De=0;X==="round-diamond"?le=(S+j+F)*1.4:X==="round-heptagon"?(le=(S+j+F)*1.075,De=-(S/2+j+F)/35):X==="round-hexagon"?le=(S+j+F)*1.12:X==="round-pentagon"?(le=(S+j+F)*1.13,De=-(S/2+j+F)/15):X==="round-tag"?(le=(S+j+F)*1.12,me=(S/2+F+j)*.07):X==="round-triangle"&&(le=(S+j+F)*(Math.PI/2),De=-(S+j/2+F)/Math.PI),le!==0&&(_=(o+le)/o,$=o*_,["round-hexagon","round-tag"].includes(X)||(W=(l+le)/l,Z=l*W)),re=re==="auto"?Ev($,Z):re;for(var Te=$/2,fe=Z/2,Pe=re+(S+F+j)/2,Be=new Array(oe.length/2),je=new Array(oe.length/2),Ke=0;Ke0){if(n=n||a.position(),i==null||s==null){var h=a.padding();i=a.width()+2*h,s=a.height()+2*h}o.colorFillStyle(t,v[0],v[1],v[2],u),o.nodeShapes[f].draw(t,n.x,n.y,i+l*2,s+l*2,c),t.fill()}}}};yt.drawNodeOverlay=Pf("overlay");yt.drawNodeUnderlay=Pf("underlay");yt.hasPie=function(r){return r=r[0],r._private.hasPie};yt.hasStripe=function(r){return r=r[0],r._private.hasStripe};yt.drawPie=function(r,e,t,a){e=e[0],a=a||e.position();var n=e.cy().style(),i=e.pstyle("pie-size"),s=e.pstyle("pie-hole"),o=e.pstyle("pie-start-angle").pfValue,l=a.x,u=a.y,v=e.width(),f=e.height(),c=Math.min(v,f)/2,h,d=0,y=this.usePaths();if(y&&(l=0,u=0),i.units==="%"?c=c*i.pfValue:i.pfValue!==void 0&&(c=i.pfValue/2),s.units==="%"?h=c*s.pfValue:s.pfValue!==void 0&&(h=s.pfValue/2),!(h>=c))for(var g=1;g<=n.pieBackgroundN;g++){var p=e.pstyle("pie-"+g+"-background-size").value,m=e.pstyle("pie-"+g+"-background-color").value,b=e.pstyle("pie-"+g+"-background-opacity").value*t,w=p/100;w+d>1&&(w=1-d);var E=1.5*Math.PI+2*Math.PI*d;E+=o;var C=2*Math.PI*w,x=E+C;p===0||d>=1||d+w>1||(h===0?(r.beginPath(),r.moveTo(l,u),r.arc(l,u,c,E,x),r.closePath()):(r.beginPath(),r.arc(l,u,c,E,x),r.arc(l,u,h,x,E,!0),r.closePath()),this.colorFillStyle(r,m[0],m[1],m[2],b),r.fill(),d+=w)}};yt.drawStripe=function(r,e,t,a){e=e[0],a=a||e.position();var n=e.cy().style(),i=a.x,s=a.y,o=e.width(),l=e.height(),u=0,v=this.usePaths();r.save();var f=e.pstyle("stripe-direction").value,c=e.pstyle("stripe-size");switch(f){case"vertical":break;case"righward":r.rotate(-Math.PI/2);break}var h=o,d=l;c.units==="%"?(h=h*c.pfValue,d=d*c.pfValue):c.pfValue!==void 0&&(h=c.pfValue,d=c.pfValue),v&&(i=0,s=0),s-=h/2,i-=d/2;for(var y=1;y<=n.stripeBackgroundN;y++){var g=e.pstyle("stripe-"+y+"-background-size").value,p=e.pstyle("stripe-"+y+"-background-color").value,m=e.pstyle("stripe-"+y+"-background-opacity").value*t,b=g/100;b+u>1&&(b=1-u),!(g===0||u>=1||u+b>1)&&(r.beginPath(),r.rect(i,s+d*u,h,d*b),r.closePath(),this.colorFillStyle(r,p[0],p[1],p[2],m),r.fill(),u+=b)}r.restore()};var xr={},_y=100;xr.getPixelRatio=function(){var r=this.data.contexts[0];if(this.forcedPixelRatio!=null)return this.forcedPixelRatio;var e=this.cy.window(),t=r.backingStorePixelRatio||r.webkitBackingStorePixelRatio||r.mozBackingStorePixelRatio||r.msBackingStorePixelRatio||r.oBackingStorePixelRatio||r.backingStorePixelRatio||1;return(e.devicePixelRatio||1)/t};xr.paintCache=function(r){for(var e=this.paintCaches=this.paintCaches||[],t=!0,a,n=0;ne.minMbLowQualFrames&&(e.motionBlurPxRatio=e.mbPxRBlurry)),e.clearingMotionBlur&&(e.motionBlurPxRatio=1),e.textureDrawLastFrame&&!f&&(v[e.NODE]=!0,v[e.SELECT_BOX]=!0);var m=t.style(),b=t.zoom(),w=s!==void 0?s:b,E=t.pan(),C={x:E.x,y:E.y},x={zoom:b,pan:{x:E.x,y:E.y}},T=e.prevViewport,k=T===void 0||x.zoom!==T.zoom||x.pan.x!==T.pan.x||x.pan.y!==T.pan.y;!k&&!(y&&!d)&&(e.motionBlurPxRatio=1),o&&(C=o),w*=l,C.x*=l,C.y*=l;var D=e.getCachedZSortedEles();function B(J,z,q,H,Y){var te=J.globalCompositeOperation;J.globalCompositeOperation="destination-out",e.colorFillStyle(J,255,255,255,e.motionBlurTransparency),J.fillRect(z,q,H,Y),J.globalCompositeOperation=te}function P(J,z){var q,H,Y,te;!e.clearingMotionBlur&&(J===u.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]||J===u.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG])?(q={x:E.x*h,y:E.y*h},H=b*h,Y=e.canvasWidth*h,te=e.canvasHeight*h):(q=C,H=w,Y=e.canvasWidth,te=e.canvasHeight),J.setTransform(1,0,0,1,0,0),z==="motionBlur"?B(J,0,0,Y,te):!a&&(z===void 0||z)&&J.clearRect(0,0,Y,te),n||(J.translate(q.x,q.y),J.scale(H,H)),o&&J.translate(o.x,o.y),s&&J.scale(s,s)}if(f||(e.textureDrawLastFrame=!1),f){if(e.textureDrawLastFrame=!0,!e.textureCache){e.textureCache={},e.textureCache.bb=t.mutableElements().boundingBox(),e.textureCache.texture=e.data.bufferCanvases[e.TEXTURE_BUFFER];var A=e.data.bufferContexts[e.TEXTURE_BUFFER];A.setTransform(1,0,0,1,0,0),A.clearRect(0,0,e.canvasWidth*e.textureMult,e.canvasHeight*e.textureMult),e.render({forcedContext:A,drawOnlyNodeLayer:!0,forcedPxRatio:l*e.textureMult});var x=e.textureCache.viewport={zoom:t.zoom(),pan:t.pan(),width:e.canvasWidth,height:e.canvasHeight};x.mpan={x:(0-x.pan.x)/x.zoom,y:(0-x.pan.y)/x.zoom}}v[e.DRAG]=!1,v[e.NODE]=!1;var R=u.contexts[e.NODE],L=e.textureCache.texture,x=e.textureCache.viewport;R.setTransform(1,0,0,1,0,0),c?B(R,0,0,x.width,x.height):R.clearRect(0,0,x.width,x.height);var I=m.core("outside-texture-bg-color").value,M=m.core("outside-texture-bg-opacity").value;e.colorFillStyle(R,I[0],I[1],I[2],M),R.fillRect(0,0,x.width,x.height);var b=t.zoom();P(R,!1),R.clearRect(x.mpan.x,x.mpan.y,x.width/x.zoom/l,x.height/x.zoom/l),R.drawImage(L,x.mpan.x,x.mpan.y,x.width/x.zoom/l,x.height/x.zoom/l)}else e.textureOnViewport&&!a&&(e.textureCache=null);var O=t.extent(),V=e.pinching||e.hoverData.dragging||e.swipePanning||e.data.wheelZooming||e.hoverData.draggingEles||e.cy.animated(),G=e.hideEdgesOnViewport&&V,N=[];if(N[e.NODE]=!v[e.NODE]&&c&&!e.clearedForMotionBlur[e.NODE]||e.clearingMotionBlur,N[e.NODE]&&(e.clearedForMotionBlur[e.NODE]=!0),N[e.DRAG]=!v[e.DRAG]&&c&&!e.clearedForMotionBlur[e.DRAG]||e.clearingMotionBlur,N[e.DRAG]&&(e.clearedForMotionBlur[e.DRAG]=!0),v[e.NODE]||n||i||N[e.NODE]){var F=c&&!N[e.NODE]&&h!==1,R=a||(F?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]:u.contexts[e.NODE]),U=c&&!F?"motionBlur":void 0;P(R,U),G?e.drawCachedNodes(R,D.nondrag,l,O):e.drawLayeredElements(R,D.nondrag,l,O),e.debug&&e.drawDebugPoints(R,D.nondrag),!n&&!c&&(v[e.NODE]=!1)}if(!i&&(v[e.DRAG]||n||N[e.DRAG])){var F=c&&!N[e.DRAG]&&h!==1,R=a||(F?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG]:u.contexts[e.DRAG]);P(R,c&&!F?"motionBlur":void 0),G?e.drawCachedNodes(R,D.drag,l,O):e.drawCachedElements(R,D.drag,l,O),e.debug&&e.drawDebugPoints(R,D.drag),!n&&!c&&(v[e.DRAG]=!1)}if(this.drawSelectionRectangle(r,P),c&&h!==1){var Q=u.contexts[e.NODE],K=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_NODE],j=u.contexts[e.DRAG],re=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_DRAG],ne=function(z,q,H){z.setTransform(1,0,0,1,0,0),H||!p?z.clearRect(0,0,e.canvasWidth,e.canvasHeight):B(z,0,0,e.canvasWidth,e.canvasHeight);var Y=h;z.drawImage(q,0,0,e.canvasWidth*Y,e.canvasHeight*Y,0,0,e.canvasWidth,e.canvasHeight)};(v[e.NODE]||N[e.NODE])&&(ne(Q,K,N[e.NODE]),v[e.NODE]=!1),(v[e.DRAG]||N[e.DRAG])&&(ne(j,re,N[e.DRAG]),v[e.DRAG]=!1)}e.prevViewport=x,e.clearingMotionBlur&&(e.clearingMotionBlur=!1,e.motionBlurCleared=!0,e.motionBlur=!0),c&&(e.motionBlurTimeout=setTimeout(function(){e.motionBlurTimeout=null,e.clearedForMotionBlur[e.NODE]=!1,e.clearedForMotionBlur[e.DRAG]=!1,e.motionBlur=!1,e.clearingMotionBlur=!f,e.mbFrames=0,v[e.NODE]=!0,v[e.DRAG]=!0,e.redraw()},_y)),a||t.emit("render")};var ha;xr.drawSelectionRectangle=function(r,e){var t=this,a=t.cy,n=t.data,i=a.style(),s=r.drawOnlyNodeLayer,o=r.drawAllLayers,l=n.canvasNeedsRedraw,u=r.forcedContext;if(t.showFps||!s&&l[t.SELECT_BOX]&&!o){var v=u||n.contexts[t.SELECT_BOX];if(e(v),t.selection[4]==1&&(t.hoverData.selecting||t.touchData.selecting)){var f=t.cy.zoom(),c=i.core("selection-box-border-width").value/f;v.lineWidth=c,v.fillStyle="rgba("+i.core("selection-box-color").value[0]+","+i.core("selection-box-color").value[1]+","+i.core("selection-box-color").value[2]+","+i.core("selection-box-opacity").value+")",v.fillRect(t.selection[0],t.selection[1],t.selection[2]-t.selection[0],t.selection[3]-t.selection[1]),c>0&&(v.strokeStyle="rgba("+i.core("selection-box-border-color").value[0]+","+i.core("selection-box-border-color").value[1]+","+i.core("selection-box-border-color").value[2]+","+i.core("selection-box-opacity").value+")",v.strokeRect(t.selection[0],t.selection[1],t.selection[2]-t.selection[0],t.selection[3]-t.selection[1]))}if(n.bgActivePosistion&&!t.hoverData.selecting){var f=t.cy.zoom(),h=n.bgActivePosistion;v.fillStyle="rgba("+i.core("active-bg-color").value[0]+","+i.core("active-bg-color").value[1]+","+i.core("active-bg-color").value[2]+","+i.core("active-bg-opacity").value+")",v.beginPath(),v.arc(h.x,h.y,i.core("active-bg-size").pfValue/f,0,2*Math.PI),v.fill()}var d=t.lastRedrawTime;if(t.showFps&&d){d=Math.round(d);var y=Math.round(1e3/d),g="1 frame = "+d+" ms = "+y+" fps";if(v.setTransform(1,0,0,1,0,0),v.fillStyle="rgba(255, 0, 0, 0.75)",v.strokeStyle="rgba(255, 0, 0, 0.75)",v.font="30px Arial",!ha){var p=v.measureText(g);ha=p.actualBoundingBoxAscent}v.fillText(g,0,ha);var m=60;v.strokeRect(0,ha+10,250,20),v.fillRect(0,ha+10,250*Math.min(y/m,1),20)}o||(l[t.SELECT_BOX]=!1)}};function Hl(r,e,t){var a=r.createShader(e);if(r.shaderSource(a,t),r.compileShader(a),!r.getShaderParameter(a,r.COMPILE_STATUS))throw new Error(r.getShaderInfoLog(a));return a}function Gy(r,e,t){var a=Hl(r,r.VERTEX_SHADER,e),n=Hl(r,r.FRAGMENT_SHADER,t),i=r.createProgram();if(r.attachShader(i,a),r.attachShader(i,n),r.linkProgram(i),!r.getProgramParameter(i,r.LINK_STATUS))throw new Error("Could not initialize shaders");return i}function Hy(r,e,t){t===void 0&&(t=e);var a=r.makeOffscreenCanvas(e,t),n=a.context=a.getContext("2d");return a.clear=function(){return n.clearRect(0,0,a.width,a.height)},a.clear(),a}function bo(r){var e=r.pixelRatio,t=r.cy.zoom(),a=r.cy.pan();return{zoom:t*e,pan:{x:a.x*e,y:a.y*e}}}function Wy(r){var e=r.pixelRatio,t=r.cy.zoom();return t*e}function $y(r,e,t,a,n){var i=a*t+e.x,s=n*t+e.y;return s=Math.round(r.canvasHeight-s),[i,s]}function Uy(r){return r.pstyle("background-fill").value!=="solid"||r.pstyle("background-image").strValue!=="none"?!1:r.pstyle("border-width").value===0||r.pstyle("border-opacity").value===0?!0:r.pstyle("border-style").value==="solid"}function Ky(r,e){if(r.length!==e.length)return!1;for(var t=0;t>0&255)/255,t[1]=(r>>8&255)/255,t[2]=(r>>16&255)/255,t[3]=(r>>24&255)/255,t}function Xy(r){return r[0]+(r[1]<<8)+(r[2]<<16)+(r[3]<<24)}function Yy(r,e){var t=r.createTexture();return t.buffer=function(a){r.bindTexture(r.TEXTURE_2D,t),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR_MIPMAP_NEAREST),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,a),r.generateMipmap(r.TEXTURE_2D),r.bindTexture(r.TEXTURE_2D,null)},t.deleteTexture=function(){r.deleteTexture(t)},t}function Af(r,e){switch(e){case"float":return[1,r.FLOAT,4];case"vec2":return[2,r.FLOAT,4];case"vec3":return[3,r.FLOAT,4];case"vec4":return[4,r.FLOAT,4];case"int":return[1,r.INT,4];case"ivec2":return[2,r.INT,4]}}function Rf(r,e,t){switch(e){case r.FLOAT:return new Float32Array(t);case r.INT:return new Int32Array(t)}}function Zy(r,e,t,a,n,i){switch(e){case r.FLOAT:return new Float32Array(t.buffer,i*a,n);case r.INT:return new Int32Array(t.buffer,i*a,n)}}function Qy(r,e,t,a){var n=Af(r,e),i=Je(n,2),s=i[0],o=i[1],l=Rf(r,o,a),u=r.createBuffer();return r.bindBuffer(r.ARRAY_BUFFER,u),r.bufferData(r.ARRAY_BUFFER,l,r.STATIC_DRAW),o===r.FLOAT?r.vertexAttribPointer(t,s,o,!1,0,0):o===r.INT&&r.vertexAttribIPointer(t,s,o,0,0),r.enableVertexAttribArray(t),r.bindBuffer(r.ARRAY_BUFFER,null),u}function Fr(r,e,t,a){var n=Af(r,t),i=Je(n,3),s=i[0],o=i[1],l=i[2],u=Rf(r,o,e*s),v=s*l,f=r.createBuffer();r.bindBuffer(r.ARRAY_BUFFER,f),r.bufferData(r.ARRAY_BUFFER,e*v,r.DYNAMIC_DRAW),r.enableVertexAttribArray(a),o===r.FLOAT?r.vertexAttribPointer(a,s,o,!1,v,0):o===r.INT&&r.vertexAttribIPointer(a,s,o,v,0),r.vertexAttribDivisor(a,1),r.bindBuffer(r.ARRAY_BUFFER,null);for(var c=new Array(e),h=0;hs&&(o=s/a,l=a*o,u=n*o),{scale:o,texW:l,texH:u}}},{key:"draw",value:function(t,a,n){var i=this;if(this.locked)throw new Error("can't draw, atlas is locked");var s=this.texSize,o=this.texRows,l=this.texHeight,u=this.getScale(a),v=u.scale,f=u.texW,c=u.texH,h=function(b,w){if(n&&w){var E=w.context,C=b.x,x=b.row,T=C,k=l*x;E.save(),E.translate(T,k),E.scale(v,v),n(E,a),E.restore()}},d=[null,null],y=function(){h(i.freePointer,i.canvas),d[0]={x:i.freePointer.x,y:i.freePointer.row*l,w:f,h:c},d[1]={x:i.freePointer.x+f,y:i.freePointer.row*l,w:0,h:c},i.freePointer.x+=f,i.freePointer.x==s&&(i.freePointer.x=0,i.freePointer.row++)},g=function(){var b=i.scratch,w=i.canvas;b.clear(),h({x:0,row:0},b);var E=s-i.freePointer.x,C=f-E,x=l;{var T=i.freePointer.x,k=i.freePointer.row*l,D=E;w.context.drawImage(b,0,0,D,x,T,k,D,x),d[0]={x:T,y:k,w:D,h:c}}{var B=E,P=(i.freePointer.row+1)*l,A=C;w&&w.context.drawImage(b,B,0,A,x,0,P,A,x),d[1]={x:0,y:P,w:A,h:c}}i.freePointer.x=C,i.freePointer.row++},p=function(){i.freePointer.x=0,i.freePointer.row++};if(this.freePointer.x+f<=s)y();else{if(this.freePointer.row>=o-1)return!1;this.freePointer.x===s?(p(),y()):this.enableWrapping?g():(p(),y())}return this.keyToLocation.set(t,d),this.needsBuffer=!0,d}},{key:"getOffsets",value:function(t){return this.keyToLocation.get(t)}},{key:"isEmpty",value:function(){return this.freePointer.x===0&&this.freePointer.row===0}},{key:"canFit",value:function(t){if(this.locked)return!1;var a=this.texSize,n=this.texRows,i=this.getScale(t),s=i.texW;return this.freePointer.x+s>a?this.freePointer.row1&&arguments[1]!==void 0?arguments[1]:{},i=n.forceRedraw,s=i===void 0?!1:i,o=n.filterEle,l=o===void 0?function(){return!0}:o,u=n.filterType,v=u===void 0?function(){return!0}:u,f=!1,c=!1,h=kr(t),d;try{for(h.s();!(d=h.n()).done;){var y=d.value;if(l(y)){var g=kr(this.renderTypes.values()),p;try{var m=function(){var w=p.value,E=w.type;if(v(E)){var C=a.collections.get(w.collection),x=w.getKey(y),T=Array.isArray(x)?x:[x];if(s)T.forEach(function(P){return C.markKeyForGC(P)}),c=!0;else{var k=w.getID?w.getID(y):y.id(),D=a._key(E,k),B=a.typeAndIdToKey.get(D);B!==void 0&&!Ky(T,B)&&(f=!0,a.typeAndIdToKey.delete(D),B.forEach(function(P){return C.markKeyForGC(P)}))}}};for(g.s();!(p=g.n()).done;)m()}catch(b){g.e(b)}finally{g.f()}}}}catch(b){h.e(b)}finally{h.f()}return c&&(this.gc(),f=!1),f}},{key:"gc",value:function(){var t=kr(this.collections.values()),a;try{for(t.s();!(a=t.n()).done;){var n=a.value;n.gc()}}catch(i){t.e(i)}finally{t.f()}}},{key:"getOrCreateAtlas",value:function(t,a,n,i){var s=this.renderTypes.get(a),o=this.collections.get(s.collection),l=!1,u=o.draw(i,n,function(c){s.drawClipped?(c.save(),c.beginPath(),c.rect(0,0,n.w,n.h),c.clip(),s.drawElement(c,t,n,!0,!0),c.restore()):s.drawElement(c,t,n,!0,!0),l=!0});if(l){var v=s.getID?s.getID(t):t.id(),f=this._key(a,v);this.typeAndIdToKey.has(f)?this.typeAndIdToKey.get(f).push(i):this.typeAndIdToKey.set(f,[i])}return u}},{key:"getAtlasInfo",value:function(t,a){var n=this,i=this.renderTypes.get(a),s=i.getKey(t),o=Array.isArray(s)?s:[s];return o.map(function(l){var u=i.getBoundingBox(t,l),v=n.getOrCreateAtlas(t,a,u,l),f=v.getOffsets(l),c=Je(f,2),h=c[0],d=c[1];return{atlas:v,tex:h,tex1:h,tex2:d,bb:u}})}},{key:"getDebugInfo",value:function(){var t=[],a=kr(this.collections),n;try{for(a.s();!(n=a.n()).done;){var i=Je(n.value,2),s=i[0],o=i[1],l=o.getCounts(),u=l.keyCount,v=l.atlasCount;t.push({type:s,keyCount:u,atlasCount:v})}}catch(f){a.e(f)}finally{a.f()}return t}}])})(),sm=(function(){function r(e){ht(this,r),this.globalOptions=e,this.atlasSize=e.webglTexSize,this.maxAtlasesPerBatch=e.webglTexPerBatch,this.batchAtlases=[]}return gt(r,[{key:"getMaxAtlasesPerBatch",value:function(){return this.maxAtlasesPerBatch}},{key:"getAtlasSize",value:function(){return this.atlasSize}},{key:"getIndexArray",value:function(){return Array.from({length:this.maxAtlasesPerBatch},function(t,a){return a})}},{key:"startBatch",value:function(){this.batchAtlases=[]}},{key:"getAtlasCount",value:function(){return this.batchAtlases.length}},{key:"getAtlases",value:function(){return this.batchAtlases}},{key:"canAddToCurrentBatch",value:function(t){return this.batchAtlases.length===this.maxAtlasesPerBatch?this.batchAtlases.includes(t):!0}},{key:"getAtlasIndexForBatch",value:function(t){var a=this.batchAtlases.indexOf(t);if(a<0){if(this.batchAtlases.length===this.maxAtlasesPerBatch)throw new Error("cannot add more atlases to batch");this.batchAtlases.push(t),a=this.batchAtlases.length-1}return a}}])})(),om=` + float circleSD(vec2 p, float r) { + return distance(vec2(0), p) - r; // signed distance + } +`,um=` + float rectangleSD(vec2 p, vec2 b) { + vec2 d = abs(p)-b; + return distance(vec2(0),max(d,0.0)) + min(max(d.x,d.y),0.0); + } +`,lm=` + float roundRectangleSD(vec2 p, vec2 b, vec4 cr) { + cr.xy = (p.x > 0.0) ? cr.xy : cr.zw; + cr.x = (p.y > 0.0) ? cr.x : cr.y; + vec2 q = abs(p) - b + cr.x; + return min(max(q.x, q.y), 0.0) + distance(vec2(0), max(q, 0.0)) - cr.x; + } +`,vm=` + float ellipseSD(vec2 p, vec2 ab) { + p = abs( p ); // symmetry + + // find root with Newton solver + vec2 q = ab*(p-ab); + float w = (q.x1.0) ? d : -d; + } +`,Ea={SCREEN:{name:"screen",screen:!0},PICKING:{name:"picking",picking:!0}},An={IGNORE:1,USE_BB:2},Cs=0,Kl=1,Xl=2,Ts=3,Gt=4,sn=5,ga=6,pa=7,fm=(function(){function r(e,t,a){ht(this,r),this.r=e,this.gl=t,this.maxInstances=a.webglBatchSize,this.atlasSize=a.webglTexSize,this.bgColor=a.bgColor,this.debug=a.webglDebug,this.batchDebugInfo=[],a.enableWrapping=!0,a.createTextureCanvas=Hy,this.atlasManager=new im(e,a),this.batchManager=new sm(a),this.simpleShapeOptions=new Map,this.program=this._createShaderProgram(Ea.SCREEN),this.pickingProgram=this._createShaderProgram(Ea.PICKING),this.vao=this._createVAO()}return gt(r,[{key:"addAtlasCollection",value:function(t,a){this.atlasManager.addAtlasCollection(t,a)}},{key:"addTextureAtlasRenderType",value:function(t,a){this.atlasManager.addRenderType(t,a)}},{key:"addSimpleShapeRenderType",value:function(t,a){this.simpleShapeOptions.set(t,a)}},{key:"invalidate",value:function(t){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=a.type,i=this.atlasManager;return n?i.invalidate(t,{filterType:function(o){return o===n},forceRedraw:!0}):i.invalidate(t)}},{key:"gc",value:function(){this.atlasManager.gc()}},{key:"_createShaderProgram",value:function(t){var a=this.gl,n=`#version 300 es + precision highp float; + + uniform mat3 uPanZoomMatrix; + uniform int uAtlasSize; + + // instanced + in vec2 aPosition; // a vertex from the unit square + + in mat3 aTransform; // used to transform verticies, eg into a bounding box + in int aVertType; // the type of thing we are rendering + + // the z-index that is output when using picking mode + in vec4 aIndex; + + // For textures + in int aAtlasId; // which shader unit/atlas to use + in vec4 aTex; // x/y/w/h of texture in atlas + + // for edges + in vec4 aPointAPointB; + in vec4 aPointCPointD; + in vec2 aLineWidth; // also used for node border width + + // simple shapes + in vec4 aCornerRadius; // for round-rectangle [top-right, bottom-right, top-left, bottom-left] + in vec4 aColor; // also used for edges + in vec4 aBorderColor; // aLineWidth is used for border width + + // output values passed to the fragment shader + out vec2 vTexCoord; + out vec4 vColor; + out vec2 vPosition; + // flat values are not interpolated + flat out int vAtlasId; + flat out int vVertType; + flat out vec2 vTopRight; + flat out vec2 vBotLeft; + flat out vec4 vCornerRadius; + flat out vec4 vBorderColor; + flat out vec2 vBorderWidth; + flat out vec4 vIndex; + + void main(void) { + int vid = gl_VertexID; + vec2 position = aPosition; // TODO make this a vec3, simplifies some code below + + if(aVertType == `.concat(Cs,`) { + float texX = aTex.x; // texture coordinates + float texY = aTex.y; + float texW = aTex.z; + float texH = aTex.w; + + if(vid == 1 || vid == 2 || vid == 4) { + texX += texW; + } + if(vid == 2 || vid == 4 || vid == 5) { + texY += texH; + } + + float d = float(uAtlasSize); + vTexCoord = vec2(texX / d, texY / d); // tex coords must be between 0 and 1 + + gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); + } + else if(aVertType == `).concat(Gt," || aVertType == ").concat(pa,` + || aVertType == `).concat(sn," || aVertType == ").concat(ga,`) { // simple shapes + + // the bounding box is needed by the fragment shader + vBotLeft = (aTransform * vec3(0, 0, 1)).xy; // flat + vTopRight = (aTransform * vec3(1, 1, 1)).xy; // flat + vPosition = (aTransform * vec3(position, 1)).xy; // will be interpolated + + // calculations are done in the fragment shader, just pass these along + vColor = aColor; + vCornerRadius = aCornerRadius; + vBorderColor = aBorderColor; + vBorderWidth = aLineWidth; + + gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); + } + else if(aVertType == `).concat(Kl,`) { + vec2 source = aPointAPointB.xy; + vec2 target = aPointAPointB.zw; + + // adjust the geometry so that the line is centered on the edge + position.y = position.y - 0.5; + + // stretch the unit square into a long skinny rectangle + vec2 xBasis = target - source; + vec2 yBasis = normalize(vec2(-xBasis.y, xBasis.x)); + vec2 point = source + xBasis * position.x + yBasis * aLineWidth[0] * position.y; + + gl_Position = vec4(uPanZoomMatrix * vec3(point, 1.0), 1.0); + vColor = aColor; + } + else if(aVertType == `).concat(Xl,`) { + vec2 pointA = aPointAPointB.xy; + vec2 pointB = aPointAPointB.zw; + vec2 pointC = aPointCPointD.xy; + vec2 pointD = aPointCPointD.zw; + + // adjust the geometry so that the line is centered on the edge + position.y = position.y - 0.5; + + vec2 p0, p1, p2, pos; + if(position.x == 0.0) { // The left side of the unit square + p0 = pointA; + p1 = pointB; + p2 = pointC; + pos = position; + } else { // The right side of the unit square, use same approach but flip the geometry upside down + p0 = pointD; + p1 = pointC; + p2 = pointB; + pos = vec2(0.0, -position.y); + } + + vec2 p01 = p1 - p0; + vec2 p12 = p2 - p1; + vec2 p21 = p1 - p2; + + // Find the normal vector. + vec2 tangent = normalize(normalize(p12) + normalize(p01)); + vec2 normal = vec2(-tangent.y, tangent.x); + + // Find the vector perpendicular to p0 -> p1. + vec2 p01Norm = normalize(vec2(-p01.y, p01.x)); + + // Determine the bend direction. + float sigma = sign(dot(p01 + p21, normal)); + float width = aLineWidth[0]; + + if(sign(pos.y) == -sigma) { + // This is an intersecting vertex. Adjust the position so that there's no overlap. + vec2 point = 0.5 * width * normal * -sigma / dot(normal, p01Norm); + gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); + } else { + // This is a non-intersecting vertex. Treat it like a mitre join. + vec2 point = 0.5 * width * normal * sigma * dot(normal, p01Norm); + gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); + } + + vColor = aColor; + } + else if(aVertType == `).concat(Ts,` && vid < 3) { + // massage the first triangle into an edge arrow + if(vid == 0) + position = vec2(-0.15, -0.3); + if(vid == 1) + position = vec2( 0.0, 0.0); + if(vid == 2) + position = vec2( 0.15, -0.3); + + gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); + vColor = aColor; + } + else { + gl_Position = vec4(2.0, 0.0, 0.0, 1.0); // discard vertex by putting it outside webgl clip space + } + + vAtlasId = aAtlasId; + vVertType = aVertType; + vIndex = aIndex; + } + `),i=this.batchManager.getIndexArray(),s=`#version 300 es + precision highp float; + + // declare texture unit for each texture atlas in the batch + `.concat(i.map(function(u){return"uniform sampler2D uTexture".concat(u,";")}).join(` + `),` + + uniform vec4 uBGColor; + uniform float uZoom; + + in vec2 vTexCoord; + in vec4 vColor; + in vec2 vPosition; // model coordinates + + flat in int vAtlasId; + flat in vec4 vIndex; + flat in int vVertType; + flat in vec2 vTopRight; + flat in vec2 vBotLeft; + flat in vec4 vCornerRadius; + flat in vec4 vBorderColor; + flat in vec2 vBorderWidth; + + out vec4 outColor; + + `).concat(om,` + `).concat(um,` + `).concat(lm,` + `).concat(vm,` + + vec4 blend(vec4 top, vec4 bot) { // blend colors with premultiplied alpha + return vec4( + top.rgb + (bot.rgb * (1.0 - top.a)), + top.a + (bot.a * (1.0 - top.a)) + ); + } + + vec4 distInterp(vec4 cA, vec4 cB, float d) { // interpolate color using Signed Distance + // scale to the zoom level so that borders don't look blurry when zoomed in + // note 1.5 is an aribitrary value chosen because it looks good + return mix(cA, cB, 1.0 - smoothstep(0.0, 1.5 / uZoom, abs(d))); + } + + void main(void) { + if(vVertType == `).concat(Cs,`) { + // look up the texel from the texture unit + `).concat(i.map(function(u){return"if(vAtlasId == ".concat(u,") outColor = texture(uTexture").concat(u,", vTexCoord);")}).join(` + else `),` + } + else if(vVertType == `).concat(Ts,`) { + // mimics how canvas renderer uses context.globalCompositeOperation = 'destination-out'; + outColor = blend(vColor, uBGColor); + outColor.a = 1.0; // make opaque, masks out line under arrow + } + else if(vVertType == `).concat(Gt,` && vBorderWidth == vec2(0.0)) { // simple rectangle with no border + outColor = vColor; // unit square is already transformed to the rectangle, nothing else needs to be done + } + else if(vVertType == `).concat(Gt," || vVertType == ").concat(pa,` + || vVertType == `).concat(sn," || vVertType == ").concat(ga,`) { // use SDF + + float outerBorder = vBorderWidth[0]; + float innerBorder = vBorderWidth[1]; + float borderPadding = outerBorder * 2.0; + float w = vTopRight.x - vBotLeft.x - borderPadding; + float h = vTopRight.y - vBotLeft.y - borderPadding; + vec2 b = vec2(w/2.0, h/2.0); // half width, half height + vec2 p = vPosition - vec2(vTopRight.x - b[0] - outerBorder, vTopRight.y - b[1] - outerBorder); // translate to center + + float d; // signed distance + if(vVertType == `).concat(Gt,`) { + d = rectangleSD(p, b); + } else if(vVertType == `).concat(pa,` && w == h) { + d = circleSD(p, b.x); // faster than ellipse + } else if(vVertType == `).concat(pa,`) { + d = ellipseSD(p, b); + } else { + d = roundRectangleSD(p, b, vCornerRadius.wzyx); + } + + // use the distance to interpolate a color to smooth the edges of the shape, doesn't need multisampling + // we must smooth colors inwards, because we can't change pixels outside the shape's bounding box + if(d > 0.0) { + if(d > outerBorder) { + discard; + } else { + outColor = distInterp(vBorderColor, vec4(0), d - outerBorder); + } + } else { + if(d > innerBorder) { + vec4 outerColor = outerBorder == 0.0 ? vec4(0) : vBorderColor; + vec4 innerBorderColor = blend(vBorderColor, vColor); + outColor = distInterp(innerBorderColor, outerColor, d); + } + else { + vec4 outerColor; + if(innerBorder == 0.0 && outerBorder == 0.0) { + outerColor = vec4(0); + } else if(innerBorder == 0.0) { + outerColor = vBorderColor; + } else { + outerColor = blend(vBorderColor, vColor); + } + outColor = distInterp(vColor, outerColor, d - innerBorder); + } + } + } + else { + outColor = vColor; + } + + `).concat(t.picking?`if(outColor.a == 0.0) discard; + else outColor = vIndex;`:"",` + } + `),o=Gy(a,n,s);o.aPosition=a.getAttribLocation(o,"aPosition"),o.aIndex=a.getAttribLocation(o,"aIndex"),o.aVertType=a.getAttribLocation(o,"aVertType"),o.aTransform=a.getAttribLocation(o,"aTransform"),o.aAtlasId=a.getAttribLocation(o,"aAtlasId"),o.aTex=a.getAttribLocation(o,"aTex"),o.aPointAPointB=a.getAttribLocation(o,"aPointAPointB"),o.aPointCPointD=a.getAttribLocation(o,"aPointCPointD"),o.aLineWidth=a.getAttribLocation(o,"aLineWidth"),o.aColor=a.getAttribLocation(o,"aColor"),o.aCornerRadius=a.getAttribLocation(o,"aCornerRadius"),o.aBorderColor=a.getAttribLocation(o,"aBorderColor"),o.uPanZoomMatrix=a.getUniformLocation(o,"uPanZoomMatrix"),o.uAtlasSize=a.getUniformLocation(o,"uAtlasSize"),o.uBGColor=a.getUniformLocation(o,"uBGColor"),o.uZoom=a.getUniformLocation(o,"uZoom"),o.uTextures=[];for(var l=0;l1&&arguments[1]!==void 0?arguments[1]:Ea.SCREEN;this.panZoomMatrix=t,this.renderTarget=a,this.batchDebugInfo=[],this.wrappedCount=0,this.simpleCount=0,this.startBatch()}},{key:"startBatch",value:function(){this.instanceCount=0,this.batchManager.startBatch()}},{key:"endFrame",value:function(){this.endBatch()}},{key:"_isVisible",value:function(t,a){return t.visible()?a&&a.isVisible?a.isVisible(t):!0:!1}},{key:"drawTexture",value:function(t,a,n){var i=this.atlasManager,s=this.batchManager,o=i.getRenderTypeOpts(n);if(this._isVisible(t,o)&&!(t.isEdge()&&!this._isValidEdge(t))){if(this.renderTarget.picking&&o.getTexPickingMode){var l=o.getTexPickingMode(t);if(l===An.IGNORE)return;if(l==An.USE_BB){this.drawPickingRectangle(t,a,n);return}}var u=i.getAtlasInfo(t,n),v=kr(u),f;try{for(v.s();!(f=v.n()).done;){var c=f.value,h=c.atlas,d=c.tex1,y=c.tex2;s.canAddToCurrentBatch(h)||this.endBatch();for(var g=s.getAtlasIndexForBatch(h),p=0,m=[[d,!0],[y,!1]];p=this.maxInstances&&this.endBatch()}}}}catch(B){v.e(B)}finally{v.f()}}}},{key:"setTransformMatrix",value:function(t,a,n,i){var s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,o=0;if(n.shapeProps&&n.shapeProps.padding&&(o=t.pstyle(n.shapeProps.padding).pfValue),i){var l=i.bb,u=i.tex1,v=i.tex2,f=u.w/(u.w+v.w);s||(f=1-f);var c=this._getAdjustedBB(l,o,s,f);this._applyTransformMatrix(a,c,n,t)}else{var h=n.getBoundingBox(t),d=this._getAdjustedBB(h,o,!0,1);this._applyTransformMatrix(a,d,n,t)}}},{key:"_applyTransformMatrix",value:function(t,a,n,i){var s,o;$l(t);var l=n.getRotation?n.getRotation(i):0;if(l!==0){var u=n.getRotationPoint(i),v=u.x,f=u.y;yn(t,t,[v,f]),Ul(t,t,l);var c=n.getRotationOffset(i);s=c.x+(a.xOffset||0),o=c.y+(a.yOffset||0)}else s=a.x1,o=a.y1;yn(t,t,[s,o]),Ws(t,t,[a.w,a.h])}},{key:"_getAdjustedBB",value:function(t,a,n,i){var s=t.x1,o=t.y1,l=t.w,u=t.h,v=t.yOffset;a&&(s-=a,o-=a,l+=2*a,u+=2*a);var f=0,c=l*i;return n&&i<1?l=c:!n&&i<1&&(f=l-c,s+=f,l=c),{x1:s,y1:o,w:l,h:u,xOffset:f,yOffset:v}}},{key:"drawPickingRectangle",value:function(t,a,n){var i=this.atlasManager.getRenderTypeOpts(n),s=this.instanceCount;this.vertTypeBuffer.getView(s)[0]=Gt;var o=this.indexBuffer.getView(s);_t(a,o);var l=this.colorBuffer.getView(s);xt([0,0,0],1,l);var u=this.transformBuffer.getMatrixView(s);this.setTransformMatrix(t,u,i),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}},{key:"drawNode",value:function(t,a,n){var i=this.simpleShapeOptions.get(n);if(this._isVisible(t,i)){var s=i.shapeProps,o=this._getVertTypeForShape(t,s.shape);if(o===void 0||i.isSimple&&!i.isSimple(t)){this.drawTexture(t,a,n);return}var l=this.instanceCount;if(this.vertTypeBuffer.getView(l)[0]=o,o===sn||o===ga){var u=i.getBoundingBox(t),v=this._getCornerRadius(t,s.radius,u),f=this.cornerRadiusBuffer.getView(l);f[0]=v,f[1]=v,f[2]=v,f[3]=v,o===ga&&(f[0]=0,f[2]=0)}var c=this.indexBuffer.getView(l);_t(a,c);var h=t.pstyle(s.color).value,d=t.pstyle(s.opacity).value,y=this.colorBuffer.getView(l);xt(h,d,y);var g=this.lineWidthBuffer.getView(l);if(g[0]=0,g[1]=0,s.border){var p=t.pstyle("border-width").value;if(p>0){var m=t.pstyle("border-color").value,b=t.pstyle("border-opacity").value,w=this.borderColorBuffer.getView(l);xt(m,b,w);var E=t.pstyle("border-position").value;if(E==="inside")g[0]=0,g[1]=-p;else if(E==="outside")g[0]=p,g[1]=0;else{var C=p/2;g[0]=C,g[1]=-C}}}var x=this.transformBuffer.getMatrixView(l);this.setTransformMatrix(t,x,i),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}},{key:"_getVertTypeForShape",value:function(t,a){var n=t.pstyle(a).value;switch(n){case"rectangle":return Gt;case"ellipse":return pa;case"roundrectangle":case"round-rectangle":return sn;case"bottom-round-rectangle":return ga;default:return}}},{key:"_getCornerRadius",value:function(t,a,n){var i=n.w,s=n.h;if(t.pstyle(a).value==="auto")return vt(i,s);var o=t.pstyle(a).pfValue,l=i/2,u=s/2;return Math.min(o,u,l)}},{key:"drawEdgeArrow",value:function(t,a,n){if(t.visible()){var i=t._private.rscratch,s,o,l;if(n==="source"?(s=i.arrowStartX,o=i.arrowStartY,l=i.srcArrowAngle):(s=i.arrowEndX,o=i.arrowEndY,l=i.tgtArrowAngle),!(isNaN(s)||s==null||isNaN(o)||o==null||isNaN(l)||l==null)){var u=t.pstyle(n+"-arrow-shape").value;if(u!=="none"){var v=t.pstyle(n+"-arrow-color").value,f=t.pstyle("opacity").value,c=t.pstyle("line-opacity").value,h=f*c,d=t.pstyle("width").pfValue,y=t.pstyle("arrow-scale").value,g=this.r.getArrowWidth(d,y),p=this.instanceCount,m=this.transformBuffer.getMatrixView(p);$l(m),yn(m,m,[s,o]),Ws(m,m,[g,g]),Ul(m,m,l),this.vertTypeBuffer.getView(p)[0]=Ts;var b=this.indexBuffer.getView(p);_t(a,b);var w=this.colorBuffer.getView(p);xt(v,h,w),this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}}},{key:"drawEdgeLine",value:function(t,a){if(t.visible()){var n=this._getEdgePoints(t);if(n){var i=t.pstyle("opacity").value,s=t.pstyle("line-opacity").value,o=t.pstyle("width").pfValue,l=t.pstyle("line-color").value,u=i*s;if(n.length/2+this.instanceCount>this.maxInstances&&this.endBatch(),n.length==4){var v=this.instanceCount;this.vertTypeBuffer.getView(v)[0]=Kl;var f=this.indexBuffer.getView(v);_t(a,f);var c=this.colorBuffer.getView(v);xt(l,u,c);var h=this.lineWidthBuffer.getView(v);h[0]=o;var d=this.pointAPointBBuffer.getView(v);d[0]=n[0],d[1]=n[1],d[2]=n[2],d[3]=n[3],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}else for(var y=0;y=this.maxInstances&&this.endBatch()}}}}},{key:"_isValidEdge",value:function(t){var a=t._private.rscratch;return!(a.badLine||a.allpts==null||isNaN(a.allpts[0]))}},{key:"_getEdgePoints",value:function(t){var a=t._private.rscratch;if(this._isValidEdge(t)){var n=a.allpts;if(n.length==4)return n;var i=this._getNumSegments(t);return this._getCurveSegmentPoints(n,i)}}},{key:"_getNumSegments",value:function(t){var a=15;return Math.min(Math.max(a,5),this.maxInstances)}},{key:"_getCurveSegmentPoints",value:function(t,a){if(t.length==4)return t;for(var n=Array((a+1)*2),i=0;i<=a;i++)if(i==0)n[0]=t[0],n[1]=t[1];else if(i==a)n[i*2]=t[t.length-2],n[i*2+1]=t[t.length-1];else{var s=i/a;this._setCurvePoint(t,s,n,i*2)}return n}},{key:"_setCurvePoint",value:function(t,a,n,i){if(t.length<=2)n[i]=t[0],n[i+1]=t[1];else{for(var s=Array(t.length-2),o=0;o0}},o=function(f){var c=f.pstyle("text-events").strValue==="yes";return c?An.USE_BB:An.IGNORE},l=function(f){var c=f.position(),h=c.x,d=c.y,y=f.outerWidth(),g=f.outerHeight();return{w:y,h:g,x1:h-y/2,y1:d-g/2}};t.drawing.addAtlasCollection("node",{texRows:r.webglTexRowsNodes}),t.drawing.addAtlasCollection("label",{texRows:r.webglTexRows}),t.drawing.addTextureAtlasRenderType("node-body",{collection:"node",getKey:e.getStyleKey,getBoundingBox:e.getElementBox,drawElement:e.drawElement}),t.drawing.addSimpleShapeRenderType("node-body",{getBoundingBox:l,isSimple:Uy,shapeProps:{shape:"shape",color:"background-color",opacity:"background-opacity",radius:"corner-radius",border:!0}}),t.drawing.addSimpleShapeRenderType("node-overlay",{getBoundingBox:l,isVisible:s("overlay"),shapeProps:{shape:"overlay-shape",color:"overlay-color",opacity:"overlay-opacity",padding:"overlay-padding",radius:"overlay-corner-radius"}}),t.drawing.addSimpleShapeRenderType("node-underlay",{getBoundingBox:l,isVisible:s("underlay"),shapeProps:{shape:"underlay-shape",color:"underlay-color",opacity:"underlay-opacity",padding:"underlay-padding",radius:"underlay-corner-radius"}}),t.drawing.addTextureAtlasRenderType("label",{collection:"label",getTexPickingMode:o,getKey:Ss(e.getLabelKey,null),getBoundingBox:ks(e.getLabelBox,null),drawClipped:!0,drawElement:e.drawLabel,getRotation:n(null),getRotationPoint:e.getLabelRotationPoint,getRotationOffset:e.getLabelRotationOffset,isVisible:i("label")}),t.drawing.addTextureAtlasRenderType("edge-source-label",{collection:"label",getTexPickingMode:o,getKey:Ss(e.getSourceLabelKey,"source"),getBoundingBox:ks(e.getSourceLabelBox,"source"),drawClipped:!0,drawElement:e.drawSourceLabel,getRotation:n("source"),getRotationPoint:e.getSourceLabelRotationPoint,getRotationOffset:e.getSourceLabelRotationOffset,isVisible:i("source-label")}),t.drawing.addTextureAtlasRenderType("edge-target-label",{collection:"label",getTexPickingMode:o,getKey:Ss(e.getTargetLabelKey,"target"),getBoundingBox:ks(e.getTargetLabelBox,"target"),drawClipped:!0,drawElement:e.drawTargetLabel,getRotation:n("target"),getRotationPoint:e.getTargetLabelRotationPoint,getRotationOffset:e.getTargetLabelRotationOffset,isVisible:i("target-label")});var u=Fa(function(){console.log("garbage collect flag set"),t.data.gc=!0},1e4);t.onUpdateEleCalcs(function(v,f){var c=!1;f&&f.length>0&&(c|=t.drawing.invalidate(f)),c&&u()}),dm(t)};function cm(r){var e=r.cy.container(),t=e&&e.style&&e.style.backgroundColor||"white";return iv(t)}function Lf(r,e){var t=r._private.rscratch;return Tr(t,"labelWrapCachedLines",e)||[]}var Ss=function(e,t){return function(a){var n=e(a),i=Lf(a,t);return i.length>1?i.map(function(s,o){return"".concat(n,"_").concat(o)}):n}},ks=function(e,t){return function(a,n){var i=e(a);if(typeof n=="string"){var s=n.indexOf("_");if(s>0){var o=Number(n.substring(s+1)),l=Lf(a,t),u=i.h/l.length,v=u*o,f=i.y1+v;return{x1:i.x1,w:i.w,y1:f,h:u,yOffset:v}}}return i}};function dm(r){{var e=r.render;r.render=function(i){i=i||{};var s=r.cy;r.webgl&&(s.zoom()>Sf?(hm(r),e.call(r,i)):(gm(r),Of(r,i,Ea.SCREEN)))}}{var t=r.matchCanvasSize;r.matchCanvasSize=function(i){t.call(r,i),r.pickingFrameBuffer.setFramebufferAttachmentSizes(r.canvasWidth,r.canvasHeight),r.pickingFrameBuffer.needsDraw=!0}}r.findNearestElements=function(i,s,o,l){return xm(r,i,s)};{var a=r.invalidateCachedZSortedEles;r.invalidateCachedZSortedEles=function(){a.call(r),r.pickingFrameBuffer.needsDraw=!0}}{var n=r.notify;r.notify=function(i,s){n.call(r,i,s),i==="viewport"||i==="bounds"?r.pickingFrameBuffer.needsDraw=!0:i==="background"&&r.drawing.invalidate(s,{type:"node-body"})}}}function hm(r){var e=r.data.contexts[r.WEBGL];e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}function gm(r){var e=function(a){a.save(),a.setTransform(1,0,0,1,0,0),a.clearRect(0,0,r.canvasWidth,r.canvasHeight),a.restore()};e(r.data.contexts[r.NODE]),e(r.data.contexts[r.DRAG])}function pm(r){var e=r.canvasWidth,t=r.canvasHeight,a=bo(r),n=a.pan,i=a.zoom,s=Es();yn(s,s,[n.x,n.y]),Ws(s,s,[i,i]);var o=Es();rm(o,e,t);var l=Es();return em(l,o,s),l}function If(r,e){var t=r.canvasWidth,a=r.canvasHeight,n=bo(r),i=n.pan,s=n.zoom;e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,t,a),e.translate(i.x,i.y),e.scale(s,s)}function ym(r,e){r.drawSelectionRectangle(e,function(t){return If(r,t)})}function mm(r){var e=r.data.contexts[r.NODE];e.save(),If(r,e),e.strokeStyle="rgba(0, 0, 0, 0.3)",e.beginPath(),e.moveTo(-1e3,0),e.lineTo(1e3,0),e.stroke(),e.beginPath(),e.moveTo(0,-1e3),e.lineTo(0,1e3),e.stroke(),e.restore()}function bm(r){var e=function(n,i,s){for(var o=n.atlasManager.getAtlasCollection(i),l=r.data.contexts[r.NODE],u=o.atlases,v=0;v=0&&w.add(x)}return w}function xm(r,e,t){var a=wm(r,e,t),n=r.getCachedZSortedEles(),i,s,o=kr(a),l;try{for(o.s();!(l=o.n()).done;){var u=l.value,v=n[u];if(!i&&v.isNode()&&(i=v),!s&&v.isEdge()&&(s=v),i&&s)break}}catch(f){o.e(f)}finally{o.f()}return[i,s].filter(Boolean)}function Ds(r,e,t){var a=r.drawing;e+=1,t.isNode()?(a.drawNode(t,e,"node-underlay"),a.drawNode(t,e,"node-body"),a.drawTexture(t,e,"label"),a.drawNode(t,e,"node-overlay")):(a.drawEdgeLine(t,e),a.drawEdgeArrow(t,e,"source"),a.drawEdgeArrow(t,e,"target"),a.drawTexture(t,e,"label"),a.drawTexture(t,e,"edge-source-label"),a.drawTexture(t,e,"edge-target-label"))}function Of(r,e,t){var a;r.webglDebug&&(a=performance.now());var n=r.drawing,i=0;if(t.screen&&r.data.canvasNeedsRedraw[r.SELECT_BOX]&&ym(r,e),r.data.canvasNeedsRedraw[r.NODE]||t.picking){var s=r.data.contexts[r.WEBGL];t.screen?(s.clearColor(0,0,0,0),s.enable(s.BLEND),s.blendFunc(s.ONE,s.ONE_MINUS_SRC_ALPHA)):s.disable(s.BLEND),s.clear(s.COLOR_BUFFER_BIT|s.DEPTH_BUFFER_BIT),s.viewport(0,0,s.canvas.width,s.canvas.height);var o=pm(r),l=r.getCachedZSortedEles();if(i=l.length,n.startFrame(o,t),t.screen){for(var u=0;u0&&s>0){h.clearRect(0,0,i,s),h.globalCompositeOperation="source-over";var d=this.getCachedZSortedEles();if(r.full)h.translate(-a.x1*u,-a.y1*u),h.scale(u,u),this.drawElements(h,d),h.scale(1/u,1/u),h.translate(a.x1*u,a.y1*u);else{var y=e.pan(),g={x:y.x*u,y:y.y*u};u*=e.zoom(),h.translate(g.x,g.y),h.scale(u,u),this.drawElements(h,d),h.scale(1/u,1/u),h.translate(-g.x,-g.y)}r.bg&&(h.globalCompositeOperation="destination-over",h.fillStyle=r.bg,h.rect(0,0,i,s),h.fill())}return c};function Em(r,e){for(var t=atob(r),a=new ArrayBuffer(t.length),n=new Uint8Array(a),i=0;i"u"?"undefined":ar(OffscreenCanvas))!=="undefined")t=new OffscreenCanvas(r,e);else{var a=this.cy.window(),n=a.document;t=n.createElement("canvas"),t.width=r,t.height=e}return t};[Df,Hr,Jr,mo,It,yt,xr,Mf,mt,Wa,Ff].forEach(function(r){be(ke,r)});var Sm=[{name:"null",impl:df},{name:"base",impl:Cf},{name:"canvas",impl:Cm}],km=[{type:"layout",extensions:Qp},{type:"renderer",extensions:Sm}],qf={},_f={};function Gf(r,e,t){var a=t,n=function(T){Ve("Can not register `"+e+"` for `"+r+"` since `"+T+"` already exists in the prototype and can not be overridden")};if(r==="core"){if(Ra.prototype[e])return n(e);Ra.prototype[e]=t}else if(r==="collection"){if(fr.prototype[e])return n(e);fr.prototype[e]=t}else if(r==="layout"){for(var i=function(T){this.options=T,t.call(this,T),Le(this._private)||(this._private={}),this._private.cy=T.cy,this._private.listeners=[],this.createEmitter()},s=i.prototype=Object.create(t.prototype),o=[],l=0;l"u"&&(x.yylloc={});var A=x.yylloc;o.push(A);var U=x.options&&x.options.ranges;typeof T.yy.parseError=="function"?this.parseError=T.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function It(I){c.length=c.length-2*I,y.length=y.length-I,o.length=o.length-I}s(It,"popStack");function nt(){var I;return I=u.pop()||x.lex()||M,typeof I!="number"&&(I instanceof Array&&(u=I,I=u.pop()),I=a.symbols_[I]||I),I}s(nt,"lex");for(var w,Z,C,N,Jt,J,z={},O,H,rt,j;;){if(C=c[c.length-1],this.defaultActions[C]?N=this.defaultActions[C]:((w===null||typeof w>"u")&&(w=nt()),N=E[C]&&E[C][w]),typeof N>"u"||!N.length||!N[0]){var K="";j=[];for(O in E[C])this.terminals_[O]&&O>et&&j.push("'"+this.terminals_[O]+"'");x.showPosition?K="Parse error on line "+(L+1)+`: +`+x.showPosition()+` +Expecting `+j.join(", ")+", got '"+(this.terminals_[w]||w)+"'":K="Parse error on line "+(L+1)+": Unexpected "+(w==M?"end of input":"'"+(this.terminals_[w]||w)+"'"),this.parseError(K,{text:x.match,token:this.terminals_[w]||w,line:x.yylineno,loc:A,expected:j})}if(N[0]instanceof Array&&N.length>1)throw new Error("Parse Error: multiple actions possible at state: "+C+", token: "+w);switch(N[0]){case 1:c.push(w),y.push(x.yytext),o.push(x.yylloc),c.push(N[1]),w=null,Z?(w=Z,Z=null):(P=x.yyleng,b=x.yytext,L=x.yylineno,A=x.yylloc,F>0&&F--);break;case 2:if(H=this.productions_[N[1]][1],z.$=y[y.length-H],z._$={first_line:o[o.length-(H||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(H||1)].first_column,last_column:o[o.length-1].last_column},U&&(z._$.range=[o[o.length-(H||1)].range[0],o[o.length-1].range[1]]),J=this.performAction.apply(z,[b,P,L,T.yy,N[1],y,o].concat(_)),typeof J<"u")return J;H&&(c=c.slice(0,-1*H*2),y=y.slice(0,-1*H),o=o.slice(0,-1*H)),c.push(this.productions_[N[1]][0]),y.push(z.$),o.push(z._$),rt=E[c[c.length-2]][c[c.length-1]],c.push(rt);break;case 3:return!0}}return!0},"parse")},k=(function(){var m={EOF:1,parseError:s(function(a,c){if(this.yy.parser)this.yy.parser.parseError(a,c);else throw new Error(a)},"parseError"),setInput:s(function(i,a){return this.yy=a||this.yy||{},this._input=i,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:s(function(){var i=this._input[0];this.yytext+=i,this.yyleng++,this.offset++,this.match+=i,this.matched+=i;var a=i.match(/(?:\r\n?|\n).*/g);return a?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),i},"input"),unput:s(function(i){var a=i.length,c=i.split(/(?:\r\n?|\n)/g);this._input=i+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-a),this.offset-=a;var u=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var y=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===u.length?this.yylloc.first_column:0)+u[u.length-c.length].length-c[0].length:this.yylloc.first_column-a},this.options.ranges&&(this.yylloc.range=[y[0],y[0]+this.yyleng-a]),this.yyleng=this.yytext.length,this},"unput"),more:s(function(){return this._more=!0,this},"more"),reject:s(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:s(function(i){this.unput(this.match.slice(i))},"less"),pastInput:s(function(){var i=this.matched.substr(0,this.matched.length-this.match.length);return(i.length>20?"...":"")+i.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:s(function(){var i=this.match;return i.length<20&&(i+=this._input.substr(0,20-i.length)),(i.substr(0,20)+(i.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:s(function(){var i=this.pastInput(),a=new Array(i.length+1).join("-");return i+this.upcomingInput()+` +`+a+"^"},"showPosition"),test_match:s(function(i,a){var c,u,y;if(this.options.backtrack_lexer&&(y={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(y.yylloc.range=this.yylloc.range.slice(0))),u=i[0].match(/(?:\r\n?|\n).*/g),u&&(this.yylineno+=u.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:u?u[u.length-1].length-u[u.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+i[0].length},this.yytext+=i[0],this.match+=i[0],this.matches=i,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(i[0].length),this.matched+=i[0],c=this.performAction.call(this,this.yy,this,a,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),c)return c;if(this._backtrack){for(var o in y)this[o]=y[o];return!1}return!1},"test_match"),next:s(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var i,a,c,u;this._more||(this.yytext="",this.match="");for(var y=this._currentRules(),o=0;oa[0].length)){if(a=c,u=o,this.options.backtrack_lexer){if(i=this.test_match(c,y[o]),i!==!1)return i;if(this._backtrack){a=!1;continue}else return!1}else if(!this.options.flex)break}return a?(i=this.test_match(a,y[u]),i!==!1?i:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:s(function(){var a=this.next();return a||this.lex()},"lex"),begin:s(function(a){this.conditionStack.push(a)},"begin"),popState:s(function(){var a=this.conditionStack.length-1;return a>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:s(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:s(function(a){return a=this.conditionStack.length-1-Math.abs(a||0),a>=0?this.conditionStack[a]:"INITIAL"},"topState"),pushState:s(function(a){this.begin(a)},"pushState"),stateStackSize:s(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:s(function(a,c,u,y){var o=y;switch(u){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 21;case 16:return 20;case 17:return 6;case 18:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^:\n]+)/i,/^(?::\s(?:[^:\n]|:(?!\s))+)/i,/^(?:[^#:\n]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],inclusive:!0}}};return m})();p.lexer=k;function v(){this.yy={}}return s(v,"Parser"),v.prototype=p,p.Parser=v,new v})();X.parser=X;var Nt=X,gt={};it(gt,{addEvent:()=>wt,addSection:()=>kt,addTask:()=>_t,addTaskOrg:()=>St,clear:()=>xt,default:()=>Lt,getCommonDb:()=>mt,getSections:()=>bt,getTasks:()=>vt});var W="",ft=0,Y=[],G=[],B=[],mt=s(()=>ct,"getCommonDb"),xt=s(function(){Y.length=0,G.length=0,W="",B.length=0,ht()},"clear"),kt=s(function(n){W=n,Y.push(n)},"addSection"),bt=s(function(){return Y},"getSections"),vt=s(function(){let n=ut(),t=100,e=0;for(;!n&&ee.id===ft-1).events.push(n)},"addEvent"),St=s(function(n){let t={section:W,type:W,description:n,task:n,classes:[]};G.push(t)},"addTaskOrg"),ut=s(function(){let n=s(function(e){return B[e].processed},"compileTask"),t=!0;for(let[e,l]of B.entries())n(e),t=t&&l.processed;return t},"compileTasks"),Lt={clear:xt,getCommonDb:mt,addSection:kt,getSections:bt,getTasks:vt,addTask:_t,addTaskOrg:St,addEvent:wt},Mt=12,q=s(function(n,t){let e=n.append("rect");return e.attr("x",t.x),e.attr("y",t.y),e.attr("fill",t.fill),e.attr("stroke",t.stroke),e.attr("width",t.width),e.attr("height",t.height),e.attr("rx",t.rx),e.attr("ry",t.ry),t.class!==void 0&&e.attr("class",t.class),e},"drawRect"),$t=s(function(n,t){let l=n.append("circle").attr("cx",t.cx).attr("cy",t.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),r=n.append("g");r.append("circle").attr("cx",t.cx-15/3).attr("cy",t.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),r.append("circle").attr("cx",t.cx+15/3).attr("cy",t.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function d(f){let p=Q().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);f.append("path").attr("class","mouth").attr("d",p).attr("transform","translate("+t.cx+","+(t.cy+2)+")")}s(d,"smile");function h(f){let p=Q().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);f.append("path").attr("class","mouth").attr("d",p).attr("transform","translate("+t.cx+","+(t.cy+7)+")")}s(h,"sad");function g(f){f.append("line").attr("class","mouth").attr("stroke",2).attr("x1",t.cx-5).attr("y1",t.cy+7).attr("x2",t.cx+5).attr("y2",t.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return s(g,"ambivalent"),t.score>3?d(r):t.score<3?h(r):g(r),l},"drawFace"),Ht=s(function(n,t){let e=n.append("circle");return e.attr("cx",t.cx),e.attr("cy",t.cy),e.attr("class","actor-"+t.pos),e.attr("fill",t.fill),e.attr("stroke",t.stroke),e.attr("r",t.r),e.class!==void 0&&e.attr("class",e.class),t.title!==void 0&&e.append("title").text(t.title),e},"drawCircle"),Et=s(function(n,t){let e=t.text.replace(//gi," "),l=n.append("text");l.attr("x",t.x),l.attr("y",t.y),l.attr("class","legend"),l.style("text-anchor",t.anchor),t.class!==void 0&&l.attr("class",t.class);let r=l.append("tspan");return r.attr("x",t.x+t.textMargin*2),r.text(e),l},"drawText"),Pt=s(function(n,t){function e(r,d,h,g,f){return r+","+d+" "+(r+h)+","+d+" "+(r+h)+","+(d+g-f)+" "+(r+h-f*1.2)+","+(d+g)+" "+r+","+(d+g)}s(e,"genPoints");let l=n.append("polygon");l.attr("points",e(t.x,t.y,50,20,7)),l.attr("class","labelBox"),t.y=t.y+t.labelMargin,t.x=t.x+.5*t.labelMargin,Et(n,t)},"drawLabel"),At=s(function(n,t,e){let l=n.append("g"),r=D();r.x=t.x,r.y=t.y,r.fill=t.fill,r.width=e.width,r.height=e.height,r.class="journey-section section-type-"+t.num,r.rx=3,r.ry=3,q(l,r),Tt(e)(t.text,l,r.x,r.y,r.width,r.height,{class:"journey-section section-type-"+t.num},e,t.colour)},"drawSection"),pt=-1,Ct=s(function(n,t,e){let l=t.x+e.width/2,r=n.append("g");pt++,r.append("line").attr("id","task"+pt).attr("x1",l).attr("y1",t.y).attr("x2",l).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),$t(r,{cx:l,cy:300+(5-t.score)*30,score:t.score});let h=D();h.x=t.x,h.y=t.y,h.fill=t.fill,h.width=e.width,h.height=e.height,h.class="task task-type-"+t.num,h.rx=3,h.ry=3,q(r,h),Tt(e)(t.task,r,h.x,h.y,h.width,h.height,{class:"task"},e,t.colour)},"drawTask"),Rt=s(function(n,t){q(n,{x:t.startx,y:t.starty,width:t.stopx-t.startx,height:t.stopy-t.starty,fill:t.fill,class:"rect"}).lower()},"drawBackgroundRect"),Ft=s(function(){return{x:0,y:0,fill:void 0,"text-anchor":"start",width:100,height:100,textMargin:0,rx:0,ry:0}},"getTextObj"),D=s(function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),Tt=(function(){function n(r,d,h,g,f,p,k,v){let m=d.append("text").attr("x",h+f/2).attr("y",g+p/2+5).style("font-color",v).style("text-anchor","middle").text(r);l(m,k)}s(n,"byText");function t(r,d,h,g,f,p,k,v,m){let{taskFontSize:i,taskFontFamily:a}=v,c=r.split(//gi);for(let u=0;u)/).reverse(),r,d=[],h=1.1,g=e.attr("y"),f=parseFloat(e.attr("dy")),p=e.text(null).append("tspan").attr("x",0).attr("y",g).attr("dy",f+"em");for(let k=0;kt||r==="
        ")&&(d.pop(),p.text(d.join(" ").trim()),r==="
        "?d=[""]:d=[r],p=e.append("tspan").attr("x",0).attr("y",g).attr("dy",h+"em").text(r))})}s(tt,"wrap");var Vt=s(function(n,t,e,l){let r=e%Mt-1,d=n.append("g");t.section=r,d.attr("class",(t.class?t.class+" ":"")+"timeline-node "+("section-"+r));let h=d.append("g"),g=d.append("g"),p=g.append("text").text(t.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(tt,t.width).node().getBBox(),k=l.fontSize?.replace?l.fontSize.replace("px",""):l.fontSize;return t.height=p.height+k*1.1*.5+t.padding,t.height=Math.max(t.height,t.maxHeight),t.width=t.width+2*t.padding,g.attr("transform","translate("+t.width/2+", "+t.padding/2+")"),Bt(h,t,r,l),t},"drawNode"),Wt=s(function(n,t,e){let l=n.append("g"),d=l.append("text").text(t.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(tt,t.width).node().getBBox(),h=e.fontSize?.replace?e.fontSize.replace("px",""):e.fontSize;return l.remove(),d.height+h*1.1*.5+t.padding},"getVirtualNodeHeight"),Bt=s(function(n,t,e){n.append("path").attr("id","node-"+t.id).attr("class","node-bkg node-"+t.type).attr("d",`M0 ${t.height-5} v${-t.height+10} q0,-5 5,-5 h${t.width-10} q5,0 5,5 v${t.height-5} H0 Z`),n.append("line").attr("class","node-line-"+e).attr("x1",0).attr("y1",t.height).attr("x2",t.width).attr("y2",t.height)},"defaultBkg"),R={drawRect:q,drawCircle:Ht,drawSection:At,drawText:Et,drawLabel:Pt,drawTask:Ct,drawBackgroundRect:Rt,getTextObj:Ft,getNoteRect:D,initGraphics:zt,drawNode:Vt,getVirtualNodeHeight:Wt},Ot=s(function(n,t,e,l){let r=dt(),d=r.timeline?.leftMargin??50;S.debug("timeline",l.db);let h=r.securityLevel,g;h==="sandbox"&&(g=V("#i"+t));let p=(h==="sandbox"?V(g.nodes()[0].contentDocument.body):V("body")).select("#"+t);p.append("g");let k=l.db.getTasks(),v=l.db.getCommonDb().getDiagramTitle();S.debug("task",k),R.initGraphics(p);let m=l.db.getSections();S.debug("sections",m);let i=0,a=0,c=0,u=0,y=50+d,o=50;u=50;let E=0,b=!0;m.forEach(function(M){let _={number:E,descr:M,section:E,width:150,padding:20,maxHeight:i},x=R.getVirtualNodeHeight(p,_,r);S.debug("sectionHeight before draw",x),i=Math.max(i,x+20)});let L=0,P=0;S.debug("tasks.length",k.length);for(let[M,_]of k.entries()){let x={number:M,descr:_,section:_.section,width:150,padding:20,maxHeight:a},T=R.getVirtualNodeHeight(p,x,r);S.debug("taskHeight before draw",T),a=Math.max(a,T+20),L=Math.max(L,_.events.length);let $=0;for(let A of _.events){let U={descr:A,section:_.section,number:_.section,width:150,padding:20,maxHeight:50};$+=R.getVirtualNodeHeight(p,U,r)}_.events.length>0&&($+=(_.events.length-1)*10),P=Math.max(P,$)}S.debug("maxSectionHeight before draw",i),S.debug("maxTaskHeight before draw",a),m&&m.length>0?m.forEach(M=>{let _=k.filter(A=>A.section===M),x={number:E,descr:M,section:E,width:200*Math.max(_.length,1)-50,padding:20,maxHeight:i};S.debug("sectionNode",x);let T=p.append("g"),$=R.drawNode(T,x,E,r);S.debug("sectionNode output",$),T.attr("transform",`translate(${y}, ${u})`),o+=i+50,_.length>0&&yt(p,_,E,y,o,a,r,L,P,i,!1),y+=200*Math.max(_.length,1),o=u,E++}):(b=!1,yt(p,k,E,y,o,a,r,L,P,i,!0));let F=p.node().getBBox();S.debug("bounds",F),v&&p.append("text").text(v).attr("x",F.width/2-d).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),c=b?i+a+150:a+100,p.append("g").attr("class","lineWrapper").append("line").attr("x1",d).attr("y1",c).attr("x2",F.width+3*d).attr("y2",c).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),ot(void 0,p,r.timeline?.padding??50,r.timeline?.useMaxWidth??!1)},"draw"),yt=s(function(n,t,e,l,r,d,h,g,f,p,k){for(let v of t){let m={descr:v.task,section:e,number:e,width:150,padding:20,maxHeight:d};S.debug("taskNode",m);let i=n.append("g").attr("class","taskWrapper"),c=R.drawNode(i,m,e,h).height;if(S.debug("taskHeight after draw",c),i.attr("transform",`translate(${l}, ${r})`),d=Math.max(d,c),v.events){let u=n.append("g").attr("class","lineWrapper"),y=d;r+=100,y=y+jt(n,v.events,e,l,r,h),r-=100,u.append("line").attr("x1",l+190/2).attr("y1",r+d).attr("x2",l+190/2).attr("y2",r+d+100+f+100).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}l=l+200,k&&!h.timeline?.disableMulticolor&&e++}r=r-10},"drawTasks"),jt=s(function(n,t,e,l,r,d){let h=0,g=r;r=r+100;for(let f of t){let p={descr:f,section:e,number:e,width:150,padding:20,maxHeight:50};S.debug("eventNode",p);let k=n.append("g").attr("class","eventWrapper"),m=R.drawNode(k,p,e,d).height;h=h+m,k.attr("transform",`translate(${l}, ${r})`),r=r+10+m}return r=g,h},"drawEvents"),Gt={setConf:s(()=>{},"setConf"),draw:Ot},qt=s(n=>{let t="";for(let e=0;e` + .edge { + stroke-width: 3; + } + ${qt(n)} + .section-root rect, .section-root path, .section-root circle { + fill: ${n.git0}; + } + .section-root text { + fill: ${n.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .eventWrapper { + filter: brightness(120%); + } +`,"getStyles"),Zt=Ut,te={db:gt,renderer:Gt,parser:Nt,styles:Zt};export{te as diagram}; diff --git a/src/google/adk/cli/browser/chunk-ZMOC4H7T.js b/src/google/adk/cli/browser/chunk-ZMOC4H7T.js new file mode 100644 index 0000000000..6d51ff52b9 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-ZMOC4H7T.js @@ -0,0 +1,32 @@ +import{g as f}from"./chunk-JRNAXTJ7.js";function Ae(e){return typeof e>"u"||e===null}f(Ae,"isNothing");function Oe(e){return typeof e=="object"&&e!==null}f(Oe,"isObject");function Ie(e){return Array.isArray(e)?e:Ae(e)?[]:[e]}f(Ie,"toArray");function ke(e,n){var i,l,r,u;if(n)for(u=Object.keys(n),i=0,l=u.length;ic&&(u=" ... ",n=l-c+u.length),i-l>c&&(o=" ...",i=l+c-o.length),{str:u+e.slice(n,i).replace(/\t/g,"\u2192")+o,pos:l-n+u.length}}f(W,"getLine");function G(e,n){return w.repeat(" ",n-e.length)+e}f(G,"padStart");function Re(e,n){if(n=Object.create(n||null),!e.buffer)return null;n.maxLength||(n.maxLength=79),typeof n.indent!="number"&&(n.indent=1),typeof n.linesBefore!="number"&&(n.linesBefore=3),typeof n.linesAfter!="number"&&(n.linesAfter=2);for(var i=/\r?\n|\r|\0/g,l=[0],r=[],u,o=-1;u=i.exec(e.buffer);)r.push(u.index),l.push(u.index+u[0].length),e.position<=u.index&&o<0&&(o=l.length-2);o<0&&(o=l.length-1);var c="",a,t,d=Math.min(e.line+n.linesAfter,r.length).toString().length,p=n.maxLength-(n.indent+d+3);for(a=1;a<=n.linesBefore&&!(o-a<0);a++)t=W(e.buffer,l[o-a],r[o-a],e.position-(l[o]-l[o-a]),p),c=w.repeat(" ",n.indent)+G((e.line-a+1).toString(),d)+" | "+t.str+` +`+c;for(t=W(e.buffer,l[o],r[o],e.position,p),c+=w.repeat(" ",n.indent)+G((e.line+1).toString(),d)+" | "+t.str+` +`,c+=w.repeat("-",n.indent+d+3+t.pos)+`^ +`,a=1;a<=n.linesAfter&&!(o+a>=r.length);a++)t=W(e.buffer,l[o+a],r[o+a],e.position-(l[o]-l[o+a]),p),c+=w.repeat(" ",n.indent)+G((e.line+a+1).toString(),d)+" | "+t.str+` +`;return c.replace(/\n$/,"")}f(Re,"makeSnippet");var yi=Re,_i=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],wi=["scalar","sequence","mapping"];function Me(e){var n={};return e!==null&&Object.keys(e).forEach(function(i){e[i].forEach(function(l){n[String(l)]=i})}),n}f(Me,"compileStyleAliases");function Ye(e,n){if(n=n||{},Object.keys(n).forEach(function(i){if(_i.indexOf(i)===-1)throw new x('Unknown option "'+i+'" is met in definition of "'+e+'" YAML type.')}),this.options=n,this.tag=e,this.kind=n.kind||null,this.resolve=n.resolve||function(){return!0},this.construct=n.construct||function(i){return i},this.instanceOf=n.instanceOf||null,this.predicate=n.predicate||null,this.represent=n.represent||null,this.representName=n.representName||null,this.defaultStyle=n.defaultStyle||null,this.multi=n.multi||!1,this.styleAliases=Me(n.styleAliases||null),wi.indexOf(this.kind)===-1)throw new x('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}f(Ye,"Type$1");var C=Ye;function re(e,n){var i=[];return e[n].forEach(function(l){var r=i.length;i.forEach(function(u,o){u.tag===l.tag&&u.kind===l.kind&&u.multi===l.multi&&(r=o)}),i[r]=l}),i}f(re,"compileList");function Fe(){var e={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},n,i;function l(r){r.multi?(e.multi[r.kind].push(r),e.multi.fallback.push(r)):e[r.kind][r.tag]=e.fallback[r.tag]=r}for(f(l,"collectType"),n=0,i=arguments.length;n=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},"binary"),octal:f(function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},"octal"),decimal:f(function(e){return e.toString(10)},"decimal"),hexadecimal:f(function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)},"hexadecimal")},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),ki=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function Ve(e){return!(e===null||!ki.test(e)||e[e.length-1]==="_")}f(Ve,"resolveYamlFloat");function Xe(e){var n,i;return n=e.replace(/_/g,"").toLowerCase(),i=n[0]==="-"?-1:1,"+-".indexOf(n[0])>=0&&(n=n.slice(1)),n===".inf"?i===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:n===".nan"?NaN:i*parseFloat(n,10)}f(Xe,"constructYamlFloat");var Li=/^[-+]?[0-9]+e/;function Ze(e,n){var i;if(isNaN(e))switch(n){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(n){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(n){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(w.isNegativeZero(e))return"-0.0";return i=e.toString(10),Li.test(i)?i.replace("e",".e"):i}f(Ze,"representYamlFloat");function ze(e){return Object.prototype.toString.call(e)==="[object Number]"&&(e%1!==0||w.isNegativeZero(e))}f(ze,"isFloat");var Ni=new C("tag:yaml.org,2002:float",{kind:"scalar",resolve:Ve,construct:Xe,predicate:ze,represent:Ze,defaultStyle:"lowercase"}),Je=Ti.extend({implicit:[Ei,Oi,Ii,Ni]}),Ri=Je,en=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),nn=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function rn(e){return e===null?!1:en.exec(e)!==null||nn.exec(e)!==null}f(rn,"resolveYamlTimestamp");function ln(e){var n,i,l,r,u,o,c,a=0,t=null,d,p,s;if(n=en.exec(e),n===null&&(n=nn.exec(e)),n===null)throw new Error("Date resolve error");if(i=+n[1],l=+n[2]-1,r=+n[3],!n[4])return new Date(Date.UTC(i,l,r));if(u=+n[4],o=+n[5],c=+n[6],n[7]){for(a=n[7].slice(0,3);a.length<3;)a+="0";a=+a}return n[9]&&(d=+n[10],p=+(n[11]||0),t=(d*60+p)*6e4,n[9]==="-"&&(t=-t)),s=new Date(Date.UTC(i,l,r,u,o,c,a)),t&&s.setTime(s.getTime()-t),s}f(ln,"constructYamlTimestamp");function on(e){return e.toISOString()}f(on,"representYamlTimestamp");var Mi=new C("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:rn,construct:ln,instanceOf:Date,represent:on});function un(e){return e==="<<"||e===null}f(un,"resolveYamlMerge");var Yi=new C("tag:yaml.org,2002:merge",{kind:"scalar",resolve:un}),_e=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function cn(e){if(e===null)return!1;var n,i,l=0,r=e.length,u=_e;for(i=0;i64)){if(n<0)return!1;l+=6}return l%8===0}f(cn,"resolveYamlBinary");function fn(e){var n,i,l=e.replace(/[\r\n=]/g,""),r=l.length,u=_e,o=0,c=[];for(n=0;n>16&255),c.push(o>>8&255),c.push(o&255)),o=o<<6|u.indexOf(l.charAt(n));return i=r%4*6,i===0?(c.push(o>>16&255),c.push(o>>8&255),c.push(o&255)):i===18?(c.push(o>>10&255),c.push(o>>2&255)):i===12&&c.push(o>>4&255),new Uint8Array(c)}f(fn,"constructYamlBinary");function an(e){var n="",i=0,l,r,u=e.length,o=_e;for(l=0;l>18&63],n+=o[i>>12&63],n+=o[i>>6&63],n+=o[i&63]),i=(i<<8)+e[l];return r=u%3,r===0?(n+=o[i>>18&63],n+=o[i>>12&63],n+=o[i>>6&63],n+=o[i&63]):r===2?(n+=o[i>>10&63],n+=o[i>>4&63],n+=o[i<<2&63],n+=o[64]):r===1&&(n+=o[i>>2&63],n+=o[i<<4&63],n+=o[64],n+=o[64]),n}f(an,"representYamlBinary");function tn(e){return Object.prototype.toString.call(e)==="[object Uint8Array]"}f(tn,"isBinary");var Fi=new C("tag:yaml.org,2002:binary",{kind:"scalar",resolve:cn,construct:fn,predicate:tn,represent:an}),Pi=Object.prototype.hasOwnProperty,Bi=Object.prototype.toString;function pn(e){if(e===null)return!0;var n=[],i,l,r,u,o,c=e;for(i=0,l=c.length;i>10)+55296,(e-65536&1023)+56320)}f(xn,"charFromCodepoint");function we(e,n,i){n==="__proto__"?Object.defineProperty(e,n,{configurable:!0,enumerable:!0,writable:!0,value:i}):e[n]=i}f(we,"setProperty");var Tn=new Array(256),En=new Array(256);for(N=0;N<256;N++)Tn[N]=oe(N)?1:0,En[N]=oe(N);var N;function On(e,n){this.input=e,this.filename=n.filename||null,this.schema=n.schema||vn,this.onWarning=n.onWarning||null,this.legacy=n.legacy||!1,this.json=n.json||!1,this.listener=n.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}f(On,"State$1");function Ce(e,n){var i={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return i.snippet=yi(i),new x(n,i)}f(Ce,"generateError");function h(e,n){throw Ce(e,n)}f(h,"throwError");function H(e,n){e.onWarning&&e.onWarning.call(null,Ce(e,n))}f(H,"throwWarning");var Ee={YAML:f(function(n,i,l){var r,u,o;n.version!==null&&h(n,"duplication of %YAML directive"),l.length!==1&&h(n,"YAML directive accepts exactly one argument"),r=/^([0-9]+)\.([0-9]+)$/.exec(l[0]),r===null&&h(n,"ill-formed argument of the YAML directive"),u=parseInt(r[1],10),o=parseInt(r[2],10),u!==1&&h(n,"unacceptable YAML version of the document"),n.version=l[0],n.checkLineBreaks=o<2,o!==1&&o!==2&&H(n,"unsupported YAML version of the document")},"handleYamlDirective"),TAG:f(function(n,i,l){var r,u;l.length!==2&&h(n,"TAG directive accepts exactly two arguments"),r=l[0],u=l[1],_n.test(r)||h(n,"ill-formed tag handle (first argument) of the TAG directive"),L.call(n.tagMap,r)&&h(n,'there is a previously declared suffix for "'+r+'" tag handle'),wn.test(u)||h(n,"ill-formed tag prefix (second argument) of the TAG directive");try{u=decodeURIComponent(u)}catch(o){h(n,"tag prefix is malformed: "+u)}n.tagMap[r]=u},"handleTagDirective")};function I(e,n,i,l){var r,u,o,c;if(n1&&(e.result+=w.repeat(` +`,n-1))}f(ee,"writeFoldedLines");function In(e,n,i){var l,r,u,o,c,a,t,d,p=e.kind,s=e.result,m;if(m=e.input.charCodeAt(e.position),b(m)||R(m)||m===35||m===38||m===42||m===33||m===124||m===62||m===39||m===34||m===37||m===64||m===96||(m===63||m===45)&&(r=e.input.charCodeAt(e.position+1),b(r)||i&&R(r)))return!1;for(e.kind="scalar",e.result="",u=o=e.position,c=!1;m!==0;){if(m===58){if(r=e.input.charCodeAt(e.position+1),b(r)||i&&R(r))break}else if(m===35){if(l=e.input.charCodeAt(e.position-1),b(l))break}else{if(e.position===e.lineStart&&q(e)||i&&R(m))break;if(E(m))if(a=e.line,t=e.lineStart,d=e.lineIndent,_(e,!1,-1),e.lineIndent>=n){c=!0,m=e.input.charCodeAt(e.position);continue}else{e.position=o,e.line=a,e.lineStart=t,e.lineIndent=d;break}}c&&(I(e,u,o,!1),ee(e,e.line-a),u=o=e.position,c=!1),k(m)||(o=e.position+1),m=e.input.charCodeAt(++e.position)}return I(e,u,o,!1),e.result?!0:(e.kind=p,e.result=s,!1)}f(In,"readPlainScalar");function kn(e,n){var i,l,r;if(i=e.input.charCodeAt(e.position),i!==39)return!1;for(e.kind="scalar",e.result="",e.position++,l=r=e.position;(i=e.input.charCodeAt(e.position))!==0;)if(i===39)if(I(e,l,e.position,!0),i=e.input.charCodeAt(++e.position),i===39)l=e.position,e.position++,r=e.position;else return!0;else E(i)?(I(e,l,r,!0),ee(e,_(e,!1,n)),l=r=e.position):e.position===e.lineStart&&q(e)?h(e,"unexpected end of the document within a single quoted scalar"):(e.position++,r=e.position);h(e,"unexpected end of the stream within a single quoted scalar")}f(kn,"readSingleQuotedScalar");function Ln(e,n){var i,l,r,u,o,c;if(c=e.input.charCodeAt(e.position),c!==34)return!1;for(e.kind="scalar",e.result="",e.position++,i=l=e.position;(c=e.input.charCodeAt(e.position))!==0;){if(c===34)return I(e,i,e.position,!0),e.position++,!0;if(c===92){if(I(e,i,e.position,!0),c=e.input.charCodeAt(++e.position),E(c))_(e,!1,n);else if(c<256&&Tn[c])e.result+=En[c],e.position++;else if((o=Sn(c))>0){for(r=o,u=0;r>0;r--)c=e.input.charCodeAt(++e.position),(o=Cn(c))>=0?u=(u<<4)+o:h(e,"expected hexadecimal character");e.result+=xn(u),e.position++}else h(e,"unknown escape sequence");i=l=e.position}else E(c)?(I(e,i,l,!0),ee(e,_(e,!1,n)),i=l=e.position):e.position===e.lineStart&&q(e)?h(e,"unexpected end of the document within a double quoted scalar"):(e.position++,l=e.position)}h(e,"unexpected end of the stream within a double quoted scalar")}f(Ln,"readDoubleQuotedScalar");function Nn(e,n){var i=!0,l,r,u,o=e.tag,c,a=e.anchor,t,d,p,s,m,g=Object.create(null),A,y,T,v;if(v=e.input.charCodeAt(e.position),v===91)d=93,m=!1,c=[];else if(v===123)d=125,m=!0,c={};else return!1;for(e.anchor!==null&&(e.anchorMap[e.anchor]=c),v=e.input.charCodeAt(++e.position);v!==0;){if(_(e,!0,n),v=e.input.charCodeAt(e.position),v===d)return e.position++,e.tag=o,e.anchor=a,e.kind=m?"mapping":"sequence",e.result=c,!0;i?v===44&&h(e,"expected the node content, but found ','"):h(e,"missed comma between flow collection entries"),y=A=T=null,p=s=!1,v===63&&(t=e.input.charCodeAt(e.position+1),b(t)&&(p=s=!0,e.position++,_(e,!0,n))),l=e.line,r=e.lineStart,u=e.position,Y(e,n,Q,!1,!0),y=e.tag,A=e.result,_(e,!0,n),v=e.input.charCodeAt(e.position),(s||e.line===l)&&v===58&&(p=!0,v=e.input.charCodeAt(++e.position),_(e,!0,n),Y(e,n,Q,!1,!0),T=e.result),m?M(e,c,g,y,A,T,l,r,u):p?c.push(M(e,null,g,y,A,T,l,r,u)):c.push(A),_(e,!0,n),v=e.input.charCodeAt(e.position),v===44?(i=!0,v=e.input.charCodeAt(++e.position)):i=!1}h(e,"unexpected end of the stream within a flow collection")}f(Nn,"readFlowCollection");function Rn(e,n){var i,l,r=ie,u=!1,o=!1,c=n,a=0,t=!1,d,p;if(p=e.input.charCodeAt(e.position),p===124)l=!1;else if(p===62)l=!0;else return!1;for(e.kind="scalar",e.result="";p!==0;)if(p=e.input.charCodeAt(++e.position),p===43||p===45)ie===r?r=p===43?Te:qi:h(e,"repeat of a chomping mode identifier");else if((d=bn(p))>=0)d===0?h(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?h(e,"repeat of an indentation width identifier"):(c=n+d-1,o=!0);else break;if(k(p)){do p=e.input.charCodeAt(++e.position);while(k(p));if(p===35)do p=e.input.charCodeAt(++e.position);while(!E(p)&&p!==0)}for(;p!==0;){for(J(e),e.lineIndent=0,p=e.input.charCodeAt(e.position);(!o||e.lineIndentc&&(c=e.lineIndent),E(p)){a++;continue}if(e.lineIndentn)&&a!==0)h(e,"bad indentation of a sequence entry");else if(e.lineIndentn)&&(y&&(o=e.line,c=e.lineStart,a=e.position),Y(e,n,V,!0,r)&&(y?g=e.result:A=e.result),y||(M(e,p,s,m,g,A,o,c,a),m=g=A=null),_(e,!0,-1),v=e.input.charCodeAt(e.position)),(e.line===u||e.lineIndent>n)&&v!==0)h(e,"bad indentation of a mapping entry");else if(e.lineIndentn?a=1:e.lineIndent===n?a=0:e.lineIndentn?a=1:e.lineIndent===n?a=0:e.lineIndent tag; it should be "scalar", not "'+e.kind+'"'),p=0,s=e.implicitTypes.length;p"),e.result!==null&&g.kind!==e.kind&&h(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+g.kind+'", not "'+e.kind+'"'),g.resolve(e.result,e.tag)?(e.result=g.construct(e.result,e.tag),e.anchor!==null&&(e.anchorMap[e.anchor]=e.result)):h(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return e.listener!==null&&e.listener("close",e),e.tag!==null||e.anchor!==null||d}f(Y,"composeNode");function Bn(e){var n=e.position,i,l,r,u=!1,o;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);(o=e.input.charCodeAt(e.position))!==0&&(_(e,!0,-1),o=e.input.charCodeAt(e.position),!(e.lineIndent>0||o!==37));){for(u=!0,o=e.input.charCodeAt(++e.position),i=e.position;o!==0&&!b(o);)o=e.input.charCodeAt(++e.position);for(l=e.input.slice(i,e.position),r=[],l.length<1&&h(e,"directive name must not be less than one character in length");o!==0;){for(;k(o);)o=e.input.charCodeAt(++e.position);if(o===35){do o=e.input.charCodeAt(++e.position);while(o!==0&&!E(o));break}if(E(o))break;for(i=e.position;o!==0&&!b(o);)o=e.input.charCodeAt(++e.position);r.push(e.input.slice(i,e.position))}o!==0&&J(e),L.call(Ee,l)?Ee[l](e,l,r):H(e,'unknown document directive "'+l+'"')}if(_(e,!0,-1),e.lineIndent===0&&e.input.charCodeAt(e.position)===45&&e.input.charCodeAt(e.position+1)===45&&e.input.charCodeAt(e.position+2)===45?(e.position+=3,_(e,!0,-1)):u&&h(e,"directives end mark is expected"),Y(e,e.lineIndent-1,V,!1,!0),_(e,!0,-1),e.checkLineBreaks&&Gi.test(e.input.slice(n,e.position))&&H(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&q(e)){e.input.charCodeAt(e.position)===46&&(e.position+=3,_(e,!0,-1));return}if(e.position"u"&&(i=n,n=null);var l=Se(e,i);if(typeof n!="function")return l;for(var r=0,u=l.length;r=55296&&i<=56319&&n+1=56320&&l<=57343)?(i-55296)*1024+l-56320+65536:i}f(P,"codePointAt");function xe(e){var n=/^\n* /;return n.test(e)}f(xe,"needIndentIndicator");var ni=1,he=2,ii=3,ri=4,F=5;function li(e,n,i,l,r,u,o,c){var a,t=0,d=null,p=!1,s=!1,m=l!==-1,g=-1,A=Jn(P(e,0))&&ei(P(e,e.length-1));if(n||o)for(a=0;a=65536?a+=2:a++){if(t=P(e,a),!D(t))return F;A=A&&pe(t,d,c),d=t}else{for(a=0;a=65536?a+=2:a++){if(t=P(e,a),t===j)p=!0,m&&(s=s||a-g-1>l&&e[g+1]!==" ",g=a);else if(!D(t))return F;A=A&&pe(t,d,c),d=t}s=s||m&&a-g-1>l&&e[g+1]!==" "}return!p&&!s?A&&!o&&!r(e)?ni:u===U?F:he:i>9&&xe(e)?F:o?u===U?F:he:s?ri:ii}f(li,"chooseScalarStyle");function oi(e,n,i,l,r){e.dump=(function(){if(n.length===0)return e.quotingType===U?'""':"''";if(!e.noCompatMode&&(hr.indexOf(n)!==-1||dr.test(n)))return e.quotingType===U?'"'+n+'"':"'"+n+"'";var u=e.indent*Math.max(1,i),o=e.lineWidth===-1?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-u),c=l||e.flowLevel>-1&&i>=e.flowLevel;function a(t){return zn(e,t)}switch(f(a,"testAmbiguity"),li(n,c,e.indent,o,a,e.quotingType,e.forceQuotes&&!l,r)){case ni:return n;case he:return"'"+n.replace(/'/g,"''")+"'";case ii:return"|"+de(n,e.indent)+se(ae(n,u));case ri:return">"+de(n,e.indent)+se(ae(ui(n,o),u));case F:return'"'+ci(n)+'"';default:throw new x("impossible error: invalid scalar style")}})()}f(oi,"writeScalar");function de(e,n){var i=xe(e)?String(n):"",l=e[e.length-1]===` +`,r=l&&(e[e.length-2]===` +`||e===` +`),u=r?"+":l?"":"-";return i+u+` +`}f(de,"blockHeader");function se(e){return e[e.length-1]===` +`?e.slice(0,-1):e}f(se,"dropEndingNewline");function ui(e,n){for(var i=/(\n+)([^\n]*)/g,l=(function(){var t=e.indexOf(` +`);return t=t!==-1?t:e.length,i.lastIndex=t,me(e.slice(0,t),n)})(),r=e[0]===` +`||e[0]===" ",u,o;o=i.exec(e);){var c=o[1],a=o[2];u=a[0]===" ",l+=c+(!r&&!u&&a!==""?` +`:"")+me(a,n),r=u}return l}f(ui,"foldString");function me(e,n){if(e===""||e[0]===" ")return e;for(var i=/ [^ ]/g,l,r=0,u,o=0,c=0,a="";l=i.exec(e);)c=l.index,c-r>n&&(u=o>r?o:c,a+=` +`+e.slice(r,u),r=u+1),o=c;return a+=` +`,e.length-r>n&&o>r?a+=e.slice(r,o)+` +`+e.slice(o+1):a+=e.slice(r),a.slice(1)}f(me,"foldLine");function ci(e){for(var n="",i=0,l,r=0;r=65536?r+=2:r++)i=P(e,r),l=S[i],!l&&D(i)?(n+=e[r],i>=65536&&(n+=e[r+1])):n+=l||Xn(i);return n}f(ci,"escapeString");function fi(e,n,i){var l="",r=e.tag,u,o,c;for(u=0,o=i.length;u"u"&&O(e,n,null,!1,!1))&&(l!==""&&(l+=","+(e.condenseFlow?"":" ")),l+=e.dump);e.tag=r,e.dump="["+l+"]"}f(fi,"writeFlowSequence");function ge(e,n,i,l){var r="",u=e.tag,o,c,a;for(o=0,c=i.length;o"u"&&O(e,n+1,null,!0,!0,!1,!0))&&((!l||r!=="")&&(r+=Z(e,n)),e.dump&&j===e.dump.charCodeAt(0)?r+="-":r+="- ",r+=e.dump);e.tag=u,e.dump=r||"[]"}f(ge,"writeBlockSequence");function ai(e,n,i){var l="",r=e.tag,u=Object.keys(i),o,c,a,t,d;for(o=0,c=u.length;o1024&&(d+="? "),d+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),O(e,n,t,!1,!1)&&(d+=e.dump,l+=d));e.tag=r,e.dump="{"+l+"}"}f(ai,"writeFlowMapping");function ti(e,n,i,l){var r="",u=e.tag,o=Object.keys(i),c,a,t,d,p,s;if(e.sortKeys===!0)o.sort();else if(typeof e.sortKeys=="function")o.sort(e.sortKeys);else if(e.sortKeys)throw new x("sortKeys must be a boolean or a function");for(c=0,a=o.length;c1024,p&&(e.dump&&j===e.dump.charCodeAt(0)?s+="?":s+="? "),s+=e.dump,p&&(s+=Z(e,n)),O(e,n+1,d,!0,p)&&(e.dump&&j===e.dump.charCodeAt(0)?s+=":":s+=": ",s+=e.dump,r+=s));e.tag=u,e.dump=r||"{}"}f(ti,"writeBlockMapping");function ve(e,n,i){var l,r,u,o,c,a;for(r=i?e.explicitTypes:e.implicitTypes,u=0,o=r.length;u tag resolver accepts not "'+a+'" style');e.dump=l}return!0}return!1}f(ve,"detectType");function O(e,n,i,l,r,u,o){e.tag=null,e.dump=i,ve(e,i,!1)||ve(e,i,!0);var c=Un.call(e.dump),a=l,t;l&&(l=e.flowLevel<0||e.flowLevel>n);var d=c==="[object Object]"||c==="[object Array]",p,s;if(d&&(p=e.duplicates.indexOf(i),s=p!==-1),(e.tag!==null&&e.tag!=="?"||s||e.indent!==2&&n>0)&&(r=!1),s&&e.usedDuplicates[p])e.dump="*ref_"+p;else{if(d&&s&&!e.usedDuplicates[p]&&(e.usedDuplicates[p]=!0),c==="[object Object]")l&&Object.keys(e.dump).length!==0?(ti(e,n,e.dump,r),s&&(e.dump="&ref_"+p+e.dump)):(ai(e,n,e.dump),s&&(e.dump="&ref_"+p+" "+e.dump));else if(c==="[object Array]")l&&e.dump.length!==0?(e.noArrayIndent&&!o&&n>0?ge(e,n-1,e.dump,r):ge(e,n,e.dump,r),s&&(e.dump="&ref_"+p+e.dump)):(fi(e,n,e.dump),s&&(e.dump="&ref_"+p+" "+e.dump));else if(c==="[object String]")e.tag!=="?"&&oi(e,e.dump,n,u,a);else{if(c==="[object Undefined]")return!1;if(e.skipInvalid)return!1;throw new x("unacceptable kind of an object to dump "+c)}e.tag!==null&&e.tag!=="?"&&(t=encodeURI(e.tag[0]==="!"?e.tag.slice(1):e.tag).replace(/!/g,"%21"),e.tag[0]==="!"?t="!"+t:t.slice(0,18)==="tag:yaml.org,2002:"?t="!!"+t.slice(18):t="!<"+t+">",e.dump=t+" "+e.dump)}return!0}f(O,"writeNode");function pi(e,n){var i=[],l=[],r,u;for(z(e,i,l),r=0,u=l.length;rn(null,null,function*(){let t=yield g("info",e);a.debug(t)}),"parse")},d={version:"11.13.0"},m=r(()=>d.version,"getVersion"),c={getVersion:m},f=r((e,t,p)=>{a.debug(`rendering info diagram +`+e);let o=s(t);i(o,100,400,!0),o.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${p}`)},"draw"),u={draw:f},w={parser:v,db:c,renderer:u};export{w as diagram}; diff --git a/src/google/adk/cli/browser/index.html b/src/google/adk/cli/browser/index.html index 6ebcfa79d8..a6c9b379f8 100644 --- a/src/google/adk/cli/browser/index.html +++ b/src/google/adk/cli/browser/index.html @@ -26,9 +26,237 @@ - - + + + - + + + + + + + + + + + + + diff --git a/src/google/adk/cli/browser/main-LMS5QHZN.js b/src/google/adk/cli/browser/main-LMS5QHZN.js new file mode 100644 index 0000000000..791c666ac5 --- /dev/null +++ b/src/google/adk/cli/browser/main-LMS5QHZN.js @@ -0,0 +1,4177 @@ +import{a as $R}from"./chunk-TPDTRWWV.js";import{a as AN,b as eN}from"./chunk-ZMOC4H7T.js";import{a as sN}from"./chunk-F57TI45K.js";import"./chunk-TNJPXCAB.js";import"./chunk-JHZIBEJC.js";import"./chunk-W7PRDKNL.js";import"./chunk-DRBE27N3.js";import"./chunk-PRKFGJVH.js";import"./chunk-VDPKVNDJ.js";import{a as aN,c as rN}from"./chunk-WXI2IBAH.js";import{b as tN,j as OD,l as iN,m as ad,n as nN,o as oN}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as od,B as VR,C as Dh,E as WR,N as ZR,P as XR,ba as yh,ca as x3,g as UR,h as TR,j as JR,k as S3,l as TD,m as k3,n as YR,o as OR,q as _3,t as JD,u as HR,v as zR,w as PR,x as jR,y as YD,z as qR}from"./chunk-QFMJV7VH.js";import{a as xs,b as GD,d as KD,e as KR,g as fe,i as Ka,j as UD}from"./chunk-JRNAXTJ7.js";import{$ as C1,F as Vi,G as zi,H as _i,K as NR,N as wh,P as FR,R as LD,W as LR,X as GR,a as va,f as M3,g as kR,j as mh,m as Ni,q as _R,u as bc,v as xR,z as RR}from"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{$ as ph,$a as bA,$b as iA,$c as QR,A as uc,Aa as _n,Ab as lA,Ac as cR,B as DC,Ba as Zt,Bb as Dn,Bc as fi,C as pc,Ca as Mi,Cb as Tn,Cc as De,D as I3,Da as se,Db as Jn,Dc as ko,E as Ti,Ea as pg,Eb as Il,Ec as CR,F as Px,Fa as E3,Fb as dl,Fc as m0,G as Ct,Ga as h3,Gb as gn,Gc as wt,H as jx,Ha as r1,Hb as rA,Hc as c1,I as a1,Ia as AR,Ib as Ea,Ic as Ee,J as qo,Ja as eR,Jb as T,Jc as dn,K as Qh,Ka as fg,Kb as td,Kc as IR,L as Ms,La as fc,Lb as p,Lc as v3,M as po,Ma as so,Mb as Nt,Mc as dR,N as uh,Na as mc,Nb as Ve,Nc as _s,O as ug,Oa as Ad,Ob as Vo,Oc as RD,P as d3,Pa as u,Pb as Yt,Pc as BR,Q as to,Qa as Q3,Qb as oe,Qc as ND,R as MD,Ra as jn,Rb as ae,Rc as ER,S as yC,Sa as lo,Sb as y3,Sc as Dc,T as vC,Ta as Rr,Tb as Xr,Tc as hR,U as Ss,Ua as qi,Ub as Er,Uc as Fl,V as Cl,Va as ot,Vb as gi,Vc as yc,W as kn,Wa as u3,Wb as ht,Wc as id,X as pi,Xa as So,Xb as xA,Xc as Ll,Y as ut,Ya as kD,Yb as oR,Yc as nd,Z as qx,Za as tR,Zb as go,Zc as vc,_ as Ei,_a as p3,_b as y,_c as $r,a as Mo,aa as St,ab as $e,ac as Be,ad as uR,b as Jx,ba as Vx,bb as qA,bc as ya,bd as b3,c as Yx,ca as Ga,cb as _D,cc as Di,cd as si,d as bi,da as jA,db as f3,dc as hi,dd as w0,e as Ox,ea as Xe,eb as mt,ec as yi,ed as FD,f as te,fa as Wx,fb as yt,fc as Uo,fd as pR,g as Hx,ga as MA,gb as m3,gc as Wo,gd as fR,h as ti,ha as Ko,hb as iR,hc as xn,hd as mR,i as Qg,ia as w,ib as s1,ic as bC,id as hr,j as vD,ja as Zx,jb as w3,jc as fh,jd as wR,k as l3,ka as xr,kb as xD,kc as aR,kd as DR,l as ZI,la as Br,lb as nR,lc as Et,ld as SC,m as nr,ma as Xx,mb as p0,mc as wc,md as yR,n as hh,na as G,nb as D3,nc as Nl,nd as vR,o as XI,oa as K,ob as ee,oc as g1,od as bR,p as _r,pa as It,pb as ed,pc as Ht,q as ie,qa as or,qb as Y,qc as ci,r as g3,ra as Dt,rb as l1,rc as f0,rd as MR,s as $I,sa as ii,sb as O,sc as MC,sd as SR,t as zx,ta as ar,tb as Nr,tc as rR,u as c3,ua as $x,ub as ni,uc as sR,v as ye,va as LA,vb as xe,vc as ca,w as dr,wa as qe,wb as Re,wc as me,x as Qc,xa as B3,xb as H,xc as lR,y as bD,ya as SD,yb as d,yc as gR,z as C3,za as mA,zb as E,zc as ks}from"./chunk-2SRK2U7X.js";import{a as oA,b as Oe,c as Tx,e as r3,h as s3,j as Ie,k as ce}from"./chunk-RMXJBC7V.js";var oT=r3(a7=>{"use strict";var nT={b:"\b",f:"\f",n:` +`,r:"\r",t:" ",'"':'"',"/":"/","\\":"\\"},LrA=97;a7.parse=function(i,e,A){var t={},n=0,o=0,a=0,r=A&&A.bigint&&typeof BigInt<"u";return{data:s("",!0),pointers:t};function s(P,Z){l();var AA;S(P,"value");var W=h();switch(W){case"t":Q("rue"),AA=!0;break;case"f":Q("alse"),AA=!1;break;case"n":Q("ull"),AA=null;break;case'"':AA=g();break;case"[":AA=I(P);break;case"{":AA=B(P);break;default:f(),"-0123456789".indexOf(W)>=0?AA=C():x()}return S(P,"valueEnd"),l(),Z&&aNumber.MAX_SAFE_INTEGER||AA="a"&&AA<="f"?Z+=AA.charCodeAt()-LrA+10:AA>="0"&&AA<="9"?Z+=+AA:F()}return String.fromCharCode(Z)}function v(){for(var P="";i[a]>="0"&&i[a]<="9";)P+=h();if(P.length)return P;z(),x()}function S(P,Z){k(P,Z,M())}function k(P,Z,AA){t[P]=t[P]||{},t[P][Z]=AA}function M(){return{line:n,column:o,pos:a}}function x(){throw new SyntaxError("Unexpected token "+i[a]+" in JSON at position "+a)}function F(){f(),x()}function z(){if(a>=i.length)throw new SyntaxError("Unexpected end of JSON input")}};a7.stringify=function(i,e,A){if(!Rm(i))return;var t=0,n,o,a=typeof A=="object"?A.space:A;switch(typeof a){case"number":var r=a>10?10:a<0?0:Math.floor(a);a=r&&k(r," "),n=r,o=r;break;case"string":a=a.slice(0,10),n=0,o=0;for(var s=0;s=0}var KrA=/"|\\/g,UrA=/[\b]/g,TrA=/\f/g,JrA=/\n/g,YrA=/\r/g,OrA=/\t/g;function Nm(i){return i=i.replace(KrA,"\\$&").replace(TrA,"\\f").replace(UrA,"\\b").replace(JrA,"\\n").replace(YrA,"\\r").replace(OrA,"\\t"),'"'+i+'"'}var HrA=/~/g,zrA=/\//g;function o7(i){return i.replace(HrA,"~0").replace(zrA,"~1")}});var HT=r3((wWA,OT)=>{"use strict";var YT=function(i,e){var A,t,n=1,o=0,a=0,r=String.alphabet;function s(l,g,C){if(C){for(A=g;C=s(l,A),C<76&&C>65;)++A;return+l.slice(g-1,A)}return C=r&&r.indexOf(l.charAt(g)),C>-1?C+76:(C=l.charCodeAt(g)||0,C<45||C>127?C:C<46?65:C<48?C-1:C<58?C+18:C<65?C-11:C<91?C+11:C<97?C-37:C<123?C+5:C-63)}if((i+="")!=(e+="")){for(;n;)if(t=s(i,o++),n=s(e,a++),t<76&&n<76&&t>66&&n>66&&(t=s(i,o,o),n=s(e,a,o=A),a=A),t!=n)return t{"use strict";(function(i){"use strict";function e(j){return j!==null?Object.prototype.toString.call(j)==="[object Array]":!1}function A(j){return j!==null?Object.prototype.toString.call(j)==="[object Object]":!1}function t(j,X){if(j===X)return!0;var tA=Object.prototype.toString.call(j);if(tA!==Object.prototype.toString.call(X))return!1;if(e(j)===!0){if(j.length!==X.length)return!1;for(var nA=0;nA",9:"Array"},S="EOF",k="UnquotedIdentifier",M="QuotedIdentifier",x="Rbracket",F="Rparen",z="Comma",P="Colon",Z="Rbrace",AA="Number",W="Current",CA="Expref",wA="Pipe",BA="Or",QA="And",RA="EQ",IA="GT",dA="LT",_A="GTE",VA="LTE",he="NE",HA="Flatten",vA="Star",PA="Filter",et="Dot",We="Not",OA="Lbrace",EA="Lbracket",XA="Lparen",pA="Literal",Ae={".":et,"*":vA,",":z,":":P,"{":OA,"}":Z,"]":x,"(":XA,")":F,"@":W},NA={"<":!0,">":!0,"=":!0,"!":!0},Ne={" ":!0," ":!0,"\n":!0};function YA(j){return j>="a"&&j<="z"||j>="A"&&j<="Z"||j==="_"}function DA(j){return j>="0"&&j<="9"||j==="-"}function Kt(j){return j>="a"&&j<="z"||j>="A"&&j<="Z"||j>="0"&&j<="9"||j==="_"}function pt(){}pt.prototype={tokenize:function(j){var X=[];this._current=0;for(var tA,nA,UA;this._current")return j[this._current]==="="?(this._current++,{type:_A,value:">=",start:X}):{type:IA,value:">",start:X};if(tA==="="&&j[this._current]==="=")return this._current++,{type:RA,value:"==",start:X}},_consumeLiteral:function(j){this._current++;for(var X=this._current,tA=j.length,nA;j[this._current]!=="`"&&this._current=0)return!0;if(tA.indexOf(j)>=0)return!0;if(nA.indexOf(j[0])>=0)try{return JSON.parse(j),!0}catch(UA){return!1}else return!1}};var ue={};ue[S]=0,ue[k]=0,ue[M]=0,ue[x]=0,ue[F]=0,ue[z]=0,ue[Z]=0,ue[AA]=0,ue[W]=0,ue[CA]=0,ue[wA]=1,ue[BA]=2,ue[QA]=3,ue[RA]=5,ue[IA]=5,ue[dA]=5,ue[_A]=5,ue[VA]=5,ue[he]=5,ue[HA]=9,ue[vA]=20,ue[PA]=21,ue[et]=40,ue[We]=45,ue[OA]=50,ue[EA]=55,ue[XA]=60;function Ot(){}Ot.prototype={parse:function(j){this._loadTokens(j),this.index=0;var X=this.expression(0);if(this._lookahead(0)!==S){var tA=this._lookaheadToken(0),nA=new Error("Unexpected token type: "+tA.type+", value: "+tA.value);throw nA.name="ParserError",nA}return X},_loadTokens:function(j){var X=new pt,tA=X.tokenize(j);tA.push({type:S,value:"",start:j.length}),this.tokens=tA},expression:function(j){var X=this._lookaheadToken(0);this._advance();for(var tA=this.nud(X),nA=this._lookahead(0);j=0)return this.expression(j);if(X===EA)return this._match(EA),this._parseMultiselectList();if(X===OA)return this._match(OA),this._parseMultiselectHash()},_parseProjectionRHS:function(j){var X;if(ue[this._lookahead(0)]<10)X={type:"Identity"};else if(this._lookahead(0)===EA)X=this.expression(j);else if(this._lookahead(0)===PA)X=this.expression(j);else if(this._lookahead(0)===et)this._match(et),X=this._parseDotRHS(j);else{var tA=this._lookaheadToken(0),nA=new Error("Sytanx error, unexpected token: "+tA.value+"("+tA.type+")");throw nA.name="ParserError",nA}return X},_parseMultiselectList:function(){for(var j=[];this._lookahead(0)!==x;){var X=this.expression(0);if(j.push(X),this._lookahead(0)===z&&(this._match(z),this._lookahead(0)===x))throw new Error("Unexpected token Rbracket")}return this._match(x),{type:"MultiSelectList",children:j}},_parseMultiselectHash:function(){for(var j=[],X=[k,M],tA,nA,UA,de;;){if(tA=this._lookaheadToken(0),X.indexOf(tA.type)<0)throw new Error("Expecting an identifier token, got: "+tA.type);if(nA=tA.value,this._advance(),this._match(P),UA=this.expression(0),de={type:"KeyValuePair",name:nA,value:UA},j.push(de),this._lookahead(0)===z)this._match(z);else if(this._lookahead(0)===Z){this._match(Z);break}}return{type:"MultiSelectHash",children:j}}};function He(j){this.runtime=j}He.prototype={search:function(j,X){return this.visit(j,X)},visit:function(j,X){var tA,nA,UA,de,pe,GA,JA,Qt,nt,ze;switch(j.type){case"Field":return X!==null&&A(X)?(GA=X[j.name],GA===void 0?null:GA):null;case"Subexpression":for(UA=this.visit(j.children[0],X),ze=1;ze0)for(ze=Qn;zeJe;ze+=an)UA.push(X[ze]);return UA;case"Projection":var ki=this.visit(j.children[0],X);if(!e(ki))return null;for(nt=[],ze=0;zepe;break;case _A:UA=de>=pe;break;case dA:UA=de=j&&(X=tA<0?j-1:j),X}};function je(j){this._interpreter=j,this.functionTable={abs:{_func:this._functionAbs,_signature:[{types:[s]}]},avg:{_func:this._functionAvg,_signature:[{types:[f]}]},ceil:{_func:this._functionCeil,_signature:[{types:[s]}]},contains:{_func:this._functionContains,_signature:[{types:[g,C]},{types:[l]}]},ends_with:{_func:this._functionEndsWith,_signature:[{types:[g]},{types:[g]}]},floor:{_func:this._functionFloor,_signature:[{types:[s]}]},length:{_func:this._functionLength,_signature:[{types:[g,C,I]}]},map:{_func:this._functionMap,_signature:[{types:[Q]},{types:[C]}]},max:{_func:this._functionMax,_signature:[{types:[f,m]}]},merge:{_func:this._functionMerge,_signature:[{types:[I],variadic:!0}]},max_by:{_func:this._functionMaxBy,_signature:[{types:[C]},{types:[Q]}]},sum:{_func:this._functionSum,_signature:[{types:[f]}]},starts_with:{_func:this._functionStartsWith,_signature:[{types:[g]},{types:[g]}]},min:{_func:this._functionMin,_signature:[{types:[f,m]}]},min_by:{_func:this._functionMinBy,_signature:[{types:[C]},{types:[Q]}]},type:{_func:this._functionType,_signature:[{types:[l]}]},keys:{_func:this._functionKeys,_signature:[{types:[I]}]},values:{_func:this._functionValues,_signature:[{types:[I]}]},sort:{_func:this._functionSort,_signature:[{types:[m,f]}]},sort_by:{_func:this._functionSortBy,_signature:[{types:[C]},{types:[Q]}]},join:{_func:this._functionJoin,_signature:[{types:[g]},{types:[m]}]},reverse:{_func:this._functionReverse,_signature:[{types:[g,C]}]},to_array:{_func:this._functionToArray,_signature:[{types:[l]}]},to_string:{_func:this._functionToString,_signature:[{types:[l]}]},to_number:{_func:this._functionToNumber,_signature:[{types:[l]}]},not_null:{_func:this._functionNotNull,_signature:[{types:[l],variadic:!0}]}}}je.prototype={callFunction:function(j,X){var tA=this.functionTable[j];if(tA===void 0)throw new Error("Unknown function: "+j+"()");return this._validateArgs(j,X,tA._signature),tA._func.call(this,X)},_validateArgs:function(j,X,tA){var nA;if(tA[tA.length-1].variadic){if(X.length=0;UA--)nA+=tA[UA];return nA}else{var de=j[0].slice(0);return de.reverse(),de}},_functionAbs:function(j){return Math.abs(j[0])},_functionCeil:function(j){return Math.ceil(j[0])},_functionAvg:function(j){for(var X=0,tA=j[0],nA=0;nA=0},_functionFloor:function(j){return Math.floor(j[0])},_functionLength:function(j){return A(j[0])?Object.keys(j[0]).length:j[0].length},_functionMap:function(j){for(var X=[],tA=this._interpreter,nA=j[0],UA=j[1],de=0;de0){var X=this._getTypeName(j[0][0]);if(X===s)return Math.max.apply(Math,j[0]);for(var tA=j[0],nA=tA[0],UA=1;UA0){var X=this._getTypeName(j[0][0]);if(X===s)return Math.min.apply(Math,j[0]);for(var tA=j[0],nA=tA[0],UA=1;UAYe?1:zeUA&&(UA=pe,de=tA[GA]);return de},_functionMinBy:function(j){for(var X=j[1],tA=j[0],nA=this.createKeyFunction(X,[s,g]),UA=1/0,de,pe,GA=0;GA"u"?Jm.jmespath={}:Jm)});var QZ=r3((Cie,d5)=>{"use strict";var fmA=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};var _t=(function(i){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,A=0,t={},n={manual:i.Prism&&i.Prism.manual,disableWorkerMessageHandler:i.Prism&&i.Prism.disableWorkerMessageHandler,util:{encode:function h(f){return f instanceof o?new o(f.type,h(f.content),f.alias):Array.isArray(f)?f.map(h):f.replace(/&/g,"&").replace(/"u")return null;if(document.currentScript&&document.currentScript.tagName==="SCRIPT")return document.currentScript;try{throw new Error}catch(v){var h=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(v.stack)||[])[1];if(h){var f=document.getElementsByTagName("script");for(var m in f)if(f[m].src==h)return f[m]}return null}},isActive:function(h,f,m){for(var v="no-"+f;h;){var S=h.classList;if(S.contains(f))return!0;if(S.contains(v))return!1;h=h.parentElement}return!!m}},languages:{plain:t,plaintext:t,text:t,txt:t,extend:function(h,f){var m=n.util.clone(n.languages[h]);for(var v in f)m[v]=f[v];return m},insertBefore:function(h,f,m,v){v=v||n.languages;var S=v[h],k={};for(var M in S)if(S.hasOwnProperty(M)){if(M==f)for(var x in m)m.hasOwnProperty(x)&&(k[x]=m[x]);m.hasOwnProperty(M)||(k[M]=S[M])}var F=v[h];return v[h]=k,n.languages.DFS(n.languages,function(z,P){P===F&&z!=h&&(this[z]=k)}),k},DFS:function h(f,m,v,S){S=S||{};var k=n.util.objId;for(var M in f)if(f.hasOwnProperty(M)){m.call(f,M,f[M],v||M);var x=f[M],F=n.util.type(x);F==="Object"&&!S[k(x)]?(S[k(x)]=!0,h(x,m,null,S)):F==="Array"&&!S[k(x)]&&(S[k(x)]=!0,h(x,m,M,S))}}},plugins:{},highlightAll:function(h,f){n.highlightAllUnder(document,h,f)},highlightAllUnder:function(h,f,m){var v={callback:m,container:h,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};n.hooks.run("before-highlightall",v),v.elements=Array.prototype.slice.apply(v.container.querySelectorAll(v.selector)),n.hooks.run("before-all-elements-highlight",v);for(var S=0,k;k=v.elements[S++];)n.highlightElement(k,f===!0,v.callback)},highlightElement:function(h,f,m){var v=n.util.getLanguage(h),S=n.languages[v];n.util.setLanguage(h,v);var k=h.parentElement;k&&k.nodeName.toLowerCase()==="pre"&&n.util.setLanguage(k,v);var M=h.textContent,x={element:h,language:v,grammar:S,code:M};function F(P){x.highlightedCode=P,n.hooks.run("before-insert",x),x.element.innerHTML=x.highlightedCode,n.hooks.run("after-highlight",x),n.hooks.run("complete",x),m&&m.call(x.element)}if(n.hooks.run("before-sanity-check",x),k=x.element.parentElement,k&&k.nodeName.toLowerCase()==="pre"&&!k.hasAttribute("tabindex")&&k.setAttribute("tabindex","0"),!x.code){n.hooks.run("complete",x),m&&m.call(x.element);return}if(n.hooks.run("before-highlight",x),!x.grammar){F(n.util.encode(x.code));return}if(f&&i.Worker){var z=new Worker(n.filename);z.onmessage=function(P){F(P.data)},z.postMessage(JSON.stringify({language:x.language,code:x.code,immediateClose:!0}))}else F(n.highlight(x.code,x.grammar,x.language))},highlight:function(h,f,m){var v={code:h,grammar:f,language:m};if(n.hooks.run("before-tokenize",v),!v.grammar)throw new Error('The language "'+v.language+'" has no grammar.');return v.tokens=n.tokenize(v.code,v.grammar),n.hooks.run("after-tokenize",v),o.stringify(n.util.encode(v.tokens),v.language)},tokenize:function(h,f){var m=f.rest;if(m){for(var v in m)f[v]=m[v];delete f.rest}var S=new s;return l(S,S.head,h),r(h,S,f,S.head,0),C(S)},hooks:{all:{},add:function(h,f){var m=n.hooks.all;m[h]=m[h]||[],m[h].push(f)},run:function(h,f){var m=n.hooks.all[h];if(!(!m||!m.length))for(var v=0,S;S=m[v++];)S(f)}},Token:o};i.Prism=n;function o(h,f,m,v){this.type=h,this.content=f,this.alias=m,this.length=(v||"").length|0}o.stringify=function h(f,m){if(typeof f=="string")return f;if(Array.isArray(f)){var v="";return f.forEach(function(F){v+=h(F,m)}),v}var S={type:f.type,content:h(f.content,m),tag:"span",classes:["token",f.type],attributes:{},language:m},k=f.alias;k&&(Array.isArray(k)?Array.prototype.push.apply(S.classes,k):S.classes.push(k)),n.hooks.run("wrap",S);var M="";for(var x in S.attributes)M+=" "+x+'="'+(S.attributes[x]||"").replace(/"/g,""")+'"';return"<"+S.tag+' class="'+S.classes.join(" ")+'"'+M+">"+S.content+""};function a(h,f,m,v){h.lastIndex=f;var S=h.exec(m);if(S&&v&&S[1]){var k=S[1].length;S.index+=k,S[0]=S[0].slice(k)}return S}function r(h,f,m,v,S,k){for(var M in m)if(!(!m.hasOwnProperty(M)||!m[M])){var x=m[M];x=Array.isArray(x)?x:[x];for(var F=0;F=k.reach);QA+=BA.value.length,BA=BA.next){var RA=BA.value;if(f.length>h.length)return;if(!(RA instanceof o)){var IA=1,dA;if(AA){if(dA=a(wA,QA,h,Z),!dA||dA.index>=h.length)break;var HA=dA.index,_A=dA.index+dA[0].length,VA=QA;for(VA+=BA.value.length;HA>=VA;)BA=BA.next,VA+=BA.value.length;if(VA-=BA.value.length,QA=VA,BA.value instanceof o)continue;for(var he=BA;he!==f.tail&&(VA<_A||typeof he.value=="string");he=he.next)IA++,VA+=he.value.length;IA--,RA=h.slice(QA,VA),dA.index-=QA}else if(dA=a(wA,0,RA,Z),!dA)continue;var HA=dA.index,vA=dA[0],PA=RA.slice(0,HA),et=RA.slice(HA+vA.length),We=QA+RA.length;k&&We>k.reach&&(k.reach=We);var OA=BA.prev;PA&&(OA=l(f,OA,PA),QA+=PA.length),g(f,OA,IA);var EA=new o(M,P?n.tokenize(vA,P):vA,W,vA);if(BA=l(f,OA,EA),et&&l(f,BA,et),IA>1){var XA={cause:M+","+F,reach:We};r(h,f,m,BA.prev,QA,XA),k&&XA.reach>k.reach&&(k.reach=XA.reach)}}}}}}function s(){var h={value:null,prev:null,next:null},f={value:null,prev:h,next:null};h.next=f,this.head=h,this.tail=f,this.length=0}function l(h,f,m){var v=f.next,S={value:m,prev:f,next:v};return f.next=S,v.prev=S,h.length++,S}function g(h,f,m){for(var v=f.next,S=0;S/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]};_t.languages.markup.tag.inside["attr-value"].inside.entity=_t.languages.markup.entity;_t.languages.markup.doctype.inside["internal-subset"].inside=_t.languages.markup;_t.hooks.add("wrap",function(i){i.type==="entity"&&(i.attributes.title=i.content.replace(/&/,"&"))});Object.defineProperty(_t.languages.markup.tag,"addInlined",{value:function(e,A){var t={};t["language-"+A]={pattern:/(^$)/i,lookbehind:!0,inside:_t.languages[A]},t.cdata=/^$/i;var n={"included-cdata":{pattern://i,inside:t}};n["language-"+A]={pattern:/[\s\S]+/,inside:_t.languages[A]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:n},_t.languages.insertBefore("markup","cdata",o)}});Object.defineProperty(_t.languages.markup.tag,"addAttribute",{value:function(i,e){_t.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+i+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:_t.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}});_t.languages.html=_t.languages.markup;_t.languages.mathml=_t.languages.markup;_t.languages.svg=_t.languages.markup;_t.languages.xml=_t.languages.extend("markup",{});_t.languages.ssml=_t.languages.xml;_t.languages.atom=_t.languages.xml;_t.languages.rss=_t.languages.xml;(function(i){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;i.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},i.languages.css.atrule.inside.rest=i.languages.css;var A=i.languages.markup;A&&(A.tag.addInlined("style","css"),A.tag.addAttribute("style","css"))})(_t);_t.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};_t.languages.javascript=_t.languages.extend("clike",{"class-name":[_t.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});_t.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;_t.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:_t.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:_t.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:_t.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:_t.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:_t.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});_t.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:_t.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});_t.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});_t.languages.markup&&(_t.languages.markup.tag.addInlined("script","javascript"),_t.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));_t.languages.js=_t.languages.javascript;(function(){if(typeof _t>"u"||typeof document>"u")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var i="Loading\u2026",e=function(I,B){return"\u2716 Error "+I+" while fetching file: "+B},A="\u2716 Error: File does not exist or is empty",t={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},n="data-src-status",o="loading",a="loaded",r="failed",s="pre[data-src]:not(["+n+'="'+a+'"]):not(['+n+'="'+o+'"])';function l(I,B,Q){var h=new XMLHttpRequest;h.open("GET",I,!0),h.onreadystatechange=function(){h.readyState==4&&(h.status<400&&h.responseText?B(h.responseText):h.status>=400?Q(e(h.status,h.statusText)):Q(A))},h.send(null)}function g(I){var B=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(I||"");if(B){var Q=Number(B[1]),h=B[2],f=B[3];return h?f?[Q,Number(f)]:[Q,void 0]:[Q,Q]}}_t.hooks.add("before-highlightall",function(I){I.selector+=", "+s}),_t.hooks.add("before-sanity-check",function(I){var B=I.element;if(B.matches(s)){I.code="",B.setAttribute(n,o);var Q=B.appendChild(document.createElement("CODE"));Q.textContent=i;var h=B.getAttribute("data-src"),f=I.language;if(f==="none"){var m=(/\.(\w+)$/.exec(h)||[,"none"])[1];f=t[m]||m}_t.util.setLanguage(Q,f),_t.util.setLanguage(B,f);var v=_t.plugins.autoloader;v&&v.loadLanguages(f),l(h,function(S){B.setAttribute(n,a);var k=g(B.getAttribute("data-range"));if(k){var M=S.split(/\r\n?|\n/g),x=k[0],F=k[1]==null?M.length:k[1];x<0&&(x+=M.length),x=Math.max(0,Math.min(x-1,M.length)),F<0&&(F+=M.length),F=Math.max(0,Math.min(F,M.length)),S=M.slice(x,F).join(` +`),B.hasAttribute("data-start")||B.setAttribute("data-start",String(x+1))}Q.textContent=S,_t.highlightElement(Q)},function(S){B.setAttribute(n,r),Q.textContent=S})}}),_t.plugins.fileHighlight={highlight:function(B){for(var Q=(B||document).querySelectorAll(s),h=0,f;f=Q[h++];)_t.highlightElement(f)}};var C=!1;_t.fileHighlight=function(){C||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),C=!0),_t.plugins.fileHighlight.highlight.apply(this,arguments)}})()});var EN=(()=>{class i{_renderer;_elementRef;onChange=A=>{};onTouched=()=>{};constructor(A,t){this._renderer=A,this._elementRef=t}setProperty(A,t){this._renderer.setProperty(this._elementRef.nativeElement,A,t)}registerOnTouched(A){this.onTouched=A}registerOnChange(A){this.onChange=A}setDisabledState(A){this.setProperty("disabled",A)}static \u0275fac=function(t){return new(t||i)(ot(qi),ot(se))};static \u0275dir=qA({type:i})}return i})(),jD=(()=>{class i extends EN{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,features:[mt]})}return i})(),As=new MA(""),pX={provide:As,useExisting:Ga(()=>qD),multi:!0},qD=(()=>{class i extends jD{writeValue(A){this.setProperty("checked",A)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["input","type","checkbox","formControlName",""],["input","type","checkbox","formControl",""],["input","type","checkbox","ngModel",""]],hostBindings:function(t,n){t&1&&T("change",function(a){return n.onChange(a.target.checked)})("blur",function(){return n.onTouched()})},standalone:!1,features:[Et([pX]),mt]})}return i})(),fX={provide:As,useExisting:Ga(()=>yn),multi:!0};function mX(){let i=RD()?RD().getUserAgent():"";return/android (\d+)/.test(i.toLowerCase())}var wX=new MA(""),yn=(()=>{class i extends EN{_compositionMode;_composing=!1;constructor(A,t,n){super(A,t),this._compositionMode=n,this._compositionMode==null&&(this._compositionMode=!mX())}writeValue(A){let t=A??"";this.setProperty("value",t)}_handleInput(A){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(A)}_compositionStart(){this._composing=!0}_compositionEnd(A){this._composing=!1,this._compositionMode&&this.onChange(A)}static \u0275fac=function(t){return new(t||i)(ot(qi),ot(se),ot(wX,8))};static \u0275dir=qA({type:i,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(t,n){t&1&&T("input",function(a){return n._handleInput(a.target.value)})("blur",function(){return n.onTouched()})("compositionstart",function(){return n._compositionStart()})("compositionend",function(a){return n._compositionEnd(a.target.value)})},standalone:!1,features:[Et([fX]),mt]})}return i})();function VD(i){return i==null||WD(i)===0}function WD(i){return i==null?null:Array.isArray(i)||typeof i=="string"?i.length:i instanceof Set?i.size:null}var Mc=new MA(""),Rh=new MA(""),DX=/^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,Ns=class{static min(e){return hN(e)}static max(e){return yX(e)}static required(e){return vX(e)}static requiredTrue(e){return bX(e)}static email(e){return MX(e)}static minLength(e){return SX(e)}static maxLength(e){return kX(e)}static pattern(e){return _X(e)}static nullValidator(e){return N3()}static compose(e){return wN(e)}static composeAsync(e){return DN(e)}};function hN(i){return e=>{if(e.value==null||i==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A{if(e.value==null||i==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A>i?{max:{max:i,actual:e.value}}:null}}function vX(i){return VD(i.value)?{required:!0}:null}function bX(i){return i.value===!0?null:{required:!0}}function MX(i){return VD(i.value)||DX.test(i.value)?null:{email:!0}}function SX(i){return e=>{let A=e.value?.length??WD(e.value);return A===null||A===0?null:A{let A=e.value?.length??WD(e.value);return A!==null&&A>i?{maxlength:{requiredLength:i,actualLength:A}}:null}}function _X(i){if(!i)return N3;let e,A;return typeof i=="string"?(A="",i.charAt(0)!=="^"&&(A+="^"),A+=i,i.charAt(i.length-1)!=="$"&&(A+="$"),e=new RegExp(A)):(A=i.toString(),e=i),t=>{if(VD(t.value))return null;let n=t.value;return e.test(n)?null:{pattern:{requiredPattern:A,actualValue:n}}}}function N3(i){return null}function QN(i){return i!=null}function uN(i){return w3(i)?_r(i):i}function pN(i){let e={};return i.forEach(A=>{e=A!=null?oA(oA({},e),A):e}),Object.keys(e).length===0?null:e}function fN(i,e){return e.map(A=>A(i))}function xX(i){return!i.validate}function mN(i){return i.map(e=>xX(e)?e:A=>e.validate(A))}function wN(i){if(!i)return null;let e=i.filter(QN);return e.length==0?null:function(A){return pN(fN(A,e))}}function ZD(i){return i!=null?wN(mN(i)):null}function DN(i){if(!i)return null;let e=i.filter(QN);return e.length==0?null:function(A){let t=fN(A,e).map(uN);return DC(t).pipe(ye(pN))}}function XD(i){return i!=null?DN(mN(i)):null}function lN(i,e){return i===null?[e]:Array.isArray(i)?[...i,e]:[i,e]}function yN(i){return i._rawValidators}function vN(i){return i._rawAsyncValidators}function HD(i){return i?Array.isArray(i)?i:[i]:[]}function F3(i,e){return Array.isArray(i)?i.includes(e):i===e}function gN(i,e){let A=HD(e);return HD(i).forEach(n=>{F3(A,n)||A.push(n)}),A}function cN(i,e){return HD(e).filter(A=>!F3(i,A))}var L3=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(e){this._rawValidators=e||[],this._composedValidatorFn=ZD(this._rawValidators)}_setAsyncValidators(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=XD(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(e){this._onDestroyCallbacks.push(e)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(e=>e()),this._onDestroyCallbacks=[]}reset(e=void 0){this.control?.reset(e)}hasError(e,A){return this.control?this.control.hasError(e,A):!1}getError(e,A){return this.control?this.control.getError(e,A):null}},D0=class extends L3{name;get formDirective(){return null}get path(){return null}},Fs=class extends L3{_parent=null;name=null;valueAccessor=null},G3=class{_cd;constructor(e){this._cd=e}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}};var vn=(()=>{class i extends G3{constructor(A){super(A)}static \u0275fac=function(t){return new(t||i)(ot(Fs,2))};static \u0275dir=qA({type:i,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(t,n){t&2&&xA("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)},standalone:!1,features:[mt]})}return i})(),bN=(()=>{class i extends G3{constructor(A){super(A)}static \u0275fac=function(t){return new(t||i)(ot(D0,10))};static \u0275dir=qA({type:i,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["","formArray",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(t,n){t&2&&xA("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)("ng-submitted",n.isSubmitted)},standalone:!1,features:[mt]})}return i})();var vh="VALID",R3="INVALID",rd="PENDING",bh="DISABLED",kC=class{},K3=class extends kC{value;source;constructor(e,A){super(),this.value=e,this.source=A}},Sh=class extends kC{pristine;source;constructor(e,A){super(),this.pristine=e,this.source=A}},kh=class extends kC{touched;source;constructor(e,A){super(),this.touched=e,this.source=A}},sd=class extends kC{status;source;constructor(e,A){super(),this.status=e,this.source=A}},U3=class extends kC{source;constructor(e){super(),this.source=e}},_h=class extends kC{source;constructor(e){super(),this.source=e}};function $D(i){return(O3(i)?i.validators:i)||null}function RX(i){return Array.isArray(i)?ZD(i):i||null}function Ay(i,e){return(O3(e)?e.asyncValidators:i)||null}function NX(i){return Array.isArray(i)?XD(i):i||null}function O3(i){return i!=null&&!Array.isArray(i)&&typeof i=="object"}function MN(i,e,A){let t=i.controls;if(!(e?Object.keys(t):t).length)throw new St(1e3,"");if(!t[A])throw new St(1001,"")}function SN(i,e,A){i._forEachChild((t,n)=>{if(A[n]===void 0)throw new St(1002,"")})}var ld=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(e,A){this._assignValidators(e),this._assignAsyncValidators(A)}get validator(){return this._composedValidatorFn}set validator(e){this._rawValidators=this._composedValidatorFn=e}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}get parent(){return this._parent}get status(){return ca(this.statusReactive)}set status(e){ca(()=>this.statusReactive.set(e))}_status=me(()=>this.statusReactive());statusReactive=mA(void 0);get valid(){return this.status===vh}get invalid(){return this.status===R3}get pending(){return this.status==rd}get disabled(){return this.status===bh}get enabled(){return this.status!==bh}errors;get pristine(){return ca(this.pristineReactive)}set pristine(e){ca(()=>this.pristineReactive.set(e))}_pristine=me(()=>this.pristineReactive());pristineReactive=mA(!0);get dirty(){return!this.pristine}get touched(){return ca(this.touchedReactive)}set touched(e){ca(()=>this.touchedReactive.set(e))}_touched=me(()=>this.touchedReactive());touchedReactive=mA(!1);get untouched(){return!this.touched}_events=new te;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(e){this._assignValidators(e)}setAsyncValidators(e){this._assignAsyncValidators(e)}addValidators(e){this.setValidators(gN(e,this._rawValidators))}addAsyncValidators(e){this.setAsyncValidators(gN(e,this._rawAsyncValidators))}removeValidators(e){this.setValidators(cN(e,this._rawValidators))}removeAsyncValidators(e){this.setAsyncValidators(cN(e,this._rawAsyncValidators))}hasValidator(e){return F3(this._rawValidators,e)}hasAsyncValidator(e){return F3(this._rawAsyncValidators,e)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(e={}){let A=this.touched===!1;this.touched=!0;let t=e.sourceControl??this;e.onlySelf||this._parent?.markAsTouched(Oe(oA({},e),{sourceControl:t})),A&&e.emitEvent!==!1&&this._events.next(new kh(!0,t))}markAllAsDirty(e={}){this.markAsDirty({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsDirty(e))}markAllAsTouched(e={}){this.markAsTouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsTouched(e))}markAsUntouched(e={}){let A=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let t=e.sourceControl??this;this._forEachChild(n=>{n.markAsUntouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:t})}),e.onlySelf||this._parent?._updateTouched(e,t),A&&e.emitEvent!==!1&&this._events.next(new kh(!1,t))}markAsDirty(e={}){let A=this.pristine===!0;this.pristine=!1;let t=e.sourceControl??this;e.onlySelf||this._parent?.markAsDirty(Oe(oA({},e),{sourceControl:t})),A&&e.emitEvent!==!1&&this._events.next(new Sh(!1,t))}markAsPristine(e={}){let A=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let t=e.sourceControl??this;this._forEachChild(n=>{n.markAsPristine({onlySelf:!0,emitEvent:e.emitEvent})}),e.onlySelf||this._parent?._updatePristine(e,t),A&&e.emitEvent!==!1&&this._events.next(new Sh(!0,t))}markAsPending(e={}){this.status=rd;let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new sd(this.status,A)),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.markAsPending(Oe(oA({},e),{sourceControl:A}))}disable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=bh,this.errors=null,this._forEachChild(n=>{n.disable(Oe(oA({},e),{onlySelf:!0}))}),this._updateValue();let t=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new K3(this.value,t)),this._events.next(new sd(this.status,t)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Oe(oA({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(n=>n(!0))}enable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=vh,this._forEachChild(t=>{t.enable(Oe(oA({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(Oe(oA({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(t=>t(!1))}_updateAncestors(e,A){e.onlySelf||(this._parent?.updateValueAndValidity(e),e.skipPristineCheck||this._parent?._updatePristine({},A),this._parent?._updateTouched({},A))}setParent(e){this._parent=e}getRawValue(){return this.value}updateValueAndValidity(e={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let t=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===vh||this.status===rd)&&this._runAsyncValidator(t,e.emitEvent)}let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new K3(this.value,A)),this._events.next(new sd(this.status,A)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.updateValueAndValidity(Oe(oA({},e),{sourceControl:A}))}_updateTreeValidity(e={emitEvent:!0}){this._forEachChild(A=>A._updateTreeValidity(e)),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?bh:vh}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(e,A){if(this.asyncValidator){this.status=rd,this._hasOwnPendingAsyncValidator={emitEvent:A!==!1,shouldHaveEmitted:e!==!1};let t=uN(this.asyncValidator(this));this._asyncValidationSubscription=t.subscribe(n=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(n,{emitEvent:A,shouldHaveEmitted:e})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let e=(this._hasOwnPendingAsyncValidator?.emitEvent||this._hasOwnPendingAsyncValidator?.shouldHaveEmitted)??!1;return this._hasOwnPendingAsyncValidator=null,e}return!1}setErrors(e,A={}){this.errors=e,this._updateControlsErrors(A.emitEvent!==!1,this,A.shouldHaveEmitted)}get(e){let A=e;return A==null||(Array.isArray(A)||(A=A.split(".")),A.length===0)?null:A.reduce((t,n)=>t&&t._find(n),this)}getError(e,A){let t=A?this.get(A):this;return t?.errors?t.errors[e]:null}hasError(e,A){return!!this.getError(e,A)}get root(){let e=this;for(;e._parent;)e=e._parent;return e}_updateControlsErrors(e,A,t){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),(e||t)&&this._events.next(new sd(this.status,A)),this._parent&&this._parent._updateControlsErrors(e,A,t)}_initObservables(){this.valueChanges=new LA,this.statusChanges=new LA}_calculateStatus(){return this._allControlsDisabled()?bh:this.errors?R3:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(rd)?rd:this._anyControlsHaveStatus(R3)?R3:vh}_anyControlsHaveStatus(e){return this._anyControls(A=>A.status===e)}_anyControlsDirty(){return this._anyControls(e=>e.dirty)}_anyControlsTouched(){return this._anyControls(e=>e.touched)}_updatePristine(e,A){let t=!this._anyControlsDirty(),n=this.pristine!==t;this.pristine=t,e.onlySelf||this._parent?._updatePristine(e,A),n&&this._events.next(new Sh(this.pristine,A))}_updateTouched(e={},A){this.touched=this._anyControlsTouched(),this._events.next(new kh(this.touched,A)),e.onlySelf||this._parent?._updateTouched(e,A)}_onDisabledChange=[];_registerOnCollectionChange(e){this._onCollectionChange=e}_setUpdateStrategy(e){O3(e)&&e.updateOn!=null&&(this._updateOn=e.updateOn)}_parentMarkedDirty(e){return!e&&!!this._parent?.dirty&&!this._parent._anyControlsDirty()}_find(e){return null}_assignValidators(e){this._rawValidators=Array.isArray(e)?e.slice():e,this._composedValidatorFn=RX(this._rawValidators)}_assignAsyncValidators(e){this._rawAsyncValidators=Array.isArray(e)?e.slice():e,this._composedAsyncValidatorFn=NX(this._rawAsyncValidators)}},gd=class extends ld{constructor(e,A,t){super($D(A),Ay(t,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;registerControl(e,A){return this.controls[e]?this.controls[e]:(this.controls[e]=A,A.setParent(this),A._registerOnCollectionChange(this._onCollectionChange),A)}addControl(e,A,t={}){this.registerControl(e,A),this.updateValueAndValidity({emitEvent:t.emitEvent}),this._onCollectionChange()}removeControl(e,A={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}setControl(e,A,t={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],A&&this.registerControl(e,A),this.updateValueAndValidity({emitEvent:t.emitEvent}),this._onCollectionChange()}contains(e){return this.controls.hasOwnProperty(e)&&this.controls[e].enabled}setValue(e,A={}){SN(this,!0,e),Object.keys(e).forEach(t=>{MN(this,!0,t),this.controls[t].setValue(e[t],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(Object.keys(e).forEach(t=>{let n=this.controls[t];n&&n.patchValue(e[t],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e={},A={}){this._forEachChild((t,n)=>{t.reset(e?e[n]:null,Oe(oA({},A),{onlySelf:!0}))}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A),A?.emitEvent!==!1&&this._events.next(new _h(this))}getRawValue(){return this._reduceChildren({},(e,A,t)=>(e[t]=A.getRawValue(),e))}_syncPendingControls(){let e=this._reduceChildren(!1,(A,t)=>t._syncPendingControls()?!0:A);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){Object.keys(this.controls).forEach(A=>{let t=this.controls[A];t&&e(t,A)})}_setUpControls(){this._forEachChild(e=>{e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(e){for(let[A,t]of Object.entries(this.controls))if(this.contains(A)&&e(t))return!0;return!1}_reduceValue(){let e={};return this._reduceChildren(e,(A,t,n)=>((t.enabled||this.disabled)&&(A[n]=t.value),A))}_reduceChildren(e,A){let t=e;return this._forEachChild((n,o)=>{t=A(t,n,o)}),t}_allControlsDisabled(){for(let e of Object.keys(this.controls))if(this.controls[e].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_find(e){return this.controls.hasOwnProperty(e)?this.controls[e]:null}};var zD=class extends gd{};var cd=new MA("",{factory:()=>H3}),H3="always";function kN(i,e){return[...e.path,i]}function xh(i,e,A=H3){ey(i,e),e.valueAccessor.writeValue(i.value),(i.disabled||A==="always")&&e.valueAccessor.setDisabledState?.(i.disabled),LX(i,e),KX(i,e),GX(i,e),FX(i,e)}function T3(i,e,A=!0){let t=()=>{};e?.valueAccessor?.registerOnChange(t),e?.valueAccessor?.registerOnTouched(t),Y3(i,e),i&&(e._invokeOnDestroyCallbacks(),i._registerOnCollectionChange(()=>{}))}function J3(i,e){i.forEach(A=>{A.registerOnValidatorChange&&A.registerOnValidatorChange(e)})}function FX(i,e){if(e.valueAccessor.setDisabledState){let A=t=>{e.valueAccessor.setDisabledState(t)};i.registerOnDisabledChange(A),e._registerOnDestroy(()=>{i._unregisterOnDisabledChange(A)})}}function ey(i,e){let A=yN(i);e.validator!==null?i.setValidators(lN(A,e.validator)):typeof A=="function"&&i.setValidators([A]);let t=vN(i);e.asyncValidator!==null?i.setAsyncValidators(lN(t,e.asyncValidator)):typeof t=="function"&&i.setAsyncValidators([t]);let n=()=>i.updateValueAndValidity();J3(e._rawValidators,n),J3(e._rawAsyncValidators,n)}function Y3(i,e){let A=!1;if(i!==null){if(e.validator!==null){let n=yN(i);if(Array.isArray(n)&&n.length>0){let o=n.filter(a=>a!==e.validator);o.length!==n.length&&(A=!0,i.setValidators(o))}}if(e.asyncValidator!==null){let n=vN(i);if(Array.isArray(n)&&n.length>0){let o=n.filter(a=>a!==e.asyncValidator);o.length!==n.length&&(A=!0,i.setAsyncValidators(o))}}}let t=()=>{};return J3(e._rawValidators,t),J3(e._rawAsyncValidators,t),A}function LX(i,e){e.valueAccessor.registerOnChange(A=>{i._pendingValue=A,i._pendingChange=!0,i._pendingDirty=!0,i.updateOn==="change"&&_N(i,e)})}function GX(i,e){e.valueAccessor.registerOnTouched(()=>{i._pendingTouched=!0,i.updateOn==="blur"&&i._pendingChange&&_N(i,e),i.updateOn!=="submit"&&i.markAsTouched()})}function _N(i,e){i._pendingDirty&&i.markAsDirty(),i.setValue(i._pendingValue,{emitModelToViewChange:!1}),e.viewToModelUpdate(i._pendingValue),i._pendingChange=!1}function KX(i,e){let A=(t,n)=>{e.valueAccessor.writeValue(t),n&&e.viewToModelUpdate(t)};i.registerOnChange(A),e._registerOnDestroy(()=>{i._unregisterOnChange(A)})}function xN(i,e){i==null,ey(i,e)}function UX(i,e){return Y3(i,e)}function ty(i,e){if(!i.hasOwnProperty("model"))return!1;let A=i.model;return A.isFirstChange()?!0:!Object.is(e,A.currentValue)}function TX(i){return Object.getPrototypeOf(i.constructor)===jD}function RN(i,e){i._syncPendingControls(),e.forEach(A=>{let t=A.control;t.updateOn==="submit"&&t._pendingChange&&(A.viewToModelUpdate(t._pendingValue),t._pendingChange=!1)})}function iy(i,e){if(!e)return null;Array.isArray(e);let A,t,n;return e.forEach(o=>{o.constructor===yn?A=o:TX(o)?t=o:n=o}),n||t||A||null}function JX(i,e){let A=i.indexOf(e);A>-1&&i.splice(A,1)}var YX={provide:D0,useExisting:Ga(()=>Cd)},Mh=Promise.resolve(),Cd=(()=>{class i extends D0{callSetDisabledState;get submitted(){return ca(this.submittedReactive)}_submitted=me(()=>this.submittedReactive());submittedReactive=mA(!1);_directives=new Set;form;ngSubmit=new LA;options;constructor(A,t,n){super(),this.callSetDisabledState=n,this.form=new gd({},ZD(A),XD(t))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(A){Mh.then(()=>{let t=this._findContainer(A.path);A.control=t.registerControl(A.name,A.control),xh(A.control,A,this.callSetDisabledState),A.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(A)})}getControl(A){return this.form.get(A.path)}removeControl(A){Mh.then(()=>{this._findContainer(A.path)?.removeControl(A.name),this._directives.delete(A)})}addFormGroup(A){Mh.then(()=>{let t=this._findContainer(A.path),n=new gd({});xN(n,A),t.registerControl(A.name,n),n.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(A){Mh.then(()=>{this._findContainer(A.path)?.removeControl?.(A.name)})}getFormGroup(A){return this.form.get(A.path)}updateModel(A,t){Mh.then(()=>{this.form.get(A.path).setValue(t)})}setValue(A){this.control.setValue(A)}onSubmit(A){return this.submittedReactive.set(!0),RN(this.form,this._directives),this.ngSubmit.emit(A),this.form._events.next(new U3(this.control)),A?.target?.method==="dialog"}onReset(){this.resetForm()}resetForm(A=void 0){this.form.reset(A),this.submittedReactive.set(!1)}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.form._updateOn=this.options.updateOn)}_findContainer(A){return A.pop(),A.length?this.form.get(A):this.form}static \u0275fac=function(t){return new(t||i)(ot(Mc,10),ot(Rh,10),ot(cd,8))};static \u0275dir=qA({type:i,selectors:[["form",3,"ngNoForm","",3,"formGroup","",3,"formArray",""],["ng-form"],["","ngForm",""]],hostBindings:function(t,n){t&1&&T("submit",function(a){return n.onSubmit(a)})("reset",function(){return n.onReset()})},inputs:{options:[0,"ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[Et([YX]),mt]})}return i})();function CN(i,e){let A=i.indexOf(e);A>-1&&i.splice(A,1)}function IN(i){return typeof i=="object"&&i!==null&&Object.keys(i).length===2&&"value"in i&&"disabled"in i}var Rs=class extends ld{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(e=null,A,t){super($D(A),Ay(t,A)),this._applyFormState(e),this._setUpdateStrategy(A),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),O3(A)&&(A.nonNullable||A.initialValueIsDefault)&&(IN(e)?this.defaultValue=e.value:this.defaultValue=e)}setValue(e,A={}){this.value=this._pendingValue=e,this._onChange.length&&A.emitModelToViewChange!==!1&&this._onChange.forEach(t=>t(this.value,A.emitViewToModelChange!==!1)),this.updateValueAndValidity(A)}patchValue(e,A={}){this.setValue(e,A)}reset(e=this.defaultValue,A={}){this._applyFormState(e),this.markAsPristine(A),this.markAsUntouched(A),this.setValue(this.value,A),A.overwriteDefaultValue&&(this.defaultValue=this.value),this._pendingChange=!1,A?.emitEvent!==!1&&this._events.next(new _h(this))}_updateValue(){}_anyControls(e){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(e){this._onChange.push(e)}_unregisterOnChange(e){CN(this._onChange,e)}registerOnDisabledChange(e){this._onDisabledChange.push(e)}_unregisterOnDisabledChange(e){CN(this._onDisabledChange,e)}_forEachChild(e){}_syncPendingControls(){return this.updateOn==="submit"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(e){IN(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}};var OX=i=>i instanceof Rs;var HX={provide:Fs,useExisting:Ga(()=>_o)},dN=Promise.resolve(),_o=(()=>{class i extends Fs{_changeDetectorRef;callSetDisabledState;control=new Rs;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name="";isDisabled;model;options;update=new LA;constructor(A,t,n,o,a,r){super(),this._changeDetectorRef=a,this.callSetDisabledState=r,this._parent=A,this._setValidators(t),this._setAsyncValidators(n),this.valueAccessor=iy(this,o)}ngOnChanges(A){if(this._checkForErrors(),!this._registered||"name"in A){if(this._registered&&(this._checkName(),this.formDirective)){let t=A.name.previousValue;this.formDirective.removeControl({name:t,path:this._getPath(t)})}this._setUpControl()}"isDisabled"in A&&this._updateDisabled(A),ty(A,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective?.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){xh(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(A){dN.then(()=>{this.control.setValue(A,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(A){let t=A.isDisabled.currentValue,n=t!==0&&Ee(t);dN.then(()=>{n&&!this.control.disabled?this.control.disable():!n&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(A){return this._parent?kN(A,this._parent):[A]}static \u0275fac=function(t){return new(t||i)(ot(D0,9),ot(Mc,10),ot(Rh,10),ot(As,10),ot(wt,8),ot(cd,8))};static \u0275dir=qA({type:i,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],standalone:!1,features:[Et([HX]),mt,Zt]})}return i})();var NN=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""],standalone:!1})}return i})(),zX={provide:As,useExisting:Ga(()=>Nh),multi:!0},Nh=(()=>{class i extends jD{writeValue(A){let t=A??"";this.setProperty("value",t)}registerOnChange(A){this.onChange=t=>{A(t==""?null:parseFloat(t))}}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["input","type","number","formControlName",""],["input","type","number","formControl",""],["input","type","number","ngModel",""]],hostBindings:function(t,n){t&1&&T("input",function(a){return n.onChange(a.target.value)})("blur",function(){return n.onTouched()})},standalone:!1,features:[Et([zX]),mt]})}return i})();var PD=class extends ld{constructor(e,A,t){super($D(A),Ay(t,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;at(e){return this.controls[this._adjustIndex(e)]}push(e,A={}){Array.isArray(e)?e.forEach(t=>{this.controls.push(t),this._registerControl(t)}):(this.controls.push(e),this._registerControl(e)),this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}insert(e,A,t={}){this.controls.splice(e,0,A),this._registerControl(A),this.updateValueAndValidity({emitEvent:t.emitEvent})}removeAt(e,A={}){let t=this._adjustIndex(e);t<0&&(t=0),this.controls[t]&&this.controls[t]._registerOnCollectionChange(()=>{}),this.controls.splice(t,1),this.updateValueAndValidity({emitEvent:A.emitEvent})}setControl(e,A,t={}){let n=this._adjustIndex(e);n<0&&(n=0),this.controls[n]&&this.controls[n]._registerOnCollectionChange(()=>{}),this.controls.splice(n,1),A&&(this.controls.splice(n,0,A),this._registerControl(A)),this.updateValueAndValidity({emitEvent:t.emitEvent}),this._onCollectionChange()}get length(){return this.controls.length}setValue(e,A={}){SN(this,!1,e),e.forEach((t,n)=>{MN(this,!1,n),this.at(n).setValue(t,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(e.forEach((t,n)=>{this.at(n)&&this.at(n).patchValue(t,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e=[],A={}){this._forEachChild((t,n)=>{t.reset(e[n],Oe(oA({},A),{onlySelf:!0}))}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A),A?.emitEvent!==!1&&this._events.next(new _h(this))}getRawValue(){return this.controls.map(e=>e.getRawValue())}clear(e={}){this.controls.length<1||(this._forEachChild(A=>A._registerOnCollectionChange(()=>{})),this.controls.splice(0),this.updateValueAndValidity({emitEvent:e.emitEvent}))}_adjustIndex(e){return e<0?e+this.length:e}_syncPendingControls(){let e=this.controls.reduce((A,t)=>t._syncPendingControls()?!0:A,!1);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){this.controls.forEach((A,t)=>{e(A,t)})}_updateValue(){this.value=this.controls.filter(e=>e.enabled||this.disabled).map(e=>e.value)}_anyControls(e){return this.controls.some(A=>A.enabled&&e(A))}_setUpControls(){this._forEachChild(e=>this._registerControl(e))}_allControlsDisabled(){for(let e of this.controls)if(e.enabled)return!1;return this.controls.length>0||this.disabled}_registerControl(e){e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)}_find(e){return this.at(e)??null}};var PX=(()=>{class i extends D0{callSetDisabledState;get submitted(){return ca(this._submittedReactive)}set submitted(A){this._submittedReactive.set(A)}_submitted=me(()=>this._submittedReactive());_submittedReactive=mA(!1);_oldForm;_onCollectionChange=()=>this._updateDomValue();directives=[];constructor(A,t,n){super(),this.callSetDisabledState=n,this._setValidators(A),this._setAsyncValidators(t)}ngOnChanges(A){this.onChanges(A)}ngOnDestroy(){this.onDestroy()}onChanges(A){this._checkFormPresent(),A.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations(),this._oldForm=this.form)}onDestroy(){this.form&&(Y3(this.form,this),this.form._onCollectionChange===this._onCollectionChange&&this.form._registerOnCollectionChange(()=>{}))}get formDirective(){return this}get path(){return[]}addControl(A){let t=this.form.get(A.path);return xh(t,A,this.callSetDisabledState),t.updateValueAndValidity({emitEvent:!1}),this.directives.push(A),t}getControl(A){return this.form.get(A.path)}removeControl(A){T3(A.control||null,A,!1),JX(this.directives,A)}addFormGroup(A){this._setUpFormContainer(A)}removeFormGroup(A){this._cleanUpFormContainer(A)}getFormGroup(A){return this.form.get(A.path)}getFormArray(A){return this.form.get(A.path)}addFormArray(A){this._setUpFormContainer(A)}removeFormArray(A){this._cleanUpFormContainer(A)}updateModel(A,t){this.form.get(A.path).setValue(t)}onReset(){this.resetForm()}resetForm(A=void 0,t={}){this.form.reset(A,t),this._submittedReactive.set(!1)}onSubmit(A){return this.submitted=!0,RN(this.form,this.directives),this.ngSubmit.emit(A),this.form._events.next(new U3(this.control)),A?.target?.method==="dialog"}_updateDomValue(){this.directives.forEach(A=>{let t=A.control,n=this.form.get(A.path);t!==n&&(T3(t||null,A),OX(n)&&(xh(n,A,this.callSetDisabledState),A.control=n))}),this.form._updateTreeValidity({emitEvent:!1})}_setUpFormContainer(A){let t=this.form.get(A.path);xN(t,A),t.updateValueAndValidity({emitEvent:!1})}_cleanUpFormContainer(A){let t=this.form?.get(A.path);t&&UX(t,A)&&t.updateValueAndValidity({emitEvent:!1})}_updateRegistrations(){this.form._registerOnCollectionChange(this._onCollectionChange),this._oldForm?._registerOnCollectionChange(()=>{})}_updateValidators(){ey(this.form,this),this._oldForm&&Y3(this._oldForm,this)}_checkFormPresent(){this.form}static \u0275fac=function(t){return new(t||i)(ot(Mc,10),ot(Rh,10),ot(cd,8))};static \u0275dir=qA({type:i,features:[mt,Zt]})}return i})();var ny=new MA(""),jX={provide:Fs,useExisting:Ga(()=>I1)},I1=(()=>{class i extends Fs{_ngModelWarningConfig;callSetDisabledState;viewModel;form;set isDisabled(A){}model;update=new LA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,t,n,o,a){super(),this._ngModelWarningConfig=o,this.callSetDisabledState=a,this._setValidators(A),this._setAsyncValidators(t),this.valueAccessor=iy(this,n)}ngOnChanges(A){if(this._isControlChanged(A)){let t=A.form.previousValue;t&&T3(t,this,!1),xh(this.form,this,this.callSetDisabledState),this.form.updateValueAndValidity({emitEvent:!1})}ty(A,this.viewModel)&&(this.form.setValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.form&&T3(this.form,this,!1)}get path(){return[]}get control(){return this.form}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_isControlChanged(A){return A.hasOwnProperty("form")}static \u0275fac=function(t){return new(t||i)(ot(Mc,10),ot(Rh,10),ot(As,10),ot(ny,8),ot(cd,8))};static \u0275dir=qA({type:i,selectors:[["","formControl",""]],inputs:{form:[0,"formControl","form"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},exportAs:["ngForm"],standalone:!1,features:[Et([jX]),mt,Zt]})}return i})();var qX={provide:Fs,useExisting:Ga(()=>oy)},oy=(()=>{class i extends Fs{_ngModelWarningConfig;_added=!1;viewModel;control;name=null;set isDisabled(A){}model;update=new LA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,t,n,o,a){super(),this._ngModelWarningConfig=a,this._parent=A,this._setValidators(t),this._setAsyncValidators(n),this.valueAccessor=iy(this,o)}ngOnChanges(A){this._added||this._setUpControl(),ty(A,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}ngOnDestroy(){this.formDirective?.removeControl(this)}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}get path(){return kN(this.name==null?this.name:this.name.toString(),this._parent)}get formDirective(){return this._parent?this._parent.formDirective:null}_setUpControl(){this.control=this.formDirective.addControl(this),this._added=!0}static \u0275fac=function(t){return new(t||i)(ot(D0,13),ot(Mc,10),ot(Rh,10),ot(As,10),ot(ny,8))};static \u0275dir=qA({type:i,selectors:[["","formControlName",""]],inputs:{name:[0,"formControlName","name"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},standalone:!1,features:[Et([qX]),mt,Zt]})}return i})();var VX={provide:D0,useExisting:Ga(()=>_C)},_C=(()=>{class i extends PX{form=null;ngSubmit=new LA;get control(){return this.form}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["","formGroup",""]],hostBindings:function(t,n){t&1&&T("submit",function(a){return n.onSubmit(a)})("reset",function(){return n.onReset()})},inputs:{form:[0,"formGroup","form"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[Et([VX]),mt]})}return i})();function WX(i){return typeof i=="number"?i:parseFloat(i)}var ZX=(()=>{class i{_validator=N3;_onChange;_enabled;ngOnChanges(A){if(this.inputName in A){let t=this.normalizeInput(A[this.inputName].currentValue);this._enabled=this.enabled(t),this._validator=this._enabled?this.createValidator(t):N3,this._onChange?.()}}validate(A){return this._validator(A)}registerOnValidatorChange(A){this._onChange=A}enabled(A){return A!=null}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,features:[Zt]})}return i})();var XX={provide:Mc,useExisting:Ga(()=>ay),multi:!0},ay=(()=>{class i extends ZX{min;inputName="min";normalizeInput=A=>WX(A);createValidator=A=>hN(A);static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["input","type","number","min","","formControlName",""],["input","type","number","min","","formControl",""],["input","type","number","min","","ngModel",""]],hostVars:1,hostBindings:function(t,n){t&2&&ee("min",n._enabled?n.min:null)},inputs:{min:"min"},standalone:!1,features:[Et([XX]),mt]})}return i})();var FN=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({})}return i})();function BN(i){return!!i&&(i.asyncValidators!==void 0||i.validators!==void 0||i.updateOn!==void 0)}var LN=(()=>{class i{useNonNullable=!1;get nonNullable(){let A=new i;return A.useNonNullable=!0,A}group(A,t=null){let n=this._reduceControls(A),o={};return BN(t)?o=t:t!==null&&(o.validators=t.validator,o.asyncValidators=t.asyncValidator),new gd(n,o)}record(A,t=null){let n=this._reduceControls(A);return new zD(n,t)}control(A,t,n){let o={};return this.useNonNullable?(BN(t)?o=t:(o.validators=t,o.asyncValidators=n),new Rs(A,Oe(oA({},o),{nonNullable:!0}))):new Rs(A,t,n)}array(A,t,n){let o=A.map(a=>this._createControl(a));return new PD(o,t,n)}_reduceControls(A){let t={};return Object.keys(A).forEach(n=>{t[n]=this._createControl(A[n])}),t}_createControl(A){if(A instanceof Rs)return A;if(A instanceof ld)return A;if(Array.isArray(A)){let t=A[0],n=A.length>1?A[1]:null,o=A.length>2?A[2]:null;return this.control(t,n,o)}else return this.control(A)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var cn=(()=>{class i{static withConfig(A){return{ngModule:i,providers:[{provide:cd,useValue:A.callSetDisabledState??H3}]}}static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[FN]})}return i})(),xC=(()=>{class i{static withConfig(A){return{ngModule:i,providers:[{provide:ny,useValue:A.warnOnNgModelWithFormControl??"always"},{provide:cd,useValue:A.callSetDisabledState??H3}]}}static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[FN]})}return i})();function d1(i){return i.buttons===0||i.detail===0}function B1(i){let e=i.touches&&i.touches[0]||i.changedTouches&&i.changedTouches[0];return!!e&&e.identifier===-1&&(e.radiusX==null||e.radiusX===1)&&(e.radiusY==null||e.radiusY===1)}var ry;function GN(){if(ry==null){let i=typeof document<"u"?document.head:null;ry=!!(i&&(i.createShadowRoot||i.attachShadow))}return ry}function sy(i){if(GN()){let e=i.getRootNode?i.getRootNode():null;if(typeof ShadowRoot<"u"&&ShadowRoot&&e instanceof ShadowRoot)return e}return null}function Fh(){let i=typeof document<"u"&&document?document.activeElement:null;for(;i&&i.shadowRoot;){let e=i.shadowRoot.activeElement;if(e===i)break;i=e}return i}function Fr(i){return i.composedPath?i.composedPath()[0]:i.target}var ly;try{ly=typeof Intl<"u"&&Intl.v8BreakIterator}catch(i){ly=!1}var Ci=(()=>{class i{_platformId=w(h3);isBrowser=this._platformId?w0(this._platformId):typeof document=="object"&&!!document;EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent);TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent);BLINK=this.isBrowser&&!!(window.chrome||ly)&&typeof CSS<"u"&&!this.EDGE&&!this.TRIDENT;WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT;IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window);FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent);ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT;SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT;constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var Lh;function KN(){if(Lh==null&&typeof window<"u")try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:()=>Lh=!0}))}finally{Lh=Lh||!1}return Lh}function Id(i){return KN()?i:!!i.capture}function Ls(i,e=0){return z3(i)?Number(i):arguments.length===2?e:0}function z3(i){return!isNaN(parseFloat(i))&&!isNaN(Number(i))}function hs(i){return i instanceof se?i.nativeElement:i}var UN=new MA("cdk-input-modality-detector-options"),TN={ignoreKeys:[18,17,224,91,16]},JN=650,gy={passive:!0,capture:!0},YN=(()=>{class i{_platform=w(Ci);_listenerCleanups;modalityDetected;modalityChanged;get mostRecentModality(){return this._modality.value}_mostRecentTarget=null;_modality=new ti(null);_options;_lastTouchMs=0;_onKeydown=A=>{this._options?.ignoreKeys?.some(t=>t===A.keyCode)||(this._modality.next("keyboard"),this._mostRecentTarget=Fr(A))};_onMousedown=A=>{Date.now()-this._lastTouchMs{if(B1(A)){this._modality.next("keyboard");return}this._lastTouchMs=Date.now(),this._modality.next("touch"),this._mostRecentTarget=Fr(A)};constructor(){let A=w(qe),t=w(ii),n=w(UN,{optional:!0});if(this._options=oA(oA({},TN),n),this.modalityDetected=this._modality.pipe(Cl(1)),this.modalityChanged=this.modalityDetected.pipe(ug()),this._platform.isBrowser){let o=w(Rr).createRenderer(null,null);this._listenerCleanups=A.runOutsideAngular(()=>[o.listen(t,"keydown",this._onKeydown,gy),o.listen(t,"mousedown",this._onMousedown,gy),o.listen(t,"touchstart",this._onTouchstart,gy)])}}ngOnDestroy(){this._modality.complete(),this._listenerCleanups?.forEach(A=>A())}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),Gh=(function(i){return i[i.IMMEDIATE=0]="IMMEDIATE",i[i.EVENTUAL=1]="EVENTUAL",i})(Gh||{}),ON=new MA("cdk-focus-monitor-default-options"),P3=Id({passive:!0,capture:!0}),Wa=(()=>{class i{_ngZone=w(qe);_platform=w(Ci);_inputModalityDetector=w(YN);_origin=null;_lastFocusOrigin=null;_windowFocused=!1;_windowFocusTimeoutId;_originTimeoutId;_originFromTouchInteraction=!1;_elementInfo=new Map;_monitoredElementCount=0;_rootNodeFocusListenerCount=new Map;_detectionMode;_windowFocusListener=()=>{this._windowFocused=!0,this._windowFocusTimeoutId=setTimeout(()=>this._windowFocused=!1)};_document=w(ii);_stopInputModalityDetector=new te;constructor(){let A=w(ON,{optional:!0});this._detectionMode=A?.detectionMode||Gh.IMMEDIATE}_rootNodeFocusAndBlurListener=A=>{let t=Fr(A);for(let n=t;n;n=n.parentElement)A.type==="focus"?this._onFocus(A,n):this._onBlur(A,n)};monitor(A,t=!1){let n=hs(A);if(!this._platform.isBrowser||n.nodeType!==1)return ie();let o=sy(n)||this._document,a=this._elementInfo.get(n);if(a)return t&&(a.checkChildren=!0),a.subject;let r={checkChildren:t,subject:new te,rootNode:o};return this._elementInfo.set(n,r),this._registerGlobalListeners(r),r.subject}stopMonitoring(A){let t=hs(A),n=this._elementInfo.get(t);n&&(n.subject.complete(),this._setClasses(t),this._elementInfo.delete(t),this._removeGlobalListeners(n))}focusVia(A,t,n){let o=hs(A),a=this._document.activeElement;o===a?this._getClosestElementsInfo(o).forEach(([r,s])=>this._originChanged(r,t,s)):(this._setOrigin(t),typeof o.focus=="function"&&o.focus(n))}ngOnDestroy(){this._elementInfo.forEach((A,t)=>this.stopMonitoring(t))}_getWindow(){return this._document.defaultView||window}_getFocusOrigin(A){return this._origin?this._originFromTouchInteraction?this._shouldBeAttributedToTouch(A)?"touch":"program":this._origin:this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:A&&this._isLastInteractionFromInputLabel(A)?"mouse":"program"}_shouldBeAttributedToTouch(A){return this._detectionMode===Gh.EVENTUAL||!!A?.contains(this._inputModalityDetector._mostRecentTarget)}_setClasses(A,t){A.classList.toggle("cdk-focused",!!t),A.classList.toggle("cdk-touch-focused",t==="touch"),A.classList.toggle("cdk-keyboard-focused",t==="keyboard"),A.classList.toggle("cdk-mouse-focused",t==="mouse"),A.classList.toggle("cdk-program-focused",t==="program")}_setOrigin(A,t=!1){this._ngZone.runOutsideAngular(()=>{if(this._origin=A,this._originFromTouchInteraction=A==="touch"&&t,this._detectionMode===Gh.IMMEDIATE){clearTimeout(this._originTimeoutId);let n=this._originFromTouchInteraction?JN:1;this._originTimeoutId=setTimeout(()=>this._origin=null,n)}})}_onFocus(A,t){let n=this._elementInfo.get(t),o=Fr(A);!n||!n.checkChildren&&t!==o||this._originChanged(t,this._getFocusOrigin(o),n)}_onBlur(A,t){let n=this._elementInfo.get(t);!n||n.checkChildren&&A.relatedTarget instanceof Node&&t.contains(A.relatedTarget)||(this._setClasses(t),this._emitOrigin(n,null))}_emitOrigin(A,t){A.subject.observers.length&&this._ngZone.run(()=>A.subject.next(t))}_registerGlobalListeners(A){if(!this._platform.isBrowser)return;let t=A.rootNode,n=this._rootNodeFocusListenerCount.get(t)||0;n||this._ngZone.runOutsideAngular(()=>{t.addEventListener("focus",this._rootNodeFocusAndBlurListener,P3),t.addEventListener("blur",this._rootNodeFocusAndBlurListener,P3)}),this._rootNodeFocusListenerCount.set(t,n+1),++this._monitoredElementCount===1&&(this._ngZone.runOutsideAngular(()=>{this._getWindow().addEventListener("focus",this._windowFocusListener)}),this._inputModalityDetector.modalityDetected.pipe(ut(this._stopInputModalityDetector)).subscribe(o=>{this._setOrigin(o,!0)}))}_removeGlobalListeners(A){let t=A.rootNode;if(this._rootNodeFocusListenerCount.has(t)){let n=this._rootNodeFocusListenerCount.get(t);n>1?this._rootNodeFocusListenerCount.set(t,n-1):(t.removeEventListener("focus",this._rootNodeFocusAndBlurListener,P3),t.removeEventListener("blur",this._rootNodeFocusAndBlurListener,P3),this._rootNodeFocusListenerCount.delete(t))}--this._monitoredElementCount||(this._getWindow().removeEventListener("focus",this._windowFocusListener),this._stopInputModalityDetector.next(),clearTimeout(this._windowFocusTimeoutId),clearTimeout(this._originTimeoutId))}_originChanged(A,t,n){this._setClasses(A,t),this._emitOrigin(n,t),this._lastFocusOrigin=t}_getClosestElementsInfo(A){let t=[];return this._elementInfo.forEach((n,o)=>{(o===A||n.checkChildren&&o.contains(A))&&t.push([o,n])}),t}_isLastInteractionFromInputLabel(A){let{_mostRecentTarget:t,mostRecentModality:n}=this._inputModalityDetector;if(n!=="mouse"||!t||t===A||A.nodeName!=="INPUT"&&A.nodeName!=="TEXTAREA"||A.disabled)return!1;let o=A.labels;if(o){for(let a=0;a{class i{_elementRef=w(se);_focusMonitor=w(Wa);_monitorSubscription;_focusOrigin=null;cdkFocusChange=new LA;constructor(){}get focusOrigin(){return this._focusOrigin}ngAfterViewInit(){let A=this._elementRef.nativeElement;this._monitorSubscription=this._focusMonitor.monitor(A,A.nodeType===1&&A.hasAttribute("cdkMonitorSubtreeFocus")).subscribe(t=>{this._focusOrigin=t,this.cdkFocusChange.emit(t)})}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._monitorSubscription?.unsubscribe()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdkMonitorElementFocus",""],["","cdkMonitorSubtreeFocus",""]],outputs:{cdkFocusChange:"cdkFocusChange"},exportAs:["cdkMonitorFocus"]})}return i})();var j3=new WeakMap,io=(()=>{class i{_appRef;_injector=w(Dt);_environmentInjector=w(xr);load(A){let t=this._appRef=this._appRef||this._injector.get(p0),n=j3.get(t);n||(n={loaders:new Set,refs:[]},j3.set(t,n),t.onDestroy(()=>{j3.get(t)?.refs.forEach(o=>o.destroy()),j3.delete(t)})),n.loaders.has(A)||(n.loaders.add(A),n.refs.push(v3(A,{environmentInjector:this._environmentInjector})))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var RC=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["ng-component"]],exportAs:["cdkVisuallyHidden"],decls:0,vars:0,template:function(t,n){},styles:[`.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0} +`],encapsulation:2,changeDetection:0})}return i})(),q3;function $X(){if(q3===void 0&&(q3=null,typeof window<"u")){let i=window;i.trustedTypes!==void 0&&(q3=i.trustedTypes.createPolicy("angular#components",{createHTML:e=>e}))}return q3}function E1(i){return $X()?.createHTML(i)||i}function HN(i,e,A){let t=A.sanitize(fg.HTML,e);i.innerHTML=E1(t||"")}function dd(i){return Array.isArray(i)?i:[i]}var zN=new Set,h1,Bd=(()=>{class i{_platform=w(Ci);_nonce=w(AR,{optional:!0});_matchMedia;constructor(){this._matchMedia=this._platform.isBrowser&&window.matchMedia?window.matchMedia.bind(window):e$}matchMedia(A){return(this._platform.WEBKIT||this._platform.BLINK)&&A$(A,this._nonce),this._matchMedia(A)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function A$(i,e){if(!zN.has(i))try{h1||(h1=document.createElement("style"),e&&h1.setAttribute("nonce",e),h1.setAttribute("type","text/css"),document.head.appendChild(h1)),h1.sheet&&(h1.sheet.insertRule(`@media ${i} {body{ }}`,0),zN.add(i))}catch(A){console.error(A)}}function e$(i){return{matches:i==="all"||i==="",media:i,addListener:()=>{},removeListener:()=>{}}}var Kh=(()=>{class i{_mediaMatcher=w(Bd);_zone=w(qe);_queries=new Map;_destroySubject=new te;constructor(){}ngOnDestroy(){this._destroySubject.next(),this._destroySubject.complete()}isMatched(A){return PN(dd(A)).some(n=>this._registerQuery(n).mql.matches)}observe(A){let n=PN(dd(A)).map(a=>this._registerQuery(a).observable),o=dr(n);return o=C3(o.pipe(po(1)),o.pipe(Cl(1),Ms(0))),o.pipe(ye(a=>{let r={matches:!1,breakpoints:{}};return a.forEach(({matches:s,query:l})=>{r.matches=r.matches||s,r.breakpoints[l]=s}),r}))}_registerQuery(A){if(this._queries.has(A))return this._queries.get(A);let t=this._mediaMatcher.matchMedia(A),o={observable:new bi(a=>{let r=s=>this._zone.run(()=>a.next(s));return t.addListener(r),()=>{t.removeListener(r)}}).pipe(kn(t),ye(({matches:a})=>({query:A,matches:a})),ut(this._destroySubject)),mql:t};return this._queries.set(A,o),o}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function PN(i){return i.map(e=>e.split(",")).reduce((e,A)=>e.concat(A)).map(e=>e.trim())}function t$(i){if(i.type==="characterData"&&i.target instanceof Comment)return!0;if(i.type==="childList"){for(let e=0;e{class i{create(A){return typeof MutationObserver>"u"?null:new MutationObserver(A)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),qN=(()=>{class i{_mutationObserverFactory=w(jN);_observedElements=new Map;_ngZone=w(qe);constructor(){}ngOnDestroy(){this._observedElements.forEach((A,t)=>this._cleanupObserver(t))}observe(A){let t=hs(A);return new bi(n=>{let a=this._observeElement(t).pipe(ye(r=>r.filter(s=>!t$(s))),Ct(r=>!!r.length)).subscribe(r=>{this._ngZone.run(()=>{n.next(r)})});return()=>{a.unsubscribe(),this._unobserveElement(t)}})}_observeElement(A){return this._ngZone.runOutsideAngular(()=>{if(this._observedElements.has(A))this._observedElements.get(A).count++;else{let t=new te,n=this._mutationObserverFactory.create(o=>t.next(o));n&&n.observe(A,{characterData:!0,childList:!0,subtree:!0}),this._observedElements.set(A,{observer:n,stream:t,count:1})}return this._observedElements.get(A).stream})}_unobserveElement(A){this._observedElements.has(A)&&(this._observedElements.get(A).count--,this._observedElements.get(A).count||this._cleanupObserver(A))}_cleanupObserver(A){if(this._observedElements.has(A)){let{observer:t,stream:n}=this._observedElements.get(A);t&&t.disconnect(),n.complete(),this._observedElements.delete(A)}}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),VN=(()=>{class i{_contentObserver=w(qN);_elementRef=w(se);event=new LA;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._disabled?this._unsubscribe():this._subscribe()}_disabled=!1;get debounce(){return this._debounce}set debounce(A){this._debounce=Ls(A),this._subscribe()}_debounce;_currentSubscription=null;constructor(){}ngAfterContentInit(){!this._currentSubscription&&!this.disabled&&this._subscribe()}ngOnDestroy(){this._unsubscribe()}_subscribe(){this._unsubscribe();let A=this._contentObserver.observe(this._elementRef);this._currentSubscription=(this.debounce?A.pipe(Ms(this.debounce)):A).subscribe(this.event)}_unsubscribe(){this._currentSubscription?.unsubscribe()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdkObserveContent",""]],inputs:{disabled:[2,"cdkObserveContentDisabled","disabled",Ee],debounce:"debounce"},outputs:{event:"cdkObserveContent"},exportAs:["cdkObserveContent"]})}return i})(),V3=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({providers:[jN]})}return i})();var Ed=(()=>{class i{_platform=w(Ci);constructor(){}isDisabled(A){return A.hasAttribute("disabled")}isVisible(A){return n$(A)&&getComputedStyle(A).visibility==="visible"}isTabbable(A){if(!this._platform.isBrowser)return!1;let t=i$(C$(A));if(t&&(WN(t)===-1||!this.isVisible(t)))return!1;let n=A.nodeName.toLowerCase(),o=WN(A);return A.hasAttribute("contenteditable")?o!==-1:n==="iframe"||n==="object"||this._platform.WEBKIT&&this._platform.IOS&&!g$(A)?!1:n==="audio"?A.hasAttribute("controls")?o!==-1:!1:n==="video"?o===-1?!1:o!==null?!0:this._platform.FIREFOX||A.hasAttribute("controls"):A.tabIndex>=0}isFocusable(A,t){return c$(A)&&!this.isDisabled(A)&&(t?.ignoreVisibility||this.isVisible(A))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function i$(i){try{return i.frameElement}catch(e){return null}}function n$(i){return!!(i.offsetWidth||i.offsetHeight||typeof i.getClientRects=="function"&&i.getClientRects().length)}function o$(i){let e=i.nodeName.toLowerCase();return e==="input"||e==="select"||e==="button"||e==="textarea"}function a$(i){return s$(i)&&i.type=="hidden"}function r$(i){return l$(i)&&i.hasAttribute("href")}function s$(i){return i.nodeName.toLowerCase()=="input"}function l$(i){return i.nodeName.toLowerCase()=="a"}function $N(i){if(!i.hasAttribute("tabindex")||i.tabIndex===void 0)return!1;let e=i.getAttribute("tabindex");return!!(e&&!isNaN(parseInt(e,10)))}function WN(i){if(!$N(i))return null;let e=parseInt(i.getAttribute("tabindex")||"",10);return isNaN(e)?-1:e}function g$(i){let e=i.nodeName.toLowerCase(),A=e==="input"&&i.type;return A==="text"||A==="password"||e==="select"||e==="textarea"}function c$(i){return a$(i)?!1:o$(i)||r$(i)||i.hasAttribute("contenteditable")||$N(i)}function C$(i){return i.ownerDocument&&i.ownerDocument.defaultView||window}var W3=class{_element;_checker;_ngZone;_document;_injector;_startAnchor=null;_endAnchor=null;_hasAttached=!1;startAnchorListener=()=>this.focusLastTabbableElement();endAnchorListener=()=>this.focusFirstTabbableElement();get enabled(){return this._enabled}set enabled(e){this._enabled=e,this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_enabled=!0;constructor(e,A,t,n,o=!1,a){this._element=e,this._checker=A,this._ngZone=t,this._document=n,this._injector=a,o||this.attachAnchors()}destroy(){let e=this._startAnchor,A=this._endAnchor;e&&(e.removeEventListener("focus",this.startAnchorListener),e.remove()),A&&(A.removeEventListener("focus",this.endAnchorListener),A.remove()),this._startAnchor=this._endAnchor=null,this._hasAttached=!1}attachAnchors(){return this._hasAttached?!0:(this._ngZone.runOutsideAngular(()=>{this._startAnchor||(this._startAnchor=this._createAnchor(),this._startAnchor.addEventListener("focus",this.startAnchorListener)),this._endAnchor||(this._endAnchor=this._createAnchor(),this._endAnchor.addEventListener("focus",this.endAnchorListener))}),this._element.parentNode&&(this._element.parentNode.insertBefore(this._startAnchor,this._element),this._element.parentNode.insertBefore(this._endAnchor,this._element.nextSibling),this._hasAttached=!0),this._hasAttached)}focusInitialElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusInitialElement(e)))})}focusFirstTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusFirstTabbableElement(e)))})}focusLastTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusLastTabbableElement(e)))})}_getRegionBoundary(e){let A=this._element.querySelectorAll(`[cdk-focus-region-${e}], [cdkFocusRegion${e}], [cdk-focus-${e}]`);return e=="start"?A.length?A[0]:this._getFirstTabbableElement(this._element):A.length?A[A.length-1]:this._getLastTabbableElement(this._element)}focusInitialElement(e){let A=this._element.querySelector("[cdk-focus-initial], [cdkFocusInitial]");if(A){if(!this._checker.isFocusable(A)){let t=this._getFirstTabbableElement(A);return t?.focus(e),!!t}return A.focus(e),!0}return this.focusFirstTabbableElement(e)}focusFirstTabbableElement(e){let A=this._getRegionBoundary("start");return A&&A.focus(e),!!A}focusLastTabbableElement(e){let A=this._getRegionBoundary("end");return A&&A.focus(e),!!A}hasAttached(){return this._hasAttached}_getFirstTabbableElement(e){if(this._checker.isFocusable(e)&&this._checker.isTabbable(e))return e;let A=e.children;for(let t=0;t=0;t--){let n=A[t].nodeType===this._document.ELEMENT_NODE?this._getLastTabbableElement(A[t]):null;if(n)return n}return null}_createAnchor(){let e=this._document.createElement("div");return this._toggleAnchorTabIndex(this._enabled,e),e.classList.add("cdk-visually-hidden"),e.classList.add("cdk-focus-trap-anchor"),e.setAttribute("aria-hidden","true"),e}_toggleAnchorTabIndex(e,A){e?A.setAttribute("tabindex","0"):A.removeAttribute("tabindex")}toggleAnchors(e){this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_executeOnStable(e){this._injector?jn(e,{injector:this._injector}):setTimeout(e)}},Uh=(()=>{class i{_checker=w(Ed);_ngZone=w(qe);_document=w(ii);_injector=w(Dt);constructor(){w(io).load(RC)}create(A,t=!1){return new W3(A,this._checker,this._ngZone,this._document,t,this._injector)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var AF=new MA("liveAnnouncerElement",{providedIn:"root",factory:()=>null}),eF=new MA("LIVE_ANNOUNCER_DEFAULT_OPTIONS"),I$=0,Th=(()=>{class i{_ngZone=w(qe);_defaultOptions=w(eF,{optional:!0});_liveElement;_document=w(ii);_sanitizer=w(SC);_previousTimeout;_currentPromise;_currentResolve;constructor(){let A=w(AF,{optional:!0});this._liveElement=A||this._createLiveElement()}announce(A,...t){let n=this._defaultOptions,o,a;return t.length===1&&typeof t[0]=="number"?a=t[0]:[o,a]=t,this.clear(),clearTimeout(this._previousTimeout),o||(o=n&&n.politeness?n.politeness:"polite"),a==null&&n&&(a=n.duration),this._liveElement.setAttribute("aria-live",o),this._liveElement.id&&this._exposeAnnouncerToModals(this._liveElement.id),this._ngZone.runOutsideAngular(()=>(this._currentPromise||(this._currentPromise=new Promise(r=>this._currentResolve=r)),clearTimeout(this._previousTimeout),this._previousTimeout=setTimeout(()=>{!A||typeof A=="string"?this._liveElement.textContent=A:HN(this._liveElement,A,this._sanitizer),typeof a=="number"&&(this._previousTimeout=setTimeout(()=>this.clear(),a)),this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0},100),this._currentPromise))}clear(){this._liveElement&&(this._liveElement.textContent="")}ngOnDestroy(){clearTimeout(this._previousTimeout),this._liveElement?.remove(),this._liveElement=null,this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0}_createLiveElement(){let A="cdk-live-announcer-element",t=this._document.getElementsByClassName(A),n=this._document.createElement("div");for(let o=0;o .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{class i{_platform=w(Ci);_hasCheckedHighContrastMode=!1;_document=w(ii);_breakpointSubscription;constructor(){this._breakpointSubscription=w(Kh).observe("(forced-colors: active)").subscribe(()=>{this._hasCheckedHighContrastMode&&(this._hasCheckedHighContrastMode=!1,this._applyBodyHighContrastModeCssClasses())})}getHighContrastMode(){if(!this._platform.isBrowser)return NC.NONE;let A=this._document.createElement("div");A.style.backgroundColor="rgb(1,2,3)",A.style.position="absolute",this._document.body.appendChild(A);let t=this._document.defaultView||window,n=t&&t.getComputedStyle?t.getComputedStyle(A):null,o=(n&&n.backgroundColor||"").replace(/ /g,"");switch(A.remove(),o){case"rgb(0,0,0)":case"rgb(45,50,54)":case"rgb(32,32,32)":return NC.WHITE_ON_BLACK;case"rgb(255,255,255)":case"rgb(255,250,239)":return NC.BLACK_ON_WHITE}return NC.NONE}ngOnDestroy(){this._breakpointSubscription.unsubscribe()}_applyBodyHighContrastModeCssClasses(){if(!this._hasCheckedHighContrastMode&&this._platform.isBrowser&&this._document.body){let A=this._document.body.classList;A.remove(Cy,ZN,XN),this._hasCheckedHighContrastMode=!0;let t=this.getHighContrastMode();t===NC.BLACK_ON_WHITE?A.add(Cy,ZN):t===NC.WHITE_ON_BLACK&&A.add(Cy,XN)}}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),Jh=(()=>{class i{constructor(){w(tF)._applyBodyHighContrastModeCssClasses()}static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[V3]})}return i})();var Iy={},Bn=class i{_appId=w(E3);static _infix=`a${Math.floor(Math.random()*1e5).toString()}`;getId(e,A=!1){return this._appId!=="ng"&&(e+=this._appId),Iy.hasOwnProperty(e)||(Iy[e]=0),`${e}${A?i._infix+"-":""}${Iy[e]++}`}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var d$=200,Z3=class{_letterKeyStream=new te;_items=[];_selectedItemIndex=-1;_pressedLetters=[];_skipPredicateFn;_selectedItem=new te;selectedItem=this._selectedItem;constructor(e,A){let t=typeof A?.debounceInterval=="number"?A.debounceInterval:d$;A?.skipPredicate&&(this._skipPredicateFn=A.skipPredicate),this.setItems(e),this._setupKeyHandler(t)}destroy(){this._pressedLetters=[],this._letterKeyStream.complete(),this._selectedItem.complete()}setCurrentSelectedItemIndex(e){this._selectedItemIndex=e}setItems(e){this._items=e}handleKey(e){let A=e.keyCode;e.key&&e.key.length===1?this._letterKeyStream.next(e.key.toLocaleUpperCase()):(A>=65&&A<=90||A>=48&&A<=57)&&this._letterKeyStream.next(String.fromCharCode(A))}isTyping(){return this._pressedLetters.length>0}reset(){this._pressedLetters=[]}_setupKeyHandler(e){this._letterKeyStream.pipe(Ei(A=>this._pressedLetters.push(A)),Ms(e),Ct(()=>this._pressedLetters.length>0),ye(()=>this._pressedLetters.join("").toLocaleUpperCase())).subscribe(A=>{for(let t=1;ti[A]):i.altKey||i.shiftKey||i.ctrlKey||i.metaKey}var hd=class{_items;_activeItemIndex=mA(-1);_activeItem=mA(null);_wrap=!1;_typeaheadSubscription=Mo.EMPTY;_itemChangesSubscription;_vertical=!0;_horizontal=null;_allowedModifierKeys=[];_homeAndEnd=!1;_pageUpAndDown={enabled:!1,delta:10};_effectRef;_typeahead;_skipPredicateFn=e=>e.disabled;constructor(e,A){this._items=e,e instanceof pg?this._itemChangesSubscription=e.changes.subscribe(t=>this._itemsChanged(t.toArray())):s1(e)&&(this._effectRef=_n(()=>this._itemsChanged(e()),{injector:A}))}tabOut=new te;change=new te;skipPredicate(e){return this._skipPredicateFn=e,this}withWrap(e=!0){return this._wrap=e,this}withVerticalOrientation(e=!0){return this._vertical=e,this}withHorizontalOrientation(e){return this._horizontal=e,this}withAllowedModifierKeys(e){return this._allowedModifierKeys=e,this}withTypeAhead(e=200){this._typeaheadSubscription.unsubscribe();let A=this._getItemsArray();return this._typeahead=new Z3(A,{debounceInterval:typeof e=="number"?e:void 0,skipPredicate:t=>this._skipPredicateFn(t)}),this._typeaheadSubscription=this._typeahead.selectedItem.subscribe(t=>{this.setActiveItem(t)}),this}cancelTypeahead(){return this._typeahead?.reset(),this}withHomeAndEnd(e=!0){return this._homeAndEnd=e,this}withPageUpDown(e=!0,A=10){return this._pageUpAndDown={enabled:e,delta:A},this}setActiveItem(e){let A=this._activeItem();this.updateActiveItem(e),this._activeItem()!==A&&this.change.next(this._activeItemIndex())}onKeydown(e){let A=e.keyCode,n=["altKey","ctrlKey","metaKey","shiftKey"].every(o=>!e[o]||this._allowedModifierKeys.indexOf(o)>-1);switch(A){case 9:this.tabOut.next();return;case 40:if(this._vertical&&n){this.setNextItemActive();break}else return;case 38:if(this._vertical&&n){this.setPreviousItemActive();break}else return;case 39:if(this._horizontal&&n){this._horizontal==="rtl"?this.setPreviousItemActive():this.setNextItemActive();break}else return;case 37:if(this._horizontal&&n){this._horizontal==="rtl"?this.setNextItemActive():this.setPreviousItemActive();break}else return;case 36:if(this._homeAndEnd&&n){this.setFirstItemActive();break}else return;case 35:if(this._homeAndEnd&&n){this.setLastItemActive();break}else return;case 33:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex()-this._pageUpAndDown.delta;this._setActiveItemByIndex(o>0?o:0,1);break}else return;case 34:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex()+this._pageUpAndDown.delta,a=this._getItemsArray().length;this._setActiveItemByIndex(o-1&&t!==this._activeItemIndex()&&(this._activeItemIndex.set(t),this._typeahead?.setCurrentSelectedItemIndex(t))}}};var Yh=class extends hd{setActiveItem(e){this.activeItem&&this.activeItem.setInactiveStyles(),super.setActiveItem(e),this.activeItem&&this.activeItem.setActiveStyles()}};var y0=class extends hd{_origin="program";setFocusOrigin(e){return this._origin=e,this}setActiveItem(e){super.setActiveItem(e),this.activeItem&&this.activeItem.focus(this._origin)}};var oF=" ";function Ey(i,e,A){let t=$3(i,e);A=A.trim(),!t.some(n=>n.trim()===A)&&(t.push(A),i.setAttribute(e,t.join(oF)))}function Ap(i,e,A){let t=$3(i,e);A=A.trim();let n=t.filter(o=>o!==A);n.length?i.setAttribute(e,n.join(oF)):i.removeAttribute(e)}function $3(i,e){return i.getAttribute(e)?.match(/\S+/g)??[]}var aF="cdk-describedby-message",X3="cdk-describedby-host",By=0,rF=(()=>{class i{_platform=w(Ci);_document=w(ii);_messageRegistry=new Map;_messagesContainer=null;_id=`${By++}`;constructor(){w(io).load(RC),this._id=w(E3)+"-"+By++}describe(A,t,n){if(!this._canBeDescribed(A,t))return;let o=dy(t,n);typeof t!="string"?(nF(t,this._id),this._messageRegistry.set(o,{messageElement:t,referenceCount:0})):this._messageRegistry.has(o)||this._createMessageElement(t,n),this._isElementDescribedByMessage(A,o)||this._addMessageReference(A,o)}removeDescription(A,t,n){if(!t||!this._isElementNode(A))return;let o=dy(t,n);if(this._isElementDescribedByMessage(A,o)&&this._removeMessageReference(A,o),typeof t=="string"){let a=this._messageRegistry.get(o);a&&a.referenceCount===0&&this._deleteMessageElement(o)}this._messagesContainer?.childNodes.length===0&&(this._messagesContainer.remove(),this._messagesContainer=null)}ngOnDestroy(){let A=this._document.querySelectorAll(`[${X3}="${this._id}"]`);for(let t=0;tn.indexOf(aF)!=0);A.setAttribute("aria-describedby",t.join(" "))}_addMessageReference(A,t){let n=this._messageRegistry.get(t);Ey(A,"aria-describedby",n.messageElement.id),A.setAttribute(X3,this._id),n.referenceCount++}_removeMessageReference(A,t){let n=this._messageRegistry.get(t);n.referenceCount--,Ap(A,"aria-describedby",n.messageElement.id),A.removeAttribute(X3)}_isElementDescribedByMessage(A,t){let n=$3(A,"aria-describedby"),o=this._messageRegistry.get(t),a=o&&o.messageElement.id;return!!a&&n.indexOf(a)!=-1}_canBeDescribed(A,t){if(!this._isElementNode(A))return!1;if(t&&typeof t=="object")return!0;let n=t==null?"":`${t}`.trim(),o=A.getAttribute("aria-label");return n?!o||o.trim()!==n:!1}_isElementNode(A){return A.nodeType===this._document.ELEMENT_NODE}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function dy(i,e){return typeof i=="string"?`${e||""}/${i}`:i}function nF(i,e){i.id||(i.id=`${aF}-${e}-${By++}`)}var mg=(function(i){return i[i.NORMAL=0]="NORMAL",i[i.NEGATED=1]="NEGATED",i[i.INVERTED=2]="INVERTED",i})(mg||{}),ep,m1;function tp(){if(m1==null){if(typeof document!="object"||!document||typeof Element!="function"||!Element)return m1=!1,m1;if(document.documentElement?.style&&"scrollBehavior"in document.documentElement.style)m1=!0;else{let i=Element.prototype.scrollTo;i?m1=!/\{\s*\[native code\]\s*\}/.test(i.toString()):m1=!1}}return m1}function Qd(){if(typeof document!="object"||!document)return mg.NORMAL;if(ep==null){let i=document.createElement("div"),e=i.style;i.dir="rtl",e.width="1px",e.overflow="auto",e.visibility="hidden",e.pointerEvents="none",e.position="absolute";let A=document.createElement("div"),t=A.style;t.width="2px",t.height="1px",i.appendChild(A),document.body.appendChild(i),ep=mg.NORMAL,i.scrollLeft===0&&(i.scrollLeft=1,ep=i.scrollLeft===0?mg.NEGATED:mg.INVERTED),i.remove()}return ep}function hy(){return typeof __karma__<"u"&&!!__karma__||typeof jasmine<"u"&&!!jasmine||typeof jest<"u"&&!!jest||typeof Mocha<"u"&&!!Mocha}var ud,sF=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function Qy(){if(ud)return ud;if(typeof document!="object"||!document)return ud=new Set(sF),ud;let i=document.createElement("input");return ud=new Set(sF.filter(e=>(i.setAttribute("type",e),i.type===e))),ud}var lF={XSmall:"(max-width: 599.98px)",Small:"(min-width: 600px) and (max-width: 959.98px)",Medium:"(min-width: 960px) and (max-width: 1279.98px)",Large:"(min-width: 1280px) and (max-width: 1919.98px)",XLarge:"(min-width: 1920px)",Handset:"(max-width: 599.98px) and (orientation: portrait), (max-width: 959.98px) and (orientation: landscape)",Tablet:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait), (min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",Web:"(min-width: 840px) and (orientation: portrait), (min-width: 1280px) and (orientation: landscape)",HandsetPortrait:"(max-width: 599.98px) and (orientation: portrait)",TabletPortrait:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait)",WebPortrait:"(min-width: 840px) and (orientation: portrait)",HandsetLandscape:"(max-width: 959.98px) and (orientation: landscape)",TabletLandscape:"(min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",WebLandscape:"(min-width: 1280px) and (orientation: landscape)"};var E$=new MA("MATERIAL_ANIMATIONS"),gF=null;function Oh(){return w(E$,{optional:!0})?.animationsDisabled||w(r1,{optional:!0})==="NoopAnimations"?"di-disabled":(gF??=w(Bd).matchMedia("(prefers-reduced-motion)").matches,gF?"reduced-motion":"enabled")}function nn(){return Oh()!=="enabled"}function Ua(i){return i==null?"":typeof i=="string"?i:`${i}px`}function ur(i){return i!=null&&`${i}`!="false"}var Qs=(function(i){return i[i.FADING_IN=0]="FADING_IN",i[i.VISIBLE=1]="VISIBLE",i[i.FADING_OUT=2]="FADING_OUT",i[i.HIDDEN=3]="HIDDEN",i})(Qs||{}),uy=class{_renderer;element;config;_animationForciblyDisabledThroughCss;state=Qs.HIDDEN;constructor(e,A,t,n=!1){this._renderer=e,this.element=A,this.config=t,this._animationForciblyDisabledThroughCss=n}fadeOut(){this._renderer.fadeOutRipple(this)}},cF=Id({passive:!0,capture:!0}),py=class{_events=new Map;addHandler(e,A,t,n){let o=this._events.get(A);if(o){let a=o.get(t);a?a.add(n):o.set(t,new Set([n]))}else this._events.set(A,new Map([[t,new Set([n])]])),e.runOutsideAngular(()=>{document.addEventListener(A,this._delegateEventHandler,cF)})}removeHandler(e,A,t){let n=this._events.get(e);if(!n)return;let o=n.get(A);o&&(o.delete(t),o.size===0&&n.delete(A),n.size===0&&(this._events.delete(e),document.removeEventListener(e,this._delegateEventHandler,cF)))}_delegateEventHandler=e=>{let A=Fr(e);A&&this._events.get(e.type)?.forEach((t,n)=>{(n===A||n.contains(A))&&t.forEach(o=>o.handleEvent(e))})}},Hh={enterDuration:225,exitDuration:150},h$=800,CF=Id({passive:!0,capture:!0}),IF=["mousedown","touchstart"],dF=["mouseup","mouseleave","touchend","touchcancel"],Q$=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["ng-component"]],hostAttrs:["mat-ripple-style-loader",""],decls:0,vars:0,template:function(t,n){},styles:[`.mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale3d(0, 0, 0);background-color:var(--mat-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface) 10%, transparent))}@media(forced-colors: active){.mat-ripple-element{display:none}}.cdk-drag-preview .mat-ripple-element,.cdk-drag-placeholder .mat-ripple-element{display:none} +`],encapsulation:2,changeDetection:0})}return i})(),zh=class i{_target;_ngZone;_platform;_containerElement;_triggerElement=null;_isPointerDown=!1;_activeRipples=new Map;_mostRecentTransientRipple=null;_lastTouchStartEvent;_pointerUpEventsRegistered=!1;_containerRect=null;static _eventManager=new py;constructor(e,A,t,n,o){this._target=e,this._ngZone=A,this._platform=n,n.isBrowser&&(this._containerElement=hs(t)),o&&o.get(io).load(Q$)}fadeInRipple(e,A,t={}){let n=this._containerRect=this._containerRect||this._containerElement.getBoundingClientRect(),o=oA(oA({},Hh),t.animation);t.centered&&(e=n.left+n.width/2,A=n.top+n.height/2);let a=t.radius||u$(e,A,n),r=e-n.left,s=A-n.top,l=o.enterDuration,g=document.createElement("div");g.classList.add("mat-ripple-element"),g.style.left=`${r-a}px`,g.style.top=`${s-a}px`,g.style.height=`${a*2}px`,g.style.width=`${a*2}px`,t.color!=null&&(g.style.backgroundColor=t.color),g.style.transitionDuration=`${l}ms`,this._containerElement.appendChild(g);let C=window.getComputedStyle(g),I=C.transitionProperty,B=C.transitionDuration,Q=I==="none"||B==="0s"||B==="0s, 0s"||n.width===0&&n.height===0,h=new uy(this,g,t,Q);g.style.transform="scale3d(1, 1, 1)",h.state=Qs.FADING_IN,t.persistent||(this._mostRecentTransientRipple=h);let f=null;return!Q&&(l||o.exitDuration)&&this._ngZone.runOutsideAngular(()=>{let m=()=>{f&&(f.fallbackTimer=null),clearTimeout(S),this._finishRippleTransition(h)},v=()=>this._destroyRipple(h),S=setTimeout(v,l+100);g.addEventListener("transitionend",m),g.addEventListener("transitioncancel",v),f={onTransitionEnd:m,onTransitionCancel:v,fallbackTimer:S}}),this._activeRipples.set(h,f),(Q||!l)&&this._finishRippleTransition(h),h}fadeOutRipple(e){if(e.state===Qs.FADING_OUT||e.state===Qs.HIDDEN)return;let A=e.element,t=oA(oA({},Hh),e.config.animation);A.style.transitionDuration=`${t.exitDuration}ms`,A.style.opacity="0",e.state=Qs.FADING_OUT,(e._animationForciblyDisabledThroughCss||!t.exitDuration)&&this._finishRippleTransition(e)}fadeOutAll(){this._getActiveRipples().forEach(e=>e.fadeOut())}fadeOutAllNonPersistent(){this._getActiveRipples().forEach(e=>{e.config.persistent||e.fadeOut()})}setupTriggerEvents(e){let A=hs(e);!this._platform.isBrowser||!A||A===this._triggerElement||(this._removeTriggerEvents(),this._triggerElement=A,IF.forEach(t=>{i._eventManager.addHandler(this._ngZone,t,A,this)}))}handleEvent(e){e.type==="mousedown"?this._onMousedown(e):e.type==="touchstart"?this._onTouchStart(e):this._onPointerUp(),this._pointerUpEventsRegistered||(this._ngZone.runOutsideAngular(()=>{dF.forEach(A=>{this._triggerElement.addEventListener(A,this,CF)})}),this._pointerUpEventsRegistered=!0)}_finishRippleTransition(e){e.state===Qs.FADING_IN?this._startFadeOutTransition(e):e.state===Qs.FADING_OUT&&this._destroyRipple(e)}_startFadeOutTransition(e){let A=e===this._mostRecentTransientRipple,{persistent:t}=e.config;e.state=Qs.VISIBLE,!t&&(!A||!this._isPointerDown)&&e.fadeOut()}_destroyRipple(e){let A=this._activeRipples.get(e)??null;this._activeRipples.delete(e),this._activeRipples.size||(this._containerRect=null),e===this._mostRecentTransientRipple&&(this._mostRecentTransientRipple=null),e.state=Qs.HIDDEN,A!==null&&(e.element.removeEventListener("transitionend",A.onTransitionEnd),e.element.removeEventListener("transitioncancel",A.onTransitionCancel),A.fallbackTimer!==null&&clearTimeout(A.fallbackTimer)),e.element.remove()}_onMousedown(e){let A=d1(e),t=this._lastTouchStartEvent&&Date.now(){let A=e.state===Qs.VISIBLE||e.config.terminateOnPointerUp&&e.state===Qs.FADING_IN;!e.config.persistent&&A&&e.fadeOut()}))}_getActiveRipples(){return Array.from(this._activeRipples.keys())}_removeTriggerEvents(){let e=this._triggerElement;e&&(IF.forEach(A=>i._eventManager.removeHandler(A,e,this)),this._pointerUpEventsRegistered&&(dF.forEach(A=>e.removeEventListener(A,this,CF)),this._pointerUpEventsRegistered=!1))}};function u$(i,e,A){let t=Math.max(Math.abs(i-A.left),Math.abs(i-A.right)),n=Math.max(Math.abs(e-A.top),Math.abs(e-A.bottom));return Math.sqrt(t*t+n*n)}var FC=new MA("mat-ripple-global-options"),es=(()=>{class i{_elementRef=w(se);_animationsDisabled=nn();color;unbounded=!1;centered=!1;radius=0;animation;get disabled(){return this._disabled}set disabled(A){A&&this.fadeOutAllNonPersistent(),this._disabled=A,this._setupTriggerEventsIfEnabled()}_disabled=!1;get trigger(){return this._trigger||this._elementRef.nativeElement}set trigger(A){this._trigger=A,this._setupTriggerEventsIfEnabled()}_trigger;_rippleRenderer;_globalOptions;_isInitialized=!1;constructor(){let A=w(qe),t=w(Ci),n=w(FC,{optional:!0}),o=w(Dt);this._globalOptions=n||{},this._rippleRenderer=new zh(this,A,this._elementRef,t,o)}ngOnInit(){this._isInitialized=!0,this._setupTriggerEventsIfEnabled()}ngOnDestroy(){this._rippleRenderer._removeTriggerEvents()}fadeOutAll(){this._rippleRenderer.fadeOutAll()}fadeOutAllNonPersistent(){this._rippleRenderer.fadeOutAllNonPersistent()}get rippleConfig(){return{centered:this.centered,radius:this.radius,color:this.color,animation:oA(oA(oA({},this._globalOptions.animation),this._animationsDisabled?{enterDuration:0,exitDuration:0}:{}),this.animation),terminateOnPointerUp:this._globalOptions.terminateOnPointerUp}}get rippleDisabled(){return this.disabled||!!this._globalOptions.disabled}_setupTriggerEventsIfEnabled(){!this.disabled&&this._isInitialized&&this._rippleRenderer.setupTriggerEvents(this.trigger)}launch(A,t=0,n){return typeof A=="number"?this._rippleRenderer.fadeInRipple(A,t,oA(oA({},this.rippleConfig),n)):this._rippleRenderer.fadeInRipple(0,0,oA(oA({},this.rippleConfig),A))}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","mat-ripple",""],["","matRipple",""]],hostAttrs:[1,"mat-ripple"],hostVars:2,hostBindings:function(t,n){t&2&&xA("mat-ripple-unbounded",n.unbounded)},inputs:{color:[0,"matRippleColor","color"],unbounded:[0,"matRippleUnbounded","unbounded"],centered:[0,"matRippleCentered","centered"],radius:[0,"matRippleRadius","radius"],animation:[0,"matRippleAnimation","animation"],disabled:[0,"matRippleDisabled","disabled"],trigger:[0,"matRippleTrigger","trigger"]},exportAs:["matRipple"]})}return i})();var p$={capture:!0},f$=["focus","mousedown","mouseenter","touchstart"],fy="mat-ripple-loader-uninitialized",my="mat-ripple-loader-class-name",BF="mat-ripple-loader-centered",ip="mat-ripple-loader-disabled",np=(()=>{class i{_document=w(ii);_animationsDisabled=nn();_globalRippleOptions=w(FC,{optional:!0});_platform=w(Ci);_ngZone=w(qe);_injector=w(Dt);_eventCleanups;_hosts=new Map;constructor(){let A=w(Rr).createRenderer(null,null);this._eventCleanups=this._ngZone.runOutsideAngular(()=>f$.map(t=>A.listen(this._document,t,this._onInteraction,p$)))}ngOnDestroy(){let A=this._hosts.keys();for(let t of A)this.destroyRipple(t);this._eventCleanups.forEach(t=>t())}configureRipple(A,t){A.setAttribute(fy,this._globalRippleOptions?.namespace??""),(t.className||!A.hasAttribute(my))&&A.setAttribute(my,t.className||""),t.centered&&A.setAttribute(BF,""),t.disabled&&A.setAttribute(ip,"")}setDisabled(A,t){let n=this._hosts.get(A);n?(n.target.rippleDisabled=t,!t&&!n.hasSetUpEvents&&(n.hasSetUpEvents=!0,n.renderer.setupTriggerEvents(A))):t?A.setAttribute(ip,""):A.removeAttribute(ip)}_onInteraction=A=>{let t=Fr(A);if(t instanceof HTMLElement){let n=t.closest(`[${fy}="${this._globalRippleOptions?.namespace??""}"]`);n&&this._createRipple(n)}};_createRipple(A){if(!this._document||this._hosts.has(A))return;A.querySelector(".mat-ripple")?.remove();let t=this._document.createElement("span");t.classList.add("mat-ripple",A.getAttribute(my)),A.append(t);let n=this._globalRippleOptions,o=this._animationsDisabled?0:n?.animation?.enterDuration??Hh.enterDuration,a=this._animationsDisabled?0:n?.animation?.exitDuration??Hh.exitDuration,r={rippleDisabled:this._animationsDisabled||n?.disabled||A.hasAttribute(ip),rippleConfig:{centered:A.hasAttribute(BF),terminateOnPointerUp:n?.terminateOnPointerUp,animation:{enterDuration:o,exitDuration:a}}},s=new zh(r,this._ngZone,t,this._platform,this._injector),l=!r.rippleDisabled;l&&s.setupTriggerEvents(A),this._hosts.set(A,{target:r,renderer:s,hasSetUpEvents:l}),A.removeAttribute(fy)}destroyRipple(A){let t=this._hosts.get(A);t&&(t.renderer._removeTriggerEvents(),this._hosts.delete(A))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var rr=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["structural-styles"]],decls:0,vars:0,template:function(t,n){},styles:[`.mat-focus-indicator{position:relative}.mat-focus-indicator::before{top:0;left:0;right:0;bottom:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border-width:var(--mat-focus-indicator-border-width, 3px);border-style:var(--mat-focus-indicator-border-style, solid);border-color:var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus-visible::before{content:""}@media(forced-colors: active){html{--mat-focus-indicator-display: block}} +`],encapsulation:2,changeDetection:0})}return i})();var m$=["mat-icon-button",""],w$=["*"],D$=new MA("MAT_BUTTON_CONFIG");function EF(i){return i==null?void 0:dn(i)}var wy=(()=>{class i{_elementRef=w(se);_ngZone=w(qe);_animationsDisabled=nn();_config=w(D$,{optional:!0});_focusMonitor=w(Wa);_cleanupClick;_renderer=w(qi);_rippleLoader=w(np);_isAnchor;_isFab=!1;color;get disableRipple(){return this._disableRipple}set disableRipple(A){this._disableRipple=A,this._updateRippleDisabled()}_disableRipple=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._updateRippleDisabled()}_disabled=!1;ariaDisabled;disabledInteractive;tabIndex;set _tabindex(A){this.tabIndex=A}constructor(){w(io).load(rr);let A=this._elementRef.nativeElement;this._isAnchor=A.tagName==="A",this.disabledInteractive=this._config?.disabledInteractive??!1,this.color=this._config?.color??null,this._rippleLoader?.configureRipple(A,{className:"mat-mdc-button-ripple"})}ngAfterViewInit(){this._focusMonitor.monitor(this._elementRef,!0),this._isAnchor&&this._setupAsAnchor()}ngOnDestroy(){this._cleanupClick?.(),this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement)}focus(A="program",t){A?this._focusMonitor.focusVia(this._elementRef.nativeElement,A,t):this._elementRef.nativeElement.focus(t)}_getAriaDisabled(){return this.ariaDisabled!=null?this.ariaDisabled:this._isAnchor?this.disabled||null:this.disabled&&this.disabledInteractive?!0:null}_getDisabledAttribute(){return this.disabledInteractive||!this.disabled?null:!0}_updateRippleDisabled(){this._rippleLoader?.setDisabled(this._elementRef.nativeElement,this.disableRipple||this.disabled)}_getTabIndex(){return this._isAnchor?this.disabled&&!this.disabledInteractive?-1:this.tabIndex:this.tabIndex}_setupAsAnchor(){this._cleanupClick=this._ngZone.runOutsideAngular(()=>this._renderer.listen(this._elementRef.nativeElement,"click",A=>{this.disabled&&(A.preventDefault(),A.stopImmediatePropagation())}))}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,hostAttrs:[1,"mat-mdc-button-base"],hostVars:13,hostBindings:function(t,n){t&2&&(ee("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled())("tabindex",n._getTabIndex()),go(n.color?"mat-"+n.color:""),xA("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("mat-unthemed",!n.color)("_mat-animation-noopable",n._animationsDisabled))},inputs:{color:"color",disableRipple:[2,"disableRipple","disableRipple",Ee],disabled:[2,"disabled","disabled",Ee],ariaDisabled:[2,"aria-disabled","ariaDisabled",Ee],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Ee],tabIndex:[2,"tabIndex","tabIndex",EF],_tabindex:[2,"tabindex","_tabindex",EF]}})}return i})(),vi=(()=>{class i extends wy{constructor(){super(),this._rippleLoader.configureRipple(this._elementRef.nativeElement,{centered:!0})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["button","mat-icon-button",""],["a","mat-icon-button",""],["button","matIconButton",""],["a","matIconButton",""]],hostAttrs:[1,"mdc-icon-button","mat-mdc-icon-button"],exportAs:["matButton","matAnchor"],features:[mt],attrs:m$,ngContentSelectors:w$,decls:4,vars:0,consts:[[1,"mat-mdc-button-persistent-ripple","mdc-icon-button__ripple"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(t,n){t&1&&(Nt(),Jn(0,"span",0),Ve(1),Jn(2,"span",1)(3,"span",2))},styles:[`.mat-mdc-icon-button{-webkit-user-select:none;user-select:none;display:inline-block;position:relative;box-sizing:border-box;border:none;outline:none;background-color:rgba(0,0,0,0);fill:currentColor;text-decoration:none;cursor:pointer;z-index:0;overflow:visible;border-radius:var(--mat-icon-button-container-shape, var(--mat-sys-corner-full, 50%));flex-shrink:0;text-align:center;width:var(--mat-icon-button-state-layer-size, 40px);height:var(--mat-icon-button-state-layer-size, 40px);padding:calc(calc(var(--mat-icon-button-state-layer-size, 40px) - var(--mat-icon-button-icon-size, 24px)) / 2);font-size:var(--mat-icon-button-icon-size, 24px);color:var(--mat-icon-button-icon-color, var(--mat-sys-on-surface-variant));-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-icon-button .mat-mdc-button-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-icon-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-icon-button .mdc-button__label,.mat-mdc-icon-button .mat-icon{z-index:1;position:relative}.mat-mdc-icon-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-icon-button:focus-visible>.mat-focus-indicator::before{content:"";border-radius:inherit}.mat-mdc-icon-button .mat-ripple-element{background-color:var(--mat-icon-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface-variant) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-icon-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-icon-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-icon-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-icon-button-touch-target-size, 48px);display:var(--mat-icon-button-touch-target-display, block);left:50%;width:var(--mat-icon-button-touch-target-size, 48px);transform:translate(-50%, -50%)}.mat-mdc-icon-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-icon-button[disabled],.mat-mdc-icon-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-icon-button-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-icon-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-icon-button img,.mat-mdc-icon-button svg{width:var(--mat-icon-button-icon-size, 24px);height:var(--mat-icon-button-icon-size, 24px);vertical-align:baseline}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple{border-radius:var(--mat-icon-button-container-shape, var(--mat-sys-corner-full, 50%))}.mat-mdc-icon-button[hidden]{display:none}.mat-mdc-icon-button.mat-unthemed:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-primary:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-accent:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-warn:not(.mdc-ripple-upgraded):focus::before{background:rgba(0,0,0,0);opacity:1} +`,`@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-button-base.mat-tonal-button,.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}} +`],encapsulation:2,changeDetection:0})}return i})();var y$=new MA("cdk-dir-doc",{providedIn:"root",factory:()=>w(ii)}),v$=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;function hF(i){let e=i?.toLowerCase()||"";return e==="auto"&&typeof navigator<"u"&&navigator?.language?v$.test(navigator.language)?"rtl":"ltr":e==="rtl"?"rtl":"ltr"}var fo=(()=>{class i{get value(){return this.valueSignal()}valueSignal=mA("ltr");change=new LA;constructor(){let A=w(y$,{optional:!0});if(A){let t=A.body?A.body.dir:null,n=A.documentElement?A.documentElement.dir:null;this.valueSignal.set(hF(t||n||"ltr"))}}ngOnDestroy(){this.change.complete()}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var Qi=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({})}return i})();var Sc=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Qi]})}return i})();var b$=["matButton",""],M$=[[["",8,"material-icons",3,"iconPositionEnd",""],["mat-icon",3,"iconPositionEnd",""],["","matButtonIcon","",3,"iconPositionEnd",""]],"*",[["","iconPositionEnd","",8,"material-icons"],["mat-icon","iconPositionEnd",""],["","matButtonIcon","","iconPositionEnd",""]]],S$=[".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])","*",".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"];var QF=new Map([["text",["mat-mdc-button"]],["filled",["mdc-button--unelevated","mat-mdc-unelevated-button"]],["elevated",["mdc-button--raised","mat-mdc-raised-button"]],["outlined",["mdc-button--outlined","mat-mdc-outlined-button"]],["tonal",["mat-tonal-button"]]]),Si=(()=>{class i extends wy{get appearance(){return this._appearance}set appearance(A){this.setAppearance(A||this._config?.defaultAppearance||"text")}_appearance=null;constructor(){super();let A=k$(this._elementRef.nativeElement);A&&this.setAppearance(A)}setAppearance(A){if(A===this._appearance)return;let t=this._elementRef.nativeElement.classList,n=this._appearance?QF.get(this._appearance):null,o=QF.get(A);n&&t.remove(...n),t.add(...o),this._appearance=A}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["button","matButton",""],["a","matButton",""],["button","mat-button",""],["button","mat-raised-button",""],["button","mat-flat-button",""],["button","mat-stroked-button",""],["a","mat-button",""],["a","mat-raised-button",""],["a","mat-flat-button",""],["a","mat-stroked-button",""]],hostAttrs:[1,"mdc-button"],inputs:{appearance:[0,"matButton","appearance"]},exportAs:["matButton","matAnchor"],features:[mt],attrs:b$,ngContentSelectors:S$,decls:7,vars:4,consts:[[1,"mat-mdc-button-persistent-ripple"],[1,"mdc-button__label"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(t,n){t&1&&(Nt(M$),Jn(0,"span",0),Ve(1),Dn(2,"span",1),Ve(3,1),Tn(),Ve(4,2),Jn(5,"span",2)(6,"span",3)),t&2&&xA("mdc-button__ripple",!n._isFab)("mdc-fab__ripple",n._isFab)},styles:[`.mat-mdc-button-base{text-decoration:none}.mat-mdc-button-base .mat-icon{min-height:fit-content;flex-shrink:0}@media(hover: none){.mat-mdc-button-base:hover>span.mat-mdc-button-persistent-ripple::before{opacity:0}}.mdc-button{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:64px;border:none;outline:none;line-height:inherit;-webkit-appearance:none;overflow:visible;vertical-align:middle;background:rgba(0,0,0,0);padding:0 8px}.mdc-button::-moz-focus-inner{padding:0;border:0}.mdc-button:active{outline:none}.mdc-button:hover{cursor:pointer}.mdc-button:disabled{cursor:default;pointer-events:none}.mdc-button[hidden]{display:none}.mdc-button .mdc-button__label{position:relative}.mat-mdc-button{padding:0 var(--mat-button-text-horizontal-padding, 12px);height:var(--mat-button-text-container-height, 40px);font-family:var(--mat-button-text-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-text-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-text-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-text-label-text-transform);font-weight:var(--mat-button-text-label-text-weight, var(--mat-sys-label-large-weight))}.mat-mdc-button,.mat-mdc-button .mdc-button__ripple{border-radius:var(--mat-button-text-container-shape, var(--mat-sys-corner-full))}.mat-mdc-button:not(:disabled){color:var(--mat-button-text-label-text-color, var(--mat-sys-primary))}.mat-mdc-button[disabled],.mat-mdc-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-text-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-button:has(.material-icons,mat-icon,[matButtonIcon]){padding:0 var(--mat-button-text-with-icon-horizontal-padding, 16px)}.mat-mdc-button>.mat-icon{margin-right:var(--mat-button-text-icon-spacing, 8px);margin-left:var(--mat-button-text-icon-offset, -4px)}[dir=rtl] .mat-mdc-button>.mat-icon{margin-right:var(--mat-button-text-icon-offset, -4px);margin-left:var(--mat-button-text-icon-spacing, 8px)}.mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-text-icon-offset, -4px);margin-left:var(--mat-button-text-icon-spacing, 8px)}[dir=rtl] .mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-text-icon-spacing, 8px);margin-left:var(--mat-button-text-icon-offset, -4px)}.mat-mdc-button .mat-ripple-element{background-color:var(--mat-button-text-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-text-state-layer-color, var(--mat-sys-primary))}.mat-mdc-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-text-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-text-touch-target-size, 48px);display:var(--mat-button-text-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-unelevated-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-filled-container-height, 40px);font-family:var(--mat-button-filled-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-filled-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-filled-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-filled-label-text-transform);font-weight:var(--mat-button-filled-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-filled-horizontal-padding, 24px)}.mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-button-filled-icon-spacing, 8px);margin-left:var(--mat-button-filled-icon-offset, -8px)}[dir=rtl] .mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-button-filled-icon-offset, -8px);margin-left:var(--mat-button-filled-icon-spacing, 8px)}.mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-filled-icon-offset, -8px);margin-left:var(--mat-button-filled-icon-spacing, 8px)}[dir=rtl] .mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-filled-icon-spacing, 8px);margin-left:var(--mat-button-filled-icon-offset, -8px)}.mat-mdc-unelevated-button .mat-ripple-element{background-color:var(--mat-button-filled-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-filled-state-layer-color, var(--mat-sys-on-primary))}.mat-mdc-unelevated-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-filled-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-unelevated-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-unelevated-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-unelevated-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-unelevated-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-filled-touch-target-size, 48px);display:var(--mat-button-filled-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-unelevated-button:not(:disabled){color:var(--mat-button-filled-label-text-color, var(--mat-sys-on-primary));background-color:var(--mat-button-filled-container-color, var(--mat-sys-primary))}.mat-mdc-unelevated-button,.mat-mdc-unelevated-button .mdc-button__ripple{border-radius:var(--mat-button-filled-container-shape, var(--mat-sys-corner-full))}.mat-mdc-unelevated-button[disabled],.mat-mdc-unelevated-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-filled-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-filled-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-raised-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);box-shadow:var(--mat-button-protected-container-elevation-shadow, var(--mat-sys-level1));height:var(--mat-button-protected-container-height, 40px);font-family:var(--mat-button-protected-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-protected-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-protected-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-protected-label-text-transform);font-weight:var(--mat-button-protected-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-protected-horizontal-padding, 24px)}.mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-button-protected-icon-spacing, 8px);margin-left:var(--mat-button-protected-icon-offset, -8px)}[dir=rtl] .mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-button-protected-icon-offset, -8px);margin-left:var(--mat-button-protected-icon-spacing, 8px)}.mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-protected-icon-offset, -8px);margin-left:var(--mat-button-protected-icon-spacing, 8px)}[dir=rtl] .mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-protected-icon-spacing, 8px);margin-left:var(--mat-button-protected-icon-offset, -8px)}.mat-mdc-raised-button .mat-ripple-element{background-color:var(--mat-button-protected-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-protected-state-layer-color, var(--mat-sys-primary))}.mat-mdc-raised-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-protected-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-raised-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-raised-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-raised-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-raised-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-protected-touch-target-size, 48px);display:var(--mat-button-protected-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-raised-button:not(:disabled){color:var(--mat-button-protected-label-text-color, var(--mat-sys-primary));background-color:var(--mat-button-protected-container-color, var(--mat-sys-surface))}.mat-mdc-raised-button,.mat-mdc-raised-button .mdc-button__ripple{border-radius:var(--mat-button-protected-container-shape, var(--mat-sys-corner-full))}@media(hover: hover){.mat-mdc-raised-button:hover{box-shadow:var(--mat-button-protected-hover-container-elevation-shadow, var(--mat-sys-level2))}}.mat-mdc-raised-button:focus{box-shadow:var(--mat-button-protected-focus-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button:active,.mat-mdc-raised-button:focus:active{box-shadow:var(--mat-button-protected-pressed-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button[disabled],.mat-mdc-raised-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-protected-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-protected-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-raised-button[disabled].mat-mdc-button-disabled,.mat-mdc-raised-button.mat-mdc-button-disabled.mat-mdc-button-disabled{box-shadow:var(--mat-button-protected-disabled-container-elevation-shadow, var(--mat-sys-level0))}.mat-mdc-raised-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-outlined-button{border-style:solid;transition:border 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-outlined-container-height, 40px);font-family:var(--mat-button-outlined-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-outlined-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-outlined-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-outlined-label-text-transform);font-weight:var(--mat-button-outlined-label-text-weight, var(--mat-sys-label-large-weight));border-radius:var(--mat-button-outlined-container-shape, var(--mat-sys-corner-full));border-width:var(--mat-button-outlined-outline-width, 1px);padding:0 var(--mat-button-outlined-horizontal-padding, 24px)}.mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-button-outlined-icon-spacing, 8px);margin-left:var(--mat-button-outlined-icon-offset, -8px)}[dir=rtl] .mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-button-outlined-icon-offset, -8px);margin-left:var(--mat-button-outlined-icon-spacing, 8px)}.mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-outlined-icon-offset, -8px);margin-left:var(--mat-button-outlined-icon-spacing, 8px)}[dir=rtl] .mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-outlined-icon-spacing, 8px);margin-left:var(--mat-button-outlined-icon-offset, -8px)}.mat-mdc-outlined-button .mat-ripple-element{background-color:var(--mat-button-outlined-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-outlined-state-layer-color, var(--mat-sys-primary))}.mat-mdc-outlined-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-outlined-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-outlined-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-outlined-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-outlined-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-outlined-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-outlined-touch-target-size, 48px);display:var(--mat-button-outlined-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-outlined-button:not(:disabled){color:var(--mat-button-outlined-label-text-color, var(--mat-sys-primary));border-color:var(--mat-button-outlined-outline-color, var(--mat-sys-outline))}.mat-mdc-outlined-button[disabled],.mat-mdc-outlined-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-outlined-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:var(--mat-button-outlined-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-tonal-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-tonal-container-height, 40px);font-family:var(--mat-button-tonal-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-tonal-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-tonal-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-tonal-label-text-transform);font-weight:var(--mat-button-tonal-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-tonal-horizontal-padding, 24px)}.mat-tonal-button:not(:disabled){color:var(--mat-button-tonal-label-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-button-tonal-container-color, var(--mat-sys-secondary-container))}.mat-tonal-button,.mat-tonal-button .mdc-button__ripple{border-radius:var(--mat-button-tonal-container-shape, var(--mat-sys-corner-full))}.mat-tonal-button[disabled],.mat-tonal-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-tonal-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-tonal-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-tonal-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-tonal-button>.mat-icon{margin-right:var(--mat-button-tonal-icon-spacing, 8px);margin-left:var(--mat-button-tonal-icon-offset, -8px)}[dir=rtl] .mat-tonal-button>.mat-icon{margin-right:var(--mat-button-tonal-icon-offset, -8px);margin-left:var(--mat-button-tonal-icon-spacing, 8px)}.mat-tonal-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-tonal-icon-offset, -8px);margin-left:var(--mat-button-tonal-icon-spacing, 8px)}[dir=rtl] .mat-tonal-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-tonal-icon-spacing, 8px);margin-left:var(--mat-button-tonal-icon-offset, -8px)}.mat-tonal-button .mat-ripple-element{background-color:var(--mat-button-tonal-ripple-color, color-mix(in srgb, var(--mat-sys-on-secondary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-tonal-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-tonal-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-tonal-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-tonal-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-tonal-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-tonal-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-tonal-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-tonal-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-tonal-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-tonal-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-tonal-touch-target-size, 48px);display:var(--mat-button-tonal-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-button,.mat-mdc-unelevated-button,.mat-mdc-raised-button,.mat-mdc-outlined-button,.mat-tonal-button{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before,.mat-tonal-button .mat-mdc-button-ripple,.mat-tonal-button .mat-mdc-button-persistent-ripple,.mat-tonal-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-tonal-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before,.mat-tonal-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-button .mdc-button__label,.mat-mdc-button .mat-icon,.mat-mdc-unelevated-button .mdc-button__label,.mat-mdc-unelevated-button .mat-icon,.mat-mdc-raised-button .mdc-button__label,.mat-mdc-raised-button .mat-icon,.mat-mdc-outlined-button .mdc-button__label,.mat-mdc-outlined-button .mat-icon,.mat-tonal-button .mdc-button__label,.mat-tonal-button .mat-icon{z-index:1;position:relative}.mat-mdc-button .mat-focus-indicator,.mat-mdc-unelevated-button .mat-focus-indicator,.mat-mdc-raised-button .mat-focus-indicator,.mat-mdc-outlined-button .mat-focus-indicator,.mat-tonal-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-unelevated-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-raised-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-outlined-button:focus-visible>.mat-focus-indicator::before,.mat-tonal-button:focus-visible>.mat-focus-indicator::before{content:"";border-radius:inherit}.mat-mdc-button._mat-animation-noopable,.mat-mdc-unelevated-button._mat-animation-noopable,.mat-mdc-raised-button._mat-animation-noopable,.mat-mdc-outlined-button._mat-animation-noopable,.mat-tonal-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-button>.mat-icon,.mat-mdc-unelevated-button>.mat-icon,.mat-mdc-raised-button>.mat-icon,.mat-mdc-outlined-button>.mat-icon,.mat-tonal-button>.mat-icon{display:inline-block;position:relative;vertical-align:top;font-size:1.125rem;height:1.125rem;width:1.125rem}.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mdc-button__ripple{top:-1px;left:-1px;bottom:-1px;right:-1px}.mat-mdc-unelevated-button .mat-focus-indicator::before,.mat-tonal-button .mat-focus-indicator::before,.mat-mdc-raised-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-outlined-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 3px)*-1)} +`,`@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-button-base.mat-tonal-button,.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}} +`],encapsulation:2,changeDetection:0})}return i})();function k$(i){return i.hasAttribute("mat-raised-button")?"elevated":i.hasAttribute("mat-stroked-button")?"outlined":i.hasAttribute("mat-flat-button")?"filled":i.hasAttribute("mat-button")?"text":null}var Wi=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Sc,Qi]})}return i})();var Dy=class{_box;_destroyed=new te;_resizeSubject=new te;_resizeObserver;_elementObservables=new Map;constructor(e){this._box=e,typeof ResizeObserver<"u"&&(this._resizeObserver=new ResizeObserver(A=>this._resizeSubject.next(A)))}observe(e){return this._elementObservables.has(e)||this._elementObservables.set(e,new bi(A=>{let t=this._resizeSubject.subscribe(A);return this._resizeObserver?.observe(e,{box:this._box}),()=>{this._resizeObserver?.unobserve(e),t.unsubscribe(),this._elementObservables.delete(e)}}).pipe(Ct(A=>A.some(t=>t.target===e)),Ss({bufferSize:1,refCount:!0}),ut(this._destroyed))),this._elementObservables.get(e)}destroy(){this._destroyed.next(),this._destroyed.complete(),this._resizeSubject.complete(),this._elementObservables.clear()}},op=(()=>{class i{_cleanupErrorListener;_observers=new Map;_ngZone=w(qe);constructor(){typeof ResizeObserver<"u"}ngOnDestroy(){for(let[,A]of this._observers)A.destroy();this._observers.clear(),this._cleanupErrorListener?.()}observe(A,t){let n=t?.box||"content-box";return this._observers.has(n)||this._observers.set(n,new Dy(n)),this._observers.get(n).observe(A)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var _$=["notch"],x$=["matFormFieldNotchedOutline",""],R$=["*"],uF=["iconPrefixContainer"],pF=["textPrefixContainer"],fF=["iconSuffixContainer"],mF=["textSuffixContainer"],N$=["textField"],F$=["*",[["mat-label"]],[["","matPrefix",""],["","matIconPrefix",""]],[["","matTextPrefix",""]],[["","matTextSuffix",""]],[["","matSuffix",""],["","matIconSuffix",""]],[["mat-error"],["","matError",""]],[["mat-hint",3,"align","end"]],[["mat-hint","align","end"]]],L$=["*","mat-label","[matPrefix], [matIconPrefix]","[matTextPrefix]","[matTextSuffix]","[matSuffix], [matIconSuffix]","mat-error, [matError]","mat-hint:not([align='end'])","mat-hint[align='end']"];function G$(i,e){i&1&&lA(0,"span",21)}function K$(i,e){if(i&1&&(d(0,"label",20),Ve(1,1),Y(2,G$,1,0,"span",21),E()),i&2){let A=p(2);H("floating",A._shouldLabelFloat())("monitorResize",A._hasOutline())("id",A._labelId),ee("for",A._control.disableAutomaticLabeling?null:A._control.id),u(2),O(!A.hideRequiredMarker&&A._control.required?2:-1)}}function U$(i,e){if(i&1&&Y(0,K$,3,5,"label",20),i&2){let A=p();O(A._hasFloatingLabel()?0:-1)}}function T$(i,e){i&1&&lA(0,"div",7)}function J$(i,e){}function Y$(i,e){if(i&1&&yt(0,J$,0,0,"ng-template",13),i&2){p(2);let A=gi(1);H("ngTemplateOutlet",A)}}function O$(i,e){if(i&1&&(d(0,"div",9),Y(1,Y$,1,1,null,13),E()),i&2){let A=p();H("matFormFieldNotchedOutlineOpen",A._shouldLabelFloat()),u(),O(A._forceDisplayInfixLabel()?-1:1)}}function H$(i,e){i&1&&(d(0,"div",10,2),Ve(2,2),E())}function z$(i,e){i&1&&(d(0,"div",11,3),Ve(2,3),E())}function P$(i,e){}function j$(i,e){if(i&1&&yt(0,P$,0,0,"ng-template",13),i&2){p();let A=gi(1);H("ngTemplateOutlet",A)}}function q$(i,e){i&1&&(d(0,"div",14,4),Ve(2,4),E())}function V$(i,e){i&1&&(d(0,"div",15,5),Ve(2,5),E())}function W$(i,e){i&1&&lA(0,"div",16)}function Z$(i,e){i&1&&(d(0,"div",18),Ve(1,6),E())}function X$(i,e){if(i&1&&(d(0,"mat-hint",22),y(1),E()),i&2){let A=p(2);H("id",A._hintLabelId),u(),iA(A.hintLabel)}}function $$(i,e){if(i&1&&(d(0,"div",19),Y(1,X$,2,2,"mat-hint",22),Ve(2,7),lA(3,"div",23),Ve(4,8),E()),i&2){let A=p();u(),O(A.hintLabel?1:-1)}}var us=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["mat-label"]]})}return i})(),SF=new MA("MatError"),yy=(()=>{class i{id=w(Bn).getId("mat-mdc-error-");constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["mat-error"],["","matError",""]],hostAttrs:[1,"mat-mdc-form-field-error","mat-mdc-form-field-bottom-align"],hostVars:1,hostBindings:function(t,n){t&2&&Ea("id",n.id)},inputs:{id:"id"},features:[Et([{provide:SF,useExisting:i}])]})}return i})(),w1=(()=>{class i{align="start";id=w(Bn).getId("mat-mdc-hint-");static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["mat-hint"]],hostAttrs:[1,"mat-mdc-form-field-hint","mat-mdc-form-field-bottom-align"],hostVars:4,hostBindings:function(t,n){t&2&&(Ea("id",n.id),ee("align",null),xA("mat-mdc-form-field-hint-end",n.align==="end"))},inputs:{align:"align",id:"id"}})}return i})(),kF=new MA("MatPrefix"),vy=(()=>{class i{set _isTextSelector(A){this._isText=!0}_isText=!1;static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","matPrefix",""],["","matIconPrefix",""],["","matTextPrefix",""]],inputs:{_isTextSelector:[0,"matTextPrefix","_isTextSelector"]},features:[Et([{provide:kF,useExisting:i}])]})}return i})(),_F=new MA("MatSuffix"),by=(()=>{class i{set _isTextSelector(A){this._isText=!0}_isText=!1;static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","matSuffix",""],["","matIconSuffix",""],["","matTextSuffix",""]],inputs:{_isTextSelector:[0,"matTextSuffix","_isTextSelector"]},features:[Et([{provide:_F,useExisting:i}])]})}return i})(),xF=new MA("FloatingLabelParent"),wF=(()=>{class i{_elementRef=w(se);get floating(){return this._floating}set floating(A){this._floating=A,this.monitorResize&&this._handleResize()}_floating=!1;get monitorResize(){return this._monitorResize}set monitorResize(A){this._monitorResize=A,this._monitorResize?this._subscribeToResize():this._resizeSubscription.unsubscribe()}_monitorResize=!1;_resizeObserver=w(op);_ngZone=w(qe);_parent=w(xF);_resizeSubscription=new Mo;constructor(){}ngOnDestroy(){this._resizeSubscription.unsubscribe()}getWidth(){return AAA(this._elementRef.nativeElement)}get element(){return this._elementRef.nativeElement}_handleResize(){setTimeout(()=>this._parent._handleLabelResized())}_subscribeToResize(){this._resizeSubscription.unsubscribe(),this._ngZone.runOutsideAngular(()=>{this._resizeSubscription=this._resizeObserver.observe(this._elementRef.nativeElement,{box:"border-box"}).subscribe(()=>this._handleResize())})}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["label","matFormFieldFloatingLabel",""]],hostAttrs:[1,"mdc-floating-label","mat-mdc-floating-label"],hostVars:2,hostBindings:function(t,n){t&2&&xA("mdc-floating-label--float-above",n.floating)},inputs:{floating:"floating",monitorResize:"monitorResize"}})}return i})();function AAA(i){let e=i;if(e.offsetParent!==null)return e.scrollWidth;let A=e.cloneNode(!0);A.style.setProperty("position","absolute"),A.style.setProperty("transform","translate(-9999px, -9999px)"),document.documentElement.appendChild(A);let t=A.scrollWidth;return A.remove(),t}var DF="mdc-line-ripple--active",ap="mdc-line-ripple--deactivating",yF=(()=>{class i{_elementRef=w(se);_cleanupTransitionEnd;constructor(){let A=w(qe),t=w(qi);A.runOutsideAngular(()=>{this._cleanupTransitionEnd=t.listen(this._elementRef.nativeElement,"transitionend",this._handleTransitionEnd)})}activate(){let A=this._elementRef.nativeElement.classList;A.remove(ap),A.add(DF)}deactivate(){this._elementRef.nativeElement.classList.add(ap)}_handleTransitionEnd=A=>{let t=this._elementRef.nativeElement.classList,n=t.contains(ap);A.propertyName==="opacity"&&n&&t.remove(DF,ap)};ngOnDestroy(){this._cleanupTransitionEnd()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["div","matFormFieldLineRipple",""]],hostAttrs:[1,"mdc-line-ripple"]})}return i})(),vF=(()=>{class i{_elementRef=w(se);_ngZone=w(qe);open=!1;_notch;ngAfterViewInit(){let A=this._elementRef.nativeElement,t=A.querySelector(".mdc-floating-label");t?(A.classList.add("mdc-notched-outline--upgraded"),typeof requestAnimationFrame=="function"&&(t.style.transitionDuration="0s",this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>t.style.transitionDuration="")}))):A.classList.add("mdc-notched-outline--no-label")}_setNotchWidth(A){let t=this._notch.nativeElement;!this.open||!A?t.style.width="":t.style.width=`calc(${A}px * var(--mat-mdc-form-field-floating-label-scale, 0.75) + 9px)`}_setMaxWidth(A){this._notch.nativeElement.style.setProperty("--mat-form-field-notch-max-width",`calc(100% - ${A}px)`)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["div","matFormFieldNotchedOutline",""]],viewQuery:function(t,n){if(t&1&&Yt(_$,5),t&2){let o;oe(o=ae())&&(n._notch=o.first)}},hostAttrs:[1,"mdc-notched-outline"],hostVars:2,hostBindings:function(t,n){t&2&&xA("mdc-notched-outline--notched",n.open)},inputs:{open:[0,"matFormFieldNotchedOutlineOpen","open"]},attrs:x$,ngContentSelectors:R$,decls:5,vars:0,consts:[["notch",""],[1,"mat-mdc-notch-piece","mdc-notched-outline__leading"],[1,"mat-mdc-notch-piece","mdc-notched-outline__notch"],[1,"mat-mdc-notch-piece","mdc-notched-outline__trailing"]],template:function(t,n){t&1&&(Nt(),Jn(0,"div",1),Dn(1,"div",2,0),Ve(3),Tn(),Jn(4,"div",3))},encapsulation:2,changeDetection:0})}return i})(),Ph=(()=>{class i{value=null;stateChanges;id;placeholder;ngControl=null;focused=!1;empty=!1;shouldLabelFloat=!1;required=!1;disabled=!1;errorState=!1;controlType;autofilled;userAriaDescribedBy;disableAutomaticLabeling;describedByIds;static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i})}return i})();var jh=new MA("MatFormField"),eAA=new MA("MAT_FORM_FIELD_DEFAULT_OPTIONS"),bF="fill",tAA="auto",MF="fixed",iAA="translateY(-50%)",To=(()=>{class i{_elementRef=w(se);_changeDetectorRef=w(wt);_platform=w(Ci);_idGenerator=w(Bn);_ngZone=w(qe);_defaults=w(eAA,{optional:!0});_currentDirection;_textField;_iconPrefixContainer;_textPrefixContainer;_iconSuffixContainer;_textSuffixContainer;_floatingLabel;_notchedOutline;_lineRipple;_iconPrefixContainerSignal=ko("iconPrefixContainer");_textPrefixContainerSignal=ko("textPrefixContainer");_iconSuffixContainerSignal=ko("iconSuffixContainer");_textSuffixContainerSignal=ko("textSuffixContainer");_prefixSuffixContainers=me(()=>[this._iconPrefixContainerSignal(),this._textPrefixContainerSignal(),this._iconSuffixContainerSignal(),this._textSuffixContainerSignal()].map(A=>A?.nativeElement).filter(A=>A!==void 0));_formFieldControl;_prefixChildren;_suffixChildren;_errorChildren;_hintChildren;_labelChild=m0(us);get hideRequiredMarker(){return this._hideRequiredMarker}set hideRequiredMarker(A){this._hideRequiredMarker=ur(A)}_hideRequiredMarker=!1;color="primary";get floatLabel(){return this._floatLabel||this._defaults?.floatLabel||tAA}set floatLabel(A){A!==this._floatLabel&&(this._floatLabel=A,this._changeDetectorRef.markForCheck())}_floatLabel;get appearance(){return this._appearanceSignal()}set appearance(A){let t=A||this._defaults?.appearance||bF;this._appearanceSignal.set(t)}_appearanceSignal=mA(bF);get subscriptSizing(){return this._subscriptSizing||this._defaults?.subscriptSizing||MF}set subscriptSizing(A){this._subscriptSizing=A||this._defaults?.subscriptSizing||MF}_subscriptSizing=null;get hintLabel(){return this._hintLabel}set hintLabel(A){this._hintLabel=A,this._processHints()}_hintLabel="";_hasIconPrefix=!1;_hasTextPrefix=!1;_hasIconSuffix=!1;_hasTextSuffix=!1;_labelId=this._idGenerator.getId("mat-mdc-form-field-label-");_hintLabelId=this._idGenerator.getId("mat-mdc-hint-");_describedByIds;get _control(){return this._explicitFormFieldControl||this._formFieldControl}set _control(A){this._explicitFormFieldControl=A}_destroyed=new te;_isFocused=null;_explicitFormFieldControl;_previousControl=null;_previousControlValidatorFn=null;_stateChanges;_valueChanges;_describedByChanges;_outlineLabelOffsetResizeObserver=null;_animationsDisabled=nn();constructor(){let A=this._defaults,t=w(fo);A&&(A.appearance&&(this.appearance=A.appearance),this._hideRequiredMarker=!!A?.hideRequiredMarker,A.color&&(this.color=A.color)),_n(()=>this._currentDirection=t.valueSignal()),this._syncOutlineLabelOffset()}ngAfterViewInit(){this._updateFocusState(),this._animationsDisabled||this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._elementRef.nativeElement.classList.add("mat-form-field-animations-enabled")},300)}),this._changeDetectorRef.detectChanges()}ngAfterContentInit(){this._assertFormFieldControl(),this._initializeSubscript(),this._initializePrefixAndSuffix()}ngAfterContentChecked(){this._assertFormFieldControl(),this._control!==this._previousControl&&(this._initializeControl(this._previousControl),this._control.ngControl&&this._control.ngControl.control&&(this._previousControlValidatorFn=this._control.ngControl.control.validator),this._previousControl=this._control),this._control.ngControl&&this._control.ngControl.control&&this._control.ngControl.control.validator!==this._previousControlValidatorFn&&this._changeDetectorRef.markForCheck()}ngOnDestroy(){this._outlineLabelOffsetResizeObserver?.disconnect(),this._stateChanges?.unsubscribe(),this._valueChanges?.unsubscribe(),this._describedByChanges?.unsubscribe(),this._destroyed.next(),this._destroyed.complete()}getLabelId=me(()=>this._hasFloatingLabel()?this._labelId:null);getConnectedOverlayOrigin(){return this._textField||this._elementRef}_animateAndLockLabel(){this._hasFloatingLabel()&&(this.floatLabel="always")}_initializeControl(A){let t=this._control,n="mat-mdc-form-field-type-";A&&this._elementRef.nativeElement.classList.remove(n+A.controlType),t.controlType&&this._elementRef.nativeElement.classList.add(n+t.controlType),this._stateChanges?.unsubscribe(),this._stateChanges=t.stateChanges.subscribe(()=>{this._updateFocusState(),this._changeDetectorRef.markForCheck()}),this._describedByChanges?.unsubscribe(),this._describedByChanges=t.stateChanges.pipe(kn([void 0,void 0]),ye(()=>[t.errorState,t.userAriaDescribedBy]),yC(),Ct(([[o,a],[r,s]])=>o!==r||a!==s)).subscribe(()=>this._syncDescribedByIds()),this._valueChanges?.unsubscribe(),t.ngControl&&t.ngControl.valueChanges&&(this._valueChanges=t.ngControl.valueChanges.pipe(ut(this._destroyed)).subscribe(()=>this._changeDetectorRef.markForCheck()))}_checkPrefixAndSuffixTypes(){this._hasIconPrefix=!!this._prefixChildren.find(A=>!A._isText),this._hasTextPrefix=!!this._prefixChildren.find(A=>A._isText),this._hasIconSuffix=!!this._suffixChildren.find(A=>!A._isText),this._hasTextSuffix=!!this._suffixChildren.find(A=>A._isText)}_initializePrefixAndSuffix(){this._checkPrefixAndSuffixTypes(),Ti(this._prefixChildren.changes,this._suffixChildren.changes).subscribe(()=>{this._checkPrefixAndSuffixTypes(),this._changeDetectorRef.markForCheck()})}_initializeSubscript(){this._hintChildren.changes.subscribe(()=>{this._processHints(),this._changeDetectorRef.markForCheck()}),this._errorChildren.changes.subscribe(()=>{this._syncDescribedByIds(),this._changeDetectorRef.markForCheck()}),this._validateHints(),this._syncDescribedByIds()}_assertFormFieldControl(){this._control}_updateFocusState(){let A=this._control.focused;A&&!this._isFocused?(this._isFocused=!0,this._lineRipple?.activate()):!A&&(this._isFocused||this._isFocused===null)&&(this._isFocused=!1,this._lineRipple?.deactivate()),this._elementRef.nativeElement.classList.toggle("mat-focused",A),this._textField?.nativeElement.classList.toggle("mdc-text-field--focused",A)}_syncOutlineLabelOffset(){IR({earlyRead:()=>{if(this._appearanceSignal()!=="outline")return this._outlineLabelOffsetResizeObserver?.disconnect(),null;if(globalThis.ResizeObserver){this._outlineLabelOffsetResizeObserver||=new globalThis.ResizeObserver(()=>{this._writeOutlinedLabelStyles(this._getOutlinedLabelOffset())});for(let A of this._prefixSuffixContainers())this._outlineLabelOffsetResizeObserver.observe(A,{box:"border-box"})}return this._getOutlinedLabelOffset()},write:A=>this._writeOutlinedLabelStyles(A())})}_shouldAlwaysFloat(){return this.floatLabel==="always"}_hasOutline(){return this.appearance==="outline"}_forceDisplayInfixLabel(){return!this._platform.isBrowser&&this._prefixChildren.length&&!this._shouldLabelFloat()}_hasFloatingLabel=me(()=>!!this._labelChild());_shouldLabelFloat(){return this._hasFloatingLabel()?this._control.shouldLabelFloat||this._shouldAlwaysFloat():!1}_shouldForward(A){let t=this._control?this._control.ngControl:null;return t&&t[A]}_getSubscriptMessageType(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"}_handleLabelResized(){this._refreshOutlineNotchWidth()}_refreshOutlineNotchWidth(){!this._hasOutline()||!this._floatingLabel||!this._shouldLabelFloat()?this._notchedOutline?._setNotchWidth(0):this._notchedOutline?._setNotchWidth(this._floatingLabel.getWidth())}_processHints(){this._validateHints(),this._syncDescribedByIds()}_validateHints(){this._hintChildren}_syncDescribedByIds(){if(this._control){let A=[];if(this._control.userAriaDescribedBy&&typeof this._control.userAriaDescribedBy=="string"&&A.push(...this._control.userAriaDescribedBy.split(" ")),this._getSubscriptMessageType()==="hint"){let o=this._hintChildren?this._hintChildren.find(r=>r.align==="start"):null,a=this._hintChildren?this._hintChildren.find(r=>r.align==="end"):null;o?A.push(o.id):this._hintLabel&&A.push(this._hintLabelId),a&&A.push(a.id)}else this._errorChildren&&A.push(...this._errorChildren.map(o=>o.id));let t=this._control.describedByIds,n;if(t){let o=this._describedByIds||A;n=A.concat(t.filter(a=>a&&!o.includes(a)))}else n=A;this._control.setDescribedByIds(n),this._describedByIds=A}}_getOutlinedLabelOffset(){if(!this._hasOutline()||!this._floatingLabel)return null;if(!this._iconPrefixContainer&&!this._textPrefixContainer)return["",null];if(!this._isAttachedToDom())return null;let A=this._iconPrefixContainer?.nativeElement,t=this._textPrefixContainer?.nativeElement,n=this._iconSuffixContainer?.nativeElement,o=this._textSuffixContainer?.nativeElement,a=A?.getBoundingClientRect().width??0,r=t?.getBoundingClientRect().width??0,s=n?.getBoundingClientRect().width??0,l=o?.getBoundingClientRect().width??0,g=this._currentDirection==="rtl"?"-1":"1",C=`${a+r}px`,B=`calc(${g} * (${C} + var(--mat-mdc-form-field-label-offset-x, 0px)))`,Q=`var(--mat-mdc-form-field-label-transform, ${iAA} translateX(${B}))`,h=a+r+s+l;return[Q,h]}_writeOutlinedLabelStyles(A){if(A!==null){let[t,n]=A;this._floatingLabel&&(this._floatingLabel.element.style.transform=t),n!==null&&this._notchedOutline?._setMaxWidth(n)}}_isAttachedToDom(){let A=this._elementRef.nativeElement;if(A.getRootNode){let t=A.getRootNode();return t&&t!==A}return document.documentElement.contains(A)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-form-field"]],contentQueries:function(t,n,o){if(t&1&&(y3(o,n._labelChild,us,5),Vo(o,Ph,5)(o,kF,5)(o,_F,5)(o,SF,5)(o,w1,5)),t&2){Er();let a;oe(a=ae())&&(n._formFieldControl=a.first),oe(a=ae())&&(n._prefixChildren=a),oe(a=ae())&&(n._suffixChildren=a),oe(a=ae())&&(n._errorChildren=a),oe(a=ae())&&(n._hintChildren=a)}},viewQuery:function(t,n){if(t&1&&(Xr(n._iconPrefixContainerSignal,uF,5)(n._textPrefixContainerSignal,pF,5)(n._iconSuffixContainerSignal,fF,5)(n._textSuffixContainerSignal,mF,5),Yt(N$,5)(uF,5)(pF,5)(fF,5)(mF,5)(wF,5)(vF,5)(yF,5)),t&2){Er(4);let o;oe(o=ae())&&(n._textField=o.first),oe(o=ae())&&(n._iconPrefixContainer=o.first),oe(o=ae())&&(n._textPrefixContainer=o.first),oe(o=ae())&&(n._iconSuffixContainer=o.first),oe(o=ae())&&(n._textSuffixContainer=o.first),oe(o=ae())&&(n._floatingLabel=o.first),oe(o=ae())&&(n._notchedOutline=o.first),oe(o=ae())&&(n._lineRipple=o.first)}},hostAttrs:[1,"mat-mdc-form-field"],hostVars:38,hostBindings:function(t,n){t&2&&xA("mat-mdc-form-field-label-always-float",n._shouldAlwaysFloat())("mat-mdc-form-field-has-icon-prefix",n._hasIconPrefix)("mat-mdc-form-field-has-icon-suffix",n._hasIconSuffix)("mat-form-field-invalid",n._control.errorState)("mat-form-field-disabled",n._control.disabled)("mat-form-field-autofilled",n._control.autofilled)("mat-form-field-appearance-fill",n.appearance=="fill")("mat-form-field-appearance-outline",n.appearance=="outline")("mat-form-field-hide-placeholder",n._hasFloatingLabel()&&!n._shouldLabelFloat())("mat-primary",n.color!=="accent"&&n.color!=="warn")("mat-accent",n.color==="accent")("mat-warn",n.color==="warn")("ng-untouched",n._shouldForward("untouched"))("ng-touched",n._shouldForward("touched"))("ng-pristine",n._shouldForward("pristine"))("ng-dirty",n._shouldForward("dirty"))("ng-valid",n._shouldForward("valid"))("ng-invalid",n._shouldForward("invalid"))("ng-pending",n._shouldForward("pending"))},inputs:{hideRequiredMarker:"hideRequiredMarker",color:"color",floatLabel:"floatLabel",appearance:"appearance",subscriptSizing:"subscriptSizing",hintLabel:"hintLabel"},exportAs:["matFormField"],features:[Et([{provide:jh,useExisting:i},{provide:xF,useExisting:i}])],ngContentSelectors:L$,decls:18,vars:21,consts:[["labelTemplate",""],["textField",""],["iconPrefixContainer",""],["textPrefixContainer",""],["textSuffixContainer",""],["iconSuffixContainer",""],[1,"mat-mdc-text-field-wrapper","mdc-text-field",3,"click"],[1,"mat-mdc-form-field-focus-overlay"],[1,"mat-mdc-form-field-flex"],["matFormFieldNotchedOutline","",3,"matFormFieldNotchedOutlineOpen"],[1,"mat-mdc-form-field-icon-prefix"],[1,"mat-mdc-form-field-text-prefix"],[1,"mat-mdc-form-field-infix"],[3,"ngTemplateOutlet"],[1,"mat-mdc-form-field-text-suffix"],[1,"mat-mdc-form-field-icon-suffix"],["matFormFieldLineRipple",""],["aria-atomic","true","aria-live","polite",1,"mat-mdc-form-field-subscript-wrapper","mat-mdc-form-field-bottom-align"],[1,"mat-mdc-form-field-error-wrapper"],[1,"mat-mdc-form-field-hint-wrapper"],["matFormFieldFloatingLabel","",3,"floating","monitorResize","id"],["aria-hidden","true",1,"mat-mdc-form-field-required-marker","mdc-floating-label--required"],[3,"id"],[1,"mat-mdc-form-field-hint-spacer"]],template:function(t,n){if(t&1&&(Nt(F$),yt(0,U$,1,1,"ng-template",null,0,MC),d(2,"div",6,1),T("click",function(a){return n._control.onContainerClick(a)}),Y(4,T$,1,0,"div",7),d(5,"div",8),Y(6,O$,2,2,"div",9),Y(7,H$,3,0,"div",10),Y(8,z$,3,0,"div",11),d(9,"div",12),Y(10,j$,1,1,null,13),Ve(11),E(),Y(12,q$,3,0,"div",14),Y(13,V$,3,0,"div",15),E(),Y(14,W$,1,0,"div",16),E(),d(15,"div",17),Y(16,Z$,2,0,"div",18)(17,$$,5,1,"div",19),E()),t&2){let o;u(2),xA("mdc-text-field--filled",!n._hasOutline())("mdc-text-field--outlined",n._hasOutline())("mdc-text-field--no-label",!n._hasFloatingLabel())("mdc-text-field--disabled",n._control.disabled)("mdc-text-field--invalid",n._control.errorState),u(2),O(!n._hasOutline()&&!n._control.disabled?4:-1),u(2),O(n._hasOutline()?6:-1),u(),O(n._hasIconPrefix?7:-1),u(),O(n._hasTextPrefix?8:-1),u(2),O(!n._hasOutline()||n._forceDisplayInfixLabel()?10:-1),u(2),O(n._hasTextSuffix?12:-1),u(),O(n._hasIconSuffix?13:-1),u(),O(n._hasOutline()?-1:14),u(),xA("mat-mdc-form-field-subscript-dynamic-size",n.subscriptSizing==="dynamic");let a=n._getSubscriptMessageType();u(),O((o=a)==="error"?16:o==="hint"?17:-1)}},dependencies:[wF,vF,vc,yF,w1],styles:[`.mdc-text-field{display:inline-flex;align-items:baseline;padding:0 16px;position:relative;box-sizing:border-box;overflow:hidden;will-change:opacity,transform,color;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.mdc-text-field__input{width:100%;min-width:0;border:none;border-radius:0;background:none;padding:0;-moz-appearance:none;-webkit-appearance:none;height:28px}.mdc-text-field__input::-webkit-calendar-picker-indicator,.mdc-text-field__input::-webkit-search-cancel-button{display:none}.mdc-text-field__input::-ms-clear{display:none}.mdc-text-field__input:focus{outline:none}.mdc-text-field__input:invalid{box-shadow:none}.mdc-text-field__input::placeholder{opacity:0}.mdc-text-field__input::-moz-placeholder{opacity:0}.mdc-text-field__input::-webkit-input-placeholder{opacity:0}.mdc-text-field__input:-ms-input-placeholder{opacity:0}.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mdc-text-field--focused .mdc-text-field__input::placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{opacity:1}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-moz-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-webkit-input-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive:-ms-input-placeholder{opacity:0}.mdc-text-field--outlined .mdc-text-field__input,.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input{height:100%}.mdc-text-field--outlined .mdc-text-field__input{display:flex;border:none !important;background-color:rgba(0,0,0,0)}.mdc-text-field--disabled .mdc-text-field__input{pointer-events:auto}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mat-form-field-filled-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mat-form-field-filled-caret-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mat-form-field-outlined-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mat-form-field-outlined-caret-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mat-form-field-filled-error-caret-color, var(--mat-sys-error))}.mdc-text-field--outlined.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mat-form-field-outlined-error-caret-color, var(--mat-sys-error))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-text-field__input{color:var(--mat-form-field-filled-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-text-field__input{color:var(--mat-form-field-outlined-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-text-field--disabled .mdc-text-field__input{background-color:Window}}.mdc-text-field--filled{height:56px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:var(--mat-form-field-filled-container-shape, var(--mat-sys-corner-extra-small));border-top-right-radius:var(--mat-form-field-filled-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--mat-form-field-filled-container-color, var(--mat-sys-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled{background-color:var(--mat-form-field-filled-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 4%, transparent))}.mdc-text-field--outlined{height:56px;overflow:visible;padding-right:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)));padding-left:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)) + 4px)}[dir=rtl] .mdc-text-field--outlined{padding-right:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)) + 4px);padding-left:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)))}.mdc-floating-label{position:absolute;left:0;transform-origin:left top;line-height:1.15rem;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text;overflow:hidden;will-change:transform}[dir=rtl] .mdc-floating-label{right:0;left:auto;transform-origin:right top;text-align:right}.mdc-text-field .mdc-floating-label{top:50%;transform:translateY(-50%);pointer-events:none}.mdc-notched-outline .mdc-floating-label{display:inline-block;position:relative;max-width:100%}.mdc-text-field--outlined .mdc-floating-label{left:4px;right:auto}[dir=rtl] .mdc-text-field--outlined .mdc-floating-label{left:auto;right:4px}.mdc-text-field--filled .mdc-floating-label{left:16px;right:auto}[dir=rtl] .mdc-text-field--filled .mdc-floating-label{left:auto;right:16px}.mdc-text-field--disabled .mdc-floating-label{cursor:default}@media(forced-colors: active){.mdc-text-field--disabled .mdc-floating-label{z-index:1}}.mdc-text-field--filled.mdc-text-field--no-label .mdc-floating-label{display:none}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mat-form-field-filled-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-filled-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mat-form-field-filled-hover-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-floating-label{color:var(--mat-form-field-filled-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mat-form-field-filled-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-filled-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mat-form-field-filled-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--filled .mdc-floating-label{font-family:var(--mat-form-field-filled-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-form-field-filled-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-form-field-filled-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-form-field-filled-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mat-form-field-outlined-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-outlined-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mat-form-field-outlined-hover-label-text-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-floating-label{color:var(--mat-form-field-outlined-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mat-form-field-outlined-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-outlined-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mat-form-field-outlined-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined .mdc-floating-label{font-family:var(--mat-form-field-outlined-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-form-field-outlined-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-form-field-outlined-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-form-field-outlined-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-floating-label--float-above{cursor:auto;transform:translateY(-106%) scale(0.75)}.mdc-text-field--filled .mdc-floating-label--float-above{transform:translateY(-106%) scale(0.75)}.mdc-text-field--outlined .mdc-floating-label--float-above{transform:translateY(-37.25px) scale(1);font-size:.75rem}.mdc-notched-outline .mdc-floating-label--float-above{text-overflow:clip}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:133.3333333333%}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{transform:translateY(-34.75px) scale(0.75)}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:1px;margin-right:0;content:"*"}[dir=rtl] .mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:0;margin-right:1px}.mdc-notched-outline{display:flex;position:absolute;top:0;right:0;left:0;box-sizing:border-box;width:100%;max-width:100%;height:100%;text-align:left;pointer-events:none}[dir=rtl] .mdc-notched-outline{text-align:right}.mdc-text-field--outlined .mdc-notched-outline{z-index:1}.mat-mdc-notch-piece{box-sizing:border-box;height:100%;pointer-events:none;border:none;border-top:1px solid;border-bottom:1px solid}.mdc-text-field--focused .mat-mdc-notch-piece{border-width:2px}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-outline-color, var(--mat-sys-outline));border-width:var(--mat-form-field-outlined-outline-width, 1px)}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-hover-outline-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-focus-outline-color, var(--mat-sys-primary))}.mdc-text-field--outlined.mdc-text-field--disabled .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-notched-outline .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-hover-outline-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-focus-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline .mat-mdc-notch-piece{border-width:var(--mat-form-field-outlined-focus-outline-width, 2px)}.mdc-notched-outline__leading{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading{width:max(12px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)))}[dir=rtl] .mdc-notched-outline__leading{border-left:none;border-right:1px solid;border-bottom-left-radius:0;border-top-left-radius:0;border-top-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__trailing{flex-grow:1;border-left:none;border-right:1px solid;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}[dir=rtl] .mdc-notched-outline__trailing{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__notch{flex:0 0 auto;width:auto}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__notch{max-width:min(var(--mat-form-field-notch-max-width, 100%),calc(100% - max(12px, var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))) * 2))}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{max-width:min(100%,calc(100% - max(12px, var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))) * 2))}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:1px}.mdc-text-field--focused.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:2px}.mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:0;padding-right:8px;border-top:none}[dir=rtl] .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:8px;padding-right:0}.mdc-notched-outline--no-label .mdc-notched-outline__notch{display:none}.mdc-line-ripple::before,.mdc-line-ripple::after{position:absolute;bottom:0;left:0;width:100%;border-bottom-style:solid;content:""}.mdc-line-ripple::before{z-index:1;border-bottom-width:var(--mat-form-field-filled-active-indicator-height, 1px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-active-indicator-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-hover-active-indicator-color, var(--mat-sys-on-surface))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-disabled-active-indicator-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-error-active-indicator-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-error-hover-active-indicator-color, var(--mat-sys-on-error-container))}.mdc-line-ripple::after{transform:scaleX(0);opacity:0;z-index:2}.mdc-text-field--filled .mdc-line-ripple::after{border-bottom-width:var(--mat-form-field-filled-focus-active-indicator-height, 2px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mat-form-field-filled-focus-active-indicator-color, var(--mat-sys-primary))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mat-form-field-filled-error-focus-active-indicator-color, var(--mat-sys-error))}.mdc-line-ripple--active::after{transform:scaleX(1);opacity:1}.mdc-line-ripple--deactivating::after{opacity:0}.mdc-text-field--disabled{pointer-events:none}.mat-mdc-form-field-textarea-control{vertical-align:middle;resize:vertical;box-sizing:border-box;height:auto;margin:0;padding:0;border:none;overflow:auto}.mat-mdc-form-field-input-control.mat-mdc-form-field-input-control{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font:inherit;letter-spacing:inherit;text-decoration:inherit;text-transform:inherit;border:none}.mat-mdc-form-field .mat-mdc-floating-label.mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;line-height:normal;pointer-events:all;will-change:auto}.mat-mdc-form-field:not(.mat-form-field-disabled) .mat-mdc-floating-label.mdc-floating-label{cursor:inherit}.mdc-text-field--no-label:not(.mdc-text-field--textarea) .mat-mdc-form-field-input-control.mdc-text-field__input,.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control{height:auto}.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control.mdc-text-field__input[type=color]{height:23px}.mat-mdc-text-field-wrapper{height:auto;flex:auto;will-change:auto}.mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-left:0;--mat-mdc-form-field-label-offset-x: -16px}.mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:0}[dir=rtl] .mat-mdc-text-field-wrapper{padding-left:16px;padding-right:16px}[dir=rtl] .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-left:0}[dir=rtl] .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-right:0}.mat-form-field-disabled .mdc-text-field__input::placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-label-always-float .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}.mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .mat-mdc-floating-label{left:auto;right:auto}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-text-field__input{display:inline-block}.mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field .mdc-notched-outline__notch{padding-top:0}.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:1px solid rgba(0,0,0,0)}[dir=rtl] .mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:none;border-right:1px solid rgba(0,0,0,0)}.mat-mdc-form-field-infix{min-height:var(--mat-form-field-container-height, 56px);padding-top:var(--mat-form-field-filled-with-label-container-padding-top, 24px);padding-bottom:var(--mat-form-field-filled-with-label-container-padding-bottom, 8px)}.mdc-text-field--outlined .mat-mdc-form-field-infix,.mdc-text-field--no-label .mat-mdc-form-field-infix{padding-top:var(--mat-form-field-container-vertical-padding, 16px);padding-bottom:var(--mat-form-field-container-vertical-padding, 16px)}.mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:calc(var(--mat-form-field-container-height, 56px)/2)}.mdc-text-field--filled .mat-mdc-floating-label{display:var(--mat-form-field-filled-label-display, block)}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY(calc(calc(6.75px + var(--mat-form-field-container-height, 56px) / 2) * -1)) scale(var(--mat-mdc-form-field-floating-label-scale, 0.75));transform:var(--mat-mdc-form-field-label-transform)}@keyframes _mat-form-field-subscript-animation{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.mat-mdc-form-field-subscript-wrapper{box-sizing:border-box;width:100%;position:relative}.mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-error-wrapper{position:absolute;top:0;left:0;right:0;padding:0 16px;opacity:1;transform:translateY(0);animation:_mat-form-field-subscript-animation 0ms cubic-bezier(0.55, 0, 0.55, 0.2)}.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-error-wrapper{position:static}.mat-mdc-form-field-bottom-align::before{content:"";display:inline-block;height:16px}.mat-mdc-form-field-bottom-align.mat-mdc-form-field-subscript-dynamic-size::before{content:unset}.mat-mdc-form-field-hint-end{order:1}.mat-mdc-form-field-hint-wrapper{display:flex}.mat-mdc-form-field-hint-spacer{flex:1 0 1em}.mat-mdc-form-field-error{display:block;color:var(--mat-form-field-error-text-color, var(--mat-sys-error))}.mat-mdc-form-field-subscript-wrapper,.mat-mdc-form-field-bottom-align::before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-subscript-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-form-field-subscript-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-form-field-subscript-text-size, var(--mat-sys-body-small-size));letter-spacing:var(--mat-form-field-subscript-text-tracking, var(--mat-sys-body-small-tracking));font-weight:var(--mat-form-field-subscript-text-weight, var(--mat-sys-body-small-weight))}.mat-mdc-form-field-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;opacity:0;pointer-events:none;background-color:var(--mat-form-field-state-layer-color, var(--mat-sys-on-surface))}.mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-focus-state-layer-opacity, 0)}select.mat-mdc-form-field-input-control{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(0,0,0,0);display:inline-flex;box-sizing:border-box}select.mat-mdc-form-field-input-control:not(:disabled){cursor:pointer}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option{color:var(--mat-form-field-select-option-text-color, var(--mat-sys-neutral10))}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option:disabled{color:var(--mat-form-field-select-disabled-option-text-color, color-mix(in srgb, var(--mat-sys-neutral10) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{content:"";width:0;height:0;border-left:5px solid rgba(0,0,0,0);border-right:5px solid rgba(0,0,0,0);border-top:5px solid;position:absolute;right:0;top:50%;margin-top:-2.5px;pointer-events:none;color:var(--mat-form-field-enabled-select-arrow-color, var(--mat-sys-on-surface-variant))}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{right:auto;left:0}.mat-mdc-form-field-type-mat-native-select.mat-focused .mat-mdc-form-field-infix::after{color:var(--mat-form-field-focus-select-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field-type-mat-native-select.mat-form-field-disabled .mat-mdc-form-field-infix::after{color:var(--mat-form-field-disabled-select-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:15px}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:0;padding-left:15px}@media(forced-colors: active){.mat-form-field-appearance-fill .mat-mdc-text-field-wrapper{outline:solid 1px}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-form-field-disabled .mat-mdc-text-field-wrapper{outline-color:GrayText}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-focused .mat-mdc-text-field-wrapper{outline:dashed 3px}}@media(forced-colors: active){.mat-mdc-form-field.mat-focused .mdc-notched-outline{border:dashed 3px}}.mat-mdc-form-field-input-control[type=date],.mat-mdc-form-field-input-control[type=datetime],.mat-mdc-form-field-input-control[type=datetime-local],.mat-mdc-form-field-input-control[type=month],.mat-mdc-form-field-input-control[type=week],.mat-mdc-form-field-input-control[type=time]{line-height:1}.mat-mdc-form-field-input-control::-webkit-datetime-edit{line-height:1;padding:0;margin-bottom:-2px}.mat-mdc-form-field{--mat-mdc-form-field-floating-label-scale: 0.75;display:inline-flex;flex-direction:column;min-width:0;text-align:left;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-container-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-form-field-container-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-form-field-container-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-form-field-container-text-tracking, var(--mat-sys-body-large-tracking));font-weight:var(--mat-form-field-container-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-floating-label--float-above{font-size:calc(var(--mat-form-field-outlined-label-text-populated-size)*var(--mat-mdc-form-field-floating-label-scale))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:var(--mat-form-field-outlined-label-text-populated-size)}[dir=rtl] .mat-mdc-form-field{text-align:right}.mat-mdc-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-mdc-text-field-wrapper{width:100%;z-index:0}.mat-mdc-form-field-icon-prefix,.mat-mdc-form-field-icon-suffix{align-self:center;line-height:0;pointer-events:auto;position:relative;z-index:1}.mat-mdc-form-field-icon-prefix>.mat-icon,.mat-mdc-form-field-icon-suffix>.mat-icon{padding:0 12px;box-sizing:content-box}.mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-leading-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-disabled-leading-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-disabled-trailing-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-invalid .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-trailing-icon-color, var(--mat-sys-error))}.mat-form-field-invalid:not(.mat-focused):not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-hover-trailing-icon-color, var(--mat-sys-on-error-container))}.mat-form-field-invalid.mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-focus-trailing-icon-color, var(--mat-sys-error))}.mat-mdc-form-field-icon-prefix,[dir=rtl] .mat-mdc-form-field-icon-suffix{padding:0 4px 0 0}.mat-mdc-form-field-icon-suffix,[dir=rtl] .mat-mdc-form-field-icon-prefix{padding:0 0 0 4px}.mat-mdc-form-field-subscript-wrapper .mat-icon,.mat-mdc-form-field label .mat-icon{width:1em;height:1em;font-size:inherit}.mat-mdc-form-field-infix{flex:auto;min-width:0;width:180px;position:relative;box-sizing:border-box}.mat-mdc-form-field-infix:has(textarea[cols]){width:auto}.mat-mdc-form-field .mdc-notched-outline__notch{margin-left:-1px;-webkit-clip-path:inset(-9em -999em -9em 1px);clip-path:inset(-9em -999em -9em 1px)}[dir=rtl] .mat-mdc-form-field .mdc-notched-outline__notch{margin-left:0;margin-right:-1px;-webkit-clip-path:inset(-9em 1px -9em -999em);clip-path:inset(-9em 1px -9em -999em)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-floating-label{transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1),color 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input{transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::-moz-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::-webkit-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input:-ms-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field--filled:not(.mdc-ripple-upgraded):focus .mdc-text-field__ripple::before{transition-duration:75ms}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-line-ripple::after{transition:transform 180ms cubic-bezier(0.4, 0, 0.2, 1),opacity 180ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field.mat-form-field-animations-enabled .mat-mdc-form-field-error-wrapper{animation-duration:300ms}.mdc-notched-outline .mdc-floating-label{max-width:calc(100% + 1px)}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:calc(133.3333333333% + 1px)} +`],encapsulation:2,changeDetection:0})}return i})();var Ta=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[V3,To,Qi]})}return i})();var RF=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["ng-component"]],hostAttrs:["cdk-text-field-style-loader",""],decls:0,vars:0,template:function(t,n){},styles:[`textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0 !important;box-sizing:content-box !important;height:auto !important;overflow:hidden !important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0 !important;box-sizing:content-box !important;height:0 !important}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms} +`],encapsulation:2,changeDetection:0})}return i})(),nAA={passive:!0},NF=(()=>{class i{_platform=w(Ci);_ngZone=w(qe);_renderer=w(Rr).createRenderer(null,null);_styleLoader=w(io);_monitoredElements=new Map;constructor(){}monitor(A){if(!this._platform.isBrowser)return nr;this._styleLoader.load(RF);let t=hs(A),n=this._monitoredElements.get(t);if(n)return n.subject;let o=new te,a="cdk-text-field-autofilled",r=l=>{l.animationName==="cdk-text-field-autofill-start"&&!t.classList.contains(a)?(t.classList.add(a),this._ngZone.run(()=>o.next({target:l.target,isAutofilled:!0}))):l.animationName==="cdk-text-field-autofill-end"&&t.classList.contains(a)&&(t.classList.remove(a),this._ngZone.run(()=>o.next({target:l.target,isAutofilled:!1})))},s=this._ngZone.runOutsideAngular(()=>(t.classList.add("cdk-text-field-autofill-monitored"),this._renderer.listen(t,"animationstart",r,nAA)));return this._monitoredElements.set(t,{subject:o,unlisten:s}),o}stopMonitoring(A){let t=hs(A),n=this._monitoredElements.get(t);n&&(n.unlisten(),n.subject.complete(),t.classList.remove("cdk-text-field-autofill-monitored"),t.classList.remove("cdk-text-field-autofilled"),this._monitoredElements.delete(t))}ngOnDestroy(){this._monitoredElements.forEach((A,t)=>this.stopMonitoring(t))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var rp=(()=>{class i{_elementRef=w(se);_platform=w(Ci);_ngZone=w(qe);_renderer=w(qi);_resizeEvents=new te;_previousValue;_initialHeight;_destroyed=new te;_listenerCleanups;_minRows;_maxRows;_enabled=!0;_previousMinRows=-1;_textareaElement;get minRows(){return this._minRows}set minRows(A){this._minRows=Ls(A),this._setMinHeight()}get maxRows(){return this._maxRows}set maxRows(A){this._maxRows=Ls(A),this._setMaxHeight()}get enabled(){return this._enabled}set enabled(A){this._enabled!==A&&((this._enabled=A)?this.resizeToFitContent(!0):this.reset())}get placeholder(){return this._textareaElement.placeholder}set placeholder(A){this._cachedPlaceholderHeight=void 0,A?this._textareaElement.setAttribute("placeholder",A):this._textareaElement.removeAttribute("placeholder"),this._cacheTextareaPlaceholderHeight()}_cachedLineHeight;_cachedPlaceholderHeight;_document=w(ii);_hasFocus=!1;_isViewInited=!1;constructor(){w(io).load(RF),this._textareaElement=this._elementRef.nativeElement}_setMinHeight(){let A=this.minRows&&this._cachedLineHeight?`${this.minRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.minHeight=A)}_setMaxHeight(){let A=this.maxRows&&this._cachedLineHeight?`${this.maxRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.maxHeight=A)}ngAfterViewInit(){this._platform.isBrowser&&(this._initialHeight=this._textareaElement.style.height,this.resizeToFitContent(),this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[this._renderer.listen("window","resize",()=>this._resizeEvents.next()),this._renderer.listen(this._textareaElement,"focus",this._handleFocusEvent),this._renderer.listen(this._textareaElement,"blur",this._handleFocusEvent)],this._resizeEvents.pipe(a1(16)).subscribe(()=>{this._cachedLineHeight=this._cachedPlaceholderHeight=void 0,this.resizeToFitContent(!0)})}),this._isViewInited=!0,this.resizeToFitContent(!0))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A()),this._resizeEvents.complete(),this._destroyed.next(),this._destroyed.complete()}_cacheTextareaLineHeight(){if(this._cachedLineHeight)return;let A=this._textareaElement.cloneNode(!1),t=A.style;A.rows=1,t.position="absolute",t.visibility="hidden",t.border="none",t.padding="0",t.height="",t.minHeight="",t.maxHeight="",t.top=t.bottom=t.left=t.right="auto",t.overflow="hidden",this._textareaElement.parentNode.appendChild(A),this._cachedLineHeight=A.clientHeight,A.remove(),this._setMinHeight(),this._setMaxHeight()}_measureScrollHeight(){let A=this._textareaElement,t=A.style.marginBottom||"",n=this._platform.FIREFOX,o=this._hasFocus,a=n?"cdk-textarea-autosize-measuring-firefox":"cdk-textarea-autosize-measuring";o&&(A.style.marginBottom=`${A.clientHeight}px`),A.classList.add(a);let r=A.scrollHeight-4;return A.classList.remove(a),o&&(A.style.marginBottom=t),r}_cacheTextareaPlaceholderHeight(){if(!this._isViewInited||this._cachedPlaceholderHeight!=null)return;if(!this.placeholder){this._cachedPlaceholderHeight=0;return}let A=this._textareaElement.value;this._textareaElement.value=this._textareaElement.placeholder,this._cachedPlaceholderHeight=this._measureScrollHeight(),this._textareaElement.value=A}_handleFocusEvent=A=>{this._hasFocus=A.type==="focus"};ngDoCheck(){this._platform.isBrowser&&this.resizeToFitContent()}resizeToFitContent(A=!1){if(!this._enabled||(this._cacheTextareaLineHeight(),this._cacheTextareaPlaceholderHeight(),!this._cachedLineHeight))return;let t=this._elementRef.nativeElement,n=t.value;if(!A&&this._minRows===this._previousMinRows&&n===this._previousValue)return;let o=this._measureScrollHeight(),a=Math.max(o,this._cachedPlaceholderHeight||0);t.style.height=`${a}px`,this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame<"u"?requestAnimationFrame(()=>this._scrollToCaretPosition(t)):setTimeout(()=>this._scrollToCaretPosition(t))}),this._previousValue=n,this._previousMinRows=this._minRows}reset(){this._initialHeight!==void 0&&(this._textareaElement.style.height=this._initialHeight)}_noopInputHandler(){}_scrollToCaretPosition(A){let{selectionStart:t,selectionEnd:n}=A;!this._destroyed.isStopped&&this._hasFocus&&A.setSelectionRange(t,n)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["textarea","cdkTextareaAutosize",""]],hostAttrs:["rows","1",1,"cdk-textarea-autosize"],hostBindings:function(t,n){t&1&&T("input",function(){return n._noopInputHandler()})},inputs:{minRows:[0,"cdkAutosizeMinRows","minRows"],maxRows:[0,"cdkAutosizeMaxRows","maxRows"],enabled:[2,"cdkTextareaAutosize","enabled",Ee],placeholder:"placeholder"},exportAs:["cdkTextareaAutosize"]})}return i})(),pd=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({})}return i})();var LF=new MA("MAT_INPUT_VALUE_ACCESSOR");var fd=(()=>{class i{isErrorState(A,t){return!!(A&&A.invalid&&(A.touched||t&&t.submitted))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var md=class{_defaultMatcher;ngControl;_parentFormGroup;_parentForm;_stateChanges;errorState=!1;matcher;constructor(e,A,t,n,o){this._defaultMatcher=e,this.ngControl=A,this._parentFormGroup=t,this._parentForm=n,this._stateChanges=o}updateErrorState(){let e=this.errorState,A=this._parentFormGroup||this._parentForm,t=this.matcher||this._defaultMatcher,n=this.ngControl?this.ngControl.control:null,o=t?.isErrorState(n,A)??!1;o!==e&&(this.errorState=o,this._stateChanges.next())}};var oAA=["button","checkbox","file","hidden","image","radio","range","reset","submit"],aAA=new MA("MAT_INPUT_CONFIG"),Qa=(()=>{class i{_elementRef=w(se);_platform=w(Ci);ngControl=w(Fs,{optional:!0,self:!0});_autofillMonitor=w(NF);_ngZone=w(qe);_formField=w(jh,{optional:!0});_renderer=w(qi);_uid=w(Bn).getId("mat-input-");_previousNativeValue;_inputValueAccessor;_signalBasedValueAccessor;_previousPlaceholder=null;_errorStateTracker;_config=w(aAA,{optional:!0});_cleanupIosKeyup;_cleanupWebkitWheel;_isServer=!1;_isNativeSelect=!1;_isTextarea=!1;_isInFormField=!1;focused=!1;stateChanges=new te;controlType="mat-input";autofilled=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=ur(A),this.focused&&(this.focused=!1,this.stateChanges.next())}_disabled=!1;get id(){return this._id}set id(A){this._id=A||this._uid}_id;placeholder;name;get required(){return this._required??this.ngControl?.control?.hasValidator(Ns.required)??!1}set required(A){this._required=ur(A)}_required;get type(){return this._type}set type(A){this._type=A||"text",this._validateType(),!this._isTextarea&&Qy().has(this._type)&&(this._elementRef.nativeElement.type=this._type)}_type="text";get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}userAriaDescribedBy;get value(){return this._signalBasedValueAccessor?this._signalBasedValueAccessor.value():this._inputValueAccessor.value}set value(A){A!==this.value&&(this._signalBasedValueAccessor?this._signalBasedValueAccessor.value.set(A):this._inputValueAccessor.value=A,this.stateChanges.next())}get readonly(){return this._readonly}set readonly(A){this._readonly=ur(A)}_readonly=!1;disabledInteractive;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}_neverEmptyInputTypes=["date","datetime","datetime-local","month","time","week"].filter(A=>Qy().has(A));constructor(){let A=w(Cd,{optional:!0}),t=w(_C,{optional:!0}),n=w(fd),o=w(LF,{optional:!0,self:!0}),a=this._elementRef.nativeElement,r=a.nodeName.toLowerCase();o?s1(o.value)?this._signalBasedValueAccessor=o:this._inputValueAccessor=o:this._inputValueAccessor=a,this._previousNativeValue=this.value,this.id=this.id,this._platform.IOS&&this._ngZone.runOutsideAngular(()=>{this._cleanupIosKeyup=this._renderer.listen(a,"keyup",this._iOSKeyupListener)}),this._errorStateTracker=new md(n,this.ngControl,t,A,this.stateChanges),this._isServer=!this._platform.isBrowser,this._isNativeSelect=r==="select",this._isTextarea=r==="textarea",this._isInFormField=!!this._formField,this.disabledInteractive=this._config?.disabledInteractive||!1,this._isNativeSelect&&(this.controlType=a.multiple?"mat-native-select-multiple":"mat-native-select"),this._signalBasedValueAccessor&&_n(()=>{this._signalBasedValueAccessor.value(),this.stateChanges.next()})}ngAfterViewInit(){this._platform.isBrowser&&this._autofillMonitor.monitor(this._elementRef.nativeElement).subscribe(A=>{this.autofilled=A.isAutofilled,this.stateChanges.next()})}ngOnChanges(){this.stateChanges.next()}ngOnDestroy(){this.stateChanges.complete(),this._platform.isBrowser&&this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement),this._cleanupIosKeyup?.(),this._cleanupWebkitWheel?.()}ngDoCheck(){this.ngControl&&(this.updateErrorState(),this.ngControl.disabled!==null&&this.ngControl.disabled!==this.disabled&&(this.disabled=this.ngControl.disabled,this.stateChanges.next())),this._dirtyCheckNativeValue(),this._dirtyCheckPlaceholder()}focus(A){this._elementRef.nativeElement.focus(A)}updateErrorState(){this._errorStateTracker.updateErrorState()}_focusChanged(A){if(A!==this.focused){if(!this._isNativeSelect&&A&&this.disabled&&this.disabledInteractive){let t=this._elementRef.nativeElement;t.type==="number"?(t.type="text",t.setSelectionRange(0,0),t.type="number"):t.setSelectionRange(0,0)}this.focused=A,this.stateChanges.next()}}_onInput(){}_dirtyCheckNativeValue(){let A=this._elementRef.nativeElement.value;this._previousNativeValue!==A&&(this._previousNativeValue=A,this.stateChanges.next())}_dirtyCheckPlaceholder(){let A=this._getPlaceholder();if(A!==this._previousPlaceholder){let t=this._elementRef.nativeElement;this._previousPlaceholder=A,A?t.setAttribute("placeholder",A):t.removeAttribute("placeholder")}}_getPlaceholder(){return this.placeholder||null}_validateType(){oAA.indexOf(this._type)>-1}_isNeverEmpty(){return this._neverEmptyInputTypes.indexOf(this._type)>-1}_isBadInput(){let A=this._elementRef.nativeElement.validity;return A&&A.badInput}get empty(){return!this._isNeverEmpty()&&!this._elementRef.nativeElement.value&&!this._isBadInput()&&!this.autofilled}get shouldLabelFloat(){if(this._isNativeSelect){let A=this._elementRef.nativeElement,t=A.options[0];return this.focused||A.multiple||!this.empty||!!(A.selectedIndex>-1&&t&&t.label)}else return this.focused&&!this.disabled||!this.empty}get describedByIds(){return this._elementRef.nativeElement.getAttribute("aria-describedby")?.split(" ")||[]}setDescribedByIds(A){let t=this._elementRef.nativeElement;A.length?t.setAttribute("aria-describedby",A.join(" ")):t.removeAttribute("aria-describedby")}onContainerClick(){this.focused||this.focus()}_isInlineSelect(){let A=this._elementRef.nativeElement;return this._isNativeSelect&&(A.multiple||A.size>1)}_iOSKeyupListener=A=>{let t=A.target;!t.value&&t.selectionStart===0&&t.selectionEnd===0&&(t.setSelectionRange(1,1),t.setSelectionRange(0,0))};_getReadonlyAttribute(){return this._isNativeSelect?null:this.readonly||this.disabled&&this.disabledInteractive?"true":null}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["input","matInput",""],["textarea","matInput",""],["select","matNativeControl",""],["input","matNativeControl",""],["textarea","matNativeControl",""]],hostAttrs:[1,"mat-mdc-input-element"],hostVars:21,hostBindings:function(t,n){t&1&&T("focus",function(){return n._focusChanged(!0)})("blur",function(){return n._focusChanged(!1)})("input",function(){return n._onInput()}),t&2&&(Ea("id",n.id)("disabled",n.disabled&&!n.disabledInteractive)("required",n.required),ee("name",n.name||null)("readonly",n._getReadonlyAttribute())("aria-disabled",n.disabled&&n.disabledInteractive?"true":null)("aria-invalid",n.empty&&n.required?null:n.errorState)("aria-required",n.required)("id",n.id),xA("mat-input-server",n._isServer)("mat-mdc-form-field-textarea-control",n._isInFormField&&n._isTextarea)("mat-mdc-form-field-input-control",n._isInFormField)("mat-mdc-input-disabled-interactive",n.disabledInteractive)("mdc-text-field__input",n._isInFormField)("mat-mdc-native-select-inline",n._isInlineSelect()))},inputs:{disabled:"disabled",id:"id",placeholder:"placeholder",name:"name",required:"required",type:"type",errorStateMatcher:"errorStateMatcher",userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],value:"value",readonly:"readonly",disabledInteractive:[2,"disabledInteractive","disabledInteractive",Ee]},exportAs:["matInput"],features:[Et([{provide:Ph,useExisting:i}]),Zt]})}return i})(),Gs=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Ta,Ta,pd,Qi]})}return i})();var ln=(function(i){return i[i.State=0]="State",i[i.Transition=1]="Transition",i[i.Sequence=2]="Sequence",i[i.Group=3]="Group",i[i.Animate=4]="Animate",i[i.Keyframes=5]="Keyframes",i[i.Style=6]="Style",i[i.Trigger=7]="Trigger",i[i.Reference=8]="Reference",i[i.AnimateChild=9]="AnimateChild",i[i.AnimateRef=10]="AnimateRef",i[i.Query=11]="Query",i[i.Stagger=12]="Stagger",i})(ln||{}),wg="*";function GF(i,e=null){return{type:ln.Sequence,steps:i,options:e}}function My(i){return{type:ln.Style,styles:i,offset:null}}var v0=class{_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_originalOnDoneFns=[];_originalOnStartFns=[];_started=!1;_destroyed=!1;_finished=!1;_position=0;parentPlayer=null;totalTime;constructor(e=0,A=0){this.totalTime=e+A}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}init(){}play(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}triggerMicrotask(){queueMicrotask(()=>this._onFinish())}_onStart(){this._onStartFns.forEach(e=>e()),this._onStartFns=[]}pause(){}restart(){}finish(){this._onFinish()}destroy(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this._started=!1,this._finished=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}setPosition(e){this._position=this.totalTime?e*this.totalTime:1}getPosition(){return this.totalTime?this._position/this.totalTime:1}triggerCallback(e){let A=e=="start"?this._onStartFns:this._onDoneFns;A.forEach(t=>t()),A.length=0}},Dd=class{_onDoneFns=[];_onStartFns=[];_finished=!1;_started=!1;_destroyed=!1;_onDestroyFns=[];parentPlayer=null;totalTime=0;players;constructor(e){this.players=e;let A=0,t=0,n=0,o=this.players.length;o==0?queueMicrotask(()=>this._onFinish()):this.players.forEach(a=>{a.onDone(()=>{++A==o&&this._onFinish()}),a.onDestroy(()=>{++t==o&&this._onDestroy()}),a.onStart(()=>{++n==o&&this._onStart()})}),this.totalTime=this.players.reduce((a,r)=>Math.max(a,r.totalTime),0)}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this.players.forEach(e=>e.init())}onStart(e){this._onStartFns.push(e)}_onStart(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(e=>e()),this._onStartFns=[])}onDone(e){this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}play(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(e=>e.play())}pause(){this.players.forEach(e=>e.pause())}restart(){this.players.forEach(e=>e.restart())}finish(){this._onFinish(),this.players.forEach(e=>e.finish())}destroy(){this._onDestroy()}_onDestroy(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(e=>e.destroy()),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this.players.forEach(e=>e.reset()),this._destroyed=!1,this._finished=!1,this._started=!1}setPosition(e){let A=e*this.totalTime;this.players.forEach(t=>{let n=t.totalTime?Math.min(1,A/t.totalTime):1;t.setPosition(n)})}getPosition(){let e=this.players.reduce((A,t)=>A===null||t.totalTime>A.totalTime?t:A,null);return e!=null?e.getPosition():0}beforeDestroy(){this.players.forEach(e=>{e.beforeDestroy&&e.beforeDestroy()})}triggerCallback(e){let A=e=="start"?this._onStartFns:this._onDoneFns;A.forEach(t=>t()),A.length=0}},qh="!";function KF(i){return new St(3e3,!1)}function rAA(){return new St(3100,!1)}function sAA(){return new St(3101,!1)}function lAA(i){return new St(3001,!1)}function gAA(i){return new St(3003,!1)}function cAA(i){return new St(3004,!1)}function TF(i,e){return new St(3005,!1)}function JF(){return new St(3006,!1)}function YF(){return new St(3007,!1)}function OF(i,e){return new St(3008,!1)}function HF(i){return new St(3002,!1)}function zF(i,e,A,t,n){return new St(3010,!1)}function PF(){return new St(3011,!1)}function jF(){return new St(3012,!1)}function qF(){return new St(3200,!1)}function VF(){return new St(3202,!1)}function WF(){return new St(3013,!1)}function ZF(i){return new St(3014,!1)}function XF(i){return new St(3015,!1)}function $F(i){return new St(3016,!1)}function AL(i,e){return new St(3404,!1)}function CAA(i){return new St(3502,!1)}function eL(i){return new St(3503,!1)}function tL(){return new St(3300,!1)}function iL(i){return new St(3504,!1)}function nL(i){return new St(3301,!1)}function oL(i,e){return new St(3302,!1)}function aL(i){return new St(3303,!1)}function rL(i,e){return new St(3400,!1)}function sL(i){return new St(3401,!1)}function lL(i){return new St(3402,!1)}function gL(i,e){return new St(3505,!1)}function b0(i){switch(i.length){case 0:return new v0;case 1:return i[0];default:return new Dd(i)}}function xy(i,e,A=new Map,t=new Map){let n=[],o=[],a=-1,r=null;if(e.forEach(s=>{let l=s.get("offset"),g=l==a,C=g&&r||new Map;s.forEach((I,B)=>{let Q=B,h=I;if(B!=="offset")switch(Q=i.normalizePropertyName(Q,n),h){case qh:h=A.get(B);break;case wg:h=t.get(B);break;default:h=i.normalizeStyleValue(B,Q,h,n);break}C.set(Q,h)}),g||o.push(C),r=C,a=l}),n.length)throw CAA(n);return o}function sp(i,e,A,t){switch(e){case"start":i.onStart(()=>t(A&&Sy(A,"start",i)));break;case"done":i.onDone(()=>t(A&&Sy(A,"done",i)));break;case"destroy":i.onDestroy(()=>t(A&&Sy(A,"destroy",i)));break}}function Sy(i,e,A){let t=A.totalTime,n=!!A.disabled,o=lp(i.element,i.triggerName,i.fromState,i.toState,e||i.phaseName,t??i.totalTime,n),a=i._data;return a!=null&&(o._data=a),o}function lp(i,e,A,t,n="",o=0,a){return{element:i,triggerName:e,fromState:A,toState:t,phaseName:n,totalTime:o,disabled:!!a}}function Ks(i,e,A){let t=i.get(e);return t||i.set(e,t=A),t}function Ry(i){let e=i.indexOf(":"),A=i.substring(1,e),t=i.slice(e+1);return[A,t]}var IAA=typeof document>"u"?null:document.documentElement;function gp(i){let e=i.parentNode||i.host||null;return e===IAA?null:e}function dAA(i){return i.substring(1,6)=="ebkit"}var y1=null,UF=!1;function cL(i){y1||(y1=BAA()||{},UF=y1.style?"WebkitAppearance"in y1.style:!1);let e=!0;return y1.style&&!dAA(i)&&(e=i in y1.style,!e&&UF&&(e="Webkit"+i.charAt(0).toUpperCase()+i.slice(1)in y1.style)),e}function BAA(){return typeof document<"u"?document.body:null}function Ny(i,e){for(;e;){if(e===i)return!0;e=gp(e)}return!1}function Fy(i,e,A){if(A)return Array.from(i.querySelectorAll(e));let t=i.querySelector(e);return t?[t]:[]}var EAA=1e3,Ly="{{",hAA="}}",Gy="ng-enter",cp="ng-leave",Vh="ng-trigger",Wh=".ng-trigger",Ky="ng-animating",Cp=".ng-animating";function kc(i){if(typeof i=="number")return i;let e=i.match(/^(-?[\.\d]+)(m?s)/);return!e||e.length<2?0:ky(parseFloat(e[1]),e[2])}function ky(i,e){return e==="s"?i*EAA:i}function Zh(i,e,A){return i.hasOwnProperty("duration")?i:uAA(i,e,A)}var QAA=/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i;function uAA(i,e,A){let t,n=0,o="";if(typeof i=="string"){let a=i.match(QAA);if(a===null)return e.push(KF(i)),{duration:0,delay:0,easing:""};t=ky(parseFloat(a[1]),a[2]);let r=a[3];r!=null&&(n=ky(parseFloat(r),a[4]));let s=a[5];s&&(o=s)}else t=i;if(!A){let a=!1,r=e.length;t<0&&(e.push(rAA()),a=!0),n<0&&(e.push(sAA()),a=!0),a&&e.splice(r,0,KF(i))}return{duration:t,delay:n,easing:o}}function CL(i){return i.length?i[0]instanceof Map?i:i.map(e=>new Map(Object.entries(e))):[]}function Dg(i,e,A){e.forEach((t,n)=>{let o=Ip(n);A&&!A.has(n)&&A.set(n,i.style[o]),i.style[o]=t})}function LC(i,e){e.forEach((A,t)=>{let n=Ip(t);i.style[n]=""})}function yd(i){return Array.isArray(i)?i.length==1?i[0]:GF(i):i}function IL(i,e,A){let t=e.params||{},n=Uy(i);n.length&&n.forEach(o=>{t.hasOwnProperty(o)||A.push(lAA(o))})}var _y=new RegExp(`${Ly}\\s*(.+?)\\s*${hAA}`,"g");function Uy(i){let e=[];if(typeof i=="string"){let A;for(;A=_y.exec(i);)e.push(A[1]);_y.lastIndex=0}return e}function vd(i,e,A){let t=`${i}`,n=t.replace(_y,(o,a)=>{let r=e[a];return r==null&&(A.push(gAA(a)),r=""),r.toString()});return n==t?i:n}var pAA=/-+([a-z0-9])/g;function Ip(i){return i.replace(pAA,(...e)=>e[1].toUpperCase())}function dL(i,e){return i===0||e===0}function BL(i,e,A){if(A.size&&e.length){let t=e[0],n=[];if(A.forEach((o,a)=>{t.has(a)||n.push(a),t.set(a,o)}),n.length)for(let o=1;oa.set(r,dp(i,r)))}}return e}function Us(i,e,A){switch(e.type){case ln.Trigger:return i.visitTrigger(e,A);case ln.State:return i.visitState(e,A);case ln.Transition:return i.visitTransition(e,A);case ln.Sequence:return i.visitSequence(e,A);case ln.Group:return i.visitGroup(e,A);case ln.Animate:return i.visitAnimate(e,A);case ln.Keyframes:return i.visitKeyframes(e,A);case ln.Style:return i.visitStyle(e,A);case ln.Reference:return i.visitReference(e,A);case ln.AnimateChild:return i.visitAnimateChild(e,A);case ln.AnimateRef:return i.visitAnimateRef(e,A);case ln.Query:return i.visitQuery(e,A);case ln.Stagger:return i.visitStagger(e,A);default:throw cAA(e.type)}}function dp(i,e){return window.getComputedStyle(i)[e]}var tv=(()=>{class i{validateStyleProperty(A){return cL(A)}containsElement(A,t){return Ny(A,t)}getParentElement(A){return gp(A)}query(A,t,n){return Fy(A,t,n)}computeStyle(A,t,n){return n||""}animate(A,t,n,o,a,r=[],s){return new v0(n,o)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac})}return i})(),b1=class{static NOOP=new tv},M1=class{};var fAA=new Set(["width","height","minWidth","minHeight","maxWidth","maxHeight","left","top","bottom","right","fontSize","outlineWidth","outlineOffset","paddingTop","paddingLeft","paddingBottom","paddingRight","marginTop","marginLeft","marginBottom","marginRight","borderRadius","borderWidth","borderTopWidth","borderLeftWidth","borderRightWidth","borderBottomWidth","textIndent","perspective"]),up=class extends M1{normalizePropertyName(e,A){return Ip(e)}normalizeStyleValue(e,A,t,n){let o="",a=t.toString().trim();if(fAA.has(A)&&t!==0&&t!=="0")if(typeof t=="number")o="px";else{let r=t.match(/^[+-]?[\d\.]+([a-z]*)$/);r&&r[1].length==0&&n.push(TF(e,t))}return a+o}};var pp="*";function mAA(i,e){let A=[];return typeof i=="string"?i.split(/\s*,\s*/).forEach(t=>wAA(t,A,e)):A.push(i),A}function wAA(i,e,A){if(i[0]==":"){let s=DAA(i,A);if(typeof s=="function"){e.push(s);return}i=s}let t=i.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(t==null||t.length<4)return A.push(XF(i)),e;let n=t[1],o=t[2],a=t[3];e.push(EL(n,a));let r=n==pp&&a==pp;o[0]=="<"&&!r&&e.push(EL(a,n))}function DAA(i,e){switch(i){case":enter":return"void => *";case":leave":return"* => void";case":increment":return(A,t)=>parseFloat(t)>parseFloat(A);case":decrement":return(A,t)=>parseFloat(t) *"}}var Bp=new Set(["true","1"]),Ep=new Set(["false","0"]);function EL(i,e){let A=Bp.has(i)||Ep.has(i),t=Bp.has(e)||Ep.has(e);return(n,o)=>{let a=i==pp||i==n,r=e==pp||e==o;return!a&&A&&typeof n=="boolean"&&(a=n?Bp.has(i):Ep.has(i)),!r&&t&&typeof o=="boolean"&&(r=o?Bp.has(e):Ep.has(e)),a&&r}}var vL=":self",yAA=new RegExp(`s*${vL}s*,?`,"g");function bL(i,e,A,t){return new zy(i).build(e,A,t)}var hL="",zy=class{_driver;constructor(e){this._driver=e}build(e,A,t){let n=new Py(A);return this._resetContextStyleTimingState(n),Us(this,yd(e),n)}_resetContextStyleTimingState(e){e.currentQuerySelector=hL,e.collectedStyles=new Map,e.collectedStyles.set(hL,new Map),e.currentTime=0}visitTrigger(e,A){let t=A.queryCount=0,n=A.depCount=0,o=[],a=[];return e.name.charAt(0)=="@"&&A.errors.push(JF()),e.definitions.forEach(r=>{if(this._resetContextStyleTimingState(A),r.type==ln.State){let s=r,l=s.name;l.toString().split(/\s*,\s*/).forEach(g=>{s.name=g,o.push(this.visitState(s,A))}),s.name=l}else if(r.type==ln.Transition){let s=this.visitTransition(r,A);t+=s.queryCount,n+=s.depCount,a.push(s)}else A.errors.push(YF())}),{type:ln.Trigger,name:e.name,states:o,transitions:a,queryCount:t,depCount:n,options:null}}visitState(e,A){let t=this.visitStyle(e.styles,A),n=e.options&&e.options.params||null;if(t.containsDynamicStyles){let o=new Set,a=n||{};t.styles.forEach(r=>{r instanceof Map&&r.forEach(s=>{Uy(s).forEach(l=>{a.hasOwnProperty(l)||o.add(l)})})}),o.size&&A.errors.push(OF(e.name,[...o.values()]))}return{type:ln.State,name:e.name,style:t,options:n?{params:n}:null}}visitTransition(e,A){A.queryCount=0,A.depCount=0;let t=Us(this,yd(e.animation),A),n=mAA(e.expr,A.errors);return{type:ln.Transition,matchers:n,animation:t,queryCount:A.queryCount,depCount:A.depCount,options:v1(e.options)}}visitSequence(e,A){return{type:ln.Sequence,steps:e.steps.map(t=>Us(this,t,A)),options:v1(e.options)}}visitGroup(e,A){let t=A.currentTime,n=0,o=e.steps.map(a=>{A.currentTime=t;let r=Us(this,a,A);return n=Math.max(n,A.currentTime),r});return A.currentTime=n,{type:ln.Group,steps:o,options:v1(e.options)}}visitAnimate(e,A){let t=SAA(e.timings,A.errors);A.currentAnimateTimings=t;let n,o=e.styles?e.styles:My({});if(o.type==ln.Keyframes)n=this.visitKeyframes(o,A);else{let a=e.styles,r=!1;if(!a){r=!0;let l={};t.easing&&(l.easing=t.easing),a=My(l)}A.currentTime+=t.duration+t.delay;let s=this.visitStyle(a,A);s.isEmptyStep=r,n=s}return A.currentAnimateTimings=null,{type:ln.Animate,timings:t,style:n,options:null}}visitStyle(e,A){let t=this._makeStyleAst(e,A);return this._validateStyleAst(t,A),t}_makeStyleAst(e,A){let t=[],n=Array.isArray(e.styles)?e.styles:[e.styles];for(let r of n)typeof r=="string"?r===wg?t.push(r):A.errors.push(HF(r)):t.push(new Map(Object.entries(r)));let o=!1,a=null;return t.forEach(r=>{if(r instanceof Map&&(r.has("easing")&&(a=r.get("easing"),r.delete("easing")),!o)){for(let s of r.values())if(s.toString().indexOf(Ly)>=0){o=!0;break}}}),{type:ln.Style,styles:t,easing:a,offset:e.offset,containsDynamicStyles:o,options:null}}_validateStyleAst(e,A){let t=A.currentAnimateTimings,n=A.currentTime,o=A.currentTime;t&&o>0&&(o-=t.duration+t.delay),e.styles.forEach(a=>{typeof a!="string"&&a.forEach((r,s)=>{let l=A.collectedStyles.get(A.currentQuerySelector),g=l.get(s),C=!0;g&&(o!=n&&o>=g.startTime&&n<=g.endTime&&(A.errors.push(zF(s,g.startTime,g.endTime,o,n)),C=!1),o=g.startTime),C&&l.set(s,{startTime:o,endTime:n}),A.options&&IL(r,A.options,A.errors)})})}visitKeyframes(e,A){let t={type:ln.Keyframes,styles:[],options:null};if(!A.currentAnimateTimings)return A.errors.push(PF()),t;let n=1,o=0,a=[],r=!1,s=!1,l=0,g=e.steps.map(m=>{let v=this._makeStyleAst(m,A),S=v.offset!=null?v.offset:MAA(v.styles),k=0;return S!=null&&(o++,k=v.offset=S),s=s||k<0||k>1,r=r||k0&&o{let S=I>0?v==B?1:I*v:a[v],k=S*f;A.currentTime=Q+h.delay+k,h.duration=k,this._validateStyleAst(m,A),m.offset=S,t.styles.push(m)}),t}visitReference(e,A){return{type:ln.Reference,animation:Us(this,yd(e.animation),A),options:v1(e.options)}}visitAnimateChild(e,A){return A.depCount++,{type:ln.AnimateChild,options:v1(e.options)}}visitAnimateRef(e,A){return{type:ln.AnimateRef,animation:this.visitReference(e.animation,A),options:v1(e.options)}}visitQuery(e,A){let t=A.currentQuerySelector,n=e.options||{};A.queryCount++,A.currentQuery=e;let[o,a]=vAA(e.selector);A.currentQuerySelector=t.length?t+" "+o:o,Ks(A.collectedStyles,A.currentQuerySelector,new Map);let r=Us(this,yd(e.animation),A);return A.currentQuery=null,A.currentQuerySelector=t,{type:ln.Query,selector:o,limit:n.limit||0,optional:!!n.optional,includeSelf:a,animation:r,originalSelector:e.selector,options:v1(e.options)}}visitStagger(e,A){A.currentQuery||A.errors.push(WF());let t=e.timings==="full"?{duration:0,delay:0,easing:"full"}:Zh(e.timings,A.errors,!0);return{type:ln.Stagger,animation:Us(this,yd(e.animation),A),timings:t,options:null}}};function vAA(i){let e=!!i.split(/\s*,\s*/).find(A=>A==vL);return e&&(i=i.replace(yAA,"")),i=i.replace(/@\*/g,Wh).replace(/@\w+/g,A=>Wh+"-"+A.slice(1)).replace(/:animating/g,Cp),[i,e]}function bAA(i){return i?oA({},i):null}var Py=class{errors;queryCount=0;depCount=0;currentTransition=null;currentQuery=null;currentQuerySelector=null;currentAnimateTimings=null;currentTime=0;collectedStyles=new Map;options=null;unsupportedCSSPropertiesFound=new Set;constructor(e){this.errors=e}};function MAA(i){if(typeof i=="string")return null;let e=null;if(Array.isArray(i))i.forEach(A=>{if(A instanceof Map&&A.has("offset")){let t=A;e=parseFloat(t.get("offset")),t.delete("offset")}});else if(i instanceof Map&&i.has("offset")){let A=i;e=parseFloat(A.get("offset")),A.delete("offset")}return e}function SAA(i,e){if(i.hasOwnProperty("duration"))return i;if(typeof i=="number"){let o=Zh(i,e).duration;return Ty(o,0,"")}let A=i;if(A.split(/\s+/).some(o=>o.charAt(0)=="{"&&o.charAt(1)=="{")){let o=Ty(0,0,"");return o.dynamic=!0,o.strValue=A,o}let n=Zh(A,e);return Ty(n.duration,n.delay,n.easing)}function v1(i){return i?(i=oA({},i),i.params&&(i.params=bAA(i.params))):i={},i}function Ty(i,e,A){return{duration:i,delay:e,easing:A}}function iv(i,e,A,t,n,o,a=null,r=!1){return{type:1,element:i,keyframes:e,preStyleProps:A,postStyleProps:t,duration:n,delay:o,totalTime:n+o,easing:a,subTimeline:r}}var $h=class{_map=new Map;get(e){return this._map.get(e)||[]}append(e,A){let t=this._map.get(e);t||this._map.set(e,t=[]),t.push(...A)}has(e){return this._map.has(e)}clear(){this._map.clear()}},kAA=1,_AA=":enter",xAA=new RegExp(_AA,"g"),RAA=":leave",NAA=new RegExp(RAA,"g");function ML(i,e,A,t,n,o=new Map,a=new Map,r,s,l=[]){return new jy().buildKeyframes(i,e,A,t,n,o,a,r,s,l)}var jy=class{buildKeyframes(e,A,t,n,o,a,r,s,l,g=[]){l=l||new $h;let C=new qy(e,A,l,n,o,g,[]);C.options=s;let I=s.delay?kc(s.delay):0;C.currentTimeline.delayNextStep(I),C.currentTimeline.setStyles([a],null,C.errors,s),Us(this,t,C);let B=C.timelines.filter(Q=>Q.containsAnimation());if(B.length&&r.size){let Q;for(let h=B.length-1;h>=0;h--){let f=B[h];if(f.element===A){Q=f;break}}Q&&!Q.allowOnlyTimelineStyles()&&Q.setStyles([r],null,C.errors,s)}return B.length?B.map(Q=>Q.buildKeyframes()):[iv(A,[],[],[],0,I,"",!1)]}visitTrigger(e,A){}visitState(e,A){}visitTransition(e,A){}visitAnimateChild(e,A){let t=A.subInstructions.get(A.element);if(t){let n=A.createSubContext(e.options),o=A.currentTimeline.currentTime,a=this._visitSubInstructions(t,n,n.options);o!=a&&A.transformIntoNewTimeline(a)}A.previousNode=e}visitAnimateRef(e,A){let t=A.createSubContext(e.options);t.transformIntoNewTimeline(),this._applyAnimationRefDelays([e.options,e.animation.options],A,t),this.visitReference(e.animation,t),A.transformIntoNewTimeline(t.currentTimeline.currentTime),A.previousNode=e}_applyAnimationRefDelays(e,A,t){for(let n of e){let o=n?.delay;if(o){let a=typeof o=="number"?o:kc(vd(o,n?.params??{},A.errors));t.delayNextStep(a)}}}_visitSubInstructions(e,A,t){let o=A.currentTimeline.currentTime,a=t.duration!=null?kc(t.duration):null,r=t.delay!=null?kc(t.delay):null;return a!==0&&e.forEach(s=>{let l=A.appendInstructionToTimeline(s,a,r);o=Math.max(o,l.duration+l.delay)}),o}visitReference(e,A){A.updateOptions(e.options,!0),Us(this,e.animation,A),A.previousNode=e}visitSequence(e,A){let t=A.subContextCount,n=A,o=e.options;if(o&&(o.params||o.delay)&&(n=A.createSubContext(o),n.transformIntoNewTimeline(),o.delay!=null)){n.previousNode.type==ln.Style&&(n.currentTimeline.snapshotCurrentStyles(),n.previousNode=fp);let a=kc(o.delay);n.delayNextStep(a)}e.steps.length&&(e.steps.forEach(a=>Us(this,a,n)),n.currentTimeline.applyStylesToKeyframe(),n.subContextCount>t&&n.transformIntoNewTimeline()),A.previousNode=e}visitGroup(e,A){let t=[],n=A.currentTimeline.currentTime,o=e.options&&e.options.delay?kc(e.options.delay):0;e.steps.forEach(a=>{let r=A.createSubContext(e.options);o&&r.delayNextStep(o),Us(this,a,r),n=Math.max(n,r.currentTimeline.currentTime),t.push(r.currentTimeline)}),t.forEach(a=>A.currentTimeline.mergeTimelineCollectedStyles(a)),A.transformIntoNewTimeline(n),A.previousNode=e}_visitTiming(e,A){if(e.dynamic){let t=e.strValue,n=A.params?vd(t,A.params,A.errors):t;return Zh(n,A.errors)}else return{duration:e.duration,delay:e.delay,easing:e.easing}}visitAnimate(e,A){let t=A.currentAnimateTimings=this._visitTiming(e.timings,A),n=A.currentTimeline;t.delay&&(A.incrementTime(t.delay),n.snapshotCurrentStyles());let o=e.style;o.type==ln.Keyframes?this.visitKeyframes(o,A):(A.incrementTime(t.duration),this.visitStyle(o,A),n.applyStylesToKeyframe()),A.currentAnimateTimings=null,A.previousNode=e}visitStyle(e,A){let t=A.currentTimeline,n=A.currentAnimateTimings;!n&&t.hasCurrentStyleProperties()&&t.forwardFrame();let o=n&&n.easing||e.easing;e.isEmptyStep?t.applyEmptyStep(o):t.setStyles(e.styles,o,A.errors,A.options),A.previousNode=e}visitKeyframes(e,A){let t=A.currentAnimateTimings,n=A.currentTimeline.duration,o=t.duration,r=A.createSubContext().currentTimeline;r.easing=t.easing,e.styles.forEach(s=>{let l=s.offset||0;r.forwardTime(l*o),r.setStyles(s.styles,s.easing,A.errors,A.options),r.applyStylesToKeyframe()}),A.currentTimeline.mergeTimelineCollectedStyles(r),A.transformIntoNewTimeline(n+o),A.previousNode=e}visitQuery(e,A){let t=A.currentTimeline.currentTime,n=e.options||{},o=n.delay?kc(n.delay):0;o&&(A.previousNode.type===ln.Style||t==0&&A.currentTimeline.hasCurrentStyleProperties())&&(A.currentTimeline.snapshotCurrentStyles(),A.previousNode=fp);let a=t,r=A.invokeQuery(e.selector,e.originalSelector,e.limit,e.includeSelf,!!n.optional,A.errors);A.currentQueryTotal=r.length;let s=null;r.forEach((l,g)=>{A.currentQueryIndex=g;let C=A.createSubContext(e.options,l);o&&C.delayNextStep(o),l===A.element&&(s=C.currentTimeline),Us(this,e.animation,C),C.currentTimeline.applyStylesToKeyframe();let I=C.currentTimeline.currentTime;a=Math.max(a,I)}),A.currentQueryIndex=0,A.currentQueryTotal=0,A.transformIntoNewTimeline(a),s&&(A.currentTimeline.mergeTimelineCollectedStyles(s),A.currentTimeline.snapshotCurrentStyles()),A.previousNode=e}visitStagger(e,A){let t=A.parentContext,n=A.currentTimeline,o=e.timings,a=Math.abs(o.duration),r=a*(A.currentQueryTotal-1),s=a*A.currentQueryIndex;switch(o.duration<0?"reverse":o.easing){case"reverse":s=r-s;break;case"full":s=t.currentStaggerTime;break}let g=A.currentTimeline;s&&g.delayNextStep(s);let C=g.currentTime;Us(this,e.animation,A),A.previousNode=e,t.currentStaggerTime=n.currentTime-C+(n.startTime-t.currentTimeline.startTime)}},fp={},qy=class i{_driver;element;subInstructions;_enterClassName;_leaveClassName;errors;timelines;parentContext=null;currentTimeline;currentAnimateTimings=null;previousNode=fp;subContextCount=0;options={};currentQueryIndex=0;currentQueryTotal=0;currentStaggerTime=0;constructor(e,A,t,n,o,a,r,s){this._driver=e,this.element=A,this.subInstructions=t,this._enterClassName=n,this._leaveClassName=o,this.errors=a,this.timelines=r,this.currentTimeline=s||new mp(this._driver,A,0),r.push(this.currentTimeline)}get params(){return this.options.params}updateOptions(e,A){if(!e)return;let t=e,n=this.options;t.duration!=null&&(n.duration=kc(t.duration)),t.delay!=null&&(n.delay=kc(t.delay));let o=t.params;if(o){let a=n.params;a||(a=this.options.params={}),Object.keys(o).forEach(r=>{(!A||!a.hasOwnProperty(r))&&(a[r]=vd(o[r],a,this.errors))})}}_copyOptions(){let e={};if(this.options){let A=this.options.params;if(A){let t=e.params={};Object.keys(A).forEach(n=>{t[n]=A[n]})}}return e}createSubContext(e=null,A,t){let n=A||this.element,o=new i(this._driver,n,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(n,t||0));return o.previousNode=this.previousNode,o.currentAnimateTimings=this.currentAnimateTimings,o.options=this._copyOptions(),o.updateOptions(e),o.currentQueryIndex=this.currentQueryIndex,o.currentQueryTotal=this.currentQueryTotal,o.parentContext=this,this.subContextCount++,o}transformIntoNewTimeline(e){return this.previousNode=fp,this.currentTimeline=this.currentTimeline.fork(this.element,e),this.timelines.push(this.currentTimeline),this.currentTimeline}appendInstructionToTimeline(e,A,t){let n={duration:A??e.duration,delay:this.currentTimeline.currentTime+(t??0)+e.delay,easing:""},o=new Vy(this._driver,e.element,e.keyframes,e.preStyleProps,e.postStyleProps,n,e.stretchStartingKeyframe);return this.timelines.push(o),n}incrementTime(e){this.currentTimeline.forwardTime(this.currentTimeline.duration+e)}delayNextStep(e){e>0&&this.currentTimeline.delayNextStep(e)}invokeQuery(e,A,t,n,o,a){let r=[];if(n&&r.push(this.element),e.length>0){e=e.replace(xAA,"."+this._enterClassName),e=e.replace(NAA,"."+this._leaveClassName);let s=t!=1,l=this._driver.query(this.element,e,s);t!==0&&(l=t<0?l.slice(l.length+t,l.length):l.slice(0,t)),r.push(...l)}return!o&&r.length==0&&a.push(ZF(A)),r}},mp=class i{_driver;element;startTime;_elementTimelineStylesLookup;duration=0;easing=null;_previousKeyframe=new Map;_currentKeyframe=new Map;_keyframes=new Map;_styleSummary=new Map;_localTimelineStyles=new Map;_globalTimelineStyles;_pendingStyles=new Map;_backFill=new Map;_currentEmptyStepKeyframe=null;constructor(e,A,t,n){this._driver=e,this.element=A,this.startTime=t,this._elementTimelineStylesLookup=n,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(A),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(A,this._localTimelineStyles)),this._loadKeyframe()}containsAnimation(){switch(this._keyframes.size){case 0:return!1;case 1:return this.hasCurrentStyleProperties();default:return!0}}hasCurrentStyleProperties(){return this._currentKeyframe.size>0}get currentTime(){return this.startTime+this.duration}delayNextStep(e){let A=this._keyframes.size===1&&this._pendingStyles.size;this.duration||A?(this.forwardTime(this.currentTime+e),A&&this.snapshotCurrentStyles()):this.startTime+=e}fork(e,A){return this.applyStylesToKeyframe(),new i(this._driver,e,A||this.currentTime,this._elementTimelineStylesLookup)}_loadKeyframe(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=new Map,this._keyframes.set(this.duration,this._currentKeyframe))}forwardFrame(){this.duration+=kAA,this._loadKeyframe()}forwardTime(e){this.applyStylesToKeyframe(),this.duration=e,this._loadKeyframe()}_updateStyle(e,A){this._localTimelineStyles.set(e,A),this._globalTimelineStyles.set(e,A),this._styleSummary.set(e,{time:this.currentTime,value:A})}allowOnlyTimelineStyles(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}applyEmptyStep(e){e&&this._previousKeyframe.set("easing",e);for(let[A,t]of this._globalTimelineStyles)this._backFill.set(A,t||wg),this._currentKeyframe.set(A,wg);this._currentEmptyStepKeyframe=this._currentKeyframe}setStyles(e,A,t,n){A&&this._previousKeyframe.set("easing",A);let o=n&&n.params||{},a=FAA(e,this._globalTimelineStyles);for(let[r,s]of a){let l=vd(s,o,t);this._pendingStyles.set(r,l),this._localTimelineStyles.has(r)||this._backFill.set(r,this._globalTimelineStyles.get(r)??wg),this._updateStyle(r,l)}}applyStylesToKeyframe(){this._pendingStyles.size!=0&&(this._pendingStyles.forEach((e,A)=>{this._currentKeyframe.set(A,e)}),this._pendingStyles.clear(),this._localTimelineStyles.forEach((e,A)=>{this._currentKeyframe.has(A)||this._currentKeyframe.set(A,e)}))}snapshotCurrentStyles(){for(let[e,A]of this._localTimelineStyles)this._pendingStyles.set(e,A),this._updateStyle(e,A)}getFinalKeyframe(){return this._keyframes.get(this.duration)}get properties(){let e=[];for(let A in this._currentKeyframe)e.push(A);return e}mergeTimelineCollectedStyles(e){e._styleSummary.forEach((A,t)=>{let n=this._styleSummary.get(t);(!n||A.time>n.time)&&this._updateStyle(t,A.value)})}buildKeyframes(){this.applyStylesToKeyframe();let e=new Set,A=new Set,t=this._keyframes.size===1&&this.duration===0,n=[];this._keyframes.forEach((r,s)=>{let l=new Map([...this._backFill,...r]);l.forEach((g,C)=>{g===qh?e.add(C):g===wg&&A.add(C)}),t||l.set("offset",s/this.duration),n.push(l)});let o=[...e.values()],a=[...A.values()];if(t){let r=n[0],s=new Map(r);r.set("offset",0),s.set("offset",1),n=[r,s]}return iv(this.element,n,o,a,this.duration,this.startTime,this.easing,!1)}},Vy=class extends mp{keyframes;preStyleProps;postStyleProps;_stretchStartingKeyframe;timings;constructor(e,A,t,n,o,a,r=!1){super(e,A,a.delay),this.keyframes=t,this.preStyleProps=n,this.postStyleProps=o,this._stretchStartingKeyframe=r,this.timings={duration:a.duration,delay:a.delay,easing:a.easing}}containsAnimation(){return this.keyframes.length>1}buildKeyframes(){let e=this.keyframes,{delay:A,duration:t,easing:n}=this.timings;if(this._stretchStartingKeyframe&&A){let o=[],a=t+A,r=A/a,s=new Map(e[0]);s.set("offset",0),o.push(s);let l=new Map(e[0]);l.set("offset",QL(r)),o.push(l);let g=e.length-1;for(let C=1;C<=g;C++){let I=new Map(e[C]),B=I.get("offset"),Q=A+B*t;I.set("offset",QL(Q/a)),o.push(I)}t=a,A=0,n="",e=o}return iv(this.element,e,this.preStyleProps,this.postStyleProps,t,A,n,!0)}};function QL(i,e=3){let A=Math.pow(10,e-1);return Math.round(i*A)/A}function FAA(i,e){let A=new Map,t;return i.forEach(n=>{if(n==="*"){t??=e.keys();for(let o of t)A.set(o,wg)}else for(let[o,a]of n)A.set(o,a)}),A}function uL(i,e,A,t,n,o,a,r,s,l,g,C,I){return{type:0,element:i,triggerName:e,isRemovalTransition:n,fromState:A,fromStyles:o,toState:t,toStyles:a,timelines:r,queriedElements:s,preStyleProps:l,postStyleProps:g,totalTime:C,errors:I}}var Jy={},wp=class{_triggerName;ast;_stateStyles;constructor(e,A,t){this._triggerName=e,this.ast=A,this._stateStyles=t}match(e,A,t,n){return LAA(this.ast.matchers,e,A,t,n)}buildStyles(e,A,t){let n=this._stateStyles.get("*");return e!==void 0&&(n=this._stateStyles.get(e?.toString())||n),n?n.buildStyles(A,t):new Map}build(e,A,t,n,o,a,r,s,l,g){let C=[],I=this.ast.options&&this.ast.options.params||Jy,B=r&&r.params||Jy,Q=this.buildStyles(t,B,C),h=s&&s.params||Jy,f=this.buildStyles(n,h,C),m=new Set,v=new Map,S=new Map,k=n==="void",M={params:SL(h,I),delay:this.ast.options?.delay},x=g?[]:ML(e,A,this.ast.animation,o,a,Q,f,M,l,C),F=0;return x.forEach(z=>{F=Math.max(z.duration+z.delay,F)}),C.length?uL(A,this._triggerName,t,n,k,Q,f,[],[],v,S,F,C):(x.forEach(z=>{let P=z.element,Z=Ks(v,P,new Set);z.preStyleProps.forEach(W=>Z.add(W));let AA=Ks(S,P,new Set);z.postStyleProps.forEach(W=>AA.add(W)),P!==A&&m.add(P)}),uL(A,this._triggerName,t,n,k,Q,f,x,[...m.values()],v,S,F))}};function LAA(i,e,A,t,n){return i.some(o=>o(e,A,t,n))}function SL(i,e){let A=oA({},e);return Object.entries(i).forEach(([t,n])=>{n!=null&&(A[t]=n)}),A}var Wy=class{styles;defaultParams;normalizer;constructor(e,A,t){this.styles=e,this.defaultParams=A,this.normalizer=t}buildStyles(e,A){let t=new Map,n=SL(e,this.defaultParams);return this.styles.styles.forEach(o=>{typeof o!="string"&&o.forEach((a,r)=>{a&&(a=vd(a,n,A));let s=this.normalizer.normalizePropertyName(r,A);a=this.normalizer.normalizeStyleValue(r,s,a,A),t.set(r,a)})}),t}};function GAA(i,e,A){return new Zy(i,e,A)}var Zy=class{name;ast;_normalizer;transitionFactories=[];fallbackTransition;states=new Map;constructor(e,A,t){this.name=e,this.ast=A,this._normalizer=t,A.states.forEach(n=>{let o=n.options&&n.options.params||{};this.states.set(n.name,new Wy(n.style,o,t))}),pL(this.states,"true","1"),pL(this.states,"false","0"),A.transitions.forEach(n=>{this.transitionFactories.push(new wp(e,n,this.states))}),this.fallbackTransition=KAA(e,this.states)}get containsQueries(){return this.ast.queryCount>0}matchTransition(e,A,t,n){return this.transitionFactories.find(a=>a.match(e,A,t,n))||null}matchStyles(e,A,t){return this.fallbackTransition.buildStyles(e,A,t)}};function KAA(i,e,A){let t=[(a,r)=>!0],n={type:ln.Sequence,steps:[],options:null},o={type:ln.Transition,animation:n,matchers:t,options:null,queryCount:0,depCount:0};return new wp(i,o,e)}function pL(i,e,A){i.has(e)?i.has(A)||i.set(A,i.get(e)):i.has(A)&&i.set(e,i.get(A))}var UAA=new $h,Xy=class{bodyNode;_driver;_normalizer;_animations=new Map;_playersById=new Map;players=[];constructor(e,A,t){this.bodyNode=e,this._driver=A,this._normalizer=t}register(e,A){let t=[],n=[],o=bL(this._driver,A,t,n);if(t.length)throw eL(t);this._animations.set(e,o)}_buildPlayer(e,A,t){let n=e.element,o=xy(this._normalizer,e.keyframes,A,t);return this._driver.animate(n,o,e.duration,e.delay,e.easing,[],!0)}create(e,A,t={}){let n=[],o=this._animations.get(e),a,r=new Map;if(o?(a=ML(this._driver,A,o,Gy,cp,new Map,new Map,t,UAA,n),a.forEach(g=>{let C=Ks(r,g.element,new Map);g.postStyleProps.forEach(I=>C.set(I,null))})):(n.push(tL()),a=[]),n.length)throw iL(n);r.forEach((g,C)=>{g.forEach((I,B)=>{g.set(B,this._driver.computeStyle(C,B,wg))})});let s=a.map(g=>{let C=r.get(g.element);return this._buildPlayer(g,new Map,C)}),l=b0(s);return this._playersById.set(e,l),l.onDestroy(()=>this.destroy(e)),this.players.push(l),l}destroy(e){let A=this._getPlayer(e);A.destroy(),this._playersById.delete(e);let t=this.players.indexOf(A);t>=0&&this.players.splice(t,1)}_getPlayer(e){let A=this._playersById.get(e);if(!A)throw nL(e);return A}listen(e,A,t,n){let o=lp(A,"","","");return sp(this._getPlayer(e),t,o,n),()=>{}}command(e,A,t,n){if(t=="register"){this.register(e,n[0]);return}if(t=="create"){let a=n[0]||{};this.create(e,A,a);return}let o=this._getPlayer(e);switch(t){case"play":o.play();break;case"pause":o.pause();break;case"reset":o.reset();break;case"restart":o.restart();break;case"finish":o.finish();break;case"init":o.init();break;case"setPosition":o.setPosition(parseFloat(n[0]));break;case"destroy":this.destroy(e);break}}},fL="ng-animate-queued",TAA=".ng-animate-queued",Yy="ng-animate-disabled",JAA=".ng-animate-disabled",YAA="ng-star-inserted",OAA=".ng-star-inserted",HAA=[],kL={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},zAA={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},yg="__ng_removed",AQ=class{namespaceId;value;options;get params(){return this.options.params}constructor(e,A=""){this.namespaceId=A;let t=e&&e.hasOwnProperty("value"),n=t?e.value:e;if(this.value=jAA(n),t){let o=e,{value:a}=o,r=Tx(o,["value"]);this.options=r}else this.options={};this.options.params||(this.options.params={})}absorbOptions(e){let A=e.params;if(A){let t=this.options.params;Object.keys(A).forEach(n=>{t[n]==null&&(t[n]=A[n])})}}},Xh="void",Oy=new AQ(Xh),$y=class{id;hostElement;_engine;players=[];_triggers=new Map;_queue=[];_elementListeners=new Map;_hostClassName;constructor(e,A,t){this.id=e,this.hostElement=A,this._engine=t,this._hostClassName="ng-tns-"+e,Gl(A,this._hostClassName)}listen(e,A,t,n){if(!this._triggers.has(A))throw oL(t,A);if(t==null||t.length==0)throw aL(A);if(!qAA(t))throw rL(t,A);let o=Ks(this._elementListeners,e,[]),a={name:A,phase:t,callback:n};o.push(a);let r=Ks(this._engine.statesByElement,e,new Map);return r.has(A)||(Gl(e,Vh),Gl(e,Vh+"-"+A),r.set(A,Oy)),()=>{this._engine.afterFlush(()=>{let s=o.indexOf(a);s>=0&&o.splice(s,1),this._triggers.has(A)||r.delete(A)})}}register(e,A){return this._triggers.has(e)?!1:(this._triggers.set(e,A),!0)}_getTrigger(e){let A=this._triggers.get(e);if(!A)throw sL(e);return A}trigger(e,A,t,n=!0){let o=this._getTrigger(A),a=new eQ(this.id,A,e),r=this._engine.statesByElement.get(e);r||(Gl(e,Vh),Gl(e,Vh+"-"+A),this._engine.statesByElement.set(e,r=new Map));let s=r.get(A),l=new AQ(t,this.id);if(!(t&&t.hasOwnProperty("value"))&&s&&l.absorbOptions(s.options),r.set(A,l),s||(s=Oy),!(l.value===Xh)&&s.value===l.value){if(!ZAA(s.params,l.params)){let h=[],f=o.matchStyles(s.value,s.params,h),m=o.matchStyles(l.value,l.params,h);h.length?this._engine.reportError(h):this._engine.afterFlush(()=>{LC(e,f),Dg(e,m)})}return}let I=Ks(this._engine.playersByElement,e,[]);I.forEach(h=>{h.namespaceId==this.id&&h.triggerName==A&&h.queued&&h.destroy()});let B=o.matchTransition(s.value,l.value,e,l.params),Q=!1;if(!B){if(!n)return;B=o.fallbackTransition,Q=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:A,transition:B,fromState:s,toState:l,player:a,isFallbackTransition:Q}),Q||(Gl(e,fL),a.onStart(()=>{bd(e,fL)})),a.onDone(()=>{let h=this.players.indexOf(a);h>=0&&this.players.splice(h,1);let f=this._engine.playersByElement.get(e);if(f){let m=f.indexOf(a);m>=0&&f.splice(m,1)}}),this.players.push(a),I.push(a),a}deregister(e){this._triggers.delete(e),this._engine.statesByElement.forEach(A=>A.delete(e)),this._elementListeners.forEach((A,t)=>{this._elementListeners.set(t,A.filter(n=>n.name!=e))})}clearElementCache(e){this._engine.statesByElement.delete(e),this._elementListeners.delete(e);let A=this._engine.playersByElement.get(e);A&&(A.forEach(t=>t.destroy()),this._engine.playersByElement.delete(e))}_signalRemovalForInnerTriggers(e,A){let t=this._engine.driver.query(e,Wh,!0);t.forEach(n=>{if(n[yg])return;let o=this._engine.fetchNamespacesByElement(n);o.size?o.forEach(a=>a.triggerLeaveAnimation(n,A,!1,!0)):this.clearElementCache(n)}),this._engine.afterFlushAnimationsDone(()=>t.forEach(n=>this.clearElementCache(n)))}triggerLeaveAnimation(e,A,t,n){let o=this._engine.statesByElement.get(e),a=new Map;if(o){let r=[];if(o.forEach((s,l)=>{if(a.set(l,s.value),this._triggers.has(l)){let g=this.trigger(e,l,Xh,n);g&&r.push(g)}}),r.length)return this._engine.markElementAsRemoved(this.id,e,!0,A,a),t&&b0(r).onDone(()=>this._engine.processLeaveNode(e)),!0}return!1}prepareLeaveAnimationListeners(e){let A=this._elementListeners.get(e),t=this._engine.statesByElement.get(e);if(A&&t){let n=new Set;A.forEach(o=>{let a=o.name;if(n.has(a))return;n.add(a);let s=this._triggers.get(a).fallbackTransition,l=t.get(a)||Oy,g=new AQ(Xh),C=new eQ(this.id,a,e);this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:a,transition:s,fromState:l,toState:g,player:C,isFallbackTransition:!0})})}}removeNode(e,A){let t=this._engine;if(e.childElementCount&&this._signalRemovalForInnerTriggers(e,A),this.triggerLeaveAnimation(e,A,!0))return;let n=!1;if(t.totalAnimations){let o=t.players.length?t.playersByQueriedElement.get(e):[];if(o&&o.length)n=!0;else{let a=e;for(;a=a.parentNode;)if(t.statesByElement.get(a)){n=!0;break}}}if(this.prepareLeaveAnimationListeners(e),n)t.markElementAsRemoved(this.id,e,!1,A);else{let o=e[yg];(!o||o===kL)&&(t.afterFlush(()=>this.clearElementCache(e)),t.destroyInnerAnimations(e),t._onRemovalComplete(e,A))}}insertNode(e,A){Gl(e,this._hostClassName)}drainQueuedTransitions(e){let A=[];return this._queue.forEach(t=>{let n=t.player;if(n.destroyed)return;let o=t.element,a=this._elementListeners.get(o);a&&a.forEach(r=>{if(r.name==t.triggerName){let s=lp(o,t.triggerName,t.fromState.value,t.toState.value);s._data=e,sp(t.player,r.phase,s,r.callback)}}),n.markedForDestroy?this._engine.afterFlush(()=>{n.destroy()}):A.push(t)}),this._queue=[],A.sort((t,n)=>{let o=t.transition.ast.depCount,a=n.transition.ast.depCount;return o==0||a==0?o-a:this._engine.driver.containsElement(t.element,n.element)?1:-1})}destroy(e){this.players.forEach(A=>A.destroy()),this._signalRemovalForInnerTriggers(this.hostElement,e)}},Av=class{bodyNode;driver;_normalizer;players=[];newHostElements=new Map;playersByElement=new Map;playersByQueriedElement=new Map;statesByElement=new Map;disabledNodes=new Set;totalAnimations=0;totalQueuedPlayers=0;_namespaceLookup={};_namespaceList=[];_flushFns=[];_whenQuietFns=[];namespacesByHostElement=new Map;collectedEnterElements=[];collectedLeaveElements=[];onRemovalComplete=(e,A)=>{};_onRemovalComplete(e,A){this.onRemovalComplete(e,A)}constructor(e,A,t){this.bodyNode=e,this.driver=A,this._normalizer=t}get queuedPlayers(){let e=[];return this._namespaceList.forEach(A=>{A.players.forEach(t=>{t.queued&&e.push(t)})}),e}createNamespace(e,A){let t=new $y(e,A,this);return this.bodyNode&&this.driver.containsElement(this.bodyNode,A)?this._balanceNamespaceList(t,A):(this.newHostElements.set(A,t),this.collectEnterElement(A)),this._namespaceLookup[e]=t}_balanceNamespaceList(e,A){let t=this._namespaceList,n=this.namespacesByHostElement;if(t.length-1>=0){let a=!1,r=this.driver.getParentElement(A);for(;r;){let s=n.get(r);if(s){let l=t.indexOf(s);t.splice(l+1,0,e),a=!0;break}r=this.driver.getParentElement(r)}a||t.unshift(e)}else t.push(e);return n.set(A,e),e}register(e,A){let t=this._namespaceLookup[e];return t||(t=this.createNamespace(e,A)),t}registerTrigger(e,A,t){let n=this._namespaceLookup[e];n&&n.register(A,t)&&this.totalAnimations++}destroy(e,A){e&&(this.afterFlush(()=>{}),this.afterFlushAnimationsDone(()=>{let t=this._fetchNamespace(e);this.namespacesByHostElement.delete(t.hostElement);let n=this._namespaceList.indexOf(t);n>=0&&this._namespaceList.splice(n,1),t.destroy(A),delete this._namespaceLookup[e]}))}_fetchNamespace(e){return this._namespaceLookup[e]}fetchNamespacesByElement(e){let A=new Set,t=this.statesByElement.get(e);if(t){for(let n of t.values())if(n.namespaceId){let o=this._fetchNamespace(n.namespaceId);o&&A.add(o)}}return A}trigger(e,A,t,n){if(hp(A)){let o=this._fetchNamespace(e);if(o)return o.trigger(A,t,n),!0}return!1}insertNode(e,A,t,n){if(!hp(A))return;let o=A[yg];if(o&&o.setForRemoval){o.setForRemoval=!1,o.setForMove=!0;let a=this.collectedLeaveElements.indexOf(A);a>=0&&this.collectedLeaveElements.splice(a,1)}if(e){let a=this._fetchNamespace(e);a&&a.insertNode(A,t)}n&&this.collectEnterElement(A)}collectEnterElement(e){this.collectedEnterElements.push(e)}markElementAsDisabled(e,A){A?this.disabledNodes.has(e)||(this.disabledNodes.add(e),Gl(e,Yy)):this.disabledNodes.has(e)&&(this.disabledNodes.delete(e),bd(e,Yy))}removeNode(e,A,t){if(hp(A)){let n=e?this._fetchNamespace(e):null;n?n.removeNode(A,t):this.markElementAsRemoved(e,A,!1,t);let o=this.namespacesByHostElement.get(A);o&&o.id!==e&&o.removeNode(A,t)}else this._onRemovalComplete(A,t)}markElementAsRemoved(e,A,t,n,o){this.collectedLeaveElements.push(A),A[yg]={namespaceId:e,setForRemoval:n,hasAnimation:t,removedBeforeQueried:!1,previousTriggersValues:o}}listen(e,A,t,n,o){return hp(A)?this._fetchNamespace(e).listen(A,t,n,o):()=>{}}_buildInstruction(e,A,t,n,o){return e.transition.build(this.driver,e.element,e.fromState.value,e.toState.value,t,n,e.fromState.options,e.toState.options,A,o)}destroyInnerAnimations(e){let A=this.driver.query(e,Wh,!0);A.forEach(t=>this.destroyActiveAnimationsForElement(t)),this.playersByQueriedElement.size!=0&&(A=this.driver.query(e,Cp,!0),A.forEach(t=>this.finishActiveQueriedAnimationOnElement(t)))}destroyActiveAnimationsForElement(e){let A=this.playersByElement.get(e);A&&A.forEach(t=>{t.queued?t.markedForDestroy=!0:t.destroy()})}finishActiveQueriedAnimationOnElement(e){let A=this.playersByQueriedElement.get(e);A&&A.forEach(t=>t.finish())}whenRenderingDone(){return new Promise(e=>{if(this.players.length)return b0(this.players).onDone(()=>e());e()})}processLeaveNode(e){let A=e[yg];if(A&&A.setForRemoval){if(e[yg]=kL,A.namespaceId){this.destroyInnerAnimations(e);let t=this._fetchNamespace(A.namespaceId);t&&t.clearElementCache(e)}this._onRemovalComplete(e,A.setForRemoval)}e.classList?.contains(Yy)&&this.markElementAsDisabled(e,!1),this.driver.query(e,JAA,!0).forEach(t=>{this.markElementAsDisabled(t,!1)})}flush(e=-1){let A=[];if(this.newHostElements.size&&(this.newHostElements.forEach((t,n)=>this._balanceNamespaceList(t,n)),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(let t=0;tt()),this._flushFns=[],this._whenQuietFns.length){let t=this._whenQuietFns;this._whenQuietFns=[],A.length?b0(A).onDone(()=>{t.forEach(n=>n())}):t.forEach(n=>n())}}reportError(e){throw lL(e)}_flushAnimations(e,A){let t=new $h,n=[],o=new Map,a=[],r=new Map,s=new Map,l=new Map,g=new Set;this.disabledNodes.forEach(QA=>{g.add(QA);let RA=this.driver.query(QA,TAA,!0);for(let IA=0;IA{let IA=Gy+h++;Q.set(RA,IA),QA.forEach(dA=>Gl(dA,IA))});let f=[],m=new Set,v=new Set;for(let QA=0;QAm.add(dA)):v.add(RA))}let S=new Map,k=DL(I,Array.from(m));k.forEach((QA,RA)=>{let IA=cp+h++;S.set(RA,IA),QA.forEach(dA=>Gl(dA,IA))}),e.push(()=>{B.forEach((QA,RA)=>{let IA=Q.get(RA);QA.forEach(dA=>bd(dA,IA))}),k.forEach((QA,RA)=>{let IA=S.get(RA);QA.forEach(dA=>bd(dA,IA))}),f.forEach(QA=>{this.processLeaveNode(QA)})});let M=[],x=[];for(let QA=this._namespaceList.length-1;QA>=0;QA--)this._namespaceList[QA].drainQueuedTransitions(A).forEach(IA=>{let dA=IA.player,_A=IA.element;if(M.push(dA),this.collectedEnterElements.length){let We=_A[yg];if(We&&We.setForMove){if(We.previousTriggersValues&&We.previousTriggersValues.has(IA.triggerName)){let OA=We.previousTriggersValues.get(IA.triggerName),EA=this.statesByElement.get(IA.element);if(EA&&EA.has(IA.triggerName)){let XA=EA.get(IA.triggerName);XA.value=OA,EA.set(IA.triggerName,XA)}}dA.destroy();return}}let VA=!C||!this.driver.containsElement(C,_A),he=S.get(_A),HA=Q.get(_A),vA=this._buildInstruction(IA,t,HA,he,VA);if(vA.errors&&vA.errors.length){x.push(vA);return}if(VA){dA.onStart(()=>LC(_A,vA.fromStyles)),dA.onDestroy(()=>Dg(_A,vA.toStyles)),n.push(dA);return}if(IA.isFallbackTransition){dA.onStart(()=>LC(_A,vA.fromStyles)),dA.onDestroy(()=>Dg(_A,vA.toStyles)),n.push(dA);return}let PA=[];vA.timelines.forEach(We=>{We.stretchStartingKeyframe=!0,this.disabledNodes.has(We.element)||PA.push(We)}),vA.timelines=PA,t.append(_A,vA.timelines);let et={instruction:vA,player:dA,element:_A};a.push(et),vA.queriedElements.forEach(We=>Ks(r,We,[]).push(dA)),vA.preStyleProps.forEach((We,OA)=>{if(We.size){let EA=s.get(OA);EA||s.set(OA,EA=new Set),We.forEach((XA,pA)=>EA.add(pA))}}),vA.postStyleProps.forEach((We,OA)=>{let EA=l.get(OA);EA||l.set(OA,EA=new Set),We.forEach((XA,pA)=>EA.add(pA))})});if(x.length){let QA=[];x.forEach(RA=>{QA.push(gL(RA.triggerName,RA.errors))}),M.forEach(RA=>RA.destroy()),this.reportError(QA)}let F=new Map,z=new Map;a.forEach(QA=>{let RA=QA.element;t.has(RA)&&(z.set(RA,RA),this._beforeAnimationBuild(QA.player.namespaceId,QA.instruction,F))}),n.forEach(QA=>{let RA=QA.element;this._getPreviousPlayers(RA,!1,QA.namespaceId,QA.triggerName,null).forEach(dA=>{Ks(F,RA,[]).push(dA),dA.destroy()})});let P=f.filter(QA=>yL(QA,s,l)),Z=new Map;wL(Z,this.driver,v,l,wg).forEach(QA=>{yL(QA,s,l)&&P.push(QA)});let W=new Map;B.forEach((QA,RA)=>{wL(W,this.driver,new Set(QA),s,qh)}),P.forEach(QA=>{let RA=Z.get(QA),IA=W.get(QA);Z.set(QA,new Map([...RA?.entries()??[],...IA?.entries()??[]]))});let CA=[],wA=[],BA={};a.forEach(QA=>{let{element:RA,player:IA,instruction:dA}=QA;if(t.has(RA)){if(g.has(RA)){IA.onDestroy(()=>Dg(RA,dA.toStyles)),IA.disabled=!0,IA.overrideTotalTime(dA.totalTime),n.push(IA);return}let _A=BA;if(z.size>1){let he=RA,HA=[];for(;he=he.parentNode;){let vA=z.get(he);if(vA){_A=vA;break}HA.push(he)}HA.forEach(vA=>z.set(vA,_A))}let VA=this._buildAnimation(IA.namespaceId,dA,F,o,W,Z);if(IA.setRealPlayer(VA),_A===BA)CA.push(IA);else{let he=this.playersByElement.get(_A);he&&he.length&&(IA.parentPlayer=b0(he)),n.push(IA)}}else LC(RA,dA.fromStyles),IA.onDestroy(()=>Dg(RA,dA.toStyles)),wA.push(IA),g.has(RA)&&n.push(IA)}),wA.forEach(QA=>{let RA=o.get(QA.element);if(RA&&RA.length){let IA=b0(RA);QA.setRealPlayer(IA)}}),n.forEach(QA=>{QA.parentPlayer?QA.syncPlayerEvents(QA.parentPlayer):QA.destroy()});for(let QA=0;QA!VA.destroyed);_A.length?VAA(this,RA,_A):this.processLeaveNode(RA)}return f.length=0,CA.forEach(QA=>{this.players.push(QA),QA.onDone(()=>{QA.destroy();let RA=this.players.indexOf(QA);this.players.splice(RA,1)}),QA.play()}),CA}afterFlush(e){this._flushFns.push(e)}afterFlushAnimationsDone(e){this._whenQuietFns.push(e)}_getPreviousPlayers(e,A,t,n,o){let a=[];if(A){let r=this.playersByQueriedElement.get(e);r&&(a=r)}else{let r=this.playersByElement.get(e);if(r){let s=!o||o==Xh;r.forEach(l=>{l.queued||!s&&l.triggerName!=n||a.push(l)})}}return(t||n)&&(a=a.filter(r=>!(t&&t!=r.namespaceId||n&&n!=r.triggerName))),a}_beforeAnimationBuild(e,A,t){let n=A.triggerName,o=A.element,a=A.isRemovalTransition?void 0:e,r=A.isRemovalTransition?void 0:n;for(let s of A.timelines){let l=s.element,g=l!==o,C=Ks(t,l,[]);this._getPreviousPlayers(l,g,a,r,A.toState).forEach(B=>{let Q=B.getRealPlayer();Q.beforeDestroy&&Q.beforeDestroy(),B.destroy(),C.push(B)})}LC(o,A.fromStyles)}_buildAnimation(e,A,t,n,o,a){let r=A.triggerName,s=A.element,l=[],g=new Set,C=new Set,I=A.timelines.map(Q=>{let h=Q.element;g.add(h);let f=h[yg];if(f&&f.removedBeforeQueried)return new v0(Q.duration,Q.delay);let m=h!==s,v=WAA((t.get(h)||HAA).map(F=>F.getRealPlayer())).filter(F=>{let z=F;return z.element?z.element===h:!1}),S=o.get(h),k=a.get(h),M=xy(this._normalizer,Q.keyframes,S,k),x=this._buildPlayer(Q,M,v);if(Q.subTimeline&&n&&C.add(h),m){let F=new eQ(e,r,h);F.setRealPlayer(x),l.push(F)}return x});l.forEach(Q=>{Ks(this.playersByQueriedElement,Q.element,[]).push(Q),Q.onDone(()=>PAA(this.playersByQueriedElement,Q.element,Q))}),g.forEach(Q=>Gl(Q,Ky));let B=b0(I);return B.onDestroy(()=>{g.forEach(Q=>bd(Q,Ky)),Dg(s,A.toStyles)}),C.forEach(Q=>{Ks(n,Q,[]).push(B)}),B}_buildPlayer(e,A,t){return A.length>0?this.driver.animate(e.element,A,e.duration,e.delay,e.easing,t):new v0(e.duration,e.delay)}},eQ=class{namespaceId;triggerName;element;_player=new v0;_containsRealPlayer=!1;_queuedCallbacks=new Map;destroyed=!1;parentPlayer=null;markedForDestroy=!1;disabled=!1;queued=!0;totalTime=0;constructor(e,A,t){this.namespaceId=e,this.triggerName=A,this.element=t}setRealPlayer(e){this._containsRealPlayer||(this._player=e,this._queuedCallbacks.forEach((A,t)=>{A.forEach(n=>sp(e,t,void 0,n))}),this._queuedCallbacks.clear(),this._containsRealPlayer=!0,this.overrideTotalTime(e.totalTime),this.queued=!1)}getRealPlayer(){return this._player}overrideTotalTime(e){this.totalTime=e}syncPlayerEvents(e){let A=this._player;A.triggerCallback&&e.onStart(()=>A.triggerCallback("start")),e.onDone(()=>this.finish()),e.onDestroy(()=>this.destroy())}_queueEvent(e,A){Ks(this._queuedCallbacks,e,[]).push(A)}onDone(e){this.queued&&this._queueEvent("done",e),this._player.onDone(e)}onStart(e){this.queued&&this._queueEvent("start",e),this._player.onStart(e)}onDestroy(e){this.queued&&this._queueEvent("destroy",e),this._player.onDestroy(e)}init(){this._player.init()}hasStarted(){return this.queued?!1:this._player.hasStarted()}play(){!this.queued&&this._player.play()}pause(){!this.queued&&this._player.pause()}restart(){!this.queued&&this._player.restart()}finish(){this._player.finish()}destroy(){this.destroyed=!0,this._player.destroy()}reset(){!this.queued&&this._player.reset()}setPosition(e){this.queued||this._player.setPosition(e)}getPosition(){return this.queued?0:this._player.getPosition()}triggerCallback(e){let A=this._player;A.triggerCallback&&A.triggerCallback(e)}};function PAA(i,e,A){let t=i.get(e);if(t){if(t.length){let n=t.indexOf(A);t.splice(n,1)}t.length==0&&i.delete(e)}return t}function jAA(i){return i??null}function hp(i){return i&&i.nodeType===1}function qAA(i){return i=="start"||i=="done"}function mL(i,e){let A=i.style.display;return i.style.display=e??"none",A}function wL(i,e,A,t,n){let o=[];A.forEach(s=>o.push(mL(s)));let a=[];t.forEach((s,l)=>{let g=new Map;s.forEach(C=>{let I=e.computeStyle(l,C,n);g.set(C,I),(!I||I.length==0)&&(l[yg]=zAA,a.push(l))}),i.set(l,g)});let r=0;return A.forEach(s=>mL(s,o[r++])),a}function DL(i,e){let A=new Map;if(i.forEach(r=>A.set(r,[])),e.length==0)return A;let t=1,n=new Set(e),o=new Map;function a(r){if(!r)return t;let s=o.get(r);if(s)return s;let l=r.parentNode;return A.has(l)?s=l:n.has(l)?s=t:s=a(l),o.set(r,s),s}return e.forEach(r=>{let s=a(r);s!==t&&A.get(s).push(r)}),A}function Gl(i,e){i.classList?.add(e)}function bd(i,e){i.classList?.remove(e)}function VAA(i,e,A){b0(A).onDone(()=>i.processLeaveNode(e))}function WAA(i){let e=[];return _L(i,e),e}function _L(i,e){for(let A=0;An.add(o)):e.set(i,t),A.delete(i),!0}var Md=class{_driver;_normalizer;_transitionEngine;_timelineEngine;_triggerCache={};onRemovalComplete=(e,A)=>{};constructor(e,A,t){this._driver=A,this._normalizer=t,this._transitionEngine=new Av(e.body,A,t),this._timelineEngine=new Xy(e.body,A,t),this._transitionEngine.onRemovalComplete=(n,o)=>this.onRemovalComplete(n,o)}registerTrigger(e,A,t,n,o){let a=e+"-"+n,r=this._triggerCache[a];if(!r){let s=[],l=[],g=bL(this._driver,o,s,l);if(s.length)throw AL(n,s);r=GAA(n,g,this._normalizer),this._triggerCache[a]=r}this._transitionEngine.registerTrigger(A,n,r)}register(e,A){this._transitionEngine.register(e,A)}destroy(e,A){this._transitionEngine.destroy(e,A)}onInsert(e,A,t,n){this._transitionEngine.insertNode(e,A,t,n)}onRemove(e,A,t){this._transitionEngine.removeNode(e,A,t)}disableAnimations(e,A){this._transitionEngine.markElementAsDisabled(e,A)}process(e,A,t,n){if(t.charAt(0)=="@"){let[o,a]=Ry(t),r=n;this._timelineEngine.command(o,A,a,r)}else this._transitionEngine.trigger(e,A,t,n)}listen(e,A,t,n,o){if(t.charAt(0)=="@"){let[a,r]=Ry(t);return this._timelineEngine.listen(a,A,r,o)}return this._transitionEngine.listen(e,A,t,n,o)}flush(e=-1){this._transitionEngine.flush(e)}get players(){return[...this._transitionEngine.players,...this._timelineEngine.players]}whenRenderingDone(){return this._transitionEngine.whenRenderingDone()}afterFlushAnimationsDone(e){this._transitionEngine.afterFlushAnimationsDone(e)}};function XAA(i,e){let A=null,t=null;return Array.isArray(e)&&e.length?(A=Hy(e[0]),e.length>1&&(t=Hy(e[e.length-1]))):e instanceof Map&&(A=Hy(e)),A||t?new $AA(i,A,t):null}var $AA=(()=>{class i{_element;_startStyles;_endStyles;static initialStylesByElement=new WeakMap;_state=0;_initialStyles;constructor(A,t,n){this._element=A,this._startStyles=t,this._endStyles=n;let o=i.initialStylesByElement.get(A);o||i.initialStylesByElement.set(A,o=new Map),this._initialStyles=o}start(){this._state<1&&(this._startStyles&&Dg(this._element,this._startStyles,this._initialStyles),this._state=1)}finish(){this.start(),this._state<2&&(Dg(this._element,this._initialStyles),this._endStyles&&(Dg(this._element,this._endStyles),this._endStyles=null),this._state=1)}destroy(){this.finish(),this._state<3&&(i.initialStylesByElement.delete(this._element),this._startStyles&&(LC(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(LC(this._element,this._endStyles),this._endStyles=null),Dg(this._element,this._initialStyles),this._state=3)}}return i})();function Hy(i){let e=null;return i.forEach((A,t)=>{AeA(t)&&(e=e||new Map,e.set(t,A))}),e}function AeA(i){return i==="display"||i==="position"}var Dp=class{element;keyframes;options;_specialStyles;_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_duration;_delay;_initialized=!1;_finished=!1;_started=!1;_destroyed=!1;_finalKeyframe;_originalOnDoneFns=[];_originalOnStartFns=[];domPlayer=null;time=0;parentPlayer=null;currentSnapshot=new Map;constructor(e,A,t,n){this.element=e,this.keyframes=A,this.options=t,this._specialStyles=n,this._duration=t.duration,this._delay=t.delay||0,this.time=this._duration+this._delay}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this._buildPlayer()&&this._preparePlayerBeforeStart()}_buildPlayer(){if(this._initialized)return this.domPlayer;this._initialized=!0;let e=this.keyframes,A=this._triggerWebAnimation(this.element,e,this.options);if(!A)return this._onFinish(),null;this.domPlayer=A,this._finalKeyframe=e.length?e[e.length-1]:new Map;let t=()=>this._onFinish();return A.addEventListener("finish",t),this.onDestroy(()=>{A.removeEventListener("finish",t)}),A}_preparePlayerBeforeStart(){this._delay?this._resetDomPlayerState():this.domPlayer?.pause()}_convertKeyframesToObject(e){let A=[];return e.forEach(t=>{A.push(Object.fromEntries(t))}),A}_triggerWebAnimation(e,A,t){let n=this._convertKeyframesToObject(A);try{return e.animate(n,t)}catch(o){return null}}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}play(){let e=this._buildPlayer();e&&(this.hasStarted()||(this._onStartFns.forEach(A=>A()),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),e.play())}pause(){this.init(),this.domPlayer?.pause()}finish(){this.init(),this.domPlayer&&(this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish())}reset(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}_resetDomPlayerState(){this.domPlayer?.cancel()}restart(){this.reset(),this.play()}hasStarted(){return this._started}destroy(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}setPosition(e){this.domPlayer||this.init(),this.domPlayer&&(this.domPlayer.currentTime=e*this.time)}getPosition(){return this.domPlayer?+(this.domPlayer.currentTime??0)/this.time:this._initialized?1:0}get totalTime(){return this._delay+this._duration}beforeDestroy(){let e=new Map;this.hasStarted()&&this._finalKeyframe.forEach((t,n)=>{n!=="offset"&&e.set(n,this._finished?t:dp(this.element,n))}),this.currentSnapshot=e}triggerCallback(e){let A=e==="start"?this._onStartFns:this._onDoneFns;A.forEach(t=>t()),A.length=0}},yp=class{validateStyleProperty(e){return!0}validateAnimatableStyleProperty(e){return!0}containsElement(e,A){return Ny(e,A)}getParentElement(e){return gp(e)}query(e,A,t){return Fy(e,A,t)}computeStyle(e,A,t){return dp(e,A)}animate(e,A,t,n,o,a=[]){let r=n==0?"both":"forwards",s={duration:t,delay:n,fill:r};o&&(s.easing=o);let l=new Map,g=a.filter(B=>B instanceof Dp);dL(t,n)&&g.forEach(B=>{B.currentSnapshot.forEach((Q,h)=>l.set(h,Q))});let C=CL(A).map(B=>new Map(B));C=BL(e,C,l);let I=XAA(e,C);return new Dp(e,C,s,I)}};var Qp="@",xL="@.disabled",vp=class{namespaceId;delegate;engine;_onDestroy;\u0275type=0;constructor(e,A,t,n){this.namespaceId=e,this.delegate=A,this.engine=t,this._onDestroy=n}get data(){return this.delegate.data}destroyNode(e){this.delegate.destroyNode?.(e)}destroy(){this.engine.destroy(this.namespaceId,this.delegate),this.engine.afterFlushAnimationsDone(()=>{queueMicrotask(()=>{this.delegate.destroy()})}),this._onDestroy?.()}createElement(e,A){return this.delegate.createElement(e,A)}createComment(e){return this.delegate.createComment(e)}createText(e){return this.delegate.createText(e)}appendChild(e,A){this.delegate.appendChild(e,A),this.engine.onInsert(this.namespaceId,A,e,!1)}insertBefore(e,A,t,n=!0){this.delegate.insertBefore(e,A,t),this.engine.onInsert(this.namespaceId,A,e,n)}removeChild(e,A,t,n){if(n){this.delegate.removeChild(e,A,t,n);return}this.parentNode(A)&&this.engine.onRemove(this.namespaceId,A,this.delegate)}selectRootElement(e,A){return this.delegate.selectRootElement(e,A)}parentNode(e){return this.delegate.parentNode(e)}nextSibling(e){return this.delegate.nextSibling(e)}setAttribute(e,A,t,n){this.delegate.setAttribute(e,A,t,n)}removeAttribute(e,A,t){this.delegate.removeAttribute(e,A,t)}addClass(e,A){this.delegate.addClass(e,A)}removeClass(e,A){this.delegate.removeClass(e,A)}setStyle(e,A,t,n){this.delegate.setStyle(e,A,t,n)}removeStyle(e,A,t){this.delegate.removeStyle(e,A,t)}setProperty(e,A,t){A.charAt(0)==Qp&&A==xL?this.disableAnimations(e,!!t):this.delegate.setProperty(e,A,t)}setValue(e,A){this.delegate.setValue(e,A)}listen(e,A,t,n){return this.delegate.listen(e,A,t,n)}disableAnimations(e,A){this.engine.disableAnimations(e,A)}},ev=class extends vp{factory;constructor(e,A,t,n,o){super(A,t,n,o),this.factory=e,this.namespaceId=A}setProperty(e,A,t){A.charAt(0)==Qp?A.charAt(1)=="."&&A==xL?(t=t===void 0?!0:!!t,this.disableAnimations(e,t)):this.engine.process(this.namespaceId,e,A.slice(1),t):this.delegate.setProperty(e,A,t)}listen(e,A,t,n){if(A.charAt(0)==Qp){let o=eeA(e),a=A.slice(1),r="";return a.charAt(0)!=Qp&&([a,r]=teA(a)),this.engine.listen(this.namespaceId,o,a,r,s=>{let l=s._data||-1;this.factory.scheduleListenerCallback(l,t,s)})}return this.delegate.listen(e,A,t,n)}};function eeA(i){switch(i){case"body":return document.body;case"document":return document;case"window":return window;default:return i}}function teA(i){let e=i.indexOf("."),A=i.substring(0,e),t=i.slice(e+1);return[A,t]}var bp=class{delegate;engine;_zone;_currentId=0;_microtaskId=1;_animationCallbacksBuffer=[];_rendererCache=new Map;_cdRecurDepth=0;constructor(e,A,t){this.delegate=e,this.engine=A,this._zone=t,A.onRemovalComplete=(n,o)=>{o?.removeChild(null,n)}}createRenderer(e,A){let n=this.delegate.createRenderer(e,A);if(!e||!A?.data?.animation){let l=this._rendererCache,g=l.get(n);if(!g){let C=()=>l.delete(n);g=new vp("",n,this.engine,C),l.set(n,g)}return g}let o=A.id,a=A.id+"-"+this._currentId;this._currentId++,this.engine.register(a,e);let r=l=>{Array.isArray(l)?l.forEach(r):this.engine.registerTrigger(o,a,e,l.name,l)};return A.data.animation.forEach(r),new ev(this,a,n,this.engine)}begin(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()}_scheduleCountTask(){queueMicrotask(()=>{this._microtaskId++})}scheduleListenerCallback(e,A,t){if(e>=0&&eA(t));return}let n=this._animationCallbacksBuffer;n.length==0&&queueMicrotask(()=>{this._zone.run(()=>{n.forEach(o=>{let[a,r]=o;a(r)}),this._animationCallbacksBuffer=[]})}),n.push([A,t])}end(){this._cdRecurDepth--,this._cdRecurDepth==0&&this._zone.runOutsideAngular(()=>{this._scheduleCountTask(),this.engine.flush(this._microtaskId)}),this.delegate.end&&this.delegate.end()}whenRenderingDone(){return this.engine.whenRenderingDone()}componentReplaced(e){this.engine.flush(),this.delegate.componentReplaced?.(e)}};var neA=(()=>{class i extends Md{constructor(A,t,n){super(A,t,n)}ngOnDestroy(){this.flush()}static \u0275fac=function(t){return new(t||i)(Ko(ii),Ko(b1),Ko(M1))};static \u0275prov=jA({token:i,factory:i.\u0275fac})}return i})();function oeA(){return new up}function aeA(){return new bp(w(pR),w(Md),w(qe))}var RL=[{provide:M1,useFactory:oeA},{provide:Md,useClass:neA},{provide:Rr,useFactory:aeA}],sxA=[{provide:b1,useClass:tv},{provide:r1,useValue:"NoopAnimations"},...RL],reA=[{provide:b1,useFactory:()=>new yp},{provide:r1,useFactory:()=>"BrowserAnimations"},...RL];function NL(){return Q3("NgEagerAnimations"),[...reA]}function pr(i){i||(i=w(ar));let e=new bi(A=>{if(i.destroyed){A.next();return}return i.onDestroy(A.next.bind(A))});return A=>A.pipe(ut(e))}var nv=class{source;destroyed=!1;destroyRef=w(ar);constructor(e){this.source=e,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}subscribe(e){if(this.destroyed)throw new St(953,!1);let A=this.source.pipe(pr(this.destroyRef)).subscribe({next:t=>e(t)});return{unsubscribe:()=>A.unsubscribe()}}};function Rn(i,e){return new nv(i)}function mo(i,e){let A=e?.injector??w(Dt),t=new Qg(1),n=_n(()=>{let o;try{o=i()}catch(a){ca(()=>t.error(a));return}ca(()=>t.next(o))},{injector:A,manualCleanup:!0});return A.get(ar).onDestroy(()=>{n.destroy(),t.complete()}),t.asObservable()}function Za(i,e){let t=!e?.manualCleanup?e?.injector?.get(ar)??w(ar):null,n=seA(e?.equal),o;e?.requireSync?o=mA({kind:0},{equal:n}):o=mA({kind:1,value:e?.initialValue},{equal:n});let a,r=i.subscribe({next:s=>o.set({kind:1,value:s}),error:s=>{o.set({kind:2,error:s}),a?.()},complete:()=>{a?.()}});if(e?.requireSync&&o().kind===0)throw new St(601,!1);return a=t?.onDestroy(r.unsubscribe.bind(r)),me(()=>{let s=o();switch(s.kind){case 1:return s.value;case 2:throw s.error;case 0:throw new St(601,!1)}},{equal:e?.equal})}function seA(i=Object.is){return(e,A)=>e.kind===1&&A.kind===1&&i(e.value,A.value)}function Mp(i){return lR(Oe(oA({},i),{loader:void 0,stream:e=>{let A,t=()=>A?.unsubscribe();e.abortSignal.addEventListener("abort",t);let n=mA({value:void 0}),o,a=new Promise(l=>o=l);function r(l){n.set(l),o?.(n),o=void 0}let s=i.stream;if(s===void 0)throw new St(990,!1);return A=s(e).subscribe({next:l=>r({value:l}),error:l=>{r({error:gR(l)}),e.abortSignal.removeEventListener("abort",t)},complete:()=>{o&&r({error:new St(991,!1)}),e.abortSignal.removeEventListener("abort",t)}}),a}}))}function sv(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var _1=sv();function JL(i){_1=i}var S1={exec:()=>null};function Yn(i,e=""){let A=typeof i=="string"?i:i.source,t={replace:(n,o)=>{let a=typeof o=="string"?o:o.source;return a=a.replace(ps.caret,"$1"),A=A.replace(n,a),t},getRegex:()=>new RegExp(A,e)};return t}var leA=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^
        /i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:i=>new RegExp(`^( {0,3}${i})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:i=>new RegExp(`^ {0,${Math.min(3,i-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:i=>new RegExp(`^ {0,${Math.min(3,i-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:i=>new RegExp(`^ {0,${Math.min(3,i-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:i=>new RegExp(`^ {0,${Math.min(3,i-1)}}#`),htmlBeginRegex:i=>new RegExp(`^ {0,${Math.min(3,i-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:i=>new RegExp(`^ {0,${Math.min(3,i-1)}}>`)},geA=/^(?:[ \t]*(?:\n|$))+/,ceA=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,CeA=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,oQ=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,IeA=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,lv=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,YL=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,OL=Yn(YL).replace(/bull/g,lv).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),deA=Yn(YL).replace(/bull/g,lv).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),gv=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,BeA=/^[^\n]+/,cv=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,EeA=Yn(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",cv).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),heA=Yn(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,lv).getRegex(),xp="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Cv=/|$))/,QeA=Yn("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",Cv).replace("tag",xp).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),HL=Yn(gv).replace("hr",oQ).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",xp).getRegex(),ueA=Yn(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",HL).getRegex(),Iv={blockquote:ueA,code:ceA,def:EeA,fences:CeA,heading:IeA,hr:oQ,html:QeA,lheading:OL,list:heA,newline:geA,paragraph:HL,table:S1,text:BeA},FL=Yn("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",oQ).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",xp).getRegex(),peA=Oe(oA({},Iv),{lheading:deA,table:FL,paragraph:Yn(gv).replace("hr",oQ).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",FL).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",xp).getRegex()}),feA=Oe(oA({},Iv),{html:Yn(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",Cv).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:S1,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Yn(gv).replace("hr",oQ).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",OL).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()}),meA=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,weA=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,zL=/^( {2,}|\\)\n(?!\s*$)/,DeA=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",leA?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),VL=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,_eA=Yn(VL,"u").replace(/punct/g,Rp).getRegex(),xeA=Yn(VL,"u").replace(/punct/g,jL).getRegex(),WL="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",ReA=Yn(WL,"gu").replace(/notPunctSpace/g,PL).replace(/punctSpace/g,dv).replace(/punct/g,Rp).getRegex(),NeA=Yn(WL,"gu").replace(/notPunctSpace/g,beA).replace(/punctSpace/g,veA).replace(/punct/g,jL).getRegex(),FeA=Yn("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,PL).replace(/punctSpace/g,dv).replace(/punct/g,Rp).getRegex(),LeA=Yn(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,qL).getRegex(),GeA="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",KeA=Yn(GeA,"gu").replace(/notPunctSpace/g,SeA).replace(/punctSpace/g,MeA).replace(/punct/g,qL).getRegex(),UeA=Yn(/\\(punct)/,"gu").replace(/punct/g,Rp).getRegex(),TeA=Yn(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),JeA=Yn(Cv).replace("(?:-->|$)","-->").getRegex(),YeA=Yn("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",JeA).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),kp=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,OeA=Yn(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",kp).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ZL=Yn(/^!?\[(label)\]\[(ref)\]/).replace("label",kp).replace("ref",cv).getRegex(),XL=Yn(/^!?\[(ref)\](?:\[\])?/).replace("ref",cv).getRegex(),HeA=Yn("reflink|nolink(?!\\()","g").replace("reflink",ZL).replace("nolink",XL).getRegex(),LL=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Bv={_backpedal:S1,anyPunctuation:UeA,autolink:TeA,blockSkip:keA,br:zL,code:weA,del:S1,delLDelim:S1,delRDelim:S1,emStrongLDelim:_eA,emStrongRDelimAst:ReA,emStrongRDelimUnd:FeA,escape:meA,link:OeA,nolink:XL,punctuation:yeA,reflink:ZL,reflinkSearch:HeA,tag:YeA,text:DeA,url:S1},zeA=Oe(oA({},Bv),{link:Yn(/^!?\[(label)\]\((.*?)\)/).replace("label",kp).getRegex(),reflink:Yn(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",kp).getRegex()}),ov=Oe(oA({},Bv),{emStrongRDelimAst:NeA,emStrongLDelim:xeA,delLDelim:LeA,delRDelim:KeA,url:Yn(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",LL).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:Yn(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},GL=i=>jeA[i];function _c(i,e){if(e){if(ps.escapeTest.test(i))return i.replace(ps.escapeReplace,GL)}else if(ps.escapeTestNoEncode.test(i))return i.replace(ps.escapeReplaceNoEncode,GL);return i}function KL(i){try{i=encodeURI(i).replace(ps.percentDecode,"%")}catch(e){return null}return i}function UL(i,e){let A=i.replace(ps.findPipe,(o,a,r)=>{let s=!1,l=a;for(;--l>=0&&r[l]==="\\";)s=!s;return s?"|":" |"}),t=A.split(ps.splitPipe),n=0;if(t[0].trim()||t.shift(),t.length>0&&!t.at(-1)?.trim()&&t.pop(),e)if(t.length>e)t.splice(e);else for(;t.length0?-2:-1}function VeA(i,e=0){let A=e,t="";for(let n of i)if(n===" "){let o=4-A%4;t+=" ".repeat(o),A+=o}else t+=n,A++;return t}function TL(i,e,A,t,n){let o=e.href,a=e.title||null,r=i[1].replace(n.other.outputLinkReplace,"$1");t.state.inLink=!0;let s={type:i[0].charAt(0)==="!"?"image":"link",raw:A,href:o,title:a,text:r,tokens:t.inlineTokens(r)};return t.state.inLink=!1,s}function WeA(i,e,A){let t=i.match(A.other.indentCodeCompensation);if(t===null)return e;let n=t[1];return e.split(` +`).map(o=>{let a=o.match(A.other.beginningSpace);if(a===null)return o;let[r]=a;return r.length>=n.length?o.slice(n.length):o}).join(` +`)}var _p=class{options;rules;lexer;constructor(i){this.options=i||_1}space(i){let e=this.rules.block.newline.exec(i);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(i){let e=this.rules.block.code.exec(i);if(e){let A=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?A:iQ(A,` +`)}}}fences(i){let e=this.rules.block.fences.exec(i);if(e){let A=e[0],t=WeA(A,e[3]||"",this.rules);return{type:"code",raw:A,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:t}}}heading(i){let e=this.rules.block.heading.exec(i);if(e){let A=e[2].trim();if(this.rules.other.endingHash.test(A)){let t=iQ(A,"#");(this.options.pedantic||!t||this.rules.other.endingSpaceChar.test(t))&&(A=t.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:A,tokens:this.lexer.inline(A)}}}hr(i){let e=this.rules.block.hr.exec(i);if(e)return{type:"hr",raw:iQ(e[0],` +`)}}blockquote(i){let e=this.rules.block.blockquote.exec(i);if(e){let A=iQ(e[0],` +`).split(` +`),t="",n="",o=[];for(;A.length>0;){let a=!1,r=[],s;for(s=0;s1,n={type:"list",raw:"",ordered:t,start:t?+A.slice(0,-1):"",loose:!1,items:[]};A=t?`\\d{1,9}\\${A.slice(-1)}`:`\\${A}`,this.options.pedantic&&(A=t?A:"[*+-]");let o=this.rules.other.listItemRegex(A),a=!1;for(;i;){let s=!1,l="",g="";if(!(e=o.exec(i))||this.rules.block.hr.test(i))break;l=e[0],i=i.substring(l.length);let C=VeA(e[2].split(` +`,1)[0],e[1].length),I=i.split(` +`,1)[0],B=!C.trim(),Q=0;if(this.options.pedantic?(Q=2,g=C.trimStart()):B?Q=e[1].length+1:(Q=C.search(this.rules.other.nonSpaceChar),Q=Q>4?1:Q,g=C.slice(Q),Q+=e[1].length),B&&this.rules.other.blankLine.test(I)&&(l+=I+` +`,i=i.substring(I.length+1),s=!0),!s){let h=this.rules.other.nextBulletRegex(Q),f=this.rules.other.hrRegex(Q),m=this.rules.other.fencesBeginRegex(Q),v=this.rules.other.headingBeginRegex(Q),S=this.rules.other.htmlBeginRegex(Q),k=this.rules.other.blockquoteBeginRegex(Q);for(;i;){let M=i.split(` +`,1)[0],x;if(I=M,this.options.pedantic?(I=I.replace(this.rules.other.listReplaceNesting," "),x=I):x=I.replace(this.rules.other.tabCharGlobal," "),m.test(I)||v.test(I)||S.test(I)||k.test(I)||h.test(I)||f.test(I))break;if(x.search(this.rules.other.nonSpaceChar)>=Q||!I.trim())g+=` +`+x.slice(Q);else{if(B||C.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||m.test(C)||v.test(C)||f.test(C))break;g+=` +`+I}B=!I.trim(),l+=M+` +`,i=i.substring(M.length+1),C=x.slice(Q)}}n.loose||(a?n.loose=!0:this.rules.other.doubleBlankLine.test(l)&&(a=!0)),n.items.push({type:"list_item",raw:l,task:!!this.options.gfm&&this.rules.other.listIsTask.test(g),loose:!1,text:g,tokens:[]}),n.raw+=l}let r=n.items.at(-1);if(r)r.raw=r.raw.trimEnd(),r.text=r.text.trimEnd();else return;n.raw=n.raw.trimEnd();for(let s of n.items){if(this.lexer.state.top=!1,s.tokens=this.lexer.blockTokens(s.text,[]),s.task){if(s.text=s.text.replace(this.rules.other.listReplaceTask,""),s.tokens[0]?.type==="text"||s.tokens[0]?.type==="paragraph"){s.tokens[0].raw=s.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),s.tokens[0].text=s.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let g=this.lexer.inlineQueue.length-1;g>=0;g--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[g].src)){this.lexer.inlineQueue[g].src=this.lexer.inlineQueue[g].src.replace(this.rules.other.listReplaceTask,"");break}}let l=this.rules.other.listTaskCheckbox.exec(s.raw);if(l){let g={type:"checkbox",raw:l[0]+" ",checked:l[0]!=="[ ]"};s.checked=g.checked,n.loose?s.tokens[0]&&["paragraph","text"].includes(s.tokens[0].type)&&"tokens"in s.tokens[0]&&s.tokens[0].tokens?(s.tokens[0].raw=g.raw+s.tokens[0].raw,s.tokens[0].text=g.raw+s.tokens[0].text,s.tokens[0].tokens.unshift(g)):s.tokens.unshift({type:"paragraph",raw:g.raw,text:g.raw,tokens:[g]}):s.tokens.unshift(g)}}if(!n.loose){let l=s.tokens.filter(C=>C.type==="space"),g=l.length>0&&l.some(C=>this.rules.other.anyLine.test(C.raw));n.loose=g}}if(n.loose)for(let s of n.items){s.loose=!0;for(let l of s.tokens)l.type==="text"&&(l.type="paragraph")}return n}}html(i){let e=this.rules.block.html.exec(i);if(e)return{type:"html",block:!0,raw:e[0],pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:e[0]}}def(i){let e=this.rules.block.def.exec(i);if(e){let A=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),t=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",n=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:A,raw:e[0],href:t,title:n}}}table(i){let e=this.rules.block.table.exec(i);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let A=UL(e[1]),t=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),n=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(` +`):[],o={type:"table",raw:e[0],header:[],align:[],rows:[]};if(A.length===t.length){for(let a of t)this.rules.other.tableAlignRight.test(a)?o.align.push("right"):this.rules.other.tableAlignCenter.test(a)?o.align.push("center"):this.rules.other.tableAlignLeft.test(a)?o.align.push("left"):o.align.push(null);for(let a=0;a({text:r,tokens:this.lexer.inline(r),header:!1,align:o.align[s]})));return o}}lheading(i){let e=this.rules.block.lheading.exec(i);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(i){let e=this.rules.block.paragraph.exec(i);if(e){let A=e[1].charAt(e[1].length-1)===` +`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:A,tokens:this.lexer.inline(A)}}}text(i){let e=this.rules.block.text.exec(i);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(i){let e=this.rules.inline.escape.exec(i);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(i){let e=this.rules.inline.tag.exec(i);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(i){let e=this.rules.inline.link.exec(i);if(e){let A=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(A)){if(!this.rules.other.endAngleBracket.test(A))return;let o=iQ(A.slice(0,-1),"\\");if((A.length-o.length)%2===0)return}else{let o=qeA(e[2],"()");if(o===-2)return;if(o>-1){let a=(e[0].indexOf("!")===0?5:4)+e[1].length+o;e[2]=e[2].substring(0,o),e[0]=e[0].substring(0,a).trim(),e[3]=""}}let t=e[2],n="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(t);o&&(t=o[1],n=o[3])}else n=e[3]?e[3].slice(1,-1):"";return t=t.trim(),this.rules.other.startAngleBracket.test(t)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(A)?t=t.slice(1):t=t.slice(1,-1)),TL(e,{href:t&&t.replace(this.rules.inline.anyPunctuation,"$1"),title:n&&n.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(i,e){let A;if((A=this.rules.inline.reflink.exec(i))||(A=this.rules.inline.nolink.exec(i))){let t=(A[2]||A[1]).replace(this.rules.other.multipleSpaceGlobal," "),n=e[t.toLowerCase()];if(!n){let o=A[0].charAt(0);return{type:"text",raw:o,text:o}}return TL(A,n,A[0],this.lexer,this.rules)}}emStrong(i,e,A=""){let t=this.rules.inline.emStrongLDelim.exec(i);if(!(!t||t[3]&&A.match(this.rules.other.unicodeAlphaNumeric))&&(!(t[1]||t[2])||!A||this.rules.inline.punctuation.exec(A))){let n=[...t[0]].length-1,o,a,r=n,s=0,l=t[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(l.lastIndex=0,e=e.slice(-1*i.length+n);(t=l.exec(e))!=null;){if(o=t[1]||t[2]||t[3]||t[4]||t[5]||t[6],!o)continue;if(a=[...o].length,t[3]||t[4]){r+=a;continue}else if((t[5]||t[6])&&n%3&&!((n+a)%3)){s+=a;continue}if(r-=a,r>0)continue;a=Math.min(a,a+r+s);let g=[...t[0]][0].length,C=i.slice(0,n+t.index+g+a);if(Math.min(n,a)%2){let B=C.slice(1,-1);return{type:"em",raw:C,text:B,tokens:this.lexer.inlineTokens(B)}}let I=C.slice(2,-2);return{type:"strong",raw:C,text:I,tokens:this.lexer.inlineTokens(I)}}}}codespan(i){let e=this.rules.inline.code.exec(i);if(e){let A=e[2].replace(this.rules.other.newLineCharGlobal," "),t=this.rules.other.nonSpaceChar.test(A),n=this.rules.other.startingSpaceChar.test(A)&&this.rules.other.endingSpaceChar.test(A);return t&&n&&(A=A.substring(1,A.length-1)),{type:"codespan",raw:e[0],text:A}}}br(i){let e=this.rules.inline.br.exec(i);if(e)return{type:"br",raw:e[0]}}del(i,e,A=""){let t=this.rules.inline.delLDelim.exec(i);if(t&&(!t[1]||!A||this.rules.inline.punctuation.exec(A))){let n=[...t[0]].length-1,o,a,r=n,s=this.rules.inline.delRDelim;for(s.lastIndex=0,e=e.slice(-1*i.length+n);(t=s.exec(e))!=null;){if(o=t[1]||t[2]||t[3]||t[4]||t[5]||t[6],!o||(a=[...o].length,a!==n))continue;if(t[3]||t[4]){r+=a;continue}if(r-=a,r>0)continue;a=Math.min(a,a+r);let l=[...t[0]][0].length,g=i.slice(0,n+t.index+l+a),C=g.slice(n,-n);return{type:"del",raw:g,text:C,tokens:this.lexer.inlineTokens(C)}}}}autolink(i){let e=this.rules.inline.autolink.exec(i);if(e){let A,t;return e[2]==="@"?(A=e[1],t="mailto:"+A):(A=e[1],t=A),{type:"link",raw:e[0],text:A,href:t,tokens:[{type:"text",raw:A,text:A}]}}}url(i){let e;if(e=this.rules.inline.url.exec(i)){let A,t;if(e[2]==="@")A=e[0],t="mailto:"+A;else{let n;do n=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(n!==e[0]);A=e[0],e[1]==="www."?t="http://"+e[0]:t=e[0]}return{type:"link",raw:e[0],text:A,href:t,tokens:[{type:"text",raw:A,text:A}]}}}inlineText(i){let e=this.rules.inline.text.exec(i);if(e){let A=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:A}}}},vg=class av{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||_1,this.options.tokenizer=this.options.tokenizer||new _p,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let A={other:ps,block:Sp.normal,inline:tQ.normal};this.options.pedantic?(A.block=Sp.pedantic,A.inline=tQ.pedantic):this.options.gfm&&(A.block=Sp.gfm,this.options.breaks?A.inline=tQ.breaks:A.inline=tQ.gfm),this.tokenizer.rules=A}static get rules(){return{block:Sp,inline:tQ}}static lex(e,A){return new av(A).lex(e)}static lexInline(e,A){return new av(A).inlineTokens(e)}lex(e){e=e.replace(ps.carriageReturn,` +`),this.blockTokens(e,this.tokens);for(let A=0;A(n=a.call({lexer:this},e,A))?(e=e.substring(n.raw.length),A.push(n),!0):!1))continue;if(n=this.tokenizer.space(e)){e=e.substring(n.raw.length);let a=A.at(-1);n.raw.length===1&&a!==void 0?a.raw+=` +`:A.push(n);continue}if(n=this.tokenizer.code(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(` +`)?"":` +`)+n.raw,a.text+=` +`+n.text,this.inlineQueue.at(-1).src=a.text):A.push(n);continue}if(n=this.tokenizer.fences(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.heading(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.hr(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.blockquote(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.list(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.html(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.def(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(` +`)?"":` +`)+n.raw,a.text+=` +`+n.raw,this.inlineQueue.at(-1).src=a.text):this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title},A.push(n));continue}if(n=this.tokenizer.table(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.lheading(e)){e=e.substring(n.raw.length),A.push(n);continue}let o=e;if(this.options.extensions?.startBlock){let a=1/0,r=e.slice(1),s;this.options.extensions.startBlock.forEach(l=>{s=l.call({lexer:this},r),typeof s=="number"&&s>=0&&(a=Math.min(a,s))}),a<1/0&&a>=0&&(o=e.substring(0,a+1))}if(this.state.top&&(n=this.tokenizer.paragraph(o))){let a=A.at(-1);t&&a?.type==="paragraph"?(a.raw+=(a.raw.endsWith(` +`)?"":` +`)+n.raw,a.text+=` +`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):A.push(n),t=o.length!==e.length,e=e.substring(n.raw.length);continue}if(n=this.tokenizer.text(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="text"?(a.raw+=(a.raw.endsWith(` +`)?"":` +`)+n.raw,a.text+=` +`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):A.push(n);continue}if(e){let a="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(a);break}else throw new Error(a)}}return this.state.top=!0,A}inline(e,A=[]){return this.inlineQueue.push({src:e,tokens:A}),A}inlineTokens(e,A=[]){let t=e,n=null;if(this.tokens.links){let s=Object.keys(this.tokens.links);if(s.length>0)for(;(n=this.tokenizer.rules.inline.reflinkSearch.exec(t))!=null;)s.includes(n[0].slice(n[0].lastIndexOf("[")+1,-1))&&(t=t.slice(0,n.index)+"["+"a".repeat(n[0].length-2)+"]"+t.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(n=this.tokenizer.rules.inline.anyPunctuation.exec(t))!=null;)t=t.slice(0,n.index)+"++"+t.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let o;for(;(n=this.tokenizer.rules.inline.blockSkip.exec(t))!=null;)o=n[2]?n[2].length:0,t=t.slice(0,n.index+o)+"["+"a".repeat(n[0].length-o-2)+"]"+t.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);t=this.options.hooks?.emStrongMask?.call({lexer:this},t)??t;let a=!1,r="";for(;e;){a||(r=""),a=!1;let s;if(this.options.extensions?.inline?.some(g=>(s=g.call({lexer:this},e,A))?(e=e.substring(s.raw.length),A.push(s),!0):!1))continue;if(s=this.tokenizer.escape(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.tag(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.link(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(s.raw.length);let g=A.at(-1);s.type==="text"&&g?.type==="text"?(g.raw+=s.raw,g.text+=s.text):A.push(s);continue}if(s=this.tokenizer.emStrong(e,t,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.codespan(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.br(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.del(e,t,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.autolink(e)){e=e.substring(s.raw.length),A.push(s);continue}if(!this.state.inLink&&(s=this.tokenizer.url(e))){e=e.substring(s.raw.length),A.push(s);continue}let l=e;if(this.options.extensions?.startInline){let g=1/0,C=e.slice(1),I;this.options.extensions.startInline.forEach(B=>{I=B.call({lexer:this},C),typeof I=="number"&&I>=0&&(g=Math.min(g,I))}),g<1/0&&g>=0&&(l=e.substring(0,g+1))}if(s=this.tokenizer.inlineText(l)){e=e.substring(s.raw.length),s.raw.slice(-1)!=="_"&&(r=s.raw.slice(-1)),a=!0;let g=A.at(-1);g?.type==="text"?(g.raw+=s.raw,g.text+=s.text):A.push(s);continue}if(e){let g="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(g);break}else throw new Error(g)}}return A}},GC=class{options;parser;constructor(i){this.options=i||_1}space(i){return""}code({text:i,lang:e,escaped:A}){let t=(e||"").match(ps.notSpaceStart)?.[0],n=i.replace(ps.endingNewline,"")+` +`;return t?'
        '+(A?n:_c(n,!0))+`
        +`:"
        "+(A?n:_c(n,!0))+`
        +`}blockquote({tokens:i}){return`
        +${this.parser.parse(i)}
        +`}html({text:i}){return i}def(i){return""}heading({tokens:i,depth:e}){return`${this.parser.parseInline(i)} +`}hr(i){return`
        +`}list(i){let e=i.ordered,A=i.start,t="";for(let a=0;a +`+t+" +`}listitem(i){return`
      • ${this.parser.parse(i.tokens)}
      • +`}checkbox({checked:i}){return" '}paragraph({tokens:i}){return`

        ${this.parser.parseInline(i)}

        +`}table(i){let e="",A="";for(let n=0;n${t}`),` + +`+e+` +`+t+`
        +`}tablerow({text:i}){return` +${i} +`}tablecell(i){let e=this.parser.parseInline(i.tokens),A=i.header?"th":"td";return(i.align?`<${A} align="${i.align}">`:`<${A}>`)+e+` +`}strong({tokens:i}){return`${this.parser.parseInline(i)}`}em({tokens:i}){return`${this.parser.parseInline(i)}`}codespan({text:i}){return`${_c(i,!0)}`}br(i){return"
        "}del({tokens:i}){return`${this.parser.parseInline(i)}`}link({href:i,title:e,tokens:A}){let t=this.parser.parseInline(A),n=KL(i);if(n===null)return t;i=n;let o='
        ",o}image({href:i,title:e,text:A,tokens:t}){t&&(A=this.parser.parseInline(t,this.parser.textRenderer));let n=KL(i);if(n===null)return _c(A);i=n;let o=`${_c(A)}{let a=n[o].flat(1/0);A=A.concat(this.walkTokens(a,e))}):n.tokens&&(A=A.concat(this.walkTokens(n.tokens,e)))}}return A}use(...i){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return i.forEach(A=>{let t=oA({},A);if(t.async=this.defaults.async||t.async||!1,A.extensions&&(A.extensions.forEach(n=>{if(!n.name)throw new Error("extension name required");if("renderer"in n){let o=e.renderers[n.name];o?e.renderers[n.name]=function(...a){let r=n.renderer.apply(this,a);return r===!1&&(r=o.apply(this,a)),r}:e.renderers[n.name]=n.renderer}if("tokenizer"in n){if(!n.level||n.level!=="block"&&n.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=e[n.level];o?o.unshift(n.tokenizer):e[n.level]=[n.tokenizer],n.start&&(n.level==="block"?e.startBlock?e.startBlock.push(n.start):e.startBlock=[n.start]:n.level==="inline"&&(e.startInline?e.startInline.push(n.start):e.startInline=[n.start]))}"childTokens"in n&&n.childTokens&&(e.childTokens[n.name]=n.childTokens)}),t.extensions=e),A.renderer){let n=this.defaults.renderer||new GC(this.defaults);for(let o in A.renderer){if(!(o in n))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let a=o,r=A.renderer[a],s=n[a];n[a]=(...l)=>{let g=r.apply(n,l);return g===!1&&(g=s.apply(n,l)),g||""}}t.renderer=n}if(A.tokenizer){let n=this.defaults.tokenizer||new _p(this.defaults);for(let o in A.tokenizer){if(!(o in n))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let a=o,r=A.tokenizer[a],s=n[a];n[a]=(...l)=>{let g=r.apply(n,l);return g===!1&&(g=s.apply(n,l)),g}}t.tokenizer=n}if(A.hooks){let n=this.defaults.hooks||new nQ;for(let o in A.hooks){if(!(o in n))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let a=o,r=A.hooks[a],s=n[a];nQ.passThroughHooks.has(o)?n[a]=l=>{if(this.defaults.async&&nQ.passThroughHooksRespectAsync.has(o))return Ie(this,null,function*(){let C=yield r.call(n,l);return s.call(n,C)});let g=r.call(n,l);return s.call(n,g)}:n[a]=(...l)=>{if(this.defaults.async)return Ie(this,null,function*(){let C=yield r.apply(n,l);return C===!1&&(C=yield s.apply(n,l)),C});let g=r.apply(n,l);return g===!1&&(g=s.apply(n,l)),g}}t.hooks=n}if(A.walkTokens){let n=this.defaults.walkTokens,o=A.walkTokens;t.walkTokens=function(a){let r=[];return r.push(o.call(this,a)),n&&(r=r.concat(n.call(this,a))),r}}this.defaults=oA(oA({},this.defaults),t)}),this}setOptions(i){return this.defaults=oA(oA({},this.defaults),i),this}lexer(i,e){return vg.lex(i,e??this.defaults)}parser(i,e){return bg.parse(i,e??this.defaults)}parseMarkdown(i){return(e,A)=>{let t=oA({},A),n=oA(oA({},this.defaults),t),o=this.onError(!!n.silent,!!n.async);if(this.defaults.async===!0&&t.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(n.hooks&&(n.hooks.options=n,n.hooks.block=i),n.async)return Ie(this,null,function*(){let a=n.hooks?yield n.hooks.preprocess(e):e,r=yield(n.hooks?yield n.hooks.provideLexer():i?vg.lex:vg.lexInline)(a,n),s=n.hooks?yield n.hooks.processAllTokens(r):r;n.walkTokens&&(yield Promise.all(this.walkTokens(s,n.walkTokens)));let l=yield(n.hooks?yield n.hooks.provideParser():i?bg.parse:bg.parseInline)(s,n);return n.hooks?yield n.hooks.postprocess(l):l}).catch(o);try{n.hooks&&(e=n.hooks.preprocess(e));let a=(n.hooks?n.hooks.provideLexer():i?vg.lex:vg.lexInline)(e,n);n.hooks&&(a=n.hooks.processAllTokens(a)),n.walkTokens&&this.walkTokens(a,n.walkTokens);let r=(n.hooks?n.hooks.provideParser():i?bg.parse:bg.parseInline)(a,n);return n.hooks&&(r=n.hooks.postprocess(r)),r}catch(a){return o(a)}}}onError(i,e){return A=>{if(A.message+=` +Please report this to https://github.com/markedjs/marked.`,i){let t="

        An error occurred:

        "+_c(A.message+"",!0)+"
        ";return e?Promise.resolve(t):t}if(e)return Promise.reject(A);throw A}}},k1=new ZeA;function qn(i,e){return k1.parse(i,e)}qn.options=qn.setOptions=function(i){return k1.setOptions(i),qn.defaults=k1.defaults,JL(qn.defaults),qn};qn.getDefaults=sv;qn.defaults=_1;qn.use=function(...i){return k1.use(...i),qn.defaults=k1.defaults,JL(qn.defaults),qn};qn.walkTokens=function(i,e){return k1.walkTokens(i,e)};qn.parseInline=k1.parseInline;qn.Parser=bg;qn.parser=bg.parse;qn.Renderer=GC;qn.TextRenderer=Ev;qn.Lexer=vg;qn.lexer=vg.lex;qn.Tokenizer=_p;qn.Hooks=nQ;qn.parse=qn;var pxA=qn.options,fxA=qn.setOptions,mxA=qn.use,wxA=qn.walkTokens,DxA=qn.parseInline;var yxA=bg.parse,vxA=vg.lex;var XeA=["*"],$eA="Copy",AtA="Copied",etA=(()=>{class i{constructor(){this._buttonClick$=new te,this.copied=Za(this._buttonClick$.pipe(pi(()=>Ti(ie(!0),I3(3e3).pipe(uh(!1)))),ug(),Ss(1))),this.copiedText=me(()=>this.copied()?AtA:$eA)}onCopyToClipboardClick(){this._buttonClick$.next()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["markdown-clipboard"]],decls:2,vars:3,consts:[[1,"markdown-clipboard-button",3,"click"]],template:function(t,n){t&1&&(Dn(0,"button",0),td("click",function(){return n.onCopyToClipboardClick()}),y(1),Tn()),t&2&&(xA("copied",n.copied()),u(),iA(n.copiedText()))},encapsulation:2,changeDetection:0})}}return i})(),ttA=new MA("CLIPBOARD_OPTIONS");var itA=new MA("MARKED_EXTENSIONS"),ntA=new MA("MARKED_OPTIONS"),otA=new MA("MERMAID_OPTIONS"),atA=new MA("SANITIZE");function rtA(i){return typeof i=="function"}var stA="[ngx-markdown] When using the `emoji` attribute you *have to* include Emoji-Toolkit files to `angular.json` or use imports. See README for more information",ltA="[ngx-markdown] When using the `katex` attribute you *have to* include KaTeX files to `angular.json` or use imports. See README for more information",gtA="[ngx-markdown] When using the `mermaid` attribute you *have to* include Mermaid files to `angular.json` or use imports. See README for more information",ctA="[ngx-markdown] When using the `clipboard` attribute you *have to* include Clipboard files to `angular.json` or use imports. See README for more information",CtA="[ngx-markdown] When using the `clipboard` attribute you *have to* provide the `viewContainerRef` parameter to `MarkdownService.render()` function",ItA="[ngx-markdown] When using the `src` attribute you *have to* pass the `HttpClient` as a parameter of the `forRoot` method. See README for more information";var $L=(()=>{class i{get options(){return this._options}set options(A){this._options=oA(oA({},this.DEFAULT_MARKED_OPTIONS),A)}get renderer(){return this.options.renderer}set renderer(A){this.options.renderer=A}constructor(){this.clipboardOptions=w(ttA,{optional:!0}),this.extensions=w(itA,{optional:!0}),this.http=w(hr,{optional:!0}),this.mermaidOptions=w(otA,{optional:!0}),this.platform=w(h3),this.sanitize=w(atA,{optional:!0}),this.sanitizer=w(SC),this.DEFAULT_MARKED_OPTIONS={renderer:new GC},this.DEFAULT_KATEX_OPTIONS={delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}]},this.DEFAULT_MERMAID_OPTIONS={startOnLoad:!1},this.DEFAULT_CLIPBOARD_OPTIONS={buttonComponent:void 0},this.DEFAULT_PARSE_OPTIONS={decodeHtml:!1,inline:!1,emoji:!1,mermaid:!1,markedOptions:void 0,disableSanitizer:!1},this.DEFAULT_RENDER_OPTIONS={clipboard:!1,clipboardOptions:void 0,katex:!1,katexOptions:void 0,mermaid:!1,mermaidOptions:void 0},this.DEFAULT_SECURITY_CONTEXT=fg.HTML,this._options=null,this._reload$=new te,this.reload$=this._reload$.asObservable(),this.options=w(ntA,{optional:!0})}parse(A,t=this.DEFAULT_PARSE_OPTIONS){let{decodeHtml:n,inline:o,emoji:a,mermaid:r,disableSanitizer:s}=t,l=oA(oA({},this.options),t.markedOptions),g=l.renderer||this.renderer||new GC;this.extensions&&(this.renderer=this.extendsRendererForExtensions(g)),r&&(this.renderer=this.extendsRendererForMermaid(g));let C=this.trimIndentation(A),I=n?this.decodeHtml(C):C,B=a?this.parseEmoji(I):I,Q=this.parseMarked(B,l,o);return s?Q:this.sanitizeHtml(Q)}render(A,t=this.DEFAULT_RENDER_OPTIONS,n){let{clipboard:o,clipboardOptions:a,katex:r,katexOptions:s,mermaid:l,mermaidOptions:g}=t;r&&this.renderKatex(A,oA(oA({},this.DEFAULT_KATEX_OPTIONS),s)),l&&this.renderMermaid(A,oA(oA(oA({},this.DEFAULT_MERMAID_OPTIONS),this.mermaidOptions),g)),o&&this.renderClipboard(A,n,oA(oA(oA({},this.DEFAULT_CLIPBOARD_OPTIONS),this.clipboardOptions),a)),this.highlight(A)}reload(){this._reload$.next()}getSource(A){if(!this.http)throw new Error(ItA);return this.http.get(A,{responseType:"text"}).pipe(ye(t=>this.handleExtension(A,t)))}highlight(A){if(!w0(this.platform)||typeof Prism>"u"||typeof Prism.highlightAllUnder>"u")return;A||(A=document);let t=A.querySelectorAll('pre code:not([class*="language-"])');Array.prototype.forEach.call(t,n=>n.classList.add("language-none")),Prism.highlightAllUnder(A)}decodeHtml(A){if(!w0(this.platform))return A;let t=document.createElement("textarea");return t.innerHTML=A,t.value}extendsRendererForExtensions(A){let t=A;return t.\u0275NgxMarkdownRendererExtendedForExtensions===!0||(this.extensions&&this.extensions.length>0&&qn.use(...this.extensions),t.\u0275NgxMarkdownRendererExtendedForExtensions=!0),A}extendsRendererForMermaid(A){let t=A;if(t.\u0275NgxMarkdownRendererExtendedForMermaid===!0)return A;let n=A.code;return A.code=o=>o.lang==="mermaid"?`
        ${o.text}
        `:n(o),t.\u0275NgxMarkdownRendererExtendedForMermaid=!0,A}handleExtension(A,t){let n=A.lastIndexOf("://"),o=n>-1?A.substring(n+4):A,a=o.lastIndexOf("/"),r=a>-1?o.substring(a+1).split("?")[0]:"",s=r.lastIndexOf("."),l=s>-1?r.substring(s+1):"";return l&&l!=="md"?"```"+l+` +`+t+"\n```":t}parseMarked(A,t,n=!1){if(t.renderer){let o=oA({},t.renderer);delete o.\u0275NgxMarkdownRendererExtendedForExtensions,delete o.\u0275NgxMarkdownRendererExtendedForMermaid,delete t.renderer,qn.use({renderer:o})}return n?qn.parseInline(A,t):qn.parse(A,t)}parseEmoji(A){if(!w0(this.platform))return A;if(typeof joypixels>"u"||typeof joypixels.shortnameToUnicode>"u")throw new Error(stA);return joypixels.shortnameToUnicode(A)}renderKatex(A,t){if(w0(this.platform)){if(typeof katex>"u"||typeof renderMathInElement>"u")throw new Error(ltA);renderMathInElement(A,t)}}renderClipboard(A,t,n){if(!w0(this.platform))return;if(typeof ClipboardJS>"u")throw new Error(ctA);if(!t)throw new Error(CtA);let{buttonComponent:o,buttonTemplate:a}=n,r=A.querySelectorAll("pre");for(let s=0;sC.classList.add("hover"),g.onmouseleave=()=>C.classList.remove("hover");let I;if(o){let Q=t.createComponent(o);I=Q.hostView,Q.changeDetectorRef.markForCheck()}else if(a)I=t.createEmbeddedView(a);else{let Q=t.createComponent(etA);I=Q.hostView,Q.changeDetectorRef.markForCheck()}let B;I.rootNodes.forEach(Q=>{C.appendChild(Q),B=new ClipboardJS(Q,{text:()=>l.innerText})}),I.onDestroy(()=>B.destroy())}}renderMermaid(A,t=this.DEFAULT_MERMAID_OPTIONS){if(!w0(this.platform))return;if(typeof mermaid>"u"||typeof mermaid.initialize>"u")throw new Error(gtA);let n=A.querySelectorAll(".mermaid");n.length!==0&&(mermaid.initialize(t),mermaid.run({nodes:n}))}trimIndentation(A){if(!A)return"";let t;return A.split(` +`).map(n=>{let o=t;return n.length>0&&(o=isNaN(o)?n.search(/\S|$/):Math.min(n.search(/\S|$/),o)),isNaN(t)&&(t=o),o?n.substring(o):n}).join(` +`)}sanitizeHtml(A){return Ie(this,null,function*(){return rtA(this.sanitize)?this.sanitize(yield A):this.sanitize!==fg.NONE?this.sanitizer.sanitize(this.sanitize??this.DEFAULT_SECURITY_CONTEXT,A)??"":A})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),hv=(function(i){return i.CommandLine="command-line",i.LineHighlight="line-highlight",i.LineNumbers="line-numbers",i})(hv||{}),AG=(()=>{class i{constructor(){this.element=w(se),this.markdownService=w($L),this.viewContainerRef=w(So),this.error=new LA,this.load=new LA,this.ready=new LA,this._clipboard=!1,this._commandLine=!1,this._disableSanitizer=!1,this._emoji=!1,this._inline=!1,this._katex=!1,this._lineHighlight=!1,this._lineNumbers=!1,this._mermaid=!1,this.destroyed$=new te}get disableSanitizer(){return this._disableSanitizer}set disableSanitizer(A){this._disableSanitizer=this.coerceBooleanProperty(A)}get inline(){return this._inline}set inline(A){this._inline=this.coerceBooleanProperty(A)}get clipboard(){return this._clipboard}set clipboard(A){this._clipboard=this.coerceBooleanProperty(A)}get emoji(){return this._emoji}set emoji(A){this._emoji=this.coerceBooleanProperty(A)}get katex(){return this._katex}set katex(A){this._katex=this.coerceBooleanProperty(A)}get mermaid(){return this._mermaid}set mermaid(A){this._mermaid=this.coerceBooleanProperty(A)}get lineHighlight(){return this._lineHighlight}set lineHighlight(A){this._lineHighlight=this.coerceBooleanProperty(A)}get lineNumbers(){return this._lineNumbers}set lineNumbers(A){this._lineNumbers=this.coerceBooleanProperty(A)}get commandLine(){return this._commandLine}set commandLine(A){this._commandLine=this.coerceBooleanProperty(A)}ngOnChanges(){this.loadContent()}loadContent(){if(this.data!=null){this.handleData();return}if(this.src!=null){this.handleSrc();return}}ngAfterViewInit(){!this.data&&!this.src&&this.handleTransclusion(),this.markdownService.reload$.pipe(ut(this.destroyed$)).subscribe(()=>this.loadContent())}ngOnDestroy(){this.destroyed$.next(),this.destroyed$.complete()}render(A,t=!1){return Ie(this,null,function*(){let n={decodeHtml:t,inline:this.inline,emoji:this.emoji,mermaid:this.mermaid,disableSanitizer:this.disableSanitizer},o={clipboard:this.clipboard,clipboardOptions:this.getClipboardOptions(),katex:this.katex,katexOptions:this.katexOptions,mermaid:this.mermaid,mermaidOptions:this.mermaidOptions},a=yield this.markdownService.parse(A,n);this.element.nativeElement.innerHTML=a,this.handlePlugins(),this.markdownService.render(this.element.nativeElement,o,this.viewContainerRef),this.ready.emit()})}coerceBooleanProperty(A){return A!=null&&`${String(A)}`!="false"}getClipboardOptions(){if(this.clipboardButtonComponent||this.clipboardButtonTemplate)return{buttonComponent:this.clipboardButtonComponent,buttonTemplate:this.clipboardButtonTemplate}}handleData(){this.render(this.data)}handleSrc(){this.markdownService.getSource(this.src).subscribe({next:A=>{this.render(A).then(()=>{this.load.emit(A)})},error:A=>this.error.emit(A)})}handleTransclusion(){this.render(this.element.nativeElement.innerHTML,!0)}handlePlugins(){this.commandLine&&(this.setPluginClass(this.element.nativeElement,hv.CommandLine),this.setPluginOptions(this.element.nativeElement,{dataFilterOutput:this.filterOutput,dataHost:this.host,dataPrompt:this.prompt,dataOutput:this.output,dataUser:this.user})),this.lineHighlight&&this.setPluginOptions(this.element.nativeElement,{dataLine:this.line,dataLineOffset:this.lineOffset}),this.lineNumbers&&(this.setPluginClass(this.element.nativeElement,hv.LineNumbers),this.setPluginOptions(this.element.nativeElement,{dataStart:this.start}))}setPluginClass(A,t){let n=A.querySelectorAll("pre");for(let o=0;o{let r=t[a];if(r){let s=this.toLispCase(a);n.item(o).setAttribute(s,r.toString())}})}toLispCase(A){let t=A.match(/([A-Z])/g);if(!t)return A;let n=A.toString();for(let o=0,a=t.length;o{class i{static forRoot(A){return{ngModule:i,providers:[aQ(A)]}}static forChild(){return{ngModule:i}}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275mod=$e({type:i})}static{this.\u0275inj=Xe({})}}return i})();var Fi="primary",QQ=Symbol("RouteTitle"),mv=class{params;constructor(e){this.params=e||{}}has(e){return Object.prototype.hasOwnProperty.call(this.params,e)}get(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A[0]:A}return null}getAll(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A:[A]}return[]}get keys(){return Object.keys(this.params)}};function R1(i){return new mv(i)}function Qv(i,e,A){for(let t=0;ti.length||A.pathMatch==="full"&&(e.hasChildren()||t.lengthi.length||A.pathMatch==="full"&&e.hasChildren()&&A.path!=="**")return null;let r={};return!Qv(o,i.slice(0,o.length),r)||!Qv(a,i.slice(i.length-a.length),r)?null:{consumed:i,posParams:r}}function Up(i){return new Promise((e,A)=>{i.pipe(to()).subscribe({next:t=>e(t),error:t=>A(t)})})}function EtA(i,e){if(i.length!==e.length)return!1;for(let A=0;At[o]===n)}else return i===e}function htA(i){return i.length>0?i[i.length-1]:null}function F1(i){return $I(i)?i:w3(i)?_r(Promise.resolve(i)):ie(i)}function cG(i){return $I(i)?Up(i):Promise.resolve(i)}var QtA={exact:dG,subset:BG},CG={exact:utA,subset:ptA,ignored:()=>!0},IG={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},Dv={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"};function tG(i,e,A){return QtA[A.paths](i.root,e.root,A.matrixParams)&&CG[A.queryParams](i.queryParams,e.queryParams)&&!(A.fragment==="exact"&&i.fragment!==e.fragment)}function utA(i,e){return xc(i,e)}function dG(i,e,A){if(!x1(i.segments,e.segments)||!Lp(i.segments,e.segments,A)||i.numberOfChildren!==e.numberOfChildren)return!1;for(let t in e.children)if(!i.children[t]||!dG(i.children[t],e.children[t],A))return!1;return!0}function ptA(i,e){return Object.keys(e).length<=Object.keys(i).length&&Object.keys(e).every(A=>gG(i[A],e[A]))}function BG(i,e,A){return EG(i,e,e.segments,A)}function EG(i,e,A,t){if(i.segments.length>A.length){let n=i.segments.slice(0,A.length);return!(!x1(n,A)||e.hasChildren()||!Lp(n,A,t))}else if(i.segments.length===A.length){if(!x1(i.segments,A)||!Lp(i.segments,A,t))return!1;for(let n in e.children)if(!i.children[n]||!BG(i.children[n],e.children[n],t))return!1;return!0}else{let n=A.slice(0,i.segments.length),o=A.slice(i.segments.length);return!x1(i.segments,n)||!Lp(i.segments,n,t)||!i.children[Fi]?!1:EG(i.children[Fi],e,o,t)}}function Lp(i,e,A){return e.every((t,n)=>CG[A](i[n].parameters,t.parameters))}var Ul=class{root;queryParams;fragment;_queryParamMap;constructor(e=new co([],{}),A={},t=null){this.root=e,this.queryParams=A,this.fragment=t}get queryParamMap(){return this._queryParamMap??=R1(this.queryParams),this._queryParamMap}toString(){return wtA.serialize(this)}},co=class{segments;children;parent=null;constructor(e,A){this.segments=e,this.children=A,Object.values(A).forEach(t=>t.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return Gp(this)}},KC=class{path;parameters;_parameterMap;constructor(e,A){this.path=e,this.parameters=A}get parameterMap(){return this._parameterMap??=R1(this.parameters),this._parameterMap}toString(){return QG(this)}};function ftA(i,e){return x1(i,e)&&i.every((A,t)=>xc(A.parameters,e[t].parameters))}function x1(i,e){return i.length!==e.length?!1:i.every((A,t)=>A.path===e[t].path)}function mtA(i,e){let A=[];return Object.entries(i.children).forEach(([t,n])=>{t===Fi&&(A=A.concat(e(n,t)))}),Object.entries(i.children).forEach(([t,n])=>{t!==Fi&&(A=A.concat(e(n,t)))}),A}var L1=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:()=>new S0,providedIn:"root"})}return i})(),S0=class{parse(e){let A=new vv(e);return new Ul(A.parseRootSegment(),A.parseQueryParams(),A.parseFragment())}serialize(e){let A=`/${rQ(e.root,!0)}`,t=vtA(e.queryParams),n=typeof e.fragment=="string"?`#${DtA(e.fragment)}`:"";return`${A}${t}${n}`}},wtA=new S0;function Gp(i){return i.segments.map(e=>QG(e)).join("/")}function rQ(i,e){if(!i.hasChildren())return Gp(i);if(e){let A=i.children[Fi]?rQ(i.children[Fi],!1):"",t=[];return Object.entries(i.children).forEach(([n,o])=>{n!==Fi&&t.push(`${n}:${rQ(o,!1)}`)}),t.length>0?`${A}(${t.join("//")})`:A}else{let A=mtA(i,(t,n)=>n===Fi?[rQ(i.children[Fi],!1)]:[`${n}:${rQ(t,!1)}`]);return Object.keys(i.children).length===1&&i.children[Fi]!=null?`${Gp(i)}/${A[0]}`:`${Gp(i)}/(${A.join("//")})`}}function hG(i){return encodeURIComponent(i).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function Np(i){return hG(i).replace(/%3B/gi,";")}function DtA(i){return encodeURI(i)}function yv(i){return hG(i).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function Kp(i){return decodeURIComponent(i)}function iG(i){return Kp(i.replace(/\+/g,"%20"))}function QG(i){return`${yv(i.path)}${ytA(i.parameters)}`}function ytA(i){return Object.entries(i).map(([e,A])=>`;${yv(e)}=${yv(A)}`).join("")}function vtA(i){let e=Object.entries(i).map(([A,t])=>Array.isArray(t)?t.map(n=>`${Np(A)}=${Np(n)}`).join("&"):`${Np(A)}=${Np(t)}`).filter(A=>A);return e.length?`?${e.join("&")}`:""}var btA=/^[^\/()?;#]+/;function uv(i){let e=i.match(btA);return e?e[0]:""}var MtA=/^[^\/()?;=#]+/;function StA(i){let e=i.match(MtA);return e?e[0]:""}var ktA=/^[^=?&#]+/;function _tA(i){let e=i.match(ktA);return e?e[0]:""}var xtA=/^[^&#]+/;function RtA(i){let e=i.match(xtA);return e?e[0]:""}var vv=class{url;remaining;constructor(e){this.url=e,this.remaining=e}parseRootSegment(){return this.consumeOptional("/"),this.remaining===""||this.peekStartsWith("?")||this.peekStartsWith("#")?new co([],{}):new co([],this.parseChildren())}parseQueryParams(){let e={};if(this.consumeOptional("?"))do this.parseQueryParam(e);while(this.consumeOptional("&"));return e}parseFragment(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}parseChildren(e=0){if(e>50)throw new St(4010,!1);if(this.remaining==="")return{};this.consumeOptional("/");let A=[];for(this.peekStartsWith("(")||A.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),A.push(this.parseSegment());let t={};this.peekStartsWith("/(")&&(this.capture("/"),t=this.parseParens(!0,e));let n={};return this.peekStartsWith("(")&&(n=this.parseParens(!1,e)),(A.length>0||Object.keys(t).length>0)&&(n[Fi]=new co(A,t)),n}parseSegment(){let e=uv(this.remaining);if(e===""&&this.peekStartsWith(";"))throw new St(4009,!1);return this.capture(e),new KC(Kp(e),this.parseMatrixParams())}parseMatrixParams(){let e={};for(;this.consumeOptional(";");)this.parseParam(e);return e}parseParam(e){let A=StA(this.remaining);if(!A)return;this.capture(A);let t="";if(this.consumeOptional("=")){let n=uv(this.remaining);n&&(t=n,this.capture(t))}e[Kp(A)]=Kp(t)}parseQueryParam(e){let A=_tA(this.remaining);if(!A)return;this.capture(A);let t="";if(this.consumeOptional("=")){let a=RtA(this.remaining);a&&(t=a,this.capture(t))}let n=iG(A),o=iG(t);if(e.hasOwnProperty(n)){let a=e[n];Array.isArray(a)||(a=[a],e[n]=a),a.push(o)}else e[n]=o}parseParens(e,A){let t={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){let n=uv(this.remaining),o=this.remaining[n.length];if(o!=="/"&&o!==")"&&o!==";")throw new St(4010,!1);let a;n.indexOf(":")>-1?(a=n.slice(0,n.indexOf(":")),this.capture(a),this.capture(":")):e&&(a=Fi);let r=this.parseChildren(A+1);t[a??Fi]=Object.keys(r).length===1&&r[Fi]?r[Fi]:new co([],r),this.consumeOptional("//")}return t}peekStartsWith(e){return this.remaining.startsWith(e)}consumeOptional(e){return this.peekStartsWith(e)?(this.remaining=this.remaining.substring(e.length),!0):!1}capture(e){if(!this.consumeOptional(e))throw new St(4011,!1)}};function uG(i){return i.segments.length>0?new co([],{[Fi]:i}):i}function pG(i){let e={};for(let[t,n]of Object.entries(i.children)){let o=pG(n);if(t===Fi&&o.segments.length===0&&o.hasChildren())for(let[a,r]of Object.entries(o.children))e[a]=r;else(o.segments.length>0||o.hasChildren())&&(e[t]=o)}let A=new co(i.segments,e);return NtA(A)}function NtA(i){if(i.numberOfChildren===1&&i.children[Fi]){let e=i.children[Fi];return new co(i.segments.concat(e.segments),e.children)}return i}function Rd(i){return i instanceof Ul}function fG(i,e,A=null,t=null,n=new S0){let o=mG(i);return wG(o,e,A,t,n)}function mG(i){let e;function A(o){let a={};for(let s of o.children){let l=A(s);a[s.outlet]=l}let r=new co(o.url,a);return o===i&&(e=r),r}let t=A(i.root),n=uG(t);return e??n}function wG(i,e,A,t,n){let o=i;for(;o.parent;)o=o.parent;if(e.length===0)return pv(o,o,o,A,t,n);let a=FtA(e);if(a.toRoot())return pv(o,o,new co([],{}),A,t,n);let r=LtA(a,o,i),s=r.processChildren?lQ(r.segmentGroup,r.index,a.commands):yG(r.segmentGroup,r.index,a.commands);return pv(o,r.segmentGroup,s,A,t,n)}function Tp(i){return typeof i=="object"&&i!=null&&!i.outlets&&!i.segmentPath}function cQ(i){return typeof i=="object"&&i!=null&&i.outlets}function nG(i,e,A){i||="\u0275";let t=new Ul;return t.queryParams={[i]:e},A.parse(A.serialize(t)).queryParams[i]}function pv(i,e,A,t,n,o){let a={};for(let[l,g]of Object.entries(t??{}))a[l]=Array.isArray(g)?g.map(C=>nG(l,C,o)):nG(l,g,o);let r;i===e?r=A:r=DG(i,e,A);let s=uG(pG(r));return new Ul(s,a,n)}function DG(i,e,A){let t={};return Object.entries(i.children).forEach(([n,o])=>{o===e?t[n]=A:t[n]=DG(o,e,A)}),new co(i.segments,t)}var Jp=class{isAbsolute;numberOfDoubleDots;commands;constructor(e,A,t){if(this.isAbsolute=e,this.numberOfDoubleDots=A,this.commands=t,e&&t.length>0&&Tp(t[0]))throw new St(4003,!1);let n=t.find(cQ);if(n&&n!==htA(t))throw new St(4004,!1)}toRoot(){return this.isAbsolute&&this.commands.length===1&&this.commands[0]=="/"}};function FtA(i){if(typeof i[0]=="string"&&i.length===1&&i[0]==="/")return new Jp(!0,0,i);let e=0,A=!1,t=i.reduce((n,o,a)=>{if(typeof o=="object"&&o!=null){if(o.outlets){let r={};return Object.entries(o.outlets).forEach(([s,l])=>{r[s]=typeof l=="string"?l.split("/"):l}),[...n,{outlets:r}]}if(o.segmentPath)return[...n,o.segmentPath]}return typeof o!="string"?[...n,o]:a===0?(o.split("/").forEach((r,s)=>{s==0&&r==="."||(s==0&&r===""?A=!0:r===".."?e++:r!=""&&n.push(r))}),n):[...n,o]},[]);return new Jp(A,e,t)}var kd=class{segmentGroup;processChildren;index;constructor(e,A,t){this.segmentGroup=e,this.processChildren=A,this.index=t}};function LtA(i,e,A){if(i.isAbsolute)return new kd(e,!0,0);if(!A)return new kd(e,!1,NaN);if(A.parent===null)return new kd(A,!0,0);let t=Tp(i.commands[0])?0:1,n=A.segments.length-1+t;return GtA(A,n,i.numberOfDoubleDots)}function GtA(i,e,A){let t=i,n=e,o=A;for(;o>n;){if(o-=n,t=t.parent,!t)throw new St(4005,!1);n=t.segments.length}return new kd(t,!1,n-o)}function KtA(i){return cQ(i[0])?i[0].outlets:{[Fi]:i}}function yG(i,e,A){if(i??=new co([],{}),i.segments.length===0&&i.hasChildren())return lQ(i,e,A);let t=UtA(i,e,A),n=A.slice(t.commandIndex);if(t.match&&t.pathIndexo!==Fi)&&i.children[Fi]&&i.numberOfChildren===1&&i.children[Fi].segments.length===0){let o=lQ(i.children[Fi],e,A);return new co(i.segments,o.children)}return Object.entries(t).forEach(([o,a])=>{typeof a=="string"&&(a=[a]),a!==null&&(n[o]=yG(i.children[o],e,a))}),Object.entries(i.children).forEach(([o,a])=>{t[o]===void 0&&(n[o]=a)}),new co(i.segments,n)}}function UtA(i,e,A){let t=0,n=e,o={match:!1,pathIndex:0,commandIndex:0};for(;n=A.length)return o;let a=i.segments[n],r=A[t];if(cQ(r))break;let s=`${r}`,l=t0&&s===void 0)break;if(s&&l&&typeof l=="object"&&l.outlets===void 0){if(!aG(s,l,a))return o;t+=2}else{if(!aG(s,{},a))return o;t++}n++}return{match:!0,pathIndex:n,commandIndex:t}}function bv(i,e,A){let t=i.segments.slice(0,e),n=0;for(;n{typeof t=="string"&&(t=[t]),t!==null&&(e[A]=bv(new co([],{}),0,t))}),e}function oG(i){let e={};return Object.entries(i).forEach(([A,t])=>e[A]=`${t}`),e}function aG(i,e,A){return i==A.path&&xc(e,A.parameters)}var _d="imperative",sr=(function(i){return i[i.NavigationStart=0]="NavigationStart",i[i.NavigationEnd=1]="NavigationEnd",i[i.NavigationCancel=2]="NavigationCancel",i[i.NavigationError=3]="NavigationError",i[i.RoutesRecognized=4]="RoutesRecognized",i[i.ResolveStart=5]="ResolveStart",i[i.ResolveEnd=6]="ResolveEnd",i[i.GuardsCheckStart=7]="GuardsCheckStart",i[i.GuardsCheckEnd=8]="GuardsCheckEnd",i[i.RouteConfigLoadStart=9]="RouteConfigLoadStart",i[i.RouteConfigLoadEnd=10]="RouteConfigLoadEnd",i[i.ChildActivationStart=11]="ChildActivationStart",i[i.ChildActivationEnd=12]="ChildActivationEnd",i[i.ActivationStart=13]="ActivationStart",i[i.ActivationEnd=14]="ActivationEnd",i[i.Scroll=15]="Scroll",i[i.NavigationSkipped=16]="NavigationSkipped",i})(sr||{}),El=class{id;url;constructor(e,A){this.id=e,this.url=A}},UC=class extends El{type=sr.NavigationStart;navigationTrigger;restoredState;constructor(e,A,t="imperative",n=null){super(e,A),this.navigationTrigger=t,this.restoredState=n}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}},Mg=class extends El{urlAfterRedirects;type=sr.NavigationEnd;constructor(e,A,t){super(e,A),this.urlAfterRedirects=t}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}},ts=(function(i){return i[i.Redirect=0]="Redirect",i[i.SupersededByNewNavigation=1]="SupersededByNewNavigation",i[i.NoDataFromResolver=2]="NoDataFromResolver",i[i.GuardRejected=3]="GuardRejected",i[i.Aborted=4]="Aborted",i})(ts||{}),Nd=(function(i){return i[i.IgnoredSameUrlNavigation=0]="IgnoredSameUrlNavigation",i[i.IgnoredByUrlHandlingStrategy=1]="IgnoredByUrlHandlingStrategy",i})(Nd||{}),Kl=class extends El{reason;code;type=sr.NavigationCancel;constructor(e,A,t,n){super(e,A),this.reason=t,this.code=n}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}};function vG(i){return i instanceof Kl&&(i.code===ts.Redirect||i.code===ts.SupersededByNewNavigation)}var Nc=class extends El{reason;code;type=sr.NavigationSkipped;constructor(e,A,t,n){super(e,A),this.reason=t,this.code=n}},N1=class extends El{error;target;type=sr.NavigationError;constructor(e,A,t,n){super(e,A),this.error=t,this.target=n}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}},CQ=class extends El{urlAfterRedirects;state;type=sr.RoutesRecognized;constructor(e,A,t,n){super(e,A),this.urlAfterRedirects=t,this.state=n}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Yp=class extends El{urlAfterRedirects;state;type=sr.GuardsCheckStart;constructor(e,A,t,n){super(e,A),this.urlAfterRedirects=t,this.state=n}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Op=class extends El{urlAfterRedirects;state;shouldActivate;type=sr.GuardsCheckEnd;constructor(e,A,t,n,o){super(e,A),this.urlAfterRedirects=t,this.state=n,this.shouldActivate=o}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}},Hp=class extends El{urlAfterRedirects;state;type=sr.ResolveStart;constructor(e,A,t,n){super(e,A),this.urlAfterRedirects=t,this.state=n}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},zp=class extends El{urlAfterRedirects;state;type=sr.ResolveEnd;constructor(e,A,t,n){super(e,A),this.urlAfterRedirects=t,this.state=n}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Pp=class{route;type=sr.RouteConfigLoadStart;constructor(e){this.route=e}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}},jp=class{route;type=sr.RouteConfigLoadEnd;constructor(e){this.route=e}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}},qp=class{snapshot;type=sr.ChildActivationStart;constructor(e){this.snapshot=e}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},Vp=class{snapshot;type=sr.ChildActivationEnd;constructor(e){this.snapshot=e}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},Wp=class{snapshot;type=sr.ActivationStart;constructor(e){this.snapshot=e}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},Zp=class{snapshot;type=sr.ActivationEnd;constructor(e){this.snapshot=e}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},Fd=class{routerEvent;position;anchor;scrollBehavior;type=sr.Scroll;constructor(e,A,t,n){this.routerEvent=e,this.position=A,this.anchor=t,this.scrollBehavior=n}toString(){let e=this.position?`${this.position[0]}, ${this.position[1]}`:null;return`Scroll(anchor: '${this.anchor}', position: '${e}')`}},Ld=class{},IQ=class{},Gd=class{url;navigationBehaviorOptions;constructor(e,A){this.url=e,this.navigationBehaviorOptions=A}};function JtA(i){return!(i instanceof Ld)&&!(i instanceof Gd)&&!(i instanceof IQ)}var Xp=class{rootInjector;outlet=null;route=null;children;attachRef=null;get injector(){return this.route?.snapshot._environmentInjector??this.rootInjector}constructor(e){this.rootInjector=e,this.children=new G1(this.rootInjector)}},G1=(()=>{class i{rootInjector;contexts=new Map;constructor(A){this.rootInjector=A}onChildOutletCreated(A,t){let n=this.getOrCreateContext(A);n.outlet=t,this.contexts.set(A,n)}onChildOutletDestroyed(A){let t=this.getContext(A);t&&(t.outlet=null,t.attachRef=null)}onOutletDeactivated(){let A=this.contexts;return this.contexts=new Map,A}onOutletReAttached(A){this.contexts=A}getOrCreateContext(A){let t=this.getContext(A);return t||(t=new Xp(this.rootInjector),this.contexts.set(A,t)),t}getContext(A){return this.contexts.get(A)||null}static \u0275fac=function(t){return new(t||i)(Ko(xr))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),$p=class{_root;constructor(e){this._root=e}get root(){return this._root.value}parent(e){let A=this.pathFromRoot(e);return A.length>1?A[A.length-2]:null}children(e){let A=Mv(e,this._root);return A?A.children.map(t=>t.value):[]}firstChild(e){let A=Mv(e,this._root);return A&&A.children.length>0?A.children[0].value:null}siblings(e){let A=Sv(e,this._root);return A.length<2?[]:A[A.length-2].children.map(n=>n.value).filter(n=>n!==e)}pathFromRoot(e){return Sv(e,this._root).map(A=>A.value)}};function Mv(i,e){if(i===e.value)return e;for(let A of e.children){let t=Mv(i,A);if(t)return t}return null}function Sv(i,e){if(i===e.value)return[e];for(let A of e.children){let t=Sv(i,A);if(t.length)return t.unshift(e),t}return[]}var Bl=class{value;children;constructor(e,A){this.value=e,this.children=A}toString(){return`TreeNode(${this.value})`}};function Sd(i){let e={};return i&&i.children.forEach(A=>e[A.value.outlet]=A),e}var dQ=class extends $p{snapshot;constructor(e,A){super(e),this.snapshot=A,Kv(this,e)}toString(){return this.snapshot.toString()}};function bG(i,e){let A=YtA(i,e),t=new ti([new KC("",{})]),n=new ti({}),o=new ti({}),a=new ti({}),r=new ti(""),s=new Ts(t,n,a,r,o,Fi,i,A.root);return s.snapshot=A.root,new dQ(new Bl(s,[]),A)}function YtA(i,e){let A={},t={},n={},a=new Kd([],A,n,"",t,Fi,i,null,{},e);return new BQ("",new Bl(a,[]))}var Ts=class{urlSubject;paramsSubject;queryParamsSubject;fragmentSubject;dataSubject;outlet;component;snapshot;_futureSnapshot;_routerState;_paramMap;_queryParamMap;title;url;params;queryParams;fragment;data;constructor(e,A,t,n,o,a,r,s){this.urlSubject=e,this.paramsSubject=A,this.queryParamsSubject=t,this.fragmentSubject=n,this.dataSubject=o,this.outlet=a,this.component=r,this._futureSnapshot=s,this.title=this.dataSubject?.pipe(ye(l=>l[QQ]))??ie(void 0),this.url=e,this.params=A,this.queryParams=t,this.fragment=n,this.data=o}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=this.params.pipe(ye(e=>R1(e))),this._paramMap}get queryParamMap(){return this._queryParamMap??=this.queryParams.pipe(ye(e=>R1(e))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}};function Gv(i,e,A="emptyOnly"){let t,{routeConfig:n}=i;return e!==null&&(A==="always"||n?.path===""||!e.component&&!e.routeConfig?.loadComponent)?t={params:oA(oA({},e.params),i.params),data:oA(oA({},e.data),i.data),resolve:oA(oA(oA(oA({},i.data),e.data),n?.data),i._resolvedData)}:t={params:oA({},i.params),data:oA({},i.data),resolve:oA(oA({},i.data),i._resolvedData??{})},n&&SG(n)&&(t.resolve[QQ]=n.title),t}var Kd=class{url;params;queryParams;fragment;data;outlet;component;routeConfig;_resolve;_resolvedData;_routerState;_paramMap;_queryParamMap;_environmentInjector;get title(){return this.data?.[QQ]}constructor(e,A,t,n,o,a,r,s,l,g){this.url=e,this.params=A,this.queryParams=t,this.fragment=n,this.data=o,this.outlet=a,this.component=r,this.routeConfig=s,this._resolve=l,this._environmentInjector=g}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=R1(this.params),this._paramMap}get queryParamMap(){return this._queryParamMap??=R1(this.queryParams),this._queryParamMap}toString(){let e=this.url.map(t=>t.toString()).join("/"),A=this.routeConfig?this.routeConfig.path:"";return`Route(url:'${e}', path:'${A}')`}},BQ=class extends $p{url;constructor(e,A){super(A),this.url=e,Kv(this,A)}toString(){return MG(this._root)}};function Kv(i,e){e.value._routerState=i,e.children.forEach(A=>Kv(i,A))}function MG(i){let e=i.children.length>0?` { ${i.children.map(MG).join(", ")} } `:"";return`${i.value}${e}`}function fv(i){if(i.snapshot){let e=i.snapshot,A=i._futureSnapshot;i.snapshot=A,xc(e.queryParams,A.queryParams)||i.queryParamsSubject.next(A.queryParams),e.fragment!==A.fragment&&i.fragmentSubject.next(A.fragment),xc(e.params,A.params)||i.paramsSubject.next(A.params),EtA(e.url,A.url)||i.urlSubject.next(A.url),xc(e.data,A.data)||i.dataSubject.next(A.data)}else i.snapshot=i._futureSnapshot,i.dataSubject.next(i._futureSnapshot.data)}function kv(i,e){let A=xc(i.params,e.params)&&ftA(i.url,e.url),t=!i.parent!=!e.parent;return A&&!t&&(!i.parent||kv(i.parent,e.parent))}function SG(i){return typeof i.title=="string"||i.title===null}var kG=new MA(""),Uv=(()=>{class i{activated=null;get activatedComponentRef(){return this.activated}_activatedRoute=null;name=Fi;activateEvents=new LA;deactivateEvents=new LA;attachEvents=new LA;detachEvents=new LA;routerOutletData=De();parentContexts=w(G1);location=w(So);changeDetector=w(wt);inputBinder=w(uQ,{optional:!0});supportsBindingToComponentInputs=!0;ngOnChanges(A){if(A.name){let{firstChange:t,previousValue:n}=A.name;if(t)return;this.isTrackedInParentContexts(n)&&(this.deactivate(),this.parentContexts.onChildOutletDestroyed(n)),this.initializeOutletWithName()}}ngOnDestroy(){this.isTrackedInParentContexts(this.name)&&this.parentContexts.onChildOutletDestroyed(this.name),this.inputBinder?.unsubscribeFromRouteData(this)}isTrackedInParentContexts(A){return this.parentContexts.getContext(A)?.outlet===this}ngOnInit(){this.initializeOutletWithName()}initializeOutletWithName(){if(this.parentContexts.onChildOutletCreated(this.name,this),this.activated)return;let A=this.parentContexts.getContext(this.name);A?.route&&(A.attachRef?this.attach(A.attachRef,A.route):this.activateWith(A.route,A.injector))}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new St(4012,!1);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new St(4012,!1);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new St(4012,!1);this.location.detach();let A=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(A.instance),A}attach(A,t){this.activated=A,this._activatedRoute=t,this.location.insert(A.hostView),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.attachEvents.emit(A.instance)}deactivate(){if(this.activated){let A=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(A)}}activateWith(A,t){if(this.isActivated)throw new St(4013,!1);this._activatedRoute=A;let n=this.location,a=A.snapshot.component,r=this.parentContexts.getOrCreateContext(this.name).children,s=new _v(A,r,n.injector,this.routerOutletData);this.activated=n.createComponent(a,{index:n.length,injector:s,environmentInjector:t}),this.changeDetector.markForCheck(),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.activateEvents.emit(this.activated.instance)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["router-outlet"]],inputs:{name:"name",routerOutletData:[1,"routerOutletData"]},outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"],features:[Zt]})}return i})(),_v=class{route;childContexts;parent;outletData;constructor(e,A,t,n){this.route=e,this.childContexts=A,this.parent=t,this.outletData=n}get(e,A){return e===Ts?this.route:e===G1?this.childContexts:e===kG?this.outletData:this.parent.get(e,A)}},uQ=new MA(""),Tv=(()=>{class i{outletDataSubscriptions=new Map;bindActivatedRouteToOutletComponent(A){this.unsubscribeFromRouteData(A),this.subscribeToRouteData(A)}unsubscribeFromRouteData(A){this.outletDataSubscriptions.get(A)?.unsubscribe(),this.outletDataSubscriptions.delete(A)}subscribeToRouteData(A){let{activatedRoute:t}=A,n=dr([t.queryParams,t.params,t.data]).pipe(pi(([o,a,r],s)=>(r=oA(oA(oA({},o),a),r),s===0?ie(r):Promise.resolve(r)))).subscribe(o=>{if(!A.isActivated||!A.activatedComponentRef||A.activatedRoute!==t||t.component===null){this.unsubscribeFromRouteData(A);return}let a=dR(t.component);if(!a){this.unsubscribeFromRouteData(A);return}for(let{templateName:r}of a.inputs)A.activatedComponentRef.setInput(r,o[r])});this.outletDataSubscriptions.set(A,n)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac})}return i})(),Jv=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["ng-component"]],exportAs:["emptyRouterOutlet"],decls:1,vars:0,template:function(t,n){t&1&&lA(0,"router-outlet")},dependencies:[Uv],encapsulation:2})}return i})();function Yv(i){let e=i.children&&i.children.map(Yv),A=e?Oe(oA({},i),{children:e}):oA({},i);return!A.component&&!A.loadComponent&&(e||A.loadChildren)&&A.outlet&&A.outlet!==Fi&&(A.component=Jv),A}function OtA(i,e,A){let t=EQ(i,e._root,A?A._root:void 0);return new dQ(t,e)}function EQ(i,e,A){if(A&&i.shouldReuseRoute(e.value,A.value.snapshot)){let t=A.value;t._futureSnapshot=e.value;let n=HtA(i,e,A);return new Bl(t,n)}else{if(i.shouldAttach(e.value)){let o=i.retrieve(e.value);if(o!==null){let a=o.route;return a.value._futureSnapshot=e.value,a.children=e.children.map(r=>EQ(i,r)),a}}let t=ztA(e.value),n=e.children.map(o=>EQ(i,o));return new Bl(t,n)}}function HtA(i,e,A){return e.children.map(t=>{for(let n of A.children)if(i.shouldReuseRoute(t.value,n.value.snapshot))return EQ(i,t,n);return EQ(i,t)})}function ztA(i){return new Ts(new ti(i.url),new ti(i.params),new ti(i.queryParams),new ti(i.fragment),new ti(i.data),i.outlet,i.component,i)}var Ud=class{redirectTo;navigationBehaviorOptions;constructor(e,A){this.redirectTo=e,this.navigationBehaviorOptions=A}},_G="ngNavigationCancelingError";function Af(i,e){let{redirectTo:A,navigationBehaviorOptions:t}=Rd(e)?{redirectTo:e,navigationBehaviorOptions:void 0}:e,n=xG(!1,ts.Redirect);return n.url=A,n.navigationBehaviorOptions=t,n}function xG(i,e){let A=new Error(`NavigationCancelingError: ${i||""}`);return A[_G]=!0,A.cancellationCode=e,A}function PtA(i){return RG(i)&&Rd(i.url)}function RG(i){return!!i&&i[_G]}var xv=class{routeReuseStrategy;futureState;currState;forwardEvent;inputBindingEnabled;constructor(e,A,t,n,o){this.routeReuseStrategy=e,this.futureState=A,this.currState=t,this.forwardEvent=n,this.inputBindingEnabled=o}activate(e){let A=this.futureState._root,t=this.currState?this.currState._root:null;this.deactivateChildRoutes(A,t,e),fv(this.futureState.root),this.activateChildRoutes(A,t,e)}deactivateChildRoutes(e,A,t){let n=Sd(A);e.children.forEach(o=>{let a=o.value.outlet;this.deactivateRoutes(o,n[a],t),delete n[a]}),Object.values(n).forEach(o=>{this.deactivateRouteAndItsChildren(o,t)})}deactivateRoutes(e,A,t){let n=e.value,o=A?A.value:null;if(n===o)if(n.component){let a=t.getContext(n.outlet);a&&this.deactivateChildRoutes(e,A,a.children)}else this.deactivateChildRoutes(e,A,t);else o&&this.deactivateRouteAndItsChildren(A,t)}deactivateRouteAndItsChildren(e,A){e.value.component&&this.routeReuseStrategy.shouldDetach(e.value.snapshot)?this.detachAndStoreRouteSubtree(e,A):this.deactivateRouteAndOutlet(e,A)}detachAndStoreRouteSubtree(e,A){let t=A.getContext(e.value.outlet),n=t&&e.value.component?t.children:A,o=Sd(e);for(let a of Object.values(o))this.deactivateRouteAndItsChildren(a,n);if(t&&t.outlet){let a=t.outlet.detach(),r=t.children.onOutletDeactivated();this.routeReuseStrategy.store(e.value.snapshot,{componentRef:a,route:e,contexts:r})}}deactivateRouteAndOutlet(e,A){let t=A.getContext(e.value.outlet),n=t&&e.value.component?t.children:A,o=Sd(e);for(let a of Object.values(o))this.deactivateRouteAndItsChildren(a,n);t&&(t.outlet&&(t.outlet.deactivate(),t.children.onOutletDeactivated()),t.attachRef=null,t.route=null)}activateChildRoutes(e,A,t){let n=Sd(A);e.children.forEach(o=>{this.activateRoutes(o,n[o.value.outlet],t),this.forwardEvent(new Zp(o.value.snapshot))}),e.children.length&&this.forwardEvent(new Vp(e.value.snapshot))}activateRoutes(e,A,t){let n=e.value,o=A?A.value:null;if(fv(n),n===o)if(n.component){let a=t.getOrCreateContext(n.outlet);this.activateChildRoutes(e,A,a.children)}else this.activateChildRoutes(e,A,t);else if(n.component){let a=t.getOrCreateContext(n.outlet);if(this.routeReuseStrategy.shouldAttach(n.snapshot)){let r=this.routeReuseStrategy.retrieve(n.snapshot);this.routeReuseStrategy.store(n.snapshot,null),a.children.onOutletReAttached(r.contexts),a.attachRef=r.componentRef,a.route=r.route.value,a.outlet&&a.outlet.attach(r.componentRef,r.route.value),fv(r.route.value),this.activateChildRoutes(e,null,a.children)}else a.attachRef=null,a.route=n,a.outlet&&a.outlet.activateWith(n,a.injector),this.activateChildRoutes(e,null,a.children)}else this.activateChildRoutes(e,null,t)}},ef=class{path;route;constructor(e){this.path=e,this.route=this.path[this.path.length-1]}},xd=class{component;route;constructor(e,A){this.component=e,this.route=A}};function jtA(i,e,A){let t=i._root,n=e?e._root:null;return sQ(t,n,A,[t.value])}function qtA(i){let e=i.routeConfig?i.routeConfig.canActivateChild:null;return!e||e.length===0?null:{node:i,guards:e}}function Jd(i,e){let A=Symbol(),t=e.get(i,A);return t===A?typeof i=="function"&&!Wx(i)?i:e.get(i):t}function sQ(i,e,A,t,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=Sd(e);return i.children.forEach(a=>{VtA(a,o[a.value.outlet],A,t.concat([a.value]),n),delete o[a.value.outlet]}),Object.entries(o).forEach(([a,r])=>gQ(r,A.getContext(a),n)),n}function VtA(i,e,A,t,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=i.value,a=e?e.value:null,r=A?A.getContext(i.value.outlet):null;if(a&&o.routeConfig===a.routeConfig){let s=WtA(a,o,o.routeConfig.runGuardsAndResolvers);s?n.canActivateChecks.push(new ef(t)):(o.data=a.data,o._resolvedData=a._resolvedData),o.component?sQ(i,e,r?r.children:null,t,n):sQ(i,e,A,t,n),s&&r&&r.outlet&&r.outlet.isActivated&&n.canDeactivateChecks.push(new xd(r.outlet.component,a))}else a&&gQ(e,r,n),n.canActivateChecks.push(new ef(t)),o.component?sQ(i,null,r?r.children:null,t,n):sQ(i,null,A,t,n);return n}function WtA(i,e,A){if(typeof A=="function")return Br(e._environmentInjector,()=>A(i,e));switch(A){case"pathParamsChange":return!x1(i.url,e.url);case"pathParamsOrQueryParamsChange":return!x1(i.url,e.url)||!xc(i.queryParams,e.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!kv(i,e)||!xc(i.queryParams,e.queryParams);default:return!kv(i,e)}}function gQ(i,e,A){let t=Sd(i),n=i.value;Object.entries(t).forEach(([o,a])=>{n.component?e?gQ(a,e.children.getContext(o),A):gQ(a,null,A):gQ(a,e,A)}),n.component?e&&e.outlet&&e.outlet.isActivated?A.canDeactivateChecks.push(new xd(e.outlet.component,n)):A.canDeactivateChecks.push(new xd(null,n)):A.canDeactivateChecks.push(new xd(null,n))}function pQ(i){return typeof i=="function"}function ZtA(i){return typeof i=="boolean"}function XtA(i){return i&&pQ(i.canLoad)}function $tA(i){return i&&pQ(i.canActivate)}function AiA(i){return i&&pQ(i.canActivateChild)}function eiA(i){return i&&pQ(i.canDeactivate)}function tiA(i){return i&&pQ(i.canMatch)}function NG(i){return i instanceof zx||i?.name==="EmptyError"}var Fp=Symbol("INITIAL_VALUE");function Td(){return pi(i=>dr(i.map(e=>e.pipe(po(1),kn(Fp)))).pipe(ye(e=>{for(let A of e)if(A!==!0){if(A===Fp)return Fp;if(A===!1||iiA(A))return A}return!0}),Ct(e=>e!==Fp),po(1)))}function iiA(i){return Rd(i)||i instanceof Ud}function FG(i){return i.aborted?ie(void 0).pipe(po(1)):new bi(e=>{let A=()=>{e.next(),e.complete()};return i.addEventListener("abort",A),()=>i.removeEventListener("abort",A)})}function LG(i){return ut(FG(i))}function niA(i){return Qc(e=>{let{targetSnapshot:A,currentSnapshot:t,guards:{canActivateChecks:n,canDeactivateChecks:o}}=e;return o.length===0&&n.length===0?ie(Oe(oA({},e),{guardsResult:!0})):oiA(o,A,t).pipe(Qc(a=>a&&ZtA(a)?aiA(A,n,i):ie(a)),ye(a=>Oe(oA({},e),{guardsResult:a})))})}function oiA(i,e,A){return _r(i).pipe(Qc(t=>ciA(t.component,t.route,A,e)),to(t=>t!==!0,!0))}function aiA(i,e,A){return _r(e).pipe(Qh(t=>C3(siA(t.route.parent,A),riA(t.route,A),giA(i,t.path),liA(i,t.route))),to(t=>t!==!0,!0))}function riA(i,e){return i!==null&&e&&e(new Wp(i)),ie(!0)}function siA(i,e){return i!==null&&e&&e(new qp(i)),ie(!0)}function liA(i,e){let A=e.routeConfig?e.routeConfig.canActivate:null;if(!A||A.length===0)return ie(!0);let t=A.map(n=>uc(()=>{let o=e._environmentInjector,a=Jd(n,o),r=$tA(a)?a.canActivate(e,i):Br(o,()=>a(e,i));return F1(r).pipe(to())}));return ie(t).pipe(Td())}function giA(i,e){let A=e[e.length-1],n=e.slice(0,e.length-1).reverse().map(o=>qtA(o)).filter(o=>o!==null).map(o=>uc(()=>{let a=o.guards.map(r=>{let s=o.node._environmentInjector,l=Jd(r,s),g=AiA(l)?l.canActivateChild(A,i):Br(s,()=>l(A,i));return F1(g).pipe(to())});return ie(a).pipe(Td())}));return ie(n).pipe(Td())}function ciA(i,e,A,t){let n=e&&e.routeConfig?e.routeConfig.canDeactivate:null;if(!n||n.length===0)return ie(!0);let o=n.map(a=>{let r=e._environmentInjector,s=Jd(a,r),l=eiA(s)?s.canDeactivate(i,e,A,t):Br(r,()=>s(i,e,A,t));return F1(l).pipe(to())});return ie(o).pipe(Td())}function CiA(i,e,A,t,n){let o=e.canLoad;if(o===void 0||o.length===0)return ie(!0);let a=o.map(r=>{let s=Jd(r,i),l=XtA(s)?s.canLoad(e,A):Br(i,()=>s(e,A)),g=F1(l);return n?g.pipe(LG(n)):g});return ie(a).pipe(Td(),GG(t))}function GG(i){return Yx(Ei(e=>{if(typeof e!="boolean")throw Af(i,e)}),ye(e=>e===!0))}function IiA(i,e,A,t,n,o){let a=e.canMatch;if(!a||a.length===0)return ie(!0);let r=a.map(s=>{let l=Jd(s,i),g=tiA(l)?l.canMatch(e,A,n):Br(i,()=>l(e,A,n));return F1(g).pipe(LG(o))});return ie(r).pipe(Td(),GG(t))}var M0=class i extends Error{segmentGroup;constructor(e){super(),this.segmentGroup=e||null,Object.setPrototypeOf(this,i.prototype)}},hQ=class i extends Error{urlTree;constructor(e){super(),this.urlTree=e,Object.setPrototypeOf(this,i.prototype)}};function diA(i){throw new St(4e3,!1)}function BiA(i){throw xG(!1,ts.GuardRejected)}var Rv=class{urlSerializer;urlTree;constructor(e,A){this.urlSerializer=e,this.urlTree=A}lineralizeSegments(e,A){return Ie(this,null,function*(){let t=[],n=A.root;for(;;){if(t=t.concat(n.segments),n.numberOfChildren===0)return t;if(n.numberOfChildren>1||!n.children[Fi])throw diA(`${e.redirectTo}`);n=n.children[Fi]}})}applyRedirectCommands(e,A,t,n,o){return Ie(this,null,function*(){let a=yield EiA(A,n,o);if(a instanceof Ul)throw new hQ(a);let r=this.applyRedirectCreateUrlTree(a,this.urlSerializer.parse(a),e,t);if(a[0]==="/")throw new hQ(r);return r})}applyRedirectCreateUrlTree(e,A,t,n){let o=this.createSegmentGroup(e,A.root,t,n);return new Ul(o,this.createQueryParams(A.queryParams,this.urlTree.queryParams),A.fragment)}createQueryParams(e,A){let t={};return Object.entries(e).forEach(([n,o])=>{if(typeof o=="string"&&o[0]===":"){let r=o.substring(1);t[n]=A[r]}else t[n]=o}),t}createSegmentGroup(e,A,t,n){let o=this.createSegments(e,A.segments,t,n),a={};return Object.entries(A.children).forEach(([r,s])=>{a[r]=this.createSegmentGroup(e,s,t,n)}),new co(o,a)}createSegments(e,A,t,n){return A.map(o=>o.path[0]===":"?this.findPosParam(e,o,n):this.findOrReturn(o,t))}findPosParam(e,A,t){let n=t[A.path.substring(1)];if(!n)throw new St(4001,!1);return n}findOrReturn(e,A){let t=0;for(let n of A){if(n.path===e.path)return A.splice(t),n;t++}return e}};function EiA(i,e,A){if(typeof i=="string")return Promise.resolve(i);let t=i;return Up(F1(Br(A,()=>t(e))))}function hiA(i,e){return i.providers&&!i._injector&&(i._injector=p3(i.providers,e,`Route: ${i.path}`)),i._injector??e}function Rc(i){return i.outlet||Fi}function QiA(i,e){let A=i.filter(t=>Rc(t)===e);return A.push(...i.filter(t=>Rc(t)!==e)),A}var Nv={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function KG(i){return{routeConfig:i.routeConfig,url:i.url,params:i.params,queryParams:i.queryParams,fragment:i.fragment,data:i.data,outlet:i.outlet,title:i.title,paramMap:i.paramMap,queryParamMap:i.queryParamMap}}function uiA(i,e,A,t,n,o,a){let r=UG(i,e,A);if(!r.matched)return ie(r);let s=KG(o(r));return t=hiA(e,t),IiA(t,e,A,n,s,a).pipe(ye(l=>l===!0?r:oA({},Nv)))}function UG(i,e,A){if(e.path==="")return e.pathMatch==="full"&&(i.hasChildren()||A.length>0)?oA({},Nv):{matched:!0,consumedSegments:[],remainingSegments:A,parameters:{},positionalParamSegments:{}};let n=(e.matcher||lG)(A,i,e);if(!n)return oA({},Nv);let o={};Object.entries(n.posParams??{}).forEach(([r,s])=>{o[r]=s.path});let a=n.consumed.length>0?oA(oA({},o),n.consumed[n.consumed.length-1].parameters):o;return{matched:!0,consumedSegments:n.consumed,remainingSegments:A.slice(n.consumed.length),parameters:a,positionalParamSegments:n.posParams??{}}}function rG(i,e,A,t){return A.length>0&&miA(i,A,t)?{segmentGroup:new co(e,fiA(t,new co(A,i.children))),slicedSegments:[]}:A.length===0&&wiA(i,A,t)?{segmentGroup:new co(i.segments,piA(i,A,t,i.children)),slicedSegments:A}:{segmentGroup:new co(i.segments,i.children),slicedSegments:A}}function piA(i,e,A,t){let n={};for(let o of A)if(nf(i,e,o)&&!t[Rc(o)]){let a=new co([],{});n[Rc(o)]=a}return oA(oA({},t),n)}function fiA(i,e){let A={};A[Fi]=e;for(let t of i)if(t.path===""&&Rc(t)!==Fi){let n=new co([],{});A[Rc(t)]=n}return A}function miA(i,e,A){return A.some(t=>nf(i,e,t)&&Rc(t)!==Fi)}function wiA(i,e,A){return A.some(t=>nf(i,e,t))}function nf(i,e,A){return(i.hasChildren()||e.length>0)&&A.pathMatch==="full"?!1:A.path===""}function DiA(i,e,A){return e.length===0&&!i.children[A]}var Fv=class{};function yiA(i,e,A,t,n,o,a="emptyOnly",r){return Ie(this,null,function*(){return new Lv(i,e,A,t,n,a,o,r).recognize()})}var viA=31,Lv=class{injector;configLoader;rootComponentType;config;urlTree;paramsInheritanceStrategy;urlSerializer;abortSignal;applyRedirects;absoluteRedirectCount=0;allowRedirects=!0;constructor(e,A,t,n,o,a,r,s){this.injector=e,this.configLoader=A,this.rootComponentType=t,this.config=n,this.urlTree=o,this.paramsInheritanceStrategy=a,this.urlSerializer=r,this.abortSignal=s,this.applyRedirects=new Rv(this.urlSerializer,this.urlTree)}noMatchError(e){return new St(4002,`'${e.segmentGroup}'`)}recognize(){return Ie(this,null,function*(){let e=rG(this.urlTree.root,[],[],this.config).segmentGroup,{children:A,rootSnapshot:t}=yield this.match(e),n=new Bl(t,A),o=new BQ("",n),a=fG(t,[],this.urlTree.queryParams,this.urlTree.fragment);return a.queryParams=this.urlTree.queryParams,o.url=this.urlSerializer.serialize(a),{state:o,tree:a}})}match(e){return Ie(this,null,function*(){let A=new Kd([],Object.freeze({}),Object.freeze(oA({},this.urlTree.queryParams)),this.urlTree.fragment,Object.freeze({}),Fi,this.rootComponentType,null,{},this.injector);try{return{children:yield this.processSegmentGroup(this.injector,this.config,e,Fi,A),rootSnapshot:A}}catch(t){if(t instanceof hQ)return this.urlTree=t.urlTree,this.match(t.urlTree.root);throw t instanceof M0?this.noMatchError(t):t}})}processSegmentGroup(e,A,t,n,o){return Ie(this,null,function*(){if(t.segments.length===0&&t.hasChildren())return this.processChildren(e,A,t,o);let a=yield this.processSegment(e,A,t,t.segments,n,!0,o);return a instanceof Bl?[a]:[]})}processChildren(e,A,t,n){return Ie(this,null,function*(){let o=[];for(let s of Object.keys(t.children))s==="primary"?o.unshift(s):o.push(s);let a=[];for(let s of o){let l=t.children[s],g=QiA(A,s),C=yield this.processSegmentGroup(e,g,l,s,n);a.push(...C)}let r=TG(a);return biA(r),r})}processSegment(e,A,t,n,o,a,r){return Ie(this,null,function*(){for(let s of A)try{return yield this.processSegmentAgainstRoute(s._injector??e,A,s,t,n,o,a,r)}catch(l){if(l instanceof M0||NG(l))continue;throw l}if(DiA(t,n,o))return new Fv;throw new M0(t)})}processSegmentAgainstRoute(e,A,t,n,o,a,r,s){return Ie(this,null,function*(){if(Rc(t)!==a&&(a===Fi||!nf(n,o,t)))throw new M0(n);if(t.redirectTo===void 0)return this.matchSegmentAgainstRoute(e,n,t,o,a,s);if(this.allowRedirects&&r)return this.expandSegmentAgainstRouteUsingRedirect(e,n,A,t,o,a,s);throw new M0(n)})}expandSegmentAgainstRouteUsingRedirect(e,A,t,n,o,a,r){return Ie(this,null,function*(){let{matched:s,parameters:l,consumedSegments:g,positionalParamSegments:C,remainingSegments:I}=UG(A,n,o);if(!s)throw new M0(A);typeof n.redirectTo=="string"&&n.redirectTo[0]==="/"&&(this.absoluteRedirectCount++,this.absoluteRedirectCount>viA&&(this.allowRedirects=!1));let B=this.createSnapshot(e,n,o,l,r);if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let Q=yield this.applyRedirects.applyRedirectCommands(g,n.redirectTo,C,KG(B),e),h=yield this.applyRedirects.lineralizeSegments(n,Q);return this.processSegment(e,t,A,h.concat(I),a,!1,r)})}createSnapshot(e,A,t,n,o){let a=new Kd(t,n,Object.freeze(oA({},this.urlTree.queryParams)),this.urlTree.fragment,SiA(A),Rc(A),A.component??A._loadedComponent??null,A,kiA(A),e),r=Gv(a,o,this.paramsInheritanceStrategy);return a.params=Object.freeze(r.params),a.data=Object.freeze(r.data),a}matchSegmentAgainstRoute(e,A,t,n,o,a){return Ie(this,null,function*(){if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let r=S=>this.createSnapshot(e,t,S.consumedSegments,S.parameters,a),s=yield Up(uiA(A,t,n,e,this.urlSerializer,r,this.abortSignal));if(t.path==="**"&&(A.children={}),!s?.matched)throw new M0(A);e=t._injector??e;let{routes:l}=yield this.getChildConfig(e,t,n),g=t._loadedInjector??e,{parameters:C,consumedSegments:I,remainingSegments:B}=s,Q=this.createSnapshot(e,t,I,C,a),{segmentGroup:h,slicedSegments:f}=rG(A,I,B,l);if(f.length===0&&h.hasChildren()){let S=yield this.processChildren(g,l,h,Q);return new Bl(Q,S)}if(l.length===0&&f.length===0)return new Bl(Q,[]);let m=Rc(t)===o,v=yield this.processSegment(g,l,h,f,m?Fi:o,!0,Q);return new Bl(Q,v instanceof Bl?[v]:[])})}getChildConfig(e,A,t){return Ie(this,null,function*(){if(A.children)return{routes:A.children,injector:e};if(A.loadChildren){if(A._loadedRoutes!==void 0){let o=A._loadedNgModuleFactory;return o&&!A._loadedInjector&&(A._loadedInjector=o.create(e).injector),{routes:A._loadedRoutes,injector:A._loadedInjector}}if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);if(yield Up(CiA(e,A,t,this.urlSerializer,this.abortSignal))){let o=yield this.configLoader.loadChildren(e,A);return A._loadedRoutes=o.routes,A._loadedInjector=o.injector,A._loadedNgModuleFactory=o.factory,o}throw BiA(A)}return{routes:[],injector:e}})}};function biA(i){i.sort((e,A)=>e.value.outlet===Fi?-1:A.value.outlet===Fi?1:e.value.outlet.localeCompare(A.value.outlet))}function MiA(i){let e=i.value.routeConfig;return e&&e.path===""}function TG(i){let e=[],A=new Set;for(let t of i){if(!MiA(t)){e.push(t);continue}let n=e.find(o=>t.value.routeConfig===o.value.routeConfig);n!==void 0?(n.children.push(...t.children),A.add(n)):e.push(t)}for(let t of A){let n=TG(t.children);e.push(new Bl(t.value,n))}return e.filter(t=>!A.has(t))}function SiA(i){return i.data||{}}function kiA(i){return i.resolve||{}}function _iA(i,e,A,t,n,o,a){return Qc(r=>Ie(null,null,function*(){let{state:s,tree:l}=yield yiA(i,e,A,t,r.extractedUrl,n,o,a);return Oe(oA({},r),{targetSnapshot:s,urlAfterRedirects:l})}))}function xiA(i){return Qc(e=>{let{targetSnapshot:A,guards:{canActivateChecks:t}}=e;if(!t.length)return ie(e);let n=new Set(t.map(r=>r.route)),o=new Set;for(let r of n)if(!o.has(r))for(let s of JG(r))o.add(s);let a=0;return _r(o).pipe(Qh(r=>n.has(r)?RiA(r,A,i):(r.data=Gv(r,r.parent,i).resolve,ie(void 0))),Ei(()=>a++),MD(1),Qc(r=>a===o.size?ie(e):nr))})}function JG(i){let e=i.children.map(A=>JG(A)).flat();return[i,...e]}function RiA(i,e,A){let t=i.routeConfig,n=i._resolve;return t?.title!==void 0&&!SG(t)&&(n[QQ]=t.title),uc(()=>(i.data=Gv(i,i.parent,A).resolve,NiA(n,i,e).pipe(ye(o=>(i._resolvedData=o,i.data=oA(oA({},i.data),o),null)))))}function NiA(i,e,A){let t=wv(i);if(t.length===0)return ie({});let n={};return _r(t).pipe(Qc(o=>FiA(i[o],e,A).pipe(to(),Ei(a=>{if(a instanceof Ud)throw Af(new S0,a);n[o]=a}))),MD(1),ye(()=>n),qo(o=>NG(o)?nr:g3(o)))}function FiA(i,e,A){let t=e._environmentInjector,n=Jd(i,t),o=n.resolve?n.resolve(e,A):Br(t,()=>n(e,A));return F1(o)}function sG(i){return pi(e=>{let A=i(e);return A?_r(A).pipe(ye(()=>e)):ie(e)})}var Ov=(()=>{class i{buildTitle(A){let t,n=A.root;for(;n!==void 0;)t=this.getResolvedTitleForRoute(n)??t,n=n.children.find(o=>o.outlet===Fi);return t}getResolvedTitleForRoute(A){return A.data[QQ]}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:()=>w(YG),providedIn:"root"})}return i})(),YG=(()=>{class i extends Ov{title;constructor(A){super(),this.title=A}updateTitle(A){let t=this.buildTitle(A);t!==void 0&&this.title.setTitle(t)}static \u0275fac=function(t){return new(t||i)(Ko(DR))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),K1=new MA("",{factory:()=>({})}),Yd=new MA(""),of=(()=>{class i{componentLoaders=new WeakMap;childrenLoaders=new WeakMap;onLoadStartListener;onLoadEndListener;compiler=w(rR);loadComponent(A,t){return Ie(this,null,function*(){if(this.componentLoaders.get(t))return this.componentLoaders.get(t);if(t._loadedComponent)return Promise.resolve(t._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(t);let n=Ie(this,null,function*(){try{let o=yield cG(Br(A,()=>t.loadComponent())),a=yield zG(HG(o));return this.onLoadEndListener&&this.onLoadEndListener(t),t._loadedComponent=a,a}finally{this.componentLoaders.delete(t)}});return this.componentLoaders.set(t,n),n})}loadChildren(A,t){if(this.childrenLoaders.get(t))return this.childrenLoaders.get(t);if(t._loadedRoutes)return Promise.resolve({routes:t._loadedRoutes,injector:t._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(t);let n=Ie(this,null,function*(){try{let o=yield OG(t,this.compiler,A,this.onLoadEndListener);return t._loadedRoutes=o.routes,t._loadedInjector=o.injector,t._loadedNgModuleFactory=o.factory,o}finally{this.childrenLoaders.delete(t)}});return this.childrenLoaders.set(t,n),n}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function OG(i,e,A,t){return Ie(this,null,function*(){let n=yield cG(Br(A,()=>i.loadChildren())),o=yield zG(HG(n)),a;o instanceof tR||Array.isArray(o)?a=o:a=yield e.compileModuleAsync(o),t&&t(i);let r,s,l=!1,g;return Array.isArray(a)?(s=a,l=!0):(r=a.create(A).injector,g=a,s=r.get(Yd,[],{optional:!0,self:!0}).flat()),{routes:s.map(Yv),injector:r,factory:g}})}function LiA(i){return i&&typeof i=="object"&&"default"in i}function HG(i){return LiA(i)?i.default:i}function zG(i){return Ie(this,null,function*(){return i})}var af=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:()=>w(GiA),providedIn:"root"})}return i})(),GiA=(()=>{class i{shouldProcessUrl(A){return!0}extract(A){return A}merge(A,t){return A}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),Hv=new MA(""),zv=new MA("");function PG(i,e,A){let t=i.get(zv),n=i.get(ii);if(!n.startViewTransition||t.skipNextTransition)return t.skipNextTransition=!1,new Promise(l=>setTimeout(l));let o,a=new Promise(l=>{o=l}),r=n.startViewTransition(()=>(o(),KiA(i)));r.updateCallbackDone.catch(l=>{}),r.ready.catch(l=>{}),r.finished.catch(l=>{});let{onViewTransitionCreated:s}=t;return s&&Br(i,()=>s({transition:r,from:e,to:A})),a}function KiA(i){return new Promise(e=>{jn({read:()=>setTimeout(e)},{injector:i})})}var UiA=()=>{},Pv=new MA(""),rf=(()=>{class i{currentNavigation=mA(null,{equal:()=>!1});currentTransition=null;lastSuccessfulNavigation=mA(null);events=new te;transitionAbortWithErrorSubject=new te;configLoader=w(of);environmentInjector=w(xr);destroyRef=w(ar);urlSerializer=w(L1);rootContexts=w(G1);location=w(Dc);inputBindingEnabled=w(uQ,{optional:!0})!==null;titleStrategy=w(Ov);options=w(K1,{optional:!0})||{};paramsInheritanceStrategy=this.options.paramsInheritanceStrategy||"emptyOnly";urlHandlingStrategy=w(af);createViewTransition=w(Hv,{optional:!0});navigationErrorHandler=w(Pv,{optional:!0});navigationId=0;get hasRequestedNavigation(){return this.navigationId!==0}transitions;afterPreactivation=()=>ie(void 0);rootComponentType=null;destroyed=!1;constructor(){let A=n=>this.events.next(new Pp(n)),t=n=>this.events.next(new jp(n));this.configLoader.onLoadEndListener=t,this.configLoader.onLoadStartListener=A,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}complete(){this.transitions?.complete()}handleNavigationRequest(A){let t=++this.navigationId;ca(()=>{this.transitions?.next(Oe(oA({},A),{extractedUrl:this.urlHandlingStrategy.extract(A.rawUrl),targetSnapshot:null,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null,id:t,routesRecognizeHandler:{},beforeActivateHandler:{}}))})}setupNavigations(A){return this.transitions=new ti(null),this.transitions.pipe(Ct(t=>t!==null),pi(t=>{let n=!1,o=new AbortController,a=()=>!n&&this.currentTransition?.id===t.id;return ie(t).pipe(pi(r=>{if(this.navigationId>t.id)return this.cancelNavigationTransition(t,"",ts.SupersededByNewNavigation),nr;this.currentTransition=t;let s=this.lastSuccessfulNavigation();this.currentNavigation.set({id:r.id,initialUrl:r.rawUrl,extractedUrl:r.extractedUrl,targetBrowserUrl:typeof r.extras.browserUrl=="string"?this.urlSerializer.parse(r.extras.browserUrl):r.extras.browserUrl,trigger:r.source,extras:r.extras,previousNavigation:s?Oe(oA({},s),{previousNavigation:null}):null,abort:()=>o.abort(),routesRecognizeHandler:r.routesRecognizeHandler,beforeActivateHandler:r.beforeActivateHandler});let l=!A.navigated||this.isUpdatingInternalState()||this.isUpdatedBrowserUrl(),g=r.extras.onSameUrlNavigation??A.onSameUrlNavigation;if(!l&&g!=="reload")return this.events.next(new Nc(r.id,this.urlSerializer.serialize(r.rawUrl),"",Nd.IgnoredSameUrlNavigation)),r.resolve(!1),nr;if(this.urlHandlingStrategy.shouldProcessUrl(r.rawUrl))return ie(r).pipe(pi(C=>(this.events.next(new UC(C.id,this.urlSerializer.serialize(C.extractedUrl),C.source,C.restoredState)),C.id!==this.navigationId?nr:Promise.resolve(C))),_iA(this.environmentInjector,this.configLoader,this.rootComponentType,A.config,this.urlSerializer,this.paramsInheritanceStrategy,o.signal),Ei(C=>{t.targetSnapshot=C.targetSnapshot,t.urlAfterRedirects=C.urlAfterRedirects,this.currentNavigation.update(I=>(I.finalUrl=C.urlAfterRedirects,I)),this.events.next(new IQ)}),pi(C=>_r(t.routesRecognizeHandler.deferredHandle??ie(void 0)).pipe(ye(()=>C))),Ei(()=>{let C=new CQ(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(C)}));if(l&&this.urlHandlingStrategy.shouldProcessUrl(r.currentRawUrl)){let{id:C,extractedUrl:I,source:B,restoredState:Q,extras:h}=r,f=new UC(C,this.urlSerializer.serialize(I),B,Q);this.events.next(f);let m=bG(this.rootComponentType,this.environmentInjector).snapshot;return this.currentTransition=t=Oe(oA({},r),{targetSnapshot:m,urlAfterRedirects:I,extras:Oe(oA({},h),{skipLocationChange:!1,replaceUrl:!1})}),this.currentNavigation.update(v=>(v.finalUrl=I,v)),ie(t)}else return this.events.next(new Nc(r.id,this.urlSerializer.serialize(r.extractedUrl),"",Nd.IgnoredByUrlHandlingStrategy)),r.resolve(!1),nr}),ye(r=>{let s=new Yp(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);return this.events.next(s),this.currentTransition=t=Oe(oA({},r),{guards:jtA(r.targetSnapshot,r.currentSnapshot,this.rootContexts)}),t}),niA(r=>this.events.next(r)),pi(r=>{if(t.guardsResult=r.guardsResult,r.guardsResult&&typeof r.guardsResult!="boolean")throw Af(this.urlSerializer,r.guardsResult);let s=new Op(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot,!!r.guardsResult);if(this.events.next(s),!a())return nr;if(!r.guardsResult)return this.cancelNavigationTransition(r,"",ts.GuardRejected),nr;if(r.guards.canActivateChecks.length===0)return ie(r);let l=new Hp(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);if(this.events.next(l),!a())return nr;let g=!1;return ie(r).pipe(xiA(this.paramsInheritanceStrategy),Ei({next:()=>{g=!0;let C=new zp(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(C)},complete:()=>{g||this.cancelNavigationTransition(r,"",ts.NoDataFromResolver)}}))}),sG(r=>{let s=g=>{let C=[];if(g.routeConfig?._loadedComponent)g.component=g.routeConfig?._loadedComponent;else if(g.routeConfig?.loadComponent){let I=g._environmentInjector;C.push(this.configLoader.loadComponent(I,g.routeConfig).then(B=>{g.component=B}))}for(let I of g.children)C.push(...s(I));return C},l=s(r.targetSnapshot.root);return l.length===0?ie(r):_r(Promise.all(l).then(()=>r))}),sG(()=>this.afterPreactivation()),pi(()=>{let{currentSnapshot:r,targetSnapshot:s}=t,l=this.createViewTransition?.(this.environmentInjector,r.root,s.root);return l?_r(l).pipe(ye(()=>t)):ie(t)}),po(1),pi(r=>{let s=OtA(A.routeReuseStrategy,r.targetSnapshot,r.currentRouterState);this.currentTransition=t=r=Oe(oA({},r),{targetRouterState:s}),this.currentNavigation.update(g=>(g.targetRouterState=s,g)),this.events.next(new Ld);let l=t.beforeActivateHandler.deferredHandle;return l?_r(l.then(()=>r)):ie(r)}),Ei(r=>{new xv(A.routeReuseStrategy,t.targetRouterState,t.currentRouterState,s=>this.events.next(s),this.inputBindingEnabled).activate(this.rootContexts),a()&&(n=!0,this.currentNavigation.update(s=>(s.abort=UiA,s)),this.lastSuccessfulNavigation.set(ca(this.currentNavigation)),this.events.next(new Mg(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects))),this.titleStrategy?.updateTitle(r.targetRouterState.snapshot),r.resolve(!0))}),ut(FG(o.signal).pipe(Ct(()=>!n&&!t.targetRouterState),Ei(()=>{this.cancelNavigationTransition(t,o.signal.reason+"",ts.Aborted)}))),Ei({complete:()=>{n=!0}}),ut(this.transitionAbortWithErrorSubject.pipe(Ei(r=>{throw r}))),d3(()=>{o.abort(),n||this.cancelNavigationTransition(t,"",ts.SupersededByNewNavigation),this.currentTransition?.id===t.id&&(this.currentNavigation.set(null),this.currentTransition=null)}),qo(r=>{if(n=!0,this.destroyed)return t.resolve(!1),nr;if(RG(r))this.events.next(new Kl(t.id,this.urlSerializer.serialize(t.extractedUrl),r.message,r.cancellationCode)),PtA(r)?this.events.next(new Gd(r.url,r.navigationBehaviorOptions)):t.resolve(!1);else{let s=new N1(t.id,this.urlSerializer.serialize(t.extractedUrl),r,t.targetSnapshot??void 0);try{let l=Br(this.environmentInjector,()=>this.navigationErrorHandler?.(s));if(l instanceof Ud){let{message:g,cancellationCode:C}=Af(this.urlSerializer,l);this.events.next(new Kl(t.id,this.urlSerializer.serialize(t.extractedUrl),g,C)),this.events.next(new Gd(l.redirectTo,l.navigationBehaviorOptions))}else throw this.events.next(s),r}catch(l){this.options.resolveNavigationPromiseOnError?t.resolve(!1):t.reject(l)}}return nr}))}))}cancelNavigationTransition(A,t,n){let o=new Kl(A.id,this.urlSerializer.serialize(A.extractedUrl),t,n);this.events.next(o),A.resolve(!1)}isUpdatingInternalState(){return this.currentTransition?.extractedUrl.toString()!==this.currentTransition?.currentUrlTree.toString()}isUpdatedBrowserUrl(){let A=this.urlHandlingStrategy.extract(this.urlSerializer.parse(this.location.path(!0))),t=ca(this.currentNavigation),n=t?.targetBrowserUrl??t?.extractedUrl;return A.toString()!==n?.toString()&&!t?.extras.skipLocationChange}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function TiA(i){return i!==_d}var jG=new MA("");var qG=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:()=>w(JiA),providedIn:"root"})}return i})(),tf=class{shouldDetach(e){return!1}store(e,A){}shouldAttach(e){return!1}retrieve(e){return null}shouldReuseRoute(e,A){return e.routeConfig===A.routeConfig}shouldDestroyInjector(e){return!0}},JiA=(()=>{class i extends tf{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),jv=(()=>{class i{urlSerializer=w(L1);options=w(K1,{optional:!0})||{};canceledNavigationResolution=this.options.canceledNavigationResolution||"replace";location=w(Dc);urlHandlingStrategy=w(af);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";currentUrlTree=new Ul;getCurrentUrlTree(){return this.currentUrlTree}rawUrlTree=this.currentUrlTree;getRawUrlTree(){return this.rawUrlTree}createBrowserPath({finalUrl:A,initialUrl:t,targetBrowserUrl:n}){let o=A!==void 0?this.urlHandlingStrategy.merge(A,t):t,a=n??o;return a instanceof Ul?this.urlSerializer.serialize(a):a}commitTransition({targetRouterState:A,finalUrl:t,initialUrl:n}){t&&A?(this.currentUrlTree=t,this.rawUrlTree=this.urlHandlingStrategy.merge(t,n),this.routerState=A):this.rawUrlTree=n}routerState=bG(null,w(xr));getRouterState(){return this.routerState}_stateMemento=this.createStateMemento();get stateMemento(){return this._stateMemento}updateStateMemento(){this._stateMemento=this.createStateMemento()}createStateMemento(){return{rawUrlTree:this.rawUrlTree,currentUrlTree:this.currentUrlTree,routerState:this.routerState}}restoredState(){return this.location.getState()}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:()=>w(YiA),providedIn:"root"})}return i})(),YiA=(()=>{class i extends jv{currentPageId=0;lastSuccessfulId=-1;get browserPageId(){return this.canceledNavigationResolution!=="computed"?this.currentPageId:this.restoredState()?.\u0275routerPageId??this.currentPageId}registerNonRouterCurrentEntryChangeListener(A){return this.location.subscribe(t=>{t.type==="popstate"&&setTimeout(()=>{A(t.url,t.state,"popstate",{replaceUrl:!0})})})}handleRouterEvent(A,t){A instanceof UC?this.updateStateMemento():A instanceof Nc?this.commitTransition(t):A instanceof CQ?this.urlUpdateStrategy==="eager"&&(t.extras.skipLocationChange||this.setBrowserUrl(this.createBrowserPath(t),t)):A instanceof Ld?(this.commitTransition(t),this.urlUpdateStrategy==="deferred"&&!t.extras.skipLocationChange&&this.setBrowserUrl(this.createBrowserPath(t),t)):A instanceof Kl&&!vG(A)?this.restoreHistory(t):A instanceof N1?this.restoreHistory(t,!0):A instanceof Mg&&(this.lastSuccessfulId=A.id,this.currentPageId=this.browserPageId)}setBrowserUrl(A,{extras:t,id:n}){let{replaceUrl:o,state:a}=t;if(this.location.isCurrentPathEqualTo(A)||o){let r=this.browserPageId,s=oA(oA({},a),this.generateNgRouterState(n,r));this.location.replaceState(A,"",s)}else{let r=oA(oA({},a),this.generateNgRouterState(n,this.browserPageId+1));this.location.go(A,"",r)}}restoreHistory(A,t=!1){if(this.canceledNavigationResolution==="computed"){let n=this.browserPageId,o=this.currentPageId-n;o!==0?this.location.historyGo(o):this.getCurrentUrlTree()===A.finalUrl&&o===0&&(this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}else this.canceledNavigationResolution==="replace"&&(t&&this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}resetInternalState({finalUrl:A}){this.routerState=this.stateMemento.routerState,this.currentUrlTree=this.stateMemento.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,A??this.rawUrlTree)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.getRawUrlTree()),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}generateNgRouterState(A,t){return this.canceledNavigationResolution==="computed"?{navigationId:A,\u0275routerPageId:t}:{navigationId:A}}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function sf(i,e){i.events.pipe(Ct(A=>A instanceof Mg||A instanceof Kl||A instanceof N1||A instanceof Nc),ye(A=>A instanceof Mg||A instanceof Nc?0:(A instanceof Kl?A.code===ts.Redirect||A.code===ts.SupersededByNewNavigation:!1)?2:1),Ct(A=>A!==2),po(1)).subscribe(()=>{e()})}var is=(()=>{class i{get currentUrlTree(){return this.stateManager.getCurrentUrlTree()}get rawUrlTree(){return this.stateManager.getRawUrlTree()}disposed=!1;nonRouterCurrentEntryChangeSubscription;console=w(iR);stateManager=w(jv);options=w(K1,{optional:!0})||{};pendingTasks=w($x);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";navigationTransitions=w(rf);urlSerializer=w(L1);location=w(Dc);urlHandlingStrategy=w(af);injector=w(xr);_events=new te;get events(){return this._events}get routerState(){return this.stateManager.getRouterState()}navigated=!1;routeReuseStrategy=w(qG);injectorCleanup=w(jG,{optional:!0});onSameUrlNavigation=this.options.onSameUrlNavigation||"ignore";config=w(Yd,{optional:!0})?.flat()??[];componentInputBindingEnabled=!!w(uQ,{optional:!0});currentNavigation=this.navigationTransitions.currentNavigation.asReadonly();constructor(){this.resetConfig(this.config),this.navigationTransitions.setupNavigations(this).subscribe({error:A=>{}}),this.subscribeToNavigationEvents()}eventsSubscription=new Mo;subscribeToNavigationEvents(){let A=this.navigationTransitions.events.subscribe(t=>{try{let n=this.navigationTransitions.currentTransition,o=ca(this.navigationTransitions.currentNavigation);if(n!==null&&o!==null){if(this.stateManager.handleRouterEvent(t,o),t instanceof Kl&&t.code!==ts.Redirect&&t.code!==ts.SupersededByNewNavigation)this.navigated=!0;else if(t instanceof Mg)this.navigated=!0,this.injectorCleanup?.(this.routeReuseStrategy,this.routerState,this.config);else if(t instanceof Gd){let a=t.navigationBehaviorOptions,r=this.urlHandlingStrategy.merge(t.url,n.currentRawUrl),s=oA({scroll:n.extras.scroll,browserUrl:n.extras.browserUrl,info:n.extras.info,skipLocationChange:n.extras.skipLocationChange,replaceUrl:n.extras.replaceUrl||this.urlUpdateStrategy==="eager"||TiA(n.source)},a);this.scheduleNavigation(r,_d,null,s,{resolve:n.resolve,reject:n.reject,promise:n.promise})}}JtA(t)&&this._events.next(t)}catch(n){this.navigationTransitions.transitionAbortWithErrorSubject.next(n)}});this.eventsSubscription.add(A)}resetRootComponentType(A){this.routerState.root.component=A,this.navigationTransitions.rootComponentType=A}initialNavigation(){this.setUpLocationChangeListener(),this.navigationTransitions.hasRequestedNavigation||this.navigateToSyncWithBrowser(this.location.path(!0),_d,this.stateManager.restoredState(),{replaceUrl:!0})}setUpLocationChangeListener(){this.nonRouterCurrentEntryChangeSubscription??=this.stateManager.registerNonRouterCurrentEntryChangeListener((A,t,n,o)=>{this.navigateToSyncWithBrowser(A,n,t,o)})}navigateToSyncWithBrowser(A,t,n,o){let a=n?.navigationId?n:null;if(n){let s=oA({},n);delete s.navigationId,delete s.\u0275routerPageId,Object.keys(s).length!==0&&(o.state=s)}let r=this.parseUrl(A);this.scheduleNavigation(r,t,a,o).catch(s=>{this.disposed||this.injector.get(SD)(s)})}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return ca(this.navigationTransitions.currentNavigation)}get lastSuccessfulNavigation(){return this.navigationTransitions.lastSuccessfulNavigation}resetConfig(A){this.config=A.map(Yv),this.navigated=!1}ngOnDestroy(){this.dispose()}dispose(){this._events.unsubscribe(),this.navigationTransitions.complete(),this.nonRouterCurrentEntryChangeSubscription?.unsubscribe(),this.nonRouterCurrentEntryChangeSubscription=void 0,this.disposed=!0,this.eventsSubscription.unsubscribe()}createUrlTree(A,t={}){let{relativeTo:n,queryParams:o,fragment:a,queryParamsHandling:r,preserveFragment:s}=t,l=s?this.currentUrlTree.fragment:a,g=null;switch(r??this.options.defaultQueryParamsHandling){case"merge":g=oA(oA({},this.currentUrlTree.queryParams),o);break;case"preserve":g=this.currentUrlTree.queryParams;break;default:g=o||null}g!==null&&(g=this.removeEmptyProps(g));let C;try{let I=n?n.snapshot:this.routerState.snapshot.root;C=mG(I)}catch(I){(typeof A[0]!="string"||A[0][0]!=="/")&&(A=[]),C=this.currentUrlTree.root}return wG(C,A,g,l??null,this.urlSerializer)}navigateByUrl(A,t={skipLocationChange:!1}){let n=Rd(A)?A:this.parseUrl(A),o=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(o,_d,null,t)}navigate(A,t={skipLocationChange:!1}){return OiA(A),this.navigateByUrl(this.createUrlTree(A,t),t)}serializeUrl(A){return this.urlSerializer.serialize(A)}parseUrl(A){try{return this.urlSerializer.parse(A)}catch(t){return this.console.warn(Vx(4018,!1)),this.urlSerializer.parse("/")}}isActive(A,t){let n;if(t===!0?n=oA({},IG):t===!1?n=oA({},Dv):n=oA(oA({},Dv),t),Rd(A))return tG(this.currentUrlTree,A,n);let o=this.parseUrl(A);return tG(this.currentUrlTree,o,n)}removeEmptyProps(A){return Object.entries(A).reduce((t,[n,o])=>(o!=null&&(t[n]=o),t),{})}scheduleNavigation(A,t,n,o,a){if(this.disposed)return Promise.resolve(!1);let r,s,l;a?(r=a.resolve,s=a.reject,l=a.promise):l=new Promise((C,I)=>{r=C,s=I});let g=this.pendingTasks.add();return sf(this,()=>{queueMicrotask(()=>this.pendingTasks.remove(g))}),this.navigationTransitions.handleNavigationRequest({source:t,restoredState:n,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,rawUrl:A,extras:o,resolve:r,reject:s,promise:l,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),l.catch(Promise.reject.bind(Promise))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function OiA(i){for(let e=0;e{class i{router;injector;preloadingStrategy;loader;subscription;constructor(A,t,n,o){this.router=A,this.injector=t,this.preloadingStrategy=n,this.loader=o}setUpPreloading(){this.subscription=this.router.events.pipe(Ct(A=>A instanceof Mg),Qh(()=>this.preload())).subscribe(()=>{})}preload(){return this.processRoutes(this.injector,this.router.config)}ngOnDestroy(){this.subscription?.unsubscribe()}processRoutes(A,t){let n=[];for(let o of t){o.providers&&!o._injector&&(o._injector=p3(o.providers,A,""));let a=o._injector??A;o._loadedNgModuleFactory&&!o._loadedInjector&&(o._loadedInjector=o._loadedNgModuleFactory.create(a).injector);let r=o._loadedInjector??a;(o.loadChildren&&!o._loadedRoutes&&o.canLoad===void 0||o.loadComponent&&!o._loadedComponent)&&n.push(this.preloadConfig(a,o)),(o.children||o._loadedRoutes)&&n.push(this.processRoutes(r,o.children??o._loadedRoutes))}return _r(n).pipe(bD())}preloadConfig(A,t){return this.preloadingStrategy.preload(t,()=>{if(A.destroyed)return ie(null);let n;t.loadChildren&&t.canLoad===void 0?n=_r(this.loader.loadChildren(A,t)):n=ie(null);let o=n.pipe(Qc(a=>a===null?ie(void 0):(t._loadedRoutes=a.routes,t._loadedInjector=a.injector,t._loadedNgModuleFactory=a.factory,this.processRoutes(a.injector??A,a.routes))));if(t.loadComponent&&!t._loadedComponent){let a=this.loader.loadComponent(A,t);return _r([o,a]).pipe(bD())}else return o})}static \u0275fac=function(t){return new(t||i)(Ko(is),Ko(xr),Ko(fQ),Ko(of))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),WG=new MA(""),ziA=(()=>{class i{options;routerEventsSubscription;scrollEventsSubscription;lastId=0;lastSource=_d;restoredId=0;store={};urlSerializer=w(L1);zone=w(qe);viewportScroller=w(FD);transitions=w(rf);constructor(A){this.options=A,this.options.scrollPositionRestoration||="disabled",this.options.anchorScrolling||="disabled"}init(){this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.transitions.events.subscribe(A=>{A instanceof UC?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=A.navigationTrigger,this.restoredId=A.restoredState?A.restoredState.navigationId:0):A instanceof Mg?(this.lastId=A.id,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.urlAfterRedirects).fragment)):A instanceof Nc&&A.code===Nd.IgnoredSameUrlNavigation&&(this.lastSource=void 0,this.restoredId=0,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.url).fragment))})}consumeScrollEvents(){return this.transitions.events.subscribe(A=>{if(!(A instanceof Fd)||A.scrollBehavior==="manual")return;let t={behavior:"instant"};A.position?this.options.scrollPositionRestoration==="top"?this.viewportScroller.scrollToPosition([0,0],t):this.options.scrollPositionRestoration==="enabled"&&this.viewportScroller.scrollToPosition(A.position,t):A.anchor&&this.options.anchorScrolling==="enabled"?this.viewportScroller.scrollToAnchor(A.anchor):this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.scrollToPosition([0,0])})}scheduleScrollEvent(A,t){let n=ca(this.transitions.currentNavigation)?.extras.scroll;this.zone.runOutsideAngular(()=>Ie(this,null,function*(){yield new Promise(o=>{setTimeout(o),typeof requestAnimationFrame<"u"&&requestAnimationFrame(o)}),this.zone.run(()=>{this.transitions.events.next(new Fd(A,this.lastSource==="popstate"?this.store[this.restoredId]:null,t,n))})}))}ngOnDestroy(){this.routerEventsSubscription?.unsubscribe(),this.scrollEventsSubscription?.unsubscribe()}static \u0275fac=function(t){u3()};static \u0275prov=jA({token:i,factory:i.\u0275fac})}return i})();function PiA(){return w(is).routerState.root}function mQ(i,e){return{\u0275kind:i,\u0275providers:e}}function jiA(){let i=w(Dt);return e=>{let A=i.get(p0);if(e!==A.components[0])return;let t=i.get(is),n=i.get(ZG);i.get(Vv)===1&&t.initialNavigation(),i.get(AK,null,{optional:!0})?.setUpPreloading(),i.get(WG,null,{optional:!0})?.init(),t.resetRootComponentType(A.componentTypes[0]),n.closed||(n.next(),n.complete(),n.unsubscribe())}}var ZG=new MA("",{factory:()=>new te}),Vv=new MA("",{factory:()=>1});function XG(){let i=[{provide:eR,useValue:!0},{provide:Vv,useValue:0},xD(()=>{let e=w(Dt);return e.get(BR,Promise.resolve()).then(()=>new Promise(t=>{let n=e.get(is),o=e.get(ZG);sf(n,()=>{t(!0)}),e.get(rf).afterPreactivation=()=>(t(!0),o.closed?ie(void 0):o),n.initialNavigation()}))})];return mQ(2,i)}function $G(){let i=[xD(()=>{w(is).setUpLocationChangeListener()}),{provide:Vv,useValue:2}];return mQ(3,i)}var AK=new MA("");function eK(i){return mQ(0,[{provide:AK,useExisting:VG},{provide:fQ,useExisting:i}])}function tK(){return mQ(8,[Tv,{provide:uQ,useExisting:Tv}])}function iK(i){Q3("NgRouterViewTransitions");let e=[{provide:Hv,useValue:PG},{provide:zv,useValue:oA({skipNextTransition:!!i?.skipInitialTransition},i)}];return mQ(9,e)}var nK=[Dc,{provide:L1,useClass:S0},is,G1,{provide:Ts,useFactory:PiA},of,[]],lf=(()=>{class i{constructor(){}static forRoot(A,t){return{ngModule:i,providers:[nK,[],{provide:Yd,multi:!0,useValue:A},[],t?.errorHandler?{provide:Pv,useValue:t.errorHandler}:[],{provide:K1,useValue:t||{}},t?.useHash?ViA():WiA(),qiA(),t?.preloadingStrategy?eK(t.preloadingStrategy).\u0275providers:[],t?.initialNavigation?ZiA(t):[],t?.bindToComponentInputs?tK().\u0275providers:[],t?.enableViewTransitions?iK().\u0275providers:[],XiA()]}}static forChild(A){return{ngModule:i,providers:[{provide:Yd,multi:!0,useValue:A}]}}static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({})}return i})();function qiA(){return{provide:WG,useFactory:()=>{let i=w(FD),e=w(K1);return e.scrollOffset&&i.setOffset(e.scrollOffset),new ziA(e)}}}function ViA(){return{provide:ND,useClass:hR}}function WiA(){return{provide:ND,useClass:ER}}function ZiA(i){return[i.initialNavigation==="disabled"?$G().\u0275providers:[],i.initialNavigation==="enabledBlocking"?XG().\u0275providers:[]]}var qv=new MA("");function XiA(){return[{provide:qv,useFactory:jiA},{provide:nR,multi:!0,useExisting:qv}]}var enA=["*"];var tnA=new MA("MAT_CARD_CONFIG"),gf=(()=>{class i{appearance;constructor(){let A=w(tnA,{optional:!0});this.appearance=A?.appearance||"raised"}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-card"]],hostAttrs:[1,"mat-mdc-card","mdc-card"],hostVars:8,hostBindings:function(t,n){t&2&&xA("mat-mdc-card-outlined",n.appearance==="outlined")("mdc-card--outlined",n.appearance==="outlined")("mat-mdc-card-filled",n.appearance==="filled")("mdc-card--filled",n.appearance==="filled")},inputs:{appearance:"appearance"},exportAs:["matCard"],ngContentSelectors:enA,decls:1,vars:0,template:function(t,n){t&1&&(Nt(),Ve(0))},styles:[`.mat-mdc-card{display:flex;flex-direction:column;box-sizing:border-box;position:relative;border-style:solid;border-width:0;background-color:var(--mat-card-elevated-container-color, var(--mat-sys-surface-container-low));border-color:var(--mat-card-elevated-container-color, var(--mat-sys-surface-container-low));border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mat-card-elevated-container-elevation, var(--mat-sys-level1))}.mat-mdc-card::after{position:absolute;top:0;left:0;width:100%;height:100%;border:solid 1px rgba(0,0,0,0);content:"";display:block;pointer-events:none;box-sizing:border-box;border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium))}.mat-mdc-card-outlined{background-color:var(--mat-card-outlined-container-color, var(--mat-sys-surface));border-radius:var(--mat-card-outlined-container-shape, var(--mat-sys-corner-medium));border-width:var(--mat-card-outlined-outline-width, 1px);border-color:var(--mat-card-outlined-outline-color, var(--mat-sys-outline-variant));box-shadow:var(--mat-card-outlined-container-elevation, var(--mat-sys-level0))}.mat-mdc-card-outlined::after{border:none}.mat-mdc-card-filled{background-color:var(--mat-card-filled-container-color, var(--mat-sys-surface-container-highest));border-radius:var(--mat-card-filled-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mat-card-filled-container-elevation, var(--mat-sys-level0))}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media::before{display:block;content:""}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mat-mdc-card-actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px;padding:8px}.mat-mdc-card-title{font-family:var(--mat-card-title-text-font, var(--mat-sys-title-large-font));line-height:var(--mat-card-title-text-line-height, var(--mat-sys-title-large-line-height));font-size:var(--mat-card-title-text-size, var(--mat-sys-title-large-size));letter-spacing:var(--mat-card-title-text-tracking, var(--mat-sys-title-large-tracking));font-weight:var(--mat-card-title-text-weight, var(--mat-sys-title-large-weight))}.mat-mdc-card-subtitle{color:var(--mat-card-subtitle-text-color, var(--mat-sys-on-surface));font-family:var(--mat-card-subtitle-text-font, var(--mat-sys-title-medium-font));line-height:var(--mat-card-subtitle-text-line-height, var(--mat-sys-title-medium-line-height));font-size:var(--mat-card-subtitle-text-size, var(--mat-sys-title-medium-size));letter-spacing:var(--mat-card-subtitle-text-tracking, var(--mat-sys-title-medium-tracking));font-weight:var(--mat-card-subtitle-text-weight, var(--mat-sys-title-medium-weight))}.mat-mdc-card-title,.mat-mdc-card-subtitle{display:block;margin:0}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle{padding:16px 16px 0}.mat-mdc-card-header{display:flex;padding:16px 16px 0}.mat-mdc-card-content{display:block;padding:0 16px}.mat-mdc-card-content:first-child{padding-top:16px}.mat-mdc-card-content:last-child{padding-bottom:16px}.mat-mdc-card-title-group{display:flex;justify-content:space-between;width:100%}.mat-mdc-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;margin-bottom:16px;object-fit:cover}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title{line-height:normal}.mat-mdc-card-sm-image{width:80px;height:80px}.mat-mdc-card-md-image{width:112px;height:112px}.mat-mdc-card-lg-image{width:152px;height:152px}.mat-mdc-card-xl-image{width:240px;height:240px}.mat-mdc-card-subtitle~.mat-mdc-card-title,.mat-mdc-card-title~.mat-mdc-card-subtitle,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-title-group .mat-mdc-card-title,.mat-mdc-card-title-group .mat-mdc-card-subtitle{padding-top:0}.mat-mdc-card-content>:last-child:not(.mat-mdc-card-footer){margin-bottom:0}.mat-mdc-card-actions-align-end{justify-content:flex-end} +`],encapsulation:2,changeDetection:0})}return i})();var oK=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Qi]})}return i})();var wQ=class{};function DQ(i){return i&&typeof i.connect=="function"&&!(i instanceof Ox)}var Sg=(function(i){return i[i.REPLACED=0]="REPLACED",i[i.INSERTED=1]="INSERTED",i[i.MOVED=2]="MOVED",i[i.REMOVED=3]="REMOVED",i})(Sg||{}),cf=class{viewCacheSize=20;_viewCache=[];applyChanges(e,A,t,n,o){e.forEachOperation((a,r,s)=>{let l,g;if(a.previousIndex==null){let C=()=>t(a,r,s);l=this._insertView(C,s,A,n(a)),g=l?Sg.INSERTED:Sg.REPLACED}else s==null?(this._detachAndCacheView(r,A),g=Sg.REMOVED):(l=this._moveView(r,s,A,n(a)),g=Sg.MOVED);o&&o({context:l?.context,operation:g,record:a})})}detach(){for(let e of this._viewCache)e.destroy();this._viewCache=[]}_insertView(e,A,t,n){let o=this._insertViewFromCache(A,t);if(o){o.context.$implicit=n;return}let a=e();return t.createEmbeddedView(a.templateRef,a.context,a.index)}_detachAndCacheView(e,A){let t=A.detach(e);this._maybeCacheView(t,A)}_moveView(e,A,t,n){let o=t.get(e);return t.move(o,A),o.context.$implicit=n,o}_maybeCacheView(e,A){if(this._viewCache.length{let l,g;if(a.previousIndex==null){let C=t(a,r,s);l=A.createEmbeddedView(C.templateRef,C.context,C.index),g=Sg.INSERTED}else s==null?(A.remove(r),g=Sg.REMOVED):(l=A.get(r),A.move(l,s),g=Sg.MOVED);o&&o({context:l?.context,operation:g,record:a})})}detach(){}};var k0=class{_multiple;_emitChanges;compareWith;_selection=new Set;_deselectedToEmit=[];_selectedToEmit=[];_selected=null;get selected(){return this._selected||(this._selected=Array.from(this._selection.values())),this._selected}changed=new te;constructor(e=!1,A,t=!0,n){this._multiple=e,this._emitChanges=t,this.compareWith=n,A&&A.length&&(e?A.forEach(o=>this._markSelected(o)):this._markSelected(A[0]),this._selectedToEmit.length=0)}select(...e){this._verifyValueAssignment(e),e.forEach(t=>this._markSelected(t));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}deselect(...e){this._verifyValueAssignment(e),e.forEach(t=>this._unmarkSelected(t));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}setSelection(...e){this._verifyValueAssignment(e);let A=this.selected,t=new Set(e.map(o=>this._getConcreteValue(o)));e.forEach(o=>this._markSelected(o)),A.filter(o=>!t.has(this._getConcreteValue(o,t))).forEach(o=>this._unmarkSelected(o));let n=this._hasQueuedChanges();return this._emitChangeEvent(),n}toggle(e){return this.isSelected(e)?this.deselect(e):this.select(e)}clear(e=!0){this._unmarkAll();let A=this._hasQueuedChanges();return e&&this._emitChangeEvent(),A}isSelected(e){return this._selection.has(this._getConcreteValue(e))}isEmpty(){return this._selection.size===0}hasValue(){return!this.isEmpty()}sort(e){this._multiple&&this.selected&&this._selected.sort(e)}isMultipleSelection(){return this._multiple}_emitChangeEvent(){this._selected=null,(this._selectedToEmit.length||this._deselectedToEmit.length)&&(this.changed.next({source:this,added:this._selectedToEmit,removed:this._deselectedToEmit}),this._deselectedToEmit=[],this._selectedToEmit=[])}_markSelected(e){e=this._getConcreteValue(e),this.isSelected(e)||(this._multiple||this._unmarkAll(),this.isSelected(e)||this._selection.add(e),this._emitChanges&&this._selectedToEmit.push(e))}_unmarkSelected(e){e=this._getConcreteValue(e),this.isSelected(e)&&(this._selection.delete(e),this._emitChanges&&this._deselectedToEmit.push(e))}_unmarkAll(){this.isEmpty()||this._selection.forEach(e=>this._unmarkSelected(e))}_verifyValueAssignment(e){e.length>1&&this._multiple}_hasQueuedChanges(){return!!(this._deselectedToEmit.length||this._selectedToEmit.length)}_getConcreteValue(e,A){if(this.compareWith){A=A??this._selection;for(let t of A)if(this.compareWith(e,t))return t;return e}else return e}};var If=(()=>{class i{_animationsDisabled=nn();state="unchecked";disabled=!1;appearance="full";constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-pseudo-checkbox"]],hostAttrs:[1,"mat-pseudo-checkbox"],hostVars:12,hostBindings:function(t,n){t&2&&xA("mat-pseudo-checkbox-indeterminate",n.state==="indeterminate")("mat-pseudo-checkbox-checked",n.state==="checked")("mat-pseudo-checkbox-disabled",n.disabled)("mat-pseudo-checkbox-minimal",n.appearance==="minimal")("mat-pseudo-checkbox-full",n.appearance==="full")("_mat-animation-noopable",n._animationsDisabled)},inputs:{state:"state",disabled:"disabled",appearance:"appearance"},decls:0,vars:0,template:function(t,n){},styles:[`.mat-pseudo-checkbox{border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox._mat-animation-noopable{transition:none !important;animation:none !important}.mat-pseudo-checkbox._mat-animation-noopable::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{left:1px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{left:1px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-minimal-selected-checkmark-color, var(--mat-sys-primary))}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full{border-color:var(--mat-pseudo-checkbox-full-unselected-icon-color, var(--mat-sys-on-surface-variant));border-width:2px;border-style:solid}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-disabled{border-color:var(--mat-pseudo-checkbox-full-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate{background-color:var(--mat-pseudo-checkbox-full-selected-icon-color, var(--mat-sys-primary));border-color:rgba(0,0,0,0)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-full-selected-checkmark-color, var(--mat-sys-on-primary))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background-color:var(--mat-pseudo-checkbox-full-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-full-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mat-pseudo-checkbox{width:18px;height:18px}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after{width:14px;height:6px;transform-origin:center;top:-4.2426406871px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{top:8px;width:16px}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after{width:10px;height:4px;transform-origin:center;top:-2.8284271247px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{top:6px;width:12px} +`],encapsulation:2,changeDetection:0})}return i})();var inA=["button"],nnA=["*"];function onA(i,e){if(i&1&&(d(0,"div",2),lA(1,"mat-pseudo-checkbox",6),E()),i&2){let A=p();u(),H("disabled",A.disabled)}}var aK=new MA("MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS",{providedIn:"root",factory:()=>({hideSingleSelectionIndicator:!1,hideMultipleSelectionIndicator:!1,disabledInteractive:!1})}),rK=new MA("MatButtonToggleGroup"),anA={provide:As,useExisting:Ga(()=>Wv),multi:!0},df=class{source;value;constructor(e,A){this.source=e,this.value=A}},Wv=(()=>{class i{_changeDetector=w(wt);_dir=w(fo,{optional:!0});_multiple=!1;_disabled=!1;_disabledInteractive=!1;_selectionModel;_rawValue;_controlValueAccessorChangeFn=()=>{};_onTouched=()=>{};_buttonToggles;appearance;get name(){return this._name}set name(A){this._name=A,this._markButtonsForCheck()}_name=w(Bn).getId("mat-button-toggle-group-");vertical=!1;get value(){let A=this._selectionModel?this._selectionModel.selected:[];return this.multiple?A.map(t=>t.value):A[0]?A[0].value:void 0}set value(A){this._setSelectionByValue(A),this.valueChange.emit(this.value)}valueChange=new LA;get selected(){let A=this._selectionModel?this._selectionModel.selected:[];return this.multiple?A:A[0]||null}get multiple(){return this._multiple}set multiple(A){this._multiple=A,this._markButtonsForCheck()}get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._markButtonsForCheck()}get disabledInteractive(){return this._disabledInteractive}set disabledInteractive(A){this._disabledInteractive=A,this._markButtonsForCheck()}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}change=new LA;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._markButtonsForCheck()}_hideSingleSelectionIndicator;get hideMultipleSelectionIndicator(){return this._hideMultipleSelectionIndicator}set hideMultipleSelectionIndicator(A){this._hideMultipleSelectionIndicator=A,this._markButtonsForCheck()}_hideMultipleSelectionIndicator;constructor(){let A=w(aK,{optional:!0});this.appearance=A&&A.appearance?A.appearance:"standard",this._hideSingleSelectionIndicator=A?.hideSingleSelectionIndicator??!1,this._hideMultipleSelectionIndicator=A?.hideMultipleSelectionIndicator??!1}ngOnInit(){this._selectionModel=new k0(this.multiple,void 0,!1)}ngAfterContentInit(){this._selectionModel.select(...this._buttonToggles.filter(A=>A.checked)),this.multiple||this._initializeTabIndex()}writeValue(A){this.value=A,this._changeDetector.markForCheck()}registerOnChange(A){this._controlValueAccessorChangeFn=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}_keydown(A){if(this.multiple||this.disabled||ha(A))return;let n=A.target.id,o=this._buttonToggles.toArray().findIndex(r=>r.buttonId===n),a=null;switch(A.keyCode){case 32:case 13:a=this._buttonToggles.get(o)||null;break;case 38:a=this._getNextButton(o,-1);break;case 37:a=this._getNextButton(o,this.dir==="ltr"?-1:1);break;case 40:a=this._getNextButton(o,1);break;case 39:a=this._getNextButton(o,this.dir==="ltr"?1:-1);break;default:return}a&&(A.preventDefault(),a._onButtonClick(),a.focus())}_emitChangeEvent(A){let t=new df(A,this.value);this._rawValue=t.value,this._controlValueAccessorChangeFn(t.value),this.change.emit(t)}_syncButtonToggle(A,t,n=!1,o=!1){!this.multiple&&this.selected&&!A.checked&&(this.selected.checked=!1),this._selectionModel?t?this._selectionModel.select(A):this._selectionModel.deselect(A):o=!0,o?Promise.resolve().then(()=>this._updateModelValue(A,n)):this._updateModelValue(A,n)}_isSelected(A){return this._selectionModel&&this._selectionModel.isSelected(A)}_isPrechecked(A){return typeof this._rawValue>"u"?!1:this.multiple&&Array.isArray(this._rawValue)?this._rawValue.some(t=>A.value!=null&&t===A.value):A.value===this._rawValue}_initializeTabIndex(){if(this._buttonToggles.forEach(A=>{A.tabIndex=-1}),this.selected)this.selected.tabIndex=0;else for(let A=0;Athis._selectValue(n,t))):(this._clearSelection(),this._selectValue(A,t)),!this.multiple&&t.every(n=>n.tabIndex===-1)){for(let n of t)if(!n.disabled){n.tabIndex=0;break}}}_clearSelection(){this._selectionModel.clear(),this._buttonToggles.forEach(A=>{A.checked=!1,this.multiple||(A.tabIndex=-1)})}_selectValue(A,t){for(let n of t)if(n.value===A){n.checked=!0,this._selectionModel.select(n),this.multiple||(n.tabIndex=0);break}}_updateModelValue(A,t){t&&this._emitChangeEvent(A),this.valueChange.emit(this.value)}_markButtonsForCheck(){this._buttonToggles?.forEach(A=>A._markForCheck())}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["mat-button-toggle-group"]],contentQueries:function(t,n,o){if(t&1&&Vo(o,Bf,5),t&2){let a;oe(a=ae())&&(n._buttonToggles=a)}},hostAttrs:[1,"mat-button-toggle-group"],hostVars:6,hostBindings:function(t,n){t&1&&T("keydown",function(a){return n._keydown(a)}),t&2&&(ee("role",n.multiple?"group":"radiogroup")("aria-disabled",n.disabled),xA("mat-button-toggle-vertical",n.vertical)("mat-button-toggle-group-appearance-standard",n.appearance==="standard"))},inputs:{appearance:"appearance",name:"name",vertical:[2,"vertical","vertical",Ee],value:"value",multiple:[2,"multiple","multiple",Ee],disabled:[2,"disabled","disabled",Ee],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Ee],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",Ee],hideMultipleSelectionIndicator:[2,"hideMultipleSelectionIndicator","hideMultipleSelectionIndicator",Ee]},outputs:{valueChange:"valueChange",change:"change"},exportAs:["matButtonToggleGroup"],features:[Et([anA,{provide:rK,useExisting:i}])]})}return i})(),Bf=(()=>{class i{_changeDetectorRef=w(wt);_elementRef=w(se);_focusMonitor=w(Wa);_idGenerator=w(Bn);_animationDisabled=nn();_checked=!1;ariaLabel;ariaLabelledby=null;_buttonElement;buttonToggleGroup;get buttonId(){return`${this.id}-button`}id;name;value;get tabIndex(){return this._tabIndex()}set tabIndex(A){this._tabIndex.set(A)}_tabIndex;disableRipple=!1;get appearance(){return this.buttonToggleGroup?this.buttonToggleGroup.appearance:this._appearance}set appearance(A){this._appearance=A}_appearance;get checked(){return this.buttonToggleGroup?this.buttonToggleGroup._isSelected(this):this._checked}set checked(A){A!==this._checked&&(this._checked=A,this.buttonToggleGroup&&this.buttonToggleGroup._syncButtonToggle(this,this._checked),this._changeDetectorRef.markForCheck())}get disabled(){return this._disabled||this.buttonToggleGroup&&this.buttonToggleGroup.disabled}set disabled(A){this._disabled=A}_disabled=!1;get disabledInteractive(){return this._disabledInteractive||this.buttonToggleGroup!==null&&this.buttonToggleGroup.disabledInteractive}set disabledInteractive(A){this._disabledInteractive=A}_disabledInteractive;change=new LA;constructor(){w(io).load(rr);let A=w(rK,{optional:!0}),t=w(new ks("tabindex"),{optional:!0})||"",n=w(aK,{optional:!0});this._tabIndex=mA(parseInt(t)||0),this.buttonToggleGroup=A,this._appearance=n&&n.appearance?n.appearance:"standard",this._disabledInteractive=n?.disabledInteractive??!1}ngOnInit(){let A=this.buttonToggleGroup;this.id=this.id||this._idGenerator.getId("mat-button-toggle-"),A&&(A._isPrechecked(this)?this.checked=!0:A._isSelected(this)!==this._checked&&A._syncButtonToggle(this,this._checked))}ngAfterViewInit(){this._animationDisabled||this._elementRef.nativeElement.classList.add("mat-button-toggle-animations-enabled"),this._focusMonitor.monitor(this._elementRef,!0)}ngOnDestroy(){let A=this.buttonToggleGroup;this._focusMonitor.stopMonitoring(this._elementRef),A&&A._isSelected(this)&&A._syncButtonToggle(this,!1,!1,!0)}focus(A){this._buttonElement.nativeElement.focus(A)}_onButtonClick(){if(this.disabled)return;let A=this.isSingleSelector()?!0:!this._checked;if(A!==this._checked&&(this._checked=A,this.buttonToggleGroup&&(this.buttonToggleGroup._syncButtonToggle(this,this._checked,!0),this.buttonToggleGroup._onTouched())),this.isSingleSelector()){let t=this.buttonToggleGroup._buttonToggles.find(n=>n.tabIndex===0);t&&(t.tabIndex=-1),this.tabIndex=0}this.change.emit(new df(this,this.value))}_markForCheck(){this._changeDetectorRef.markForCheck()}_getButtonName(){return this.isSingleSelector()?this.buttonToggleGroup.name:this.name||null}isSingleSelector(){return this.buttonToggleGroup&&!this.buttonToggleGroup.multiple}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-button-toggle"]],viewQuery:function(t,n){if(t&1&&Yt(inA,5),t&2){let o;oe(o=ae())&&(n._buttonElement=o.first)}},hostAttrs:["role","presentation",1,"mat-button-toggle"],hostVars:14,hostBindings:function(t,n){t&1&&T("focus",function(){return n.focus()}),t&2&&(ee("aria-label",null)("aria-labelledby",null)("id",n.id)("name",null),xA("mat-button-toggle-standalone",!n.buttonToggleGroup)("mat-button-toggle-checked",n.checked)("mat-button-toggle-disabled",n.disabled)("mat-button-toggle-disabled-interactive",n.disabledInteractive)("mat-button-toggle-appearance-standard",n.appearance==="standard"))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],id:"id",name:"name",value:"value",tabIndex:"tabIndex",disableRipple:[2,"disableRipple","disableRipple",Ee],appearance:"appearance",checked:[2,"checked","checked",Ee],disabled:[2,"disabled","disabled",Ee],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Ee]},outputs:{change:"change"},exportAs:["matButtonToggle"],ngContentSelectors:nnA,decls:7,vars:13,consts:[["button",""],["type","button",1,"mat-button-toggle-button","mat-focus-indicator",3,"click","id","disabled"],[1,"mat-button-toggle-checkbox-wrapper"],[1,"mat-button-toggle-label-content"],[1,"mat-button-toggle-focus-overlay"],["matRipple","",1,"mat-button-toggle-ripple",3,"matRippleTrigger","matRippleDisabled"],["state","checked","aria-hidden","true","appearance","minimal",3,"disabled"]],template:function(t,n){if(t&1&&(Nt(),d(0,"button",1,0),T("click",function(){return n._onButtonClick()}),Y(2,onA,2,1,"div",2),d(3,"span",3),Ve(4),E()(),lA(5,"span",4)(6,"span",5)),t&2){let o=gi(1);H("id",n.buttonId)("disabled",n.disabled&&!n.disabledInteractive||null),ee("role",n.isSingleSelector()?"radio":"button")("tabindex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("aria-pressed",n.isSingleSelector()?null:n.checked)("aria-checked",n.isSingleSelector()?n.checked:null)("name",n._getButtonName())("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),u(2),O(n.buttonToggleGroup&&(!n.buttonToggleGroup.multiple&&!n.buttonToggleGroup.hideSingleSelectionIndicator||n.buttonToggleGroup.multiple&&!n.buttonToggleGroup.hideMultipleSelectionIndicator)?2:-1),u(4),H("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)}},dependencies:[es,If],styles:[`.mat-button-toggle-standalone,.mat-button-toggle-group{position:relative;display:inline-flex;flex-direction:row;white-space:nowrap;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0);border-radius:var(--mat-button-toggle-legacy-shape);transform:translateZ(0)}.mat-button-toggle-standalone:not([class*=mat-elevation-z]),.mat-button-toggle-group:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)}@media(forced-colors: active){.mat-button-toggle-standalone,.mat-button-toggle-group{outline:solid 1px}}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard .mat-pseudo-checkbox,.mat-button-toggle-group-appearance-standard .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard:not([class*=mat-elevation-z]),.mat-button-toggle-group-appearance-standard:not([class*=mat-elevation-z]){box-shadow:none}@media(forced-colors: active){.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{outline:0}}.mat-button-toggle-vertical{flex-direction:column}.mat-button-toggle-vertical .mat-button-toggle-label-content{display:block}.mat-button-toggle{white-space:nowrap;position:relative;color:var(--mat-button-toggle-legacy-text-color);font-family:var(--mat-button-toggle-legacy-label-text-font);font-size:var(--mat-button-toggle-legacy-label-text-size);line-height:var(--mat-button-toggle-legacy-label-text-line-height);font-weight:var(--mat-button-toggle-legacy-label-text-weight);letter-spacing:var(--mat-button-toggle-legacy-label-text-tracking);--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-button-toggle-legacy-selected-state-text-color)}.mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-button-toggle-legacy-focus-state-layer-opacity)}.mat-button-toggle .mat-icon svg{vertical-align:top}.mat-button-toggle-checkbox-wrapper{display:inline-block;justify-content:flex-start;align-items:center;width:0;height:18px;line-height:18px;overflow:hidden;box-sizing:border-box;position:absolute;top:50%;left:16px;transform:translate3d(0, -50%, 0)}[dir=rtl] .mat-button-toggle-checkbox-wrapper{left:auto;right:16px}.mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:12px}[dir=rtl] .mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:auto;right:12px}.mat-button-toggle-checked .mat-button-toggle-checkbox-wrapper{width:18px}.mat-button-toggle-animations-enabled .mat-button-toggle-checkbox-wrapper{transition:width 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-checkbox-wrapper{transition:none}.mat-button-toggle-checked{color:var(--mat-button-toggle-legacy-selected-state-text-color);background-color:var(--mat-button-toggle-legacy-selected-state-background-color)}.mat-button-toggle-disabled{pointer-events:none;color:var(--mat-button-toggle-legacy-disabled-state-text-color);background-color:var(--mat-button-toggle-legacy-disabled-state-background-color);--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color: var(--mat-button-toggle-legacy-disabled-state-text-color)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:var(--mat-button-toggle-legacy-disabled-selected-state-background-color)}.mat-button-toggle-disabled-interactive{pointer-events:auto}.mat-button-toggle-appearance-standard{color:var(--mat-button-toggle-text-color, var(--mat-sys-on-surface));background-color:var(--mat-button-toggle-background-color, transparent);font-family:var(--mat-button-toggle-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-toggle-label-text-size, var(--mat-sys-label-large-size));line-height:var(--mat-button-toggle-label-text-line-height, var(--mat-sys-label-large-line-height));font-weight:var(--mat-button-toggle-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-button-toggle-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:none;border-top:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:var(--mat-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-button-toggle-selected-state-background-color, var(--mat-sys-secondary-container))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled{color:var(--mat-button-toggle-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-toggle-disabled-state-background-color, transparent)}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color: var(--mat-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled.mat-button-toggle-checked{color:var(--mat-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-toggle-disabled-selected-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:var(--mat-button-toggle-state-layer-color, var(--mat-sys-on-surface))}.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{opacity:var(--mat-button-toggle-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-button-toggle-appearance-standard.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-button-toggle-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}@media(hover: none){.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{display:none}}.mat-button-toggle-label-content{-webkit-user-select:none;user-select:none;display:inline-block;padding:0 16px;line-height:var(--mat-button-toggle-legacy-height);position:relative}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{padding:0 12px;line-height:var(--mat-button-toggle-height, 40px)}.mat-button-toggle-label-content>*{vertical-align:middle}.mat-button-toggle-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit;pointer-events:none;opacity:0;background-color:var(--mat-button-toggle-legacy-state-layer-color)}@media(forced-colors: active){.mat-button-toggle-checked .mat-button-toggle-focus-overlay{border-bottom:solid 500px;opacity:.5;height:0}.mat-button-toggle-checked:hover .mat-button-toggle-focus-overlay{opacity:.6}.mat-button-toggle-checked.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{border-bottom:solid 500px}}.mat-button-toggle .mat-button-toggle-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-toggle-button{border:0;background:none;color:inherit;padding:0;margin:0;font:inherit;outline:none;width:100%;cursor:pointer}.mat-button-toggle-animations-enabled .mat-button-toggle-button{transition:padding 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-button{transition:none}.mat-button-toggle-disabled .mat-button-toggle-button{cursor:default}.mat-button-toggle-button::-moz-focus-inner{border:0}.mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:30px}[dir=rtl] .mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:0;padding-right:30px}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{--mat-focus-indicator-border-radius: var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-bottom-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-bottom-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-bottom-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-bottom-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-top-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))} +`],encapsulation:2,changeDetection:0})}return i})(),sK=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Sc,Bf,Qi]})}return i})();var rnA=20,Lc=(()=>{class i{_ngZone=w(qe);_platform=w(Ci);_renderer=w(Rr).createRenderer(null,null);_cleanupGlobalListener;constructor(){}_scrolled=new te;_scrolledCount=0;scrollContainers=new Map;register(A){this.scrollContainers.has(A)||this.scrollContainers.set(A,A.elementScrolled().subscribe(()=>this._scrolled.next(A)))}deregister(A){let t=this.scrollContainers.get(A);t&&(t.unsubscribe(),this.scrollContainers.delete(A))}scrolled(A=rnA){return this._platform.isBrowser?new bi(t=>{this._cleanupGlobalListener||(this._cleanupGlobalListener=this._ngZone.runOutsideAngular(()=>this._renderer.listen("document","scroll",()=>this._scrolled.next())));let n=A>0?this._scrolled.pipe(a1(A)).subscribe(t):this._scrolled.subscribe(t);return this._scrolledCount++,()=>{n.unsubscribe(),this._scrolledCount--,this._scrolledCount||(this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0)}}):ie()}ngOnDestroy(){this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0,this.scrollContainers.forEach((A,t)=>this.deregister(t)),this._scrolled.complete()}ancestorScrolled(A,t){let n=this.getAncestorScrollContainers(A);return this.scrolled(t).pipe(Ct(o=>!o||n.indexOf(o)>-1))}getAncestorScrollContainers(A){let t=[];return this.scrollContainers.forEach((n,o)=>{this._scrollableContainsElement(o,A)&&t.push(o)}),t}_scrollableContainsElement(A,t){let n=hs(t),o=A.getElementRef().nativeElement;do if(n==o)return!0;while(n=n.parentElement);return!1}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),_0=(()=>{class i{elementRef=w(se);scrollDispatcher=w(Lc);ngZone=w(qe);dir=w(fo,{optional:!0});_scrollElement=this.elementRef.nativeElement;_destroyed=new te;_renderer=w(qi);_cleanupScroll;_elementScrolled=new te;constructor(){}ngOnInit(){this._cleanupScroll=this.ngZone.runOutsideAngular(()=>this._renderer.listen(this._scrollElement,"scroll",A=>this._elementScrolled.next(A))),this.scrollDispatcher.register(this)}ngOnDestroy(){this._cleanupScroll?.(),this._elementScrolled.complete(),this.scrollDispatcher.deregister(this),this._destroyed.next(),this._destroyed.complete()}elementScrolled(){return this._elementScrolled}getElementRef(){return this.elementRef}scrollTo(A){let t=this.elementRef.nativeElement,n=this.dir&&this.dir.value=="rtl";A.left==null&&(A.left=n?A.end:A.start),A.right==null&&(A.right=n?A.start:A.end),A.bottom!=null&&(A.top=t.scrollHeight-t.clientHeight-A.bottom),n&&Qd()!=mg.NORMAL?(A.left!=null&&(A.right=t.scrollWidth-t.clientWidth-A.left),Qd()==mg.INVERTED?A.left=A.right:Qd()==mg.NEGATED&&(A.left=A.right?-A.right:A.right)):A.right!=null&&(A.left=t.scrollWidth-t.clientWidth-A.right),this._applyScrollToOptions(A)}_applyScrollToOptions(A){let t=this.elementRef.nativeElement;tp()?t.scrollTo(A):(A.top!=null&&(t.scrollTop=A.top),A.left!=null&&(t.scrollLeft=A.left))}measureScrollOffset(A){let t="left",n="right",o=this.elementRef.nativeElement;if(A=="top")return o.scrollTop;if(A=="bottom")return o.scrollHeight-o.clientHeight-o.scrollTop;let a=this.dir&&this.dir.value=="rtl";return A=="start"?A=a?n:t:A=="end"&&(A=a?t:n),a&&Qd()==mg.INVERTED?A==t?o.scrollWidth-o.clientWidth-o.scrollLeft:o.scrollLeft:a&&Qd()==mg.NEGATED?A==t?o.scrollLeft+o.scrollWidth-o.clientWidth:-o.scrollLeft:A==t?o.scrollLeft:o.scrollWidth-o.clientWidth-o.scrollLeft}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdk-scrollable",""],["","cdkScrollable",""]]})}return i})(),snA=20,fs=(()=>{class i{_platform=w(Ci);_listeners;_viewportSize=null;_change=new te;_document=w(ii);constructor(){let A=w(qe),t=w(Rr).createRenderer(null,null);A.runOutsideAngular(()=>{if(this._platform.isBrowser){let n=o=>this._change.next(o);this._listeners=[t.listen("window","resize",n),t.listen("window","orientationchange",n)]}this.change().subscribe(()=>this._viewportSize=null)})}ngOnDestroy(){this._listeners?.forEach(A=>A()),this._change.complete()}getViewportSize(){this._viewportSize||this._updateViewportSize();let A={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),A}getViewportRect(){let A=this.getViewportScrollPosition(),{width:t,height:n}=this.getViewportSize();return{top:A.top,left:A.left,bottom:A.top+n,right:A.left+t,height:n,width:t}}getViewportScrollPosition(){if(!this._platform.isBrowser)return{top:0,left:0};let A=this._document,t=this._getWindow(),n=A.documentElement,o=n.getBoundingClientRect(),a=-o.top||A.body?.scrollTop||t.scrollY||n.scrollTop||0,r=-o.left||A.body?.scrollLeft||t.scrollX||n.scrollLeft||0;return{top:a,left:r}}change(A=snA){return A>0?this._change.pipe(a1(A)):this._change}_getWindow(){return this._document.defaultView||window}_updateViewportSize(){let A=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:A.innerWidth,height:A.innerHeight}:{width:0,height:0}}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var lK=new MA("CDK_VIRTUAL_SCROLL_VIEWPORT");var Fc=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({})}return i})(),Ef=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Qi,Fc,Qi,Fc]})}return i})();var yQ=class{_attachedHost=null;attach(e){return this._attachedHost=e,e.attach(this)}detach(){let e=this._attachedHost;e!=null&&(this._attachedHost=null,e.detach())}get isAttached(){return this._attachedHost!=null}setAttachedHost(e){this._attachedHost=e}},ms=class extends yQ{component;viewContainerRef;injector;projectableNodes;bindings;constructor(e,A,t,n,o){super(),this.component=e,this.viewContainerRef=A,this.injector=t,this.projectableNodes=n,this.bindings=o||null}},Gr=class extends yQ{templateRef;viewContainerRef;context;injector;constructor(e,A,t,n){super(),this.templateRef=e,this.viewContainerRef=A,this.context=t,this.injector=n}get origin(){return this.templateRef.elementRef}attach(e,A=this.context){return this.context=A,super.attach(e)}detach(){return this.context=void 0,super.detach()}},Zv=class extends yQ{element;constructor(e){super(),this.element=e instanceof se?e.nativeElement:e}},TC=class{_attachedPortal=null;_disposeFn=null;_isDisposed=!1;hasAttached(){return!!this._attachedPortal}attach(e){if(e instanceof ms)return this._attachedPortal=e,this.attachComponentPortal(e);if(e instanceof Gr)return this._attachedPortal=e,this.attachTemplatePortal(e);if(this.attachDomPortal&&e instanceof Zv)return this._attachedPortal=e,this.attachDomPortal(e)}attachDomPortal=null;detach(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()}dispose(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0}setDisposeFn(e){this._disposeFn=e}_invokeDisposeFn(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)}},vQ=class extends TC{outletElement;_appRef;_defaultInjector;constructor(e,A,t){super(),this.outletElement=e,this._appRef=A,this._defaultInjector=t}attachComponentPortal(e){let A;if(e.viewContainerRef){let t=e.injector||e.viewContainerRef.injector,n=t.get(kD,null,{optional:!0})||void 0;A=e.viewContainerRef.createComponent(e.component,{index:e.viewContainerRef.length,injector:t,ngModuleRef:n,projectableNodes:e.projectableNodes||void 0,bindings:e.bindings||void 0}),this.setDisposeFn(()=>A.destroy())}else{let t=this._appRef,n=e.injector||this._defaultInjector||Dt.NULL,o=n.get(xr,t.injector);A=v3(e.component,{elementInjector:n,environmentInjector:o,projectableNodes:e.projectableNodes||void 0,bindings:e.bindings||void 0}),t.attachView(A.hostView),this.setDisposeFn(()=>{t.viewCount>0&&t.detachView(A.hostView),A.destroy()})}return this.outletElement.appendChild(this._getComponentRootNode(A)),this._attachedPortal=e,A}attachTemplatePortal(e){let A=e.viewContainerRef,t=A.createEmbeddedView(e.templateRef,e.context,{injector:e.injector});return t.rootNodes.forEach(n=>this.outletElement.appendChild(n)),t.detectChanges(),this.setDisposeFn(()=>{let n=A.indexOf(t);n!==-1&&A.remove(n)}),this._attachedPortal=e,t}attachDomPortal=e=>{let A=e.element;A.parentNode;let t=this.outletElement.ownerDocument.createComment("dom-portal");A.parentNode.insertBefore(t,A),this.outletElement.appendChild(A),this._attachedPortal=e,super.setDisposeFn(()=>{t.parentNode&&t.parentNode.replaceChild(A,t)})};dispose(){super.dispose(),this.outletElement.remove()}_getComponentRootNode(e){return e.hostView.rootNodes[0]}},gK=(()=>{class i extends Gr{constructor(){let A=w(lo),t=w(So);super(A,t)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdkPortal",""]],exportAs:["cdkPortal"],features:[mt]})}return i})(),Jl=(()=>{class i extends TC{_moduleRef=w(kD,{optional:!0});_document=w(ii);_viewContainerRef=w(So);_isInitialized=!1;_attachedRef=null;constructor(){super()}get portal(){return this._attachedPortal}set portal(A){this.hasAttached()&&!A&&!this._isInitialized||(this.hasAttached()&&super.detach(),A&&super.attach(A),this._attachedPortal=A||null)}attached=new LA;get attachedRef(){return this._attachedRef}ngOnInit(){this._isInitialized=!0}ngOnDestroy(){super.dispose(),this._attachedRef=this._attachedPortal=null}attachComponentPortal(A){A.setAttachedHost(this);let t=A.viewContainerRef!=null?A.viewContainerRef:this._viewContainerRef,n=t.createComponent(A.component,{index:t.length,injector:A.injector||t.injector,projectableNodes:A.projectableNodes||void 0,ngModuleRef:this._moduleRef||void 0,bindings:A.bindings||void 0});return t!==this._viewContainerRef&&this._getRootNode().appendChild(n.hostView.rootNodes[0]),super.setDisposeFn(()=>n.destroy()),this._attachedPortal=A,this._attachedRef=n,this.attached.emit(n),n}attachTemplatePortal(A){A.setAttachedHost(this);let t=this._viewContainerRef.createEmbeddedView(A.templateRef,A.context,{injector:A.injector});return super.setDisposeFn(()=>this._viewContainerRef.clear()),this._attachedPortal=A,this._attachedRef=t,this.attached.emit(t),t}attachDomPortal=A=>{let t=A.element;t.parentNode;let n=this._document.createComment("dom-portal");A.setAttachedHost(this),t.parentNode.insertBefore(n,t),this._getRootNode().appendChild(t),this._attachedPortal=A,super.setDisposeFn(()=>{n.parentNode&&n.parentNode.replaceChild(t,n)})};_getRootNode(){let A=this._viewContainerRef.element.nativeElement;return A.nodeType===A.ELEMENT_NODE?A:A.parentNode}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdkPortalOutlet",""]],inputs:{portal:[0,"cdkPortalOutlet","portal"]},outputs:{attached:"attached"},exportAs:["cdkPortalOutlet"],features:[mt]})}return i})(),Gc=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({})}return i})();var cK=tp();function zd(i){return new hf(i.get(fs),i.get(ii))}var hf=class{_viewportRuler;_previousHTMLStyles={top:"",left:""};_previousScrollPosition;_isEnabled=!1;_document;constructor(e,A){this._viewportRuler=e,this._document=A}attach(){}enable(){if(this._canBeEnabled()){let e=this._document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=e.style.left||"",this._previousHTMLStyles.top=e.style.top||"",e.style.left=Ua(-this._previousScrollPosition.left),e.style.top=Ua(-this._previousScrollPosition.top),e.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}}disable(){if(this._isEnabled){let e=this._document.documentElement,A=this._document.body,t=e.style,n=A.style,o=t.scrollBehavior||"",a=n.scrollBehavior||"";this._isEnabled=!1,t.left=this._previousHTMLStyles.left,t.top=this._previousHTMLStyles.top,e.classList.remove("cdk-global-scrollblock"),cK&&(t.scrollBehavior=n.scrollBehavior="auto"),window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),cK&&(t.scrollBehavior=o,n.scrollBehavior=a)}}_canBeEnabled(){if(this._document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;let A=this._document.documentElement,t=this._viewportRuler.getViewportSize();return A.scrollHeight>t.height||A.scrollWidth>t.width}};function QK(i,e){return new Qf(i.get(Lc),i.get(qe),i.get(fs),e)}var Qf=class{_scrollDispatcher;_ngZone;_viewportRuler;_config;_scrollSubscription=null;_overlayRef;_initialScrollPosition;constructor(e,A,t,n){this._scrollDispatcher=e,this._ngZone=A,this._viewportRuler=t,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(this._scrollSubscription)return;let e=this._scrollDispatcher.scrolled(0).pipe(Ct(A=>!A||!this._overlayRef.overlayElement.contains(A.getElementRef().nativeElement)));this._config&&this._config.threshold&&this._config.threshold>1?(this._initialScrollPosition=this._viewportRuler.getViewportScrollPosition().top,this._scrollSubscription=e.subscribe(()=>{let A=this._viewportRuler.getViewportScrollPosition().top;Math.abs(A-this._initialScrollPosition)>this._config.threshold?this._detach():this._overlayRef.updatePosition()})):this._scrollSubscription=e.subscribe(this._detach)}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}_detach=()=>{this.disable(),this._overlayRef.hasAttached()&&this._ngZone.run(()=>this._overlayRef.detach())}};var bQ=class{enable(){}disable(){}attach(){}};function Xv(i,e){return e.some(A=>{let t=i.bottomA.bottom,o=i.rightA.right;return t||n||o||a})}function CK(i,e){return e.some(A=>{let t=i.topA.bottom,o=i.leftA.right;return t||n||o||a})}function x0(i,e){return new uf(i.get(Lc),i.get(fs),i.get(qe),e)}var uf=class{_scrollDispatcher;_viewportRuler;_ngZone;_config;_scrollSubscription=null;_overlayRef;constructor(e,A,t,n){this._scrollDispatcher=e,this._viewportRuler=A,this._ngZone=t,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(!this._scrollSubscription){let e=this._config?this._config.scrollThrottle:0;this._scrollSubscription=this._scrollDispatcher.scrolled(e).subscribe(()=>{if(this._overlayRef.updatePosition(),this._config&&this._config.autoClose){let A=this._overlayRef.overlayElement.getBoundingClientRect(),{width:t,height:n}=this._viewportRuler.getViewportSize();Xv(A,[{width:t,height:n,bottom:n,right:t,top:0,left:0}])&&(this.disable(),this._ngZone.run(()=>this._overlayRef.detach()))}})}}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}},uK=(()=>{class i{_injector=w(Dt);constructor(){}noop=()=>new bQ;close=A=>QK(this._injector,A);block=()=>zd(this._injector);reposition=A=>x0(this._injector,A);static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),kg=class{positionStrategy;scrollStrategy=new bQ;panelClass="";hasBackdrop=!1;backdropClass="cdk-overlay-dark-backdrop";disableAnimations;width;height;minWidth;minHeight;maxWidth;maxHeight;direction;disposeOnNavigation=!1;usePopover;eventPredicate;constructor(e){if(e){let A=Object.keys(e);for(let t of A)e[t]!==void 0&&(this[t]=e[t])}}};var pf=class{connectionPair;scrollableViewProperties;constructor(e,A){this.connectionPair=e,this.scrollableViewProperties=A}};var pK=(()=>{class i{_attachedOverlays=[];_document=w(ii);_isAttached=!1;constructor(){}ngOnDestroy(){this.detach()}add(A){this.remove(A),this._attachedOverlays.push(A)}remove(A){let t=this._attachedOverlays.indexOf(A);t>-1&&this._attachedOverlays.splice(t,1),this._attachedOverlays.length===0&&this.detach()}canReceiveEvent(A,t,n){return n.observers.length<1?!1:A.eventPredicate?A.eventPredicate(t):!0}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),fK=(()=>{class i extends pK{_ngZone=w(qe);_renderer=w(Rr).createRenderer(null,null);_cleanupKeydown;add(A){super.add(A),this._isAttached||(this._ngZone.runOutsideAngular(()=>{this._cleanupKeydown=this._renderer.listen("body","keydown",this._keydownListener)}),this._isAttached=!0)}detach(){this._isAttached&&(this._cleanupKeydown?.(),this._isAttached=!1)}_keydownListener=A=>{let t=this._attachedOverlays;for(let n=t.length-1;n>-1;n--){let o=t[n];if(this.canReceiveEvent(o,A,o._keydownEvents)){this._ngZone.run(()=>o._keydownEvents.next(A));break}}};static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),mK=(()=>{class i extends pK{_platform=w(Ci);_ngZone=w(qe);_renderer=w(Rr).createRenderer(null,null);_cursorOriginalValue;_cursorStyleIsSet=!1;_pointerDownEventTarget=null;_cleanups;add(A){if(super.add(A),!this._isAttached){let t=this._document.body,n={capture:!0},o=this._renderer;this._cleanups=this._ngZone.runOutsideAngular(()=>[o.listen(t,"pointerdown",this._pointerDownListener,n),o.listen(t,"click",this._clickListener,n),o.listen(t,"auxclick",this._clickListener,n),o.listen(t,"contextmenu",this._clickListener,n)]),this._platform.IOS&&!this._cursorStyleIsSet&&(this._cursorOriginalValue=t.style.cursor,t.style.cursor="pointer",this._cursorStyleIsSet=!0),this._isAttached=!0}}detach(){this._isAttached&&(this._cleanups?.forEach(A=>A()),this._cleanups=void 0,this._platform.IOS&&this._cursorStyleIsSet&&(this._document.body.style.cursor=this._cursorOriginalValue,this._cursorStyleIsSet=!1),this._isAttached=!1)}_pointerDownListener=A=>{this._pointerDownEventTarget=Fr(A)};_clickListener=A=>{let t=Fr(A),n=A.type==="click"&&this._pointerDownEventTarget?this._pointerDownEventTarget:t;this._pointerDownEventTarget=null;let o=this._attachedOverlays.slice();for(let a=o.length-1;a>-1;a--){let r=o[a],s=r._outsidePointerEvents;if(!(!r.hasAttached()||!this.canReceiveEvent(r,A,s))){if(IK(r.overlayElement,t)||IK(r.overlayElement,n))break;this._ngZone?this._ngZone.run(()=>s.next(A)):s.next(A)}}};static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function IK(i,e){let A=typeof ShadowRoot<"u"&&ShadowRoot,t=e;for(;t;){if(t===i)return!0;t=A&&t instanceof ShadowRoot?t.host:t.parentNode}return!1}var wK=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["ng-component"]],hostAttrs:["cdk-overlay-style-loader",""],decls:0,vars:0,template:function(t,n){},styles:[`.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed}@layer cdk-overlay{.cdk-overlay-container{z-index:1000}}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute}@layer cdk-overlay{.cdk-global-overlay-wrapper{z-index:1000}}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;display:flex;max-width:100%;max-height:100%}@layer cdk-overlay{.cdk-overlay-pane{z-index:1000}}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);opacity:0;touch-action:manipulation}@layer cdk-overlay{.cdk-overlay-backdrop{z-index:1000;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}}@media(prefers-reduced-motion){.cdk-overlay-backdrop{transition-duration:1ms}}.cdk-overlay-backdrop-showing{opacity:1}@media(forced-colors: active){.cdk-overlay-backdrop-showing{opacity:.6}}@layer cdk-overlay{.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing,.cdk-high-contrast-active .cdk-overlay-transparent-backdrop{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;display:flex;flex-direction:column;min-width:1px;min-height:1px}@layer cdk-overlay{.cdk-overlay-connected-position-bounding-box{z-index:1000}}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.cdk-overlay-popover{background:none;border:none;padding:0;outline:0;overflow:visible;position:fixed;pointer-events:none;white-space:normal;color:inherit;text-decoration:none;width:100%;height:100%;inset:auto;top:0;left:0}.cdk-overlay-popover::backdrop{display:none}.cdk-overlay-popover .cdk-overlay-backdrop{position:fixed;z-index:auto} +`],encapsulation:2,changeDetection:0})}return i})(),wf=(()=>{class i{_platform=w(Ci);_containerElement;_document=w(ii);_styleLoader=w(io);constructor(){}ngOnDestroy(){this._containerElement?.remove()}getContainerElement(){return this._loadStyles(),this._containerElement||this._createContainer(),this._containerElement}_createContainer(){let A="cdk-overlay-container";if(this._platform.isBrowser||hy()){let n=this._document.querySelectorAll(`.${A}[platform="server"], .${A}[platform="test"]`);for(let o=0;o{let e=this.element;clearTimeout(this._fallbackTimeout),this._cleanupTransitionEnd?.(),this._cleanupTransitionEnd=this._renderer.listen(e,"transitionend",this.dispose),this._fallbackTimeout=setTimeout(this.dispose,500),e.style.pointerEvents="none",e.classList.remove("cdk-overlay-backdrop-showing")})}dispose=()=>{clearTimeout(this._fallbackTimeout),this._cleanupClick?.(),this._cleanupTransitionEnd?.(),this._cleanupClick=this._cleanupTransitionEnd=this._fallbackTimeout=void 0,this.element.remove()}};function Ab(i){return i&&i.nodeType===1}var Od=class{_portalOutlet;_host;_pane;_config;_ngZone;_keyboardDispatcher;_document;_location;_outsideClickDispatcher;_animationsDisabled;_injector;_renderer;_backdropClick=new te;_attachments=new te;_detachments=new te;_positionStrategy;_scrollStrategy;_locationChanges=Mo.EMPTY;_backdropRef=null;_detachContentMutationObserver;_detachContentAfterRenderRef;_disposed=!1;_previousHostParent;_keydownEvents=new te;_outsidePointerEvents=new te;_afterNextRenderRef;constructor(e,A,t,n,o,a,r,s,l,g=!1,C,I){this._portalOutlet=e,this._host=A,this._pane=t,this._config=n,this._ngZone=o,this._keyboardDispatcher=a,this._document=r,this._location=s,this._outsideClickDispatcher=l,this._animationsDisabled=g,this._injector=C,this._renderer=I,n.scrollStrategy&&(this._scrollStrategy=n.scrollStrategy,this._scrollStrategy.attach(this)),this._positionStrategy=n.positionStrategy}get overlayElement(){return this._pane}get backdropElement(){return this._backdropRef?.element||null}get hostElement(){return this._host}get eventPredicate(){return this._config?.eventPredicate||null}attach(e){if(this._disposed)return null;this._attachHost();let A=this._portalOutlet.attach(e);return this._positionStrategy?.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._scrollStrategy&&this._scrollStrategy.enable(),this._afterNextRenderRef?.destroy(),this._afterNextRenderRef=jn(()=>{this.hasAttached()&&this.updatePosition()},{injector:this._injector}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!0),this._attachments.next(),this._completeDetachContent(),this._keyboardDispatcher.add(this),this._config.disposeOnNavigation&&(this._locationChanges=this._location.subscribe(()=>this.dispose())),this._outsideClickDispatcher.add(this),typeof A?.onDestroy=="function"&&A.onDestroy(()=>{this.hasAttached()&&this._ngZone.runOutsideAngular(()=>Promise.resolve().then(()=>this.detach()))}),A}detach(){if(!this.hasAttached())return;this.detachBackdrop(),this._togglePointerEvents(!1),this._positionStrategy&&this._positionStrategy.detach&&this._positionStrategy.detach(),this._scrollStrategy&&this._scrollStrategy.disable();let e=this._portalOutlet.detach();return this._detachments.next(),this._completeDetachContent(),this._keyboardDispatcher.remove(this),this._detachContentWhenEmpty(),this._locationChanges.unsubscribe(),this._outsideClickDispatcher.remove(this),e}dispose(){if(this._disposed)return;let e=this.hasAttached();this._positionStrategy&&this._positionStrategy.dispose(),this._disposeScrollStrategy(),this._backdropRef?.dispose(),this._locationChanges.unsubscribe(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),this._outsidePointerEvents.complete(),this._outsideClickDispatcher.remove(this),this._host?.remove(),this._afterNextRenderRef?.destroy(),this._previousHostParent=this._pane=this._host=this._backdropRef=null,e&&this._detachments.next(),this._detachments.complete(),this._completeDetachContent(),this._disposed=!0}hasAttached(){return this._portalOutlet.hasAttached()}backdropClick(){return this._backdropClick}attachments(){return this._attachments}detachments(){return this._detachments}keydownEvents(){return this._keydownEvents}outsidePointerEvents(){return this._outsidePointerEvents}getConfig(){return this._config}updatePosition(){this._positionStrategy&&this._positionStrategy.apply()}updatePositionStrategy(e){e!==this._positionStrategy&&(this._positionStrategy&&this._positionStrategy.dispose(),this._positionStrategy=e,this.hasAttached()&&(e.attach(this),this.updatePosition()))}updateSize(e){this._config=oA(oA({},this._config),e),this._updateElementSize()}setDirection(e){this._config=Oe(oA({},this._config),{direction:e}),this._updateElementDirection()}addPanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!0)}removePanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!1)}getDirection(){let e=this._config.direction;return e?typeof e=="string"?e:e.value:"ltr"}updateScrollStrategy(e){e!==this._scrollStrategy&&(this._disposeScrollStrategy(),this._scrollStrategy=e,this.hasAttached()&&(e.attach(this),e.enable()))}_updateElementDirection(){this._host.setAttribute("dir",this.getDirection())}_updateElementSize(){if(!this._pane)return;let e=this._pane.style;e.width=Ua(this._config.width),e.height=Ua(this._config.height),e.minWidth=Ua(this._config.minWidth),e.minHeight=Ua(this._config.minHeight),e.maxWidth=Ua(this._config.maxWidth),e.maxHeight=Ua(this._config.maxHeight)}_togglePointerEvents(e){this._pane.style.pointerEvents=e?"":"none"}_attachHost(){if(!this._host.parentElement){let e=this._config.usePopover?this._positionStrategy?.getPopoverInsertionPoint?.():null;Ab(e)?e.after(this._host):e?.type==="parent"?e.element.appendChild(this._host):this._previousHostParent?.appendChild(this._host)}if(this._config.usePopover)try{this._host.showPopover()}catch(e){}}_attachBackdrop(){let e="cdk-overlay-backdrop-showing";this._backdropRef?.dispose(),this._backdropRef=new $v(this._document,this._renderer,this._ngZone,A=>{this._backdropClick.next(A)}),this._animationsDisabled&&this._backdropRef.element.classList.add("cdk-overlay-backdrop-noop-animation"),this._config.backdropClass&&this._toggleClasses(this._backdropRef.element,this._config.backdropClass,!0),this._config.usePopover?this._host.prepend(this._backdropRef.element):this._host.parentElement.insertBefore(this._backdropRef.element,this._host),!this._animationsDisabled&&typeof requestAnimationFrame<"u"?this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>this._backdropRef?.element.classList.add(e))}):this._backdropRef.element.classList.add(e)}_updateStackingOrder(){!this._config.usePopover&&this._host.nextSibling&&this._host.parentNode.appendChild(this._host)}detachBackdrop(){this._animationsDisabled?(this._backdropRef?.dispose(),this._backdropRef=null):this._backdropRef?.detach()}_toggleClasses(e,A,t){let n=dd(A||[]).filter(o=>!!o);n.length&&(t?e.classList.add(...n):e.classList.remove(...n))}_detachContentWhenEmpty(){let e=!1;try{this._detachContentAfterRenderRef=jn(()=>{e=!0,this._detachContent()},{injector:this._injector})}catch(A){if(e)throw A;this._detachContent()}globalThis.MutationObserver&&this._pane&&(this._detachContentMutationObserver||=new globalThis.MutationObserver(()=>{this._detachContent()}),this._detachContentMutationObserver.observe(this._pane,{childList:!0}))}_detachContent(){(!this._pane||!this._host||this._pane.children.length===0)&&(this._pane&&this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!1),this._host&&this._host.parentElement&&(this._previousHostParent=this._host.parentElement,this._host.remove()),this._completeDetachContent())}_completeDetachContent(){this._detachContentAfterRenderRef?.destroy(),this._detachContentAfterRenderRef=void 0,this._detachContentMutationObserver?.disconnect()}_disposeScrollStrategy(){let e=this._scrollStrategy;e?.disable(),e?.detach?.()}},dK="cdk-overlay-connected-position-bounding-box",gnA=/([A-Za-z%]+)$/;function T1(i,e){return new ff(e,i.get(fs),i.get(ii),i.get(Ci),i.get(wf))}var ff=class{_viewportRuler;_document;_platform;_overlayContainer;_overlayRef;_isInitialRender=!1;_lastBoundingBoxSize={width:0,height:0};_isPushed=!1;_canPush=!0;_growAfterOpen=!1;_hasFlexibleDimensions=!0;_positionLocked=!1;_originRect;_overlayRect;_viewportRect;_containerRect;_viewportMargin=0;_scrollables=[];_preferredPositions=[];_origin;_pane;_isDisposed=!1;_boundingBox=null;_lastPosition=null;_lastScrollVisibility=null;_positionChanges=new te;_resizeSubscription=Mo.EMPTY;_offsetX=0;_offsetY=0;_transformOriginSelector;_appliedPanelClasses=[];_previousPushAmount=null;_popoverLocation="global";positionChanges=this._positionChanges;get positions(){return this._preferredPositions}constructor(e,A,t,n,o){this._viewportRuler=A,this._document=t,this._platform=n,this._overlayContainer=o,this.setOrigin(e)}attach(e){this._overlayRef&&this._overlayRef,this._validatePositions(),e.hostElement.classList.add(dK),this._overlayRef=e,this._boundingBox=e.hostElement,this._pane=e.overlayElement,this._isDisposed=!1,this._isInitialRender=!0,this._lastPosition=null,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(()=>{this._isInitialRender=!0,this.apply()})}apply(){if(this._isDisposed||!this._platform.isBrowser)return;if(!this._isInitialRender&&this._positionLocked&&this._lastPosition){this.reapplyLastPosition();return}this._clearPanelClasses(),this._resetOverlayElementStyles(),this._resetBoundingBoxStyles(),this._viewportRect=this._getNarrowedViewportRect(),this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._containerRect=this._getContainerRect();let e=this._originRect,A=this._overlayRect,t=this._viewportRect,n=this._containerRect,o=[],a;for(let r of this._preferredPositions){let s=this._getOriginPoint(e,n,r),l=this._getOverlayPoint(s,A,r),g=this._getOverlayFit(l,A,t,r);if(g.isCompletelyWithinViewport){this._isPushed=!1,this._applyPosition(r,s);return}if(this._canFitWithFlexibleDimensions(g,l,t)){o.push({position:r,origin:s,overlayRect:A,boundingBoxRect:this._calculateBoundingBoxRect(s,r)});continue}(!a||a.overlayFit.visibleAreas&&(s=g,r=l)}this._isPushed=!1,this._applyPosition(r.position,r.origin);return}if(this._canPush){this._isPushed=!0,this._applyPosition(a.position,a.originPoint);return}this._applyPosition(a.position,a.originPoint)}detach(){this._clearPanelClasses(),this._lastPosition=null,this._previousPushAmount=null,this._resizeSubscription.unsubscribe()}dispose(){this._isDisposed||(this._boundingBox&&U1(this._boundingBox.style,{top:"",left:"",right:"",bottom:"",height:"",width:"",alignItems:"",justifyContent:""}),this._pane&&this._resetOverlayElementStyles(),this._overlayRef&&this._overlayRef.hostElement.classList.remove(dK),this.detach(),this._positionChanges.complete(),this._overlayRef=this._boundingBox=null,this._isDisposed=!0)}reapplyLastPosition(){if(this._isDisposed||!this._platform.isBrowser)return;let e=this._lastPosition;e?(this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._viewportRect=this._getNarrowedViewportRect(),this._containerRect=this._getContainerRect(),this._applyPosition(e,this._getOriginPoint(this._originRect,this._containerRect,e))):this.apply()}withScrollableContainers(e){return this._scrollables=e,this}withPositions(e){return this._preferredPositions=e,e.indexOf(this._lastPosition)===-1&&(this._lastPosition=null),this._validatePositions(),this}withViewportMargin(e){return this._viewportMargin=e,this}withFlexibleDimensions(e=!0){return this._hasFlexibleDimensions=e,this}withGrowAfterOpen(e=!0){return this._growAfterOpen=e,this}withPush(e=!0){return this._canPush=e,this}withLockedPosition(e=!0){return this._positionLocked=e,this}setOrigin(e){return this._origin=e,this}withDefaultOffsetX(e){return this._offsetX=e,this}withDefaultOffsetY(e){return this._offsetY=e,this}withTransformOriginOn(e){return this._transformOriginSelector=e,this}withPopoverLocation(e){return this._popoverLocation=e,this}getPopoverInsertionPoint(){return this._popoverLocation==="global"?null:this._popoverLocation!=="inline"?this._popoverLocation:this._origin instanceof se?this._origin.nativeElement:Ab(this._origin)?this._origin:null}_getOriginPoint(e,A,t){let n;if(t.originX=="center")n=e.left+e.width/2;else{let a=this._isRtl()?e.right:e.left,r=this._isRtl()?e.left:e.right;n=t.originX=="start"?a:r}A.left<0&&(n-=A.left);let o;return t.originY=="center"?o=e.top+e.height/2:o=t.originY=="top"?e.top:e.bottom,A.top<0&&(o-=A.top),{x:n,y:o}}_getOverlayPoint(e,A,t){let n;t.overlayX=="center"?n=-A.width/2:t.overlayX==="start"?n=this._isRtl()?-A.width:0:n=this._isRtl()?0:-A.width;let o;return t.overlayY=="center"?o=-A.height/2:o=t.overlayY=="top"?0:-A.height,{x:e.x+n,y:e.y+o}}_getOverlayFit(e,A,t,n){let o=EK(A),{x:a,y:r}=e,s=this._getOffset(n,"x"),l=this._getOffset(n,"y");s&&(a+=s),l&&(r+=l);let g=0-a,C=a+o.width-t.width,I=0-r,B=r+o.height-t.height,Q=this._subtractOverflows(o.width,g,C),h=this._subtractOverflows(o.height,I,B),f=Q*h;return{visibleArea:f,isCompletelyWithinViewport:o.width*o.height===f,fitsInViewportVertically:h===o.height,fitsInViewportHorizontally:Q==o.width}}_canFitWithFlexibleDimensions(e,A,t){if(this._hasFlexibleDimensions){let n=t.bottom-A.y,o=t.right-A.x,a=BK(this._overlayRef.getConfig().minHeight),r=BK(this._overlayRef.getConfig().minWidth),s=e.fitsInViewportVertically||a!=null&&a<=n,l=e.fitsInViewportHorizontally||r!=null&&r<=o;return s&&l}return!1}_pushOverlayOnScreen(e,A,t){if(this._previousPushAmount&&this._positionLocked)return{x:e.x+this._previousPushAmount.x,y:e.y+this._previousPushAmount.y};let n=EK(A),o=this._viewportRect,a=Math.max(e.x+n.width-o.width,0),r=Math.max(e.y+n.height-o.height,0),s=Math.max(o.top-t.top-e.y,0),l=Math.max(o.left-t.left-e.x,0),g=0,C=0;return n.width<=o.width?g=l||-a:g=e.xQ&&!this._isInitialRender&&!this._growAfterOpen&&(a=e.y-Q/2)}let s=A.overlayX==="start"&&!n||A.overlayX==="end"&&n,l=A.overlayX==="end"&&!n||A.overlayX==="start"&&n,g,C,I;if(l)I=t.width-e.x+this._getViewportMarginStart()+this._getViewportMarginEnd(),g=e.x-this._getViewportMarginStart();else if(s)C=e.x,g=t.right-e.x-this._getViewportMarginEnd();else{let B=Math.min(t.right-e.x+t.left,e.x),Q=this._lastBoundingBoxSize.width;g=B*2,C=e.x-B,g>Q&&!this._isInitialRender&&!this._growAfterOpen&&(C=e.x-Q/2)}return{top:a,left:C,bottom:r,right:I,width:g,height:o}}_setBoundingBoxStyles(e,A){let t=this._calculateBoundingBoxRect(e,A);!this._isInitialRender&&!this._growAfterOpen&&(t.height=Math.min(t.height,this._lastBoundingBoxSize.height),t.width=Math.min(t.width,this._lastBoundingBoxSize.width));let n={};if(this._hasExactPosition())n.top=n.left="0",n.bottom=n.right="auto",n.maxHeight=n.maxWidth="",n.width=n.height="100%";else{let o=this._overlayRef.getConfig().maxHeight,a=this._overlayRef.getConfig().maxWidth;n.width=Ua(t.width),n.height=Ua(t.height),n.top=Ua(t.top)||"auto",n.bottom=Ua(t.bottom)||"auto",n.left=Ua(t.left)||"auto",n.right=Ua(t.right)||"auto",A.overlayX==="center"?n.alignItems="center":n.alignItems=A.overlayX==="end"?"flex-end":"flex-start",A.overlayY==="center"?n.justifyContent="center":n.justifyContent=A.overlayY==="bottom"?"flex-end":"flex-start",o&&(n.maxHeight=Ua(o)),a&&(n.maxWidth=Ua(a))}this._lastBoundingBoxSize=t,U1(this._boundingBox.style,n)}_resetBoundingBoxStyles(){U1(this._boundingBox.style,{top:"0",left:"0",right:"0",bottom:"0",height:"",width:"",alignItems:"",justifyContent:""})}_resetOverlayElementStyles(){U1(this._pane.style,{top:"",left:"",bottom:"",right:"",position:"",transform:""})}_setOverlayElementStyles(e,A){let t={},n=this._hasExactPosition(),o=this._hasFlexibleDimensions,a=this._overlayRef.getConfig();if(n){let g=this._viewportRuler.getViewportScrollPosition();U1(t,this._getExactOverlayY(A,e,g)),U1(t,this._getExactOverlayX(A,e,g))}else t.position="static";let r="",s=this._getOffset(A,"x"),l=this._getOffset(A,"y");s&&(r+=`translateX(${s}px) `),l&&(r+=`translateY(${l}px)`),t.transform=r.trim(),a.maxHeight&&(n?t.maxHeight=Ua(a.maxHeight):o&&(t.maxHeight="")),a.maxWidth&&(n?t.maxWidth=Ua(a.maxWidth):o&&(t.maxWidth="")),U1(this._pane.style,t)}_getExactOverlayY(e,A,t){let n={top:"",bottom:""},o=this._getOverlayPoint(A,this._overlayRect,e);if(this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,t)),e.overlayY==="bottom"){let a=this._document.documentElement.clientHeight;n.bottom=`${a-(o.y+this._overlayRect.height)}px`}else n.top=Ua(o.y);return n}_getExactOverlayX(e,A,t){let n={left:"",right:""},o=this._getOverlayPoint(A,this._overlayRect,e);this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,t));let a;if(this._isRtl()?a=e.overlayX==="end"?"left":"right":a=e.overlayX==="end"?"right":"left",a==="right"){let r=this._document.documentElement.clientWidth;n.right=`${r-(o.x+this._overlayRect.width)}px`}else n.left=Ua(o.x);return n}_getScrollVisibility(){let e=this._getOriginRect(),A=this._pane.getBoundingClientRect(),t=this._scrollables.map(n=>n.getElementRef().nativeElement.getBoundingClientRect());return{isOriginClipped:CK(e,t),isOriginOutsideView:Xv(e,t),isOverlayClipped:CK(A,t),isOverlayOutsideView:Xv(A,t)}}_subtractOverflows(e,...A){return A.reduce((t,n)=>t-Math.max(n,0),e)}_getNarrowedViewportRect(){let e=this._document.documentElement.clientWidth,A=this._document.documentElement.clientHeight,t=this._viewportRuler.getViewportScrollPosition();return{top:t.top+this._getViewportMarginTop(),left:t.left+this._getViewportMarginStart(),right:t.left+e-this._getViewportMarginEnd(),bottom:t.top+A-this._getViewportMarginBottom(),width:e-this._getViewportMarginStart()-this._getViewportMarginEnd(),height:A-this._getViewportMarginTop()-this._getViewportMarginBottom()}}_isRtl(){return this._overlayRef.getDirection()==="rtl"}_hasExactPosition(){return!this._hasFlexibleDimensions||this._isPushed}_getOffset(e,A){return A==="x"?e.offsetX==null?this._offsetX:e.offsetX:e.offsetY==null?this._offsetY:e.offsetY}_validatePositions(){}_addPanelClasses(e){this._pane&&dd(e).forEach(A=>{A!==""&&this._appliedPanelClasses.indexOf(A)===-1&&(this._appliedPanelClasses.push(A),this._pane.classList.add(A))})}_clearPanelClasses(){this._pane&&(this._appliedPanelClasses.forEach(e=>{this._pane.classList.remove(e)}),this._appliedPanelClasses=[])}_getViewportMarginStart(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.start??0}_getViewportMarginEnd(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.end??0}_getViewportMarginTop(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.top??0}_getViewportMarginBottom(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.bottom??0}_getOriginRect(){let e=this._origin;if(e instanceof se)return e.nativeElement.getBoundingClientRect();if(e instanceof Element)return e.getBoundingClientRect();let A=e.width||0,t=e.height||0;return{top:e.y,bottom:e.y+t,left:e.x,right:e.x+A,height:t,width:A}}_getContainerRect(){let e=this._overlayRef.getConfig().usePopover&&this._popoverLocation!=="global",A=this._overlayContainer.getContainerElement();e&&(A.style.display="block");let t=A.getBoundingClientRect();return e&&(A.style.display=""),t}};function U1(i,e){for(let A in e)e.hasOwnProperty(A)&&(i[A]=e[A]);return i}function BK(i){if(typeof i!="number"&&i!=null){let[e,A]=i.split(gnA);return!A||A==="px"?parseFloat(e):null}return i||null}function EK(i){return{top:Math.floor(i.top),right:Math.floor(i.right),bottom:Math.floor(i.bottom),left:Math.floor(i.left),width:Math.floor(i.width),height:Math.floor(i.height)}}function cnA(i,e){return i===e?!0:i.isOriginClipped===e.isOriginClipped&&i.isOriginOutsideView===e.isOriginOutsideView&&i.isOverlayClipped===e.isOverlayClipped&&i.isOverlayOutsideView===e.isOverlayOutsideView}var hK="cdk-global-overlay-wrapper";function JC(i){return new mf}var mf=class{_overlayRef;_cssPosition="static";_topOffset="";_bottomOffset="";_alignItems="";_xPosition="";_xOffset="";_width="";_height="";_isDisposed=!1;attach(e){let A=e.getConfig();this._overlayRef=e,this._width&&!A.width&&e.updateSize({width:this._width}),this._height&&!A.height&&e.updateSize({height:this._height}),e.hostElement.classList.add(hK),this._isDisposed=!1}top(e=""){return this._bottomOffset="",this._topOffset=e,this._alignItems="flex-start",this}left(e=""){return this._xOffset=e,this._xPosition="left",this}bottom(e=""){return this._topOffset="",this._bottomOffset=e,this._alignItems="flex-end",this}right(e=""){return this._xOffset=e,this._xPosition="right",this}start(e=""){return this._xOffset=e,this._xPosition="start",this}end(e=""){return this._xOffset=e,this._xPosition="end",this}width(e=""){return this._overlayRef?this._overlayRef.updateSize({width:e}):this._width=e,this}height(e=""){return this._overlayRef?this._overlayRef.updateSize({height:e}):this._height=e,this}centerHorizontally(e=""){return this.left(e),this._xPosition="center",this}centerVertically(e=""){return this.top(e),this._alignItems="center",this}apply(){if(!this._overlayRef||!this._overlayRef.hasAttached())return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement.style,t=this._overlayRef.getConfig(),{width:n,height:o,maxWidth:a,maxHeight:r}=t,s=(n==="100%"||n==="100vw")&&(!a||a==="100%"||a==="100vw"),l=(o==="100%"||o==="100vh")&&(!r||r==="100%"||r==="100vh"),g=this._xPosition,C=this._xOffset,I=this._overlayRef.getConfig().direction==="rtl",B="",Q="",h="";s?h="flex-start":g==="center"?(h="center",I?Q=C:B=C):I?g==="left"||g==="end"?(h="flex-end",B=C):(g==="right"||g==="start")&&(h="flex-start",Q=C):g==="left"||g==="start"?(h="flex-start",B=C):(g==="right"||g==="end")&&(h="flex-end",Q=C),e.position=this._cssPosition,e.marginLeft=s?"0":B,e.marginTop=l?"0":this._topOffset,e.marginBottom=this._bottomOffset,e.marginRight=s?"0":Q,A.justifyContent=h,A.alignItems=l?"flex-start":this._alignItems}dispose(){if(this._isDisposed||!this._overlayRef)return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement,t=A.style;A.classList.remove(hK),t.justifyContent=t.alignItems=e.marginTop=e.marginBottom=e.marginLeft=e.marginRight=e.position="",this._overlayRef=null,this._isDisposed=!0}},Df=(()=>{class i{_injector=w(Dt);constructor(){}global(){return JC()}flexibleConnectedTo(A){return T1(this._injector,A)}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),MQ=new MA("OVERLAY_DEFAULT_CONFIG");function xg(i,e){i.get(io).load(wK);let A=i.get(wf),t=i.get(ii),n=i.get(Bn),o=i.get(p0),a=i.get(fo),r=i.get(qi,null,{optional:!0})||i.get(Rr).createRenderer(null,null),s=new kg(e),l=i.get(MQ,null,{optional:!0})?.usePopover??!0;s.direction=s.direction||a.value,"showPopover"in t.body?s.usePopover=e?.usePopover??l:s.usePopover=!1;let g=t.createElement("div"),C=t.createElement("div");g.id=n.getId("cdk-overlay-"),g.classList.add("cdk-overlay-pane"),C.appendChild(g),s.usePopover&&(C.setAttribute("popover","manual"),C.classList.add("cdk-overlay-popover"));let I=s.usePopover?s.positionStrategy?.getPopoverInsertionPoint?.():null;return Ab(I)?I.after(C):I?.type==="parent"?I.element.appendChild(C):A.getContainerElement().appendChild(C),new Od(new vQ(g,o,i),C,g,s,i.get(qe),i.get(fK),t,i.get(Dc),i.get(mK),e?.disableAnimations??i.get(r1,null,{optional:!0})==="NoopAnimations",i.get(xr),r)}var J1=(()=>{class i{scrollStrategies=w(uK);_positionBuilder=w(Df);_injector=w(Dt);constructor(){}create(A){return xg(this._injector,A)}position(){return this._positionBuilder}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),CnA=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],InA=new MA("cdk-connected-overlay-scroll-strategy",{providedIn:"root",factory:()=>{let i=w(Dt);return()=>x0(i)}}),Hd=(()=>{class i{elementRef=w(se);constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdk-overlay-origin",""],["","overlay-origin",""],["","cdkOverlayOrigin",""]],exportAs:["cdkOverlayOrigin"]})}return i})(),DK=new MA("cdk-connected-overlay-default-config"),yf=(()=>{class i{_dir=w(fo,{optional:!0});_injector=w(Dt);_overlayRef;_templatePortal;_backdropSubscription=Mo.EMPTY;_attachSubscription=Mo.EMPTY;_detachSubscription=Mo.EMPTY;_positionSubscription=Mo.EMPTY;_offsetX;_offsetY;_position;_scrollStrategyFactory=w(InA);_ngZone=w(qe);origin;positions;positionStrategy;get offsetX(){return this._offsetX}set offsetX(A){this._offsetX=A,this._position&&this._updatePositionStrategy(this._position)}get offsetY(){return this._offsetY}set offsetY(A){this._offsetY=A,this._position&&this._updatePositionStrategy(this._position)}width;height;minWidth;minHeight;backdropClass;panelClass;viewportMargin=0;scrollStrategy;open=!1;disableClose=!1;transformOriginSelector;hasBackdrop=!1;lockPosition=!1;flexibleDimensions=!1;growAfterOpen=!1;push=!1;disposeOnNavigation=!1;usePopover;matchWidth=!1;set _config(A){typeof A!="string"&&this._assignConfig(A)}backdropClick=new LA;positionChange=new LA;attach=new LA;detach=new LA;overlayKeydown=new LA;overlayOutsideClick=new LA;constructor(){let A=w(lo),t=w(So),n=w(DK,{optional:!0}),o=w(MQ,{optional:!0});this.usePopover=o?.usePopover===!1?null:"global",this._templatePortal=new Gr(A,t),this.scrollStrategy=this._scrollStrategyFactory(),n&&this._assignConfig(n)}get overlayRef(){return this._overlayRef}get dir(){return this._dir?this._dir.value:"ltr"}ngOnDestroy(){this._attachSubscription.unsubscribe(),this._detachSubscription.unsubscribe(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._overlayRef?.dispose()}ngOnChanges(A){this._position&&(this._updatePositionStrategy(this._position),this._overlayRef?.updateSize({width:this._getWidth(),minWidth:this.minWidth,height:this.height,minHeight:this.minHeight}),A.origin&&this.open&&this._position.apply()),A.open&&(this.open?this.attachOverlay():this.detachOverlay())}_createOverlay(){(!this.positions||!this.positions.length)&&(this.positions=CnA);let A=this._overlayRef=xg(this._injector,this._buildConfig());this._attachSubscription=A.attachments().subscribe(()=>this.attach.emit()),this._detachSubscription=A.detachments().subscribe(()=>this.detach.emit()),A.keydownEvents().subscribe(t=>{this.overlayKeydown.next(t),t.keyCode===27&&!this.disableClose&&!ha(t)&&(t.preventDefault(),this.detachOverlay())}),this._overlayRef.outsidePointerEvents().subscribe(t=>{let n=this._getOriginElement(),o=Fr(t);(!n||n!==o&&!n.contains(o))&&this.overlayOutsideClick.next(t)})}_buildConfig(){let A=this._position=this.positionStrategy||this._createPositionStrategy(),t=new kg({direction:this._dir||"ltr",positionStrategy:A,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop,disposeOnNavigation:this.disposeOnNavigation,usePopover:!!this.usePopover});return(this.height||this.height===0)&&(t.height=this.height),(this.minWidth||this.minWidth===0)&&(t.minWidth=this.minWidth),(this.minHeight||this.minHeight===0)&&(t.minHeight=this.minHeight),this.backdropClass&&(t.backdropClass=this.backdropClass),this.panelClass&&(t.panelClass=this.panelClass),t}_updatePositionStrategy(A){let t=this.positions.map(n=>({originX:n.originX,originY:n.originY,overlayX:n.overlayX,overlayY:n.overlayY,offsetX:n.offsetX||this.offsetX,offsetY:n.offsetY||this.offsetY,panelClass:n.panelClass||void 0}));return A.setOrigin(this._getOrigin()).withPositions(t).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector).withPopoverLocation(this.usePopover===null?"global":this.usePopover)}_createPositionStrategy(){let A=T1(this._injector,this._getOrigin());return this._updatePositionStrategy(A),A}_getOrigin(){return this.origin instanceof Hd?this.origin.elementRef:this.origin}_getOriginElement(){return this.origin instanceof Hd?this.origin.elementRef.nativeElement:this.origin instanceof se?this.origin.nativeElement:typeof Element<"u"&&this.origin instanceof Element?this.origin:null}_getWidth(){return this.width?this.width:this.matchWidth?this._getOriginElement()?.getBoundingClientRect?.().width:void 0}attachOverlay(){this._overlayRef||this._createOverlay();let A=this._overlayRef;A.getConfig().hasBackdrop=this.hasBackdrop,A.updateSize({width:this._getWidth()}),A.hasAttached()||A.attach(this._templatePortal),this.hasBackdrop?this._backdropSubscription=A.backdropClick().subscribe(t=>this.backdropClick.emit(t)):this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.positionChange.observers.length>0&&(this._positionSubscription=this._position.positionChanges.pipe(qx(()=>this.positionChange.observers.length>0)).subscribe(t=>{this._ngZone.run(()=>this.positionChange.emit(t)),this.positionChange.observers.length===0&&this._positionSubscription.unsubscribe()})),this.open=!0}detachOverlay(){this._overlayRef?.detach(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.open=!1}_assignConfig(A){this.origin=A.origin??this.origin,this.positions=A.positions??this.positions,this.positionStrategy=A.positionStrategy??this.positionStrategy,this.offsetX=A.offsetX??this.offsetX,this.offsetY=A.offsetY??this.offsetY,this.width=A.width??this.width,this.height=A.height??this.height,this.minWidth=A.minWidth??this.minWidth,this.minHeight=A.minHeight??this.minHeight,this.backdropClass=A.backdropClass??this.backdropClass,this.panelClass=A.panelClass??this.panelClass,this.viewportMargin=A.viewportMargin??this.viewportMargin,this.scrollStrategy=A.scrollStrategy??this.scrollStrategy,this.disableClose=A.disableClose??this.disableClose,this.transformOriginSelector=A.transformOriginSelector??this.transformOriginSelector,this.hasBackdrop=A.hasBackdrop??this.hasBackdrop,this.lockPosition=A.lockPosition??this.lockPosition,this.flexibleDimensions=A.flexibleDimensions??this.flexibleDimensions,this.growAfterOpen=A.growAfterOpen??this.growAfterOpen,this.push=A.push??this.push,this.disposeOnNavigation=A.disposeOnNavigation??this.disposeOnNavigation,this.usePopover=A.usePopover??this.usePopover,this.matchWidth=A.matchWidth??this.matchWidth}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdk-connected-overlay",""],["","connected-overlay",""],["","cdkConnectedOverlay",""]],inputs:{origin:[0,"cdkConnectedOverlayOrigin","origin"],positions:[0,"cdkConnectedOverlayPositions","positions"],positionStrategy:[0,"cdkConnectedOverlayPositionStrategy","positionStrategy"],offsetX:[0,"cdkConnectedOverlayOffsetX","offsetX"],offsetY:[0,"cdkConnectedOverlayOffsetY","offsetY"],width:[0,"cdkConnectedOverlayWidth","width"],height:[0,"cdkConnectedOverlayHeight","height"],minWidth:[0,"cdkConnectedOverlayMinWidth","minWidth"],minHeight:[0,"cdkConnectedOverlayMinHeight","minHeight"],backdropClass:[0,"cdkConnectedOverlayBackdropClass","backdropClass"],panelClass:[0,"cdkConnectedOverlayPanelClass","panelClass"],viewportMargin:[0,"cdkConnectedOverlayViewportMargin","viewportMargin"],scrollStrategy:[0,"cdkConnectedOverlayScrollStrategy","scrollStrategy"],open:[0,"cdkConnectedOverlayOpen","open"],disableClose:[0,"cdkConnectedOverlayDisableClose","disableClose"],transformOriginSelector:[0,"cdkConnectedOverlayTransformOriginOn","transformOriginSelector"],hasBackdrop:[2,"cdkConnectedOverlayHasBackdrop","hasBackdrop",Ee],lockPosition:[2,"cdkConnectedOverlayLockPosition","lockPosition",Ee],flexibleDimensions:[2,"cdkConnectedOverlayFlexibleDimensions","flexibleDimensions",Ee],growAfterOpen:[2,"cdkConnectedOverlayGrowAfterOpen","growAfterOpen",Ee],push:[2,"cdkConnectedOverlayPush","push",Ee],disposeOnNavigation:[2,"cdkConnectedOverlayDisposeOnNavigation","disposeOnNavigation",Ee],usePopover:[0,"cdkConnectedOverlayUsePopover","usePopover"],matchWidth:[2,"cdkConnectedOverlayMatchWidth","matchWidth",Ee],_config:[0,"cdkConnectedOverlay","_config"]},outputs:{backdropClick:"backdropClick",positionChange:"positionChange",attach:"attach",detach:"detach",overlayKeydown:"overlayKeydown",overlayOutsideClick:"overlayOutsideClick"},exportAs:["cdkConnectedOverlay"],features:[Zt]})}return i})(),Yl=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({providers:[J1],imports:[Qi,Gc,Ef,Ef]})}return i})();function dnA(i,e){}var YC=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;closePredicate;width="";height="";minWidth;minHeight;maxWidth;maxHeight;positionStrategy;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;scrollStrategy;closeOnNavigation=!0;closeOnDestroy=!0;closeOnOverlayDetachments=!0;disableAnimations=!1;providers;container;templateContext};var tb=(()=>{class i extends TC{_elementRef=w(se);_focusTrapFactory=w(Uh);_config;_interactivityChecker=w(Ed);_ngZone=w(qe);_focusMonitor=w(Wa);_renderer=w(qi);_changeDetectorRef=w(wt);_injector=w(Dt);_platform=w(Ci);_document=w(ii);_portalOutlet;_focusTrapped=new te;_focusTrap=null;_elementFocusedBeforeDialogWasOpened=null;_closeInteractionType=null;_ariaLabelledByQueue=[];_isDestroyed=!1;constructor(){super(),this._config=w(YC,{optional:!0})||new YC,this._config.ariaLabelledBy&&this._ariaLabelledByQueue.push(this._config.ariaLabelledBy)}_addAriaLabelledBy(A){this._ariaLabelledByQueue.push(A),this._changeDetectorRef.markForCheck()}_removeAriaLabelledBy(A){let t=this._ariaLabelledByQueue.indexOf(A);t>-1&&(this._ariaLabelledByQueue.splice(t,1),this._changeDetectorRef.markForCheck())}_contentAttached(){this._initializeFocusTrap(),this._captureInitialFocus()}_captureInitialFocus(){this._trapFocus()}ngOnDestroy(){this._focusTrapped.complete(),this._isDestroyed=!0,this._restoreFocus()}attachComponentPortal(A){this._portalOutlet.hasAttached();let t=this._portalOutlet.attachComponentPortal(A);return this._contentAttached(),t}attachTemplatePortal(A){this._portalOutlet.hasAttached();let t=this._portalOutlet.attachTemplatePortal(A);return this._contentAttached(),t}attachDomPortal=A=>{this._portalOutlet.hasAttached();let t=this._portalOutlet.attachDomPortal(A);return this._contentAttached(),t};_recaptureFocus(){this._containsFocus()||this._trapFocus()}_forceFocus(A,t){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),a(),A.removeAttribute("tabindex")},o=this._renderer.listen(A,"blur",n),a=this._renderer.listen(A,"mousedown",n)})),A.focus(t)}_focusByCssSelector(A,t){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,t)}_trapFocus(A){this._isDestroyed||jn(()=>{let t=this._elementRef.nativeElement;switch(this._config.autoFocus){case!1:case"dialog":this._containsFocus()||t.focus(A);break;case!0:case"first-tabbable":this._focusTrap?.focusInitialElement(A)||this._focusDialogContainer(A);break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]',A);break;default:this._focusByCssSelector(this._config.autoFocus,A);break}this._focusTrapped.next()},{injector:this._injector})}_restoreFocus(){let A=this._config.restoreFocus,t=null;if(typeof A=="string"?t=this._document.querySelector(A):typeof A=="boolean"?t=A?this._elementFocusedBeforeDialogWasOpened:null:A&&(t=A),this._config.restoreFocus&&t&&typeof t.focus=="function"){let n=Fh(),o=this._elementRef.nativeElement;(!n||n===this._document.body||n===o||o.contains(n))&&(this._focusMonitor?(this._focusMonitor.focusVia(t,this._closeInteractionType),this._closeInteractionType=null):t.focus())}this._focusTrap&&this._focusTrap.destroy()}_focusDialogContainer(A){this._elementRef.nativeElement.focus?.(A)}_containsFocus(){let A=this._elementRef.nativeElement,t=Fh();return A===t||A.contains(t)}_initializeFocusTrap(){this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._document&&(this._elementFocusedBeforeDialogWasOpened=Fh()))}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["cdk-dialog-container"]],viewQuery:function(t,n){if(t&1&&Yt(Jl,7),t&2){let o;oe(o=ae())&&(n._portalOutlet=o.first)}},hostAttrs:["tabindex","-1",1,"cdk-dialog-container"],hostVars:6,hostBindings:function(t,n){t&2&&ee("id",n._config.id||null)("role",n._config.role)("aria-modal",n._config.ariaModal)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null)},features:[mt],decls:1,vars:0,consts:[["cdkPortalOutlet",""]],template:function(t,n){t&1&&yt(0,dnA,0,0,"ng-template",0)},dependencies:[Jl],styles:[`.cdk-dialog-container{display:block;width:100%;height:100%;min-height:inherit;max-height:inherit} +`],encapsulation:2})}return i})(),SQ=class{overlayRef;config;componentInstance=null;componentRef=null;containerInstance;disableClose;closed=new te;backdropClick;keydownEvents;outsidePointerEvents;id;_detachSubscription;constructor(e,A){this.overlayRef=e,this.config=A,this.disableClose=A.disableClose,this.backdropClick=e.backdropClick(),this.keydownEvents=e.keydownEvents(),this.outsidePointerEvents=e.outsidePointerEvents(),this.id=A.id,this.keydownEvents.subscribe(t=>{t.keyCode===27&&!this.disableClose&&!ha(t)&&(t.preventDefault(),this.close(void 0,{focusOrigin:"keyboard"}))}),this.backdropClick.subscribe(()=>{!this.disableClose&&this._canClose()?this.close(void 0,{focusOrigin:"mouse"}):this.containerInstance._recaptureFocus?.()}),this._detachSubscription=e.detachments().subscribe(()=>{A.closeOnOverlayDetachments!==!1&&this.close()})}close(e,A){if(this._canClose(e)){let t=this.closed;this.containerInstance._closeInteractionType=A?.focusOrigin||"program",this._detachSubscription.unsubscribe(),this.overlayRef.dispose(),t.next(e),t.complete(),this.componentInstance=this.containerInstance=null}}updatePosition(){return this.overlayRef.updatePosition(),this}updateSize(e="",A=""){return this.overlayRef.updateSize({width:e,height:A}),this}addPanelClass(e){return this.overlayRef.addPanelClass(e),this}removePanelClass(e){return this.overlayRef.removePanelClass(e),this}_canClose(e){let A=this.config;return!!this.containerInstance&&(!A.closePredicate||A.closePredicate(e,A,this.componentInstance))}},BnA=new MA("DialogScrollStrategy",{providedIn:"root",factory:()=>{let i=w(Dt);return()=>zd(i)}}),EnA=new MA("DialogData"),hnA=new MA("DefaultDialogConfig");function QnA(i){let e=mA(i),A=new LA;return{valueSignal:e,get value(){return e()},change:A,ngOnDestroy(){A.complete()}}}var ib=(()=>{class i{_injector=w(Dt);_defaultOptions=w(hnA,{optional:!0});_parentDialog=w(i,{optional:!0,skipSelf:!0});_overlayContainer=w(wf);_idGenerator=w(Bn);_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new te;_afterOpenedAtThisLevel=new te;_ariaHiddenElements=new Map;_scrollStrategy=w(BnA);get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}afterAllClosed=uc(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(kn(void 0)));constructor(){}open(A,t){let n=this._defaultOptions||new YC;t=oA(oA({},n),t),t.id=t.id||this._idGenerator.getId("cdk-dialog-"),t.id&&this.getDialogById(t.id);let o=this._getOverlayConfig(t),a=xg(this._injector,o),r=new SQ(a,t),s=this._attachContainer(a,r,t);if(r.containerInstance=s,!this.openDialogs.length){let l=this._overlayContainer.getContainerElement();s._focusTrapped?s._focusTrapped.pipe(po(1)).subscribe(()=>{this._hideNonDialogContentFromAssistiveTechnology(l)}):this._hideNonDialogContentFromAssistiveTechnology(l)}return this._attachDialogContent(A,r,s,t),this.openDialogs.push(r),r.closed.subscribe(()=>this._removeOpenDialog(r,!0)),this.afterOpened.next(r),r}closeAll(){eb(this.openDialogs,A=>A.close())}getDialogById(A){return this.openDialogs.find(t=>t.id===A)}ngOnDestroy(){eb(this._openDialogsAtThisLevel,A=>{A.config.closeOnDestroy===!1&&this._removeOpenDialog(A,!1)}),eb(this._openDialogsAtThisLevel,A=>A.close()),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete(),this._openDialogsAtThisLevel=[]}_getOverlayConfig(A){let t=new kg({positionStrategy:A.positionStrategy||JC().centerHorizontally().centerVertically(),scrollStrategy:A.scrollStrategy||this._scrollStrategy(),panelClass:A.panelClass,hasBackdrop:A.hasBackdrop,direction:A.direction,minWidth:A.minWidth,minHeight:A.minHeight,maxWidth:A.maxWidth,maxHeight:A.maxHeight,width:A.width,height:A.height,disposeOnNavigation:A.closeOnNavigation,disableAnimations:A.disableAnimations});return A.backdropClass&&(t.backdropClass=A.backdropClass),t}_attachContainer(A,t,n){let o=n.injector||n.viewContainerRef?.injector,a=[{provide:YC,useValue:n},{provide:SQ,useValue:t},{provide:Od,useValue:A}],r;n.container?typeof n.container=="function"?r=n.container:(r=n.container.type,a.push(...n.container.providers(n))):r=tb;let s=new ms(r,n.viewContainerRef,Dt.create({parent:o||this._injector,providers:a}));return A.attach(s).instance}_attachDialogContent(A,t,n,o){if(A instanceof lo){let a=this._createInjector(o,t,n,void 0),r={$implicit:o.data,dialogRef:t};o.templateContext&&(r=oA(oA({},r),typeof o.templateContext=="function"?o.templateContext():o.templateContext)),n.attachTemplatePortal(new Gr(A,null,r,a))}else{let a=this._createInjector(o,t,n,this._injector),r=n.attachComponentPortal(new ms(A,o.viewContainerRef,a));t.componentRef=r,t.componentInstance=r.instance}}_createInjector(A,t,n,o){let a=A.injector||A.viewContainerRef?.injector,r=[{provide:EnA,useValue:A.data},{provide:SQ,useValue:t}];return A.providers&&(typeof A.providers=="function"?r.push(...A.providers(t,A,n)):r.push(...A.providers)),A.direction&&(!a||!a.get(fo,null,{optional:!0}))&&r.push({provide:fo,useValue:QnA(A.direction)}),Dt.create({parent:a||o,providers:r})}_removeOpenDialog(A,t){let n=this.openDialogs.indexOf(A);n>-1&&(this.openDialogs.splice(n,1),this.openDialogs.length||(this._ariaHiddenElements.forEach((o,a)=>{o?a.setAttribute("aria-hidden",o):a.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),t&&this._getAfterAllClosed().next()))}_hideNonDialogContentFromAssistiveTechnology(A){if(A.parentElement){let t=A.parentElement.children;for(let n=t.length-1;n>-1;n--){let o=t[n];o!==A&&o.nodeName!=="SCRIPT"&&o.nodeName!=="STYLE"&&!o.hasAttribute("aria-live")&&!o.hasAttribute("popover")&&(this._ariaHiddenElements.set(o,o.getAttribute("aria-hidden")),o.setAttribute("aria-hidden","true"))}}}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();function eb(i,e){let A=i.length;for(;A--;)e(i[A])}var yK=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({providers:[ib],imports:[Yl,Gc,Jh,Gc]})}return i})();function unA(i,e){}var bf=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;closePredicate;width="";height="";minWidth;minHeight;maxWidth;maxHeight;position;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;delayFocusTrap=!0;scrollStrategy;closeOnNavigation=!0;enterAnimationDuration;exitAnimationDuration},nb="mdc-dialog--open",vK="mdc-dialog--opening",bK="mdc-dialog--closing",pnA=150,fnA=75,mnA=(()=>{class i extends tb{_animationStateChanged=new LA;_animationsEnabled=!nn();_actionSectionCount=0;_hostElement=this._elementRef.nativeElement;_enterAnimationDuration=this._animationsEnabled?SK(this._config.enterAnimationDuration)??pnA:0;_exitAnimationDuration=this._animationsEnabled?SK(this._config.exitAnimationDuration)??fnA:0;_animationTimer=null;_contentAttached(){super._contentAttached(),this._startOpenAnimation()}_startOpenAnimation(){this._animationStateChanged.emit({state:"opening",totalTime:this._enterAnimationDuration}),this._animationsEnabled?(this._hostElement.style.setProperty(MK,`${this._enterAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(vK,nb)),this._waitForAnimationToComplete(this._enterAnimationDuration,this._finishDialogOpen)):(this._hostElement.classList.add(nb),Promise.resolve().then(()=>this._finishDialogOpen()))}_startExitAnimation(){this._animationStateChanged.emit({state:"closing",totalTime:this._exitAnimationDuration}),this._hostElement.classList.remove(nb),this._animationsEnabled?(this._hostElement.style.setProperty(MK,`${this._exitAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(bK)),this._waitForAnimationToComplete(this._exitAnimationDuration,this._finishDialogClose)):Promise.resolve().then(()=>this._finishDialogClose())}_updateActionSectionCount(A){this._actionSectionCount+=A,this._changeDetectorRef.markForCheck()}_finishDialogOpen=()=>{this._clearAnimationClasses(),this._openAnimationDone(this._enterAnimationDuration)};_finishDialogClose=()=>{this._clearAnimationClasses(),this._animationStateChanged.emit({state:"closed",totalTime:this._exitAnimationDuration})};_clearAnimationClasses(){this._hostElement.classList.remove(vK,bK)}_waitForAnimationToComplete(A,t){this._animationTimer!==null&&clearTimeout(this._animationTimer),this._animationTimer=setTimeout(t,A)}_requestAnimationFrame(A){this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(A):A()})}_captureInitialFocus(){this._config.delayFocusTrap||this._trapFocus()}_openAnimationDone(A){this._config.delayFocusTrap&&this._trapFocus(),this._animationStateChanged.next({state:"opened",totalTime:A})}ngOnDestroy(){super.ngOnDestroy(),this._animationTimer!==null&&clearTimeout(this._animationTimer)}attachComponentPortal(A){let t=super.attachComponentPortal(A);return t.location.nativeElement.classList.add("mat-mdc-dialog-component-host"),t}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275cmp=bA({type:i,selectors:[["mat-dialog-container"]],hostAttrs:["tabindex","-1",1,"mat-mdc-dialog-container","mdc-dialog"],hostVars:10,hostBindings:function(t,n){t&2&&(Ea("id",n._config.id),ee("aria-modal",n._config.ariaModal)("role",n._config.role)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null),xA("_mat-animation-noopable",!n._animationsEnabled)("mat-mdc-dialog-container-with-actions",n._actionSectionCount>0))},features:[mt],decls:3,vars:0,consts:[[1,"mat-mdc-dialog-inner-container","mdc-dialog__container"],[1,"mat-mdc-dialog-surface","mdc-dialog__surface"],["cdkPortalOutlet",""]],template:function(t,n){t&1&&(d(0,"div",0)(1,"div",1),yt(2,unA,0,0,"ng-template",2),E()())},dependencies:[Jl],styles:[`.mat-mdc-dialog-container{width:100%;height:100%;display:block;box-sizing:border-box;max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;outline:0}.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-max-width, 560px);min-width:var(--mat-dialog-container-min-width, 280px)}@media(max-width: 599px){.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-small-max-width, calc(100vw - 32px))}}.mat-mdc-dialog-inner-container{display:flex;flex-direction:row;align-items:center;justify-content:space-around;box-sizing:border-box;height:100%;opacity:0;transition:opacity linear var(--mat-dialog-transition-duration, 0ms);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit}.mdc-dialog--closing .mat-mdc-dialog-inner-container{transition:opacity 75ms linear;transform:none}.mdc-dialog--open .mat-mdc-dialog-inner-container{opacity:1}._mat-animation-noopable .mat-mdc-dialog-inner-container{transition:none}.mat-mdc-dialog-surface{display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;box-sizing:border-box;width:100%;height:100%;position:relative;overflow-y:auto;outline:0;transform:scale(0.8);transition:transform var(--mat-dialog-transition-duration, 0ms) cubic-bezier(0, 0, 0.2, 1);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;box-shadow:var(--mat-dialog-container-elevation-shadow, none);border-radius:var(--mat-dialog-container-shape, var(--mat-sys-corner-extra-large, 4px));background-color:var(--mat-dialog-container-color, var(--mat-sys-surface, white))}[dir=rtl] .mat-mdc-dialog-surface{text-align:right}.mdc-dialog--open .mat-mdc-dialog-surface,.mdc-dialog--closing .mat-mdc-dialog-surface{transform:none}._mat-animation-noopable .mat-mdc-dialog-surface{transition:none}.mat-mdc-dialog-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:2px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mat-mdc-dialog-title{display:block;position:relative;flex-shrink:0;box-sizing:border-box;margin:0 0 1px;padding:var(--mat-dialog-headline-padding, 6px 24px 13px)}.mat-mdc-dialog-title::before{display:inline-block;width:0;height:40px;content:"";vertical-align:0}[dir=rtl] .mat-mdc-dialog-title{text-align:right}.mat-mdc-dialog-container .mat-mdc-dialog-title{color:var(--mat-dialog-subhead-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-dialog-subhead-font, var(--mat-sys-headline-small-font, inherit));line-height:var(--mat-dialog-subhead-line-height, var(--mat-sys-headline-small-line-height, 1.5rem));font-size:var(--mat-dialog-subhead-size, var(--mat-sys-headline-small-size, 1rem));font-weight:var(--mat-dialog-subhead-weight, var(--mat-sys-headline-small-weight, 400));letter-spacing:var(--mat-dialog-subhead-tracking, var(--mat-sys-headline-small-tracking, 0.03125em))}.mat-mdc-dialog-content{display:block;flex-grow:1;box-sizing:border-box;margin:0;overflow:auto;max-height:65vh}.mat-mdc-dialog-content>:first-child{margin-top:0}.mat-mdc-dialog-content>:last-child{margin-bottom:0}.mat-mdc-dialog-container .mat-mdc-dialog-content{color:var(--mat-dialog-supporting-text-color, var(--mat-sys-on-surface-variant, rgba(0, 0, 0, 0.6)));font-family:var(--mat-dialog-supporting-text-font, var(--mat-sys-body-medium-font, inherit));line-height:var(--mat-dialog-supporting-text-line-height, var(--mat-sys-body-medium-line-height, 1.5rem));font-size:var(--mat-dialog-supporting-text-size, var(--mat-sys-body-medium-size, 1rem));font-weight:var(--mat-dialog-supporting-text-weight, var(--mat-sys-body-medium-weight, 400));letter-spacing:var(--mat-dialog-supporting-text-tracking, var(--mat-sys-body-medium-tracking, 0.03125em))}.mat-mdc-dialog-container .mat-mdc-dialog-content{padding:var(--mat-dialog-content-padding, 20px 24px)}.mat-mdc-dialog-container-with-actions .mat-mdc-dialog-content{padding:var(--mat-dialog-with-actions-content-padding, 20px 24px 0)}.mat-mdc-dialog-container .mat-mdc-dialog-title+.mat-mdc-dialog-content{padding-top:0}.mat-mdc-dialog-actions{display:flex;position:relative;flex-shrink:0;flex-wrap:wrap;align-items:center;box-sizing:border-box;min-height:52px;margin:0;border-top:1px solid rgba(0,0,0,0);padding:var(--mat-dialog-actions-padding, 16px 24px);justify-content:var(--mat-dialog-actions-alignment, flex-end)}@media(forced-colors: active){.mat-mdc-dialog-actions{border-top-color:CanvasText}}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-start,.mat-mdc-dialog-actions[align=start]{justify-content:start}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-center,.mat-mdc-dialog-actions[align=center]{justify-content:center}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-end,.mat-mdc-dialog-actions[align=end]{justify-content:flex-end}.mat-mdc-dialog-actions .mat-button-base+.mat-button-base,.mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-mdc-dialog-actions .mat-button-base+.mat-button-base,[dir=rtl] .mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}.mat-mdc-dialog-component-host{display:contents} +`],encapsulation:2})}return i})(),MK="--mat-dialog-transition-duration";function SK(i){return i==null?null:typeof i=="number"?i:i.endsWith("ms")?Ls(i.substring(0,i.length-2)):i.endsWith("s")?Ls(i.substring(0,i.length-1))*1e3:i==="0"?0:null}var vf=(function(i){return i[i.OPEN=0]="OPEN",i[i.CLOSING=1]="CLOSING",i[i.CLOSED=2]="CLOSED",i})(vf||{}),Vn=class{_ref;_config;_containerInstance;componentInstance;componentRef=null;disableClose;id;_afterOpened=new Qg(1);_beforeClosed=new Qg(1);_result;_closeFallbackTimeout;_state=vf.OPEN;_closeInteractionType;constructor(e,A,t){this._ref=e,this._config=A,this._containerInstance=t,this.disableClose=A.disableClose,this.id=e.id,e.addPanelClass("mat-mdc-dialog-panel"),t._animationStateChanged.pipe(Ct(n=>n.state==="opened"),po(1)).subscribe(()=>{this._afterOpened.next(),this._afterOpened.complete()}),t._animationStateChanged.pipe(Ct(n=>n.state==="closed"),po(1)).subscribe(()=>{clearTimeout(this._closeFallbackTimeout),this._finishDialogClose()}),e.overlayRef.detachments().subscribe(()=>{this._beforeClosed.next(this._result),this._beforeClosed.complete(),this._finishDialogClose()}),Ti(this.backdropClick(),this.keydownEvents().pipe(Ct(n=>n.keyCode===27&&!this.disableClose&&!ha(n)))).subscribe(n=>{this.disableClose||(n.preventDefault(),kK(this,n.type==="keydown"?"keyboard":"mouse"))})}close(e){let A=this._config.closePredicate;A&&!A(e,this._config,this.componentInstance)||(this._result=e,this._containerInstance._animationStateChanged.pipe(Ct(t=>t.state==="closing"),po(1)).subscribe(t=>{this._beforeClosed.next(e),this._beforeClosed.complete(),this._ref.overlayRef.detachBackdrop(),this._closeFallbackTimeout=setTimeout(()=>this._finishDialogClose(),t.totalTime+100)}),this._state=vf.CLOSING,this._containerInstance._startExitAnimation())}afterOpened(){return this._afterOpened}afterClosed(){return this._ref.closed}beforeClosed(){return this._beforeClosed}backdropClick(){return this._ref.backdropClick}keydownEvents(){return this._ref.keydownEvents}updatePosition(e){let A=this._ref.config.positionStrategy;return e&&(e.left||e.right)?e.left?A.left(e.left):A.right(e.right):A.centerHorizontally(),e&&(e.top||e.bottom)?e.top?A.top(e.top):A.bottom(e.bottom):A.centerVertically(),this._ref.updatePosition(),this}updateSize(e="",A=""){return this._ref.updateSize(e,A),this}addPanelClass(e){return this._ref.addPanelClass(e),this}removePanelClass(e){return this._ref.removePanelClass(e),this}getState(){return this._state}_finishDialogClose(){this._state=vf.CLOSED,this._ref.close(this._result,{focusOrigin:this._closeInteractionType}),this.componentInstance=null}};function kK(i,e,A){return i._closeInteractionType=e,i.close(A)}var xo=new MA("MatMdcDialogData"),wnA=new MA("mat-mdc-dialog-default-options"),DnA=new MA("mat-mdc-dialog-scroll-strategy",{providedIn:"root",factory:()=>{let i=w(Dt);return()=>zd(i)}}),Ja=(()=>{class i{_defaultOptions=w(wnA,{optional:!0});_scrollStrategy=w(DnA);_parentDialog=w(i,{optional:!0,skipSelf:!0});_idGenerator=w(Bn);_injector=w(Dt);_dialog=w(ib);_animationsDisabled=nn();_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new te;_afterOpenedAtThisLevel=new te;dialogConfigClass=bf;_dialogRefConstructor;_dialogContainerType;_dialogDataToken;get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}afterAllClosed=uc(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(kn(void 0)));constructor(){this._dialogRefConstructor=Vn,this._dialogContainerType=mnA,this._dialogDataToken=xo}open(A,t){let n;t=oA(oA({},this._defaultOptions||new bf),t),t.id=t.id||this._idGenerator.getId("mat-mdc-dialog-"),t.scrollStrategy=t.scrollStrategy||this._scrollStrategy();let o=this._dialog.open(A,Oe(oA({},t),{positionStrategy:JC(this._injector).centerHorizontally().centerVertically(),disableClose:!0,closePredicate:void 0,closeOnDestroy:!1,closeOnOverlayDetachments:!1,disableAnimations:this._animationsDisabled||t.enterAnimationDuration?.toLocaleString()==="0"||t.exitAnimationDuration?.toString()==="0",container:{type:this._dialogContainerType,providers:()=>[{provide:this.dialogConfigClass,useValue:t},{provide:YC,useValue:t}]},templateContext:()=>({dialogRef:n}),providers:(a,r,s)=>(n=new this._dialogRefConstructor(a,t,s),n.updatePosition(t?.position),[{provide:this._dialogContainerType,useValue:s},{provide:this._dialogDataToken,useValue:r.data},{provide:this._dialogRefConstructor,useValue:n}])}));return n.componentRef=o.componentRef,n.componentInstance=o.componentInstance,this.openDialogs.push(n),this.afterOpened.next(n),n.afterClosed().subscribe(()=>{let a=this.openDialogs.indexOf(n);a>-1&&(this.openDialogs.splice(a,1),this.openDialogs.length||this._getAfterAllClosed().next())}),n}closeAll(){this._closeDialogs(this.openDialogs)}getDialogById(A){return this.openDialogs.find(t=>t.id===A)}ngOnDestroy(){this._closeDialogs(this._openDialogsAtThisLevel),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete()}_closeDialogs(A){let t=A.length;for(;t--;)A[t].close()}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})(),OC=(()=>{class i{dialogRef=w(Vn,{optional:!0});_elementRef=w(se);_dialog=w(Ja);ariaLabel;type="button";dialogResult;_matDialogClose;constructor(){}ngOnInit(){this.dialogRef||(this.dialogRef=xK(this._elementRef,this._dialog.openDialogs))}ngOnChanges(A){let t=A._matDialogClose||A._matDialogCloseResult;t&&(this.dialogResult=t.currentValue)}_onButtonClick(A){kK(this.dialogRef,A.screenX===0&&A.screenY===0?"keyboard":"mouse",this.dialogResult)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","mat-dialog-close",""],["","matDialogClose",""]],hostVars:2,hostBindings:function(t,n){t&1&&T("click",function(a){return n._onButtonClick(a)}),t&2&&ee("aria-label",n.ariaLabel||null)("type",n.type)},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],type:"type",dialogResult:[0,"mat-dialog-close","dialogResult"],_matDialogClose:[0,"matDialogClose","_matDialogClose"]},exportAs:["matDialogClose"],features:[Zt]})}return i})(),_K=(()=>{class i{_dialogRef=w(Vn,{optional:!0});_elementRef=w(se);_dialog=w(Ja);constructor(){}ngOnInit(){this._dialogRef||(this._dialogRef=xK(this._elementRef,this._dialog.openDialogs)),this._dialogRef&&Promise.resolve().then(()=>{this._onAdd()})}ngOnDestroy(){this._dialogRef?._containerInstance&&Promise.resolve().then(()=>{this._onRemove()})}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i})}return i})(),na=(()=>{class i extends _K{id=w(Bn).getId("mat-mdc-dialog-title-");_onAdd(){this._dialogRef._containerInstance?._addAriaLabelledBy?.(this.id)}_onRemove(){this._dialogRef?._containerInstance?._removeAriaLabelledBy?.(this.id)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["","mat-dialog-title",""],["","matDialogTitle",""]],hostAttrs:[1,"mat-mdc-dialog-title","mdc-dialog__title"],hostVars:1,hostBindings:function(t,n){t&2&&Ea("id",n.id)},inputs:{id:"id"},exportAs:["matDialogTitle"],features:[mt]})}return i})(),ua=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","mat-dialog-content",""],["mat-dialog-content"],["","matDialogContent",""]],hostAttrs:[1,"mat-mdc-dialog-content","mdc-dialog__content"],features:[f3([_0])]})}return i})(),pa=(()=>{class i extends _K{align;_onAdd(){this._dialogRef._containerInstance?._updateActionSectionCount?.(1)}_onRemove(){this._dialogRef._containerInstance?._updateActionSectionCount?.(-1)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["","mat-dialog-actions",""],["mat-dialog-actions"],["","matDialogActions",""]],hostAttrs:[1,"mat-mdc-dialog-actions","mdc-dialog__actions"],hostVars:6,hostBindings:function(t,n){t&2&&xA("mat-mdc-dialog-actions-align-start",n.align==="start")("mat-mdc-dialog-actions-align-center",n.align==="center")("mat-mdc-dialog-actions-align-end",n.align==="end")},inputs:{align:"align"},features:[mt]})}return i})();function xK(i,e){let A=i.nativeElement.parentElement;for(;A&&!A.classList.contains("mat-mdc-dialog-container");)A=A.parentElement;return A?e.find(t=>t.id===A.id):null}var hl=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({providers:[Ja],imports:[yK,Yl,Gc,Qi]})}return i})();function RK(i){return Error(`Unable to find icon with the name "${i}"`)}function ynA(){return Error("Could not find HttpClient for use with Angular Material icons. Please add provideHttpClient() to your providers.")}function NK(i){return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was "${i}".`)}function FK(i){return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by Angular's DomSanitizer. Attempted literal was "${i}".`)}var R0=class{url;svgText;options;svgElement=null;constructor(e,A,t){this.url=e,this.svgText=A,this.options=t}},GK=(()=>{class i{_httpClient;_sanitizer;_errorHandler;_document;_svgIconConfigs=new Map;_iconSetConfigs=new Map;_cachedIconsByUrl=new Map;_inProgressUrlFetches=new Map;_fontCssClassesByAlias=new Map;_resolvers=[];_defaultFontSetClass=["material-icons","mat-ligature-font"];constructor(A,t,n,o){this._httpClient=A,this._sanitizer=t,this._errorHandler=o,this._document=n}addSvgIcon(A,t,n){return this.addSvgIconInNamespace("",A,t,n)}addSvgIconLiteral(A,t,n){return this.addSvgIconLiteralInNamespace("",A,t,n)}addSvgIconInNamespace(A,t,n,o){return this._addSvgIconConfig(A,t,new R0(n,null,o))}addSvgIconResolver(A){return this._resolvers.push(A),this}addSvgIconLiteralInNamespace(A,t,n,o){let a=this._sanitizer.sanitize(fg.HTML,n);if(!a)throw FK(n);let r=E1(a);return this._addSvgIconConfig(A,t,new R0("",r,o))}addSvgIconSet(A,t){return this.addSvgIconSetInNamespace("",A,t)}addSvgIconSetLiteral(A,t){return this.addSvgIconSetLiteralInNamespace("",A,t)}addSvgIconSetInNamespace(A,t,n){return this._addSvgIconSetConfig(A,new R0(t,null,n))}addSvgIconSetLiteralInNamespace(A,t,n){let o=this._sanitizer.sanitize(fg.HTML,t);if(!o)throw FK(t);let a=E1(o);return this._addSvgIconSetConfig(A,new R0("",a,n))}registerFontClassAlias(A,t=A){return this._fontCssClassesByAlias.set(A,t),this}classNameForFontAlias(A){return this._fontCssClassesByAlias.get(A)||A}setDefaultFontSetClass(...A){return this._defaultFontSetClass=A,this}getDefaultFontSetClass(){return this._defaultFontSetClass}getSvgIconFromUrl(A){let t=this._sanitizer.sanitize(fg.RESOURCE_URL,A);if(!t)throw NK(A);let n=this._cachedIconsByUrl.get(t);return n?ie(Mf(n)):this._loadSvgIconFromConfig(new R0(A,null)).pipe(Ei(o=>this._cachedIconsByUrl.set(t,o)),ye(o=>Mf(o)))}getNamedSvgIcon(A,t=""){let n=LK(t,A),o=this._svgIconConfigs.get(n);if(o)return this._getSvgFromConfig(o);if(o=this._getIconConfigFromResolvers(t,A),o)return this._svgIconConfigs.set(n,o),this._getSvgFromConfig(o);let a=this._iconSetConfigs.get(t);return a?this._getSvgFromIconSetConfigs(A,a):g3(RK(n))}ngOnDestroy(){this._resolvers=[],this._svgIconConfigs.clear(),this._iconSetConfigs.clear(),this._cachedIconsByUrl.clear()}_getSvgFromConfig(A){return A.svgText?ie(Mf(this._svgElementFromConfig(A))):this._loadSvgIconFromConfig(A).pipe(ye(t=>Mf(t)))}_getSvgFromIconSetConfigs(A,t){let n=this._extractIconWithNameFromAnySet(A,t);if(n)return ie(n);let o=t.filter(a=>!a.svgText).map(a=>this._loadSvgIconSetFromConfig(a).pipe(qo(r=>{let l=`Loading icon set URL: ${this._sanitizer.sanitize(fg.RESOURCE_URL,a.url)} failed: ${r.message}`;return this._errorHandler.handleError(new Error(l)),ie(null)})));return DC(o).pipe(ye(()=>{let a=this._extractIconWithNameFromAnySet(A,t);if(!a)throw RK(A);return a}))}_extractIconWithNameFromAnySet(A,t){for(let n=t.length-1;n>=0;n--){let o=t[n];if(o.svgText&&o.svgText.toString().indexOf(A)>-1){let a=this._svgElementFromConfig(o),r=this._extractSvgIconFromSet(a,A,o.options);if(r)return r}}return null}_loadSvgIconFromConfig(A){return this._fetchIcon(A).pipe(Ei(t=>A.svgText=t),ye(()=>this._svgElementFromConfig(A)))}_loadSvgIconSetFromConfig(A){return A.svgText?ie(null):this._fetchIcon(A).pipe(Ei(t=>A.svgText=t))}_extractSvgIconFromSet(A,t,n){let o=A.querySelector(`[id="${t}"]`);if(!o)return null;let a=o.cloneNode(!0);if(a.removeAttribute("id"),a.nodeName.toLowerCase()==="svg")return this._setSvgAttributes(a,n);if(a.nodeName.toLowerCase()==="symbol")return this._setSvgAttributes(this._toSvgElement(a),n);let r=this._svgElementFromString(E1(""));return r.appendChild(a),this._setSvgAttributes(r,n)}_svgElementFromString(A){let t=this._document.createElement("DIV");t.innerHTML=A;let n=t.querySelector("svg");if(!n)throw Error(" tag not found");return n}_toSvgElement(A){let t=this._svgElementFromString(E1("")),n=A.attributes;for(let o=0;oE1(l)),d3(()=>this._inProgressUrlFetches.delete(a)),vC());return this._inProgressUrlFetches.set(a,s),s}_addSvgIconConfig(A,t,n){return this._svgIconConfigs.set(LK(A,t),n),this}_addSvgIconSetConfig(A,t){let n=this._iconSetConfigs.get(A);return n?n.push(t):this._iconSetConfigs.set(A,[t]),this}_svgElementFromConfig(A){if(!A.svgElement){let t=this._svgElementFromString(A.svgText);this._setSvgAttributes(t,A.options),A.svgElement=t}return A.svgElement}_getIconConfigFromResolvers(A,t){for(let n=0;n{let i=w(ii),e=i?i.location:null;return{getPathname:()=>e?e.pathname+e.search:""}}}),KK=["clip-path","color-profile","src","cursor","fill","filter","marker","marker-start","marker-mid","marker-end","mask","stroke"],knA=KK.map(i=>`[${i}]`).join(", "),_nA=/^url\(['"]?#(.*?)['"]?\)$/,zt=(()=>{class i{_elementRef=w(se);_iconRegistry=w(GK);_location=w(SnA);_errorHandler=w(B3);_defaultColor;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;inline=!1;get svgIcon(){return this._svgIcon}set svgIcon(A){A!==this._svgIcon&&(A?this._updateSvgIcon(A):this._svgIcon&&this._clearSvgElement(),this._svgIcon=A)}_svgIcon;get fontSet(){return this._fontSet}set fontSet(A){let t=this._cleanupFontValue(A);t!==this._fontSet&&(this._fontSet=t,this._updateFontIconClasses())}_fontSet;get fontIcon(){return this._fontIcon}set fontIcon(A){let t=this._cleanupFontValue(A);t!==this._fontIcon&&(this._fontIcon=t,this._updateFontIconClasses())}_fontIcon;_previousFontSetClass=[];_previousFontIconClass;_svgName=null;_svgNamespace=null;_previousPath;_elementsWithExternalReferences;_currentIconFetch=Mo.EMPTY;constructor(){let A=w(new ks("aria-hidden"),{optional:!0}),t=w(MnA,{optional:!0});t&&(t.color&&(this.color=this._defaultColor=t.color),t.fontSet&&(this.fontSet=t.fontSet)),A||this._elementRef.nativeElement.setAttribute("aria-hidden","true")}_splitIconName(A){if(!A)return["",""];let t=A.split(":");switch(t.length){case 1:return["",t[0]];case 2:return t;default:throw Error(`Invalid icon name: "${A}"`)}}ngOnInit(){this._updateFontIconClasses()}ngAfterViewChecked(){let A=this._elementsWithExternalReferences;if(A&&A.size){let t=this._location.getPathname();t!==this._previousPath&&(this._previousPath=t,this._prependPathToReferences(t))}}ngOnDestroy(){this._currentIconFetch.unsubscribe(),this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear()}_usingFontIcon(){return!this.svgIcon}_setSvgElement(A){this._clearSvgElement();let t=this._location.getPathname();this._previousPath=t,this._cacheChildrenWithExternalReferences(A),this._prependPathToReferences(t),this._elementRef.nativeElement.appendChild(A)}_clearSvgElement(){let A=this._elementRef.nativeElement,t=A.childNodes.length;for(this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear();t--;){let n=A.childNodes[t];(n.nodeType!==1||n.nodeName.toLowerCase()==="svg")&&n.remove()}}_updateFontIconClasses(){if(!this._usingFontIcon())return;let A=this._elementRef.nativeElement,t=(this.fontSet?this._iconRegistry.classNameForFontAlias(this.fontSet).split(/ +/):this._iconRegistry.getDefaultFontSetClass()).filter(n=>n.length>0);this._previousFontSetClass.forEach(n=>A.classList.remove(n)),t.forEach(n=>A.classList.add(n)),this._previousFontSetClass=t,this.fontIcon!==this._previousFontIconClass&&!t.includes("mat-ligature-font")&&(this._previousFontIconClass&&A.classList.remove(this._previousFontIconClass),this.fontIcon&&A.classList.add(this.fontIcon),this._previousFontIconClass=this.fontIcon)}_cleanupFontValue(A){return typeof A=="string"?A.trim().split(" ")[0]:A}_prependPathToReferences(A){let t=this._elementsWithExternalReferences;t&&t.forEach((n,o)=>{n.forEach(a=>{o.setAttribute(a.name,`url('${A}#${a.value}')`)})})}_cacheChildrenWithExternalReferences(A){let t=A.querySelectorAll(knA),n=this._elementsWithExternalReferences=this._elementsWithExternalReferences||new Map;for(let o=0;o{let r=t[o],s=r.getAttribute(a),l=s?s.match(_nA):null;if(l){let g=n.get(r);g||(g=[],n.set(r,g)),g.push({name:a,value:l[1]})}})}_updateSvgIcon(A){if(this._svgNamespace=null,this._svgName=null,this._currentIconFetch.unsubscribe(),A){let[t,n]=this._splitIconName(A);t&&(this._svgNamespace=t),n&&(this._svgName=n),this._currentIconFetch=this._iconRegistry.getNamedSvgIcon(n,t).pipe(po(1)).subscribe(o=>this._setSvgElement(o),o=>{let a=`Error retrieving icon ${t}:${n}! ${o.message}`;this._errorHandler.handleError(new Error(a))})}}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-icon"]],hostAttrs:["role","img",1,"mat-icon","notranslate"],hostVars:10,hostBindings:function(t,n){t&2&&(ee("data-mat-icon-type",n._usingFontIcon()?"font":"svg")("data-mat-icon-name",n._svgName||n.fontIcon)("data-mat-icon-namespace",n._svgNamespace||n.fontSet)("fontIcon",n._usingFontIcon()?n.fontIcon:null),go(n.color?"mat-"+n.color:""),xA("mat-icon-inline",n.inline)("mat-icon-no-color",n.color!=="primary"&&n.color!=="accent"&&n.color!=="warn"))},inputs:{color:"color",inline:[2,"inline","inline",Ee],svgIcon:"svgIcon",fontSet:"fontSet",fontIcon:"fontIcon"},exportAs:["matIcon"],ngContentSelectors:bnA,decls:1,vars:0,template:function(t,n){t&1&&(Nt(),Ve(0))},styles:[`mat-icon,mat-icon.mat-primary,mat-icon.mat-accent,mat-icon.mat-warn{color:var(--mat-icon-color, inherit)}.mat-icon{-webkit-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px;overflow:hidden}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}.mat-icon.mat-ligature-font[fontIcon]::before{content:attr(fontIcon)}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto} +`],encapsulation:2,changeDetection:0})}return i})(),On=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Qi]})}return i})();var xnA=["mat-menu-item",""],RnA=[[["mat-icon"],["","matMenuItemIcon",""]],"*"],NnA=["mat-icon, [matMenuItemIcon]","*"];function FnA(i,e){i&1&&(It(),d(0,"svg",2),lA(1,"polygon",3),E())}var LnA=["*"];function GnA(i,e){if(i&1){let A=rA();Dn(0,"div",0),td("click",function(){G(A);let n=p();return K(n.closed.emit("click"))})("animationstart",function(n){G(A);let o=p();return K(o._onAnimationStart(n.animationName))})("animationend",function(n){G(A);let o=p();return K(o._onAnimationDone(n.animationName))})("animationcancel",function(n){G(A);let o=p();return K(o._onAnimationDone(n.animationName))}),Dn(1,"div",1),Ve(2),Tn()()}if(i&2){let A=p();go(A._classList),xA("mat-menu-panel-animations-disabled",A._animationsDisabled)("mat-menu-panel-exit-animation",A._panelAnimationState==="void")("mat-menu-panel-animating",A._isAnimating()),Ea("id",A.panelId),ee("aria-label",A.ariaLabel||null)("aria-labelledby",A.ariaLabelledby||null)("aria-describedby",A.ariaDescribedby||null)}}var ab=new MA("MAT_MENU_PANEL"),Ds=(()=>{class i{_elementRef=w(se);_document=w(ii);_focusMonitor=w(Wa);_parentMenu=w(ab,{optional:!0});_changeDetectorRef=w(wt);role="menuitem";disabled=!1;disableRipple=!1;_hovered=new te;_focused=new te;_highlighted=!1;_triggersSubmenu=!1;constructor(){w(io).load(rr),this._parentMenu?.addItem?.(this)}focus(A,t){this._focusMonitor&&A?this._focusMonitor.focusVia(this._getHostElement(),A,t):this._getHostElement().focus(t),this._focused.next(this)}ngAfterViewInit(){this._focusMonitor&&this._focusMonitor.monitor(this._elementRef,!1)}ngOnDestroy(){this._focusMonitor&&this._focusMonitor.stopMonitoring(this._elementRef),this._parentMenu&&this._parentMenu.removeItem&&this._parentMenu.removeItem(this),this._hovered.complete(),this._focused.complete()}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._elementRef.nativeElement}_checkDisabled(A){this.disabled&&(A.preventDefault(),A.stopPropagation())}_handleMouseEnter(){this._hovered.next(this)}getLabel(){let A=this._elementRef.nativeElement.cloneNode(!0),t=A.querySelectorAll("mat-icon, .material-icons");for(let n=0;n({overlapTrigger:!1,xPosition:"after",yPosition:"below",backdropClass:"cdk-overlay-transparent-backdrop"})}),ob="_mat-menu-enter",kf="_mat-menu-exit",ns=(()=>{class i{_elementRef=w(se);_changeDetectorRef=w(wt);_injector=w(Dt);_keyManager;_xPosition;_yPosition;_firstItemFocusRef;_exitFallbackTimeout;_animationsDisabled=nn();_allItems;_directDescendantItems=new pg;_classList={};_panelAnimationState="void";_animationDone=new te;_isAnimating=mA(!1);parentMenu;direction;overlayPanelClass;backdropClass;ariaLabel;ariaLabelledby;ariaDescribedby;get xPosition(){return this._xPosition}set xPosition(A){this._xPosition=A,this.setPositionClasses()}get yPosition(){return this._yPosition}set yPosition(A){this._yPosition=A,this.setPositionClasses()}templateRef;items;lazyContent;overlapTrigger=!1;hasBackdrop;set panelClass(A){let t=this._previousPanelClass,n=oA({},this._classList);t&&t.length&&t.split(" ").forEach(o=>{n[o]=!1}),this._previousPanelClass=A,A&&A.length&&(A.split(" ").forEach(o=>{n[o]=!0}),this._elementRef.nativeElement.className=""),this._classList=n}_previousPanelClass;get classList(){return this.panelClass}set classList(A){this.panelClass=A}closed=new LA;close=this.closed;panelId=w(Bn).getId("mat-menu-panel-");constructor(){let A=w(UnA);this.overlayPanelClass=A.overlayPanelClass||"",this._xPosition=A.xPosition,this._yPosition=A.yPosition,this.backdropClass=A.backdropClass,this.overlapTrigger=A.overlapTrigger,this.hasBackdrop=A.hasBackdrop}ngOnInit(){this.setPositionClasses()}ngAfterContentInit(){this._updateDirectDescendants(),this._keyManager=new y0(this._directDescendantItems).withWrap().withTypeAhead().withHomeAndEnd(),this._keyManager.tabOut.subscribe(()=>this.closed.emit("tab")),this._directDescendantItems.changes.pipe(kn(this._directDescendantItems),pi(A=>Ti(...A.map(t=>t._focused)))).subscribe(A=>this._keyManager.updateActiveItem(A)),this._directDescendantItems.changes.subscribe(A=>{let t=this._keyManager;if(this._panelAnimationState==="enter"&&t.activeItem?._hasFocus()){let n=A.toArray(),o=Math.max(0,Math.min(n.length-1,t.activeItemIndex||0));n[o]&&!n[o].disabled?t.setActiveItem(o):t.setNextItemActive()}})}ngOnDestroy(){this._keyManager?.destroy(),this._directDescendantItems.destroy(),this.closed.complete(),this._firstItemFocusRef?.destroy(),clearTimeout(this._exitFallbackTimeout)}_hovered(){return this._directDescendantItems.changes.pipe(kn(this._directDescendantItems),pi(t=>Ti(...t.map(n=>n._hovered))))}addItem(A){}removeItem(A){}_handleKeydown(A){let t=A.keyCode,n=this._keyManager;switch(t){case 27:ha(A)||(A.preventDefault(),this.closed.emit("keydown"));break;case 37:this.parentMenu&&this.direction==="ltr"&&this.closed.emit("keydown");break;case 39:this.parentMenu&&this.direction==="rtl"&&this.closed.emit("keydown");break;default:(t===38||t===40)&&n.setFocusOrigin("keyboard"),n.onKeydown(A);return}}focusFirstItem(A="program"){this._firstItemFocusRef?.destroy(),this._firstItemFocusRef=jn(()=>{let t=this._resolvePanel();if(!t||!t.contains(document.activeElement)){let n=this._keyManager;n.setFocusOrigin(A).setFirstItemActive(),!n.activeItem&&t&&t.focus()}},{injector:this._injector})}resetActiveItem(){this._keyManager.setActiveItem(-1)}setElevation(A){}setPositionClasses(A=this.xPosition,t=this.yPosition){this._classList=Oe(oA({},this._classList),{"mat-menu-before":A==="before","mat-menu-after":A==="after","mat-menu-above":t==="above","mat-menu-below":t==="below"}),this._changeDetectorRef.markForCheck()}_onAnimationDone(A){let t=A===kf;(t||A===ob)&&(t&&(clearTimeout(this._exitFallbackTimeout),this._exitFallbackTimeout=void 0),this._animationDone.next(t?"void":"enter"),this._isAnimating.set(!1))}_onAnimationStart(A){(A===ob||A===kf)&&this._isAnimating.set(!0)}_setIsOpen(A){if(this._panelAnimationState=A?"enter":"void",A){if(this._keyManager.activeItemIndex===0){let t=this._resolvePanel();t&&(t.scrollTop=0)}}else this._animationsDisabled||(this._exitFallbackTimeout=setTimeout(()=>this._onAnimationDone(kf),200));this._animationsDisabled&&setTimeout(()=>{this._onAnimationDone(A?ob:kf)}),this._changeDetectorRef.markForCheck()}_updateDirectDescendants(){this._allItems.changes.pipe(kn(this._allItems)).subscribe(A=>{this._directDescendantItems.reset(A.filter(t=>t._parentMenu===this)),this._directDescendantItems.notifyOnChanges()})}_resolvePanel(){let A=null;return this._directDescendantItems.length&&(A=this._directDescendantItems.first._getHostElement().closest('[role="menu"]')),A}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-menu"]],contentQueries:function(t,n,o){if(t&1&&Vo(o,KnA,5)(o,Ds,5)(o,Ds,4),t&2){let a;oe(a=ae())&&(n.lazyContent=a.first),oe(a=ae())&&(n._allItems=a),oe(a=ae())&&(n.items=a)}},viewQuery:function(t,n){if(t&1&&Yt(lo,5),t&2){let o;oe(o=ae())&&(n.templateRef=o.first)}},hostVars:3,hostBindings:function(t,n){t&2&&ee("aria-label",null)("aria-labelledby",null)("aria-describedby",null)},inputs:{backdropClass:"backdropClass",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],xPosition:"xPosition",yPosition:"yPosition",overlapTrigger:[2,"overlapTrigger","overlapTrigger",Ee],hasBackdrop:[2,"hasBackdrop","hasBackdrop",A=>A==null?null:Ee(A)],panelClass:[0,"class","panelClass"],classList:"classList"},outputs:{closed:"closed",close:"close"},exportAs:["matMenu"],features:[Et([{provide:ab,useExisting:i}])],ngContentSelectors:LnA,decls:1,vars:0,consts:[["tabindex","-1","role","menu",1,"mat-mdc-menu-panel",3,"click","animationstart","animationend","animationcancel","id"],[1,"mat-mdc-menu-content"]],template:function(t,n){t&1&&(Nt(),m3(0,GnA,3,12,"ng-template"))},styles:[`mat-menu{display:none}.mat-mdc-menu-content{margin:0;padding:8px 0;outline:0}.mat-mdc-menu-content,.mat-mdc-menu-content .mat-mdc-menu-item .mat-mdc-menu-item-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;flex:1;white-space:normal;font-family:var(--mat-menu-item-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-menu-item-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-menu-item-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-menu-item-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-menu-item-label-text-weight, var(--mat-sys-label-large-weight))}@keyframes _mat-menu-enter{from{opacity:0;transform:scale(0.8)}to{opacity:1;transform:none}}@keyframes _mat-menu-exit{from{opacity:1}to{opacity:0}}.mat-mdc-menu-panel{min-width:112px;max-width:280px;overflow:auto;box-sizing:border-box;outline:0;animation:_mat-menu-enter 120ms cubic-bezier(0, 0, 0.2, 1);border-radius:var(--mat-menu-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-menu-container-color, var(--mat-sys-surface-container));box-shadow:var(--mat-menu-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));will-change:transform,opacity}.mat-mdc-menu-panel.mat-menu-panel-exit-animation{animation:_mat-menu-exit 100ms 25ms linear forwards}.mat-mdc-menu-panel.mat-menu-panel-animations-disabled{animation:none}.mat-mdc-menu-panel.mat-menu-panel-animating{pointer-events:none}.mat-mdc-menu-panel.mat-menu-panel-animating:has(.mat-mdc-menu-content:empty){display:none}@media(forced-colors: active){.mat-mdc-menu-panel{outline:solid 1px}}.mat-mdc-menu-panel .mat-divider{border-top-color:var(--mat-menu-divider-color, var(--mat-sys-surface-variant));margin-bottom:var(--mat-menu-divider-bottom-spacing, 8px);margin-top:var(--mat-menu-divider-top-spacing, 8px)}.mat-mdc-menu-item{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;cursor:pointer;width:100%;text-align:left;box-sizing:border-box;color:inherit;font-size:inherit;background:none;text-decoration:none;margin:0;min-height:48px;padding-left:var(--mat-menu-item-leading-spacing, 12px);padding-right:var(--mat-menu-item-trailing-spacing, 12px);-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-menu-item::-moz-focus-inner{border:0}[dir=rtl] .mat-mdc-menu-item{padding-left:var(--mat-menu-item-trailing-spacing, 12px);padding-right:var(--mat-menu-item-leading-spacing, 12px)}.mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-leading-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-trailing-spacing, 12px)}[dir=rtl] .mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-trailing-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-leading-spacing, 12px)}.mat-mdc-menu-item,.mat-mdc-menu-item:visited,.mat-mdc-menu-item:link{color:var(--mat-menu-item-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-menu-item .mat-icon-no-color,.mat-mdc-menu-item .mat-mdc-menu-submenu-icon{color:var(--mat-menu-item-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-menu-item[disabled]{cursor:default;opacity:.38}.mat-mdc-menu-item[disabled]::after{display:block;position:absolute;content:"";top:0;left:0;bottom:0;right:0}.mat-mdc-menu-item:focus{outline:0}.mat-mdc-menu-item .mat-icon{flex-shrink:0;margin-right:var(--mat-menu-item-spacing, 12px);height:var(--mat-menu-item-icon-size, 24px);width:var(--mat-menu-item-icon-size, 24px)}[dir=rtl] .mat-mdc-menu-item{text-align:right}[dir=rtl] .mat-mdc-menu-item .mat-icon{margin-right:0;margin-left:var(--mat-menu-item-spacing, 12px)}.mat-mdc-menu-item:not([disabled]):hover{background-color:var(--mat-menu-item-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-menu-item:not([disabled]).cdk-program-focused,.mat-mdc-menu-item:not([disabled]).cdk-keyboard-focused,.mat-mdc-menu-item:not([disabled]).mat-mdc-menu-item-highlighted{background-color:var(--mat-menu-item-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}@media(forced-colors: active){.mat-mdc-menu-item{margin-top:1px}}.mat-mdc-menu-submenu-icon{width:var(--mat-menu-item-icon-size, 24px);height:10px;fill:currentColor;padding-left:var(--mat-menu-item-spacing, 12px)}[dir=rtl] .mat-mdc-menu-submenu-icon{padding-right:var(--mat-menu-item-spacing, 12px);padding-left:0}[dir=rtl] .mat-mdc-menu-submenu-icon polygon{transform:scaleX(-1);transform-origin:center}@media(forced-colors: active){.mat-mdc-menu-submenu-icon{fill:CanvasText}}.mat-mdc-menu-item .mat-mdc-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none} +`],encapsulation:2,changeDetection:0})}return i})(),TnA=new MA("mat-menu-scroll-strategy",{providedIn:"root",factory:()=>{let i=w(Dt);return()=>x0(i)}});var Pd=new WeakMap,JnA=(()=>{class i{_canHaveBackdrop;_element=w(se);_viewContainerRef=w(So);_menuItemInstance=w(Ds,{optional:!0,self:!0});_dir=w(fo,{optional:!0});_focusMonitor=w(Wa);_ngZone=w(qe);_injector=w(Dt);_scrollStrategy=w(TnA);_changeDetectorRef=w(wt);_animationsDisabled=nn();_portal;_overlayRef=null;_menuOpen=!1;_closingActionsSubscription=Mo.EMPTY;_menuCloseSubscription=Mo.EMPTY;_pendingRemoval;_parentMaterialMenu;_parentInnerPadding;_openedBy=void 0;get _menu(){return this._menuInternal}set _menu(A){A!==this._menuInternal&&(this._menuInternal=A,this._menuCloseSubscription.unsubscribe(),A&&(this._parentMaterialMenu,this._menuCloseSubscription=A.close.subscribe(t=>{this._destroyMenu(t),(t==="click"||t==="tab")&&this._parentMaterialMenu&&this._parentMaterialMenu.closed.emit(t)})),this._menuItemInstance?._setTriggersSubmenu(this._triggersSubmenu()))}_menuInternal=null;constructor(A){this._canHaveBackdrop=A;let t=w(ab,{optional:!0});this._parentMaterialMenu=t instanceof ns?t:void 0}ngOnDestroy(){this._menu&&this._ownsMenu(this._menu)&&Pd.delete(this._menu),this._pendingRemoval?.unsubscribe(),this._menuCloseSubscription.unsubscribe(),this._closingActionsSubscription.unsubscribe(),this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null)}get menuOpen(){return this._menuOpen}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_triggersSubmenu(){return!!(this._menuItemInstance&&this._parentMaterialMenu&&this._menu)}_closeMenu(){this._menu?.close.emit()}_openMenu(A){if(this._triggerIsAriaDisabled())return;let t=this._menu;if(this._menuOpen||!t)return;this._pendingRemoval?.unsubscribe();let n=Pd.get(t);Pd.set(t,this),n&&n!==this&&n._closeMenu();let o=this._createOverlay(t),a=o.getConfig(),r=a.positionStrategy;this._setPosition(t,r),this._canHaveBackdrop?a.hasBackdrop=t.hasBackdrop==null?!this._triggersSubmenu():t.hasBackdrop:a.hasBackdrop=t.hasBackdrop??!1,o.hasAttached()||(o.attach(this._getPortal(t)),t.lazyContent?.attach(this.menuData)),this._closingActionsSubscription=this._menuClosingActions().subscribe(()=>this._closeMenu()),t.parentMenu=this._triggersSubmenu()?this._parentMaterialMenu:void 0,t.direction=this.dir,A&&t.focusFirstItem(this._openedBy||"program"),this._setIsMenuOpen(!0),t instanceof ns&&(t._setIsOpen(!0),t._directDescendantItems.changes.pipe(ut(t.close)).subscribe(()=>{r.withLockedPosition(!1).reapplyLastPosition(),r.withLockedPosition(!0)}))}focus(A,t){this._focusMonitor&&A?this._focusMonitor.focusVia(this._element,A,t):this._element.nativeElement.focus(t)}_destroyMenu(A){let t=this._overlayRef,n=this._menu;!t||!this.menuOpen||(this._closingActionsSubscription.unsubscribe(),this._pendingRemoval?.unsubscribe(),n instanceof ns&&this._ownsMenu(n)?(this._pendingRemoval=n._animationDone.pipe(po(1)).subscribe(()=>{t.detach(),Pd.has(n)||n.lazyContent?.detach()}),n._setIsOpen(!1)):(t.detach(),n?.lazyContent?.detach()),n&&this._ownsMenu(n)&&Pd.delete(n),this.restoreFocus&&(A==="keydown"||!this._openedBy||!this._triggersSubmenu())&&this.focus(this._openedBy),this._openedBy=void 0,this._setIsMenuOpen(!1))}_setIsMenuOpen(A){A!==this._menuOpen&&(this._menuOpen=A,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this._triggersSubmenu()&&this._menuItemInstance._setHighlighted(A),this._changeDetectorRef.markForCheck())}_createOverlay(A){if(!this._overlayRef){let t=this._getOverlayConfig(A);this._subscribeToPositions(A,t.positionStrategy),this._overlayRef=xg(this._injector,t),this._overlayRef.keydownEvents().subscribe(n=>{this._menu instanceof ns&&this._menu._handleKeydown(n)})}return this._overlayRef}_getOverlayConfig(A){return new kg({positionStrategy:T1(this._injector,this._getOverlayOrigin()).withLockedPosition().withGrowAfterOpen().withTransformOriginOn(".mat-menu-panel, .mat-mdc-menu-panel"),backdropClass:A.backdropClass||"cdk-overlay-transparent-backdrop",panelClass:A.overlayPanelClass,scrollStrategy:this._scrollStrategy(),direction:this._dir||"ltr",disableAnimations:this._animationsDisabled})}_subscribeToPositions(A,t){A.setPositionClasses&&t.positionChanges.subscribe(n=>{this._ngZone.run(()=>{let o=n.connectionPair.overlayX==="start"?"after":"before",a=n.connectionPair.overlayY==="top"?"below":"above";A.setPositionClasses(o,a)})})}_setPosition(A,t){let[n,o]=A.xPosition==="before"?["end","start"]:["start","end"],[a,r]=A.yPosition==="above"?["bottom","top"]:["top","bottom"],[s,l]=[a,r],[g,C]=[n,o],I=0;if(this._triggersSubmenu()){if(C=n=A.xPosition==="before"?"start":"end",o=g=n==="end"?"start":"end",this._parentMaterialMenu){if(this._parentInnerPadding==null){let B=this._parentMaterialMenu.items.first;this._parentInnerPadding=B?B._getHostElement().offsetTop:0}I=a==="bottom"?this._parentInnerPadding:-this._parentInnerPadding}}else A.overlapTrigger||(s=a==="top"?"bottom":"top",l=r==="top"?"bottom":"top");t.withPositions([{originX:n,originY:s,overlayX:g,overlayY:a,offsetY:I},{originX:o,originY:s,overlayX:C,overlayY:a,offsetY:I},{originX:n,originY:l,overlayX:g,overlayY:r,offsetY:-I},{originX:o,originY:l,overlayX:C,overlayY:r,offsetY:-I}])}_menuClosingActions(){let A=this._getOutsideClickStream(this._overlayRef),t=this._overlayRef.detachments(),n=this._parentMaterialMenu?this._parentMaterialMenu.closed:ie(),o=this._parentMaterialMenu?this._parentMaterialMenu._hovered().pipe(Ct(a=>this._menuOpen&&a!==this._menuItemInstance)):ie();return Ti(A,n,o,t)}_getPortal(A){return(!this._portal||this._portal.templateRef!==A.templateRef)&&(this._portal=new Gr(A.templateRef,this._viewContainerRef)),this._portal}_ownsMenu(A){return Pd.get(A)===this}_triggerIsAriaDisabled(){return Ee(this._element.nativeElement.getAttribute("aria-disabled"))}static \u0275fac=function(t){u3()};static \u0275dir=qA({type:i})}return i})(),Hl=(()=>{class i extends JnA{_cleanupTouchstart;_hoverSubscription=Mo.EMPTY;get _deprecatedMatMenuTriggerFor(){return this.menu}set _deprecatedMatMenuTriggerFor(A){this.menu=A}get menu(){return this._menu}set menu(A){this._menu=A}menuData;restoreFocus=!0;menuOpened=new LA;onMenuOpen=this.menuOpened;menuClosed=new LA;onMenuClose=this.menuClosed;constructor(){super(!0);let A=w(qi);this._cleanupTouchstart=A.listen(this._element.nativeElement,"touchstart",t=>{B1(t)||(this._openedBy="touch")},{passive:!0})}triggersSubmenu(){return super._triggersSubmenu()}toggleMenu(){return this.menuOpen?this.closeMenu():this.openMenu()}openMenu(){this._openMenu(!0)}closeMenu(){this._closeMenu()}updatePosition(){this._overlayRef?.updatePosition()}ngAfterContentInit(){this._handleHover()}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTouchstart(),this._hoverSubscription.unsubscribe()}_getOverlayOrigin(){return this._element}_getOutsideClickStream(A){return A.backdropClick()}_handleMousedown(A){d1(A)||(this._openedBy=A.button===0?"mouse":void 0,this.triggersSubmenu()&&A.preventDefault())}_handleKeydown(A){let t=A.keyCode;(t===13||t===32)&&(this._openedBy="keyboard"),this.triggersSubmenu()&&(t===39&&this.dir==="ltr"||t===37&&this.dir==="rtl")&&(this._openedBy="keyboard",this.openMenu())}_handleClick(A){this.triggersSubmenu()?(A.stopPropagation(),this.openMenu()):this.toggleMenu()}_handleHover(){this.triggersSubmenu()&&this._parentMaterialMenu&&(this._hoverSubscription=this._parentMaterialMenu._hovered().subscribe(A=>{A===this._menuItemInstance&&!A.disabled&&this._parentMaterialMenu?._panelAnimationState!=="void"&&(this._openedBy="mouse",this._openMenu(!1))}))}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","mat-menu-trigger-for",""],["","matMenuTriggerFor",""]],hostAttrs:[1,"mat-mdc-menu-trigger"],hostVars:3,hostBindings:function(t,n){t&1&&T("click",function(a){return n._handleClick(a)})("mousedown",function(a){return n._handleMousedown(a)})("keydown",function(a){return n._handleKeydown(a)}),t&2&&ee("aria-haspopup",n.menu?"menu":null)("aria-expanded",n.menuOpen)("aria-controls",n.menuOpen?n.menu==null?null:n.menu.panelId:null)},inputs:{_deprecatedMatMenuTriggerFor:[0,"mat-menu-trigger-for","_deprecatedMatMenuTriggerFor"],menu:[0,"matMenuTriggerFor","menu"],menuData:[0,"matMenuTriggerData","menuData"],restoreFocus:[0,"matMenuTriggerRestoreFocus","restoreFocus"]},outputs:{menuOpened:"menuOpened",onMenuOpen:"onMenuOpen",menuClosed:"menuClosed",onMenuClose:"onMenuClose"},exportAs:["matMenuTrigger"],features:[mt]})}return i})();var HC=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Sc,Yl,Qi,Fc]})}return i})();var YnA=["text"],OnA=[[["mat-icon"]],"*"],HnA=["mat-icon","*"];function znA(i,e){if(i&1&&lA(0,"mat-pseudo-checkbox",1),i&2){let A=p();H("disabled",A.disabled)("state",A.selected?"checked":"unchecked")}}function PnA(i,e){if(i&1&&lA(0,"mat-pseudo-checkbox",3),i&2){let A=p();H("disabled",A.disabled)}}function jnA(i,e){if(i&1&&(d(0,"span",4),y(1),E()),i&2){let A=p();u(),Be("(",A.group.label,")")}}var Rf=new MA("MAT_OPTION_PARENT_COMPONENT"),Nf=new MA("MatOptgroup");var xf=class{source;isUserInput;constructor(e,A=!1){this.source=e,this.isUserInput=A}},Kr=(()=>{class i{_element=w(se);_changeDetectorRef=w(wt);_parent=w(Rf,{optional:!0});group=w(Nf,{optional:!0});_signalDisableRipple=!1;_selected=!1;_active=!1;_mostRecentViewValue="";get multiple(){return this._parent&&this._parent.multiple}get selected(){return this._selected}value;id=w(Bn).getId("mat-option-");get disabled(){return this.group&&this.group.disabled||this._disabled()}set disabled(A){this._disabled.set(A)}_disabled=mA(!1);get disableRipple(){return this._signalDisableRipple?this._parent.disableRipple():!!this._parent?.disableRipple}get hideSingleSelectionIndicator(){return!!(this._parent&&this._parent.hideSingleSelectionIndicator)}onSelectionChange=new LA;_text;_stateChanges=new te;constructor(){let A=w(io);A.load(rr),A.load(RC),this._signalDisableRipple=!!this._parent&&s1(this._parent.disableRipple)}get active(){return this._active}get viewValue(){return(this._text?.nativeElement.textContent||"").trim()}select(A=!0){this._selected||(this._selected=!0,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}deselect(A=!0){this._selected&&(this._selected=!1,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}focus(A,t){let n=this._getHostElement();typeof n.focus=="function"&&n.focus(t)}setActiveStyles(){this._active||(this._active=!0,this._changeDetectorRef.markForCheck())}setInactiveStyles(){this._active&&(this._active=!1,this._changeDetectorRef.markForCheck())}getLabel(){return this.viewValue}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!ha(A)&&(this._selectViaInteraction(),A.preventDefault())}_selectViaInteraction(){this.disabled||(this._selected=this.multiple?!this._selected:!0,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent(!0))}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._element.nativeElement}ngAfterViewChecked(){if(this._selected){let A=this.viewValue;A!==this._mostRecentViewValue&&(this._mostRecentViewValue&&this._stateChanges.next(),this._mostRecentViewValue=A)}}ngOnDestroy(){this._stateChanges.complete()}_emitSelectionChangeEvent(A=!1){this.onSelectionChange.emit(new xf(this,A))}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-option"]],viewQuery:function(t,n){if(t&1&&Yt(YnA,7),t&2){let o;oe(o=ae())&&(n._text=o.first)}},hostAttrs:["role","option",1,"mat-mdc-option","mdc-list-item"],hostVars:11,hostBindings:function(t,n){t&1&&T("click",function(){return n._selectViaInteraction()})("keydown",function(a){return n._handleKeydown(a)}),t&2&&(Ea("id",n.id),ee("aria-selected",n.selected)("aria-disabled",n.disabled.toString()),xA("mdc-list-item--selected",n.selected)("mat-mdc-option-multiple",n.multiple)("mat-mdc-option-active",n.active)("mdc-list-item--disabled",n.disabled))},inputs:{value:"value",id:"id",disabled:[2,"disabled","disabled",Ee]},outputs:{onSelectionChange:"onSelectionChange"},exportAs:["matOption"],ngContentSelectors:HnA,decls:8,vars:5,consts:[["text",""],["aria-hidden","true",1,"mat-mdc-option-pseudo-checkbox",3,"disabled","state"],[1,"mdc-list-item__primary-text"],["state","checked","aria-hidden","true","appearance","minimal",1,"mat-mdc-option-pseudo-checkbox",3,"disabled"],[1,"cdk-visually-hidden"],["aria-hidden","true","mat-ripple","",1,"mat-mdc-option-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled"]],template:function(t,n){t&1&&(Nt(OnA),Y(0,znA,1,2,"mat-pseudo-checkbox",1),Ve(1),d(2,"span",2,0),Ve(4,1),E(),Y(5,PnA,1,1,"mat-pseudo-checkbox",3),Y(6,jnA,2,1,"span",4),lA(7,"div",5)),t&2&&(O(n.multiple?0:-1),u(5),O(!n.multiple&&n.selected&&!n.hideSingleSelectionIndicator?5:-1),u(),O(n.group&&n.group._inert?6:-1),u(),H("matRippleTrigger",n._getHostElement())("matRippleDisabled",n.disabled||n.disableRipple))},dependencies:[If,es],styles:[`.mat-mdc-option{-webkit-user-select:none;user-select:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;min-height:48px;padding:0 16px;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0);color:var(--mat-option-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-option-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-option-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-option-label-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-option-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-option-label-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-option:hover:not(.mdc-list-item--disabled){background-color:var(--mat-option-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:var(--mat-option-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent));outline:0}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-active,.mat-mdc-option-multiple,:focus,:hover){background-color:var(--mat-option-selected-state-layer-color, var(--mat-sys-secondary-container))}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-active,.mat-mdc-option-multiple,:focus,:hover) .mdc-list-item__primary-text{color:var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option.mdc-list-item{align-items:center;background:rgba(0,0,0,0)}.mat-mdc-option.mdc-list-item--disabled{cursor:default;pointer-events:none}.mat-mdc-option.mdc-list-item--disabled .mat-mdc-option-pseudo-checkbox,.mat-mdc-option.mdc-list-item--disabled .mdc-list-item__primary-text,.mat-mdc-option.mdc-list-item--disabled>mat-icon{opacity:.38}.mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:32px}[dir=rtl] .mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:16px;padding-right:32px}.mat-mdc-option .mat-icon,.mat-mdc-option .mat-pseudo-checkbox-full{margin-right:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-icon,[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:0;margin-left:16px}.mat-mdc-option .mat-pseudo-checkbox-minimal{margin-left:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-minimal{margin-right:16px;margin-left:0}.mat-mdc-option .mat-mdc-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-option .mdc-list-item__primary-text{white-space:normal;font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;margin-right:auto}[dir=rtl] .mat-mdc-option .mdc-list-item__primary-text{margin-right:0;margin-left:auto}@media(forced-colors: active){.mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{content:"";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}[dir=rtl] .mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{right:auto;left:16px}}.mat-mdc-option-multiple{--mat-list-list-item-selected-container-color: var(--mat-list-list-item-container-color, transparent)}.mat-mdc-option-active .mat-focus-indicator::before{content:""} +`],encapsulation:2,changeDetection:0})}return i})();function rb(i,e,A){if(A.length){let t=e.toArray(),n=A.toArray(),o=0;for(let a=0;aA+t?Math.max(0,i-t+e):A}var UK=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Qi]})}return i})();var lb=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Sc,UK,Kr,Qi]})}return i})();var qnA=["trigger"],VnA=["panel"],WnA=[[["mat-select-trigger"]],"*"],ZnA=["mat-select-trigger","*"];function XnA(i,e){if(i&1&&(d(0,"span",4),y(1),E()),i&2){let A=p();u(),iA(A.placeholder)}}function $nA(i,e){i&1&&Ve(0)}function AoA(i,e){if(i&1&&(d(0,"span",11),y(1),E()),i&2){let A=p(2);u(),iA(A.triggerValue)}}function eoA(i,e){if(i&1&&(d(0,"span",5),Y(1,$nA,1,0)(2,AoA,2,1,"span",11),E()),i&2){let A=p();u(),O(A.customTrigger?1:2)}}function toA(i,e){if(i&1){let A=rA();d(0,"div",12,1),T("keydown",function(n){G(A);let o=p();return K(o._handleKeydown(n))}),Ve(2,1),E()}if(i&2){let A=p();go(A.panelClass),xA("mat-select-panel-animations-enabled",!A._animationsDisabled)("mat-primary",(A._parentFormField==null?null:A._parentFormField.color)==="primary")("mat-accent",(A._parentFormField==null?null:A._parentFormField.color)==="accent")("mat-warn",(A._parentFormField==null?null:A._parentFormField.color)==="warn")("mat-undefined",!(A._parentFormField!=null&&A._parentFormField.color)),ee("id",A.id+"-panel")("aria-multiselectable",A.multiple)("aria-label",A.ariaLabel||null)("aria-labelledby",A._getPanelAriaLabelledby())}}var ioA=new MA("mat-select-scroll-strategy",{providedIn:"root",factory:()=>{let i=w(Dt);return()=>x0(i)}}),noA=new MA("MAT_SELECT_CONFIG"),ooA=new MA("MatSelectTrigger"),gb=class{source;value;constructor(e,A){this.source=e,this.value=A}},zl=(()=>{class i{_viewportRuler=w(fs);_changeDetectorRef=w(wt);_elementRef=w(se);_dir=w(fo,{optional:!0});_idGenerator=w(Bn);_renderer=w(qi);_parentFormField=w(jh,{optional:!0});ngControl=w(Fs,{self:!0,optional:!0});_liveAnnouncer=w(Th);_defaultOptions=w(noA,{optional:!0});_animationsDisabled=nn();_popoverLocation;_initialized=new te;_cleanupDetach;options;optionGroups;customTrigger;_positions=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"}];_scrollOptionIntoView(A){let t=this.options.toArray()[A];if(t){let n=this.panel.nativeElement,o=rb(A,this.options,this.optionGroups),a=t._getHostElement();A===0&&o===1?n.scrollTop=0:n.scrollTop=sb(a.offsetTop,a.offsetHeight,n.scrollTop,n.offsetHeight)}}_positioningSettled(){this._scrollOptionIntoView(this._keyManager.activeItemIndex||0)}_getChangeEvent(A){return new gb(this,A)}_scrollStrategyFactory=w(ioA);_panelOpen=!1;_compareWith=(A,t)=>A===t;_uid=this._idGenerator.getId("mat-select-");_triggerAriaLabelledBy=null;_previousControl;_destroy=new te;_errorStateTracker;stateChanges=new te;disableAutomaticLabeling=!0;userAriaDescribedBy;_selectionModel;_keyManager;_preferredOverlayOrigin;_overlayWidth;_onChange=()=>{};_onTouched=()=>{};_valueId=this._idGenerator.getId("mat-select-value-");_scrollStrategy;_overlayPanelClass=this._defaultOptions?.overlayPanelClass||"";get focused(){return this._focused||this._panelOpen}_focused=!1;controlType="mat-select";trigger;panel;_overlayDir;panelClass;disabled=!1;get disableRipple(){return this._disableRipple()}set disableRipple(A){this._disableRipple.set(A)}_disableRipple=mA(!1);tabIndex=0;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncParentProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get placeholder(){return this._placeholder}set placeholder(A){this._placeholder=A,this.stateChanges.next()}_placeholder;get required(){return this._required??this.ngControl?.control?.hasValidator(Ns.required)??!1}set required(A){this._required=A,this.stateChanges.next()}_required;get multiple(){return this._multiple}set multiple(A){this._selectionModel,this._multiple=A}_multiple=!1;disableOptionCentering=this._defaultOptions?.disableOptionCentering??!1;get compareWith(){return this._compareWith}set compareWith(A){this._compareWith=A,this._selectionModel&&this._initializeSelection()}get value(){return this._value}set value(A){this._assignValue(A)&&this._onChange(A)}_value;ariaLabel="";ariaLabelledby;get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}typeaheadDebounceInterval;sortComparator;get id(){return this._id}set id(A){this._id=A||this._uid,this.stateChanges.next()}_id;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}panelWidth=this._defaultOptions&&typeof this._defaultOptions.panelWidth<"u"?this._defaultOptions.panelWidth:"auto";canSelectNullableOptions=this._defaultOptions?.canSelectNullableOptions??!1;optionSelectionChanges=uc(()=>{let A=this.options;return A?A.changes.pipe(kn(A),pi(()=>Ti(...A.map(t=>t.onSelectionChange)))):this._initialized.pipe(pi(()=>this.optionSelectionChanges))});openedChange=new LA;_openedStream=this.openedChange.pipe(Ct(A=>A),ye(()=>{}));_closedStream=this.openedChange.pipe(Ct(A=>!A),ye(()=>{}));selectionChange=new LA;valueChange=new LA;constructor(){let A=w(fd),t=w(Cd,{optional:!0}),n=w(_C,{optional:!0}),o=w(new ks("tabindex"),{optional:!0}),a=w(MQ,{optional:!0});this.ngControl&&(this.ngControl.valueAccessor=this),this._defaultOptions?.typeaheadDebounceInterval!=null&&(this.typeaheadDebounceInterval=this._defaultOptions.typeaheadDebounceInterval),this._errorStateTracker=new md(A,this.ngControl,n,t,this.stateChanges),this._scrollStrategy=this._scrollStrategyFactory(),this.tabIndex=o==null?0:parseInt(o)||0,this._popoverLocation=a?.usePopover===!1?null:"inline",this.id=this.id}ngOnInit(){this._selectionModel=new k0(this.multiple),this.stateChanges.next(),this._viewportRuler.change().pipe(ut(this._destroy)).subscribe(()=>{this.panelOpen&&(this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._changeDetectorRef.detectChanges())})}ngAfterContentInit(){this._initialized.next(),this._initialized.complete(),this._initKeyManager(),this._selectionModel.changed.pipe(ut(this._destroy)).subscribe(A=>{A.added.forEach(t=>t.select()),A.removed.forEach(t=>t.deselect())}),this.options.changes.pipe(kn(null),ut(this._destroy)).subscribe(()=>{this._resetOptions(),this._initializeSelection()})}ngDoCheck(){let A=this._getTriggerAriaLabelledby(),t=this.ngControl;if(A!==this._triggerAriaLabelledBy){let n=this._elementRef.nativeElement;this._triggerAriaLabelledBy=A,A?n.setAttribute("aria-labelledby",A):n.removeAttribute("aria-labelledby")}t&&(this._previousControl!==t.control&&(this._previousControl!==void 0&&t.disabled!==null&&t.disabled!==this.disabled&&(this.disabled=t.disabled),this._previousControl=t.control),this.updateErrorState())}ngOnChanges(A){(A.disabled||A.userAriaDescribedBy)&&this.stateChanges.next(),A.typeaheadDebounceInterval&&this._keyManager&&this._keyManager.withTypeAhead(this.typeaheadDebounceInterval),A.panelClass&&this.panelClass instanceof Set&&(this.panelClass=Array.from(this.panelClass))}ngOnDestroy(){this._cleanupDetach?.(),this._keyManager?.destroy(),this._destroy.next(),this._destroy.complete(),this.stateChanges.complete(),this._clearFromModal()}toggle(){this.panelOpen?this.close():this.open()}open(){this._canOpen()&&(this._parentFormField&&(this._preferredOverlayOrigin=this._parentFormField.getConnectedOverlayOrigin()),this._cleanupDetach?.(),this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._applyModalPanelOwnership(),this._panelOpen=!0,this._overlayDir.positionChange.pipe(po(1)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this._positioningSettled()}),this._overlayDir.attachOverlay(),this._keyManager.withHorizontalOrientation(null),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this.stateChanges.next(),Promise.resolve().then(()=>this.openedChange.emit(!0)))}_trackedModal=null;_applyModalPanelOwnership(){let A=this._elementRef.nativeElement.closest('body > .cdk-overlay-container [aria-modal="true"]');if(!A)return;let t=`${this.id}-panel`;this._trackedModal&&Ap(this._trackedModal,"aria-owns",t),Ey(A,"aria-owns",t),this._trackedModal=A}_clearFromModal(){if(!this._trackedModal)return;let A=`${this.id}-panel`;Ap(this._trackedModal,"aria-owns",A),this._trackedModal=null}close(){this._panelOpen&&(this._panelOpen=!1,this._exitAndDetach(),this._keyManager.withHorizontalOrientation(this._isRtl()?"rtl":"ltr"),this._changeDetectorRef.markForCheck(),this._onTouched(),this.stateChanges.next(),Promise.resolve().then(()=>this.openedChange.emit(!1)))}_exitAndDetach(){if(this._animationsDisabled||!this.panel){this._detachOverlay();return}this._cleanupDetach?.(),this._cleanupDetach=()=>{t(),clearTimeout(n),this._cleanupDetach=void 0};let A=this.panel.nativeElement,t=this._renderer.listen(A,"animationend",o=>{o.animationName==="_mat-select-exit"&&(this._cleanupDetach?.(),this._detachOverlay())}),n=setTimeout(()=>{this._cleanupDetach?.(),this._detachOverlay()},200);A.classList.add("mat-select-panel-exit")}_detachOverlay(){this._overlayDir.detachOverlay(),this._changeDetectorRef.markForCheck()}writeValue(A){this._assignValue(A)}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck(),this.stateChanges.next()}get panelOpen(){return this._panelOpen}get selected(){return this.multiple?this._selectionModel?.selected||[]:this._selectionModel?.selected[0]}get triggerValue(){if(this.empty)return"";if(this._multiple){let A=this._selectionModel.selected.map(t=>t.viewValue);return this._isRtl()&&A.reverse(),A.join(", ")}return this._selectionModel.selected[0].viewValue}updateErrorState(){this._errorStateTracker.updateErrorState()}_isRtl(){return this._dir?this._dir.value==="rtl":!1}_handleKeydown(A){this.disabled||(this.panelOpen?this._handleOpenKeydown(A):this._handleClosedKeydown(A))}_handleClosedKeydown(A){let t=A.keyCode,n=t===40||t===38||t===37||t===39,o=t===13||t===32,a=this._keyManager;if(!a.isTyping()&&o&&!ha(A)||(this.multiple||A.altKey)&&n)A.preventDefault(),this.open();else if(!this.multiple){let r=this.selected;a.onKeydown(A);let s=this.selected;s&&r!==s&&this._liveAnnouncer.announce(s.viewValue,1e4)}}_handleOpenKeydown(A){let t=this._keyManager,n=A.keyCode,o=n===40||n===38,a=t.isTyping();if(o&&A.altKey)A.preventDefault(),this.close();else if(!a&&(n===13||n===32)&&t.activeItem&&!ha(A))A.preventDefault(),t.activeItem._selectViaInteraction();else if(!a&&this._multiple&&n===65&&A.ctrlKey){A.preventDefault();let r=this.options.some(s=>!s.disabled&&!s.selected);this.options.forEach(s=>{s.disabled||(r?s.select():s.deselect())})}else{let r=t.activeItemIndex;t.onKeydown(A),this._multiple&&o&&A.shiftKey&&t.activeItem&&t.activeItemIndex!==r&&t.activeItem._selectViaInteraction()}}_handleOverlayKeydown(A){A.keyCode===27&&!ha(A)&&(A.preventDefault(),this.close())}_onFocus(){this.disabled||(this._focused=!0,this.stateChanges.next())}_onBlur(){this._focused=!1,this._keyManager?.cancelTypeahead(),!this.disabled&&!this.panelOpen&&(this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}get empty(){return!this._selectionModel||this._selectionModel.isEmpty()}_initializeSelection(){Promise.resolve().then(()=>{this.ngControl&&(this._value=this.ngControl.value),this._setSelectionByValue(this._value),this.stateChanges.next()})}_setSelectionByValue(A){if(this.options.forEach(t=>t.setInactiveStyles()),this._selectionModel.clear(),this.multiple&&A)Array.isArray(A),A.forEach(t=>this._selectOptionByValue(t)),this._sortValues();else{let t=this._selectOptionByValue(A);t?this._keyManager.updateActiveItem(t):this.panelOpen||this._keyManager.updateActiveItem(-1)}this._changeDetectorRef.markForCheck()}_selectOptionByValue(A){let t=this.options.find(n=>{if(this._selectionModel.isSelected(n))return!1;try{return(n.value!=null||this.canSelectNullableOptions)&&this._compareWith(n.value,A)}catch(o){return!1}});return t&&this._selectionModel.select(t),t}_assignValue(A){return A!==this._value||this._multiple&&Array.isArray(A)?(this.options&&this._setSelectionByValue(A),this._value=A,!0):!1}_skipPredicate=A=>this.panelOpen?!1:A.disabled;_getOverlayWidth(A){return this.panelWidth==="auto"?(A instanceof Hd?A.elementRef:A||this._elementRef).nativeElement.getBoundingClientRect().width:this.panelWidth===null?"":this.panelWidth}_syncParentProperties(){if(this.options)for(let A of this.options)A._changeDetectorRef.markForCheck()}_initKeyManager(){this._keyManager=new Yh(this.options).withTypeAhead(this.typeaheadDebounceInterval).withVerticalOrientation().withHorizontalOrientation(this._isRtl()?"rtl":"ltr").withHomeAndEnd().withPageUpDown().withAllowedModifierKeys(["shiftKey"]).skipPredicate(this._skipPredicate),this._keyManager.tabOut.subscribe(()=>{this.panelOpen&&(!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction(),this.focus(),this.close())}),this._keyManager.change.subscribe(()=>{this._panelOpen&&this.panel?this._scrollOptionIntoView(this._keyManager.activeItemIndex||0):!this._panelOpen&&!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction()})}_resetOptions(){let A=Ti(this.options.changes,this._destroy);this.optionSelectionChanges.pipe(ut(A)).subscribe(t=>{this._onSelect(t.source,t.isUserInput),t.isUserInput&&!this.multiple&&this._panelOpen&&(this.close(),this.focus())}),Ti(...this.options.map(t=>t._stateChanges)).pipe(ut(A)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this.stateChanges.next()})}_onSelect(A,t){let n=this._selectionModel.isSelected(A);!this.canSelectNullableOptions&&A.value==null&&!this._multiple?(A.deselect(),this._selectionModel.clear(),this.value!=null&&this._propagateChanges(A.value)):(n!==A.selected&&(A.selected?this._selectionModel.select(A):this._selectionModel.deselect(A)),t&&this._keyManager.setActiveItem(A),this.multiple&&(this._sortValues(),t&&this.focus())),n!==this._selectionModel.isSelected(A)&&this._propagateChanges(),this.stateChanges.next()}_sortValues(){if(this.multiple){let A=this.options.toArray();this._selectionModel.sort((t,n)=>this.sortComparator?this.sortComparator(t,n,A):A.indexOf(t)-A.indexOf(n)),this.stateChanges.next()}}_propagateChanges(A){let t;this.multiple?t=this.selected.map(n=>n.value):t=this.selected?this.selected.value:A,this._value=t,this.valueChange.emit(t),this._onChange(t),this.selectionChange.emit(this._getChangeEvent(t)),this._changeDetectorRef.markForCheck()}_highlightCorrectOption(){if(this._keyManager)if(this.empty){let A=-1;for(let t=0;t0&&!!this._overlayDir}focus(A){this._elementRef.nativeElement.focus(A)}_getPanelAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||null,t=A?A+" ":"";return this.ariaLabelledby?t+this.ariaLabelledby:A}_getAriaActiveDescendant(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null}_getTriggerAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||"";return this.ariaLabelledby&&(A+=" "+this.ariaLabelledby),A||(A=this._valueId),A}get describedByIds(){return this._elementRef.nativeElement.getAttribute("aria-describedby")?.split(" ")||[]}setDescribedByIds(A){let t=this._elementRef.nativeElement;A.length?t.setAttribute("aria-describedby",A.join(" ")):t.removeAttribute("aria-describedby")}onContainerClick(A){let t=Fr(A);t&&(t.tagName==="MAT-OPTION"||t.classList.contains("cdk-overlay-backdrop")||t.closest(".mat-mdc-select-panel"))||(this.focus(),this.open())}get shouldLabelFloat(){return this.panelOpen||!this.empty||this.focused&&!!this.placeholder}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-select"]],contentQueries:function(t,n,o){if(t&1&&Vo(o,ooA,5)(o,Kr,5)(o,Nf,5),t&2){let a;oe(a=ae())&&(n.customTrigger=a.first),oe(a=ae())&&(n.options=a),oe(a=ae())&&(n.optionGroups=a)}},viewQuery:function(t,n){if(t&1&&Yt(qnA,5)(VnA,5)(yf,5),t&2){let o;oe(o=ae())&&(n.trigger=o.first),oe(o=ae())&&(n.panel=o.first),oe(o=ae())&&(n._overlayDir=o.first)}},hostAttrs:["role","combobox","aria-haspopup","listbox",1,"mat-mdc-select"],hostVars:21,hostBindings:function(t,n){t&1&&T("keydown",function(a){return n._handleKeydown(a)})("focus",function(){return n._onFocus()})("blur",function(){return n._onBlur()}),t&2&&(ee("id",n.id)("tabindex",n.disabled?-1:n.tabIndex)("aria-controls",n.panelOpen?n.id+"-panel":null)("aria-expanded",n.panelOpen)("aria-label",n.ariaLabel||null)("aria-required",n.required.toString())("aria-disabled",n.disabled.toString())("aria-invalid",n.errorState)("aria-activedescendant",n._getAriaActiveDescendant()),xA("mat-mdc-select-disabled",n.disabled)("mat-mdc-select-invalid",n.errorState)("mat-mdc-select-required",n.required)("mat-mdc-select-empty",n.empty)("mat-mdc-select-multiple",n.multiple)("mat-select-open",n.panelOpen))},inputs:{userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],panelClass:"panelClass",disabled:[2,"disabled","disabled",Ee],disableRipple:[2,"disableRipple","disableRipple",Ee],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:dn(A)],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",Ee],placeholder:"placeholder",required:[2,"required","required",Ee],multiple:[2,"multiple","multiple",Ee],disableOptionCentering:[2,"disableOptionCentering","disableOptionCentering",Ee],compareWith:"compareWith",value:"value",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],errorStateMatcher:"errorStateMatcher",typeaheadDebounceInterval:[2,"typeaheadDebounceInterval","typeaheadDebounceInterval",dn],sortComparator:"sortComparator",id:"id",panelWidth:"panelWidth",canSelectNullableOptions:[2,"canSelectNullableOptions","canSelectNullableOptions",Ee]},outputs:{openedChange:"openedChange",_openedStream:"opened",_closedStream:"closed",selectionChange:"selectionChange",valueChange:"valueChange"},exportAs:["matSelect"],features:[Et([{provide:Ph,useExisting:i},{provide:Rf,useExisting:i}]),Zt],ngContentSelectors:ZnA,decls:11,vars:10,consts:[["fallbackOverlayOrigin","cdkOverlayOrigin","trigger",""],["panel",""],["cdk-overlay-origin","",1,"mat-mdc-select-trigger",3,"click"],[1,"mat-mdc-select-value"],[1,"mat-mdc-select-placeholder","mat-mdc-select-min-line"],[1,"mat-mdc-select-value-text"],[1,"mat-mdc-select-arrow-wrapper"],[1,"mat-mdc-select-arrow"],["viewBox","0 0 24 24","width","24px","height","24px","focusable","false","aria-hidden","true"],["d","M7 10l5 5 5-5z"],["cdk-connected-overlay","","cdkConnectedOverlayHasBackdrop","","cdkConnectedOverlayBackdropClass","cdk-overlay-transparent-backdrop",3,"detach","backdropClick","overlayKeydown","cdkConnectedOverlayDisableClose","cdkConnectedOverlayPanelClass","cdkConnectedOverlayScrollStrategy","cdkConnectedOverlayOrigin","cdkConnectedOverlayPositions","cdkConnectedOverlayWidth","cdkConnectedOverlayFlexibleDimensions","cdkConnectedOverlayUsePopover"],[1,"mat-mdc-select-min-line"],["role","listbox","tabindex","-1",1,"mat-mdc-select-panel","mdc-menu-surface","mdc-menu-surface--open",3,"keydown"]],template:function(t,n){if(t&1&&(Nt(WnA),d(0,"div",2,0),T("click",function(){return n.open()}),d(3,"div",3),Y(4,XnA,2,1,"span",4)(5,eoA,3,1,"span",5),E(),d(6,"div",6)(7,"div",7),It(),d(8,"svg",8),lA(9,"path",9),E()()()(),yt(10,toA,3,16,"ng-template",10),T("detach",function(){return n.close()})("backdropClick",function(){return n.close()})("overlayKeydown",function(a){return n._handleOverlayKeydown(a)})),t&2){let o=gi(1);u(3),ee("id",n._valueId),u(),O(n.empty?4:5),u(6),H("cdkConnectedOverlayDisableClose",!0)("cdkConnectedOverlayPanelClass",n._overlayPanelClass)("cdkConnectedOverlayScrollStrategy",n._scrollStrategy)("cdkConnectedOverlayOrigin",n._preferredOverlayOrigin||o)("cdkConnectedOverlayPositions",n._positions)("cdkConnectedOverlayWidth",n._overlayWidth)("cdkConnectedOverlayFlexibleDimensions",!0)("cdkConnectedOverlayUsePopover",n._popoverLocation)}},dependencies:[Hd,yf],styles:[`@keyframes _mat-select-enter{from{opacity:0;transform:scaleY(0.8)}to{opacity:1;transform:none}}@keyframes _mat-select-exit{from{opacity:1}to{opacity:0}}.mat-mdc-select{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-sys-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-sys-body-large-tracking))}div.mat-mdc-select-panel{box-shadow:var(--mat-select-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12))}.mat-mdc-select-disabled{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-disabled .mat-mdc-select-placeholder{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-trigger{display:inline-flex;align-items:center;cursor:pointer;position:relative;box-sizing:border-box;width:100%}.mat-mdc-select-disabled .mat-mdc-select-trigger{-webkit-user-select:none;user-select:none;cursor:default}.mat-mdc-select-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-mdc-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-mdc-select-arrow-wrapper{height:24px;flex-shrink:0;display:inline-flex;align-items:center}.mat-form-field-appearance-fill .mdc-text-field--no-label .mat-mdc-select-arrow-wrapper{transform:none}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-invalid .mat-mdc-select-arrow,.mat-form-field-invalid:not(.mat-form-field-disabled) .mat-mdc-form-field-infix::after{color:var(--mat-select-invalid-arrow-color, var(--mat-sys-error))}.mat-mdc-select-arrow{width:10px;height:5px;position:relative;color:var(--mat-select-enabled-arrow-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field.mat-focused .mat-mdc-select-arrow{color:var(--mat-select-focused-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-disabled .mat-mdc-select-arrow{color:var(--mat-select-disabled-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-select-open .mat-mdc-select-arrow{transform:rotate(180deg)}.mat-form-field-animations-enabled .mat-mdc-select-arrow{transition:transform 80ms linear}.mat-mdc-select-arrow svg{fill:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}@media(forced-colors: active){.mat-mdc-select-arrow svg{fill:CanvasText}.mat-mdc-select-disabled .mat-mdc-select-arrow svg{fill:GrayText}}div.mat-mdc-select-panel{width:100%;max-height:275px;outline:0;overflow:auto;padding:8px 0;border-radius:4px;box-sizing:border-box;position:relative;background-color:var(--mat-select-panel-background-color, var(--mat-sys-surface-container))}@media(forced-colors: active){div.mat-mdc-select-panel{outline:solid 1px}}.cdk-overlay-pane:not(.mat-mdc-select-panel-above) div.mat-mdc-select-panel{border-top-left-radius:0;border-top-right-radius:0;transform-origin:top center}.mat-mdc-select-panel-above div.mat-mdc-select-panel{border-bottom-left-radius:0;border-bottom-right-radius:0;transform-origin:bottom center}.mat-select-panel-animations-enabled{animation:_mat-select-enter 120ms cubic-bezier(0, 0, 0.2, 1)}.mat-select-panel-animations-enabled.mat-select-panel-exit{animation:_mat-select-exit 100ms linear}.mat-mdc-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1);color:var(--mat-select-placeholder-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field:not(.mat-form-field-animations-enabled) .mat-mdc-select-placeholder,._mat-animation-noopable .mat-mdc-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-mdc-select-placeholder{color:rgba(0,0,0,0);-webkit-text-fill-color:rgba(0,0,0,0);transition:none;display:block}.mat-mdc-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mat-mdc-floating-label{max-width:calc(100% - 18px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mdc-floating-label--float-above{max-width:calc(100%/0.75 - 24px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-text-field--label-floating .mdc-notched-outline__notch{max-width:calc(100% - 24px)}.mat-mdc-select-min-line:empty::before{content:" ";white-space:pre;width:1px;display:inline-block;visibility:hidden}.mat-form-field-appearance-fill .mat-mdc-select-arrow-wrapper{transform:var(--mat-select-arrow-transform, translateY(-8px))} +`],encapsulation:2,changeDetection:0})}return i})();var N0=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Yl,lb,Qi,Fc,Ta,lb]})}return i})();var aoA=["tooltip"],roA=20;var soA=new MA("mat-tooltip-scroll-strategy",{providedIn:"root",factory:()=>{let i=w(Dt);return()=>x0(i,{scrollThrottle:roA})}}),loA=new MA("mat-tooltip-default-options",{providedIn:"root",factory:()=>({showDelay:0,hideDelay:0,touchendHideDelay:1500})});var JK="tooltip-panel",goA={passive:!0},coA=8,CoA=8,IoA=24,doA=200,Zi=(()=>{class i{_elementRef=w(se);_ngZone=w(qe);_platform=w(Ci);_ariaDescriber=w(rF);_focusMonitor=w(Wa);_dir=w(fo);_injector=w(Dt);_viewContainerRef=w(So);_mediaMatcher=w(Bd);_document=w(ii);_renderer=w(qi);_animationsDisabled=nn();_defaultOptions=w(loA,{optional:!0});_overlayRef=null;_tooltipInstance=null;_overlayPanelClass;_portal;_position="below";_positionAtOrigin=!1;_disabled=!1;_tooltipClass;_viewInitialized=!1;_pointerExitEventsInitialized=!1;_tooltipComponent=YK;_viewportMargin=8;_currentPosition;_cssClassPrefix="mat-mdc";_ariaDescriptionPending=!1;_dirSubscribed=!1;get position(){return this._position}set position(A){A!==this._position&&(this._position=A,this._overlayRef&&(this._updatePosition(this._overlayRef),this._tooltipInstance?.show(0),this._overlayRef.updatePosition()))}get positionAtOrigin(){return this._positionAtOrigin}set positionAtOrigin(A){this._positionAtOrigin=ur(A),this._detach(),this._overlayRef=null}get disabled(){return this._disabled}set disabled(A){let t=ur(A);this._disabled!==t&&(this._disabled=t,t?this.hide(0):this._setupPointerEnterEventsIfNeeded(),this._syncAriaDescription(this.message))}get showDelay(){return this._showDelay}set showDelay(A){this._showDelay=Ls(A)}_showDelay;get hideDelay(){return this._hideDelay}set hideDelay(A){this._hideDelay=Ls(A),this._tooltipInstance&&(this._tooltipInstance._mouseLeaveHideDelay=this._hideDelay)}_hideDelay;touchGestures="auto";get message(){return this._message}set message(A){let t=this._message;this._message=A!=null?String(A).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._setupPointerEnterEventsIfNeeded(),this._updateTooltipMessage()),this._syncAriaDescription(t)}_message="";get tooltipClass(){return this._tooltipClass}set tooltipClass(A){this._tooltipClass=A,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)}_eventCleanups=[];_touchstartTimeout=null;_destroyed=new te;_isDestroyed=!1;constructor(){let A=this._defaultOptions;A&&(this._showDelay=A.showDelay,this._hideDelay=A.hideDelay,A.position&&(this.position=A.position),A.positionAtOrigin&&(this.positionAtOrigin=A.positionAtOrigin),A.touchGestures&&(this.touchGestures=A.touchGestures),A.tooltipClass&&(this.tooltipClass=A.tooltipClass)),this._viewportMargin=coA}ngAfterViewInit(){this._viewInitialized=!0,this._setupPointerEnterEventsIfNeeded(),this._focusMonitor.monitor(this._elementRef).pipe(ut(this._destroyed)).subscribe(A=>{A?A==="keyboard"&&this._ngZone.run(()=>this.show()):this._ngZone.run(()=>this.hide(0))})}ngOnDestroy(){let A=this._elementRef.nativeElement;this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this._overlayRef&&(this._overlayRef.dispose(),this._tooltipInstance=null),this._eventCleanups.forEach(t=>t()),this._eventCleanups.length=0,this._destroyed.next(),this._destroyed.complete(),this._isDestroyed=!0,this._ariaDescriber.removeDescription(A,this.message,"tooltip"),this._focusMonitor.stopMonitoring(A)}show(A=this.showDelay,t){if(this.disabled||!this.message||this._isTooltipVisible()){this._tooltipInstance?._cancelPendingAnimations();return}let n=this._createOverlay(t);this._detach(),this._portal=this._portal||new ms(this._tooltipComponent,this._viewContainerRef);let o=this._tooltipInstance=n.attach(this._portal).instance;o._triggerElement=this._elementRef.nativeElement,o._mouseLeaveHideDelay=this._hideDelay,o.afterHidden().pipe(ut(this._destroyed)).subscribe(()=>this._detach()),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),o.show(A)}hide(A=this.hideDelay){let t=this._tooltipInstance;t&&(t.isVisible()?t.hide(A):(t._cancelPendingAnimations(),this._detach()))}toggle(A){this._isTooltipVisible()?this.hide():this.show(void 0,A)}_isTooltipVisible(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()}_createOverlay(A){if(this._overlayRef){let a=this._overlayRef.getConfig().positionStrategy;if((!this.positionAtOrigin||!A)&&a._origin instanceof se)return this._overlayRef;this._detach()}let t=this._injector.get(Lc).getAncestorScrollContainers(this._elementRef),n=`${this._cssClassPrefix}-${JK}`,o=T1(this._injector,this.positionAtOrigin?A||this._elementRef:this._elementRef).withTransformOriginOn(`.${this._cssClassPrefix}-tooltip`).withFlexibleDimensions(!1).withViewportMargin(this._viewportMargin).withScrollableContainers(t).withPopoverLocation("global");return o.positionChanges.pipe(ut(this._destroyed)).subscribe(a=>{this._updateCurrentPositionClass(a.connectionPair),this._tooltipInstance&&a.scrollableViewProperties.isOverlayClipped&&this._tooltipInstance.isVisible()&&this._ngZone.run(()=>this.hide(0))}),this._overlayRef=xg(this._injector,{direction:this._dir,positionStrategy:o,panelClass:this._overlayPanelClass?[...this._overlayPanelClass,n]:n,scrollStrategy:this._injector.get(soA)(),disableAnimations:this._animationsDisabled,eventPredicate:this._overlayEventPredicate}),this._updatePosition(this._overlayRef),this._overlayRef.detachments().pipe(ut(this._destroyed)).subscribe(()=>this._detach()),this._overlayRef.outsidePointerEvents().pipe(ut(this._destroyed)).subscribe(()=>this._tooltipInstance?._handleBodyInteraction()),this._overlayRef.keydownEvents().pipe(ut(this._destroyed)).subscribe(a=>{a.preventDefault(),a.stopPropagation(),this._ngZone.run(()=>this.hide(0))}),this._defaultOptions?.disableTooltipInteractivity&&this._overlayRef.addPanelClass(`${this._cssClassPrefix}-tooltip-panel-non-interactive`),this._dirSubscribed||(this._dirSubscribed=!0,this._dir.change.pipe(ut(this._destroyed)).subscribe(()=>{this._overlayRef&&this._updatePosition(this._overlayRef)})),this._overlayRef}_detach(){this._overlayRef&&this._overlayRef.hasAttached()&&this._overlayRef.detach(),this._tooltipInstance=null}_updatePosition(A){let t=A.getConfig().positionStrategy,n=this._getOrigin(),o=this._getOverlayPosition();t.withPositions([this._addOffset(oA(oA({},n.main),o.main)),this._addOffset(oA(oA({},n.fallback),o.fallback))])}_addOffset(A){let t=CoA,n=!this._dir||this._dir.value=="ltr";return A.originY==="top"?A.offsetY=-t:A.originY==="bottom"?A.offsetY=t:A.originX==="start"?A.offsetX=n?-t:t:A.originX==="end"&&(A.offsetX=n?t:-t),A}_getOrigin(){let A=!this._dir||this._dir.value=="ltr",t=this.position,n;t=="above"||t=="below"?n={originX:"center",originY:t=="above"?"top":"bottom"}:t=="before"||t=="left"&&A||t=="right"&&!A?n={originX:"start",originY:"center"}:(t=="after"||t=="right"&&A||t=="left"&&!A)&&(n={originX:"end",originY:"center"});let{x:o,y:a}=this._invertPosition(n.originX,n.originY);return{main:n,fallback:{originX:o,originY:a}}}_getOverlayPosition(){let A=!this._dir||this._dir.value=="ltr",t=this.position,n;t=="above"?n={overlayX:"center",overlayY:"bottom"}:t=="below"?n={overlayX:"center",overlayY:"top"}:t=="before"||t=="left"&&A||t=="right"&&!A?n={overlayX:"end",overlayY:"center"}:(t=="after"||t=="right"&&A||t=="left"&&!A)&&(n={overlayX:"start",overlayY:"center"});let{x:o,y:a}=this._invertPosition(n.overlayX,n.overlayY);return{main:n,fallback:{overlayX:o,overlayY:a}}}_updateTooltipMessage(){this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),jn(()=>{this._tooltipInstance&&this._overlayRef.updatePosition()},{injector:this._injector}))}_setTooltipClass(A){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=A instanceof Set?Array.from(A):A,this._tooltipInstance._markForCheck())}_invertPosition(A,t){return this.position==="above"||this.position==="below"?t==="top"?t="bottom":t==="bottom"&&(t="top"):A==="end"?A="start":A==="start"&&(A="end"),{x:A,y:t}}_updateCurrentPositionClass(A){let{overlayY:t,originX:n,originY:o}=A,a;if(t==="center"?this._dir&&this._dir.value==="rtl"?a=n==="end"?"left":"right":a=n==="start"?"left":"right":a=t==="bottom"&&o==="top"?"above":"below",a!==this._currentPosition){let r=this._overlayRef;if(r){let s=`${this._cssClassPrefix}-${JK}-`;r.removePanelClass(s+this._currentPosition),r.addPanelClass(s+a)}this._currentPosition=a}}_setupPointerEnterEventsIfNeeded(){this._disabled||!this.message||!this._viewInitialized||this._eventCleanups.length||(this._isTouchPlatform()?this.touchGestures!=="off"&&(this._disableNativeGesturesIfNecessary(),this._addListener("touchstart",A=>{let t=A.targetTouches?.[0],n=t?{x:t.clientX,y:t.clientY}:void 0;this._setupPointerExitEventsIfNeeded(),this._touchstartTimeout&&clearTimeout(this._touchstartTimeout);let o=500;this._touchstartTimeout=setTimeout(()=>{this._touchstartTimeout=null,this.show(void 0,n)},this._defaultOptions?.touchLongPressShowDelay??o)})):this._addListener("mouseenter",A=>{this._setupPointerExitEventsIfNeeded();let t;A.x!==void 0&&A.y!==void 0&&(t=A),this.show(void 0,t)}))}_setupPointerExitEventsIfNeeded(){if(!this._pointerExitEventsInitialized){if(this._pointerExitEventsInitialized=!0,!this._isTouchPlatform())this._addListener("mouseleave",A=>{let t=A.relatedTarget;(!t||!this._overlayRef?.overlayElement.contains(t))&&this.hide()}),this._addListener("wheel",A=>{if(this._isTooltipVisible()){let t=this._document.elementFromPoint(A.clientX,A.clientY),n=this._elementRef.nativeElement;t!==n&&!n.contains(t)&&this.hide()}});else if(this.touchGestures!=="off"){this._disableNativeGesturesIfNecessary();let A=()=>{this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this.hide(this._defaultOptions?.touchendHideDelay)};this._addListener("touchend",A),this._addListener("touchcancel",A)}}}_addListener(A,t){this._eventCleanups.push(this._renderer.listen(this._elementRef.nativeElement,A,t,goA))}_isTouchPlatform(){return this._platform.IOS||this._platform.ANDROID?!0:this._platform.isBrowser?!!this._defaultOptions?.detectHoverCapability&&this._mediaMatcher.matchMedia("(any-hover: none)").matches:!1}_disableNativeGesturesIfNecessary(){let A=this.touchGestures;if(A!=="off"){let t=this._elementRef.nativeElement,n=t.style;(A==="on"||t.nodeName!=="INPUT"&&t.nodeName!=="TEXTAREA")&&(n.userSelect=n.msUserSelect=n.webkitUserSelect=n.MozUserSelect="none"),(A==="on"||!t.draggable)&&(n.webkitUserDrag="none"),n.touchAction="none",n.webkitTapHighlightColor="transparent"}}_syncAriaDescription(A){this._ariaDescriptionPending||(this._ariaDescriptionPending=!0,this._ariaDescriber.removeDescription(this._elementRef.nativeElement,A,"tooltip"),this._isDestroyed||jn({write:()=>{this._ariaDescriptionPending=!1,this.message&&!this.disabled&&this._ariaDescriber.describe(this._elementRef.nativeElement,this.message,"tooltip")}},{injector:this._injector}))}_overlayEventPredicate=A=>A.type==="keydown"?this._isTooltipVisible()&&A.keyCode===27&&!ha(A):!0;static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","matTooltip",""]],hostAttrs:[1,"mat-mdc-tooltip-trigger"],hostVars:2,hostBindings:function(t,n){t&2&&xA("mat-mdc-tooltip-disabled",n.disabled)},inputs:{position:[0,"matTooltipPosition","position"],positionAtOrigin:[0,"matTooltipPositionAtOrigin","positionAtOrigin"],disabled:[0,"matTooltipDisabled","disabled"],showDelay:[0,"matTooltipShowDelay","showDelay"],hideDelay:[0,"matTooltipHideDelay","hideDelay"],touchGestures:[0,"matTooltipTouchGestures","touchGestures"],message:[0,"matTooltip","message"],tooltipClass:[0,"matTooltipClass","tooltipClass"]},exportAs:["matTooltip"]})}return i})(),YK=(()=>{class i{_changeDetectorRef=w(wt);_elementRef=w(se);_isMultiline=!1;message;tooltipClass;_showTimeoutId;_hideTimeoutId;_triggerElement;_mouseLeaveHideDelay;_animationsDisabled=nn();_tooltip;_closeOnInteraction=!1;_isVisible=!1;_onHide=new te;_showAnimation="mat-mdc-tooltip-show";_hideAnimation="mat-mdc-tooltip-hide";constructor(){}show(A){this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=setTimeout(()=>{this._toggleVisibility(!0),this._showTimeoutId=void 0},A)}hide(A){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(()=>{this._toggleVisibility(!1),this._hideTimeoutId=void 0},A)}afterHidden(){return this._onHide}isVisible(){return this._isVisible}ngOnDestroy(){this._cancelPendingAnimations(),this._onHide.complete(),this._triggerElement=null}_handleBodyInteraction(){this._closeOnInteraction&&this.hide(0)}_markForCheck(){this._changeDetectorRef.markForCheck()}_handleMouseLeave({relatedTarget:A}){(!A||!this._triggerElement.contains(A))&&(this.isVisible()?this.hide(this._mouseLeaveHideDelay):this._finalizeAnimation(!1))}_onShow(){this._isMultiline=this._isTooltipMultiline(),this._markForCheck()}_isTooltipMultiline(){let A=this._elementRef.nativeElement.getBoundingClientRect();return A.height>IoA&&A.width>=doA}_handleAnimationEnd({animationName:A}){(A===this._showAnimation||A===this._hideAnimation)&&this._finalizeAnimation(A===this._showAnimation)}_cancelPendingAnimations(){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=this._hideTimeoutId=void 0}_finalizeAnimation(A){A?this._closeOnInteraction=!0:this.isVisible()||this._onHide.next()}_toggleVisibility(A){let t=this._tooltip.nativeElement,n=this._showAnimation,o=this._hideAnimation;if(t.classList.remove(A?o:n),t.classList.add(A?n:o),this._isVisible!==A&&(this._isVisible=A,this._changeDetectorRef.markForCheck()),A&&!this._animationsDisabled&&typeof getComputedStyle=="function"){let a=getComputedStyle(t);(a.getPropertyValue("animation-duration")==="0s"||a.getPropertyValue("animation-name")==="none")&&(this._animationsDisabled=!0)}A&&this._onShow(),this._animationsDisabled&&(t.classList.add("_mat-animation-noopable"),this._finalizeAnimation(A))}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-tooltip-component"]],viewQuery:function(t,n){if(t&1&&Yt(aoA,7),t&2){let o;oe(o=ae())&&(n._tooltip=o.first)}},hostAttrs:["aria-hidden","true"],hostBindings:function(t,n){t&1&&T("mouseleave",function(a){return n._handleMouseLeave(a)})},decls:4,vars:5,consts:[["tooltip",""],[1,"mdc-tooltip","mat-mdc-tooltip",3,"animationend"],[1,"mat-mdc-tooltip-surface","mdc-tooltip__surface"]],template:function(t,n){t&1&&(Dn(0,"div",1,0),td("animationend",function(a){return n._handleAnimationEnd(a)}),Dn(2,"div",2),y(3),Tn()()),t&2&&(go(n.tooltipClass),xA("mdc-tooltip--multiline",n._isMultiline),u(3),iA(n.message))},styles:[`.mat-mdc-tooltip{position:relative;transform:scale(0);display:inline-flex}.mat-mdc-tooltip::before{content:"";top:0;right:0;bottom:0;left:0;z-index:-1;position:absolute}.mat-mdc-tooltip-panel-below .mat-mdc-tooltip::before{top:-8px}.mat-mdc-tooltip-panel-above .mat-mdc-tooltip::before{bottom:-8px}.mat-mdc-tooltip-panel-right .mat-mdc-tooltip::before{left:-8px}.mat-mdc-tooltip-panel-left .mat-mdc-tooltip::before{right:-8px}.mat-mdc-tooltip._mat-animation-noopable{animation:none;transform:scale(1)}.mat-mdc-tooltip-surface{word-break:normal;overflow-wrap:anywhere;padding:4px 8px;min-width:40px;max-width:200px;min-height:24px;max-height:40vh;box-sizing:border-box;overflow:hidden;text-align:center;will-change:transform,opacity;background-color:var(--mat-tooltip-container-color, var(--mat-sys-inverse-surface));color:var(--mat-tooltip-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mat-tooltip-container-shape, var(--mat-sys-corner-extra-small));font-family:var(--mat-tooltip-supporting-text-font, var(--mat-sys-body-small-font));font-size:var(--mat-tooltip-supporting-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-tooltip-supporting-text-weight, var(--mat-sys-body-small-weight));line-height:var(--mat-tooltip-supporting-text-line-height, var(--mat-sys-body-small-line-height));letter-spacing:var(--mat-tooltip-supporting-text-tracking, var(--mat-sys-body-small-tracking))}.mat-mdc-tooltip-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:left}[dir=rtl] .mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:right}.mat-mdc-tooltip-panel{line-height:normal}.mat-mdc-tooltip-panel.mat-mdc-tooltip-panel-non-interactive{pointer-events:none}@keyframes mat-mdc-tooltip-show{0%{opacity:0;transform:scale(0.8)}100%{opacity:1;transform:scale(1)}}@keyframes mat-mdc-tooltip-hide{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(0.8)}}.mat-mdc-tooltip-show{animation:mat-mdc-tooltip-show 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-mdc-tooltip-hide{animation:mat-mdc-tooltip-hide 75ms cubic-bezier(0.4, 0, 1, 1) forwards} +`],encapsulation:2,changeDetection:0})}return i})();var Ra=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Jh,Yl,Qi,Fc]})}return i})();function BoA(i,e){if(i&1&&(d(0,"mat-option",17),y(1),E()),i&2){let A=e.$implicit;H("value",A),u(),Be(" ",A," ")}}function EoA(i,e){if(i&1){let A=rA();d(0,"mat-form-field",14)(1,"mat-select",16,0),T("selectionChange",function(n){G(A);let o=p(2);return K(o._changePageSize(n.value))}),xe(3,BoA,2,2,"mat-option",17,ni),E(),d(5,"div",18),T("click",function(){G(A);let n=gi(2);return K(n.open())}),E()()}if(i&2){let A=p(2);H("appearance",A._formFieldAppearance)("color",A.color),u(),H("value",A.pageSize)("disabled",A.disabled),D3("aria-labelledby",A._pageSizeLabelId),H("panelClass",A.selectConfig.panelClass||"")("disableOptionCentering",A.selectConfig.disableOptionCentering),u(2),Re(A._displayedPageSizeOptions)}}function hoA(i,e){if(i&1&&(d(0,"div",15),y(1),E()),i&2){let A=p(2);u(),iA(A.pageSize)}}function QoA(i,e){if(i&1&&(d(0,"div",3)(1,"div",13),y(2),E(),Y(3,EoA,6,7,"mat-form-field",14),Y(4,hoA,2,1,"div",15),E()),i&2){let A=p();u(),ee("id",A._pageSizeLabelId),u(),Be(" ",A._intl.itemsPerPageLabel," "),u(),O(A._displayedPageSizeOptions.length>1?3:-1),u(),O(A._displayedPageSizeOptions.length<=1?4:-1)}}function uoA(i,e){if(i&1){let A=rA();d(0,"button",19),T("click",function(){G(A);let n=p();return K(n._buttonClicked(0,n._previousButtonsDisabled()))}),It(),d(1,"svg",8),lA(2,"path",20),E()()}if(i&2){let A=p();H("matTooltip",A._intl.firstPageLabel)("matTooltipDisabled",A._previousButtonsDisabled())("disabled",A._previousButtonsDisabled())("tabindex",A._previousButtonsDisabled()?-1:null),ee("aria-label",A._intl.firstPageLabel)}}function poA(i,e){if(i&1){let A=rA();d(0,"button",21),T("click",function(){G(A);let n=p();return K(n._buttonClicked(n.getNumberOfPages()-1,n._nextButtonsDisabled()))}),It(),d(1,"svg",8),lA(2,"path",22),E()()}if(i&2){let A=p();H("matTooltip",A._intl.lastPageLabel)("matTooltipDisabled",A._nextButtonsDisabled())("disabled",A._nextButtonsDisabled())("tabindex",A._nextButtonsDisabled()?-1:null),ee("aria-label",A._intl.lastPageLabel)}}var Y1=(()=>{class i{changes=new te;itemsPerPageLabel="Items per page:";nextPageLabel="Next page";previousPageLabel="Previous page";firstPageLabel="First page";lastPageLabel="Last page";getRangeLabel=(A,t,n)=>{if(n==0||t==0)return`0 of ${n}`;n=Math.max(n,0);let o=A*t,a=o{class i{_intl=w(Y1);_changeDetectorRef=w(wt);_formFieldAppearance;_pageSizeLabelId=w(Bn).getId("mat-paginator-page-size-label-");_intlChanges;_isInitialized=!1;_initializedStream=new Qg(1);color;get pageIndex(){return this._pageIndex}set pageIndex(A){this._pageIndex=Math.max(A||0,0),this._changeDetectorRef.markForCheck()}_pageIndex=0;get length(){return this._length}set length(A){this._length=A||0,this._changeDetectorRef.markForCheck()}_length=0;get pageSize(){return this._pageSize}set pageSize(A){this._pageSize=Math.max(A||0,0),this._updateDisplayedPageSizeOptions()}_pageSize;get pageSizeOptions(){return this._pageSizeOptions}set pageSizeOptions(A){this._pageSizeOptions=(A||[]).map(t=>dn(t,0)),this._updateDisplayedPageSizeOptions()}_pageSizeOptions=[];hidePageSize=!1;showFirstLastButtons=!1;selectConfig={};disabled=!1;page=new LA;_displayedPageSizeOptions;initialized=this._initializedStream;constructor(){let A=this._intl,t=w(moA,{optional:!0});if(this._intlChanges=A.changes.subscribe(()=>this._changeDetectorRef.markForCheck()),t){let{pageSize:n,pageSizeOptions:o,hidePageSize:a,showFirstLastButtons:r}=t;n!=null&&(this._pageSize=n),o!=null&&(this._pageSizeOptions=o),a!=null&&(this.hidePageSize=a),r!=null&&(this.showFirstLastButtons=r)}this._formFieldAppearance=t?.formFieldAppearance||"outline"}ngOnInit(){this._isInitialized=!0,this._updateDisplayedPageSizeOptions(),this._initializedStream.next()}ngOnDestroy(){this._initializedStream.complete(),this._intlChanges.unsubscribe()}nextPage(){this.hasNextPage()&&this._navigate(this.pageIndex+1)}previousPage(){this.hasPreviousPage()&&this._navigate(this.pageIndex-1)}firstPage(){this.hasPreviousPage()&&this._navigate(0)}lastPage(){this.hasNextPage()&&this._navigate(this.getNumberOfPages()-1)}hasPreviousPage(){return this.pageIndex>=1&&this.pageSize!=0}hasNextPage(){let A=this.getNumberOfPages()-1;return this.pageIndexA-t),this._changeDetectorRef.markForCheck())}_emitPageEvent(A){this.page.emit({previousPageIndex:A,pageIndex:this.pageIndex,pageSize:this.pageSize,length:this.length})}_navigate(A){let t=this.pageIndex;A!==t&&(this.pageIndex=A,this._emitPageEvent(t))}_buttonClicked(A,t){t||this._navigate(A)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-paginator"]],hostAttrs:["role","group",1,"mat-mdc-paginator"],inputs:{color:"color",pageIndex:[2,"pageIndex","pageIndex",dn],length:[2,"length","length",dn],pageSize:[2,"pageSize","pageSize",dn],pageSizeOptions:"pageSizeOptions",hidePageSize:[2,"hidePageSize","hidePageSize",Ee],showFirstLastButtons:[2,"showFirstLastButtons","showFirstLastButtons",Ee],selectConfig:"selectConfig",disabled:[2,"disabled","disabled",Ee]},outputs:{page:"page"},exportAs:["matPaginator"],decls:14,vars:14,consts:[["selectRef",""],[1,"mat-mdc-paginator-outer-container"],[1,"mat-mdc-paginator-container"],[1,"mat-mdc-paginator-page-size"],[1,"mat-mdc-paginator-range-actions"],["aria-atomic","true","aria-live","polite","role","status",1,"mat-mdc-paginator-range-label"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"matTooltip","matTooltipDisabled","disabled","tabindex"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-previous",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["viewBox","0 0 24 24","focusable","false","aria-hidden","true",1,"mat-mdc-paginator-icon"],["d","M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-next",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"matTooltip","matTooltipDisabled","disabled","tabindex"],["aria-hidden","true",1,"mat-mdc-paginator-page-size-label"],[1,"mat-mdc-paginator-page-size-select",3,"appearance","color"],[1,"mat-mdc-paginator-page-size-value"],["hideSingleSelectionIndicator","",3,"selectionChange","value","disabled","aria-labelledby","panelClass","disableOptionCentering"],[3,"value"],[1,"mat-mdc-paginator-touch-target",3,"click"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"]],template:function(t,n){t&1&&(d(0,"div",1)(1,"div",2),Y(2,QoA,5,4,"div",3),d(3,"div",4)(4,"div",5),y(5),E(),Y(6,uoA,3,5,"button",6),d(7,"button",7),T("click",function(){return n._buttonClicked(n.pageIndex-1,n._previousButtonsDisabled())}),It(),d(8,"svg",8),lA(9,"path",9),E()(),or(),d(10,"button",10),T("click",function(){return n._buttonClicked(n.pageIndex+1,n._nextButtonsDisabled())}),It(),d(11,"svg",8),lA(12,"path",11),E()(),Y(13,poA,3,5,"button",12),E()()()),t&2&&(u(2),O(n.hidePageSize?-1:2),u(3),Be(" ",n._intl.getRangeLabel(n.pageIndex,n.pageSize,n.length)," "),u(),O(n.showFirstLastButtons?6:-1),u(),H("matTooltip",n._intl.previousPageLabel)("matTooltipDisabled",n._previousButtonsDisabled())("disabled",n._previousButtonsDisabled())("tabindex",n._previousButtonsDisabled()?-1:null),ee("aria-label",n._intl.previousPageLabel),u(3),H("matTooltip",n._intl.nextPageLabel)("matTooltipDisabled",n._nextButtonsDisabled())("disabled",n._nextButtonsDisabled())("tabindex",n._nextButtonsDisabled()?-1:null),ee("aria-label",n._intl.nextPageLabel),u(3),O(n.showFirstLastButtons?13:-1))},dependencies:[To,zl,Kr,vi,Zi],styles:[`.mat-mdc-paginator{display:block;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-paginator-container-text-color, var(--mat-sys-on-surface));background-color:var(--mat-paginator-container-background-color, var(--mat-sys-surface));font-family:var(--mat-paginator-container-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-paginator-container-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-paginator-container-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-paginator-container-text-weight, var(--mat-sys-body-small-weight));letter-spacing:var(--mat-paginator-container-text-tracking, var(--mat-sys-body-small-tracking));--mat-form-field-container-height: var(--mat-paginator-form-field-container-height, 40px);--mat-form-field-container-vertical-padding: var(--mat-paginator-form-field-container-vertical-padding, 8px)}.mat-mdc-paginator .mat-mdc-select-value{font-size:var(--mat-paginator-select-trigger-text-size, var(--mat-sys-body-small-size))}.mat-mdc-paginator .mat-mdc-form-field-subscript-wrapper{display:none}.mat-mdc-paginator .mat-mdc-select{line-height:1.5}.mat-mdc-paginator-outer-container{display:flex}.mat-mdc-paginator-container{display:flex;align-items:center;justify-content:flex-end;padding:0 8px;flex-wrap:wrap;width:100%;min-height:var(--mat-paginator-container-size, 56px)}.mat-mdc-paginator-page-size{display:flex;align-items:baseline;margin-right:8px}[dir=rtl] .mat-mdc-paginator-page-size{margin-right:0;margin-left:8px}.mat-mdc-paginator-page-size-label{margin:0 4px}.mat-mdc-paginator-page-size-select{margin:0 4px;width:var(--mat-paginator-page-size-select-width, 84px)}.mat-mdc-paginator-range-label{margin:0 32px 0 24px}.mat-mdc-paginator-range-actions{display:flex;align-items:center}.mat-mdc-paginator-icon{display:inline-block;width:28px;fill:var(--mat-paginator-enabled-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon{fill:var(--mat-paginator-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}[dir=rtl] .mat-mdc-paginator-icon{transform:rotate(180deg)}@media(forced-colors: active){.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon,.mat-mdc-paginator-icon{fill:currentColor}.mat-mdc-paginator-range-actions .mat-mdc-icon-button{outline:solid 1px}.mat-mdc-paginator-range-actions .mat-mdc-icon-button[aria-disabled]{color:GrayText}}.mat-mdc-paginator-touch-target{display:var(--mat-paginator-touch-target-display, block);position:absolute;top:50%;left:50%;width:var(--mat-paginator-page-size-select-width, 84px);height:var(--mat-paginator-page-size-select-touch-target-height, 48px);background-color:rgba(0,0,0,0);transform:translate(-50%, -50%);cursor:pointer} +`],encapsulation:2,changeDetection:0})}return i})();var OK=["*"],woA=["content"],DoA=[[["mat-drawer"]],[["mat-drawer-content"]],"*"],yoA=["mat-drawer","mat-drawer-content","*"];function voA(i,e){if(i&1){let A=rA();d(0,"div",1),T("click",function(){G(A);let n=p();return K(n._onBackdropClicked())}),E()}if(i&2){let A=p();xA("mat-drawer-shown",A._isShowingBackdrop())}}function boA(i,e){i&1&&(d(0,"mat-drawer-content"),Ve(1,2),E())}var MoA=new MA("MAT_DRAWER_DEFAULT_AUTOSIZE",{providedIn:"root",factory:()=>!1}),HK=new MA("MAT_DRAWER_CONTAINER"),cb=(()=>{class i extends _0{_platform=w(Ci);_changeDetectorRef=w(wt);_container=w(Ib);constructor(){let A=w(se),t=w(Lc),n=w(qe);super(A,t,n)}ngAfterContentInit(){this._container._contentMarginChanges.subscribe(()=>{this._changeDetectorRef.markForCheck()})}_shouldBeHidden(){if(this._platform.isBrowser)return!1;let{start:A,end:t}=this._container;return A!=null&&A.mode!=="over"&&A.opened||t!=null&&t.mode!=="over"&&t.opened}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-drawer-content"]],hostAttrs:[1,"mat-drawer-content"],hostVars:6,hostBindings:function(t,n){t&2&&(ht("margin-left",n._container._contentMargins.left,"px")("margin-right",n._container._contentMargins.right,"px"),xA("mat-drawer-content-hidden",n._shouldBeHidden()))},features:[Et([{provide:_0,useExisting:i}]),mt],ngContentSelectors:OK,decls:1,vars:0,template:function(t,n){t&1&&(Nt(),Ve(0))},encapsulation:2,changeDetection:0})}return i})(),Cb=(()=>{class i{_elementRef=w(se);_focusTrapFactory=w(Uh);_focusMonitor=w(Wa);_platform=w(Ci);_ngZone=w(qe);_renderer=w(qi);_interactivityChecker=w(Ed);_doc=w(ii);_container=w(HK,{optional:!0});_focusTrap=null;_elementFocusedBeforeDrawerWasOpened=null;_eventCleanups;_isAttached=!1;_anchor=null;get position(){return this._position}set position(A){A=A==="end"?"end":"start",A!==this._position&&(this._isAttached&&this._updatePositionInParent(A),this._position=A,this.onPositionChanged.emit())}_position="start";get mode(){return this._mode}set mode(A){this._mode=A,this._updateFocusTrapState(),this._modeChanged.next()}_mode="over";get disableClose(){return this._disableClose}set disableClose(A){this._disableClose=ur(A)}_disableClose=!1;get autoFocus(){let A=this._autoFocus;return A??(this.mode==="side"?"dialog":"first-tabbable")}set autoFocus(A){(A==="true"||A==="false"||A==null)&&(A=ur(A)),this._autoFocus=A}_autoFocus;get opened(){return this._opened()}set opened(A){this.toggle(ur(A))}_opened=mA(!1);_openedVia=null;_animationStarted=new te;_animationEnd=new te;openedChange=new LA(!0);_openedStream=this.openedChange.pipe(Ct(A=>A),ye(()=>{}));openedStart=this._animationStarted.pipe(Ct(()=>this.opened),uh(void 0));_closedStream=this.openedChange.pipe(Ct(A=>!A),ye(()=>{}));closedStart=this._animationStarted.pipe(Ct(()=>!this.opened),uh(void 0));_destroyed=new te;onPositionChanged=new LA;_content;_modeChanged=new te;_injector=w(Dt);_changeDetectorRef=w(wt);constructor(){this.openedChange.pipe(ut(this._destroyed)).subscribe(A=>{A?(this._elementFocusedBeforeDrawerWasOpened=this._doc.activeElement,this._takeFocus()):this._isFocusWithinDrawer()&&this._restoreFocus(this._openedVia||"program")}),this._eventCleanups=this._ngZone.runOutsideAngular(()=>{let A=this._renderer,t=this._elementRef.nativeElement;return[A.listen(t,"keydown",n=>{n.keyCode===27&&!this.disableClose&&!ha(n)&&this._ngZone.run(()=>{this.close(),n.stopPropagation(),n.preventDefault()})}),A.listen(t,"transitionrun",this._handleTransitionEvent),A.listen(t,"transitionend",this._handleTransitionEvent),A.listen(t,"transitioncancel",this._handleTransitionEvent)]}),this._animationEnd.subscribe(()=>{this.openedChange.emit(this.opened)})}_forceFocus(A,t){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),a(),A.removeAttribute("tabindex")},o=this._renderer.listen(A,"blur",n),a=this._renderer.listen(A,"mousedown",n)})),A.focus(t)}_focusByCssSelector(A,t){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,t)}_takeFocus(){if(!this._focusTrap)return;let A=this._elementRef.nativeElement;switch(this.autoFocus){case!1:case"dialog":return;case!0:case"first-tabbable":jn(()=>{!this._focusTrap.focusInitialElement()&&typeof A.focus=="function"&&A.focus()},{injector:this._injector});break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]');break;default:this._focusByCssSelector(this.autoFocus);break}}_restoreFocus(A){this.autoFocus!=="dialog"&&(this._elementFocusedBeforeDrawerWasOpened?this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened,A):this._elementRef.nativeElement.blur(),this._elementFocusedBeforeDrawerWasOpened=null)}_isFocusWithinDrawer(){let A=this._doc.activeElement;return!!A&&this._elementRef.nativeElement.contains(A)}ngAfterViewInit(){this._isAttached=!0,this._position==="end"&&this._updatePositionInParent("end"),this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._updateFocusTrapState())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._focusTrap?.destroy(),this._anchor?.remove(),this._anchor=null,this._animationStarted.complete(),this._animationEnd.complete(),this._modeChanged.complete(),this._destroyed.next(),this._destroyed.complete()}open(A){return this.toggle(!0,A)}close(){return this.toggle(!1)}_closeViaBackdropClick(){return this._setOpen(!1,!0,"mouse")}toggle(A=!this.opened,t){A&&t&&(this._openedVia=t);let n=this._setOpen(A,!A&&this._isFocusWithinDrawer(),this._openedVia||"program");return A||(this._openedVia=null),n}_setOpen(A,t,n){return A===this.opened?Promise.resolve(A?"open":"close"):(this._opened.set(A),this._container?._transitionsEnabled?this._setIsAnimating(!0):setTimeout(()=>{this._animationStarted.next(),this._animationEnd.next()}),this._elementRef.nativeElement.classList.toggle("mat-drawer-opened",A),!A&&t&&this._restoreFocus(n),this._changeDetectorRef.markForCheck(),this._updateFocusTrapState(),new Promise(o=>{this.openedChange.pipe(po(1)).subscribe(a=>o(a?"open":"close"))}))}_setIsAnimating(A){this._elementRef.nativeElement.classList.toggle("mat-drawer-animating",A)}_getWidth(){return this._elementRef.nativeElement.offsetWidth||0}_updateFocusTrapState(){this._focusTrap&&(this._focusTrap.enabled=this.opened&&!!this._container?._isShowingBackdrop())}_updatePositionInParent(A){if(!this._platform.isBrowser)return;let t=this._elementRef.nativeElement,n=t.parentNode;A==="end"?(this._anchor||(this._anchor=this._doc.createComment("mat-drawer-anchor"),n.insertBefore(this._anchor,t)),n.appendChild(t)):this._anchor&&this._anchor.parentNode.insertBefore(t,this._anchor)}_handleTransitionEvent=A=>{let t=this._elementRef.nativeElement;A.target===t&&this._ngZone.run(()=>{A.type==="transitionrun"?this._animationStarted.next(A):(A.type==="transitionend"&&this._setIsAnimating(!1),this._animationEnd.next(A))})};static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-drawer"]],viewQuery:function(t,n){if(t&1&&Yt(woA,5),t&2){let o;oe(o=ae())&&(n._content=o.first)}},hostAttrs:[1,"mat-drawer"],hostVars:12,hostBindings:function(t,n){t&2&&(ee("align",null)("tabIndex",n.mode!=="side"?"-1":null),ht("visibility",!n._container&&!n.opened?"hidden":null),xA("mat-drawer-end",n.position==="end")("mat-drawer-over",n.mode==="over")("mat-drawer-push",n.mode==="push")("mat-drawer-side",n.mode==="side"))},inputs:{position:"position",mode:"mode",disableClose:"disableClose",autoFocus:"autoFocus",opened:"opened"},outputs:{openedChange:"openedChange",_openedStream:"opened",openedStart:"openedStart",_closedStream:"closed",closedStart:"closedStart",onPositionChanged:"positionChanged"},exportAs:["matDrawer"],ngContentSelectors:OK,decls:3,vars:0,consts:[["content",""],["cdkScrollable","",1,"mat-drawer-inner-container"]],template:function(t,n){t&1&&(Nt(),d(0,"div",1,0),Ve(2),E())},dependencies:[_0],encapsulation:2,changeDetection:0})}return i})(),Ib=(()=>{class i{_dir=w(fo,{optional:!0});_element=w(se);_ngZone=w(qe);_changeDetectorRef=w(wt);_animationDisabled=nn();_transitionsEnabled=!1;_allDrawers;_drawers=new pg;_content;_userContent;get start(){return this._start}get end(){return this._end}get autosize(){return this._autosize}set autosize(A){this._autosize=ur(A)}_autosize=w(MoA);get hasBackdrop(){return this._drawerHasBackdrop(this._start)||this._drawerHasBackdrop(this._end)}set hasBackdrop(A){this._backdropOverride=A==null?null:ur(A)}_backdropOverride=null;backdropClick=new LA;_start=null;_end=null;_left=null;_right=null;_destroyed=new te;_doCheckSubject=new te;_contentMargins={left:null,right:null};_contentMarginChanges=new te;get scrollable(){return this._userContent||this._content}_injector=w(Dt);constructor(){let A=w(Ci),t=w(fs);this._dir?.change.pipe(ut(this._destroyed)).subscribe(()=>{this._validateDrawers(),this.updateContentMargins()}),t.change().pipe(ut(this._destroyed)).subscribe(()=>this.updateContentMargins()),!this._animationDisabled&&A.isBrowser&&this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._element.nativeElement.classList.add("mat-drawer-transition"),this._transitionsEnabled=!0},200)})}ngAfterContentInit(){this._allDrawers.changes.pipe(kn(this._allDrawers),ut(this._destroyed)).subscribe(A=>{this._drawers.reset(A.filter(t=>!t._container||t._container===this)),this._drawers.notifyOnChanges()}),this._drawers.changes.pipe(kn(null)).subscribe(()=>{this._validateDrawers(),this._drawers.forEach(A=>{this._watchDrawerToggle(A),this._watchDrawerPosition(A),this._watchDrawerMode(A)}),(!this._drawers.length||this._isDrawerOpen(this._start)||this._isDrawerOpen(this._end))&&this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),this._ngZone.runOutsideAngular(()=>{this._doCheckSubject.pipe(Ms(10),ut(this._destroyed)).subscribe(()=>this.updateContentMargins())})}ngOnDestroy(){this._contentMarginChanges.complete(),this._doCheckSubject.complete(),this._drawers.destroy(),this._destroyed.next(),this._destroyed.complete()}open(){this._drawers.forEach(A=>A.open())}close(){this._drawers.forEach(A=>A.close())}updateContentMargins(){let A=0,t=0;if(this._left&&this._left.opened){if(this._left.mode=="side")A+=this._left._getWidth();else if(this._left.mode=="push"){let n=this._left._getWidth();A+=n,t-=n}}if(this._right&&this._right.opened){if(this._right.mode=="side")t+=this._right._getWidth();else if(this._right.mode=="push"){let n=this._right._getWidth();t+=n,A-=n}}A=A||null,t=t||null,(A!==this._contentMargins.left||t!==this._contentMargins.right)&&(this._contentMargins={left:A,right:t},this._ngZone.run(()=>this._contentMarginChanges.next(this._contentMargins)))}ngDoCheck(){this._autosize&&this._isPushed()&&this._ngZone.runOutsideAngular(()=>this._doCheckSubject.next())}_watchDrawerToggle(A){A._animationStarted.pipe(ut(this._drawers.changes)).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),A.mode!=="side"&&A.openedChange.pipe(ut(this._drawers.changes)).subscribe(()=>this._setContainerClass(A.opened))}_watchDrawerPosition(A){A.onPositionChanged.pipe(ut(this._drawers.changes)).subscribe(()=>{jn({read:()=>this._validateDrawers()},{injector:this._injector})})}_watchDrawerMode(A){A._modeChanged.pipe(ut(Ti(this._drawers.changes,this._destroyed))).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()})}_setContainerClass(A){let t=this._element.nativeElement.classList,n="mat-drawer-container-has-open";A?t.add(n):t.remove(n)}_validateDrawers(){this._start=this._end=null,this._drawers.forEach(A=>{A.position=="end"?(this._end!=null,this._end=A):(this._start!=null,this._start=A)}),this._right=this._left=null,this._dir&&this._dir.value==="rtl"?(this._left=this._end,this._right=this._start):(this._left=this._start,this._right=this._end)}_isPushed(){return this._isDrawerOpen(this._start)&&this._start.mode!="over"||this._isDrawerOpen(this._end)&&this._end.mode!="over"}_onBackdropClicked(){this.backdropClick.emit(),this._closeModalDrawersViaBackdrop()}_closeModalDrawersViaBackdrop(){[this._start,this._end].filter(A=>A&&!A.disableClose&&this._drawerHasBackdrop(A)).forEach(A=>A._closeViaBackdropClick())}_isShowingBackdrop(){return this._isDrawerOpen(this._start)&&this._drawerHasBackdrop(this._start)||this._isDrawerOpen(this._end)&&this._drawerHasBackdrop(this._end)}_isDrawerOpen(A){return A!=null&&A.opened}_drawerHasBackdrop(A){return this._backdropOverride==null?!!A&&A.mode!=="side":this._backdropOverride}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-drawer-container"]],contentQueries:function(t,n,o){if(t&1&&Vo(o,cb,5)(o,Cb,5),t&2){let a;oe(a=ae())&&(n._content=a.first),oe(a=ae())&&(n._allDrawers=a)}},viewQuery:function(t,n){if(t&1&&Yt(cb,5),t&2){let o;oe(o=ae())&&(n._userContent=o.first)}},hostAttrs:[1,"mat-drawer-container"],hostVars:2,hostBindings:function(t,n){t&2&&xA("mat-drawer-container-explicit-backdrop",n._backdropOverride)},inputs:{autosize:"autosize",hasBackdrop:"hasBackdrop"},outputs:{backdropClick:"backdropClick"},exportAs:["matDrawerContainer"],features:[Et([{provide:HK,useExisting:i}])],ngContentSelectors:yoA,decls:4,vars:2,consts:[[1,"mat-drawer-backdrop",3,"mat-drawer-shown"],[1,"mat-drawer-backdrop",3,"click"]],template:function(t,n){t&1&&(Nt(DoA),Y(0,voA,1,2,"div",0),Ve(1),Ve(2,1),Y(3,boA,2,0,"mat-drawer-content")),t&2&&(O(n.hasBackdrop?0:-1),u(3),O(n._content?-1:3))},dependencies:[cb],styles:[`.mat-drawer-container{position:relative;z-index:1;color:var(--mat-sidenav-content-text-color, var(--mat-sys-on-background));background-color:var(--mat-sidenav-content-background-color, var(--mat-sys-background));box-sizing:border-box;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible;background-color:var(--mat-sidenav-scrim-color, color-mix(in srgb, var(--mat-sys-neutral-variant20) 40%, transparent))}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}@media(forced-colors: active){.mat-drawer-backdrop{opacity:.5}}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-content.mat-drawer-content-hidden{opacity:0}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;color:var(--mat-sidenav-container-text-color, var(--mat-sys-on-surface-variant));box-shadow:var(--mat-sidenav-container-elevation-shadow, none);background-color:var(--mat-sidenav-container-background-color, var(--mat-sys-surface));border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));width:var(--mat-sidenav-container-width, 360px);display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}@media(forced-colors: active){.mat-drawer,[dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}}@media(forced-colors: active){[dir=rtl] .mat-drawer,.mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0);border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .mat-drawer{border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-left-radius:0;border-bottom-left-radius:0;left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-transition .mat-drawer{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating){visibility:hidden;box-shadow:none}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container{display:none}.mat-drawer.mat-drawer-opened.mat-drawer-opened{transform:none}.mat-drawer-side{box-shadow:none;border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid}.mat-drawer-side.mat-drawer-end{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid;border-left:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto}.mat-sidenav-fixed{position:fixed} +`],encapsulation:2,changeDetection:0})}return i})();var SoA=["determinateSpinner"];function koA(i,e){if(i&1&&(It(),d(0,"svg",11),lA(1,"circle",12),E()),i&2){let A=p();ee("viewBox",A._viewBox()),u(),ht("stroke-dasharray",A._strokeCircumference(),"px")("stroke-dashoffset",A._strokeCircumference()/2,"px")("stroke-width",A._circleStrokeWidth(),"%"),ee("r",A._circleRadius())}}var _oA=new MA("mat-progress-spinner-default-options",{providedIn:"root",factory:()=>({diameter:zK})}),zK=100,xoA=10,os=(()=>{class i{_elementRef=w(se);_noopAnimations;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor="primary";_determinateCircle;constructor(){let A=w(_oA),t=Oh(),n=this._elementRef.nativeElement;this._noopAnimations=t==="di-disabled"&&!!A&&!A._forceAnimations,this.mode=n.nodeName.toLowerCase()==="mat-spinner"?"indeterminate":"determinate",!this._noopAnimations&&t==="reduced-motion"&&n.classList.add("mat-progress-spinner-reduced-motion"),A&&(A.color&&(this.color=this._defaultColor=A.color),A.diameter&&(this.diameter=A.diameter),A.strokeWidth&&(this.strokeWidth=A.strokeWidth))}mode;get value(){return this.mode==="determinate"?this._value:0}set value(A){this._value=Math.max(0,Math.min(100,A||0))}_value=0;get diameter(){return this._diameter}set diameter(A){this._diameter=A||0}_diameter=zK;get strokeWidth(){return this._strokeWidth??this.diameter/10}set strokeWidth(A){this._strokeWidth=A||0}_strokeWidth;_circleRadius(){return(this.diameter-xoA)/2}_viewBox(){let A=this._circleRadius()*2+this.strokeWidth;return`0 0 ${A} ${A}`}_strokeCircumference(){return 2*Math.PI*this._circleRadius()}_strokeDashOffset(){return this.mode==="determinate"?this._strokeCircumference()*(100-this._value)/100:null}_circleStrokeWidth(){return this.strokeWidth/this.diameter*100}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-progress-spinner"],["mat-spinner"]],viewQuery:function(t,n){if(t&1&&Yt(SoA,5),t&2){let o;oe(o=ae())&&(n._determinateCircle=o.first)}},hostAttrs:["role","progressbar","tabindex","-1",1,"mat-mdc-progress-spinner","mdc-circular-progress"],hostVars:18,hostBindings:function(t,n){t&2&&(ee("aria-valuemin",0)("aria-valuemax",100)("aria-valuenow",n.mode==="determinate"?n.value:null)("mode",n.mode),go("mat-"+n.color),ht("width",n.diameter,"px")("height",n.diameter,"px")("--mat-progress-spinner-size",n.diameter+"px")("--mat-progress-spinner-active-indicator-width",n.diameter+"px"),xA("_mat-animation-noopable",n._noopAnimations)("mdc-circular-progress--indeterminate",n.mode==="indeterminate"))},inputs:{color:"color",mode:"mode",value:[2,"value","value",dn],diameter:[2,"diameter","diameter",dn],strokeWidth:[2,"strokeWidth","strokeWidth",dn]},exportAs:["matProgressSpinner"],decls:14,vars:11,consts:[["circle",""],["determinateSpinner",""],["aria-hidden","true",1,"mdc-circular-progress__determinate-container"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__determinate-circle-graphic"],["cx","50%","cy","50%",1,"mdc-circular-progress__determinate-circle"],["aria-hidden","true",1,"mdc-circular-progress__indeterminate-container"],[1,"mdc-circular-progress__spinner-layer"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-left"],[3,"ngTemplateOutlet"],[1,"mdc-circular-progress__gap-patch"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-right"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__indeterminate-circle-graphic"],["cx","50%","cy","50%"]],template:function(t,n){if(t&1&&(yt(0,koA,2,8,"ng-template",null,0,MC),d(2,"div",2,1),It(),d(4,"svg",3),lA(5,"circle",4),E()(),or(),d(6,"div",5)(7,"div",6)(8,"div",7),gn(9,8),E(),d(10,"div",9),gn(11,8),E(),d(12,"div",10),gn(13,8),E()()()),t&2){let o=gi(1);u(4),ee("viewBox",n._viewBox()),u(),ht("stroke-dasharray",n._strokeCircumference(),"px")("stroke-dashoffset",n._strokeDashOffset(),"px")("stroke-width",n._circleStrokeWidth(),"%"),ee("r",n._circleRadius()),u(4),H("ngTemplateOutlet",o),u(2),H("ngTemplateOutlet",o),u(2),H("ngTemplateOutlet",o)}},dependencies:[vc],styles:[`.mat-mdc-progress-spinner{--mat-progress-spinner-animation-multiplier: 1;display:block;overflow:hidden;line-height:0;position:relative;direction:ltr;transition:opacity 250ms cubic-bezier(0.4, 0, 0.6, 1)}.mat-mdc-progress-spinner circle{stroke-width:var(--mat-progress-spinner-active-indicator-width, 4px)}.mat-mdc-progress-spinner._mat-animation-noopable,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__determinate-circle{transition:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__spinner-layer,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container{animation:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container circle{stroke-dasharray:0 !important}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle{stroke:currentColor;stroke:CanvasText}}.mat-progress-spinner-reduced-motion{--mat-progress-spinner-animation-multiplier: 1.25}.mdc-circular-progress__determinate-container,.mdc-circular-progress__indeterminate-circle-graphic,.mdc-circular-progress__indeterminate-container,.mdc-circular-progress__spinner-layer{position:absolute;width:100%;height:100%}.mdc-circular-progress__determinate-container{transform:rotate(-90deg)}.mdc-circular-progress--indeterminate .mdc-circular-progress__determinate-container{opacity:0}.mdc-circular-progress__indeterminate-container{font-size:0;letter-spacing:0;white-space:nowrap;opacity:0}.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container{opacity:1;animation:mdc-circular-progress-container-rotate calc(1568.2352941176ms*var(--mat-progress-spinner-animation-multiplier)) linear infinite}.mdc-circular-progress__determinate-circle-graphic,.mdc-circular-progress__indeterminate-circle-graphic{fill:rgba(0,0,0,0)}.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:var(--mat-progress-spinner-active-indicator-color, var(--mat-sys-primary))}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:CanvasText}}.mdc-circular-progress__determinate-circle{transition:stroke-dashoffset 500ms cubic-bezier(0, 0, 0.2, 1)}.mdc-circular-progress__gap-patch{position:absolute;top:0;left:47.5%;box-sizing:border-box;width:5%;height:100%;overflow:hidden}.mdc-circular-progress__gap-patch .mdc-circular-progress__indeterminate-circle-graphic{left:-900%;width:2000%;transform:rotate(180deg)}.mdc-circular-progress__circle-clipper .mdc-circular-progress__indeterminate-circle-graphic{width:200%}.mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{left:-100%}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-left .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-left-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-right-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress__circle-clipper{display:inline-flex;position:relative;width:50%;height:100%;overflow:hidden}.mdc-circular-progress--indeterminate .mdc-circular-progress__spinner-layer{animation:mdc-circular-progress-spinner-layer-rotate calc(5332ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}@keyframes mdc-circular-progress-container-rotate{to{transform:rotate(360deg)}}@keyframes mdc-circular-progress-spinner-layer-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}100%{transform:rotate(1080deg)}}@keyframes mdc-circular-progress-left-spin{from{transform:rotate(265deg)}50%{transform:rotate(130deg)}to{transform:rotate(265deg)}}@keyframes mdc-circular-progress-right-spin{from{transform:rotate(-265deg)}50%{transform:rotate(-130deg)}to{transform:rotate(-265deg)}} +`],encapsulation:2,changeDetection:0})}return i})();var zC=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Qi]})}return i})();function RoA(i,e){if(i&1){let A=rA();d(0,"div",1)(1,"button",2),T("click",function(){G(A);let n=p();return K(n.action())}),y(2),E()()}if(i&2){let A=p();u(2),Be(" ",A.data.action," ")}}var NoA=["label"];function FoA(i,e){}var LoA=Math.pow(2,31)-1,kQ=class{_overlayRef;instance;containerInstance;_afterDismissed=new te;_afterOpened=new te;_onAction=new te;_durationTimeoutId;_dismissedByAction=!1;constructor(e,A){this._overlayRef=A,this.containerInstance=e,e._onExit.subscribe(()=>this._finishDismiss())}dismiss(){this._afterDismissed.closed||this.containerInstance.exit(),clearTimeout(this._durationTimeoutId)}dismissWithAction(){this._onAction.closed||(this._dismissedByAction=!0,this._onAction.next(),this._onAction.complete(),this.dismiss()),clearTimeout(this._durationTimeoutId)}closeWithAction(){this.dismissWithAction()}_dismissAfter(e){this._durationTimeoutId=setTimeout(()=>this.dismiss(),Math.min(e,LoA))}_open(){this._afterOpened.closed||(this._afterOpened.next(),this._afterOpened.complete())}_finishDismiss(){this._overlayRef.dispose(),this._onAction.closed||this._onAction.complete(),this._afterDismissed.next({dismissedByAction:this._dismissedByAction}),this._afterDismissed.complete(),this._dismissedByAction=!1}afterDismissed(){return this._afterDismissed}afterOpened(){return this.containerInstance._onEnter}onAction(){return this._onAction}},PK=new MA("MatSnackBarData"),jd=class{politeness="polite";announcementMessage="";viewContainerRef;duration=0;panelClass;direction;data=null;horizontalPosition="center";verticalPosition="bottom"},GoA=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","matSnackBarLabel",""]],hostAttrs:[1,"mat-mdc-snack-bar-label","mdc-snackbar__label"]})}return i})(),KoA=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","matSnackBarActions",""]],hostAttrs:[1,"mat-mdc-snack-bar-actions","mdc-snackbar__actions"]})}return i})(),UoA=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","matSnackBarAction",""]],hostAttrs:[1,"mat-mdc-snack-bar-action","mdc-snackbar__action"]})}return i})(),ToA=(()=>{class i{snackBarRef=w(kQ);data=w(PK);constructor(){}action(){this.snackBarRef.dismissWithAction()}get hasAction(){return!!this.data.action}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["simple-snack-bar"]],hostAttrs:[1,"mat-mdc-simple-snack-bar"],exportAs:["matSnackBar"],decls:3,vars:2,consts:[["matSnackBarLabel",""],["matSnackBarActions",""],["matButton","","matSnackBarAction","",3,"click"]],template:function(t,n){t&1&&(d(0,"div",0),y(1),E(),Y(2,RoA,3,1,"div",1)),t&2&&(u(),Be(" ",n.data.message,` +`),u(),O(n.hasAction?2:-1))},dependencies:[Si,GoA,KoA,UoA],styles:[`.mat-mdc-simple-snack-bar{display:flex}.mat-mdc-simple-snack-bar .mat-mdc-snack-bar-label{max-height:50vh;overflow:auto} +`],encapsulation:2,changeDetection:0})}return i})(),Bb="_mat-snack-bar-enter",Eb="_mat-snack-bar-exit",JoA=(()=>{class i extends TC{_ngZone=w(qe);_elementRef=w(se);_changeDetectorRef=w(wt);_platform=w(Ci);_animationsDisabled=nn();snackBarConfig=w(jd);_document=w(ii);_trackedModals=new Set;_enterFallback;_exitFallback;_injector=w(Dt);_announceDelay=150;_announceTimeoutId;_destroyed=!1;_portalOutlet;_onAnnounce=new te;_onExit=new te;_onEnter=new te;_animationState="void";_live;_label;_role;_liveElementId=w(Bn).getId("mat-snack-bar-container-live-");constructor(){super();let A=this.snackBarConfig;A.politeness==="assertive"&&!A.announcementMessage?this._live="assertive":A.politeness==="off"?this._live="off":this._live="polite",this._platform.FIREFOX&&(this._live==="polite"&&(this._role="status"),this._live==="assertive"&&(this._role="alert"))}attachComponentPortal(A){this._assertNotAttached();let t=this._portalOutlet.attachComponentPortal(A);return this._afterPortalAttached(),t}attachTemplatePortal(A){this._assertNotAttached();let t=this._portalOutlet.attachTemplatePortal(A);return this._afterPortalAttached(),t}attachDomPortal=A=>{this._assertNotAttached();let t=this._portalOutlet.attachDomPortal(A);return this._afterPortalAttached(),t};onAnimationEnd(A){A===Eb?this._completeExit():A===Bb&&(clearTimeout(this._enterFallback),this._ngZone.run(()=>{this._onEnter.next(),this._onEnter.complete()}))}enter(){this._destroyed||(this._animationState="visible",this._changeDetectorRef.markForCheck(),this._changeDetectorRef.detectChanges(),this._screenReaderAnnounce(),this._animationsDisabled?jn(()=>{this._ngZone.run(()=>queueMicrotask(()=>this.onAnimationEnd(Bb)))},{injector:this._injector}):(clearTimeout(this._enterFallback),this._enterFallback=setTimeout(()=>{this._elementRef.nativeElement.classList.add("mat-snack-bar-fallback-visible"),this.onAnimationEnd(Bb)},200)))}exit(){return this._destroyed?ie(void 0):(this._ngZone.run(()=>{this._animationState="hidden",this._changeDetectorRef.markForCheck(),this._elementRef.nativeElement.setAttribute("mat-exit",""),clearTimeout(this._announceTimeoutId),this._animationsDisabled?jn(()=>{this._ngZone.run(()=>queueMicrotask(()=>this.onAnimationEnd(Eb)))},{injector:this._injector}):(clearTimeout(this._exitFallback),this._exitFallback=setTimeout(()=>this.onAnimationEnd(Eb),200))}),this._onExit)}ngOnDestroy(){this._destroyed=!0,this._clearFromModals(),this._completeExit()}_completeExit(){clearTimeout(this._exitFallback),queueMicrotask(()=>{this._onExit.next(),this._onExit.complete()})}_afterPortalAttached(){let A=this._elementRef.nativeElement,t=this.snackBarConfig.panelClass;t&&(Array.isArray(t)?t.forEach(a=>A.classList.add(a)):A.classList.add(t)),this._exposeToModals();let n=this._label.nativeElement,o="mdc-snackbar__label";n.classList.toggle(o,!n.querySelector(`.${o}`))}_exposeToModals(){let A=this._liveElementId,t=this._document.querySelectorAll('body > .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{let t=A.getAttribute("aria-owns");if(t){let n=t.replace(this._liveElementId,"").trim();n.length>0?A.setAttribute("aria-owns",n):A.removeAttribute("aria-owns")}}),this._trackedModals.clear()}_assertNotAttached(){this._portalOutlet.hasAttached()}_screenReaderAnnounce(){this._announceTimeoutId||this._ngZone.runOutsideAngular(()=>{this._announceTimeoutId=setTimeout(()=>{if(this._destroyed)return;let A=this._elementRef.nativeElement,t=A.querySelector("[aria-hidden]"),n=A.querySelector("[aria-live]");if(t&&n){let o=null;this._platform.isBrowser&&document.activeElement instanceof HTMLElement&&t.contains(document.activeElement)&&(o=document.activeElement),t.removeAttribute("aria-hidden"),n.appendChild(t),o?.focus(),this._onAnnounce.next(),this._onAnnounce.complete()}},this._announceDelay)})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-snack-bar-container"]],viewQuery:function(t,n){if(t&1&&Yt(Jl,7)(NoA,7),t&2){let o;oe(o=ae())&&(n._portalOutlet=o.first),oe(o=ae())&&(n._label=o.first)}},hostAttrs:[1,"mdc-snackbar","mat-mdc-snack-bar-container"],hostVars:6,hostBindings:function(t,n){t&1&&T("animationend",function(a){return n.onAnimationEnd(a.animationName)})("animationcancel",function(a){return n.onAnimationEnd(a.animationName)}),t&2&&xA("mat-snack-bar-container-enter",n._animationState==="visible")("mat-snack-bar-container-exit",n._animationState==="hidden")("mat-snack-bar-container-animations-enabled",!n._animationsDisabled)},features:[mt],decls:6,vars:3,consts:[["label",""],[1,"mdc-snackbar__surface","mat-mdc-snackbar-surface"],[1,"mat-mdc-snack-bar-label"],["aria-hidden","true"],["cdkPortalOutlet",""]],template:function(t,n){t&1&&(d(0,"div",1)(1,"div",2,0)(3,"div",3),yt(4,FoA,0,0,"ng-template",4),E(),lA(5,"div"),E()()),t&2&&(u(5),ee("aria-live",n._live)("role",n._role)("id",n._liveElementId))},dependencies:[Jl],styles:[`@keyframes _mat-snack-bar-enter{from{transform:scale(0.8);opacity:0}to{transform:scale(1);opacity:1}}@keyframes _mat-snack-bar-exit{from{opacity:1}to{opacity:0}}.mat-mdc-snack-bar-container{display:flex;align-items:center;justify-content:center;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);margin:8px}.mat-mdc-snack-bar-handset .mat-mdc-snack-bar-container{width:100vw}.mat-snack-bar-container-animations-enabled{opacity:0}.mat-snack-bar-container-animations-enabled.mat-snack-bar-fallback-visible{opacity:1}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-enter{animation:_mat-snack-bar-enter 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-exit{animation:_mat-snack-bar-exit 75ms cubic-bezier(0.4, 0, 1, 1) forwards}.mat-mdc-snackbar-surface{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);display:flex;align-items:center;justify-content:flex-start;box-sizing:border-box;padding-left:0;padding-right:8px}[dir=rtl] .mat-mdc-snackbar-surface{padding-right:0;padding-left:8px}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{min-width:344px;max-width:672px}.mat-mdc-snack-bar-handset .mat-mdc-snackbar-surface{width:100%;min-width:0}@media(forced-colors: active){.mat-mdc-snackbar-surface{outline:solid 1px}}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{color:var(--mat-snack-bar-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mat-snack-bar-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-snack-bar-container-color, var(--mat-sys-inverse-surface))}.mdc-snackbar__label{width:100%;flex-grow:1;box-sizing:border-box;margin:0;padding:14px 8px 14px 16px}[dir=rtl] .mdc-snackbar__label{padding-left:8px;padding-right:16px}.mat-mdc-snack-bar-container .mdc-snackbar__label{font-family:var(--mat-snack-bar-supporting-text-font, var(--mat-sys-body-medium-font));font-size:var(--mat-snack-bar-supporting-text-size, var(--mat-sys-body-medium-size));font-weight:var(--mat-snack-bar-supporting-text-weight, var(--mat-sys-body-medium-weight));line-height:var(--mat-snack-bar-supporting-text-line-height, var(--mat-sys-body-medium-line-height))}.mat-mdc-snack-bar-actions{display:flex;flex-shrink:0;align-items:center;box-sizing:border-box}.mat-mdc-snack-bar-handset,.mat-mdc-snack-bar-container,.mat-mdc-snack-bar-label{flex:1 1 auto}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled).mat-unthemed{color:var(--mat-snack-bar-button-color, var(--mat-sys-inverse-primary))}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled){--mat-button-text-state-layer-color: currentColor;--mat-button-text-ripple-color: currentColor}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled) .mat-ripple-element{opacity:.1} +`],encapsulation:2})}return i})(),YoA=new MA("mat-snack-bar-default-options",{providedIn:"root",factory:()=>new jd}),jK=(()=>{class i{_live=w(Th);_injector=w(Dt);_breakpointObserver=w(Kh);_parentSnackBar=w(i,{optional:!0,skipSelf:!0});_defaultConfig=w(YoA);_animationsDisabled=nn();_snackBarRefAtThisLevel=null;simpleSnackBarComponent=ToA;snackBarContainerComponent=JoA;handsetCssClass="mat-mdc-snack-bar-handset";get _openedSnackBarRef(){let A=this._parentSnackBar;return A?A._openedSnackBarRef:this._snackBarRefAtThisLevel}set _openedSnackBarRef(A){this._parentSnackBar?this._parentSnackBar._openedSnackBarRef=A:this._snackBarRefAtThisLevel=A}constructor(){}openFromComponent(A,t){return this._attach(A,t)}openFromTemplate(A,t){return this._attach(A,t)}open(A,t="",n){let o=oA(oA({},this._defaultConfig),n);return o.data={message:A,action:t},o.announcementMessage===A&&(o.announcementMessage=void 0),this.openFromComponent(this.simpleSnackBarComponent,o)}dismiss(){this._openedSnackBarRef&&this._openedSnackBarRef.dismiss()}ngOnDestroy(){this._snackBarRefAtThisLevel&&this._snackBarRefAtThisLevel.dismiss()}_attachSnackBarContainer(A,t){let n=t&&t.viewContainerRef&&t.viewContainerRef.injector,o=Dt.create({parent:n||this._injector,providers:[{provide:jd,useValue:t}]}),a=new ms(this.snackBarContainerComponent,t.viewContainerRef,o),r=A.attach(a);return r.instance.snackBarConfig=t,r.instance}_attach(A,t){let n=oA(oA(oA({},new jd),this._defaultConfig),t),o=this._createOverlay(n),a=this._attachSnackBarContainer(o,n),r=new kQ(a,o);if(A instanceof lo){let s=new Gr(A,null,{$implicit:n.data,snackBarRef:r});r.instance=a.attachTemplatePortal(s)}else{let s=this._createInjector(n,r),l=new ms(A,void 0,s),g=a.attachComponentPortal(l);r.instance=g.instance}return this._breakpointObserver.observe(lF.HandsetPortrait).pipe(ut(o.detachments())).subscribe(s=>{o.overlayElement.classList.toggle(this.handsetCssClass,s.matches)}),n.announcementMessage&&a._onAnnounce.subscribe(()=>{this._live.announce(n.announcementMessage,n.politeness)}),this._animateSnackBar(r,n),this._openedSnackBarRef=r,this._openedSnackBarRef}_animateSnackBar(A,t){A.afterDismissed().subscribe(()=>{this._openedSnackBarRef==A&&(this._openedSnackBarRef=null),t.announcementMessage&&this._live.clear()}),t.duration&&t.duration>0&&A.afterOpened().subscribe(()=>A._dismissAfter(t.duration)),this._openedSnackBarRef?(this._openedSnackBarRef.afterDismissed().subscribe(()=>{A.containerInstance.enter()}),this._openedSnackBarRef.dismiss()):A.containerInstance.enter()}_createOverlay(A){let t=new kg;t.direction=A.direction;let n=JC(this._injector),o=A.direction==="rtl",a=A.horizontalPosition==="left"||A.horizontalPosition==="start"&&!o||A.horizontalPosition==="end"&&o,r=!a&&A.horizontalPosition!=="center";return a?n.left("0"):r?n.right("0"):n.centerHorizontally(),A.verticalPosition==="top"?n.top("0"):n.bottom("0"),t.positionStrategy=n,t.disableAnimations=this._animationsDisabled,xg(this._injector,t)}_createInjector(A,t){let n=A&&A.viewContainerRef&&A.viewContainerRef.injector;return Dt.create({parent:n||this._injector,providers:[{provide:kQ,useValue:t},{provide:PK,useValue:A.data}]})}static \u0275fac=function(t){return new(t||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var Uc=class i{snackBar=w(jK);MAX_LENGTH=200;open(e,A,t){let n=this.truncate(e,this.MAX_LENGTH);return this.snackBar.open(n,A,t)}truncate(e,A){return e?e.length>A?e.substring(0,A)+"...":e:""}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var OoA=["*",[["mat-toolbar-row"]]],HoA=["*","mat-toolbar-row"],zoA=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["mat-toolbar-row"]],hostAttrs:[1,"mat-toolbar-row"],exportAs:["matToolbarRow"]})}return i})(),qK=(()=>{class i{_elementRef=w(se);_platform=w(Ci);_document=w(ii);color;_toolbarRows;constructor(){}ngAfterViewInit(){this._platform.isBrowser&&(this._checkToolbarMixedModes(),this._toolbarRows.changes.subscribe(()=>this._checkToolbarMixedModes()))}_checkToolbarMixedModes(){this._toolbarRows.length}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-toolbar"]],contentQueries:function(t,n,o){if(t&1&&Vo(o,zoA,5),t&2){let a;oe(a=ae())&&(n._toolbarRows=a)}},hostAttrs:[1,"mat-toolbar"],hostVars:6,hostBindings:function(t,n){t&2&&(go(n.color?"mat-"+n.color:""),xA("mat-toolbar-multiple-rows",n._toolbarRows.length>0)("mat-toolbar-single-row",n._toolbarRows.length===0))},inputs:{color:"color"},exportAs:["matToolbar"],ngContentSelectors:HoA,decls:2,vars:0,template:function(t,n){t&1&&(Nt(OoA),Ve(0),Ve(1,1))},styles:[`.mat-toolbar{background:var(--mat-toolbar-container-background-color, var(--mat-sys-surface));color:var(--mat-toolbar-container-text-color, var(--mat-sys-on-surface))}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font-family:var(--mat-toolbar-title-text-font, var(--mat-sys-title-large-font));font-size:var(--mat-toolbar-title-text-size, var(--mat-sys-title-large-size));line-height:var(--mat-toolbar-title-text-line-height, var(--mat-sys-title-large-line-height));font-weight:var(--mat-toolbar-title-text-weight, var(--mat-sys-title-large-weight));letter-spacing:var(--mat-toolbar-title-text-tracking, var(--mat-sys-title-large-tracking));margin:0}@media(forced-colors: active){.mat-toolbar{outline:solid 1px}}.mat-toolbar .mat-form-field-underline,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-focused .mat-form-field-ripple{background-color:currentColor}.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-select-value,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow{color:inherit}.mat-toolbar .mat-input-element{caret-color:currentColor}.mat-toolbar .mat-mdc-button-base.mat-mdc-button-base.mat-unthemed{--mat-button-text-label-text-color: var(--mat-toolbar-container-text-color, var(--mat-sys-on-surface));--mat-button-outlined-label-text-color: var(--mat-toolbar-container-text-color, var(--mat-sys-on-surface))}.mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap;height:var(--mat-toolbar-standard-height, 64px)}@media(max-width: 599px){.mat-toolbar-row,.mat-toolbar-single-row{height:var(--mat-toolbar-mobile-height, 56px)}}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%;min-height:var(--mat-toolbar-standard-height, 64px)}@media(max-width: 599px){.mat-toolbar-multiple-rows{min-height:var(--mat-toolbar-mobile-height, 56px)}} +`],encapsulation:2,changeDetection:0})}return i})();var fr=class i{static getBaseUrlWithoutPath(){let e=window.location.href;return new URL(e).origin+"/dev-ui/"}static getApiServerBaseUrl(){return window.runtimeConfig?.backendUrl||""}static getWSServerUrl(){let e=i.getApiServerBaseUrl();return!e||e==""?window.location.host:e.startsWith("http://")?e.slice(7):e.startsWith("https://")?e.slice(8):e}};var _Q=class{role;text;thought;isLoading;isEditing;evalStatus;failedMetric;attachments;renderedContent;a2uiData;executableCode;codeExecutionResult;event;inlineData;functionCalls;functionResponses;actualInvocationToolUses;expectedInvocationToolUses;actualFinalResponse;expectedFinalResponse;evalScore;evalThreshold;invocationIndex;finalResponsePartIndex;toolUseIndex;error;constructor(e){if(Object.assign(this,e),this.event?.actions)for(let[A,t]of Object.entries(this.event.actions))t!==null&&typeof t=="object"&&Object.keys(t).length===0&&delete this.event.actions[A]}get stateDelta(){return this.event?.actions?.stateDelta}get artifactDelta(){return this.event?.actions?.artifactDelta}get route(){return this.event?.actions?.route}get transferToAgent(){return this.event?.actions?.transferToAgent}get nodePath(){return this.event?.nodeInfo?.path||null}get bareNodePath(){let e=this.nodePath;return e?e.split("/").map(A=>A.split("@")[0]).join("/"):null}get author(){return this.event?.author??"root_agent"}};var Ys=new MA("AgentService");var Tc=new MA("AgentBuilderService");var qd=new MA("ArtifactService");var Vd=new MA("DownloadService");var Jc=new MA("EvalService");var Lf=new MA("EventService");var VK="edit_function_args";var WK="a2a_card",ZK="tests",XK="eval_v2",mr=new MA("FeatureFlagService");var Wd=new MA("GraphService");var Gf=new MA("LocalFileService");var as=new MA("SafeValuesService"),Kf=class{openBase64InNewTab(e,A){try{if(!e)return;let t=e;if(e.startsWith("data:")&&e.includes(";base64,")&&(t=t.substring(t.indexOf(";base64,")+8)),!A||!t)return;let n=atob(t),o=new Array(n.length);for(let l=0;l{fetch(t,{method:"POST"}).then(o=>{if(!o.body){n.error("No response body");return}let a=o.body.getReader(),r=new TextDecoder("utf-8"),s=()=>{a.read().then(({done:l,value:g})=>{if(l){this.zone.run(()=>n.complete());return}let C=r.decode(g,{stream:!0});this.zone.run(()=>n.next(C)),s()}).catch(l=>{this.zone.run(()=>n.error(l))})};s()}).catch(o=>{this.zone.run(()=>n.error(o))})})}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var Yf=class i{constructor(e,A){this.el=e;this.renderer=A}sideDrawerMinWidth=360;sideDrawerMaxWidth=window.innerWidth/2;resizeHandle=null;resizingEvent={isResizing:!1,startingCursorX:0,startingWidth:0};ngAfterViewInit(){this.sideDrawerMaxWidth=window.innerWidth/2,this.resizeHandle=document.getElementsByClassName("resize-handler")[0],this.resizeHandle&&this.renderer.listen(this.resizeHandle,"mousedown",e=>this.onResizeHandleMouseDown(e)),document.documentElement.style.setProperty("--side-drawer-width","480px"),this.renderer.setStyle(this.el.nativeElement,"width","var(--side-drawer-width)")}onResizeHandleMouseDown(e){this.resizingEvent={isResizing:!0,startingCursorX:e.clientX,startingWidth:this.sideDrawerWidth},e.preventDefault()}onMouseMove(e){if(!this.resizingEvent.isResizing)return;let A=e.clientX-this.resizingEvent.startingCursorX,t=this.resizingEvent.startingWidth+A;this.sideDrawerWidth=t,this.renderer.addClass(document.body,"resizing")}onMouseUp(){this.resizingEvent.isResizing=!1,this.renderer.removeClass(document.body,"resizing")}onResize(){this.sideDrawerMaxWidth=window.innerWidth/2,this.sideDrawerWidth=this.sideDrawerWidth}set sideDrawerWidth(e){let A=Math.min(Math.max(e,this.sideDrawerMinWidth),this.sideDrawerMaxWidth);document.documentElement.style.setProperty("--side-drawer-width",`${A}px`)}get sideDrawerWidth(){let e=getComputedStyle(document.documentElement).getPropertyValue("--side-drawer-width"),A=parseFloat(e);return isNaN(A)?480:A}static \u0275fac=function(A){return new(A||i)(ot(se),ot(qi))};static \u0275dir=qA({type:i,selectors:[["","appResizableDrawer",""]],hostBindings:function(A,t){A&1&&T("mousemove",function(o){return t.onMouseMove(o)},Ad)("mouseup",function(){return t.onMouseUp()},Ad)("resize",function(){return t.onResize()},mc)}})};var Of=Symbol.for("yaml.alias"),Hf=Symbol.for("yaml.document"),Rg=Symbol.for("yaml.map"),hb=Symbol.for("yaml.pair"),Ql=Symbol.for("yaml.scalar"),F0=Symbol.for("yaml.seq"),ys=Symbol.for("yaml.node.type"),Vl=i=>!!i&&typeof i=="object"&&i[ys]===Of,Ng=i=>!!i&&typeof i=="object"&&i[ys]===Hf,Fg=i=>!!i&&typeof i=="object"&&i[ys]===Rg,bn=i=>!!i&&typeof i=="object"&&i[ys]===hb,Xi=i=>!!i&&typeof i=="object"&&i[ys]===Ql,Lg=i=>!!i&&typeof i=="object"&&i[ys]===F0;function Co(i){if(i&&typeof i=="object")switch(i[ys]){case Rg:case F0:return!0}return!1}function Nn(i){if(i&&typeof i=="object")switch(i[ys]){case Of:case Rg:case Ql:case F0:return!0}return!1}var zf=i=>(Xi(i)||Co(i))&&!!i.anchor;var Hs=Symbol("break visit"),$K=Symbol("skip children"),Yc=Symbol("remove node");function Oc(i,e){let A=AU(e);Ng(i)?eB(null,i.contents,A,Object.freeze([i]))===Yc&&(i.contents=null):eB(null,i,A,Object.freeze([]))}Oc.BREAK=Hs;Oc.SKIP=$K;Oc.REMOVE=Yc;function eB(i,e,A,t){let n=eU(i,e,A,t);if(Nn(n)||bn(n))return tU(i,t,n),eB(i,n,A,t);if(typeof n!="symbol"){if(Co(e)){t=Object.freeze(t.concat(e));for(let o=0;oi.replace(/[!,[\]{}]/g,e=>PoA[e]),iB=(()=>{class i{constructor(A,t){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},i.defaultYaml,A),this.tags=Object.assign({},i.defaultTags,t)}clone(){let A=new i(this.yaml,this.tags);return A.docStart=this.docStart,A}atDocument(){let A=new i(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:i.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},i.defaultTags);break}return A}add(A,t){this.atNextDocument&&(this.yaml={explicit:i.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},i.defaultTags),this.atNextDocument=!1);let n=A.trim().split(/[ \t]+/),o=n.shift();switch(o){case"%TAG":{if(n.length!==2&&(t(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;let[a,r]=n;return this.tags[a]=r,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return t(0,"%YAML directive should contain exactly one part"),!1;let[a]=n;if(a==="1.1"||a==="1.2")return this.yaml.version=a,!0;{let r=/^\d+\.\d+$/.test(a);return t(6,`Unsupported YAML version ${a}`,r),!1}}default:return t(0,`Unknown directive ${o}`,!0),!1}}tagName(A,t){if(A==="!")return"!";if(A[0]!=="!")return t(`Not a valid tag: ${A}`),null;if(A[1]==="<"){let r=A.slice(2,-1);return r==="!"||r==="!!"?(t(`Verbatim tags aren't resolved, so ${A} is invalid.`),null):(A[A.length-1]!==">"&&t("Verbatim tags must end with a >"),r)}let[,n,o]=A.match(/^(.*!)([^!]*)$/s);o||t(`The ${A} tag has no suffix`);let a=this.tags[n];if(a)try{return a+decodeURIComponent(o)}catch(r){return t(String(r)),null}return n==="!"?A:(t(`Could not resolve tag: ${A}`),null)}tagString(A){for(let[t,n]of Object.entries(this.tags))if(A.startsWith(n))return t+joA(A.substring(n.length));return A[0]==="!"?A:`!<${A}>`}toString(A){let t=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],n=Object.entries(this.tags),o;if(A&&n.length>0&&Nn(A.contents)){let a={};Oc(A.contents,(r,s)=>{Nn(s)&&s.tag&&(a[s.tag]=!0)}),o=Object.keys(a)}else o=[];for(let[a,r]of n)a==="!!"&&r==="tag:yaml.org,2002:"||(!A||o.some(s=>s.startsWith(r)))&&t.push(`%TAG ${a} ${r}`);return t.join(` +`)}}return i.defaultYaml={explicit:!1,version:"1.2"},i.defaultTags={"!!":"tag:yaml.org,2002:"},i})();function jf(i){if(/[\x00-\x19\s,[\]{}]/.test(i)){let A=`Anchor must not contain whitespace or control characters: ${JSON.stringify(i)}`;throw new Error(A)}return!0}function Qb(i){let e=new Set;return Oc(i,{Value(A,t){t.anchor&&e.add(t.anchor)}}),e}function ub(i,e){for(let A=1;;++A){let t=`${i}${A}`;if(!e.has(t))return t}}function iU(i,e){let A=[],t=new Map,n=null;return{onAnchor:o=>{A.push(o),n??(n=Qb(i));let a=ub(e,n);return n.add(a),a},setAnchors:()=>{for(let o of A){let a=t.get(o);if(typeof a=="object"&&a.anchor&&(Xi(a.node)||Co(a.node)))a.node.anchor=a.anchor;else{let r=new Error("Failed to resolve repeated object (this should not happen)");throw r.source=o,r}}},sourceObjects:t}}function qC(i,e,A,t){if(t&&typeof t=="object")if(Array.isArray(t))for(let n=0,o=t.length;nlr(t,String(n),A));if(i&&typeof i.toJSON=="function"){if(!A||!zf(i))return i.toJSON(e,A);let t={aliasCount:0,count:1,res:void 0};A.anchors.set(i,t),A.onCreate=o=>{t.res=o,delete A.onCreate};let n=i.toJSON(e,A);return A.onCreate&&A.onCreate(n),n}return typeof i=="bigint"&&!A?.keep?Number(i):i}var VC=class{constructor(e){Object.defineProperty(this,ys,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:A,maxAliasCount:t,onAnchor:n,reviver:o}={}){if(!Ng(e))throw new TypeError("A document argument is required");let a={anchors:new Map,doc:e,keep:!0,mapAsMap:A===!0,mapKeyWarned:!1,maxAliasCount:typeof t=="number"?t:100},r=lr(this,"",a);if(typeof n=="function")for(let{count:s,res:l}of a.anchors.values())n(l,s);return typeof o=="function"?qC(o,{"":r},"",r):r}};var L0=class extends VC{constructor(e){super(Of),this.source=e,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(e,A){let t;A?.aliasResolveCache?t=A.aliasResolveCache:(t=[],Oc(e,{Node:(o,a)=>{(Vl(a)||zf(a))&&t.push(a)}}),A&&(A.aliasResolveCache=t));let n;for(let o of t){if(o===this)break;o.anchor===this.source&&(n=o)}return n}toJSON(e,A){if(!A)return{source:this.source};let{anchors:t,doc:n,maxAliasCount:o}=A,a=this.resolve(n,A);if(!a){let s=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(s)}let r=t.get(a);if(r||(lr(a,null,A),r=t.get(a)),r?.res===void 0){let s="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(s)}if(o>=0&&(r.count+=1,r.aliasCount===0&&(r.aliasCount=qf(n,a,t)),r.count*r.aliasCount>o)){let s="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(s)}return r.res}toString(e,A,t){let n=`*${this.source}`;if(e){if(jf(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let o=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(o)}if(e.implicitKey)return`${n} `}return n}};function qf(i,e,A){if(Vl(e)){let t=e.resolve(i),n=A&&t&&A.get(t);return n?n.count*n.aliasCount:0}else if(Co(e)){let t=0;for(let n of e.items){let o=qf(i,n,A);o>t&&(t=o)}return t}else if(bn(e)){let t=qf(i,e.key,A),n=qf(i,e.value,A);return Math.max(t,n)}return 1}var Vf=i=>!i||typeof i!="function"&&typeof i!="object",jt=(()=>{class i extends VC{constructor(A){super(Ql),this.value=A}toJSON(A,t){return t?.keep?this.value:lr(this.value,A,t)}toString(){return String(this.value)}}return i.BLOCK_FOLDED="BLOCK_FOLDED",i.BLOCK_LITERAL="BLOCK_LITERAL",i.PLAIN="PLAIN",i.QUOTE_DOUBLE="QUOTE_DOUBLE",i.QUOTE_SINGLE="QUOTE_SINGLE",i})();var qoA="tag:yaml.org,2002:";function VoA(i,e,A){if(e){let t=A.filter(o=>o.tag===e),n=t.find(o=>!o.format)??t[0];if(!n)throw new Error(`Tag ${e} not found`);return n}return A.find(t=>t.identify?.(i)&&!t.format)}function G0(i,e,A){if(Ng(i)&&(i=i.contents),Nn(i))return i;if(bn(i)){let C=A.schema[Rg].createNode?.(A.schema,null,A);return C.items.push(i),C}(i instanceof String||i instanceof Number||i instanceof Boolean||typeof BigInt<"u"&&i instanceof BigInt)&&(i=i.valueOf());let{aliasDuplicateObjects:t,onAnchor:n,onTagObj:o,schema:a,sourceObjects:r}=A,s;if(t&&i&&typeof i=="object"){if(s=r.get(i),s)return s.anchor??(s.anchor=n(i)),new L0(s.anchor);s={anchor:null,node:null},r.set(i,s)}e?.startsWith("!!")&&(e=qoA+e.slice(2));let l=VoA(i,e,a.tags);if(!l){if(i&&typeof i.toJSON=="function"&&(i=i.toJSON()),!i||typeof i!="object"){let C=new jt(i);return s&&(s.node=C),C}l=i instanceof Map?a[Rg]:Symbol.iterator in Object(i)?a[F0]:a[Rg]}o&&(o(l),delete A.onTagObj);let g=l?.createNode?l.createNode(A.schema,i,A):typeof l?.nodeClass?.from=="function"?l.nodeClass.from(A.schema,i,A):new jt(i);return e?g.tag=e:l.default||(g.tag=l.tag),s&&(s.node=g),g}function xQ(i,e,A){let t=A;for(let n=e.length-1;n>=0;--n){let o=e[n];if(typeof o=="number"&&Number.isInteger(o)&&o>=0){let a=[];a[o]=t,t=a}else t=new Map([[o,t]])}return G0(t,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:i,sourceObjects:new Map})}var oB=i=>i==null||typeof i=="object"&&!!i[Symbol.iterator]().next().done,nB=class extends VC{constructor(e,A){super(e),Object.defineProperty(this,"schema",{value:A,configurable:!0,enumerable:!1,writable:!0})}clone(e){let A=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(A.schema=e),A.items=A.items.map(t=>Nn(t)||bn(t)?t.clone(e):t),this.range&&(A.range=this.range.slice()),A}addIn(e,A){if(oB(e))this.add(A);else{let[t,...n]=e,o=this.get(t,!0);if(Co(o))o.addIn(n,A);else if(o===void 0&&this.schema)this.set(t,xQ(this.schema,n,A));else throw new Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}}deleteIn(e){let[A,...t]=e;if(t.length===0)return this.delete(A);let n=this.get(A,!0);if(Co(n))return n.deleteIn(t);throw new Error(`Expected YAML collection at ${A}. Remaining path: ${t}`)}getIn(e,A){let[t,...n]=e,o=this.get(t,!0);return n.length===0?!A&&Xi(o)?o.value:o:Co(o)?o.getIn(n,A):void 0}hasAllNullValues(e){return this.items.every(A=>{if(!bn(A))return!1;let t=A.value;return t==null||e&&Xi(t)&&t.value==null&&!t.commentBefore&&!t.comment&&!t.tag})}hasIn(e){let[A,...t]=e;if(t.length===0)return this.has(A);let n=this.get(A,!0);return Co(n)?n.hasIn(t):!1}setIn(e,A){let[t,...n]=e;if(n.length===0)this.set(t,A);else{let o=this.get(t,!0);if(Co(o))o.setIn(n,A);else if(o===void 0&&this.schema)this.set(t,xQ(this.schema,n,A));else throw new Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}}};var nU=i=>i.replace(/^(?!$)(?: $)?/gm,"#");function Wl(i,e){return/^\n+$/.test(i)?i.substring(1):e?i.replace(/^(?! *$)/gm,e):i}var Hc=(i,e,A)=>i.endsWith(` +`)?Wl(A,e):A.includes(` +`)?` +`+Wl(A,e):(i.endsWith(" ")?"":" ")+A;var pb="flow",Wf="block",RQ="quoted";function NQ(i,e,A="flow",{indentAtStart:t,lineWidth:n=80,minContentWidth:o=20,onFold:a,onOverflow:r}={}){if(!n||n<0)return i;nn-Math.max(2,o)?l.push(0):C=n-t);let I,B,Q=!1,h=-1,f=-1,m=-1;A===Wf&&(h=oU(i,h,e.length),h!==-1&&(C=h+s));for(let S;S=i[h+=1];){if(A===RQ&&S==="\\"){switch(f=h,i[h+1]){case"x":h+=3;break;case"u":h+=5;break;case"U":h+=9;break;default:h+=1}m=h}if(S===` +`)A===Wf&&(h=oU(i,h,e.length)),C=h+e.length+s,I=void 0;else{if(S===" "&&B&&B!==" "&&B!==` +`&&B!==" "){let k=i[h+1];k&&k!==" "&&k!==` +`&&k!==" "&&(I=h)}if(h>=C)if(I)l.push(I),C=I+s,I=void 0;else if(A===RQ){for(;B===" "||B===" ";)B=S,S=i[h+=1],Q=!0;let k=h>m+1?h-2:f-1;if(g[k])return i;l.push(k),g[k]=!0,C=k+s,I=void 0}else Q=!0}B=S}if(Q&&r&&r(),l.length===0)return i;a&&a();let v=i.slice(0,l[0]);for(let S=0;S({indentAtStart:e?i.indent.length:i.indentAtStart,lineWidth:i.options.lineWidth,minContentWidth:i.options.minContentWidth}),$f=i=>/^(%|---|\.\.\.)/m.test(i);function WoA(i,e,A){if(!e||e<0)return!1;let t=e-A,n=i.length;if(n<=t)return!1;for(let o=0,a=0;ot)return!0;if(a=o+1,n-a<=t)return!1}return!0}function FQ(i,e){let A=JSON.stringify(i);if(e.options.doubleQuotedAsJSON)return A;let{implicitKey:t}=e,n=e.options.doubleQuotedMinMultiLineLength,o=e.indent||($f(i)?" ":""),a="",r=0;for(let s=0,l=A[s];l;l=A[++s])if(l===" "&&A[s+1]==="\\"&&A[s+2]==="n"&&(a+=A.slice(r,s)+"\\ ",s+=1,r=s,l="\\"),l==="\\")switch(A[s+1]){case"u":{a+=A.slice(r,s);let g=A.substr(s+2,4);switch(g){case"0000":a+="\\0";break;case"0007":a+="\\a";break;case"000b":a+="\\v";break;case"001b":a+="\\e";break;case"0085":a+="\\N";break;case"00a0":a+="\\_";break;case"2028":a+="\\L";break;case"2029":a+="\\P";break;default:g.substr(0,2)==="00"?a+="\\x"+g.substr(2):a+=A.substr(s,6)}s+=5,r=s+1}break;case"n":if(t||A[s+2]==='"'||A.length +`;let C,I;for(I=A.length;I>0;--I){let M=A[I-1];if(M!==` +`&&M!==" "&&M!==" ")break}let B=A.substring(I),Q=B.indexOf(` +`);Q===-1?C="-":A===B||Q!==B.length-1?(C="+",o&&o()):C="",B&&(A=A.slice(0,-B.length),B[B.length-1]===` +`&&(B=B.slice(0,-1)),B=B.replace(mb,`$&${l}`));let h=!1,f,m=-1;for(f=0;f{x=!0});let z=NQ(`${v}${M}${B}`,l,Wf,F);if(!x)return`>${k} +${l}${z}`}return A=A.replace(/\n+/g,`$&${l}`),`|${k} +${l}${v}${A}${B}`}function ZoA(i,e,A,t){let{type:n,value:o}=i,{actualString:a,implicitKey:r,indent:s,indentStep:l,inFlow:g}=e;if(r&&o.includes(` +`)||g&&/[[\]{},]/.test(o))return aB(o,e);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(o))return r||g||!o.includes(` +`)?aB(o,e):Zf(i,e,A,t);if(!r&&!g&&n!==jt.PLAIN&&o.includes(` +`))return Zf(i,e,A,t);if($f(o)){if(s==="")return e.forceBlockIndent=!0,Zf(i,e,A,t);if(r&&s===l)return aB(o,e)}let C=o.replace(/\n+/g,`$& +${s}`);if(a){let I=h=>h.default&&h.tag!=="tag:yaml.org,2002:str"&&h.test?.test(C),{compat:B,tags:Q}=e.doc.schema;if(Q.some(I)||B?.some(I))return aB(o,e)}return r?C:NQ(C,s,pb,Xf(e,!1))}function O1(i,e,A,t){let{implicitKey:n,inFlow:o}=e,a=typeof i.value=="string"?i:Object.assign({},i,{value:String(i.value)}),{type:r}=i;r!==jt.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(a.value)&&(r=jt.QUOTE_DOUBLE);let s=g=>{switch(g){case jt.BLOCK_FOLDED:case jt.BLOCK_LITERAL:return n||o?aB(a.value,e):Zf(a,e,A,t);case jt.QUOTE_DOUBLE:return FQ(a.value,e);case jt.QUOTE_SINGLE:return fb(a.value,e);case jt.PLAIN:return ZoA(a,e,A,t);default:return null}},l=s(r);if(l===null){let{defaultKeyType:g,defaultStringType:C}=e.options,I=n&&g||C;if(l=s(I),l===null)throw new Error(`Unsupported default string type ${I}`)}return l}function Am(i,e){let A=Object.assign({blockQuote:!0,commentString:nU,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trueStr:"true",verifyAliasOrder:!0},i.schema.toStringOptions,e),t;switch(A.collectionStyle){case"block":t=!1;break;case"flow":t=!0;break;default:t=null}return{anchors:new Set,doc:i,flowCollectionPadding:A.flowCollectionPadding?" ":"",indent:"",indentStep:typeof A.indent=="number"?" ".repeat(A.indent):" ",inFlow:t,options:A}}function XoA(i,e){if(e.tag){let n=i.filter(o=>o.tag===e.tag);if(n.length>0)return n.find(o=>o.format===e.format)??n[0]}let A,t;if(Xi(e)){t=e.value;let n=i.filter(o=>o.identify?.(t));if(n.length>1){let o=n.filter(a=>a.test);o.length>0&&(n=o)}A=n.find(o=>o.format===e.format)??n.find(o=>!o.format)}else t=e,A=i.find(n=>n.nodeClass&&t instanceof n.nodeClass);if(!A){let n=t?.constructor?.name??(t===null?"null":typeof t);throw new Error(`Tag not resolved for ${n} value`)}return A}function $oA(i,e,{anchors:A,doc:t}){if(!t.directives)return"";let n=[],o=(Xi(i)||Co(i))&&i.anchor;o&&jf(o)&&(A.add(o),n.push(`&${o}`));let a=i.tag??(e.default?null:e.tag);return a&&n.push(t.directives.tagString(a)),n.join(" ")}function K0(i,e,A,t){if(bn(i))return i.toString(e,A,t);if(Vl(i)){if(e.doc.directives)return i.toString(e);if(e.resolvedAliases?.has(i))throw new TypeError("Cannot stringify circular structure without alias nodes");e.resolvedAliases?e.resolvedAliases.add(i):e.resolvedAliases=new Set([i]),i=i.resolve(e.doc)}let n,o=Nn(i)?i:e.doc.createNode(i,{onTagObj:s=>n=s});n??(n=XoA(e.doc.schema.tags,o));let a=$oA(o,n,e);a.length>0&&(e.indentAtStart=(e.indentAtStart??0)+a.length+1);let r=typeof n.stringify=="function"?n.stringify(o,e,A,t):Xi(o)?O1(o,e,A,t):o.toString(e,A,t);return a?Xi(o)||r[0]==="{"||r[0]==="["?`${a} ${r}`:`${a} +${e.indent}${r}`:r}function aU({key:i,value:e},A,t,n){let{allNullValues:o,doc:a,indent:r,indentStep:s,options:{commentString:l,indentSeq:g,simpleKeys:C}}=A,I=Nn(i)&&i.comment||null;if(C){if(I)throw new Error("With simple keys, key nodes cannot have comments");if(Co(i)||!Nn(i)&&typeof i=="object"){let F="With simple keys, collection cannot be used as a key value";throw new Error(F)}}let B=!C&&(!i||I&&e==null&&!A.inFlow||Co(i)||(Xi(i)?i.type===jt.BLOCK_FOLDED||i.type===jt.BLOCK_LITERAL:typeof i=="object"));A=Object.assign({},A,{allNullValues:!1,implicitKey:!B&&(C||!o),indent:r+s});let Q=!1,h=!1,f=K0(i,A,()=>Q=!0,()=>h=!0);if(!B&&!A.inFlow&&f.length>1024){if(C)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");B=!0}if(A.inFlow){if(o||e==null)return Q&&t&&t(),f===""?"?":B?`? ${f}`:f}else if(o&&!C||e==null&&B)return f=`? ${f}`,I&&!Q?f+=Hc(f,A.indent,l(I)):h&&n&&n(),f;Q&&(I=null),B?(I&&(f+=Hc(f,A.indent,l(I))),f=`? ${f} +${r}:`):(f=`${f}:`,I&&(f+=Hc(f,A.indent,l(I))));let m,v,S;Nn(e)?(m=!!e.spaceBefore,v=e.commentBefore,S=e.comment):(m=!1,v=null,S=null,e&&typeof e=="object"&&(e=a.createNode(e))),A.implicitKey=!1,!B&&!I&&Xi(e)&&(A.indentAtStart=f.length+1),h=!1,!g&&s.length>=2&&!A.inFlow&&!B&&Lg(e)&&!e.flow&&!e.tag&&!e.anchor&&(A.indent=A.indent.substring(2));let k=!1,M=K0(e,A,()=>k=!0,()=>h=!0),x=" ";if(I||m||v){if(x=m?` +`:"",v){let F=l(v);x+=` +${Wl(F,A.indent)}`}M===""&&!A.inFlow?x===` +`&&S&&(x=` + +`):x+=` +${A.indent}`}else if(!B&&Co(e)){let F=M[0],z=M.indexOf(` +`),P=z!==-1,Z=A.inFlow??e.flow??e.items.length===0;if(P||!Z){let AA=!1;if(P&&(F==="&"||F==="!")){let W=M.indexOf(" ");F==="&"&&W!==-1&&Wi===tm||typeof i=="symbol"&&i.description===tm,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new jt(Symbol(tm)),{addToJSMap:Db}),stringify:()=>tm},rU=(i,e)=>(Gg.identify(e)||Xi(e)&&(!e.type||e.type===jt.PLAIN)&&Gg.identify(e.value))&&i?.doc.schema.tags.some(A=>A.tag===Gg.tag&&A.default);function Db(i,e,A){if(A=i&&Vl(A)?A.resolve(i.doc):A,Lg(A))for(let t of A.items)wb(i,e,t);else if(Array.isArray(A))for(let t of A)wb(i,e,t);else wb(i,e,A)}function wb(i,e,A){let t=i&&Vl(A)?A.resolve(i.doc):A;if(!Fg(t))throw new Error("Merge sources must be maps or map aliases");let n=t.toJSON(null,i,Map);for(let[o,a]of n)e instanceof Map?e.has(o)||e.set(o,a):e instanceof Set?e.add(o):Object.prototype.hasOwnProperty.call(e,o)||Object.defineProperty(e,o,{value:a,writable:!0,enumerable:!0,configurable:!0});return e}function im(i,e,{key:A,value:t}){if(Nn(A)&&A.addToJSMap)A.addToJSMap(i,e,t);else if(rU(i,A))Db(i,e,t);else{let n=lr(A,"",i);if(e instanceof Map)e.set(n,lr(t,n,i));else if(e instanceof Set)e.add(n);else{let o=AaA(A,n,i),a=lr(t,o,i);o in e?Object.defineProperty(e,o,{value:a,writable:!0,enumerable:!0,configurable:!0}):e[o]=a}}return e}function AaA(i,e,A){if(e===null)return"";if(typeof e!="object")return String(e);if(Nn(i)&&A?.doc){let t=Am(A.doc,{});t.anchors=new Set;for(let o of A.anchors.keys())t.anchors.add(o.anchor);t.inFlow=!0,t.inStringifyKey=!0;let n=i.toString(t);if(!A.mapKeyWarned){let o=JSON.stringify(n);o.length>40&&(o=o.substring(0,36)+'..."'),em(A.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${o}. Set mapAsMap: true to use object keys.`),A.mapKeyWarned=!0}return n}return JSON.stringify(e)}function rB(i,e,A){let t=G0(i,void 0,A),n=G0(e,void 0,A);return new Na(t,n)}var Na=class i{constructor(e,A=null){Object.defineProperty(this,ys,{value:hb}),this.key=e,this.value=A}clone(e){let{key:A,value:t}=this;return Nn(A)&&(A=A.clone(e)),Nn(t)&&(t=t.clone(e)),new i(A,t)}toJSON(e,A){let t=A?.mapAsMap?new Map:{};return im(A,t,this)}toString(e,A,t){return e?.doc?aU(this,e,A,t):JSON.stringify(this)}};function om(i,e,A){return(e.inFlow??i.flow?taA:eaA)(i,e,A)}function eaA({comment:i,items:e},A,{blockItemPrefix:t,flowChars:n,itemIndent:o,onChompKeep:a,onComment:r}){let{indent:s,options:{commentString:l}}=A,g=Object.assign({},A,{indent:o,type:null}),C=!1,I=[];for(let Q=0;Qf=null,()=>C=!0);f&&(m+=Hc(m,o,l(f))),C&&f&&(C=!1),I.push(t+m)}let B;if(I.length===0)B=n.start+n.end;else{B=I[0];for(let Q=1;Qf=null);Qg||m.includes(` +`))&&(l=!0),C.push(m),g=C.length}let{start:I,end:B}=A;if(C.length===0)return I+B;if(!l){let Q=C.reduce((h,f)=>h+f.length+2,2);l=e.options.lineWidth>0&&Q>e.options.lineWidth}if(l){let Q=I;for(let h of C)Q+=h?` +${o}${n}${h}`:` +`;return`${Q} +${n}${B}`}else return`${I}${a}${C.join(" ")}${a}${B}`}function nm({indent:i,options:{commentString:e}},A,t,n){if(t&&n&&(t=t.replace(/^\n+/,"")),t){let o=Wl(e(t),i);A.push(o.trimStart())}}function WC(i,e){let A=Xi(e)?e.value:e;for(let t of i)if(bn(t)&&(t.key===e||t.key===A||Xi(t.key)&&t.key.value===A))return t}var Ya=class extends nB{static get tagName(){return"tag:yaml.org,2002:map"}constructor(e){super(Rg,e),this.items=[]}static from(e,A,t){let{keepUndefined:n,replacer:o}=t,a=new this(e),r=(s,l)=>{if(typeof o=="function")l=o.call(A,s,l);else if(Array.isArray(o)&&!o.includes(s))return;(l!==void 0||n)&&a.items.push(rB(s,l,t))};if(A instanceof Map)for(let[s,l]of A)r(s,l);else if(A&&typeof A=="object")for(let s of Object.keys(A))r(s,A[s]);return typeof e.sortMapEntries=="function"&&a.items.sort(e.sortMapEntries),a}add(e,A){let t;bn(e)?t=e:!e||typeof e!="object"||!("key"in e)?t=new Na(e,e?.value):t=new Na(e.key,e.value);let n=WC(this.items,t.key),o=this.schema?.sortMapEntries;if(n){if(!A)throw new Error(`Key ${t.key} already set`);Xi(n.value)&&Vf(t.value)?n.value.value=t.value:n.value=t.value}else if(o){let a=this.items.findIndex(r=>o(t,r)<0);a===-1?this.items.push(t):this.items.splice(a,0,t)}else this.items.push(t)}delete(e){let A=WC(this.items,e);return A?this.items.splice(this.items.indexOf(A),1).length>0:!1}get(e,A){let n=WC(this.items,e)?.value;return(!A&&Xi(n)?n.value:n)??void 0}has(e){return!!WC(this.items,e)}set(e,A){this.add(new Na(e,A),!0)}toJSON(e,A,t){let n=t?new t:A?.mapAsMap?new Map:{};A?.onCreate&&A.onCreate(n);for(let o of this.items)im(A,n,o);return n}toString(e,A,t){if(!e)return JSON.stringify(this);for(let n of this.items)if(!bn(n))throw new Error(`Map items must all be pairs; found ${JSON.stringify(n)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),om(this,e,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:e.indent||"",onChompKeep:t,onComment:A})}};var Kg={collection:"map",default:!0,nodeClass:Ya,tag:"tag:yaml.org,2002:map",resolve(i,e){return Fg(i)||e("Expected a mapping for this tag"),i},createNode:(i,e,A)=>Ya.from(i,e,A)};var rs=class extends nB{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(e){super(F0,e),this.items=[]}add(e){this.items.push(e)}delete(e){let A=am(e);return typeof A!="number"?!1:this.items.splice(A,1).length>0}get(e,A){let t=am(e);if(typeof t!="number")return;let n=this.items[t];return!A&&Xi(n)?n.value:n}has(e){let A=am(e);return typeof A=="number"&&A=0?e:null}var Ug={collection:"seq",default:!0,nodeClass:rs,tag:"tag:yaml.org,2002:seq",resolve(i,e){return Lg(i)||e("Expected a sequence for this tag"),i},createNode:(i,e,A)=>rs.from(i,e,A)};var ZC={identify:i=>typeof i=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:i=>i,stringify(i,e,A,t){return e=Object.assign({actualString:!0},e),O1(i,e,A,t)}};var H1={identify:i=>i==null,createNode:()=>new jt(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new jt(null),stringify:({source:i},e)=>typeof i=="string"&&H1.test.test(i)?i:e.options.nullStr};var LQ={identify:i=>typeof i=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:i=>new jt(i[0]==="t"||i[0]==="T"),stringify({source:i,value:e},A){if(i&&LQ.test.test(i)){let t=i[0]==="t"||i[0]==="T";if(e===t)return i}return e?A.options.trueStr:A.options.falseStr}};function ss({format:i,minFractionDigits:e,tag:A,value:t}){if(typeof t=="bigint")return String(t);let n=typeof t=="number"?t:Number(t);if(!isFinite(n))return isNaN(n)?".nan":n<0?"-.inf":".inf";let o=Object.is(t,-0)?"-0":JSON.stringify(t);if(!i&&e&&(!A||A==="tag:yaml.org,2002:float")&&/^\d/.test(o)){let a=o.indexOf(".");a<0&&(a=o.length,o+=".");let r=e-(o.length-a-1);for(;r-- >0;)o+="0"}return o}var rm={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:i=>i.slice(-3).toLowerCase()==="nan"?NaN:i[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:ss},sm={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:i=>parseFloat(i),stringify(i){let e=Number(i.value);return isFinite(e)?e.toExponential():ss(i)}},lm={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(i){let e=new jt(parseFloat(i)),A=i.indexOf(".");return A!==-1&&i[i.length-1]==="0"&&(e.minFractionDigits=i.length-A-1),e},stringify:ss};var gm=i=>typeof i=="bigint"||Number.isInteger(i),yb=(i,e,A,{intAsBigInt:t})=>t?BigInt(i):parseInt(i.substring(e),A);function sU(i,e,A){let{value:t}=i;return gm(t)&&t>=0?A+t.toString(e):ss(i)}var cm={identify:i=>gm(i)&&i>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(i,e,A)=>yb(i,2,8,A),stringify:i=>sU(i,8,"0o")},Cm={identify:gm,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(i,e,A)=>yb(i,0,10,A),stringify:ss},Im={identify:i=>gm(i)&&i>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(i,e,A)=>yb(i,2,16,A),stringify:i=>sU(i,16,"0x")};var lU=[Kg,Ug,ZC,H1,LQ,cm,Cm,Im,rm,sm,lm];function gU(i){return typeof i=="bigint"||Number.isInteger(i)}var dm=({value:i})=>JSON.stringify(i),iaA=[{identify:i=>typeof i=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:i=>i,stringify:dm},{identify:i=>i==null,createNode:()=>new jt(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:dm},{identify:i=>typeof i=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:i=>i==="true",stringify:dm},{identify:gU,default:!0,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(i,e,{intAsBigInt:A})=>A?BigInt(i):parseInt(i,10),stringify:({value:i})=>gU(i)?i.toString():JSON.stringify(i)},{identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:i=>parseFloat(i),stringify:dm}],naA={default:!0,tag:"",test:/^/,resolve(i,e){return e(`Unresolved plain scalar ${JSON.stringify(i)}`),i}},cU=[Kg,Ug].concat(iaA,naA);var GQ={identify:i=>i instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(i,e){if(typeof atob=="function"){let A=atob(i.replace(/[\n\r]/g,"")),t=new Uint8Array(A.length);for(let n=0;n1&&e("Each pair must have its own sequence indicator");let n=t.items[0]||new Na(new jt(null));if(t.commentBefore&&(n.key.commentBefore=n.key.commentBefore?`${t.commentBefore} +${n.key.commentBefore}`:t.commentBefore),t.comment){let o=n.value??n.key;o.comment=o.comment?`${t.comment} +${o.comment}`:t.comment}t=n}i.items[A]=bn(t)?t:new Na(t)}}else e("Expected a sequence for this tag");return i}function bb(i,e,A){let{replacer:t}=A,n=new rs(i);n.tag="tag:yaml.org,2002:pairs";let o=0;if(e&&Symbol.iterator in Object(e))for(let a of e){typeof t=="function"&&(a=t.call(e,String(o++),a));let r,s;if(Array.isArray(a))if(a.length===2)r=a[0],s=a[1];else throw new TypeError(`Expected [key, value] tuple: ${a}`);else if(a&&a instanceof Object){let l=Object.keys(a);if(l.length===1)r=l[0],s=a[r];else throw new TypeError(`Expected tuple with one key, not ${l.length} keys`)}else r=a;n.items.push(rB(r,s,A))}return n}var KQ={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:vb,createNode:bb};var Mb=(()=>{class i extends rs{constructor(){super(),this.add=Ya.prototype.add.bind(this),this.delete=Ya.prototype.delete.bind(this),this.get=Ya.prototype.get.bind(this),this.has=Ya.prototype.has.bind(this),this.set=Ya.prototype.set.bind(this),this.tag=i.tag}toJSON(A,t){if(!t)return super.toJSON(A);let n=new Map;t?.onCreate&&t.onCreate(n);for(let o of this.items){let a,r;if(bn(o)?(a=lr(o.key,"",t),r=lr(o.value,a,t)):a=lr(o,"",t),n.has(a))throw new Error("Ordered maps must not include duplicate keys");n.set(a,r)}return n}static from(A,t,n){let o=bb(A,t,n),a=new this;return a.items=o.items,a}}return i.tag="tag:yaml.org,2002:omap",i})(),UQ={collection:"seq",identify:i=>i instanceof Map,nodeClass:Mb,default:!1,tag:"tag:yaml.org,2002:omap",resolve(i,e){let A=vb(i,e),t=[];for(let{key:n}of A.items)Xi(n)&&(t.includes(n.value)?e(`Ordered maps must not include duplicate keys: ${n.value}`):t.push(n.value));return Object.assign(new Mb,A)},createNode:(i,e,A)=>Mb.from(i,e,A)};function CU({value:i,source:e},A){return e&&(i?Sb:kb).test.test(e)?e:i?A.options.trueStr:A.options.falseStr}var Sb={identify:i=>i===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new jt(!0),stringify:CU},kb={identify:i=>i===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new jt(!1),stringify:CU};var IU={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:i=>i.slice(-3).toLowerCase()==="nan"?NaN:i[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:ss},dU={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:i=>parseFloat(i.replace(/_/g,"")),stringify(i){let e=Number(i.value);return isFinite(e)?e.toExponential():ss(i)}},BU={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(i){let e=new jt(parseFloat(i.replace(/_/g,""))),A=i.indexOf(".");if(A!==-1){let t=i.substring(A+1).replace(/_/g,"");t[t.length-1]==="0"&&(e.minFractionDigits=t.length)}return e},stringify:ss};var TQ=i=>typeof i=="bigint"||Number.isInteger(i);function Bm(i,e,A,{intAsBigInt:t}){let n=i[0];if((n==="-"||n==="+")&&(e+=1),i=i.substring(e).replace(/_/g,""),t){switch(A){case 2:i=`0b${i}`;break;case 8:i=`0o${i}`;break;case 16:i=`0x${i}`;break}let a=BigInt(i);return n==="-"?BigInt(-1)*a:a}let o=parseInt(i,A);return n==="-"?-1*o:o}function _b(i,e,A){let{value:t}=i;if(TQ(t)){let n=t.toString(e);return t<0?"-"+A+n.substr(1):A+n}return ss(i)}var EU={identify:TQ,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(i,e,A)=>Bm(i,2,2,A),stringify:i=>_b(i,2,"0b")},hU={identify:TQ,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(i,e,A)=>Bm(i,1,8,A),stringify:i=>_b(i,8,"0")},QU={identify:TQ,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(i,e,A)=>Bm(i,0,10,A),stringify:ss},uU={identify:TQ,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(i,e,A)=>Bm(i,2,16,A),stringify:i=>_b(i,16,"0x")};var xb=(()=>{class i extends Ya{constructor(A){super(A),this.tag=i.tag}add(A){let t;bn(A)?t=A:A&&typeof A=="object"&&"key"in A&&"value"in A&&A.value===null?t=new Na(A.key,null):t=new Na(A,null),WC(this.items,t.key)||this.items.push(t)}get(A,t){let n=WC(this.items,A);return!t&&bn(n)?Xi(n.key)?n.key.value:n.key:n}set(A,t){if(typeof t!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof t}`);let n=WC(this.items,A);n&&!t?this.items.splice(this.items.indexOf(n),1):!n&&t&&this.items.push(new Na(A))}toJSON(A,t){return super.toJSON(A,t,Set)}toString(A,t,n){if(!A)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},A,{allNullValues:!0}),t,n);throw new Error("Set items must all have null values")}static from(A,t,n){let{replacer:o}=n,a=new this(A);if(t&&Symbol.iterator in Object(t))for(let r of t)typeof o=="function"&&(r=o.call(t,r,r)),a.items.push(rB(r,null,n));return a}}return i.tag="tag:yaml.org,2002:set",i})(),JQ={collection:"map",identify:i=>i instanceof Set,nodeClass:xb,default:!1,tag:"tag:yaml.org,2002:set",createNode:(i,e,A)=>xb.from(i,e,A),resolve(i,e){if(Fg(i)){if(i.hasAllNullValues(!0))return Object.assign(new xb,i);e("Set items must all have null values")}else e("Expected a mapping for this tag");return i}};function Rb(i,e){let A=i[0],t=A==="-"||A==="+"?i.substring(1):i,n=a=>e?BigInt(a):Number(a),o=t.replace(/_/g,"").split(":").reduce((a,r)=>a*n(60)+n(r),n(0));return A==="-"?n(-1)*o:o}function pU(i){let{value:e}=i,A=a=>a;if(typeof e=="bigint")A=a=>BigInt(a);else if(isNaN(e)||!isFinite(e))return ss(i);let t="";e<0&&(t="-",e*=A(-1));let n=A(60),o=[e%n];return e<60?o.unshift(0):(e=(e-o[0])/n,o.unshift(e%n),e>=60&&(e=(e-o[0])/n,o.unshift(e))),t+o.map(a=>String(a).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var Em={identify:i=>typeof i=="bigint"||Number.isInteger(i),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(i,e,{intAsBigInt:A})=>Rb(i,A),stringify:pU},hm={identify:i=>typeof i=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:i=>Rb(i,!1),stringify:pU},sB={identify:i=>i instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(i){let e=i.match(sB.test);if(!e)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,A,t,n,o,a,r]=e.map(Number),s=e[7]?Number((e[7]+"00").substr(1,3)):0,l=Date.UTC(A,t-1,n,o||0,a||0,r||0,s),g=e[8];if(g&&g!=="Z"){let C=Rb(g,!1);Math.abs(C)<30&&(C*=60),l-=6e4*C}return new Date(l)},stringify:({value:i})=>i?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};var Nb=[Kg,Ug,ZC,H1,Sb,kb,EU,hU,QU,uU,IU,dU,BU,GQ,Gg,UQ,KQ,JQ,Em,hm,sB];var fU=new Map([["core",lU],["failsafe",[Kg,Ug,ZC]],["json",cU],["yaml11",Nb],["yaml-1.1",Nb]]),mU={binary:GQ,bool:LQ,float:lm,floatExp:sm,floatNaN:rm,floatTime:hm,int:Cm,intHex:Im,intOct:cm,intTime:Em,map:Kg,merge:Gg,null:H1,omap:UQ,pairs:KQ,seq:Ug,set:JQ,timestamp:sB},wU={"tag:yaml.org,2002:binary":GQ,"tag:yaml.org,2002:merge":Gg,"tag:yaml.org,2002:omap":UQ,"tag:yaml.org,2002:pairs":KQ,"tag:yaml.org,2002:set":JQ,"tag:yaml.org,2002:timestamp":sB};function Qm(i,e,A){let t=fU.get(e);if(t&&!i)return A&&!t.includes(Gg)?t.concat(Gg):t.slice();let n=t;if(!n)if(Array.isArray(i))n=[];else{let o=Array.from(fU.keys()).filter(a=>a!=="yaml11").map(a=>JSON.stringify(a)).join(", ");throw new Error(`Unknown schema "${e}"; use one of ${o} or define customTags array`)}if(Array.isArray(i))for(let o of i)n=n.concat(o);else typeof i=="function"&&(n=i(n.slice()));return A&&(n=n.concat(Gg)),n.reduce((o,a)=>{let r=typeof a=="string"?mU[a]:a;if(!r){let s=JSON.stringify(a),l=Object.keys(mU).map(g=>JSON.stringify(g)).join(", ");throw new Error(`Unknown custom tag ${s}; use one of ${l}`)}return o.includes(r)||o.push(r),o},[])}var oaA=(i,e)=>i.keye.key?1:0,YQ=class i{constructor({compat:e,customTags:A,merge:t,resolveKnownTags:n,schema:o,sortMapEntries:a,toStringDefaults:r}){this.compat=Array.isArray(e)?Qm(e,"compat"):e?Qm(null,e):null,this.name=typeof o=="string"&&o||"core",this.knownTags=n?wU:{},this.tags=Qm(A,this.name,t),this.toStringOptions=r??null,Object.defineProperty(this,Rg,{value:Kg}),Object.defineProperty(this,Ql,{value:ZC}),Object.defineProperty(this,F0,{value:Ug}),this.sortMapEntries=typeof a=="function"?a:a===!0?oaA:null}clone(){let e=Object.create(i.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}};function DU(i,e){let A=[],t=e.directives===!0;if(e.directives!==!1&&i.directives){let s=i.directives.toString(i);s?(A.push(s),t=!0):i.directives.docStart&&(t=!0)}t&&A.push("---");let n=Am(i,e),{commentString:o}=n.options;if(i.commentBefore){A.length!==1&&A.unshift("");let s=o(i.commentBefore);A.unshift(Wl(s,""))}let a=!1,r=null;if(i.contents){if(Nn(i.contents)){if(i.contents.spaceBefore&&t&&A.push(""),i.contents.commentBefore){let g=o(i.contents.commentBefore);A.push(Wl(g,""))}n.forceBlockIndent=!!i.comment,r=i.contents.comment}let s=r?void 0:()=>a=!0,l=K0(i.contents,n,()=>r=null,s);r&&(l+=Hc(l,"",o(r))),(l[0]==="|"||l[0]===">")&&A[A.length-1]==="---"?A[A.length-1]=`--- ${l}`:A.push(l)}else A.push(K0(i.contents,n));if(i.directives?.docEnd)if(i.comment){let s=o(i.comment);s.includes(` +`)?(A.push("..."),A.push(Wl(s,""))):A.push(`... ${s}`)}else A.push("...");else{let s=i.comment;s&&a&&(s=s.replace(/^\n+/,"")),s&&((!a||r)&&A[A.length-1]!==""&&A.push(""),A.push(Wl(o(s),"")))}return A.join(` +`)+` +`}var U0=class i{constructor(e,A,t){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,ys,{value:Hf});let n=null;typeof A=="function"||Array.isArray(A)?n=A:t===void 0&&A&&(t=A,A=void 0);let o=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:"1.2"},t);this.options=o;let{version:a}=o;t?._directives?(this.directives=t._directives.atDocument(),this.directives.yaml.explicit&&(a=this.directives.yaml.version)):this.directives=new iB({version:a}),this.setSchema(a,t),this.contents=e===void 0?null:this.createNode(e,n,t)}clone(){let e=Object.create(i.prototype,{[ys]:{value:Hf}});return e.commentBefore=this.commentBefore,e.comment=this.comment,e.errors=this.errors.slice(),e.warnings=this.warnings.slice(),e.options=Object.assign({},this.options),this.directives&&(e.directives=this.directives.clone()),e.schema=this.schema.clone(),e.contents=Nn(this.contents)?this.contents.clone(e.schema):this.contents,this.range&&(e.range=this.range.slice()),e}add(e){lB(this.contents)&&this.contents.add(e)}addIn(e,A){lB(this.contents)&&this.contents.addIn(e,A)}createAlias(e,A){if(!e.anchor){let t=Qb(this);e.anchor=!A||t.has(A)?ub(A||"a",t):A}return new L0(e.anchor)}createNode(e,A,t){let n;if(typeof A=="function")e=A.call({"":e},"",e),n=A;else if(Array.isArray(A)){let f=v=>typeof v=="number"||v instanceof String||v instanceof Number,m=A.filter(f).map(String);m.length>0&&(A=A.concat(m)),n=A}else t===void 0&&A&&(t=A,A=void 0);let{aliasDuplicateObjects:o,anchorPrefix:a,flow:r,keepUndefined:s,onTagObj:l,tag:g}=t??{},{onAnchor:C,setAnchors:I,sourceObjects:B}=iU(this,a||"a"),Q={aliasDuplicateObjects:o??!0,keepUndefined:s??!1,onAnchor:C,onTagObj:l,replacer:n,schema:this.schema,sourceObjects:B},h=G0(e,g,Q);return r&&Co(h)&&(h.flow=!0),I(),h}createPair(e,A,t={}){let n=this.createNode(e,null,t),o=this.createNode(A,null,t);return new Na(n,o)}delete(e){return lB(this.contents)?this.contents.delete(e):!1}deleteIn(e){return oB(e)?this.contents==null?!1:(this.contents=null,!0):lB(this.contents)?this.contents.deleteIn(e):!1}get(e,A){return Co(this.contents)?this.contents.get(e,A):void 0}getIn(e,A){return oB(e)?!A&&Xi(this.contents)?this.contents.value:this.contents:Co(this.contents)?this.contents.getIn(e,A):void 0}has(e){return Co(this.contents)?this.contents.has(e):!1}hasIn(e){return oB(e)?this.contents!==void 0:Co(this.contents)?this.contents.hasIn(e):!1}set(e,A){this.contents==null?this.contents=xQ(this.schema,[e],A):lB(this.contents)&&this.contents.set(e,A)}setIn(e,A){oB(e)?this.contents=A:this.contents==null?this.contents=xQ(this.schema,Array.from(e),A):lB(this.contents)&&this.contents.setIn(e,A)}setSchema(e,A={}){typeof e=="number"&&(e=String(e));let t;switch(e){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new iB({version:"1.1"}),t={resolveKnownTags:!1,schema:"yaml-1.1"};break;case"1.2":case"next":this.directives?this.directives.yaml.version=e:this.directives=new iB({version:e}),t={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,t=null;break;default:{let n=JSON.stringify(e);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${n}`)}}if(A.schema instanceof Object)this.schema=A.schema;else if(t)this.schema=new YQ(Object.assign(t,A));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:e,jsonArg:A,mapAsMap:t,maxAliasCount:n,onAnchor:o,reviver:a}={}){let r={anchors:new Map,doc:this,keep:!e,mapAsMap:t===!0,mapKeyWarned:!1,maxAliasCount:typeof n=="number"?n:100},s=lr(this.contents,A??"",r);if(typeof o=="function")for(let{count:l,res:g}of r.anchors.values())o(g,l);return typeof a=="function"?qC(a,{"":s},"",s):s}toJSON(e,A){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:A})}toString(e={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){let A=JSON.stringify(e.indent);throw new Error(`"indent" option must be a positive integer, not ${A}`)}return DU(this,e)}};function lB(i){if(Co(i))return!0;throw new Error("Expected a YAML collection as document contents")}var OQ=class extends Error{constructor(e,A,t,n){super(),this.name=e,this.code=t,this.message=n,this.pos=A}},Tg=class extends OQ{constructor(e,A,t){super("YAMLParseError",e,A,t)}},HQ=class extends OQ{constructor(e,A,t){super("YAMLWarning",e,A,t)}},Fb=(i,e)=>A=>{if(A.pos[0]===-1)return;A.linePos=A.pos.map(r=>e.linePos(r));let{line:t,col:n}=A.linePos[0];A.message+=` at line ${t}, column ${n}`;let o=n-1,a=i.substring(e.lineStarts[t-1],e.lineStarts[t]).replace(/[\n\r]+$/,"");if(o>=60&&a.length>80){let r=Math.min(o-39,a.length-79);a="\u2026"+a.substring(r),o-=r-1}if(a.length>80&&(a=a.substring(0,79)+"\u2026"),t>1&&/^ *$/.test(a.substring(0,o))){let r=i.substring(e.lineStarts[t-2],e.lineStarts[t-1]);r.length>80&&(r=r.substring(0,79)+`\u2026 +`),a=r+a}if(/[^ ]/.test(a)){let r=1,s=A.linePos[1];s?.line===t&&s.col>n&&(r=Math.max(1,Math.min(s.col-n,80-o)));let l=" ".repeat(o)+"^".repeat(r);A.message+=`: + +${a} +${l} +`}};function zc(i,{flow:e,indicator:A,next:t,offset:n,onError:o,parentIndent:a,startOnNewline:r}){let s=!1,l=r,g=r,C="",I="",B=!1,Q=!1,h=null,f=null,m=null,v=null,S=null,k=null,M=null;for(let z of i)switch(Q&&(z.type!=="space"&&z.type!=="newline"&&z.type!=="comma"&&o(z.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),Q=!1),h&&(l&&z.type!=="comment"&&z.type!=="newline"&&o(h,"TAB_AS_INDENT","Tabs are not allowed as indentation"),h=null),z.type){case"space":!e&&(A!=="doc-start"||t?.type!=="flow-collection")&&z.source.includes(" ")&&(h=z),g=!0;break;case"comment":{g||o(z,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let P=z.source.substring(1)||" ";C?C+=I+P:C=P,I="",l=!1;break}case"newline":l?C?C+=z.source:(!k||A!=="seq-item-ind")&&(s=!0):I+=z.source,l=!0,B=!0,(f||m)&&(v=z),g=!0;break;case"anchor":f&&o(z,"MULTIPLE_ANCHORS","A node can have at most one anchor"),z.source.endsWith(":")&&o(z.offset+z.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),f=z,M??(M=z.offset),l=!1,g=!1,Q=!0;break;case"tag":{m&&o(z,"MULTIPLE_TAGS","A node can have at most one tag"),m=z,M??(M=z.offset),l=!1,g=!1,Q=!0;break}case A:(f||m)&&o(z,"BAD_PROP_ORDER",`Anchors and tags must be after the ${z.source} indicator`),k&&o(z,"UNEXPECTED_TOKEN",`Unexpected ${z.source} in ${e??"collection"}`),k=z,l=A==="seq-item-ind"||A==="explicit-key-ind",g=!1;break;case"comma":if(e){S&&o(z,"UNEXPECTED_TOKEN",`Unexpected , in ${e}`),S=z,l=!1,g=!1;break}default:o(z,"UNEXPECTED_TOKEN",`Unexpected ${z.type} token`),l=!1,g=!1}let x=i[i.length-1],F=x?x.offset+x.source.length:n;return Q&&t&&t.type!=="space"&&t.type!=="newline"&&t.type!=="comma"&&(t.type!=="scalar"||t.source!=="")&&o(t.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),h&&(l&&h.indent<=a||t?.type==="block-map"||t?.type==="block-seq")&&o(h,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:S,found:k,spaceBefore:s,comment:C,hasNewline:B,anchor:f,tag:m,newlineAfterProp:v,end:F,start:M??F}}function XC(i){if(!i)return null;switch(i.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(i.source.includes(` +`))return!0;if(i.end){for(let e of i.end)if(e.type==="newline")return!0}return!1;case"flow-collection":for(let e of i.items){for(let A of e.start)if(A.type==="newline")return!0;if(e.sep){for(let A of e.sep)if(A.type==="newline")return!0}if(XC(e.key)||XC(e.value))return!0}return!1;default:return!0}}function zQ(i,e,A){if(e?.type==="flow-collection"){let t=e.end[0];t.indent===i&&(t.source==="]"||t.source==="}")&&XC(e)&&A(t,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function um(i,e,A){let{uniqueKeys:t}=i.options;if(t===!1)return!1;let n=typeof t=="function"?t:(o,a)=>o===a||Xi(o)&&Xi(a)&&o.value===a.value;return e.some(o=>n(o.key,A))}var yU="All mapping items must start at the same column";function vU({composeNode:i,composeEmptyNode:e},A,t,n,o){let a=o?.nodeClass??Ya,r=new a(A.schema);A.atRoot&&(A.atRoot=!1);let s=t.offset,l=null;for(let g of t.items){let{start:C,key:I,sep:B,value:Q}=g,h=zc(C,{indicator:"explicit-key-ind",next:I??B?.[0],offset:s,onError:n,parentIndent:t.indent,startOnNewline:!0}),f=!h.found;if(f){if(I&&(I.type==="block-seq"?n(s,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in I&&I.indent!==t.indent&&n(s,"BAD_INDENT",yU)),!h.anchor&&!h.tag&&!B){l=h.end,h.comment&&(r.comment?r.comment+=` +`+h.comment:r.comment=h.comment);continue}(h.newlineAfterProp||XC(I))&&n(I??C[C.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else h.found?.indent!==t.indent&&n(s,"BAD_INDENT",yU);A.atKey=!0;let m=h.end,v=I?i(A,I,h,n):e(A,m,C,null,h,n);A.schema.compat&&zQ(t.indent,I,n),A.atKey=!1,um(A,r.items,v)&&n(m,"DUPLICATE_KEY","Map keys must be unique");let S=zc(B??[],{indicator:"map-value-ind",next:Q,offset:v.range[2],onError:n,parentIndent:t.indent,startOnNewline:!I||I.type==="block-scalar"});if(s=S.end,S.found){f&&(Q?.type==="block-map"&&!S.hasNewline&&n(s,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),A.options.strict&&h.starti&&(i.type==="block-map"||i.type==="block-seq");function MU({composeNode:i,composeEmptyNode:e},A,t,n,o){let a=t.start.source==="{",r=a?"flow map":"flow sequence",s=o?.nodeClass??(a?Ya:rs),l=new s(A.schema);l.flow=!0;let g=A.atRoot;g&&(A.atRoot=!1),A.atKey&&(A.atKey=!1);let C=t.offset+t.start.source.length;for(let f=0;f0){let f=Pc(Q,h,A.options.strict,n);f.comment&&(l.comment?l.comment+=` +`+f.comment:l.comment=f.comment),l.range=[t.offset,h,f.offset]}else l.range=[t.offset,h,h];return l}function Kb(i,e,A,t,n,o){let a=A.type==="block-map"?vU(i,e,A,t,o):A.type==="block-seq"?bU(i,e,A,t,o):MU(i,e,A,t,o),r=a.constructor;return n==="!"||n===r.tagName?(a.tag=r.tagName,a):(n&&(a.tag=n),a)}function SU(i,e,A,t,n){let o=t.tag,a=o?e.directives.tagName(o.source,I=>n(o,"TAG_RESOLVE_FAILED",I)):null;if(A.type==="block-seq"){let{anchor:I,newlineAfterProp:B}=t,Q=I&&o?I.offset>o.offset?I:o:I??o;Q&&(!B||B.offsetI.tag===a&&I.collection===r);if(!s){let I=e.schema.knownTags[a];if(I?.collection===r)e.schema.tags.push(Object.assign({},I,{default:!1})),s=I;else return I?n(o,"BAD_COLLECTION_TYPE",`${I.tag} used for ${r} collection, but expects ${I.collection??"scalar"}`,!0):n(o,"TAG_RESOLVE_FAILED",`Unresolved tag: ${a}`,!0),Kb(i,e,A,n,a)}let l=Kb(i,e,A,n,a,s),g=s.resolve?.(l,I=>n(o,"TAG_RESOLVE_FAILED",I),e.options)??l,C=Nn(g)?g:new jt(g);return C.range=l.range,C.tag=a,s?.format&&(C.format=s.format),C}function Ub(i,e,A){let t=e.offset,n=aaA(e,i.options.strict,A);if(!n)return{value:"",type:null,comment:"",range:[t,t,t]};let o=n.mode===">"?jt.BLOCK_FOLDED:jt.BLOCK_LITERAL,a=e.source?raA(e.source):[],r=a.length;for(let h=a.length-1;h>=0;--h){let f=a[h][1];if(f===""||f==="\r")r=h;else break}if(r===0){let h=n.chomp==="+"&&a.length>0?` +`.repeat(Math.max(1,a.length-1)):"",f=t+n.length;return e.source&&(f+=e.source.length),{value:h,type:o,comment:n.comment,range:[t,f,f]}}let s=e.indent+n.indent,l=e.offset+n.length,g=0;for(let h=0;hs&&(s=f.length);else{f.length=r;--h)a[h][0].length>s&&(r=h+1);let C="",I="",B=!1;for(let h=0;hs||m[0]===" "?(I===" "?I=` +`:!B&&I===` +`&&(I=` + +`),C+=I+f.slice(s)+m,I=` +`,B=!0):m===""?I===` +`?C+=` +`:I=` +`:(C+=I+m,I=" ",B=!1)}switch(n.chomp){case"-":break;case"+":for(let h=r;hA(t+I,B,Q);switch(n){case"scalar":r=jt.PLAIN,s=saA(o,l);break;case"single-quoted-scalar":r=jt.QUOTE_SINGLE,s=laA(o,l);break;case"double-quoted-scalar":r=jt.QUOTE_DOUBLE,s=gaA(o,l);break;default:return A(i,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${n}`),{value:"",type:null,comment:"",range:[t,t+o.length,t+o.length]}}let g=t+o.length,C=Pc(a,g,e,A);return{value:s,type:r,comment:C.comment,range:[t,g,C.offset]}}function saA(i,e){let A="";switch(i[0]){case" ":A="a tab character";break;case",":A="flow indicator character ,";break;case"%":A="directive indicator character %";break;case"|":case">":{A=`block scalar indicator ${i[0]}`;break}case"@":case"`":{A=`reserved character ${i[0]}`;break}}return A&&e(0,"BAD_SCALAR_START",`Plain value cannot start with ${A}`),kU(i)}function laA(i,e){return(i[i.length-1]!=="'"||i.length===1)&&e(i.length,"MISSING_CHAR","Missing closing 'quote"),kU(i.slice(1,-1)).replace(/''/g,"'")}function kU(i){let e,A;try{e=new RegExp(`(.*?)(?o?i.slice(o,t+1):n)}else A+=n}return(i[i.length-1]!=='"'||i.length===1)&&e(i.length,"MISSING_CHAR",'Missing closing "quote'),A}function caA(i,e){let A="",t=i[e+1];for(;(t===" "||t===" "||t===` +`||t==="\r")&&!(t==="\r"&&i[e+2]!==` +`);)t===` +`&&(A+=` +`),e+=1,t=i[e+1];return A||(A=" "),{fold:A,offset:e}}var CaA={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:` +`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function IaA(i,e,A,t){let n=i.substr(e,A),a=n.length===A&&/^[0-9a-fA-F]+$/.test(n)?parseInt(n,16):NaN;if(isNaN(a)){let r=i.substr(e-2,A+2);return t(e-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${r}`),r}return String.fromCodePoint(a)}function Jb(i,e,A,t){let{value:n,type:o,comment:a,range:r}=e.type==="block-scalar"?Ub(i,e,t):Tb(e,i.options.strict,t),s=A?i.directives.tagName(A.source,C=>t(A,"TAG_RESOLVE_FAILED",C)):null,l;i.options.stringKeys&&i.atKey?l=i.schema[Ql]:s?l=daA(i.schema,n,s,A,t):e.type==="scalar"?l=BaA(i,n,e,t):l=i.schema[Ql];let g;try{let C=l.resolve(n,I=>t(A??e,"TAG_RESOLVE_FAILED",I),i.options);g=Xi(C)?C:new jt(C)}catch(C){let I=C instanceof Error?C.message:String(C);t(A??e,"TAG_RESOLVE_FAILED",I),g=new jt(n)}return g.range=r,g.source=n,o&&(g.type=o),s&&(g.tag=s),l.format&&(g.format=l.format),a&&(g.comment=a),g}function daA(i,e,A,t,n){if(A==="!")return i[Ql];let o=[];for(let r of i.tags)if(!r.collection&&r.tag===A)if(r.default&&r.test)o.push(r);else return r;for(let r of o)if(r.test?.test(e))return r;let a=i.knownTags[A];return a&&!a.collection?(i.tags.push(Object.assign({},a,{default:!1,test:void 0})),a):(n(t,"TAG_RESOLVE_FAILED",`Unresolved tag: ${A}`,A!=="tag:yaml.org,2002:str"),i[Ql])}function BaA({atKey:i,directives:e,schema:A},t,n,o){let a=A.tags.find(r=>(r.default===!0||i&&r.default==="key")&&r.test?.test(t))||A[Ql];if(A.compat){let r=A.compat.find(s=>s.default&&s.test?.test(t))??A[Ql];if(a.tag!==r.tag){let s=e.tagString(a.tag),l=e.tagString(r.tag),g=`Value may be parsed as either ${s} or ${l}`;o(n,"TAG_RESOLVE_FAILED",g,!0)}}return a}function _U(i,e,A){if(e){A??(A=e.length);for(let t=A-1;t>=0;--t){let n=e[t];switch(n.type){case"space":case"comment":case"newline":i-=n.source.length;continue}for(n=e[++t];n?.type==="space";)i+=n.source.length,n=e[++t];break}}return i}var EaA={composeNode:Yb,composeEmptyNode:pm};function Yb(i,e,A,t){let n=i.atKey,{spaceBefore:o,comment:a,anchor:r,tag:s}=A,l,g=!0;switch(e.type){case"alias":l=haA(i,e,t),(r||s)&&t(e,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":l=Jb(i,e,s,t),r&&(l.anchor=r.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":l=SU(EaA,i,e,A,t),r&&(l.anchor=r.source.substring(1));break;default:{let C=e.type==="error"?e.message:`Unsupported token (type: ${e.type})`;t(e,"UNEXPECTED_TOKEN",C),l=pm(i,e.offset,void 0,null,A,t),g=!1}}return r&&l.anchor===""&&t(r,"BAD_ALIAS","Anchor cannot be an empty string"),n&&i.options.stringKeys&&(!Xi(l)||typeof l.value!="string"||l.tag&&l.tag!=="tag:yaml.org,2002:str")&&t(s??e,"NON_STRING_KEY","With stringKeys, all keys must be strings"),o&&(l.spaceBefore=!0),a&&(e.type==="scalar"&&e.source===""?l.comment=a:l.commentBefore=a),i.options.keepSourceTokens&&g&&(l.srcToken=e),l}function pm(i,e,A,t,{spaceBefore:n,comment:o,anchor:a,tag:r,end:s},l){let g={type:"scalar",offset:_U(e,A,t),indent:-1,source:""},C=Jb(i,g,r,l);return a&&(C.anchor=a.source.substring(1),C.anchor===""&&l(a,"BAD_ALIAS","Anchor cannot be an empty string")),n&&(C.spaceBefore=!0),o&&(C.comment=o,C.range[2]=s),C}function haA({options:i},{offset:e,source:A,end:t},n){let o=new L0(A.substring(1));o.source===""&&n(e,"BAD_ALIAS","Alias cannot be an empty string"),o.source.endsWith(":")&&n(e+A.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let a=e+A.length,r=Pc(t,a,i.strict,n);return o.range=[e,a,r.offset],r.comment&&(o.comment=r.comment),o}function xU(i,e,{offset:A,start:t,value:n,end:o},a){let r=Object.assign({_directives:e},i),s=new U0(void 0,r),l={atKey:!1,atRoot:!0,directives:s.directives,options:s.options,schema:s.schema},g=zc(t,{indicator:"doc-start",next:n??o?.[0],offset:A,onError:a,parentIndent:0,startOnNewline:!0});g.found&&(s.directives.docStart=!0,n&&(n.type==="block-map"||n.type==="block-seq")&&!g.hasNewline&&a(g.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),s.contents=n?Yb(l,n,g,a):pm(l,g.end,t,null,g,a);let C=s.contents.range[2],I=Pc(o,C,!1,a);return I.comment&&(s.comment=I.comment),s.range=[A,C,I.offset],s}function PQ(i){if(typeof i=="number")return[i,i+1];if(Array.isArray(i))return i.length===2?i:[i[0],i[1]];let{offset:e,source:A}=i;return[e,e+(typeof A=="string"?A.length:1)]}function RU(i){let e="",A=!1,t=!1;for(let n=0;n{let a=PQ(A);o?this.warnings.push(new HQ(a,t,n)):this.errors.push(new Tg(a,t,n))},this.directives=new iB({version:e.version||"1.2"}),this.options=e}decorate(e,A){let{comment:t,afterEmptyLine:n}=RU(this.prelude);if(t){let o=e.contents;if(A)e.comment=e.comment?`${e.comment} +${t}`:t;else if(n||e.directives.docStart||!o)e.commentBefore=t;else if(Co(o)&&!o.flow&&o.items.length>0){let a=o.items[0];bn(a)&&(a=a.key);let r=a.commentBefore;a.commentBefore=r?`${t} +${r}`:t}else{let a=o.commentBefore;o.commentBefore=a?`${t} +${a}`:t}}A?(Array.prototype.push.apply(e.errors,this.errors),Array.prototype.push.apply(e.warnings,this.warnings)):(e.errors=this.errors,e.warnings=this.warnings),this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:RU(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,A=!1,t=-1){for(let n of e)yield*ce(this.next(n));yield*ce(this.end(A,t))}*next(e){switch(e.type){case"directive":this.directives.add(e.source,(A,t,n)=>{let o=PQ(e);o[0]+=A,this.onError(o,"BAD_DIRECTIVE",t,n)}),this.prelude.push(e.source),this.atDirectives=!0;break;case"document":{let A=xU(this.options,this.directives,e,this.onError);this.atDirectives&&!A.directives.docStart&&this.onError(e,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(A,!1),this.doc&&(yield this.doc),this.doc=A,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(e.source);break;case"error":{let A=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,t=new Tg(PQ(e),"UNEXPECTED_TOKEN",A);this.atDirectives||!this.doc?this.errors.push(t):this.doc.errors.push(t);break}case"doc-end":{if(!this.doc){let t="Unexpected doc-end without preceding document";this.errors.push(new Tg(PQ(e),"UNEXPECTED_TOKEN",t));break}this.doc.directives.docEnd=!0;let A=Pc(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),A.comment){let t=this.doc.comment;this.doc.comment=t?`${t} +${A.comment}`:A.comment}this.doc.range[2]=A.offset;break}default:this.errors.push(new Tg(PQ(e),"UNEXPECTED_TOKEN",`Unsupported token ${e.type}`))}}*end(e=!1,A=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){let t=Object.assign({_directives:this.directives},this.options),n=new U0(void 0,t);this.atDirectives&&this.onError(A,"MISSING_CHAR","Missing directives-end indicator line"),n.range=[0,A,A],this.decorate(n,!1),yield n}}};var Ob=Symbol("break visit"),QaA=Symbol("skip children"),NU=Symbol("remove item");function z1(i,e){"type"in i&&i.type==="document"&&(i={start:i.start,value:i.value}),FU(Object.freeze([]),i,e)}z1.BREAK=Ob;z1.SKIP=QaA;z1.REMOVE=NU;z1.itemAtPath=(i,e)=>{let A=i;for(let[t,n]of e){let o=A?.[t];if(o&&"items"in o)A=o.items[n];else return}return A};z1.parentCollection=(i,e)=>{let A=z1.itemAtPath(i,e.slice(0,-1)),t=e[e.length-1][0],n=A?.[t];if(n&&"items"in n)return n;throw new Error("Parent collection not found")};function FU(i,e,A){let t=A(e,i);if(typeof t=="symbol")return t;for(let n of["key","value"]){let o=e[n];if(o&&"items"in o){for(let a=0;a":return"block-scalar-header"}return null}function Jg(i){switch(i){case void 0:case" ":case` +`:case"\r":case" ":return!0;default:return!1}}var GU=new Set("0123456789ABCDEFabcdef"),paA=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),mm=new Set(",[]{}"),faA=new Set(` ,[]{} +\r `),jb=i=>!i||faA.has(i),qQ=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,A=!1){if(e){if(typeof e!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null}this.atEnd=!A;let t=this.next??"stream";for(;t&&(A||this.hasChars(1));)t=yield*ce(this.parseNext(t))}atLineEnd(){let e=this.pos,A=this.buffer[e];for(;A===" "||A===" ";)A=this.buffer[++e];return!A||A==="#"||A===` +`?!0:A==="\r"?this.buffer[e+1]===` +`:!1}charAt(e){return this.buffer[this.pos+e]}continueScalar(e){let A=this.buffer[e];if(this.indentNext>0){let t=0;for(;A===" ";)A=this.buffer[++t+e];if(A==="\r"){let n=this.buffer[t+e+1];if(n===` +`||!n&&!this.atEnd)return e+t+1}return A===` +`||t>=this.indentNext||!A&&!this.atEnd?e+t:-1}if(A==="-"||A==="."){let t=this.buffer.substr(e,3);if((t==="---"||t==="...")&&Jg(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!="number"||e!==-1&&ethis.indentValue&&!Jg(this.charAt(1))&&(this.indentNext=this.indentValue),yield*ce(this.parseBlockStart())}*parseBlockStart(){let[e,A]=this.peek(2);if(!A&&!this.atEnd)return this.setNext("block-start");if((e==="-"||e==="?"||e===":")&&Jg(A)){let t=(yield*ce(this.pushCount(1)))+(yield*ce(this.pushSpaces(!0)));return this.indentNext=this.indentValue+1,this.indentValue+=t,yield*ce(this.parseBlockStart())}return"doc"}*parseDocument(){yield*ce(this.pushSpaces(!0));let e=this.getLine();if(e===null)return this.setNext("doc");let A=yield*ce(this.pushIndicators());switch(e[A]){case"#":yield*ce(this.pushCount(e.length-A));case void 0:return yield*ce(this.pushNewline()),yield*ce(this.parseLineStart());case"{":case"[":return yield*ce(this.pushCount(1)),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*ce(this.pushCount(1)),"doc";case"*":return yield*ce(this.pushUntil(jb)),"doc";case'"':case"'":return yield*ce(this.parseQuotedScalar());case"|":case">":return A+=yield*ce(this.parseBlockScalarHeader()),A+=yield*ce(this.pushSpaces(!0)),yield*ce(this.pushCount(e.length-A)),yield*ce(this.pushNewline()),yield*ce(this.parseBlockScalar());default:return yield*ce(this.parsePlainScalar())}}*parseFlowCollection(){let e,A,t=-1;do e=yield*ce(this.pushNewline()),e>0?(A=yield*ce(this.pushSpaces(!1)),this.indentValue=t=A):A=0,A+=yield*ce(this.pushSpaces(!0));while(e+A>0);let n=this.getLine();if(n===null)return this.setNext("flow");if((t!==-1&&t"0"&&A<="9")this.blockScalarIndent=Number(A)-1;else if(A!=="-")break}return yield*ce(this.pushUntil(A=>Jg(A)||A==="#"))}*parseBlockScalar(){let e=this.pos-1,A=0,t;A:for(let o=this.pos;t=this.buffer[o];++o)switch(t){case" ":A+=1;break;case` +`:e=o,A=0;break;case"\r":{let a=this.buffer[o+1];if(!a&&!this.atEnd)return this.setNext("block-scalar");if(a===` +`)break}default:break A}if(!t&&!this.atEnd)return this.setNext("block-scalar");if(A>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=A:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let o=this.continueScalar(e+1);if(o===-1)break;e=this.buffer.indexOf(` +`,o)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext("block-scalar");e=this.buffer.length}}let n=e+1;for(t=this.buffer[n];t===" ";)t=this.buffer[++n];if(t===" "){for(;t===" "||t===" "||t==="\r"||t===` +`;)t=this.buffer[++n];e=n-1}else if(!this.blockScalarKeep)do{let o=e-1,a=this.buffer[o];a==="\r"&&(a=this.buffer[--o]);let r=o;for(;a===" ";)a=this.buffer[--o];if(a===` +`&&o>=this.pos&&o+1+A>r)e=o;else break}while(!0);return yield fm,yield*ce(this.pushToIndex(e+1,!0)),yield*ce(this.parseLineStart())}*parsePlainScalar(){let e=this.flowLevel>0,A=this.pos-1,t=this.pos-1,n;for(;n=this.buffer[++t];)if(n===":"){let o=this.buffer[t+1];if(Jg(o)||e&&mm.has(o))break;A=t}else if(Jg(n)){let o=this.buffer[t+1];if(n==="\r"&&(o===` +`?(t+=1,n=` +`,o=this.buffer[t+1]):A=t),o==="#"||e&&mm.has(o))break;if(n===` +`){let a=this.continueScalar(t+1);if(a===-1)break;t=Math.max(t,a-2)}}else{if(e&&mm.has(n))break;A=t}return!n&&!this.atEnd?this.setNext("plain-scalar"):(yield fm,yield*ce(this.pushToIndex(A+1,!0)),e?"flow":"doc")}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,A){let t=this.buffer.slice(this.pos,e);return t?(yield t,this.pos+=t.length,t.length):(A&&(yield""),0)}*pushIndicators(){switch(this.charAt(0)){case"!":return(yield*ce(this.pushTag()))+(yield*ce(this.pushSpaces(!0)))+(yield*ce(this.pushIndicators()));case"&":return(yield*ce(this.pushUntil(jb)))+(yield*ce(this.pushSpaces(!0)))+(yield*ce(this.pushIndicators()));case"-":case"?":case":":{let e=this.flowLevel>0,A=this.charAt(1);if(Jg(A)||e&&mm.has(A))return e?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,(yield*ce(this.pushCount(1)))+(yield*ce(this.pushSpaces(!0)))+(yield*ce(this.pushIndicators()))}}return 0}*pushTag(){if(this.charAt(1)==="<"){let e=this.pos+2,A=this.buffer[e];for(;!Jg(A)&&A!==">";)A=this.buffer[++e];return yield*ce(this.pushToIndex(A===">"?e+1:e,!1))}else{let e=this.pos+1,A=this.buffer[e];for(;A;)if(paA.has(A))A=this.buffer[++e];else if(A==="%"&&GU.has(this.buffer[e+1])&&GU.has(this.buffer[e+2]))A=this.buffer[e+=3];else break;return yield*ce(this.pushToIndex(e,!1))}}*pushNewline(){let e=this.buffer[this.pos];return e===` +`?yield*ce(this.pushCount(1)):e==="\r"&&this.charAt(1)===` +`?yield*ce(this.pushCount(2)):0}*pushSpaces(e){let A=this.pos-1,t;do t=this.buffer[++A];while(t===" "||e&&t===" ");let n=A-this.pos;return n>0&&(yield this.buffer.substr(this.pos,n),this.pos=A),n}*pushUntil(e){let A=this.pos,t=this.buffer[A];for(;!e(t);)t=this.buffer[++A];return yield*ce(this.pushToIndex(A,!1))}};var VQ=class{constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let A=0,t=this.lineStarts.length;for(;A>1;this.lineStarts[o]=0;)switch(i[e].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break A}for(;i[++e]?.type==="space";);return i.splice(e,i.length)}function UU(i){if(i.start.type==="flow-seq-start")for(let e of i.items)e.sep&&!e.value&&!$C(e.start,"explicit-key-ind")&&!$C(e.sep,"map-value-ind")&&(e.key&&(e.value=e.key),delete e.key,TU(e.value)?e.value.end?Array.prototype.push.apply(e.value.end,e.sep):e.value.end=e.sep:Array.prototype.push.apply(e.start,e.sep),delete e.sep)}var WQ=class{constructor(e){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new qQ,this.onNewLine=e}*parse(e,A=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let t of this.lexer.lex(e,A))yield*ce(this.next(t));A||(yield*ce(this.end()))}*next(e){if(this.source=e,this.atScalar){this.atScalar=!1,yield*ce(this.step()),this.offset+=e.length;return}let A=LU(e);if(A)if(A==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=A,yield*ce(this.step()),A){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+e.length);break;case"space":this.atNewLine&&e[0]===" "&&(this.indent+=e.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=e.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=e.length}else{let t=`Not a YAML token: ${e}`;yield*ce(this.pop({type:"error",offset:this.offset,message:t,source:e})),this.offset+=e.length}}*end(){for(;this.stack.length>0;)yield*ce(this.pop())}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let e=this.peek(1);if(this.type==="doc-end"&&e?.type!=="doc-end"){for(;this.stack.length>0;)yield*ce(this.pop());this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!e)return yield*ce(this.stream());switch(e.type){case"document":return yield*ce(this.document(e));case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*ce(this.scalar(e));case"block-scalar":return yield*ce(this.blockScalar(e));case"block-map":return yield*ce(this.blockMap(e));case"block-seq":return yield*ce(this.blockSequence(e));case"flow-collection":return yield*ce(this.flowCollection(e));case"doc-end":return yield*ce(this.documentEnd(e))}yield*ce(this.pop())}peek(e){return this.stack[this.stack.length-e]}*pop(e){let A=e??this.stack.pop();if(!A)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield A;else{let t=this.peek(1);switch(A.type==="block-scalar"?A.indent="indent"in t?t.indent:0:A.type==="flow-collection"&&t.type==="document"&&(A.indent=0),A.type==="flow-collection"&&UU(A),t.type){case"document":t.value=A;break;case"block-scalar":t.props.push(A);break;case"block-map":{let n=t.items[t.items.length-1];if(n.value){t.items.push({start:[],key:A,sep:[]}),this.onKeyLine=!0;return}else if(n.sep)n.value=A;else{Object.assign(n,{key:A,sep:[]}),this.onKeyLine=!n.explicitKey;return}break}case"block-seq":{let n=t.items[t.items.length-1];n.value?t.items.push({start:[],value:A}):n.value=A;break}case"flow-collection":{let n=t.items[t.items.length-1];!n||n.value?t.items.push({start:[],key:A,sep:[]}):n.sep?n.value=A:Object.assign(n,{key:A,sep:[]});return}default:yield*ce(this.pop()),yield*ce(this.pop(A))}if((t.type==="document"||t.type==="block-map"||t.type==="block-seq")&&(A.type==="block-map"||A.type==="block-seq")){let n=A.items[A.items.length-1];n&&!n.sep&&!n.value&&n.start.length>0&&KU(n.start)===-1&&(A.indent===0||n.start.every(o=>o.type!=="comment"||o.indent=e.indent){let t=!this.onKeyLine&&this.indent===e.indent,n=t&&(A.sep||A.explicitKey)&&this.type!=="seq-item-ind",o=[];if(n&&A.sep&&!A.value){let a=[];for(let r=0;re.indent&&(a.length=0);break;default:a.length=0}}a.length>=2&&(o=A.sep.splice(a[1]))}switch(this.type){case"anchor":case"tag":n||A.value?(o.push(this.sourceToken),e.items.push({start:o}),this.onKeyLine=!0):A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case"explicit-key-ind":!A.sep&&!A.explicitKey?(A.start.push(this.sourceToken),A.explicitKey=!0):n||A.value?(o.push(this.sourceToken),e.items.push({start:o,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(A.explicitKey)if(A.sep)if(A.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if($C(A.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]});else if(TU(A.key)&&!$C(A.sep,"newline")){let a=gB(A.start),r=A.key,s=A.sep;s.push(this.sourceToken),delete A.key,delete A.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:a,key:r,sep:s}]})}else o.length>0?A.sep=A.sep.concat(o,this.sourceToken):A.sep.push(this.sourceToken);else if($C(A.start,"newline"))Object.assign(A,{key:null,sep:[this.sourceToken]});else{let a=gB(A.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:a,key:null,sep:[this.sourceToken]}]})}else A.sep?A.value||n?e.items.push({start:o,key:null,sep:[this.sourceToken]}):$C(A.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):A.sep.push(this.sourceToken):Object.assign(A,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let a=this.flowScalar(this.type);n||A.value?(e.items.push({start:o,key:a,sep:[]}),this.onKeyLine=!0):A.sep?this.stack.push(a):(Object.assign(A,{key:a,sep:[]}),this.onKeyLine=!0);return}default:{let a=this.startBlockValue(e);if(a){if(a.type==="block-seq"){if(!A.explicitKey&&A.sep&&!$C(A.sep,"newline")){yield*ce(this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source}));return}}else t&&e.items.push({start:o});this.stack.push(a);return}}}}yield*ce(this.pop()),yield*ce(this.step())}*blockSequence(e){let A=e.items[e.items.length-1];switch(this.type){case"newline":if(A.value){let t="end"in A.value?A.value.end:void 0;(Array.isArray(t)?t[t.length-1]:void 0)?.type==="comment"?t?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else A.start.push(this.sourceToken);return;case"space":case"comment":if(A.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(A.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){Array.prototype.push.apply(n,A.start),n.push(this.sourceToken),e.items.pop();return}}A.start.push(this.sourceToken)}return;case"anchor":case"tag":if(A.value||this.indent<=e.indent)break;A.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;A.value||$C(A.start,"seq-item-ind")?e.items.push({start:[this.sourceToken]}):A.start.push(this.sourceToken);return}if(this.indent>e.indent){let t=this.startBlockValue(e);if(t){this.stack.push(t);return}}yield*ce(this.pop()),yield*ce(this.step())}*flowCollection(e){let A=e.items[e.items.length-1];if(this.type==="flow-error-end"){let t;do yield*ce(this.pop()),t=this.peek(1);while(t?.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!A||A.sep?e.items.push({start:[this.sourceToken]}):A.start.push(this.sourceToken);return;case"map-value-ind":!A||A.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):A.sep?A.sep.push(this.sourceToken):Object.assign(A,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!A||A.value?e.items.push({start:[this.sourceToken]}):A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let n=this.flowScalar(this.type);!A||A.value?e.items.push({start:[],key:n,sep:[]}):A.sep?this.stack.push(n):Object.assign(A,{key:n,sep:[]});return}case"flow-map-end":case"flow-seq-end":e.end.push(this.sourceToken);return}let t=this.startBlockValue(e);t?this.stack.push(t):(yield*ce(this.pop()),yield*ce(this.step()))}else{let t=this.peek(2);if(t.type==="block-map"&&(this.type==="map-value-ind"&&t.indent===e.indent||this.type==="newline"&&!t.items[t.items.length-1].sep))yield*ce(this.pop()),yield*ce(this.step());else if(this.type==="map-value-ind"&&t.type!=="flow-collection"){let n=wm(t),o=gB(n);UU(e);let a=e.end.splice(1,e.end.length);a.push(this.sourceToken);let r={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:o,key:e,sep:a}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=r}else yield*ce(this.lineEnd(e))}}flowScalar(e){if(this.onNewLine){let A=this.source.indexOf(` +`)+1;for(;A!==0;)this.onNewLine(this.offset+A),A=this.source.indexOf(` +`,A)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let A=wm(e),t=gB(A);return t.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:t,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let A=wm(e),t=gB(A);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:t,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,A){return this.type!=="comment"||this.indent<=A?!1:e.every(t=>t.type==="newline"||t.type==="space")}*documentEnd(e){this.type!=="doc-mode"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*ce(this.pop())))}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*ce(this.pop()),yield*ce(this.step());break;case"newline":this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*ce(this.pop()))}}};function maA(i){let e=i.prettyErrors!==!1;return{lineCounter:i.lineCounter||e&&new VQ||null,prettyErrors:e}}function JU(i,e={}){let{lineCounter:A,prettyErrors:t}=maA(e),n=new WQ(A?.addNewLine),o=new jQ(e),a=null;for(let r of o.compose(n.parse(i),!0,i.length))if(!a)a=r;else if(a.options.logLevel!=="silent"){a.errors.push(new Tg(r.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return t&&A&&(a.errors.forEach(Fb(i,A)),a.warnings.forEach(Fb(i,A))),a}function cB(i,e,A){let t;typeof e=="function"?t=e:A===void 0&&e&&typeof e=="object"&&(A=e);let n=JU(i,A);if(!n)return null;if(n.warnings.forEach(o=>em(n.options.logLevel,o)),n.errors.length>0){if(n.options.logLevel!=="silent")throw n.errors[0];n.errors=[]}return n.toJS(Object.assign({reviver:t},A))}function qb(i,e,A){let t=null;if(typeof e=="function"||Array.isArray(e)?t=e:A===void 0&&e&&(A=e),typeof A=="string"&&(A=A.length),typeof A=="number"){let n=Math.round(A);A=n<1?void 0:n>8?{indent:8}:{indent:n}}if(i===void 0){let{keepUndefined:n}=A??e??{};if(!n)return}return Ng(i)&&!t?i.toString(A):new U0(i,t,A).toString(A)}var jc=class i{static generateYamlFile(e,A,t,n,o=new Set){if(o.has(e.name))return;o.add(e.name);let a=e.isRoot?"root_agent.yaml":`${e.name}.yaml`,r=`${t}/${a}`,s=e.sub_agents?e.sub_agents.map(Q=>({config_path:`./${Q.name}.yaml`})):[],l={name:e.name,model:e.model,agent_class:e.agent_class,description:e.description||"",instruction:e.instruction,sub_agents:s,tools:i.buildToolsConfig(e.tools,n)};(!e.description||e.description.trim()==="")&&delete l.description,e.agent_class!="LlmAgent"&&(delete l.model,delete l.instruction,delete l.tools),e.agent_class==="LoopAgent"&&e.max_iterations&&(l.max_iterations=e.max_iterations);let g=i.buildCallbacksConfig(e.callbacks);Object.keys(g).length>0&&Object.assign(l,g);let C=qb(l),I=new Blob([C],{type:"application/x-yaml"}),B=new File([I],r,{type:"application/x-yaml"});A.append("files",B);for(let Q of e.sub_agents??[])i.generateYamlFile(Q,A,t,n,o);if(e.tools){for(let Q of e.tools)if(Q.toolType==="Agent Tool"){let h=Q.toolAgentName||Q.name;if(!h||h==="undefined"||h.trim()==="")continue;let f=n.get(h);f&&i.generateYamlFile(f,A,t,n,o)}}}static buildToolsConfig(e,A){return!e||e.length===0?[]:e.map(t=>{let n={name:t.name};if(t.toolType==="Agent Tool"){n.name="AgentTool";let o=t.toolAgentName||t.name;if(!o||o==="undefined"||o.trim()==="")return null;let a=A.get(o);return n.args={agent:{config_path:`./${o}.yaml`},skip_summarization:a?.skip_summarization||!1},n}return t.args&&Object.keys(t.args).some(a=>{let r=t.args[a];return r!=null&&r!==""})&&(n.args=t.args),n}).filter(t=>t!==null)}static buildCallbacksConfig(e){if(!e||e.length===0)return{};let A={};return e.forEach(t=>{let n=`${t.type}_callbacks`;A[n]||(A[n]=[]),A[n].push({name:t.name})}),A}};function DaA(i,e){i&1&&(d(0,"mat-hint",3),y(1," Start with a letter or underscore, and contain only letters, digits, and underscores. "),E())}var Dm=class i{constructor(e,A){this.data=e;this.dialogRef=A}newAppName="";agentService=w(Ys);_snackbarService=w(Uc);router=w(is);isNameValid(){let e=this.newAppName.trim();return!(!e||!/^[a-zA-Z_]/.test(e)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))}createNewApp(){let e=this.newAppName.trim();if(!this.isNameValid()){this._snackbarService.open("App name must start with a letter or underscore and can only contain letters, digits, and underscores.","OK");return}if(this.data.existingAppNames.includes(e)){this._snackbarService.open("App name already exists. Please choose a different name.","OK");return}let A={agent_class:"LlmAgent",instruction:"You are the root agent that coordinates other agents.",isRoot:!0,model:"gemini-2.5-flash",name:e,sub_agents:[],tools:[]},t=new FormData,n=new Map;jc.generateYamlFile(A,t,e,n),this.agentService.agentBuildTmp(e,t).subscribe(o=>{o?(this.router.navigate(["/"],{queryParams:{app:e,mode:"builder"}}).then(()=>{window.location.reload()}),this.dialogRef.close(!0)):this._snackbarService.open("Something went wrong, please try again","OK")})}static \u0275fac=function(A){return new(A||i)(ot(xo),ot(Vn))};static \u0275cmp=bA({type:i,selectors:[["app-add-item-dialog"]],decls:10,vars:3,consts:[["mat-dialog-title","",1,"new-app-title"],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],[1,"validation-hint"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click","disabled"]],template:function(A,t){A&1&&(d(0,"h2",0),y(1,"Create a new app"),E(),d(2,"mat-form-field",1)(3,"input",2),yi("ngModelChange",function(o){return hi(t.newAppName,o)||(t.newAppName=o),o}),T("keydown.enter",function(){return t.createNewApp()}),E(),Y(4,DaA,2,0,"mat-hint",3),E(),d(5,"mat-dialog-actions",4)(6,"button",5),y(7,"Cancel"),E(),d(8,"button",6),T("click",function(){return t.createNewApp()}),y(9," Create "),E()()),A&2&&(u(3),Di("ngModel",t.newAppName),u(),O(t.isNameValid()?-1:4),u(4),H("disabled",!t.isNameValid()))},dependencies:[na,To,Qa,cn,yn,vn,_o,pa,Si,OC,w1],styles:[".new-app-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-subhead-color)!important;font-family:Google Sans;font-size:24px}.validation-hint[_ngcontent-%COMP%]{font-size:12px;color:var(--mdc-dialog-supporting-text-color)}"]})};function CB(i,e,A){let t=typeof i=="string"?document.querySelector(i):i;if(!t)return;t.querySelectorAll("g.node").forEach(o=>{let a=o,s=o.querySelector("title")?.textContent||"";s==="__LEGEND__"||s==="__START__"||s==="__END__"||a.classList.contains("unvisited-node")||A&&!A.has(s)||(a.style.cursor="pointer",a.addEventListener("mouseenter",()=>{let l=o.querySelector("ellipse, polygon, path, rect");l&&(l.style.stroke="#42A5F5",l.style.strokeWidth="3")}),a.addEventListener("mouseleave",()=>{let l=o.querySelector("ellipse, polygon, path, rect");l&&(l.style.stroke="",l.style.strokeWidth="")}),e&&a.addEventListener("click",l=>{let C=o.querySelector("title")?.textContent||"";C&&e(C,l)}))})}function OU(i,e,A={}){let{ySpacing:t=200,xSpacing:n=350,startX:o=400,startY:a=100}=A,r=i.map(m=>m.name||m.agent?.name||""),s=new Map,l=new Map;r.forEach(m=>{s.set(m,[]),l.set(m,0)}),e.forEach(m=>{let v=m.from_node?.name||m.from_node?.agent?.name,S=m.to_node?.name||m.to_node?.agent?.name;v&&S&&(s.get(v)?.push(S),l.set(S,(l.get(S)||0)+1))});let g=new Map,C=[],I=new Map(l),B=new Set;for(r.forEach(m=>{I.get(m)===0&&(C.push(m),g.set(m,0),B.add(m))});C.length>0;){let m=C.shift(),v=g.get(m)||0;s.get(m)?.forEach(S=>{let k=g.get(S);if(k!==void 0&&k<=v)return;let M=v+1;k===void 0&&g.set(S,M);let x=I.get(S)||0;I.set(S,x-1),I.get(S)===0&&!B.has(S)&&(C.push(S),B.add(S))})}let Q=Math.max(...Array.from(g.values()),0);r.forEach(m=>{g.has(m)||(g.set(m,Q+1),Q++)});let h=new Map;g.forEach((m,v)=>{h.has(m)||h.set(m,[]),h.get(m)?.push(v)});let f=new Map;return i.forEach(m=>{let v=m.name||m.agent?.name||"",S=g.get(v)||0,k=h.get(S)||[],M=k.indexOf(v),x=k.length,F=(M-(x-1)/2)*n;f.set(v,{x:o+F,y:a+S*t})}),{levels:g,nodesByLevel:h,positions:f}}function Yg(i,e=""){return i?.name||i?.agent?.name||e}function HU(i){switch(i){case"start":return"play_arrow";case"function":return"code";case"tool":return"build";case"join":return"merge";default:return"smart_toy"}}function zU(i){switch(i){case"start":return"Start";case"function":return"Function";case"tool":return"Tool";case"join":return"Join";default:return"Agent"}}var ym={ySpacing:200,xSpacing:350,startX:400,startY:100};function PU(i){return i.map(e=>e.name).join("/")}function T0(i){return!!(i.graph||i.nodes||i.sub_agents&&i.sub_agents.length>0)}function Vb(i){return i.graph?.nodes?i.graph.nodes:i.nodes?i.nodes:[]}function IB(i,e){if(i.nodes){let A=i.nodes.find(t=>t.name===e);if(A)return A}if(i.graph?.nodes){let A=i.graph.nodes.find(t=>t.name===e);if(A)return A}if(i.sub_agents){let A=i.sub_agents.find(t=>t.name===e);if(A)return A}return null}function jU(i,e){let A=e.split("/"),t=[{name:i.name,data:i}],n=i;for(let o=1;oYg(l)===a);if(s)t.push({name:a,data:s}),n=s;else{console.warn(`Could not find node '${a}' in path '${e}'`);break}}return t}function yaA(i,e){i&1&&(d(0,"mat-icon",20),y(1,"chevron_right"),E())}function vaA(i,e){if(i&1){let A=rA();Y(0,yaA,2,0,"mat-icon",20),d(1,"button",21),T("click",function(){let n=G(A).$index,o=p(2);return K(o.navigateToLevel(n))}),y(2),E()}if(i&2){let A=e.$implicit,t=e.$index,n=p(2);O(t>0?0:-1),u(),xA("active",t===n.breadcrumbs().length-1),H("disabled",t===n.breadcrumbs().length-1),u(),Be(" ",A," ")}}function baA(i,e){if(i&1&&(d(0,"div",3)(1,"span"),y(2,"Agent Structure:"),E(),d(3,"button",19),y(4),E(),d(5,"mat-icon",20),y(6,"chevron_right"),E(),xe(7,vaA,3,5,null,null,Nr),E()),i&2){let A=p();u(4),iA(A.appName),u(3),Re(A.breadcrumbs())}}function MaA(i,e){i&1&&(d(0,"div",15),lA(1,"mat-spinner",22),d(2,"p"),y(3,"Loading agent structure..."),E()())}function SaA(i,e){if(i&1&&(d(0,"div",16)(1,"mat-icon",23),y(2,"error_outline"),E(),d(3,"p",24),y(4),E()()),i&2){let A=p();u(4),iA(A.errorMessage())}}function kaA(i,e){if(i&1){let A=rA();d(0,"div",25),T("wheel",function(n){G(A);let o=p();return K(o.onWheel(n))})("mousedown",function(n){G(A);let o=p();return K(o.onMouseDown(n))})("mousemove",function(n){G(A);let o=p();return K(o.onMouseMove(n))})("mouseup",function(){G(A);let n=p();return K(n.onMouseUp())})("mouseleave",function(){G(A);let n=p();return K(n.onMouseUp())}),E()}if(i&2){let A=p();H("innerHTML",A.renderedGraph(),fc)}}function _aA(i,e){i&1&&(d(0,"div",18)(1,"mat-icon",26),y(2,"account_tree"),E(),d(3,"p"),y(4,"Agent structure graph not available."),E()())}var vm=class i{appName;preloadedAppData;preloadedLightGraphSvg;preloadedDarkGraphSvg;startPath;close=new LA;agentService=w(Ys);graphService=w(Wd);sanitizer=w(as);themeService=w(jl);renderedGraph=mA(null);isLoading=mA(!0);errorMessage=mA(null);fullAppData=null;navigationStack=[];breadcrumbs=mA([]);isPanning=!1;wasDragging=!1;dragStartX=0;dragStartY=0;startPanX=0;startPanY=0;scale=1;translateX=0;translateY=0;lastMousedownTarget=null;onOverlayMouseDown(e){this.lastMousedownTarget=e.target}onBackdropClick(e){if(this.wasDragging||this.lastMousedownTarget&&(this.lastMousedownTarget.closest("svg")||this.lastMousedownTarget.closest(".overlay-header")||this.lastMousedownTarget.closest(".loading-container")||this.lastMousedownTarget.closest(".error-container")||this.lastMousedownTarget.closest(".no-graph-container")))return;let A=e.target;!A.closest("svg")&&!A.closest(".overlay-header")&&!A.closest(".loading-container")&&!A.closest(".error-container")&&!A.closest(".no-graph-container")&&this.close.emit()}ngOnInit(){this.loadAgentGraph()}loadAgentGraph(){if(this.isLoading.set(!0),this.errorMessage.set(null),this.renderedGraph.set(null),this.preloadedAppData){if(this.fullAppData=this.preloadedAppData,this.navigationStack=[{name:this.fullAppData.root_agent?.name||this.appName,data:this.fullAppData.root_agent}],this.startPath){let e=this.fullAppData.root_agent,A=this.startPath.split("/");for(let t of A){if(!t)continue;let n=IB(e,t);if(n)this.navigationStack.push({name:t,data:n}),e=n;else break}}this.updateBreadcrumbs(),this.renderCurrentLevel();return}this.agentService.getAppInfo(this.appName).subscribe({next:e=>{if(this.fullAppData=e,this.navigationStack=[{name:e.root_agent?.name||this.appName,data:e.root_agent}],this.startPath){let A=this.fullAppData.root_agent,t=this.startPath.split("/");for(let n of t){if(!n)continue;let o=IB(A,n);if(o)this.navigationStack.push({name:n,data:o}),A=o;else break}}this.updateBreadcrumbs(),this.renderCurrentLevel()},error:e=>{console.error("Error loading app data:",e),this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1)}})}renderCurrentLevel(){let e=this.themeService.currentTheme()==="dark",A=this.getCurrentPath(),t=e?this.preloadedDarkGraphSvg:this.preloadedLightGraphSvg,n=t?t[A]:null;if(n){this.renderedGraph.set(this.sanitizer.bypassSecurityTrustHtml(n)),this.isLoading.set(!1),setTimeout(()=>{let o=this.getExpandableNodes();CB(".svg-container",a=>{this.wasDragging||this.onNodeClick(a)},o),this.initializeSvgTransform()},50);return}this.agentService.getAppGraphImage(this.appName,e,A).subscribe({next:o=>Ie(this,null,function*(){try{if(!o?.dotSrc){this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1);return}let a=yield this.graphService.render(o.dotSrc);this.renderedGraph.set(this.sanitizer.bypassSecurityTrustHtml(a)),this.isLoading.set(!1),setTimeout(()=>{let r=this.getExpandableNodes();CB(".svg-container",s=>{this.wasDragging||this.onNodeClick(s)},r),this.initializeSvgTransform()},50)}catch(a){console.error("Error rendering graph:",a),this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1)}}),error:o=>{console.error("Error loading agent graph:",o),this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1)}})}getCurrentPath(){return this.navigationStack.length<=1?"":this.navigationStack.slice(1).map(e=>e.name).join("/")}updateBreadcrumbs(){this.breadcrumbs.set(this.navigationStack.map(e=>e.name))}onNodeClick(e){let A=this.navigationStack[this.navigationStack.length-1].data,t=IB(A,e);t&&T0(t)&&this.navigateIntoNode(e,t)}navigateIntoNode(e,A){this.navigationStack.push({name:e,data:A}),this.updateBreadcrumbs(),this.isLoading.set(!0),this.renderCurrentLevel()}navigateToLevel(e){e>=0&&e{let a=Yg(o);a!==t&&T0(o)&&e.add(a)}),e}getSvgElement(){return document.querySelector(".svg-container svg")}applyTransform(){let e=this.getSvgElement();e&&(e.style.transform=`translate(${this.translateX}px, ${this.translateY}px) scale(${this.scale})`)}initializeSvgTransform(){let e=this.getSvgElement(),A=document.querySelector(".svg-container");if(!e||!A)return;let t=e.getBoundingClientRect(),n=A.getBoundingClientRect(),o=48,a=(n.width-o)/t.width,r=(n.height-o)/t.height;this.scale=Math.min(1,a,r);let s=t.width*this.scale,l=t.height*this.scale;this.translateX=(n.width-s)/2,this.translateY=(n.height-l)/2,this.applyTransform(),requestAnimationFrame(()=>{e.classList.add("ready")})}onWheel(e){let A=document.querySelector(".svg-container"),t=this.getSvgElement();if(!A||!t)return;e.preventDefault();let n=Math.max(-100,Math.min(100,e.deltaY)),o=Math.pow(1.002,-n),a=this.scale*o,r=A.getBoundingClientRect(),s=e.clientX-r.left,l=e.clientY-r.top,g=(s-this.translateX)/this.scale,C=(l-this.translateY)/this.scale;this.translateX=s-g*a,this.translateY=l-C*a,this.scale=a,this.applyTransform()}onMouseDown(e){if(e.button!==0||!e.target.closest("svg"))return;this.isPanning=!0,this.wasDragging=!1,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.startPanX=e.clientX,this.startPanY=e.clientY;let t=this.getSvgElement();t&&(t.style.cursor="grabbing")}onMouseMove(e){if(this.isPanning){if(!this.wasDragging){let A=e.clientX-this.dragStartX,t=e.clientY-this.dragStartY;A*A+t*t>25&&(this.wasDragging=!0)}this.translateX+=e.clientX-this.startPanX,this.translateY+=e.clientY-this.startPanY,this.startPanX=e.clientX,this.startPanY=e.clientY,this.applyTransform()}}onMouseUp(){this.isPanning=!1;let e=this.getSvgElement();e&&(e.style.cursor=""),setTimeout(()=>{this.wasDragging=!1},50)}resetZoomPan(){this.initializeSvgTransform()}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-agent-structure-graph-dialog"]],inputs:{appName:"appName",preloadedAppData:"preloadedAppData",preloadedLightGraphSvg:"preloadedLightGraphSvg",preloadedDarkGraphSvg:"preloadedDarkGraphSvg",startPath:"startPath"},outputs:{close:"close"},decls:35,vars:2,consts:[[1,"overlay-backdrop"],[1,"overlay-panel",3,"mousedown","click"],[1,"overlay-header"],[1,"breadcrumb-container"],[2,"flex","1"],[1,"graph-legend"],[1,"legend-item"],[2,"color","#42A5F5","font-size","16px"],[2,"color","#9333EA","font-size","16px"],[2,"color","#10B981","font-size","16px"],[2,"color","#F59E0B","font-size","16px"],[2,"color","#6B7280","font-size","16px"],["mat-icon-button","","aria-label","Close",3,"click"],[1,"overlay-content"],[1,"graph-container"],[1,"loading-container"],[1,"error-container"],[1,"svg-container",3,"innerHTML"],[1,"no-graph-container"],["disabled","",1,"breadcrumb-item"],[1,"breadcrumb-separator"],[1,"breadcrumb-item",3,"click","disabled"],["diameter","50"],[1,"error-icon"],[1,"error-message"],[1,"svg-container",3,"wheel","mousedown","mousemove","mouseup","mouseleave","innerHTML"],[1,"large-icon"]],template:function(A,t){A&1&&(lA(0,"div",0),d(1,"div",1),T("mousedown",function(o){return t.onOverlayMouseDown(o)})("click",function(o){return t.onBackdropClick(o)}),d(2,"div",2),Y(3,baA,9,1,"div",3),lA(4,"span",4),d(5,"div",5)(6,"span",6)(7,"span",7),y(8,"\u2726"),E(),y(9," Agent"),E(),d(10,"span",6)(11,"span",8),y(12,"\u22B7"),E(),y(13," Workflow"),E(),d(14,"span",6)(15,"span",9),y(16,"\u0192"),E(),y(17," Function"),E(),d(18,"span",6)(19,"span",10),y(20,"\u2335"),E(),y(21," Join"),E(),d(22,"span",6)(23,"span",11),y(24,"\u{1F527}"),E(),y(25," Tool"),E()(),d(26,"button",12),T("click",function(){return t.close.emit()}),d(27,"mat-icon"),y(28,"close"),E()()(),d(29,"div",13)(30,"div",14),Y(31,MaA,4,0,"div",15)(32,SaA,5,1,"div",16)(33,kaA,1,1,"div",17)(34,_aA,5,0,"div",18),E()()()),A&2&&(u(3),O(t.renderedGraph()&&t.breadcrumbs().length>0?3:-1),u(28),O(t.isLoading()?31:t.errorMessage()?32:t.renderedGraph()?33:34))},dependencies:[si,Wi,vi,On,zt,zC,os],styles:["[_nghost-%COMP%]{display:block;position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center}.overlay-backdrop[_ngcontent-%COMP%]{position:absolute;inset:0;background-color:#000000b3}.overlay-panel[_ngcontent-%COMP%]{position:relative;width:100vw;height:100vh;display:flex;flex-direction:column;background-color:transparent;color:var(--mat-sys-on-surface);border-radius:0;overflow:hidden;box-shadow:none}.overlay-header[_ngcontent-%COMP%]{display:flex;align-items:center;height:48px;padding:0 16px;box-sizing:border-box;border-bottom:1px solid var(--mat-sys-outline-variant);background-color:var(--mat-sys-surface-container)}.overlay-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden}.graph-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-height:0}.agent-info[_ngcontent-%COMP%]{margin:0 0 8px;font-size:14px;color:var(--mdc-dialog-supporting-text-color)}.agent-info[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{font-weight:600;color:var(--mdc-dialog-supporting-text-color)}.svg-container[_ngcontent-%COMP%]{flex:1;position:relative;overflow:hidden;background-color:transparent}.svg-container[_ngcontent-%COMP%] svg{position:absolute;top:0;left:0;transform-origin:0 0;cursor:grab;border-radius:16px;box-shadow:0 4px 12px #0000004d}.svg-container[_ngcontent-%COMP%] svg>g.graph>polygon:first-child{fill:transparent!important;stroke:transparent!important}.svg-container[_ngcontent-%COMP%] svg{opacity:0;transition:opacity .1s ease-in-out}.svg-container[_ngcontent-%COMP%] svg.ready{opacity:1}.svg-container[_ngcontent-%COMP%] svg:active{cursor:grabbing}.dark-theme[_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg, .dark-theme [_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg{background-color:#0e172a}.light-theme[_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg, .light-theme [_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg{background-color:#f9fafc}.loading-container[_ngcontent-%COMP%], .error-container[_ngcontent-%COMP%], .no-graph-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:400px;padding:40px}.loading-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .error-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .no-graph-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-top:16px;font-size:14px;color:var(--mdc-dialog-supporting-text-color)}.error-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;color:#f44336}.error-message[_ngcontent-%COMP%]{color:#f44336!important}.large-icon[_ngcontent-%COMP%]{font-size:64px;width:64px;height:64px;color:var(--mdc-dialog-supporting-text-color);opacity:.6}.breadcrumb-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;margin-left:8px;padding:0;background-color:transparent;flex-wrap:wrap}.breadcrumb-item[_ngcontent-%COMP%]{background:none;border:none;padding:4px 8px;cursor:pointer;color:var(--mat-sys-primary);font-size:13px;border-radius:4px;transition:background-color .2s}.breadcrumb-item[_ngcontent-%COMP%]:hover:not(:disabled){background-color:var(--mat-sys-surface-container-high)}.breadcrumb-item[_ngcontent-%COMP%]:disabled, .breadcrumb-item.active[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);cursor:default;font-weight:600}.breadcrumb-separator[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:var(--mat-sys-on-surface-variant)}.graph-legend[_ngcontent-%COMP%]{display:flex;align-items:center;gap:16px;margin-right:16px;font-size:13px;color:var(--mat-sys-on-surface-variant);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:6px 16px;background-color:var(--mat-sys-surface-container-lowest)}.graph-legend[_ngcontent-%COMP%] .legend-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;font-weight:500}"]})};var xaA=["mat-internal-form-field",""],RaA=["*"],bm=(()=>{class i{labelPosition="after";static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["div","mat-internal-form-field",""]],hostAttrs:[1,"mdc-form-field","mat-internal-form-field"],hostVars:2,hostBindings:function(t,n){t&2&&xA("mdc-form-field--align-end",n.labelPosition==="before")},inputs:{labelPosition:"labelPosition"},attrs:xaA,ngContentSelectors:RaA,decls:1,vars:0,template:function(t,n){t&1&&(Nt(),Ve(0))},styles:[`.mat-internal-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-flex;align-items:center;vertical-align:middle}.mat-internal-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mat-internal-form-field>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end .mdc-form-field--align-end label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0} +`],encapsulation:2,changeDetection:0})}return i})();var NaA=["audioPlayer"],dB=class i{base64data=De("");audioPlayerRef=ko("audioPlayer");audioSrc="";constructor(){}ngOnChanges(e){e.base64data&&this.base64data()&&this.setAudioSource(this.base64data())}setAudioSource(e){e.startsWith("data:")||e.startsWith("http")||e.startsWith("blob:")?this.audioSrc=e:this.audioSrc=`data:audio/mpeg;base64,${e}`,this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.load()}play(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.play()}pause(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.pause()}stop(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&(this.audioPlayerRef().nativeElement.pause(),this.audioPlayerRef().nativeElement.currentTime=0)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-audio-player"]],viewQuery:function(A,t){A&1&&Xr(t.audioPlayerRef,NaA,5),A&2&&Er()},inputs:{base64data:[1,"base64data"]},features:[Zt],decls:3,vars:1,consts:[["audioPlayer",""],["controls","",3,"src"]],template:function(A,t){A&1&&(Dn(0,"div"),Jn(1,"audio",1,0),Tn()),A&2&&(u(),Ea("src",t.audioSrc))},styles:[".audio-player-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;padding:15px;border-radius:8px;box-shadow:0 2px 5px var(--audio-player-container-box-shadow-color);margin:20px auto;max-width:350px}audio[_ngcontent-%COMP%]{outline:none;border-radius:5px;width:350px}.custom-controls[_ngcontent-%COMP%]{margin-top:10px;display:flex;gap:10px}.custom-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:8px 15px;border:none;border-radius:5px;color:var(--audio-player-custom-controls-button-color);cursor:pointer;font-size:14px;transition:background-color .2s ease}"]})};function FaA(i,e){if(i&1){let A=rA();d(0,"div",0)(1,"div",4),y(2),E(),d(3,"button",5),T("click",function(){G(A);let n=p();return K(n.close())}),It(),d(4,"svg",6),lA(5,"path",7),E()()()}if(i&2){let A=p();u(),H("title",A.currentUrl),u(),iA(A.currentUrl)}}function LaA(i,e){if(i&1){let A=rA();d(0,"button",5),T("click",function(){G(A);let n=p();return K(n.close())}),It(),d(1,"svg",6),lA(2,"path",7),E()()}}function GaA(i,e){if(i&1){let A=rA();d(0,"button",8),T("click",function(){G(A);let n=p();return K(n.prevImage())}),It(),d(1,"svg",6),lA(2,"path",9),E()(),or(),d(3,"button",10),T("click",function(){G(A);let n=p();return K(n.nextImage())}),It(),d(4,"svg",6),lA(5,"path",11),E()(),or(),d(6,"div",12),y(7),E()}if(i&2){let A=p();H("disabled",A.currentIndex===0),u(3),H("disabled",A.currentIndex===A.images.length-1),u(4),ya("",A.currentIndex+1," / ",A.images.length)}}function KaA(i,e){if(i&1&&lA(0,"div",18),i&2){let A=p(3);H("ngStyle",A.getHighlightStyle())}}function UaA(i,e){if(i&1){let A=rA();d(0,"div",16),T("click",function(n){return n.stopPropagation()})("wheel",function(n){G(A);let o=p(2);return K(o.onWheel(n))})("mousedown",function(n){G(A);let o=p(2);return K(o.onMouseDown(n))})("mousemove",function(n){G(A);let o=p(2);return K(o.onMouseMove(n))})("mouseup",function(){G(A);let n=p(2);return K(n.onMouseUp())})("mouseleave",function(){G(A);let n=p(2);return K(n.onMouseUp())}),lA(1,"img",17),Y(2,KaA,1,1,"div",18),E()}if(i&2){let A=p(2);H("ngStyle",A.getTransformStyle()),u(),H("src",A.displayContent,so),u(),O(A.shouldShowHighlight()?2:-1)}}function TaA(i,e){i&1&&(d(0,"div",15),y(1," No image data provided. "),E())}function JaA(i,e){if(i&1){let A=rA();d(0,"div",13),T("click",function(){G(A);let n=p();return K(n.close())}),Y(1,UaA,3,3,"div",14),Y(2,TaA,2,0,"div",15),E()}if(i&2){let A=p();u(),O(A.displayContent?1:-1),u(),O(A.displayContent?-1:2)}}function YaA(i,e){if(i&1&&lA(0,"div",3),i&2){let A=p();H("innerHTML",A.displayContent,fc)}}var BB=class i{displayContent=null;isSvgContent=!1;images=[];currentIndex=0;currentUrl=null;urls=[];coordinates=[];scale=1;translateX=0;translateY=0;isDragging=!1;startX=0;startY=0;dialogRef=w(Vn);data=w(xo);safeValuesService=w(as);ngOnInit(){this.images=this.data.images||[],this.currentIndex=this.data.currentIndex||0,this.urls=this.data.urls||[],this.coordinates=this.data.coordinates||[],this.updateImage()}updateImage(){this.scale=1,this.translateX=0,this.translateY=0;let e=this.data.imageData,A="";this.images.length>0&&(e=this.images[this.currentIndex],A=this.urls[this.currentIndex]||""),this.currentUrl=A,this.processImageData(e)}getHighlightStyle(){let e=this.coordinates[this.currentIndex];return e?{left:`${e.x/1e3*100}%`,top:`${e.y/1e3*100}%`}:{}}shouldShowHighlight(){return!!this.coordinates[this.currentIndex]}processImageData(e){if(!e){this.displayContent=null,this.isSvgContent=!1;return}if(e.trim().includes("0&&(this.currentIndex--,this.updateImage())}onWheel(e){e.preventDefault();let A=.1;e.deltaY<0?this.scale+=A:this.scale=Math.max(.5,this.scale-A)}onMouseDown(e){this.isDragging=!0,this.startX=e.clientX-this.translateX,this.startY=e.clientY-this.translateY,e.preventDefault()}onMouseMove(e){this.isDragging&&(this.translateX=e.clientX-this.startX,this.translateY=e.clientY-this.startY)}onMouseUp(){this.isDragging=!1}getTransformStyle(){return{transform:`translate(${this.translateX}px, ${this.translateY}px) scale(${this.scale})`,transformOrigin:"center",cursor:this.isDragging?"grabbing":"grab",transition:this.isDragging?"none":"transform 0.1s ease"}}handleKeyDown(e){e.key==="ArrowLeft"?this.prevImage():e.key==="ArrowRight"&&this.nextImage()}close(){this.dialogRef.close()}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-view-image-dialog"]],hostBindings:function(A,t){A&1&&T("keydown",function(o){return t.handleKeyDown(o)},mc)},decls:6,vars:4,consts:[[1,"header-bar"],[1,"close-button"],[1,"image-wrapper"],[3,"innerHTML"],[1,"image-title",3,"title"],[1,"close-button",3,"click"],["xmlns","http://www.w3.org/2000/svg","viewBox","0 0 24 24","fill","currentColor","width","24px","height","24px"],["d","M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"],[1,"nav-button","prev-button",3,"click","disabled"],["d","M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"],[1,"nav-button","next-button",3,"click","disabled"],["d","M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"],[1,"image-counter"],[1,"image-wrapper",3,"click"],[1,"image-container",2,"position","relative","display","inline-block",3,"ngStyle"],[1,"no-image-placeholder"],[1,"image-container",2,"position","relative","display","inline-block",3,"click","wheel","mousedown","mousemove","mouseup","mouseleave","ngStyle"],["alt","Viewed Image",3,"src"],[1,"highlight-circle",3,"ngStyle"]],template:function(A,t){A&1&&(d(0,"div"),Y(1,FaA,6,2,"div",0)(2,LaA,3,0,"button",1),Y(3,GaA,8,4),Y(4,JaA,3,2,"div",2),Y(5,YaA,1,1,"div",3),E()),A&2&&(u(),O(t.currentUrl?1:2),u(2),O(t.images.length>1?3:-1),u(),O(t.isSvgContent?-1:4),u(),O(t.isSvgContent?5:-1))},dependencies:[nd],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;width:100vw;height:100vh;padding:0;overflow:hidden;background-color:#0009}.close-button[_ngcontent-%COMP%]{position:absolute;top:5px;right:10px;border:none;cursor:pointer;padding:8px;border-radius:50%;transition:background-color .2s ease;color:#fff;background:#00000080;display:flex;align-items:center;justify-content:center;margin-bottom:15px;z-index:30}.close-button[_ngcontent-%COMP%]:hover{background-color:#0000000d}.close-button[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{width:24px;height:24px;fill:currentColor}.image-wrapper[_ngcontent-%COMP%]{flex-grow:1;display:flex;justify-content:center;align-items:center;overflow:hidden}.image-wrapper[_ngcontent-%COMP%] img[_ngcontent-%COMP%], .image-wrapper[_ngcontent-%COMP%] .svg-container[_ngcontent-%COMP%]{max-width:100%;max-height:100%;object-fit:contain;border-radius:0}.no-image-placeholder[_ngcontent-%COMP%]{color:var(--trace-chart-trace-duration-color);font-style:italic;text-align:center;padding:20px}@media(max-width:1768px){.close-button[_ngcontent-%COMP%]{top:5px;right:5px;padding:5px}}.nav-button[_ngcontent-%COMP%]{position:absolute;top:50%;transform:translateY(-50%);background:#00000080;color:#fff;border:none;border-radius:50%;width:40px;height:40px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background-color .2s ease;z-index:10}.nav-button[_ngcontent-%COMP%]:hover:not(:disabled){background:#000000b3}.nav-button[_ngcontent-%COMP%]:disabled{opacity:.3;cursor:default}.nav-button[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{width:24px;height:24px;fill:currentColor}.prev-button[_ngcontent-%COMP%]{left:20px}.next-button[_ngcontent-%COMP%]{right:20px}.image-counter[_ngcontent-%COMP%]{position:absolute;bottom:20px;left:50%;transform:translate(-50%);background:#00000080;color:#fff;padding:4px 12px;border-radius:12px;font-size:14px;z-index:10}.header-bar[_ngcontent-%COMP%]{position:absolute;top:0;left:0;width:100%;background:#000000b3;color:#fff;z-index:20;display:flex;align-items:center;justify-content:center;padding:8px 40px;box-sizing:border-box}.image-title[_ngcontent-%COMP%]{font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:90%}.header-bar[_ngcontent-%COMP%] .close-button[_ngcontent-%COMP%]{position:absolute;top:50%;right:10px;transform:translateY(-50%);color:#fff;margin-bottom:0;background:transparent}.header-bar[_ngcontent-%COMP%] .close-button[_ngcontent-%COMP%]:hover{background-color:#ffffff1a}.highlight-circle[_ngcontent-%COMP%]{position:absolute;width:30px;height:30px;border-radius:50%;background-color:#ff000080;border:2px solid red;transform:translate(-50%,-50%);pointer-events:none;z-index:5}"]})};function OaA(i,e){i&1&&(d(0,"mat-icon",4),y(1,"image"),E())}function HaA(i,e){i&1&&(d(0,"mat-icon",4),y(1,"audiotrack"),E())}function zaA(i,e){i&1&&(d(0,"mat-icon",4),y(1,"movie"),E())}function PaA(i,e){i&1&&(d(0,"mat-icon",4),y(1,"description"),E())}function jaA(i,e){i&1&&(d(0,"mat-icon",4),y(1,"text_snippet"),E())}function qaA(i,e){if(i&1&&Y(0,PaA,2,0,"mat-icon",4)(1,jaA,2,0,"mat-icon",4),i&2){let A=p().$index,t=p();O(t.selectedArtifacts[A].mimeType==="text/html"?0:1)}}function VaA(i,e){i&1&&(d(0,"mat-icon",4),y(1,"insert_drive_file"),E())}function WaA(i,e){if(i&1&&(d(0,"mat-option",12),y(1),E()),i&2){let A=e.$implicit;H("value",A),u(),iA(A.versionId)}}function ZaA(i,e){if(i&1){let A=rA();d(0,"div",15)(1,"img",18),T("click",function(){G(A);let n=p().$index,o=p();return K(o.openViewImageDialog(o.selectedArtifacts[n].data))}),E()()}if(i&2){let A=p().$index,t=p();u(),H("src",t.selectedArtifacts[A].data??"",so)}}function XaA(i,e){if(i&1&&(d(0,"div",16),lA(1,"app-audio-player",19),E()),i&2){let A=p().$index,t=p();u(),H("base64data",t.selectedArtifacts[A].data)}}function $aA(i,e){if(i&1&&(d(0,"div",17),lA(1,"video",20),E()),i&2){let A=p().$index,t=p();u(),H("src",t.selectedArtifacts[A].data,so)}}function ArA(i,e){if(i&1){let A=rA();d(0,"div",21)(1,"mat-icon",23),y(2,"description"),E(),d(3,"a",24),T("click",function(){G(A);let n=p(2).$index,o=p();return K(o.openArtifact(o.selectedArtifacts[n].data,o.selectedArtifacts[n].mimeType))}),y(4," Preview in new tab "),E()()}}function erA(i,e){if(i&1&&(d(0,"div",22)(1,"pre",25),y(2),E()()),i&2){let A=p(2).$index,t=p();u(2),iA(t.getTextContent(t.selectedArtifacts[A].data))}}function trA(i,e){if(i&1&&Y(0,ArA,5,0,"div",21)(1,erA,3,1,"div",22),i&2){let A=p().$index,t=p();O(t.selectedArtifacts[A].mimeType==="text/html"?0:1)}}function irA(i,e){if(i&1){let A=rA();d(0,"div",1)(1,"div",2)(2,"div",3),Y(3,OaA,2,0,"mat-icon",4)(4,HaA,2,0,"mat-icon",4)(5,zaA,2,0,"mat-icon",4)(6,qaA,2,1)(7,VaA,2,0,"mat-icon",4),d(8,"button",5),T("click",function(){let n=G(A).$index,o=p();return K(o.openArtifact(o.selectedArtifacts[n].data,o.selectedArtifacts[n].mimeType))}),d(9,"span",6),y(10),E(),d(11,"mat-icon",7),y(12,"open_in_new"),E()()(),d(13,"div",8)(14,"div",9)(15,"span",10),y(16,"Version:"),E(),d(17,"mat-select",11),yi("ngModelChange",function(n){let o=G(A).$index,a=p();return hi(a.selectedArtifacts[o],n)||(a.selectedArtifacts[o]=n),K(n)}),T("selectionChange",function(n){let o=G(A).$index,a=p();return K(a.onArtifactVersionChange(n,o))}),xe(18,WaA,2,2,"mat-option",12,ni),E()(),d(20,"button",13),T("click",function(){let n=G(A).$index,o=p();return K(o.downloadArtifact(o.selectedArtifacts[n]))}),d(21,"mat-icon"),y(22,"file_download"),E()()()(),d(23,"div",14),Y(24,ZaA,2,1,"div",15)(25,XaA,2,1,"div",16)(26,$aA,2,1,"div",17)(27,trA,2,1),E()()}if(i&2){let A,t,n=e.$implicit,o=e.$index,a=p();u(3),O((A=a.selectedArtifacts[o].mediaType)===a.MediaType.IMAGE?3:A===a.MediaType.AUDIO?4:A===a.MediaType.VIDEO?5:A===a.MediaType.TEXT?6:7),u(5),H("matTooltip","Open in new tab"),u(2),iA(a.getArtifactName(n)),u(7),Di("ngModel",a.selectedArtifacts[o]),u(),Re(a.getSortedArtifactsFromId(n)),u(2),H("matTooltip","Download artifact"),u(4),O((t=a.selectedArtifacts[o].mediaType)===a.MediaType.IMAGE?24:t===a.MediaType.AUDIO?25:t===a.MediaType.VIDEO?26:t===a.MediaType.TEXT?27:-1)}}var nrA="default_artifact_name",J0=(o=>(o.IMAGE="image",o.AUDIO="audio",o.VIDEO="video",o.TEXT="text",o.UNSPECIFIED="unspecified",o))(J0||{});function Sm(i){let e=i.toLowerCase();for(let A of Object.values(J0))if(A!=="unspecified"&&e.startsWith(A+"/"))return A;return"unspecified"}function orA(i){return i?i.startsWith("image/"):!1}function arA(i){return i?i.startsWith("audio/"):!1}var Mm=class i{artifacts=De([]);selectedArtifacts=[];isArtifactAudio=arA;isArtifactImage=orA;MediaType=J0;downloadService=w(Vd);dialog=w(Ja);safeValuesService=w(as);ngOnChanges(e){if(e.artifacts){this.selectedArtifacts=[];for(let A of this.getDistinctArtifactIds())this.selectedArtifacts.push(this.getSortedArtifactsFromId(A)[0])}}downloadArtifact(e){this.downloadService.downloadBase64Data(e.data,e.mimeType,e.id)}getArtifactName(e){return e??nrA}getDistinctArtifactIds(){return[...new Set(this.artifacts().map(e=>e.id))]}getSortedArtifactsFromId(e){return this.artifacts().filter(A=>A.id===e).sort((A,t)=>t.versionId-A.versionId)}getTextContent(e){if(!e)return"";let A=e.indexOf(",");if(A===-1)return"";let t=e.substring(A+1);try{return atob(t)}catch(n){return"Failed to decode text content"}}onArtifactVersionChange(e,A){this.selectedArtifacts[A]=e.value}openViewImageDialog(e){if(!e||!e.startsWith("data:")||e.indexOf(";base64,")===-1)return;let A=this.dialog.open(BB,{maxWidth:"90vw",maxHeight:"90vh",data:{imageData:e}})}openArtifact(e,A){this.openBase64InNewTab(e,A)}openBase64InNewTab(e,A){this.safeValuesService.openBase64InNewTab(e,A)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-artifact-tab"]],inputs:{artifacts:[1,"artifacts"]},features:[Zt],decls:3,vars:0,consts:[[1,"artifact-container"],[1,"artifact-card"],[1,"artifact-card-header"],[1,"artifact-title-group"],[1,"artifact-icon"],[1,"artifact-title-link",3,"click","matTooltip"],[1,"title-text"],[1,"open-icon"],[1,"artifact-actions"],[1,"version-selector"],[1,"version-label"],["panelClass","compact-select-panel",1,"compact-select",3,"ngModelChange","selectionChange","ngModel"],[3,"value"],["mat-icon-button","",1,"compact-action-button",3,"click","matTooltip"],[1,"artifact-card-content"],[1,"preview-image-container"],[1,"preview-audio-container"],[1,"preview-video-container"],["alt","artifact.id",1,"preview-image",3,"click","src"],[3,"base64data"],["controls","",1,"preview-video",3,"src"],[1,"preview-html-container"],[1,"preview-text-container"],[1,"html-icon"],[1,"html-link",3,"click"],[1,"preview-text"]],template:function(A,t){A&1&&(d(0,"div",0),xe(1,irA,28,6,"div",1,ni),E()),A&2&&(u(),Re(t.getDistinctArtifactIds()))},dependencies:[zl,cn,vn,_o,Kr,vi,zt,dB,Zi],styles:[".artifact-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;padding:8px}.artifact-card[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-low);border-radius:8px;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 2px 8px #0000001a}.artifact-card-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;padding:6px 12px;background-color:var(--mat-sys-surface-container);flex-wrap:wrap;gap:8px}.artifact-title-group[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;flex:1;min-width:200px}.artifact-icon[_ngcontent-%COMP%]{color:var(--mat-sys-primary);font-size:20px;width:20px;height:20px}.artifact-title-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;border:none;background:none;padding:0;font-family:inherit;color:var(--mat-sys-on-surface);cursor:pointer;max-width:250px}.artifact-title-link[_ngcontent-%COMP%]:hover{color:var(--mat-sys-primary);text-decoration:underline}.artifact-title-link[_ngcontent-%COMP%]:focus{outline:2px solid var(--mat-sys-primary);outline-offset:2px;border-radius:2px}.title-text[_ngcontent-%COMP%]{font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.open-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;flex-shrink:0}.artifact-actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.version-selector[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.version-label[_ngcontent-%COMP%]{font-size:12px;color:var(--mat-sys-on-surface-variant);font-weight:500}.compact-select[_ngcontent-%COMP%]{width:50px;font-size:10px}.compact-select[_ngcontent-%COMP%] .mat-mdc-select-trigger{padding:2px 4px}.compact-select[_ngcontent-%COMP%] .mat-mdc-select-value{font-size:10px} .compact-select-panel{font-size:10px!important} .compact-select-panel .mat-mdc-option{font-size:10px!important;min-height:28px!important;padding:0 8px!important} .compact-select-panel .mat-mdc-option-pseudo-checkbox{transform:scale(.7)!important}.compact-action-button[_ngcontent-%COMP%]{width:32px;height:32px;display:flex;justify-content:center;align-items:center}.compact-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.artifact-card-content[_ngcontent-%COMP%]{padding:8px 12px;background-color:var(--mat-sys-surface-container-lowest)}.preview-image-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center}.preview-image[_ngcontent-%COMP%]{max-width:100%;max-height:300px;border-radius:8px;cursor:pointer}.preview-audio-container[_ngcontent-%COMP%]{width:100%}.preview-video-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center}.preview-video[_ngcontent-%COMP%]{max-width:100%;border-radius:8px}.preview-html-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;justify-content:center;padding:20px}.html-icon[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.html-link[_ngcontent-%COMP%]{color:var(--mat-sys-primary);text-decoration:underline;cursor:pointer;font-weight:500;font-size:14px}.html-link[_ngcontent-%COMP%]:hover{color:var(--mat-sys-primary-dark)}.preview-text-container[_ngcontent-%COMP%]{max-height:200px;overflow-y:auto;background:var(--mat-sys-surface-container-highest);padding:12px;border-radius:8px}.preview-text[_ngcontent-%COMP%]{margin:0;white-space:pre-wrap;font-family:Roboto Mono,monospace;font-size:12px;color:var(--mat-sys-on-surface)}"]})};var rrA=["input"],srA=["label"],lrA=["*"],Wb={color:"accent",clickAction:"check-indeterminate",disabledInteractive:!1},grA=new MA("mat-checkbox-default-options",{providedIn:"root",factory:()=>Wb}),ls=(function(i){return i[i.Init=0]="Init",i[i.Checked=1]="Checked",i[i.Unchecked=2]="Unchecked",i[i.Indeterminate=3]="Indeterminate",i})(ls||{}),Zb=class{source;checked},Og=(()=>{class i{_elementRef=w(se);_changeDetectorRef=w(wt);_ngZone=w(qe);_animationsDisabled=nn();_options=w(grA,{optional:!0});focus(){this._inputElement.nativeElement.focus()}_createChangeEvent(A){let t=new Zb;return t.source=this,t.checked=A,t}_getAnimationTargetElement(){return this._inputElement?.nativeElement}_animationClasses={uncheckedToChecked:"mdc-checkbox--anim-unchecked-checked",uncheckedToIndeterminate:"mdc-checkbox--anim-unchecked-indeterminate",checkedToUnchecked:"mdc-checkbox--anim-checked-unchecked",checkedToIndeterminate:"mdc-checkbox--anim-checked-indeterminate",indeterminateToChecked:"mdc-checkbox--anim-indeterminate-checked",indeterminateToUnchecked:"mdc-checkbox--anim-indeterminate-unchecked"};ariaLabel="";ariaLabelledby=null;ariaDescribedby;ariaExpanded;ariaControls;ariaOwns;_uniqueId;id;get inputId(){return`${this.id||this._uniqueId}-input`}required=!1;labelPosition="after";name=null;change=new LA;indeterminateChange=new LA;value;disableRipple=!1;_inputElement;_labelElement;tabIndex;color;disabledInteractive;_onTouched=()=>{};_currentAnimationClass="";_currentCheckState=ls.Init;_controlValueAccessorChangeFn=()=>{};_validatorChangeFn=()=>{};constructor(){w(io).load(rr);let A=w(new ks("tabindex"),{optional:!0});this._options=this._options||Wb,this.color=this._options.color||Wb.color,this.tabIndex=A==null?0:parseInt(A)||0,this.id=this._uniqueId=w(Bn).getId("mat-mdc-checkbox-"),this.disabledInteractive=this._options?.disabledInteractive??!1}ngOnChanges(A){A.required&&this._validatorChangeFn()}ngAfterViewInit(){this._syncIndeterminate(this.indeterminate)}get checked(){return this._checked}set checked(A){A!=this.checked&&(this._checked=A,this._changeDetectorRef.markForCheck())}_checked=!1;get disabled(){return this._disabled}set disabled(A){A!==this.disabled&&(this._disabled=A,this._changeDetectorRef.markForCheck())}_disabled=!1;get indeterminate(){return this._indeterminate()}set indeterminate(A){let t=A!=this._indeterminate();this._indeterminate.set(A),t&&(A?this._transitionCheckState(ls.Indeterminate):this._transitionCheckState(this.checked?ls.Checked:ls.Unchecked),this.indeterminateChange.emit(A)),this._syncIndeterminate(A)}_indeterminate=mA(!1);_isRippleDisabled(){return this.disableRipple||this.disabled}_onLabelTextChange(){this._changeDetectorRef.detectChanges()}writeValue(A){this.checked=!!A}registerOnChange(A){this._controlValueAccessorChangeFn=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorChangeFn=A}_transitionCheckState(A){let t=this._currentCheckState,n=this._getAnimationTargetElement();if(!(t===A||!n)&&(this._currentAnimationClass&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(t,A),this._currentCheckState=A,this._currentAnimationClass.length>0)){n.classList.add(this._currentAnimationClass);let o=this._currentAnimationClass;this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{n.classList.remove(o)},1e3)})}}_emitChangeEvent(){this._controlValueAccessorChangeFn(this.checked),this.change.emit(this._createChangeEvent(this.checked)),this._inputElement&&(this._inputElement.nativeElement.checked=this.checked)}toggle(){this.checked=!this.checked,this._controlValueAccessorChangeFn(this.checked)}_handleInputClick(){let A=this._options?.clickAction;!this.disabled&&A!=="noop"?(this.indeterminate&&A!=="check"&&Promise.resolve().then(()=>{this._indeterminate.set(!1),this.indeterminateChange.emit(!1)}),this._checked=!this._checked,this._transitionCheckState(this._checked?ls.Checked:ls.Unchecked),this._emitChangeEvent()):(this.disabled&&this.disabledInteractive||!this.disabled&&A==="noop")&&(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate)}_onInteractionEvent(A){A.stopPropagation()}_onBlur(){Promise.resolve().then(()=>{this._onTouched(),this._changeDetectorRef.markForCheck()})}_getAnimationClassForCheckStateTransition(A,t){if(this._animationsDisabled)return"";switch(A){case ls.Init:if(t===ls.Checked)return this._animationClasses.uncheckedToChecked;if(t==ls.Indeterminate)return this._checked?this._animationClasses.checkedToIndeterminate:this._animationClasses.uncheckedToIndeterminate;break;case ls.Unchecked:return t===ls.Checked?this._animationClasses.uncheckedToChecked:this._animationClasses.uncheckedToIndeterminate;case ls.Checked:return t===ls.Unchecked?this._animationClasses.checkedToUnchecked:this._animationClasses.checkedToIndeterminate;case ls.Indeterminate:return t===ls.Checked?this._animationClasses.indeterminateToChecked:this._animationClasses.indeterminateToUnchecked}return""}_syncIndeterminate(A){let t=this._inputElement;t&&(t.nativeElement.indeterminate=A)}_onInputClick(){this._handleInputClick()}_onTouchTargetClick(){this._handleInputClick(),this.disabled||this._inputElement.nativeElement.focus()}_preventBubblingFromLabel(A){A.target&&this._labelElement.nativeElement.contains(A.target)&&A.stopPropagation()}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-checkbox"]],viewQuery:function(t,n){if(t&1&&Yt(rrA,5)(srA,5),t&2){let o;oe(o=ae())&&(n._inputElement=o.first),oe(o=ae())&&(n._labelElement=o.first)}},hostAttrs:[1,"mat-mdc-checkbox"],hostVars:16,hostBindings:function(t,n){t&2&&(Ea("id",n.id),ee("tabindex",null)("aria-label",null)("aria-labelledby",null),go(n.color?"mat-"+n.color:"mat-accent"),xA("_mat-animation-noopable",n._animationsDisabled)("mdc-checkbox--disabled",n.disabled)("mat-mdc-checkbox-disabled",n.disabled)("mat-mdc-checkbox-checked",n.checked)("mat-mdc-checkbox-disabled-interactive",n.disabledInteractive))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],ariaExpanded:[2,"aria-expanded","ariaExpanded",Ee],ariaControls:[0,"aria-controls","ariaControls"],ariaOwns:[0,"aria-owns","ariaOwns"],id:"id",required:[2,"required","required",Ee],labelPosition:"labelPosition",name:"name",value:"value",disableRipple:[2,"disableRipple","disableRipple",Ee],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?void 0:dn(A)],color:"color",disabledInteractive:[2,"disabledInteractive","disabledInteractive",Ee],checked:[2,"checked","checked",Ee],disabled:[2,"disabled","disabled",Ee],indeterminate:[2,"indeterminate","indeterminate",Ee]},outputs:{change:"change",indeterminateChange:"indeterminateChange"},exportAs:["matCheckbox"],features:[Et([{provide:As,useExisting:Ga(()=>i),multi:!0},{provide:Mc,useExisting:i,multi:!0}]),Zt],ngContentSelectors:lrA,decls:15,vars:23,consts:[["checkbox",""],["input",""],["label",""],["mat-internal-form-field","",3,"click","labelPosition"],[1,"mdc-checkbox"],["aria-hidden","true",1,"mat-mdc-checkbox-touch-target",3,"click"],["type","checkbox",1,"mdc-checkbox__native-control",3,"blur","click","change","checked","indeterminate","disabled","id","required","tabIndex"],["aria-hidden","true",1,"mdc-checkbox__ripple"],["aria-hidden","true",1,"mdc-checkbox__background"],["focusable","false","viewBox","0 0 24 24",1,"mdc-checkbox__checkmark"],["fill","none","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-checkbox__checkmark-path"],[1,"mdc-checkbox__mixedmark"],["mat-ripple","","aria-hidden","true",1,"mat-mdc-checkbox-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-label",3,"for"]],template:function(t,n){if(t&1&&(Nt(),d(0,"div",3),T("click",function(a){return n._preventBubblingFromLabel(a)}),d(1,"div",4,0)(3,"div",5),T("click",function(){return n._onTouchTargetClick()}),E(),d(4,"input",6,1),T("blur",function(){return n._onBlur()})("click",function(){return n._onInputClick()})("change",function(a){return n._onInteractionEvent(a)}),E(),lA(6,"div",7),d(7,"div",8),It(),d(8,"svg",9),lA(9,"path",10),E(),or(),lA(10,"div",11),E(),lA(11,"div",12),E(),d(12,"label",13,2),Ve(14),E()()),t&2){let o=gi(2);H("labelPosition",n.labelPosition),u(4),xA("mdc-checkbox--selected",n.checked),H("checked",n.checked)("indeterminate",n.indeterminate)("disabled",n.disabled&&!n.disabledInteractive)("id",n.inputId)("required",n.required)("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex),ee("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby)("aria-describedby",n.ariaDescribedby)("aria-checked",n.indeterminate?"mixed":null)("aria-controls",n.ariaControls)("aria-disabled",n.disabled&&n.disabledInteractive?!0:null)("aria-expanded",n.ariaExpanded)("aria-owns",n.ariaOwns)("name",n.name)("value",n.value),u(7),H("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),u(),H("for",n.inputId)}},dependencies:[es,bm],styles:[`.mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:18px;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2);margin:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox:hover>.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:hover>.mat-mdc-checkbox-ripple>.mat-ripple-element{background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mat-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mat-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mat-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mat-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mat-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control+.mdc-checkbox__ripple{background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control{position:absolute;margin:0;padding:0;opacity:0;cursor:inherit;z-index:1;width:var(--mat-checkbox-state-layer-size, 40px);height:var(--mat-checkbox-state-layer-size, 40px);top:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2);right:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2);left:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox--disabled{cursor:default;pointer-events:none}.mdc-checkbox__background{display:inline-flex;position:absolute;align-items:center;justify-content:center;box-sizing:border-box;width:18px;height:18px;border:2px solid currentColor;border-radius:2px;background-color:rgba(0,0,0,0);pointer-events:none;will-change:background-color,border-color;transition:background-color 90ms cubic-bezier(0.4, 0, 0.6, 1),border-color 90ms cubic-bezier(0.4, 0, 0.6, 1);-webkit-print-color-adjust:exact;color-adjust:exact;border-color:var(--mat-checkbox-unselected-icon-color, var(--mat-sys-on-surface-variant));top:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2);left:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2)}.mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled .mdc-checkbox__background{border-color:var(--mat-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{background-color:var(--mat-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}@media(forced-colors: active){.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:checked)~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mat-checkbox-unselected-hover-icon-color, var(--mat-sys-on-surface));background-color:rgba(0,0,0,0)}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-hover-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-hover-icon-color, var(--mat-sys-primary))}.mdc-checkbox__native-control:focus:focus:not(:checked)~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mat-checkbox-unselected-focus-icon-color, var(--mat-sys-on-surface))}.mdc-checkbox__native-control:focus:focus:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-focus-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-focus-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:var(--mat-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{background-color:var(--mat-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}.mdc-checkbox__checkmark{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;opacity:0;transition:opacity 180ms cubic-bezier(0.4, 0, 0.6, 1);color:var(--mat-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__checkmark{color:CanvasText}}.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:var(--mat-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:GrayText}}.mdc-checkbox__checkmark-path{transition:stroke-dashoffset 180ms cubic-bezier(0.4, 0, 0.6, 1);stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.7833385;stroke-dasharray:29.7833385}.mdc-checkbox__mixedmark{width:100%;height:0;transform:scaleX(0) rotate(0deg);border-width:1px;border-style:solid;opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1);border-color:var(--mat-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__mixedmark{margin:0 1px}}.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:var(--mat-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:GrayText}}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background,.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background,.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background,.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background{animation-duration:180ms;animation-timing-function:linear}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-unchecked-checked-checkmark-path 180ms linear;transition:none}.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-checked-unchecked-checkmark-path 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark{animation:mdc-checkbox-checked-indeterminate-checkmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-checked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark{animation:mdc-checkbox-indeterminate-checked-checkmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-checked-mixedmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear;transition:none}.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{transition:border-color 90ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path{stroke-dashoffset:0}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark{transition:opacity 180ms cubic-bezier(0, 0, 0.2, 1),transform 180ms cubic-bezier(0, 0, 0.2, 1);opacity:1}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(-45deg)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark{transform:rotate(45deg);opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(0deg);opacity:1}@keyframes mdc-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:29.7833385}50%{animation-timing-function:cubic-bezier(0, 0, 0.2, 1)}100%{stroke-dashoffset:0}}@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{transform:scaleX(1)}}@keyframes mdc-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(0.4, 0, 1, 1);opacity:1;stroke-dashoffset:0}to{opacity:0;stroke-dashoffset:-29.7833385}}@keyframes mdc-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(45deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(45deg);opacity:0}to{transform:rotate(360deg);opacity:1}}@keyframes mdc-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(-45deg);opacity:0}to{transform:rotate(0deg);opacity:1}}@keyframes mdc-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(315deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;transform:scaleX(1);opacity:1}32.8%,100%{transform:scaleX(0);opacity:0}}.mat-mdc-checkbox{display:inline-block;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-touch-target,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__native-control,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__ripple,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-ripple::before,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__mixedmark{transition:none !important;animation:none !important}.mat-mdc-checkbox label{cursor:pointer}.mat-mdc-checkbox .mat-internal-form-field{color:var(--mat-checkbox-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-checkbox-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-checkbox-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-checkbox-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-checkbox-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-checkbox-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive{pointer-events:auto}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive input{cursor:default}.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{cursor:default;color:var(--mat-checkbox-disabled-label-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{color:GrayText}}.mat-mdc-checkbox label:empty{display:none}.mat-mdc-checkbox .mdc-checkbox__ripple{opacity:0}.mat-mdc-checkbox .mat-mdc-checkbox-ripple,.mdc-checkbox__ripple{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-checkbox .mat-mdc-checkbox-ripple:not(:empty),.mdc-checkbox__ripple:not(:empty){transform:translateZ(0)}.mat-mdc-checkbox-ripple .mat-ripple-element{opacity:.1}.mat-mdc-checkbox-touch-target{position:absolute;top:50%;left:50%;height:var(--mat-checkbox-touch-target-size, 48px);width:var(--mat-checkbox-touch-target-size, 48px);transform:translate(-50%, -50%);display:var(--mat-checkbox-touch-target-display, block)}.mat-mdc-checkbox .mat-mdc-checkbox-ripple::before{border-radius:50%}.mdc-checkbox__native-control:focus-visible~.mat-focus-indicator::before{content:""} +`],encapsulation:2,changeDetection:0})}return i})(),qU=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Og,Qi]})}return i})();var VU=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({})}return i})();var WU=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[VU,Gc,Qi]})}return i})();var CrA={google_search:"search",EnterpriseWebSearchTool:"web",VertexAiSearchTool:"search",FilesRetrieval:"find_in_page",load_memory:"memory",preload_memory:"memory",url_context:"link",VertexAiRagRetrieval:"find_in_page",exit_loop:"sync",get_user_choice:"how_to_reg",load_artifacts:"image",LongRunningFunctionTool:"data_object"};function EB(i,e){return e==="Agent Tool"?"smart_toy":e==="Built-in tool"?CrA[i]||"build":e==="Function tool"?"data_object":"build"}var Hg=class i{static toolMenuTooltips=new Map([["Function tool","Build custom tools for your specific ADK agent needs."],["Built-in tool","Ready-to-use functionality such as Google Search or code executors that provide agents with common capabilities. "],["Agent tool","A sub-agent that can be invoked as a tool by another agent."]]);static toolDetailedInfo=new Map([["Function tool",{shortDescription:"Build custom tools for your specific ADK agent needs.",detailedDescription:"The ADK framework automatically inspects your Python function's signature\u2014including its name, docstring, parameters, type hints, and default values\u2014to generate a schema. This schema is what the LLM uses to understand the tool's purpose, when to use it, and what arguments it requires.",docLink:"https://google.github.io/adk-docs/tools/function-tools/"}],["Agent tool",{shortDescription:"Wraps a sub-agent as a callable tool, enabling modular and hierarchical agent architectures.",detailedDescription:"Agent tools allow you to use one agent as a tool within another agent, creating powerful multi-agent workflows.",docLink:"https://google.github.io/adk-docs/agents/multi-agents/#c-explicit-invocation-agenttool"}]]);static callbackMenuTooltips=new Map([["before_agent","Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed."],["after_agent","Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes."],["before_model","Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow."],["after_model","Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent."],["before_tool","Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it."],["after_tool","Called just after the tool's run_async method completes successfully."]]);static callbackDialogTooltips=new Map([["before_agent","Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed."],["after_agent","Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes."],["before_model","Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow."],["after_model","Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent."],["before_tool","Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it."],["after_tool","Called just after the tool's run_async method completes successfully."]]);static callbackDetailedInfo=new Map([["before_agent",{shortDescription:"Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed. It runs after the agent's InvocationContext is created but before its core logic begins.",detailedDescription:" Ideal for setting up resources or state needed only for this specific agent's run, performing validation checks on the session state (callback_context.state) before execution starts, logging the entry point of the agent's activity, or potentially modifying the invocation context before the core logic uses it.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-agent-callback"}],["after_agent",{shortDescription:"Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes.",detailedDescription:"Useful for cleanup tasks, post-execution validation, logging the completion of an agent's activity, modifying final state, or augmenting/replacing the agent's final output.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-agent-callback"}],["before_model",{shortDescription:"Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow.",detailedDescription:"Allows inspection and modification of the request going to the LLM. Use cases include adding dynamic instructions, injecting few-shot examples based on state, modifying model config, implementing guardrails (like profanity filters), or implementing request-level caching.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-model-callback"}],["after_model",{shortDescription:"Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent.",detailedDescription:"Allows inspection or modification of the raw LLM response.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-model-callback"}],["before_tool",{shortDescription:"Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it.",detailedDescription:"Allows inspection and modification of tool arguments, performing authorization checks before execution, logging tool usage attempts, or implementing tool-level caching.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-tool-callback"}],["after_tool",{shortDescription:"Called just after the tool's run_async method completes successfully.",detailedDescription:"Allows inspection and modification of the tool's result before it's sent back to the LLM (potentially after summarization). Useful for logging tool results, post-processing or formatting results, or saving specific parts of the result to the session state.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-tool-callback"}]]);static getToolMenuTooltips(e){return i.toolMenuTooltips.get(e)}static getToolDetailedInfo(e){return i.toolDetailedInfo.get(e)}static getCallbackMenuTooltips(e){return i.callbackMenuTooltips.get(e)}static getCallbackDialogTooltips(e){return i.callbackDialogTooltips.get(e)}static getCallbackDetailedInfo(e){return i.callbackDetailedInfo.get(e)}};var IrA=["callbackNameInput"];function drA(i,e){if(i&1){let A=rA();Il(0),d(1,"div",8)(2,"div",9),T("click",function(){G(A);let n=p();return K(n.toggleCallbackInfo())}),d(3,"mat-icon",10),y(4,"info"),E(),d(5,"div",11)(6,"span"),y(7,"Callback Information"),E()(),d(8,"button",12)(9,"mat-icon"),y(10),E()()(),d(11,"div",13)(12,"div",14)(13,"div",15),y(14),E(),d(15,"div",16),y(16),E()(),d(17,"div",17)(18,"a",18)(19,"mat-icon"),y(20,"open_in_new"),E(),d(21,"span"),y(22,"View Official Documentation"),E()()()()(),dl()}if(i&2){let A,t,n,o=p();u(10),iA(o.isCallbackInfoExpanded?"expand_less":"expand_more"),u(),xA("expanded",o.isCallbackInfoExpanded),u(3),iA((A=o.getCallbackInfo())==null?null:A.shortDescription),u(2),iA((t=o.getCallbackInfo())==null?null:t.detailedDescription),u(2),H("href",(n=o.getCallbackInfo())==null?null:n.docLink,so)}}function BrA(i,e){if(i&1&&(d(0,"mat-option",21),y(1),E()),i&2){let A=e.$implicit;H("value",A),u(),iA(A)}}function ErA(i,e){if(i&1){let A=rA();Il(0),d(1,"mat-form-field",3)(2,"mat-label"),y(3,"Callback Type"),E(),d(4,"mat-select",19),yi("ngModelChange",function(n){G(A);let o=p();return hi(o.callbackType,n)||(o.callbackType=n),K(n)}),yt(5,BrA,2,2,"mat-option",20),E()(),dl()}if(i&2){let A=p();u(4),Di("ngModel",A.callbackType),u(),H("ngForOf",A.availableCallbackTypes)}}function hrA(i,e){i&1&&(d(0,"mat-error"),y(1,"Same callback name has been used"),E())}function QrA(i,e){i&1&&(d(0,"mat-error"),y(1,"Cannot have callback consist of two words"),E())}function urA(i,e){i&1&&(d(0,"mat-error"),y(1,"Callback function names cannot have spaces"),E())}var Xb=class{isErrorState(e){return!!(e&&e.invalid)}},ZQ=class i{constructor(e,A){this.dialogRef=e;this.data=A;this.callbackType=A?.callbackType??"",this.existingCallbackNames=A?.existingCallbackNames??[],this.isEditMode=!!A?.isEditMode,this.availableCallbackTypes=A?.availableCallbackTypes??[],this.isEditMode&&A?.callback&&(this.callbackName=A.callback.name,this.callbackType=A.callback.type,this.originalCallbackName=A.callback.name,this.existingCallbackNames=this.existingCallbackNames.filter(t=>t!==this.originalCallbackName))}callbackNameInput;callbackName="";callbackType="";existingCallbackNames=[];matcher=new Xb;isEditMode=!1;availableCallbackTypes=[];originalCallbackName="";isCallbackInfoExpanded=!1;addCallback(){if(!this.callbackName.trim()||this.hasSpaces()||this.isDuplicateName())return;let e={name:this.callbackName.trim(),type:this.callbackType,isEditMode:this.isEditMode,originalName:this.originalCallbackName||this.callbackName.trim()};this.dialogRef.close(e)}cancel(){this.dialogRef.close()}isDuplicateName(){if(!Array.isArray(this.existingCallbackNames))return!1;let e=(this.callbackName||"").trim();return this.existingCallbackNames.includes(e)}hasSpaces(){return/\s/.test(this.callbackName||"")}createDisabled(){return!this.callbackName.trim()||this.isDuplicateName()||this.hasSpaces()}validate(){this.hasSpaces()?this.callbackNameInput.control.setErrors({hasSpaces:!0}):this.isDuplicateName()?this.callbackNameInput.control.setErrors({duplicateName:!0}):this.callbackNameInput.control.setErrors(null)}getCallbackInfo(){return Hg.getCallbackDetailedInfo(this.callbackType)}toggleCallbackInfo(){this.isCallbackInfoExpanded=!this.isCallbackInfoExpanded}static \u0275fac=function(A){return new(A||i)(ot(Vn),ot(xo))};static \u0275cmp=bA({type:i,selectors:[["app-add-callback-dialog"]],viewQuery:function(A,t){if(A&1&&Yt(IrA,5),A&2){let n;oe(n=ae())&&(t.callbackNameInput=n.first)}},decls:18,vars:10,consts:[["callbackNameInput","ngModel"],["mat-dialog-title",""],[4,"ngIf"],[2,"width","100%"],["matInput","",3,"ngModelChange","keydown.enter","ngModel","errorStateMatcher"],["align","end"],["mat-button","",3,"click"],["mat-raised-button","","color","secondary",3,"click","disabled"],[1,"callback-info-container"],[1,"callback-info-header",3,"click"],[1,"callback-info-icon"],[1,"callback-info-title"],["mat-icon-button","","type","button","aria-label","Toggle callback information",1,"callback-info-toggle"],[1,"callback-info-body"],[1,"callback-info-content"],[1,"callback-info-short"],[1,"callback-info-detailed"],[1,"callback-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"callback-info-link",3,"href"],[3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]],template:function(A,t){if(A&1){let n=rA();d(0,"h2",1),y(1),E(),d(2,"mat-dialog-content"),yt(3,drA,23,6,"ng-container",2)(4,ErA,6,2,"ng-container",2),d(5,"mat-form-field",3)(6,"mat-label"),y(7,"Callback Name"),E(),d(8,"input",4,0),yi("ngModelChange",function(a){return G(n),hi(t.callbackName,a)||(t.callbackName=a),K(a)}),T("ngModelChange",function(){return t.validate()})("keydown.enter",function(){return t.addCallback()}),E(),yt(10,hrA,2,0,"mat-error",2)(11,QrA,2,0,"mat-error",2)(12,urA,2,0,"mat-error",2),E()(),d(13,"mat-dialog-actions",5)(14,"button",6),T("click",function(){return t.cancel()}),y(15,"Cancel"),E(),d(16,"button",7),T("click",function(){return t.addCallback()}),y(17),E()()}if(A&2){let n=gi(9);u(),iA(t.isEditMode?"Edit Callback":"Add "+t.callbackType+" Callback"),u(2),H("ngIf",t.getCallbackInfo()),u(),H("ngIf",t.isEditMode),u(4),Di("ngModel",t.callbackName),H("errorStateMatcher",t.matcher),u(2),H("ngIf",n.hasError("duplicateName")),u(),H("ngIf",n.hasError("hasSpaces")),u(),H("ngIf",n.hasError("hasSpaces")),u(4),H("disabled",t.createDisabled()),u(),Be(" ",t.isEditMode?"Save":"Add"," ")}},dependencies:[si,id,Ll,cn,yn,vn,_o,hl,na,pa,ua,Wi,Si,vi,Ta,To,us,yy,Gs,Qa,N0,zl,Kr,On,zt],styles:[".callback-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;min-width:400px;max-width:600px}.full-width[_ngcontent-%COMP%]{width:100%}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}mat-dialog-actions[_ngcontent-%COMP%]{padding:16px 24px;margin:0}mat-form-field[_ngcontent-%COMP%]{margin-top:8px!important}.callback-info-container[_ngcontent-%COMP%]{border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.callback-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.callback-info-header[_ngcontent-%COMP%]:hover .callback-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.callback-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.callback-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.callback-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.callback-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.callback-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.callback-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.callback-info-content[_ngcontent-%COMP%]{flex:1}.callback-info-short[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-dialog-content-text-color);margin-bottom:8px;line-height:1.4}.callback-info-detailed[_ngcontent-%COMP%]{color:var(--mat-dialog-content-text-color);font-size:14px;line-height:1.5;opacity:.8}.callback-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.callback-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.callback-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.callback-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};function prA(i,e){if(i&1){let A=rA();Il(0),d(1,"div",6)(2,"div",7),T("click",function(){G(A);let n=p();return K(n.toggleToolInfo())}),d(3,"mat-icon",8),y(4,"info"),E(),d(5,"div",9)(6,"span"),y(7,"Tool Information"),E()(),d(8,"button",10)(9,"mat-icon"),y(10),E()()(),d(11,"div",11)(12,"div",12)(13,"div",13),y(14),E(),d(15,"div",14),y(16),E()(),d(17,"div",15)(18,"a",16)(19,"mat-icon"),y(20,"open_in_new"),E(),d(21,"span"),y(22,"View Official Documentation"),E()()()()(),dl()}if(i&2){let A,t,n,o=p();u(10),iA(o.isToolInfoExpanded?"expand_less":"expand_more"),u(),xA("expanded",o.isToolInfoExpanded),u(3),iA((A=o.getToolInfo())==null?null:A.shortDescription),u(2),iA((t=o.getToolInfo())==null?null:t.detailedDescription),u(2),H("href",(n=o.getToolInfo())==null?null:n.docLink,so)}}function frA(i,e){if(i&1){let A=rA();d(0,"mat-form-field",2)(1,"input",17),yi("ngModelChange",function(n){G(A);let o=p();return hi(o.toolName,n)||(o.toolName=n),K(n)}),T("keydown.enter",function(){G(A);let n=p();return K(n.addTool())}),E()()}if(i&2){let A=p();u(),Di("ngModel",A.toolName)}}function mrA(i,e){if(i&1&&(d(0,"mat-option",20),y(1),E()),i&2){let A=e.$implicit;H("value",A),u(),Be(" ",A," ")}}function wrA(i,e){if(i&1){let A=rA();d(0,"mat-form-field",2)(1,"mat-select",18),yi("ngModelChange",function(n){G(A);let o=p();return hi(o.selectedBuiltInTool,n)||(o.selectedBuiltInTool=n),K(n)}),yt(2,mrA,2,2,"mat-option",19),E()()}if(i&2){let A=p();u(),Di("ngModel",A.selectedBuiltInTool),u(),H("ngForOf",A.builtInTools)}}var A2=class i{constructor(e,A){this.data=e;this.dialogRef=A}toolName="";toolType="Function tool";selectedBuiltInTool="google_search";builtInTools=["EnterpriseWebSearchTool","exit_loop","FilesRetrieval","get_user_choice","google_search","load_artifacts","load_memory","LongRunningFunctionTool","preload_memory","url_context","VertexAiRagRetrieval","VertexAiSearchTool"];isEditMode=!1;isToolInfoExpanded=!1;ngOnInit(){this.toolType=this.data.toolType,this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName&&(this.toolType==="Function tool"?this.toolName=this.data.toolName:this.toolType==="Built-in tool"&&(this.selectedBuiltInTool=this.data.toolName))}addTool(){if(this.toolType==="Function tool"&&!this.toolName.trim())return;let e={toolType:this.toolType,isEditMode:this.isEditMode};this.toolType==="Function tool"?e.name=this.toolName.trim():this.toolType==="Built-in tool"&&(e.name=this.selectedBuiltInTool),this.dialogRef.close(e)}cancel(){this.dialogRef.close()}createDisabled(){return this.toolType==="Function tool"&&!this.toolName.trim()}getToolInfo(){return Hg.getToolDetailedInfo(this.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \u0275fac=function(A){return new(A||i)(ot(xo),ot(Vn))};static \u0275cmp=bA({type:i,selectors:[["app-add-tool-dialog"]],decls:11,vars:6,consts:[["mat-dialog-title","",1,"dialog-title"],[4,"ngIf"],[2,"width","100%"],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click","disabled"],[1,"tool-info-container"],[1,"tool-info-header",3,"click"],[1,"tool-info-icon"],[1,"tool-info-title"],["mat-icon-button","","type","button","aria-label","Toggle tool information",1,"tool-info-toggle"],[1,"tool-info-body"],[1,"tool-info-content"],[1,"tool-info-short"],[1,"tool-info-detailed"],[1,"tool-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"tool-info-link",3,"href"],["matInput","","placeholder","Enter full function name",3,"ngModelChange","keydown.enter","ngModel"],["placeholder","Select built-in tool",3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]],template:function(A,t){A&1&&(d(0,"h2",0),y(1),E(),d(2,"mat-dialog-content"),yt(3,prA,23,6,"ng-container",1),Y(4,frA,2,1,"mat-form-field",2),Y(5,wrA,3,2,"mat-form-field",2),E(),d(6,"mat-dialog-actions",3)(7,"button",4),T("click",function(){return t.cancel()}),y(8,"Cancel"),E(),d(9,"button",5),T("click",function(){return t.addTool()}),y(10),E()()),A&2&&(u(),iA(t.isEditMode?"Editing Tool":"Add New Tool"),u(2),H("ngIf",t.getToolInfo()),u(),O(t.toolType==="Function tool"?4:-1),u(),O(t.toolType==="Built-in tool"?5:-1),u(4),H("disabled",t.createDisabled()),u(),Be(" ",t.isEditMode?"Save":"Create"," "))},dependencies:[si,id,Ll,cn,yn,vn,_o,na,ua,To,Qa,zl,Kr,pa,Si,vi,zt],styles:[".dialog-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;font-family:Google Sans;font-size:24px}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}.tool-info-container[_ngcontent-%COMP%]{border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:#e3e3e3;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:#c4c7ca;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};function Zo(i){return Array.isArray(i)}function oa(i){return i!==null&&typeof i=="object"&&(i.constructor===void 0||i.constructor.name==="Object")}function $b(i){return i&&typeof i=="object"?i.op==="add":!1}function A7(i){return i&&typeof i=="object"?i.op==="remove":!1}function km(i){return i&&typeof i=="object"?i.op==="replace":!1}function _m(i){return i&&typeof i=="object"?i.op==="copy":!1}function e2(i){return i&&typeof i=="object"?i.op==="move":!1}function ZU(i,e){return JSON.stringify(i)===JSON.stringify(e)}function DrA(i,e){return i===e}function e7(i){return i.slice(0,i.length-1)}function XU(i){return i[i.length-1]}function $U(i,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:DrA;if(i.length{e[A]=i[A]}),e}if(oa(i)){let e=oA({},i);return Object.getOwnPropertySymbols(i).forEach(A=>{e[A]=i[A]}),e}return i}function n7(i,e,A){if(i[e]===A)return i;let t=i7(i);return t[e]=A,t}function Ze(i,e){let A=i,t=0;for(;t3&&arguments[3]!==void 0?arguments[3]:!1;if(e.length===0)return A;let n=e[0],o=Ur(i?i[n]:void 0,e.slice(1),A,t);if(oa(i)||Zo(i))return n7(i,n,o);if(t){let a=yrA.test(n)?[]:{};return a[n]=o,a}throw new Error("Path does not exist")}var yrA=/^\d+$/;function XQ(i,e,A){if(e.length===0)return A(i);if(!t7(i))throw new Error("Path doesn't exist");let t=e[0],n=XQ(i[t],e.slice(1),A);return n7(i,t,n)}function P1(i,e){if(e.length===0)return i;if(!t7(i))throw new Error("Path does not exist");if(e.length===1){let n=e[0];if(!(n in i))return i;let o=i7(i);return Zo(o)&&o.splice(Number.parseInt(n),1),oa(o)&&delete o[n],o}let A=e[0],t=P1(i[A],e.slice(1));return n7(i,A,t)}function $Q(i,e,A){let t=e.slice(0,e.length-1),n=e[e.length-1];return XQ(i,t,o=>{if(!Array.isArray(o))throw new TypeError(`Array expected at path ${JSON.stringify(t)}`);let a=i7(o);return a.splice(Number.parseInt(n),0,A),a})}function wr(i,e){return i===void 0?!1:e.length===0?!0:i===null?!1:wr(i[e[0]],e.slice(1))}function gs(i){let e=i.split("/");return e.shift(),e.map(A=>A.replace(/~1/g,"/").replace(/~0/g,"~"))}function bt(i){return i.map(AT).join("")}function AT(i){return`/${String(i).replace(/~/g,"~0").replace(/\//g,"~1")}`}function A4(i,e){return i+AT(e)}function Ps(i,e,A){let t=i;for(let n=0;n{let r,s=js(o,a.path);if(a.op==="add")r=iT(o,s);else if(a.op==="remove")r=tT(o,s);else if(a.op==="replace")r=eT(o,s);else if(a.op==="copy")r=NrA(o,s);else if(a.op==="move")r=FrA(o,s,e4(a.from));else if(a.op==="test")r=[];else throw new Error(`Unknown JSONPatch operation ${JSON.stringify(a)}`);let l;if(A?.before){let g=A.before(o,a,r);if(g?.revertOperations&&(r=g.revertOperations),g?.document&&(l=g.document),g?.json)throw new Error('Deprecation warning: returned object property ".json" has been renamed to ".document"')}if(t=r.concat(t),l!==void 0)return{document:l}}}),t}function eT(i,e){return wr(i,e)?[{op:"replace",path:bt(e),value:Ze(i,e)}]:[]}function tT(i,e){return[{op:"add",path:bt(e),value:Ze(i,e)}]}function iT(i,e){return hB(i,e)||!wr(i,e)?[{op:"remove",path:bt(e)}]:eT(i,e)}function NrA(i,e){return iT(i,e)}function FrA(i,e,A){if(e.length="0"&&i<="9"}function rT(i){return i>=" "}function t4(i){return`,:[]/{}() ++`.includes(i)}function r7(i){return i>="a"&&i<="z"||i>="A"&&i<="Z"||i==="_"||i==="$"}function s7(i){return i>="a"&&i<="z"||i>="A"&&i<="Z"||i==="_"||i==="$"||i>="0"&&i<="9"}var l7=/^(http|https|ftp|mailto|file|data|irc):\/\/$/,g7=/^[A-Za-z0-9-._~:/?#@!$&'()*+;=]$/;function c7(i){return`,[]/{} ++`.includes(i)}function C7(i){return i4(i)||PrA.test(i)}var PrA=/^[[{\w-]$/;function sT(i){return i===` +`||i==="\r"||i===" "||i==="\b"||i==="\f"}function t2(i,e){let A=i.charCodeAt(e);return A===32||A===10||A===9||A===13}function lT(i,e){let A=i.charCodeAt(e);return A===32||A===9||A===13}function gT(i,e){let A=i.charCodeAt(e);return A===160||A===6158||A>=8192&&A<=8203||A===8239||A===8287||A===12288||A===65279}function i4(i){return I7(i)||Fm(i)}function I7(i){return i==='"'||i==="\u201C"||i==="\u201D"}function d7(i){return i==='"'}function Fm(i){return i==="'"||i==="\u2018"||i==="\u2019"||i==="`"||i==="\xB4"}function B7(i){return i==="'"}function QB(i,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,t=i.lastIndexOf(e);return t!==-1?i.substring(0,t)+(A?"":i.substring(t+1)):i}function Zl(i,e){let A=i.length;if(!t2(i,A-1))return i+e;for(;t2(i,A-1);)A--;return i.substring(0,A)+e+i.substring(A)}function cT(i,e,A){return i.substring(0,e)+i.substring(e+A)}function CT(i){return/[,\n][ \t\r]*$/.test(i)}var jrA={"\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},qrA={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:` +`,r:"\r",t:" "};function Xl(i){let e=0,A="";l(["```","[```","{```"]),o()||wA(),l(["```","```]","```}"]);let n=C(",");for(n&&a(),C7(i[e])&&CT(A)?(n||(A=Zl(A,",")),m()):n&&(A=QB(A,","));i[e]==="}"||i[e]==="]";)e++,a();if(e>=i.length)return A;CA();function o(){a();let IA=h()||f()||v()||k()||M()||F(!1)||z();return a(),IA}function a(){let IA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,dA=e,_A=r(IA);do _A=s(),_A&&(_A=r(IA));while(_A);return e>dA}function r(IA){let dA=IA?t2:lT,_A="";for(;;)if(dA(i,e))_A+=i[e],e++;else if(gT(i,e))_A+=" ",e++;else break;return _A.length>0?(A+=_A,!0):!1}function s(){if(i[e]==="/"&&i[e+1]==="*"){for(;e=i.length;VA||(C7(i[e])||he?A=Zl(A,":"):QA()),o()||(VA||he?A+="null":QA())}return i[e]==="}"?(A+="}",e++):A=Zl(A,"}"),!0}return!1}function f(){if(i[e]==="["){A+="[",e++,a(),I(",")&&a();let IA=!0;for(;e0&&arguments[0]!==void 0?arguments[0]:!1,dA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:-1,_A=i[e]==="\\";if(_A&&(e++,_A=!0),i4(i[e])){let VA=d7(i[e])?d7:B7(i[e])?B7:Fm(i[e])?Fm:I7,he=e,HA=A.length,vA='"';for(e++;;){if(e>=i.length){let PA=P(e-1);return!IA&&t4(i.charAt(PA))?(e=he,A=A.substring(0,HA),v(!0)):(vA=Zl(vA,'"'),A+=vA,!0)}if(e===dA)return vA=Zl(vA,'"'),A+=vA,!0;if(VA(i[e])){let PA=e,et=vA.length;if(vA+='"',e++,A+=vA,a(!1),IA||e>=i.length||t4(i[e])||i4(i[e])||i2(i[e]))return S(),!0;let We=P(PA-1),OA=i.charAt(We);if(OA===",")return e=he,A=A.substring(0,HA),v(!1,We);if(t4(OA))return e=he,A=A.substring(0,HA),v(!0);A=A.substring(0,HA),e=PA+1,vA=`${vA.substring(0,et)}\\${vA.substring(et)}`}else if(IA&&c7(i[e])){if(i[e-1]===":"&&l7.test(i.substring(he+1,e+2)))for(;e=i.length?e=i.length:RA()}else vA+=PA,e+=2}else{let PA=i.charAt(e);PA==='"'&&i[e-1]!=="\\"?(vA+=`\\${PA}`,e++):sT(PA)?(vA+=jrA[PA],e++):(rT(PA)||W(PA),vA+=PA,e++)}_A&&B()}}return!1}function S(){let IA=!1;for(a();i[e]==="+";){IA=!0,e++,a(),A=QB(A,'"',!0);let dA=A.length;v()?A=cT(A,dA,1):A=Zl(A,'"')}return IA}function k(){let IA=e;if(i[e]==="-"){if(e++,Z())return AA(IA),!0;if(!i2(i[e]))return e=IA,!1}for(;i2(i[e]);)e++;if(i[e]==="."){if(e++,Z())return AA(IA),!0;if(!i2(i[e]))return e=IA,!1;for(;i2(i[e]);)e++}if(i[e]==="e"||i[e]==="E"){if(e++,(i[e]==="-"||i[e]==="+")&&e++,Z())return AA(IA),!0;if(!i2(i[e]))return e=IA,!1;for(;i2(i[e]);)e++}if(!Z())return e=IA,!1;if(e>IA){let dA=i.slice(IA,e),_A=/^0\d/.test(dA);return A+=_A?`"${dA}"`:dA,!0}return!1}function M(){return x("true","true")||x("false","false")||x("null","null")||x("True","true")||x("False","false")||x("None","null")}function x(IA,dA){return i.slice(e,e+IA.length)===IA?(A+=dA,e+=IA.length,!0):!1}function F(IA){let dA=e;if(r7(i[e])){for(;edA){for(;t2(i,e-1)&&e>0;)e--;let _A=i.slice(dA,e);return A+=_A==="undefined"?"null":JSON.stringify(_A),i[e]==='"'&&e++,!0}}function z(){if(i[e]==="/"){let IA=e;for(e++;e0&&t2(i,dA);)dA--;return dA}function Z(){return e>=i.length||t4(i[e])||t2(i,e)}function AA(IA){A+=`${i.slice(IA,e)}0`}function W(IA){throw new Y0(`Invalid character ${JSON.stringify(IA)}`,e)}function CA(){throw new Y0(`Unexpected character ${JSON.stringify(i[e])}`,e)}function wA(){throw new Y0("Unexpected end of json string",i.length)}function BA(){throw new Y0("Object key expected",e)}function QA(){throw new Y0("Colon expected",e)}function RA(){let IA=i.slice(e,e+6);throw new Y0(`Invalid unicode character "${IA}"`,e)}}function VrA(i,e){return i[e]==="*"&&i[e+1]==="/"}var n2=i=>Array.isArray(i),WrA=i=>i!==null&&typeof i=="object"&&!n2(i),ZrA=i=>typeof i=="string",j1=(i,e)=>i===e?!0:i!==null&&e!==null&&typeof i=="object"&&typeof e=="object"&&Object.keys(i).length===Object.keys(e).length&&Object.entries(i).every(([A,t])=>j1(t,e[A])),IT=(i,e)=>{let A=i?.[e];if(A!==void 0){if(!Object.hasOwn(i,e)||Array.isArray(i)&&!/^\d+$/.test(e)||typeof i!="object")throw new TypeError(`Unsupported property "${e}"`);return A}};function Oa(i){return(...e)=>{let A=e.map(o=>Ha(o)),t=A[0],n=A[1];return A.length===1?o=>i(t(o)):A.length===2?o=>i(t(o),n(o)):o=>i(...A.map(a=>a(o)))}}var a4={boolean:0,number:1,string:2},dT=3,hT=(i,e)=>typeof i==typeof e&&typeof i in a4?i>e:!1,XrA=(i,e)=>j1(i,e)||hT(i,e),QT=(i,e)=>typeof i==typeof e&&typeof i in a4?ij1(i,e)||QT(i,e),o4={pipe:(...i)=>{let e=i.map(A=>Ha(A));return A=>e.reduce((t,n)=>n(t),A)},object:i=>{let e=Object.keys(i).map(A=>[A,Ha(i[A])]);return A=>{let t={};for(let[n,o]of e)t[n]=o(A);return t}},array:(...i)=>{let e=i.map(A=>Ha(A));return A=>e.map(t=>t(A))},get:(...i)=>{if(i.length===0)return e=>e??null;if(i.length===1){let e=i[0];return A=>IT(A,e)??null}return e=>{let A=e;for(let t of i)A=IT(A,t);return A??null}},map:i=>{let e=Ha(i);return A=>A.map(e)},mapObject:i=>{let e=Ha(i);return A=>{let t={};for(let n of Object.keys(A)){let o=e({key:n,value:A[n]});t[o.key]=o.value}return t}},mapKeys:i=>{let e=Ha(i);return A=>{let t={};for(let n of Object.keys(A)){let o=e(n);t[o]=A[n]}return t}},mapValues:i=>{let e=Ha(i);return A=>{let t={};for(let n of Object.keys(A))t[n]=e(A[n]);return t}},filter:i=>{let e=Ha(i);return A=>A.filter(t=>BT(e(t)))},sort:(i=["get"],e)=>{let A=Ha(i),t=e==="desc"?-1:1;function n(o,a){let r=A(o),s=A(a);if(typeof r!=typeof s){let l=a4[typeof r]??dT,g=a4[typeof s]??dT;return l>g?t:ls?t:ro.slice().sort(n)},reverse:()=>i=>i.toReversed(),pick:(...i)=>{let e=i.map(([t,...n])=>[n[n.length-1],o4.get(...n)]),A=(t,n)=>{let o={};for(let[a,r]of n)o[a]=r(t);return o};return t=>n2(t)?t.map(n=>A(n,e)):A(t,e)},groupBy:i=>{let e=Ha(i);return A=>{let t={};for(let n of A){let o=e(n);t[o]?t[o].push(n):t[o]=[n]}return t}},keyBy:i=>{let e=Ha(i);return A=>{let t={};for(let n of A){let o=e(n);o in t||(t[o]=n)}return t}},flatten:()=>i=>i.flat(),join:(i="")=>e=>e.join(i),split:Oa((i,e)=>e!==void 0?i.split(e):i.trim().split(/\s+/)),substring:Oa((i,e,A)=>i.slice(Math.max(e,0),A)),uniq:()=>i=>{let e=[];for(let A of i)e.findIndex(t=>j1(t,A))===-1&&e.push(A);return e},uniqBy:i=>e=>Object.values(o4.keyBy(i)(e)),limit:i=>e=>e.slice(0,Math.max(i,0)),size:()=>i=>i.length,keys:()=>Object.keys,values:()=>Object.values,prod:()=>i=>n4(i,(e,A)=>e*A),sum:()=>i=>n2(i)?i.reduce((e,A)=>e+A,0):E7(),average:()=>i=>n2(i)?i.length>0?i.reduce((e,A)=>e+A)/i.length:null:E7(),min:()=>i=>n4(i,(e,A)=>Math.min(e,A)),max:()=>i=>n4(i,(e,A)=>Math.max(e,A)),and:Oa((...i)=>n4(i,(e,A)=>!!(e&&A))),or:Oa((...i)=>n4(i,(e,A)=>!!(e||A))),not:Oa(i=>!i),exists:i=>{let e=i.slice(1),A=e.pop(),t=o4.get(...e);return n=>{let o=t(n);return!!o&&Object.hasOwnProperty.call(o,A)}},if:(i,e,A)=>{let t=Ha(i),n=Ha(e),o=Ha(A);return a=>BT(t(a))?n(a):o(a)},in:(i,e)=>{let A=Ha(i),t=Ha(e);return n=>{let o=A(n);return t(n).findIndex(a=>j1(a,o))!==-1}},"not in":(i,e)=>{let A=o4.in(i,e);return t=>!A(t)},regex:(i,e,A)=>{let t=new RegExp(e,A),n=Ha(i);return o=>t.test(n(o))},match:(i,e,A)=>{let t=new RegExp(e,A),n=Ha(i);return o=>{let a=n(o).match(t);return a?ET(a):null}},matchAll:(i,e,A)=>{let t=new RegExp(e,`${A??""}g`),n=Ha(i);return o=>Array.from(n(o).matchAll(t)).map(ET)},eq:Oa(j1),gt:Oa(hT),gte:Oa(XrA),lt:Oa(QT),lte:Oa($rA),ne:Oa((i,e)=>!j1(i,e)),add:Oa((i,e)=>i+e),subtract:Oa((i,e)=>i-e),multiply:Oa((i,e)=>i*e),divide:Oa((i,e)=>i/e),mod:Oa((i,e)=>i%e),pow:Oa((i,e)=>i**e),abs:Oa(Math.abs),round:Oa((i,e=0)=>+`${Math.round(+`${i}e${e}`)}e${-e}`),number:Oa(i=>{let e=Number(i);return Number.isNaN(Number(i))?null:e}),string:Oa(String)},BT=i=>i!==null&&i!==0&&i!==!1,n4=(i,e)=>(n2(i)||E7(),i.length===0?null:i.reduce(e)),ET=i=>{let[e,...A]=i,t=i.groups;return A.length?t?{value:e,groups:A,namedGroups:t}:{value:e,groups:A}:{value:e}},E7=()=>{h7("Array expected")},h7=i=>{throw new TypeError(i)},Lm=[];function Ha(i,e){Lm.unshift(oA(oA(oA({},o4),Lm[0]),e?.functions));try{let A=n2(i)?AsA(i,Lm[0]):WrA(i)?h7(`Function notation ["object", {...}] expected but got ${JSON.stringify(i)}`):()=>i;return t=>{try{return A(t)}catch(n){throw n.jsonquery=[{data:t,query:i},...n.jsonquery??[]],n}}}finally{Lm.shift()}}function AsA(i,e){let[A,...t]=i,n=e[A];return n||h7(`Unknown function '${A}'`),n(...t)}var uT=[{pow:"^"},{multiply:"*",divide:"/",mod:"%"},{add:"+",subtract:"-"},{gt:">",gte:">=",lt:"<",lte:"<=",in:"in","not in":"not in"},{eq:"==",ne:"!="},{and:"and"},{or:"or"},{pipe:"|"}],esA=["|","and","or"],pT=["|","and","or","*","/","%","+","-"];function fT(i,e){if(!n2(e))throw new Error("Invalid custom operators");return e.reduce(tsA,i)}function tsA(i,{name:e,op:A,at:t,after:n,before:o}){if(t)return i.map(s=>Object.values(s).includes(t)?Oe(oA({},s),{[e]:A}):s);let a=n??o,r=i.findIndex(s=>Object.values(s).includes(a));if(r!==-1)return i.toSpliced(r+(n?1:0),0,{[e]:A});throw new Error("Invalid custom operator")}var isA=/^[a-zA-Z_$][a-zA-Z\d_$]*$/,nsA=/^[a-zA-Z_$][a-zA-Z\d_$]*/,osA=/^"(?:[^"\\]|\\.)*"/,asA=/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/,rsA=/^(0|[1-9][0-9]*)/,ssA=/^(true|false|null)/,lsA=/^[ \n\t\r]+/;function Q7(i,e){let A=e?.operators??[],t=fT(uT,A),n=Object.assign({},...t),o=esA.concat(A.filter(Z=>Z.vararg).map(Z=>Z.op)),a=pT.concat(A.filter(Z=>Z.leftAssociative).map(Z=>Z.op)),r=(Z=t.length-1)=>{let AA=t[Z];if(!AA)return l();let W=i[z]==="(",CA=r(Z-1);for(;;){if(M(),i[z]==="."&&"pipe"in AA){let dA=g();CA=CA[0]==="pipe"?[...CA,dA]:["pipe",CA,dA];continue}let wA=z,BA=s(AA);if(!BA)break;let QA=r(Z-1),RA=CA[0],IA=BA===RA&&!W;if(IA&&!a.includes(n[BA])){z=wA;break}CA=IA&&o.includes(n[BA])?[...CA,QA]:[BA,CA,QA]}return CA},s=Z=>{let AA=Object.keys(Z).sort((W,CA)=>CA.length-W.length);for(let W of AA){let CA=Z[W];if(i.substring(z,z+CA.length)===CA)return z+=CA.length,M(),W}},l=()=>{if(M(),i[z]==="("){z++;let Z=r();return x(")"),Z}return g()},g=()=>{if(i[z]==="."){let Z=[];for(;i[z]===".";)z++,Z.push(Q()??h()??m()??F("Property expected")),M();return["get",...Z]}return C()},C=()=>{let Z=z,AA=h();if(M(),!AA||i[z]!=="(")return z=Z,I();z++,M();let W=i[z]!==")"?[r()]:[];for(;z{if(i[z]==="{"){z++,M();let Z={},AA=!0;for(;z{if(i[z]==="["){z++,M();let Z=[],AA=!0;for(;zk(osA,JSON.parse),h=()=>k(nsA,Z=>Z),f=()=>k(asA,JSON.parse),m=()=>k(rsA,JSON.parse),v=()=>{let Z=k(ssA,JSON.parse);if(Z!==void 0)return Z;F("Value expected")},S=()=>{M(),z{let W=i.substring(z).match(Z);if(W)return z+=W[0].length,AA(W[0])},M=()=>k(lsA,Z=>Z),x=Z=>{i[z]!==Z&&F(`Character '${Z}' expected`),z++},F=(Z,AA=z)=>{throw new SyntaxError(`${Z} (pos: ${AA})`)},z=0,P=r();return S(),P}var gsA=40,csA=" ",mT=(i,e)=>{let A=e?.indentation??csA,t=e?.operators??[],n=fT(uT,t),o=Object.assign({},...n),a=pT.concat(t.filter(B=>B.leftAssociative).map(B=>B.op)),r=(B,Q,h=!1)=>n2(B)?s(B,Q,h):JSON.stringify(B),s=(B,Q,h)=>{let[f,...m]=B;if(f==="get"&&m.length>0)return g(m);if(f==="object")return l(m[0],Q);if(f==="array"){let M=m.map(x=>r(x,Q));return I(M,["[",", ","]"],[`[ +${Q+A}`,`, +${Q+A}`,` +${Q}]`])}let v=o[f];if(v){let M=h?"(":"",x=h?")":"",F=m.map((z,P)=>{let Z=z?.[0],AA=n.findIndex(wA=>f in wA),W=n.findIndex(wA=>Z in wA),CA=AA0||f===Z&&!a.includes(v);return r(z,Q+A,CA)});return I(F,[M,` ${v} `,x],[M,` +${Q+A}${v} `,x])}let S=m.length===1?Q:Q+A,k=m.map(M=>r(M,S));return I(k,[`${f}(`,", ",")"],m.length===1?[`${f}(`,`, +${Q}`,")"]:[`${f}( +${S}`,`, +${S}`,` +${Q})`])},l=(B,Q)=>{let h=Q+A,f=Object.entries(B).map(([m,v])=>`${C(m)}: ${r(v,h)}`);return I(f,["{ ",", "," }"],[`{ +${h}`,`, +${h}`,` +${Q}}`])},g=B=>B.map(Q=>`.${C(Q)}`).join(""),C=B=>isA.test(B)?B:JSON.stringify(B),I=(B,[Q,h,f],[m,v,S])=>Q.length+B.reduce((k,M)=>k+M.length+h.length,0)-h.length+f.length<=(e?.maxLineLength??gsA)?Q+B.join(h)+f:m+B.join(v)+S;return r(i,"")};function wT(i,e,A){return Ha(ZrA(e)?Q7(e,A):e,A)(i)}var DT={prefix:"far",iconName:"clock",icon:[512,512,[128339,"clock-four"],"f017","M464 256a208 208 0 1 1 -416 0 208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0 256 256 0 1 0 -512 0zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"]};var CsA={prefix:"far",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M384 32c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0zM64 80c-8.8 0-16 7.2-16 16l0 320c0 8.8 7.2 16 16 16l320 0c8.8 0 16-7.2 16-16l0-320c0-8.8-7.2-16-16-16L64 80zm230.7 89.9c7.8-10.7 22.8-13.1 33.5-5.3 10.7 7.8 13.1 22.8 5.3 33.5L211.4 366.1c-4.1 5.7-10.5 9.3-17.5 9.8-7 .5-13.9-2-18.8-6.9l-55.9-55.9c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l36 36 105.6-145.2z"]},u7=CsA;var yT={prefix:"far",iconName:"lightbulb",icon:[384,512,[128161],"f0eb","M296.5 291.1C321 265.2 336 230.4 336 192 336 112.5 271.5 48 192 48S48 112.5 48 192c0 38.4 15 73.2 39.5 99.1 21.3 22.4 44.9 54 53.3 92.9l102.4 0c8.4-39 32-70.5 53.3-92.9zm34.8 33C307.7 349 288 379.4 288 413.7l0 18.3c0 44.2-35.8 80-80 80l-32 0c-44.2 0-80-35.8-80-80l0-18.3C96 379.4 76.3 349 52.7 324.1 20 289.7 0 243.2 0 192 0 86 86 0 192 0S384 86 384 192c0 51.2-20 97.7-52.7 132.1zM144 184c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-48.6 39.4-88 88-88 13.3 0 24 10.7 24 24s-10.7 24-24 24c-22.1 0-40 17.9-40 40z"]};var p7={prefix:"far",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M384 80c8.8 0 16 7.2 16 16l0 320c0 8.8-7.2 16-16 16L64 432c-8.8 0-16-7.2-16-16L48 96c0-8.8 7.2-16 16-16l320 0zM64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32z"]};var vT={prefix:"fas",iconName:"rotate",icon:[512,512,[128260,"sync-alt"],"f2f1","M480.1 192l7.9 0c13.3 0 24-10.7 24-24l0-144c0-9.7-5.8-18.5-14.8-22.2S477.9 .2 471 7L419.3 58.8C375 22.1 318 0 256 0 127 0 20.3 95.4 2.6 219.5 .1 237 12.2 253.2 29.7 255.7s33.7-9.7 36.2-27.1C79.2 135.5 159.3 64 256 64 300.4 64 341.2 79 373.7 104.3L327 151c-6.9 6.9-8.9 17.2-5.2 26.2S334.3 192 344 192l136.1 0zm29.4 100.5c2.5-17.5-9.7-33.7-27.1-36.2s-33.7 9.7-36.2 27.1c-13.3 93-93.4 164.5-190.1 164.5-44.4 0-85.2-15-117.7-40.3L185 361c6.9-6.9 8.9-17.2 5.2-26.2S177.7 320 168 320L24 320c-13.3 0-24 10.7-24 24L0 488c0 9.7 5.8 18.5 14.8 22.2S34.1 511.8 41 505l51.8-51.8C137 489.9 194 512 256 512 385 512 491.7 416.6 509.4 292.5z"]};var f7={prefix:"fas",iconName:"paste",icon:[512,512,["file-clipboard"],"f0ea","M64 0C28.7 0 0 28.7 0 64L0 384c0 35.3 28.7 64 64 64l112 0 0-224c0-61.9 50.1-112 112-112l64 0 0-48c0-35.3-28.7-64-64-64L64 0zM248 112l-144 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l144 0c13.3 0 24 10.7 24 24s-10.7 24-24 24zm40 48c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64l160 0c35.3 0 64-28.7 64-64l0-165.5c0-17-6.7-33.3-18.7-45.3l-58.5-58.5c-12-12-28.3-18.7-45.3-18.7L288 160z"]};var IsA={prefix:"fas",iconName:"crop-simple",icon:[512,512,["crop-alt"],"f565","M128 32c0-17.7-14.3-32-32-32S64 14.3 64 32l0 32-32 0C14.3 64 0 78.3 0 96s14.3 32 32 32l32 0 0 256c0 35.3 28.7 64 64 64l208 0 0-64-208 0 0-352zM384 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-32 32 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-32 0 0-256c0-35.3-28.7-64-64-64l-208 0 0 64 208 0 0 352z"]},bT=IsA;var r4={prefix:"fas",iconName:"filter",icon:[512,512,[],"f0b0","M32 64C19.1 64 7.4 71.8 2.4 83.8S.2 109.5 9.4 118.6L192 301.3 192 416c0 8.5 3.4 16.6 9.4 22.6l64 64c9.2 9.2 22.9 11.9 34.9 6.9S320 492.9 320 480l0-178.7 182.6-182.6c9.2-9.2 11.9-22.9 6.9-34.9S492.9 64 480 64L32 64z"]};var dsA={prefix:"fas",iconName:"square-caret-down",icon:[448,512,["caret-square-down"],"f150","M384 480c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0zM224 352c-6.7 0-13-2.8-17.6-7.7l-104-112c-6.5-7-8.2-17.2-4.4-25.9S110.5 192 120 192l208 0c9.5 0 18.2 5.7 22 14.4s2.1 18.9-4.4 25.9l-104 112c-4.5 4.9-10.9 7.7-17.6 7.7z"]},MT=dsA;var uB={prefix:"fas",iconName:"caret-right",icon:[256,512,[],"f0da","M249.3 235.8c10.2 12.6 9.5 31.1-2.2 42.8l-128 128c-9.2 9.2-22.9 11.9-34.9 6.9S64.5 396.9 64.5 384l0-256c0-12.9 7.8-24.6 19.8-29.6s25.7-2.2 34.9 6.9l128 128 2.2 2.4z"]};var BsA={prefix:"fas",iconName:"magnifying-glass",icon:[512,512,[128269,"search"],"f002","M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376C296.3 401.1 253.9 416 208 416 93.1 416 0 322.9 0 208S93.1 0 208 0 416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"]},s4=BsA;var ST={prefix:"fas",iconName:"eye",icon:[576,512,[128065],"f06e","M288 32c-80.8 0-145.5 36.8-192.6 80.6-46.8 43.5-78.1 95.4-93 131.1-3.3 7.9-3.3 16.7 0 24.6 14.9 35.7 46.2 87.7 93 131.1 47.1 43.7 111.8 80.6 192.6 80.6s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1 3.3-7.9 3.3-16.7 0-24.6-14.9-35.7-46.2-87.7-93-131.1-47.1-43.7-111.8-80.6-192.6-80.6zM144 256a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-64c0 35.3-28.7 64-64 64-11.5 0-22.3-3-31.7-8.4-1 10.9-.1 22.1 2.9 33.2 13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-12.2-45.7-55.5-74.8-101.1-70.8 5.3 9.3 8.4 20.1 8.4 31.7z"]},kT={prefix:"fas",iconName:"caret-left",icon:[256,512,[],"f0d9","M7.7 235.8c-10.3 12.6-9.5 31.1 2.2 42.8l128 128c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6l0-256c0-12.9-7.8-24.6-19.8-29.6s-25.7-2.2-34.9 6.9l-128 128-2.2 2.4z"]};var _T={prefix:"fas",iconName:"chevron-up",icon:[448,512,[],"f077","M201.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L224 173.3 54.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z"]};var xT={prefix:"fas",iconName:"circle-notch",icon:[512,512,[],"f1ce","M222.7 32.1c5 16.9-4.6 34.8-21.5 39.8-79.3 23.6-137.1 97.1-137.1 184.1 0 106 86 192 192 192s192-86 192-192c0-86.9-57.8-160.4-137.1-184.1-16.9-5-26.6-22.9-21.5-39.8s22.9-26.6 39.8-21.5C434.9 42.1 512 140 512 256 512 397.4 397.4 512 256 512S0 397.4 0 256c0-116 77.1-213.9 182.9-245.4 16.9-5 34.8 4.6 39.8 21.5z"]};var EsA={prefix:"fas",iconName:"ellipsis-vertical",icon:[128,512,["ellipsis-v"],"f142","M64 144a56 56 0 1 1 0-112 56 56 0 1 1 0 112zm0 224c30.9 0 56 25.1 56 56s-25.1 56-56 56-56-25.1-56-56 25.1-56 56-56zm56-112c0 30.9-25.1 56-56 56s-56-25.1-56-56 25.1-56 56-56 56 25.1 56 56z"]},m7=EsA;var hsA={prefix:"fas",iconName:"pen-to-square",icon:[512,512,["edit"],"f044","M471.6 21.7c-21.9-21.9-57.3-21.9-79.2 0L368 46.1 465.9 144 490.3 119.6c21.9-21.9 21.9-57.3 0-79.2L471.6 21.7zm-299.2 220c-6.1 6.1-10.8 13.6-13.5 21.9l-29.6 88.8c-2.9 8.6-.6 18.1 5.8 24.6s15.9 8.7 24.6 5.8l88.8-29.6c8.2-2.7 15.7-7.4 21.9-13.5L432 177.9 334.1 80 172.4 241.7zM96 64C43 64 0 107 0 160L0 416c0 53 43 96 96 96l256 0c53 0 96-43 96-96l0-96c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 96c0 17.7-14.3 32-32 32L96 448c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L96 64z"]},RT=hsA;var w7={prefix:"fas",iconName:"clone",icon:[512,512,[],"f24d","M288 448l-224 0 0-224 48 0 0-64-48 0c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l224 0c35.3 0 64-28.7 64-64l0-48-64 0 0 48zm-64-96l224 0c35.3 0 64-28.7 64-64l0-224c0-35.3-28.7-64-64-64L224 0c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64z"]};var QsA={prefix:"fas",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M384 32c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0zM342 145.7c-10.7-7.8-25.7-5.4-33.5 5.3L189.1 315.2 137 263.1c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l72 72c5 5 11.9 7.5 18.8 7s13.4-4.1 17.5-9.8L347.3 179.2c7.8-10.7 5.4-25.7-5.3-33.5z"]},D7=QsA;var usA={prefix:"fas",iconName:"square-caret-up",icon:[448,512,["caret-square-up"],"f151","M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zM224 160c6.7 0 13 2.8 17.6 7.7l104 112c6.5 7 8.2 17.2 4.4 25.9S337.5 320 328 320l-208 0c-9.5 0-18.2-5.7-22-14.4s-2.1-18.9 4.4-25.9l104-112c4.5-4.9 10.9-7.7 17.6-7.7z"]},NT=usA;var l4={prefix:"fas",iconName:"code",icon:[576,512,[],"f121","M360.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6zm64.6 136.1c-12.5 12.5-12.5 32.8 0 45.3l73.4 73.4-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0zm-274.7 0c-12.5-12.5-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256 150.6 182.6c12.5-12.5 12.5-32.8 0-45.3z"]};var y7={prefix:"fas",iconName:"angle-right",icon:[256,512,[8250],"f105","M247.1 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L179.2 256 41.9 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"]};var psA={prefix:"fas",iconName:"gear",icon:[512,512,[9881,"cog"],"f013","M195.1 9.5C198.1-5.3 211.2-16 226.4-16l59.8 0c15.2 0 28.3 10.7 31.3 25.5L332 79.5c14.1 6 27.3 13.7 39.3 22.8l67.8-22.5c14.4-4.8 30.2 1.2 37.8 14.4l29.9 51.8c7.6 13.2 4.9 29.8-6.5 39.9L447 233.3c.9 7.4 1.3 15 1.3 22.7s-.5 15.3-1.3 22.7l53.4 47.5c11.4 10.1 14 26.8 6.5 39.9l-29.9 51.8c-7.6 13.1-23.4 19.2-37.8 14.4l-67.8-22.5c-12.1 9.1-25.3 16.7-39.3 22.8l-14.4 69.9c-3.1 14.9-16.2 25.5-31.3 25.5l-59.8 0c-15.2 0-28.3-10.7-31.3-25.5l-14.4-69.9c-14.1-6-27.2-13.7-39.3-22.8L73.5 432.3c-14.4 4.8-30.2-1.2-37.8-14.4L5.8 366.1c-7.6-13.2-4.9-29.8 6.5-39.9l53.4-47.5c-.9-7.4-1.3-15-1.3-22.7s.5-15.3 1.3-22.7L12.3 185.8c-11.4-10.1-14-26.8-6.5-39.9L35.7 94.1c7.6-13.2 23.4-19.2 37.8-14.4l67.8 22.5c12.1-9.1 25.3-16.7 39.3-22.8L195.1 9.5zM256.3 336a80 80 0 1 0 -.6-160 80 80 0 1 0 .6 160z"]},FT=psA;var LT={prefix:"fas",iconName:"up-right-and-down-left-from-center",icon:[512,512,["expand-alt"],"f424","M344 0L488 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S334.3 0 344 0zM168 512L24 512c-13.3 0-24-10.7-24-24L0 344c0-9.7 5.8-18.5 14.8-22.2S34.1 320.2 41 327l39 39 87-87c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S177.7 512 168 512z"]};var O0={prefix:"fas",iconName:"wrench",icon:[576,512,[128295],"f0ad","M509.4 98.6c7.6-7.6 20.3-5.7 24.1 4.3 6.8 17.7 10.5 37 10.5 57.1 0 88.4-71.6 160-160 160-17.5 0-34.4-2.8-50.2-8L146.9 498.9c-28.1 28.1-73.7 28.1-101.8 0s-28.1-73.7 0-101.8L232 210.2c-5.2-15.8-8-32.6-8-50.2 0-88.4 71.6-160 160-160 20.1 0 39.4 3.7 57.1 10.5 10 3.8 11.8 16.5 4.3 24.1l-88.7 88.7c-3 3-4.7 7.1-4.7 11.3l0 41.4c0 8.8 7.2 16 16 16l41.4 0c4.2 0 8.3-1.7 11.3-4.7l88.7-88.7z"]},Gm={prefix:"fas",iconName:"trash-can",icon:[448,512,[61460,"trash-alt"],"f2ed","M136.7 5.9C141.1-7.2 153.3-16 167.1-16l113.9 0c13.8 0 26 8.8 30.4 21.9L320 32 416 32c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 96C14.3 96 0 81.7 0 64S14.3 32 32 32l96 0 8.7-26.1zM32 144l384 0 0 304c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-304zm88 64c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24z"]};var Km={prefix:"fas",iconName:"check",icon:[448,512,[10003,10004],"f00c","M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z"]};var GT={prefix:"fas",iconName:"xmark",icon:[384,512,[128473,10005,10006,10060,215,"close","multiply","remove","times"],"f00d","M55.1 73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L147.2 256 9.9 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192.5 301.3 329.9 438.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.8 256 375.1 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192.5 210.7 55.1 73.4z"]},KT=GT;var g4=GT;var q1={prefix:"fas",iconName:"pen",icon:[512,512,[128394],"f304","M352.9 21.2L308 66.1 445.9 204 490.8 159.1C504.4 145.6 512 127.2 512 108s-7.6-37.6-21.2-51.1L455.1 21.2C441.6 7.6 423.2 0 404 0s-37.6 7.6-51.1 21.2zM274.1 100L58.9 315.1c-10.7 10.7-18.5 24.1-22.6 38.7L.9 481.6c-2.3 8.3 0 17.3 6.2 23.4s15.1 8.5 23.4 6.2l127.8-35.5c14.6-4.1 27.9-11.8 38.7-22.6L412 237.9 274.1 100z"]};var UT={prefix:"fas",iconName:"chevron-down",icon:[448,512,[],"f078","M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"]};var TT={prefix:"fas",iconName:"angle-down",icon:[384,512,[8964],"f107","M169.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 306.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var fsA={prefix:"fas",iconName:"arrow-down-short-wide",icon:[576,512,["sort-amount-desc","sort-amount-down-alt"],"f884","M246.6 374.6l-96 96c-12.5 12.5-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L96 370.7 96 64c0-17.7 14.3-32 32-32s32 14.3 32 32l0 306.7 41.4-41.4c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3zM320 32l32 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l96 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-96 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l224 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-224 0c-17.7 0-32-14.3-32-32s14.3-32 32-32z"]};var c4=fsA;var msA={prefix:"fas",iconName:"triangle-exclamation",icon:[512,512,[9888,"exclamation-triangle","warning"],"f071","M256 0c14.7 0 28.2 8.1 35.2 21l216 400c6.7 12.4 6.4 27.4-.8 39.5S486.1 480 472 480L40 480c-14.1 0-27.2-7.4-34.4-19.5s-7.5-27.1-.8-39.5l216-400c7-12.9 20.5-21 35.2-21zm0 352a32 32 0 1 0 0 64 32 32 0 1 0 0-64zm0-192c-18.2 0-32.7 15.5-31.4 33.7l7.4 104c.9 12.5 11.4 22.3 23.9 22.3 12.6 0 23-9.7 23.9-22.3l7.4-104c1.3-18.2-13.1-33.7-31.4-33.7z"]},o2=msA;var wsA={prefix:"fas",iconName:"scissors",icon:[512,512,[9984,9986,9988,"cut"],"f0c4","M192 256l-39.5 39.5c-12.6-4.9-26.2-7.5-40.5-7.5-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112c0-14.3-2.7-27.9-7.5-40.5L499.2 76.8c7.1-7.1 7.1-18.5 0-25.6-28.3-28.3-74.1-28.3-102.4 0L256 192 216.5 152.5c4.9-12.6 7.5-26.2 7.5-40.5 0-61.9-50.1-112-112-112S0 50.1 0 112 50.1 224 112 224c14.3 0 27.9-2.7 40.5-7.5L192 256zm97.9 97.9L396.8 460.8c28.3 28.3 74.1 28.3 102.4 0 7.1-7.1 7.1-18.5 0-25.6l-145.3-145.3-64 64zM64 112a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm48 240a48 48 0 1 1 0 96 48 48 0 1 1 0-96z"]},V1=wsA;var C4={prefix:"fas",iconName:"arrow-right-arrow-left",icon:[512,512,[8644,"exchange"],"f0ec","M502.6 150.6l-96 96c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L402.7 160 32 160c-17.7 0-32-14.3-32-32S14.3 96 32 96l370.7 0-41.4-41.4c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l96 96c12.5 12.5 12.5 32.8 0 45.3zm-397.3 352l-96-96c-12.5-12.5-12.5-32.8 0-45.3l96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3L109.3 352 480 352c17.7 0 32 14.3 32 32s-14.3 32-32 32l-370.7 0 41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0z"]};var v7={prefix:"fas",iconName:"caret-up",icon:[320,512,[],"f0d8","M140.3 135.2c12.6-10.3 31.1-9.5 42.8 2.2l128 128c9.2 9.2 11.9 22.9 6.9 34.9S301.4 320 288.5 320l-256 0c-12.9 0-24.6-7.8-29.6-19.8S.7 274.5 9.9 265.4l128-128 2.4-2.2z"]};var JT={prefix:"fas",iconName:"down-left-and-up-right-to-center",icon:[512,512,["compress-alt"],"f422","M439.5 7c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S450.2 240 440.5 240l-144 0c-13.3 0-24-10.7-24-24l0-144c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39 87-87zM72.5 272l144 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S62.8 272 72.5 272z"]};var W1={prefix:"fas",iconName:"plus",icon:[448,512,[10133,61543,"add"],"2b","M256 64c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 160-160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l160 0 0 160c0 17.7 14.3 32 32 32s32-14.3 32-32l0-160 160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-160 0 0-160z"]};var H0={prefix:"fas",iconName:"copy",icon:[448,512,[],"f0c5","M192 0c-35.3 0-64 28.7-64 64l0 256c0 35.3 28.7 64 64 64l192 0c35.3 0 64-28.7 64-64l0-200.6c0-17.4-7.1-34.1-19.7-46.2L370.6 17.8C358.7 6.4 342.8 0 326.3 0L192 0zM64 128c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l192 0c35.3 0 64-28.7 64-64l0-16-64 0 0 16-192 0 0-256 16 0 0-64-16 0z"]};var DsA={prefix:"fas",iconName:"arrow-rotate-right",icon:[512,512,[8635,"arrow-right-rotate","arrow-rotate-forward","redo"],"f01e","M436.7 74.7L448 85.4 448 32c0-17.7 14.3-32 32-32s32 14.3 32 32l0 128c0 17.7-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l47.9 0-7.6-7.2c-.2-.2-.4-.4-.6-.6-75-75-196.5-75-271.5 0s-75 196.5 0 271.5 196.5 75 271.5 0c8.2-8.2 15.5-16.9 21.9-26.1 10.1-14.5 30.1-18 44.6-7.9s18 30.1 7.9 44.6c-8.5 12.2-18.2 23.8-29.1 34.7-100 100-262.1 100-362 0S-25 175 75 75c99.9-99.9 261.7-100 361.7-.3z"]};var Um=DsA;var qc={prefix:"fas",iconName:"caret-down",icon:[320,512,[],"f0d7","M140.3 376.8c12.6 10.2 31.1 9.5 42.8-2.2l128-128c9.2-9.2 11.9-22.9 6.9-34.9S301.4 192 288.5 192l-256 0c-12.9 0-24.6 7.8-29.6 19.8S.7 237.5 9.9 246.6l128 128 2.4 2.2z"]};var ysA={prefix:"fas",iconName:"arrow-rotate-left",icon:[512,512,[8634,"arrow-left-rotate","arrow-rotate-back","arrow-rotate-backward","undo"],"f0e2","M256 64c-56.8 0-107.9 24.7-143.1 64l47.1 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 192c-17.7 0-32-14.3-32-32L0 32C0 14.3 14.3 0 32 0S64 14.3 64 32l0 54.7C110.9 33.6 179.5 0 256 0 397.4 0 512 114.6 512 256S397.4 512 256 512c-87 0-163.9-43.4-210.1-109.7-10.1-14.5-6.6-34.4 7.9-44.6s34.4-6.6 44.6 7.9c34.8 49.8 92.4 82.3 157.6 82.3 106 0 192-86 192-192S362 64 256 64z"]};var Tm=ysA;var b7={prefix:"fas",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M64 32l320 0c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32z"]};var M7={prefix:"fas",iconName:"arrow-down",icon:[384,512,[8595],"f063","M169.4 502.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 402.7 224 32c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 370.7-105.4-105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var Aj=s3(HT(),1);var zT=Number.isNaN||function(e){return typeof e=="number"&&e!==e};function vsA(i,e){return!!(i===e||zT(i)&&zT(e))}function bsA(i,e){if(i.length!==e.length)return!1;for(var A=0;A{if(typeof n!="object"||!n.name||!n.init)throw new Error("Invalid JSEP plugin format");this.registered[n.name]||(n.init(this.jsep),this.registered[n.name]=n)})}},qs=class i{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+i.version}static addUnaryOp(e){return i.max_unop_len=Math.max(e.length,i.max_unop_len),i.unary_ops[e]=1,i}static addBinaryOp(e,A,t){return i.max_binop_len=Math.max(e.length,i.max_binop_len),i.binary_ops[e]=A,t?i.right_associative.add(e):i.right_associative.delete(e),i}static addIdentifierChar(e){return i.additional_identifier_chars.add(e),i}static addLiteral(e,A){return i.literals[e]=A,i}static removeUnaryOp(e){return delete i.unary_ops[e],e.length===i.max_unop_len&&(i.max_unop_len=i.getMaxKeyLen(i.unary_ops)),i}static removeAllUnaryOps(){return i.unary_ops={},i.max_unop_len=0,i}static removeIdentifierChar(e){return i.additional_identifier_chars.delete(e),i}static removeBinaryOp(e){return delete i.binary_ops[e],e.length===i.max_binop_len&&(i.max_binop_len=i.getMaxKeyLen(i.binary_ops)),i.right_associative.delete(e),i}static removeAllBinaryOps(){return i.binary_ops={},i.max_binop_len=0,i}static removeLiteral(e){return delete i.literals[e],i}static removeAllLiterals(){return i.literals={},i}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(e){this.expr=e,this.index=0}static parse(e){return new i(e).parse()}static getMaxKeyLen(e){return Math.max(0,...Object.keys(e).map(A=>A.length))}static isDecimalDigit(e){return e>=48&&e<=57}static binaryPrecedence(e){return i.binary_ops[e]||0}static isIdentifierStart(e){return e>=65&&e<=90||e>=97&&e<=122||e>=128&&!i.binary_ops[String.fromCharCode(e)]||i.additional_identifier_chars.has(String.fromCharCode(e))}static isIdentifierPart(e){return i.isIdentifierStart(e)||i.isDecimalDigit(e)}throwError(e){let A=new Error(e+" at character "+this.index);throw A.index=this.index,A.description=e,A}runHook(e,A){if(i.hooks[e]){let t={context:this,node:A};return i.hooks.run(e,t),t.node}return A}searchHook(e){if(i.hooks[e]){let A={context:this};return i.hooks[e].find(function(t){return t.call(A.context,A),A.node}),A.node}}gobbleSpaces(){let e=this.code;for(;e===i.SPACE_CODE||e===i.TAB_CODE||e===i.LF_CODE||e===i.CR_CODE;)e=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");let e=this.gobbleExpressions(),A=e.length===1?e[0]:{type:i.COMPOUND,body:e};return this.runHook("after-all",A)}gobbleExpressions(e){let A=[],t,n;for(;this.index0;){if(i.binary_ops.hasOwnProperty(e)&&(!i.isIdentifierStart(this.code)||this.index+e.lengtho.right_a&&C.right_a?t>C.prec:t<=C.prec;for(;n.length>2&&g(n[n.length-2]);)r=n.pop(),A=n.pop().value,a=n.pop(),e={type:i.BINARY_EXP,operator:A,left:a,right:r},n.push(e);e=this.gobbleToken(),e||this.throwError("Expected expression after "+l),n.push(o,e)}for(s=n.length-1,e=n[s];s>1;)e={type:i.BINARY_EXP,operator:n[s-1].value,left:n[s-2],right:e},s-=2;return e}gobbleToken(){let e,A,t,n;if(this.gobbleSpaces(),n=this.searchHook("gobble-token"),n)return this.runHook("after-token",n);if(e=this.code,i.isDecimalDigit(e)||e===i.PERIOD_CODE)return this.gobbleNumericLiteral();if(e===i.SQUOTE_CODE||e===i.DQUOTE_CODE)n=this.gobbleStringLiteral();else if(e===i.OBRACK_CODE)n=this.gobbleArray();else{for(A=this.expr.substr(this.index,i.max_unop_len),t=A.length;t>0;){if(i.unary_ops.hasOwnProperty(A)&&(!i.isIdentifierStart(this.code)||this.index+A.length=A.length&&this.throwError("Unexpected token "+String.fromCharCode(e));break}else if(o===i.COMMA_CODE){if(this.index++,n++,n!==A.length){if(e===i.CPAREN_CODE)this.throwError("Unexpected token ,");else if(e===i.CBRACK_CODE)for(let a=A.length;a":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"});qs.max_unop_len=qs.getMaxKeyLen(qs.unary_ops);qs.max_binop_len=qs.getMaxKeyLen(qs.binary_ops);var Vc=i=>new qs(i).parse(),SsA=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(qs).filter(i=>!SsA.includes(i)&&Vc[i]===void 0).forEach(i=>{Vc[i]=qs[i]});Vc.Jsep=qs;var ksA="ConditionalExpression",_sA={name:"ternary",init(i){i.hooks.add("after-expression",function(A){if(A.node&&this.code===i.QUMARK_CODE){this.index++;let t=A.node,n=this.gobbleExpression();if(n||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===i.COLON_CODE){this.index++;let o=this.gobbleExpression();if(o||this.throwError("Expected expression"),A.node={type:ksA,test:t,consequent:n,alternate:o},t.operator&&i.binary_ops[t.operator]<=.9){let a=t;for(;a.right.operator&&i.binary_ops[a.right.operator]<=.9;)a=a.right;A.node.test=a.right,a.right=A.node,A.node=t}}else this.throwError("Expected :")}})}};Vc.plugins.register(_sA);var jT=47,xsA=92,RsA={name:"regex",init(i){i.hooks.add("gobble-token",function(A){if(this.code===jT){let t=++this.index,n=!1;for(;this.index=97&&s<=122||s>=65&&s<=90||s>=48&&s<=57)a+=this.char;else break}let r;try{r=new RegExp(o,a)}catch(s){this.throwError(s.message)}return A.node={type:i.LITERAL,value:r,raw:this.expr.slice(t-1,this.index)},A.node=this.gobbleTokenProperty(A.node),A.node}this.code===i.OBRACK_CODE?n=!0:n&&this.code===i.CBRACK_CODE&&(n=!1),this.index+=this.code===xsA?2:1}this.throwError("Unclosed Regex")}})}},S7=43,NsA=45,fB={name:"assignment",assignmentOperators:new Set(["=","*=","**=","/=","%=","+=","-=","<<=",">>=",">>>=","&=","^=","|=","||=","&&=","??="]),updateOperators:[S7,NsA],assignmentPrecedence:.9,init(i){let e=[i.IDENTIFIER,i.MEMBER_EXP];fB.assignmentOperators.forEach(t=>i.addBinaryOp(t,fB.assignmentPrecedence,!0)),i.hooks.add("gobble-token",function(n){let o=this.code;fB.updateOperators.some(a=>a===o&&a===this.expr.charCodeAt(this.index+1))&&(this.index+=2,n.node={type:"UpdateExpression",operator:o===S7?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},(!n.node.argument||!e.includes(n.node.argument.type))&&this.throwError(`Unexpected ${n.node.operator}`))}),i.hooks.add("after-token",function(n){if(n.node){let o=this.code;fB.updateOperators.some(a=>a===o&&a===this.expr.charCodeAt(this.index+1))&&(e.includes(n.node.type)||this.throwError(`Unexpected ${n.node.operator}`),this.index+=2,n.node={type:"UpdateExpression",operator:o===S7?"++":"--",argument:n.node,prefix:!1})}}),i.hooks.add("after-expression",function(n){n.node&&A(n.node)});function A(t){fB.assignmentOperators.has(t.operator)?(t.type="AssignmentExpression",A(t.left),A(t.right)):t.operator||Object.values(t).forEach(n=>{n&&typeof n=="object"&&A(n)})}}};Vc.plugins.register(RsA,fB);Vc.addUnaryOp("typeof");Vc.addUnaryOp("void");Vc.addLiteral("null",null);Vc.addLiteral("undefined",void 0);var FsA=new Set(["constructor","__proto__","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"]),Ro={evalAst(i,e){switch(i.type){case"BinaryExpression":case"LogicalExpression":return Ro.evalBinaryExpression(i,e);case"Compound":return Ro.evalCompound(i,e);case"ConditionalExpression":return Ro.evalConditionalExpression(i,e);case"Identifier":return Ro.evalIdentifier(i,e);case"Literal":return Ro.evalLiteral(i,e);case"MemberExpression":return Ro.evalMemberExpression(i,e);case"UnaryExpression":return Ro.evalUnaryExpression(i,e);case"ArrayExpression":return Ro.evalArrayExpression(i,e);case"CallExpression":return Ro.evalCallExpression(i,e);case"AssignmentExpression":return Ro.evalAssignmentExpression(i,e);default:throw SyntaxError("Unexpected expression",i)}},evalBinaryExpression(i,e){return{"||":(t,n)=>t||n(),"&&":(t,n)=>t&&n(),"|":(t,n)=>t|n(),"^":(t,n)=>t^n(),"&":(t,n)=>t&n(),"==":(t,n)=>t==n(),"!=":(t,n)=>t!=n(),"===":(t,n)=>t===n(),"!==":(t,n)=>t!==n(),"<":(t,n)=>t":(t,n)=>t>n(),"<=":(t,n)=>t<=n(),">=":(t,n)=>t>=n(),"<<":(t,n)=>t<>":(t,n)=>t>>n(),">>>":(t,n)=>t>>>n(),"+":(t,n)=>t+n(),"-":(t,n)=>t-n(),"*":(t,n)=>t*n(),"/":(t,n)=>t/n(),"%":(t,n)=>t%n()}[i.operator](Ro.evalAst(i.left,e),()=>Ro.evalAst(i.right,e))},evalCompound(i,e){let A;for(let t=0;t-Ro.evalAst(t,e),"!":t=>!Ro.evalAst(t,e),"~":t=>~Ro.evalAst(t,e),"+":t=>+Ro.evalAst(t,e),typeof:t=>typeof Ro.evalAst(t,e),void:t=>{Ro.evalAst(t,e)}}[i.operator](i.argument)},evalArrayExpression(i,e){return i.elements.map(A=>Ro.evalAst(A,e))},evalCallExpression(i,e){let A=i.arguments.map(n=>Ro.evalAst(n,e)),t=Ro.evalAst(i.callee,e);if(t===Function)throw new Error("Function constructor is disabled");return t(...A)},evalAssignmentExpression(i,e){if(i.left.type!=="Identifier")throw SyntaxError("Invalid left-hand side in assignment");let A=i.left.name,t=Ro.evalAst(i.right,e);return e[A]=t,e[A]}},x7=class{constructor(e){this.code=e,this.ast=Vc(this.code)}runInNewContext(e){let A=Object.assign(Object.create(null),e);return Ro.evalAst(this.ast,A)}};function a2(i,e){return i=i.slice(),i.push(e),i}function R7(i,e){return e=e.slice(),e.unshift(i),e}var N7=class extends Error{constructor(e){super('JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)'),this.avoidNew=!0,this.value=e,this.name="NewError"}};function no(i,e,A,t,n){if(!(this instanceof no))try{return new no(i,e,A,t,n)}catch(a){if(!a.avoidNew)throw a;return a.value}typeof i=="string"&&(n=t,t=A,A=e,e=i,i=null);let o=i&&typeof i=="object";if(i=i||{},this.json=i.json||A,this.path=i.path||e,this.resultType=i.resultType||"value",this.flatten=i.flatten||!1,this.wrap=Object.hasOwn(i,"wrap")?i.wrap:!0,this.sandbox=i.sandbox||{},this.eval=i.eval===void 0?"safe":i.eval,this.ignoreEvalErrors=typeof i.ignoreEvalErrors>"u"?!1:i.ignoreEvalErrors,this.parent=i.parent||null,this.parentProperty=i.parentProperty||null,this.callback=i.callback||t||null,this.otherTypeCallback=i.otherTypeCallback||n||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},i.autostart!==!1){let a={path:o?i.path:e};o?"json"in i&&(a.json=i.json):a.json=A;let r=this.evaluate(a);if(!r||typeof r!="object")throw new N7(r);return r}}no.prototype.evaluate=function(i,e,A,t){let n=this.parent,o=this.parentProperty,{flatten:a,wrap:r}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,A=A||this.callback,this.currOtherTypeCallback=t||this.otherTypeCallback,e=e||this.json,i=i||this.path,i&&typeof i=="object"&&!Array.isArray(i)){if(!i.path&&i.path!=="")throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(i,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');({json:e}=i),a=Object.hasOwn(i,"flatten")?i.flatten:a,this.currResultType=Object.hasOwn(i,"resultType")?i.resultType:this.currResultType,this.currSandbox=Object.hasOwn(i,"sandbox")?i.sandbox:this.currSandbox,r=Object.hasOwn(i,"wrap")?i.wrap:r,this.currEval=Object.hasOwn(i,"eval")?i.eval:this.currEval,A=Object.hasOwn(i,"callback")?i.callback:A,this.currOtherTypeCallback=Object.hasOwn(i,"otherTypeCallback")?i.otherTypeCallback:this.currOtherTypeCallback,n=Object.hasOwn(i,"parent")?i.parent:n,o=Object.hasOwn(i,"parentProperty")?i.parentProperty:o,i=i.path}if(n=n||null,o=o||null,Array.isArray(i)&&(i=no.toPathString(i)),!i&&i!==""||!e)return;let s=no.toPathArray(i);s[0]==="$"&&s.length>1&&s.shift(),this._hasParentSelector=null;let l=this._trace(s,e,["$"],n,o,A).filter(function(g){return g&&!g.isParentSelector});return l.length?!r&&l.length===1&&!l[0].hasArrExpr?this._getPreferredOutput(l[0]):l.reduce((g,C)=>{let I=this._getPreferredOutput(C);return a&&Array.isArray(I)?g=g.concat(I):g.push(I),g},[]):r?[]:void 0};no.prototype._getPreferredOutput=function(i){let e=this.currResultType;switch(e){case"all":{let A=Array.isArray(i.path)?i.path:no.toPathArray(i.path);return i.pointer=no.toPointer(A),i.path=typeof i.path=="string"?i.path:no.toPathString(i.path),i}case"value":case"parent":case"parentProperty":return i[e];case"path":return no.toPathString(i[e]);case"pointer":return no.toPointer(i.path);default:throw new TypeError("Unknown result type")}};no.prototype._handleCallback=function(i,e,A){if(e){let t=this._getPreferredOutput(i);i.path=typeof i.path=="string"?i.path:no.toPathString(i.path),e(t,A,i)}};no.prototype._trace=function(i,e,A,t,n,o,a,r){let s;if(!i.length)return s={path:A,value:e,parent:t,parentProperty:n,hasArrExpr:a},this._handleCallback(s,o,"value"),s;let l=i[0],g=i.slice(1),C=[];function I(B){Array.isArray(B)?B.forEach(Q=>{C.push(Q)}):C.push(B)}if((typeof l!="string"||r)&&e&&Object.hasOwn(e,l))I(this._trace(g,e[l],a2(A,l),e,l,o,a));else if(l==="*")this._walk(e,B=>{I(this._trace(g,e[B],a2(A,B),e,B,o,!0,!0))});else if(l==="..")I(this._trace(g,e,A,t,n,o,a)),this._walk(e,B=>{typeof e[B]=="object"&&I(this._trace(i.slice(),e[B],a2(A,B),e,B,o,!0))});else{if(l==="^")return this._hasParentSelector=!0,{path:A.slice(0,-1),expr:g,isParentSelector:!0};if(l==="~")return s={path:a2(A,l),value:n,parent:t,parentProperty:null},this._handleCallback(s,o,"property"),s;if(l==="$")I(this._trace(g,e,A,null,null,o,a));else if(/^(-?\d*):(-?\d*):?(\d*)$/u.test(l))I(this._slice(l,g,e,A,t,n,o));else if(l.indexOf("?(")===0){if(this.currEval===!1)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");let B=l.replace(/^\?\((.*?)\)$/u,"$1"),Q=/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(B);Q?this._walk(e,h=>{let f=[Q[2]],m=Q[1]?e[h][Q[1]]:e[h];this._trace(f,m,A,t,n,o,!0).length>0&&I(this._trace(g,e[h],a2(A,h),e,h,o,!0))}):this._walk(e,h=>{this._eval(B,e[h],h,A,t,n)&&I(this._trace(g,e[h],a2(A,h),e,h,o,!0))})}else if(l[0]==="("){if(this.currEval===!1)throw new Error("Eval [(expr)] prevented in JSONPath expression.");I(this._trace(R7(this._eval(l,e,A.at(-1),A.slice(0,-1),t,n),g),e,A,t,n,o,a))}else if(l[0]==="@"){let B=!1,Q=l.slice(1,-2);switch(Q){case"scalar":(!e||!["object","function"].includes(typeof e))&&(B=!0);break;case"boolean":case"string":case"undefined":case"function":typeof e===Q&&(B=!0);break;case"integer":Number.isFinite(e)&&!(e%1)&&(B=!0);break;case"number":Number.isFinite(e)&&(B=!0);break;case"nonFinite":typeof e=="number"&&!Number.isFinite(e)&&(B=!0);break;case"object":e&&typeof e===Q&&(B=!0);break;case"array":Array.isArray(e)&&(B=!0);break;case"other":B=this.currOtherTypeCallback(e,A,t,n);break;case"null":e===null&&(B=!0);break;default:throw new TypeError("Unknown value type "+Q)}if(B)return s={path:A,value:e,parent:t,parentProperty:n},this._handleCallback(s,o,"value"),s}else if(l[0]==="`"&&e&&Object.hasOwn(e,l.slice(1))){let B=l.slice(1);I(this._trace(g,e[B],a2(A,B),e,B,o,a,!0))}else if(l.includes(",")){let B=l.split(",");for(let Q of B)I(this._trace(R7(Q,g),e,A,t,n,o,!0))}else!r&&e&&Object.hasOwn(e,l)&&I(this._trace(g,e[l],a2(A,l),e,l,o,a,!0))}if(this._hasParentSelector)for(let B=0;B{e(A)})};no.prototype._slice=function(i,e,A,t,n,o,a){if(!Array.isArray(A))return;let r=A.length,s=i.split(":"),l=s[2]&&Number.parseInt(s[2])||1,g=s[0]&&Number.parseInt(s[0])||0,C=s[1]&&Number.parseInt(s[1])||r;g=g<0?Math.max(0,g+r):Math.min(r,g),C=C<0?Math.max(0,C+r):Math.min(r,C);let I=[];for(let B=g;B{I.push(h)});return I};no.prototype._eval=function(i,e,A,t,n,o){this.currSandbox._$_parentProperty=o,this.currSandbox._$_parent=n,this.currSandbox._$_property=A,this.currSandbox._$_root=this.json,this.currSandbox._$_v=e;let a=i.includes("@path");a&&(this.currSandbox._$_path=no.toPathString(t.concat([A])));let r=this.currEval+"Script:"+i;if(!no.cache[r]){let s=i.replaceAll("@parentProperty","_$_parentProperty").replaceAll("@parent","_$_parent").replaceAll("@property","_$_property").replaceAll("@root","_$_root").replaceAll(/@([.\s)[])/gu,"_$_v$1");if(a&&(s=s.replaceAll("@path","_$_path")),this.currEval==="safe"||this.currEval===!0||this.currEval===void 0)no.cache[r]=new this.safeVm.Script(s);else if(this.currEval==="native")no.cache[r]=new this.vm.Script(s);else if(typeof this.currEval=="function"&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,"runInNewContext")){let l=this.currEval;no.cache[r]=new l(s)}else if(typeof this.currEval=="function")no.cache[r]={runInNewContext:l=>this.currEval(s,l)};else throw new TypeError(`Unknown "eval" property "${this.currEval}"`)}try{return no.cache[r].runInNewContext(this.currSandbox)}catch(s){if(this.ignoreEvalErrors)return!1;throw new Error("jsonPath: "+s.message+": "+i)}};no.cache={};no.toPathString=function(i){let e=i,A=e.length,t="$";for(let n=1;ntypeof e[l]=="function");let o=t.map(l=>e[l]);A=n.reduce((l,g)=>{let C=e[g].toString();return/function/u.test(C)||(C="function "+C),"var "+g+"="+C+";"+l},"")+A,!/(['"])use strict\1/u.test(A)&&!t.includes("arguments")&&(A="var arguments = undefined;"+A),A=A.replace(/;\s*$/u,"");let r=A.lastIndexOf(";"),s=r!==-1?A.slice(0,r+1)+" return "+A.slice(r+1):" return "+A;return new Function(...t,s)(...o)}};no.prototype.vm={Script:F7};var G7=[],ZT=[];(()=>{let i="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,A=0;e>1;if(i=ZT[t])e=t+1;else return!0;if(e==A)return!1}}function qT(i){return i>=127462&&i<=127487}var VT=8205;function XT(i,e,A=!0,t=!0){return(A?$T:KsA)(i,e,t)}function $T(i,e,A){if(e==i.length)return e;e&&AJ(i.charCodeAt(e))&&eJ(i.charCodeAt(e-1))&&e--;let t=L7(i,e);for(e+=WT(t);e=0&&qT(L7(i,a));)o++,a-=2;if(o%2==0)break;e+=2}else break}return e}function KsA(i,e,A){for(;e>0;){let t=$T(i,e-2,A);if(t=56320&&i<57344}function eJ(i){return i>=55296&&i<56320}function WT(i){return i<65536?1:2}var Mn=class i{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,A,t){[e,A]=vB(this,e,A);let n=[];return this.decompose(0,e,n,2),t.length&&t.decompose(0,t.length,n,3),this.decompose(A,this.length,n,1),wB.from(n,this.length-(A-e)+t.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,A=this.length){[e,A]=vB(this,e,A);let t=[];return this.decompose(e,A,t,0),wB.from(t,A-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let A=this.scanIdentical(e,1),t=this.length-this.scanIdentical(e,-1),n=new $1(this),o=new $1(e);for(let a=A,r=A;;){if(n.next(a),o.next(a),a=0,n.lineBreak!=o.lineBreak||n.done!=o.done||n.value!=o.value)return!1;if(r+=n.value.length,n.done||r>=t)return!0}}iter(e=1){return new $1(this,e)}iterRange(e,A=this.length){return new Pm(this,e,A)}iterLines(e,A){let t;if(e==null)t=this.iter();else{A==null&&(A=this.lines+1);let n=this.line(e).from;t=this.iterRange(n,Math.max(n,A==this.lines+1?this.length:A<=1?0:this.line(A-1).to))}return new jm(t)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?i.empty:e.length<=32?new ul(e):wB.from(ul.split(e,[]))}},ul=class i extends Mn{constructor(e,A=UsA(e)){super(),this.text=e,this.length=A}get lines(){return this.text.length}get children(){return null}lineInner(e,A,t,n){for(let o=0;;o++){let a=this.text[o],r=n+a.length;if((A?t:r)>=e)return new T7(n,r,t,a);n=r+1,t++}}decompose(e,A,t,n){let o=e<=0&&A>=this.length?this:new i(tJ(this.text,e,A),Math.min(A,this.length)-Math.max(0,e));if(n&1){let a=t.pop(),r=zm(o.text,a.text.slice(),0,o.length);if(r.length<=32)t.push(new i(r,a.length+o.length));else{let s=r.length>>1;t.push(new i(r.slice(0,s)),new i(r.slice(s)))}}else t.push(o)}replace(e,A,t){if(!(t instanceof i))return super.replace(e,A,t);[e,A]=vB(this,e,A);let n=zm(this.text,zm(t.text,tJ(this.text,0,e)),A),o=this.length+t.length-(A-e);return n.length<=32?new i(n,o):wB.from(i.split(n,[]),o)}sliceString(e,A=this.length,t=` +`){[e,A]=vB(this,e,A);let n="";for(let o=0,a=0;o<=A&&ae&&a&&(n+=t),eo&&(n+=r.slice(Math.max(0,e-o),A-o)),o=s+1}return n}flatten(e){for(let A of this.text)e.push(A)}scanIdentical(){return 0}static split(e,A){let t=[],n=-1;for(let o of e)t.push(o),n+=o.length+1,t.length==32&&(A.push(new i(t,n)),t=[],n=-1);return n>-1&&A.push(new i(t,n)),A}},wB=class i extends Mn{constructor(e,A){super(),this.children=e,this.length=A,this.lines=0;for(let t of e)this.lines+=t.lines}lineInner(e,A,t,n){for(let o=0;;o++){let a=this.children[o],r=n+a.length,s=t+a.lines-1;if((A?s:r)>=e)return a.lineInner(e,A,t,n);n=r+1,t=s+1}}decompose(e,A,t,n){for(let o=0,a=0;a<=A&&o=a){let l=n&((a<=e?1:0)|(s>=A?2:0));a>=e&&s<=A&&!l?t.push(r):r.decompose(e-a,A-a,t,l)}a=s+1}}replace(e,A,t){if([e,A]=vB(this,e,A),t.lines=o&&A<=r){let s=a.replace(e-o,A-o,t),l=this.lines-a.lines+s.lines;if(s.lines>4&&s.lines>l>>6){let g=this.children.slice();return g[n]=s,new i(g,this.length-(A-e)+t.length)}return super.replace(o,r,s)}o=r+1}return super.replace(e,A,t)}sliceString(e,A=this.length,t=` +`){[e,A]=vB(this,e,A);let n="";for(let o=0,a=0;oe&&o&&(n+=t),ea&&(n+=r.sliceString(e-a,A-a,t)),a=s+1}return n}flatten(e){for(let A of this.children)A.flatten(e)}scanIdentical(e,A){if(!(e instanceof i))return 0;let t=0,[n,o,a,r]=A>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;n+=A,o+=A){if(n==a||o==r)return t;let s=this.children[n],l=e.children[o];if(s!=l)return t+s.scanIdentical(l,A);t+=s.length+1}}static from(e,A=e.reduce((t,n)=>t+n.length+1,-1)){let t=0;for(let B of e)t+=B.lines;if(t<32){let B=[];for(let Q of e)Q.flatten(B);return new ul(B,A)}let n=Math.max(32,t>>5),o=n<<1,a=n>>1,r=[],s=0,l=-1,g=[];function C(B){let Q;if(B.lines>o&&B instanceof i)for(let h of B.children)C(h);else B.lines>a&&(s>a||!s)?(I(),r.push(B)):B instanceof ul&&s&&(Q=g[g.length-1])instanceof ul&&B.lines+Q.lines<=32?(s+=B.lines,l+=B.length+1,g[g.length-1]=new ul(Q.text.concat(B.text),Q.length+1+B.length)):(s+B.lines>n&&I(),s+=B.lines,l+=B.length+1,g.push(B))}function I(){s!=0&&(r.push(g.length==1?g[0]:i.from(g,l)),l=-1,s=g.length=0)}for(let B of e)C(B);return I(),r.length==1?r[0]:new i(r,A)}};Mn.empty=new ul([""],0);function UsA(i){let e=-1;for(let A of i)e+=A.length+1;return e}function zm(i,e,A=0,t=1e9){for(let n=0,o=0,a=!0;o=A&&(s>t&&(r=r.slice(0,t-n)),n0?1:(e instanceof ul?e.text.length:e.children.length)<<1]}nextInner(e,A){for(this.done=this.lineBreak=!1;;){let t=this.nodes.length-1,n=this.nodes[t],o=this.offsets[t],a=o>>1,r=n instanceof ul?n.text.length:n.children.length;if(a==(A>0?r:0)){if(t==0)return this.done=!0,this.value="",this;A>0&&this.offsets[t-1]++,this.nodes.pop(),this.offsets.pop()}else if((o&1)==(A>0?0:1)){if(this.offsets[t]+=A,e==0)return this.lineBreak=!0,this.value=` +`,this;e--}else if(n instanceof ul){let s=n.text[a+(A<0?-1:0)];if(this.offsets[t]+=A,s.length>Math.max(0,e))return this.value=e==0?s:A>0?s.slice(e):s.slice(0,s.length-e),this;e-=s.length}else{let s=n.children[a+(A<0?-1:0)];e>s.length?(e-=s.length,this.offsets[t]+=A):(A<0&&this.offsets[t]--,this.nodes.push(s),this.offsets.push(A>0?1:(s instanceof ul?s.text.length:s.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},Pm=class{constructor(e,A,t){this.value="",this.done=!1,this.cursor=new $1(e,A>t?-1:1),this.pos=A>t?e.length:0,this.from=Math.min(A,t),this.to=Math.max(A,t)}nextInner(e,A){if(A<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,A<0?this.pos-this.to:this.from-this.pos);let t=A<0?this.pos-this.from:this.to-this.pos;e>t&&(e=t),t-=e;let{value:n}=this.cursor.next(e);return this.pos+=(n.length+e)*A,this.value=n.length<=t?n:A<0?n.slice(n.length-t):n.slice(0,t),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},jm=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:A,lineBreak:t,value:n}=this.inner.next(e);return A&&this.afterBreak?(this.value="",this.afterBreak=!1):A?(this.done=!0,this.value=""):t?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<"u"&&(Mn.prototype[Symbol.iterator]=function(){return this.iter()},$1.prototype[Symbol.iterator]=Pm.prototype[Symbol.iterator]=jm.prototype[Symbol.iterator]=function(){return this});var T7=class{constructor(e,A,t,n){this.from=e,this.to=A,this.number=t,this.text=n}get length(){return this.to-this.from}};function vB(i,e,A){return e=Math.max(0,Math.min(i.length,e)),[e,Math.max(e,Math.min(i.length,A))]}function za(i,e,A=!0,t=!0){return XT(i,e,A,t)}function TsA(i){return i>=56320&&i<57344}function JsA(i){return i>=55296&&i<56320}function Or(i,e){let A=i.charCodeAt(e);if(!JsA(A)||e+1==i.length)return A;let t=i.charCodeAt(e+1);return TsA(t)?(A-55296<<10)+(t-56320)+65536:A}function Q4(i){return i<=65535?String.fromCharCode(i):(i-=65536,String.fromCharCode((i>>10)+55296,(i&1023)+56320))}function pl(i){return i<65536?1:2}var J7=/\r\n?|\n/,Tr=(function(i){return i[i.Simple=0]="Simple",i[i.TrackDel=1]="TrackDel",i[i.TrackBefore=2]="TrackBefore",i[i.TrackAfter=3]="TrackAfter",i})(Tr||(Tr={})),s2=class i{constructor(e){this.sections=e}get length(){let e=0;for(let A=0;Ae)return o+(e-n);o+=r}else{if(t!=Tr.Simple&&l>=e&&(t==Tr.TrackDel&&ne||t==Tr.TrackBefore&&ne))return null;if(l>e||l==e&&A<0&&!r)return e==n||A<0?o:o+s;o+=s}n=l}if(e>n)throw new RangeError(`Position ${e} is out of range for changeset of length ${n}`);return o}touchesRange(e,A=e){for(let t=0,n=0;t=0&&n<=A&&r>=e)return nA?"cover":!0;n=r}return!1}toString(){let e="";for(let A=0;A=0?":"+n:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(A=>typeof A!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new i(e)}static create(e){return new i(e)}},Jr=class i extends s2{constructor(e,A){super(e),this.inserted=A}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return Y7(this,(A,t,n,o,a)=>e=e.replace(n,n+(t-A),a),!1),e}mapDesc(e,A=!1){return O7(this,e,A,!0)}invert(e){let A=this.sections.slice(),t=[];for(let n=0,o=0;n=0){A[n]=r,A[n+1]=a;let s=n>>1;for(;t.length0&&r2(t,A,o.text),o.forward(g),r+=g}let l=e[a++];for(;r>1].toJSON()))}return e}static of(e,A,t){let n=[],o=[],a=0,r=null;function s(g=!1){if(!g&&!n.length)return;aI||C<0||I>A)throw new RangeError(`Invalid change range ${C} to ${I} (in doc of length ${A})`);let Q=B?typeof B=="string"?Mn.of(B.split(t||J7)):B:Mn.empty,h=Q.length;if(C==I&&h==0)return;Ca&&cs(n,C-a,-1),cs(n,I-C,h),r2(o,n,Q),a=I}}return l(e),s(!r),r}static empty(e){return new i(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let A=[],t=[];for(let n=0;nr&&typeof a!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(o.length==1)A.push(o[0],0);else{for(;t.length=0&&A<=0&&A==i[n+1]?i[n]+=e:n>=0&&e==0&&i[n]==0?i[n+1]+=A:t?(i[n]+=e,i[n+1]+=A):i.push(e,A)}function r2(i,e,A){if(A.length==0)return;let t=e.length-2>>1;if(t>1])),!(A||a==i.sections.length||i.sections[a+1]<0);)r=i.sections[a++],s=i.sections[a++];e(n,l,o,g,C),n=l,o=g}}}function O7(i,e,A,t=!1){let n=[],o=t?[]:null,a=new AI(i),r=new AI(e);for(let s=-1;;){if(a.done&&r.len||r.done&&a.len)throw new Error("Mismatched change set lengths");if(a.ins==-1&&r.ins==-1){let l=Math.min(a.len,r.len);cs(n,l,-1),a.forward(l),r.forward(l)}else if(r.ins>=0&&(a.ins<0||s==a.i||a.off==0&&(r.len=0&&s=0){let l=0,g=a.len;for(;g;)if(r.ins==-1){let C=Math.min(g,r.len);l+=C,g-=C,r.forward(C)}else if(r.ins==0&&r.lens||a.ins>=0&&a.len>s)&&(r||t.length>l),o.forward2(s),a.forward(s)}}}}var AI=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return A>=e.length?Mn.empty:e[A]}textBit(e){let{inserted:A}=this.set,t=this.i-2>>1;return t>=A.length&&!e?Mn.empty:A[t].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},mB=class i{constructor(e,A,t){this.from=e,this.to=A,this.flags=t}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}get goalColumn(){let e=this.flags>>6;return e==16777215?void 0:e}map(e,A=-1){let t,n;return this.empty?t=n=e.mapPos(this.from,A):(t=e.mapPos(this.from,1),n=e.mapPos(this.to,-1)),t==this.from&&n==this.to?this:new i(t,n,this.flags)}extend(e,A=e,t=0){if(e<=this.anchor&&A>=this.anchor)return Ce.range(e,A,void 0,void 0,t);let n=Math.abs(e-this.anchor)>Math.abs(A-this.anchor)?e:A;return Ce.range(this.anchor,n,void 0,void 0,t)}eq(e,A=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!A||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return Ce.range(e.anchor,e.head)}static create(e,A,t){return new i(e,A,t)}},Ce=class i{constructor(e,A){this.ranges=e,this.mainIndex=A}map(e,A=-1){return e.empty?this:i.create(this.ranges.map(t=>t.map(e,A)),this.mainIndex)}eq(e,A=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let t=0;te.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new i(e.ranges.map(A=>mB.fromJSON(A)),e.main)}static single(e,A=e){return new i([i.range(e,A)],0)}static create(e,A=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let t=0,n=0;nn.from-o.from),A=e.indexOf(t);for(let n=1;no.head?i.range(s,r):i.range(r,s))}}return new i(e,A)}};function gJ(i,e){for(let A of i.ranges)if(A.to>e)throw new RangeError("Selection points outside of document")}var X7=0,tt=class i{constructor(e,A,t,n,o){this.combine=e,this.compareInput=A,this.compare=t,this.isStatic=n,this.id=X7++,this.default=e([]),this.extensions=typeof o=="function"?o(this):o}get reader(){return this}static define(e={}){return new i(e.combine||(A=>A),e.compareInput||((A,t)=>A===t),e.compare||(e.combine?(A,t)=>A===t:$7),!!e.static,e.enables)}of(e){return new DB([],this,0,e)}compute(e,A){if(this.isStatic)throw new Error("Can't compute a static facet");return new DB(e,this,1,A)}computeN(e,A){if(this.isStatic)throw new Error("Can't compute a static facet");return new DB(e,this,2,A)}from(e,A){return A||(A=t=>t),this.compute([e],t=>A(t.field(e)))}};function $7(i,e){return i==e||i.length==e.length&&i.every((A,t)=>A===e[t])}var DB=class{constructor(e,A,t,n){this.dependencies=e,this.facet=A,this.type=t,this.value=n,this.id=X7++}dynamicSlot(e){var A;let t=this.value,n=this.facet.compareInput,o=this.id,a=e[o]>>1,r=this.type==2,s=!1,l=!1,g=[];for(let C of this.dependencies)C=="doc"?s=!0:C=="selection"?l=!0:(((A=e[C.id])!==null&&A!==void 0?A:1)&1)==0&&g.push(e[C.id]);return{create(C){return C.values[a]=t(C),1},update(C,I){if(s&&I.docChanged||l&&(I.docChanged||I.selection)||H7(C,g)){let B=t(C);if(r?!iJ(B,C.values[a],n):!n(B,C.values[a]))return C.values[a]=B,1}return 0},reconfigure:(C,I)=>{let B,Q=I.config.address[o];if(Q!=null){let h=Wm(I,Q);if(this.dependencies.every(f=>f instanceof tt?I.facet(f)===C.facet(f):f instanceof ba?I.field(f,!1)==C.field(f,!1):!0)||(r?iJ(B=t(C),h,n):n(B=t(C),h)))return C.values[a]=h,0}else B=t(C);return C.values[a]=B,1}}}};function iJ(i,e,A){if(i.length!=e.length)return!1;for(let t=0;ti[s.id]),n=A.map(s=>s.type),o=t.filter(s=>!(s&1)),a=i[e.id]>>1;function r(s){let l=[];for(let g=0;gt===n),e);return e.provide&&(A.provides=e.provide(A)),A}create(e){let A=e.facet(Ym).find(t=>t.field==this);return(A?.create||this.createF)(e)}slot(e){let A=e[this.id]>>1;return{create:t=>(t.values[A]=this.create(t),1),update:(t,n)=>{let o=t.values[A],a=this.updateF(o,n);return this.compareF(o,a)?0:(t.values[A]=a,1)},reconfigure:(t,n)=>{let o=t.facet(Ym),a=n.facet(Ym),r;return(r=o.find(s=>s.field==this))&&r!=a.find(s=>s.field==this)?(t.values[A]=r.create(t),1):n.config.address[this.id]!=null?(t.values[A]=n.field(this),0):(t.values[A]=this.create(t),1)}}}init(e){return[this,Ym.of({field:this,create:e})]}get extension(){return this}},Z1={lowest:4,low:3,default:2,high:1,highest:0};function I4(i){return e=>new qm(e,i)}var zg={highest:I4(Z1.highest),high:I4(Z1.high),default:I4(Z1.default),low:I4(Z1.low),lowest:I4(Z1.lowest)},qm=class{constructor(e,A){this.inner=e,this.prec=A}},Zc=class i{of(e){return new B4(this,e)}reconfigure(e){return i.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}},B4=class{constructor(e,A){this.compartment=e,this.inner=A}},Vm=class i{constructor(e,A,t,n,o,a){for(this.base=e,this.compartments=A,this.dynamicSlots=t,this.address=n,this.staticValues=o,this.facets=a,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,A,t){let n=[],o=Object.create(null),a=new Map;for(let I of OsA(e,A,a))I instanceof ba?n.push(I):(o[I.facet.id]||(o[I.facet.id]=[])).push(I);let r=Object.create(null),s=[],l=[];for(let I of n)r[I.id]=l.length<<1,l.push(B=>I.slot(B));let g=t?.config.facets;for(let I in o){let B=o[I],Q=B[0].facet,h=g&&g[I]||[];if(B.every(f=>f.type==0))if(r[Q.id]=s.length<<1|1,$7(h,B))s.push(t.facet(Q));else{let f=Q.combine(B.map(m=>m.value));s.push(t&&Q.compare(f,t.facet(Q))?t.facet(Q):f)}else{for(let f of B)f.type==0?(r[f.id]=s.length<<1|1,s.push(f.value)):(r[f.id]=l.length<<1,l.push(m=>f.dynamicSlot(m)));r[Q.id]=l.length<<1,l.push(f=>YsA(f,Q,B))}}let C=l.map(I=>I(r));return new i(e,a,C,r,s,o)}};function OsA(i,e,A){let t=[[],[],[],[],[]],n=new Map;function o(a,r){let s=n.get(a);if(s!=null){if(s<=r)return;let l=t[s].indexOf(a);l>-1&&t[s].splice(l,1),a instanceof B4&&A.delete(a.compartment)}if(n.set(a,r),Array.isArray(a))for(let l of a)o(l,r);else if(a instanceof B4){if(A.has(a.compartment))throw new RangeError("Duplicate use of compartment in extensions");let l=e.get(a.compartment)||a.inner;A.set(a.compartment,l),o(l,r)}else if(a instanceof qm)o(a.inner,a.prec);else if(a instanceof ba)t[r].push(a),a.provides&&o(a.provides,r);else if(a instanceof DB)t[r].push(a),a.facet.extensions&&o(a.facet.extensions,Z1.default);else{let l=a.extension;if(!l)throw new Error(`Unrecognized extension value in extension set (${a}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);o(l,r)}}return o(i,Z1.default),t.reduce((a,r)=>a.concat(r))}function d4(i,e){if(e&1)return 2;let A=e>>1,t=i.status[A];if(t==4)throw new Error("Cyclic dependency between fields and/or facets");if(t&2)return t;i.status[A]=4;let n=i.computeSlot(i,i.config.dynamicSlots[A]);return i.status[A]=2|n}function Wm(i,e){return e&1?i.config.staticValues[e>>1]:i.values[e>>1]}var nJ=tt.define(),K7=tt.define({combine:i=>i.some(e=>e),static:!0}),cJ=tt.define({combine:i=>i.length?i[0]:void 0,static:!0}),CJ=tt.define(),IJ=tt.define(),dJ=tt.define(),oJ=tt.define({combine:i=>i.length?i[0]:!1}),Vs=class{constructor(e,A){this.type=e,this.value=A}static define(){return new z7}},z7=class{of(e){return new Vs(this,e)}},P7=class{constructor(e){this.map=e}of(e){return new $i(this,e)}},$i=(()=>{class i{constructor(A,t){this.type=A,this.value=t}map(A){let t=this.type.map(this.value,A);return t===void 0?void 0:t==this.value?this:new i(this.type,t)}is(A){return this.type==A}static define(A={}){return new P7(A.map||(t=>t))}static mapEffects(A,t){if(!A.length)return A;let n=[];for(let o of A){let a=o.map(t);a&&n.push(a)}return n}}return i.reconfigure=i.define(),i.appendConfig=i.define(),i})(),Wc=(()=>{class i{constructor(A,t,n,o,a,r){this.startState=A,this.changes=t,this.selection=n,this.effects=o,this.annotations=a,this.scrollIntoView=r,this._doc=null,this._state=null,n&&gJ(n,t.newLength),a.some(s=>s.type==i.time)||(this.annotations=a.concat(i.time.of(Date.now())))}static create(A,t,n,o,a,r){return new i(A,t,n,o,a,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(A){for(let t of this.annotations)if(t.type==A)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(A){let t=this.annotation(i.userEvent);return!!(t&&(t==A||t.length>A.length&&t.slice(0,A.length)==A&&t[A.length]=="."))}}return i.time=Vs.define(),i.userEvent=Vs.define(),i.addToHistory=Vs.define(),i.remote=Vs.define(),i})();function HsA(i,e){let A=[];for(let t=0,n=0;;){let o,a;if(t=i[t]))o=i[t++],a=i[t++];else if(n=0;n--){let o=t[n](i);o instanceof Wc?i=o:Array.isArray(o)&&o.length==1&&o[0]instanceof Wc?i=o[0]:i=EJ(e,yB(o),!1)}return i}function PsA(i){let e=i.startState,A=e.facet(dJ),t=i;for(let n=A.length-1;n>=0;n--){let o=A[n](i);o&&Object.keys(o).length&&(t=BJ(t,j7(e,o,i.changes.newLength),!0))}return t==i?i:Wc.create(e,i.changes,i.selection,t.effects,t.annotations,t.scrollIntoView)}var jsA=[];function yB(i){return i==null?jsA:Array.isArray(i)?i:[i]}var Jo=(function(i){return i[i.Word=0]="Word",i[i.Space=1]="Space",i[i.Other=2]="Other",i})(Jo||(Jo={})),qsA=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,q7;try{q7=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch(i){}function VsA(i){if(q7)return q7.test(i);for(let e=0;e"\x80"&&(A.toUpperCase()!=A.toLowerCase()||qsA.test(A)))return!0}return!1}function WsA(i){return e=>{if(!/\S/.test(e))return Jo.Space;if(VsA(e))return Jo.Word;for(let A=0;A-1)return Jo.Word;return Jo.Other}}var Pa=(()=>{class i{constructor(A,t,n,o,a,r){this.config=A,this.doc=t,this.selection=n,this.values=o,this.status=A.statusTemplate.slice(),this.computeSlot=a,r&&(r._state=this);for(let s=0;so.set(g,l)),t=null),o.set(s.value.compartment,s.value.extension)):s.is($i.reconfigure)?(t=null,n=s.value):s.is($i.appendConfig)&&(t=null,n=yB(n).concat(s.value));let a;t?a=A.startState.values.slice():(t=Vm.resolve(n,o,this),a=new i(t,this.doc,this.selection,t.dynamicSlots.map(()=>null),(l,g)=>g.reconfigure(l,this),null).values);let r=A.startState.facet(K7)?A.newSelection:A.newSelection.asSingle();new i(t,A.newDoc,r,a,(s,l)=>l.update(s,A),A)}replaceSelection(A){return typeof A=="string"&&(A=this.toText(A)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:A},range:Ce.cursor(t.from+A.length)}))}changeByRange(A){let t=this.selection,n=A(t.ranges[0]),o=this.changes(n.changes),a=[n.range],r=yB(n.effects);for(let s=1;sr.spec.fromJSON(s,l)))}}return i.create({doc:A.doc,selection:Ce.fromJSON(A.selection),extensions:t.extensions?o.concat([t.extensions]):o})}static create(A={}){let t=Vm.resolve(A.extensions||[],new Map),n=A.doc instanceof Mn?A.doc:Mn.of((A.doc||"").split(t.staticFacet(i.lineSeparator)||J7)),o=A.selection?A.selection instanceof Ce?A.selection:Ce.single(A.selection.anchor,A.selection.head):Ce.single(0);return gJ(o,n.length),t.staticFacet(K7)||(o=o.asSingle()),new i(t,n,o,t.dynamicSlots.map(()=>null),(a,r)=>r.create(a),null)}get tabSize(){return this.facet(i.tabSize)}get lineBreak(){return this.facet(i.lineSeparator)||` +`}get readOnly(){return this.facet(oJ)}phrase(A,...t){for(let n of this.facet(i.phrases))if(Object.prototype.hasOwnProperty.call(n,A)){A=n[A];break}return t.length&&(A=A.replace(/\$(\$|\d*)/g,(n,o)=>{if(o=="$")return"$";let a=+(o||1);return!a||a>t.length?n:t[a-1]})),A}languageDataAt(A,t,n=-1){let o=[];for(let a of this.facet(nJ))for(let r of a(this,t,n))Object.prototype.hasOwnProperty.call(r,A)&&o.push(r[A]);return o}charCategorizer(A){let t=this.languageDataAt("wordChars",A);return WsA(t.length?t[0]:"")}wordAt(A){let{text:t,from:n,length:o}=this.doc.lineAt(A),a=this.charCategorizer(A),r=A-n,s=A-n;for(;r>0;){let l=za(t,r,!1);if(a(t.slice(l,r))!=Jo.Word)break;r=l}for(;se.length?e[0]:4}),i.lineSeparator=cJ,i.readOnly=oJ,i.phrases=tt.define({compare(e,A){let t=Object.keys(e),n=Object.keys(A);return t.length==n.length&&t.every(o=>e[o]==A[o])}}),i.languageData=nJ,i.changeFilter=CJ,i.transactionFilter=IJ,i.transactionExtender=dJ,i})();Zc.reconfigure=$i.define();function Dr(i,e,A={}){let t={};for(let n of i)for(let o of Object.keys(n)){let a=n[o],r=t[o];if(r===void 0)t[o]=a;else if(!(r===a||a===void 0))if(Object.hasOwnProperty.call(A,o))t[o]=A[o](r,a);else throw new Error("Config merge conflict for field "+o)}for(let n in e)t[n]===void 0&&(t[n]=e[n]);return t}var $l=class{eq(e){return this==e}range(e,A=e){return E4.create(e,A,this)}};$l.prototype.startSide=$l.prototype.endSide=0;$l.prototype.point=!1;$l.prototype.mapMode=Tr.TrackDel;function AM(i,e){return i==e||i.constructor==e.constructor&&i.eq(e)}var E4=class i{constructor(e,A,t){this.from=e,this.to=A,this.value=t}static create(e,A,t){return new i(e,A,t)}};function V7(i,e){return i.from-e.from||i.value.startSide-e.value.startSide}var W7=class i{constructor(e,A,t,n){this.from=e,this.to=A,this.value=t,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(e,A,t,n=0){let o=t?this.to:this.from;for(let a=n,r=o.length;;){if(a==r)return a;let s=a+r>>1,l=o[s]-e||(t?this.value[s].endSide:this.value[s].startSide)-A;if(s==a)return l>=0?a:r;l>=0?r=s:a=s+1}}between(e,A,t,n){for(let o=this.findIndex(A,-1e9,!0),a=this.findIndex(t,1e9,!1,o);oB||I==B&&l.startSide>0&&l.endSide<=0)continue;(B-I||l.endSide-l.startSide)<0||(a<0&&(a=I),l.point&&(r=Math.max(r,B-I)),t.push(l),n.push(I-a),o.push(B-a))}return{mapped:t.length?new i(n,o,t,r):null,pos:a}}},oo=(()=>{class i{constructor(A,t,n,o){this.chunkPos=A,this.chunk=t,this.nextLayer=n,this.maxPoint=o}static create(A,t,n,o){return new i(A,t,n,o)}get length(){let A=this.chunk.length-1;return A<0?0:Math.max(this.chunkEnd(A),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let A=this.nextLayer.size;for(let t of this.chunk)A+=t.value.length;return A}chunkEnd(A){return this.chunkPos[A]+this.chunk[A].length}update(A){let{add:t=[],sort:n=!1,filterFrom:o=0,filterTo:a=this.length}=A,r=A.filter;if(t.length==0&&!r)return this;if(n&&(t=t.slice().sort(V7)),this.isEmpty)return t.length?i.of(t):this;let s=new Zm(this,null,-1).goto(0),l=0,g=[],C=new Yr;for(;s.value||l=0){let I=t[l++];C.addInner(I.from,I.to,I.value)||g.push(I)}else s.rangeIndex==1&&s.chunkIndexthis.chunkEnd(s.chunkIndex)||as.to||a=a&&A<=a+r.length&&r.between(a,A-a,t-a,n)===!1)return}this.nextLayer.between(A,t,n)}}iter(A=0){return h4.from([this]).goto(A)}get isEmpty(){return this.nextLayer==this}static iter(A,t=0){return h4.from(A).goto(t)}static compare(A,t,n,o,a=-1){let r=A.filter(I=>I.maxPoint>0||!I.isEmpty&&I.maxPoint>=a),s=t.filter(I=>I.maxPoint>0||!I.isEmpty&&I.maxPoint>=a),l=aJ(r,s,n),g=new X1(r,l,a),C=new X1(s,l,a);n.iterGaps((I,B,Q)=>rJ(g,I,C,B,Q,o)),n.empty&&n.length==0&&rJ(g,0,C,0,0,o)}static eq(A,t,n=0,o){o==null&&(o=999999999);let a=A.filter(C=>!C.isEmpty&&t.indexOf(C)<0),r=t.filter(C=>!C.isEmpty&&A.indexOf(C)<0);if(a.length!=r.length)return!1;if(!a.length)return!0;let s=aJ(a,r),l=new X1(a,s,0).goto(n),g=new X1(r,s,0).goto(n);for(;;){if(l.to!=g.to||!Z7(l.active,g.active)||l.point&&(!g.point||!AM(l.point,g.point)))return!1;if(l.to>o)return!0;l.next(),g.next()}}static spans(A,t,n,o,a=-1){let r=new X1(A,null,a).goto(t),s=t,l=r.openStart;for(;;){let g=Math.min(r.to,n);if(r.point){let C=r.activeForPoint(r.to),I=r.pointFroms&&(o.span(s,g,r.active,l),l=r.openEnd(g));if(r.to>n)return l+(r.point&&r.to>n?1:0);s=r.to,r.next()}}static of(A,t=!1){let n=new Yr;for(let o of A instanceof E4?[A]:t?ZsA(A):A)n.add(o.from,o.to,o.value);return n.finish()}static join(A){if(!A.length)return i.empty;let t=A[A.length-1];for(let n=A.length-2;n>=0;n--)for(let o=A[n];o!=i.empty;o=o.nextLayer)t=new i(o.chunkPos,o.chunk,t,Math.max(o.maxPoint,t.maxPoint));return t}}return i.empty=new i([],[],null,-1),i})();function ZsA(i){if(i.length>1)for(let e=i[0],A=1;A0)return i.slice().sort(V7);e=t}return i}oo.empty.nextLayer=oo.empty;var Yr=class i{finishChunk(e){this.chunks.push(new W7(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,A,t){this.addInner(e,A,t)||(this.nextLayer||(this.nextLayer=new i)).add(e,A,t)}addInner(e,A,t){let n=e-this.lastTo||t.startSide-this.last.endSide;if(n<=0&&(e-this.lastFrom||t.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(A-this.chunkStart),this.last=t,this.lastFrom=e,this.lastTo=A,this.value.push(t),t.point&&(this.maxPoint=Math.max(this.maxPoint,A-e)),!0)}addChunk(e,A){if((e-this.lastTo||A.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,A.maxPoint),this.chunks.push(A),this.chunkPos.push(e);let t=A.value.length-1;return this.last=A.value[t],this.lastFrom=A.from[t]+e,this.lastTo=A.to[t]+e,!0}finish(){return this.finishInner(oo.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let A=oo.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,A}};function aJ(i,e,A){let t=new Map;for(let o of i)for(let a=0;a=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=t&&n.push(new Zm(a,A,t,o));return n.length==1?n[0]:new i(n)}get startSide(){return this.value?this.value.startSide:0}goto(e,A=-1e9){for(let t of this.heap)t.goto(e,A);for(let t=this.heap.length>>1;t>=0;t--)U7(this.heap,t);return this.next(),this}forward(e,A){for(let t of this.heap)t.forward(e,A);for(let t=this.heap.length>>1;t>=0;t--)U7(this.heap,t);(this.to-e||this.value.endSide-A)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),U7(this.heap,0)}}};function U7(i,e){for(let A=i[e];;){let t=(e<<1)+1;if(t>=i.length)break;let n=i[t];if(t+1=0&&(n=i[t+1],t++),A.compare(n)<0)break;i[t]=A,i[e]=n,e=t}}var X1=class{constructor(e,A,t){this.minPoint=t,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=h4.from(e,A,t)}goto(e,A=-1e9){return this.cursor.goto(e,A),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=A,this.openStart=-1,this.next(),this}forward(e,A){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-A)<0;)this.removeActive(this.minActive);this.cursor.forward(e,A)}removeActive(e){Om(this.active,e),Om(this.activeTo,e),Om(this.activeRank,e),this.minActive=sJ(this.active,this.activeTo)}addActive(e){let A=0,{value:t,to:n,rank:o}=this.cursor;for(;A0;)A++;Hm(this.active,A,t),Hm(this.activeTo,A,n),Hm(this.activeRank,A,o),e&&Hm(e,A,this.cursor.from),this.minActive=sJ(this.active,this.activeTo)}next(){let e=this.to,A=this.point;this.point=null;let t=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>e){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),t&&Om(t,n)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let o=this.cursor.value;if(!o.point)this.addActive(t),this.cursor.next();else if(A&&this.cursor.to==this.to&&this.cursor.from=0&&t[n]=0&&!(this.activeRank[t]e||this.activeTo[t]==e&&this.active[t].endSide>=this.point.endSide)&&A.push(this.active[t]);return A.reverse()}openEnd(e){let A=0;for(let t=this.activeTo.length-1;t>=0&&this.activeTo[t]>e;t--)A++;return A}};function rJ(i,e,A,t,n,o){i.goto(e),A.goto(t);let a=t+n,r=t,s=t-e,l=!!o.boundChange;for(let g=!1;;){let C=i.to+s-A.to,I=C||i.endSide-A.endSide,B=I<0?i.to+s:A.to,Q=Math.min(B,a);if(i.point||A.point?(i.point&&A.point&&AM(i.point,A.point)&&Z7(i.activeForPoint(i.to),A.activeForPoint(A.to))||o.comparePoint(r,Q,i.point,A.point),g=!1):(g&&o.boundChange(r),Q>r&&!Z7(i.active,A.active)&&o.compareRange(r,Q,i.active,A.active),l&&Qa)break;r=B,I<=0&&i.next(),I>=0&&A.next()}}function Z7(i,e){if(i.length!=e.length)return!1;for(let A=0;A=e;t--)i[t+1]=i[t];i[e]=A}function sJ(i,e){let A=-1,t=1e9;for(let n=0;n=e)return n;if(n==i.length)break;o+=i.charCodeAt(n)==9?A-o%A:1,n=za(i,n)}return t===!0?-1:i.length}var hJ=typeof Symbol>"u"?"__\u037C":Symbol.for("\u037C"),eM=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),QJ=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{},Ag=class{constructor(e,A){this.rules=[];let{finish:t}=A||{};function n(a){return/^@/.test(a)?[a]:a.split(/,\s*/)}function o(a,r,s,l){let g=[],C=/^@(\w+)\b/.exec(a[0]),I=C&&C[1]=="keyframes";if(C&&r==null)return s.push(a[0]+";");for(let B in r){let Q=r[B];if(/&/.test(B))o(B.split(/,\s*/).map(h=>a.map(f=>h.replace(/&/,f))).reduce((h,f)=>h.concat(f)),Q,s);else if(Q&&typeof Q=="object"){if(!C)throw new RangeError("The value of a property ("+B+") should be a primitive value.");o(n(B),Q,g,I)}else Q!=null&&g.push(B.replace(/_.*/,"").replace(/[A-Z]/g,h=>"-"+h.toLowerCase())+": "+Q+";")}(g.length||I)&&s.push((t&&!C&&!l?a.map(t):a).join(", ")+" {"+g.join(" ")+"}")}for(let a in e)o(n(a),e[a],this.rules)}getRules(){return this.rules.join(` +`)}static newName(){let e=QJ[hJ]||1;return QJ[hJ]=e+1,"\u037C"+e.toString(36)}static mount(e,A,t){let n=e[eM],o=t&&t.nonce;n?o&&n.setNonce(o):n=new tM(e,o),n.mount(Array.isArray(A)?A:[A],e)}},uJ=new Map,tM=class{constructor(e,A){let t=e.ownerDocument||e,n=t.defaultView;if(!e.head&&e.adoptedStyleSheets&&n.CSSStyleSheet){let o=uJ.get(t);if(o)return e[eM]=o;this.sheet=new n.CSSStyleSheet,uJ.set(t,this)}else this.styleTag=t.createElement("style"),A&&this.styleTag.setAttribute("nonce",A);this.modules=[],e[eM]=this}mount(e,A){let t=this.sheet,n=0,o=0;for(let a=0;a-1&&(this.modules.splice(s,1),o--,s=-1),s==-1){if(this.modules.splice(o++,0,r),t)for(let l=0;l",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},XsA=typeof navigator<"u"&&/Mac/.test(navigator.platform),$sA=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(Xa=0;Xa<10;Xa++)P0[48+Xa]=P0[96+Xa]=String(Xa);var Xa;for(Xa=1;Xa<=24;Xa++)P0[Xa+111]="F"+Xa;var Xa;for(Xa=65;Xa<=90;Xa++)P0[Xa]=String.fromCharCode(Xa+32),bB[Xa]=String.fromCharCode(Xa);var Xa;for($m in P0)bB.hasOwnProperty($m)||(bB[$m]=P0[$m]);var $m;function pJ(i){var e=XsA&&i.metaKey&&i.shiftKey&&!i.ctrlKey&&!i.altKey||$sA&&i.shiftKey&&i.key&&i.key.length==1||i.key=="Unidentified",A=!e&&i.key||(i.shiftKey?bB:P0)[i.keyCode]||i.key||"Unidentified";return A=="Esc"&&(A="Escape"),A=="Del"&&(A="Delete"),A=="Left"&&(A="ArrowLeft"),A=="Up"&&(A="ArrowUp"),A=="Right"&&(A="ArrowRight"),A=="Down"&&(A="ArrowDown"),A}function ao(){var i=arguments[0];typeof i=="string"&&(i=document.createElement(i));var e=1,A=arguments[1];if(A&&typeof A=="object"&&A.nodeType==null&&!Array.isArray(A)){for(var t in A)if(Object.prototype.hasOwnProperty.call(A,t)){var n=A[t];typeof n=="string"?i.setAttribute(t,n):n!=null&&(i[t]=n)}e++}for(;e2),lt={mac:DJ||/Mac/.test(vs.platform),windows:/Win/.test(vs.platform),linux:/Linux|X11/.test(vs.platform),ie:x6,ie_version:lY?dM.documentMode||6:EM?+EM[1]:BM?+BM[1]:0,gecko:mJ,gecko_version:mJ?+(/Firefox\/(\d+)/.exec(vs.userAgent)||[0,0])[1]:0,chrome:!!iM,chrome_version:iM?+iM[1]:0,ios:DJ,android:/Android\b/.test(vs.userAgent),webkit:wJ,webkit_version:wJ?+(/\bAppleWebKit\/(\d+)/.exec(vs.userAgent)||[0,0])[1]:0,safari:hM,safari_version:hM?+(/\bVersion\/(\d+(\.\d+)?)/.exec(vs.userAgent)||[0,0])[1]:0,tabSize:dM.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"};function s9(i,e){for(let A in i)A=="class"&&e.class?e.class+=" "+i.class:A=="style"&&e.style?e.style+=";"+i.style:e[A]=i[A];return e}var d6=Object.create(null);function l9(i,e,A){if(i==e)return!0;i||(i=d6),e||(e=d6);let t=Object.keys(i),n=Object.keys(e);if(t.length-(A&&t.indexOf(A)>-1?1:0)!=n.length-(A&&n.indexOf(A)>-1?1:0))return!1;for(let o of t)if(o!=A&&(n.indexOf(o)==-1||i[o]!==e[o]))return!1;return!0}function AlA(i,e){for(let A=i.attributes.length-1;A>=0;A--){let t=i.attributes[A].name;e[t]==null&&i.removeAttribute(t)}for(let A in e){let t=e[A];A=="style"?i.style.cssText=t:i.getAttribute(A)!=t&&i.setAttribute(A,t)}}function yJ(i,e,A){let t=!1;if(e)for(let n in e)A&&n in A||(t=!0,n=="style"?i.style.cssText="":i.removeAttribute(n));if(A)for(let n in A)e&&e[n]==A[n]||(t=!0,n=="style"?i.style.cssText=A[n]:i.setAttribute(n,A[n]));return t}function elA(i){let e=Object.create(null);for(let A=0;A0?3e8:-4e8:A>0?1e8:-1e8,new nI(e,A,A,t,e.widget||null,!1)}static replace(e){let A=!!e.block,t,n;if(e.isBlockGap)t=-5e8,n=4e8;else{let{start:o,end:a}=gY(e,A);t=(o?A?-3e8:-1:5e8)-1,n=(a?A?2e8:1:-6e8)+1}return new nI(e,t,n,A,e.widget||null,!0)}static line(e){return new x4(e)}static set(e,A=!1){return oo.of(e,A)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};kt.none=oo.empty;var _4=class i extends kt{constructor(e){let{start:A,end:t}=gY(e);super(A?-1:5e8,t?1:-6e8,null,e),this.tagName=e.tagName||"span",this.attrs=e.class&&e.attributes?s9(e.attributes,{class:e.class}):e.class?{class:e.class}:e.attributes||d6}eq(e){return this==e||e instanceof i&&this.tagName==e.tagName&&l9(this.attrs,e.attrs)}range(e,A=e){if(e>=A)throw new RangeError("Mark decorations may not be empty");return super.range(e,A)}};_4.prototype.point=!1;var x4=class i extends kt{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof i&&this.spec.class==e.spec.class&&l9(this.spec.attributes,e.spec.attributes)}range(e,A=e){if(A!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,A)}};x4.prototype.mapMode=Tr.TrackBefore;x4.prototype.point=!0;var nI=class i extends kt{constructor(e,A,t,n,o,a){super(A,t,o,e),this.block=n,this.isReplace=a,this.mapMode=n?A<=0?Tr.TrackBefore:Tr.TrackAfter:Tr.TrackDel}get type(){return this.startSide!=this.endSide?Hr.WidgetRange:this.startSide<=0?Hr.WidgetBefore:Hr.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof i&&tlA(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,A=e){if(this.isReplace&&(e>A||e==A&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&A!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,A)}};nI.prototype.point=!0;function gY(i,e=!1){let{inclusiveStart:A,inclusiveEnd:t}=i;return A==null&&(A=i.inclusive),t==null&&(t=i.inclusive),{start:A??e,end:t??e}}function tlA(i,e){return i==e||!!(i&&e&&i.compare(e))}function RB(i,e,A,t=0){let n=A.length-1;n>=0&&A[n]+t>=i?A[n]=Math.max(A[n],e):A.push(i,e)}var B6=class i extends $l{constructor(e,A){super(),this.tagName=e,this.attributes=A}eq(e){return e==this||e instanceof i&&this.tagName==e.tagName&&l9(this.attributes,e.attributes)}static create(e){return new i(e.tagName,e.attributes||d6)}static set(e,A=!1){return oo.of(e,A)}};B6.prototype.startSide=B6.prototype.endSide=-1;function R4(i){let e;return i.nodeType==11?e=i.getSelection?i:i.ownerDocument:e=i,e.getSelection()}function QM(i,e){return e?i==e||i.contains(e.nodeType!=1?e.parentNode:e):!1}function m4(i,e){if(!e.anchorNode)return!1;try{return QM(i,e.anchorNode)}catch(A){return!1}}function l6(i){return i.nodeType==3?N4(i,0,i.nodeValue.length).getClientRects():i.nodeType==1?i.getClientRects():[]}function w4(i,e,A,t){return A?vJ(i,e,A,t,-1)||vJ(i,e,A,t,1):!1}function c2(i){for(var e=0;;e++)if(i=i.previousSibling,!i)return e}function E6(i){return i.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(i.nodeName)}function vJ(i,e,A,t,n){for(;;){if(i==A&&e==t)return!0;if(e==(n<0?0:V0(i))){if(i.nodeName=="DIV")return!1;let o=i.parentNode;if(!o||o.nodeType!=1)return!1;e=c2(i)+(n<0?0:1),i=o}else if(i.nodeType==1){if(i=i.childNodes[e+(n<0?-1:0)],i.nodeType==1&&i.contentEditable=="false")return!1;e=n<0?V0(i):0}else return!1}}function V0(i){return i.nodeType==3?i.nodeValue.length:i.childNodes.length}function h6(i,e){let A=e?i.left:i.right;return{left:A,right:A,top:i.top,bottom:i.bottom}}function ilA(i){let e=i.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:i.innerWidth,top:0,bottom:i.innerHeight}}function cY(i,e){let A=e.width/i.offsetWidth,t=e.height/i.offsetHeight;return(A>.995&&A<1.005||!isFinite(A)||Math.abs(e.width-i.offsetWidth)<1)&&(A=1),(t>.995&&t<1.005||!isFinite(t)||Math.abs(e.height-i.offsetHeight)<1)&&(t=1),{scaleX:A,scaleY:t}}function nlA(i,e,A,t,n,o,a,r){let s=i.ownerDocument,l=s.defaultView||window;for(let g=i,C=!1;g&&!C;)if(g.nodeType==1){let I,B=g==s.body,Q=1,h=1;if(B)I=ilA(l);else{if(/^(fixed|sticky)$/.test(getComputedStyle(g).position)&&(C=!0),g.scrollHeight<=g.clientHeight&&g.scrollWidth<=g.clientWidth){g=g.assignedSlot||g.parentNode;continue}let v=g.getBoundingClientRect();({scaleX:Q,scaleY:h}=cY(g,v)),I={left:v.left,right:v.left+g.clientWidth*Q,top:v.top,bottom:v.top+g.clientHeight*h}}let f=0,m=0;if(n=="nearest")e.top0&&e.bottom>I.bottom+m&&(m=e.bottom-I.bottom+a)):e.bottom>I.bottom&&(m=e.bottom-I.bottom+a,A<0&&e.top-m0&&e.right>I.right+f&&(f=e.right-I.right+o)):e.right>I.right&&(f=e.right-I.right+o,A<0&&e.leftI.bottom||e.leftI.right)&&(e={left:Math.max(e.left,I.left),right:Math.min(e.right,I.right),top:Math.max(e.top,I.top),bottom:Math.min(e.bottom,I.bottom)}),g=g.assignedSlot||g.parentNode}else if(g.nodeType==11)g=g.host;else break}function CY(i,e=!0){let A=i.ownerDocument,t=null,n=null;for(let o=i.parentNode;o&&!(o==A.body||(!e||t)&&n);)if(o.nodeType==1)!n&&o.scrollHeight>o.clientHeight&&(n=o),e&&!t&&o.scrollWidth>o.clientWidth&&(t=o),o=o.assignedSlot||o.parentNode;else if(o.nodeType==11)o=o.host;else break;return{x:t,y:n}}var uM=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:A,focusNode:t}=e;this.set(A,Math.min(e.anchorOffset,A?V0(A):0),t,Math.min(e.focusOffset,t?V0(t):0))}set(e,A,t,n){this.anchorNode=e,this.anchorOffset=A,this.focusNode=t,this.focusOffset=n}},eI=null;lt.safari&<.safari_version>=26&&(eI=!1);function IY(i){if(i.setActive)return i.setActive();if(eI)return i.focus(eI);let e=[];for(let A=i;A&&(e.push(A,A.scrollTop,A.scrollLeft),A!=A.ownerDocument);A=A.parentNode);if(i.focus(eI==null?{get preventScroll(){return eI={preventScroll:!0},!0}}:void 0),!eI){eI=!1;for(let A=0;AMath.max(0,i.document.documentElement.scrollHeight-i.innerHeight-4):i.scrollTop>Math.max(1,i.scrollHeight-i.clientHeight-4)}function BY(i,e){for(let A=i,t=e;;){if(A.nodeType==3&&t>0)return{node:A,offset:t};if(A.nodeType==1&&t>0){if(A.contentEditable=="false")return null;A=A.childNodes[t-1],t=V0(A)}else if(A.parentNode&&!E6(A))t=c2(A),A=A.parentNode;else return null}}function EY(i,e){for(let A=i,t=e;;){if(A.nodeType==3&&t=A){if(r.level==t)return a;(o<0||(n!=0?n<0?r.fromA:e[o].level>r.level))&&(o=a)}}if(o<0)throw new RangeError("Index out of range");return o}};function uY(i,e){if(i.length!=e.length)return!1;for(let A=0;A=0;h-=3)if(Xc[h+1]==-B){let f=Xc[h+2],m=f&2?n:f&4?f&1?o:n:0;m&&(Xo[C]=Xo[Xc[h]]=m),r=h;break}}else{if(Xc.length==189)break;Xc[r++]=C,Xc[r++]=I,Xc[r++]=s}else if((Q=Xo[C])==2||Q==1){let h=Q==n;s=h?0:1;for(let f=r-3;f>=0;f-=3){let m=Xc[f+2];if(m&2)break;if(h)Xc[f+2]|=2;else{if(m&4)break;Xc[f+2]|=4}}}}}function ClA(i,e,A,t){for(let n=0,o=t;n<=A.length;n++){let a=n?A[n-1].to:i,r=ns;)Q==f&&(Q=A[--h].from,f=h?A[h-1].to:i),Xo[--Q]=B;s=g}else o=l,s++}}}function fM(i,e,A,t,n,o,a){let r=t%2?2:1;if(t%2==n%2)for(let s=e,l=0;ss&&a.push(new ig(s,h.from,B));let f=h.direction==oI!=!(B%2);mM(i,f?t+1:t,n,h.inner,h.from,h.to,a),s=h.to}Q=h.to}else{if(Q==A||(g?Xo[Q]!=r:Xo[Q]==r))break;Q++}I?fM(i,s,Q,t+1,n,I,a):se;){let g=!0,C=!1;if(!l||s>o[l-1].to){let h=Xo[s-1];h!=r&&(g=!1,C=h==16)}let I=!g&&r==1?[]:null,B=g?t:t+1,Q=s;A:for(;;)if(l&&Q==o[l-1].to){if(C)break A;let h=o[--l];if(!g)for(let f=h.from,m=l;;){if(f==e)break A;if(m&&o[m-1].to==f)f=o[--m].from;else{if(Xo[f-1]==r)break A;break}}if(I)I.push(h);else{h.toXo.length;)Xo[Xo.length]=256;let t=[],n=e==oI?0:1;return mM(i,n,n,A,0,i.length,t),t}function pY(i){return[new ig(0,i,0)]}var fY="";function dlA(i,e,A,t,n){var o;let a=t.head-i.from,r=ig.find(e,a,(o=t.bidiLevel)!==null&&o!==void 0?o:-1,t.assoc),s=e[r],l=s.side(n,A);if(a==l){let I=r+=n?1:-1;if(I<0||I>=e.length)return null;s=e[r=I],a=s.side(!n,A),l=s.side(n,A)}let g=za(i.text,a,s.forward(n,A));(gs.to)&&(g=l),fY=i.text.slice(Math.min(a,g),Math.max(a,g));let C=r==(n?e.length-1:0)?null:e[r+(n?1:-1)];return C&&g==l&&C.level+(n?0:1)i.some(e=>e)}),MY=tt.define({combine:i=>i.some(e=>e)}),SY=tt.define(),D4=class i{constructor(e,A="nearest",t="nearest",n=5,o=5,a=!1){this.range=e,this.y=A,this.x=t,this.yMargin=n,this.xMargin=o,this.isSnapshot=a}map(e){return e.empty?this:new i(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new i(Ce.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},A6=$i.define({map:(i,e)=>i.map(e)}),kY=$i.define();function yr(i,e,A){let t=i.facet(yY);t.length?t[0](e):window.onerror&&window.onerror(String(e),A,void 0,void 0,e)||(A?console.error(A+":",e):console.error(e))}var j0=tt.define({combine:i=>i.length?i[0]:!0}),ElA=0,SB=tt.define({combine(i){return i.filter((e,A)=>{for(let t=0;t{let s=[];return a&&s.push(R6.of(l=>{let g=l.plugin(r);return g?a(g):kt.none})),o&&s.push(o(r)),s})}static fromClass(e,A){return i.define((t,n)=>new e(t,n),A)}},y4=class{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let A=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(A)}catch(t){if(yr(A.state,t,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(n){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(A){yr(e.state,A,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var A;if(!((A=this.value)===null||A===void 0)&&A.destroy)try{this.value.destroy()}catch(t){yr(e.state,t,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},SJ=tt.define(),wM=tt.define(),R6=tt.define(),_Y=tt.define(),I9=tt.define(),F4=tt.define(),xY=tt.define();function kJ(i,e){let A=i.state.facet(xY);if(!A.length)return A;let t=A.map(o=>o instanceof Function?o(i):o),n=[];return oo.spans(t,e.from,e.to,{point(){},span(o,a,r,s){let l=o-e.from,g=a-e.from,C=n;for(let I=r.length-1;I>=0;I--,s--){let B=r[I].spec.bidiIsolate,Q;if(B==null&&(B=BlA(e.text,l,g)),s>0&&C.length&&(Q=C[C.length-1]).to==l&&Q.direction==B)Q.to=g,C=Q.inner;else{let h={from:l,to:g,direction:B,inner:[]};C.push(h),C=h.inner}}}}),n}var RY=tt.define();function d9(i){let e=0,A=0,t=0,n=0;for(let o of i.state.facet(RY)){let a=o(i);a&&(a.left!=null&&(e=Math.max(e,a.left)),a.right!=null&&(A=Math.max(A,a.right)),a.top!=null&&(t=Math.max(t,a.top)),a.bottom!=null&&(n=Math.max(n,a.bottom)))}return{left:e,right:A,top:t,bottom:n}}var u4=tt.define(),jg=class i{constructor(e,A,t,n){this.fromA=e,this.toA=A,this.fromB=t,this.toB=n}join(e){return new i(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let A=e.length,t=this;for(;A>0;A--){let n=e[A-1];if(!(n.fromA>t.toA)){if(n.toAn.push(new jg(o,a,r,s))),this.changedRanges=n}static create(e,A,t){return new i(e,A,t)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},hlA=[],fa=class{constructor(e,A,t=0){this.dom=e,this.length=A,this.flags=t,this.parent=null,e.cmTile=this}get breakAfter(){return this.flags&1}get children(){return hlA}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(e){if(this.flags|=2,this.flags&4){this.flags&=-5;let A=this.domAttrs;A&&AlA(this.dom,A)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:"")+(this.breakAfter?"#":"")}destroy(){this.parent=null}setDOM(e){this.dom=e,e.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e,A=this.posAtStart){let t=A;for(let n of this.children){if(n==e)return t;t+=n.length+n.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}covers(e){return!0}coordsIn(e,A){return null}domPosFor(e,A){let t=c2(this.dom),n=this.length?e>0:A>0;return new $c(this.parent.dom,t+(n?1:0),e==0||e==this.length)}markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&this.parent.flags&2&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let e=this;e;e=e.parent)if(e instanceof LB)return e;return null}static get(e){return e.cmTile}},FB=class extends fa{constructor(e){super(e,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(e){this.children.push(e),e.parent=this}sync(e){if(this.flags&2)return;super.sync(e);let A=this.dom,t=null,n,o=e?.node==A?e:null,a=0;for(let r of this.children){if(r.sync(e),a+=r.length+r.breakAfter,n=t?t.nextSibling:A.firstChild,o&&n!=r.dom&&(o.written=!0),r.dom.parentNode==A)for(;n&&n!=r.dom;)n=_J(n);else A.insertBefore(r.dom,n);t=r.dom}for(n=t?t.nextSibling:A.firstChild,o&&n&&(o.written=!0);n;)n=_J(n);this.length=a}};function _J(i){let e=i.nextSibling;return i.parentNode.removeChild(i),e}var LB=class extends FB{constructor(e,A){super(A),this.view=e}owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}isBlock(){return!0}nearest(e){for(;;){if(!e)return null;let A=fa.get(e);if(A&&this.owns(A))return A;e=e.parentNode}}blockTiles(e){for(let A=[],t=this,n=0,o=0;;)if(n==t.children.length){if(!A.length)return;t=t.parent,t.breakAfter&&o++,n=A.pop()}else{let a=t.children[n++];if(a instanceof q0)A.push(n),t=a,n=0;else{let r=o+a.length,s=e(a,o);if(s!==void 0)return s;o=r+a.breakAfter}}}resolveBlock(e,A){let t,n=-1,o,a=-1;if(this.blockTiles((r,s)=>{let l=s+r.length;if(e>=s&&e<=l){if(r.isWidget()&&A>=-1&&A<=1){if(r.flags&32)return!0;r.flags&16&&(t=void 0)}(se||e==s&&(A>1?r.length:r.covers(-1)))&&(!o||!r.isWidget()&&o.isWidget())&&(o=r,a=e-s)}}),!t&&!o)throw new Error("No tile at position "+e);return t&&A<0||!o?{tile:t,offset:n}:{tile:o,offset:a}}},q0=class i extends FB{constructor(e,A){super(e),this.wrapper=A}isBlock(){return!0}covers(e){return this.children.length?e<0?this.children[0].covers(-1):this.lastChild.covers(1):!1}get domAttrs(){return this.wrapper.attributes}static of(e,A){let t=new i(A||document.createElement(e.tagName),e);return A||(t.flags|=4),t}},GB=class i extends FB{constructor(e,A){super(e),this.attrs=A}isLine(){return!0}static start(e,A,t){let n=new i(A||document.createElement("div"),e);return(!A||!t)&&(n.flags|=4),n}get domAttrs(){return this.attrs}resolveInline(e,A,t){let n=null,o=-1,a=null,r=-1;function s(g,C){for(let I=0,B=0;I=C&&(Q.isComposite()?s(Q,C-B):(!a||a.isHidden&&(A>0||t&&ulA(a,Q)))&&(h>C||Q.flags&32)?(a=Q,r=C-B):(Bt&&(e=t);let n=e,o=e,a=0;e==0&&A<0||e==t&&A>=0?lt.chrome||lt.gecko||(e?(n--,a=1):o=0)?0:r.length-1];return lt.safari&&!a&&s.width==0&&(s=Array.prototype.find.call(r,l=>l.width)||s),a?h6(s,a<0):s||null}static of(e,A){let t=new i(A||document.createTextNode(e),e);return A||(t.flags|=2),t}},aI=class i extends fa{constructor(e,A,t,n){super(e,A,n),this.widget=t}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(e){return this.flags&48?!1:(this.flags&(e<0?64:128))>0}coordsIn(e,A){return this.coordsInWidget(e,A,!1)}coordsInWidget(e,A,t){let n=this.widget.coordsAt(this.dom,e,A);if(n)return n;if(t)return h6(this.dom.getBoundingClientRect(),this.length?e==0:A<=0);{let o=this.dom.getClientRects(),a=null;if(!o.length)return null;let r=this.flags&16?!0:this.flags&32?!1:e>0;for(let s=r?o.length-1:0;a=o[s],!(e>0?s==0:s==o.length-1||a.top0;)if(n.isComposite())if(a){if(!e)break;t&&t.break(),e--,a=!1}else if(o==n.children.length){if(!e&&!r.length)break;t&&t.leave(n),a=!!n.breakAfter,{tile:n,index:o}=r.pop(),o++}else{let s=n.children[o],l=s.breakAfter;(A>0?s.length<=e:s.length=0;r--){let s=A.marks[r],l=n.lastChild;if(l instanceof Ws&&l.mark.eq(s.mark))l.dom!=s.dom&&l.setDOM(oM(s.dom)),n=l;else{if(this.cache.reused.get(s)){let C=fa.get(s.dom);C&&C.setDOM(oM(s.dom))}let g=Ws.of(s.mark,s.dom);n.append(g),n=g}this.cache.reused.set(s,2)}let o=fa.get(e.text);o&&this.cache.reused.set(o,2);let a=new tI(e.text,e.text.nodeValue);a.flags|=8,n.append(a)}addInlineWidget(e,A,t){let n=this.afterWidget&&e.flags&48&&(this.afterWidget.flags&48)==(e.flags&48);n||this.flushBuffer();let o=this.ensureMarks(A,t);!n&&!(e.flags&16)&&o.append(this.getBuffer(1)),o.append(e),this.pos+=e.length,this.afterWidget=e}addMark(e,A,t){this.flushBuffer(),this.ensureMarks(A,t).append(e),this.pos+=e.length,this.afterWidget=null}addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}continueWidget(e){let A=this.afterWidget||this.lastBlock;A.length+=e,this.pos+=e}addLineStart(e,A){var t;e||(e=NY);let n=GB.start(e,A||((t=this.cache.find(GB))===null||t===void 0?void 0:t.dom),!!A);this.getBlockPos().append(this.lastBlock=this.curLine=n)}addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}ensureLine(e){this.curLine||this.addLineStart(e)}ensureMarks(e,A){var t;let n=this.curLine;for(let o=e.length-1;o>=0;o--){let a=e[o],r;if(A>0&&(r=n.lastChild)&&r instanceof Ws&&r.mark.eq(a))n=r,A--;else{let s=Ws.of(a,(t=this.cache.find(Ws,l=>l.mark.eq(a)))===null||t===void 0?void 0:t.dom);n.append(s),n=s,A=0}}return n}endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChild;(!e||!xJ(this.curLine,!1)||e.dom.nodeName!="BR"&&e.isWidget()&&!(lt.ios&&xJ(this.curLine,!0)))&&this.curLine.append(this.cache.findWidget(aM,0,32)||new aI(aM.toDOM(),0,aM,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let e=this.wrappers.length-1;e>=0;e--)this.wrappers[e].to=this.pos){let A=new yM(e.from,e.to,e.value,e.rank),t=this.wrappers.length;for(;t>0&&(this.wrappers[t-1].rank-A.rank||this.wrappers[t-1].to-A.to)<0;)t--;this.wrappers.splice(t,0,A)}this.wrapperPos=this.pos}getBlockPos(){var e;this.updateBlockWrappers();let A=this.root;for(let t of this.wrappers){let n=A.lastChild;if(t.froma.wrapper.eq(t.wrapper)))===null||e===void 0?void 0:e.dom);A.append(o),A=o}}return A}blockPosCovered(){let e=this.lastBlock;return e!=null&&!e.breakAfter&&(!e.isWidget()||(e.flags&160)>0)}getBuffer(e){let A=2|(e<0?16:32),t=this.cache.find(KB,void 0,1);return t&&(t.flags=A),t||new KB(A)}flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}},bM=class{constructor(e){this.skipCount=0,this.text="",this.textOff=0,this.cursor=e.iter()}skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount+=e-(this.text.length-this.textOff),this.text="",this.textOff=0)}next(e){if(this.textOff==this.text.length){let{value:n,lineBreak:o,done:a}=this.cursor.next(this.skipCount);if(this.skipCount=0,a)throw new Error("Ran out of text content when drawing inline views");this.text=n;let r=this.textOff=Math.min(e,n.length);return o?null:n.slice(0,r)}let A=Math.min(this.text.length,this.textOff+e),t=this.text.slice(this.textOff,A);return this.textOff=A,t}},u6=[aI,GB,tI,Ws,KB,q0,LB];for(let i=0;i[]),this.index=u6.map(()=>0),this.reused=new Map}add(e){let A=e.constructor.bucket,t=this.buckets[A];t.length<6?t.push(e):t[this.index[A]=(this.index[A]+1)%6]=e}find(e,A,t=2){let n=e.bucket,o=this.buckets[n],a=this.index[n];for(let r=o.length-1;r>=0;r--){let s=(r+a)%o.length,l=o[s];if((!A||A(l))&&!this.reused.has(l))return o.splice(s,1),s{if(this.cache.add(a),a.isComposite())return!1},enter:a=>this.cache.add(a),leave:()=>{},break:()=>{}}}run(e,A){let t=A&&this.getCompositionContext(A.text);for(let n=0,o=0,a=0;;){let r=an){let l=s-n;this.preserve(l,!a,!r),n=s,o+=l}if(!r)break;A&&r.fromA<=A.range.fromA&&r.toA>=A.range.toA?(this.forward(r.fromA,A.range.fromA,A.range.fromA{if(a.isWidget())if(this.openWidget)this.builder.continueWidget(s-r);else{let l=s>0||r{a.isLine()?this.builder.addLineStart(a.attrs,this.cache.maybeReuse(a)):(this.cache.add(a),a instanceof Ws&&n.unshift(a.mark)),this.openWidget=!1},leave:a=>{a.isLine()?n.length&&(n.length=o=0):a instanceof Ws&&(n.shift(),o=Math.min(o,n.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(e)}emit(e,A){let t=null,n=this.builder,o=0,a=oo.spans(this.decorations,e,A,{point:(r,s,l,g,C,I)=>{if(l instanceof nI){if(this.disallowBlockEffectsFor[I]){if(l.block)throw new RangeError("Block decorations may not be specified via plugins");if(s>this.view.state.doc.lineAt(r).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}if(o=g.length,C>g.length)n.continueWidget(s-r);else{let B=l.widget||(l.block?RJ.block:RJ.inline),Q=plA(l),h=this.cache.findWidget(B,s-r,Q)||aI.of(B,this.view,s-r,Q);l.block?(l.startSide>0&&n.addLineStartIfNotCovered(t),n.addBlockWidget(h)):(n.ensureLine(t),n.addInlineWidget(h,g,C))}t=null}else t=flA(t,l);s>r&&this.text.skip(s-r)},span:(r,s,l,g)=>{for(let C=r;Co,this.openMarks=a}forward(e,A,t=1){A-e<=10?this.old.advance(A-e,t,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(A-e-10,-1),this.old.advance(5,t,this.reuseWalker))}getCompositionContext(e){let A=[],t=null;for(let n=e.parentNode;;n=n.parentNode){let o=fa.get(n);if(n==this.view.contentDOM)break;o instanceof Ws?A.push(o):o?.isLine()?t=o:o instanceof q0||(n.nodeName=="DIV"&&!t&&n!=this.view.contentDOM?t=new GB(n,NY):t||A.push(Ws.of(new _4({tagName:n.nodeName.toLowerCase(),attributes:elA(n)}),n)))}return{line:t,marks:A}}};function xJ(i,e){let A=t=>{for(let n of t.children)if((e?n.isText():n.length)||A(n))return!0;return!1};return A(i)}function plA(i){let e=i.isReplace?(i.startSide<0?64:0)|(i.endSide>0?128:0):i.startSide>0?32:16;return i.block&&(e|=256),e}var NY={class:"cm-line"};function flA(i,e){let A=e.spec.attributes,t=e.spec.class;return!A&&!t||(i||(i={class:"cm-line"}),A&&s9(A,i),t&&(i.class+=" "+t)),i}function mlA(i){let e=[];for(let A=i.parents.length;A>1;A--){let t=A==i.parents.length?i.tile:i.parents[A].tile;t instanceof Ws&&e.push(t.mark)}return e}function oM(i){let e=fa.get(i);return e&&e.setDOM(i.cloneNode()),i}var RJ=(()=>{class i extends Zs{constructor(A){super(),this.tag=A}eq(A){return A.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(A){return A.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}return i.inline=new i("span"),i.block=new i("div"),i})(),aM=new class extends Zs{toDOM(){return document.createElement("br")}get isHidden(){return!0}get editable(){return!0}},p6=class{constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=kt.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new LB(e,e.contentDOM),this.updateInner([new jg(0,0,0,e.state.doc.length)],null)}update(e){var A;let t=e.changedRanges;this.minWidth>0&&t.length&&(t.every(({fromA:g,toA:C})=>Cthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((A=this.domChanged)===null||A===void 0)&&A.newSel?n=this.domChanged.newSel.head:!klA(e.changes,this.hasComposition)&&!e.selectionSet&&(n=e.state.selection.main.head));let o=n>-1?DlA(this.view,e.changes,n):null;if(this.domChanged=null,this.hasComposition){let{from:g,to:C}=this.hasComposition;t=new jg(g,C,e.changes.mapPos(g,-1),e.changes.mapPos(C,1)).addToSet(t.slice())}this.hasComposition=o?{from:o.range.fromB,to:o.range.toB}:null,(lt.ie||lt.chrome)&&!o&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let a=this.decorations,r=this.blockWrappers;this.updateDeco();let s=blA(a,this.decorations,e.changes);s.length&&(t=jg.extendWithRanges(t,s));let l=MlA(r,this.blockWrappers,e.changes);return l.length&&(t=jg.extendWithRanges(t,l)),o&&!t.some(g=>g.fromA<=o.range.fromA&&g.toA>=o.range.toA)&&(t=o.range.addToSet(t.slice())),this.tile.flags&2&&t.length==0?!1:(this.updateInner(t,o),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,A){this.view.viewState.mustMeasureContent=!0;let{observer:t}=this.view;t.ignore(()=>{if(A||e.length){let a=this.tile,r=new SM(this.view,a,this.blockWrappers,this.decorations,this.dynamicDecorationMap);A&&fa.get(A.text)&&r.cache.reused.set(fa.get(A.text),2),this.tile=r.run(e,A),kM(a,r.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=lt.chrome||lt.ios?{node:t.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(o),o&&(o.written||t.selectionRange.focusNode!=o.node||!this.tile.dom.contains(o.node))&&(this.forceSelection=!0),this.tile.dom.style.height=""});let n=[];if(this.view.viewport.from||this.view.viewport.to-1)&&m4(t,this.view.observer.selectionRange)&&!(n&&t.contains(n));if(!(o||A||a))return;let r=this.forceSelection;this.forceSelection=!1;let s=this.view.state.selection.main,l,g;if(s.empty?g=l=this.inlineDOMNearPos(s.anchor,s.assoc||1):(g=this.inlineDOMNearPos(s.head,s.head==s.from?1:-1),l=this.inlineDOMNearPos(s.anchor,s.anchor==s.from?1:-1)),lt.gecko&&s.empty&&!this.hasComposition&&wlA(l)){let I=document.createTextNode("");this.view.observer.ignore(()=>l.node.insertBefore(I,l.node.childNodes[l.offset]||null)),l=g=new $c(I,0),r=!0}let C=this.view.observer.selectionRange;(r||!C.focusNode||(!w4(l.node,l.offset,C.anchorNode,C.anchorOffset)||!w4(g.node,g.offset,C.focusNode,C.focusOffset))&&!this.suppressWidgetCursorChange(C,s))&&(this.view.observer.ignore(()=>{lt.android&<.chrome&&t.contains(C.focusNode)&&SlA(C.focusNode,t)&&(t.blur(),t.focus({preventScroll:!0}));let I=R4(this.view.root);if(I)if(s.empty){if(lt.gecko){let B=ylA(l.node,l.offset);if(B&&B!=3){let Q=(B==1?BY:EY)(l.node,l.offset);Q&&(l=new $c(Q.node,Q.offset))}}I.collapse(l.node,l.offset),s.bidiLevel!=null&&I.caretBidiLevel!==void 0&&(I.caretBidiLevel=s.bidiLevel)}else if(I.extend){I.collapse(l.node,l.offset);try{I.extend(g.node,g.offset)}catch(B){}}else{let B=document.createRange();s.anchor>s.head&&([l,g]=[g,l]),B.setEnd(g.node,g.offset),B.setStart(l.node,l.offset),I.removeAllRanges(),I.addRange(B)}a&&this.view.root.activeElement==t&&(t.blur(),n&&n.focus())}),this.view.observer.setSelectionRange(l,g)),this.impreciseAnchor=l.precise?null:new $c(C.anchorNode,C.anchorOffset),this.impreciseHead=g.precise?null:new $c(C.focusNode,C.focusOffset)}suppressWidgetCursorChange(e,A){return this.hasComposition&&A.empty&&w4(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==A.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,A=e.state.selection.main,t=R4(e.root),{anchorNode:n,anchorOffset:o}=e.observer.selectionRange;if(!t||!A.empty||!A.assoc||!t.modify)return;let a=this.lineAt(A.head,A.assoc);if(!a)return;let r=a.posAtStart;if(A.head==r||A.head==r+a.length)return;let s=this.coordsAt(A.head,-1),l=this.coordsAt(A.head,1);if(!s||!l||s.bottom>l.top)return;let g=this.domAtPos(A.head+A.assoc,A.assoc);t.collapse(g.node,g.offset),t.modify("move",A.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let C=e.observer.selectionRange;e.docView.posFromDOM(C.anchorNode,C.anchorOffset)!=A.from&&t.collapse(n,o)}posFromDOM(e,A){let t=this.tile.nearest(e);if(!t)return this.tile.dom.compareDocumentPosition(e)&2?0:this.view.state.doc.length;let n=t.posAtStart;if(t.isComposite()){let o;if(e==t.dom)o=t.dom.childNodes[A];else{let a=V0(e)==0?0:A==0?-1:1;for(;;){let r=e.parentNode;if(r==t.dom)break;a==0&&r.firstChild!=r.lastChild&&(e==r.firstChild?a=-1:a=1),e=r}a<0?o=e:o=e.nextSibling}if(o==t.dom.firstChild)return n;for(;o&&!fa.get(o);)o=o.nextSibling;if(!o)return n+t.length;for(let a=0,r=n;;a++){let s=t.children[a];if(s.dom==o)return r;r+=s.length+s.breakAfter}}else return t.isText()?e==t.dom?n+A:n+(A?t.length:0):n}domAtPos(e,A){let{tile:t,offset:n}=this.tile.resolveBlock(e,A);return t.isWidget()?t.domPosFor(e,A):t.domIn(n,A)}inlineDOMNearPos(e,A){let t,n=-1,o=!1,a,r=-1,s=!1;return this.tile.blockTiles((l,g)=>{if(l.isWidget()){if(l.flags&32&&g>=e)return!0;l.flags&16&&(o=!0)}else{let C=g+l.length;if(g<=e&&(t=l,n=e-g,o=C=e&&!a&&(a=l,r=e-g,s=g>e),g>e&&a)return!0}}),!t&&!a?this.domAtPos(e,A):(o&&a?t=null:s&&t&&(a=null),t&&A<0||!a?t.domIn(n,A):a.domIn(r,A))}coordsAt(e,A){let{tile:t,offset:n}=this.tile.resolveBlock(e,A);return t.isWidget()?t.widget instanceof v4?null:t.coordsInWidget(n,A,!0):t.coordsIn(n,A)}lineAt(e,A){let{tile:t}=this.tile.resolveBlock(e,A);return t.isLine()?t:null}coordsForChar(e){let{tile:A,offset:t}=this.tile.resolveBlock(e,1);if(!A.isLine())return null;function n(o,a){if(o.isComposite())for(let r of o.children){if(r.length>=a){let s=n(r,a);if(s)return s}if(a-=r.length,a<0)break}else if(o.isText()&&aMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,r=-1,s=this.view.textDirection==wo.LTR,l=0,g=(C,I,B)=>{for(let Q=0;Qn);Q++){let h=C.children[Q],f=I+h.length,m=h.dom.getBoundingClientRect(),{height:v}=m;if(B&&!Q&&(l+=m.top-B.top),h instanceof q0)f>t&&g(h,I,m);else if(I>=t&&(l>0&&A.push(-l),A.push(v+l),l=0,a)){let S=h.dom.lastChild,k=S?l6(S):[];if(k.length){let M=k[k.length-1],x=s?M.right-m.left:m.right-M.left;x>r&&(r=x,this.minWidth=o,this.minWidthFrom=I,this.minWidthTo=f)}}B&&Q==C.children.length-1&&(l+=B.bottom-m.bottom),I=f+h.breakAfter}};return g(this.tile,0,null),A}textDirectionAt(e){let{tile:A}=this.tile.resolveBlock(e,1);return getComputedStyle(A.dom).direction=="rtl"?wo.RTL:wo.LTR}measureTextSize(){let e=this.tile.blockTiles(a=>{if(a.isLine()&&a.children.length&&a.length<=20){let r=0,s;for(let l of a.children){if(!l.isText()||/[^ -~]/.test(l.text))return;let g=l6(l.dom);if(g.length!=1)return;r+=g[0].width,s=g[0].height}if(r)return{lineHeight:a.dom.getBoundingClientRect().height,charWidth:r/a.length,textHeight:s}}});if(e)return e;let A=document.createElement("div"),t,n,o;return A.className="cm-line",A.style.width="99999px",A.style.position="absolute",A.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.tile.dom.appendChild(A);let a=l6(A.firstChild)[0];t=A.getBoundingClientRect().height,n=a&&a.width?a.width/27:7,o=a&&a.height?a.height:t,A.remove()}),{lineHeight:t,charWidth:n,textHeight:o}}computeBlockGapDeco(){let e=[],A=this.view.viewState;for(let t=0,n=0;;n++){let o=n==A.viewports.length?null:A.viewports[n],a=o?o.from-1:this.view.state.doc.length;if(a>t){let r=(A.lineBlockAt(a).bottom-A.lineBlockAt(t).top)/this.view.scaleY;e.push(kt.replace({widget:new v4(r),block:!0,inclusive:!0,isBlockGap:!0}).range(t,a))}if(!o)break;t=o.to+1}return kt.set(e)}updateDeco(){let e=1,A=this.view.state.facet(R6).map(o=>(this.dynamicDecorationMap[e++]=typeof o=="function")?o(this.view):o),t=!1,n=this.view.state.facet(I9).map((o,a)=>{let r=typeof o=="function";return r&&(t=!0),r?o(this.view):o});for(n.length&&(this.dynamicDecorationMap[e++]=t,A.push(oo.join(n))),this.decorations=[this.editContextFormatting,...A,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];etypeof o=="function"?o(this.view):o)}scrollIntoView(e){var A;if(e.isSnapshot){let g=this.view.viewState.lineBlockAt(e.range.head);this.view.scrollDOM.scrollTop=g.top-e.yMargin,this.view.scrollDOM.scrollLeft=e.xMargin;return}for(let g of this.view.state.facet(SY))try{if(g(this.view,e.range,e))return!0}catch(C){yr(this.view.state,C,"scroll handler")}let{range:t}=e,n=this.coordsAt(t.head,(A=t.assoc)!==null&&A!==void 0?A:t.empty?0:t.head>t.anchor?-1:1),o;if(!n)return;!t.empty&&(o=this.coordsAt(t.anchor,t.anchor>t.head?-1:1))&&(n={left:Math.min(n.left,o.left),top:Math.min(n.top,o.top),right:Math.max(n.right,o.right),bottom:Math.max(n.bottom,o.bottom)});let a=d9(this.view),r={left:n.left-a.left,top:n.top-a.top,right:n.right+a.right,bottom:n.bottom+a.bottom},{offsetWidth:s,offsetHeight:l}=this.view.scrollDOM;if(nlA(this.view.scrollDOM,r,t.head1&&(n.top>window.pageYOffset+window.visualViewport.offsetTop+window.visualViewport.height||n.bottomt.isWidget()||t.children.some(A);return A(this.tile.resolveBlock(e,1).tile)}destroy(){kM(this.tile)}};function kM(i,e){let A=e?.get(i);if(A!=1){A==null&&i.destroy();for(let t of i.children)kM(t,e)}}function wlA(i){return i.node.nodeType==1&&i.node.firstChild&&(i.offset==0||i.node.childNodes[i.offset-1].contentEditable=="false")&&(i.offset==i.node.childNodes.length||i.node.childNodes[i.offset].contentEditable=="false")}function FY(i,e){let A=i.observer.selectionRange;if(!A.focusNode)return null;let t=BY(A.focusNode,A.focusOffset),n=EY(A.focusNode,A.focusOffset),o=t||n;if(n&&t&&n.node!=t.node){let r=fa.get(n.node);if(!r||r.isText()&&r.text!=n.node.nodeValue)o=n;else if(i.docView.lastCompositionAfterCursor){let s=fa.get(t.node);!s||s.isText()&&s.text!=t.node.nodeValue||(o=n)}}if(i.docView.lastCompositionAfterCursor=o!=t,!o)return null;let a=e-o.offset;return{from:a,to:a+o.node.nodeValue.length,node:o.node}}function DlA(i,e,A){let t=FY(i,A);if(!t)return null;let{node:n,from:o,to:a}=t,r=n.nodeValue;if(/[\n\r]/.test(r)||i.state.doc.sliceString(t.from,t.to)!=r)return null;let s=e.invertedDesc;return{range:new jg(s.mapPos(o),s.mapPos(a),o,a),text:n}}function ylA(i,e){return i.nodeType!=1?0:(e&&i.childNodes[e-1].contentEditable=="false"?1:0)|(e{te.from&&(A=!0)}),A}var v4=class extends Zs{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}};function _lA(i,e,A=1){let t=i.charCategorizer(e),n=i.doc.lineAt(e),o=e-n.from;if(n.length==0)return Ce.cursor(e);o==0?A=1:o==n.length&&(A=-1);let a=o,r=o;A<0?a=za(n.text,o,!1):r=za(n.text,o);let s=t(n.text.slice(a,r));for(;a>0;){let l=za(n.text,a,!1);if(t(n.text.slice(l,a))!=s)break;a=l}for(;ri.defaultLineHeight*1.5){let r=i.viewState.heightOracle.textHeight,s=Math.floor((n-A.top-(i.defaultLineHeight-r)*.5)/r);o+=s*i.viewState.heightOracle.lineLength}let a=i.state.sliceDoc(A.from,A.to);return A.from+Xm(a,o,i.state.tabSize)}function xM(i,e,A){let t=i.lineBlockAt(e);if(Array.isArray(t.type)){let n;for(let o of t.type){if(o.from>e)break;if(!(o.toe)return o;(!n||o.type==Hr.Text&&(n.type!=o.type||(A<0?o.frome)))&&(n=o)}}return n||t}return t}function RlA(i,e,A,t){let n=xM(i,e.head,e.assoc||-1),o=!t||n.type!=Hr.Text||!(i.lineWrapping||n.widgetLineBreaks)?null:i.coordsAtPos(e.assoc<0&&e.head>n.from?e.head-1:e.head);if(o){let a=i.dom.getBoundingClientRect(),r=i.textDirectionAt(n.from),s=i.posAtCoords({x:A==(r==wo.LTR)?a.right-1:a.left+1,y:(o.top+o.bottom)/2});if(s!=null)return Ce.cursor(s,A?-1:1)}return Ce.cursor(A?n.to:n.from,A?-1:1)}function NJ(i,e,A,t){let n=i.state.doc.lineAt(e.head),o=i.bidiSpans(n),a=i.textDirectionAt(n.from);for(let r=e,s=null;;){let l=dlA(n,o,a,r,A),g=fY;if(!l){if(n.number==(A?i.state.doc.lines:1))return r;g=` +`,n=i.state.doc.line(n.number+(A?1:-1)),o=i.bidiSpans(n),l=i.visualLineSide(n,!A)}if(s){if(!s(g))return r}else{if(!t)return l;s=t(g)}r=l}}function NlA(i,e,A){let t=i.state.charCategorizer(e),n=t(A);return o=>{let a=t(o);return n==Jo.Space&&(n=a),n==a}}function FlA(i,e,A,t){let n=e.head,o=A?1:-1;if(n==(A?i.state.doc.length:0))return Ce.cursor(n,e.assoc);let a=e.goalColumn,r,s=i.contentDOM.getBoundingClientRect(),l=i.coordsAtPos(n,e.assoc||((e.empty?A:e.head==e.from)?1:-1)),g=i.documentTop;if(l)a==null&&(a=l.left-s.left),r=o<0?l.top:l.bottom;else{let Q=i.viewState.lineBlockAt(n);a==null&&(a=Math.min(s.right-s.left,i.defaultCharacterWidth*(n-Q.from))),r=(o<0?Q.top:Q.bottom)+g}let C=s.left+a,I=i.viewState.heightOracle.textHeight>>1,B=t??I;for(let Q=0;;Q+=I){let h=r+(B+Q)*o,f=RM(i,{x:C,y:h},!1,o);if(A?h>s.bottom:hr:v{if(e>o&&en(i)),A.from,e.head>A.from?-1:1);return t==A.from?A:Ce.cursor(t,ti.viewState.docHeight)return new tg(i.state.doc.length,-1);if(l=i.elementAtHeight(s),t==null)break;if(l.type==Hr.Text){if(t<0?l.toi.viewport.to)break;let I=i.docView.coordsAt(t<0?l.from:l.to,t>0?-1:1);if(I&&(t<0?I.top<=s+o:I.bottom>=s+o))break}let C=i.viewState.heightOracle.textHeight/2;s=t>0?l.bottom+C:l.top-C}if(i.viewport.from>=l.to||i.viewport.to<=l.from){if(A)return null;if(l.type==Hr.Text){let C=xlA(i,n,l,a,r);return new tg(C,C==l.from?1:-1)}}if(l.type!=Hr.Text)return s<(l.top+l.bottom)/2?new tg(l.from,1):new tg(l.to,-1);let g=i.docView.lineAt(l.from,2);return(!g||g.length!=l.length)&&(g=i.docView.lineAt(l.from,-2)),new NM(i,a,r,i.textDirectionAt(l.from)).scanTile(g,l.from)}var NM=class{constructor(e,A,t,n){this.view=e,this.x=A,this.y=t,this.baseDir=n,this.line=null,this.spans=null}bidiSpansAt(e){return(!this.line||this.line.from>e||this.line.to1||t.length&&(t[0].level!=this.baseDir||t[0].to+n.from>1;e:if(o.has(Q)){let f=t+Math.floor(Math.random()*B);for(let m=0;m1)){if(m.bottomthis.y)(!s||s.top>m.top)&&(s=m),v=-1;else{let S=m.left>this.x?this.x-m.left:m.right(C.left+C.right)/2==I}}scanText(e,A){let t=[];for(let o=0;o{let a=t[o]-A,r=t[o+1]-A;return N4(e.dom,a,r).getClientRects()});return n.after?new tg(t[n.i+1],-1):new tg(t[n.i],1)}scanTile(e,A){if(!e.length)return new tg(A,1);if(e.children.length==1){let r=e.children[0];if(r.isText())return this.scanText(r,A);if(r.isComposite())return this.scanTile(r,A)}let t=[A];for(let r=0,s=A;r{let s=e.children[r];return s.flags&48?null:(s.dom.nodeType==1?s.dom:N4(s.dom,0,s.length)).getClientRects()}),o=e.children[n.i],a=t[n.i];return o.isText()?this.scanText(o,a):o.isComposite()?this.scanTile(o,a):n.after?new tg(t[n.i+1],-1):new tg(a,1)}},MB="\uFFFF",FM=class{constructor(e,A){this.points=e,this.view=A,this.text="",this.lineSeparator=A.state.facet(Pa.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=MB}readRange(e,A){if(!e)return this;let t=e.parentNode;for(let n=e;;){this.findPointBefore(t,n);let o=this.text.length;this.readNode(n);let a=fa.get(n),r=n.nextSibling;if(r==A){a?.breakAfter&&!r&&t!=this.view.contentDOM&&this.lineBreak();break}let s=fa.get(r);(a&&s?a.breakAfter:(a?a.breakAfter:E6(n))||E6(r)&&(n.nodeName!="BR"||a?.isWidget())&&this.text.length>o)&&!GlA(r,A)&&this.lineBreak(),n=r}return this.findPointBefore(t,A),this}readTextNode(e){let A=e.nodeValue;for(let t of this.points)t.node==e&&(t.pos=this.text.length+Math.min(t.offset,A.length));for(let t=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let o=-1,a=1,r;if(this.lineSeparator?(o=A.indexOf(this.lineSeparator,t),a=this.lineSeparator.length):(r=n.exec(A))&&(o=r.index,a=r[0].length),this.append(A.slice(t,o<0?A.length:o)),o<0)break;if(this.lineBreak(),a>1)for(let s of this.points)s.node==e&&s.pos>this.text.length&&(s.pos-=a-1);t=o+a}}readNode(e){let A=fa.get(e),t=A&&A.overrideDOMText;if(t!=null){this.findPointInside(e,t.length);for(let n=t.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else e.nodeType==3?this.readTextNode(e):e.nodeName=="BR"?e.nextSibling&&this.lineBreak():e.nodeType==1&&this.readRange(e.firstChild,null)}findPointBefore(e,A){for(let t of this.points)t.node==e&&e.childNodes[t.offset]==A&&(t.pos=this.text.length)}findPointInside(e,A){for(let t of this.points)(e.nodeType==3?t.node==e:e.contains(t.node))&&(t.pos=this.text.length+(LlA(e,t.node,t.offset)?A:0))}};function LlA(i,e,A){for(;;){if(!e||A-1;let{impreciseHead:o,impreciseAnchor:a}=e.docView,r=e.state.selection;if(e.state.readOnly&&A>-1)this.newSel=null;else if(A>-1&&(this.bounds=GY(e.docView.tile,A,t,0))){let s=o||a?[]:UlA(e),l=new FM(s,e);l.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=l.text,this.newSel=TlA(s,this.bounds.from)}else{let s=e.observer.selectionRange,l=o&&o.node==s.focusNode&&o.offset==s.focusOffset||!QM(e.contentDOM,s.focusNode)?r.main.head:e.docView.posFromDOM(s.focusNode,s.focusOffset),g=a&&a.node==s.anchorNode&&a.offset==s.anchorOffset||!QM(e.contentDOM,s.anchorNode)?r.main.anchor:e.docView.posFromDOM(s.anchorNode,s.anchorOffset),C=e.viewport;if((lt.ios||lt.chrome)&&r.main.empty&&l!=g&&(C.from>0||C.to-1&&r.ranges.length>1)this.newSel=r.replaceRange(Ce.range(g,l));else if(e.lineWrapping&&g==l&&!(r.main.empty&&r.main.head==l)&&e.inputState.lastTouchTime>Date.now()-100){let I=e.coordsAtPos(l,-1),B=0;I&&(B=e.inputState.lastTouchY<=I.bottom?-1:1),this.newSel=Ce.create([Ce.cursor(l,B)])}else this.newSel=Ce.single(g,l)}}};function GY(i,e,A,t){if(i.isComposite()){let n=-1,o=-1,a=-1,r=-1;for(let s=0,l=t,g=t;sA)return GY(C,e,A,l);if(I>=e&&n==-1&&(n=s,o=l),l>A&&C.dom.parentNode==i.dom){a=s,r=g;break}g=I,l=I+C.breakAfter}return{from:o,to:r<0?t+i.length:r,startDOM:(n?i.children[n-1].dom.nextSibling:null)||i.dom.firstChild,endDOM:a=0?i.children[a].dom:null}}else return i.isText()?{from:t,to:t+i.length,startDOM:i.dom,endDOM:i.dom.nextSibling}:null}function KY(i,e){let A,{newSel:t}=e,{state:n}=i,o=n.selection.main,a=i.inputState.lastKeyTime>Date.now()-100?i.inputState.lastKeyCode:-1;if(e.bounds){let{from:r,to:s}=e.bounds,l=o.from,g=null;(a===8||lt.android&&e.text.length=r&&o.to<=s&&(e.typeOver||C!=e.text)&&C.slice(0,o.from-r)==e.text.slice(0,o.from-r)&&C.slice(o.to-r)==e.text.slice(I=e.text.length-(C.length-(o.to-r)))?A={from:o.from,to:o.to,insert:Mn.of(e.text.slice(o.from-r,I).split(MB))}:(B=UY(C,e.text,l-r,g))&&(lt.chrome&&a==13&&B.toB==B.from+2&&e.text.slice(B.from,B.toB)==MB+MB&&B.toB--,A={from:r+B.from,to:r+B.toA,insert:Mn.of(e.text.slice(B.from,B.toB).split(MB))})}else t&&(!i.hasFocus&&n.facet(j0)||m6(t,o))&&(t=null);if(!A&&!t)return!1;if((lt.mac||lt.android)&&A&&A.from==A.to&&A.from==o.head-1&&/^\. ?$/.test(A.insert.toString())&&i.contentDOM.getAttribute("autocorrect")=="off"?(t&&A.insert.length==2&&(t=Ce.single(t.main.anchor-1,t.main.head-1)),A={from:A.from,to:A.to,insert:Mn.of([A.insert.toString().replace("."," ")])}):n.doc.lineAt(o.from).toDate.now()-50?A={from:o.from,to:o.to,insert:n.toText(i.inputState.insertingText)}:lt.chrome&&A&&A.from==A.to&&A.from==o.head&&A.insert.toString()==` + `&&i.lineWrapping&&(t&&(t=Ce.single(t.main.anchor-1,t.main.head-1)),A={from:o.from,to:o.to,insert:Mn.of([" "])}),A)return B9(i,A,t,a);if(t&&!m6(t,o)){let r=!1,s="select";return i.inputState.lastSelectionTime>Date.now()-50&&(i.inputState.lastSelectionOrigin=="select"&&(r=!0),s=i.inputState.lastSelectionOrigin,s=="select.pointer"&&(t=LY(n.facet(F4).map(l=>l(i)),t))),i.dispatch({selection:t,scrollIntoView:r,userEvent:s}),!0}else return!1}function B9(i,e,A,t=-1){if(lt.ios&&i.inputState.flushIOSKey(e))return!0;let n=i.state.selection.main;if(lt.android&&(e.to==n.to&&(e.from==n.from||e.from==n.from-1&&i.state.sliceDoc(e.from,n.from)==" ")&&e.insert.length==1&&e.insert.lines==2&&NB(i.contentDOM,"Enter",13)||(e.from==n.from-1&&e.to==n.to&&e.insert.length==0||t==8&&e.insert.lengthn.head)&&NB(i.contentDOM,"Backspace",8)||e.from==n.from&&e.to==n.to+1&&e.insert.length==0&&NB(i.contentDOM,"Delete",46)))return!0;let o=e.insert.toString();i.inputState.composing>=0&&i.inputState.composing++;let a,r=()=>a||(a=KlA(i,e,A));return i.state.facet(vY).some(s=>s(i,e.from,e.to,o,r))||i.dispatch(r()),!0}function KlA(i,e,A){let t,n=i.state,o=n.selection.main,a=-1;if(e.from==e.to&&e.fromo.to){let s=e.fromC(i)),l,s);e.from==g&&(a=g)}if(a>-1)t={changes:e,selection:Ce.cursor(e.from+e.insert.length,-1)};else if(e.from>=o.from&&e.to<=o.to&&e.to-e.from>=(o.to-o.from)/3&&(!A||A.main.empty&&A.main.from==e.from+e.insert.length)&&i.inputState.composing<0){let s=o.frome.to?n.sliceDoc(e.to,o.to):"";t=n.replaceSelection(i.state.toText(s+e.insert.sliceString(0,void 0,i.state.lineBreak)+l))}else{let s=n.changes(e),l=A&&A.main.to<=s.newLength?A.main:void 0;if(n.selection.ranges.length>1&&(i.inputState.composing>=0||i.inputState.compositionPendingChange)&&e.to<=o.to+10&&e.to>=o.to-10){let g=i.state.sliceDoc(e.from,e.to),C,I=A&&FY(i,A.main.head);if(I){let Q=e.insert.length-(e.to-e.from);C={from:I.from,to:I.to-Q}}else C=i.state.doc.lineAt(o.head);let B=o.to-e.to;t=n.changeByRange(Q=>{if(Q.from==o.from&&Q.to==o.to)return{changes:s,range:l||Q.map(s)};let h=Q.to-B,f=h-g.length;if(i.state.sliceDoc(f,h)!=g||h>=C.from&&f<=C.to)return{range:Q};let m=n.changes({from:f,to:h,insert:e.insert}),v=Q.to-o.to;return{changes:m,range:l?Ce.range(Math.max(0,l.anchor+v),Math.max(0,l.head+v)):Q.map(m)}})}else t={changes:s,selection:l&&n.selection.replaceRange(l)}}let r="input.type";return(i.composing||i.inputState.compositionPendingChange&&i.inputState.compositionEndedAt>Date.now()-50)&&(i.inputState.compositionPendingChange=!1,r+=".compose",i.inputState.compositionFirstChange&&(r+=".start",i.inputState.compositionFirstChange=!1)),n.update(t,{userEvent:r,scrollIntoView:!0})}function UY(i,e,A,t){let n=Math.min(i.length,e.length),o=0;for(;o0&&r>0&&i.charCodeAt(a-1)==e.charCodeAt(r-1);)a--,r--;if(t=="end"){let s=Math.max(0,o-Math.min(a,r));A-=a+s-o}if(a=a?o-A:0;o-=s,r=o+(r-a),a=o}else if(r=r?o-A:0;o-=s,a=o+(a-r),r=o}return{from:o,toA:a,toB:r}}function UlA(i){let e=[];if(i.root.activeElement!=i.contentDOM)return e;let{anchorNode:A,anchorOffset:t,focusNode:n,focusOffset:o}=i.observer.selectionRange;return A&&(e.push(new f6(A,t)),(n!=A||o!=t)&&e.push(new f6(n,o))),e}function TlA(i,e){if(i.length==0)return null;let A=i[0].pos,t=i.length==2?i[1].pos:A;return A>-1&&t>-1?Ce.single(A+e,t+e):null}function m6(i,e){return e.head==i.main.head&&e.anchor==i.main.anchor}var GM=class{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastTouchX=0,this.lastTouchY=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.lastWheelEvent=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText="",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,lt.safari&&e.contentDOM.addEventListener("input",()=>null),lt.gecko&&AgA(e.contentDOM.ownerDocument)}handleEvent(e){!jlA(this.view,e)||this.ignoreDuringComposition(e)||e.type=="keydown"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,A){let t=this.handlers[e];if(t){for(let n of t.observers)n(this.view,A);for(let n of t.handlers){if(A.defaultPrevented)break;if(n(this.view,A)){A.preventDefault();break}}}}ensureHandlers(e){let A=JlA(e),t=this.handlers,n=this.view.contentDOM;for(let o in A)if(o!="scroll"){let a=!A[o].handlers.length,r=t[o];r&&a!=!r.handlers.length&&(n.removeEventListener(o,this.handleEvent),r=null),r||n.addEventListener(o,this.handleEvent,{passive:a})}for(let o in t)o!="scroll"&&!A[o]&&n.removeEventListener(o,this.handleEvent);this.handlers=A}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&JY.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),lt.android&<.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;let A;return lt.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&!e.shiftKey&&((A=TY.find(t=>t.keyCode==e.keyCode))&&!e.ctrlKey||YlA.indexOf(e.key)>-1&&e.ctrlKey)?(this.pendingIOSKey=A||e,setTimeout(()=>this.flushIOSKey(),250),!0):(e.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(e){let A=this.pendingIOSKey;return!A||A.key=="Enter"&&e&&e.from0?!0:lt.safari&&!lt.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function FJ(i,e){return(A,t)=>{try{return e.call(i,t,A)}catch(n){yr(A.state,n)}}}function JlA(i){let e=Object.create(null);function A(t){return e[t]||(e[t]={observers:[],handlers:[]})}for(let t of i){let n=t.spec,o=n&&n.plugin.domEventHandlers,a=n&&n.plugin.domEventObservers;if(o)for(let r in o){let s=o[r];s&&A(r).handlers.push(FJ(t.value,s))}if(a)for(let r in a){let s=a[r];s&&A(r).observers.push(FJ(t.value,s))}}for(let t in qg)A(t).handlers.push(qg[t]);for(let t in Xs)A(t).observers.push(Xs[t]);return e}var TY=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],YlA="dthko",JY=[16,17,18,20,91,92,224,225],e6=6;function t6(i){return Math.max(0,i)*.7+8}function OlA(i,e){return Math.max(Math.abs(i.clientX-e.clientX),Math.abs(i.clientY-e.clientY))}var KM=class{constructor(e,A,t,n){this.view=e,this.startEvent=A,this.style=t,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=A,this.scrollParents=CY(e.contentDOM),this.atoms=e.state.facet(F4).map(a=>a(e));let o=e.contentDOM.ownerDocument;o.addEventListener("mousemove",this.move=this.move.bind(this)),o.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=A.shiftKey,this.multiple=e.state.facet(Pa.allowMultipleSelections)&&HlA(e,A),this.dragging=PlA(e,A)&&HY(A)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&OlA(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let A=0,t=0,n=0,o=0,a=this.view.win.innerWidth,r=this.view.win.innerHeight;this.scrollParents.x&&({left:n,right:a}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:o,bottom:r}=this.scrollParents.y.getBoundingClientRect());let s=d9(this.view);e.clientX-s.left<=n+e6?A=-t6(n-e.clientX):e.clientX+s.right>=a-e6&&(A=t6(e.clientX-a)),e.clientY-s.top<=o+e6?t=-t6(o-e.clientY):e.clientY+s.bottom>=r-e6&&(t=t6(e.clientY-r)),this.setScrollSpeed(A,t)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,A){this.scrollSpeed={x:e,y:A},e||A?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:A}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),A&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=A,A=0),(e||A)&&this.view.win.scrollBy(e,A),this.dragging===!1&&this.select(this.lastEvent)}select(e){let{view:A}=this,t=LY(this.atoms,this.style.get(e,this.extend,this.multiple));(this.mustSelect||!t.eq(A.state.selection,this.dragging===!1))&&this.view.dispatch({selection:t,userEvent:"select.pointer"}),this.mustSelect=!1}update(e){e.transactions.some(A=>A.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}};function HlA(i,e){let A=i.state.facet(mY);return A.length?A[0](e):lt.mac?e.metaKey:e.ctrlKey}function zlA(i,e){let A=i.state.facet(wY);return A.length?A[0](e):lt.mac?!e.altKey:!e.ctrlKey}function PlA(i,e){let{main:A}=i.state.selection;if(A.empty)return!1;let t=R4(i.root);if(!t||t.rangeCount==0)return!0;let n=t.getRangeAt(0).getClientRects();for(let o=0;o=e.clientX&&a.top<=e.clientY&&a.bottom>=e.clientY)return!0}return!1}function jlA(i,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let A=e.target,t;A!=i.contentDOM;A=A.parentNode)if(!A||A.nodeType==11||(t=fa.get(A))&&t.isWidget()&&!t.isHidden&&t.widget.ignoreEvent(e))return!1;return!0}var qg=Object.create(null),Xs=Object.create(null),YY=lt.ie&<.ie_version<15||lt.ios&<.webkit_version<604;function qlA(i){let e=i.dom.parentNode;if(!e)return;let A=e.appendChild(document.createElement("textarea"));A.style.cssText="position: fixed; left: -10000px; top: 10px",A.focus(),setTimeout(()=>{i.focus(),A.remove(),OY(i,A.value)},50)}function N6(i,e,A){for(let t of i.facet(e))A=t(A,i);return A}function OY(i,e){e=N6(i.state,c9,e);let{state:A}=i,t,n=1,o=A.toText(e),a=o.lines==A.selection.ranges.length;if(UM!=null&&A.selection.ranges.every(s=>s.empty)&&UM==o.toString()){let s=-1;t=A.changeByRange(l=>{let g=A.doc.lineAt(l.from);if(g.from==s)return{range:l};s=g.from;let C=A.toText((a?o.line(n++).text:e)+A.lineBreak);return{changes:{from:g.from,insert:C},range:Ce.cursor(l.from+C.length)}})}else a?t=A.changeByRange(s=>{let l=o.line(n++);return{changes:{from:s.from,to:s.to,insert:l.text},range:Ce.cursor(s.from+l.length)}}):t=A.replaceSelection(o);i.dispatch(t,{userEvent:"input.paste",scrollIntoView:!0})}Xs.scroll=i=>{i.inputState.lastScrollTop=i.scrollDOM.scrollTop,i.inputState.lastScrollLeft=i.scrollDOM.scrollLeft};Xs.wheel=Xs.mousewheel=i=>{i.inputState.lastWheelEvent=Date.now()};qg.keydown=(i,e)=>(i.inputState.setSelectionOrigin("select"),e.keyCode==27&&i.inputState.tabFocusMode!=0&&(i.inputState.tabFocusMode=Date.now()+2e3),!1);Xs.touchstart=(i,e)=>{let A=i.inputState,t=e.targetTouches[0];A.lastTouchTime=Date.now(),t&&(A.lastTouchX=t.clientX,A.lastTouchY=t.clientY),A.setSelectionOrigin("select.pointer")};Xs.touchmove=i=>{i.inputState.setSelectionOrigin("select.pointer")};qg.mousedown=(i,e)=>{if(i.observer.flush(),i.inputState.lastTouchTime>Date.now()-2e3)return!1;let A=null;for(let t of i.state.facet(DY))if(A=t(i,e),A)break;if(!A&&e.button==0&&(A=WlA(i,e)),A){let t=!i.hasFocus;i.inputState.startMouseSelection(new KM(i,e,A,t)),t&&i.observer.ignore(()=>{IY(i.contentDOM);let o=i.root.activeElement;o&&!o.contains(i.contentDOM)&&o.blur()});let n=i.inputState.mouseSelection;if(n)return n.start(e),n.dragging===!1}else i.inputState.setSelectionOrigin("select.pointer");return!1};function LJ(i,e,A,t){if(t==1)return Ce.cursor(e,A);if(t==2)return _lA(i.state,e,A);{let n=i.docView.lineAt(e,A),o=i.state.doc.lineAt(n?n.posAtEnd:e),a=n?n.posAtStart:o.from,r=n?n.posAtEnd:o.to;return rDate.now()-400&&Math.abs(e.clientX-i.clientX)<2&&Math.abs(e.clientY-i.clientY)<2?(KJ+1)%3:1}function WlA(i,e){let A=i.posAndSideAtCoords({x:e.clientX,y:e.clientY},!1),t=HY(e),n=i.state.selection;return{update(o){o.docChanged&&(A.pos=o.changes.mapPos(A.pos),n=n.map(o.changes))},get(o,a,r){let s=i.posAndSideAtCoords({x:o.clientX,y:o.clientY},!1),l,g=LJ(i,s.pos,s.assoc,t);if(A.pos!=s.pos&&!a){let C=LJ(i,A.pos,A.assoc,t),I=Math.min(C.from,g.from),B=Math.max(C.to,g.to);g=I1&&(l=ZlA(n,s.pos))?l:r?n.addRange(g):Ce.create([g])}}}function ZlA(i,e){for(let A=0;A=e)return Ce.create(i.ranges.slice(0,A).concat(i.ranges.slice(A+1)),i.mainIndex==A?0:i.mainIndex-(i.mainIndex>A?1:0))}return null}qg.dragstart=(i,e)=>{let{selection:{main:A}}=i.state;if(e.target.draggable){let n=i.docView.tile.nearest(e.target);if(n&&n.isWidget()){let o=n.posAtStart,a=o+n.length;(o>=A.to||a<=A.from)&&(A=Ce.range(o,a))}}let{inputState:t}=i;return t.mouseSelection&&(t.mouseSelection.dragging=!0),t.draggedContent=A,e.dataTransfer&&(e.dataTransfer.setData("Text",N6(i.state,C9,i.state.sliceDoc(A.from,A.to))),e.dataTransfer.effectAllowed="copyMove"),!1};qg.dragend=i=>(i.inputState.draggedContent=null,!1);function TJ(i,e,A,t){if(A=N6(i.state,c9,A),!A)return;let n=i.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:o}=i.inputState,a=t&&o&&zlA(i,e)?{from:o.from,to:o.to}:null,r={from:n,insert:A},s=i.state.changes(a?[a,r]:r);i.focus(),i.dispatch({changes:s,selection:{anchor:s.mapPos(n,-1),head:s.mapPos(n,1)},userEvent:a?"move.drop":"input.drop"}),i.inputState.draggedContent=null}qg.drop=(i,e)=>{if(!e.dataTransfer)return!1;if(i.state.readOnly)return!0;let A=e.dataTransfer.files;if(A&&A.length){let t=Array(A.length),n=0,o=()=>{++n==A.length&&TJ(i,e,t.filter(a=>a!=null).join(i.state.lineBreak),!1)};for(let a=0;a{/[\x00-\x08\x0e-\x1f]{2}/.test(r.result)||(t[a]=r.result),o()},r.readAsText(A[a])}return!0}else{let t=e.dataTransfer.getData("Text");if(t)return TJ(i,e,t,!0),!0}return!1};qg.paste=(i,e)=>{if(i.state.readOnly)return!0;i.observer.flush();let A=YY?null:e.clipboardData;return A?(OY(i,A.getData("text/plain")||A.getData("text/uri-list")),!0):(qlA(i),!1)};function XlA(i,e){let A=i.dom.parentNode;if(!A)return;let t=A.appendChild(document.createElement("textarea"));t.style.cssText="position: fixed; left: -10000px; top: 10px",t.value=e,t.focus(),t.selectionEnd=e.length,t.selectionStart=0,setTimeout(()=>{t.remove(),i.focus()},50)}function $lA(i){let e=[],A=[],t=!1;for(let n of i.selection.ranges)n.empty||(e.push(i.sliceDoc(n.from,n.to)),A.push(n));if(!e.length){let n=-1;for(let{from:o}of i.selection.ranges){let a=i.doc.lineAt(o);a.number>n&&(e.push(a.text),A.push({from:a.from,to:Math.min(i.doc.length,a.to+1)})),n=a.number}t=!0}return{text:N6(i,C9,e.join(i.lineBreak)),ranges:A,linewise:t}}var UM=null;qg.copy=qg.cut=(i,e)=>{if(!m4(i.contentDOM,i.observer.selectionRange))return!1;let{text:A,ranges:t,linewise:n}=$lA(i.state);if(!A&&!n)return!1;UM=n?A:null,e.type=="cut"&&!i.state.readOnly&&i.dispatch({changes:t,scrollIntoView:!0,userEvent:"delete.cut"});let o=YY?null:e.clipboardData;return o?(o.clearData(),o.setData("text/plain",A),!0):(XlA(i,A),!1)};var zY=Vs.define();function PY(i,e){let A=[];for(let t of i.facet(bY)){let n=t(i,e);n&&A.push(n)}return A.length?i.update({effects:A,annotations:zY.of(!0)}):null}function jY(i){setTimeout(()=>{let e=i.hasFocus;if(e!=i.inputState.notifiedFocused){let A=PY(i.state,e);A?i.dispatch(A):i.update([])}},10)}Xs.focus=i=>{i.inputState.lastFocusTime=Date.now(),!i.scrollDOM.scrollTop&&(i.inputState.lastScrollTop||i.inputState.lastScrollLeft)&&(i.scrollDOM.scrollTop=i.inputState.lastScrollTop,i.scrollDOM.scrollLeft=i.inputState.lastScrollLeft),jY(i)};Xs.blur=i=>{i.observer.clearSelectionRange(),jY(i)};Xs.compositionstart=Xs.compositionupdate=i=>{i.observer.editContext||(i.inputState.compositionFirstChange==null&&(i.inputState.compositionFirstChange=!0),i.inputState.composing<0&&(i.inputState.composing=0))};Xs.compositionend=i=>{i.observer.editContext||(i.inputState.composing=-1,i.inputState.compositionEndedAt=Date.now(),i.inputState.compositionPendingKey=!0,i.inputState.compositionPendingChange=i.observer.pendingRecords().length>0,i.inputState.compositionFirstChange=null,lt.chrome&<.android?i.observer.flushSoon():i.inputState.compositionPendingChange?Promise.resolve().then(()=>i.observer.flush()):setTimeout(()=>{i.inputState.composing<0&&i.docView.hasComposition&&i.update([])},50))};Xs.contextmenu=i=>{i.inputState.lastContextMenu=Date.now()};qg.beforeinput=(i,e)=>{var A,t;if((e.inputType=="insertText"||e.inputType=="insertCompositionText")&&(i.inputState.insertingText=e.data,i.inputState.insertingTextAt=Date.now()),e.inputType=="insertReplacementText"&&i.observer.editContext){let o=(A=e.dataTransfer)===null||A===void 0?void 0:A.getData("text/plain"),a=e.getTargetRanges();if(o&&a.length){let r=a[0],s=i.posAtDOM(r.startContainer,r.startOffset),l=i.posAtDOM(r.endContainer,r.endOffset);return B9(i,{from:s,to:l,insert:i.state.toText(o)},null),!0}}let n;if(lt.chrome&<.android&&(n=TY.find(o=>o.inputType==e.inputType))&&(i.observer.delayAndroidKey(n.key,n.keyCode),n.key=="Backspace"||n.key=="Delete")){let o=((t=window.visualViewport)===null||t===void 0?void 0:t.height)||0;setTimeout(()=>{var a;(((a=window.visualViewport)===null||a===void 0?void 0:a.height)||0)>o+10&&i.hasFocus&&(i.contentDOM.blur(),i.focus())},100)}return lt.ios&&e.inputType=="deleteContentForward"&&i.observer.flushSoon(),lt.safari&&e.inputType=="insertText"&&i.inputState.composing>=0&&setTimeout(()=>Xs.compositionend(i,e),20),!1};var JJ=new Set;function AgA(i){JJ.has(i)||(JJ.add(i),i.addEventListener("copy",()=>{}),i.addEventListener("cut",()=>{}))}var YJ=["pre-wrap","normal","pre-line","break-spaces"],UB=!1;function OJ(){UB=!1}var TM=class{constructor(e){this.lineWrapping=e,this.doc=Mn.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,A){let t=this.doc.lineAt(A).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(t+=Math.max(0,Math.ceil((A-e-t*this.lineLength*.5)/this.lineLength))),this.lineHeight*t}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return YJ.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let A=!1;for(let t=0;t-1,s=Math.abs(A-this.lineHeight)>.3||this.lineWrapping!=r||Math.abs(t-this.charWidth)>.1;if(this.lineWrapping=r,this.lineHeight=A,this.charWidth=t,this.textHeight=n,this.lineLength=o,s){this.heightSamples={};for(let l=0;l0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>g6&&(UB=!0),this.height=e)}replace(e,A,t){return i.of(t)}decomposeLeft(e,A){A.push(this)}decomposeRight(e,A){A.push(this)}applyChanges(e,A,t,n){let o=this,a=t.doc;for(let r=n.length-1;r>=0;r--){let{fromA:s,toA:l,fromB:g,toB:C}=n[r],I=o.lineAt(s,aa.ByPosNoHeight,t.setDoc(A),0,0),B=I.to>=l?I:o.lineAt(l,aa.ByPosNoHeight,t,0,0);for(C+=B.to-l,l=B.to;r>0&&I.from<=n[r-1].toA;)s=n[r-1].fromA,g=n[r-1].fromB,r--,so*2){let r=e[A-1];r.break?e.splice(--A,1,r.left,null,r.right):e.splice(--A,1,r.left,r.right),t+=1+r.break,n-=r.size}else if(o>n*2){let r=e[t];r.break?e.splice(t,1,r.left,null,r.right):e.splice(t,1,r.left,r.right),t+=2+r.break,o-=r.size}else break;else if(n=o&&a(this.lineAt(0,aa.ByPos,t,n,o))}setMeasuredHeight(e){let A=e.heights[e.index++];A<0?(this.spaceAbove=-A,A=e.heights[e.index++]):this.spaceAbove=0,this.setHeight(A)}updateHeight(e,A=0,t=!1,n){return n&&n.from<=A&&n.more&&this.setMeasuredHeight(n),this.outdated=!1,this}toString(){return`block(${this.length})`}},eg=class i extends D6{constructor(e,A,t){super(e,A,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=t}mainBlock(e,A){return new Pg(A,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(e,A,t){let n=t[0];return t.length==1&&(n instanceof i||n instanceof g2&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof g2?n=new i(n.length,this.height,this.spaceAbove):n.height=this.height,this.outdated||(n.outdated=!1),n):fl.of(t)}updateHeight(e,A=0,t=!1,n){return n&&n.from<=A&&n.more?this.setMeasuredHeight(n):(t||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},g2=class i extends fl{constructor(e){super(e,0)}heightMetrics(e,A){let t=e.doc.lineAt(A).number,n=e.doc.lineAt(A+this.length).number,o=n-t+1,a,r=0;if(e.lineWrapping){let s=Math.min(this.height,e.lineHeight*o);a=s/o,this.length>o+1&&(r=(this.height-s)/(this.length-o-1))}else a=this.height/o;return{firstLine:t,lastLine:n,perLine:a,perChar:r}}blockAt(e,A,t,n){let{firstLine:o,lastLine:a,perLine:r,perChar:s}=this.heightMetrics(A,n);if(A.lineWrapping){let l=n+(e0){let o=t[t.length-1];o instanceof i?t[t.length-1]=new i(o.length+n):t.push(null,new i(n-1))}if(e>0){let o=t[0];o instanceof i?t[0]=new i(e+o.length):t.unshift(new i(e-1),null)}return fl.of(t)}decomposeLeft(e,A){A.push(new i(e-1),null)}decomposeRight(e,A){A.push(null,new i(this.length-e-1))}updateHeight(e,A=0,t=!1,n){let o=A+this.length;if(n&&n.from<=A+this.length&&n.more){let a=[],r=Math.max(A,n.from),s=-1;for(n.from>A&&a.push(new i(n.from-A-1).updateHeight(e,A));r<=o&&n.more;){let g=e.doc.lineAt(r).length;a.length&&a.push(null);let C=n.heights[n.index++],I=0;C<0&&(I=-C,C=n.heights[n.index++]),s==-1?s=C:Math.abs(C-s)>=g6&&(s=-2);let B=new eg(g,C,I);B.outdated=!1,a.push(B),r+=g+1}r<=o&&a.push(null,new i(o-r).updateHeight(e,r));let l=fl.of(a);return(s<0||Math.abs(l.height-this.height)>=g6||Math.abs(s-this.heightMetrics(e,A).perLine)>=g6)&&(UB=!0),w6(this,l)}else(t||this.outdated)&&(this.setHeight(e.heightForGap(A,A+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},YM=class extends fl{constructor(e,A,t){super(e.length+A+t.length,e.height+t.height,A|(e.outdated||t.outdated?2:0)),this.left=e,this.right=t,this.size=e.size+t.size}get break(){return this.flags&1}blockAt(e,A,t,n){let o=t+this.left.height;return er))return l;let g=A==aa.ByPosNoHeight?aa.ByPosNoHeight:aa.ByPos;return s?l.join(this.right.lineAt(r,g,t,a,r)):this.left.lineAt(r,g,t,n,o).join(l)}forEachLine(e,A,t,n,o,a){let r=n+this.left.height,s=o+this.left.length+this.break;if(this.break)e=s&&this.right.forEachLine(e,A,t,r,s,a);else{let l=this.lineAt(s,aa.ByPos,t,n,o);e=e&&l.from<=A&&a(l),A>l.to&&this.right.forEachLine(l.to+1,A,t,r,s,a)}}replace(e,A,t){let n=this.left.length+this.break;if(Athis.left.length)return this.balanced(this.left,this.right.replace(e-n,A-n,t));let o=[];e>0&&this.decomposeLeft(e,o);let a=o.length;for(let r of t)o.push(r);if(e>0&&HJ(o,a-1),A=t&&A.push(null)),e>t&&this.right.decomposeLeft(e-t,A)}decomposeRight(e,A){let t=this.left.length,n=t+this.break;if(e>=n)return this.right.decomposeRight(e-n,A);e2*A.size||A.size>2*e.size?fl.of(this.break?[e,null,A]:[e,A]):(this.left=w6(this.left,e),this.right=w6(this.right,A),this.setHeight(e.height+A.height),this.outdated=e.outdated||A.outdated,this.size=e.size+A.size,this.length=e.length+this.break+A.length,this)}updateHeight(e,A=0,t=!1,n){let{left:o,right:a}=this,r=A+o.length+this.break,s=null;return n&&n.from<=A+o.length&&n.more?s=o=o.updateHeight(e,A,t,n):o.updateHeight(e,A,t),n&&n.from<=r+a.length&&n.more?s=a=a.updateHeight(e,r,t,n):a.updateHeight(e,r,t),s?this.balanced(o,a):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function HJ(i,e){let A,t;i[e]==null&&(A=i[e-1])instanceof g2&&(t=i[e+1])instanceof g2&&i.splice(e-1,3,new g2(A.length+1+t.length))}var tgA=5,OM=class i{constructor(e,A){this.pos=e,this.oracle=A,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,A){if(this.lineStart>-1){let t=Math.min(A,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof eg?n.length+=t-this.pos:(t>this.pos||!this.isCovered)&&this.nodes.push(new eg(t-this.pos,-1,0)),this.writtenTo=t,A>t&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=A}point(e,A,t){if(e=tgA)&&this.addLineDeco(n,o,a)}else A>e&&this.span(e,A);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:A}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=A,this.writtenToe&&this.nodes.push(new eg(this.pos-e,-1,0)),this.writtenTo=this.pos}blankContent(e,A){let t=new g2(A-e);return this.oracle.doc.lineAt(e).to==A&&(t.flags|=4),t}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof eg)return e;let A=new eg(0,-1,0);return this.nodes.push(A),A}addBlock(e){this.enterLine();let A=e.deco;A&&A.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,A&&A.endSide>0&&(this.covering=e)}addLineDeco(e,A,t){let n=this.ensureLine();n.length+=t,n.collapsed+=t,n.widgetHeight=Math.max(n.widgetHeight,e),n.breaks+=A,this.writtenTo=this.pos=this.pos+t}finish(e){let A=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(A instanceof eg)&&!this.isCovered?this.nodes.push(new eg(0,-1,0)):(this.writtenTog.clientHeight||g.scrollWidth>g.clientWidth)&&C.overflow!="visible"){let I=g.getBoundingClientRect();o=Math.max(o,I.left),a=Math.min(a,I.right),r=Math.max(r,I.top),s=Math.min(l==i.parentNode?n.innerHeight:s,I.bottom)}l=C.position=="absolute"||C.position=="fixed"?g.offsetParent:g.parentNode}else if(l.nodeType==11)l=l.host;else break;return{left:o-A.left,right:Math.max(o,a)-A.left,top:r-(A.top+e),bottom:Math.max(r,s)-(A.top+e)}}function ogA(i){let e=i.getBoundingClientRect(),A=i.ownerDocument.defaultView||window;return e.left0&&e.top0}function agA(i,e){let A=i.getBoundingClientRect();return{left:0,right:A.right-A.left,top:e,bottom:A.bottom-(A.top+e)}}var M4=class{constructor(e,A,t,n){this.from=e,this.to=A,this.size=t,this.displaySize=n}static same(e,A){if(e.length!=A.length)return!1;for(let t=0;ttypeof n!="function"&&n.class=="cm-lineWrapping");this.heightOracle=new TM(t),this.stateDeco=PJ(A),this.heightMap=fl.empty().applyChanges(this.stateDeco,Mn.empty,this.heightOracle.setDoc(A.doc),[new jg(0,0,0,A.doc.length)]);for(let n=0;n<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());n++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=kt.set(this.lineGaps.map(n=>n.draw(this,!1))),this.scrollParent=e.scrollDOM,this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:A}=this.state.selection;for(let t=0;t<=1;t++){let n=t?A.head:A.anchor;if(!e.some(({from:o,to:a})=>n>=o&&n<=a)){let{from:o,to:a}=this.lineBlockAt(n);e.push(new kB(o,a))}}return this.viewports=e.sort((t,n)=>t.from-n.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?zJ:new PM(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(p4(e,this.scaler))})}update(e,A=null){this.state=e.state;let t=this.stateDeco;this.stateDeco=PJ(this.state);let n=e.changedRanges,o=jg.extendWithRanges(n,igA(t,this.stateDeco,e?e.changes:Jr.empty(this.state.doc.length))),a=this.heightMap.height,r=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollOffset);OJ(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),o),(this.heightMap.height!=a||UB)&&(e.flags|=2),r?(this.scrollAnchorPos=e.changes.mapPos(r.from,-1),this.scrollAnchorHeight=r.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=a);let s=o.length?this.mapViewport(this.viewport,e.changes):this.viewport;(A&&(A.range.heads.to)||!this.viewportIsAppropriate(s))&&(s=this.getViewport(0,A));let l=s.from!=this.viewport.from||s.to!=this.viewport.to;this.viewport=s,e.flags|=this.updateForViewport(),(l||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),A&&(this.scrollTarget=A),!this.mustEnforceCursorAssoc&&(e.selectionSet||e.focusChanged)&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(MY)&&(this.mustEnforceCursorAssoc=!0)}measure(){let{view:e}=this,A=e.contentDOM,t=window.getComputedStyle(A),n=this.heightOracle,o=t.whiteSpace;this.defaultTextDirection=t.direction=="rtl"?wo.RTL:wo.LTR;let a=this.heightOracle.mustRefreshForWrapping(o)||this.mustMeasureContent==="refresh",r=A.getBoundingClientRect(),s=a||this.mustMeasureContent||this.contentDOMHeight!=r.height;this.contentDOMHeight=r.height,this.mustMeasureContent=!1;let l=0,g=0;if(r.width&&r.height){let{scaleX:M,scaleY:x}=cY(A,r);(M>.005&&Math.abs(this.scaleX-M)>.005||x>.005&&Math.abs(this.scaleY-x)>.005)&&(this.scaleX=M,this.scaleY=x,l|=16,a=s=!0)}let C=(parseInt(t.paddingTop)||0)*this.scaleY,I=(parseInt(t.paddingBottom)||0)*this.scaleY;(this.paddingTop!=C||this.paddingBottom!=I)&&(this.paddingTop=C,this.paddingBottom=I,l|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(n.lineWrapping&&(s=!0),this.editorWidth=e.scrollDOM.clientWidth,l|=16);let B=CY(this.view.contentDOM,!1).y;B!=this.scrollParent&&(this.scrollParent=B,this.scrollAnchorHeight=-1,this.scrollOffset=0);let Q=this.getScrollOffset();this.scrollOffset!=Q&&(this.scrollAnchorHeight=-1,this.scrollOffset=Q),this.scrolledToBottom=dY(this.scrollParent||e.win);let h=(this.printing?agA:ngA)(A,this.paddingTop),f=h.top-this.pixelViewport.top,m=h.bottom-this.pixelViewport.bottom;this.pixelViewport=h;let v=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(v!=this.inView&&(this.inView=v,v&&(s=!0)),!this.inView&&!this.scrollTarget&&!ogA(e.dom))return 0;let S=r.width;if((this.contentDOMWidth!=S||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=r.width,this.editorHeight=e.scrollDOM.clientHeight,l|=16),s){let M=e.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(M)&&(a=!0),a||n.lineWrapping&&Math.abs(S-this.contentDOMWidth)>n.charWidth){let{lineHeight:x,charWidth:F,textHeight:z}=e.docView.measureTextSize();a=x>0&&n.refresh(o,x,F,z,Math.max(5,S/F),M),a&&(e.docView.minWidth=0,l|=16)}f>0&&m>0?g=Math.max(f,m):f<0&&m<0&&(g=Math.min(f,m)),OJ();for(let x of this.viewports){let F=x.from==this.viewport.from?M:e.docView.measureVisibleLineHeights(x);this.heightMap=(a?fl.empty().applyChanges(this.stateDeco,Mn.empty,this.heightOracle,[new jg(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(n,0,a,new JM(x.from,F))}UB&&(l|=2)}let k=!this.viewportIsAppropriate(this.viewport,g)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return k&&(l&2&&(l|=this.updateScaler()),this.viewport=this.getViewport(g,this.scrollTarget),l|=this.updateForViewport()),(l&2||k)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(a?[]:this.lineGaps,e)),l|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),l}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,A){let t=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),n=this.heightMap,o=this.heightOracle,{visibleTop:a,visibleBottom:r}=this,s=new kB(n.lineAt(a-t*1e3,aa.ByHeight,o,0,0).from,n.lineAt(r+(1-t)*1e3,aa.ByHeight,o,0,0).to);if(A){let{head:l}=A.range;if(ls.to){let g=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),C=n.lineAt(l,aa.ByPos,o,0,0),I;A.y=="center"?I=(C.top+C.bottom)/2-g/2:A.y=="start"||A.y=="nearest"&&l=r+Math.max(10,Math.min(t,250)))&&n>a-2*1e3&&o>1,a=n<<1;if(this.defaultTextDirection!=wo.LTR&&!t)return[];let r=[],s=(g,C,I,B)=>{if(C-gg&&mm.from>=I.from&&m.to<=I.to&&Math.abs(m.from-g)m.fromv));if(!f){if(CS.from<=C&&S.to>=C)){let S=A.moveToLineBoundary(Ce.cursor(C),!1,!0).head;S>g&&(C=S)}let m=this.gapSize(I,g,C,B),v=t||m<2e6?m:2e6;f=new M4(g,C,m,v)}r.push(f)},l=g=>{if(g.length2e6)for(let x of e)x.from>=g.from&&x.fromg.from&&s(g.from,B,g,C),QA.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let A=this.stateDeco;this.lineGaps.length&&(A=A.concat(this.lineGapDeco));let t=[];oo.spans(A,this.viewport.from,this.viewport.to,{span(o,a){t.push({from:o,to:a})},point(){}},20);let n=0;if(t.length!=this.visibleRanges.length)n=12;else for(let o=0;o=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(A=>A.from<=e&&A.to>=e)||p4(this.heightMap.lineAt(e,aa.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(A=>A.top<=e&&A.bottom>=e)||p4(this.heightMap.lineAt(this.scaler.fromDOM(e),aa.ByHeight,this.heightOracle,0,0),this.scaler)}getScrollOffset(){return(this.scrollParent==this.view.scrollDOM?this.scrollParent.scrollTop:(this.scrollParent?this.scrollParent.getBoundingClientRect().top:0)-this.view.contentDOM.getBoundingClientRect().top)*this.scaleY}scrollAnchorAt(e){let A=this.lineBlockAtHeight(e+8);return A.from>=this.viewport.from||this.viewportLines[0].top-e>200?A:this.viewportLines[0]}elementAtHeight(e){return p4(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},kB=class{constructor(e,A){this.from=e,this.to=A}};function rgA(i,e,A){let t=[],n=i,o=0;return oo.spans(A,i,e,{span(){},point(a,r){a>n&&(t.push({from:n,to:a}),o+=a-n),n=r}},20),n=1)return e[e.length-1].to;let t=Math.floor(i*A);for(let n=0;;n++){let{from:o,to:a}=e[n],r=a-o;if(t<=r)return o+t;t-=r}}function n6(i,e){let A=0;for(let{from:t,to:n}of i.ranges){if(e<=n){A+=e-t;break}A+=n-t}return A/i.total}function sgA(i,e){for(let A of i)if(e(A))return A}var zJ={toDOM(i){return i},fromDOM(i){return i},scale:1,eq(i){return i==this}};function PJ(i){let e=i.facet(R6).filter(t=>typeof t!="function"),A=i.facet(I9).filter(t=>typeof t!="function");return A.length&&e.push(oo.join(A)),e}var PM=class i{constructor(e,A,t){let n=0,o=0,a=0;this.viewports=t.map(({from:r,to:s})=>{let l=A.lineAt(r,aa.ByPos,e,0,0).top,g=A.lineAt(s,aa.ByPos,e,0,0).bottom;return n+=g-l,{from:r,to:s,top:l,bottom:g,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(A.height-n);for(let r of this.viewports)r.domTop=a+(r.top-o)*this.scale,a=r.domBottom=r.domTop+(r.bottom-r.top),o=r.bottom}toDOM(e){for(let A=0,t=0,n=0;;A++){let o=AA.from==e.viewports[t].from&&A.to==e.viewports[t].to):!1}};function p4(i,e){if(e.scale==1)return i;let A=e.toDOM(i.top),t=e.toDOM(i.bottom);return new Pg(i.from,i.length,A,t-A,Array.isArray(i._content)?i._content.map(n=>p4(n,e)):i._content)}var o6=tt.define({combine:i=>i.join(" ")}),sM=tt.define({combine:i=>i.indexOf(!0)>-1}),jM=Ag.newName(),qY=Ag.newName(),VY=Ag.newName(),WY={"&light":"."+qY,"&dark":"."+VY};function qM(i,e,A){return new Ag(e,{finish(t){return/&/.test(t)?t.replace(/&\w*/,n=>{if(n=="&")return i;if(!A||!A[n])throw new RangeError(`Unsupported selector: ${n}`);return A[n]}):i+" "+t}})}var lgA=qM("."+jM,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-selectionHandle":{backgroundColor:"currentColor",width:"1.5px"},".cm-selectionHandle-start::before, .cm-selectionHandle-end::before":{content:'""',backgroundColor:"inherit",borderRadius:"50%",width:"8px",height:"8px",position:"absolute",left:"-3.25px"},".cm-selectionHandle-start::before":{top:"-8px"},".cm-selectionHandle-end::before":{bottom:"-8px"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},WY),ggA={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},lM=lt.ie&<.ie_version<=11,VM=class{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new uM,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(A=>{for(let t of A)this.queue.push(t);(lt.ie&<.ie_version<=11||lt.ios&&e.composing)&&A.some(t=>t.type=="childList"&&t.removedNodes.length||t.type=="characterData"&&t.oldValue.length>t.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&<.android&&e.constructor.EDIT_CONTEXT!==!1&&!(lt.chrome&<.chrome_version<126)&&(this.editContext=new WM(e),e.state.facet(j0)&&(e.contentDOM.editContext=this.editContext.editContext)),lM&&(this.onCharData=A=>{this.queue.push({target:A.target,type:"characterData",oldValue:A.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var A;((A=this.view.docView)===null||A===void 0?void 0:A.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),A.length>0&&A[A.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(A=>{A.length>0&&A[A.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((A,t)=>A!=e[t]))){this.gapIntersection.disconnect();for(let A of e)this.gapIntersection.observe(A);this.gaps=e}}onSelectionChange(e){let A=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:t}=this,n=this.selectionRange;if(t.state.facet(j0)?t.root.activeElement!=this.dom:!m4(this.dom,n))return;let o=n.anchorNode&&t.docView.tile.nearest(n.anchorNode);if(o&&o.isWidget()&&o.widget.ignoreEvent(e)){A||(this.selectionChanged=!1);return}(lt.ie&<.ie_version<=11||lt.android&<.chrome)&&!t.state.selection.main.empty&&n.focusNode&&w4(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,A=R4(e.root);if(!A)return!1;let t=lt.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&cgA(this.view,A)||A;if(!t||this.selectionRange.eq(t))return!1;let n=m4(this.dom,t);return n&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let o=this.delayedAndroidKey;o&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=o.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&o.force&&NB(this.dom,o.key,o.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||e=="Enter")&&(this.delayedAndroidKey={key:e,keyCode:A,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let A=-1,t=-1,n=!1;for(let o of e){let a=this.readMutation(o);a&&(a.typeOver&&(n=!0),A==-1?{from:A,to:t}=a:(A=Math.min(a.from,A),t=Math.max(a.to,t)))}return{from:A,to:t,typeOver:n}}readChange(){let{from:e,to:A,typeOver:t}=this.processRecords(),n=this.selectionChanged&&m4(this.dom,this.selectionRange);if(e<0&&!n)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let o=new LM(this.view,e,A,t);return this.view.docView.domChanged={newSel:o.newSel?o.newSel.main:null},o}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let A=this.readChange();if(!A)return this.view.requestMeasure(),!1;let t=this.view.state,n=KY(this.view,A);return this.view.state==t&&(A.domChanged||A.newSel&&!m6(this.view.state.selection,A.newSel.main))&&this.view.update([]),n}readMutation(e){let A=this.view.docView.tile.nearest(e.target);if(!A||A.isWidget())return null;if(A.markDirty(e.type=="attributes"),e.type=="childList"){let t=jJ(A,e.previousSibling||e.target.previousSibling,-1),n=jJ(A,e.nextSibling||e.target.nextSibling,1);return{from:t?A.posAfter(t):A.posAtStart,to:n?A.posBefore(n):A.posAtEnd,typeOver:!1}}else return e.type=="characterData"?{from:A.posAtStart,to:A.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(j0)!=e.state.facet(j0)&&(e.view.contentDOM.editContext=e.state.facet(j0)?this.editContext.editContext:null))}destroy(){var e,A,t;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(A=this.gapIntersection)===null||A===void 0||A.disconnect(),(t=this.resizeScroll)===null||t===void 0||t.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function jJ(i,e,A){for(;e;){let t=fa.get(e);if(t&&t.parent==i)return t;let n=e.parentNode;e=n!=i.dom?n:A>0?e.nextSibling:e.previousSibling}return null}function qJ(i,e){let A=e.startContainer,t=e.startOffset,n=e.endContainer,o=e.endOffset,a=i.docView.domAtPos(i.state.selection.main.anchor,1);return w4(a.node,a.offset,n,o)&&([A,t,n,o]=[n,o,A,t]),{anchorNode:A,anchorOffset:t,focusNode:n,focusOffset:o}}function cgA(i,e){if(e.getComposedRanges){let n=e.getComposedRanges(i.root)[0];if(n)return qJ(i,n)}let A=null;function t(n){n.preventDefault(),n.stopImmediatePropagation(),A=n.getTargetRanges()[0]}return i.contentDOM.addEventListener("beforeinput",t,!0),i.dom.ownerDocument.execCommand("indent"),i.contentDOM.removeEventListener("beforeinput",t,!0),A?qJ(i,A):null}var WM=class{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let A=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=t=>{let n=e.state.selection.main,{anchor:o,head:a}=n,r=this.toEditorPos(t.updateRangeStart),s=this.toEditorPos(t.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:t.updateRangeStart,editorBase:r,drifted:!1});let l=s-r>t.text.length;r==this.from&&othis.to&&(s=o);let g=UY(e.state.sliceDoc(r,s),t.text,(l?n.from:n.to)-r,l?"end":null);if(!g){let I=Ce.single(this.toEditorPos(t.selectionStart),this.toEditorPos(t.selectionEnd));m6(I,n)||e.dispatch({selection:I,userEvent:"select"});return}let C={from:g.from+r,to:g.toA+r,insert:Mn.of(t.text.slice(g.from,g.toB).split(` +`))};if((lt.mac||lt.android)&&C.from==a-1&&/^\. ?$/.test(t.text)&&e.contentDOM.getAttribute("autocorrect")=="off"&&(C={from:r,to:s,insert:Mn.of([t.text.replace("."," ")])}),this.pendingContextChange=C,!e.state.readOnly){let I=this.to-this.from+(C.to-C.from+C.insert.length);B9(e,C,Ce.single(this.toEditorPos(t.selectionStart,I),this.toEditorPos(t.selectionEnd,I)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)),C.from=0&&!/[\\p{Alphabetic}\\p{Number}_]/.test(A.text.slice(Math.max(0,t.updateRangeStart-1),Math.min(A.text.length,t.updateRangeStart+1)))&&this.handlers.compositionend(t)},this.handlers.characterboundsupdate=t=>{let n=[],o=null;for(let a=this.toEditorPos(t.rangeStart),r=this.toEditorPos(t.rangeEnd);a{let n=[];for(let o of t.getTextFormats()){let a=o.underlineStyle,r=o.underlineThickness;if(!/none/i.test(a)&&!/none/i.test(r)){let s=this.toEditorPos(o.rangeStart),l=this.toEditorPos(o.rangeEnd);if(s{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:t}=this.composing;this.composing=null,t&&this.reset(e.state)}};for(let t in this.handlers)A.addEventListener(t,this.handlers[t]);this.measureReq={read:t=>{this.editContext.updateControlBounds(t.contentDOM.getBoundingClientRect());let n=R4(t.root);n&&n.rangeCount&&this.editContext.updateSelectionBounds(n.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let A=0,t=!1,n=this.pendingContextChange;return e.changes.iterChanges((o,a,r,s,l)=>{if(t)return;let g=l.length-(a-o);if(n&&a>=n.to)if(n.from==o&&n.to==a&&n.insert.eq(l)){n=this.pendingContextChange=null,A+=g,this.to+=g;return}else n=null,this.revertPending(e.state);if(o+=A,a+=A,a<=this.from)this.from+=g,this.to+=g;else if(othis.to||this.to-this.from+l.length>3e4){t=!0;return}this.editContext.updateText(this.toContextPos(o),this.toContextPos(a),l.toString()),this.to+=g}A+=g}),n&&!t&&this.revertPending(e.state),!t}update(e){let A=this.pendingContextChange,t=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(t.from,t.to)&&e.transactions.some(n=>!n.isUserEvent("input.type")&&n.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||A)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:A}=e.selection.main;this.from=Math.max(0,A-1e4),this.to=Math.min(e.doc.length,A+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let A=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(A.from),this.toContextPos(A.from+A.insert.length),e.doc.sliceString(A.from,A.to))}setSelection(e){let{main:A}=e.selection,t=this.toContextPos(Math.max(this.from,Math.min(this.to,A.anchor))),n=this.toContextPos(A.head);(this.editContext.selectionStart!=t||this.editContext.selectionEnd!=n)&&this.editContext.updateSelection(t,n)}rangeIsValid(e){let{head:A}=e.selection.main;return!(this.from>0&&A-this.from<500||this.to1e4*3)}toEditorPos(e,A=this.to-this.from){e=Math.min(e,A);let t=this.composing;return t&&t.drifted?t.editorBase+(e-t.contextBase):e+this.from}toContextPos(e){let A=this.composing;return A&&A.drifted?A.contextBase+(e-A.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}},Ii=(()=>{class i{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(A={}){var t;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),A.parent&&A.parent.appendChild(this.dom);let{dispatch:n}=A;this.dispatchTransactions=A.dispatchTransactions||n&&(o=>o.forEach(a=>n(a,this)))||(o=>this.update(o)),this.dispatch=this.dispatch.bind(this),this._root=A.root||olA(A.parent)||document,this.viewState=new y6(this,A.state||Pa.create(A)),A.scrollTo&&A.scrollTo.is(A6)&&(this.viewState.scrollTarget=A.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(SB).map(o=>new y4(o));for(let o of this.plugins)o.update(this);this.observer=new VM(this),this.inputState=new GM(this),this.inputState.ensureHandlers(this.plugins),this.docView=new p6(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((t=document.fonts)===null||t===void 0)&&t.ready&&document.fonts.ready.then(()=>{this.viewState.mustMeasureContent="refresh",this.requestMeasure()})}dispatch(...A){let t=A.length==1&&A[0]instanceof Wc?A:A.length==1&&Array.isArray(A[0])?A[0]:[this.state.update(...A)];this.dispatchTransactions(t,this)}update(A){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let t=!1,n=!1,o,a=this.state;for(let B of A){if(B.startState!=a)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");a=B.state}if(this.destroyed){this.viewState.state=a;return}let r=this.hasFocus,s=0,l=null;A.some(B=>B.annotation(zY))?(this.inputState.notifiedFocused=r,s=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,l=PY(a,r),l||(s=1));let g=this.observer.delayedAndroidKey,C=null;if(g?(this.observer.clearDelayedAndroidKey(),C=this.observer.readChange(),(C&&!this.state.doc.eq(a.doc)||!this.state.selection.eq(a.selection))&&(C=null)):this.observer.clear(),a.facet(Pa.phrases)!=this.state.facet(Pa.phrases))return this.setState(a);o=Q6.create(this,a,A),o.flags|=s;let I=this.viewState.scrollTarget;try{this.updateState=2;for(let B of A){if(I&&(I=I.map(B.changes)),B.scrollIntoView){let{main:Q}=B.state.selection;I=new D4(Q.empty?Q:Ce.cursor(Q.head,Q.head>Q.anchor?-1:1))}for(let Q of B.effects)Q.is(A6)&&(I=Q.value.clip(this.state))}this.viewState.update(o,I),this.bidiCache=v6.update(this.bidiCache,o.changes),o.empty||(this.updatePlugins(o),this.inputState.update(o)),t=this.docView.update(o),this.state.facet(u4)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(A),this.docView.updateSelection(t,A.some(B=>B.isUserEvent("select.pointer")))}finally{this.updateState=0}if(o.startState.facet(o6)!=o.state.facet(o6)&&(this.viewState.mustMeasureContent=!0),(t||n||I||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),t&&this.docViewUpdate(),!o.empty)for(let B of this.state.facet(nM))try{B(o)}catch(Q){yr(this.state,Q,"update listener")}(l||C)&&Promise.resolve().then(()=>{l&&this.state==l.startState&&this.dispatch(l),C&&!KY(this,C)&&g.force&&NB(this.contentDOM,g.key,g.keyCode)})}setState(A){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=A;return}this.updateState=2;let t=this.hasFocus;try{for(let n of this.plugins)n.destroy(this);this.viewState=new y6(this,A),this.plugins=A.facet(SB).map(n=>new y4(n)),this.pluginMap.clear();for(let n of this.plugins)n.update(this);this.docView.destroy(),this.docView=new p6(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}t&&this.focus(),this.requestMeasure()}updatePlugins(A){let t=A.startState.facet(SB),n=A.state.facet(SB);if(t!=n){let o=[];for(let a of n){let r=t.indexOf(a);if(r<0)o.push(new y4(a));else{let s=this.plugins[r];s.mustUpdate=A,o.push(s)}}for(let a of this.plugins)a.mustUpdate!=A&&a.destroy(this);this.plugins=o,this.pluginMap.clear()}else for(let o of this.plugins)o.mustUpdate=A;for(let o=0;o-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,A&&this.observer.forceFlush();let t=null,n=this.viewState.scrollParent,o=this.viewState.getScrollOffset(),{scrollAnchorPos:a,scrollAnchorHeight:r}=this.viewState;Math.abs(o-this.viewState.scrollOffset)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let s=0;;s++){if(r<0)if(dY(n||this.win))a=-1,r=this.viewState.heightMap.height;else{let Q=this.viewState.scrollAnchorAt(o);a=Q.from,r=Q.top}this.updateState=1;let l=this.viewState.measure();if(!l&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(s>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let g=[];l&4||([this.measureRequests,g]=[g,this.measureRequests]);let C=g.map(Q=>{try{return Q.read(this)}catch(h){return yr(this.state,h),VJ}}),I=Q6.create(this,this.state,[]),B=!1;I.flags|=l,t?t.flags|=l:t=I,this.updateState=2,I.empty||(this.updatePlugins(I),this.inputState.update(I),this.updateAttrs(),B=this.docView.update(I),B&&this.docViewUpdate());for(let Q=0;Q1||h<-1)&&(n==this.scrollDOM||this.hasFocus||Math.max(this.inputState.lastWheelEvent,this.inputState.lastTouchTime)>Date.now()-100)){o=o+h,n?n.scrollTop+=h:this.win.scrollBy(0,h),r=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(t&&!t.empty)for(let s of this.state.facet(nM))s(t)}get themeClasses(){return jM+" "+(this.state.facet(sM)?VY:qY)+" "+this.state.facet(o6)}updateAttrs(){let A=WJ(this,SJ,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),t={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(j0)?"true":"false",class:"cm-content",style:`${lt.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(t["aria-readonly"]="true"),WJ(this,wM,t);let n=this.observer.ignore(()=>{let o=yJ(this.contentDOM,this.contentAttrs,t),a=yJ(this.dom,this.editorAttrs,A);return o||a});return this.editorAttrs=A,this.contentAttrs=t,n}showAnnouncements(A){let t=!0;for(let n of A)for(let o of n.effects)if(o.is(i.announce)){t&&(this.announceDOM.textContent=""),t=!1;let a=this.announceDOM.appendChild(document.createElement("div"));a.textContent=o.value}}mountStyles(){this.styleModules=this.state.facet(u4);let A=this.state.facet(i.cspNonce);Ag.mount(this.root,this.styleModules.concat(lgA).reverse(),A?{nonce:A}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(A){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),A){if(this.measureRequests.indexOf(A)>-1)return;if(A.key!=null){for(let t=0;tn.plugin==A)||null),t&&t.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(A){return this.readMeasured(),this.viewState.elementAtHeight(A)}lineBlockAtHeight(A){return this.readMeasured(),this.viewState.lineBlockAtHeight(A)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(A){return this.viewState.lineBlockAt(A)}get contentHeight(){return this.viewState.contentHeight}moveByChar(A,t,n){return rM(this,A,NJ(this,A,t,n))}moveByGroup(A,t){return rM(this,A,NJ(this,A,t,n=>NlA(this,A.head,n)))}visualLineSide(A,t){let n=this.bidiSpans(A),o=this.textDirectionAt(A.from),a=n[t?n.length-1:0];return Ce.cursor(a.side(t,o)+A.from,a.forward(!t,o)?1:-1)}moveToLineBoundary(A,t,n=!0){return RlA(this,A,t,n)}moveVertically(A,t,n){return rM(this,A,FlA(this,A,t,n))}domAtPos(A,t=1){return this.docView.domAtPos(A,t)}posAtDOM(A,t=0){return this.docView.posFromDOM(A,t)}posAtCoords(A,t=!0){this.readMeasured();let n=RM(this,A,t);return n&&n.pos}posAndSideAtCoords(A,t=!0){return this.readMeasured(),RM(this,A,t)}coordsAtPos(A,t=1){this.readMeasured();let n=this.docView.coordsAt(A,t);if(!n||n.left==n.right)return n;let o=this.state.doc.lineAt(A),a=this.bidiSpans(o),r=a[ig.find(a,A-o.from,-1,t)];return h6(n,r.dir==wo.LTR==t>0)}coordsForChar(A){return this.readMeasured(),this.docView.coordsForChar(A)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(A){return!this.state.facet(MJ)||Athis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(A))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(A){if(A.length>CgA)return pY(A.length);let t=this.textDirectionAt(A.from),n;for(let a of this.bidiCache)if(a.from==A.from&&a.dir==t&&(a.fresh||uY(a.isolates,n=kJ(this,A))))return a.order;n||(n=kJ(this,A));let o=IlA(A.text,t,n);return this.bidiCache.push(new v6(A.from,A.to,t,n,!0,o)),o}get hasFocus(){var A;return(this.dom.ownerDocument.hasFocus()||lt.safari&&((A=this.inputState)===null||A===void 0?void 0:A.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{IY(this.contentDOM),this.docView.updateSelection()})}setRoot(A){this._root!=A&&(this._root=A,this.observer.setWindow((A.nodeType==9?A:A.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let A of this.plugins)A.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(A,t={}){return A6.of(new D4(typeof A=="number"?Ce.cursor(A):A,t.y,t.x,t.yMargin,t.xMargin))}scrollSnapshot(){let{scrollTop:A,scrollLeft:t}=this.scrollDOM,n=this.viewState.scrollAnchorAt(A);return A6.of(new D4(Ce.cursor(n.from),"start","start",n.top-A,t,!0))}setTabFocusMode(A){A==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof A=="boolean"?this.inputState.tabFocusMode=A?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+A)}static domEventHandlers(A){return No.define(()=>({}),{eventHandlers:A})}static domEventObservers(A){return No.define(()=>({}),{eventObservers:A})}static theme(A,t){let n=Ag.newName(),o=[o6.of(n),u4.of(qM(`.${n}`,A))];return t&&t.dark&&o.push(sM.of(!0)),o}static baseTheme(A){return zg.lowest(u4.of(qM("."+jM,A,WY)))}static findFromDOM(A){var t;let n=A.querySelector(".cm-content"),o=n&&fa.get(n)||fa.get(A);return((t=o?.root)===null||t===void 0?void 0:t.view)||null}}return i.styleModule=u4,i.inputHandler=vY,i.clipboardInputFilter=c9,i.clipboardOutputFilter=C9,i.scrollHandler=SY,i.focusChangeEffect=bY,i.perLineTextDirection=MJ,i.exceptionSink=yY,i.updateListener=nM,i.editable=j0,i.mouseSelectionStyle=DY,i.dragMovesSelection=wY,i.clickAddsSelectionRange=mY,i.decorations=R6,i.blockWrappers=_Y,i.outerDecorations=I9,i.atomicRanges=F4,i.bidiIsolatedRanges=xY,i.scrollMargins=RY,i.darkTheme=sM,i.cspNonce=tt.define({combine:e=>e.length?e[0]:""}),i.contentAttributes=wM,i.editorAttributes=SJ,i.lineWrapping=i.contentAttributes.of({class:"cm-lineWrapping"}),i.announce=$i.define(),i})(),CgA=4096,VJ={},v6=class i{constructor(e,A,t,n,o,a){this.from=e,this.to=A,this.dir=t,this.isolates=n,this.fresh=o,this.order=a}static update(e,A){if(A.empty&&!e.some(o=>o.fresh))return e;let t=[],n=e.length?e[e.length-1].dir:wo.LTR;for(let o=Math.max(0,e.length-10);o=0;n--){let o=t[n],a=typeof o=="function"?o(i):o;a&&s9(a,A)}return A}var IgA=lt.mac?"mac":lt.windows?"win":lt.linux?"linux":"key";function dgA(i,e){let A=i.split(/-(?!$)/),t=A[A.length-1];t=="Space"&&(t=" ");let n,o,a,r;for(let s=0;st.concat(n),[]))),A}function XY(i,e,A){return $Y(ZY(i.state),e,i,A)}var l2=null,EgA=4e3;function hgA(i,e=IgA){let A=Object.create(null),t=Object.create(null),n=(a,r)=>{let s=t[a];if(s==null)t[a]=r;else if(s!=r)throw new Error("Key binding "+a+" is used both as a regular binding and as a multi-stroke prefix")},o=(a,r,s,l,g)=>{var C,I;let B=A[a]||(A[a]=Object.create(null)),Q=r.split(/ (?!$)/).map(m=>dgA(m,e));for(let m=1;m{let k=l2={view:S,prefix:v,scope:a};return setTimeout(()=>{l2==k&&(l2=null)},EgA),!0}]})}let h=Q.join(" ");n(h,!1);let f=B[h]||(B[h]={preventDefault:!1,stopPropagation:!1,run:((I=(C=B._any)===null||C===void 0?void 0:C.run)===null||I===void 0?void 0:I.slice())||[]});s&&f.run.push(s),l&&(f.preventDefault=!0),g&&(f.stopPropagation=!0)};for(let a of i){let r=a.scope?a.scope.split(" "):["editor"];if(a.any)for(let l of r){let g=A[l]||(A[l]=Object.create(null));g._any||(g._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:C}=a;for(let I in g)g[I].run.push(B=>C(B,ZM))}let s=a[e]||a.key;if(s)for(let l of r)o(l,s,a.run,a.preventDefault,a.stopPropagation),a.shift&&o(l,"Shift-"+s,a.shift,a.preventDefault,a.stopPropagation)}return A}var ZM=null;function $Y(i,e,A,t){ZM=e;let n=pJ(e),o=Or(n,0),a=pl(o)==n.length&&n!=" ",r="",s=!1,l=!1,g=!1;l2&&l2.view==A&&l2.scope==t&&(r=l2.prefix+" ",JY.indexOf(e.keyCode)<0&&(l=!0,l2=null));let C=new Set,I=f=>{if(f){for(let m of f.run)if(!C.has(m)&&(C.add(m),m(A)))return f.stopPropagation&&(g=!0),!0;f.preventDefault&&(f.stopPropagation&&(g=!0),l=!0)}return!1},B=i[t],Q,h;return B&&(I(B[r+a6(n,e,!a)])?s=!0:a&&(e.altKey||e.metaKey||e.ctrlKey)&&!(lt.windows&&e.ctrlKey&&e.altKey)&&!(lt.mac&&e.altKey&&!(e.ctrlKey||e.metaKey))&&(Q=P0[e.keyCode])&&Q!=n?(I(B[r+a6(Q,e,!0)])||e.shiftKey&&(h=bB[e.keyCode])!=n&&h!=Q&&I(B[r+a6(h,e,!1)]))&&(s=!0):a&&e.shiftKey&&I(B[r+a6(n,e,!0)])&&(s=!0),!s&&I(B._any)&&(s=!0)),l&&(s=!0),s&&g&&e.stopPropagation(),ZM=null,s}var iI=class i{constructor(e,A,t,n,o){this.className=e,this.left=A,this.top=t,this.width=n,this.height=o}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,A){return A.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.width!=null&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,A,t){if(t.empty){let n=e.coordsAtPos(t.head,t.assoc||1);if(!n)return[];let o=AO(e);return[new i(A,n.left-o.left,n.top-o.top,null,n.bottom-n.top)]}else return QgA(e,A,t)}};function AO(i){let e=i.scrollDOM.getBoundingClientRect();return{left:(i.textDirection==wo.LTR?e.left:e.right-i.scrollDOM.clientWidth*i.scaleX)-i.scrollDOM.scrollLeft*i.scaleX,top:e.top-i.scrollDOM.scrollTop*i.scaleY}}function XJ(i,e,A,t){let n=i.coordsAtPos(e,A*2);if(!n)return t;let o=i.dom.getBoundingClientRect(),a=(n.top+n.bottom)/2,r=i.posAtCoords({x:o.left+1,y:a}),s=i.posAtCoords({x:o.right-1,y:a});return r==null||s==null?t:{from:Math.max(t.from,Math.min(r,s)),to:Math.min(t.to,Math.max(r,s))}}function QgA(i,e,A){if(A.to<=i.viewport.from||A.from>=i.viewport.to)return[];let t=Math.max(A.from,i.viewport.from),n=Math.min(A.to,i.viewport.to),o=i.textDirection==wo.LTR,a=i.contentDOM,r=a.getBoundingClientRect(),s=AO(i),l=a.querySelector(".cm-line"),g=l&&window.getComputedStyle(l),C=r.left+(g?parseInt(g.paddingLeft)+Math.min(0,parseInt(g.textIndent)):0),I=r.right-(g?parseInt(g.paddingRight):0),B=xM(i,t,1),Q=xM(i,n,-1),h=B.type==Hr.Text?B:null,f=Q.type==Hr.Text?Q:null;if(h&&(i.lineWrapping||B.widgetLineBreaks)&&(h=XJ(i,t,1,h)),f&&(i.lineWrapping||Q.widgetLineBreaks)&&(f=XJ(i,n,-1,f)),h&&f&&h.from==f.from&&h.to==f.to)return v(S(A.from,A.to,h));{let M=h?S(A.from,null,h):k(B,!1),x=f?S(null,A.to,f):k(Q,!0),F=[];return(h||B).to<(f||Q).from-(h&&f?1:0)||B.widgetLineBreaks>1&&M.bottom+i.defaultLineHeight/2W&&wA.from=QA)break;_A>BA&&AA(Math.max(dA,BA),M==null&&dA<=W,Math.min(_A,QA),x==null&&_A>=CA,IA.dir)}if(BA=RA.to+1,BA>=QA)break}return Z.length==0&&AA(W,M==null,CA,x==null,i.textDirection),{top:z,bottom:P,horizontal:Z}}function k(M,x){let F=r.top+(x?M.top:M.bottom);return{top:F,bottom:F,horizontal:[]}}}function ugA(i,e){return i.constructor==e.constructor&&i.eq(e)}var XM=class{constructor(e,A){this.view=e,this.layer=A,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),A.above&&this.dom.classList.add("cm-layer-above"),A.class&&this.dom.classList.add(A.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),A.mount&&A.mount(this.dom,e)}update(e){e.startState.facet(c6)!=e.state.facet(c6)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let A=0,t=e.facet(c6);for(;A!ugA(A,this.drawn[t]))){let A=this.dom.firstChild,t=0;for(let n of e)n.update&&A&&n.constructor&&this.drawn[t].constructor&&n.update(A,this.drawn[t])?(A=A.nextSibling,t++):this.dom.insertBefore(n.draw(),A);for(;A;){let n=A.nextSibling;A.remove(),A=n}this.drawn=e,lt.safari&<.safari_version>=26&&(this.dom.style.display=this.dom.firstChild?"":"none")}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}},c6=tt.define();function eO(i){return[No.define(e=>new XM(e,i)),c6.of(i)]}var TB=tt.define({combine(i){return Dr(i,{cursorBlinkRate:1200,drawRangeCursor:!0,iosSelectionHandles:!0},{cursorBlinkRate:(e,A)=>Math.min(e,A),drawRangeCursor:(e,A)=>e||A})}});function tO(i={}){return[TB.of(i),pgA,fgA,mgA,MY.of(!0)]}function iO(i){return i.startState.facet(TB)!=i.state.facet(TB)}var pgA=eO({above:!0,markers(i){let{state:e}=i,A=e.facet(TB),t=[];for(let n of e.selection.ranges){let o=n==e.selection.main;if(n.empty||A.drawRangeCursor&&!(o&<.ios&&A.iosSelectionHandles)){let a=o?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",r=n.empty?n:Ce.cursor(n.head,n.assoc);for(let s of iI.forRange(i,a,r))t.push(s)}}return t},update(i,e){i.transactions.some(t=>t.selection)&&(e.style.animationName=e.style.animationName=="cm-blink"?"cm-blink2":"cm-blink");let A=iO(i);return A&&$J(i.state,e),i.docChanged||i.selectionSet||A},mount(i,e){$J(e.state,i)},class:"cm-cursorLayer"});function $J(i,e){e.style.animationDuration=i.facet(TB).cursorBlinkRate+"ms"}var fgA=eO({above:!1,markers(i){let e=[],{main:A,ranges:t}=i.state.selection;for(let n of t)if(!n.empty)for(let o of iI.forRange(i,"cm-selectionBackground",n))e.push(o);if(lt.ios&&!A.empty&&i.state.facet(TB).iosSelectionHandles){for(let n of iI.forRange(i,"cm-selectionHandle cm-selectionHandle-start",Ce.cursor(A.from,1)))e.push(n);for(let n of iI.forRange(i,"cm-selectionHandle cm-selectionHandle-end",Ce.cursor(A.to,1)))e.push(n)}return e},update(i,e){return i.docChanged||i.selectionSet||i.viewportChanged||iO(i)},class:"cm-selectionLayer"}),mgA=zg.highest(Ii.theme({".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"},caretColor:"transparent !important"},".cm-content":{caretColor:"transparent !important","& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}})),nO=$i.define({map(i,e){return i==null?null:e.mapPos(i)}}),f4=ba.define({create(){return null},update(i,e){return i!=null&&(i=e.changes.mapPos(i)),e.effects.reduce((A,t)=>t.is(nO)?t.value:A,i)}}),wgA=No.fromClass(class{constructor(i){this.view=i,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(i){var e;let A=i.state.field(f4);A==null?this.cursor!=null&&((e=this.cursor)===null||e===void 0||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(i.startState.field(f4)!=A||i.docChanged||i.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:i}=this,e=i.state.field(f4),A=e!=null&&i.coordsAtPos(e);if(!A)return null;let t=i.scrollDOM.getBoundingClientRect();return{left:A.left-t.left+i.scrollDOM.scrollLeft*i.scaleX,top:A.top-t.top+i.scrollDOM.scrollTop*i.scaleY,height:A.bottom-A.top}}drawCursor(i){if(this.cursor){let{scaleX:e,scaleY:A}=this.view;i?(this.cursor.style.left=i.left/e+"px",this.cursor.style.top=i.top/A+"px",this.cursor.style.height=i.height/A+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(i){this.view.state.field(f4)!=i&&this.view.dispatch({effects:nO.of(i)})}},{eventObservers:{dragover(i){this.setDropPos(this.view.posAtCoords({x:i.clientX,y:i.clientY}))},dragleave(i){(i.target==this.view.contentDOM||!this.view.contentDOM.contains(i.relatedTarget))&&this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function oO(){return[f4,wgA]}function AY(i,e,A,t,n){e.lastIndex=0;for(let o=i.iterRange(A,t),a=A,r;!o.next().done;a+=o.value.length)if(!o.lineBreak)for(;r=e.exec(o.value);)n(a+r.index,r)}function DgA(i,e){let A=i.visibleRanges;if(A.length==1&&A[0].from==i.viewport.from&&A[0].to==i.viewport.to)return A;let t=[];for(let{from:n,to:o}of A)n=Math.max(i.state.doc.lineAt(n).from,n-e),o=Math.min(i.state.doc.lineAt(o).to,o+e),t.length&&t[t.length-1].to>=n?t[t.length-1].to=o:t.push({from:n,to:o});return t}var $M=class{constructor(e){let{regexp:A,decoration:t,decorate:n,boundary:o,maxLength:a=1e3}=e;if(!A.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=A,n)this.addMatch=(r,s,l,g)=>n(g,l,l+r[0].length,r,s);else if(typeof t=="function")this.addMatch=(r,s,l,g)=>{let C=t(r,s,l);C&&g(l,l+r[0].length,C)};else if(t)this.addMatch=(r,s,l,g)=>g(l,l+r[0].length,t);else throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.boundary=o,this.maxLength=a}createDeco(e){let A=new Yr,t=A.add.bind(A);for(let{from:n,to:o}of DgA(e,this.maxLength))AY(e.state.doc,this.regexp,n,o,(a,r)=>this.addMatch(r,e,a,t));return A.finish()}updateDeco(e,A){let t=1e9,n=-1;return e.docChanged&&e.changes.iterChanges((o,a,r,s)=>{s>=e.view.viewport.from&&r<=e.view.viewport.to&&(t=Math.min(r,t),n=Math.max(s,n))}),e.viewportMoved||n-t>1e3?this.createDeco(e.view):n>-1?this.updateRange(e.view,A.map(e.changes),t,n):A}updateRange(e,A,t,n){for(let o of e.visibleRanges){let a=Math.max(o.from,t),r=Math.min(o.to,n);if(r>=a){let s=e.state.doc.lineAt(a),l=s.tos.from;a--)if(this.boundary.test(s.text[a-1-s.from])){g=a;break}for(;rI.push(m.range(h,f));if(s==l)for(this.regexp.lastIndex=g-s.from;(B=this.regexp.exec(s.text))&&B.indexthis.addMatch(f,e,h,Q));A=A.update({filterFrom:g,filterTo:C,filter:(h,f)=>hC,add:I})}}return A}},A9=/x/.unicode!=null?"gu":"g",ygA=new RegExp(`[\0-\b +-\x7F-\x9F\xAD\u061C\u200B\u200E\u200F\u2028\u2029\u202D\u202E\u2066\u2067\u2069\uFEFF\uFFF9-\uFFFC]`,A9),vgA={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"},gM=null;function bgA(){var i;if(gM==null&&typeof document<"u"&&document.body){let e=document.body.style;gM=((i=e.tabSize)!==null&&i!==void 0?i:e.MozTabSize)!=null}return gM||!1}var C6=tt.define({combine(i){let e=Dr(i,{render:null,specialChars:ygA,addSpecialChars:null});return(e.replaceTabs=!bgA())&&(e.specialChars=new RegExp(" |"+e.specialChars.source,A9)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,A9)),e}});function aO(i={}){return[C6.of(i),MgA()]}var eY=null;function MgA(){return eY||(eY=No.fromClass(class{constructor(i){this.view=i,this.decorations=kt.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(i.state.facet(C6)),this.decorations=this.decorator.createDeco(i)}makeDecorator(i){return new $M({regexp:i.specialChars,decoration:(e,A,t)=>{let{doc:n}=A.state,o=Or(e[0],0);if(o==9){let a=n.lineAt(t),r=A.state.tabSize,s=z0(a.text,r,t-a.from);return kt.replace({widget:new t9((r-s%r)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[o]||(this.decorationCache[o]=kt.replace({widget:new e9(i,o)}))},boundary:i.replaceTabs?void 0:/[^]/})}update(i){let e=i.state.facet(C6);i.startState.facet(C6)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(i.view)):this.decorations=this.decorator.updateDeco(i,this.decorations)}},{decorations:i=>i.decorations}))}var SgA="\u2022";function kgA(i){return i>=32?SgA:i==10?"\u2424":String.fromCharCode(9216+i)}var e9=class extends Zs{constructor(e,A){super(),this.options=e,this.code=A}eq(e){return e.code==this.code}toDOM(e){let A=kgA(this.code),t=e.state.phrase("Control character")+" "+(vgA[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,t,A);if(n)return n;let o=document.createElement("span");return o.textContent=A,o.title=t,o.setAttribute("aria-label",t),o.className="cm-specialChar",o}ignoreEvent(){return!1}},t9=class extends Zs{constructor(e){super(),this.width=e}eq(e){return e.width==this.width}toDOM(){let e=document.createElement("span");return e.textContent=" ",e.className="cm-tab",e.style.width=this.width+"px",e}ignoreEvent(){return!1}};function rO(){return xgA}var _gA=kt.line({class:"cm-activeLine"}),xgA=No.fromClass(class{constructor(i){this.decorations=this.getDeco(i)}update(i){(i.docChanged||i.selectionSet)&&(this.decorations=this.getDeco(i.view))}getDeco(i){let e=-1,A=[];for(let t of i.state.selection.ranges){let n=i.lineBlockAt(t.head);n.from>e&&(A.push(_gA.range(n.from)),e=n.from)}return kt.set(A)}},{decorations:i=>i.decorations});var i9=2e3;function RgA(i,e,A){let t=Math.min(e.line,A.line),n=Math.max(e.line,A.line),o=[];if(e.off>i9||A.off>i9||e.col<0||A.col<0){let a=Math.min(e.off,A.off),r=Math.max(e.off,A.off);for(let s=t;s<=n;s++){let l=i.doc.line(s);l.length<=r&&o.push(Ce.range(l.from+a,l.to+r))}}else{let a=Math.min(e.col,A.col),r=Math.max(e.col,A.col);for(let s=t;s<=n;s++){let l=i.doc.line(s),g=Xm(l.text,a,i.tabSize,!0);if(g<0)o.push(Ce.cursor(l.to));else{let C=Xm(l.text,r,i.tabSize);o.push(Ce.range(l.from+g,l.from+C))}}}return o}function NgA(i,e){let A=i.coordsAtPos(i.viewport.from);return A?Math.round(Math.abs((A.left-e)/i.defaultCharacterWidth)):-1}function tY(i,e){let A=i.posAtCoords({x:e.clientX,y:e.clientY},!1),t=i.state.doc.lineAt(A),n=A-t.from,o=n>i9?-1:n==t.length?NgA(i,e.clientX):z0(t.text,i.state.tabSize,A-t.from);return{line:t.number,col:o,off:n}}function FgA(i,e){let A=tY(i,e),t=i.state.selection;return A?{update(n){if(n.docChanged){let o=n.changes.mapPos(n.startState.doc.line(A.line).from),a=n.state.doc.lineAt(o);A={line:a.number,col:A.col,off:Math.min(A.off,a.length)},t=t.map(n.changes)}},get(n,o,a){let r=tY(i,n);if(!r)return t;let s=RgA(i.state,A,r);return s.length?a?Ce.create(s.concat(t.ranges)):Ce.create(s):t}}:null}function sO(i){let e=i?.eventFilter||(A=>A.altKey&&A.button==0);return Ii.mouseSelectionStyle.of((A,t)=>e(t)?FgA(A,t):null)}var LgA={Alt:[18,i=>!!i.altKey],Control:[17,i=>!!i.ctrlKey],Shift:[16,i=>!!i.shiftKey],Meta:[91,i=>!!i.metaKey]},GgA={style:"cursor: crosshair"};function lO(i={}){let[e,A]=LgA[i.key||"Alt"],t=No.fromClass(class{constructor(n){this.view=n,this.isDown=!1}set(n){this.isDown!=n&&(this.isDown=n,this.view.update([]))}},{eventObservers:{keydown(n){this.set(n.keyCode==e||A(n))},keyup(n){(n.keyCode==e||!A(n))&&this.set(!1)},mousemove(n){this.set(A(n))}}});return[t,Ii.contentAttributes.of(n=>{var o;return!((o=n.plugin(t))===null||o===void 0)&&o.isDown?GgA:null})]}var r6="-10000px",b6=class{constructor(e,A,t,n){this.facet=A,this.createTooltipView=t,this.removeTooltipView=n,this.input=e.state.facet(A),this.tooltips=this.input.filter(a=>a);let o=null;this.tooltipViews=this.tooltips.map(a=>o=t(a,o))}update(e,A){var t;let n=e.state.facet(this.facet),o=n.filter(s=>s);if(n===this.input){for(let s of this.tooltipViews)s.update&&s.update(e);return!1}let a=[],r=A?[]:null;for(let s=0;sA[l]=s),A.length=r.length),this.input=n,this.tooltips=o,this.tooltipViews=a,!0}};function KgA(i){let e=i.dom.ownerDocument.documentElement;return{top:0,left:0,bottom:e.clientHeight,right:e.clientWidth}}var cM=tt.define({combine:i=>{var e,A,t;return{position:lt.ios?"absolute":((e=i.find(n=>n.position))===null||e===void 0?void 0:e.position)||"fixed",parent:((A=i.find(n=>n.parent))===null||A===void 0?void 0:A.parent)||null,tooltipSpace:((t=i.find(n=>n.tooltipSpace))===null||t===void 0?void 0:t.tooltipSpace)||KgA}}}),iY=new WeakMap,E9=No.fromClass(class{constructor(i){this.view=i,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=i.state.facet(cM);this.position=e.position,this.parent=e.parent,this.classes=i.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new b6(i,YB,(A,t)=>this.createTooltip(A,t),A=>{this.resizeObserver&&this.resizeObserver.unobserve(A.dom),A.dom.remove()}),this.above=this.manager.tooltips.map(A=>!!A.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(A=>{Date.now()>this.lastTransaction-50&&A.length>0&&A[A.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),i.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let i of this.manager.tooltipViews)this.intersectionObserver.observe(i.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(i){i.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(i,this.above);e&&this.observeIntersection();let A=e||i.geometryChanged,t=i.state.facet(cM);if(t.position!=this.position&&!this.madeAbsolute){this.position=t.position;for(let n of this.manager.tooltipViews)n.dom.style.position=this.position;A=!0}if(t.parent!=this.parent){this.parent&&this.container.remove(),this.parent=t.parent,this.createContainer();for(let n of this.manager.tooltipViews)this.container.appendChild(n.dom);A=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);A&&this.maybeMeasure()}createTooltip(i,e){let A=i.create(this.view),t=e?e.dom:null;if(A.dom.classList.add("cm-tooltip"),i.arrow&&!A.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let n=document.createElement("div");n.className="cm-tooltip-arrow",A.dom.appendChild(n)}return A.dom.style.position=this.position,A.dom.style.top=r6,A.dom.style.left="0px",this.container.insertBefore(A.dom,t),A.mount&&A.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(A.dom),A}destroy(){var i,e,A;this.view.win.removeEventListener("resize",this.measureSoon);for(let t of this.manager.tooltipViews)t.dom.remove(),(i=t.destroy)===null||i===void 0||i.call(t);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(A=this.intersectionObserver)===null||A===void 0||A.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let i=1,e=1,A=!1;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:o}=this.manager.tooltipViews[0];if(lt.safari){let a=o.getBoundingClientRect();A=Math.abs(a.top+1e4)>1||Math.abs(a.left)>1}else A=!!o.offsetParent&&o.offsetParent!=this.container.ownerDocument.body}if(A||this.position=="absolute")if(this.parent){let o=this.parent.getBoundingClientRect();o.width&&o.height&&(i=o.width/this.parent.offsetWidth,e=o.height/this.parent.offsetHeight)}else({scaleX:i,scaleY:e}=this.view.viewState);let t=this.view.scrollDOM.getBoundingClientRect(),n=d9(this.view);return{visible:{left:t.left+n.left,top:t.top+n.top,right:t.right-n.right,bottom:t.bottom-n.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((o,a)=>{let r=this.manager.tooltipViews[a];return r.getCoords?r.getCoords(o.pos):this.view.coordsAtPos(o.pos)}),size:this.manager.tooltipViews.map(({dom:o})=>o.getBoundingClientRect()),space:this.view.state.facet(cM).tooltipSpace(this.view),scaleX:i,scaleY:e,makeAbsolute:A}}writeMeasure(i){var e;if(i.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let r of this.manager.tooltipViews)r.dom.style.position="absolute"}let{visible:A,space:t,scaleX:n,scaleY:o}=i,a=[];for(let r=0;r=Math.min(A.bottom,t.bottom)||C.rightMath.min(A.right,t.right)+.1)){g.style.top=r6;continue}let B=s.arrow?l.dom.querySelector(".cm-tooltip-arrow"):null,Q=B?7:0,h=I.right-I.left,f=(e=iY.get(l))!==null&&e!==void 0?e:I.bottom-I.top,m=l.offset||TgA,v=this.view.textDirection==wo.LTR,S=I.width>t.right-t.left?v?t.left:t.right-I.width:v?Math.max(t.left,Math.min(C.left-(B?14:0)+m.x,t.right-h)):Math.min(Math.max(t.left,C.left-h+(B?14:0)-m.x),t.right-h),k=this.above[r];!s.strictSide&&(k?C.top-f-Q-m.yt.bottom)&&k==t.bottom-C.bottom>C.top-t.top&&(k=this.above[r]=!k);let M=(k?C.top-t.top:t.bottom-C.bottom)-Q;if(MS&&z.topx&&(x=k?z.top-f-2-Q:z.bottom+Q+2);if(this.position=="absolute"?(g.style.top=(x-i.parent.top)/o+"px",nY(g,(S-i.parent.left)/n)):(g.style.top=x/o+"px",nY(g,S/n)),B){let z=C.left+(v?m.x:-m.x)-(S+14-7);B.style.left=z/n+"px"}l.overlap!==!0&&a.push({left:S,top:x,right:F,bottom:x+f}),g.classList.toggle("cm-tooltip-above",k),g.classList.toggle("cm-tooltip-below",!k),l.positioned&&l.positioned(i.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let i of this.manager.tooltipViews)i.dom.style.top=r6}},{eventObservers:{scroll(){this.maybeMeasure()}}});function nY(i,e){let A=parseInt(i.style.left,10);(isNaN(A)||Math.abs(e-A)>1)&&(i.style.left=e+"px")}var UgA=Ii.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),TgA={x:0,y:0},YB=tt.define({enables:[E9,UgA]}),M6=tt.define({combine:i=>i.reduce((e,A)=>e.concat(A),[])}),S6=class i{static create(e){return new i(e)}constructor(e){this.view=e,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new b6(e,M6,(A,t)=>this.createHostedView(A,t),A=>A.dom.remove())}createHostedView(e,A){let t=e.create(this.view);return t.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(t.dom,A?A.dom.nextSibling:this.dom.firstChild),this.mounted&&t.mount&&t.mount(this.view),t}mount(e){for(let A of this.manager.tooltipViews)A.mount&&A.mount(e);this.mounted=!0}positioned(e){for(let A of this.manager.tooltipViews)A.positioned&&A.positioned(e)}update(e){this.manager.update(e)}destroy(){var e;for(let A of this.manager.tooltipViews)(e=A.destroy)===null||e===void 0||e.call(A)}passProp(e){let A;for(let t of this.manager.tooltipViews){let n=t[e];if(n!==void 0){if(A===void 0)A=n;else if(A!==n)return}}return A}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}},JgA=YB.compute([M6],i=>{let e=i.facet(M6);return e.length===0?null:{pos:Math.min(...e.map(A=>A.pos)),end:Math.max(...e.map(A=>{var t;return(t=A.end)!==null&&t!==void 0?t:A.pos})),create:S6.create,above:e[0].above,arrow:e.some(A=>A.arrow)}}),n9=class{constructor(e,A,t,n,o){this.view=e,this.source=A,this.field=t,this.setHover=n,this.hoverTime=o,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:e.dom,time:0},this.checkHover=this.checkHover.bind(this),e.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),e.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout(()=>this.startHover(),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let e=Date.now()-this.lastMove.time;er.bottom||A.xr.right+e.defaultCharacterWidth)return;let s=e.bidiSpans(e.state.doc.lineAt(n)).find(g=>g.from<=n&&g.to>=n),l=s&&s.dir==wo.RTL?-1:1;o=A.x{this.pending==r&&(this.pending=null,s&&!(Array.isArray(s)&&!s.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(s)?s:[s])}))},s=>yr(e.state,s,"hover tooltip"))}else a&&!(Array.isArray(a)&&!a.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(a)?a:[a])})}get tooltip(){let e=this.view.plugin(E9),A=e?e.manager.tooltips.findIndex(t=>t.create==S6.create):-1;return A>-1?e.manager.tooltipViews[A]:null}mousemove(e){var A,t;this.lastMove={x:e.clientX,y:e.clientY,target:e.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:n,tooltip:o}=this;if(n.length&&o&&!YgA(o.dom,e)||this.pending){let{pos:a}=n[0]||this.pending,r=(t=(A=n[0])===null||A===void 0?void 0:A.end)!==null&&t!==void 0?t:a;(a==r?this.view.posAtCoords(this.lastMove)!=a:!OgA(this.view,a,r,e.clientX,e.clientY))&&(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:A}=this;if(A.length){let{tooltip:t}=this;t&&t.dom.contains(e.relatedTarget)?this.watchTooltipLeave(t.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(e){let A=t=>{e.removeEventListener("mouseleave",A),this.active.length&&!this.view.dom.contains(t.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};e.addEventListener("mouseleave",A)}destroy(){clearTimeout(this.hoverTimeout),clearTimeout(this.restartTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}},s6=4;function YgA(i,e){let{left:A,right:t,top:n,bottom:o}=i.getBoundingClientRect(),a;if(a=i.querySelector(".cm-tooltip-arrow")){let r=a.getBoundingClientRect();n=Math.min(r.top,n),o=Math.max(r.bottom,o)}return e.clientX>=A-s6&&e.clientX<=t+s6&&e.clientY>=n-s6&&e.clientY<=o+s6}function OgA(i,e,A,t,n,o){let a=i.scrollDOM.getBoundingClientRect(),r=i.documentTop+i.documentPadding.top+i.contentHeight;if(a.left>t||a.rightn||Math.min(a.bottom,r)=e&&s<=A}function gO(i,e={}){let A=$i.define(),t=ba.define({create(){return[]},update(n,o){if(n.length&&(e.hideOnChange&&(o.docChanged||o.selection)?n=[]:e.hideOn&&(n=n.filter(a=>!e.hideOn(o,a))),o.docChanged)){let a=[];for(let r of n){let s=o.changes.mapPos(r.pos,-1,Tr.TrackDel);if(s!=null){let l=Object.assign(Object.create(null),r);l.pos=s,l.end!=null&&(l.end=o.changes.mapPos(l.end)),a.push(l)}}n=a}for(let a of o.effects)a.is(A)&&(n=a.value),a.is(HgA)&&(n=[]);return n},provide:n=>M6.from(n)});return{active:t,extension:[t,No.define(n=>new n9(n,i,t,A,e.hoverTime||300)),JgA]}}function h9(i,e){let A=i.plugin(E9);if(!A)return null;let t=A.manager.tooltips.indexOf(e);return t<0?null:A.manager.tooltipViews[t]}var HgA=$i.define();var oY=tt.define({combine(i){let e,A;for(let t of i)e=e||t.topContainer,A=A||t.bottomContainer;return{topContainer:e,bottomContainer:A}}});function L4(i,e){let A=i.plugin(cO),t=A?A.specs.indexOf(e):-1;return t>-1?A.panels[t]:null}var cO=No.fromClass(class{constructor(i){this.input=i.state.facet(rI),this.specs=this.input.filter(A=>A),this.panels=this.specs.map(A=>A(i));let e=i.state.facet(oY);this.top=new _B(i,!0,e.topContainer),this.bottom=new _B(i,!1,e.bottomContainer),this.top.sync(this.panels.filter(A=>A.top)),this.bottom.sync(this.panels.filter(A=>!A.top));for(let A of this.panels)A.dom.classList.add("cm-panel"),A.mount&&A.mount()}update(i){let e=i.state.facet(oY);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new _B(i.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new _B(i.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let A=i.state.facet(rI);if(A!=this.input){let t=A.filter(s=>s),n=[],o=[],a=[],r=[];for(let s of t){let l=this.specs.indexOf(s),g;l<0?(g=s(i.view),r.push(g)):(g=this.panels[l],g.update&&g.update(i)),n.push(g),(g.top?o:a).push(g)}this.specs=t,this.panels=n,this.top.sync(o),this.bottom.sync(a);for(let s of r)s.dom.classList.add("cm-panel"),s.mount&&s.mount()}else for(let t of this.panels)t.update&&t.update(i)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:i=>Ii.scrollMargins.of(e=>{let A=e.plugin(i);return A&&{top:A.top.scrollMargin(),bottom:A.bottom.scrollMargin()}})}),_B=class{constructor(e,A,t){this.view=e,this.top=A,this.container=t,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(e){for(let A of this.panels)A.destroy&&e.indexOf(A)<0&&A.destroy();this.panels=e,this.syncDOM()}syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.dom=void 0);return}if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let A=this.container||this.view.dom;A.insertBefore(this.dom,this.top?A.firstChild:null)}let e=this.dom.firstChild;for(let A of this.panels)if(A.dom.parentNode==this.dom){for(;e!=A.dom;)e=aY(e);e=e.nextSibling}else this.dom.insertBefore(A.dom,e);for(;e;)e=aY(e)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses)){for(let e of this.classes.split(" "))e&&this.container.classList.remove(e);for(let e of(this.classes=this.view.themeClasses).split(" "))e&&this.container.classList.add(e)}}};function aY(i){let e=i.nextSibling;return i.remove(),e}var rI=tt.define({enables:cO});function CO(i,e){let A,t=new Promise(a=>A=a),n=a=>zgA(a,e,A);i.state.field(CM,!1)?i.dispatch({effects:IO.of(n)}):i.dispatch({effects:$i.appendConfig.of(CM.init(()=>[n]))});let o=dO.of(n);return{close:o,result:t.then(a=>((i.win.queueMicrotask||(s=>i.win.setTimeout(s,10)))(()=>{i.state.field(CM).indexOf(n)>-1&&i.dispatch({effects:o})}),a))}}var CM=ba.define({create(){return[]},update(i,e){for(let A of e.effects)A.is(IO)?i=[A.value].concat(i):A.is(dO)&&(i=i.filter(t=>t!=A.value));return i},provide:i=>rI.computeN([i],e=>e.field(i))}),IO=$i.define(),dO=$i.define();function zgA(i,e,A){let t=e.content?e.content(i,()=>a(null)):null;if(!t){if(t=ao("form"),e.input){let r=ao("input",e.input);/^(text|password|number|email|tel|url)$/.test(r.type)&&r.classList.add("cm-textfield"),r.name||(r.name="input"),t.appendChild(ao("label",(e.label||"")+": ",r))}else t.appendChild(document.createTextNode(e.label||""));t.appendChild(document.createTextNode(" ")),t.appendChild(ao("button",{class:"cm-button",type:"submit"},e.submitLabel||"OK"))}let n=t.nodeName=="FORM"?[t]:t.querySelectorAll("form");for(let r=0;r{l.keyCode==27?(l.preventDefault(),a(null)):l.keyCode==13&&(l.preventDefault(),a(s))}),s.addEventListener("submit",l=>{l.preventDefault(),a(s)})}let o=ao("div",t,ao("button",{onclick:()=>a(null),"aria-label":i.state.phrase("close"),class:"cm-dialog-close",type:"button"},["\xD7"]));e.class&&(o.className=e.class),o.classList.add("cm-dialog");function a(r){o.contains(o.ownerDocument.activeElement)&&i.focus(),A(r)}return{dom:o,top:e.top,mount:()=>{if(e.focus){let r;typeof e.focus=="string"?r=t.querySelector(e.focus):r=t.querySelector("input")||t.querySelector("button"),r&&"select"in r?r.select():r&&"focus"in r&&r.focus()}}}}var $s=class extends $l{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}};$s.prototype.elementClass="";$s.prototype.toDOM=void 0;$s.prototype.mapMode=Tr.TrackBefore;$s.prototype.startSide=$s.prototype.endSide=-1;$s.prototype.point=!0;var I6=tt.define(),PgA=tt.define(),jgA={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>oo.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},S4=tt.define();function F6(i){return[BO(),S4.of(oA(oA({},jgA),i))]}var o9=tt.define({combine:i=>i.some(e=>e)});function BO(i){let e=[qgA];return i&&i.fixed===!1&&e.push(o9.of(!0)),e}var qgA=No.fromClass(class{constructor(i){this.view=i,this.domAfter=null,this.prevViewport=i.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=i.state.facet(S4).map(e=>new k6(i,e)),this.fixed=!i.state.facet(o9);for(let e of this.gutters)e.config.side=="after"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),i.scrollDOM.insertBefore(this.dom,i.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(i){if(this.updateGutters(i)){let e=this.prevViewport,A=i.view.viewport,t=Math.min(e.to,A.to)-Math.max(e.from,A.from);this.syncGutters(t<(A.to-A.from)*.8)}if(i.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(o9)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=i.view.viewport}syncGutters(i){let e=this.dom.nextSibling;i&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let A=oo.iter(this.view.state.facet(I6),this.view.viewport.from),t=[],n=this.gutters.map(o=>new r9(o,this.view.viewport,-this.view.documentPadding.top));for(let o of this.view.viewportLineBlocks)if(t.length&&(t=[]),Array.isArray(o.type)){let a=!0;for(let r of o.type)if(r.type==Hr.Text&&a){a9(A,t,r.from);for(let s of n)s.line(this.view,r,t);a=!1}else if(r.widget)for(let s of n)s.widget(this.view,r)}else if(o.type==Hr.Text){a9(A,t,o.from);for(let a of n)a.line(this.view,o,t)}else if(o.widget)for(let a of n)a.widget(this.view,o);for(let o of n)o.finish();i&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(i){let e=i.startState.facet(S4),A=i.state.facet(S4),t=i.docChanged||i.heightChanged||i.viewportChanged||!oo.eq(i.startState.facet(I6),i.state.facet(I6),i.view.viewport.from,i.view.viewport.to);if(e==A)for(let n of this.gutters)n.update(i)&&(t=!0);else{t=!0;let n=[];for(let o of A){let a=e.indexOf(o);a<0?n.push(new k6(this.view,o)):(this.gutters[a].update(i),n.push(this.gutters[a]))}for(let o of this.gutters)o.dom.remove(),n.indexOf(o)<0&&o.destroy();for(let o of n)o.config.side=="after"?this.getDOMAfter().appendChild(o.dom):this.dom.appendChild(o.dom);this.gutters=n}return t}destroy(){for(let i of this.gutters)i.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:i=>Ii.scrollMargins.of(e=>{let A=e.plugin(i);if(!A||A.gutters.length==0||!A.fixed)return null;let t=A.dom.offsetWidth*e.scaleX,n=A.domAfter?A.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==wo.LTR?{left:t,right:n}:{right:t,left:n}})});function rY(i){return Array.isArray(i)?i:[i]}function a9(i,e,A){for(;i.value&&i.from<=A;)i.from==A&&e.push(i.value),i.next()}var r9=class{constructor(e,A,t){this.gutter=e,this.height=t,this.i=0,this.cursor=oo.iter(e.markers,A.from)}addElement(e,A,t){let{gutter:n}=this,o=(A.top-this.height)/e.scaleY,a=A.height/e.scaleY;if(this.i==n.elements.length){let r=new _6(e,a,o,t);n.elements.push(r),n.dom.appendChild(r.dom)}else n.elements[this.i].update(e,a,o,t);this.height=A.bottom,this.i++}line(e,A,t){let n=[];a9(this.cursor,n,A.from),t.length&&(n=n.concat(t));let o=this.gutter.config.lineMarker(e,A,n);o&&n.unshift(o);let a=this.gutter;n.length==0&&!a.config.renderEmptyElements||this.addElement(e,A,n)}widget(e,A){let t=this.gutter.config.widgetMarker(e,A.widget,A),n=t?[t]:null;for(let o of e.state.facet(PgA)){let a=o(e,A.widget,A);a&&(n||(n=[])).push(a)}n&&this.addElement(e,A,n)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let A=e.elements.pop();e.dom.removeChild(A.dom),A.destroy()}}},k6=class{constructor(e,A){this.view=e,this.config=A,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let t in A.domEventHandlers)this.dom.addEventListener(t,n=>{let o=n.target,a;if(o!=this.dom&&this.dom.contains(o)){for(;o.parentNode!=this.dom;)o=o.parentNode;let s=o.getBoundingClientRect();a=(s.top+s.bottom)/2}else a=n.clientY;let r=e.lineBlockAtHeight(a-e.documentTop);A.domEventHandlers[t](e,r,n)&&n.preventDefault()});this.markers=rY(A.markers(e)),A.initialSpacer&&(this.spacer=new _6(e,0,0,[A.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let A=this.markers;if(this.markers=rY(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let n=this.config.updateSpacer(this.spacer.markers[0],e);n!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[n])}let t=e.view.viewport;return!oo.eq(this.markers,A,t.from,t.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}},_6=class{constructor(e,A,t,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,A,t,n)}update(e,A,t,n){this.height!=A&&(this.height=A,this.dom.style.height=A+"px"),this.above!=t&&(this.dom.style.marginTop=(this.above=t)?t+"px":""),VgA(this.markers,n)||this.setMarkers(e,n)}setMarkers(e,A){let t="cm-gutterElement",n=this.dom.firstChild;for(let o=0,a=0;;){let r=a,s=oo(r,s,l)||a(r,s,l):a}return t}})}}),k4=class extends $s{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}};function IM(i,e){return i.state.facet(xB).formatNumber(e,i.state)}var XgA=S4.compute([xB],i=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(e){return e.state.facet(WgA)},lineMarker(e,A,t){return t.some(n=>n.toDOM)?null:new k4(IM(e,e.state.doc.lineAt(A.from).number))},widgetMarker:(e,A,t)=>{for(let n of e.state.facet(ZgA)){let o=n(e,A,t);if(o)return o}return null},lineMarkerChange:e=>e.startState.facet(xB)!=e.state.facet(xB),initialSpacer(e){return new k4(IM(e,sY(e.state.doc.lines)))},updateSpacer(e,A){let t=IM(A.view,sY(A.view.state.doc.lines));return t==e.number?e:new k4(t)},domEventHandlers:i.facet(xB).domEventHandlers,side:"before"}));function EO(i={}){return[xB.of(i),BO(),XgA]}function sY(i){let e=9;for(;e{let e=[],A=-1;for(let t of i.selection.ranges){let n=i.doc.lineAt(t.head).from;n>A&&(A=n,e.push($gA.range(n)))}return oo.of(e)});function hO(){return AcA}var ecA=0,G4=class{constructor(e,A){this.from=e,this.to=A}},Li=class{constructor(e={}){this.id=ecA++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=Cs.match(e)),A=>{let t=e(A);return t===void 0?null:[this,t]}}};Li.closedBy=new Li({deserialize:i=>i.split(" ")});Li.openedBy=new Li({deserialize:i=>i.split(" ")});Li.group=new Li({deserialize:i=>i.split(" ")});Li.isolate=new Li({deserialize:i=>{if(i&&i!="rtl"&&i!="ltr"&&i!="auto")throw new RangeError("Invalid value for isolate: "+i);return i||"auto"}});Li.contextHash=new Li({perNode:!0});Li.lookAhead=new Li({perNode:!0});Li.mounted=new Li({perNode:!0});var sI=class{constructor(e,A,t,n=!1){this.tree=e,this.overlay=A,this.parser=t,this.bracketed=n}static get(e){return e&&e.props&&e.props[Li.mounted.id]}},tcA=Object.create(null),Cs=class i{constructor(e,A,t,n=0){this.name=e,this.props=A,this.id=t,this.flags=n}static define(e){let A=e.props&&e.props.length?Object.create(null):tcA,t=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new i(e.name||"",A,e.id,t);if(e.props){for(let o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let A=this.prop(Li.group);return A?A.indexOf(e)>-1:!1}return this.id==e}static match(e){let A=Object.create(null);for(let t in e)for(let n of t.split(" "))A[n]=e[t];return t=>{for(let n=t.prop(Li.group),o=-1;o<(n?n.length:0);o++){let a=A[o<0?t.name:n[o]];if(a)return a}}}};Cs.none=new Cs("",Object.create(null),0,8);var K4=class i{constructor(e){this.types=e;for(let A=0;A0;for(let s=this.cursor(a|Ma.IncludeAnonymous);;){let l=!1;if(s.from<=o&&s.to>=n&&(!r&&s.type.isAnonymous||A(s)!==!1)){if(s.firstChild())continue;l=!0}for(;l&&t&&(r||!s.type.isAnonymous)&&t(s),!s.nextSibling();){if(!s.parent())return;l=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let A in this.props)e.push([+A,this.props[A]]);return e}balance(e={}){return this.children.length<=8?this:D9(Cs.none,this.children,this.positions,0,this.children.length,0,this.length,(A,t,n)=>new i(this.type,A,t,n,this.propValues),e.makeTree||((A,t,n)=>new i(Cs.none,A,t,n)))}static build(e){return ncA(e)}};Fa.empty=new Fa(Cs.none,[],[],0);var Q9=class i{constructor(e,A){this.buffer=e,this.index=A}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new i(this.buffer,this.index)}},C2=class i{constructor(e,A,t){this.buffer=e,this.length=A,this.set=t}get type(){return Cs.none}toString(){let e=[];for(let A=0;A0));s=a[s+3]);return r}slice(e,A,t){let n=this.buffer,o=new Uint16Array(A-e),a=0;for(let r=e,s=0;r=e&&Ae;case 1:return A<=e&&t>e;case 2:return t>e;case 4:return!0}}function U4(i,e,A,t){for(var n;i.from==i.to||(A<1?i.from>=e:i.from>e)||(A>-1?i.to<=e:i.to0?r.length:-1;e!=l;e+=A){let g=r[e],C=s[e]+a.from,I;if(!(!(o&Ma.EnterBracketed&&g instanceof Fa&&(I=sI.get(g))&&!I.overlay&&I.bracketed&&t>=C&&t<=C+g.length)&&!fO(n,t,C,C+g.length))){if(g instanceof C2){if(o&Ma.ExcludeBuffers)continue;let B=g.findChild(0,g.buffer.length,A,t-C,n);if(B>-1)return new T4(new p9(a,g,e,C),null,B)}else if(o&Ma.IncludeAnonymous||!g.type.isAnonymous||w9(g)){let B;if(!(o&Ma.IgnoreMounts)&&(B=sI.get(g))&&!B.overlay)return new i(B.tree,C,e,a);let Q=new i(g,C,e,a);return o&Ma.IncludeAnonymous||!Q.type.isAnonymous?Q:Q.nextChild(A<0?g.children.length-1:0,A,t,n,o)}}}if(o&Ma.IncludeAnonymous||!a.type.isAnonymous||(a.index>=0?e=a.index+A:e=A<0?-1:a._parent._tree.children.length,a=a._parent,!a))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,A,t=0){let n;if(!(t&Ma.IgnoreOverlays)&&(n=sI.get(this._tree))&&n.overlay){let o=e-this.from,a=t&Ma.EnterBracketed&&n.bracketed;for(let{from:r,to:s}of n.overlay)if((A>0||a?r<=o:r=o:s>o))return new i(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,A,t)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function uO(i,e,A,t){let n=i.cursor(),o=[];if(!n.firstChild())return o;if(A!=null){for(let a=!1;!a;)if(a=n.type.is(A),!n.nextSibling())return o}for(;;){if(t!=null&&n.type.is(t))return o;if(n.type.is(e)&&o.push(n.node),!n.nextSibling())return t==null?o:[]}}function u9(i,e,A=e.length-1){for(let t=i;A>=0;t=t.parent){if(!t)return!1;if(!t.type.isAnonymous){if(e[A]&&e[A]!=t.name)return!1;A--}}return!0}var p9=class{constructor(e,A,t,n){this.parent=e,this.buffer=A,this.index=t,this.start=n}},T4=class i extends K6{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,A,t){super(),this.context=e,this._parent=A,this.index=t,this.type=e.buffer.set.types[e.buffer.buffer[t]]}child(e,A,t){let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.context.start,t);return o<0?null:new i(this.context,this,o)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,A,t=0){if(t&Ma.ExcludeBuffers)return null;let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],A>0?1:-1,e-this.context.start,A);return o<0?null:new i(this.context,this,o)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,A=e.buffer[this.index+3];return A<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new i(this.context,this._parent,A):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,A=this._parent?this._parent.index+4:0;return this.index==A?this.externalSibling(-1):new i(this.context,this._parent,e.findChild(A,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],A=[],{buffer:t}=this.context,n=this.index+4,o=t.buffer[this.index+3];if(o>n){let a=t.buffer[this.index+1];e.push(t.slice(n,o,a)),A.push(0)}return new Fa(this.type,e,A,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function mO(i){if(!i.length)return null;let e=0,A=i[0];for(let o=1;oA.from||a.to=e){let r=new A0(a.tree,a.overlay[0].from+o.from,-1,o);(n||(n=[t])).push(U4(r,e,A,!1))}}return n?mO(n):t}var J4=class{get name(){return this.type.name}constructor(e,A=0){if(this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,this.mode=A&~Ma.EnterBracketed,e instanceof A0)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let t=e._parent;t;t=t._parent)this.stack.unshift(t.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,A){this.index=e;let{start:t,buffer:n}=this.buffer;return this.type=A||n.set.types[n.buffer[e]],this.from=t+n.buffer[e+1],this.to=t+n.buffer[e+2],!0}yield(e){return e?e instanceof A0?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,A,t){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,A,t,this.mode));let{buffer:n}=this.buffer,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.buffer.start,t);return o<0?!1:(this.stack.push(this.index),this.yieldBuf(o))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,A,t=this.mode){return this.buffer?t&Ma.ExcludeBuffers?!1:this.enterChild(1,e,A):this.yield(this._tree.enter(e,A,t))}parent(){if(!this.buffer)return this.yieldNode(this.mode&Ma.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&Ma.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:A}=this.buffer,t=this.stack.length-1;if(e<0){let n=t<0?0:this.stack[t]+4;if(this.index!=n)return this.yieldBuf(A.findChild(n,this.index,-1,0,4))}else{let n=A.buffer[this.index+3];if(n<(t<0?A.buffer.length:A.buffer[this.stack[t]+3]))return this.yieldBuf(n)}return t<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let A,t,{buffer:n}=this;if(n){if(e>0){if(this.index-1)for(let o=A+e,a=e<0?-1:t._tree.children.length;o!=a;o+=e){let r=t._tree.children[o];if(this.mode&Ma.IncludeAnonymous||r instanceof C2||!r.type.isAnonymous||w9(r))return!1}return!0}move(e,A){if(A&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,A=0){for(;(this.from==this.to||(A<1?this.from>=e:this.from>e)||(A>-1?this.to<=e:this.to=0;){for(let a=e;a;a=a._parent)if(a.index==n){if(n==this.index)return a;A=a,t=o+1;break A}n=this.stack[--o]}for(let n=t;n=0;o--){if(o<0)return u9(this._tree,e,n);let a=t[A.buffer[this.stack[o]]];if(!a.isAnonymous){if(e[n]&&e[n]!=a.name)return!1;n--}}return!0}};function w9(i){return i.children.some(e=>e instanceof C2||!e.type.isAnonymous||w9(e))}function ncA(i){var e;let{buffer:A,nodeSet:t,maxBufferLength:n=1024,reused:o=[],minRepeatType:a=t.types.length}=i,r=Array.isArray(A)?new Q9(A,A.length):A,s=t.types,l=0,g=0;function C(M,x,F,z,P,Z){let{id:AA,start:W,end:CA,size:wA}=r,BA=g,QA=l;if(wA<0)if(r.next(),wA==-1){let VA=o[AA];F.push(VA),z.push(W-M);return}else if(wA==-3){l=AA;return}else if(wA==-4){g=AA;return}else throw new RangeError(`Unrecognized record size: ${wA}`);let RA=s[AA],IA,dA,_A=W-M;if(CA-W<=n&&(dA=f(r.pos-x,P))){let VA=new Uint16Array(dA.size-dA.skip),he=r.pos-dA.size,HA=VA.length;for(;r.pos>he;)HA=m(dA.start,VA,HA);IA=new C2(VA,CA-dA.start,t),_A=dA.start-M}else{let VA=r.pos-wA;r.next();let he=[],HA=[],vA=AA>=a?AA:-1,PA=0,et=CA;for(;r.pos>VA;)vA>=0&&r.id==vA&&r.size>=0?(r.end<=et-n&&(Q(he,HA,W,PA,r.end,et,vA,BA,QA),PA=he.length,et=r.end),r.next()):Z>2500?I(W,VA,he,HA):C(W,VA,he,HA,vA,Z+1);if(vA>=0&&PA>0&&PA-1&&PA>0){let We=B(RA,QA);IA=D9(RA,he,HA,0,he.length,0,CA-W,We,We)}else IA=h(RA,he,HA,CA-W,BA-CA,QA)}F.push(IA),z.push(_A)}function I(M,x,F,z){let P=[],Z=0,AA=-1;for(;r.pos>x;){let{id:W,start:CA,end:wA,size:BA}=r;if(BA>4)r.next();else{if(AA>-1&&CA=0;wA-=3)W[BA++]=P[wA],W[BA++]=P[wA+1]-CA,W[BA++]=P[wA+2]-CA,W[BA++]=BA;F.push(new C2(W,P[2]-CA,t)),z.push(CA-M)}}function B(M,x){return(F,z,P)=>{let Z=0,AA=F.length-1,W,CA;if(AA>=0&&(W=F[AA])instanceof Fa){if(!AA&&W.type==M&&W.length==P)return W;(CA=W.prop(Li.lookAhead))&&(Z=z[AA]+W.length+CA)}return h(M,F,z,P,Z,x)}}function Q(M,x,F,z,P,Z,AA,W,CA){let wA=[],BA=[];for(;M.length>z;)wA.push(M.pop()),BA.push(x.pop()+F-P);M.push(h(t.types[AA],wA,BA,Z-P,W-Z,CA)),x.push(P-F)}function h(M,x,F,z,P,Z,AA){if(Z){let W=[Li.contextHash,Z];AA=AA?[W].concat(AA):[W]}if(P>25){let W=[Li.lookAhead,P];AA=AA?[W].concat(AA):[W]}return new Fa(M,x,F,z,AA)}function f(M,x){let F=r.fork(),z=0,P=0,Z=0,AA=F.end-n,W={size:0,start:0,skip:0};A:for(let CA=F.pos-M;F.pos>CA;){let wA=F.size;if(F.id==x&&wA>=0){W.size=z,W.start=P,W.skip=Z,Z+=4,z+=4,F.next();continue}let BA=F.pos-wA;if(wA<0||BA=a?4:0,RA=F.start;for(F.next();F.pos>BA;){if(F.size<0)if(F.size==-3||F.size==-4)QA+=4;else break A;else F.id>=a&&(QA+=4);F.next()}P=RA,z+=wA,Z+=QA}return(x<0||z==M)&&(W.size=z,W.start=P,W.skip=Z),W.size>4?W:void 0}function m(M,x,F){let{id:z,start:P,end:Z,size:AA}=r;if(r.next(),AA>=0&&z4){let CA=r.pos-(AA-4);for(;r.pos>CA;)F=m(M,x,F)}x[--F]=W,x[--F]=Z-M,x[--F]=P-M,x[--F]=z}else AA==-3?l=z:AA==-4&&(g=z);return F}let v=[],S=[];for(;r.pos>0;)C(i.start||0,i.bufferStart||0,v,S,-1,0);let k=(e=i.length)!==null&&e!==void 0?e:v.length?S[0]+v[0].length:0;return new Fa(s[i.topID],v.reverse(),S.reverse(),k)}var pO=new WeakMap;function G6(i,e){if(!i.isAnonymous||e instanceof C2||e.type!=i)return 1;let A=pO.get(e);if(A==null){A=1;for(let t of e.children){if(t.type!=i||!(t instanceof Fa)){A=1;break}A+=G6(i,t)}pO.set(e,A)}return A}function D9(i,e,A,t,n,o,a,r,s){let l=0;for(let Q=t;Q=g)break;x+=F}if(S==k+1){if(x>g){let F=Q[k];B(F.children,F.positions,0,F.children.length,h[k]+v);continue}C.push(Q[k])}else{let F=h[S-1]+Q[S-1].length-M;C.push(D9(i,Q,h,k,S,M,F,null,s))}I.push(M+v-o)}}return B(e,A,t,n,0),(r||s)(C,I,a)}var lI=class i{constructor(e,A,t,n,o=!1,a=!1){this.from=e,this.to=A,this.tree=t,this.offset=n,this.open=(o?1:0)|(a?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,A=[],t=!1){let n=[new i(0,e.length,e,0,!1,t)];for(let o of A)o.to>e.length&&n.push(o);return n}static applyChanges(e,A,t=128){if(!A.length)return e;let n=[],o=1,a=e.length?e[0]:null;for(let r=0,s=0,l=0;;r++){let g=r=t)for(;a&&a.from=I.from||C<=I.to||l){let B=Math.max(I.from,s)-l,Q=Math.min(I.to,C)-l;I=B>=Q?null:new i(B,Q,I.tree,I.offset+l,r>0,!!g)}if(I&&n.push(I),a.to>C)break;a=onew G4(n.from,n.to)):[new G4(0,0)]:[new G4(0,e.length)],this.createParse(e,A||[],t)}parse(e,A,t){let n=this.startParse(e,A,t);for(;;){let o=n.advance();if(o)return o}}},m9=class{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,A){return this.string.slice(e,A)}};var WWA=new Li({perNode:!0});var ocA=0,Vg=class i{constructor(e,A,t,n){this.name=e,this.set=A,this.base=t,this.modified=n,this.id=ocA++}toString(){let{name:e}=this;for(let A of this.modified)A.name&&(e=`${A.name}(${e})`);return e}static define(e,A){let t=typeof e=="string"?e:"?";if(e instanceof i&&(A=e),A?.base)throw new Error("Can not derive from a modified tag");let n=new i(t,[],null,[]);if(n.set.push(n),A)for(let o of A.set)n.set.push(o);return n}static defineModifier(e){let A=new Y6(e);return t=>t.modified.indexOf(A)>-1?t:Y6.get(t.base||t,t.modified.concat(A).sort((n,o)=>n.id-o.id))}},acA=0,Y6=class i{constructor(e){this.name=e,this.instances=[],this.id=acA++}static get(e,A){if(!A.length)return e;let t=A[0].instances.find(r=>r.base==e&&rcA(A,r.modified));if(t)return t;let n=[],o=new Vg(e.name,n,e,A);for(let r of A)r.instances.push(o);let a=scA(A);for(let r of e.set)if(!r.modified.length)for(let s of a)n.push(i.get(r,s));return o}};function rcA(i,e){return i.length==e.length&&i.every((A,t)=>A==e[t])}function scA(i){let e=[[]];for(let A=0;At.length-A.length)}function O6(i){let e=Object.create(null);for(let A in i){let t=i[A];Array.isArray(t)||(t=[t]);for(let n of A.split(" "))if(n){let o=[],a=2,r=n;for(let C=0;;){if(r=="..."&&C>0&&C+3==n.length){a=1;break}let I=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(r);if(!I)throw new RangeError("Invalid path: "+n);if(o.push(I[0]=="*"?"":I[0][0]=='"'?JSON.parse(I[0]):I[0]),C+=I[0].length,C==n.length)break;let B=n[C++];if(C==n.length&&B=="!"){a=0;break}if(B!="/")throw new RangeError("Invalid path: "+n);r=n.slice(C)}let s=o.length-1,l=o[s];if(!l)throw new RangeError("Invalid path: "+n);let g=new cI(t,a,s>0?o.slice(0,s):null);e[l]=g.sort(e[l])}}return yO.add(e)}var yO=new Li({combine(i,e){let A,t,n;for(;i||e;){if(!i||e&&i.depth>=e.depth?(n=e,e=e.next):(n=i,i=i.next),A&&A.mode==n.mode&&!n.context&&!A.context)continue;let o=new cI(n.tags,n.mode,n.context);A?A.next=o:t=o,A=o}return t}}),cI=class{constructor(e,A,t,n){this.tags=e,this.mode=A,this.context=t,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let a=n;for(let r of o)for(let s of r.set){let l=A[s.id];if(l){a=a?a+" "+l:l;break}}return a},scope:t}}function lcA(i,e){let A=null;for(let t of i){let n=t.style(e);n&&(A=A?A+" "+n:n)}return A}function vO(i,e,A,t=0,n=i.length){let o=new v9(t,Array.isArray(e)?e:[e],A);o.highlightRange(i.cursor(),t,n,"",o.highlighters),o.flush(n)}var v9=class{constructor(e,A,t){this.at=e,this.highlighters=A,this.span=t,this.class=""}startSpan(e,A){A!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=A)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,A,t,n,o){let{type:a,from:r,to:s}=e;if(r>=t||s<=A)return;a.isTop&&(o=this.highlighters.filter(B=>!B.scope||B.scope(a)));let l=n,g=gcA(e)||cI.empty,C=lcA(o,g.tags);if(C&&(l&&(l+=" "),l+=C,g.mode==1&&(n+=(n?" ":"")+C)),this.startSpan(Math.max(A,r),l),g.opaque)return;let I=e.tree&&e.tree.prop(Li.mounted);if(I&&I.overlay){let B=e.node.enter(I.overlay[0].from+r,1),Q=this.highlighters.filter(f=>!f.scope||f.scope(I.tree.type)),h=e.firstChild();for(let f=0,m=r;;f++){let v=f=S||!e.nextSibling())););if(!v||S>t)break;m=v.to+r,m>A&&(this.highlightRange(B.cursor(),Math.max(A,v.from+r),Math.min(t,m),"",Q),this.startSpan(Math.min(t,m),l))}h&&e.parent()}else if(e.firstChild()){I&&(n="");do if(!(e.to<=A)){if(e.from>=t)break;this.highlightRange(e,A,t,n,o),this.startSpan(Math.min(t,e.to),l)}while(e.nextSibling());e.parent()}}};function gcA(i){let e=i.type.prop(yO);for(;e&&e.context&&!i.matchContext(e.context);)e=e.next;return e||null}var At=Vg.define,U6=At(),I2=At(),wO=At(I2),DO=At(I2),d2=At(),T6=At(d2),y9=At(d2),i0=At(),gI=At(i0),e0=At(),t0=At(),b9=At(),Y4=At(b9),J6=At(),Ke={comment:U6,lineComment:At(U6),blockComment:At(U6),docComment:At(U6),name:I2,variableName:At(I2),typeName:wO,tagName:At(wO),propertyName:DO,attributeName:At(DO),className:At(I2),labelName:At(I2),namespace:At(I2),macroName:At(I2),literal:d2,string:T6,docString:At(T6),character:At(T6),attributeValue:At(T6),number:y9,integer:At(y9),float:At(y9),bool:At(d2),regexp:At(d2),escape:At(d2),color:At(d2),url:At(d2),keyword:e0,self:At(e0),null:At(e0),atom:At(e0),unit:At(e0),modifier:At(e0),operatorKeyword:At(e0),controlKeyword:At(e0),definitionKeyword:At(e0),moduleKeyword:At(e0),operator:t0,derefOperator:At(t0),arithmeticOperator:At(t0),logicOperator:At(t0),bitwiseOperator:At(t0),compareOperator:At(t0),updateOperator:At(t0),definitionOperator:At(t0),typeOperator:At(t0),controlOperator:At(t0),punctuation:b9,separator:At(b9),bracket:Y4,angleBracket:At(Y4),squareBracket:At(Y4),paren:At(Y4),brace:At(Y4),content:i0,heading:gI,heading1:At(gI),heading2:At(gI),heading3:At(gI),heading4:At(gI),heading5:At(gI),heading6:At(gI),contentSeparator:At(i0),list:At(i0),quote:At(i0),emphasis:At(i0),strong:At(i0),link:At(i0),monospace:At(i0),strikethrough:At(i0),inserted:At(),deleted:At(),changed:At(),invalid:At(),meta:J6,documentMeta:At(J6),annotation:At(J6),processingInstruction:At(J6),definition:Vg.defineModifier("definition"),constant:Vg.defineModifier("constant"),function:Vg.defineModifier("function"),standard:Vg.defineModifier("standard"),local:Vg.defineModifier("local"),special:Vg.defineModifier("special")};for(let i in Ke){let e=Ke[i];e instanceof Vg&&(e.name=i)}var $WA=M9([{tag:Ke.link,class:"tok-link"},{tag:Ke.heading,class:"tok-heading"},{tag:Ke.emphasis,class:"tok-emphasis"},{tag:Ke.strong,class:"tok-strong"},{tag:Ke.keyword,class:"tok-keyword"},{tag:Ke.atom,class:"tok-atom"},{tag:Ke.bool,class:"tok-bool"},{tag:Ke.url,class:"tok-url"},{tag:Ke.labelName,class:"tok-labelName"},{tag:Ke.inserted,class:"tok-inserted"},{tag:Ke.deleted,class:"tok-deleted"},{tag:Ke.literal,class:"tok-literal"},{tag:Ke.string,class:"tok-string"},{tag:Ke.number,class:"tok-number"},{tag:[Ke.regexp,Ke.escape,Ke.special(Ke.string)],class:"tok-string2"},{tag:Ke.variableName,class:"tok-variableName"},{tag:Ke.local(Ke.variableName),class:"tok-variableName tok-local"},{tag:Ke.definition(Ke.variableName),class:"tok-variableName tok-definition"},{tag:Ke.special(Ke.variableName),class:"tok-variableName2"},{tag:Ke.definition(Ke.propertyName),class:"tok-propertyName tok-definition"},{tag:Ke.typeName,class:"tok-typeName"},{tag:Ke.namespace,class:"tok-namespace"},{tag:Ke.className,class:"tok-className"},{tag:Ke.macroName,class:"tok-macroName"},{tag:Ke.propertyName,class:"tok-propertyName"},{tag:Ke.operator,class:"tok-operator"},{tag:Ke.comment,class:"tok-comment"},{tag:Ke.meta,class:"tok-meta"},{tag:Ke.invalid,class:"tok-invalid"},{tag:Ke.punctuation,class:"tok-punctuation"}]);var S9,HB=new Li;function ccA(i){return tt.define({combine:i?e=>e.concat(i):void 0})}var CcA=new Li,Wg=(()=>{class i{constructor(A,t,n=[],o=""){this.data=A,this.name=o,Pa.prototype.hasOwnProperty("tree")||Object.defineProperty(Pa.prototype,"tree",{get(){return vr(this)}}),this.parser=t,this.extension=[B2.of(this),Pa.languageData.of((a,r,s)=>{let l=bO(a,r,s),g=l.type.prop(HB);if(!g)return[];let C=a.facet(g),I=l.type.prop(CcA);if(I){let B=l.resolve(r-l.from,s);for(let Q of I)if(Q.test(B,a)){let h=a.facet(Q.facet);return Q.type=="replace"?h:h.concat(C)}}return C})].concat(n)}isActiveAt(A,t,n=-1){return bO(A,t,n).type.prop(HB)==this.data}findRegions(A){let t=A.facet(B2);if(t?.data==this.data)return[{from:0,to:A.doc.length}];if(!t||!t.allowsNesting)return[];let n=[],o=(a,r)=>{if(a.prop(HB)==this.data){n.push({from:r,to:r+a.length});return}let s=a.prop(Li.mounted);if(s){if(s.tree.prop(HB)==this.data){if(s.overlay)for(let l of s.overlay)n.push({from:l.from+r,to:l.to+r});else n.push({from:r,to:r+a.length});return}else if(s.overlay){let l=n.length;if(o(s.tree,s.overlay[0].from+r),n.length>l)return}}for(let l=0;lt.isTop?A:void 0)]}),e.name)}configure(e,A){return new i(this.data,this.parser.configure(e),A||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function vr(i){let e=i.field(Wg.state,!1);return e?e.tree:Fa.empty}function J9(i,e,A=50){var t;let n=(t=i.field(Wg.state,!1))===null||t===void 0?void 0:t.context;if(!n)return null;let o=n.viewport;n.updateViewport({from:0,to:e});let a=n.isDone(e)||n.work(A,e)?n.tree:null;return n.updateViewport(o),a}var R9=class{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,A){let t=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,A):this.string.slice(e-t,A-t)}},O4=null,N9=class i{constructor(e,A,t=[],n,o,a,r,s){this.parser=e,this.state=A,this.fragments=t,this.tree=n,this.treeLen=o,this.viewport=a,this.skipped=r,this.scheduleOn=s,this.parse=null,this.tempSkipped=[]}static create(e,A,t){return new i(e,A,[],Fa.empty,0,t,[],null)}startParse(){return this.parser.startParse(new R9(this.state.doc),this.fragments)}work(e,A){return A!=null&&A>=this.state.doc.length&&(A=void 0),this.tree!=Fa.empty&&this.isDone(A??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var t;if(typeof e=="number"){let n=Date.now()+e;e=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),A!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>A)&&A=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(A=this.parse.advance()););}),this.treeLen=e,this.tree=A,this.fragments=this.withoutTempSkipped(lI.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let A=O4;O4=this;try{return e()}finally{O4=A}}withoutTempSkipped(e){for(let A;A=this.tempSkipped.pop();)e=MO(e,A.from,A.to);return e}changes(e,A){let{fragments:t,tree:n,treeLen:o,viewport:a,skipped:r}=this;if(this.takeTree(),!e.empty){let s=[];if(e.iterChangedRanges((l,g,C,I)=>s.push({fromA:l,toA:g,fromB:C,toB:I})),t=lI.applyChanges(t,s),n=Fa.empty,o=0,a={from:e.mapPos(a.from,-1),to:e.mapPos(a.to,1)},this.skipped.length){r=[];for(let l of this.skipped){let g=e.mapPos(l.from,1),C=e.mapPos(l.to,-1);ge.from&&(this.fragments=MO(this.fragments,n,o),this.skipped.splice(t--,1))}return this.skipped.length>=A?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,A){this.skipped.push({from:e,to:A})}static getSkippingParser(e){return new class extends OB{createParse(A,t,n){let o=n[0].from,a=n[n.length-1].to;return{parsedPos:o,advance(){let s=O4;if(s){for(let l of n)s.tempSkipped.push(l);e&&(s.scheduleOn=s.scheduleOn?Promise.all([s.scheduleOn,e]):e)}return this.parsedPos=a,new Fa(Cs.none,[],[],a-o)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let A=this.fragments;return this.treeLen>=e&&A.length&&A[0].from==0&&A[0].to>=e}static get(){return O4}};function MO(i,e,A){return lI.applyChanges(i,[{fromA:e,toA:A,fromB:e,toB:A}])}var z4=class i{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let A=this.context.changes(e.changes,e.state),t=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),A.viewport.to);return A.work(20,t)||A.takeTree(),new i(A)}static init(e){let A=Math.min(3e3,e.doc.length),t=N9.create(e.facet(B2).parser,e,{from:0,to:A});return t.work(20,A)||t.takeTree(),new i(t)}};Wg.state=ba.define({create:z4.init,update(i,e){for(let A of e.effects)if(A.is(Wg.setState))return A.value;return e.startState.facet(B2)!=e.state.facet(B2)?z4.init(e.state):i.apply(e)}});var FO=i=>{let e=setTimeout(()=>i(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(FO=i=>{let e=-1,A=setTimeout(()=>{e=requestIdleCallback(i,{timeout:400})},100);return()=>e<0?clearTimeout(A):cancelIdleCallback(e)});var k9=typeof navigator<"u"&&(!((S9=navigator.scheduling)===null||S9===void 0)&&S9.isInputPending)?()=>navigator.scheduling.isInputPending():null,IcA=No.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let A=this.view.state.field(Wg.state).context;(A.updateViewport(e.view.viewport)||this.view.viewport.to>A.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(A)}scheduleWork(){if(this.working)return;let{state:e}=this.view,A=e.field(Wg.state);(A.tree!=A.context.tree||!A.context.isDone(e.doc.length))&&(this.working=FO(this.work))}work(e){this.working=null;let A=Date.now();if(this.chunkEndn+1e3,s=o.context.work(()=>k9&&k9()||Date.now()>a,n+(r?0:1e5));this.chunkBudget-=Date.now()-A,(s||this.chunkBudget<=0)&&(o.context.takeTree(),this.view.dispatch({effects:Wg.setState.of(new z4(o.context))})),this.chunkBudget>0&&!(s&&!r)&&this.scheduleWork(),this.checkAsyncSchedule(o.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(A=>yr(this.view.state,A)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),B2=tt.define({combine(i){return i.length?i[0]:null},enables:i=>[Wg.state,IcA,Ii.contentAttributes.compute([i],e=>{let A=e.facet(i);return A&&A.name?{"data-language":A.name}:{}})]}),z6=class{constructor(e,A=[]){this.language=e,this.support=A,this.extension=[e,A]}};var dcA=tt.define(),dI=tt.define({combine:i=>{if(!i.length)return" ";let e=i[0];if(!e||/\S/.test(e)||Array.from(e).some(A=>A!=e[0]))throw new Error("Invalid indent unit: "+JSON.stringify(i[0]));return e}});function Xg(i){let e=i.facet(dI);return e.charCodeAt(0)==9?i.tabSize*e.length:e.length}function jB(i,e){let A="",t=i.tabSize,n=i.facet(dI)[0];if(n==" "){for(;e>=t;)A+=" ",e-=t;n=" "}for(let o=0;o=e?BcA(i,A,e):null}var CI=class{constructor(e,A={}){this.state=e,this.options=A,this.unit=Xg(e)}lineAt(e,A=1){let t=this.state.doc.lineAt(e),{simulateBreak:n,simulateDoubleBreak:o}=this.options;return n!=null&&n>=t.from&&n<=t.to?o&&n==e?{text:"",from:e}:(A<0?n-1&&(o+=a-this.countColumn(t,t.search(/\S|$/))),o}countColumn(e,A=e.length){return z0(e,this.state.tabSize,A)}lineIndent(e,A=1){let{text:t,from:n}=this.lineAt(e,A),o=this.options.overrideIndentation;if(o){let a=o(n);if(a>-1)return a}return this.countColumn(t,t.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}},Y9=new Li;function BcA(i,e,A){let t=e.resolveStack(A),n=e.resolveInner(A,-1).resolve(A,0).enterUnfinishedNodesBefore(A);if(n!=t.node){let o=[];for(let a=n;a&&!(a.fromt.node.to||a.from==t.node.from&&a.type==t.node.type);a=a.parent)o.push(a);for(let a=o.length-1;a>=0;a--)t={node:o[a],next:t}}return LO(t,i,A)}function LO(i,e,A){for(let t=i;t;t=t.next){let n=hcA(t.node);if(n)return n(F9.create(e,A,t))}return 0}function EcA(i){return i.pos==i.options.simulateBreak&&i.options.simulateDoubleBreak}function hcA(i){let e=i.type.prop(Y9);if(e)return e;let A=i.firstChild,t;if(A&&(t=A.type.prop(Li.closedBy))){let n=i.lastChild,o=n&&t.indexOf(n.name)>-1;return a=>fcA(a,!0,1,void 0,o&&!EcA(a)?n.from:void 0)}return i.parent==null?QcA:null}function QcA(){return 0}var F9=class i extends CI{constructor(e,A,t){super(e.state,e.options),this.base=e,this.pos=A,this.context=t}get node(){return this.context.node}static create(e,A,t){return new i(e,A,t)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let A=this.state.doc.lineAt(e.from);for(;;){let t=e.resolve(A.from);for(;t.parent&&t.parent.from==t.from;)t=t.parent;if(ucA(t,e))break;A=this.state.doc.lineAt(t.from)}return this.lineIndent(A.from)}continue(){return LO(this.context.next,this.base,this.pos)}};function ucA(i,e){for(let A=e;A;A=A.parent)if(i==A)return!0;return!1}function pcA(i){let e=i.node,A=e.childAfter(e.from),t=e.lastChild;if(!A)return null;let n=i.options.simulateBreak,o=i.state.doc.lineAt(A.from),a=n==null||n<=o.from?o.to:Math.min(o.to,n);for(let r=A.to;;){let s=e.childAfter(r);if(!s||s==t)return null;if(!s.type.isSkipped){if(s.from>=a)return null;let l=/^ */.exec(o.text.slice(A.to-o.from))[0].length;return{from:A.from,to:A.to+l}}r=s.to}}function fcA(i,e,A,t,n){let o=i.textAfter,a=o.match(/^\s*/)[0].length,r=t&&o.slice(a,a+t.length)==t||n==i.pos+a,s=e?pcA(i):null;return s?r?i.column(s.from):i.column(s.to):i.baseIndent+(r?0:i.unit*A)}function O9({except:i,units:e=1}={}){return A=>{let t=i&&i.test(A.textAfter);return A.baseIndent+(t?0:e*A.unit)}}var mcA=200;function GO(){return Pa.transactionFilter.of(i=>{if(!i.docChanged||!i.isUserEvent("input.type")&&!i.isUserEvent("input.complete"))return i;let e=i.startState.languageDataAt("indentOnInput",i.startState.selection.main.head);if(!e.length)return i;let A=i.newDoc,{head:t}=i.newSelection.main,n=A.lineAt(t);if(t>n.from+mcA)return i;let o=A.sliceString(n.from,t);if(!e.some(l=>l.test(o)))return i;let{state:a}=i,r=-1,s=[];for(let{head:l}of a.selection.ranges){let g=a.doc.lineAt(l);if(g.from==r)continue;r=g.from;let C=j6(a,g.from);if(C==null)continue;let I=/^\s*/.exec(g.text)[0],B=jB(a,C);I!=B&&s.push({from:g.from,to:g.from+I.length,insert:B})}return s.length?[i,{changes:s,sequential:!0}]:i})}var H9=tt.define(),P4=new Li;function KO(i){let e=i.firstChild,A=i.lastChild;return e&&e.toA)continue;if(o&&r.from=e&&l.to>A&&(o=l)}}return o}function DcA(i){let e=i.lastChild;return e&&e.to==i.to&&e.type.isError}function zB(i,e,A){for(let t of i.facet(H9)){let n=t(i,e,A);if(n)return n}return wcA(i,e,A)}function UO(i,e){let A=e.mapPos(i.from,1),t=e.mapPos(i.to,-1);return A>=t?void 0:{from:A,to:t}}var qB=$i.define({map:UO}),j4=$i.define({map:UO});function TO(i){let e=[];for(let{head:A}of i.state.selection.ranges)e.some(t=>t.from<=A&&t.to>=A)||e.push(i.lineBlockAt(A));return e}var II=ba.define({create(){return kt.none},update(i,e){e.isUserEvent("delete")&&e.changes.iterChangedRanges((A,t)=>i=SO(i,A,t)),i=i.map(e.changes);for(let A of e.effects)if(A.is(qB)&&!ycA(i,A.value.from,A.value.to)){let{preparePlaceholder:t}=e.state.facet(j9),n=t?kt.replace({widget:new L9(t(e.state,A.value))}):kO;i=i.update({add:[n.range(A.value.from,A.value.to)]})}else A.is(j4)&&(i=i.update({filter:(t,n)=>A.value.from!=t||A.value.to!=n,filterFrom:A.value.from,filterTo:A.value.to}));return e.selection&&(i=SO(i,e.selection.main.head)),i},provide:i=>Ii.decorations.from(i),toJSON(i,e){let A=[];return i.between(0,e.doc.length,(t,n)=>{A.push(t,n)}),A},fromJSON(i){if(!Array.isArray(i)||i.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let A=0;A{ne&&(t=!0)}),t?i.update({filterFrom:e,filterTo:A,filter:(n,o)=>n>=A||o<=e}):i}function P6(i,e,A){var t;let n=null;return(t=i.field(II,!1))===null||t===void 0||t.between(e,A,(o,a)=>{(!n||n.from>o)&&(n={from:o,to:a})}),n}function ycA(i,e,A){let t=!1;return i.between(e,e,(n,o)=>{n==e&&o==A&&(t=!0)}),t}function JO(i,e){return i.field(II,!1)?e:e.concat($i.appendConfig.of(HO()))}var vcA=i=>{for(let e of TO(i)){let A=zB(i.state,e.from,e.to);if(A)return i.dispatch({effects:JO(i.state,[qB.of(A),YO(i,A)])}),!0}return!1},z9=i=>{if(!i.state.field(II,!1))return!1;let e=[];for(let A of TO(i)){let t=P6(i.state,A.from,A.to);t&&e.push(j4.of(t),YO(i,t,!1))}return e.length&&i.dispatch({effects:e}),e.length>0};function YO(i,e,A=!0){let t=i.state.doc.lineAt(e.from).number,n=i.state.doc.lineAt(e.to).number;return Ii.announce.of(`${i.state.phrase(A?"Folded lines":"Unfolded lines")} ${t} ${i.state.phrase("to")} ${n}.`)}var bcA=i=>{let{state:e}=i,A=[];for(let t=0;t{let e=i.state.field(II,!1);if(!e||!e.size)return!1;let A=[];return e.between(0,i.state.doc.length,(t,n)=>{A.push(j4.of({from:t,to:n}))}),i.dispatch({effects:A}),!0};var OO=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:vcA},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:z9},{key:"Ctrl-Alt-[",run:bcA},{key:"Ctrl-Alt-]",run:P9}],McA={placeholderDOM:null,preparePlaceholder:null,placeholderText:"\u2026"},j9=tt.define({combine(i){return Dr(i,McA)}});function HO(i){let e=[II,kcA];return i&&e.push(j9.of(i)),e}function zO(i,e){let{state:A}=i,t=A.facet(j9),n=a=>{let r=i.lineBlockAt(i.posAtDOM(a.target)),s=P6(i.state,r.from,r.to);s&&i.dispatch({effects:j4.of(s)}),a.preventDefault()};if(t.placeholderDOM)return t.placeholderDOM(i,n,e);let o=document.createElement("span");return o.textContent=t.placeholderText,o.setAttribute("aria-label",A.phrase("folded code")),o.title=A.phrase("unfold"),o.className="cm-foldPlaceholder",o.onclick=n,o}var kO=kt.replace({widget:new class extends Zs{toDOM(i){return zO(i,null)}}}),L9=class extends Zs{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return zO(e,this.value)}},ScA={openText:"\u2304",closedText:"\u203A",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1},H4=class extends $s{constructor(e,A){super(),this.config=e,this.open=A}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let A=document.createElement("span");return A.textContent=this.open?this.config.openText:this.config.closedText,A.title=e.state.phrase(this.open?"Fold line":"Unfold line"),A}};function PO(i={}){let e=oA(oA({},ScA),i),A=new H4(e,!0),t=new H4(e,!1),n=No.fromClass(class{constructor(a){this.from=a.viewport.from,this.markers=this.buildMarkers(a)}update(a){(a.docChanged||a.viewportChanged||a.startState.facet(B2)!=a.state.facet(B2)||a.startState.field(II,!1)!=a.state.field(II,!1)||vr(a.startState)!=vr(a.state)||e.foldingChanged(a))&&(this.markers=this.buildMarkers(a.view))}buildMarkers(a){let r=new Yr;for(let s of a.viewportLineBlocks){let l=P6(a.state,s.from,s.to)?t:zB(a.state,s.from,s.to)?A:null;l&&r.add(s.from,s.from,l)}return r.finish()}}),{domEventHandlers:o}=e;return[n,F6({class:"cm-foldGutter",markers(a){var r;return((r=a.plugin(n))===null||r===void 0?void 0:r.markers)||oo.empty},initialSpacer(){return new H4(e,!1)},domEventHandlers:Oe(oA({},o),{click:(a,r,s)=>{if(o.click&&o.click(a,r,s))return!0;let l=P6(a.state,r.from,r.to);if(l)return a.dispatch({effects:j4.of(l)}),!0;let g=zB(a.state,r.from,r.to);return g?(a.dispatch({effects:qB.of(g)}),!0):!1}})}),HO()]}var kcA=Ii.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}}),PB=class i{constructor(e,A){this.specs=e;let t;function n(r){let s=Ag.newName();return(t||(t=Object.create(null)))["."+s]=r,s}let o=typeof A.all=="string"?A.all:A.all?n(A.all):void 0,a=A.scope;this.scope=a instanceof Wg?r=>r.prop(HB)==a.data:a?r=>r==a:void 0,this.style=M9(e.map(r=>({tag:r.tag,class:r.class||n(Object.assign({},r,{tag:null}))})),{all:o}).style,this.module=t?new Ag(t):null,this.themeType=A.themeType}static define(e,A){return new i(e,A||{})}},G9=tt.define(),jO=tt.define({combine(i){return i.length?[i[0]]:null}});function _9(i){let e=i.facet(G9);return e.length?e:i.facet(jO)}function q9(i,e){let A=[_cA],t;return i instanceof PB&&(i.module&&A.push(Ii.styleModule.of(i.module)),t=i.themeType),e?.fallback?A.push(jO.of(i)):t?A.push(G9.computeN([Ii.darkTheme],n=>n.facet(Ii.darkTheme)==(t=="dark")?[i]:[])):A.push(G9.of(i)),A}var K9=class{constructor(e){this.markCache=Object.create(null),this.tree=vr(e.state),this.decorations=this.buildDeco(e,_9(e.state)),this.decoratedTo=e.viewport.to}update(e){let A=vr(e.state),t=_9(e.state),n=t!=_9(e.startState),{viewport:o}=e.view,a=e.changes.mapPos(this.decoratedTo,1);A.length=o.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=a):(A!=this.tree||e.viewportChanged||n)&&(this.tree=A,this.decorations=this.buildDeco(e.view,t),this.decoratedTo=o.to)}buildDeco(e,A){if(!A||!this.tree.length)return kt.none;let t=new Yr;for(let{from:n,to:o}of e.visibleRanges)vO(this.tree,A,(a,r,s)=>{t.add(a,r,this.markCache[s]||(this.markCache[s]=kt.mark({class:s})))},n,o);return t.finish()}},_cA=zg.high(No.fromClass(K9,{decorations:i=>i.decorations})),qO=PB.define([{tag:Ke.meta,color:"#404740"},{tag:Ke.link,textDecoration:"underline"},{tag:Ke.heading,textDecoration:"underline",fontWeight:"bold"},{tag:Ke.emphasis,fontStyle:"italic"},{tag:Ke.strong,fontWeight:"bold"},{tag:Ke.strikethrough,textDecoration:"line-through"},{tag:Ke.keyword,color:"#708"},{tag:[Ke.atom,Ke.bool,Ke.url,Ke.contentSeparator,Ke.labelName],color:"#219"},{tag:[Ke.literal,Ke.inserted],color:"#164"},{tag:[Ke.string,Ke.deleted],color:"#a11"},{tag:[Ke.regexp,Ke.escape,Ke.special(Ke.string)],color:"#e40"},{tag:Ke.definition(Ke.variableName),color:"#00f"},{tag:Ke.local(Ke.variableName),color:"#30a"},{tag:[Ke.typeName,Ke.namespace],color:"#085"},{tag:Ke.className,color:"#167"},{tag:[Ke.special(Ke.variableName),Ke.macroName],color:"#256"},{tag:Ke.definition(Ke.propertyName),color:"#00c"},{tag:Ke.comment,color:"#940"},{tag:Ke.invalid,color:"#f00"}]),xcA=Ii.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),VO=1e4,WO="()[]{}",ZO=tt.define({combine(i){return Dr(i,{afterCursor:!0,brackets:WO,maxScanDistance:VO,renderMatch:FcA})}}),RcA=kt.mark({class:"cm-matchingBracket"}),NcA=kt.mark({class:"cm-nonmatchingBracket"});function FcA(i){let e=[],A=i.matched?RcA:NcA;return e.push(A.range(i.start.from,i.start.to)),i.end&&e.push(A.range(i.end.from,i.end.to)),e}function _O(i){let e=[],A=i.facet(ZO);for(let t of i.selection.ranges){if(!t.empty)continue;let n=Zg(i,t.head,-1,A)||t.head>0&&Zg(i,t.head-1,1,A)||A.afterCursor&&(Zg(i,t.head,1,A)||t.headi.decorations}),GcA=[LcA,xcA];function XO(i={}){return[ZO.of(i),GcA]}var KcA=new Li;function U9(i,e,A){let t=i.prop(e<0?Li.openedBy:Li.closedBy);if(t)return t;if(i.name.length==1){let n=A.indexOf(i.name);if(n>-1&&n%2==(e<0?1:0))return[A[n+e]]}return null}function T9(i){let e=i.type.prop(KcA);return e?e(i.node):i}function Zg(i,e,A,t={}){let n=t.maxScanDistance||VO,o=t.brackets||WO,a=vr(i),r=a.resolveInner(e,A);for(let s=r;s;s=s.parent){let l=U9(s.type,A,o);if(l&&s.from0?e>=g.from&&eg.from&&e<=g.to))return UcA(i,e,A,s,g,l,o)}}return TcA(i,e,A,a,r.type,n,o)}function UcA(i,e,A,t,n,o,a){let r=t.parent,s={from:n.from,to:n.to},l=0,g=r?.cursor();if(g&&(A<0?g.childBefore(t.from):g.childAfter(t.to)))do if(A<0?g.to<=t.from:g.from>=t.to){if(l==0&&o.indexOf(g.type.name)>-1&&g.from0)return null;let l={from:A<0?e-1:e,to:A>0?e+1:e},g=i.doc.iterRange(e,A>0?i.doc.length:0),C=0;for(let I=0;!g.next().done&&I<=o;){let B=g.value;A<0&&(I+=B.length);let Q=e+I*A;for(let h=A>0?0:B.length-1,f=A>0?B.length:-1;h!=f;h+=A){let m=a.indexOf(B[h]);if(!(m<0||t.resolveInner(Q+h,1).type!=n))if(m%2==0==A>0)C++;else{if(C==1)return{start:l,end:{from:Q+h,to:Q+h+1},matched:m>>1==s>>1};C--}}A>0&&(I+=B.length)}return g.done?{start:l,matched:!1}:null}var JcA=Object.create(null),xO=[Cs.none];var RO=[],NO=Object.create(null),YcA=Object.create(null);for(let[i,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])YcA[i]=OcA(JcA,e);function x9(i,e){RO.indexOf(i)>-1||(RO.push(i),console.warn(e))}function OcA(i,e){let A=[];for(let r of e.split(" ")){let s=[];for(let l of r.split(".")){let g=i[l]||Ke[l];g?typeof g=="function"?s.length?s=s.map(g):x9(l,`Modifier ${l} used at start of tag`):s.length?x9(l,`Tag ${l} used as modifier`):s=Array.isArray(g)?g:[g]:x9(l,`Unknown highlighting tag ${l}`)}for(let l of s)A.push(l)}if(!A.length)return 0;let t=e.replace(/ /g,"_"),n=t+" "+A.map(r=>r.id),o=NO[n];if(o)return o.id;let a=NO[n]=Cs.define({id:xO.length,name:t,props:[O6({[t]:A})]});return xO.push(a),a.id}var rZA={rtl:kt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:wo.RTL}),ltr:kt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:wo.LTR}),auto:kt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var HcA=i=>{let{state:e}=i,A=e.doc.lineAt(e.selection.main.from),t=X9(i.state,A.from);return t.line?zcA(i):t.block?jcA(i):!1};function Z9(i,e){return({state:A,dispatch:t})=>{if(A.readOnly)return!1;let n=i(e,A);return n?(t(A.update(n)),!0):!1}}var zcA=Z9(WcA,0);var PcA=Z9(rH,0);var jcA=Z9((i,e)=>rH(i,e,VcA(e)),0);function X9(i,e){let A=i.languageDataAt("commentTokens",e,1);return A.length?A[0]:{}}var q4=50;function qcA(i,{open:e,close:A},t,n){let o=i.sliceDoc(t-q4,t),a=i.sliceDoc(n,n+q4),r=/\s*$/.exec(o)[0].length,s=/^\s*/.exec(a)[0].length,l=o.length-r;if(o.slice(l-e.length,l)==e&&a.slice(s,s+A.length)==A)return{open:{pos:t-r,margin:r&&1},close:{pos:n+s,margin:s&&1}};let g,C;n-t<=2*q4?g=C=i.sliceDoc(t,n):(g=i.sliceDoc(t,t+q4),C=i.sliceDoc(n-q4,n));let I=/^\s*/.exec(g)[0].length,B=/\s*$/.exec(C)[0].length,Q=C.length-B-A.length;return g.slice(I,I+e.length)==e&&C.slice(Q,Q+A.length)==A?{open:{pos:t+I+e.length,margin:/\s/.test(g.charAt(I+e.length))?1:0},close:{pos:n-B-A.length,margin:/\s/.test(C.charAt(Q-1))?1:0}}:null}function VcA(i){let e=[];for(let A of i.selection.ranges){let t=i.doc.lineAt(A.from),n=A.to<=t.to?t:i.doc.lineAt(A.to);n.from>t.from&&n.from==A.to&&(n=A.to==t.to+1?t:i.doc.lineAt(A.to-1));let o=e.length-1;o>=0&&e[o].to>t.from?e[o].to=n.to:e.push({from:t.from+/^\s*/.exec(t.text)[0].length,to:n.to})}return e}function rH(i,e,A=e.selection.ranges){let t=A.map(o=>X9(e,o.from).block);if(!t.every(o=>o))return null;let n=A.map((o,a)=>qcA(e,t[a],o.from,o.to));if(i!=2&&!n.every(o=>o))return{changes:e.changes(A.map((o,a)=>n[a]?[]:[{from:o.from,insert:t[a].open+" "},{from:o.to,insert:" "+t[a].close}]))};if(i!=1&&n.some(o=>o)){let o=[];for(let a=0,r;an&&(o==a||a>C.from)){n=C.from;let I=/^\s*/.exec(C.text)[0].length,B=I==C.length,Q=C.text.slice(I,I+l.length)==l?I:-1;Io.comment<0&&(!o.empty||o.single))){let o=[];for(let{line:r,token:s,indent:l,empty:g,single:C}of t)(C||!g)&&o.push({from:r.from+l,insert:s+" "});let a=e.changes(o);return{changes:a,selection:e.selection.map(a,1)}}else if(i!=1&&t.some(o=>o.comment>=0)){let o=[];for(let{line:a,comment:r,token:s}of t)if(r>=0){let l=a.from+r,g=l+s.length;a.text[g-a.from]==" "&&g++,o.push({from:l,to:g})}return{changes:o}}return null}function VB(i,e){return Ce.create(i.ranges.map(e),i.mainIndex)}function $g(i,e){return i.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function Ac({state:i,dispatch:e},A){let t=VB(i.selection,A);return t.eq(i.selection,!0)?!1:(e($g(i,t)),!0)}function V6(i,e){return Ce.cursor(e?i.to:i.from)}function sH(i,e){return Ac(i,A=>A.empty?i.moveByChar(A,e):V6(A,e))}function Is(i){return i.textDirectionAt(i.state.selection.main.head)==wo.LTR}var lH=i=>sH(i,!Is(i)),gH=i=>sH(i,Is(i));function cH(i,e){return Ac(i,A=>A.empty?i.moveByGroup(A,e):V6(A,e))}var ZcA=i=>cH(i,!Is(i)),XcA=i=>cH(i,Is(i));var QZA=typeof Intl<"u"&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null;function $cA(i,e,A){if(e.type.prop(A))return!0;let t=e.to-e.from;return t&&(t>2||/[^\s,.;:]/.test(i.sliceDoc(e.from,e.to)))||e.firstChild}function W6(i,e,A){let t=vr(i).resolveInner(e.head),n=A?Li.closedBy:Li.openedBy;for(let s=e.head;;){let l=A?t.childAfter(s):t.childBefore(s);if(!l)break;$cA(i,l,n)?t=l:s=A?l.to:l.from}let o=t.type.prop(n),a,r;return o&&(a=A?Zg(i,t.from,1):Zg(i,t.to,-1))&&a.matched?r=A?a.end.to:a.end.from:r=A?t.to:t.from,Ce.cursor(r,A?-1:1)}var A0A=i=>Ac(i,e=>W6(i.state,e,!Is(i))),e0A=i=>Ac(i,e=>W6(i.state,e,Is(i)));function CH(i,e){return Ac(i,A=>{if(!A.empty)return V6(A,e);let t=i.moveVertically(A,e);return t.head!=A.head?t:i.moveToLineBoundary(A,e)})}var IH=i=>CH(i,!1),dH=i=>CH(i,!0);function BH(i){let e=i.scrollDOM.clientHeighta.empty?i.moveVertically(a,e,A.height):V6(a,e));if(n.eq(t.selection))return!1;let o;if(A.selfScroll){let a=i.coordsAtPos(t.selection.main.head),r=i.scrollDOM.getBoundingClientRect(),s=r.top+A.marginTop,l=r.bottom-A.marginBottom;a&&a.top>s&&a.bottomEH(i,!1),V9=i=>EH(i,!0);function E2(i,e,A){let t=i.lineBlockAt(e.head),n=i.moveToLineBoundary(e,A);if(n.head==e.head&&n.head!=(A?t.to:t.from)&&(n=i.moveToLineBoundary(e,A,!1)),!A&&n.head==t.from&&t.length){let o=/^\s*/.exec(i.state.sliceDoc(t.from,Math.min(t.from+100,t.to)))[0].length;o&&e.head!=t.from+o&&(n=Ce.cursor(t.from+o))}return n}var t0A=i=>Ac(i,e=>E2(i,e,!0)),i0A=i=>Ac(i,e=>E2(i,e,!1)),n0A=i=>Ac(i,e=>E2(i,e,!Is(i))),o0A=i=>Ac(i,e=>E2(i,e,Is(i))),a0A=i=>Ac(i,e=>Ce.cursor(i.lineBlockAt(e.head).from,1)),r0A=i=>Ac(i,e=>Ce.cursor(i.lineBlockAt(e.head).to,-1));function s0A(i,e,A){let t=!1,n=VB(i.selection,o=>{let a=Zg(i,o.head,-1)||Zg(i,o.head,1)||o.head>0&&Zg(i,o.head-1,1)||o.heads0A(i,e,!1);function ng(i,e){let A=VB(i.state.selection,t=>{let n=e(t);return Ce.range(t.anchor,n.head,n.goalColumn,n.bidiLevel||void 0,n.assoc)});return A.eq(i.state.selection)?!1:(i.dispatch($g(i.state,A)),!0)}function hH(i,e){return ng(i,A=>i.moveByChar(A,e))}var QH=i=>hH(i,!Is(i)),uH=i=>hH(i,Is(i));function pH(i,e){return ng(i,A=>i.moveByGroup(A,e))}var g0A=i=>pH(i,!Is(i)),c0A=i=>pH(i,Is(i));var C0A=i=>ng(i,e=>W6(i.state,e,!Is(i))),I0A=i=>ng(i,e=>W6(i.state,e,Is(i)));function fH(i,e){return ng(i,A=>i.moveVertically(A,e))}var mH=i=>fH(i,!1),wH=i=>fH(i,!0);function DH(i,e){return ng(i,A=>i.moveVertically(A,e,BH(i).height))}var AH=i=>DH(i,!1),eH=i=>DH(i,!0),d0A=i=>ng(i,e=>E2(i,e,!0)),B0A=i=>ng(i,e=>E2(i,e,!1)),E0A=i=>ng(i,e=>E2(i,e,!Is(i))),h0A=i=>ng(i,e=>E2(i,e,Is(i))),Q0A=i=>ng(i,e=>Ce.cursor(i.lineBlockAt(e.head).from)),u0A=i=>ng(i,e=>Ce.cursor(i.lineBlockAt(e.head).to)),tH=({state:i,dispatch:e})=>(e($g(i,{anchor:0})),!0),iH=({state:i,dispatch:e})=>(e($g(i,{anchor:i.doc.length})),!0),nH=({state:i,dispatch:e})=>(e($g(i,{anchor:i.selection.main.anchor,head:0})),!0),oH=({state:i,dispatch:e})=>(e($g(i,{anchor:i.selection.main.anchor,head:i.doc.length})),!0),p0A=({state:i,dispatch:e})=>(e(i.update({selection:{anchor:0,head:i.doc.length},userEvent:"select"})),!0),f0A=({state:i,dispatch:e})=>{let A=Z6(i).map(({from:t,to:n})=>Ce.range(t,Math.min(n+1,i.doc.length)));return e(i.update({selection:Ce.create(A),userEvent:"select"})),!0},m0A=({state:i,dispatch:e})=>{let A=VB(i.selection,t=>{let n=vr(i),o=n.resolveStack(t.from,1);if(t.empty){let a=n.resolveStack(t.from,-1);a.node.from>=o.node.from&&a.node.to<=o.node.to&&(o=a)}for(let a=o;a;a=a.next){let{node:r}=a;if((r.from=t.to||r.to>t.to&&r.from<=t.from)&&a.next)return Ce.range(r.to,r.from)}return t});return A.eq(i.selection)?!1:(e($g(i,A)),!0)};function yH(i,e){let{state:A}=i,t=A.selection,n=A.selection.ranges.slice();for(let o of A.selection.ranges){let a=A.doc.lineAt(o.head);if(e?a.to0)for(let r=o;;){let s=i.moveVertically(r,e);if(s.heada.to){n.some(l=>l.head==s.head)||n.push(s);break}else{if(s.head==r.head)break;r=s}}}return n.length==t.ranges.length?!1:(i.dispatch($g(A,Ce.create(n,n.length-1))),!0)}var w0A=i=>yH(i,!1),D0A=i=>yH(i,!0),y0A=({state:i,dispatch:e})=>{let A=i.selection,t=null;return A.ranges.length>1?t=Ce.create([A.main]):A.main.empty||(t=Ce.create([Ce.cursor(A.main.head)])),t?(e($g(i,t)),!0):!1};function V4(i,e){if(i.state.readOnly)return!1;let A="delete.selection",{state:t}=i,n=t.changeByRange(o=>{let{from:a,to:r}=o;if(a==r){let s=e(o);sa&&(A="delete.forward",s=q6(i,s,!0)),a=Math.min(a,s),r=Math.max(r,s)}else a=q6(i,a,!1),r=q6(i,r,!0);return a==r?{range:o}:{changes:{from:a,to:r},range:Ce.cursor(a,an(i)))t.between(e,e,(n,o)=>{ne&&(e=A?o:n)});return e}var vH=(i,e,A)=>V4(i,t=>{let n=t.from,{state:o}=i,a=o.doc.lineAt(n),r,s;if(A&&!e&&n>a.from&&nvH(i,!1,!0);var bH=i=>vH(i,!0,!1),MH=(i,e)=>V4(i,A=>{let t=A.head,{state:n}=i,o=n.doc.lineAt(t),a=n.charCategorizer(t);for(let r=null;;){if(t==(e?o.to:o.from)){t==A.head&&o.number!=(e?n.doc.lines:1)&&(t+=e?1:-1);break}let s=za(o.text,t-o.from,e)+o.from,l=o.text.slice(Math.min(t,s)-o.from,Math.max(t,s)-o.from),g=a(l);if(r!=null&&g!=r)break;(l!=" "||t!=A.head)&&(r=g),t=s}return t}),SH=i=>MH(i,!1),v0A=i=>MH(i,!0);var b0A=i=>V4(i,e=>{let A=i.lineBlockAt(e.head).to;return e.headV4(i,e=>{let A=i.moveToLineBoundary(e,!1).head;return e.head>A?A:Math.max(0,e.head-1)}),S0A=i=>V4(i,e=>{let A=i.moveToLineBoundary(e,!0).head;return e.head{if(i.readOnly)return!1;let A=i.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:Mn.of(["",""])},range:Ce.cursor(t.from)}));return e(i.update(A,{scrollIntoView:!0,userEvent:"input"})),!0},_0A=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let A=i.changeByRange(t=>{if(!t.empty||t.from==0||t.from==i.doc.length)return{range:t};let n=t.from,o=i.doc.lineAt(n),a=n==o.from?n-1:za(o.text,n-o.from,!1)+o.from,r=n==o.to?n+1:za(o.text,n-o.from,!0)+o.from;return{changes:{from:a,to:r,insert:i.doc.slice(n,r).append(i.doc.slice(a,n))},range:Ce.cursor(r)}});return A.changes.empty?!1:(e(i.update(A,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function Z6(i){let e=[],A=-1;for(let t of i.selection.ranges){let n=i.doc.lineAt(t.from),o=i.doc.lineAt(t.to);if(!t.empty&&t.to==o.from&&(o=i.doc.lineAt(t.to-1)),A>=n.number){let a=e[e.length-1];a.to=o.to,a.ranges.push(t)}else e.push({from:n.from,to:o.to,ranges:[t]});A=o.number+1}return e}function kH(i,e,A){if(i.readOnly)return!1;let t=[],n=[];for(let o of Z6(i)){if(A?o.to==i.doc.length:o.from==0)continue;let a=i.doc.lineAt(A?o.to+1:o.from-1),r=a.length+1;if(A){t.push({from:o.to,to:a.to},{from:o.from,insert:a.text+i.lineBreak});for(let s of o.ranges)n.push(Ce.range(Math.min(i.doc.length,s.anchor+r),Math.min(i.doc.length,s.head+r)))}else{t.push({from:a.from,to:o.from},{from:o.to,insert:i.lineBreak+a.text});for(let s of o.ranges)n.push(Ce.range(s.anchor-r,s.head-r))}}return t.length?(e(i.update({changes:t,scrollIntoView:!0,selection:Ce.create(n,i.selection.mainIndex),userEvent:"move.line"})),!0):!1}var x0A=({state:i,dispatch:e})=>kH(i,e,!1),R0A=({state:i,dispatch:e})=>kH(i,e,!0);function _H(i,e,A){if(i.readOnly)return!1;let t=[];for(let o of Z6(i))A?t.push({from:o.from,insert:i.doc.slice(o.from,o.to)+i.lineBreak}):t.push({from:o.to,insert:i.lineBreak+i.doc.slice(o.from,o.to)});let n=i.changes(t);return e(i.update({changes:n,selection:i.selection.map(n,A?1:-1),scrollIntoView:!0,userEvent:"input.copyline"})),!0}var N0A=({state:i,dispatch:e})=>_H(i,e,!1),F0A=({state:i,dispatch:e})=>_H(i,e,!0),L0A=i=>{if(i.state.readOnly)return!1;let{state:e}=i,A=e.changes(Z6(e).map(({from:n,to:o})=>(n>0?n--:o{let o;if(i.lineWrapping){let a=i.lineBlockAt(n.head),r=i.coordsAtPos(n.head,n.assoc||1);r&&(o=a.bottom+i.documentTop-r.bottom+i.defaultLineHeight/2)}return i.moveVertically(n,!0,o)}).map(A);return i.dispatch({changes:A,selection:t,scrollIntoView:!0,userEvent:"delete.line"}),!0};function G0A(i,e){if(/\(\)|\[\]|\{\}/.test(i.sliceDoc(e-1,e+1)))return{from:e,to:e};let A=vr(i).resolveInner(e),t=A.childBefore(e),n=A.childAfter(e),o;return t&&n&&t.to<=e&&n.from>=e&&(o=t.type.prop(Li.closedBy))&&o.indexOf(n.name)>-1&&i.doc.lineAt(t.to).from==i.doc.lineAt(n.from).from&&!/\S/.test(i.sliceDoc(t.to,n.from))?{from:t.to,to:n.from}:null}var aH=xH(!1),K0A=xH(!0);function xH(i){return({state:e,dispatch:A})=>{if(e.readOnly)return!1;let t=e.changeByRange(n=>{let{from:o,to:a}=n,r=e.doc.lineAt(o),s=!i&&o==a&&G0A(e,o);i&&(o=a=(a<=r.to?r:e.doc.lineAt(a)).to);let l=new CI(e,{simulateBreak:o,simulateDoubleBreak:!!s}),g=j6(l,o);for(g==null&&(g=z0(/^\s*/.exec(e.doc.lineAt(o).text)[0],e.tabSize));ar.from&&o{let n=[];for(let a=t.from;a<=t.to;){let r=i.doc.lineAt(a);r.number>A&&(t.empty||t.to>r.from)&&(e(r,n,t),A=r.number),a=r.to+1}let o=i.changes(n);return{changes:n,range:Ce.range(o.mapPos(t.anchor,1),o.mapPos(t.head,1))}})}var U0A=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let A=Object.create(null),t=new CI(i,{overrideIndentation:o=>{let a=A[o];return a??-1}}),n=$9(i,(o,a,r)=>{let s=j6(t,o.from);if(s==null)return;/\S/.test(o.text)||(s=0);let l=/^\s*/.exec(o.text)[0],g=jB(i,s);(l!=g||r.fromi.readOnly?!1:(e(i.update($9(i,(A,t)=>{t.push({from:A.from,insert:i.facet(dI)})}),{userEvent:"input.indent"})),!0),NH=({state:i,dispatch:e})=>i.readOnly?!1:(e(i.update($9(i,(A,t)=>{let n=/^\s*/.exec(A.text)[0];if(!n)return;let o=z0(n,i.tabSize),a=0,r=jB(i,Math.max(0,o-Xg(i)));for(;a(i.setTabFocusMode(),!0);var J0A=[{key:"Ctrl-b",run:lH,shift:QH,preventDefault:!0},{key:"Ctrl-f",run:gH,shift:uH},{key:"Ctrl-p",run:IH,shift:mH},{key:"Ctrl-n",run:dH,shift:wH},{key:"Ctrl-a",run:a0A,shift:Q0A},{key:"Ctrl-e",run:r0A,shift:u0A},{key:"Ctrl-d",run:bH},{key:"Ctrl-h",run:W9},{key:"Ctrl-k",run:b0A},{key:"Ctrl-Alt-h",run:SH},{key:"Ctrl-o",run:k0A},{key:"Ctrl-t",run:_0A},{key:"Ctrl-v",run:V9}],Y0A=[{key:"ArrowLeft",run:lH,shift:QH,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:ZcA,shift:g0A,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:n0A,shift:E0A,preventDefault:!0},{key:"ArrowRight",run:gH,shift:uH,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:XcA,shift:c0A,preventDefault:!0},{mac:"Cmd-ArrowRight",run:o0A,shift:h0A,preventDefault:!0},{key:"ArrowUp",run:IH,shift:mH,preventDefault:!0},{mac:"Cmd-ArrowUp",run:tH,shift:nH},{mac:"Ctrl-ArrowUp",run:$O,shift:AH},{key:"ArrowDown",run:dH,shift:wH,preventDefault:!0},{mac:"Cmd-ArrowDown",run:iH,shift:oH},{mac:"Ctrl-ArrowDown",run:V9,shift:eH},{key:"PageUp",run:$O,shift:AH},{key:"PageDown",run:V9,shift:eH},{key:"Home",run:i0A,shift:B0A,preventDefault:!0},{key:"Mod-Home",run:tH,shift:nH},{key:"End",run:t0A,shift:d0A,preventDefault:!0},{key:"Mod-End",run:iH,shift:oH},{key:"Enter",run:aH,shift:aH},{key:"Mod-a",run:p0A},{key:"Backspace",run:W9,shift:W9,preventDefault:!0},{key:"Delete",run:bH,preventDefault:!0},{key:"Mod-Backspace",mac:"Alt-Backspace",run:SH,preventDefault:!0},{key:"Mod-Delete",mac:"Alt-Delete",run:v0A,preventDefault:!0},{mac:"Mod-Backspace",run:M0A,preventDefault:!0},{mac:"Mod-Delete",run:S0A,preventDefault:!0}].concat(J0A.map(i=>({mac:i.key,run:i.run,shift:i.shift}))),FH=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:A0A,shift:C0A},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:e0A,shift:I0A},{key:"Alt-ArrowUp",run:x0A},{key:"Shift-Alt-ArrowUp",run:N0A},{key:"Alt-ArrowDown",run:R0A},{key:"Shift-Alt-ArrowDown",run:F0A},{key:"Mod-Alt-ArrowUp",run:w0A},{key:"Mod-Alt-ArrowDown",run:D0A},{key:"Escape",run:y0A},{key:"Mod-Enter",run:K0A},{key:"Alt-l",mac:"Ctrl-l",run:f0A},{key:"Mod-i",run:m0A,preventDefault:!0},{key:"Mod-[",run:NH},{key:"Mod-]",run:RH},{key:"Mod-Alt-\\",run:U0A},{key:"Shift-Mod-k",run:L0A},{key:"Shift-Mod-\\",run:l0A},{key:"Mod-/",run:HcA},{key:"Alt-A",run:PcA},{key:"Ctrl-m",mac:"Shift-Alt-m",run:T0A}].concat(Y0A),LH={key:"Tab",run:RH,shift:NH};var A8=class{constructor(e,A,t){this.from=e,this.to=A,this.diagnostic=t}},BI=class i{constructor(e,A,t){this.diagnostics=e,this.panel=A,this.selected=t}static init(e,A,t){let n=t.facet(n0).markerFilter;n&&(e=n(e,t));let o=e.slice().sort((B,Q)=>B.from-Q.from||B.to-Q.to),a=new Yr,r=[],s=0,l=t.doc.iter(),g=0,C=t.doc.length;for(let B=0;;){let Q=B==o.length?null:o[B];if(!Q&&!r.length)break;let h,f;if(r.length)h=s,f=r.reduce((S,k)=>Math.min(S,k.to),Q&&Q.from>h?Q.from:1e8);else{if(h=Q.from,h>C)break;f=Q.to,r.push(Q),B++}for(;BS.from||S.to==h))r.push(S),B++,f=Math.min(S.to,f);else{f=Math.min(S.from,f);break}}f=Math.min(f,C);let m=!1;if(r.some(S=>S.from==h&&(S.to==f||f==C))&&(m=h==f,!m&&f-h<10)){let S=h-(g+l.value.length);S>0&&(l.next(S),g=h);for(let k=h;;){if(k>=f){m=!0;break}if(!l.lineBreak&&g+l.value.length>k)break;k=g+l.value.length,g+=l.value.length,l.next()}}let v=jH(r);if(m)a.add(h,h,kt.widget({widget:new AS(v),diagnostics:r.slice()}));else{let S=r.reduce((k,M)=>M.markClass?k+" "+M.markClass:k,"");a.add(h,f,kt.mark({class:"cm-lintRange cm-lintRange-"+v+S,diagnostics:r.slice(),inclusiveEnd:r.some(k=>k.to>f)}))}if(s=f,s==C)break;for(let S=0;S{if(!(e&&a.diagnostics.indexOf(e)<0))if(!t)t=new A8(n,o,e||a.diagnostics[0]);else{if(a.diagnostics.indexOf(t.diagnostic)<0)return!1;t=new A8(t.from,o,t.diagnostic)}}),t}function UH(i,e){let A=e.pos,t=e.end||A,n=i.state.facet(n0).hideOn(i,A,t);if(n!=null)return n;let o=i.startState.doc.lineAt(e.pos);return!!(i.effects.some(a=>a.is(i8))||i.changes.touchesRange(o.from,Math.max(o.to,t)))}function TH(i,e){return i.field(ml,!1)?e:e.concat($i.appendConfig.of(VH))}function O0A(i,e){return{effects:TH(i,[i8.of(e)])}}var i8=$i.define(),tS=$i.define(),JH=$i.define(),ml=ba.define({create(){return new BI(kt.none,null,null)},update(i,e){if(e.docChanged&&i.diagnostics.size){let A=i.diagnostics.map(e.changes),t=null,n=i.panel;if(i.selected){let o=e.changes.mapPos(i.selected.from,1);t=h2(A,i.selected.diagnostic,o)||h2(A,null,o)}!A.size&&n&&e.state.facet(n0).autoPanel&&(n=null),i=new BI(A,n,t)}for(let A of e.effects)if(A.is(i8)){let t=e.state.facet(n0).autoPanel?A.value.length?W4.open:null:i.panel;i=BI.init(A.value,t,e.state)}else A.is(tS)?i=new BI(i.diagnostics,A.value?W4.open:null,i.selected):A.is(JH)&&(i=new BI(i.diagnostics,i.panel,A.value));return i},provide:i=>[rI.from(i,e=>e.panel),Ii.decorations.from(i,e=>e.diagnostics)]});var H0A=kt.mark({class:"cm-lintRange cm-lintRange-active"});function z0A(i,e,A){let{diagnostics:t}=i.state.field(ml),n,o=-1,a=-1;t.between(e-(A<0?1:0),e+(A>0?1:0),(s,l,{spec:g})=>{if(e>=s&&e<=l&&(s==l||(e>s||A>0)&&(ePH(i,A,!1)))}var P0A=i=>{let e=i.state.field(ml,!1);(!e||!e.panel)&&i.dispatch({effects:TH(i.state,[tS.of(!0)])});let A=L4(i,W4.open);return A&&A.dom.querySelector(".cm-panel-lint ul").focus(),!0},GH=i=>{let e=i.state.field(ml,!1);return!e||!e.panel?!1:(i.dispatch({effects:tS.of(!1)}),!0)},j0A=i=>{let e=i.state.field(ml,!1);if(!e)return!1;let A=i.state.selection.main,t=h2(e.diagnostics,null,A.to+1);return!t&&(t=h2(e.diagnostics,null,0),!t||t.from==A.from&&t.to==A.to)?!1:(i.dispatch({selection:{anchor:t.from,head:t.to},scrollIntoView:!0}),!0)};var OH=[{key:"Mod-Shift-m",run:P0A,preventDefault:!0},{key:"F8",run:j0A}],q0A=No.fromClass(class{constructor(i){this.view=i,this.timeout=-1,this.set=!0;let{delay:e}=i.state.facet(n0);this.lintTime=Date.now()+e,this.run=this.run.bind(this),this.timeout=setTimeout(this.run,e)}run(){clearTimeout(this.timeout);let i=Date.now();if(iPromise.resolve(t(this.view))),t=>{this.view.state.doc==e.doc&&this.view.dispatch(O0A(this.view.state,t.reduce((n,o)=>n.concat(o))))},t=>{yr(this.view.state,t)})}}update(i){let e=i.state.facet(n0);(i.docChanged||e!=i.startState.facet(n0)||e.needsRefresh&&e.needsRefresh(i))&&(this.lintTime=Date.now()+e.delay,this.set||(this.set=!0,this.timeout=setTimeout(this.run,e.delay)))}force(){this.set&&(this.lintTime=Date.now(),this.run())}destroy(){clearTimeout(this.timeout)}});function V0A(i,e,A){let t=[],n=-1;for(let o of i)o.then(a=>{t.push(a),clearTimeout(n),t.length==i.length?e(t):n=setTimeout(()=>e(t),200)},A)}var n0=tt.define({combine(i){return oA({sources:i.map(e=>e.source).filter(e=>e!=null)},Dr(i.map(e=>e.config),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{delay:Math.max,markerFilter:KH,tooltipFilter:KH,needsRefresh:(e,A)=>e?A?t=>e(t)||A(t):e:A,hideOn:(e,A)=>e?A?(t,n,o)=>e(t,n,o)||A(t,n,o):e:A,autoPanel:(e,A)=>e||A}))}});function KH(i,e){return i?e?(A,t)=>e(i(A,t),t):i:e}function HH(i,e={}){return[n0.of({source:i,config:e}),q0A,VH]}function zH(i){let e=[];if(i)A:for(let{name:A}of i){for(let t=0;to.toLowerCase()==n.toLowerCase())){e.push(n);continue A}}e.push("")}return e}function PH(i,e,A){var t;let n=A?zH(e.actions):[];return ao("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},ao("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage(i):e.message),(t=e.actions)===null||t===void 0?void 0:t.map((o,a)=>{let r=!1,s=B=>{if(B.preventDefault(),r)return;r=!0;let Q=h2(i.state.field(ml).diagnostics,e);Q&&o.apply(i,Q.from,Q.to)},{name:l}=o,g=n[a]?l.indexOf(n[a]):-1,C=g<0?l:[l.slice(0,g),ao("u",l.slice(g,g+1)),l.slice(g+1)],I=o.markClass?" "+o.markClass:"";return ao("button",{type:"button",class:"cm-diagnosticAction"+I,onclick:s,onmousedown:s,"aria-label":` Action: ${l}${g<0?"":` (access key "${n[a]})"`}.`},C)}),e.source&&ao("div",{class:"cm-diagnosticSource"},e.source))}var AS=class extends Zs{constructor(e){super(),this.sev=e}eq(e){return e.sev==this.sev}toDOM(){return ao("span",{class:"cm-lintPoint cm-lintPoint-"+this.sev})}},e8=class{constructor(e,A){this.diagnostic=A,this.id="item_"+Math.floor(Math.random()*4294967295).toString(16),this.dom=PH(e,A,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}},W4=class i{constructor(e){this.view=e,this.items=[];let A=n=>{if(!(n.ctrlKey||n.altKey||n.metaKey)){if(n.keyCode==27)GH(this.view),this.view.focus();else if(n.keyCode==38||n.keyCode==33)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(n.keyCode==40||n.keyCode==34)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(n.keyCode==36)this.moveSelection(0);else if(n.keyCode==35)this.moveSelection(this.items.length-1);else if(n.keyCode==13)this.view.focus();else if(n.keyCode>=65&&n.keyCode<=90&&this.selectedIndex>=0){let{diagnostic:o}=this.items[this.selectedIndex],a=zH(o.actions);for(let r=0;r{for(let o=0;oGH(this.view)},"\xD7")),this.update()}get selectedIndex(){let e=this.view.state.field(ml).selected;if(!e)return-1;for(let A=0;A{for(let g of l.diagnostics){if(a.has(g))continue;a.add(g);let C=-1,I;for(let B=t;Bt&&(this.items.splice(t,C-t),n=!0)),A&&I.diagnostic==A.diagnostic?I.dom.hasAttribute("aria-selected")||(I.dom.setAttribute("aria-selected","true"),o=I):I.dom.hasAttribute("aria-selected")&&I.dom.removeAttribute("aria-selected"),t++}});t({sel:o.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:r,panel:s})=>{let l=s.height/this.list.offsetHeight;r.tops.bottom&&(this.list.scrollTop+=(r.bottom-s.bottom)/l)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let e=this.list.firstChild;function A(){let t=e;e=t.nextSibling,t.remove()}for(let t of this.items)if(t.dom.parentNode==this.list){for(;e!=t.dom;)A();e=t.dom.nextSibling}else this.list.insertBefore(t.dom,e);for(;e;)A()}moveSelection(e){if(this.selectedIndex<0)return;let A=this.view.state.field(ml),t=h2(A.diagnostics,this.items[e].diagnostic);t&&this.view.dispatch({selection:{anchor:t.from,head:t.to},scrollIntoView:!0,effects:JH.of(t)})}static open(e){return new i(e)}};function $6(i,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(i)}')`}function X6(i){return $6(``,'width="6" height="3"')}var W0A=Ii.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:X6("#d11")},".cm-lintRange-warning":{backgroundImage:X6("orange")},".cm-lintRange-info":{backgroundImage:X6("#999")},".cm-lintRange-hint":{backgroundImage:X6("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}},"&dark .cm-lintRange-active":{backgroundColor:"#86714a80"},"&dark .cm-panel.cm-panel-lint ul":{"& [aria-selected]":{backgroundColor:"#2e343e"}}});function Z0A(i){return i=="error"?4:i=="warning"?3:i=="info"?2:1}function jH(i){let e="hint",A=1;for(let t of i){let n=Z0A(t.severity);n>A&&(A=n,e=t.severity)}return e}var t8=class extends $s{constructor(e){super(),this.diagnostics=e,this.severity=jH(e)}toDOM(e){let A=document.createElement("div");A.className="cm-lint-marker cm-lint-marker-"+this.severity;let t=this.diagnostics,n=e.state.facet(n8).tooltipFilter;return n&&(t=n(t,e.state)),t.length&&(A.onmouseover=()=>$0A(e,A,t)),A}};function X0A(i,e){let A=t=>{let n=e.getBoundingClientRect();if(!(t.clientX>n.left-10&&t.clientXn.top-10&&t.clientYe.getBoundingClientRect()}}})}),e.onmouseout=e.onmousemove=null,X0A(i,e)}let{hoverTime:n}=i.state.facet(n8),o=setTimeout(t,n);e.onmouseout=()=>{clearTimeout(o),e.onmouseout=e.onmousemove=null},e.onmousemove=()=>{clearTimeout(o),o=setTimeout(t,n)}}function ACA(i,e){let A=Object.create(null);for(let n of e){let o=i.lineAt(n.from);(A[o.from]||(A[o.from]=[])).push(n)}let t=[];for(let n in A)t.push(new t8(A[n]).range(+n));return oo.of(t,!0)}var eCA=F6({class:"cm-gutter-lint",markers:i=>i.state.field(eS),widgetMarker:(i,e,A)=>{let t=[];return i.state.field(eS).between(A.from,A.to,(n,o,a)=>{n>A.from&&nt.is(iS)?t.value:A,i)},provide:i=>YB.from(i)}),tCA=Ii.baseTheme({".cm-gutter-lint":{width:"1.4em","& .cm-gutterElement":{padding:".2em"}},".cm-lint-marker":{width:"1em",height:"1em"},".cm-lint-marker-info":{content:$6('')},".cm-lint-marker-warning":{content:$6('')},".cm-lint-marker-error":{content:$6('')}}),VH=[ml,Ii.decorations.compute([ml],i=>{let{selected:e,panel:A}=i.field(ml);return!e||!A||e.from==e.to?kt.none:kt.set([H0A.range(e.from,e.to)])}),gO(z0A,{hideOn:UH}),W0A],n8=tt.define({combine(i){return Dr(i,{hoverTime:300,markerFilter:null,tooltipFilter:null})}});function WH(i={}){return[n8.of(i),eS,eCA,tCA,qH]}var oS=class i{constructor(e,A,t,n,o,a,r,s,l,g=0,C){this.p=e,this.stack=A,this.state=t,this.reducePos=n,this.pos=o,this.score=a,this.buffer=r,this.bufferBase=s,this.curContext=l,this.lookAhead=g,this.parent=C}toString(){return`[${this.stack.filter((e,A)=>A%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,A,t=0){let n=e.parser.context;return new i(e,[],A,t,t,0,[],0,n?new o8(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,A){this.stack.push(this.state,A,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var A;let t=e>>19,n=e&65535,{parser:o}=this.p,a=this.reducePos=2e3&&!(!((A=this.p.parser.nodeSet.types[n])===null||A===void 0)&&A.isAnonymous)&&(l==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=g):this.p.lastBigReductionSizes;)this.stack.pop();this.reduceContext(n,l)}storeNode(e,A,t,n=4,o=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&a.buffer[r-4]==0&&a.buffer[r-1]>-1){if(A==t)return;if(a.buffer[r-2]>=A){a.buffer[r-2]=t;return}}}if(!o||this.pos==t)this.buffer.push(e,A,t,n);else{let a=this.buffer.length;if(a>0&&(this.buffer[a-4]!=0||this.buffer[a-1]<0)){let r=!1;for(let s=a;s>0&&this.buffer[s-2]>t;s-=4)if(this.buffer[s-1]>=0){r=!0;break}if(r)for(;a>0&&this.buffer[a-2]>t;)this.buffer[a]=this.buffer[a-4],this.buffer[a+1]=this.buffer[a-3],this.buffer[a+2]=this.buffer[a-2],this.buffer[a+3]=this.buffer[a-1],a-=4,n>4&&(n-=4)}this.buffer[a]=e,this.buffer[a+1]=A,this.buffer[a+2]=t,this.buffer[a+3]=n}}shift(e,A,t,n){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let o=e,{parser:a}=this.p;this.pos=n;let r=a.stateFlag(o,1);!r&&(n>t||A<=a.maxNode)&&(this.reducePos=n),this.pushState(o,r?t:Math.min(t,this.reducePos)),this.shiftContext(A,t),A<=a.maxNode&&this.buffer.push(A,t,n,4)}else this.pos=n,this.shiftContext(A,t),A<=this.p.parser.maxNode&&this.buffer.push(A,t,n,4)}apply(e,A,t,n){e&65536?this.reduce(e):this.shift(e,A,t,n)}useNode(e,A){let t=this.p.reused.length-1;(t<0||this.p.reused[t]!=e)&&(this.p.reused.push(e),t++);let n=this.pos;this.reducePos=this.pos=n+e.length,this.pushState(A,n),this.buffer.push(t,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,A=e.buffer.length;for(;A>0&&e.buffer[A-2]>e.reducePos;)A-=4;let t=e.buffer.slice(A),n=e.bufferBase+A;for(;e&&n==e.bufferBase;)e=e.parent;return new i(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,t,n,this.curContext,this.lookAhead,e)}recoverByDelete(e,A){let t=e<=this.p.parser.maxNode;t&&this.storeNode(e,this.pos,A,4),this.storeNode(0,this.pos,A,t?8:4),this.pos=this.reducePos=A,this.score-=190}canShift(e){for(let A=new aS(this);;){let t=this.p.parser.stateSlot(A.state,4)||this.p.parser.hasAction(A.state,e);if(t==0)return!1;if((t&65536)==0)return!0;A.reduce(t)}}recoverByInsert(e){if(this.stack.length>=300)return[];let A=this.p.parser.nextStates(this.state);if(A.length>8||this.stack.length>=120){let n=[];for(let o=0,a;os&1&&r==a)||n.push(A[o],a)}A=n}let t=[];for(let n=0;n>19,n=A&65535,o=this.stack.length-t*3;if(o<0||e.getGoto(this.stack[o],n,!1)<0){let a=this.findForcedReduction();if(a==null)return!1;A=a}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(A),!0}findForcedReduction(){let{parser:e}=this.p,A=[],t=(n,o)=>{if(!A.includes(n))return A.push(n),e.allActions(n,a=>{if(!(a&393216))if(a&65536){let r=(a>>19)-o;if(r>1){let s=a&65535,l=this.stack.length-r*3;if(l>=0&&e.getGoto(this.stack[l],s,!1)>=0)return r<<19|65536|s}}else{let r=t(a,o+1);if(r!=null)return r}})};return t(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let A=0;A0&&this.emitLookAhead()}},o8=class{constructor(e,A){this.tracker=e,this.context=A,this.hash=e.strict?e.hash(A):0}},aS=class{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let A=e&65535,t=e>>19;t==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(t-1)*3;let n=this.start.p.parser.getGoto(this.stack[this.base-3],A,!0);this.state=n}},rS=class i{constructor(e,A,t){this.stack=e,this.pos=A,this.index=t,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,A=e.bufferBase+e.buffer.length){return new i(e,A,A-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new i(this.stack,this.pos,this.index)}};function Z4(i,e=Uint16Array){if(typeof i!="string")return i;let A=null;for(let t=0,n=0;t=92&&a--,a>=34&&a--;let s=a-32;if(s>=46&&(s-=46,r=!0),o+=s,r)break;o*=46}A?A[n++]=o:A=new e(o)}return A}var WB=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},ZH=new WB,sS=class{constructor(e,A){this.input=e,this.ranges=A,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=ZH,this.rangeIndex=0,this.pos=this.chunkPos=A[0].from,this.range=A[0],this.end=A[A.length-1].to,this.readNext()}resolveOffset(e,A){let t=this.range,n=this.rangeIndex,o=this.pos+e;for(;ot.to:o>=t.to;){if(n==this.ranges.length-1)return null;let a=this.ranges[++n];o+=a.from-t.to,t=a}return o}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,A.from);return this.end}peek(e){let A=this.chunkOff+e,t,n;if(A>=0&&A=this.chunk2Pos&&tr.to&&(this.chunk2=this.chunk2.slice(0,r.to-t)),n=this.chunk2.charCodeAt(0)}}return t>=this.token.lookAhead&&(this.token.lookAhead=t+1),n}acceptToken(e,A=0){let t=A?this.resolveOffset(A,-1):this.pos;if(t==null||t=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,A){if(A?(this.token=A,A.start=e,A.lookAhead=e+1,A.value=A.extended=-1):this.token=ZH,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&A<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,A-this.chunkPos);if(e>=this.chunk2Pos&&A<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,A-this.chunk2Pos);if(e>=this.range.from&&A<=this.range.to)return this.input.read(e,A);let t="";for(let n of this.ranges){if(n.from>=A)break;n.to>e&&(t+=this.input.read(Math.max(n.from,e),Math.min(n.to,A)))}return t}},Q2=class{constructor(e,A){this.data=e,this.id=A}token(e,A){let{parser:t}=A.p;tz(this.data,e,A,this.id,t.data,t.tokenPrecTable)}};Q2.prototype.contextual=Q2.prototype.fallback=Q2.prototype.extend=!1;var lS=class{constructor(e,A,t){this.precTable=A,this.elseToken=t,this.data=typeof e=="string"?Z4(e):e}token(e,A){let t=e.pos,n=0;for(;;){let o=e.next<0,a=e.resolveOffset(1,1);if(tz(this.data,e,A,0,this.data,this.precTable),e.token.value>-1)break;if(this.elseToken==null)return;if(o||n++,a==null)break;e.reset(a,e.token)}n&&(e.reset(t,e.token),e.acceptToken(this.elseToken,n))}};lS.prototype.contextual=Q2.prototype.fallback=Q2.prototype.extend=!1;function tz(i,e,A,t,n,o){let a=0,r=1<0){let Q=i[B];if(s.allows(Q)&&(e.token.value==-1||e.token.value==Q||nCA(Q,e.token.value,n,o))){e.acceptToken(Q);break}}let g=e.next,C=0,I=i[a+2];if(e.next<0&&I>C&&i[l+I*3-3]==65535){a=i[l+I*3-1];continue A}for(;C>1,Q=l+B+(B<<1),h=i[Q],f=i[Q+1]||65536;if(g=f)C=B+1;else{a=i[Q+2],e.advance();continue A}}break}}function XH(i,e,A){for(let t=e,n;(n=i[t])!=65535;t++)if(n==A)return t-e;return-1}function nCA(i,e,A,t){let n=XH(A,t,e);return n<0||XH(A,t,i)e)&&!t.type.isError)return A<0?Math.max(0,Math.min(t.to-1,e-25)):Math.min(i.length,Math.max(t.from+1,e+25));if(A<0?t.prevSibling():t.nextSibling())break;if(!t.parent())return A<0?0:i.length}}var gS=class{constructor(e,A){this.fragments=e,this.nodeSet=A,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?$H(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?$H(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=a,null;if(o instanceof Fa){if(a==e){if(a=Math.max(this.safeFrom,e)&&(this.trees.push(o),this.start.push(a),this.index.push(0))}else this.index[A]++,this.nextStart=a+o.length}}},cS=class{constructor(e,A){this.stream=A,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(t=>new WB)}getActions(e){let A=0,t=null,{parser:n}=e.p,{tokenizers:o}=n,a=n.stateSlot(e.state,3),r=e.curContext?e.curContext.hash:0,s=0;for(let l=0;lC.end+25&&(s=Math.max(C.lookAhead,s)),C.value!=0)){let I=A;if(C.extended>-1&&(A=this.addActions(e,C.extended,C.end,A)),A=this.addActions(e,C.value,C.end,A),!g.extend&&(t=C,A>I))break}}for(;this.actions.length>A;)this.actions.pop();return s&&e.setLookAhead(s),!t&&e.pos==this.stream.end&&(t=new WB,t.value=e.p.parser.eofTerm,t.start=t.end=e.pos,A=this.addActions(e,t.value,t.end,A)),this.mainToken=t,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let A=new WB,{pos:t,p:n}=e;return A.start=t,A.end=Math.min(t+1,n.stream.end),A.value=t==n.stream.end?n.parser.eofTerm:0,A}updateCachedToken(e,A,t){let n=this.stream.clipPos(t.pos);if(A.token(this.stream.reset(n,e),t),e.value>-1){let{parser:o}=t.p;for(let a=0;a=0&&t.p.parser.dialect.allows(r>>1)){(r&1)==0?e.value=r>>1:e.extended=r>>1;break}}}else e.value=0,e.end=this.stream.clipPos(n+1)}putAction(e,A,t,n){for(let o=0;oe.bufferLength*4?new gS(t,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,A=this.minStackPos,t=this.stacks=[],n,o;if(this.bigReductionCount>300&&e.length==1){let[a]=e;for(;a.forceReduce()&&a.stack.length&&a.stack[a.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let a=0;aA)t.push(r);else{if(this.advanceStack(r,t,e))continue;{n||(n=[],o=[]),n.push(r);let s=this.tokens.getMainToken(r);o.push(s.value,s.end)}}break}}if(!t.length){let a=n&&oCA(n);if(a)return wl&&console.log("Finish with "+this.stackID(a)),this.stackToTree(a);if(this.parser.strict)throw wl&&n&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+A);this.recovering||(this.recovering=5)}if(this.recovering&&n){let a=this.stoppedAt!=null&&n[0].pos>this.stoppedAt?n[0]:this.runRecovery(n,o,t);if(a)return wl&&console.log("Force-finish "+this.stackID(a)),this.stackToTree(a.forceAll())}if(this.recovering){let a=this.recovering==1?1:this.recovering*3;if(t.length>a)for(t.sort((r,s)=>s.score-r.score);t.length>a;)t.pop();t.some(r=>r.reducePos>A)&&this.recovering--}else if(t.length>1){A:for(let a=0;a500&&l.buffer.length>500)if((r.score-l.score||r.buffer.length-l.buffer.length)>0)t.splice(s--,1);else{t.splice(a--,1);continue A}}}t.length>12&&(t.sort((a,r)=>r.score-a.score),t.splice(12,t.length-12))}this.minStackPos=t[0].pos;for(let a=1;a ":"";if(this.stoppedAt!=null&&n>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let l=e.curContext&&e.curContext.tracker.strict,g=l?e.curContext.hash:0;for(let C=this.fragments.nodeAt(n);C;){let I=this.parser.nodeSet.types[C.type.id]==C.type?o.getGoto(e.state,C.type.id):-1;if(I>-1&&C.length&&(!l||(C.prop(Li.contextHash)||0)==g))return e.useNode(C,I),wl&&console.log(a+this.stackID(e)+` (via reuse of ${o.getName(C.type.id)})`),!0;if(!(C instanceof Fa)||C.children.length==0||C.positions[0]>0)break;let B=C.children[0];if(B instanceof Fa&&C.positions[0]==0)C=B;else break}}let r=o.stateSlot(e.state,4);if(r>0)return e.reduce(r),wl&&console.log(a+this.stackID(e)+` (via always-reduce ${o.getName(r&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let s=this.tokens.getActions(e);for(let l=0;ln?A.push(Q):t.push(Q)}return!1}advanceFully(e,A){let t=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>t)return Az(e,A),!0}}runRecovery(e,A,t){let n=null,o=!1;for(let a=0;a ":"";if(r.deadEnd&&(o||(o=!0,r.restart(),wl&&console.log(g+this.stackID(r)+" (restarted)"),this.advanceFully(r,t))))continue;let C=r.split(),I=g;for(let B=0;B<10&&C.forceReduce()&&(wl&&console.log(I+this.stackID(C)+" (via force-reduce)"),!this.advanceFully(C,t));B++)wl&&(I=this.stackID(C)+" -> ");for(let B of r.recoverByInsert(s))wl&&console.log(g+this.stackID(B)+" (via recover-insert)"),this.advanceFully(B,t);this.stream.end>r.pos?(l==r.pos&&(l++,s=0),r.recoverByDelete(s,l),wl&&console.log(g+this.stackID(r)+` (via recover-delete ${this.parser.getName(s)})`),Az(r,t)):(!n||n.scoree.topRules[r][1]),n=[];for(let r=0;r=0)o(g,s,r[l++]);else{let C=r[l+-g];for(let I=-g;I>0;I--)o(r[l++],s,C);l++}}}this.nodeSet=new K4(A.map((r,s)=>Cs.define({name:s>=this.minRepeatTerm?void 0:r,id:s,props:n[s],top:t.indexOf(s)>-1,error:s==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(s)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=1024;let a=Z4(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let r=0;rtypeof r=="number"?new Q2(a,r):r),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,A,t){let n=new CS(this,e,A,t);for(let o of this.wrappers)n=o(n,e,A,t);return n}getGoto(e,A,t=!1){let n=this.goto;if(A>=n[0])return-1;for(let o=n[A+1];;){let a=n[o++],r=a&1,s=n[o++];if(r&&t)return s;for(let l=o+(a>>1);o0}validAction(e,A){return!!this.allActions(e,t=>t==A?!0:null)}allActions(e,A){let t=this.stateSlot(e,4),n=t?A(t):void 0;for(let o=this.stateSlot(e,1);n==null;o+=3){if(this.data[o]==65535)if(this.data[o+1]==1)o=W0(this.data,o+2);else break;n=A(W0(this.data,o+1))}return n}nextStates(e){let A=[];for(let t=this.stateSlot(e,1);;t+=3){if(this.data[t]==65535)if(this.data[t+1]==1)t=W0(this.data,t+2);else break;if((this.data[t+2]&1)==0){let n=this.data[t+1];A.some((o,a)=>a&1&&o==n)||A.push(this.data[t],n)}}return A}configure(e){let A=Object.assign(Object.create(i.prototype),this);if(e.props&&(A.nodeSet=this.nodeSet.extend(...e.props)),e.top){let t=this.topRules[e.top];if(!t)throw new RangeError(`Invalid top rule name ${e.top}`);A.top=t}return e.tokenizers&&(A.tokenizers=this.tokenizers.map(t=>{let n=e.tokenizers.find(o=>o.from==t);return n?n.to:t})),e.specializers&&(A.specializers=this.specializers.slice(),A.specializerSpecs=this.specializerSpecs.map((t,n)=>{let o=e.specializers.find(r=>r.from==t.external);if(!o)return t;let a=Object.assign(Object.assign({},t),{external:o.to});return A.specializers[n]=ez(a),a})),e.contextTracker&&(A.context=e.contextTracker),e.dialect&&(A.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(A.strict=e.strict),e.wrap&&(A.wrappers=A.wrappers.concat(e.wrap)),e.bufferLength!=null&&(A.bufferLength=e.bufferLength),A}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let A=this.dynamicPrecedences;return A==null?0:A[e]||0}parseDialect(e){let A=Object.keys(this.dialects),t=A.map(()=>!1);if(e)for(let o of e.split(" ")){let a=A.indexOf(o);a>=0&&(t[a]=!0)}let n=null;for(let o=0;ot)&&A.p.parser.stateFlag(A.state,2)&&(!e||e.scorei.external(A,t)<<1|e}return i.get}var aCA=O6({String:Ke.string,Number:Ke.number,"True False":Ke.bool,PropertyName:Ke.propertyName,Null:Ke.null,", :":Ke.separator,"[ ]":Ke.squareBracket,"{ }":Ke.brace}),iz=a8.deserialize({version:14,states:"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l",stateData:"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O",goto:"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R",nodeNames:"\u26A0 JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array",maxTerm:25,nodeProps:[["isolate",-2,6,11,""],["openedBy",7,"{",14,"["],["closedBy",8,"}",15,"]"]],propSources:[aCA],skippedNodes:[0],repeatNodeCount:2,tokenData:"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~",tokenizers:[0],topRules:{JsonText:[0,1]},tokenPrec:0});var rCA=H6.define({name:"json",parser:iz.configure({props:[Y9.add({Object:O9({except:/^\s*\}/}),Array:O9({except:/^\s*\]/})}),P4.add({"Object Array":KO})]}),languageData:{closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/}});function nz(){return new z6(rCA)}var oz=typeof String.prototype.normalize=="function"?i=>i.normalize("NFKD"):i=>i,p2=class{constructor(e,A,t=0,n=e.length,o,a){this.test=a,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(t,n),this.bufferStart=t,this.normalize=o?r=>o(oz(r)):oz,this.query=this.normalize(A)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return Or(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let A=Q4(e),t=this.bufferStart+this.bufferPos;this.bufferPos+=pl(e);let n=this.normalize(A);if(n.length)for(let o=0,a=t;;o++){let r=n.charCodeAt(o),s=this.match(r,a,this.bufferPos+this.bufferStart);if(o==n.length-1){if(s)return this.value=s,this;break}a==t&&othis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let A=this.matchPos<=this.to&&this.re.exec(this.curLine);if(A){let t=this.curLineStart+A.index,n=t+A[0].length;if(this.matchPos=C8(this.text,n+(t==n?1:0)),t==this.curLineStart+this.curLine.length&&this.nextLine(),(tthis.value.to)&&(!this.test||this.test(t,n,A)))return this.value={from:t,to:n,match:A},this;e=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length=t||n.to<=A){let r=new i(A,e.sliceString(A,t));return dS.set(e,r),r}if(n.from==A&&n.to==t)return n;let{text:o,from:a}=n;return a>A&&(o=e.sliceString(A,a)+o,a=A),n.to=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,A=this.re.exec(this.flat.text);if(A&&!A[0]&&A.index==e&&(this.re.lastIndex=e+1,A=this.re.exec(this.flat.text)),A){let t=this.flat.from+A.index,n=t+A[0].length;if((this.flat.to>=this.to||A.index+A[0].length<=this.flat.text.length-10)&&(!this.test||this.test(t,n,A)))return this.value={from:t,to:n,match:A},this.matchPos=C8(this.text,n+(t==n?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=g8.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}};typeof Symbol<"u"&&(l8.prototype[Symbol.iterator]=c8.prototype[Symbol.iterator]=function(){return this});function sCA(i){try{return new RegExp(i,pS),!0}catch(e){return!1}}function C8(i,e){if(e>=i.length)return e;let A=i.lineAt(e),t;for(;e=56320&&t<57344;)e++;return e}var lCA=i=>{let{state:e}=i,A=String(e.doc.lineAt(i.state.selection.main.head).number),{close:t,result:n}=CO(i,{label:e.phrase("Go to line"),input:{type:"text",name:"line",value:A},focus:!0,submitLabel:e.phrase("go")});return n.then(o=>{let a=o&&/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(o.elements.line.value);if(!a){i.dispatch({effects:t});return}let r=e.doc.lineAt(e.selection.main.head),[,s,l,g,C]=a,I=g?+g.slice(1):0,B=l?+l:r.number;if(l&&C){let f=B/100;s&&(f=f*(s=="-"?-1:1)+r.number/e.doc.lines),B=Math.round(e.doc.lines*f)}else l&&s&&(B=B*(s=="-"?-1:1)+r.number);let Q=e.doc.line(Math.max(1,Math.min(e.doc.lines,B))),h=Ce.cursor(Q.from+Math.max(0,Math.min(I,Q.length)));i.dispatch({effects:[t,Ii.scrollIntoView(h.from,{y:"center"})],selection:h})}),!0},gCA={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},lz=tt.define({combine(i){return Dr(i,gCA,{highlightWordAroundCursor:(e,A)=>e||A,minSelectionLength:Math.min,maxMatches:Math.min})}});function gz(i){let e=[BCA,dCA];return i&&e.push(lz.of(i)),e}var cCA=kt.mark({class:"cm-selectionMatch"}),CCA=kt.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function az(i,e,A,t){return(A==0||i(e.sliceDoc(A-1,A))!=Jo.Word)&&(t==e.doc.length||i(e.sliceDoc(t,t+1))!=Jo.Word)}function ICA(i,e,A,t){return i(e.sliceDoc(A,A+1))==Jo.Word&&i(e.sliceDoc(t-1,t))==Jo.Word}var dCA=No.fromClass(class{constructor(i){this.decorations=this.getDeco(i)}update(i){(i.selectionSet||i.docChanged||i.viewportChanged)&&(this.decorations=this.getDeco(i.view))}getDeco(i){let e=i.state.facet(lz),{state:A}=i,t=A.selection;if(t.ranges.length>1)return kt.none;let n=t.main,o,a=null;if(n.empty){if(!e.highlightWordAroundCursor)return kt.none;let s=A.wordAt(n.head);if(!s)return kt.none;a=A.charCategorizer(n.head),o=A.sliceDoc(s.from,s.to)}else{let s=n.to-n.from;if(s200)return kt.none;if(e.wholeWords){if(o=A.sliceDoc(n.from,n.to),a=A.charCategorizer(n.head),!(az(a,A,n.from,n.to)&&ICA(a,A,n.from,n.to)))return kt.none}else if(o=A.sliceDoc(n.from,n.to),!o)return kt.none}let r=[];for(let s of i.visibleRanges){let l=new p2(A.doc,o,s.from,s.to);for(;!l.next().done;){let{from:g,to:C}=l.value;if((!a||az(a,A,g,C))&&(n.empty&&g<=n.from&&C>=n.to?r.push(CCA.range(g,C)):(g>=n.to||C<=n.from)&&r.push(cCA.range(g,C)),r.length>e.maxMatches))return kt.none}}return kt.set(r)}},{decorations:i=>i.decorations}),BCA=Ii.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),ECA=({state:i,dispatch:e})=>{let{selection:A}=i,t=Ce.create(A.ranges.map(n=>i.wordAt(n.head)||Ce.cursor(n.head)),A.mainIndex);return t.eq(A)?!1:(e(i.update({selection:t})),!0)};function hCA(i,e){let{main:A,ranges:t}=i.selection,n=i.wordAt(A.head),o=n&&n.from==A.from&&n.to==A.to;for(let a=!1,r=new p2(i.doc,e,t[t.length-1].to);;)if(r.next(),r.done){if(a)return null;r=new p2(i.doc,e,0,Math.max(0,t[t.length-1].from-1)),a=!0}else{if(a&&t.some(s=>s.from==r.value.from))continue;if(o){let s=i.wordAt(r.value.from);if(!s||s.from!=r.value.from||s.to!=r.value.to)continue}return r.value}}var QCA=({state:i,dispatch:e})=>{let{ranges:A}=i.selection;if(A.some(o=>o.from===o.to))return ECA({state:i,dispatch:e});let t=i.sliceDoc(A[0].from,A[0].to);if(i.selection.ranges.some(o=>i.sliceDoc(o.from,o.to)!=t))return!1;let n=hCA(i,t);return n?(e(i.update({selection:i.selection.addRange(Ce.range(n.from,n.to),!1),effects:Ii.scrollIntoView(n.to)})),!0):!1},EI=tt.define({combine(i){return Dr(i,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new QS(e),scrollToMatch:e=>Ii.scrollIntoView(e)})}});function cz(i){return i?[EI.of(i),uS]:uS}var I8=class{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||sCA(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord,this.test=e.test}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,(A,t)=>t=="n"?` +`:t=="r"?"\r":t=="t"?" ":"\\")}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord&&this.test==e.test}create(){return this.regexp?new ES(this):new BS(this)}getCursor(e,A=0,t){let n=e.doc?e:Pa.create({doc:e});return t==null&&(t=n.doc.length),this.regexp?XB(this,n,A,t):ZB(this,n,A,t)}},d8=class{constructor(e){this.spec=e}};function uCA(i,e,A){return(t,n,o,a)=>{if(A&&!A(t,n,o,a))return!1;let r=t>=a&&n<=a+o.length?o.slice(t-a,n-a):e.doc.sliceString(t,n);return i(r,e,t,n)}}function ZB(i,e,A,t){let n;return i.wholeWord&&(n=pCA(e.doc,e.charCategorizer(e.selection.main.head))),i.test&&(n=uCA(i.test,e,n)),new p2(e.doc,i.unquoted,A,t,i.caseSensitive?void 0:o=>o.toLowerCase(),n)}function pCA(i,e){return(A,t,n,o)=>((o>A||o+n.length=A)return null;n.push(t.value)}return n}highlight(e,A,t,n){let o=ZB(this.spec,e,Math.max(0,A-this.spec.unquoted.length),Math.min(t+this.spec.unquoted.length,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}};function fCA(i,e,A){return(t,n,o)=>(!A||A(t,n,o))&&i(o[0],e,t,n)}function XB(i,e,A,t){let n;return i.wholeWord&&(n=mCA(e.charCategorizer(e.selection.main.head))),i.test&&(n=fCA(i.test,e,n)),new l8(e.doc,i.search,{ignoreCase:!i.caseSensitive,test:n},A,t)}function B8(i,e){return i.slice(za(i,e,!1),e)}function E8(i,e){return i.slice(e,za(i,e))}function mCA(i){return(e,A,t)=>!t[0].length||(i(B8(t.input,t.index))!=Jo.Word||i(E8(t.input,t.index))!=Jo.Word)&&(i(E8(t.input,t.index+t[0].length))!=Jo.Word||i(B8(t.input,t.index+t[0].length))!=Jo.Word)}var ES=class extends d8{nextMatch(e,A,t){let n=XB(this.spec,e,t,e.doc.length).next();return n.done&&(n=XB(this.spec,e,0,A).next()),n.done?null:n.value}prevMatchInRange(e,A,t){for(let n=1;;n++){let o=Math.max(A,t-n*1e4),a=XB(this.spec,e,o,t),r=null;for(;!a.next().done;)r=a.value;if(r&&(o==A||r.from>o+10))return r;if(o==A)return null}}prevMatch(e,A,t){return this.prevMatchInRange(e,0,A)||this.prevMatchInRange(e,t,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(A,t)=>{if(t=="&")return e.match[0];if(t=="$")return"$";for(let n=t.length;n>0;n--){let o=+t.slice(0,n);if(o>0&&o=A)return null;n.push(t.value)}return n}highlight(e,A,t,n){let o=XB(this.spec,e,Math.max(0,A-250),Math.min(t+250,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}},$4=$i.define(),fS=$i.define(),u2=ba.define({create(i){return new X4(hS(i).create(),null)},update(i,e){for(let A of e.effects)A.is($4)?i=new X4(A.value.create(),i.panel):A.is(fS)&&(i=new X4(i.query,A.value?mS:null));return i},provide:i=>rI.from(i,e=>e.panel)});var X4=class{constructor(e,A){this.query=e,this.panel=A}},wCA=kt.mark({class:"cm-searchMatch"}),DCA=kt.mark({class:"cm-searchMatch cm-searchMatch-selected"}),yCA=No.fromClass(class{constructor(i){this.view=i,this.decorations=this.highlight(i.state.field(u2))}update(i){let e=i.state.field(u2);(e!=i.startState.field(u2)||i.docChanged||i.selectionSet||i.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:i,panel:e}){if(!e||!i.spec.valid)return kt.none;let{view:A}=this,t=new Yr;for(let n=0,o=A.visibleRanges,a=o.length;no[n+1].from-500;)s=o[++n].to;i.highlight(A.state,r,s,(l,g)=>{let C=A.state.selection.ranges.some(I=>I.from==l&&I.to==g);t.add(l,g,C?DCA:wCA)})}return t.finish()}},{decorations:i=>i.decorations});function Au(i){return e=>{let A=e.state.field(u2,!1);return A&&A.query.spec.valid?i(e,A):u8(e)}}var h8=Au((i,{query:e})=>{let{to:A}=i.state.selection.main,t=e.nextMatch(i.state,A,A);if(!t)return!1;let n=Ce.single(t.from,t.to),o=i.state.facet(EI);return i.dispatch({selection:n,effects:[wS(i,t),o.scrollToMatch(n.main,i)],userEvent:"select.search"}),Iz(i),!0}),Q8=Au((i,{query:e})=>{let{state:A}=i,{from:t}=A.selection.main,n=e.prevMatch(A,t,t);if(!n)return!1;let o=Ce.single(n.from,n.to),a=i.state.facet(EI);return i.dispatch({selection:o,effects:[wS(i,n),a.scrollToMatch(o.main,i)],userEvent:"select.search"}),Iz(i),!0}),vCA=Au((i,{query:e})=>{let A=e.matchAll(i.state,1e3);return!A||!A.length?!1:(i.dispatch({selection:Ce.create(A.map(t=>Ce.range(t.from,t.to))),userEvent:"select.search.matches"}),!0)}),bCA=({state:i,dispatch:e})=>{let A=i.selection;if(A.ranges.length>1||A.main.empty)return!1;let{from:t,to:n}=A.main,o=[],a=0;for(let r=new p2(i.doc,i.sliceDoc(t,n));!r.next().done;){if(o.length>1e3)return!1;r.value.from==t&&(a=o.length),o.push(Ce.range(r.value.from,r.value.to))}return e(i.update({selection:Ce.create(o,a),userEvent:"select.search.matches"})),!0},rz=Au((i,{query:e})=>{let{state:A}=i,{from:t,to:n}=A.selection.main;if(A.readOnly)return!1;let o=e.nextMatch(A,t,t);if(!o)return!1;let a=o,r=[],s,l,g=[];a.from==t&&a.to==n&&(l=A.toText(e.getReplacement(a)),r.push({from:a.from,to:a.to,insert:l}),a=e.nextMatch(A,a.from,a.to),g.push(Ii.announce.of(A.phrase("replaced match on line $",A.doc.lineAt(t).number)+".")));let C=i.state.changes(r);return a&&(s=Ce.single(a.from,a.to).map(C),g.push(wS(i,a)),g.push(A.facet(EI).scrollToMatch(s.main,i))),i.dispatch({changes:C,selection:s,effects:g,userEvent:"input.replace"}),!0}),MCA=Au((i,{query:e})=>{if(i.state.readOnly)return!1;let A=e.matchAll(i.state,1e9).map(n=>{let{from:o,to:a}=n;return{from:o,to:a,insert:e.getReplacement(n)}});if(!A.length)return!1;let t=i.state.phrase("replaced $ matches",A.length)+".";return i.dispatch({changes:A,effects:Ii.announce.of(t),userEvent:"input.replace.all"}),!0});function mS(i){return i.state.facet(EI).createPanel(i)}function hS(i,e){var A,t,n,o,a;let r=i.selection.main,s=r.empty||r.to>r.from+100?"":i.sliceDoc(r.from,r.to);if(e&&!s)return e;let l=i.facet(EI);return new I8({search:((A=e?.literal)!==null&&A!==void 0?A:l.literal)?s:s.replace(/\n/g,"\\n"),caseSensitive:(t=e?.caseSensitive)!==null&&t!==void 0?t:l.caseSensitive,literal:(n=e?.literal)!==null&&n!==void 0?n:l.literal,regexp:(o=e?.regexp)!==null&&o!==void 0?o:l.regexp,wholeWord:(a=e?.wholeWord)!==null&&a!==void 0?a:l.wholeWord})}function Cz(i){let e=L4(i,mS);return e&&e.dom.querySelector("[main-field]")}function Iz(i){let e=Cz(i);e&&e==i.root.activeElement&&e.select()}var u8=i=>{let e=i.state.field(u2,!1);if(e&&e.panel){let A=Cz(i);if(A&&A!=i.root.activeElement){let t=hS(i.state,e.query.spec);t.valid&&i.dispatch({effects:$4.of(t)}),A.focus(),A.select()}}else i.dispatch({effects:[fS.of(!0),e?$4.of(hS(i.state,e.query.spec)):$i.appendConfig.of(uS)]});return!0},p8=i=>{let e=i.state.field(u2,!1);if(!e||!e.panel)return!1;let A=L4(i,mS);return A&&A.dom.contains(i.root.activeElement)&&i.focus(),i.dispatch({effects:fS.of(!1)}),!0},dz=[{key:"Mod-f",run:u8,scope:"editor search-panel"},{key:"F3",run:h8,shift:Q8,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:h8,shift:Q8,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:p8,scope:"editor search-panel"},{key:"Mod-Shift-l",run:bCA},{key:"Mod-Alt-g",run:lCA},{key:"Mod-d",run:QCA,preventDefault:!0}],QS=class{constructor(e){this.view=e;let A=this.query=e.state.field(u2).query.spec;this.commit=this.commit.bind(this),this.searchField=ao("input",{value:A.search,placeholder:Dl(e,"Find"),"aria-label":Dl(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=ao("input",{value:A.replace,placeholder:Dl(e,"Replace"),"aria-label":Dl(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=ao("input",{type:"checkbox",name:"case",form:"",checked:A.caseSensitive,onchange:this.commit}),this.reField=ao("input",{type:"checkbox",name:"re",form:"",checked:A.regexp,onchange:this.commit}),this.wordField=ao("input",{type:"checkbox",name:"word",form:"",checked:A.wholeWord,onchange:this.commit});function t(n,o,a){return ao("button",{class:"cm-button",name:n,onclick:o,type:"button"},a)}this.dom=ao("div",{onkeydown:n=>this.keydown(n),class:"cm-search"},[this.searchField,t("next",()=>h8(e),[Dl(e,"next")]),t("prev",()=>Q8(e),[Dl(e,"previous")]),t("select",()=>vCA(e),[Dl(e,"all")]),ao("label",null,[this.caseField,Dl(e,"match case")]),ao("label",null,[this.reField,Dl(e,"regexp")]),ao("label",null,[this.wordField,Dl(e,"by word")]),...e.state.readOnly?[]:[ao("br"),this.replaceField,t("replace",()=>rz(e),[Dl(e,"replace")]),t("replaceAll",()=>MCA(e),[Dl(e,"replace all")])],ao("button",{name:"close",onclick:()=>p8(e),"aria-label":Dl(e,"close"),type:"button"},["\xD7"])])}commit(){let e=new I8({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:$4.of(e)}))}keydown(e){XY(this.view,e,"search-panel")?e.preventDefault():e.keyCode==13&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?Q8:h8)(this.view)):e.keyCode==13&&e.target==this.replaceField&&(e.preventDefault(),rz(this.view))}update(e){for(let A of e.transactions)for(let t of A.effects)t.is($4)&&!t.value.eq(this.query)&&this.setQuery(t.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(EI).top}};function Dl(i,e){return i.state.phrase(e)}var r8=30,s8=/[\s\.,:;?!]/;function wS(i,{from:e,to:A}){let t=i.state.doc.lineAt(e),n=i.state.doc.lineAt(A).to,o=Math.max(t.from,e-r8),a=Math.min(n,A+r8),r=i.state.sliceDoc(o,a);if(o!=t.from){for(let s=0;sr.length-r8;s--)if(!s8.test(r[s-1])&&s8.test(r[s])){r=r.slice(0,s);break}}return Ii.announce.of(`${i.state.phrase("current match")}. ${r} ${i.state.phrase("on line")} ${t.number}.`)}var SCA=Ii.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),uS=[u2,zg.low(yCA),SCA];var m8=class{constructor(e,A,t,n){this.state=e,this.pos=A,this.explicit=t,this.view=n,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let A=vr(this.state).resolveInner(this.pos,-1);for(;A&&e.indexOf(A.name)<0;)A=A.parent;return A?{from:A.from,to:this.pos,text:this.state.sliceDoc(A.from,this.pos),type:A.type}:null}matchBefore(e){let A=this.state.doc.lineAt(this.pos),t=Math.max(A.from,this.pos-250),n=A.text.slice(t-A.from,this.pos-A.from),o=n.search(mz(e,!1));return o<0?null:{from:t+o,to:this.pos,text:n.slice(o)}}get aborted(){return this.abortListeners==null}addEventListener(e,A,t){e=="abort"&&this.abortListeners&&(this.abortListeners.push(A),t&&t.onDocChange&&(this.abortOnDocChange=!0))}};function Bz(i){let e=Object.keys(i).join(""),A=/\w/.test(e);return A&&(e=e.replace(/\w/g,"")),`[${A?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function kCA(i){let e=Object.create(null),A=Object.create(null);for(let{label:n}of i){e[n[0]]=!0;for(let o=1;otypeof n=="string"?{label:n}:n),[A,t]=e.every(n=>/^\w+$/.test(n.label))?[/\w*$/,/\w+$/]:kCA(e);return n=>{let o=n.matchBefore(t);return o||n.explicit?{from:o?o.from:n.pos,options:e,validFor:A}:null}}var w8=class{constructor(e,A,t,n){this.completion=e,this.source=A,this.match=t,this.score=n}};function QI(i){return i.selection.main.from}function mz(i,e){var A;let{source:t}=i,n=e&&t[0]!="^",o=t[t.length-1]!="$";return!n&&!o?i:new RegExp(`${n?"^":""}(?:${t})${o?"$":""}`,(A=i.flags)!==null&&A!==void 0?A:i.ignoreCase?"i":"")}var wz=Vs.define();function xCA(i,e,A,t){let{main:n}=i.selection,o=A-n.from,a=t-n.from;return Oe(oA({},i.changeByRange(r=>{if(r!=n&&A!=t&&i.sliceDoc(r.from+o,r.from+a)!=i.sliceDoc(A,t))return{range:r};let s=i.toText(e);return{changes:{from:r.from+o,to:t==n.from?r.to:r.from+a,insert:s},range:Ce.cursor(r.from+o+s.length)}})),{scrollIntoView:!0,userEvent:"input.complete"})}var Ez=new WeakMap;function RCA(i){if(!Array.isArray(i))return i;let e=Ez.get(i);return e||Ez.set(i,e=_CA(i)),e}var D8=$i.define(),eu=$i.define(),bS=class{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let A=0;A=48&&M<=57||M>=97&&M<=122?2:M>=65&&M<=90?1:0:(x=Q4(M))!=x.toLowerCase()?1:x!=x.toUpperCase()?2:0;(!v||F==1&&f||k==0&&F!=0)&&(A[C]==M||t[C]==M&&(I=!0)?a[C++]=v:a.length&&(m=!1)),k=F,v+=pl(M)}return C==s&&a[0]==0&&m?this.result(-100+(I?-200:0),a,e):B==s&&Q==0?this.ret(-200-e.length+(h==e.length?0:-100),[0,h]):r>-1?this.ret(-700-e.length,[r,r+this.pattern.length]):B==s?this.ret(-900-e.length,[Q,h]):C==s?this.result(-100+(I?-200:0)+-700+(m?0:-1100),a,e):A.length==2?null:this.result((n[0]?-700:0)+-200+-1100,n,e)}result(e,A,t){let n=[],o=0;for(let a of A){let r=a+(this.astral?pl(Or(t,a)):1);o&&n[o-1]==a?n[o-1]=r:(n[o++]=a,n[o++]=r)}return this.ret(e-t.length,n)}},MS=class{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:NCA,filterStrict:!1,compareCompletions:(e,A)=>(e.sortText||e.label).localeCompare(A.sortText||A.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,A)=>e&&A,closeOnBlur:(e,A)=>e&&A,icons:(e,A)=>e&&A,tooltipClass:(e,A)=>t=>hz(e(t),A(t)),optionClass:(e,A)=>t=>hz(e(t),A(t)),addToOptions:(e,A)=>e.concat(A),filterStrict:(e,A)=>e||A})}});function hz(i,e){return i?e?i+" "+e:i:e}function NCA(i,e,A,t,n,o){let a=i.textDirection==wo.RTL,r=a,s=!1,l="top",g,C,I=e.left-n.left,B=n.right-e.right,Q=t.right-t.left,h=t.bottom-t.top;if(r&&I=h||v>e.top?g=A.bottom-e.top:(l="bottom",g=e.bottom-A.top)}let f=(e.bottom-e.top)/o.offsetHeight,m=(e.right-e.left)/o.offsetWidth;return{style:`${l}: ${g/f}px; max-width: ${C/m}px`,class:"cm-completionInfo-"+(s?a?"left-narrow":"right-narrow":r?"left":"right")}}var RS=$i.define();function FCA(i){let e=i.addToOptions.slice();return i.icons&&e.push({render(A){let t=document.createElement("div");return t.classList.add("cm-completionIcon"),A.type&&t.classList.add(...A.type.split(/\s+/g).map(n=>"cm-completionIcon-"+n)),t.setAttribute("aria-hidden","true"),t},position:20}),e.push({render(A,t,n,o){let a=document.createElement("span");a.className="cm-completionLabel";let r=A.displayLabel||A.label,s=0;for(let l=0;ls&&a.appendChild(document.createTextNode(r.slice(s,g)));let I=a.appendChild(document.createElement("span"));I.appendChild(document.createTextNode(r.slice(g,C))),I.className="cm-completionMatchedText",s=C}return sA.position-t.position).map(A=>A.render)}function DS(i,e,A){if(i<=A)return{from:0,to:i};if(e<0&&(e=0),e<=i>>1){let n=Math.floor(e/A);return{from:n*A,to:(n+1)*A}}let t=Math.floor((i-e)/A);return{from:i-(t+1)*A,to:i-t*A}}var SS=class{constructor(e,A,t){this.view=e,this.stateField=A,this.applyCompletion=t,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:s=>this.placeInfo(s),key:this},this.space=null,this.currentClass="";let n=e.state.field(A),{options:o,selected:a}=n.open,r=e.state.facet(br);this.optionContent=FCA(r),this.optionClass=r.optionClass,this.tooltipClass=r.tooltipClass,this.range=DS(o.length,a,r.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",s=>{let{options:l}=e.state.field(A).open;for(let g=s.target,C;g&&g!=this.dom;g=g.parentNode)if(g.nodeName=="LI"&&(C=/-(\d+)$/.exec(g.id))&&+C[1]this.list.lastChild.getBoundingClientRect().bottom?this.range.to:null;g!=null&&(e.dispatch({effects:RS.of(g)}),s.preventDefault())}}),this.dom.addEventListener("focusout",s=>{let l=e.state.field(this.stateField,!1);l&&l.tooltip&&e.state.facet(br).closeOnBlur&&s.relatedTarget!=e.contentDOM&&e.dispatch({effects:eu.of(null)})}),this.showOptions(o,n.id)}mount(){this.updateSel()}showOptions(e,A){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,A,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var A;let t=e.state.field(this.stateField),n=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),t!=n){let{options:o,selected:a,disabled:r}=t.open;(!n.open||n.open.options!=o)&&(this.range=DS(o.length,a,e.state.facet(br).maxRenderedOptions),this.showOptions(o,t.id)),this.updateSel(),r!=((A=n.open)===null||A===void 0?void 0:A.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!r)}}updateTooltipClass(e){let A=this.tooltipClass(e);if(A!=this.currentClass){for(let t of this.currentClass.split(" "))t&&this.dom.classList.remove(t);for(let t of A.split(" "))t&&this.dom.classList.add(t);this.currentClass=A}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),A=e.open;(A.selected>-1&&A.selected=this.range.to)&&(this.range=DS(A.options.length,A.selected,this.view.state.facet(br).maxRenderedOptions),this.showOptions(A.options,e.id));let t=this.updateSelectedOption(A.selected);if(t){this.destroyInfo();let{completion:n}=A.options[A.selected],{info:o}=n;if(!o)return;let a=typeof o=="string"?document.createTextNode(o):o(n);if(!a)return;"then"in a?a.then(r=>{r&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(r,n)}).catch(r=>yr(this.view.state,r,"completion info")):(this.addInfoPane(a,n),t.setAttribute("aria-describedby",this.info.id))}}addInfoPane(e,A){this.destroyInfo();let t=this.info=document.createElement("div");if(t.className="cm-tooltip cm-completionInfo",t.id="cm-completionInfo-"+Math.floor(Math.random()*65535).toString(16),e.nodeType!=null)t.appendChild(e),this.infoDestroy=null;else{let{dom:n,destroy:o}=e;t.appendChild(n),this.infoDestroy=o||null}this.dom.appendChild(t),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let A=null;for(let t=this.list.firstChild,n=this.range.from;t;t=t.nextSibling,n++)t.nodeName!="LI"||!t.id?n--:n==e?t.hasAttribute("aria-selected")||(t.setAttribute("aria-selected","true"),A=t):t.hasAttribute("aria-selected")&&(t.removeAttribute("aria-selected"),t.removeAttribute("aria-describedby"));return A&&GCA(this.list,A),A}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let A=this.dom.getBoundingClientRect(),t=this.info.getBoundingClientRect(),n=e.getBoundingClientRect(),o=this.space;if(!o){let a=this.dom.ownerDocument.documentElement;o={left:0,top:0,right:a.clientWidth,bottom:a.clientHeight}}return n.top>Math.min(o.bottom,A.bottom)-10||n.bottom{a.target==n&&a.preventDefault()});let o=null;for(let a=t.from;at.from||t.from==0))if(o=I,typeof l!="string"&&l.header)n.appendChild(l.header(l));else{let B=n.appendChild(document.createElement("completion-section"));B.textContent=I}}let g=n.appendChild(document.createElement("li"));g.id=A+"-"+a,g.setAttribute("role","option");let C=this.optionClass(r);C&&(g.className=C);for(let I of this.optionContent){let B=I(r,this.view.state,this.view,s);B&&g.appendChild(B)}}return t.from&&n.classList.add("cm-completionListIncompleteTop"),t.tonew SS(A,i,e)}function GCA(i,e){let A=i.getBoundingClientRect(),t=e.getBoundingClientRect(),n=A.height/i.offsetHeight;t.topA.bottom&&(i.scrollTop+=(t.bottom-A.bottom)/n)}function Qz(i){return(i.boost||0)*100+(i.apply?10:0)+(i.info?5:0)+(i.type?1:0)}function KCA(i,e){let A=[],t=null,n=null,o=g=>{A.push(g);let{section:C}=g.completion;if(C){t||(t=[]);let I=typeof C=="string"?C:C.name;t.some(B=>B.name==I)||t.push(typeof C=="string"?{name:I}:C)}},a=e.facet(br);for(let g of i)if(g.hasResult()){let C=g.result.getMatch;if(g.result.filter===!1)for(let I of g.result.options)o(new w8(I,g.source,C?C(I):[],1e9-A.length));else{let I=e.sliceDoc(g.from,g.to),B,Q=a.filterStrict?new MS(I):new bS(I);for(let h of g.result.options)if(B=Q.match(h.label)){let f=h.displayLabel?C?C(h,B.matched):[]:B.matched,m=B.score+(h.boost||0);if(o(new w8(h,g.source,f,m)),typeof h.section=="object"&&h.section.rank==="dynamic"){let{name:v}=h.section;n||(n=Object.create(null)),n[v]=Math.max(m,n[v]||-1e9)}}}}if(t){let g=Object.create(null),C=0,I=(B,Q)=>(B.rank==="dynamic"&&Q.rank==="dynamic"?n[Q.name]-n[B.name]:0)||(typeof B.rank=="number"?B.rank:1e9)-(typeof Q.rank=="number"?Q.rank:1e9)||(B.nameI.score-C.score||l(C.completion,I.completion))){let C=g.completion;!s||s.label!=C.label||s.detail!=C.detail||s.type!=null&&C.type!=null&&s.type!=C.type||s.apply!=C.apply||s.boost!=C.boost?r.push(g):Qz(g.completion)>Qz(s)&&(r[r.length-1]=g),s=g.completion}return r}var kS=class i{constructor(e,A,t,n,o,a){this.options=e,this.attrs=A,this.tooltip=t,this.timestamp=n,this.selected=o,this.disabled=a}setSelected(e,A){return e==this.selected||e>=this.options.length?this:new i(this.options,uz(A,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,A,t,n,o,a){if(n&&!a&&e.some(l=>l.isPending))return n.setDisabled();let r=KCA(e,A);if(!r.length)return n&&e.some(l=>l.isPending)?n.setDisabled():null;let s=A.facet(br).selectOnOpen?0:-1;if(n&&n.selected!=s&&n.selected!=-1){let l=n.options[n.selected].completion;for(let g=0;gg.hasResult()?Math.min(l,g.from):l,1e8),create:HCA,above:o.aboveCursor},n?n.timestamp:Date.now(),s,!1)}map(e){return new i(this.options,this.attrs,Oe(oA({},this.tooltip),{pos:e.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}setDisabled(){return new i(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}},_S=class i{constructor(e,A,t){this.active=e,this.id=A,this.open=t}static start(){return new i(YCA,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:A}=e,t=A.facet(br),o=(t.override||A.languageDataAt("autocomplete",QI(A)).map(RCA)).map(s=>(this.active.find(g=>g.source==s)||new Z0(s,this.active.some(g=>g.state!=0)?1:0)).update(e,t));o.length==this.active.length&&o.every((s,l)=>s==this.active[l])&&(o=this.active);let a=this.open,r=e.effects.some(s=>s.is(NS));a&&e.docChanged&&(a=a.map(e.changes)),e.selection||o.some(s=>s.hasResult()&&e.changes.touchesRange(s.from,s.to))||!UCA(o,this.active)||r?a=kS.build(o,A,this.id,a,t,r):a&&a.disabled&&!o.some(s=>s.isPending)&&(a=null),!a&&o.every(s=>!s.isPending)&&o.some(s=>s.hasResult())&&(o=o.map(s=>s.hasResult()?new Z0(s.source,0):s));for(let s of e.effects)s.is(RS)&&(a=a&&a.setSelected(s.value,this.id));return o==this.active&&a==this.open?this:new i(o,this.id,a)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?TCA:JCA}};function UCA(i,e){if(i==e)return!0;for(let A=0,t=0;;){for(;A-1&&(A["aria-activedescendant"]=i+"-"+e),A}var YCA=[];function Dz(i,e){if(i.isUserEvent("input.complete")){let t=i.annotation(wz);if(t&&e.activateOnCompletion(t))return 12}let A=i.isUserEvent("input.type");return A&&e.activateOnTyping?5:A?1:i.isUserEvent("delete.backward")?2:i.selection?8:i.docChanged?16:0}var Z0=class i{constructor(e,A,t=!1){this.source=e,this.state=A,this.explicit=t}hasResult(){return!1}get isPending(){return this.state==1}update(e,A){let t=Dz(e,A),n=this;(t&8||t&16&&this.touches(e))&&(n=new i(n.source,0)),t&4&&n.state==0&&(n=new i(this.source,1)),n=n.updateFor(e,t);for(let o of e.effects)if(o.is(D8))n=new i(n.source,1,o.value);else if(o.is(eu))n=new i(n.source,0);else if(o.is(NS))for(let a of o.value)a.source==n.source&&(n=a);return n}updateFor(e,A){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(QI(e.state))}},y8=class i extends Z0{constructor(e,A,t,n,o,a){super(e,3,A),this.limit=t,this.result=n,this.from=o,this.to=a}hasResult(){return!0}updateFor(e,A){var t;if(!(A&3))return this.map(e.changes);let n=this.result;n.map&&!e.changes.empty&&(n=n.map(n,e.changes));let o=e.changes.mapPos(this.from),a=e.changes.mapPos(this.to,1),r=QI(e.state);if(r>a||!n||A&2&&(QI(e.startState)==this.from||rA.map(e))}}),Al=ba.define({create(){return _S.start()},update(i,e){return i.update(e)},provide:i=>[YB.from(i,e=>e.tooltip),Ii.contentAttributes.from(i,e=>e.attrs)]});function FS(i,e){let A=e.completion.apply||e.completion.label,t=i.state.field(Al).active.find(n=>n.source==e.source);return t instanceof y8?(typeof A=="string"?i.dispatch(Oe(oA({},xCA(i.state,A,t.from,t.to)),{annotations:wz.of(e.completion)})):A(i,e.completion,t.from,t.to),!0):!1}var HCA=LCA(Al,FS);function f8(i,e="option"){return A=>{let t=A.state.field(Al,!1);if(!t||!t.open||t.open.disabled||Date.now()-t.open.timestamp-1?t.open.selected+n*(i?1:-1):i?0:a-1;return r<0?r=e=="page"?0:a-1:r>=a&&(r=e=="page"?a-1:0),A.dispatch({effects:RS.of(r)}),!0}}var zCA=i=>{let e=i.state.field(Al,!1);return i.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampi.state.field(Al,!1)?(i.dispatch({effects:D8.of(!0)}),!0):!1,PCA=i=>{let e=i.state.field(Al,!1);return!e||!e.active.some(A=>A.state!=0)?!1:(i.dispatch({effects:eu.of(null)}),!0)},xS=class{constructor(e,A){this.active=e,this.context=A,this.time=Date.now(),this.updates=[],this.done=void 0}},jCA=50,qCA=1e3,VCA=No.fromClass(class{constructor(i){this.view=i,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of i.state.field(Al).active)e.isPending&&this.startQuery(e)}update(i){let e=i.state.field(Al),A=i.state.facet(br);if(!i.selectionSet&&!i.docChanged&&i.startState.field(Al)==e)return;let t=i.transactions.some(o=>{let a=Dz(o,A);return a&8||(o.selection||o.docChanged)&&!(a&3)});for(let o=0;ojCA&&Date.now()-a.time>qCA){for(let r of a.context.abortListeners)try{r()}catch(s){yr(this.view.state,s)}a.context.abortListeners=null,this.running.splice(o--,1)}else a.updates.push(...i.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),i.transactions.some(o=>o.effects.some(a=>a.is(D8)))&&(this.pendingStart=!0);let n=this.pendingStart?50:A.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(o=>o.isPending&&!this.running.some(a=>a.active.source==o.source))?setTimeout(()=>this.startUpdate(),n):-1,this.composing!=0)for(let o of i.transactions)o.isUserEvent("input.type")?this.composing=2:this.composing==2&&o.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:i}=this.view,e=i.field(Al);for(let A of e.active)A.isPending&&!this.running.some(t=>t.active.source==A.source)&&this.startQuery(A);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(br).updateSyncTime))}startQuery(i){let{state:e}=this.view,A=QI(e),t=new m8(e,A,i.explicit,this.view),n=new xS(i,t);this.running.push(n),Promise.resolve(i.source(t)).then(o=>{n.context.aborted||(n.done=o||null,this.scheduleAccept())},o=>{this.view.dispatch({effects:eu.of(null)}),yr(this.view.state,o)})}scheduleAccept(){this.running.every(i=>i.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(br).updateSyncTime))}accept(){var i;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],A=this.view.state.facet(br),t=this.view.state.field(Al);for(let n=0;nr.source==o.active.source);if(a&&a.isPending)if(o.done==null){let r=new Z0(o.active.source,0);for(let s of o.updates)r=r.update(s,A);r.isPending||e.push(r)}else this.startQuery(a)}(e.length||t.open&&t.open.disabled)&&this.view.dispatch({effects:NS.of(e)})}},{eventHandlers:{blur(i){let e=this.view.state.field(Al,!1);if(e&&e.tooltip&&this.view.state.facet(br).closeOnBlur){let A=e.open&&h9(this.view,e.open.tooltip);(!A||!A.dom.contains(i.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:eu.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:D8.of(!1)}),20),this.composing=0}}}),WCA=typeof navigator=="object"&&/Win/.test(navigator.platform),ZCA=zg.highest(Ii.domEventHandlers({keydown(i,e){let A=e.state.field(Al,!1);if(!A||!A.open||A.open.disabled||A.open.selected<0||i.key.length>1||i.ctrlKey&&!(WCA&&i.altKey)||i.metaKey)return!1;let t=A.open.options[A.open.selected],n=A.active.find(a=>a.source==t.source),o=t.completion.commitCharacters||n.result.commitCharacters;return o&&o.indexOf(i.key)>-1&&FS(e,t),!1}})),XCA=Ii.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"\xB7\xB7\xB7"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'\u0192'"}},".cm-completionIcon-class":{"&:after":{content:"'\u25CB'"}},".cm-completionIcon-interface":{"&:after":{content:"'\u25CC'"}},".cm-completionIcon-variable":{"&:after":{content:"'\u{1D465}'"}},".cm-completionIcon-constant":{"&:after":{content:"'\u{1D436}'"}},".cm-completionIcon-type":{"&:after":{content:"'\u{1D461}'"}},".cm-completionIcon-enum":{"&:after":{content:"'\u222A'"}},".cm-completionIcon-property":{"&:after":{content:"'\u25A1'"}},".cm-completionIcon-keyword":{"&:after":{content:"'\u{1F511}\uFE0E'"}},".cm-completionIcon-namespace":{"&:after":{content:"'\u25A2'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});var tu={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},hI=$i.define({map(i,e){let A=e.mapPos(i,-1,Tr.TrackAfter);return A??void 0}}),LS=new class extends $l{};LS.startSide=1;LS.endSide=-1;var yz=ba.define({create(){return oo.empty},update(i,e){if(i=i.map(e.changes),e.selection){let A=e.state.doc.lineAt(e.selection.main.head);i=i.update({filter:t=>t>=A.from&&t<=A.to})}for(let A of e.effects)A.is(hI)&&(i=i.update({add:[LS.range(A.value,A.value+1)]}));return i}});function vz(){return[A2A,yz]}var vS="()[]{}<>\xAB\xBB\xBB\xAB\uFF3B\uFF3D\uFF5B\uFF5D";function bz(i){for(let e=0;e{if(($CA?i.composing:i.compositionStarted)||i.state.readOnly)return!1;let n=i.state.selection.main;if(t.length>2||t.length==2&&pl(Or(t,0))==1||e!=n.from||A!=n.to)return!1;let o=t2A(i.state,t);return o?(i.dispatch(o),!0):!1}),e2A=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let t=Mz(i,i.selection.main.head).brackets||tu.brackets,n=null,o=i.changeByRange(a=>{if(a.empty){let r=i2A(i.doc,a.head);for(let s of t)if(s==r&&v8(i.doc,a.head)==bz(Or(s,0)))return{changes:{from:a.head-s.length,to:a.head+s.length},range:Ce.cursor(a.head-s.length)}}return{range:n=a}});return n||e(i.update(o,{scrollIntoView:!0,userEvent:"delete.backward"})),!n},Sz=[{key:"Backspace",run:e2A}];function t2A(i,e){let A=Mz(i,i.selection.main.head),t=A.brackets||tu.brackets;for(let n of t){let o=bz(Or(n,0));if(e==n)return o==n?a2A(i,n,t.indexOf(n+n+n)>-1,A):n2A(i,n,o,A.before||tu.before);if(e==o&&kz(i,i.selection.main.from))return o2A(i,n,o)}return null}function kz(i,e){let A=!1;return i.field(yz).between(0,i.doc.length,t=>{t==e&&(A=!0)}),A}function v8(i,e){let A=i.sliceString(e,e+2);return A.slice(0,pl(Or(A,0)))}function i2A(i,e){let A=i.sliceString(e-2,e);return pl(Or(A,0))==A.length?A:A.slice(1)}function n2A(i,e,A,t){let n=null,o=i.changeByRange(a=>{if(!a.empty)return{changes:[{insert:e,from:a.from},{insert:A,from:a.to}],effects:hI.of(a.to+e.length),range:Ce.range(a.anchor+e.length,a.head+e.length)};let r=v8(i.doc,a.head);return!r||/\s/.test(r)||t.indexOf(r)>-1?{changes:{insert:e+A,from:a.head},effects:hI.of(a.head+e.length),range:Ce.cursor(a.head+e.length)}:{range:n=a}});return n?null:i.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function o2A(i,e,A){let t=null,n=i.changeByRange(o=>o.empty&&v8(i.doc,o.head)==A?{changes:{from:o.head,to:o.head+A.length,insert:A},range:Ce.cursor(o.head+A.length)}:t={range:o});return t?null:i.update(n,{scrollIntoView:!0,userEvent:"input.type"})}function a2A(i,e,A,t){let n=t.stringPrefixes||tu.stringPrefixes,o=null,a=i.changeByRange(r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:e,from:r.to}],effects:hI.of(r.to+e.length),range:Ce.range(r.anchor+e.length,r.head+e.length)};let s=r.head,l=v8(i.doc,s),g;if(l==e){if(pz(i,s))return{changes:{insert:e+e,from:s},effects:hI.of(s+e.length),range:Ce.cursor(s+e.length)};if(kz(i,s)){let I=A&&i.sliceDoc(s,s+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:s,to:s+I.length,insert:I},range:Ce.cursor(s+I.length)}}}else{if(A&&i.sliceDoc(s-2*e.length,s)==e+e&&(g=fz(i,s-2*e.length,n))>-1&&pz(i,g))return{changes:{insert:e+e+e+e,from:s},effects:hI.of(s+e.length),range:Ce.cursor(s+e.length)};if(i.charCategorizer(s)(l)!=Jo.Word&&fz(i,s,n)>-1&&!r2A(i,s,e,n))return{changes:{insert:e+e,from:s},effects:hI.of(s+e.length),range:Ce.cursor(s+e.length)}}return{range:o=r}});return o?null:i.update(a,{scrollIntoView:!0,userEvent:"input.type"})}function pz(i,e){let A=vr(i).resolveInner(e+1);return A.parent&&A.from==e}function r2A(i,e,A,t){let n=vr(i).resolveInner(e,-1),o=t.reduce((a,r)=>Math.max(a,r.length),0);for(let a=0;a<5;a++){let r=i.sliceDoc(n.from,Math.min(n.to,n.from+A.length+o)),s=r.indexOf(A);if(!s||s>-1&&t.indexOf(r.slice(0,s))>-1){let g=n.firstChild;for(;g&&g.from==n.from&&g.to-g.from>A.length+s;){if(i.sliceDoc(g.to-A.length,g.to)==A)return!1;g=g.firstChild}return!0}let l=n.to==e&&n.parent;if(!l)break;n=l}return!1}function fz(i,e,A){let t=i.charCategorizer(e);if(t(i.sliceDoc(e-1,e))!=Jo.Word)return e;for(let n of A){let o=e-n.length;if(i.sliceDoc(o,e)==n&&t(i.sliceDoc(o-1,o))!=Jo.Word)return o}return-1}function _z(i={}){return[ZCA,Al,br.of(i),VCA,s2A,XCA]}var GS=[{key:"Ctrl-Space",run:yS},{mac:"Alt-`",run:yS},{mac:"Alt-i",run:yS},{key:"Escape",run:PCA},{key:"ArrowDown",run:f8(!0)},{key:"ArrowUp",run:f8(!1)},{key:"PageDown",run:f8(!0,"page")},{key:"PageUp",run:f8(!1,"page")},{key:"Enter",run:zCA}],s2A=zg.highest(JB.computeN([br],i=>i.facet(br).defaultKeymap?[GS]:[]));function l2A(i,e=i.state){let A=new Set;for(let{from:t,to:n}of i.visibleRanges){let o=t;for(;o<=n;){let a=e.doc.lineAt(o);A.has(a)||A.add(a),o=a.to+1}}return A}function KS(i){let e=i.selection.main.head;return i.doc.lineAt(e)}function xz(i,e){let A=0;A:for(let t=0;t=o.level&&this.markerType!=="codeOnly"?this.set(e,0,n.level):n.empty&&n.level===0&&o.level!==0?this.set(e,0,0):o.level>n.level?this.set(e,0,n.level+1):this.set(e,0,o.level)}let A=xz(e.text,this.state.tabSize),t=Math.floor(A/this.unitWidth);return this.set(e,A,t)}closestNonEmpty(e,A){let t=e.number+A;for(;A===-1?t>=1:t<=this.state.doc.lines;){if(this.has(t)){let a=this.get(t);if(!a.empty)return a}let o=this.state.doc.line(t);if(o.text.trim().length){let a=xz(o.text,this.state.tabSize),r=Math.floor(a/this.unitWidth);return this.set(o,a,r)}t+=A}let n=this.state.doc.line(A===-1?1:this.state.doc.lines);return this.set(n,0,0)}findAndSetActiveLines(){let e=KS(this.state);if(!this.has(e))return;let A=this.get(e);if(this.has(A.line.number+1)){let o=this.get(A.line.number+1);o.level>A.level&&(A=o)}if(this.has(A.line.number-1)){let o=this.get(A.line.number-1);o.level>A.level&&(A=o)}if(A.level===0)return;A.active=A.level;let t,n;for(t=A.line.number;t>1;t--){if(!this.has(t-1))continue;let o=this.get(t-1);if(o.level0&&s.push(b8("--indent-marker-bg-color",t,e,r,l)),s.push(b8("--indent-marker-active-bg-color",n,e,a-1,1)),a!==o&&s.push(b8("--indent-marker-bg-color",t,e,a,o-a))}else s.push(b8("--indent-marker-bg-color",t,e,r,o-r));return s.join(",")}var TS=class{constructor(e){this.view=e,this.unitWidth=Xg(e.state),this.currentLineNumber=KS(e.state).number,this.generate(e.state)}update(e){let A=Xg(e.state),t=A!==this.unitWidth;t&&(this.unitWidth=A);let n=KS(e.state).number,o=n!==this.currentLineNumber;this.currentLineNumber=n;let a=e.state.facet(M8).highlightActiveBlock&&o;(e.docChanged||e.viewportChanged||t||a)&&this.generate(e.state)}generate(e){let A=new Yr,t=l2A(this.view,e),{hideFirstIndent:n,markerType:o,thickness:a,activeThickness:r}=e.facet(M8),s=new US(t,e,this.unitWidth,o);for(let l of t){let g=s.get(l.number);if(!g?.level)continue;let C=c2A(g,this.unitWidth,n,a,r);A.add(l.from,l.from,kt.line({class:"cm-indent-markers",attributes:{style:`--indent-markers: ${C}`}}))}this.decorations=A.finish()}};function Rz(i={}){return[M8.of(i),g2A(i.colors),No.fromClass(TS,{decorations:e=>e.decorations})]}var C2A=["mainAxis","crossAxis","fallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment"],I2A=["mainAxis","crossAxis","limiter"];function ZP(i,e){if(i==null)return{};var A,t,n=(function(a,r){if(a==null)return{};var s={};for(var l in a)if({}.hasOwnProperty.call(a,l)){if(r.indexOf(l)!==-1)continue;s[l]=a[l]}return s})(i,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(i);for(t=0;t{};function f2A(i){return i()}function Bk(i){for(var e=0;e{i=A,e=t}),resolve:i,reject:e}}var m2A=1<<24,LE=16,ww=32,ij=64,Wk=128,rc=512,Pr=1024,sc=2048,BC=4096,g0=8192,GE=16384,Zk=32768,xI=65536,w2A=1<<17,nj=1<<18,oj=1<<19,AC=1<<25,tw=32768,Ek=1<<21,F2=1<<23,c0=Symbol("$state"),aj=Symbol("legacy props"),D2A=Symbol(""),gE=new class extends Error{constructor(){super(...arguments),a0(this,"name","StaleReactionError"),a0(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};function _u(i){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function rj(i){return i===this.v}function sj(i,e){return i!=i?e==e:i!==e||i!==null&&typeof i=="object"||typeof i=="function"}function lj(i){return!sj(i,this.v)}var Bo=null;function wE(i){Bo=i}function H2(i){return gj().get(i)}function Ft(i){Bo={p:Bo,i:!1,c:null,e:null,s:i,x:null,l:FE&&!(arguments.length>1&&arguments[1]!==void 0&&arguments[1])?{s:null,u:null,$:[]}:null}}function Lt(i){var e=Bo,A=e.e;if(A!==null)for(var t of(e.e=null,A))bj(t);return i!==void 0&&(e.x=i),e.i=!0,Bo=e.p,i??{}}function KE(){return!FE||Bo!==null&&Bo.l===null}function gj(i){var e,A;return Bo===null&&_u(),(A=(e=Bo).c)!==null&&A!==void 0?A:e.c=new Map((function(t){for(var n=t.p;n!==null;){var o=n.c;if(o!==null)return o;n=n.p}return null})(Bo)||void 0)}var vI=[];function cj(){var i=vI;vI=[],Bk(i)}function RI(i){if(vI.length===0&&!du){var e=vI;queueMicrotask(()=>{e===vI&&cj()})}vI.push(i)}function y2A(){for(;vI.length>0;)cj()}function Cj(i){var e=Zn;if(e===null)return Wn.f|=F2,i;if((e.f&Zk)===0){if((e.f&Wk)===0)throw i;e.b.error(i)}else DE(i,e)}function DE(i,e){for(;e!==null;){if((e.f&Wk)!==0)try{return void e.b.error(i)}catch(A){i=A}e=e.parent}throw i}var q8=new Set,Oo=null,Iu=null,gg=null,lg=[],Dw=null,hk=!1,du=!1,iw=new WeakMap,S8=new WeakMap,mI=new WeakMap,wI=new WeakMap,k8=new WeakMap,V8=new WeakMap,W8=new WeakMap,vl=new WeakSet,NI=class i{constructor(){XP(this,vl),a0(this,"committed",!1),a0(this,"current",new Map),a0(this,"previous",new Map),Do(this,iw,new Set),Do(this,S8,new Set),Do(this,mI,0),Do(this,wI,0),Do(this,k8,null),Do(this,V8,[]),Do(this,W8,[]),a0(this,"skipped_effects",new Set),a0(this,"is_fork",!1)}is_deferred(){return this.is_fork||Me(wI,this)>0}process(e){lg=[],Iu=null,this.apply();var A,t={parent:null,effect:null,effects:[],render_effects:[],block_effects:[]};for(var n of e)qa(vl,this,Ij).call(this,n,t);this.is_fork||qa(vl,this,v2A).call(this),this.is_deferred()?(qa(vl,this,EE).call(this,t.effects),qa(vl,this,EE).call(this,t.render_effects),qa(vl,this,EE).call(this,t.block_effects)):(Iu=this,Oo=null,Uz(t.render_effects),Uz(t.effects),Iu=null,(A=Me(k8,this))===null||A===void 0||A.resolve()),gg=null}capture(e,A){var t;this.previous.has(e)||this.previous.set(e,A),(e.f&F2)===0&&(this.current.set(e,e.v),(t=gg)===null||t===void 0||t.set(e,e.v))}activate(){Oo=this,this.apply()}deactivate(){Oo===this&&(Oo=null,gg=null)}flush(){if(this.activate(),lg.length>0){if(Bj(),Oo!==null&&Oo!==this)return}else Me(mI,this)===0&&this.process([]);this.deactivate()}discard(){for(var e of Me(S8,this))e(this);Me(S8,this).clear()}increment(e){En(mI,this,Me(mI,this)+1),e&&En(wI,this,Me(wI,this)+1)}decrement(e){En(mI,this,Me(mI,this)-1),e&&En(wI,this,Me(wI,this)-1),this.revive()}revive(){for(var e of Me(V8,this))qr(e,sc),FI(e);for(var A of Me(W8,this))qr(A,BC),FI(A);En(V8,this,[]),En(W8,this,[]),this.flush()}oncommit(e){Me(iw,this).add(e)}ondiscard(e){Me(S8,this).add(e)}settled(){var e;return((e=Me(k8,this))!==null&&e!==void 0?e:En(k8,this,tj())).promise}static ensure(){if(Oo===null){var e=Oo=new i;q8.add(Oo),du||i.enqueue(()=>{Oo===e&&e.flush()})}return Oo}static enqueue(e){RI(e)}apply(){}};function Ij(i,e){i.f^=Pr;for(var A=i.first;A!==null;){var t,n=A.f,o=!!(96&n),a=o&&(n&Pr)!==0||(n&g0)!==0||this.skipped_effects.has(A);if((A.f&Wk)!==0&&(t=A.b)!==null&&t!==void 0&&t.is_pending()&&(e={parent:e,effect:A,effects:[],render_effects:[],block_effects:[]}),!a&&A.fn!==null){o?A.f^=Pr:4&n?e.effects.push(A):JE(A)&&((A.f&LE)!==0&&e.block_effects.push(A),bE(A));var r=A.first;if(r!==null){A=r;continue}}var s=A.parent;for(A=A.next;A===null&&s!==null;)s===e.effect&&(qa(vl,this,EE).call(this,e.effects),qa(vl,this,EE).call(this,e.render_effects),qa(vl,this,EE).call(this,e.block_effects),e=e.parent),A=s.next,s=s.parent}}function EE(i){for(var e of i)((e.f&sc)!==0?Me(V8,this):Me(W8,this)).push(e),qa(vl,this,dj).call(this,e.deps),qr(e,Pr)}function dj(i){if(i!==null)for(var e of i)2&e.f&&(e.f&tw)!==0&&(e.f^=tw,qa(vl,this,dj).call(this,e.deps))}function v2A(){if(Me(wI,this)===0){for(var i of Me(iw,this))i();Me(iw,this).clear()}Me(mI,this)===0&&qa(vl,this,b2A).call(this)}function b2A(){if(q8.size>1){this.previous.clear();var i=gg,e=!0,A={parent:null,effect:null,effects:[],render_effects:[],block_effects:[]};for(var t of q8)if(t!==this){var n=[];for(var[o,a]of this.current){if(t.current.has(o)){if(!e||a===t.current.get(o))continue;t.current.set(o,a)}n.push(o)}if(n.length!==0){var r=[...t.current.keys()].filter(B=>!this.current.has(B));if(r.length>0){var s=lg;lg=[];var l=new Set,g=new Map;for(var C of n)Ej(C,r,l,g);if(lg.length>0){for(var I of(Oo=t,t.apply(),lg))qa(vl,t,Ij).call(t,I,A);t.deactivate()}lg=s}}}else e=!1;Oo=null,gg=i}this.committed=!0,q8.delete(this)}function Fo(i){var e=du;du=!0;try{for(;;){var A;if(y2A(),lg.length===0&&((A=Oo)===null||A===void 0||A.flush(),lg.length===0))return void(Dw=null);Bj()}}finally{du=e}}function Bj(){var i=MI;hk=!0;try{var e=0;for(nw(!0);lg.length>0;){var A=NI.ensure();e++>1e3&&M2A(),A.process(lg),L2.clear()}}finally{hk=!1,nw(i),Dw=null}}function M2A(){try{(function(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")})()}catch(i){DE(i,Dw)}}var tC=null;function Uz(i){var e=i.length;if(e!==0){for(var A=0;A0)){for(var o of(L2.clear(),tC))if(!(24576&o.f)){for(var a=[o],r=o.parent;r!==null;)tC.has(r)&&(tC.delete(r),a.push(r)),r=r.parent;for(var s=a.length-1;s>=0;s--){var l=a[s];24576&l.f||bE(l)}}tC.clear()}}tC=null}}function Ej(i,e,A,t){if(!A.has(i)&&(A.add(i),i.reactions!==null))for(var n of i.reactions){var o=n.f;2&o?Ej(n,e,A,t):4194320&o&&(o&sc)===0&&hj(n,e,t)&&(qr(n,sc),FI(n))}}function hj(i,e,A){var t=A.get(i);if(t!==void 0)return t;if(i.deps!==null)for(var n of i.deps){if(e.includes(n))return!0;if(2&n.f&&hj(n,e,A))return A.set(n,!0),!0}return A.set(i,!1),!1}function FI(i){for(var e=Dw=i;e.parent!==null;){var A=(e=e.parent).f;if(hk&&e===Zn&&(A&LE)!==0&&(A&nj)===0)return;if(96&A){if((A&Pr)===0)return;e.f^=Pr}}lg.push(e)}var v2=new WeakMap,_2=new WeakMap,S2A=new WeakMap,DI=new WeakMap,OS=new WeakMap,k2=new WeakMap,b2=new WeakMap,oC=new WeakMap,f2=new WeakMap,bI=new WeakMap,hE=new WeakMap,$B=new WeakMap,QE=new WeakMap,nu=new WeakMap,AE=new WeakMap,Tz=new WeakMap,w2=new WeakSet,Qk=class{constructor(e,A,t){var n,o,a,r;XP(this,w2),a0(this,"parent",void 0),Do(this,v2,!1),Do(this,_2,void 0),Do(this,S2A,null),Do(this,DI,void 0),Do(this,OS,void 0),Do(this,k2,void 0),Do(this,b2,null),Do(this,oC,null),Do(this,f2,null),Do(this,bI,null),Do(this,hE,null),Do(this,$B,0),Do(this,QE,0),Do(this,nu,!1),Do(this,AE,null),Do(this,Tz,(n=()=>(En(AE,this,EC(Me($B,this))),()=>{En(AE,this,null)}),a=0,r=EC(0),()=>{Eu()&&(c(r),UE(()=>(a===0&&(o=uA(()=>n(()=>Bu(r)))),a+=1,()=>{RI(()=>{var s;(a-=1)==0&&((s=o)===null||s===void 0||s(),o=void 0,Bu(r))})})))})),En(_2,this,e),En(DI,this,A),En(OS,this,t),this.parent=Zn.b,En(v2,this,!!Me(DI,this).pending),En(k2,this,TE(()=>{Zn.b=this;var s=qa(w2,this,k2A).call(this);try{En(b2,this,C0(()=>t(s)))}catch(l){this.error(l)}return Me(QE,this)>0?qa(w2,this,Yz).call(this):En(v2,this,!1),()=>{var l;(l=Me(hE,this))===null||l===void 0||l.remove()}},589952))}is_pending(){return Me(v2,this)||!!this.parent&&this.parent.is_pending()}has_pending_snippet(){return!!Me(DI,this).pending}update_pending_count(e){qa(w2,this,Qj).call(this,e),En($B,this,Me($B,this)+e),Me(AE,this)&&yE(Me(AE,this),Me($B,this))}get_effect_pending(){return Me(Tz,this).call(this),c(Me(AE,this))}error(e){var A=Me(DI,this).onerror,t=Me(DI,this).failed;if(Me(nu,this)||!A&&!t)throw e;Me(b2,this)&&(jr(Me(b2,this)),En(b2,this,null)),Me(oC,this)&&(jr(Me(oC,this)),En(oC,this,null)),Me(f2,this)&&(jr(Me(f2,this)),En(f2,this,null));var n=!1,o=!1,a=()=>{n?console.warn("https://svelte.dev/e/svelte_boundary_reset_noop"):(n=!0,o&&(function(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")})(),NI.ensure(),En($B,this,0),Me(f2,this)!==null&&vE(Me(f2,this),()=>{En(f2,this,null)}),En(v2,this,this.has_pending_snippet()),En(b2,this,qa(w2,this,Jz).call(this,()=>(En(nu,this,!1),C0(()=>Me(OS,this).call(this,Me(_2,this)))))),Me(QE,this)>0?qa(w2,this,Yz).call(this):En(v2,this,!1))},r=Wn;try{ol(null),o=!0,A?.(e,a),o=!1}catch(s){DE(s,Me(k2,this)&&Me(k2,this).parent)}finally{ol(r)}t&&RI(()=>{En(f2,this,qa(w2,this,Jz).call(this,()=>{NI.ensure(),En(nu,this,!0);try{return C0(()=>{t(Me(_2,this),()=>e,()=>a)})}catch(s){return DE(s,Me(k2,this).parent),null}finally{En(nu,this,!1)}}))})}};function k2A(){var i=Me(_2,this);return Me(v2,this)&&(En(hE,this,G2()),Me(_2,this).before(Me(hE,this)),i=Me(hE,this)),i}function Jz(i){var e=Zn,A=Wn,t=Bo;Cg(Me(k2,this)),ol(Me(k2,this)),wE(Me(k2,this).ctx);try{return i()}catch(n){return Cj(n),null}finally{Cg(e),ol(A),wE(t)}}function Yz(){var i=Me(DI,this).pending;Me(b2,this)!==null&&(En(bI,this,document.createDocumentFragment()),Me(bI,this).append(Me(hE,this)),Fj(Me(b2,this),Me(bI,this))),Me(oC,this)===null&&En(oC,this,C0(()=>i(Me(_2,this))))}function Qj(i){var e;this.has_pending_snippet()?(En(QE,this,Me(QE,this)+i),Me(QE,this)===0&&(En(v2,this,!1),Me(oC,this)&&vE(Me(oC,this),()=>{En(oC,this,null)}),Me(bI,this)&&(Me(_2,this).before(Me(bI,this)),En(bI,this,null)))):this.parent&&qa(w2,e=this.parent,Qj).call(e,i)}function uj(i,e,A,t){var n=KE()?xu:at;if(A.length!==0||i.length!==0){var o=Oo,a=Zn,r=(function(){var l=Zn,g=Wn,C=Bo,I=Oo;return function(){var B=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];Cg(l),ol(g),wE(C),B&&I?.activate()}})();i.length>0?Promise.all(i).then(()=>{r();try{return s()}finally{o?.deactivate(),_8()}}):s()}else t(e.map(n));function s(){Promise.all(A.map(l=>(function(g){var C=Zn;C===null&&(function(){throw new Error("https://svelte.dev/e/async_derived_orphan")})();var I=C.b,B=void 0,Q=EC(zr),h=!Wn,f=new Map;return(function(m){gc(4718592,m,!0)})(()=>{var m=tj();B=m.promise;try{Promise.resolve(g()).then(m.resolve,m.reject).then(()=>{v===Oo&&v.committed&&v.deactivate(),_8()})}catch(x){m.reject(x),_8()}var v=Oo;if(h){var S,k=!I.is_pending();I.update_pending_count(1),v.increment(k),(S=f.get(v))===null||S===void 0||S.reject(gE),f.delete(v),f.set(v,m)}var M=function(x){var F=arguments.length>1&&arguments[1]!==void 0?arguments[1]:void 0;if(v.activate(),F)F!==gE&&(Q.f|=F2,yE(Q,F));else for(var[z,P]of((Q.f&F2)!==0&&(Q.f^=F2),yE(Q,x),f)){if(f.delete(z),z===v)break;P.reject(gE)}h&&(I.update_pending_count(-1),v.decrement(k))};m.promise.then(M,x=>M(null,x||"unknown"))}),vw(()=>{for(var m of f.values())m.reject(gE)}),new Promise(m=>{function v(S){function k(){S===B?m(Q):v(B)}S.then(k,k)}v(B)})})(l))).then(l=>{r();try{t([...e.map(n),...l])}catch(g){(a.f&GE)===0&&DE(g,a)}o?.deactivate(),_8()}).catch(l=>{DE(l,a)})}}function _8(){Cg(null),ol(null),wE(null)}function xu(i){var e=Wn!==null&&2&Wn.f?Wn:null;return Zn!==null&&(Zn.f|=oj),{ctx:Bo,deps:null,effects:null,equals:rj,f:2050,fn:i,reactions:null,rv:0,v:zr,wv:0,parent:e??Zn,ac:null}}function tl(i){var e=xu(i);return Lj(e),e}function at(i){var e=xu(i);return e.equals=lj,e}function pj(i){var e=i.effects;if(e!==null){i.effects=null;for(var A=0;A1&&arguments[1]!==void 0&&arguments[1],n=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],o=EC(i);return t||(o.equals=lj),FE&&n&&Bo!==null&&Bo.l!==null&&((A=(e=Bo.l).s)!==null&&A!==void 0?A:e.s=[]).push(o),o}function Ml(i,e){return N(i,uA(()=>c(i))),e}function N(i,e){var A,t=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return Wn===null||s0&&(Wn.f&w2A)===0||!KE()||!(4325394&Wn.f)||(A=CC)!==null&&A!==void 0&&A.includes(i)||(function(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")})(),yE(i,t?cE(e):e)}function yE(i,e){if(!i.equals(e)){var A=i.v;YI?L2.set(i,e):L2.set(i,A),i.v=e;var t=NI.ensure();t.capture(i,A),2&i.f&&((i.f&sc)!==0&&Xk(i),qr(i,(i.f&rc)!==0?Pr:BC)),i.wv=Kj(),yj(i,sc),!KE()||Zn===null||(Zn.f&Pr)===0||96&Zn.f||(og===null?(function(n){og=n})([i]):og.push(i)),!t.is_fork&&HS.size>0&&!Oz&&(function(){Oz=!1;var n=MI;nw(!0);var o=Array.from(HS);try{for(var a of o)(a.f&Pr)!==0&&qr(a,BC),JE(a)&&bE(a)}finally{nw(n)}HS.clear()})()}return e}function Hz(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=c(i),t=e===1?A++:A--;return N(i,A),t}function Bu(i){N(i,i.v+1)}function yj(i,e){var A=i.reactions;if(A!==null)for(var t=KE(),n=A.length,o=0;o{if(SI===o)return r();var s=Wn,l=SI;ol(null),qz(o);var g=r();return ol(s),qz(l),g};return t&&A.set("length",eC(i.length)),new Proxy(i,{defineProperty(r,s,l){"value"in l&&l.configurable!==!1&&l.enumerable!==!1&&l.writable!==!1||(function(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")})();var g=A.get(s);return g===void 0?g=a(()=>{var C=eC(l.value);return A.set(s,C),C}):N(g,l.value,!0),!0},deleteProperty(r,s){var l=A.get(s);if(l===void 0){if(s in r){var g=a(()=>eC(zr));A.set(s,g),Bu(n)}}else N(l,zr),Bu(n);return!0},get(r,s,l){var g;if(s===c0)return i;var C=A.get(s),I=s in r;if(C===void 0&&(!I||(g=gC(r,s))!==null&&g!==void 0&&g.writable)&&(C=a(()=>eC(cE(I?r[s]:zr))),A.set(s,C)),C!==void 0){var B=c(C);return B===zr?void 0:B}return Reflect.get(r,s,l)},getOwnPropertyDescriptor(r,s){var l=Reflect.getOwnPropertyDescriptor(r,s);if(l&&"value"in l){var g=A.get(s);g&&(l.value=c(g))}else if(l===void 0){var C=A.get(s),I=C?.v;if(C!==void 0&&I!==zr)return{enumerable:!0,configurable:!0,value:I,writable:!0}}return l},has(r,s){var l;if(s===c0)return!0;var g=A.get(s),C=g!==void 0&&g.v!==zr||Reflect.has(r,s);return(g!==void 0||Zn!==null&&(!C||(l=gC(r,s))!==null&&l!==void 0&&l.writable))&&(g===void 0&&(g=a(()=>eC(C?cE(r[s]):zr)),A.set(s,g)),c(g)===zr)?!1:C},set(r,s,l,g){var C,I=A.get(s),B=s in r;if(t&&s==="length")for(var Q=l;QeC(zr)),A.set(Q+"",h))}I===void 0?(!B||(C=gC(r,s))!==null&&C!==void 0&&C.writable)&&(N(I=a(()=>eC(void 0)),cE(l)),A.set(s,I)):(B=I.v!==zr,N(I,a(()=>cE(l))));var f=Reflect.getOwnPropertyDescriptor(r,s);if(f!=null&&f.set&&f.set.call(g,l),!B){if(t&&typeof s=="string"){var m=A.get("length"),v=Number(s);Number.isInteger(v)&&v>=m.v&&N(m,v+1)}Bu(n)}return!0},ownKeys(r){c(n);var s=Reflect.ownKeys(r).filter(C=>{var I=A.get(C);return I===void 0||I.v!==zr});for(var[l,g]of A)g.v===zr||l in r||s.push(l);return s},setPrototypeOf(){(function(){throw new Error("https://svelte.dev/e/state_prototype_fixed")})()}})}function zz(i){try{if(i!==null&&typeof i=="object"&&c0 in i)return i[c0]}catch(e){}return i}function _2A(i,e){return Object.is(zz(i),zz(e))}function G2(){var i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";return document.createTextNode(i)}function Sl(i){return wj.call(i)}function Ru(i){return Dj.call(i)}function gA(i,e){return Sl(i)}function it(i){var e=Sl(i);return e instanceof Comment&&e.data===""?Ru(e):e}function kA(i){for(var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=i;e--;)A=Ru(A);return A}var Pz=!1;function yw(i){var e=Wn,A=Zn;ol(null),Cg(null);try{return i()}finally{ol(e),Cg(A)}}function x2A(i,e,A){var t=arguments.length>3&&arguments[3]!==void 0?arguments[3]:A;i.addEventListener(e,()=>yw(A));var n=i.__on_r;i.__on_r=n?()=>{n(),t(!0)}:()=>t(!0),Pz||(Pz=!0,document.addEventListener("reset",o=>{Promise.resolve().then(()=>{if(!o.defaultPrevented)for(var a of o.target.elements){var r;(r=a.__on_r)===null||r===void 0||r.call(a)}})},{capture:!0}))}function vj(i){Zn===null&&(Wn===null&&(function(){throw new Error("https://svelte.dev/e/effect_orphan")})(),(function(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")})()),YI&&(function(){throw new Error("https://svelte.dev/e/effect_in_teardown")})()}function gc(i,e,A){var t=Zn;t!==null&&(t.f&g0)!==0&&(i|=g0);var n={ctx:Bo,deps:null,nodes:null,f:i|sc|rc,first:null,fn:e,last:null,next:null,parent:t,b:t&&t.b,prev:null,teardown:null,wv:0,ac:null};if(A)try{bE(n),n.f|=Zk}catch(s){throw jr(n),s}else e!==null&&FI(n);var o=n;if(A&&o.deps===null&&o.teardown===null&&o.nodes===null&&o.first===o.last&&(o.f&oj)===0&&(o=o.first,(i&LE)!==0&&(i&xI)!==0&&o!==null&&(o.f|=xI)),o!==null&&(o.parent=t,t!==null&&(function(s,l){var g=l.last;g===null?l.last=l.first=s:(g.next=s,s.prev=g,l.last=s)})(o,t),Wn!==null&&2&Wn.f&&(i&ij)===0)){var a,r=Wn;((a=r.effects)!==null&&a!==void 0?a:r.effects=[]).push(o)}return n}function Eu(){return Wn!==null&&!s0}function vw(i){var e=gc(8,null,!1);return qr(e,Pr),e.teardown=i,e}function uk(i){vj();var e=Zn.f;if(!(!Wn&&(e&ww)!==0&&(e&Zk)===0))return bj(i);var A,t=Bo;((A=t.e)!==null&&A!==void 0?A:t.e=[]).push(i)}function bj(i){return gc(1048580,i,!1)}function Mr(i){return gc(4,i,!1)}function KA(i,e){var A={effect:null,ran:!1,deps:i};Bo.l.$.push(A),A.effect=UE(()=>{i(),A.ran||(A.ran=!0,uA(e))})}function Ln(){var i=Bo;UE(()=>{for(var e of i.l.$){e.deps();var A=e.effect;(A.f&Pr)!==0&&qr(A,BC),JE(A)&&bE(A),e.ran=!1}})}function UE(i){return gc(8|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),i,!0)}function _e(i){uj(arguments.length>3&&arguments[3]!==void 0?arguments[3]:[],arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],e=>{gc(8,()=>i(...e.map(c)),!0)})}function TE(i){return gc(LE|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),i,!0)}function Mj(i){return gc(m2A|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),i,!0)}function C0(i){return gc(524320,i,!0)}function Sj(i){var e=i.teardown;if(e!==null){var A=YI,t=Wn;jz(!0),ol(null);try{e.call(null)}finally{jz(A),ol(t)}}}function kj(i){var e=arguments.length>1&&arguments[1]!==void 0&&arguments[1],A=i.first;i.first=i.last=null;for(var t,n=function(){var o=A.ac;o!==null&&yw(()=>{o.abort(gE)}),t=A.next,(A.f&ij)!==0?A.parent=null:jr(A,e),A=t};A!==null;)n()}function jr(i){var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=!1;!e&&(i.f&nj)===0||i.nodes===null||i.nodes.end===null||(_j(i.nodes.start,i.nodes.end),A=!0),kj(i,e&&!A),ow(i,0),qr(i,GE);var t=i.nodes&&i.nodes.t;if(t!==null)for(var n of t)n.stop();Sj(i);var o=i.parent;o!==null&&o.first!==null&&xj(i),i.next=i.prev=i.teardown=i.ctx=i.deps=i.fn=i.nodes=i.ac=null}function _j(i,e){for(;i!==null;){var A=i===e?null:Ru(i);i.remove(),i=A}}function xj(i){var e=i.parent,A=i.prev,t=i.next;A!==null&&(A.next=t),t!==null&&(t.prev=A),e!==null&&(e.first===i&&(e.first=t),e.last===i&&(e.last=A))}function vE(i,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],t=[];Rj(i,t,!0);var n=()=>{A&&jr(i),e&&e()},o=t.length;if(o>0){var a=()=>--o||n();for(var r of t)r.out(a)}else n()}function Rj(i,e,A){if((i.f&g0)===0){i.f^=g0;var t=i.nodes&&i.nodes.t;if(t!==null)for(var n of t)(n.is_global||A)&&e.push(n);for(var o=i.first;o!==null;){var a=o.next;Rj(o,e,((o.f&xI)!==0||(o.f&ww)!==0&&(i.f&LE)!==0)&&A),o=a}}}function pk(i){Nj(i,!0)}function Nj(i,e){if((i.f&g0)!==0){i.f^=g0,(i.f&Pr)===0&&(qr(i,sc),FI(i));for(var A=i.first;A!==null;){var t=A.next;Nj(A,((A.f&xI)!==0||(A.f&ww)!==0)&&e),A=t}var n=i.nodes&&i.nodes.t;if(n!==null)for(var o of n)(o.is_global||e)&&o.in()}}function Fj(i,e){if(i.nodes)for(var A=i.nodes.start,t=i.nodes.end;A!==null;){var n=A===t?null:Ru(A);e.append(A),A=n}}var R2A=null;var MI=!1;function nw(i){MI=i}var YI=!1;function jz(i){YI=i}var Wn=null,s0=!1;function ol(i){Wn=i}var Zn=null;function Cg(i){Zn=i}var CC=null;function Lj(i){Wn!==null&&(CC===null?CC=[i]:CC.push(i))}var bs=null,yl=0,og=null,Gj=1,hu=0,SI=hu;function qz(i){SI=i}function Kj(){return++Gj}function JE(i){var e=i.f;if((e&sc)!==0)return!0;if(2&e&&(i.f&=-32769),(e&BC)!==0){var A=i.deps;if(A!==null)for(var t=A.length,n=0;ni.wv)return!0}(e&rc)!==0&&gg===null&&qr(i,Pr)}return!1}function Uj(i,e){var A,t=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],n=i.reactions;if(n!==null&&((A=CC)===null||A===void 0||!A.includes(i)))for(var o=0;o{i.ac.abort(gE)}),i.ac=null);try{i.f|=Ek;var g=(0,i.fn)(),C=i.deps;if(bs!==null){var I;if(ow(i,yl),C!==null&&yl>0)for(C.length=yl+bs.length,I=0;I1&&arguments[1]!==void 0?arguments[1]:new Set;if(!(typeof i!="object"||i===null||i instanceof EventTarget||e.has(i))){for(var A in e.add(i),i instanceof Date&&i.getTime(),i)try{fk(i[A],e)}catch(r){}var t=Vk(i);if(t!==Object.prototype&&t!==Array.prototype&&t!==Map.prototype&&t!==Set.prototype&&t!==Date.prototype){var n=ej(t);for(var o in n){var a=n[o].get;if(a)try{a.call(i)}catch(r){}}}}}var zj=new Set,mk=new Set;function Pj(i,e,A){var t=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};function n(o){if(t.capture||lu.call(e,o),!o.cancelBubble)return yw(()=>A?.call(this,o))}return i.startsWith("pointer")||i.startsWith("touch")||i==="wheel"?RI(()=>{e.addEventListener(i,n,t)}):e.addEventListener(i,n,t),n}function we(i,e,A,t,n){var o={capture:t,passive:n},a=Pj(i,e,A,o);(e===document.body||e===window||e===document||e instanceof HTMLMediaElement)&&vw(()=>{e.removeEventListener(i,a,o)})}function Nu(i){for(var e=0;ea||t});var C=Wn,I=Zn;ol(null),Cg(null);try{for(var B,Q=[];a!==null;){var h=a.assignedSlot||a.parentNode||a.host||null;try{var f=a["__"+n];f==null||a.disabled&&i.target!==a||f.call(a,i)}catch(S){B?Q.push(S):B=S}if(i.cancelBubble||h===A||h===null)break;a=h}if(B){var m=function(S){queueMicrotask(()=>{throw S})};for(var v of Q)m(v);throw B}}finally{i.__root=A,delete i.currentTarget,ol(C),Cg(I)}}}function $k(i){var e=document.createElement("template");return e.innerHTML=i.replaceAll("",""),e.content}function LI(i,e){var A=Zn;A.nodes===null&&(A.nodes={start:i,end:e,a:null,t:null})}function TA(i,e){var A,t=!!(1&e),n=!!(2&e),o=!i.startsWith("");return()=>{A===void 0&&(A=$k(o?i:""+i),t||(A=Sl(A)));var a=n||mj?document.importNode(A,!0):A.cloneNode(!0);return t?LI(Sl(a),a.lastChild):LI(a,a),a}}function z2(i,e){return(function(A,t){var n,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"svg",a=!A.startsWith(""),r=!!(1&t),s="<".concat(o,">").concat(a?A:""+A,"");return()=>{if(!n){var l=Sl($k(s));if(r)for(n=document.createDocumentFragment();Sl(l);)n.appendChild(Sl(l));else n=Sl(l)}var g=n.cloneNode(!0);return r?LI(Sl(g),g.lastChild):LI(g,g),g}})(i,e,"svg")}function cr(){var i=G2((arguments.length>0&&arguments[0]!==void 0?arguments[0]:"")+"");return LI(i,i),i}function Gi(){var i=document.createDocumentFragment(),e=document.createComment(""),A=G2();return i.append(e,A),LI(e,A),i}function sA(i,e){i!==null&&i.before(e)}var L2A=["beforeinput","click","change","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"],G2A={formnovalidate:"formNoValidate",ismap:"isMap",nomodule:"noModule",playsinline:"playsInline",readonly:"readOnly",defaultvalue:"defaultValue",defaultchecked:"defaultChecked",srcobject:"srcObject",novalidate:"noValidate",allowfullscreen:"allowFullscreen",disablepictureinpicture:"disablePictureInPicture",disableremoteplayback:"disableRemotePlayback"},K2A=["touchstart","touchmove"];function U2A(i){return K2A.includes(i)}function Gt(i,e){var A,t=e==null?"":typeof e=="object"?e+"":e;t!==((A=i.__t)!==null&&A!==void 0?A:i.__t=i.nodeValue)&&(i.__t=t,i.nodeValue=t+"")}function T2A(i,e){return(function(A,t){var{target:n,anchor:o,props:a={},events:r,context:s,intro:l=!0}=t;(function(){if(cC===void 0){cC=window,mj=/Firefox/.test(navigator.userAgent);var Q=Element.prototype,h=Node.prototype,f=Text.prototype;wj=gC(h,"firstChild").get,Dj=gC(h,"nextSibling").get,Kz(Q)&&(Q.__click=void 0,Q.__className=void 0,Q.__attributes=null,Q.__style=void 0,Q.__e=void 0),Kz(f)&&(f.__t=void 0)}})();var g=new Set,C=Q=>{for(var h=0;h0&&arguments[0]!==void 0?arguments[0]:{};return new Promise(m=>{f.outro?vE(h,()=>{jr(h),m(void 0)}):(jr(h),m(void 0))})}})(()=>{var Q=o??n.appendChild(G2());return(function(h,f,m){new Qk(h,f,m)})(Q,{pending:()=>{}},h=>{s&&(Ft({}),Bo.c=s),r&&(a.$$events=r),I=A(h,a)||{},s&&Lt()}),()=>{for(var h of g){n.removeEventListener(h,lu);var f=eE.get(h);--f===0?(document.removeEventListener(h,lu),eE.delete(h)):eE.set(h,f)}var m;mk.delete(C),Q!==o&&((m=Q.parentNode)===null||m===void 0||m.removeChild(Q))}});return wk.set(I,B),I})(i,e)}var eE=new Map,wk=new WeakMap,tE,X0=new WeakMap,uI=new WeakMap,$0=new WeakMap,ou=new WeakMap,zS=new WeakMap,Vz=new WeakMap,J2A=new WeakMap,ME=class{constructor(e){var A=this,t=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];a0(this,"anchor",void 0),Do(this,X0,new Map),Do(this,uI,new Map),Do(this,$0,new Map),Do(this,ou,new Set),Do(this,zS,!0),Do(this,Vz,()=>{var n=Oo;if(Me(X0,this).has(n)){var o=Me(X0,this).get(n),a=Me(uI,this).get(o);if(a)pk(a),Me(ou,this).delete(o);else{var r=Me($0,this).get(o);r&&(Me(uI,this).set(o,r.effect),Me($0,this).delete(o),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),a=r.effect)}for(var[s,l]of Me(X0,this)){if(Me(X0,this).delete(s),s===n)break;var g=Me($0,this).get(l);g&&(jr(g.effect),Me($0,this).delete(l))}var C=function(Q,h){if(Q===o||Me(ou,A).has(Q))return 1;var f=()=>{if(Array.from(Me(X0,A).values()).includes(Q)){var m=document.createDocumentFragment();Fj(h,m),m.append(G2()),Me($0,A).set(Q,{effect:h,fragment:m})}else jr(h);Me(ou,A).delete(Q),Me(uI,A).delete(Q)};Me(zS,A)||!a?(Me(ou,A).add(Q),vE(h,f,!1)):f()};for(var[I,B]of Me(uI,this))C(I,B)}}),Do(this,J2A,n=>{Me(X0,this).delete(n);var o=Array.from(Me(X0,this).values());for(var[a,r]of Me($0,this))o.includes(a)||(jr(r.effect),Me($0,this).delete(a))}),this.anchor=e,En(zS,this,t)}ensure(e,A){var t=Oo;!A||Me(uI,this).has(e)||Me($0,this).has(e)||Me(uI,this).set(e,C0(()=>A(this.anchor))),Me(X0,this).set(t,e),Me(Vz,this).call(this)}};function Vr(i){Bo===null&&_u(),FE&&Bo.l!==null?jj(Bo).m.push(i):uk(()=>{var e=uA(i);if(typeof e=="function")return e})}function Ig(i){Bo===null&&_u(),Vr(()=>()=>uA(i))}function Y2A(){var i=Bo;return i===null&&_u(),(e,A,t)=>{var n,o=(n=i.s.$$events)===null||n===void 0?void 0:n[e];if(o){var a=ku(o)?o.slice():[o],r=(function(l,g){var{bubbles:C=!1,cancelable:I=!1}=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return new CustomEvent(l,{detail:g,bubbles:C,cancelable:I})})(e,A,t);for(var s of a)s.call(i.x,r);return!r.defaultPrevented}return!0}}function O2A(i){Bo===null&&_u(),Bo.l===null&&(function(){throw new Error("https://svelte.dev/e/lifecycle_legacy_only")})(),jj(Bo).b.push(i)}function jj(i){var e,A=i.l;return(e=A.u)!==null&&e!==void 0?e:A.u={a:[],b:[],m:[]}}function zA(i,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],t=new ME(i);function n(o,a){t.ensure(o,a)}TE(()=>{var o=!1;e(function(a){o=!0,n(!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],a)}),o||n(!1,null)},A?xI:0)}function qj(i,e,A){var t=new ME(i),n=!KE();TE(()=>{var o=e();n&&o!==null&&typeof o=="object"&&(o={}),t.ensure(o,A)})}function Sa(i,e){return e}function PS(i){for(var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=0;A5&&arguments[5]!==void 0?arguments[5]:null,a=i,r=new Map;!(4&e)||(a=i.appendChild(G2()));var s,l=null,g=at(()=>{var h=A();return ku(h)?h:h==null?[]:j8(h)}),C=!0;function I(){Q.fallback=l,(function(h,f,m,v,S){var k,M,x,F,z,P=!!(8&v),Z=f.length,AA=h.items,W=h.effect.first,CA=null,wA=[],BA=[];if(P)for(z=0;z0){var OA=4&v&&Z===0?m:null;if(P){for(z=0;z{if(Ne){if(Ne.pending.delete(ft),Ne.done.add(ft),Ne.pending.size===0){var Fe=pA.outrogroups;PS(j8(Ne.done)),Fe.delete(Ne),Fe.size===0&&(pA.outrogroups=null)}}else DA-=1},!1)},pt=0;pt{if(M!==void 0)for(F of M){var pA;(pA=F.nodes)===null||pA===void 0||(pA=pA.a)===null||pA===void 0||pA.apply()}})})(Q,s,a,e,t),l!==null&&(s.length===0?(l.f&AC)===0?pk(l):(l.f^=AC,au(l,null,a)):vE(l,()=>{l=null}))}var B=TE(()=>{for(var h=(s=c(g)).length,f=new Set,m=0;mo(a)):(l=C0(()=>o(tE??(tE=G2())))).f|=AC),C||I(),c(g)}),Q={effect:B,items:r,outrogroups:null,fallback:l};C=!1}function H2A(i,e,A,t,n,o,a,r){var s=1&a?16&a?EC(A):cA(A,!1,!1):null,l=2&a?EC(n):null;return{v:s,i:l,e:C0(()=>(o(e,s??A,l??n,r),()=>{i.delete(t)}))}}function au(i,e,A){if(i.nodes)for(var t=i.nodes.start,n=i.nodes.end,o=e&&(e.f&AC)===0?e.nodes.start:A;t!==null;){var a=Ru(t);if(o.before(t),t===n)return;t=a}}function m2(i,e,A){e===null?i.effect.first=A:e.next=A,A===null?i.effect.last=e:A.prev=e}function Vj(i,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],t=arguments.length>3&&arguments[3]!==void 0&&arguments[3],n=i,o="";_e(()=>{var a,r=Zn;if(o!==(o=(a=e())!==null&&a!==void 0?a:"")&&(r.nodes!==null&&(_j(r.nodes.start,r.nodes.end),r.nodes=null),o!=="")){var s=o+"";A?s="".concat(s,""):t&&(s="".concat(s,""));var l=$k(s);if((A||t)&&(l=Sl(l)),LI(Sl(l),l.lastChild),A||t)for(;Sl(l);)n.before(Sl(l));else n.before(l)}})}function Ca(i,e,A,t,n){var o,a=(o=e.$$slots)===null||o===void 0?void 0:o[A],r=!1;a===!0&&(a=e[A==="default"?"children":A],r=!0),a===void 0?n!==null&&n(i):a(i,r?()=>t:t)}function Wj(i,e,A){var t=new ME(i);TE(()=>{var n,o=(n=e())!==null&&n!==void 0?n:null;t.ensure(o,o&&(a=>A(a,o)))},xI)}function Es(i,e,A){Mr(()=>{var t=uA(()=>e(i,A?.())||{});if(A&&t!=null&&t.update){var n=!1,o={};UE(()=>{var a=A();J(a),n&&sj(o,a)&&(o=a,t.update(a))}),n=!0}if(t!=null&&t.destroy)return()=>t.destroy()})}function z2A(i,e){var A,t=void 0;Mj(()=>{t!==(t=e())&&(A&&(jr(A),A=null),t&&(A=C0(()=>{Mr(()=>t(i))})))})}function Zj(i){var e,A,t="";if(typeof i=="string"||typeof i=="number")t+=i;else if(typeof i=="object")if(Array.isArray(i)){var n=i.length;for(e=0;e1&&arguments[1]!==void 0&&arguments[1]?" !important;":";",A="";for(var t in i){var n=i[t];n!=null&&n!==""&&(A+=" "+t+": "+n+e)}return A}function jS(i){return i[0]!=="-"||i[1]!=="-"?i.toLowerCase():i}function oi(i,e,A,t,n,o){var a=i.__className;if(a!==A||a===void 0){var r=(function(g,C,I){var B=g==null?"":""+g;if(C&&(B=B?B+" "+C:C),I){for(var Q in I)if(I[Q])B=B?B+" "+Q:Q;else if(B.length)for(var h=Q.length,f=0;(f=B.indexOf(Q,f))>=0;){var m=f+h;f!==0&&!Wz.includes(B[f-1])||m!==B.length&&!Wz.includes(B[m])?f=m:B=(f===0?"":B.substring(0,f))+B.substring(m+1)}}return B===""?null:B})(A,t,o);r==null?i.removeAttribute("class"):e?i.className=r:i.setAttribute("class",r),i.__className=A}else if(o&&n!==o)for(var s in o){var l=!!o[s];n!=null&&l===!!n[s]||i.classList.toggle(s,l)}return o}function qS(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},A=arguments.length>2?arguments[2]:void 0,t=arguments.length>3?arguments[3]:void 0;for(var n in A){var o=A[n];e[n]!==o&&(A[n]==null?i.style.removeProperty(n):i.style.setProperty(n,o,t))}}function cg(i,e,A,t){if(i.__style!==e){var n=(function(o,a){if(a){var r,s,l="";if(Array.isArray(a)?(r=a[0],s=a[1]):r=a,o){o=String(o).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var g=!1,C=0,I=!1,B=[];r&&B.push(...Object.keys(r).map(jS)),s&&B.push(...Object.keys(s).map(jS));for(var Q=0,h=-1,f=o.length,m=0;m2&&arguments[2]!==void 0&&arguments[2];if(i.multiple){if(e==null)return;if(!ku(e))return void console.warn("https://svelte.dev/e/select_multiple_invalid_value");for(var t of i.options)t.selected=e.includes(Xz(t))}else{for(t of i.options)if(_2A(Xz(t),e))return void(t.selected=!0);A&&e===void 0||(i.selectedIndex=-1)}}function P2A(i){var e=new MutationObserver(()=>{Dk(i,i.__value)});e.observe(i,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),vw(()=>{e.disconnect()})}function Xz(i){return"__value"in i?i.__value:i.value}var sE=Symbol("class"),ru=Symbol("style"),Xj=Symbol("is custom element"),$j=Symbol("is html");function GI(i,e){var A=A_(i);A.value!==(A.value=e??void 0)&&(i.value!==e||e===0&&i.nodeName==="PROGRESS")&&(i.value=e??"")}function Fn(i,e,A,t){var n=A_(i);n[e]!==(n[e]=A)&&(e==="loading"&&(i[D2A]=A),A==null?i.removeAttribute(e):typeof A!="string"&&Aq(i).includes(e)?i[e]=A:i.setAttribute(e,A))}function j2A(i,e,A,t){var n,o=A_(i),a=o[Xj],r=!o[$j],s=e||{},l=i.tagName==="OPTION";for(var g in e)g in A||(A[g]=null);A.class?A.class=J2(A.class):(t||A[sE])&&(A.class=null),A[ru]&&((n=A.style)!==null&&n!==void 0||(A.style=null));var C,I,B,Q,h,f,m=Aq(i),v=function(k){var M=A[k];if(l&&k==="value"&&M==null)return i.value=i.__value="",s[k]=M,0;if(k==="class")return C=i.namespaceURI==="http://www.w3.org/1999/xhtml",oi(i,C,M,t,e?.[sE],A[sE]),s[k]=M,s[sE]=A[sE],0;if(k==="style")return cg(i,M,e?.[ru],A[ru]),s[k]=M,s[ru]=A[ru],0;if(M===(I=s[k])&&(M!==void 0||!i.hasAttribute(k))||(s[k]=M,(B=k[0]+k[1])==="$$"))return 0;if(B==="on"){var x={},F="$$"+k,z=k.slice(2);if(Q=(function(wA){return L2A.includes(wA)})(z),(function(wA){return wA.endsWith("capture")&&wA!=="gotpointercapture"&&wA!=="lostpointercapture"})(z)&&(z=z.slice(0,-7),x.capture=!0),!Q&&I){if(M!=null)return 0;i.removeEventListener(z,s[F],x),s[F]=null}if(M!=null)if(Q)i["__".concat(z)]=M,Nu([z]);else{let wA=function(BA){s[k].call(this,BA)};var CA=wA;s[F]=Pj(z,i,wA,x)}else Q&&(i["__".concat(z)]=void 0)}else if(k==="style")Fn(i,k,M);else if(k==="autofocus")(function(wA,BA){if(BA){var QA=document.body;wA.autofocus=!0,RI(()=>{document.activeElement===QA&&wA.focus()})}})(i,!!M);else if(a||k!=="__value"&&(k!=="value"||M==null))if(k==="selected"&&l)(function(wA,BA){BA?wA.hasAttribute("selected")||wA.setAttribute("selected",""):wA.removeAttribute("selected")})(i,M);else if(h=k,r||(h=(function(wA){var BA;return wA=wA.toLowerCase(),(BA=G2A[wA])!==null&&BA!==void 0?BA:wA})(h)),f=h==="defaultValue"||h==="defaultChecked",M!=null||a||f)f||m.includes(h)&&(a||typeof M!="string")?(i[h]=M,h in o&&(o[h]=zr)):typeof M!="function"&&Fn(i,h,M);else if(o[k]=null,h==="value"||h==="checked"){var P=i,Z=e===void 0;if(h==="value"){var AA=P.defaultValue;P.removeAttribute(h),P.defaultValue=AA,P.value=P.__value=Z?AA:null}else{var W=P.defaultChecked;P.removeAttribute(h),P.defaultChecked=W,P.checked=!!Z&&W}}else i.removeAttribute(k);else i.value=i.__value=M};for(var S in A)v(S);return s}function Z8(i,e){var A=arguments.length>5?arguments[5]:void 0,t=arguments.length>6&&arguments[6]!==void 0&&arguments[6],n=arguments.length>7&&arguments[7]!==void 0&&arguments[7];uj(arguments.length>4&&arguments[4]!==void 0?arguments[4]:[],arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],arguments.length>3&&arguments[3]!==void 0?arguments[3]:[],o=>{var a=void 0,r={},s=i.nodeName==="SELECT",l=!1;if(Mj(()=>{var C=e(...o.map(c)),I=j2A(i,a,C,A,t,n);for(var B of(l&&s&&"value"in C&&Dk(i,C.value),Object.getOwnPropertySymbols(r)))C[B]||jr(r[B]);for(var Q of Object.getOwnPropertySymbols(C)){var h=C[Q];Q.description!=="@attach"||a&&h===a[Q]||(r[Q]&&jr(r[Q]),r[Q]=C0(()=>z2A(i,()=>h))),I[Q]=h}a=I}),s){var g=i;Mr(()=>{Dk(g,a.value,!0),P2A(g)})}l=!0})}function A_(i){var e;return(e=i.__attributes)!==null&&e!==void 0?e:i.__attributes={[Xj]:i.nodeName.includes("-"),[$j]:i.namespaceURI==="http://www.w3.org/1999/xhtml"}}var $z=new Map;function Aq(i){var e,A=i.getAttribute("is")||i.nodeName,t=$z.get(A);if(t)return t;$z.set(A,t=[]);for(var n=i,o=Element.prototype;o!==n;){for(var a in e=ej(n))e[a].set&&t.push(a);n=Vk(n)}return t}function aw(i,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e,t=new WeakSet;x2A(i,"input",(function(){var n=Pt(function*(o){var a=o?i.defaultValue:i.value;if(a=VS(i)?WS(a):a,A(a),Oo!==null&&t.add(Oo),yield Jj(),a!==(a=e())){var r=i.selectionStart,s=i.selectionEnd,l=i.value.length;if(i.value=a??"",s!==null){var g=i.value.length;r===s&&s===l&&g>l?(i.selectionStart=g,i.selectionEnd=g):(i.selectionStart=r,i.selectionEnd=Math.min(s,g))}}});return function(o){return n.apply(this,arguments)}})()),uA(e)==null&&i.value&&(A(VS(i)?WS(i.value):i.value),Oo!==null&&t.add(Oo)),UE(()=>{var n=e();if(i===document.activeElement){var o=Iu??Oo;if(t.has(o))return}VS(i)&&n===WS(i.value)||(i.type!=="date"||n||i.value)&&n!==i.value&&(i.value=n??"")})}function VS(i){var e=i.type;return e==="number"||e==="range"}function WS(i){return i===""?null:+i}function qt(i,e,A){var t=gC(i,e);t&&t.set&&(i[e]=A,vw(()=>{i[e]=null}))}function AP(i,e){return i===e||i?.[c0]===e}function Ho(){var i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,A=arguments.length>2?arguments[2]:void 0;return Mr(()=>{var t,n;return UE(()=>{t=n,n=[],uA(()=>{i!==A(...n)&&(e(i,...n),t&&AP(A(...t),i)&&e(null,...t))})}),()=>{RI(()=>{n&&AP(A(...n),i)&&e(null,...n)})}}),i}function iC(i){return function(){for(var e=arguments.length,A=new Array(e),t=0;t0&&arguments[0]!==void 0&&arguments[0],e=Bo,A=e.l.u;if(A){var t,n=()=>J(e.s);if(i){var o=0,a={},r=xu(()=>{var s=!1,l=e.s;for(var g in l)l[g]!==a[g]&&(a[g]=l[g],s=!0);return s&&o++,o});n=()=>c(r)}A.b.length&&(t=()=>{eP(e,n),Bk(A.b)},vj(),gc(1048584,t,!0)),uk(()=>{var s=uA(()=>A.m.map(f2A));return()=>{for(var l of s)typeof l=="function"&&l()}}),A.a.length&&uk(()=>{eP(e,n),Bk(A.a)})}}function eP(i,e){if(i.l.s)for(var A of i.l.s)c(A);e()}function bw(i){var e=EC(0);return function(){return arguments.length===1?(N(e,c(e)+1),arguments[0]):(c(e),i())}}function gu(i,e){var A,t=(A=i.$$events)===null||A===void 0?void 0:A[e.type],n=ku(t)?t.slice():t==null?[]:[t];for(var o of n)o.call(this,e)}var x8=!1,q2A={get(i,e){if(!i.exclude.includes(e))return c(i.version),e in i.special?i.special[e]():i.props[e]},set(i,e,A){if(!(e in i.special)){var t=Zn;try{Cg(i.parent_effect),i.special[e]=L({get[e](){return i.props[e]}},e,4)}finally{Cg(t)}}return i.special[e](A),Hz(i.version),!0},getOwnPropertyDescriptor(i,e){if(!i.exclude.includes(e))return e in i.props?{enumerable:!0,configurable:!0,value:i.props[e]}:void 0},deleteProperty:(i,e)=>(i.exclude.includes(e)||(i.exclude.push(e),Hz(i.version)),!0),has:(i,e)=>!i.exclude.includes(e)&&e in i.props,ownKeys:i=>Reflect.ownKeys(i.props).filter(e=>!i.exclude.includes(e))};function R8(i,e){return new Proxy({props:i,exclude:e,special:{},version:EC(0),parent_effect:Zn},q2A)}var V2A={get(i,e){for(var A=i.props.length;A--;){var t=i.props[A];if(iu(t)&&(t=t()),typeof t=="object"&&t!==null&&e in t)return t[e]}},set(i,e,A){for(var t=i.props.length;t--;){var n=i.props[t];iu(n)&&(n=n());var o=gC(n,e);if(o&&o.set)return o.set(A),!0}return!1},getOwnPropertyDescriptor(i,e){for(var A=i.props.length;A--;){var t=i.props[A];if(iu(t)&&(t=t()),typeof t=="object"&&t!==null&&e in t){var n=gC(t,e);return n&&!n.configurable&&(n.configurable=!0),n}}},has(i,e){if(e===c0||e===aj)return!1;for(var A of i.props)if(iu(A)&&(A=A()),A!=null&&e in A)return!0;return!1},ownKeys(i){var e=[];for(var A of i.props)if(iu(A)&&(A=A()),A){for(var t in A)e.includes(t)||e.push(t);for(var n of Object.getOwnPropertySymbols(A))e.includes(n)||e.push(n)}return e}};function K2(){for(var i=arguments.length,e=new Array(i),A=0;A(g&&(g=!1,l=s?uA(t):t),l);if(r){var I,B,Q=c0 in i||aj in i;n=(I=(B=gC(i,e))===null||B===void 0?void 0:B.set)!==null&&I!==void 0?I:Q&&e in i?M=>i[e]=M:void 0}var h,f=!1;if(r?[o,f]=(function(M){var x=x8;try{return x8=!1,[M(),x8]}finally{x8=x}})(()=>i[e]):o=i[e],o===void 0&&t!==void 0&&(o=C(),n&&(a&&(function(){throw new Error("https://svelte.dev/e/props_invalid_value")})(),n(o))),h=a?()=>{var M=i[e];return M===void 0?C():(g=!0,M)}:()=>{var M=i[e];return M!==void 0&&(l=void 0),M===void 0?l:M},a&&!(4&A))return h;if(n){var m=i.$$legacy;return function(M,x){return arguments.length>0?(a&&x&&!m&&!f||n(x?h():M),M):h()}}var v=!1,S=(1&A?xu:at)(()=>(v=!1,h()));r&&c(S);var k=Zn;return function(M,x){if(arguments.length>0){var F=x?c(S):a&&r?cE(M):M;return N(S,F),v=!0,l!==void 0&&(l=F),M}return YI&&v||(k.f&GE)!==0?S.v:c(S)}}function tr(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:(function(t){var n=(function(o){try{if(typeof window<"u"&&window.localStorage!==void 0)return window.localStorage[o]}catch(a){}})("debug");return n!=null&&n.endsWith("*")?t.startsWith(n.slice(0,-1)):t===n})(i);if(!e)return W2A;var A=(function(t){for(var n=0,o=0;o9466848e5&&isFinite(i)&&Math.floor(i)===i&&!isNaN(new Date(i).valueOf());if(typeof i=="bigint")return yk(Number(i));try{var e=i&&i.valueOf();if(e!==i)return yk(e)}catch(A){return!1}return!1}function eq(i){(N8=N8||window.document.createElement("div")).style.color="",N8.style.color=i;var e=N8.style.color;return e!==""?e.replace(/\s+/g,"").toLowerCase():void 0}var N8=void 0;function A1A(i){return typeof i=="string"&&i.length<99&&!!eq(i)}function t_(i,e){if(typeof i=="number"||typeof i=="string"||typeof i=="boolean"||i===void 0)return typeof i;if(typeof i=="bigint")return"number";if(i===null)return"null";if(Array.isArray(i))return"array";if(Sn(i))return"object";var A=e.stringify(i);return A&&e_(A)?"number":A==="true"||A==="false"?"boolean":A==="null"?"null":"unknown"}var e1A=/^https?:\/\/\S+$/;function Mw(i){return typeof i=="string"&&e1A.test(i)}function YE(i,e){if(i==="")return"";var A=i.trim();return A==="null"?null:A==="true"||A!=="false"&&(e_(A)?e.parse(A):i)}var t1A=[];function iP(i,e){if(i.length!==e.length)return!1;for(var A=0;A1&&arguments[1]!==void 0&&arguments[1],A={};if(!Array.isArray(i))throw new TypeError("Array expected");function t(a,r){(!Array.isArray(a)&&!Sn(a)||e&&r.length>0)&&(A[bt(r)]=!0),Sn(a)&&Object.keys(a).forEach(s=>{t(a[s],r.concat(s))})}for(var n=Math.min(i.length,1e4),o=0;oe?i.slice(0,e):i}function nP(i){return ke({},i)}function oP(i){return Object.values(i)}function aP(i,e,A,t){var n=i.slice(0),o=n.splice(e,A);return n.splice.apply(n,[e+t,0,...o]),n}function i1A(i,e,A){return i.slice(0,e).concat(A).concat(i.slice(e))}function Fu(i,e){try{return e.parse(i)}catch(A){return e.parse(Xl(i))}}function iq(i,e){try{return Fu(i,e)}catch(A){return}}function Lu(i,e){i=i.replace(oq,"");try{return e(i)}catch(A){}try{return e("{"+i+"}")}catch(A){}try{return e("["+i+"]")}catch(A){}throw new Error("Failed to parse partial JSON")}function nq(i){i=i.replace(oq,"");try{return Xl(i)}catch(t){}try{var e=Xl("["+i+"]");return e.substring(1,e.length-1)}catch(t){}try{var A=Xl("{"+i+"}");return A.substring(1,A.length-1)}catch(t){}throw new Error("Failed to repair partial JSON")}var oq=/,\s*$/;function SE(i,e){var A=sP.exec(e);if(A){var t=Sr(A[2]),n=(function(B,Q){for(var h=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:B.length,m=0,v=h;v"line ".concat(n+1," column ").concat(o+1))}}var a=r1A.exec(e),r=a?Sr(a[1]):void 0,s=r!==void 0?r-1:void 0,l=s1A.exec(e),g=l?Sr(l[1]):void 0,C=g!==void 0?g-1:void 0,I=s!==void 0&&C!==void 0?(function(B,Q,h){for(var f=B.indexOf(` +`),m=1;m1&&arguments[1]!==void 0?arguments[1]:void 0,A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:JSON;return Qu(i)?i:{text:A.stringify(i.json,null,e)}}function rP(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:JSON;return uu(i)?i:{json:e.parse(i.text)}}function bk(i,e,A){return n1A(i,e,A).text}function o1A(i,e){return a1A(i,e)>e}function a1A(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1/0;if(Qu(i))return i.text.length;var A=i.json,t=0;return(function n(o){if(Array.isArray(o)){if((t+=o.length-1+2)>e)return;for(var a=0;ae)return}else if(Sn(o)){var r=Object.keys(o);t+=2+r.length+(r.length-1);for(var s=0;srq(gq(String(i))),unescapeValue:i=>cq(sq(i))},c1A={escapeValue:i=>gq(String(i)),unescapeValue:i=>cq(i)},C1A={escapeValue:i=>rq(String(i)),unescapeValue:i=>sq(i)},I1A={escapeValue:i=>String(i),unescapeValue:i=>i};function rq(i){return i.replace(/[^\x20-\x7F]/g,e=>{var A;return e==="\b"||e==="\f"||e===` +`||e==="\r"||e===" "?e:"\\u"+("000"+((A=e.codePointAt(0))===null||A===void 0?void 0:A.toString(16))).slice(-4)})}function sq(i){return i.replace(/\\u[a-fA-F0-9]{4}/g,e=>{try{var A=JSON.parse('"'+e+'"');return lq[A]||A}catch(t){return e}})}var lq={'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},d1A={'\\"':'"',"\\\\":"\\","\\/":"/","\\b":"\b","\\f":"\f","\\n":` +`,"\\r":"\r","\\t":" "};function gq(i){return i.replace(/["\b\f\n\r\t\\]/g,e=>lq[e]||e)}function cq(i){return i.replace(/\\["bfnrt\\]/g,e=>d1A[e]||e)}function kE(i){return typeof i!="string"?String(i):i.endsWith(` +`)?i+` +`:i}function Cq(i,e){return OE(i,A=>A.nodeName.toUpperCase()===e.toUpperCase())}function x2(i,e,A){return OE(i,t=>(function(n,o,a){return typeof n.getAttribute=="function"&&n.getAttribute(o)===a})(t,e,A))}function OE(i,e){return!!n_(i,e)}function n_(i,e){for(var A=i;A&&!e(A);)A=A.parentNode;return A}function Gu(i){var e,A;return(e=i==null||(A=i.ownerDocument)===null||A===void 0?void 0:A.defaultView)!==null&&e!==void 0?e:void 0}function o_(i){var e=Gu(i),A=e?.document.activeElement;return!!A&&OE(A,t=>t===i)}function Iq(i,e){return n_(i,A=>A.nodeName===e)}function $S(i){return x2(i,"data-type","selectable-key")?ro.key:x2(i,"data-type","selectable-value")?ro.value:x2(i,"data-type","insert-selection-area-inside")?ro.inside:x2(i,"data-type","insert-selection-area-after")?ro.after:ro.multi}function X8(i){return encodeURIComponent(bt(i))}function dq(i){var e,A=n_(i,n=>!(n==null||!n.hasAttribute)&&n.hasAttribute("data-path")),t=(e=A?.getAttribute("data-path"))!==null&&e!==void 0?e:void 0;return t?gs(decodeURIComponent(t)):void 0}function B1A(i){var{allElements:e,currentElement:A,direction:t,hasPrio:n=()=>!0,margin:o=10}=i,a=xR(e.filter(function(m){var v=m.getBoundingClientRect();return v.width>0&&v.height>0}),s),r=s(A);function s(m){var v=m.getBoundingClientRect();return{x:v.left+v.width/2,y:v.top+v.height/2,rect:v,element:m}}function l(m,v){var S=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,k=m.x-v.x,M=(m.y-v.y)*S;return Math.sqrt(k*k+M*M)}var g=m=>l(m,r);if(t==="Left"||t==="Right"){var C=t==="Left"?a.filter(m=>{return v=r,m.rect.left+o{return v=r,m.rect.right>v.rect.right+o;var v}),I=C.filter(m=>{return v=m,S=r,Math.abs(v.y-S.y)l(m,r,10));return B?.element}if(t==="Up"||t==="Down"){var Q=t==="Up"?a.filter(m=>{return v=r,m.y+o{return v=r,m.y>v.y+o;var v}),h=Q.filter(m=>n(m.element)),f=wh(h,g)||wh(Q,g);return f?.element}}function a_(){var i,e,A,t;return typeof navigator<"u"&&(i=(e=(A=navigator)===null||A===void 0||(A=A.platform)===null||A===void 0?void 0:A.toUpperCase().includes("MAC"))!==null&&e!==void 0?e:(t=navigator)===null||t===void 0||(t=t.userAgentData)===null||t===void 0||(t=t.platform)===null||t===void 0?void 0:t.toUpperCase().includes("MAC"))!==null&&i!==void 0&&i}function hC(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"+",A=[];r_(i,arguments.length>2&&arguments[2]!==void 0?arguments[2]:a_)&&A.push("Ctrl"),i.altKey&&A.push("Alt"),i.shiftKey&&A.push("Shift");var t=i.key.length===1?i.key.toUpperCase():i.key;return t in E1A||A.push(t),A.join(e)}function r_(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:a_;return i.ctrlKey||i.metaKey&&e()}var E1A={Ctrl:!0,Command:!0,Control:!0,Alt:!0,Option:!0,Shift:!0};function Xt(i,e){e===void 0&&(e={});var A=e.insertAt;if(i&&typeof document<"u"){var t=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",A==="top"&&t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n),n.styleSheet?n.styleSheet.cssText=i:n.appendChild(document.createTextNode(i))}}Xt(`.jse-absolute-popup.svelte-enkkpn { + position: relative; + left: 0; + top: 0; + width: 0; + height: 0; + z-index: 1001; +} +.jse-absolute-popup.svelte-enkkpn .jse-hidden-input:where(.svelte-enkkpn) { + position: fixed; + left: 0; + top: 0; + width: 0; + height: 0; + padding: 0; + margin: 0; + border: none; + outline: none; + overflow: hidden; +} +.jse-absolute-popup.svelte-enkkpn .jse-absolute-popup-content:where(.svelte-enkkpn) { + position: absolute; +}`);var h1A=TA('
        '),Q1A=TA('
        ');function u1A(i,e){Ft(e,!1);var A=L(e,"popup",8),t=L(e,"closeAbsolutePopup",8),n=cA(),o=cA();function a(C){A().options&&A().options.closeOnOuterClick&&!OE(C.target,I=>I===c(n))&&t()(A().id)}function r(C){hC(C)==="Escape"&&(C.preventDefault(),C.stopPropagation(),t()(A().id))}Vr(function(){c(o)&&c(o).focus()}),ai();var s=Q1A();we("mousedown",cC,function(C){a(C)},!0),we("keydown",cC,r,!0),we("wheel",cC,function(C){a(C)},!0);var l=gA(s),g=C=>{var I=h1A(),B=gA(I);Ho(B,Q=>N(o,Q),()=>c(o)),Wj(kA(B,2),()=>A().component,(Q,h)=>{h(Q,K2(()=>A().props))}),_e(Q=>cg(I,Q),[()=>(c(n),J(A()),uA(()=>(function(Q,h){var f=Q.getBoundingClientRect(),{left:m,top:v,positionAbove:S,positionLeft:k}=(function(){if(h.anchor){var{anchor:M,width:x=0,height:F=0,offsetTop:z=0,offsetLeft:P=0,position:Z}=h,{left:AA,top:W,bottom:CA,right:wA}=M.getBoundingClientRect(),BA=Z==="top"||W+F>window.innerHeight&&W>F,QA=Z==="left"||AA+x>window.innerWidth&&AA>x;return{left:QA?wA-P:AA+P,top:BA?W-z:CA+z,positionAbove:BA,positionLeft:QA}}if(typeof h.left=="number"&&typeof h.top=="number"){var{left:RA,top:IA,width:dA=0,height:_A=0}=h;return{left:RA,top:IA,positionAbove:IA+_A>window.innerHeight&&IA>_A,positionLeft:RA+dA>window.innerWidth&&RA>dA}}throw new Error('Invalid config: pass either "left" and "top", or pass "anchor"')})();return(S?"bottom: ".concat(f.top-v,"px;"):"top: ".concat(v-f.top,"px;"))+(k?"right: ".concat(f.left-m,"px;"):"left: ".concat(m-f.left,"px;"))})(c(n),A().options)))]),sA(C,I)};zA(l,C=>{c(n)&&C(g)}),Ho(s,C=>N(n,C),()=>c(n)),we("mousedown",s,function(C){C.stopPropagation()}),we("keydown",s,r),sA(i,s),Lt()}var p1A=TA(" ",1);function Mk(i,e){Ft(e,!1);var A=tr("jsoneditor:AbsolutePopup"),t=cA([],!0);function n(r){var s=c(t).findIndex(g=>g.id===r);if(s!==-1){var l=c(t)[s];l.options.onClose&&l.options.onClose(),N(t,c(t).filter(g=>g.id!==r))}}(function(r,s){gj().set(r,s)})("absolute-popup",{openAbsolutePopup:function(r,s,l){A("open...",s,l);var g={id:CE(),component:r,props:s||{},options:l||{}};return N(t,[...c(t),g]),g.id},closeAbsolutePopup:n}),KA(()=>c(t),()=>{A("popups",c(t))}),Ln(),ai(!0);var o=p1A(),a=it(o);Ia(a,1,()=>c(t),Sa,(r,s)=>{u1A(r,{get popup(){return c(s)},closeAbsolutePopup:n})}),Ca(kA(a,2),e,"default",{},null),sA(i,o),Lt()}function Ku(i,e){for(var A=new Set(e),t=i.replace(/ \(copy( \d+)?\)$/,""),n=i,o=1;A.has(n);){var a="copy"+(o>1?" "+o:"");n="".concat(t," (").concat(a,")"),o++}return n}function aC(i,e){var A=e-3;return i.length>e?i.substring(0,A)+"...":i}function f1A(i){if(i==="")return"";var e=i.toLowerCase();if(e==="null")return null;if(e==="true")return!0;if(e==="false")return!1;if(e!=="undefined"){var A=Number(i),t=parseFloat(i);return isNaN(A)||isNaN(t)?i:A}}var m1A={id:"jsonquery",name:"JSONQuery",description:` +

        + Enter a JSON Query function to filter, sort, or transform the data. + You can use functions like get, filter, + sort, pick, groupBy, uniq, etcetera. + Example query: filter(.age >= 18) +

        +`,createQuery:function(i,e){var{filter:A,sort:t,projection:n}=e,o=[];A&&A.path&&A.relation&&A.value&&o.push(["filter",[(a=A.relation,Q7("1 ".concat(a," 1"))[0]),F8(A.path),f1A(A.value)]]);var a;return t&&t.path&&t.direction&&o.push(["sort",F8(t.path),t.direction==="desc"?"desc":"asc"]),n&&n.paths&&(n.paths.length>1?o.push(["pick",...n.paths.map(F8)]):o.push(["map",F8(n.paths[0])])),mT(["pipe",...o])},executeQuery:function(i,e,A){var t=aq(A,JSON)?i:(function(n){var o=A.stringify(n);return o!==void 0?JSON.parse(o):void 0})(i);return e.trim()!==""?wT(t,e):t}};function F8(i){return["get",...i]}var w1A=z2("");function D1A(i,e){Ft(e,!1);var A=870711,t=cA(""),n=L(e,"data",8);function o(r){if(!r||!r.raw)return"";var s=r.raw,l={};return s=s.replace(/\s(?:xml:)?id=["']?([^"')\s]+)/g,(g,C)=>{var I="fa-".concat((A+=1).toString(16));return l[C]=I,' id="'.concat(I,'"')}),s=s.replace(/#(?:([^'")\s]+)|xpointer\(id\((['"]?)([^')]+)\2\)\))/g,(g,C,I,B)=>{var Q=C||B;return Q&&l[Q]?"#".concat(l[Q]):g}),s}KA(()=>J(n()),()=>{N(t,o(n()))}),Ln();var a=w1A();Vj(gA(a),()=>c(t),!0),sA(i,a),Lt()}Xt(` + .fa-icon.svelte-v67cny { + display: inline-block; + fill: currentColor; + } + .fa-flip-horizontal.svelte-v67cny { + transform: scale(-1, 1); + } + .fa-flip-vertical.svelte-v67cny { + transform: scale(1, -1); + } + .fa-spin.svelte-v67cny { + animation: svelte-v67cny-fa-spin 1s 0s infinite linear; + } + .fa-inverse.svelte-v67cny { + color: #fff; + } + .fa-pulse.svelte-v67cny { + animation: svelte-v67cny-fa-spin 1s infinite steps(8); + } + @keyframes svelte-v67cny-fa-spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } + } +`);var y1A=z2(""),v1A=z2(""),b1A=z2(""),M1A=z2("",1);function on(i,e){var A=R8(e,["children","$$slots","$$events","$$legacy"]),t=R8(A,["class","data","scale","spin","inverse","pulse","flip","label","style"]);Ft(e,!1);var n=L(e,"class",8,""),o=L(e,"data",8),a=cA(),r=L(e,"scale",8,1),s=L(e,"spin",8,!1),l=L(e,"inverse",8,!1),g=L(e,"pulse",8,!1),C=L(e,"flip",8,void 0),I=L(e,"label",8,""),B=L(e,"style",8,""),Q=cA(10),h=cA(10),f=cA(),m=cA();function v(){var k=1;return r()!==void 0&&(k=Number(r())),isNaN(k)||k<=0?(console.warn('Invalid prop: prop "scale" should be a number over 0.'),1):1*k}function S(){return c(a)?Math.max(c(a).width,c(a).height)/16:1}KA(()=>(J(o()),J(B()),J(r())),()=>{N(a,(function(k){var M;if(k){if(!("definition"in k)){if("iconName"in k&&"icon"in k){k.iconName;var[x,F,,,z]=k.icon;M={width:x,height:F,paths:(Array.isArray(z)?z:[z]).map(P=>({d:P}))}}else M=k[Object.keys(k)[0]];return M}console.error("`import faIconName from '@fortawesome/package-name/faIconName` not supported - Please use `import { faIconName } from '@fortawesome/package-name/faIconName'` instead")}})(o())),B(),r(),N(Q,c(a)?c(a).width/S()*v():0),N(h,c(a)?c(a).height/S()*v():0),N(f,(function(){var k="";B()!==null&&(k+=B());var M=v();return M===1?k.length===0?"":k:(k===""||k.endsWith(";")||(k+="; "),"".concat(k,"font-size: ").concat(M,"em"))})()),N(m,c(a)?"0 0 ".concat(c(a).width," ").concat(c(a).height):"0 0 ".concat(c(Q)," ").concat(c(h)))}),Ln(),ai(),(function(k,M){var x=R8(M,["children","$$slots","$$events","$$legacy"]),F=R8(x,["class","width","height","box","spin","inverse","pulse","flip","style","label"]),z=L(M,"class",8,""),P=L(M,"width",8),Z=L(M,"height",8),AA=L(M,"box",8,"0 0 0 0"),W=L(M,"spin",8,!1),CA=L(M,"inverse",8,!1),wA=L(M,"pulse",8,!1),BA=L(M,"flip",8,"none"),QA=L(M,"style",8,""),RA=L(M,"label",8,""),IA=y1A();Z8(IA,()=>{var dA;return ke(ke({version:"1.1",class:"fa-icon ".concat((dA=z())!==null&&dA!==void 0?dA:""),width:P(),height:Z(),"aria-label":RA(),role:RA()?"img":"presentation",viewBox:AA(),style:QA()},F),{},{[sE]:{"fa-spin":W(),"fa-pulse":wA(),"fa-inverse":CA(),"fa-flip-horizontal":BA()==="horizontal","fa-flip-vertical":BA()==="vertical"}})},void 0,void 0,void 0,"svelte-v67cny"),Ca(gA(IA),M,"default",{},null),sA(k,IA)})(i,K2({get label(){return I()},get width(){return c(Q)},get height(){return c(h)},get box(){return c(m)},get style(){return c(f)},get spin(){return s()},get flip(){return C()},get inverse(){return l()},get pulse(){return g()},get class(){return n()}},()=>t,{children:(k,M)=>{var x=Gi();Ca(it(x),e,"default",{},F=>{var z=M1A(),P=it(z);Ia(P,1,()=>(c(a),uA(()=>{var CA;return((CA=c(a))===null||CA===void 0?void 0:CA.paths)||[]})),Sa,(CA,wA)=>{var BA=v1A();Z8(BA,()=>ke({},c(wA))),sA(CA,BA)});var Z=kA(P);Ia(Z,1,()=>(c(a),uA(()=>{var CA;return((CA=c(a))===null||CA===void 0?void 0:CA.polygons)||[]})),Sa,(CA,wA)=>{var BA=b1A();Z8(BA,()=>ke({},c(wA))),sA(CA,BA)});var AA=kA(Z),W=CA=>{D1A(CA,{get data(){return c(a)},set data(wA){N(a,wA)},$$legacy:!0})};zA(AA,CA=>{c(a),uA(()=>{var wA;return(wA=c(a))===null||wA===void 0?void 0:wA.raw})&&CA(W)}),sA(F,z)}),sA(k,x)},$$slots:{default:!0}})),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-boolean-toggle.svelte-eli4ob { + padding: 0; + margin: 1px 0 0; + vertical-align: top; + display: inline-flex; + color: var(--jse-value-color-boolean, #ff8c00); +} + +.jse-boolean-toggle.svelte-eli4ob:not(.jse-readonly) { + cursor: pointer; +}`);var S1A=TA('
        ');function k1A(i,e){Ft(e,!1);var A=L(e,"path",9),t=L(e,"value",9),n=L(e,"readOnly",9),o=L(e,"onPatch",9),a=L(e,"focus",9);ai(!0);var r,s=S1A(),l=gA(s),g=at(()=>t()===!0?u7:p7);on(l,{get data(){return c(g)}}),_e(()=>{Fn(s,"aria-checked",t()===!0),r=oi(s,1,"jse-boolean-toggle svelte-eli4ob",null,r,{"jse-readonly":n()}),Fn(s,"title",n()?"Boolean value ".concat(t()):"Click to toggle this boolean value")}),we("mousedown",s,function(C){C.stopPropagation(),n()||(o()([{op:"replace",path:bt(A()),value:!t()}]),a()())}),sA(i,s),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup, +.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup .picker_arrow::before, +.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup .picker_arrow::after { + background: var(--jse-color-picker-background, var(--jse-panel-background, #ebebeb)); + line-height: normal; +} +.jse-color-picker-popup.svelte-v77py2 .picker_slider, +.jse-color-picker-popup.svelte-v77py2 .picker_sl, +.jse-color-picker-popup.svelte-v77py2 .picker_editor input, +.jse-color-picker-popup.svelte-v77py2 .picker_sample, +.jse-color-picker-popup.svelte-v77py2 .picker_done button { + box-shadow: var(--jse-color-picker-border-box-shadow, #cbcbcb 0 0 0 1px); +} +.jse-color-picker-popup.svelte-v77py2 .picker_editor input { + background: var(--jse-background-color, #fff); + color: var(--jse-text-color, #4d4d4d); +} +.jse-color-picker-popup.svelte-v77py2 .picker_done button { + background: var(--jse-button-background, #e0e0e0); + color: var(--jse-button-color, var(--jse-text-color, #4d4d4d)); +} +.jse-color-picker-popup.svelte-v77py2 .picker_done button:hover { + background: var(--jse-button-background-highlight, #e7e7e7); +}`);var _1A=TA('
        ');function x1A(i,e){Ft(e,!1);var A=L(e,"color",8),t=L(e,"onChange",8),n=L(e,"showOnTop",8),o=cA(),a=()=>{};Vr(Pt(function*(){var s,l=new((s=yield import("./chunk-HTWWQBR6.js"))===null||s===void 0?void 0:s.default)({parent:c(o),color:A(),popup:n()?"top":"bottom",onDone(g){var C=g.rgba[3]===1?g.hex.substring(0,7):g.hex;t()(C)}});l.show(),a=()=>{l.destroy()}})),Ig(()=>{a()}),ai();var r=_1A();Ho(r,s=>N(o,s),()=>c(o)),sA(i,r),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-color-picker-button.svelte-13mgyo6 { + font-size: var(--jse-font-size-mono, 14px); + width: var(--jse-color-picker-button-size, 1em); + height: var(--jse-color-picker-button-size, 1em); + box-sizing: border-box; + padding: 0; + margin: 2px 0 0 calc(0.5 * var(--jse-padding, 10px)); + display: inline-flex; + vertical-align: top; + border: 1px solid var(--jse-text-color, #4d4d4d); + border-radius: 2px; + background: inherit; + outline: none; +} + +.jse-color-picker-button.svelte-13mgyo6:not(.jse-readonly) { + cursor: pointer; +}`);var R1A=TA('');function N1A(i,e){Ft(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),{openAbsolutePopup:n}=H2("absolute-popup"),o=L(e,"path",9),a=L(e,"value",9),r=L(e,"readOnly",9),s=L(e,"onPatch",9),l=L(e,"focus",9);function g(Q){s()([{op:"replace",path:bt(o()),value:Q}]),C()}function C(){l()()}KA(()=>J(a()),()=>{N(A,eq(a()))}),KA(()=>(J(r()),J(a())),()=>{N(t,r()?"Color ".concat(a()):"Click to open a color picker")}),Ln(),ai(!0);var I,B=R1A();_e(()=>{var Q;I=oi(B,1,"jse-color-picker-button svelte-13mgyo6",null,I,{"jse-readonly":r()}),cg(B,"background: ".concat((Q=c(A))!==null&&Q!==void 0?Q:"")),Fn(B,"title",c(t)),Fn(B,"aria-label",c(t))}),we("click",B,function(Q){var h,f;if(!r()){var m=Q.target,v=m.getBoundingClientRect().top,S=((h=(f=Gu(m))===null||f===void 0?void 0:f.innerHeight)!==null&&h!==void 0?h:0)-v<300&&v>300,k={color:a(),onChange:g,showOnTop:S};n(x1A,k,{anchor:m,closeOnOuterClick:!0,onClose:C,offsetTop:18,offsetLeft:-8,height:300})}}),sA(i,B),Lt()}var Ak=1e3,pu=100,L8=100,sw=2e4,uE=[{start:0,end:pu}],F1A=1048576,L1A=1048576,ek=10485760,tk="Insert or paste contents, enter [ insert a new array, enter { to insert a new object, or start typing to insert a new value",s_="Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)",pI="hover-insert-inside",G8="hover-insert-after",gP="hover-collection",ik="valid",cP="repairable",rC=336,sC=260,cu=100,CP={[sg.asc]:"ascending",[sg.desc]:"descending"};function Bq(i){for(var e=LR(i,r=>r.start),A=[e[0]],t=0;t0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"array",expanded:i,visibleSections:uE,items:[]}}function c_(){var{expanded:i}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"object",expanded:i,properties:{}}}var C_={createObjectDocumentState:c_,createArrayDocumentState:g_,createValueDocumentState:function(){return{type:"value"}}};function hq(i,e,A,t){var{createObjectDocumentState:n,createArrayDocumentState:o,createValueDocumentState:a}=t;return(function r(s,l,g){if(Array.isArray(s)){var C=Ar(l)?l:o();if(g.length===0)return C;var I=Sr(g[0]),B=r(s[I],C.items[I],g.slice(1));return Ur(C,["items",g[0]],B)}if(Sn(s)){var Q=el(l)?l:n();if(g.length===0)return Q;var h=g[0],f=r(s[h],Q.properties[h],g.slice(1));return Ur(Q,["properties",h],f)}return l_(l)?l:a()})(i,e,A)}function bl(i,e){return fu(i,e,arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],(A,t)=>{if(A!==void 0&&t!==void 0)return Array.isArray(A)?Ar(t)?t:g_({expanded:!!KI(t)&&t.expanded}):Sn(A)?el(t)?t:c_({expanded:!!KI(t)&&t.expanded}):l_(t)?t:void 0},()=>!0)}function fu(i,e,A,t,n){var o=t(i,e,A);if(Array.isArray(i)&&Ar(o)&&n(o)){var a=[];return I_(i,o.visibleSections,s=>{var l=A.concat(String(s)),g=fu(i[s],o.items[s],l,t,n);g!==void 0&&(a[s]=g)}),iP(a,o.items)?o:ke(ke({},o),{},{items:a})}if(Sn(i)&&el(o)&&n(o)){var r={};return Object.keys(i).forEach(s=>{var l=A.concat(s),g=fu(i[s],o.properties[s],l,t,n);g!==void 0&&(r[s]=g)}),iP(Object.values(r),Object.values(o.properties))?o:ke(ke({},o),{},{properties:r})}return o}function I_(i,e,A){e.forEach(t=>{var{start:n,end:o}=t;tq(n,Math.min(i.length,o),A)})}function mu(i,e){for(var A=i,t=[],n=0;n{var C=KI(g)&&!g.expanded?ke(ke({},g),{},{expanded:!0}):g;return Ar(C)?(function(I,B){if((function(f,m){return f.some(v=>m>=v.start&&m(function(l,g,C,I){return fu(l,g,C,(B,Q,h)=>Array.isArray(B)&&I(h)?Ar(Q)?Q.expanded?Q:ke(ke({},Q),{},{expanded:!0}):g_({expanded:!0}):Sn(B)&&I(h)?el(Q)?Q.expanded?Q:ke(ke({},Q),{},{expanded:!0}):c_({expanded:!0}):Q,B=>KI(B)&&B.expanded)})(r,s,[],t))}function uP(i,e,A,t){return _E(i,e,A,(n,o)=>t?(function(a,r,s){return fu(a,r,s,(l,g)=>pP(g),()=>!0)})(n,o,A):pP(o))}function pP(i){return Ar(i)&&i.expanded?ke(ke({},i),{},{expanded:!1,visibleSections:uE}):el(i)&&i.expanded?ke(ke({},i),{},{expanded:!1}):i}function Qq(i,e,A){var t={json:i,documentState:e},n=A.reduce((o,a)=>({json:Ps(o.json,[a]),documentState:J1A(o.json,o.documentState,a)}),t);return{json:n.json,documentState:bl(n.json,n.documentState)}}function J1A(i,e,A){if($b(A))return fP(i,e,A,void 0);if(A7(A))return mP(i,e,A);if(km(A)){var t=js(i,A.path),n=l0(i,e,t);return n?Sw(i,e,t,{type:"value",enforceString:n}):e}return _m(A)||e2(A)?(function(o,a,r){if(e2(r)&&r.from===r.path)return a;var s=a,l=js(o,r.from),g=o0(o,s,l);return e2(r)&&(s=mP(o,s,{path:r.from})),s=fP(o,s,{path:r.path},g),s})(i,e,A):e}function o0(i,e,A){try{return Ze(e,mu(i,A))}catch(t){return}}function d_(i,e,A,t,n){var o=hq(i,e,A,n);return XQ(o,mu(i,A),a=>{var r=Ze(i,A);return t(r,a)})}function Sw(i,e,A,t){return(function(n,o,a,r,s){var l=hq(n,o,a,s);return Ur(l,mu(n,a),r)})(i,e,A,t,C_)}function _E(i,e,A,t){return d_(i,e,A,t,C_)}function fP(i,e,A,t){var n=js(i,A.path),o=e;return o=_E(i,o,Vi(n),(a,r)=>{if(!Ar(r))return r;var s=Sr(Ni(n)),{items:l,visibleSections:g}=r;return ke(ke({},r),{},{items:s{if(!Ar(r))return r;var s=Sr(Ni(t)),{items:l,visibleSections:g}=r;return ke(ke({},r),{},{items:l.slice(0,s).concat(l.slice(s+1)),visibleSections:uq(g,s,-1)})}):(function(a,r,s){var l=mu(a,s);return wr(r,l)?P1(r,mu(a,s)):r})(i,e,t)}function uq(i,e,A){return(function(t){for(var n=t.slice(0),o=1;o({start:t.start>e?t.start+A:t.start,end:t.end>e?t.end+A:t.end})))}function l0(i,e,A){var t,n=Ze(i,A),o=o0(i,e,A),a=l_(o)?o.enforceString:void 0;return typeof a=="boolean"?a:typeof(t=n)=="string"&&typeof YE(t,JSON)!="string"}function Uu(i,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],t=i.indexOf(e);return t!==-1?A?i.slice(t):i.slice(t+1):[]}function B_(i,e){var A=[];return(function t(n,o,a){A.push(a),Zo(n)&&Ar(o)&&o.expanded&&I_(n,o.visibleSections,r=>{t(n[r],o.items[r],a.concat(String(r)))}),oa(n)&&el(o)&&o.expanded&&Object.keys(n).forEach(r=>{t(n[r],o.properties[r],a.concat(r))})})(i,e,[]),A}function pq(i,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],t=[];return(function n(o,a){t.push({path:a,type:tc.value});var r=o0(i,e,a);if(o&&KI(r)&&r.expanded){if(A&&t.push({path:a,type:tc.inside}),Zo(o)){var s=Ar(r)?r.visibleSections:uE;I_(o,s,l=>{var g=a.concat(String(l));n(o[l],g),A&&t.push({path:g,type:tc.after})})}oa(o)&&Object.keys(o).forEach(l=>{var g=a.concat(l);t.push({path:g,type:tc.key}),n(o[l],g),A&&t.push({path:g,type:tc.after})})}})(i,[]),t}function nk(i,e,A){var t=B_(i,e),n=t.map(bt).indexOf(bt(A));if(n!==-1&&n3&&arguments[3]!==void 0?arguments[3]:10240;return ec(i,e,A,o1A({json:Ze(i,A)},t)?Cu:E_)}function ok(i,e,A){var t=o0(i,e,A);return KI(t)&&t.expanded?e:UI(i,e,A)}function Cu(i){return i.length===0||i.length===1&&i[0]==="0"}function xk(i){return i.length===0}function E_(){return!0}function $8(){return!1}function il(i){return i&&i.type===ro.after||!1}function ja(i){return i&&i.type===ro.inside||!1}function er(i){return i&&i.type===ro.key||!1}function hn(i){return i&&i.type===ro.value||!1}function Io(i){return i&&i.type===ro.multi||!1}function kw(i){return Io(i)&&_i(i.focusPath,i.anchorPath)}function wu(i){return Io(i)||il(i)||ja(i)||er(i)||hn(i)}function ak(i){return i&&i.type===ro.text||!1}function Y2(i,e){var A=[];return(function(t,n,o){if(n){var a=kI(n),r=dt(n);if(_i(a,r))return o(a);if(t!==void 0){var s=mq(a,r);if(a.length===s.length||r.length===s.length)return o(s);var l=ds(a,r),g=lC(t,l),C=T2(t,l),I=dC(t,l,g),B=dC(t,l,C);if(!(I===-1||B===-1)){var Q=Ze(t,s);if(oa(Q)){for(var h=Object.keys(Q),f=I;f<=B;f++){var m=o(s.concat(h[f]));if(m!==void 0)return m}return}if(Zo(Q)){for(var v=I;v<=B;v++){var S=o(s.concat(String(v)));if(S!==void 0)return S}return}throw new Error("Failed to create selection")}}}})(i,e,t=>{A.push(t)}),A}function fq(i){return ja(i)?i.path:Vi(dt(i))}function lC(i,e){if(!Io(e))return e.path;var A=dC(i,e,e.anchorPath);return dC(i,e,e.focusPath)A?e.focusPath:e.anchorPath}function wP(i,e,A){var t=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(A){var n=t?dt(A):lC(i,A),o=(function(s,l,g){var C=B_(s,l),I=C.map(bt),B=bt(g),Q=I.indexOf(B);if(Q!==-1&&Q>0)return C[Q-1]})(i,e,n);if(t)return ja(A)||il(A)?o!==void 0?ds(n,n):void 0:o!==void 0?ds(kI(A),o):void 0;if(il(A)||ja(A))return Pi(n);if(er(A)){if(o===void 0||o.length===0)return;var a=Vi(o),r=Ze(i,a);return Array.isArray(r)||zi(o)?Pi(o):QC(o)}return hn(A),o!==void 0?Pi(o):void 0}}function DP(i,e,A,t){if(!A)return{caret:void 0,previous:void 0,next:void 0};var n=pq(i,e,t),o=n.findIndex(a=>_i(a.path,dt(A))&&String(a.type)===String(A.type));return{caret:o!==-1?n[o]:void 0,previous:o!==-1&&o>0?n[o-1]:void 0,next:o!==-1&&oA[t].length;)t++;var n=A[t];return n===void 0||n.length===0||Array.isArray(Ze(i,Vi(n)))?Pi(n):QC(n)}function xE(i,e){if(e.length===1){var A=bc(e);if(A.op==="replace")return Pi(js(i,A.path))}if(!zi(e)&&e.every(a=>a.op==="move")){var t=bc(e),n=e.slice(1);if((_m(t)||e2(t))&&t.from!==t.path&&n.every(a=>(_m(a)||e2(a))&&a.from===a.path))return QC(js(i,t.path))}var o=e.filter(a=>a.op!=="test"&&a.op!=="remove"&&(a.op!=="move"||a.from!==a.path)&&typeof a.path=="string").map(a=>js(i,a.path));if(!zi(o))return{type:ro.multi,anchorPath:bc(o),focusPath:Ni(o)}}function mq(i,e){for(var A=0;AA.length&&e.length>A.length;return{type:ro.multi,anchorPath:t?A.concat(i[A.length]):A,focusPath:t?A.concat(e[A.length]):A}}function wq(i,e,A,t){if(er(e))return String(Ni(e.path));if(hn(e)){var n=Ze(i,e.path);return typeof n=="string"?n:t.stringify(n,null,A)}if(Io(e)){if(zi(e.focusPath))return t.stringify(i,null,A);var o=fq(e),a=Ze(i,o);if(Array.isArray(a)){if(kw(e)){var r=Ze(i,e.focusPath);return t.stringify(r,null,A)}return Y2(i,e).map(s=>{var l=Ze(i,s);return"".concat(t.stringify(l,null,A),",")}).join(` +`)}return Y2(i,e).map(s=>{var l=Ni(s),g=Ze(i,s);return"".concat(t.stringify(l),": ").concat(t.stringify(g,null,A),",")}).join(` +`)}}function $a(i){return(er(i)||hn(i))&&i.edit===!0}function IE(i){return er(i)||hn(i)||Io(i)}function K8(i){return er(i)||hn(i)||kw(i)}function Rk(i){switch(i.type){case tc.key:return QC(i.path);case tc.value:return Pi(i.path);case tc.after:return IC(i.path);case tc.inside:return uC(i.path)}}function vP(i,e){switch(i){case ro.key:return QC(e);case ro.value:return Pi(e);case ro.after:return IC(e);case ro.inside:return uC(e);case ro.multi:case ro.text:return ds(e,e)}}function U8(i,e,A){if(e)return Du(i,e,A)||I0(Io(e)?Vi(e.focusPath):e.path,A)?e:void 0}function Du(i,e,A){if(i===void 0||!e)return!1;if(er(e)||ja(e)||il(e))return _i(e.path,A);if(hn(e))return I0(A,e.path);if(Io(e)){var t=lC(i,e),n=T2(i,e),o=Vi(e.focusPath);if(!I0(A,o)||A.length<=o.length)return!1;var a=dC(i,e,t),r=dC(i,e,n),s=dC(i,e,A);return s!==-1&&s>=a&&s<=r}return!1}function dC(i,e,A){var t=Vi(e.focusPath);if(!I0(A,t)||A.length<=t.length)return-1;var n=A[t.length],o=Ze(i,t);if(oa(o))return Object.keys(o).indexOf(n);if(Zo(o)){var a=Sr(n);if(a');function yq(i,e){Ft(e,!1);var A=tr("jsoneditor:EditableDiv"),t=L(e,"value",9),n=L(e,"initialValue",9),o=L(e,"shortText",9,!1),a=L(e,"label",9),r=L(e,"onChange",9),s=L(e,"onCancel",9),l=L(e,"onFind",9),g=L(e,"onPaste",9,va),C=L(e,"onValueClass",9,()=>""),I=cA(void 0,!0),B=cA(void 0,!0),Q=!1;function h(){return c(I)?(function(v){return v.replace(/\n$/,"")})(c(I).innerText):""}function f(v){c(I)&&Ml(I,c(I).innerText=kE(v))}Vr(()=>{A("onMount",{value:t(),initialValue:n()}),f(n()!==void 0?n():t()),c(I)&&(function(v){if(v.firstChild!=null){var S=document.createRange(),k=window.getSelection();S.setStart(v,1),S.collapse(!0),k?.removeAllRanges(),k?.addRange(S)}else v.focus()})(c(I))}),Ig(()=>{var v=h();A("onDestroy",{closed:Q,value:t(),newValue:v}),Q||v===t()||r()(v,U2.no)}),KA(()=>(J(C()),J(t())),()=>{N(B,C()(t()))}),Ln(),ai(!0);var m=Y1A();Ho(m,v=>N(I,v),()=>c(I)),_e(v=>{Fn(m,"aria-label",a()),oi(m,1,v,"svelte-1r0oryi")},[()=>J2((J(lc),c(B),J(o()),uA(()=>lc("jse-editable-div",c(B),{"jse-short-text":o()}))))]),we("input",m,function(){var v=h();v===""&&f(""),N(B,C()(v))}),we("keydown",m,function(v){v.stopPropagation();var S=hC(v);if(S==="Escape"&&(v.preventDefault(),Q=!0,s()()),S==="Enter"||S==="Tab"){v.preventDefault(),Q=!0;var k=h();r()(k,U2.nextInside)}S==="Ctrl+F"&&(v.preventDefault(),l()(!1)),S==="Ctrl+H"&&(v.preventDefault(),l()(!0))}),we("paste",m,function(v){if(v.stopPropagation(),g()&&v.clipboardData){var S=v.clipboardData.getData("text/plain");g()(S)}}),we("blur",m,function(){var v=document.hasFocus(),S=h();A("handleBlur",{hasFocus:v,closed:Q,value:t(),newValue:S}),document.hasFocus()&&!Q&&(Q=!0,S!==t()&&r()(S,U2.self))}),sA(i,m),Lt()}function O1A(i,e){Ft(e,!1);var A=L(e,"path",9),t=L(e,"value",9),n=L(e,"selection",9),o=L(e,"mode",9),a=L(e,"parser",9),r=L(e,"normalization",9),s=L(e,"enforceString",9),l=L(e,"onPatch",9),g=L(e,"onPasteJson",9),C=L(e,"onSelect",9),I=L(e,"onFind",9),B=L(e,"focus",9),Q=L(e,"findNextInside",9);function h(S){return s()?S:YE(S,a())}function f(){C()(Pi(A())),B()()}ai(!0);var m=at(()=>(J(r()),J(t()),uA(()=>r().escapeValue(t())))),v=at(()=>(J($a),J(n()),uA(()=>$a(n())?n().initialValue:void 0)));yq(i,{get value(){return c(m)},get initialValue(){return c(v)},label:"Edit value",onChange:function(S,k){l()([{op:"replace",path:bt(A()),value:h(r().unescapeValue(S))}],(M,x,F)=>{if(!F||_i(A(),dt(F)))return{state:x,selection:k===U2.nextInside?Q()(A()):Pi(A())}}),B()()},onCancel:f,onPaste:function(S){try{var k=a().parse(S);ra(k)&&g()({path:A(),contents:k,onPasteAsJson:()=>{f();var M=[{op:"replace",path:bt(A()),value:k}];l()(M,(x,F)=>({state:UI(x,F,A())}))}})}catch(M){}},get onFind(){return I()},onValueClass:function(S){return Dq(h(r().unescapeValue(S)),o(),a())}}),Lt()}function dE(i,e,A){var t=Vi(e),n=Ze(i,t);if(Zo(n)){var o=Sr(Ni(e));return A.map((l,g)=>({op:"add",path:bt(t.concat(String(o+g))),value:l.value}))}if(oa(n)){var a=Ni(e),r=Object.keys(n),s=a!==void 0?Uu(r,a,!0):[];return[...A.map(l=>{var g=Ku(l.key,r);return{op:"add",path:bt(t.concat(g)),value:l.value}}),...s.map(l=>O2(t,l))]}throw new Error("Cannot create insert operations: parent must be an Object or Array")}function Nk(i,e,A){var t=Ze(i,e);if(Array.isArray(t)){var n=t.length;return A.map((o,a)=>({op:"add",path:bt(e.concat(String(n+a))),value:o.value}))}return A.map(o=>{var a=Ku(o.key,Object.keys(t));return{op:"add",path:bt(e.concat(a)),value:o.value}})}function Tu(i,e,A,t){var n=e.filter(r=>r!==A),o=Ku(t,n),a=Uu(e,A,!1);return[{op:"move",from:bt(i.concat(A)),path:bt(i.concat(o))},...a.map(r=>O2(i,r))]}function vq(i,e){var A=Ni(e);if(zi(A))throw new Error("Cannot duplicate root object");var t=Vi(A),n=Ni(A),o=Ze(i,t);if(Zo(o)){var a=Ni(e),r=a?Sr(Ni(a))+1:0;return[...e.map((g,C)=>({op:"copy",from:bt(g),path:bt(t.concat(String(C+r)))}))]}if(oa(o)){var s=Object.keys(o),l=n!==void 0?Uu(s,n,!1):[];return[...e.map(g=>{var C=Ku(Ni(g),s);return{op:"copy",from:bt(g),path:bt(t.concat(C))}}),...l.map(g=>O2(t,g))]}throw new Error("Cannot create duplicate operations: parent must be an Object or Array")}function bq(i,e){if(hn(e))return[{op:"move",from:bt(e.path),path:""}];if(!Io(e))throw new Error("Cannot create extract operations: parent must be an Object or Array");var A=Vi(e.focusPath),t=Ze(i,A);if(Zo(t)){var n=Y2(i,e).map(a=>{var r=Sr(Ni(a));return t[r]});return[{op:"replace",path:"",value:n}]}if(oa(t)){var o={};return Y2(i,e).forEach(a=>{var r=String(Ni(a));o[r]=t[r]}),[{op:"replace",path:"",value:o}]}throw new Error("Cannot extract: unsupported type of selection "+JSON.stringify(e))}function Mq(i,e,A,t){if(er(e)){var n=iq(A,t),o=Vi(e.path),a=Ze(i,o);return Tu(o,Object.keys(a),Ni(e.path),typeof n=="string"?n:A)}if(hn(e)||Io(e)&&zi(e.focusPath))try{return[{op:"replace",path:bt(dt(e)),value:Lu(A,x=>Fu(x,t))}]}catch(x){return[{op:"replace",path:bt(dt(e)),value:A}]}if(Io(e)){var r=rk(A,t);return(function(x,F,z){var P=bc(F),Z=Vi(P),AA=Ze(x,Z);if(Zo(AA)){var W=bc(F),CA=W?Sr(Ni(W)):0;return[...Iw(F),...z.map((VA,he)=>({op:"add",path:bt(Z.concat(String(he+CA))),value:VA.value}))]}if(oa(AA)){var wA=Ni(F),BA=Vi(wA),QA=Ni(wA),RA=Object.keys(AA),IA=QA!==void 0?Uu(RA,QA,!1):[],dA=new Set(F.map(VA=>Ni(VA))),_A=RA.filter(VA=>!dA.has(VA));return[...Iw(F),...z.map(VA=>{var he=Ku(VA.key,_A);return{op:"add",path:bt(BA.concat(he)),value:VA.value}}),...IA.map(VA=>O2(BA,VA))]}throw new Error("Cannot create replace operations: parent must be an Object or Array")})(i,Y2(i,e),r)}if(il(e)){var s=rk(A,t),l=e.path,g=Vi(l),C=Ze(i,g);if(Zo(C)){var I=Sr(Ni(l));return dE(i,g.concat(String(I+1)),s)}if(oa(C)){var B=String(Ni(l)),Q=Object.keys(C);if(zi(Q)||Ni(Q)===B)return Nk(i,g,s);var h=Q.indexOf(B),f=Q[h+1];return dE(i,g.concat(f),s)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}if(ja(e)){var m=rk(A,t),v=e.path,S=Ze(i,v);if(Zo(S))return dE(i,v.concat("0"),m);if(oa(S)){var k=Object.keys(S);if(zi(k))return Nk(i,v,m);var M=bc(k);return dE(i,v.concat(M),m)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}throw new Error("Cannot insert: unsupported type of selection "+JSON.stringify(e))}function Iw(i){return i.map(e=>({op:"remove",path:bt(e)})).reverse()}function O2(i,e){return{op:"move",from:bt(i.concat(e)),path:bt(i.concat(e))}}function rk(i,e){var A=/^\s*{/.test(i),t=/^\s*\[/.test(i),n=iq(i,e),o=n!==void 0?n:Lu(i,a=>Fu(a,e));return A&&Sn(o)||t&&Array.isArray(o)?[{key:"New item",value:o}]:Array.isArray(o)?o.map((a,r)=>({key:"New item "+r,value:a})):Sn(o)?Object.keys(o).map(a=>({key:a,value:o[a]})):[{key:"New item",value:o}]}function Sq(i,e){if(er(e)){var A=Vi(e.path),t=Ze(i,A),n=Tu(A,Object.keys(t),Ni(e.path),"");return{operations:n,newSelection:xE(i,n)}}if(hn(e))return{operations:[{op:"replace",path:bt(e.path),value:""}],newSelection:e};if(Io(e)){var o=Y2(i,e),a=Iw(o),r=Ni(o);if(zi(r))return{operations:[{op:"replace",path:"",value:""}],newSelection:Pi([])};var s=Vi(r),l=Ze(i,s);if(Zo(l)){var g=bc(o),C=Sr(Ni(g));return{operations:a,newSelection:C===0?uC(s):IC(s.concat(String(C-1)))}}if(oa(l)){var I=Object.keys(l),B=bc(o),Q=Ni(B),h=I.indexOf(Q),f=I[h-1];return{operations:a,newSelection:h===0?uC(s):IC(s.concat(f))}}throw new Error("Cannot create remove operations: parent must be an Object or Array")}throw new Error("Cannot remove: unsupported type of selection "+JSON.stringify(e))}function kq(i,e){var A=(function(t,n){if(zi(n)||!n.every(e2))return n;var o=[];for(var a of n){var r=bP(gs(a.from)),s=bP(gs(a.path));if(!r||!s)return n;o.push({from:r,path:s,operation:a})}var l=o[0].path.parent,g=Ze(t,l);if(!oa(g)||!o.every(Q=>(function(h,f){return _i(h.from.parent,f)&&_i(h.path.parent,f)})(Q,l)))return n;var C=(function(Q,h){var f=Object.keys(h),m=f.slice();for(var v of Q){var S=m.indexOf(v.from.key);S!==-1&&(m.splice(S,1),m.push(v.path.key))}for(var k=0;kQ.operation,B=o.filter(Q=>Q.operation.from!==Q.operation.path);return B.some(Q=>Q.path.key===C)?B.map(I):[O2(l,C),...B.map(I)]})(i,e);return xm(i,A,{before:(t,n,o)=>{if(A7(n)){var a=gs(n.path);return{revertOperations:[...o,...sk(t,a)]}}if(e2(n)){var r=gs(n.from);return{revertOperations:n.from===n.path?[n,...sk(t,r)]:[...o,...sk(t,r)]}}return{document:t}}})}function bP(i){return i.length>0?{parent:Vi(i),key:Ni(i)}:void 0}function sk(i,e){var A=Vi(e),t=Ni(e),n=Ze(i,A);return oa(n)?Uu(Object.keys(n),t,!1).map(o=>O2(A,o)):[]}function MP(i){var e=i.activeIndex0?0:-1,A=i.items[e],t=i.items.map((n,o)=>ke(ke({},n),{},{active:o===e}));return ke(ke({},i),{},{items:t,activeItem:A,activeIndex:e})}function SP(i,e){var A,t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.toLowerCase(),o=(A=t?.maxResults)!==null&&A!==void 0?A:1/0,a=t?.columns,r=[],s=[];function l(f){r.length>=o||r.push(f)}function g(f,m){if(Zo(m)){var v=s.length;s.push("0");for(var S=0;S=o)return;s.pop()}else if(oa(m)){var k=Object.keys(m),M=s.length;for(var x of(s.push(""),k))if(s[M]=x,kP(x,f,s,nc.key,l),g(f,m[x]),r.length>=o)return;s.pop()}else kP(String(m),f,s,nc.value,l)}if(i==="")return[];if(a){if(!Array.isArray(e))throw new Error("json must be an Array when option columns is defined");for(var C=0;CQ.length+1;)s.pop();g(n,Ze(I,Q))}if(r.length>=o)break}return r}return g(n,e),r}function kP(i,e,A,t,n){var o=i.toLowerCase(),a=0,r=-1,s=-1;do(s=o.indexOf(e,r))!==-1&&(r=s+e.length,n({path:A.slice(0),field:t,fieldIndex:a,start:s,end:r}),a++);while(s!==-1)}function Fk(i,e,A,t){return i.substring(0,A)+e+i.substring(t)}function _P(i,e,A){var t=i;return _R(A,n=>{t=Fk(t,e,n.start,n.end)}),t}function H1A(i,e,A,t,n){var{field:o,path:a,start:r,end:s}=t;if(o===nc.key){var l=Vi(a),g=Ze(i,l),C=Ni(a),I=Tu(l,Object.keys(g),C,Fk(C,A,r,s));return{newSelection:xE(i,I),operations:I}}if(o===nc.value){var B=Ze(i,a);if(B===void 0)throw new Error("Cannot replace: path not found ".concat(bt(a)));var Q=typeof B=="string"?B:String(B),h=l0(i,e,a),f=Fk(Q,A,r,s),m=[{op:"replace",path:bt(a),value:h?f:YE(f,n)}];return{newSelection:xE(i,m),operations:m}}throw new Error("Cannot replace: unknown type of search result field ".concat(o))}function xP(i){return i.path.concat(i.field,String(i.fieldIndex))}function RP(i){var e=Eq(i)?i.searchResults.filter(A=>A.field===nc.key):void 0;return e&&e.length>0?e:void 0}function NP(i){var e=Eq(i)?i.searchResults.filter(A=>A.field===nc.value):void 0;return e&&e.length>0?e:void 0}var z1A={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function _q(i,e){return e.reduce((A,t)=>(function(n,o,a,r){return d_(n,o,a,r,z1A)})(i,A,t.path,(n,o)=>ke(ke({},o),{},{searchResults:o.searchResults?o.searchResults.concat(t):[t]})),void 0)}function dw(i){var e,A=(e=i?.searchResults)!==null&&e!==void 0?e:[],t=el(i)?Object.values(i.properties).flatMap(dw):Ar(i)?i.items.flatMap(dw):[];return A.concat(t)}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-highlight.svelte-19qyvy6 { + background-color: var(--jse-search-match-color, #ffe665); + outline: var(--jse-search-match-outline, none); +} +.jse-highlight.jse-active.svelte-19qyvy6 { + background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); + outline: var(--jse-search-match-outline, 2px solid #e0be00); +}`);var P1A=TA(" ");function xq(i,e){Ft(e,!1);var A=cA(),t=L(e,"text",8),n=L(e,"searchResultItems",8);KA(()=>(J(t()),J(n())),()=>{N(A,(function(a,r){var s=[],l=0;for(var g of r){var C=a.slice(l,g.start);C!==""&&s.push({resultIndex:void 0,type:"normal",text:C,active:!1});var I=a.slice(g.start,g.end);s.push({resultIndex:g.resultIndex,type:"highlight",text:I,active:g.active}),l=g.end}var B=Ni(r);return B&&B.endc(A),Sa,(a,r)=>{var s=Gi(),l=it(s),g=I=>{var B=cr();_e(()=>Gt(B,(c(r),uA(()=>c(r).text)))),sA(I,B)},C=I=>{var B,Q=P1A(),h=gA(Q);_e((f,m)=>{B=oi(Q,1,"jse-highlight svelte-19qyvy6",null,B,{"jse-active":c(r).active}),Fn(Q,"data-search-result-index",f),Gt(h,m)},[()=>(c(r),uA(()=>String(c(r).resultIndex))),()=>(J(kE),c(r),uA(()=>kE(c(r).text)))]),sA(I,Q)};zA(l,I=>{c(r),uA(()=>c(r).type==="normal")?I(g):I(C,!1)}),sA(a,s)}),sA(i,o),Lt()}function Aw(i){var e=1e3;if(i<900)return i.toFixed()+" B";var A=i/e;if(A<900)return A.toFixed(1)+" KB";var t=A/e;if(t<900)return t.toFixed(1)+" MB";var n=t/e;return n<900?n.toFixed(1)+" GB":(n/e).toFixed(1)+" TB"}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-tag.svelte-ubve9r { + border: none; + font-size: 80%; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); + background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + border-radius: 2px; + cursor: pointer; + display: inline-block; + padding: 0 4px; + line-height: normal; + margin: 1px 0; +} +.jse-tag.svelte-ubve9r:hover { + opacity: 0.8; +} +.jse-tag.disabled.svelte-ubve9r { + opacity: 0.7; + cursor: inherit; +}`);var j1A=TA('');function ew(i,e){Ft(e,!0);var A,t=tl(()=>e.onclick?o=>{o.preventDefault(),o.stopPropagation(),e.onclick()}:void 0),n=j1A();n.__click=function(){for(var o,a=arguments.length,r=new Array(a),s=0;s2?r-2:0),l=2;l{var C,I=(C=a())!==null&&C!==void 0?C:null;g.ensure(I,I&&(B=>I(B,...s)))},xI)})(gA(n),()=>{var o;return(o=e.children)!==null&&o!==void 0?o:p2A}),_e(()=>A=oi(n,1,"jse-tag svelte-ubve9r",null,A,{disabled:!e.onclick})),sA(i,n),Lt()}Nu(["click"]);Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-value.jse-string.svelte-1saqp8c { + color: var(--jse-value-color-string, #008000); +} +.jse-value.jse-object.svelte-1saqp8c, .jse-value.jse-array.svelte-1saqp8c { + min-width: 16px; + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); +} +.jse-value.jse-number.svelte-1saqp8c { + color: var(--jse-value-color-number, #ee422e); +} +.jse-value.jse-boolean.svelte-1saqp8c { + color: var(--jse-value-color-boolean, #ff8c00); +} +.jse-value.jse-null.svelte-1saqp8c { + color: var(--jse-value-color-null, #004ed0); +} +.jse-value.jse-invalid.svelte-1saqp8c { + color: var(--jse-text-color, #4d4d4d); +} +.jse-value.jse-url.svelte-1saqp8c { + color: var(--jse-value-color-url, #008000); + text-decoration: underline; +} + +.jse-value.svelte-1saqp8c { + display: inline-block; + min-width: 2em; + padding: 0 5px; + box-sizing: border-box; + outline: none; + border-radius: 1px; + vertical-align: top; + word-break: normal; + overflow-wrap: anywhere; + white-space: pre-wrap; +} +.jse-value.jse-table-cell.svelte-1saqp8c { + overflow-wrap: normal; + white-space: nowrap; +} +.jse-value.jse-empty.svelte-1saqp8c { + min-width: 4em; + outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + -moz-outline-radius: 2px; +} +.jse-value.jse-empty.svelte-1saqp8c::after { + pointer-events: none; + color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + content: "value"; +}`);var q1A=TA('
        ');function V1A(i,e){Ft(e,!0);var A=eC(!0),t=tl(()=>c(A)&&typeof e.value=="string"&&e.value.length>e.truncateTextSize&&(!e.searchResultItems||!e.searchResultItems.some(B=>B.active&&B.end>e.truncateTextSize))),n=tl(()=>c(t)&&typeof e.value=="string"?e.value.substring(0,e.truncateTextSize).trim():e.value),o=tl(()=>Mw(e.value));function a(){N(A,!1)}var r=q1A();r.__click=function(B){typeof e.value=="string"&&c(o)&&r_(B)&&(B.preventDefault(),B.stopPropagation(),window.open(e.value,"_blank"))},r.__dblclick=function(B){e.readOnly||(B.preventDefault(),e.onSelect(Cw(e.path)))};var s=gA(r),l=B=>{var Q=tl(()=>e.normalization.escapeValue(c(n)));xq(B,{get text(){return c(Q)},get searchResultItems(){return e.searchResultItems}})},g=B=>{var Q=cr();_e(h=>Gt(Q,h),[()=>kE(e.normalization.escapeValue(c(n)))]),sA(B,Q)};zA(s,B=>{e.searchResultItems?B(l):B(g,!1)});var C=kA(s,2),I=B=>{ew(B,{onclick:a,children:(Q,h)=>{var f=cr();_e(m=>Gt(f,"Show more (".concat(m??"",")")),[()=>Aw(e.value.length)]),sA(Q,f)},$$slots:{default:!0}})};zA(C,B=>{c(t)&&typeof e.value=="string"&&B(I)}),_e(B=>{oi(r,1,B,"svelte-1saqp8c"),Fn(r,"title",c(o)?"Ctrl+Click or Ctrl+Enter to open url in new window":void 0)},[()=>J2(Dq(e.value,e.mode,e.parser))]),sA(i,r),Lt()}Nu(["click","dblclick"]);Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-tooltip.svelte-brt1mq { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + line-height: normal; + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); + border-radius: 3px; + background: var(--jse-context-menu-background, #656565); + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); + white-space: nowrap; + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); +}`);var W1A=TA('
        ');function Z1A(i,e){var A=L(e,"text",8),t=W1A(),n=gA(t);_e(()=>Gt(n,A())),sA(i,t)}function RE(i,e){var A,{text:t,openAbsolutePopup:n,closeAbsolutePopup:o}=e;function a(){A=n(Z1A,{text:t},{position:"top",width:10*t.length,offsetTop:3,anchor:i,closeOnOuterClick:!0})}function r(){o(A)}return i.addEventListener("mouseenter",a),i.addEventListener("mouseleave",r),{destroy(){i.removeEventListener("mouseenter",a),i.removeEventListener("mouseleave",r)}}}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-timestamp.svelte-1jcpman { + padding: 0; + margin: 0; + vertical-align: middle; + display: inline-flex; + color: var(--jse-value-color-number, #ee422e); +}`);var X1A=TA('
        ');function $1A(i,e){Ft(e,!1);var A=cA(void 0,!0),t=H2("absolute-popup"),n=L(e,"value",9);KA(()=>J(n()),()=>{N(A,"Time: ".concat(new Date(n()).toString()))}),Ln(),ai(!0);var o=X1A();on(gA(o),{get data(){return DT}}),Es(o,(a,r)=>RE?.(a,r),()=>ke({text:c(A)},t)),sA(i,o),Lt()}function AIA(i){var e=[];return!i.isEditing&&$2A(i.value)&&e.push({component:k1A,props:i}),!i.isEditing&&A1A(i.value)&&e.push({component:N1A,props:i}),i.isEditing&&e.push({component:O1A,props:i}),i.isEditing||e.push({component:V1A,props:i}),!i.isEditing&&yk(i.value)&&e.push({component:$1A,props:i}),e}function nl(i){return i.map((e,A)=>tIA.test(e)?"["+e+"]":/[.[\]]/.test(e)||e===""?'["'+(function(t){return t.replace(/"/g,'\\"')})(e)+'"]':(A>0?".":"")+e).join("")}function eIA(i){for(var e=[],A=0;Ao==='"',!0)),n('"')):e.push(t(o=>o==="]")),n("]")):e.push(t(o=>o==="."||o==="["));function t(o){for(var a=arguments.length>1&&arguments[1]!==void 0&&arguments[1],r="";A({x:i,y:i}),oIA={left:"right",right:"left",bottom:"top",top:"bottom"},aIA={start:"end",end:"start"};function FP(i,e,A){return _I(i,Bw(e,A))}function _w(i,e){return typeof i=="function"?i(e):i}function TI(i){return i.split("-")[0]}function xw(i){return i.split("-")[1]}function Rq(i){return i==="x"?"y":"x"}function Nq(i){return i==="y"?"height":"width"}var rIA=new Set(["top","bottom"]);function R2(i){return rIA.has(TI(i))?"y":"x"}function Fq(i){return Rq(R2(i))}function Lk(i){return i.replace(/start|end/g,e=>aIA[e])}var LP=["left","right"],GP=["right","left"],sIA=["top","bottom"],lIA=["bottom","top"];function gIA(i,e,A,t){var n=xw(i),o=(function(a,r,s){switch(a){case"top":case"bottom":return s?r?GP:LP:r?LP:GP;case"left":case"right":return r?sIA:lIA;default:return[]}})(TI(i),A==="start",t);return n&&(o=o.map(a=>a+"-"+n),e&&(o=o.concat(o.map(Lk)))),o}function J8(i){return i.replace(/left|right|bottom|top/g,e=>oIA[e])}function cIA(i){return typeof i!="number"?(function(e){return ke({top:0,right:0,bottom:0,left:0},e)})(i):{top:i,right:i,bottom:i,left:i}}function hw(i){var{x:e,y:A,width:t,height:n}=i;return{width:t,height:n,top:A,left:e,right:e+t,bottom:A+n,x:e,y:A}}function KP(i,e,A){var t,{reference:n,floating:o}=i,a=R2(e),r=Fq(e),s=Nq(r),l=TI(e),g=a==="y",C=n.x+n.width/2-o.width/2,I=n.y+n.height/2-o.height/2,B=n[s]/2-o[s]/2;switch(l){case"top":t={x:C,y:n.y-o.height};break;case"bottom":t={x:C,y:n.y+n.height};break;case"right":t={x:n.x+n.width,y:I};break;case"left":t={x:n.x-o.width,y:I};break;default:t={x:n.x,y:n.y}}switch(xw(e)){case"start":t[r]-=B*(A&&g?-1:1);break;case"end":t[r]+=B*(A&&g?-1:1)}return t}var CIA=(function(){var i=Pt(function*(e,A,t){for(var{placement:n="bottom",strategy:o="absolute",middleware:a=[],platform:r}=t,s=a.filter(Boolean),l=yield r.isRTL==null?void 0:r.isRTL(A),g=yield r.getElementRects({reference:e,floating:A,strategy:o}),{x:C,y:I}=KP(g,n,l),B=n,Q={},h=0,f=0;f"u")&&(i instanceof ShadowRoot||i instanceof kl(i).ShadowRoot)}var dIA=new Set(["inline","contents"]);function yu(i){var{overflow:e,overflowX:A,overflowY:t,display:n}=ac(i);return/auto|scroll|overlay|hidden|clip/.test(e+t+A)&&!dIA.has(n)}var BIA=new Set(["table","td","th"]);function EIA(i){return BIA.has(NE(i))}var hIA=[":popover-open",":modal"];function Qw(i){return hIA.some(e=>{try{return i.matches(e)}catch(A){return!1}})}var QIA=["transform","translate","scale","rotate","perspective"],uIA=["transform","translate","scale","rotate","perspective","filter"],pIA=["paint","layout","strict","content"];function Uk(i){var e=Q_(),A=oc(i)?ac(i):i;return QIA.some(t=>!!A[t]&&A[t]!=="none")||!!A.containerType&&A.containerType!=="normal"||!e&&!!A.backdropFilter&&A.backdropFilter!=="none"||!e&&!!A.filter&&A.filter!=="none"||uIA.some(t=>(A.willChange||"").includes(t))||pIA.some(t=>(A.contain||"").includes(t))}function Q_(){return!(typeof CSS>"u"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}var fIA=new Set(["html","body","#document"]);function pE(i){return fIA.has(NE(i))}function ac(i){return kl(i).getComputedStyle(i)}function Nw(i){return oc(i)?{scrollLeft:i.scrollLeft,scrollTop:i.scrollTop}:{scrollLeft:i.scrollX,scrollTop:i.scrollY}}function N2(i){if(NE(i)==="html")return i;var e=i.assignedSlot||i.parentNode||UP(i)&&i.host||B0(i);return UP(e)?e.host:e}function Kq(i){var e=N2(i);return pE(e)?i.ownerDocument?i.ownerDocument.body:i.body:E0(e)&&yu(e)?e:Kq(e)}function vu(i,e,A){var t;e===void 0&&(e=[]),A===void 0&&(A=!0);var n=Kq(i),o=n===((t=i.ownerDocument)==null?void 0:t.body),a=kl(n);if(o){var r=Tk(a);return e.concat(a,a.visualViewport||[],yu(n)?n:[],r&&A?vu(r):[])}return e.concat(n,vu(n,[],A))}function Tk(i){return i.parent&&Object.getPrototypeOf(i.parent)?i.frameElement:null}function Uq(i){var e=ac(i),A=parseFloat(e.width)||0,t=parseFloat(e.height)||0,n=E0(i),o=n?i.offsetWidth:A,a=n?i.offsetHeight:t,r=Ew(A)!==o||Ew(t)!==a;return r&&(A=o,t=a),{width:A,height:t,$:r}}function u_(i){return oc(i)?i:i.contextElement}function fE(i){var e=u_(i);if(!E0(e))return d0(1);var A=e.getBoundingClientRect(),{width:t,height:n,$:o}=Uq(e),a=(o?Ew(A.width):A.width)/t,r=(o?Ew(A.height):A.height)/n;return a&&Number.isFinite(a)||(a=1),r&&Number.isFinite(r)||(r=1),{x:a,y:r}}var mIA=d0(0);function Tq(i){var e=kl(i);return Q_()&&e.visualViewport?{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}:mIA}function JI(i,e,A,t){e===void 0&&(e=!1),A===void 0&&(A=!1);var n=i.getBoundingClientRect(),o=u_(i),a=d0(1);e&&(t?oc(t)&&(a=fE(t)):a=fE(i));var r=(function(M,x,F){return x===void 0&&(x=!1),!(!F||x&&F!==kl(M))&&x})(o,A,t)?Tq(o):d0(0),s=(n.left+r.x)/a.x,l=(n.top+r.y)/a.y,g=n.width/a.x,C=n.height/a.y;if(o)for(var I=kl(o),B=t&&oc(t)?kl(t):t,Q=I,h=Tk(Q);h&&t&&B!==Q;){var f=fE(h),m=h.getBoundingClientRect(),v=ac(h),S=m.left+(h.clientLeft+parseFloat(v.paddingLeft))*f.x,k=m.top+(h.clientTop+parseFloat(v.paddingTop))*f.y;s*=f.x,l*=f.y,g*=f.x,C*=f.y,s+=S,l+=k,h=Tk(Q=kl(h))}return hw({width:g,height:C,x:s,y:l})}function uw(i,e){var A=Nw(i).scrollLeft;return e?e.left+A:JI(B0(i)).left+A}function Jq(i,e){var A=i.getBoundingClientRect();return{x:A.left+e.scrollLeft-uw(i,A),y:A.top+e.scrollTop}}var wIA=new Set(["absolute","fixed"]);function TP(i,e,A){var t;if(e==="viewport")t=(function(o,a){var r=kl(o),s=B0(o),l=r.visualViewport,g=s.clientWidth,C=s.clientHeight,I=0,B=0;if(l){g=l.width,C=l.height;var Q=Q_();(!Q||Q&&a==="fixed")&&(I=l.offsetLeft,B=l.offsetTop)}var h=uw(s);if(h<=0){var f=s.ownerDocument,m=f.body,v=getComputedStyle(m),S=f.compatMode==="CSS1Compat"&&parseFloat(v.marginLeft)+parseFloat(v.marginRight)||0,k=Math.abs(s.clientWidth-m.clientWidth-S);k<=25&&(g-=k)}else h<=25&&(g+=h);return{width:g,height:C,x:I,y:B}})(i,A);else if(e==="document")t=(function(o){var a=B0(o),r=Nw(o),s=o.ownerDocument.body,l=_I(a.scrollWidth,a.clientWidth,s.scrollWidth,s.clientWidth),g=_I(a.scrollHeight,a.clientHeight,s.scrollHeight,s.clientHeight),C=-r.scrollLeft+uw(o),I=-r.scrollTop;return ac(s).direction==="rtl"&&(C+=_I(a.clientWidth,s.clientWidth)-l),{width:l,height:g,x:C,y:I}})(B0(i));else if(oc(e))t=(function(o,a){var r=JI(o,!0,a==="fixed"),s=r.top+o.clientTop,l=r.left+o.clientLeft,g=E0(o)?fE(o):d0(1);return{width:o.clientWidth*g.x,height:o.clientHeight*g.y,x:l*g.x,y:s*g.y}})(e,A);else{var n=Tq(i);t={x:e.x-n.x,y:e.y-n.y,width:e.width,height:e.height}}return hw(t)}function Yq(i,e){var A=N2(i);return!(A===e||!oc(A)||pE(A))&&(ac(A).position==="fixed"||Yq(A,e))}function DIA(i,e,A){var t=E0(e),n=B0(e),o=A==="fixed",a=JI(i,!0,o,e),r={scrollLeft:0,scrollTop:0},s=d0(0);function l(){s.x=uw(n)}if(t||!t&&!o)if((NE(e)!=="body"||yu(n))&&(r=Nw(e)),t){var g=JI(e,!0,o,e);s.x=g.x+e.clientLeft,s.y=g.y+e.clientTop}else n&&l();o&&!t&&n&&l();var C=!n||t||o?d0(0):Jq(n,r);return{x:a.left+r.scrollLeft-s.x-C.x,y:a.top+r.scrollTop-s.y-C.y,width:a.width,height:a.height}}function lk(i){return ac(i).position==="static"}function JP(i,e){if(!E0(i)||ac(i).position==="fixed")return null;if(e)return e(i);var A=i.offsetParent;return B0(i)===A&&(A=A.ownerDocument.body),A}function YP(i,e){var A=kl(i);if(Qw(i))return A;if(!E0(i)){for(var t=N2(i);t&&!pE(t);){if(oc(t)&&!lk(t))return t;t=N2(t)}return A}for(var n=JP(i,e);n&&EIA(n)&&lk(n);)n=JP(n,e);return n&&pE(n)&&lk(n)&&!Uk(n)?A:n||(function(o){for(var a=N2(o);E0(a)&&!pE(a);){if(Uk(a))return a;if(Qw(a))return null;a=N2(a)}return null})(i)||A}var yIA={convertOffsetParentRelativeRectToViewportRelativeRect:function(i){var{elements:e,rect:A,offsetParent:t,strategy:n}=i,o=n==="fixed",a=B0(t),r=!!e&&Qw(e.floating);if(t===a||r&&o)return A;var s={scrollLeft:0,scrollTop:0},l=d0(1),g=d0(0),C=E0(t);if((C||!C&&!o)&&((NE(t)!=="body"||yu(a))&&(s=Nw(t)),E0(t))){var I=JI(t);l=fE(t),g.x=I.x+t.clientLeft,g.y=I.y+t.clientTop}var B=!a||C||o?d0(0):Jq(a,s);return{width:A.width*l.x,height:A.height*l.y,x:A.x*l.x-s.scrollLeft*l.x+g.x+B.x,y:A.y*l.y-s.scrollTop*l.y+g.y+B.y}},getDocumentElement:B0,getClippingRect:function(i){var{element:e,boundary:A,rootBoundary:t,strategy:n}=i,o=A==="clippingAncestors"?Qw(e)?[]:(function(l,g){var C=g.get(l);if(C)return C;for(var I=vu(l,[],!1).filter(v=>oc(v)&&NE(v)!=="body"),B=null,Q=ac(l).position==="fixed",h=Q?N2(l):l;oc(h)&&!pE(h);){var f=ac(h),m=Uk(h);m||f.position!=="fixed"||(B=null),(Q?!m&&!B:!m&&f.position==="static"&&B&&wIA.has(B.position)||yu(h)&&!m&&Yq(l,h))?I=I.filter(v=>v!==h):B=f,h=N2(h)}return g.set(l,I),I})(e,this._c):[].concat(A),a=[...o,t],r=a[0],s=a.reduce((l,g)=>{var C=TP(e,g,n);return l.top=_I(C.top,l.top),l.right=Bw(C.right,l.right),l.bottom=Bw(C.bottom,l.bottom),l.left=_I(C.left,l.left),l},TP(e,r,n));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}},getOffsetParent:YP,getElementRects:(function(){var i=Pt(function*(e){var A=this.getOffsetParent||YP,t=this.getDimensions,n=yield t(e.floating);return{reference:DIA(e.reference,yield A(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}});return function(e){return i.apply(this,arguments)}})(),getClientRects:function(i){return Array.from(i.getClientRects())},getDimensions:function(i){var{width:e,height:A}=Uq(i);return{width:e,height:A}},getScale:fE,isElement:oc,isRTL:function(i){return ac(i).direction==="rtl"}};function OP(i,e){return i.x===e.x&&i.y===e.y&&i.width===e.width&&i.height===e.height}function vIA(i,e,A,t){t===void 0&&(t={});var{ancestorScroll:n=!0,ancestorResize:o=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:r=typeof IntersectionObserver=="function",animationFrame:s=!1}=t,l=u_(i),g=n||o?[...l?vu(l):[],...vu(e)]:[];g.forEach(f=>{n&&f.addEventListener("scroll",A,{passive:!0}),o&&f.addEventListener("resize",A)});var C,I=l&&r?(function(f,m){var v,S=null,k=B0(f);function M(){var x;clearTimeout(v),(x=S)==null||x.disconnect(),S=null}return(function x(F,z){F===void 0&&(F=!1),z===void 0&&(z=1),M();var P=f.getBoundingClientRect(),{left:Z,top:AA,width:W,height:CA}=P;if(F||m(),W&&CA){var wA={rootMargin:-T8(AA)+"px "+-T8(k.clientWidth-(Z+W))+"px "+-T8(k.clientHeight-(AA+CA))+"px "+-T8(Z)+"px",threshold:_I(0,Bw(1,z))||1},BA=!0;try{S=new IntersectionObserver(QA,ke(ke({},wA),{},{root:k.ownerDocument}))}catch(RA){S=new IntersectionObserver(QA,wA)}S.observe(f)}function QA(RA){var IA=RA[0].intersectionRatio;if(IA!==z){if(!BA)return x();IA?x(!1,IA):v=setTimeout(()=>{x(!1,1e-7)},1e3)}IA!==1||OP(P,f.getBoundingClientRect())||x(),BA=!1}})(!0),M})(l,A):null,B=-1,Q=null;a&&(Q=new ResizeObserver(f=>{var[m]=f;m&&m.target===l&&Q&&(Q.unobserve(e),cancelAnimationFrame(B),B=requestAnimationFrame(()=>{var v;(v=Q)==null||v.observe(e)})),A()}),l&&!s&&Q.observe(l),Q.observe(e));var h=s?JI(i):null;return s&&(function f(){var m=JI(i);h&&!OP(h,m)&&A(),h=m,C=requestAnimationFrame(f)})(),A(),()=>{var f;g.forEach(m=>{n&&m.removeEventListener("scroll",A),o&&m.removeEventListener("resize",A)}),I?.(),(f=Q)==null||f.disconnect(),Q=null,s&&cancelAnimationFrame(C)}}var bIA=function(i){return i===void 0&&(i=0),{name:"offset",options:i,fn:e=>Pt(function*(){var A,t,{x:n,y:o,placement:a,middlewareData:r}=e,s=yield(function(l,g){return Kk.apply(this,arguments)})(e,i);return a===((A=r.offset)==null?void 0:A.placement)&&(t=r.arrow)!=null&&t.alignmentOffset?{}:{x:n+s.x,y:o+s.y,data:ke(ke({},s),{},{placement:a})}})()}},MIA=function(i){return i===void 0&&(i={}),{name:"shift",options:i,fn:e=>Pt(function*(){var{x:A,y:t,placement:n}=e,o=_w(i,e),{mainAxis:a=!0,crossAxis:r=!1,limiter:s={fn:S=>{var{x:k,y:M}=S;return{x:k,y:M}}}}=o,l=ZP(o,I2A),g={x:A,y:t},C=yield Lq(e,l),I=R2(TI(n)),B=Rq(I),Q=g[B],h=g[I];if(a){var f=B==="y"?"bottom":"right";Q=FP(Q+C[B==="y"?"top":"left"],Q,Q-C[f])}if(r){var m=I==="y"?"bottom":"right";h=FP(h+C[I==="y"?"top":"left"],h,h-C[m])}var v=s.fn(ke(ke({},e),{},{[B]:Q,[I]:h}));return ke(ke({},v),{},{data:{x:v.x-A,y:v.y-t,enabled:{[B]:a,[I]:r}}})})()}},SIA=function(i){return i===void 0&&(i={}),{name:"flip",options:i,fn:e=>Pt(function*(){var A,t,{placement:n,middlewareData:o,rects:a,initialPlacement:r,platform:s,elements:l}=e,g=_w(i,e),{mainAxis:C=!0,crossAxis:I=!0,fallbackPlacements:B,fallbackStrategy:Q="bestFit",fallbackAxisSideDirection:h="none",flipAlignment:f=!0}=g,m=ZP(g,C2A);if((A=o.arrow)!=null&&A.alignmentOffset)return{};var v=TI(n),S=R2(r),k=TI(r)===r,M=yield s.isRTL==null?void 0:s.isRTL(l.floating),x=B||(k||!f?[J8(r)]:(function(_A){var VA=J8(_A);return[Lk(_A),VA,Lk(VA)]})(r)),F=h!=="none";!B&&F&&x.push(...gIA(r,f,h,M));var z=[r,...x],P=yield Lq(e,m),Z=[],AA=((t=o.flip)==null?void 0:t.overflows)||[];if(C&&Z.push(P[v]),I){var W=(function(_A,VA,he){he===void 0&&(he=!1);var HA=xw(_A),vA=Fq(_A),PA=Nq(vA),et=vA==="x"?HA===(he?"end":"start")?"right":"left":HA==="start"?"bottom":"top";return VA.reference[PA]>VA.floating[PA]&&(et=J8(et)),[et,J8(et)]})(n,a,M);Z.push(P[W[0]],P[W[1]])}if(AA=[...AA,{placement:n,overflows:Z}],!Z.every(_A=>_A<=0)){var CA,wA,BA=(((CA=o.flip)==null?void 0:CA.index)||0)+1,QA=z[BA];if(QA&&(!(I==="alignment"&&S!==R2(QA))||AA.every(_A=>R2(_A.placement)!==S||_A.overflows[0]>0)))return{data:{index:BA,overflows:AA},reset:{placement:QA}};var RA=(wA=AA.filter(_A=>_A.overflows[0]<=0).sort((_A,VA)=>_A.overflows[1]-VA.overflows[1])[0])==null?void 0:wA.placement;if(!RA)switch(Q){case"bestFit":var IA,dA=(IA=AA.filter(_A=>{if(F){var VA=R2(_A.placement);return VA===S||VA==="y"}return!0}).map(_A=>[_A.placement,_A.overflows.filter(VA=>VA>0).reduce((VA,he)=>VA+he,0)]).sort((_A,VA)=>_A[1]-VA[1])[0])==null?void 0:IA[0];dA&&(RA=dA);break;case"initialPlacement":RA=r}if(n!==RA)return{reset:{placement:RA}}}return{}})()}};function kIA(i){var e,A,t={autoUpdate:!0},n=i,o=s=>ke(ke(ke({},t),i||{}),s||{}),a=s=>{e&&A&&(n=o(s),((l,g,C)=>{var I=new Map,B=ke({platform:yIA},C),Q=ke(ke({},B.platform),{},{_c:I});return CIA(l,g,ke(ke({},B),{},{platform:Q}))})(e,A,n).then(l=>{var g;Object.assign(A.style,{position:l.strategy,left:"".concat(l.x,"px"),top:"".concat(l.y,"px")}),!((g=n)===null||g===void 0)&&g.onComputed&&n.onComputed(l)}))},r=s=>{Ig(s.subscribe(l=>{e===void 0?(e=l,a()):(Object.assign(e,l),a())}))};return[s=>{if("subscribe"in s)return r(s),{};e=s,a()},(s,l)=>{var g;A=s,n=o(l),setTimeout(()=>a(l),0),a(l);var C=()=>{g&&(g(),g=void 0)},I=function(){var{autoUpdate:B}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:n||{};C(),B!==!1&&Jj().then(()=>vIA(e,A,()=>a(n),B===!0?{}:B))};return g=I(),{update(B){a(B),g=I(B)},destroy(){C()}}},a]}function _IA(i){var{loadOptions:e,filterText:A,items:t,multiple:n,value:o,itemId:a,groupBy:r,filterSelectedItems:s,itemFilter:l,convertStringItemsToObjects:g,filterGroupedItems:C,label:I}=i;if(t&&e)return t;if(!t)return[];t&&t.length>0&&typeof t[0]!="object"&&(t=g(t));var B=t.filter(Q=>{var h=l(Q[I],A,Q);return h&&n&&o!=null&&o.length&&(h=!o.some(f=>!!s&&f[a]===Q[a])),h});return r&&(B=C(B)),B}function xIA(i){return Oq.apply(this,arguments)}function Oq(){return(Oq=Pt(function*(i){var{dispatch:e,loadOptions:A,convertStringItemsToObjects:t,filterText:n}=i,o=yield A(n).catch(a=>{console.warn("svelte-select loadOptions error :>> ",a),e("error",{type:"loadOptions",details:a})});if(o&&!o.cancelled)return o?(o&&o.length>0&&typeof o[0]!="object"&&(o=t(o)),e("loaded",{items:o})):o=[],{filteredItems:o,loading:!1,focused:!0,listOpen:!0}})).apply(this,arguments)}Xt(` + svg.svelte-1kxu7be { + width: var(--chevron-icon-width, 20px); + height: var(--chevron-icon-width, 20px); + color: var(--chevron-icon-colour, currentColor); + } +`);var RIA=z2(``);Xt(` + svg.svelte-1hraxrc { + width: var(--clear-icon-width, 20px); + height: var(--clear-icon-width, 20px); + color: var(--clear-icon-color, currentColor); + } +`);var NIA=z2(``);function gk(i){sA(i,NIA())}Xt(` + .loading.svelte-y9fi5p { + width: var(--spinner-width, 20px); + height: var(--spinner-height, 20px); + color: var(--spinner-color, var(--icons-color)); + animation: svelte-y9fi5p-rotate 0.75s linear infinite; + transform-origin: center center; + transform: none; + } + + .circle_path.svelte-y9fi5p { + stroke-dasharray: 90; + stroke-linecap: round; + } + + @keyframes svelte-y9fi5p-rotate { + 100% { + transform: rotate(360deg); + } + } +`);var FIA=z2('');Xt(` + .svelte-select.svelte-1ul7oo4 { + /* deprecating camelCase custom props in favour of kebab-case for v5 */ + --borderRadius: var(--border-radius); + --clearSelectColor: var(--clear-select-color); + --clearSelectWidth: var(--clear-select-width); + --disabledBackground: var(--disabled-background); + --disabledBorderColor: var(--disabled-border-color); + --disabledColor: var(--disabled-color); + --disabledPlaceholderColor: var(--disabled-placeholder-color); + --disabledPlaceholderOpacity: var(--disabled-placeholder-opacity); + --errorBackground: var(--error-background); + --errorBorder: var(--error-border); + --groupItemPaddingLeft: var(--group-item-padding-left); + --groupTitleColor: var(--group-title-color); + --groupTitleFontSize: var(--group-title-font-size); + --groupTitleFontWeight: var(--group-title-font-weight); + --groupTitlePadding: var(--group-title-padding); + --groupTitleTextTransform: var(--group-title-text-transform); + --groupTitleBorderColor: var(--group-title-border-color); + --groupTitleBorderWidth: var(--group-title-border-width); + --groupTitleBorderStyle: var(--group-title-border-style); + --indicatorColor: var(--chevron-color); + --indicatorHeight: var(--chevron-height); + --indicatorWidth: var(--chevron-width); + --inputColor: var(--input-color); + --inputLeft: var(--input-left); + --inputLetterSpacing: var(--input-letter-spacing); + --inputMargin: var(--input-margin); + --inputPadding: var(--input-padding); + --itemActiveBackground: var(--item-active-background); + --itemColor: var(--item-color); + --itemFirstBorderRadius: var(--item-first-border-radius); + --itemHoverBG: var(--item-hover-bg); + --itemHoverColor: var(--item-hover-color); + --itemIsActiveBG: var(--item-is-active-bg); + --itemIsActiveColor: var(--item-is-active-color); + --itemIsNotSelectableColor: var(--item-is-not-selectable-color); + --itemPadding: var(--item-padding); + --listBackground: var(--list-background); + --listBorder: var(--list-border); + --listBorderRadius: var(--list-border-radius); + --listEmptyColor: var(--list-empty-color); + --listEmptyPadding: var(--list-empty-padding); + --listEmptyTextAlign: var(--list-empty-text-align); + --listMaxHeight: var(--list-max-height); + --listPosition: var(--list-position); + --listShadow: var(--list-shadow); + --listZIndex: var(--list-z-index); + --multiItemBG: var(--multi-item-bg); + --multiItemBorderRadius: var(--multi-item-border-radius); + --multiItemDisabledHoverBg: var(--multi-item-disabled-hover-bg); + --multiItemDisabledHoverColor: var(--multi-item-disabled-hover-color); + --multiItemHeight: var(--multi-item-height); + --multiItemMargin: var(--multi-item-margin); + --multiItemPadding: var(--multi-item-padding); + --multiSelectInputMargin: var(--multi-select-input-margin); + --multiSelectInputPadding: var(--multi-select-input-padding); + --multiSelectPadding: var(--multi-select-padding); + --placeholderColor: var(--placeholder-color); + --placeholderOpacity: var(--placeholder-opacity); + --selectedItemPadding: var(--selected-item-padding); + --spinnerColor: var(--spinner-color); + --spinnerHeight: var(--spinner-height); + --spinnerWidth: var(--spinner-width); + + --internal-padding: 0 0 0 16px; + + border: var(--border, 1px solid #d8dbdf); + border-radius: var(--border-radius, 6px); + min-height: var(--height, 42px); + position: relative; + display: flex; + align-items: stretch; + padding: var(--padding, var(--internal-padding)); + background: var(--background, #fff); + margin: var(--margin, 0); + width: var(--width, 100%); + font-size: var(--font-size, 16px); + max-height: var(--max-height); + } + + .svelte-1ul7oo4 { + box-sizing: var(--box-sizing, border-box); + } + + .svelte-select.svelte-1ul7oo4:hover { + border: var(--border-hover, 1px solid #b2b8bf); + } + + .value-container.svelte-1ul7oo4 { + display: flex; + flex: 1 1 0%; + flex-wrap: wrap; + align-items: center; + gap: 5px 10px; + padding: var(--value-container-padding, 5px 0); + position: relative; + overflow: var(--value-container-overflow, hidden); + align-self: stretch; + } + + .prepend.svelte-1ul7oo4, + .indicators.svelte-1ul7oo4 { + display: flex; + flex-shrink: 0; + align-items: center; + } + + .indicators.svelte-1ul7oo4 { + position: var(--indicators-position); + top: var(--indicators-top); + right: var(--indicators-right); + bottom: var(--indicators-bottom); + } + + input.svelte-1ul7oo4 { + position: absolute; + cursor: default; + border: none; + color: var(--input-color, var(--item-color)); + padding: var(--input-padding, 0); + letter-spacing: var(--input-letter-spacing, inherit); + margin: var(--input-margin, 0); + min-width: 10px; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: transparent; + font-size: var(--font-size, 16px); + } + + .svelte-1ul7oo4:not(.multi) > .value-container:where(.svelte-1ul7oo4) > input:where(.svelte-1ul7oo4) { + width: 100%; + height: 100%; + } + + input.svelte-1ul7oo4::placeholder { + color: var(--placeholder-color, #78848f); + opacity: var(--placeholder-opacity, 1); + } + + input.svelte-1ul7oo4:focus { + outline: none; + } + + .svelte-select.focused.svelte-1ul7oo4 { + border: var(--border-focused, 1px solid #006fe8); + border-radius: var(--border-radius-focused, var(--border-radius, 6px)); + } + + .disabled.svelte-1ul7oo4 { + background: var(--disabled-background, #ebedef); + border-color: var(--disabled-border-color, #ebedef); + color: var(--disabled-color, #c1c6cc); + } + + .disabled.svelte-1ul7oo4 input:where(.svelte-1ul7oo4)::placeholder { + color: var(--disabled-placeholder-color, #c1c6cc); + opacity: var(--disabled-placeholder-opacity, 1); + } + + .selected-item.svelte-1ul7oo4 { + position: relative; + overflow: var(--selected-item-overflow, hidden); + padding: var(--selected-item-padding, 0 20px 0 0); + text-overflow: ellipsis; + white-space: nowrap; + color: var(--selected-item-color, inherit); + font-size: var(--font-size, 16px); + } + + .multi.svelte-1ul7oo4 .selected-item:where(.svelte-1ul7oo4) { + position: absolute; + line-height: var(--height, 42px); + height: var(--height, 42px); + } + + .selected-item.svelte-1ul7oo4:focus { + outline: none; + } + + .hide-selected-item.svelte-1ul7oo4 { + opacity: 0; + } + + .icon.svelte-1ul7oo4 { + display: flex; + align-items: center; + justify-content: center; + } + + .clear-select.svelte-1ul7oo4 { + all: unset; + display: flex; + align-items: center; + justify-content: center; + width: var(--clear-select-width, 40px); + height: var(--clear-select-height, 100%); + color: var(--clear-select-color, var(--icons-color)); + margin: var(--clear-select-margin, 0); + pointer-events: all; + flex-shrink: 0; + } + + .clear-select.svelte-1ul7oo4:focus { + outline: var(--clear-select-focus-outline, 1px solid #006fe8); + } + + .loading.svelte-1ul7oo4 { + width: var(--loading-width, 40px); + height: var(--loading-height); + color: var(--loading-color, var(--icons-color)); + margin: var(--loading--margin, 0); + flex-shrink: 0; + } + + .chevron.svelte-1ul7oo4 { + width: var(--chevron-width, 40px); + height: var(--chevron-height, 40px); + background: var(--chevron-background, transparent); + pointer-events: var(--chevron-pointer-events, none); + color: var(--chevron-color, var(--icons-color)); + border: var(--chevron-border, 0 0 0 1px solid #d8dbdf); + flex-shrink: 0; + } + + .multi.svelte-1ul7oo4 { + padding: var(--multi-select-padding, var(--internal-padding)); + } + + .multi.svelte-1ul7oo4 input:where(.svelte-1ul7oo4) { + padding: var(--multi-select-input-padding, 0); + position: relative; + margin: var(--multi-select-input-margin, 5px 0); + flex: 1 1 40px; + } + + .svelte-select.error.svelte-1ul7oo4 { + border: var(--error-border, 1px solid #ff2d55); + background: var(--error-background, #fff); + } + + .a11y-text.svelte-1ul7oo4 { + z-index: 9999; + border: 0px; + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + width: 1px; + position: absolute; + overflow: hidden; + padding: 0px; + white-space: nowrap; + } + + .multi-item.svelte-1ul7oo4 { + background: var(--multi-item-bg, #ebedef); + margin: var(--multi-item-margin, 0); + outline: var(--multi-item-outline, 1px solid #ddd); + border-radius: var(--multi-item-border-radius, 4px); + height: var(--multi-item-height, 25px); + line-height: var(--multi-item-height, 25px); + display: flex; + cursor: default; + padding: var(--multi-item-padding, 0 5px); + overflow: hidden; + gap: var(--multi-item-gap, 4px); + outline-offset: -1px; + max-width: var(--multi-max-width, none); + color: var(--multi-item-color, var(--item-color)); + } + + .multi-item.disabled.svelte-1ul7oo4:hover { + background: var(--multi-item-disabled-hover-bg, #ebedef); + color: var(--multi-item-disabled-hover-color, #c1c6cc); + } + + .multi-item-text.svelte-1ul7oo4 { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .multi-item-clear.svelte-1ul7oo4 { + display: flex; + align-items: center; + justify-content: center; + --clear-icon-color: var(--multi-item-clear-icon-color, #000); + } + + .multi-item.active.svelte-1ul7oo4 { + outline: var(--multi-item-active-outline, 1px solid #006fe8); + } + + .svelte-select-list.svelte-1ul7oo4 { + box-shadow: var(--list-shadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24)); + border-radius: var(--list-border-radius, 4px); + max-height: var(--list-max-height, 252px); + overflow-y: auto; + background: var(--list-background, #fff); + position: var(--list-position, absolute); + z-index: var(--list-z-index, 2); + border: var(--list-border); + } + + .prefloat.svelte-1ul7oo4 { + opacity: 0; + pointer-events: none; + } + + .list-group-title.svelte-1ul7oo4 { + color: var(--group-title-color, #8f8f8f); + cursor: default; + font-size: var(--group-title-font-size, 16px); + font-weight: var(--group-title-font-weight, 600); + height: var(--height, 42px); + line-height: var(--height, 42px); + padding: var(--group-title-padding, 0 20px); + text-overflow: ellipsis; + overflow-x: hidden; + white-space: nowrap; + text-transform: var(--group-title-text-transform, uppercase); + border-width: var(--group-title-border-width, medium); + border-style: var(--group-title-border-style, none); + border-color: var(--group-title-border-color, color); + } + + .empty.svelte-1ul7oo4 { + text-align: var(--list-empty-text-align, center); + padding: var(--list-empty-padding, 20px 0); + color: var(--list-empty-color, #78848f); + } + + .item.svelte-1ul7oo4 { + cursor: default; + height: var(--item-height, var(--height, 42px)); + line-height: var(--item-line-height, var(--height, 42px)); + padding: var(--item-padding, 0 20px); + color: var(--item-color, inherit); + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + transition: var(--item-transition, all 0.2s); + align-items: center; + width: 100%; + } + + .item.group-item.svelte-1ul7oo4 { + padding-left: var(--group-item-padding-left, 40px); + } + + .item.svelte-1ul7oo4:active { + background: var(--item-active-background, #b9daff); + } + + .item.active.svelte-1ul7oo4 { + background: var(--item-is-active-bg, #007aff); + color: var(--item-is-active-color, #fff); + } + + .item.first.svelte-1ul7oo4 { + border-radius: var(--item-first-border-radius, 4px 4px 0 0); + } + + .item.hover.svelte-1ul7oo4:not(.active) { + background: var(--item-hover-bg, #e7f2ff); + color: var(--item-hover-color, inherit); + } + + .item.not-selectable.svelte-1ul7oo4, + .item.hover.item.not-selectable.svelte-1ul7oo4, + .item.active.item.not-selectable.svelte-1ul7oo4, + .item.not-selectable.svelte-1ul7oo4:active { + color: var(--item-is-not-selectable-color, #999); + background: transparent; + } + + .required.svelte-1ul7oo4 { + opacity: 0; + z-index: -1; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + } +`);var LIA=TA('
        '),GIA=TA('
        No options
        '),KIA=TA('
        '),UIA=TA(' ',1),TIA=TA('
        '),JIA=TA('
        '),YIA=TA("
        "),OIA=TA(''),HIA=TA(''),zIA=TA(''),PIA=TA(''),jIA=TA(''),qIA=TA('
        ');function yI(i,e){var A=(function(hA){var FA={};for(var le in hA.children&&(FA.default=!0),hA.$$slots)FA[le]=!0;return FA})(e);Ft(e,!1);var t,n=cA(),o=cA(),a=cA(),r=cA(),s=cA(),l=cA(),g=cA(),C=cA(),I=cA(),B=Y2A(),Q=L(e,"justValue",12,null),h=L(e,"filter",8,_IA),f=L(e,"getItems",8,xIA),m=L(e,"id",8,null),v=L(e,"name",8,null),S=L(e,"container",12,void 0),k=L(e,"input",12,void 0),M=L(e,"multiple",8,!1),x=L(e,"multiFullItemClearable",8,!1),F=L(e,"disabled",8,!1),z=L(e,"focused",12,!1),P=L(e,"value",12,null),Z=L(e,"filterText",12,""),AA=L(e,"placeholder",8,"Please select"),W=L(e,"placeholderAlwaysShow",8,!1),CA=L(e,"items",12,null),wA=L(e,"label",8,"label"),BA=L(e,"itemFilter",8,(hA,FA,le)=>"".concat(hA).toLowerCase().includes(FA.toLowerCase())),QA=L(e,"groupBy",8,void 0),RA=L(e,"groupFilter",8,hA=>hA),IA=L(e,"groupHeaderSelectable",8,!1),dA=L(e,"itemId",8,"value"),_A=L(e,"loadOptions",8,void 0),VA=L(e,"containerStyles",8,""),he=L(e,"hasError",8,!1),HA=L(e,"filterSelectedItems",8,!0),vA=L(e,"required",8,!1),PA=L(e,"closeListOnChange",8,!0),et=L(e,"clearFilterTextOnBlur",8,!0),We=L(e,"createGroupHeaderItem",8,(hA,FA)=>({value:hA,[wA()]:hA})),OA=()=>c(g),EA=L(e,"searchable",8,!0),XA=L(e,"inputStyles",8,""),pA=L(e,"clearable",8,!0),Ae=L(e,"loading",12,!1),NA=L(e,"listOpen",12,!1),Ne=L(e,"debounce",8,function(hA){var FA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1;clearTimeout(t),t=setTimeout(hA,FA)}),YA=L(e,"debounceWait",8,300),DA=L(e,"hideEmptyState",8,!1),Kt=L(e,"inputAttributes",24,()=>({})),pt=L(e,"listAutoWidth",8,!0),ue=L(e,"showChevron",8,!1),Ot=L(e,"listOffset",8,5),He=L(e,"hoverItemIndex",12,0),je=L(e,"floatingConfig",24,()=>({})),ft=L(e,"class",8,""),Fe=cA(),ri=cA(),j=cA(),X=cA(),tA=cA();function nA(hA){return hA.map((FA,le)=>({index:le,value:FA,label:"".concat(FA)}))}function UA(hA){var FA=[],le={};hA.forEach(rt=>{var gt=QA()(rt);FA.includes(gt)||(FA.push(gt),le[gt]=[],gt&&le[gt].push(Object.assign(We()(gt,rt),{id:gt,groupHeader:!0,selectable:IA()}))),le[gt].push(Object.assign({groupItem:!!gt},rt))});var Ge=[];return RA()(FA).forEach(rt=>{le[rt]&&Ge.push(...le[rt])}),Ge}function de(){var hA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0,FA=arguments.length>1?arguments[1]:void 0;He(hA<0?0:hA),!FA&&QA()&&c(g)[He()]&&!c(g)[He()].selectable&&ui(1)}function pe(){var hA=!0;if(P()){var FA=[],le=[];P().forEach(Ge=>{FA.includes(Ge[dA()])?hA=!1:(FA.push(Ge[dA()]),le.push(Ge))}),hA||P(le)}return hA}function GA(hA){var FA=hA?hA[dA()]:P()[dA()];return CA().find(le=>le[dA()]===FA)}function JA(hA){return Qt.apply(this,arguments)}function Qt(){return(Qt=Pt(function*(hA){var FA=P()[hA];P().length===1?P(void 0):P(P().filter(le=>le!==FA)),B("clear",FA)})).apply(this,arguments)}function nt(hA){if(z())switch(hA.stopPropagation(),hA.key){case"Escape":hA.preventDefault(),Je();break;case"Enter":if(hA.preventDefault(),NA()){if(c(g).length===0)break;var FA=c(g)[He()];if(P()&&!M()&&P()[dA()]===FA[dA()]){Je();break}U(c(g)[He()])}break;case"ArrowDown":hA.preventDefault(),NA()?ui(1):(NA(!0),N(Fe,void 0));break;case"ArrowUp":hA.preventDefault(),NA()?ui(-1):(NA(!0),N(Fe,void 0));break;case"Tab":if(NA()&&z()){if(c(g).length===0||P()&&P()[dA()]===c(g)[He()][dA()])return Je();hA.preventDefault(),U(c(g)[He()]),Je()}break;case"Backspace":if(!M()||Z().length>0)return;if(M()&&P()&&P().length>0){if(JA(c(Fe)!==void 0?c(Fe):P().length-1),c(Fe)===0||c(Fe)===void 0)break;N(Fe,P().length>c(Fe)?c(Fe)-1:void 0)}break;case"ArrowLeft":if(!P()||!M()||Z().length>0)return;c(Fe)===void 0?N(Fe,P().length-1):P().length>c(Fe)&&c(Fe)!==0&&N(Fe,c(Fe)-1);break;case"ArrowRight":if(!P()||!M()||Z().length>0||c(Fe)===void 0)return;c(Fe)===P().length-1?N(Fe,void 0):c(Fe)0?NA(!0):void NA(!NA())}function Qn(){B("clear",P()),P(void 0),Je(),ze()}function Je(){et()&&Z(""),NA(!1)}O2A(Pt(function*(){N(ri,P()),N(j,Z()),N(X,M())})),Vr(()=>{NA()&&z(!0),z()&&k()&&k().focus()});var an=L(e,"ariaValues",8,hA=>"Option ".concat(hA,", selected.")),ki=L(e,"ariaListOpen",8,(hA,FA)=>"You are currently focused on option ".concat(hA,". There are ").concat(FA," results available.")),Ki=L(e,"ariaFocused",8,()=>"Select is focused, type to refine list, press down to open the menu."),An,Mt=cA(null);function rn(){clearTimeout(An),An=setTimeout(()=>{Ut=!1},100)}Ig(()=>{var hA;(hA=c(Mt))===null||hA===void 0||hA.remove()});var Ut=!1;function U(hA){hA&&hA.selectable!==!1&&(function(FA){if(FA){Z("");var le=Object.assign({},FA);if(le.groupHeader&&!le.selectable)return;P(M()?P()?P().concat([le]):[le]:P(le)),setTimeout(()=>{PA()&&Je(),N(Fe,void 0),B("change",P()),B("select",FA)})}})(hA)}function Bt(hA){Ut||He(hA)}function ui(hA){if(c(g).filter(le=>!Object.hasOwn(le,"selectable")||le.selectable===!0).length===0)return He(0);hA>0&&He()===c(g).length-1?He(0):hA<0&&He()===0?He(c(g).length-1):He(He()+hA);var FA=c(g)[He()];FA&&FA.selectable===!1&&(hA!==1&&hA!==-1||ui(hA))}function un(hA,FA,le){if(!M())return FA&&FA[le]===hA[le]}var pn=zo,Xn=zo;function zo(hA){return{update(FA){FA.scroll&&(rn(),hA.scrollIntoView({behavior:"auto",block:"nearest"}))}}}var Eo=cA({strategy:"absolute",placement:"bottom-start",middleware:[bIA(Ot()),SIA(),MIA()],autoUpdate:!1}),[Lo,$o,yo]=kIA(c(Eo)),da=cA(!0);KA(()=>(J(CA()),J(P())),()=>{CA(),P()&&(function(){if(typeof P()=="string"){var hA=(CA()||[]).find(FA=>FA[dA()]===P());P(hA||{[dA()]:P(),label:P()})}else M()&&Array.isArray(P())&&P().length>0&&P(P().map(FA=>typeof FA=="string"?{value:FA,label:FA}:FA))})()}),KA(()=>(J(Kt()),J(EA())),()=>{!Kt()&&EA()||(N(tA,Object.assign({autocapitalize:"none",autocomplete:"off",autocorrect:"off",spellcheck:!1,tabindex:0,type:"text","aria-autocomplete":"list"},Kt())),m()&&Ml(tA,c(tA).id=m()),EA()||Ml(tA,c(tA).readonly=!0))}),KA(()=>J(M()),()=>{M()&&P()&&(Array.isArray(P())?P([...P()]):P([P()]))}),KA(()=>(c(X),J(M())),()=>{c(X)&&!M()&&P()&&P(null)}),KA(()=>(J(M()),J(P())),()=>{M()&&P()&&P().length>1&&pe()}),KA(()=>J(P()),()=>{P()&&(M()?JSON.stringify(P())!==JSON.stringify(c(ri))&&pe()&&B("input",P()):c(ri)&&JSON.stringify(P()[dA()])===JSON.stringify(c(ri)[dA()])||B("input",P()))}),KA(()=>(J(P()),J(M()),c(ri)),()=>{!P()&&M()&&c(ri)&&B("input",P())}),KA(()=>(J(z()),J(k())),()=>{!z()&&k()&&Je()}),KA(()=>(J(Z()),c(j)),()=>{Z()!==c(j)&&(_A()||Z().length!==0)&&(_A()?Ne()(Pt(function*(){Ae(!0);var hA=yield f()({dispatch:B,loadOptions:_A(),convertStringItemsToObjects:nA,filterText:Z()});hA?(Ae(hA.loading),NA(NA()?hA.listOpen:Z().length>0),z(NA()&&hA.focused),CA(QA()?UA(hA.filteredItems):hA.filteredItems)):(Ae(!1),z(!0),NA(!0))}),YA()):(NA(!0),M()&&N(Fe,void 0)))}),KA(()=>(J(h()),J(_A()),J(Z()),J(CA()),J(M()),J(P()),J(dA()),J(QA()),J(wA()),J(HA()),J(BA())),()=>{N(g,h()({loadOptions:_A(),filterText:Z(),items:CA(),multiple:M(),value:P(),itemId:dA(),groupBy:QA(),label:wA(),filterSelectedItems:HA(),itemFilter:BA(),convertStringItemsToObjects:nA,filterGroupedItems:UA}))}),KA(()=>(J(M()),J(NA()),J(P()),c(g)),()=>{!M()&&NA()&&P()&&c(g)&&de(c(g).findIndex(hA=>hA[dA()]===P()[dA()]),!0)}),KA(()=>(J(NA()),J(M())),()=>{NA()&&M()&&He(0)}),KA(()=>J(Z()),()=>{Z()&&He(0)}),KA(()=>J(He()),()=>{var hA;hA=He(),B("hoverItem",hA)}),KA(()=>(J(M()),J(P())),()=>{N(n,M()?P()&&P().length>0:P())}),KA(()=>(c(n),J(Z())),()=>{N(o,c(n)&&Z().length>0)}),KA(()=>(c(n),J(pA()),J(F()),J(Ae())),()=>{N(a,c(n)&&pA()&&!F()&&!Ae())}),KA(()=>(J(W()),J(M()),J(AA()),J(P())),()=>{var hA;N(r,W()&&M()||M()&&((hA=P())===null||hA===void 0?void 0:hA.length)===0?AA():P()?"":AA())}),KA(()=>(J(P()),J(M())),()=>{var hA,FA;N(s,P()?(hA=M(),FA=void 0,FA=hA&&P().length>0?P().map(le=>le[wA()]).join(", "):P()[wA()],an()(FA)):"")}),KA(()=>(c(g),J(He()),J(z()),J(NA())),()=>{N(l,(function(){if(!c(g)||c(g).length===0)return"";var hA=c(g)[He()];if(NA()&&hA){var FA=c(g)?c(g).length:0;return ki()(hA[wA()],FA)}return Ki()()})((c(g),He(),z(),NA())))}),KA(()=>J(CA()),()=>{(function(hA){hA&&hA.length!==0&&!hA.some(FA=>typeof FA!="object")&&P()&&(M()?!P().some(FA=>!FA||!FA[dA()]):P()[dA()])&&(Array.isArray(P())?P(P().map(FA=>GA(FA)||FA)):P(GA()||P()))})(CA())}),KA(()=>(J(M()),J(P()),J(dA())),()=>{Q((M(),P(),dA(),M()?P()?P().map(hA=>hA[dA()]):null:P()?P()[dA()]:P()))}),KA(()=>(J(M()),c(ri),J(P())),()=>{M()||!c(ri)||P()||B("input",P())}),KA(()=>(J(NA()),c(g),J(M()),J(P())),()=>{NA()&&c(g)&&!M()&&!P()&&de()}),KA(()=>c(g),()=>{(function(hA){NA()&&B("filter",hA)})(c(g))}),KA(()=>(J(S()),J(je()),c(Eo)),()=>{S()&&je()&&yo(Object.assign(c(Eo),je()))}),KA(()=>c(Mt),()=>{N(C,!!c(Mt))}),KA(()=>(c(Mt),J(NA())),()=>{(function(hA,FA){if(!hA||!FA)return N(da,!0);setTimeout(()=>{N(da,!1)},0)})(c(Mt),NA())}),KA(()=>(J(NA()),J(S()),c(Mt)),()=>{NA()&&S()&&c(Mt)&&(function(){var{width:hA}=S().getBoundingClientRect();Ml(Mt,c(Mt).style.width=pt()?hA+"px":"auto")})()}),KA(()=>J(He()),()=>{N(I,He())}),KA(()=>(J(k()),J(NA()),J(z())),()=>{k()&&NA()&&!z()&&ze()}),KA(()=>(J(S()),J(je())),()=>{var hA;S()&&((hA=je())===null||hA===void 0?void 0:hA.autoUpdate)===void 0&&Ml(Eo,c(Eo).autoUpdate=!0)}),Ln();var Aa={getFilteredItems:OA,handleClear:Qn};ai();var sa,vo=qIA();we("click",cC,function(hA){var FA;NA()||z()||!S()||S().contains(hA.target)||(FA=c(Mt))!==null&&FA!==void 0&&FA.contains(hA.target)||Ye()}),we("keydown",cC,nt);var ge=gA(vo),wi=hA=>{var FA,le=KIA(),Ge=gA(le),rt=$t=>{var Oi=Gi();Ca(it(Oi),e,"list-prepend",{},null),sA($t,Oi)};zA(Ge,$t=>{uA(()=>A["list-prepend"])&&$t(rt)});var gt=kA(Ge,2),xt=$t=>{var Oi=Gi();Ca(it(Oi),e,"list",{get filteredItems(){return c(g)}},null),sA($t,Oi)},zn=$t=>{var Oi=Gi(),Da=it(Oi),Tt=Hi=>{var en=Gi();Ia(it(en),1,()=>c(g),Sa,($n,mn,Rt)=>{var la,jo=LIA(),D=gA(jo);Ca(gA(D),e,"item",{get item(){return c(mn)},index:Rt},b=>{var R=cr();_e(()=>Gt(R,(c(mn),J(wA()),uA(()=>{var V;return(V=c(mn))===null||V===void 0?void 0:V[wA()]})))),sA(b,R)}),Es(D,(b,R)=>pn?.(b),()=>({scroll:un(c(mn),P(),dA()),listDom:c(C)})),Es(D,(b,R)=>Xn?.(b),()=>({scroll:c(I)===Rt,listDom:c(C)})),_e(b=>la=oi(D,1,"item svelte-1ul7oo4",null,la,b),[()=>{var b,R;return{"list-group-title":c(mn).groupHeader,active:un(c(mn),P(),dA()),first:(R=Rt,R===0),hover:He()===Rt,"group-item":c(mn).groupItem,"not-selectable":((b=c(mn))===null||b===void 0?void 0:b.selectable)===!1}}]),we("mouseover",jo,()=>Bt(Rt)),we("focus",jo,()=>Bt(Rt)),we("click",jo,iC(()=>(function(b){var{item:R,i:V}=b;if(R?.selectable!==!1)return P()&&!M()&&P()[dA()]===R[dA()]?Je():void((function(_){return _.groupHeader&&_.selectable||_.selectable||!_.hasOwnProperty("selectable")})(R)&&(He(V),U(R)))})({item:c(mn),i:Rt}))),we("keydown",jo,D2(iC(function(b){gu.call(this,e,b)}))),sA($n,jo)}),sA(Hi,en)},ct=Hi=>{var en=Gi(),$n=it(en),mn=Rt=>{var la=Gi();Ca(it(la),e,"empty",{},jo=>{sA(jo,GIA())}),sA(Rt,la)};zA($n,Rt=>{DA()||Rt(mn)},!0),sA(Hi,en)};zA(Da,Hi=>{c(g),uA(()=>c(g).length>0)?Hi(Tt):Hi(ct,!1)},!0),sA($t,Oi)};zA(gt,$t=>{uA(()=>A.list)?$t(xt):$t(zn,!1)});var Yi=kA(gt,2),ji=$t=>{var Oi=Gi();Ca(it(Oi),e,"list-append",{},null),sA($t,Oi)};zA(Yi,$t=>{uA(()=>A["list-append"])&&$t(ji)}),Es(le,$t=>$o?.($t)),Ho(le,$t=>N(Mt,$t),()=>c(Mt)),Mr(()=>we("scroll",le,rn)),Mr(()=>we("pointerup",le,D2(iC(function($t){gu.call(this,e,$t)})))),Mr(()=>we("mousedown",le,D2(iC(function($t){gu.call(this,e,$t)})))),_e(()=>FA=oi(le,1,"svelte-select-list svelte-1ul7oo4",null,FA,{prefloat:c(da)})),sA(hA,le)};zA(ge,hA=>{NA()&&hA(wi)});var In=kA(ge,2),fn=gA(In),Po=hA=>{var FA=UIA(),le=it(FA),Ge=gA(le),rt=gA(kA(le,2));_e(()=>{Gt(Ge,c(s)),Gt(rt,c(l))}),sA(hA,FA)};zA(fn,hA=>{z()&&hA(Po)});var wa=kA(In,2);Ca(gA(wa),e,"prepend",{},null);var Ri=kA(wa,2),ho=gA(Ri),Va=hA=>{var FA=Gi(),le=it(FA),Ge=gt=>{var xt=Gi();Ia(it(xt),1,P,Sa,(zn,Yi,ji)=>{var $t,Oi=JIA(),Da=gA(Oi);Ca(gA(Da),e,"selection",{get selection(){return c(Yi)},index:ji},Hi=>{var en=cr();_e(()=>Gt(en,(c(Yi),J(wA()),uA(()=>c(Yi)[wA()])))),sA(Hi,en)});var Tt=kA(Da,2),ct=Hi=>{var en=TIA();Ca(gA(en),e,"multi-clear-icon",{},$n=>{gk($n)}),we("pointerup",en,D2(iC(()=>JA(ji)))),sA(Hi,en)};zA(Tt,Hi=>{F()||x()||!gk||Hi(ct)}),_e(()=>$t=oi(Oi,1,"multi-item svelte-1ul7oo4",null,$t,{active:c(Fe)===ji,disabled:F()})),we("click",Oi,D2(()=>x()?JA(ji):{})),we("keydown",Oi,D2(iC(function(Hi){gu.call(this,e,Hi)}))),sA(zn,Oi)}),sA(gt,xt)},rt=gt=>{var xt,zn=YIA();Ca(gA(zn),e,"selection",{get selection(){return P()}},Yi=>{var ji=cr();_e(()=>Gt(ji,(J(P()),J(wA()),uA(()=>P()[wA()])))),sA(Yi,ji)}),_e(()=>xt=oi(zn,1,"selected-item svelte-1ul7oo4",null,xt,{"hide-selected-item":c(o)})),sA(gt,zn)};zA(le,gt=>{M()?gt(Ge):gt(rt,!1)}),sA(hA,FA)};zA(ho,hA=>{c(n)&&hA(Va)});var bo=kA(ho,2);Z8(bo,()=>ke(ke({readOnly:!EA()},c(tA)),{},{placeholder:c(r),style:XA(),disabled:F()}),void 0,void 0,void 0,"svelte-1ul7oo4",!0),Ho(bo,hA=>k(hA),()=>k());var La=kA(Ri,2),Hn=gA(La),Ji=hA=>{var FA=OIA();Ca(gA(FA),e,"loading-icon",{},le=>{(function(Ge){sA(Ge,FIA())})(le)}),sA(hA,FA)};zA(Hn,hA=>{Ae()&&hA(Ji)});var Vt=kA(Hn,2),Gn=hA=>{var FA=HIA();Ca(gA(FA),e,"clear-icon",{},le=>{gk(le)}),we("click",FA,Qn),sA(hA,FA)};zA(Vt,hA=>{c(a)&&hA(Gn)});var Qo=kA(Vt,2),Go=hA=>{var FA=zIA();Ca(gA(FA),e,"chevron-icon",{get listOpen(){return NA()}},le=>{(function(Ge){sA(Ge,RIA())})(le)}),sA(hA,FA)};zA(Qo,hA=>{ue()&&hA(Go)});var SA=kA(La,2);Ca(SA,e,"input-hidden",{get value(){return P()}},hA=>{var FA=PIA();_e(le=>{Fn(FA,"name",v()),GI(FA,le)},[()=>(J(P()),uA(()=>P()?JSON.stringify(P()):null))]),sA(hA,FA)});var $A=kA(SA,2),ve=hA=>{var FA=Gi();Ca(it(FA),e,"required",{get value(){return P()}},le=>{sA(le,jIA())}),sA(hA,FA)};return zA($A,hA=>{J(vA()),J(P()),uA(()=>vA()&&(!P()||P().length===0))&&hA(ve)}),Mr(()=>we("pointerup",vo,D2(Cn))),Ho(vo,hA=>S(hA),()=>S()),Es(vo,hA=>Lo?.(hA)),_e(()=>{var hA;sa=oi(vo,1,"svelte-select ".concat((hA=ft())!==null&&hA!==void 0?hA:""),"svelte-1ul7oo4",sa,{multi:M(),disabled:F(),focused:z(),"list-open":NA(),"show-chevron":ue(),error:he()}),cg(vo,VA())}),we("keydown",bo,nt),we("blur",bo,Ye),we("focus",bo,ze),aw(bo,Z),sA(i,vo),qt(e,"getFilteredItems",OA),qt(e,"handleClear",Qn),Lt(Aa)}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +table.jse-transform-wizard.svelte-9wqi8y { + border-collapse: collapse; + border-spacing: 0; + width: 100%; +} +table.jse-transform-wizard.svelte-9wqi8y input:where(.svelte-9wqi8y) { + font-family: inherit; + font-size: inherit; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) th:where(.svelte-9wqi8y) { + font-weight: normal; + text-align: left; + width: 60px; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) { + width: 100%; + display: flex; + flex-direction: row; + margin-bottom: calc(0.5 * var(--jse-padding, 10px)); +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select .multi-item { + align-items: center; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select .value-container { + gap: 0 !important; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-filter-path { + flex: 4; + margin-right: calc(0.5 * var(--jse-padding, 10px)); +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-filter-relation { + flex: 1.5; + margin-right: calc(0.5 * var(--jse-padding, 10px)); +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-sort-path { + flex: 3; + margin-right: calc(0.5 * var(--jse-padding, 10px)); +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-sort-direction { + flex: 1; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-projection-paths { + flex: 1; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select input { + box-sizing: border-box; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .jse-filter-value:where(.svelte-9wqi8y) { + flex: 4; + padding: 4px 8px; + border: var(--jse-input-border, 1px solid #d8dbdf); + border-radius: var(--jse-input-radius, 3px); + outline: none; + background: var(--jse-input-background, var(--jse-background-color, #fff)); + color: inherit; +} +table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .jse-filter-value:where(.svelte-9wqi8y):focus { + border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); +}`);var VIA=TA('
        Filter
        Sort
        Pick
        ');function WIA(i,e){var A,t,n,o,a;Ft(e,!1);var r=cA(void 0,!0),s=cA(void 0,!0),l=cA(void 0,!0),g=cA(void 0,!0),C=cA(void 0,!0),I=cA(void 0,!0),B=tr("jsoneditor:TransformWizard"),Q=L(e,"json",9),h=L(e,"queryOptions",29,()=>({})),f=L(e,"onChange",9),m=["==","!=","<","<=",">",">="].map(HA=>({value:HA,label:HA})),v=[{value:"asc",label:"ascending"},{value:"desc",label:"descending"}],S=cA((A=h())!==null&&A!==void 0&&(A=A.filter)!==null&&A!==void 0&&A.path?S2(h().filter.path):void 0,!0),k=cA((t=m.find(HA=>{var vA;return HA.value===((vA=h().filter)===null||vA===void 0?void 0:vA.relation)}))!==null&&t!==void 0?t:m[0],!0),M=cA(((n=h())===null||n===void 0||(n=n.filter)===null||n===void 0?void 0:n.value)||"",!0),x=cA((o=h())!==null&&o!==void 0&&(o=o.sort)!==null&&o!==void 0&&o.path?S2(h().sort.path):void 0,!0),F=cA((a=v.find(HA=>{var vA;return HA.value===((vA=h().sort)===null||vA===void 0?void 0:vA.direction)}))!==null&&a!==void 0?a:v[0],!0);KA(()=>J(Q()),()=>{N(r,Array.isArray(Q()))}),KA(()=>(c(r),J(Q())),()=>{N(s,c(r)?vk(Q()):[])}),KA(()=>(c(r),J(Q())),()=>{N(l,c(r)?vk(Q(),!0):[])}),KA(()=>(c(s),S2),()=>{N(g,c(s).map(S2))}),KA(()=>(c(l),S2),()=>{N(C,c(l)?c(l).map(S2):[])}),KA(()=>(J(h()),c(C),_i),()=>{var HA;N(I,(HA=h())!==null&&HA!==void 0&&(HA=HA.projection)!==null&&HA!==void 0&&HA.paths&&c(C)?h().projection.paths.map(vA=>c(C).find(PA=>_i(PA.value,vA))).filter(vA=>!!vA):void 0)}),KA(()=>c(S),()=>{var HA,vA,PA;vA=(HA=c(S))===null||HA===void 0?void 0:HA.value,_i((PA=h())===null||PA===void 0||(PA=PA.filter)===null||PA===void 0?void 0:PA.path,vA)||(B("changeFilterPath",vA),h(Ur(h(),["filter","path"],vA,!0)),f()(h()))}),KA(()=>c(k),()=>{var HA,vA,PA;vA=(HA=c(k))===null||HA===void 0?void 0:HA.value,_i((PA=h())===null||PA===void 0||(PA=PA.filter)===null||PA===void 0?void 0:PA.relation,vA)||(B("changeFilterRelation",vA),h(Ur(h(),["filter","relation"],vA,!0)),f()(h()))}),KA(()=>c(M),()=>{var HA,vA;HA=c(M),_i((vA=h())===null||vA===void 0||(vA=vA.filter)===null||vA===void 0?void 0:vA.value,HA)||(B("changeFilterValue",HA),h(Ur(h(),["filter","value"],HA,!0)),f()(h()))}),KA(()=>c(x),()=>{var HA,vA,PA;vA=(HA=c(x))===null||HA===void 0?void 0:HA.value,_i((PA=h())===null||PA===void 0||(PA=PA.sort)===null||PA===void 0?void 0:PA.path,vA)||(B("changeSortPath",vA),h(Ur(h(),["sort","path"],vA,!0)),f()(h()))}),KA(()=>c(F),()=>{var HA,vA,PA;vA=(HA=c(F))===null||HA===void 0?void 0:HA.value,_i((PA=h())===null||PA===void 0||(PA=PA.sort)===null||PA===void 0?void 0:PA.direction,vA)||(B("changeSortDirection",vA),h(Ur(h(),["sort","direction"],vA,!0)),f()(h()))}),KA(()=>c(I),()=>{(function(HA){var vA;_i((vA=h())===null||vA===void 0||(vA=vA.projection)===null||vA===void 0?void 0:vA.paths,HA)||(B("changeProjectionPaths",HA),h(Ur(h(),["projection","paths"],HA,!0)),f()(h()))})(c(I)?c(I).map(HA=>HA.value):void 0)}),Ln(),ai(!0);var z=VIA(),P=gA(z),Z=gA(P),AA=kA(gA(Z)),W=gA(AA),CA=gA(W);yI(CA,{class:"jse-filter-path",showChevron:!0,get items(){return c(g)},get value(){return c(S)},set value(HA){N(S,HA)},$$legacy:!0});var wA=kA(CA,2);yI(wA,{class:"jse-filter-relation",showChevron:!0,clearable:!1,get items(){return m},get value(){return c(k)},set value(HA){N(k,HA)},$$legacy:!0});var BA=kA(wA,2),QA=kA(Z),RA=kA(gA(QA)),IA=gA(RA),dA=gA(IA);yI(dA,{class:"jse-sort-path",showChevron:!0,get items(){return c(g)},get value(){return c(x)},set value(HA){N(x,HA)},$$legacy:!0}),yI(kA(dA,2),{class:"jse-sort-direction",showChevron:!0,clearable:!1,get items(){return v},get value(){return c(F)},set value(HA){N(F,HA)},$$legacy:!0});var _A=kA(QA),VA=kA(gA(_A)),he=gA(VA);yI(gA(he),{class:"jse-projection-paths",multiple:!0,showChevron:!0,get items(){return c(C)},get value(){return c(I)},set value(HA){N(I,HA)},$$legacy:!0}),aw(BA,()=>c(M),HA=>N(M,HA)),sA(i,z),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-select-query-language.svelte-jrd4q2 { + position: relative; + width: 32px; +} +.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) { + position: absolute; + top: 0; + right: 0; + display: flex; + flex-direction: column; + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); +} +.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) .jse-query-language:where(.svelte-jrd4q2) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + text-align: left; + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + white-space: nowrap; + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); + background: var(--jse-context-menu-background, #656565); +} +.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) .jse-query-language:where(.svelte-jrd4q2):hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +}`);var ZIA=TA(''),XIA=TA('
        ');function $IA(i,e){Ft(e,!1);var A=L(e,"queryLanguages",8),t=L(e,"queryLanguageId",12),n=L(e,"onChangeQueryLanguage",8);ai();var o=XIA();Ia(gA(o),5,A,Sa,(a,r)=>{var s,l=ZIA(),g=gA(l),C=Q=>{on(Q,{get data(){return u7}})},I=Q=>{on(Q,{get data(){return p7}})};zA(g,Q=>{c(r),J(t()),uA(()=>c(r).id===t())?Q(C):Q(I,!1)});var B=kA(g);_e(()=>{var Q;s=oi(l,1,"jse-query-language svelte-jrd4q2",null,s,{selected:c(r).id===t()}),Fn(l,"title",(c(r),uA(()=>"Select ".concat(c(r).name," as query language")))),Gt(B," ".concat((c(r),(Q=uA(()=>c(r).name))!==null&&Q!==void 0?Q:"")))}),we("click",l,()=>{return Q=c(r).id,t(Q),void n()(Q);var Q}),sA(a,l)}),sA(i,o),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-header.svelte-1k211ye { + display: flex; + background: var(--jse-theme-color, #3883fa); + color: var(--jse-menu-color, var(--jse-text-color-inverse, #fff)); +} +.jse-header.svelte-1k211ye .jse-title:where(.svelte-1k211ye) { + flex: 1; + padding: 5px; + vertical-align: middle; +} +.jse-header.svelte-1k211ye button:where(.svelte-1k211ye) { + border: none; + background: transparent; + min-width: 32px; + color: inherit; + cursor: pointer; +} +.jse-header.svelte-1k211ye button:where(.svelte-1k211ye):hover { + background: rgba(255, 255, 255, 0.1); +}`);var AdA=TA(''),edA=TA('
        ');function pw(i,e){Ft(e,!1);var A=L(e,"title",9,"Modal"),t=L(e,"fullScreenButton",9,!1),n=L(e,"fullscreen",13,!1),o=L(e,"onClose",9,void 0);ai(!0);var a=edA(),r=gA(a),s=gA(r),l=kA(r,2);Ca(l,e,"actions",{},null);var g=kA(l,2),C=B=>{var Q=AdA(),h=gA(Q),f=at(()=>n()?JT:LT);on(h,{get data(){return c(f)}}),we("click",Q,()=>n(!n())),sA(B,Q)};zA(g,B=>{t()&&B(C)});var I=kA(g,2);on(gA(I),{get data(){return g4}}),_e(()=>Gt(s,A())),we("click",I,()=>{var B;return(B=o())===null||B===void 0?void 0:B()}),sA(i,a),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-config.svelte-5gkegr { + border: none; + background: transparent; + min-width: 32px; + color: inherit; + cursor: pointer; +} +.jse-config.svelte-5gkegr:hover { + background: rgba(255, 255, 255, 0.1); +} +.jse-config.hide.svelte-5gkegr { + display: none; +}`);var tdA=TA(''),ck=tr("jsoneditor:AutoScrollHandler");function HP(i){var e,A;function t(r){return r<20?200:r<50?400:1200}function n(){if(i){var r=.05*(e||0);i.scrollTop+=r}}function o(r){A&&r===e||(a(),ck("startAutoScroll",r),e=r,A=setInterval(n,50))}function a(){A&&(ck("stopAutoScroll"),clearInterval(A),A=void 0,e=void 0)}return ck("createAutoScrollHandler",i),{onDrag:function(r){if(i){var s=r.clientY,{top:l,bottom:g}=i.getBoundingClientRect();sg?o(t(s-g)):a()}},onDragEnd:function(){a()}}}var idA=(i,e,A,t)=>(i/=t/2)<1?A/2*i*i+e:-A/2*(--i*(i-2)-1)+e,Hq=()=>{var i,e,A,t,n,o,a,r,s,l,g,C,I;function B(f){return f.getBoundingClientRect().top-(i.getBoundingClientRect?i.getBoundingClientRect().top:0)+A}function Q(f){i.scrollTo?i.scrollTo(i.scrollLeft,f):i.scrollTop=f}function h(f){l||(l=f),Q(o(g=f-l,A,r,s)),I=!0,g1&&arguments[1]!==void 0?arguments[1]:{};switch(s=1e3,n=m.offset||0,C=m.callback,o=m.easing||idA,a=m.a11y||!1,typeof m.container){case"object":i=m.container;break;case"string":i=document.querySelector(m.container);break;default:i=window.document.documentElement}switch(A=i.scrollTop,typeof f){case"number":e=void 0,a=!1,t=A+f;break;case"object":t=B(e=f);break;case"string":e=document.querySelector(f),t=B(e)}switch(r=t-A+n,typeof m.duration){case"number":s=m.duration;break;case"function":s=m.duration(r)}I?l=0:requestAnimationFrame(h)}};function BE(i,e){var A=Date.now(),t=i();return e(Date.now()-A),t}var lE=tr("validation"),ndA={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function zP(i,e,A,t){return d_(i,e,A,t,ndA)}function zq(i,e,A,t){if(lE("validateJSON"),!e)return[];if(A!==t){var n=A.stringify(i);return e(n!==void 0?t.parse(n):void 0)}return e(i)}function odA(i,e,A,t){if(lE("validateText"),i.length>104857600)return{validationErrors:[{path:[],message:"Validation turned off: the document is too large",severity:ic.info}]};if(i.length!==0)try{var n=BE(()=>A.parse(i),s=>lE("validate: parsed json in ".concat(s," ms")));if(!e)return;var o=A===t?n:BE(()=>t.parse(i),s=>lE("validate: parsed json with the validationParser in ".concat(s," ms"))),a=BE(()=>e(o),s=>lE("validate: validated json in ".concat(s," ms")));return zi(a)?void 0:{validationErrors:a}}catch(s){var r=BE(()=>(function(l,g){if(l.length>F1A)return!1;try{return g.parse(Xl(l)),!0}catch(C){return!1}})(i,A),l=>lE("validate: checked whether repairable in ".concat(l," ms")));return{parseError:SE(i,s.message||s.toString()),isRepairable:r}}}var Y8=tr("jsoneditor:FocusTracker");function p_(i){var e,{onMount:A,onDestroy:t,getWindow:n,hasFocus:o,onFocus:a,onBlur:r}=i,s=!1;function l(){var C=o();C&&(clearTimeout(e),s||(Y8("focus"),a(),s=C))}function g(){s&&(clearTimeout(e),e=setTimeout(()=>{o()||(Y8("blur"),s=!1,r())}))}A(()=>{Y8("mount FocusTracker");var C=n();C&&(C.addEventListener("focusin",l,!0),C.addEventListener("focusout",g,!0))}),t(()=>{Y8("destroy FocusTracker");var C=n();C&&(C.removeEventListener("focusin",l,!0),C.removeEventListener("focusout",g,!0))})}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-message.svelte-cbvd26 { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + padding: var(--jse-padding, 10px); + display: flex; + gap: var(--jse-padding, 10px); + flex-wrap: wrap; + align-items: stretch; +} +.jse-message.jse-success.svelte-cbvd26 { + background: var(--message-success-background, #9ac45d); + color: var(--jse-message-success-color, #fff); +} +.jse-message.svelte-cbvd26 .jse-text:where(.svelte-cbvd26) { + display: flex; + flex: 1; + min-width: 60%; + align-items: center; +} +.jse-message.svelte-cbvd26 .jse-text.jse-clickable:where(.svelte-cbvd26) { + cursor: pointer; +} +.jse-message.svelte-cbvd26 .jse-text.jse-clickable:where(.svelte-cbvd26):hover { + background-color: rgba(255, 255, 255, 0.1); +} +.jse-message.jse-error.svelte-cbvd26 { + background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); + color: var(--jse-message-error-color, #fff); +} +.jse-message.jse-warning.svelte-cbvd26 { + background: var(--jse-message-warning-background, #ffde5c); + color: var(--jse-message-warning-color, #4d4d4d); +} +.jse-message.jse-info.svelte-cbvd26 { + background: var(--jse-message-info-background, #4f91ff); + color: var(--jse-message-info-color, #fff); +} +.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) { + display: flex; + gap: var(--jse-padding, 10px); +} +.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) button.jse-action:where(.svelte-cbvd26) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-message-action-background, rgba(255, 255, 255, 0.2)); + color: inherit; + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); +} +.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) button.jse-action:where(.svelte-cbvd26):hover { + background: var(--jse-message-action-background-highlight, rgba(255, 255, 255, 0.3)); +}`);var adA=TA(''),rdA=TA('
        ');function _l(i,e){Ft(e,!1);var A=L(e,"type",9,"success"),t=L(e,"icon",9,void 0),n=L(e,"message",9,void 0),o=L(e,"actions",25,()=>[]),a=L(e,"onClick",9,void 0),r=L(e,"onClose",9,void 0);r()&&Ig(r()),ai(!0);var s,l=rdA(),g=gA(l),C=gA(g),I=gA(C),B=h=>{on(h,{get data(){return t()}})};zA(I,h=>{t()&&h(B)});var Q=kA(I);Ia(kA(g,2),5,o,Sa,(h,f)=>{var m=adA(),v=gA(m),S=M=>{on(M,{get data(){return c(f),uA(()=>c(f).icon)}})};zA(v,M=>{c(f),uA(()=>c(f).icon)&&M(S)});var k=kA(v);_e(()=>{var M;Fn(m,"title",(c(f),uA(()=>c(f).title))),m.disabled=(c(f),uA(()=>c(f).disabled)),Gt(k," ".concat((c(f),(M=uA(()=>c(f).text))!==null&&M!==void 0?M:"")))}),we("click",m,()=>{c(f).onClick&&c(f).onClick()}),we("mousedown",m,()=>{c(f).onMouseDown&&c(f).onMouseDown()}),sA(h,m)}),_e(()=>{var h,f;oi(l,1,"jse-message jse-".concat((h=A())!==null&&h!==void 0?h:""),"svelte-cbvd26"),s=oi(g,1,"jse-text svelte-cbvd26",null,s,{"jse-clickable":!!a()}),Gt(Q," ".concat((f=n())!==null&&f!==void 0?f:""))}),we("click",g,function(){a()&&a()()}),sA(i,l),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-validation-errors-overview.svelte-1342rh4 { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + overflow: auto; + max-height: 25%; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) { + border-collapse: collapse; + width: 100%; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) { + cursor: pointer; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-error:where(.svelte-1342rh4) { + background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); + color: var(--jse-message-error-color, #fff); +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-warning:where(.svelte-1342rh4) { + background: var(--jse-message-warning-background, #ffde5c); + color: var(--jse-message-warning-color, #4d4d4d); +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-warning:where(.svelte-1342rh4):hover { + filter: brightness(105%); +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-info:where(.svelte-1342rh4) { + background: var(--jse-message-info-background, #4f91ff); + color: var(--jse-message-info-color, #fff); +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4):hover { + filter: brightness(110%); +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td:where(.svelte-1342rh4) { + padding: 4px var(--jse-padding, 10px); + vertical-align: middle; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-icon:where(.svelte-1342rh4) { + width: 36px; + box-sizing: border-box; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) { + width: 36px; + box-sizing: border-box; + padding: 0; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) button.jse-validation-errors-collapse:where(.svelte-1342rh4) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + width: 36px; + height: 26px; + cursor: pointer; +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) button.jse-validation-errors-collapse:where(.svelte-1342rh4):hover { + background-color: rgba(255, 255, 255, 0.2); +} +.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td:where(.svelte-1342rh4) div.jse-validation-errors-expand:where(.svelte-1342rh4) { + display: inline-block; + position: relative; + top: 3px; +}`);var sdA=TA(''),ldA=TA(' '),gdA=TA(' '),cdA=TA('
        '),CdA=TA('
        '),IdA=TA('
        ');function f_(i,e){Ft(e,!1);var A=cA(void 0,!0),t=L(e,"validationErrors",9),n=L(e,"selectError",9),o=cA(!0,!0);function a(){N(o,!1)}function r(){N(o,!0)}KA(()=>J(t()),()=>{N(A,t().length)}),Ln(),ai(!0);var s=Gi(),l=it(s),g=C=>{var I=IdA(),B=gA(I),Q=f=>{var m=cdA(),v=gA(m),S=gA(v);Ia(S,1,()=>(J(rw),J(t()),J(L8),uA(()=>rw(t(),L8))),Sa,(x,F,z)=>{var P=ldA(),Z=gA(P);on(gA(Z),{get data(){return o2}});var AA=kA(Z),W=gA(AA),CA=kA(AA),wA=gA(CA),BA=gA(kA(CA)),QA=RA=>{var IA=sdA();on(gA(IA),{get data(){return TT}}),we("click",IA,iC(a)),sA(RA,IA)};zA(BA,RA=>{J(t()),uA(()=>z===0&&t().length>1)&&RA(QA)}),_e(RA=>{var IA;oi(P,1,"jse-validation-".concat((c(F),(IA=uA(()=>c(F).severity))!==null&&IA!==void 0?IA:"")),"svelte-1342rh4"),Gt(W,RA),Gt(wA,(c(F),uA(()=>c(F).message)))},[()=>(J(nl),c(F),uA(()=>nl(c(F).path)))]),we("click",P,()=>{setTimeout(()=>n()(c(F)))}),sA(x,P)});var k=kA(S),M=x=>{var F=gdA(),z=kA(gA(F),2),P=gA(z);_e(()=>Gt(P,"(and ".concat(c(A)-L8," more errors)"))),sA(x,F)};zA(k,x=>{c(A)>L8&&x(M)}),sA(f,m)},h=f=>{var m=CdA(),v=gA(m),S=gA(v),k=gA(S);on(gA(k),{get data(){return o2}});var M=gA(kA(k));on(gA(kA(M)),{get data(){return y7}}),_e(x=>{var F;oi(S,1,"jse-validation-".concat(x??""),"svelte-1342rh4"),Gt(M,"".concat((F=c(A))!==null&&F!==void 0?F:""," validation errors "))},[()=>(J(t()),uA(()=>{return x=t(),[ic.error,ic.warning,ic.info].find(F=>x.some(z=>z.severity===F));var x}))]),we("click",S,r),sA(f,m)};zA(B,f=>{c(o)||c(A)===1?f(Q):f(h,!1)}),sA(C,I)};zA(l,C=>{J(zi),J(t()),uA(()=>!zi(t()))&&C(g)}),sA(i,s),Lt()}function fw(i,e){if(i)return i.addEventListener("keydown",A),{destroy(){i.removeEventListener("keydown",A)}};function A(t){t.key==="Escape"&&(t.preventDefault(),t.stopPropagation(),e())}}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +dialog.jse-modal.svelte-2aoco4 { + border-radius: 3px; + font-size: var(--jse-padding, 10px); + border: none; + padding: 0; + display: flex; + min-width: 0; + margin: auto; + overflow: visible; + transition: width 0.1s ease-in-out, height 0.1s ease-in-out; +} +dialog.jse-modal.jse-sort-modal.svelte-2aoco4 { + width: 400px; +} +dialog.jse-modal.jse-repair-modal.svelte-2aoco4 { + width: 600px; + height: 500px; +} +dialog.jse-modal.jse-jsoneditor-modal.svelte-2aoco4 { + width: 800px; + height: 600px; +} +dialog.jse-modal.jse-transform-modal.svelte-2aoco4 { + width: 1200px; + height: 800px; +} +dialog.jse-modal.jse-fullscreen.svelte-2aoco4 { + width: 100%; + height: 100%; +} +dialog.jse-modal.svelte-2aoco4::backdrop { + background: var(--jse-overlay-background, rgba(0, 0, 0, 0.3)); +} +dialog.jse-modal[open].svelte-2aoco4 { + animation: svelte-2aoco4-zoom 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); +} +dialog.jse-modal[open].svelte-2aoco4::backdrop { + animation: svelte-2aoco4-fade 0.2s ease-out; +} +dialog.jse-modal.svelte-2aoco4 .jse-modal-inner:where(.svelte-2aoco4) { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; + min-height: 0; + padding: 0; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + line-height: normal; + background: var(--jse-modal-background, #f5f5f5); + color: var(--jse-text-color, #4d4d4d); +} +@keyframes svelte-2aoco4-zoom { + from { + transform: scale(0.95); + } + to { + transform: scale(1); + } +} +@keyframes svelte-2aoco4-fade { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +dialog.jse-modal.svelte-2aoco4 .svelte-select { + --border: var(--jse-svelte-select-border, 1px solid #d8dbdf); + --item-is-active-bg: var(--jse-item-is-active-bg, #3883fa); + --border-radius: var(--jse-svelte-select-border-radius, 3px); + --background: var(--jse-svelte-select-background, #fff); + --padding: var(--jse-svelte-select-padding, 0 10px); + --multi-select-padding: var(--jse-svelte-select-multi-select-padding, 0 10px); + --font-size: var(--jse-svelte-select-font-size, var(--jse-font-size, 16px)); + --height: 36px; + --multi-item-height: 28px; + --multi-item-margin: 2px; + --multi-item-padding: 2px 8px; + --multi-item-border-radius: 6px; + --indicator-top: 8px; +}`);var ddA=TA('
        ');function bu(i,e){Ft(e,!1);var A=L(e,"className",8,void 0),t=L(e,"fullscreen",8,!1),n=L(e,"onClose",8),o=cA();function a(){n()()}Vr(()=>c(o).showModal()),Ig(()=>c(o).close()),ai();var r,s=ddA(),l=gA(s);Ca(gA(l),e,"default",{},null),Ho(s,g=>N(o,g),()=>c(o)),Mr(()=>we("close",s,a)),Mr(()=>{return we("pointerdown",s,(g=a,function(){for(var C=arguments.length,I=new Array(C),B=0;Bwe("cancel",s,D2(function(g){gu.call(this,e,g)}))),Es(s,(g,C)=>fw?.(g,C),()=>a),_e(g=>r=oi(s,1,g,"svelte-2aoco4",r,{"jse-fullscreen":t()}),[()=>J2((J(lc),J(A()),uA(()=>lc("jse-modal",A()))))]),sA(i,s),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-modal-contents.svelte-10a6ob6 { + flex: 1; + display: flex; + flex-direction: column; + padding: 20px; + overflow: auto; + min-width: 0; + min-height: 0; +} +.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding-top: var(--jse-padding, 10px); +} +.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} + +.jse-shortcuts.svelte-10a6ob6 { + display: flex; + flex-wrap: wrap; + justify-content: space-around; + margin: calc(2 * var(--jse-padding, 10px)) 0; +} +.jse-shortcuts.svelte-10a6ob6 .jse-shortcut:where(.svelte-10a6ob6) .jse-key:where(.svelte-10a6ob6) { + font-size: 200%; + color: var(--jse-theme-color, #3883fa); +}`);var BdA=TA('
        Clipboard permission is disabled by your browser. You can use:
        for copy
        for cut
        for paste
        ',1);function Pq(i,e){Ft(e,!1);var A=L(e,"onClose",9),t=a_()?"\u2318":"Ctrl";ai(!0),bu(i,{get onClose(){return A()},className:"jse-copy-paste",children:(n,o)=>{var a=BdA(),r=it(a);pw(r,{title:"Copying and pasting",get onClose(){return A()}});var s=kA(r,2),l=kA(gA(s),2),g=gA(l),C=gA(g),I=gA(C),B=kA(g,2),Q=gA(B),h=gA(Q),f=gA(kA(B,2)),m=gA(f),v=gA(kA(l,2));_e(()=>{Gt(I,"".concat(t,"+C")),Gt(h,"".concat(t,"+X")),Gt(m,"".concat(t,"+V"))}),we("click",v,function(){for(var S,k=arguments.length,M=new Array(k),x=0;x'),hdA=TA('
        '),QdA=TA(''),udA=TA('
        ');function Fw(i,e){Ft(e,!1);var A=L(e,"items",25,()=>[]);ai(!0);var t=udA(),n=gA(t);Ca(n,e,"left",{},null);var o=kA(n,2);Ia(o,1,A,Sa,(a,r)=>{var s=Gi(),l=it(s),g=I=>{sA(I,EdA())},C=I=>{var B=Gi(),Q=it(B),h=m=>{sA(m,hdA())},f=m=>{var v=Gi(),S=it(v),k=x=>{var F=QdA(),z=gA(F),P=W=>{on(W,{get data(){return c(r),uA(()=>c(r).icon)}})};zA(z,W=>{c(r),uA(()=>c(r).icon)&&W(P)});var Z=kA(z,2),AA=W=>{var CA=cr();_e(()=>Gt(CA,(c(r),uA(()=>c(r).text)))),sA(W,CA)};zA(Z,W=>{c(r),uA(()=>c(r).text)&&W(AA)}),_e(()=>{var W;oi(F,1,"jse-button ".concat((c(r),(W=uA(()=>c(r).className))!==null&&W!==void 0?W:"")),"svelte-3erbu0"),Fn(F,"title",(c(r),uA(()=>c(r).title))),F.disabled=(c(r),uA(()=>c(r).disabled||!1))}),we("click",F,function(){for(var W,CA=arguments.length,wA=new Array(CA),BA=0;BA{var F=cr();_e(z=>Gt(F,z),[()=>(c(r),uA(()=>(function(z){return console.error("Unknown type of menu item",z),"???"})(c(r))))]),sA(x,F)};zA(S,x=>{J(nC),c(r),uA(()=>nC(c(r)))?x(k):x(M,!1)},!0),sA(m,v)};zA(Q,m=>{J(kk),c(r),uA(()=>kk(c(r)))?m(h):m(f,!1)},!0),sA(I,B)};zA(l,I=>{J(M2),c(r),uA(()=>M2(c(r)))?I(g):I(C,!1)}),sA(a,s)}),Ca(kA(o,2),e,"right",{},null),sA(i,t),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-json-repair-component.svelte-16jv58j { + flex: 1; + display: flex; + flex-direction: column; + background: var(--jse-background-color, #fff); + color: var(--jse-text-color, #4d4d4d); +} +.jse-json-repair-component.svelte-16jv58j .jse-info:where(.svelte-16jv58j) { + padding: calc(0.5 * var(--jse-padding, 10px)); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + vertical-align: center; +} +.jse-json-repair-component.svelte-16jv58j .jse-json-text:where(.svelte-16jv58j) { + flex: 1; + border: none; + padding: 2px; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + background: var(--jse-input-background, var(--jse-background-color, #fff)); + color: var(--jse-text-color, #4d4d4d); + resize: none; + outline: none; +}`);var pdA=TA('
        Repair invalid JSON, then click apply
        '),fdA=TA('
        ');function mdA(i,e){Ft(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=cA(void 0,!0),o=cA(void 0,!0),a=cA(void 0,!0),r=cA(void 0,!0),s=L(e,"text",13,""),l=L(e,"readOnly",9,!1),g=L(e,"onParse",9),C=L(e,"onRepair",9),I=L(e,"onChange",9,void 0),B=L(e,"onApply",9),Q=L(e,"onCancel",9),h=tr("jsoneditor:JSONRepair"),f=cA(void 0,!0);function m(){if(c(f)&&c(A)){var AA=c(A).position!==void 0?c(A).position:0;c(f).setSelectionRange(AA,AA),c(f).focus()}}function v(){B()(s())}function S(){try{s(C()(s())),I()&&I()(s())}catch(AA){}}var k=cA(void 0,!0);KA(()=>J(s()),()=>{N(A,(function(AA){try{return void g()(AA)}catch(W){return SE(AA,W.message)}})(s()))}),KA(()=>J(s()),()=>{N(t,(function(AA){try{return C()(AA),!0}catch(W){return!1}})(s()))}),KA(()=>c(A),()=>{h("error",c(A))}),KA(()=>J(Q()),()=>{N(k,[{type:"space"},{type:"button",icon:g4,title:"Cancel repair",className:"jse-cancel",onClick:Q()}])}),KA(()=>M7,()=>{N(n,{icon:M7,text:"Show me",title:"Scroll to the error location",onClick:m})}),KA(()=>O0,()=>{N(o,{icon:O0,text:"Auto repair",title:"Automatically repair JSON",onClick:S})}),KA(()=>(c(t),c(n),c(o)),()=>{N(a,c(t)?[c(n),c(o)]:[c(n)])}),KA(()=>J(l()),()=>{N(r,[{icon:Km,text:"Apply",title:"Apply fixed JSON",disabled:l(),onClick:v}])}),Ln(),ai(!0);var M=fdA(),x=gA(M);Fw(x,{get items(){return c(k)},$$slots:{left:(AA,W)=>{sA(AA,pdA())}}});var F=kA(x,2),z=AA=>{var W=at(()=>(c(A),uA(()=>"Cannot parse JSON: ".concat(c(A).message))));_l(AA,{type:"error",get icon(){return o2},get message(){return c(W)},get actions(){return c(a)}})},P=AA=>{_l(AA,{type:"success",message:"JSON is valid now and can be parsed.",get actions(){return c(r)}})};zA(F,AA=>{c(A)?AA(z):AA(P,!1)});var Z=kA(F,2);Ho(Z,AA=>N(f,AA),()=>c(f)),_e(()=>{Z.readOnly=l(),GI(Z,s())}),we("input",Z,function(AA){h("handleChange");var W=AA.target.value;s()!==W&&(s(W),I()&&I()(s()))}),sA(i,M),Lt()}function jq(i,e){Ft(e,!1);var A=L(e,"text",13),t=L(e,"onParse",9),n=L(e,"onRepair",9),o=L(e,"onApply",9),a=L(e,"onClose",9);function r(l){o()(l),a()()}function s(){a()()}ai(!0),bu(i,{get onClose(){return a()},className:"jse-repair-modal",children:(l,g)=>{mdA(l,{get onParse(){return t()},get onRepair(){return n()},onApply:r,onCancel:s,get text(){return A()},set text(C){A(C)},$$legacy:!0})},$$slots:{default:!0}}),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +div.jse-collapsed-items.svelte-1v6dhm4 { + margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); + padding: calc(0.5 * var(--jse-padding, 10px)); + border: 8px solid transparent; + border-width: 8px 0; + background-color: var(--jse-contents-background-color, transparent); + background-image: linear-gradient(var(--jse-collapsed-items-background-color, #f5f5f5), var(--jse-collapsed-items-background-color, #f5f5f5)), linear-gradient(to bottom right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to bottom left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%); + background-repeat: repeat, repeat-x, repeat-x, repeat-x, repeat-x; + background-position: 0 0, 8px 0, 8px 0, 8px 100%, 8px 100%; + background-size: auto auto, 16px 16px, 16px 16px, 16px 16px, 16px 16px; + background-clip: padding-box, border-box, border-box, border-box, border-box; + background-origin: padding-box, border-box, border-box, border-box, border-box; + display: flex; +} +div.jse-collapsed-items.jse-selected.svelte-1v6dhm4 { + background-color: var(--jse-selection-background-color, #d3d3d3); + --jse-collapsed-items-background-color: var(--jse-collapsed-items-selected-background-color, #c2c2c2); +} +div.jse-collapsed-items.svelte-1v6dhm4 div.jse-text:where(.svelte-1v6dhm4), +div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4) { + margin: 0 calc(0.5 * var(--jse-padding, 10px)); +} +div.jse-collapsed-items.svelte-1v6dhm4 div.jse-text:where(.svelte-1v6dhm4) { + display: inline; +} +div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4) { + font-family: inherit; + font-size: inherit; + color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); + background: none; + border: none; + padding: 0; + text-decoration: underline; + cursor: pointer; +} +div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4):hover, div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4):focus { + color: var(--jse-collapsed-items-link-color-highlight, #ee5341); +}`);var wdA=TA(''),DdA=TA('
        ');function ydA(i,e){Ft(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=cA(void 0,!0),o=cA(void 0,!0),a=cA(void 0,!0),r=L(e,"visibleSections",9),s=L(e,"sectionIndex",9),l=L(e,"total",9),g=L(e,"path",9),C=L(e,"selection",9),I=L(e,"onExpandSection",9),B=L(e,"context",9);KA(()=>(J(r()),J(s())),()=>{N(A,r()[s()])}),KA(()=>c(A),()=>{N(t,c(A).end)}),KA(()=>(J(r()),J(s()),J(l())),()=>{N(n,r()[s()+1]?r()[s()+1].start:l())}),KA(()=>(J(B()),J(C()),J(g()),c(t)),()=>{N(o,Du(B().getJson(),C(),g().concat(String(c(t)))))}),KA(()=>(c(t),c(n)),()=>{N(a,(function(k,M){var x={start:k,end:Math.min(Sk(k),M)},F=Math.max(lw((k+M)/2),k),z={start:F,end:Math.min(Sk(F),M)},P=lw(M),Z=P===M?P-pu:P,AA={start:Math.max(Z,k),end:M},W=[x],CA=z.start>=x.end&&z.end<=AA.start;return CA&&W.push(z),AA.start>=(CA?z.end:x.end)&&W.push(AA),W})(c(t),c(n)))}),Ln(),ai(!0);var Q,h,f=DdA(),m=gA(f),v=gA(m),S=gA(v);Ia(kA(v,2),1,()=>c(a),Sa,(k,M)=>{var x=wdA(),F=gA(x);_e(()=>{var z,P;return Gt(F,"show ".concat((c(M),(z=uA(()=>c(M).start))!==null&&z!==void 0?z:""),"-").concat((c(M),(P=uA(()=>c(M).end))!==null&&P!==void 0?P:"")))}),we("click",x,()=>I()(g(),c(M))),sA(k,x)}),_e(()=>{var k,M;Q=oi(f,1,"jse-collapsed-items svelte-1v6dhm4",null,Q,{"jse-selected":c(o)}),h=cg(f,"",h,{"--level":(J(g()),uA(()=>g().length+2))}),Gt(S,"Items ".concat((k=c(t))!==null&&k!==void 0?k:"","-").concat((M=c(n))!==null&&M!==void 0?M:""))}),we("mousemove",f,function(k){k.stopPropagation()}),sA(i,f),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-context-menu-pointer.svelte-10ijtzr { + position: absolute; + top: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); + right: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); + width: var(--jse-context-menu-pointer-size, calc(1em + 4px)); + height: var(--jse-context-menu-pointer-size, calc(1em + 4px)); + padding: 0; + margin: 0; + cursor: pointer; + background: transparent; + border-radius: 2px; + background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); + color: var(--jse-context-menu-pointer-color, var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff))); + border: none; + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); +} +.jse-context-menu-pointer.jse-root.svelte-10ijtzr { + top: 0; + right: calc(-2px - var(--jse-context-menu-pointer-size, calc(1em + 4px))); +} +.jse-context-menu-pointer.jse-insert.svelte-10ijtzr { + right: -1px; +} +.jse-context-menu-pointer.svelte-10ijtzr:hover { + background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); +} +.jse-context-menu-pointer.jse-selected.svelte-10ijtzr { + background: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); +} +.jse-context-menu-pointer.jse-selected.svelte-10ijtzr:hover { + background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); +}`);var vdA=TA('');function y2(i,e){Ft(e,!1);var A=L(e,"root",9,!1),t=L(e,"insert",9,!1),n=L(e,"selected",9),o=L(e,"onContextMenu",9);ai(!0);var a,r=vdA();on(gA(r),{get data(){return qc}}),_e(()=>{a=oi(r,1,"jse-context-menu-pointer svelte-10ijtzr",null,a,{"jse-root":A(),"jse-insert":t(),"jse-selected":n()}),Fn(r,"title",s_)}),we("click",r,function(s){for(var l=s.target;l&&l.nodeName!=="BUTTON";)l=l.parentNode;l&&o()({anchor:l,left:0,top:0,width:sC,height:rC,offsetTop:2,offsetLeft:0,showTip:!0})}),sA(i,r),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-key.svelte-1n4cez4 { + display: inline-block; + min-width: 2em; + padding: 0 5px; + box-sizing: border-box; + outline: none; + border-radius: 1px; + vertical-align: top; + color: var(--jse-key-color, #1a1a1a); + word-break: normal; + overflow-wrap: normal; + white-space: pre-wrap; +} +.jse-key.jse-empty.svelte-1n4cez4 { + min-width: 3em; + outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + -moz-outline-radius: 2px; +} +.jse-key.jse-empty.svelte-1n4cez4::after { + pointer-events: none; + color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + content: "key"; +}`);var bdA=TA('
        '),MdA=TA(" ",1),SdA=TA('
        ');function qq(i,e){Ft(e,!0);var A=tl(()=>hn(e.selection)&&$a(e.selection)),t=tl(()=>e.context.onRenderValue({path:e.path,value:e.value,mode:e.context.mode,truncateTextSize:e.context.truncateTextSize,readOnly:e.context.readOnly,enforceString:e.enforceString,isEditing:c(A),parser:e.context.parser,normalization:e.context.normalization,selection:e.selection,searchResultItems:e.searchResultItems,onPatch:e.context.onPatch,onPasteJson:e.context.onPasteJson,onSelect:e.context.onSelect,onFind:e.context.onFind,findNextInside:e.context.findNextInside,focus:e.context.focus})),n=Gi();Ia(it(n),17,()=>c(t),Sa,(o,a)=>{var r=Gi(),s=it(r),l=C=>{var I=tl(()=>c(a).action),B=SdA();Es(B,(Q,h)=>{var f;return(f=c(I))===null||f===void 0?void 0:f(Q,h)},()=>c(a).props),sA(C,B)},g=C=>{var I=tl(()=>c(a).component),B=Gi();Wj(it(B),()=>c(I),(Q,h)=>{h(Q,K2(()=>c(a).props))}),sA(C,B)};zA(s,C=>{T1A(c(a))?C(l):C(g,!1)}),sA(o,r)}),sA(i,n),Lt()}var kdA={selecting:!1,selectionAnchor:void 0,selectionAnchorType:void 0,selectionFocus:void 0,dragging:!1};function Ck(i){var{json:e,selection:A,deltaY:t,items:n}=i;if(!A)return{operations:void 0,updatedSelection:void 0,offset:0};var o=t<0?(function(g){for(var{json:C,items:I,selection:B,deltaY:Q}=g,h=lC(C,B),f=I.findIndex(x=>_i(x.path,h)),m=()=>{var x;return(x=I[v-1])===null||x===void 0?void 0:x.height},v=f,S=0;m()!==void 0&&Math.abs(Q)>S+m()/2;)S+=m(),v-=1;var k=I[v].path,M=v-f;return v!==f&&I[v]!==void 0?{beforePath:k,offset:M}:void 0})({json:e,selection:A,deltaY:t,items:n}):(function(g){for(var C,{json:I,items:B,selection:Q,deltaY:h}=g,f=T2(I,Q),m=B.findIndex(Z=>_i(Z.path,f)),v=0,S=m,k=()=>{var Z;return(Z=B[S+1])===null||Z===void 0?void 0:Z.height};k()!==void 0&&Math.abs(h)>v+k()/2;)v+=k(),S+=1;var M=Vi(f),x=Ze(I,M),F=Array.isArray(x)?S:S+1,z=(C=B[F])===null||C===void 0?void 0:C.path,P=S-m;return z?{beforePath:z,offset:P}:{append:!0,offset:P}})({json:e,selection:A,deltaY:t,items:n});if(!o||o.offset===0)return{operations:void 0,updatedSelection:void 0,offset:0};var a=(function(g,C,I){if(!C)return[];var B="beforePath"in I?I.beforePath:void 0,Q="append"in I?I.append:void 0,h=Vi(dt(C)),f=Ze(g,h);if(!(Q||B&&I0(B,h)&&B.length>h.length))return[];var m=lC(g,C),v=T2(g,C),S=Ni(m),k=Ni(v),M=B?B[h.length]:void 0;if(!oa(f)){if(Zo(f)){var x=Sr(S),F=Sr(k),z=M!==void 0?Sr(M):f.length;return GR(F-x+1,z({op:"move",from:bt(h.concat(String(x+CA))),path:bt(h.concat(String(z+CA)))}):()=>({op:"move",from:bt(h.concat(String(x))),path:bt(h.concat(String(z)))}))}throw new Error("Cannot create move operations: parent must be an Object or Array")}var P=Object.keys(f),Z=P.indexOf(S),AA=P.indexOf(k),W=Q?P.length:M!==void 0?P.indexOf(M):-1;return Z!==-1&&AA!==-1&&W!==-1?W>Z?[...P.slice(Z,AA+1),...P.slice(W,P.length)].map(CA=>O2(h,CA)):[...P.slice(W,Z),...P.slice(AA+1,P.length)].map(CA=>O2(h,CA)):[]})(e,A,o),r=Vi(lC(e,A)),s=Ze(e,r);if(Array.isArray(s)){var l=(function(g){var C,I,{items:B,json:Q,selection:h,offset:f}=g,m=lC(Q,h),v=T2(Q,h),S=B.findIndex(F=>_i(F.path,m)),k=B.findIndex(F=>_i(F.path,v)),M=(C=B[S+f])===null||C===void 0?void 0:C.path,x=(I=B[k+f])===null||I===void 0?void 0:I.path;return ds(M,x)})({items:n,json:e,selection:A,offset:o.offset});return{operations:a,updatedSelection:l,offset:o.offset}}return{operations:a,updatedSelection:void 0,offset:o.offset}}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +button.jse-validation-error.svelte-q6a061 { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + padding: 0; + margin: 0; + vertical-align: top; + display: inline-flex; + color: var(--jse-error-color, #ee5341); +} + +button.jse-validation-info.svelte-q6a061 { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + padding: 0; + margin: 0; + vertical-align: top; + display: inline-flex; + color: var(--jse-info-color, #4f91ff); +} + +button.jse-validation-warning.svelte-q6a061 { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + padding: 0; + margin: 0; + vertical-align: top; + display: inline-flex; + color: var(--jse-warning-color, #fdc539); +}`);var _dA=TA('');function mE(i,e){Ft(e,!1);var A=cA(),t=H2("absolute-popup"),n=L(e,"validationError",8),o=L(e,"onExpand",8);KA(()=>J(n()),()=>{N(A,U1A(n())&&n().isChildError?"Contains invalid data":n().message)}),Ln(),ai();var a=_dA();on(gA(a),{get data(){return o2}}),Mr(()=>we("click",a,function(){for(var r,s=arguments.length,l=new Array(s),g=0;gRE?.(r,s),()=>ke({text:c(A)},t)),_e(()=>{var r;return oi(a,1,"jse-validation-".concat((J(n()),(r=uA(()=>n().severity))!==null&&r!==void 0?r:"")),"svelte-q6a061")}),sA(i,a),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-expand.svelte-1qi6rc1 { + width: var(--jse-indent-size, calc(1em + 4px)); + padding: 0; + margin: 0; + border: none; + cursor: pointer; + background: transparent; + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); + font-size: var(--jse-font-size-mono, 14px); + height: var(--jse-line-height, calc(1em + 4px)); +} +.jse-expand.svelte-1qi6rc1:hover { + opacity: 0.8; +} + +.jse-meta.svelte-1qi6rc1, +.jse-separator.svelte-1qi6rc1, +.jse-index.svelte-1qi6rc1, +.jse-bracket.svelte-1qi6rc1 { + vertical-align: top; + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); +} + +.jse-index.svelte-1qi6rc1 { + padding: 0 calc(0.5 * var(--jse-padding, 10px)); +} + +.jse-bracket.svelte-1qi6rc1 { + padding: 0 2px; +} +.jse-bracket.jse-expanded.svelte-1qi6rc1 { + padding-right: var(--jse-padding, 10px); +} + +.jse-identifier.svelte-1qi6rc1 { + vertical-align: top; + position: relative; +} + +.jse-json-node.svelte-1qi6rc1 { + position: relative; + color: var(--jse-text-color, #4d4d4d); +} +.jse-json-node.jse-root.svelte-1qi6rc1 { + min-height: 100%; + padding-bottom: 2px; + box-sizing: border-box; +} +.jse-json-node.jse-root.svelte-1qi6rc1 > .jse-contents-outer:where(.svelte-1qi6rc1) > .jse-contents:where(.svelte-1qi6rc1) { + padding-left: 0; +} +.jse-json-node.svelte-1qi6rc1 .jse-props:where(.svelte-1qi6rc1), +.jse-json-node.svelte-1qi6rc1 .jse-items:where(.svelte-1qi6rc1) { + position: relative; +} +.jse-json-node.svelte-1qi6rc1 .jse-header-outer:where(.svelte-1qi6rc1), +.jse-json-node.svelte-1qi6rc1 .jse-footer-outer:where(.svelte-1qi6rc1) { + display: flex; + margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); +} +.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1) { + position: relative; +} +.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1) .jse-meta:where(.svelte-1qi6rc1) > .jse-meta-inner:where(.svelte-1qi6rc1) { + display: flex; + justify-content: center; +} +.jse-json-node.svelte-1qi6rc1 .jse-contents-outer:where(.svelte-1qi6rc1) { + display: flex; + margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); +} +.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), +.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) { + display: flex; + flex-direction: row; + align-items: flex-start; +} +.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) { + padding-left: var(--jse-indent-size, calc(1em + 4px)); + cursor: var(--jse-contents-cursor, pointer); +} +.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) .jse-value-outer:where(.svelte-1qi6rc1) { + display: inline-flex; +} +.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { + display: inline-flex; + padding-left: calc(var(--jse-indent-size, calc(1em + 4px)) + 5px); +} +.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), +.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1), +.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { + background: var(--jse-contents-background-color, transparent); +} +.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area:where(.svelte-1qi6rc1) { + padding: 0 calc(0.5 * var(--jse-padding, 10px)); + flex: 1; +} +.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area.jse-inside:where(.svelte-1qi6rc1) { + display: inline-flex; + align-items: center; +} +.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area.jse-after:where(.svelte-1qi6rc1) { + display: flex; + align-items: flex-end; +} +.jse-json-node.svelte-1qi6rc1 .jse-context-menu-pointer-anchor:where(.svelte-1qi6rc1) { + position: relative; +} +.jse-json-node.svelte-1qi6rc1 .jse-insert-area:where(.svelte-1qi6rc1) { + display: flex; + position: relative; + z-index: 1; + margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); + max-width: 250px; + min-width: 100px; + height: 0; + margin-right: calc(0.5 * var(--jse-padding, 10px)); + outline: 1px solid; +} +.jse-json-node.svelte-1qi6rc1 .jse-insert-area.jse-hovered:where(.svelte-1qi6rc1) { + outline-color: var(--jse-context-menu-pointer-hover-background, #b2b2b2); +} +.jse-json-node.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1) { + position: relative; +} +.jse-json-node.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1):hover, +.jse-json-node.svelte-1qi6rc1 .jse-value-outer:where(.svelte-1qi6rc1):hover, +.jse-json-node.svelte-1qi6rc1 .jse-meta:where(.svelte-1qi6rc1):hover, +.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1):hover { + background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); + cursor: var(--jse-contents-cursor, pointer); +} +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer { + background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); + cursor: var(--jse-contents-cursor, pointer); +} +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-meta, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-value-outer, +.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-meta { + background: none; +} +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1), +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { + background: var(--jse-selection-background-color, #d3d3d3); + cursor: var(--jse-contents-selected-cursor, grab); +} +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1):hover, +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-value-outer:where(.svelte-1qi6rc1):hover, +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-meta:where(.svelte-1qi6rc1):hover, +.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1):hover { + background: inherit; + cursor: inherit; +} +.jse-json-node.svelte-1qi6rc1 .jse-key-outer.jse-selected-key:where(.svelte-1qi6rc1) { + background: var(--jse-selection-background-color, #d3d3d3); + cursor: var(--jse-contents-selected-cursor, grab); +} +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-value-outer, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-meta, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-header, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-contents, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-header, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-contents, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-footer { + background: var(--jse-selection-background-color, #d3d3d3); + cursor: var(--jse-contents-selected-cursor, grab); +} +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-value-outer .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-meta .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-header .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-contents .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-header .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-contents .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-footer .jse-key-outer:hover { + background: inherit; + cursor: inherit; +} +.jse-json-node.jse-readonly.svelte-1qi6rc1 { + --jse-contents-selected-cursor: pointer; +} +.jse-json-node.svelte-1qi6rc1 .jse-insert-area.jse-selected:where(.svelte-1qi6rc1) { + outline-color: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); +}`);var Yo=bw(()=>kdA),xdA=TA('
        :
        '),RdA=TA('
        [
         ',1),NdA=TA('
        [
        ]
        ',1),FdA=TA('
        '),LdA=TA('
        '),GdA=TA('
        '),KdA=TA('
        '),UdA=TA('
        '),TdA=TA(" ",1),JdA=TA('
        '),YdA=TA('
        ',1),OdA=TA('
        ',1),HdA=TA('
        :
        '),zdA=TA('
        {
        '),PdA=TA('
        {
        }
        ',1),jdA=TA('
        '),qdA=TA('
        '),VdA=TA('
        '),WdA=TA('
        '),ZdA=TA('
        '),XdA=TA('
        '),$dA=TA('
        ',1),ABA=TA('
        ',1),eBA=TA('
        :
        '),tBA=TA('
        '),iBA=TA('
        '),nBA=TA('
        '),oBA=TA('
        '),aBA=TA('
        ');function Jk(i,e){Ft(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=L(e,"pointer",9),o=L(e,"value",9),a=L(e,"state",9),r=L(e,"validationErrors",9),s=L(e,"searchResults",9),l=L(e,"selection",9),g=L(e,"context",9),C=L(e,"onDragSelectionStart",9),I=tr("jsoneditor:JSONNode"),B=cA(void 0,!0),Q=void 0,h=cA(void 0,!0),f=cA(void 0,!0),m=cA(void 0,!0),v=cA(void 0,!0),S=cA(void 0,!0),k=cA(void 0,!0),M=cA(void 0,!0);function x(OA){OA.stopPropagation();var EA=r_(OA);g().onExpand(c(f),!c(m),EA)}function F(){g().onExpand(c(f),!0)}function z(OA,EA){var XA=Tu(c(f),Object.keys(o()),OA,EA);return g().onPatch(XA),Ni(gs(XA[0].path))}function P(OA){g().onDrag(OA)}function Z(OA){Yo().selecting&&(Yo(Yo().selecting=!1),OA.stopPropagation()),g().onDragEnd(),document.removeEventListener("mousemove",P,!0),document.removeEventListener("mouseup",Z)}function AA(){var OA;return((OA=g().findElement([]))===null||OA===void 0||(OA=OA.getBoundingClientRect())===null||OA===void 0?void 0:OA.top)||0}function W(OA,EA){var XA=AA()-OA.initialContentTop;return EA.clientY-OA.initialClientY-XA}function CA(OA){if(!g().readOnly&&l()){var EA=Vi(dt(l()));if(_i(c(f),EA)){var XA=(function(YA,DA){var Kt=[];function pt(X){var tA=c(f).concat(X),nA=g().findElement(tA);nA!==void 0&&Kt.push({path:tA,height:nA.clientHeight})}if(Array.isArray(o())){var ue=g().getJson();if(ue===void 0)return;var Ot=lC(ue,YA),He=T2(ue,YA),je=parseInt(Ni(Ot),10),ft=parseInt(Ni(He),10),Fe=DA.find(X=>je>=X.start&&ft<=X.end);if(!Fe)return;var{start:ri,end:j}=Fe;tq(ri,Math.min(o().length,j),X=>pt(String(X)))}else Object.keys(o()).forEach(pt);return Kt})(l(),c(S)||uE);if(I("dragSelectionStart",{selection:l(),items:XA}),XA){var pA=g().getJson();if(pA!==void 0){var Ae=lC(pA,l()),NA=XA.findIndex(YA=>_i(YA.path,Ae)),{offset:Ne}=Ck({json:pA,selection:g().getSelection(),deltaY:0,items:XA});N(h,{initialTarget:OA.target,initialClientY:OA.clientY,initialContentTop:AA(),selectionStartIndex:NA,selectionItemsCount:Y2(pA,l()).length,items:XA,offset:Ne,didMoveItems:!1}),Yo(Yo().dragging=!0),document.addEventListener("mousemove",wA,!0),document.addEventListener("mouseup",BA)}}else I("Cannot drag the current selection (probably spread over multiple sections)")}else C()(OA)}}function wA(OA){if(c(h)){var EA=g().getJson();if(EA===void 0)return;var XA=W(c(h),OA),{offset:pA}=Ck({json:EA,selection:g().getSelection(),deltaY:XA,items:c(h).items});pA!==c(h).offset&&(I("drag selection",pA,XA),N(h,ke(ke({},c(h)),{},{offset:pA,didMoveItems:!0})))}}function BA(OA){if(c(h)){var EA=g().getJson();if(EA===void 0)return;var XA=W(c(h),OA),{operations:pA,updatedSelection:Ae}=Ck({json:EA,selection:g().getSelection(),deltaY:XA,items:c(h).items});if(pA)g().onPatch(pA,(YA,DA)=>({state:DA,selection:Ae??l()}));else if(OA.target===c(h).initialTarget&&!c(h).didMoveItems){var NA=$S(OA.target),Ne=dq(OA.target);Ne&&g().onSelect(vP(NA,Ne))}N(h,void 0),Yo(Yo().dragging=!1),document.removeEventListener("mousemove",wA,!0),document.removeEventListener("mouseup",BA)}}function QA(OA){OA.shiftKey||(OA.stopPropagation(),OA.preventDefault(),g().onSelect(uC(c(f))))}function RA(OA){OA.shiftKey||(OA.stopPropagation(),OA.preventDefault(),g().onSelect(IC(c(f))))}function IA(OA){g().onSelect(uC(c(f))),Fo(),g().onContextMenu(OA)}function dA(OA){g().onSelect(IC(c(f))),Fo(),g().onContextMenu(OA)}KA(()=>J(n()),()=>{N(f,gs(n()))}),KA(()=>J(n()),()=>{N(A,encodeURIComponent(n()))}),KA(()=>J(a()),()=>{N(m,!!KI(a())&&a().expanded)}),KA(()=>(J(o()),J(a())),()=>{N(v,l0(o(),a(),[]))}),KA(()=>J(a()),()=>{N(S,Ar(a())?a().visibleSections:void 0)}),KA(()=>J(r()),()=>{var OA;N(k,(OA=r())===null||OA===void 0?void 0:OA.validationError)}),KA(()=>(J(g()),J(l()),c(f)),()=>{N(M,Du(g().getJson(),l(),c(f)))}),KA(()=>c(f),()=>{N(t,c(f).length===0)}),Ln(),ai(!0);var _A,VA,he=aBA(),HA=gA(he),vA=OA=>{var EA=OdA(),XA=it(EA),pA=gA(XA),Ae=gA(pA),NA=gA(Ae),Ne=GA=>{on(GA,{get data(){return qc}})},YA=GA=>{on(GA,{get data(){return uB}})};zA(NA,GA=>{c(m)?GA(Ne):GA(YA,!1)});var DA=kA(Ae,2);Ca(DA,e,"identifier",{},null);var Kt=kA(DA,2),pt=GA=>{sA(GA,xdA())};zA(Kt,GA=>{c(t)||GA(pt)});var ue=kA(Kt,2),Ot=gA(ue),He=gA(Ot),je=GA=>{var JA=RdA();ew(kA(it(JA),2),{children:(Qt,nt)=>{var ze=cr();_e(()=>{var Ye,di;return Gt(ze,"".concat((J(o()),(Ye=uA(()=>o().length))!==null&&Ye!==void 0?Ye:""),` + `).concat((J(o()),(di=uA(()=>o().length===1?"item":"items"))!==null&&di!==void 0?di:"")))}),sA(Qt,ze)},$$slots:{default:!0}}),sA(GA,JA)},ft=GA=>{var JA=NdA();ew(kA(it(JA),2),{onclick:F,children:(Qt,nt)=>{var ze=cr();_e(()=>{var Ye,di;return Gt(ze,"".concat((J(o()),(Ye=uA(()=>o().length))!==null&&Ye!==void 0?Ye:""),` + `).concat((J(o()),(di=uA(()=>o().length===1?"item":"items"))!==null&&di!==void 0?di:"")))}),sA(Qt,ze)},$$slots:{default:!0}}),sA(GA,JA)};zA(He,GA=>{c(m)?GA(je):GA(ft,!1)});var Fe=kA(ue,2),ri=GA=>{var JA=FdA();y2(gA(JA),{get root(){return c(t)},selected:!0,get onContextMenu(){return J(g()),uA(()=>g().onContextMenu)}}),sA(GA,JA)};zA(Fe,GA=>{J(g()),c(M),J(l()),J(hn),J(Io),J($a),J(_i),J(dt),c(f),uA(()=>!g().readOnly&&c(M)&&l()&&(hn(l())||Io(l()))&&!$a(l())&&_i(dt(l()),c(f)))&&GA(ri)});var j=kA(pA,2),X=GA=>{mE(GA,{get validationError(){return c(k)},onExpand:F})};zA(j,GA=>{c(k),c(m),uA(()=>c(k)&&(!c(m)||!c(k).isChildError))&&GA(X)});var tA=kA(j,2),nA=GA=>{var JA=LdA();we("click",JA,QA),sA(GA,JA)},UA=GA=>{var JA=GdA();we("click",JA,RA),sA(GA,JA)};zA(tA,GA=>{c(m)?GA(nA):GA(UA,!1)});var de=kA(XA,2),pe=GA=>{var JA=YdA(),Qt=it(JA),nt=gA(Qt),ze=Qn=>{var Je,an,ki=KdA(),Ki=gA(ki),An=at(()=>(c(M),J(ja),J(l()),uA(()=>c(M)&&ja(l()))));y2(Ki,{insert:!0,get selected(){return c(An)},onContextMenu:IA}),_e(Mt=>{Je=oi(ki,1,"jse-insert-area jse-inside svelte-1qi6rc1",null,Je,Mt),Fn(ki,"title",tk),an=cg(ki,"",an,{"--level":(c(f),uA(()=>c(f).length+1))})},[()=>({"jse-hovered":c(B)===pI,"jse-selected":c(M)&&ja(l())})]),sA(Qn,ki)};zA(nt,Qn=>{J(g()),c(B),J(pI),c(M),J(ja),J(l()),uA(()=>!g().readOnly&&(c(B)===pI||c(M)&&ja(l())))&&Qn(ze)}),Ia(kA(nt,2),1,()=>c(S)||uE,Sa,(Qn,Je,an)=>{var ki=TdA(),Ki=it(ki);Ia(Ki,1,()=>(J(o()),c(Je),c(h),uA(()=>(function(rn,Ut,U){var Bt=Ut.start,ui=Math.min(Ut.end,rn.length),un=LD(Bt,ui);return U&&U.offset!==0?aP(un,U.selectionStartIndex,U.selectionItemsCount,U.offset).map((pn,Xn)=>({index:pn,gutterIndex:Xn})):un.map(pn=>({index:pn,gutterIndex:pn}))})(o(),c(Je),c(h)))),rn=>rn.index,(rn,Ut)=>{var U=at(()=>(J(Ar),J(r()),c(Ut),uA(()=>Ar(r())?r().items[c(Ut).index]:void 0))),Bt=at(()=>(J(U8),J(g()),J(l()),c(f),c(Ut),uA(()=>U8(g().getJson(),l(),c(f).concat(String(c(Ut).index)))))),ui=Gi(),un=it(ui),pn=at(()=>(J(A4),J(n()),c(Ut),uA(()=>A4(n(),c(Ut).index)))),Xn=at(()=>(J(Ar),J(a()),c(Ut),uA(()=>Ar(a())?a().items[c(Ut).index]:void 0))),zo=at(()=>(J(Ar),J(s()),c(Ut),uA(()=>Ar(s())?s().items[c(Ut).index]:void 0)));Jk(un,{get value(){return J(o()),c(Ut),uA(()=>o()[c(Ut).index])},get pointer(){return c(pn)},get state(){return c(Xn)},get validationErrors(){return c(U)},get searchResults(){return c(zo)},get selection(){return c(Bt)},get context(){return g()},onDragSelectionStart:CA,$$slots:{identifier:(Eo,Lo)=>{var $o=UdA(),yo=gA($o),da=gA(yo);_e(()=>Gt(da,(c(Ut),uA(()=>c(Ut).gutterIndex)))),sA(Eo,$o)}}}),sA(rn,ui)});var An=kA(Ki,2),Mt=rn=>{var Ut=at(()=>c(S)||uE);ydA(rn,{get visibleSections(){return c(Ut)},sectionIndex:an,get total(){return J(o()),uA(()=>o().length)},get path(){return c(f)},get onExpandSection(){return J(g()),uA(()=>g().onExpandSection)},get selection(){return l()},get context(){return g()}})};zA(An,rn=>{c(Je),J(o()),uA(()=>c(Je).end{var Je=JdA();we("click",Je,RA),sA(Qn,Je)};zA(di,Qn=>{c(t)||Qn(Cn)}),sA(GA,JA)};zA(de,GA=>{c(m)&&GA(pe)}),we("click",Ae,x),sA(OA,EA)},PA=OA=>{var EA=Gi(),XA=it(EA),pA=NA=>{var Ne=ABA(),YA=it(Ne),DA=gA(YA),Kt=gA(DA),pt=gA(Kt),ue=Ye=>{on(Ye,{get data(){return qc}})},Ot=Ye=>{on(Ye,{get data(){return uB}})};zA(pt,Ye=>{c(m)?Ye(ue):Ye(Ot,!1)});var He=kA(Kt,2);Ca(He,e,"identifier",{},null);var je=kA(He,2),ft=Ye=>{sA(Ye,HdA())};zA(je,Ye=>{c(t)||Ye(ft)});var Fe=kA(je,2),ri=gA(Fe),j=gA(ri),X=Ye=>{sA(Ye,zdA())},tA=Ye=>{var di=PdA();ew(kA(it(di),2),{onclick:F,children:(Cn,Qn)=>{var Je=cr();_e((an,ki)=>Gt(Je,"".concat(an??"",` + `).concat(ki??"")),[()=>(J(o()),uA(()=>Object.keys(o()).length)),()=>(J(o()),uA(()=>Object.keys(o()).length===1?"prop":"props"))]),sA(Cn,Je)},$$slots:{default:!0}}),sA(Ye,di)};zA(j,Ye=>{c(m)?Ye(X):Ye(tA,!1)});var nA=kA(Fe,2),UA=Ye=>{var di=jdA();y2(gA(di),{get root(){return c(t)},selected:!0,get onContextMenu(){return J(g()),uA(()=>g().onContextMenu)}}),sA(Ye,di)};zA(nA,Ye=>{J(g()),c(M),J(l()),J(hn),J(Io),J($a),J(_i),J(dt),c(f),uA(()=>!g().readOnly&&c(M)&&l()&&(hn(l())||Io(l()))&&!$a(l())&&_i(dt(l()),c(f)))&&Ye(UA)});var de=kA(DA,2),pe=Ye=>{mE(Ye,{get validationError(){return c(k)},onExpand:F})};zA(de,Ye=>{c(k),c(m),uA(()=>c(k)&&(!c(m)||!c(k).isChildError))&&Ye(pe)});var GA=kA(de,2),JA=Ye=>{var di=qdA();we("click",di,QA),sA(Ye,di)},Qt=Ye=>{var di=Gi(),Cn=it(di),Qn=Je=>{var an=VdA();we("click",an,RA),sA(Je,an)};zA(Cn,Je=>{c(t)||Je(Qn)},!0),sA(Ye,di)};zA(GA,Ye=>{c(m)?Ye(JA):Ye(Qt,!1)});var nt=kA(YA,2),ze=Ye=>{var di=$dA(),Cn=it(di),Qn=gA(Cn),Je=An=>{var Mt,rn,Ut=WdA(),U=gA(Ut),Bt=at(()=>(c(M),J(ja),J(l()),uA(()=>c(M)&&ja(l()))));y2(U,{insert:!0,get selected(){return c(Bt)},onContextMenu:IA}),_e(ui=>{Mt=oi(Ut,1,"jse-insert-area jse-inside svelte-1qi6rc1",null,Mt,ui),Fn(Ut,"title",tk),rn=cg(Ut,"",rn,{"--level":(c(f),uA(()=>c(f).length+1))})},[()=>({"jse-hovered":c(B)===pI,"jse-selected":c(M)&&ja(l())})]),sA(An,Ut)};zA(Qn,An=>{J(g()),c(B),J(pI),c(M),J(ja),J(l()),uA(()=>!g().readOnly&&(c(B)===pI||c(M)&&ja(l())))&&An(Je)}),Ia(kA(Qn,2),1,()=>(J(o()),c(h),uA(()=>(function(An,Mt){var rn=Object.keys(An);return Mt&&Mt.offset!==0?aP(rn,Mt.selectionStartIndex,Mt.selectionItemsCount,Mt.offset):rn})(o(),c(h)))),Sa,(An,Mt)=>{var rn=at(()=>(J(A4),J(n()),c(Mt),uA(()=>A4(n(),c(Mt))))),Ut=at(()=>(J(el),J(s()),c(Mt),uA(()=>el(s())?s().properties[c(Mt)]:void 0))),U=at(()=>(J(el),J(r()),c(Mt),uA(()=>el(r())?r().properties[c(Mt)]:void 0))),Bt=at(()=>(c(f),c(Mt),uA(()=>c(f).concat(c(Mt))))),ui=at(()=>(J(U8),J(g()),J(l()),J(c(Bt)),uA(()=>U8(g().getJson(),l(),c(Bt))))),un=Gi(),pn=it(un),Xn=at(()=>(J(el),J(a()),c(Mt),uA(()=>el(a())?a().properties[c(Mt)]:void 0)));Jk(pn,{get value(){return J(o()),c(Mt),uA(()=>o()[c(Mt)])},get pointer(){return c(rn)},get state(){return c(Xn)},get validationErrors(){return c(U)},get searchResults(){return c(Ut)},get selection(){return c(ui)},get context(){return g()},onDragSelectionStart:CA,$$slots:{identifier:(zo,Eo)=>{var Lo,$o=ZdA(),yo=gA($o),da=at(()=>(J(RP),J(c(Ut)),uA(()=>RP(c(Ut)))));(function(Aa,sa){Ft(sa,!1);var vo=cA(void 0,!0),ge=cA(void 0,!0),wi=L(sa,"pointer",9),In=L(sa,"key",9),fn=L(sa,"selection",9),Po=L(sa,"searchResultItems",9),wa=L(sa,"onUpdateKey",9),Ri=L(sa,"context",9),ho=cA(void 0,!0);function Va(SA){c(ge)||Ri().readOnly||(SA.preventDefault(),Ri().onSelect(h_(c(ho))))}function bo(SA,$A){var ve=wa()(In(),Ri().normalization.unescapeValue(SA)),hA=Vi(c(ho)).concat(ve);Ri().onSelect($A===U2.nextInside?Pi(hA):QC(hA)),$A!==U2.self&&Ri().focus()}function La(){Ri().onSelect(QC(c(ho))),Ri().focus()}KA(()=>J(wi()),()=>{N(ho,gs(wi()))}),KA(()=>(J(fn()),c(ho)),()=>{N(vo,er(fn())&&_i(fn().path,c(ho)))}),KA(()=>(c(vo),J(fn())),()=>{N(ge,c(vo)&&$a(fn()))}),Ln(),ai(!0);var Hn=MdA(),Ji=it(Hn),Vt=SA=>{var $A=at(()=>(J(Ri()),J(In()),uA(()=>Ri().normalization.escapeValue(In())))),ve=at(()=>(J($a),J(fn()),uA(()=>$a(fn())?fn().initialValue:void 0)));yq(SA,{get value(){return c($A)},get initialValue(){return c(ve)},label:"Edit key",shortText:!0,onChange:bo,onCancel:La,get onFind(){return J(Ri()),uA(()=>Ri().onFind)}})},Gn=SA=>{var $A,ve=bdA(),hA=gA(ve),FA=Ge=>{var rt=at(()=>(J(Ri()),J(In()),uA(()=>Ri().normalization.escapeValue(In()))));xq(Ge,{get text(){return c(rt)},get searchResultItems(){return Po()}})},le=Ge=>{var rt=cr();_e(gt=>Gt(rt,gt),[()=>(J(kE),J(Ri()),J(In()),uA(()=>kE(Ri().normalization.escapeValue(In()))))]),sA(Ge,rt)};zA(hA,Ge=>{Po()?Ge(FA):Ge(le,!1)}),_e(()=>$A=oi(ve,1,"jse-key svelte-1n4cez4",null,$A,{"jse-empty":In()===""})),we("dblclick",ve,Va),sA(SA,ve)};zA(Ji,SA=>{J(Ri()),c(ge),uA(()=>!Ri().readOnly&&c(ge))?SA(Vt):SA(Gn,!1)});var Qo=kA(Ji,2),Go=SA=>{y2(SA,{selected:!0,get onContextMenu(){return J(Ri()),uA(()=>Ri().onContextMenu)}})};zA(Qo,SA=>{J(Ri()),c(vo),c(ge),uA(()=>!Ri().readOnly&&c(vo)&&!c(ge))&&SA(Go)}),sA(Aa,Hn),Lt()})(yo,{get pointer(){return c(rn)},get key(){return c(Mt)},get selection(){return c(ui)},get searchResultItems(){return c(da)},get context(){return g()},onUpdateKey:z}),_e(Aa=>Lo=oi($o,1,"jse-key-outer svelte-1qi6rc1",null,Lo,Aa),[()=>({"jse-selected-key":er(c(ui))&&_i(c(ui).path,c(Bt))})]),sA(zo,$o)}}}),sA(An,un)});var an=kA(Cn,2),ki=kA(gA(an),2),Ki=An=>{var Mt=XdA();we("click",Mt,RA),sA(An,Mt)};zA(ki,An=>{c(t)||An(Ki)}),sA(Ye,di)};zA(nt,Ye=>{c(m)&&Ye(ze)}),we("click",Kt,x),sA(NA,Ne)},Ae=NA=>{var Ne=nBA(),YA=gA(Ne),DA=gA(YA);Ca(DA,e,"identifier",{},null);var Kt=kA(DA,2),pt=nA=>{sA(nA,eBA())};zA(Kt,nA=>{c(t)||nA(pt)});var ue=kA(Kt,2),Ot=gA(ue),He=at(()=>c(M)?l():void 0),je=at(()=>(J(NP),J(s()),uA(()=>NP(s()))));qq(Ot,{get path(){return c(f)},get value(){return o()},get enforceString(){return c(v)},get selection(){return c(He)},get searchResultItems(){return c(je)},get context(){return g()}});var ft=kA(ue,2),Fe=nA=>{var UA=tBA();y2(gA(UA),{get root(){return c(t)},selected:!0,get onContextMenu(){return J(g()),uA(()=>g().onContextMenu)}}),sA(nA,UA)};zA(ft,nA=>{J(g()),c(M),J(l()),J(hn),J(Io),J($a),J(_i),J(dt),c(f),uA(()=>!g().readOnly&&c(M)&&l()&&(hn(l())||Io(l()))&&!$a(l())&&_i(dt(l()),c(f)))&&nA(Fe)});var ri=kA(YA,2),j=nA=>{mE(nA,{get validationError(){return c(k)},onExpand:F})};zA(ri,nA=>{c(k)&&nA(j)});var X=kA(ri,2),tA=nA=>{var UA=iBA();we("click",UA,RA),sA(nA,UA)};zA(X,nA=>{c(t)||nA(tA)}),sA(NA,Ne)};zA(XA,NA=>{J(Sn),J(o()),uA(()=>Sn(o()))?NA(pA):NA(Ae,!1)},!0),sA(OA,EA)};zA(HA,OA=>{J(o()),uA(()=>Array.isArray(o()))?OA(vA):OA(PA,!1)});var et=kA(HA,2),We=OA=>{var EA,XA=oBA(),pA=gA(XA),Ae=at(()=>(c(M),J(il),J(l()),uA(()=>c(M)&&il(l()))));y2(pA,{insert:!0,get selected(){return c(Ae)},onContextMenu:dA}),_e(NA=>{EA=oi(XA,1,"jse-insert-area jse-after svelte-1qi6rc1",null,EA,NA),Fn(XA,"title",tk)},[()=>({"jse-hovered":c(B)===G8,"jse-selected":c(M)&&il(l())})]),sA(OA,XA)};zA(et,OA=>{J(g()),c(B),J(G8),c(M),J(il),J(l()),uA(()=>!g().readOnly&&(c(B)===G8||c(M)&&il(l())))&&OA(We)}),_e((OA,EA)=>{_A=oi(he,1,OA,"svelte-1qi6rc1",_A,EA),Fn(he,"data-path",c(A)),Fn(he,"aria-selected",c(M)),VA=cg(he,"",VA,{"--level":(c(f),uA(()=>c(f).length))})},[()=>J2((J(lc),c(m),J(g()),c(f),J(o()),uA(()=>lc("jse-json-node",{"jse-expanded":c(m)},g().onClassName(c(f),o()))))),()=>({"jse-root":c(t),"jse-selected":c(M)&&Io(l()),"jse-selected-value":c(M)&&hn(l()),"jse-readonly":g().readOnly,"jse-hovered":c(B)===gP})]),we("mousedown",he,function(OA){if((OA.buttons===1||OA.buttons===2)&&!((EA=OA.target).nodeName==="DIV"&&EA.contentEditable==="true"||OA.buttons===1&&Cq(OA.target,"BUTTON"))){var EA;OA.stopPropagation(),OA.preventDefault(),g().focus(),document.addEventListener("mousemove",P,!0),document.addEventListener("mouseup",Z);var XA=$S(OA.target),pA=g().getJson(),Ae=g().getDocumentState();if(!l()||XA===ro.after||XA===ro.inside||l().type!==XA&&l().type!==ro.multi||!Du(pA,l(),c(f)))if(Yo(Yo().selecting=!0),Yo(Yo().selectionAnchor=c(f)),Yo(Yo().selectionAnchorType=XA),Yo(Yo().selectionFocus=c(f)),OA.shiftKey){var NA=g().getSelection();NA&&g().onSelect(ds(kI(NA),c(f)))}else if(XA===ro.multi)if(c(t)&&OA.target.hasAttribute("data-path")){var Ne=Ni(pq(o(),Ae));g().onSelect(Rk(Ne))}else g().onSelect(ds(c(f),c(f)));else pA!==void 0&&g().onSelect(vP(XA,c(f)));else OA.button===0&&C()(OA)}}),we("mousemove",he,function(OA){if(Yo().selecting){OA.preventDefault(),OA.stopPropagation(),Yo().selectionFocus===void 0&&window.getSelection&&window.getSelection().empty();var EA=$S(OA.target);_i(c(f),Yo().selectionFocus)&&EA===Yo().selectionAnchorType||(Yo(Yo().selectionFocus=c(f)),Yo(Yo().selectionAnchorType=EA),g().onSelect(ds(Yo().selectionAnchor||Yo().selectionFocus,Yo().selectionFocus)))}}),we("mouseover",he,function(OA){Yo().selecting||Yo().dragging||(OA.stopPropagation(),x2(OA.target,"data-type","selectable-value")?N(B,gP):x2(OA.target,"data-type","selectable-key")?N(B,void 0):x2(OA.target,"data-type","insert-selection-area-inside")?N(B,pI):x2(OA.target,"data-type","insert-selection-area-after")&&N(B,G8),clearTimeout(Q))}),we("mouseout",he,function(OA){OA.stopPropagation(),Q=window.setTimeout(()=>N(B,void 0))}),sA(i,he),Lt()}var Vq={prefix:"fas",iconName:"jsoneditor-expand",icon:[512,512,[],"","M 0,448 V 512 h 512 v -64 z M 0,0 V 64 H 512 V 0 Z M 256,96 128,224 h 256 z M 256,416 384,288 H 128 Z"]},Wq={prefix:"fas",iconName:"jsoneditor-collapse",icon:[512,512,[],"","m 0,224 v 64 h 512 v -64 z M 256,192 384,64 H 128 Z M 256,320 128,448 h 256 z"]},PP={prefix:"fas",iconName:"jsoneditor-format",icon:[512,512,[],"","M 0,32 v 64 h 416 v -64 z M 160,160 v 64 h 352 v -64 z M 160,288 v 64 h 288 v -64 z M 0,416 v 64 h 320 v -64 z"]},rBA={prefix:"fas",iconName:"jsoneditor-compact",icon:[512,512,[],"","M 0,32 v 64 h 512 v -64 z M 0,160 v 64 h 512 v -64 z M 0,288 v 64 h 352 v -64 z"]};Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-welcome.svelte-1lhnan { + flex: 1; + overflow: auto; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + display: flex; + flex-direction: column; + align-items: center; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-welcome.svelte-1lhnan:last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-welcome.svelte-1lhnan .jse-space.jse-before:where(.svelte-1lhnan) { + flex: 1; +} +.jse-welcome.svelte-1lhnan .jse-space.jse-after:where(.svelte-1lhnan) { + flex: 2; +} +.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) { + display: flex; + flex-direction: column; + max-width: 300px; + margin: 2em var(--jse-padding, 10px); + gap: var(--jse-padding, 10px); +} +.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) .jse-welcome-info:where(.svelte-1lhnan) { + color: var(--jse-panel-color-readonly, #b2b2b2); +} +.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +}`);var sBA=TA('
        You can paste clipboard data using Ctrl+V, or use the following options:
        ',1),lBA=TA('
        Empty document
        ');function Yk(i,e){var A=typeof i=="string"?i.toLowerCase():i,t=typeof e=="string"?e.toLowerCase():e;return(0,Aj.default)(A,t)}function Zq(i){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],t=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,n=Ze(i,e);if(Zo(n)){if(A===void 0)throw new Error("Cannot sort: no property selected by which to sort the array");return(function(o){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,l=(function(C,I){var B={boolean:0,number:1,string:2,undefined:4},Q=3;return function(h,f){var m=Ze(h,C),v=Ze(f,C);if(typeof m!=typeof v){var S,k,M=(S=B[typeof m])!==null&&S!==void 0?S:Q,x=(k=B[typeof v])!==null&&k!==void 0?k:Q;return M>x?I:Mv?I:m1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,s=Ze(o,a),l=Object.keys(s).slice();l.sort((C,I)=>r*Yk(C,I));var g={};return l.forEach(C=>g[C]=s[C]),[{op:"replace",path:bt(a),value:g}]})(i,e,t);throw new Error("Cannot sort: no array or object")}Nu(["click"]);Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-navigation-bar-dropdown.svelte-1k47orx { + position: absolute; + top: 100%; + left: 0; + z-index: 3; + background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); + color: var(--jse-navigation-bar-dropdown-color, #656565); + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); + display: flex; + flex-direction: column; + max-height: 300px; + overflow: auto; + min-width: 80px; +} +.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx) { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + border: none; + background: transparent; + color: inherit; + cursor: pointer; + outline: none; + text-align: left; + white-space: nowrap; + box-sizing: border-box; + padding: calc(0.5 * var(--jse-padding, 10px)) 36px; +} +.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx):focus, .jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx):hover { + background: var(--jse-navigation-bar-background-highlight, #e5e5e5); +} +.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item.jse-selected:where(.svelte-1k47orx) { + background: var(--jse-navigation-bar-dropdown-color, #656565); + color: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); +}`);var gBA=TA(''),cBA=TA(''),CBA=TA('
        ');function IBA(i,e){Ft(e,!1);var A=L(e,"items",9),t=L(e,"selectedItem",9),n=L(e,"onSelect",9);ai(!0);var o=CBA(),a=gA(o);Ia(a,1,()=>(J(rw),J(A()),uA(()=>rw(A(),100))),l=>l,(l,g)=>{var C,I=gBA(),B=gA(I);_e((Q,h)=>{C=oi(I,1,"jse-navigation-bar-dropdown-item svelte-1k47orx",null,C,{"jse-selected":c(g)===t()}),Fn(I,"title",Q),Gt(B,h)},[()=>(c(g),uA(()=>c(g).toString())),()=>(J(aC),c(g),uA(()=>aC(c(g).toString(),30)))]),we("click",I,iC(()=>n()(c(g)))),sA(l,I)});var r=kA(a,2),s=l=>{var g=cBA();Fn(g,"title","Limited to 100 items"),sA(l,g)};zA(r,l=>{J(A()),uA(()=>A().length>100)&&l(s)}),sA(i,o),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-navigation-bar-item.svelte-13sijxb { + position: relative; + display: flex; +} +.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb) { + font-family: inherit; + font-size: inherit; + padding: calc(0.5 * var(--jse-padding, 10px)) 2px; + border: none; + background: transparent; + color: inherit; + cursor: pointer; + outline: none; + min-width: 2em; + white-space: nowrap; +} +.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb):focus, .jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb):hover { + background: var(--jse-panel-button-background-highlight, #e0e0e0); + color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); +} +.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button.jse-navigation-bar-arrow:where(.svelte-13sijxb) { + padding: 2px var(--jse-padding, 10px) 0; +} +.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button.jse-navigation-bar-arrow.jse-open:where(.svelte-13sijxb) { + background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); + color: var(--jse-navigation-bar-dropdown-color, #656565); +} +.jse-navigation-bar-item.svelte-13sijxb:last-child { + padding-right: var(--jse-padding, 10px); +}`);var dBA=TA(''),BBA=TA('
        ');function jP(i,e){Ft(e,!1);var A,t=cA(void 0,!0),n=cA(void 0,!0),{openAbsolutePopup:o,closeAbsolutePopup:a}=H2("absolute-popup"),r=L(e,"path",9),s=L(e,"index",9),l=L(e,"onSelect",9),g=L(e,"getItems",9),C=cA(void 0,!0),I=cA(!1,!0);function B(S){a(A),l()(c(t).concat(S))}KA(()=>(J(r()),J(s())),()=>{N(t,r().slice(0,s()))}),KA(()=>(J(r()),J(s())),()=>{N(n,r()[s()])}),Ln(),ai(!0);var Q,h=BBA(),f=gA(h);on(gA(f),{get data(){return y7}});var m=kA(f,2),v=S=>{var k=dBA(),M=gA(k);_e(()=>Gt(M,c(n))),we("click",k,()=>B(c(n))),sA(S,k)};zA(m,S=>{c(n)!==void 0&&S(v)}),Ho(h,S=>N(C,S),()=>c(C)),_e(()=>Q=oi(f,1,"jse-navigation-bar-button jse-navigation-bar-arrow svelte-13sijxb",null,Q,{"jse-open":c(I)})),we("click",f,function(){if(c(C)){N(I,!0);var S={items:g()(c(t)),selectedItem:c(n),onSelect:B};A=o(IBA,S,{anchor:c(C),closeOnOuterClick:!0,onClose:()=>{N(I,!1)}})}}),sA(i,h),Lt()}function m_(i){var e,A;if(navigator.clipboard)return navigator.clipboard.writeText(i);if((e=(A=document).queryCommandSupported)!==null&&e!==void 0&&e.call(A,"copy")){var t=document.createElement("textarea");t.value=i,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select();try{document.execCommand("copy")}catch(n){console.error(n)}finally{document.body.removeChild(t)}return Promise.resolve()}return console.error("Copy failed."),Promise.resolve()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-navigation-bar-path-editor.svelte-uyexy4 { + flex: 1; + display: flex; + border: var(--jse-edit-outline, 2px solid #656565); + background: var(--jse-background-color, #fff); +} +.jse-navigation-bar-path-editor.svelte-uyexy4 input.jse-navigation-bar-text:where(.svelte-uyexy4) { + flex: 1; + font-family: inherit; + font-size: inherit; + padding: 0 5px 1px; + background: var(--jse-background-color, #fff); + color: var(--jse-text-color, #4d4d4d); + border: none; + outline: none; +} +.jse-navigation-bar-path-editor.svelte-uyexy4 button:where(.svelte-uyexy4) { + border: none; + background: var(--jse-background-color, #fff); + cursor: pointer; + font-family: inherit; + font-size: 80%; + color: inherit; +} +.jse-navigation-bar-path-editor.svelte-uyexy4 button.jse-navigation-bar-copy.copied:where(.svelte-uyexy4) { + color: var(--message-success-background, #9ac45d); +} +.jse-navigation-bar-path-editor.svelte-uyexy4 button.jse-navigation-bar-validation-error:where(.svelte-uyexy4) { + color: var(--jse-error-color, #ee5341); +} +.jse-navigation-bar-path-editor.error.svelte-uyexy4 { + border-color: var(--jse-error-color, #ee5341); +} +.jse-navigation-bar-path-editor.error.svelte-uyexy4 input.jse-navigation-bar-text:where(.svelte-uyexy4) { + color: var(--jse-error-color, #ee5341); +} +.jse-navigation-bar-path-editor.svelte-uyexy4 .jse-copied-text:where(.svelte-uyexy4) { + background: var(--message-success-background, #9ac45d); + color: var(--jse-message-success-color, #fff); + position: relative; + margin: 2px; + padding: 0 5px; + border-radius: 3px; +}`);var EBA=TA(''),hBA=TA('
        Copied!
        '),QBA=TA('
        ');function uBA(i,e){Ft(e,!1);var A=cA(),t=H2("absolute-popup"),n=L(e,"path",8),o=L(e,"pathParser",8),a=L(e,"onChange",8),r=L(e,"onClose",8),s=L(e,"onError",8),l=L(e,"pathExists",8),g=cA(),C=cA(),I=cA(!1),B=void 0,Q=cA(!1);function h(){c(g).focus()}function f(Z){try{var AA=o().parse(Z);return(function(W){if(!l()(W))throw new Error("Path does not exist in current document")})(AA),{path:AA,error:void 0}}catch(W){return{path:void 0,error:W}}}Vr(()=>{h()}),Ig(()=>{clearTimeout(B)}),KA(()=>(J(o()),J(n())),()=>{N(C,o().stringify(n()))}),KA(()=>(c(I),c(C)),()=>{N(A,c(I)?f(c(C)).error:void 0)}),Ln(),ai();var m,v=QBA(),S=gA(v);Ho(S,Z=>N(g,Z),()=>c(g));var k=kA(S,2),M=Z=>{var AA=EBA();on(gA(AA),{get data(){return o2}}),Es(AA,(W,CA)=>RE?.(W,CA),()=>ke({text:String(c(A)||"")},t)),sA(Z,AA)};zA(k,Z=>{c(A)&&Z(M)});var x=kA(k,2),F=Z=>{sA(Z,hBA())};zA(x,Z=>{c(Q)&&Z(F)});var z,P=kA(x,2);on(gA(P),{get data(){return H0}}),_e(()=>{m=oi(v,1,"jse-navigation-bar-path-editor svelte-uyexy4",null,m,{error:c(A)}),GI(S,c(C)),z=oi(P,1,"jse-navigation-bar-copy svelte-uyexy4",null,z,{copied:c(Q)})}),we("keydown",S,iC(function(Z){var AA=hC(Z);if(AA==="Escape"&&(Z.preventDefault(),r()()),AA==="Enter"){Z.preventDefault(),N(I,!0);var W=f(c(C));W.path!==void 0?a()(W.path):s()(W.error)}})),we("input",S,function(Z){N(C,Z.currentTarget.value)}),we("click",P,function(){m_(c(C)),N(Q,!0),B=window.setTimeout(()=>N(Q,!1),1e3),h()}),sA(i,v),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-navigation-bar.svelte-hjhal6 { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-button-color, inherit); + padding: 0; + margin: 0; + display: flex; + overflow: auto; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6) { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); + color: var(--jse-panel-color-readonly, #b2b2b2); + background: transparent; + border: none; + display: flex; + cursor: pointer; + outline: none; + align-items: center; +} +.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit.flex:where(.svelte-hjhal6) { + flex: 1; +} +.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6):focus, .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6):hover, .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit.editing:where(.svelte-hjhal6) { + background: var(--jse-panel-button-background-highlight, #e0e0e0); + color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); + transition: color 0.2s ease-in, background 0.2s ease-in; +} +.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6) .jse-navigation-bar-space:where(.svelte-hjhal6) { + flex: 1; + text-align: left; +}`);var pBA=TA(" ",1),fBA=TA('
        ');function mBA(i,e){Ft(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=tr("jsoneditor:NavigationBar"),o=L(e,"json",9),a=L(e,"selection",9),r=L(e,"onSelect",9),s=L(e,"onError",9),l=L(e,"pathParser",9),g=cA(void 0,!0),C=cA(!1,!0);function I(AA){n("get items for path",AA);var W=Ze(o(),AA);if(Array.isArray(W))return LD(0,W.length).map(String);if(Sn(W)){var CA=Object.keys(W).slice(0);return CA.sort(Yk),CA}return[]}function B(AA){return wr(o(),AA)}function Q(AA){n("select path",JSON.stringify(AA)),r()(ds(AA,AA))}function h(){N(C,!1)}function f(AA){h(),Q(AA)}KA(()=>(J(a()),dt),()=>{N(A,a()?dt(a()):[])}),KA(()=>(J(o()),c(A)),()=>{N(t,ra(Ze(o(),c(A))))}),KA(()=>c(A),()=>{c(A),setTimeout(()=>{if(c(g)&&c(g).scrollTo){var AA=c(g).scrollWidth-c(g).clientWidth;AA>0&&(n("scrollTo ",AA),c(g).scrollTo({left:AA,behavior:"smooth"}))}})}),Ln(),ai(!0);var m=fBA(),v=gA(m),S=AA=>{var W=pBA(),CA=it(W);Ia(CA,1,()=>c(A),Sa,(QA,RA,IA)=>{jP(QA,{getItems:I,get path(){return c(A)},index:IA,onSelect:Q})});var wA=kA(CA,2),BA=QA=>{jP(QA,{getItems:I,get path(){return c(A)},get index(){return c(A),uA(()=>c(A).length)},onSelect:Q})};zA(wA,QA=>{c(t)&&QA(BA)}),sA(AA,W)},k=AA=>{uBA(AA,{get path(){return c(A)},onClose:h,onChange:f,get onError(){return s()},pathExists:B,get pathParser(){return l()}})};zA(v,AA=>{c(C)?AA(k,!1):AA(S)});var M,x=kA(v,2),F=gA(x),z=gA(F),P=kA(F,2),Z=at(()=>c(C)?KT:RT);on(P,{get data(){return c(Z)}}),Ho(m,AA=>N(g,AA),()=>c(g)),_e(AA=>{M=oi(x,1,"jse-navigation-bar-edit svelte-hjhal6",null,M,{flex:!c(C),editing:c(C)}),Fn(x,"title",c(C)?"Cancel editing the selected path":"Edit the selected path"),Gt(z,AA)},[()=>(J(ra),J(o()),c(C),uA(()=>ra(o())||c(C)?"\xA0":"Navigation bar"))]),we("click",x,function(){N(C,!c(C))}),sA(i,m),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-search-box.svelte-1x1x8q0 { + border: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); + border-radius: 3px; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-color-readonly, #b2b2b2); + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); + display: inline-block; + width: 400px; + max-width: 100%; + overflow: auto; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) { + display: flex; + align-items: stretch; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0), +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) input:where(.svelte-1x1x8q0) { + font-family: inherit; + font-size: inherit; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0) { + display: block; + text-align: center; + border: none; + padding: 0 5px; + margin: 0; + cursor: pointer; + color: var(--jse-panel-button-color, inherit); + background: var(--jse-panel-button-background, transparent); +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0):hover { + color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); + background: var(--jse-panel-button-background-highlight, #e0e0e0); +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) input:where(.svelte-1x1x8q0) { + color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); + border: var(--jse-input-border, 1px solid #d8dbdf); + border-radius: 3px; + background: var(--jse-input-background, var(--jse-background-color, #fff)); + height: 28px; + padding: 0 5px; + margin: 0; + flex: 1; + width: 0; + min-width: 50px; + outline: none; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-replace-toggle:where(.svelte-1x1x8q0) { + padding: var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)); + min-width: 20px; + background: var(--jse-panel-button-background-highlight, #e0e0e0); +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) { + flex: 1; + display: flex; + flex-direction: column; + padding: calc(0.5 * var(--jse-padding, 10px)); + gap: calc(0.5 * var(--jse-padding, 10px)); +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) { + flex: 1; + display: flex; + align-items: center; + position: relative; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-icon:where(.svelte-1x1x8q0) { + color: inherit; + cursor: inherit; + background: inherit; + width: 32px; + text-align: center; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) label.jse-search-input-label:where(.svelte-1x1x8q0) { + flex: 1; + display: flex; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-count:where(.svelte-1x1x8q0) { + color: inherit; + font-size: 80%; + visibility: hidden; + padding: 0 5px; + min-width: 36px; + text-align: center; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-count.jse-visible:where(.svelte-1x1x8q0) { + visibility: visible; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-replace-section:where(.svelte-1x1x8q0) { + flex: 1; + display: flex; + padding-left: 32px; +} +.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-replace-section:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0) { + width: auto; +}`);var wBA=TA(''),DBA=TA('
        '),yBA=TA('');function Xq(i,e){Ft(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=cA(void 0,!0),o=tr("jsoneditor:SearchBox"),a=L(e,"json",9),r=L(e,"documentState",9),s=L(e,"parser",9),l=L(e,"showSearch",9),g=L(e,"showReplace",13),C=L(e,"readOnly",9),I=L(e,"columns",9),B=L(e,"onSearch",9),Q=L(e,"onFocus",9),h=L(e,"onPatch",9),f=L(e,"onClose",9),m=cA("",!0),v="",S=cA("",!0),k=cA(!1,!0),M=cA(void 0,!0),x=mh(function(NA){return PA.apply(this,arguments)},300),F=mh(function(NA){return et.apply(this,arguments)},300);function z(){g(!g()&&!C())}function P(NA){NA.stopPropagation();var Ne=hC(NA);Ne==="Enter"&&(NA.preventDefault(),c(m)!==v?x.flush():IA()),Ne==="Shift+Enter"&&(NA.preventDefault(),_A()),Ne==="Ctrl+Enter"&&(NA.preventDefault(),g()?CA():IA()),Ne==="Ctrl+H"&&(NA.preventDefault(),z()),Ne==="Escape"&&(NA.preventDefault(),EA())}function Z(NA){hC(NA)==="Enter"&&(NA.preventDefault(),NA.stopPropagation(),CA())}function AA(){return W.apply(this,arguments)}function W(){return(W=Pt(function*(){Fo(),yield x.flush()})).apply(this,arguments)}function CA(){return wA.apply(this,arguments)}function wA(){return(wA=Pt(function*(){var NA;if(!C()){var Ne=(NA=c(M))===null||NA===void 0?void 0:NA.activeItem;if(o("handleReplace",{replaceText:c(S),activeItem:Ne}),c(M)&&Ne&&a()!==void 0){N(M,ke(ke({},MP(c(M))),{},{activeIndex:c(t)}));var{operations:YA,newSelection:DA}=H1A(a(),r(),c(S),Ne,s());h()(YA,(Kt,pt)=>({state:pt,selection:DA})),Fo(),yield F.flush(),yield he()}}})).apply(this,arguments)}function BA(){return QA.apply(this,arguments)}function QA(){return(QA=Pt(function*(){if(!C()){o("handleReplaceAll",{text:c(m),replaceText:c(S)});var{operations:NA,newSelection:Ne}=(function(YA,DA,Kt,pt,ue){for(var Ot=SP(Kt,YA,{maxResults:1/0}),He=[],je=0;jeX.field!==tA.field?X.field===nc.key?1:-1:tA.path.length-X.path.length);var ri,j=[];return He.forEach(X=>{var{field:tA,path:nA,items:UA}=X;if(tA===nc.key){var de=Vi(nA),pe=Ze(YA,de),GA=Ni(nA),JA=Tu(de,Object.keys(pe),GA,_P(GA,pt,UA));j=j.concat(JA),ri=xE(YA,JA)}else{if(tA!==nc.value)throw new Error("Cannot replace: unknown type of search result field ".concat(tA));var Qt=Ze(YA,nA);if(Qt===void 0)throw new Error("Cannot replace: path not found ".concat(bt(nA)));var nt=typeof Qt=="string"?Qt:String(Qt),ze=l0(YA,DA,nA),Ye=_P(nt,pt,UA),di=[{op:"replace",path:bt(nA),value:ze?Ye:YE(Ye,ue)}];j=j.concat(di),ri=xE(YA,di)}}),{operations:j,newSelection:ri}})(a(),r(),c(m),c(S),s());h()(NA,(YA,DA)=>({state:DA,selection:Ne})),yield he()}})).apply(this,arguments)}function RA(NA){NA.select()}function IA(){return dA.apply(this,arguments)}function dA(){return(dA=Pt(function*(){N(M,c(M)?MP(c(M)):void 0),yield he()})).apply(this,arguments)}function _A(){return VA.apply(this,arguments)}function VA(){return VA=Pt(function*(){N(M,c(M)?(function(NA){var Ne=NA.activeIndex>0?NA.activeIndex-1:NA.items.length-1,YA=NA.items[Ne],DA=NA.items.map((Kt,pt)=>ke(ke({},Kt),{},{active:pt===Ne}));return ke(ke({},NA),{},{items:DA,activeItem:YA,activeIndex:Ne})})(c(M)):void 0),yield he()}),VA.apply(this,arguments)}function he(){return HA.apply(this,arguments)}function HA(){return(HA=Pt(function*(){var NA;o("handleFocus",c(M));var Ne=(NA=c(M))===null||NA===void 0?void 0:NA.activeItem;Ne&&a()!==void 0&&(yield Q()(Ne.path,Ne.resultIndex))})).apply(this,arguments)}function vA(){return vA=Pt(function*(NA){yield We(NA,c(m),a())}),vA.apply(this,arguments)}function PA(){return PA=Pt(function*(NA){yield We(l(),NA,a()),yield he()}),PA.apply(this,arguments)}function et(){return et=Pt(function*(NA){yield We(l(),c(m),NA)}),et.apply(this,arguments)}function We(NA,Ne,YA){return OA.apply(this,arguments)}function OA(){return OA=Pt(function*(NA,Ne,YA){return NA?(o("applySearch",{showSearch:NA,text:Ne}),Ne===""?(o("clearing search result"),c(M)!==void 0&&N(M,void 0),Promise.resolve()):(v=Ne,N(k,!0),new Promise(DA=>{setTimeout(()=>{var Kt=SP(Ne,YA,{maxResults:Ak,columns:I()});N(M,(function(pt,ue){var Ot=ue!=null&&ue.activeItem?xP(ue.activeItem):void 0,He=pt.findIndex(Fe=>_i(Ot,xP(Fe))),je=He!==-1?He:ue?.activeIndex!==void 0&&ue?.activeIndex0?0:-1,ft=pt.map((Fe,ri)=>ke(ke({resultIndex:ri},Fe),{},{active:ri===je}));return{items:ft,activeItem:ft[je],activeIndex:je}})(Kt,c(M))),N(k,!1),DA()})}))):(c(M)&&N(M,void 0),Promise.resolve())}),OA.apply(this,arguments)}function EA(){o("handleClose"),x.cancel(),F.cancel(),We(!1,c(m),a()),f()()}KA(()=>c(M),()=>{var NA;N(A,((NA=c(M))===null||NA===void 0||(NA=NA.items)===null||NA===void 0?void 0:NA.length)||0)}),KA(()=>c(M),()=>{var NA;N(t,((NA=c(M))===null||NA===void 0?void 0:NA.activeIndex)||0)}),KA(()=>(c(A),Ak),()=>{N(n,c(A)>=Ak?"".concat(999,"+"):String(c(A)))}),KA(()=>(J(B()),c(M)),()=>{B()(c(M))}),KA(()=>J(l()),()=>{(function(NA){vA.apply(this,arguments)})(l())}),KA(()=>c(m),()=>{x(c(m))}),KA(()=>J(a()),()=>{F(a())}),Ln(),ai(!0);var XA=Gi(),pA=it(XA),Ae=NA=>{var Ne=yBA(),YA=gA(Ne),DA=gA(YA),Kt=GA=>{var JA=wBA(),Qt=gA(JA),nt=at(()=>g()?qc:uB);on(Qt,{get data(){return c(nt)}}),we("click",JA,z),sA(GA,JA)};zA(DA,GA=>{C()||GA(Kt)});var pt=gA(kA(DA,2)),ue=gA(pt),Ot=gA(ue),He=GA=>{on(GA,{get data(){return xT},spin:!0})},je=GA=>{on(GA,{get data(){return s4}})};zA(Ot,GA=>{c(k)?GA(He):GA(je,!1)});var ft=kA(ue,2),Fe=gA(ft);Mr(()=>aw(Fe,()=>c(m),GA=>N(m,GA))),Es(Fe,GA=>RA?.(GA)),Mr(()=>we("paste",Fe,AA));var ri,j=kA(ft,2),X=gA(j),tA=kA(j,2);on(gA(tA),{get data(){return UT}});var nA=kA(tA,2);on(gA(nA),{get data(){return _T}});var UA=kA(nA,2);on(gA(UA),{get data(){return g4}});var de=kA(pt,2),pe=GA=>{var JA=DBA(),Qt=gA(JA),nt=kA(Qt,2),ze=kA(nt,2);aw(Qt,()=>c(S),Ye=>N(S,Ye)),we("keydown",Qt,Z),we("click",nt,CA),we("click",ze,BA),sA(GA,JA)};zA(de,GA=>{g()&&!C()&&GA(pe)}),_e(()=>{var GA;ri=oi(j,1,"jse-search-count svelte-1x1x8q0",null,ri,{"jse-visible":c(m)!==""}),Gt(X,"".concat(c(t)!==-1&&c(t){l()&&NA(Ae)}),sA(i,XA),Lt()}var Mu=Symbol("path");function vBA(i,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1/0,t={};Array.isArray(i)&&(function(o,a,r){if(o.length1?(o.length-1)/(a-1):o.length,l=0;l{Sn(o)?$q(o,t,e):t[Mu]=!0});var n=[];return Mu in t&&n.push([]),AV(t,[],n,e),n}function $q(i,e,A){for(var t in i){var n=i[t],o=e[t]||(e[t]={});Sn(n)&&A?$q(n,o,A):o[Mu]===void 0&&(o[Mu]=!0)}}function AV(i,e,A,t){for(var n in i){var o=e.concat(n),a=i[n];a&&a[Mu]===!0&&A.push(o),oa(a)&&t&&AV(a,o,A,t)}}function bBA(i,e,A,t,n,o){for(var a=arguments.length>6&&arguments[6]!==void 0?arguments[6]:80,r=Zo(A)?A.length:0,s=(function(v,S){var k=Object.values(v);if(zi(k))return S;var M=(x,F)=>x+F;return k.reduce(M)/k.length})(t,n),l=i-a,g=e+2*a,C=v=>t[v]||n,I=0,B=o;B0&&(B-=C(--I));for(var Q=I,h=0;hI0(t,o))}}function fI(i,e){var{rowIndex:A,columnIndex:t}=i;return[String(A),...e[t]]}function MBA(i,e){var[A,t]=FR(i,a=>e_(a.path[0])),n=RR(A,SBA),o=NR(n,a=>{var r={row:[],columns:{}};return a.forEach(s=>{var l=(function(g,C){var I=ag(g.path,C);return I.columnIndex!==-1?I.columnIndex:-1})(s,e);l!==-1?(r.columns[l]===void 0&&(r.columns[l]=[]),r.columns[l].push(s)):r.row.push(s)}),r});return{root:t,rows:o}}function oE(i,e){if(e&&e.length!==0)return e.length===1?e[0]:{path:i,message:"Multiple validation issues: "+e.map(A=>nl(A.path)+" "+A.message).join(", "),severity:ic.warning}}function SBA(i){return parseInt(i.path[0],10)}function kBA(i,e,A){var t=e.some(n=>(function(o,a,r){if(!o)return!1;if(a.op==="replace"){var s=gs(a.path),{rowIndex:l,columnIndex:g}=ag(s,r),C=r.findIndex(I=>_i(I,o.path));if(l!==-1&&g!==-1&&g!==C)return!1}return!0})(i,n,A));return t?void 0:i}var Bs=tr("jsoneditor:actions");function eV(i){return Ok.apply(this,arguments)}function Ok(){return Ok=Pt(function*(i){var{json:e,selection:A,indentation:t,readOnly:n,parser:o,onPatch:a}=i;if(!n&&e!==void 0&&A&&IE(A)){var r=wq(e,A,t,o);if(r!==void 0){Bs("cut",{selection:A,clipboard:r,indentation:t}),yield m_(r);var{operations:s,newSelection:l}=Sq(e,A);a(s,(g,C)=>({state:C,selection:l}))}}}),Ok.apply(this,arguments)}function tV(i){return Hk.apply(this,arguments)}function Hk(){return Hk=Pt(function*(i){var{json:e,selection:A,indentation:t,parser:n}=i,o=wq(e,A,t,n);o!==void 0&&(Bs("copy",{clipboard:o,indentation:t}),yield m_(o))}),Hk.apply(this,arguments)}function iV(i){var{clipboardText:e,json:A,selection:t,readOnly:n,parser:o,onPatch:a,onChangeText:r,onPasteMultilineText:s,openRepairModal:l}=i;if(!n)try{g(e)}catch(C){l(e,I=>{Bs("repaired pasted text: ",I),g(I)})}function g(C){if(A!==void 0){var I=t||Pi([]),B=Mq(A,I,C,o),Q=(function(h,f,m){var v=arguments.length>3&&arguments[3]!==void 0?arguments[3]:L1A;if(h.length>v)return!1;var S=/\n/.test(h);if(!S)return!1;var k=f.some(x=>x.op==="replace"&&Array.isArray(x.value)),M=f.filter(x=>x.op==="add").length>1;if(!k&&!M)return!1;try{return Lu(h,m.parse),!1}catch(x){return!0}})(e,B,o);Bs("paste",{pastedText:C,operations:B,ensureSelection:I,pasteMultilineText:Q}),a(B,(h,f)=>{var m=f;return B.filter(v=>($b(v)||km(v))&&ra(v.value)).forEach(v=>{var S=js(A,v.path);m=UI(h,m,S)}),{state:m}}),Q&&s(C)}else Bs("paste text",{pastedText:C}),r(e,(h,f)=>{if(h)return{state:UI(h,f,[])}})}}function nV(i){var{json:e,text:A,selection:t,keepSelection:n,readOnly:o,onChange:a,onPatch:r}=i;if(!o&&t){var s=e!==void 0&&(er(t)||hn(t))?ds(t.path,t.path):t;if(zi(dt(t)))Bs("remove root",{selection:t}),a&&a({text:"",json:void 0},e!==void 0?{text:void 0,json:e}:{text:A||"",json:e},{contentErrors:void 0,patchResult:void 0});else if(e!==void 0){var{operations:l,newSelection:g}=Sq(e,s);Bs("remove",{operations:l,selection:t,newSelection:g}),r(l,(C,I)=>({state:I,selection:n?t:g}))}}}function mw(i){var{insertType:e,selectInside:A,initialValue:t,json:n,selection:o,readOnly:a,parser:r,onPatch:s,onReplaceJson:l}=i;if(!a){var g=(function(h,f,m){if(m==="object")return{};if(m==="array")return[];if(m==="structure"&&h!==void 0){var v=f?fq(f):[],S=Ze(h,v);if(Array.isArray(S)&&!zi(S)){var k=bc(S);return ra(k)?kR(k,M=>Array.isArray(M)?[]:Sn(M)?void 0:""):""}}return""})(n,o,e);if(n!==void 0){var C=r.stringify(g),I=Mq(n,o,C,r);Bs("onInsert",{insertType:e,operations:I,newValue:g,data:C});var B=Ni(I.filter(h=>h.op==="add"||h.op==="replace"));s(I,(h,f,m)=>{if(B){var v=js(h,B.path);if(ra(g))return{state:ec(h,f,v,E_),selection:A?uC(v):m};if(g===""){var S=zi(v)?void 0:Ze(h,Vi(v));return{state:ec(h,f,v,$8),selection:Sn(S)?h_(v,t):Cw(v,t)}}}}),Bs("after patch")}else{Bs("onInsert",{insertType:e,newValue:g});var Q=[];l(g,(h,f)=>({state:UI(h,f,Q),selection:ra(g)?uC(Q):Cw(Q)}))}}}function oV(i){return zk.apply(this,arguments)}function zk(){return zk=Pt(function*(i){var{char:e,selectInside:A,json:t,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s,onSelect:l}=i;o||(er(n)?l(ke(ke({},n),{},{edit:!0,initialValue:e})):e==="{"?mw({insertType:"object",selectInside:A,initialValue:void 0,json:t,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s}):e==="["?mw({insertType:"array",selectInside:A,initialValue:void 0,json:t,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s}):hn(n)&&t!==void 0?ra(Ze(t,n.path))||l(ke(ke({},n),{},{edit:!0,initialValue:e})):(Bs("onInsertValueWithCharacter",{char:e}),yield(function(g){return Pk.apply(this,arguments)})({char:e,json:t,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s})))}),zk.apply(this,arguments)}function Pk(){return Pk=Pt(function*(i){var{char:e,json:A,selection:t,readOnly:n,parser:o,onPatch:a,onReplaceJson:r}=i;n||mw({insertType:"value",selectInside:!1,initialValue:e,json:A,selection:t,readOnly:n,parser:o,onPatch:a,onReplaceJson:r})}),Pk.apply(this,arguments)}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-json-preview.svelte-25xmyd { + flex: 1; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-panel-color-readonly, #b2b2b2); + overflow: auto; + white-space: pre-wrap; + padding: 2px; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +}`);var _BA=TA('
        ');function aV(i,e){Ft(e,!1);var A=cA(),t=cA(),n=L(e,"text",8),o=L(e,"json",8),a=L(e,"indentation",8),r=L(e,"parser",8);KA(()=>(J(o()),J(n())),()=>{N(A,o()!==void 0?{json:o()}:{text:n()||""})}),KA(()=>(c(A),J(a()),J(r()),sw),()=>{N(t,aC(bk(c(A),a(),r()),sw))}),Ln(),ai();var s=_BA(),l=gA(s);_e(()=>Gt(l,c(t))),sA(i,s),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +button.jse-context-menu-button.svelte-16jz6ui { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + flex: 1; + white-space: nowrap; + padding: var(--jse-padding, 10px); + color: inherit; +} +button.jse-context-menu-button.svelte-16jz6ui:hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +} +button.jse-context-menu-button.svelte-16jz6ui:focus { + background: var(--jse-context-menu-background-highlight, #7a7a7a); + z-index: 1; +} +button.jse-context-menu-button.svelte-16jz6ui:disabled { + color: var(--jse-context-menu-color-disabled, #9d9d9d); + background: unset; +} +button.jse-context-menu-button.left.svelte-16jz6ui { + text-align: left; +} +button.jse-context-menu-button.svelte-16jz6ui svg { + width: 16px; +}`);var xBA=TA('');function Ik(i,e){Ft(e,!1);var A=L(e,"item",8),t=L(e,"className",8,void 0),n=L(e,"onRequestClose",8);ai();var o=xBA(),a=gA(o),r=g=>{on(g,{get data(){return J(A()),uA(()=>A().icon)}})};zA(a,g=>{J(A()),uA(()=>A().icon)&&g(r)});var s=kA(a,2),l=g=>{var C=cr();_e(()=>Gt(C,(J(A()),uA(()=>A().text)))),sA(g,C)};zA(s,g=>{J(A()),uA(()=>A().text)&&g(l)}),_e(g=>{oi(o,1,g,"svelte-16jz6ui"),Fn(o,"title",(J(A()),uA(()=>A().title))),o.disabled=(J(A()),uA(()=>A().disabled||!1))},[()=>J2((J(lc),J(t()),J(A()),uA(()=>lc("jse-context-menu-button",t(),A().className))))]),we("click",o,g=>{n()(),A().onClick(g)}),sA(i,o),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-dropdown-button.svelte-bov1j6 { + flex: 1; + line-height: normal; + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + position: relative; + padding: 0; + display: flex; +} +.jse-dropdown-button.svelte-bov1j6 ul:where(.svelte-bov1j6) { + margin: 0; + padding: 0; +} +.jse-dropdown-button.svelte-bov1j6 ul:where(.svelte-bov1j6) li:where(.svelte-bov1j6) { + margin: 0; + padding: 0; + list-style-type: none; +} +.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + width: 2em; + background: var(--jse-context-menu-background, #656565); + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); + border-radius: 0; +} +.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown.jse-visible:where(.svelte-bov1j6) { + background: var(--jse-context-menu-background, #656565); +} +.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +} +.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):focus { + z-index: 1; +} +.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):disabled { + color: var(--jse-context-menu-color-disabled, #9d9d9d); + background: unset; +} +.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) { + display: none; + position: absolute; + top: 100%; + left: 0; + z-index: 1; + background: var(--jse-context-menu-background, #656565); + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); +} +.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items.jse-visible:where(.svelte-bov1j6) { + display: block; +} +.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + width: 100%; + text-align: left; + padding: var(--jse-padding, 10px); + margin: 0; +} +.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6):hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +} +.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6):disabled { + color: var(--jse-context-menu-color-disabled, #9d9d9d); + background: unset; +}`);var RBA=TA('
      • '),NBA=TA('
          ');Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +button.jse-context-menu-button.svelte-1y5l9l1 { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + flex: 1; + white-space: nowrap; + padding: var(--jse-padding, 10px); + color: inherit; +} +button.jse-context-menu-button.svelte-1y5l9l1:hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +} +button.jse-context-menu-button.svelte-1y5l9l1:focus { + background: var(--jse-context-menu-background-highlight, #7a7a7a); + z-index: 1; +} +button.jse-context-menu-button.svelte-1y5l9l1:disabled { + color: var(--jse-context-menu-color-disabled, #9d9d9d); + background: unset; +} +button.jse-context-menu-button.left.svelte-1y5l9l1 { + text-align: left; +} +button.jse-context-menu-button.svelte-1y5l9l1 svg { + width: 16px; +}`);var FBA=TA('');function dk(i,e){Ft(e,!1);var A=cA(),t=L(e,"item",8),n=L(e,"className",8,void 0),o=L(e,"onRequestClose",8);KA(()=>(J(t()),J(o())),()=>{N(A,t().items.map(a=>ke(ke({},a),{},{onClick:r=>{o()(),a.onClick(r)}})))}),Ln(),ai(),(function(a,r){Ft(r,!1);var s=cA(void 0,!0),l=L(r,"items",25,()=>[]),g=L(r,"title",9,void 0),C=L(r,"width",9,"120px"),I=cA(!1,!0);function B(){N(I,!1)}function Q(M){hC(M)==="Escape"&&(M.preventDefault(),N(I,!1))}Vr(()=>{document.addEventListener("click",B),document.addEventListener("keydown",Q)}),Ig(()=>{document.removeEventListener("click",B),document.removeEventListener("keydown",Q)}),KA(()=>J(l()),()=>{N(s,l().every(M=>M.disabled===!0))}),Ln(),ai(!0);var h=NBA(),f=gA(h);Ca(f,r,"defaultItem",{},null);var m,v=kA(f,2);on(gA(v),{get data(){return qc}});var S,k=kA(v,2);Ia(gA(k),5,l,Sa,(M,x)=>{var F=RBA(),z=gA(F),P=gA(z),Z=W=>{on(W,{get data(){return c(x),uA(()=>c(x).icon)}})};zA(P,W=>{c(x),uA(()=>c(x).icon)&&W(Z)});var AA=kA(P);_e(()=>{var W;Fn(z,"title",(c(x),uA(()=>c(x).title))),z.disabled=(c(x),uA(()=>c(x).disabled)),oi(z,1,J2((c(x),uA(()=>c(x).className))),"svelte-bov1j6"),Gt(AA," ".concat((c(x),(W=uA(()=>c(x).text))!==null&&W!==void 0?W:"")))}),we("click",z,W=>c(x).onClick(W)),sA(M,F)}),_e(()=>{var M;Fn(h,"title",g()),m=oi(v,1,"jse-open-dropdown svelte-bov1j6",null,m,{"jse-visible":c(I)}),v.disabled=c(s),S=oi(k,1,"jse-dropdown-items svelte-bov1j6",null,S,{"jse-visible":c(I)}),cg(k,"width: ".concat((M=C())!==null&&M!==void 0?M:"",";"))}),we("click",v,function(){var M=c(I);setTimeout(()=>N(I,!M))}),we("click",h,B),sA(a,h),Lt()})(i,{get width(){return J(t()),uA(()=>t().width)},get items(){return c(A)},$$slots:{defaultItem:(a,r)=>{var s=FBA(),l=gA(s),g=I=>{on(I,{get data(){return J(t()),uA(()=>t().main.icon)}})};zA(l,I=>{J(t()),uA(()=>t().main.icon)&&I(g)});var C=kA(l);_e(I=>{var B;oi(s,1,I,"svelte-1y5l9l1"),Fn(s,"title",(J(t()),uA(()=>t().main.title))),s.disabled=(J(t()),uA(()=>t().main.disabled||!1)),Gt(C," ".concat((J(t()),(B=uA(()=>t().main.text))!==null&&B!==void 0?B:"")))},[()=>J2((J(lc),J(n()),J(t()),uA(()=>lc("jse-context-menu-button",n(),t().main.className))))]),we("click",s,I=>{o()(),t().main.onClick(I)}),sA(a,s)}}}),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-contextmenu.svelte-1shjn02 { + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + background: var(--jse-context-menu-background, #656565); + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); +} +.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) { + display: flex; + flex-direction: row; + align-items: flex-start; + justify-content: stretch; +} +.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-label:where(.svelte-1shjn02) { + flex: 1; + white-space: nowrap; + padding: var(--jse-padding, 10px); + color: var(--jse-context-menu-color-disabled, #9d9d9d); + line-height: normal; +} +.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-tip:where(.svelte-1shjn02) { + flex: 1; + background: var(--jse-context-menu-tip-background, rgba(255, 255, 255, 0.2)); + color: var(--context-menu-tip-color, inherit); + margin: calc(0.5 * var(--jse-padding, 10px)); + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); + font-size: 80%; + line-height: 1.3em; + display: flex; + flex-direction: row; + align-items: flex-start; + gap: var(--jse-padding, 10px); + border-radius: 3px; +} +.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-tip:where(.svelte-1shjn02) div.jse-tip-icon:where(.svelte-1shjn02) { + padding-top: calc(0.5 * var(--jse-padding, 10px)); +} +.jse-contextmenu.svelte-1shjn02 .jse-column:where(.svelte-1shjn02) { + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; +} +.jse-contextmenu.svelte-1shjn02 .jse-column:where(.svelte-1shjn02):not(:last-child) { + border-right: 1px solid var(--jse-context-menu-separator-color, #7a7a7a); +} +.jse-contextmenu.svelte-1shjn02 .jse-separator:where(.svelte-1shjn02) { + width: 100%; + height: 1px; + background: var(--jse-context-menu-separator-color, #7a7a7a); +}`);var LBA=TA('
          '),GBA=TA('
          '),KBA=TA('
          '),UBA=TA('
          '),TBA=TA('
          '),JBA=TA('
          '),YBA=TA('
          '),OBA=TA('');function rV(i,e){Ft(e,!1);var A=L(e,"items",9),t=L(e,"onRequestClose",9),n=L(e,"tip",9),o=cA(void 0,!0);Vr(()=>{var I=Array.from(c(o).querySelectorAll("button")).find(B=>!B.disabled);I&&I.focus()});var a={ArrowUp:"Up",ArrowDown:"Down",ArrowLeft:"Left",ArrowRight:"Right"};function r(I){return console.error("Unknown type of context menu item",I),"???"}ai(!0);var s=OBA(),l=gA(s);Ia(l,1,A,Sa,(I,B)=>{var Q=Gi(),h=it(Q),f=v=>{Ik(v,{get item(){return c(B)},get onRequestClose(){return t()}})},m=v=>{var S=Gi(),k=it(S),M=F=>{dk(F,{get item(){return c(B)},get onRequestClose(){return t()}})},x=F=>{var z=Gi(),P=it(z),Z=W=>{var CA=TBA();Ia(CA,5,()=>(c(B),uA(()=>c(B).items)),Sa,(wA,BA)=>{var QA=Gi(),RA=it(QA),IA=_A=>{Ik(_A,{get item(){return c(BA)},get onRequestClose(){return t()}})},dA=_A=>{var VA=Gi(),he=it(VA),HA=PA=>{dk(PA,{get item(){return c(BA)},get onRequestClose(){return t()}})},vA=PA=>{var et=Gi(),We=it(et),OA=XA=>{var pA=KBA();Ia(pA,5,()=>(c(BA),uA(()=>c(BA).items)),Sa,(Ae,NA)=>{var Ne=Gi(),YA=it(Ne),DA=pt=>{Ik(pt,{className:"left",get item(){return c(NA)},get onRequestClose(){return t()}})},Kt=pt=>{var ue=Gi(),Ot=it(ue),He=ft=>{dk(ft,{className:"left",get item(){return c(NA)},get onRequestClose(){return t()}})},je=ft=>{var Fe=Gi(),ri=it(Fe),j=tA=>{sA(tA,LBA())},X=tA=>{var nA=Gi(),UA=it(nA),de=GA=>{var JA=GBA(),Qt=gA(JA);_e(()=>Gt(Qt,(c(NA),uA(()=>c(NA).text)))),sA(GA,JA)},pe=GA=>{var JA=cr();_e(Qt=>Gt(JA,Qt),[()=>(c(NA),uA(()=>r(c(NA))))]),sA(GA,JA)};zA(UA,GA=>{J(IP),c(NA),uA(()=>IP(c(NA)))?GA(de):GA(pe,!1)},!0),sA(tA,nA)};zA(ri,tA=>{J(M2),c(NA),uA(()=>M2(c(NA)))?tA(j):tA(X,!1)},!0),sA(ft,Fe)};zA(Ot,ft=>{J(iE),c(NA),uA(()=>iE(c(NA)))?ft(He):ft(je,!1)},!0),sA(pt,ue)};zA(YA,pt=>{J(nC),c(NA),uA(()=>nC(c(NA)))?pt(DA):pt(Kt,!1)}),sA(Ae,Ne)}),sA(XA,pA)},EA=XA=>{var pA=Gi(),Ae=it(pA),NA=YA=>{sA(YA,UBA())},Ne=YA=>{var DA=cr();_e(Kt=>Gt(DA,Kt),[()=>(c(BA),uA(()=>r(c(BA))))]),sA(YA,DA)};zA(Ae,YA=>{J(M2),c(BA),uA(()=>M2(c(BA)))?YA(NA):YA(Ne,!1)},!0),sA(XA,pA)};zA(We,XA=>{J(BP),c(BA),uA(()=>BP(c(BA)))?XA(OA):XA(EA,!1)},!0),sA(PA,et)};zA(he,PA=>{J(iE),c(BA),uA(()=>iE(c(BA)))?PA(HA):PA(vA,!1)},!0),sA(_A,VA)};zA(RA,_A=>{J(nC),c(BA),uA(()=>nC(c(BA)))?_A(IA):_A(dA,!1)}),sA(wA,QA)}),sA(W,CA)},AA=W=>{var CA=Gi(),wA=it(CA),BA=RA=>{sA(RA,JBA())},QA=RA=>{var IA=cr();_e(dA=>Gt(IA,dA),[()=>(c(B),uA(()=>r(c(B))))]),sA(RA,IA)};zA(wA,RA=>{J(M2),c(B),uA(()=>M2(c(B)))?RA(BA):RA(QA,!1)},!0),sA(W,CA)};zA(P,W=>{J(dP),c(B),uA(()=>dP(c(B)))?W(Z):W(AA,!1)},!0),sA(F,z)};zA(k,F=>{J(iE),c(B),uA(()=>iE(c(B)))?F(M):F(x,!1)},!0),sA(v,S)};zA(h,v=>{J(nC),c(B),uA(()=>nC(c(B)))?v(f):v(m,!1)}),sA(I,Q)});var g=kA(l,2),C=I=>{var B=YBA(),Q=gA(B),h=gA(Q);on(gA(h),{get data(){return yT}});var f=gA(kA(h,2));_e(()=>Gt(f,n())),sA(I,B)};zA(g,I=>{n()&&I(C)}),Ho(s,I=>N(o,I),()=>c(o)),we("keydown",s,function(I){var B=hC(I),Q=a[B];if(Q&&I.target){I.preventDefault();var h=B1A({allElements:Array.from(c(o).querySelectorAll("button:not([disabled])")),currentElement:I.target,direction:Q,hasPrio:f=>f.getAttribute("data-type")!=="jse-open-dropdown"});h&&h.focus()}}),sA(i,s),Lt()}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-value.jse-string.svelte-1htmvf1 { + color: var(--jse-value-color-string, #008000); +} +.jse-value.jse-object.svelte-1htmvf1, .jse-value.jse-array.svelte-1htmvf1 { + min-width: 16px; + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); +} +.jse-value.jse-number.svelte-1htmvf1 { + color: var(--jse-value-color-number, #ee422e); +} +.jse-value.jse-boolean.svelte-1htmvf1 { + color: var(--jse-value-color-boolean, #ff8c00); +} +.jse-value.jse-null.svelte-1htmvf1 { + color: var(--jse-value-color-null, #004ed0); +} +.jse-value.jse-invalid.svelte-1htmvf1 { + color: var(--jse-text-color, #4d4d4d); +} +.jse-value.jse-url.svelte-1htmvf1 { + color: var(--jse-value-color-url, #008000); + text-decoration: underline; +} + +.jse-enum-value.svelte-1htmvf1 { + background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); + border: none; + padding: 0; + font-family: inherit; + font-size: inherit; + cursor: pointer; + outline: none; +} +.jse-enum-value.jse-selected.svelte-1htmvf1 { + background: var(--jse-selection-background-color, #d3d3d3); + color: inherit; +} +.jse-enum-value.jse-value.svelte-1htmvf1:focus { + color: var(--jse-text-color, #4d4d4d); +}`);var BXA=TA(""),EXA=TA("");var O8,H8;function z8(i,e){return O8||(H8=new WeakMap,O8=new ResizeObserver(A=>{for(var t of A){var n=H8.get(t.target);n&&n(t.target)}})),H8.set(i,e),O8.observe(i),{destroy:()=>{H8.delete(i),O8.unobserve(i)}}}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-tree-mode.svelte-10mlrw4 { + flex: 1; + display: flex; + flex-direction: column; + position: relative; + background: var(--jse-background-color, #fff); + min-width: 0; + min-height: 0; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-text-color, #4d4d4d); + line-height: var(--jse-line-height, calc(1em + 4px)); +} +.jse-tree-mode.svelte-10mlrw4 .jse-hidden-input-label:where(.svelte-10mlrw4) .jse-hidden-input:where(.svelte-10mlrw4) { + position: fixed; + top: -10px; + left: -10px; + width: 1px; + height: 1px; + padding: 0; + border: 0; + outline: none; +} +.jse-tree-mode.no-main-menu.svelte-10mlrw4 { + border-top: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-tree-mode.svelte-10mlrw4 .jse-search-box-container:where(.svelte-10mlrw4) { + position: relative; + height: 0; + top: var(--jse-padding, 10px); + margin-right: calc(var(--jse-padding, 10px) + 20px); + margin-left: var(--jse-padding, 10px); + text-align: right; + z-index: 3; +} +.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) { + flex: 1; + overflow: auto; + position: relative; + padding: 2px; + display: flex; + flex-direction: column; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4):last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-loading-space:where(.svelte-10mlrw4) { + flex: 1; +} +.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-loading:where(.svelte-10mlrw4) { + flex: 2; + text-align: center; + color: var(--jse-panel-color-readonly, #b2b2b2); + box-sizing: border-box; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +} +.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-search-box-background:where(.svelte-10mlrw4) { + border: 50px solid var(--jse-modal-background, #f5f5f5); + margin: -2px; + margin-bottom: 2px; + display: inline-block; +}`);var HBA=TA(" ",1),zBA=TA('
          '),PBA=TA('
          ',1),jBA=TA(' ',1),qBA=TA('
          loading...
          '),VBA=TA('
          ',1);function jk(i,e){Ft(e,!1);var A=cA(void 0,!0),t=tr("jsoneditor:TreeMode"),n=typeof window>"u";t("isSSR:",n);var o=C1(),a=C1(),{openAbsolutePopup:r,closeAbsolutePopup:s}=H2("absolute-popup"),l=cA(void 0,!0),g=cA(void 0,!0),C=cA(void 0,!0),I=!1,B=Hq(),Q=L(e,"readOnly",9),h=L(e,"externalContent",9),f=L(e,"externalSelection",9),m=L(e,"history",9),v=L(e,"truncateTextSize",9),S=L(e,"mainMenuBar",9),k=L(e,"navigationBar",9),M=L(e,"escapeControlCharacters",9),x=L(e,"escapeUnicodeCharacters",9),F=L(e,"parser",9),z=L(e,"parseMemoizeOne",9),P=L(e,"validator",9),Z=L(e,"validationParser",9),AA=L(e,"pathParser",9),W=L(e,"indentation",9),CA=L(e,"onError",9),wA=L(e,"onChange",9),BA=L(e,"onChangeMode",9),QA=L(e,"onSelect",9),RA=L(e,"onUndo",9),IA=L(e,"onRedo",9),dA=L(e,"onRenderValue",9),_A=L(e,"onRenderMenu",9),VA=L(e,"onRenderContextMenu",9),he=L(e,"onClassName",9),HA=L(e,"onFocus",9),vA=L(e,"onBlur",9),PA=L(e,"onSortModal",9),et=L(e,"onTransformModal",9),We=L(e,"onJSONEditorModal",9),OA=!1,EA=cA(!1,!0),XA=cA(void 0,!0);p_({onMount:Vr,onDestroy:Ig,getWindow:()=>Gu(c(C)),hasFocus:()=>OA&&document.hasFocus()||o_(c(C)),onFocus:()=>{I=!0,HA()&&HA()()},onBlur:()=>{I=!1,vA()&&vA()()}});var pA=cA(void 0,!0),Ae=cA(void 0,!0),NA=void 0,Ne=!1,YA=cA(_k({json:c(pA)}),!0),DA=cA(wu(f())?f():void 0,!0);function Kt($){N(DA,$)}Vr(()=>{if(c(DA)){var $=dt(c(DA));N(YA,ec(c(pA),c(YA),$,$8)),setTimeout(()=>Go($))}});var pt,ue=cA(void 0,!0),Ot=cA(void 0,!0),He=cA(void 0,!0),je=cA(void 0,!0),ft=cA(!1,!0),Fe=cA(!1,!0);function ri($){N(je,(pt=$)?_q(c(pA),pt.items):void 0)}function j($,fA){return X.apply(this,arguments)}function X(){return(X=Pt(function*($,fA){N(YA,ec(c(pA),c(YA),$,$8));var ZA=Qo(fA);yield Ji($,{element:ZA})})).apply(this,arguments)}function tA(){N(ft,!1),N(Fe,!1),Rt()}function nA($){t("select validation error",$),N(DA,Pi($.path)),Ji($.path)}function UA($){var fA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:xk;t("expand"),N(YA,ec(c(pA),c(YA),$,fA))}function de($,fA){N(YA,uP(c(pA),c(YA),$,fA)),c(DA)&&(function(ZA,Te){return I0(dt(ZA),Te)&&(dt(ZA).length>Te.length||ja(ZA))})(c(DA),$)&&N(DA,void 0)}var pe=cA(!1,!0),GA=cA([],!0),JA=cA(void 0,!0),Qt=pB(zq);function nt($,fA,ZA,Te){BE(()=>{var be;try{be=Qt($,fA,ZA,Te)}catch(Se){be=[{path:[],message:"Failed to validate: "+Se.message,severity:ic.warning}]}_i(be,c(GA))||(t("validationErrors changed:",be),N(GA,be),N(JA,(function(Se,st){var Wt;return st.forEach(Ui=>{Wt=zP(Se,Wt,Ui.path,(Kn,tn)=>ke(ke({},tn),{},{validationError:Ui}))}),st.forEach(Ui=>{for(var Kn=Ui.path;Kn.length>0;)Kn=Vi(Kn),Wt=zP(Se,Wt,Kn,(tn,uo)=>uo.validationError?uo:ke(ke({},uo),{},{validationError:{isChildError:!0,path:Kn,message:"Contains invalid data",severity:ic.warning}}))}),Wt})($,c(GA))))},be=>t("validationErrors updated in ".concat(be," ms")))}function ze(){return t("validate"),NA?{parseError:NA,isRepairable:!1}:(nt(c(pA),P(),F(),Z()),zi(c(GA))?void 0:{validationErrors:c(GA)})}function Ye(){return c(pA)}function di(){return c(YA)}function Cn(){return c(DA)}function Qn($){t("applyExternalContent",{updatedContent:$}),uu($)?(function(fA){if(fA!==void 0){var ZA=!_i(c(pA),fA);if(t("update external json",{isChanged:ZA,currentlyText:c(pA)===void 0}),!!ZA){var Te={documentState:c(YA),selection:c(DA),json:c(pA),text:c(Ae),textIsRepaired:c(pe)};N(pA,fA),N(YA,bl(fA,c(YA))),Je(c(pA)),N(Ae,void 0),N(pe,!1),NA=void 0,an(c(pA)),ki(Te)}}})($.json):Qu($)&&(function(fA){if(!(fA===void 0||uu(h()))){var ZA=fA!==c(Ae);if(t("update external text",{isChanged:ZA}),!!ZA){var Te={documentState:c(YA),selection:c(DA),json:c(pA),text:c(Ae),textIsRepaired:c(pe)};try{N(pA,z()(fA)),N(YA,bl(c(pA),c(YA))),Je(c(pA)),N(Ae,fA),N(pe,!1),NA=void 0}catch(be){try{N(pA,z()(Xl(fA))),N(YA,bl(c(pA),c(YA))),Je(c(pA)),N(Ae,fA),N(pe,!0),NA=void 0,an(c(pA))}catch(Se){N(pA,void 0),N(YA,void 0),N(Ae,h().text),N(pe,!1),NA=c(Ae)!==void 0&&c(Ae)!==""?SE(c(Ae),be.message||String(be)):void 0}}an(c(pA)),ki(Te)}}})($.text)}function Je($){Ne||(Ne=!0,N(YA,UI($,c(YA),[])))}function an($){c(DA)&&(wr($,kI(c(DA)))&&wr($,dt(c(DA)))||(t("clearing selection: path does not exist anymore",c(DA)),N(DA,nE($,c(YA)))))}function ki($){if($.json!==void 0||$.text!==void 0){var fA=c(pA)!==void 0&&$.json!==void 0;m().add({type:"tree",undo:{patch:fA?[{op:"replace",path:"",value:$.json}]:void 0,json:$.json,text:$.text,documentState:$.documentState,textIsRepaired:$.textIsRepaired,selection:r0($.selection),sortedColumn:void 0},redo:{patch:fA?[{op:"replace",path:"",value:c(pA)}]:void 0,json:c(pA),text:c(Ae),documentState:c(YA),textIsRepaired:c(pe),selection:r0(c(DA)),sortedColumn:void 0}})}}function Ki($,fA){var ZA;if(t("patch",$,fA),c(pA)===void 0)throw new Error("Cannot apply patch: no JSON");var Te=c(pA),be={json:void 0,text:c(Ae),documentState:c(YA),selection:r0(c(DA)),textIsRepaired:c(pe),sortedColumn:void 0},Se=kq(c(pA),$),st=Qq(c(pA),c(YA),$),Wt=(ZA=xE(c(pA),$))!==null&&ZA!==void 0?ZA:c(DA),Ui=typeof fA=="function"?fA(st.json,st.documentState,Wt):void 0;return N(pA,Ui?.json!==void 0?Ui.json:st.json),N(YA,Ui?.state!==void 0?Ui.state:st.documentState),N(DA,Ui?.selection!==void 0?Ui.selection:Wt),N(Ae,void 0),N(pe,!1),N(Ot,void 0),N(He,void 0),NA=void 0,an(c(pA)),m().add({type:"tree",undo:ke({patch:Se},be),redo:{patch:$,json:void 0,text:c(Ae),documentState:c(YA),selection:r0(c(DA)),sortedColumn:void 0,textIsRepaired:c(pe)}}),{json:c(pA),previousJson:Te,undo:Se,redo:$}}function An(){!Q()&&c(DA)&&N(DA,h_(dt(c(DA))))}function Mt(){if(!Q()&&c(DA)){var $=dt(c(DA)),fA=Ze(c(pA),$);ra(fA)?(function(ZA,Te){t("openJSONEditorModal",{path:ZA,value:Te}),OA=!0,We()({content:{json:Te},path:ZA,onPatch:c(b).onPatch,onClose:()=>{OA=!1,setTimeout(Rt)}})})($,fA):N(DA,Cw($))}}function rn(){if(!Q()&&hn(c(DA))){var $=dt(c(DA)),fA=bt($),ZA=Ze(c(pA),$),Te=!l0(c(pA),c(YA),$),be=Te?String(ZA):YE(String(ZA),F());t("handleToggleEnforceString",{enforceString:Te,value:ZA,updatedValue:be}),$A([{op:"replace",path:fA,value:be}],(Se,st)=>({state:Sw(c(pA),st,$,{type:"value",enforceString:Te})}))}}function Ut(){return c(pe)&&c(pA)!==void 0&&ve(c(pA)),c(pA)!==void 0?{json:c(pA)}:{text:c(Ae)||""}}function U(){return Bt.apply(this,arguments)}function Bt(){return Bt=Pt(function*(){var $=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];yield eV({json:c(pA),selection:c(DA),indentation:$?W():void 0,readOnly:Q(),parser:F(),onPatch:$A})}),Bt.apply(this,arguments)}function ui(){return un.apply(this,arguments)}function un(){return un=Pt(function*(){var $=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];c(pA)!==void 0&&(yield tV({json:c(pA),selection:c(DA),indentation:$?W():void 0,parser:F()}))}),un.apply(this,arguments)}function pn($){var fA;$.preventDefault(),Eo((fA=$.clipboardData)===null||fA===void 0?void 0:fA.getData("text/plain"))}function Xn(){return zo.apply(this,arguments)}function zo(){return(zo=Pt(function*(){try{Eo(yield navigator.clipboard.readText())}catch($){console.error($),N(EA,!0)}})).apply(this,arguments)}function Eo($){$!==void 0&&iV({clipboardText:$,json:c(pA),selection:c(DA),readOnly:Q(),parser:F(),onPatch:$A,onChangeText:hA,onPasteMultilineText:zn,openRepairModal:Lo})}function Lo($,fA){N(XA,{text:$,onParse:ZA=>Lu(ZA,Te=>Fu(Te,F())),onRepair:nq,onApply:fA,onClose:Rt})}function $o(){nV({json:c(pA),text:c(Ae),selection:c(DA),keepSelection:!1,readOnly:Q(),onChange:wA(),onPatch:$A})}function yo(){!Q()&&c(pA)!==void 0&&c(DA)&&IE&&!zi(dt(c(DA)))&&(t("duplicate",{selection:c(DA)}),$A(vq(c(pA),Y2(c(pA),c(DA)))))}function da(){Q()||!c(DA)||!Io(c(DA))&&!hn(c(DA))||zi(dt(c(DA)))||(t("extract",{selection:c(DA)}),$A(bq(c(pA),c(DA)),($,fA)=>{if(ra($))return{state:ok($,fA,[])}}))}function Aa($){mw({insertType:$,selectInside:!0,initialValue:void 0,json:c(pA),selection:c(DA),readOnly:Q(),parser:F(),onPatch:$A,onReplaceJson:ve})}function sa($){er(c(DA))&&N(DA,Pi(c(DA).path)),c(DA)||N(DA,nE(c(pA),c(YA))),Aa($)}function vo($){if(!Q()&&c(DA))if(K8(c(DA)))try{var fA=kI(c(DA)),ZA=Ze(c(pA),fA),Te=(function(Se,st,Wt){if(st==="array"){if(Array.isArray(Se))return Se;if(Sn(Se))return oP(Se);if(typeof Se=="string")try{var Ui=Wt.parse(Se);if(Array.isArray(Ui))return Ui;if(Sn(Ui))return oP(Ui)}catch(tn){return[Se]}return[Se]}if(st==="object"){if(Array.isArray(Se))return nP(Se);if(Sn(Se))return Se;if(typeof Se=="string")try{var Kn=Wt.parse(Se);if(Sn(Kn))return Kn;if(Array.isArray(Kn))return nP(Kn)}catch(tn){return{value:Se}}return{value:Se}}if(st==="value")return ra(Se)?Wt.stringify(Se):Se;throw new Error("Cannot convert ".concat(t_(Se,Wt)," to ").concat(st))})(ZA,$,F());if(Te===ZA)return;var be=[{op:"replace",path:bt(fA),value:Te}];t("handleConvert",{selection:c(DA),path:fA,type:$,operations:be}),$A(be,(Se,st)=>({state:c(DA)?UI(Se,st,dt(c(DA))):c(YA)}))}catch(Se){CA()(Se)}else CA()(new Error("Cannot convert current selection to ".concat($)))}function ge(){if(c(DA)){var $=wP(c(pA),c(YA),c(DA),!1),fA=Vi(dt(c(DA)));$&&!zi(dt($))&&_i(fA,Vi(dt($)))?N(DA,IC(dt($))):N(DA,uC(fA)),t("insert before",{selection:c(DA),selectionBefore:$,parentPath:fA}),Fo(),ji()}}function wi(){if(c(DA)){var $=T2(c(pA),c(DA));t("insert after",$),N(DA,IC($)),Fo(),ji()}}function In($){return fn.apply(this,arguments)}function fn(){return(fn=Pt(function*($){yield oV({char:$,selectInside:!0,json:c(pA),selection:c(DA),readOnly:Q(),parser:F(),onPatch:$A,onReplaceJson:ve,onSelect:Kt})})).apply(this,arguments)}function Po(){if(!Q()&&m().canUndo){var $=m().undo();if(gw($)){var fA={json:c(pA),text:c(Ae)};N(pA,$.undo.patch?Ps(c(pA),$.undo.patch):$.undo.json),N(YA,$.undo.documentState),N(DA,$.undo.selection),N(Ae,$.undo.text),N(pe,$.undo.textIsRepaired),NA=void 0,t("undo",{item:$,json:c(pA),documentState:c(YA),selection:c(DA)}),SA(fA,$.undo.patch&&$.redo.patch?{json:c(pA),previousJson:fA.json,redo:$.undo.patch,undo:$.redo.patch}:void 0),Rt(),c(DA)&&Ji(dt(c(DA)),{scrollToWhenVisible:!1})}else RA()($)}}function wa(){if(!Q()&&m().canRedo){var $=m().redo();if(gw($)){var fA={json:c(pA),text:c(Ae)};N(pA,$.redo.patch?Ps(c(pA),$.redo.patch):$.redo.json),N(YA,$.redo.documentState),N(DA,$.redo.selection),N(Ae,$.redo.text),N(pe,$.redo.textIsRepaired),NA=void 0,t("redo",{item:$,json:c(pA),documentState:c(YA),selection:c(DA)}),SA(fA,$.undo.patch&&$.redo.patch?{json:c(pA),previousJson:fA.json,redo:$.redo.patch,undo:$.undo.patch}:void 0),Rt(),c(DA)&&Ji(dt(c(DA)),{scrollToWhenVisible:!1})}else IA()($)}}function Ri($){var fA;Q()||c(pA)===void 0||(OA=!0,PA()({id:o,json:c(pA),rootPath:$,onSort:(fA=Pt(function*(ZA){var{operations:Te}=ZA;t("onSort",$,Te),$A(Te,(be,Se)=>({state:ok(be,Se,$),selection:Pi($)}))}),function(ZA){return fA.apply(this,arguments)}),onClose:()=>{OA=!1,setTimeout(Rt)}}))}function ho(){c(DA)&&Ri(yP(c(pA),c(DA)))}function Va(){Ri([])}function bo($){if(c(pA)!==void 0){var{id:fA,onTransform:ZA,onClose:Te}=$,be=$.rootPath||[];OA=!0,et()({id:fA||a,json:c(pA),rootPath:be,onTransform:Se=>{ZA?ZA({operations:Se,json:c(pA),transformedJson:Ps(c(pA),Se)}):(t("onTransform",be,Se),$A(Se,(st,Wt)=>({state:ok(st,Wt,be),selection:Pi(be)})))},onClose:()=>{OA=!1,setTimeout(Rt),Te&&Te()}})}}function La(){c(DA)&&bo({rootPath:yP(c(pA),c(DA))})}function Hn(){bo({rootPath:[]})}function Ji($){return Vt.apply(this,arguments)}function Vt(){return Vt=Pt(function*($){var{scrollToWhenVisible:fA=!0,element:ZA}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};N(YA,ec(c(pA),c(YA),$,$8));var Te=ZA??Gn($);if(t("scrollTo",{path:$,elem:Te,refContents:c(l)}),!Te||!c(l))return Promise.resolve();var be=c(l).getBoundingClientRect(),Se=Te.getBoundingClientRect();if(!fA&&Se.bottom>be.top&&Se.top{B(Te,{container:c(l),offset:st,duration:300,callback:()=>Wt()})})}),Vt.apply(this,arguments)}function Gn($){var fA,ZA;return Fo(),(fA=(ZA=c(l))===null||ZA===void 0?void 0:ZA.querySelector('div[data-path="'.concat(X8($),'"]')))!==null&&fA!==void 0?fA:void 0}function Qo($){var fA,ZA;return Fo(),(fA=(ZA=c(l))===null||ZA===void 0?void 0:ZA.querySelector('span[data-search-result-index="'.concat($,'"]')))!==null&&fA!==void 0?fA:void 0}function Go($){var fA=Gn($);if(fA&&c(l)){var ZA=c(l).getBoundingClientRect(),Te=fA.getBoundingClientRect(),be=ra(Ze(c(pA),$))?20:Te.height;Te.topZA.bottom-20&&B(fA,{container:c(l),offset:-(ZA.height-be-20),duration:0})}}function SA($,fA){if($.json!==void 0||$?.text!==void 0){if(c(Ae)!==void 0){var ZA,Te={text:c(Ae),json:void 0};(ZA=wA())===null||ZA===void 0||ZA(Te,$,{contentErrors:ze(),patchResult:fA})}else if(c(pA)!==void 0){var be,Se={text:void 0,json:c(pA)};(be=wA())===null||be===void 0||be(Se,$,{contentErrors:ze(),patchResult:fA})}}}function $A($,fA){t("handlePatch",$,fA);var ZA={json:c(pA),text:c(Ae)},Te=Ki($,fA);return SA(ZA,Te),Te}function ve($,fA){var ZA={json:c(pA),text:c(Ae)},Te={documentState:c(YA),selection:c(DA),json:c(pA),text:c(Ae),textIsRepaired:c(pe)},be=ec(c(pA),bl($,c(YA)),[],Cu),Se=typeof fA=="function"?fA($,be,c(DA)):void 0;N(pA,Se?.json!==void 0?Se.json:$),N(YA,Se?.state!==void 0?Se.state:be),N(DA,Se?.selection!==void 0?Se.selection:c(DA)),N(Ae,void 0),N(pe,!1),NA=void 0,an(c(pA)),ki(Te),SA(ZA,void 0)}function hA($,fA){t("handleChangeText");var ZA={json:c(pA),text:c(Ae)},Te={documentState:c(YA),selection:c(DA),json:c(pA),text:c(Ae),textIsRepaired:c(pe)};try{N(pA,z()($)),N(YA,ec(c(pA),bl(c(pA),c(YA)),[],Cu)),N(Ae,void 0),N(pe,!1),NA=void 0}catch(Se){try{N(pA,z()(Xl($))),N(YA,ec(c(pA),bl(c(pA),c(YA)),[],Cu)),N(Ae,$),N(pe,!0),NA=void 0}catch(st){N(pA,void 0),N(YA,_k({json:c(pA),expand:Cu})),N(Ae,$),N(pe,!1),NA=c(Ae)!==""?SE(c(Ae),Se.message||String(Se)):void 0}}if(typeof fA=="function"){var be=fA(c(pA),c(YA),c(DA));N(pA,be?.json!==void 0?be.json:c(pA)),N(YA,be?.state!==void 0?be.state:c(YA)),N(DA,be?.selection!==void 0?be.selection:c(DA))}an(c(pA)),ki(Te),SA(ZA,void 0)}function FA($,fA){var ZA=arguments.length>2&&arguments[2]!==void 0&&arguments[2];t("handleExpand",{path:$,expanded:fA,recursive:ZA}),fA?UA($,ZA?E_:xk):de($,ZA),Rt()}function le(){FA([],!0,!0)}function Ge(){FA([],!1,!0)}function rt($){t("openFind",{findAndReplace:$}),N(ft,!1),N(Fe,!1),Fo(),N(ft,!0),N(Fe,$)}function gt($,fA){t("handleExpandSection",$,fA),N(YA,(function(ZA,Te,be,Se){return _E(ZA,Te,be,(st,Wt)=>{if(!Ar(Wt))return Wt;var Ui=Bq(Wt.visibleSections.concat(Se));return ke(ke({},Wt),{},{visibleSections:Ui})})})(c(pA),c(YA),$,fA))}function xt($){t("pasted json as text",$),N(Ot,$)}function zn($){t("pasted multiline text",{pastedText:$}),N(He,$)}function Yi($){var fA,{anchor:ZA,left:Te,top:be,width:Se,height:st,offsetTop:Wt,offsetLeft:Ui,showTip:Kn}=$,tn=(function(Ao){var{json:ta,documentState:wn,selection:Jt,readOnly:sn,onEditKey:ei,onEditValue:vt,onToggleEnforceString:Bi,onCut:ga,onCopy:eo,onPaste:ia,onRemove:Ba,onDuplicate:Cr,onExtract:Q0,onInsertBefore:ll,onInsert:Eg,onConvert:Ec,onInsertAfter:hg,onSort:Zr,onTransform:Ir}=Ao,gl=ta!==void 0,u0=!!Jt,cl=!!Jt&&zi(dt(Jt)),Un=Jt?Ze(ta,dt(Jt)):void 0,ka=Array.isArray(Un)?"Edit array":Sn(Un)?"Edit object":"Edit value",_a=gl&&(Io(Jt)||er(Jt)||hn(Jt)),t1=Jt&&!cl?Ze(ta,Vi(dt(Jt))):void 0,VI=!sn&&gl&&cw(Jt)&&!cl&&!Array.isArray(t1),i1=!sn&&gl&&Jt!==void 0&&cw(Jt),ch=i1&&!ra(Un),WI=!sn&&_a,Ch=_a,wD=!sn&&u0,DD=!sn&&gl&&_a&&!cl,yD=!sn&&gl&&Jt!==void 0&&(Io(Jt)||hn(Jt))&&!cl,hc=_a,n1=hc?"Convert to:":"Insert:",xa=!sn&&(ja(Jt)&&Array.isArray(Un)||il(Jt)&&Array.isArray(t1)),Rl=!sn&&(hc?K8(Jt)&&!Sn(Un):u0),Ih=!sn&&(hc?K8(Jt)&&!Array.isArray(Un):u0),dh=!sn&&(hc?K8(Jt)&&ra(Un):u0),o1=Jt!==void 0&&l0(ta,wn,dt(Jt));function kr(Bh){_a?Bh!=="structure"&&Ec(Bh):Eg(Bh)}return[{type:"row",items:[{type:"button",onClick:()=>ei(),icon:q1,text:"Edit key",title:"Edit the key (Double-click on the key)",disabled:!VI},{type:"dropdown-button",main:{type:"button",onClick:()=>vt(),icon:q1,text:ka,title:"Edit the value (Double-click on the value)",disabled:!i1},width:"11em",items:[{type:"button",icon:q1,text:ka,title:"Edit the value (Double-click on the value)",onClick:()=>vt(),disabled:!i1},{type:"button",icon:o1?D7:b7,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>Bi(),disabled:!ch}]}]},{type:"separator"},{type:"row",items:[{type:"dropdown-button",main:{type:"button",onClick:()=>ga(!0),icon:V1,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!WI},width:"10em",items:[{type:"button",icon:V1,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>ga(!0),disabled:!WI},{type:"button",icon:V1,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>ga(!1),disabled:!WI}]},{type:"dropdown-button",main:{type:"button",onClick:()=>eo(!0),icon:H0,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!Ch},width:"12em",items:[{type:"button",icon:H0,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>eo(!0),disabled:!Ch},{type:"button",icon:H0,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>eo(!1),disabled:!Ch}]},{type:"button",onClick:()=>ia(),icon:f7,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:!wD}]},{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"button",onClick:()=>Cr(),icon:w7,text:"Duplicate",title:"Duplicate selected contents (Ctrl+D)",disabled:!DD},{type:"button",onClick:()=>Q0(),icon:bT,text:"Extract",title:"Extract selected contents",disabled:!yD},{type:"button",onClick:()=>Zr(),icon:c4,text:"Sort",title:"Sort array or object contents",disabled:sn||!_a},{type:"button",onClick:()=>Ir(),icon:r4,text:"Transform",title:"Transform array or object contents (filter, sort, project)",disabled:sn||!_a},{type:"button",onClick:()=>Ba(),icon:Gm,text:"Remove",title:"Remove selected contents (Delete)",disabled:sn||!_a}]},{type:"column",items:[{type:"label",text:n1},{type:"button",onClick:()=>kr("structure"),icon:hc?C4:W1,text:"Structure",title:n1+" structure like the first item in the array",disabled:!xa},{type:"button",onClick:()=>kr("object"),icon:hc?C4:W1,text:"Object",title:n1+" object",disabled:!Rl},{type:"button",onClick:()=>kr("array"),icon:hc?C4:W1,text:"Array",title:n1+" array",disabled:!Ih},{type:"button",onClick:()=>kr("value"),icon:hc?C4:W1,text:"Value",title:n1+" value",disabled:!dh}]}]},{type:"separator"},{type:"row",items:[{type:"button",onClick:()=>ll(),icon:NT,text:"Insert before",title:"Select area before current entry to insert or paste contents",disabled:sn||!_a||cl},{type:"button",onClick:()=>hg(),icon:MT,text:"Insert after",title:"Select area after current entry to insert or paste contents",disabled:sn||!_a||cl}]}]})({json:c(pA),documentState:c(YA),selection:c(DA),readOnly:Q(),onEditKey:An,onEditValue:Mt,onToggleEnforceString:rn,onCut:U,onCopy:ui,onPaste:Xn,onRemove:$o,onDuplicate:yo,onExtract:da,onInsertBefore:ge,onInsert:sa,onInsertAfter:wi,onConvert:vo,onSort:ho,onTransform:La}),uo=(fA=VA()(tn))!==null&&fA!==void 0?fA:tn;if(uo!==!1){var Ai={left:Te,top:be,offsetTop:Wt,offsetLeft:Ui,width:Se,height:st,anchor:ZA,closeOnOuterClick:!0,onClose:()=>{OA=!1,Rt()}};OA=!0;var ea=r(rV,{tip:Kn?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:uo,onRequestClose:()=>s(ea)},Ai)}}function ji($){if(!$a(c(DA)))if($&&($.stopPropagation(),$.preventDefault()),$&&$.type==="contextmenu"&&$.target!==c(g))Yi({left:$.clientX,top:$.clientY,width:sC,height:rC,showTip:!1});else{var fA,ZA=(fA=c(l))===null||fA===void 0?void 0:fA.querySelector(".jse-context-menu-pointer.jse-selected");if(ZA)Yi({anchor:ZA,offsetTop:2,width:sC,height:rC,showTip:!1});else{var Te,be=(Te=c(l))===null||Te===void 0?void 0:Te.getBoundingClientRect();be&&Yi({top:be.top+2,left:be.left+2,width:sC,height:rC,showTip:!1})}}}function $t($){Yi({anchor:Iq($.target,"BUTTON"),offsetTop:0,width:sC,height:rC,showTip:!0})}function Oi(){return Da.apply(this,arguments)}function Da(){return(Da=Pt(function*(){if(t("apply pasted json",c(Ot)),c(Ot)){var{onPasteAsJson:$}=c(Ot);N(Ot,void 0),$(),setTimeout(Rt)}})).apply(this,arguments)}function Tt(){return ct.apply(this,arguments)}function ct(){return(ct=Pt(function*(){t("apply pasted multiline text",c(He)),c(He)&&(Eo(JSON.stringify(c(He))),setTimeout(Rt))})).apply(this,arguments)}function Hi(){t("clear pasted json"),N(Ot,void 0),Rt()}function en(){t("clear pasted multiline text"),N(He,void 0),Rt()}function $n(){BA()(ma.text)}function mn($){N(DA,$),Rt(),Ji(dt($))}function Rt(){t("focus"),c(g)&&(c(g).focus(),c(g).select())}function la($){return(function(fA,ZA,Te){var be=Vi(Te),Se=[Ni(Te)],st=Ze(fA,be),Wt=st?nk(st,ZA,Se):void 0;return Wt?Pi(be.concat(Wt)):IC(Te)})(c(pA),c(YA),$)}function jo($){c(A)&&c(A).onDrag($)}function D(){c(A)&&c(A).onDragEnd()}var b=cA(void 0,!0);KA(()=>c(DA),()=>{var $;$=c(DA),_i($,f())||(t("onSelect",$),QA()($))}),KA(()=>(J(M()),J(x())),()=>{N(ue,i_({escapeControlCharacters:M(),escapeUnicodeCharacters:x()}))}),KA(()=>c(ft),()=>{(function($){c(l)&&$&&c(l).scrollTop===0&&(Ml(l,c(l).style.overflowAnchor="none"),Ml(l,c(l).scrollTop+=cu),setTimeout(()=>{c(l)&&Ml(l,c(l).style.overflowAnchor="")}))})(c(ft))}),KA(()=>J(h()),()=>{Qn(h())}),KA(()=>J(f()),()=>{(function($){_i(c(DA),$)||(t("applyExternalSelection",{selection:c(DA),externalSelection:$}),wu($)&&N(DA,$))})(f())}),KA(()=>(c(pA),J(P()),J(F()),J(Z())),()=>{nt(c(pA),P(),F(),Z())}),KA(()=>(c(l),HP),()=>{N(A,c(l)?HP(c(l)):void 0)}),KA(()=>(J(Q()),J(v()),J(F()),c(ue),J(dA()),J(he())),()=>{N(b,{mode:ma.tree,readOnly:Q(),truncateTextSize:v(),parser:F(),normalization:c(ue),getJson:Ye,getDocumentState:di,getSelection:Cn,findElement:Gn,findNextInside:la,focus:Rt,onPatch:$A,onInsert:Aa,onExpand:FA,onSelect:Kt,onFind:rt,onExpandSection:gt,onPasteJson:xt,onRenderValue:dA(),onContextMenu:Yi,onClassName:he()||(()=>{}),onDrag:jo,onDragEnd:D})}),KA(()=>c(b),()=>{t("context changed",c(b))}),Ln();var R={expand:UA,collapse:de,validate:ze,getJson:Ye,patch:Ki,acceptAutoRepair:Ut,openTransformModal:bo,scrollTo:Ji,findElement:Gn,findSearchResult:Qo,focus:Rt};ai(!0);var V=VBA();we("mousedown",cC,function($){!OE($.target,fA=>fA===c(C))&&$a(c(DA))&&(t("click outside the editor, exit edit mode"),N(DA,r0(c(DA))),I&&c(g)&&(c(g).focus(),c(g).blur()),t("blur (outside editor)"),c(g)&&c(g).blur())});var _,q=it(V),eA=gA(q),aA=$=>{(function(fA,ZA){Ft(ZA,!1);var Te=cA(void 0,!0),be=cA(void 0,!0),Se=cA(void 0,!0),st=L(ZA,"json",9),Wt=L(ZA,"selection",9),Ui=L(ZA,"readOnly",9),Kn=L(ZA,"showSearch",13,!1),tn=L(ZA,"history",9),uo=L(ZA,"onExpandAll",9),Ai=L(ZA,"onCollapseAll",9),ea=L(ZA,"onUndo",9),Ao=L(ZA,"onRedo",9),ta=L(ZA,"onSort",9),wn=L(ZA,"onTransform",9),Jt=L(ZA,"onContextMenu",9),sn=L(ZA,"onCopy",9),ei=L(ZA,"onRenderMenu",9);function vt(){Kn(!Kn())}var Bi=cA(void 0,!0),ga=cA(void 0,!0),eo=cA(void 0,!0),ia=cA(void 0,!0);KA(()=>J(st()),()=>{N(Te,st()!==void 0)}),KA(()=>(c(Te),J(Wt()),hn),()=>{N(be,c(Te)&&(Io(Wt())||er(Wt())||hn(Wt())))}),KA(()=>(J(uo()),J(st())),()=>{N(Bi,{type:"button",icon:Vq,title:"Expand all",className:"jse-expand-all",onClick:uo(),disabled:!ra(st())})}),KA(()=>(J(Ai()),J(st())),()=>{N(ga,{type:"button",icon:Wq,title:"Collapse all",className:"jse-collapse-all",onClick:Ai(),disabled:!ra(st())})}),KA(()=>J(st()),()=>{N(eo,{type:"button",icon:s4,title:"Search (Ctrl+F)",className:"jse-search",onClick:vt,disabled:st()===void 0})}),KA(()=>(J(Ui()),c(Bi),c(ga),J(ta()),J(st()),J(wn()),c(eo),J(Jt()),J(ea()),J(tn()),J(Ao()),J(sn()),c(be)),()=>{N(ia,Ui()?[c(Bi),c(ga),{type:"separator"},{type:"button",icon:H0,title:"Copy (Ctrl+C)",className:"jse-copy",onClick:sn(),disabled:!c(be)},{type:"separator"},c(eo),{type:"space"}]:[c(Bi),c(ga),{type:"separator"},{type:"button",icon:c4,title:"Sort",className:"jse-sort",onClick:ta(),disabled:Ui()||st()===void 0},{type:"button",icon:r4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:wn(),disabled:Ui()||st()===void 0},c(eo),{type:"button",icon:m7,title:s_,className:"jse-contextmenu",onClick:Jt()},{type:"separator"},{type:"button",icon:Tm,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:ea(),disabled:!tn().canUndo},{type:"button",icon:Um,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Ao(),disabled:!tn().canRedo},{type:"space"}])}),KA(()=>(J(ei()),c(ia)),()=>{N(Se,ei()(c(ia))||c(ia))}),Ln(),ai(!0),Fw(fA,{get items(){return c(Se)}}),Lt()})($,{get json(){return c(pA)},get selection(){return c(DA)},get readOnly(){return Q()},get history(){return m()},onExpandAll:le,onCollapseAll:Ge,onUndo:Po,onRedo:wa,onSort:Va,onTransform:Hn,onContextMenu:$t,onCopy:ui,get onRenderMenu(){return _A()},get showSearch(){return c(ft)},set showSearch(fA){N(ft,fA)},$$legacy:!0})};zA(eA,$=>{S()&&$(aA)});var yA=kA(eA,2),ne=$=>{mBA($,{get json(){return c(pA)},get selection(){return c(DA)},onSelect:mn,get onError(){return CA()},get pathParser(){return AA()}})};zA(yA,$=>{k()&&$(ne)});var re=kA(yA,2),Qe=$=>{var fA=jBA(),ZA=it(fA),Te=gA(ZA);Te.readOnly=!0,Ho(Te,Wt=>N(g,Wt),()=>c(g));var be=kA(ZA,2),Se=Wt=>{var Ui=Gi(),Kn=it(Ui),tn=Ai=>{(function(ea,Ao){function ta(Bi){Bi.stopPropagation(),Ao.onCreateObject()}function wn(Bi){Bi.stopPropagation(),Ao.onCreateArray()}Ft(Ao,!0);var Jt=lBA();Jt.__click=()=>Ao.onClick();var sn=kA(gA(Jt),2),ei=kA(gA(sn),2),vt=Bi=>{var ga=sBA(),eo=kA(it(ga),2);Fn(eo,"title","Create an empty JSON object (press '{')"),eo.__click=ta;var ia=kA(eo,2);Fn(ia,"title","Create an empty JSON array (press '[')"),ia.__click=wn,sA(Bi,ga)};zA(ei,Bi=>{Ao.readOnly||Bi(vt)}),sA(ea,Jt),Lt()})(Ai,{get readOnly(){return Q()},onCreateObject:()=>{Rt(),In("{")},onCreateArray:()=>{Rt(),In("[")},onClick:()=>{Rt()}})},uo=Ai=>{var ea=HBA(),Ao=it(ea),ta=at(()=>Q()?[]:[{icon:l4,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:$n}]);_l(Ao,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return c(ta)}}),aV(kA(Ao,2),{get text(){return c(Ae)},get json(){return c(pA)},get indentation(){return W()},get parser(){return F()}}),sA(Ai,ea)};zA(Kn,Ai=>{c(Ae)===""||c(Ae)===void 0?Ai(tn):Ai(uo,!1)}),sA(Wt,Ui)},st=Wt=>{var Ui=PBA(),Kn=it(Ui);Xq(gA(Kn),{get json(){return c(pA)},get documentState(){return c(YA)},get parser(){return F()},get showSearch(){return c(ft)},get showReplace(){return c(Fe)},get readOnly(){return Q()},columns:void 0,onSearch:ri,onFocus:j,onPatch:$A,onClose:tA});var tn=kA(Kn,2);Fn(tn,"data-jsoneditor-scrollable-contents",!0);var uo=gA(tn),Ai=ei=>{sA(ei,zBA())};zA(uo,ei=>{c(ft)&&ei(Ai)}),Jk(kA(uo,2),{get value(){return c(pA)},pointer:"",get state(){return c(YA)},get validationErrors(){return c(JA)},get searchResults(){return c(je)},get selection(){return c(DA)},get context(){return c(b)},get onDragSelectionStart(){return va}}),Ho(tn,ei=>N(l,ei),()=>c(l));var ea=kA(tn,2),Ao=ei=>{var vt=at(()=>(c(Ot),uA(()=>"You pasted a JSON ".concat(Array.isArray(c(Ot).contents)?"array":"object"," as text")))),Bi=at(()=>[{icon:O0,text:"Paste as JSON instead",title:"Replace the value with the pasted JSON",onMouseDown:Oi},{text:"Leave as is",title:"Keep the JSON embedded in the value",onClick:Hi}]);_l(ei,{type:"info",get message(){return c(vt)},get actions(){return c(Bi)}})};zA(ea,ei=>{c(Ot)&&ei(Ao)});var ta=kA(ea,2),wn=ei=>{var vt=at(()=>[{icon:O0,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:Tt},{text:"Leave as is",title:"Keep the pasted array",onClick:en}]);_l(ei,{type:"info",message:"Multiline text was pasted as array",get actions(){return c(vt)}})};zA(ta,ei=>{c(He)&&ei(wn)});var Jt=kA(ta,2),sn=ei=>{var vt=at(()=>Q()?[]:[{icon:Km,text:"Ok",title:"Accept the repaired document",onClick:Ut},{icon:l4,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:$n}]);_l(ei,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return c(vt)},onClose:Rt})};zA(Jt,ei=>{c(pe)&&ei(sn)}),f_(kA(Jt,2),{get validationErrors(){return c(GA)},selectError:nA}),sA(Wt,Ui)};zA(be,Wt=>{c(pA)===void 0?Wt(Se):Wt(st,!1)}),we("paste",Te,pn),sA($,fA)},Pe=$=>{sA($,qBA())};zA(re,$=>{n?$(Pe,!1):$(Qe)}),Ho(q,$=>N(C,$),()=>c(C));var Le=kA(q,2),Ue=$=>{Pq($,{onClose:()=>N(EA,!1)})};zA(Le,$=>{c(EA)&&$(Ue)});var li=kA(Le,2),Pn=$=>{jq($,K2(()=>c(XA),{onClose:()=>{var fA;(fA=c(XA))===null||fA===void 0||fA.onClose(),N(XA,void 0)}}))};return zA(li,$=>{c(XA)&&$(Pn)}),_e(()=>_=oi(q,1,"jse-tree-mode svelte-10mlrw4",null,_,{"no-main-menu":!S()})),we("keydown",q,function($){var fA=hC($),ZA=$.shiftKey;if(t("keydown",{combo:fA,key:$.key}),fA==="Ctrl+X"&&($.preventDefault(),U(!0)),fA==="Ctrl+Shift+X"&&($.preventDefault(),U(!1)),fA==="Ctrl+C"&&($.preventDefault(),ui(!0)),fA==="Ctrl+Shift+C"&&($.preventDefault(),ui(!1)),fA==="Ctrl+D"&&($.preventDefault(),yo()),fA!=="Delete"&&fA!=="Backspace"||($.preventDefault(),$o()),fA==="Insert"&&($.preventDefault(),Aa("structure")),fA==="Ctrl+A"&&($.preventDefault(),N(DA,Pi([]))),fA==="Ctrl+Q"&&ji($),fA==="ArrowUp"||fA==="Shift+ArrowUp"){$.preventDefault();var Te=c(DA)?wP(c(pA),c(YA),c(DA),ZA)||c(DA):nE(c(pA),c(YA));N(DA,Te),Go(dt(Te))}if(fA==="ArrowDown"||fA==="Shift+ArrowDown"){$.preventDefault();var be=c(DA)?(function(tn,uo,Ai){var ea=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(Ai){var Ao=ea?dt(Ai):T2(tn,Ai),ta=ra(Ze(tn,Ao))?uP(tn,uo,Ao,!0):uo,wn=nk(tn,uo,Ao),Jt=nk(tn,ta,Ao);if(ea)return ja(Ai)?wn!==void 0?ds(wn,wn):void 0:il(Ai)?Jt!==void 0?ds(Jt,Jt):void 0:Jt!==void 0?ds(kI(Ai),Jt):void 0;if(il(Ai))return Jt!==void 0?Pi(Jt):void 0;if(ja(Ai)||hn(Ai))return wn!==void 0?Pi(wn):void 0;if(er(Ai)){if(wn===void 0||wn.length===0)return;var sn=Vi(wn),ei=Ze(tn,sn);return Array.isArray(ei)?Pi(wn):QC(wn)}return Io(Ai)?Jt!==void 0?Pi(Jt):wn!==void 0?Pi(wn):void 0:void 0}})(c(pA),c(YA),c(DA),ZA)||c(DA):nE(c(pA),c(YA));N(DA,be),Go(dt(be))}if(fA==="ArrowLeft"||fA==="Shift+ArrowLeft"){$.preventDefault();var Se=c(DA)?(function(tn,uo,Ai){var ea=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Ao=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if(Ai){var{caret:ta,previous:wn}=DP(tn,uo,Ai,Ao);if(ea)return Io(Ai)?void 0:ds(Ai.path,Ai.path);if(ta&&wn)return Rk(wn);var Jt=Vi(dt(Ai)),sn=Ze(tn,Jt);return hn(Ai)&&Array.isArray(sn)?ds(Ai.path,Ai.path):Io(Ai)&&!Array.isArray(sn)?QC(Ai.focusPath):void 0}})(c(pA),c(YA),c(DA),ZA,!Q())||c(DA):nE(c(pA),c(YA));N(DA,Se),Go(dt(Se))}if(fA==="ArrowRight"||fA==="Shift+ArrowRight"){$.preventDefault();var st=c(DA)&&c(pA)!==void 0?(function(tn,uo,Ai){var ea=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Ao=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if(Ai){var{caret:ta,next:wn}=DP(tn,uo,Ai,Ao);return ea?Io(Ai)?void 0:ds(Ai.path,Ai.path):ta&&wn?Rk(wn):Io(Ai)?Pi(Ai.focusPath):void 0}})(c(pA),c(YA),c(DA),ZA,!Q())||c(DA):nE(c(pA),c(YA));N(DA,st),Go(dt(st))}if(fA==="Enter"&&c(DA)){if(kw(c(DA))){var Wt=c(DA).focusPath,Ui=Ze(c(pA),Vi(Wt));Array.isArray(Ui)&&($.preventDefault(),N(DA,Pi(Wt)))}er(c(DA))&&($.preventDefault(),N(DA,ke(ke({},c(DA)),{},{edit:!0}))),hn(c(DA))&&($.preventDefault(),ra(Ze(c(pA),c(DA).path))?FA(c(DA).path,!0):N(DA,ke(ke({},c(DA)),{},{edit:!0})))}if(fA.replace(/^Shift\+/,"").length===1&&c(DA))return $.preventDefault(),void In($.key);if(fA==="Enter"&&(il(c(DA))||ja(c(DA))))return $.preventDefault(),void In("");if(fA==="Ctrl+Enter"&&hn(c(DA))){var Kn=Ze(c(pA),c(DA).path);Mw(Kn)&&window.open(String(Kn),"_blank")}fA==="Escape"&&c(DA)&&($.preventDefault(),N(DA,void 0)),fA==="Ctrl+F"&&($.preventDefault(),rt(!1)),fA==="Ctrl+H"&&($.preventDefault(),rt(!0)),fA==="Ctrl+Z"&&($.preventDefault(),Po()),fA==="Ctrl+Shift+Z"&&($.preventDefault(),wa())}),we("mousedown",q,function($){t("handleMouseDown",$);var fA=$.target;Cq(fA,"BUTTON")||fA.isContentEditable||(Rt(),c(DA)||c(pA)!==void 0||c(Ae)!==""&&c(Ae)!==void 0||(t("createDefaultSelection"),N(DA,Pi([]))))}),we("contextmenu",q,ji),sA(i,V),qt(e,"expand",UA),qt(e,"collapse",de),qt(e,"validate",ze),qt(e,"getJson",Ye),qt(e,"patch",Ki),qt(e,"acceptAutoRepair",Ut),qt(e,"openTransformModal",bo),qt(e,"scrollTo",Ji),qt(e,"findElement",Gn),qt(e,"findSearchResult",Qo),qt(e,"focus",Rt),Lt(R)}function sV(i){return typeof(e=i)!="object"||e===null?i:new Proxy(i,{get:(A,t,n)=>sV(Reflect.get(A,t,n)),set:()=>!1,deleteProperty:()=>!1});var e}var P8=tr("jsoneditor:History");function lV(){var i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=i.maxItems||1e3,A=[],t=0;function n(){return t0}function a(){return{canUndo:n(),canRedo:o(),items:()=>A.slice().reverse(),add:s,undo:g,redo:C,clear:l}}function r(){i.onChange&&i.onChange(a())}function s(I){P8("add",I),A=[I].concat(A.slice(t)).slice(0,e),t=0,r()}function l(){P8("clear"),A=[],t=0,r()}function g(){if(n()){var I=A[t];return t+=1,P8("undo",I),r(),I}}function C(){if(o())return P8("redo",A[t-=1]),r(),A[t]}return{get:a}}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-transform-modal-inner.svelte-lta8xm { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; + min-height: 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) { + color: inherit; + flex: 1; + display: flex; + flex-direction: column; + padding: 0; + overflow: auto; + min-width: 0; + min-height: 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding-top: var(--jse-padding, 10px); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) { + flex: 1; + display: flex; + gap: calc(2 * var(--jse-padding, 10px)); + min-height: 0; + box-sizing: border-box; + padding: 0 calc(2 * var(--jse-padding, 10px)) var(--jse-padding, 10px); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) { + flex: 1; + display: flex; + flex-direction: column; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p { + margin: var(--jse-padding, 10px) 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p:first-child { + margin-top: 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p:last-child { + margin-bottom: 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) code { + background: var(--jse-modal-code-background, rgba(0, 0, 0, 0.05)); + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .query-error:where(.svelte-lta8xm) { + color: var(--jse-error-color, #ee5341); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) textarea.jse-query:where(.svelte-lta8xm) { + flex: 1; + outline: none; + resize: vertical; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) { + flex: 1; + display: flex; + flex-direction: column; + gap: calc(2 * var(--jse-padding, 10px)); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data:where(.svelte-lta8xm) { + flex: 1; + display: flex; + flex-direction: column; + min-height: 0; + box-sizing: border-box; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data.jse-hide:where(.svelte-lta8xm) { + flex: none; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-preview-data:where(.svelte-lta8xm) { + flex: 1; + display: flex; + flex-direction: column; + min-height: 0; + box-sizing: border-box; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents.jse-hide-original-data:where(.svelte-lta8xm) { + flex-direction: column; + gap: 0; + margin-bottom: 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) { + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)) calc(2 * var(--jse-padding, 10px)); +} +@media screen and (max-width: 1200px) { + .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) { + flex-direction: column; + overflow: auto; + } + .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) textarea.jse-query:where(.svelte-lta8xm) { + min-height: 150px; + flex: none; + } + .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-tree-mode { + height: 300px; + flex: none; + } + .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data:where(.svelte-lta8xm), + .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-preview-data:where(.svelte-lta8xm) { + flex: unset; + } +} +.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) { + font-weight: bold; + display: block; + box-sizing: border-box; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) .jse-label-inner:where(.svelte-lta8xm) { + margin-top: calc(2 * var(--jse-padding, 10px)); + margin-bottom: calc(0.5 * var(--jse-padding, 10px)); + box-sizing: border-box; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) .jse-label-inner:where(.svelte-lta8xm) button:where(.svelte-lta8xm) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + font-weight: bold; + padding: 0; +} +.jse-transform-modal-inner.svelte-lta8xm .jse-tree-mode { + flex: 1; + background: var(--jse-input-background-readonly, transparent); + box-shadow: none; + box-sizing: border-box; + --jse-main-border: var(--jse-input-border, 1px solid #d8dbdf); +} +.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm), +.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm) { + border: var(--jse-input-border, 1px solid #d8dbdf); + outline: none; + box-sizing: border-box; + padding: calc(0.5 * var(--jse-padding, 10px)); + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: inherit; + background: var(--jse-input-background, var(--jse-background-color, #fff)); +} +.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm):focus, +.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm):focus { + border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); +} +.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm):read-only, +.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm):read-only { + background: var(--jse-input-background-readonly, transparent); +} +.jse-transform-modal-inner.svelte-lta8xm .jse-preview.jse-error:where(.svelte-lta8xm) { + flex: 1; + background: var(--jse-input-background-readonly, transparent); + border: var(--jse-input-border, 1px solid #d8dbdf); + color: var(--jse-error-color, #ee5341); + padding: calc(0.5 * var(--jse-padding, 10px)); +} +.jse-transform-modal-inner.svelte-lta8xm a { + color: var(--jse-a-color, #156fc5); +} +.jse-transform-modal-inner.svelte-lta8xm a:hover { + color: var(--jse-a-color-highlight, #0f508d); +}`);var su=bw(()=>iIA),aE=bw(()=>nIA),WBA=TA('
          '),ZBA=TA(" ",1),XBA=TA('
          '),$BA=TA('
          Language
          Path
          Query
          Preview
          ',1),AEA=TA('
          ');function eEA(i,e){var A,t,n;Ft(e,!1);var o=tr("jsoneditor:TransformModal"),a=L(e,"id",25,()=>"transform-modal-"+CE()),r=L(e,"json",9),s=L(e,"rootPath",25,()=>[]),l=L(e,"indentation",9),g=L(e,"truncateTextSize",9),C=L(e,"escapeControlCharacters",9),I=L(e,"escapeUnicodeCharacters",9),B=L(e,"parser",9),Q=L(e,"parseMemoizeOne",9),h=L(e,"validationParser",9),f=L(e,"pathParser",9),m=L(e,"queryLanguages",9),v=L(e,"queryLanguageId",13),S=L(e,"onChangeQueryLanguage",9),k=L(e,"onRenderValue",9),M=L(e,"onRenderMenu",9),x=L(e,"onRenderContextMenu",9),F=L(e,"onClassName",9),z=L(e,"onTransform",9),P=L(e,"onClose",9),Z=cA(void 0,!0),AA=cA(lV({onChange:YA=>N(AA,YA)}).get(),!0),W=cA(void 0,!0),CA=cA(void 0,!0),wA=cA(!1,!0),BA="".concat(a(),":").concat(bt(s())),QA=(A=su()[BA])!==null&&A!==void 0?A:{},RA=cA(aE().showWizard!==!1,!0),IA=cA(aE().showOriginal!==!1,!0),dA=cA((t=QA.queryOptions)!==null&&t!==void 0?t:{},!0),_A=cA(v()===QA.queryLanguageId&&QA.query?QA.query:"",!0),VA=cA((n=QA.isManual)!==null&&n!==void 0&&n,!0),he=cA(void 0,!0),HA=cA(void 0,!0),vA=cA({text:""},!0);function PA(YA){var DA;return(DA=m().find(Kt=>Kt.id===YA))!==null&&DA!==void 0?DA:m()[0]}function et(YA){try{N(dA,YA),N(_A,PA(v()).createQuery(c(W),YA)),N(he,void 0),N(VA,!1),o("updateQueryByWizard",{queryOptions:c(dA),query:c(_A),isManual:c(VA)})}catch(DA){N(he,String(DA))}}function We(YA){N(_A,YA.target.value),N(VA,!0),o("handleChangeQuery",{query:c(_A),isManual:c(VA)})}c(VA)||et(c(dA)),Vr(()=>{var YA;(YA=c(Z))===null||YA===void 0||YA.focus()});var OA=mh(function(YA,DA){if(YA===void 0)return N(vA,{text:""}),void N(HA,"Error: No JSON");if(DA.trim()!=="")try{o("previewTransform",{query:DA});var Kt=PA(v()).executeQuery(YA,DA,B());N(vA,{json:Kt}),N(HA,void 0)}catch(pt){N(vA,{text:""}),N(HA,String(pt))}else N(vA,{json:YA})},300);function EA(){if(c(W)===void 0)return N(vA,{text:""}),void N(HA,"Error: No JSON");try{o("handleTransform",{query:c(_A)});var YA=PA(v()).executeQuery(c(W),c(_A),B());z()([{op:"replace",path:bt(s()),value:YA}]),P()()}catch(DA){console.error(DA),N(vA,{text:""}),N(HA,String(DA))}}function XA(){N(RA,!c(RA)),aE(aE().showWizard=c(RA))}function pA(){N(IA,!c(IA)),aE(aE().showOriginal=c(IA))}function Ae(YA){YA.focus()}function NA(YA){o("handleChangeQueryLanguage",YA),v(YA),S()(YA),et(c(dA))}function Ne(){c(wA)?N(wA,!c(wA)):P()()}KA(()=>(J(r()),J(s())),()=>{N(W,sV(Ze(r(),s())))}),KA(()=>c(W),()=>{N(CA,c(W)?{json:c(W)}:{text:""})}),KA(()=>(c(W),c(_A)),()=>{OA(c(W),c(_A))}),KA(()=>(su(),c(dA),c(_A),J(v()),c(VA)),()=>{su(su()[BA]={queryOptions:c(dA),query:c(_A),queryLanguageId:v(),isManual:c(VA)}),o("store state in memory",BA,su()[BA])}),Ln(),ai(!0),bu(i,{get onClose(){return P()},className:"jse-transform-modal",get fullscreen(){return c(wA)},children:(YA,DA)=>{var Kt=AEA();Mk(gA(Kt),{children:(pt,ue)=>{var Ot=$BA(),He=it(Ot);(function(U,Bt){Ft(Bt,!1);var ui,un=L(Bt,"queryLanguages",9),pn=L(Bt,"queryLanguageId",9),Xn=L(Bt,"fullscreen",13),zo=L(Bt,"onChangeQueryLanguage",9),Eo=L(Bt,"onClose",9),Lo=cA(void 0,!0),{openAbsolutePopup:$o,closeAbsolutePopup:yo}=H2("absolute-popup");function da(){var Aa={queryLanguages:un(),queryLanguageId:pn(),onChangeQueryLanguage:sa=>{yo(ui),zo()(sa)}};ui=$o($IA,Aa,{offsetTop:-2,offsetLeft:0,anchor:c(Lo),closeOnOuterClick:!0})}ai(!0),pw(U,{title:"Transform",fullScreenButton:!0,get onClose(){return Eo()},get fullscreen(){return Xn()},set fullscreen(Aa){Xn(Aa)},$$slots:{actions:(Aa,sa)=>{var vo,ge=tdA();on(gA(ge),{get data(){return FT}}),Ho(ge,wi=>N(Lo,wi),()=>c(Lo)),_e(()=>vo=oi(ge,1,"jse-config svelte-5gkegr",null,vo,{hide:un().length<=1})),we("click",ge,da),sA(Aa,ge)}},$$legacy:!0}),Lt()})(He,{get queryLanguages(){return m()},get queryLanguageId(){return v()},onChangeQueryLanguage:NA,get onClose(){return P()},get fullscreen(){return c(wA)},set fullscreen(U){N(wA,U)},$$legacy:!0});var je=gA(kA(He,2)),ft=gA(je),Fe=kA(gA(ft),2);Vj(gA(Fe),()=>(J(v()),uA(()=>PA(v()).description)));var ri=kA(Fe,4),j=kA(ri,2),X=gA(j),tA=gA(X),nA=gA(tA),UA=at(()=>c(RA)?qc:uB);on(nA,{get data(){return c(UA)}});var de=kA(j,2),pe=U=>{var Bt=Gi(),ui=it(Bt),un=Xn=>{var zo=ZBA(),Eo=it(zo);WIA(Eo,{get queryOptions(){return c(dA)},get json(){return c(W)},onChange:et});var Lo=kA(Eo,2),$o=yo=>{var da=WBA(),Aa=gA(da);_e(()=>Gt(Aa,c(he))),sA(yo,da)};zA(Lo,yo=>{c(he)&&yo($o)}),sA(Xn,zo)},pn=Xn=>{sA(Xn,cr("(Only available for arrays, not for objects)"))};zA(ui,Xn=>{c(W),uA(()=>Array.isArray(c(W)))?Xn(un):Xn(pn,!1)}),sA(U,Bt)};zA(de,U=>{c(RA)&&U(pe)});var GA=kA(de,4);Ho(GA,U=>N(Z,U),()=>c(Z));var JA,Qt,nt=kA(ft,2),ze=gA(nt),Ye=gA(ze),di=gA(Ye),Cn=gA(di),Qn=gA(Cn),Je=at(()=>c(IA)?qc:uB);on(Qn,{get data(){return c(Je)}});var an=kA(Ye,2),ki=U=>{jk(U,{get externalContent(){return c(CA)},externalSelection:void 0,get history(){return c(AA)},readOnly:!0,get truncateTextSize(){return g()},mainMenuBar:!1,navigationBar:!1,get indentation(){return l()},get escapeControlCharacters(){return C()},get escapeUnicodeCharacters(){return I()},get parser(){return B()},get parseMemoizeOne(){return Q()},get onRenderValue(){return k()},get onRenderMenu(){return M()},get onRenderContextMenu(){return x()},onError:uA(()=>console.error),get onChange(){return va},get onChangeMode(){return va},get onSelect(){return va},get onUndo(){return va},get onRedo(){return va},get onFocus(){return va},get onBlur(){return va},get onSortModal(){return va},get onTransformModal(){return va},get onJSONEditorModal(){return va},get onClassName(){return F()},validator:void 0,get validationParser(){return h()},get pathParser(){return f()}})};zA(an,U=>{c(IA)&&U(ki)});var Ki=kA(ze,2),An=kA(gA(Ki),2),Mt=U=>{jk(U,{get externalContent(){return c(vA)},externalSelection:void 0,get history(){return c(AA)},readOnly:!0,get truncateTextSize(){return g()},mainMenuBar:!1,navigationBar:!1,get indentation(){return l()},get escapeControlCharacters(){return C()},get escapeUnicodeCharacters(){return I()},get parser(){return B()},get parseMemoizeOne(){return Q()},get onRenderValue(){return k()},get onRenderMenu(){return M()},get onRenderContextMenu(){return x()},onError:uA(()=>console.error),get onChange(){return va},get onChangeMode(){return va},get onSelect(){return va},get onUndo(){return va},get onRedo(){return va},get onFocus(){return va},get onBlur(){return va},get onSortModal(){return va},get onTransformModal(){return va},get onJSONEditorModal(){return va},get onClassName(){return F()},validator:void 0,get validationParser(){return h()},get pathParser(){return f()}})},rn=U=>{var Bt=XBA(),ui=gA(Bt);_e(()=>Gt(ui,c(HA))),sA(U,Bt)};zA(An,U=>{c(HA)?U(rn,!1):U(Mt)});var Ut=gA(kA(je,2));Mr(()=>we("click",Ut,EA)),Es(Ut,U=>Ae?.(U)),_e(U=>{GI(ri,U),GI(GA,c(_A)),JA=oi(nt,1,"jse-data-contents svelte-lta8xm",null,JA,{"jse-hide-original-data":!c(IA)}),Qt=oi(ze,1,"jse-original-data svelte-lta8xm",null,Qt,{"jse-hide":!c(IA)}),Ut.disabled=!!c(HA)},[()=>(J(zi),J(s()),J(nl),uA(()=>zi(s())?"(document root)":nl(s())))]),we("click",tA,XA),we("input",GA,We),we("click",Cn,pA),sA(pt,Ot)},$$slots:{default:!0}}),Es(Kt,(pt,ue)=>fw?.(pt,ue),()=>Ne),sA(YA,Kt)},$$slots:{default:!0}}),Lt()}function rg(){}var tEA=0,gr=class{constructor(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.id=tEA++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=Su.match(e)),A=>{var t=e(A);return t===void 0?null:[this,t]}}};gr.closedBy=new gr({deserialize:i=>i.split(" ")}),gr.openedBy=new gr({deserialize:i=>i.split(" ")}),gr.group=new gr({deserialize:i=>i.split(" ")}),gr.isolate=new gr({deserialize:i=>{if(i&&i!="rtl"&&i!="ltr"&&i!="auto")throw new RangeError("Invalid value for isolate: "+i);return i||"auto"}}),gr.contextHash=new gr({perNode:!0}),gr.lookAhead=new gr({perNode:!0}),gr.mounted=new gr({perNode:!0});var VP,iEA=Object.create(null),Su=class i{constructor(e,A,t){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;this.name=e,this.props=A,this.id=t,this.flags=n}static define(e){var A=e.props&&e.props.length?Object.create(null):iEA,t=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new i(e.name||"",A,e.id,t);if(e.props){for(var o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;var A=this.prop(gr.group);return!!A&&A.indexOf(e)>-1}return this.id==e}static match(e){var A=Object.create(null);for(var t in e)for(var n of t.split(" "))A[n]=e[t];return o=>{for(var a=o.prop(gr.group),r=-1;r<(a?a.length:0);r++){var s=A[r<0?o.name:a[r]];if(s)return s}}}};Su.none=new Su("",Object.create(null),0,8),(function(i){i[i.ExcludeBuffers=1]="ExcludeBuffers",i[i.IncludeAnonymous=2]="IncludeAnonymous",i[i.IgnoreMounts=4]="IgnoreMounts",i[i.IgnoreOverlays=8]="IgnoreOverlays"})(VP||(VP={})),new gr({perNode:!0});Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-status-bar.svelte-1pmgv9j { + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-color-readonly, #b2b2b2); + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + margin: 0; + border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); + display: flex; + gap: var(--jse-padding, 10px); +} +.jse-status-bar.svelte-1pmgv9j:last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-status-bar.svelte-1pmgv9j .jse-status-bar-info:where(.svelte-1pmgv9j) { + padding: 2px; +}`);var nEA=TA('
          '),oEA=TA('
          '),aEA=TA('
          '),rEA=TA('
          '),w_=PB.define([{tag:Ke.propertyName,color:"var(--internal-key-color)"},{tag:Ke.number,color:"var(--internal-value-color-number)"},{tag:Ke.bool,color:"var(--internal-value-color-boolean)"},{tag:Ke.string,color:"var(--internal-value-color-string)"},{tag:Ke.keyword,color:"var(--internal-value-color-null)"}]),sEA=q9(w_),lEA=w_.style;w_.style=i=>lEA(i||[]);var gEA=[No.fromClass(class{constructor(i){this.view=i,this.indentUnit=Xg(i.state),this.initialPaddingLeft=null,this.isChrome=window?.navigator.userAgent.includes("Chrome"),this.generate(i.state)}update(i){var e=Xg(i.state);(e!==this.indentUnit||i.docChanged||i.viewportChanged)&&(this.indentUnit=e,this.generate(i.state))}generate(i){var e=new Yr;this.initialPaddingLeft?this.addStyleToBuilder(e,i,this.initialPaddingLeft):this.view.requestMeasure({read:A=>{var t=A.contentDOM.querySelector(".cm-line");t&&(this.initialPaddingLeft=window.getComputedStyle(t).getPropertyValue("padding-left"),this.addStyleToBuilder(e,A.state,this.initialPaddingLeft)),this.decorations=e.finish()}}),this.decorations=e.finish()}addStyleToBuilder(i,e,A){var t=this.getVisibleLines(e);for(var n of t){var{numColumns:o,containsTab:a}=this.numColumns(n.text,e.tabSize),r="calc(".concat(o+this.indentUnit,"ch + ").concat(A,")"),s=this.isChrome?"calc(-".concat(o+this.indentUnit,"ch - ").concat(a?1:0,"px)"):"-".concat(o+this.indentUnit,"ch");i.add(n.from,n.from,kt.line({attributes:{style:"padding-left: ".concat(r,"; text-indent: ").concat(s,";")}}))}}getVisibleLines(i){var e=new Set,A=null;for(var{from:t,to:n}of this.view.visibleRanges)for(var o=t;o<=n;){var a=i.doc.lineAt(o);A!==a&&(e.add(a),A=a),o=a.to+1}return e}numColumns(i,e){var A=0,t=!1;A:for(var n=0;ni.decorations})];Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-text-mode.svelte-k2b9e6 { + --internal-key-color: var(--jse-key-color, #1a1a1a); + --internal-value-color-number: var(--jse-value-color-number, #ee422e); + --internal-value-color-boolean: var(--jse-value-color-boolean, #ff8c00); + --internal-value-color-string: var(--jse-value-color-string, #008000); + --internal-value-color-null: var(--jse-value-color-null, #004ed0); + flex: 1; + box-sizing: border-box; + display: flex; + flex-direction: column; + background: var(--jse-background-color, #fff); +} +.jse-text-mode.no-main-menu.svelte-k2b9e6 { + border-top: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) { + flex: 1; + display: flex; + position: relative; + flex-direction: column; + overflow: hidden; + min-width: 0; + min-height: 0; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6):last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents.jse-hidden:where(.svelte-k2b9e6) { + visibility: hidden; + position: absolute; + top: 0; + left: 0; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor { + flex: 1; + overflow: hidden; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-scroller { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + line-height: var(--jse-line-height, calc(1em + 4px)); + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-gutters { + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-color-readonly, #b2b2b2); + border-right: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-activeLine, +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-activeLineGutter { + background: var(--jse-active-line-background-color, rgba(0, 0, 0, 0.06)); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-selectionBackground { + background: var(--jse-selection-background-color, #d3d3d3); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-searchMatch { + background-color: var(--jse-search-match-color, #ffe665); + outline: var(--jse-search-match-outline, none); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-searchMatch.cm-searchMatch-selected { + background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); + outline: var(--jse-search-match-outline, 2px solid #e0be00); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-selectionMatch { + background-color: var(--jse-search-match-background-color, rgba(153, 255, 119, 0.5019607843)); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-foldPlaceholder { + background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); + border: none; + padding: 0 var(--jse-padding, 10px); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-tooltip { + font-size: var(--jse-font-size, 16px); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + color: var(--jse-tooltip-color, var(--jse-text-color, #4d4d4d)); + background: var(--jse-tooltip-background, var(--jse-modal-background, #f5f5f5)); + border: var(--jse-tooltip-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-diagnosticAction { + background: var(--jse-tooltip-action-button-color, var(--jse-text-color-inverse, #fff)); + background: var(--jse-tooltip-action-button-background, #4d4d4d); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-panels { + border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search { + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search input { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size-text-mode-search, 80%); + color: var(--jse-input-color, var(--jse-text-color, #4d4d4d)); + border: var(--jse-input-border, 1px solid #d8dbdf); + background: var(--jse-input-background, var(--jse-background-color, #fff)); + margin-right: 2px; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size-text-mode-search, 80%); + color: var(--jse-panel-button-color, inherit); + background: var(--jse-panel-button-background, transparent); + border: none; + cursor: pointer; + text-transform: capitalize; + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); + margin: 0; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button:hover { + color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); + background: var(--jse-panel-button-background-highlight, #e0e0e0); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search label { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size-text-mode-search, 80%); + padding-left: var(--jse-padding, 10px); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search label input { + margin-right: 2px; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button[name='close'] { + width: 32px; + height: 32px; + font-size: 24px; + line-height: 24px; + padding: 0; + right: 0; + top: -4px; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-cursor-primary { + border-color: var(--jse-text-color, #4d4d4d); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .jse-loading-space:where(.svelte-k2b9e6) { + flex: 1; +} +.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .jse-loading:where(.svelte-k2b9e6) { + flex: 2; + text-align: center; + color: var(--jse-panel-color-readonly, #b2b2b2); + box-sizing: border-box; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +} +.jse-text-mode.svelte-k2b9e6 .jse-contents.jse-preview:where(.svelte-k2b9e6) { + flex: 1; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-panel-color-readonly, #b2b2b2); + overflow: auto; + white-space: pre-wrap; + word-break: break-word; + padding: 2px; +} +.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + background: var(--jse-background-color, #fff); + border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); + border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-tip:where(.svelte-k2b9e6) { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-panel-color-readonly, #b2b2b2); +} +.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-progress-track:where(.svelte-k2b9e6) { + flex: 1; + height: 6px; + background: var(--jse-panel-background, #ebebeb); + border-radius: 3px; + overflow: hidden; + border: 1px solid var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-progress-fill:where(.svelte-k2b9e6) { + height: 100%; + background: linear-gradient(90deg, var(--jse-theme-color, #3883fa), var(--jse-theme-color-highlight, #5f9dff)); + border-radius: 2px; + transition: width 0.1s ease; + min-width: 2px; +} +.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-cancel-button:where(.svelte-k2b9e6) { + padding: 4px 12px; + font-size: 12px; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + background: var(--jse-theme-color, #3883fa); + color: #fff; + border-radius: 3px; + cursor: pointer; + transition: background-color 0.2s ease; + flex-shrink: 0; + border: 1px solid var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-cancel-button:where(.svelte-k2b9e6):hover { + background: var(--jse-theme-color-highlight, #5f9dff); + color: #fff; +}`);var cEA=TA('
          Collapsing
          '),CEA=TA('
          ',1),IEA=TA(" ",1),dEA=TA("
          ",1),BEA=TA('
          loading...
          '),EEA=TA("
          ");function hEA(i,e){Ft(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=L(e,"readOnly",9),o=L(e,"mainMenuBar",9),a=L(e,"statusBar",9),r=L(e,"askToFormat",9),s=L(e,"externalContent",9),l=L(e,"externalSelection",9),g=L(e,"history",9),C=L(e,"indentation",9),I=L(e,"tabSize",9),B=L(e,"escapeUnicodeCharacters",9),Q=L(e,"parser",9),h=L(e,"validator",9),f=L(e,"validationParser",9),m=L(e,"onChange",9),v=L(e,"onChangeMode",9),S=L(e,"onSelect",9),k=L(e,"onUndo",9),M=L(e,"onRedo",9),x=L(e,"onError",9),F=L(e,"onFocus",9),z=L(e,"onBlur",9),P=L(e,"onRenderMenu",9),Z=L(e,"onSortModal",9),AA=L(e,"onTransformModal",9),W=tr("jsoneditor:TextMode"),CA={key:"Mod-i",run:pe,shift:GA,preventDefault:!0},wA=typeof window>"u";W("isSSR:",wA);var BA,QA=cA(void 0,!0),RA=cA(void 0,!0),IA=cA(void 0,!0),dA=cA(!1,!0),_A=cA(r(),!0),VA=cA([],!0),he=cA(!1,!0),HA=cA(0,!0),vA=cA(0,!0),PA=null,et=new Zc,We=new Zc,OA=new Zc,EA=new Zc,XA=new Zc,pA=s(),Ae=cA(bk(pA,C(),Q()),!0),NA=Vs.define(),Ne=null;function YA(){if(!Ne||Ne.length===0)return!1;var SA=Ne[0].startState,$A=Ne[Ne.length-1].state,ve=Ne.map(FA=>FA.changes).reduce((FA,le)=>FA.compose(le)),hA={type:"text",undo:{changes:ve.invert(SA.doc).toJSON(),selection:sa(SA.selection)},redo:{changes:ve.toJSON(),selection:sa($A.selection)}};return W("add history item",hA),g().add(hA),Ne=null,!0}var DA=cA(B(),!0);Vr(Pt(function*(){if(!wA)try{BA=(function(SA){var{target:$A,initialText:ve,readOnly:hA,indentation:FA}=SA;W("Create CodeMirror editor",{readOnly:hA,indentation:FA});var le=(function(rt,gt){return ak(rt)?rt.ranges.every(xt=>xt.anchor{N(IA,rt.state),rt.docChanged&&(rt.transactions.some(gt=>!!gt.annotation(NA))||(Ne=[...Ne??[],rt]),$o()),rt.selectionSet&&Aa()}),nz(),cz({top:!0}),Ii.lineWrapping,We.of(Pa.readOnly.of(hA)),EA.of(Pa.tabSize.of(I())),OA.of(Lo(FA)),XA.of(Ii.theme({},{dark:rn()}))]});return BA=new Ii({state:Ge,parent:$A}),le&&BA.dispatch(BA.state.update({selection:le.main,scrollIntoView:!0})),BA})({target:c(QA),initialText:vo(c(Ae),c(dA))?"":c(A).escapeValue(c(Ae)),readOnly:n(),indentation:C()})}catch(SA){console.error(SA)}})),Ig(()=>{yo(),BA&&(W("Destroy CodeMirror editor"),BA.destroy()),ri()});var Kt=C1(),pt=C1();function ue(){BA&&(W("focus"),BA.focus())}function Ot(SA,$A){if(BA)try{(function(){var ve=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],hA=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],FA=BA.state,le=FA.doc.length,Ge=J9(FA,le,1/0);if(Ge){var rt=[];if(ve.length===0)rt=ft(Ge,FA,void 0,hA);else{var{from:gt}=ZS(c(A).escapeValue(c(Ae)),ve);gt!==void 0&>!==0&&(rt=ft(Ge,FA,gt,hA))}rt.length>0&&(function(xt){Fe.apply(this,arguments)})(rt)}})(SA,$A)}catch(ve){x()(ve)}}function He(){return H9.of((SA,$A,ve)=>{var hA=J9(SA,SA.doc.length,1/0);if(!hA||hA.lengthve)){if(FA&&Ge.from<$A)break;var rt=Ge.type.prop(P4);if(rt&&(Ge.to=$A&>.to>ve&&(FA=gt)}}}return FA})}function je(SA){var $A=SA.lastChild;return $A&&$A.to==SA.to&&$A.type.isError}function ft(SA,$A,ve){var hA=!(arguments.length>3&&arguments[3]!==void 0)||arguments[3],FA=[],le=new Set;return SA.iterate({enter(Ge){if(ve===void 0||Ge.from>=ve){var rt=zB($A,Ge.from,Ge.to);if(rt){var gt="".concat(rt.from,"-").concat(rt.to);if(!le.has(gt))if(hA)FA.push({from:rt.from,to:rt.to}),le.add(gt);else{var xt=FA.some(zn=>zn.from<=rt.from&&zn.to>=rt.to);xt||(FA.push({from:rt.from,to:rt.to}),le.add(gt))}}}}}),FA}function Fe(){return Fe=Pt(function*(SA){if(SA.length!==0){var $A=SA.length>5e3;$A&&(N(he,!0),N(HA,0),N(vA,SA.length),PA=new AbortController);var ve=hA=>new Promise(FA=>{var le;$A&&(le=PA)!==null&&le!==void 0&&le.signal.aborted?FA():requestAnimationFrame(()=>{var Ge=Math.min(hA+100,SA.length),rt=SA.slice(hA,Ge);BA.dispatch({effects:rt.map(gt=>qB.of({from:gt.from,to:gt.to}))}),$A&&N(HA,Ge),Ge1&&arguments[1]!==void 0?arguments[1]:xk;if(BA)try{if(SA&&SA.length>0){var{from:ve}=ZS(c(A).escapeValue(c(Ae)),SA);ve!==void 0&&(BA.dispatch({selection:{anchor:ve,head:ve}}),z9(BA))}else P9(BA);$A?.(SA)}catch(hA){x()(hA)}}function X(){j([],()=>!0)}function tA(){Ot([],!0)}var nA=!1;function UA(SA){return de(SA,!1)}function de(SA,$A){W("handlePatch",SA,$A);var ve=Q().parse(c(Ae)),hA=Ps(ve,SA),FA=xm(ve,SA);return ui({text:Q().stringify(hA,null,C())},$A,!1),{json:hA,previousJson:ve,undo:FA,redo:SA}}function pe(){if(W("format"),n())return!1;try{var SA=Q().parse(c(Ae));return ui({text:Q().stringify(SA,null,C())},!0,!1),N(_A,r()),!0}catch($A){x()($A)}return!1}function GA(){if(W("compact"),n())return!1;try{var SA=Q().parse(c(Ae));return ui({text:Q().stringify(SA)},!0,!1),N(_A,!1),!0}catch($A){x()($A)}return!1}function JA(){if(W("repair"),!n())try{ui({text:Xl(c(Ae))},!0,!1),N(ge,ik),N(wi,void 0)}catch(SA){x()(SA)}}function Qt(){var SA;if(!n())try{var $A=Q().parse(c(Ae));nA=!0,Z()({id:Kt,json:$A,rootPath:[],onSort:(SA=Pt(function*(ve){var{operations:hA}=ve;W("onSort",hA),de(hA,!0)}),function(ve){return SA.apply(this,arguments)}),onClose:()=>{nA=!1,ue()}})}catch(ve){x()(ve)}}function nt(SA){var{id:$A,rootPath:ve,onTransform:hA,onClose:FA}=SA;try{var le=Q().parse(c(Ae));nA=!0,AA()({id:$A||pt,json:le,rootPath:ve||[],onTransform:Ge=>{hA?hA({operations:Ge,json:le,transformedJson:Ps(le,Ge)}):(W("onTransform",Ge),de(Ge,!0))},onClose:()=>{nA=!1,ue(),FA&&FA()}})}catch(Ge){x()(Ge)}}function ze(){n()||nt({rootPath:[]})}function Ye(){BA&&(c(QA)&&c(QA).querySelector(".cm-search")?p8(BA):u8(BA))}function di(){if(n())return!1;yo();var SA=g().undo();return W("undo",SA),hP(SA)?(BA.dispatch({annotations:NA.of("undo"),changes:Jr.fromJSON(SA.undo.changes),selection:Ce.fromJSON(SA.undo.selection),scrollIntoView:!0}),!0):(k()(SA),!1)}function Cn(){if(n())return!1;yo();var SA=g().redo();return W("redo",SA),hP(SA)?(BA.dispatch({annotations:NA.of("redo"),changes:Jr.fromJSON(SA.redo.changes),selection:Ce.fromJSON(SA.redo.selection),scrollIntoView:!0}),!0):(M()(SA),!1)}function Qn(){N(dA,!0),ui(s(),!0,!0)}function Je(){v()(ma.tree)}function an(){zo()}function ki(SA){W("select validation error",SA);var{from:$A,to:ve}=Ut(SA);$A!==void 0&&ve!==void 0&&(Ki($A,ve),ue())}function Ki(SA,$A){W("setSelection",{anchor:SA,head:$A}),BA&&BA.dispatch(BA.state.update({selection:{anchor:SA,head:$A},scrollIntoView:!0}))}function An(SA,$A){if($A.state.selection.ranges.length===1){var ve=$A.state.selection.ranges[0],hA=c(Ae).slice(ve.from,ve.to);if(hA==="{"||hA==="["){var FA=qk.default.parse(c(Ae)),le=Object.keys(FA.pointers).find(rt=>{var gt;return((gt=FA.pointers[rt].value)===null||gt===void 0?void 0:gt.pos)===ve.from}),Ge=FA.pointers[le];le&&Ge&&Ge.value&&Ge.valueEnd&&(W("pointer found, selecting inner contents of path:",le,Ge),Ki(Ge.value.pos+1,Ge.valueEnd.pos-1))}}}function Mt(){return HH(In,{delay:300})}function rn(){return!!c(QA)&&getComputedStyle(c(QA)).getPropertyValue("--jse-theme").includes("dark")}function Ut(SA){var{path:$A,message:ve,severity:hA}=SA,{line:FA,column:le,from:Ge,to:rt}=ZS(c(A).escapeValue(c(Ae)),$A);return{path:$A,line:FA,column:le,from:Ge,to:rt,message:ve,severity:hA,actions:[]}}function U(SA,$A){var{line:ve,column:hA,position:FA,message:le}=SA;return{path:[],line:ve,column:hA,from:FA,to:FA,severity:ic.error,message:le,actions:$A&&!n()?[{name:"Auto repair",apply:()=>JA()}]:void 0}}function Bt(SA){return{from:SA.from||0,to:SA.to||0,message:SA.message||"",actions:SA.actions,severity:SA.severity}}function ui(SA,$A,ve){var hA=bk(SA,C(),Q()),FA=!_i(SA,pA),le=pA;W("setCodeMirrorContent",{isChanged:FA,emitChange:$A,forceUpdate:ve}),BA&&(FA||ve)&&(pA=SA,N(Ae,hA),vo(c(Ae),c(dA))||BA.dispatch({changes:{from:0,to:BA.state.doc.length,insert:c(A).escapeValue(c(Ae))}}),YA(),FA&&$A&&da(pA,le))}function un(SA){return ak(SA)?Ce.fromJSON(SA):void 0}function pn(){return Xn.apply(this,arguments)}function Xn(){return Xn=Pt(function*(){W("refresh"),yield(function(){return Eo.apply(this,arguments)})()}),Xn.apply(this,arguments)}function zo(){if(BA){var SA=BA?c(A).unescapeValue(BA.state.doc.toString()):"",$A=SA!==c(Ae);if(W("onChangeCodeMirrorValue",{isChanged:$A}),$A){var ve=pA;N(Ae,SA),pA={text:c(Ae)},YA(),da(pA,ve),Fo(),Aa()}}}function Eo(){return(Eo=Pt(function*(){if(Fo(),BA){var SA=rn();return W("updateTheme",{dark:SA}),BA.dispatch({effects:[XA.reconfigure(Ii.theme({},{dark:SA}))]}),new Promise($A=>setTimeout($A))}return Promise.resolve()})).apply(this,arguments)}function Lo(SA){var $A=dI.of(typeof SA=="number"?" ".repeat(SA):SA);return SA===" "?[$A]:[$A,gEA]}p_({onMount:Vr,onDestroy:Ig,getWindow:()=>Gu(c(RA)),hasFocus:()=>nA&&document.hasFocus()||o_(c(RA)),onFocus:F(),onBlur:()=>{yo(),z()()}});var $o=mh(zo,300);function yo(){$o.flush()}function da(SA,$A){m()&&m()(SA,$A,{contentErrors:fn(),patchResult:void 0})}function Aa(){S()(sa(c(IA).selection))}function sa(SA){return ke({type:ro.text},SA.toJSON())}function vo(SA,$A){return!!SA&&SA.length>ek&&!$A}var ge=cA(ik,!0),wi=cA(void 0,!0);function In(){if(vo(c(Ae),c(dA)))return[];var SA=fn();if(EP(SA)){var{parseError:$A,isRepairable:ve}=SA;return[Bt(U($A,ve))]}return G1A(SA)?SA.validationErrors.map(Ut).map(Bt):[]}function fn(){W("validate:start"),yo();var SA=Po(c(A).escapeValue(c(Ae)),h(),Q(),f());return EP(SA)?(N(ge,SA.isRepairable?cP:"invalid"),N(wi,SA.parseError),N(VA,[])):(N(ge,ik),N(wi,void 0),N(VA,SA?.validationErrors||[])),W("validate:end"),SA}var Po=pB(odA);function wa(){c(wi)&&(function(SA){W("select parse error",SA);var $A=U(SA,!1);Ki($A.from!=null?$A.from:0,$A.to!=null?$A.to:0),ue()})(c(wi))}var Ri={icon:ST,text:"Show me",title:"Move to the parse error location",onClick:wa};KA(()=>J(B()),()=>{N(A,i_({escapeControlCharacters:!1,escapeUnicodeCharacters:B()}))}),KA(()=>J(s()),()=>{ui(s(),!1,!1)}),KA(()=>J(l()),()=>{(function(SA){if(ak(SA)){var $A=un(SA);!BA||!$A||c(IA)&&c(IA).selection.eq($A)||(W("applyExternalSelection",$A),BA.dispatch({selection:$A}))}})(l())}),KA(()=>J(h()),()=>{(function(SA){W("updateLinter",SA),BA&&BA.dispatch({effects:et.reconfigure(Mt())})})(h())}),KA(()=>J(C()),()=>{(function(SA){BA&&(W("updateIndentation",SA),BA.dispatch({effects:OA.reconfigure(Lo(SA))}))})(C())}),KA(()=>J(I()),()=>{(function(SA){BA&&(W("updateTabSize",SA),BA.dispatch({effects:EA.reconfigure(Pa.tabSize.of(SA))}))})(I())}),KA(()=>J(n()),()=>{(function(SA){BA&&(W("updateReadOnly",SA),BA.dispatch({effects:[We.reconfigure(Pa.readOnly.of(SA))]}))})(n())}),KA(()=>(c(DA),J(B())),()=>{c(DA)!==B()&&(N(DA,B()),W("forceUpdateText",{escapeUnicodeCharacters:B()}),BA&&BA.dispatch({changes:{from:0,to:BA.state.doc.length,insert:c(A).escapeValue(c(Ae))}}))}),KA(()=>(c(ge),J(n()),O0),()=>{N(t,c(ge)!==cP||n()?[Ri]:[{icon:O0,text:"Auto repair",title:"Automatically repair JSON",onClick:JA},Ri])}),Ln();var ho={focus:ue,collapse:Ot,expand:j,patch:UA,handlePatch:de,openTransformModal:nt,refresh:pn,flush:yo,validate:fn};ai(!0);var Va,bo=EEA(),La=gA(bo),Hn=SA=>{var $A=at(()=>(c(Ae),uA(()=>c(Ae).length===0))),ve=at(()=>!c($A)),hA=at(()=>!c($A)),FA=at(()=>!c($A)),le=at(()=>!c($A)),Ge=at(()=>!c($A)),rt=at(()=>!c($A));(function(gt,xt){Ft(xt,!1);var zn=cA(void 0,!0),Yi=L(xt,"readOnly",9,!1),ji=L(xt,"onExpandAll",9),$t=L(xt,"onCollapseAll",9),Oi=L(xt,"onFormat",9),Da=L(xt,"onCompact",9),Tt=L(xt,"onSort",9),ct=L(xt,"onTransform",9),Hi=L(xt,"onToggleSearch",9),en=L(xt,"onUndo",9),$n=L(xt,"onRedo",9),mn=L(xt,"canExpandAll",9),Rt=L(xt,"canCollapseAll",9),la=L(xt,"canUndo",9),jo=L(xt,"canRedo",9),D=L(xt,"canFormat",9),b=L(xt,"canCompact",9),R=L(xt,"canSort",9),V=L(xt,"canTransform",9),_=L(xt,"onRenderMenu",9),q=cA(void 0,!0),eA=cA(void 0,!0),aA={type:"button",icon:s4,title:"Search (Ctrl+F)",className:"jse-search",onClick:Hi()},yA=cA(void 0,!0);KA(()=>(J(ji()),J(mn())),()=>{N(q,{type:"button",icon:Vq,title:"Expand all",className:"jse-expand-all",onClick:ji(),disabled:!mn()})}),KA(()=>(J($t()),J(Rt())),()=>{N(eA,{type:"button",icon:Wq,title:"Collapse all",className:"jse-collapse-all",onClick:$t(),disabled:!Rt()})}),KA(()=>(J(Yi()),c(q),c(eA),J(Oi()),J(D()),J(Da()),J(b()),J(Tt()),J(R()),J(ct()),J(V()),J(en()),J(la()),J($n()),J(jo())),()=>{N(yA,Yi()?[c(q),c(eA),{type:"separator"},aA,{type:"space"}]:[c(q),c(eA),{type:"separator"},{type:"button",icon:PP,title:"Format JSON: add proper indentation and new lines (Ctrl+I)",className:"jse-format",onClick:Oi(),disabled:Yi()||!D()},{type:"button",icon:rBA,title:"Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)",className:"jse-compact",onClick:Da(),disabled:Yi()||!b()},{type:"separator"},{type:"button",icon:c4,title:"Sort",className:"jse-sort",onClick:Tt(),disabled:Yi()||!R()},{type:"button",icon:r4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:ct(),disabled:Yi()||!V()},aA,{type:"separator"},{type:"button",icon:Tm,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:en(),disabled:!la()},{type:"button",icon:Um,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:$n(),disabled:!jo()},{type:"space"}])}),KA(()=>(J(_()),c(yA)),()=>{N(zn,_()(c(yA))||c(yA))}),Ln(),ai(!0),Fw(gt,{get items(){return c(zn)}}),Lt()})(SA,{get readOnly(){return n()},onExpandAll:X,onCollapseAll:tA,onFormat:pe,onCompact:GA,onSort:Qt,onTransform:ze,onToggleSearch:Ye,onUndo:di,onRedo:Cn,get canExpandAll(){return c(ve)},get canCollapseAll(){return c(hA)},get canFormat(){return c(FA)},get canCompact(){return c(le)},get canSort(){return c(Ge)},get canTransform(){return c(rt)},get canUndo(){return J(g()),uA(()=>g().canUndo)},get canRedo(){return J(g()),uA(()=>g().canRedo)},get onRenderMenu(){return P()}})};zA(La,SA=>{o()&&SA(Hn)});var Ji=kA(La,2),Vt=SA=>{var $A=cEA(),ve=kA(gA($A),2),hA=gA(ve),FA=kA(ve,2);_e(()=>cg(hA,"width: ".concat(c(vA)>0?c(HA)/c(vA)*100:0,"%"))),we("click",FA,ri),sA(SA,$A)};zA(Ji,SA=>{c(he)&&SA(Vt)});var Gn=kA(Ji,2),Qo=SA=>{var $A,ve=at(()=>(c(Ae),c(dA),uA(()=>vo(c(Ae),c(dA))))),hA=dEA(),FA=it(hA);Ho(FA,xt=>N(QA,xt),()=>c(QA));var le=kA(FA,2),Ge=xt=>{var zn=CEA(),Yi=it(zn),ji=at(()=>(J(Aw),J(ek),c(Ae),uA(()=>"The JSON document is larger than ".concat(Aw(ek),", ")+"and may crash your browser when loading it in text mode. Actual size: ".concat(Aw(c(Ae).length),"."))));_l(Yi,{get icon(){return o2},type:"error",get message(){return c(ji)},actions:[{text:"Open anyway",title:"Open the document in text mode. This may freeze or crash your browser.",onClick:Qn},{text:"Open in tree mode",title:"Open the document in tree mode. Tree mode can handle large documents.",onClick:Je},{text:"Cancel",title:"Cancel opening this large document.",onClick:an}],onClose:ue});var $t=gA(kA(Yi,2));_e(Oi=>Gt($t,Oi),[()=>(J(aC),c(Ae),J(sw),uA(()=>aC(c(Ae)||"",sw)))]),sA(xt,zn)};zA(le,xt=>{c(ve)&&xt(Ge)});var rt=kA(le,2),gt=xt=>{var zn=IEA(),Yi=it(zn),ji=ct=>{(function(Hi,en){Ft(en,!1);var $n=L(en,"editorState",8),mn=cA(),Rt=cA(),la=cA(),jo=cA(),D=cA();KA(()=>J($n()),()=>{var yA;N(mn,(yA=$n())===null||yA===void 0||(yA=yA.selection)===null||yA===void 0||(yA=yA.main)===null||yA===void 0?void 0:yA.head)}),KA(()=>(c(mn),J($n())),()=>{var yA;N(Rt,c(mn)!==void 0?(yA=$n())===null||yA===void 0||(yA=yA.doc)===null||yA===void 0?void 0:yA.lineAt(c(mn)):void 0)}),KA(()=>c(Rt),()=>{N(la,c(Rt)!==void 0?c(Rt).number:void 0)}),KA(()=>(c(Rt),c(mn)),()=>{N(jo,c(Rt)!==void 0&&c(mn)!==void 0?c(mn)-c(Rt).from+1:void 0)}),KA(()=>J($n()),()=>{var yA;N(D,(yA=$n())===null||yA===void 0||(yA=yA.selection)===null||yA===void 0||(yA=yA.ranges)===null||yA===void 0?void 0:yA.reduce((ne,re)=>ne+re.to-re.from,0))}),Ln(),ai();var b=rEA(),R=gA(b),V=yA=>{var ne=nEA(),re=gA(ne);_e(()=>{var Qe;return Gt(re,"Line: ".concat((Qe=c(la))!==null&&Qe!==void 0?Qe:""))}),sA(yA,ne)};zA(R,yA=>{c(la)!==void 0&&yA(V)});var _=kA(R,2),q=yA=>{var ne=oEA(),re=gA(ne);_e(()=>{var Qe;return Gt(re,"Column: ".concat((Qe=c(jo))!==null&&Qe!==void 0?Qe:""))}),sA(yA,ne)};zA(_,yA=>{c(jo)!==void 0&&yA(q)});var eA=kA(_,2),aA=yA=>{var ne=aEA(),re=gA(ne);_e(()=>{var Qe;return Gt(re,"Selection: ".concat((Qe=c(D))!==null&&Qe!==void 0?Qe:""," characters"))}),sA(yA,ne)};zA(eA,yA=>{c(D)!==void 0&&c(D)>0&&yA(aA)}),sA(Hi,b),Lt()})(ct,{get editorState(){return c(IA)}})};zA(Yi,ct=>{a()&&ct(ji)});var $t=kA(Yi,2),Oi=ct=>{_l(ct,{type:"error",get icon(){return o2},get message(){return c(wi),uA(()=>c(wi).message)},get actions(){return c(t)},onClick:wa,onClose:ue})};zA($t,ct=>{c(wi)&&ct(Oi)});var Da=kA($t,2),Tt=ct=>{var Hi=at(()=>[{icon:PP,text:"Format",title:"Format JSON: add proper indentation and new lines (Ctrl+I)",onClick:pe},{icon:g4,text:"No thanks",title:"Close this message",onClick:()=>N(_A,!1)}]);_l(ct,{type:"success",message:"Do you want to format the JSON?",get actions(){return c(Hi)},onClose:ue})};zA(Da,ct=>{c(wi),c(_A),J(lP),c(Ae),uA(()=>!c(wi)&&c(_A)&&lP(c(Ae)))&&ct(Tt)}),f_(kA(Da,2),{get validationErrors(){return c(VA)},selectError:ki}),sA(xt,zn)};zA(rt,xt=>{c(ve)||xt(gt)}),_e(()=>$A=oi(FA,1,"jse-contents svelte-k2b9e6",null,$A,{"jse-hidden":c(ve)})),sA(SA,hA)},Go=SA=>{sA(SA,BEA())};return zA(Gn,SA=>{wA?SA(Go,!1):SA(Qo)}),Ho(bo,SA=>N(RA,SA),()=>c(RA)),_e(()=>Va=oi(bo,1,"jse-text-mode svelte-k2b9e6",null,Va,{"no-main-menu":!o()})),sA(i,bo),qt(e,"focus",ue),qt(e,"collapse",Ot),qt(e,"expand",j),qt(e,"patch",UA),qt(e,"handlePatch",de),qt(e,"openTransformModal",nt),qt(e,"refresh",pn),qt(e,"flush",yo),qt(e,"validate",fn),Lt(ho)}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-inline-value.svelte-1jv89ui { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + line-height: var(--jse-line-height, calc(1em + 4px)); + border: none; + padding: 0 calc(0.5 * var(--jse-padding, 10px)); + background: transparent; + color: inherit; + cursor: inherit; +} +.jse-inline-value.jse-highlight.svelte-1jv89ui { + background-color: var(--jse-search-match-color, #ffe665); + outline: var(--jse-search-match-outline, none); +} +.jse-inline-value.jse-highlight.jse-active.svelte-1jv89ui { + background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); + outline: var(--jse-search-match-outline, 2px solid #e0be00); +}`);var QEA=TA('');Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-column-header.svelte-5pxwfq { + background: none; + border: none; + font-family: inherit; + font-size: inherit; + color: inherit; + display: flex; + gap: var(--jse-padding, 10px); + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); + width: 100%; +} +.jse-column-header.svelte-5pxwfq:hover { + background: var(--jse-table-header-background-highlight, #e8e8e8); +} +.jse-column-header.svelte-5pxwfq:not(.jse-column-header.jse-readonly) { + cursor: pointer; +} +.jse-column-header.svelte-5pxwfq span.jse-column-sort-icon:where(.svelte-5pxwfq) { + height: 1em; +}`);var uEA=TA(''),pEA=TA('');Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-table-mode-welcome.svelte-1b9gnk8 { + flex: 1; + display: flex; + flex-direction: column; + overflow: auto; + align-items: center; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode-welcome.svelte-1b9gnk8:last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-space.jse-before:where(.svelte-1b9gnk8) { + flex: 1; +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) { + display: flex; + flex-direction: column; + gap: var(--jse-padding, 10px); + max-width: 400px; + margin: 2em var(--jse-padding, 10px); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-arrays-info:where(.svelte-1b9gnk8) { + color: var(--jse-panel-color-readonly, #b2b2b2); +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) { + display: flex; + align-items: center; + gap: var(--jse-padding, 10px); +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) .jse-nested-property-path:where(.svelte-1b9gnk8) { + flex: 1; +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) .jse-nested-property-path:where(.svelte-1b9gnk8) .jse-nested-property-count:where(.svelte-1b9gnk8) { + opacity: 0.5; + white-space: nowrap; +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8) { + text-align: left; + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} +.jse-table-mode-welcome.svelte-1b9gnk8 .jse-space.jse-after:where(.svelte-1b9gnk8) { + flex: 2; +}`);var fEA=TA(`An empty document cannot be opened in table mode. You can go to tree mode instead, or paste + a JSON Array using Ctrl+V.`,1),mEA=TA(''),wEA=TA('
          '),DEA=TA('
          ');function yEA(i,e){Ft(e,!0);var A=tl(()=>e.json?(function(h){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:2,m=[];return(function v(S,k){oa(S)&&k.length{v(S[M],k.concat(M))}),Zo(S)&&m.push(k)})(h,[]),m})(e.json).slice(0,99).filter(h=>h.length>0):[]),t=tl(()=>!zi(c(A))),n=tl(()=>e.json===void 0&&(e.text===""||e.text===void 0)),o=tl(()=>c(t)?"Object with nested arrays":c(n)?"An empty document":oa(e.json)?"An object":Zo(e.json)?"An empty array":"A ".concat(t_(e.json,e.parser))),a=DEA();a.__click=()=>e.onClick();var r=kA(gA(a),2),s=gA(r),l=gA(s),g=kA(s,2),C=gA(g),I=h=>{sA(h,cr(`An object cannot be opened in table mode. You can open a nested array instead, or open the + document in tree mode.`))},B=h=>{var f=Gi(),m=it(f),v=k=>{sA(k,fEA())},S=k=>{var M=cr();_e(()=>{var x;return Gt(M,"".concat((x=c(o))!==null&&x!==void 0?x:""," cannot be opened in table mode. You can open the document in tree mode instead."))}),sA(k,M)};zA(m,k=>{c(n)&&!e.readOnly?k(v):k(S,!1)},!0),sA(h,f)};zA(C,h=>{c(t)?h(I):h(B,!1)});var Q=kA(g,2);Ia(Q,17,()=>c(A),Sa,(h,f)=>{var m=tl(()=>(function(Z){return Ze(e.json,Z).length})(c(f))),v=wEA(),S=gA(v),k=gA(S),M=gA(kA(k)),x=kA(S,2);x.__click=()=>e.openJSONEditorModal(c(f));var F=gA(x),z=kA(x,2),P=Z=>{var AA=mEA();AA.__click=()=>e.extractPath(c(f)),sA(Z,AA)};zA(z,Z=>{e.readOnly||Z(P)}),_e(Z=>{var AA;Gt(k,'"'.concat(Z??"",'" ')),Gt(M,"(".concat((AA=c(m))!==null&&AA!==void 0?AA:""," ").concat(c(m)!==1?"items":"item",")")),Gt(F,e.readOnly?"View":"Edit")},[()=>nl(c(f))]),sA(h,v)}),kA(Q,2).__click=()=>e.onChangeMode(ma.tree),_e(()=>Gt(l,c(o))),sA(i,a),Lt()}Nu(["click"]);Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-column-header.svelte-1wgrwv3 { + background: none; + border: none; + font-family: inherit; + font-size: inherit; + color: inherit; + display: flex; + gap: var(--jse-padding, 10px); + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); + width: 100%; +} +.jse-column-header.svelte-1wgrwv3:hover { + background: var(--jse-table-header-background-highlight, #e8e8e8); +} +.jse-column-header.svelte-1wgrwv3:not(.jse-column-header.jse-readonly) { + cursor: pointer; +}`);var vEA=TA('');Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-table-mode.svelte-1p86y3c { + flex: 1; + display: flex; + flex-direction: column; + position: relative; + background: var(--jse-background-color, #fff); + min-width: 0; + min-height: 0; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-text-color, #4d4d4d); + line-height: var(--jse-line-height, calc(1em + 4px)); +} +.jse-table-mode.no-main-menu.svelte-1p86y3c { + border-top: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode.svelte-1p86y3c .jse-search-box-container:where(.svelte-1p86y3c) { + position: relative; + height: 0; + top: calc(var(--jse-line-height, calc(1em + 4px)) + 2 * var(--jse-padding, 10px)); + margin-right: calc(var(--jse-padding, 10px) + 20px); + margin-left: var(--jse-padding, 10px); + text-align: right; + z-index: 3; +} +.jse-table-mode.svelte-1p86y3c .jse-hidden-input-label:where(.svelte-1p86y3c) { + position: fixed; + right: 0; + top: 0; + width: 0; + height: 0; +} +.jse-table-mode.svelte-1p86y3c .jse-hidden-input-label:where(.svelte-1p86y3c) .jse-hidden-input:where(.svelte-1p86y3c) { + width: 0; + height: 0; + padding: 0; + border: 0; + outline: none; +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) { + flex: 1; + align-items: flex-start; + flex-direction: column; + display: flex; + overflow: auto; + overflow-anchor: none; + scrollbar-gutter: stable; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c):last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) { + border-collapse: collapse; + border-spacing: 0; +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-start-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c), +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-end-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c) { + margin: 0; + padding: 0; +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-search-box-background:where(.svelte-1p86y3c) { + background: var(--jse-table-header-background, #f5f5f5); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-end-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c) { + padding-bottom: var(--jse-padding, 10px); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c):hover { + background-color: var(--jse-table-row-odd-background, rgba(0, 0, 0, 0.05)); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) { + padding: 0 var(--jse-padding, 10px) 0 0; + vertical-align: top; + white-space: nowrap; + height: var(--jse-line-height, calc(1em + 4px)); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c), .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-gutter:where(.svelte-1p86y3c) { + font-weight: normal; + text-align: left; + color: var(--jse-text-readonly, #8d8d8d); + background: var(--jse-table-header-background, #f5f5f5); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c) { + padding: 0; + position: sticky; + top: 0; +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c) .jse-table-root-error:where(.svelte-1p86y3c) { + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-gutter:where(.svelte-1p86y3c) { + padding: 0 var(--jse-padding, 10px) 0 calc(0.5 * var(--jse-padding, 10px)); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer:where(.svelte-1p86y3c) { + display: inline-block; + cursor: var(--jse-contents-cursor, pointer); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer:where(.svelte-1p86y3c):hover { + background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer.jse-selected-value:where(.svelte-1p86y3c) { + background: var(--jse-selection-background-color, #d3d3d3); +} +.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-context-menu-anchor:where(.svelte-1p86y3c) { + display: inline-flex; + position: relative; + vertical-align: top; +} +.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) { + align-items: unset; +} +.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) .jse-loading-space:where(.svelte-1p86y3c) { + flex: 1; +} +.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) .jse-loading:where(.svelte-1p86y3c) { + flex: 2; + text-align: center; + color: var(--jse-panel-color-readonly, #b2b2b2); + box-sizing: border-box; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +}`);var bEA=TA('
          '),MEA=TA(''),SEA=TA(''),kEA=TA(' '),_EA=TA('
          '),xEA=TA('
          '),REA=TA(''),NEA=TA(''),FEA=TA('
          ',1),LEA=TA(" ",1),GEA=TA(' ',1),KEA=TA('
          loading...
          '),UEA=TA('
          ',1);function TEA(i,e){Ft(e,!1);var A=cA(void 0,!0),t=cA(void 0,!0),n=cA(void 0,!0),o=tr("jsoneditor:TableMode"),{openAbsolutePopup:a,closeAbsolutePopup:r}=H2("absolute-popup"),s=Hq(),l=C1(),g=C1(),C=typeof window>"u";o("isSSR:",C);var I=L(e,"readOnly",9),B=L(e,"externalContent",9),Q=L(e,"externalSelection",9),h=L(e,"history",9),f=L(e,"truncateTextSize",9),m=L(e,"mainMenuBar",9),v=L(e,"escapeControlCharacters",9),S=L(e,"escapeUnicodeCharacters",9),k=L(e,"flattenColumns",9),M=L(e,"parser",9),x=L(e,"parseMemoizeOne",9),F=L(e,"validator",9),z=L(e,"validationParser",9),P=L(e,"indentation",9),Z=L(e,"onChange",9),AA=L(e,"onChangeMode",9),W=L(e,"onSelect",9),CA=L(e,"onUndo",9),wA=L(e,"onRedo",9),BA=L(e,"onRenderValue",9),QA=L(e,"onRenderMenu",9),RA=L(e,"onRenderContextMenu",9),IA=L(e,"onFocus",9),dA=L(e,"onBlur",9),_A=L(e,"onSortModal",9),VA=L(e,"onTransformModal",9),he=L(e,"onJSONEditorModal",9),HA=cA(void 0,!0),vA=cA(void 0,!0),PA=cA(void 0,!0),et=cA(void 0,!0),We=cA(void 0,!0);p_({onMount:Vr,onDestroy:Ig,getWindow:()=>Gu(c(vA)),hasFocus:()=>Fe&&document.hasFocus()||o_(c(vA)),onFocus:()=>{ri=!0,IA()&&IA()()},onBlur:()=>{ri=!1,dA()&&dA()()}});var OA,EA=cA(void 0,!0),XA=cA(void 0,!0),pA=cA(void 0,!0),Ae=cA(void 0,!0),NA=cA(void 0,!0),Ne=cA(void 0,!0),YA=cA(!1,!0),DA=cA(!1,!0);function Kt(_){N(Ne,(OA=_)?_q(c(EA),OA.items):void 0)}function pt(_){return ue.apply(this,arguments)}function ue(){return(ue=Pt(function*(_){N(JA,void 0),yield pn(_)})).apply(this,arguments)}function Ot(){N(YA,!1),N(DA,!1),U()}var He=cA(1e4,!0),je=cA([],!0),ft=cA(void 0,!0),Fe=!1,ri=!1,j=cA(!1,!0),X=cA({},!0),tA=cA(600,!0),nA=cA(0,!0),UA=18;function de(_){N(JA,_)}function pe(_){c(JA)&&_!==void 0&&(wr(_,kI(c(JA)))&&wr(_,dt(c(JA)))||(o("clearing selection: path does not exist anymore",c(JA)),N(JA,void 0)))}var GA=cA(c(EA)!==void 0?_k({json:c(EA)}):void 0,!0),JA=cA(wu(Q())?Q():void 0,!0),Qt=cA(void 0,!0),nt=cA(!1,!0);function ze(_){if(!I()){o("onSortByHeader",_);var q=_.sortDirection===sg.desc?-1:1;Ki(Zq(c(EA),[],_.path,q),(eA,aA)=>({state:aA,sortedColumn:_}))}}Vr(()=>{c(JA)&&zo(dt(c(JA)))});var Ye=cA(void 0,!0);function di(_){if(_.json!==void 0||_.text!==void 0){var q=c(EA)!==void 0&&_.json!==void 0;h().add({type:"tree",undo:{patch:q?[{op:"replace",path:"",value:_.json}]:void 0,json:_.json,text:_.text,documentState:_.documentState,textIsRepaired:_.textIsRepaired,selection:r0(_.selection),sortedColumn:_.sortedColumn},redo:{patch:q?[{op:"replace",path:"",value:c(EA)}]:void 0,json:c(EA),text:c(XA),documentState:c(GA),textIsRepaired:c(nt),selection:r0(c(JA)),sortedColumn:c(Qt)}})}}var Cn=cA([],!0),Qn=pB(zq);function Je(_,q,eA,aA){BE(()=>{var yA;try{yA=Qn(_,q,eA,aA)}catch(ne){yA=[{path:[],message:"Failed to validate: "+ne.message,severity:ic.warning}]}_i(yA,c(Cn))||(o("validationErrors changed:",yA),N(Cn,yA))},yA=>o("validationErrors updated in ".concat(yA," ms")))}function an(){return o("validate"),c(pA)?{parseError:c(pA),isRepairable:!1}:(Je(c(EA),F(),M(),z()),zi(c(Cn))?void 0:{validationErrors:c(Cn)})}function ki(_,q){if(o("patch",_,q),c(EA)===void 0)throw new Error("Cannot apply patch: no JSON");var eA=c(EA),aA={json:void 0,text:c(XA),documentState:c(GA),selection:r0(c(JA)),sortedColumn:c(Qt),textIsRepaired:c(nt)},yA=kq(c(EA),_),ne=Qq(c(EA),c(GA),_),re=kBA(c(Qt),_,c(je)),Qe=typeof q=="function"?q(ne.json,ne.documentState,c(JA)):void 0;return N(EA,Qe?.json!==void 0?Qe.json:ne.json),N(GA,Qe?.state!==void 0?Qe.state:ne.documentState),N(JA,Qe?.selection!==void 0?Qe.selection:c(JA)),N(Qt,Qe?.sortedColumn!==void 0?Qe.sortedColumn:re),N(XA,void 0),N(nt,!1),N(Ae,void 0),N(NA,void 0),N(pA,void 0),h().add({type:"tree",undo:ke({patch:yA},aA),redo:{patch:_,json:void 0,text:void 0,documentState:c(GA),selection:r0(c(JA)),sortedColumn:c(Qt),textIsRepaired:c(nt)}}),{json:c(EA),previousJson:eA,undo:yA,redo:_}}function Ki(_,q){o("handlePatch",_,q);var eA={json:c(EA),text:c(XA)},aA=ki(_,q);return An(eA,aA),aA}function An(_,q){if((_.json!==void 0||_?.text!==void 0)&&Z()){if(c(XA)!==void 0){var eA={text:c(XA),json:void 0};Z()(eA,_,{contentErrors:an(),patchResult:q})}else if(c(EA)!==void 0){var aA={text:void 0,json:c(EA)};Z()(aA,_,{contentErrors:an(),patchResult:q})}}}function Mt(_){o("pasted json as text",_),N(Ae,_)}function rn(_){o("pasted multiline text",{pastedText:_}),N(NA,_)}function Ut(_){var q=parseInt(_[0],10),eA=[String(q+1),..._.slice(1)];return wr(c(EA),eA)?Pi(eA):Pi(_)}function U(){o("focus"),c(et)&&(c(et).focus(),c(et).select())}function Bt(_){N(nA,_.target.scrollTop)}function ui(){c(JA)||N(JA,(function(){if(Zo(c(EA))&&!zi(c(EA))&&!zi(c(je)))return Pi(["0",...c(je)[0]])})())}function un(){if(c(nt)&&c(EA)!==void 0){var _={json:c(EA),text:c(XA)},q={json:c(EA),documentState:c(GA),selection:c(JA),sortedColumn:c(Qt),text:c(XA),textIsRepaired:c(nt)};N(XA,void 0),N(nt,!1),pe(c(EA)),di(q),An(_,void 0)}return{json:c(EA),text:c(XA)}}function pn(_){var{scrollToWhenVisible:q=!0}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},eA=c(YA)?cu:0,aA=qP(_,c(je),X,UA),yA=aA-c(nA)+eA+UA,ne=Eo(_);if(o("scrollTo",{path:_,top:aA,scrollTop:c(nA),elem:ne}),!c(PA))return Promise.resolve();var re=c(PA).getBoundingClientRect();if(ne&&!q){var Qe=ne.getBoundingClientRect();if(Qe.bottom>re.top&&Qe.top{s(ne,{container:c(PA),offset:Pe,duration:300,callback:()=>{Xn(_),Le()}})}:Le=>{s(yA,{container:c(PA),offset:Pe,duration:300,callback:()=>{Fo(),Xn(_),Le()}})})}function Xn(_){var q=Eo(_);if(q&&c(PA)){var eA=c(PA).getBoundingClientRect(),aA=q.getBoundingClientRect();if(aA.right>eA.right){var yA=aA.right-eA.right;Ml(PA,c(PA).scrollLeft+=yA)}if(aA.leftPe){var Le=yA-Pe;Ml(PA,c(PA).scrollTop+=Le)}if(aAI0(_.slice(1),ne)),yA=aA?_.slice(0,1).concat(aA):_;return(q=(eA=c(PA))===null||eA===void 0?void 0:eA.querySelector('td[data-path="'.concat(X8(yA),'"]')))!==null&&q!==void 0?q:void 0}function Lo(_){var q,{anchor:eA,left:aA,top:yA,width:ne,height:re,offsetTop:Qe,offsetLeft:Pe,showTip:Le}=_,Ue=(function(fA){var{json:ZA,documentState:Te,selection:be,readOnly:Se,onEditValue:st,onEditRow:Wt,onToggleEnforceString:Ui,onCut:Kn,onCopy:tn,onPaste:uo,onRemove:Ai,onDuplicateRow:ea,onInsertBeforeRow:Ao,onInsertAfterRow:ta,onRemoveRow:wn}=fA,Jt=ZA!==void 0,sn=!!be,ei=ZA!==void 0&&be?Ze(ZA,dt(be)):void 0,vt=Jt&&(Io(be)||er(be)||hn(be)),Bi=!Se&&Jt&&be!==void 0&&cw(be),ga=Bi&&!ra(ei),eo=!Se&&vt,ia=be!==void 0&&l0(ZA,Te,dt(be));return[{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"label",text:"Table cell:"},{type:"dropdown-button",main:{type:"button",onClick:()=>st(),icon:q1,text:"Edit",title:"Edit the value (Double-click on the value)",disabled:!Bi},width:"11em",items:[{type:"button",icon:q1,text:"Edit",title:"Edit the value (Double-click on the value)",onClick:()=>st(),disabled:!Bi},{type:"button",icon:ia?D7:b7,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>Ui(),disabled:!ga}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Kn(!0),icon:V1,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!eo},width:"10em",items:[{type:"button",icon:V1,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>Kn(!0),disabled:Se||!vt},{type:"button",icon:V1,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>Kn(!1),disabled:Se||!vt}]},{type:"dropdown-button",main:{type:"button",onClick:()=>tn(!0),icon:H0,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!vt},width:"12em",items:[{type:"button",icon:H0,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>tn(!1),disabled:!vt},{type:"button",icon:H0,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>tn(!1),disabled:!vt}]},{type:"button",onClick:()=>uo(),icon:f7,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:Se||!sn},{type:"button",onClick:()=>Ai(),icon:Gm,text:"Remove",title:"Remove selected contents (Delete)",disabled:Se||!vt}]},{type:"column",items:[{type:"label",text:"Table row:"},{type:"button",onClick:()=>Wt(),icon:q1,text:"Edit row",title:"Edit the current row",disabled:Se||!sn||!Jt},{type:"button",onClick:()=>ea(),icon:w7,text:"Duplicate row",title:"Duplicate the current row (Ctrl+D)",disabled:Se||!sn||!Jt},{type:"button",onClick:()=>Ao(),icon:W1,text:"Insert before",title:"Insert a row before the current row",disabled:Se||!sn||!Jt},{type:"button",onClick:()=>ta(),icon:W1,text:"Insert after",title:"Insert a row after the current row",disabled:Se||!sn||!Jt},{type:"button",onClick:()=>wn(),icon:Gm,text:"Remove row",title:"Remove current row",disabled:Se||!sn||!Jt}]}]}]})({json:c(EA),documentState:c(GA),selection:c(JA),readOnly:I(),onEditValue:da,onEditRow:Aa,onToggleEnforceString:sa,onCut:Va,onCopy:La,onPaste:wi,onRemove:Ji,onDuplicateRow:Gn,onInsertBeforeRow:Qo,onInsertAfterRow:Go,onRemoveRow:SA}),li=(q=RA()(Ue))!==null&&q!==void 0?q:Ue;if(li!==!1){var Pn={left:aA,top:yA,offsetTop:Qe,offsetLeft:Pe,width:ne,height:re,anchor:eA,closeOnOuterClick:!0,onClose:()=>{Fe=!1,U()}};Fe=!0;var $=a(rV,{tip:Le?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:li,onRequestClose(){r($),U()}},Pn)}}function $o(_){if(!$a(c(JA)))if(_&&(_.stopPropagation(),_.preventDefault()),_&&_.type==="contextmenu"&&_.target!==c(et))Lo({left:_.clientX,top:_.clientY,width:sC,height:rC,showTip:!1});else{var q,eA=(q=c(PA))===null||q===void 0?void 0:q.querySelector(".jse-table-cell.jse-selected-value");if(eA)Lo({anchor:eA,offsetTop:2,width:sC,height:rC,showTip:!1});else{var aA,yA=(aA=c(PA))===null||aA===void 0?void 0:aA.getBoundingClientRect();yA&&Lo({top:yA.top+2,left:yA.left+2,width:sC,height:rC,showTip:!1})}}}function yo(_){Lo({anchor:Iq(_.target,"BUTTON"),offsetTop:0,width:sC,height:rC,showTip:!0})}function da(){if(!I()&&c(JA)){var _=dt(c(JA));ra(Ze(c(EA),_))?gt(_):N(JA,Pi(_))}}function Aa(){!I()&&c(JA)&>(dt(c(JA)).slice(0,1))}function sa(){if(!I()&&hn(c(JA))){var _=c(JA).path,q=bt(_),eA=Ze(c(EA),_),aA=!l0(c(EA),c(GA),_),yA=aA?String(eA):YE(String(eA),M());o("handleToggleEnforceString",{enforceString:aA,value:eA,updatedValue:yA}),Ki([{op:"replace",path:q,value:yA}],(ne,re)=>({state:Sw(c(EA),re,_,{type:"value",enforceString:aA})}))}}function vo(){return ge.apply(this,arguments)}function ge(){return(ge=Pt(function*(){if(o("apply pasted json",c(Ae)),c(Ae)){var{onPasteAsJson:_}=c(Ae);_(),setTimeout(U)}})).apply(this,arguments)}function wi(){return In.apply(this,arguments)}function In(){return(In=Pt(function*(){try{hA(yield navigator.clipboard.readText())}catch(_){console.error(_),N(j,!0)}})).apply(this,arguments)}function fn(){return Po.apply(this,arguments)}function Po(){return(Po=Pt(function*(){o("apply pasted multiline text",c(NA)),c(NA)&&(hA(JSON.stringify(c(NA))),setTimeout(U))})).apply(this,arguments)}function wa(){o("clear pasted json"),N(Ae,void 0),U()}function Ri(){o("clear pasted multiline text"),N(NA,void 0),U()}function ho(){AA()(ma.text)}function Va(_){return bo.apply(this,arguments)}function bo(){return(bo=Pt(function*(_){yield eV({json:c(EA),selection:c(JA),indentation:_?P():void 0,readOnly:I(),parser:M(),onPatch:Ki})})).apply(this,arguments)}function La(){return Hn.apply(this,arguments)}function Hn(){return Hn=Pt(function*(){var _=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];c(EA)!==void 0&&(yield tV({json:c(EA),selection:c(JA),indentation:_?P():void 0,parser:M()}))}),Hn.apply(this,arguments)}function Ji(){nV({json:c(EA),text:c(XA),selection:c(JA),keepSelection:!0,readOnly:I(),onChange:Z(),onPatch:Ki})}function Vt(_){I()||(o("extract",{path:_}),Ki(bq(c(EA),Pi(_))))}function Gn(){(function(_){var{json:q,selection:eA,columns:aA,readOnly:yA,onPatch:ne}=_;if(!yA&&q!==void 0&&eA&&IE(eA)){var{rowIndex:re,columnIndex:Qe}=ag(dt(eA),aA);Bs("duplicate row",{rowIndex:re});var Pe=[String(re)];ne(vq(q,[Pe]),(Le,Ue)=>({state:Ue,selection:Pi(fI({rowIndex:re({state:Pn,selection:Pi(fI({rowIndex:Pe,columnIndex:Qe},aA))}))}})({json:c(EA),selection:c(JA),columns:c(je),readOnly:I(),onPatch:Ki})}function SA(){(function(_){var{json:q,selection:eA,columns:aA,readOnly:yA,onPatch:ne}=_;if(!yA&&q!==void 0&&eA&&IE(eA)){var{rowIndex:re,columnIndex:Qe}=ag(dt(eA),aA);Bs("remove row",{rowIndex:re}),ne(Iw([[String(re)]]),(Pe,Le)=>{var Ue=re0?re-1:void 0,li=Ue!==void 0?Pi(fI({rowIndex:Ue,columnIndex:Qe},aA)):void 0;return Bs("remove row new selection",{rowIndex:re,newRowIndex:Ue,newSelection:li}),{state:Le,selection:li}})}})({json:c(EA),selection:c(JA),columns:c(je),readOnly:I(),onPatch:Ki})}function $A(){return($A=Pt(function*(_){yield oV({char:_,selectInside:!1,json:c(EA),selection:c(JA),readOnly:I(),parser:M(),onPatch:Ki,onReplaceJson:FA,onSelect:de})})).apply(this,arguments)}function ve(_){var q;_.preventDefault(),hA((q=_.clipboardData)===null||q===void 0?void 0:q.getData("text/plain"))}function hA(_){_!==void 0&&iV({clipboardText:_,json:c(EA),selection:c(JA),readOnly:I(),parser:M(),onPatch:Ki,onChangeText:le,onPasteMultilineText:rn,openRepairModal:xt})}function FA(_,q){var eA={json:c(EA),text:c(XA)},aA={json:c(EA),documentState:c(GA),selection:c(JA),sortedColumn:c(Qt),text:c(XA),textIsRepaired:c(nt)},yA=bl(_,c(GA)),ne=typeof q=="function"?q(_,yA,c(JA)):void 0;N(EA,ne?.json!==void 0?ne.json:_),N(GA,ne?.state!==void 0?ne.state:yA),N(JA,ne?.selection!==void 0?ne.selection:c(JA)),N(Qt,void 0),N(XA,void 0),N(nt,!1),N(pA,void 0),pe(c(EA)),di(aA),An(eA,void 0)}function le(_,q){o("handleChangeText");var eA={json:c(EA),text:c(XA)},aA={json:c(EA),documentState:c(GA),selection:c(JA),sortedColumn:c(Qt),text:c(XA),textIsRepaired:c(nt)};try{N(EA,x()(_)),N(GA,bl(c(EA),c(GA))),N(XA,void 0),N(nt,!1),N(pA,void 0)}catch(ne){try{N(EA,x()(Xl(_))),N(GA,bl(c(EA),c(GA))),N(XA,_),N(nt,!0),N(pA,void 0)}catch(re){N(EA,void 0),N(GA,void 0),N(XA,_),N(nt,!1),N(pA,c(XA)!==""?SE(c(XA),ne.message||String(ne)):void 0)}}if(typeof q=="function"){var yA=q(c(EA),c(GA),c(JA));N(EA,yA?.json!==void 0?yA.json:c(EA)),N(GA,yA?.state!==void 0?yA.state:c(GA)),N(JA,yA?.selection!==void 0?yA.selection:c(JA))}pe(c(EA)),di(aA),An(eA,void 0)}function Ge(_){o("select validation error",_),N(JA,Pi(_.path)),pn(_.path)}function rt(_){if(c(EA)!==void 0){var{id:q,onTransform:eA,onClose:aA}=_,yA=_.rootPath||[];Fe=!0,VA()({id:q||g,json:c(EA),rootPath:yA||[],onTransform:ne=>{eA?eA({operations:ne,json:c(EA),transformedJson:Ps(c(EA),ne)}):(o("onTransform",yA,ne),Ki(ne))},onClose:()=>{Fe=!1,setTimeout(U),aA&&aA()}})}}function gt(_){o("openJSONEditorModal",{path:_}),Fe=!0,he()({content:{json:Ze(c(EA),_)},path:_,onPatch:Ki,onClose:()=>{Fe=!1,setTimeout(U)}})}function xt(_,q){N(We,{text:_,onParse:eA=>Lu(eA,aA=>Fu(aA,M())),onRepair:nq,onApply:q,onClose:U})}function zn(){(function(_){I()||c(EA)===void 0||(Fe=!0,_A()({id:l,json:c(EA),rootPath:_,onSort:q=>{var{operations:eA,itemPath:aA,direction:yA}=q;o("onSort",eA,_,aA,yA),Ki(eA,(ne,re)=>({state:re,sortedColumn:{path:aA,sortDirection:yA===-1?sg.desc:sg.asc}}))},onClose:()=>{Fe=!1,setTimeout(U)}}))})([])}function Yi(){rt({rootPath:[]})}function ji(_){o("openFind",{findAndReplace:_}),N(YA,!1),N(DA,!1),Fo(),N(YA,!0),N(DA,_)}function $t(){if(!I()&&h().canUndo){var _=h().undo();if(gw(_)){var q={json:c(EA),text:c(XA)};N(EA,_.undo.patch?Ps(c(EA),_.undo.patch):_.undo.json),N(GA,_.undo.documentState),N(JA,_.undo.selection),N(Qt,_.undo.sortedColumn),N(XA,_.undo.text),N(nt,_.undo.textIsRepaired),N(pA,void 0),o("undo",{item:_,json:c(EA)}),An(q,_.undo.patch&&_.redo.patch?{json:c(EA),previousJson:q.json,redo:_.undo.patch,undo:_.redo.patch}:void 0),U(),c(JA)&&pn(dt(c(JA)),{scrollToWhenVisible:!1})}else CA()(_)}}function Oi(){if(!I()&&h().canRedo){var _=h().redo();if(gw(_)){var q={json:c(EA),text:c(XA)};N(EA,_.redo.patch?Ps(c(EA),_.redo.patch):_.redo.json),N(GA,_.redo.documentState),N(JA,_.redo.selection),N(Qt,_.redo.sortedColumn),N(XA,_.redo.text),N(nt,_.redo.textIsRepaired),N(pA,void 0),o("redo",{item:_,json:c(EA)}),An(q,_.undo.patch&&_.redo.patch?{json:c(EA),previousJson:q.json,redo:_.redo.patch,undo:_.undo.patch}:void 0),U(),c(JA)&&pn(dt(c(JA)),{scrollToWhenVisible:!1})}else wA()(_)}}function Da(_){N(tA,_.getBoundingClientRect().height)}KA(()=>(J(v()),J(S())),()=>{N(HA,i_({escapeControlCharacters:v(),escapeUnicodeCharacters:S()}))}),KA(()=>c(YA),()=>{(function(_){if(c(PA)){var q=_?cu:-100;c(PA).scrollTo({top:Ml(PA,c(PA).scrollTop+=q),left:c(PA).scrollLeft})}})(c(YA))}),KA(()=>J(B()),()=>{(function(_){var q={json:c(EA)},eA=Qu(_)?_.text!==c(XA):!_i(q.json,_.json);if(o("update external content",{isChanged:eA}),eA){var aA={json:c(EA),documentState:c(GA),selection:c(JA),sortedColumn:c(Qt),text:c(XA),textIsRepaired:c(nt)};if(Qu(_))try{N(EA,x()(_.text)),N(GA,bl(c(EA),c(GA))),N(XA,_.text),N(nt,!1),N(pA,void 0)}catch(yA){try{N(EA,x()(Xl(_.text))),N(GA,bl(c(EA),c(GA))),N(XA,_.text),N(nt,!0),N(pA,void 0)}catch(ne){N(EA,void 0),N(GA,void 0),N(XA,_.text),N(nt,!1),N(pA,c(XA)!==""?SE(c(XA),yA.message||String(yA)):void 0)}}else N(EA,_.json),N(GA,bl(c(EA),c(GA))),N(XA,void 0),N(nt,!1),N(pA,void 0);pe(c(EA)),N(Qt,void 0),di(aA)}})(B())}),KA(()=>J(Q()),()=>{(function(_){_i(c(JA),_)||(o("applyExternalSelection",{selection:c(JA),externalSelection:_}),wu(_)&&N(JA,_))})(Q())}),KA(()=>(c(je),c(EA),J(k()),c(He)),()=>{N(je,Zo(c(EA))?(function(_,q){var eA=new Set(q.map(bt)),aA=new Set(_.map(bt));for(var yA of eA)aA.has(yA)||eA.delete(yA);for(var ne of aA)eA.has(ne)||eA.add(ne);return[...eA].map(gs)})(vBA(c(EA),k(),c(He)),c(je)):[])}),KA(()=>(c(EA),c(je)),()=>{N(ft,!(!c(EA)||zi(c(je))))}),KA(()=>(c(EA),c(He)),()=>{N(A,Array.isArray(c(EA))&&c(EA).length>c(He))}),KA(()=>(c(nA),c(tA),c(EA),c(YA),cu),()=>{N(t,bBA(c(nA),c(tA),c(EA),X,UA,c(YA)?cu:0))}),KA(()=>c(EA),()=>{c(EA),c(PA)&&c(PA).scrollTo({top:c(PA).scrollTop,left:c(PA).scrollLeft})}),KA(()=>c(JA),()=>{var _;_=c(JA),_i(_,Q())||(o("onSelect",_),W()(_))}),KA(()=>(J(I()),J(f()),J(M()),c(HA),c(EA),c(GA),J(BA())),()=>{N(Ye,{mode:ma.table,readOnly:I(),truncateTextSize:f(),parser:M(),normalization:c(HA),getJson:()=>c(EA),getDocumentState:()=>c(GA),findElement:Eo,findNextInside:Ut,focus:U,onPatch:(_,q)=>Ki((function(eA,aA){return eA.flatMap(yA=>{if(km(yA)){var ne=gs(yA.path);if(ne.length>0){for(var re=[yA],Qe=Vi(ne);Qe.length>0&&!wr(aA,Qe);)re.unshift({op:"add",path:bt(Qe),value:{}}),Qe=Vi(Qe);return re}}return yA})})(_,c(EA)),q),onSelect:de,onFind:ji,onPasteJson:Mt,onRenderValue:BA()})}),KA(()=>(c(EA),J(F()),J(M()),J(z())),()=>{Je(c(EA),F(),M(),z())}),KA(()=>(c(Cn),c(je)),()=>{N(n,MBA(c(Cn),c(je)))}),Ln();var Tt={validate:an,patch:ki,focus:U,acceptAutoRepair:un,scrollTo:pn,findElement:Eo,openTransformModal:rt};ai(!0);var ct=UEA();we("mousedown",cC,function(_){!OE(_.target,q=>q===c(vA))&&$a(c(JA))&&(o("click outside the editor, exit edit mode"),N(JA,r0(c(JA))),ri&&c(et)&&(c(et).focus(),c(et).blur()),o("blur (outside editor)"),c(et)&&c(et).blur())});var Hi,en=it(ct),$n=gA(en),mn=_=>{(function(q,eA){Ft(eA,!1);var aA=L(eA,"containsValidArray",9),yA=L(eA,"readOnly",9),ne=L(eA,"showSearch",13,!1),re=L(eA,"history",9),Qe=L(eA,"onSort",9),Pe=L(eA,"onTransform",9),Le=L(eA,"onContextMenu",9),Ue=L(eA,"onUndo",9),li=L(eA,"onRedo",9),Pn=L(eA,"onRenderMenu",9);function $(){ne(!ne())}var fA=cA(void 0,!0),ZA=cA(void 0,!0);KA(()=>(J(yA()),J(Qe()),J(aA()),J(Pe()),J(Le()),J(Ue()),J(re()),J(li())),()=>{N(fA,yA()?[{type:"space"}]:[{type:"button",icon:c4,title:"Sort",className:"jse-sort",onClick:Qe(),disabled:yA()||!aA()},{type:"button",icon:r4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:Pe(),disabled:yA()||!aA()},{type:"button",icon:s4,title:"Search (Ctrl+F)",className:"jse-search",onClick:$,disabled:!aA()},{type:"button",icon:m7,title:s_,className:"jse-contextmenu",onClick:Le()},{type:"separator"},{type:"button",icon:Tm,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:Ue(),disabled:!re().canUndo},{type:"button",icon:Um,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:li(),disabled:!re().canRedo},{type:"space"}])}),KA(()=>(J(Pn()),c(fA)),()=>{N(ZA,Pn()(c(fA))||c(fA))}),Ln(),ai(!0),Fw(q,{get items(){return c(ZA)}}),Lt()})(_,{get containsValidArray(){return c(ft)},get readOnly(){return I()},get history(){return h()},onSort:zn,onTransform:Yi,onUndo:$t,onRedo:Oi,onContextMenu:yo,get onRenderMenu(){return QA()},get showSearch(){return c(YA)},set showSearch(q){N(YA,q)},$$legacy:!0})};zA($n,_=>{m()&&_(mn)});var Rt=kA($n,2),la=_=>{var q=GEA(),eA=it(q),aA=gA(eA);aA.readOnly=!0,Ho(aA,Qe=>N(et,Qe),()=>c(et));var yA=kA(eA,2),ne=Qe=>{var Pe=FEA(),Le=it(Pe);Xq(gA(Le),{get json(){return c(EA)},get documentState(){return c(GA)},get parser(){return M()},get showSearch(){return c(YA)},get showReplace(){return c(DA)},get readOnly(){return I()},get columns(){return c(je)},onSearch:Kt,onFocus:pt,onPatch:Ki,onClose:Ot});var Ue=kA(Le,2),li=gA(Ue),Pn=gA(li),$=gA(Pn),fA=gA($),ZA=gA(fA),Te=vt=>{var Bi=at(()=>(J(oE),c(n),uA(()=>{var Ba;return oE([],(Ba=c(n))===null||Ba===void 0?void 0:Ba.root)}))),ga=Gi(),eo=it(ga),ia=Ba=>{var Cr=bEA();mE(gA(Cr),{get validationError(){return c(Bi)},get onExpand(){return rg}}),sA(Ba,Cr)};zA(eo,Ba=>{c(Bi)&&Ba(ia)}),sA(vt,ga)};zA(ZA,vt=>{J(zi),c(n),uA(()=>{var Bi;return!zi((Bi=c(n))===null||Bi===void 0?void 0:Bi.root)})&&vt(Te)});var be=kA(fA);Ia(be,1,()=>c(je),Sa,(vt,Bi)=>{var ga=MEA();(function(eo,ia){Ft(ia,!1);var Ba=cA(void 0,!0),Cr=cA(void 0,!0),Q0=cA(void 0,!0),ll=L(ia,"path",9),Eg=L(ia,"sortedColumn",9),Ec=L(ia,"readOnly",9),hg=L(ia,"onSort",9);KA(()=>(J(ll()),nl),()=>{N(Ba,zi(ll())?"values":nl(ll()))}),KA(()=>(J(Eg()),J(ll())),()=>{var ka;N(Cr,Eg()&&_i(ll(),(ka=Eg())===null||ka===void 0?void 0:ka.path)?Eg().sortDirection:void 0)}),KA(()=>(c(Cr),CP),()=>{N(Q0,c(Cr)?CP[c(Cr)]:void 0)}),Ln(),ai(!0);var Zr,Ir=pEA(),gl=gA(Ir),u0=gA(gl),cl=kA(gl,2),Un=ka=>{var _a=uEA(),t1=gA(_a),VI=at(()=>(c(Cr),J(sg),J(qc),J(v7),uA(()=>c(Cr)===sg.asc?qc:v7)));on(t1,{get data(){return c(VI)}}),_e(()=>Fn(_a,"title","Currently sorted in ".concat(c(Q0)," order"))),sA(ka,_a)};zA(cl,ka=>{c(Cr)!==void 0&&ka(Un)}),_e(ka=>{Zr=oi(Ir,1,"jse-column-header svelte-5pxwfq",null,Zr,{"jse-readonly":Ec()}),Fn(Ir,"title",Ec()?c(Ba):c(Ba)+" (Click to sort the data by this column)"),Gt(u0,ka)},[()=>(J(aC),c(Ba),J(50),uA(()=>aC(c(Ba),50)))]),we("click",Ir,function(){Ec()||hg()({path:ll(),sortDirection:c(Cr)===sg.asc?sg.desc:sg.asc})}),sA(eo,Ir),Lt()})(gA(ga),{get path(){return c(Bi)},get sortedColumn(){return c(Qt)},get readOnly(){return I()},onSort:ze}),sA(vt,ga)});var Se=kA(be),st=vt=>{var Bi=SEA(),ga=gA(Bi),eo=at(()=>(c(EA),uA(()=>Array.isArray(c(EA))?c(EA).length:0)));(function(ia,Ba){Ft(Ba,!1);var Cr=L(Ba,"count",9),Q0=L(Ba,"maxSampleCount",9),ll=L(Ba,"readOnly",9),Eg=L(Ba,"onRefresh",9);ai(!0);var Ec,hg=vEA();on(gA(hg),{get data(){return vT}}),_e(()=>{Ec=oi(hg,1,"jse-column-header svelte-1wgrwv3",null,Ec,{"jse-readonly":ll()}),Fn(hg,"title","The Columns are created by sampling ".concat(Q0()," items out of ").concat(Cr(),". ")+"If you're missing a column, click here to sample all of the items instead of a subset. This is slower.")}),we("click",hg,()=>Eg()()),sA(ia,hg),Lt()})(ga,{get count(){return c(eo)},get maxSampleCount(){return c(He)},get readOnly(){return I()},onRefresh:()=>N(He,1/0)}),sA(vt,Bi)};zA(Se,vt=>{c(A)&&vt(st)});var Wt,Ui,Kn=kA($),tn=gA(Kn),uo=kA(Kn);Ia(uo,1,()=>(c(t),uA(()=>c(t).visibleItems)),Sa,(vt,Bi,ga)=>{var eo=at(()=>(c(t),uA(()=>c(t).startIndex+ga))),ia=at(()=>(c(n),J(c(eo)),uA(()=>c(n).rows[c(eo)]))),Ba=at(()=>(J(oE),J(c(eo)),J(c(ia)),uA(()=>{var Zr;return oE([String(c(eo))],(Zr=c(ia))===null||Zr===void 0?void 0:Zr.row)}))),Cr=at(()=>(J(o0),c(EA),c(Ne),J(c(eo)),uA(()=>o0(c(EA),c(Ne),[String(c(eo))])))),Q0=NEA(),ll=gA(Q0);qj(ll,()=>c(eo),Zr=>{var Ir=kEA(),gl=gA(Ir),u0=kA(gl),cl=Un=>{mE(Un,{get validationError(){return c(Ba)},get onExpand(){return rg}})};zA(u0,Un=>{c(Ba)&&Un(cl)}),Es(Ir,(Un,ka)=>z8?.(Un,ka),()=>Un=>(function(ka,_a){X[_a]=ka.getBoundingClientRect().height})(Un,c(eo))),_e(()=>{var Un;return Gt(gl,"".concat((Un=c(eo))!==null&&Un!==void 0?Un:""," "))}),sA(Zr,Ir)});var Eg=kA(ll);Ia(Eg,1,()=>c(je),Sa,(Zr,Ir,gl,u0)=>{var cl,Un=at(()=>(J(c(eo)),c(Ir),uA(()=>[String(c(eo))].concat(c(Ir))))),ka=at(()=>(J(Ze),c(Bi),c(Ir),uA(()=>Ze(c(Bi),c(Ir))))),_a=at(()=>(J(hn),c(JA),J(I0),J(c(Un)),uA(()=>hn(c(JA))&&I0(c(JA).path,c(Un))))),t1=at(()=>(J(c(ia)),uA(()=>{var xa;return(xa=c(ia))===null||xa===void 0?void 0:xa.columns[gl]}))),VI=at(()=>(J(oE),J(c(Un)),J(c(t1)),uA(()=>oE(c(Un),c(t1))))),i1=xEA(),ch=gA(i1),WI=gA(ch),Ch=xa=>{var Rl=at(()=>(J(dw),J(o0),c(Bi),J(c(Cr)),c(Ir),uA(()=>dw(o0(c(Bi),c(Cr),c(Ir)))))),Ih=at(()=>(J(c(Rl)),uA(()=>!!c(Rl)&&c(Rl).some(o1=>o1.active)))),dh=at(()=>(J(zi),J(c(Rl)),uA(()=>!zi(c(Rl)))));(function(o1,kr){Ft(kr,!1);var Bh=L(kr,"path",9),Gx=L(kr,"value",9),Kx=L(kr,"parser",9),BX=L(kr,"isSelected",9),EX=L(kr,"containsSearchResult",9),hX=L(kr,"containsActiveSearchResult",9),QX=L(kr,"onEdit",9);ai(!0);var Ux,a3=QEA(),uX=gA(a3);_e(Eh=>{Ux=oi(a3,1,"jse-inline-value svelte-1jv89ui",null,Ux,{"jse-selected":BX(),"jse-highlight":EX(),"jse-active":hX()}),Gt(uX,Eh)},[()=>(J(aC),J(Kx()),J(Gx()),J(50),uA(()=>{var Eh;return aC((Eh=Kx().stringify(Gx()))!==null&&Eh!==void 0?Eh:"",50)}))]),we("dblclick",a3,()=>QX()(Bh())),sA(o1,a3),Lt()})(xa,{get path(){return c(Un)},get value(){return c(ka)},get parser(){return M()},get isSelected(){return c(_a)},get containsSearchResult(){return c(dh)},get containsActiveSearchResult(){return c(Ih)},onEdit:gt})},wD=xa=>{var Rl=at(()=>(J(o0),c(EA),c(Ne),J(c(Un)),uA(()=>{var kr;return(kr=o0(c(EA),c(Ne),c(Un)))===null||kr===void 0?void 0:kr.searchResults}))),Ih=at(()=>c(ka)!==void 0?c(ka):""),dh=at(()=>(J(l0),c(EA),c(GA),J(c(Un)),uA(()=>l0(c(EA),c(GA),c(Un))))),o1=at(()=>c(_a)?c(JA):void 0);qq(xa,{get path(){return c(Un)},get value(){return c(Ih)},get enforceString(){return c(dh)},get selection(){return c(o1)},get searchResultItems(){return c(Rl)},get context(){return c(Ye)}})};zA(WI,xa=>{J(ra),J(c(ka)),uA(()=>ra(c(ka)))?xa(Ch):xa(wD,!1)});var DD=kA(WI),yD=xa=>{var Rl=_EA();y2(gA(Rl),{selected:!0,onContextMenu:Lo}),sA(xa,Rl)};zA(DD,xa=>{J(I()),J(c(_a)),J($a),c(JA),uA(()=>!I()&&c(_a)&&!$a(c(JA)))&&xa(yD)});var hc=kA(ch,2),n1=xa=>{mE(xa,{get validationError(){return c(VI)},get onExpand(){return rg}})};zA(hc,xa=>{c(VI)&&xa(n1)}),_e(xa=>{Fn(i1,"data-path",xa),cl=oi(ch,1,"jse-value-outer svelte-1p86y3c",null,cl,{"jse-selected-value":c(_a)})},[()=>(J(X8),J(c(Un)),uA(()=>X8(c(Un))))]),sA(Zr,i1)});var Ec=kA(Eg),hg=Zr=>{sA(Zr,REA())};zA(Ec,Zr=>{c(A)&&Zr(hg)}),sA(vt,Q0)});var Ai,ea=gA(kA(uo));Ho(Ue,vt=>N(PA,vt),()=>c(PA)),Es(Ue,(vt,Bi)=>z8?.(vt,Bi),()=>Da),Mr(()=>we("scroll",Ue,Bt));var Ao=kA(Ue,2),ta=vt=>{var Bi=at(()=>(c(Ae),uA(()=>"You pasted a JSON ".concat(Array.isArray(c(Ae).contents)?"array":"object"," as text")))),ga=at(()=>[{icon:O0,text:"Paste as JSON instead",title:"Paste the text as JSON instead of a single value",onMouseDown:vo},{text:"Leave as is",title:"Keep the pasted content as a single value",onClick:wa}]);_l(vt,{type:"info",get message(){return c(Bi)},get actions(){return c(ga)}})};zA(Ao,vt=>{c(Ae)&&vt(ta)});var wn=kA(Ao,2),Jt=vt=>{var Bi=at(()=>[{icon:O0,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:fn},{text:"Leave as is",title:"Keep the pasted array",onClick:Ri}]);_l(vt,{type:"info",message:"Multiline text was pasted as array",get actions(){return c(Bi)}})};zA(wn,vt=>{c(NA)&&vt(Jt)});var sn=kA(wn,2),ei=vt=>{var Bi=at(()=>I()?[]:[{icon:Km,text:"Ok",title:"Accept the repaired document",onClick:un},{icon:l4,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:ho}]);_l(vt,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return c(Bi)},onClose:U})};zA(sn,vt=>{c(nt)&&vt(ei)}),f_(kA(sn,2),{get validationErrors(){return c(Cn)},selectError:Ge}),_e(()=>{Wt=oi(Kn,1,"jse-table-invisible-start-section svelte-1p86y3c",null,Wt,{"jse-search-box-background":c(YA)}),Fn(tn,"colspan",(c(je),uA(()=>c(je).length))),Ui=cg(tn,"",Ui,{height:(c(t),uA(()=>c(t).startHeight+"px"))}),Fn(ea,"colspan",(c(je),uA(()=>c(je).length))),Ai=cg(ea,"",Ai,{height:(c(t),uA(()=>c(t).endHeight+"px"))})}),sA(Qe,Pe)},re=Qe=>{var Pe=Gi(),Le=it(Pe),Ue=Pn=>{var $=LEA(),fA=it($),ZA=at(()=>I()?[]:[{icon:l4,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:ho}]);_l(fA,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return c(ZA)}}),aV(kA(fA,2),{get text(){return c(XA)},get json(){return c(EA)},get indentation(){return P()},get parser(){return M()}}),sA(Pn,$)},li=Pn=>{yEA(Pn,{get text(){return c(XA)},get json(){return c(EA)},get readOnly(){return I()},get parser(){return M()},openJSONEditorModal:gt,extractPath:Vt,get onChangeMode(){return AA()},onClick:()=>{U()}})};zA(Le,Pn=>{c(pA)&&c(XA)!==void 0&&c(XA)!==""?Pn(Ue):Pn(li,!1)},!0),sA(Qe,Pe)};zA(yA,Qe=>{c(ft)?Qe(ne):Qe(re,!1)}),we("paste",aA,ve),sA(_,q)},jo=_=>{sA(_,KEA())};zA(Rt,_=>{C?_(jo,!1):_(la)}),Ho(en,_=>N(vA,_),()=>c(vA));var D=kA(en,2),b=_=>{Pq(_,{onClose:()=>N(j,!1)})};zA(D,_=>{c(j)&&_(b)});var R=kA(D,2),V=_=>{jq(_,K2(()=>c(We),{onClose:()=>{var q;(q=c(We))===null||q===void 0||q.onClose(),N(We,void 0)}}))};return zA(R,_=>{c(We)&&_(V)}),_e(()=>Hi=oi(en,1,"jse-table-mode svelte-1p86y3c",null,Hi,{"no-main-menu":!m()})),we("mousedown",en,function(_){if(_.buttons===1||_.buttons===2){var q=_.target;q.isContentEditable||U();var eA=dq(q);if(eA){if($a(c(JA))&&Du(c(EA),c(JA),eA))return;N(JA,Pi(eA)),_.preventDefault()}}}),we("keydown",en,function(_){var q=hC(_);if(o("keydown",{combo:q,key:_.key}),q==="Ctrl+X"&&(_.preventDefault(),Va(!0)),q==="Ctrl+Shift+X"&&(_.preventDefault(),Va(!1)),q==="Ctrl+C"&&(_.preventDefault(),La(!0)),q==="Ctrl+Shift+C"&&(_.preventDefault(),La(!1)),q==="Ctrl+D"&&(_.preventDefault(),Gn()),q!=="Delete"&&q!=="Backspace"||(_.preventDefault(),Ji()),q==="Insert"&&_.preventDefault(),q==="Ctrl+A"&&_.preventDefault(),q==="Ctrl+Q"&&$o(_),q==="ArrowLeft"&&(_.preventDefault(),ui(),c(JA))){var eA=(function(Pe,Le){var{rowIndex:Ue,columnIndex:li}=ag(dt(Le),Pe);return li>0?Pi(fI({rowIndex:Ue,columnIndex:li-1},Pe)):Le})(c(je),c(JA));N(JA,eA),zo(dt(eA))}if(q==="ArrowRight"&&(_.preventDefault(),ui(),c(JA))){var aA=(function(Pe,Le){var{rowIndex:Ue,columnIndex:li}=ag(dt(Le),Pe);return li0?Pi(fI({rowIndex:Ue-1,columnIndex:li},Pe)):Le})(c(je),c(JA));N(JA,yA),zo(dt(yA))}if(q==="ArrowDown"&&(_.preventDefault(),ui(),c(JA))){var ne=(function(Pe,Le,Ue){var{rowIndex:li,columnIndex:Pn}=ag(dt(Ue),Le);return liN(HA,X)}).get()),vA=cA(s());function PA(X){if(QP(X)){N(vA,X.undo.mode);var tA=c(HA).items(),nA=tA.findIndex(de=>de===X),UA=nA!==-1?tA[nA-1]:void 0;he("handleUndo",{index:nA,item:X,items:tA,prevItem:UA}),UA&&t(UA.redo.selection),F()(c(vA))}}function et(X){if(QP(X)){N(vA,X.redo.mode);var tA=c(HA).items(),nA=tA.findIndex(de=>de===X),UA=nA!==-1?tA[nA+1]:void 0;he("handleRedo",{index:nA,item:X,items:tA,nextItem:UA}),UA&&t(UA.undo.selection),F()(c(vA))}}var We=cA(),OA={type:"separator"},EA=cA(),XA=cA();function pA(X){if(c(dA))return c(dA).patch(X);if(c(_A))return c(_A).patch(X);if(c(VA))return c(VA).patch(X);throw new Error('Method patch is not available in mode "'.concat(c(vA),'"'))}function Ae(X,tA){if(c(dA))return c(dA).expand(X,tA);if(c(VA))return c(VA).expand(X,tA);throw new Error('Method expand is not available in mode "'.concat(c(vA),'"'))}function NA(X,tA){if(c(dA))return c(dA).collapse(X,tA);if(c(VA))return c(VA).collapse(X,tA);throw new Error('Method collapse is not available in mode "'.concat(c(vA),'"'))}function Ne(X){if(c(VA))c(VA).openTransformModal(X);else if(c(dA))c(dA).openTransformModal(X);else{if(!c(_A))throw new Error('Method transform is not available in mode "'.concat(c(vA),'"'));c(_A).openTransformModal(X)}}function YA(){if(c(VA))return c(VA).validate();if(c(dA))return c(dA).validate();if(c(_A))return c(_A).validate();throw new Error('Method validate is not available in mode "'.concat(c(vA),'"'))}function DA(){return c(dA)?c(dA).acceptAutoRepair():A()}function Kt(X){if(c(dA))return c(dA).scrollTo(X);if(c(_A))return c(_A).scrollTo(X);throw new Error('Method scrollTo is not available in mode "'.concat(c(vA),'"'))}function pt(X){if(c(dA))return c(dA).findElement(X);if(c(_A))return c(_A).findElement(X);throw new Error('Method findElement is not available in mode "'.concat(c(vA),'"'))}function ue(){c(VA)?c(VA).focus():c(dA)?c(dA).focus():c(_A)&&c(_A).focus()}function Ot(){return He.apply(this,arguments)}function He(){return(He=Pt(function*(){c(VA)&&(yield c(VA).refresh())})).apply(this,arguments)}KA(()=>J(s()),()=>{(function(X){if(X!==c(vA)){var tA={type:"mode",undo:{mode:c(vA),selection:void 0},redo:{mode:X,selection:void 0}};c(vA)==="text"&&c(VA)&&c(VA).flush(),he("add history item",tA),c(HA).add(tA),N(vA,X)}})(s())}),KA(()=>(c(vA),J(F())),()=>{N(We,[{type:"button",text:"text",title:"Switch to text mode (current mode: ".concat(c(vA),")"),className:"jse-group-button jse-first"+(c(vA)===ma.text?" jse-selected":""),onClick:()=>F()(ma.text)},{type:"button",text:"tree",title:"Switch to tree mode (current mode: ".concat(c(vA),")"),className:"jse-group-button "+(c(vA)===ma.tree?" jse-selected":""),onClick:()=>F()(ma.tree)},{type:"button",text:"table",title:"Switch to table mode (current mode: ".concat(c(vA),")"),className:"jse-group-button jse-last"+(c(vA)===ma.table?" jse-selected":""),onClick:()=>F()(ma.table)}])}),KA(()=>(c(We),J(AA()),c(vA),J(M()),J(n())),()=>{N(EA,X=>{var tA=kk(X[0])?c(We).concat(X):c(We).concat(OA,X),nA=M3(tA);return AA()(tA,{mode:c(vA),modal:M(),readOnly:n()})||nA})}),KA(()=>(J(W()),c(vA),J(M()),J(n()),J(t())),()=>{N(XA,X=>{var tA,nA=M3(X);return(tA=W()(X,{mode:c(vA),modal:M(),readOnly:n(),selection:t()}))!==null&&tA!==void 0?tA:!n()&&nA})}),Ln();var je={patch:pA,expand:Ae,collapse:NA,transform:Ne,validate:YA,acceptAutoRepair:DA,scrollTo:Kt,findElement:pt,focus:ue,refresh:Ot};ai();var ft=Gi(),Fe=it(ft),ri=X=>{Ho(hEA(X,{get externalContent(){return A()},get externalSelection(){return t()},get history(){return c(HA)},get readOnly(){return n()},get indentation(){return o()},get tabSize(){return a()},get mainMenuBar(){return l()},get statusBar(){return C()},get askToFormat(){return I()},get escapeUnicodeCharacters(){return Q()},get parser(){return f()},get validator(){return v()},get validationParser(){return S()},get onChange(){return x()},get onChangeMode(){return F()},get onSelect(){return z()},onUndo:PA,onRedo:et,get onError(){return CA()},get onFocus(){return wA()},get onBlur(){return BA()},get onRenderMenu(){return c(EA)},get onSortModal(){return QA()},get onTransformModal(){return RA()},$$legacy:!0}),tA=>N(VA,tA),()=>c(VA))},j=X=>{var tA=Gi(),nA=it(tA),UA=pe=>{Ho(TEA(pe,{get externalContent(){return A()},get externalSelection(){return t()},get history(){return c(HA)},get readOnly(){return n()},get truncateTextSize(){return r()},get mainMenuBar(){return l()},get escapeControlCharacters(){return B()},get escapeUnicodeCharacters(){return Q()},get flattenColumns(){return h()},get parser(){return f()},get parseMemoizeOne(){return m()},get validator(){return v()},get validationParser(){return S()},get indentation(){return o()},get onChange(){return x()},get onChangeMode(){return F()},get onSelect(){return z()},onUndo:PA,onRedo:et,get onRenderValue(){return P()},get onFocus(){return wA()},get onBlur(){return BA()},get onRenderMenu(){return c(EA)},get onRenderContextMenu(){return c(XA)},get onSortModal(){return QA()},get onTransformModal(){return RA()},get onJSONEditorModal(){return IA()},$$legacy:!0}),GA=>N(_A,GA),()=>c(_A))},de=pe=>{Ho(jk(pe,{get externalContent(){return A()},get externalSelection(){return t()},get history(){return c(HA)},get readOnly(){return n()},get indentation(){return o()},get truncateTextSize(){return r()},get mainMenuBar(){return l()},get navigationBar(){return g()},get escapeControlCharacters(){return B()},get escapeUnicodeCharacters(){return Q()},get parser(){return f()},get parseMemoizeOne(){return m()},get validator(){return v()},get validationParser(){return S()},get pathParser(){return k()},get onError(){return CA()},get onChange(){return x()},get onChangeMode(){return F()},get onSelect(){return z()},onUndo:PA,onRedo:et,get onRenderValue(){return P()},get onClassName(){return Z()},get onFocus(){return wA()},get onBlur(){return BA()},get onRenderMenu(){return c(EA)},get onRenderContextMenu(){return c(XA)},get onSortModal(){return QA()},get onTransformModal(){return RA()},get onJSONEditorModal(){return IA()},$$legacy:!0}),GA=>N(dA,GA),()=>c(dA))};zA(nA,pe=>{c(vA),J(ma),uA(()=>c(vA)===ma.table)?pe(UA):pe(de,!1)},!0),sA(X,tA)};return zA(Fe,X=>{c(vA),J(ma),uA(()=>c(vA)===ma.text||String(c(vA))==="code")?X(ri):X(j,!1)}),sA(i,ft),qt(e,"patch",pA),qt(e,"expand",Ae),qt(e,"collapse",NA),qt(e,"transform",Ne),qt(e,"validate",YA),qt(e,"acceptAutoRepair",DA),qt(e,"scrollTo",Kt),qt(e,"findElement",pt),qt(e,"focus",ue),qt(e,"refresh",Ot),Lt(je)}Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-modal-wrapper.svelte-t4zsk3 { + flex: 1; + display: flex; + min-width: 0; + min-height: 0; + flex-direction: column; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) { + flex: 1; + display: flex; + flex-direction: column; + padding: 20px; + overflow: auto; + min-width: 0; + min-height: 0; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding-top: var(--jse-padding, 10px); +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-label:where(.svelte-t4zsk3) { + font-weight: bold; + display: block; + box-sizing: border-box; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-label:where(.svelte-t4zsk3) .jse-label-inner:where(.svelte-t4zsk3) { + margin-top: calc(2 * var(--jse-padding, 10px)); + margin-bottom: calc(0.5 * var(--jse-padding, 10px)); + box-sizing: border-box; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-modal-inline-editor:where(.svelte-t4zsk3) { + flex: 1; + min-height: 150px; + min-width: 0; + max-width: 100%; + display: flex; + --jse-theme-color: var(--jse-modal-editor-theme-color, #707070); + --jse-theme-color-highlight: var(--jse-modal-editor-theme-color-highlight, #646464); +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) { + gap: var(--jse-padding, 10px); + align-items: center; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) .jse-error:where(.svelte-t4zsk3) { + flex: 1; + color: var(--jse-error-color, #ee5341); +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-secondary-background, #d3d3d3); + color: var(--jse-button-secondary-color, var(--jse-text-color, #4d4d4d)); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3):hover { + background: var(--jse-button-secondary-background-highlight, #e1e1e1); +} +.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3):disabled { + background: var(--jse-button-secondary-background-disabled, #9d9d9d); +} +.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3) { + border: var(--jse-input-border, 1px solid #d8dbdf); + outline: none; + box-sizing: border-box; + padding: calc(0.5 * var(--jse-padding, 10px)); + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: inherit; + background: var(--jse-input-background, var(--jse-background-color, #fff)); +} +.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3):focus { + border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); +} +.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3):read-only { + background: var(--jse-input-background-readonly, transparent); +}`);var JEA=TA('
          '),YEA=TA(''),OEA=TA(''),HEA=TA(''),zEA=TA('
          Path
          Contents
          ',1),PEA=TA('
          '),jEA={};Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-modal-contents.svelte-lwzlls { + flex: 1; + display: flex; + flex-direction: column; + padding: 20px; + overflow: auto; + min-width: 0; + min-height: 0; +} +.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding-top: var(--jse-padding, 10px); +} +.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} +.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} +.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) th:where(.svelte-lwzlls), +.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) td:where(.svelte-lwzlls) { + text-align: left; + vertical-align: middle; + font-weight: normal; + padding-bottom: var(--jse-padding, 10px); +} +.jse-modal-contents.svelte-lwzlls input.jse-path:where(.svelte-lwzlls) { + width: 100%; + box-sizing: border-box; + padding: 5px 10px; + border: var(--jse-input-border, 1px solid #d8dbdf); + border-radius: var(--jse-input-radius, 3px); + font-family: inherit; + font-size: inherit; + background: inherit; + background: var(--jse-input-background-readonly, transparent); + color: inherit; + outline: none; +} +.jse-modal-contents.svelte-lwzlls .svelte-select input { + box-sizing: border-box; +} +.jse-modal-contents.svelte-lwzlls .jse-space:where(.svelte-lwzlls) { + height: 200px; +} +.jse-modal-contents.svelte-lwzlls .jse-space:where(.svelte-lwzlls) .jse-error:where(.svelte-lwzlls) { + color: var(--jse-error-color, #ee5341); +}`);var rE=bw(()=>jEA),qEA=TA('Property'),VEA=TA('
          '),WEA=TA('
          Path
          Direction
          ',1);Xt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-main.svelte-1l55585 { + width: 100%; + height: 100%; + min-width: 0; + min-height: 150px; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + line-height: normal; + position: relative; + display: flex; + flex-direction: row; +} +.jse-main.svelte-1l55585:not(.jse-focus) { + --jse-selection-background-color: var(--jse-selection-background-inactive-color, #e8e8e8); + --jse-context-menu-pointer-background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); +}`);var ZEA=TA('
          ',1);function XEA(i,e){Ft(e,!1);var A=cA(void 0,!0),t=tr("jsoneditor:JSONEditor"),n={text:""},o=void 0,a=!1,r=ma.tree,s=!0,l=!0,g=!0,C=!0,I=!1,B=!1,Q=!0,h=JSON,f=void 0,m=JSON,v={parse:eIA,stringify:nl},S=[m1A],k=S[0].id,M=rg,x=void 0,F=void 0,z=AIA,P=rg,Z=rg,AA=rg,W=rg,CA=ge=>{console.error(ge),alert(ge.toString())},wA=rg,BA=rg,QA=L(e,"content",13,n),RA=L(e,"selection",13,o),IA=L(e,"readOnly",13,a),dA=L(e,"indentation",13,2),_A=L(e,"tabSize",13,4),VA=L(e,"truncateTextSize",13,1e3),he=L(e,"mode",13,r),HA=L(e,"mainMenuBar",13,s),vA=L(e,"navigationBar",13,l),PA=L(e,"statusBar",13,g),et=L(e,"askToFormat",13,C),We=L(e,"escapeControlCharacters",13,I),OA=L(e,"escapeUnicodeCharacters",13,B),EA=L(e,"flattenColumns",13,Q),XA=L(e,"parser",13,h),pA=L(e,"validator",13,f),Ae=L(e,"validationParser",13,m),NA=L(e,"pathParser",13,v),Ne=L(e,"queryLanguages",13,S),YA=L(e,"queryLanguageId",13,k),DA=L(e,"onChangeQueryLanguage",13,M),Kt=L(e,"onChange",13,x),pt=L(e,"onSelect",13,F),ue=L(e,"onRenderValue",13,z),Ot=L(e,"onClassName",13,P),He=L(e,"onRenderMenu",13,Z),je=L(e,"onRenderContextMenu",13,AA),ft=L(e,"onChangeMode",13,W),Fe=L(e,"onError",13,CA),ri=L(e,"onFocus",13,wA),j=L(e,"onBlur",13,BA),X=cA(CE(),!0),tA=cA(!1,!0),nA=cA(void 0,!0),UA=cA(void 0,!0),de=cA(void 0,!0),pe=cA(void 0,!0),GA=cA(XA(),!0);function JA(){return QA()}function Qt(ge){t("set");var wi=XS(ge);if(wi)throw new Error(wi);N(X,CE()),QA(ge),Fo()}function nt(ge){t("update");var wi=XS(ge);if(wi)throw new Error(wi);QA(ge),Fo()}function ze(ge){var wi=c(nA).patch(ge);return Fo(),wi}function Ye(ge){RA(ge),Fo()}function di(ge,wi){c(nA).expand(ge,wi),Fo()}function Cn(ge){var wi=arguments.length>1&&arguments[1]!==void 0&&arguments[1];c(nA).collapse(ge,wi),Fo()}function Qn(){var ge=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};c(nA).transform(ge),Fo()}function Je(){return c(nA).validate()}function an(){var ge=c(nA).acceptAutoRepair();return Fo(),ge}function ki(ge){return Ki.apply(this,arguments)}function Ki(){return(Ki=Pt(function*(ge){yield c(nA).scrollTo(ge)})).apply(this,arguments)}function An(ge){return c(nA).findElement(ge)}function Mt(){c(nA).focus(),Fo()}function rn(){return Ut.apply(this,arguments)}function Ut(){return(Ut=Pt(function*(){yield c(nA).refresh()})).apply(this,arguments)}function U(ge){var wi,In,fn,Po,wa,Ri,ho,Va,bo,La,Hn,Ji,Vt,Gn,Qo,Go,SA,$A,ve,hA,FA,le,Ge,rt,gt,xt,zn,Yi,ji,$t,Oi,Da=Object.keys(ge);for(var Tt of Da)switch(Tt){case"content":QA((wi=ge[Tt])!==null&&wi!==void 0?wi:n);break;case"selection":RA((In=ge[Tt])!==null&&In!==void 0?In:o);break;case"readOnly":IA((fn=ge[Tt])!==null&&fn!==void 0?fn:a);break;case"indentation":dA((Po=ge[Tt])!==null&&Po!==void 0?Po:2);break;case"tabSize":_A((wa=ge[Tt])!==null&&wa!==void 0?wa:4);break;case"truncateTextSize":VA((Ri=ge[Tt])!==null&&Ri!==void 0?Ri:1e3);break;case"mode":he((ho=ge[Tt])!==null&&ho!==void 0?ho:r);break;case"mainMenuBar":HA((Va=ge[Tt])!==null&&Va!==void 0?Va:s);break;case"navigationBar":vA((bo=ge[Tt])!==null&&bo!==void 0?bo:l);break;case"statusBar":PA((La=ge[Tt])!==null&&La!==void 0?La:g);break;case"askToFormat":et((Hn=ge[Tt])!==null&&Hn!==void 0?Hn:C);break;case"escapeControlCharacters":We((Ji=ge[Tt])!==null&&Ji!==void 0?Ji:I);break;case"escapeUnicodeCharacters":OA((Vt=ge[Tt])!==null&&Vt!==void 0?Vt:B);break;case"flattenColumns":EA((Gn=ge[Tt])!==null&&Gn!==void 0?Gn:Q);break;case"parser":XA((Qo=ge[Tt])!==null&&Qo!==void 0?Qo:h);break;case"validator":pA((Go=ge[Tt])!==null&&Go!==void 0?Go:f);break;case"validationParser":Ae((SA=ge[Tt])!==null&&SA!==void 0?SA:m);break;case"pathParser":NA(($A=ge[Tt])!==null&&$A!==void 0?$A:v);break;case"queryLanguages":Ne((ve=ge[Tt])!==null&&ve!==void 0?ve:S);break;case"queryLanguageId":YA((hA=ge[Tt])!==null&&hA!==void 0?hA:k);break;case"onChangeQueryLanguage":DA((FA=ge[Tt])!==null&&FA!==void 0?FA:M);break;case"onChange":Kt((le=ge[Tt])!==null&&le!==void 0?le:x);break;case"onRenderValue":ue((Ge=ge[Tt])!==null&&Ge!==void 0?Ge:z);break;case"onClassName":Ot((rt=ge[Tt])!==null&&rt!==void 0?rt:P);break;case"onRenderMenu":He((gt=ge[Tt])!==null&>!==void 0?gt:Z);break;case"onRenderContextMenu":je((xt=ge[Tt])!==null&&xt!==void 0?xt:AA);break;case"onChangeMode":ft((zn=ge[Tt])!==null&&zn!==void 0?zn:W);break;case"onSelect":pt((Yi=ge[Tt])!==null&&Yi!==void 0?Yi:F);break;case"onError":Fe((ji=ge[Tt])!==null&&ji!==void 0?ji:CA);break;case"onFocus":ri(($t=ge[Tt])!==null&&$t!==void 0?$t:wA);break;case"onBlur":j((Oi=ge[Tt])!==null&&Oi!==void 0?Oi:BA);break;default:ct(Tt)}function ct(Hi){t('Unknown property "'.concat(Hi,'"'))}Ne().some(Hi=>Hi.id===YA())||YA(Ne()[0].id),Fo()}function Bt(){return ui.apply(this,arguments)}function ui(){return(ui=Pt(function*(){throw new Error("class method destroy() is deprecated. It is replaced with a method destroy() in the vanilla library.")})).apply(this,arguments)}function un(ge,wi,In){QA(ge),Kt()&&Kt()(ge,wi,In)}function pn(ge){RA(ge),pt()&&pt()(M3(ge))}function Xn(){N(tA,!0),ri()&&ri()()}function zo(){N(tA,!1),j()&&j()()}function Eo(ge){return Lo.apply(this,arguments)}function Lo(){return(Lo=Pt(function*(ge){he()!==ge&&(he(ge),Fo(),Mt(),ft()(ge))})).apply(this,arguments)}function $o(ge){t("handleChangeQueryLanguage",ge),YA(ge),DA()(ge)}function yo(ge){var{id:wi,json:In,rootPath:fn,onTransform:Po,onClose:wa}=ge;IA()||N(pe,{id:wi,json:In,rootPath:fn,indentation:dA(),truncateTextSize:VA(),escapeControlCharacters:We(),escapeUnicodeCharacters:OA(),parser:XA(),parseMemoizeOne:c(A),validationParser:Ae(),pathParser:NA(),queryLanguages:Ne(),queryLanguageId:YA(),onChangeQueryLanguage:$o,onRenderValue:ue(),onRenderMenu:Ri=>He()(Ri,{mode:he(),modal:!0,readOnly:IA()}),onRenderContextMenu:Ri=>je()(Ri,{mode:he(),modal:!0,readOnly:IA(),selection:RA()}),onClassName:Ot(),onTransform:Po,onClose:wa})}function da(ge){IA()||N(de,ge)}function Aa(ge){var{content:wi,path:In,onPatch:fn,onClose:Po}=ge;t("onJSONEditorModal",{content:wi,path:In}),N(UA,{content:wi,path:In,onPatch:fn,readOnly:IA(),indentation:dA(),tabSize:_A(),truncateTextSize:VA(),mainMenuBar:HA(),navigationBar:vA(),statusBar:PA(),askToFormat:et(),escapeControlCharacters:We(),escapeUnicodeCharacters:OA(),flattenColumns:EA(),parser:XA(),validator:void 0,validationParser:Ae(),pathParser:NA(),onRenderValue:ue(),onClassName:Ot(),onRenderMenu:He(),onRenderContextMenu:je(),onSortModal:da,onTransformModal:yo,onClose:Po})}function sa(ge){ge.stopPropagation()}KA(()=>(J(XA()),c(GA),J(QA()),CE),()=>{if(!aq(XA(),c(GA))){if(t("parser changed, recreate editor"),uu(QA())){var ge=c(GA).stringify(QA().json);QA({json:ge!==void 0?XA().parse(ge):void 0})}N(GA,XA()),N(X,CE())}}),KA(()=>J(QA()),()=>{var ge=XS(QA());ge&&console.error("Error: "+ge)}),KA(()=>J(RA()),()=>{RA()===null&&console.warn("selection is invalid: it is null but should be undefined")}),KA(()=>J(XA()),()=>{N(A,pB(XA().parse))}),KA(()=>J(he()),()=>{t("mode changed to",he())}),Ln();var vo={get:JA,set:Qt,update:nt,patch:ze,select:Ye,expand:di,collapse:Cn,transform:Qn,validate:Je,acceptAutoRepair:an,scrollTo:ki,findElement:An,focus:Mt,refresh:rn,updateProps:U,destroy:Bt};return ai(!0),Mk(i,{children:(ge,wi)=>{var In,fn=ZEA(),Po=it(fn);qj(gA(Po),()=>c(X),Hn=>{Ho(WP(Hn,{get externalMode(){return he()},get content(){return QA()},get selection(){return RA()},get readOnly(){return IA()},get indentation(){return dA()},get tabSize(){return _A()},get truncateTextSize(){return VA()},get statusBar(){return PA()},get askToFormat(){return et()},get mainMenuBar(){return HA()},get navigationBar(){return vA()},get escapeControlCharacters(){return We()},get escapeUnicodeCharacters(){return OA()},get flattenColumns(){return EA()},get parser(){return XA()},get parseMemoizeOne(){return c(A)},get validator(){return pA()},get validationParser(){return Ae()},get pathParser(){return NA()},insideModal:!1,get onError(){return Fe()},onChange:un,onChangeMode:Eo,onSelect:pn,get onRenderValue(){return ue()},get onClassName(){return Ot()},onFocus:Xn,onBlur:zo,get onRenderMenu(){return He()},get onRenderContextMenu(){return je()},onSortModal:da,onTransformModal:yo,onJSONEditorModal:Aa,$$legacy:!0}),Ji=>N(nA,Ji),()=>c(nA))});var wa=kA(Po,2),Ri=Hn=>{(function(Ji,Vt){var Gn,Qo;Ft(Vt,!1);var Go=cA(void 0,!0),SA=cA(void 0,!0),$A=cA(void 0,!0),ve=cA(void 0,!0),hA=tr("jsoneditor:SortModal"),FA=L(Vt,"id",9),le=L(Vt,"json",9),Ge=L(Vt,"rootPath",9),rt=L(Vt,"onSort",9),gt=L(Vt,"onClose",9),xt={value:1,label:"ascending"},zn=[xt,{value:-1,label:"descending"}],Yi="".concat(FA(),":").concat(bt(Ge())),ji=cA((Gn=rE()[Yi])===null||Gn===void 0?void 0:Gn.selectedProperty,!0),$t=cA(((Qo=rE()[Yi])===null||Qo===void 0?void 0:Qo.selectedDirection)||xt,!0),Oi=cA(void 0,!0);function Da(){try{var ct,Hi,en;N(Oi,void 0);var $n=((ct=c(ji))===null||ct===void 0?void 0:ct.value)||((Hi=c(ve))===null||Hi===void 0||(Hi=Hi[0])===null||Hi===void 0?void 0:Hi.value)||[],mn=(en=c($t))===null||en===void 0?void 0:en.value,Rt=Zq(le(),Ge(),$n,mn);rt()!==void 0&&Ge()!==void 0&&rt()({operations:Rt,rootPath:Ge(),itemPath:$n,direction:mn}),gt()()}catch(la){N(Oi,String(la))}}function Tt(ct){ct.focus()}KA(()=>(J(le()),J(Ge())),()=>{N(Go,Ze(le(),Ge()))}),KA(()=>c(Go),()=>{N(SA,Array.isArray(c(Go)))}),KA(()=>(c(SA),c(Go)),()=>{N($A,c(SA)?vk(c(Go)):void 0)}),KA(()=>(c($A),S2),()=>{N(ve,c($A)?c($A).map(S2):void 0)}),KA(()=>(rE(),c(ji),c($t)),()=>{rE(rE()[Yi]={selectedProperty:c(ji),selectedDirection:c($t)}),hA("store state in memory",Yi,rE()[Yi])}),Ln(),ai(!0),bu(Ji,{get onClose(){return gt()},className:"jse-sort-modal",children:(ct,Hi)=>{var en=WEA(),$n=it(en),mn=at(()=>c(SA)?"Sort array items":"Sort object keys");pw($n,{get title(){return c(mn)},get onClose(){return gt()}});var Rt=gA(kA($n,2)),la=kA(gA(Rt)),jo=gA(la),D=kA(gA(jo)),b=gA(D),R=kA(jo),V=re=>{var Qe=qEA(),Pe=kA(gA(Qe));yI(gA(Pe),{showChevron:!0,get items(){return c(ve)},get value(){return c(ji)},set value(Le){N(ji,Le)},$$legacy:!0}),sA(re,Qe)};zA(R,re=>{c(SA),c(ve),uA(()=>{var Qe;return c(SA)&&c(ve)&&((Qe=c(ve))===null||Qe===void 0?void 0:Qe.length)>1})&&re(V)});var _=kA(R),q=kA(gA(_));yI(gA(q),{showChevron:!0,clearable:!1,get items(){return zn},get value(){return c($t)},set value(re){N($t,re)},$$legacy:!0});var eA=kA(Rt,2),aA=gA(eA),yA=re=>{var Qe=VEA(),Pe=gA(Qe);_e(()=>Gt(Pe,c(Oi))),sA(re,Qe)};zA(aA,re=>{c(Oi)&&re(yA)});var ne=gA(kA(eA,2));Mr(()=>we("click",ne,Da)),Es(ne,re=>Tt?.(re)),_e(re=>{GI(b,re),ne.disabled=(c(SA),c(ve),c(ji),uA(()=>{var Qe;return!!(c(SA)&&c(ve)&&((Qe=c(ve))===null||Qe===void 0?void 0:Qe.length)>1)&&!c(ji)}))},[()=>(J(Ge()),J(zi),J(nl),uA(()=>Ge()&&!zi(Ge())?nl(Ge()):"(document root)"))]),sA(ct,en)},$$slots:{default:!0}}),Lt()})(Hn,K2(()=>c(de),{onClose:()=>{var Ji;(Ji=c(de))===null||Ji===void 0||Ji.onClose(),N(de,void 0)}}))};zA(wa,Hn=>{c(de)&&Hn(Ri)});var ho=kA(wa,2),Va=Hn=>{eEA(Hn,K2(()=>c(pe),{onClose:()=>{var Ji;(Ji=c(pe))===null||Ji===void 0||Ji.onClose(),N(pe,void 0)}}))};zA(ho,Hn=>{c(pe)&&Hn(Va)});var bo=kA(ho,2),La=Hn=>{(function(Ji,Vt){Ft(Vt,!1);var Gn=cA(void 0,!0),Qo=cA(void 0,!0),Go=cA(void 0,!0),SA=cA(void 0,!0),$A=tr("jsoneditor:JSONEditorModal"),ve=L(Vt,"content",9),hA=L(Vt,"path",9),FA=L(Vt,"onPatch",9),le=L(Vt,"readOnly",9),Ge=L(Vt,"indentation",9),rt=L(Vt,"tabSize",9),gt=L(Vt,"truncateTextSize",9),xt=L(Vt,"mainMenuBar",9),zn=L(Vt,"navigationBar",9),Yi=L(Vt,"statusBar",9),ji=L(Vt,"askToFormat",9),$t=L(Vt,"escapeControlCharacters",9),Oi=L(Vt,"escapeUnicodeCharacters",9),Da=L(Vt,"flattenColumns",9),Tt=L(Vt,"parser",9),ct=L(Vt,"validator",9),Hi=L(Vt,"validationParser",9),en=L(Vt,"pathParser",9),$n=L(Vt,"onRenderValue",9),mn=L(Vt,"onClassName",9),Rt=L(Vt,"onRenderMenu",9),la=L(Vt,"onRenderContextMenu",9),jo=L(Vt,"onSortModal",9),D=L(Vt,"onTransformModal",9),b=L(Vt,"onClose",9),R=cA(void 0,!0),V=cA(void 0,!0),_={mode:aA(ve()),content:ve(),selection:void 0,relativePath:hA()},q=cA([_],!0),eA=cA(void 0,!0);function aA(fA){return uu(fA)&&Zo(fA.json)?ma.table:ma.tree}function yA(){var fA,ZA=(fA=Ni(c(q)))===null||fA===void 0?void 0:fA.selection;wu(ZA)&&c(R).scrollTo(dt(ZA))}function ne(){if($A("handleApply"),!le())try{N(eA,void 0);var fA=c(Gn).relativePath,ZA=c(Gn).content,Te=[{op:"replace",path:bt(fA),value:rP(ZA,Tt()).json}];if(c(q).length>1){var be=rP(c(q)[c(q).length-2].content,Tt()).json,Se={json:Ps(be,Te)},st=ke(ke({},c(q)[c(q).length-2]||_),{},{content:Se});N(q,[...c(q).slice(0,c(q).length-2),st]),Fo(),yA()}else FA()(Te),b()()}catch(Wt){N(eA,String(Wt))}}function re(){if($A("handleClose"),c(V))N(V,!1);else if(c(q).length>1){var fA;N(q,Vi(c(q))),Fo(),(fA=c(R))===null||fA===void 0||fA.focus(),yA(),N(eA,void 0)}else b()()}function Qe(fA){$A("handleChange",fA),Ue(ZA=>ke(ke({},ZA),{},{content:fA}))}function Pe(fA){$A("handleChangeSelection",fA),Ue(ZA=>ke(ke({},ZA),{},{selection:fA}))}function Le(fA){$A("handleChangeMode",fA),Ue(ZA=>ke(ke({},ZA),{},{mode:fA}))}function Ue(fA){var ZA=fA(Ni(c(q)));N(q,[...Vi(c(q)),ZA])}function li(fA){N(eA,fA.toString()),console.error(fA)}function Pn(fA){var ZA,{content:Te,path:be}=fA;$A("handleJSONEditorModal",{content:Te,path:be});var Se={mode:aA(Te),content:Te,selection:void 0,relativePath:be};N(q,[...c(q),Se]),Fo(),(ZA=c(R))===null||ZA===void 0||ZA.focus()}function $(fA){fA.focus()}Vr(()=>{var fA;(fA=c(R))===null||fA===void 0||fA.focus()}),KA(()=>c(q),()=>{N(Gn,Ni(c(q))||_)}),KA(()=>c(q),()=>{N(Qo,c(q).flatMap(fA=>fA.relativePath))}),KA(()=>(c(Qo),nl),()=>{N(Go,zi(c(Qo))?"(document root)":nl(c(Qo)))}),KA(()=>J(Tt()),()=>{N(SA,pB(Tt().parse))}),Ln(),ai(!0),bu(Ji,{onClose:re,className:"jse-jsoneditor-modal",get fullscreen(){return c(V)},children:(fA,ZA)=>{var Te=PEA();Mk(gA(Te),{children:(be,Se)=>{var st=zEA(),Wt=it(st),Ui=at(()=>(c(q),uA(()=>c(q).length>1?" (".concat(c(q).length,")"):"")));pw(Wt,{get title(){var ei;return"Edit nested content ".concat((ei=c(Ui))!==null&&ei!==void 0?ei:"")},fullScreenButton:!0,onClose:re,get fullscreen(){return c(V)},set fullscreen(ei){N(V,ei)},$$legacy:!0});var Kn=kA(Wt,2),tn=kA(gA(Kn),2),uo=kA(tn,4);Ho(WP(gA(uo),{get externalMode(){return c(Gn),uA(()=>c(Gn).mode)},get content(){return c(Gn),uA(()=>c(Gn).content)},get selection(){return c(Gn),uA(()=>c(Gn).selection)},get readOnly(){return le()},get indentation(){return Ge()},get tabSize(){return rt()},get truncateTextSize(){return gt()},get statusBar(){return Yi()},get askToFormat(){return ji()},get mainMenuBar(){return xt()},get navigationBar(){return zn()},get escapeControlCharacters(){return $t()},get escapeUnicodeCharacters(){return Oi()},get flattenColumns(){return Da()},get parser(){return Tt()},get parseMemoizeOne(){return c(SA)},get validator(){return ct()},get validationParser(){return Hi()},get pathParser(){return en()},insideModal:!0,onError:li,onChange:Qe,onChangeMode:Le,onSelect:Pe,get onRenderValue(){return $n()},get onClassName(){return mn()},get onFocus(){return rg},get onBlur(){return rg},get onRenderMenu(){return Rt()},get onRenderContextMenu(){return la()},get onSortModal(){return jo()},get onTransformModal(){return D()},onJSONEditorModal:Pn,$$legacy:!0}),ei=>N(R,ei),()=>c(R));var Ai=gA(kA(uo,2)),ea=ei=>{var vt=JEA(),Bi=gA(vt);_e(()=>Gt(Bi,c(eA))),sA(ei,vt)};zA(Ai,ei=>{c(eA)&&ei(ea)});var Ao=kA(Ai,2),ta=ei=>{var vt=YEA();on(gA(vt),{get data(){return kT}}),we("click",vt,re),sA(ei,vt)};zA(Ao,ei=>{c(q),uA(()=>c(q).length>1)&&ei(ta)});var wn=kA(Ao,2),Jt=ei=>{var vt=OEA();Mr(()=>we("click",vt,ne)),Es(vt,Bi=>$?.(Bi)),sA(ei,vt)},sn=ei=>{var vt=HEA();we("click",vt,re),sA(ei,vt)};zA(wn,ei=>{le()?ei(sn,!1):ei(Jt)}),_e(()=>GI(tn,c(Go))),sA(be,st)},$$slots:{default:!0}}),sA(fA,Te)},$$slots:{default:!0}}),Lt()})(Hn,K2(()=>c(UA),{onClose:()=>{var Ji;(Ji=c(UA))===null||Ji===void 0||Ji.onClose(),N(UA,void 0)}}))};zA(bo,Hn=>{c(UA)&&Hn(La)}),_e(()=>In=oi(Po,1,"jse-main svelte-1l55585",null,In,{"jse-focus":c(tA)})),we("keydown",Po,sa),sA(ge,fn)},$$slots:{default:!0}}),qt(e,"get",JA),qt(e,"set",Qt),qt(e,"update",nt),qt(e,"patch",ze),qt(e,"select",Ye),qt(e,"expand",di),qt(e,"collapse",Cn),qt(e,"transform",Qn),qt(e,"validate",Je),qt(e,"acceptAutoRepair",an),qt(e,"scrollTo",ki),qt(e,"findElement",An),qt(e,"focus",Mt),qt(e,"refresh",rn),qt(e,"updateProps",U),qt(e,"destroy",Bt),Lt(vo)}function gV(i){var{target:e,props:A}=i,t=T2A(XEA,{target:e,props:A});return t.destroy=Pt(function*(){return(function(n,o){var a=wk.get(n);return a?(wk.delete(n),a(o)):Promise.resolve()})(t)}),Fo(),t}var cc=class i{constructor(e){this.el=e}jsonString;editor=null;ngAfterViewInit(){let e={text:this.jsonString};setTimeout(()=>{this.editor=gV({target:document.getElementById("json-editor"),props:{content:e,mode:ma.text,mainMenuBar:!1,statusBar:!1}})})}getJsonString(){return this.editor?.get().text}static \u0275fac=function(A){return new(A||i)(ot(se))};static \u0275cmp=bA({type:i,selectors:[["app-json-editor"]],inputs:{jsonString:"jsonString"},decls:1,vars:0,consts:[["id","json-editor",1,"json-editor-container","jse-theme-dark"]],template:function(A,t){A&1&&Jn(0,"div",0)},styles:[".jse-theme-dark[_ngcontent-%COMP%]{--jse-theme: dark;--jse-theme-color: #2f6dd0;--jse-theme-color-highlight: #467cd2;--jse-background-color: #1e1e1e;--jse-text-color: #d4d4d4;--jse-text-color-inverse: #4d4d4d;--jse-main-border: 1px solid #4f4f4f;--jse-menu-color: #fff;--jse-modal-background: #2f2f2f;--jse-modal-overlay-background: rgba(0, 0, 0, .5);--jse-modal-code-background: #2f2f2f;--jse-tooltip-color: var(--jse-text-color);--jse-tooltip-background: #4b4b4b;--jse-tooltip-border: 1px solid #737373;--jse-tooltip-action-button-color: inherit;--jse-tooltip-action-button-background: #737373;--jse-panel-background: #333333;--jse-panel-background-border: 1px solid #464646;--jse-panel-color: var(--jse-text-color);--jse-panel-color-readonly: #737373;--jse-panel-border: 1px solid #3c3c3c;--jse-panel-button-color-highlight: #e5e5e5;--jse-panel-button-background-highlight: #464646;--jse-navigation-bar-background: #656565;--jse-navigation-bar-background-highlight: #7e7e7e;--jse-navigation-bar-dropdown-color: var(--jse-text-color);--jse-context-menu-background: #4b4b4b;--jse-context-menu-background-highlight: #595959;--jse-context-menu-separator-color: #595959;--jse-context-menu-color: var(--jse-text-color);--jse-context-menu-pointer-background: #737373;--jse-context-menu-pointer-background-highlight: #818181;--jse-context-menu-pointer-color: var(--jse-context-menu-color);--jse-key-color: #9cdcfe;--jse-value-color: var(--jse-text-color);--jse-value-color-number: #b5cea8;--jse-value-color-boolean: #569cd6;--jse-value-color-null: #569cd6;--jse-value-color-string: #ce9178;--jse-value-color-url: #ce9178;--jse-delimiter-color: #949494;--jse-edit-outline: 2px solid var(--jse-text-color);--jse-selection-background-color: #464646;--jse-selection-background-inactive-color: #333333;--jse-hover-background-color: #343434;--jse-active-line-background-color: rgba(255, 255, 255, .06);--jse-search-match-background-color: #343434;--jse-collapsed-items-background-color: #333333;--jse-collapsed-items-selected-background-color: #565656;--jse-collapsed-items-link-color: #b2b2b2;--jse-collapsed-items-link-color-highlight: #ec8477;--jse-search-match-color: #724c27;--jse-search-match-outline: 1px solid #966535;--jse-search-match-active-color: #9f6c39;--jse-search-match-active-outline: 1px solid #bb7f43;--jse-tag-background: #444444;--jse-tag-color: #bdbdbd;--jse-table-header-background: #333333;--jse-table-header-background-highlight: #424242;--jse-table-row-odd-background: rgba(255, 255, 255, .1);--jse-input-background: #3d3d3d;--jse-input-border: var(--jse-main-border);--jse-button-background: #808080;--jse-button-background-highlight: #7a7a7a;--jse-button-color: #e0e0e0;--jse-button-secondary-background: #494949;--jse-button-secondary-background-highlight: #5d5d5d;--jse-button-secondary-background-disabled: #9d9d9d;--jse-button-secondary-color: var(--jse-text-color);--jse-a-color: #55abff;--jse-a-color-highlight: #4387c9;--jse-svelte-select-background: #3d3d3d;--jse-svelte-select-border: 1px solid #4f4f4f;--list-background: #3d3d3d;--item-hover-bg: #505050;--multi-item-bg: #5b5b5b;--input-color: #d4d4d4;--multi-clear-bg: #8a8a8a;--multi-item-clear-icon-color: #d4d4d4;--multi-item-outline: 1px solid #696969;--list-shadow: 0 2px 8px 0 rgba(0, 0, 0, .4);--jse-color-picker-background: #656565;--jse-color-picker-border-box-shadow: #8c8c8c 0 0 0 1px}.json-editor-container[_ngcontent-%COMP%]{height:100%} .jse-message.jse-error{display:none} .cm-gutters.cm-gutters-before{display:none} .jse-text-mode{border-radius:10px} .jse-contents{border-radius:10px;border-bottom:1px solid #4f4f4f}"]})};var $EA=(i,e)=>e.name;function AhA(i,e){if(i&1&&y(0),i&2){let A=p();Be(" Configure ",A.selectedBuiltInTool," ")}}function ehA(i,e){if(i&1&&y(0),i&2){let A=p();Be(" ",A.isEditMode?"Edit Built-in Tool":"Add Built-in Tool"," ")}}function thA(i,e){if(i&1){let A=rA();d(0,"div",8),T("click",function(){let n=G(A).$implicit,o=p(3);return K(o.onToolSelected(n))}),d(1,"mat-icon",9),y(2),E(),d(3,"span",10),y(4),E()()}if(i&2){let A=e.$implicit,t=p(3);xA("selected",t.selectedBuiltInTool===A),u(2),iA(t.getToolIcon(A)),u(2),iA(A)}}function ihA(i,e){if(i&1&&(d(0,"div",4)(1,"h3",5),y(2),E(),d(3,"div",6),xe(4,thA,5,4,"div",7,ni),E()()),i&2){let A=e.$implicit;u(2),iA(A.name),u(2),Re(A.tools)}}function nhA(i,e){if(i&1&&(d(0,"div",1),xe(1,ihA,6,1,"div",4,$EA),E()),i&2){let A=p();u(),Re(A.toolCategories)}}function ohA(i,e){if(i&1&&(d(0,"div",2)(1,"h3",11),y(2,"Configure Tool Arguments"),E(),lA(3,"app-json-editor",12),E()),i&2){let A=p();u(3),H("jsonString",A.toolArgsString)}}function ahA(i,e){if(i&1){let A=rA();d(0,"button",14),T("click",function(){G(A);let n=p(2);return K(n.backToToolSelection())}),y(1,"Back"),E()}}function rhA(i,e){if(i&1){let A=rA();Y(0,ahA,2,0,"button",13),d(1,"button",14),T("click",function(){G(A);let n=p();return K(n.saveArgs())}),y(2),E()}if(i&2){let A=p();O(A.isEditMode?-1:0),u(2),iA(A.isEditMode?"Save":"Create")}}function shA(i,e){if(i&1){let A=rA();d(0,"button",14),T("click",function(){G(A);let n=p();return K(n.cancel())}),y(1,"Cancel"),E(),d(2,"button",15),T("click",function(){G(A);let n=p();return K(n.addTool())}),y(3),E()}if(i&2){let A=p();u(3),Be(" ",A.isEditMode?"Save":"Create"," ")}}var OI=class i{constructor(e,A){this.data=e;this.dialogRef=A}jsonEditorComponent;selectedBuiltInTool="google_search";toolCategories=[{name:"Search Tools",tools:["google_search","EnterpriseWebSearchTool","VertexAiSearchTool"]},{name:"Context Tools",tools:["FilesRetrieval","load_memory","preload_memory","url_context","VertexAiRagRetrieval"]},{name:"Agent Function Tools",tools:["exit_loop","get_user_choice","load_artifacts","LongRunningFunctionTool"]}];builtInToolArgs=new Map([["EnterpriseWebSearchTool",[]],["exit_loop",[]],["FilesRetrieval",["name","description","input_dir"]],["get_user_choice",[]],["google_search",[]],["load_artifacts",[]],["load_memory",[]],["LongRunningFunctionTool",["func"]],["preload_memory",[]],["url_context",[]],["VertexAiRagRetrieval",["name","description","rag_corpora","rag_resources","similarity_top_k","vector_distance_threshold"]],["VertexAiSearchTool",["data_store_id","data_store_specs","search_engine_id","filter","max_results"]]]);isEditMode=!1;showArgsEditor=!1;toolArgs={};toolArgsString="";ngOnInit(){if(this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName){this.selectedBuiltInTool=this.data.toolName;let e=this.builtInToolArgs.get(this.data.toolName);if(e&&e.length>0){if(this.data.toolArgs)this.toolArgs=oA({},this.data.toolArgs),delete this.toolArgs.skip_summarization;else{this.toolArgs={};for(let A of e)this.toolArgs[A]=""}this.toolArgsString=JSON.stringify(this.toolArgs,null,2),this.showArgsEditor=!0}}}onToolSelected(e){this.selectedBuiltInTool=e;let A=this.builtInToolArgs.get(e);A&&A.length>0&&(this.initializeToolArgs(e,A),this.showArgsEditor=!0)}initializeToolArgs(e,A){this.toolArgs={};for(let t of A)this.toolArgs[t]="";this.toolArgsString=JSON.stringify(this.toolArgs,null,2)}backToToolSelection(){this.showArgsEditor=!1,this.toolArgs={},this.toolArgsString=""}saveArgs(){if(this.jsonEditorComponent)try{this.toolArgsString=this.jsonEditorComponent.getJsonString(),this.toolArgs=JSON.parse(this.toolArgsString)}catch(e){alert("Invalid JSON: "+e);return}this.addTool()}addTool(){let e={toolType:"Built-in tool",name:this.selectedBuiltInTool,isEditMode:this.isEditMode};Object.keys(this.toolArgs).length>0&&(e.args=this.toolArgs),this.dialogRef.close(e)}cancel(){this.dialogRef.close()}getToolIcon(e){return EB(e,"Built-in tool")}static \u0275fac=function(A){return new(A||i)(ot(xo),ot(Vn))};static \u0275cmp=bA({type:i,selectors:[["app-built-in-tool-dialog"]],viewQuery:function(A,t){if(A&1&&Yt(cc,5),A&2){let n;oe(n=ae())&&(t.jsonEditorComponent=n.first)}},decls:9,vars:3,consts:[["mat-dialog-title","",1,"dialog-title"],[1,"tool-categories-container"],[1,"args-editor-container"],["align","end"],[1,"tool-category"],[1,"category-title"],[1,"tool-list"],[1,"tool-item",3,"selected"],[1,"tool-item",3,"click"],[1,"tool-icon"],[1,"tool-name"],[1,"args-editor-title"],[3,"jsonString"],["mat-button",""],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,t){A&1&&(d(0,"h2",0),Y(1,AhA,1,1)(2,ehA,1,1),E(),d(3,"mat-dialog-content"),Y(4,nhA,3,0,"div",1)(5,ohA,4,1,"div",2),E(),d(6,"mat-dialog-actions",3),Y(7,rhA,3,2)(8,shA,4,1),E()),A&2&&(u(),O(t.showArgsEditor?1:2),u(3),O(t.showArgsEditor?5:4),u(3),O(t.showArgsEditor?7:8))},dependencies:[si,cn,na,ua,zt,pa,Si,cc],styles:[".dialog-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-subhead-color)!important;font-family:Google Sans;font-size:24px}.tool-categories-container[_ngcontent-%COMP%]{padding:16px 0}.tool-category[_ngcontent-%COMP%]{margin-bottom:24px}.tool-category[_ngcontent-%COMP%]:last-child{margin-bottom:0}.category-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin:0 0 12px;padding-left:8px}.tool-list[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;padding:12px 16px;border-radius:8px;cursor:pointer;transition:all .2s ease;border:1px solid var(--builder-tool-item-border-color);min-width:0}.tool-item.selected[_ngcontent-%COMP%]{border:1px solid #8ab4f8}.tool-item[_ngcontent-%COMP%] .tool-icon[_ngcontent-%COMP%]{color:#8ab4f8;margin-right:12px;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-item[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%]{font-family:Google Sans;font-size:14px;color:var(--mdc-dialog-supporting-text-color)!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.args-editor-container[_ngcontent-%COMP%]{padding:16px 0}.args-editor-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin:0 0 16px}"]})};function lhA(i,e){if(i&1){let A=rA();Il(0),d(1,"div",6)(2,"div",7),T("click",function(){G(A);let n=p();return K(n.toggleToolInfo())}),d(3,"mat-icon",8),y(4,"info"),E(),d(5,"div",9)(6,"span"),y(7,"Tool Information"),E()(),d(8,"button",10)(9,"mat-icon"),y(10),E()()(),d(11,"div",11)(12,"div",12)(13,"div",13),y(14),E(),d(15,"div",14),y(16),E()(),d(17,"div",15)(18,"a",16)(19,"mat-icon"),y(20,"open_in_new"),E(),d(21,"span"),y(22,"View Official Documentation"),E()()()()(),dl()}if(i&2){let A,t,n,o=p();u(10),iA(o.isToolInfoExpanded?"expand_less":"expand_more"),u(),xA("expanded",o.isToolInfoExpanded),u(3),iA((A=o.getToolInfo())==null?null:A.shortDescription),u(2),iA((t=o.getToolInfo())==null?null:t.detailedDescription),u(2),H("href",(n=o.getToolInfo())==null?null:n.docLink,so)}}function ghA(i,e){i&1&&(d(0,"mat-hint",19),y(1," Start with a letter or underscore, and contain only letters, digits, and underscores. "),E())}function chA(i,e){if(i&1){let A=rA();d(0,"mat-form-field",2)(1,"mat-label"),y(2),E(),d(3,"input",17),yi("ngModelChange",function(n){G(A);let o=p();return hi(o.inputValue,n)||(o.inputValue=n),K(n)}),T("keydown",function(n){G(A);let o=p();return K(o.onKeyDown(n))}),E(),yt(4,ghA,2,0,"mat-hint",18),E()}if(i&2){let A=p();u(2),iA(A.data.inputLabel||"Input"),u(),Di("ngModel",A.inputValue),H("placeholder",A.data.inputPlaceholder||"Enter value"),u(),H("ngIf",!A.isInputValid())}}var Cc=class i{constructor(e,A){this.dialogRef=e;this.data=A;this.inputValue=A.inputValue||""}inputValue="";isToolInfoExpanded=!1;isInputValid(){let e=this.inputValue.trim();return!(!e||!/^[a-zA-Z_]/.test(e)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))}onCancel(){this.dialogRef.close()}onConfirm(){if(this.data.showInput){let e=this.inputValue.trim();if(!this.isInputValid())return;this.dialogRef.close(e)}else this.dialogRef.close("confirm")}onKeyDown(e){e.key==="Enter"&&this.data.showInput&&this.onConfirm()}getToolInfo(){if(this.data.toolType)return Hg.getToolDetailedInfo(this.data.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \u0275fac=function(A){return new(A||i)(ot(Vn),ot(xo))};static \u0275cmp=bA({type:i,selectors:[["app-confirmation-dialog"]],decls:12,vars:6,consts:[["mat-dialog-title",""],[4,"ngIf"],[2,"width","100%","margin-top","16px"],["align","end"],["mat-button","",3,"click"],["mat-button","","color","primary","cdkFocusInitial","",3,"click","disabled"],[1,"tool-info-container"],[1,"tool-info-header",3,"click"],[1,"tool-info-icon"],[1,"tool-info-title"],["mat-icon-button","","type","button","aria-label","Toggle tool information",1,"tool-info-toggle"],[1,"tool-info-body"],[1,"tool-info-content"],[1,"tool-info-short"],[1,"tool-info-detailed"],[1,"tool-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"tool-info-link",3,"href"],["matInput","","cdkFocusInitial","",3,"ngModelChange","keydown","ngModel","placeholder"],["style","font-size: 11px; color: #666;",4,"ngIf"],[2,"font-size","11px","color","#666"]],template:function(A,t){A&1&&(d(0,"h2",0),y(1),E(),d(2,"mat-dialog-content"),yt(3,lhA,23,6,"ng-container",1),d(4,"p"),y(5),E(),Y(6,chA,5,4,"mat-form-field",2),E(),d(7,"mat-dialog-actions",3)(8,"button",4),T("click",function(){return t.onCancel()}),y(9,"Cancel"),E(),d(10,"button",5),T("click",function(){return t.onConfirm()}),y(11),E()()),A&2&&(u(),iA(t.data.title),u(2),H("ngIf",t.data.showToolInfo&&t.getToolInfo()),u(2),iA(t.data.message),u(),O(t.data.showInput?6:-1),u(4),H("disabled",t.data.showInput&&!t.isInputValid()),u(),Be(" ",t.data.confirmButtonText||"Confirm"," "))},dependencies:[si,Ll,Wi,Si,vi,zt,na,ua,pa,Ta,To,us,w1,Gs,Qa,cn,yn,vn,_o],styles:["mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px;color:var(--mdc-dialog-supporting-text-color)}mat-dialog-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)}.tool-info-container[_ngcontent-%COMP%]{border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:var(--mdc-dialog-supporting-text-color)!important;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};var IV=["*",[["mat-chip-avatar"],["","matChipAvatar",""]],[["mat-chip-trailing-icon"],["","matChipRemove",""],["","matChipTrailingIcon",""]]],dV=["*","mat-chip-avatar, [matChipAvatar]","mat-chip-trailing-icon,[matChipRemove],[matChipTrailingIcon]"];function ChA(i,e){i&1&&(d(0,"span",3),Ve(1,1),E())}function IhA(i,e){i&1&&(d(0,"span",6),Ve(1,2),E())}function dhA(i,e){i&1&&(d(0,"span",3),Ve(1,1),d(2,"span",7),It(),d(3,"svg",8),lA(4,"path",9),E()()())}function BhA(i,e){i&1&&(d(0,"span",6),Ve(1,2),E())}var EhA=`.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}@media(forced-colors: active){.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{forced-color-adjust:none}}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-outline-width, 1px);border-radius:var(--mat-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mat-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--secondary{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mat-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mat-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mat-chip-with-avatar-avatar-size, 24px);height:var(--mat-chip-with-avatar-avatar-size, 24px);font-size:var(--mat-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__graphic{padding-left:0}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mat-chip-container-shape-radius, 8px);height:var(--mat-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mat-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mat-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mat-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mat-chip-with-icon-icon-size, 18px);height:var(--mat-chip-with-icon-icon-size, 18px);font-size:var(--mat-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mat-chip-with-icon-icon-color: var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mat-chip-elevated-container-color: var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mat-chip-label-text-color: var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mat-chip-outline-width: var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mat-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mat-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-edit,.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-edit:focus,.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-edit:hover::after,.mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-chip-edit:focus::after,.mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:focus::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:hover::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mat-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-edit::before,.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus-visible .mat-focus-indicator::before{content:""}.mdc-evolution-chip__icon,.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{min-height:fit-content}img.mdc-evolution-chip__icon{min-height:0} +`;var BV=["*"],hhA=`.mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-moz-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-webkit-input-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input:-ms-input-placeholder{opacity:1}.mat-mdc-chip-set+input.mat-mdc-chip-input{margin-left:0;margin-right:0} +`,b_=new MA("mat-chips-default-options",{providedIn:"root",factory:()=>({separatorKeyCodes:[13]})}),D_=new MA("MatChipAvatar"),cV=new MA("MatChipTrailingIcon"),CV=new MA("MatChipEdit"),y_=new MA("MatChipRemove"),M_=new MA("MatChip"),EV=(()=>{class i{_elementRef=w(se);_parentChip=w(M_);_isPrimary=!0;_isLeading=!1;get disabled(){return this._disabled||this._parentChip?.disabled||!1}set disabled(A){this._disabled=A}_disabled=!1;tabIndex=-1;_allowFocusWhenDisabled=!1;_getDisabledAttribute(){return this.disabled&&!this._allowFocusWhenDisabled?"":null}constructor(){w(io).load(rr),this._elementRef.nativeElement.nodeName==="BUTTON"&&this._elementRef.nativeElement.setAttribute("type","button")}focus(){this._elementRef.nativeElement.focus()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","matChipContent",""]],hostAttrs:[1,"mat-mdc-chip-action","mdc-evolution-chip__action","mdc-evolution-chip__action--presentational"],hostVars:8,hostBindings:function(t,n){t&2&&(ee("disabled",n._getDisabledAttribute())("aria-disabled",n.disabled),xA("mdc-evolution-chip__action--primary",n._isPrimary)("mdc-evolution-chip__action--secondary",!n._isPrimary)("mdc-evolution-chip__action--trailing",!n._isPrimary&&!n._isLeading))},inputs:{disabled:[2,"disabled","disabled",Ee],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?-1:dn(A)],_allowFocusWhenDisabled:"_allowFocusWhenDisabled"}})}return i})(),S_=(()=>{class i extends EV{_getTabindex(){return this.disabled&&!this._allowFocusWhenDisabled?null:this.tabIndex.toString()}_handleClick(A){!this.disabled&&this._isPrimary&&(A.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!this.disabled&&this._isPrimary&&!this._parentChip._isEditing&&(A.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["","matChipAction",""]],hostVars:3,hostBindings:function(t,n){t&1&&T("click",function(a){return n._handleClick(a)})("keydown",function(a){return n._handleKeydown(a)}),t&2&&(ee("tabindex",n._getTabindex()),xA("mdc-evolution-chip__action--presentational",!1))},features:[mt]})}return i})(),hV=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["mat-chip-avatar"],["","matChipAvatar",""]],hostAttrs:["role","img",1,"mat-mdc-chip-avatar","mdc-evolution-chip__icon","mdc-evolution-chip__icon--primary"],features:[Et([{provide:D_,useExisting:i}])]})}return i})();var QV=(()=>{class i extends S_{_isPrimary=!1;_handleClick(A){this.disabled||(A.stopPropagation(),A.preventDefault(),this._parentChip.remove())}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!this.disabled&&(A.stopPropagation(),A.preventDefault(),this._parentChip.remove())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["","matChipRemove",""]],hostAttrs:["role","button",1,"mat-mdc-chip-remove","mat-mdc-chip-trailing-icon","mat-focus-indicator","mdc-evolution-chip__icon","mdc-evolution-chip__icon--trailing"],hostVars:1,hostBindings:function(t,n){t&2&&ee("aria-hidden",null)},features:[Et([{provide:y_,useExisting:i}]),mt]})}return i})(),Ju=(()=>{class i{_changeDetectorRef=w(wt);_elementRef=w(se);_tagName=w(cR);_ngZone=w(qe);_focusMonitor=w(Wa);_globalRippleOptions=w(FC,{optional:!0});_document=w(ii);_onFocus=new te;_onBlur=new te;_isBasicChip=!1;role=null;_hasFocusInternal=!1;_pendingFocus=!1;_actionChanges;_animationsDisabled=nn();_allLeadingIcons;_allTrailingIcons;_allEditIcons;_allRemoveIcons;_hasFocus(){return this._hasFocusInternal}id=w(Bn).getId("mat-mdc-chip-");ariaLabel=null;ariaDescription=null;_chipListDisabled=!1;_hadFocusOnRemove=!1;_textElement;get value(){return this._value!==void 0?this._value:this._textElement.textContent.trim()}set value(A){this._value=A}_value;color;removable=!0;highlighted=!1;disableRipple=!1;get disabled(){return this._disabled||this._chipListDisabled}set disabled(A){this._disabled=A}_disabled=!1;removed=new LA;destroyed=new LA;basicChipAttrName="mat-basic-chip";leadingIcon;editIcon;trailingIcon;removeIcon;primaryAction;_rippleLoader=w(np);_injector=w(Dt);constructor(){let A=w(io);A.load(rr),A.load(RC),this._monitorFocus(),this._rippleLoader?.configureRipple(this._elementRef.nativeElement,{className:"mat-mdc-chip-ripple",disabled:this._isRippleDisabled()})}ngOnInit(){this._isBasicChip=this._elementRef.nativeElement.hasAttribute(this.basicChipAttrName)||this._tagName.toLowerCase()===this.basicChipAttrName}ngAfterViewInit(){this._textElement=this._elementRef.nativeElement.querySelector(".mat-mdc-chip-action-label"),this._pendingFocus&&(this._pendingFocus=!1,this.focus())}ngAfterContentInit(){this._actionChanges=Ti(this._allLeadingIcons.changes,this._allTrailingIcons.changes,this._allEditIcons.changes,this._allRemoveIcons.changes).subscribe(()=>this._changeDetectorRef.markForCheck())}ngDoCheck(){this._rippleLoader.setDisabled(this._elementRef.nativeElement,this._isRippleDisabled())}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement),this._actionChanges?.unsubscribe(),this.destroyed.emit({chip:this}),this.destroyed.complete()}remove(){this.removable&&(this._hadFocusOnRemove=this._hasFocus(),this.removed.emit({chip:this}))}_isRippleDisabled(){return this.disabled||this.disableRipple||this._animationsDisabled||this._isBasicChip||!this._hasInteractiveActions()||!!this._globalRippleOptions?.disabled}_hasTrailingIcon(){return!!(this.trailingIcon||this.removeIcon)}_handleKeydown(A){(A.keyCode===8&&!A.repeat||A.keyCode===46)&&(A.preventDefault(),this.remove())}focus(){this.disabled||(this.primaryAction?this.primaryAction.focus():this._pendingFocus=!0)}_getSourceAction(A){return this._getActions().find(t=>{let n=t._elementRef.nativeElement;return n===A||n.contains(A)})}_getActions(){let A=[];return this.editIcon&&A.push(this.editIcon),this.primaryAction&&A.push(this.primaryAction),this.removeIcon&&A.push(this.removeIcon),A}_handlePrimaryActionInteraction(){}_hasInteractiveActions(){return this._getActions().length>0}_edit(A){}_monitorFocus(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{let t=A!==null;t!==this._hasFocusInternal&&(this._hasFocusInternal=t,t?this._onFocus.next({chip:this}):(this._changeDetectorRef.markForCheck(),setTimeout(()=>this._ngZone.run(()=>this._onBlur.next({chip:this})))))})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-basic-chip"],["","mat-basic-chip",""],["mat-chip"],["","mat-chip",""]],contentQueries:function(t,n,o){if(t&1&&Vo(o,D_,5)(o,CV,5)(o,cV,5)(o,y_,5)(o,D_,5)(o,cV,5)(o,CV,5)(o,y_,5),t&2){let a;oe(a=ae())&&(n.leadingIcon=a.first),oe(a=ae())&&(n.editIcon=a.first),oe(a=ae())&&(n.trailingIcon=a.first),oe(a=ae())&&(n.removeIcon=a.first),oe(a=ae())&&(n._allLeadingIcons=a),oe(a=ae())&&(n._allTrailingIcons=a),oe(a=ae())&&(n._allEditIcons=a),oe(a=ae())&&(n._allRemoveIcons=a)}},viewQuery:function(t,n){if(t&1&&Yt(S_,5),t&2){let o;oe(o=ae())&&(n.primaryAction=o.first)}},hostAttrs:[1,"mat-mdc-chip"],hostVars:31,hostBindings:function(t,n){t&1&&T("keydown",function(a){return n._handleKeydown(a)}),t&2&&(Ea("id",n.id),ee("role",n.role)("aria-label",n.ariaLabel),go("mat-"+(n.color||"primary")),xA("mdc-evolution-chip",!n._isBasicChip)("mdc-evolution-chip--disabled",n.disabled)("mdc-evolution-chip--with-trailing-action",n._hasTrailingIcon())("mdc-evolution-chip--with-primary-graphic",n.leadingIcon)("mdc-evolution-chip--with-primary-icon",n.leadingIcon)("mdc-evolution-chip--with-avatar",n.leadingIcon)("mat-mdc-chip-with-avatar",n.leadingIcon)("mat-mdc-chip-highlighted",n.highlighted)("mat-mdc-chip-disabled",n.disabled)("mat-mdc-basic-chip",n._isBasicChip)("mat-mdc-standard-chip",!n._isBasicChip)("mat-mdc-chip-with-trailing-icon",n._hasTrailingIcon())("_mat-animation-noopable",n._animationsDisabled))},inputs:{role:"role",id:"id",ariaLabel:[0,"aria-label","ariaLabel"],ariaDescription:[0,"aria-description","ariaDescription"],value:"value",color:"color",removable:[2,"removable","removable",Ee],highlighted:[2,"highlighted","highlighted",Ee],disableRipple:[2,"disableRipple","disableRipple",Ee],disabled:[2,"disabled","disabled",Ee]},outputs:{removed:"removed",destroyed:"destroyed"},exportAs:["matChip"],features:[Et([{provide:M_,useExisting:i}])],ngContentSelectors:dV,decls:8,vars:2,consts:[[1,"mat-mdc-chip-focus-overlay"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary"],["matChipContent",""],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],[1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"]],template:function(t,n){t&1&&(Nt(IV),lA(0,"span",0),d(1,"span",1)(2,"span",2),Y(3,ChA,2,0,"span",3),d(4,"span",4),Ve(5),lA(6,"span",5),E()()(),Y(7,IhA,2,0,"span",6)),t&2&&(u(3),O(n.leadingIcon?3:-1),u(4),O(n._hasTrailingIcon()?7:-1))},dependencies:[EV],styles:[`.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}@media(forced-colors: active){.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{forced-color-adjust:none}}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-outline-width, 1px);border-radius:var(--mat-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mat-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--secondary{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mat-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mat-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mat-chip-with-avatar-avatar-size, 24px);height:var(--mat-chip-with-avatar-avatar-size, 24px);font-size:var(--mat-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__graphic{padding-left:0}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mat-chip-container-shape-radius, 8px);height:var(--mat-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mat-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mat-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mat-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mat-chip-with-icon-icon-size, 18px);height:var(--mat-chip-with-icon-icon-size, 18px);font-size:var(--mat-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mat-chip-with-icon-icon-color: var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mat-chip-elevated-container-color: var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mat-chip-label-text-color: var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mat-chip-outline-width: var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mat-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mat-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-edit,.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-edit:focus,.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-edit:hover::after,.mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-chip-edit:focus::after,.mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:focus::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:hover::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mat-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-edit::before,.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus-visible .mat-focus-indicator::before{content:""}.mdc-evolution-chip__icon,.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{min-height:fit-content}img.mdc-evolution-chip__icon{min-height:0} +`],encapsulation:2,changeDetection:0})}return i})();var k_=(()=>{class i extends Ju{_defaultOptions=w(b_,{optional:!0});chipListSelectable=!0;_chipListMultiple=!1;_chipListHideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get selectable(){return this._selectable&&this.chipListSelectable}set selectable(A){this._selectable=A,this._changeDetectorRef.markForCheck()}_selectable=!0;get selected(){return this._selected}set selected(A){this._setSelectedState(A,!1,!0)}_selected=!1;get ariaSelected(){return this.selectable?this.selected.toString():null}basicChipAttrName="mat-basic-chip-option";selectionChange=new LA;ngOnInit(){super.ngOnInit(),this.role="presentation"}select(){this._setSelectedState(!0,!1,!0)}deselect(){this._setSelectedState(!1,!1,!0)}selectViaInteraction(){this._setSelectedState(!0,!0,!0)}toggleSelected(A=!1){return this._setSelectedState(!this.selected,A,!0),this.selected}_handlePrimaryActionInteraction(){this.disabled||(this.focus(),this.selectable&&this.toggleSelected(!0))}_hasLeadingGraphic(){return this.leadingIcon?!0:!this._chipListHideSingleSelectionIndicator||this._chipListMultiple}_setSelectedState(A,t,n){A!==this.selected&&(this._selected=A,n&&this.selectionChange.emit({source:this,isUserInput:t,selected:this.selected}),this._changeDetectorRef.markForCheck())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275cmp=bA({type:i,selectors:[["mat-basic-chip-option"],["","mat-basic-chip-option",""],["mat-chip-option"],["","mat-chip-option",""]],hostAttrs:[1,"mat-mdc-chip","mat-mdc-chip-option"],hostVars:37,hostBindings:function(t,n){t&2&&(Ea("id",n.id),ee("tabindex",null)("aria-label",null)("aria-description",null)("role",n.role),xA("mdc-evolution-chip",!n._isBasicChip)("mdc-evolution-chip--filter",!n._isBasicChip)("mdc-evolution-chip--selectable",!n._isBasicChip)("mat-mdc-chip-selected",n.selected)("mat-mdc-chip-multiple",n._chipListMultiple)("mat-mdc-chip-disabled",n.disabled)("mat-mdc-chip-with-avatar",n.leadingIcon)("mdc-evolution-chip--disabled",n.disabled)("mdc-evolution-chip--selected",n.selected)("mdc-evolution-chip--selecting",!n._animationsDisabled)("mdc-evolution-chip--with-trailing-action",n._hasTrailingIcon())("mdc-evolution-chip--with-primary-icon",n.leadingIcon)("mdc-evolution-chip--with-primary-graphic",n._hasLeadingGraphic())("mdc-evolution-chip--with-avatar",n.leadingIcon)("mat-mdc-chip-highlighted",n.highlighted)("mat-mdc-chip-with-trailing-icon",n._hasTrailingIcon()))},inputs:{selectable:[2,"selectable","selectable",Ee],selected:[2,"selected","selected",Ee]},outputs:{selectionChange:"selectionChange"},features:[Et([{provide:Ju,useExisting:i},{provide:M_,useExisting:i}]),mt],ngContentSelectors:dV,decls:8,vars:6,consts:[[1,"mat-mdc-chip-focus-overlay"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary"],["matChipAction","","role","option",3,"_allowFocusWhenDisabled"],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],[1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"],[1,"mdc-evolution-chip__checkmark"],["viewBox","-2 -3 30 30","focusable","false","aria-hidden","true",1,"mdc-evolution-chip__checkmark-svg"],["fill","none","stroke","currentColor","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-evolution-chip__checkmark-path"]],template:function(t,n){t&1&&(Nt(IV),lA(0,"span",0),d(1,"span",1)(2,"button",2),Y(3,dhA,5,0,"span",3),d(4,"span",4),Ve(5),lA(6,"span",5),E()()(),Y(7,BhA,2,0,"span",6)),t&2&&(u(2),H("_allowFocusWhenDisabled",!0),ee("aria-description",n.ariaDescription)("aria-label",n.ariaLabel)("aria-selected",n.ariaSelected),u(),O(n._hasLeadingGraphic()?3:-1),u(4),O(n._hasTrailingIcon()?7:-1))},dependencies:[S_],styles:[EhA],encapsulation:2,changeDetection:0})}return i})();var __=(()=>{class i{_elementRef=w(se);_changeDetectorRef=w(wt);_dir=w(fo,{optional:!0});_lastDestroyedFocusedChipIndex=null;_keyManager;_destroyed=new te;_defaultRole="presentation";get chipFocusChanges(){return this._getChipStream(A=>A._onFocus)}get chipDestroyedChanges(){return this._getChipStream(A=>A.destroyed)}get chipRemovedChanges(){return this._getChipStream(A=>A.removed)}get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._syncChipsState()}_disabled=!1;get empty(){return!this._chips||this._chips.length===0}get role(){return this._explicitRole?this._explicitRole:this.empty?null:this._defaultRole}tabIndex=0;set role(A){this._explicitRole=A}_explicitRole=null;get focused(){return this._hasFocusedChip()}_chips;_chipActions=new pg;constructor(){}ngAfterViewInit(){this._setUpFocusManagement(),this._trackChipSetChanges(),this._trackDestroyedFocusedChip()}ngOnDestroy(){this._keyManager?.destroy(),this._chipActions.destroy(),this._destroyed.next(),this._destroyed.complete()}_hasFocusedChip(){return this._chips&&this._chips.some(A=>A._hasFocus())}_syncChipsState(){this._chips?.forEach(A=>{A._chipListDisabled=this._disabled,A._changeDetectorRef.markForCheck()})}focus(){}_handleKeydown(A){this._originatesFromChip(A)&&this._keyManager.onKeydown(A)}_isValidIndex(A){return A>=0&&Athis._elementRef.nativeElement.tabIndex=A))}_getChipStream(A){return this._chips.changes.pipe(kn(null),pi(()=>Ti(...this._chips.map(A))))}_originatesFromChip(A){let t=A.target;for(;t&&t!==this._elementRef.nativeElement;){if(t.classList.contains("mat-mdc-chip"))return!0;t=t.parentElement}return!1}_setUpFocusManagement(){this._chips.changes.pipe(kn(this._chips)).subscribe(A=>{let t=[];A.forEach(n=>n._getActions().forEach(o=>t.push(o))),this._chipActions.reset(t),this._chipActions.notifyOnChanges()}),this._keyManager=new y0(this._chipActions).withVerticalOrientation().withHorizontalOrientation(this._dir?this._dir.value:"ltr").withHomeAndEnd().skipPredicate(A=>this._skipPredicate(A)),this.chipFocusChanges.pipe(ut(this._destroyed)).subscribe(({chip:A})=>{let t=A._getSourceAction(document.activeElement);t&&this._keyManager.updateActiveItem(t)}),this._dir?.change.pipe(ut(this._destroyed)).subscribe(A=>this._keyManager.withHorizontalOrientation(A))}_skipPredicate(A){return A.disabled}_trackChipSetChanges(){this._chips.changes.pipe(kn(null),ut(this._destroyed)).subscribe(()=>{this.disabled&&Promise.resolve().then(()=>this._syncChipsState()),this._redirectDestroyedChipFocus()})}_trackDestroyedFocusedChip(){this.chipDestroyedChanges.pipe(ut(this._destroyed)).subscribe(A=>{let n=this._chips.toArray().indexOf(A.chip),o=A.chip._hasFocus(),a=A.chip._hadFocusOnRemove&&this._keyManager.activeItem&&A.chip._getActions().includes(this._keyManager.activeItem),r=o||a;this._isValidIndex(n)&&r&&(this._lastDestroyedFocusedChipIndex=n)})}_redirectDestroyedChipFocus(){if(this._lastDestroyedFocusedChipIndex!=null){if(this._chips.length){let A=Math.min(this._lastDestroyedFocusedChipIndex,this._chips.length-1),t=this._chips.toArray()[A];t.disabled?this._chips.length===1?this.focus():this._keyManager.setPreviousItemActive():t.focus()}else this.focus();this._lastDestroyedFocusedChipIndex=null}}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-chip-set"]],contentQueries:function(t,n,o){if(t&1&&Vo(o,Ju,5),t&2){let a;oe(a=ae())&&(n._chips=a)}},hostAttrs:[1,"mat-mdc-chip-set","mdc-evolution-chip-set"],hostVars:1,hostBindings:function(t,n){t&1&&T("keydown",function(a){return n._handleKeydown(a)}),t&2&&ee("role",n.role)},inputs:{disabled:[2,"disabled","disabled",Ee],role:"role",tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:dn(A)]},ngContentSelectors:BV,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(t,n){t&1&&(Nt(),Dn(0,"div",0),Ve(1),Tn())},styles:[`.mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-moz-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-webkit-input-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input:-ms-input-placeholder{opacity:1}.mat-mdc-chip-set+input.mat-mdc-chip-input{margin-left:0;margin-right:0} +`],encapsulation:2,changeDetection:0})}return i})(),v_=class{source;value;constructor(e,A){this.source=e,this.value=A}},QhA={provide:As,useExisting:Ga(()=>x_),multi:!0},x_=(()=>{class i extends __{_onTouched=()=>{};_onChange=()=>{};_defaultRole="listbox";_defaultOptions=w(b_,{optional:!0});get multiple(){return this._multiple}set multiple(A){this._multiple=A,this._syncListboxProperties()}_multiple=!1;get selected(){let A=this._chips.toArray().filter(t=>t.selected);return this.multiple?A:A[0]}ariaOrientation="horizontal";get selectable(){return this._selectable}set selectable(A){this._selectable=A,this._syncListboxProperties()}_selectable=!0;compareWith=(A,t)=>A===t;required=!1;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncListboxProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get chipSelectionChanges(){return this._getChipStream(A=>A.selectionChange)}get chipBlurChanges(){return this._getChipStream(A=>A._onBlur)}get value(){return this._value}set value(A){this._chips&&this._chips.length&&this._setSelectionByValue(A,!1),this._value=A}_value;change=new LA;_chips=void 0;ngAfterContentInit(){this._chips.changes.pipe(kn(null),ut(this._destroyed)).subscribe(()=>{this.value!==void 0&&Promise.resolve().then(()=>{this._setSelectionByValue(this.value,!1)}),this._syncListboxProperties()}),this.chipBlurChanges.pipe(ut(this._destroyed)).subscribe(()=>this._blur()),this.chipSelectionChanges.pipe(ut(this._destroyed)).subscribe(A=>{this.multiple||this._chips.forEach(t=>{t!==A.source&&t._setSelectedState(!1,!1,!1)}),A.isUserInput&&this._propagateChanges()})}focus(){if(this.disabled)return;let A=this._getFirstSelectedChip();A&&!A.disabled?A.focus():this._chips.length>0?this._keyManager.setFirstItemActive():this._elementRef.nativeElement.focus()}writeValue(A){A!=null?this.value=A:this.value=void 0}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}_setSelectionByValue(A,t=!0){this._clearSelection(),Array.isArray(A)?A.forEach(n=>this._selectValue(n,t)):this._selectValue(A,t)}_blur(){this.disabled||setTimeout(()=>{this.focused||this._markAsTouched()})}_keydown(A){A.keyCode===9&&super._allowFocusEscape()}_markAsTouched(){this._onTouched(),this._changeDetectorRef.markForCheck()}_propagateChanges(){let A=null;Array.isArray(this.selected)?A=this.selected.map(t=>t.value):A=this.selected?this.selected.value:void 0,this._value=A,this.change.emit(new v_(this,A)),this._onChange(A),this._changeDetectorRef.markForCheck()}_clearSelection(A){this._chips.forEach(t=>{t!==A&&t.deselect()})}_selectValue(A,t){let n=this._chips.find(o=>o.value!=null&&this.compareWith(o.value,A));return n&&(t?n.selectViaInteraction():n.select()),n}_syncListboxProperties(){this._chips&&Promise.resolve().then(()=>{this._chips.forEach(A=>{A._chipListMultiple=this.multiple,A.chipListSelectable=this._selectable,A._chipListHideSingleSelectionIndicator=this.hideSingleSelectionIndicator,A._changeDetectorRef.markForCheck()})})}_getFirstSelectedChip(){return Array.isArray(this.selected)?this.selected.length?this.selected[0]:void 0:this.selected}_skipPredicate(A){return!1}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275cmp=bA({type:i,selectors:[["mat-chip-listbox"]],contentQueries:function(t,n,o){if(t&1&&Vo(o,k_,5),t&2){let a;oe(a=ae())&&(n._chips=a)}},hostAttrs:[1,"mdc-evolution-chip-set","mat-mdc-chip-listbox"],hostVars:10,hostBindings:function(t,n){t&1&&T("focus",function(){return n.focus()})("blur",function(){return n._blur()})("keydown",function(a){return n._keydown(a)}),t&2&&(Ea("tabIndex",n.disabled||n.empty?-1:n.tabIndex),ee("role",n.role)("aria-required",n.role?n.required:null)("aria-disabled",n.disabled.toString())("aria-multiselectable",n.multiple)("aria-orientation",n.ariaOrientation),xA("mat-mdc-chip-list-disabled",n.disabled)("mat-mdc-chip-list-required",n.required))},inputs:{multiple:[2,"multiple","multiple",Ee],ariaOrientation:[0,"aria-orientation","ariaOrientation"],selectable:[2,"selectable","selectable",Ee],compareWith:"compareWith",required:[2,"required","required",Ee],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",Ee],value:"value"},outputs:{change:"change"},features:[Et([QhA]),mt],ngContentSelectors:BV,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(t,n){t&1&&(Nt(),Dn(0,"div",0),Ve(1),Tn())},styles:[hhA],encapsulation:2,changeDetection:0})}return i})();var Lw=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({providers:[fd,{provide:b_,useValue:{separatorKeyCodes:[13]}}],imports:[Sc,Qi]})}return i})();var pV=(()=>{class i{get vertical(){return this._vertical}set vertical(A){this._vertical=ur(A)}_vertical=!1;get inset(){return this._inset}set inset(A){this._inset=ur(A)}_inset=!1;static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-divider"]],hostAttrs:["role","separator",1,"mat-divider"],hostVars:7,hostBindings:function(t,n){t&2&&(ee("aria-orientation",n.vertical?"vertical":"horizontal"),xA("mat-divider-vertical",n.vertical)("mat-divider-horizontal",!n.vertical)("mat-divider-inset",n.inset))},inputs:{vertical:"vertical",inset:"inset"},decls:0,vars:0,template:function(t,n){},styles:[`.mat-divider{display:block;margin:0;border-top-style:solid;border-top-color:var(--mat-divider-color, var(--mat-sys-outline-variant));border-top-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-vertical{border-top:0;border-right-style:solid;border-right-color:var(--mat-divider-color, var(--mat-sys-outline-variant));border-right-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-inset{margin-left:80px}[dir=rtl] .mat-divider.mat-divider-inset{margin-left:auto;margin-right:80px} +`],encapsulation:2,changeDetection:0})}return i})(),fV=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Qi]})}return i})();var Gw=class i{themeService=w(jl);get currentTheme(){return this.themeService.currentTheme()}get themeIcon(){return this.currentTheme==="light"?"dark_mode":"light_mode"}get themeTooltip(){return this.currentTheme==="light"?"Switch to dark mode":"Switch to light mode"}toggleTheme(){this.themeService.toggleTheme()}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-theme-toggle"]],decls:3,vars:2,consts:[["mat-icon-button","","aria-label","Toggle theme",1,"theme-toggle-button",3,"click","matTooltip"]],template:function(A,t){A&1&&(d(0,"button",0),T("click",function(){return t.toggleTheme()}),d(1,"mat-icon"),y(2),E()()),A&2&&(H("matTooltip",t.themeTooltip),u(2),iA(t.themeIcon))},dependencies:[On,zt,Wi,vi,Ra,Zi],styles:[".theme-toggle-button[_ngcontent-%COMP%]{color:var(--side-panel-mat-icon-color);width:24px;height:24px;padding:0}.theme-toggle-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.theme-toggle-button[_ngcontent-%COMP%]:hover{opacity:.8}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color);border-radius:50%;transition:all .2s ease;margin-right:0!important}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);opacity:1}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}"]})};var mV=(i,e)=>e.name;function phA(i,e){if(i&1&&y(0),i&2){let A=p().$implicit;Be(" AgentTool: ",A.name," ")}}function fhA(i,e){if(i&1&&y(0),i&2){let A=p().$implicit;Be(" ",A.name," ")}}function mhA(i,e){i&1&&(d(0,"mat-icon",28),y(1,"chevron_right"),E())}function whA(i,e){if(i&1){let A=rA();d(0,"div",27),T("click",function(){let n=G(A).$implicit,o=p(2);return K(o.selectAgentFromBreadcrumb(n))}),Y(1,phA,1,1)(2,fhA,1,1),E(),Y(3,mhA,2,0,"mat-icon",28)}if(i&2){let A=e.$implicit,t=e.$index,n=p(2);xA("current-agent",(n.currentSelectedAgent==null?null:n.currentSelectedAgent.name)===A.name),u(),O(t===0&&n.isInAgentToolContext()?1:2),u(2),O(t0?0:-1)}}function FhA(i,e){if(i&1){let A=rA();d(0,"div",15)(1,"div",16)(2,"div"),y(3," Tools "),E(),d(4,"div")(5,"button",40,2)(7,"mat-icon"),y(8,"add"),E()(),d(9,"mat-menu",null,3)(11,"button",23),T("click",function(){G(A);let n=p();return K(n.addTool("Function tool"))}),d(12,"span"),y(13,"Function tool"),E()(),d(14,"button",23),T("click",function(){G(A);let n=p();return K(n.addTool("Built-in tool"))}),d(15,"span"),y(16,"Built-in tool"),E()(),d(17,"button",23),T("click",function(){G(A);let n=p();return K(n.createAgentTool())}),d(18,"span"),y(19,"Agent tool"),E()()()()(),Y(20,NhA,1,1),Ht(21,"async"),E()}if(i&2){let A,t=gi(10),n=p();u(5),H("matMenuTriggerFor",t),u(6),H("matTooltip",n.toolMenuTooltips("Function tool")),u(3),H("matTooltip",n.toolMenuTooltips("Built-in tool")),u(3),H("matTooltip",n.toolMenuTooltips("Agent tool")),u(3),O((A=ci(21,5,n.toolsMap$))?20:-1,A)}}function LhA(i,e){if(i&1){let A=rA();d(0,"mat-chip",43),T("click",function(){let n=G(A).$implicit,o=p(2);return K(o.selectAgent(n))}),d(1,"mat-icon",44),y(2),E(),d(3,"span",45),y(4),E(),d(5,"button",48),T("click",function(n){let o=G(A).$implicit;return p(2).deleteSubAgent(o.name),K(n.stopPropagation())}),d(6,"mat-icon"),y(7,"cancel"),E()()()}if(i&2){let A=e.$implicit,t=p(2);u(2),iA(t.getAgentIcon(A.agent_class)),u(2),iA(A.name)}}function GhA(i,e){if(i&1&&(d(0,"div",20)(1,"mat-chip-set",47),xe(2,LhA,8,2,"mat-chip",42,mV),E()()),i&2){let A=p();u(2),Re(A.agentConfig.sub_agents)}}function KhA(i,e){if(i&1){let A=rA();lA(0,"mat-divider"),d(1,"div",22),y(2,"Model (LLM) Interaction"),E(),d(3,"button",23),T("click",function(){G(A);let n=p();return K(n.addCallback("before_model"))}),d(4,"span"),y(5,"Before Model"),E()(),d(6,"button",23),T("click",function(){G(A);let n=p();return K(n.addCallback("after_model"))}),d(7,"span"),y(8,"After Model"),E()(),lA(9,"mat-divider"),d(10,"div",22),y(11,"Tool Execution"),E(),d(12,"button",23),T("click",function(){G(A);let n=p();return K(n.addCallback("before_tool"))}),d(13,"span"),y(14,"Before Tool"),E()(),d(15,"button",23),T("click",function(){G(A);let n=p();return K(n.addCallback("after_tool"))}),d(16,"span"),y(17,"After Tool"),E()()}if(i&2){let A=p();u(3),H("matTooltip",A.callbackMenuTooltips("before_model")),u(3),H("matTooltip",A.callbackMenuTooltips("after_model")),u(6),H("matTooltip",A.callbackMenuTooltips("before_tool")),u(3),H("matTooltip",A.callbackMenuTooltips("after_tool"))}}function UhA(i,e){if(i&1){let A=rA();d(0,"div",52),T("click",function(){let n=G(A).$implicit,o=p(3);return K(o.editCallback(n))}),d(1,"mat-chip",53)(2,"span",54)(3,"span",55),y(4),E(),d(5,"span",56),y(6),E()()(),d(7,"button",57),T("click",function(n){let o=G(A).$implicit,a=p(3);return a.deleteCallback(a.agentConfig.name,o),K(n.stopPropagation())}),d(8,"mat-icon"),y(9,"remove"),E()()()}if(i&2){let A=e.$implicit;u(4),iA(A.type),u(2),iA(A.name)}}function ThA(i,e){if(i&1&&(d(0,"div",49)(1,"mat-chip-set",50),xe(2,UhA,10,2,"div",51,ni),E()()),i&2){let A=p(),t=p();u(2),Re(A.get(t.agentConfig.name))}}function JhA(i,e){if(i&1&&Y(0,ThA,4,0,"div",49),i&2){let A=e,t=p();O(t.agentConfig&&A.get(t.agentConfig.name)&&A.get(t.agentConfig.name).length>0?0:-1)}}var Kw=class i{CALLBACKS_TAB_INDEX=3;jsonEditorComponent;appNameInput="";exitBuilderMode=new LA;closePanel=new LA;featureFlagService=w(mr);isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();toolArgsString=mA("");editingToolArgs=mA(!1);editingTool=null;selectedTabIndex=0;agentConfig={isRoot:!1,name:"",agent_class:"",model:"",instruction:"",sub_agents:[],tools:[],callbacks:[]};hierarchyPath=[];currentSelectedAgent=void 0;isRootAgentEditable=!0;models=["gemini-2.5-flash","gemini-2.5-pro"];agentTypes=["LlmAgent","LoopAgent","ParallelAgent","SequentialAgent"];agentBuilderService=w(Tc);dialog=w(Ja);agentService=w(Ys);snackBar=w(Uc);router=w(is);cdr=w(wt);selectedTool=void 0;toolAgentName="";toolTypes=["Custom tool","Function tool","Built-in tool","Agent Tool"];editingCallback=null;selectedCallback=void 0;callbackTypes=["before_agent","before_model","before_tool","after_tool","after_model","after_agent"];builtInTools=["EnterpriseWebSearchTool","exit_loop","FilesRetrieval","get_user_choice","google_search","load_artifacts","load_memory","LongRunningFunctionTool","preload_memory","url_context","VertexAiRagRetrieval","VertexAiSearchTool"];builtInToolArgs=new Map([["EnterpriseWebSearchTool",[]],["exit_loop",[]],["FilesRetrieval",["name","description","input_dir"]],["get_user_choice",[]],["google_search",[]],["load_artifacts",[]],["load_memory",[]],["LongRunningFunctionTool",["func"]],["preload_memory",[]],["url_context",[]],["VertexAiRagRetrieval",["name","description","rag_corpora","rag_resources","similarity_top_k","vector_distance_threshold"]],["VertexAiSearchTool",["data_store_id","data_store_specs","search_engine_id","filter","max_results"]]]);header="Select an agent or tool to edit";toolsMap$;callbacksMap$;getJsonStringForEditor(e){if(!e)return"{}";let A=oA({},e);return delete A.skip_summarization,JSON.stringify(A,null,2)}constructor(){this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.callbacksMap$=this.agentBuilderService.getAgentCallbacksMap(),this.agentBuilderService.getSelectedNode().subscribe(e=>{this.agentConfig=e,this.currentSelectedAgent=e,e&&(this.editingTool=null,this.editingCallback=null,this.header="Agent configuration",this.updateBreadcrumb(e)),this.cdr.markForCheck()}),this.agentBuilderService.getSelectedTool().subscribe(e=>{this.selectedTool=e,!(e&&e.toolType==="Agent Tool")&&(e?(this.editingTool=e,this.editingToolArgs.set(!1),setTimeout(()=>{let A=e.toolType=="Function tool"?"Function tool":e.name;if(e.toolType=="Function tool"&&!e.name&&(e.name="Function tool"),e.toolType==="Custom tool")e.args||(e.args={}),this.toolArgsString.set(this.getJsonStringForEditor(e.args)),this.editingToolArgs.set(!0);else{let t=this.builtInToolArgs.get(A);if(t){e.args||(e.args={});for(let n of t)e.args&&(e.args[n]="")}this.toolArgsString.set(this.getJsonStringForEditor(e.args)),e.args&&this.getObjectKeys(e.args).length>0&&this.editingToolArgs.set(!0)}this.cdr.markForCheck()}),this.selectedTabIndex=2):this.editingTool=null,this.cdr.markForCheck())}),this.agentBuilderService.getSelectedCallback().subscribe(e=>{this.selectedCallback=e,e?(this.selectCallback(e),this.selectedTabIndex=this.CALLBACKS_TAB_INDEX):this.editingCallback=null,this.cdr.markForCheck()}),this.agentBuilderService.getAgentCallbacks().subscribe(e=>{this.agentConfig&&e&&this.agentConfig.name===e.agentName&&(this.agentConfig=Oe(oA({},this.agentConfig),{callbacks:e.callbacks}),this.cdr.markForCheck())}),this.agentBuilderService.getSideTabChangeRequest().subscribe(e=>{e==="tools"?this.selectedTabIndex=2:e==="config"&&(this.selectedTabIndex=0)})}getObjectKeys(e){return e?Object.keys(e).filter(A=>A!=="skip_summarization"):[]}getCallbacksByType(){let e=new Map;return this.callbackTypes.forEach(A=>{e.set(A,[])}),this.agentConfig?.callbacks&&this.agentConfig.callbacks.forEach(A=>{let t=e.get(A.type);t&&t.push(A)}),e}updateBreadcrumb(e){this.hierarchyPath=this.buildHierarchyPath(e)}buildHierarchyPath(e){let A=[],t=this.findContextualRoot(e);return t?e.name===t.name?[t]:this.findPathToAgent(t,e,[t])||[e]:[e]}isInAgentToolContext(){return!this.hierarchyPath||this.hierarchyPath.length===0?!1:this.hierarchyPath[0]?.isAgentTool===!0}findContextualRoot(e){if(e.isAgentTool)return e;let A=this.agentBuilderService.getNodes();for(let n of A)if(n.isAgentTool&&this.findPathToAgent(n,e,[n]))return n;let t=this.agentBuilderService.getRootNode();if(t&&this.findPathToAgent(t,e,[t]))return t;if(e.isRoot)return e;for(let n of A)if(n.isRoot&&this.findPathToAgent(n,e,[n]))return n;return t}findPathToAgent(e,A,t){if(e.name===A.name)return t;for(let n of e.sub_agents){let o=[...t,n],a=this.findPathToAgent(n,A,o);if(a)return a}return null}selectAgentFromBreadcrumb(e){this.agentBuilderService.setSelectedNode(e),this.selectedTabIndex=0}selectAgent(e){this.agentBuilderService.setSelectedNode(e),this.selectedTabIndex=0}selectTool(e){if(e.toolType==="Agent Tool"){let A=e.name;this.agentBuilderService.requestNewTab(A);return}if(e.toolType==="Function tool"||e.toolType==="Built-in tool"){this.editTool(e);return}this.agentBuilderService.setSelectedTool(e)}editTool(e){if(!this.agentConfig)return;let A;e.toolType==="Built-in tool"?A=this.dialog.open(OI,{width:"700px",maxWidth:"90vw",data:{toolName:e.name,isEditMode:!0,toolArgs:e.args}}):A=this.dialog.open(A2,{width:"500px",data:{toolType:e.toolType,toolName:e.name,isEditMode:!0}}),A.afterClosed().subscribe(t=>{if(t&&t.isEditMode){let n=this.agentConfig.tools?.findIndex(o=>o.name===e.name);n!==void 0&&n!==-1&&this.agentConfig.tools&&(this.agentConfig.tools[n].name=t.name,t.args&&(this.agentConfig.tools[n].args=t.args),this.agentBuilderService.setAgentTools(this.agentConfig.name,this.agentConfig.tools))}})}addTool(e){if(this.agentConfig){let A;e==="Built-in tool"?A=this.dialog.open(OI,{width:"700px",maxWidth:"90vw",data:{}}):A=this.dialog.open(A2,{width:"500px",data:{toolType:e}}),A.afterClosed().subscribe(t=>{if(t){let n={toolType:t.toolType,name:t.name};this.agentBuilderService.addTool(this.agentConfig.name,n),this.agentBuilderService.setSelectedTool(n)}})}}addCallback(e){if(this.agentConfig){let A=this.agentConfig?.callbacks?.map(n=>n.name)??[];this.dialog.open(ZQ,{width:"500px",data:{callbackType:e,existingCallbackNames:A}}).afterClosed().subscribe(n=>{if(n){let o={name:n.name,type:n.type};this.agentBuilderService.addCallback(this.agentConfig.name,o)}})}}editCallback(e){if(!this.agentConfig)return;let A=this.agentConfig.callbacks?.map(n=>n.name)??[];this.dialog.open(ZQ,{width:"500px",data:{callbackType:e.type,existingCallbackNames:A,isEditMode:!0,callback:e,availableCallbackTypes:this.callbackTypes}}).afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=this.agentBuilderService.updateCallback(this.agentConfig.name,e.name,Oe(oA({},e),{name:n.name,type:n.type}));o.success?this.cdr.markForCheck():console.error("Failed to update callback:",o.error)}})}deleteCallback(e,A){this.dialog.open(Cc,{data:{title:"Delete Callback",message:`Are you sure you want to delete ${A.name}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(n=>{if(n==="confirm"){let o=this.agentBuilderService.deleteCallback(e,A);o.success?this.cdr.markForCheck():console.error("Failed to delete callback:",o.error)}})}addSubAgent(e){e&&this.agentBuilderService.setAddSubAgentSubject(e)}deleteSubAgent(e){this.agentBuilderService.setDeleteSubAgentSubject(e)}deleteTool(e,A){let t=A.toolType==="Agent Tool",n=t&&A.toolAgentName||A.name;this.dialog.open(Cc,{data:{title:t?"Delete Agent Tool":"Delete Tool",message:t?`Are you sure you want to delete the agent tool "${n}"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(a=>{if(a==="confirm")if(A.toolType==="Agent Tool"){let r=A.toolAgentName||A.name;this.deleteAgentToolAndBoard(e,A,r)}else this.agentBuilderService.deleteTool(e,A)})}deleteAgentToolAndBoard(e,A,t){this.agentBuilderService.deleteTool(e,A),this.agentBuilderService.requestTabDeletion(t)}backToToolList(){this.editingTool=null,this.agentBuilderService.setSelectedTool(void 0)}editToolArgs(){this.editingToolArgs.set(!0)}cancelEditToolArgs(e){this.editingToolArgs.set(!1),this.toolArgsString.set(this.getJsonStringForEditor(e?.args))}saveToolArgs(e){if(this.jsonEditorComponent&&e)try{let A=JSON.parse(this.jsonEditorComponent.getJsonString()),t=e.args?e.args.skip_summarization:!1;e.args=A,e.args.skip_summarization=t,this.toolArgsString.set(JSON.stringify(e.args,null,2)),this.editingToolArgs.set(!1)}catch(A){console.error("Error parsing tool arguments JSON",A)}}onToolTypeSelectionChange(e){e?.toolType==="Built-in tool"?(e.name="google_search",this.onBuiltInToolSelectionChange(e)):e?.toolType==="Custom tool"?(e.args={},this.toolArgsString.set(this.getJsonStringForEditor(e.args)),this.editingToolArgs.set(!0)):e&&(e.name="",e.args={skip_summarization:!1},this.toolArgsString.set("{}"),this.editingToolArgs.set(!1))}onBuiltInToolSelectionChange(e){e&&(this.editingToolArgs.set(!1),setTimeout(()=>{e.args={skip_summarization:!1};let A=this.builtInToolArgs.get(e.name);if(A)for(let t of A)e.args&&(e.args[t]="");this.toolArgsString.set(this.getJsonStringForEditor(e.args)),e.args&&this.getObjectKeys(e.args).length>0&&this.editingToolArgs.set(!0),this.cdr.markForCheck()}))}selectCallback(e){this.editingCallback=e}backToCallbackList(){this.editingCallback=null}onCallbackTypeChange(e){}createAgentTool(){this.dialog.open(Cc,{width:"750px",height:"450px",data:{title:"Create Agent Tool",message:"Please enter a name for the agent tool:",confirmButtonText:"Create",showInput:!0,inputLabel:"Agent Tool Name",inputPlaceholder:"Enter agent tool name",showToolInfo:!0,toolType:"Agent tool"}}).afterClosed().subscribe(A=>{if(A&&typeof A=="string"){let t=this.agentConfig?.name||"root_agent";this.agentBuilderService.requestNewTab(A,t)}})}saveChanges(){if(!this.agentBuilderService.getRootNode()){this.snackBar.open("Please create an agent first.","OK");return}this.appNameInput?this.saveAgent(this.appNameInput):this.agentService.getApp().subscribe(A=>{A?this.saveAgent(A):this.snackBar.open("No agent selected. Please select an agent first.","OK")})}cancelChanges(){this.agentService.agentChangeCancel(this.appNameInput).subscribe(e=>{}),this.exitBuilderMode.emit()}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A){this.snackBar.open("Please create an agent first.","OK");return}let t=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();jc.generateYamlFile(A,t,e,n),this.agentService.agentBuildTmp(e,t).subscribe(o=>{o&&this.agentService.agentBuild(e,t).subscribe(a=>{a?this.router.navigate(["/"],{queryParams:{app:e}}).then(()=>{window.location.reload()}):this.snackBar.open("Something went wrong, please try again","OK")})})}getToolIcon(e){return EB(e.name,e.toolType)}getAgentIcon(e){switch(e){case"SequentialAgent":return"more_horiz";case"LoopAgent":return"sync";case"ParallelAgent":return"density_medium";default:return"psychology"}}addSubAgentWithType(e){if(!this.agentConfig?.name)return;let A=this.agentConfig.agent_class!=="LlmAgent";this.agentBuilderService.setAddSubAgentSubject(this.agentConfig.name,e,A)}callbackMenuTooltips(e){return Hg.getCallbackMenuTooltips(e)}toolMenuTooltips(e){return Hg.getToolMenuTooltips(e)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-builder-tabs"]],viewQuery:function(A,t){if(A&1&&Yt(cc,5),A&2){let n;oe(n=ae())&&(t.jsonEditorComponent=n.first)}},inputs:{appNameInput:"appNameInput"},outputs:{exitBuilderMode:"exitBuilderMode",closePanel:"closePanel"},decls:77,vars:12,consts:[["subAgentMenu","matMenu"],["callbacksMenu","matMenu"],["agentMenuTrigger","matMenuTrigger"],["toolsMenu","matMenu"],[2,"margin-top","20px","margin-left","20px","display","flex"],[2,"width","100%"],[1,"drawer-header"],[1,"drawer-logo"],["src","assets/ADK-512-color.svg","width","32px","height","32px"],[2,"display","flex","align-items","center","gap","8px","margin-right","15px"],["matTooltip","Collapse panel",1,"material-symbols-outlined",2,"color","#c4c7c5","cursor","pointer",3,"click"],[1,"builder-tabs-container"],[1,"builder-tab-content"],[1,"agent-breadcrumb-container"],[1,"content-wrapper"],[1,"builder-panel-wrapper"],[1,"panel-title"],[1,"config-form"],["mat-icon-button","","type","button","aria-label","Add sub agent",1,"panel-action-button",3,"matMenuTriggerFor"],["mat-menu-item","",3,"click"],[1,"tools-chips-container"],["mat-icon-button","","type","button","aria-label","Add callback",1,"panel-action-button",3,"matMenuTriggerFor"],[1,"menu-header"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[1,"action-buttons"],["mat-raised-button","","color","secondary",1,"save-button",3,"click"],["mat-button","",1,"cancel-button",3,"click"],[1,"breadcrumb-chip",3,"click"],[1,"breadcrumb-arrow"],[1,"form-row"],[1,"agent-name-field"],["matInput","",3,"ngModelChange","ngModel","disabled"],[1,"agent-type-field"],["disabled","",3,"ngModelChange","ngModel"],[3,"value"],[3,"ngModel"],[3,"ngModelChange","ngModel"],["matInput","","rows","5",3,"ngModelChange","ngModel"],["matInput","","rows","3",3,"ngModelChange","ngModel"],["matInput","","type","number","min","1",3,"ngModelChange","ngModel"],["mat-icon-button","","type","button","aria-label","Add tool",1,"panel-action-button",3,"matMenuTriggerFor"],["aria-label","Tools"],[1,"tool-chip"],[1,"tool-chip",3,"click"],["matChipAvatar","",1,"tool-icon"],[1,"tool-chip-name"],["matChipRemove","","aria-label","Remove tool",3,"click"],["aria-label","Sub Agents"],["matChipRemove","","aria-label","Remove sub agent",3,"click"],[1,"tools-chips-container","callbacks-list"],["aria-label","Callbacks"],[1,"callback-row"],[1,"callback-row",3,"click"],[1,"callback-chip"],[1,"chip-content"],[1,"chip-type"],[1,"chip-name"],["mat-icon-button","","aria-label","Remove callback",1,"callback-remove",3,"click"]],template:function(A,t){if(A&1&&(d(0,"div",4)(1,"div",5)(2,"div",6)(3,"div",7),lA(4,"img",8),y(5," Agent Development Kit "),E(),d(6,"div",9),lA(7,"app-theme-toggle"),d(8,"span",10),T("click",function(){return t.closePanel.emit()}),y(9,"left_panel_close"),E()()()()(),d(10,"div",11)(11,"div",12),Y(12,DhA,3,0,"div",13),d(13,"div",14)(14,"div",15)(15,"div",16),y(16," Configuration "),E(),d(17,"div"),Y(18,_hA,16,7,"div",17),E()(),Y(19,FhA,22,7,"div",15),d(20,"div",15)(21,"div",16)(22,"div"),y(23," Sub Agents "),E(),d(24,"div")(25,"button",18)(26,"mat-icon"),y(27,"add"),E()(),d(28,"mat-menu",null,0)(30,"button",19),T("click",function(){return t.addSubAgentWithType("LlmAgent")}),d(31,"mat-icon"),y(32,"psychology"),E(),d(33,"span"),y(34,"LLM Agent"),E()(),d(35,"button",19),T("click",function(){return t.addSubAgentWithType("SequentialAgent")}),d(36,"mat-icon"),y(37,"more_horiz"),E(),d(38,"span"),y(39,"Sequential Agent"),E()(),d(40,"button",19),T("click",function(){return t.addSubAgentWithType("LoopAgent")}),d(41,"mat-icon"),y(42,"sync"),E(),d(43,"span"),y(44,"Loop Agent"),E()(),d(45,"button",19),T("click",function(){return t.addSubAgentWithType("ParallelAgent")}),d(46,"mat-icon"),y(47,"density_medium"),E(),d(48,"span"),y(49,"Parallel Agent"),E()()()()(),Y(50,GhA,4,0,"div",20),E(),d(51,"div",15)(52,"div",16)(53,"div"),y(54," Callbacks "),E(),d(55,"div")(56,"button",21)(57,"mat-icon"),y(58,"add"),E()(),d(59,"mat-menu",null,1)(61,"div",22),y(62,"Agent Lifecycle"),E(),d(63,"button",23),T("click",function(){return t.addCallback("before_agent")}),d(64,"span"),y(65,"Before Agent"),E()(),d(66,"button",23),T("click",function(){return t.addCallback("after_agent")}),d(67,"span"),y(68,"After Agent"),E()(),Y(69,KhA,18,4),E()()(),Y(70,JhA,1,1),Ht(71,"async"),E()(),d(72,"div",24)(73,"button",25),T("click",function(){return t.saveChanges()}),y(74," Save "),E(),d(75,"button",26),T("click",function(){return t.cancelChanges()}),y(76," Cancel "),E()()()()),A&2){let n,o=gi(29),a=gi(60);u(12),O(t.hierarchyPath.length>0?12:-1),u(6),O(t.agentConfig?18:-1),u(),O((t.agentConfig==null?null:t.agentConfig.agent_class)==="LlmAgent"?19:-1),u(6),H("matMenuTriggerFor",o),u(25),O(t.agentConfig&&t.agentConfig.sub_agents&&t.agentConfig.sub_agents.length>0?50:-1),u(6),H("matMenuTriggerFor",a),u(7),H("matTooltip",t.callbackMenuTooltips("before_agent")),u(3),H("matTooltip",t.callbackMenuTooltips("after_agent")),u(3),O((t.agentConfig==null?null:t.agentConfig.agent_class)==="LlmAgent"?69:-1),u(),O((n=ci(71,10,t.callbacksMap$))?70:-1,n)}},dependencies:[si,cn,yn,Nh,vn,ay,_o,Si,Og,WU,To,zt,Qa,vi,us,Kr,zl,Zi,ns,Hl,Ds,Lw,Ju,hV,QV,__,fV,pV,Gw,$r],styles:[".builder-tabs-container[_ngcontent-%COMP%]{width:100%;margin-top:40px;height:calc(95vh - 20px);display:flex;flex-direction:column}.agent-breadcrumb-container[_ngcontent-%COMP%]{padding:2px 20px 8px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;border-bottom:1px solid var(--builder-border-color)}.breadcrumb-chip[_ngcontent-%COMP%]{color:var(--builder-text-muted-color);font-family:Google Sans;font-size:16px;font-weight:500;border:none;cursor:pointer;transition:all .2s ease;padding:4px 8px;border-radius:4px;display:inline-block;-webkit-user-select:none;user-select:none}.breadcrumb-chip[_ngcontent-%COMP%]:hover{color:var(--builder-text-link-color)}.breadcrumb-chip.current-agent[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-weight:500}.breadcrumb-arrow[_ngcontent-%COMP%]{color:var(--builder-breadcrumb-separator-color);font-size:16px;width:16px;height:16px}.builder-tab-content[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);display:flex;flex-direction:column;flex:1;overflow:hidden}.builder-tab-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:8px 0;font-size:14px;line-height:1.5}.components-section[_ngcontent-%COMP%]{margin-bottom:32px}.components-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:14px;font-weight:500;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.config-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;margin-top:20px}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%]{display:flex;gap:16px;align-items:flex-start}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%] .agent-name-field[_ngcontent-%COMP%]{flex:1}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%] .agent-type-field[_ngcontent-%COMP%]{width:32%}.config-form[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.config-form[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{margin-bottom:8px}.config-form[_ngcontent-%COMP%] .tool-code-section[_ngcontent-%COMP%]{margin-top:16px}.config-form[_ngcontent-%COMP%] .tool-code-section[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0 0 8px;color:var(--builder-text-secondary-color);font-size:14px;font-weight:500}.config-form[_ngcontent-%COMP%] .tool-args-header[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:14px;font-weight:500;letter-spacing:.5px;text-transform:uppercase}.json-editor-wrapper[_ngcontent-%COMP%]{height:300px;max-height:300px}.tab-content-container[_ngcontent-%COMP%]{margin-top:20px;overflow-y:auto}.agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px}.sub-agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px;margin-left:16px}.tree-view[_ngcontent-%COMP%] expand-button[_ngcontent-%COMP%]{border:0}.node-item[_ngcontent-%COMP%]{display:flex;align-items:center}.node-icon[_ngcontent-%COMP%]{margin-right:14px}.node-name[_ngcontent-%COMP%]{margin-top:2px;display:flex;align-items:center}.no-tools-message[_ngcontent-%COMP%]{display:block;color:var(--builder-text-secondary-color);font-size:16px;margin-top:16px;margin-bottom:16px;text-align:center}.tools-list[_ngcontent-%COMP%]{list-style:none;padding:0}.tool-name[_ngcontent-%COMP%]{cursor:pointer;padding:11px;border-radius:8px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;color:var(--builder-text-primary-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.tool-name[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{visibility:hidden}.tool-name[_ngcontent-%COMP%]:hover button[_ngcontent-%COMP%]{visibility:visible}.tool-list-item-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px}.tools-chips-container[_ngcontent-%COMP%]{margin-top:12px;padding:0 4px}.tools-chips-container.callbacks-list[_ngcontent-%COMP%]{padding-right:0;padding-left:0}.callback-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;width:100%;cursor:pointer}.callback-remove[_ngcontent-%COMP%]{color:var(--builder-icon-color);cursor:pointer;width:32px;height:32px;min-width:32px;min-height:32px;display:inline-flex;align-items:center;justify-content:center;padding:0}.callback-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center;transform:translateY(.5px)}.back-button[_ngcontent-%COMP%]{margin-bottom:16px}.add-tool-button[_ngcontent-%COMP%]{width:100%;border:none;border-radius:4px;margin-top:12px;cursor:pointer}.add-tool-button-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.add-tool-button-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--builder-add-button-text-color);font-family:Google Sans;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.agent-tool-section[_ngcontent-%COMP%]{margin-top:16px;padding:16px;border:1px solid var(--builder-border-color);border-radius:8px}.agent-tool-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:16px;font-weight:500;margin:0 0 8px}.agent-tool-section[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;margin:0 0 16px;line-height:1.5}.agent-tool-section[_ngcontent-%COMP%] .create-agent-tool-btn[_ngcontent-%COMP%]{color:var(--builder-button-primary-text-color);font-weight:500}.no-callbacks-message[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:16px;margin-top:16px;text-align:center}.callback-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px}.callback-section[_ngcontent-%COMP%]{margin-top:16px}.callback-section[_ngcontent-%COMP%] .callback-section-label[_ngcontent-%COMP%]{margin:0 0 8px;color:var(--builder-text-secondary-color);font-size:14px;font-weight:500;text-transform:none}.callback-groups-wrapper[_ngcontent-%COMP%]{margin-top:16px}.callback-group[_ngcontent-%COMP%]{margin-top:5px}.callback-list[_ngcontent-%COMP%]{padding:8px 0}.no-callbacks-in-type[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;font-style:italic;padding:12px;text-align:center}.callback-item[_ngcontent-%COMP%]{cursor:pointer;padding:8px 12px;border-radius:4px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;color:var(--builder-text-primary-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.callback-item[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{visibility:hidden}.callback-item[_ngcontent-%COMP%]:hover button[_ngcontent-%COMP%]{visibility:visible}.add-callback-icon[_ngcontent-%COMP%]{color:var(--builder-button-primary-background-color)}mat-tab-group[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;padding:16px 20px 0;min-height:0}mat-tab-group[_ngcontent-%COMP%]{flex:1;padding-bottom:0;display:flex;flex-direction:column;overflow:hidden}.action-buttons[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;padding:16px 20px;border-top:1px solid var(--builder-border-color);flex-shrink:0;margin-top:auto}.action-buttons[_ngcontent-%COMP%] .save-button[_ngcontent-%COMP%]{color:var(--builder-button-primary-text-color);font-weight:500}.action-buttons[_ngcontent-%COMP%] .cancel-button[_ngcontent-%COMP%]{color:var(--builder-button-secondary-text-color);border:1px solid var(--builder-button-secondary-border-color)}.action-buttons[_ngcontent-%COMP%] .cancel-button[_ngcontent-%COMP%]:hover{color:var(--builder-button-secondary-hover-text-color)}.builder-panel-wrapper[_ngcontent-%COMP%]{border-bottom:1px solid var(--builder-border-color);padding:12px 24px}.panel-title[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color);font-family:Google Sans;font-size:16px;font-style:normal;font-weight:500;line-height:24px;display:flex;justify-content:space-between}.panel-title[_ngcontent-%COMP%] .panel-action-button[_ngcontent-%COMP%]{color:var(--builder-icon-color);width:32px;height:32px;min-width:32px;min-height:32px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;padding:0}.panel-title[_ngcontent-%COMP%] .panel-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center}.content-wrapper[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:9px}.drawer-logo[_ngcontent-%COMP%]{font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center}"],changeDetection:0})};var P2=new MA("MARKDOWN_COMPONENT");var YhA=["chatMessages"],OhA=(i,e)=>({"user-message":i,"bot-message":e}),HhA=i=>({text:i,thought:!1});function zhA(i,e){i&1&&(d(0,"div",7)(1,"mat-icon",12),y(2,"smart_toy"),E(),d(3,"h3"),y(4,"Assistant Ready"),E(),d(5,"p"),y(6,"Your builder assistant is ready to help you build agents."),E()())}function PhA(i,e){i&1&&(d(0,"div",15)(1,"span",16),y(2,"\u30FB\u30FB\u30FB"),E()())}function jhA(i,e){if(i&1&&(d(0,"div",19),y(1),E()),i&2){let A=p(3).$implicit;u(),iA(A.text)}}function qhA(i,e){if(i&1&&gn(0,20),i&2){let A=p(3).$implicit,t=p(2);H("ngComponentOutlet",t.markdownComponent)("ngComponentOutletInputs",Nl(2,HhA,A.text))}}function VhA(i,e){if(i&1&&(d(0,"div",18),y(1,"Assistant"),E(),Y(2,jhA,2,1,"div",19)(3,qhA,1,4,"ng-container",20)),i&2){let A=p(2).$implicit;u(2),O(A.isError?2:3)}}function WhA(i,e){if(i&1&&(d(0,"div",17),y(1),E()),i&2){let A=p(2).$implicit;u(),iA(A.text)}}function ZhA(i,e){if(i&1&&Y(0,VhA,4,1)(1,WhA,2,1,"div",17),i&2){let A=p().$implicit;O(A.role==="bot"?0:1)}}function XhA(i,e){if(i&1&&(d(0,"div",13)(1,"mat-card",14),Y(2,PhA,3,0,"div",15)(3,ZhA,2,1),E()()),i&2){let A=e.$implicit;H("ngClass",g1(2,OhA,A.role==="user",A.role==="bot")),u(2),O(A.isLoading?2:3)}}function $hA(i,e){if(i&1&&xe(0,XhA,4,5,"div",13,ni),i&2){let A=p();Re(A.messages)}}var Uw=class i{isVisible=!0;appName="";closePanel=new LA;reloadCanvas=new LA;assistantAppName="__adk_agent_builder_assistant";userId="user";currentSession="";userMessage="";messages=[];shouldAutoScroll=!1;isGenerating=!1;chatMessages;markdownComponent=w(P2);agentService=w(Ys);sessionService=w(Os);agentBuilderService=w(Tc);constructor(){}ngOnInit(){this.sessionService.createSession(this.userId,this.assistantAppName).subscribe(e=>{this.currentSession=e.id;let A={appName:this.assistantAppName,userId:this.userId,sessionId:e.id,newMessage:{role:"user",parts:[{text:"hello"}]},streaming:!1,stateDelta:{root_directory:`${this.appName}/tmp/${this.appName}`}};this.messages.push({role:"bot",text:"",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0,this.agentService.runSse(A).subscribe({next:t=>Ie(this,null,function*(){if(t.errorCode){let n=this.messages[this.messages.length-1];n.role==="bot"&&n.isLoading&&(n.text=`Error Code: ${t.errorCode}`,n.isLoading=!1,n.isError=!0,this.shouldAutoScroll=!0),this.isGenerating=!1;return}if(t.content){let n="";for(let o of t.content.parts)o.text&&(n+=o.text);if(n){let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text=n,o.isLoading=!1,this.shouldAutoScroll=!0)}}}),error:t=>{console.error("SSE error:",t);let n=this.messages[this.messages.length-1];n.role==="bot"&&n.isLoading&&(n.text="Sorry, I encountered an error. Please try again.",n.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})})}onClosePanel(){this.closePanel.emit()}sendMessage(e){if(e.trim()){this.saveAgent(this.appName),e!="____Something went wrong, please try again"&&this.messages.push({role:"user",text:e});let A=e;this.userMessage="",this.messages.push({role:"bot",text:"",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0;let t={appName:this.assistantAppName,userId:this.userId,sessionId:this.currentSession,newMessage:{role:"user",parts:[{text:A}]},streaming:!1};this.agentService.runSse(t).subscribe({next:n=>Ie(this,null,function*(){if(n.errorCode){let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text=`Error Code: ${n.errorCode}`,o.isLoading=!1,o.isError=!0,this.shouldAutoScroll=!0),this.isGenerating=!1;return}if(n.content){let o="";for(let a of n.content.parts)a.text&&(o+=a.text);if(o){let a=this.messages[this.messages.length-1];a.role==="bot"&&a.isLoading&&(a.text=o,a.isLoading=!1,this.shouldAutoScroll=!0,this.reloadCanvas.emit())}}}),error:n=>{console.error("SSE error:",n);let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text="Sorry, I encountered an error. Please try again.",o.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})}}ngAfterViewChecked(){this.shouldAutoScroll&&(this.scrollToBottom(),this.shouldAutoScroll=!1)}scrollToBottom(){try{this.chatMessages&&setTimeout(()=>{this.chatMessages.nativeElement.scrollTop=this.chatMessages.nativeElement.scrollHeight},50)}catch(e){console.error("Error scrolling to bottom:",e)}}onKeyDown(e){if(e.key==="Enter"){if(e.shiftKey)return;this.userMessage?.trim()&&this.currentSession&&(e.preventDefault(),this.sendMessage(this.userMessage))}}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A)return;let t=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();jc.generateYamlFile(A,t,e,n),this.agentService.agentBuildTmp(e,t).subscribe(o=>{console.log(o?"save to tmp":"something went wrong")})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-builder-assistant"]],viewQuery:function(A,t){if(A&1&&Yt(YhA,5),A&2){let n;oe(n=ae())&&(t.chatMessages=n.first)}},inputs:{isVisible:"isVisible",appName:"appName"},outputs:{closePanel:"closePanel",reloadCanvas:"reloadCanvas"},decls:21,vars:6,consts:[["chatMessages",""],[1,"builder-assistant-panel"],[1,"panel-header"],[1,"panel-title"],["mat-icon-button","","matTooltip","Close assistant panel",1,"close-btn",3,"click"],[1,"panel-content"],[1,"chat-messages"],[1,"assistant-placeholder"],[1,"chat-input-container"],[1,"input-wrapper"],["cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","5","placeholder","Ask Gemini to build your agent",1,"assistant-input-box",3,"ngModelChange","keydown","ngModel","disabled"],["mat-icon-button","","matTooltip","Send message",1,"send-button",3,"click","disabled"],[1,"large-icon"],[3,"ngClass"],[1,"message-card"],[1,"loading-message"],[1,"dots"],[1,"message-text"],[1,"bot-label"],[1,"error-message"],[3,"ngComponentOutlet","ngComponentOutletInputs"]],template:function(A,t){if(A&1){let n=rA();d(0,"div",1)(1,"div",2)(2,"div",3)(3,"mat-icon"),y(4,"auto_awesome"),E(),d(5,"span"),y(6,"Assistant"),E()(),d(7,"button",4),T("click",function(){return t.onClosePanel()}),d(8,"mat-icon"),y(9,"close"),E()()(),d(10,"div",5)(11,"div",6,0),Y(13,zhA,7,0,"div",7)(14,$hA,2,0),E(),d(15,"div",8)(16,"div",9)(17,"textarea",10),yi("ngModelChange",function(a){return G(n),hi(t.userMessage,a)||(t.userMessage=a),K(a)}),T("keydown",function(a){return t.onKeyDown(a)}),E(),d(18,"button",11),T("click",function(){return t.sendMessage(t.userMessage.trim())}),d(19,"mat-icon"),y(20,"send"),E()()()()()()}A&2&&(xA("hidden",!t.isVisible),u(13),O(t.messages.length===0?13:14),u(4),Di("ngModel",t.userMessage),H("disabled",t.isGenerating),u(),H("disabled",!t.userMessage.trim()||t.isGenerating))},dependencies:[si,Fl,yc,cn,yn,vn,_o,zt,vi,Zi,gf,pd,rp],styles:[".builder-assistant-panel[_ngcontent-%COMP%]{position:fixed;right:0;top:72px;width:400px;height:calc(100vh - 72px);background-color:var(--mat-sys-surface-container);border-left:1px solid var(--mat-sys-outline-variant);box-shadow:-2px 0 10px #0006;display:flex;flex-direction:column;transition:transform .3s ease}.builder-assistant-panel.hidden[_ngcontent-%COMP%]{transform:translate(100%)}.panel-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mat-sys-outline-variant)}.panel-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-weight:400;font-size:16px;color:var(--mat-sys-on-surface);font-family:Google Sans,Helvetica Neue,sans-serif}.panel-title[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);font-size:20px;width:20px;height:20px}.close-btn[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)}.close-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.panel-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden}.assistant-placeholder[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;height:300px;color:var(--mat-sys-on-surface-variant)}.assistant-placeholder[_ngcontent-%COMP%] .large-icon[_ngcontent-%COMP%]{font-size:64px;width:64px;height:64px;margin-bottom:16px;color:var(--mat-sys-primary)}.assistant-placeholder[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0 0 8px;font-size:20px;font-weight:500;color:var(--mat-sys-on-surface);font-family:Google Sans,Helvetica Neue,sans-serif}.assistant-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5;color:var(--mat-sys-on-surface-variant)}.chat-messages[_ngcontent-%COMP%]{flex:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column}.chat-input-container[_ngcontent-%COMP%]{padding:16px 20px 20px;border-top:none}.input-wrapper[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:50px;padding:10px 6px 10px 18px;gap:8px}.assistant-input-box[_ngcontent-%COMP%]{flex:1;color:var(--mat-sys-on-surface);background-color:transparent;border:none;padding:0;resize:none;overflow:hidden;font-family:Google Sans,Helvetica Neue,sans-serif;font-size:14px;line-height:20px;min-height:20px;max-height:120px}.assistant-input-box[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant);font-size:14px}.assistant-input-box[_ngcontent-%COMP%]:focus{outline:none}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar{width:4px}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background-color:var(--mat-sys-outline);border-radius:4px}.send-button[_ngcontent-%COMP%]{color:var(--mat-sys-primary);width:36px;height:36px;min-width:36px;flex-shrink:0;margin:0;padding:0}.send-button[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-outline)}.send-button[_ngcontent-%COMP%]:hover:not(:disabled){color:var(--mat-sys-primary);border-radius:50%}.send-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.message-card[_ngcontent-%COMP%]{padding:10px 16px;margin:6px 0;font-size:14px;font-weight:400;position:relative;display:block;box-shadow:none;line-height:1.5;width:100%}.user-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:12px}.user-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{border:1px solid var(--mat-sys-outline-variant);border-radius:4px;color:var(--mat-sys-on-surface);padding:8px 12px}.bot-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:0}.bot-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{border:none;border-radius:0;color:var(--mat-sys-on-surface);padding:0;margin:0}.bot-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;font-family:Google Sans,Helvetica Neue,sans-serif}.error-message[_ngcontent-%COMP%]{color:var(--mat-app-warn, #d32f2f);font-family:Google Sans,Helvetica Neue,sans-serif;font-size:14px;white-space:pre-line;word-break:break-word;padding:8px 12px}.message-text[_ngcontent-%COMP%]{white-space:pre-line;word-break:break-word;overflow-wrap:break-word;font-family:Google Sans,Helvetica Neue,sans-serif}.message-text[_ngcontent-%COMP%] p{margin:0;line-height:1.4}.message-text[_ngcontent-%COMP%] p:first-child{margin-top:0}.message-text[_ngcontent-%COMP%] p:last-child{margin-bottom:0}.message-text[_ngcontent-%COMP%] ul, .message-text[_ngcontent-%COMP%] ol{margin:0;padding-left:1.5em}.message-text[_ngcontent-%COMP%] li{margin:0}.message-text[_ngcontent-%COMP%] code{padding:2px 4px;border-radius:3px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.9em}.message-text[_ngcontent-%COMP%] pre{padding:8px 12px;border-radius:6px;overflow-x:auto;margin:.5em 0}.message-text[_ngcontent-%COMP%] pre code{padding:0}.message-text[_ngcontent-%COMP%] blockquote{border-left:3px solid var(--mat-sys-primary);padding-left:12px;margin:.5em 0;font-style:italic;color:var(--mat-sys-on-surface-variant)}.message-text[_ngcontent-%COMP%] strong{font-weight:600}.message-text[_ngcontent-%COMP%] em{font-style:italic}.loading-message[_ngcontent-%COMP%]{display:flex;align-items:center;color:var(--mat-sys-on-surface-variant);font-family:Google Sans,Helvetica Neue,sans-serif;padding:0;margin:0}.loading-message[_ngcontent-%COMP%] .dots[_ngcontent-%COMP%]{font-size:24px;letter-spacing:-12px;animation:_ngcontent-%COMP%_pulse 1.4s ease-in-out infinite;display:inline-block;line-height:1}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:.3}50%{opacity:1}}"]})};var HE=class i{constructor(e,A){this.http=e;this.zone=A}apiServerDomain=fr.getApiServerBaseUrl();_currentApp=new ti("");currentApp=this._currentApp.asObservable();isLoading=new ti(!1);getApp(){return this.currentApp}setApp(e){this._currentApp.next(e)}getLoadingState(){return this.isLoading}runSse(e){let A=this.apiServerDomain+"/run_sse";return this.isLoading.next(!0),new bi(t=>{let n=this;fetch(A,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream"},body:JSON.stringify(e)}).then(o=>{let a=o.body?.getReader(),r=new TextDecoder("utf-8"),s="",l=()=>{a?.read().then(({done:g,value:C})=>{if(this.isLoading.next(!0),g)return this.isLoading.next(!1),t.complete();let I=r.decode(C,{stream:!0});s+=I;try{s.split(/\r?\n/).filter(Q=>Q.startsWith("data:")).forEach(Q=>{let h=Q.replace(/^data:\s*/,""),f=JSON.parse(h);n.zone.run(()=>t.next(f))}),s=""}catch(B){B instanceof SyntaxError&&l()}l()}).catch(g=>{n.zone.run(()=>t.error(g))})};l()}).catch(o=>{n.zone.run(()=>t.error(o))})})}listApps(){if(this.apiServerDomain!=null){let e=this.apiServerDomain+"/list-apps?relative_path=./";return this.http.get(e)}return new bi}getVersion(){if(this.apiServerDomain!=null){let e=this.apiServerDomain+"/version";return this.http.get(e)}return new bi}agentBuild(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/dev/apps/${e}/builder/save`;return this.http.post(t,A)}return new bi}agentBuildTmp(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/dev/apps/${e}/builder/save?tmp=true`;return this.http.post(t,A)}return new bi}getAgentBuilder(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/apps/${e}/builder?ts=${Date.now()}`;return this.http.get(A,{responseType:"text"})}return new bi}getAgentBuilderTmp(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/apps/${e}/builder?ts=${Date.now()}&tmp=true`;return this.http.get(A,{responseType:"text"})}return new bi}getSubAgentBuilder(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/dev/apps/${e}/builder?ts=${Date.now()}&file_path=${A}&tmp=true`;return this.http.get(t,{responseType:"text"})}return new bi}agentChangeCancel(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/apps/${e}/builder/cancel`;return this.http.post(A,{})}return new bi}getAppInfo(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/apps/${e}/build_graph`;return this.http.get(A)}return new bi}getAppGraphImage(e,A,t){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/dev/apps/${e}/build_graph_image`,o={dark_mode:A};return t&&(o.node=t),this.http.get(n,{params:o})}return new bi}static \u0275fac=function(A){return new(A||i)(Ko(hr),Ko(qe))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var eQA=["edgeLabelWrapper"],tQA=["edgeLabel",""];function iQA(i,e){i&1&&gn(0)}function nQA(i,e){if(i&1&&(It(),d(0,"foreignObject"),or(),d(1,"div",1,0),yt(3,iQA,1,0,"ng-container",2),E()()),i&2){let A=p(2),t=p();ee("x",t.edgeLabelPoint().x)("y",t.edgeLabelPoint().y)("width",A.size().width)("height",A.size().height),u(3),H("ngTemplateOutlet",e)("ngTemplateOutletContext",t.getLabelContext())}}function oQA(i,e){if(i&1&&Y(0,nQA,4,6,":svg:foreignObject"),i&2){let A,t=p(2);O((A=t.htmlTemplate())?0:-1,A)}}function aQA(i,e){if(i&1&&(It(),d(0,"foreignObject"),or(),d(1,"div",1,0),y(3),E()()),i&2){let A=p(),t=p();ee("x",t.edgeLabelPoint().x)("y",t.edgeLabelPoint().y)("width",A.size().width)("height",A.size().height),u(),oR(t.edgeLabelStyle()),u(2),Be(" ",A.edgeLabel.text," ")}}function rQA(i,e){if(i&1&&(Y(0,oQA,1,1),Y(1,aQA,4,7,":svg:foreignObject")),i&2){let A=e,t=p();O(A.edgeLabel.type==="html-template"&&t.htmlTemplate()?0:-1),u(),O(A.edgeLabel.type==="default"?1:-1)}}var sQA=["edge",""];function lQA(i,e){if(i&1){let A=rA();It(),lA(0,"path",0),d(1,"path",1),T("click",function(){G(A);let n=p();return n.select(),K(n.pull())}),E()}if(i&2){let A=p();xA("edge_selected",A.model().selected()),ee("d",A.model().path().path)("marker-start",A.model().markerStartUrl())("marker-end",A.model().markerEndUrl()),u(),ee("d",A.model().path().path)}}function gQA(i,e){if(i&1&&gn(0,2),i&2){let A=p(2);H("ngTemplateOutlet",e)("ngTemplateOutletContext",A.model().context)("ngTemplateOutletInjector",A.injector)}}function cQA(i,e){if(i&1&&Y(0,gQA,1,3,"ng-container",2),i&2){let A,t=p();O((A=t.edgeTemplate())?0:-1,A)}}function CQA(i,e){if(i&1&&(It(),lA(0,"g",3)),i&2){let A=p(),t=p();H("model",A)("point",e)("edgeModel",t.model())("htmlTemplate",t.edgeLabelHtmlTemplate())}}function IQA(i,e){if(i&1&&Y(0,CQA,1,4,":svg:g",3),i&2){let A,t=p();O((A=(A=t.model().path().labelPoints)==null?null:A.start)?0:-1,A)}}function dQA(i,e){if(i&1&&(It(),lA(0,"g",3)),i&2){let A=p(),t=p();H("model",A)("point",e)("edgeModel",t.model())("htmlTemplate",t.edgeLabelHtmlTemplate())}}function BQA(i,e){if(i&1&&Y(0,dQA,1,4,":svg:g",3),i&2){let A,t=p();O((A=(A=t.model().path().labelPoints)==null?null:A.center)?0:-1,A)}}function EQA(i,e){if(i&1&&(It(),lA(0,"g",3)),i&2){let A=p(),t=p();H("model",A)("point",e)("edgeModel",t.model())("htmlTemplate",t.edgeLabelHtmlTemplate())}}function hQA(i,e){if(i&1&&Y(0,EQA,1,4,":svg:g",3),i&2){let A,t=p();O((A=(A=t.model().path().labelPoints)==null?null:A.end)?0:-1,A)}}function QQA(i,e){if(i&1){let A=rA();It(),d(0,"circle",5),T("pointerStart",function(n){G(A);let o=p(2);return K(o.startReconnection(n,o.model().targetHandle()))}),E()}if(i&2){let A=p(2);ee("cx",A.model().sourceHandle().pointAbsolute().x)("cy",A.model().sourceHandle().pointAbsolute().y)}}function uQA(i,e){if(i&1){let A=rA();It(),d(0,"circle",5),T("pointerStart",function(n){G(A);let o=p(2);return K(o.startReconnection(n,o.model().sourceHandle()))}),E()}if(i&2){let A=p(2);ee("cx",A.model().targetHandle().pointAbsolute().x)("cy",A.model().targetHandle().pointAbsolute().y)}}function pQA(i,e){if(i&1&&(Y(0,QQA,1,2,":svg:circle",4),Y(1,uQA,1,2,":svg:circle",4)),i&2){let A=p();O(A.model().reconnectable===!0||A.model().reconnectable==="source"?0:-1),u(),O(A.model().reconnectable===!0||A.model().reconnectable==="target"?1:-1)}}var P_=["*"],fQA=["resizer"],mQA=["resizable",""];function wQA(i,e){if(i&1){let A=rA();It(),d(0,"g")(1,"line",1),T("pointerStart",function(n){G(A);let o=p();return K(o.startResize("top",n))}),E(),d(2,"line",2),T("pointerStart",function(n){G(A);let o=p();return K(o.startResize("left",n))}),E(),d(3,"line",3),T("pointerStart",function(n){G(A);let o=p();return K(o.startResize("bottom",n))}),E(),d(4,"line",4),T("pointerStart",function(n){G(A);let o=p();return K(o.startResize("right",n))}),E(),d(5,"rect",5),T("pointerStart",function(n){G(A);let o=p();return K(o.startResize("top-left",n))}),E(),d(6,"rect",6),T("pointerStart",function(n){G(A);let o=p();return K(o.startResize("top-right",n))}),E(),d(7,"rect",7),T("pointerStart",function(n){G(A);let o=p();return K(o.startResize("bottom-left",n))}),E(),d(8,"rect",8),T("pointerStart",function(n){G(A);let o=p();return K(o.startResize("bottom-right",n))}),E()()}if(i&2){let A=p();u(),ee("x1",A.lineGap)("y1",-A.gap())("x2",A.model.size().width-A.lineGap)("y2",-A.gap())("stroke",A.resizerColor()),u(),ee("x1",-A.gap())("y1",A.lineGap)("x2",-A.gap())("y2",A.model.size().height-A.lineGap)("stroke",A.resizerColor()),u(),ee("x1",A.lineGap)("y1",A.model.size().height+A.gap())("x2",A.model.size().width-A.lineGap)("y2",A.model.size().height+A.gap())("stroke",A.resizerColor()),u(),ee("x1",A.model.size().width+A.gap())("y1",A.lineGap)("x2",A.model.size().width+A.gap())("y2",A.model.size().height-A.lineGap)("stroke",A.resizerColor()),u(),ee("x",-(A.handleSize/2)-A.gap())("y",-(A.handleSize/2)-A.gap())("width",A.handleSize)("height",A.handleSize)("fill",A.resizerColor()),u(),ee("x",A.model.size().width-A.handleSize/2+A.gap())("y",-(A.handleSize/2)-A.gap())("width",A.handleSize)("height",A.handleSize)("fill",A.resizerColor()),u(),ee("x",-(A.handleSize/2)-A.gap())("y",A.model.size().height-A.handleSize/2+A.gap())("width",A.handleSize)("height",A.handleSize)("fill",A.resizerColor()),u(),ee("x",A.model.size().width-A.handleSize/2+A.gap())("y",A.model.size().height-A.handleSize/2+A.gap())("width",A.handleSize)("height",A.handleSize)("fill",A.resizerColor())}}var DQA=["node",""];function yQA(i,e){if(i&1){let A=rA();It(),d(0,"foreignObject",3),T("click",function(){G(A);let n=p();return n.pullNode(),K(n.selectNode())}),or(),d(1,"default-node",4),lA(2,"div",5)(3,"handle",6)(4,"handle",7),E()()}if(i&2){let A=p();ee("width",A.model().foWidth())("height",A.model().foHeight()),u(),ht("width",A.model().styleWidth())("height",A.model().styleHeight())("max-width",A.model().styleWidth())("max-height",A.model().styleHeight()),H("selected",A.model().selected()),u(),H("outerHTML",A.model().text(),fc)}}function vQA(i,e){if(i&1){let A=rA();It(),d(0,"foreignObject",3),T("click",function(){G(A);let n=p();return K(n.pullNode())}),or(),d(1,"div",8),gn(2,9),E()()}if(i&2){let A=p();ee("width",A.model().foWidth())("height",A.model().foHeight()),u(),ht("width",A.model().styleWidth())("height",A.model().styleHeight()),u(),H("ngTemplateOutlet",A.nodeTemplate()??null)("ngTemplateOutletContext",A.model().context)("ngTemplateOutletInjector",A.injector)}}function bQA(i,e){if(i&1){let A=rA();It(),d(0,"g",10),T("click",function(){G(A);let n=p();return K(n.pullNode())}),gn(1,9),E()}if(i&2){let A=p();u(),H("ngTemplateOutlet",A.nodeSvgTemplate()??null)("ngTemplateOutletContext",A.model().context)("ngTemplateOutletInjector",A.injector)}}function MQA(i,e){if(i&1){let A=rA();It(),d(0,"foreignObject",3),T("click",function(){G(A);let n=p(2);return K(n.pullNode())}),or(),d(1,"div",8),gn(2,11),E()()}if(i&2){let A=p(2);ee("width",A.model().foWidth())("height",A.model().foHeight()),u(),ht("width",A.model().styleWidth())("height",A.model().styleHeight()),u(),H("ngComponentOutlet",e)("ngComponentOutletInputs",A.model().componentTypeInputs)("ngComponentOutletInjector",A.injector)}}function SQA(i,e){if(i&1&&(Y(0,MQA,3,9,":svg:foreignObject",0),Ht(1,"async")),i&2){let A,t=p();O((A=ci(1,1,t.model().componentInstance$))?0:-1,A)}}function kQA(i,e){if(i&1){let A=rA();It(),d(0,"rect",12),T("click",function(){G(A);let n=p();return n.pullNode(),K(n.selectNode())}),E()}if(i&2){let A=p();ht("stroke",A.model().color())("fill",A.model().color()),xA("default-group-node_selected",A.model().selected()),H("resizable",A.model().resizable())("gap",3)("resizerColor",A.model().color()),ee("width",A.model().size().width)("height",A.model().size().height)}}function _QA(i,e){if(i&1){let A=rA();It(),d(0,"g",10),T("click",function(){G(A);let n=p();return K(n.pullNode())}),gn(1,9),E()}if(i&2){let A=p();u(),H("ngTemplateOutlet",A.groupNodeTemplate()??null)("ngTemplateOutletContext",A.model().context)("ngTemplateOutletInjector",A.injector)}}function xQA(i,e){}function RQA(i,e){if(i&1&&yt(0,xQA,0,0,"ng-template",13),i&2){let A=p();H("ngTemplateOutlet",A)}}function NQA(i,e){if(i&1&&Y(0,RQA,1,1,null,13),i&2){let A=p();O(A.model().resizable()?0:-1)}}function FQA(i,e){if(i&1){let A=rA();It(),d(0,"circle",17),T("pointerStart",function(n){G(A);let o=p().$implicit,a=p();return K(a.startConnection(n,o))})("pointerEnd",function(){G(A);let n=p(2);return K(n.endConnection())}),E()}if(i&2){let A=p().$implicit;ee("cx",A.hostOffset().x)("cy",A.hostOffset().y)("stroke-width",A.strokeWidth)}}function LQA(i,e){if(i&1){let A=rA();It(),d(0,"g",18),T("pointerStart",function(n){G(A);let o=p().$implicit,a=p();return K(a.startConnection(n,o))})("pointerEnd",function(){G(A);let n=p(2);return K(n.endConnection())}),E()}if(i&2){let A=p().$implicit;H("handleSizeController",A)}}function GQA(i,e){i&1&&(It(),gn(0))}function KQA(i,e){if(i&1){let A=rA();It(),d(0,"g",18),T("pointerStart",function(n){G(A);let o=p().$implicit,a=p();return K(a.startConnection(n,o))})("pointerEnd",function(){G(A);let n=p(2);return K(n.endConnection())}),yt(1,GQA,1,0,"ng-container",19),E()}if(i&2){let A=p().$implicit;H("handleSizeController",A),u(),H("ngTemplateOutlet",A.template)("ngTemplateOutletContext",A.templateContext)}}function UQA(i,e){if(i&1){let A=rA();It(),d(0,"circle",20),T("pointerEnd",function(){G(A);let n=p().$implicit,o=p();return o.endConnection(),K(o.resetValidateConnection(n))})("pointerOver",function(){G(A);let n=p().$implicit,o=p();return K(o.validateConnection(n))})("pointerOut",function(){G(A);let n=p().$implicit,o=p();return K(o.resetValidateConnection(n))}),E()}if(i&2){let A=p().$implicit,t=p();ee("r",t.model().magnetRadius)("cx",A.hostOffset().x)("cy",A.hostOffset().y)}}function TQA(i,e){if(i&1&&(Y(0,FQA,1,3,":svg:circle",14),Y(1,LQA,1,1,":svg:g",15),Y(2,KQA,2,3,":svg:g",15),Y(3,UQA,1,3,":svg:circle",16)),i&2){let A=e.$implicit,t=p();O(A.template===void 0?0:-1),u(),O(A.template===null?1:-1),u(),O(A.template?2:-1),u(),O(t.showMagnet()?3:-1)}}function JQA(i,e){if(i&1&&(It(),d(0,"foreignObject"),or(),gn(1,13),E()),i&2){let A=e.$implicit;ee("width",A.size().width)("height",A.size().height)("transform",A.transform()),u(),H("ngTemplateOutlet",A.template())}}var YQA=["connection",""];function OQA(i,e){if(i&1&&(It(),lA(0,"path",0)),i&2){let A=p(2);ee("d",e)("marker-end",A.markerUrl())("stroke",A.defaultColor)}}function HQA(i,e){if(i&1&&Y(0,OQA,1,3,":svg:path",0),i&2){let A,t=p();O((A=t.path())?0:-1,A)}}function zQA(i,e){i&1&&gn(0)}function PQA(i,e){if(i&1&&yt(0,zQA,1,0,"ng-container",1),i&2){let A=p(2);H("ngTemplateOutlet",e)("ngTemplateOutletContext",A.getContext())}}function jQA(i,e){if(i&1&&Y(0,PQA,1,2,"ng-container"),i&2){let A,t=p();O((A=t.template())?0:-1,A)}}var qQA=["background",""];function VQA(i,e){if(i&1&&(It(),Dn(0,"pattern",0),Jn(1,"circle"),Tn(),Jn(2,"rect",1)),i&2){let A=p();ee("id",A.patternId)("x",A.x())("y",A.y())("width",A.scaledGap())("height",A.scaledGap()),u(),ee("cx",A.patternSize())("cy",A.patternSize())("r",A.patternSize())("fill",A.patternColor()),u(),ee("fill",A.patternUrl)}}function WQA(i,e){if(i&1&&(It(),Dn(0,"pattern",0),Jn(1,"image"),Tn(),Jn(2,"rect",1)),i&2){let A=p(2);ee("id",A.patternId)("x",A.imageX())("y",A.imageY())("width",A.scaledImageWidth())("height",A.scaledImageHeight()),u(),ee("href",A.bgImageSrc())("width",A.scaledImageWidth())("height",A.scaledImageHeight()),u(),ee("fill",A.patternUrl)}}function ZQA(i,e){if(i&1&&(It(),Jn(0,"image")),i&2){let A=p(2);ee("x",A.imageX())("y",A.imageY())("width",A.scaledImageWidth())("height",A.scaledImageHeight())("href",A.bgImageSrc())}}function XQA(i,e){if(i&1&&(Y(0,WQA,3,9),Y(1,ZQA,1,5,":svg:image")),i&2){let A=p();O(A.repeated()?0:-1),u(),O(A.repeated()?-1:1)}}var $QA=["flowDefs",""];function A4A(i,e){if(i&1&&(It(),Jn(0,"polyline",3)),i&2){let A=p().$implicit,t=p();ht("stroke",A.value.color??t.defaultColor)("stroke-width",A.value.strokeWidth??2)("fill",A.value.color??t.defaultColor)}}function e4A(i,e){if(i&1&&(It(),Jn(0,"polyline",4)),i&2){let A=p().$implicit,t=p();ht("stroke",A.value.color??t.defaultColor)("stroke-width",A.value.strokeWidth??2)}}function t4A(i,e){if(i&1&&(It(),Dn(0,"marker",0),Y(1,A4A,1,6,":svg:polyline",1),Y(2,e4A,1,4,":svg:polyline",2),Tn()),i&2){let A=e.$implicit;ee("id",A.key)("markerWidth",A.value.width??16.5)("markerHeight",A.value.height??16.5)("orient",A.value.orient??"auto-start-reverse")("markerUnits",A.value.markerUnits??"userSpaceOnUse"),u(),O(A.value.type==="arrow-closed"||!A.value.type?1:-1),u(),O(A.value.type==="arrow"?2:-1)}}var i4A=["previewFlow",""],n4A=["alignmentHelper",""];function o4A(i,e){if(i&1&&(It(),Jn(0,"line")),i&2){let A=e.$implicit,t=p(3);ee("stroke",t.lineColor())("stroke-dasharray",A.isCenter?4:null)("x1",A.x)("y1",A.y)("x2",A.x2)("y2",A.y2)}}function a4A(i,e){i&1&&xe(0,o4A,1,6,":svg:line",null,Nr),i&2&&Re(e.lines)}function r4A(i,e){if(i&1&&Y(0,a4A,2,0),i&2){let A,t=p();O((A=t.intersections())?0:-1,A)}}function s4A(i,e){i&1&&(It(),lA(0,"g",8))}function l4A(i,e){if(i&1&&(It(),lA(0,"g",9)),i&2){let A=p();H("tolerance",A.tolerance)("lineColor",A.lineColor)}}function g4A(i,e){i&1&&Y(0,s4A,1,0,":svg:g",8)(1,l4A,1,2,":svg:g",9),i&2&&O(e===!0?0:1)}function c4A(i,e){if(i&1&&(It(),lA(0,"g",10)),i&2){let A,t=e.$implicit,n=p(2);H("model",t)("groupNodeTemplate",(A=n.groupNodeTemplateDirective())==null?null:A.templateRef),ee("transform",t.pointTransform())}}function C4A(i,e){if(i&1&&(It(),lA(0,"g",11)),i&2){let A,t,n=e.$implicit,o=p(2);H("model",n)("edgeTemplate",(A=o.edgeTemplateDirective())==null?null:A.templateRef)("edgeLabelHtmlTemplate",(t=o.edgeLabelHtmlDirective())==null?null:t.templateRef)}}function I4A(i,e){if(i&1&&(It(),lA(0,"g",12)),i&2){let A,t,n=e.$implicit,o=p(2);H("model",n)("nodeTemplate",(A=o.nodeTemplateDirective())==null?null:A.templateRef)("nodeSvgTemplate",(t=o.nodeSvgTemplateDirective())==null?null:t.templateRef),ee("transform",n.pointTransform())}}function d4A(i,e){if(i&1&&(xe(0,c4A,1,3,":svg:g",10,ed().trackNodes,!0),xe(2,C4A,1,3,":svg:g",11,ed().trackEdges,!0),xe(4,I4A,1,4,":svg:g",12,ed().trackNodes,!0)),i&2){let A=p();Re(A.groups()),u(2),Re(A.edgeModels()),u(2),Re(A.nonGroups())}}function B4A(i,e){if(i&1&&(It(),lA(0,"g",11)),i&2){let A,t,n=e.$implicit,o=p(2);H("model",n)("edgeTemplate",(A=o.edgeTemplateDirective())==null?null:A.templateRef)("edgeLabelHtmlTemplate",(t=o.edgeLabelHtmlDirective())==null?null:t.templateRef)}}function E4A(i,e){if(i&1&&(It(),lA(0,"g",13)),i&2){let A,t,n,o=e.$implicit,a=p(2);H("model",o)("nodeTemplate",(A=a.nodeTemplateDirective())==null?null:A.templateRef)("nodeSvgTemplate",(t=a.nodeSvgTemplateDirective())==null?null:t.templateRef)("groupNodeTemplate",(n=a.groupNodeTemplateDirective())==null?null:n.templateRef),ee("transform",o.pointTransform())}}function h4A(i,e){if(i&1&&(xe(0,B4A,1,3,":svg:g",11,ed().trackEdges,!0),xe(2,E4A,1,5,":svg:g",13,ed().trackNodes,!0)),i&2){let A=p();Re(A.edgeModels()),u(2),Re(A.nodeModels())}}function Q4A(i,e){i&1&&(It(),gn(0,6)),i&2&&H("ngTemplateOutlet",e.template())}function u4A(i,e){if(i&1&&lA(0,"canvas",7),i&2){let A=p();H("width",A.flowWidth())("height",A.flowHeight())}}var p4A=["customTemplateEdge",""],f4A=(i,e)=>{let A=Math.max(0,Math.min(i.x+i.width,e.x+e.width)-Math.max(i.x,e.x)),t=Math.max(0,Math.min(i.y+i.height,e.y+e.height)-Math.max(i.y,e.y));return Math.ceil(A*t)};function GV(i){if(i.length===0)return{x:0,y:0,width:0,height:0};let e={x:1/0,y:1/0,x2:-1/0,y2:-1/0};return i.forEach(A=>{let t=w4A(A);e=y4A(e,t)}),D4A(e)}function m4A(i,e,A){let t=e.find(o=>o.rawNode.id===i);if(!t)return[];let n=Jw(t);return e.filter(o=>{if(o.rawNode.id===i)return!1;let a=f4A(Jw(o),n);return A?.partially?a>0:a>=n.width*n.height})}function w4A(i){return{x:i.point().x,y:i.point().y,x2:i.point().x+i.size().width,y2:i.point().y+i.size().height}}function Jw(i){return{x:i.globalPoint().x,y:i.globalPoint().y,width:i.width(),height:i.height()}}function D4A({x:i,y:e,x2:A,y2:t}){return{x:i,y:e,width:A-i,height:t-e}}function y4A(i,e){return{x:Math.min(i.x,e.x),y:Math.min(i.y,e.y),x2:Math.max(i.x2,e.x2),y2:Math.max(i.y2,e.y2)}}var Yw=class{constructor(e){this.settings=e,this.curve=e.curve??"bezier",this.type=e.type??"default",this.mode=e.mode??"strict";let A=this.getValidators(e);this.validator=t=>A.every(n=>n(t))}getValidators(e){let A=[];return A.push(v4A),this.mode==="loose"&&A.push(b4A),e.validator&&A.push(e.validator),A}},v4A=i=>i.source!==i.target,b4A=i=>i.sourceHandle!==void 0&&i.targetHandle!==void 0;function PE(i){return i.split("").reduce((e,A)=>(e=(e<<5)-e+A.charCodeAt(0),e&e),0)}var rl=(()=>{class i{constructor(){this.nodes=mA([],{equal:(A,t)=>!A.length&&!t.length?!0:A===t}),this.rawNodes=me(()=>this.nodes().map(A=>A.rawNode)),this.edges=mA([],{equal:(A,t)=>!A.length&&!t.length?!0:A===t}),this.rawEdges=me(()=>this.edges().map(A=>A.edge)),this.validEdges=me(()=>{let A=this.nodes();return this.edges().filter(t=>A.includes(t.source())&&A.includes(t.target()))}),this.connection=mA(new Yw({})),this.markers=me(()=>{let A=new Map;this.validEdges().forEach(n=>{if(n.edge.markers?.start){let o=PE(JSON.stringify(n.edge.markers.start));A.set(o,n.edge.markers.start)}if(n.edge.markers?.end){let o=PE(JSON.stringify(n.edge.markers.end));A.set(o,n.edge.markers.end)}});let t=this.connection().settings.marker;if(t){let n=PE(JSON.stringify(t));A.set(n,t)}return A}),this.entities=me(()=>[...this.nodes(),...this.edges()]),this.minimap=mA(null)}getNode(A){return this.nodes().find(({rawNode:t})=>t.id===A)}getDetachedEdges(){return this.edges().filter(A=>A.detached())}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function M4A(i,e,A,t,n,o){let a=e/(i.width*(1+o)),r=A/(i.height*(1+o)),s=Math.min(a,r),l=S4A(s,t,n),g=i.x+i.width/2,C=i.y+i.height/2,I=e/2-g*l,B=A/2-C*l;return{x:I,y:B,zoom:l}}function S4A(i,e=0,A=1){return Math.min(Math.max(i,e),A)}function k4A(i,e,A){let t=i.zoom;return{x:-i.x/t,y:-i.y/t,width:e/t,height:A/t}}function _4A(i,e,A,t){let n=k4A(e,A,t);return!(i.x+i.widthn.x+n.width||i.y+i.heightn.y+n.height)}var x4A={detachedGroupsLayer:!1,virtualization:!1,virtualizationZoomThreshold:.5,lazyLoadTrigger:"immediate"},Wr=(()=>{class i{constructor(){this.entitiesSelectable=mA(!0),this.elevateNodesOnSelect=mA(!0),this.elevateEdgesOnSelect=mA(!0),this.view=mA([400,400]),this.computedFlowWidth=mA(0),this.computedFlowHeight=mA(0),this.minZoom=mA(.5),this.maxZoom=mA(3),this.background=mA({type:"solid",color:"#fff"}),this.snapGrid=mA([1,1]),this.optimization=mA(x4A)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),HI=(()=>{class i{constructor(){this.entitiesService=w(rl),this.flowSettingsService=w(Wr),this.writableViewport=mA({changeType:"initial",state:i.getDefaultViewport(),duration:0}),this.readableViewport=mA(i.getDefaultViewport()),this.viewportChangeEnd$=new te}static getDefaultViewport(){return{zoom:1,x:0,y:0}}fitView(A={padding:.1,duration:0,nodes:[]}){let t=this.getBoundsNodes(A.nodes??[]),n=M4A(GV(t),this.flowSettingsService.computedFlowWidth(),this.flowSettingsService.computedFlowHeight(),this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom(),A.padding??.1),o=A.duration??0;this.writableViewport.set({changeType:"absolute",state:n,duration:o})}triggerViewportChangeEvent(A){A==="end"&&this.viewportChangeEnd$.next()}getBoundsNodes(A){return A?.length?A.map(t=>this.entitiesService.nodes().find(({rawNode:n})=>n.id===t)).filter(t=>!!t):this.entitiesService.nodes()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function pC(i){return i!==void 0}var Ww=(()=>{class i{constructor(){this.element=w(se).nativeElement}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["svg","rootSvgRef",""]]})}}return i})();function wV(){let i=window.navigator.userAgent.toLowerCase(),e=/(macintosh|macintel|macppc|mac68k|macos)/i,A=/(win32|win64|windows|wince)/i,t=/(iphone|ipad|ipod)/i,n=null;return e.test(i)?n="macos":t.test(i)?n="ios":A.test(i)?n="windows":/android/.test(i)?n="android":!n&&/linux/.test(i)&&(n="linux"),n}var L_=(()=>{class i{constructor(){this.actions=mA({multiSelection:[wV()==="macos"?"MetaLeft":"ControlLeft",wV()==="macos"?"MetaRight":"ControlRight"]}),this.actionsActive={multiSelection:!1},mo(this.actions).pipe(pi(()=>Ti(pc(document,"keydown").pipe(Ei(A=>{for(let t in this.actions())(this.actions()[t]??[]).includes(A.code)&&(this.actionsActive[t]=!0)})),pc(document,"keyup").pipe(Ei(A=>{for(let t in this.actions())(this.actions()[t]??[]).includes(A.code)&&(this.actionsActive[t]=!1)})))),pr()).subscribe()}setShortcuts(A){this.actions.update(t=>oA(oA({},t),A))}isActiveAction(A){return this.actionsActive[A]}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),ju=(()=>{class i{constructor(){this.flowEntitiesService=w(rl),this.keyboardService=w(L_),this.viewport$=new te,this.resetSelection=this.viewport$.pipe(Ei(({start:A,end:t,target:n})=>{if(A&&t&&n){let o=i.delta,a=Math.abs(t.x-A.x),r=Math.abs(t.y-A.y),s=at.selected.set(!1)),A&&A.selected.set(!0))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),R_=(()=>{class i{constructor(){this.rootSvg=w(Ww).element,this.host=w(se).nativeElement,this.selectionService=w(ju),this.viewportService=w(HI),this.flowSettingsService=w(Wr),this.zone=w(qe),this.rootSvgSelection=xs(this.rootSvg),this.transform=mA(""),this.viewportForSelection={},this.manualViewportChangeEffect=_n(()=>{let A=this.viewportService.writableViewport(),t=A.state;if(A.changeType!=="initial"){if(pC(t.zoom)&&!pC(t.x)&&!pC(t.y)){this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.scaleTo,t.zoom);return}if(pC(t.x)&&pC(t.y)&&!pC(t.zoom)){let n=ca(this.viewportService.readableViewport).zoom;this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.transform,KD.translate(t.x,t.y).scale(n));return}if(pC(t.x)&&pC(t.y)&&pC(t.zoom)){this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.transform,KD.translate(t.x,t.y).scale(t.zoom));return}}},{allowSignalWrites:!0}),this.handleZoom=({transform:A})=>{this.viewportService.readableViewport.set(N_(A)),this.transform.set(A.toString())},this.handleZoomStart=({transform:A})=>{this.viewportForSelection={start:N_(A)}},this.handleZoomEnd=({transform:A,sourceEvent:t})=>{this.zone.run(()=>{this.viewportForSelection=Oe(oA({},this.viewportForSelection),{end:N_(A),target:R4A(t)}),this.viewportService.triggerViewportChangeEvent("end"),this.selectionService.setViewport(this.viewportForSelection)})},this.filterCondition=A=>A.type==="mousedown"||A.type==="touchstart"?A.target.closest(".vflow-node")===null:!0}ngOnInit(){this.zone.runOutsideAngular(()=>{this.zoomBehavior=KR().scaleExtent([this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom()]).filter(this.filterCondition).on("start",this.handleZoomStart).on("zoom",this.handleZoom).on("end",this.handleZoomEnd),this.rootSvgSelection.call(this.zoomBehavior).on("dblclick.zoom",null)})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["g","mapContext",""]],hostVars:1,hostBindings:function(t,n){t&2&&ee("transform",n.transform())}})}}return i})(),N_=i=>({zoom:i.k,x:i.x,y:i.y}),R4A=i=>{if(i instanceof Event&&i.target instanceof Element)return i.target},Ow=i=>Math.round(i*100)/100;function al(i,e){return Math.ceil(i/e)*e}var j2=(()=>{class i{constructor(){this.status=mA({state:"idle",payload:null})}setIdleStatus(){this.status.set({state:"idle",payload:null})}setConnectionStartStatus(A,t){this.status.set({state:"connection-start",payload:{source:A,sourceHandle:t}})}setReconnectionStartStatus(A,t,n){this.status.set({state:"reconnection-start",payload:{source:A,sourceHandle:t,oldEdge:n}})}setConnectionValidationStatus(A,t,n,o,a){this.status.set({state:"connection-validation",payload:{source:t,target:n,sourceHandle:o,targetHandle:a,valid:A}})}setReconnectionValidationStatus(A,t,n,o,a,r){this.status.set({state:"reconnection-validation",payload:{source:t,target:n,sourceHandle:o,targetHandle:a,valid:A,oldEdge:r}})}setConnectionEndStatus(A,t,n,o){this.status.set({state:"connection-end",payload:{source:A,target:t,sourceHandle:n,targetHandle:o}})}setReconnectionEndStatus(A,t,n,o,a){this.status.set({state:"reconnection-end",payload:{source:A,target:t,sourceHandle:n,targetHandle:o,oldEdge:a}})}setNodeDragStartStatus(A){this.status.set({state:"node-drag-start",payload:{node:A}})}setNodeDragEndStatus(A){this.status.set({state:"node-drag-end",payload:{node:A}})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function DV(i){return i.state==="node-drag-start"}function N4A(i){return i.state==="node-drag-end"}var KV=(()=>{class i{constructor(){this.entitiesService=w(rl),this.settingsService=w(Wr),this.flowStatusService=w(j2)}enable(A,t){xs(A).call(this.getDragBehavior(t))}disable(A){xs(A).call(GD().on("drag",null))}destroy(A){xs(A).on(".drag",null)}getDragBehavior(A){let t=[],n=[],o=a=>A.dragHandlesCount()?!!a.target.closest(".vflow-drag-handle"):!0;return GD().filter(o).on("start",a=>{t=this.getDragNodes(A),this.flowStatusService.setNodeDragStartStatus(A),n=t.map(r=>({x:r.point().x-a.x,y:r.point().y-a.y}))}).on("drag",a=>{t.forEach((r,s)=>{let l={x:Ow(a.x+n[s].x),y:Ow(a.y+n[s].y)};this.moveNode(r,l)})}).on("end",()=>{this.flowStatusService.setNodeDragEndStatus(A)})}getDragNodes(A){return A.selected()?this.entitiesService.nodes().filter(t=>t.selected()&&t.draggable()):[A]}moveNode(A,t){t=this.alignToGrid(t);let n=A.parent();n&&(t.x=Math.min(n.width()-A.width(),t.x),t.x=Math.max(0,t.x),t.y=Math.min(n.height()-A.height(),t.y),t.y=Math.max(0,t.y)),A.setPoint(t)}alignToGrid(A){let[t,n]=this.settingsService.snapGrid();return t>1&&(A.x=al(A.x,t)),n>1&&(A.y=al(A.y,n)),A}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),Hw=(()=>{class i{constructor(){this.templateRef=w(lo)}static ngTemplateContextGuard(A,t){return!0}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["ng-template","edge",""]]})}}return i})(),yV=(()=>{class i{constructor(){this.templateRef=w(lo)}static ngTemplateContextGuard(A,t){return!0}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["ng-template","connection",""]]})}}return i})(),vV=(()=>{class i{constructor(){this.templateRef=w(lo)}static ngTemplateContextGuard(A,t){return!0}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["ng-template","edgeLabelHtml",""]]})}}return i})(),jE=(()=>{class i{constructor(){this.templateRef=w(lo)}static ngTemplateContextGuard(A,t){return!0}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["ng-template","nodeHtml",""]]})}}return i})(),bV=(()=>{class i{constructor(){this.templateRef=w(lo)}static ngTemplateContextGuard(A,t){return!0}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["ng-template","nodeSvg",""]]})}}return i})(),zw=(()=>{class i{constructor(){this.templateRef=w(lo)}static ngTemplateContextGuard(A,t){return!0}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["ng-template","groupNode",""]]})}}return i})();function MV(i,e){let A=i.reduce((t,n)=>(t[n.rawNode.id]=n,t),{});e.forEach(t=>{t.source.set(A[t.edge.source]),t.target.set(A[t.edge.target])})}function Hu(i){try{return new Proxy(i,{apply:()=>{}})(),!0}catch(e){return!1}}var G_=(()=>{class i{constructor(){this._event$=new te,this.event$=this._event$.asObservable()}pushEvent(A){this._event$.next(A)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),qE=(()=>{class i{constructor(){this.model=mA(null)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),UV=(()=>{class i{constructor(){this.eventBus=w(G_),this.nodeService=w(qE),this.destroyRef=w(ar),this.selected=this.nodeService.model().selected,this.data=mA(void 0)}ngOnInit(){this.trackEvents().pipe(pr(this.destroyRef)).subscribe()}trackEvents(){let A=Object.getOwnPropertyNames(this),t=new Map;for(let n of A){let o=this[n];o instanceof LA&&t.set(o,n),o instanceof sR&&t.set(F4A(o),n)}return Ti(...Array.from(t.keys()).map(n=>n.pipe(Ei(o=>{this.eventBus.pushEvent({nodeId:this.nodeService.model()?.rawNode.id??"",eventName:t.get(n),eventPayload:o})}))))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,standalone:!1})}}return i})();function F4A(i){return new bi(e=>{let A=i.subscribe(t=>{e.next(t)});return()=>{A.unsubscribe()}})}var L4A=(()=>{class i extends UV{constructor(){super(...arguments),this.node=De.required()}ngOnInit(){let A=this.node().data;A&&(this.data=A),super.ngOnInit()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})()}static{this.\u0275dir=qA({type:i,inputs:{node:[1,"node"]},standalone:!1,features:[mt]})}}return i})(),G4A=(()=>{class i extends UV{constructor(){super(...arguments),this.node=De.required()}ngOnInit(){this.node().data&&this.data.set(this.node().data),super.ngOnInit()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})()}static{this.\u0275dir=qA({type:i,inputs:{node:[1,"node"]},standalone:!1,features:[mt]})}}return i})();function TV(i){return Object.prototype.isPrototypeOf.call(G4A,i)}function JV(i){return Object.prototype.isPrototypeOf.call(L4A,i)}function K4A(i){return typeof i.point=="function"}function U4A(i){return TV(i.type)?!0:Hu(i.type)&&!Hu(i.point)}function T4A(i){return JV(i.type)?!0:Hu(i.type)&&Hu(i.point)}var Pw=2;function J4A(i){return K4A(i)?i:Oe(oA({},Y4A(i)),{id:i.id,type:i.type})}function Y4A(i){let e={};for(let A in i)Object.prototype.hasOwnProperty.call(i,A)&&(e[A]=mA(i[A]));return e}function O4A(i,e,A){!e&&Xx(i);let t=e??w(Dt);return A?Br(t,A):t}function zu(i,e){let A=O4A(zu,e?.injector),t;return me(()=>(t||(t=ca(()=>Za(i,Oe(oA({},e),{injector:A})))),t()))}function H4A(i){return i.rawNode.type==="default-group"||i.rawNode.type==="template-group"}var zI=(()=>{class i{constructor(){this.flowEntitiesService=w(rl),this.flowSettingsService=w(Wr),this.viewportService=w(HI),this.nodes=me(()=>this.flowSettingsService.optimization().virtualization?this.viewportNodesAfterInteraction().sort((A,t)=>A.renderOrder()-t.renderOrder()):[...this.flowEntitiesService.nodes()].sort((A,t)=>A.renderOrder()-t.renderOrder())),this.groups=me(()=>this.nodes().filter(A=>!!A.children().length||H4A(A))),this.nonGroups=me(()=>this.nodes().filter(A=>!this.groups().includes(A))),this.viewportNodes=me(()=>{let A=this.flowEntitiesService.nodes(),t=this.viewportService.readableViewport(),n=this.flowSettingsService.computedFlowWidth(),o=this.flowSettingsService.computedFlowHeight();return A.filter(a=>{let{x:r,y:s}=a.globalPoint(),l=a.width(),g=a.height();return _4A({x:r,y:s,width:l,height:g},t,n,o)})}),this.viewportNodesAfterInteraction=zu(Ti(mo(this.flowEntitiesService.nodes).pipe(XI(l3),Ct(A=>!!A.length)),this.viewportService.viewportChangeEnd$.pipe(Ms(300))).pipe(ye(()=>{let A=this.viewportService.readableViewport(),t=this.flowSettingsService.optimization().virtualizationZoomThreshold;return A.zoomMath.max(...this.flowEntitiesService.nodes().map(A=>A.renderOrder())))}pullNode(A){A.renderOrder.set(this.maxOrder()+1),A.children().forEach(t=>this.pullNode(t))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function jw(i,e){e||(e={equal:Object.is});let A;return me(()=>A=i(A),e)}var z4A=(()=>{class i{static{this.defaultWidth=100}static{this.defaultHeight=50}static{this.defaultColor="#1b262c"}constructor(A){this.rawNode=A,this.entitiesService=w(rl),this.settingsService=w(Wr),this.nodeRenderingService=w(zI),this.isVisible=mA(!1),this.point=mA({x:0,y:0}),this.width=mA(i.defaultWidth),this.height=mA(i.defaultHeight),this.size=me(()=>({width:this.width(),height:this.height()})),this.styleWidth=me(()=>this.controlledByResizer()?`${this.width()}px`:"100%"),this.styleHeight=me(()=>this.controlledByResizer()?`${this.height()}px`:"100%"),this.foWidth=me(()=>this.width()+Pw),this.foHeight=me(()=>this.height()+Pw),this.renderOrder=mA(0),this.selected=mA(!1),this.preview=mA({style:{}}),this.globalPoint=me(()=>{let n=this.parent(),o=this.point().x,a=this.point().y;for(;n!==null;)o+=n.point().x,a+=n.point().y,n=n.parent();return{x:o,y:a}}),this.pointTransform=me(()=>`translate(${this.globalPoint().x}, ${this.globalPoint().y})`),this.handles=mA([]),this.draggable=mA(!0),this.dragHandlesCount=mA(0),this.magnetRadius=20,this.isComponentType=U4A(this.rawNode)||T4A(this.rawNode),this.shouldLoad=jw(n=>{if(n||this.settingsService.optimization().lazyLoadTrigger==="immediate")return!0;if(this.settingsService.optimization().lazyLoadTrigger==="viewport"){if(TV(this.rawNode.type)||JV(this.rawNode.type))return!0;if(Hu(this.rawNode.type)||this.rawNode.type==="html-template"||this.rawNode.type==="svg-template"||this.rawNode.type==="template-group")return this.nodeRenderingService.viewportNodes().includes(this)}return!0}),this.componentInstance$=mo(this.shouldLoad).pipe(Ct(Boolean),pi(()=>this.rawNode.type()),qo(()=>ie(this.rawNode.type)),Ss(1)),this.text=mA(""),this.componentTypeInputs={node:this.rawNode},this.parent=me(()=>this.entitiesService.nodes().find(n=>n.rawNode.id===this.parentId())??null),this.children=me(()=>this.entitiesService.nodes().filter(n=>n.parentId()===this.rawNode.id)),this.color=mA(i.defaultColor),this.controlledByResizer=mA(!1),this.resizable=mA(!1),this.resizing=mA(!1),this.resizerTemplate=mA(null),this.context={$implicit:{}},this.parentId=mA(null);let t=J4A(A);t.point&&(this.point=t.point),t.width&&(this.width=t.width),t.height&&(this.height=t.height),t.draggable&&(this.draggable=t.draggable),t.parentId&&(this.parentId=t.parentId),t.preview&&(this.preview=t.preview),t.type==="default-group"&&t.color&&(this.color=t.color),t.type==="default-group"&&t.resizable&&(this.resizable=t.resizable),t.type==="default"&&t.text&&(this.text=t.text),t.type==="html-template"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}}),t.type==="svg-template"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),t.type==="template-group"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),this.point$=mo(this.point),this.width$=mo(this.width),this.height$=mo(this.height),this.size$=mo(this.size),this.selected$=mo(this.selected),this.handles$=mo(this.handles)}setPoint(A){this.point.set(A)}}return i})(),Yu=class{constructor(e){this.edgeLabel=e,this.size=mA({width:0,height:0})}};function fC(i,e,A){return{x:(1-A)*i.x+A*e.x,y:(1-A)*i.y+A*e.y}}function K_({sourcePoint:i,targetPoint:e}){return{path:`M ${i.x},${i.y}L ${e.x},${e.y}`,labelPoints:{start:fC(i,e,.15),center:fC(i,e,.5),end:fC(i,e,.85)}}}function U_({sourcePoint:i,targetPoint:e,sourcePosition:A,targetPosition:t}){let n={x:i.x-e.x,y:i.y-e.y},o=SV(i,A,n),a=SV(e,t,n),r=`M${i.x},${i.y} C${o.x},${o.y} ${a.x},${a.y} ${e.x},${e.y}`;return P4A(r,i,e,o,a)}function SV(i,e,A){let t={x:0,y:0};switch(e){case"top":t.y=1;break;case"bottom":t.y=-1;break;case"right":t.x=1;break;case"left":t.x=-1;break}let n={x:A.x*Math.abs(t.x),y:A.y*Math.abs(t.y)},a=.25*25*Math.sqrt(Math.abs(n.x+n.y));return{x:i.x+t.x*a,y:i.y-t.y*a}}function P4A(i,e,A,t,n){return{path:i,labelPoints:{start:F_(e,A,t,n,.1),center:F_(e,A,t,n,.5),end:F_(e,A,t,n,.9)}}}function F_(i,e,A,t,n){let o=fC(i,A,n),a=fC(A,t,n),r=fC(t,e,n);return fC(fC(o,a,n),fC(a,r,n),n)}var kV={left:{x:-1,y:0},right:{x:1,y:0},top:{x:0,y:-1},bottom:{x:0,y:1}};function j4A(i,e){let A=Math.abs(e.x-i.x)/2,t=e.xe==="left"||e==="right"?i.xMath.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2));function V4A({source:i,sourcePosition:e="bottom",target:A,targetPosition:t="top",offset:n}){let o=kV[e],a=kV[t],r={x:i.x+o.x*n,y:i.y+o.y*n},s={x:A.x+a.x*n,y:A.y+a.y*n},l=q4A({source:r,sourcePosition:e,target:s}),g=l.x!==0?"x":"y",C=l[g],I=[],B,Q,h={x:0,y:0},f={x:0,y:0},[m,v]=j4A(i,A);if(o[g]*a[g]===-1){B=m,Q=v;let k=[{x:B,y:r.y},{x:B,y:s.y}],M=[{x:r.x,y:Q},{x:s.x,y:Q}];o[g]===C?I=g==="x"?k:M:I=g==="x"?M:k}else{let k=[{x:r.x,y:s.y}],M=[{x:s.x,y:r.y}];if(g==="x"?I=o.x===C?M:k:I=o.y===C?k:M,e===t){let Z=Math.abs(i[g]-A[g]);if(Z<=n){let AA=Math.min(n-1,n-Z);o[g]===C?h[g]=(r[g]>i[g]?-1:1)*AA:f[g]=(s[g]>A[g]?-1:1)*AA}}if(e!==t){let Z=g==="x"?"y":"x",AA=o[g]===a[Z],W=r[Z]>s[Z],CA=r[Z]=P?(B=(x.x+F.x)/2,Q=I[0].y):(B=I[0].x,Q=(x.y+F.y)/2)}return[[i,{x:r.x+h.x,y:r.y+h.y},...I,{x:s.x+f.x,y:s.y+f.y},A],B,Q]}function W4A(i,e,A,t){let n=Math.min(_V(i,e)/2,_V(e,A)/2,t),{x:o,y:a}=e;if(i.x===o&&o===A.x||i.y===a&&a===A.y)return`L${o} ${a}`;if(i.y===a){let l=i.x{let m="";return f>0&&f{let h=I*Q;if(h<=0)return o[0];if(h>=I)return o[l-1];let f=0,m=l-1;for(;f>>1;C[F](this.source()?.shouldLoad()??!1)&&(this.target()?.shouldLoad()??!1)),this.renderOrder=mA(0),this.detached=me(()=>{let A=this.source(),t=this.target();if(!A||!t)return!0;let n=!1,o=!1;return this.edge.sourceHandle?n=!!A.handles().find(a=>a.rawHandle.id===this.edge.sourceHandle):n=!!A.handles().find(a=>a.rawHandle.type==="source"),this.edge.targetHandle?o=!!t.handles().find(a=>a.rawHandle.id===this.edge.targetHandle):o=!!t.handles().find(a=>a.rawHandle.type==="target"),!n||!o}),this.detached$=mo(this.detached),this.path=me(()=>{let A=this.sourceHandle(),t=this.targetHandle();if(!A||!t)return{path:""};let n=this.getPathFactoryParams(A,t);switch(this.curve){case"straight":return K_(n);case"bezier":return U_(n);case"smooth-step":return zE(n);case"step":return zE(n,0);default:return this.curve(n)}}),this.sourceHandle=jw(A=>{let t=null;return this.floating?t=this.closestHandles().sourceHandle:this.edge.sourceHandle?t=this.source()?.handles().find(n=>n.rawHandle.id===this.edge.sourceHandle)??null:t=this.source()?.handles().find(n=>n.rawHandle.type==="source")??null,t===null?A:t}),this.targetHandle=jw(A=>{let t=null;return this.floating?t=this.closestHandles().targetHandle:this.edge.targetHandle?t=this.target()?.handles().find(n=>n.rawHandle.id===this.edge.targetHandle)??null:t=this.target()?.handles().find(n=>n.rawHandle.type==="target")??null,t===null?A:t}),this.closestHandles=me(()=>{let A=this.source(),t=this.target();if(!A||!t)return{sourceHandle:null,targetHandle:null};let n=this.flowEntitiesService.connection().mode==="strict"?A.handles().filter(l=>l.rawHandle.type==="source"):A.handles(),o=this.flowEntitiesService.connection().mode==="strict"?t.handles().filter(l=>l.rawHandle.type==="target"):t.handles();if(n.length===0||o.length===0)return{sourceHandle:null,targetHandle:null};let a=1/0,r=null,s=null;for(let l of n)for(let g of o){let C=l.pointAbsolute(),I=g.pointAbsolute(),B=Math.sqrt(Math.pow(C.x-I.x,2)+Math.pow(C.y-I.y,2));B{let A=this.edge.markers?.start;return A?`url(#${PE(JSON.stringify(A))})`:""}),this.markerEndUrl=me(()=>{let A=this.edge.markers?.end;return A?`url(#${PE(JSON.stringify(A))})`:""}),this.context={$implicit:{edge:this.edge,path:me(()=>this.path().path),markerStart:this.markerStartUrl,markerEnd:this.markerEndUrl,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}},this.edgeLabels={},this.type=e.type??"default",this.curve=e.curve??"bezier",this.reconnectable=e.reconnectable??!1,this.floating=e.floating??!1,e.edgeLabels?.start&&(this.edgeLabels.start=new Yu(e.edgeLabels.start)),e.edgeLabels?.center&&(this.edgeLabels.center=new Yu(e.edgeLabels.center)),e.edgeLabels?.end&&(this.edgeLabels.end=new Yu(e.edgeLabels.end))}getPathFactoryParams(e,A){return{mode:"edge",edge:this.edge,sourcePoint:e.pointAbsolute(),targetPoint:A.pointAbsolute(),sourcePosition:e.rawHandle.position,targetPosition:A.rawHandle.position,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}},qw=class{static nodes(e,A){let t=new Map;return A.forEach(n=>t.set(n.rawNode,n)),e.map(n=>t.get(n)??new z4A(n))}static edges(e,A){let t=new Map;return A.forEach(n=>t.set(n.edge,n)),e.map(n=>t.has(n)?t.get(n):new T_(n))}},Z4A=25,J_=(()=>{class i{constructor(){this.entitiesService=w(rl),this.nodesPositionChange$=mo(this.entitiesService.nodes).pipe(pi(A=>Ti(...A.map(t=>t.point$.pipe(Cl(1),ye(()=>t))))),ye(A=>[{type:"position",id:A.rawNode.id,point:A.point()},...this.entitiesService.nodes().filter(t=>t!==A&&t.selected()).map(t=>({type:"position",id:t.rawNode.id,point:t.point()}))])),this.nodeSizeChange$=mo(this.entitiesService.nodes).pipe(pi(A=>Ti(...A.map(t=>t.size$.pipe(Cl(1),ye(()=>t))))),ye(A=>[{type:"size",id:A.rawNode.id,size:A.size()}])),this.nodeAddChange$=mo(this.entitiesService.nodes).pipe(yC(),ye(([A,t])=>t.filter(n=>!A.includes(n))),Ct(A=>!!A.length),ye(A=>A.map(t=>({type:"add",id:t.rawNode.id})))),this.nodeRemoveChange$=mo(this.entitiesService.nodes).pipe(yC(),ye(([A,t])=>A.filter(n=>!t.includes(n))),Ct(A=>!!A.length),ye(A=>A.map(t=>({type:"remove",id:t.rawNode.id})))),this.nodeSelectedChange$=mo(this.entitiesService.nodes).pipe(pi(A=>Ti(...A.map(t=>t.selected$.pipe(ug(),Cl(1),ye(()=>t))))),ye(A=>[{type:"select",id:A.rawNode.id,selected:A.selected()}])),this.changes$=Ti(this.nodesPositionChange$,this.nodeSizeChange$,this.nodeAddChange$,this.nodeRemoveChange$,this.nodeSelectedChange$).pipe(XI(l3,Z4A))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),X4A=(i,e)=>i.length===e.length&&[...new Set([...i,...e])].every(A=>i.filter(t=>t===A).length===e.filter(t=>t===A).length),Y_=(()=>{class i{constructor(){this.entitiesService=w(rl),this.edgeDetachedChange$=Ti(mo(me(()=>{let A=this.entitiesService.nodes();return ca(this.entitiesService.edges).filter(({source:n,target:o})=>!A.includes(n())||!A.includes(o()))})),mo(this.entitiesService.edges).pipe(pi(A=>jx(...A.map(t=>t.detached$.pipe(ye(()=>t))))),ye(A=>A.filter(t=>t.detached())),Cl(2))).pipe(ug(X4A),Ct(A=>!!A.length),ye(A=>A.map(({edge:t})=>({type:"detached",id:t.id})))),this.edgeAddChange$=mo(this.entitiesService.edges).pipe(yC(),ye(([A,t])=>t.filter(n=>!A.includes(n))),Ct(A=>!!A.length),ye(A=>A.map(({edge:t})=>({type:"add",id:t.id})))),this.edgeRemoveChange$=mo(this.entitiesService.edges).pipe(yC(),ye(([A,t])=>A.filter(n=>!t.includes(n))),Ct(A=>!!A.length),ye(A=>A.map(({edge:t})=>({type:"remove",id:t.id})))),this.edgeSelectChange$=mo(this.entitiesService.edges).pipe(pi(A=>Ti(...A.map(t=>t.selected$.pipe(ug(),Cl(1),ye(()=>t))))),ye(A=>[{type:"select",id:A.edge.id,selected:A.selected()}])),this.changes$=Ti(this.edgeDetachedChange$,this.edgeAddChange$,this.edgeRemoveChange$,this.edgeSelectChange$).pipe(XI(l3))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),$4A=(()=>{class i{constructor(){this.nodesChangeService=w(J_),this.edgesChangeService=w(Y_),this.onNodesChange=Rn(this.nodesChangeService.changes$),this.onNodesChangePosition=Rn(this.nodeChangesOfType("position"),{alias:"onNodesChange.position"}),this.onNodesChangePositionSignle=Rn(this.singleChange(this.nodeChangesOfType("position")),{alias:"onNodesChange.position.single"}),this.onNodesChangePositionMany=Rn(this.manyChanges(this.nodeChangesOfType("position")),{alias:"onNodesChange.position.many"}),this.onNodesChangeSize=Rn(this.nodeChangesOfType("size"),{alias:"onNodesChange.size"}),this.onNodesChangeSizeSingle=Rn(this.singleChange(this.nodeChangesOfType("size")),{alias:"onNodesChange.size.single"}),this.onNodesChangeSizeMany=Rn(this.manyChanges(this.nodeChangesOfType("size")),{alias:"onNodesChange.size.many"}),this.onNodesChangeAdd=Rn(this.nodeChangesOfType("add"),{alias:"onNodesChange.add"}),this.onNodesChangeAddSingle=Rn(this.singleChange(this.nodeChangesOfType("add")),{alias:"onNodesChange.add.single"}),this.onNodesChangeAddMany=Rn(this.manyChanges(this.nodeChangesOfType("add")),{alias:"onNodesChange.add.many"}),this.onNodesChangeRemove=Rn(this.nodeChangesOfType("remove"),{alias:"onNodesChange.remove"}),this.onNodesChangeRemoveSingle=Rn(this.singleChange(this.nodeChangesOfType("remove")),{alias:"onNodesChange.remove.single"}),this.onNodesChangeRemoveMany=Rn(this.manyChanges(this.nodeChangesOfType("remove")),{alias:"onNodesChange.remove.many"}),this.onNodesChangeSelect=Rn(this.nodeChangesOfType("select"),{alias:"onNodesChange.select"}),this.onNodesChangeSelectSingle=Rn(this.singleChange(this.nodeChangesOfType("select")),{alias:"onNodesChange.select.single"}),this.onNodesChangeSelectMany=Rn(this.manyChanges(this.nodeChangesOfType("select")),{alias:"onNodesChange.select.many"}),this.onEdgesChange=Rn(this.edgesChangeService.changes$),this.onNodesChangeDetached=Rn(this.edgeChangesOfType("detached"),{alias:"onEdgesChange.detached"}),this.onNodesChangeDetachedSingle=Rn(this.singleChange(this.edgeChangesOfType("detached")),{alias:"onEdgesChange.detached.single"}),this.onNodesChangeDetachedMany=Rn(this.manyChanges(this.edgeChangesOfType("detached")),{alias:"onEdgesChange.detached.many"}),this.onEdgesChangeAdd=Rn(this.edgeChangesOfType("add"),{alias:"onEdgesChange.add"}),this.onEdgeChangeAddSingle=Rn(this.singleChange(this.edgeChangesOfType("add")),{alias:"onEdgesChange.add.single"}),this.onEdgeChangeAddMany=Rn(this.manyChanges(this.edgeChangesOfType("add")),{alias:"onEdgesChange.add.many"}),this.onEdgeChangeRemove=Rn(this.edgeChangesOfType("remove"),{alias:"onEdgesChange.remove"}),this.onEdgeChangeRemoveSingle=Rn(this.singleChange(this.edgeChangesOfType("remove")),{alias:"onEdgesChange.remove.single"}),this.onEdgeChangeRemoveMany=Rn(this.manyChanges(this.edgeChangesOfType("remove")),{alias:"onEdgesChange.remove.many"}),this.onEdgeChangeSelect=Rn(this.edgeChangesOfType("select"),{alias:"onEdgesChange.select"}),this.onEdgeChangeSelectSingle=Rn(this.singleChange(this.edgeChangesOfType("select")),{alias:"onEdgesChange.select.single"}),this.onEdgeChangeSelectMany=Rn(this.manyChanges(this.edgeChangesOfType("select")),{alias:"onEdgesChange.select.many"})}nodeChangesOfType(A){return this.nodesChangeService.changes$.pipe(ye(t=>t.filter(n=>n.type===A)),Ct(t=>!!t.length))}edgeChangesOfType(A){return this.edgesChangeService.changes$.pipe(ye(t=>t.filter(n=>n.type===A)),Ct(t=>!!t.length))}singleChange(A){return A.pipe(Ct(t=>t.length===1),ye(([t])=>t))}manyChanges(A){return A.pipe(Ct(t=>t.length>1))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["","changesController",""]],outputs:{onNodesChange:"onNodesChange",onNodesChangePosition:"onNodesChange.position",onNodesChangePositionSignle:"onNodesChange.position.single",onNodesChangePositionMany:"onNodesChange.position.many",onNodesChangeSize:"onNodesChange.size",onNodesChangeSizeSingle:"onNodesChange.size.single",onNodesChangeSizeMany:"onNodesChange.size.many",onNodesChangeAdd:"onNodesChange.add",onNodesChangeAddSingle:"onNodesChange.add.single",onNodesChangeAddMany:"onNodesChange.add.many",onNodesChangeRemove:"onNodesChange.remove",onNodesChangeRemoveSingle:"onNodesChange.remove.single",onNodesChangeRemoveMany:"onNodesChange.remove.many",onNodesChangeSelect:"onNodesChange.select",onNodesChangeSelectSingle:"onNodesChange.select.single",onNodesChangeSelectMany:"onNodesChange.select.many",onEdgesChange:"onEdgesChange",onNodesChangeDetached:"onEdgesChange.detached",onNodesChangeDetachedSingle:"onEdgesChange.detached.single",onNodesChangeDetachedMany:"onEdgesChange.detached.many",onEdgesChangeAdd:"onEdgesChange.add",onEdgeChangeAddSingle:"onEdgesChange.add.single",onEdgeChangeAddMany:"onEdgesChange.add.many",onEdgeChangeRemove:"onEdgesChange.remove",onEdgeChangeRemoveSingle:"onEdgesChange.remove.single",onEdgeChangeRemoveMany:"onEdgesChange.remove.many",onEdgeChangeSelect:"onEdgesChange.select",onEdgeChangeSelectSingle:"onEdgesChange.select.single",onEdgeChangeSelectMany:"onEdgesChange.select.many"}})}}return i})(),Zw=(()=>{class i{constructor(){this.host=w(se).nativeElement,this.initialTouch$=new te,this.prevTouchEvent=null,this.mouseMovement$=pc(this.host,"mousemove").pipe(ye(A=>({x:A.clientX,y:A.clientY,movementX:A.movementX,movementY:A.movementY,target:A.target,originalEvent:A})),XI(ZI),vC()),this.touchMovement$=Ti(this.initialTouch$,pc(this.host,"touchmove")).pipe(Ei(A=>A.preventDefault()),ye(A=>{let t=A.touches[0]?.clientX??0,n=A.touches[0]?.clientY??0,o=this.prevTouchEvent?A.touches[0].pageX-this.prevTouchEvent.touches[0].pageX:0,a=this.prevTouchEvent?A.touches[0].pageY-this.prevTouchEvent.touches[0].pageY:0,r=document.elementFromPoint(t,n);return{x:t,y:n,movementX:o,movementY:a,target:r,originalEvent:A}}),Ei(A=>this.prevTouchEvent=A.originalEvent),XI(ZI),vC()),this.pointerMovement$=Ti(this.mouseMovement$,this.touchMovement$),this.touchEnd$=pc(this.host,"touchend").pipe(ye(A=>{let t=A.changedTouches[0]?.clientX??0,n=A.changedTouches[0]?.clientY??0,o=document.elementFromPoint(t,n);return{x:t,y:n,target:o,originalEvent:A}}),Ei(()=>this.prevTouchEvent=null),vC()),this.mouseUp$=pc(this.host,"mouseup").pipe(ye(A=>{let t=A.clientX,n=A.clientY,o=A.target;return{x:t,y:n,target:o,originalEvent:A}}),vC()),this.documentPointerEnd$=Ti(pc(document,"mouseup"),pc(document,"touchend")).pipe(vC())}setInitialTouch(A){this.initialTouch$.next(A)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["svg","rootPointer",""]]})}}return i})(),Ou=(()=>{class i{constructor(){this.pointerMovementDirective=w(Zw),this.rootSvg=w(Ww).element,this.host=w(se).nativeElement,this.svgCurrentSpacePoint=me(()=>{let A=this.pointerMovement();return A?this.documentPointToFlowPoint({x:A.x,y:A.y}):{x:0,y:0}}),this.pointerMovement=Za(this.pointerMovementDirective.pointerMovement$)}documentPointToFlowPoint(A){let t=this.rootSvg.createSVGPoint();return t.x=A.x,t.y=A.y,t.matrixTransform(this.host.getScreenCTM().inverse())}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["g","spacePointContext",""]]})}}return i})();function AuA(i){return typeof i=="string"?{type:"solid",color:i}:i}function Vw(i,e,A){let t=A.value;return A.value=function(...n){queueMicrotask(()=>{t?.apply(this,n)})},A}var YV=(()=>{class i{constructor(){this.toolbars=mA([]),this.nodeToolbarsMap=me(()=>{let A=new Map;return this.toolbars().forEach(t=>{let n=A.get(t.node)??[];A.set(t.node,[...n,t])}),A})}addToolbar(A){this.toolbars.update(t=>[...t,A])}removeToolbar(A){this.toolbars.update(t=>t.filter(n=>n!==A))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return hh([Vw],i.prototype,"addToolbar",null),hh([Vw],i.prototype,"removeToolbar",null),i})();function Xw(i,e){return new bi(A=>{let t=new ResizeObserver(n=>{e.run(()=>A.next(n))});return i.forEach(n=>t.observe(n)),()=>t.disconnect()})}var euA=(()=>{class i{constructor(){this.zone=w(qe),this.destroyRef=w(ar),this.settingsService=w(Wr),this.model=De.required(),this.edgeModel=De.required(),this.point=De({x:0,y:0}),this.htmlTemplate=De(),this.edgeLabelWrapperRef=ko.required("edgeLabelWrapper"),this.edgeLabelPoint=me(()=>{let A=this.point(),{width:t,height:n}=this.model().size();return{x:A.x-t/2,y:A.y-n/2}}),this.edgeLabelStyle=me(()=>{let A=this.model().edgeLabel;if(A.type==="default"&&A.style){let t=this.settingsService.background(),n="transparent";return t.type==="dots"&&(n=t.backgroundColor??"#fff"),t.type==="solid"&&(n=t.color),A.style.backgroundColor=A.style.backgroundColor??n,A.style}return null})}ngAfterViewInit(){let A=this.edgeLabelWrapperRef().nativeElement;Xw([A],this.zone).pipe(kn(null),Ei(()=>{let t=A.clientWidth+Pw,n=A.clientHeight+Pw;this.model().size.set({width:t,height:n})}),pr(this.destroyRef)).subscribe()}getLabelContext(){return{$implicit:{edge:this.edgeModel().edge,label:this.model().edgeLabel}}}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["g","edgeLabel",""]],viewQuery:function(t,n){t&1&&Xr(n.edgeLabelWrapperRef,eQA,5),t&2&&Er()},inputs:{model:[1,"model"],edgeModel:[1,"edgeModel"],point:[1,"point"],htmlTemplate:[1,"htmlTemplate"]},attrs:tQA,decls:1,vars:1,consts:[["edgeLabelWrapper",""],[1,"edge-label-wrapper"],[4,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(t,n){if(t&1&&Y(0,rQA,2,2),t&2){let o;O((o=n.model())?0:-1,o)}},dependencies:[vc],styles:[".edge-label-wrapper[_ngcontent-%COMP%]{width:max-content;margin-top:1px;margin-left:1px}"],changeDetection:0})}}return i})();function OV(i){let e={};return i.sourceHandle.rawHandle.type==="source"?(e.source=i.source,e.sourceHandle=i.sourceHandle):(e.source=i.target,e.sourceHandle=i.targetHandle),i.targetHandle.rawHandle.type==="target"?(e.target=i.target,e.targetHandle=i.targetHandle):(e.target=i.source,e.targetHandle=i.sourceHandle),e}var HV=(()=>{class i{constructor(){this.statusService=w(j2),this.flowEntitiesService=w(rl),this.onConnect=Rn(mo(this.statusService.status).pipe(Ct(A=>A.state==="connection-end"),ye(A=>Tw(A,this.isStrictMode())),Ei(()=>this.statusService.setIdleStatus()),Ct(A=>this.flowEntitiesService.connection().validator(A)))),this.connect=Rn(mo(this.statusService.status).pipe(Ct(A=>A.state==="connection-end"),ye(A=>Tw(A,this.isStrictMode())),Ei(()=>this.statusService.setIdleStatus()),Ct(A=>this.flowEntitiesService.connection().validator(A)))),this.onReconnect=Rn(mo(this.statusService.status).pipe(Ct(A=>A.state==="reconnection-end"),ye(A=>{let t=Tw(A,this.isStrictMode()),n=A.payload.oldEdge.edge;return{connection:t,oldEdge:n}}),Ei(()=>this.statusService.setIdleStatus()),Ct(({connection:A})=>this.flowEntitiesService.connection().validator(A)))),this.reconnect=Rn(mo(this.statusService.status).pipe(Ct(A=>A.state==="reconnection-end"),ye(A=>{let t=Tw(A,this.isStrictMode()),n=A.payload.oldEdge.edge;return{connection:t,oldEdge:n}}),Ei(()=>this.statusService.setIdleStatus()),Ct(({connection:A})=>this.flowEntitiesService.connection().validator(A)))),this.isStrictMode=me(()=>this.flowEntitiesService.connection().mode==="strict")}startConnection(A){this.statusService.setConnectionStartStatus(A.parentNode,A)}startReconnection(A,t){this.statusService.setReconnectionStartStatus(A.parentNode,A,t)}validateConnection(A){let t=this.statusService.status();if(t.state==="connection-start"||t.state==="reconnection-start"){let n=t.state==="reconnection-start",o=t.payload.source,a=A.parentNode,r=t.payload.sourceHandle,s=A;if(this.isStrictMode()){let g=OV({source:t.payload.source,sourceHandle:t.payload.sourceHandle,target:A.parentNode,targetHandle:A});o=g.source,a=g.target,r=g.sourceHandle,s=g.targetHandle}let l=this.flowEntitiesService.connection().validator({source:o.rawNode.id,target:a.rawNode.id,sourceHandle:r.rawHandle.id,targetHandle:s.rawHandle.id});A.state.set(l?"valid":"invalid"),n?this.statusService.setReconnectionValidationStatus(l,t.payload.source,A.parentNode,t.payload.sourceHandle,A,t.payload.oldEdge):this.statusService.setConnectionValidationStatus(l,t.payload.source,A.parentNode,t.payload.sourceHandle,A)}}resetValidateConnection(A){A.state.set("idle");let t=this.statusService.status();(t.state==="connection-validation"||t.state==="reconnection-validation")&&(t.state==="reconnection-validation"?this.statusService.setReconnectionStartStatus(t.payload.source,t.payload.sourceHandle,t.payload.oldEdge):this.statusService.setConnectionStartStatus(t.payload.source,t.payload.sourceHandle))}endConnection(){let A=this.statusService.status();if(A.state==="connection-validation"||A.state==="reconnection-validation"){let t=A.state==="reconnection-validation",n=A.payload.source,o=A.payload.sourceHandle,a=A.payload.target,r=A.payload.targetHandle;t?this.statusService.setReconnectionEndStatus(n,a,o,r,A.payload.oldEdge):this.statusService.setConnectionEndStatus(n,a,o,r)}}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["","onConnect",""],["","onReconnect",""],["","connect",""],["","reconnect",""]],outputs:{onConnect:"onConnect",connect:"connect",onReconnect:"onReconnect",reconnect:"reconnect"}})}}return i})();function Tw(i,e){let A=i.payload.source,t=i.payload.target,n=i.payload.sourceHandle,o=i.payload.targetHandle;if(e){let g=OV({source:i.payload.source,sourceHandle:i.payload.sourceHandle,target:i.payload.target,targetHandle:i.payload.targetHandle});A=g.source,t=g.target,n=g.sourceHandle,o=g.targetHandle}let a=A.rawNode.id,r=t.rawNode.id,s=n.rawHandle.id,l=o.rawHandle.id;return{source:a,target:r,sourceHandle:s,targetHandle:l}}var Pu=(()=>{class i{constructor(){this.flowEntitiesService=w(rl),this.flowSettingsService=w(Wr),this.edges=me(()=>this.flowSettingsService.optimization().virtualization?this.viewportEdges().sort((A,t)=>A.renderOrder()-t.renderOrder()):[...this.flowEntitiesService.validEdges()].sort((A,t)=>A.renderOrder()-t.renderOrder())),this.viewportEdges=me(()=>this.flowEntitiesService.validEdges().filter(A=>{let t=A.sourceHandle(),n=A.targetHandle();return t&&n})),this.maxOrder=me(()=>Math.max(...this.flowEntitiesService.validEdges().map(A=>A.renderOrder())))}pull(A){A.renderOrder()!==0&&this.maxOrder()===A.renderOrder()||A.renderOrder.set(this.maxOrder()+1)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function tuA(i){return window.TouchEvent&&i instanceof TouchEvent}var j_=(()=>{class i{constructor(){this.hostElement=w(se).nativeElement,this.pointerMovementDirective=w(Zw),this.pointerOver=fi(),this.pointerOut=fi(),this.pointerStart=fi(),this.pointerEnd=fi(),this.wasPointerOver=!1,this.touchEnd=this.pointerMovementDirective.touchEnd$.pipe(Ct(({target:A})=>A===this.hostElement),Ei(({originalEvent:A})=>this.pointerEnd.emit(A)),pr()).subscribe(),this.touchOverOut=this.pointerMovementDirective.touchMovement$.pipe(Ei(({target:A,originalEvent:t})=>{this.handleTouchOverAndOut(A,t)}),pr()).subscribe()}onPointerStart(A){this.pointerStart.emit(A),tuA(A)&&this.pointerMovementDirective.setInitialTouch(A)}onPointerEnd(A){this.pointerEnd.emit(A)}onMouseOver(A){this.pointerOver.emit(A)}onMouseOut(A){this.pointerOut.emit(A)}handleTouchOverAndOut(A,t){A===this.hostElement?(this.pointerOver.emit(t),this.wasPointerOver=!0):(this.wasPointerOver&&this.pointerOut.emit(t),this.wasPointerOver=!1)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["","pointerStart",""],["","pointerEnd",""],["","pointerOver",""],["","pointerOut",""]],hostBindings:function(t,n){t&1&&T("mousedown",function(a){return n.onPointerStart(a)})("touchstart",function(a){return n.onPointerStart(a)})("mouseup",function(a){return n.onPointerEnd(a)})("mouseover",function(a){return n.onMouseOver(a)})("mouseout",function(a){return n.onMouseOut(a)})},outputs:{pointerOver:"pointerOver",pointerOut:"pointerOut",pointerStart:"pointerStart",pointerEnd:"pointerEnd"}})}}return i})(),q_=(()=>{class i{constructor(){this.injector=w(Dt),this.selectionService=w(ju),this.flowSettingsService=w(Wr),this.flowStatusService=w(j2),this.edgeRenderingService=w(Pu),this.connectionController=w(HV,{optional:!0}),this.model=De.required(),this.edgeTemplate=De(),this.edgeLabelHtmlTemplate=De(),this.isReconnecting=me(()=>{let A=this.flowStatusService.status();return(A.state==="reconnection-start"||A.state==="reconnection-validation")&&A.payload.oldEdge===this.model()})}select(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}pull(){this.flowSettingsService.elevateEdgesOnSelect()&&this.edgeRenderingService.pull(this.model())}startReconnection(A,t){A.stopPropagation(),this.connectionController?.startReconnection(t,this.model())}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["g","edge",""]],hostAttrs:[1,"selectable"],hostVars:2,hostBindings:function(t,n){t&2&&ht("visibility",n.isReconnecting()?"hidden":"visible")},inputs:{model:[1,"model"],edgeTemplate:[1,"edgeTemplate"],edgeLabelHtmlTemplate:[1,"edgeLabelHtmlTemplate"]},attrs:sQA,decls:6,vars:6,consts:[[1,"edge"],[1,"interactive-edge",3,"click"],[3,"ngTemplateOutlet","ngTemplateOutletContext","ngTemplateOutletInjector"],["edgeLabel","",3,"model","point","edgeModel","htmlTemplate"],["r","10",1,"reconnect-handle"],["r","10",1,"reconnect-handle",3,"pointerStart"]],template:function(t,n){if(t&1&&(Y(0,lQA,2,6),Y(1,cQA,1,1),Y(2,IQA,1,1),Y(3,BQA,1,1),Y(4,hQA,1,1),Y(5,pQA,2,2)),t&2){let o,a,r;O(n.model().type==="default"?0:-1),u(),O(n.model().type==="template"&&n.edgeTemplate()?1:-1),u(),O((o=n.model().edgeLabels.start)?2:-1,o),u(),O((a=n.model().edgeLabels.center)?3:-1,a),u(),O((r=n.model().edgeLabels.end)?4:-1,r),u(),O(n.model().sourceHandle()&&n.model().targetHandle()?5:-1)}},dependencies:[vc,euA,j_],styles:[".edge[_ngcontent-%COMP%]{fill:none;stroke-width:2;stroke:#b1b1b7}.edge_selected[_ngcontent-%COMP%]{stroke-width:2.5;stroke:#0f4c75}.interactive-edge[_ngcontent-%COMP%]{fill:none;stroke-width:20;stroke:transparent}.reconnect-handle[_ngcontent-%COMP%]{fill:transparent;cursor:move}"],changeDetection:0})}}return i})(),O_=(()=>{class i{constructor(){this.node=mA(null)}createHandle(A){let t=this.node();t&&t.handles.update(n=>[...n,A])}destroyHandle(A){let t=this.node();t&&t.handles.update(n=>n.filter(o=>o!==A))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return hh([Vw],i.prototype,"createHandle",null),i})(),iuA=(()=>{class i{constructor(){this.handleModel=De.required({alias:"handleSizeController"}),this.handleWrapper=w(se)}ngAfterViewInit(){let A=this.handleWrapper.nativeElement,t=A.getBBox(),n=nuA(A);this.handleModel().size.set({width:t.width+n,height:t.height+n})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["","handleSizeController",""]],inputs:{handleModel:[1,"handleSizeController","handleModel"]}})}}return i})();function nuA(i){let e=i.firstElementChild;if(e){let A=getComputedStyle(e).strokeWidth,t=Number(A.replace("px",""));return isNaN(t)?0:t}return 0}var ouA=(()=>{class i{constructor(){this.selected=De(!1)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["default-node"]],hostVars:2,hostBindings:function(t,n){t&2&&xA("selected",n.selected())},inputs:{selected:[1,"selected"]},ngContentSelectors:P_,decls:1,vars:0,template:function(t,n){t&1&&(Nt(),Ve(0))},styles:["[_nghost-%COMP%]{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}.selected[_nghost-%COMP%]{border-width:2px}"],changeDetection:0})}}return i})(),auA=(()=>{class i{get model(){return this.nodeAccessor.model()}constructor(){this.nodeAccessor=w(qE),this.rootPointer=w(Zw),this.viewportService=w(HI),this.spacePointContext=w(Ou),this.settingsService=w(Wr),this.hostRef=w(se),this.resizable=De(),this.resizerColor=De("#2e414c"),this.gap=De(1.5),this.resizer=ko.required("resizer"),this.lineGap=3,this.handleSize=6,this.resizeSide=null,this.zoom=me(()=>this.viewportService.readableViewport().zoom??0),this.minWidth=0,this.minHeight=0,this.maxWidth=1/0,this.maxHeight=1/0,this.resizeOnGlobalMouseMove=this.rootPointer.pointerMovement$.pipe(Ct(()=>this.resizeSide!==null),Ct(A=>A.movementX!==0||A.movementY!==0),Ei(A=>this.resize(A)),pr()).subscribe(),this.endResizeOnGlobalMouseUp=this.rootPointer.documentPointerEnd$.pipe(Ei(()=>this.endResize()),pr()).subscribe(),_n(()=>{let A=this.resizable();typeof A=="boolean"?this.model.resizable.set(A):this.model.resizable.set(!0)},{allowSignalWrites:!0})}ngOnInit(){this.model.controlledByResizer.set(!0),this.model.resizerTemplate.set(this.resizer())}ngOnDestroy(){this.model.controlledByResizer.set(!1)}ngAfterViewInit(){this.minWidth=+getComputedStyle(this.hostRef.nativeElement).minWidth.replace("px","")||0,this.minHeight=+getComputedStyle(this.hostRef.nativeElement).minHeight.replace("px","")||0,this.maxWidth=+getComputedStyle(this.hostRef.nativeElement).maxWidth.replace("px","")||1/0,this.maxHeight=+getComputedStyle(this.hostRef.nativeElement).maxHeight.replace("px","")||1/0}startResize(A,t){t.stopPropagation(),this.resizeSide=A,this.model.resizing.set(!0)}resize(A){if(!this.resizeSide)return;let t=ruA(A.movementX,A.movementY,this.zoom()),n=this.applyResize(this.resizeSide,this.model,t,this.getDistanceToEdge(A)),{x:o,y:a,width:r,height:s}=suA(n,this.model,this.resizeSide,this.minWidth,this.minHeight,this.maxWidth,this.maxHeight);this.model.setPoint({x:o,y:a}),this.model.width.set(r),this.model.height.set(s)}endResize(){this.resizeSide=null,this.model.resizing.set(!1)}getDistanceToEdge(A){let t=this.spacePointContext.documentPointToFlowPoint({x:A.x,y:A.y}),{x:n,y:o}=this.model.globalPoint();return{left:t.x-n,right:t.x-(n+this.model.width()),top:t.y-o,bottom:t.y-(o+this.model.height())}}applyResize(A,t,n,o){let{x:a,y:r}=t.point(),s=t.width(),l=t.height(),[g,C]=this.settingsService.snapGrid();switch(A){case"left":{let I=n.x+o.left,B=al(a+I,g),Q=B-a;return{x:B,y:r,width:s-Q,height:l}}case"right":{let I=n.x+o.right,B=al(s+I,g);return{x:a,y:r,width:B,height:l}}case"top":{let I=n.y+o.top,B=al(r+I,C),Q=B-r;return{x:a,y:B,width:s,height:l-Q}}case"bottom":{let I=n.y+o.bottom,B=al(l+I,C);return{x:a,y:r,width:s,height:B}}case"top-left":{let I=n.x+o.left,B=n.y+o.top,Q=al(a+I,g),h=al(r+B,C),f=Q-a,m=h-r;return{x:Q,y:h,width:s-f,height:l-m}}case"top-right":{let I=n.x+o.right,B=n.y+o.top,Q=al(r+B,C),h=Q-r;return{x:a,y:Q,width:al(s+I,g),height:l-h}}case"bottom-left":{let I=n.x+o.left,B=n.y+o.bottom,Q=al(a+I,g),h=Q-a;return{x:Q,y:r,width:s-h,height:al(l+B,C)}}case"bottom-right":{let I=n.x+o.right,B=n.y+o.bottom;return{x:a,y:r,width:al(s+I,g),height:al(l+B,C)}}}}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["","resizable",""]],viewQuery:function(t,n){t&1&&Xr(n.resizer,fQA,5),t&2&&Er()},inputs:{resizable:[1,"resizable"],resizerColor:[1,"resizerColor"],gap:[1,"gap"]},attrs:mQA,ngContentSelectors:P_,decls:3,vars:0,consts:[["resizer",""],["stroke-width","2",1,"top",3,"pointerStart"],["stroke-width","2",1,"left",3,"pointerStart"],["stroke-width","2",1,"bottom",3,"pointerStart"],["stroke-width","2",1,"right",3,"pointerStart"],[1,"top-left",3,"pointerStart"],[1,"top-right",3,"pointerStart"],[1,"bottom-left",3,"pointerStart"],[1,"bottom-right",3,"pointerStart"]],template:function(t,n){t&1&&(Nt(),yt(0,wQA,9,40,"ng-template",null,0,MC),Ve(2))},dependencies:[j_],styles:[".top[_ngcontent-%COMP%]{cursor:n-resize}.left[_ngcontent-%COMP%]{cursor:w-resize}.right[_ngcontent-%COMP%]{cursor:e-resize}.bottom[_ngcontent-%COMP%]{cursor:s-resize}.top-left[_ngcontent-%COMP%]{cursor:nw-resize}.top-right[_ngcontent-%COMP%]{cursor:ne-resize}.bottom-left[_ngcontent-%COMP%]{cursor:sw-resize}.bottom-right[_ngcontent-%COMP%]{cursor:se-resize}"],changeDetection:0})}}return hh([Vw],i.prototype,"ngAfterViewInit",null),i})();function ruA(i,e,A){return{x:Ow(i/A),y:Ow(e/A)}}function suA(i,e,A,t,n,o,a){let{x:r,y:s,width:l,height:g}=i;l=Math.max(l,0),g=Math.max(g,0),l=Math.max(t,l),g=Math.max(n,g),l=Math.min(o,l),g=Math.min(a,g),r=Math.min(r,e.point().x+e.width()-t),s=Math.min(s,e.point().y+e.height()-n),r=Math.max(r,e.point().x+e.width()-o),s=Math.max(s,e.point().y+e.height()-a);let C=e.parent();if(C){let B=C.width(),Q=C.height(),h=e.point().x,f=e.point().y;r=Math.max(r,0),s=Math.max(s,0),A.includes("left")&&r===0&&(l=Math.min(l,h+e.width())),A.includes("top")&&s===0&&(g=Math.min(g,f+e.height())),l=Math.min(l,B-r),g=Math.min(g,Q-s)}let I=GV(e.children());return I&&(A.includes("left")&&(r=Math.min(r,e.point().x+e.width()-(I.x+I.width)),l=Math.max(l,I.x+I.width)),A.includes("right")&&(l=Math.max(l,I.x+I.width)),A.includes("bottom")&&(g=Math.max(g,I.y+I.height)),A.includes("top")&&(s=Math.min(s,e.point().y+e.height()-(I.y+I.height)),g=Math.max(g,I.y+I.height))),{x:r,y:s,width:l,height:g}}var H_=class{constructor(e,A){this.rawHandle=e,this.parentNode=A,this.strokeWidth=2,this.size=mA({width:10+2*this.strokeWidth,height:10+2*this.strokeWidth}),this.pointAbsolute=me(()=>({x:this.parentNode.globalPoint().x+this.hostOffset().x+this.sizeOffset().x,y:this.parentNode.globalPoint().y+this.hostOffset().y+this.sizeOffset().y})),this.state=mA("idle"),this.updateHostSizeAndPosition$=new te,this.hostSize=Za(this.updateHostSizeAndPosition$.pipe(ye(()=>this.getHostSize())),{initialValue:{width:0,height:0}}),this.hostPosition=Za(this.updateHostSizeAndPosition$.pipe(ye(()=>({x:this.hostReference instanceof HTMLElement?this.hostReference.offsetLeft:0,y:this.hostReference instanceof HTMLElement?this.hostReference.offsetTop:0}))),{initialValue:{x:0,y:0}}),this.hostOffset=me(()=>{switch(this.rawHandle.position){case"left":return{x:-this.rawHandle.userOffsetX,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case"right":return{x:-this.rawHandle.userOffsetX+this.parentNode.size().width,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case"top":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY};case"bottom":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY+this.parentNode.size().height}}}),this.sizeOffset=me(()=>{switch(this.rawHandle.position){case"left":return{x:-(this.size().width/2),y:0};case"right":return{x:this.size().width/2,y:0};case"top":return{x:0,y:-(this.size().height/2)};case"bottom":return{x:0,y:this.size().height/2}}}),this.hostReference=this.rawHandle.hostReference,this.template=this.rawHandle.template,this.templateContext={$implicit:{point:this.hostOffset,state:this.state,node:this.parentNode.rawNode}}}updateHost(){this.updateHostSizeAndPosition$.next()}getHostSize(){return this.hostReference instanceof HTMLElement?{width:this.hostReference.offsetWidth,height:this.hostReference.offsetHeight}:this.hostReference instanceof SVGGraphicsElement?this.hostReference.getBBox():{width:0,height:0}}},qu=(()=>{class i{constructor(){this.injector=w(Dt),this.handleService=w(O_),this.element=w(se).nativeElement,this.destroyRef=w(ar),this.position=De.required(),this.type=De.required(),this.id=De(),this.template=De(),this.offsetX=De(0),this.offsetY=De(0)}ngOnInit(){Br(this.injector,()=>{let A=this.handleService.node();if(A){let t=new H_({position:this.position(),type:this.type(),id:this.id(),hostReference:this.element.parentElement,template:this.template(),userOffsetX:this.offsetX(),userOffsetY:this.offsetY()},A);this.handleService.createHandle(t),requestAnimationFrame(()=>t.updateHost()),this.destroyRef.onDestroy(()=>this.handleService.destroyHandle(t))}})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["handle"]],inputs:{position:[1,"position"],type:[1,"type"],id:[1,"id"],template:[1,"template"],offsetX:[1,"offsetX"],offsetY:[1,"offsetY"]},decls:0,vars:0,template:function(t,n){},encapsulation:2,changeDetection:0})}}return i})(),luA=(()=>{class i{constructor(){this.nodeAccessor=w(qE),this.zone=w(qe),this.destroyRef=w(ar),this.hostElementRef=w(se)}ngOnInit(){this.nodeAccessor.model().handles$.pipe(pi(t=>Xw([...t.map(n=>n.hostReference),this.hostElementRef.nativeElement],this.zone).pipe(ye(()=>t))),Ei(t=>{t.forEach(n=>n.updateHost())}),pr(this.destroyRef)).subscribe()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["","nodeHandlesController",""]]})}}return i})(),guA=(()=>{class i{constructor(){this.nodeAccessor=w(qE),this.zone=w(qe),this.destroyRef=w(ar),this.hostElementRef=w(se)}ngOnInit(){let A=this.nodeAccessor.model(),t=this.hostElementRef.nativeElement;Ti(Xw([t],this.zone)).pipe(kn(null),Ct(()=>!A.resizing()),Ei(()=>{A.width.set(t.clientWidth),A.height.set(t.clientHeight)}),pr(this.destroyRef)).subscribe()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["","nodeResizeController",""]]})}}return i})(),zV=(()=>{class i{constructor(){this.injector=w(Dt),this.handleService=w(O_),this.draggableService=w(KV),this.flowStatusService=w(j2),this.nodeRenderingService=w(zI),this.flowSettingsService=w(Wr),this.selectionService=w(ju),this.hostRef=w(se),this.nodeAccessor=w(qE),this.overlaysService=w(YV),this.connectionController=w(HV,{optional:!0}),this.model=De.required(),this.nodeTemplate=De(),this.nodeSvgTemplate=De(),this.groupNodeTemplate=De(),this.showMagnet=me(()=>this.flowStatusService.status().state==="connection-start"||this.flowStatusService.status().state==="connection-validation"||this.flowStatusService.status().state==="reconnection-start"||this.flowStatusService.status().state==="reconnection-validation"),this.toolbars=me(()=>this.overlaysService.nodeToolbarsMap().get(this.model()))}ngOnInit(){this.model().isVisible.set(!0),this.nodeAccessor.model.set(this.model()),this.handleService.node.set(this.model()),_n(()=>{this.model().draggable()?this.draggableService.enable(this.hostRef.nativeElement,this.model()):this.draggableService.disable(this.hostRef.nativeElement)},{injector:this.injector})}ngOnDestroy(){this.model().isVisible.set(!1),this.draggableService.destroy(this.hostRef.nativeElement)}startConnection(A,t){A.stopPropagation(),this.connectionController?.startConnection(t)}validateConnection(A){this.connectionController?.validateConnection(A)}resetValidateConnection(A){this.connectionController?.resetValidateConnection(A)}endConnection(){this.connectionController?.endConnection()}pullNode(){this.flowSettingsService.elevateNodesOnSelect()&&this.nodeRenderingService.pullNode(this.model())}selectNode(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["g","node",""]],hostAttrs:[1,"vflow-node"],inputs:{model:[1,"model"],nodeTemplate:[1,"nodeTemplate"],nodeSvgTemplate:[1,"nodeSvgTemplate"],groupNodeTemplate:[1,"groupNodeTemplate"]},features:[Et([O_,qE])],attrs:DQA,decls:11,vars:7,consts:[[1,"selectable"],["nodeHandlesController","",1,"selectable"],["rx","5","ry","5",1,"default-group-node",3,"resizable","gap","resizerColor","default-group-node_selected","stroke","fill"],[1,"selectable",3,"click"],["nodeHandlesController","",3,"selected"],[3,"outerHTML"],["type","source","position","right"],["type","target","position","left"],["nodeHandlesController","","nodeResizeController","",1,"wrapper"],[3,"ngTemplateOutlet","ngTemplateOutletContext","ngTemplateOutletInjector"],["nodeHandlesController","",1,"selectable",3,"click"],[3,"ngComponentOutlet","ngComponentOutletInputs","ngComponentOutletInjector"],["rx","5","ry","5",1,"default-group-node",3,"click","resizable","gap","resizerColor"],[3,"ngTemplateOutlet"],["r","5",1,"default-handle"],[3,"handleSizeController"],[1,"magnet"],["r","5",1,"default-handle",3,"pointerStart","pointerEnd"],[3,"pointerStart","pointerEnd","handleSizeController"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"magnet",3,"pointerEnd","pointerOver","pointerOut"]],template:function(t,n){if(t&1&&(Y(0,yQA,5,12,":svg:foreignObject",0),Y(1,vQA,3,9,":svg:foreignObject",0),Y(2,bQA,2,3,":svg:g",1),Y(3,SQA,2,3),Y(4,kQA,1,11,":svg:rect",2),Y(5,_QA,2,3,":svg:g",1),Y(6,NQA,1,1),xe(7,TQA,4,4,null,null,ni),xe(9,JQA,2,4,":svg:foreignObject",null,ni)),t&2){let o;O(n.model().rawNode.type==="default"?0:-1),u(),O(n.model().rawNode.type==="html-template"&&n.nodeTemplate()?1:-1),u(),O(n.model().rawNode.type==="svg-template"&&n.nodeSvgTemplate()?2:-1),u(),O(n.model().isComponentType?3:-1),u(),O(n.model().rawNode.type==="default-group"?4:-1),u(),O(n.model().rawNode.type==="template-group"&&n.groupNodeTemplate()?5:-1),u(),O((o=n.model().resizerTemplate())?6:-1,o),u(),Re(n.model().handles()),u(2),Re(n.toolbars())}},dependencies:[j_,ouA,qu,vc,yc,auA,iuA,luA,guA,$r],styles:[".magnet[_ngcontent-%COMP%]{opacity:0}.wrapper[_ngcontent-%COMP%]{display:table-cell}.default-group-node[_ngcontent-%COMP%]{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected[_ngcontent-%COMP%]{stroke-width:2px}.default-handle[_ngcontent-%COMP%]{stroke:#fff;fill:#1b262c}"],changeDetection:0})}}return i})(),cuA=(()=>{class i{constructor(){this.flowStatusService=w(j2),this.spacePointContext=w(Ou),this.flowEntitiesService=w(rl),this.model=De.required(),this.template=De(),this.path=me(()=>{let A=this.flowStatusService.status(),t=this.model().curve;if(A.state==="connection-start"||A.state==="reconnection-start"){let n=A.payload.sourceHandle,o=n.pointAbsolute(),a=n.rawHandle.position,r=this.spacePointContext.svgCurrentSpacePoint(),s=xV(n.rawHandle.position),l=this.getPathFactoryParams(o,r,a,s);switch(t){case"straight":return K_(l).path;case"bezier":return U_(l).path;case"smooth-step":return zE(l).path;case"step":return zE(l,0).path;default:return t(l).path}}if(A.state==="connection-validation"||A.state==="reconnection-validation"){let n=A.payload.sourceHandle,o=n.pointAbsolute(),a=n.rawHandle.position,r=A.payload.targetHandle,s=A.payload.valid?r.pointAbsolute():this.spacePointContext.svgCurrentSpacePoint(),l=A.payload.valid?r.rawHandle.position:xV(n.rawHandle.position),g=this.getPathFactoryParams(o,s,a,l);switch(t){case"straight":return K_(g).path;case"bezier":return U_(g).path;case"smooth-step":return zE(g).path;case"step":return zE(g,0).path;default:return t(g).path}}return null}),this.markerUrl=me(()=>{let A=this.model().settings.marker;return A?`url(#${PE(JSON.stringify(A))})`:""}),this.defaultColor="rgb(177, 177, 183)"}getContext(){return{$implicit:{path:this.path,marker:this.markerUrl}}}getPathFactoryParams(A,t,n,o){return{mode:"connection",sourcePoint:A,targetPoint:t,sourcePosition:n,targetPosition:o,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["g","connection",""]],inputs:{model:[1,"model"],template:[1,"template"]},attrs:YQA,decls:2,vars:2,consts:[["fill","none","stroke-width","2"],[4,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(t,n){t&1&&(Y(0,HQA,1,1),Y(1,jQA,1,1)),t&2&&(O(n.model().type==="default"?0:-1),u(),O(n.model().type==="template"?1:-1))},dependencies:[vc],encapsulation:2,changeDetection:0})}}return i})();function xV(i){switch(i){case"top":return"bottom";case"bottom":return"top";case"left":return"right";case"right":return"left"}}function CuA(){return String.fromCharCode(65+Math.floor(Math.random()*26))+Date.now()}var IuA="#fff",duA=20,BuA=2,RV="rgb(177, 177, 183)",NV=.1,EuA=!0,huA=(()=>{class i{constructor(){this.viewportService=w(HI),this.rootSvg=w(Ww).element,this.settingsService=w(Wr),this.backgroundSignal=this.settingsService.background,this.scaledGap=me(()=>{let A=this.backgroundSignal();return A.type==="dots"?this.viewportService.readableViewport().zoom*(A.gap??duA):0}),this.x=me(()=>this.viewportService.readableViewport().x%this.scaledGap()),this.y=me(()=>this.viewportService.readableViewport().y%this.scaledGap()),this.patternColor=me(()=>{let A=this.backgroundSignal();return A.type==="dots"?A.color??RV:RV}),this.patternSize=me(()=>{let A=this.backgroundSignal();return A.type==="dots"?this.viewportService.readableViewport().zoom*(A.size??BuA)/2:0}),this.bgImageSrc=me(()=>{let A=this.backgroundSignal();return A.type==="image"?A.src:""}),this.imageSize=zu(mo(this.backgroundSignal).pipe(pi(()=>QuA(this.bgImageSrc())),ye(A=>({width:A.naturalWidth,height:A.naturalHeight}))),{initialValue:{width:0,height:0}}),this.scaledImageWidth=me(()=>{let A=this.backgroundSignal();if(A.type==="image"){let t=A.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().width*t*(A.scale??NV)}return 0}),this.scaledImageHeight=me(()=>{let A=this.backgroundSignal();if(A.type==="image"){let t=A.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().height*t*(A.scale??NV)}return 0}),this.imageX=me(()=>{let A=this.backgroundSignal();return A.type==="image"?A.repeat?A.fixed?0:this.viewportService.readableViewport().x%this.scaledImageWidth():A.fixed?0:this.viewportService.readableViewport().x:0}),this.imageY=me(()=>{let A=this.backgroundSignal();return A.type==="image"?A.repeat?A.fixed?0:this.viewportService.readableViewport().y%this.scaledImageHeight():A.fixed?0:this.viewportService.readableViewport().y:0}),this.repeated=me(()=>{let A=this.backgroundSignal();return A.type==="image"&&(A.repeat??EuA)}),this.patternId=CuA(),this.patternUrl=`url(#${this.patternId})`,_n(()=>{let A=this.backgroundSignal();A.type==="dots"&&(this.rootSvg.style.backgroundColor=A.backgroundColor??IuA),A.type==="solid"&&(this.rootSvg.style.backgroundColor=A.color)})}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["g","background",""]],attrs:qQA,decls:2,vars:2,consts:[["patternUnits","userSpaceOnUse"],["x","0","y","0","width","100%","height","100%"]],template:function(t,n){t&1&&(Y(0,VQA,3,10),Y(1,XQA,2,2)),t&2&&(O(n.backgroundSignal().type==="dots"?0:-1),u(),O(n.backgroundSignal().type==="image"?1:-1))},encapsulation:2,changeDetection:0})}}return i})();function QuA(i){let e=new Image;return e.src=i,new Promise(A=>{e.onload=()=>A(e)})}var uuA=(()=>{class i{constructor(){this.markers=De.required(),this.defaultColor="rgb(177, 177, 183)"}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["defs","flowDefs",""]],inputs:{markers:[1,"markers"]},attrs:$QA,decls:3,vars:2,consts:[["viewBox","-10 -10 20 20","refX","0","refY","0"],["points","-5,-4 1,0 -5,4 -5,-4",1,"marker__arrow_closed",3,"stroke","stroke-width","fill"],["points","-5,-4 0,0 -5,4",1,"marker__arrow_default",3,"stroke","stroke-width"],["points","-5,-4 1,0 -5,4 -5,-4",1,"marker__arrow_closed"],["points","-5,-4 0,0 -5,4",1,"marker__arrow_default"]],template:function(t,n){t&1&&(xe(0,t4A,3,7,":svg:marker",0,ni),Ht(2,"keyvalue")),t&2&&Re(ci(2,0,n.markers()))},dependencies:[uR],styles:[".marker__arrow_default[_ngcontent-%COMP%]{stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;fill:none}.marker__arrow_closed[_ngcontent-%COMP%]{stroke-linecap:round;stroke-linejoin:round}"],changeDetection:0})}}return i})(),puA=(()=>{class i{constructor(){this.host=w(se),this.flowSettingsService=w(Wr),this.flowWidth=me(()=>{let A=this.flowSettingsService.view();return A==="auto"?"100%":A[0]}),this.flowHeight=me(()=>{let A=this.flowSettingsService.view();return A==="auto"?"100%":A[1]}),Xw([this.host.nativeElement],w(qe)).pipe(Ei(([A])=>{this.flowSettingsService.computedFlowWidth.set(A.contentRect.width),this.flowSettingsService.computedFlowHeight.set(A.contentRect.height)}),pr()).subscribe()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["svg","flowSizeController",""]],hostVars:2,hostBindings:function(t,n){t&2&&ee("width",n.flowWidth())("height",n.flowHeight())}})}}return i})(),fuA=(()=>{class i{constructor(){this.flowStatusService=w(j2)}resetConnection(){let A=this.flowStatusService.status();(A.state==="connection-start"||A.state==="reconnection-start")&&this.flowStatusService.setIdleStatus()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["svg","rootSvgContext",""]],hostBindings:function(t,n){t&1&&T("mouseup",function(){return n.resetConnection()},Ad)("touchend",function(){return n.resetConnection()},Ad)("contextmenu",function(){return n.resetConnection()})}})}}return i})();function z_(i,e){let A=[];for(let t of e){let{x:n,y:o}=t.globalPoint();i.x>=n&&i.x<=n+t.width()&&i.y>=o&&i.y<=o+t.height()&&A.push({x:i.x-n,y:i.y-o,spaceNodeId:t.rawNode.id})}return A.reverse(),A.push({spaceNodeId:null,x:i.x,y:i.y}),A}var V_=(()=>{class i{static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})(),muA=(()=>{class i extends V_{shouldRenderNode(A){return!A.isVisible()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})()}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function wuA(i,e){if(Object.keys(e.preview().style).length){vuA(i,e);return}if(e.rawNode.type==="default"){DuA(i,e);return}if(e.rawNode.type==="default-group"){yuA(i,e);return}buA(i,e)}function DuA(i,e){let A=e.globalPoint(),t=e.width(),n=e.height();PV(i,e,5),i.fillStyle="white",i.fill(),i.strokeStyle="#1b262c",i.lineWidth=1.5,i.stroke(),i.fillStyle="black",i.font="14px Arial",i.textAlign="center",i.textBaseline="middle";let o=A.x+t/2,a=A.y+n/2;i.fillText(e.text(),o,a)}function yuA(i,e){let A=e.globalPoint(),t=e.width(),n=e.height();i.globalAlpha=.05,i.fillStyle=e.color(),i.fillRect(A.x,A.y,t,n),i.globalAlpha=1,i.strokeStyle=e.color(),i.lineWidth=1.5,i.strokeRect(A.x,A.y,t,n)}function vuA(i,e){let A=e.globalPoint(),t=e.width(),n=e.height(),o=e.preview().style;if(o.borderRadius){let a=parseFloat(o.borderRadius);PV(i,e,a)}else i.beginPath(),i.rect(A.x,A.y,t,n),i.closePath();o.backgroundColor&&(i.fillStyle=o.backgroundColor),o.borderColor&&(i.strokeStyle=o.borderColor),o.borderWidth&&(i.lineWidth=parseFloat(o.borderWidth)),i.fill(),i.stroke()}function buA(i,e){let A=e.globalPoint(),t=e.width(),n=e.height();i.fillStyle="rgb(0 0 0 / 10%)",i.fillRect(A.x,A.y,t,n)}function PV(i,e,A){let t=e.globalPoint(),n=e.width(),o=e.height();i.beginPath(),i.moveTo(t.x+A,t.y),i.lineTo(t.x+n-A,t.y),i.quadraticCurveTo(t.x+n,t.y,t.x+n,t.y+A),i.lineTo(t.x+n,t.y+o-A),i.quadraticCurveTo(t.x+n,t.y+o,t.x+n-A,t.y+o),i.lineTo(t.x+A,t.y+o),i.quadraticCurveTo(t.x,t.y+o,t.x,t.y+o-A),i.lineTo(t.x,t.y+A),i.quadraticCurveTo(t.x,t.y,t.x+A,t.y),i.closePath()}var MuA=(()=>{class i{constructor(){this.viewportService=w(HI),this.renderStrategy=w(V_),this.nodeRenderingService=w(zI),this.renderer2=w(qi),this.element=w(se).nativeElement,this.ctx=this.element.getContext("2d"),this.width=De(0),this.height=De(0),this.dpr=window.devicePixelRatio,_n(()=>{this.renderer2.setProperty(this.element,"width",this.width()*this.dpr),this.renderer2.setProperty(this.element,"height",this.height()*this.dpr),this.renderer2.setStyle(this.element,"width",`${this.width()}px`),this.renderer2.setStyle(this.element,"height",`${this.height()}px`),this.ctx.scale(this.dpr,this.dpr)}),_n(()=>{let A=this.viewportService.readableViewport();this.ctx.clearRect(0,0,this.width(),this.height()),this.ctx.save(),this.ctx.setTransform(A.zoom*this.dpr,0,0,A.zoom*this.dpr,A.x*this.dpr,A.y*this.dpr);for(let t=0;t{class i{constructor(){this.nodeRenderingService=w(zI),this.edgeRenderingService=w(Pu),this.flowEntitiesService=w(rl),this.settingsService=w(Wr),this.flowInitialized=mA(!1),w(qe).runOutsideAngular(()=>Ie(this,null,function*(){yield SuA(2),this.flowInitialized.set(!0)}))}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275prov=jA({token:i,factory:i.\u0275fac})}}return i})();function SuA(i){return new Promise(e=>{let A=0;function t(){A++,A{class i{constructor(){this.nodeRenderingService=w(zI),this.flowStatus=w(j2),this.tolerance=De(10),this.lineColor=De("#1b262c"),this.isNodeDragging=me(()=>DV(this.flowStatus.status())),this.intersections=jw(A=>{let t=this.flowStatus.status();if(DV(t)){let n=t.payload.node,o=LV(Jw(n)),a=this.nodeRenderingService.viewportNodes().filter(I=>I!==n).filter(I=>!n.children().includes(I)).map(I=>LV(Jw(I))),r=[],s=o.x,l=o.y,g=1/0,C=1/0;return a.forEach(I=>{let B=o.left+o.width/2,Q=I.left+I.width/2;for(let[m,v,S,k]of[[B,Q,Q-o.width/2,!0],[o.left,I.left,I.left,!1],[o.left,I.right,I.right,!1],[o.right,I.left,I.left-o.width,!1],[o.right,I.right,I.right-o.width,!1]]){let M=Math.abs(m-v);if(M<=this.tolerance()){let x=Math.min(o.top,I.top),F=Math.max(o.bottom,I.bottom);if(r.push({x:v,y:x,x2:v,y2:F,isCenter:k}),MA.payload.node),ye(A=>[A,this.intersections()]),Ei(([A,t])=>{if(t){let n={x:t.snappedX,y:t.snappedY},o=A.parent()?[A.parent()]:[];A.setPoint(z_(n,o)[0])}}),pr()).subscribe()}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["g","alignmentHelper",""]],inputs:{tolerance:[1,"tolerance"],lineColor:[1,"lineColor"]},attrs:n4A,decls:1,vars:1,template:function(t,n){t&1&&Y(0,r4A,1,1),t&2&&O(n.isNodeDragging()?0:-1)},encapsulation:2,changeDetection:0})}}return i})();var $w=(()=>{class i{constructor(){this.viewportService=w(HI),this.flowEntitiesService=w(rl),this.nodesChangeService=w(J_),this.edgesChangeService=w(Y_),this.nodeRenderingService=w(zI),this.edgeRenderingService=w(Pu),this.flowSettingsService=w(Wr),this.componentEventBusService=w(G_),this.keyboardService=w(L_),this.injector=w(Dt),this.flowRenderingService=w(FV),this.alignmentHelper=De(!1),this.nodeModels=this.nodeRenderingService.nodes,this.groups=this.nodeRenderingService.groups,this.nonGroups=this.nodeRenderingService.nonGroups,this.edgeModels=this.edgeRenderingService.edges,this.onComponentNodeEvent=Rn(this.componentEventBusService.event$),this.nodeTemplateDirective=m0(jE),this.nodeSvgTemplateDirective=m0(bV),this.groupNodeTemplateDirective=m0(zw),this.edgeTemplateDirective=m0(Hw),this.edgeLabelHtmlDirective=m0(vV),this.connectionTemplateDirective=m0(yV),this.mapContext=ko(R_),this.spacePointContext=ko.required(Ou),this.viewport=this.viewportService.readableViewport.asReadonly(),this.nodesChange=zu(this.nodesChangeService.changes$,{initialValue:[]}),this.edgesChange=zu(this.edgesChangeService.changes$,{initialValue:[]}),this.initialized=this.flowRenderingService.flowInitialized.asReadonly(),this.viewportChange$=mo(this.viewportService.readableViewport).pipe(Cl(1)),this.nodesChange$=this.nodesChangeService.changes$,this.edgesChange$=this.edgesChangeService.changes$,this.initialized$=mo(this.flowRenderingService.flowInitialized),this.markers=this.flowEntitiesService.markers,this.minimap=this.flowEntitiesService.minimap,this.flowOptimization=this.flowSettingsService.optimization,this.flowWidth=this.flowSettingsService.computedFlowWidth,this.flowHeight=this.flowSettingsService.computedFlowHeight}set view(A){this.flowSettingsService.view.set(A)}set minZoom(A){this.flowSettingsService.minZoom.set(A)}set maxZoom(A){this.flowSettingsService.maxZoom.set(A)}set background(A){this.flowSettingsService.background.set(AuA(A))}set optimization(A){this.flowSettingsService.optimization.update(t=>oA(oA({},t),A))}set entitiesSelectable(A){this.flowSettingsService.entitiesSelectable.set(A)}set keyboardShortcuts(A){this.keyboardService.setShortcuts(A)}set connection(A){this.flowEntitiesService.connection.set(A)}get connection(){return this.flowEntitiesService.connection()}set snapGrid(A){this.flowSettingsService.snapGrid.set(A)}set elevateNodesOnSelect(A){this.flowSettingsService.elevateNodesOnSelect.set(A)}set elevateEdgesOnSelect(A){this.flowSettingsService.elevateEdgesOnSelect.set(A)}set nodes(A){let t=Br(this.injector,()=>qw.nodes(A,this.flowEntitiesService.nodes()));MV(t,this.flowEntitiesService.edges()),this.flowEntitiesService.nodes.set(t),t.forEach(n=>this.nodeRenderingService.pullNode(n))}set edges(A){let t=Br(this.injector,()=>qw.edges(A,this.flowEntitiesService.edges()));MV(this.flowEntitiesService.nodes(),t),this.flowEntitiesService.edges.set(t)}viewportTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:A,duration:0})}zoomTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:{zoom:A},duration:0})}panTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:A,duration:0})}fitView(A){this.viewportService.fitView(A)}getNode(A){return this.flowEntitiesService.getNode(A)?.rawNode}getDetachedEdges(){return this.flowEntitiesService.getDetachedEdges().map(A=>A.edge)}documentPointToFlowPoint(A,t){let n=this.spacePointContext().documentPointToFlowPoint(A);return t?.spaces?z_(n,this.nodeRenderingService.groups()):n}getIntesectingNodes(A,t={partially:!0}){return m4A(A,this.nodeModels(),t).map(n=>n.rawNode)}toNodeSpace(A,t){let n=this.nodeModels().find(a=>a.rawNode.id===A);if(!n)return{x:1/0,y:1/0};if(t===null)return n.globalPoint();let o=this.nodeModels().find(a=>a.rawNode.id===t);return o?z_(n.globalPoint(),[o])[0]:{x:1/0,y:1/0}}trackNodes(A,{rawNode:t}){return t}trackEdges(A,{edge:t}){return t}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["vflow"]],contentQueries:function(t,n,o){t&1&&y3(o,n.nodeTemplateDirective,jE,5)(o,n.nodeSvgTemplateDirective,bV,5)(o,n.groupNodeTemplateDirective,zw,5)(o,n.edgeTemplateDirective,Hw,5)(o,n.edgeLabelHtmlDirective,vV,5)(o,n.connectionTemplateDirective,yV,5),t&2&&Er(6)},viewQuery:function(t,n){t&1&&Xr(n.mapContext,R_,5)(n.spacePointContext,Ou,5),t&2&&Er(2)},inputs:{view:"view",minZoom:"minZoom",maxZoom:"maxZoom",background:"background",optimization:"optimization",entitiesSelectable:"entitiesSelectable",keyboardShortcuts:"keyboardShortcuts",connection:[2,"connection","connection",A=>new Yw(A)],snapGrid:"snapGrid",elevateNodesOnSelect:"elevateNodesOnSelect",elevateEdgesOnSelect:"elevateEdgesOnSelect",nodes:"nodes",alignmentHelper:[1,"alignmentHelper"],edges:"edges"},outputs:{onComponentNodeEvent:"onComponentNodeEvent"},features:[Et([KV,HI,j2,rl,J_,Y_,zI,Pu,ju,Wr,G_,L_,YV,{provide:V_,useClass:muA},FV]),f3([{directive:$4A,outputs:["onNodesChange","onNodesChange","onNodesChange.position","onNodesChange.position","onNodesChange.position.single","onNodesChange.position.single","onNodesChange.position.many","onNodesChange.position.many","onNodesChange.size","onNodesChange.size","onNodesChange.size.single","onNodesChange.size.single","onNodesChange.size.many","onNodesChange.size.many","onNodesChange.add","onNodesChange.add","onNodesChange.add.single","onNodesChange.add.single","onNodesChange.add.many","onNodesChange.add.many","onNodesChange.remove","onNodesChange.remove","onNodesChange.remove.single","onNodesChange.remove.single","onNodesChange.remove.many","onNodesChange.remove.many","onNodesChange.select","onNodesChange.select","onNodesChange.select.single","onNodesChange.select.single","onNodesChange.select.many","onNodesChange.select.many","onEdgesChange","onEdgesChange","onEdgesChange.detached","onEdgesChange.detached","onEdgesChange.detached.single","onEdgesChange.detached.single","onEdgesChange.detached.many","onEdgesChange.detached.many","onEdgesChange.add","onEdgesChange.add","onEdgesChange.add.single","onEdgesChange.add.single","onEdgesChange.add.many","onEdgesChange.add.many","onEdgesChange.remove","onEdgesChange.remove","onEdgesChange.remove.single","onEdgesChange.remove.single","onEdgesChange.remove.many","onEdgesChange.remove.many","onEdgesChange.select","onEdgesChange.select","onEdgesChange.select.single","onEdgesChange.select.single","onEdgesChange.select.many","onEdgesChange.select.many"]}])],decls:11,vars:8,consts:[["flow",""],["rootSvgRef","","rootSvgContext","","rootPointer","","flowSizeController","",1,"root-svg"],["flowDefs","",3,"markers"],["background",""],["mapContext","","spacePointContext",""],["connection","",3,"model","template"],[3,"ngTemplateOutlet"],["previewFlow","",1,"preview-flow",3,"width","height"],["alignmentHelper",""],["alignmentHelper","",3,"tolerance","lineColor"],["node","",3,"model","groupNodeTemplate"],["edge","",3,"model","edgeTemplate","edgeLabelHtmlTemplate"],["node","",3,"model","nodeTemplate","nodeSvgTemplate"],["node","",3,"model","nodeTemplate","nodeSvgTemplate","groupNodeTemplate"]],template:function(t,n){if(t&1&&(It(),d(0,"svg",1,0),lA(2,"defs",2)(3,"g",3),d(4,"g",4),Y(5,g4A,2,1),lA(6,"g",5),Y(7,d4A,6,0),Y(8,h4A,4,0),E(),Y(9,Q4A,1,1,":svg:ng-container",6),E(),Y(10,u4A,1,2,"canvas",7)),t&2){let o,a,r;u(2),H("markers",n.markers()),u(3),O((o=n.alignmentHelper())?5:-1,o),u(),H("model",n.connection)("template",(a=n.connectionTemplateDirective())==null?null:a.templateRef),u(),O(n.flowOptimization().detachedGroupsLayer?7:-1),u(),O(n.flowOptimization().detachedGroupsLayer?-1:8),u(),O((r=n.minimap())?9:-1,r),u(),O(n.flowOptimization().virtualization?10:-1)}},dependencies:[Ww,fuA,Zw,puA,uuA,huA,R_,Ou,cuA,zV,q_,vc,MuA,kuA],styles:["[_nghost-%COMP%]{display:grid;grid-template-columns:1fr;width:100%;height:100%;-webkit-user-select:none;user-select:none}[_nghost-%COMP%] *{box-sizing:border-box}.root-svg[_ngcontent-%COMP%]{grid-row-start:1;grid-column-start:1}.preview-flow[_ngcontent-%COMP%]{pointer-events:none;grid-row-start:1;grid-column-start:1}"],changeDetection:0})}}return i})();var A5=(()=>{class i{constructor(){this.flowSettingsService=w(Wr),this.selectionService=w(ju),this.parentEdge=w(q_,{optional:!0}),this.parentNode=w(zV,{optional:!0}),this.host=w(se),this.selectOnEvent=this.getEvent$().pipe(Ei(()=>this.select()),pr()).subscribe()}select(){let A=this.entity();A&&this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(A)}entity(){return this.parentNode?this.parentNode.model():this.parentEdge?this.parentEdge.model():null}getEvent$(){return pc(this.host.nativeElement,"click")}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275dir=qA({type:i,selectors:[["","selectable",""]]})}}return i})();var jV=(()=>{class i{constructor(){this.edge=w(q_),this.flowSettingsService=w(Wr),this.edgeRenderingService=w(Pu),this.model=this.edge.model(),this.context=this.model.context.$implicit}pull(){this.flowSettingsService.elevateEdgesOnSelect()&&this.edgeRenderingService.pull(this.model)}static{this.\u0275fac=function(t){return new(t||i)}}static{this.\u0275cmp=bA({type:i,selectors:[["g","customTemplateEdge",""]],hostBindings:function(t,n){t&1&&T("mousedown",function(){return n.pull()})("touchstart",function(){return n.pull()})},attrs:p4A,ngContentSelectors:P_,decls:3,vars:1,consts:[["interactiveEdge",""],[1,"interactive-edge"]],template:function(t,n){t&1&&(Nt(),Ve(0),It(),Jn(1,"path",1,0)),t&2&&(u(),ee("d",n.context.path()))},styles:[".interactive-edge[_ngcontent-%COMP%]{fill:none;stroke-width:20;stroke:transparent}"],changeDetection:0})}}return i})();var _uA=["canvas"],xuA=["svgCanvas"],RuA=()=>({type:"dots",color:"#424242",size:1,gap:12}),NuA=()=>[12,12],FuA=(i,e)=>e.name;function LuA(i,e){if(i&1){let A=rA();d(0,"div",6)(1,"div",11)(2,"button",12),T("click",function(){G(A);let n=p();return K(n.backToMainCanvas())}),d(3,"mat-icon"),y(4,"arrow_back"),E()(),d(5,"div",13)(6,"span",14),y(7,"smart_toy"),E(),d(8,"div",15)(9,"h3",16),y(10),E(),d(11,"p",17),y(12,"Agent Tool"),E()()()()()}if(i&2){let A=p();u(2),H("matTooltip",A.getBackButtonTooltip()),u(8),iA(A.currentAgentTool())}}function GuA(i,e){if(i&1){let A=rA();d(0,"span",18),T("click",function(){G(A);let n=p();return K(n.toggleSidePanelRequest.emit())}),y(1,"left_panel_open"),E()}}function KuA(i,e){if(i&1){let A=rA();It(),d(0,"foreignObject"),or(),d(1,"div",27),T("click",function(n){return n.stopPropagation()}),d(2,"button",28,0),T("click",function(n){return n.stopPropagation()}),d(4,"mat-icon"),y(5,"add"),E()(),d(6,"span",29),y(7,"Add sub-agent"),E(),d(8,"mat-menu",null,1)(10,"button",30),T("click",function(n){let o;G(A);let a=gi(3),r=p().$implicit,s=p(2);return K(s.handleAgentTypeSelection("LlmAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),d(11,"mat-icon"),y(12,"psychology"),E(),d(13,"span"),y(14,"LLM Agent"),E()(),d(15,"button",30),T("click",function(n){let o;G(A);let a=gi(3),r=p().$implicit,s=p(2);return K(s.handleAgentTypeSelection("SequentialAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),d(16,"mat-icon"),y(17,"more_horiz"),E(),d(18,"span"),y(19,"Sequential Agent"),E()(),d(20,"button",30),T("click",function(n){let o;G(A);let a=gi(3),r=p().$implicit,s=p(2);return K(s.handleAgentTypeSelection("LoopAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),d(21,"mat-icon"),y(22,"sync"),E(),d(23,"span"),y(24,"Loop Agent"),E()(),d(25,"button",30),T("click",function(n){let o;G(A);let a=gi(3),r=p().$implicit,s=p(2);return K(s.handleAgentTypeSelection("ParallelAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),d(26,"mat-icon"),y(27,"density_medium"),E(),d(28,"span"),y(29,"Parallel Agent"),E()()()()()}if(i&2){let A=gi(9),t=p().$implicit;ee("width",200)("height",100)("x",t.width()/2-100)("y",t.height()/2-40),u(2),H("matMenuTriggerFor",A)}}function UuA(i,e){i&1&&(It(),lA(0,"handle",26))}function TuA(i,e){if(i&1){let A=rA();It(),d(0,"g")(1,"rect",21),T("click",function(n){let o=G(A).$implicit,a=p(2);return K(a.onGroupClick(o.node,n))})("pointerdown",function(n){let o=G(A).$implicit,a=p(2);return K(a.onGroupPointerDown(o.node,n))}),E(),d(2,"foreignObject",22),or(),d(3,"div",23)(4,"mat-icon",24),y(5),E(),d(6,"span",25),y(7),E()()(),Y(8,KuA,30,5,":svg:foreignObject"),Y(9,UuA,1,0,":svg:handle",26),E()}if(i&2){let A,t,n=e.$implicit,o=p(2);u(),ht("stroke",o.isGroupSelected(n.node)?"rgba(0, 187, 234, 0.8)":"rgba(0, 187, 234, 0.3)")("fill",o.isGroupSelected(n.node)?"rgba(0, 187, 234, 0.1)":"rgba(0, 187, 234, 0.03)")("stroke-width",o.isGroupSelected(n.node)?3:2),ee("width",n.width())("height",n.height()),u(),ee("width",200)("height",32),u(3),iA(o.getAgentIcon(n.node.data==null||(A=n.node.data())==null?null:A.agent_class)),u(2),iA(n.node.data==null||(t=n.node.data())==null?null:t.agent_class),u(),O(o.isGroupEmpty(n.node.id)?8:-1),u(),O(o.shouldShowTopHandle(n.node)?9:-1)}}function JuA(i,e){i&1&&(d(0,"span",35),y(1,"Root"),E())}function YuA(i,e){if(i&1){let A=rA();d(0,"button",43),T("click",function(n){G(A),p();let o=xn(0);return p(2).openDeleteSubAgentDialog(o),K(n.stopPropagation())}),d(1,"mat-icon"),y(2,"delete"),E()()}}function OuA(i,e){if(i&1){let A=rA();d(0,"div",46),T("click",function(n){let o=G(A).$implicit,a=p(2).$implicit;return p(2).selectTool(o,a.node),K(n.stopPropagation())}),d(1,"mat-icon",47),y(2),E(),d(3,"span",48),y(4),E()()}if(i&2){let A=e.$implicit,t=p(4);u(2),iA(t.getToolIcon(A)),u(2),iA(A.name)}}function HuA(i,e){if(i&1&&(d(0,"div",38)(1,"div",44),xe(2,OuA,5,2,"div",45,FuA),E()()),i&2){p();let A=xn(3);u(2),Re(A)}}function zuA(i,e){if(i&1){let A=rA();d(0,"div",39)(1,"button",49,2),T("click",function(n){return n.stopPropagation()}),d(3,"span",50),y(4,"+"),E()(),d(5,"mat-menu",null,3)(7,"button",30),T("click",function(n){let o;G(A);let a=gi(2),r=p().$implicit,s=p(2);return K(s.handleAgentTypeSelection("LlmAgent",(o=r.node.data())==null?null:o.name,a,n))}),d(8,"mat-icon"),y(9,"psychology"),E(),d(10,"span"),y(11,"LLM Agent"),E()(),d(12,"button",30),T("click",function(n){let o;G(A);let a=gi(2),r=p().$implicit,s=p(2);return K(s.handleAgentTypeSelection("SequentialAgent",(o=r.node.data())==null?null:o.name,a,n))}),d(13,"mat-icon"),y(14,"more_horiz"),E(),d(15,"span"),y(16,"Sequential Agent"),E()(),d(17,"button",30),T("click",function(n){let o;G(A);let a=gi(2),r=p().$implicit,s=p(2);return K(s.handleAgentTypeSelection("LoopAgent",(o=r.node.data())==null?null:o.name,a,n))}),d(18,"mat-icon"),y(19,"sync"),E(),d(20,"span"),y(21,"Loop Agent"),E()(),d(22,"button",30),T("click",function(n){let o;G(A);let a=gi(2),r=p().$implicit,s=p(2);return K(s.handleAgentTypeSelection("ParallelAgent",(o=r.node.data())==null?null:o.name,a,n))}),d(23,"mat-icon"),y(24,"density_medium"),E(),d(25,"span"),y(26,"Parallel Agent"),E()()()()}if(i&2){let A=gi(6);u(),H("matMenuTriggerFor",A)}}function PuA(i,e){i&1&&lA(0,"handle",40)}function juA(i,e){i&1&&lA(0,"handle",26)}function quA(i,e){i&1&&lA(0,"handle",41)}function VuA(i,e){i&1&&lA(0,"handle",42)}function WuA(i,e){if(i&1){let A=rA();Uo(0)(1),Ht(2,"async"),Uo(3),d(4,"div",31),T("click",function(n){let o=G(A).$implicit,a=p(2);return K(a.onCustomTemplateNodeClick(o.node,n))})("pointerdown",function(n){let o=G(A).$implicit,a=p(2);return K(a.onNodePointerDown(o.node,n))}),d(5,"div",32)(6,"div",33)(7,"mat-icon",34),y(8),E(),y(9),Y(10,JuA,2,0,"span",35),E(),d(11,"div",36),Y(12,YuA,3,0,"button",37),E()(),Y(13,HuA,4,0,"div",38),Y(14,zuA,27,1,"div",39),Y(15,PuA,1,0,"handle",40),Y(16,juA,1,0,"handle",26),Y(17,quA,1,0,"handle",41),Y(18,VuA,1,0,"handle",42),E()}if(i&2){let A=e.$implicit,t=p(2),n=A.node.data==null?null:A.node.data(),o=Wo((n==null?null:n.name)||"root_agent"),a=ci(2,17,t.toolsMap$);u(3);let s=Wo(t.getToolsForNode(o,a)).length>0;u(),xA("custom-node_selected",t.isNodeSelected(A.node))("custom-node_has-tools",s)("in-group",A.node.parentId&&A.node.parentId()),u(4),iA(t.getAgentIcon(n==null?null:n.agent_class)),u(),Be(" ",o," "),u(),O(t.isRootAgent(o)?10:-1),u(2),O(t.isRootAgentForCurrentTab(o)?-1:12),u(),O(s?13:-1),u(),O(t.shouldShowAddButton(A.node)?14:-1),u(),O(t.shouldShowLeftHandle(A.node)?15:-1),u(),O(t.shouldShowTopHandle(A.node)?16:-1),u(),O(t.shouldShowRightHandle(A.node)?17:-1),u(),O(t.shouldShowBottomHandle(A.node)?18:-1)}}function ZuA(i,e){if(i&1&&(d(0,"vflow",8),yt(1,TuA,10,14,"ng-template",19)(2,WuA,19,20,"ng-template",20),E()),i&2){let A=p();H("nodes",A.vflowNodes())("edges",A.edges())("background",wc(4,RuA))("snapGrid",wc(5,NuA))}}function XuA(i,e){i&1&&(d(0,"div",9)(1,"div",51)(2,"mat-icon",52),y(3,"touch_app"),E(),d(4,"h4"),y(5,"Start Building Your ADK"),E(),d(6,"p"),y(7,"Drag components from the left panel to create your workflow"),E(),d(8,"div",53)(9,"div",54)(10,"mat-icon"),y(11,"drag_indicator"),E(),d(12,"span"),y(13,"Drag to move nodes"),E()(),d(14,"div",54)(15,"mat-icon"),y(16,"link"),E(),d(17,"span"),y(18,"Shift + Click to connect nodes"),E()()()()())}var VE=class i{constructor(e,A,t){this.dialog=e;this.agentService=A;this.router=t;this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.agentBuilderService.getSelectedTool().subscribe(n=>{this.selectedTool=n})}_snackbarService=w(Uc);canvasRef;svgCanvasRef;agentBuilderService=w(Tc);cdr=w(wt);showSidePanel=!0;showBuilderAssistant=!1;appNameInput="";toggleSidePanelRequest=new LA;builderAssistantCloseRequest=new LA;ctx;connections=mA([]);nodeId=1;edgeId=1;callbackId=1;toolId=1;appName="";nodes=mA([]);edges=mA([]);workflowShellWidth=340;workflowGroupWidth=420;workflowGroupHeight=220;workflowGroupYOffset=180;workflowGroupXOffset=-40;workflowInnerNodePoint={x:40,y:80};groupNodes=mA([]);vflowNodes=me(()=>[...this.groupNodes(),...this.nodes()]);selectedAgents=[];selectedTool;selectedCallback;currentAgentTool=mA(null);agentToolBoards=mA(new Map);isAgentToolMode=!1;navigationStack=[];existingAgent=void 0;toolsMap$;nodePositions=new Map;ngOnInit(){this.agentService.getApp().subscribe(e=>{e&&(this.appName=e)}),this.appNameInput&&(this.appName=this.appNameInput),this.agentBuilderService.getNewTabRequest().subscribe(e=>{if(e){let{tabName:A,currentAgentName:t}=e;this.switchToAgentToolBoard(A,t)}}),this.agentBuilderService.getTabDeletionRequest().subscribe(e=>{e&&this.deleteAgentToolBoard(e)}),this.agentBuilderService.getSelectedCallback().subscribe(e=>{this.selectedCallback=e}),this.agentBuilderService.getAgentCallbacks().subscribe(e=>{if(e){let A=this.nodes().find(t=>t.data?t.data().name===e.agentName:void 0);if(A&&A.data){let t=A.data();t.callbacks=e.callbacks,A.data.set(t)}}}),this.agentBuilderService.getDeleteSubAgentSubject().subscribe(e=>{e&&this.openDeleteSubAgentDialog(e)}),this.agentBuilderService.getAddSubAgentSubject().subscribe(e=>{e.parentAgentName&&this.addSubAgent(e.parentAgentName,e.agentClass,e.isFromEmptyGroup)}),this.agentBuilderService.getSelectedNode().subscribe(e=>{this.selectedAgents=this.nodes().filter(A=>A.data&&A.data().name===e?.name)}),this.toolsMap$.subscribe(e=>{this.nodes().some(t=>t.parentId&&t.parentId())&&this.groupNodes().length>0&&this.updateGroupDimensions()})}ngOnChanges(e){e.appNameInput&&e.appNameInput.currentValue&&(this.appName=e.appNameInput.currentValue)}ngAfterViewInit(){}onCustomTemplateNodeClick(e,A){this.shouldIgnoreNodeInteraction(A.target)||this.selectAgentNode(e,{openConfig:!0})}onNodePointerDown(e,A){this.shouldIgnoreNodeInteraction(A.target)||this.selectAgentNode(e,{openConfig:!1})}onGroupClick(e,A){if(A.stopPropagation(),!e?.data)return;let t=e.data().name,n=this.nodes().find(o=>o.data&&o.data().name===t);n&&this.selectAgentNode(n,{openConfig:!0})}onGroupPointerDown(e,A){if(A.stopPropagation(),!e?.data)return;let t=e.data().name,n=this.nodes().find(o=>o.data&&o.data().name===t);n&&this.selectAgentNode(n,{openConfig:!1})}onCanvasClick(e){let A=e.target;if(!A)return;let t=[".custom-node",".action-button-bar",".add-subagent-btn",".open-panel-btn",".agent-tool-banner",".mat-mdc-menu-panel"];A.closest(t.join(","))||this.clearCanvasSelection()}shouldIgnoreNodeInteraction(e){return e?!!e.closest("mat-chip, .add-subagent-btn, .mat-mdc-menu-panel"):!1}selectAgentNode(e,A={}){if(!e?.data)return;let t=this.agentBuilderService.getNode(e.data().name);t&&(this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedNode(t),this.nodePositions.set(t.name,oA({},e.point())),A.openConfig&&this.agentBuilderService.requestSideTabChange("config"))}handleAgentTypeSelection(e,A,t,n,o=!1){n.stopPropagation(),t?.closeMenu(),this.onAgentTypeSelected(e,A,o)}clearCanvasSelection(){!this.selectedAgents.length&&!this.selectedTool&&!this.selectedCallback||(this.selectedAgents=[],this.selectedTool=void 0,this.selectedCallback=void 0,this.agentBuilderService.setSelectedNode(void 0),this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedCallback(void 0),this.cdr.markForCheck())}onAddResource(e){}onAgentTypeSelected(e,A,t=!1){A&&this.addSubAgent(A,e,t)}generateNodeId(){return this.nodeId+=1,this.nodeId.toString()}generateEdgeId(){return this.edgeId+=1,this.edgeId.toString()}createNode(e,A,t){let n=mA(e),a={id:this.generateNodeId(),point:mA(oA({},A)),type:"html-template",data:n};return t&&(a.parentId=mA(t)),this.nodePositions.set(e.name,oA({},a.point())),a}createWorkflowGroup(e,A,t,n,o,a){let r,s=null;if(n){let B=(o||this.groupNodes()).find(Q=>Q.id===n);if(B){let Q=B.point(),h=B.height?B.height():this.workflowGroupHeight;if(a&&o){let f=a.filter(m=>m.parentId&&m.parentId()===B.id);if(f.length>0){let z=0;for(let P of f){let Z=P.data?P.data():void 0,AA=120;Z&&Z.tools&&Z.tools.length>0&&(AA+=20+Z.tools.length*36),z=Math.max(z,AA)}h=Math.max(220,80+z+40)}}r={x:Q.x,y:Q.y+h+60},s=null}else r={x:t.x+this.workflowGroupXOffset,y:t.y+this.workflowGroupYOffset}}else r={x:t.x+this.workflowGroupXOffset,y:t.y+this.workflowGroupYOffset};let l=this.generateNodeId(),g={id:l,point:mA(r),type:"template-group",data:mA(e),parentId:mA(s),width:mA(this.workflowGroupWidth),height:mA(this.workflowGroupHeight)},C=e.agent_class==="SequentialAgent"?{id:this.generateEdgeId(),source:A.id,sourceHandle:"source-bottom",target:l,targetHandle:"target-top"}:null;return{groupNode:g,edge:C}}calculateWorkflowChildPosition(e,A){let r=(A-20)/2;return{x:45+e*428,y:r}}createAgentNodeWithGroup(e,A,t,n,o){let a=this.createNode(e,A,t),r=null,s=null;if(this.isWorkflowAgent(e.agent_class)){let l=this.createWorkflowGroup(e,a,A,t,n,o);r=l.groupNode,s=l.edge}return{shellNode:a,groupNode:r,groupEdge:s}}createWorkflowChildEdge(e,A){return this.createWorkflowChildEdgeFromArrays(e,A,this.nodes(),this.groupNodes())}createWorkflowChildEdgeFromArrays(e,A,t,n){if(!A)return null;let o=n.find(r=>r.id===A);if(!o||!o.data)return null;let a=o.data().agent_class;if(a==="LoopAgent"||a==="ParallelAgent"){let r=t.find(s=>s.data&&s.data().name===o.data().name);if(r)return{id:this.generateEdgeId(),source:r.id,sourceHandle:"source-bottom",target:e.id,targetHandle:"target-top"}}if(a==="SequentialAgent"){let r=t.filter(g=>g.parentId&&g.parentId()===A);if(r.length===0)return null;r.sort((g,C)=>g.point().x-C.point().x);let s=r.findIndex(g=>g.id===e.id);if(s<=0)return null;let l=r[s-1];return{id:this.generateEdgeId(),source:l.id,sourceHandle:"source-right",target:e.id,targetHandle:"target-left"}}return null}isWorkflowAgent(e){return e?e==="SequentialAgent"||e==="ParallelAgent"||e==="LoopAgent":!1}addSubAgent(e,A="LlmAgent",t=!1){let n=this.nodes().find(C=>C.data&&C.data().name===e);if(!n||!n.data)return;let a={name:this.agentBuilderService.getNextSubAgentName(),agent_class:A,model:"gemini-2.5-flash",instruction:"You are a sub-agent that performs specialized tasks.",isRoot:!1,sub_agents:[],tools:[]},r=this.isWorkflowAgent(n.data().agent_class),s=n.parentId&&n.parentId()&&this.groupNodes().some(C=>C.id===n.parentId()),l,g=null;if(t&&r){let C=n.data();if(!C)return;let I=this.groupNodes().find(v=>v.data&&v.data()?.name===C.name);if(!I){console.error("Could not find group for workflow node");return}let B=this.agentBuilderService.getNode(n.data().name);if(!B){console.error("Could not find clicked agent data");return}let Q=B.sub_agents.length,h=I.height?I.height():this.workflowGroupHeight,f=this.calculateWorkflowChildPosition(Q,h),m=this.createAgentNodeWithGroup(a,f,I.id);l=m.shellNode,g=m.groupNode,B.sub_agents.push(a),g&&this.groupNodes.set([...this.groupNodes(),g]),m.groupEdge&&this.edges.set([...this.edges(),m.groupEdge])}else if(s){let C=n.parentId()??void 0,I=this.groupNodes().find(S=>S.id===C);if(!I||!I.data){console.error("Could not find parent group node");return}let B=I.data().name,Q=this.agentBuilderService.getNode(B);if(!Q){console.error("Could not find workflow parent agent");return}let h=Q.sub_agents.length,f=I.height?I.height():this.workflowGroupHeight,m=this.calculateWorkflowChildPosition(h,f),v=this.createAgentNodeWithGroup(a,m,C);l=v.shellNode,g=v.groupNode,Q.sub_agents.push(a),g&&this.groupNodes.set([...this.groupNodes(),g]),v.groupEdge&&this.edges.set([...this.edges(),v.groupEdge])}else{let C=n.data().sub_agents.length,I={x:n.point().x+C*400,y:n.point().y+300},B=this.createAgentNodeWithGroup(a,I);l=B.shellNode,g=B.groupNode;let Q=this.agentBuilderService.getNode(n.data().name);Q&&Q.sub_agents.push(a),g&&this.groupNodes.set([...this.groupNodes(),g]),B.groupEdge&&this.edges.set([...this.edges(),B.groupEdge])}if(this.agentBuilderService.addNode(a),this.nodes.set([...this.nodes(),l]),this.selectedAgents=[l],(s||r)&&this.updateGroupDimensions(),r||s){let C=l.parentId?l.parentId()??void 0:void 0,I=this.createWorkflowChildEdge(l,C);I&&this.edges.set([...this.edges(),I])}else{let C={id:this.generateEdgeId(),source:n.id,sourceHandle:"source-bottom",target:l.id,targetHandle:"target-top"};this.edges.set([...this.edges(),C])}this.agentBuilderService.setSelectedNode(a),this.agentBuilderService.requestSideTabChange("config")}addTool(e){let A=this.nodes().find(o=>o.id===e);if(!A||!A.data)return;let t=A.data();if(!t)return;this.dialog.open(A2,{width:"500px"}).afterClosed().subscribe(o=>{if(o)if(o.toolType==="Agent Tool")this.createAgentTool(t.name);else{let a={toolType:o.toolType,name:o.name};this.agentBuilderService.addTool(t.name,a),this.agentBuilderService.setSelectedTool(a)}})}addCallback(e){let A=this.nodes().find(o=>o.id===e);if(!A||!A.data)return;let t={name:`callback_${this.callbackId}`,type:"before_agent",code:`def callback_function(callback_context): + # Add your callback logic here + return None`,description:"Auto-generated callback"};this.callbackId++;let n=this.agentBuilderService.addCallback(A.data().name,t);n.success||this._snackbarService.open(n.error||"Failed to add callback","Close",{duration:3e3,panelClass:["error-snackbar"]})}createAgentTool(e){this.dialog.open(Cc,{width:"750px",height:"310px",data:{title:"Create Agent Tool",message:"Please enter a name for the agent tool:",confirmButtonText:"Create",showInput:!0,inputLabel:"Agent Tool Name",inputPlaceholder:"Enter agent tool name"}}).afterClosed().subscribe(t=>{t&&typeof t=="string"&&this.agentBuilderService.requestNewTab(t,e)})}deleteTool(e,A){let t=A.toolType==="Agent Tool",n=t&&A.toolAgentName||A.name;this.dialog.open(Cc,{data:{title:t?"Delete Agent Tool":"Delete Tool",message:t?`Are you sure you want to delete the agent tool "${n}"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(a=>{a==="confirm"&&this.deleteToolWithoutDialog(e,A)})}deleteToolWithoutDialog(e,A){if(A.toolType==="Agent Tool"){let t=A.toolAgentName||A.name;this.deleteAgentToolAndBoard(e,A,t)}else this.agentBuilderService.deleteTool(e,A)}deleteAgentToolAndBoard(e,A,t){this.agentBuilderService.deleteTool(e,A),this.agentBuilderService.requestTabDeletion(t)}deleteCallback(e,A){this.dialog.open(Cc,{data:{title:"Delete Callback",message:`Are you sure you want to delete ${A.name}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(n=>{if(n==="confirm"){let o=this.agentBuilderService.deleteCallback(e,A);o.success||this._snackbarService.open(o.error||"Failed to delete callback","Close",{duration:3e3,panelClass:["error-snackbar"]}),this.cdr.detectChanges()}})}openDeleteSubAgentDialog(e){this.dialog.open(Cc,{data:{title:"Delete sub agent",message:`Are you sure you want to delete ${e}? This will also delete all the underlying sub agents and tools.`,confirmButtonText:"Delete"}}).afterClosed().subscribe(t=>{t==="confirm"&&this.deleteSubAgent(e)})}deleteSubAgent(e){let A=this.agentBuilderService.getNode(e);if(!A)return;let t=this.agentBuilderService.getParentNode(this.agentBuilderService.getRootNode(),A,void 0,this.agentToolBoards());t&&(this.deleteSubAgentHelper(A,t),this.agentBuilderService.getSelectedNode().pipe(po(1),Ct(n=>!!n)).subscribe(n=>{this.agentBuilderService.getNodes().includes(n)||this.agentBuilderService.setSelectedNode(t)}))}isNodeInSequentialWorkflow(e){if(!e.parentId||!e.parentId())return!1;let A=e.parentId(),t=this.groupNodes().find(n=>n.id===A);return!t||!t.data?!1:t.data().agent_class==="SequentialAgent"}getSequentialSiblings(e){if(!e.parentId||!e.parentId())return{previous:void 0,next:void 0};let A=e.parentId(),t=this.nodes().filter(o=>o.parentId&&o.parentId()===A);t.sort((o,a)=>o.point().x-a.point().x);let n=t.findIndex(o=>o.id===e.id);return n===-1?{previous:void 0,next:void 0}:{previous:n>0?t[n-1]:void 0,next:nn.data&&n.data().name===e.name);if(t){let n=this.isNodeInSequentialWorkflow(t),o,a;if(n){let s=this.getSequentialSiblings(t);o=s.previous,a=s.next}this.nodes.set(this.nodes().filter(s=>s.id!==t.id));let r=this.groupNodes().find(s=>s.data&&s.data().name===e.name);if(r){this.groupNodes.set(this.groupNodes().filter(l=>l.id!==r.id));let s=this.edges().filter(l=>l.target!==t.id&&l.source!==t.id&&l.target!==r.id&&l.source!==r.id);this.edges.set(s)}else{let s=this.edges().filter(l=>l.target!==t.id&&l.source!==t.id);this.edges.set(s)}if(n&&o&&a){let s={id:this.generateEdgeId(),source:o.id,sourceHandle:"source-right",target:a.id,targetHandle:"target-left"};this.edges.set([...this.edges(),s])}}this.nodePositions.delete(e.name),A.sub_agents=A.sub_agents.filter(n=>n.name!==e.name),this.agentBuilderService.deleteNode(e),t&&t.parentId&&t.parentId()&&this.updateGroupDimensions()}selectTool(e,A){if(e.toolType==="Agent Tool"){let t=e.name;this.switchToAgentToolBoard(t);return}if(e.toolType==="Function tool"||e.toolType==="Built-in tool"){if(A.data){let t=this.agentBuilderService.getNode(A.data().name);t&&this.editTool(e,t)}return}if(A.data){let t=this.agentBuilderService.getNode(A.data().name);t&&this.agentBuilderService.setSelectedNode(t)}this.agentBuilderService.setSelectedTool(e)}editTool(e,A){let t;e.toolType==="Built-in tool"?t=this.dialog.open(OI,{width:"700px",maxWidth:"90vw",data:{toolName:e.name,isEditMode:!0,toolArgs:e.args}}):t=this.dialog.open(A2,{width:"500px",data:{toolType:e.toolType,toolName:e.name,isEditMode:!0}}),t.afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=A.tools?.findIndex(a=>a.name===e.name);o!==void 0&&o!==-1&&A.tools&&(A.tools[o].name=n.name,n.args&&(A.tools[o].args=n.args),this.agentBuilderService.setAgentTools(A.name,A.tools))}})}selectCallback(e,A){if(A.data){let t=this.agentBuilderService.getNode(A.data().name);t&&this.agentBuilderService.setSelectedNode(t)}this.agentBuilderService.setSelectedCallback(e)}openToolsTab(e){if(e.data){let A=this.agentBuilderService.getNode(e.data().name);A&&this.agentBuilderService.setSelectedNode(A)}this.agentBuilderService.requestSideTabChange("tools")}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A){this._snackbarService.open("Please create an agent first.","OK");return}let t=new FormData,n=this.agentToolBoards();jc.generateYamlFile(A,t,e,n),this.agentService.agentBuild(e,t).subscribe(o=>{o?this.router.navigate(["/"],{queryParams:{app:e}}).then(()=>{window.location.reload()}):this._snackbarService.open("Something went wrong, please try again","OK")})}isRootAgent(e){let A=this.agentBuilderService.getRootNode();return A?A.name===e:!1}isRootAgentForCurrentTab(e){return this.isAgentToolMode&&this.currentAgentTool()?e===this.currentAgentTool():this.isRootAgent(e)}shouldShowHorizontalHandle(e,A){if(!e.parentId||!e.parentId())return!1;let t=e.parentId(),n=this.groupNodes().find(s=>s.id===t);if(!n||!n.data||n.data().agent_class!=="SequentialAgent")return!1;let a=this.nodes().filter(s=>s.parentId&&s.parentId()===t);if(a.length<=1)return!1;a.sort((s,l)=>s.point().x-l.point().x);let r=a.findIndex(s=>s.id===e.id);return A==="left"?r>0:r0):!1}shouldShowTopHandle(e){let A=e.data?e.data():void 0,t=A?.name,n=t?this.isRootAgent(t):!1;if(e.type==="template-group")return A?.agent_class==="SequentialAgent";if(n)return!1;if(e.parentId&&e.parentId()){let a=e.parentId(),r=this.groupNodes().find(s=>s.id===a);if(r&&r.data){let s=r.data().agent_class;if(s==="LoopAgent"||s==="ParallelAgent")return!0}return!1}return!0}getToolsForNode(e,A){return!e||!A?[]:A.get(e)??[]}loadFromYaml(e,A){try{let t=cB(e);this.agentBuilderService.clear(),this.nodePositions.clear(),this.agentToolBoards.set(new Map),this.agentBuilderService.setAgentToolBoards(new Map),this.currentAgentTool.set(null),this.isAgentToolMode=!1,this.navigationStack=[];let n=Oe(oA({name:t.name||"root_agent",agent_class:t.agent_class||"LlmAgent",model:t.model||"gemini-2.5-flash",instruction:t.instruction||"",description:t.description||""},t.max_iterations&&{max_iterations:t.max_iterations}),{isRoot:!0,sub_agents:t.sub_agents||[],tools:this.parseToolsFromYaml(t.tools||[]),callbacks:this.parseCallbacksFromYaml(t)});this.agentBuilderService.addNode(n),this.agentBuilderService.setSelectedNode(n),this.processAgentToolsFromYaml(n.tools||[],A),this.loadAgentBoard(n)}catch(t){console.error("Error parsing YAML:",t)}}parseToolsFromYaml(e){return e.map(A=>{let t={name:A.name,toolType:this.determineToolType(A),toolAgentName:A.name};if(A.name==="AgentTool"&&A.args&&A.args.agent&&A.args.agent.config_path){t.toolType="Agent Tool";let o=A.args.agent.config_path.replace("./","").replace(".yaml","");t.name=o,t.toolAgentName=o,t.args=A.args}else A.args&&(t.args=A.args);return t})}parseCallbacksFromYaml(e){let A=[];return Object.keys(e).forEach(t=>{if(t.endsWith("_callback")&&Array.isArray(e[t])){let n=t.replace("_callback","");e[t].forEach(o=>{o.name&&A.push({name:o.name,type:n})})}}),A}determineToolType(e){return e.name==="AgentTool"&&e.args&&e.args.agent?"Agent Tool":e.name&&e.name.includes(".")&&e.args?"Custom tool":e.name&&e.name.includes(".")&&!e.args?"Function tool":"Built-in tool"}processAgentToolsFromYaml(e,A){let t=e.filter(n=>n.toolType==="Agent Tool");for(let n of t)this.agentToolBoards().has(n.name)||this.loadAgentToolConfiguration(n,A)}loadAgentToolConfiguration(e,A){let t=e.name;this.agentService.getSubAgentBuilder(A,`${t}.yaml`).subscribe({next:n=>{if(n)try{let o=cB(n),a=Oe(oA({name:o.name||t,agent_class:o.agent_class||"LlmAgent",model:o.model||"gemini-2.5-flash",instruction:o.instruction||`You are the ${t} agent that can be used as a tool by other agents.`,description:o.description||""},o.max_iterations&&{max_iterations:o.max_iterations}),{isRoot:!1,sub_agents:o.sub_agents||[],tools:this.parseToolsFromYaml(o.tools||[]),callbacks:this.parseCallbacksFromYaml(o),isAgentTool:!0,skip_summarization:!!e.args?.skip_summarization}),r=this.agentToolBoards();if(r.set(t,a),this.agentToolBoards.set(r),this.agentBuilderService.setAgentToolBoards(r),this.agentBuilderService.addNode(a),this.processAgentToolsFromYaml(a.tools||[],A),a.sub_agents&&a.sub_agents.length>0)for(let s of a.sub_agents)s.config_path&&this.agentService.getSubAgentBuilder(A,s.config_path).subscribe(l=>{if(l){let g=cB(l);this.processAgentToolsFromYaml(this.parseToolsFromYaml(g.tools||[]),A)}})}catch(o){console.error(`Error parsing YAML for agent tool ${t}:`,o),this.createDefaultAgentToolConfiguration(e)}else this.createDefaultAgentToolConfiguration(e)},error:n=>{console.error(`Error loading agent tool configuration for ${t}:`,n),this.createDefaultAgentToolConfiguration(e)}})}createDefaultAgentToolConfiguration(e){let A=e.name,t={name:A,agent_class:"LlmAgent",model:"gemini-2.5-flash",instruction:`You are the ${A} agent that can be used as a tool by other agents.`,isRoot:!1,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!!e.args?.skip_summarization},n=this.agentToolBoards();n.set(A,t),this.agentToolBoards.set(n),this.agentBuilderService.setAgentToolBoards(n),this.agentBuilderService.addNode(t)}loadAgentTools(e){e.tools?(e.tools=e.tools.filter(A=>A.name&&A.name.trim()!==""),e.tools.forEach(A=>{A.toolType!=="Agent Tool"&&(A.name.includes(".")&&A.args?A.toolType="Custom tool":A.name.includes(".")&&!A.args?A.toolType="Function tool":A.toolType="Built-in tool")})):e.tools=[]}isNodeSelected(e){return this.selectedAgents.includes(e)}isGroupSelected(e){if(!e.data)return!1;let A=e.data().name,t=this.nodes().find(n=>n.data&&n.data().name===A);return t?this.isNodeSelected(t):!1}loadSubAgents(e,A){return Ie(this,null,function*(){let t=[{node:A,depth:1,index:1,parentShellId:void 0,parentAgent:void 0,parentGroupId:void 0}],n=[],o=[],a=[];for(;t.length>0;){let{node:r,depth:s,index:l,parentShellId:g,parentAgent:C,parentGroupId:I}=t.shift(),B=r;if(r.config_path)try{let k=yield c3(this.agentService.getSubAgentBuilder(e,r.config_path));B=cB(k),B.tools&&(B.tools=this.parseToolsFromYaml(B.tools||[])),this.processAgentToolsFromYaml(B.tools||[],e)}catch(k){console.error(`Failed to load agent from ${r.config_path}`,k);continue}if(C&&C.sub_agents){let k=C.sub_agents.indexOf(r);k!==-1&&(C.sub_agents[k]=B,this.agentBuilderService.addNode(C))}this.agentBuilderService.addNode(B);let Q=this.nodePositions.get(B.name),h=this.isWorkflowAgent(B.agent_class),f=C?this.isWorkflowAgent(C.agent_class):!1,m,v,S=null;if(f&&!B.isRoot){let k=C?.sub_agents.indexOf(B)??l,M=o.find(z=>z.id===I),x=M?.height?M.height():this.workflowGroupHeight;m=Q??this.calculateWorkflowChildPosition(k,x);let F=this.createAgentNodeWithGroup(B,m,I??void 0,o,n);v=F.shellNode,S=F.groupNode,n.push(v),S&&o.push(S),F.groupEdge&&a.push(F.groupEdge)}else{if(Q)m=Q;else if(!g)m={x:100,y:150};else{let M=n.find(x=>x.id===g);M?m={x:M.point().x+(l-1)*400,y:M.point().y+300}:m={x:100,y:s*150+50}}let k=this.createAgentNodeWithGroup(B,m,void 0,o,n);v=k.shellNode,S=k.groupNode,n.push(v),h&&!B.isRoot&&(S&&o.push(S),k.groupEdge&&a.push(k.groupEdge))}if(g)if(I){let k=this.createWorkflowChildEdgeFromArrays(v,I,n,o);k&&a.push(k)}else{let k={id:this.generateEdgeId(),source:g,sourceHandle:"source-bottom",target:v.id,targetHandle:"target-top"};a.push(k)}if(B.sub_agents&&B.sub_agents.length>0){let k=1,M=h&&S?S.id:I;for(let x of B.sub_agents)t.push({node:x,parentShellId:v.id,depth:s+1,index:k,parentAgent:B,parentGroupId:M}),k++}}this.nodes.set(n),this.groupNodes.set(o),this.edges.set(a),this.updateGroupDimensions()})}switchToAgentToolBoard(e,A){let t=this.currentAgentTool()||"main";t!==e&&this.navigationStack.push(t);let n=this.agentToolBoards(),o=n.get(e);if(!o){o={isRoot:!1,name:e,agent_class:"LlmAgent",model:"gemini-2.5-flash",instruction:`You are the ${e} agent that can be used as a tool by other agents.`,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!1};let a=new Map(n);a.set(e,o),this.agentToolBoards.set(a),this.agentBuilderService.setAgentToolBoards(a),A?this.addAgentToolToAgent(e,A):this.addAgentToolToRoot(e)}this.currentAgentTool.set(e),this.isAgentToolMode=!0,this.loadAgentBoard(o),this.agentBuilderService.setSelectedNode(o),this.agentBuilderService.requestSideTabChange("config")}backToMainCanvas(){if(this.navigationStack.length>0){let e=this.navigationStack.pop();if(e==="main"){this.currentAgentTool.set(null),this.isAgentToolMode=!1;let A=this.agentBuilderService.getRootNode();A&&(this.loadAgentBoard(A),this.agentBuilderService.setSelectedNode(A),this.agentBuilderService.requestSideTabChange("config"))}else{let t=this.agentToolBoards().get(e);t&&(this.currentAgentTool.set(e),this.isAgentToolMode=!0,this.loadAgentBoard(t),this.agentBuilderService.setSelectedNode(t),this.agentBuilderService.requestSideTabChange("config"))}}else{this.currentAgentTool.set(null),this.isAgentToolMode=!1;let e=this.agentBuilderService.getRootNode();e&&(this.loadAgentBoard(e),this.agentBuilderService.setSelectedNode(e),this.agentBuilderService.requestSideTabChange("config"))}}loadAgentBoard(e){return Ie(this,null,function*(){if(this.captureCurrentNodePositions(),this.nodes.set([]),this.groupNodes.set([]),this.edges.set([]),this.nodeId=0,this.edgeId=0,this.loadAgentTools(e),this.agentBuilderService.addNode(e),e.tools&&e.tools.length>0?this.agentBuilderService.setAgentTools(e.name,e.tools):this.agentBuilderService.setAgentTools(e.name,[]),e.sub_agents&&e.sub_agents.length>0)yield this.loadSubAgents(this.appName,e);else{let A=this.nodePositions.get(e.name)??{x:100,y:150},t=this.createNode(e,A);if(this.nodes.set([t]),this.isWorkflowAgent(e.agent_class)){let{groupNode:n,edge:o}=this.createWorkflowGroup(e,t,A);this.groupNodes.set([n]),o&&this.edges.set([o])}}this.agentBuilderService.setSelectedNode(e)})}addAgentToolToAgent(e,A){let t=this.agentBuilderService.getNode(A);if(t){if(t.tools&&t.tools.some(o=>o.name===e))return;let n={name:e,toolType:"Agent Tool",toolAgentName:e};t.tools||(t.tools=[]),t.tools.push(n),t.tools=t.tools.filter(o=>o.name&&o.name.trim()!==""),this.agentBuilderService.setAgentTools(A,t.tools)}}addAgentToolToRoot(e){let A=this.agentBuilderService.getRootNode();if(A){if(A.tools&&A.tools.some(n=>n.name===e))return;let t={name:e,toolType:"Agent Tool",toolAgentName:e};A.tools||(A.tools=[]),A.tools.push(t),this.agentBuilderService.setAgentTools("root_agent",A.tools)}}deleteAgentToolBoard(e){let A=this.agentToolBoards(),t=new Map(A);t.delete(e),this.agentToolBoards.set(t),this.agentBuilderService.setAgentToolBoards(t);let n=this.agentBuilderService.getNodes();for(let o of n)o.tools&&(o.tools=o.tools.filter(a=>!(a.toolType==="Agent Tool"&&(a.toolAgentName===e||a.name===e))),this.agentBuilderService.setAgentTools(o.name,o.tools));this.navigationStack=this.navigationStack.filter(o=>o!==e),this.currentAgentTool()===e&&this.backToMainCanvas()}getBackButtonTooltip(){if(this.navigationStack.length>0){let e=this.navigationStack[this.navigationStack.length-1];return e==="main"?"Back to Main Canvas":`Back to ${e}`}return"Back to Main Canvas"}onBuilderAssistantClose(){this.builderAssistantCloseRequest.emit()}reloadCanvasFromYaml(){this.appNameInput&&this.agentService.getAgentBuilderTmp(this.appNameInput).subscribe({next:e=>{e&&this.loadFromYaml(e,this.appNameInput)},error:e=>{console.error("Error reloading canvas:",e)}})}captureCurrentNodePositions(){for(let e of this.nodes()){if(!e?.data)continue;let A=e.data();A&&this.nodePositions.set(A.name,oA({},e.point()))}}updateGroupDimensions(){for(let s of this.groupNodes()){if(!s.data)continue;let l=s.data().name,g=this.nodes().filter(m=>m.parentId&&m.parentId()===s.id);if(g.length===0){s.width&&s.width.set(480),s.height&&s.height.set(220);continue}g.sort((m,v)=>m.point().x-v.point().x),g.forEach((m,v)=>{let F={x:45+v*428,y:80};if(m.point.set(F),m.data){let z=m.data();z&&this.nodePositions.set(z.name,F)}});let C=1/0,I=1/0,B=-1/0,Q=-1/0;for(let m of g){let v=m.point(),S=m.data?m.data():void 0,k=120;S&&S.tools&&S.tools.length>0&&(k+=20+S.tools.length*36),C=Math.min(C,v.x),I=Math.min(I,v.y),B=Math.max(B,v.x+340+68),Q=Math.max(Q,v.y+k)}let h=B-C+80,f=Q-I+80;s.width&&s.width.set(Math.max(480,h)),s.height&&s.height.set(Math.max(220,f))}}getToolIcon(e){return EB(e.name,e.toolType)}getAgentIcon(e){switch(e){case"SequentialAgent":return"more_horiz";case"LoopAgent":return"sync";case"ParallelAgent":return"density_medium";default:return"psychology"}}isGroupEmpty(e){return!this.nodes().some(t=>t.parentId&&t.parentId()===e)}shouldShowAddButton(e){let A=e.data?e.data():void 0;if(!A)return!1;let t=this.isWorkflowAgent(A.agent_class),n=e.parentId&&e.parentId();if(t&&!n||!this.isNodeSelected(e))return!1;if(n&&e.parentId){let o=e.parentId(),a=this.nodes().filter(s=>s.parentId&&s.parentId()===o);if(a.length===0)return!0;let r=a.reduce((s,l)=>l.point().x>s.point().x?l:s,a[0]);return e.id===r.id}return!0}static \u0275fac=function(A){return new(A||i)(ot(Ja),ot(HE),ot(is))};static \u0275cmp=bA({type:i,selectors:[["app-canvas"]],viewQuery:function(A,t){if(A&1&&Yt(_uA,5)(xuA,5),A&2){let n;oe(n=ae())&&(t.canvasRef=n.first),oe(n=ae())&&(t.svgCanvasRef=n.first)}},inputs:{showSidePanel:"showSidePanel",showBuilderAssistant:"showBuilderAssistant",appNameInput:"appNameInput"},outputs:{toggleSidePanelRequest:"toggleSidePanelRequest",builderAssistantCloseRequest:"builderAssistantCloseRequest"},features:[Zt],decls:7,vars:8,consts:[["emptyGroupMenuTrigger","matMenuTrigger"],["emptyGroupMenu","matMenu"],["agentMenuTrigger","matMenuTrigger"],["agentMenu","matMenu"],[1,"canvas-container"],[1,"canvas-workspace",3,"click"],[1,"agent-tool-banner"],["matTooltip","Open panel",1,"material-symbols-outlined","open-panel-btn"],["view","auto",3,"nodes","edges","background","snapGrid"],[1,"canvas-instructions"],[3,"closePanel","reloadCanvas","isVisible","appName"],[1,"banner-content"],["mat-icon-button","",1,"back-to-main-btn",3,"click","matTooltip"],[1,"banner-info"],[1,"material-symbols-outlined","banner-icon"],[1,"banner-text"],[1,"agent-tool-name"],[1,"banner-subtitle"],["matTooltip","Open panel",1,"material-symbols-outlined","open-panel-btn",3,"click"],["groupNode",""],["nodeHtml",""],["selectable","","rx","12","ry","12",3,"click","pointerdown"],["x","12","y","12"],[1,"workflow-group-chip"],[1,"workflow-chip-icon"],[1,"workflow-chip-label"],["type","target","position","top","id","target-top"],[1,"empty-group-placeholder",3,"click"],["mat-icon-button","","matTooltip","Add sub-agent","aria-label","Add sub-agent",3,"click","matMenuTriggerFor"],[1,"empty-group-label"],["mat-menu-item","",3,"click"],["selectable","",1,"custom-node",3,"click","pointerdown"],[1,"node-title-wrapper"],[1,"node-title"],[2,"margin-right","5px"],[1,"node-badge"],[1,"action-button-bar"],["matIconButton","","matTooltip","Delete sub-agent","aria-label","Delete sub-agent",1,"action-btn","delete-subagent-btn"],[1,"tools-container"],[1,"add-subagent-container"],["type","target","position","left","id","target-left"],["type","source","position","right","id","source-right"],["type","source","position","bottom","id","source-bottom"],["matIconButton","","matTooltip","Delete sub-agent","aria-label","Delete sub-agent",1,"action-btn","delete-subagent-btn",3,"click"],[1,"tools-list"],[1,"tool-item"],[1,"tool-item",3,"click"],[1,"tool-item-icon"],[1,"tool-item-name"],["matIconButton","","matTooltip","Add sub-agent","aria-label","Add sub-agent",1,"add-subagent-btn",3,"click","matMenuTriggerFor"],[1,"add-subagent-symbol"],[1,"instruction-content"],[1,"instruction-icon"],[1,"instruction-tips"],[1,"tip"]],template:function(A,t){A&1&&(d(0,"div",4)(1,"div",5),T("click",function(o){return t.onCanvasClick(o)}),Y(2,LuA,13,2,"div",6),Y(3,GuA,2,0,"span",7),Y(4,ZuA,3,6,"vflow",8),Y(5,XuA,19,0,"div",9),E(),d(6,"app-builder-assistant",10),T("closePanel",function(){return t.onBuilderAssistantClose()})("reloadCanvas",function(){return t.reloadCanvasFromYaml()}),E()()),A&2&&(u(),xA("has-banner",t.currentAgentTool()),u(),O(t.currentAgentTool()?2:-1),u(),O(t.showSidePanel?-1:3),u(),O(t.vflowNodes().length>0?4:-1),u(),O(t.vflowNodes().length===0?5:-1),u(),H("isVisible",t.showBuilderAssistant)("appName",t.appName))},dependencies:[$w,qu,A5,jE,zw,zt,Zi,ns,Ds,Hl,Uw,$r],styles:['[_nghost-%COMP%]{width:100%;height:100%;display:flex;flex-direction:column;flex:1;min-height:0}.canvas-container[_ngcontent-%COMP%]{width:100%;height:100%;display:flex;flex-direction:column;border-radius:8px;overflow:hidden;box-shadow:var(--builder-canvas-shadow);flex:1;min-height:0;position:relative}.canvas-header[_ngcontent-%COMP%]{padding:16px 24px;border-bottom:2px solid var(--builder-border-color);display:flex;justify-content:space-between;align-items:center}.canvas-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--builder-text-primary-color);font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.canvas-controls[_ngcontent-%COMP%]{display:flex;gap:8px}.canvas-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid var(--builder-button-border-color);color:var(--builder-button-text-color);transition:all .3s ease}.canvas-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{border-color:var(--builder-button-hover-border-color);transform:translateY(-1px)}.canvas-workspace[_ngcontent-%COMP%]{flex:1;position:relative;overflow:hidden;min-height:0;width:100%;height:100%}.agent-tool-banner[_ngcontent-%COMP%]{position:absolute;top:0;left:0;right:0;border-bottom:2px solid rgba(59,130,246,.3);box-shadow:0 4px 16px #0000004d}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%]{padding:12px 20px;display:flex;align-items:center;gap:16px}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%]{color:#fff;border:1px solid rgba(255,255,255,.2);transition:all .2s ease}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05)}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;flex:1}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-icon[_ngcontent-%COMP%]{font-size:28px;width:28px;height:28px;color:#ffffffe6}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] .agent-tool-name[_ngcontent-%COMP%]{margin:0;color:#fff;font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;line-height:1.2}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] .banner-subtitle[_ngcontent-%COMP%]{margin:0;color:#fffc;font-size:12px;font-weight:400;line-height:1}.canvas-workspace[_ngcontent-%COMP%]:has(.agent-tool-banner) vflow[_ngcontent-%COMP%]{padding-top:68px}.canvas-workspace.has-banner[_ngcontent-%COMP%] vflow{padding-top:68px!important} vflow{width:100%!important;height:100%!important;display:block!important} vflow .root-svg{color:var(--builder-text-primary-color)!important;width:100%!important;height:100%!important;min-width:100%!important;min-height:100%!important}.diagram-canvas[_ngcontent-%COMP%]{display:block;width:100%;height:100%;cursor:crosshair;transition:cursor .2s ease;object-fit:contain;image-rendering:pixelated}.diagram-canvas[_ngcontent-%COMP%]:active{cursor:grabbing}.canvas-instructions[_ngcontent-%COMP%]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none}.instruction-content[_ngcontent-%COMP%]{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:2px solid var(--builder-canvas-instruction-border);border-radius:16px;padding:32px;box-shadow:var(--builder-canvas-shadow)}.instruction-content[_ngcontent-%COMP%] .instruction-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;color:var(--builder-button-text-color);margin-bottom:16px;animation:_ngcontent-%COMP%_pulse 2s infinite}.instruction-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:20px;font-weight:600;margin:0 0 12px;font-family:Google Sans,Helvetica Neue,sans-serif}.instruction-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;margin:0 0 24px;line-height:1.5}.instruction-tips[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;align-items:flex-start}.tip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;color:var(--builder-accent-color);font-size:13px}.tip[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.connection-mode-indicator[_ngcontent-%COMP%]{position:absolute;top:20px;left:50%;transform:translate(-50%);animation:_ngcontent-%COMP%_slideDown .3s ease-out}.connection-indicator-content[_ngcontent-%COMP%]{color:#fff;padding:12px 20px;border-radius:24px;display:flex;align-items:center;gap:12px;box-shadow:0 4px 16px #1b73e866;border:1px solid rgba(255,255,255,.2)}.connection-indicator-content[_ngcontent-%COMP%] .connection-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;animation:_ngcontent-%COMP%_pulse 1.5s infinite}.connection-indicator-content[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:14px;font-weight:500;white-space:nowrap}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:#fff;border:1px solid rgba(255,255,255,.3);width:32px;height:32px;min-width:32px}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{transform:scale(1.1)}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}@keyframes _ngcontent-%COMP%_slideDown{0%{opacity:0;transform:translate(-50%) translateY(-20px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.canvas-footer[_ngcontent-%COMP%]{padding:12px 24px;border-top:1px solid var(--builder-border-color);display:flex;justify-content:space-between;align-items:center}.node-count[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;color:var(--builder-text-secondary-color);font-size:13px;font-weight:500}.node-count[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:var(--builder-accent-color)}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}.canvas-workspace.drag-over[_ngcontent-%COMP%]:before{content:"";position:absolute;inset:0;border:2px dashed #00bbea;border-radius:8px;margin:16px;animation:_ngcontent-%COMP%_dashMove 1s linear infinite}@keyframes _ngcontent-%COMP%_dashMove{0%{border-color:#8ab4f84d}50%{border-color:#8ab4f8cc}to{border-color:#8ab4f84d}}@media(max-width:768px){.canvas-header[_ngcontent-%COMP%]{padding:12px 16px}.canvas-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:16px}.instruction-content[_ngcontent-%COMP%]{padding:24px;margin:16px}.instruction-content[_ngcontent-%COMP%] .instruction-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px}.instruction-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{font-size:18px}.canvas-footer[_ngcontent-%COMP%]{padding:8px 16px;flex-direction:column;gap:8px}}.custom-node[_ngcontent-%COMP%]{width:340px;border:1px solid var(--builder-canvas-node-border);border-radius:8px;align-items:center;position:relative;max-height:none;padding-bottom:0;overflow:visible}.custom-node[_ngcontent-%COMP%]:hover{border-color:var(--builder-canvas-node-hover-border)}.custom-node_selected[_ngcontent-%COMP%]{border:2px solid;border-color:var(--builder-accent-color)}.custom-node_selected[_ngcontent-%COMP%] mat-chip[_ngcontent-%COMP%]{--mdc-chip-outline-color: var(--builder-canvas-node-chip-outline)}.custom-node_selected[_ngcontent-%COMP%]:hover{border-color:var(--builder-accent-color)}[_nghost-%COMP%] .default-group-node{border:2px solid var(--builder-canvas-group-border)!important}.node-title-wrapper[_ngcontent-%COMP%]{padding-top:12px;padding-bottom:12px;border-radius:8px 8px 0 0;display:flex;justify-content:space-between;align-items:center}.node-title[_ngcontent-%COMP%]{padding-left:12px;padding-right:12px;display:flex;align-items:center;color:var(--builder-text-primary-color);font-weight:500}.node-badge[_ngcontent-%COMP%]{margin-left:8px;padding:2px 6px;border-radius:999px;color:var(--builder-accent-color);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.tools-container[_ngcontent-%COMP%]{padding:8px 12px;border-top:1px solid var(--builder-border-color)}.tools-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:4px;cursor:pointer;transition:background-color .2s ease;color:var(--builder-text-primary-color)}.tool-item[_ngcontent-%COMP%] .tool-item-icon[_ngcontent-%COMP%]{font-size:22px;width:22px;height:22px;color:var(--builder-text-primary-color);flex-shrink:0}.tool-item[_ngcontent-%COMP%] .tool-item-name[_ngcontent-%COMP%]{font-family:Google Sans,sans-serif;font-size:15px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-item.more-tools[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-style:italic}.tool-item.more-tools[_ngcontent-%COMP%] .tool-item-icon[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color)}.custom-node_selected[_ngcontent-%COMP%] .node-title-wrapper[_ngcontent-%COMP%]{border-bottom-color:var(--builder-canvas-node-chip-outline)}.custom-node_selected[_ngcontent-%COMP%] .node-title-wrapper[_ngcontent-%COMP%] .node-title[_ngcontent-%COMP%]{color:var(--builder-accent-color)}.tools-header[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callbacks-container[_ngcontent-%COMP%]{padding:12px 6px 12px 12px}.callbacks-header[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callback-type[_ngcontent-%COMP%]{font-size:11px;color:var(--builder-accent-color);padding:2px 6px;border-radius:4px;margin-left:4px;font-weight:500}.add-callback-btn[_ngcontent-%COMP%]{border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-callback-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-callback-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);transform:scale(1.1)}.instruction-title[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px}.instructions[_ngcontent-%COMP%]{font-family:Google Sans;margin-bottom:10px}.agent-resources[_ngcontent-%COMP%]{padding:8px 12px}.empty-resource[_ngcontent-%COMP%]{margin-top:8px;color:var(--builder-text-secondary-color);margin-bottom:8px;display:flex;font-size:13px}.empty-resource[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:none}.action-button-bar[_ngcontent-%COMP%]{display:flex;gap:8px;margin-right:4px}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);border:none;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;pointer-events:auto;border-radius:4px}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);transform:scale(1.1)}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.action-button-bar[_ngcontent-%COMP%] .delete-subagent-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color)}.add-tool-btn[_ngcontent-%COMP%]{border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-tool-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-tool-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);transform:scale(1.1)}.add-subagent-container[_ngcontent-%COMP%]{position:absolute;left:50%;bottom:-68px;transform:translate(-50%);display:flex;justify-content:center;pointer-events:none}.custom-node.in-group[_ngcontent-%COMP%] .add-subagent-container[_ngcontent-%COMP%]{left:auto;right:-68px;bottom:50%;transform:translateY(50%)}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]{width:48px;height:48px;border-radius:50%;border:2px solid var(--builder-accent-color);color:var(--builder-accent-color);display:flex;align-items:center;justify-content:center;padding:0;box-sizing:border-box;transition:transform .2s ease,box-shadow .2s ease,background .2s ease;pointer-events:auto}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%] .add-subagent-symbol[_ngcontent-%COMP%]{font-size:28px;line-height:1;font-weight:400}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05);box-shadow:var(--builder-canvas-add-btn-shadow)}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]:focus-visible{outline:none;box-shadow:var(--builder-canvas-add-btn-shadow)}.open-panel-btn[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;color:var(--builder-text-tertiary-color);cursor:pointer;margin-left:20px;margin-top:20px}.custom-node[_ngcontent-%COMP%]:hover .action-button-bar[_ngcontent-%COMP%], .custom-node.custom-node_selected[_ngcontent-%COMP%] .action-button-bar[_ngcontent-%COMP%]{opacity:1;pointer-events:auto}[_nghost-%COMP%] div[nodehandlescontroller][noderesizecontroller].wrapper{height:0px!important;overflow:visible!important}[_nghost-%COMP%] foreignObject.selectable, [_nghost-%COMP%] foreignObject.selectable>div{overflow:visible!important}[_nghost-%COMP%] .interactive-edge{stroke:var(--builder-accent-color)!important;stroke-width:2!important}[_nghost-%COMP%] .default-handle{stroke:var(--builder-accent-color)!important;stroke-width:1!important;fill:var(--builder-canvas-handle-fill)!important}[_nghost-%COMP%] .reconnect-handle{stroke:var(--builder-accent-color)!important;stroke-width:2!important;fill:var(--builder-canvas-reconnect-handle-fill)!important}[_nghost-%COMP%] .workflow-group-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--builder-canvas-workflow-chip-border);border-radius:16px;color:var(--builder-accent-color);font-family:Google Sans,sans-serif;font-size:12px;font-weight:500;height:32px;box-sizing:border-box;white-space:nowrap;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}[_nghost-%COMP%] .workflow-group-chip .workflow-chip-icon{font-size:16px;width:16px;height:16px;line-height:16px}[_nghost-%COMP%] .workflow-group-chip .workflow-chip-label{color:var(--builder-text-primary-color);font-weight:500;font-size:12px;line-height:1}[_nghost-%COMP%] .empty-group-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;border-radius:8px;text-align:center;border:2px dashed var(--builder-canvas-empty-group-border);transition:all .3s ease}[_nghost-%COMP%] .empty-group-placeholder:hover{border-color:var(--builder-canvas-empty-group-hover-border)}[_nghost-%COMP%] .empty-group-placeholder button{border:2px solid var(--builder-accent-color);color:var(--builder-accent-color);width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;transition:all .2s ease}[_nghost-%COMP%] .empty-group-placeholder button:hover{transform:scale(1.1);box-shadow:var(--builder-canvas-add-btn-shadow)}[_nghost-%COMP%] .empty-group-placeholder button mat-icon{font-size:24px;width:24px;height:24px}[_nghost-%COMP%] .empty-group-placeholder .empty-group-label{font-size:13px;font-weight:500;color:var(--builder-text-secondary-color);font-family:Google Sans,sans-serif}']})};function $uA(i,e){i&1&&Jn(0,"div",2)}var A3A=new MA("MAT_PROGRESS_BAR_DEFAULT_OPTIONS");var WE=(()=>{class i{_elementRef=w(se);_ngZone=w(qe);_changeDetectorRef=w(wt);_renderer=w(qi);_cleanupTransitionEnd;constructor(){let A=Oh(),t=w(A3A,{optional:!0});this._isNoopAnimation=A==="di-disabled",A==="reduced-motion"&&this._elementRef.nativeElement.classList.add("mat-progress-bar-reduced-motion"),t&&(t.color&&(this.color=this._defaultColor=t.color),this.mode=t.mode||this.mode)}_isNoopAnimation;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor="primary";get value(){return this._value}set value(A){this._value=VV(A||0),this._changeDetectorRef.markForCheck()}_value=0;get bufferValue(){return this._bufferValue||0}set bufferValue(A){this._bufferValue=VV(A||0),this._changeDetectorRef.markForCheck()}_bufferValue=0;animationEnd=new LA;get mode(){return this._mode}set mode(A){this._mode=A,this._changeDetectorRef.markForCheck()}_mode="determinate";ngAfterViewInit(){this._ngZone.runOutsideAngular(()=>{this._cleanupTransitionEnd=this._renderer.listen(this._elementRef.nativeElement,"transitionend",this._transitionendHandler)})}ngOnDestroy(){this._cleanupTransitionEnd?.()}_getPrimaryBarTransform(){return`scaleX(${this._isIndeterminate()?1:this.value/100})`}_getBufferBarFlexBasis(){return`${this.mode==="buffer"?this.bufferValue:100}%`}_isIndeterminate(){return this.mode==="indeterminate"||this.mode==="query"}_transitionendHandler=A=>{this.animationEnd.observers.length===0||!A.target||!A.target.classList.contains("mdc-linear-progress__primary-bar")||(this.mode==="determinate"||this.mode==="buffer")&&this._ngZone.run(()=>this.animationEnd.next({value:this.value}))};static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-progress-bar"]],hostAttrs:["role","progressbar","aria-valuemin","0","aria-valuemax","100","tabindex","-1",1,"mat-mdc-progress-bar","mdc-linear-progress"],hostVars:10,hostBindings:function(t,n){t&2&&(ee("aria-valuenow",n._isIndeterminate()?null:n.value)("mode",n.mode),go("mat-"+n.color),xA("_mat-animation-noopable",n._isNoopAnimation)("mdc-linear-progress--animation-ready",!n._isNoopAnimation)("mdc-linear-progress--indeterminate",n._isIndeterminate()))},inputs:{color:"color",value:[2,"value","value",dn],bufferValue:[2,"bufferValue","bufferValue",dn],mode:"mode"},outputs:{animationEnd:"animationEnd"},exportAs:["matProgressBar"],decls:7,vars:5,consts:[["aria-hidden","true",1,"mdc-linear-progress__buffer"],[1,"mdc-linear-progress__buffer-bar"],[1,"mdc-linear-progress__buffer-dots"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__primary-bar"],[1,"mdc-linear-progress__bar-inner"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__secondary-bar"]],template:function(t,n){t&1&&(Dn(0,"div",0),Jn(1,"div",1),Y(2,$uA,1,0,"div",2),Tn(),Dn(3,"div",3),Jn(4,"span",4),Tn(),Dn(5,"div",5),Jn(6,"span",4),Tn()),t&2&&(u(),ht("flex-basis",n._getBufferBarFlexBasis()),u(),O(n.mode==="buffer"?2:-1),u(),ht("transform",n._getPrimaryBarTransform()))},styles:[`.mat-mdc-progress-bar{--mat-progress-bar-animation-multiplier: 1;display:block;text-align:start}.mat-mdc-progress-bar[mode=query]{transform:scaleX(-1)}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-dots,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__secondary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__bar-inner.mdc-linear-progress__bar-inner{animation:none}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-bar{transition:transform 1ms}.mat-progress-bar-reduced-motion{--mat-progress-bar-animation-multiplier: 2}.mdc-linear-progress{position:relative;width:100%;transform:translateZ(0);outline:1px solid rgba(0,0,0,0);overflow-x:hidden;transition:opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:max(var(--mat-progress-bar-track-height, 4px),var(--mat-progress-bar-active-indicator-height, 4px))}@media(forced-colors: active){.mdc-linear-progress{outline-color:CanvasText}}.mdc-linear-progress__bar{position:absolute;top:0;bottom:0;margin:auto 0;width:100%;animation:none;transform-origin:top left;transition:transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:var(--mat-progress-bar-active-indicator-height, 4px)}.mdc-linear-progress--indeterminate .mdc-linear-progress__bar{transition:none}[dir=rtl] .mdc-linear-progress__bar{right:0;transform-origin:center right}.mdc-linear-progress__bar-inner{display:inline-block;position:absolute;width:100%;animation:none;border-top-style:solid;border-color:var(--mat-progress-bar-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-progress-bar-active-indicator-height, 4px)}.mdc-linear-progress__buffer{display:flex;position:absolute;top:0;bottom:0;margin:auto 0;width:100%;overflow:hidden;height:var(--mat-progress-bar-track-height, 4px);border-radius:var(--mat-progress-bar-track-shape, var(--mat-sys-corner-none))}.mdc-linear-progress__buffer-dots{background-image:radial-gradient(circle, var(--mat-progress-bar-track-color, var(--mat-sys-surface-variant)) calc(var(--mat-progress-bar-track-height, 4px) / 2), transparent 0);background-repeat:repeat-x;background-size:calc(calc(var(--mat-progress-bar-track-height, 4px) / 2)*5);background-position:left;flex:auto;transform:rotate(180deg);animation:mdc-linear-progress-buffering calc(250ms*var(--mat-progress-bar-animation-multiplier)) infinite linear}@media(forced-colors: active){.mdc-linear-progress__buffer-dots{background-color:ButtonBorder}}[dir=rtl] .mdc-linear-progress__buffer-dots{animation:mdc-linear-progress-buffering-reverse calc(250ms*var(--mat-progress-bar-animation-multiplier)) infinite linear;transform:rotate(0)}.mdc-linear-progress__buffer-bar{flex:0 1 100%;transition:flex-basis 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);background-color:var(--mat-progress-bar-track-color, var(--mat-sys-surface-variant))}.mdc-linear-progress__primary-bar{transform:scaleX(0)}.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{left:-145.166611%}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation:mdc-linear-progress-primary-indeterminate-translate calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-primary-indeterminate-scale calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation-name:mdc-linear-progress-primary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{right:-145.166611%;left:auto}.mdc-linear-progress__secondary-bar{display:none}.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{left:-54.888891%;display:block}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation:mdc-linear-progress-secondary-indeterminate-translate calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-secondary-indeterminate-scale calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation-name:mdc-linear-progress-secondary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{right:-54.888891%;left:auto}@keyframes mdc-linear-progress-buffering{from{transform:rotate(180deg) translateX(calc(var(--mat-progress-bar-track-height, 4px) * -2.5))}}@keyframes mdc-linear-progress-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(83.67142%)}100%{transform:translateX(200.611057%)}}@keyframes mdc-linear-progress-primary-indeterminate-scale{0%{transform:scaleX(0.08)}36.65%{animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);transform:scaleX(0.08)}69.15%{animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);transform:scaleX(0.661479)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(84.386165%)}100%{transform:translateX(160.277782%)}}@keyframes mdc-linear-progress-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);transform:scaleX(0.08)}19.15%{animation-timing-function:cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);transform:scaleX(0.457104)}44.15%{animation-timing-function:cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);transform:scaleX(0.72796)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-primary-indeterminate-translate-reverse{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(-83.67142%)}100%{transform:translateX(-200.611057%)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate-reverse{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(-37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(-84.386165%)}100%{transform:translateX(-160.277782%)}}@keyframes mdc-linear-progress-buffering-reverse{from{transform:translateX(-10px)}} +`],encapsulation:2,changeDetection:0})}return i})();function VV(i,e=0,A=100){return Math.max(e,Math.min(A,i))}var ZE=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Qi]})}return i})();var e3A=["switch"],t3A=["*"];function i3A(i,e){i&1&&(d(0,"span",11),It(),d(1,"svg",13),lA(2,"path",14),E(),d(3,"svg",15),lA(4,"path",16),E()())}var n3A=new MA("mat-slide-toggle-default-options",{providedIn:"root",factory:()=>({disableToggleValue:!1,hideIcon:!1,disabledInteractive:!1})}),e5=class{source;checked;constructor(e,A){this.source=e,this.checked=A}},o3A=(()=>{class i{_elementRef=w(se);_focusMonitor=w(Wa);_changeDetectorRef=w(wt);defaults=w(n3A);_onChange=A=>{};_onTouched=()=>{};_validatorOnChange=()=>{};_uniqueId;_checked=!1;_createChangeEvent(A){return new e5(this,A)}_labelId;get buttonId(){return`${this.id||this._uniqueId}-button`}_switchElement;focus(){this._switchElement.nativeElement.focus()}_noopAnimations=nn();_focused=!1;name=null;id;labelPosition="after";ariaLabel=null;ariaLabelledby=null;ariaDescribedby;required=!1;color;disabled=!1;disableRipple=!1;tabIndex=0;get checked(){return this._checked}set checked(A){this._checked=A,this._changeDetectorRef.markForCheck()}hideIcon;disabledInteractive;change=new LA;toggleChange=new LA;get inputId(){return`${this.id||this._uniqueId}-input`}constructor(){w(io).load(rr);let A=w(new ks("tabindex"),{optional:!0}),t=this.defaults;this.tabIndex=A==null?0:parseInt(A)||0,this.color=t.color||"accent",this.id=this._uniqueId=w(Bn).getId("mat-mdc-slide-toggle-"),this.hideIcon=t.hideIcon??!1,this.disabledInteractive=t.disabledInteractive??!1,this._labelId=this._uniqueId+"-label"}ngAfterContentInit(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{A==="keyboard"||A==="program"?(this._focused=!0,this._changeDetectorRef.markForCheck()):A||Promise.resolve().then(()=>{this._focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck()})})}ngOnChanges(A){A.required&&this._validatorOnChange()}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef)}writeValue(A){this.checked=!!A}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorOnChange=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck()}toggle(){this.checked=!this.checked,this._onChange(this.checked)}_emitChangeEvent(){this._onChange(this.checked),this.change.emit(this._createChangeEvent(this.checked))}_handleClick(){this.disabled||(this.toggleChange.emit(),this.defaults.disableToggleValue||(this.checked=!this.checked,this._onChange(this.checked),this.change.emit(new e5(this,this.checked))))}_getAriaLabelledBy(){return this.ariaLabelledby?this.ariaLabelledby:this.ariaLabel?null:this._labelId}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-slide-toggle"]],viewQuery:function(t,n){if(t&1&&Yt(e3A,5),t&2){let o;oe(o=ae())&&(n._switchElement=o.first)}},hostAttrs:[1,"mat-mdc-slide-toggle"],hostVars:13,hostBindings:function(t,n){t&2&&(Ea("id",n.id),ee("tabindex",null)("aria-label",null)("name",null)("aria-labelledby",null),go(n.color?"mat-"+n.color:""),xA("mat-mdc-slide-toggle-focused",n._focused)("mat-mdc-slide-toggle-checked",n.checked)("_mat-animation-noopable",n._noopAnimations))},inputs:{name:"name",id:"id",labelPosition:"labelPosition",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],required:[2,"required","required",Ee],color:"color",disabled:[2,"disabled","disabled",Ee],disableRipple:[2,"disableRipple","disableRipple",Ee],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:dn(A)],checked:[2,"checked","checked",Ee],hideIcon:[2,"hideIcon","hideIcon",Ee],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Ee]},outputs:{change:"change",toggleChange:"toggleChange"},exportAs:["matSlideToggle"],features:[Et([{provide:As,useExisting:Ga(()=>i),multi:!0},{provide:Mc,useExisting:i,multi:!0}]),Zt],ngContentSelectors:t3A,decls:14,vars:27,consts:[["switch",""],["mat-internal-form-field","",3,"labelPosition"],["role","switch","type","button",1,"mdc-switch",3,"click","tabIndex","disabled"],[1,"mat-mdc-slide-toggle-touch-target"],[1,"mdc-switch__track"],[1,"mdc-switch__handle-track"],[1,"mdc-switch__handle"],[1,"mdc-switch__shadow"],[1,"mdc-elevation-overlay"],[1,"mdc-switch__ripple"],["mat-ripple","",1,"mat-mdc-slide-toggle-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-switch__icons"],[1,"mdc-label",3,"click","for"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--on"],["d","M19.69,5.23L8.96,15.96l-4.23-4.23L2.96,13.5l6,6L21.46,7L19.69,5.23z"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--off"],["d","M20 13H4v-2h16v2z"]],template:function(t,n){if(t&1&&(Nt(),d(0,"div",1)(1,"button",2,0),T("click",function(){return n._handleClick()}),lA(3,"div",3)(4,"span",4),d(5,"span",5)(6,"span",6)(7,"span",7),lA(8,"span",8),E(),d(9,"span",9),lA(10,"span",10),E(),Y(11,i3A,5,0,"span",11),E()()(),d(12,"label",12),T("click",function(a){return a.stopPropagation()}),Ve(13),E()()),t&2){let o=gi(2);H("labelPosition",n.labelPosition),u(),xA("mdc-switch--selected",n.checked)("mdc-switch--unselected",!n.checked)("mdc-switch--checked",n.checked)("mdc-switch--disabled",n.disabled)("mat-mdc-slide-toggle-disabled-interactive",n.disabledInteractive),H("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("disabled",n.disabled&&!n.disabledInteractive),ee("id",n.buttonId)("name",n.name)("aria-label",n.ariaLabel)("aria-labelledby",n._getAriaLabelledBy())("aria-describedby",n.ariaDescribedby)("aria-required",n.required||null)("aria-checked",n.checked)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),u(9),H("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),u(),O(n.hideIcon?-1:11),u(),H("for",n.buttonId),ee("id",n._labelId)}},dependencies:[es,bm],styles:[`.mdc-switch{align-items:center;background:none;border:none;cursor:pointer;display:inline-flex;flex-shrink:0;margin:0;outline:none;overflow:visible;padding:0;position:relative;width:var(--mat-slide-toggle-track-width, 52px)}.mdc-switch.mdc-switch--disabled{cursor:default;pointer-events:none}.mdc-switch.mat-mdc-slide-toggle-disabled-interactive{pointer-events:auto}.mdc-switch__track{overflow:hidden;position:relative;width:100%;height:var(--mat-slide-toggle-track-height, 32px);border-radius:var(--mat-slide-toggle-track-shape, var(--mat-sys-corner-full))}.mdc-switch--disabled.mdc-switch .mdc-switch__track{opacity:var(--mat-slide-toggle-disabled-track-opacity, 0.12)}.mdc-switch__track::before,.mdc-switch__track::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";height:100%;left:0;position:absolute;width:100%;border-width:var(--mat-slide-toggle-track-outline-width, 2px);border-color:var(--mat-slide-toggle-track-outline-color, var(--mat-sys-outline))}.mdc-switch--selected .mdc-switch__track::before,.mdc-switch--selected .mdc-switch__track::after{border-width:var(--mat-slide-toggle-selected-track-outline-width, 2px);border-color:var(--mat-slide-toggle-selected-track-outline-color, transparent)}.mdc-switch--disabled .mdc-switch__track::before,.mdc-switch--disabled .mdc-switch__track::after{border-width:var(--mat-slide-toggle-disabled-unselected-track-outline-width, 2px);border-color:var(--mat-slide-toggle-disabled-unselected-track-outline-color, var(--mat-sys-on-surface))}@media(forced-colors: active){.mdc-switch__track{border-color:currentColor}}.mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0, 0, 0.2, 1);transform:translateX(0);background:var(--mat-slide-toggle-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch--selected .mdc-switch__track::before{transform:translateX(-100%)}.mdc-switch--selected .mdc-switch__track::before{opacity:var(--mat-slide-toggle-hidden-track-opacity, 0);transition:var(--mat-slide-toggle-hidden-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::before{opacity:var(--mat-slide-toggle-visible-track-opacity, 1);transition:var(--mat-slide-toggle-visible-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-hover-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-focus-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:active .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-pressed-track-color, var(--mat-sys-surface-variant))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::before,.mdc-switch.mdc-switch--disabled .mdc-switch__track::before{background:var(--mat-slide-toggle-disabled-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch__track::after{transform:translateX(-100%);background:var(--mat-slide-toggle-selected-track-color, var(--mat-sys-primary))}[dir=rtl] .mdc-switch__track::after{transform:translateX(100%)}.mdc-switch--selected .mdc-switch__track::after{transform:translateX(0)}.mdc-switch--selected .mdc-switch__track::after{opacity:var(--mat-slide-toggle-visible-track-opacity, 1);transition:var(--mat-slide-toggle-visible-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::after{opacity:var(--mat-slide-toggle-hidden-track-opacity, 0);transition:var(--mat-slide-toggle-hidden-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-hover-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-focus-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:active .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-pressed-track-color, var(--mat-sys-primary))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::after,.mdc-switch.mdc-switch--disabled .mdc-switch__track::after{background:var(--mat-slide-toggle-disabled-selected-track-color, var(--mat-sys-on-surface))}.mdc-switch__handle-track{height:100%;pointer-events:none;position:absolute;top:0;transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);left:0;right:auto;transform:translateX(0);width:calc(100% - var(--mat-slide-toggle-handle-width))}[dir=rtl] .mdc-switch__handle-track{left:auto;right:0}.mdc-switch--selected .mdc-switch__handle-track{transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch__handle-track{transform:translateX(-100%)}.mdc-switch__handle{display:flex;pointer-events:auto;position:absolute;top:50%;transform:translateY(-50%);left:0;right:auto;transition:width 75ms cubic-bezier(0.4, 0, 0.2, 1),height 75ms cubic-bezier(0.4, 0, 0.2, 1),margin 75ms cubic-bezier(0.4, 0, 0.2, 1);width:var(--mat-slide-toggle-handle-width);height:var(--mat-slide-toggle-handle-height);border-radius:var(--mat-slide-toggle-handle-shape, var(--mat-sys-corner-full))}[dir=rtl] .mdc-switch__handle{left:auto;right:0}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle{width:var(--mat-slide-toggle-unselected-handle-size, 16px);height:var(--mat-slide-toggle-unselected-handle-size, 16px);margin:var(--mat-slide-toggle-unselected-handle-horizontal-margin, 0 8px)}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-slide-toggle-unselected-with-icon-handle-horizontal-margin, 0 4px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle{width:var(--mat-slide-toggle-selected-handle-size, 24px);height:var(--mat-slide-toggle-selected-handle-size, 24px);margin:var(--mat-slide-toggle-selected-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-slide-toggle-selected-with-icon-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch__handle:has(.mdc-switch__icons){width:var(--mat-slide-toggle-with-icon-handle-size, 24px);height:var(--mat-slide-toggle-with-icon-handle-size, 24px)}.mat-mdc-slide-toggle .mdc-switch:active:not(.mdc-switch--disabled) .mdc-switch__handle{width:var(--mat-slide-toggle-pressed-handle-size, 28px);height:var(--mat-slide-toggle-pressed-handle-size, 28px)}.mat-mdc-slide-toggle .mdc-switch--selected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-slide-toggle-selected-pressed-handle-horizontal-margin, 0 22px)}.mat-mdc-slide-toggle .mdc-switch--unselected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-slide-toggle-unselected-pressed-handle-horizontal-margin, 0 2px)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__handle::after{opacity:var(--mat-slide-toggle-disabled-selected-handle-opacity, 1)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__handle::after{opacity:var(--mat-slide-toggle-disabled-unselected-handle-opacity, 0.38)}.mdc-switch__handle::before,.mdc-switch__handle::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";width:100%;height:100%;left:0;position:absolute;top:0;transition:background-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1),border-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);z-index:-1}@media(forced-colors: active){.mdc-switch__handle::before,.mdc-switch__handle::after{border-color:currentColor}}.mdc-switch--selected:enabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-handle-color, var(--mat-sys-on-primary))}.mdc-switch--selected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-hover-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-focus-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:active .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-pressed-handle-color, var(--mat-sys-primary-container))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:hover:not(:focus):not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:focus:not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:active .mdc-switch__handle::after,.mdc-switch--selected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-disabled-selected-handle-color, var(--mat-sys-surface))}.mdc-switch--unselected:enabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-handle-color, var(--mat-sys-outline))}.mdc-switch--unselected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-hover-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-focus-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:active .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-pressed-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-disabled-unselected-handle-color, var(--mat-sys-on-surface))}.mdc-switch__handle::before{background:var(--mat-slide-toggle-handle-surface-color)}.mdc-switch__shadow{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0}.mdc-switch:enabled .mdc-switch__shadow{box-shadow:var(--mat-slide-toggle-handle-elevation-shadow)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__shadow,.mdc-switch.mdc-switch--disabled .mdc-switch__shadow{box-shadow:var(--mat-slide-toggle-disabled-handle-elevation-shadow)}.mdc-switch__ripple{left:50%;position:absolute;top:50%;transform:translate(-50%, -50%);z-index:-1;width:var(--mat-slide-toggle-state-layer-size, 40px);height:var(--mat-slide-toggle-state-layer-size, 40px)}.mdc-switch__ripple::after{content:"";opacity:0}.mdc-switch--disabled .mdc-switch__ripple::after{display:none}.mat-mdc-slide-toggle-disabled-interactive .mdc-switch__ripple::after{display:block}.mdc-switch:hover .mdc-switch__ripple::after{transition:75ms opacity cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:focus .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:active .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:hover:not(:focus) .mdc-switch__ripple::after,.mdc-switch--unselected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-hover-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-switch--unselected:enabled:focus .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-focus-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-switch--unselected:enabled:active .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-pressed-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch--selected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-hover-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-switch--selected:enabled:focus .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-focus-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-switch--selected:enabled:active .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-pressed-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch__icons{position:relative;height:100%;width:100%;z-index:1;transform:translateZ(0)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__icons{opacity:var(--mat-slide-toggle-disabled-unselected-icon-opacity, 0.38)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__icons{opacity:var(--mat-slide-toggle-disabled-selected-icon-opacity, 0.38)}.mdc-switch__icon{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;opacity:0;transition:opacity 30ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-switch--unselected .mdc-switch__icon{width:var(--mat-slide-toggle-unselected-icon-size, 16px);height:var(--mat-slide-toggle-unselected-icon-size, 16px);fill:var(--mat-slide-toggle-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mat-slide-toggle-disabled-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__icon{width:var(--mat-slide-toggle-selected-icon-size, 16px);height:var(--mat-slide-toggle-selected-icon-size, 16px);fill:var(--mat-slide-toggle-selected-icon-color, var(--mat-sys-on-primary-container))}.mdc-switch--selected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mat-slide-toggle-disabled-selected-icon-color, var(--mat-sys-on-surface))}.mdc-switch--selected .mdc-switch__icon--on,.mdc-switch--unselected .mdc-switch__icon--off{opacity:1;transition:opacity 45ms 30ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle{-webkit-user-select:none;user-select:none;display:inline-block;-webkit-tap-highlight-color:rgba(0,0,0,0);outline:0}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple,.mat-mdc-slide-toggle .mdc-switch__ripple::after{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple:not(:empty),.mat-mdc-slide-toggle .mdc-switch__ripple::after:not(:empty){transform:translateZ(0)}.mat-mdc-slide-toggle.mat-mdc-slide-toggle-focused .mat-focus-indicator::before{content:""}.mat-mdc-slide-toggle .mat-internal-form-field{color:var(--mat-slide-toggle-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-slide-toggle-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-slide-toggle-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-slide-toggle-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-slide-toggle-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-slide-toggle-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-slide-toggle .mat-ripple-element{opacity:.12}.mat-mdc-slide-toggle .mat-focus-indicator::before{border-radius:50%}.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle-track,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__icon,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::after,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::after{transition:none}.mat-mdc-slide-toggle .mdc-switch:enabled+.mdc-label{cursor:pointer}.mat-mdc-slide-toggle .mdc-switch--disabled+label{color:var(--mat-slide-toggle-disabled-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-slide-toggle label:empty{display:none}.mat-mdc-slide-toggle-touch-target{position:absolute;top:50%;left:50%;height:var(--mat-slide-toggle-touch-target-size, 48px);width:100%;transform:translate(-50%, -50%);display:var(--mat-slide-toggle-touch-target-display, block)}[dir=rtl] .mat-mdc-slide-toggle-touch-target{left:auto;right:50%;transform:translate(50%, -50%)} +`],encapsulation:2,changeDetection:0})}return i})(),ZV=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[o3A,Qi]})}return i})();var Ax=["*"];function a3A(i,e){i&1&&Ve(0)}var r3A=["tabListContainer"],s3A=["tabList"],l3A=["tabListInner"],g3A=["nextPaginator"],c3A=["previousPaginator"],C3A=["content"];function I3A(i,e){}var d3A=["tabBodyWrapper"],B3A=["tabHeader"];function E3A(i,e){}function h3A(i,e){if(i&1&&yt(0,E3A,0,0,"ng-template",12),i&2){let A=p().$implicit;H("cdkPortalOutlet",A.templateLabel)}}function Q3A(i,e){if(i&1&&y(0),i&2){let A=p().$implicit;iA(A.textLabel)}}function u3A(i,e){if(i&1){let A=rA();d(0,"div",7,2),T("click",function(){let n=G(A),o=n.$implicit,a=n.$index,r=p(),s=gi(1);return K(r._handleClick(o,s,a))})("cdkFocusChange",function(n){let o=G(A).$index,a=p();return K(a._tabFocusChanged(n,o))}),lA(2,"span",8)(3,"div",9),d(4,"span",10)(5,"span",11),Y(6,h3A,1,1,null,12)(7,Q3A,1,1),E()()()}if(i&2){let A=e.$implicit,t=e.$index,n=gi(1),o=p();go(A.labelClass),xA("mdc-tab--active",o.selectedIndex===t),H("id",o._getTabLabelId(A,t))("disabled",A.disabled)("fitInkBarToContent",o.fitInkBarToContent),ee("tabIndex",o._getTabIndex(t))("aria-posinset",t+1)("aria-setsize",o._tabs.length)("aria-controls",o._getTabContentId(t))("aria-selected",o.selectedIndex===t)("aria-label",A.ariaLabel||null)("aria-labelledby",!A.ariaLabel&&A.ariaLabelledby?A.ariaLabelledby:null),u(3),H("matRippleTrigger",n)("matRippleDisabled",A.disabled||o.disableRipple),u(3),O(A.templateLabel?6:7)}}function p3A(i,e){i&1&&Ve(0)}function f3A(i,e){if(i&1){let A=rA();d(0,"mat-tab-body",13),T("_onCentered",function(){G(A);let n=p();return K(n._removeTabBodyWrapperHeight())})("_onCentering",function(n){G(A);let o=p();return K(o._setTabBodyWrapperHeight(n))})("_beforeCentering",function(n){G(A);let o=p();return K(o._bodyCentered(n))}),E()}if(i&2){let A=e.$implicit,t=e.$index,n=p();go(A.bodyClass),H("id",n._getTabContentId(t))("content",A.content)("position",A.position)("animationDuration",n.animationDuration)("preserveContent",n.preserveContent),ee("tabindex",n.contentTabIndex!=null&&n.selectedIndex===t?n.contentTabIndex:null)("aria-labelledby",n._getTabLabelId(A,t))("aria-hidden",n.selectedIndex!==t)}}var m3A=new MA("MatTabContent"),w3A=(()=>{class i{template=w(lo);constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","matTabContent",""]],features:[Et([{provide:m3A,useExisting:i}])]})}return i})(),D3A=new MA("MatTabLabel"),eW=new MA("MAT_TAB"),Vu=(()=>{class i extends gK{_closestTab=w(eW,{optional:!0});static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["","mat-tab-label",""],["","matTabLabel",""]],features:[Et([{provide:D3A,useExisting:i}]),mt]})}return i})(),tW=new MA("MAT_TAB_GROUP"),Wu=(()=>{class i{_viewContainerRef=w(So);_closestTabGroup=w(tW,{optional:!0});disabled=!1;get templateLabel(){return this._templateLabel}set templateLabel(A){this._setTemplateLabelInput(A)}_templateLabel;_explicitContent=void 0;_implicitContent;textLabel="";ariaLabel;ariaLabelledby;labelClass;bodyClass;id=null;_contentPortal=null;get content(){return this._contentPortal}_stateChanges=new te;position=null;origin=null;isActive=!1;constructor(){w(io).load(rr)}ngOnChanges(A){(A.hasOwnProperty("textLabel")||A.hasOwnProperty("disabled"))&&this._stateChanges.next()}ngOnDestroy(){this._stateChanges.complete()}ngOnInit(){this._contentPortal=new Gr(this._explicitContent||this._implicitContent,this._viewContainerRef)}_setTemplateLabelInput(A){A&&A._closestTab===this&&(this._templateLabel=A)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-tab"]],contentQueries:function(t,n,o){if(t&1&&Vo(o,Vu,5)(o,w3A,7,lo),t&2){let a;oe(a=ae())&&(n.templateLabel=a.first),oe(a=ae())&&(n._explicitContent=a.first)}},viewQuery:function(t,n){if(t&1&&Yt(lo,7),t&2){let o;oe(o=ae())&&(n._implicitContent=o.first)}},hostAttrs:["hidden",""],hostVars:1,hostBindings:function(t,n){t&2&&ee("id",null)},inputs:{disabled:[2,"disabled","disabled",Ee],textLabel:[0,"label","textLabel"],ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],labelClass:"labelClass",bodyClass:"bodyClass",id:"id"},exportAs:["matTab"],features:[Et([{provide:eW,useExisting:i}]),Zt],ngContentSelectors:Ax,decls:1,vars:0,template:function(t,n){t&1&&(Nt(),m3(0,a3A,1,0,"ng-template"))},encapsulation:2})}return i})(),W_="mdc-tab-indicator--active",XV="mdc-tab-indicator--no-transition",Z_=class{_items;_currentItem;constructor(e){this._items=e}hide(){this._items.forEach(e=>e.deactivateInkBar()),this._currentItem=void 0}alignToElement(e){let A=this._items.find(n=>n.elementRef.nativeElement===e),t=this._currentItem;if(A!==t&&(t?.deactivateInkBar(),A)){let n=t?.elementRef.nativeElement.getBoundingClientRect?.();A.activateInkBar(n),this._currentItem=A}}},y3A=(()=>{class i{_elementRef=w(se);_inkBarElement=null;_inkBarContentElement=null;_fitToContent=!1;get fitInkBarToContent(){return this._fitToContent}set fitInkBarToContent(A){this._fitToContent!==A&&(this._fitToContent=A,this._inkBarElement&&this._appendInkBarElement())}activateInkBar(A){let t=this._elementRef.nativeElement;if(!A||!t.getBoundingClientRect||!this._inkBarContentElement){t.classList.add(W_);return}let n=t.getBoundingClientRect(),o=A.width/n.width,a=A.left-n.left;t.classList.add(XV),this._inkBarContentElement.style.setProperty("transform",`translateX(${a}px) scaleX(${o})`),t.getBoundingClientRect(),t.classList.remove(XV),t.classList.add(W_),this._inkBarContentElement.style.setProperty("transform","")}deactivateInkBar(){this._elementRef.nativeElement.classList.remove(W_)}ngOnInit(){this._createInkBarElement()}ngOnDestroy(){this._inkBarElement?.remove(),this._inkBarElement=this._inkBarContentElement=null}_createInkBarElement(){let A=this._elementRef.nativeElement.ownerDocument||document,t=this._inkBarElement=A.createElement("span"),n=this._inkBarContentElement=A.createElement("span");t.className="mdc-tab-indicator",n.className="mdc-tab-indicator__content mdc-tab-indicator__content--underline",t.appendChild(this._inkBarContentElement),this._appendInkBarElement()}_appendInkBarElement(){this._inkBarElement;let A=this._fitToContent?this._elementRef.nativeElement.querySelector(".mdc-tab__content"):this._elementRef.nativeElement;A.appendChild(this._inkBarElement)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,inputs:{fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",Ee]}})}return i})();var iW=(()=>{class i extends y3A{elementRef=w(se);disabled=!1;focus(){this.elementRef.nativeElement.focus()}getOffsetLeft(){return this.elementRef.nativeElement.offsetLeft}getOffsetWidth(){return this.elementRef.nativeElement.offsetWidth}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["","matTabLabelWrapper",""]],hostVars:3,hostBindings:function(t,n){t&2&&(ee("aria-disabled",!!n.disabled),xA("mat-mdc-tab-disabled",n.disabled))},inputs:{disabled:[2,"disabled","disabled",Ee]},features:[mt]})}return i})(),$V={passive:!0},v3A=650,b3A=100,M3A=(()=>{class i{_elementRef=w(se);_changeDetectorRef=w(wt);_viewportRuler=w(fs);_dir=w(fo,{optional:!0});_ngZone=w(qe);_platform=w(Ci);_sharedResizeObserver=w(op);_injector=w(Dt);_renderer=w(qi);_animationsDisabled=nn();_eventCleanups;_scrollDistance=0;_selectedIndexChanged=!1;_destroyed=new te;_showPaginationControls=!1;_disableScrollAfter=!0;_disableScrollBefore=!0;_tabLabelCount;_scrollDistanceChanged=!1;_keyManager;_currentTextContent;_stopScrolling=new te;disablePagination=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){let t=isNaN(A)?0:A;this._selectedIndex!=t&&(this._selectedIndexChanged=!0,this._selectedIndex=t,this._keyManager&&this._keyManager.updateActiveItem(t))}_selectedIndex=0;selectFocusedIndex=new LA;indexFocused=new LA;constructor(){this._eventCleanups=this._ngZone.runOutsideAngular(()=>[this._renderer.listen(this._elementRef.nativeElement,"mouseleave",()=>this._stopInterval())])}ngAfterViewInit(){this._eventCleanups.push(this._renderer.listen(this._previousPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("before"),$V),this._renderer.listen(this._nextPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("after"),$V))}ngAfterContentInit(){let A=this._dir?this._dir.change:ie("ltr"),t=this._sharedResizeObserver.observe(this._elementRef.nativeElement).pipe(Ms(32),ut(this._destroyed)),n=this._viewportRuler.change(150).pipe(ut(this._destroyed)),o=()=>{this.updatePagination(),this._alignInkBarToSelectedTab()};this._keyManager=new y0(this._items).withHorizontalOrientation(this._getLayoutDirection()).withHomeAndEnd().withWrap().skipPredicate(()=>!1),this._keyManager.updateActiveItem(Math.max(this._selectedIndex,0)),jn(o,{injector:this._injector}),Ti(A,n,t,this._items.changes,this._itemsResized()).pipe(ut(this._destroyed)).subscribe(()=>{this._ngZone.run(()=>{Promise.resolve().then(()=>{this._scrollDistance=Math.max(0,Math.min(this._getMaxScrollDistance(),this._scrollDistance)),o()})}),this._keyManager?.withHorizontalOrientation(this._getLayoutDirection())}),this._keyManager.change.subscribe(a=>{this.indexFocused.emit(a),this._setTabFocus(a)})}_itemsResized(){return typeof ResizeObserver!="function"?nr:this._items.changes.pipe(kn(this._items),pi(A=>new bi(t=>this._ngZone.runOutsideAngular(()=>{let n=new ResizeObserver(o=>t.next(o));return A.forEach(o=>n.observe(o.elementRef.nativeElement)),()=>{n.disconnect()}}))),Cl(1),Ct(A=>A.some(t=>t.contentRect.width>0&&t.contentRect.height>0)))}ngAfterContentChecked(){this._tabLabelCount!=this._items.length&&(this.updatePagination(),this._tabLabelCount=this._items.length,this._changeDetectorRef.markForCheck()),this._selectedIndexChanged&&(this._scrollToLabel(this._selectedIndex),this._checkScrollingControls(),this._alignInkBarToSelectedTab(),this._selectedIndexChanged=!1,this._changeDetectorRef.markForCheck()),this._scrollDistanceChanged&&(this._updateTabScrollPosition(),this._scrollDistanceChanged=!1,this._changeDetectorRef.markForCheck())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._keyManager?.destroy(),this._destroyed.next(),this._destroyed.complete(),this._stopScrolling.complete()}_handleKeydown(A){if(!ha(A))switch(A.keyCode){case 13:case 32:if(this.focusIndex!==this.selectedIndex){let t=this._items.get(this.focusIndex);t&&!t.disabled&&(this.selectFocusedIndex.emit(this.focusIndex),this._itemSelected(A))}break;default:this._keyManager?.onKeydown(A)}}_onContentChanges(){let A=this._elementRef.nativeElement.textContent;A!==this._currentTextContent&&(this._currentTextContent=A||"",this._ngZone.run(()=>{this.updatePagination(),this._alignInkBarToSelectedTab(),this._changeDetectorRef.markForCheck()}))}updatePagination(){this._checkPaginationEnabled(),this._checkScrollingControls(),this._updateTabScrollPosition()}get focusIndex(){return this._keyManager?this._keyManager.activeItemIndex:0}set focusIndex(A){!this._isValidIndex(A)||this.focusIndex===A||!this._keyManager||this._keyManager.setActiveItem(A)}_isValidIndex(A){return this._items?!!this._items.toArray()[A]:!0}_setTabFocus(A){if(this._showPaginationControls&&this._scrollToLabel(A),this._items&&this._items.length){this._items.toArray()[A].focus();let t=this._tabListContainer.nativeElement;this._getLayoutDirection()=="ltr"?t.scrollLeft=0:t.scrollLeft=t.scrollWidth-t.offsetWidth}}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_updateTabScrollPosition(){if(this.disablePagination)return;let A=this.scrollDistance,t=this._getLayoutDirection()==="ltr"?-A:A;this._tabList.nativeElement.style.transform=`translateX(${Math.round(t)}px)`,(this._platform.TRIDENT||this._platform.EDGE)&&(this._tabListContainer.nativeElement.scrollLeft=0)}get scrollDistance(){return this._scrollDistance}set scrollDistance(A){this._scrollTo(A)}_scrollHeader(A){let t=this._tabListContainer.nativeElement.offsetWidth,n=(A=="before"?-1:1)*t/3;return this._scrollTo(this._scrollDistance+n)}_handlePaginatorClick(A){this._stopInterval(),this._scrollHeader(A)}_scrollToLabel(A){if(this.disablePagination)return;let t=this._items?this._items.toArray()[A]:null;if(!t)return;let n=this._tabListContainer.nativeElement.offsetWidth,{offsetLeft:o,offsetWidth:a}=t.elementRef.nativeElement,r,s;this._getLayoutDirection()=="ltr"?(r=o,s=r+a):(s=this._tabListInner.nativeElement.offsetWidth-o,r=s-a);let l=this.scrollDistance,g=this.scrollDistance+n;rg&&(this.scrollDistance+=Math.min(s-g,r-l))}_checkPaginationEnabled(){if(this.disablePagination)this._showPaginationControls=!1;else{let A=this._tabListInner.nativeElement.scrollWidth,t=this._elementRef.nativeElement.offsetWidth,n=A-t>=5;n||(this.scrollDistance=0),n!==this._showPaginationControls&&(this._showPaginationControls=n,this._changeDetectorRef.markForCheck())}}_checkScrollingControls(){this.disablePagination?this._disableScrollAfter=this._disableScrollBefore=!0:(this._disableScrollBefore=this.scrollDistance==0,this._disableScrollAfter=this.scrollDistance==this._getMaxScrollDistance(),this._changeDetectorRef.markForCheck())}_getMaxScrollDistance(){let A=this._tabListInner.nativeElement.scrollWidth,t=this._tabListContainer.nativeElement.offsetWidth;return A-t||0}_alignInkBarToSelectedTab(){let A=this._items&&this._items.length?this._items.toArray()[this.selectedIndex]:null,t=A?A.elementRef.nativeElement:null;t?this._inkBar.alignToElement(t):this._inkBar.hide()}_stopInterval(){this._stopScrolling.next()}_handlePaginatorPress(A,t){t&&t.button!=null&&t.button!==0||(this._stopInterval(),I3(v3A,b3A).pipe(ut(Ti(this._stopScrolling,this._destroyed))).subscribe(()=>{let{maxScrollDistance:n,distance:o}=this._scrollHeader(A);(o===0||o>=n)&&this._stopInterval()}))}_scrollTo(A){if(this.disablePagination)return{maxScrollDistance:0,distance:0};let t=this._getMaxScrollDistance();return this._scrollDistance=Math.max(0,Math.min(t,A)),this._scrollDistanceChanged=!0,this._checkScrollingControls(),{maxScrollDistance:t,distance:this._scrollDistance}}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,inputs:{disablePagination:[2,"disablePagination","disablePagination",Ee],selectedIndex:[2,"selectedIndex","selectedIndex",dn]},outputs:{selectFocusedIndex:"selectFocusedIndex",indexFocused:"indexFocused"}})}return i})(),S3A=(()=>{class i extends M3A{_items;_tabListContainer;_tabList;_tabListInner;_nextPaginator;_previousPaginator;_inkBar;ariaLabel;ariaLabelledby;disableRipple=!1;ngAfterContentInit(){this._inkBar=new Z_(this._items),super.ngAfterContentInit()}_itemSelected(A){A.preventDefault()}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275cmp=bA({type:i,selectors:[["mat-tab-header"]],contentQueries:function(t,n,o){if(t&1&&Vo(o,iW,4),t&2){let a;oe(a=ae())&&(n._items=a)}},viewQuery:function(t,n){if(t&1&&Yt(r3A,7)(s3A,7)(l3A,7)(g3A,5)(c3A,5),t&2){let o;oe(o=ae())&&(n._tabListContainer=o.first),oe(o=ae())&&(n._tabList=o.first),oe(o=ae())&&(n._tabListInner=o.first),oe(o=ae())&&(n._nextPaginator=o.first),oe(o=ae())&&(n._previousPaginator=o.first)}},hostAttrs:[1,"mat-mdc-tab-header"],hostVars:4,hostBindings:function(t,n){t&2&&xA("mat-mdc-tab-header-pagination-controls-enabled",n._showPaginationControls)("mat-mdc-tab-header-rtl",n._getLayoutDirection()=="rtl")},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],disableRipple:[2,"disableRipple","disableRipple",Ee]},features:[mt],ngContentSelectors:Ax,decls:13,vars:10,consts:[["previousPaginator",""],["tabListContainer",""],["tabList",""],["tabListInner",""],["nextPaginator",""],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-before",3,"click","mousedown","touchend","matRippleDisabled"],[1,"mat-mdc-tab-header-pagination-chevron"],[1,"mat-mdc-tab-label-container",3,"keydown"],["role","tablist",1,"mat-mdc-tab-list",3,"cdkObserveContent"],[1,"mat-mdc-tab-labels"],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-after",3,"mousedown","click","touchend","matRippleDisabled"]],template:function(t,n){t&1&&(Nt(),d(0,"div",5,0),T("click",function(){return n._handlePaginatorClick("before")})("mousedown",function(a){return n._handlePaginatorPress("before",a)})("touchend",function(){return n._stopInterval()}),lA(2,"div",6),E(),d(3,"div",7,1),T("keydown",function(a){return n._handleKeydown(a)}),d(5,"div",8,2),T("cdkObserveContent",function(){return n._onContentChanges()}),d(7,"div",9,3),Ve(9),E()()(),d(10,"div",10,4),T("mousedown",function(a){return n._handlePaginatorPress("after",a)})("click",function(){return n._handlePaginatorClick("after")})("touchend",function(){return n._stopInterval()}),lA(12,"div",6),E()),t&2&&(xA("mat-mdc-tab-header-pagination-disabled",n._disableScrollBefore),H("matRippleDisabled",n._disableScrollBefore||n.disableRipple),u(3),xA("_mat-animation-noopable",n._animationsDisabled),u(2),ee("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby||null),u(5),xA("mat-mdc-tab-header-pagination-disabled",n._disableScrollAfter),H("matRippleDisabled",n._disableScrollAfter||n.disableRipple))},dependencies:[es,VN],styles:[`.mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mdc-tab-indicator .mdc-tab-indicator__content{transition-duration:var(--mat-tab-animation-duration, 250ms)}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;outline:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-pagination-icon-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1;border-bottom-style:solid;border-bottom-width:var(--mat-tab-divider-height, 1px);border-bottom-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-group-inverted-header .mat-mdc-tab-label-container{border-bottom:none;border-top-style:solid;border-top-width:var(--mat-tab-divider-height, 1px);border-top-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.cdk-drop-list .mat-mdc-tab-labels,.mat-mdc-tab-labels.cdk-drop-list{min-height:var(--mat-tab-container-height, 48px)}.mat-mdc-tab::before{margin:5px}@media(forced-colors: active){.mat-mdc-tab[aria-disabled=true]{color:GrayText}} +`],encapsulation:2})}return i})(),k3A=new MA("MAT_TABS_CONFIG"),AW=(()=>{class i extends Jl{_host=w(X_);_ngZone=w(qe);_centeringSub=Mo.EMPTY;_leavingSub=Mo.EMPTY;constructor(){super()}ngOnInit(){super.ngOnInit(),this._centeringSub=this._host._beforeCentering.pipe(kn(this._host._isCenterPosition())).subscribe(A=>{this._host._content&&A&&!this.hasAttached()&&this._ngZone.run(()=>{Promise.resolve().then(),this.attach(this._host._content)})}),this._leavingSub=this._host._afterLeavingCenter.subscribe(()=>{this._host.preserveContent||this._ngZone.run(()=>this.detach())})}ngOnDestroy(){super.ngOnDestroy(),this._centeringSub.unsubscribe(),this._leavingSub.unsubscribe()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","matTabBodyHost",""]],features:[mt]})}return i})(),X_=(()=>{class i{_elementRef=w(se);_dir=w(fo,{optional:!0});_ngZone=w(qe);_injector=w(Dt);_renderer=w(qi);_diAnimationsDisabled=nn();_eventCleanups;_initialized=!1;_fallbackTimer;_positionIndex;_dirChangeSubscription=Mo.EMPTY;_position;_previousPosition;_onCentering=new LA;_beforeCentering=new LA;_afterLeavingCenter=new LA;_onCentered=new LA(!0);_portalHost;_contentElement;_content;animationDuration="500ms";preserveContent=!1;set position(A){this._positionIndex=A,this._computePositionAnimationState()}constructor(){if(this._dir){let A=w(wt);this._dirChangeSubscription=this._dir.change.subscribe(t=>{this._computePositionAnimationState(t),A.markForCheck()})}}ngOnInit(){this._bindTransitionEvents(),this._position==="center"&&(this._setActiveClass(!0),jn(()=>this._onCentering.emit(this._elementRef.nativeElement.clientHeight),{injector:this._injector})),this._initialized=!0}ngOnDestroy(){clearTimeout(this._fallbackTimer),this._eventCleanups?.forEach(A=>A()),this._dirChangeSubscription.unsubscribe()}_bindTransitionEvents(){this._ngZone.runOutsideAngular(()=>{let A=this._elementRef.nativeElement,t=n=>{n.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.remove("mat-tab-body-animating"),n.type==="transitionend"&&this._transitionDone())};this._eventCleanups=[this._renderer.listen(A,"transitionstart",n=>{n.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.add("mat-tab-body-animating"),this._transitionStarted())}),this._renderer.listen(A,"transitionend",t),this._renderer.listen(A,"transitioncancel",t)]})}_transitionStarted(){clearTimeout(this._fallbackTimer);let A=this._position==="center";this._beforeCentering.emit(A),A&&this._onCentering.emit(this._elementRef.nativeElement.clientHeight)}_transitionDone(){this._position==="center"?this._onCentered.emit():this._previousPosition==="center"&&this._afterLeavingCenter.emit()}_setActiveClass(A){this._elementRef.nativeElement.classList.toggle("mat-mdc-tab-body-active",A)}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_isCenterPosition(){return this._positionIndex===0}_computePositionAnimationState(A=this._getLayoutDirection()){this._previousPosition=this._position,this._positionIndex<0?this._position=A=="ltr"?"left":"right":this._positionIndex>0?this._position=A=="ltr"?"right":"left":this._position="center",this._animationsDisabled()?this._simulateTransitionEvents():this._initialized&&(this._position==="center"||this._previousPosition==="center")&&(clearTimeout(this._fallbackTimer),this._fallbackTimer=this._ngZone.runOutsideAngular(()=>setTimeout(()=>this._simulateTransitionEvents(),100)))}_simulateTransitionEvents(){this._transitionStarted(),jn(()=>this._transitionDone(),{injector:this._injector})}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration==="0ms"||this.animationDuration==="0s"}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-tab-body"]],viewQuery:function(t,n){if(t&1&&Yt(AW,5)(C3A,5),t&2){let o;oe(o=ae())&&(n._portalHost=o.first),oe(o=ae())&&(n._contentElement=o.first)}},hostAttrs:[1,"mat-mdc-tab-body"],hostVars:1,hostBindings:function(t,n){t&2&&ee("inert",n._position==="center"?null:"")},inputs:{_content:[0,"content","_content"],animationDuration:"animationDuration",preserveContent:"preserveContent",position:"position"},outputs:{_onCentering:"_onCentering",_beforeCentering:"_beforeCentering",_onCentered:"_onCentered"},decls:3,vars:6,consts:[["content",""],["cdkScrollable","",1,"mat-mdc-tab-body-content"],["matTabBodyHost",""]],template:function(t,n){t&1&&(d(0,"div",1,0),yt(2,I3A,0,0,"ng-template",2),E()),t&2&&xA("mat-tab-body-content-left",n._position==="left")("mat-tab-body-content-right",n._position==="right")("mat-tab-body-content-can-animate",n._position==="center"||n._previousPosition==="center")},dependencies:[AW,_0],styles:[`.mat-mdc-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-mdc-tab-body.mat-mdc-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-mdc-tab-group.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body.mat-mdc-tab-body-active{overflow-y:hidden}.mat-mdc-tab-body-content{height:100%;overflow:auto;transform:none;visibility:hidden}.mat-tab-body-animating>.mat-mdc-tab-body-content,.mat-mdc-tab-body-active>.mat-mdc-tab-body-content{visibility:visible}.mat-tab-body-animating>.mat-mdc-tab-body-content{min-height:1px}.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body-content{overflow:hidden}.mat-tab-body-content-can-animate{transition:transform var(--mat-tab-animation-duration) 1ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable .mat-tab-body-content-can-animate{transition:none}.mat-tab-body-content-left{transform:translate3d(-100%, 0, 0)}.mat-tab-body-content-right{transform:translate3d(100%, 0, 0)} +`],encapsulation:2})}return i})(),XE=(()=>{class i{_elementRef=w(se);_changeDetectorRef=w(wt);_ngZone=w(qe);_tabsSubscription=Mo.EMPTY;_tabLabelSubscription=Mo.EMPTY;_tabBodySubscription=Mo.EMPTY;_diAnimationsDisabled=nn();_allTabs;_tabBodies;_tabBodyWrapper;_tabHeader;_tabs=new pg;_indexToSelect=0;_lastFocusedTabIndex=null;_tabBodyWrapperHeight=0;color;get fitInkBarToContent(){return this._fitInkBarToContent}set fitInkBarToContent(A){this._fitInkBarToContent=A,this._changeDetectorRef.markForCheck()}_fitInkBarToContent=!1;stretchTabs=!0;alignTabs=null;dynamicHeight=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){this._indexToSelect=isNaN(A)?null:A}_selectedIndex=null;headerPosition="above";get animationDuration(){return this._animationDuration}set animationDuration(A){let t=A+"";this._animationDuration=/^\d+$/.test(t)?A+"ms":t}_animationDuration;get contentTabIndex(){return this._contentTabIndex}set contentTabIndex(A){this._contentTabIndex=isNaN(A)?null:A}_contentTabIndex=null;disablePagination=!1;disableRipple=!1;preserveContent=!1;get backgroundColor(){return this._backgroundColor}set backgroundColor(A){let t=this._elementRef.nativeElement.classList;t.remove("mat-tabs-with-background",`mat-background-${this.backgroundColor}`),A&&t.add("mat-tabs-with-background",`mat-background-${A}`),this._backgroundColor=A}_backgroundColor;ariaLabel;ariaLabelledby;selectedIndexChange=new LA;focusChange=new LA;animationDone=new LA;selectedTabChange=new LA(!0);_groupId;_isServer=!w(Ci).isBrowser;constructor(){let A=w(k3A,{optional:!0});this._groupId=w(Bn).getId("mat-tab-group-"),this.animationDuration=A&&A.animationDuration?A.animationDuration:"500ms",this.disablePagination=A&&A.disablePagination!=null?A.disablePagination:!1,this.dynamicHeight=A&&A.dynamicHeight!=null?A.dynamicHeight:!1,A?.contentTabIndex!=null&&(this.contentTabIndex=A.contentTabIndex),this.preserveContent=!!A?.preserveContent,this.fitInkBarToContent=A&&A.fitInkBarToContent!=null?A.fitInkBarToContent:!1,this.stretchTabs=A&&A.stretchTabs!=null?A.stretchTabs:!0,this.alignTabs=A&&A.alignTabs!=null?A.alignTabs:null}ngAfterContentChecked(){let A=this._indexToSelect=this._clampTabIndex(this._indexToSelect);if(this._selectedIndex!=A){let t=this._selectedIndex==null;if(!t){this.selectedTabChange.emit(this._createChangeEvent(A));let n=this._tabBodyWrapper.nativeElement;n.style.minHeight=n.clientHeight+"px"}Promise.resolve().then(()=>{this._tabs.forEach((n,o)=>n.isActive=o===A),t||(this.selectedIndexChange.emit(A),this._tabBodyWrapper.nativeElement.style.minHeight="")})}this._tabs.forEach((t,n)=>{t.position=n-A,this._selectedIndex!=null&&t.position==0&&!t.origin&&(t.origin=A-this._selectedIndex)}),this._selectedIndex!==A&&(this._selectedIndex=A,this._lastFocusedTabIndex=null,this._changeDetectorRef.markForCheck())}ngAfterContentInit(){this._subscribeToAllTabChanges(),this._subscribeToTabLabels(),this._tabsSubscription=this._tabs.changes.subscribe(()=>{let A=this._clampTabIndex(this._indexToSelect);if(A===this._selectedIndex){let t=this._tabs.toArray(),n;for(let o=0;o{t[A].isActive=!0,this.selectedTabChange.emit(this._createChangeEvent(A))})}this._changeDetectorRef.markForCheck()})}ngAfterViewInit(){this._tabBodySubscription=this._tabBodies.changes.subscribe(()=>this._bodyCentered(!0))}_subscribeToAllTabChanges(){this._allTabs.changes.pipe(kn(this._allTabs)).subscribe(A=>{this._tabs.reset(A.filter(t=>t._closestTabGroup===this||!t._closestTabGroup)),this._tabs.notifyOnChanges()})}ngOnDestroy(){this._tabs.destroy(),this._tabsSubscription.unsubscribe(),this._tabLabelSubscription.unsubscribe(),this._tabBodySubscription.unsubscribe()}realignInkBar(){this._tabHeader&&this._tabHeader._alignInkBarToSelectedTab()}updatePagination(){this._tabHeader&&this._tabHeader.updatePagination()}focusTab(A){let t=this._tabHeader;t&&(t.focusIndex=A)}_focusChanged(A){this._lastFocusedTabIndex=A,this.focusChange.emit(this._createChangeEvent(A))}_createChangeEvent(A){let t=new $_;return t.index=A,this._tabs&&this._tabs.length&&(t.tab=this._tabs.toArray()[A]),t}_subscribeToTabLabels(){this._tabLabelSubscription&&this._tabLabelSubscription.unsubscribe(),this._tabLabelSubscription=Ti(...this._tabs.map(A=>A._stateChanges)).subscribe(()=>this._changeDetectorRef.markForCheck())}_clampTabIndex(A){return Math.min(this._tabs.length-1,Math.max(A||0,0))}_getTabLabelId(A,t){return A.id||`${this._groupId}-label-${t}`}_getTabContentId(A){return`${this._groupId}-content-${A}`}_setTabBodyWrapperHeight(A){if(!this.dynamicHeight||!this._tabBodyWrapperHeight){this._tabBodyWrapperHeight=A;return}let t=this._tabBodyWrapper.nativeElement;t.style.height=this._tabBodyWrapperHeight+"px",this._tabBodyWrapper.nativeElement.offsetHeight&&(t.style.height=A+"px")}_removeTabBodyWrapperHeight(){let A=this._tabBodyWrapper.nativeElement;this._tabBodyWrapperHeight=A.clientHeight,A.style.height="",this._ngZone.run(()=>this.animationDone.emit())}_handleClick(A,t,n){t.focusIndex=n,A.disabled||(this.selectedIndex=n)}_getTabIndex(A){let t=this._lastFocusedTabIndex??this.selectedIndex;return A===t?0:-1}_tabFocusChanged(A,t){A&&A!=="mouse"&&A!=="touch"&&(this._tabHeader.focusIndex=t)}_bodyCentered(A){A&&this._tabBodies?.forEach((t,n)=>t._setActiveClass(n===this._selectedIndex))}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration==="0"||this.animationDuration==="0ms"}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-tab-group"]],contentQueries:function(t,n,o){if(t&1&&Vo(o,Wu,5),t&2){let a;oe(a=ae())&&(n._allTabs=a)}},viewQuery:function(t,n){if(t&1&&Yt(d3A,5)(B3A,5)(X_,5),t&2){let o;oe(o=ae())&&(n._tabBodyWrapper=o.first),oe(o=ae())&&(n._tabHeader=o.first),oe(o=ae())&&(n._tabBodies=o)}},hostAttrs:[1,"mat-mdc-tab-group"],hostVars:11,hostBindings:function(t,n){t&2&&(ee("mat-align-tabs",n.alignTabs),go("mat-"+(n.color||"primary")),ht("--mat-tab-animation-duration",n.animationDuration),xA("mat-mdc-tab-group-dynamic-height",n.dynamicHeight)("mat-mdc-tab-group-inverted-header",n.headerPosition==="below")("mat-mdc-tab-group-stretch-tabs",n.stretchTabs))},inputs:{color:"color",fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",Ee],stretchTabs:[2,"mat-stretch-tabs","stretchTabs",Ee],alignTabs:[0,"mat-align-tabs","alignTabs"],dynamicHeight:[2,"dynamicHeight","dynamicHeight",Ee],selectedIndex:[2,"selectedIndex","selectedIndex",dn],headerPosition:"headerPosition",animationDuration:"animationDuration",contentTabIndex:[2,"contentTabIndex","contentTabIndex",dn],disablePagination:[2,"disablePagination","disablePagination",Ee],disableRipple:[2,"disableRipple","disableRipple",Ee],preserveContent:[2,"preserveContent","preserveContent",Ee],backgroundColor:"backgroundColor",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"]},outputs:{selectedIndexChange:"selectedIndexChange",focusChange:"focusChange",animationDone:"animationDone",selectedTabChange:"selectedTabChange"},exportAs:["matTabGroup"],features:[Et([{provide:tW,useExisting:i}])],ngContentSelectors:Ax,decls:9,vars:8,consts:[["tabHeader",""],["tabBodyWrapper",""],["tabNode",""],[3,"indexFocused","selectFocusedIndex","selectedIndex","disableRipple","disablePagination","aria-label","aria-labelledby"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"id","mdc-tab--active","class","disabled","fitInkBarToContent"],[1,"mat-mdc-tab-body-wrapper"],["role","tabpanel",3,"id","class","content","position","animationDuration","preserveContent"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"click","cdkFocusChange","id","disabled","fitInkBarToContent"],[1,"mdc-tab__ripple"],["mat-ripple","",1,"mat-mdc-tab-ripple",3,"matRippleTrigger","matRippleDisabled"],[1,"mdc-tab__content"],[1,"mdc-tab__text-label"],[3,"cdkPortalOutlet"],["role","tabpanel",3,"_onCentered","_onCentering","_beforeCentering","id","content","position","animationDuration","preserveContent"]],template:function(t,n){t&1&&(Nt(),d(0,"mat-tab-header",3,0),T("indexFocused",function(a){return n._focusChanged(a)})("selectFocusedIndex",function(a){return n.selectedIndex=a}),xe(2,u3A,8,17,"div",4,ni),E(),Y(4,p3A,1,0),d(5,"div",5,1),xe(7,f3A,1,10,"mat-tab-body",6,ni),E()),t&2&&(H("selectedIndex",n.selectedIndex||0)("disableRipple",n.disableRipple)("disablePagination",n.disablePagination),D3("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby),u(2),Re(n._tabs),u(2),O(n._isServer?4:-1),u(),xA("_mat-animation-noopable",n._animationsDisabled()),u(2),Re(n._tabs))},dependencies:[S3A,iW,cy,es,Jl,X_],styles:[`.mdc-tab{min-width:90px;padding:0 24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;z-index:1;touch-action:manipulation}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab--active .mdc-tab__text-label{transition-delay:100ms}._mat-animation-noopable .mdc-tab__text-label{transition:none}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transition:var(--mat-tab-animation-duration, 250ms) transform cubic-bezier(0.4, 0, 0.2, 1);transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}._mat-animation-noopable .mdc-tab-indicator__content,.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mat-mdc-tab-ripple.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;height:var(--mat-tab-container-height, 48px);font-family:var(--mat-tab-label-text-font, var(--mat-sys-title-small-font));font-size:var(--mat-tab-label-text-size, var(--mat-sys-title-small-size));letter-spacing:var(--mat-tab-label-text-tracking, var(--mat-sys-title-small-tracking));line-height:var(--mat-tab-label-text-line-height, var(--mat-sys-title-small-line-height));font-weight:var(--mat-tab-label-text-weight, var(--mat-sys-title-small-weight))}.mat-mdc-tab.mdc-tab{flex-grow:0}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-tab-active-indicator-height, 2px);border-radius:var(--mat-tab-active-indicator-shape, 0)}.mat-mdc-tab:hover .mdc-tab__text-label{color:var(--mat-tab-inactive-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab:focus .mdc-tab__text-label{color:var(--mat-tab-inactive-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-active-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-active-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-active-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-hover-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-active-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-focus-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-disabled-ripple-color, var(--mat-sys-on-surface-variant))}.mat-mdc-tab .mdc-tab__ripple::before{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-inactive-label-text-color, var(--mat-sys-on-surface));display:inline-flex;align-items:center}.mat-mdc-tab .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-group.mat-mdc-tab-group-stretch-tabs>.mat-mdc-tab-header .mat-mdc-tab{flex-grow:1}.mat-mdc-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-background-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-focus-indicator::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-focus-indicator::before{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mdc-tab__ripple::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header{flex-direction:column-reverse}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header .mdc-tab-indicator__content--underline{align-self:flex-start}.mat-mdc-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important} +`],encapsulation:2})}return i})(),$_=class{index;tab};var nW=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[Qi]})}return i})();var x3A={cancelEditingTooltip:"Cancel editing",saveEvalMessageTooltip:"Save eval case message",thoughtChipLabel:"Thought",outcomeLabel:"Outcome",outputLabel:"Output",actualToolUsesLabel:"Actual tool uses:",expectedToolUsesLabel:"Expected tool uses:",actualResponseLabel:"Actual response:",expectedResponseLabel:"Expected response:",matchScoreLabel:"Match score",thresholdLabel:"Threshold",evalPassLabel:"PASS",evalFailLabel:"FAIL",editEvalMessageTooltip:"Edit eval case message",deleteEvalMessageTooltip:"Delete eval case message",editFunctionArgsTooltip:"Edit function arguments",typeMessagePlaceholder:"Type a message...",sendMessageTooltip:"Send message",uploadFileTooltip:"Upload local file",moreOptionsTooltip:"More options",updateStateMenuLabel:"Update state",updateStateMenuTooltip:"Update the session state",turnOffMicTooltip:"Hang up",useMicTooltip:"Call",turnOffCamTooltip:"Turn off camera",useCamTooltip:"Use camera",updatedSessionStateChipLabel:"Updated session state",proactiveAudioTooltip:"Enable the model to speak spontaneously without waiting for user input",affectiveDialogTooltip:"Enable the model to respond with emotional expression",sessionResumptionTooltip:"Allow the session to resume from a previous state",saveLiveBlobTooltip:"Save the recorded live stream data"},q2=new MA("Chat Panel Messages",{factory:()=>x3A});var t5="comm",i5="rule",n5="decl";var oW="@import";var aW="@namespace",rW="@keyframes";var sW="@layer";var ex=Math.abs,Zu=String.fromCharCode;function o5(i){return i.trim()}function Xu(i,e,A){return i.replace(e,A)}function lW(i,e,A){return i.indexOf(e,A)}function V2(i,e){return i.charCodeAt(e)|0}function W2(i,e,A){return i.slice(e,A)}function xl(i){return i.length}function gW(i){return i.length}function $E(i,e){return e.push(i),i}var a5=1,Ah=1,cW=0,dg=0,ir=0,th="";function r5(i,e,A,t,n,o,a,r){return{value:i,root:e,parent:A,type:t,props:n,children:o,line:a5,column:Ah,length:a,return:"",siblings:r}}function CW(){return ir}function IW(){return ir=dg>0?V2(th,--dg):0,Ah--,ir===10&&(Ah=1,a5--),ir}function Bg(){return ir=dg2||eh(ir)>3?"":" "}function hW(i,e){for(;--e&&Bg()&&!(ir<48||ir>102||ir>57&&ir<65||ir>70&&ir<97););return s5(i,$u()+(e<6&&mC()==32&&Bg()==32))}function tx(i){for(;Bg();)switch(ir){case i:return dg;case 34:case 39:i!==34&&i!==39&&tx(ir);break;case 40:i===41&&tx(i);break;case 92:Bg();break}return dg}function QW(i,e){for(;Bg()&&i+ir!==57;)if(i+ir===84&&mC()===47)break;return"/*"+s5(e,dg-1)+"*"+Zu(i===47?i:Bg())}function uW(i){for(;!eh(mC());)Bg();return s5(i,dg)}function mW(i){return BW(g5("",null,null,null,[""],i=dW(i),0,[0],i))}function g5(i,e,A,t,n,o,a,r,s){for(var l=0,g=0,C=a,I=0,B=0,Q=0,h=1,f=1,m=1,v=0,S="",k=n,M=o,x=t,F=S;f;)switch(Q=v,v=Bg()){case 40:if(Q!=108&&V2(F,C-1)==58){lW(F+=Xu(l5(v),"&","&\f"),"&\f",ex(l?r[l-1]:0))!=-1&&(m=-1);break}case 34:case 39:case 91:F+=l5(v);break;case 9:case 10:case 13:case 32:F+=EW(Q);break;case 92:F+=hW($u()-1,7);continue;case 47:switch(mC()){case 42:case 47:$E(R3A(QW(Bg(),$u()),e,A,s),s),(eh(Q||1)==5||eh(mC()||1)==5)&&xl(F)&&W2(F,-1,void 0)!==" "&&(F+=" ");break;default:F+="/"}break;case 123*h:r[l++]=xl(F)*m;case 125*h:case 59:case 0:switch(v){case 0:case 125:f=0;case 59+g:m==-1&&(F=Xu(F,/\f/g,"")),B>0&&(xl(F)-C||h===0&&Q===47)&&$E(B>32?fW(F+";",t,A,C-1,s):fW(Xu(F," ","")+";",t,A,C-2,s),s);break;case 59:F+=";";default:if($E(x=pW(F,e,A,l,g,n,r,S,k=[],M=[],C,o),o),v===123)if(g===0)g5(F,e,x,x,k,o,C,r,M);else{switch(I){case 99:if(V2(F,3)===110)break;case 108:if(V2(F,2)===97)break;default:g=0;case 100:case 109:case 115:}g?g5(i,x,x,t&&$E(pW(i,x,x,0,0,n,r,S,n,k=[],C,M),M),n,M,C,r,t?k:M):g5(F,x,x,x,[""],M,0,r,M)}}l=g=B=0,h=m=1,S=F="",C=a;break;case 58:C=1+xl(F),B=Q;default:if(h<1){if(v==123)--h;else if(v==125&&h++==0&&IW()==125)continue}switch(F+=Zu(v),v*h){case 38:m=g>0?1:(F+="\f",-1);break;case 44:r[l++]=(xl(F)-1)*m,m=1;break;case 64:mC()===45&&(F+=l5(Bg())),I=mC(),g=C=xl(S=F+=uW($u())),v++;break;case 45:Q===45&&xl(F)==2&&(h=0)}}return o}function pW(i,e,A,t,n,o,a,r,s,l,g,C){for(var I=n-1,B=n===0?o:[""],Q=gW(B),h=0,f=0,m=0;h0?B[v]+" "+S:Xu(S,/&\f/g,B[v])))&&(s[m++]=k);return r5(i,e,A,n===0?i5:r,s,l,g,C)}function R3A(i,e,A,t){return r5(i,e,A,t5,Zu(CW()),W2(i,2,-2),0,t)}function fW(i,e,A,t,n){return r5(i,e,A,n5,W2(i,0,t),W2(i,t+1,-1),t,n)}function c5(i,e){for(var A="",t=0;t/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(i),"detector"),F3A=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-WLB2FJ7K.js");return{id:MW,diagram:i}}),"loader"),L3A={id:MW,detector:N3A,loader:F3A},G3A=L3A,SW="flowchart",K3A=fe((i,e)=>e?.flowchart?.defaultRenderer==="dagre-wrapper"||e?.flowchart?.defaultRenderer==="elk"?!1:/^\s*graph/.test(i),"detector"),U3A=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-RCKFX6QR.js");return{id:SW,diagram:i}}),"loader"),T3A={id:SW,detector:K3A,loader:U3A},J3A=T3A,kW="flowchart-v2",Y3A=fe((i,e)=>e?.flowchart?.defaultRenderer==="dagre-d3"?!1:(e?.flowchart?.defaultRenderer==="elk"&&(e.layout="elk"),/^\s*graph/.test(i)&&e?.flowchart?.defaultRenderer==="dagre-wrapper"?!0:/^\s*flowchart/.test(i)),"detector"),O3A=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-RCKFX6QR.js");return{id:kW,diagram:i}}),"loader"),H3A={id:kW,detector:Y3A,loader:O3A},z3A=H3A,_W="er",P3A=fe(i=>/^\s*erDiagram/.test(i),"detector"),j3A=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-QGHEW6NO.js");return{id:_W,diagram:i}}),"loader"),q3A={id:_W,detector:P3A,loader:j3A},V3A=q3A,xW="gitGraph",W3A=fe(i=>/^\s*gitGraph/.test(i),"detector"),Z3A=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-BDIW4D5I.js");return{id:xW,diagram:i}}),"loader"),X3A={id:xW,detector:W3A,loader:Z3A},$3A=X3A,RW="gantt",ApA=fe(i=>/^\s*gantt/.test(i),"detector"),epA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-WZIWL22C.js");return{id:RW,diagram:i}}),"loader"),tpA={id:RW,detector:ApA,loader:epA},ipA=tpA,NW="info",npA=fe(i=>/^\s*info/.test(i),"detector"),opA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-ZX24QP2W.js");return{id:NW,diagram:i}}),"loader"),apA={id:NW,detector:npA,loader:opA},FW="pie",rpA=fe(i=>/^\s*pie/.test(i),"detector"),spA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-PM3FQFTD.js");return{id:FW,diagram:i}}),"loader"),lpA={id:FW,detector:rpA,loader:spA},LW="quadrantChart",gpA=fe(i=>/^\s*quadrantChart/.test(i),"detector"),cpA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-V2DCVTQX.js");return{id:LW,diagram:i}}),"loader"),CpA={id:LW,detector:gpA,loader:cpA},IpA=CpA,GW="xychart",dpA=fe(i=>/^\s*xychart(-beta)?/.test(i),"detector"),BpA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-J4R5U4YL.js");return{id:GW,diagram:i}}),"loader"),EpA={id:GW,detector:dpA,loader:BpA},hpA=EpA,KW="requirement",QpA=fe(i=>/^\s*requirement(Diagram)?/.test(i),"detector"),upA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-S22PTQH2.js");return{id:KW,diagram:i}}),"loader"),ppA={id:KW,detector:QpA,loader:upA},fpA=ppA,UW="sequence",mpA=fe(i=>/^\s*sequenceDiagram/.test(i),"detector"),wpA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-T2UY75BD.js");return{id:UW,diagram:i}}),"loader"),DpA={id:UW,detector:mpA,loader:wpA},ypA=DpA,TW="class",vpA=fe((i,e)=>e?.class?.defaultRenderer==="dagre-wrapper"?!1:/^\s*classDiagram/.test(i),"detector"),bpA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-46YSBSFN.js");return{id:TW,diagram:i}}),"loader"),MpA={id:TW,detector:vpA,loader:bpA},SpA=MpA,JW="classDiagram",kpA=fe((i,e)=>/^\s*classDiagram/.test(i)&&e?.class?.defaultRenderer==="dagre-wrapper"?!0:/^\s*classDiagram-v2/.test(i),"detector"),_pA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-75WMU75S.js");return{id:JW,diagram:i}}),"loader"),xpA={id:JW,detector:kpA,loader:_pA},RpA=xpA,YW="state",NpA=fe((i,e)=>e?.state?.defaultRenderer==="dagre-wrapper"?!1:/^\s*stateDiagram/.test(i),"detector"),FpA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-2LZ42ZOW.js");return{id:YW,diagram:i}}),"loader"),LpA={id:YW,detector:NpA,loader:FpA},GpA=LpA,OW="stateDiagram",KpA=fe((i,e)=>!!(/^\s*stateDiagram-v2/.test(i)||/^\s*stateDiagram/.test(i)&&e?.state?.defaultRenderer==="dagre-wrapper"),"detector"),UpA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-N5S45BK4.js");return{id:OW,diagram:i}}),"loader"),TpA={id:OW,detector:KpA,loader:UpA},JpA=TpA,HW="journey",YpA=fe(i=>/^\s*journey/.test(i),"detector"),OpA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-QMDHABEH.js");return{id:HW,diagram:i}}),"loader"),HpA={id:HW,detector:YpA,loader:OpA},zpA=HpA,PpA=fe((i,e,A)=>{Ka.debug(`rendering svg for syntax error +`);let t=$R(e),n=t.append("g");t.attr("viewBox","0 0 2412 512"),ZR(t,100,512,!0),n.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),n.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),n.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),n.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),n.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),n.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),n.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in text"),n.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text(`mermaid version ${A}`)},"draw"),zW={draw:PpA},jpA=zW,qpA={db:{},renderer:zW,parser:{parse:fe(()=>{},"parse")}},VpA=qpA,PW="flowchart-elk",WpA=fe((i,e={})=>/^\s*flowchart-elk/.test(i)||/^\s*(flowchart|graph)/.test(i)&&e?.flowchart?.defaultRenderer==="elk"?(e.layout="elk",!0):!1,"detector"),ZpA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-RCKFX6QR.js");return{id:PW,diagram:i}}),"loader"),XpA={id:PW,detector:WpA,loader:ZpA},$pA=XpA,jW="timeline",AfA=fe(i=>/^\s*timeline/.test(i),"detector"),efA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-ZCQFE5RP.js");return{id:jW,diagram:i}}),"loader"),tfA={id:jW,detector:AfA,loader:efA},ifA=tfA,qW="mindmap",nfA=fe(i=>/^\s*mindmap/.test(i),"detector"),ofA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-ICVZGLGO.js");return{id:qW,diagram:i}}),"loader"),afA={id:qW,detector:nfA,loader:ofA},rfA=afA,VW="kanban",sfA=fe(i=>/^\s*kanban/.test(i),"detector"),lfA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-6UL33SIT.js");return{id:VW,diagram:i}}),"loader"),gfA={id:VW,detector:sfA,loader:lfA},cfA=gfA,WW="sankey",CfA=fe(i=>/^\s*sankey(-beta)?/.test(i),"detector"),IfA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-W67OU2Q2.js");return{id:WW,diagram:i}}),"loader"),dfA={id:WW,detector:CfA,loader:IfA},BfA=dfA,ZW="packet",EfA=fe(i=>/^\s*packet(-beta)?/.test(i),"detector"),hfA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-WAKWL6X3.js");return{id:ZW,diagram:i}}),"loader"),QfA={id:ZW,detector:EfA,loader:hfA},XW="radar",ufA=fe(i=>/^\s*radar-beta/.test(i),"detector"),pfA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-5PR7OWPD.js");return{id:XW,diagram:i}}),"loader"),ffA={id:XW,detector:ufA,loader:pfA},$W="block",mfA=fe(i=>/^\s*block(-beta)?/.test(i),"detector"),wfA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-257HQBMN.js");return{id:$W,diagram:i}}),"loader"),DfA={id:$W,detector:mfA,loader:wfA},yfA=DfA,AZ="architecture",vfA=fe(i=>/^\s*architecture/.test(i),"detector"),bfA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-3YZ77ADE.js");return{id:AZ,diagram:i}}),"loader"),MfA={id:AZ,detector:vfA,loader:bfA},SfA=MfA,eZ="ishikawa",kfA=fe(i=>/^\s*ishikawa(-beta)?\b/i.test(i),"detector"),_fA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-LA76DWZL.js");return{id:eZ,diagram:i}}),"loader"),xfA={id:eZ,detector:kfA,loader:_fA},tZ="venn",RfA=fe(i=>/^\s*venn-beta/.test(i),"detector"),NfA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-JW2YJHYO.js");return{id:tZ,diagram:i}}),"loader"),FfA={id:tZ,detector:RfA,loader:NfA},LfA=FfA,iZ="treemap",GfA=fe(i=>/^\s*treemap/.test(i),"detector"),KfA=fe(()=>Ie(null,null,function*(){let{diagram:i}=yield import("./chunk-UWBTGTN5.js");return{id:iZ,diagram:i}}),"loader"),UfA={id:iZ,detector:GfA,loader:KfA},DW=!1,I5=fe(()=>{DW||(DW=!0,yh("error",VpA,i=>i.toLowerCase().trim()==="error"),yh("---",{db:{clear:fe(()=>{},"clear")},styles:{},renderer:{draw:fe(()=>{},"draw")},parser:{parse:fe(()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with un-indented `---` blocks")},"parse")},init:fe(()=>null,"init")},i=>i.toLowerCase().trimStart().startsWith("---")),k3($pA,rfA,SfA),k3(G3A,cfA,RpA,SpA,V3A,ipA,apA,lpA,fpA,ypA,z3A,J3A,ifA,$3A,JpA,GpA,zpA,IpA,BfA,QfA,hpA,yfA,ffA,xfA,UfA,LfA))},"addDiagrams"),TfA=fe(()=>Ie(null,null,function*(){Ka.debug("Loading registered diagrams");let e=(yield Promise.allSettled(Object.entries(S3).map(o=>Ie(null,[o],function*([A,{detector:t,loader:n}]){if(n)try{x3(A)}catch(a){try{let{diagram:r,id:s}=yield n();yh(s,r,t)}catch(r){throw Ka.error(`Failed to load external diagram with key ${A}. Removing from detectors.`),delete S3[A],r}}})))).filter(A=>A.status==="rejected");if(e.length>0){Ka.error(`Failed to load ${e.length} external diagrams`);for(let A of e)Ka.error(A);throw new Error(`Failed to load ${e.length} external diagrams`)}}),"loadRegisteredDiagrams"),JfA="graphics-document document";function nZ(i,e){i.attr("role",JfA),e!==""&&i.attr("aria-roledescription",e)}fe(nZ,"setA11yDiagramInfo");function oZ(i,e,A,t){if(i.insert!==void 0){if(A){let n=`chart-desc-${t}`;i.attr("aria-describedby",n),i.insert("desc",":first-child").attr("id",n).text(A)}if(e){let n=`chart-title-${t}`;i.attr("aria-labelledby",n),i.insert("title",":first-child").attr("id",n).text(e)}}}fe(oZ,"addSVGa11yTitleDescription");var nx=class aZ{constructor(e,A,t,n,o){this.type=e,this.text=A,this.db=t,this.parser=n,this.renderer=o}static{fe(this,"Diagram")}static fromText(t){return Ie(this,arguments,function*(e,A={}){let n=od(),o=TD(e,n);e=nN(e)+` +`;try{x3(o)}catch(g){let C=YR(o);if(!C)throw new JR(`Diagram ${o} not found.`);let{id:I,diagram:B}=yield C();yh(I,B)}let{db:a,parser:r,renderer:s,init:l}=x3(o);return r.parser&&(r.parser.yy=a),a.clear?.(),l?.(n),A.title&&a.setDiagramTitle?.(A.title),yield r.parse(e),new aZ(o,e,a,r,s)})}render(e,A){return Ie(this,null,function*(){yield this.renderer.draw(this.text,e,A,this)})}getParser(){return this.parser}getType(){return this.type}},yW=[],YfA=fe(()=>{yW.forEach(i=>{i()}),yW=[]},"attachFunctions"),OfA=fe(i=>i.replace(/^\s*%%(?!{)[^\n]+\n?/gm,"").trimStart(),"cleanupComments");function rZ(i){let e=i.match(TR);if(!e)return{text:i,metadata:{}};let A=eN(e[1],{schema:AN})??{};A=typeof A=="object"&&!Array.isArray(A)?A:{};let t={};return A.displayMode&&(t.displayMode=A.displayMode.toString()),A.title&&(t.title=A.title.toString()),A.config&&(t.config=A.config),{text:i.slice(e[0].length),metadata:t}}fe(rZ,"extractFrontMatter");var HfA=fe(i=>i.replace(/\r\n?/g,` +`).replace(/<(\w+)([^>]*)>/g,(e,A,t)=>"<"+A+t.replace(/="([^"]*)"/g,"='$1'")+">"),"cleanupText"),zfA=fe(i=>{let{text:e,metadata:A}=rZ(i),{displayMode:t,title:n,config:o={}}=A;return t&&(o.gantt||(o.gantt={}),o.gantt.displayMode=t),{title:n,config:o,text:e}},"processFrontmatter"),PfA=fe(i=>{let e=ad.detectInit(i)??{},A=ad.detectDirective(i,"wrap");return Array.isArray(A)?e.wrap=A.some(({type:t})=>t==="wrap"):A?.type==="wrap"&&(e.wrap=!0),{text:tN(i),directive:e}},"processDirectives");function ax(i){let e=HfA(i),A=zfA(e),t=PfA(A.text),n=iN(A.config,t.directive);return i=OfA(t.text),{code:i,title:A.title,config:n}}fe(ax,"preprocessDiagram");function sZ(i){let e=new TextEncoder().encode(i),A=Array.from(e,t=>String.fromCodePoint(t)).join("");return btoa(A)}fe(sZ,"toBase64");var jfA=5e4,qfA="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",VfA="sandbox",WfA="loose",ZfA="http://www.w3.org/2000/svg",XfA="http://www.w3.org/1999/xlink",$fA="http://www.w3.org/1999/xhtml",AmA="100%",emA="100%",tmA="border:0;margin:0;",imA="margin:0",nmA="allow-top-navigation-by-user-activation allow-popups",omA='The "iframe" tag is not supported by your browser.',amA=["foreignobject"],rmA=["dominant-baseline"];function rx(i){let e=ax(i);return Dh(),VR(e.config??{}),e}fe(rx,"processAndSetConfigs");function lZ(i,e){return Ie(this,null,function*(){I5();try{let{code:A,config:t}=rx(i);return{diagramType:(yield cZ(A)).type,config:t}}catch(A){if(e?.suppressErrors)return!1;throw A}})}fe(lZ,"parse");var vW=fe((i,e,A=[])=>` +.${i} ${e} { ${A.join(" !important; ")} !important; }`,"cssImportantStyles"),smA=fe((i,e=new Map)=>{let A="";if(i.themeCSS!==void 0&&(A+=` +${i.themeCSS}`),i.fontFamily!==void 0&&(A+=` +:root { --mermaid-font-family: ${i.fontFamily}}`),i.altFontFamily!==void 0&&(A+=` +:root { --mermaid-alt-font-family: ${i.altFontFamily}}`),e instanceof Map){let a=WR(i)?["> *","span"]:["rect","polygon","ellipse","circle","path"];e.forEach(r=>{zi(r.styles)||a.forEach(s=>{A+=vW(r.id,s,r.styles)}),zi(r.textStyles)||(A+=vW(r.id,"tspan",(r?.textStyles||[]).map(s=>s.replace("color","fill"))))})}return A},"createCssStyles"),lmA=fe((i,e,A,t)=>{let n=smA(i,A),o=XR(e,n,i.themeVariables);return c5(mW(`${t}{${o}}`),wW)},"createUserStyles"),gmA=fe((i="",e,A)=>{let t=i;return!A&&!e&&(t=t.replace(/marker-end="url\([\d+./:=?A-Za-z-]*?#/g,'marker-end="url(#')),t=oN(t),t=t.replace(/
          /g,"
          "),t},"cleanUpSvgCode"),cmA=fe((i="",e)=>{let A=e?.viewBox?.baseVal?.height?e.viewBox.baseVal.height+"px":emA,t=sZ(`${i}`);return``},"putIntoIFrame"),bW=fe((i,e,A,t,n)=>{let o=i.append("div");o.attr("id",A),t&&o.attr("style",t);let a=o.append("svg").attr("id",e).attr("width","100%").attr("xmlns",ZfA);return n&&a.attr("xmlns:xlink",n),a.append("g"),i},"appendDivSvgG");function ox(i,e){return i.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}fe(ox,"sandboxedIframe");var CmA=fe((i,e,A,t)=>{i.getElementById(e)?.remove(),i.getElementById(A)?.remove(),i.getElementById(t)?.remove()},"removeExistingElements"),ImA=fe(function(i,e,A){return Ie(this,null,function*(){I5();let t=rx(e);e=t.code;let n=od();Ka.debug(n),e.length>(n?.maxTextSize??jfA)&&(e=qfA);let o="#"+i,a="i"+i,r="#"+a,s="d"+i,l="#"+s,g=fe(()=>{let CA=xs(I?r:l).node();CA&&"remove"in CA&&CA.remove()},"removeTempElements"),C=xs("body"),I=n.securityLevel===VfA,B=n.securityLevel===WfA,Q=n.fontFamily;if(A!==void 0){if(A&&(A.innerHTML=""),I){let W=ox(xs(A),a);C=xs(W.nodes()[0].contentDocument.body),C.node().style.margin=0}else C=xs(A);bW(C,i,s,`font-family: ${Q}`,XfA)}else{if(CmA(document,i,s,a),I){let W=ox(xs("body"),a);C=xs(W.nodes()[0].contentDocument.body),C.node().style.margin=0}else C=xs("body");bW(C,i,s)}let h,f;try{h=yield nx.fromText(e,{title:t.title})}catch(W){if(n.suppressErrorRendering)throw g(),W;h=yield nx.fromText("error"),f=W}let m=C.select(l).node(),v=h.type,S=m.firstChild,k=S.firstChild,M=h.renderer.getClasses?.(e,h),x=lmA(n,v,M,o),F=document.createElement("style");F.innerHTML=x,S.insertBefore(F,k);try{yield h.renderer.draw(e,i,"11.13.0",h)}catch(W){throw n.suppressErrorRendering?g():jpA.draw(e,i,"11.13.0"),W}let z=C.select(`${l} svg`),P=h.db.getAccTitle?.(),Z=h.db.getAccDescription?.();CZ(v,z,P,Z),C.select(`[id="${i}"]`).selectAll("foreignobject > *").attr("xmlns",$fA);let AA=C.select(l).node().innerHTML;if(Ka.debug("config.arrowMarkerAbsolute",n.arrowMarkerAbsolute),AA=gmA(AA,I,HR(n.arrowMarkerAbsolute)),I){let W=C.select(l+" svg").node();AA=cmA(AA,W)}else B||(AA=UR.sanitize(AA,{ADD_TAGS:amA,ADD_ATTR:rmA,HTML_INTEGRATION_POINTS:{foreignobject:!0}}));if(YfA(),f)throw f;return g(),{diagramType:v,svg:AA,bindFunctions:h.db.bindFunctions}})},"render");function gZ(i={}){let e=OR({},i);e?.fontFamily&&!e.themeVariables?.fontFamily&&(e.themeVariables||(e.themeVariables={}),e.themeVariables.fontFamily=e.fontFamily),PR(e),e?.theme&&e.theme in _3?e.themeVariables=_3[e.theme].getThemeVariables(e.themeVariables):e&&(e.themeVariables=_3.default.getThemeVariables(e.themeVariables));let A=typeof e=="object"?zR(e):YD();UD(A.logLevel),I5()}fe(gZ,"initialize");var cZ=fe((i,e={})=>{let{code:A}=ax(i);return nx.fromText(A,e)},"getDiagramFromText");function CZ(i,e,A,t){nZ(e,i),oZ(e,A,t,e.attr("id"))}fe(CZ,"addA11yInfo");var PI=Object.freeze({render:ImA,parse:lZ,getDiagramFromText:cZ,initialize:gZ,getConfig:od,setConfig:qR,getSiteConfig:YD,updateSiteConfig:jR,reset:fe(()=>{Dh()},"reset"),globalReset:fe(()=>{Dh(JD)},"globalReset"),defaultConfig:JD});UD(od().logLevel);Dh(od());var dmA=fe((i,e,A)=>{Ka.warn(i),OD(i)?(A&&A(i.str,i.hash),e.push(Oe(oA({},i),{message:i.str,error:i}))):(A&&A(i),i instanceof Error&&e.push({str:i.message,message:i.message,hash:i.name,error:i}))},"handleError"),IZ=fe(function(){return Ie(this,arguments,function*(i={querySelector:".mermaid"}){try{yield BmA(i)}catch(e){if(OD(e)&&Ka.error(e.str),wC.parseError&&wC.parseError(e),!i.suppressErrors)throw Ka.error("Use the suppressErrors option to suppress these errors"),e}})},"run"),BmA=fe(function(){return Ie(this,arguments,function*({postRenderCallback:i,querySelector:e,nodes:A}={querySelector:".mermaid"}){let t=PI.getConfig();Ka.debug(`${i?"":"No "}Callback function found`);let n;if(A)n=A;else if(e)n=document.querySelectorAll(e);else throw new Error("Nodes and querySelector are both undefined");Ka.debug(`Found ${n.length} diagrams`),t?.startOnLoad!==void 0&&(Ka.debug("Start On Load: "+t?.startOnLoad),PI.updateSiteConfig({startOnLoad:t?.startOnLoad}));let o=new ad.InitIDGenerator(t.deterministicIds,t.deterministicIDSeed),a,r=[];for(let s of Array.from(n)){if(Ka.info("Rendering diagram: "+s.id),s.getAttribute("data-processed"))continue;s.setAttribute("data-processed","true");let l=`mermaid-${o.next()}`;a=s.innerHTML,a=aN(ad.entityDecode(a)).trim().replace(//gi,"
          ");let g=ad.detectInit(a);g&&Ka.debug("Detected early reinit: ",g);try{let{svg:C,bindFunctions:I}=yield hZ(l,a,s);s.innerHTML=C,i&&(yield i(l)),I&&I(s)}catch(C){dmA(C,r,wC.parseError)}}if(r.length>0)throw r[0]})},"runThrowsErrors"),dZ=fe(function(i){PI.initialize(i)},"initialize"),EmA=fe(function(i,e,A){return Ie(this,null,function*(){Ka.warn("mermaid.init is deprecated. Please use run instead."),i&&dZ(i);let t={postRenderCallback:A,querySelector:".mermaid"};typeof e=="string"?t.querySelector=e:e&&(e instanceof HTMLElement?t.nodes=[e]:t.nodes=e),yield IZ(t)})},"init"),hmA=fe((A,...t)=>Ie(null,[A,...t],function*(i,{lazyLoad:e=!0}={}){I5(),k3(...i),e===!1&&(yield TfA())}),"registerExternalDiagrams"),BZ=fe(function(){if(wC.startOnLoad){let{startOnLoad:i}=PI.getConfig();i&&wC.run().catch(e=>Ka.error("Mermaid failed to initialize",e))}},"contentLoaded");typeof document<"u"&&window.addEventListener("load",BZ,!1);var QmA=fe(function(i){wC.parseError=i},"setParseErrorHandler"),C5=[],ix=!1,EZ=fe(()=>Ie(null,null,function*(){if(!ix){for(ix=!0;C5.length>0;){let i=C5.shift();if(i)try{yield i()}catch(e){Ka.error("Error executing queue",e)}}ix=!1}}),"executeQueue"),umA=fe((i,e)=>Ie(null,null,function*(){return new Promise((A,t)=>{let n=fe(()=>new Promise((o,a)=>{PI.parse(i,e).then(r=>{o(r),A(r)},r=>{Ka.error("Error parsing",r),wC.parseError?.(r),a(r),t(r)})}),"performCall");C5.push(n),EZ().catch(t)})}),"parse"),hZ=fe((i,e,A)=>new Promise((t,n)=>{let o=fe(()=>new Promise((a,r)=>{PI.render(i,e,A).then(s=>{a(s),t(s)},s=>{Ka.error("Error parsing",s),wC.parseError?.(s),r(s),n(s)})}),"performCall");C5.push(o),EZ().catch(n)}),"render"),pmA=fe(()=>Object.keys(S3).map(i=>({id:i})),"getRegisteredDiagramsMetadata"),wC={startOnLoad:!0,mermaidAPI:PI,parse:umA,render:hZ,init:EmA,run:IZ,registerExternalDiagrams:hmA,registerLayoutLoaders:sN,initialize:dZ,parseError:void 0,contentLoaded:BZ,setParseErrorHandler:QmA,detectType:TD,registerIconPacks:rN,getRegisteredDiagramsMetadata:pmA},sx=wC;var mie=s3(QZ());Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));Prism.languages.js=Prism.languages.javascript;(function(i){i.languages.typescript=i.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),i.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete i.languages.typescript.parameter,delete i.languages.typescript["literal-property"];var e=i.languages.extend("typescript",{});delete e["class-name"],i.languages.typescript["class-name"].inside=e,i.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e}}}}),i.languages.ts=i.languages.typescript})(Prism);(function(i){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;i.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},i.languages.css.atrule.inside.rest=i.languages.css;var A=i.languages.markup;A&&(A.tag.addInlined("style","css"),A.tag.addAttribute("style","css"))})(Prism);Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}};Prism.languages.webmanifest=Prism.languages.json;(function(i){var e="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",A={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},t={bash:A,environment:{pattern:RegExp("\\$"+e),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+e),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};i.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+e),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:t},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:A}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:t},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:t.entity}}],environment:{pattern:RegExp("\\$?"+e),alias:"constant"},variable:t.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},A.inside=i.languages.bash;for(var n=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=t.variable[1].inside,a=0;a]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/};Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python;Prism.languages.py=Prism.languages.python;(function(i){var e=/[*&][^\s[\]{},]+/,A=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,t="(?:"+A.source+"(?:[ ]+"+e.source+")?|"+e.source+"(?:[ ]+"+A.source+")?)",n=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function a(r,s){s=(s||"").replace(/m/g,"")+"m";var l=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return t}).replace(/<>/g,function(){return r});return RegExp(l,s)}i.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return t})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return t}).replace(/<>/g,function(){return"(?:"+n+"|"+o+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:a(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:a(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:a(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:a(o),lookbehind:!0,greedy:!0},number:{pattern:a(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:A,important:e,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},i.languages.yml=i.languages.yaml})(Prism);var mmA=i=>({color:i}),Z2=class i{constructor(e,A){this.elementRef=e;this.chatPanel=A;_n(()=>{let t=this.text();setTimeout(()=>{this.renderMermaid(),this.addCopyButtons()},100)})}text=De("");thought=De(!1);isReadme=De(!1);ngOnInit(){sx.initialize({startOnLoad:!1,flowchart:{useMaxWidth:!0,htmlLabels:!0,curve:"basis"},theme:"neutral",themeVariables:{fontSize:"12px",primaryColor:"#e8f0fe",primaryTextColor:"#1a73e8",primaryBorderColor:"#1a73e8",lineColor:"#5f6368",secondaryColor:"#f1f3f4",tertiaryColor:"#ffffff"}})}renderMermaid(){let A=this.elementRef.nativeElement.querySelectorAll("pre code.language-mermaid"),t=!1;A.forEach(n=>{let o=n.parentElement;if(o){let a=n.textContent||"",r=document.createElement("div");r.classList.add("mermaid"),r.textContent=a.trim();let s=document.createElement("div");s.classList.add("mermaid-container"),s.appendChild(r),o.parentNode?.replaceChild(s,o),t=!0}}),t&&sx.run()}addCopyButtons(){let e=this.elementRef.nativeElement;e.querySelectorAll("pre").forEach(o=>{o.querySelector(".copy-code-button")||o.closest(".mermaid-container")||(o.style.position="relative",this.createCopyButton(o,o.querySelector("code")||o))});let t="";e.querySelectorAll("*").forEach(o=>{if(/^H[1-6]$/.test(o.tagName))t=o.textContent||"";else if(o.tagName==="CODE"){let a=o;if(a.closest("pre")||a.querySelector(".copy-code-button")||a.closest(".mermaid-container"))return;this.isReadme()&&t.toLowerCase().includes("sample inputs")&&(a.style.position="relative",this.createCopyButton(a,a),a.classList.add("runnable"),this.createRunButton(a,a))}})}createCopyButton(e,A){let t=document.createElement("button");t.className="copy-code-button",t.setAttribute("aria-label","Copy code"),t.type="button";let n=` + + + + `,o=` + + + + `;t.innerHTML=n,t.addEventListener("click",a=>{a.stopPropagation();let r=(A.textContent||"").trim();navigator.clipboard.writeText(r).then(()=>{t.innerHTML=o,t.classList.add("copied"),setTimeout(()=>{t.innerHTML=n,t.classList.remove("copied")},2e3)}).catch(s=>{console.error("Failed to copy text: ",s)})}),e.appendChild(t)}createRunButton(e,A){if(e.querySelector(".run-code-button"))return;let t=document.createElement("button");t.className="run-code-button",t.setAttribute("aria-label","Run sample input"),t.type="button";let n=` + + + + `;t.innerHTML=n,t.addEventListener("click",o=>{o.stopPropagation();let a=(A.textContent||"").trim();this.chatPanel&&(this.chatPanel.userInput=a,this.chatPanel.userInputChange.emit(a),setTimeout(()=>{this.chatPanel.sendMessage.emit(new Event("submit"))},50))}),e.appendChild(t)}static \u0275fac=function(A){return new(A||i)(ot(se),ot(X2,8))};static \u0275cmp=bA({type:i,selectors:[["app-markdown"]],inputs:{text:[1,"text"],thought:[1,"thought"],isReadme:[1,"isReadme"]},features:[Et([aQ()])],decls:1,vars:4,consts:[[3,"data","ngStyle"]],template:function(A,t){A&1&&lA(0,"markdown",0),A&2&&H("data",t.text())("ngStyle",Nl(2,mmA,t.thought()?"#9aa0a6":"inherit"))},dependencies:[si,nd,eG,AG],styles:[".mermaid-container[_ngcontent-%COMP%]{display:flex;justify-content:center;margin:16px 0}.mermaid[_ngcontent-%COMP%]{font-size:12px!important}.mermaid[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{max-width:100%;height:auto} .copy-code-button{position:absolute;top:4px;right:4px;z-index:10;display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border-radius:4px;background-color:var(--mat-sys-surface-container-high)!important;color:var(--mat-sys-on-surface-variant);border:none;cursor:pointer;opacity:0;transition:opacity .2s ease-in-out,background-color .2s ease-in-out,color .2s ease-in-out} pre:hover .copy-code-button{opacity:1} .copy-code-button:hover{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important} .copy-code-button:active{transform:scale(.95)} .copy-code-button.copied{color:#81c784!important;background-color:#4caf5026!important;opacity:1} pre:not(:hover) .copy-code-button.copied, code:not(pre code):not(:hover) .copy-code-button.copied{opacity:0!important;transition:none!important} .copy-code-button svg{width:16px;height:16px} .run-code-button{position:absolute;top:4px;right:4px;z-index:10;display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border-radius:4px;background-color:var(--mat-sys-surface-container-high)!important;color:var(--mat-sys-on-surface-variant);border:none;cursor:pointer;opacity:0;transition:opacity .2s ease-in-out,background-color .2s ease-in-out,color .2s ease-in-out} .run-code-button:hover{background-color:var(--mat-sys-primary-container)!important;color:var(--mat-sys-on-primary-container)!important} .run-code-button:active{transform:scale(.95)} .run-code-button svg{width:16px;height:16px} code:not(pre code){display:inline-block;position:relative;padding:0 4px;background-color:var(--mat-sys-surface-container-high);vertical-align:top} code:not(pre code).runnable:hover{padding-right:68px!important} code:not(pre code) .copy-code-button{position:absolute;top:50%;right:2px;transform:translateY(-50%);width:28px;height:28px;opacity:0;transition:none!important} code:not(pre code):hover .copy-code-button{opacity:1} code:not(pre code).runnable:hover .copy-code-button{right:32px!important} code:not(pre code) .copy-code-button:active{transform:translateY(-50%)!important} code:not(pre code) .run-code-button{position:absolute;top:50%;right:2px;transform:translateY(-50%);width:28px;height:28px;opacity:0;transition:none!important} code:not(pre code).runnable:hover .run-code-button{opacity:1} code:not(pre code) .run-code-button:active{transform:translateY(-50%)!important}"]})};function DmA(i,e){if(i&1){let A=rA();d(0,"span",6),T("click",function(n){G(A);let o=p();return K(o.toggleExpand(n))}),E()}if(i&2){let A=p();xA("expanded",A.isExpanded)}}function ymA(i,e){if(i&1){let A=rA();d(0,"button",11),T("click",function(n){G(A);let o=p(2);return K(o.openMarkdownDialog(o.key,o.json,n))}),y(1," MARKDOWN "),E()}}function vmA(i,e){if(i&1&&(d(0,"span",7),y(1),E(),d(2,"span",8),y(3,":"),E(),Y(4,ymA,2,0,"button",9),d(5,"span",10),y(6,"\xA0"),E()),i&2){let A=p();u(),iA(A.key),u(3),O(A.showMarkdown&&A.hasLineBreaks(A.json)?4:-1)}}function bmA(i,e){i&1&&(d(0,"span",14),y(1,"..."),E(),d(2,"span",13),y(3,"]"),E())}function MmA(i,e){if(i&1&&(d(0,"span",13),y(1,"["),E(),Y(2,bmA,4,0)),i&2){let A=p(2);u(2),O(A.isExpanded?-1:2)}}function SmA(i,e){i&1&&(d(0,"span",14),y(1,"..."),E())}function kmA(i,e){if(i&1&&Y(0,SmA,2,0,"span",14),i&2){let A=p(2);O(A.isExpanded?-1:0)}}function _mA(i,e){if(i&1){let A=rA();d(0,"span",12),T("click",function(n){G(A);let o=p();return K(o.toggleExpand(n))}),Y(1,MmA,3,1)(2,kmA,1,1),E()}if(i&2){let A=p();u(),O(A.isArray(A.json)?1:2)}}function xmA(i,e){if(i&1&&(d(0,"span",15),y(1),E()),i&2){let A=p(2);u(),Be('"',A.json,'"')}}function RmA(i,e){if(i&1&&(d(0,"span",16),y(1),E()),i&2){let A=p(2);u(),iA(A.json)}}function NmA(i,e){if(i&1&&(d(0,"span",17),y(1),E()),i&2){let A=p(2);u(),iA(A.json)}}function FmA(i,e){i&1&&(d(0,"span",18),y(1,"null"),E())}function LmA(i,e){i&1&&(d(0,"span",19),y(1,"undefined"),E())}function GmA(i,e){if(i&1&&(d(0,"span",4),Y(1,xmA,2,1,"span",15)(2,RmA,2,1,"span",16)(3,NmA,2,1,"span",17)(4,FmA,2,0,"span",18)(5,LmA,2,0,"span",19),E()),i&2){let A=p();H("ngClass",A.getTypeClass(A.json)),u(),O(A.isString(A.json)?1:A.isNumber(A.json)?2:A.isBoolean(A.json)?3:A.isNull(A.json)?4:A.isUndefined(A.json)?5:-1)}}function KmA(i,e){if(i&1&&lA(0,"app-custom-json-viewer",22),i&2){let A=e.$implicit,t=e.$index,n=p(3);H("json",A)("key",t)("depth",n.depth+1)("expanded",n.expanded)("showMarkdown",n.showMarkdown)}}function UmA(i,e){if(i&1&&xe(0,KmA,1,5,"app-custom-json-viewer",22,Nr),i&2){let A=p(2);Re(A.json)}}function TmA(i,e){if(i&1&&lA(0,"app-custom-json-viewer",22),i&2){let A=e.$implicit,t=p(3);H("json",t.json[A])("key",A)("depth",t.depth+1)("expanded",t.expanded)("showMarkdown",t.showMarkdown)}}function JmA(i,e){if(i&1&&xe(0,TmA,1,5,"app-custom-json-viewer",22,ni),i&2){let A=p(2);Re(A.getKeys(A.json))}}function YmA(i,e){i&1&&(d(0,"div",21),y(1,"]"),E())}function OmA(i,e){if(i&1&&(d(0,"div",20),Y(1,UmA,2,0)(2,JmA,2,0),Y(3,YmA,2,0,"div",21),E()),i&2){let A=p();xA("root-children",A.depth===0),u(),O(A.isArray(A.json)?1:2),u(2),O(A.isArray(A.json)?3:-1)}}var lx=class i{dialogRef=w(Vn);data=w(xo);close(){this.dialogRef.close()}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-markdown-preview-dialog"]],decls:10,vars:2,consts:[[1,"md-dialog-header"],["mat-dialog-title","",1,"md-title"],[1,"title-icon"],["mat-icon-button","",1,"close-button",3,"click"],[1,"md-dialog-content"],[3,"text"]],template:function(A,t){A&1&&(d(0,"div",0)(1,"h2",1)(2,"mat-icon",2),y(3,"article"),E(),y(4),E(),d(5,"button",3),T("click",function(){return t.close()}),d(6,"mat-icon"),y(7,"close"),E()()(),d(8,"mat-dialog-content",4),lA(9,"app-markdown",5),E()),A&2&&(u(4),Be(" Markdown Preview - ",t.data.key," "),u(5),H("text",t.data.value))},dependencies:[si,hl,na,ua,zt,vi,Z2],styles:[".md-dialog-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;padding:16px 24px 8px;border-bottom:1px solid var(--mat-sys-outline-variant)}.md-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin:0;font-size:1.25rem;font-weight:500;color:var(--mat-sys-on-surface)}.title-icon[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.close-button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)}.md-dialog-content[_ngcontent-%COMP%]{padding:24px;min-width:500px;max-width:80vw;max-height:70vh;overflow-y:auto;background-color:var(--mat-sys-surface-container-high);color:var(--mat-sys-on-surface)}"],changeDetection:0})},sl=class i{json;key;expanded=!0;depth=0;showMarkdown=!1;dialog=w(Ja);isExpanded=!0;ngOnInit(){this.isExpanded=this.expanded}isExpandable(){return this.json!==null&&typeof this.json=="object"}isObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}isArray(e){return Array.isArray(e)}isString(e){return typeof e=="string"}hasLineBreaks(e){return typeof e=="string"&&e.includes(` +`)}isNumber(e){return typeof e=="number"}isBoolean(e){return typeof e=="boolean"}isNull(e){return e===null}isUndefined(e){return e===void 0}getKeys(e){return e?Object.keys(e):[]}getTypeClass(e){return this.isString(e)?"segment-type-string":this.isNumber(e)?"segment-type-number":this.isBoolean(e)?"segment-type-boolean":this.isNull(e)?"segment-type-null":"segment-type-undefined"}toggleExpand(e){e.stopPropagation(),this.isExpanded=!this.isExpanded}openMarkdownDialog(e,A,t){t.stopPropagation(),this.dialog.open(lx,{data:{key:e.toString(),value:A},width:"800px",maxWidth:"90vw",panelClass:"custom-md-dialog"})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-custom-json-viewer"]],inputs:{json:"json",key:"key",expanded:"expanded",depth:"depth",showMarkdown:"showMarkdown"},decls:7,vars:6,consts:[[1,"segment"],[1,"segment-header"],[1,"segment-toggler",3,"expanded"],[1,"segment-value"],[1,"segment-value",3,"ngClass"],[1,"segment-children",3,"root-children"],[1,"segment-toggler",3,"click"],[1,"segment-key"],[1,"segment-separator"],["matTooltip","View in Markdown",1,"md-btn"],[1,"segment-space"],["matTooltip","View in Markdown",1,"md-btn",3,"click"],[1,"segment-value",3,"click"],[1,"bracket"],[1,"collapsed-summary"],[1,"value-string"],[1,"value-number"],[1,"value-boolean"],[1,"value-null"],[1,"value-undefined"],[1,"segment-children"],[1,"bracket","close-bracket"],[3,"json","key","depth","expanded","showMarkdown"]],template:function(A,t){A&1&&(d(0,"div",0)(1,"div",1),Y(2,DmA,1,2,"span",2),Y(3,vmA,7,2),Y(4,_mA,3,1,"span",3)(5,GmA,6,2,"span",4),E(),Y(6,OmA,4,4,"div",5),E()),A&2&&(xA("segment-expandable",t.isExpandable()),u(2),O(t.isExpandable()&&t.depth>0?2:-1),u(),O(t.key!==void 0?3:-1),u(),O(t.isExpandable()?4:5),u(2),O(t.isExpandable()&&t.isExpanded?6:-1))},dependencies:[i,si,Fl,Zi,hl],styles:["[_nghost-%COMP%]{display:block;font-family:var(--ngx-json-font-family, monospace);font-size:var(--ngx-json-font-size, 13px);line-height:1.4}.segment[_ngcontent-%COMP%]{margin:2px 0;display:block}.segment-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;flex-wrap:wrap}.segment-toggler[_ngcontent-%COMP%]{cursor:pointer;display:inline-block;width:0;height:0;border-style:solid;border-width:5px 0 5px 6px;border-color:transparent transparent transparent var(--mat-sys-outline);margin-right:8px;margin-top:4px;transition:transform .15s ease}.segment-toggler.expanded[_ngcontent-%COMP%]{transform:rotate(90deg)}.segment-toggler[_ngcontent-%COMP%]:hover{border-left-color:var(--mat-sys-primary)}.segment-key[_ngcontent-%COMP%]{color:var(--mat-sys-primary);font-weight:400;cursor:pointer}.segment-separator[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)}.segment-space[_ngcontent-%COMP%]{display:inline-block;width:4px;-webkit-user-select:none;user-select:none}.segment-value[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)}.bracket[_ngcontent-%COMP%]{color:var(--mat-sys-outline);font-weight:400}.collapsed-summary[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:11px;margin:0 4px}.segment-children[_ngcontent-%COMP%]{margin-left:12px;padding-left:4px}.segment-children.root-children[_ngcontent-%COMP%]{margin-left:0;padding-left:0}.close-bracket[_ngcontent-%COMP%]{display:block}.md-btn[_ngcontent-%COMP%]{border:none;outline:none;cursor:pointer;font-family:Roboto,sans-serif;font-size:10px;font-weight:700;letter-spacing:.5px;color:var(--mat-sys-primary);background-color:var(--mat-sys-primary-container);border-radius:4px;padding:2px 6px;margin-left:4px;margin-right:2px;display:inline-flex;align-items:center;justify-content:center;opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease,background-color .2s ease,color .2s ease,transform .2s ease;height:16px}.md-btn[_ngcontent-%COMP%]:hover{opacity:1!important;transform:scale(1.05);background-color:var(--mat-sys-primary);color:var(--mat-sys-on-primary)}.segment-header[_ngcontent-%COMP%]:hover .md-btn[_ngcontent-%COMP%]{opacity:.5;visibility:visible}.segment-type-string[_ngcontent-%COMP%]{color:var(--ngx-json-string, #FF6B6B)}.segment-type-string[_ngcontent-%COMP%] .value-string[_ngcontent-%COMP%]{white-space:pre-wrap;word-break:break-word}.segment-type-number[_ngcontent-%COMP%]{color:var(--mat-sys-error)}.segment-type-boolean[_ngcontent-%COMP%]{color:var(--mat-sys-secondary)}.segment-type-null[_ngcontent-%COMP%], .segment-type-undefined[_ngcontent-%COMP%]{color:var(--mat-sys-outline);font-style:italic} .custom-md-dialog .mat-mdc-dialog-container{border-radius:12px!important;border:1px solid var(--mat-sys-outline-variant);box-shadow:0 12px 40px #0000004d!important;background-color:var(--mat-sys-surface-container-high)!important}"],changeDetection:0})};function HmA(i,e){if(i&1&&(d(0,"div",1),y(1),E()),i&2){let A=p();u(),iA(A.title)}}var B5=class i{title="";set json(e){if(typeof e=="string")try{this.parsedJson=JSON.parse(e)}catch(A){this.parsedJson=e}else this.parsedJson=e}parsedJson={};static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-json-tooltip"]],inputs:{title:"title",json:"json"},decls:4,vars:3,consts:[[1,"tooltip-shell"],[1,"tooltip-title"],[1,"tooltip-content"],[3,"json","expanded"]],template:function(A,t){A&1&&(d(0,"div",0),Y(1,HmA,2,1,"div",1),d(2,"div",2),lA(3,"app-custom-json-viewer",3),E()()),A&2&&(u(),O(t.title?1:-1),u(2),H("json",t.parsedJson)("expanded",!0))},dependencies:[sl],styles:["[_nghost-%COMP%]{display:block;font-size:12px;line-height:1.4;word-break:break-word;overflow:hidden}.tooltip-shell[_ngcontent-%COMP%]{display:flex;flex-direction:column;max-width:800px;max-height:80vh;overflow:hidden}.tooltip-content[_ngcontent-%COMP%]{min-height:0;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable}.tooltip-title[_ngcontent-%COMP%]{font-weight:600;font-size:9px;color:var(--mat-sys-primary);opacity:.5;margin-bottom:4px;text-transform:uppercase;letter-spacing:.5px;position:sticky;top:0;background:inherit;z-index:1}app-custom-json-viewer[_ngcontent-%COMP%]{display:block;height:auto!important;min-width:0}"]})};var $2=class i{json="";title="";overlayRef=null;overlay=w(J1);elementRef=w(se);show(){if(!this.json)return;let e=this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8},{originX:"center",originY:"bottom",overlayX:"center",overlayY:"top",offsetY:8},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",offsetY:-8},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",offsetY:-8}]).withViewportMargin(16).withPush(!1);this.overlayRef=this.overlay.create({positionStrategy:e,scrollStrategy:this.overlay.scrollStrategies.close(),panelClass:"json-tooltip-panel",maxWidth:"90vw"});let A=new ms(B5),t=this.overlayRef.attach(A);t.instance.json=this.json,t.instance.title=this.title,t.changeDetectorRef.detectChanges(),this.overlayRef.updatePosition()}hide(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}ngOnDestroy(){this.hide()}static \u0275fac=function(A){return new(A||i)};static \u0275dir=qA({type:i,selectors:[["","appJsonTooltip",""]],hostBindings:function(A,t){A&1&&T("mouseenter",function(){return t.show()})("mouseleave",function(){return t.hide()})},inputs:{json:[0,"appJsonTooltip","json"],title:[0,"appJsonTooltipTitle","title"]}})},E5=class i{tooltipTemplate;context={};disabled=!1;overlayRef=null;overlay=w(J1);elementRef=w(se);viewContainerRef=w(So);show(){if(this.disabled||!this.tooltipTemplate)return;let e=this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8},{originX:"center",originY:"bottom",overlayX:"center",overlayY:"top",offsetY:8},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",offsetY:-8},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",offsetY:-8}]).withViewportMargin(16).withPush(!1);this.overlayRef=this.overlay.create({positionStrategy:e,scrollStrategy:this.overlay.scrollStrategies.close(),panelClass:"html-tooltip-panel",maxWidth:"90vw"});let A=new Gr(this.tooltipTemplate,this.viewContainerRef,this.context);this.overlayRef.attach(A)}hide(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}ngOnDestroy(){this.hide()}static \u0275fac=function(A){return new(A||i)};static \u0275dir=qA({type:i,selectors:[["","appHtmlTooltip",""]],hostBindings:function(A,t){A&1&&T("mouseenter",function(){return t.show()})("mouseleave",function(){return t.hide()})},inputs:{tooltipTemplate:[0,"appHtmlTooltip","tooltipTemplate"],context:[0,"appHtmlTooltipContext","context"],disabled:[0,"appHtmlTooltipDisabled","disabled"]}})};function zmA(i,e){if(i&1&&(d(0,"div",3)(1,"mat-icon",4),y(2,"robot_2"),E()()),i&2){let A=p();ht("background-color",A.color),xA("hidden",!A.author),H("appJsonTooltip",A.tooltip)}}function PmA(i,e){if(i&1&&(d(0,"div",5),y(1),E()),i&2){let A=p();ht("background-color",A.color),xA("hidden",!A.author),H("appJsonTooltip",A.tooltip),u(),Be(" ",A.initial," ")}}function jmA(i,e){i&1&&(d(0,"div",2)(1,"mat-icon"),y(2,"person"),E()())}var h5=class i{role="user";author="";nodePath="";themeService=w(jl);stringToColorService=w(PC);get tooltip(){if(this.role==="user")return"";let e={author:this.author,nodePath:this.nodePath||""};return JSON.stringify(e,null,2)}get color(){let e=this.getNodeName(this.nodePath||""),A=this.themeService.currentTheme();return this.stringToColorService.stc(e,A)}get initial(){let A=this.getNodeName(this.nodePath||"").match(/[A-Za-z0-9]/);return A?A[0].toUpperCase():"N"}getNodeName(e){return e.split(/[/.>]/).filter(Boolean).pop()||e}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-chat-avatar"]],inputs:{role:"role",author:"author",nodePath:"nodePath"},decls:3,vars:1,consts:[[1,"bot-avatar",3,"appJsonTooltip","hidden","background-color"],[1,"node-circle-icon",3,"background-color","appJsonTooltip","hidden"],[1,"user-avatar"],[1,"bot-avatar",3,"appJsonTooltip"],["fontSet","material-symbols-outlined"],[1,"node-circle-icon",3,"appJsonTooltip"]],template:function(A,t){A&1&&Y(0,zmA,3,5,"div",0)(1,PmA,2,6,"div",1)(2,jmA,3,0,"div",2),A&2&&O(t.role==="bot"?0:t.role==="node"?1:t.role==="user"?2:-1)},dependencies:[si,On,zt,Wi,$2],styles:["[_nghost-%COMP%]{display:contents}.node-circle-icon[_ngcontent-%COMP%]{width:32px;height:32px;border-radius:50%;margin-left:4px;margin-right:16px;margin-top:2px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;align-self:flex-start;color:#fff;font-size:14px;font-weight:600;line-height:1;text-transform:uppercase}.bot-avatar[_ngcontent-%COMP%], .user-avatar[_ngcontent-%COMP%]{width:40px;height:40px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.bot-avatar[_ngcontent-%COMP%]{margin-right:12px;color:#fff}.user-avatar[_ngcontent-%COMP%]{background-color:var(--mat-sys-primary);color:var(--mat-sys-on-primary)}.hidden[_ngcontent-%COMP%]{visibility:hidden}"]})};var Q5=new MA("FeedbackService");var qmA={goodResponseTooltip:"Good response",badResponseTooltip:"Bad response",feedbackAdditionalLabel:"Additional feedback (Optional)",feedbackCommentPlaceholderDown:"Share what could be improved in the response",feedbackCommentPlaceholderUp:"Share what you liked about the response",feedbackCancelButton:"Cancel",feedbackSubmitButton:"Submit",feedbackDialogTitle:"Reasons for feedback (Select all that apply)",feedbackReasonHallucination:"Hallucinated libraries / APIs etc",feedbackReasonIncomplete:"Incomplete answer",feedbackReasonFollowup:"Didn't understand followup",feedbackReasonFactual:"Factual errors",feedbackReasonLinks:"Broken/incorrect links",feedbackReasonIrrelevant:"Irrelevant information",feedbackReasonRepetitive:"Repetitive",feedbackReasonAccurate:"Accurate info",feedbackReasonHelpful:"Helpful",feedbackReasonConcise:"Concise",feedbackReasonUnderstanding:"Good understanding",feedbackReasonClear:"Clear and easy to follow"},uZ=new MA("Message Feedback Messages",{factory:()=>qmA});function VmA(i,e){i&1&&(d(0,"mat-icon"),y(1,"thumb_up_filled"),E())}function WmA(i,e){i&1&&(d(0,"mat-icon"),y(1,"thumb_up"),E())}function ZmA(i,e){i&1&&(d(0,"mat-icon"),y(1,"thumb_down_filled"),E())}function XmA(i,e){i&1&&(d(0,"mat-icon"),y(1,"thumb_down"),E())}function $mA(i,e){if(i&1&&(d(0,"mat-chip-option",7),y(1),E()),i&2){let A=e.$implicit;H("value",A),u(),Be(" ",A," ")}}function A6A(i,e){if(i&1){let A=rA();d(0,"div",4)(1,"div",5)(2,"h3"),y(3),E(),d(4,"mat-chip-listbox",6),xe(5,$mA,2,2,"mat-chip-option",7,ni),E()(),d(7,"div",8)(8,"h3"),y(9),E(),d(10,"mat-form-field",9)(11,"textarea",10),y(12," "),E()()(),d(13,"div",11)(14,"button",12),T("click",function(){G(A);let n=p();return K(n.onDetailedFeedbackCancelled())}),y(15),E(),d(16,"button",13),T("click",function(){G(A);let n=p();return K(n.onDetailedFeedbackSubmitted())}),y(17),E()()()}if(i&2){let A=p();u(3),iA(A.i18n.feedbackDialogTitle),u(),H("formControl",A.selectedReasons),u(),Re(A.reasons()),u(4),iA(A.i18n.feedbackAdditionalLabel),u(2),H("formControl",A.comment)("placeholder",A.feedbackPlaceholder()),u(4),Be(" ",A.i18n.feedbackCancelButton," "),u(2),Be(" ",A.i18n.feedbackSubmitButton," ")}}var u5=class i{sessionName=De.required();eventId=De.required();i18n=w(uZ);feedbackService=w(Q5);existingFeedback=Mp({params:()=>({sessionName:this.sessionName(),eventId:this.eventId()}),stream:({params:e})=>this.feedbackService.getFeedback(e.sessionName,e.eventId)});selectedFeedbackDirection=mA(void 0);feedbackDirection=me(()=>this.selectedFeedbackDirection()??this.existingFeedback.value()?.direction);isDetailedFeedbackVisible=mA(!1);feedbackPlaceholder=me(()=>this.feedbackDirection()==="up"?this.i18n.feedbackCommentPlaceholderUp:this.i18n.feedbackCommentPlaceholderDown);positiveReasonsResource=Mp({stream:()=>this.feedbackService.getPositiveFeedbackReasons()});negativeReasonsResource=Mp({stream:()=>this.feedbackService.getNegativeFeedbackReasons()});reasons=me(()=>this.feedbackDirection()==="up"?this.positiveReasonsResource.value():this.negativeReasonsResource.value());selectedReasons=new Rs([]);comment=new Rs("");isLoading=mA(!1);sendFeedback(e){this.feedbackDirection()===e?(this.isLoading.set(!0),this.feedbackService.deleteFeedback(this.sessionName(),this.eventId()).subscribe(()=>{this.isLoading.set(!1),this.selectedFeedbackDirection.set(void 0),this.resetDetailedFeedback()})):(this.selectedReasons.reset(),this.isLoading.set(!0),this.feedbackService.sendFeedback(this.sessionName(),this.eventId(),{direction:e}).subscribe(()=>{this.isLoading.set(!1),this.isDetailedFeedbackVisible.set(!0),this.selectedFeedbackDirection.set(e)}))}onDetailedFeedbackSubmitted(){let e=this.feedbackDirection();e&&(this.isLoading.set(!0),this.feedbackService.sendFeedback(this.sessionName(),this.eventId(),{direction:e,reasons:this.selectedReasons.value??[],comment:this.comment.value??void 0}).subscribe(()=>{this.isLoading.set(!1),this.resetDetailedFeedback()}))}onDetailedFeedbackCancelled(){this.selectedFeedbackDirection.set(void 0),this.resetDetailedFeedback()}resetDetailedFeedback(){this.isDetailedFeedbackVisible.set(!1),this.comment.reset(),this.selectedReasons.reset([])}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-message-feedback"]],inputs:{sessionName:[1,"sessionName"],eventId:[1,"eventId"]},decls:9,vars:7,consts:[[1,"message-feedback-container"],[1,"feedback-buttons"],["mat-icon-button","",3,"click","matTooltip","disabled"],["class","feedback-details-container",4,"ngIf"],[1,"feedback-details-container"],[1,"reasons-chips"],["multiple","",3,"formControl"],[3,"value"],[1,"additional-feedback"],["appearance","outline"],["matInput","",3,"formControl","placeholder"],[1,"actions"],["mat-stroked-button","",3,"click"],["mat-flat-button","","color","primary",3,"click"]],template:function(A,t){A&1&&(d(0,"div",0)(1,"div",1)(2,"button",2),T("click",function(){return t.sendFeedback("up")}),Y(3,VmA,2,0,"mat-icon")(4,WmA,2,0,"mat-icon"),E(),d(5,"button",2),T("click",function(){return t.sendFeedback("down")}),Y(6,ZmA,2,0,"mat-icon")(7,XmA,2,0,"mat-icon"),E()(),yt(8,A6A,18,7,"div",3),E()),A&2&&(u(2),H("matTooltip",t.i18n.goodResponseTooltip)("disabled",t.isLoading()),u(),O(t.feedbackDirection()==="up"?3:4),u(2),H("matTooltip",t.i18n.badResponseTooltip)("disabled",t.isLoading()),u(),O(t.feedbackDirection()==="down"?6:7),u(2),H("ngIf",t.isDetailedFeedbackVisible()))},dependencies:[si,Ll,xC,yn,vn,I1,Wi,Si,vi,Lw,x_,k_,Ta,To,On,zt,Gs,Qa,Ra,Zi],styles:[".message-feedback-container[_ngcontent-%COMP%]{display:block}.feedback-buttons[_ngcontent-%COMP%]{--mat-icon-button-touch-target-size: 32px;--button-size: 32px;--icon-size: 12px;margin-left:96px;display:flex}.feedback-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:var(--button-size);height:var(--button-size);transition:all .2s ease}.feedback-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:var(--icon-size);height:var(--icon-size);width:var(--icon-size);transition:all .2s ease}.feedback-buttons[_ngcontent-%COMP%] button.selected[_ngcontent-%COMP%]{color:var(--side-panel-button-filled-label-text-color, white)}.feedback-buttons[_ngcontent-%COMP%] button.selected[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:inherit}.reasons-chips[_ngcontent-%COMP%]{margin-bottom:20px}.feedback-details-container[_ngcontent-%COMP%]{margin-left:54px;max-width:500px;padding:16px;border-radius:8px;margin-top:8px;border:1px solid var(--builder-border-color)}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-weight:500;margin-bottom:8px;margin-top:0;color:var(--builder-text-secondary-color)}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{min-height:60px;resize:vertical}.feedback-details-container[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}.feedback-details-container[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:18px;padding:0 16px;height:32px;line-height:32px;font-weight:500}"]})};var e6A={cancelButton:"Cancel",saveButton:"Save",invalidJsonAlert:"Invalid JSON: "},pZ=new MA("Edit Json Dialog Messages",{factory:()=>e6A});var jI=class i{constructor(e,A){this.dialogRef=e;this.data=A;this.jsonString=JSON.stringify(A.jsonContent,null,2),this.functionName=A.functionName||""}jsonEditorComponent=ko(cc);jsonString="";functionName="";i18n=w(pZ);ngOnInit(){}onSave(){try{this.jsonString=this.jsonEditorComponent().getJsonString();let e=JSON.parse(this.jsonString);this.dialogRef.close(e)}catch(e){alert(this.i18n.invalidJsonAlert+e)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(A){return new(A||i)(ot(Vn),ot(xo))};static \u0275cmp=bA({type:i,selectors:[["app-edit-json-dialog"]],viewQuery:function(A,t){A&1&&Xr(t.jsonEditorComponent,cc,5),A&2&&Er()},decls:11,vars:5,consts:[[1,"dialog-container"],["mat-dialog-title",""],[1,"editor"],[3,"jsonString"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,t){A&1&&(d(0,"div",0)(1,"h2",1),y(2),E(),d(3,"mat-dialog-content",2),y(4),lA(5,"app-json-editor",3),E(),d(6,"mat-dialog-actions",4)(7,"button",5),y(8),E(),d(9,"button",6),T("click",function(){return t.onSave()}),y(10),E()()()),A&2&&(u(2),iA(t.data.dialogHeader),u(2),Be(" ",t.functionName," "),u(),H("jsonString",t.jsonString),u(3),iA(t.i18n.cancelButton),u(2),iA(t.i18n.saveButton))},dependencies:[na,ua,cc,pa,Si,OC],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:18px;width:500px;box-shadow:0 8px 16px var(--edit-json-dialog-container-box-shadow-color)}.editor[_ngcontent-%COMP%]{padding-top:12px;height:300px}"]})};function ih(i){if(!i)return!1;if(i.name==="computer"){let t=i.args?.action,n=i.args?.coordinate;return["left_click","right_click","middle_click","double_click"].includes(t)&&Array.isArray(n)&&n.length===2}let e=["click_at","hover_at","type_text_at","scroll_at","drag_and_drop","mouse_move","scroll_document","wait_5_seconds","navigate","open_web_browser"].includes(i.name),A=i.args?.x!=null&&i.args?.y!=null||Array.isArray(i.args?.coordinate)&&i.args?.coordinate.length===2;return e}function h0(i){return i?!!i.response?.image?.data:!1}var gx=(a=>(a[a.INACTIVE=0]="INACTIVE",a[a.PENDING=1]="PENDING",a[a.RUNNING=2]="RUNNING",a[a.COMPLETED=3]="COMPLETED",a[a.INTERRUPTED=4]="INTERRUPTED",a[a.FAILED=5]="FAILED",a))(gx||{});var t6A=()=>({type:"dots",color:"#424242",size:1,gap:10});function i6A(i,e){i&1&&(d(0,"span",2),y(1,"(Pinned - Click X to close)"),E())}function n6A(i,e){i&1&&(d(0,"span",2),y(1,"(Click to pin)"),E())}function o6A(i,e){i&1&&(d(0,"mat-icon",10),y(1,"chevron_right"),E())}function a6A(i,e){if(i&1){let A=rA();d(0,"span",9),T("click",function(){let n=G(A).$index,o=p(2);return K(o.navigateToLevel(n))}),y(1),E(),Y(2,o6A,2,0,"mat-icon",10)}if(i&2){let A=e.$implicit,t=e.$index,n=p(2);xA("active",t===n.breadcrumbs().length-1),u(),Be(" ",A," "),u(),O(t0?17:-1)}}function c6A(i,e){if(i&1&&(It(),d(0,"g",24),lA(1,"path",25),E()),i&2){let A=e.$implicit;u(),ee("d",A.path())("stroke",A.edge.data!=null&&A.edge.data.isActive?"#42A5F5":"rgba(138, 180, 248, 0.8)")("stroke-width",A.edge.data!=null&&A.edge.data.isActive?"3":"2")("class",A.edge.data!=null&&A.edge.data.isActive?"active-edge":"")("marker-end",A.markerEnd())}}var p5=class i{nodes=null;agentGraphData=null;nodePath=null;allNodes=null;isPinned=!1;onClose;graphNodes=mA([]);graphEdges=mA([]);NodeStatus=gx;connection={mode:"loose"};fullAgentData=null;navigationStack=[];breadcrumbs=mA([]);close(){this.onClose&&this.onClose()}ngOnInit(){this.buildGraph()}buildGraph(){if(this.agentGraphData?.root_agent){this.fullAgentData=this.agentGraphData.root_agent,this.navigationStack=[{name:this.agentGraphData.root_agent.name,data:this.agentGraphData.root_agent}],this.nodePath&&this.navigateToNodePath(this.nodePath),this.updateBreadcrumbs();let e=this.navigationStack[this.navigationStack.length-1].data;this.buildGraphFromStructure(e)}else this.buildGraphFromStateOnly()}buildGraphFromStructure(e){let A=[],t=[];if(e.nodes&&Array.isArray(e.nodes))this.buildMeshGraph(e.nodes,A,t);else if(e.graph&&e.graph.nodes){let n=OU(e.graph.nodes,e.graph.edges||[],ym);e.graph.nodes.forEach((o,a)=>{let r=Yg(o,`node_${a}`),s=this.nodes?this.nodes[r]:null,l=o.type||"agent",g=n.positions.get(r)||{x:ym.startX,y:ym.startY},C=T0(o),I=this.getNodeStatusAtLevel(r,o);A.push({id:r,type:"html-template",point:mA({x:g.x,y:g.y}),width:mA(180),height:mA(80),data:mA({name:r,type:l,status:I,input:s?.input,triggeredBy:s?.triggered_by,retryCount:s?.retry_count,runId:s?.run_id,hasNestedStructure:C,nodeData:o})})}),e.graph.edges&&e.graph.edges.forEach((o,a)=>{let r=Yg(o.from_node),s=Yg(o.to_node);if(r&&s){let l=this.getNodeStatusAtLevel(r,o.from_node),g=this.getNodeStatusAtLevel(s,o.to_node),C=l===2||l===3&&(g===2||g===1);t.push({id:`${r}_to_${s}_${a}`,source:r,target:s,type:"template",floating:!0,data:{isActive:C},markers:{end:{type:"arrow-closed",width:15,height:15,color:C?"#42A5F5":"rgba(138, 180, 248, 0.8)"}}})}})}this.graphNodes.set(A),this.graphEdges.set(t)}buildMeshGraph(e,A,t){let n=e.findIndex(I=>I.name===e[0]?.name||I.type==="coordinator"),o=n>=0?e[n]:null,a=e.filter((I,B)=>B!==n),r=100,s=200,l=300,C=400-(a.length-1)*l/2;if(o){let I=T0(o),B=Yg(o),Q=this.getNodeStatusAtLevel(B,o);A.push({id:B,type:"html-template",point:mA({x:400,y:r}),width:mA(180),height:mA(80),data:mA({name:B,type:"agent",status:Q,hasNestedStructure:I,nodeData:o})})}a.forEach((I,B)=>{let Q=C+B*l,h=r+s,f=T0(I),m=Yg(I),v=this.getNodeStatusAtLevel(m,I);if(A.push({id:m,type:"html-template",point:mA({x:Q,y:h}),width:mA(180),height:mA(80),data:mA({name:m,type:"agent",status:v,hasNestedStructure:f,nodeData:I})}),o){let S=Yg(o),k=this.getNodeStatusAtLevel(S,o),M=k===2||k===3&&(v===2||v===1);t.push({id:`${S}_to_${m}`,source:S,target:m,type:"template",floating:!0,data:{isActive:M},markers:{end:{type:"arrow-closed",width:15,height:15,color:M?"#42A5F5":"rgba(138, 180, 248, 0.8)"}}})}})}buildGraphFromStateOnly(){let e=[],A=[];if(!this.nodes){this.graphNodes.set(e),this.graphEdges.set(A);return}let a=Object.keys(this.nodes);a.forEach((r,s)=>{let l=this.nodes[r];e.push({id:r,type:"html-template",point:mA({x:200,y:50+s*120}),width:mA(180),height:mA(80),data:mA({name:r,type:r==="__START__"?"start":"agent",status:l.status,input:l.input,triggeredBy:l.triggered_by,retryCount:l.retry_count,runId:l.run_id})})}),a.forEach(r=>{let s=this.nodes[r];if(s.triggered_by&&a.includes(s.triggered_by)){let g=this.nodes[s.triggered_by]?.status===2;A.push({id:`${s.triggered_by}_to_${r}`,source:s.triggered_by,target:r,type:"template",floating:!0,data:{isActive:g},markers:{end:{type:"arrow-closed",width:15,height:15,color:g?"#42A5F5":"rgba(138, 180, 248, 0.8)"}}})}}),this.graphNodes.set(e),this.graphEdges.set(A)}getStatusColor(e){switch(e){case 0:return"#757575";case 1:return"#FFA726";case 2:return"#42A5F5";case 3:return"#66BB6A";case 4:return"#FFCA28";case 5:return"#EF5350";default:return"#757575"}}getStatusLabel(e){switch(e){case 0:return"INACTIVE";case 1:return"PENDING";case 2:return"RUNNING";case 3:return"COMPLETED";case 4:return"INTERRUPTED";case 5:return"FAILED";default:return"UNKNOWN"}}getStatusIcon(e){switch(e){case 0:return"radio_button_unchecked";case 1:return"schedule";case 2:return"play_circle";case 3:return"check_circle";case 4:return"pause_circle";case 5:return"error";default:return"help"}}updateBreadcrumbs(){this.breadcrumbs.set(this.navigationStack.map(e=>e.name))}navigateIntoNode(e){let A=this.navigationStack[this.navigationStack.length-1].data,t=IB(A,e);t&&T0(t)&&(this.navigationStack.push({name:e,data:t}),this.updateBreadcrumbs(),this.buildGraphFromStructure(t))}navigateToLevel(e){if(e>=0&&e1?9:-1),u(2),H("nodes",t.graphNodes())("edges",t.graphEdges())("connection",t.connection)("background",wc(8,t6A)))},dependencies:[si,On,zt,Wi,vi,$w,qu,A5,jV,jE,Hw],styles:[".workflow-graph-tooltip[_ngcontent-%COMP%]{width:500px;height:400px;border-radius:8px;padding:12px;display:flex;flex-direction:column;box-shadow:0 4px 16px #0006}.tooltip-header[_ngcontent-%COMP%]{font-size:14px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid rgba(255,255,255,.1);display:flex;align-items:center;gap:8px}.pinned-hint[_ngcontent-%COMP%]{font-size:12px;font-weight:400;opacity:.7;font-style:italic;flex:1}.close-button[_ngcontent-%COMP%]{width:24px;height:24px;line-height:24px;margin-left:auto}.close-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:18px}.breadcrumb-nav[_ngcontent-%COMP%]{display:flex;align-items:center;margin-bottom:8px;font-size:12px;color:var(--mdc-dialog-supporting-text-color)}.breadcrumb-item[_ngcontent-%COMP%]{cursor:pointer;padding:3px 6px;border-radius:3px;transition:background-color .2s}.breadcrumb-item.active[_ngcontent-%COMP%]{font-weight:500;cursor:default}.breadcrumb-separator[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;opacity:.5;margin:0 2px}.vflow-container[_ngcontent-%COMP%]{flex:1;min-height:0;border:1px solid rgba(255,255,255,.1);border-radius:4px;overflow:hidden;position:relative}.vflow-container[_ngcontent-%COMP%] vflow[_ngcontent-%COMP%]{width:100%;height:100%;display:block}.workflow-node[_ngcontent-%COMP%]{border:2px solid;border-radius:6px;padding:8px 12px;min-width:160px;box-shadow:0 2px 6px #0000004d;transition:all .2s}.workflow-node.expandable[_ngcontent-%COMP%]{cursor:pointer}.workflow-node.expandable[_ngcontent-%COMP%]:hover{box-shadow:0 4px 12px #8ab4f84d;transform:scale(1.02)}.node-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.node-type-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:#8ab4f8e6}.status-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;margin-left:auto}.node-label[_ngcontent-%COMP%]{font-weight:500;font-size:13px;color:var(--mdc-dialog-supporting-text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.node-type[_ngcontent-%COMP%]{font-size:10px;color:#8ab4f8cc;font-weight:500;text-transform:uppercase;letter-spacing:.5px;margin-top:2px}.node-status[_ngcontent-%COMP%]{font-size:11px;font-weight:600;margin-top:2px}.node-retry[_ngcontent-%COMP%]{font-size:10px;color:var(--mdc-dialog-supporting-text-color);opacity:.7;margin-top:2px}[_nghost-%COMP%] .active-edge{animation:_ngcontent-%COMP%_dash 1.5s linear infinite;stroke-dasharray:8 4}@keyframes _ngcontent-%COMP%_dash{to{stroke-dashoffset:-12}}"]})};var f5=class i{appWorkflowGraphTooltip=null;agentGraphData=null;nodePath=null;allNodes=null;overlay=w(J1);overlayPositionBuilder=w(Df);viewContainerRef=w(So);overlayRef=null;isPinned=!1;onClick(e){e.stopPropagation(),!(!this.appWorkflowGraphTooltip||Object.keys(this.appWorkflowGraphTooltip).length===0)&&(this.isPinned?this.hide():this.showPinned())}show(){this.isPinned||!this.appWorkflowGraphTooltip||Object.keys(this.appWorkflowGraphTooltip).length===0||this.overlayRef||this.showTooltip(!1)}hide(){this.isPinned||this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}showPinned(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null),this.isPinned=!0,this.showTooltip(!0)}showTooltip(e){if(this.overlayRef)return;let A=this.overlayPositionBuilder.flexibleConnectedTo(this.viewContainerRef.element).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8},{originX:"center",originY:"bottom",overlayX:"center",overlayY:"top",offsetY:8}]);this.overlayRef=this.overlay.create({positionStrategy:A,scrollStrategy:this.overlay.scrollStrategies.close(),hasBackdrop:e,backdropClass:e?"cdk-overlay-transparent-backdrop":void 0}),e&&this.overlayRef&&this.overlayRef.backdropClick().subscribe(()=>{this.isPinned=!1,this.hide()});let t=new ms(p5),n=this.overlayRef.attach(t);n.instance.nodes=this.appWorkflowGraphTooltip,n.instance.agentGraphData=this.agentGraphData,n.instance.nodePath=this.nodePath,n.instance.allNodes=this.allNodes,n.instance.isPinned=e,n.instance.onClose=()=>{this.isPinned=!1,this.hide()}}ngOnDestroy(){this.isPinned=!1,this.hide()}static \u0275fac=function(A){return new(A||i)};static \u0275dir=qA({type:i,selectors:[["","appWorkflowGraphTooltip",""]],hostBindings:function(A,t){A&1&&T("click",function(o){return t.onClick(o)})("mouseenter",function(){return t.show()})("mouseleave",function(){return t.hide()})},inputs:{appWorkflowGraphTooltip:"appWorkflowGraphTooltip",agentGraphData:"agentGraphData",nodePath:"nodePath",allNodes:"allNodes"}})};function C6A(i,e){if(i&1){let A=rA();d(0,"div",5)(1,"img",10),T("load",function(n){G(A);let o=p(4);return K(o.onImageLoad(n))})("click",function(n){G(A),p(3);let o=xn(0);return p().openImageViewer(o),K(n.stopPropagation())}),E(),lA(2,"div",11),E()}if(i&2){p(3);let A=xn(0),t=p();u(),H("src",A,so),u(),H("ngStyle",t.getClickBoxStyle())}}function I6A(i,e){i&1&&(d(0,"div",6)(1,"mat-icon",12),y(2,"image_not_supported"),E(),d(3,"span",13),y(4,"No screenshot"),E()())}function d6A(i,e){if(i&1){let A=rA();Y(0,C6A,3,2,"div",5)(1,I6A,5,0,"div",6),d(2,"div",7)(3,"span",8),y(4),E(),d(5,"mat-icon"),y(6,"arrow_forward"),E()(),d(7,"div",5)(8,"img",9),T("click",function(n){G(A),p(2);let o=xn(1);return p().openImageViewer(o),K(n.stopPropagation())}),E()()}if(i&2){p(2);let A=xn(0),t=xn(1),n=p();O(A?0:1),u(4),iA(n.getActionName()),u(4),H("src",t,so)}}function B6A(i,e){if(i&1){let A=rA();d(0,"div",5)(1,"img",10),T("load",function(n){G(A);let o=p(3);return K(o.onImageLoad(n))})("click",function(n){G(A),p(2);let o=xn(0);return p().openImageViewer(o),K(n.stopPropagation())}),E(),lA(2,"div",11),E()}if(i&2){p(2);let A=xn(0),t=p();u(),H("src",A,so),u(),H("ngStyle",t.getClickBoxStyle())}}function E6A(i,e){if(i&1){let A=rA();d(0,"div",3),T("click",function(){G(A);let n=p(2);return K(n.clickEvent.emit(n.index))}),d(1,"div",4),Y(2,d6A,9,3)(3,B6A,3,2,"div",5),E()()}if(i&2){p();let A=xn(1);xA("dual-images",!!A),u(2),O(A?2:3)}}function h6A(i,e){if(i&1){let A=rA();d(0,"div",14),T("click",function(){G(A);let n=p(2);return K(n.clickEvent.emit(n.index))}),d(1,"div",6)(2,"mat-icon",12),y(3,"image_not_supported"),E(),d(4,"span",13),y(5,"No screenshot"),E()()()}}function Q6A(i,e){if(i&1&&(Uo(0)(1),Y(2,E6A,4,3,"div",1)(3,h6A,6,0,"div",2)),i&2){let A=p(),t=Wo(A.getPreviousComputerUseScreenshot());u();let n=Wo(A.getNextComputerUseScreenshot());u(),O(t||n?2:3)}}function u6A(i,e){if(i&1){let A=rA();d(0,"div",15),T("click",function(){G(A);let n=p();return K(n.clickEvent.emit(n.index))}),d(1,"div",16)(2,"span",17),y(3),E()(),lA(4,"img",18),d(5,"div",19)(6,"mat-icon",20),y(7,"computer"),E(),d(8,"span",21),y(9),E()()()}if(i&2){let A=p();u(3),iA(A.functionResponse.name),u(),H("src",A.getComputerUseScreenshot(),so),u(5),iA(A.getComputerUseUrl())}}var m5=class i{functionCall;functionResponse;allMessages=[];index=0;clickEvent=new LA;openImage=new LA;imageDimensions=new Map;VIRTUAL_WIDTH=1e3;VIRTUAL_HEIGHT=1e3;isComputerUseResponse(){return!!this.functionResponse&&h0(this.functionResponse)}isComputerUseClick(){return!!this.functionCall&&ih(this.functionCall)}getComputerUseScreenshot(){return this.getScreenshotFromPayload(this.functionResponse?.response)}getComputerUseUrl(){return this.isComputerUseResponse()&&(this.functionResponse?.response).url||""}getPreviousComputerUseScreenshot(){for(let e=this.index-1;e>=0;e--){let A=this.allMessages[e];if(this.isMsgComputerUseResponse(A)&&A.functionResponses&&A.functionResponses.length>0)for(let t=A.functionResponses.length-1;t>=0;t--){let n=A.functionResponses[t];if(h0(n)){let a=n.response;return this.getScreenshotFromPayload(a)}let o=n.parts;if(Array.isArray(o))for(let a=o.length-1;a>=0;a--){let r=o[a];if(r.inlineData?.mimeType?.startsWith("image/")&&r.inlineData.data){let s=r.inlineData.mimeType,l=r.inlineData.data.replace(/-/g,"+").replace(/_/g,"/");return`data:${s};base64,${l}`}}}}return""}getNextComputerUseScreenshot(){for(let e=this.index+1;e0)for(let t=0;t0?e.functionResponses.some(A=>{if(h0(A))return!0;let t=A.parts;return Array.isArray(t)?t.some(n=>n.inlineData?.mimeType?.startsWith("image/")):!1}):!1}getScreenshotFromPayload(e){let A=e?.image;if(!A?.data)return"";let t=A.data;return t.startsWith("data:")?t:`data:${A.mimetype||"image/png"};base64,${t}`}getAllComputerUseScreenshots(){let e=[];for(let A of this.allMessages)if(this.isMsgComputerUseResponse(A)&&A.functionResponses)for(let t of A.functionResponses){if(h0(t)){let o=t.response;e.push(this.getScreenshotFromPayload(o))}let n=t.parts;if(Array.isArray(n)){for(let o of n)if(o.inlineData?.mimeType?.startsWith("image/")&&o.inlineData.data){let a=o.inlineData.mimeType,r=o.inlineData.data.replace(/-/g,"+").replace(/_/g,"/");e.push(`data:${a};base64,${r}`)}}}return e}getAllComputerUseUrls(){let e=[],A="";for(let t of this.allMessages)if(this.isMsgComputerUseResponse(t)&&t.functionResponses)for(let n of t.functionResponses){let o=n.response?.url;o&&(A=o),h0(n)&&e.push(A);let a=n.parts;if(Array.isArray(a))for(let r of a)r.inlineData?.mimeType?.startsWith("image/")&&r.inlineData.data&&e.push(A)}return e}getAllComputerUseCoordinates(){let e=[],A=null;for(let t of this.allMessages){let n=t.functionCalls;if(Array.isArray(n))for(let o of n)ih(o)?A=o:o.name==="computer"&&(A=null);if(this.isMsgComputerUseResponse(t)&&t.functionResponses)for(let o of t.functionResponses){let a=!1;h0(o)&&(a=!0);let r=o.parts;if(Array.isArray(r))for(let s of r)s.inlineData?.mimeType?.startsWith("image/")&&s.inlineData.data&&(a=!0);a&&(A&&e.length>0&&(e[e.length-1]=this.getClickCoordinates(A)),e.push(null))}}return e}openImageViewer(e){let A=this.getAllComputerUseScreenshots(),t=this.getAllComputerUseUrls(),n=this.getAllComputerUseCoordinates(),o=A.indexOf(e);this.openImage.emit({images:A,currentIndex:o,urls:t,coordinates:n})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-computer-action"]],inputs:{functionCall:"functionCall",functionResponse:"functionResponse",allMessages:"allMessages",index:"index"},outputs:{clickEvent:"clickEvent",openImage:"openImage"},decls:2,vars:1,consts:[[1,"computer-use-container"],[1,"computer-use-container","click-visualization-container",3,"dual-images"],[1,"computer-use-container","click-visualization-container","fallback"],[1,"computer-use-container","click-visualization-container",3,"click"],[1,"images-wrapper-flex"],[1,"image-wrapper"],[1,"image-wrapper","fallback-image"],[1,"arrow-container"],[1,"action-name-above"],["alt","Next Screenshot",1,"computer-use-screenshot",3,"click","src"],["alt","Computer Use Screenshot",1,"computer-use-screenshot",3,"load","click","src"],[1,"click-overlay-box",3,"ngStyle"],[1,"missing-icon"],[1,"fallback-text"],[1,"computer-use-container","click-visualization-container","fallback",3,"click"],[1,"computer-use-container",3,"click"],[1,"computer-use-header"],[1,"computer-use-tool-name"],["alt","Computer Use Screenshot",1,"computer-use-screenshot",3,"src"],[1,"computer-use-footprint"],[1,"computer-icon"],[1,"url-text"]],template:function(A,t){A&1&&Y(0,Q6A,4,3)(1,u6A,10,3,"div",0),A&2&&O(t.isComputerUseClick()?0:t.isComputerUseResponse()?1:-1)},dependencies:[si,nd,On,zt,Ra],styles:['[_nghost-%COMP%]{display:block}.computer-use-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;border-radius:12px;border:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color);overflow:hidden;cursor:pointer;margin:5px 5px 10px;transition:opacity .2s}.computer-use-container[_ngcontent-%COMP%]:hover{opacity:.9}.computer-use-tool-name[_ngcontent-%COMP%]{font-size:12px;font-family:monospace;font-weight:600;color:var(--chat-panel-input-field-textarea-color);opacity:.9;padding:12px}.computer-use-tool-name[_ngcontent-%COMP%] .actual-pixels[_ngcontent-%COMP%]{opacity:.6;margin-left:8px;font-weight:400}.computer-use-screenshot[_ngcontent-%COMP%]{width:100%;height:auto;display:block;border-bottom:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color)}.computer-use-footprint[_ngcontent-%COMP%]{display:flex;align-items:center;padding:8px 12px;gap:8px}.computer-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0}.url-text[_ngcontent-%COMP%]{font-size:11px;font-family:monospace;white-space:normal;word-break:break-all;color:var(--chat-panel-input-field-textarea-color);opacity:.8;min-width:0}.image-wrapper[_ngcontent-%COMP%]{position:relative;width:100%}.images-wrapper-flex[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:580px;gap:12px}.images-wrapper-flex[_ngcontent-%COMP%] .image-wrapper[_ngcontent-%COMP%]{flex:1;min-width:0}.images-wrapper-flex[_ngcontent-%COMP%] .image-wrapper[_ngcontent-%COMP%] .computer-use-screenshot[_ngcontent-%COMP%]{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;border-radius:8px}.arrow-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--chat-panel-input-field-textarea-color);opacity:.8;gap:4px}.arrow-container[_ngcontent-%COMP%] .action-name-above[_ngcontent-%COMP%]{font-size:11px;font-family:monospace;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:80px}.arrow-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:32px;width:32px;height:32px}.fallback-image[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high, #e0e0e0);width:240px;height:120px;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--chat-panel-input-field-textarea-color);opacity:.7}.fallback-image[_ngcontent-%COMP%] .missing-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px}.fallback-image[_ngcontent-%COMP%] .fallback-text[_ngcontent-%COMP%]{font-size:14px;font-weight:500}.click-overlay-box[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;border:1px solid rgba(255,255,255,.8);border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 4px #00000080;pointer-events:none;display:flex;align-items:center;justify-content:center}.click-overlay-box[_ngcontent-%COMP%]:before{content:"";width:2px;height:2px;border-radius:50%;box-shadow:0 0 2px #fff}.click-overlay-box[_ngcontent-%COMP%]:after{content:"";position:absolute;width:100%;height:100%;border-radius:50%}']})};function p6A(i,e){if(i&1&&(d(0,"mat-icon"),y(1),E()),i&2){let A=p();u(),iA(A.icon)}}var w5=class i{icon="";text="";tooltipContent=null;tooltipTitle="";disabled=!1;buttonClick=new LA;handleClick(e){this.buttonClick.emit(e)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-hover-info-button"]],inputs:{icon:"icon",text:"text",tooltipContent:"tooltipContent",tooltipTitle:"tooltipTitle",disabled:"disabled"},outputs:{buttonClick:"buttonClick"},decls:3,vars:7,consts:[["mat-stroked-button","",1,"hover-info-button",3,"click","appJsonTooltip","appJsonTooltipTitle","disabled"]],template:function(A,t){A&1&&(d(0,"button",0),T("click",function(o){return t.handleClick(o)}),Y(1,p6A,2,1,"mat-icon"),y(2),E()),A&2&&(xA("icon-only",!t.text),H("appJsonTooltip",t.tooltipContent)("appJsonTooltipTitle",t.tooltipTitle)("disabled",t.disabled),u(),O(t.icon?1:-1),u(),Be(" ",t.text,` +`))},dependencies:[si,Wi,Si,On,zt,$2],styles:[`.hover-info-button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)!important;background-color:var(--mat-sys-surface-container-high)!important;border-color:transparent!important;margin:5px 5px 5px 0;font-size:11px!important;padding:6px 12px!important;min-height:24px!important;height:24px!important;border-radius:8px!important;font-family:Roboto Mono,monospace!important;max-width:300px;text-align:left;display:inline-flex;align-items:center}.hover-info-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px!important;width:18px!important;height:18px!important;margin-right:6px!important;color:var(--mat-sys-on-surface)!important}.hover-info-button.icon-only[_ngcontent-%COMP%]{padding:0!important;min-width:24px!important;width:24px!important;justify-content:center}.hover-info-button.icon-only[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:-8px!important}.hover-info-button.icon-only[_ngcontent-%COMP%] .mdc-button__label[_ngcontent-%COMP%]{display:none!important}[_nghost-%COMP%] .hover-info-button{background-color:var(--mat-sys-surface-container-high)!important;color:var(--mat-sys-on-surface)!important}[_nghost-%COMP%] .hover-info-button .mdc-button__label{overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important} + + + + + + + + + + + + + + + + +`]})};var fZ=(i,e)=>e.key;function f6A(i,e){if(i&1){let A=rA();d(0,"div",7)(1,"div",11),T("click",function(){G(A);let n=p(3);return K(n.setActiveTab("form"))}),y(2,"Form"),E(),d(3,"div",11),T("click",function(){G(A);let n=p(3);return K(n.setActiveTab("json"))}),y(4,"JSON"),E(),d(5,"div",11),T("click",function(){G(A);let n=p(3);return K(n.setActiveTab("payload"))}),y(6,"Payload"),E(),d(7,"div",11),T("click",function(){G(A);let n=p(3);return K(n.setActiveTab("response schema"))}),y(8,"Schema"),E()()}if(i&2){let A=p(3);u(),xA("active",A.activeTab==="form"),u(2),xA("active",A.activeTab==="json"),u(2),xA("active",A.activeTab==="payload"),u(2),xA("active",A.activeTab==="response schema")}}function m6A(i,e){if(i&1){let A=rA();d(0,"div",9)(1,"div",12),y(2),E(),d(3,"div",13)(4,"div",14),y(5,"Payload"),E(),lA(6,"app-custom-json-viewer",15),E(),d(7,"div",16)(8,"div",17)(9,"label",18)(10,"input",19),yi("ngModelChange",function(n){G(A);let o=p(3);return hi(o.confirmationModel.confirmed,n)||(o.confirmationModel.confirmed=n),K(n)}),E(),d(11,"span"),y(12,"Confirmed"),E()()(),d(13,"button",20),T("click",function(){G(A);let n=p(3);return K(n.onSend())}),y(14," Submit "),E()()()}if(i&2){let A=p(3);u(2),Be(" ",A.functionCall.args==null||A.functionCall.args.toolConfirmation==null?null:A.functionCall.args.toolConfirmation.hint," "),u(4),H("json",A.functionCall.args==null||A.functionCall.args.originalFunctionCall==null?null:A.functionCall.args.originalFunctionCall.args),u(4),H("id",fh("confirmed-checkbox-",A.functionCall.id)),Di("ngModel",A.confirmationModel.confirmed)}}function w6A(i,e){i&1&&y(0," *")}function D6A(i,e){if(i&1&&(d(0,"div",28),y(1),E()),i&2){let A=p(2).$implicit;u(),iA(A.description)}}function y6A(i,e){if(i&1){let A=rA();d(0,"input",27),yi("ngModelChange",function(n){G(A);let o=p().$implicit,a=p(5);return hi(a.formModel[o.key],n)||(a.formModel[o.key]=n),K(n)}),E(),Y(1,D6A,2,1,"div",28)}if(i&2){let A=p().$implicit,t=p(5);H("id",A.key),Di("ngModel",t.formModel[A.key]),u(),O(A.description?1:-1)}}function v6A(i,e){if(i&1){let A=rA();d(0,"input",31),yi("ngModelChange",function(n){G(A);let o=p(2).$implicit,a=p(5);return hi(a.formModel[o.key],n)||(a.formModel[o.key]=n),K(n)}),E()}if(i&2){let A=p(2).$implicit,t=p(5);H("id",A.key),Di("ngModel",t.formModel[A.key])}}function b6A(i,e){if(i&1){let A=rA();d(0,"input",32),yi("ngModelChange",function(n){G(A);let o=p(2).$implicit,a=p(5);return hi(a.formModel[o.key],n)||(a.formModel[o.key]=n),K(n)}),E()}if(i&2){let A=p(2).$implicit,t=p(5);H("id",A.key),Di("ngModel",t.formModel[A.key])}}function M6A(i,e){if(i&1&&(d(0,"div",28),y(1),E()),i&2){let A=p(2).$implicit;u(),iA(A.description)}}function S6A(i,e){if(i&1&&(Y(0,v6A,1,2,"input",29)(1,b6A,1,2,"input",30),Y(2,M6A,2,1,"div",28)),i&2){let A=p().$implicit;O(A.type==="number"||A.type==="integer"?0:1),u(2),O(A.description?2:-1)}}function k6A(i,e){if(i&1&&(d(0,"div",25),y(1),Y(2,w6A,1,0),E(),d(3,"div",26),Y(4,y6A,2,3)(5,S6A,3,2),E()),i&2){let A=e.$implicit;u(),Be(" ",A.title),u(),O(A.required?2:-1),u(2),O(A.type==="boolean"?4:5)}}function _6A(i,e){if(i&1){let A=rA();d(0,"div",21),xe(1,k6A,6,3,null,null,fZ),d(3,"div",23)(4,"button",24),T("click",function(){G(A);let n=p(4);return K(n.onSend())}),y(5," Submit "),E()()()}if(i&2){let A=p(4);u(),Re(A.formFields)}}function x6A(i,e){if(i&1){let A=rA();d(0,"div",22)(1,"textarea",33),yi("ngModelChange",function(n){G(A);let o=p(4);return hi(o.formModelJson,n)||(o.formModelJson=n),K(n)}),T("ngModelChange",function(n){G(A);let o=p(4);return K(o.onJsonInputChange(n))}),E()(),d(2,"div",23)(3,"button",24),T("click",function(){G(A);let n=p(4);return K(n.onSend())}),y(4," Submit "),E()()}if(i&2){let A=p(4);u(),Di("ngModel",A.formModelJson)}}function R6A(i,e){if(i&1&&(d(0,"div",22)(1,"pre"),y(2),E()()),i&2){let A=p(4);u(2),iA(A.getPayloadJson())}}function N6A(i,e){if(i&1&&(d(0,"div",22)(1,"pre"),y(2),E()()),i&2){let A=p(4);u(2),iA(A.getResponseSchemaJson())}}function F6A(i,e){if(i&1&&(d(0,"div",10),Y(1,_6A,6,0,"div",21)(2,x6A,5,1)(3,R6A,3,1,"div",22)(4,N6A,3,1,"div",22),E()),i&2){let A=p(3);u(),O(A.activeTab==="form"?1:A.activeTab==="json"?2:A.activeTab==="payload"?3:A.activeTab==="response schema"?4:-1)}}function L6A(i,e){if(i&1){let A=rA();d(0,"input",34),yi("ngModelChange",function(n){G(A);let o=p(3);return hi(o.functionCall.userResponse,n)||(o.functionCall.userResponse=n),K(n)}),T("keydown.enter",function(){G(A);let n=p(3);return K(n.onSend())}),E(),d(1,"button",35),T("click",function(){G(A);let n=p(3);return K(n.onSend())}),d(2,"mat-icon"),y(3,"send"),E()()}if(i&2){let A=p(3);Di("ngModel",A.functionCall.userResponse),u(),H("disabled",!A.functionCall.userResponse)}}function G6A(i,e){if(i&1&&(d(0,"div",2)(1,"div",4),lA(2,"app-markdown",5),E(),d(3,"div",6),Y(4,f6A,9,8,"div",7),d(5,"div",8),Y(6,m6A,15,5,"div",9)(7,F6A,5,1,"div",10)(8,L6A,4,2),E()()()),i&2){let A=p(2);u(2),H("text",A.getPromptText()),u(2),O(A.formFields.length>0?4:-1),u(2),O(A.isConfirmationRequest?6:A.formFields.length>0?7:8)}}function K6A(i,e){if(i&1){let A=rA();d(0,"div",7)(1,"div",11),T("click",function(){G(A);let n=p(3);return K(n.setActiveTab("form"))}),y(2,"Form"),E(),d(3,"div",11),T("click",function(){G(A);let n=p(3);return K(n.setActiveTab("json"))}),y(4,"JSON"),E(),d(5,"div",11),T("click",function(){G(A);let n=p(3);return K(n.setActiveTab("payload"))}),y(6,"Payload"),E(),d(7,"div",11),T("click",function(){G(A);let n=p(3);return K(n.setActiveTab("response schema"))}),y(8,"Schema"),E()()}if(i&2){let A=p(3);u(),xA("active",A.activeTab==="form"),u(2),xA("active",A.activeTab==="json"),u(2),xA("active",A.activeTab==="payload"),u(2),xA("active",A.activeTab==="response schema")}}function U6A(i,e){if(i&1){let A=rA();d(0,"div",9)(1,"div",12),y(2),E(),d(3,"div",13)(4,"div",14),y(5,"Payload"),E(),lA(6,"app-custom-json-viewer",15),E(),d(7,"div",16)(8,"div",17)(9,"label",18)(10,"input",19),yi("ngModelChange",function(n){G(A);let o=p(3);return hi(o.confirmationModel.confirmed,n)||(o.confirmationModel.confirmed=n),K(n)}),E(),d(11,"span"),y(12,"Confirmed"),E()()(),d(13,"button",20),T("click",function(){G(A);let n=p(3);return K(n.onSend())}),y(14," Submit "),E()()()}if(i&2){let A=p(3);u(2),Be(" ",A.functionCall.args==null||A.functionCall.args.toolConfirmation==null?null:A.functionCall.args.toolConfirmation.hint," "),u(4),H("json",A.functionCall.args==null||A.functionCall.args.originalFunctionCall==null?null:A.functionCall.args.originalFunctionCall.args),u(4),H("id",fh("confirmed-checkbox-standalone-",A.functionCall.id)),Di("ngModel",A.confirmationModel.confirmed)}}function T6A(i,e){i&1&&y(0," *")}function J6A(i,e){if(i&1&&(d(0,"div",28),y(1),E()),i&2){let A=p(2).$implicit;u(),iA(A.description)}}function Y6A(i,e){if(i&1){let A=rA();d(0,"input",27),yi("ngModelChange",function(n){G(A);let o=p().$implicit,a=p(5);return hi(a.formModel[o.key],n)||(a.formModel[o.key]=n),K(n)}),E(),Y(1,J6A,2,1,"div",28)}if(i&2){let A=p().$implicit,t=p(5);H("id",A.key),Di("ngModel",t.formModel[A.key]),u(),O(A.description?1:-1)}}function O6A(i,e){if(i&1){let A=rA();d(0,"input",31),yi("ngModelChange",function(n){G(A);let o=p(2).$implicit,a=p(5);return hi(a.formModel[o.key],n)||(a.formModel[o.key]=n),K(n)}),E()}if(i&2){let A=p(2).$implicit,t=p(5);H("id",A.key),Di("ngModel",t.formModel[A.key])}}function H6A(i,e){if(i&1){let A=rA();d(0,"input",32),yi("ngModelChange",function(n){G(A);let o=p(2).$implicit,a=p(5);return hi(a.formModel[o.key],n)||(a.formModel[o.key]=n),K(n)}),E()}if(i&2){let A=p(2).$implicit,t=p(5);H("id",A.key),Di("ngModel",t.formModel[A.key])}}function z6A(i,e){if(i&1&&(d(0,"div",28),y(1),E()),i&2){let A=p(2).$implicit;u(),iA(A.description)}}function P6A(i,e){if(i&1&&(Y(0,O6A,1,2,"input",29)(1,H6A,1,2,"input",30),Y(2,z6A,2,1,"div",28)),i&2){let A=p().$implicit;O(A.type==="number"||A.type==="integer"?0:1),u(2),O(A.description?2:-1)}}function j6A(i,e){if(i&1&&(d(0,"div",25),y(1),Y(2,T6A,1,0),E(),d(3,"div",26),Y(4,Y6A,2,3)(5,P6A,3,2),E()),i&2){let A=e.$implicit;u(),Be(" ",A.title),u(),O(A.required?2:-1),u(2),O(A.type==="boolean"?4:5)}}function q6A(i,e){if(i&1){let A=rA();d(0,"div",21),xe(1,j6A,6,3,null,null,fZ),d(3,"div",23)(4,"button",24),T("click",function(){G(A);let n=p(4);return K(n.onSend())}),y(5," Submit "),E()()()}if(i&2){let A=p(4);u(),Re(A.formFields)}}function V6A(i,e){if(i&1){let A=rA();d(0,"div",22)(1,"textarea",33),yi("ngModelChange",function(n){G(A);let o=p(4);return hi(o.formModelJson,n)||(o.formModelJson=n),K(n)}),T("ngModelChange",function(n){G(A);let o=p(4);return K(o.onJsonInputChange(n))}),E()(),d(2,"div",23)(3,"button",24),T("click",function(){G(A);let n=p(4);return K(n.onSend())}),y(4," Submit "),E()()}if(i&2){let A=p(4);u(),Di("ngModel",A.formModelJson)}}function W6A(i,e){if(i&1&&(d(0,"div",22)(1,"pre"),y(2),E()()),i&2){let A=p(4);u(2),iA(A.getPayloadJson())}}function Z6A(i,e){if(i&1&&(d(0,"div",22)(1,"pre"),y(2),E()()),i&2){let A=p(4);u(2),iA(A.getResponseSchemaJson())}}function X6A(i,e){if(i&1&&(d(0,"div",10),Y(1,q6A,6,0,"div",21)(2,V6A,5,1)(3,W6A,3,1,"div",22)(4,Z6A,3,1,"div",22),E()),i&2){let A=p(3);u(),O(A.activeTab==="form"?1:A.activeTab==="json"?2:A.activeTab==="payload"?3:A.activeTab==="response schema"?4:-1)}}function $6A(i,e){if(i&1){let A=rA();d(0,"input",34),yi("ngModelChange",function(n){G(A);let o=p(3);return hi(o.functionCall.userResponse,n)||(o.functionCall.userResponse=n),K(n)}),T("keydown.enter",function(){G(A);let n=p(3);return K(n.onSend())}),E(),d(1,"button",35),T("click",function(){G(A);let n=p(3);return K(n.onSend())}),d(2,"mat-icon"),y(3,"send"),E()()}if(i&2){let A=p(3);Di("ngModel",A.functionCall.userResponse),u(),H("disabled",!A.functionCall.userResponse)}}function A8A(i,e){if(i&1&&(d(0,"div",3),Y(1,K6A,9,8,"div",7),d(2,"div",8),Y(3,U6A,15,5,"div",9)(4,X6A,5,1,"div",10)(5,$6A,4,2),E()()),i&2){let A=p(2);u(),O(A.formFields.length>0?1:-1),u(2),O(A.isConfirmationRequest?3:A.formFields.length>0?4:5)}}function e8A(i,e){if(i&1&&(d(0,"div",1),T("click",function(t){return t.stopPropagation()}),Y(1,G6A,9,3,"div",2)(2,A8A,6,2,"div",3),E()),i&2){let A=p();u(),O(A.hasMessage()?1:2)}}var D5=class i{functionCall;appName;userId;sessionId;responseComplete=new LA;formModel={};formFields=[];activeTab="form";formModelJson="";confirmationModel={confirmed:!1,payload:""};get isConfirmationRequest(){return this.functionCall?.name==="adk_request_confirmation"}cdr=w(wt);ngOnChanges(e){e.functionCall&&this.initForm()}initForm(){if(this.formModel={},this.formFields=[],this.isConfirmationRequest){this.confirmationModel.confirmed=this.functionCall.args?.toolConfirmation?.confirmed||!1,this.confirmationModel.payload=JSON.stringify(this.functionCall.args?.originalFunctionCall?.args||{},null,2);return}let e=this.functionCall?.args?.response_schema;if(e&&e.type==="object"&&e.properties)for(let A of Object.keys(e.properties)){let t=e.properties[A],n=t.type;if(!n&&t.anyOf){let o=t.anyOf.find(a=>a.type!=="null");o&&(n=o.type)}this.formFields.push({key:A,type:n,title:t.title||A,description:t.description||"",required:e.required?.includes(A)||!1}),n==="boolean"?this.formModel[A]=!1:n==="number"||n==="integer"?this.formModel[A]=null:this.formModel[A]=""}}getCleanedFormModel(){let e=this.functionCall?.args?.response_schema;if(!e||e.type!=="object"||!e.properties)return this.formModel;let A=oA({},this.formModel);for(let t of Object.keys(e.properties)){let n=e.properties[t],o=A[t];if(o!=null&&o!==""){let a=n.type;if(!a&&n.anyOf){let r=n.anyOf.find(s=>s.type!=="null");r&&(a=r.type)}a==="integer"?A[t]=parseInt(o,10):a==="number"&&(A[t]=parseFloat(o))}else A[t]=null}return A}updateFormModelJson(){this.formModelJson=JSON.stringify(this.getCleanedFormModel(),null,2)}onJsonInputChange(e){try{let A=JSON.parse(e);this.formModel=A}catch(A){}}setActiveTab(e){this.activeTab=e,e==="json"&&this.updateFormModelJson()}hasMessage(){return!!(this.functionCall.args?.prompt||this.functionCall.args?.message)}getPromptText(){return this.functionCall.args?.prompt||this.functionCall.args?.message||"Please provide your response"}hasPayload(){return this.functionCall.args?.payload!==void 0&&this.functionCall.args?.payload!==null}getPayloadJson(){try{return JSON.stringify(this.functionCall.args?.payload||{},null,2)}catch(e){return""}}hasResponseSchema(){return!!this.functionCall.args?.response_schema}getResponseSchemaJson(){try{return JSON.stringify(this.functionCall.args?.response_schema||{},null,2)}catch(e){return""}}onSend(){if(this.isConfirmationRequest){let o={};try{o=JSON.parse(this.confirmationModel.payload)}catch(s){o=this.functionCall.args?.originalFunctionCall?.args||{}}let a={confirmed:this.confirmationModel.confirmed,payload:o};this.functionCall.responseStatus="sent",this.cdr.detectChanges();let r={role:"user",parts:[{functionResponse:{id:this.functionCall.id,name:this.functionCall.name,response:a}}],functionCallEventId:this.functionCall.functionCallEventId};this.responseComplete.emit(r);return}let e,A=this.functionCall?.args?.response_schema;if(A&&A.type==="object"&&A.properties&&this.formFields.length>0){let o=this.getCleanedFormModel();e=o,this.functionCall.userResponse=JSON.stringify(o),this.functionCall.sentUserResponse=this.functionCall.userResponse}else{if(!this.functionCall.userResponse||!this.functionCall.userResponse.trim())return;this.functionCall.sentUserResponse=this.functionCall.userResponse;try{let o=JSON.parse(this.functionCall.userResponse);typeof o=="object"&&o!==null?e=o:e={result:this.functionCall.userResponse}}catch(o){e={result:this.functionCall.userResponse}}}this.functionCall.responseStatus="sent",this.cdr.detectChanges();let n={role:"user",parts:[{functionResponse:{id:this.functionCall.id,name:this.functionCall.name,response:e}}],functionCallEventId:this.functionCall.functionCallEventId};this.responseComplete.emit(n)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-long-running-response"]],inputs:{functionCall:"functionCall",appName:"appName",userId:"userId",sessionId:"sessionId"},outputs:{responseComplete:"responseComplete"},features:[Zt],decls:1,vars:1,consts:[[1,"response-chip-container"],[1,"response-chip-container",3,"click"],[1,"message-box"],[1,"request-card-standalone"],[1,"message-content"],[3,"text"],[1,"request-card"],[1,"tabs-header"],[1,"input-container"],[1,"confirmation-container",2,"width","100%"],[1,"tabs-content"],[1,"tab-link",3,"click"],[1,"confirmation-hint",2,"margin-bottom","10px","font-size","13px","font-weight","600","color","var(--mat-sys-on-surface)"],[1,"confirmation-payload",2,"margin-bottom","10px"],[1,"field-label",2,"margin-bottom","5px","font-size","12px","font-weight","500","color","var(--mat-sys-on-surface-variant)"],[3,"json"],[1,"confirmation-footer",2,"display","flex","justify-content","space-between","align-items","center","margin-top","10px"],[1,"confirmation-checkbox",2,"font-size","12px"],[2,"display","flex","align-items","center","gap","6px","cursor","pointer"],["type","checkbox",2,"cursor","pointer",3,"ngModelChange","id","ngModel"],["mat-raised-button","","color","primary",1,"form-submit-button",2,"margin-top","0",3,"click"],[1,"schema-form","grid-layout"],[1,"json-view"],[1,"grid-submit"],["mat-raised-button","","color","primary",1,"form-submit-button",3,"click"],[1,"grid-label"],[1,"grid-value"],["type","checkbox",3,"ngModelChange","id","ngModel"],[1,"field-description"],["type","number",1,"form-input",3,"id","ngModel"],["type","text",1,"form-input",3,"id","ngModel"],["type","number",1,"form-input",3,"ngModelChange","id","ngModel"],["type","text",1,"form-input",3,"ngModelChange","id","ngModel"],[1,"json-textarea",3,"ngModelChange","ngModel"],["placeholder","Enter your response...",1,"response-input",3,"ngModelChange","keydown.enter","ngModel"],["mat-icon-button","",1,"send-button",3,"click","disabled"]],template:function(A,t){A&1&&Y(0,e8A,3,1,"div",0),A&2&&O(t.functionCall.responseStatus!=="sent"&&t.functionCall.responseStatus!=="sending"?0:-1)},dependencies:[cn,yn,Nh,qD,vn,_o,vi,Si,zt,Z2,sl],styles:["[_nghost-%COMP%]{display:block}.response-chip-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;margin:5px 5px 5px 0}.message-box[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high);border:1px solid var(--mat-sys-outline-variant);border-radius:20px;padding:12px 16px;box-shadow:none;display:flex;flex-direction:column;gap:12px}.message-content[_ngcontent-%COMP%]{flex:1;font-size:12px}.request-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;width:100%}.request-card-standalone[_ngcontent-%COMP%]{background:color-mix(in srgb,var(--mat-sys-surface-container-high) 70%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid color-mix(in srgb,var(--mat-sys-outline-variant) 30%,transparent);border-radius:12px;padding:12px;box-shadow:0 4px 16px #0003;display:flex;flex-direction:column;gap:8px;max-width:400px}.data-buttons[_ngcontent-%COMP%]{display:flex;gap:8px}.input-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;width:100%}.input-container[_ngcontent-%COMP%] .response-input[_ngcontent-%COMP%]{flex:1;border:1px solid var(--mat-sys-outline-variant);border-radius:4px;padding:4px 8px;background:var(--mat-sys-surface-container);outline:none;font-size:12px;font-family:inherit;color:var(--mat-sys-on-surface);caret-color:var(--mat-sys-primary)}.input-container[_ngcontent-%COMP%] .response-input[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant);opacity:.6}.input-container[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%]{color:var(--mat-sys-primary);width:24px;height:24px;min-width:24px;padding:0;line-height:24px;box-sizing:border-box}.input-container[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-on-surface-variant);opacity:.3}.input-container[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}.tabs-header[_ngcontent-%COMP%]{display:flex;gap:8px;border-bottom:1px solid var(--mat-sys-outline-variant);margin-bottom:8px;padding-bottom:4px}.tab-link[_ngcontent-%COMP%]{font-size:11px;font-weight:500;color:var(--mat-sys-on-surface-variant);cursor:pointer;padding:2px 6px;border-radius:4px}.tab-link[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-high)}.tab-link.active[_ngcontent-%COMP%]{color:var(--mat-sys-primary);background:var(--mat-sys-primary-container)}.tabs-content[_ngcontent-%COMP%]{width:100%}.json-view[_ngcontent-%COMP%]{padding:4px 0;max-height:200px;overflow:auto}.json-view[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{margin:0;font-size:10px;font-family:monospace;color:var(--mat-sys-on-surface)}.json-view[_ngcontent-%COMP%] .json-textarea[_ngcontent-%COMP%]{width:100%;height:150px;margin:0;font-size:10px;font-family:monospace;color:var(--mat-sys-on-surface);background:transparent;border:1px solid var(--mat-sys-outline-variant);border-radius:4px;padding:4px;resize:vertical;box-sizing:border-box}.json-view[_ngcontent-%COMP%] .json-textarea[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--mat-sys-primary)}.schema-form.grid-layout[_ngcontent-%COMP%]{display:grid;grid-template-columns:max-content 1fr;gap:4px 8px;align-items:start;width:100%;padding:4px 2px}.grid-label[_ngcontent-%COMP%]{font-size:11px;font-weight:500;color:var(--mat-sys-on-surface);text-align:right;white-space:nowrap;padding-top:6px}.grid-value[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px;width:100%}.grid-value[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%]{width:100%;border:1px solid var(--mat-sys-outline-variant);border-radius:4px;padding:4px 6px;font-size:11px;background:var(--mat-sys-surface-container);color:var(--mat-sys-on-surface);box-sizing:border-box;height:28px}.grid-value[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--mat-sys-primary)}.grid-value[_ngcontent-%COMP%] input[type=checkbox][_ngcontent-%COMP%]{margin:4px 0;align-self:flex-start}.field-description[_ngcontent-%COMP%]{font-size:10px;color:var(--mat-sys-on-surface-variant);opacity:.8}.grid-submit[_ngcontent-%COMP%]{grid-column:1/-1;display:flex;justify-content:flex-end;margin-top:4px}.form-submit-button[_ngcontent-%COMP%]{align-self:flex-end;margin-top:2px;height:28px!important;line-height:28px!important;font-size:11px!important}"]})};function t8A(i,e){if(i&1&&lA(0,"a2ui-surface",0),i&2){let A=p();H("surfaceId",A.surfaceId())("surface",A.surface())}}var y5=class i{processor=w(vR);beginRendering=null;surfaceUpdate=null;dataModelUpdate=null;surfaceId=mA(null);activeSurface=mA(null);surface=me(()=>this.activeSurface());constructor(){}ngOnChanges(e){let A=[],t=null;e.beginRendering&&this.beginRendering&&Object.keys(this.beginRendering).length>0&&(A.push(this.beginRendering),t=this.beginRendering?.beginRendering?.surfaceId??t),e.surfaceUpdate&&this.surfaceUpdate&&Object.keys(this.surfaceUpdate).length>0&&(A.push(this.surfaceUpdate),t=this.surfaceUpdate?.surfaceUpdate?.surfaceId??t),e.dataModelUpdate&&this.dataModelUpdate&&Object.keys(this.dataModelUpdate).length>0&&(A.push(this.dataModelUpdate),t=this.dataModelUpdate?.dataModelUpdate?.surfaceId??t),A.length>0&&this.processor.processMessages(A),t&&this.surfaceId.set(t);let n=this.surfaceId();if(n){let o=this.processor.getSurfaces();o.has(n)&&this.activeSurface.set(o.get(n))}}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-a2ui-canvas"]],inputs:{beginRendering:"beginRendering",surfaceUpdate:"surfaceUpdate",dataModelUpdate:"dataModelUpdate"},features:[Zt],decls:1,vars:1,consts:[[3,"surfaceId","surface"]],template:function(A,t){A&1&&Y(0,t8A,1,2,"a2ui-surface",0),A&2&&O(t.surface()?0:-1)},dependencies:[si,SR],styles:["[_nghost-%COMP%]{display:block;height:100%;width:100%;overflow:auto}[_nghost-%COMP%] *{box-sizing:border-box}.canvas[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;padding:16px;box-sizing:border-box;min-height:100%}"],changeDetection:0})};var mZ=(i,e)=>({text:i,thought:e});function i8A(i,e){if(i&1&&(d(0,"div",1),y(1),E()),i&2){let A=p();u(),iA(A.type)}}function n8A(i,e){if(i&1&&lA(0,"img",8),i&2){let A=p().$implicit;H("src",A.url,so)}}function o8A(i,e){if(i&1&&(d(0,"a",9),y(1),E()),i&2){let A=p(2).$implicit;H("href",A.url,so),u(),iA(A.file.name)}}function a8A(i,e){if(i&1&&y(0),i&2){let A=p(2).$implicit;Be(" ",A.file.name," ")}}function r8A(i,e){if(i&1&&(d(0,"mat-icon"),y(1,"insert_drive_file"),E(),Y(2,o8A,2,2,"a",9)(3,a8A,1,1)),i&2){let A=p().$implicit;u(2),O(A.url?2:3)}}function s8A(i,e){if(i&1&&(d(0,"div",7),Y(1,n8A,1,1,"img",8),Y(2,r8A,4,1),E()),i&2){let A=e.$implicit;u(),O(A.file.type.startsWith("image/")?1:-1),u(),O(A.file.type.startsWith("image/")?-1:2)}}function l8A(i,e){if(i&1&&(d(0,"div",4),xe(1,s8A,3,2,"div",7,ni),E()),i&2){let A=p(2);u(),Re(A.uiEvent.attachments)}}function g8A(i,e){if(i&1&&(d(0,"div",5),gn(1,10),E()),i&2){let A=p(2);H("appJsonTooltip",A.jsonOutputData),u(),H("ngComponentOutlet",A.markdownComponent)("ngComponentOutletInputs",g1(3,mZ,A.uiEvent.text||A.rawMessageText,A.uiEvent.thought))}}function c8A(i,e){if(i&1){let A=rA();d(0,"div",12)(1,"textarea",13,0),T("ngModelChange",function(n){G(A);let o=p(4);return K(o.userEditEvalCaseMessageChange.emit(n))})("keydown",function(n){G(A);let o=p(4);return K(o.handleKeydown.emit({event:n,message:o.uiEvent}))}),E(),d(3,"div",14)(4,"span",15),T("click",function(){G(A);let n=p(4);return K(n.cancelEditMessage.emit(n.uiEvent))}),y(5," close "),E(),d(6,"span",16),T("click",function(){G(A);let n=p(4);return K(n.saveEditMessage.emit(n.uiEvent))}),y(7," check "),E()()()}if(i&2){let A=p(4);u(),H("ngModel",A.userEditEvalCaseMessage),u(3),H("matTooltip",A.i18n.cancelEditingTooltip),u(2),H("matTooltip",A.i18n.saveEvalMessageTooltip)}}function C8A(i,e){if(i&1&&gn(0,10),i&2){let A=p(4);H("ngComponentOutlet",A.markdownComponent)("ngComponentOutletInputs",g1(2,mZ,A.uiEvent.text,A.uiEvent.thought))}}function I8A(i,e){if(i&1&&Y(0,c8A,8,3,"div",12)(1,C8A,1,5,"ng-container",10),i&2){let A=p(3);O(A.uiEvent.isEditing?0:1)}}function d8A(i,e){if(i&1&&(d(0,"div"),lA(1,"div",17),E()),i&2){let A=p(3);u(),H("innerHTML",A.renderGooglerSearch(A.uiEvent.renderedContent),fc)}}function B8A(i,e){if(i&1&&lA(0,"app-a2ui-canvas",11),i&2){let A=p(3);H("beginRendering",A.uiEvent.a2uiData.beginRendering)("surfaceUpdate",A.uiEvent.a2uiData.surfaceUpdate)("dataModelUpdate",A.uiEvent.a2uiData.dataModelUpdate)}}function E8A(i,e){if(i&1&&(d(0,"div")(1,"div"),Y(2,I8A,2,1),E(),Y(3,d8A,2,1,"div"),Y(4,B8A,1,3,"app-a2ui-canvas",11),E()),i&2){let A=p(2);u(2),O(A.uiEvent.text?2:-1),u(),O(A.uiEvent.renderedContent?3:-1),u(),O(A.uiEvent.a2uiData?4:-1)}}function h8A(i,e){if(i&1&&(d(0,"code"),y(1),E()),i&2){let A=p(2);u(),Be(" ",A.uiEvent.executableCode.code," ")}}function Q8A(i,e){if(i&1&&(d(0,"div")(1,"div"),y(2),E(),d(3,"div"),y(4),E()()),i&2){let A=p(2);u(2),ya("",A.i18n.outcomeLabel,": ",A.uiEvent.codeExecutionResult.outcome),u(2),ya("",A.i18n.outputLabel,": ",A.uiEvent.codeExecutionResult.output)}}function u8A(i,e){if(i&1){let A=rA();d(0,"div",18)(1,"img",20),T("click",function(){G(A);let n=p(4);return K(n.openViewImageDialog.emit(n.uiEvent.inlineData.data))}),E()()}if(i&2){let A=p(4);u(),H("src",A.uiEvent.inlineData.data,so)}}function p8A(i,e){if(i&1&&(d(0,"div"),lA(1,"app-audio-player",21),E()),i&2){let A=p(4);u(),H("base64data",A.uiEvent.inlineData.data)}}function f8A(i,e){if(i&1&&(d(0,"div",19),lA(1,"video",22),E()),i&2){let A=p(4);u(),H("src",A.uiEvent.inlineData.data,so)}}function m8A(i,e){if(i&1){let A=rA();d(0,"div")(1,"div",24)(2,"mat-icon",25),y(3,"description"),E(),d(4,"a",26),T("click",function(){G(A);let n=p(5);return K(n.openBase64InNewTab.emit({data:n.uiEvent.inlineData.data,mimeType:n.uiEvent.inlineData.mimeType}))}),y(5),E()()()}if(i&2){let A=p(5);u(5),Be(" ",A.uiEvent.inlineData.name," ")}}function w8A(i,e){if(i&1&&(d(0,"div",23)(1,"pre",27),y(2),E()()),i&2){let A=p(5);u(2),iA(A.getTextContent(A.uiEvent.inlineData.data))}}function D8A(i,e){if(i&1&&Y(0,m8A,6,1,"div")(1,w8A,3,1,"div",23),i&2){let A=p(4);O(A.uiEvent.inlineData.mimeType==="text/html"?0:1)}}function y8A(i,e){if(i&1){let A=rA();d(0,"div")(1,"button",28),T("click",function(){G(A);let n=p(4);return K(n.openBase64InNewTab.emit({data:n.uiEvent.inlineData.data,mimeType:n.uiEvent.inlineData.mimeType}))}),y(2),E()()}if(i&2){let A=p(4);u(2),Be(" ",A.uiEvent.inlineData.name," ")}}function v8A(i,e){if(i&1&&(d(0,"div")(1,"div"),Y(2,u8A,2,1,"div",18)(3,p8A,2,1,"div")(4,f8A,2,1,"div",19)(5,D8A,2,1)(6,y8A,3,1,"div"),E()()),i&2){let A,t=p(3);u(2),O((A=t.uiEvent.inlineData.mediaType)===t.MediaType.IMAGE?2:A===t.MediaType.AUDIO?3:A===t.MediaType.VIDEO?4:A===t.MediaType.TEXT?5:6)}}function b8A(i,e){if(i&1){let A=rA();d(0,"div")(1,"img",29),T("click",function(){G(A);let n=p(4);return K(n.openViewImageDialog.emit(n.uiEvent.inlineData.data))}),E()()}if(i&2){let A=p(4);u(),H("src",A.uiEvent.inlineData.data,so)}}function M8A(i,e){if(i&1&&(d(0,"div",19),lA(1,"video",22),E()),i&2){let A=p(4);u(),H("src",A.uiEvent.inlineData.data,so)}}function S8A(i,e){if(i&1&&(d(0,"div",7)(1,"mat-icon"),y(2,"insert_drive_file"),E(),d(3,"a",9),y(4),E()()),i&2){let A=p(4);u(3),H("href",A.uiEvent.inlineData.data,so),u(),iA(A.uiEvent.inlineData.displayName)}}function k8A(i,e){if(i&1&&(d(0,"div"),Y(1,b8A,2,1,"div")(2,M8A,2,1,"div",19)(3,S8A,5,2,"div",7),E()),i&2){let A=p(3);u(),O(A.uiEvent.inlineData.mimeType.startsWith("image/")?1:A.uiEvent.inlineData.mimeType.startsWith("video/")?2:3)}}function _8A(i,e){if(i&1&&Y(0,v8A,7,1,"div")(1,k8A,4,1,"div"),i&2){let A=p(2);O(A.uiEvent.role==="bot"?0:1)}}function x8A(i,e){if(i&1&&(d(0,"div",30),lA(1,"app-audio-player",21),E()),i&2){let A=p(4);u(),H("base64data",A.audioUrl||"")}}function R8A(i,e){if(i&1&&Y(0,x8A,2,1,"div",30),i&2){let A=e.$implicit;O(A.fileData&&A.fileData.mimeType.startsWith("audio/")?0:-1)}}function N8A(i,e){if(i&1&&xe(0,R8A,1,1,null,null,ni),i&2){let A=p(2);Re(A.uiEvent.event==null||A.uiEvent.event.content==null?null:A.uiEvent.event.content.parts)}}function F8A(i,e){if(i&1&&(d(0,"div",33)(1,"div",34),y(2),E(),lA(3,"app-custom-json-viewer",35),E(),d(4,"div",36)(5,"div",37),y(6),E(),lA(7,"app-custom-json-viewer",35),E()),i&2){let A=p(3);u(2),iA(A.i18n.actualToolUsesLabel),u(),H("json",A.uiEvent.actualInvocationToolUses),u(3),iA(A.i18n.expectedToolUsesLabel),u(),H("json",A.uiEvent.expectedInvocationToolUses)}}function L8A(i,e){if(i&1&&(d(0,"div",33)(1,"div",34),y(2),E(),d(3,"div"),y(4),E()(),d(5,"div",36)(6,"div",37),y(7),E(),d(8,"div"),y(9),E()()),i&2){let A=p(3);u(2),iA(A.i18n.actualResponseLabel),u(2),iA(A.uiEvent.actualFinalResponse),u(3),iA(A.i18n.expectedResponseLabel),u(2),iA(A.uiEvent.expectedFinalResponse)}}function G8A(i,e){if(i&1&&(d(0,"div",32)(1,"span",38),y(2),E(),d(3,"span",39),y(4),E()()),i&2){let A=p(3);u(2),ya("",A.i18n.matchScoreLabel,": ",A.uiEvent.evalScore),u(2),ya("",A.i18n.thresholdLabel,": ",A.uiEvent.evalThreshold)}}function K8A(i,e){if(i&1&&(d(0,"div",6)(1,"div",31),Y(2,F8A,8,4)(3,L8A,10,4),E(),Y(4,G8A,5,4,"div",32),E()),i&2){let A=p(2);u(2),O(A.uiEvent.actualInvocationToolUses?2:A.uiEvent.actualFinalResponse?3:-1),u(2),O(A.uiEvent.evalScore!==void 0&&A.uiEvent.evalThreshold!==void 0?4:-1)}}function U8A(i,e){if(i&1&&(Y(0,l8A,3,0,"div",4),Y(1,g8A,2,6,"div",5)(2,E8A,5,3,"div"),Y(3,h8A,2,1,"code"),Y(4,Q8A,5,4,"div"),Y(5,_8A,2,1),Y(6,N8A,2,0),Y(7,K8A,5,2,"div",6)),i&2){let A=p();O(A.uiEvent.attachments?0:-1),u(),O(A.uiEvent.event.nodeInfo!=null&&A.uiEvent.event.nodeInfo.messageAsOutput?1:A.uiEvent.thought||A.uiEvent.text||A.uiEvent.renderedContent||A.uiEvent.a2uiData||A.uiEvent.event.inputTranscription||A.uiEvent.event.outputTranscription?2:-1),u(2),O(A.uiEvent.executableCode?3:-1),u(),O(A.uiEvent.codeExecutionResult?4:-1),u(),O(A.uiEvent.inlineData?5:-1),u(),O(!(A.uiEvent.event==null||A.uiEvent.event.content==null)&&A.uiEvent.event.content.parts?6:-1),u(),O(A.uiEvent.failedMetric&&A.uiEvent.evalStatus===2?7:-1)}}function T8A(i,e){if(i&1&&lA(0,"app-custom-json-viewer",2),i&2){let A=p();H("json",A.uiEvent.event.output)("appJsonTooltip",(A.uiEvent.event.nodeInfo==null?null:A.uiEvent.event.nodeInfo.outputFor)||A.uiEvent.nodePath)}}function J8A(i,e){if(i&1&&lA(0,"app-custom-json-viewer",3),i&2){let A=p();H("json",A.uiEvent.error)("appJsonTooltip",A.uiEvent.error)}}function Y8A(i,e){if(i&1&&y(0),i&2){let A=p(2);Be(" ",A.uiEvent.event.inputTranscription.text," ")}}function O8A(i,e){if(i&1&&y(0),i&2){let A=p(2);Be(" ",A.uiEvent.event.outputTranscription.text," ")}}function H8A(i,e){if(i&1&&Y(0,Y8A,1,1)(1,O8A,1,1),i&2){let A=p();O(A.role==="user"&&A.uiEvent.event.inputTranscription?0:A.role==="bot"&&A.uiEvent.event.outputTranscription?1:-1)}}var v5=class i{uiEvent;type="message";role="bot";evalStatus;userEditEvalCaseMessage="";userEditEvalCaseMessageChange=new LA;handleKeydown=new LA;cancelEditMessage=new LA;saveEditMessage=new LA;openViewImageDialog=new LA;openBase64InNewTab=new LA;i18n=w(q2);sanitizer=w(as);markdownComponent=w(P2);MediaType=J0;renderGooglerSearch(e){return this.sanitizer.bypassSecurityTrustHtml(e)}get rawMessageText(){let e=this.uiEvent.event?.content?.parts;return e?e.filter(A=>A.text).map(A=>A.text).join(""):""}get jsonOutputData(){if(this.uiEvent.event?.nodeInfo?.messageAsOutput===!0){let e=this.rawMessageText;if(e)try{return JSON.parse(e)}catch(A){return null}}return null}get hasAudio(){if(this.uiEvent.inlineData?.mediaType==="audio")return!0;let e=this.uiEvent.event?.content?.parts;return e?e.some(A=>A.fileData&&A.fileData.mimeType&&A.fileData.mimeType.startsWith("audio/")):!1}get noBubble(){if(this.uiEvent.text||this.rawMessageText)return!1;if(this.uiEvent.inlineData){let A=this.uiEvent.inlineData.mediaType;if(A==="audio"||A==="image"||A==="video"||A==="text")return!0}if(this.uiEvent.inlineData?.mimeType){let A=this.uiEvent.inlineData.mimeType;if(A.startsWith("audio/")||A.startsWith("image/")||A.startsWith("video/"))return!0}let e=this.uiEvent.event?.content?.parts;return e?e.some(A=>A.fileData&&A.fileData.mimeType&&(A.fileData.mimeType.startsWith("audio/")||A.fileData.mimeType.startsWith("image/")||A.fileData.mimeType.startsWith("video/"))):!1}getTextContent(e){if(!e)return"";let A=e.indexOf(",");if(A===-1)return"";let t=e.substring(A+1);try{return atob(t)}catch(n){return"Failed to decode text content"}}audioUrl=null;ngOnChanges(e){e.uiEvent&&this.uiEvent&&this.checkAndLoadAudio()}http=w(hr);artifactService=w(qd);changeDetectorRef=w(wt);checkAndLoadAudio(){let e=this.uiEvent.event?.content?.parts;if(e){let A=e.find(t=>t.fileData&&t.fileData.mimeType&&t.fileData.mimeType.startsWith("audio/pcm"));A&&A.fileData&&this.loadAudio(A.fileData.fileUri)}}loadAudio(e){if(!e||!e.startsWith("artifact://"))return;let A=e.substring(11).split("/"),t=A[0],n=A[1],o=A[2],a=A.slice(3).join("/"),r=a.indexOf("#"),s=r!==-1?a.substring(0,r):a,l=r!==-1?a.substring(r+1):"0",g=s.lastIndexOf("/"),C=g!==-1?s.substring(g+1):s;this.artifactService.getLatestArtifact(n,t,o,C).subscribe(I=>{let B="";if(I.inlineData&&I.inlineData.data?B=I.inlineData.data:I.data&&(B=I.data),B){let Q=this.base64ToArrayBuffer(B),h=Q.byteLength-Q.byteLength%2,f=Q.slice(0,h),v=this.pcmToWav(f,24e3,1),S=new FileReader;S.onloadend=()=>{this.audioUrl=S.result,this.changeDetectorRef.detectChanges()},S.readAsDataURL(v)}})}base64ToArrayBuffer(e){let A=e.replace(/\s/g,""),t=A.indexOf(",");for(t!==-1&&(A=A.substring(t+1)),A=A.replace(/-/g,"+").replace(/_/g,"/");A.length%4!==0;)A+="=";let n=window.atob(A),o=n.length,a=new Uint8Array(o);for(let r=0;rA.toString(16).padStart(2,"0")).join(" ")}pcmToWav(e,A,t){let n=new ArrayBuffer(44),o=new DataView(n);return this.writeString(o,0,"RIFF"),o.setUint32(4,36+e.byteLength,!0),this.writeString(o,8,"WAVE"),this.writeString(o,12,"fmt "),o.setUint32(16,16,!0),o.setUint16(20,1,!0),o.setUint16(22,t,!0),o.setUint32(24,A,!0),o.setUint32(28,A*t*2,!0),o.setUint16(32,t*2,!0),o.setUint16(34,16,!0),this.writeString(o,36,"data"),o.setUint32(40,e.byteLength,!0),new Blob([n,e],{type:"audio/wav"})}writeString(e,A,t){for(let n=0;n({"eval-pass":i,"eval-fail":e}),cx=i=>({hidden:i}),Cx=(i,e)=>e.id;function P8A(i,e){if(i&1){let A=rA();d(0,"app-content-bubble",11),T("userEditEvalCaseMessageChange",function(n){G(A);let o=p();return K(o.userEditEvalCaseMessageChange.emit(n))})("handleKeydown",function(n){G(A);let o=p();return K(o.handleKeydown.emit(n))})("cancelEditMessage",function(n){G(A);let o=p();return K(o.cancelEditMessage.emit(n))})("saveEditMessage",function(n){G(A);let o=p();return K(o.saveEditMessage.emit(n))})("openViewImageDialog",function(n){G(A);let o=p();return K(o.onImageClick(n))})("openBase64InNewTab",function(n){G(A);let o=p();return K(o.openBase64InNewTab.emit(n))}),E()}if(i&2){let A=p();H("type",A.uiEvent.thought?"thought":"message")("role",A.uiEvent.role)("evalStatus",A.uiEvent.evalStatus)("uiEvent",A.uiEvent)("userEditEvalCaseMessage",A.userEditEvalCaseMessage)}}function j8A(i,e){if(i&1&&lA(0,"app-content-bubble",2),i&2){let A=p();H("uiEvent",A.uiEvent)}}function q8A(i,e){if(i&1&&lA(0,"app-content-bubble",3),i&2){let A=p();H("uiEvent",A.uiEvent)}}function V8A(i,e){if(i&1&&lA(0,"app-content-bubble",4),i&2){let A=p();H("uiEvent",A.uiEvent)}}function W8A(i,e){i&1&&lA(0,"app-hover-info-button",6),i&2&&H("icon","stop_circle")("text","Turn Complete")("tooltipContent","The agent has completed this turn")("tooltipTitle","Turn Complete")}function Z8A(i,e){i&1&&lA(0,"app-hover-info-button",6),i&2&&H("icon","report")("text","Interrupted")("tooltipContent","The stream was interrupted")("tooltipTitle","Interrupted")}function X8A(i,e){if(i&1&&lA(0,"app-hover-info-button",6),i&2){let A=e.$implicit,t=p(2);H("icon","bolt")("text",t.getFunctionCallButtonText(A))("tooltipContent",A.args||"")("tooltipTitle","Function Call")}}function $8A(i,e){if(i&1){let A=rA();d(0,"app-computer-action",15),T("clickEvent",function(n){G(A);let o=p(3);return K(o.clickEvent.emit(n))})("openImage",function(n){G(A);let o=p(3);return K(o.openViewImageDialog.emit(n))}),E()}if(i&2){let A=p().$implicit,t=p(2);H("functionCall",A)("allMessages",t.uiEvents)("index",t.index)}}function AwA(i,e){if(i&1&&Y(0,$8A,1,3,"app-computer-action",14),i&2){let A=e.$implicit,t=p(2);O(t.isComputerUseClick(A)?0:-1)}}function ewA(i,e){if(i&1&&(d(0,"div",12),xe(1,X8A,1,4,"app-hover-info-button",6,Cx),E(),d(3,"div",13),xe(4,AwA,1,1,null,null,Cx),E()),i&2){let A=p();u(),Re(A.uiEvent.functionCalls),u(3),Re(A.uiEvent.functionCalls)}}function twA(i,e){if(i&1){let A=rA();d(0,"app-computer-action",18),T("clickEvent",function(n){G(A);let o=p(3);return K(o.clickEvent.emit(n))}),E()}if(i&2){let A=p().$implicit,t=p(2);H("functionResponse",A)("allMessages",t.uiEvents)("index",t.index)}}function iwA(i,e){if(i&1){let A=rA();d(0,"div",17),lA(1,"app-hover-info-button",6),d(2,"button",19),T("click",function(n){return n.stopPropagation()}),d(3,"mat-icon",20),y(4,"more_vert"),E()(),d(5,"mat-menu",null,0)(7,"button",21),T("click",function(){G(A);let n=p().$implicit,o=p(2);return K(o.openSendAnotherResponseDialog(n))}),d(8,"span"),y(9,"Send another response"),E()()()()}if(i&2){let A=gi(6),t=p().$implicit;u(),H("icon","check")("text",t.name)("tooltipContent",t.response||"")("tooltipTitle","Function Response"),u(),H("matMenuTriggerFor",A)}}function nwA(i,e){if(i&1&&Y(0,twA,1,3,"app-computer-action",16)(1,iwA,10,5,"div",17),i&2){let A=e.$implicit,t=p(2);O(t.isComputerUseResponse(A)?0:1)}}function owA(i,e){if(i&1&&xe(0,nwA,2,1,null,null,ni),i&2){let A=p();Re(A.uiEvent.functionResponses)}}function awA(i,e){if(i&1&&lA(0,"app-hover-info-button",6),i&2){let A=p(),t=xn(9);H("icon","data_object")("text","State: "+t.join(", "))("tooltipContent",A.getFilteredStateDelta(A.uiEvent.stateDelta))("tooltipTitle","State Update")}}function rwA(i,e){if(i&1&&lA(0,"app-hover-info-button",6),i&2){p();let A=xn(0),t=p();H("icon","attachment")("text","Artifact: "+A.join(", "))("tooltipContent",t.uiEvent.artifactDelta)("tooltipTitle","Artifact")}}function swA(i,e){if(i&1&&(Uo(0),Y(1,rwA,1,4,"app-hover-info-button",6)),i&2){let A=p(),t=Wo(A.Object.keys(A.uiEvent.artifactDelta));u(),O(t.length>0?1:-1)}}function lwA(i,e){if(i&1&&lA(0,"app-content-bubble",7),i&2){let A=p();H("uiEvent",A.uiEvent)}}function gwA(i,e){if(i&1&&lA(0,"app-hover-info-button",6),i&2){let A=p();H("icon","route")("text","route: "+A.String(A.uiEvent.route))("tooltipContent",A.uiEvent.route)("tooltipTitle","Route")}}function cwA(i,e){if(i&1&&lA(0,"app-hover-info-button",6),i&2){let A=p();H("icon","swap_horiz")("text",A.uiEvent.author+" \u2192 "+A.getTransferTargetName())("tooltipContent",A.uiEvent.transferToAgent)("tooltipTitle","Transfer to Agent")}}function CwA(i,e){if(i&1){let A=rA();d(0,"button",22),T("click",function(n){G(A);let o=p();return K(o.agentStateClick.emit({event:n,index:o.index}))}),d(1,"mat-icon"),y(2,"account_tree"),E(),y(3," Agent State "),E()}if(i&2){let A=p();H("appWorkflowGraphTooltip",A.getWorkflowNodes())("agentGraphData",A.agentGraphData)("nodePath",A.uiEvent.nodePath)("allNodes",A.allWorkflowNodes)}}function IwA(i,e){if(i&1&&lA(0,"app-hover-info-button",9),i&2){let A=p();H("icon","check_circle")("text",A.getEndOfAgentAuthor()+" completed!")}}function dwA(i,e){if(i&1){let A=rA();d(0,"app-long-running-response",24),T("responseComplete",function(n){G(A);let o=p(3);return K(o.longRunningResponseComplete.emit(n))}),E()}if(i&2){let A=p().$implicit,t=p(2);H("functionCall",A)("appName",t.appName)("userId",t.userId)("sessionId",t.sessionId)}}function BwA(i,e){if(i&1&&Y(0,dwA,1,4,"app-long-running-response",23),i&2){let A=e.$implicit,t=p(2);O(A.needsResponse&&!t.hasFunctionResponse(A.id)?0:-1)}}function EwA(i,e){if(i&1&&xe(0,BwA,1,1,null,null,Cx),i&2){let A=p();Re(A.uiEvent.functionCalls)}}function hwA(i,e){if(i&1&&(d(0,"div",10)(1,"span",25),y(2),E()()),i&2){let A=p();H("ngClass",g1(2,z8A,A.uiEvent.evalStatus===1,A.uiEvent.evalStatus===2)),u(2),iA(A.uiEvent.evalStatus===1?A.i18n.evalPassLabel:A.uiEvent.evalStatus===2?A.i18n.evalFailLabel:"")}}function QwA(i,e){if(i&1){let A=rA();d(0,"div")(1,"span",26),T("click",function(){G(A);let n=p(2);return K(n.editEvalCaseMessage.emit(n.uiEvent))}),y(2," edit "),E(),d(3,"span",26),T("click",function(){G(A);let n=p(2);return K(n.deleteEvalCaseMessage.emit({message:n.uiEvent,index:n.index}))}),y(4," delete "),E()()}if(i&2){let A=p(2);u(),H("ngClass",Nl(4,cx,A.isEvalCaseEditing))("matTooltip",A.i18n.editEvalMessageTooltip),u(2),H("ngClass",Nl(6,cx,A.isEvalCaseEditing))("matTooltip",A.i18n.deleteEvalMessageTooltip)}}function uwA(i,e){if(i&1){let A=rA();d(0,"div")(1,"span",26),T("click",function(){G(A);let n=p(2);return K(n.editFunctionArgs.emit(n.uiEvent))}),y(2," edit "),E()()}if(i&2){let A=p(2);u(),H("ngClass",Nl(2,cx,A.isEvalCaseEditing))("matTooltip",A.i18n.editFunctionArgsTooltip)}}function pwA(i,e){if(i&1&&Y(0,QwA,5,8,"div")(1,uwA,3,4,"div"),i&2){let A=p();O(A.uiEvent.text?0:A.isEditFunctionArgsEnabled&&A.uiEvent.functionCalls&&A.uiEvent.functionCalls.length>0?1:-1)}}var nh=class i{uiEvent;index;uiEvents=[];appName="";userId="";sessionId="";sessionName="";evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;isEditFunctionArgsEnabled=!1;userEditEvalCaseMessage="";agentGraphData=null;allWorkflowNodes=null;handleKeydown=new LA;cancelEditMessage=new LA;saveEditMessage=new LA;userEditEvalCaseMessageChange=new LA;openViewImageDialog=new LA;openBase64InNewTab=new LA;editEvalCaseMessage=new LA;deleteEvalCaseMessage=new LA;editFunctionArgs=new LA;clickEvent=new LA;longRunningResponseComplete=new LA;agentStateClick=new LA;i18n=w(q2);dialog=w(Ja);Object=Object;String=String;getFunctionCallButtonText(e){let A=e.args;if(A&&typeof A=="string")try{A=JSON.parse(A)}catch(t){}if(A&&typeof A=="object"){let t={EditFile:"path",WriteFile:"path"};if(e.name in t){let o=t[e.name];if(o in A){let a=this.formatPythonValue(A[o]),r=Object.keys(A).length>1;return`${e.name}(${a}${r?", \u2026":""})`}}let n=Object.keys(A);if(n.length===1){let o=A[n[0]],a=this.formatPythonValue(o);return`${e.name}(${a})`}else if(n.length===0)return`${e.name}()`}else if(!A)return`${e.name}()`;return e.name}formatPythonValue(e){return e==null?"None":typeof e=="boolean"?e?"True":"False":typeof e=="string"?`"${e}"`:typeof e=="object"?JSON.stringify(e).replace(/\btrue\b/g,"True").replace(/\bfalse\b/g,"False").replace(/\bnull\b/g,"None"):String(e)}shouldShowMessageCard(e){return!!(e.text||e.attachments||e.inlineData||e.executableCode||e.codeExecutionResult||e.a2uiData||e.renderedContent||e.isLoading||e.failedMetric&&e.evalStatus===2||e.event?.content?.parts?.some(A=>A.fileData))}isComputerUseClick(e){return ih(e)}isComputerUseResponse(e){return h0(e)}getFilteredStateKeys(e){return e?Object.keys(e).filter(A=>A!=="__llm_request_key__"):[]}getFilteredStateDelta(e){if(!e)return null;let A=oA({},e);return delete A.__llm_request_key__,A}hasWorkflowNodes(){let e=this.uiEvent.event?.actions?.agentState?.nodes;return!!e&&Object.keys(e).length>0}getWorkflowNodes(){return this.uiEvent.event?.actions?.agentState?.nodes||null}hasEndOfAgent(){return this.uiEvent.event?.actions?.endOfAgent===!0}getEndOfAgentAuthor(){return this.uiEvent.event?.author||"Agent"}getTransferTargetName(){let e=this.uiEvent.transferToAgent;return e?typeof e=="string"?e:e.agentName||e.name||e.targetAgent||JSON.stringify(e):""}hasFunctionResponse(e){return e?this.uiEvents.some(A=>A.functionResponses?.some(t=>t.id===e&&t.response?.status!=="pending")):!1}openSendAnotherResponseDialog(e){let A="",t=e.id;if(t){for(let o of this.uiEvents)if(o.functionCalls){let a=o.functionCalls.find(r=>r.id===t);if(a){A=a.functionCallEventId||o.event?.id||"";break}}}this.dialog.open(jI,{data:{dialogHeader:"Send Another Response",functionName:e.name,jsonContent:e.response},width:"600px"}).afterClosed().subscribe(o=>{if(o){let a={role:"user",parts:[{functionResponse:{id:t,name:e.name,response:o}}],functionCallEventId:A};this.longRunningResponseComplete.emit(a)}})}getAllImages(){let e=[],A=new Set,t=n=>{A.has(n)||(A.add(n),e.push(n))};for(let n of this.uiEvents){if(n.attachments)for(let a of n.attachments)a.file.type.startsWith("image/")&&a.url&&t(a.url);n.inlineData?.mimeType?.startsWith("image/")&&n.inlineData.data&&t(n.inlineData.data);let o=n.event?.content?.parts;if(Array.isArray(o)){for(let a of o)if(a.inlineData?.mimeType?.startsWith("image/")&&a.inlineData.data){let r=a.inlineData.mimeType,s=a.inlineData.data.replace(/-/g,"+").replace(/_/g,"/");t(`data:${r};base64,${s}`)}}if(n.functionResponses){for(let a of n.functionResponses)if(this.isComputerUseResponse(a)){let s=a.response?.image;if(s?.data){let l=s.data,g=s.mimetype||"image/png",C=l.startsWith("data:")?l:`data:${g};base64,${l}`;t(C)}}}}return e}onImageClick(e){let A=this.getAllImages(),t=A.indexOf(e);this.openViewImageDialog.emit({images:A,currentIndex:t})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-event-content"]],inputs:{uiEvent:"uiEvent",index:"index",uiEvents:"uiEvents",appName:"appName",userId:"userId",sessionId:"sessionId",sessionName:"sessionName",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",userEditEvalCaseMessage:"userEditEvalCaseMessage",agentGraphData:"agentGraphData",allWorkflowNodes:"allWorkflowNodes"},outputs:{handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",clickEvent:"clickEvent",longRunningResponseComplete:"longRunningResponseComplete",agentStateClick:"agentStateClick"},decls:20,vars:19,consts:[["responseMenu","matMenu"],[3,"type","role","evalStatus","uiEvent","userEditEvalCaseMessage"],["type","output",3,"uiEvent"],["type","transcription","role","user",3,"uiEvent"],["type","transcription","role","bot",3,"uiEvent"],[1,"event-chips-container"],[3,"icon","text","tooltipContent","tooltipTitle"],["type","error",3,"uiEvent"],["mat-stroked-button","",1,"event-action-button",3,"appWorkflowGraphTooltip","agentGraphData","nodePath","allNodes"],[3,"icon","text"],[3,"ngClass"],[3,"userEditEvalCaseMessageChange","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","type","role","evalStatus","uiEvent","userEditEvalCaseMessage"],[1,"function-calls-buttons"],[1,"function-calls-previews"],[3,"functionCall","allMessages","index"],[3,"clickEvent","openImage","functionCall","allMessages","index"],[3,"functionResponse","allMessages","index"],[1,"function-response-chip-container"],[3,"clickEvent","functionResponse","allMessages","index"],["mat-icon-button","",1,"menu-trigger-btn",3,"click","matMenuTriggerFor"],[1,"more-icon"],["mat-menu-item","",3,"click"],["mat-stroked-button","",1,"event-action-button",3,"click","appWorkflowGraphTooltip","agentGraphData","nodePath","allNodes"],[3,"functionCall","appName","userId","sessionId"],[3,"responseComplete","functionCall","appName","userId","sessionId"],[2,"font-family","monospace"],[1,"material-symbols-outlined","eval-case-edit-button",3,"click","ngClass","matTooltip"]],template:function(A,t){if(A&1&&(Y(0,P8A,1,5,"app-content-bubble",1),Y(1,j8A,1,1,"app-content-bubble",2),Y(2,q8A,1,1,"app-content-bubble",3),Y(3,V8A,1,1,"app-content-bubble",4),d(4,"div",5),Y(5,W8A,1,4,"app-hover-info-button",6),Y(6,Z8A,1,4,"app-hover-info-button",6),Y(7,ewA,6,0),Y(8,owA,2,0),Uo(9),Y(10,awA,1,4,"app-hover-info-button",6),Y(11,swA,2,2),Y(12,lwA,1,1,"app-content-bubble",7),Y(13,gwA,1,4,"app-hover-info-button",6),Y(14,cwA,1,4,"app-hover-info-button",6),Y(15,CwA,4,4,"button",8),Y(16,IwA,1,2,"app-hover-info-button",9),E(),Y(17,EwA,2,0),Y(18,hwA,3,5,"div",10),Y(19,pwA,2,1)),A&2){O(t.shouldShowMessageCard(t.uiEvent)?0:-1),u(),O(t.uiEvent.event.output?1:-1),u(),O(t.uiEvent.event.inputTranscription?2:-1),u(),O(t.uiEvent.event.outputTranscription?3:-1),u(2),O(t.uiEvent.event.turnComplete?5:-1),u(),O(t.uiEvent.event.interrupted?6:-1),u(),O(t.uiEvent.functionCalls&&t.uiEvent.functionCalls.length>0?7:-1),u(),O(t.uiEvent.functionResponses&&t.uiEvent.functionResponses.length>0?8:-1),u();let n=Wo(t.getFilteredStateKeys(t.uiEvent.stateDelta));u(),O(n.length>0?10:-1),u(),O(t.uiEvent.artifactDelta?11:-1),u(),O(t.uiEvent.error?12:-1),u(),O(t.uiEvent.route?13:-1),u(),O(t.uiEvent.transferToAgent?14:-1),u(),O(t.hasWorkflowNodes()?15:-1),u(),O(t.hasEndOfAgent()?16:-1),u(),O(t.uiEvent.functionCalls&&t.uiEvent.functionCalls.length>0?17:-1),u(),O(t.uiEvent.evalStatus===1||t.uiEvent.evalStatus===2?18:-1),u(),O(t.evalCase&&t.isEvalEditMode?19:-1)}},dependencies:[si,Fl,On,zt,Wi,Si,vi,Ra,Zi,f5,m5,D5,w5,v5,HC,ns,Ds,Hl],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;width:100%}app-content-bubble[_ngcontent-%COMP%] + app-content-bubble[_ngcontent-%COMP%]{margin-top:5px}.event-chips-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;width:100%}.user[_nghost-%COMP%] .event-chips-container[_ngcontent-%COMP%], .user [_nghost-%COMP%] .event-chips-container[_ngcontent-%COMP%]{justify-content:flex-end}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#2e7d32}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--mat-sys-error)}.hidden[_ngcontent-%COMP%]{visibility:hidden}.event-action-button[_ngcontent-%COMP%]{margin:5px}.function-calls-previews[_ngcontent-%COMP%]{width:100%}.function-response-chip-container[_ngcontent-%COMP%]{display:inline-flex;align-items:center;position:relative}.function-response-chip-container[_ngcontent-%COMP%] .menu-trigger-btn[_ngcontent-%COMP%]{visibility:hidden;width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center;padding:0;position:absolute;right:10px;top:50%;transform:translateY(-50%);background-color:var(--mat-sys-surface-container-high);border-radius:50%;z-index:2}.function-response-chip-container[_ngcontent-%COMP%] .menu-trigger-btn[_ngcontent-%COMP%] .more-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.function-response-chip-container[_ngcontent-%COMP%]:hover .menu-trigger-btn[_ngcontent-%COMP%]{visibility:visible}"]})};function fwA(i,e){if(i&1&&lA(0,"app-chat-avatar",1),i&2){let A=p();H("role",A.uiEvent.event.content?"bot":"node")("author",A.uiEvent.author)("nodePath",A.uiEvent.nodePath)}}function mwA(i,e){i&1&&lA(0,"div",5)}function wwA(i,e){if(i&1&&xe(0,mwA,1,0,"div",5,ni),i&2){let A=p();Re(A.indentationArray)}}function DwA(i,e){i&1&&lA(0,"app-chat-avatar",3)}function ywA(i,e){if(i&1&&lA(0,"app-message-feedback",4),i&2){let A=p();H("sessionName",A.sessionName)("eventId",A.uiEvent.event.id||"")}}var b5=class i{uiEvent;index;uiEvents=[];isSelected=!1;isSelectable=!0;appName="";userId="";sessionId="";sessionName="";evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;isEditFunctionArgsEnabled=!1;userEditEvalCaseMessage="";agentGraphData=null;allWorkflowNodes=null;isUserFeedbackEnabled=!1;isLoadingAgentResponse=!1;rowClick=new LA;handleKeydown=new LA;cancelEditMessage=new LA;saveEditMessage=new LA;userEditEvalCaseMessageChange=new LA;openViewImageDialog=new LA;openBase64InNewTab=new LA;editEvalCaseMessage=new LA;deleteEvalCaseMessage=new LA;editFunctionArgs=new LA;clickEvent=new LA;longRunningResponseComplete=new LA;agentStateClick=new LA;onRowClick(e){this.isSelectable&&this.rowClick.emit({event:e,uiEvent:this.uiEvent,index:this.index})}get indentationDepth(){if(!this.uiEvent.nodePath)return 0;let A=this.uiEvent.nodePath.split("/").filter(Boolean).length;return A>2?A-2:0}get indentationArray(){let e=this.indentationDepth;return e>0?Array.from({length:e},(A,t)=>t):[]}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-event-row"]],hostAttrs:[1,"message-row-container"],hostVars:8,hostBindings:function(A,t){A&1&&T("click",function(o){return t.onRowClick(o)}),A&2&&xA("selected",t.isSelected)("user",t.uiEvent.role==="user")("bot",t.uiEvent.role==="bot")("selectable",t.isSelectable)},inputs:{uiEvent:"uiEvent",index:"index",uiEvents:"uiEvents",isSelected:"isSelected",isSelectable:"isSelectable",appName:"appName",userId:"userId",sessionId:"sessionId",sessionName:"sessionName",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",userEditEvalCaseMessage:"userEditEvalCaseMessage",agentGraphData:"agentGraphData",allWorkflowNodes:"allWorkflowNodes",isUserFeedbackEnabled:"isUserFeedbackEnabled",isLoadingAgentResponse:"isLoadingAgentResponse"},outputs:{rowClick:"rowClick",handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",clickEvent:"clickEvent",longRunningResponseComplete:"longRunningResponseComplete",agentStateClick:"agentStateClick"},decls:7,vars:21,consts:[[1,"event-number-container"],[3,"role","author","nodePath"],[1,"message-content",3,"userEditEvalCaseMessageChange","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","clickEvent","longRunningResponseComplete","agentStateClick","uiEvent","index","uiEvents","appName","userId","sessionId","sessionName","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userEditEvalCaseMessage","agentGraphData","allWorkflowNodes"],["role","user"],[3,"sessionName","eventId"],[1,"indentation-line"]],template:function(A,t){A&1&&(d(0,"div",0),y(1),E(),Y(2,fwA,1,3,"app-chat-avatar",1),Y(3,wwA,2,0),d(4,"app-event-content",2),T("userEditEvalCaseMessageChange",function(o){return t.userEditEvalCaseMessageChange.emit(o)})("handleKeydown",function(o){return t.handleKeydown.emit(o)})("cancelEditMessage",function(o){return t.cancelEditMessage.emit(o)})("saveEditMessage",function(o){return t.saveEditMessage.emit(o)})("openViewImageDialog",function(o){return t.openViewImageDialog.emit(o)})("openBase64InNewTab",function(o){return t.openBase64InNewTab.emit(o)})("editEvalCaseMessage",function(o){return t.editEvalCaseMessage.emit(o)})("deleteEvalCaseMessage",function(o){return t.deleteEvalCaseMessage.emit(o)})("editFunctionArgs",function(o){return t.editFunctionArgs.emit(o)})("clickEvent",function(o){return t.clickEvent.emit(o)})("longRunningResponseComplete",function(o){return t.longRunningResponseComplete.emit(o)})("agentStateClick",function(o){return t.agentStateClick.emit(o)}),E(),Y(5,DwA,1,0,"app-chat-avatar",3),Y(6,ywA,1,2,"app-message-feedback",4)),A&2&&(xA("hidden",!t.isSelectable),u(),Be(" #",t.index+1," "),u(),O(t.uiEvent.role==="bot"&&!t.uiEvent.isLoading?2:-1),u(),O(t.uiEvent.role==="bot"?3:-1),u(),H("uiEvent",t.uiEvent)("index",t.index)("uiEvents",t.uiEvents)("appName",t.appName)("userId",t.userId)("sessionId",t.sessionId)("sessionName",t.sessionName)("evalCase",t.evalCase)("isEvalEditMode",t.isEvalEditMode)("isEvalCaseEditing",t.isEvalCaseEditing)("isEditFunctionArgsEnabled",t.isEditFunctionArgsEnabled)("userEditEvalCaseMessage",t.userEditEvalCaseMessage)("agentGraphData",t.agentGraphData)("allWorkflowNodes",t.allWorkflowNodes),u(),O(t.uiEvent.role==="user"?5:-1),u(),O(t.isUserFeedbackEnabled&&!t.isLoadingAgentResponse&&t.uiEvent.role==="bot"?6:-1))},dependencies:[si,u5,h5,nh],styles:[".generated-image-container[_ngcontent-%COMP%]{max-width:400px;margin-left:20px}.generated-image[_ngcontent-%COMP%]{max-width:100%;min-width:40px;border-radius:8px}.html-artifact-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:flex-start;align-items:center}app-content-bubble[_ngcontent-%COMP%] + app-content-bubble[_ngcontent-%COMP%]{margin-top:5px}.event-chips-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;width:100%}[_nghost-%COMP%]{display:flex;flex-direction:row;flex-wrap:nowrap;margin-left:-20px;margin-right:-20px;padding:4px 20px;border-radius:4px;transition:all .2s ease}.selectable[_nghost-%COMP%]:hover{box-shadow:inset 0 0 0 2px var(--mat-sys-outline-variant, rgba(0, 0, 0, .12))}.selected[_nghost-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))!important}app-message-feedback[_ngcontent-%COMP%]{width:100%}.user[_nghost-%COMP%]{justify-content:flex-end;align-items:flex-start;gap:15px}.bot[_nghost-%COMP%]{align-items:flex-start;padding-right:48px}.bot[_nghost-%COMP%] app-chat-avatar[_ngcontent-%COMP%]{align-self:flex-start}.message-content[_ngcontent-%COMP%]{display:contents}.bot[_nghost-%COMP%] > .message-content[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-width:0;align-items:flex-start}.user[_nghost-%COMP%] > .message-content[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-width:0;align-items:flex-end}.bot[_nghost-%COMP%]:focus-within app-content-bubble[_ngcontent-%COMP%] .content-bubble{border:1px solid var(--mat-sys-outline)}.message-textarea[_ngcontent-%COMP%]{max-width:100%;border:none;background-color:transparent;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}app-content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}app-content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--mat-sys-outline-variant);padding-right:8px;min-width:350px;max-width:350px}app-content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}app-content-bubble[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--mat-sys-outline-variant);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--mat-sys-tertiary)}.header-actual[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#2e7d32}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--mat-sys-error)}.hidden[_ngcontent-%COMP%]{visibility:hidden}.image-preview-chat[_ngcontent-%COMP%]{max-width:90%;max-height:70vh;width:auto;height:auto;border-radius:8px;cursor:pointer;transition:transform .2s ease-in-out}.attachment[_ngcontent-%COMP%]{display:flex;align-items:center}[_nghost-%COMP%] .message-text p{white-space:pre-line;word-break:break-word;overflow-wrap:break-word}.event-number-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-self:flex-start;min-width:30px;margin-top:10px;margin-right:8px;font-size:12px;font-weight:600;text-align:center;color:var(--mat-sys-on-surface-variant)}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.link-style-button[_ngcontent-%COMP%]{border:none;padding:0;font:inherit;color:var(--mat-sys-primary)!important;text-decoration:underline;cursor:pointer;outline:none;font-size:14px}.cancel-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--mat-sys-outline-variant);cursor:pointer;margin-right:16px}.save-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--mat-sys-primary);cursor:pointer;margin-right:16px}.indentation-line[_ngcontent-%COMP%]{width:20px;border-left:1px solid var(--mat-sys-outline-variant);align-self:stretch;opacity:.5;margin-top:-4px;margin-bottom:-4px}"]})};function vwA(i,e){if(i&1){let A=rA();d(0,"button",3),T("click",function(){G(A);let n=p();return K(n.toggleVideoRecording.emit())}),d(1,"mat-icon"),y(2,"videocam"),E()(),d(3,"div",4),lA(4,"div",5)(5,"div",5)(6,"div",5)(7,"div",5),E()}if(i&2){let A=p();xA("recording",A.isVideoRecording),H("matTooltip",A.isVideoRecording?A.i18n.turnOffCamTooltip:A.i18n.useCamTooltip)("disabled",!A.isBidiStreamingEnabled),u(4),ht("height",4+A.micVolume*16,"px"),u(),ht("height",4+A.micVolume*24,"px"),u(),ht("height",4+A.micVolume*18,"px"),u(),ht("height",4+A.micVolume*14,"px")}}function bwA(i,e){if(i&1){let A=rA();d(0,"div",2)(1,"div",6),y(2,"Live Flags"),E(),d(3,"div",7)(4,"mat-checkbox",8),T("change",function(n){G(A);let o=p();return K(o.flags.proactiveAudio=n.checked)}),y(5,"Proactive Audio"),E()(),d(6,"div",7)(7,"mat-checkbox",8),T("change",function(n){G(A);let o=p();return K(o.flags.enableAffectiveDialog=n.checked)}),y(8,"Affective Dialog"),E()(),d(9,"div",7)(10,"mat-checkbox",8),T("change",function(n){G(A);let o=p();return K(o.flags.enableSessionResumption=n.checked)}),y(11,"Session Resumption"),E()(),d(12,"div",7)(13,"mat-checkbox",8),T("change",function(n){G(A);let o=p();return K(o.flags.saveLiveBlob=n.checked)}),y(14,"Save Live Blob"),E()()()}if(i&2){let A=p();u(4),H("checked",A.flags.proactiveAudio)("matTooltip",A.i18n.proactiveAudioTooltip),u(3),H("checked",A.flags.enableAffectiveDialog)("matTooltip",A.i18n.affectiveDialogTooltip),u(3),H("checked",A.flags.enableSessionResumption)("matTooltip",A.i18n.sessionResumptionTooltip),u(3),H("checked",A.flags.saveLiveBlob)("matTooltip",A.i18n.saveLiveBlobTooltip)}}var M5=class i{get inCall(){return this.isAudioRecording}isAudioRecording=!1;isVideoRecording=!1;micVolume=0;isBidiStreamingEnabled=!1;toggleAudioRecording=new LA;toggleVideoRecording=new LA;i18n=w(q2);showFlags=!1;flags={proactiveAudio:!1,enableAffectiveDialog:!1,enableSessionResumption:!1,saveLiveBlob:!1};onCallClick(){this.showFlags=!1,this.toggleAudioRecording.emit(this.flags)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-call-controls"]],hostVars:2,hostBindings:function(A,t){A&2&&xA("in-call",t.inCall)},inputs:{isAudioRecording:"isAudioRecording",isVideoRecording:"isVideoRecording",micVolume:"micVolume",isBidiStreamingEnabled:"isBidiStreamingEnabled"},outputs:{toggleAudioRecording:"toggleAudioRecording",toggleVideoRecording:"toggleVideoRecording"},decls:6,vars:6,consts:[[1,"call-btn-container",3,"mouseenter","mouseleave"],["mat-icon-button","",1,"audio-rec-btn",3,"click","disabled"],[1,"flags-panel"],["mat-icon-button","",1,"video-rec-btn",3,"click","matTooltip","disabled"],[1,"mic-visualizer"],[1,"bar"],[1,"flags-title"],[1,"flag-item"],["matTooltipPosition","left",3,"change","checked","matTooltip"]],template:function(A,t){A&1&&(Y(0,vwA,8,12),d(1,"div",0),T("mouseenter",function(){return t.showFlags=!0})("mouseleave",function(){return t.showFlags=!1}),d(2,"button",1),T("click",function(){return t.onCallClick()}),d(3,"mat-icon"),y(4),E()(),Y(5,bwA,15,8,"div",2),E()),A&2&&(O(t.isAudioRecording?0:-1),u(2),xA("recording",t.isAudioRecording),H("disabled",!t.isBidiStreamingEnabled),u(2),iA(t.isAudioRecording?"call_end":"call"),u(),O(t.showFlags&&!t.isAudioRecording?5:-1))},dependencies:[si,Wi,vi,On,zt,Ra,Zi,qU,Og],styles:['[_nghost-%COMP%]{display:flex;align-items:center;gap:4px;border-radius:28px;transition:all .2s ease}.in-call[_nghost-%COMP%]{background-color:var(--mat-sys-surface-variant)}button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)!important}button.recording[_ngcontent-%COMP%]{background-color:var(--mat-sys-error)!important;color:var(--mat-sys-on-error, #ffffff)!important}button.audio-rec-btn[_ngcontent-%COMP%]:not(.recording){color:#34a853!important}.mic-visualizer[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;gap:3px;height:24px;margin-right:8px;width:24px}.mic-visualizer[_ngcontent-%COMP%] .bar[_ngcontent-%COMP%]{width:4px;background-color:#34a853;border-radius:2px;transition:height .1s ease-out}.call-btn-container[_ngcontent-%COMP%]{position:relative;display:inline-block}.flags-panel[_ngcontent-%COMP%]{position:absolute;bottom:100%;left:50%;transform:translate(-50%);margin-bottom:8px;background:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:12px;padding:12px;box-shadow:0 4px 20px #00000026;z-index:100;width:250px;display:flex;flex-direction:column;gap:8px;animation:_ngcontent-%COMP%_fadeIn .2s ease-out}.flags-panel[_ngcontent-%COMP%]:before{content:"";position:absolute;bottom:-8px;left:0;right:0;height:8px;background:transparent}.flags-panel[_ngcontent-%COMP%] .flags-title[_ngcontent-%COMP%]{font-weight:600;font-size:14px;color:var(--mat-sys-on-surface);margin-bottom:4px}.flags-panel[_ngcontent-%COMP%] .flag-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--mat-sys-on-surface-variant)}.flags-panel[_ngcontent-%COMP%] .flag-item[_ngcontent-%COMP%] .flag-label[_ngcontent-%COMP%]{font-weight:500}.flags-panel[_ngcontent-%COMP%] .flag-item[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{--mdc-checkbox-state-layer-size: 30px}@keyframes _ngcontent-%COMP%_fadeIn{0%{opacity:0;transform:translate(-50%) translateY(10px)}to{opacity:1;transform:translate(-50%) translateY(0)}}']})};var MwA=i=>({$implicit:i});function SwA(i,e){i&1&&lA(0,"div",9)}function kwA(i,e){if(i&1&&(d(0,"span",15),y(1),E()),i&2){let A=p(2).$implicit,t=p();ht("right",100-t.getRelativeStart(A.span),"%"),u(),iA(t.formatDuration(A.span.end_time-A.span.start_time))}}function _wA(i,e){if(i&1){let A=rA();d(0,"div",6),T("click",function(){G(A);let n=p().$implicit,o=p();return K(o.selectRow(n))}),d(1,"div",7)(2,"div",8),xe(3,SwA,1,0,"div",9,Nr),E(),d(5,"span",10),y(6),E(),d(7,"div",11),y(8),E()(),d(9,"div",12)(10,"div",13),y(11),E(),Y(12,kwA,2,3,"span",14),E()()}if(i&2){let A=p().$implicit,t=p(),n=gi(12);xA("selected",t.rowSelected(A)),H("id",fh("trace-node-",A.span.span_id))("appHtmlTooltip",n)("appHtmlTooltipContext",Nl(19,MwA,t.getUiEvent(A)))("appHtmlTooltipDisabled",!t.getUiEvent(A)),u(3),Re(t.getArray(A.level)),u(2),xA("is-event-row",t.isEventRow(A)),u(),Be(" ",t.getSpanIcon(A.span.name)," "),u(),xA("is-event-row",t.isEventRow(A)),u(),Be(" ",t.formatSpanName(A.span.name)," "),u(2),ht("left",t.getRelativeStart(A.span),"%")("width",t.getRelativeWidth(A.span),"%"),u(),Be(" ",t.formatDuration(A.span.end_time-A.span.start_time)," "),u(),O(t.getRelativeWidth(A.span)<10?12:-1)}}function xwA(i,e){if(i&1&&Y(0,_wA,13,21,"div",5),i&2){let A=e.$implicit,t=p();O(t.shouldShowNode(A)?0:-1)}}function RwA(i,e){if(i&1&&(d(0,"div",16),lA(1,"app-event-content",17),E()),i&2){let A=p().$implicit;u(),H("uiEvent",A)("index",0)}}function NwA(i,e){if(i&1&&Y(0,RwA,2,2,"div",16),i&2){let A=e.$implicit;O(A?0:-1)}}var S5=class i{spans=[];invocationId="";uiEvents=[];shouldShowEvent;tree=[];baseStartTimeMs=0;totalDurationMs=1;rootLatencyNanos=0;flatTree=[];shouldShowNode(e){let A=this.getUiEvent(e);return A&&this.shouldShowEvent?this.shouldShowEvent(A):!0}traceLabelIconMap=new Map([["Invocation","start"],["agent_run","robot"],["invoke_agent","robot_2"],["tool","build"],["execute_tool","build"],["call_llm","chat"]]);selectedRow=void 0;traceService=w(Pl);constructor(){}selectRootSpan(){if(this.tree&&this.tree.length>0){if(this.selectedRow&&this.selectedRow.span_id===this.tree[0].span_id)return;this.traceService.selectedRow(this.tree[0])}}isRootSpanSelected(){return!this.selectedRow||!this.tree||this.tree.length===0?!1:String(this.selectedRow.span_id)===String(this.tree[0].span_id)}ngOnInit(){this.rebuildTree(),this.traceService.selectedTraceRow$.subscribe(e=>{this.selectedRow=e,e&&setTimeout(()=>{let A=document.getElementById("trace-node-"+e.span_id);A&&A.scrollIntoView({behavior:"smooth",block:"nearest"})},50)})}ngOnChanges(e){e.spans&&!e.spans.isFirstChange()&&this.rebuildTree()}rebuildTree(){if(!this.spans||this.spans.length===0){this.tree=[],this.flatTree=[],this.rootLatencyNanos=0;return}this.tree=this.buildSpanTree(this.spans),this.flatTree=[],this.tree.forEach(A=>{A.children&&this.flatTree.push(...this.flattenTree(A.children,0))});let e=this.getGlobalTimes(this.spans);this.baseStartTimeMs=e.start,this.totalDurationMs=e.duration,this.tree&&this.tree.length>0?this.rootLatencyNanos=this.tree[0].end_time-this.tree[0].start_time:this.rootLatencyNanos=0}buildSpanTree(e){let A=e.map(o=>oA({},o)),t=new Map,n=[];return A.forEach(o=>t.set(o.span_id,o)),A.forEach(o=>{if(o.parent_span_id&&t.has(o.parent_span_id)){let a=t.get(o.parent_span_id);a.children=a.children||[],a.children.push(o)}else n.push(o)}),n}getGlobalTimes(e){let A=Math.min(...e.map(n=>this.toMs(n.start_time))),t=Math.max(...e.map(n=>this.toMs(n.end_time)));return{start:A,duration:t-A}}toMs(e){return e/1e6}formatDuration(e){if(e===0)return"0us";if(e<1e3)return`${e}ns`;if(e<1e6)return`${(e/1e3).toFixed(2)}us`;if(e<1e9)return`${(e/1e6).toFixed(2)}ms`;if(e<6e10)return`${(e/1e9).toFixed(2)}s`;let A=Math.floor(e/6e10),t=(e%6e10/1e9).toFixed(2);return`${A}m ${t}s`}getRelativeStart(e){return(this.toMs(e.start_time)-this.baseStartTimeMs)/this.totalDurationMs*100}getRelativeWidth(e){return(this.toMs(e.end_time)-this.toMs(e.start_time))/this.totalDurationMs*100}flattenTree(e,A=0){return e.flatMap(n=>[{span:n,level:A},...n.children?this.flattenTree(n.children,A+1):[]])}getSpanIcon(e){for(let[A,t]of this.traceLabelIconMap.entries())if(e.startsWith(A))return t;return"start"}formatSpanName(e){return e.startsWith("invoke_agent ")||e.startsWith("execute_tool ")?e.substring(13):e.startsWith("invoke_node ")?e.substring(12):e}getArray(e){return Array.from({length:e})}selectRow(e){this.selectedRow&&this.selectedRow.span_id==e.span.span_id||this.traceService.selectedRow(e.span)}rowSelected(e){return!this.selectedRow||!e?.span?!1:String(this.selectedRow.span_id)===String(e.span.span_id)}isEventRow(e){if(!e.span.attributes)return!1;let A=e?.span.attributes["gcp.vertex.agent.event_id"];return A&&this.uiEvents&&this.uiEvents.length>0?this.uiEvents.some(t=>t.event?.id===A):!1}getEventId(e){return e?.span?.attributes?.["gcp.vertex.agent.event_id"]??""}getUiEvent(e){let A=this.getEventId(e);return A&&this.uiEvents&&this.uiEvents.length>0&&this.uiEvents.find(t=>t.event?.id===A)||null}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-trace-tree"]],inputs:{spans:"spans",invocationId:"invocationId",uiEvents:"uiEvents",shouldShowEvent:"shouldShowEvent"},features:[Zt],decls:13,vars:6,consts:[["eventTooltip",""],[1,"invocation-id-container",3,"click"],[1,"invocation-id",3,"matTooltip"],[1,"total-latency"],[1,"trace-container"],[1,"trace-row",3,"selected","id","appHtmlTooltip","appHtmlTooltipContext","appHtmlTooltipDisabled"],[1,"trace-row",3,"click","id","appHtmlTooltip","appHtmlTooltipContext","appHtmlTooltipDisabled"],[1,"trace-row-left"],[1,"trace-indent"],[1,"indent-connector"],[1,"material-symbols-outlined",2,"margin-right","8px"],[1,"trace-label"],[1,"trace-bar-container"],[1,"trace-bar"],[1,"short-trace-bar-duration",3,"right"],[1,"short-trace-bar-duration"],[1,"event-tooltip-container"],[3,"uiEvent","index"]],template:function(A,t){A&1&&(d(0,"div")(1,"div",1),T("click",function(){return t.selectRootSpan()}),d(2,"span"),y(3,"Invocation ID: "),E(),d(4,"div",2),y(5),E(),d(6,"span",3),y(7),E()(),d(8,"div",4),xe(9,xwA,1,1,null,null,ni),E()(),yt(11,NwA,1,1,"ng-template",null,0,MC)),A&2&&(u(),xA("selected",t.isRootSpanSelected()),ee("id",t.tree&&t.tree.length>0?"trace-node-"+t.tree[0].span_id:null),u(3),H("matTooltip",t.invocationId),u(),iA(t.invocationId),u(2),Be("Total latency: ",t.formatDuration(t.rootLatencyNanos)),u(2),Re(t.flatTree))},dependencies:[Wi,On,Ra,Zi,E5,nh],styles:[".trace-container[_ngcontent-%COMP%]{white-space:nowrap;font-size:12px;overflow-x:auto;padding:8px}.trace-label[_ngcontent-%COMP%]{color:var(--trace-label-color, #e3e3e3);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;font-size:12px}.trace-bar-container[_ngcontent-%COMP%]{position:relative;height:18px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:var(--mat-sys-primary);border-radius:4px;padding-left:6px;box-sizing:border-box;overflow:hidden;font-size:11px;line-height:18px;color:var(--mat-sys-on-primary);font-family:Google Sans;transition:background-color .2s,color .2s}.trace-duration[_ngcontent-%COMP%]{color:var(--trace-duration-color, #888);font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;position:relative;height:32px}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:#ccc}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:#ccc}.trace-label[_ngcontent-%COMP%]{flex:1;min-width:0;font-size:13px}.trace-bar-container[_ngcontent-%COMP%]{flex:1;min-width:0}.short-trace-bar-duration[_ngcontent-%COMP%]{position:absolute;color:var(--trace-tree-short-trace-bar-duration-color);padding-right:6px}.trace-row[_ngcontent-%COMP%]{align-items:center;cursor:pointer;scroll-margin-top:40px}.trace-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant, rgba(0, 0, 0, .04))}.trace-row.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))}.trace-row-left[_ngcontent-%COMP%]{display:flex;min-width:250px;width:20%;max-width:350px}.invocation-id-container[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:11px;font-weight:600;letter-spacing:.3px;margin-bottom:6px;padding:8px 12px;border-radius:12px 12px 0 0;background-color:var(--mat-sys-surface);display:flex;width:100%;box-sizing:border-box;align-items:center;position:sticky;top:-20px;z-index:10;box-shadow:0 2px 4px #0000000d;cursor:pointer}.invocation-id-container[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant)}.invocation-id-container.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))}.invocation-id-container[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:first-child{opacity:.8;margin-right:6px;text-transform:uppercase}.invocation-id[_ngcontent-%COMP%]{font-family:Google Sans Mono,Roboto Mono,monospace;padding:2px 6px;border-radius:4px;color:var(--mat-sys-on-surface)}.total-latency[_ngcontent-%COMP%]{margin-left:auto;background:transparent;color:var(--mat-sys-on-surface);padding:2px 8px;font-size:11px;font-weight:600;letter-spacing:.2px}.trace-row-left[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .trace-row-left[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-span-div-color)}.trace-row-left[_ngcontent-%COMP%] .is-event-row[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-is-event-row-color)}.event-tooltip-container[_ngcontent-%COMP%]{max-width:800px;max-height:200px;overflow:auto;padding:8px;background:var(--mat-sys-surface-container-low, #202124);color:var(--mat-sys-on-surface, #e8eaed);border-radius:8px;box-shadow:0 4px 16px #00000080;border:1px solid var(--mat-sys-outline-variant, rgba(255, 255, 255, .1))}.event-tooltip-container[_ngcontent-%COMP%] app-content-bubble{max-height:160px;overflow-y:auto;display:block}"]})};var FwA=["videoContainer"],LwA=["autoScroll"],GwA=["messageTextarea"],KwA=i=>({text:i,thought:!1,isReadme:!0}),UwA=()=>[],TwA=(i,e)=>e.metricName,JwA=(i,e)=>e.branchId,YwA=(i,e)=>e.event;function OwA(i,e){i&1&&(d(0,"span",14),y(1,"PASS"),E())}function HwA(i,e){i&1&&(d(0,"span",15),y(1,"FAIL"),E())}function zwA(i,e){if(i&1&&(d(0,"span",21),y(1),E()),i&2){let A=e.$implicit;ht("color",A.evalStatus==1?"var(--app-color-success)":"var(--app-color-error)"),u(),ya(" ",A.metricName,": ",A.score," ")}}function PwA(i,e){if(i&1&&(d(0,"div")(1,"span",17),y(2,"Metrics"),E(),d(3,"div",19),xe(4,zwA,2,4,"span",20,TwA),E()()),i&2){p();let A=xn(0);u(4),Re(A.overallEvalMetricResults)}}function jwA(i,e){if(i&1&&(Uo(0),d(1,"div",8)(2,"div",11)(3,"h3",12),y(4,"Evaluation Result"),E(),d(5,"div",13),Y(6,OwA,2,0,"span",14)(7,HwA,2,0,"span",15),E()(),d(8,"div",16)(9,"div")(10,"span",17),y(11,"Case ID"),E(),d(12,"div",18),y(13),E()(),d(14,"div")(15,"span",17),y(16,"Set ID"),E(),d(17,"div",18),y(18),E()(),Y(19,PwA,6,0,"div"),E()()),i&2){let A=Wo(p(2).evalCaseResult());u(6),O(A.finalEvalStatus==1?6:7),u(7),iA(A.evalId),u(5),iA(A.setId),u(),O(A.overallEvalMetricResults!=null&&A.overallEvalMetricResults.length?19:-1)}}function qwA(i,e){if(i&1&&(d(0,"div",9),gn(1,22),E()),i&2){let A=p(2);u(),H("ngComponentOutlet",A.markdownComponent)("ngComponentOutletInputs",Nl(2,KwA,A.agentReadme))}}function VwA(i,e){if(i&1&&(d(0,"div",26),lA(1,"app-trace-tree",27),E()),i&2){p();let A=xn(0),t=p(3);ht("display",t.viewMode==="traces"?"":"none"),u(),H("spans",t.spansByInvocationId.get(A.event.id)||t.spansByInvocationId.get(A.event.invocationId)||wc(6,UwA))("invocationId",A.event.invocationId||A.event.id||"")("uiEvents",t.uiEvents)("shouldShowEvent",t.shouldShowEvent)}}function WwA(i,e){if(i&1){let A=rA();Uo(0),d(1,"app-event-row",24),T("rowClick",function(n){G(A);let o=p(3);return K(o.handleRowClick(n.event,n.uiEvent,n.index))})("handleKeydown",function(n){G(A);let o=p(3);return K(o.handleKeydown.emit(n))})("cancelEditMessage",function(n){G(A);let o=p(3);return K(o.cancelEditMessage.emit(n))})("saveEditMessage",function(n){G(A);let o=p(3);return K(o.saveEditMessage.emit(n))})("userEditEvalCaseMessageChange",function(n){G(A);let o=p(3);return K(o.userEditEvalCaseMessageChange.emit(n))})("openViewImageDialog",function(n){G(A);let o=p(3);return K(o.openViewImageDialog.emit(n))})("openBase64InNewTab",function(n){G(A);let o=p(3);return K(o.openBase64InNewTab.emit(n))})("editEvalCaseMessage",function(n){G(A);let o=p(3);return K(o.editEvalCaseMessage.emit(n))})("deleteEvalCaseMessage",function(n){G(A);let o=p(3);return K(o.deleteEvalCaseMessage.emit(n))})("editFunctionArgs",function(n){G(A);let o=p(3);return K(o.editFunctionArgs.emit(n))})("clickEvent",function(n){G(A);let o=p(3);return K(o.clickEvent.emit(n))})("longRunningResponseComplete",function(n){G(A);let o=p(3);return K(o.longRunningResponseComplete.emit(n))})("agentStateClick",function(n){G(A);let o=p(3);return K(o.handleAgentStateClick(n.event,n.index))}),E(),Y(2,VwA,2,7,"div",25)}if(i&2){let A=p().$implicit,t=p(2),n=Wo(A.event),o=t.shouldShowEvent?t.shouldShowEvent(n):!0;u(),ht("display",t.viewMode==="events"&&o||t.viewMode==="traces"&&n.role==="user"&&o?"":"none"),H("isSelectable",t.viewMode!=="traces")("uiEvent",n)("index",A.index)("uiEvents",t.uiEvents)("isSelected",t.isMessageEventSelected(A.index))("appName",t.appName)("userId",t.userId)("sessionId",t.sessionId)("sessionName",t.sessionName())("evalCase",t.evalCase)("isEvalEditMode",t.isEvalEditMode)("isEvalCaseEditing",t.isEvalCaseEditing)("isEditFunctionArgsEnabled",t.isEditFunctionArgsEnabled)("userEditEvalCaseMessage",t.userEditEvalCaseMessage)("agentGraphData",t.agentGraphData)("allWorkflowNodes",t.getAllWorkflowNodes(A.index))("isUserFeedbackEnabled",t.isUserFeedbackEnabled()??!1)("isLoadingAgentResponse",t.isLoadingAgentResponse()??!1),u(),O(n.role==="bot"&&t.isFirstEventForInvocation(n,A.index)?2:-1)}}function ZwA(i,e){if(i&1&&(d(0,"span",32),y(1),E()),i&2){let A=p().$implicit;H("matTooltip","Branch "+A.branchId),u(),iA(A.branchId)}}function XwA(i,e){if(i&1){let A=rA();d(0,"app-event-row",24),T("rowClick",function(n){G(A);let o=p(5);return K(o.handleRowClick(n.event,n.uiEvent,n.index))})("handleKeydown",function(n){G(A);let o=p(5);return K(o.handleKeydown.emit(n))})("cancelEditMessage",function(n){G(A);let o=p(5);return K(o.cancelEditMessage.emit(n))})("saveEditMessage",function(n){G(A);let o=p(5);return K(o.saveEditMessage.emit(n))})("userEditEvalCaseMessageChange",function(n){G(A);let o=p(5);return K(o.userEditEvalCaseMessageChange.emit(n))})("openViewImageDialog",function(n){G(A);let o=p(5);return K(o.openViewImageDialog.emit(n))})("openBase64InNewTab",function(n){G(A);let o=p(5);return K(o.openBase64InNewTab.emit(n))})("editEvalCaseMessage",function(n){G(A);let o=p(5);return K(o.editEvalCaseMessage.emit(n))})("deleteEvalCaseMessage",function(n){G(A);let o=p(5);return K(o.deleteEvalCaseMessage.emit(n))})("editFunctionArgs",function(n){G(A);let o=p(5);return K(o.editFunctionArgs.emit(n))})("clickEvent",function(n){G(A);let o=p(5);return K(o.clickEvent.emit(n))})("longRunningResponseComplete",function(n){G(A);let o=p(5);return K(o.longRunningResponseComplete.emit(n))})("agentStateClick",function(n){G(A);let o=p(5);return K(o.handleAgentStateClick(n.event,n.index))}),E()}if(i&2){let A=e.$implicit,t=p(5),n=A.event,o=t.shouldShowEvent?t.shouldShowEvent(n):!0;ht("display",t.viewMode==="events"&&o||t.viewMode==="traces"&&n.role==="user"&&o?"":"none"),H("isSelectable",t.viewMode!=="traces")("uiEvent",n)("index",A.globalIndex)("uiEvents",t.uiEvents)("isSelected",t.isMessageEventSelected(A.globalIndex))("appName",t.appName)("userId",t.userId)("sessionId",t.sessionId)("sessionName",t.sessionName())("evalCase",t.evalCase)("isEvalEditMode",t.isEvalEditMode)("isEvalCaseEditing",t.isEvalCaseEditing)("isEditFunctionArgsEnabled",t.isEditFunctionArgsEnabled)("userEditEvalCaseMessage",t.userEditEvalCaseMessage)("agentGraphData",t.agentGraphData)("allWorkflowNodes",t.getAllWorkflowNodes(A.globalIndex))("isUserFeedbackEnabled",t.isUserFeedbackEnabled()??!1)("isLoadingAgentResponse",t.isLoadingAgentResponse()??!1)}}function $wA(i,e){if(i&1&&(d(0,"mat-tab"),yt(1,ZwA,2,2,"ng-template",29),d(2,"div",30),xe(3,XwA,1,20,"app-event-row",31,YwA),E()()),i&2){let A=e.$implicit;u(3),Re(A.events)}}function A5A(i,e){if(i&1&&(d(0,"div",23)(1,"mat-tab-group",28),xe(2,$wA,5,0,"mat-tab",null,JwA),E()()),i&2){let A=p().$implicit;u(2),Re(A.branches)}}function e5A(i,e){if(i&1&&Y(0,WwA,3,22)(1,A5A,4,0,"div",23),i&2){let A=e.$implicit;O(A.type==="event"?0:A.type==="branches"?1:-1)}}function t5A(i,e){i&1&&(d(0,"div",10),lA(1,"mat-progress-bar",33),E())}function i5A(i,e){if(i&1){let A=rA();d(0,"div",7,0),T("scroll",function(n){G(A);let o=p();return K(o.onScroll.next(n))}),Y(2,jwA,20,5,"div",8),Y(3,qwA,2,4,"div",9),xe(4,e5A,2,1,null,null,ni),Y(6,t5A,2,0,"div",10),E()}if(i&2){let A=p();u(2),O(A.showEvalSummary()&&A.evalCaseResult()?2:-1),u(),O(A.uiEvents.length===0&&A.agentReadme?3:-1),u(),Re(A.displayItems),u(2),O(A.isLoadingAgentResponse()?6:-1)}}function n5A(i,e){if(i&1){let A=rA();d(0,"div",51),lA(1,"img",52),d(2,"button",53),T("click",function(){G(A);let n=p().$index,o=p(4);return K(o.removeFile.emit(n))}),d(3,"mat-icon",54),y(4,"close"),E()()()}if(i&2){let A=p().$implicit;u(),H("src",A.url,so)}}function o5A(i,e){if(i&1){let A=rA();d(0,"div",50)(1,"button",53),T("click",function(){G(A);let n=p().$index,o=p(4);return K(o.removeFile.emit(n))}),d(2,"mat-icon",54),y(3,"close"),E()(),d(4,"div",55)(5,"mat-icon"),y(6,"insert_drive_file"),E(),d(7,"span"),y(8),E()()()}if(i&2){let A=p().$implicit;u(8),iA(A.file.name)}}function a5A(i,e){if(i&1&&(d(0,"div"),Y(1,n5A,5,1,"div",51)(2,o5A,9,1,"div",50),E()),i&2){let A=e.$implicit;u(),O(A.file.type.startsWith("image/")?1:A.file.type.startsWith("image/")?-1:2)}}function r5A(i,e){if(i&1){let A=rA();d(0,"div",50)(1,"button",53),T("click",function(){G(A);let n=p(4);return K(n.removeStateUpdate.emit())}),d(2,"mat-icon",54),y(3,"close"),E()(),d(4,"div",55)(5,"span"),y(6),E()()()}if(i&2){let A=p(4);u(6),iA(A.i18n.updatedSessionStateChipLabel)}}function s5A(i,e){if(i&1&&(d(0,"div",39),xe(1,a5A,3,1,"div",null,ni),Y(3,r5A,7,1,"div",50),E()),i&2){let A=p(3);u(),Re(A.selectedFiles),u(2),O(A.updatedSessionState?3:-1)}}function l5A(i,e){if(i&1){let A=rA();d(0,"div",35)(1,"input",36,1),T("change",function(n){G(A);let o=p(2);return K(o.fileSelect.emit(n))}),E(),d(3,"div",37)(4,"mat-form-field",38),Y(5,s5A,4,1,"div",39),d(6,"textarea",40,2),T("ngModelChange",function(n){G(A);let o=p(2);return K(o.userInputChange.emit(n))})("keydown.enter",function(n){G(A);let o=p(2);return K(o.sendMessage.emit(n))}),E(),d(8,"button",41),T("click",function(n){G(A);let o=p(2);return K(o.sendMessage.emit(n))}),d(9,"mat-icon"),y(10,"send"),E()()(),lA(11,"div",42,3),E(),d(13,"div",43)(14,"div",44)(15,"button",45),Ht(16,"async"),T("click",function(){G(A);let n=gi(2);return K(n.click())}),d(17,"mat-icon"),y(18,"attach_file"),E()(),d(19,"button",46),Ht(20,"async"),d(21,"mat-icon"),y(22,"more_vert"),E()(),d(23,"mat-menu",null,4)(25,"span",47),T("click",function(){G(A);let n=p(2);return K(n.updateState.emit())}),y(26),E()()(),d(27,"div",48)(28,"app-call-controls",49),Ht(29,"async"),T("toggleAudioRecording",function(n){G(A);let o=p(2);return K(o.toggleAudioRecording.emit(n))})("toggleVideoRecording",function(){G(A);let n=p(2);return K(n.toggleVideoRecording.emit())}),E()()()()}if(i&2){let A=gi(24),t=p(2);xA("video-streaming",t.isVideoRecording),u(5),O(t.selectedFiles.length&&t.appName!=""||t.updatedSessionState?5:-1),u(),H("ngModel",t.userInput)("placeholder",t.i18n.typeMessagePlaceholder),u(2),H("matTooltip",t.i18n.sendMessageTooltip),u(3),xA("visible",t.isVideoRecording),u(4),H("matTooltip",t.i18n.uploadFileTooltip)("disabled",!ci(16,19,t.isMessageFileUploadEnabledObs)),u(4),H("matMenuTriggerFor",A)("matTooltip",t.i18n.moreOptionsTooltip)("disabled",!ci(20,21,t.isManualStateUpdateEnabledObs)),u(6),H("matTooltip",t.i18n.updateStateMenuTooltip),u(),Be(" ",t.i18n.updateStateMenuLabel," "),u(2),H("isAudioRecording",t.isAudioRecording)("isVideoRecording",t.isVideoRecording)("micVolume",t.micVolume)("isBidiStreamingEnabled",ci(29,23,t.isBidiStreamingEnabledObs)??!1)}}function g5A(i,e){if(i&1&&Y(0,l5A,30,25,"div",34),i&2){let A=p();O(A.canEditSession()?0:-1)}}function c5A(i,e){i&1&&(d(0,"div",6),lA(1,"mat-progress-spinner",56),E())}var X2=class i{appName="";agentReadme="";sessionName=De("");uiEvents=[];showBranches=!1;traceData=[];isChatMode=!0;evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;agentGraphData=null;isEditFunctionArgsEnabled=!1;isTokenStreamingEnabled=!1;useSse=!1;userInput="";userEditEvalCaseMessage="";selectedFiles=[];updatedSessionState=null;selectedMessageIndex=void 0;isAudioRecording=!1;micVolume=0;isVideoRecording=!1;userId="";sessionId="";viewMode="events";shouldShowEvent;spansByInvocationId=new Map;displayItems=[];eventsScrollTop=-1;tracesScrollTop=-1;userInputChange=new LA;userEditEvalCaseMessageChange=new LA;clickEvent=new LA;handleKeydown=new LA;cancelEditMessage=new LA;saveEditMessage=new LA;openViewImageDialog=new LA;openBase64InNewTab=new LA;editEvalCaseMessage=new LA;deleteEvalCaseMessage=new LA;editFunctionArgs=new LA;fileSelect=new LA;removeFile=new LA;removeStateUpdate=new LA;sendMessage=new LA;updateState=new LA;toggleAudioRecording=new LA;toggleVideoRecording=new LA;longRunningResponseComplete=new LA;toggleHideIntermediateEvents=new LA;toggleSse=new LA;videoContainer;scrollContainer;textarea;scrollInterrupted=!1;scrollHeight=0;lastMessageRef=null;nextPageToken="";scrollTimeout=null;mutationObserver=null;i18n=w(q2);uiStateService=w(ql);themeService=w(jl);stringToColorService=w(PC);markdownComponent=w(P2);featureFlagService=w(mr);agentService=w(Ys);sessionService=w(Os);destroyRef=w(ar);MediaType=J0;JSON=JSON;Object=Object;String=String;isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled();canEditSession=mA(!0);isUserFeedbackEnabled=Za(this.featureFlagService.isFeedbackServiceEnabled());isLoadingAgentResponse=Za(this.agentService.getLoadingState());hideMoreOptionsButton=Za(this.featureFlagService.isMoreOptionsButtonHidden());onScroll=new te;sanitizer=w(as);hideIntermediateEvents=De(!1);invocationDisplayMap=De(new Map);evalCaseResult=De(null);showEvalSummary=De(!1);constructor(){_n(()=>{let e=this.sessionName();e&&(this.nextPageToken="",this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(to(),Ct(A=>A)).subscribe(()=>{this.uiStateService.lazyLoadMessages(e,{pageSize:100,pageToken:this.nextPageToken}).pipe(to()).subscribe()}))})}ngOnInit(){this.uiStateService.isSessionLoading().pipe(pr(this.destroyRef)).subscribe(e=>{e||this.focusInput()}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(to(),Ct(e=>e),pi(()=>Ti(this.uiStateService.onNewMessagesLoaded().pipe(Ei(e=>{this.nextPageToken=e.nextPageToken??"",e.isBackground||this.restoreScrollPosition()})),this.onScroll.pipe(pi(e=>{let A=e.target;return A.scrollTop!==0?nr:this.nextPageToken?(this.scrollHeight=A.scrollHeight,this.uiStateService.lazyLoadMessages(this.sessionName(),{pageSize:100,pageToken:this.nextPageToken}).pipe(to(),qo(()=>Px))):nr})))),pr(this.destroyRef)).subscribe()}ngAfterViewInit(){if(this.scrollContainer?.nativeElement){let e=this.scrollContainer.nativeElement;e.addEventListener("scroll",()=>{let A=Math.abs(e.scrollHeight-e.scrollTop-e.clientHeight)<50;this.scrollInterrupted=!A}),this.mutationObserver=new MutationObserver(()=>{this.scrollInterrupted||this.scrollToBottom()}),this.mutationObserver.observe(e,{childList:!0,subtree:!0,characterData:!0}),this.destroyRef.onDestroy(()=>{this.mutationObserver?.disconnect()})}}ngOnChanges(e){if(e.viewMode){let A=e.viewMode.previousValue,t=e.viewMode.currentValue;this.scrollContainer?.nativeElement&&(A==="events"?this.eventsScrollTop=this.scrollContainer.nativeElement.scrollTop:A==="traces"&&(this.tracesScrollTop=this.scrollContainer.nativeElement.scrollTop)),setTimeout(()=>{this.scrollContainer?.nativeElement&&(t==="events"&&this.eventsScrollTop!==-1?this.scrollContainer.nativeElement.scrollTop=this.eventsScrollTop:t==="traces"&&this.tracesScrollTop!==-1?this.scrollContainer.nativeElement.scrollTop=this.tracesScrollTop:this.scrollToBottom())})}if(e.appName&&this.focusInput(),(e.appName||e.uiEvents)&&this.uiEvents.length===0&&this.agentReadme&&setTimeout(()=>this.scrollToTop(),0),e.uiEvents){let A=this.uiEvents[this.uiEvents.length-1];A!==this.lastMessageRef&&((A?.role==="user"||A?.isLoading===!0)&&(this.scrollInterrupted=!1),this.scrollToBottom()),this.lastMessageRef=A}e.traceData&&this.traceData&&this.rebuildTrace(),(e.uiEvents||e.showBranches||e.viewMode)&&this.computeDisplayItems()}computeDisplayItems(){if(!this.showBranches||this.viewMode==="traces"){this.displayItems=this.uiEvents.map((t,n)=>({type:"event",event:t,index:n}));return}let e=[],A=null;this.uiEvents.forEach((t,n)=>{let o=t.event?.branch;if(o){A||(A={type:"branches",branchesMap:new Map,startIndex:n});let a=A.branchesMap.get(o)||[];a.push({event:t,globalIndex:n}),A.branchesMap.set(o,a)}else A&&(e.push(this.finalizeGroup(A)),A=null),e.push({type:"event",event:t,index:n})}),A&&e.push(this.finalizeGroup(A)),this.displayItems=e}finalizeGroup(e){let A=[];return e.branchesMap.forEach((t,n)=>{A.push({branchId:n,events:t})}),{type:"branches",branches:A,startIndex:e.startIndex}}rebuildTrace(){let e=this.traceData.reduce((A,t)=>{let n=t.trace_id,o=A.get(n);return o?(o.push(t),o.sort((a,r)=>a.start_time-r.start_time)):A.set(n,[t]),A},new Map);this.spansByInvocationId=new Map;for(let[A,t]of e){let n=t.find(o=>o.attributes!==void 0&&"gcp.vertex.agent.invocation_id"in o.attributes)?.attributes["gcp.vertex.agent.invocation_id"];if(!n){let o=t.find(a=>a.attributes!==void 0&&"gcp.vertex.agent.associated_event_ids"in a.attributes)?.attributes["gcp.vertex.agent.associated_event_ids"];o&&o.length>0&&(n=o[0])}n||(n=A),n&&this.spansByInvocationId.set(n,t)}}isFirstEventForInvocation(e,A){let t=e.event?.invocationId||e.event?.id;if(!t)return!1;for(let n=A-1;n>=0;n--){let o=this.uiEvents[n],a=o.event?.invocationId||o.event?.id;if(o.role==="bot"&&a===t)return!1}return!0}scrollToBottom(){this.sessionId&&(this.scrollInterrupted||(this.scrollTimeout&&clearTimeout(this.scrollTimeout),this.scrollTimeout=setTimeout(()=>{this.scrollContainer?.nativeElement.scrollTo({top:this.scrollContainer.nativeElement.scrollHeight,behavior:"auto"}),this.scrollTimeout=null},50)))}scrollToTop(){setTimeout(()=>{this.scrollContainer?.nativeElement.scrollTo({top:0,behavior:"smooth"})},50)}focusInput(){setTimeout(()=>{this.textarea?.nativeElement?.focus()},50)}isMessageEventSelected(e){return e===this.selectedMessageIndex}restoreScrollPosition(){if(!this.scrollHeight){this.scrollInterrupted=!1,this.scrollToBottom();return}let e=this.scrollContainer?.nativeElement;e&&(e.scrollTop=e.scrollHeight-this.scrollHeight,this.scrollHeight=0)}getAllWorkflowNodes(e){let A={};for(let t=0;t<=e;t++){let o=this.uiEvents[t].event,a=o?.actions?.agentState?.nodes,r=o?.nodeInfo?.path;a&&r&&(A[r]||(A[r]={}),Object.assign(A[r],a))}return Object.keys(A).length>0?A:null}handleAgentStateClick(e,A){e.stopPropagation(),A===this.selectedMessageIndex||this.clickEvent.emit(A)}handleRowClick(e,A,t){let n=window.getSelection();n&&n.toString().length>0||this.clickEvent.emit(t)}handleKeyboardNavigation(e){if(this.selectedMessageIndex===void 0)return;let A=document.activeElement;if(A&&(A.tagName==="INPUT"||A.tagName==="TEXTAREA"||A.isContentEditable)||e.key!=="ArrowUp"&&e.key!=="ArrowDown")return;e.preventDefault();let t;e.key==="ArrowDown"?t=this.selectedMessageIndex+1>=this.uiEvents.length?0:this.selectedMessageIndex+1:t=this.selectedMessageIndex-1<0?this.uiEvents.length-1:this.selectedMessageIndex-1,this.clickEvent.emit(t),this.scrollToSelectedMessage(t)}scrollToSelectedMessage(e){let A=e!==void 0?e:this.selectedMessageIndex;A!==void 0&&setTimeout(()=>{if(!this.scrollContainer?.nativeElement)return;let t=this.scrollContainer.nativeElement.querySelectorAll(".message-row-container");t&&t[A]&&t[A].scrollIntoView({behavior:"smooth",block:"nearest",inline:"nearest"})},50)}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-chat-panel"]],viewQuery:function(A,t){if(A&1&&Yt(FwA,5,se)(LwA,5)(GwA,5),A&2){let n;oe(n=ae())&&(t.videoContainer=n.first),oe(n=ae())&&(t.scrollContainer=n.first),oe(n=ae())&&(t.textarea=n.first)}},hostBindings:function(A,t){A&1&&T("keydown",function(o){return t.handleKeyboardNavigation(o)},mc)},inputs:{appName:"appName",agentReadme:"agentReadme",sessionName:[1,"sessionName"],uiEvents:"uiEvents",showBranches:"showBranches",traceData:"traceData",isChatMode:"isChatMode",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",agentGraphData:"agentGraphData",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",isTokenStreamingEnabled:"isTokenStreamingEnabled",useSse:"useSse",userInput:"userInput",userEditEvalCaseMessage:"userEditEvalCaseMessage",selectedFiles:"selectedFiles",updatedSessionState:"updatedSessionState",selectedMessageIndex:"selectedMessageIndex",isAudioRecording:"isAudioRecording",micVolume:"micVolume",isVideoRecording:"isVideoRecording",userId:"userId",sessionId:"sessionId",viewMode:"viewMode",shouldShowEvent:"shouldShowEvent",hideIntermediateEvents:[1,"hideIntermediateEvents"],invocationDisplayMap:[1,"invocationDisplayMap"],evalCaseResult:[1,"evalCaseResult"],showEvalSummary:[1,"showEvalSummary"]},outputs:{userInputChange:"userInputChange",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",clickEvent:"clickEvent",handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",fileSelect:"fileSelect",removeFile:"removeFile",removeStateUpdate:"removeStateUpdate",sendMessage:"sendMessage",updateState:"updateState",toggleAudioRecording:"toggleAudioRecording",toggleVideoRecording:"toggleVideoRecording",longRunningResponseComplete:"longRunningResponseComplete",toggleHideIntermediateEvents:"toggleHideIntermediateEvents",toggleSse:"toggleSse"},features:[Zt],decls:5,vars:5,consts:[["autoScroll",""],["fileInput",""],["messageTextarea",""],["videoContainer",""],["moreMenu","matMenu"],[1,"chat-messages"],[1,"loading-spinner-container"],[1,"chat-messages",3,"scroll"],[1,"eval-result-summary",2,"margin","16px","padding","16px","border-radius","8px","background","var(--mat-sys-surface-container)","border","1px solid var(--mat-sys-outline-variant)"],[1,"readme-content"],[1,"agent-loading-indicator"],[2,"display","flex","justify-content","space-between","align-items","center"],[2,"margin","0","color","var(--mat-sys-primary)"],[1,"status-card__summary"],[1,"status-card__passed",2,"font-size","16px","font-weight","600","font-family","monospace"],[1,"status-card__failed",2,"font-size","16px","font-weight","600","font-family","monospace"],[2,"margin-top","12px","display","flex","gap","24px"],[2,"color","var(--mat-sys-on-surface-variant)","font-size","13px"],[2,"font-weight","500"],[2,"display","flex","gap","8px","margin-top","4px"],[2,"font-size","13px","font-weight","500",3,"color"],[2,"font-size","13px","font-weight","500"],[3,"ngComponentOutlet","ngComponentOutletInputs"],[1,"branches-container"],[3,"rowClick","handleKeydown","cancelEditMessage","saveEditMessage","userEditEvalCaseMessageChange","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","clickEvent","longRunningResponseComplete","agentStateClick","isSelectable","uiEvent","index","uiEvents","isSelected","appName","userId","sessionId","sessionName","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userEditEvalCaseMessage","agentGraphData","allWorkflowNodes","isUserFeedbackEnabled","isLoadingAgentResponse"],[1,"trace-tree-container",3,"display"],[1,"trace-tree-container"],[3,"spans","invocationId","uiEvents","shouldShowEvent"],["animationDuration","0ms"],["mat-tab-label",""],[1,"branch-events-content"],[3,"display","isSelectable","uiEvent","index","uiEvents","isSelected","appName","userId","sessionId","sessionName","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userEditEvalCaseMessage","agentGraphData","allWorkflowNodes","isUserFeedbackEnabled","isLoadingAgentResponse"],["matTooltipPosition","above",1,"tab-name",3,"matTooltip"],["mode","indeterminate"],[1,"chat-input",3,"video-streaming"],[1,"chat-input"],["type","file","multiple","","hidden","",3,"change"],[1,"chat-input-content-row"],["appearance","outline","subscriptSizing","dynamic",1,"input-field"],[1,"file-preview"],["matInput","","cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","10",1,"chat-input-box",3,"ngModelChange","keydown.enter","ngModel","placeholder"],["mat-icon-button","","matSuffix","",1,"send-message-btn",3,"click","matTooltip"],[1,"video-container"],[1,"chat-input-actions"],[1,"chat-input-actions-left"],["mat-icon-button","",1,"chat-action-button",3,"click","matTooltip","disabled"],["mat-icon-button","",1,"chat-action-button",3,"matMenuTriggerFor","matTooltip","disabled"],["mat-menu-item","",3,"click","matTooltip"],[1,"chat-input-actions-right"],[3,"toggleAudioRecording","toggleVideoRecording","isAudioRecording","isVideoRecording","micVolume","isBidiStreamingEnabled"],[1,"file-container"],[1,"image-container"],["alt","preview",1,"image-preview",3,"src"],["mat-icon-button","",1,"delete-button",3,"click"],["color","warn"],[1,"file-info"],["mode","indeterminate","diameter","50"]],template:function(A,t){if(A&1&&(Uo(0),Ht(1,"async"),Y(2,i5A,7,3,"div",5),Y(3,g5A,1,1),Y(4,c5A,2,0,"div",6)),A&2){let n=ci(1,3,t.uiStateService.isSessionLoading());u(2),O(t.appName!=""&&!n?2:-1),u(),O(t.appName!=""&&t.isChatMode&&!n?3:-1),u(),O(n?4:-1)}},dependencies:[si,yc,cn,yn,vn,_o,On,zt,oK,ZE,WE,Wi,vi,Gs,Qa,To,by,rp,pd,Ta,HC,ns,Ds,Hl,zC,os,ZV,Ra,Zi,sK,nW,Vu,Wu,XE,N0,b5,M5,S5,$r],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%}.generated-image-container[_ngcontent-%COMP%]{max-width:400px;margin-left:20px}.generated-image[_ngcontent-%COMP%]{max-width:100%;min-width:40px;border-radius:8px}.html-artifact-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:flex-start;align-items:center}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;position:relative}.chat-sub-toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 20px;background-color:var(--mat-sys-surface-container);border-bottom:1px solid var(--mat-sys-outline-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{border-radius:16px;height:28px;align-items:center}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] .mat-button-toggle-label-content{line-height:28px;padding:0 12px;font-size:13px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-bar-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;background-color:transparent;border:none;margin-left:16px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;height:28px;cursor:pointer;transition:background-color .2s ease}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-label[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;color:var(--mat-sys-on-surface-variant);padding:0;margin-left:4px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:transparent;border:1px dashed var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;font-weight:500;height:28px;cursor:pointer;transition:all .2s ease;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant);border-color:var(--mat-sys-outline);color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;margin-right:4px} .filter-panel{min-width:max-content!important;max-width:50vw} .filter-panel .mat-mdc-menu-item{min-height:32px!important;font-size:12px!important} .filter-panel .mat-mdc-menu-item .mat-mdc-menu-item-text, .filter-panel .mat-mdc-menu-item .mdc-list-item__primary-text{font-size:12px!important;line-height:normal}.trace-tree-container[_ngcontent-%COMP%]{margin:12px 48px 12px 12px;border-radius:12px;border:none;background:var(--mat-sys-surface-container-lowest, #fff);box-shadow:0 4px 20px #0000000d,0 1px 3px #0000000a}.chat-input[_ngcontent-%COMP%]{display:flex;flex-direction:column;padding:10px;width:min(960px,88%);margin:0 auto;position:relative;transition:all .3s ease}.chat-input[_ngcontent-%COMP%] .chat-input-content-row[_ngcontent-%COMP%]{display:flex;gap:16px;align-items:flex-end;width:100%}.video-container[_ngcontent-%COMP%]{display:none;border-radius:12px;overflow:hidden;background:var(--mat-sys-surface-variant);border:1px solid var(--mat-sys-outline-variant);width:200px}.video-container.visible[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;flex-shrink:0;box-shadow:0 8px 24px #00000026}.video-container[_ngcontent-%COMP%] video{width:100%!important;height:auto!important;max-height:280px;object-fit:cover;border-radius:12px;transform:scaleX(-1)}.input-field[_ngcontent-%COMP%]{flex-grow:1;position:relative}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);border:none;box-sizing:content-box;caret-color:var(--mat-sys-primary)}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant)}.input-field[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--mat-sys-primary)!important}.chat-input-actions[_ngcontent-%COMP%]{width:100%;margin-top:10px;display:flex;justify-content:space-between;align-items:center}.chat-input-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)!important}.chat-input-actions[_ngcontent-%COMP%] button.recording[_ngcontent-%COMP%]{background-color:var(--mat-sys-error)!important;color:var(--mat-sys-on-error, #ffffff)!important}.chat-input-actions-left[_ngcontent-%COMP%], .chat-input-actions-right[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.image-container[_ngcontent-%COMP%]{position:relative;display:inline-block;border-radius:12px;overflow:hidden}.image-preview[_ngcontent-%COMP%]{display:block;width:100%;height:auto;border-radius:12px;width:80px;height:80px}.delete-button[_ngcontent-%COMP%]{position:absolute;top:1px;right:1px;border:none;border-radius:50%;padding:8px;cursor:pointer;color:var(--mat-sys-error);display:flex;align-items:center;justify-content:center;scale:.7}.delete-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}.file-container[_ngcontent-%COMP%]{position:relative;display:flex;flex-direction:column;gap:8px;height:80px;border-radius:12px}.file-info[_ngcontent-%COMP%]{margin-right:60px;padding-top:20px;padding-left:16px}.chat-input-box[_ngcontent-%COMP%]{caret-color:#fff}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}.messages-loading-container[_ngcontent-%COMP%]{margin-top:1em;margin-bottom:1em}.agent-loading-indicator[_ngcontent-%COMP%]{margin-top:16px;margin-bottom:8px;padding:0 20px;width:240px}.readme-content[_ngcontent-%COMP%]{padding:0 20px;font-size:14px;line-height:1.8;color:var(--mat-sys-on-surface)}.readme-content[_ngcontent-%COMP%] pre code{font-size:12px!important}.branches-container[_ngcontent-%COMP%]{margin:8px -20px;border-radius:8px;overflow:hidden}.light-theme[_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mat-mdc-tab-header, .light-theme [_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mat-mdc-tab-header{background:transparent!important}.light-theme[_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mat-mdc-tab, .light-theme [_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mat-mdc-tab{background:var(--mat-sys-surface-container-highest)!important}.light-theme[_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mat-mdc-tab.mdc-tab--active, .light-theme [_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mat-mdc-tab.mdc-tab--active{background:#e8f5e9!important}.light-theme[_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mdc-tab-indicator__content--underline, .light-theme [_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .mdc-tab-indicator__content--underline{border-color:#2e7d32!important}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab-header{height:32px!important;background:transparent!important;justify-content:flex-start!important}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab-label-container{border-bottom:none!important}.branches-container[_ngcontent-%COMP%] .mdc-tab-indicator__content--underline{border-color:#4caf50!important}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab{height:32px!important;font-size:12px!important;min-width:auto!important;padding:0 16px!important;flex:0 0 auto!important;border-top-left-radius:8px!important;border-top-right-radius:8px!important;background:var(--mat-sys-surface-container-highest)!important;margin-right:2px;overflow:hidden!important}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-sys-on-surface-variant)!important;opacity:.6}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab.mdc-tab--active{background:#1b4d24!important}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-sys-on-surface)!important;opacity:1!important}.branches-container[_ngcontent-%COMP%] .mat-mdc-tab-body-content{padding:0!important}.branches-container[_ngcontent-%COMP%] .mdc-tab__text-label{font-size:12px!important}.branches-container[_ngcontent-%COMP%] .tab-name{max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.branches-container[_ngcontent-%COMP%] .branch-events-content[_ngcontent-%COMP%]{padding:8px 20px;background:#1b4d24}.light-theme[_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .branch-events-content[_ngcontent-%COMP%], .light-theme [_nghost-%COMP%] .branches-container[_ngcontent-%COMP%] .branch-events-content[_ngcontent-%COMP%]{background:#e8f5e9}"]})};var C5A=[[["caption"]],[["colgroup"],["col"]],"*"],I5A=["caption","colgroup, col","*"];function d5A(i,e){i&1&&Ve(0,2)}function B5A(i,e){i&1&&(d(0,"thead",0),gn(1,1),E(),d(2,"tbody",0),gn(3,2)(4,3),E(),d(5,"tfoot",0),gn(6,4),E())}function E5A(i,e){i&1&&gn(0,1)(1,2)(2,3)(3,4)}var Ic=new MA("CDK_TABLE");var x5=(()=>{class i{template=w(lo);constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdkCellDef",""]]})}return i})(),R5=(()=>{class i{template=w(lo);constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdkHeaderCellDef",""]]})}return i})(),yZ=(()=>{class i{template=w(lo);constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdkFooterCellDef",""]]})}return i})(),oh=(()=>{class i{_table=w(Ic,{optional:!0});_hasStickyChanged=!1;get name(){return this._name}set name(A){this._setNameInput(A)}_name;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;get stickyEnd(){return this._stickyEnd}set stickyEnd(A){A!==this._stickyEnd&&(this._stickyEnd=A,this._hasStickyChanged=!0)}_stickyEnd=!1;cell;headerCell;footerCell;cssClassFriendlyName;_columnCssClassName;constructor(){}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}_updateColumnCssClassName(){this._columnCssClassName=[`cdk-column-${this.cssClassFriendlyName}`]}_setNameInput(A){A&&(this._name=A,this.cssClassFriendlyName=A.replace(/[^a-z0-9_-]/gi,"-"),this._updateColumnCssClassName())}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdkColumnDef",""]],contentQueries:function(t,n,o){if(t&1&&Vo(o,x5,5)(o,R5,5)(o,yZ,5),t&2){let a;oe(a=ae())&&(n.cell=a.first),oe(a=ae())&&(n.headerCell=a.first),oe(a=ae())&&(n.footerCell=a.first)}},inputs:{name:[0,"cdkColumnDef","name"],sticky:[2,"sticky","sticky",Ee],stickyEnd:[2,"stickyEnd","stickyEnd",Ee]}})}return i})(),_5=class{constructor(e,A){A.nativeElement.classList.add(...e._columnCssClassName)}},vZ=(()=>{class i extends _5{constructor(){super(w(oh),w(se))}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["cdk-header-cell"],["th","cdk-header-cell",""]],hostAttrs:["role","columnheader",1,"cdk-header-cell"],features:[mt]})}return i})();var bZ=(()=>{class i extends _5{constructor(){let A=w(oh),t=w(se);super(A,t);let n=A._table?._getCellRole();n&&t.nativeElement.setAttribute("role",n)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["cdk-cell"],["td","cdk-cell",""]],hostAttrs:[1,"cdk-cell"],features:[mt]})}return i})();var dx=(()=>{class i{template=w(lo);_differs=w(c1);columns;_columnsDiffer;constructor(){}ngOnChanges(A){if(!this._columnsDiffer){let t=A.columns&&A.columns.currentValue||[];this._columnsDiffer=this._differs.find(t).create(),this._columnsDiffer.diff(t)}}getColumnsDiff(){return this._columnsDiffer.diff(this.columns)}extractCellTemplate(A){return this instanceof Bx?A.headerCell.template:this instanceof Ex?A.footerCell.template:A.cell.template}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,features:[Zt]})}return i})(),Bx=(()=>{class i extends dx{_table=w(Ic,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(w(lo),w(c1))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdkHeaderRowDef",""]],inputs:{columns:[0,"cdkHeaderRowDef","columns"],sticky:[2,"cdkHeaderRowDefSticky","sticky",Ee]},features:[mt,Zt]})}return i})(),Ex=(()=>{class i extends dx{_table=w(Ic,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(w(lo),w(c1))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdkFooterRowDef",""]],inputs:{columns:[0,"cdkFooterRowDef","columns"],sticky:[2,"cdkFooterRowDefSticky","sticky",Ee]},features:[mt,Zt]})}return i})(),N5=(()=>{class i extends dx{_table=w(Ic,{optional:!0});when;constructor(){super(w(lo),w(c1))}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdkRowDef",""]],inputs:{columns:[0,"cdkRowDefColumns","columns"],when:[0,"cdkRowDefWhen","when"]},features:[mt]})}return i})(),e3=(()=>{class i{_viewContainer=w(So);cells;context;static mostRecentCellOutlet=null;constructor(){i.mostRecentCellOutlet=this}ngOnDestroy(){i.mostRecentCellOutlet===this&&(i.mostRecentCellOutlet=null)}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","cdkCellOutlet",""]]})}return i})();var hx=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["cdk-row"],["tr","cdk-row",""]],hostAttrs:["role","row",1,"cdk-row"],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(t,n){t&1&&gn(0,0)},dependencies:[e3],encapsulation:2})}return i})(),MZ=(()=>{class i{templateRef=w(lo);_contentClassNames=["cdk-no-data-row","cdk-row"];_cellClassNames=["cdk-cell","cdk-no-data-cell"];_cellSelector="td, cdk-cell, [cdk-cell], .cdk-cell";constructor(){}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["ng-template","cdkNoDataRow",""]]})}return i})(),wZ=["top","bottom","left","right"],Ix=class{_isNativeHtmlTable;_stickCellCss;_isBrowser;_needsPositionStickyOnElement;direction;_positionListener;_tableInjector;_elemSizeCache=new WeakMap;_resizeObserver=globalThis?.ResizeObserver?new globalThis.ResizeObserver(e=>this._updateCachedSizes(e)):null;_updatedStickyColumnsParamsToReplay=[];_stickyColumnsReplayTimeout=null;_cachedCellWidths=[];_borderCellCss;_destroyed=!1;constructor(e,A,t=!0,n=!0,o,a,r){this._isNativeHtmlTable=e,this._stickCellCss=A,this._isBrowser=t,this._needsPositionStickyOnElement=n,this.direction=o,this._positionListener=a,this._tableInjector=r,this._borderCellCss={top:`${A}-border-elem-top`,bottom:`${A}-border-elem-bottom`,left:`${A}-border-elem-left`,right:`${A}-border-elem-right`}}clearStickyPositioning(e,A){(A.includes("left")||A.includes("right"))&&this._removeFromStickyColumnReplayQueue(e);let t=[];for(let n of e)n.nodeType===n.ELEMENT_NODE&&t.push(n,...Array.from(n.children));jn({write:()=>{for(let n of t)this._removeStickyStyle(n,A)}},{injector:this._tableInjector})}updateStickyColumns(e,A,t,n=!0,o=!0){if(!e.length||!this._isBrowser||!(A.some(f=>f)||t.some(f=>f))){this._positionListener?.stickyColumnsUpdated({sizes:[]}),this._positionListener?.stickyEndColumnsUpdated({sizes:[]});return}let a=e[0],r=a.children.length,s=this.direction==="rtl",l=s?"right":"left",g=s?"left":"right",C=A.lastIndexOf(!0),I=t.indexOf(!0),B,Q,h;o&&this._updateStickyColumnReplayQueue({rows:[...e],stickyStartStates:[...A],stickyEndStates:[...t]}),jn({earlyRead:()=>{B=this._getCellWidths(a,n),Q=this._getStickyStartColumnPositions(B,A),h=this._getStickyEndColumnPositions(B,t)},write:()=>{for(let f of e)for(let m=0;m!!f)&&(this._positionListener.stickyColumnsUpdated({sizes:C===-1?[]:B.slice(0,C+1).map((f,m)=>A[m]?f:null)}),this._positionListener.stickyEndColumnsUpdated({sizes:I===-1?[]:B.slice(I).map((f,m)=>t[m+I]?f:null).reverse()}))}},{injector:this._tableInjector})}stickRows(e,A,t){if(!this._isBrowser)return;let n=t==="bottom"?e.slice().reverse():e,o=t==="bottom"?A.slice().reverse():A,a=[],r=[],s=[];jn({earlyRead:()=>{for(let l=0,g=0;l{let l=o.lastIndexOf(!0);for(let g=0;g{let t=e.querySelector("tfoot");t&&(A.some(n=>!n)?this._removeStickyStyle(t,["bottom"]):this._addStickyStyle(t,"bottom",0,!1))}},{injector:this._tableInjector})}destroy(){this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._resizeObserver?.disconnect(),this._destroyed=!0}_removeStickyStyle(e,A){if(!e.classList.contains(this._stickCellCss))return;for(let n of A)e.style[n]="",e.classList.remove(this._borderCellCss[n]);wZ.some(n=>A.indexOf(n)===-1&&e.style[n])?e.style.zIndex=this._getCalculatedZIndex(e):(e.style.zIndex="",this._needsPositionStickyOnElement&&(e.style.position=""),e.classList.remove(this._stickCellCss))}_addStickyStyle(e,A,t,n){e.classList.add(this._stickCellCss),n&&e.classList.add(this._borderCellCss[A]),e.style[A]=`${t}px`,e.style.zIndex=this._getCalculatedZIndex(e),this._needsPositionStickyOnElement&&(e.style.cssText+="position: -webkit-sticky; position: sticky; ")}_getCalculatedZIndex(e){let A={top:100,bottom:10,left:1,right:1},t=0;for(let n of wZ)e.style[n]&&(t+=A[n]);return t?`${t}`:""}_getCellWidths(e,A=!0){if(!A&&this._cachedCellWidths.length)return this._cachedCellWidths;let t=[],n=e.children;for(let o=0;o0;o--)A[o]&&(t[o]=n,n+=e[o]);return t}_retrieveElementSize(e){let A=this._elemSizeCache.get(e);if(A)return A;let t=e.getBoundingClientRect(),n={width:t.width,height:t.height};return this._resizeObserver&&(this._elemSizeCache.set(e,n),this._resizeObserver.observe(e,{box:"border-box"})),n}_updateStickyColumnReplayQueue(e){this._removeFromStickyColumnReplayQueue(e.rows),this._stickyColumnsReplayTimeout||this._updatedStickyColumnsParamsToReplay.push(e)}_removeFromStickyColumnReplayQueue(e){let A=new Set(e);for(let t of this._updatedStickyColumnsParamsToReplay)t.rows=t.rows.filter(n=>!A.has(n));this._updatedStickyColumnsParamsToReplay=this._updatedStickyColumnsParamsToReplay.filter(t=>!!t.rows.length)}_updateCachedSizes(e){let A=!1;for(let t of e){let n=t.borderBoxSize?.length?{width:t.borderBoxSize[0].inlineSize,height:t.borderBoxSize[0].blockSize}:{width:t.contentRect.width,height:t.contentRect.height};n.width!==this._elemSizeCache.get(t.target)?.width&&h5A(t.target)&&(A=!0),this._elemSizeCache.set(t.target,n)}A&&this._updatedStickyColumnsParamsToReplay.length&&(this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._stickyColumnsReplayTimeout=setTimeout(()=>{if(!this._destroyed){for(let t of this._updatedStickyColumnsParamsToReplay)this.updateStickyColumns(t.rows,t.stickyStartStates,t.stickyEndStates,!0,!1);this._updatedStickyColumnsParamsToReplay=[],this._stickyColumnsReplayTimeout=null}},0))}};function h5A(i){return["cdk-cell","cdk-header-cell","cdk-footer-cell"].some(e=>i.classList.contains(e))}var A3=new MA("STICKY_POSITIONING_LISTENER");var Qx=(()=>{class i{viewContainer=w(So);elementRef=w(se);constructor(){let A=w(Ic);A._rowOutlet=this,A._outletAssigned()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","rowOutlet",""]]})}return i})(),ux=(()=>{class i{viewContainer=w(So);elementRef=w(se);constructor(){let A=w(Ic);A._headerRowOutlet=this,A._outletAssigned()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","headerRowOutlet",""]]})}return i})(),px=(()=>{class i{viewContainer=w(So);elementRef=w(se);constructor(){let A=w(Ic);A._footerRowOutlet=this,A._outletAssigned()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","footerRowOutlet",""]]})}return i})(),fx=(()=>{class i{viewContainer=w(So);elementRef=w(se);constructor(){let A=w(Ic);A._noDataRowOutlet=this,A._outletAssigned()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["","noDataRowOutlet",""]]})}return i})(),mx=(()=>{class i{_differs=w(c1);_changeDetectorRef=w(wt);_elementRef=w(se);_dir=w(fo,{optional:!0});_platform=w(Ci);_viewRepeater;_viewportRuler=w(fs);_injector=w(Dt);_virtualScrollViewport=w(lK,{optional:!0,host:!0});_positionListener=w(A3,{optional:!0})||w(A3,{optional:!0,skipSelf:!0});_document=w(ii);_data;_renderedRange;_onDestroy=new te;_renderRows;_renderChangeSubscription=null;_columnDefsByName=new Map;_rowDefs;_headerRowDefs;_footerRowDefs;_dataDiffer;_defaultRowDef=null;_customColumnDefs=new Set;_customRowDefs=new Set;_customHeaderRowDefs=new Set;_customFooterRowDefs=new Set;_customNoDataRow=null;_headerRowDefChanged=!0;_footerRowDefChanged=!0;_stickyColumnStylesNeedReset=!0;_forceRecalculateCellWidths=!0;_cachedRenderRowsMap=new Map;_isNativeHtmlTable;_stickyStyler;stickyCssClass="cdk-table-sticky";needsPositionStickyOnElement=!0;_isServer;_isShowingNoDataRow=!1;_hasAllOutlets=!1;_hasInitialized=!1;_headerRowStickyUpdates=new te;_footerRowStickyUpdates=new te;_disableVirtualScrolling=!1;_getCellRole(){if(this._cellRoleInternal===void 0){let A=this._elementRef.nativeElement.getAttribute("role");return A==="grid"||A==="treegrid"?"gridcell":"cell"}return this._cellRoleInternal}_cellRoleInternal=void 0;get trackBy(){return this._trackByFn}set trackBy(A){this._trackByFn=A}_trackByFn;get dataSource(){return this._dataSource}set dataSource(A){this._dataSource!==A&&(this._switchDataSource(A),this._changeDetectorRef.markForCheck())}_dataSource;_dataSourceChanges=new te;_dataStream=new te;get multiTemplateDataRows(){return this._multiTemplateDataRows}set multiTemplateDataRows(A){this._multiTemplateDataRows=A,this._rowOutlet&&this._rowOutlet.viewContainer.length&&(this._forceRenderDataRows(),this.updateStickyColumnStyles())}_multiTemplateDataRows=!1;get fixedLayout(){return this._virtualScrollEnabled()?!0:this._fixedLayout}set fixedLayout(A){this._fixedLayout=A,this._forceRecalculateCellWidths=!0,this._stickyColumnStylesNeedReset=!0}_fixedLayout=!1;recycleRows=!1;contentChanged=new LA;viewChange=new ti({start:0,end:Number.MAX_VALUE});_rowOutlet;_headerRowOutlet;_footerRowOutlet;_noDataRowOutlet;_contentColumnDefs;_contentRowDefs;_contentHeaderRowDefs;_contentFooterRowDefs;_noDataRow;constructor(){w(new ks("role"),{optional:!0})||this._elementRef.nativeElement.setAttribute("role","table"),this._isServer=!this._platform.isBrowser,this._isNativeHtmlTable=this._elementRef.nativeElement.nodeName==="TABLE",this._dataDiffer=this._differs.find([]).create((t,n)=>this.trackBy?this.trackBy(n.dataIndex,n.data):n)}ngOnInit(){this._setupStickyStyler(),this._viewportRuler.change().pipe(ut(this._onDestroy)).subscribe(()=>{this._forceRecalculateCellWidths=!0})}ngAfterContentInit(){this._viewRepeater=this.recycleRows||this._virtualScrollEnabled()?new cf:new Cf,this._virtualScrollEnabled()&&this._setupVirtualScrolling(this._virtualScrollViewport),this._hasInitialized=!0}ngAfterContentChecked(){this._canRender()&&this._render()}ngOnDestroy(){this._stickyStyler?.destroy(),[this._rowOutlet?.viewContainer,this._headerRowOutlet?.viewContainer,this._footerRowOutlet?.viewContainer,this._cachedRenderRowsMap,this._customColumnDefs,this._customRowDefs,this._customHeaderRowDefs,this._customFooterRowDefs,this._columnDefsByName].forEach(A=>{A?.clear()}),this._headerRowDefs=[],this._footerRowDefs=[],this._defaultRowDef=null,this._headerRowStickyUpdates.complete(),this._footerRowStickyUpdates.complete(),this._onDestroy.next(),this._onDestroy.complete(),DQ(this.dataSource)&&this.dataSource.disconnect(this)}renderRows(){this._renderRows=this._getAllRenderRows();let A=this._dataDiffer.diff(this._renderRows);if(!A){this._updateNoDataRow(),this.contentChanged.next();return}let t=this._rowOutlet.viewContainer;this._viewRepeater.applyChanges(A,t,(n,o,a)=>this._getEmbeddedViewArgs(n.item,a),n=>n.item.data,n=>{n.operation===Sg.INSERTED&&n.context&&this._renderCellTemplateForItem(n.record.item.rowDef,n.context)}),this._updateRowIndexContext(),A.forEachIdentityChange(n=>{let o=t.get(n.currentIndex);o.context.$implicit=n.item.data}),this._updateNoDataRow(),this.contentChanged.next(),this.updateStickyColumnStyles()}addColumnDef(A){this._customColumnDefs.add(A)}removeColumnDef(A){this._customColumnDefs.delete(A)}addRowDef(A){this._customRowDefs.add(A)}removeRowDef(A){this._customRowDefs.delete(A)}addHeaderRowDef(A){this._customHeaderRowDefs.add(A),this._headerRowDefChanged=!0}removeHeaderRowDef(A){this._customHeaderRowDefs.delete(A),this._headerRowDefChanged=!0}addFooterRowDef(A){this._customFooterRowDefs.add(A),this._footerRowDefChanged=!0}removeFooterRowDef(A){this._customFooterRowDefs.delete(A),this._footerRowDefChanged=!0}setNoDataRow(A){this._customNoDataRow=A}updateStickyHeaderRowStyles(){let A=this._getRenderedRows(this._headerRowOutlet);if(this._isNativeHtmlTable){let n=DZ(this._headerRowOutlet,"thead");n&&(n.style.display=A.length?"":"none")}let t=this._headerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,["top"]),this._stickyStyler.stickRows(A,t,"top"),this._headerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyFooterRowStyles(){let A=this._getRenderedRows(this._footerRowOutlet);if(this._isNativeHtmlTable){let n=DZ(this._footerRowOutlet,"tfoot");n&&(n.style.display=A.length?"":"none")}let t=this._footerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,["bottom"]),this._stickyStyler.stickRows(A,t,"bottom"),this._stickyStyler.updateStickyFooterContainer(this._elementRef.nativeElement,t),this._footerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyColumnStyles(){let A=this._getRenderedRows(this._headerRowOutlet),t=this._getRenderedRows(this._rowOutlet),n=this._getRenderedRows(this._footerRowOutlet);(this._isNativeHtmlTable&&!this.fixedLayout||this._stickyColumnStylesNeedReset)&&(this._stickyStyler.clearStickyPositioning([...A,...t,...n],["left","right"]),this._stickyColumnStylesNeedReset=!1),A.forEach((o,a)=>{this._addStickyColumnStyles([o],this._headerRowDefs[a])}),this._rowDefs.forEach(o=>{let a=[];for(let r=0;r{this._addStickyColumnStyles([o],this._footerRowDefs[a])}),Array.from(this._columnDefsByName.values()).forEach(o=>o.resetStickyChanged())}stickyColumnsUpdated(A){this._positionListener?.stickyColumnsUpdated(A)}stickyEndColumnsUpdated(A){this._positionListener?.stickyEndColumnsUpdated(A)}stickyHeaderRowsUpdated(A){this._headerRowStickyUpdates.next(A),this._positionListener?.stickyHeaderRowsUpdated(A)}stickyFooterRowsUpdated(A){this._footerRowStickyUpdates.next(A),this._positionListener?.stickyFooterRowsUpdated(A)}_outletAssigned(){!this._hasAllOutlets&&this._rowOutlet&&this._headerRowOutlet&&this._footerRowOutlet&&this._noDataRowOutlet&&(this._hasAllOutlets=!0,this._canRender()&&this._render())}_canRender(){return this._hasAllOutlets&&this._hasInitialized}_render(){this._cacheRowDefs(),this._cacheColumnDefs(),!this._headerRowDefs.length&&!this._footerRowDefs.length&&this._rowDefs.length;let t=this._renderUpdatedColumns()||this._headerRowDefChanged||this._footerRowDefChanged;this._stickyColumnStylesNeedReset=this._stickyColumnStylesNeedReset||t,this._forceRecalculateCellWidths=t,this._headerRowDefChanged&&(this._forceRenderHeaderRows(),this._headerRowDefChanged=!1),this._footerRowDefChanged&&(this._forceRenderFooterRows(),this._footerRowDefChanged=!1),this.dataSource&&this._rowDefs.length>0&&!this._renderChangeSubscription?this._observeRenderChanges():this._stickyColumnStylesNeedReset&&this.updateStickyColumnStyles(),this._checkStickyStates()}_getAllRenderRows(){if(!Array.isArray(this._data)||!this._renderedRange)return[];let A=[],t=Math.min(this._data.length,this._renderedRange.end),n=this._cachedRenderRowsMap;this._cachedRenderRowsMap=new Map;for(let o=this._renderedRange.start;o{let r=n&&n.has(a)?n.get(a):[];if(r.length){let s=r.shift();return s.dataIndex=t,s}else return{data:A,rowDef:a,dataIndex:t}})}_cacheColumnDefs(){this._columnDefsByName.clear(),k5(this._getOwnDefs(this._contentColumnDefs),this._customColumnDefs).forEach(t=>{this._columnDefsByName.has(t.name),this._columnDefsByName.set(t.name,t)})}_cacheRowDefs(){this._headerRowDefs=k5(this._getOwnDefs(this._contentHeaderRowDefs),this._customHeaderRowDefs),this._footerRowDefs=k5(this._getOwnDefs(this._contentFooterRowDefs),this._customFooterRowDefs),this._rowDefs=k5(this._getOwnDefs(this._contentRowDefs),this._customRowDefs);let A=this._rowDefs.filter(t=>!t.when);this._defaultRowDef=A[0]}_renderUpdatedColumns(){let A=(a,r)=>{let s=!!r.getColumnsDiff();return a||s},t=this._rowDefs.reduce(A,!1);t&&this._forceRenderDataRows();let n=this._headerRowDefs.reduce(A,!1);n&&this._forceRenderHeaderRows();let o=this._footerRowDefs.reduce(A,!1);return o&&this._forceRenderFooterRows(),t||n||o}_switchDataSource(A){this._data=[],DQ(this.dataSource)&&this.dataSource.disconnect(this),this._renderChangeSubscription&&(this._renderChangeSubscription.unsubscribe(),this._renderChangeSubscription=null),A||(this._dataDiffer&&this._dataDiffer.diff([]),this._rowOutlet&&this._rowOutlet.viewContainer.clear()),this._dataSource=A}_observeRenderChanges(){if(!this.dataSource)return;let A;DQ(this.dataSource)?A=this.dataSource.connect(this):$I(this.dataSource)?A=this.dataSource:Array.isArray(this.dataSource)&&(A=ie(this.dataSource)),this._renderChangeSubscription=dr([A,this.viewChange]).pipe(ut(this._onDestroy)).subscribe(([t,n])=>{this._data=t||[],this._renderedRange=n,this._dataStream.next(t),this.renderRows()})}_forceRenderHeaderRows(){this._headerRowOutlet.viewContainer.length>0&&this._headerRowOutlet.viewContainer.clear(),this._headerRowDefs.forEach((A,t)=>this._renderRow(this._headerRowOutlet,A,t)),this.updateStickyHeaderRowStyles()}_forceRenderFooterRows(){this._footerRowOutlet.viewContainer.length>0&&this._footerRowOutlet.viewContainer.clear(),this._footerRowDefs.forEach((A,t)=>this._renderRow(this._footerRowOutlet,A,t)),this.updateStickyFooterRowStyles()}_addStickyColumnStyles(A,t){let n=Array.from(t?.columns||[]).map(r=>{let s=this._columnDefsByName.get(r);return s}),o=n.map(r=>r.sticky),a=n.map(r=>r.stickyEnd);this._stickyStyler.updateStickyColumns(A,o,a,!this.fixedLayout||this._forceRecalculateCellWidths)}_getRenderedRows(A){let t=[];for(let n=0;n!o.when||o.when(t,A));else{let o=this._rowDefs.find(a=>a.when&&a.when(t,A))||this._defaultRowDef;o&&n.push(o)}return n.length,n}_getEmbeddedViewArgs(A,t){let n=A.rowDef,o={$implicit:A.data};return{templateRef:n.template,context:o,index:t}}_renderRow(A,t,n,o={}){let a=A.viewContainer.createEmbeddedView(t.template,o,n);return this._renderCellTemplateForItem(t,o),a}_renderCellTemplateForItem(A,t){for(let n of this._getCellTemplates(A))e3.mostRecentCellOutlet&&e3.mostRecentCellOutlet._viewContainer.createEmbeddedView(n,t);this._changeDetectorRef.markForCheck()}_updateRowIndexContext(){let A=this._rowOutlet.viewContainer;for(let t=0,n=A.length;t{let n=this._columnDefsByName.get(t);return A.extractCellTemplate(n)})}_forceRenderDataRows(){this._dataDiffer.diff([]),this._rowOutlet.viewContainer.clear(),this.renderRows()}_checkStickyStates(){let A=(t,n)=>t||n.hasStickyChanged();this._headerRowDefs.reduce(A,!1)&&this.updateStickyHeaderRowStyles(),this._footerRowDefs.reduce(A,!1)&&this.updateStickyFooterRowStyles(),Array.from(this._columnDefsByName.values()).reduce(A,!1)&&(this._stickyColumnStylesNeedReset=!0,this.updateStickyColumnStyles())}_setupStickyStyler(){let A=this._dir?this._dir.value:"ltr",t=this._injector;this._stickyStyler=new Ix(this._isNativeHtmlTable,this.stickyCssClass,this._platform.isBrowser,this.needsPositionStickyOnElement,A,this,t),(this._dir?this._dir.change:ie()).pipe(ut(this._onDestroy)).subscribe(n=>{this._stickyStyler.direction=n,this.updateStickyColumnStyles()})}_setupVirtualScrolling(A){let t=typeof requestAnimationFrame<"u"?ZI:vD;this.viewChange.next({start:0,end:0}),A.renderedRangeStream.pipe(a1(0,t),ut(this._onDestroy)).subscribe(this.viewChange),A.attach({dataStream:this._dataStream,measureRangeSize:(n,o)=>this._measureRangeSize(n,o)}),dr([A.renderedContentOffset,this._headerRowStickyUpdates]).pipe(ut(this._onDestroy)).subscribe(([n,o])=>{if(!(!o.sizes||!o.offsets||!o.elements))for(let a=0;a{if(!(!o.sizes||!o.offsets||!o.elements))for(let a=0;a!t._table||t._table===this)}_updateNoDataRow(){let A=this._customNoDataRow||this._noDataRow;if(!A)return;let t=this._rowOutlet.viewContainer.length===0;if(t===this._isShowingNoDataRow)return;let n=this._noDataRowOutlet.viewContainer;if(t){let o=n.createEmbeddedView(A.templateRef),a=o.rootNodes[0];if(o.rootNodes.length===1&&a?.nodeType===this._document.ELEMENT_NODE){a.setAttribute("role","row"),a.classList.add(...A._contentClassNames);let r=a.querySelectorAll(A._cellSelector);for(let s=0;s=A.end||t!=="vertical")return 0;let n=this.viewChange.value,o=this._rowOutlet.viewContainer;A.startn.end;let a=A.start-n.start,r=A.end-A.start,s,l;for(let I=0;I-1;I--){let B=o.get(I+a);if(B&&B.rootNodes.length){l=B.rootNodes[B.rootNodes.length-1];break}}let g=s?.getBoundingClientRect?.(),C=l?.getBoundingClientRect?.();return g&&C?C.bottom-g.top:0}_virtualScrollEnabled(){return!this._disableVirtualScrolling&&this._virtualScrollViewport!=null}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["cdk-table"],["table","cdk-table",""]],contentQueries:function(t,n,o){if(t&1&&Vo(o,MZ,5)(o,oh,5)(o,N5,5)(o,Bx,5)(o,Ex,5),t&2){let a;oe(a=ae())&&(n._noDataRow=a.first),oe(a=ae())&&(n._contentColumnDefs=a),oe(a=ae())&&(n._contentRowDefs=a),oe(a=ae())&&(n._contentHeaderRowDefs=a),oe(a=ae())&&(n._contentFooterRowDefs=a)}},hostAttrs:[1,"cdk-table"],hostVars:2,hostBindings:function(t,n){t&2&&xA("cdk-table-fixed-layout",n.fixedLayout)},inputs:{trackBy:"trackBy",dataSource:"dataSource",multiTemplateDataRows:[2,"multiTemplateDataRows","multiTemplateDataRows",Ee],fixedLayout:[2,"fixedLayout","fixedLayout",Ee],recycleRows:[2,"recycleRows","recycleRows",Ee]},outputs:{contentChanged:"contentChanged"},exportAs:["cdkTable"],features:[Et([{provide:Ic,useExisting:i},{provide:A3,useValue:null}])],ngContentSelectors:I5A,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(t,n){t&1&&(Nt(C5A),Ve(0),Ve(1,1),Y(2,d5A,1,0),Y(3,B5A,7,0)(4,E5A,4,0)),t&2&&(u(2),O(n._isServer?2:-1),u(),O(n._isNativeHtmlTable?3:4))},dependencies:[ux,Qx,fx,px],styles:[`.cdk-table-fixed-layout{table-layout:fixed} +`],encapsulation:2})}return i})();function k5(i,e){return i.concat(Array.from(e))}function DZ(i,e){let A=e.toUpperCase(),t=i.viewContainer.element.nativeElement;for(;t;){let n=t.nodeType===1?t.nodeName:null;if(n===A)return t;if(n==="TABLE")break;t=t.parentNode}return null}var Q5A=[[["caption"]],[["colgroup"],["col"]],"*"],u5A=["caption","colgroup, col","*"];function p5A(i,e){i&1&&Ve(0,2)}function f5A(i,e){i&1&&(d(0,"thead",0),gn(1,1),E(),d(2,"tbody",2),gn(3,3)(4,4),E(),d(5,"tfoot",0),gn(6,5),E())}function m5A(i,e){i&1&&gn(0,1)(1,3)(2,4)(3,5)}var SZ=(()=>{class i extends mx{stickyCssClass="mat-mdc-table-sticky";needsPositionStickyOnElement=!1;static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275cmp=bA({type:i,selectors:[["mat-table"],["table","mat-table",""]],hostAttrs:[1,"mat-mdc-table","mdc-data-table__table"],hostVars:2,hostBindings:function(t,n){t&2&&xA("mat-table-fixed-layout",n.fixedLayout)},exportAs:["matTable"],features:[Et([{provide:mx,useExisting:i},{provide:Ic,useExisting:i},{provide:A3,useValue:null}]),mt],ngContentSelectors:u5A,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["role","rowgroup",1,"mdc-data-table__content"],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(t,n){t&1&&(Nt(Q5A),Ve(0),Ve(1,1),Y(2,p5A,1,0),Y(3,f5A,7,0)(4,m5A,4,0)),t&2&&(u(2),O(n._isServer?2:-1),u(),O(n._isNativeHtmlTable?3:4))},dependencies:[ux,Qx,fx,px],styles:[`.mat-mdc-table-sticky{position:sticky !important}mat-table{display:block}mat-header-row{min-height:var(--mat-table-header-container-height, 56px)}mat-row{min-height:var(--mat-table-row-item-container-height, 52px)}mat-footer-row{min-height:var(--mat-table-footer-container-height, 52px)}mat-row,mat-header-row,mat-footer-row{display:flex;border-width:0;border-bottom-width:1px;border-style:solid;align-items:center;box-sizing:border-box}mat-cell:first-of-type,mat-header-cell:first-of-type,mat-footer-cell:first-of-type{padding-left:24px}[dir=rtl] mat-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:first-of-type:not(:only-of-type){padding-left:0;padding-right:24px}mat-cell:last-of-type,mat-header-cell:last-of-type,mat-footer-cell:last-of-type{padding-right:24px}[dir=rtl] mat-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:last-of-type:not(:only-of-type){padding-right:0;padding-left:24px}mat-cell,mat-header-cell,mat-footer-cell{flex:1;display:flex;align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit}.mat-mdc-table{min-width:100%;border:0;border-spacing:0;table-layout:auto;white-space:normal;background-color:var(--mat-table-background-color, var(--mat-sys-surface))}.mat-table-fixed-layout{table-layout:fixed}.mdc-data-table__cell{box-sizing:border-box;overflow:hidden;text-align:start;text-overflow:ellipsis}.mdc-data-table__cell,.mdc-data-table__header-cell{padding:0 16px}.mat-mdc-header-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-header-container-height, 56px);color:var(--mat-table-header-headline-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-header-headline-font, var(--mat-sys-title-small-font, Roboto, sans-serif));line-height:var(--mat-table-header-headline-line-height, var(--mat-sys-title-small-line-height));font-size:var(--mat-table-header-headline-size, var(--mat-sys-title-small-size, 14px));font-weight:var(--mat-table-header-headline-weight, var(--mat-sys-title-small-weight, 500))}.mat-mdc-row{height:var(--mat-table-row-item-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)))}.mat-mdc-row,.mdc-data-table__content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-table-row-item-label-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-row-item-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-row-item-label-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-row-item-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-footer-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-footer-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-footer-supporting-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-footer-supporting-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-footer-supporting-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-footer-supporting-text-weight, var(--mat-sys-body-medium-weight));letter-spacing:var(--mat-table-footer-supporting-text-tracking, var(--mat-sys-body-medium-tracking))}.mat-mdc-header-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-header-headline-tracking, var(--mat-sys-title-small-tracking));font-weight:inherit;line-height:inherit;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;outline:none;text-align:start}.mdc-data-table__row:last-child>.mat-mdc-header-cell{border-bottom:none}.mat-mdc-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking));line-height:inherit}.mdc-data-table__row:last-child>.mat-mdc-cell{border-bottom:none}.mat-mdc-footer-cell{letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking))}mat-row.mat-mdc-row,mat-header-row.mat-mdc-header-row,mat-footer-row.mat-mdc-footer-row{border-bottom:none}.mat-mdc-table tbody,.mat-mdc-table tfoot,.mat-mdc-table thead,.mat-mdc-cell,.mat-mdc-footer-cell,.mat-mdc-header-row,.mat-mdc-row,.mat-mdc-footer-row,.mat-mdc-table .mat-mdc-header-cell{background:inherit}.mat-mdc-table mat-header-row.mat-mdc-header-row,.mat-mdc-table mat-row.mat-mdc-row,.mat-mdc-table mat-footer-row.mat-mdc-footer-cell{height:unset}mat-header-cell.mat-mdc-header-cell,mat-cell.mat-mdc-cell,mat-footer-cell.mat-mdc-footer-cell{align-self:stretch} +`],encapsulation:2})}return i})(),kZ=(()=>{class i extends x5{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["","matCellDef",""]],features:[Et([{provide:x5,useExisting:i}]),mt]})}return i})(),_Z=(()=>{class i extends R5{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["","matHeaderCellDef",""]],features:[Et([{provide:R5,useExisting:i}]),mt]})}return i})();var xZ=(()=>{class i extends oh{get name(){return this._name}set name(A){this._setNameInput(A)}_updateColumnCssClassName(){super._updateColumnCssClassName(),this._columnCssClassName.push(`mat-column-${this.cssClassFriendlyName}`)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["","matColumnDef",""]],inputs:{name:[0,"matColumnDef","name"]},features:[Et([{provide:oh,useExisting:i}]),mt]})}return i})(),RZ=(()=>{class i extends vZ{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["mat-header-cell"],["th","mat-header-cell",""]],hostAttrs:["role","columnheader",1,"mat-mdc-header-cell","mdc-data-table__header-cell"],features:[mt]})}return i})();var NZ=(()=>{class i extends bZ{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["mat-cell"],["td","mat-cell",""]],hostAttrs:[1,"mat-mdc-cell","mdc-data-table__cell"],features:[mt]})}return i})();var FZ=(()=>{class i extends N5{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275dir=qA({type:i,selectors:[["","matRowDef",""]],inputs:{columns:[0,"matRowDefColumns","columns"],when:[0,"matRowDefWhen","when"]},features:[Et([{provide:N5,useExisting:i}]),mt]})}return i})();var LZ=(()=>{class i extends hx{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Mi(i)))(n||i)}})();static \u0275cmp=bA({type:i,selectors:[["mat-row"],["tr","mat-row",""]],hostAttrs:["role","row",1,"mat-mdc-row","mdc-data-table__row"],exportAs:["matRow"],features:[Et([{provide:hx,useExisting:i}]),mt],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(t,n){t&1&&gn(0,0)},dependencies:[e3],encapsulation:2})}return i})();var w5A=9007199254740991,qI=class extends wQ{_data;_renderData=new ti([]);_filter=new ti("");_internalPageChanges=new te;_renderChangesSubscription=null;filteredData;get data(){return this._data.value}set data(e){e=Array.isArray(e)?e:[],this._data.next(e),this._renderChangesSubscription||this._filterData(e)}get filter(){return this._filter.value}set filter(e){this._filter.next(e),this._renderChangesSubscription||this._filterData(this.data)}get sort(){return this._sort}set sort(e){this._sort=e,this._updateChangeSubscription()}_sort;get paginator(){return this._paginator}set paginator(e){this._paginator=e,this._updateChangeSubscription()}_paginator;sortingDataAccessor=(e,A)=>{let t=e[A];if(z3(t)){let n=Number(t);return n{let t=A.active,n=A.direction;return!t||n==""?e:e.sort((o,a)=>{let r=this.sortingDataAccessor(o,t),s=this.sortingDataAccessor(a,t),l=typeof r,g=typeof s;l!==g&&(l==="number"&&(r+=""),g==="number"&&(s+=""));let C=0;return r!=null&&s!=null?r>s?C=1:r{let t=A.trim().toLowerCase();return Object.values(e).some(n=>`${n}`.toLowerCase().includes(t))};constructor(e=[]){super(),this._data=new ti(e),this._updateChangeSubscription()}_updateChangeSubscription(){let e=this._sort?Ti(this._sort.sortChange,this._sort.initialized):ie(null),A=this._paginator?Ti(this._paginator.page,this._internalPageChanges,this._paginator.initialized):ie(null),t=this._data,n=dr([t,this._filter]).pipe(ye(([r])=>this._filterData(r))),o=dr([n,e]).pipe(ye(([r])=>this._orderData(r))),a=dr([o,A]).pipe(ye(([r])=>this._pageData(r)));this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=a.subscribe(r=>this._renderData.next(r))}_filterData(e){return this.filteredData=this.filter==null||this.filter===""?e:e.filter(A=>this.filterPredicate(A,this.filter)),this.paginator&&this._updatePaginator(this.filteredData.length),this.filteredData}_orderData(e){return this.sort?this.sortData(e.slice(),this.sort):e}_pageData(e){if(!this.paginator)return e;let A=this.paginator.pageIndex*this.paginator.pageSize;return e.slice(A,A+this.paginator.pageSize)}_updatePaginator(e){Promise.resolve().then(()=>{let A=this.paginator;if(A&&(A.length=e,A.pageIndex>0)){let t=Math.ceil(A.length/A.pageSize)-1||0,n=Math.min(A.pageIndex,t);n!==A.pageIndex&&(A.pageIndex=n,this._internalPageChanges.next())}})}connect(){return this._renderChangesSubscription||this._updateChangeSubscription(),this._renderData}disconnect(){this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=null}};var ah=[{metricName:"tool_trajectory_avg_score",threshold:1},{metricName:"response_match_score",threshold:.7}];var F5="0123456789abcdef",L5=class i{constructor(e){this.bytes=e}static ofInner(e){if(e.length!==16)throw new TypeError("not 128-bit length");return new i(e)}static fromFieldsV7(e,A,t,n){if(!Number.isInteger(e)||!Number.isInteger(A)||!Number.isInteger(t)||!Number.isInteger(n)||e<0||A<0||t<0||n<0||e>0xffffffffffff||A>4095||t>1073741823||n>4294967295)throw new RangeError("invalid field value");let o=new Uint8Array(16);return o[0]=e/2**40,o[1]=e/2**32,o[2]=e/2**24,o[3]=e/2**16,o[4]=e/2**8,o[5]=e,o[6]=112|A>>>8,o[7]=A,o[8]=128|t>>>24,o[9]=t>>>16,o[10]=t>>>8,o[11]=t,o[12]=n>>>24,o[13]=n>>>16,o[14]=n>>>8,o[15]=n,new i(o)}static parse(e){var A,t,n,o;let a;switch(e.length){case 32:a=(A=/^[0-9a-f]{32}$/i.exec(e))===null||A===void 0?void 0:A[0];break;case 36:a=(t=/^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(e))===null||t===void 0?void 0:t.slice(1,6).join("");break;case 38:a=(n=/^\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\}$/i.exec(e))===null||n===void 0?void 0:n.slice(1,6).join("");break;case 45:a=(o=/^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(e))===null||o===void 0?void 0:o.slice(1,6).join("");break;default:break}if(a){let r=new Uint8Array(16);for(let s=0;s<16;s+=4){let l=parseInt(a.substring(2*s,2*s+8),16);r[s+0]=l>>>24,r[s+1]=l>>>16,r[s+2]=l>>>8,r[s+3]=l}return new i(r)}else throw new SyntaxError("could not parse UUID string")}toString(){let e="";for(let A=0;A>>4),e+=F5.charAt(this.bytes[A]&15),(A===3||A===5||A===7||A===9)&&(e+="-");return e}toHex(){let e="";for(let A=0;A>>4),e+=F5.charAt(this.bytes[A]&15);return e}toJSON(){return this.toString()}getVariant(){let e=this.bytes[8]>>>4;if(e<0)throw new Error("unreachable");if(e<=7)return this.bytes.every(A=>A===0)?"NIL":"VAR_0";if(e<=11)return"VAR_10";if(e<=13)return"VAR_110";if(e<=15)return this.bytes.every(A=>A===255)?"MAX":"VAR_RESERVED";throw new Error("unreachable")}getVersion(){return this.getVariant()==="VAR_10"?this.bytes[6]>>>4:void 0}clone(){return new i(this.bytes.slice(0))}equals(e){return this.compareTo(e)===0}compareTo(e){for(let A=0;A<16;A++){let t=this.bytes[A]-e.bytes[A];if(t!==0)return Math.sign(t)}return 0}},wx=class{constructor(e){this.timestamp_biased=0,this.counter=0,this.random=e??D5A()}generate(){return this.generateOrResetCore(Date.now(),1e4)}generateOrAbort(){return this.generateOrAbortCore(Date.now(),1e4)}generateOrResetCore(e,A){let t=this.generateOrAbortCore(e,A);return t===void 0&&(this.timestamp_biased=0,t=this.generateOrAbortCore(e,A)),t}generateOrAbortCore(e,A){if(!Number.isInteger(e)||e<0||e>0xffffffffffff)throw new RangeError("`unixTsMs` must be a 48-bit unsigned integer");if(A<0||A>0xffffffffffff)throw new RangeError("`rollbackAllowance` out of reasonable range");if(e++,e>this.timestamp_biased)this.timestamp_biased=e,this.resetCounter();else if(e+A>=this.timestamp_biased)this.counter++,this.counter>4398046511103&&(this.timestamp_biased++,this.resetCounter());else return;return L5.fromFieldsV7(this.timestamp_biased-1,Math.trunc(this.counter/2**30),this.counter&2**30-1,this.random.nextUint32())}resetCounter(){this.counter=this.random.nextUint32()*1024+(this.random.nextUint32()&1023)}generateV4(){let e=new Uint8Array(Uint32Array.of(this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32()).buffer);return e[6]=64|e[6]>>>4,e[8]=128|e[8]>>>2,L5.ofInner(e)}},D5A=()=>{if(typeof crypto<"u"&&typeof crypto.getRandomValues<"u")return new Dx;if(typeof UUIDV7_DENY_WEAK_RNG<"u"&&UUIDV7_DENY_WEAK_RNG)throw new Error("no cryptographically strong RNG available");return{nextUint32:()=>Math.trunc(Math.random()*65536)*65536+Math.trunc(Math.random()*65536)}},Dx=class{constructor(){this.buffer=new Uint32Array(8),this.cursor=65535}nextUint32(){return this.cursor>=this.buffer.length&&(crypto.getRandomValues(this.buffer),this.cursor=0),this.buffer[this.cursor++]}},GZ;var G5=()=>y5A().toString(),y5A=()=>(GZ||(GZ=new wx)).generateV4();function v5A(i,e){i&1&&(d(0,"div",1),lA(1,"mat-progress-spinner",6),E()),i&2&&(u(),H("diameter",28)("strokeWidth",3))}function b5A(i,e){if(i&1){let A=rA();d(0,"mat-form-field",2)(1,"input",7),yi("ngModelChange",function(n){G(A);let o=p();return hi(o.newCaseId,n)||(o.newCaseId=n),K(n)}),T("keydown.enter",function(){G(A);let n=p();return K(n.createNewEvalCase())}),E()()}if(i&2){let A=p();u(),Di("ngModel",A.newCaseId)}}var K5=class i{evalService=w(Jc);data=w(xo);dialogRef=w(Vn);newCaseId=this.data.defaultName||"case_"+G5().slice(0,6);loading=!1;constructor(){}createNewEvalCase(){if(!this.newCaseId||this.newCaseId=="")alert("Cannot create eval set with empty id!");else{if(this.data.existingCases?.includes(this.newCaseId)&&!confirm(`Eval case "${this.newCaseId}" already exists. Do you want to overwrite it?`))return;this.loading=!0,this.evalService.addCurrentSession(this.data.appName,this.data.evalSetId,this.newCaseId,this.data.sessionId,this.data.userId).subscribe({next:e=>{this.dialogRef.close(!0)},error:e=>{this.loading=!1,alert("Failed to add session to eval set!")}})}}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-add-eval-session-dialog"]],decls:11,vars:3,consts:[["mat-dialog-title",""],[2,"display","flex","justify-content","center","padding","20px"],[2,"padding-left","20px","padding-right","24px"],["align","end"],["mat-button","","mat-dialog-close","",3,"disabled"],["mat-button","","cdkFocusInitial","",3,"click","disabled"],["mode","indeterminate",3,"diameter","strokeWidth"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"]],template:function(A,t){A&1&&(d(0,"h2",0),y(1,"Add Current Session To Eval Set"),E(),d(2,"mat-dialog-content"),y(3,` Please enter the eval case name +`),E(),Y(4,v5A,2,2,"div",1)(5,b5A,2,1,"mat-form-field",2),d(6,"mat-dialog-actions",3)(7,"button",4),y(8,"Cancel"),E(),d(9,"button",5),T("click",function(){return t.createNewEvalCase()}),y(10,"Create"),E()()),A&2&&(u(4),O(t.loading?4:5),u(3),H("disabled",t.loading),u(2),H("disabled",t.loading))},dependencies:[na,ua,To,Qa,cn,yn,vn,_o,pa,Si,OC,os],styles:["h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important}"]})};var M5A={allEvalSetsHeader:"Eval sets",createNewEvalSetTooltip:"Create new evaluation set",createNewEvalSetTitle:"Create New Evaluation Set",evalSetDescription:"An evaluation set is a curated collection of evaluation cases, where each case includes input-output examples for assessing agent performance.",createEvalSetButton:"Create Evaluation Set",runEvaluationButton:"Run All",runSelectedEvaluationButton:"Run Selected",viewEvalRunHistoryTooltip:"View eval run history",caseIdHeader:"Case ID",resultHeader:"Result",viewEvalRunResultTooltip:"View eval run result",passStatus:"Pass",failStatus:"Fail",passStatusCaps:"PASS",failStatusCaps:"FAIL",passedSuffix:"Passed",failedSuffix:"Failed",addSessionToSetButtonPrefix:"From Current Session",deleteEvalCaseTooltip:"Delete eval case",editEvalCaseTooltip:"Edit eval case",deleteEvalSetTooltip:"Delete eval set"},KZ=new MA("Eval Tab Messages",{factory:()=>M5A});function S5A(i,e){if(i&1){let A=rA();d(0,"mat-form-field",1)(1,"mat-label"),y(2,"Execution Mode"),E(),d(3,"mat-select",6),T("selectionChange",function(n){G(A);let o=p();return K(o.executionMode=n.value)}),d(4,"mat-option",7),y(5,"Live"),E(),d(6,"mat-option",8),y(7,"Replay"),E()()()}if(i&2){let A=p();u(3),H("value",A.executionMode)}}var U5=class i{evalService=w(Jc);featureFlagService=w(mr);data=w(xo);dialogRef=w(Vn);newSetId=this.data.defaultName||"evalset_"+G5().slice(0,6);executionMode="live";isEvalV2Enabled=!1;constructor(){this.featureFlagService.isEvalV2Enabled().subscribe(e=>{this.isEvalV2Enabled=e})}createNewEvalSet(){if(!this.newSetId||this.newSetId=="")alert("Cannot create eval set with empty id!");else{let e=this.isEvalV2Enabled?this.executionMode:void 0;this.evalService.createNewEvalSet(this.data.appName,this.newSetId,e).subscribe(A=>{this.dialogRef.close(!0)})}}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-new-eval-set-dialog-component"]],decls:14,vars:2,consts:[["mat-dialog-title",""],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"],[3,"selectionChange","value"],["value","live"],["value","replay"]],template:function(A,t){A&1&&(d(0,"h2",0),y(1,"Create New Eval Set"),E(),d(2,"mat-dialog-content"),y(3,` Please enter the eval set name +`),E(),d(4,"mat-form-field",1)(5,"mat-label"),y(6,"Eval Set Name"),E(),d(7,"input",2),yi("ngModelChange",function(o){return hi(t.newSetId,o)||(t.newSetId=o),o}),T("keydown.enter",function(){return t.createNewEvalSet()}),E()(),Y(8,S5A,8,1,"mat-form-field",1),d(9,"mat-dialog-actions",3)(10,"button",4),y(11,"Cancel"),E(),d(12,"button",5),T("click",function(){return t.createNewEvalSet()}),y(13,"Create"),E()()),A&2&&(u(7),Di("ngModel",t.newSetId),u(),O(t.isEvalV2Enabled?8:-1))},dependencies:[na,ua,To,Qa,cn,yn,vn,_o,pa,Si,OC,N0,us,zl,Kr],styles:["h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important}"]})};var k5A=["knob"],_5A=["valueIndicatorContainer"];function x5A(i,e){if(i&1&&(d(0,"div",2,1)(2,"div",5)(3,"span",6),y(4),E()()()),i&2){let A=p();u(4),iA(A.valueIndicatorText)}}var R5A=["trackActive"],N5A=["*"];function F5A(i,e){if(i&1&&lA(0,"div"),i&2){let A=e.$implicit,t=e.$index,n=p(3);go(A===0?"mdc-slider__tick-mark--active":"mdc-slider__tick-mark--inactive"),ht("transform",n._calcTickMarkTransform(t))}}function L5A(i,e){if(i&1&&xe(0,F5A,1,4,"div",8,Nr),i&2){let A=p(2);Re(A._tickMarks)}}function G5A(i,e){if(i&1&&(d(0,"div",6,1),Y(2,L5A,2,0),E()),i&2){let A=p();u(2),O(A._cachedWidth?2:-1)}}function K5A(i,e){if(i&1&&lA(0,"mat-slider-visual-thumb",7),i&2){let A=p();H("discrete",A.discrete)("thumbPosition",1)("valueIndicatorText",A.startValueIndicatorText)}}var xi=(function(i){return i[i.START=1]="START",i[i.END=2]="END",i})(xi||{}),rh=(function(i){return i[i.ACTIVE=0]="ACTIVE",i[i.INACTIVE=1]="INACTIVE",i})(rh||{}),yx=new MA("_MatSlider"),UZ=new MA("_MatSliderThumb"),U5A=new MA("_MatSliderRangeThumb"),TZ=new MA("_MatSliderVisualThumb");var T5A=(()=>{class i{_cdr=w(wt);_ngZone=w(qe);_slider=w(yx);_renderer=w(qi);_listenerCleanups;discrete=!1;thumbPosition;valueIndicatorText;_ripple;_knob;_valueIndicatorContainer;_sliderInput;_sliderInputEl;_hoverRippleRef;_focusRippleRef;_activeRippleRef;_isHovered=!1;_isActive=!1;_isValueIndicatorVisible=!1;_hostElement=w(se).nativeElement;_platform=w(Ci);constructor(){}ngAfterViewInit(){let A=this._slider._getInput(this.thumbPosition);A&&(this._ripple.radius=24,this._sliderInput=A,this._sliderInputEl=this._sliderInput._hostElement,this._ngZone.runOutsideAngular(()=>{let t=this._sliderInputEl,n=this._renderer;this._listenerCleanups=[n.listen(t,"pointermove",this._onPointerMove),n.listen(t,"pointerdown",this._onDragStart),n.listen(t,"pointerup",this._onDragEnd),n.listen(t,"pointerleave",this._onMouseLeave),n.listen(t,"focus",this._onFocus),n.listen(t,"blur",this._onBlur)]}))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A())}_onPointerMove=A=>{if(this._sliderInput._isFocused)return;let t=this._hostElement.getBoundingClientRect(),n=this._slider._isCursorOnSliderThumb(A,t);this._isHovered=n,n?this._showHoverRipple():this._hideRipple(this._hoverRippleRef)};_onMouseLeave=()=>{this._isHovered=!1,this._hideRipple(this._hoverRippleRef)};_onFocus=()=>{this._hideRipple(this._hoverRippleRef),this._showFocusRipple(),this._hostElement.classList.add("mdc-slider__thumb--focused")};_onBlur=()=>{this._isActive||this._hideRipple(this._focusRippleRef),this._isHovered&&this._showHoverRipple(),this._hostElement.classList.remove("mdc-slider__thumb--focused")};_onDragStart=A=>{A.button===0&&(this._isActive=!0,this._showActiveRipple())};_onDragEnd=()=>{this._isActive=!1,this._hideRipple(this._activeRippleRef),this._sliderInput._isFocused||this._hideRipple(this._focusRippleRef),this._platform.SAFARI&&this._showHoverRipple()};_showHoverRipple(){this._isShowingRipple(this._hoverRippleRef)||(this._hoverRippleRef=this._showRipple({enterDuration:0,exitDuration:0}),this._hoverRippleRef?.element.classList.add("mat-mdc-slider-hover-ripple"))}_showFocusRipple(){this._isShowingRipple(this._focusRippleRef)||(this._focusRippleRef=this._showRipple({enterDuration:0,exitDuration:0},!0),this._focusRippleRef?.element.classList.add("mat-mdc-slider-focus-ripple"))}_showActiveRipple(){this._isShowingRipple(this._activeRippleRef)||(this._activeRippleRef=this._showRipple({enterDuration:225,exitDuration:400}),this._activeRippleRef?.element.classList.add("mat-mdc-slider-active-ripple"))}_isShowingRipple(A){return A?.state===Qs.FADING_IN||A?.state===Qs.VISIBLE}_showRipple(A,t){if(!this._slider.disabled&&(this._showValueIndicator(),this._slider._isRange&&this._slider._getThumb(this.thumbPosition===xi.START?xi.END:xi.START)._showValueIndicator(),!(this._slider._globalRippleOptions?.disabled&&!t)))return this._ripple.launch({animation:this._slider._noopAnimations?{enterDuration:0,exitDuration:0}:A,centered:!0,persistent:!0})}_hideRipple(A){if(A?.fadeOut(),this._isShowingAnyRipple())return;this._slider._isRange||this._hideValueIndicator();let t=this._getSibling();t._isShowingAnyRipple()||(this._hideValueIndicator(),t._hideValueIndicator())}_showValueIndicator(){this._hostElement.classList.add("mdc-slider__thumb--with-indicator")}_hideValueIndicator(){this._hostElement.classList.remove("mdc-slider__thumb--with-indicator")}_getSibling(){return this._slider._getThumb(this.thumbPosition===xi.START?xi.END:xi.START)}_getValueIndicatorContainer(){return this._valueIndicatorContainer?.nativeElement}_getKnob(){return this._knob.nativeElement}_isShowingAnyRipple(){return this._isShowingRipple(this._hoverRippleRef)||this._isShowingRipple(this._focusRippleRef)||this._isShowingRipple(this._activeRippleRef)}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=bA({type:i,selectors:[["mat-slider-visual-thumb"]],viewQuery:function(t,n){if(t&1&&Yt(es,5)(k5A,5)(_5A,5),t&2){let o;oe(o=ae())&&(n._ripple=o.first),oe(o=ae())&&(n._knob=o.first),oe(o=ae())&&(n._valueIndicatorContainer=o.first)}},hostAttrs:[1,"mdc-slider__thumb","mat-mdc-slider-visual-thumb"],inputs:{discrete:"discrete",thumbPosition:"thumbPosition",valueIndicatorText:"valueIndicatorText"},features:[Et([{provide:TZ,useExisting:i}])],decls:4,vars:2,consts:[["knob",""],["valueIndicatorContainer",""],[1,"mdc-slider__value-indicator-container"],[1,"mdc-slider__thumb-knob"],["matRipple","",1,"mat-focus-indicator",3,"matRippleDisabled"],[1,"mdc-slider__value-indicator"],[1,"mdc-slider__value-indicator-text"]],template:function(t,n){t&1&&(Y(0,x5A,5,1,"div",2),lA(1,"div",3,0)(3,"div",4)),t&2&&(O(n.discrete?0:-1),u(3),H("matRippleDisabled",!0))},dependencies:[es],styles:[`.mat-mdc-slider-visual-thumb .mat-ripple{height:100%;width:100%}.mat-mdc-slider .mdc-slider__tick-marks{justify-content:start}.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--active,.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--inactive{position:absolute;left:2px} +`],encapsulation:2,changeDetection:0})}return i})(),JZ=(()=>{class i{_ngZone=w(qe);_cdr=w(wt);_elementRef=w(se);_dir=w(fo,{optional:!0});_globalRippleOptions=w(FC,{optional:!0});_trackActive;_thumbs;_input;_inputs;get disabled(){return this._disabled}set disabled(A){this._disabled=A;let t=this._getInput(xi.END),n=this._getInput(xi.START);t&&(t.disabled=this._disabled),n&&(n.disabled=this._disabled)}_disabled=!1;get discrete(){return this._discrete}set discrete(A){this._discrete=A,this._updateValueIndicatorUIs()}_discrete=!1;get showTickMarks(){return this._showTickMarks}set showTickMarks(A){this._showTickMarks=A,this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI())}_showTickMarks=!1;get min(){return this._min}set min(A){let t=A==null||isNaN(A)?this._min:A;this._min!==t&&this._updateMin(t)}_min=0;color;disableRipple=!1;_updateMin(A){let t=this._min;this._min=A,this._isRange?this._updateMinRange({old:t,new:A}):this._updateMinNonRange(A),this._onMinMaxOrStepChange()}_updateMinRange(A){let t=this._getInput(xi.END),n=this._getInput(xi.START),o=t.value,a=n.value;n.min=A.new,t.min=Math.max(A.new,n.value),n.max=Math.min(t.max,t.value),n._updateWidthInactive(),t._updateWidthInactive(),A.newA.old?this._onTranslateXChangeBySideEffect(n,t):this._onTranslateXChangeBySideEffect(t,n),o!==t.value&&this._onValueChange(t),a!==n.value&&this._onValueChange(n)}_updateMaxNonRange(A){let t=this._getInput(xi.END);if(t){let n=t.value;t.max=A,t._updateThumbUIByValue(),this._updateTrackUI(t),n!==t.value&&this._onValueChange(t)}}get step(){return this._step}set step(A){let t=isNaN(A)?this._step:A;this._step!==t&&this._updateStep(t)}_step=1;_updateStep(A){this._step=A,this._isRange?this._updateStepRange():this._updateStepNonRange(),this._onMinMaxOrStepChange()}_updateStepRange(){let A=this._getInput(xi.END),t=this._getInput(xi.START),n=A.value,o=t.value,a=t.value;A.min=this._min,t.max=this._max,A.step=this._step,t.step=this._step,this._platform.SAFARI&&(A.value=A.value,t.value=t.value),A.min=Math.max(this._min,t.value),t.max=Math.min(this._max,A.value),t._updateWidthInactive(),A._updateWidthInactive(),A.value`${A}`;_tickMarks;_noopAnimations=nn();_dirChangeSubscription;_resizeObserver=null;_cachedWidth;_cachedLeft;_rippleRadius=24;startValueIndicatorText="";endValueIndicatorText="";_endThumbTransform;_startThumbTransform;_isRange=!1;_isRtl=!1;_hasViewInitialized=!1;_tickMarkTrackWidth=0;_hasAnimation=!1;_resizeTimer=null;_platform=w(Ci);constructor(){w(io).load(rr),this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe(()=>this._onDirChange()),this._isRtl=this._dir.value==="rtl")}_knobRadius=8;_inputPadding;ngAfterViewInit(){this._platform.isBrowser&&this._updateDimensions();let A=this._getInput(xi.END),t=this._getInput(xi.START);this._isRange=!!A&&!!t,this._cdr.detectChanges();let n=this._getThumb(xi.END);this._rippleRadius=n._ripple.radius,this._inputPadding=this._rippleRadius-this._knobRadius,this._isRange?this._initUIRange(A,t):this._initUINonRange(A),this._updateTrackUI(A),this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._observeHostResize(),this._cdr.detectChanges()}_initUINonRange(A){A.initProps(),A.initUI(),this._updateValueIndicatorUI(A),this._hasViewInitialized=!0,A._updateThumbUIByValue()}_initUIRange(A,t){A.initProps(),A.initUI(),t.initProps(),t.initUI(),A._updateMinMax(),t._updateMinMax(),A._updateStaticStyles(),t._updateStaticStyles(),this._updateValueIndicatorUIs(),this._hasViewInitialized=!0,A._updateThumbUIByValue(),t._updateThumbUIByValue()}ngOnDestroy(){this._dirChangeSubscription?.unsubscribe(),this._resizeObserver?.disconnect(),this._resizeObserver=null}_onDirChange(){this._isRtl=this._dir?.value==="rtl",this._isRange?this._onDirChangeRange():this._onDirChangeNonRange(),this._updateTickMarkUI()}_onDirChangeRange(){let A=this._getInput(xi.END),t=this._getInput(xi.START);A._setIsLeftThumb(),t._setIsLeftThumb(),A.translateX=A._calcTranslateXByValue(),t.translateX=t._calcTranslateXByValue(),A._updateStaticStyles(),t._updateStaticStyles(),A._updateWidthInactive(),t._updateWidthInactive(),A._updateThumbUIByValue(),t._updateThumbUIByValue()}_onDirChangeNonRange(){this._getInput(xi.END)._updateThumbUIByValue()}_observeHostResize(){typeof ResizeObserver>"u"||!ResizeObserver||this._ngZone.runOutsideAngular(()=>{this._resizeObserver=new ResizeObserver(()=>{this._isActive()||(this._resizeTimer&&clearTimeout(this._resizeTimer),this._onResize())}),this._resizeObserver.observe(this._elementRef.nativeElement)})}_isActive(){return this._getThumb(xi.START)._isActive||this._getThumb(xi.END)._isActive}_getValue(A=xi.END){let t=this._getInput(A);return t?t.value:this.min}_skipUpdate(){return!!(this._getInput(xi.START)?._skipUIUpdate||this._getInput(xi.END)?._skipUIUpdate)}_updateDimensions(){this._cachedWidth=this._elementRef.nativeElement.offsetWidth,this._cachedLeft=this._elementRef.nativeElement.getBoundingClientRect().left}_setTrackActiveStyles(A){let t=this._trackActive.nativeElement.style;t.left=A.left,t.right=A.right,t.transformOrigin=A.transformOrigin,t.transform=A.transform}_calcTickMarkTransform(A){let t=A*(this._tickMarkTrackWidth/(this._tickMarks.length-1));return`translateX(${this._isRtl?this._cachedWidth-6-t:t}px)`}_onTranslateXChange(A){this._hasViewInitialized&&(this._updateThumbUI(A),this._updateTrackUI(A),this._updateOverlappingThumbUI(A))}_onTranslateXChangeBySideEffect(A,t){this._hasViewInitialized&&(A._updateThumbUIByValue(),t._updateThumbUIByValue())}_onValueChange(A){this._hasViewInitialized&&(this._updateValueIndicatorUI(A),this._updateTickMarkUI(),this._cdr.detectChanges())}_onMinMaxOrStepChange(){this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.markForCheck())}_onResize(){if(this._hasViewInitialized){if(this._updateDimensions(),this._isRange){let A=this._getInput(xi.END),t=this._getInput(xi.START);A._updateThumbUIByValue(),t._updateThumbUIByValue(),A._updateStaticStyles(),t._updateStaticStyles(),A._updateMinMax(),t._updateMinMax(),A._updateWidthInactive(),t._updateWidthInactive()}else{let A=this._getInput(xi.END);A&&A._updateThumbUIByValue()}this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.detectChanges()}}_thumbsOverlap=!1;_areThumbsOverlapping(){let A=this._getInput(xi.START),t=this._getInput(xi.END);return!A||!t?!1:t.translateX-A.translateX<20}_updateOverlappingThumbClassNames(A){let t=A.getSibling(),n=this._getThumb(A.thumbPosition);this._getThumb(t.thumbPosition)._hostElement.classList.remove("mdc-slider__thumb--top"),n._hostElement.classList.toggle("mdc-slider__thumb--top",this._thumbsOverlap)}_updateOverlappingThumbUI(A){!this._isRange||this._skipUpdate()||this._thumbsOverlap!==this._areThumbsOverlapping()&&(this._thumbsOverlap=!this._thumbsOverlap,this._updateOverlappingThumbClassNames(A))}_updateThumbUI(A){if(this._skipUpdate())return;let t=this._getThumb(A.thumbPosition===xi.END?xi.END:xi.START);t._hostElement.style.transform=`translateX(${A.translateX}px)`}_updateValueIndicatorUI(A){if(this._skipUpdate())return;let t=this.displayWith(A.value);if(this._hasViewInitialized?A._valuetext.set(t):A._hostElement.setAttribute("aria-valuetext",t),this.discrete){A.thumbPosition===xi.START?this.startValueIndicatorText=t:this.endValueIndicatorText=t;let n=this._getThumb(A.thumbPosition);t.length<3?n._hostElement.classList.add("mdc-slider__thumb--short-value"):n._hostElement.classList.remove("mdc-slider__thumb--short-value")}}_updateValueIndicatorUIs(){let A=this._getInput(xi.END),t=this._getInput(xi.START);A&&this._updateValueIndicatorUI(A),t&&this._updateValueIndicatorUI(t)}_updateTickMarkTrackUI(){if(!this.showTickMarks||this._skipUpdate())return;let A=this._step&&this._step>0?this._step:1,n=(Math.floor(this.max/A)*A-this.min)/(this.max-this.min);this._tickMarkTrackWidth=(this._cachedWidth-6)*n}_updateTrackUI(A){this._skipUpdate()||(this._isRange?this._updateTrackUIRange(A):this._updateTrackUINonRange(A))}_updateTrackUIRange(A){let t=A.getSibling();if(!t||!this._cachedWidth)return;let n=Math.abs(t.translateX-A.translateX)/this._cachedWidth;A._isLeftThumb&&this._cachedWidth?this._setTrackActiveStyles({left:"auto",right:`${this._cachedWidth-t.translateX}px`,transformOrigin:"right",transform:`scaleX(${n})`}):this._setTrackActiveStyles({left:`${t.translateX}px`,right:"auto",transformOrigin:"left",transform:`scaleX(${n})`})}_updateTrackUINonRange(A){this._isRtl?this._setTrackActiveStyles({left:"auto",right:"0px",transformOrigin:"right",transform:`scaleX(${1-A.fillPercentage})`}):this._setTrackActiveStyles({left:"0px",right:"auto",transformOrigin:"left",transform:`scaleX(${A.fillPercentage})`})}_updateTickMarkUI(){if(!this.showTickMarks||this.step===void 0||this.min===void 0||this.max===void 0)return;let A=this.step>0?this.step:1;this._isRange?this._updateTickMarkUIRange(A):this._updateTickMarkUINonRange(A)}_updateTickMarkUINonRange(A){let t=this._getValue(),n=Math.max(Math.round((t-this.min)/A),0)+1,o=Math.max(Math.round((this.max-t)/A),0)-1;this._isRtl?n++:o++,this._tickMarks=Array(n).fill(rh.ACTIVE).concat(Array(o).fill(rh.INACTIVE))}_updateTickMarkUIRange(A){let t=this._getValue(),n=this._getValue(xi.START),o=Math.max(Math.round((n-this.min)/A),0),a=Math.max(Math.round((t-n)/A)+1,0),r=Math.max(Math.round((this.max-t)/A),0);this._tickMarks=Array(o).fill(rh.INACTIVE).concat(Array(a).fill(rh.ACTIVE),Array(r).fill(rh.INACTIVE))}_getInput(A){if(A===xi.END&&this._input)return this._input;if(this._inputs?.length)return A===xi.START?this._inputs.first:this._inputs.last}_getThumb(A){return A===xi.END?this._thumbs?.last:this._thumbs?.first}_setTransition(A){this._hasAnimation=!this._platform.IOS&&A&&!this._noopAnimations,this._elementRef.nativeElement.classList.toggle("mat-mdc-slider-with-animation",this._hasAnimation)}_isCursorOnSliderThumb(A,t){let n=t.width/2,o=t.x+n,a=t.y+n,r=A.clientX-o,s=A.clientY-a;return Math.pow(r,2)+Math.pow(s,2)vx),multi:!0};var vx=(()=>{class i{_ngZone=w(qe);_elementRef=w(se);_cdr=w(wt);_slider=w(yx);_platform=w(Ci);_listenerCleanups;get value(){return dn(this._hostElement.value,0)}set value(A){A===null&&(A=this._getDefaultValue()),A=isNaN(A)?0:A;let t=A+"";if(!this._hasSetInitialValue){this._initialValue=t;return}this._isActive||this._setValue(t)}_setValue(A){this._hostElement.value=A,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges(),this._slider._cdr.markForCheck()}valueChange=new LA;dragStart=new LA;dragEnd=new LA;get translateX(){return this._slider.min>=this._slider.max?(this._translateX=this._tickMarkOffset,this._translateX):(this._translateX===void 0&&(this._translateX=this._calcTranslateXByValue()),this._translateX)}set translateX(A){this._translateX=A}_translateX;thumbPosition=xi.END;get min(){return dn(this._hostElement.min,0)}set min(A){this._hostElement.min=A+"",this._cdr.detectChanges()}get max(){return dn(this._hostElement.max,0)}set max(A){this._hostElement.max=A+"",this._cdr.detectChanges()}get step(){return dn(this._hostElement.step,0)}set step(A){this._hostElement.step=A+"",this._cdr.detectChanges()}get disabled(){return Ee(this._hostElement.disabled)}set disabled(A){this._hostElement.disabled=A,this._cdr.detectChanges(),this._slider.disabled!==this.disabled&&(this._slider.disabled=this.disabled)}get percentage(){return this._slider.min>=this._slider.max?this._slider._isRtl?1:0:(this.value-this._slider.min)/(this._slider.max-this._slider.min)}get fillPercentage(){return this._slider._cachedWidth?this._translateX===0?0:this.translateX/this._slider._cachedWidth:this._slider._isRtl?1:0}_hostElement=this._elementRef.nativeElement;_valuetext=mA("");_knobRadius=8;_tickMarkOffset=3;_isActive=!1;_isFocused=!1;_setIsFocused(A){this._isFocused=A}_hasSetInitialValue=!1;_initialValue;_formControl;_destroyed=new te;_skipUIUpdate=!1;_onChangeFn;_onTouchedFn=()=>{};_isControlInitialized=!1;constructor(){let A=w(qi);this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[A.listen(this._hostElement,"pointerdown",this._onPointerDown.bind(this)),A.listen(this._hostElement,"pointermove",this._onPointerMove.bind(this)),A.listen(this._hostElement,"pointerup",this._onPointerUp.bind(this))]})}ngOnDestroy(){this._listenerCleanups.forEach(A=>A()),this._destroyed.next(),this._destroyed.complete(),this.dragStart.complete(),this.dragEnd.complete()}initProps(){this._updateWidthInactive(),this.disabled!==this._slider.disabled&&(this._slider.disabled=!0),this.step=this._slider.step,this.min=this._slider.min,this.max=this._slider.max,this._initValue()}initUI(){this._updateThumbUIByValue()}_initValue(){this._hasSetInitialValue=!0,this._initialValue===void 0?this.value=this._getDefaultValue():(this._hostElement.value=this._initialValue,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges())}_getDefaultValue(){return this.min}_onBlur(){this._setIsFocused(!1),this._onTouchedFn()}_onFocus(){this._slider._setTransition(!1),this._slider._updateTrackUI(this),this._setIsFocused(!0)}_onChange(){this.valueChange.emit(this.value),this._isActive&&this._updateThumbUIByValue({withAnimation:!0})}_onInput(){this._onChangeFn?.(this.value),(this._slider.step||!this._isActive)&&this._updateThumbUIByValue({withAnimation:!0}),this._slider._onValueChange(this)}_onNgControlValueChange(){(!this._isActive||!this._isFocused)&&(this._slider._onValueChange(this),this._updateThumbUIByValue()),this._slider.disabled=this._formControl.disabled}_onPointerDown(A){if(!(this.disabled||A.button!==0)){if(this._platform.IOS){let t=this._slider._isCursorOnSliderThumb(A,this._slider._getThumb(this.thumbPosition)._hostElement.getBoundingClientRect());this._isActive=t,this._updateWidthActive(),this._slider._updateDimensions();return}this._isActive=!0,this._setIsFocused(!0),this._updateWidthActive(),this._slider._updateDimensions(),this._slider.step||this._updateThumbUIByPointerEvent(A,{withAnimation:!0}),this.disabled||(this._handleValueCorrection(A),this.dragStart.emit({source:this,parent:this._slider,value:this.value}))}}_handleValueCorrection(A){this._skipUIUpdate=!0,setTimeout(()=>{this._skipUIUpdate=!1,this._fixValue(A)},0)}_fixValue(A){let t=A.clientX-this._slider._cachedLeft,n=this._slider._cachedWidth,o=this._slider.step===0?1:this._slider.step,a=Math.floor((this._slider.max-this._slider.min)/o),r=this._slider._isRtl?1-t/n:t/n,l=Math.round(r*a)/a*(this._slider.max-this._slider.min)+this._slider.min,g=Math.round(l/o)*o,C=this.value;if(g===C){this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation});return}this.value=g,this.valueChange.emit(this.value),this._onChangeFn?.(this.value),this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation})}_onPointerMove(A){!this._slider.step&&this._isActive&&this._updateThumbUIByPointerEvent(A)}_onPointerUp(){this._isActive&&(this._isActive=!1,this._platform.SAFARI&&this._setIsFocused(!1),this.dragEnd.emit({source:this,parent:this._slider,value:this.value}),setTimeout(()=>this._updateWidthInactive(),this._platform.IOS?10:0))}_clamp(A){let t=this._tickMarkOffset,n=this._slider._cachedWidth-this._tickMarkOffset;return Math.max(Math.min(A,n),t)}_calcTranslateXByValue(){return this._slider._isRtl?(1-this.percentage)*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset:this.percentage*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset}_calcTranslateXByPointerEvent(A){return A.clientX-this._slider._cachedLeft}_updateWidthActive(){}_updateWidthInactive(){this._hostElement.style.padding=`0 ${this._slider._inputPadding}px`,this._hostElement.style.width=`calc(100% + ${this._slider._inputPadding-this._tickMarkOffset*2}px)`,this._hostElement.style.left=`-${this._slider._rippleRadius-this._tickMarkOffset}px`}_updateThumbUIByValue(A){this.translateX=this._clamp(this._calcTranslateXByValue()),this._updateThumbUI(A)}_updateThumbUIByPointerEvent(A,t){this.translateX=this._clamp(this._calcTranslateXByPointerEvent(A)),this._updateThumbUI(t)}_updateThumbUI(A){this._slider._setTransition(!!A?.withAnimation),this._slider._onTranslateXChange(this)}writeValue(A){(this._isControlInitialized||A!==null)&&(this.value=A)}registerOnChange(A){this._onChangeFn=A,this._isControlInitialized=!0}registerOnTouched(A){this._onTouchedFn=A}setDisabledState(A){this.disabled=A}focus(){this._hostElement.focus()}blur(){this._hostElement.blur()}static \u0275fac=function(t){return new(t||i)};static \u0275dir=qA({type:i,selectors:[["input","matSliderThumb",""]],hostAttrs:["type","range",1,"mdc-slider__input"],hostVars:1,hostBindings:function(t,n){t&1&&T("change",function(){return n._onChange()})("input",function(){return n._onInput()})("blur",function(){return n._onBlur()})("focus",function(){return n._onFocus()}),t&2&&ee("aria-valuetext",n._valuetext())},inputs:{value:[2,"value","value",dn]},outputs:{valueChange:"valueChange",dragStart:"dragStart",dragEnd:"dragEnd"},exportAs:["matSliderThumb"],features:[Et([J5A,{provide:UZ,useExisting:i}])]})}return i})();var A1=class i{transform(e){if(!e)return"";let A=e.replace(/(_avg_score|_score|avg_score)$/,"");return A=A.replace(/_/g," "),A.split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join(" ")}static \u0275fac=function(A){return new(A||i)};static \u0275pipe=_D({name:"formatMetricName",type:i,pure:!0})};function Y5A(i,e){if(i&1&&(d(0,"div",9)(1,"div",10)(2,"mat-checkbox",11)(3,"div",12)(4,"span",13),y(5),Ht(6,"formatMetricName"),E(),d(7,"span",14),y(8),E()()(),d(9,"div",15)(10,"div",16)(11,"span",17),y(12,"Threshold"),E(),d(13,"div",18)(14,"mat-slider",19),lA(15,"input",20),E(),d(16,"span",21),y(17),E()()()()()()),i&2){let A,t=e.$implicit,n=p(2);u(2),H("formControlName",t.metricName+"_selected"),u(2),H("matTooltip",t.metricName),u(),iA(ci(6,10,t.metricName)),u(3),iA(t.description),u(),ht("visibility",(A=n.evalForm.get(t.metricName+"_selected"))!=null&&A.value?"visible":"hidden"),u(5),H("min",t.metricValueInfo.interval.minValue)("max",t.metricValueInfo.interval.maxValue),u(),H("formControlName",t.metricName+"_threshold"),u(2),Be(" ",n.evalForm.controls[t.metricName+"_threshold"].value," ")}}function O5A(i,e){if(i&1&&(d(0,"div"),yt(1,Y5A,18,12,"div",8),E()),i&2){let A=p();u(),H("ngForOf",A.metricsInfo)}}function H5A(i,e){if(i&1&&(d(0,"div")(1,"div",9)(2,"div",10)(3,"mat-checkbox",22)(4,"span",13),y(5),Ht(6,"formatMetricName"),E()(),d(7,"div",15)(8,"div",16)(9,"span",17),y(10,"Threshold"),E(),d(11,"div",18)(12,"mat-slider",23),lA(13,"input",24),E(),d(14,"span",21),y(15),E()()()()()(),d(16,"div",9)(17,"div",10)(18,"mat-checkbox",25)(19,"span",13),y(20),Ht(21,"formatMetricName"),E()(),d(22,"div",15)(23,"div",16)(24,"span",17),y(25,"Threshold"),E(),d(26,"div",18)(27,"mat-slider",23),lA(28,"input",26),E(),d(29,"span",21),y(30),E()()()()()()()),i&2){let A,t,n=p();u(4),H("matTooltip","tool_trajectory_avg_score"),u(),iA(ci(6,10,"tool_trajectory_avg_score")),u(2),ht("visibility",(A=n.evalForm.get("tool_trajectory_avg_score_selected"))!=null&&A.value?"visible":"hidden"),u(8),Be(" ",n.evalForm.controls.tool_trajectory_avg_score_threshold.value," "),u(4),H("matTooltip","response_match_score"),u(),iA(ci(21,12,"response_match_score")),u(2),ht("visibility",(t=n.evalForm.get("response_match_score_selected"))!=null&&t.value?"visible":"hidden"),u(8),Be(" ",n.evalForm.controls.response_match_score_threshold.value," ")}}var T5=class i{constructor(e,A,t){this.dialogRef=e;this.fb=A;this.data=t;this.evalMetrics=this.data.evalMetrics||[],this.metricsInfo=this.data.metricsInfo||[],this.evalForm=this.fb.group({}),this.metricsInfo.forEach(n=>{let o=this.evalMetrics.find(l=>l.metricName===n.metricName),a=!!o,r=o?o.threshold:this.getDefaultThreshold(n);this.evalForm.addControl(`${n.metricName}_selected`,this.fb.control(a));let s=n.metricValueInfo.interval;this.evalForm.addControl(`${n.metricName}_threshold`,this.fb.control(r,[Ns.required,Ns.min(s.minValue),Ns.max(s.maxValue)]))}),this.metricsInfo.length===0&&this.addDefaultControls()}evalForm;evalMetrics=[];metricsInfo=[];addDefaultControls(){[{name:"tool_trajectory_avg_score",min:0,max:1,default:1},{name:"response_match_score",min:0,max:1,default:.7}].forEach(A=>{let t=this.evalMetrics.find(a=>a.metricName===A.name),n=!!t,o=t?t.threshold:A.default;this.evalForm.addControl(`${A.name}_selected`,this.fb.control(n)),this.evalForm.addControl(`${A.name}_threshold`,this.fb.control(o,[Ns.required,Ns.min(A.min),Ns.max(A.max)]))})}getDefaultThreshold(e){return e.metricName==="tool_trajectory_avg_score"?1:e.metricName==="response_match_score"?.7:e.metricValueInfo.interval.maxValue}onReset(){this.metricsInfo.forEach(e=>{let A=ah.find(o=>o.metricName===e.metricName),t=!!A,n=A?A.threshold:this.getDefaultThreshold(e);this.evalForm.get(`${e.metricName}_selected`)?.setValue(t),this.evalForm.get(`${e.metricName}_threshold`)?.setValue(n)}),this.metricsInfo.length===0&&ah.forEach(e=>{this.evalForm.get(`${e.metricName}_selected`)?.setValue(!0),this.evalForm.get(`${e.metricName}_threshold`)?.setValue(e.threshold)})}onStart(){if(this.evalForm.valid){let e=[];this.metricsInfo.length>0?this.metricsInfo.forEach(A=>{if(this.evalForm.get(`${A.metricName}_selected`)?.value){let n=this.evalForm.get(`${A.metricName}_threshold`)?.value;e.push({metricName:A.metricName,threshold:n})}}):["tool_trajectory_avg_score","response_match_score"].forEach(t=>{if(this.evalForm.get(`${t}_selected`)?.value){let o=this.evalForm.get(`${t}_threshold`)?.value;e.push({metricName:t,threshold:o})}}),this.dialogRef.close(e)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(A){return new(A||i)(ot(Vn),ot(LN),ot(xo))};static \u0275cmp=bA({type:i,selectors:[["app-run-eval-config-dialog"]],decls:14,vars:3,consts:[[1,"dialog-container"],["mat-dialog-title","",1,"dialog-title"],[1,"eval-form",3,"formGroup"],[4,"ngIf"],["align","end",1,"dialog-actions"],["mat-button","",1,"reset-button",3,"click"],["mat-button","",1,"cancel-button",3,"click"],["mat-button","",1,"save-button",3,"click"],["class","metric-container",4,"ngFor","ngForOf"],[1,"metric-container"],[1,"metric-header"],[3,"formControlName"],[2,"display","flex","flex-direction","column"],[1,"metric-title",3,"matTooltip"],[1,"metric-description"],[1,"metric-slider-container","inline-slider"],[2,"display","flex","flex-direction","column","align-items","flex-start"],[1,"slider-label",2,"margin-right","0","font-size","11px","color","var(--mat-sys-on-surface-variant)"],[2,"display","flex","align-items","center"],["step","0.1","thumbLabel","",1,"threshold-slider",3,"min","max"],["matSliderThumb","",3,"formControlName"],[1,"threshold-value"],["formControlName","tool_trajectory_avg_score_selected"],["min","0","max","1","step","0.1","thumbLabel","",1,"threshold-slider"],["matSliderThumb","","formControlName","tool_trajectory_avg_score_threshold"],["formControlName","response_match_score_selected"],["matSliderThumb","","formControlName","response_match_score_threshold"]],template:function(A,t){A&1&&(d(0,"div",0)(1,"h2",1),y(2,"EVALUATION METRICS"),E(),d(3,"mat-dialog-content")(4,"form",2),yt(5,O5A,2,1,"div",3)(6,H5A,31,14,"div",3),E()(),d(7,"mat-dialog-actions",4)(8,"button",5),T("click",function(){return t.onReset()}),y(9,"Reset to Default"),E(),d(10,"button",6),T("click",function(){return t.onCancel()}),y(11,"Cancel"),E(),d(12,"button",7),T("click",function(){return t.onStart()}),y(13,"Start"),E()()()),A&2&&(u(4),H("formGroup",t.evalForm),u(),H("ngIf",t.metricsInfo.length>0),u(),H("ngIf",t.metricsInfo.length===0))},dependencies:[na,ua,cn,NN,yn,vn,bN,xC,_C,oy,JZ,vx,pa,Si,Og,si,id,Ll,Zi,A1],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:12px;width:680px;box-shadow:0 8px 16px var(--run-eval-config-dialog-container-box-shadow-color)}.metric-container[_ngcontent-%COMP%]{margin-bottom:6px;padding-bottom:4px;border-bottom:1px solid var(--run-eval-config-dialog-border-color, #e0e0e0)}.metric-container[_ngcontent-%COMP%]:last-child{border-bottom:none}.metric-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;margin-bottom:2px}.metric-title[_ngcontent-%COMP%]{font-weight:600;font-size:1em}.metric-description[_ngcontent-%COMP%]{font-size:.85em;color:var(--run-eval-config-dialog-description-color, #666);margin-top:2px;white-space:normal}.metric-slider-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-left:28px}.inline-slider[_ngcontent-%COMP%]{margin-left:20px;flex:1;display:flex;justify-content:flex-end;align-items:center}.slider-label[_ngcontent-%COMP%]{margin-right:10px;font-size:.9em}.threshold-slider[_ngcontent-%COMP%]{max-width:80px;flex:1}.threshold-value[_ngcontent-%COMP%]{margin-left:10px;min-width:30px;text-align:right}h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}"]})};var dc=class i{constructor(e,A){this.dialogRef=e;this.data=A}onConfirm(){this.dialogRef.close(!0)}onCancel(){this.dialogRef.close(!1)}static \u0275fac=function(A){return new(A||i)(ot(Vn),ot(xo))};static \u0275cmp=bA({type:i,selectors:[["app-delete-session-dialog"]],decls:11,vars:4,consts:[[1,"confirm-delete-wrapper"],["mat-dialog-title",""],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,t){A&1&&(d(0,"div",0)(1,"h2",1),y(2),E(),d(3,"mat-dialog-content")(4,"p"),y(5),E()(),d(6,"mat-dialog-actions",2)(7,"button",3),T("click",function(){return t.onCancel()}),y(8),E(),d(9,"button",4),T("click",function(){return t.onConfirm()}),y(10),E()()()),A&2&&(u(2),iA(t.data.title),u(3),iA(t.data.message),u(3),iA(t.data.cancelButtonText),u(2),iA(t.data.confirmButtonText))},dependencies:[na,ua,pa,Si],encapsulation:2})};var z5A=["app-info-table",""],P5A=["*"];function j5A(i,e){if(i&1&&(Dn(0,"thead")(1,"tr")(2,"th",2),y(3),Tn()()()),i&2){let A=p();u(3),iA(A.title())}}var e1=class i{title=De();static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["table","app-info-table",""]],hostAttrs:[1,"info-table"],inputs:{title:[1,"title"]},attrs:z5A,ngContentSelectors:P5A,decls:6,vars:1,consts:[[1,"label-col"],[1,"value-col"],["colspan","2"]],template:function(A,t){A&1&&(Nt(),Dn(0,"colgroup"),Jn(1,"col",0)(2,"col",1),Tn(),Y(3,j5A,4,1,"thead"),Dn(4,"tbody"),Ve(5),Tn()),A&2&&(u(3),O(t.title()?3:-1))},styles:["[_nghost-%COMP%]{display:table;width:100%;border-collapse:separate;border-spacing:0;font-family:inherit;font-size:13px;background-color:var(--mat-sys-surface);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;overflow:hidden;table-layout:fixed}[_nghost-%COMP%] thead[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-low)}[_nghost-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{text-align:left;padding:12px 16px;font-weight:500;color:var(--mat-sys-on-surface);border-bottom:1px solid var(--mat-sys-outline-variant)}[_nghost-%COMP%] .label-col[_ngcontent-%COMP%]{width:40%}[_nghost-%COMP%] tbody tr td{padding:10px 16px;color:var(--mat-sys-on-surface-variant);border-bottom:1px solid var(--mat-sys-outline-variant);overflow:hidden;overflow-wrap:anywhere}[_nghost-%COMP%] tbody tr td:first-child{font-weight:500;color:var(--mat-sys-on-surface);background-color:var(--mat-sys-surface-container-lowest);border-right:1px solid var(--mat-sys-outline-variant)}[_nghost-%COMP%] tbody tr:last-child td{border-bottom:none}"]})};var YZ=(i,e)=>e.timestamp,q5A=(i,e)=>e.evalId;function V5A(i,e){i&1&&(d(0,"span",3),y(1,"Eval Sets"),E())}function W5A(i,e){if(i&1){let A=rA();d(0,"span",9),T("click",function(){G(A);let n=p(2);return K(n.goToEvalSet())}),y(1),E()}if(i&2){let A=p(2);u(),iA(A.selectedEvalSet())}}function Z5A(i,e){if(i&1&&(d(0,"span",8),y(1),E()),i&2){let A=p(2);u(),iA(A.selectedEvalSet())}}function X5A(i,e){if(i&1&&(d(0,"span",6),y(1,">"),E(),Y(2,W5A,2,1,"span",7)(3,Z5A,2,1,"span",8)),i&2){let A=p();u(2),O(A.selectedEvalTab()==="history"||A.selectedHistoryRun()||A.selectedEvalCase()?2:3)}}function $5A(i,e){i&1&&(d(0,"span",6),y(1,">"),E(),d(2,"span",10),y(3,"Eval Cases"),E())}function ADA(i,e){i&1&&(d(0,"span",6),y(1,">"),E(),d(2,"span",11),y(3,"Runs"),E())}function eDA(i,e){if(i&1&&(d(0,"span",6),y(1,">"),E(),d(2,"span",12),y(3),E()),i&2){let A=p();u(3),iA(A.formatTimestamp(A.selectedHistoryRun()))}}function tDA(i,e){if(i&1&&(d(0,"span",6),y(1,">"),E(),d(2,"span",13),y(3),E()),i&2){let A,t=p();u(3),iA((A=t.selectedEvalCase())==null?null:A.evalId)}}function iDA(i,e){if(i&1){let A=rA();d(0,"button",14),T("click",function(){G(A);let n=p();return K(n.openNewEvalSetDialog())}),d(1,"mat-icon"),y(2,"add"),E(),y(3," New "),E(),d(4,"button",15),T("click",function(){G(A);let n=p();return K(n.getEvalSet())}),d(5,"mat-icon"),y(6,"refresh"),E()()}if(i&2){let A=p();H("matTooltip",A.i18n.createNewEvalSetTooltip)}}function nDA(i,e){}function oDA(i,e){if(i&1){let A=rA();d(0,"div")(1,"div",16)(2,"div",17),y(3),E(),d(4,"div",18),y(5),E(),d(6,"div",19),T("click",function(){G(A);let n=p();return K(n.openNewEvalSetDialog())}),y(7),E()()()}if(i&2){let A=p();u(3),Be(" ",A.i18n.createNewEvalSetTitle," "),u(2),Be(" ",A.i18n.evalSetDescription," "),u(2),Be(" ",A.i18n.createEvalSetButton," ")}}function aDA(i,e){if(i&1){let A=rA();d(0,"div",21),T("click",function(){let n=G(A).$implicit,o=p(2);return K(o.selectEvalSet(n))}),d(1,"div",22)(2,"span",23),y(3,"folder"),E(),d(4,"div",24),y(5),E()(),d(6,"div",25)(7,"button",26),T("click",function(n){let o=G(A).$implicit,a=p(2);return K(a.confirmDeleteEvalSet(n,o))}),d(8,"mat-icon"),y(9,"delete"),E()()()()}if(i&2){let A=e.$implicit,t=p(2);u(5),iA(A),u(2),H("matTooltip",t.i18n.deleteEvalSetTooltip)}}function rDA(i,e){if(i&1&&(d(0,"div"),xe(1,aDA,10,2,"div",20,ni),E()),i&2){let A=p();u(),Re(A.evalsets)}}function sDA(i,e){i&1&&(d(0,"div",33),lA(1,"mat-progress-spinner",34),E()),i&2&&(u(),H("diameter",28)("strokeWidth",3))}function lDA(i,e){if(i&1&&(d(0,"tr")(1,"td"),y(2,"Execution Mode"),E(),d(3,"td")(4,"span",37),y(5),E()()()),i&2){let A,t,n=p(4);u(4),H("matTooltip",((A=n.currentEvalSet())==null?null:A.model_execution_mode)||"N/A"),u(),iA(((t=n.currentEvalSet())==null?null:t.model_execution_mode)||"N/A")}}function gDA(i,e){if(i&1&&(d(0,"div",35)(1,"table",36)(2,"tr")(3,"td"),y(4,"Name"),E(),d(5,"td")(6,"span",37),y(7),E()()(),Y(8,lDA,6,2,"tr"),d(9,"tr")(10,"td"),y(11,"Total Cases"),E(),d(12,"td")(13,"span",37),y(14),E()()(),d(15,"tr")(16,"td"),y(17,"Total Runs"),E(),d(18,"td")(19,"span",37),y(20),E()()()()()),i&2){let A=p(3);u(6),H("matTooltip",A.selectedEvalSet()),u(),iA(A.selectedEvalSet()),u(),O(A.isEvalV2Enabled()?8:-1),u(5),H("matTooltip",A.evalCases.length.toString()),u(),iA(A.evalCases.length),u(5),H("matTooltip",A.getEvalHistoryOfCurrentSetSorted().length.toString()),u(),iA(A.getEvalHistoryOfCurrentSetSorted().length)}}function cDA(i,e){i&1&&lA(0,"mat-progress-spinner",42),i&2&&H("diameter",20)}function CDA(i,e){i&1&&(d(0,"mat-icon"),y(1,"play_arrow"),E())}function IDA(i,e){if(i&1){let A=rA();d(0,"div",46),T("click",function(){let n=G(A).$implicit,o=p(6);return K(o.getEvalCase(n))}),d(1,"mat-checkbox",47),T("click",function(n){return n.stopPropagation()})("change",function(n){let o=G(A).$implicit,a=p(6);return K(n?a.selection.toggle(o):null)}),E(),d(2,"div",48),y(3),E(),d(4,"button",49),T("click",function(n){let o=G(A).$implicit,a=p(6);return K(a.requestEditEvalCase(n,o))}),d(5,"mat-icon"),y(6,"edit"),E()(),d(7,"button",26),T("click",function(n){let o=G(A).$implicit,a=p(6);return K(a.confirmDeleteEvalCase(n,o))}),d(8,"mat-icon"),y(9,"delete"),E()()()}if(i&2){let A,t=e.$implicit,n=p(6);xA("selected-row",t===((A=n.selectedEvalCase())==null?null:A.evalId)),u(),H("checked",n.selection.isSelected(t)),u(2),Be(" ",t," "),u(),H("matTooltip",n.i18n.editEvalCaseTooltip),u(3),H("matTooltip",n.i18n.deleteEvalCaseTooltip)}}function dDA(i,e){if(i&1&&(d(0,"div",44),xe(1,IDA,10,6,"div",45,ni),E()),i&2){let A=p(5);u(),Re(A.evalCases)}}function BDA(i,e){if(i&1){let A=rA();d(0,"div",39)(1,"mat-checkbox",40),T("change",function(n){G(A);let o=p(4);return K(n?o.toggleAllRows():null)}),E(),d(2,"button",41),T("click",function(){G(A);let n=p(4);return K(n.openEvalConfigDialog())}),Y(3,cDA,1,1,"mat-progress-spinner",42)(4,CDA,2,0,"mat-icon"),y(5),E(),d(6,"button",43),T("click",function(){G(A);let n=p(4);return K(n.openNewEvalCaseDialog())}),d(7,"mat-icon"),y(8,"add"),E(),y(9),E(),lA(10,"span",4),d(11,"button",15),T("click",function(){G(A);let n=p(4);return K(n.listEvalCases())}),d(12,"mat-icon"),y(13,"refresh"),E()()(),Y(14,dDA,3,0,"div",44)}if(i&2){let A=p(4);u(),H("checked",A.selection.hasValue()&&A.isAllSelected())("indeterminate",A.selection.hasValue()&&!A.isAllSelected()),u(),H("disabled",A.evalCases.length==0||A.loadingMetrics()),u(),O(A.loadingMetrics()?3:4),u(2),Be(" ",A.isAllSelected()||A.selection.isEmpty()?A.i18n.runEvaluationButton:A.i18n.runSelectedEvaluationButton," "),u(4),Be(" ",A.i18n.addSessionToSetButtonPrefix," "),u(5),O(A.evalCases.length>0?14:-1)}}function EDA(i,e){if(i&1){let A=rA();d(0,"div",55),T("click",function(){let n=G(A).$implicit,o=p(5);return K(o.getHistorySession(n.result,n.timestamp))}),d(1,"div",48),y(2),E(),lA(3,"div",4),d(4,"div",56)(5,"span",57),y(6),E()()()}if(i&2){let A=e.$implicit,t=e.$index;p();let n=xn(7),o=p(4);xA("selected-row",A.timestamp==o.selectedHistoryRun()),u(2),ya(" #",n.length-t," ",o.formatTimestamp(A.timestamp)," "),u(3),H("ngClass",o.isMetricsSucceed(A.result)?"status-card__passed":"status-card__failed"),u(),Be(" ",o.getMetricsScore(A.result)," ")}}function hDA(i,e){i&1&&(d(0,"div",54),y(1," No runs found for this case. "),E())}function QDA(i,e){if(i&1&&(d(0,"div",38)(1,"div",50)(2,"h3",51),y(3),E()(),d(4,"h4",52),y(5,"Past Runs"),E(),d(6,"div",44),Uo(7),xe(8,EDA,7,6,"div",53,YZ),Y(10,hDA,2,0,"div",54),E()()),i&2){let A=p(4),t=A.selectedEvalCase();u(3),Be("Case: ",t.evalId),u(4);let n=Wo(A.caseHistory());u(),Re(n),u(2),O(n.length===0?10:-1)}}function uDA(i,e){i&1&&(d(0,"div",16)(1,"div",17),y(2,"No Eval Cases"),E(),d(3,"div",18),y(4,"Add a session to this set to get started."),E()())}function pDA(i,e){if(i&1&&(d(0,"div"),Y(1,BDA,15,7)(2,QDA,11,3,"div",38),Y(3,uDA,5,0,"div",16),E()),i&2){let A=p(3);u(),O(A.selectedEvalCase()?2:1),u(2),O(A.evalCases.length===0?3:-1)}}function fDA(i,e){i&1&&(d(0,"div",16)(1,"div",17),y(2,"No Runs"),E(),d(3,"div",18),y(4,"Run an evaluation to see results here."),E()())}function mDA(i,e){if(i&1){let A=rA();d(0,"div",46),T("click",function(){let n=G(A).$implicit,o=p(6);return K(o.selectedHistoryRun.set(n.timestamp))}),d(1,"div",48),y(2),E(),lA(3,"div",4),d(4,"div",60)(5,"span",61),y(6),E(),d(7,"span",62),y(8,"|"),E(),d(9,"span",63),y(10),E()()()}if(i&2){let A=e.$implicit,t=e.$index;p(3);let n=xn(0),o=p(3);u(2),ya(" #",n.length-t," ",o.formatTimestamp(A.timestamp)," "),u(4),ya("",o.getPassCountForCurrentResult(A.evaluationResults.evaluationResults)," ",o.i18n.passStatusCaps),u(3),ht("color",o.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)===0?"gray":""),u(),ya("",o.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)," ",o.i18n.failStatusCaps)}}function wDA(i,e){if(i&1&&(d(0,"div",44),xe(1,mDA,11,8,"div",59,YZ),E()),i&2){p(2);let A=xn(0);u(),Re(A)}}function DDA(i,e){if(i&1&&(d(0,"span",62),y(1,"|"),E(),d(2,"span",63),y(3),E()),i&2){p(2);let A=xn(1),t=p(5);u(3),ya("",t.getFailCountForCurrentResult(A.evaluationResults)," ",t.i18n.failStatusCaps)}}function yDA(i,e){if(i&1&&(d(0,"span",70)(1,"span",71),y(2),Ht(3,"formatMetricName"),E(),y(4,": "),d(5,"span",72),y(6),Ht(7,"number"),E()()),i&2){let A=e.$implicit;u(),H("matTooltip",A.metricName),u(),iA(ci(3,3,A.metricName)),u(4),iA(f0(7,5,A.threshold,"1.2-2"))}}function vDA(i,e){if(i&1&&(d(0,"div",67),xe(1,yDA,8,8,"span",70,ni),E()),i&2){let A=p(7);u(),Re(A.currentHistoryMetrics())}}function bDA(i,e){if(i&1){let A=rA();d(0,"div",73),T("click",function(){let n=G(A).$implicit;p(2);let o=xn(0),a=p(5);return K(a.getHistorySession(n,o))}),d(1,"span"),y(2),E(),d(3,"span",74),y(4),E()()}if(i&2){let A=e.$implicit,t=p(7);u(2),Be(" ",A.evalId," "),u(),H("ngClass",t.isMetricsSucceed(A)?"status-card__passed":"status-card__failed"),u(),Be(" ",t.getMetricsScore(A)," ")}}function MDA(i,e){if(i&1&&(d(0,"div",64)(1,"div",65)(2,"div",66)(3,"div",60)(4,"span",61),y(5),E(),Y(6,DDA,4,2),E(),Y(7,vDA,3,0,"div",67),E()()(),d(8,"div",68),xe(9,bDA,5,3,"div",69,q5A),E()),i&2){p();let A=xn(1),t=p(5);u(5),ya("",t.getPassCountForCurrentResult(A.evaluationResults)," ",t.i18n.passStatusCaps),u(),O(t.getFailCountForCurrentResult(A.evaluationResults)>0?6:-1),u(),O(t.currentHistoryMetrics().length>0?7:-1),u(2),Re(A.evaluationResults)}}function SDA(i,e){if(i&1&&(Uo(0)(1),Y(2,MDA,11,4)),i&2){let A=p(5),t=Wo(A.selectedHistoryRun());u();let n=Wo(A.getEvalHistoryOfCurrentSet()[t]);u(),O(n?2:-1)}}function kDA(i,e){if(i&1&&(d(0,"div",58),Y(1,wDA,3,0,"div",44)(2,SDA,3,3),E()),i&2){let A=p(4);u(),O(A.selectedHistoryRun()?2:1)}}function _DA(i,e){if(i&1&&(Uo(0),Y(1,fDA,5,0,"div",16)(2,kDA,3,1,"div",58)),i&2){let A=Wo(p(3).evalHistorySorted());u(),O(A.length===0?1:2)}}function xDA(i,e){if(i&1&&(Y(0,gDA,21,7,"div",35),Y(1,pDA,4,2,"div"),Y(2,_DA,3,2)),i&2){let A=p(2);O(A.selectedEvalTab()==="info"?0:-1),u(),O(A.selectedEvalTab()==="cases"?1:-1),u(),O(A.selectedEvalTab()==="history"?2:-1)}}function RDA(i,e){if(i&1){let A=rA();d(0,"div",5)(1,"div",27)(2,"div",28)(3,"button",29),T("click",function(){G(A);let n=p();return n.selectedEvalTab.set("info"),n.selectedEvalCase.set(null),K(n.selectedHistoryRun.set(null))}),d(4,"mat-icon"),y(5,"info"),E()(),d(6,"button",30),T("click",function(){G(A);let n=p();return n.selectedEvalTab.set("cases"),n.selectedEvalCase.set(null),K(n.selectedHistoryRun.set(null))}),d(7,"mat-icon"),y(8,"list"),E()(),d(9,"button",31),T("click",function(){G(A);let n=p();return n.selectedEvalTab.set("history"),n.selectedEvalCase.set(null),n.selectedHistoryRun.set(null),K(n.getEvaluationResult())}),d(10,"mat-icon"),y(11,"history"),E()()(),d(12,"div",32),Y(13,sDA,2,2,"div",33)(14,xDA,3,3),E()()()}if(i&2){let A=p();u(3),xA("active",A.selectedEvalTab()==="info"),u(3),xA("active",A.selectedEvalTab()==="cases"),u(3),xA("active",A.selectedEvalTab()==="history"),u(4),O(A.evalRunning()?13:14)}}var J5=new MA("EVAL_TAB_COMPONENT"),Bc=class i{checkboxes=CR(Og);appName=De("");userId=De("");sessionId=De("");sessionSelected=fi();shouldShowTab=fi();evalNotInstalledMsg=fi();evalCaseSelected=fi();evalSetIdSelected=fi();shouldReturnToSession=fi();editEvalCaseRequested=fi();evalCasesSubject=new ti([]);changeDetectorRef=w(wt);flagService=w(mr);i18n=w(KZ);displayedColumns=["select","evalId"];evalsets=[];selectedEvalSet=mA("");currentEvalSet=mA(null);evalHistorySorted=me(()=>{let e=this.appEvaluationResults[this.appName()]?.[this.selectedEvalSet()]||{};return Object.keys(e).sort((t,n)=>n.localeCompare(t)).map(t=>({timestamp:t,evaluationResults:e[t]}))});currentHistoryMetrics=me(()=>{let e=this.selectedHistoryRun()||this.evalHistorySorted()[0]?.timestamp;if(!e)return this.evalMetrics;let A=this.evalHistorySorted().find(t=>t.timestamp===e);return A?this.getEvalMetrics(A):this.evalMetrics});caseHistory=me(()=>{let e=this.selectedEvalCase();if(!e)return[];let A=e.evalId,t=this.evalHistorySorted();return console.log("[DEBUG] caseHistory history:",t.map(n=>n.timestamp),"selectedHistoryRun:",this.selectedHistoryRun()),t.map(n=>{let o=n.evaluationResults.evaluationResults.find(a=>a.evalId===A);return{timestamp:n.timestamp,result:o}}).filter(n=>n.result!==void 0)});evalCases=[];selectedEvalCase=mA(null);deletedEvalCaseIndex=-1;dataSource=new qI(this.evalCases);selection=new k0(!0,[]);showEvalHistory=mA(!1);selectedEvalTab=mA("cases");selectedHistoryRun=mA(null);evalRunning=mA(!1);loadingMetrics=mA(!1);evalMetrics=ah;isEvalV2Enabled=mA(!1);currentEvalResultBySet=new Map;dialog=w(Ja);appEvaluationResults={};evalService=w(Jc);sessionService=w(Os);constructor(){this.evalCasesSubject.subscribe(e=>{!this.selectedEvalCase()&&this.deletedEvalCaseIndex>=0&&e.length>0?(this.selectNewEvalCase(e),this.deletedEvalCaseIndex=-1):e.length===0&&this.shouldReturnToSession.emit(!0)})}ngOnChanges(e){e.appName&&(this.selectedEvalSet.set(""),this.evalCases=[],this.getEvalSet(),this.getEvaluationResult())}ngOnInit(){this.flagService.isEvalV2Enabled().pipe(to()).subscribe(A=>this.isEvalV2Enabled.set(A));let e=localStorage.getItem("adk_eval_metrics_selection");if(e)try{this.evalMetrics=JSON.parse(e)}catch(A){console.error("Error parsing saved eval metrics",A),this.evalMetrics=ah}}selectNewEvalCase(e){let A=this.deletedEvalCaseIndex;this.deletedEvalCaseIndex===e.length&&(A=0),this.getEvalCase(e[A])}getEvalSet(){this.appName()!==""&&this.evalService.getEvalSets(this.appName()).pipe(qo(e=>e.status===404&&e.statusText==="Not Found"?(this.shouldShowTab.emit(!1),ie(null)):ie([]))).subscribe(e=>{e!==null&&(this.shouldShowTab.emit(!0),this.evalsets=e,this.changeDetectorRef.detectChanges())})}getNextDefaultEvalSetName(){let e=/^eval_set_(\d+)$/,A=0;for(let t of this.evalsets)if(typeof t=="string"){let n=t.match(e);if(n){let o=parseInt(n[1],10);o>A&&(A=o)}}return`eval_set_${A+1}`}openNewEvalSetDialog(){let e=this.getNextDefaultEvalSetName();this.dialog.open(U5,{width:"600px",data:{appName:this.appName(),defaultName:e}}).afterClosed().subscribe(t=>{t&&(this.getEvalSet(),this.changeDetectorRef.detectChanges())})}openNewEvalCaseDialog(){this.sessionId()&&this.sessionService.getSession(this.userId(),this.appName(),this.sessionId()).subscribe(e=>{let t=(e.state?.__session_metadata__?.displayName||this.sessionId()).replace(/ /g,"_").replace(/[^a-zA-Z0-9_-]/g,"");this.dialog.open(K5,{width:"600px",data:{appName:this.appName(),userId:this.userId(),sessionId:this.sessionId(),evalSetId:this.selectedEvalSet(),defaultName:t,existingCases:this.evalCases}}).afterClosed().subscribe(o=>{o&&(this.listEvalCases(),this.changeDetectorRef.detectChanges())})})}listEvalCases(){this.evalCases=[],this.evalService.listEvalCases(this.appName(),this.selectedEvalSet()).subscribe(e=>{this.evalCases=e,this.dataSource=new qI(this.evalCases),this.evalCasesSubject.next(this.evalCases),this.changeDetectorRef.detectChanges()})}runEval(){this.evalRunning.set(!0),this.evalService.runEval(this.appName(),this.selectedEvalSet(),this.selection.selected.length===0?this.dataSource.data:this.selection.selected,this.evalMetrics).pipe(qo(e=>(e.error?.detail?.includes("not installed")&&this.evalNotInstalledMsg.emit(e.error.detail),ie([])))).subscribe(e=>{this.currentEvalResultBySet.set(this.selectedEvalSet(),e),this.getEvaluationResult(!0),this.changeDetectorRef.detectChanges()})}selectEvalSet(e){this.selectedEvalSet.set(e),this.listEvalCases(),this.isEvalV2Enabled()&&this.evalService.getEvalSet(this.appName(),e).pipe(qo(A=>(console.error("Error fetching eval set details",A),ie(null)))).subscribe(A=>{this.currentEvalSet.set(A),this.changeDetectorRef.detectChanges()})}clearSelectedEvalSet(){if(this.selectedEvalTab()!=="cases"){this.selectedEvalTab.set("cases");return}this.selectedEvalSet.set(""),this.currentEvalSet.set(null)}clearAllNavigation(){this.selectedEvalSet.set(""),this.selectedHistoryRun.set(null),this.selectedEvalCase.set(null),this.currentEvalSet.set(null)}goToEvalSet(){this.selectedHistoryRun.set(null),this.selectedEvalCase.set(null)}isAllSelected(){let e=this.selection.selected.length,A=this.dataSource.data.length;return e===A}toggleAllRows(){if(this.isAllSelected()){this.selection.clear();return}this.selection.select(...this.dataSource.data)}getEvalResultForCase(e){let A=this.currentEvalResultBySet.get(this.selectedEvalSet())?.filter(t=>t.evalId==e);if(!(!A||A.length==0))return A[0].finalEvalStatus}formatToolUses(e){if(!e||!Array.isArray(e))return[];let A=[];for(let t of e)A.push({name:t.name,args:t.args});return A}addEvalCaseResultToEvents(e,A){let t=A.evalMetricResultPerInvocation,n=-1;if(t)for(let o=0;on.evalId==e)[0],t=A.sessionId;this.sessionService.getSession(this.userId(),this.appName(),t).subscribe(n=>{this.addEvalCaseResultToEvents(n,A);let o=this.fromApiResultToSession(n);this.sessionSelected.emit(o)})}toggleEvalHistoryButton(){this.showEvalHistory.set(!this.showEvalHistory())}getEvalHistoryOfCurrentSet(){return this.appEvaluationResults[this.appName()]?this.appEvaluationResults[this.appName()][this.selectedEvalSet()]||{}:{}}getEvalHistoryOfCurrentSetSorted(){let e=this.getEvalHistoryOfCurrentSet();return e?Object.keys(e).sort((n,o)=>o.localeCompare(n)).map(n=>({timestamp:n,evaluationResults:e[n]})):[]}getPassCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==1).length}getFailCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==2).length}getMetricsCounts(e){if(!e)return{passed:0,total:0};let A=0,t=0;if(e.evalMetricResults&&e.evalMetricResults.length>0)A=e.evalMetricResults.filter(n=>n.evalStatus===1).length,t=e.evalMetricResults.length;else if(e.evalMetricResultPerInvocation)for(let n of e.evalMetricResultPerInvocation)n.evalMetricResults&&(A+=n.evalMetricResults.filter(o=>o.evalStatus===1).length,t+=n.evalMetricResults.length);return{passed:A,total:t}}getMetricsScore(e){let{passed:A,total:t}=this.getMetricsCounts(e);return`${A}/${t}`}isMetricsSucceed(e){let{passed:A,total:t}=this.getMetricsCounts(e);return A===t}formatTimestamp(e){let A=Number(e);if(isNaN(A))return"Invalid timestamp provided";let t=new Date(A*1e3);if(isNaN(t.getTime()))return"Invalid date created from timestamp";let n={month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0};return new Intl.DateTimeFormat("en-US",n).format(t)}getEvaluationStatusCardActionButtonIcon(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled?"keyboard_arrow_up":"keyboard_arrow_down"}toggleHistoryStatusCard(e){this.getEvalHistoryOfCurrentSet()[e].isToggled=!this.getEvalHistoryOfCurrentSet()[e].isToggled}isEvaluationStatusCardToggled(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled}generateHistoryEvaluationDatasource(e){return this.getEvalHistoryOfCurrentSet()[e].evaluationResults}getHistorySession(e,A){let t=e.sessionId,n=e.evalId;this.selectedHistoryRun.set(A),this.evalService.getEvalCase(this.appName(),this.selectedEvalSet(),n).subscribe(o=>{this.sessionService.getSession(this.userId(),this.appName(),t).subscribe(a=>{this.addEvalCaseResultToEvents(a,e);let r=this.fromApiResultToSession(a);r.evalCase=o,r.evalCaseResult=e,r.timestamp=A,this.sessionSelected.emit(r)})})}getEvalCase(e){this.evalService.getEvalCase(this.appName(),this.selectedEvalSet(),e).subscribe(A=>{this.selectedEvalCase.set(A),this.evalCaseSelected.emit(A),this.evalSetIdSelected.emit(this.selectedEvalSet())})}resetEvalCase(){this.selectedEvalCase.set(null)}resetEvalResults(){this.currentEvalResultBySet.clear()}confirmDeleteEvalCase(e,A){e.stopPropagation();let t={title:"Confirm delete",message:`Are you sure you want to delete ${A}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(dc,{width:"600px",data:t}).afterClosed().subscribe(o=>{o&&this.deleteEvalCase(A)})}requestEditEvalCase(e,A){e.stopPropagation(),this.evalService.getEvalCase(this.appName(),this.selectedEvalSet(),A).subscribe(t=>{this.selectedEvalCase.set(t),this.evalCaseSelected.emit(t),this.evalSetIdSelected.emit(this.selectedEvalSet()),this.editEvalCaseRequested.emit(t)})}deleteEvalCase(e){this.evalService.deleteEvalCase(this.appName(),this.selectedEvalSet(),e).subscribe(A=>{this.deletedEvalCaseIndex=this.evalCases.indexOf(e),this.selectedEvalCase.set(null),this.listEvalCases(),this.changeDetectorRef.detectChanges()})}confirmDeleteEvalSet(e,A){e.stopPropagation();let t={title:"Confirm delete",message:`Are you sure you want to delete eval set ${A}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(dc,{width:"600px",data:t}).afterClosed().subscribe(o=>{o&&this.deleteEvalSet(A)})}deleteEvalSet(e){this.evalService.deleteEvalSet(this.appName(),e).subscribe(A=>{this.getEvalSet(),this.changeDetectorRef.detectChanges()})}getEvaluationResult(e=!1){this.evalService.listEvalResults(this.appName()).pipe(qo(A=>A.status===404&&A.statusText==="Not Found"?(this.shouldShowTab.emit(!1),ie(null)):ie([])),pi(A=>{if(!A||A.length===0)return ie([]);let t=A.map(n=>this.evalService.getEvalResult(this.appName(),n));return DC(t)})).subscribe(A=>{if(A.length===0)return;let t="";for(let n of A){this.appEvaluationResults[this.appName()]||(this.appEvaluationResults[this.appName()]={}),this.appEvaluationResults[this.appName()][n.evalSetId]||(this.appEvaluationResults[this.appName()][n.evalSetId]={});let o=n.creationTimestamp;(!t||o>t)&&(t=o);let a={isToggled:!1,evaluationResults:n.evalCaseResults.map(r=>({setId:r.id,evalId:r.evalId,finalEvalStatus:r.finalEvalStatus,evalMetricResults:r.evalMetricResults,evalMetricResultPerInvocation:r.evalMetricResultPerInvocation,sessionId:r.sessionId,sessionDetails:r.sessionDetails,overallEvalMetricResults:r.overallEvalMetricResults??[]}))};this.appEvaluationResults[this.appName()][n.evalSetId][o]=a}this.changeDetectorRef.detectChanges(),e&&t&&(this.selectedEvalTab.set("history"),this.selectedHistoryRun.set(t)),this.evalRunning.set(!1)})}openEvalConfigDialog(){this.loadingMetrics.set(!0),this.evalService.getMetricsInfo(this.appName()).pipe(qo(e=>(console.error("Error fetching metrics info",e),ie({metricsInfo:[]})))).subscribe(e=>{this.loadingMetrics.set(!1),this.dialog.open(T5,{maxWidth:"90vw",maxHeight:"90vh",data:{evalMetrics:this.evalMetrics,metricsInfo:e.metricsInfo||[]}}).afterClosed().subscribe(t=>{t&&(this.evalMetrics=t,localStorage.setItem("adk_eval_metrics_selection",JSON.stringify(t)),this.runEval())})})}getEvalMetrics(e){if(!e||!e.evaluationResults||!e.evaluationResults.evaluationResults)return this.evalMetrics;let A=e.evaluationResults.evaluationResults;return A.length===0?this.evalMetrics:typeof A[0].overallEvalMetricResults>"u"||!A[0].overallEvalMetricResults||A[0].overallEvalMetricResults.length===0?this.evalMetrics:A[0].overallEvalMetricResults.map(n=>({metricName:n.metricName,threshold:n.threshold}))}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-eval-tab"]],viewQuery:function(A,t){A&1&&Xr(t.checkboxes,Og,5),A&2&&Er()},inputs:{appName:[1,"appName"],userId:[1,"userId"],sessionId:[1,"sessionId"]},outputs:{sessionSelected:"sessionSelected",shouldShowTab:"shouldShowTab",evalNotInstalledMsg:"evalNotInstalledMsg",evalCaseSelected:"evalCaseSelected",evalSetIdSelected:"evalSetIdSelected",shouldReturnToSession:"shouldReturnToSession",editEvalCaseRequested:"editEvalCaseRequested"},features:[Zt],decls:17,vars:11,consts:[[1,"eval-container"],[1,"eval-detail-header"],["mat-icon-button","","matTooltip","All Eval Sets",3,"click"],[1,"breadcrumb-item",2,"font-weight","500","color","var(--mat-sys-on-surface)"],[1,"spacer"],[1,"eval-details-container"],[1,"breadcrumb-separator"],["matTooltip","Eval Set",1,"breadcrumb-item","clickable"],["matTooltip","Eval Set",1,"breadcrumb-item"],["matTooltip","Eval Set",1,"breadcrumb-item","clickable",3,"click"],["matTooltip","Eval Cases",1,"breadcrumb-item"],["matTooltip","Runs",1,"breadcrumb-item"],["matTooltip","Run",1,"breadcrumb-item"],["matTooltip","Eval Case",1,"breadcrumb-item"],["mat-button","",3,"click","matTooltip"],["mat-icon-button","","matTooltip","Refresh",3,"click"],[1,"empty-eval-info"],[1,"info-title"],[1,"info-detail"],[1,"info-create",3,"click"],[1,"eval-set-row"],[1,"eval-set-row",3,"click"],[1,"eval-set-left"],[1,"material-symbols-outlined"],[1,"eval-set-name"],[1,"eval-set-right"],["mat-icon-button","",1,"delete-btn",3,"click","matTooltip"],[1,"eval-details-content"],[1,"vertical-tabs-sidebar"],["mat-icon-button","","matTooltip","Info","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Eval Cases","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Runs","matTooltipPosition","right",3,"click"],[1,"vertical-tabs-content"],[2,"display","flex","justify-content","center","align-items","center","padding","20px"],["mode","indeterminate",3,"diameter","strokeWidth"],[1,"info-tables-container"],["app-info-table",""],[3,"matTooltip"],[1,"eval-case-details",2,"padding","16px"],[1,"toolbar",2,"position","sticky","top","0","z-index","1"],[2,"margin-left","6px",3,"change","checked","indeterminate"],["mat-button","","color","primary",3,"click","disabled"],["mode","indeterminate",2,"display","inline-block","vertical-align","middle","margin-right","8px",3,"diameter"],["mat-button","","color","accent",3,"click"],[1,"eval-cases-list"],[1,"eval-case-row",3,"selected-row"],[1,"eval-case-row",3,"click"],[3,"click","change","checked"],[1,"eval-case-id"],["mat-icon-button","",1,"edit-btn",3,"click","matTooltip"],[2,"margin-bottom","16px"],[2,"margin-top","0"],[2,"margin-bottom","8px"],[1,"eval-case-row","clickable",3,"selected-row"],[2,"padding","16px","text-align","center","color","var(--app-color-text-secondary)"],[1,"eval-case-row","clickable",3,"click"],[1,"status-card__summary",2,"width","50px","text-align","center"],[2,"font-family","monospace",3,"ngClass"],[2,"padding","16px"],[1,"eval-case-row"],[1,"status-card__summary"],[1,"status-card__passed",2,"font-family","monospace"],[1,"status-card__separator"],[1,"status-card__failed",2,"font-family","monospace"],[1,"status-card",2,"margin-top","0"],[1,"status-card__overview"],[1,"status-card__info"],[1,"status-card__metrics"],[1,"status-card__history-cases"],[1,"status-card__history-case",2,"display","flex","justify-content","space-between","align-items","center"],[1,"status-card__metric"],[1,"status-card__metric-name",3,"matTooltip"],[1,"status-card__metric-value"],[1,"status-card__history-case",2,"display","flex","justify-content","space-between","align-items","center",3,"click"],[2,"font-family","monospace","width","50px","text-align","center",3,"ngClass"]],template:function(A,t){A&1&&(d(0,"div",0)(1,"div",1)(2,"button",2),T("click",function(){return t.clearAllNavigation()}),d(3,"mat-icon"),y(4,"home"),E()(),Y(5,V5A,2,0,"span",3),Y(6,X5A,4,1),Y(7,$5A,4,0),Y(8,ADA,4,0),Y(9,eDA,4,1),Y(10,tDA,4,1),lA(11,"span",4),Y(12,iDA,7,1),E(),Y(13,nDA,0,0),Y(14,oDA,8,3,"div"),Y(15,rDA,3,0,"div"),Y(16,RDA,15,7,"div",5),E()),A&2&&(u(5),O(t.selectedEvalSet()===""?5:-1),u(),O(t.selectedEvalSet()!==""?6:-1),u(),O(t.selectedEvalSet()!==""&&t.selectedEvalTab()==="cases"&&!t.selectedEvalCase()?7:-1),u(),O(t.selectedEvalSet()!==""&&t.selectedEvalTab()==="history"&&!t.selectedHistoryRun()?8:-1),u(),O(t.selectedHistoryRun()&&!t.selectedEvalCase()?9:-1),u(),O(t.selectedEvalCase()?10:-1),u(2),O(t.selectedEvalSet()===""?12:-1),u(),O(t.selectedEvalSet()==""?13:-1),u(),O(t.evalsets.length==0?14:-1),u(),O(t.evalsets.length>0&&t.selectedEvalSet()==""?15:-1),u(),O(t.selectedEvalSet()!=""?16:-1))},dependencies:[zt,Si,vi,Zi,Og,Fl,os,e1,N0,Ta,b3,A1],styles:[".eval-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;box-sizing:border-box}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 10px;background-color:var(--mat-sys-surface-container, #f5f5f5);border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0);gap:8px}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%]{flex:1 1 auto}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{height:32px!important;line-height:normal!important;border-radius:16px!important;font-size:13px!important;font-weight:500!important;display:inline-flex!important;align-items:center;justify-content:center}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%]{padding:0 12px!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:4px!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%]{width:32px!important;min-width:32px!important;padding:0!important;border-radius:50%!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:0!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple{width:32px!important;height:32px!important;border-radius:50%!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important;vertical-align:middle}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{vertical-align:middle}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%]{width:100%;background:transparent;border-top:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{font-weight:600}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:middle;padding:6px 16px;border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr.mat-header-row[_ngcontent-%COMP%]{display:none}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]{cursor:pointer;background:transparent}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr.selected-row[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high, #e0e0e0)}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%]{display:flex;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant);height:48px;flex-shrink:0;padding:0 16px;gap:8px}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%]{flex:1 1 auto}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-separator[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);margin:0 4px}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]{font-size:14px;color:var(--mat-sys-on-surface-variant)}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item.clickable[_ngcontent-%COMP%]{color:var(--mat-sys-primary);cursor:pointer}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item.clickable[_ngcontent-%COMP%]:hover{text-decoration:underline}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]:last-child{color:var(--mat-sys-on-surface);font-weight:500}.eval-container[_ngcontent-%COMP%] .eval-set-title[_ngcontent-%COMP%]{font-size:14px;font-weight:500;color:var(--mat-sys-on-surface);margin-right:16px}.eval-case-id[_ngcontent-%COMP%]{cursor:pointer}.eval-set-actions[_ngcontent-%COMP%]{display:flex;justify-content:space-between;color:var(--mat-sys-on-surface);font-style:normal;font-weight:700;font-size:14px}.empty-eval-info[_ngcontent-%COMP%]{margin-top:12px}.info-title[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);font-size:14px;font-weight:500;padding-top:13px;padding-right:16px;padding-left:16px}.info-detail[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:14px;font-weight:400;padding-top:13px;padding-right:16px;padding-left:16px;letter-spacing:.2px}.info-create[_ngcontent-%COMP%]{color:var(--mat-sys-primary);font-size:14px;font-style:normal;font-weight:500;padding-right:16px;padding-left:16px;margin-top:19px;padding-bottom:16px;cursor:pointer}.eval-set-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;cursor:pointer;padding:6px 16px;min-height:44px;border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0);background:transparent}.eval-set-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.eval-set-row[_ngcontent-%COMP%]:hover .delete-btn[_ngcontent-%COMP%]{opacity:1}.eval-set-row[_ngcontent-%COMP%] .eval-set-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px}.eval-set-row[_ngcontent-%COMP%] .eval-set-left[_ngcontent-%COMP%] span.material-symbols-outlined[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:20px}.eval-set-row[_ngcontent-%COMP%] .eval-set-name[_ngcontent-%COMP%]{font-size:14px;color:var(--mat-sys-on-surface)}.eval-set-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out;color:var(--mat-sys-outline)}.eval-set-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-error)}.eval-set-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important}.selected-eval-case[_ngcontent-%COMP%]{font-weight:900;color:var(--mat-sys-primary)}.save-session-btn[_ngcontent-%COMP%]{width:100%;border:none;border-radius:4px;margin-top:12px;cursor:pointer}.save-session-btn-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.save-session-btn-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--mat-sys-on-primary);font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.run-eval-btn[_ngcontent-%COMP%]{border-radius:4px;border:1px solid var(--mat-sys-outline);padding:8px 24px;margin-top:16px;color:var(--mat-sys-primary);cursor:pointer}.run-eval-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-high)}.result-btn[_ngcontent-%COMP%]{display:flex;border-radius:4px;border:1px solid var(--mat-sys-outline-variant);margin-top:4px;cursor:pointer}.result-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-high)}.result-btn.pass[_ngcontent-%COMP%]{color:var(--mat-sys-tertiary)}.result-btn.fail[_ngcontent-%COMP%]{color:var(--mat-sys-error)}.evaluation-tab-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.evaluation-history-icon[_ngcontent-%COMP%]{cursor:pointer;margin-top:4px}.status-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;border-radius:8px;padding:12px 16px;margin-top:12px;background-color:var(--mat-sys-surface-container)}.status-card__overview[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.status-card__info[_ngcontent-%COMP%]{display:flex;flex-direction:column}.status-card__timestamp[_ngcontent-%COMP%]{font-size:.9em;color:var(--mat-sys-on-surface-variant);margin-bottom:5px}.status-card__summary[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:.95em;font-weight:500;color:var(--mat-sys-on-surface)}.status-card__metrics[_ngcontent-%COMP%]{display:flex;align-items:center;flex-wrap:wrap;font-size:.75em;margin-top:3px}.status-card__metric[_ngcontent-%COMP%]{width:160px;display:flex;align-items:center;color:var(--mat-sys-on-surface);margin-right:12px;margin-bottom:4px}.status-card__metric-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.status-card__metric-value[_ngcontent-%COMP%]{margin-left:4px;flex-shrink:0}.status-card__failed[_ngcontent-%COMP%]{color:var(--mat-sys-error)}.status-card__separator[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);margin:0 8px}.status-card__passed[_ngcontent-%COMP%]{color:#2e7d32}.status-card__action[_ngcontent-%COMP%]{display:flex;align-items:center}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);cursor:pointer;transition:transform .2s ease-in-out}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:1.2em;cursor:pointer}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__history-cases[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin-top:3px;justify-content:flex-start;width:100%}.status-card__history-case[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%;margin-top:4px;padding:8px 12px;border-radius:4px;cursor:pointer;box-sizing:border-box}.status-card__history-case[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.eval-spinner[_ngcontent-%COMP%]{margin-top:12px}.eval-details-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;overflow:hidden}.eval-details-content[_ngcontent-%COMP%]{display:flex;flex:1;overflow:hidden}.vertical-tabs-sidebar[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:48px;border-right:1px solid var(--mat-sys-outline-variant);padding-top:8px;align-items:center;gap:8px}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.vertical-tabs-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto}.eval-cases-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:100%}.eval-case-row[_ngcontent-%COMP%]{display:flex;align-items:center;cursor:pointer;padding:8px 16px;gap:12px;border-bottom:1px solid var(--mat-sys-outline-variant);background:transparent}.eval-case-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low)}.eval-case-row[_ngcontent-%COMP%]:hover .delete-btn[_ngcontent-%COMP%], .eval-case-row[_ngcontent-%COMP%]:hover .edit-btn[_ngcontent-%COMP%]{opacity:1}.eval-case-row.selected-row[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high)}.eval-case-row[_ngcontent-%COMP%] .eval-case-id[_ngcontent-%COMP%]{font-size:14px;color:var(--mat-sys-on-surface);font-family:Google Sans Mono,monospace;flex:1}.eval-case-row[_ngcontent-%COMP%] .edit-btn[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out;color:var(--mat-sys-on-surface-variant)}.eval-case-row[_ngcontent-%COMP%] .edit-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-primary)}.eval-case-row[_ngcontent-%COMP%] .edit-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important}.eval-case-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out;color:var(--mat-sys-on-surface-variant)}.eval-case-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-error)}.eval-case-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important}.eval-case-row.header-row[_ngcontent-%COMP%]{cursor:default;background-color:var(--mat-sys-surface-container-lowest)}.eval-case-row.header-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-lowest)}.info-tables-container[_ngcontent-%COMP%]{padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:24px}"]})};var NDA={noSessionsFound:"No sessions found",readonlyChip:"Read-only",filterSessionsLabel:"Search using session ID"},OZ=new MA("Session Tab Messages",{factory:()=>NDA});function FDA(i,e){if(i&1&&(d(0,"div",1)(1,"mat-form-field",4)(2,"mat-label"),y(3),E(),d(4,"mat-icon",5),y(5,"filter_list"),E(),lA(6,"input",6),E()()),i&2){let A=p();u(3),iA(A.i18n.filterSessionsLabel),u(3),H("formControl",A.filterControl)}}function LDA(i,e){i&1&&(d(0,"div",2),lA(1,"mat-progress-bar",7),E())}function GDA(i,e){if(i&1&&(d(0,"div",3),y(1),E()),i&2){let A=p();u(),ya("",A.i18n.noSessionsFound," for user '",A.userId,"'")}}function KDA(i,e){if(i&1&&(d(0,"div",18),y(1),E()),i&2){let A=p().$implicit;H("title",A.id),u(),iA(A.id)}}function UDA(i,e){if(i&1&&(d(0,"div",19)(1,"mat-icon"),y(2,"visibility"),E(),y(3),E()),i&2){let A=p(3);u(3),Be(" ",A.i18n.readonlyChip," ")}}function TDA(i,e){if(i&1){let A=rA();d(0,"div",10),T("click",function(){let n=G(A).$implicit,o=p(2);return K(o.getSession(n.id))}),d(1,"div",11)(2,"div",12)(3,"div",13),y(4),E(),d(5,"button",14),T("click",function(n){let o=G(A).$implicit,a=p(2);return K(a.promoteToTest(n,o))}),d(6,"mat-icon"),y(7,"fact_check"),E()(),d(8,"button",15),T("click",function(n){let o=G(A).$implicit,a=p(2);return K(a.deleteSession(n,o))}),d(9,"mat-icon"),y(10,"delete"),E()()(),d(11,"div",16)(12,"div",17),y(13),E(),Y(14,KDA,2,2,"div",18),E()(),Y(15,UDA,4,1,"div",19),Ht(16,"async"),E()}if(i&2){let A=e.$implicit,t=p(2);H("ngClass",A.id===t.sessionId?"session-item current":"session-item"),u(3),xA("is-monospace",!t.hasDisplayName(A)),H("title",A.id),u(),iA(t.getSessionDisplayName(A)),u(9),iA(t.getDate(A)),u(),O(t.hasDisplayName(A)?14:-1),u(),O(ci(16,8,t.sessionService.canEdit(t.userId,A))===!1?15:-1)}}function JDA(i,e){i&1&&(d(0,"div",2),lA(1,"mat-progress-bar",7),E())}function YDA(i,e){if(i&1){let A=rA();Y(0,JDA,2,0,"div",2),d(1,"div",20)(2,"button",21),T("click",function(){G(A);let n=p(2);return K(n.loadMoreSessions())}),y(3,"Load more"),E()()}if(i&2){p(2);let A=xn(3);O(A?0:-1)}}function ODA(i,e){if(i&1&&(d(0,"div",8),xe(1,TDA,17,10,"div",9,ni),E(),Y(3,YDA,4,1),Ht(4,"async")),i&2){let A=p();u(),Re(A.sessionList),u(2),O(ci(4,1,A.isSessionFilteringEnabled)&&A.canLoadMoreSessions?3:-1)}}var Y5=class i{userId="";appName="";sessionId="";sessionSelected=new LA;sessionReloaded=new LA;SESSIONS_PAGE_LIMIT=100;sessionList=[];canLoadMoreSessions=!1;pageToken="";filterControl=new Rs("");editingSessionId=null;sessionNameControl=new Rs("");refreshSessionsSubject=new te;route=w(Ts);changeDetectorRef=w(wt);sessionService=w(Os);uiStateService=w(ql);i18n=w(OZ);featureFlagService=w(mr);dialog=w(Ja);testsService=w(jC);isSessionFilteringEnabled=this.featureFlagService.isSessionFilteringEnabled();isLoadingMoreInProgress=mA(!1);isInitialized=mA(!1);constructor(){this.filterControl.valueChanges.pipe(Ms(300)).subscribe(()=>{this.pageToken="",this.sessionList=[],this.refreshSessionsSubject.next()}),this.refreshSessionsSubject.pipe(Ei(()=>{this.uiStateService.setIsSessionListLoading(!0)}),pi(()=>{let e=this.filterControl.value||void 0;return this.isSessionFilteringEnabled?this.sessionService.listSessions(this.userId,this.appName,{filter:e,pageToken:this.pageToken,pageSize:this.SESSIONS_PAGE_LIMIT}).pipe(qo(()=>ie({items:[],nextPageToken:""}))):this.sessionService.listSessions(this.userId,this.appName).pipe(qo(()=>ie({items:[],nextPageToken:""})))}),Ei(({items:e,nextPageToken:A})=>{this.isInitialized.set(!0),this.sessionList=Array.from(new Map([...this.sessionList,...e].map(t=>[t.id,t])).values()).sort((t,n)=>Number(n.lastUpdateTime)-Number(t.lastUpdateTime)),this.pageToken=A??"",this.canLoadMoreSessions=!!A,this.changeDetectorRef.markForCheck()})).subscribe(()=>{this.isLoadingMoreInProgress.set(!1),this.uiStateService.setIsSessionListLoading(!1)},()=>{this.isLoadingMoreInProgress.set(!1),this.uiStateService.setIsSessionListLoading(!1)})}ngOnInit(){this.featureFlagService.isSessionFilteringEnabled().subscribe(e=>{if(e){let A=this.route.snapshot.queryParams.session;A&&this.filterControl.setValue(A)}}),setTimeout(()=>{this.refreshSessionsSubject.next()},500)}getSession(e){e&&this.sessionSelected.emit(e)}loadMoreSessions(){this.isLoadingMoreInProgress.set(!0),this.refreshSessionsSubject.next()}getSessionDisplayName(e){return e.state?.__session_metadata__?.displayName||e.id}hasDisplayName(e){return!!e.state?.__session_metadata__?.displayName}startEditSessionName(e){this.editingSessionId=e.id,this.sessionNameControl.setValue(this.getSessionDisplayName(e))}cancelEditSessionName(){this.editingSessionId=null,this.sessionNameControl.setValue("")}saveSessionName(e){if(!this.editingSessionId||!e.id)return;let A=this.sessionNameControl.value,t=e.state||{},n=Oe(oA({},t),{__session_metadata__:Oe(oA({},t.__session_metadata__||{}),{displayName:A})});e.state=n,this.editingSessionId=null,this.sessionService.updateSession(this.userId,this.appName,e.id,{stateDelta:n}).subscribe({error:()=>{}})}deleteSession(e,A){e.stopPropagation();let t=A.id,n=this.getSessionDisplayName(A),o=`Are you sure you want to delete session ${t}?`;n!==t&&(o=`Are you sure you want to delete session "${n}" (${t})?`);let a={title:"Confirm delete",message:o,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(dc,{width:"600px",data:a}).afterClosed().subscribe(s=>{s&&this.sessionService.deleteSession(this.userId,this.appName,t).subscribe(()=>{this.refreshSession(t)})})}promoteToTest(e,A){e.stopPropagation();let t=window.prompt("Enter test name (e.g., test1):");t&&this.sessionService.getSession(this.userId,this.appName,A.id).subscribe(n=>{let o={events:n.events};this.testsService.createTest(this.appName,t,o).subscribe({next:()=>{alert(`Test ${t} created successfully.`)},error:a=>{alert(`Error creating test: ${a.message||a}`)}})})}getDate(e){let A=e.lastUpdateTime||0;return new Date(A*1e3).toLocaleString()}fromApiResultToSession(e){return{id:e.id??"",appName:e.appName??"",userId:e.userId??"",state:e.state??{},events:e.events??[]}}reloadSession(e){this.sessionReloaded.emit(e)}refreshSession(e){let A=null;if(this.sessionList.length>0){let t=this.sessionList.findIndex(n=>n.id===e);t===this.sessionList.length-1&&(t=-1),A=this.sessionList[t+1]}return this.isSessionFilteringEnabled?this.filterControl.setValue(""):(this.sessionList=[],this.refreshSessionsSubject.next()),A}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-session-tab"]],inputs:{userId:"userId",appName:"appName",sessionId:"sessionId"},outputs:{sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded"},decls:8,vars:7,consts:[[1,"session-wrapper"],[1,"session-filter-container"],[1,"loading-spinner-container"],[1,"empty-state"],["appearance","outline",1,"session-filter"],["matPrefix",""],["matInput","",3,"formControl"],["mode","indeterminate"],[1,"session-tab-container",2,"margin-top","16px"],[3,"ngClass"],[3,"click","ngClass"],[1,"session-info"],[1,"session-header"],[1,"session-id",3,"title"],["mat-icon-button","","title","Promote to test",1,"action-btn","promote-btn",3,"click"],["mat-icon-button","","title","Delete session",1,"action-btn","delete-btn",3,"click"],[1,"session-sub-row"],[1,"session-date"],[1,"session-real-id",3,"title"],[1,"readonly-badge"],[1,"load-more"],["mat-button","","color","primary",3,"click"]],template:function(A,t){if(A&1&&(d(0,"div",0),Y(1,FDA,7,2,"div",1),Ht(2,"async"),Uo(3),Ht(4,"async"),Y(5,LDA,2,0,"div",2)(6,GDA,2,2,"div",3)(7,ODA,5,3),E()),A&2){u(),O(ci(2,2,t.isSessionFilteringEnabled)?1:-1),u(2);let n=Wo(ci(4,4,t.uiStateService.isSessionListLoading()));u(2),O((n||!t.isInitialized())&&!t.isLoadingMoreInProgress()?5:!n&&t.isInitialized()&&t.sessionList.length===0?6:7)}},dependencies:[Fl,WE,zt,Ta,To,us,vy,Gs,Qa,cn,yn,vn,xC,I1,Wi,Si,vi,On,hl,$r],styles:[".session-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;font-size:14px;font-weight:700;color:var(--session-tab-session-wrapper-color);display:flex;flex-direction:column;overflow:hidden;height:100%}.session-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{color:initial;padding-top:1em;text-align:center;font-weight:400;font-style:italic}.session-wrapper[_ngcontent-%COMP%] .session-filter-container[_ngcontent-%COMP%]{border-radius:8px;padding:16px;margin-bottom:16px;margin-top:16px}.session-wrapper[_ngcontent-%COMP%] .session-filter[_ngcontent-%COMP%]{width:100%}.session-tab-container[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.session-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;border:none;border-radius:8px;margin-bottom:4px;cursor:pointer}.session-item[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant, rgba(0, 0, 0, .04))}.session-item.current[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))}.session-item[_ngcontent-%COMP%] mat-chip[_ngcontent-%COMP%]{margin-right:11px}.session-id[_ngcontent-%COMP%]{color:var(--session-tab-session-id-color);font-family:Roboto,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.session-id.is-monospace[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.session-sub-row[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:8px}.session-date[_ngcontent-%COMP%]{color:var(--session-tab-session-date-color);font-family:Roboto;font-size:12px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.3px;white-space:nowrap}.session-real-id[_ngcontent-%COMP%]{color:var(--session-tab-session-id-color);font-family:Google Sans Mono,monospace;font-size:12px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.3px;opacity:.7;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;text-align:right}.session-info[_ngcontent-%COMP%]{padding:11px;flex:1;min-width:0}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;height:24px;margin-bottom:2px}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .session-id[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .session-name-input[_ngcontent-%COMP%]{flex:1;height:20px;padding:0 4px;font-family:inherit;font-size:14px;border:1px solid var(--mat-sys-outline, #ccc);border-radius:4px;background:var(--mat-sys-surface, #fff);color:var(--mat-sys-on-surface, #000);outline:none;min-width:0;margin-right:4px}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .session-name-input[_ngcontent-%COMP%]:focus{border-color:var(--mat-sys-primary, #1976d2)}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]{width:24px;height:24px;padding:0;display:none}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] .mat-icon{font-size:16px;width:16px;height:16px;line-height:16px}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .save-btn[_ngcontent-%COMP%], .session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .cancel-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;margin-left:2px}.session-item[_ngcontent-%COMP%]:hover .action-btn.edit-btn[_ngcontent-%COMP%], .session-item[_ngcontent-%COMP%]:hover .action-btn.delete-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center}.loading-spinner-container[_ngcontent-%COMP%]{margin-left:auto;margin-right:auto;margin-top:2em;width:100%}.load-more[_ngcontent-%COMP%]{display:flex;justify-content:center;margin-top:1em}.readonly-badge[_ngcontent-%COMP%]{color:var(--chat-readonly-badge-color);border-radius:4px;padding:1px 6px;display:flex;align-items:center;margin-right:8px;font-size:12px;line-height:16px;gap:4px;white-space:nowrap}.readonly-badge[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;padding-top:1px;flex-shrink:0}"]})};var HDA=["consoleArea"];function zDA(i,e){i&1&&lA(0,"mat-progress-bar",3)}var t3=class i{constructor(e,A){this.dialogRef=e;this.data=A}consoleOutput=mA("");isLoading=mA(!0);subscription;consoleArea;ngOnInit(){this.subscription=this.data.output$.subscribe({next:e=>{this.consoleOutput.update(A=>A+e),this.scrollToBottom()},complete:()=>{this.isLoading.set(!1)}})}ngOnDestroy(){this.subscription?.unsubscribe()}scrollToBottom(){setTimeout(()=>{if(this.consoleArea){let e=this.consoleArea.nativeElement;e.scrollTop=e.scrollHeight}},0)}close(){this.dialogRef.close()}static \u0275fac=function(A){return new(A||i)(ot(Vn),ot(xo))};static \u0275cmp=bA({type:i,selectors:[["app-console-dialog"]],viewQuery:function(A,t){if(A&1&&Yt(HDA,5),A&2){let n;oe(n=ae())&&(t.consoleArea=n.first)}},decls:11,vars:3,consts:[["consoleArea",""],["mat-dialog-title",""],[1,"mat-typography"],["mode","indeterminate",2,"margin-bottom","8px"],[1,"console-box"],["align","end"],["mat-button","",3,"click"]],template:function(A,t){A&1&&(d(0,"h2",1),y(1),E(),d(2,"mat-dialog-content",2),Y(3,zDA,1,0,"mat-progress-bar",3),d(4,"div",4,0)(6,"pre"),y(7),E()()(),d(8,"mat-dialog-actions",5)(9,"button",6),T("click",function(){return t.close()}),y(10,"Close"),E()()),A&2&&(u(),iA(t.data.title),u(2),O(t.isLoading()?3:-1),u(4),iA(t.consoleOutput()))},dependencies:[si,Wi,Si,hl,na,pa,ua,ZE,WE],styles:[".console-box[_ngcontent-%COMP%]{background-color:#1e1e1e;color:#dcdcdc;padding:16px;border-radius:4px;min-height:200px;flex:1;overflow-y:auto;font-family:Roboto Mono,monospace;font-size:12px}.console-box[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{margin:0;white-space:pre-wrap;word-wrap:break-word} .mat-mdc-dialog-content{max-height:70vh!important;overflow:hidden!important;display:flex;flex-direction:column}"]})};function PDA(i,e){i&1&&(d(0,"div",7),lA(1,"mat-spinner",8),E())}var i3=class i{constructor(e,A){this.dialogRef=e;this.data=A;this.inputValue=A.value}inputValue;loading=mA(!1);onCancel(){this.dialogRef.close()}onSubmitClick(){this.inputValue&&(this.loading.set(!0),this.data.onSubmit(this.inputValue).subscribe({next:()=>{this.loading.set(!1),this.dialogRef.close(!0)},error:e=>{this.loading.set(!1),window.alert(`Operation failed: ${e.message||e}`)}}))}static \u0275fac=function(A){return new(A||i)(ot(Vn),ot(xo))};static \u0275cmp=bA({type:i,selectors:[["app-prompt-dialog"]],decls:13,vars:7,consts:[["mat-dialog-title",""],[1,"full-width"],["matInput","",3,"ngModelChange","ngModel","disabled"],["class","spinner-container",4,"ngIf"],["align","end"],["mat-button","",3,"click","disabled"],["mat-button","","color","primary",3,"click","disabled"],[1,"spinner-container"],["diameter","40"]],template:function(A,t){A&1&&(d(0,"h2",0),y(1),E(),d(2,"mat-dialog-content")(3,"mat-form-field",1)(4,"mat-label"),y(5),E(),d(6,"input",2),yi("ngModelChange",function(o){return hi(t.inputValue,o)||(t.inputValue=o),o}),E()(),yt(7,PDA,2,0,"div",3),E(),d(8,"mat-dialog-actions",4)(9,"button",5),T("click",function(){return t.onCancel()}),y(10,"Cancel"),E(),d(11,"button",6),T("click",function(){return t.onSubmitClick()}),y(12,"Submit"),E()()),A&2&&(u(),iA(t.data.title),u(4),iA(t.data.label),u(),Di("ngModel",t.inputValue),H("disabled",t.loading()),u(),H("ngIf",t.loading()),u(2),H("disabled",t.loading()),u(2),H("disabled",t.loading()||!t.inputValue))},dependencies:[si,Ll,hl,na,pa,ua,Wi,Si,Ta,To,us,Gs,Qa,zC,os,cn,yn,vn,_o],styles:[".full-width[_ngcontent-%COMP%]{width:100%}.spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:16px}"]})};function jDA(i,e){i&1&&(d(0,"div",6)(1,"mat-icon"),y(2,"assignment_late"),E(),d(3,"span"),y(4,"No tests found for this agent."),E()())}function qDA(i,e){i&1&&(d(0,"th",13),y(1," Test Name "),E())}function VDA(i,e){if(i&1&&(d(0,"td",14),y(1),E()),i&2){let A=e.$implicit;u(),Be(" ",A.replace(".json","")," ")}}function WDA(i,e){i&1&&(d(0,"th",13),y(1," Actions "),E())}function ZDA(i,e){if(i&1){let A=rA();d(0,"td",14)(1,"button",15),T("click",function(){let n=G(A).$implicit,o=p(2);return K(o.runTest(n))}),d(2,"mat-icon"),y(3,"play_arrow"),E()(),d(4,"button",16),T("click",function(){let n=G(A).$implicit,o=p(2);return K(o.rebuildTest(n))}),d(5,"mat-icon"),y(6,"sync"),E()(),d(7,"button",17),T("click",function(){let n=G(A).$implicit,o=p(2);return K(o.renameTest(n))}),d(8,"mat-icon"),y(9,"edit"),E()(),d(10,"button",18),T("click",function(){let n=G(A).$implicit,o=p(2);return K(o.deleteTest(n))}),d(11,"mat-icon"),y(12,"delete"),E()()()}if(i&2){let A=p(2);u(),H("disabled",A.isRunning()||A.isRebuilding()),u(3),H("disabled",A.isRunning()||A.isRebuilding()),u(3),H("disabled",A.isRunning()||A.isRebuilding()),u(3),H("disabled",A.isRunning()||A.isRebuilding())}}function XDA(i,e){if(i&1){let A=rA();d(0,"tr",19),T("click",function(){let n=G(A).$implicit,o=p(2);return K(o.selectTest(n))}),E()}if(i&2){let A=e.$implicit,t=p(2);xA("selected-row",A===t.selectedTest())}}function $DA(i,e){if(i&1&&(d(0,"table",7),Il(1,8),yt(2,qDA,2,0,"th",9)(3,VDA,2,1,"td",10),dl(),Il(4,11),yt(5,WDA,2,0,"th",9)(6,ZDA,13,4,"td",10),dl(),yt(7,XDA,1,2,"tr",12),E()),i&2){let A=p();H("dataSource",A.dataSource),u(7),H("matRowDefColumns",A.displayedColumns)}}var O5=class i{appName=De("");sessionId=De("");userId=De("");isViewOnlySession=De(!1);testsService=w(jC);dialog=w(Ja);sessionService=w(Os);dataSource=new qI([]);consoleOutput=mA("");selectedTest=mA(null);testSelected=fi();isRunning=mA(!1);isRebuilding=mA(!1);displayedColumns=["name","actions"];ngOnInit(){this.loadTests()}ngOnChanges(e){e.appName&&!e.appName.isFirstChange()&&this.loadTests()}loadTests(){this.appName()&&this.testsService.listTests(this.appName()).subscribe(e=>{this.dataSource.data=e})}selectTest(e){this.selectedTest.set(e),this.testsService.getTest(this.appName(),e).subscribe(A=>{this.testSelected.emit({testName:e,events:A.events||[]})})}promoteCurrentSessionToTest(){this.sessionId()&&this.sessionService.getSession(this.userId(),this.appName(),this.sessionId()).subscribe(e=>{let t=(e.state?.__session_metadata__?.displayName||this.sessionId()).replace(/ /g,"_").replace(/[^a-zA-Z0-9_-]/g,""),n={events:e.events};this.dialog.open(i3,{data:{title:"Add Current Session as Test",label:"Test Name",value:t,onSubmit:o=>this.testsService.createTest(this.appName(),o,n).pipe(pi(()=>this.testsService.rebuildTests(this.appName(),o)))}}).afterClosed().subscribe(o=>{o&&this.loadTests()})})}renameTest(e){this.dialog.open(i3,{data:{title:"Rename Test",label:"New Name",value:e.replace(".json",""),onSubmit:A=>{let t=A.replace(/ /g,"_").replace(/[^a-zA-Z0-9_-]/g,"");return this.testsService.getTest(this.appName(),e).pipe(pi(n=>this.testsService.createTest(this.appName(),t,n)),pi(()=>this.testsService.deleteTest(this.appName(),e)))}}}).afterClosed().subscribe(A=>{A&&this.loadTests()})}runAllTests(){this.runTest()}runTest(e){this.isRunning.set(!0);let A=new te;this.dialog.open(t3,{width:"90vw",maxWidth:"1200px",height:"80vh",data:{title:`Running ${e||"all tests"}`,output$:A.asObservable()}}),this.testsService.runTests(this.appName(),e).subscribe({next:t=>{A.next(t)},error:t=>{A.next(` +Error: ${t.message||t}`),this.isRunning.set(!1),A.complete()},complete:()=>{this.isRunning.set(!1),A.complete()}})}deleteTest(e){confirm(`Are you sure you want to delete test ${e}?`)&&this.testsService.deleteTest(this.appName(),e).subscribe(()=>{this.loadTests()})}rebuildAllTests(){this.rebuildTest()}rebuildTest(e){this.isRebuilding.set(!0);let A=new te;this.dialog.open(t3,{width:"90vw",maxWidth:"1200px",height:"80vh",data:{title:`Rebuilding ${e||"all tests"}`,output$:A.asObservable()}}),A.next(`Rebuilding tests... +`),this.testsService.rebuildTests(this.appName(),e).subscribe({next:()=>{A.next(`Successfully rebuilt tests. +`),this.isRebuilding.set(!1),this.loadTests(),A.complete()},error:t=>{A.next(`Error rebuilding tests: ${t.message||t} +`),this.isRebuilding.set(!1),A.complete()}})}clearConsole(){this.consoleOutput.set("")}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-tests-tab"]],inputs:{appName:[1,"appName"],sessionId:[1,"sessionId"],userId:[1,"userId"],isViewOnlySession:[1,"isViewOnlySession"]},outputs:{testSelected:"testSelected"},features:[Zt],decls:20,vars:4,consts:[[1,"tests-container"],[1,"toolbar"],["mat-button","","color","primary",3,"click","disabled"],["mat-button","","color","accent",3,"click","disabled"],[1,"spacer"],["mat-icon-button","","matTooltip","Refresh",3,"click"],[1,"empty-state"],["mat-table","",1,"tests-table",3,"dataSource"],["matColumnDef","name"],["mat-header-cell","",4,"matHeaderCellDef"],["mat-cell","",4,"matCellDef"],["matColumnDef","actions"],["mat-row","",3,"selected-row","click",4,"matRowDef","matRowDefColumns"],["mat-header-cell",""],["mat-cell",""],["mat-icon-button","","color","primary","matTooltip","Run Test",3,"click","disabled"],["mat-icon-button","","color","accent","matTooltip","Rebuild Test",3,"click","disabled"],["mat-icon-button","","color","primary","matTooltip","Rename Test",3,"click","disabled"],["mat-icon-button","","color","warn","matTooltip","Delete Test",3,"click","disabled"],["mat-row","",3,"click"]],template:function(A,t){A&1&&(d(0,"div",0)(1,"div",1)(2,"button",2),T("click",function(){return t.promoteCurrentSessionToTest()}),d(3,"mat-icon"),y(4,"add"),E(),y(5," From Current Session "),E(),d(6,"button",2),T("click",function(){return t.runAllTests()}),d(7,"mat-icon"),y(8,"playlist_play"),E(),y(9," Run All "),E(),d(10,"button",3),T("click",function(){return t.rebuildAllTests()}),d(11,"mat-icon"),y(12,"sync"),E(),y(13," Rebuild All "),E(),lA(14,"span",4),d(15,"button",5),T("click",function(){return t.loadTests()}),d(16,"mat-icon"),y(17,"refresh"),E()()(),Y(18,jDA,5,0,"div",6)(19,$DA,8,2,"table",7),E()),A&2&&(u(2),H("disabled",!t.sessionId()||t.isViewOnlySession()),u(4),H("disabled",t.isRunning()||t.isRebuilding()||t.dataSource.data.length===0),u(4),H("disabled",t.isRunning()||t.isRebuilding()||t.dataSource.data.length===0),u(8),O(t.dataSource.data.length===0?18:19))},dependencies:[si,Wi,Si,vi,On,zt,SZ,xZ,_Z,RZ,kZ,NZ,FZ,LZ,Ra,Zi,zC,ZE,hl],styles:[".tests-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;box-sizing:border-box}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 10px;background-color:var(--mat-sys-surface-container);border-bottom:1px solid var(--mat-sys-outline-variant);gap:8px}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%]{flex:1 1 auto}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{height:32px!important;line-height:normal!important;border-radius:16px!important;font-size:13px!important;font-weight:500!important;display:inline-flex!important;align-items:center;justify-content:center}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%]{padding:0 12px!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:4px!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%]{width:32px!important;min-width:32px!important;padding:0!important;border-radius:50%!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:0!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple{width:32px!important;height:32px!important;border-radius:50%!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important;vertical-align:middle}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{vertical-align:middle}.tests-container[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px;color:var(--mat-sys-on-surface-variant);font-style:italic;gap:8px}.tests-container[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%]{width:100%;background:transparent;border-top:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{font-weight:600}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:middle;padding:6px 16px;border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr.mat-header-row[_ngcontent-%COMP%]{display:none}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]{cursor:pointer;background:transparent}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover td.mat-column-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{opacity:1}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr.selected-row[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high, #e0e0e0)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] td.mat-column-actions[_ngcontent-%COMP%]{text-align:right}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] td.mat-column-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%]{margin-top:16px;display:flex;flex-direction:column;gap:8px;flex:1;min-height:200px}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;font-size:1.1rem;font-weight:600}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-size:.9rem;color:var(--mat-sys-on-surface-variant)}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-actions[_ngcontent-%COMP%] .running-status[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_pulse 1.5s infinite}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]{background-color:#1e1e1e;color:#d4d4d4;padding:12px;border-radius:4px;font-family:Courier New,Courier,monospace;font-size:.85rem;overflow:auto;flex:1;margin:0;white-space:pre-wrap;word-break:break-all;border:1px solid #333}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar{width:8px;height:8px}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover{background:#777}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:#1e1e1e}@keyframes _ngcontent-%COMP%_pulse{0%{opacity:.6}50%{opacity:1}to{opacity:.6}}"]})};var AyA={stateIsEmpty:"State is empty"},HZ=new MA("State Tab Messages",{factory:()=>AyA});function eyA(i,e){if(i&1&&(d(0,"div",1),y(1),E()),i&2){let A=p();u(),iA(A.i18n.stateIsEmpty)}}function tyA(i,e){if(i&1&&(d(0,"div"),lA(1,"app-custom-json-viewer",2),E()),i&2){let A=p();u(),H("json",A.sessionState)}}var H5=class i{sessionState;i18n=w(HZ);get isEmptyState(){return!this.sessionState||Object.keys(this.sessionState).length===0}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-state-tab"]],inputs:{sessionState:"sessionState"},decls:3,vars:1,consts:[[1,"state-wrapper"],[1,"empty-state"],[3,"json"]],template:function(A,t){A&1&&(d(0,"div",0),Y(1,eyA,2,1,"div",1)(2,tyA,2,1,"div"),E()),A&2&&(u(),O(t.isEmptyState?1:2))},dependencies:[sl],styles:[".state-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;margin-top:16px}.state-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{text-align:center;font-style:italic}"]})};var iyA=(i,e)=>e.span_id;function nyA(i,e){if(i&1){let A=rA();d(0,"span",20)(1,"a",24),T("click",function(){let n;G(A);let o=p(3);return K(o.selectSpanById((n=o.selectedSpan())==null?null:n.parent_span_id))}),y(2),E(),d(3,"button",21),T("click",function(){let n;G(A);let o=p(3);return K(o.copyToClipboard((n=o.selectedSpan())==null?null:n.parent_span_id))}),d(4,"mat-icon"),y(5),E()()()}if(i&2){let A,t,n,o=p(3);u(),H("matTooltip",((A=o.selectedSpan())==null?null:A.parent_span_id)||""),u(),iA((t=o.selectedSpan())==null?null:t.parent_span_id),u(3),iA(o.copiedId===((n=o.selectedSpan())==null?null:n.parent_span_id)?"check":"content_copy")}}function oyA(i,e){i&1&&y(0," None ")}function ayA(i,e){if(i&1){let A=rA();d(0,"tr")(1,"td"),y(2),E(),d(3,"td")(4,"span",20)(5,"a",24),T("click",function(){let n=G(A).$implicit,o=p(4);return K(o.selectSpanById(n.span_id))}),y(6),E(),d(7,"button",21),T("click",function(){let n=G(A).$implicit,o=p(4);return K(o.copyToClipboard(n.span_id))}),d(8,"mat-icon"),y(9),E()()()()()}if(i&2){let A=e.$implicit,t=p(4);u(2),iA(A.name),u(3),H("matTooltip",A.span_id),u(),iA(A.span_id),u(3),iA(t.copiedId===A.span_id?"check":"content_copy")}}function ryA(i,e){if(i&1&&(d(0,"table",22),xe(1,ayA,10,4,"tr",null,iyA),E()),i&2){let A=p(3);u(),Re(A.selectedSpanChildren)}}function syA(i,e){if(i&1){let A=rA();d(0,"table",23)(1,"tr")(2,"td"),y(3,"Event ID"),E(),d(4,"td")(5,"span",20)(6,"a",24),T("click",function(){G(A);let n=p(3);return K(n.switchToEvent.emit(n.selectedSpan().attributes["gcp.vertex.agent.event_id"]))}),y(7),E(),d(8,"button",21),T("click",function(){G(A);let n=p(3);return K(n.copyToClipboard(n.selectedSpan().attributes["gcp.vertex.agent.event_id"]))}),d(9,"mat-icon"),y(10),E()()()()()()}if(i&2){let A=p(3);u(6),H("matTooltip",A.selectedSpan().attributes["gcp.vertex.agent.event_id"]||""),u(),iA(A.selectedSpan().attributes["gcp.vertex.agent.event_id"]),u(3),iA(A.copiedId===A.selectedSpan().attributes["gcp.vertex.agent.event_id"]?"check":"content_copy")}}function lyA(i,e){if(i&1){let A=rA();d(0,"div",13)(1,"table",15)(2,"tr")(3,"td"),y(4,"Name"),E(),d(5,"td")(6,"span",16)(7,"span",17),y(8),E(),d(9,"button",18),T("click",function(){let n;G(A);let o=p(2);return K(o.copyToClipboard((n=o.selectedSpan())==null?null:n.name))}),d(10,"mat-icon"),y(11),E()()()()(),d(12,"tr")(13,"td"),y(14,"Span ID"),E(),d(15,"td",19)(16,"span",20)(17,"span",17),y(18),E(),d(19,"button",21),T("click",function(){let n;G(A);let o=p(2);return K(o.copyToClipboard((n=o.selectedSpan())==null?null:n.span_id))}),d(20,"mat-icon"),y(21),E()()()()(),d(22,"tr")(23,"td"),y(24,"Parent ID"),E(),d(25,"td"),Y(26,nyA,6,3,"span",20)(27,oyA,1,0),E()(),d(28,"tr")(29,"td"),y(30,"Trace ID"),E(),d(31,"td",19)(32,"span",20)(33,"span",17),y(34),E(),d(35,"button",21),T("click",function(){let n;G(A);let o=p(2);return K(o.copyToClipboard((n=o.selectedSpan())==null?null:n.trace_id))}),d(36,"mat-icon"),y(37),E()()()()(),d(38,"tr")(39,"td"),y(40,"Start Time"),E(),d(41,"td")(42,"span",16)(43,"span",17),y(44),E(),d(45,"button",18),T("click",function(){let n;G(A);let o=p(2);return K(o.copyToClipboard(o.formatTime((n=o.selectedSpan())==null?null:n.start_time),"startTime"))}),d(46,"mat-icon"),y(47),E()()()()(),d(48,"tr")(49,"td"),y(50,"End Time"),E(),d(51,"td")(52,"span",16)(53,"span",17),y(54),E(),d(55,"button",18),T("click",function(){let n;G(A);let o=p(2);return K(o.copyToClipboard(o.formatTime((n=o.selectedSpan())==null?null:n.end_time),"endTime"))}),d(56,"mat-icon"),y(57),E()()()()()(),Y(58,ryA,3,0,"table",22),Y(59,syA,11,3,"table",23),E()}if(i&2){let A,t,n,o,a,r,s,l,g,C,I,B,Q,h,f,m=p(2);u(7),H("matTooltip",((A=m.selectedSpan())==null?null:A.name)||""),u(),iA((t=m.selectedSpan())==null?null:t.name),u(3),iA(m.copiedId===((n=m.selectedSpan())==null?null:n.name)?"check":"content_copy"),u(6),H("matTooltip",((o=m.selectedSpan())==null?null:o.span_id)||""),u(),iA((a=m.selectedSpan())==null?null:a.span_id),u(3),iA(m.copiedId===((r=m.selectedSpan())==null?null:r.span_id)?"check":"content_copy"),u(5),O((s=m.selectedSpan())!=null&&s.parent_span_id?26:27),u(7),H("matTooltip",((l=m.selectedSpan())==null?null:l.trace_id)||""),u(),iA((g=m.selectedSpan())==null?null:g.trace_id),u(3),iA(m.copiedId===((C=m.selectedSpan())==null?null:C.trace_id)?"check":"content_copy"),u(6),H("matTooltip",m.formatTime((I=m.selectedSpan())==null?null:I.start_time)),u(),iA(m.formatTime((B=m.selectedSpan())==null?null:B.start_time)),u(3),iA(m.copiedId==="startTime"?"check":"content_copy"),u(6),H("matTooltip",m.formatTime((Q=m.selectedSpan())==null?null:Q.end_time)),u(),iA(m.formatTime((h=m.selectedSpan())==null?null:h.end_time)),u(3),iA(m.copiedId==="endTime"?"check":"content_copy"),u(),O(m.selectedSpanChildren.length>0?58:-1),u(),O((f=m.selectedSpan())!=null&&f.attributes&&m.selectedSpan().attributes["gcp.vertex.agent.event_id"]?59:-1)}}function gyA(i,e){if(i&1){let A=rA();d(0,"tr")(1,"td"),y(2),E(),d(3,"td")(4,"span",16)(5,"span"),y(6),E(),d(7,"button",18),T("click",function(){let n,o=G(A).$implicit,a=p(4);return K(a.copyToClipboard((n=a.selectedSpan().attributes[o])==null?null:n.toString()))}),d(8,"mat-icon"),y(9),E()()()()()}if(i&2){let A,t=e.$implicit,n=p(4);u(2),iA(t),u(4),iA(n.selectedSpan().attributes[t]),u(3),iA(n.copiedId===((A=n.selectedSpan().attributes[t])==null?null:A.toString())?"check":"content_copy")}}function cyA(i,e){if(i&1&&(d(0,"table",15),xe(1,gyA,10,3,"tr",null,ni),E()),i&2){let A=p(3);u(),Re(A.Object.keys(A.selectedSpan().attributes))}}function CyA(i,e){i&1&&(d(0,"div",1),y(1,"No attributes available"),E())}function IyA(i,e){if(i&1&&(d(0,"div",13),Y(1,cyA,3,0,"table",15)(2,CyA,2,0,"div",1),E()),i&2){let A,t=p(2);u(),O((A=t.selectedSpan())!=null&&A.attributes&&t.Object.keys(t.selectedSpan().attributes).length>0?1:2)}}function dyA(i,e){if(i&1){let A=rA();d(0,"div",14),lA(1,"app-custom-json-viewer",25),d(2,"button",26),T("click",function(){G(A);let n=p(2);return K(n.copyJsonToClipboard(n.selectedSpan(),"raw"))}),d(3,"mat-icon"),y(4),E()()()}if(i&2){let A=p(2);u(),H("json",A.selectedSpan()),u(3),iA(A.copiedId==="raw"?"check":"content_copy")}}function ByA(i,e){if(i&1){let A=rA();d(0,"div",0)(1,"div",2)(2,"mat-paginator",3),T("page",function(n){G(A);let o=p();return K(o.onPage(n))}),E(),d(3,"div",4),y(4),E(),lA(5,"div",5),d(6,"button",6),T("click",function(){G(A);let n=p();return K(n.traceService.selectedRow(void 0))}),d(7,"mat-icon"),y(8,"remove_selection"),E()()(),d(9,"div",7)(10,"div",8)(11,"button",9),T("click",function(){G(A);let n=p();return K(n.selectedDetailTab.set("info"))}),d(12,"mat-icon"),y(13,"info"),E()(),d(14,"button",10),T("click",function(){G(A);let n=p();return K(n.selectedDetailTab.set("attributes"))}),d(15,"mat-icon"),y(16,"list_alt"),E()(),d(17,"button",11),T("click",function(){G(A);let n=p();return K(n.selectedDetailTab.set("raw"))}),d(18,"mat-icon"),y(19,"data_object"),E()()(),d(20,"div",12),Y(21,lyA,60,18,"div",13),Y(22,IyA,3,1,"div",13),Y(23,dyA,5,2,"div",14),E()()()}if(i&2){let A,t=p();u(2),H("length",t.orderedTraceData.length)("pageSize",1)("pageIndex",t.selectedSpanIndex),u(2),Be(" ",(A=t.selectedSpan())==null?null:A.name," "),u(7),xA("active",t.selectedDetailTab()==="info"),u(3),xA("active",t.selectedDetailTab()==="attributes"),u(3),xA("active",t.selectedDetailTab()==="raw"),u(4),O(t.selectedDetailTab()==="info"?21:-1),u(),O(t.selectedDetailTab()==="attributes"?22:-1),u(),O(t.selectedDetailTab()==="raw"?23:-1)}}function EyA(i,e){i&1&&(d(0,"div",1),y(1,"Select a trace span to view its details"),E())}var bx=class i extends Y1{nextPageLabel="Next Span";previousPageLabel="Previous Span";firstPageLabel="First Span";lastPageLabel="Last Span";getRangeLabel=(e,A,t)=>t===0?"Span 0 of 0":(t=Math.max(t,0),`Span ${e*A+1} of ${t}`);static \u0275fac=(()=>{let e;return function(t){return(e||(e=Mi(i)))(t||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac})},z5=class i{_traceData=[];orderedTraceData=[];set traceData(e){this._traceData=e||[],this.orderedTraceData=this.computeOrdered(this._traceData)}get traceData(){return this._traceData}computeOrdered(e){let A=e.map(a=>oA({},a)),t=new Map,n=[];A.forEach(a=>t.set(a.span_id,a)),A.forEach(a=>{if(a.parent_span_id&&t.has(a.parent_span_id)){let r=t.get(a.parent_span_id);r.children=r.children||[],r.children.push(a)}else n.push(a)});let o=a=>a.flatMap(r=>[r,...r.children?o(r.children):[]]);return o(n)}traceService=w(Pl);selectedSpan=Za(this.traceService.selectedTraceRow$);static getValidTraceTab(e){return e==="info"||e==="attributes"||e==="raw"?e:"info"}selectedDetailTab=mA(i.getValidTraceTab(localStorage.getItem("adk-trace-tab-selected-tab")));switchToEvent=fi();constructor(){_n(()=>{localStorage.setItem("adk-trace-tab-selected-tab",this.selectedDetailTab())})}formatTime(e){return e?new Date(e/1e6).toLocaleString():"N/A"}get selectedSpanChildren(){let e=this.selectedSpan();return e?e.children&&e.children.length>0?e.children:this.traceData.filter(A=>A.parent_span_id===e.span_id):[]}selectSpanById(e){if(!e)return;let A=this.traceData.find(t=>String(t.span_id)===String(e));A&&this.traceService.selectedRow(A)}get selectedSpanIndex(){let e=this.selectedSpan();if(!e)return;let A=this.orderedTraceData.findIndex(t=>t.span_id===e.span_id);return A===-1?void 0:A}onPage(e){e.pageIndex>=0&&e.pageIndex=this.orderedTraceData.length?0:this.selectedSpanIndex+1:t=this.selectedSpanIndex-1<0?this.orderedTraceData.length-1:this.selectedSpanIndex-1,this.traceService.selectedRow(this.orderedTraceData[t])}Object=Object;copiedId=null;copyToClipboard(e,A){e&&navigator.clipboard.writeText(e).then(()=>{this.copiedId=A||e,setTimeout(()=>this.copiedId=null,2e3)})}copyJsonToClipboard(e,A){if(!e)return;let t=JSON.stringify(e,null,2);navigator.clipboard.writeText(t).then(()=>{this.copiedId=A,setTimeout(()=>this.copiedId=null,2e3)})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-trace-tab"]],hostBindings:function(A,t){A&1&&T("keydown",function(o){return t.handleKeyboardNavigation(o)},mc)},inputs:{traceData:"traceData"},outputs:{switchToEvent:"switchToEvent"},features:[Et([{provide:Y1,useClass:bx}])],decls:2,vars:1,consts:[[1,"event-details-container"],[1,"empty-state"],[1,"event-details-header"],["hidePageSize","","aria-label","Select span",1,"event-paginator",3,"page","length","pageSize","pageIndex"],[1,"span-title"],[2,"flex-grow","1"],["mat-icon-button","","matTooltip","Clear selection",3,"click"],[1,"event-details-content"],[1,"vertical-tabs-sidebar"],["mat-icon-button","","matTooltip","Info","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Attributes","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Raw JSON","matTooltipPosition","right",3,"click"],[1,"vertical-tabs-content"],[1,"info-tables-container"],[1,"json-viewer-container","json-viewer-wrapper"],["app-info-table",""],[1,"value-cell"],[3,"matTooltip"],["mat-icon-button","","matTooltip","Copy",1,"copy-value-button",3,"click"],[1,"id-text"],[1,"id-cell"],["mat-icon-button","","matTooltip","Copy",1,"copy-id-button",3,"click"],["app-info-table","","title","Children"],["app-info-table","","title","Events"],["href","javascript:void(0)",1,"span-link","id-text",3,"click","matTooltip"],[3,"json"],["mat-icon-button","","matTooltip","Copy JSON",1,"floating-copy-button",3,"click"]],template:function(A,t){A&1&&Y(0,ByA,24,13,"div",0)(1,EyA,2,0,"div",1),A&2&&O(t.selectedSpan()!==void 0?0:1)},dependencies:[Wi,vi,On,zt,Ra,Zi,sl,Ff,e1],styles:["[_nghost-%COMP%]{display:block;height:100%}.json-viewer-container[_ngcontent-%COMP%]{margin:10px}.event-paginator[_ngcontent-%COMP%]{display:flex;justify-content:center;background-color:transparent}.event-paginator[_ngcontent-%COMP%] .mat-mdc-paginator-range-label{order:2;margin:0 0 0 8px}.span-title[_ngcontent-%COMP%]{font-weight:500;font-family:Google Sans Mono,monospace;font-size:13px;color:var(--mat-sys-on-surface);text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:300px;margin-left:16px}.event-details-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.event-details-content[_ngcontent-%COMP%]{display:flex;flex:1;overflow:hidden}.vertical-tabs-sidebar[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:48px;border-right:1px solid var(--mat-sys-outline-variant);padding-top:8px;align-items:center;gap:8px}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.vertical-tabs-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto}.event-details-header[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant);height:48px;flex-shrink:0}.empty-state[_ngcontent-%COMP%]{padding:16px;text-align:center;color:var(--mat-sys-on-surface-variant);font-style:italic;font-size:14px}.info-tables-container[_ngcontent-%COMP%]{padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:24px}.span-link[_ngcontent-%COMP%]{color:var(--mat-sys-primary);text-decoration:none;cursor:pointer}.span-link[_ngcontent-%COMP%]:hover{text-decoration:underline}.id-text[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:11px}.id-cell[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;overflow:hidden}.id-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child, .value-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.id-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .id-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%]{opacity:1}.copy-id-button[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%]{width:28px!important;height:28px!important;padding:0!important;line-height:28px!important;flex-shrink:0;margin:-4px 0!important;opacity:0;transition:opacity .2s ease-in-out;border-radius:4px!important;overflow:hidden!important}.copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.copy-id-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.json-viewer-wrapper[_ngcontent-%COMP%]{position:relative}.json-viewer-wrapper[_ngcontent-%COMP%]:hover .floating-copy-button[_ngcontent-%COMP%]{opacity:1}.floating-copy-button[_ngcontent-%COMP%]{position:absolute;top:4px;right:4px;z-index:10;opacity:0;transition:opacity .2s ease-in-out;background-color:var(--mat-sys-surface-container-high)!important;border-radius:4px!important;overflow:hidden!important;width:28px!important;height:28px!important;line-height:28px!important;padding:0!important}.floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.floating-copy-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.floating-copy-button[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}"]})};var hyA={agentDevelopmentKitLabel:"Agent Development Kit",disclosureTooltip:"ADK Web is for development purposes. It has access to all the data and should not be used in production.",collapsePanelTooltip:"Collapse panel",eventsTabLabel:"Events",stateTabLabel:"State",artifactsTabLabel:"Artifacts",sessionsTabLabel:"Sessions",evalTabLabel:"Evals",testsTabLabel:"Tests",selectEventAriaLabel:"Select event",infoTabLabel:"Info",graphTabLabel:"Graph",requestDetailsTabLabel:"Request",responseDetailsTabLabel:"Response",responseIsNotAvailable:"Response is not available",requestIsNotAvailable:"Request is not available",clearSelectionButtonLabel:"Remove selection"},sh=new MA("Side Panel Messages",{factory:()=>hyA});var QyA=["eventMenuTrigger"],uyA=["graphContainer"],pyA=(i,e)=>e.span_id,fyA=(i,e)=>e.modality,zZ=(i,e)=>e.key,myA=(i,e)=>e.id;function wyA(i,e){if(i&1){let A=rA();d(0,"button",10),T("click",function(){G(A);let n=p();return K(n.selectedDetailTab="graph")}),d(1,"mat-icon"),y(2,"account_tree"),E()()}if(i&2){let A=p();xA("active",A.selectedDetailTab==="graph"),H("matTooltip",bC(A.i18n.graphTabLabel))}}function DyA(i,e){if(i&1){let A=rA();d(0,"div",31),lA(1,"app-custom-json-viewer",32),d(2,"button",33),T("click",function(){G(A);let n=p(3);return K(n.copyJsonToClipboard(n.selectedEvent().nodeInfo.outputFor,"nodeInfo.outputFor"))}),d(3,"mat-icon"),y(4),E()()()}if(i&2){let A=p(3);u(),H("json",A.selectedEvent().nodeInfo.outputFor)("showMarkdown",!0),u(3),iA(A.copiedId==="nodeInfo.outputFor"?"check":"content_copy")}}function yyA(i,e){i&1&&y(0," N/A ")}function vyA(i,e){if(i&1){let A=rA();d(0,"tr")(1,"td"),y(2,"Message As Output"),E(),d(3,"td")(4,"span",24)(5,"span",22),y(6),E(),d(7,"button",25),T("click",function(){G(A);let n=p(3);return K(n.copyToClipboard(n.selectedEvent().nodeInfo.messageAsOutput))}),d(8,"mat-icon"),y(9),E()()()()()}if(i&2){let A,t=p(3);u(5),H("matTooltip",((A=t.selectedEvent().nodeInfo.messageAsOutput)==null?null:A.toString())||""),u(),iA(t.selectedEvent().nodeInfo.messageAsOutput),u(3),iA(t.copiedId===t.selectedEvent().nodeInfo.messageAsOutput?"check":"content_copy")}}function byA(i,e){if(i&1){let A=rA();d(0,"table",26)(1,"tr")(2,"td"),y(3,"Node Path"),E(),d(4,"td")(5,"span",24)(6,"span",22),y(7),E(),d(8,"button",25),T("click",function(){G(A);let n=p(2);return K(n.copyToClipboard(n.selectedEvent().nodeInfo.path))}),d(9,"mat-icon"),y(10),E()()()()(),d(11,"tr")(12,"td"),y(13,"Output For"),E(),d(14,"td"),Y(15,DyA,5,3,"div",31)(16,yyA,1,0),E()(),Y(17,vyA,10,3,"tr"),E()}if(i&2){let A=p(2);u(6),H("matTooltip",A.selectedEvent().nodeInfo.path||""),u(),iA(A.selectedEvent().nodeInfo.path||"N/A"),u(3),iA(A.copiedId===A.selectedEvent().nodeInfo.path?"check":"content_copy"),u(5),O(A.selectedEvent().nodeInfo.outputFor?15:16),u(2),O(A.selectedEvent().nodeInfo.messageAsOutput!==void 0?17:-1)}}function MyA(i,e){if(i&1){let A=rA();d(0,"div",31),lA(1,"app-custom-json-viewer",32),d(2,"button",33),T("click",function(){G(A);let n=p().$implicit,o=p(3);return K(o.copyJsonToClipboard(o.selectedEvent().actions[n],"action."+n))}),d(3,"mat-icon"),y(4),E()()()}if(i&2){let A=p().$implicit,t=p(3);u(),H("json",t.selectedEvent().actions[A])("showMarkdown",!0),u(3),iA(t.copiedId==="action."+A?"check":"content_copy")}}function SyA(i,e){if(i&1){let A=rA();d(0,"span",24)(1,"span",22),y(2),E(),d(3,"button",25),T("click",function(){let n;G(A);let o=p().$implicit,a=p(3);return K(a.copyToClipboard((n=a.selectedEvent().actions[o])==null?null:n.toString()))}),d(4,"mat-icon"),y(5),E()()()}if(i&2){let A,t,n=p().$implicit,o=p(3);u(),H("matTooltip",((A=o.selectedEvent().actions[n])==null?null:A.toString())||""),u(),iA(o.selectedEvent().actions[n]),u(3),iA(o.copiedId===((t=o.selectedEvent().actions[n])==null?null:t.toString())?"check":"content_copy")}}function kyA(i,e){if(i&1&&(d(0,"tr")(1,"td"),y(2),E(),d(3,"td"),Y(4,MyA,5,3,"div",31)(5,SyA,6,3,"span",24),E()()),i&2){let A=e.$implicit,t=p(3);u(2),iA(A),u(2),O(t.isObject(t.selectedEvent().actions[A])?4:5)}}function _yA(i,e){if(i&1&&(d(0,"table",27),xe(1,kyA,6,2,"tr",null,ni),E()),i&2){let A=p(2);u(),Re(A.Object.keys(A.selectedEvent().actions))}}function xyA(i,e){if(i&1){let A=rA();d(0,"tr")(1,"td"),y(2),E(),d(3,"td")(4,"div",31),lA(5,"app-custom-json-viewer",32),d(6,"button",33),T("click",function(){let n=G(A),o=n.$implicit,a=n.$index,r=p(3);return K(r.copyJsonToClipboard(o,"fc."+a))}),d(7,"mat-icon"),y(8),E()()()()()}if(i&2){let A=e.$implicit,t=e.$index,n=p(3);u(2),iA(A==null?null:A.name),u(3),H("json",A)("showMarkdown",!0),u(3),iA(n.copiedId==="fc."+t?"check":"content_copy")}}function RyA(i,e){if(i&1&&(d(0,"table",28),xe(1,xyA,9,4,"tr",null,Nr),E()),i&2){let A=p(2);u(),Re(A.functionCalls())}}function NyA(i,e){if(i&1&&(d(0,"div",35),lA(1,"img",36),E()),i&2){let A=p().$implicit;u(),H("src","data:"+A.inlineData.mimeType+";base64,"+A.inlineData.data,so)}}function FyA(i,e){if(i&1&&(d(0,"div"),lA(1,"audio",37),E()),i&2){let A=p().$implicit;u(),H("src","data:"+A.inlineData.mimeType+";base64,"+A.inlineData.data)}}function LyA(i,e){if(i&1&&(d(0,"div"),lA(1,"video",37),E()),i&2){let A=p().$implicit;u(),H("src","data:"+A.inlineData.mimeType+";base64,"+A.inlineData.data,so)}}function GyA(i,e){if(i&1&&(d(0,"div"),y(1),E()),i&2){let A=p().$implicit;u(),Be(" Unsupported media type: ",A.inlineData==null?null:A.inlineData.mimeType," ")}}function KyA(i,e){if(i&1&&Y(0,NyA,2,1,"div",35)(1,FyA,2,1,"div")(2,LyA,2,1,"div")(3,GyA,2,1,"div"),i&2){let A=e.$implicit;O(!(A.inlineData==null||A.inlineData.mimeType==null)&&A.inlineData.mimeType.startsWith("image/")?0:!(A.inlineData==null||A.inlineData.mimeType==null)&&A.inlineData.mimeType.startsWith("audio/")?1:!(A.inlineData==null||A.inlineData.mimeType==null)&&A.inlineData.mimeType.startsWith("video/")?2:3)}}function UyA(i,e){if(i&1&&(d(0,"div",34),xe(1,KyA,4,1,null,null,Nr),E()),i&2){let A=p().$implicit;u(),Re(A.mediaParts)}}function TyA(i,e){if(i&1){let A=rA();d(0,"tr")(1,"td"),y(2),E(),d(3,"td"),Y(4,UyA,3,0,"div",34),d(5,"div",31),lA(6,"app-custom-json-viewer",32),d(7,"button",33),T("click",function(){let n=G(A),o=n.$implicit,a=n.$index,r=p(3);return K(r.copyJsonToClipboard(o.cleanedFr,"pfr."+a))}),d(8,"mat-icon"),y(9),E()()()()()}if(i&2){let A=e.$implicit,t=e.$index,n=p(3);u(2),iA(A.name),u(2),O(A.hasMedia?4:-1),u(2),H("json",A.cleanedFr)("showMarkdown",!0),u(3),iA(n.copiedId==="pfr."+t?"check":"content_copy")}}function JyA(i,e){if(i&1&&(d(0,"table",29),xe(1,TyA,10,5,"tr",null,Nr),E()),i&2){let A=p(2);u(),Re(A.processedFunctionResponses())}}function YyA(i,e){if(i&1){let A=rA();d(0,"tr")(1,"td"),y(2),E(),d(3,"td")(4,"span",21)(5,"a",38),T("click",function(){let n=G(A).$implicit,o=p(3);return K(o.switchToSpan(n))}),y(6),E(),d(7,"button",23),T("click",function(){let n=G(A).$implicit,o=p(3);return K(o.copyToClipboard(n.span_id))}),d(8,"mat-icon"),y(9),E()()()()()}if(i&2){let A=e.$implicit,t=p(3);u(2),iA(A.name),u(3),H("matTooltip",A.span_id),u(),iA(A.span_id),u(3),iA(t.copiedId===A.span_id?"check":"content_copy")}}function OyA(i,e){if(i&1&&(d(0,"table",30),xe(1,YyA,10,4,"tr",null,pyA),E()),i&2){let A=p(2);u(),Re(A.associatedSpans())}}function HyA(i,e){if(i&1){let A=rA();d(0,"div",16)(1,"table",19)(2,"tr")(3,"td"),y(4,"Event ID"),E(),d(5,"td",20)(6,"span",21)(7,"span",22),y(8),E(),d(9,"button",23),T("click",function(){let n;G(A);let o=p();return K(o.copyToClipboard((n=o.selectedEvent())==null?null:n.id))}),d(10,"mat-icon"),y(11),E()()()()(),d(12,"tr")(13,"td"),y(14,"Invocation ID"),E(),d(15,"td",20)(16,"span",21)(17,"span",22),y(18),E(),d(19,"button",23),T("click",function(){let n;G(A);let o=p();return K(o.copyToClipboard((n=o.selectedEvent())==null?null:n.invocationId))}),d(20,"mat-icon"),y(21),E()()()()(),d(22,"tr")(23,"td"),y(24,"Branch"),E(),d(25,"td")(26,"span",24)(27,"span",22),y(28),E(),d(29,"button",25),T("click",function(){let n;G(A);let o=p();return K(o.copyToClipboard((n=o.selectedEvent())==null?null:n.branch))}),d(30,"mat-icon"),y(31),E()()()()(),d(32,"tr")(33,"td"),y(34,"Timestamp"),E(),d(35,"td")(36,"span",24)(37,"span",22),y(38),E(),d(39,"button",25),T("click",function(){let n;G(A);let o=p();return K(o.copyToClipboard(o.formatTime((n=o.selectedEvent())==null?null:n.timestamp),"timestamp"))}),d(40,"mat-icon"),y(41),E()()()()(),d(42,"tr")(43,"td"),y(44,"Author"),E(),d(45,"td")(46,"span",24)(47,"span",22),y(48),E(),d(49,"button",25),T("click",function(){let n;G(A);let o=p();return K(o.copyToClipboard((n=o.selectedEvent())==null?null:n.author))}),d(50,"mat-icon"),y(51),E()()()()()(),Y(52,byA,18,5,"table",26),Y(53,_yA,3,0,"table",27),Y(54,RyA,3,0,"table",28),Y(55,JyA,3,0,"table",29),Y(56,OyA,3,0,"table",30),E()}if(i&2){let A,t,n,o,a,r,s,l,g,C,I,B,Q,h,f,m,v=p();u(7),H("matTooltip",((A=v.selectedEvent())==null?null:A.id)||""),u(),iA((t=v.selectedEvent())==null?null:t.id),u(3),iA(v.copiedId===((n=v.selectedEvent())==null?null:n.id)?"check":"content_copy"),u(6),H("matTooltip",((o=v.selectedEvent())==null?null:o.invocationId)||""),u(),iA(((a=v.selectedEvent())==null?null:a.invocationId)||"N/A"),u(3),iA(v.copiedId===((r=v.selectedEvent())==null?null:r.invocationId)?"check":"content_copy"),u(6),H("matTooltip",((s=v.selectedEvent())==null?null:s.branch)||""),u(),iA(((l=v.selectedEvent())==null?null:l.branch)||"N/A"),u(3),iA(v.copiedId===((g=v.selectedEvent())==null?null:g.branch)?"check":"content_copy"),u(6),H("matTooltip",v.formatTime((C=v.selectedEvent())==null?null:C.timestamp)),u(),iA(v.formatTime((I=v.selectedEvent())==null?null:I.timestamp)),u(3),iA(v.copiedId==="timestamp"?"check":"content_copy"),u(6),H("matTooltip",((B=v.selectedEvent())==null?null:B.author)||""),u(),iA((Q=v.selectedEvent())==null?null:Q.author),u(3),iA(v.copiedId===((h=v.selectedEvent())==null?null:h.author)?"check":"content_copy"),u(),O((f=v.selectedEvent())!=null&&f.nodeInfo?52:-1),u(),O((m=v.selectedEvent())!=null&&m.actions&&v.Object.keys(v.selectedEvent().actions).length>0?53:-1),u(),O(v.functionCalls().length>0?54:-1),u(),O(v.processedFunctionResponses().length>0?55:-1),u(),O(v.associatedSpans().length>0?56:-1)}}function zyA(i,e){if(i&1&&(d(0,"div",22),y(1),E()),i&2){let A=e.$implicit;H("matTooltip",A.modality+": "+A.tokenCount),u(),ya("",A.modality,": ",A.tokenCount)}}function PyA(i,e){if(i&1&&xe(0,zyA,2,3,"div",22,fyA),i&2){let A=p().$implicit,t=p(3);Re(t.selectedEvent().usageMetadata[A])}}function jyA(i,e){if(i&1&&(d(0,"span",22),y(1),E()),i&2){let A,t=p().$implicit,n=p(3);H("matTooltip",((A=n.selectedEvent().usageMetadata[t])==null?null:A.toString())||""),u(),iA(n.selectedEvent().usageMetadata[t])}}function qyA(i,e){if(i&1){let A=rA();d(0,"tr")(1,"td"),y(2),E(),d(3,"td")(4,"span",24)(5,"span"),Y(6,PyA,2,0)(7,jyA,2,2,"span",22),E(),d(8,"button",25),T("click",function(){let n,o=G(A).$implicit,a=p(3);return K(a.isObject(a.selectedEvent().usageMetadata[o])?a.copyJsonToClipboard(a.selectedEvent().usageMetadata[o],"usage."+o):a.copyToClipboard((n=a.selectedEvent().usageMetadata[o])==null?null:n.toString(),"usage."+o))}),d(9,"mat-icon"),y(10),E()()()()()}if(i&2){let A=e.$implicit,t=p(3);u(2),iA(A),u(4),O(A==="promptTokensDetails"||A==="promptTokenDetails"||A==="candidatesTokenDetails"||A==="candidatesTokensDetails"||A==="cacheTokensDetails"?6:7),u(4),iA(t.copiedId==="usage."+A?"check":"content_copy")}}function VyA(i,e){if(i&1&&(d(0,"table",39),xe(1,qyA,11,3,"tr",null,ni),E()),i&2){let A=p(2);u(),Re(A.Object.keys(A.selectedEvent().usageMetadata))}}function WyA(i,e){i&1&&(d(0,"table",39)(1,"tr")(2,"td",41),y(3," Select an LLM response to see usage metadata. "),E()()())}function ZyA(i,e){if(i&1&&(d(0,"div",16),Y(1,VyA,3,0,"table",39)(2,WyA,4,0,"table",39),d(3,"table",40)(4,"tr")(5,"td"),y(6,"Total Prompt Tokens"),E(),d(7,"td"),y(8),E()(),d(9,"tr")(10,"td"),y(11,"Total Candidates Tokens"),E(),d(12,"td"),y(13),E()(),d(14,"tr")(15,"td"),y(16,"Total Tokens"),E(),d(17,"td"),y(18),E()()()()),i&2){let A,t=p();u(),O((A=t.selectedEvent())!=null&&A.usageMetadata&&t.Object.keys(t.selectedEvent().usageMetadata).length>0?1:2),u(7),iA(t.sessionUsageMetadata()["Prompt Tokens"]),u(5),iA(t.sessionUsageMetadata()["Candidates Tokens"]),u(5),iA(t.sessionUsageMetadata()["Total Tokens"])}}function XyA(i,e){if(i&1){let A=rA();d(0,"div",17),lA(1,"app-custom-json-viewer",32),d(2,"button",33),T("click",function(){G(A);let n=p();return K(n.copyJsonToClipboard(n.filteredSelectedEvent(),"raw"))}),d(3,"mat-icon"),y(4),E()()()}if(i&2){let A=p();u(),H("json",A.filteredSelectedEvent())("showMarkdown",!0),u(3),iA(A.copiedId==="raw"?"check":"content_copy")}}function $yA(i,e){if(i&1&&lA(0,"app-custom-json-viewer",32),i&2){let A=p().$implicit;H("json",A.oldValue)("showMarkdown",!0)}}function AvA(i,e){if(i&1&&(d(0,"span"),y(1),E()),i&2){let A=p().$implicit;u(),iA(A.oldValue)}}function evA(i,e){if(i&1&&lA(0,"app-custom-json-viewer",32),i&2){let A=p().$implicit;H("json",A.newValue)("showMarkdown",!0)}}function tvA(i,e){if(i&1&&(d(0,"span"),y(1),E()),i&2){let A=p().$implicit;u(),iA(A.newValue)}}function ivA(i,e){if(i&1&&(d(0,"div",43)(1,"div",44),y(2),E(),d(3,"div",45)(4,"div",46)(5,"div",47),y(6,"Old Value"),E(),d(7,"div",48),Y(8,$yA,1,2,"app-custom-json-viewer",32)(9,AvA,2,1,"span"),E()(),d(10,"div",46)(11,"div",47),y(12,"New Value"),E(),d(13,"div",48),Y(14,evA,1,2,"app-custom-json-viewer",32)(15,tvA,2,1,"span"),E()()()()),i&2){let A=e.$implicit,t=p(3);u(2),iA(A.key),u(6),O(t.isObject(A.oldValue)?8:9),u(6),O(t.isObject(A.newValue)?14:15)}}function nvA(i,e){if(i&1&&xe(0,ivA,16,3,"div",43,zZ),i&2){let A=p(2);Re(A.stateChanges())}}function ovA(i,e){i&1&&(d(0,"div",42),y(1," No state changes in this event. "),E())}function avA(i,e){if(i&1&&(d(0,"div",16),Y(1,nvA,2,0)(2,ovA,2,0,"div",42),E()),i&2){let A=p();u(),O(A.stateChanges().length>0?1:2)}}function rvA(i,e){i&1&&(d(0,"div",49)(1,"mat-icon",62),y(2,"warning"),E(),d(3,"span"),y(4,"The loaded session file was for a different app. The graph may not be accurate."),E()())}function svA(i,e){if(i&1){let A=rA();d(0,"button",68),T("click",function(){let n=G(A).$implicit,o=p(3);return K(o.onInvocationSelected(n.key))}),d(1,"mat-icon",69),y(2,"check"),E(),y(3),E()}if(i&2){let A,t=e.$implicit,n=p(3);H("matTooltip",t.key),u(),ht("visibility",((A=n.selectedEvent())==null?null:A.invocationId)===t.key?"visible":"hidden"),u(2),Be(" ",t.value," ")}}function lvA(i,e){if(i&1&&(d(0,"button",63)(1,"div",64)(2,"span",65),y(3),E(),d(4,"mat-icon",66),y(5,"arrow_drop_down"),E()()(),d(6,"mat-menu",null,3),xe(8,svA,4,4,"button",67,zZ),E()),i&2){let A,t=gi(7),n=p(2);H("matMenuTriggerFor",t),u(2),H("matTooltip",((A=n.selectedEvent())==null?null:A.invocationId)||""),u(),Be(" ",n.invocationDisplayMap().get(n.selectedEvent().invocationId)||n.selectedEvent().invocationId," "),u(5),Re(n.invocationDisplayEntries())}}function gvA(i,e){if(i&1&&(d(0,"span",53),y(1),E()),i&2){let A,t,n=p(2);H("matTooltip",((A=n.selectedEvent())==null?null:A.invocationId)||""),u(),iA((t=n.selectedEvent())!=null&&t.invocationId?n.invocationDisplayMap().get(n.selectedEvent().invocationId)||n.selectedEvent().invocationId:"N/A")}}function cvA(i,e){i&1&&(d(0,"mat-icon",71),y(1,"chevron_right"),E())}function CvA(i,e){i&1&&(d(0,"mat-icon",71),y(1,"chevron_right"),E())}function IvA(i,e){if(i&1&&(Y(0,CvA,2,0,"mat-icon",71),d(1,"button",70),y(2),E()),i&2){let A=e.$implicit,t=e.$index,n=p(3);O(t>0?0:-1),u(),xA("active",t===n.breadcrumbs().length-1),u(),Be(" ",A," ")}}function dvA(i,e){if(i&1&&(d(0,"div",54)(1,"button",70),y(2),E(),Y(3,cvA,2,0,"mat-icon",71),xe(4,IvA,3,4,null,null,Nr),E()),i&2){let A=p(2);u(2),iA(A.appName()),u(),O(A.breadcrumbs().length>0?3:-1),u(),Re(A.breadcrumbs())}}function BvA(i,e){if(i&1){let A=rA();d(0,"button",72),T("click",function(){G(A);let n=p(2);return K(n.showAgentStructureGraph.emit(!0))}),d(1,"mat-icon"),y(2,"fullscreen"),E()()}}function EvA(i,e){i&1&&(d(0,"div",57),y(1," Graph is not available for this agent. "),E())}function hvA(i,e){i&1&&(d(0,"div",58),lA(1,"mat-progress-spinner",73),E())}function QvA(i,e){if(i&1&&lA(0,"div",59),i&2){let A=p(2);H("innerHtml",A.renderedEventGraph(),fc)}}function uvA(i,e){if(i&1){let A=rA();d(0,"button",74),T("click",function(){let n=G(A).$implicit,o=p(2);return K(o.handleMenuSelection(n))}),d(1,"span"),y(2),Ht(3,"date"),E()()}if(i&2){let A=e.$implicit;u(2),ya("Run ",A.runIndex," (",f0(3,2,A.timestamp,"mediumTime"),")")}}function pvA(i,e){if(i&1&&(d(0,"div",18),Y(1,rvA,5,0,"div",49),d(2,"div",50)(3,"div",51)(4,"span",52),y(5,"Invocation:"),E(),Y(6,lvA,10,3)(7,gvA,2,2,"span",53),E()(),Y(8,dvA,6,2,"div",54),d(9,"div",55,0),Y(11,BvA,3,0,"button",56),Y(12,EvA,2,0,"div",57)(13,hvA,2,0,"div",58)(14,QvA,1,1,"div",59),E(),lA(15,"div",60,1),d(17,"mat-menu",null,2),xe(19,uvA,4,5,"button",61,myA),E()()),i&2){let A,t=gi(18),n=p();u(),O(n.isViewOnlyAppNameMismatch()?1:-1),u(5),O(n.invocationDisplayMap().size>0&&((A=n.selectedEvent())!=null&&A.invocationId)?6:7),u(2),O(n.hasSubWorkflows()&&(n.breadcrumbs().length>0||n.appName())?8:-1),u(3),O(n.graphsAvailable()?11:-1),u(),O(n.graphsAvailable()?n.renderedEventGraph()?14:13:12),u(3),ht("left",n.menuPos.x+"px")("top",n.menuPos.y+"px"),H("matMenuTriggerFor",t),u(4),Re(n.menuEvents)}}function fvA(i,e){i&1&&(d(0,"div",58),lA(1,"mat-progress-spinner",73),E())}function mvA(i,e){i&1&&(d(0,"div",57),y(1,"Select an LLM response to see request details."),E())}function wvA(i,e){if(i&1){let A=rA();d(0,"div",17),lA(1,"app-custom-json-viewer",32),d(2,"button",33),T("click",function(){G(A);let n=p(2);return K(n.copyJsonToClipboard(n.llmRequest(),"request"))}),d(3,"mat-icon"),y(4),E()()()}if(i&2){let A=p(2);u(),H("json",A.llmRequest())("showMarkdown",!0),u(3),iA(A.copiedId==="request"?"check":"content_copy")}}function DvA(i,e){if(i&1&&(Y(0,fvA,2,0,"div",58),Ht(1,"async"),l1(2,mvA,2,0,"div",57)(3,wvA,5,3,"div",17)),i&2){let A=p();O(ci(1,1,A.uiStateService.isEventRequestResponseLoading())===!0?0:A.llmRequest()?3:2)}}function yvA(i,e){i&1&&(d(0,"div",58),lA(1,"mat-progress-spinner",73),E())}function vvA(i,e){i&1&&(d(0,"div",57),y(1,"Select an LLM response to see response details."),E())}function bvA(i,e){if(i&1){let A=rA();d(0,"div",17),lA(1,"app-custom-json-viewer",32),d(2,"button",33),T("click",function(){G(A);let n=p(2);return K(n.copyJsonToClipboard(n.llmResponse(),"response"))}),d(3,"mat-icon"),y(4),E()()()}if(i&2){let A=p(2);u(),H("json",A.llmResponse())("showMarkdown",!0),u(3),iA(A.copiedId==="response"?"check":"content_copy")}}function MvA(i,e){if(i&1&&(Y(0,yvA,2,0,"div",58),Ht(1,"async"),l1(2,vvA,2,0,"div",57)(3,bvA,5,3,"div",17)),i&2){let A=p();O(ci(1,1,A.uiStateService.isEventRequestResponseLoading())===!0?0:A.llmResponse()?3:2)}}var P5=class i{eventDataSize=De.required();eventDataMap=De(new Map);selectedEventIndex=De();selectedEvent=De.required();filteredSelectedEvent=De();renderedEventGraph=De();rawSvgString=De(null);llmRequest=De();llmResponse=De();traceData=De([]);appName=De("");selectedEventGraphPath=De("");hasSubWorkflows=De(!1);graphsAvailable=De(!0);invocationDisplayMap=De(new Map);forceGraphTab=De(!1);isViewOnlySession=De(!1);isViewOnlyAppNameMismatch=De(!1);invocationDisplayEntries=me(()=>Array.from(this.invocationDisplayMap().entries()).map(([e,A])=>({key:e,value:A})));breadcrumbs=me(()=>{let e=this.selectedEventGraphPath();return e?e.split("/").filter(A=>A):[]});functionCalls=me(()=>(this.selectedEvent()?.content?.parts||[]).filter(A=>!!A.functionCall).map(A=>A.functionCall));functionResponses=me(()=>(this.selectedEvent()?.content?.parts||[]).filter(A=>!!A.functionResponse).map(A=>A.functionResponse));processedFunctionResponses=me(()=>this.functionResponses().map(A=>{if(!A)return null;if(A&&Array.isArray(A.parts)){let n=A.parts.filter(a=>!!a.inlineData).map(a=>a.inlineData&&a.inlineData.data?Oe(oA({},a),{inlineData:Oe(oA({},a.inlineData),{data:a.inlineData.data.replace(/-/g,"+").replace(/_/g,"/")})}):a),o=oA({},A);return delete o.parts,{name:A.name,cleanedFr:o,mediaParts:n,hasMedia:n.length>0}}return{name:A.name,cleanedFr:A,mediaParts:[],hasMedia:!1}}).filter(A=>A!==null));page=fi();closeSelectedEvent=fi();openImageDialog=fi();switchToTraceView=fi();showAgentStructureGraph=fi();drillDownNodePath=fi();selectEventById=fi();jumpToInvocation=fi();onInvocationSelected(e){this.jumpToInvocation.emit(e)}eventMenuTrigger;graphContainer;menuEvents=[];menuPos={x:0,y:0};uiStateService=w(ql);traceService=w(Pl);i18n=w(sh);isEventRequestResponseLoadingSignal=Za(this.uiStateService.isEventRequestResponseLoading(),{initialValue:!1});associatedSpans=me(()=>{let e=this.selectedEvent();if(!e||!e.id)return[];let A=this.traceData();if(!A)return[];let t=o=>{let a=[];for(let r of o)a.push(r),r.children&&(a=a.concat(t(r.children)));return a};return t(A).filter(o=>o.attributes&&o.attributes["gcp.vertex.agent.event_id"]===e.id)});sessionUsageMetadata=me(()=>{let e=Array.from(this.eventDataMap().values()),A=0,t=0,n=0;return e.forEach(o=>{let a=o.usageMetadata;if(a){let r=a.promptTokenCount??a.promptTokens??0,s=a.candidatesTokenCount??a.candidatesTokens??0,l=a.totalTokenCount??a.totalTokens??0;A+=Number(r),t+=Number(s),n+=Number(l)}}),{"Prompt Tokens":A,"Candidates Tokens":t,"Total Tokens":n}});_selectedDetailTab="event";get selectedDetailTab(){return this._selectedDetailTab}set selectedDetailTab(e){this._selectedDetailTab=e,localStorage.setItem("adk-event-tab-selected-tab",e),e==="graph"&&setTimeout(()=>{this.graphContainer?.nativeElement&&CB(this.graphContainer.nativeElement,(A,t)=>{this.handleNodeClick(A,t)})},50)}copiedId=null;copyToClipboard(e,A){e&&navigator.clipboard.writeText(e).then(()=>{this.copiedId=A||e,setTimeout(()=>this.copiedId=null,2e3)})}copyJsonToClipboard(e,A){if(!e)return;let t=JSON.stringify(e,null,2);navigator.clipboard.writeText(t).then(()=>{this.copiedId=A,setTimeout(()=>this.copiedId=null,2e3)})}switchToSpan(e){this.switchToTraceView.emit(),this.traceService.selectedRow(e)}stateChanges=me(()=>{let e=this.selectedEvent();if(!e)return[];let A=Array.from(this.eventDataMap().values());A.sort((o,a)=>(o.timestamp||0)-(a.timestamp||0));let t={},n=[];for(let o of A){let a=o.actions?.stateDelta;if(o.id===e.id){if(a)for(let r of Object.keys(a))r!=="__llm_request_key__"&&n.push({key:r,oldValue:t[r]!==void 0?t[r]:"N/A",newValue:a[r]});break}if(a)for(let r of Object.keys(a))r!=="__llm_request_key__"&&(t[r]=a[r])}return n});constructor(){let e=localStorage.getItem("adk-event-tab-selected-tab");e&&["event","raw","request","response","graph","metadata","state"].includes(e)&&(this._selectedDetailTab=e),_n(()=>{let t=this.renderedEventGraph(),n=this._selectedDetailTab;t&&n==="graph"&&setTimeout(()=>{this.graphContainer?.nativeElement&&CB(this.graphContainer.nativeElement,(o,a)=>{this.handleNodeClick(o,a)})},50)});let A=!1;_n(()=>{let t=this.forceGraphTab(),n=this.selectedEvent();t&&!A&&(this.selectedDetailTab=this.graphsAvailable()?"graph":"event"),A=t})}formatTime(e){if(!e)return"N/A";let A=e<1e10?e*1e3:e;return new Date(A).toLocaleString()}isObject(e){return e!==null&&typeof e=="object"}handleNodeClick(e,A){let t=Array.from(this.eventDataMap().values()),o=this.selectedEvent()?.invocationId;o&&(t=t.filter(l=>l.invocationId===o));let a=[],r=[],s="";t.forEach(l=>{let g=l.nodeInfo?.path;if(l.author==="user"&&(g="__START__"),!g)return;let C=g;g!=="__START__"&&(C=g.split("/").map(h=>h.split("@")[0]).join("/"));let I=C.split("/"),B=I[I.length-1],Q="";if(I.length>=2&&I[I.length-1]==="call_llm"&&I[I.length-2]===l.author?(B=I[I.length-2],Q=I.slice(1,-2).join("/")):Q=I.slice(1,-1).join("/"),Q===this.selectedEventGraphPath()){let h=g.split("/"),f=h[h.length-1],m=e.includes("@")?f:B;m!==s&&(s===e&&r.length>0&&a.push(r),s=m,r=[]),m===e&&r.push(l)}}),s===e&&r.length>0&&a.push(r),a.length!==0&&(a.length===1?this.selectEventById.emit(a[0][0].id):(this.menuEvents=a.map((l,g)=>({id:l[0].id,runIndex:g+1,timestamp:l[0].timestamp})),A&&(this.menuPos={x:A.clientX,y:A.clientY}),this.eventMenuTrigger.openMenu()))}handleMenuSelection(e){this.selectEventById.emit(e.id)}Object=Object;static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-event-tab"]],viewQuery:function(A,t){if(A&1&&Yt(QyA,5)(uyA,5),A&2){let n;oe(n=ae())&&(t.eventMenuTrigger=n.first),oe(n=ae())&&(t.graphContainer=n.first)}},inputs:{eventDataSize:[1,"eventDataSize"],eventDataMap:[1,"eventDataMap"],selectedEventIndex:[1,"selectedEventIndex"],selectedEvent:[1,"selectedEvent"],filteredSelectedEvent:[1,"filteredSelectedEvent"],renderedEventGraph:[1,"renderedEventGraph"],rawSvgString:[1,"rawSvgString"],llmRequest:[1,"llmRequest"],llmResponse:[1,"llmResponse"],traceData:[1,"traceData"],appName:[1,"appName"],selectedEventGraphPath:[1,"selectedEventGraphPath"],hasSubWorkflows:[1,"hasSubWorkflows"],graphsAvailable:[1,"graphsAvailable"],invocationDisplayMap:[1,"invocationDisplayMap"],forceGraphTab:[1,"forceGraphTab"],isViewOnlySession:[1,"isViewOnlySession"],isViewOnlyAppNameMismatch:[1,"isViewOnlyAppNameMismatch"]},outputs:{page:"page",closeSelectedEvent:"closeSelectedEvent",openImageDialog:"openImageDialog",switchToTraceView:"switchToTraceView",showAgentStructureGraph:"showAgentStructureGraph",drillDownNodePath:"drillDownNodePath",selectEventById:"selectEventById",jumpToInvocation:"jumpToInvocation"},decls:35,vars:32,consts:[["graphContainer",""],["eventMenuTrigger","matMenuTrigger"],["eventMenu","matMenu"],["invocationSelectorMenu","matMenu"],[1,"event-details-container"],[1,"event-details-header"],["hidePageSize","",1,"event-paginator",3,"page","length","pageSize","pageIndex"],["mat-icon-button","",3,"click","matTooltip"],[1,"event-details-content"],[1,"vertical-tabs-sidebar"],["mat-icon-button","","matTooltipPosition","right",3,"click","matTooltip"],["mat-icon-button","","matTooltipPosition","right",3,"active","matTooltip"],["mat-icon-button","","matTooltip","Usage Metadata","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","State Changes","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Raw JSON","matTooltipPosition","right",3,"click"],[1,"vertical-tabs-content"],[1,"info-tables-container"],[1,"json-viewer-container","json-viewer-wrapper"],[1,"event-graph-wrapper"],["app-info-table",""],[1,"id-text"],[1,"id-cell"],[3,"matTooltip"],["mat-icon-button","","matTooltip","Copy",1,"copy-id-button",3,"click"],[1,"value-cell"],["mat-icon-button","","matTooltip","Copy",1,"copy-value-button",3,"click"],["app-info-table","","title","Node Info"],["app-info-table","","title","Actions"],["app-info-table","","title","Function Calls"],["app-info-table","","title","Function Responses"],["app-info-table","","title","Associated Spans"],[1,"json-viewer-wrapper"],[3,"json","showMarkdown"],["mat-icon-button","","matTooltip","Copy JSON",1,"floating-copy-button",3,"click"],[1,"media-container"],[1,"generated-image-container"],["alt","image",3,"src"],["controls","",3,"src"],["href","javascript:void(0)",1,"span-link","id-text",3,"click","matTooltip"],["app-info-table","","title","Usage Summary for Event"],["app-info-table","","title","Usage Summary for Session"],["colspan","2",2,"text-align","center","padding","20px","color","var(--mat-sys-on-surface-variant)"],[1,"empty-state"],[1,"state-change-card"],[1,"state-change-header"],[1,"state-change-values"],[1,"state-value-block"],[1,"state-value-label"],[1,"state-value-content"],[1,"warning-banner",2,"background-color","#fff3cd","color","#856404","padding","8px","margin-bottom","8px","border-radius","4px","display","flex","align-items","center"],[1,"graph-header",2,"justify-content","space-between"],[2,"display","flex","align-items","center","min-width","0","flex","1","width","100%"],[2,"white-space","nowrap","flex-shrink","0"],[2,"margin-left","8px","font-weight","normal",3,"matTooltip"],[1,"breadcrumb-container"],[1,"event-graph-container"],["mat-icon-button","","matTooltip","Full Screen",1,"fullscreen-graph-button"],[1,"request-response-empty-state"],[1,"request-response-loading-spinner-container"],[1,"svg-graph-wrapper",3,"innerHtml"],[2,"visibility","hidden","position","fixed",3,"matMenuTriggerFor"],["mat-menu-item",""],[2,"margin-right","8px"],["mat-button","",1,"invocation-selector-button",2,"margin-left","8px","padding","0 8px","min-width","0","flex","1","height","24px","line-height","24px","width","100%",3,"matMenuTriggerFor"],[2,"display","flex","align-items","center","width","100%","min-width","0","justify-content","space-between"],[2,"font-weight","normal","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","flex","1","text-align","left",3,"matTooltip"],[2,"margin-left","4px","font-size","18px","width","18px","height","18px","flex-shrink","0"],["mat-menu-item","","matTooltipPosition","right",3,"matTooltip"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[2,"font-size","16px","width","16px","height","16px","margin-right","8px","color","var(--mat-sys-primary)"],["disabled","",1,"breadcrumb-item"],[1,"breadcrumb-separator"],["mat-icon-button","","matTooltip","Full Screen",1,"fullscreen-graph-button",3,"click"],["mode","indeterminate","diameter","50"],["mat-menu-item","",3,"click"]],template:function(A,t){A&1&&(d(0,"div",4)(1,"div",5)(2,"mat-paginator",6),T("page",function(o){return t.page.emit(o)}),E(),d(3,"button",7),T("click",function(){return t.closeSelectedEvent.emit()}),d(4,"mat-icon"),y(5,"remove_selection"),E()()(),d(6,"div",8)(7,"div",9)(8,"button",10),T("click",function(){return t.selectedDetailTab="event"}),d(9,"mat-icon"),y(10,"info"),E()(),Y(11,wyA,3,4,"button",11),d(12,"button",10),T("click",function(){return t.selectedDetailTab="request"}),d(13,"mat-icon"),y(14,"input"),E()(),d(15,"button",10),T("click",function(){return t.selectedDetailTab="response"}),d(16,"mat-icon"),y(17,"output"),E()(),d(18,"button",12),T("click",function(){return t.selectedDetailTab="metadata"}),d(19,"mat-icon"),y(20,"analytics"),E()(),d(21,"button",13),T("click",function(){return t.selectedDetailTab="state"}),d(22,"mat-icon"),y(23,"published_with_changes"),E()(),d(24,"button",14),T("click",function(){return t.selectedDetailTab="raw"}),d(25,"mat-icon"),y(26,"data_object"),E()()(),d(27,"div",15),Y(28,HyA,57,20,"div",16),Y(29,ZyA,19,4,"div",16),Y(30,XyA,5,3,"div",17),Y(31,avA,3,1,"div",16),Y(32,pvA,21,10,"div",18),Y(33,DvA,4,3),Y(34,MvA,4,3),E()()()),A&2&&(u(2),H("length",t.eventDataSize())("pageSize",1)("pageIndex",t.selectedEventIndex()),ee("aria-label",t.i18n.selectEventAriaLabel),u(),H("matTooltip",bC(t.i18n.clearSelectionButtonLabel)),u(5),xA("active",t.selectedDetailTab==="event"),H("matTooltip",bC(t.i18n.infoTabLabel)),u(3),O(t.graphsAvailable()?11:-1),u(),xA("active",t.selectedDetailTab==="request"),H("matTooltip",bC(t.i18n.requestDetailsTabLabel)),u(3),xA("active",t.selectedDetailTab==="response"),H("matTooltip",bC(t.i18n.responseDetailsTabLabel)),u(3),xA("active",t.selectedDetailTab==="metadata"),u(3),xA("active",t.selectedDetailTab==="state"),u(3),xA("active",t.selectedDetailTab==="raw"),u(4),O(t.selectedDetailTab==="event"?28:-1),u(),O(t.selectedDetailTab==="metadata"?29:-1),u(),O(t.selectedDetailTab==="raw"?30:-1),u(),O(t.selectedDetailTab==="state"?31:-1),u(),O(t.selectedDetailTab==="graph"?32:-1),u(),O(t.selectedDetailTab==="request"?33:-1),u(),O(t.selectedDetailTab==="response"?34:-1))},dependencies:[Wi,Si,vi,zt,Ff,os,Zi,HC,ns,Ds,Hl,sl,e1,$r,QR],styles:["[_nghost-%COMP%]{display:block;height:100%}.json-viewer-container[_ngcontent-%COMP%]{margin:10px}.event-paginator[_ngcontent-%COMP%]{margin-right:auto;display:flex;justify-content:center;background-color:transparent}.event-paginator[_ngcontent-%COMP%] .mat-mdc-paginator-range-label{order:2;margin:0 0 0 8px}.event-details-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.event-details-content[_ngcontent-%COMP%]{display:flex;flex:1;overflow:hidden}.vertical-tabs-sidebar[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:48px;border-right:1px solid var(--mat-sys-outline-variant);padding-top:8px;align-items:center;gap:8px}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.vertical-tabs-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto}.event-details-header[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant);height:48px;flex-shrink:0}.empty-state[_ngcontent-%COMP%]{padding:16px;text-align:center;color:var(--mat-sys-on-surface-variant);font-style:italic}.details-content[_ngcontent-%COMP%]{color:var(--side-panel-details-content-color);font-size:14px}.event-graph-wrapper[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;width:100%}.breadcrumb-container[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:13px;color:var(--mat-sys-on-surface-variant);padding:8px 12px}.breadcrumb-container[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-weight:500;margin-right:8px;color:var(--mat-sys-on-surface)}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]{background:none;border:none;color:var(--mat-sys-primary);font-size:13px;padding:2px 4px}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-item.active[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface)}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-on-surface);font-weight:500}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-separator[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;color:var(--mat-sys-on-surface-variant);margin:0 4px}.graph-header[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:13px;color:var(--mat-sys-on-surface-variant);background-color:var(--mat-sys-surface-container-lowest);padding:8px 16px;border-bottom:1px solid var(--mat-sys-outline-variant)}.graph-header[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-weight:500;margin-right:8px;color:var(--mat-sys-on-surface)}.event-graph-container[_ngcontent-%COMP%]{flex:1;overflow:hidden;padding:16px;position:relative}.fullscreen-graph-button[_ngcontent-%COMP%]{position:absolute;top:4px;right:4px;z-index:10;width:48px!important;height:48px!important;padding:0!important;display:flex!important;justify-content:center!important;align-items:center!important}.fullscreen-graph-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:28px!important;width:28px!important;height:28px!important;line-height:28px!important;margin:0!important;padding:0!important}.event-graph-container[_ngcontent-%COMP%] .svg-graph-wrapper[_ngcontent-%COMP%]{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.event-graph-container[_ngcontent-%COMP%] svg{max-width:100%;max-height:100%;width:auto;height:auto;display:block}.event-graph-container[_ngcontent-%COMP%] svg>g.graph>polygon:first-child{fill:transparent!important}.request-response-loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em}.request-response-empty-state[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em;font-style:italic}.id-text[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:12px}.id-cell[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;overflow:hidden}.id-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child, .value-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.id-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .id-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%]{opacity:1}.copy-id-button[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%]{width:28px!important;height:28px!important;padding:0!important;line-height:28px!important;flex-shrink:0;margin:-4px 0!important;opacity:0;transition:opacity .2s ease-in-out;border-radius:4px!important;overflow:hidden!important}.copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.copy-id-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.info-tables-container[_ngcontent-%COMP%]{padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:24px}.invocation-selector-button[_ngcontent-%COMP%] .mdc-button__label{width:100%;flex:1;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;justify-content:space-between}.media-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;margin-top:8px;margin-bottom:12px}.generated-image-container[_ngcontent-%COMP%]{max-width:100%;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a;border:1px solid var(--mat-sys-outline-variant)}.generated-image-container[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:100%;height:auto;display:block}audio[_ngcontent-%COMP%], video[_ngcontent-%COMP%]{max-width:100%;border-radius:4px}.json-viewer-wrapper[_ngcontent-%COMP%]{position:relative}.json-viewer-wrapper[_ngcontent-%COMP%]:hover .floating-copy-button[_ngcontent-%COMP%]{opacity:1}.floating-copy-button[_ngcontent-%COMP%]{position:absolute;top:4px;right:4px;z-index:10;opacity:0;transition:opacity .2s ease-in-out;background-color:var(--mat-sys-surface-container-high)!important;border-radius:4px!important;overflow:hidden!important;width:28px!important;height:28px!important;line-height:28px!important;padding:0!important}.floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.floating-copy-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.floating-copy-button[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.state-change-card[_ngcontent-%COMP%]{border-radius:8px;padding:10px;display:flex;flex-direction:column;gap:8px}.state-change-header[_ngcontent-%COMP%]{font-weight:600;font-size:14px;color:var(--mat-sys-primary);padding-bottom:4px}.state-change-values[_ngcontent-%COMP%]{display:flex;gap:12px;flex-wrap:wrap}.state-value-block[_ngcontent-%COMP%]{flex:1;min-width:200px;background-color:var(--mat-sys-surface-container-highest);border-radius:6px;padding:8px;display:flex;flex-direction:column;gap:4px}.state-value-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;color:var(--mat-sys-on-surface-variant)}.state-value-content[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:13px;color:var(--mat-sys-on-surface);word-break:break-all}"],changeDetection:0})};var SvA=["evalTabContainer"];function kvA(i,e){}function _vA(i,e){i&1&&(d(0,"div",1),lA(1,"mat-progress-spinner",4),E())}function xvA(i,e){if(i&1&&(d(0,"span",11),y(1),E()),i&2){let A=p(2);u(),iA(A.i18n.infoTabLabel)}}function RvA(i,e){if(i&1){let A=rA();d(0,"app-trace-tab",12),T("switchToEvent",function(n){G(A);let o=p(2);return K(o.switchToEvent.emit(n))}),E()}if(i&2){let A=p(2);H("traceData",A.traceData())}}function NvA(i,e){if(i&1){let A=rA();d(0,"app-event-tab",13),T("page",function(n){G(A);let o=p(2);return K(o.page.emit(n))})("closeSelectedEvent",function(){G(A);let n=p(2);return K(n.closeSelectedEvent.emit())})("openImageDialog",function(n){G(A);let o=p(2);return K(o.openImageDialog.emit(n))})("switchToTraceView",function(){G(A);let n=p(2);return K(n.switchToTraceView.emit())})("showAgentStructureGraph",function(n){G(A);let o=p(2);return K(o.showAgentStructureGraph.emit(n))})("drillDownNodePath",function(n){G(A);let o=p(2);return K(o.drillDownNodePath.emit(n))})("selectEventById",function(n){G(A);let o=p(2);return K(o.selectEventById.emit(n))})("jumpToInvocation",function(n){G(A);let o=p(2);return K(o.jumpToInvocation.emit(n))}),E()}if(i&2){let A=p(2);H("eventDataSize",A.eventData().size)("eventDataMap",A.eventData())("selectedEventIndex",A.selectedEventIndex())("selectedEvent",A.selectedEvent())("traceData",A.traceData())("filteredSelectedEvent",A.filteredSelectedEvent())("renderedEventGraph",A.renderedEventGraph())("rawSvgString",A.rawSvgString())("appName",A.appName())("selectedEventGraphPath",A.selectedEventGraphPath())("llmRequest",A.llmRequest())("llmResponse",A.llmResponse())("hasSubWorkflows",A.hasSubWorkflows())("graphsAvailable",A.graphsAvailable())("invocationDisplayMap",A.invocationDisplayMap())("forceGraphTab",A.forceGraphTab())("isViewOnlySession",A.isViewOnlySession())("isViewOnlyAppNameMismatch",A.isViewOnlyAppNameMismatch())}}function FvA(i,e){i&1&&(d(0,"div",9),y(1,"Select an event or trace span to view details"),E())}function LvA(i,e){if(i&1&&(d(0,"span",11),y(1),E()),i&2){let A=p(2);u(),iA(A.i18n.stateTabLabel)}}function GvA(i,e){if(i&1&&(d(0,"span",11),y(1),E()),i&2){let A=p(3);u(),iA(A.i18n.artifactsTabLabel)}}function KvA(i,e){if(i&1&&(d(0,"mat-tab"),yt(1,GvA,2,1,"ng-template",6),lA(2,"app-artifact-tab",14),E()),i&2){let A=p(2);u(2),H("artifacts",A.artifacts())}}function UvA(i,e){if(i&1&&(d(0,"span",11),y(1),E()),i&2){let A=p(3);u(),iA(A.i18n.testsTabLabel)}}function TvA(i,e){if(i&1){let A=rA();d(0,"mat-tab"),yt(1,UvA,2,1,"ng-template",6),d(2,"app-tests-tab",15),T("testSelected",function(n){G(A);let o=p(2);return K(o.testSelected.emit(n))}),E()()}if(i&2){let A=p(2);u(2),H("appName",A.appName())("sessionId",A.sessionId())("userId",A.userId())("isViewOnlySession",A.isViewOnlySession())}}function JvA(i,e){if(i&1&&(d(0,"span",11),y(1),E()),i&2){let A=p(3);u(),iA(A.i18n.evalTabLabel)}}function YvA(i,e){i&1&&(d(0,"mat-tab"),yt(1,JvA,2,1,"ng-template",6),gn(2,null,0),E())}function OvA(i,e){if(i&1){let A=rA();d(0,"div",2)(1,"mat-tab-group",5),yi("selectedIndexChange",function(n){G(A);let o=p();return hi(o.selectedIndex,n)||(o.selectedIndex=n),K(n)}),T("selectedTabChange",function(n){G(A);let o=p();return K(o.onTabChange(n))}),d(2,"mat-tab"),yt(3,xvA,2,1,"ng-template",6),Y(4,RvA,1,1,"app-trace-tab",7)(5,NvA,1,18,"app-event-tab",8)(6,FvA,2,0,"div",9),E(),d(7,"mat-tab"),yt(8,LvA,2,1,"ng-template",6),lA(9,"app-state-tab",10),E(),Y(10,KvA,3,1,"mat-tab"),Ht(11,"async"),Y(12,TvA,3,4,"mat-tab"),Ht(13,"async"),Y(14,YvA,4,0,"mat-tab"),Ht(15,"async"),E()()}if(i&2){let A=p(),t=xn(2);H("hidden",t||!A.showSidePanel()),u(),Di("selectedIndex",A.selectedIndex),u(3),O(A.selectedSpan()?4:A.selectedEvent()?5:6),u(5),H("sessionState",A.currentSessionState()),u(),O(ci(11,7,A.isArtifactsTabEnabledObs)?10:-1),u(2),O(ci(13,9,A.isTestsEnabledObs)?12:-1),u(2),O(ci(15,11,A.isEvalEnabledObs)?14:-1)}}var lh=class i{Object=Object;appName=De("");userId=De("");sessionId=De("");traceData=De([]);eventData=De(new Map);currentSessionState=De();artifacts=De([]);selectedEvent=De();selectedEventIndex=De();renderedEventGraph=De();rawSvgString=De(null);selectedEventGraphPath=De("");llmRequest=De();llmResponse=De();showSidePanel=De(!1);isApplicationSelectorEnabledObs=De(ie(!1));isBuilderMode=De(!1);disableBuilderIcon=De(!1);hasSubWorkflows=De(!1);graphsAvailable=De(!0);invocationDisplayMap=De(new Map);forceGraphTab=De(!1);isViewOnlySession=De(!1);isViewOnlyAppNameMismatch=De(!1);closePanel=fi();tabChange=fi();sessionSelected=fi();sessionReloaded=fi();evalCaseSelected=fi();editEvalCaseRequested=fi();testSelected=fi();evalSetIdSelected=fi();returnToSession=fi();evalNotInstalled=fi();page=fi();switchToEvent=fi();closeSelectedEvent=fi();openImageDialog=fi();openAddItemDialog=fi();enterBuilderMode=fi();showAgentStructureGraph=fi();switchToTraceView=fi();drillDownNodePath=fi();selectEventById=fi();jumpToInvocation=fi();sessionTabComponent=void 0;evalTabComponent=ko(Bc);evalTabContainer=ko("evalTabContainer",{read:So});tabGroup=ko(XE);logoComponent=w(AB,{optional:!0});i18n=w(sh);featureFlagService=w(mr);evalTabComponentClass=w(J5,{optional:!0});environmentInjector=w(xr);uiStateService=w(ql);traceService=w(Pl);selectedSpan=Za(this.traceService.selectedTraceRow$);selectedIndex=0;pendingEvalCaseSelection=mA(void 0);pendingEvalResultSelection=mA(void 0);evalTabRef=mA(null);constructor(){_n(()=>{let e=this.selectedEvent(),A=this.selectedSpan(),t=this.tabGroup();(e||A)&&t&&t.selectedIndex!==0&&(this.selectedIndex=0)}),_n(()=>{this.evalTabContainer()?this.initEvalTab():this.evalTabRef.set(null)}),_n(()=>{let e=this.evalTabRef();e&&(e.setInput("appName",this.appName()),e.setInput("userId",this.userId()),e.setInput("sessionId",this.sessionId()))}),_n(()=>{let e=this.evalTabRef(),A=this.pendingEvalCaseSelection();e&&A&&(e.instance.selectEvalSet(A.evalSetId),e.instance.selectedEvalTab.set("cases"),e.instance.selectedEvalCase.set(A.evalCase),this.pendingEvalCaseSelection.set(void 0))}),_n(()=>{let e=this.evalTabRef(),A=this.pendingEvalResultSelection();e&&A&&(e.instance.selectEvalSet(A.evalSetId),e.instance.selectedHistoryRun.set(A.timestamp),A.evalCase?(e.instance.selectedEvalTab.set("cases"),e.instance.selectedEvalCase.set(A.evalCase)):e.instance.selectedEvalTab.set("history"),this.pendingEvalResultSelection.set(void 0))})}ngOnInit(){}onTabChange(e){this.tabChange.emit(e),this.selectedIndex=e.index}switchToEvalTab(){this.isEvalEnabledObs.pipe(to()).subscribe(e=>{e&&DC([this.isArtifactsTabEnabledObs.pipe(to()),this.isTestsEnabledObs.pipe(to())]).subscribe(([A,t])=>{let n=2;A&&n++,t&&n++,this.selectedIndex=n})})}selectEvalCase(e,A){let t=this.evalTabComponent();t?(t.selectEvalSet(e),t.selectedEvalTab.set("cases"),t.selectedEvalCase.set(A)):this.pendingEvalCaseSelection.set({evalSetId:e,evalCase:A})}selectEvalResult(e,A,t){let n=this.evalTabComponent();n?(n.selectEvalSet(e),n.selectedHistoryRun.set(A),t?(n.selectedEvalTab.set("cases"),n.selectedEvalCase.set(t)):n.selectedEvalTab.set("history")):this.pendingEvalResultSelection.set({evalSetId:e,timestamp:A,evalCase:t})}isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();isTraceEnabledObs=this.featureFlagService.isTraceEnabled();isArtifactsTabEnabledObs=this.featureFlagService.isArtifactsTabEnabled();isEvalEnabledObs=this.featureFlagService.isEvalEnabled();isTestsEnabledObs=this.featureFlagService.isTestsEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled;filteredSelectedEvent=me(()=>this.selectedEvent());ngAfterViewInit(){}initEvalTab(){this.isEvalEnabledObs.pipe(to()).subscribe(e=>{if(e){let A=this.evalTabContainer();if(!A)return;A.clear();let t=A.createComponent(this.evalTabComponentClass??Bc,{environmentInjector:this.environmentInjector});if(!t)return;t.instance.sessionSelected.subscribe(n=>{this.sessionSelected.emit(n)}),t.instance.evalCaseSelected.subscribe(n=>{this.evalCaseSelected.emit(n)}),t.instance.editEvalCaseRequested.subscribe(n=>{this.editEvalCaseRequested.emit(n)}),t.instance.evalSetIdSelected.subscribe(n=>{this.evalSetIdSelected.emit(n)}),t.instance.shouldReturnToSession.subscribe(n=>{this.returnToSession.emit(n)}),t.instance.evalNotInstalledMsg.subscribe(n=>{this.evalNotInstalled.emit(n)}),this.evalTabRef.set(t)}})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-side-panel"]],viewQuery:function(A,t){A&1&&Xr(t.evalTabComponent,Bc,5)(t.evalTabContainer,SvA,5,So)(t.tabGroup,XE,5),A&2&&Er(3)},inputs:{appName:[1,"appName"],userId:[1,"userId"],sessionId:[1,"sessionId"],traceData:[1,"traceData"],eventData:[1,"eventData"],currentSessionState:[1,"currentSessionState"],artifacts:[1,"artifacts"],selectedEvent:[1,"selectedEvent"],selectedEventIndex:[1,"selectedEventIndex"],renderedEventGraph:[1,"renderedEventGraph"],rawSvgString:[1,"rawSvgString"],selectedEventGraphPath:[1,"selectedEventGraphPath"],llmRequest:[1,"llmRequest"],llmResponse:[1,"llmResponse"],showSidePanel:[1,"showSidePanel"],isApplicationSelectorEnabledObs:[1,"isApplicationSelectorEnabledObs"],isBuilderMode:[1,"isBuilderMode"],disableBuilderIcon:[1,"disableBuilderIcon"],hasSubWorkflows:[1,"hasSubWorkflows"],graphsAvailable:[1,"graphsAvailable"],invocationDisplayMap:[1,"invocationDisplayMap"],forceGraphTab:[1,"forceGraphTab"],isViewOnlySession:[1,"isViewOnlySession"],isViewOnlyAppNameMismatch:[1,"isViewOnlyAppNameMismatch"]},outputs:{closePanel:"closePanel",tabChange:"tabChange",sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded",evalCaseSelected:"evalCaseSelected",editEvalCaseRequested:"editEvalCaseRequested",testSelected:"testSelected",evalSetIdSelected:"evalSetIdSelected",returnToSession:"returnToSession",evalNotInstalled:"evalNotInstalled",page:"page",switchToEvent:"switchToEvent",closeSelectedEvent:"closeSelectedEvent",openImageDialog:"openImageDialog",openAddItemDialog:"openAddItemDialog",enterBuilderMode:"enterBuilderMode",showAgentStructureGraph:"showAgentStructureGraph",switchToTraceView:"switchToTraceView",drillDownNodePath:"drillDownNodePath",selectEventById:"selectEventById",jumpToInvocation:"jumpToInvocation"},decls:7,vars:8,consts:[["evalTabContainer",""],[1,"loading-spinner-container"],[1,"tabs-container",3,"hidden"],[1,"resize-handler"],["mode","indeterminate","diameter","50"],["animationDuration","0ms",3,"selectedIndexChange","selectedTabChange","selectedIndex"],["mat-tab-label",""],[3,"traceData"],[3,"eventDataSize","eventDataMap","selectedEventIndex","selectedEvent","traceData","filteredSelectedEvent","renderedEventGraph","rawSvgString","appName","selectedEventGraphPath","llmRequest","llmResponse","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab","isViewOnlySession","isViewOnlyAppNameMismatch"],[1,"empty-state"],[3,"sessionState"],[1,"tab-label"],[3,"switchToEvent","traceData"],[3,"page","closeSelectedEvent","openImageDialog","switchToTraceView","showAgentStructureGraph","drillDownNodePath","selectEventById","jumpToInvocation","eventDataSize","eventDataMap","selectedEventIndex","selectedEvent","traceData","filteredSelectedEvent","renderedEventGraph","rawSvgString","appName","selectedEventGraphPath","llmRequest","llmResponse","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab","isViewOnlySession","isViewOnlyAppNameMismatch"],[3,"artifacts"],[3,"testSelected","appName","sessionId","userId","isViewOnlySession"]],template:function(A,t){if(A&1&&(Y(0,kvA,0,0),Ht(1,"async"),Uo(2),Ht(3,"async"),Y(4,_vA,2,0,"div",1),Y(5,OvA,16,13,"div",2),lA(6,"div",3)),A&2){O(ci(1,3,t.isAlwaysOnSidePanelEnabledObs)===!1?0:-1),u(2);let n=Wo(ci(3,5,t.uiStateService.isSessionLoading()));u(2),O(n?4:-1),u(),O(t.appName()!=""?5:-1)}},dependencies:[XE,Wu,Vu,z5,H5,Mm,P5,os,O5,$r],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;position:relative}.drawer-header-wrapper[_ngcontent-%COMP%]{display:flex;height:48px;align-items:center;padding-left:20px}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center}.tabs-container[_ngcontent-%COMP%]{width:100%;flex:1;overflow:hidden;display:flex;flex-direction:column}.tab-label[_ngcontent-%COMP%]{font-size:14px}.resize-handler[_ngcontent-%COMP%]{width:6px;border-radius:4px;position:absolute;display:block;top:20px;bottom:20px;right:0;z-index:100;cursor:ew-resize}.resize-handler[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-outline-variant)}.empty-state[_ngcontent-%COMP%]{padding:16px;text-align:center;color:var(--mat-sys-on-surface-variant);font-style:italic}mat-tab-group[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;min-height:0}mat-tab-group[_ngcontent-%COMP%] .mdc-tab{padding:0 12px;min-width:48px} .mat-mdc-tab-body-wrapper{flex:1;min-height:0} .mat-mdc-tab-body-wrapper .mat-mdc-tab-body-content{overflow-x:hidden}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:6px}.drawer-logo[_ngcontent-%COMP%]{font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.1px}.drawer-header-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.panel-toggle-icon[_ngcontent-%COMP%]{font-size:20px;width:24px;height:24px;color:var(--side-panel-mat-icon-color, #c4c7c5);cursor:pointer;display:flex;align-items:center;justify-content:center}.powered-by-adk[_ngcontent-%COMP%]{font-size:10px;color:var(--side-panel-powered-by-adk-color);text-align:right;margin-top:-5px}.adk-info-icon[_ngcontent-%COMP%]{font-size:14px;color:var(--side-panel-mat-icon-color, #bdc1c6);cursor:pointer;margin-left:4px;vertical-align:middle}.mode-toggle-container[_ngcontent-%COMP%]{display:flex;align-items:center}.build-mode-button[_ngcontent-%COMP%]{margin:0 4px}.app-actions[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}"]})};var HvA=["editInput"];function zvA(i,e){if(i&1){let A=rA();d(0,"button",5),T("click",function(){G(A);let n=p();return K(n.startEdit())}),d(1,"mat-icon"),y(2,"edit"),E()()}}function PvA(i,e){if(i&1){let A=rA();d(0,"button",6),T("click",function(){G(A);let n=p();return K(n.saveEdit())}),d(1,"mat-icon"),y(2,"check"),E()(),d(3,"button",7),T("click",function(){G(A);let n=p();return K(n.cancelEdit())}),d(4,"mat-icon"),y(5,"close"),E()()}}var j5=class i{value="";displayValue="";tooltip="";placeholder="";textClass="";save=new LA;isEditing=!1;draftValue="";editInput;startEdit(){this.draftValue=this.value,this.isEditing=!0,setTimeout(()=>{this.editInput.nativeElement.focus()})}cancelEdit(){this.isEditing=!1,this.draftValue=""}saveEdit(){this.save.emit(this.draftValue),this.isEditing=!1}handleKeydown(e){e.key==="Enter"?this.saveEdit():e.key==="Escape"&&this.cancelEdit()}get effectiveDisplayValue(){return this.displayValue||this.value}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-inline-edit"]],viewQuery:function(A,t){if(A&1&&Yt(HvA,5),A&2){let n;oe(n=ae())&&(t.editInput=n.first)}},inputs:{value:"value",displayValue:"displayValue",tooltip:"tooltip",placeholder:"placeholder",textClass:"textClass"},outputs:{save:"save"},decls:6,vars:10,consts:[["editInput",""],[1,"inline-edit-container"],[1,"inline-edit-text-wrapper"],[1,"inline-edit-input",3,"ngModelChange","keydown","readonly","ngClass","matTooltip","ngModel"],["mat-icon-button","","aria-label","Edit",1,"inline-edit-action-button"],["mat-icon-button","","aria-label","Edit",1,"inline-edit-action-button",3,"click"],["mat-icon-button","","aria-label","Save",1,"inline-edit-action-button",3,"click"],["mat-icon-button","","aria-label","Cancel",1,"inline-edit-action-button",3,"click"]],template:function(A,t){A&1&&(d(0,"div",1)(1,"div",2)(2,"input",3,0),T("ngModelChange",function(o){return t.draftValue=o})("keydown",function(o){return t.handleKeydown(o)}),E()(),Y(4,zvA,3,0,"button",4)(5,PvA,6,0),E()),A&2&&(u(2),xA("readonly",!t.isEditing),H("readonly",!t.isEditing)("ngClass",t.textClass)("matTooltip",t.isEditing?"":t.tooltip)("ngModel",t.isEditing?t.draftValue:t.effectiveDisplayValue),ee("placeholder",t.isEditing?t.placeholder:"")("aria-label",t.placeholder)("size",((t.isEditing?t.draftValue:t.effectiveDisplayValue)==null?null:(t.isEditing?t.draftValue:t.effectiveDisplayValue).length)||1),u(2),O(t.isEditing?5:4))},dependencies:[si,Fl,cn,yn,vn,_o,Wi,vi,On,zt,Ra,Zi],styles:["[_nghost-%COMP%]{display:block;max-width:100%;min-width:0;width:100%}.inline-edit-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;max-width:100%;min-width:0;box-sizing:border-box}.inline-edit-text-wrapper[_ngcontent-%COMP%]{flex:0 1 auto;min-width:0;display:flex;align-items:center}.inline-edit-input[_ngcontent-%COMP%]{min-width:48px;max-width:100%;padding:2px 6px;margin:-3px -7px;border:1px solid var(--chat-toolbar-session-text-color, #ccc);border-radius:4px;color:var(--chat-toolbar-session-id-color, inherit);font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;background:transparent;field-sizing:content;transition:all .2s ease}.inline-edit-input[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--primary-color, #1a73e8)}.inline-edit-input.readonly[_ngcontent-%COMP%]{min-width:0;border-color:transparent;cursor:inherit}.inline-edit-input.readonly[_ngcontent-%COMP%]:focus{outline:none;border-color:transparent}.inline-edit-action-button[_ngcontent-%COMP%]{flex-shrink:0;width:28px!important;height:28px!important;padding:0!important;display:flex;align-items:center;justify-content:center}.inline-edit-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}"]})};var jvA={openPanelTooltip:"Open panel",evalCaseIdLabel:"Eval Case ID",cancelButton:"Cancel",saveButton:"Save",editEvalCaseTooltip:"Edit current eval case",deleteEvalCaseTooltip:"Delete current eval case",sessionIdLabel:"Session",copySessionIdTooltip:"Copy session ID",sessionIdCopiedMessage:"Session ID copied",copySessionIdFailedMessage:"Failed to copy session ID",userIdLabel:"User ID",editUserIdTooltip:"Edit user ID",userIdInputPlaceholder:"Enter user ID",saveUserIdTooltip:"Save user ID",cancelUserIdEditTooltip:"Cancel editing user ID",invalidUserIdMessage:"User ID cannot be empty",loadingSessionLabel:"Loading session...",tokenStreamingLabel:"Token Streaming",moreOptionsTooltip:"More options",createNewSessionTooltip:"Create a new Session",newSessionButton:"New Session",deleteSessionTooltip:"Delete session",exportSessionTooltip:"Export session",importSessionTooltip:"Import session",viewSessionTooltip:"View session",loadingAgentsLabel:"Loading agents, please wait...",welcomeMessage:"Welcome to ADK!",selectAgentMessage:"Select an agent to begin.",failedToLoadAgentsMessage:"Failed to load agents. To get started, run",errorMessageLabel:"Error message:",noAgentsFoundWarning:"Warning: No agents found in current folder.",cannotEditSessionMessage:"Chat is disabled to prevent changes to the end user's session.",viewSessionReadOnlyMessage:'This is a read-only view of a session file. Use "Import Session" if you want to continue this session.',readOnlyBadgeLabel:"Read-only"},PZ=new MA("Chat Messages",{factory:()=>jvA});var qvA=["sideDrawer"],VvA=["drawerSessionTab"],WvA=["appSearchInput"],ZvA=["invChipMenuTrigger"],XvA=["nodeChipMenuTrigger"],$vA=["addMenuTrigger"],AbA=[[["","adk-web-chat-container-top",""]]],ebA=["[adk-web-chat-container-top]"],qZ=()=>[],tbA=(i,e)=>e.metricName;function ibA(i,e){i&1&&gn(0)}function nbA(i,e){if(i&1&&yt(0,ibA,1,0,"ng-container",39),i&2){let A=p();H("ngComponentOutlet",A.logoComponent)}}function obA(i,e){if(i&1&&(d(0,"span",44),y(1),E()),i&2){let A=p(2);u(),Be(" ",A.adkVersion())}}function abA(i,e){if(i&1&&(d(0,"div",47)(1,"div",49)(2,"span",50),y(3,"Version:"),E(),d(4,"span",51),y(5),E()(),d(6,"div",49)(7,"span",50),y(8,"Language:"),E(),d(9,"span",51),y(10),E()(),d(11,"div",49)(12,"span",50),y(13,"Lang Version:"),E(),d(14,"span",51),y(15),E()()()),i&2){let A=p(2);u(5),iA(A.versionInfo().version),u(5),iA(A.versionInfo().language),u(5),iA(A.versionInfo().language_version)}}function rbA(i,e){if(i&1&&(lA(0,"img",40),d(1,"div",41)(2,"div",42)(3,"span",43),y(4,"Agent Development Kit"),E(),Y(5,obA,2,1,"span",44),E(),d(6,"div",45)(7,"div",46),y(8),E(),Y(9,abA,16,3,"div",47),E()(),d(10,"span",48),y(11,"ADK"),E()),i&2){let A=p();u(5),O(A.adkVersion()?5:-1),u(3),iA(A.sidePanelI18n.disclosureTooltip),u(),O(A.versionInfo()?9:-1)}}function sbA(i,e){i&1&&(d(0,"mat-icon",19),y(1,"warning"),E())}function lbA(i,e){if(i&1){let A=rA();d(0,"span",53)(1,"button",55),T("click",function(){G(A);let n=p(2);return K(n.openAgentStructureGraphDialog())}),d(2,"mat-icon"),y(3,"account_tree"),E()()()}if(i&2){let A=p(2);H("matTooltip",A.graphsAvailable()?"View Agent Structure Graph":"Agent structure graph is not available for this agent"),u(),H("disabled",!A.graphsAvailable())}}function gbA(i,e){if(i&1){let A=rA();lA(0,"div",52),Y(1,lbA,4,2,"span",53),d(2,"span",53)(3,"button",54),T("click",function(){G(A);let n=p();return K(n.enterBuilderMode())}),d(4,"mat-icon"),y(5,"edit"),E()()()}if(i&2){let A=p();u(),O(A.graphsAvailable()?1:-1),u(),H("matTooltip",A.disableBuilderSwitch?"Editing is not available for this agent because it was not built by the builder":"Edit in Builder Mode"),u(),H("disabled",A.disableBuilderSwitch)}}function cbA(i,e){if(i&1){let A=rA();d(0,"div",56)(1,"mat-icon",61),y(2,"visibility"),E(),d(3,"span",62),y(4),E(),d(5,"button",63),T("click",function(){G(A);let n=p(2);return K(n.closeReadonlySession())}),d(6,"mat-icon",64),y(7,"close"),E()()()}if(i&2){let A=p(2);u(4),ya("",A.readonlySessionType(),": ",A.readonlySessionName())}}function CbA(i,e){if(i&1){let A=rA();d(0,"button",68),T("click",function(){G(A);let n=p(6);return K(n.onNewSessionClick())}),d(1,"mat-icon",17),y(2,"add_comment"),E(),d(3,"span"),y(4),E()()}if(i&2){let A=p(6);H("matTooltip",A.i18n.createNewSessionTooltip),u(4),iA(A.i18n.newSessionButton)}}function IbA(i,e){if(i&1){let A=rA();d(0,"button",69),T("click",function(){G(A);let n=p(6);return K(n.onNewSessionClick())}),d(1,"mat-icon",17),y(2,"add_comment"),E()()}if(i&2){let A=p(6);H("matTooltip",A.i18n.createNewSessionTooltip)}}function dbA(i,e){if(i&1&&(lA(0,"div",52),Y(1,CbA,5,2,"button",66)(2,IbA,3,1,"button",67)),i&2){let A=p(5);u(),O(A.uiEvents().length>0?1:2)}}function BbA(i,e){if(i&1&&Y(0,dbA,3,1),i&2){let A=p(4);O(A.sessionId?0:-1)}}function EbA(i,e){if(i&1&&(Uo(0),Ht(1,"async"),Y(2,BbA,1,1)),i&2){let A=ci(1,1,p(3).uiStateService.isSessionLoading());u(2),O(A===!1?2:-1)}}function hbA(i,e){if(i&1){let A=rA();d(0,"div",15)(1,"button",65),T("click",function(){G(A);let n=p(2);return K(n.toggleSessionSelectorDrawer())}),d(2,"mat-icon",17),y(3,"chat"),E(),d(4,"span",18),y(5),E(),d(6,"mat-icon",20),y(7,"arrow_drop_down"),E()(),Y(8,EbA,3,3),E()}if(i&2){let A=p(2);u(5),iA(A.getToolbarSessionId()),u(3),O(A.evalCase?-1:8)}}function QbA(i,e){if(i&1&&(d(0,"div",56)(1,"span",62),y(2),E(),d(3,"span",70),y(4),E()()),i&2){let A=p(3);u(2),iA(A.i18n.evalCaseIdLabel),u(2),iA(A.evalCase.evalId)}}function ubA(i,e){if(i&1){let A=rA();d(0,"button",71),T("click",function(){G(A);let n=p(3);return K(n.cancelEditEvalCase())}),y(1),E(),d(2,"button",72),T("click",function(){G(A);let n=p(3);return K(n.saveEvalCase())}),y(3),E()}if(i&2){let A=p(3);u(),Be(" ",A.i18n.cancelButton," "),u(),H("disabled",!A.hasEvalCaseChanged()||A.isEvalCaseEditing()),u(),Be(" ",A.i18n.saveButton," ")}}function pbA(i,e){}function fbA(i,e){if(i&1&&(Y(0,QbA,5,2,"div",56),d(1,"div",59),Y(2,ubA,4,3)(3,pbA,0,0),E()),i&2){let A=p(2);O(A.isViewOnlySession()?-1:0),u(2),O(A.isEvalEditMode()?2:3)}}function mbA(i,e){}function wbA(i,e){if(i&1&&(d(0,"div",73),y(1),E()),i&2){let A=p(3);u(),iA(A.i18n.loadingSessionLabel)}}function DbA(i,e){if(i&1&&(d(0,"div",58),Uo(1),Ht(2,"async"),Y(3,mbA,0,0)(4,wbA,2,1,"div",73),E()),i&2){let A=ci(2,1,p(2).uiStateService.isSessionLoading());u(3),O(A===!1?3:4)}}function ybA(i,e){if(i&1){let A=rA();d(0,"button",74),T("click",function(){G(A);let n=p(2);return K(n.themeService.toggleTheme())}),d(1,"mat-icon"),y(2),E()()}if(i&2){let A=p(2);H("matTooltip",A.themeService.currentTheme()==="dark"?"Switch to Light Mode":"Switch to Dark Mode"),u(2),iA(A.themeService.currentTheme()==="dark"?"light_mode":"dark_mode")}}function vbA(i,e){if(i&1&&(d(0,"div",21),Y(1,cbA,8,2,"div",56)(2,hbA,9,2,"div",15),d(3,"div",57),Y(4,fbA,4,2)(5,DbA,5,3,"div",58),E(),d(6,"div",59),Uo(7),Ht(8,"async"),Y(9,ybA,3,2,"button",60),E()()),i&2){let A=p();u(),O(A.isViewOnlySession()?1:2),u(3),O(A.evalCase?4:5);let t=ci(8,3,A.uiStateService.isSessionLoading());u(5),O(t===!1?9:-1)}}function bbA(i,e){i&1&&(d(0,"div",84),lA(1,"mat-progress-spinner",85),E())}function MbA(i,e){i&1&&(d(0,"mat-icon",91),y(1,"check"),E())}function SbA(i,e){if(i&1){let A=rA();d(0,"button",88),T("click",function(){let n=G(A).$implicit,o=p(3);return K(o.selectAppFromDrawer(n))}),d(1,"mat-icon",89),y(2,"robot_2"),E(),d(3,"span",90),y(4),E(),Y(5,MbA,2,0,"mat-icon",91),E()}if(i&2){let A=e.$implicit,t=p(3);xA("selected",A===t.appName),u(4),iA(A),u(),O(A===t.appName?5:-1)}}function kbA(i,e){i&1&&(d(0,"div",87),y(1,"No apps found"),E())}function _bA(i,e){i&1&&xe(0,SbA,6,4,"button",86,ni,!1,kbA,2,0,"div",87),i&2&&Re(e)}function xbA(i,e){if(i&1){let A=rA();d(0,"div",75)(1,"span",76),y(2,"Select an App"),E(),d(3,"div")(4,"button",77),T("click",function(){G(A);let n=p();return K(n.openAddItemDialog())}),d(5,"mat-icon"),y(6,"add"),E()(),d(7,"button",78),T("click",function(){G(A);let n=p();return K(n.toggleAppSelectorDrawer())}),d(8,"mat-icon"),y(9,"close"),E()()()(),d(10,"div",79)(11,"mat-form-field",80)(12,"mat-icon",81),y(13,"search"),E(),d(14,"input",82,3),T("keydown",function(n){G(A);let o=p();return K(o.handleAppSearchKeydown(n))}),E()()(),d(16,"div",83),T("keydown",function(n){G(A);let o=p();return K(o.handleAppListKeydown(n))}),Y(17,bbA,2,0,"div",84),Ht(18,"async"),l1(19,_bA,3,1),E()}if(i&2){let A,t=p();u(14),H("formControl",t.appDrawerSearchControl),u(3),O(t.isLoadingApps()?17:(A=ci(18,2,t.filteredDrawerApps$))?19:-1,A)}}function RbA(i,e){if(i&1){let A=rA();d(0,"button",94),T("click",function(){G(A);let n=p(2);return K(n.importSession())}),d(1,"mat-icon"),y(2,"upload"),E(),d(3,"span"),y(4,"Import"),E()()}if(i&2){let A=p(2);H("matTooltip",A.i18n.importSessionTooltip)}}function NbA(i,e){if(i&1){let A=rA();d(0,"button",107),T("click",function(){G(A);let n=p(3);return K(n.exportSession())}),d(1,"mat-icon"),y(2,"download"),E(),d(3,"span"),y(4,"Export"),E()()}if(i&2){let A=p(3);H("matTooltip",A.i18n.exportSessionTooltip)}}function FbA(i,e){if(i&1){let A=rA();d(0,"button",108),T("click",function(){G(A);let n=p(3);return K(n.deleteSession(n.sessionId))}),d(1,"mat-icon"),y(2,"delete"),E(),d(3,"span"),y(4,"Delete"),E()()}if(i&2){let A=p(3);H("matTooltip",A.i18n.deleteSessionTooltip)}}function LbA(i,e){if(i&1){let A=rA();d(0,"div",96)(1,"span",99),y(2,"Current Session"),E(),d(3,"div",100)(4,"app-inline-edit",101),T("save",function(n){G(A);let o=p(2);return K(o.saveSessionName(n))}),E()(),d(5,"div",102)(6,"span",103),y(7),E(),d(8,"button",104),T("click",function(){G(A);let n=p(2);return K(n.copySessionId())}),d(9,"mat-icon"),y(10,"content_copy"),E()(),Y(11,NbA,5,1,"button",105),Ht(12,"async"),Y(13,FbA,5,1,"button",106),Ht(14,"async"),E()()}if(i&2){let A=p(2);u(4),H("value",A.sessionDisplayNameDraft)("displayValue",A.getCurrentSessionDisplayName())("tooltip",A.sessionId),u(2),H("title",A.sessionId),u(),iA(A.sessionId),u(4),O(ci(12,7,A.isExportSessionEnabledObs)?11:-1),u(2),O(ci(14,9,A.isDeleteSessionEnabledObs)?13:-1)}}function GbA(i,e){if(i&1){let A=rA();d(0,"div",75)(1,"span",76),y(2,"Select a Session"),E(),d(3,"div",92),Y(4,RbA,5,1,"button",93),Ht(5,"async"),d(6,"button",94),T("click",function(){G(A);let n=p();return K(n.viewSession())}),d(7,"mat-icon"),y(8,"visibility"),E(),d(9,"span"),y(10,"View"),E()(),d(11,"button",95),T("click",function(){G(A);let n=p();return K(n.toggleSessionSelectorDrawer())}),d(12,"mat-icon"),y(13,"close"),E()()()(),Y(14,LbA,15,11,"div",96),d(15,"div",97)(16,"app-session-tab",98,4),T("sessionSelected",function(n){G(A);let o=p();return K(o.onSessionSelectedFromDrawer(n))})("sessionReloaded",function(n){G(A);let o=p();return K(o.onSessionReloadedFromDrawer(n))}),E()()}if(i&2){let A=p();u(4),O(ci(5,6,A.importSessionEnabledObs)?4:-1),u(2),H("matTooltip",A.i18n.viewSessionTooltip),u(8),O(A.sessionId?14:-1),u(2),H("userId",A.userId)("appName",A.appName)("sessionId",A.sessionId)}}function KbA(i,e){if(i&1){let A=rA();d(0,"app-side-panel",109),T("jumpToInvocation",function(n){G(A);let o=p();return K(o.handleJumpToInvocation(n))})("closePanel",function(){G(A);let n=p();return K(n.toggleSidePanel())})("tabChange",function(n){G(A);let o=p();return K(o.handleTabChange(n))})("sessionSelected",function(n){G(A);let o=p();return K(o.updateWithSelectedSession(n))})("evalCaseSelected",function(n){G(A);let o=p();return K(o.updateWithSelectedEvalCase(n))})("editEvalCaseRequested",function(n){G(A);let o=p();return K(o.handleEditEvalCaseRequested(n))})("testSelected",function(n){G(A);let o=p();return K(o.updateWithSelectedTest(n.testName,n.events))})("evalSetIdSelected",function(n){G(A);let o=p();return K(o.updateSelectedEvalSetId(n))})("returnToSession",function(n){G(A);let o=p();return K(o.handleReturnToSession(n))})("evalNotInstalled",function(n){G(A);let o=p();return K(o.handleEvalNotInstalled(n))})("page",function(n){G(A);let o=p();return K(o.handlePageEvent(n))})("closeSelectedEvent",function(){G(A);let n=p();return K(n.closeSelectedEvent())})("openImageDialog",function(n){G(A);let o=p();return K(o.openViewImageDialog(n))})("openAddItemDialog",function(){G(A);let n=p();return K(n.openAddItemDialog())})("enterBuilderMode",function(){G(A);let n=p();return K(n.enterBuilderMode())})("showAgentStructureGraph",function(){G(A);let n=p();return K(n.openAgentStructureGraphDialog("event"))})("switchToEvent",function(n){G(A);let o=p();return K(o.selectEvent(n))})("switchToTraceView",function(){G(A);let n=p();return K(n.switchToTraceView())})("drillDownNodePath",function(n){G(A);let o=p();return K(o.onEventTabDrillDown(n))})("selectEventById",function(n){G(A);let o=p();return K(o.selectEvent(n))}),E()}if(i&2){let A=p();H("isApplicationSelectorEnabledObs",A.isApplicationSelectorEnabledObs)("showSidePanel",A.showSidePanel)("appName",A.appName)("userId",A.userId)("sessionId",A.sessionId)("isViewOnlySession",A.isViewOnlySession())("isViewOnlyAppNameMismatch",A.isViewOnlyAppNameMismatch())("traceData",A.traceData)("eventData",A.eventData)("currentSessionState",A.currentSessionState)("artifacts",A.artifacts)("selectedEvent",A.selectedEvent)("selectedEventIndex",A.selectedEventIndex)("renderedEventGraph",A.renderedEventGraph)("rawSvgString",A.rawSvgString)("selectedEventGraphPath",A.selectedEventGraphPath)("llmRequest",A.llmRequest)("llmResponse",A.llmResponse)("disableBuilderIcon",A.disableBuilderSwitch)("hasSubWorkflows",A.hasSubWorkflows)("graphsAvailable",A.graphsAvailable())("invocationDisplayMap",A.invocationDisplayMap())("forceGraphTab",A.autoSelectLatestEvent)}}function UbA(i,e){if(i&1){let A=rA();d(0,"app-builder-tabs",110),T("exitBuilderMode",function(){G(A);let n=p();return K(n.exitBuilderMode())})("closePanel",function(){G(A);let n=p();return K(n.toggleSidePanel())}),E(),lA(1,"div",111)}if(i&2){let A=p();H("appNameInput",A.appName)}}function TbA(i,e){if(i&1){let A=rA();d(0,"div",36)(1,"div",112)(2,"button",113),T("click",function(){G(A);let n=p();return K(n.saveAgentBuilder())}),d(3,"mat-icon"),y(4,"check"),E()(),d(5,"button",114),T("click",function(){G(A);let n=p();return K(n.exitBuilderMode())}),d(6,"mat-icon"),y(7,"close"),E()(),d(8,"button",115),T("click",function(){G(A);let n=p();return K(n.toggleBuilderAssistant())}),d(9,"mat-icon"),y(10,"assistant"),E()()(),d(11,"app-canvas",116),T("toggleSidePanelRequest",function(){G(A);let n=p();return K(n.toggleSidePanel())})("builderAssistantCloseRequest",function(){G(A);let n=p();return K(n.toggleBuilderAssistant())}),E()()}if(i&2){let A=p();u(8),xA("active",A.showBuilderAssistant),u(3),H("showSidePanel",A.showSidePanel)("showBuilderAssistant",A.showBuilderAssistant)("appNameInput",A.appName)}}function JbA(i,e){if(i&1&&(d(0,"div",118)(1,"span"),y(2),E()()),i&2){let A=p(3);u(2),iA(A.i18n.loadingAgentsLabel)}}function YbA(i,e){if(i&1&&(d(0,"span"),y(1),lA(2,"br"),y(3),E()),i&2){let A=p(4);u(),iA(A.i18n.welcomeMessage),u(2),Be(" ",A.i18n.selectAgentMessage)}}function ObA(i,e){if(i&1&&(y(0),lA(1,"br"),d(2,"pre",120),y(3),E()),i&2){let A=p(5);Be(" ",A.i18n.errorMessageLabel," "),u(3),iA(A.loadingError())}}function HbA(i,e){if(i&1&&(d(0,"pre",119),y(1),E()),i&2){let A=p(5);u(),iA(A.i18n.noAgentsFoundWarning)}}function zbA(i,e){if(i&1&&(d(0,"div"),y(1),d(2,"pre"),y(3,"adk web"),E(),y(4," in the folder that contains the agents."),lA(5,"br"),Y(6,ObA,4,2)(7,HbA,2,1,"pre",119),E()),i&2){let A=p(4);u(),Be(" ",A.i18n.failedToLoadAgentsMessage," "),u(5),O(A.loadingError()?6:7)}}function PbA(i,e){if(i&1&&(d(0,"div",118),Y(1,YbA,4,2,"span"),Ht(2,"async"),l1(3,zbA,8,2,"div"),E()),i&2){let A=p(3);u(),O((ci(2,1,A.apps$)||wc(3,qZ)).length>0?1:3)}}function jbA(i,e){if(i&1&&(Y(0,JbA,3,1,"div",118),Ht(1,"async"),l1(2,PbA,4,4,"div",118)),i&2){let A=p(2);O(A.isLoadingApps()?0:ci(1,1,A.isApplicationSelectorEnabledObs)?2:-1)}}function qbA(i,e){if(i&1){let A=rA();d(0,"div",145,8),T("click",function(n){return n.stopPropagation()}),d(2,"span",146),y(3),E(),d(4,"button",147),T("click",function(n){G(A);let o=p(4);return K(o.removeInvocationIdFilter(n))}),d(5,"mat-icon"),y(6,"close"),E()()()}if(i&2){p();let A=gi(17),t=p(3);H("matMenuTriggerFor",A)("matTooltip",t.invocationIdFilter()?"Invocation: "+(t.invocationDisplayMap().get(t.invocationIdFilter())||t.invocationIdFilter()):"Filter events by a specific invocation"),u(2),H("title",t.invocationIdFilter()?t.invocationDisplayMap().get(t.invocationIdFilter())||t.invocationIdFilter():"Invocation"),u(),iA(t.invocationIdFilter()?t.invocationDisplayMap().get(t.invocationIdFilter())||t.invocationIdFilter():"Invocation")}}function VbA(i,e){if(i&1){let A=rA();d(0,"div",145,9),T("click",function(n){return n.stopPropagation()}),d(2,"span",62),y(3,"Node"),E(),d(4,"button",147),T("click",function(n){G(A);let o=p(4);return K(o.removeNodePathFilter(n))}),d(5,"mat-icon"),y(6,"close"),E()()()}if(i&2){p();let A=gi(21),t=p(3);H("matMenuTriggerFor",A)("matTooltip",t.nodePathFilter()?"Node: "+t.nodePathFilter():"Filter events generated by a specific node")}}function WbA(i,e){if(i&1){let A=rA();d(0,"div",148),T("click",function(n){return n.stopPropagation()}),d(1,"span",62),y(2,"Final"),E(),d(3,"button",147),T("click",function(n){return G(A),p(4).toggleHideIntermediateEvents(),K(n.stopPropagation())}),d(4,"mat-icon"),y(5,"close"),E()()()}}function ZbA(i,e){if(i&1&&(d(0,"div",149,10),T("click",function(t){return t.stopPropagation()}),d(2,"mat-icon"),y(3,"add"),E(),d(4,"span"),y(5,"Filter"),E()()),i&2){p();let A=gi(12);H("matMenuTriggerFor",A)}}function XbA(i,e){if(i&1){let A=rA();d(0,"div",150),T("click",function(n){G(A);let o=p(4);return K(o.clearAllFilters(n))}),d(1,"mat-icon"),y(2,"clear_all"),E(),d(3,"span"),y(4,"Clear"),E()()}}function $bA(i,e){if(i&1){let A=rA();d(0,"button",151),T("click",function(){G(A);let n=p(4);return K(n.addInvocationIdFilter())}),y(1,"Invocation"),E()}}function A7A(i,e){if(i&1){let A=rA();d(0,"button",152),T("click",function(){G(A);let n=p(4);return K(n.addNodePathFilter())}),y(1,"Node"),E()}}function e7A(i,e){if(i&1){let A=rA();d(0,"button",153),T("click",function(){G(A);let n=p(4);return K(n.toggleHideIntermediateEvents())}),y(1,"Final"),E()}}function t7A(i,e){if(i&1){let A=rA();d(0,"button",154),T("click",function(){let n=G(A).$implicit,o=p(4);return K(o.setInvocationIdFilter(n))}),d(1,"mat-icon",155),y(2,"check"),E(),y(3),E()}if(i&2){let A=e.$implicit,t=p(4);H("matTooltip",A),u(),ht("visibility",t.invocationIdFilter()===A?"visible":"hidden"),u(2),Be(" ",t.invocationDisplayMap().get(A)||A," ")}}function i7A(i,e){if(i&1){let A=rA();d(0,"button",156),T("click",function(){let n=G(A).$implicit,o=p(4);return K(o.setNodePathFilter(n))}),d(1,"mat-icon",155),y(2,"check"),E(),y(3),E()}if(i&2){let A=e.$implicit,t=p(4);u(),ht("visibility",t.nodePathFilter()===A?"visible":"hidden"),u(2),Be(" ",A," ")}}function n7A(i,e){if(i&1){let A=rA();d(0,"mat-button-toggle-group",130),T("change",function(n){G(A);let o=p(3);return K(o.onViewModeChange(n.value))}),d(1,"mat-button-toggle",131),y(2,"Events"),E(),d(3,"mat-button-toggle",132),y(4,"Traces"),E()(),d(5,"div",133),T("click",function(n){G(A);let o=p(3);return K(o.openAddFilterMenu(n))}),Y(6,qbA,7,4,"div",134),Y(7,VbA,7,2,"div",134),Y(8,WbA,6,0,"div",135),Y(9,ZbA,6,1,"div",136),Y(10,XbA,5,0,"div",137),E(),d(11,"mat-menu",138,5),Y(13,$bA,2,0,"button",139),Y(14,A7A,2,0,"button",140),Y(15,e7A,2,0,"button",141),E(),d(16,"mat-menu",142,6),T("closed",function(){G(A);let n=p(3);return K(n.onInvocationMenuClosed())}),xe(18,t7A,4,4,"button",143,ni),E(),d(20,"mat-menu",142,7),T("closed",function(){G(A);let n=p(3);return K(n.onNodePathMenuClosed())}),xe(22,i7A,4,3,"button",144,ni),E()}if(i&2){let A=p(3);H("value",A.viewMode()),u(6),O(A.invocationIdFilterActive()?6:-1),u(),O(A.nodePathFilterActive()?7:-1),u(),O(A.hideIntermediateEvents()?8:-1),u(),O(!A.invocationIdFilterActive()||!A.nodePathFilterActive()||!A.hideIntermediateEvents()?9:-1),u(),O(A.invocationIdFilterActive()||A.nodePathFilterActive()||A.hideIntermediateEvents()?10:-1),u(3),O(A.invocationIdFilterActive()?-1:13),u(),O(A.nodePathFilterActive()?-1:14),u(),O(A.hideIntermediateEvents()?-1:15),u(3),Re(A.invocationIdOptions()),u(4),Re(A.nodePathOptions())}}function o7A(i,e){i&1&&(d(0,"span",122),y(1,"README.md"),E())}function a7A(i,e){if(i&1){let A=rA();d(0,"button",157),T("click",function(){G(A);let n=p(3);return K(n.isSideBySide.set(!n.isSideBySide()))}),d(1,"mat-icon",158),y(2),E(),d(3,"span",159),y(4,"Compare"),E()()}if(i&2){let A=p(3);ht("color",A.isSideBySide()?"var(--mat-sys-primary)":"var(--mat-sys-on-surface-variant)"),u(2),iA(A.isSideBySide()?"check_circle":"radio_button_unchecked")}}function r7A(i,e){if(i&1){let A=rA();d(0,"button",160),T("click",function(){G(A);let n=p(3);return K(n.showBranches.set(!n.showBranches()))}),d(1,"mat-icon",158),y(2),E(),d(3,"span",159),y(4,"Branches"),E()()}if(i&2){let A=p(3);ht("color",A.showBranches()?"var(--mat-sys-primary)":"var(--mat-sys-on-surface-variant)"),u(2),iA(A.showBranches()?"check_circle":"radio_button_unchecked")}}function s7A(i,e){if(i&1){let A=rA();d(0,"button",161),T("click",function(){G(A);let n=p(3);return K(n.toggleSse())}),d(1,"mat-icon",158),y(2),E(),d(3,"span",159),y(4,"Streaming"),E()()}if(i&2){let A=p(3);ht("color",A.useSse()?"var(--mat-sys-primary)":"var(--mat-sys-on-surface-variant)"),u(2),iA(A.useSse()?"check_circle":"radio_button_unchecked")}}function l7A(i,e){if(i&1){let A=rA();d(0,"app-chat-panel",162),Ht(1,"async"),yi("userInputChange",function(n){G(A);let o=p(3);return hi(o.userInput,n)||(o.userInput=n),K(n)}),T("toggleHideIntermediateEvents",function(){G(A);let n=p(3);return K(n.toggleHideIntermediateEvents())})("toggleSse",function(){G(A);let n=p(3);return K(n.toggleSse())})("clickEvent",function(n){G(A);let o=p(3);return K(o.clickEvent(n))})("handleKeydown",function(n){G(A);let o=p(3);return K(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){G(A);let o=p(3);return K(o.cancelEditMessage(n))})("saveEditMessage",function(n){G(A);let o=p(3);return K(o.saveEditMessage(n))})("openViewImageDialog",function(n){G(A);let o=p(3);return K(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){G(A);let o=p(3);return K(o.openBase64InNewTab(n.data,n.mimeType))})("fileSelect",function(n){G(A);let o=p(3);return K(o.onFileSelect(n))})("removeFile",function(n){G(A);let o=p(3);return K(o.removeFile(n))})("removeStateUpdate",function(){G(A);let n=p(3);return K(n.removeStateUpdate())})("sendMessage",function(n){G(A);let o=p(3);return K(o.handleChatInput(n))})("updateState",function(){G(A);let n=p(3);return K(n.updateState())})("toggleAudioRecording",function(n){G(A);let o=p(3);return K(o.toggleAudioRecording(n))})("toggleVideoRecording",function(){G(A);let n=p(3);return K(n.toggleVideoRecording())})("longRunningResponseComplete",function(n){G(A);let o=p(3);return K(o.sendMessage(n))}),E()}if(i&2){let A=p(3);H("appName",A.appName)("agentReadme",A.agentReadme),Di("userInput",A.userInput),H("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("showBranches",A.showBranches())("traceData",A.traceData)("isTokenStreamingEnabled",ci(1,23,A.isTokenStreamingEnabledObs)??!1)("useSse",A.useSse())("isChatMode",!0)("selectedFiles",A.selectedFiles)("updatedSessionState",A.updatedSessionState())("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("isAudioRecording",A.isAudioRecording)("micVolume",A.micVolume())("isVideoRecording",A.isVideoRecording)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function g7A(i,e){if(i&1){let A=rA();d(0,"app-chat-panel",163),Ht(1,"async"),yi("userInputChange",function(n){G(A);let o=p(3);return hi(o.userInput,n)||(o.userInput=n),K(n)})("userEditEvalCaseMessageChange",function(n){G(A);let o=p(3);return hi(o.userEditEvalCaseMessage,n)||(o.userEditEvalCaseMessage=n),K(n)}),T("clickEvent",function(n){G(A);let o=p(3);return K(o.clickEvent(n))})("handleKeydown",function(n){G(A);let o=p(3);return K(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){G(A);let o=p(3);return K(o.cancelEditMessage(n))})("saveEditMessage",function(n){G(A);let o=p(3);return K(o.saveEditMessage(n))})("openViewImageDialog",function(n){G(A);let o=p(3);return K(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){G(A);let o=p(3);return K(o.openBase64InNewTab(n.data,n.mimeType))})("editEvalCaseMessage",function(n){G(A);let o=p(3);return K(o.editEvalCaseMessage(n))})("deleteEvalCaseMessage",function(n){G(A);let o=p(3);return K(o.deleteEvalCaseMessage(n.message,n.index))})("editFunctionArgs",function(n){G(A);let o=p(3);return K(o.editFunctionArgs(n))}),E()}if(i&2){let A=p(3);H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("showBranches",A.showBranches())("isChatMode",!1)("evalCase",A.evalCase)("isEvalEditMode",A.isEvalEditMode())("isEvalCaseEditing",A.isEvalCaseEditing())("isEditFunctionArgsEnabled",ci(1,20,A.isEditFunctionArgsEnabledObs)??!1),Di("userInput",A.userInput)("userEditEvalCaseMessage",A.userEditEvalCaseMessage),H("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function c7A(i,e){if(i&1&&(d(0,"div",177),y(1),E()),i&2){p();let A=xn(40);u(),Be(" ",A)}}function C7A(i,e){if(i&1&&(d(0,"div",169)(1,"span",170),y(2),Ht(3,"formatMetricName"),E(),d(4,"div",171)(5,"span",172),y(6),Ht(7,"number"),E(),d(8,"span",173),y(9),Ht(10,"number"),E()(),d(11,"div",174)(12,"div",175),y(13),Ht(14,"formatMetricName"),E(),d(15,"div",176),y(16),E(),d(17,"div",47)(18,"div",49)(19,"span",50),y(20,"Actual:"),E(),d(21,"span",51),y(22),Ht(23,"number"),E()(),d(24,"div",49)(25,"span",50),y(26,"Threshold:"),E(),d(27,"span",51),y(28),Ht(29,"number"),E()(),d(30,"div",49)(31,"span",50),y(32,"Min:"),E(),d(33,"span",51),y(34),E()(),d(35,"div",49)(36,"span",50),y(37,"Max:"),E(),d(38,"span",51),y(39),E()()(),Uo(40),Y(41,c7A,2,1,"div",177),E()()),i&2){let A=e.$implicit,t=p(6);ht("border",A.evalStatus==1?"1px solid #2e7d32":"1px solid var(--mat-sys-error)"),u(2),iA(ci(3,16,A.metricName)),u(3),ht("color",A.evalStatus==1?"#2e7d32":"var(--mat-sys-error)"),u(),Be(" ",A.score!=null?f0(7,18,A.score,"1.2-2"):"?"," "),u(3),Be(" / ",f0(10,21,A.threshold,"1.2-2")," "),u(4),iA(ci(14,24,A.metricName)),u(3),iA(A.metricName),u(5),ht("color",A.evalStatus==1?"#2e7d32":"var(--mat-sys-error)"),u(),iA(A.score!=null?f0(23,26,A.score,"1.2-2"):"?"),u(6),iA(f0(29,29,A.threshold,"1.2-2")),u(6),iA(t.getMetricMin(A.metricName)),u(5),iA(t.getMetricMax(A.metricName)),u();let n=Wo(t.getMetricDescription(A.metricName));u(),O(n?41:-1)}}function I7A(i,e){if(i&1&&(d(0,"div",167),xe(1,C7A,42,33,"div",168,tbA),E()),i&2){p();let A=xn(0);u(),Re(A.overallEvalMetricResults)}}function d7A(i,e){if(i&1&&(Uo(0),d(1,"div",164),Y(2,I7A,3,0,"div",167),E()),i&2){let A=Wo(p(4).evalCaseResult());u(2),O(A.overallEvalMetricResults!=null&&A.overallEvalMetricResults.length?2:-1)}}function B7A(i,e){if(i&1){let A=rA();d(0,"div",165)(1,"div",178)(2,"div",179),y(3,"Expected"),E(),lA(4,"app-chat-panel",180),E(),d(5,"div",178)(6,"div",179),y(7,"Actual"),E(),d(8,"app-chat-panel",181),Ht(9,"async"),Ht(10,"async"),T("toggleHideIntermediateEvents",function(){G(A);let n=p(4);return K(n.toggleHideIntermediateEvents())})("toggleSse",function(){G(A);let n=p(4);return K(n.toggleSse())}),yi("userInputChange",function(n){G(A);let o=p(4);return hi(o.userInput,n)||(o.userInput=n),K(n)})("userEditEvalCaseMessageChange",function(n){G(A);let o=p(4);return hi(o.userEditEvalCaseMessage,n)||(o.userEditEvalCaseMessage=n),K(n)}),T("clickEvent",function(n){G(A);let o=p(4);return K(o.clickEvent(n))})("handleKeydown",function(n){G(A);let o=p(4);return K(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){G(A);let o=p(4);return K(o.cancelEditMessage(n))})("saveEditMessage",function(n){G(A);let o=p(4);return K(o.saveEditMessage(n))})("openViewImageDialog",function(n){G(A);let o=p(4);return K(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){G(A);let o=p(4);return K(o.openBase64InNewTab(n.data,n.mimeType))})("editEvalCaseMessage",function(n){G(A);let o=p(4);return K(o.editEvalCaseMessage(n))})("deleteEvalCaseMessage",function(n){G(A);let o=p(4);return K(o.deleteEvalCaseMessage(n.message,n.index))})("editFunctionArgs",function(n){G(A);let o=p(4);return K(o.editFunctionArgs(n))})("fileSelect",function(n){G(A);let o=p(4);return K(o.onFileSelect(n))})("removeFile",function(n){G(A);let o=p(4);return K(o.removeFile(n))})("removeStateUpdate",function(){G(A);let n=p(4);return K(n.removeStateUpdate())})("sendMessage",function(n){G(A);let o=p(4);return K(o.handleChatInput(n))})("updateState",function(){G(A);let n=p(4);return K(n.updateState())})("toggleAudioRecording",function(n){G(A);let o=p(4);return K(o.toggleAudioRecording(n))})("toggleVideoRecording",function(){G(A);let n=p(4);return K(n.toggleVideoRecording())})("longRunningResponseComplete",function(n){G(A);let o=p(4);return K(o.sendMessage(n))}),E()()()}if(i&2){let A=p(4);u(4),H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredExpectedUiEvents())("showBranches",A.showBranches())("isChatMode",!1)("evalCase",A.evalCase)("isEvalEditMode",!1)("isEvalCaseEditing",!1)("isEditFunctionArgsEnabled",!1)("userInput","")("selectedFiles",wc(56,qZ))("updatedSessionState",null)("agentGraphData",A.agentGraphData())("selectedMessageIndex",-1)("isAudioRecording",!1)("micVolume",0)("isVideoRecording",!1)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn),u(4),H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("showBranches",A.showBranches())("traceData",A.traceData)("isTokenStreamingEnabled",ci(9,52,A.isTokenStreamingEnabledObs)??!1)("useSse",A.useSse())("isChatMode",!1)("evalCase",A.evalCase)("isEvalEditMode",A.isEvalEditMode())("isEvalCaseEditing",A.isEvalCaseEditing())("isEditFunctionArgsEnabled",ci(10,54,A.isEditFunctionArgsEnabledObs)??!1),Di("userInput",A.userInput)("userEditEvalCaseMessage",A.userEditEvalCaseMessage),H("selectedFiles",A.selectedFiles)("updatedSessionState",A.updatedSessionState())("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("isAudioRecording",A.isAudioRecording)("micVolume",A.micVolume())("isVideoRecording",A.isVideoRecording)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function E7A(i,e){if(i&1&&lA(0,"app-chat-panel",166),i&2){let A=p(4);H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("showBranches",A.showBranches())("traceData",A.traceData)("isChatMode",!1)("evalCase",A.evalCase)("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function h7A(i,e){if(i&1&&(Y(0,d7A,3,2,"div",164),Y(1,B7A,11,57,"div",165)(2,E7A,1,16,"app-chat-panel",166)),i&2){let A=p(3);O(A.evalCaseResult()?0:-1),u(),O(A.isSideBySide()?1:2)}}function Q7A(i,e){i&1&&(d(0,"div",129)(1,"mat-icon",182),y(2,"insert_drive_file"),E(),d(3,"h3",183),y(4,"File View"),E(),d(5,"p",184),y(6,"File content lost on refresh. Please re-upload the file to view or use it."),E()())}function u7A(i,e){if(i&1&&(d(0,"div",121),Y(1,n7A,24,9)(2,o7A,2,0,"span",122),lA(3,"div",123),Y(4,a7A,5,3,"button",124),Y(5,r7A,5,3,"button",125),Y(6,s7A,5,3,"button",126),Ht(7,"async"),E(),Y(8,l7A,2,25,"app-chat-panel",127)(9,g7A,2,22,"app-chat-panel",128)(10,h7A,3,2)(11,Q7A,7,0,"div",129)),i&2){let A,t=p(2);u(),O(t.uiEvents().length===0&&t.agentReadme?2:1),u(3),O(t.chatType()==="eval-result"?4:-1),u(),O(t.viewMode()!=="traces"?5:-1),u(),O(ci(7,5,t.isTokenStreamingEnabledObs)&&t.canEditSession()?6:-1),u(2),O((A=t.chatType())==="session"?8:A==="eval-case"?9:A==="eval-result"?10:A==="file"?11:-1)}}function p7A(i,e){if(i&1&&(d(0,"div",37),Ve(1),d(2,"mat-card",117),Y(3,jbA,3,3),Y(4,u7A,12,7),E()()),i&2){let A=p();u(2),xA("no-side-panel",!A.showSidePanel),u(),O(A.selectedAppControl.value?-1:3),u(),O(A.appName!=""?4:-1)}}function f7A(i,e){if(i&1){let A=rA();d(0,"app-agent-structure-graph-dialog",185),T("close",function(){G(A);let n=p();return K(n.showAgentStructureOverlay=!1)}),E()}if(i&2){let A=p();H("appName",A.appName)("preloadedAppData",A.agentGraphData())("preloadedLightGraphSvg",A.agentStructureOverlayMode==="event"?A.eventGraphSvgLight:A.sessionGraphSvgLight)("preloadedDarkGraphSvg",A.agentStructureOverlayMode==="event"?A.eventGraphSvgDark:A.sessionGraphSvgDark)("startPath",A.agentStructureOverlayMode==="event"?A.selectedEventGraphPath:"")}}var m7A="root_agent",q5="q",w7A="hideSidePanel",Mx="",Sx="",jZ="application/json+a2ui";function kx(i){for(i=i.replace(/-/g,"+").replace(/_/g,"/");i.length%4!==0;)i+="=";return i}var _x=class i extends Y1{nextPageLabel="Next Event";previousPageLabel="Previous Event";firstPageLabel="First Event";lastPageLabel="Last Event";getRangeLabel=(e,A,t)=>t===0?`Event 0 of ${t}`:(t=Math.max(t,0),`Event ${e*A+1} of ${t}`);static \u0275fac=(()=>{let e;return function(t){return(e||(e=Mi(i)))(t||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac})},D7A="Restarting bidirectional streaming is not currently supported. Please refresh the page or start a new session.",V5=class i{i18n=w(PZ);sidePanelI18n=w(sh);_snackbarService=w(Uc);activatedRoute=w(Ts);agentService=w(Ys);artifactService=w(qd);changeDetectorRef=w(wt);dialog=w(Ja);document=w(ii);downloadService=w(Vd);evalService=w(Jc);eventService=w(Lf);featureFlagService=w(mr);graphService=w(Wd);localFileService=w(Gf);location=w(Jf);renderer=w(qi);router=w(is);safeValuesService=w(as);testsService=w(jC);sessionService=w(Os);streamChatService=w(Uf);webSocketService=w($d);audioRecordingService=w(Zd);audioPlayingService=w(Xd);stringToColorService=w(PC);traceService=w(Pl);uiStateService=w(ql);agentBuilderService=w(Tc);themeService=w(jl);logoComponent=w(AB,{optional:!0});chatPanel=ko(X2);canvasComponent=ko.required(VE);sideDrawer=ko.required("sideDrawer");sidePanel=ko.required(lh);drawerSessionTab=ko("drawerSessionTab");evalTab=ko(Bc);appSearchInput=ko("appSearchInput");canChat=me(()=>this.chatType()==="session");isEvalCaseEditing=mA(!1);hasEvalCaseChanged=mA(!1);isEvalEditMode=mA(!1);isBuilderMode=mA(!1);chatType=mA("session");currentEvalCaseId=null;currentEvalTimestamp=null;videoElement;currentMessage="";uiEvents=mA([]);invocationDisplayMap=me(()=>{let e=new Map,A=1,t="";for(let n of this.uiEvents()){if(n.role==="user")if(n.text)t=n.text;else if(n.event?.content?.parts?.length){let o=n.event.content.parts.find(a=>a.text);o&&o.text&&(t=o.text)}else t="User Message";if(n.event?.invocationId){let o=n.event.invocationId;if(!e.has(o)){let a=t||"User Message";a.length>50&&(a=a.substring(0,47)+"..."),e.set(o,`#${A} (${a})`),A++}}}return e});artifacts=[];userInput="";userEditEvalCaseMessage="";userId="user";appName="";sessionId="";sessionIdOfLoadedMessages="";evalCase=null;evalCaseResult=mA(null);metricsInfo=this.evalService.metricsInfo;updatedEvalCase=null;adkVersion=mA("");versionInfo=mA(null);evalSetId="";isAudioRecording=!1;micVolume=this.audioRecordingService.volumeLevel;isVideoRecording=!1;longRunningEvents=[];functionCallEventId="";redirectUri=fr.getBaseUrlWithoutPath();showSidePanel=window.localStorage.getItem("adk-side-panel-visible")!=="false";showBuilderAssistant=!0;showAppSelectorDrawer=!1;showSessionSelectorDrawer=!1;useSse=mA(window.localStorage.getItem("adk-use-sse")==="true");currentSessionState={};root_agent=m7A;updatedSessionState=mA(null);canEditSession=mA(!0);isViewOnlySession=mA(!1);isViewOnlyAppNameMismatch=mA(!1);isLoadedAppUnavailable=mA(!1);unavailableAppName=mA("");readonlySessionType=mA("");readonlySessionName=mA("");isSideBySide=mA(!1);showBranches=mA(!1);expectedUiEvents=mA([]);viewMode=mA(localStorage.getItem("chat-view-mode")||"events");invocationIdFilterActive=mA(!1);nodePathFilterActive=mA(!1);invocationIdFilter=mA("");nodePathFilter=mA("");invocationIdOptions=me(()=>{let e=new Set;for(let A of this.uiEvents())A.event?.invocationId&&e.add(A.event.invocationId);return Array.from(e)});nodePathOptions=me(()=>{let e=new Set;for(let A of this.uiEvents()){let t=A.bareNodePath;t&&e.add(t)}return Array.from(e)});invChipMenuTrigger=ko("invChipMenuTrigger");nodeChipMenuTrigger=ko("nodeChipMenuTrigger");addMenuTrigger=ko("addMenuTrigger");openAddFilterMenu(e){e.stopPropagation(),this.addMenuTrigger()?.openMenu()}addInvocationIdFilter(){this.invocationIdFilterActive.set(!0),setTimeout(()=>{this.invChipMenuTrigger()?.openMenu()})}addNodePathFilter(){this.nodePathFilterActive.set(!0),setTimeout(()=>{this.nodeChipMenuTrigger()?.openMenu()})}removeInvocationIdFilter(e){e.stopPropagation(),this.invocationIdFilterActive.set(!1),this.invocationIdFilter.set("")}removeNodePathFilter(e){e.stopPropagation(),this.nodePathFilterActive.set(!1),this.nodePathFilter.set("")}setInvocationIdFilter(e){this.invocationIdFilter.set(e)}setNodePathFilter(e){this.nodePathFilter.set(e)}onInvocationMenuClosed(){this.invocationIdFilter()||this.invocationIdFilterActive.set(!1)}onNodePathMenuClosed(){this.nodePathFilter()||this.nodePathFilterActive.set(!1)}clearAllFilters(e){e.stopPropagation(),this.invocationIdFilterActive()&&(this.invocationIdFilterActive.set(!1),this.invocationIdFilter.set("")),this.nodePathFilterActive()&&(this.nodePathFilterActive.set(!1),this.nodePathFilter.set("")),this.hideIntermediateEvents()&&this.toggleHideIntermediateEvents()}shouldShowEvent(e){let A=this.invocationIdFilter();if(A&&!(e.event?.invocationId||"").includes(A))return!1;let t=this.nodePathFilter();if(t&&!(e.bareNodePath||"").includes(t))return!1;if(!this.hideIntermediateEvents()||e.role==="user")return!0;if(e.event?.content!==void 0){let n=e.event.content.parts||[];if(n.length>0&&n.every(a=>a.functionCall||a.functionResponse)){if(n.some(r=>{let s=r.functionCall?.id||r.functionResponse?.id;return s&&e.event?.longRunningToolIds?.includes(s)}))return!0}else return!0}if(e.event?.output!==void 0){let n=e.event?.nodeInfo,o=!1,a=n?.outputFor;if(Array.isArray(a)?o=a.some(r=>!r.includes("/")):typeof a=="string"?o=!a.includes("/"):n?.path&&(o=!n.path.includes("/")),o)return!0}return!1}shouldShowEventFn=this.shouldShowEvent.bind(this);getMetricTooltip(e,A,t){let n=this.metricsInfo().find(g=>g.metricName===e),o=n?.description||"",a=n?.metricValueInfo?.interval?.minValue??"?",r=n?.metricValueInfo?.interval?.maxValue??"?",s=A!=null?parseFloat(A).toFixed(2):"?",l=t!=null?parseFloat(t).toFixed(2):"?";return`${o?o+" | ":""}Actual: ${s} | Threshold: ${l} | Min: ${a} | Max: ${r}`}getMetricDescription(e){return this.metricsInfo().find(t=>t.metricName===e)?.description||""}getMetricMin(e){let t=this.metricsInfo().find(n=>n.metricName===e)?.metricValueInfo?.interval?.minValue;return t!=null?t.toFixed(2):"?"}getMetricMax(e){let t=this.metricsInfo().find(n=>n.metricName===e)?.metricValueInfo?.interval?.maxValue;return t!=null?t.toFixed(2):"?"}getVersionTooltip(){let e=this.versionInfo();return e?`Version: ${e.version} | Language: ${e.language} | Language Version: ${e.language_version}`:""}getMergedTooltip(){let e=this.sidePanelI18n.disclosureTooltip||"",A=this.getVersionTooltip();return A?`${e} | ${A}`:e}filteredUiEvents=me(()=>this.uiEvents().filter(e=>this.shouldShowEvent(e)));filteredExpectedUiEvents=me(()=>this.expectedUiEvents().filter(e=>this.shouldShowEvent(e)));onViewModeChange(e){this.viewMode.set(e);try{localStorage.setItem("chat-view-mode",e)}catch(A){}}originalSessionId="";hideIntermediateEvents=mA(window.localStorage.getItem("adk-hide-intermediate-events")==="true");toggleHideIntermediateEvents(){let e=!this.hideIntermediateEvents();this.hideIntermediateEvents.set(e),window.localStorage.setItem("adk-hide-intermediate-events",String(e))}sessionHasUsedBidi=new Set;eventData=new Map;traceData=[];renderedEventGraph;rawSvgString=null;agentGraphData=mA(null);sessionGraphSvgLight={};sessionGraphSvgDark={};sessionGraphDot={};dynamicGraphDot={};agentReadme="";graphsAvailable=mA(!0);get hasSubWorkflows(){return Object.keys(this.sessionGraphSvgLight).length>1}selectedEvent=void 0;selectedEventIndex=void 0;selectedMessageIndex=void 0;llmRequest=void 0;llmResponse=void 0;llmRequestKey="gcp.vertex.agent.llm_request";llmResponseKey="gcp.vertex.agent.llm_response";getMediaTypeFromMimetype=Sm;selectedFiles=[];MediaType=J0;selectedAppControl=new Rs("",{nonNullable:!0});appDrawerSearchControl=new Rs("",{nonNullable:!0});openBase64InNewTab(e,A){this.safeValuesService.openBase64InNewTab(e,A)}isLoadingApps=mA(!1);loadingError=mA("");apps$=ie([]).pipe(Ei(()=>{this.isLoadingApps.set(!0),this.selectedAppControl.disable()}),pi(()=>this.agentService.listApps().pipe(qo(e=>(this.loadingError.set(e.message),ie(void 0))))),po(1),Ei(e=>{this.isLoadingApps.set(!1),this.selectedAppControl.enable(),e?.length==1&&this.router.navigate([],{relativeTo:this.activatedRoute,queryParams:{app:e[0]},queryParamsHandling:"merge"})}),Ss());filteredDrawerApps$=this.apps$.pipe(pi(e=>dr([ie(e),this.appDrawerSearchControl.valueChanges.pipe(kn(""))])),ye(([e,A])=>{if(!e||!A||A.trim()==="")return e;let t=A.toLowerCase().trim();return e.filter(n=>n.toLowerCase().includes(t))}));importSessionEnabledObs=this.featureFlagService.isImportSessionEnabled();isEditFunctionArgsEnabledObs=this.featureFlagService.isEditFunctionArgsEnabled();isSessionUrlEnabledObs=this.featureFlagService.isSessionUrlEnabled();isApplicationSelectorEnabledObs=this.featureFlagService.isApplicationSelectorEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isExportSessionEnabledObs=this.featureFlagService.isExportSessionEnabled();isEventFilteringEnabled=Za(this.featureFlagService.isEventFilteringEnabled());isApplicationSelectorEnabled=Za(this.featureFlagService.isApplicationSelectorEnabled());isDeleteSessionEnabledObs=this.featureFlagService.isDeleteSessionEnabled();isUserIdOnToolbarEnabledObs=this.featureFlagService.isUserIdOnToolbarEnabled();isDeveloperUiDisclaimerEnabledObs=this.featureFlagService.isDeveloperUiDisclaimerEnabled();disableBuilderSwitch=!1;autoSelectLatestEvent=!1;constructor(){_n(()=>{this.themeService.currentTheme()&&this.updateRenderedGraph()})}ngOnInit(){if(this.syncSelectedAppFromUrl(),this.updateSelectedAppUrl(),this.hideSidePanelIfNeeded(),this.agentService.getVersion().subscribe(t=>{this.adkVersion.set(t.version||""),this.versionInfo.set(t)}),dr([this.agentService.getApp(),this.activatedRoute.queryParams]).pipe(Ct(([t,n])=>!!t&&!!n[q5]),to(),ye(([,t])=>t[q5])).subscribe(t=>{setTimeout(()=>{this.userInput=t})}),this.streamChatService.onStreamClose().subscribe(t=>{let n=`Please check server log for full details: +`+t;this.openSnackBar(n,"OK")}),this.webSocketService.getMessages().subscribe(t=>{if(t)try{let n=JSON.parse(t);(n.interrupted||n.inputTranscription!==void 0&&n.partial)&&this.audioPlayingService.stopAudio(),this.appendEventRow(n),this.changeDetectorRef.detectChanges()}catch(n){}}),new URL(window.location.href).searchParams.has("code")){let t=window.location.href;window.opener?.postMessage({authResponseUrl:t},window.origin),window.close()}this.agentService.getApp().subscribe(t=>{this.appName=t,this.evalService.metricsInfo.set([])}),this.traceService.selectedTraceRow$.subscribe(t=>{t&&(this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0,this.showSidePanel||(this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true"),this.sideDrawer()?.open()),this.changeDetectorRef.detectChanges())}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(to()).subscribe(t=>{t&&(this.uiStateService.onNewMessagesLoaded().subscribe(n=>{this.populateMessages(n.items,!0,!n.isBackground),this.loadTraceData()}),this.uiStateService.onNewMessagesLoadingFailed().subscribe(n=>{this.openSnackBar(n.message,"OK")}))})}get sessionTab(){return this.drawerSessionTab()}switchToTraceView(){this.onViewModeChange("traces")}ngAfterViewInit(){this.showSidePanel&&this.sideDrawer()?.open(),this.isApplicationSelectorEnabled()||this.loadSessionByUrlOrReset()}selectApp(e){if(this.isLoadedAppUnavailable.set(!1),e!=this.appName){let A=!this.appName;this.agentService.setApp(e),A?this.loadSessionByUrlOrReset():this.createSessionAndReset()}}loadSessionByUrlOrReset(){this.isSessionUrlEnabledObs.subscribe(e=>{let A=this.activatedRoute.snapshot.queryParams,t=A.session,n=A.userId,o=A.evalCase,a=A.evalResult,r=A.file;if(n&&(this.userId=n),o){this.chatType.set("eval-case");let s=o.split("/");if(s.length===2){let l=s[0],g=s[1];this.evalSetId=l,this.evalService.getEvalCase(this.appName,l,g).subscribe(C=>{C&&(this.updateWithSelectedEvalCase(C),setTimeout(()=>{let I=this.sidePanel();I.switchToEvalTab(),I.selectEvalCase(l,C)},600))})}return}if(a){this.chatType.set("eval-result");let s=a.split("/");if(console.log("loadSessionByUrlOrReset evalResultUrl parts:",s),s.length===3){let l=s[0],g=s[1],C=s[2];this.evalSetId=l;let I=`${this.appName}_${l}_${C}`;console.log("loadSessionByUrlOrReset runId:",I),this.evalService.getEvalResult(this.appName,I).subscribe(B=>{if(console.log("loadSessionByUrlOrReset runResult:",B),B){let Q=B.evalCaseResults?.find(h=>h.evalId===g);if(console.log("loadSessionByUrlOrReset evalCaseResult:",Q),Q){let h=Q.sessionId;this.evalService.getEvalCase(this.appName,l,g).subscribe(f=>{this.sessionService.getSession(this.userId,this.appName,h).subscribe(m=>{this.addEvalCaseResultToEvents(m,Q);let v={id:m?.id??"",appName:m?.appName??"",userId:m?.userId??"",state:m?.state??[],events:m?.events??[],isEvalResult:!0,evalCase:f,evalCaseResult:Q,timestamp:C};this.updateWithSelectedSession(v),setTimeout(()=>{let S=this.sidePanel();S.switchToEvalTab(),S.selectEvalResult(l,C,f)},600)})})}}})}return}if(r){this.chatType.set("file");return}if(!e||!t){this.chatType.set("session"),this.createSessionAndReset();return}t&&(this.chatType.set("session"),this.sessionId=t,this.loadSession(t,!0))})}loadSession(e,A=!1){this.uiStateService.setIsSessionLoading(!0),this.isViewOnlySession.set(!1),this.isViewOnlyAppNameMismatch.set(!1),dr([this.sessionService.getSession(this.userId,this.appName,e).pipe(qo(t=>(A&&(this.openSnackBar("Cannot find specified session. Creating a new one.",void 0,3e3),this.createSessionAndReset()),ie(null)))),this.featureFlagService.isInfinityMessageScrollingEnabled()]).pipe(to()).subscribe(([t,n])=>{this.uiStateService.setIsSessionLoading(!1),t&&(n&&t.id&&this.uiStateService.lazyLoadMessages(t.id,{pageSize:100,pageToken:""}).pipe(to()).subscribe(),this.updateWithSelectedSession(t))})}hideSidePanelIfNeeded(){this.activatedRoute.queryParams.pipe(Ct(e=>e[w7A]==="true"),po(1)).subscribe(()=>{this.showSidePanel=!1,this.sideDrawer()?.close()})}createSessionAndReset(){this.resetToNewSession(),this.chatType.set("session"),this.isViewOnlySession.set(!1),this.isViewOnlyAppNameMismatch.set(!1),this.canEditSession.set(!0),this.chatPanel()?.canEditSession?.set(!0),this.eventData=new Map,this.uiEvents.set([]),this.artifacts=[],this.userInput="",this.longRunningEvents=[],this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0,this.traceService.resetTraceService()}resetToNewSession(){this.sessionId="",this.currentSessionState={},this.sessionTab?.refreshSession(),this.clearSessionUrl()}createSession(){this.uiStateService.setIsSessionListLoading(!0),this.sessionService.createSession(this.userId,this.appName).subscribe(e=>{this.currentSessionState=e.state,this.sessionId=e.id??"",this.sessionTab?.refreshSession(),this.sessionTab?.reloadSession(this.sessionId),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()})},()=>{this.uiStateService.setIsSessionListLoading(!1)})}handleChatInput(e){return Ie(this,null,function*(){if(e.preventDefault(),!this.userInput.trim()&&this.selectedFiles.length<=0||e instanceof KeyboardEvent&&(e.isComposing||e.keyCode===229))return;let A={role:"user",parts:yield this.getUserMessageParts()};this.userInput="",this.selectedFiles=[];let t=this.router.parseUrl(this.location.path());t.queryParams[q5]&&(delete t.queryParams[q5],this.location.replaceState(t.toString())),yield this.sendMessage(A)})}ensureSessionActive(e){return Ie(this,null,function*(){if(this.sessionId)return!0;try{let A="";e?.parts&&e.parts[0]?.text&&(A=e.parts[0].text,A.length>50&&(A=A.substring(0,47)+"..."));let t=A?{__session_metadata__:{displayName:A}}:void 0,n=yield c3(this.sessionService.createSession(this.userId,this.appName,t));return this.currentSessionState=n.state||t||{},this.sessionId=n.id??"",this.sessionTab?.refreshSession(),this.sessionTab?.reloadSession(this.sessionId),this.drawerSessionTab()?.refreshSession(),this.drawerSessionTab()?.reloadSession(this.sessionId),this.isSessionUrlEnabledObs.pipe(to()).subscribe(o=>{o&&this.updateSelectedSessionUrl()}),!0}catch(A){return this.openSnackBar("Failed to create session","OK"),!1}})}sendMessage(e){return Ie(this,null,function*(){if(!(yield this.ensureSessionActive(e)))return;let t=e.functionCallEventId;t&&delete e.functionCallEventId;let n=`user_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,o={id:n,author:e.role||"user",content:e},a=this.buildUiEventFromEvent(o);this.uiEvents.update(s=>[...s,a]),setTimeout(()=>this.changeDetectorRef.detectChanges(),0),this.eventData.set(n,o),this.eventData=new Map(this.eventData);let r={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:e,streaming:this.useSse(),stateDelta:this.updatedSessionState()};t&&(r.functionCallEventId=t),this.submitAgentRunRequest(r),this.changeDetectorRef.detectChanges()})}submitAgentRunRequest(e){this.autoSelectLatestEvent=!0,this.agentService.runSse(e).subscribe({next:A=>Ie(this,null,function*(){if(A.error){this.openSnackBar(A.error,"OK");return}this.appendEventRow(A);let t=this.sidePanel().selectedIndex===0;this.autoSelectLatestEvent&&A.id&&t&&this.selectEvent(A.id,void 0,!1),A.actions&&this.processActionStateDelta(A),this.changeDetectorRef.detectChanges()}),error:A=>{console.error("Send message error:",A),this.openSnackBar(A,"OK")},complete:()=>{this.updatedSessionState()&&(this.currentSessionState=this.updatedSessionState(),this.updatedSessionState.set(null)),this.featureFlagService.isSessionReloadOnNewMessageEnabled().pipe(to()).subscribe(A=>{A&&this.sessionTab?.reloadSession(this.sessionId)}),this.loadTraceData()}})}appendEventRow(e,A=!1){if(e.inputTranscription!==void 0?e.author="user":e.outputTranscription!==void 0&&(e.author="bot"),e.errorMessage&&e.id&&!this.eventData.has(e.id)&&(this.eventData.set(e.id,e),this.eventData=new Map(this.eventData)),e.id&&!this.eventData.has(e.id)&&(this.eventData.set(e.id,e),this.eventData=new Map(this.eventData)),this.traceService.setEventData(this.eventData),e?.longRunningToolIds&&e.longRunningToolIds.length>0){let t=this.longRunningEvents.length;this.getAsyncFunctionsFromParts(e.longRunningToolIds,e.content.parts,e.invocationId),this.functionCallEventId=e.id;for(let n=t;n{this.sendOAuthResponse(o,s,this.redirectUri)}).catch(s=>{console.error("OAuth Error:",s)});break}}}if(e.partial)this.uiEvents.update(t=>{if(t.length>0){let o=t.length-1,a=t[o],r=!!(a.event?.inputTranscription||a.event?.outputTranscription),s=!!(e.inputTranscription||e.outputTranscription);if(a.event?.partial&&a.role===(e.author==="user"?"user":"bot")&&r===s){let l=this.mergePartialEvent(a,e),g=[...t];return g[o]=l,g}}let n=this.buildUiEventFromEvent(e,A);return A?[n,...t]:[...t,n]});else{let t=this.buildUiEventFromEvent(e,A);this.uiEvents.update(n=>{let o=n.findIndex(a=>a.event?.id===e.id&&e.id);if(o<0&&n.length>0){let a=e.inputTranscription!==void 0,r=e.outputTranscription!==void 0,s=e.content?.parts?.some(l=>l.thought);if(a||r||s)if(A)for(let l=0;lC.thought))){o=l;break}}}else for(let l=n.length-1;l>=0;l--){let g=n[l].event;if(g?.partial){if(a&&g.inputTranscription!==void 0){o=l;break}if(r&&g.outputTranscription!==void 0){o=l;break}if(s&&(n[l].thought||g.content?.parts?.some(C=>C.thought))){o=l;break}}}else{let l=A?0:n.length-1,g=n[l];if(g.event?.partial){let C=!!(g.event?.inputTranscription||g.event?.outputTranscription),I=!!(e.inputTranscription||e.outputTranscription);C===I&&(o=l)}}}if(o>=0){let a=n[o];(!t.functionResponses||t.functionResponses.length===0)&&(t.functionResponses=a.functionResponses),(!t.functionCalls||t.functionCalls.length===0)&&(t.functionCalls=a.functionCalls);let r=[...n];return r[o]=t,r}else return A?[t,...n]:[...n,t]})}if(e.actions?.artifactDelta){let t=this.uiEvents().find(n=>n.event?.id===e.id);if(t)for(let n in e.actions.artifactDelta)e.actions.artifactDelta.hasOwnProperty(n)&&this.renderArtifact(n,e.actions.artifactDelta[n],t)}}mergePartialEvent(e,A){let t=new _Q(Oe(oA({},e),{event:A})),n=A.content?.parts||[];if(this.isEventA2aResponse(A)&&(n=this.combineA2uiDataParts(n)),n=this.combineTextParts(n),n.forEach(o=>{o.text!==void 0&&o.text!==null?(t.text=(t.text||"")+o.text,o.thought&&(t.thought=!0,t.text=this.processThoughtText(t.text||""))):this.processPartIntoMessage(o,A,t)}),A.inputTranscription){let o=e.event?.inputTranscription?.text||"";t.event.inputTranscription={text:o+(A.inputTranscription.text||"")}}if(A.outputTranscription){let o=e.event?.outputTranscription?.text||"";t.event.outputTranscription={text:o+(A.outputTranscription.text||"")}}return t}getUserMessageParts(){return Ie(this,null,function*(){let e=[];if(this.userInput.trim()&&e.push({text:`${this.userInput}`}),this.selectedFiles.length>0)for(let A of this.selectedFiles)e.push(yield this.localFileService.createMessagePartFromFile(A.file));return e})}processActionStateDelta(e){e.actions&&e.actions.stateDelta&&Object.keys(e.actions.stateDelta).length>0&&(this.currentSessionState=oA(oA({},this.currentSessionState||{}),e.actions.stateDelta))}combineTextParts(e){let A=[],t;for(let n of e)n.text&&!n.thought?t?t.text+=n.text:(t={text:n.text},A.push(t)):(t=void 0,A.push(n));return A}isEventA2aResponse(e){return!!e?.customMetadata?.["a2a:response"]}isA2aDataPart(e){if(!e.inlineData||e.inlineData.mimeType!=="text/plain")return!1;let A=atob(kx(e.inlineData.data));return A.startsWith(Mx)&&A.endsWith(Sx)}isA2uiDataPart(e){let A=this.extractA2aDataPartJson(e);return A&&A.kind==="data"&&A.metadata?.mimeType===jZ}extractA2aDataPartJson(e){if(!this.isA2aDataPart(e))return null;let A=atob(kx(e.inlineData.data)),t=A.substring(Mx.length,A.length-Sx.length),n;try{n=JSON.parse(t)}catch(o){return null}return n}combineA2uiDataParts(e){let A=[],t=[],n;for(let o of e)this.isA2uiDataPart(o)?(t.push(this.extractA2aDataPartJson(o)),n||(n={inlineData:{mimeType:"text/plain",data:o.inlineData.data}},A.push(n))):A.push(o);if(n?.inlineData){let a=Mx+JSON.stringify({kind:"data",metadata:{mimeType:jZ},data:t})+Sx;n.inlineData.data=btoa(a)}return A}processA2uiPartIntoMessage(e){let A={};return e.a2ui.forEach(t=>{t.data.beginRendering?A.beginRendering=t.data:t.data.surfaceUpdate?A.surfaceUpdate=t.data:t.data.dataModelUpdate&&(A.dataModelUpdate=t.data)}),A}updateRedirectUri(e,A){try{let t=new URL(e);return t.searchParams.set("redirect_uri",A),t.toString()}catch(t){return console.warn("Failed to update redirect URI: ",t),e}}formatBase64Data(e,A){let t=kx(e);return`data:${A};base64,${t}`}processPartIntoMessage(e,A,t){if(e)if(A&&(t.event=A,A.invocationIndex!==void 0&&(t.invocationIndex=A.invocationIndex),A.toolUseIndex!==void 0&&(t.toolUseIndex=A.toolUseIndex),A.finalResponsePartIndex!==void 0&&(t.finalResponsePartIndex=A.finalResponsePartIndex)),e.text)t.text=(t.text||"")+e.text,t.thought=!!e.thought,A?.groundingMetadata&&A.groundingMetadata.searchEntryPoint&&A.groundingMetadata.searchEntryPoint.renderedContent&&(t.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),A?.id&&(t.event=A);else if(e.inlineData){let n=this.formatBase64Data(e.inlineData.data,e.inlineData.mimeType),o=Sm(e.inlineData.mimeType);t.inlineData={displayName:e.inlineData.displayName,data:n,mimeType:e.inlineData.mimeType,mediaType:o},t.role==="user"&&A?.id&&(t.event=A)}else if(e.functionCall){t.functionCalls||(t.functionCalls=[]);let n=A?.longRunningToolIds?.includes(e.functionCall.id),o=e.functionCall;n&&(o=Oe(oA({},e.functionCall),{isLongRunning:!0,invocationId:A.invocationId,functionCallEventId:A.id,needsResponse:!0,responseStatus:e.functionCall.responseStatus||"pending",userResponse:e.functionCall.userResponse||""}));let a=t.functionCalls.findIndex(r=>r.id===e.functionCall.id);a>=0?t.functionCalls[a]=oA(oA({},t.functionCalls[a]),o):t.functionCalls.push(o),A?.id&&(t.event=A)}else e.functionResponse?(t.functionResponses||(t.functionResponses=[]),t.functionResponses.push(e.functionResponse),A?.id&&(t.event=A)):e.executableCode?t.executableCode=e.executableCode:e.codeExecutionResult?t.codeExecutionResult=e.codeExecutionResult:e.a2ui&&(t.a2uiData=this.processA2uiPartIntoMessage(e))}handleArtifactFetchFailure(e,A,t,n){this.openSnackBar("Failed to fetch artifact data","OK"),e.error={errorMessage:"Failed to fetch artifact data"+(n?": "+(n.message||n):"")},this.changeDetectorRef.detectChanges(),this.artifacts=this.artifacts.filter(o=>o.id!==A||o.versionId!==t)}renderArtifact(e,A,t){if(this.artifacts.some(a=>a.id===e&&a.versionId===A))return;t.inlineData={data:"",mimeType:"image/png"};let o={id:e,versionId:A,data:"",mimeType:"image/png",mediaType:"image"};this.artifacts=[...this.artifacts,o],this.artifactService.getArtifactVersion(this.userId,this.appName,this.sessionId,e,A).subscribe({next:a=>{let r=a.mimeType,s=a.data;if((!r||!s)&&a.inlineData&&(r=a.inlineData.mimeType,s=a.inlineData.data),!r&&!s&&a.text){r="text/plain";try{s=btoa(unescape(encodeURIComponent(a.text)))}catch(I){console.error("Failed to encode text to base64",I),this.handleArtifactFetchFailure(t,e,A,{message:"Failed to encode text data"});return}}if(!r||!s){this.handleArtifactFetchFailure(t,e,A,{message:"Invalid response data: missing mimeType or data or text"});return}let l=this.formatBase64Data(s,r),g=Sm(r),C={name:this.createDefaultArtifactName(r),data:l,mimeType:r,mediaType:g};t.inlineData=C,this.changeDetectorRef.detectChanges(),this.artifacts=this.artifacts.map(I=>I.id===e&&I.versionId===A?{id:e,versionId:A,data:l,mimeType:r,mediaType:g}:I)},error:a=>{this.handleArtifactFetchFailure(t,e,A,a)}})}sendOAuthResponse(e,A,t){this.longRunningEvents.pop();var n=structuredClone(e.args.authConfig);n.exchangedAuthCredential.oauth2.authResponseUri=A,n.exchangedAuthCredential.oauth2.redirectUri=t;let o={role:"user",parts:[{functionResponse:{id:e.id,name:e.name,response:n}}],functionCallEventId:this.functionCallEventId};this.sendMessage(o)}clickEvent(e){let A=this.uiEvents()[e],t=A.event.id;if(t){if(this.selectedMessageIndex===e){this.sideDrawer()?.open(),this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true");return}if(A.role==="user"){this.selectedEvent=this.eventData.get(t),this.selectedEventIndex=this.getIndexOfKeyInMap(t),this.selectedMessageIndex=e,this.llmRequest=void 0,this.llmResponse=void 0,this.sideDrawer()?.open(),this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true"),this.updateRenderedGraph(),this.viewMode()!=="events"&&this.onViewModeChange("events");return}this.sideDrawer()?.open(),this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true"),this.selectEvent(t,e)}}handleJumpToInvocation(e){let A=this.uiEvents(),t=-1,n=-1;for(let o=0;o{this.chatPanel()?.scrollToSelectedMessage(t)},100))}ngOnDestroy(){this.streamChatService.closeStream()}onAppSelection(e){this.isAudioRecording&&(this.stopAudioRecording(),this.isAudioRecording=!1),this.isVideoRecording&&(this.stopVideoRecording(),this.isVideoRecording=!1),this.evalTab()?.resetEvalResults(),this.traceData=[]}toggleAudioRecording(e){return Ie(this,null,function*(){this.isAudioRecording?this.stopAudioRecording():yield this.startAudioRecording(e)})}startAudioRecording(e){return Ie(this,null,function*(){if(this.sessionId&&this.sessionHasUsedBidi.has(this.sessionId)){this.openSnackBar(D7A,"OK");return}(yield this.ensureSessionActive())&&(this.isAudioRecording=!0,this.streamChatService.startAudioChat({appName:this.appName,userId:this.userId,sessionId:this.sessionId,flags:e}),this.sessionHasUsedBidi.add(this.sessionId))})}stopAudioRecording(){this.audioPlayingService.stopAudio(),this.streamChatService.stopAudioChat(),this.isAudioRecording=!1,this.isVideoRecording&&this.stopVideoRecording()}toggleVideoRecording(){this.isVideoRecording?this.stopVideoRecording():this.startVideoRecording()}startVideoRecording(){let e=this.chatPanel()?.videoContainer;e&&(this.isVideoRecording=!0,this.streamChatService.startVideoStreaming(e))}stopVideoRecording(){let e=this.chatPanel()?.videoContainer;e&&(this.streamChatService.stopVideoStreaming(e),this.isVideoRecording=!1)}getAsyncFunctionsFromParts(e,A,t){for(let n of A)n.functionCall&&e.includes(n.functionCall.id)&&this.longRunningEvents.push({function:n.functionCall,invocationId:t})}openOAuthPopup(e){return new Promise((A,t)=>{if(!this.safeValuesService.windowOpen(window,e,"oauthPopup","width=600,height=700")){t("Popup blocked!");return}let o=a=>{if(a.origin!==window.location.origin)return;let{authResponseUrl:r}=a.data;r?(A(r),window.removeEventListener("message",o)):console.log("OAuth failed",a)};window.addEventListener("message",o)})}toggleSidePanel(){this.showSidePanel?(this.sideDrawer()?.close(),this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0):this.sideDrawer()?.open(),this.showSidePanel=!this.showSidePanel,window.localStorage.setItem("adk-side-panel-visible",this.showSidePanel.toString())}toggleAppSelectorDrawer(){this.showSessionSelectorDrawer=!1,this.showAppSelectorDrawer=!this.showAppSelectorDrawer,this.showAppSelectorDrawer&&this.appDrawerSearchControl.setValue("")}onSelectorDrawerOpened(){this.showAppSelectorDrawer&&this.appSearchInput()?.nativeElement.focus()}handleAppSearchKeydown(e){if(e.key==="ArrowDown"){e.preventDefault(),e.stopPropagation();let A=this.document.querySelector(".app-selector-list .app-selector-item");A&&A.focus()}}handleAppListKeydown(e){if(e.key!=="ArrowDown"&&e.key!=="ArrowUp")return;e.stopPropagation();let A=Array.from(this.document.querySelectorAll(".app-selector-list .app-selector-item")),t=A.indexOf(this.document.activeElement);if(t>-1){if(e.preventDefault(),e.key==="ArrowDown"){let n=t+1;n=0?A[n].focus():this.appSearchInput()?.nativeElement.focus()}}}onAppSelectorDrawerClosed(){this.showAppSelectorDrawer=!1}toggleSessionSelectorDrawer(){this.showAppSelectorDrawer=!1,this.showSessionSelectorDrawer=!this.showSessionSelectorDrawer}onSessionSelectorDrawerClosed(){this.showSessionSelectorDrawer=!1}onSelectorDrawerClosed(){this.showAppSelectorDrawer=!1,this.showSessionSelectorDrawer=!1}onSessionSelectedFromDrawer(e){this.showSessionSelectorDrawer=!1,this.loadSession(e)}onSessionReloadedFromDrawer(e){this.loadSession(e)}selectAppFromDrawer(e){this.selectedAppControl.setValue(e),this.showAppSelectorDrawer=!1}handleTabChange(e){this.canChat()||(this.resetEditEvalCaseVars(),this.handleReturnToSession(!0))}handleReturnToSession(e){this.sessionTab?.getSession(this.sessionId),this.evalTab()?.resetEvalCase(),this.chatType.set("session")}handleEvalNotInstalled(e){e&&this.openSnackBar(e,"OK")}resetEventsAndMessages({keepMessages:e}={}){e||(this.eventData.clear(),this.uiEvents.set([]),this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0),this.artifacts=[]}loadTraceData(){this.sessionId&&(this.uiStateService.setIsEventRequestResponseLoading(!0),this.eventService.getTrace(this.appName,this.sessionId).pipe(to(),qo(e=>(console.error("[DEBUG] getTrace error:",e),ie([])))).subscribe(e=>{this.traceData=e,this.traceService.setEventData(this.eventData),this.traceService.setMessages(this.uiEvents()),this.selectedEvent&&this.populateLlmRequestResponse(),this.uiStateService.setIsEventRequestResponseLoading(!1),this.changeDetectorRef.detectChanges()}),this.changeDetectorRef.detectChanges())}buildUiEventFromEvent(e,A=!1){let t=this.isEventA2aResponse(e),n=t?this.combineA2uiDataParts(e.content?.parts):e.content?.parts||[],o=A?[...n].reverse():n,a=e.author==="user"?"user":"bot",r=new _Q({role:a,event:e});return(e.errorCode||e.errorMessage)&&(r.error={errorCode:e.errorCode,errorMessage:e.errorMessage}),e.inputTranscription!==void 0&&typeof e.inputTranscription=="string"&&(r.event.inputTranscription={text:e.inputTranscription}),e.outputTranscription!==void 0&&typeof e.outputTranscription=="string"&&(r.event.outputTranscription={text:e.outputTranscription}),o.forEach(s=>{a==="bot"&&t&&this.isA2uiDataPart(s)&&(s={a2ui:this.extractA2aDataPartJson(s).data}),this.processPartIntoMessage(s,e,r)}),r}populateMessages(e,A=!1,t=!1){this.resetEventsAndMessages({keepMessages:t&&this.sessionIdOfLoadedMessages===this.sessionId}),e.forEach(n=>{this.appendEventRow(n,A)}),this.sessionIdOfLoadedMessages=this.sessionId}restorePendingLongRunningCalls(){let e=this.uiEvents(),A=new Set;this.uiEvents().forEach(t=>{t.functionResponses&&t.functionResponses.forEach(n=>{n.id&&A.add(n.id)})}),this.uiEvents().forEach(t=>{t.functionCalls&&t.functionCalls.forEach(n=>{let o=t.event.id?this.eventData.get(t.event.id):null;(n.isLongRunning||o?.longRunningToolIds?.includes(n.id))&&!A.has(n.id)&&(n.isLongRunning=!0,n.invocationId=o?.invocationId,n.functionCallEventId=t.event.id||"",n.needsResponse=!0,n.responseStatus="pending",n.userResponse=n.userResponse||"")})})}updateWithSelectedSession(e){if(!(!e||!e.id)){if(this.traceService.resetTraceService(),this.traceData=[],this.sessionId=e.id,this.currentSessionState=e.state||{},this.evalCase=null,this.resetEventsAndMessages(),e.isEvalResult){this.isViewOnlySession.set(!0),this.readonlySessionType.set("Eval Result");let A=e.evalCase?.evalId,t=e.timestamp;this.currentEvalCaseId=A,this.currentEvalTimestamp=t;let n=t;if(t){let o=Number(t);isNaN(o)||(n=new Date(o*1e3).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0}))}this.readonlySessionName.set(A&&n?`${n} > ${A}`:e.id),this.canEditSession.set(!1),this.chatPanel()?.canEditSession?.set(!1)}else this.isViewOnlySession.set(!1);e.evalCase?this.expectedUiEvents.set(this.buildUiEventsFromEvalCase(e.evalCase)):this.expectedUiEvents.set([]),e.evalCaseResult?this.evalCaseResult.set(e.evalCaseResult):this.evalCaseResult.set(null),e.isEvalResult?this.chatType.set("eval-result"):(this.chatType.set("session"),this.isSideBySide.set(!1)),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()}),e.events&&e.state&&(e.events.forEach(A=>{this.appendEventRow(A,!1)}),this.restorePendingLongRunningCalls()),this.changeDetectorRef.detectChanges(),this.loadTraceData(),e.isEvalResult||this.sessionService.canEdit(this.userId,e).pipe(to(),qo(()=>ie(!0))).subscribe(A=>{this.chatPanel()?.canEditSession?.set(A),this.canEditSession.set(A)}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(to()).subscribe(A=>{A||this.populateMessages(e.events||[]),this.loadTraceData()})}}formatToolUses(e){if(!e||!Array.isArray(e))return[];let A=[];for(let t of e)A.push({name:t.name,args:t.args});return A}addEvalCaseResultToEvents(e,A){let t=A.evalMetricResultPerInvocation,n=-1;if(t)for(let o=0;o{this.appendEventRow(t,!1)}),this.canEditSession.set(!1),this.chatPanel()?.canEditSession?.set(!1),this.isViewOnlySession.set(!0),this.changeDetectorRef.detectChanges()}buildUiEventsFromEvalCase(e){let A=this.uiEvents(),t=this.eventData,n=this.chatType(),o=this.isViewOnlySession(),a=this.readonlySessionType(),r=this.readonlySessionName();this.uiEvents.set([]),this.eventData=new Map,this.updateWithSelectedEvalCase(e);let s=this.uiEvents();return this.uiEvents.set(A),this.eventData=t,this.chatType.set(n),this.isViewOnlySession.set(o),this.readonlySessionType.set(a),this.readonlySessionName.set(r),s}updateWithSelectedEvalCase(e){if(this.evalCase=e,this.chatType.set("eval-case"),this.isViewOnlySession.set(!0),this.readonlySessionType.set("Eval Case"),this.readonlySessionName.set(e.evalId),this.chatType.set("eval-case"),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()}),this.resetEventsAndMessages(),e.events&&e.events.length>0)for(let A of e.events)this.appendEventRow(A,!1);else{e.events=[];let A=0;for(let t of e.conversation){if(t.userContent?.parts&&e.events.push({author:"user",content:t.userContent,invocationIndex:A}),t.intermediateData?.invocationEvents){let n=0;for(let o of t.intermediateData.invocationEvents)o.invocationIndex=A,o.content?.parts?.[0]?.functionCall&&(o.toolUseIndex=n,n++),e.events.push(o)}else if(t.intermediateData?.toolUses){let n=0;for(let o of t.intermediateData.toolUses)e.events.push({author:"bot",content:{parts:[{functionCall:{name:o.name,args:o.args}}]},invocationIndex:A,toolUseIndex:n}),n++,e.events.push({author:"bot",content:{parts:[{functionResponse:{name:o.name}}]},invocationIndex:A})}t.finalResponse?.parts&&e.events.push({author:"bot",content:t.finalResponse,invocationIndex:A}),A++}for(let t of e.events)this.appendEventRow(t,!1)}}handleEditEvalCaseRequested(e){this.updateWithSelectedEvalCase(e),this.editEvalCase()}updateSelectedEvalSetId(e){this.evalSetId=e}editEvalCaseMessage(e){this.isEvalCaseEditing.set(!0),this.userEditEvalCaseMessage=e.text,e.isEditing=!0,setTimeout(()=>{let A=this.chatPanel()?.textarea?.nativeElement;if(!A)return;A.focus();let t=A.value.length;e.text.charAt(t-1)===` +`&&t--,A.setSelectionRange(t,t)},0)}editFunctionArgs(e){this.isEvalCaseEditing.set(!0),this.dialog.open(jI,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Edit function arguments",functionName:e.functionCall.name,jsonContent:e.functionCall.args}}).afterClosed().subscribe(t=>{this.isEvalCaseEditing.set(!1),t&&(this.hasEvalCaseChanged.set(!0),e.functionCall.args=t,this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].intermediateData.toolUses[e.toolUseIndex].args=t)})}saveEvalCase(){this.evalService.updateEvalCase(this.appName,this.evalSetId,this.updatedEvalCase.evalId,this.updatedEvalCase).subscribe(e=>{this.openSnackBar("Eval case updated","OK"),this.resetEditEvalCaseVars()})}cancelEditEvalCase(){this.resetEditEvalCaseVars(),this.updateWithSelectedEvalCase(this.evalCase)}resetEditEvalCaseVars(){this.hasEvalCaseChanged.set(!1),this.isEvalCaseEditing.set(!1),this.isEvalEditMode.set(!1),this.updatedEvalCase=null}cancelEditMessage(e){e.isEditing=!1,this.isEvalCaseEditing.set(!1)}saveEditMessage(e){this.hasEvalCaseChanged.set(!0),this.isEvalCaseEditing.set(!1),e.isEditing=!1,e.text=this.userEditEvalCaseMessage?this.userEditEvalCaseMessage:" ",this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts[e.finalResponsePartIndex]={text:this.userEditEvalCaseMessage},this.userEditEvalCaseMessage=""}handleKeydown(e,A){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),this.saveEditMessage(A)):e.key==="Escape"&&this.cancelEditMessage(A)}deleteEvalCaseMessage(e,A){this.hasEvalCaseChanged.set(!0),this.uiEvents.update(t=>t.filter((n,o)=>o!==A)),this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts.splice(e.finalResponsePartIndex,1)}editEvalCase(){this.isEvalEditMode.set(!0),this.isViewOnlySession.set(!1)}deleteEvalCase(){let e={title:"Confirm delete",message:`Are you sure you want to delete ${this.evalCase.evalId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(dc,{width:"600px",data:e}).afterClosed().subscribe(t=>{t&&(this.evalTab()?.deleteEvalCase(this.evalCase.evalId),this.openSnackBar("Eval case deleted","OK"))})}onNewSessionClick(){this.resetToNewSession(),this.eventData.clear(),this.uiEvents.set([]),this.artifacts=[],this.traceData=[],this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0,this.traceService.resetTraceService(),this.chatPanel()?.focusInput(),this.evalTab()?.showEvalHistory&&this.evalTab()?.toggleEvalHistoryButton()}getToolbarSessionId(){if(!this.sessionId)return"NEW SESSION";if(this.isViewOnlySession())return this.sessionId;let e=this.currentSessionState?.__session_metadata__;return e?.displayName?e.displayName:this.sessionId}getCurrentSessionDisplayName(){return this.sessionId?this.currentSessionState?.__session_metadata__?.displayName||this.sessionId:"NEW SESSION"}copySessionId(){return Ie(this,null,function*(){if(this.sessionId)try{yield navigator.clipboard.writeText(this.sessionId),this.openSnackBar(this.i18n.sessionIdCopiedMessage,"OK")}catch(e){this.openSnackBar(this.i18n.copySessionIdFailedMessage,"OK")}})}saveSessionName(e){if(!this.sessionId)return;let A={__session_metadata__:Oe(oA({},this.currentSessionState?.__session_metadata__||{}),{displayName:e})};this.currentSessionState=oA(oA({},this.currentSessionState),A),this.updatedSessionState.set(oA(oA({},this.updatedSessionState()),A)),this.sessionService.updateSession(this.userId,this.appName,this.sessionId,{stateDelta:A}).subscribe({next:()=>{this.sessionTab&&this.sessionTab.reloadSession(this.sessionId),this.drawerSessionTab()&&this.drawerSessionTab().reloadSession(this.sessionId)}})}get sessionDisplayNameDraft(){return this.currentSessionState?.__session_metadata__?.displayName||""}saveUserId(e){if(e=e.trim(),!e){this.openSnackBar(this.i18n.invalidUserIdMessage,"OK");return}this.userId=e,this.isSessionUrlEnabledObs.pipe(po(1)).subscribe(A=>{A&&this.updateSelectedSessionUrl()})}onFileSelect(e){let A=e.target;if(A.files)for(let t=0;t{e&&this.canvasComponent()?.loadFromYaml(e,this.appName)},error:e=>{console.error("Error loading agent configuration:",e),this.openSnackBar("Error loading agent configuration","OK")}})}exitBuilderMode(){let e=this.router.createUrlTree([],{queryParams:{mode:null},queryParamsHandling:"merge"}).toString();this.location.replaceState(e),this.isBuilderMode.set(!1),this.agentBuilderService.clear()}toggleBuilderAssistant(){this.showBuilderAssistant=!this.showBuilderAssistant}openAddItemDialog(){this.apps$.pipe(po(1)).subscribe(e=>{let A=this.dialog.open(Dm,{width:"600px",data:{existingAppNames:e??[]}})})}eventGraphSvgLight={};eventGraphSvgDark={};selectedEventGraphPath="";showAgentStructureOverlay=!1;agentStructureOverlayMode="session";openAgentStructureGraphDialog(e="session"){this.agentStructureOverlayMode=e,this.showAgentStructureOverlay=!0}saveAgentBuilder(){this.canvasComponent()?.saveAgent(this.appName)}onEventTabDrillDown(e){this.updateRenderedGraph(void 0,e)}updateRenderedGraph(e,A){return Ie(this,null,function*(){let t=this.sessionGraphSvgLight,n=this.sessionGraphSvgDark;if(Object.keys(t).length===0||Object.keys(n).length===0){this.renderedEventGraph=void 0;return}let o=e||this.selectedEvent?.nodeInfo?.path;!e&&this.selectedEvent?.author==="user"&&(o="__START__");let a=o;o&&o!=="__START__"&&(a=o.split("/").map(m=>m.split("@")[0]).join("/"));let r=A!==void 0?A:"",s="";if(a&&A===void 0){let m=a.split("/");if(s=m[m.length-1],m.length>=2&&m[m.length-1]==="call_llm"&&m[m.length-2]===this.selectedEvent?.author?(s=m[m.length-2],r=m.slice(1,-2).join("/")):r=m.slice(1,-1).join("/"),r&&!(r in t&&!(r in this.dynamicGraphDot))){let S=this.tryGenerateDynamicGraph(r);if(S&&this.dynamicGraphDot[r]!==S)try{let k=yield this.graphService.render(S);this.sessionGraphSvgLight[r]=k,this.sessionGraphSvgDark[r]=k,this.dynamicGraphDot[r]=S}catch(k){console.error("Failed to render dynamic graph",k)}}for(;r&&!(r in t);){let v=r.split("/");v.pop(),r=v.join("/")}}let l=this.sessionGraphDot[r]||this.sessionGraphDot[""]||"",g=l,C=!1;if(this.selectedEvent){let m=this.getV1HighlightPairs(this.selectedEvent);for(let[v,S]of m)if(v&&S&&S===this.selectedEvent.author){let k=new RegExp(`("${S}"|${S})\\s*->\\s*("${v}"|${v})`,"g");k.test(l)&&(g=l.replace(k,"$& [dir=back]"),C=!0)}}let I="",B="";if(C)try{I=yield this.graphService.render(g),B=I}catch(m){console.error("Failed to render modified graph",m),I=t[r]||t[""]||"",B=n[r]||n[""]||""}else I=t[r]||t[""]||"",B=n[r]||n[""]||"";if(this.selectedEvent){let m=this.getV1HighlightPairs(this.selectedEvent);m.length>0&&(I=this.applyV1Highlighting(I,m,!1),B=this.applyV1Highlighting(B,m,!0))}let Q=[],h=[];if(this.selectedEventIndex!==void 0){let m=Array.from(this.eventData.values()),S=m[this.selectedEventIndex]?.invocationId;for(let k=0;kz.split("@")[0]).join("/")),F){let z=F.split("/"),P=z[z.length-1],Z="";z.length>=2&&z[z.length-1]==="call_llm"&&z[z.length-2]===M.author?(P=z[z.length-2],Z=z.slice(1,-2).join("/")):Z=z.slice(1,-1).join("/");let AA=r in this.dynamicGraphDot,W=x?x.split("/"):[],CA=W.length>0?W[W.length-1]:"",wA=AA?CA:P;Z===r&&(k<=this.selectedEventIndex&&(Q.length===0||Q[Q.length-1]!==wA)&&Q.push(wA),(h.length===0||h[h.length-1]!==wA)&&h.push(wA))}}}if(this.selectedEvent){let m=this.getV1HighlightPairs(this.selectedEvent);for(let[v,S]of m)S&&S!==""&&(h.includes(S)||h.push(S),Q.includes(S)||Q.push(S)),v&&v!==""&&(h.includes(v)||h.push(v),Q.includes(v)||Q.push(v))}h.length>0&&I&&B&&(I=this.highlightExecutionPathInSvg(I,Q,h,"light"),B=this.highlightExecutionPathInSvg(B,Q,h,"dark")),this.selectedEventGraphPath=r,this.eventGraphSvgLight=Oe(oA({},t),{[r]:I}),this.eventGraphSvgDark=Oe(oA({},n),{[r]:B});let f=this.themeService.currentTheme()==="dark"?B:I;this.rawSvgString=f,this.renderedEventGraph=this.safeValuesService.bypassSecurityTrustHtml(f),this.changeDetectorRef.detectChanges()})}tryGenerateDynamicGraph(e){let A=Array.from(this.eventData.values()),t=[];for(let l of A){let g=l.nodeInfo?.path;if(!g)continue;let C=g.split("/"),I=C.map(Q=>Q.split("@")[0]),B="";if(I.length>=2&&I[I.length-1]==="call_llm"&&I[I.length-2]===l.author?B=I.slice(1,-2).join("/"):B=I.slice(1,-1).join("/"),B===e){let Q=C[C.length-1];t.push({run:Q,branch:l.branch})}}if(t.length===0)return null;let n=new Set,o=new Map;for(let l of t)n.add(l.run),l.branch&&o.set(l.run,l.branch);if(n.size===0)return null;let a=`digraph G { +`;a+=` rankdir=TB; +`,a+=` node [shape=box, style=filled, fillcolor="#e6f4ea", color="#34a853"]; +`,a+=` "START" [shape=ellipse, style=filled, fillcolor="#fce8e6", color="#ea4335"]; +`;let r=new Map;for(let l of n){let g=l.split("@")[0];r.has(g)||r.set(g,[]),r.get(g).push(l)}for(let[l,g]of Array.from(r.entries())){a+=` subgraph cluster_${l} { +`,a+=` label="${l}"; +`,a+=` style=dashed; +`,a+=` color="#b0b0b0"; +`;for(let C of g){let I=C.split("@")[1]||"";a+=` "${C}" [label="@${I}"]; +`}a+=` } +`}let s=new Set;for(let l of n){let g=o.get(l);if(g){let C=g.split(".");if(C.length>=2){let I=C[C.length-2],B=C[C.length-1];s.add(`"${I}" -> "${B}"`)}else C.length===1&&s.add(`"START" -> "${C[0]}"`)}else s.add(`"START" -> "${l}"`)}for(let l of s)a+=` ${l}; +`;return a+="}",a}highlightExecutionPathInSvg(e,A,t,n="light"){if(!t||t.length===0)return e;let a=new DOMParser().parseFromString(e,"image/svg+xml"),r=new Map,s=new Map,l=a.querySelectorAll("g.edge");l.forEach(Z=>{let W=Z.querySelector("title")?.textContent?.trim()||"";if(W.includes("->")){let CA=W.split("->"),wA=CA[0].trim().replace(/^"|"$/g,""),BA=CA[1].trim().replace(/^"|"$/g,"");r.has(BA)||r.set(BA,[]),r.get(BA).push(wA),s.has(wA)||s.set(wA,[]),s.get(wA).push(BA)}});let g=new Map,C=a.querySelectorAll("g.node");C.forEach(Z=>{let W=Array.from(Z.querySelectorAll("text")).map(QA=>QA.textContent?.trim()||"").join(""),wA=Z.querySelector("title")?.textContent?.trim()||"",BA=wA.replace(/^"|"$/g,"");g.set(W,BA),wA&&g.set(wA,BA)});let I=Z=>{let AA=Z.toLowerCase();for(let[W,CA]of g.entries()){let wA=W.toLowerCase().replace(/\s+/g,"_");if(wA===AA||wA===`"${AA}"`)return CA}for(let[W,CA]of g.entries())if(W.toLowerCase().replace(/\s+/g,"_").includes(AA))return CA;return null},B=A.map(Z=>I(Z)).filter(Z=>Z),Q=t.map(Z=>I(Z)).filter(Z=>Z),{visitedNodes:h,visitedEdges:f}=this.calculateVisitedPath(B,r),{visitedNodes:m}=this.calculateVisitedPath(Q,r),v=this.calculateEdgeCounts(B,h,f,s),S=n==="dark"?"#34a853":"#a1c2a1",k=n==="dark"?"#ceead6":"#0d652d",M=n==="dark"?"#137333":"#a6d8b5",x=n==="dark"?"#34a853":"#a1c2a1",F=n==="dark"?"#0d652d":"#e6f4ea",z=null,P=B[B.length-1];if(B.length>0&&P){let Z=[...B],AA=Array.from(h).find(CA=>CA.toLowerCase()==="__start__");Z.length>0&&Z[0].toLowerCase()!=="__start__"&&AA&&Z.unshift(AA);let W=Z.lastIndexOf(P);if(W>0){let CA=Z[W-1],wA=Z[W],BA=[],QA=new Set,RA=s.get(CA)||[];for(let IA of RA){let dA=`${CA}->${IA}`;f.has(dA)&&(BA.push({node:IA,path:[dA]}),QA.add(IA))}for(;BA.length>0;){let IA=BA.shift();if(IA.node===wA){IA.path.length>0&&(z=IA.path[IA.path.length-1]);break}let dA=s.get(IA.node)||[];for(let _A of dA){let VA=`${IA.node}->${_A}`;f.has(VA)&&!QA.has(_A)&&(QA.add(_A),BA.push({node:_A,path:[...IA.path,VA]}))}}}}return l.forEach(Z=>{let W=Z.querySelector("title")?.textContent?.trim()||"";if(W.includes("->")){let CA=W.split("->"),wA=CA[0].trim().replace(/^"|"$/g,""),BA=CA[1].trim().replace(/^"|"$/g,""),QA=`${wA}->${BA}`;if(f.has(QA)){let RA=QA===z,IA=Z.querySelector("path");IA&&(IA.setAttribute("stroke",RA?k:S),IA.setAttribute("stroke-width",RA?"4":"2"));let dA=Z.querySelector("polygon");dA&&(dA.setAttribute("fill",RA?k:S),dA.setAttribute("stroke",RA?k:S));let _A=v.get(QA)||0;if(_A>1){let VA=Z.querySelector("text");if(VA)VA.textContent=`${VA.textContent} (${_A}x)`,VA.setAttribute("fill",n==="dark"?"#ffffff":"#000000"),VA.setAttribute("font-weight","bold");else if(IA){let HA=[...(IA.getAttribute("d")||"").matchAll(/[-+]?[0-9]*\.?[0-9]+/g)];if(HA.length>=4){let vA=HA.map(XA=>parseFloat(XA[0])),PA=(vA[0]+vA[vA.length-2])/2,et=(vA[1]+vA[vA.length-1])/2,We=a.createElementNS("http://www.w3.org/2000/svg","g"),OA=a.createElementNS("http://www.w3.org/2000/svg","rect");OA.setAttribute("x",(PA-14).toString()),OA.setAttribute("y",(et-10).toString()),OA.setAttribute("width","28"),OA.setAttribute("height","20"),OA.setAttribute("rx","4"),OA.setAttribute("fill",n==="dark"?"#0d652d":"#e6f4ea"),OA.setAttribute("stroke",S),OA.setAttribute("stroke-width","1"),We.appendChild(OA);let EA=a.createElementNS("http://www.w3.org/2000/svg","text");EA.setAttribute("x",PA.toString()),EA.setAttribute("y",(et+4).toString()),EA.setAttribute("text-anchor","middle"),EA.setAttribute("fill",n==="dark"?"#ffffff":"#000000"),EA.setAttribute("font-size","12px"),EA.setAttribute("font-weight","bold"),EA.textContent=_A.toString()+"x",We.appendChild(EA),Z.appendChild(We)}}}}}}),C.forEach(Z=>{let AA=Z.querySelector("title"),W=AA?.textContent?.trim().replace(/^"|"$/g,"")||"";if(h.has(W)){let CA=Z.querySelector("ellipse, polygon, path, rect");if(CA){let wA=W===P||W.toLowerCase()==="__end__";CA.setAttribute("stroke",wA?k:x),CA.setAttribute("fill",wA?M:F),CA.setAttribute("stroke-width",wA?"4":"2")}}if(!m.has(W)){Z.classList.add("unvisited-node");let CA=Z.querySelector("ellipse, polygon, path, rect");if(CA){CA.setAttribute("stroke",n==="dark"?"#666666":"#b0b0b0"),CA.setAttribute("fill",n==="dark"?"#424242":"#e0e0e0");let QA=a.createElementNS("http://www.w3.org/2000/svg","title");QA.textContent="Not run in this invocation",CA.appendChild(QA)}if(Z.querySelectorAll("text").forEach(QA=>{QA.setAttribute("fill",n==="dark"?"#888888":"#757575");let RA=a.createElementNS("http://www.w3.org/2000/svg","title");RA.textContent="Not run in this invocation",QA.appendChild(RA)}),AA)AA.textContent="Not run in this invocation";else{let QA=a.createElementNS("http://www.w3.org/2000/svg","title");QA.textContent="Not run in this invocation",Z.appendChild(QA)}Z.querySelectorAll("a").forEach(QA=>{QA.setAttribute("title","Not run in this invocation"),QA.setAttributeNS("http://www.w3.org/1999/xlink","title","Not run in this invocation")})}}),new XMLSerializer().serializeToString(a)}getV1HighlightPairs(e){let A=[],t=e.content?.parts?.filter(o=>o.functionCall)||[],n=e.content?.parts?.filter(o=>o.functionResponse)||[];if(t.length>0)for(let o of t)o.functionCall?.name&&e.author&&A.push([e.author,o.functionCall.name]);else if(n.length>0)for(let o of n)o.functionResponse?.name&&e.author&&A.push([o.functionResponse.name,e.author]);else e.author&&A.push([e.author,""]);return A}applyV1Highlighting(e,A,t){let o=new DOMParser().parseFromString(e,"image/svg+xml"),a="#0F5223",r="#69CB87",s=t?"#cccccc":"#000000",l=new Set;for(let[I,B]of A)I&&l.add(I),B&&l.add(B);return o.querySelectorAll("g.node").forEach(I=>{let Q=I.querySelector("title")?.textContent?.trim().replace(/^"|"$/g,"")||"",h=Array.from(I.querySelectorAll("text")),f=h.map(v=>v.textContent?.trim()||"").join("").toLowerCase().replace(/\s+/g,"_"),m=l.has(Q);if(!m)for(let v of l){let S=v.toLowerCase().replace(/\s+/g,"_");if(f.includes(S)){m=!0;break}}if(m){let v=I.querySelector("ellipse, polygon, path, rect");v&&(v.setAttribute("fill",a),v.setAttribute("stroke",a)),h.forEach(S=>S.setAttribute("fill",s))}else h.forEach(v=>v.setAttribute("fill",s))}),o.querySelectorAll("g.edge").forEach(I=>{let Q=I.querySelector("title")?.textContent?.trim()||"";if(Q.includes("->")){let[h,f]=Q.split("->"),m=h.trim().replace(/^"|"$/g,""),v=f.trim().replace(/^"|"$/g,"");for(let[S,k]of A)if(m===S&&v===k||m===k&&v===S){let M=I.querySelector("path");M&&M.setAttribute("stroke",r);let x=I.querySelector("polygon");x&&(x.setAttribute("stroke",r),x.setAttribute("fill",r));break}}}),new XMLSerializer().serializeToString(o)}calculateVisitedPath(e,A){let t=new Set(e),n=!0;for(;n;){n=!1;let a=Array.from(t);for(let r of a){let s=A.get(r)||[];if(s.length===1){let l=s[0];t.has(l)||(t.add(l),n=!0)}}}for(let[a,r]of A.entries())if(a.toLowerCase()==="__end__"){for(let s of r)if(t.has(s)){t.add(a);break}}let o=new Set;for(let a of t){if(a==="__start__")continue;let r=A.get(a)||[];if(r.length===1)o.add(`${r[0]}->${a}`);else if(r.length>1)for(let s of r)(t.has(s)||s==="__start__")&&o.add(`${s}->${a}`)}return{visitedNodes:t,visitedEdges:o}}calculateEdgeCounts(e,A,t,n){let o=new Map,a=[...e],r=Array.from(A).find(l=>l.toLowerCase()==="__start__"),s=Array.from(A).find(l=>l.toLowerCase()==="__end__");a.length>0&&a[0].toLowerCase()!=="__start__"&&r&&a.unshift(r),a.length>0&&s&&a[a.length-1].toLowerCase()!=="__end__"&&a.push(s);for(let l=0;l${f}`;t.has(m)&&(B.push({node:f,path:[m]}),Q.add(f))}for(;B.length>0;){let f=B.shift();if(f.node===C){I=f.path;break}let m=n.get(f.node)||[];for(let v of m){let S=`${f.node}->${v}`;t.has(S)&&!Q.has(v)&&(Q.add(v),B.push({node:v,path:[...f.path,S]}))}}if(I)for(let f of I)o.set(f,(o.get(f)||0)+1)}return o}selectEvent(e,A,t=!0){t&&(this.autoSelectLatestEvent=!1),this.traceService.selectedRow(void 0),this.selectedEvent=this.eventData.get(e),this.selectedEventIndex=this.getIndexOfKeyInMap(e),this.selectedMessageIndex=A!==void 0?A:this.uiEvents().findIndex(n=>n.event.id===e),t&&this.viewMode()!=="events"&&this.onViewModeChange("events"),this.chatPanel()?.scrollToSelectedMessage(this.selectedMessageIndex),this.populateLlmRequestResponse(),this.updateRenderedGraph()}populateLlmRequestResponse(){if(this.llmRequest=void 0,this.llmResponse=void 0,!this.selectedEvent)return;let e=this.traceData?.find(A=>A?.attributes?.["gcp.vertex.agent.event_id"]===this.selectedEvent.id&&A?.name==="call_llm");if(e){let A=e.attributes?.[this.llmRequestKey],t=e.attributes?.[this.llmResponseKey];if(A)try{this.llmRequest=typeof A=="string"?JSON.parse(A):A}catch(n){console.warn("Failed to parse LLM request",n)}if(t)try{this.llmResponse=typeof t=="string"?JSON.parse(t):t}catch(n){console.warn("Failed to parse LLM response",n)}}}deleteSession(e){let A={title:"Confirm delete",message:`Are you sure you want to delete this session ${this.sessionId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(dc,{width:"600px",data:A}).afterClosed().subscribe(n=>{n&&this.sessionService.deleteSession(this.userId,this.appName,e).subscribe(o=>{let a=this.sessionTab?.refreshSession(e);a?this.sessionTab?.getSession(a.id):window.location.reload()})})}syncSelectedAppFromUrl(){let e=this.activatedRoute.snapshot.queryParams.app;e&&(this.selectedAppControl.setValue(e,{emitEvent:!1}),this.selectApp(e)),dr([this.activatedRoute.queryParams,this.apps$]).subscribe(([A,t])=>{let n=A.app;if(t&&t.length&&n){if(!t.includes(n)){this.openSnackBar(`Agent '${n}' not found`,"OK");return}n!==this.appName&&(this.selectedAppControl.setValue(n,{emitEvent:!1}),this.selectApp(n)),this.agentService.getAppInfo(n).subscribe(o=>{setTimeout(()=>{this.agentGraphData.set(o),this.agentReadme=o?.readme||""})}),this.sessionGraphSvgLight={},this.sessionGraphSvgDark={},this.dynamicGraphDot={},setTimeout(()=>this.graphsAvailable.set(!0)),this.agentService.getAppGraphImage(n,!1).pipe(qo(o=>(console.error("Error fetching light mode graphs:",o),this.graphsAvailable.set(!1),ie(null)))).subscribe({next:o=>Ie(this,null,function*(){try{if(o){console.log("Light mode graph response:",o),this.sessionGraphSvgLight={},this.dynamicGraphDot={};for(let[a,r]of Object.entries(o))if(r?.dotSrc){let l=a.split("/").map(C=>C.split("@")[0]).join("/").split("/"),g=l.length>1?l.slice(1).join("/"):l[0]==="root_agent"||l[0]===n?"":l[0];this.sessionGraphDot[g]=r.dotSrc,this.sessionGraphSvgLight[g]=yield this.graphService.render(r.dotSrc)}console.log("sessionGraphSvgLight after rendering:",Object.keys(this.sessionGraphSvgLight)),console.log("graphsAvailable:",this.graphsAvailable()),this.selectedEvent&&this.selectedEventIndex!==void 0&&this.updateRenderedGraph()}}catch(a){console.error("Error rendering light mode graphs:",a),setTimeout(()=>this.graphsAvailable.set(!1))}}),error:o=>{console.error("Error fetching light mode graphs:",o),setTimeout(()=>this.graphsAvailable.set(!1))}}),this.agentService.getAppGraphImage(n,!0).pipe(qo(o=>(console.error("Error fetching dark mode graphs:",o),ie(null)))).subscribe({next:o=>Ie(this,null,function*(){try{if(o){this.sessionGraphSvgDark={};for(let[a,r]of Object.entries(o))if(r?.dotSrc){let l=a.split("/").map(C=>C.split("@")[0]).join("/").split("/"),g=l.length>1?l.slice(1).join("/"):l[0]==="root_agent"||l[0]===n?"":l[0];this.sessionGraphSvgDark[g]=yield this.graphService.render(r.dotSrc)}this.selectedEvent&&this.selectedEventIndex!==void 0&&this.updateRenderedGraph()}}catch(a){console.error("Error rendering dark mode graphs:",a),setTimeout(()=>this.graphsAvailable.set(!1))}}),error:o=>{console.error("Error fetching dark mode graphs:",o),setTimeout(()=>this.graphsAvailable.set(!1))}}),this.agentService.getAgentBuilder(n).pipe(qo(o=>(setTimeout(()=>this.disableBuilderSwitch=!0),this.agentBuilderService.setLoadedAgentData(void 0),ie("")))).subscribe(o=>{!o||o==""?(setTimeout(()=>this.disableBuilderSwitch=!0),this.agentBuilderService.setLoadedAgentData(void 0)):(setTimeout(()=>this.disableBuilderSwitch=!1),this.agentBuilderService.setLoadedAgentData(o))}),this.isBuilderMode.set(!1)}A.mode==="builder"&&this.enterBuilderMode()})}updateSelectedAppUrl(){this.selectedAppControl.valueChanges.pipe(ug(),Ct(Boolean)).subscribe(e=>{this.selectApp(e);let A=this.activatedRoute.snapshot.queryParams.app;e!==A&&this.router.navigate([],{queryParams:{app:e,mode:null},queryParamsHandling:"merge"})})}updateSelectedSessionUrl(){let e=this.chatType(),A={userId:this.userId};switch(A.session=null,A.evalCase=null,A.evalResult=null,A.file=null,e){case"session":A.session=this.sessionId;break;case"eval-case":A.evalCase=`${this.evalSetId}/${this.evalCase?.evalId}`;break;case"eval-result":A.evalResult=`${this.evalSetId}/${this.currentEvalCaseId}/${this.currentEvalTimestamp}`;break;case"file":A.file=this.readonlySessionName();break}let t=this.router.createUrlTree([],{queryParams:A,queryParamsHandling:"merge"}).toString();this.location.replaceState(t)}clearSessionUrl(){this.isSessionUrlEnabledObs.pipe(to()).subscribe(e=>{if(e){let A=this.router.createUrlTree([],{queryParams:{session:null},queryParamsHandling:"merge"}).toString();this.location.replaceState(A)}})}handlePageEvent(e){if(e.pageIndex>=0){let A=this.getKeyAtIndexInMap(e.pageIndex);A&&(this.selectEvent(A),setTimeout(()=>{let t=this.uiEvents().findIndex(n=>n.event.id===A);if(t!==-1){let n=this.chatPanel()?.scrollContainer?.nativeElement;if(!n)return;let o=n.querySelectorAll(".message-row-container");o&&o[t]&&o[t].scrollIntoView({behavior:"smooth",block:"nearest",inline:"nearest"})}},0))}}closeSelectedEvent(){this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0}handleEscapeKey(e){e.key==="Escape"&&this.selectedEvent&&(e.preventDefault(),this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0)}getIndexOfKeyInMap(e){let A=0,t=(o,a)=>0,n=Array.from(this.eventData.keys()).sort(t);for(let o of n){if(o===e)return A;A++}}getKeyAtIndexInMap(e){let A=(n,o)=>0,t=Array.from(this.eventData.keys()).sort(A);if(e>=0&&e{console.log(e);let t=(e.state?.__session_metadata__||this.currentSessionState?.__session_metadata__)?.displayName,n=t&&t.trim()?`${t.trim().replace(/[/\\?%*:|"<>]/g,"_")}.json`:`session-${this.sessionId}.json`;this.downloadService.downloadObjectAsJson(e,n)})}updateState(){this.dialog.open(jI,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Update state",jsonContent:this.currentSessionState}}).afterClosed().subscribe(A=>{A&&this.updatedSessionState.set(A)})}removeStateUpdate(){this.updatedSessionState.set(null)}importSession(){let e=document.createElement("input");e.type="file",e.accept="application/json",e.onchange=()=>{if(!e.files||e.files.length===0)return;let A=e.files[0],t=new FileReader;t.onload=n=>{if(n.target?.result)try{let o=JSON.parse(n.target.result);if(!o.events||o.events.length===0){this.openSnackBar("Invalid session file: no events found","OK");return}if(o.appName&&o.appName!==this.appName){let a={title:"App name mismatch",message:`The session file was exported from app "${o.appName}" but the current app is "${this.appName}". Do you want to import it anyway?`,confirmButtonText:"Import",cancelButtonText:"Cancel"};this.dialog.open(dc,{width:"600px",data:a}).afterClosed().subscribe(s=>{s&&this.doImportSession(o)})}else this.doImportSession(o)}catch(o){this.openSnackBar("Error parsing session file","OK")}},t.readAsText(A)},e.click()}viewSession(){let e=document.createElement("input");e.type="file",e.accept="application/json",e.onchange=()=>{if(!e.files||e.files.length===0)return;let A=e.files[0],t=new FileReader;t.onload=n=>{if(n.target?.result)try{let o=JSON.parse(n.target.result);if(!o.events||o.events.length===0){this.openSnackBar("Invalid session file: no events found","OK");return}this.doViewSession(o,A.name)}catch(o){this.openSnackBar("Error parsing session file","OK")}},t.readAsText(A)},e.click()}doViewSession(e,A){let t=e.appName;t&&t!==this.appName?this.apps$.pipe(po(1)).subscribe(n=>{n?.includes(t)?this.router.navigate([],{queryParams:{app:t},queryParamsHandling:"merge"}).then(()=>{this.openSnackBar(`Switched to app '${t}'`,"OK"),this.performViewSessionLoading(e,A)}):(this.isLoadedAppUnavailable.set(!0),this.unavailableAppName.set(t),this.performViewSessionLoading(e,A))}):this.performViewSessionLoading(e,A)}performViewSessionLoading(e,A){this.traceService.resetTraceService(),this.traceData=[],this.isViewOnlySession()||(this.originalSessionId=this.sessionId),this.readonlySessionType.set("File"),this.readonlySessionName.set(A),this.sessionId=`File: ${A}`,this.currentSessionState=e.state||{},this.evalCase=null,this.chatType.set("session"),this.updateSelectedSessionUrl(),this.showSessionSelectorDrawer=!1,this.resetEventsAndMessages(),this.isViewOnlySession.set(!0),this.canEditSession.set(!1),this.chatPanel()?.canEditSession?.set(!1);let t=!!(e.appName&&e.appName!==this.appName);this.isViewOnlyAppNameMismatch.set(t),e.events&&e.events.forEach(n=>{this.appendEventRow(n,!1)}),this.changeDetectorRef.detectChanges()}closeReadonlySession(){this.isViewOnlySession.set(!1),this.readonlySessionType.set(""),this.readonlySessionName.set(""),this.evalCase=null,this.router.navigate([],{queryParams:{session:null,evalCase:null,evalResult:null,file:null},queryParamsHandling:"merge"}),this.createSessionAndReset(),this.originalSessionId=""}doImportSession(e){let A=Date.now()/1e3,t=e.events.map(n=>Oe(oA({},n),{timestamp:A}));this.sessionService.importSession(this.userId,this.appName,t,e.state).subscribe(n=>{this.openSnackBar(`Session imported successfully (ID: ${n.id})`,"OK"),this.sessionTab?.refreshSession(),this.showSessionSelectorDrawer=!1,this.updateWithSelectedSession(n)})}static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-chat"]],viewQuery:function(A,t){A&1&&Xr(t.chatPanel,X2,5)(t.canvasComponent,VE,5)(t.sideDrawer,qvA,5)(t.sidePanel,lh,5)(t.drawerSessionTab,VvA,5)(t.evalTab,Bc,5)(t.appSearchInput,WvA,5)(t.invChipMenuTrigger,ZvA,5)(t.nodeChipMenuTrigger,XvA,5)(t.addMenuTrigger,$vA,5),A&2&&Er(10)},hostBindings:function(A,t){A&1&&T("keydown",function(o){return t.handleEscapeKey(o)},mc)},features:[Et([{provide:Y1,useClass:_x}])],ngContentSelectors:ebA,decls:47,vars:16,consts:[["userMenu","matMenu"],["selectorDrawer",""],["sideDrawer",""],["appSearchInput",""],["drawerSessionTab",""],["addFilterMenu","matMenu"],["invocationMenu","matMenu"],["nodePathMenu","matMenu"],["invChipMenuTrigger","matMenuTrigger"],["nodeChipMenuTrigger","matMenuTrigger"],["addMenuTrigger","matMenuTrigger"],[1,"app-toolbar"],[1,"toolbar-group","toolbar-agent-group"],["mat-icon-button","","aria-label","Toggle side panel",1,"toolbar-icon-button",3,"click"],[1,"toolbar-logo"],[1,"selector-group"],["matTooltip","Select an app",1,"selector-button",3,"click"],["fontSet","material-symbols-outlined"],[1,"selector-label"],["color","warn","matTooltip","The app for the loaded file is not available",2,"margin-left","4px"],["fontSet","material-symbols-outlined",1,"selector-caret"],[1,"toolbar-group","toolbar-session-group"],["mat-icon-button","","matTooltip","User","aria-label","User menu",1,"toolbar-icon-button","user-avatar-button",3,"matMenuTriggerFor"],["xPosition","before","panelClass","user-avatar-menu"],[1,"user-menu-panel",3,"click"],[1,"user-menu-header"],[1,"user-menu-label"],[2,"flex","1"],["mat-icon-button","","matTooltip","Reset to default user",1,"small-icon-button",3,"click"],[1,"user-menu-content"],["textClass","user-menu-id",3,"save","value","placeholder"],["autosize","",1,"drawer-container"],["mode","over","position","start",1,"selector-drawer",3,"closedStart","opened","autoFocus"],["autosize","",1,"side-panel-container"],["mode","side","appResizableDrawer","",1,"side-drawer"],[3,"isApplicationSelectorEnabledObs","showSidePanel","appName","userId","sessionId","isViewOnlySession","isViewOnlyAppNameMismatch","traceData","eventData","currentSessionState","artifacts","selectedEvent","selectedEventIndex","renderedEventGraph","rawSvgString","selectedEventGraphPath","llmRequest","llmResponse","disableBuilderIcon","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab"],[1,"builder-mode-container"],[1,"chat-container"],[3,"appName","preloadedAppData","preloadedLightGraphSvg","preloadedDarkGraphSvg","startPath"],[4,"ngComponentOutlet"],["src","assets/ADK-512-color.svg","width","20px","height","20px"],[1,"logo-title-container"],[1,"logo-text-wrapper"],[1,"toolbar-logo-text","logo-wide"],[1,"toolbar-logo-text","logo-wide",2,"color","var(--mat-sys-outline)"],[1,"custom-tooltip"],[1,"tooltip-desc"],[1,"tooltip-grid"],[1,"toolbar-logo-text","logo-narrow"],[1,"tooltip-item"],[1,"tooltip-label"],[1,"tooltip-value"],[1,"selector-group-divider"],["matTooltipPosition","below",3,"matTooltip"],["mat-icon-button","",1,"toolbar-icon-button",3,"click","disabled"],["mat-icon-button","","matTooltipPosition","below",1,"toolbar-icon-button",3,"click","disabled"],[1,"readonly-chip"],[1,"toolbar-content"],[2,"display","flex","align-items","center"],[1,"toolbar-actions"],["mat-icon-button","",1,"toolbar-icon-button",3,"matTooltip"],["fontSet","material-symbols-outlined",2,"font-size","18px","width","18px","height","18px","line-height","18px"],[1,"chip-label"],["mat-icon-button","","aria-label","Close readonly view",1,"chip-close-button",3,"click"],[2,"font-size","16px","width","16px","height","16px"],["matTooltip","Select a session",1,"selector-button",3,"click"],["id","toolbar-new-session-button",1,"selector-button","new-session-button",3,"matTooltip"],["id","toolbar-new-session-button",1,"selector-button","new-session-button","icon-only",3,"matTooltip"],["id","toolbar-new-session-button",1,"selector-button","new-session-button",3,"click","matTooltip"],["id","toolbar-new-session-button",1,"selector-button","new-session-button","icon-only",3,"click","matTooltip"],[1,"chip-value"],["mat-button","",2,"height","30px",3,"click"],["mat-flat-button","",2,"height","30px",3,"click","disabled"],[1,"toolbar-session-text"],["mat-icon-button","",1,"toolbar-icon-button",3,"click","matTooltip"],[1,"selector-drawer-header"],[1,"selector-drawer-title"],["mat-icon-button","","matTooltip","Create new agent","matTooltipPosition","below","aria-label","Create new agent",1,"toolbar-icon-button",3,"click"],["mat-icon-button","","aria-label","Close app selector",1,"toolbar-icon-button",3,"click"],[1,"app-selector-search"],["subscriptSizing","dynamic","appearance","outline",1,"app-selector-search-field"],["matPrefix",""],["matInput","","placeholder","Search apps...",3,"keydown","formControl"],[1,"app-selector-list",3,"keydown"],[1,"app-selector-loading"],["mode","indeterminate","diameter","32"],[1,"app-selector-item",3,"selected"],[1,"app-selector-empty"],[1,"app-selector-item",3,"click"],["fontSet","material-symbols-outlined",1,"app-selector-item-icon"],[1,"app-selector-item-name"],[1,"app-selector-check"],[2,"display","flex","gap","4px"],["mat-button","",1,"toolbar-button",3,"matTooltip"],["mat-button","",1,"toolbar-button",3,"click","matTooltip"],["mat-icon-button","","aria-label","Close session selector",1,"toolbar-icon-button",3,"click"],[1,"session-selector-current-id"],[1,"session-selector-drawer-content"],[3,"sessionSelected","sessionReloaded","userId","appName","sessionId"],[1,"session-selector-current-id-label"],[1,"session-selector-current-id-row"],["textClass","session-selector-current-id-value",3,"save","value","displayValue","tooltip"],[1,"session-selector-current-real-id-row",2,"display","flex","align-items","center","gap","4px"],[1,"session-selector-current-real-id-value",3,"title"],["mat-icon-button","","matTooltip","Copy session ID","aria-label","Copy session ID",1,"session-selector-action-button",3,"click"],["mat-button","",3,"matTooltip"],["mat-button","","color","warn",3,"matTooltip"],["mat-button","",3,"click","matTooltip"],["mat-button","","color","warn",3,"click","matTooltip"],[3,"jumpToInvocation","closePanel","tabChange","sessionSelected","evalCaseSelected","editEvalCaseRequested","testSelected","evalSetIdSelected","returnToSession","evalNotInstalled","page","closeSelectedEvent","openImageDialog","openAddItemDialog","enterBuilderMode","showAgentStructureGraph","switchToEvent","switchToTraceView","drillDownNodePath","selectEventById","isApplicationSelectorEnabledObs","showSidePanel","appName","userId","sessionId","isViewOnlySession","isViewOnlyAppNameMismatch","traceData","eventData","currentSessionState","artifacts","selectedEvent","selectedEventIndex","renderedEventGraph","rawSvgString","selectedEventGraphPath","llmRequest","llmResponse","disableBuilderIcon","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab"],[3,"exitBuilderMode","closePanel","appNameInput"],[1,"resize-handler"],[1,"builder-exit-button"],["mat-icon-button","","matTooltip","Accept",1,"builder-mode-action-button",3,"click"],["mat-icon-button","","matTooltip","Exit Builder Mode",1,"builder-mode-action-button",3,"click"],["mat-icon-button","","matTooltip","Builder Assistant",1,"builder-mode-action-button",3,"click"],[3,"toggleSidePanelRequest","builderAssistantCloseRequest","showSidePanel","showBuilderAssistant","appNameInput"],[1,"chat-card"],[1,"empty-state-container"],[1,"warning"],[1,"error"],[1,"chat-sub-toolbar"],[2,"font-weight","500","font-size","14px","color","var(--mat-sys-on-surface)"],[2,"flex-grow","1"],["mat-button","","matTooltip","Compare with expected",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"color"],["mat-button","","matTooltip","Group events from parallel nodes",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"color"],["mat-button","","matTooltip","Enable real-time token streaming from the server",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"color"],[3,"appName","agentReadme","userInput","hideIntermediateEvents","uiEvents","showBranches","traceData","isTokenStreamingEnabled","useSse","isChatMode","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"appName","agentReadme","hideIntermediateEvents","uiEvents","showBranches","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[1,"file-view-container",2,"padding","20px","display","flex","flex-direction","column","align-items","center","justify-content","center","height","100%"],["hideSingleSelectionIndicator","",3,"change","value"],["value","events"],["value","traces"],[1,"filter-bar-container",3,"click"],[1,"filter-chip",3,"matMenuTriggerFor","matTooltip"],["matTooltip","Hide intermediate events to only show final results",1,"filter-chip"],["matTooltip","Add a filter",1,"add-filter-btn",3,"matMenuTriggerFor"],["matTooltip","Clear all filters",1,"add-filter-btn"],[1,"filter-panel"],["mat-menu-item","","matTooltip","Filter events by a specific invocation","matTooltipPosition","right"],["mat-menu-item","","matTooltip","Filter events generated by a specific node","matTooltipPosition","right"],["mat-menu-item","","matTooltip","Hide intermediate events to only show final results","matTooltipPosition","right"],[1,"filter-panel",3,"closed"],["mat-menu-item","","matTooltipPosition","right",3,"matTooltip"],["mat-menu-item",""],[1,"filter-chip",3,"click","matMenuTriggerFor","matTooltip"],[1,"chip-label",3,"title"],[1,"chip-remove",3,"click"],["matTooltip","Hide intermediate events to only show final results",1,"filter-chip",3,"click"],["matTooltip","Add a filter",1,"add-filter-btn",3,"click","matMenuTriggerFor"],["matTooltip","Clear all filters",1,"add-filter-btn",3,"click"],["mat-menu-item","","matTooltip","Filter events by a specific invocation","matTooltipPosition","right",3,"click"],["mat-menu-item","","matTooltip","Filter events generated by a specific node","matTooltipPosition","right",3,"click"],["mat-menu-item","","matTooltip","Hide intermediate events to only show final results","matTooltipPosition","right",3,"click"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[2,"font-size","16px","width","16px","height","16px","margin-right","8px","color","var(--mat-sys-primary)"],["mat-menu-item","",3,"click"],["mat-button","","matTooltip","Compare with expected",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"click"],[2,"font-size","20px","width","20px","height","20px","line-height","20px","margin-right","4px","vertical-align","middle"],[2,"font-size","13px","font-weight","500","vertical-align","middle"],["mat-button","","matTooltip","Group events from parallel nodes",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"click"],["mat-button","","matTooltip","Enable real-time token streaming from the server",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"click"],[3,"userInputChange","toggleHideIntermediateEvents","toggleSse","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","fileSelect","removeFile","removeStateUpdate","sendMessage","updateState","toggleAudioRecording","toggleVideoRecording","longRunningResponseComplete","appName","agentReadme","userInput","hideIntermediateEvents","uiEvents","showBranches","traceData","isTokenStreamingEnabled","useSse","isChatMode","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"userInputChange","userEditEvalCaseMessageChange","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","appName","agentReadme","hideIntermediateEvents","uiEvents","showBranches","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[1,"eval-result-summary",2,"margin","0","padding","8px 24px","background","var(--mat-sys-surface-container)","border-bottom","1px solid var(--mat-sys-outline-variant)","display","flex","align-items","center"],[1,"side-by-side-layout"],[3,"appName","agentReadme","hideIntermediateEvents","uiEvents","showBranches","traceData","isChatMode","evalCase","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[2,"display","flex","gap","12px","align-items","center","flex-wrap","wrap"],[1,"metric-block",2,"position","relative","display","flex","flex-direction","column","gap","2px","background","var(--mat-sys-surface-container-high)","padding","6px 12px","border-radius","6px","flex-shrink","0","cursor","pointer",3,"border"],[1,"metric-block",2,"position","relative","display","flex","flex-direction","column","gap","2px","background","var(--mat-sys-surface-container-high)","padding","6px 12px","border-radius","6px","flex-shrink","0","cursor","pointer"],[2,"color","var(--mat-sys-on-surface-variant)","font-size","11px","font-weight","500"],[2,"display","flex","align-items","baseline","gap","4px"],[2,"font-size","16px","font-weight","600"],[2,"color","var(--mat-sys-on-surface-variant)","font-size","14px","font-weight","500"],[1,"metric-tooltip"],[1,"tooltip-title"],[1,"tooltip-subtitle",2,"font-size","10px","color","var(--mat-sys-on-surface-variant)","margin-bottom","4px"],[1,"tooltip-desc",2,"margin-top","8px","border-top","1px solid var(--mat-sys-outline-variant)","padding-top","6px","margin-bottom","0"],[1,"side-panel-half"],[1,"panel-header"],[3,"appName","agentReadme","hideIntermediateEvents","uiEvents","showBranches","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"toggleHideIntermediateEvents","toggleSse","userInputChange","userEditEvalCaseMessageChange","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","fileSelect","removeFile","removeStateUpdate","sendMessage","updateState","toggleAudioRecording","toggleVideoRecording","longRunningResponseComplete","appName","agentReadme","hideIntermediateEvents","uiEvents","showBranches","traceData","isTokenStreamingEnabled","useSse","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[2,"font-size","48px","width","48px","height","48px","color","var(--mat-sys-on-surface-variant)"],[2,"margin-top","16px"],[2,"color","var(--mat-sys-on-surface-variant)"],[3,"close","appName","preloadedAppData","preloadedLightGraphSvg","preloadedDarkGraphSvg","startPath"]],template:function(A,t){if(A&1&&(Nt(AbA),d(0,"mat-toolbar",11)(1,"div",12)(2,"button",13),T("click",function(){return t.toggleSidePanel()}),d(3,"mat-icon"),y(4,"menu"),E()(),d(5,"div",14),Y(6,nbA,1,1,"ng-container")(7,rbA,12,3),E(),d(8,"div",15)(9,"button",16),T("click",function(){return t.toggleAppSelectorDrawer()}),d(10,"mat-icon",17),y(11,"robot_2"),E(),d(12,"span",18),y(13),E(),Y(14,sbA,2,0,"mat-icon",19),d(15,"mat-icon",20),y(16,"arrow_drop_down"),E()(),Y(17,gbA,6,3),E()(),Y(18,vbA,10,5,"div",21),d(19,"button",22)(20,"mat-icon"),y(21,"account_circle"),E()(),d(22,"mat-menu",23,0)(24,"div",24),T("click",function(o){return o.stopPropagation()}),d(25,"div",25)(26,"span",26),y(27,"User ID"),E(),lA(28,"span",27),d(29,"button",28),T("click",function(){return t.saveUserId("user")}),d(30,"mat-icon"),y(31,"restart_alt"),E()()(),d(32,"div",29)(33,"app-inline-edit",30),T("save",function(o){return t.saveUserId(o)}),E()()()()(),d(34,"mat-drawer-container",31)(35,"mat-drawer",32,1),T("closedStart",function(){return t.onSelectorDrawerClosed()})("opened",function(){return t.onSelectorDrawerOpened()}),Y(37,xbA,20,4)(38,GbA,18,8),E(),d(39,"mat-drawer-container",33)(40,"mat-drawer",34,2),Y(42,KbA,1,23,"app-side-panel",35)(43,UbA,2,1),E(),Y(44,TbA,12,5,"div",36)(45,p7A,5,4,"div",37),E()(),Y(46,f7A,1,5,"app-agent-structure-graph-dialog",38)),A&2){let n=gi(23);u(6),O(t.logoComponent?6:7),u(7),iA(t.isLoadedAppUnavailable()?t.unavailableAppName():t.appName||"Select an app"),u(),O(t.isLoadedAppUnavailable()?14:-1),u(3),O(t.isBuilderMode()?-1:17),u(),O(t.appName?18:-1),u(),H("matMenuTriggerFor",n),u(14),H("value",t.userId)("placeholder",t.i18n.userIdInputPlaceholder),u(2),xA("match-side-panel-width",t.showSidePanel),H("opened",t.showAppSelectorDrawer||t.showSessionSelectorDrawer)("autoFocus",!1),u(2),O(t.showAppSelectorDrawer?37:t.showSessionSelectorDrawer?38:-1),u(5),O(t.isBuilderMode()?43:42),u(2),O(t.isBuilderMode()?44:45),u(2),O(t.showAgentStructureOverlay?46:-1)}},dependencies:[Ib,Wv,Bf,Zi,Cb,Yf,cn,yn,vn,xC,I1,zt,Si,vi,HC,ns,Ds,Hl,gf,qK,yc,To,Qa,os,X2,vm,lh,VE,Kw,Y5,j5,$r,b3,A1],styles:['.expand-side-drawer[_ngcontent-%COMP%]{position:relative;top:4%;left:1%}.chat-container[_ngcontent-%COMP%]{width:100%;height:100%;max-width:100%;margin:auto;display:flex;flex-direction:column;flex:1}.chat-container.side-by-side[_ngcontent-%COMP%]{max-width:100%}.side-by-side-layout[_ngcontent-%COMP%]{display:flex;flex-direction:row;width:100%;height:100%;flex:1;overflow:hidden;gap:16px;padding:16px;box-sizing:border-box}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;height:100%;min-width:0;background-color:var(--mat-sys-surface-container-low);border-radius:8px;overflow:hidden}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%] .panel-header[_ngcontent-%COMP%]{padding:6px 16px;font-size:14px;font-weight:600;color:var(--mat-sys-on-surface);border-bottom:1px solid var(--mat-sys-outline-variant)}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%] app-chat-panel[_ngcontent-%COMP%]{flex:1;overflow:hidden;display:flex;flex-direction:column}.event-container[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)}.chat-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;overflow:hidden;flex:1;min-height:12%;min-width:500px;box-shadow:none;border-radius:12px 0 0}.chat-card[_ngcontent-%COMP%] app-chat-panel[_ngcontent-%COMP%]{flex:1;min-height:0}.chat-card.no-side-panel[_ngcontent-%COMP%]{border-radius:0}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;margin-top:16px}.content-bubble[_ngcontent-%COMP%]{padding:5px 20px;margin:5px;border-radius:20px;max-width:80%;font-size:14px;font-weight:400;position:relative;display:inline-block}.function-event-button[_ngcontent-%COMP%]{margin:5px 5px 10px}.function-event-button-highlight[_ngcontent-%COMP%]{border-color:var(--mat-sys-primary)!important;color:var(--mat-sys-on-primary)!important}.role-user[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center}.role-user[_ngcontent-%COMP%] .content-bubble[_ngcontent-%COMP%]{align-self:flex-end;color:var(--mat-sys-on-primary-container);background-color:var(--mat-sys-primary-container);box-shadow:none}.role-bot[_ngcontent-%COMP%]{display:flex;align-items:center}.role-bot[_ngcontent-%COMP%] .content-bubble[_ngcontent-%COMP%]{align-self:flex-start;color:var(--mat-sys-on-surface);background-color:var(--mat-sys-surface-container-high);box-shadow:none}.role-bot[_ngcontent-%COMP%]:focus-within .content-bubble[_ngcontent-%COMP%]{border:1px solid var(--mat-sys-outline)}.message-textarea[_ngcontent-%COMP%]{max-width:100%;border:none;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}.content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--mat-sys-outline-variant);padding-right:8px;min-width:350px;max-width:350px}.content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}.content-bubble[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--mat-sys-outline-variant);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--mat-sys-tertiary)}.header-actual[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#2e7d32}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--mat-sys-error)}.navigation-button-sidepanel[_ngcontent-%COMP%]{margin-left:auto;margin-right:20px}.fab-button[_ngcontent-%COMP%]{position:fixed;bottom:200px;right:100px}.sidepanel-toggle[_ngcontent-%COMP%]{position:relative;top:100px}.side-drawer[_ngcontent-%COMP%]{color:var(--chat-side-drawer-color);border-radius:0}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.file-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:5px;padding:5px;border-radius:4px}.empty-state-container[_ngcontent-%COMP%]{color:var(--chat-empty-state-container-color);height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Google Sans,sans-serif;font-weight:400;letter-spacing:normal;line-height:24px;font-size:18px}.empty-state-container[_ngcontent-%COMP%] pre.warning[_ngcontent-%COMP%]{color:var(--chat-warning-color)}.empty-state-container[_ngcontent-%COMP%] pre.error[_ngcontent-%COMP%]{color:var(--chat-error-color)}.new-session-button[_ngcontent-%COMP%]{margin-top:0;width:130px;height:28px;font-size:14px}.adk-checkbox[_ngcontent-%COMP%]{position:fixed;bottom:0;left:0;right:0;margin-bottom:20px;margin-left:20px}.app-toolbar[_ngcontent-%COMP%]{height:48px;min-height:48px!important;display:flex;align-items:center;font-family:Google Sans,sans-serif;font-size:13px;padding:0 8px!important;z-index:1}.toolbar-group[_ngcontent-%COMP%]{display:flex;align-items:center;flex-shrink:0}.toolbar-agent-group[_ngcontent-%COMP%]{margin-right:6px}.toolbar-session-group[_ngcontent-%COMP%]{flex-shrink:1;min-width:0;flex:1}.toolbar-logo[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;margin-right:16px;flex-shrink:0}.toolbar-logo-text[_ngcontent-%COMP%]{font-family:Google Sans,sans-serif;font-size:14px;font-weight:500;white-space:nowrap}.disclosure-info-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;opacity:.7;cursor:pointer;margin-right:16px;color:var(--chat-toolbar-icon-color)}.toolbar-content[_ngcontent-%COMP%]{display:flex;align-items:center;flex:1;min-width:0}.drawer-container[_ngcontent-%COMP%]{height:calc(100% - 48px)}.side-panel-container[_ngcontent-%COMP%]{width:100%;height:100%}.toolbar-actions[_ngcontent-%COMP%]{margin-left:auto;display:flex;align-items:center;flex-shrink:0}.toolbar-session-text[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-text-color);font-family:Google Sans,sans-serif;font-size:13px;font-style:normal;font-weight:500;text-transform:uppercase;flex-shrink:0}.toolbar-session-id[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-id-color);font-family:Google Sans Mono,monospace;font-size:13px;margin-left:5px}.readonly-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;background-color:var(--mat-sys-primary-container)!important;color:var(--mat-sys-on-primary-container)!important;padding:4px 12px;border-radius:16px;font-size:13px;font-weight:500;gap:6px}.readonly-chip[_ngcontent-%COMP%] .chip-label[_ngcontent-%COMP%]{text-transform:uppercase;font-size:11px;font-weight:700;opacity:.9}.readonly-chip[_ngcontent-%COMP%] .chip-value[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.readonly-chip[_ngcontent-%COMP%] .chip-close-button[_ngcontent-%COMP%]{width:24px!important;height:24px!important;min-width:24px!important;padding:0!important;display:flex!important;align-items:center;justify-content:center;color:inherit!important;opacity:.8;margin-left:4px}.readonly-chip[_ngcontent-%COMP%] .chip-close-button[_ngcontent-%COMP%]:hover{opacity:1;background-color:#fff3!important}.toolbar-session-id-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-left:5px}.toolbar-session-id-container[_ngcontent-%COMP%] .toolbar-session-id[_ngcontent-%COMP%]{margin-left:0}.toolbar-icon-button[_ngcontent-%COMP%]{color:var(--chat-toolbar-icon-color);background:transparent!important;border:none!important;box-shadow:none!important}.toolbar-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.small-icon-button[_ngcontent-%COMP%]{width:28px!important;height:28px!important;min-width:28px!important;min-height:28px!important;padding:0!important}.small-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px!important;width:18px!important;height:18px!important}.toolbar-user-id-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-left:5px}.toolbar-user-id-input[_ngcontent-%COMP%]{width:140px;height:24px;border:1px solid var(--chat-toolbar-session-text-color);border-radius:4px;color:var(--chat-toolbar-session-id-color);padding:0 6px;font-family:Google Sans Mono,monospace;font-size:12px}.toolbar-user-id-input[_ngcontent-%COMP%]:focus{outline:1px solid var(--chat-toolbar-icon-color)}.user-avatar-button[_ngcontent-%COMP%]{margin-left:auto;flex-shrink:0}.user-avatar-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:24px;width:24px;height:24px}.user-menu-panel[_ngcontent-%COMP%]{padding:16px;min-width:240px}.user-menu-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin-bottom:12px}.user-menu-avatar-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px;color:var(--chat-toolbar-icon-color)}.user-menu-label[_ngcontent-%COMP%]{font-size:14px;font-weight:500;color:var(--chat-toolbar-session-text-color);text-transform:uppercase}.user-menu-content[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.user-menu-id[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:14px;color:var(--chat-toolbar-session-id-color);word-break:break-all}.user-menu-input[_ngcontent-%COMP%]{flex:1;height:28px;border:1px solid var(--chat-toolbar-session-text-color);border-radius:4px;color:var(--chat-toolbar-session-id-color);padding:0 8px;font-family:Google Sans Mono,monospace;font-size:13px;background:transparent}.user-menu-input[_ngcontent-%COMP%]:focus{outline:1px solid var(--chat-toolbar-icon-color)}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.readonly-badge[_ngcontent-%COMP%]{color:var(--mat-sys-on-primary-container)!important;background-color:var(--mat-sys-primary-container)!important;border-radius:16px;padding:4px 12px;display:flex;align-items:center;margin-left:8px;font-family:Google Sans,sans-serif;font-size:13px;line-height:18px;gap:4px;white-space:nowrap}.readonly-badge[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;flex-shrink:0}.readonly-session-message[_ngcontent-%COMP%]{display:block;color:var(--chat-toolbar-session-text-color);font-family:Google Sans,sans-serif;font-size:13px;margin-left:1em;font-weight:400;line-height:18px;letter-spacing:.3px;flex-shrink:1}.builder-mode-container[_ngcontent-%COMP%]{position:relative;width:100%;height:100vh;display:flex;flex-direction:column}.builder-exit-button[_ngcontent-%COMP%]{position:absolute;top:20px;right:20px;display:flex;gap:8px}.builder-mode-action-button[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color)!important;border-radius:50%!important;transition:all .2s ease!important;margin:0!important;padding:0!important;width:40px!important;height:40px!important;min-width:40px!important;min-height:40px!important;border:1px solid var(--builder-tool-item-border-color)!important;box-shadow:0 2px 4px #0000001a!important;display:flex!important;align-items:center!important;justify-content:center!important}.builder-mode-action-button[_ngcontent-%COMP%]:hover{box-shadow:0 4px 8px #00000026!important}.builder-mode-action-button.active[_ngcontent-%COMP%]{color:#fff!important;border-color:var(--builder-button-primary-background-color)!important}.builder-mode-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}app-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;flex:1!important;display:flex!important;flex-direction:column!important;min-height:0!important}.build-mode-container[_ngcontent-%COMP%]{display:flex;width:100%;height:100%}.build-left-panel[_ngcontent-%COMP%], .build-right-panel[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;border:1px solid var(--builder-border-color);margin:10px;border-radius:8px}.selector-group[_ngcontent-%COMP%]{display:flex;align-items:center;border-radius:6px;border:1px solid var(--mat-sys-outline-variant, #c4c7c5);margin-right:8px;flex-shrink:0;height:32px;overflow:hidden}.selector-group[_ngcontent-%COMP%] .toolbar-icon-button[_ngcontent-%COMP%]{width:32px;height:32px;padding:0;display:flex;align-items:center;justify-content:center;flex-shrink:0}.selector-group[_ngcontent-%COMP%] .toolbar-icon-button[_ngcontent-%COMP%] .mdc-icon-button__ripple{border-radius:4px;inset:1px}.selector-group[_ngcontent-%COMP%] .toolbar-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.selector-group-divider[_ngcontent-%COMP%]{width:1px;height:16px;background-color:var(--mat-sys-outline-variant, #c4c7c5);flex-shrink:0}.selector-button[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;padding:4px 12px;margin-right:1px;border-radius:6px;border:none;background:transparent;cursor:pointer;color:var(--chat-toolbar-icon-color);font-family:Google Sans,sans-serif;font-size:13px;font-weight:500;height:100%;flex-shrink:0;white-space:nowrap;width:auto;max-width:220px;overflow:hidden;transition:background-color .15s ease;position:relative;z-index:0}.selector-button[_ngcontent-%COMP%]:before{content:"";position:absolute;inset:1px;border-radius:4px;background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant));opacity:0;pointer-events:none;z-index:-1;transition:opacity .15s ease}.selector-button[_ngcontent-%COMP%]:hover:before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.selector-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0}.new-session-button[_ngcontent-%COMP%]{width:auto!important}.new-session-button.icon-only[_ngcontent-%COMP%]{width:32px!important;padding:0!important;justify-content:center}.selector-label[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;flex:1;text-align:left}.selector-caret[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0;margin-left:auto;opacity:.7}.selector-drawer-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:8px 8px 8px 20px;height:48px;flex-shrink:0}.selector-drawer-title[_ngcontent-%COMP%]{font-size:16px;font-weight:500;font-family:Google Sans,sans-serif}.selector-drawer[_ngcontent-%COMP%]{width:320px;background-color:var(--mat-sys-surface, #fff)}.selector-drawer[_ngcontent-%COMP%] .mat-drawer-inner-container{display:flex;flex-direction:column;height:100%;overflow:hidden}.selector-drawer.match-side-panel-width[_ngcontent-%COMP%]{width:var(--side-drawer-width)}.app-selector-search[_ngcontent-%COMP%]{padding:0 12px 4px;flex-shrink:0}.app-selector-search-field[_ngcontent-%COMP%]{width:100%;font-size:13px}.app-selector-search-field[_ngcontent-%COMP%] .mat-mdc-form-field-infix[_ngcontent-%COMP%]{min-height:36px;padding-top:6px!important;padding-bottom:6px!important}.app-selector-search-field[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-text-color);font-size:18px;width:18px;height:18px}.app-selector-list[_ngcontent-%COMP%]{flex:1;overflow-y:auto;padding:0 8px}.app-selector-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;border:none;background:transparent;cursor:pointer;border-radius:8px;font-family:Google Sans Mono,monospace;font-size:13px;color:var(--chat-toolbar-icon-color);text-align:left;transition:background-color .15s ease}.app-selector-item[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant, rgba(0, 0, 0, .04))}.app-selector-item.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, #d7e3f7);font-weight:500}.app-selector-item-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;flex-shrink:0;color:var(--chat-toolbar-session-text-color)}.app-selector-check[_ngcontent-%COMP%]{margin-left:auto;font-size:18px;width:18px;height:18px}.app-selector-item-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-selector-loading[_ngcontent-%COMP%]{display:flex;justify-content:center;padding:24px}.app-selector-empty[_ngcontent-%COMP%]{text-align:center;padding:24px;color:var(--chat-toolbar-session-text-color);font-style:italic}.session-selector-current-id[_ngcontent-%COMP%]{padding:8px 20px;border-bottom:1px solid var(--mat-sys-outline-variant, #c4c7c5)}.session-selector-current-id-label[_ngcontent-%COMP%]{font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.5px;color:var(--mat-sys-on-surface-variant, #444746)}.session-selector-current-id-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.session-selector-current-id-value[_ngcontent-%COMP%]{font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px;font-family:Google Sans,sans-serif;color:var(--mat-sys-on-surface, #1a1c20);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:0 1 auto;min-width:0}.session-selector-current-real-id-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.session-selector-current-real-id-value[_ngcontent-%COMP%]{font-size:11px;font-family:Google Sans Mono,monospace;color:var(--chat-toolbar-session-id-color);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:0 1 auto;min-width:0;opacity:.7}.session-selector-action-button[_ngcontent-%COMP%]{flex-shrink:0;width:28px!important;height:28px!important;padding:0!important}.session-selector-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}.session-selector-drawer-content[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.build-panel-header[_ngcontent-%COMP%]{padding:16px 20px;border-bottom:1px solid var(--builder-border-color);border-radius:8px 8px 0 0}.build-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--builder-text-primary-color);font-size:16px;font-weight:500;font-family:Google Sans,Helvetica Neue,sans-serif}.build-panel-content[_ngcontent-%COMP%]{flex:1;padding:20px;color:var(--builder-text-secondary-color);overflow-y:auto}.build-panel-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5}.app-name-option[_ngcontent-%COMP%], .app-select[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:unset}.adk-web-developer-ui-disclaimer[_ngcontent-%COMP%]{padding-left:4px;padding-bottom:4px;font-size:10px;color:var(--adk-web-text-color-light-gray)}.menu-check-icon.inactive[_ngcontent-%COMP%]{visibility:hidden}.logo-narrow[_ngcontent-%COMP%]{display:none}@media(max-width:900px){.logo-wide[_ngcontent-%COMP%]{display:none}.logo-narrow[_ngcontent-%COMP%]{display:inline}}@media(max-width:750px){.toolbar-agent-group[_ngcontent-%COMP%] .selector-button[_ngcontent-%COMP%]{width:auto;padding:4px 8px}.toolbar-agent-group[_ngcontent-%COMP%] .selector-label[_ngcontent-%COMP%]{display:none}}@media(max-width:600px){.toolbar-session-group[_ngcontent-%COMP%] .selector-button[_ngcontent-%COMP%]{width:auto;padding:4px 8px}.toolbar-session-group[_ngcontent-%COMP%] .selector-label[_ngcontent-%COMP%]{display:none}}.chat-sub-toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 20px;background-color:var(--mat-sys-surface-container);border-bottom:1px solid var(--mat-sys-outline-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{border-radius:16px;height:28px;align-items:center}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] .mat-button-toggle-label-content{line-height:28px;padding:0 12px;font-size:13px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-bar-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;background-color:transparent;border:none;margin-left:16px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;height:28px;cursor:pointer;transition:background-color .2s ease}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-label[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;color:var(--mat-sys-on-surface-variant);padding:0;margin-left:4px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:transparent;border:1px dashed var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;font-weight:500;height:28px;cursor:pointer;transition:all .2s ease;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant);border-color:var(--mat-sys-outline);color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;margin-right:4px} .filter-panel{min-width:max-content!important;max-width:50vw} .filter-panel .mat-mdc-menu-item{min-height:32px!important;font-size:12px!important} .filter-panel .mat-mdc-menu-item .mat-mdc-menu-item-text, .filter-panel .mat-mdc-menu-item .mdc-list-item__primary-text{font-size:12px!important;line-height:normal}.metric-block[_ngcontent-%COMP%]:hover .metric-tooltip[_ngcontent-%COMP%]{visibility:visible!important;opacity:1!important}.metric-tooltip[_ngcontent-%COMP%]{visibility:hidden;opacity:0;position:absolute;z-index:100;top:110%;left:0;background:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:12px;width:220px;box-shadow:0 4px 12px #00000026;transition:opacity .15s ease,visibility .15s ease;pointer-events:none}.metric-tooltip[_ngcontent-%COMP%] .tooltip-title[_ngcontent-%COMP%]{font-weight:600;font-size:13px;margin-bottom:4px;color:var(--mat-sys-on-surface)}.metric-tooltip[_ngcontent-%COMP%] .tooltip-desc[_ngcontent-%COMP%]{font-size:11px;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;white-space:normal;line-height:1.4}.metric-tooltip[_ngcontent-%COMP%] .tooltip-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:6px;font-size:11px;border-top:1px solid var(--mat-sys-outline-variant);padding-top:6px}.metric-tooltip[_ngcontent-%COMP%] .tooltip-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:4px}.metric-tooltip[_ngcontent-%COMP%] .tooltip-label[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-weight:400}.metric-tooltip[_ngcontent-%COMP%] .tooltip-value[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface)}.logo-title-container[_ngcontent-%COMP%]{position:relative;display:inline-flex;align-items:center;cursor:default}.logo-title-container[_ngcontent-%COMP%]:hover .custom-tooltip[_ngcontent-%COMP%]{visibility:visible;opacity:1}.custom-tooltip[_ngcontent-%COMP%]{visibility:hidden;opacity:0;position:absolute;z-index:100;top:110%;left:50%;transform:translate(-50%);background:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:12px;width:250px;box-shadow:0 4px 12px #00000026;transition:opacity .15s ease,visibility .15s ease;pointer-events:none;white-space:normal}.custom-tooltip[_ngcontent-%COMP%] .tooltip-title[_ngcontent-%COMP%]{font-weight:600;font-size:13px;margin-bottom:4px;color:var(--mat-sys-on-surface)}.custom-tooltip[_ngcontent-%COMP%] .tooltip-desc[_ngcontent-%COMP%]{font-size:11px;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;line-height:1.4}.custom-tooltip[_ngcontent-%COMP%] .tooltip-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr;gap:4px;font-size:11px;border-top:1px solid var(--mat-sys-outline-variant);padding-top:6px}.custom-tooltip[_ngcontent-%COMP%] .tooltip-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:4px}.custom-tooltip[_ngcontent-%COMP%] .tooltip-label[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-weight:400}.custom-tooltip[_ngcontent-%COMP%] .tooltip-value[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface)}']})};var gh=class i{static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-root"]],decls:1,vars:0,template:function(A,t){A&1&&lA(0,"app-chat")},dependencies:[V5],encapsulation:2})};var y7A=[{path:"",component:gh}],W5=class i{static \u0275fac=function(A){return new(A||i)};static \u0275mod=$e({type:i});static \u0275inj=Xe({imports:[lf.forRoot(y7A),lf]})};var Z5=class{static getRuntimeConfig(){return window.runtimeConfig}};function v7A(i,e){if(i&1&&(Dn(0,"a",0),Jn(1,"img",1),y(2),Tn()),i&2){p();let A=xn(0),t=xn(1);u(),Ea("src",bC(A),so),u(),Be(" ",t," ")}}function b7A(i,e){i&1&&(Dn(0,"div"),y(1," Invalid custom logo config. Make sure that your runtime config specifies both imgUrl and text in the logo field. "),Tn())}var X5=class i{logoConfig=Z5.getRuntimeConfig().logo;static \u0275fac=function(A){return new(A||i)};static \u0275cmp=bA({type:i,selectors:[["app-custom-logo"]],decls:4,vars:3,consts:[["href","/"],["width","32px","height","32px",1,"orcas-logo",3,"src"]],template:function(A,t){if(A&1&&(Uo(0)(1),Y(2,v7A,3,3,"a",0)(3,b7A,2,0,"div")),A&2){let n=Wo(t.logoConfig==null?null:t.logoConfig.imageUrl);u();let o=Wo(t.logoConfig==null?null:t.logoConfig.text);u(),O(n&&o?2:3)}},styles:[`a[_ngcontent-%COMP%]{color:inherit;text-decoration:none;display:flex;align-items:center;gap:8px} + + + + + + + + + + + + + + + + +`]})};var M7A={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-as-n":!0,"layout-dis-iflx":!0,"layout-al-c":!0},S7A={"layout-w-100":!0},k7A={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-mt-0":!0,"layout-mb-2":!0,"typography-sz-bm":!0,"color-c-n10":!0},_7A={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-pt-3":!0,"layout-pb-3":!0,"layout-pl-5":!0,"layout-pr-5":!0,"layout-mb-1":!0,"border-br-16":!0,"border-bw-0":!0,"border-c-n70":!0,"border-bs-s":!0,"color-bgc-s30":!0,"color-c-n100":!0,"behavior-ho-80":!0},xx={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mb-2":!0,"color-c-n10":!0},x7A=Oe(oA({},xx),{"typography-sz-tl":!0}),R7A=Oe(oA({},xx),{"typography-sz-tm":!0}),N7A=Oe(oA({},xx),{"typography-sz-ts":!0}),F7A={"behavior-sw-n":!0},AX={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-pl-4":!0,"layout-pr-4":!0,"layout-pt-2":!0,"layout-pb-2":!0,"border-br-6":!0,"border-bw-1":!0,"color-bc-s70":!0,"border-bs-s":!0,"layout-as-n":!0,"color-c-n10":!0},L7A={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0,"color-c-n10":!0},G7A={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},K7A={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},U7A={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},T7A={"typography-f-c":!0,"typography-fs-n":!0,"typography-w-400":!0,"typography-sz-bm":!0,"typography-ws-p":!0,"layout-as-n":!0},J7A=Oe(oA({},AX),{"layout-r-none":!0,"layout-fs-c":!0}),Y7A={"layout-el-cv":!0},VZ=_s.merge(M7A,{"color-c-p30":!0}),O7A=_s.merge(AX,{"color-c-n5":!0}),H7A=_s.merge(J7A,{"color-c-n5":!0}),z7A=_s.merge(_7A,{"color-c-n100":!0}),WZ=_s.merge(x7A,{"color-c-n5":!0}),ZZ=_s.merge(R7A,{"color-c-n5":!0}),XZ=_s.merge(N7A,{"color-c-n5":!0}),P7A=_s.merge(k7A,{"color-c-n5":!0}),$Z=_s.merge(L7A,{"color-c-n60":!0}),j7A=_s.merge(T7A,{"color-c-n35":!0}),q7A=_s.merge(G7A,{"color-c-n35":!0}),V7A=_s.merge(K7A,{"color-c-n35":!0}),W7A=_s.merge(U7A,{"color-c-n35":!0}),eX={additionalStyles:{Card:{},Button:{"--n-60":"var(--n-100)"},Image:{"max-width":"120px","max-height":"120px",marginLeft:"auto",marginRight:"auto"}},components:{AudioPlayer:{},Button:{"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-5":!0,"layout-pr-5":!0,"border-br-2":!0,"border-bw-0":!0,"border-bs-s":!0,"color-bgc-p30":!0,"color-c-n100":!0,"behavior-ho-70":!0},Card:{"border-br-4":!0,"color-bgc-p100":!0,"color-bc-n90":!0,"border-bw-1":!0,"border-bs-s":!0,"layout-pt-4":!0,"layout-pb-4":!0,"layout-pl-4":!0,"layout-pr-4":!0},CheckBox:{element:{"layout-m-0":!0,"layout-mr-2":!0,"layout-p-2":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0,"color-c-p30":!0},label:{"color-c-p30":!0,"typography-f-sf":!0,"typography-v-r":!0,"typography-w-400":!0,"layout-flx-1":!0,"typography-sz-ll":!0},container:{"layout-dsp-iflex":!0,"layout-al-c":!0}},Column:{},DateTimeInput:{container:{},label:{},element:{"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-3":!0,"layout-pr-3":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0}},Divider:{"color-bgc-n90":!0,"layout-mt-6":!0,"layout-mb-6":!0},Image:{all:{"border-br-50pc":!0,"layout-el-cv":!0,"layout-w-100":!0,"layout-h-100":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0,"layout-sp-c":!0,"layout-mb-3":!0},avatar:{},header:{},icon:{},largeFeature:{},mediumFeature:{},smallFeature:{}},Icon:{"border-br-1":!0,"layout-p-2":!0,"color-bgc-n98":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0,"layout-sp-c":!0},List:{"layout-g-4":!0,"layout-p-2":!0},Modal:{backdrop:{"color-bbgc-p60_20":!0},element:{"border-br-2":!0,"color-bgc-p100":!0,"layout-p-4":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bc-p80":!0}},MultipleChoice:{container:{},label:{},element:{}},Row:{"layout-g-4":!0},Slider:{container:{},label:{},element:{}},Tabs:{container:{},controls:{all:{},selected:{}},element:{}},Text:{all:{"layout-w-100":!0,"layout-g-2":!0,"color-c-p30":!0},h1:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-2":!0,"layout-p-0":!0,"typography-sz-tl":!0},h2:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-2":!0,"layout-p-0":!0,"typography-sz-tl":!0},h3:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"typography-sz-ts":!0},h4:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"typography-sz-bl":!0},h5:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"color-c-n30":!0,"typography-sz-bm":!0,"layout-mb-1":!0},body:{},caption:{}},TextField:{container:{"typography-sz-bm":!0,"layout-w-100":!0,"layout-g-2":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0},label:{"layout-flx-0":!0},element:{"typography-sz-bm":!0,"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-3":!0,"layout-pr-3":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0,"color-c-p30":!0}},Video:{"border-br-5":!0,"layout-el-cv":!0}},elements:{a:VZ,audio:S7A,body:P7A,button:z7A,h1:WZ,h2:ZZ,h3:XZ,h4:{},h5:{},iframe:F7A,input:O7A,p:$Z,pre:j7A,textarea:H7A,video:Y7A},markdown:{p:[...Object.keys($Z)],h1:[...Object.keys(WZ)],h2:[...Object.keys(ZZ)],h3:[...Object.keys(XZ)],h4:[],h5:[],ul:[...Object.keys(V7A)],ol:[...Object.keys(q7A)],li:[...Object.keys(W7A)],a:[...Object.keys(VZ)],strong:[],em:[]}};var $5=class i{nodes=[];subAgentIdCounter=1;selectedToolSubject=new ti(void 0);selectedNodeSubject=new ti(void 0);selectedCallbackSubject=new ti(void 0);loadedAgentDataSubject=new ti(void 0);agentToolsMapSubject=new ti(new Map);agentToolsSubject=new ti(void 0);newAgentToolBoardSubject=new ti(void 0);agentCallbacksMapSubject=new ti(new Map);agentCallbacksSubject=new ti(void 0);agentToolDeletionSubject=new ti(void 0);deleteSubAgentSubject=new ti("");addSubAgentSubject=new ti({parentAgentName:""});tabChangeSubject=new ti(void 0);agentToolBoardsSubject=new ti(new Map);constructor(){}getNode(e){return this.nodes.find(t=>t.name===e)}getRootNode(){return this.nodes.find(A=>!!A.isRoot)}addNode(e){let A=this.nodes.findIndex(l=>l.name===e.name);A!==-1?this.nodes[A]=e:this.nodes.push(e);let t=/^sub_agent_(\d+)$/,n=e.name.match(t);if(n){let l=parseInt(n[1],10);l>=this.subAgentIdCounter&&(this.subAgentIdCounter=l+1)}let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e.name,e.tools||[]),this.agentToolsMapSubject.next(a);let r=this.agentCallbacksMapSubject.value,s=new Map(r);s.set(e.name,e.callbacks||[]),this.agentCallbacksMapSubject.next(s),this.setSelectedNode(this.selectedNodeSubject.value)}getNodes(){return this.nodes}clear(){this.nodes=[],this.subAgentIdCounter=1,this.setSelectedNode(void 0),this.setSelectedTool(void 0),this.agentToolsMapSubject.next(new Map),this.agentCallbacksMapSubject.next(new Map),this.setSelectedCallback(void 0),this.setAgentTools(),this.setAgentCallbacks()}getSelectedNode(){return this.selectedNodeSubject.asObservable()}setSelectedNode(e){this.selectedNodeSubject.next(e)}getSelectedTool(){return this.selectedToolSubject.asObservable()}setSelectedTool(e){this.selectedToolSubject.next(e)}getSelectedCallback(){return this.selectedCallbackSubject.asObservable()}setSelectedCallback(e){this.selectedCallbackSubject.next(e)}getNextSubAgentName(){return`sub_agent_${this.subAgentIdCounter++}`}addTool(e,A){let t=this.getNode(e);if(t){let n=t.tools||[];t.tools=[A,...n];let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e,t.tools),this.agentToolsMapSubject.next(a)}}deleteTool(e,A){let t=this.getNode(e);if(t&&t.tools){let n=t.tools.length;if(t.tools=t.tools.filter(o=>o.name!==A.name),t.tools.lengthr.name===A.name))return{success:!1,error:`Callback with name '${A.name}' already exists`};t.callbacks.push(A),this.agentCallbacksSubject.next({agentName:e,callbacks:t.callbacks});let o=this.agentCallbacksMapSubject.value,a=new Map(o);return a.set(e,t.callbacks),this.agentCallbacksMapSubject.next(a),{success:!0}}catch(t){return{success:!1,error:"Failed to add callback: "+t.message}}}updateCallback(e,A,t){try{let n=this.getNode(e);if(!n)return{success:!1,error:"Agent not found"};if(!n.callbacks)return{success:!1,error:"No callbacks found for this agent"};let o=n.callbacks.findIndex(g=>g.name===A);if(o===-1)return{success:!1,error:"Callback not found"};if(n.callbacks.some((g,C)=>C!==o&&g.name===t.name))return{success:!1,error:`Callback with name '${t.name}' already exists`};let r=oA(oA({},n.callbacks[o]),t);n.callbacks[o]=r,this.agentCallbacksSubject.next({agentName:e,callbacks:n.callbacks});let s=this.agentCallbacksMapSubject.value,l=new Map(s);return l.set(e,n.callbacks),this.agentCallbacksMapSubject.next(l),this.selectedCallbackSubject.value?.name===A&&this.setSelectedCallback(r),{success:!0}}catch(n){return{success:!1,error:"Failed to update callback: "+n.message}}}deleteCallback(e,A){try{let t=this.getNode(e);if(!t)return{success:!1,error:"Agent not found"};if(!t.callbacks)return{success:!1,error:"No callbacks found for this agent"};let n=t.callbacks.findIndex(r=>r.name===A.name);if(n===-1)return{success:!1,error:"Callback not found"};t.callbacks.splice(n,1),this.agentCallbacksSubject.next({agentName:e,callbacks:t.callbacks});let o=this.agentCallbacksMapSubject.value,a=new Map(o);return a.set(e,t.callbacks),this.agentCallbacksMapSubject.next(a),this.selectedCallbackSubject.value?.name===A.name&&this.setSelectedCallback(void 0),{success:!0}}catch(t){return{success:!1,error:"Failed to delete callback: "+t.message}}}setLoadedAgentData(e){this.loadedAgentDataSubject.next(e)}getLoadedAgentData(){return this.loadedAgentDataSubject.asObservable()}getAgentToolsMap(){return this.agentToolsMapSubject.asObservable()}getAgentCallbacksMap(){return this.agentCallbacksMapSubject.asObservable()}requestSideTabChange(e){this.tabChangeSubject.next(e)}getSideTabChangeRequest(){return this.tabChangeSubject.asObservable()}requestNewTab(e,A){this.newAgentToolBoardSubject.next({toolName:e,currentAgentName:A})}getNewTabRequest(){return this.newAgentToolBoardSubject.asObservable().pipe(ye(A=>A?{tabName:A.toolName,currentAgentName:A.currentAgentName}:void 0))}requestTabDeletion(e){this.agentToolDeletionSubject.next(e)}getTabDeletionRequest(){return this.agentToolDeletionSubject.asObservable()}setAgentToolBoards(e){this.agentToolBoardsSubject.next(e)}getAgentToolBoards(){return this.agentToolBoardsSubject.asObservable()}getCurrentAgentToolBoards(){return this.agentToolBoardsSubject.value}getAgentTools(){return this.agentToolsSubject.asObservable()}getDeleteSubAgentSubject(){return this.deleteSubAgentSubject.asObservable()}setDeleteSubAgentSubject(e){this.deleteSubAgentSubject.next(e)}getAddSubAgentSubject(){return this.addSubAgentSubject.asObservable()}setAddSubAgentSubject(e,A,t){this.addSubAgentSubject.next({parentAgentName:e,agentClass:A,isFromEmptyGroup:t})}setAgentTools(e,A){if(e&&A){this.agentToolsSubject.next({agentName:e,tools:A});let t=this.agentToolsMapSubject.value,n=new Map(t);n.set(e,A),this.agentToolsMapSubject.next(n)}else this.agentToolsSubject.next(void 0)}getAgentCallbacks(){return this.agentCallbacksSubject.asObservable()}setAgentCallbacks(e,A){e&&A?this.agentCallbacksSubject.next({agentName:e,callbacks:A}):this.agentCallbacksSubject.next(void 0)}getParentNode(e,A,t,n){if(e){if(e.name===A.name)return t;for(let o of e.sub_agents){let a=this.getParentNode(o,A,e,n);if(a)return a}if(e.tools){for(let o of e.tools)if(o.toolType==="Agent Tool"){let a=n.get(o.toolAgentName||o.name);if(a){let r=this.getParentNode(a,A,e,n);if(r)return r}}}}}deleteNode(e){this.nodes=this.nodes.filter(A=>A.name!==e.name),this.setSelectedNode(this.selectedNodeSubject.value)}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var AD=class i{constructor(e){this.http=e}apiServerDomain=fr.getApiServerBaseUrl();getLatestArtifact(e,A,t,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${t}/artifacts/${n}`;return this.http.get(o)}getArtifactVersion(e,A,t,n,o){let a=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${t}/artifacts/${n}/versions/${o}`;return this.http.get(a)}static \u0275fac=function(A){return new(A||i)(Ko(hr))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var eD=class i{audioContext=new AudioContext({sampleRate:22e3});lastAudioTime=0;scheduledAudioSources=new Set;playAudio(e){let A=this.combineAudioBuffer(e);A&&this.playPCM(A)}stopAudio(){for(let e of this.scheduledAudioSources)e.onended=null,e.stop();this.scheduledAudioSources.clear(),this.lastAudioTime=this.audioContext.currentTime}combineAudioBuffer(e){if(e.length===0)return;let A=e.reduce((o,a)=>o+a.length,0),t=new Uint8Array(A),n=0;for(let o of e)t.set(o,n),n+=o.length;return t}playPCM(e){let A=new Float32Array(e.length/2);for(let r=0;r=32768&&(s-=65536),A[r]=s/32768}let t=this.audioContext.createBuffer(1,A.length,22e3);t.copyToChannel(A,0);let n=this.audioContext.createBufferSource();n.buffer=t,n.connect(this.audioContext.destination),n.onended=()=>{this.scheduledAudioSources.delete(n)},this.scheduledAudioSources.add(n);let o=this.audioContext.currentTime,a=Math.max(this.lastAudioTime,o);n.start(a),this.lastAudioTime=a+t.duration}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var tD=class i{audioWorkletModulePath=w(Tf);stream;audioContext;source;audioBuffer=[];volumeLevel=mA(0);lastVolumeUpdate=0;startRecording(){return Ie(this,null,function*(){try{this.stream=yield navigator.mediaDevices.getUserMedia({audio:!0}),this.audioContext=new AudioContext,yield this.audioContext.audioWorklet.addModule(this.audioWorkletModulePath),this.source=this.audioContext.createMediaStreamSource(this.stream);let e=new AudioWorkletNode(this.audioContext,"audio-processor");e.port.onmessage=A=>{let t=A.data,n=Date.now();if(n-this.lastVolumeUpdate>100){let a=0;for(let l=0;le.stop()),this.volumeLevel.set(0)}getCombinedAudioBuffer(){if(this.audioBuffer.length===0)return;let e=this.audioBuffer.reduce((n,o)=>n+o.length,0),A=new Uint8Array(e),t=0;for(let n of this.audioBuffer)A.set(n,t),t+=n.length;return A}cleanAudioBuffer(){this.audioBuffer=[]}float32ToPCM(e){let A=new ArrayBuffer(e.length*2),t=new DataView(A);for(let n=0;n{let n=t.metricsInfo||[];this.metricsInfoCache.set(e,n),this.metricsInfo.set(n)}))}return new bi}createNewEvalSet(e,A,t="live"){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/dev/apps/${e}/eval-sets`;return this.http.post(n,{eval_set:{eval_set_id:A,model_execution_mode:t,tool_execution_mode:t,eval_cases:[]}})}return new bi}getEvalSet(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}`;return this.http.get(t,{})}return new bi}listEvalCases(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}/evals`;return this.http.get(t,{})}return new bi}addCurrentSession(e,A,t,n,o){let a=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}/add_session`;return this.http.post(a,{evalId:t,sessionId:n,userId:o})}runEval(e,A,t,n){let o=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}/run_eval`;return this.http.post(o,{evalIds:t,evalMetrics:n})}listEvalResults(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/apps/${e}/eval_results`;return this.http.get(A,{})}return new bi}getEvalResult(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/dev/apps/${e}/eval_results/${encodeURIComponent(A)}`;return this.http.get(t,{})}return new bi}getEvalCase(e,A,t){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}/evals/${t}`;return this.http.get(n,{})}return new bi}updateEvalCase(e,A,t,n){let o=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}/evals/${t}`;return this.http.put(o,{evalId:t,conversation:n.conversation,sessionInput:n.sessionInput,creationTimestamp:n.creationTimestamp})}deleteEvalCase(e,A,t){let n=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}/evals/${t}`;return this.http.delete(n,{})}deleteEvalSet(e,A){let t=this.apiServerDomain+`/dev/apps/${e}/eval_sets/${A}`;return this.http.delete(t,{})}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var Rx="gcp.vertex.agent.tool_call_args",Nx="gcp.vertex.agent.tool_response",oD="gcp.vertex.agent.llm_request",aD="gcp.vertex.agent.llm_response",tX="execute_tool",iX="generate_content",Z7A="content",X7A="parts",$7A="functionResponse",nX=i=>{let e=Oe(oA({},i),{attributes:oA({},i.attributes)}),A=i?.attributes?.[oD]??AMA(i),t=i?.attributes?.[aD]??nMA(i);return A!==void 0&&(e.attributes[oD]=A),t!==void 0&&(e.attributes[aD]=t),e},AMA=i=>i.name.startsWith(tX)?i.attributes?.[Rx]:i.name.startsWith(iX)?oX(i.logs):void 0,eMA=i=>{let e=tMA(i),A=oX(i);return JSON.stringify({system_message:e,user_message:Fx(A)})},oX=i=>{if(!i)return;let e=i.reverse().find(iMA);if(!e)return;let A=typeof e.body=="string"?Fx(e.body):e.body;return typeof A=="string"?A:(A.content.role="user",A.contents=[A.content],delete A.content,JSON.stringify(A))},tMA=i=>{if(!i)return;let e=i.reverse().find(A=>A.event_name==="gen_ai.system.message");if(e)return typeof e.body=="string"?Fx(e.body):e.body},iMA=i=>{if(i.event_name!=="gen_ai.user.message")return!1;try{let A=(typeof i.body=="string"?JSON.parse(i.body):i.body)[Z7A]?.[X7A];return Array.isArray(A)?A.every(t=>!t[$7A]):!1}catch(e){return!1}},nMA=i=>i.name.startsWith(tX)?i.attributes?.[Nx]:i.name.startsWith(iX)?aX(i.logs):void 0,aX=i=>{if(!i)return;let e=i.reverse().find(A=>A.event_name==="gen_ai.choice");if(e)return oMA(e)},Fx=i=>{try{return JSON.parse(i)}catch(e){return i}},oMA=i=>typeof i.body=="string"?i.body:JSON.stringify(i.body),rX=i=>{let e=i[oD]??aMA(i),A=i[aD]??rMA(i),t=oA({},i);return e!==void 0&&(t[oD]=e),A!==void 0&&(t[aD]=A),t},aMA=i=>{if(Rx in i)return`${i[Rx]}`;if(i.logs)return eMA(i.logs)},rMA=i=>{if(Nx in i)return`${i[Nx]}`;if(i.logs)return aX(i.logs)};var rD=class i{constructor(e){this.http=e}apiServerDomain=fr.getApiServerBaseUrl();getEventTrace(e,A){let t=this.apiServerDomain+`/dev/apps/${e}/debug/trace/${A.id}`;return this.http.get(t).pipe(ye(o=>rX(o)))}getTrace(e,A){let t=this.apiServerDomain+`/dev/apps/${e}/debug/trace/session/${A}`;return this.http.get(t).pipe(ye(o=>Array.isArray(o)?o.map(nX):o))}getEvent(e,A,t,n){let o=this.apiServerDomain+`/dev/apps/${A}/users/${e}/sessions/${t}/events/${n}/graph`;return this.http.get(o)}static \u0275fac=function(A){return new(A||i)(Ko(hr))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var sD=class i{route=w(Ts);constructor(){}isImportSessionEnabled(){return ie(!0)}isEditFunctionArgsEnabled(){return this.route.queryParams.pipe(ye(e=>e[VK]==="true"))}isSessionUrlEnabled(){return ie(!0)}isA2ACardEnabled(){return this.route.queryParams.pipe(ye(e=>e[WK]==="true"))}isApplicationSelectorEnabled(){return ie(!0)}isAlwaysOnSidePanelEnabled(){return ie(!1)}isTraceEnabled(){return ie(!0)}isArtifactsTabEnabled(){return ie(!0)}isEvalEnabled(){return ie(!0)}isEvalV2Enabled(){return this.route.queryParams.pipe(ye(e=>e[XK]==="true"))}isTestsEnabled(){return this.route.queryParams.pipe(ye(e=>e[ZK]==="true"))}isTokenStreamingEnabled(){return ie(!0)}isMessageFileUploadEnabled(){return ie(!0)}isManualStateUpdateEnabled(){return ie(!0)}isBidiStreamingEnabled(){return ie(!0)}isExportSessionEnabled(){return ie(!0)}isEventFilteringEnabled(){return ie(!1)}isDeleteSessionEnabled(){return ie(!0)}isLoadingAnimationsEnabled(){return ie(!0)}isSessionsTabReorderingEnabled(){return ie(!1)}isSessionFilteringEnabled(){return ie(!1)}isSessionReloadOnNewMessageEnabled(){return ie(!1)}isUserIdOnToolbarEnabled(){return ie(!0)}isDeveloperUiDisclaimerEnabled(){return ie(!0)}isFeedbackServiceEnabled(){return ie(!1)}isInfinityMessageScrollingEnabled(){return ie(!1)}isMoreOptionsButtonHidden(){return ie(!1)}isNewSessionButtonEnabled(){return ie(!0)}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var lD=class i{sendFeedback(e,A,t){return ie(void 0)}getFeedback(e,A){return ie(void 0)}deleteFeedback(e,A){return ie(void 0)}getPositiveFeedbackReasons(){return ie([])}getNegativeFeedbackReasons(){return ie([])}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var sMA=(()=>{var i=import.meta.url;return function(e={}){var A,t=e,n,o,a=new Promise((D,b)=>{n=D,o=b});t.agerrMessages=[],t.stderrMessages=[],Q=D=>t.stderrMessages.push(D);var r=Object.assign({},t),s="./this.program",l=(D,b)=>{throw b},g="",C,I;typeof document<"u"&&document.currentScript&&(g=document.currentScript.src),i&&(g=i),g.startsWith("blob:")?g="":g=g.substr(0,g.replace(/[?#].*/,"").lastIndexOf("/")+1),C=D=>fetch(D,{credentials:"same-origin"}).then(b=>b.ok?b.arrayBuffer():Promise.reject(new Error(b.status+" : "+b.url)));var B=console.log.bind(console),Q=console.error.bind(console);Object.assign(t,r),r=null;var h;function f(D){for(var b=atob(D),R=new Uint8Array(b.length),V=0;VD.startsWith(et);function OA(){var D="data:application/octet-stream;base64,AGFzbQEAAAABmAd0YAJ/fwF/YAF/AGABfwF/YAN/f38Bf2ACf38AYAN/f38AYAR/f39/AX9gBH9/f38AYAV/f39/fwF/YAZ/f39/f38Bf2AFf39/f38AYAZ/f39/f38AYAh/f39/f39/fwF/YAAAYAABf2AHf39/f39/fwF/YAF8AXxgAn9/AXxgAX8BfGAHf39/f39/fwBgA39/fwF8YAd/f39/fHx/AGACf3wAYAR8fHx/AXxgAnx8AXxgA398fABgBX9+fn5+AGAEf39/fABgCn9/f39/f39/f38Bf2ADf35/AX5gBH9/fHwBf2ADfHx8AXxgCX9/f39/f39/fwBgA39/fgBgAAF8YAR/f39/AXxgAn9/AX5gBX9/f39+AX9gA39/fgF/YAp/f39/f39/f39/AGAEf35+fwBgBH9/fH8AYAJ/fgBgAnx/AXxgBH9/f3wBf2ABfwF+YAJ/fgF/YAJ/fAF/YAN8fH8BfGADf3x/AGAIf39/f39/f38AYAV/f39/fAF/YAt/f39/f39/f39/fwF/YAN/f3wAYAV/f35/fwBgBH9/fH8Bf2AAAX5gB39/f398f38Bf2AFf39/f3wAYAN/f3wBf2ADf35/AX9gAn19AX1gBH9/fX8AYAZ/fHx8fHwBfGADf39/AX5gDH9/f39/f39/f39/fwF/YAV/f3x/fwF/YAd/f398fH9/AGAGf39/fH9/AGAGf39/f35/AX9gD39/f39/f39/f39/f39/fwBgBH9/f38BfmAGf3x/f39/AX9gB39/f39/fn4Bf2AGf39/f35+AX9gB39/f39+f38Bf2AGf39/f39+AX9gAn5/AGAEf35/fwF/YAR/f3x8AXxgBX9/fH9/AGAJf39/f39/f39/AX9gBH9/fHwAYAR+fn5+AX9gAn99AX9gAn5/AX9gCH9/f398fHx/AGADf31/AGAGf39+fn5/AGABfAF/YAJ+fgF9YAJ/fQBgBH9/f34BfmAGf31/f39/AGADf3x8AX9gBX9/f3x/AGAFf398fH8AYAZ8fHx/f38AYAJ+fgF8YAJ8fwF/YAR/fHx8AGAGf39/f398AGAEf3x/fwBgBnx8f3x8fwBgB398fHx8fHwAYAV/fHx8fAF/YAF/AX1gA39/fwF9YAN+fn4Bf2AEf35+fgBgBH98f38Bf2AKf3x/f39/f39/fwBg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AgBB9ekDIAJBEGoQIBoQLwALFwBBAUF/IAAgASABEEAiABChAiAARhsLJQEBfyAAKAIsIgBBAEGAASAAKAIAEQMAIgAEfyAAKAIQBUEACws0AQF/AkAgACABEOYBIgFFDQAgACgCLCIAIAFBCCAAKAIAEQMAIgBFDQAgACgCECECCyACC28BAX8jAEEgayIDJAAgA0IANwMYIANCADcDECADIAI2AgwCQCADQRBqIAEgAhCzCiIBQQBIBEAgA0H8gAsoAgAQswU2AgBBioAEIAMQNwwBCyAAIANBEGoiABCNBSABEKECGiAAEFwLIANBIGokAAszAQF/IAIEQCAAIQMDQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQQFrIgINAAsLIAALJAEBfyMAQRBrIgMkACADIAI2AgwgACABIAIQzQsgA0EQaiQAC6QBAQN/IwBBEGsiAiQAAkAgABAtIgMgACgCAEEDcSAAKQMIEOgJIgEEfyABKAIYBUEACyIBDQAgAygCTCIBKAIAKAIMIgMEQCABKAIIIAAoAgBBA3EgACkDCCADESYAIgENAQtBACEBIAAoAgBBA3FBAkYNACACIAApAwg3AwggAkElNgIAQfDdCiEBQfDdCkEgQeAXIAIQtAEaCyACQRBqJAAgAQsPACAAIAEgAiADQQAQ8QsLQwAgACAAIAGlIAG9Qv///////////wCDQoCAgICAgID4/wBWGyABIAC9Qv///////////wCDQoCAgICAgID4/wBYGwsUACAAECgEQCAALQAPDwsgACgCBAsVACAAEKMBBEAgACgCBA8LIAAQpQMLowEBAn8CQAJAIAAEQCAAKAIIIgMgACgCDCICRgRAIAAgA0EBdEEBIAMbIAEQ/AEgACgCDCECCyACRQ0BIAAoAggiAyACTw0CIAAgACgCBCADaiACcCICIAEQ3wEaIAAgACgCCEEBajYCCCACDwtB0dMBQYm4AUE7QdbDARAAAAtBr5UDQYm4AUHDAEHWwwEQAAALQZoMQYm4AUHEAEHWwwEQAAALJgAgACABEK4HIgFFBEBBAA8LIAAQ7AEoAgwgASgCEEECdGooAgALLgAgAC0ADyIAQQFqQf8BcUERTwRAQbS7A0Gg/ABB3ABB6ZcBEAAACyAAQf8BRwtDACAAIAAgAaQgAb1C////////////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AkHYmQshASAAQdiZC0EYEM4BRQ0CQRgQTyIBRQ0BCyABIAIpAgg3AgAgASACKQIYNwIQIAEgAikCEDcCCAwBC0EAIQELIAJBIGokAEHkmwtBAToAAEHgmwsgATYCACABC60BAgF/An4CQAJAIAAEQCABBEAgAEEAEL8CIgMoAvQDDQIgAykDsAQiBCABQQhrIgEoAgBBCGqtIgVUDQMgAyAEIAV9IgQ3A7AEIAMoAsAEQQJPBEAgA0EtIAUgBCADKQO4BCACEJEECyABIAAoAhQRAQALDwtBsdQBQZ+9AUGKB0GonwEQAAALQbDSAUGfvQFBkQdBqJ8BEAAAC0HjqAFBn70BQZoHQaifARAAAAsJACAAQQAQ2AYLvwoCBX8PfiMAQeAAayIFJAAgBEL///////8/gyEMIAIgBIVCgICAgICAgICAf4MhCiACQv///////z+DIg1CIIghDiAEQjCIp0H//wFxIQcCQAJAIAJCMIinQf//AXEiCUH//wFrQYKAfk8EQCAHQf//AWtBgYB+Sw0BCyABUCACQv///////////wCDIgtCgICAgICAwP//AFQgC0KAgICAgIDA//8AURtFBEAgAkKAgICAgIAghCEKDAILIANQIARC////////////AIMiAkKAgICAgIDA//8AVCACQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQogAyEBDAILIAEgC0KAgICAgIDA//8AhYRQBEAgAiADhFAEQEKAgICAgIDg//8AIQpCACEBDAMLIApCgICAgICAwP//AIQhCkIAIQEMAgsgAyACQoCAgICAgMD//wCFhFAEQCABIAuEQgAhAVAEQEKAgICAgIDg//8AIQoMAwsgCkKAgICAgIDA//8AhCEKDAILIAEgC4RQBEBCACEBDAILIAIgA4RQBEBCACEBDAILIAtC////////P1gEQCAFQdAAaiABIA0gASANIA1QIgYbeSAGQQZ0rXynIgZBD2sQsQFBECAGayEGIAUpA1giDUIgiCEOIAUpA1AhAQsgAkL///////8/Vg0AIAVBQGsgAyAMIAMgDCAMUCIIG3kgCEEGdK18pyIIQQ9rELEBIAYgCGtBEGohBiAFKQNIIQwgBSkDQCEDCyADQg+GIgtCgID+/w+DIgIgAUIgiCIEfiIQIAtCIIgiEyABQv////8P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AQRAIAEoAgQiAkUNAQNAIAEgAigCADYCBCACIAE2AgAgAiIBKAIEIgINAAsgBCABNgIADAELCyAAKAIIIQULIAAgAzYCDCAAIAVBgCByNgIIIAMLoQEBAn8CQCAAECVFIAIgAWtBBUhyDQAgASACEJYFIAJBBGshBCAAEEYiAiAAECVqIQUCQANAAkAgAiwAACEAIAEgBE8NACAAQQBMIABB/wBOckUEQCABKAIAIAIsAABHDQMLIAFBBGohASACIAUgAmtBAUpqIQIMAQsLIABBAEwgAEH/AE5yDQEgAiwAACAEKAIAQQFrSw0BCyADQQQ2AgALC4QBAQJ/IwBBEGsiAiQAIAAQowEEQCAAKAIAIAAQ9gIaEKEFCyABECUaIAEQowEhAyAAIAEoAgg2AgggACABKQIANwIAIAFBABDTASACQQA6AA8gASACQQ9qENIBAkAgACABRiIBIANyRQ0ACyAAEKMBIAFyRQRAIAAQpQMaCyACQRBqJAALUAEBfgJAIANBwABxBEAgASADQUBqrYYhAkIAIQEMAQsgA0UNACACIAOtIgSGIAFBwAAgA2utiIQhAiABIASGIQELIAAgATcDACAAIAI3AwgLzgkCBH8EfiMAQfAAayIGJAAgBEL///////////8AgyEJAkACQCABUCIFIAJC////////////AIMiCkKAgICAgIDA//8AfUKAgICAgIDAgIB/VCAKUBtFBEAgA0IAUiAJQoCAgICAgMD//wB9IgtCgICAgICAwICAf1YgC0KAgICAgIDAgIB/URsNAQsgBSAKQoCAgICAgMD//wBUIApCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhBCABIQMMAgsgA1AgCUKAgICAgIDA//8AVCAJQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQQMAgsgASAKQoCAgICAgMD//wCFhFAEQEKAgICAgIDg//8AIAIgASADhSACIASFQoCAgICAgICAgH+FhFAiBRshBEIAIAEgBRshAwwCCyADIAlCgICAgICAwP//AIWEUA0BIAEgCoRQBEAgAyAJhEIAUg0CIAEgA4MhAyACIASDIQQMAgsgAyAJhFBFDQAgASEDIAIhBAwBCyADIAEgASADVCAJIApWIAkgClEbIggbIQogBCACIAgbIgxC////////P4Mh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9ANFBEAgAykDsAQiIkKAgICAEH1CkHtaDQEgAyAiQvAEfCIiNwOwBCADKALABEECTwRAIANBK0LwBCAiIAMpA7gEIiMgIlQEfiADICI3A7gEICIFICMLQZ8LEJEECyACQRA2ApwDIAJBADYCKCACQQA2AhAgAiABQYACQakLEJgBIgM2AqgDIANFBEAgASABQasLEGdBAAwFCyACIAFBgAhBtgsQmAEiAzYCQCADRQRAIAEgAigCqANBuAsQZyABIAFBvAsQZwwECyACIANBgAhqNgJEQQAiBkUEQCABQbwBQcw6EJgBIgZFDQMgBkIANwJQIAZCADcCaCAGIAE2AmQgBiABNgJ8IAZCADcCCCAGQQA6AAQgBkIANwIcIAZBADoAGCAGIAE2AhAgBkEANgIAIAZCADcCMCAGQQA6ACwgBiABNgIkIAZBADYCFCAGQQA2AmAgBkIANwJYIAZCADcCcCAGQQA2AnggBkIANwJEIAZBADoAQCAGIAE2AjggBkEANgIoIAZBADYCPCAGIAE2AkwgBkIANwKMASAGQQA6AIgBIAZCATcCgAEgBiABNgKUASAGQgA3ApgBIAZBADoAoAEgBkIANwKkASAGQgA3AqwBIAZCADcCtAELIAJBADYCmAMgAiAGNgKEAyACQQA2ApADIAJBADYC0AIgAkEANgLIAiACQQA2AsACIAJCADcD8AMgAkEhOgD4AyACQQA2AogCIAJBADYCkAEgAkEAOwH8ASACQgA3AsADIAJBADYC+AEgAkIANwKsAyACIAE2AtQDIAJCADcCyAMgAkEANgLQAyACQQA6ALQDIAJBADYC6AMgAkIANwLgAyACQgA3AtgDIAIgATYC7AMgAUHPATYCoAIgAUGbATYCiAIgAUEANgKcAiABQoCAgIAQNwKUAiAFBEBBACEGA0AgBSAGaiAGQQFqIQYtAAANAAsgASAGQYjCABCYASIDBEAgAyAFIAYQHxoLIAEgAzYC8AELIAFBADYCgAMgAUGgAWogAUGcAWpBABDBBhogAUIANwMAIAFBQGtBAEHAABA4GiABQgA3AowBIAFBADYChAEgAUIANwKUASABQgA3A7ADIAFBADYCNCABQQE6ADAgAUEANgIsIAFCADcCJCABQQA2AsQCIAFBADYCvAIgAUIANwKkAiABQgA3AqwCIAFBADYCtAIgASABKAIIIgM2AhwgASADNgIYIAEgATYCgAEgAUHUAmpBAEEmEDgaIAFBADYCmAMgAUEANgKMAyABQQA2AoQDIAFBADYC0AIgAUEBOgDMAiABQQA2AoQCIAFBADoA4AQgAUEANgL4AyABQgA3A/gBIAFCADcDkAQgAUIANwKEBCABQQA7AYAEIAFCADcDmAQgAUIANwOgBCABQgA3A6gEQbnZARDsBCEDIAFCADcD0AQgAUKAgIAENwOoBCABQYCAoJYENgKkBCABIAM2AqAEIAFCADcD2AQgAUGS2QEQ7AQ2AtwEAkAgBUUNACACKAL4AQ0AIAEQtAkMBAsgAkGghAg2AvQBIAEMBAtBsNIBQZ+9AUGRC0G/kgEQAAALQdCUAUGfvQFBkgtBv5IBEAAACyACQQA2AoQDIAEgAigCQEHGCxBnIAEgAigCqANBxwsQZyABIAFBywsQZ0EADAELQQALIgE2AgAgByAKKAI0KAIQKAKQATYCPAJAIAFFDQAgASgCACABIAc2AgAgASgCBEcNACABIAc2AgQLIAcoAgAiAQRAIAFB3wE2AkQgAUHeATYCQAsgBygCACIBBEAgAUHgATYCSAsjAEGwCGsiDiQAIA5BADYCrAggB0HwAGohHyAHQegAaiEgIAdB0ABqISEgB0HIAGohCkHIASEVIA5BQGsiHCEGIA5B4AZqIhIhAkF+IQMCQAJAAkACQAJAA0ACQCASIBA6AAAgEiACIBVqQQFrTwRAIBVBj84ASg0BQZDOACAVQQF0IgEgAUGQzgBOGyIVQQVsQQNqEE8iAUUNASABIAIgEiACayIGQQFqIgUQHyIBIBVBA2pBBG1BAnRqIBwgBUECdCILEB8hHCAOQeAGaiACRwRAIAIQGAsgBSAVTg0DIAEgBmohEiALIBxqQQRrIQYgASECCyAQQR9GDQMCfwJAAkACQAJAIBBBAXRBkLMIai8BACILQa7/A0YNAAJ/IANBfkYEQAJ/QQAhAyMAQRBrIhYkACAHQQA2AgggByAOQawIajYCQCAHQRBqIQ8CQAJAAkADQAJAQX8hAQJ/AkACQCAHLQApDgMAAQMBCyAHQQE6AClByt8BIQVBACEDQQYMAQsCQAJAAkACQAJAIAcoAgQiBS0AACINQTxHBEAgBSEBIA0NASAHQQI6AClB0d8BIQVBBwwGC0EBIQ1BBCEBIAVBAWoiA0G1oAMQwgIEQANAIA0EQCABIAVqIQMgAUEBaiEBAkACQAJAIAMtAAAiA0E8aw4DAAQBAgsgDUEBaiENDAMLIA1BAWshDQwCCyADDQELCyABIAVqIg1BAWsiAy0AAEUNAwJAIAFBB04EQCANQQNrQbagAxDCAg0BC0Gw4gNBABAqIAdBATYCIAsgAy0AACEBDAILA0AgAy0AACIBRSABQT5Gcg0CIANBAWohAwwACwALA0ACQAJ/AkAgDUEmRwRAIA1FIA1BPEZyDQMMAQsgAS0AAUEjRg0AIwBBEGsiAyQAIANBCGoiDSABQQFqIgFBOxDQASAPQSYQfwJAIAMoAgwiGCADKAIIai0AAEUgGEEJa0F5SXINACANQcDhB0H8AUEIQTcQ7AMiDUUNACADIA0oAgQ2AgAgD0H64AEgAxCEASABIAMoAgxqQQFqIQELIANBEGokACABDAELIA8gDcAQfyABQQFqCyIBLQAAIQ0MAQsLIAEhAwwDCyABQf8BcUE+Rg0BC0HC4gNBABAqIAdBATYCIAwBCyADQQFqIQMLIAMgBWsLIQECQCAPECRFDQAgDxD6BCINEEAiGEUNAyANIBhqQQFrIhgtAABB3QBHBEAgDyANEJEJDAELIBhBADoAACAPIA0QkQkgD0GL4QEQ8gELIAcgBykCLDcCNCAHIAE2AjAgByAFNgIsAkACfyAPECQiDQRAIA1BAEgNBiAHKAIAIA8Q+gQgDUEAELEJDAELIAFBAEgNBiAHKAIAIAUgASABRRCxCQsNACAHKAIkDQAgBygCACIBBH8gASgCpAIFQSkLQQFrIgFBK00EfyABQQJ0QdypCGooAgAFQQALIQEgFiAHEKwGNgIEIBYgATYCAEGH/wQgFhA3IAcQlAkgB0GMAjYCCCAHQQE2AiQLIAMEQCAHIAM2AgQLIAcoAggiAUUNAQsLIBZBEGokACABDAMLQbKXA0GltwFBgAdBt78BEAAAC0HNwgNBpbcBQcoIQZETEAAAC0HOwgNBpbcBQc0IQZETEAAACyEDCyADQQBMBEBBACEDQQAMAQsgA0GAAkYEQEGBAiEDDAULQQIgA0GnAksNABogA0GAtQhqLAAACyIFIAvBaiIBQY8CSw0AIAUgAUGwtwhqLAAARw0AIAFBwLkIaiwAACIQQQBKBEAgBiAOKAKsCDYCBCAXQQFrIgFBACABIBdNGyEXQX4hAyAGQQRqDAULQQAgEGshEAwBCyAQQdC7CGosAAAiEEUNAQsgBkEBIBBB0LwIaiwAACINa0ECdGooAgAhCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBBBAmsOQAABEQInJwMEJycnJycnJycFDQYNBw0IDQkNCg0LDQwNDiYnJw8QJhMUFRYXJycmJhgZGiYmGxwdHh8gISIjJCYnCyAKIAZBBGsoAgBBAhCPCTYCAAwmCyAKIAZBBGsoAgBBARCPCTYCAAwlCyAKEI4JIQsMJAsCQCAHKALYASIBECgEQCABIAEQJCIPEJACIgUNASAOIA9BAWo2AgBBiPYIKAIAQfXpAyAOECAaEC8ACyABEI0JIAEoAgAhBQsgAUIANwIAIAFCADcCCCAHKALcASEBIAcoAOQBIQ8gDiAHKQLkATcDGCAOIAcpAtwBNwMQIAcgASAOQRBqIA9BAWsQGUECdGooAgA2AmwgByAFNgJoIB9BAEEwEDgaICFBOBAmIQEgBygCUCABQThsaiAgQTgQHxoMIwsgCiAGKAIAEIwJDCILIAogBigCABDeAgwhCyAKIAYoAgAQ3gIMIAsgCiAGKAIAEN4CDB8LIAogBigCABDeAgweCyAKIAYoAgAQ3gIMHQsgCiAGKAIAEN4CDBwLIAogBigCABDeAgwbCyAKIAYoAgAQ3gIMGgsjAEEQayIBJAAgCigAnAEhBSABIAopApwBNwMIIAEgCikClAE3AwAgASAFQQFrEBkhDyAKQZQBaiEFAkACQAJAIAooAqQBIhYOAgIAAQsgBSgCACAPQQJ0aigCABAYDAELIAUoAgAgD0ECdGooAgAgFhEBAAsgBSAKQagBakEEEL4BIAFBEGokAAwZCyAGQQRrKAIAIQsMGAsgBygC2AEQiwkQiglFDRUgB0Hf3wEQ6AQMAQsgBygC2AEQiwkQiglFDQEgB0GS4AEQ6AQLIwBBkAFrIgUkACAKKAIEIQEgCigCACIDBEAgA0EBEKoGIApBADYCAAsDQCABBEAgASgCUCABEIkJIQEMAQUgCkEIaiEDQQAhAQNAIAooABAgAU0EQCADQTgQMSAKQdgAaiEDQQAhAQNAIAooAGAgAU0EQCADQSAQMSAKQZQBaiEDQQAhAQNAIAooAJwBIAFLBEAgBSADKQIINwOIASAFIAMpAgA3A4ABIAVBgAFqIAEQGSEGAkACQAJAIAooAqQBIgsOAgIAAQsgAygCACAGQQJ0aigCABAYDAELIAMoAgAgBkECdGooAgAgCxEBAAsgAUEBaiEBDAELCyADQQQQMSADEDQgBUGQAWokAAUgBSADKQIINwN4IAUgAykCADcDcCAFQfAAaiABEBkhBgJAAkAgCigCaCILDgIBJwALIAUgAygCACAGQQV0aiIGKQMYNwNoIAUgBikDEDcDYCAFIAYpAwg3A1ggBSAGKQMANwNQIAVB0ABqIAsRAQALIAFBAWohAQwBCwsFIAUgAykCCDcDSCAFIAMpAgA3A0AgBUFAayABEBkhBgJAAkAgCigCGCILDgIBJQALIAVBCGoiECADKAIAIAZBOGxqQTgQHxogECALEQEACyABQQFqIQEMAQsLCwsMHAsgByAHKAJMIgsoAlA2AkwMFAsgBkEEaygCACELDBMLIAZBBGsoAgAhCwwSCyAGQQRrKAIAIQsMEQsgBkEEaygCACELDBALIAZBBGsoAgAhCwwPCyAGQQhrKAIAQQE6ABgMDQsgBygCTCEBQRwQUiEFIAEtAIQBQQFxBEAgBUEBOgAYCyABIAU2AmggAUHUAGpBBBAmIQUgASgCVCAFQQJ0aiABKAJoNgIADA0LIAcoAkwiASgAXCEFIAEoAlQgDiABKQJcNwM4IA4gASkCVDcDMCAOQTBqIAVBAWsQGUECdGooAgAhCwwMCyAGQQhrKAIAIgEgAS0AZEEBcjoAZAwKCyAKIAZBBGsoAgAgBigCAEEBEOcEDAoLIAZBDGsoAgAhCwwJCyAKIAZBBGsoAgAgBigCAEECEOcEDAgLIAZBDGsoAgAhCwwHCyAKIAZBBGsoAgAgBigCAEEDEOcEDAYLIAZBDGsoAgAhCwwFCyAKIAYoAgAgChCOCUECEOcEDAQLIAZBCGsoAgAhCwwDCyAGQQRrKAIAIQsMAgsgBigCACAHKAJMNgJQIAYoAgAiAUIANwJUIAFBADYCaCABQYICNgJkIAFCADcCXCAHIAYoAgA2AkwgBygC3AEhASAHKADkASEFIA4gBykC5AE3AyggDiAHKQLcATcDICAOQSBqIAVBAWsQGSEFIAYoAgAgASAFQQJ0aigCADYCgAELIAYoAgAhCwsgBiANQQJ0ayIFIAs2AgQCfwJAIBIgDWsiEiwAACIGIBBBoL0IaiwAAEEpayILQQF0QfC9CGouAQBqIgFBjwJLDQAgAUGwtwhqLQAAIAZB/wFxRw0AIAFBwLkIagwBCyALQcC+CGoLLAAAIRAgBUEEagwCCwJAAkAgFw4EAQICAAILIANBAEoEQEF+IQMMAgsgAw0BDAYLIAdBoDYQ6AQLA0AgC0EIRwRAIAIgEkYNBiAGQQRrIQYgEkEBayISLAAAQQF0QZCzCGovAQAhCwwBCwsgBiAOKAKsCDYCBEEBIRBBAyEXIAZBBGoLIQYgEkEBaiESDAELCyAHQeGnARDoBAwBCyABIQIMAQsgAiAOQeAGakYNAQsgAhAYCyAOQbAIaiQAQQMhASAHKAIkRQRAIAcoAiAhAQsgBygCABC0CSAHLQAfQf8BRgRAIAcoAhAQGAsgCCgC0AEhBSAIQagCaiECIAhB2AFqIQMgCSABNgKMAQJAA38gCCgC4AEgEU0EfyADQTgQMSADEDRBACERA38gCCgCsAIgEU0EfyACQSAQMSACEDRBACERA38gCCgC7AIgEU0EfyAaQQQQMSAaEDQgCC0AjwNB/wFGBEAgCCgCgAMQGAsgCEGQA2okACAFBSAIIBopAgg3A4ABIAggGikCADcDeCAIQfgAaiAREBkhAQJAAkACQCAIKAL0AiICDgICAAELIAgoAuQCIAFBAnRqKAIAEBgMAQsgCCgC5AIgAUECdGooAgAgAhEBAAsgEUEBaiERDAELCwUgCCACKQIINwNwIAggAikCADcDaCAIQegAaiAREBkhAQJAAkAgCCgCuAIiAw4CAQYACyAIIAgoAqgCIAFBBXRqIgEpAwg3A1AgCCABKQMQNwNYIAggASkDGDcDYCAIIAEpAwA3A0ggCEHIAGogAxEBAAsgEUEBaiERDAELCwUgCEFAayADKQIINwMAIAggAykCADcDOCAIQThqIBEQGSEBAkACQCAIKALoASIGDgIBBAALIAggCCgC2AEgAUE4bGpBOBAfIAYRAQALIBFBAWohEQwBCwsMAgsLQbCDBEHCAEEBQYj2CCgCABA6GhA7AAsiAUUEQCAJKAKMAUEDRgRAIAxBADoAUiAMIAwoAgAQZDYCAAwCCyAJQgA3AyggCUIANwMgIAxBADoAUgJAIAlBIGoCfwJAAkAgABCSAg4DAAABAwsgABAhDAELIAlBIGoiASAAQTBBACAAKAIAQQNxQQNHG2ooAigQIRDyASABIAAgAEEwayIBIAAoAgBBA3FBAkYbKAIoECEQ8gFByuABQbagAyAAIAEgACgCAEEDcUECRhsoAigQLRCCAhsLEPIBCyAMIAlBIGoQ0wIQZCIBNgIAAn8gDCgCDEEBRgRAIAEQmgQMAQsgASAJKAJ0ENIGCyEBIAwoAgAQGCAMIAE2AgAgGygCECgCkAEgDBD3CCAJQSBqEFwMAQsCQCABKAIEQQFGBEACQCABKAIAKAIYDQAgABD7CEUNACAAEPsIEGQhAiABKAIAIAI2AhgLIAkgGyABKAIAQQAgCUFAaxD6CCAJKAKMAXI2AowBIAEoAgAiAisDSCEEIAkgAisDQEQAAAAAAADgP6IiJDkDMCAJIAREAAAAAAAA4D+iIgQ5AzggCSAEmjkDKCAJIAkpAzA3AxAgCSAJKQM4NwMYIAkgCSkDKDcDCCAJICSaOQMgIAkgCSkDIDcDACACIAlBDxD5CCAMIAkrAzAgCSsDIKE5AxggDCAJKwM4IAkrAyihOQMgDAELIBsoAhAoApABIAEoAgAgCUFAaxD4CCABKAIAIgIgAisDKEQAAAAAAADgP6IiBDkDKCACIAIrAyBEAAAAAAAA4D+iIiQ5AyAgAiAEmjkDGCACICSaOQMQIAwgBCAEoDkDICAMICQgJKA5AxgLIAwgATYCSCABKAIEQQFHDQAgDCgCABAYIAxBiuABEGQ2AgALIAkoAowBIAlBkAFqJABFDQECQAJAAkAgABCSAg4DAAECBAsgEyAdECE2AgBBsvgDIBMQgAEMAwsgEyAeECE2AhBBu/wDIBNBEGoQgAEMAgsgGUEwQQAgGSgCAEEDcUEDRxtqKAIoECEhACAUEIICIQEgEyAZQVBBACAZKAIAQQNxQQJHG2ooAigQITYCKCATQcrgAUG2oAMgARs2AiQgEyAANgIgQe7xAyATQSBqEIABDAELIAEgAEEAEPYIIQACfyAFQQFGBEAgABCaBAwBCyAAIBQQ0gYLIQEgABAYIAwgATYCACAUKAIQKAKQASAMEPcICyATQTBqJAAgDA8LQdTWAUHU+wBBDEHlOxAAAAuOAQEDfwJAIAAoAggiAUEMcQRAIAAoAgwhAgwBCwJAIAFBAXEEQCAAEK4BIQIgACgCECIBIAAoAhRBAnRqIQMDQCABIANPDQIgAUEANgIAIAFBBGohAQwACwALIAAoAhAhAiAAQQA2AhAMAQsgACgCCCEBCyAAQQA2AhggAEEANgIMIAAgAUH/X3E2AgggAgsIACAAEJkBGgu/AgIDfwF8IwBBMGsiAiQAIAAoAJwBIQMgACgClAEgAiAAKQKcATcDCCACIAApApQBNwMAIAIgA0EBaxAZQQJ0aigCACEDIAIgASkDGDcDKCACIAEpAxA3AyAgAiABKQMINwMYIAIgASkDADcDECAAQZQBagJAIANFDQACQCACKAIUDQAgAygCBCIERQ0AIAIgBDYCFAsCQCACKwMgRAAAAAAAAAAAY0UNACADKwMQIgVEAAAAAAAAAABmRQ0AIAIgBTkDIAsCQCACKAIQDQAgAygCACIERQ0AIAIgBDYCEAsgAygCGEH/AHEiA0UNACACIAIoAiggA3I2AigLIAAgACgCrAEoAogBIgMgAkEQakEBIAMoAgARAwA2AqgBQQQQJiEBIAAoApQBIAFBAnRqIAAoAqgBNgIAIAJBMGokAAtvAQF/IwBBIGsiAyQAIANCADcDGCADQgA3AwggA0KAgICAgICA+L9/NwMQIAMgAjYCGCADQgA3AwAgAQRAIAAgA0GQngpBAyABQb7fARCPBAsgACgCPCgCiAEiACADQQEgACgCABEDACADQSBqJAALCwAgAEHXzwQQogkLEwAgACgCAEE0aiABIAEQQBC4CQtFAAJAIAAQKARAIAAQJEEPRg0BCyAAQQAQygMLAkAgABAoBEAgAEEAOgAPDAELIABBADYCBAsgABAoBH8gAAUgACgCAAsLWgECfyMAQRBrIgMkACADIAE2AgwgAyADQQtqIgQ2AgQgACADQQxqIgEgAiADQQRqIAEgACgCOBEIABogAygCBCEAIAMsAAshASADQRBqJABBfyABIAAgBEYbC6UCAgN/AX4jAEGAAWsiBCQAIAEoAgAiBhAtKAIQKAJ0IAQgAjkDOCAEIAM5AzBBA3EiBQRAIAQgBCkDODcDGCAEIAQpAzA3AxAgBEFAayAEQRBqIAVB2gBsEIwKIAQgBCkDSDcDOCAEIAQpA0A3AzALIARCADcDWCAEQgA3A1AgBCAEKQM4Igc3A2ggBCAHNwN4IAQgBCkDMCIHNwNgIARCADcDSCAEQgA3A0AgBCAHNwNwIAEgBigCECgCCCgCBCgCDCAEQUBrQQEQggUgBQRAIAQgBCkDSDcDCCAEIAQpA0A3AwAgBEEgaiAEIAVB2gBsEJsDIAQgBCkDKDcDSCAEIAQpAyA3A0ALIAAgBCkDQDcDACAAIAQpA0g3AwggBEGAAWokAAtEACAAKAIQKAIIIgBFBEBBAA8LIAAoAgQoAgAiAEE8RgRAQQEPCyAAQT1GBEBBAg8LIABBPkYEQEEDDwsgAEE/RkECdAsbACABQQAQ/QQaQeDdCiAANgIAIAEQmQFBAEcLTAECfyAAKAIQKAKUARAYIAAoAhAiASgCCCICBH8gACACKAIEKAIEEQEAIAAoAhAFIAELKAJ4ELwBIAAoAhAoAnwQvAEgAEH8JRDiAQutAQEBfyAALQAJQRBxBEAgAEEAEOcBCwJAIAEEQCABLQAJQRBxBEAgAUEAEOcBCyABKAIgIAAoAiBHDQELIAEhAgNAIAIEQCAAIAJGDQIgAigCKCECDAELCyAAKAIoIgIEQCACIAIoAiRBAWs2AiQLIABCADcCKCABRQRAIAAgACgCICgCADYCACACDwsgAEEDNgIAIAAgATYCKCABIAEoAiRBAWo2AiQgAQ8LQQALrQQBCnwCQAJAIAErAwAiBSACKwMAIgZhBEAgASsDCCACKwMIYQ0BCyAGIAMrAwAiCGIEQCACKwMIIQcMAgsgAisDCCIHIAMrAwhiDQELIAAgAikDADcDACAAIAIpAwg3AwggACACKQMANwMQIAAgAikDCDcDGCAAIAIpAwA3AyAgACACKQMINwMoDwsgBiAFoSIFIAUgByABKwMIoSIJEEciC6MiDBCvAiEFIAggBqEiCCAIIAMrAwggB6EiCBBHIg2jIg4QrwIiCiAKmiAIRAAAAAAAAAAAZBtEGC1EVPshCcCgIAUgBZogCUQAAAAAAAAAAGQboSIFRBgtRFT7IRlARAAAAAAAAAAAIAVEGC1EVPshCcBlG6AiCkQAAAAAAAAAAGYgCkQYLURU+yEJQGVxRQRAQdTAA0GSuQFB4ANBm5YBEAAACyAERAAAAAAAAOA/oiIEIAyiIAegIQUgBiAEIAkgC6MiC6KhIQkgBCAOoiAHoCEHIAYgBCAIIA2joqEhBkQAAAAAAADwPyAKRAAAAAAAAOA/oiIIEFejRAAAAAAAABBAZARAIAAgBzkDKCAAIAY5AyAgACAFOQMYIAAgCTkDECAAIAUgB6BEAAAAAAAA4D+iOQMIIAAgCSAGoEQAAAAAAADgP6I5AwAPCyAAIAc5AyggACAGOQMgIAAgBTkDGCAAIAk5AxAgACAEIAgQ1AujIgQgC6IgBaA5AwggACAEIAyiIAmgOQMAC9EDAwd/AnwBfiMAQUBqIgckACAAKAIQIgooAgwhCyAKIAE2AgwgACAAKAIAKALIAhDlASAAIAUQhwIgAyADKwMIIAIrAwihIg5ELUMc6+I2Gj9ELUMc6+I2Gr8gDkQAAAAAAAAAAGYboEQAAAAAAAAkQCADKwMAIAIrAwChIg8gDhBHRC1DHOviNho/oKMiDqI5AwggAyAPRC1DHOviNho/RC1DHOviNhq/IA9EAAAAAAAAAABmG6AgDqI5AwADQAJAIAhBBEYNACAGIAhBA3R2IgFB/wFxIgxFDQAgByADKQMINwM4IAcgAykDADcDMCAHIAIpAwg3AyggByACKQMANwMgIAFBD3EhDUEAIQECQANAIAFBCEYNASABQRhsIQkgAUEBaiEBIA0gCUGA4AdqIgkoAgBHDQALIAcgBCAJKwMIoiIOIAcrAziiOQM4IAcgBysDMCAOojkDMCAHIAIpAwg3AxggAikDACEQIAcgBykDODcDCCAHIBA3AxAgByAHKQMwNwMAIAdBIGogACAHQRBqIAcgBCAFIAwgCSgCEBEVAAsgAiAHKQMgNwMAIAIgBykDKDcDCCAIQQFqIQgMAQsLIAogCzYCDCAHQUBrJAALxQIBCH8jAEEgayICJAACQCAAIAJBHGoQhAUiAEUNACACKAIcIgVBAEwNAANAIAAtAAAiA0UNASADQS1HBEAgAEEBaiEADAELCyACQgA3AxAgAkIANwMIIABBAWohBkEAIQMDQCAEIAVIBEAgAyAGaiIHLAAAIggEQCACQQhqIAgQjwoCQCAHLQAAQdwARgRAIANFDQEgACADai0AAEHcAEcNAQsgBEEBaiEECyADQQFqIQMMAgUgAkEIahBcQQAhBAwDCwALCyABIwBBEGsiASQAAkAgAkEIaiIAECgEQCAAIAAQJCIFEJACIgQNASABIAVBAWo2AgBBiPYIKAIAQfXpAyABECAaEC8ACyAAQQAQjwogACgCACEECyAAQgA3AgAgAEIANwIIIAFBEGokACAENgIAIAMgBmohBAsgAkEgaiQAIAQLVAEDfyMAQRBrIgEkAEG43gooAgACQCAARQ0AIAAQpQEiAg0AIAEgABBAQQFqNgIAQYj2CCgCAEH16QMgARAgGhAvAAtBuN4KIAI2AgAgAUEQaiQACyMBAX8jAEEQayIBJAAgASAANgIMIAFBDGoQ9QYgAUEQaiQACw8AIAAgACgCACgCJBECAAsRACAAIAEgASgCACgCIBEEAAsRACAAIAEgASgCACgCLBEEAAsMACAAQYKGgCA2AAALEQAgABBGIAAQJUECdGoQgQcLDQAgACgCACABKAIARwsOACAAEEYgABAlahCBBwsWACAAIAEgAiADIAAoAgAoAiARBgAaCw4AIAAoAghB/////wdxC4ABAQJ/IwBBEGsiBCQAIwBBIGsiAyQAIANBGGogASABIAJBAnRqEKQFIANBEGogAygCGCADKAIcIAAQqwsgAyABIAMoAhAQowU2AgwgAyAAIAMoAhQQpAM2AgggBEEIaiADQQxqIANBCGoQ+wEgA0EgaiQAIAQoAgwaIARBEGokAAtFAQF/IwBBEGsiBSQAIAUgASACIAMgBEKAgICAgICAgIB/hRCyASAFKQMAIQEgACAFKQMINwMIIAAgATcDACAFQRBqJAALqAEAAkAgAUGACE4EQCAARAAAAAAAAOB/oiEAIAFB/w9JBEAgAUH/B2shAQwCCyAARAAAAAAAAOB/oiEAQf0XIAEgAUH9F08bQf4PayEBDAELIAFBgXhKDQAgAEQAAAAAAABgA6IhACABQbhwSwRAIAFByQdqIQEMAQsgAEQAAAAAAABgA6IhAEHwaCABIAFB8GhNG0GSD2ohAQsgACABQf8Haq1CNIa/ogviAQECfyACQQBHIQMCQAJAAkAgAEEDcUUgAkVyDQAgAUH/AXEhBANAIAAtAAAgBEYNAiACQQFrIgJBAEchAyAAQQFqIgBBA3FFDQEgAg0ACwsgA0UNASABQf8BcSIDIAAtAABGIAJBBElyRQRAIANBgYKECGwhAwNAQYCChAggACgCACADcyIEayAEckGAgYKEeHFBgIGChHhHDQIgAEEEaiEAIAJBBGsiAkEDSw0ACwsgAkUNAQsgAUH/AXEhAQNAIAEgAC0AAEYEQCAADwsgAEEBaiEAIAJBAWsiAg0ACwtBAAsEACAAC9IBAgN/BHwjAEEgayIEJAAgBCACNgIQIAQgATYCDCAAKAIAIgAgBEEMakEEIAAoAgARAwAhACAEQSBqJAAgA0UgAEVyRQRAIABBCGohAANAIAMoAgAhASAAIQIDQCACKAIAIgIEQCACKAIAIgQoAhAoApQBIgUrAwAgASgCECgClAEiBisDAKEiByAHoiAFKwMIIAYrAwihIgggCKKgIglBsIALKwMAIgogCqJjBEAgASAEIAcgCCAJEKsMCyACQQRqIQIMAQsLIAMoAgQiAw0ACwsLzwECAn8BfCMAQSBrIgIkAAJAIAFBmNsAECciAwRAIAMgAEQAAAAAAADwP0QAAAAAAAAAABDMBQ0BCyABQZfbABAnIgEEQCABIABEmpmZmZmZ6T9EAAAAAAAAEEAQzAUNAQsgAEEBOgAQIABCgICAgICAgIjAADcDACAAQoCAgICAgICIwAA3AwgLQezaCi0AAARAIAAtABAhASAAKwMAIQQgAiAAKwMIOQMQIAIgBDkDCCACIAE2AgBBiPYIKAIAQcXzBCACEDMLIAJBIGokAAulBAIIfAV/IwBBEGsiDiQAIAIgACsDCCIIoSIHIAEgACsDACIJoSIFoyEGQZj/CigCACAAKAIQQeAAbGoiDSgCXCEAA0ACQAJAAkACQAJAIAAgC0YEQCAAIQsMAQsgDSgCWCALQQR0aiIMKwAIIQMgDCsAACIKIAFhIAIgA2FxDQEgAyAIoSEEIAogCaEhAwJAIAVEAAAAAAAAAABmBEAgA0QAAAAAAAAAAGMNAiAFRAAAAAAAAAAAZARAIANEAAAAAAAAAABkRQ0CIAYgBCADoyIEYw0DIAMgBWRFIAQgBmNyDQcMAwsgA0QAAAAAAAAAAGQEQCAHRAAAAAAAAAAAZUUNBwwDCyAEIAdkBEAgBEQAAAAAAAAAAGUNBwwDCyAHRAAAAAAAAAAAZUUNBgwCCyADRAAAAAAAAAAAZg0FIAYgBCADoyIEYw0BIAMgBWNFDQUgBCAGY0UNAQwFCyAERAAAAAAAAAAAZEUNBAsgAEH/////AE8NASANKAJYIABBBHQiDEEQaiIPEGoiAEUNAiAAIAxqIgxCADcAACAMQgA3AAggDSAANgJYIAAgC0EEdGoiAEEQaiAAIA0oAlwiDCALa0EEdBC2ARogACACOQMIIAAgATkDACANIAxBAWo2AlwLIA5BEGokAA8LQY7AA0HS/ABBzQBBvbMBEAAACyAOIA82AgBBiPYIKAIAQfXpAyAOECAaEC8ACyALQQFqIQsMAAsACyUBAXwgACsDACABKwMAoSICIAKiIAArAwggASsDCKEiAiACoqAL1QECBn8EfSABQQAgAUEAShshCANAIAQgCEYEQANAIAYgCEZFBEAgACAFQQJ0aioCACACIAZBAnQiCWoqAgAiC5RDAAAAAJIhCiAGQQFqIgYhBANAIAVBAWohBSABIARGRQRAIAIgBEECdCIHaioCACEMIAMgB2oiByAAIAVBAnRqKgIAIg0gC5QgByoCAJI4AgAgDSAMlCAKkiEKIARBAWohBAwBCwsgAyAJaiIEIAogBCoCAJI4AgAMAQsLBSADIARBAnRqQQA2AgAgBEEBaiEEDAELCwtdAgF9An8gACEDIAEhBANAIAMEQCADQQFrIQMgAiAEKgIAkiECIARBBGohBAwBCwsgAiAAspUhAgNAIAAEQCABIAEqAgAgApM4AgAgAEEBayEAIAFBBGohAQwBCwsL4AECBX8CfCMAQRBrIgQkACACKAIAIQUgAUEEaiIHIQYgByECIAACfwJAIAEoAgQiA0UNACAFKwMIIQgDQCAIIAMiAigCECIDKwMIIgljRSADIAVNIAggCWRycUUEQCACIQYgAigCACIDDQEMAgsgAyAFSSAIIAlkckUEQCACIQNBAAwDCyACKAIEIgMNAAsgAkEEaiEGC0EUEIkBIQMgBCAHNgIIIAMgBTYCECAEQQE6AAwgASACIAYgAxDdBSAEQQA2AgQgBEEEahCVDUEBCzoABCAAIAM2AgAgBEEQaiQAC+sBAQN/IAJBACACQQBKGyEHQcjRCkGg7gkoAgAQkwEhBSABIQIDQCAGIAdGRQRAIAIgAigCEDYCCCAFIAJBASAFKAIAEQMAGiAGQQFqIQYgAkEwaiECDAELCwJ/IAQEQCAFIANBxAMQuQ0MAQsgACAFIANBxAMQuA0LIgNBAkH/////BxDMBBpBACECA0AgAiAHRkUEQCABKAIQIQAgASABKAIYKAIQKAL0ASIENgIQIAEgBCAAayIAIAEoAiRqNgIkIAEgASgCLCAAajYCLCACQQFqIQIgAUEwaiEBDAELCyADELcNIAUQmQEaC+sBAQN/IAJBACACQQBKGyEHQcjRCkGg7gkoAgAQkwEhBSABIQIDQCAGIAdGRQRAIAIgAigCDDYCCCAFIAJBASAFKAIAEQMAGiAGQQFqIQYgAkEwaiECDAELCwJ/IAQEQCAFIANBwwMQuQ0MAQsgACAFIANBwwMQuA0LIgNBAkH/////BxDMBBpBACECA0AgAiAHRkUEQCABKAIMIQAgASABKAIYKAIQKAL0ASIENgIMIAEgBCAAayIAIAEoAiBqNgIgIAEgASgCKCAAajYCKCACQQFqIQIgAUEwaiEBDAELCyADELcNIAUQmQEaCxIAIAAEQCAAKAIAEBggABAYCwuHAQEFfyAAQQAgAEEAShshBiABQQAgAUEAShshByAAQQQQGiEFIAAgAWxBCBAaIQQgAUEDdCEBA0AgAyAGRkUEQCAFIANBAnRqIAQ2AgBBACEAA0AgACAHRkUEQCAEIABBA3RqIAI5AwAgAEEBaiEADAELCyADQQFqIQMgASAEaiEEDAELCyAFC7IBAQJ/IAAoAhAgASgCEEG4ARAfIQIgACABQTAQHyIAIAI2AhAgAEEwQQAgACgCAEEDcSIDQQNHG2ogAUFQQQAgASgCAEEDcUECRxtqKAIoNgIoIABBUEEAIANBAkcbaiABQTBBACABKAIAQQNxQQNHG2ooAig2AiggAkEQaiABKAIQQThqQSgQHxogACgCEEE4aiABKAIQQRBqQSgQHxogACgCECIAIAE2AnggAEEBOgBwC4QBAQJ/IAAgACgCBCIEQQFqNgIEIAAoAhQgBEEYbGoiACABKAIgNgIMIAIoAiAhBSAAQQA2AgggACADOQMAIAAgBTYCECABKAIcIAEuARAiBUECdGogBDYCACABIAVBAWo7ARAgAigCHCACLgEQIgFBAnRqIAQ2AgAgAiABQQFqOwEQIAALQQEBfwJAIAArAwAgASsDEGQNACABKwMAIAArAxBkDQAgACsDCCABKwMYZA0AIAErAwggACsDGGQNAEEBIQILIAILwgEBCHwgASsDACIDIAErAxAiBGQEQCAAIAIpAwA3AwAgACACKQMYNwMYIAAgAikDEDcDECAAIAIpAwg3AwgPCyACKwMAIgUgAisDECIGZARAIAAgASkDADcDACAAIAEpAxg3AxggACABKQMQNwMQIAAgASkDCDcDCA8LIAIrAwghByABKwMIIQggAisDGCEJIAErAxghCiAAIAQgBhApOQMQIAAgAyAFECk5AwAgACAKIAkQKTkDGCAAIAggBxApOQMIC64BAwJ+A38BfCMAQRBrIgQkAAJAAkAgACsDACAAKwMQZA0AQgEhAQNAIANBAkYNAgJ+IAAgA0EDdGoiBSsDECAFKwMAoSIGRAAAAAAAAPBDYyAGRAAAAAAAAAAAZnEEQCAGsQwBC0IACyICUA0BIAQgAkIAIAFCABCcASAEKQMIUARAIANBAWohAyABIAJ+IQEMAQsLQYG0BEEAEDcQLwALQgAhAQsgBEEQaiQAIAELwQEBA38CQAJAIAAoAhAiAigCsAEiBCABRwRAIAAgASgCECIDKAKwAUcNAQtBvpUEQQAQKgwBCyAERQRAIAIgATYCsAEgAigCrAEiACADKAKsAUoEQCADIAA2AqwBCwNAIAFFDQIgASgCECIAIAAvAagBIAIvAagBajsBqAEgACAALwGaASACLwGaAWo7AZoBIAAgACgCnAEgAigCnAFqNgKcASAAKAKwASEBDAALAAtB7NIBQau6AUH7AUGHEBAAAAsLWAEBfyMAQSBrIgQkACAEQgA3AxggBEIANwMQIAIEQCABIAIgABEAABoLIAQgAzkDACAEQRBqIgJB+IIBIAQQfiABIAIQuwEgABEAABogAhBcIARBIGokAAtOAQF/AkAgACgCPCIERQ0AIAAoAkQgASAAKAIQQeAAaiIBENkIIAQoAlwiBEUNACAAIAEgBBEEAAsgACgCECIAIAM5A5ABIAAgAjYCiAELVQECfyAAIAFBUEEAIAEoAgBBA3FBAkcbaigCKBDmASIDBEAgACgCNCADKAIcEOcBIAAoAjQiAiABQQggAigCABEDACECIAMgACgCNBDcAjYCHAsgAgupBwIHfwJ8IwBBIGsiBCQAIAAoAhAiBygCDCEIIAcgATYCDAJAAkAgAi0AUkEBRgRAIAIoAkghBiMAQdAAayIBJAAgABCNBCIDIAMoAgAiBSgCBCIJNgIEIAMgBSgCDDYCDAJAAkAgCUEESQRAIAMgBSgCCDYCCCADIAUoAtgBNgLYASADIAUoAuwBNgLsASADIAUoAvwBNgL8ASADIAMvAYwCQf7/A3EgBS8BjAJBAXFyOwGMAiACKwNAIQogAisDOCELAkAgAi0AUCIDQeIARwRAIANB9ABHDQEgCiACKwMwIAYQhQmhRAAAAAAAAOA/oqBEAAAAAAAA8L+gIQoMAQsgCiACKwMwIAYQhQmhRAAAAAAAAOC/oqBEAAAAAAAA8L+gIQoLIAEgCjkDECABIAs5AwggASACKAIINgIcIAEgAigCBDYCGCABIAIrAxA5AyggASAAKAIQKAIIQbScARAnIgI2AkAgACgCECgC3AEhAyABQQA6AEggASADNgJEAkAgAgRAIAItAAANAQsgAUH6kwE2AkALIAYoAgAhAiAGKAIEQQFHDQEgACAAKAIAKALIAhDlASAAIAIoAhgiA0GF9QAgAxsQSSAAIAIgAUEIahCECSABLQBIQQFxRQ0CIAEoAkQQGAwCCyABQcEFNgIEIAFB1L0BNgIAQYj2CCgCAEHYvwQgARAgGhA7AAsgACACIAFBCGoQgwkLIAAoAhAiAkEANgL8ASACQQA2AuwBIAJCADcD2AEgABCMBCABQdAAaiQADAELIAIoAkxFDQEgAEEAENsIIAAgAigCCBBJIAIrA0AhCiAEAnwCQCACLQBQIgFB4gBHBEAgAUH0AEcNASAKIAIrAzBEAAAAAAAA4D+ioAwCCyACKwMgIAogAisDMEQAAAAAAADgv6KgoAwBCyAKIAIrAyBEAAAAAAAA4D+ioAsgAisDEKEiCzkDGCAHLQCNAkECcQRAIAQgCyAKoTkDGAtBACEBA0AgAigCTCABTQRAIAAQ2ggFIAIrAzghCgJAIAFBOGwiAyACKAJIaiIFLQAwIgZB8gBHBEAgBkHsAEcNASAKIAIrAyhEAAAAAAAA4L+ioCEKDAELIAogAisDKEQAAAAAAADgP6KgIQoLIAQgBCkDGDcDCCAEIAo5AxAgBCAEKQMQNwMAIAAgBCAFEJkGIAQgBCsDGCACKAJIIANqKwMooTkDGCABQQFqIQEMAQsLCyAHIAg2AgwLIARBIGokAAt3AQJ/IAEgABBLIgFqIgIgAUEBdEGACCABGyIDIAIgA0sbIQIgABAkIQMCQCAALQAPQf8BRgRAIAAoAgAgASACQQEQ8QEhAQwBCyACQQEQGiIBIAAgAxAfGiAAIAM2AgQLIABB/wE6AA8gACACNgIIIAAgATYCAAtzAQF/IAAQJCAAEEtPBEAgAEEBEJEDCyAAECQhAgJAIAAQKARAIAAgAmogAToAACAAIAAtAA9BAWo6AA8gABAkQRBJDQFBk7YDQaD8AEGvAkHEsgEQAAALIAAoAgAgAmogAToAACAAIAAoAgRBAWo2AgQLC1UBAn8CQCAAKAIAIgIEQCABRQ0BIAAoAgQgARBAIgBGBH8gAiABIAAQgAIFQQELRQ8LQcHWAUGJ+wBBwABBhTwQAAALQZTWAUGJ+wBBwQBBhTwQAAALQAAgAEEAEL8CIgAoAvQDBEBBrThBn70BQdDDAEHIkwEQAAALIAAgAUH72gEgAhCeCSAAIAAoAtQEQQFrNgLUBAuzAwIEfwF+AkAgAgRAIAItAABBJUcEQCAAKAJMIgUoAgggASACIAMgBCAFKAIAKAIEEQgAIgUNAgsjAEEgayIFJAACQCAAKAJMQQIgASABQQNGG0ECdGooAiwiBkUNACAAIAIQhwoiCEUNACAFIAg2AhggBiAFQQQgBigCABEDACIGRQ0AIAMgBikDEDcDAEEBIQcLIAVBIGokACAHIgUNAQsgBEUNACACRSAAKAJMIgQoAgggAUEAIANBASAEKAIAKAIEEQgAIgVFcg0AIAMpAwAhCSMAQRBrIgQkAAJAQQFBIBBOIgMEQCADIAk3AxAgAyAAIAIQrAE2AhggACgCTCIHQQIgASABQQNGGyIGQQJ0IgJqKAIsIgEEfyAHBUGw7glBrO4JKAIAEKACIQEgACgCTCACaiABNgIsIAAoAkwLIAJqKAI4IgJFBEBByO4JQazuCSgCABCgAiECIAAoAkwgBkECdGogAjYCOAsgASADQQEgASgCABEDABogAiADQQEgAigCABEDABogBEEQaiQADAELIARBIDYCAEGI9ggoAgBB9ekDIAQQIBoQLwALCyAFC81fAgp8Bn8jAEGQAWsiDyQAAkACQAJAAkACQCAABEAgAUUNASACRQ0CIAMoAgAiEEUNAwJAIBBBCHEEQCAPIBA2AhQgDyAQNgIYQQAhAyABIAIgD0EUakEAEMkGIRAgACABIAIgBBBIA0AgAiADRkUEQCAPIBAgA0EwbGoiASkDKDcDKCAPIAEpAyA3AyAgDyABKQNINwM4IA8gAUFAaykDADcDMCAAIA9BIGpBAhA9IANBAWohAwwBCwsgEBAYDAELAkAgEEGA4B9xBEAgEEEMdkH/AHEiEUEaRw0BIAFBCGorAwAhBSAPIAEpAwg3AyggDyABKQMANwMgIA8gASsDEDkDMCAPIAUgBaAiBSABKwMYoTkDOCAPIAErAyA5A0AgDyAFIAErAyihOQNIIA8gASsDMDkDUCAPIAUgASsDOKE5A1ggDyABKwNAOQNgIA8gBSABKwNIoTkDaCAPIAErA1A5A3AgDyAFIAErA1ihOQN4IA8gASkDaDcDiAEgDyABKQNgNwOAASAAIAEgAiAEEPABIAAgD0EgakEHQQAQ8AEMAgsgEEEEcQRAIA8gEDYCDCAPIBA2AiAgASACIA9BDGpBARDJBiESIAJBBmxBAmpBEBAaIRFBACEDA0AgAiADRkUEQCARIBNBBHRqIgEgEiADQQZ0aiIQKQMANwMAIAEgECkDCDcDCCABIBApAxg3AxggASAQKQMQNwMQIAEgECkDGDcDKCABIBApAxA3AyAgASAQKQMoNwM4IAEgECkDIDcDMCABQUBrIBApAyA3AwAgASAQKQMoNwNIIAEgECkDODcDWCABIBApAzA3A1AgA0EBaiEDIBNBBmohEwwBCwsgESATQQR0aiIBIBEpAwA3AwAgASARKQMINwMIIBEgE0EBciIBQQR0aiICIBEpAxg3AwggAiARKQMQNwMAIAAgEUEQaiABIAQQ8AEgERAYIBIQGAwCCyAPQdsFNgIEIA9B3rkBNgIAQYj2CCgCAEHYvwQgDxAgGhA7AAsgDyADKAIANgIQIAEgAiAPQRBqQQAQyQYhEAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgEUEBaw4ZAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkLIAJBAWoiE0EQEBohEUEBIQMDQCACIANGBEAgESAQIAJBMGxqIgFBGGopAwA3AwggESABKQMQNwMAIBEgAkEEdGoiAyABQRBrIgJBCGopAwA3AwggAyACKQMANwMAIAAgESATIAQQSCAREBggDyACKQMINwMoIA8gAikDADcDICAPIAEpAxg3AzggDyABKQMQNwMwIA8gDysDMCAPKwMgIAErAwChoDkDQCAPIA8rAzggDysDKCABKwMIoaA5A0ggACAPQTBqQQIQPSAPIA8pA0g3AzggDyAPKQNANwMwIAAgD0EgakECED0MGgUgESADQQR0IhJqIhQgASASaiISKQMANwMAIBQgEikDCDcDCCADQQFqIQMMAQsACwALIAJBAmoiA0EQEBoiAiABKQMINwMIIAIgASkDADcDACACIBApAyA3AxAgAiAQKQMoNwMYIAIgECsDICAQKwMwIgYgECsDQKFEAAAAAAAACECjIgegOQMgIBArAyghCCAQKwNIIQkgECsDOCEFIAIgBiAHoDkDMCACIAUgBSAJoUQAAAAAAAAIQKMiBaA5AzggAiAIIAWgOQMoQQQgAyADQQRNGyERIAFBIGshE0EEIQEDQCABIBFGBEAgACACIAMgBBBIIAIQGCAPIBApAzg3AyggDyAQKQMwNwMgIA8gECkDKDcDOCAPIBApAyA3AzAgACAPQSBqQQIQPQwZBSACIAFBBHQiEmoiFCASIBNqIhIpAwA3AwAgFCASKQMINwMIIAFBAWohAQwBCwALAAsgAkEDaiIDQRAQGiICIAFBCGopAwA3AwggAiABKQMANwMAIAIgASsDACIFIAUgECsDEKEiBkQAAAAAAADQv6KgOQMQIAErAwghCCAQKwNIIQkgAiAQKwM4Igc5AzggAiAFIAZEAAAAAAAAAsCioDkDMCACIAUgBiAGoKE5AyAgAiAIIAcgCaFEAAAAAAAACECjoCIFOQMoIAIgBTkDGCAQKwMwIQUgAiAHOQNIIAIgBTkDQEEEIAMgA0EETRshESABQTBrIRNBBCEBA0AgASARRgRAIAAgAiADIAQQSCACEBgMGAUgAiABQQR0IhJqIhQgEiATaiISKQMANwMAIBQgEikDCDcDCCABQQFqIQEMAQsACwALIAJBBEcNG0EGQRAQGiICIAEpAwg3AwggAiABKQMANwMAIAIgECkDKDcDGCACIBApAyA3AxAgAiAQKQNINwMoIAIgECkDQDcDICACIAEpAyg3AzggAiABKQMgNwMwIAIgECkDgAE3A0AgAiAQKQOIATcDSCACIBApA6ABNwNQIAIgECkDqAE3A1ggACACQQYgBBBIIAIQGCAPIBArAxAgECsDsAEgECsDAKGgOQMgIA8gECsDGCAQKwO4ASAQKwMIoaA5AyggDyAQKQNINwM4IA8gECkDQDcDMCAAIA9BIGoiAUECED0gDyAQKQOIATcDOCAPIBApA4ABNwMwIAAgAUECED0gDyAQ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AgsgACABNwMAIAAgAjcDCAvbAQIBfwJ+QQEhBAJAIABCAFIgAUL///////////8AgyIFQoCAgICAgMD//wBWIAVCgICAgICAwP//AFEbDQAgAkIAUiADQv///////////wCDIgZCgICAgICAwP//AFYgBkKAgICAgIDA//8AURsNACAAIAKEIAUgBoSEUARAQQAPCyABIAODQgBZBEAgACACVCABIANTIAEgA1EbBEBBfw8LIAAgAoUgASADhYRCAFIPCyAAIAJWIAEgA1UgASADURsEQEF/DwsgACAChSABIAOFhEIAUiEECyAECxYAIABFBEBBAA8LQfyACyAANgIAQX8LCwAgACABIAIRAAALZAECfyMAQRBrIgMkAAJAIABBABCxAiIARQ0AAkACQAJAAkAgAQ4EAAECAgMLIAAoAhAhAgwDCyAAKAIIIQIMAgsgACgCDCECDAELIAMgATYCAEHExQQgAxA3CyADQRBqJAAgAgukAQIDfwJ8IwBBEGsiAiQAIAAQwQIgACgCECIBKwMYRAAAAAAAAFJAoyEEIAErAxBEAAAAAAAAUkCjIQUgABAcIQEDQCABBEAgASgCECgClAEiAyADKwMAIAWhOQMAIAMgAysDCCAEoTkDCCAAIAEQHSEBDAELCyACIAAoAhAiASkDGDcDCCACIAEpAxA3AwAgACACEMAMIABBARDKBSACQRBqJAALDwAgAUEBaiAAIAAQqgGfC6gBAgR/AnwgASgCACECIABBBGoiAyEAIAMhAQNAIAAoAgAiAARAIAAoAhAiBCsDCCIGIAIrAwgiB2MEQCAAQQRqIQAMAgUgACABIAAgAiAESyIEGyAGIAdkIgUbIQEgACAAIARBAnRqIAUbIQAMAgsACwsCQAJAIAEgA0YNACACKwMIIgYgASgCECIAKwMIIgdjDQAgACACTSAGIAdkcg0BCyADIQELIAELZAEBfyMAQRBrIgQkACAAQQA7ARwgAEEANgIYIAAgAzkDCCAAIAI2AgQgACABNgIAIAQgADYCDCABQTRqIARBDGoQwAEgACgCBCAEIAA2AghBKGogBEEIahDAASAEQRBqJAAgAAs8ACAAIAEQ0gIEQCAAEMMEDwsgABD9ByIBRQRAQQAPCyAAIAEQ/AchACABEG0gACAALQAkQQNyOgAkIAALrAEBAX8CQCAAECgE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IAUgBCsDCDkDECAFQShqIAMgFiAUIAsRHgBFBEAgBUIANwNYIAUgAzYCACAFIAc2AhggB0EBaiEHIAAgAxAdIQMMAQsLQZj/CigCABAYQZj/CkEANgIAENcMDAILQQAhByACQbADakEAQdAAEDgaIAUEQEGY/wooAgAhBET////////vfyEURP///////+//IRhE////////7/8hG0T////////vfyEZA0AgBSAHRgRARJqZmZmZmak/IRYCQCAAQdLkABAnIgBFDQAgAC0AAEUNACAAEK4CIRYLQbD/CiAbIBsgGaEgFqIiE6AiFzkDAEG4/wogGSAToSIVOQMAQaj/CiAUIBggFKEgFqIiE6EiFDkDAEGg/wogGCAToCITOQMAIAIgFTkD2AMgAiAXOQPoAyACIBU5A7gDIAIgEzkD0AMgAiAXOQPIAyACIBQ5A/ADIAIgEzkDwAMgAiAUOQPgAyABKAIAIQBBABDQByELAkACQCAAQQJGBEAgC0UNAiACQbADahDWDEEAIQMDQEGY/wooAgAhAUHk/gooAgAhAEEAIQQDQCAAIARHBEAgASAEQeAAbGoiCyALKwMIRM3MzMzMzPA/ojkDCCALIAsrAxBEzczMzMzM8D+iOQMQIARBAWohBAwBCwsgA0EBaiIDENAHDQALQezaCi0AAEUNASACIAM2AhBBiPYIKAIAQezdAyACQRBqECAaDAELIAtFDQEgAkGwA2oQ1gxBACEHQQAhBANAIAJBsANqIgEhACAHBEAgABDUDAtB+P4KQv////////93NwMAQfD+CkL/////////9/8ANwMAAkBB5P4KKAIAIgUEQCAAKAIAIQZE////////738hFET////////v/yEWQQAhAANAIAAgBUYNAkHw/gogFCAGIABBAnRqKAIAIgMrAwAQKSIUOQMAQfj+CiAWIAMrAwAQIyIWOQMAIABBAWohAAwACwALQeGVA0H8twFBzwFBzJIBEAAAC0GA/wogBigCACsDCDkDACAGIAVBAnRqQQRrKAIAKwMIIRNBkP8KIBYgFKE5AwBBiP8KIBM5AwBEAAAAAAAAAAAhFUQAAAAAAAAAACEUIwBBMGsiDiQAQQFBEBAaIg9B6P4KKAIAQQJ0IgA2AgQgDyAAQSgQGjYCAEHA/wogARDNBTYCACAOQgA3AyggDkIANwMg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AmRBByAHLwGMAkECdkEBcSAHKALoASAHKAL4ASAHKAKIAiAHKALcAUEAENoEIAAgCSgCECgCaEEGIAcvAYwCQQF2QQFxIAcoAuQBIAcoAvQBIAcoAoQCIAcoAtwBQQAQ2gQCQCAAKAI8IgFFDQAgASgCRCIBRQ0AIAAgAREBAAsgABCMBCAaEOwCIBoQGBAYCyACQeAVaiQADwtBsIMEQcIAQQFBiPYIKAIAEDoaEDsAC84GAQJ/IwBBgAJrIgMkACADQdABaiIEQYi/CEEwEB8aIAFCADcCAAJAAkACQAJAIAAgBBDeBA0AIAMoAtgBQQJJDQAgAyADKQPYATcDyAEgAyADKQPQATcDwAEgAygC0AEgA0HAAWpBABAZQRhsaigCAA0BC0EAIQBBACEBA0AgASADKALYAU8NAiADIAMpA9gBNwMgIAMgAykD0AE3AxggA0EYaiABEBkhAgJAAkAgAygC4AEiBA4CAQUACyADIAMoAtABIAJBGGxqIgIpAwg3AwggAyACKQMQNwMQIAMgAikDADcDACADIAQRAQALIAFBAWohAQwACwALIAMoAtgBQQNPBEBB95gEQQAQKgsgAyADKQPYATcDuAEgAyADKQPQATcDsAEgASADKALQASADQbABakEAEBlBGGxqKAIAEGQ2AgAgAyADKQPYATcDqAEgAyADKQPQATcDoAEgAygC0AEgA0GgAWpBARAZQRhsaigCAARAIAMgAykD2AE3A5gBIAMgAykD0AE3A5ABIAEgAygC0AEgA0GQAWpBARAZQRhsaigCABBkNgIECyADIAMpA9gBNwOIASADIAMpA9ABNwOAASADKALQASEBIANBgAFqQQAQGSEEIAMoAtABIQAgAgJ8IAEgBEEYbGotABBBAUYEQCADIAMpA9gBNwNYIAMgAykD0AE3A1AgACADQdAAakEAEBlBGGxqKwMIDAELIAMgAykD2AE3A3ggAyADKQPQATcDcEQAAAAAAAAAACAAIANB8ABqQQEQGUEYbGotABBBAUcNABogAyADKQPYATcDaCADIAMpA9ABNwNgRAAAAAAAAPA/IAMoAtABIANB4ABqQQEQGUEYbGorAwihCzkDAEEAIQFBASEAA0AgASADKALYAU8NASADIAMpA9gBNwNIIAMgAykD0AE3A0AgA0FAayABEBkhAgJAAkAgAygC4AEiBA4CAQQACyADIAMoAtABIAJBGGxqIgIpAwg3AzAgAyACKQMQNwM4IAMgAikDADcDKCADQShqIAQRAQALIAFBAWohAQwACwALIANB0AFqIgFBGBAxIAEQNCADQYACaiQAIAAPC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALrwEBAX8gACgCECIBRQRAQaT1AEGEuQFBiAFB0pEBEAAACyABKALcARAYIAEoAtgBEBggASgC4AEQGCABKALkARAYIAEoAugBEBggASgC7AEQGCABKALwARAYIAEoAvQBEBggASgC+AEQGCABKAL8ARAYIAEoAoACEBggASgChAIQGCABKAKIAhAYIAEoApgCEBggASgCpAIQGCABKAKgAhAYIAAgASgCADYCECABEBgLngEBAn9BuAIQxgMiASAAKAIQIgI2AgAgACABNgIQIAIEQCABQRBqIAJBEGpBKBAfGiABQThqIAJBOGpBKBAfGiABIAIoApgBNgKYASABIAIoApwBNgKcASABIAIrA6ABOQOgASABIAIoAogBNgKIASABQeAAaiACQeAAakEoEB8aIAEPCyABQoCAgICAgID4PzcDoAEgAUIDNwOYASABC6AGAQV/IwBBMGsiAyQAA0BBgOAKKAIAIAJNBEACQEH43wpBEBAxQZDgCiAAKAIAIgQpAwA3AwBBmOAKIAQpAwg3AwBB+N8KQRAQJiECQfjfCigCACACQQR0aiICQZDgCikDADcDACACQZjgCikDADcDCEGQ4AogBCkDADcDAEGY4AogBCkDCDcDAEH43wpBEBAmIQJB+N8KKAIAIAJBBHRqIgJBkOAKKQMANwMAIAJBmOAKKQMANwMIQQIgACgCBCIAIABBAk0bQQFrIQZBASECA0AgAiAGRg0BQZDgCiAEIAJBBHRqIgApAwA3AwBBmOAKIAApAwg3AwBB+N8KQRAQJiEFQfjfCigCACAFQQR0aiIFQZDgCikDADcDACAFQZjgCikDADcDCEGQ4AogACkDADcDAEGY4AogACkDCDcDAEH43wpBEBAmIQVB+N8KKAIAIAVBBHRqIgVBkOAKKQMANwMAIAVBmOAKKQMANwMIQZDgCiAAKQMANwMAQZjgCiAAKQMINwMAQfjfCkEQECYhAEH43wooAgAgAEEEdGoiAEGQ4AopAwA3AwAgAEGY4AopAwA3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qgIgA0EAOgAHIAIgBGogA0EHahDSASADQRBqJAAMAQsQygEACyAFQRBqJAALFwAgACADNgIQIAAgAjYCDCAAIAE2AggLDQAgACABIAJBARCiBwsSACAAIAEgAkL/////DxCwBacLzAEBA38jAEEgayIDQgA3AxggA0IANwMQIANCADcDCCADQgA3AwAgAS0AACICRQRAQQAPCyABLQABRQRAIAAhAQNAIAEiA0EBaiEBIAMtAAAgAkYNAAsgAyAAaw8LA0AgAyACQQN2QRxxaiIEIAQoAgBBASACdHI2AgAgAS0AASECIAFBAWohASACDQALAkAgACIBLQAAIgJFDQADQCADIAJBA3ZBHHFqKAIAIAJ2QQFxRQ0BIAEtAAEhAiABQQFqIQEgAg0ACwsgASAAawuAAQEEfyAAIABBPRC0BSIBRgRAQQAPCwJAIAAgASAAayIEai0AAA0AQYiBCygCACIBRQ0AIAEoAgAiAkUNAANAAkAgACACIAQQ6gFFBEAgASgCACAEaiICLQAAQT1GDQELIAEoAgQhAiABQQRqIQEgAg0BDAILCyACQQFqIQMLIAMLTgEBf0EBQRwQGiIGIAU6ABQgBiAAIAEQrAE2AggCfyADBEAgACACENUCDAELIAAgAhCsAQshBSAGIAA2AhggBiAENgIQIAYgBTYCDCAGCwkAIAC9QjSIpwuZAQEDfCAAIACiIgMgAyADoqIgA0R81c9aOtnlPaJE65wriublWr6goiADIANEff6xV+Mdxz6iRNVhwRmgASq/oKJEpvgQERERgT+goCEFIAAgA6IhBCACRQRAIAQgAyAFokRJVVVVVVXFv6CiIACgDwsgACADIAFEAAAAAAAA4D+iIAQgBaKhoiABoSAERElVVVVVVcU/oqChC5IBAQN8RAAAAAAAAPA/IAAgAKIiAkQAAAAAAADgP6IiA6EiBEQAAAAAAADwPyAEoSADoSACIAIgAiACRJAVyxmgAfo+okR3UcEWbMFWv6CiRExVVVVVVaU/oKIgAiACoiIDIAOiIAIgAkTUOIi+6fqovaJExLG0vZ7uIT6gokStUpyAT36SvqCioKIgACABoqGgoAuNAQAgACAAIAAgACAAIABECff9DeE9Aj+iRIiyAXXg70k/oKJEO49otSiCpL+gokRVRIgOVcHJP6CiRH1v6wMS1tS/oKJE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EC4BmgFsrHwhEAwBCwsgAkEBaiECDAALAAtBACEAA0AgDCAAQQJ0aigCACICBEAgCCACQVBBACACKAIAQQNxQQJHG2ooAigoAhAoAvgBIgVBAnRqIgogCigCACACKAIQLgGaAWo2AgAgBSABIAEgBUgbIQEgAEEBaiEADAELCyADQQFqIQMMAQsACwALIAZBEGokACARDwsgECARfCERDAALAAuDAQECfyAAIAFBARCNASIBKAIQQQA2AsQBQQUQnwghAiABKAIQIgNBADYCzAEgAyACNgLAAUEFEJ8IIQIgASgCECIDIAI2AsgBQdz9CigCACICIAAgAhsoAhBBuAFBwAEgAhtqIAE2AgAgAyACNgK8AUHc/QogATYCACADQQA2ArgBIAELuQEBA38gACAAQTBqIgIgACgCAEEDcUEDRhsoAigoAhAiASgC4AEgASgC5AEiAUEBaiABQQJqENoBIQEgACACIAAoAgBBA3FBA0YbKAIoKAIQIAE2AuABIAAgAiAAKAIAQQNxQQNGGygCKCgCECIBIAEoAuQBIgNBAWo2AuQBIAEoAuABIANBAnRqIAA2AgAgACACIAAoAgBBA3FBA0YbKAIoKAIQIgAoAuABIAAoAuQBQQJ0akEANgIACyAAIAAgASACIABBp4cBECciAAR/IAAQkQIFQR4LEP8OC00AIAEoAhBBwAFqIQEDQCABKAIAIgEEQCABKAIQKAKYAhAYIAEoAhAoAqACEBggASgCECIBQQA2ArABIAFBuAFqIQEMAQUgABD4DgsLCz8BAn8gACgCECgCqAIhAANAIAAiASgCDCIARSAAIAFGckUEQCAAKAIMIgJFDQEgASACNgIMIAIhAAwBCwsgAQsLACAAIAFBARCFDwsLACAAIAFBABCFDwuGAQECfwJAIAAgASkDCBC/A0UNACAAEDkgAEYEQCAAIAEQbiECA0AgAgRAIAAgAiABEHIgACACEI0GIQIMAQsLIAAtABhBIHEEQCABEMcLCyAAIAEQzwcgARCzByAAQQEgASkDCBC/BgsgACABQRJBAEEAEMgDDQAgABA5IABGBEAgARAYCwsLgwEBA38jAEEgayIBJAAgACgCECICKAIMIgNBDE8EQCABQeQANgIUIAFBibwBNgIQQYj2CCgCAEHYvwQgAUEQahAgGhA7AAsgASACKAIINgIIIAEgA0ECdCICQZjBCGooAgA2AgQgASACQcjBCGooAgA2AgAgAEGQCCABEB4gAUEgaiQACykBAX9Bor8BIQEgACAALQCQAUEBRgR/IAAoAowBKAIABUGivwELEBsaCyUAIAAgASgCABDnASAAIAJBASAAKAIAEQMAGiABIAAQ3AI2AgALEwAgAEGbywMgACgCEEEQahC+CAtzAQF/IAAQJCAAEEtPBEAgAEEBEN8ECyAAECQhAgJAIAAQKARAIAAgAmogAToAACAAIAAtAA9BAWo6AA8gABAkQRBJDQFBk7YDQaD8AEGvAkHEsgEQAAALIAAoAgAgAmogAToAACAAIAAoAgRBAWo2AgQLCzkAIAAgASgCABDnASAAIAJBAiAAKAIAEQMARQRAQd8TQeC9AUGiAUGd8AAQAAALIAEgABDcAjYCAAsvAQF/IADAIgFBAEggAUFfcUHBAGtBGkkgAUEwa0EKSXIgAEEta0H/AXFBAklycgvLAQEFfyAAKAIAIgJBAyABQQAQ0gMaIAIoAmAiAQRAIAAgASgCECIDKAIMIgU2AkwgACADKAIQIgQ2AlQgACADKAIAIgM2AlAgACABKAIENgJYIAAgACgCmAEgBCgCAHIiBDYCmAEgAigCVCIBBEAgACABKAIQIgIoAgw2AjwgACACKAIQIgY2AkQgACABKAIENgJIIAAgBigCACAEcjYCmAEgBQRAIAAgAigCADYCQEGsAg8LIAAgAzYCQEGsAg8LIABBADYCPAtB5wcLlwQCBH8DfCMAQfAAayIJJAAgACgCmAEhCyAJQgA3AzggCUIANwMwAkAgAUUNACABLQBRQQFHDQAgBwRAQcLwACEKAkACQAJAAkAgAkEGaw4GAAIBAQEDAQtBqPAAIQoMAgsgCUHXFjYCFCAJQYS5ATYCEEGI9ggoAgBB2L8EIAlBEGoQIBoQOwALQbLwACEKCyAJIAo2AiQgCSAHNgIgIAlBMGoiB0GpMyAJQSBqEH4gBxDEAyEKCyAAKAIQIgcoAgwhDCAHIAI2AgwgC0EEcSIHIAMgBHIiA0VyRQRAIAAgARDdCCAAIAQgBSAGIAoQxAELIANBAEcgACACIAEQkAMCQCAIRQ0AIAEoAgAhAgNAAkACQAJAIAItAAAiCw4OBAICAgICAgICAQEBAQEACyALQSBHDQELIAJBAWohAgwBCwsgASsDOCENIAErAxghDiAJIAFBQGsiAisDACABKwMgRAAAAAAAAOA/oqEiDzkDWCAJIA85A0ggCSANIA5EAAAAAAAA4D+ioCINOQNAIAkgDSAOoTkDUCAJIAIpAwA3AwggCSABKQM4NwMAIAlB4ABqIAggCRD8CSAAIAAoAgAoAsgCEOUBIAAgASgCCBBJIAAgCUFAa0EDED0LBEAgBwRAIAAgARDdCCAAIAQgBSAGIAoQxAELIAAQlwILIAlBMGoQXCAAKAIQIAw2AgwLIAlB8ABqJAALxA0BDn8jAEGAAmsiAyQAIAJBCHEhECACQQRxIQxBASENA0AgASgCECIEKAK0ASANTgRAIAQoArgBIA1BAnRqKAIAIQUCQAJAIAAoApwBQQJIDQAgACAFIAVBAEG3N0EAECJB8f8EEHoiBBCJBA0AIARB8f8EED5FDQEgBRAcIQQDQCAERQ0CIAAgBSAEEOMIDQEgBSAEEB0hBAwACwALIAwEQCAAIAUgAhDbBAtBASEOIAAQjQQiBEEBNgIMIAQgBTYCCCAEQQE2AgQgACAFKAIQKAIMIAUQowYCQCAAKAI8IgRFDQAgBCgCICIERQ0AIAAgBBEBAAsgACgCECIJKALYAUUEQCAJLQCMAkEBcSEOCyAFQaKYARAnEOwCIQ8gDCAORXJFBEAgAyAFKAIQIgQpAyg3A6ABIAMgBCkDIDcDmAEgAyAEKQMYNwOQASADIAQpAxA3A4gBIAAgA0GIAWoQ3QQgACAJKALYASAJKALsASAJKAL8ASAJKALcARDEAQtBACEKIANBADYCvAEgBSADQbwBahDkCCIEBH8gACAEEOUBIAMoArwBIgpBAXEFQQALIQdBASEEAkAgBSgCEC0AcCIGQQFxBEBBgbYBIQZBz5ADIQgMAQsgBkECcQRAQZjpASEGQaSSAyEIDAELIAZBCHEEQEHSjwMhBkHajwMhCAwBCyAGQQRxBEBBkOkBIQZBzZIDIQgMAQsgBUH1NhAnIgYEfyAGQQAgBi0AABsFQQALIgYhCCAFQeA2ECciCwRAIAsgBiALLQAAGyEICyAFQek2ECciCwRAIAsgBiALLQAAGyEGCyAKIAZBAEdxDQAgBUHzNhAnIgpFBEAgByEEDAELQQEgByAKLQAAIgcbIQQgCiAGIAcbIQYLIANCADcDsAEgBkHfDiAGGyEHAn9BACAERQ0AGiAHIANBsAFqIANBqAFqEIsEBEAgACADKAKwARBdIAAgAygCtAEiBEGF9QAgBBsgBUHI2wooAgBBAEEAEGIgAysDqAEQjgNBA0ECIAMtALwBQQJxGwwBCyAAIAcQXUEBCyEEAkBBxNsKKAIAIgZFDQAgBSAGEEUiBkUNACAGLQAARQ0AIAAgBUHE2wooAgBEAAAAAAAA8D9EAAAAAAAAAAAQTBCHAgsgCEGF9QAgCBshBgJAIAMoArwBIghBBHEEQCAFQcDbCigCAEEBQQAQYiIIIARyRQ0BIAMgBSgCECIHKQMQNwPAASADIAcpAxg3A8gBIAMgBykDKDcD6AEgAyAHKQMgNwPgASADIAMrA+ABOQPQASADIAMrA8gBOQPYASADIAMrA8ABOQPwASADIAMrA+gBOQP4ASAAIAZBux8gCBsQSSADIAMoArwBNgKEASAAIANBwAFqQQQgA0GEAWogBBCWAwwBCyAIQcAAcQRAIAMgBSgCECIEKQMQNwPAASADIAQpAxg3A8gBIAMgBCkDKDcD6AEgAyAEKQMgNwPgASADIAMrA+ABOQPQASADIAMrA8gBOQPYASADIAMrA8ABOQPwASADIAMrA+gBOQP4ASAAIAZBux8gBUHA2wooAgBBAUEAEGIbEEkgACADQcABaiAHQQAQpQZBAk8EQCADIAUQITYCgAFB7vIDIANBgAFqEIABCyADIAUoAhAiBCkDKDcDeCADIAQpAyA3A3AgAyAEKQMYNwNoIAMgBCkDEDcDYCAAIANB4ABqQQAQiAIMAQsgBUHA2wooAgBBAUEAEGIEQCAAIAYQSSADIAUoAhAiBykDKDcDWCADIAcpAyA3A1AgAyAHKQMYNwNIIAMgBykDEDcDQCAAIANBQGsgBBCIAgwBCyAERQ0AIABBux8QSSADIAUoAhAiBykDKDcDOCADIAcpAyA3AzAgAyAHKQMYNwMoIAMgBykDEDcDICAAIANBIGogBBCIAgsgAygCsAEQGCADKAK0ARAYIAUoAhAoAgwiBARAIABBBSAEEJADCyAOBEAgDARAIAMgBSgCECIEKQMoNwMYIAMgBCkDIDcDECADIAQpAxg3AwggAyAEKQMQNwMAIAAgAxDdBCAAIAkoAtgBIAkoAuwBIAkoAvwBIAkoAtwBEMQBCyAAEJcCCwJAIBBFDQAgBRAcIQYDQCAGRQ0BIAAgBhDCAyAFIAYQLCEEA0AgBARAIAAgBBCKBCAFIAQQMCEEDAELCyAFIAYQHSEGDAALAAsCQCAAKAI8IgRFDQAgBCgCJCIERQ0AIAAgBBEBAAsgABCMBCAMRQRAIAAgBSACENsECyAPEOwCEBggDxAYCyANQQFqIQ0MAQsLIANBgAJqJAALgwMCBXwDfyMAQZABayIIJAACQAJAIAErAwAiBCAAKwMQIgJkDQAgBCAAKwMAIgVjDQAgASsDCCIDIAArAxgiBGQNACADIAArAwgiBmMNACABKwMQIgMgAmQgAyAFY3INACABKwMYIgMgBGQgAyAGY3INACABKwMgIgMgAmQgAyAFY3INACABKwMoIgMgBGQgAyAGY3INACACIAErAzAiAmMgAiAFY3INACABKwM4IgIgBGQNACACIAZjRQ0BCyABEOgIBEAgACsDGCEFIAArAxAhBANAIAdBBEYNAgJAIAQgASAHQQR0aiIJKwMAIgJjBEAgACACOQMQIAIhBAwBCyACIAArAwBjRQ0AIAAgAjkDAAsCQCAFIAkrAwgiAmMEQCAAIAI5AxggAiEFDAELIAIgACsDCGNFDQAgACACOQMICyAHQQFqIQcMAAsACyAIIAFEAAAAAAAA4D8gCEHQAGoiASAIQRBqIgcQoQEgACABENwEIAAgBxDcBAsgCEGQAWokAAuhAQEDfwJAIAAoApgBIgNBgICEAnFFDQAgACgCECICQQJBBCADQYCACHEiBBs2ApQCIAIgBEEQdkECczYCkAIgAigCmAIQGCACIAIoApQCQRAQPyICNgKYAiACIAEpAwg3AwggAiABKQMANwMAIAIgASkDEDcDECACIAEpAxg3AxggA0GAwABxRQRAIAAgAiACQQIQmAIaCyAEDQAgAhCDBQsL1goCB38DfCMAQfABayICJAAgAkG4AWpBiL8IQTAQHxoCQCAABEACQANAIARBAUYNASAEQfviAWogBEH84gFqIQMgBEEBaiEELQAAIQYDQCADLQAAIgVFDQEgA0EBaiEDIAUgBkcNAAsLQfqyA0G4/ABBNUH48gAQAAALIAJB0AFqIQhEAAAAAAAA8D8hCSAAQfviARDJAiEFIAAhAwJAAkADQAJAAkAgAwRAAkACQAJ/IANBOyAFEPoCIgZFBEBEAAAAAAAAAAAhCiAFDAELIAZBAWoiBCACQewBahDhASIKRAAAAAAAAAAAZkUgAigC7AEgBEZyDQEgBiADawshBAJAIAogCaEiC0QAAAAAAAAAAGRFDQAgC0TxaOOItfjkPmNFBEBBzOIKLQAAQcziCkEBOgAAIAkhCkEBcQ0BIAIgADYCgAFB+8oDIAJBgAFqECpBAyEHCyAJIQoLIARFBEBBACEGDAILIAMgBBCQAiIGDQEgAiAEQQFqNgJwQYj2CCgCAEH16QMgAkHwAGoQIBoQLwALQQAhA0HM4gotAABBzOIKQQE6AABBASEHQQFxRQRAIAIgADYCsAFBpfcEIAJBsAFqEDdBAiEHCwNAIAIoAsABIANNBEAgAkG4AWoiAEEYEDEgABA0DAgFIAIgAikDwAE3A6gBIAIgAikDuAE3A6ABIAJBoAFqIAMQGSEBAkACQCACKALIASIADgIBDAALIAIgAigCuAEgAUEYbGoiASkDCDcDkAEgAiABKQMQNwOYASACIAEpAwA3A4gBIAJBiAFqIAARAQALIANBAWohAwwBCwALAAsgAiAKRAAAAAAAAAAAZDoA4AEgAiAKOQPYASACQQA2AtQBIAIgBjYC0AEgAkEANgDkASACQQA2AOEBIAJBuAFqQRgQJiEEIAIoArgBIARBGGxqIgQgCCkDADcDACAEIAgpAxA3AxAgBCAIKQMINwMIIAkgCqEiCZlE8WjjiLX45D5jRQ0BRAAAAAAAAAAAIQkLIAlEAAAAAAAAAABkRQ0DQQAhBEEAIQMMAQsgAyAFaiEEQQAhA0EAIQUgBCAAEEAgAGpGDQEgBEH74gEQqgQgBGoiA0H74gEQyQIhBQwBCwsDQCADIAIoAsABIgVPRQRAIAIgAikDwAE3AxAgAiACKQO4ATcDCCAEIAIoArgBIAJBCGogAxAZQRhsaisDCEQAAAAAAAAAAGVqIQQgA0EBaiEDDAELCyAEBEAgCSAEuKMhCkEAIQMDQCADIAVPDQIgAiACKQPAATcDaCACIAIpA7gBNwNgIAIoArgBIAJB4ABqIAMQGUEYbGoiACsDCEQAAAAAAAAAAGUEQCAAIAo5AwgLIANBAWohAyACKALAASEFDAALAAsgAiACKQPAATcDWCACIAIpA7gBNwNQIAIoArgBIAJB0ABqIAVBAWsQGUEYbGoiACAJIAArAwigOQMICwNAAkAgAigCwAEiAEUNACACIAIpA8ABNwNIIAIgAikDuAE3A0AgAigCuAEgAkFAayAAQQFrEBlBGGxqKwMIRAAAAAAAAAAAZA0AIAIgAikDwAE3AzggAiACKQO4ATcDMCACQTBqIAIoAsABQQFrEBkhBQJAAkAgAigCyAEiAA4CAQYACyACIAIoArgBIAVBGGxqIgUpAwg3AyAgAiAFKQMQNwMoIAIgBSkDADcDGCACQRhqIAARAQALIAJBuAFqIAhBGBC+AQwBCwsgASACQbgBakEwEB8aCyACQfABaiQAIAcPC0HD0wFBuPwAQS1B+PIAEAAAC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwAL6QEBBH8jAEEQayIEJAAgABBLIgMgAWoiASADQQF0QYAIIAMbIgIgASACSxshASAAECQhBQJAAkACQCAALQAPQf8BRgRAIANBf0YNAiAAKAIAIQIgAUUEQCACEBhBACECDAILIAIgARBqIgJFDQMgASADTQ0BIAIgA2pBACABIANrEDgaDAELIAFBARA/IgIgACAFEB8aIAAgBTYCBAsgAEH/AToADyAAIAE2AgggACACNgIAIARBEGokAA8LQY7AA0HS/ABBzQBBvbMBEAAACyAEIAE2AgBBiPYIKAIAQfXpAyAEECAaEC8ACwQAQQELrAEBBH8jAEEQayIEJAACQCAAKAIAIgNB/////wBJBEAgACgCBCADQQR0IgVBEGoiBhBqIgNFDQEgAyAFaiIFQgA3AAAgBUIANwAIIAAgAzYCBCAAIAAoAgAiAEEBajYCACADIABBBHRqIgAgAjkDCCAAIAE5AwAgBEEQaiQADwtBjsADQdL8AEHNAEG9swEQAAALIAQgBjYCAEGI9ggoAgBB9ekDIAQQIBoQLwAL8AIBBH8jAEEwayIDJAAgAyACNgIMIAMgAjYCLCADIAI2AhACQAJAAkACQAJAQQBBACABIAIQYCICQQBIDQAgAkEBaiEGAkAgABBLIAAQJGsiBSACSw0AIAYgBWshBSAAECgEQEEBIQQgBUEBRg0BCyAAIAUQkQNBACEECyADQgA3AxggA0IANwMQIAQgAkEQT3ENASADQRBqIQUgAiAEBH8gBQUgABBzCyAGIAEgAygCLBBgIgFHIAFBAE5xDQIgAUEATA0AIAAQKARAIAFBgAJPDQQgBARAIAAQcyADQRBqIAEQHxoLIAAgAC0ADyABajoADyAAECRBEEkNAUGTtgNBoPwAQeoBQfgeEAAACyAEDQQgACAAKAIEIAFqNgIECyADQTBqJAAPC0HGpgNBoPwAQd0BQfgeEAAAC0GtngNBoPwAQeIBQfgeEAAAC0H5zQFBoPwAQeUBQfgeEAAAC0GjngFBoPwAQewBQfgeEAAAC2gBA38jAEEQayIBJAACQCAAECgEQCAAIAAQJCIDEJACIgINASABIANBAWo2AgBBiPYIKAIAQfXpAyABECAaEC8ACyAAQQAQkgMgACgCACECCyAAQgA3AgAgAEIANwIIIAFBEGokACACCzMAIAAoAgAQGCAAKAIEEBggACgCCBAYIAAoAhAQGCAAKAIMEBggACgCFBAYIAAoAhgQGAvBAQEBfwJ/IAAoAhAiAigC2AFFBEBBACACLQCMAkEBcUUNARoLIAAQlwIgAigC2AELIgAgASgCAEcEQCAAEBggAiABKAIANgLYAQsgAigC7AEiACABKAIERwRAIAAQGCACIAEoAgQ2AuwBCyACKAL8ASIAIAEoAghHBEAgABAYIAIgASgCCDYC/AELIAIoAtwBIgAgASgCDEcEQCAAEBggAiABKAIMNgLcAQsgAiABLQAQIAIvAYwCQf7/A3FyOwGMAgvdBQEGfyMAQUBqIgUkACAAKAIQIQYgBUIANwM4IAVCADcDMCAEIAYoAtgBNgIAIAQgBigC7AE2AgQgBCAGKAL8ATYCCCAEIAYoAtwBNgIMIAQgBi0AjAJBAXE6ABACQCACKAIQIgQEQCAELQAADQELIAEoAjwiBEUEQCAAIAYoAgggBUEwahCnBhBkIQQgAUEBOgBAIAEgBDYCPAtB0N8KQdDfCigCACIBQQFqNgIAIAUgBDYCICAFIAE2AiQgBUEwaiEBIwBBMGsiBCQAIAQgBUEgaiIHNgIMIAQgBzYCLCAEIAc2AhACQAJAAkACQAJAAkBBAEEAQa6xASAHEGAiCkEASA0AIApBAWohBwJAIAEQSyABECRrIgkgCksNACAHIAlrIQkgARAoBEBBASEIIAlBAUYNAQsgASAJELcCQQAhCAsgBEIANwMYIARCADcDECAIIApBEE9xDQEgBEEQaiEJIAogCAR/IAkFIAEQcwsgB0GusQEgBCgCLBBgIgdHIAdBAE5xDQIgB0EATA0AIAEQKARAIAdBgAJPDQQgCARAIAEQcyAEQRBqIAcQHxoLIAEgAS0ADyAHajoADyABECRBEEkNAUGTtgNBoPwAQeoBQfgeEAAACyAIDQQgASABKAIEIAdqNgIECyAEQTBqJAAMBAtBxqYDQaD8AEHdAUH4HhAAAAtBrZ4DQaD8AEHiAUH4HhAAAAtB+c0BQaD8AEHlAUH4HhAAAAtBo54BQaD8AEHsAUH4HhAAAAsgARDTAiEECyAAQQAgAigCACACKAIMIAIoAgggBCAGKAIIEOwIIQEgBUEwahBcAkAgAUUNACAGKALYAUUEQCAGLQCMAkEBcUUNAQsgBSADKQMYNwMYIAUgAykDEDcDECAFIAMpAwg3AwggBSADKQMANwMAIAAgBRDdBCAAIAYoAtgBIAYoAuwBIAYoAvwBIAYoAtwBEMQBCyAFQUBrJAAgAQuaAQEDfyMAQRBrIgUkACAAKAIEIgBB3ABqKAAAIQQgACgCVCAFIAApAlw3AwggBSAAKQJUNwMAIAUgBEEBaxAZQQJ0aigCACIEIAE2AhQgBEEEECYhBiAEKAIAIAZBAnRqIAQoAhQ2AgAgASADNgJcIAAtAIQBQQJxBEAgASABLQBkQfwBcUEBcjoAZAsgASACNgJYIAVBEGokAAtCAQF/IwBBEGsiAiQAIAAoAiRFBEAgAEEBNgIkIAIgABCsBjYCBCACIAE2AgBBh/8EIAIQNyAAEJQJCyACQRBqJAAL5AEBA39BwAIhBEG8AiEFAkACQAJAIANBAWsOAgIBAAsgAEHaATYCoAJBuAIhBEG0AiEFDAELQcgCIQRBxAIhBQsCQAJAIAAgBGoiBigCACIEBEAgBiAEKAIINgIADAELIABBHEHuMRCYASIEDQBBASEGDAELIAFBgQI7ASAgACABQfUxELIGQQAhBiABQQA2AgwgBCAAIAVqIgUoAgA2AgggBSAENgIAIAQgAzYCGCAEIAE2AgwgACgC0AIhASAEIAI6ABQgBCABNgIQIARCADcCACADDQAgAEEBOgDgBEEADwsgBgtqAQF/IwBBEGsiBCQAIAQgAjYCDAJ/AkAgACgCDEUEQCAAEF9FDQELIABBDGohAgNAIAEgBEEMaiADIAIgACgCCCABKAI4EQgAQQJPBEAgABBfDQEMAgsLIAAoAhAMAQtBAAsgBEEQaiQAC0wBAn8gACgCACEBA0AgAQRAIAEoAgAgACgCFCABQcA+EGchAQwBCwsgACgCBCEBA0AgAQRAIAEoAgAgACgCFCABQcY+EGchAQwBCwsLbgEDfyMAQRBrIgEkAAJAIAAQqwQiAgRAQfyAC0EANgIAIAFBADYCDCACIAFBDGpBChCpBCEAAkBB/IALKAIADQAgAiABKAIMIgNGDQAgAy0AAEUNAgtB/IALQQA2AgALQQAhAAsgAUEQaiQAIAALSwECfyAAIAAoAhQgACgCDEECdGoiAigCACIBKAIQNgIcIAAgASgCCCIBNgIkIAAgATYCUCAAIAIoAgAoAgA2AgQgACABLQAAOgAYC9YFAQZ/AkAgAiABayIGQQJIDQACQAJAAkACQAJAAkACQAJ/IAEtAAAiB0UEQCAAIAEtAAEiBWotAEgMAQsgB8AgASwAASIFECsLQf8BcSIEQRNrDgYCBgYBBgEACwJAIARBBmsOAgQDAAsgBEEdRw0FIAVBA3ZBHHEgB0GggAhqLQAAQQV0ckGw8wdqKAIAIAV2QQFxRQ0FCyAAQcgAaiEJAkACQANAIAIgASIAQQJqIgFrIgZBAkgNCCAALQADIQUCQAJAAkACfyAALQACIgdFBEAgBSAJai0AAAwBCyAHwCAFwBArC0H/AXEiBEESaw4MBQoKCgMKAwMDAwoBAAsgBEEGaw4CAQMJCyAFQQN2QRxxIAdBoIIIai0AAEEFdHJBsPMHaigCACAFdkEBcQ0BDAgLCyAGQQJGDQUMBgsgBkEESQ0EDAULIABBBGohAUEJIQgMBAsgAiABQQJqIgRrQQJIDQQgAS0AAyIGwCEFAn8gASwAAiIHRQRAIAVB+ABGBEAgAiABQQRqIgRrQQJIDQcCfyAELAAAIgVFBEAgACABLQAFai0ASAwBCyAFIAEsAAUQKwtB/gFxQRhHBEAgBCEBDAcLIABByABqIQUgBCEBA0AgAiABIgBBAmoiAWtBAkgNCCAALQADIQQCfyAALAACIgZFBEAgBCAFai0AAAwBCyAGIATAECsLQf8BcSIEQRhrQQJJDQALIARBEkcNBiAAQQRqIQFBCiEIDAYLIAAgBmotAEgMAQsgByAFECsLQRlHBEAgBCEBDAQLIABByABqIQUgBCEBA0AgAiABIgBBAmoiAWtBAkgNBSAALQADIQQCfyAALAACIgZFBEAgBCAFai0AAAwBCyAGIATAECsLQf8BcSIEQRlGDQALIARBEkcNAyAAQQRqIQFBCiEIDAMLIAZBBEkNAQwCCyAGQQJHDQELQX4PCyADIAE2AgAgCA8LQX8LGwAgACgCTCIAKAIIIAEgAiAAKAIAKAIUEQUAC9YFAQZ/AkAgAiABayIGQQJIDQACQAJAAkACQAJAAkACQAJ/IAEtAAEiB0UEQCAAIAEtAAAiBWotAEgMAQsgB8AgASwAACIFECsLQf8BcSIEQRNrDgYCBgYBBgEACwJAIARBBmsOAgQDAAsgBEEdRw0FIAVBA3ZBHHEgB0GggAhqLQAAQQV0ckGw8wdqKAIAIAV2QQFxRQ0FCyAAQcgAaiEJAkACQANAIAIgASIAQQJqIgFrIgZBAkgNCCAALQACIQUCQAJAAkACfyAALQADIgdFBEAgBSAJai0AAAwBCyAHwCAFwBArC0H/AXEiBEESaw4MBQoKCgMKAwMDAwoBAAsgBEEGaw4CAQMJCyAFQQN2QRxxIAdBoIIIai0AAEEFdHJBsPMHaigCACAFdkEBcQ0BDAgLCyAGQQJGDQUMBgsgBkEESQ0EDAULIABBBGohAUEJIQgMBAsgAiABQQJqIgRrQQJIDQQgAS0AAiIGwCEFAn8gASwAAyIHRQRAIAVB+ABGBEAgAiABQQRqIgRrQQJIDQcCfyABLAAFIgFFBEAgACAELQAAai0ASAwBCyABIAQsAAAQKwtB/gFxQRhHBEAgBCEBDAcLIABByABqIQUgBCEBA0AgAiABIgBBAmoiAWtBAkgNCCAALQACIQQCfyAALAADIgZFBEAgBCAFai0AAAwBCyAGIATAECsLQf8BcSIEQRhrQQJJDQALIARBEkcNBiAAQQRqIQFBCiEIDAYLIAAgBmotAEgMAQsgByAFECsLQRlHBEAgBCEBDAQLIABByABqIQUgBCEBA0AgAiABIgBBAmoiAWtBAkgNBSAALQACIQQCfyAALAADIgZFBEAgBCAFai0AAAwBCyAGIATAECsLQf8BcSIEQRlGDQALIARBEkcNAyAAQQRqIQFBCiEIDAMLIAZBBEkNAQwCCyAGQQJHDQELQX4PCyADIAE2AgAgCA8LQX8LpQUBBX9BASEEAkAgAiABayIFQQBMDQACQAJAAkACQAJAAkACQAJAIABByABqIgYgAS0AAGotAAAiCEEFaw4DAQIDAAsgCEETaw4GAwUFBAUEBQsgBUEBRg0FIAAgASAAKALgAhEAAA0EIAAgASAAKALUAhEAAEUNBEECIQQMAwsgBUEDSQ0EIAAgASAAKALkAhEAAA0DIAAgASAAKALYAhEAAEUNA0EDIQQMAgsgBUEESQ0DIAAgASAAKALoAhEAAA0CIAAgASAAKALcAhEAAEUNAkEEIQQMAQsgAiABQQFqIgBrQQBMDQMgAC0AACIEQfgARgRAIAIgAUECaiIBa0EATA0EIAYgAS0AAGotAABB/gFxQRhHDQIDQCACIAEiAEEBaiIBa0EATA0FIAYgAS0AAGotAAAiBEEYa0ECSQ0ACyAEQRJHDQIgAEECaiEBQQohBwwCCyAEIAZqLQAAQRlHBEAgACEBDAILIAAhAQNAIAIgASIAQQFqIgFrQQBMDQQgBiABLQAAai0AACIEQRlGDQALIARBEkcNASAAQQJqIQFBCiEHDAELIAEgBGohAQNAIAIgAWsiBUEATA0DQQEhBAJAAkACQCAGIAEtAABqLQAAIghBEmsOCgIEBAQBBAEBAQEACwJAAkACQCAIQQVrDgMAAQIGCyAFQQFGDQYgACABIAAoAuACEQAADQUgACABIAAoAsgCEQAARQ0FQQIhBAwCCyAFQQNJDQUgACABIAAoAuQCEQAADQQgACABIAAoAswCEQAARQ0EQQMhBAwBCyAFQQRJDQQgACABIAAoAugCEQAADQMgACABIAAoAtACEQAARQ0DQQQhBAsgASAEaiEBDAELCyABQQFqIQFBCSEHCyADIAE2AgAgBw8LQX4PC0F/C/gDAQV/IAMgBE8EQEF8DwsgASgCSCEHAkACQAJAAkAgBCADQQFqRgRAQX8hBiABLQBFIglBA2tB/wFxQQNJDQMgAy0AACIIQe8BayIKQRBLQQEgCnRBgYAGcUVyDQEgAkUNAyAJRQ0CDAMLAkACQAJAIAMtAAEiCCADLQAAIglBCHRyIgZBgPgARwRAIAZBu98DRg0CIAZB/v8DRg0BIAZB//0DRw0DIAIEQCABLQBFRQ0GCyAFIANBAmo2AgAgByAAKAIQNgIAQQ4PCwJAIAEtAEUiBkEERwRAIAJFIAZBA0dyDQEMBgsgAg0FCyAHIAAoAhQiADYCAAwGCyACBEAgAS0ARUUNBAsgBSADQQJqNgIAIAcgACgCFDYCAEEODwsCQCACRQ0AIAEtAEUiBkEFSw0AQQEgBnRBOXENAwsgBCADQQJqRgRAQX8PCyADLQACQb8BRw0CIAUgA0EDajYCACAHIAAoAgg2AgBBDg8LIAlFBEAgAgRAIAEtAEVBBUYNAwsgByAAKAIQIgA2AgAMBAsgAiAIcg0BIAcgACgCFCIANgIAIAAgAyAEIAUgACgCABEGACEGDAILIAhFIAhBPEZyDQELIAcgACABLABFQQJ0aigCACIANgIADAELIAYPCyAAIAMgBCAFIAAgAkECdGooAgARBgALCABB4AQQpAoLJgAgACABQdzbCigCAEHx/wQQjwEiAEGF9QAgAC0AABsiABBJIAALigQCDXwDfyMAQUBqIhEkACABEC0oAkgoAhAoAnQhEiARIAEoAhAiEykDGDcDGCARIBMpAxA3AxAgEUEwaiARQRBqIBJBA3EiEhDhCSARIAIoAhAiAikDGDcDCCARIAIpAxA3AwAgEUEgaiARIBIQ4QkCQCADLQAhIhJFIBJBD0ZyRQRAAnwgAygCGCICBEAgAisDGCEGIAIrAxAhByACKwMAIQggAisDCAwBCyABEC0hAiABKAIQIhMrA1giBCATKwNQRAAAAAAAAOA/oiIFIAIoAhAtAHRBAXEiAhshBiAFIAQgAhshByAFmiIFIASaIgQgAhshCCAEIAUgAhsLIQkgCCAHoEQAAAAAAADgP6IhCiAJIAagRAAAAAAAAOA/oiEMQQAhEyARKwMoIQ0gESsDICEOIBErAzghDyARKwMwIRBBACECA0AgAkEERkUEQAJAIBIgAnZBAXFFDQAgCiEEIAkhBQJAAnwCQAJAAkAgAkEBaw4DAAECBAsgBwwCCyAGIQUMAgsgCAshBCAMIQULQQAgEyAQIASgIA6hIgQgBKIgDyAFoCANoSIEIASioCIEIAtjGw0AIAJBAnRBkPMHaigCACETIAQhCwsgAkEBaiECDAELCyADLQAhIRIMAQtBACETCyAAIAMoAiQ2AiQgASADKAIYIAAgEyASQQAQlgQaIBFBQGskAAs5AgF/AXwjAEEQayICJAAgACACQQxqEOEBIQMgAigCDCAARgR/QQEFIAEgAzkDAEEACyACQRBqJAALUgEDfyAAEOYJIABBBGohAgN/IAAoAgAQrQIiAUEwayEDIAFBLkYgA0EKSXIEfyACIAHAEJcDDAEFIAFBf0cEQCABIAAoAgAQ0wsLIAIQ6QkLCwvYAQECfyMAQRBrIgQkAEH83gpB/N4KKAIAIgVBAWo2AgAgBCABECE2AgQgBCAFNgIAIAJBmjMgBBCEASABEDkgAhD6BEEBEI0BIgJB/CVBwAJBARA2GiACKAIQQQE6AIYBIAEgAkEBEIUBGiADIABBARCFARpB8NsKIAIQLSACQcLwAEHx/wRB8NsKKAIAENQGNgIAQfzbCiACEC0gAkHHmQFBsy1B/NsKKAIAENQGNgIAQdjbCiACEC0gAkGhlgFBmhJB2NsKKAIAENQGNgIAIARBEGokACACC/0FAgZ/AXwgAEHU2wooAgBEAAAAAAAA6D9EexSuR+F6hD8QTCEHIAAoAhAgBzkDICAAQdDbCigCAEQAAAAAAADgP0R7FK5H4XqUPxBMIQcgACgCECAHOQMoAn8gAEHY2wooAgBB+5IBEI8BIQIjAEEgayIDJAAgAEHImgEQJxD7BARAIAJBnewAIAJBkYMBED4bIQILAkACQAJAAkAgAkGd7AAQPg0AQfD+CSEBA0AgASgCACIERQ0BIAQgAhA+DQIgAUEQaiEBDAALAAsgAhDHBiIBDQBBnN8KQZzfCigCACIEQQFqIgE2AgAgBEH/////A08NAUGY3wooAgAgAUECdCIBEGoiBUUNAiABIARBAnQiBksEQCAFIAZqQQA2AAALQZjfCiAFNgIAQRAQUiEBQZjfCigCACAEQQJ0aiABNgIAIAFB+P4JKQMANwIIIAFB8P4JKQMANwIAIAEgAhClATYCAEEBIQQCQEHg2gooAgANACACQZ3sABA+DQAgASgCACECQQAhBCADQfD+CSgCADYCECADIAI2AhRBr/oDIANBEGoQKgsgASAEOgAMCyADQSBqJAAgAQwCC0GOwANB0vwAQc0AQb2zARAAAAsgAyABNgIAQYj2CCgCAEH16QMgAxAgGhAvAAshASAAKAIQIAE2AgggAEHw2wooAgAQRSEBIABB5NsKKAIARAAAAAAAACxARAAAAAAAAPA/EEwhByAAQejbCigCAEHq6QAQjwEhAiAAQezbCigCAEGF9QAQjwEhAyAAIAEgARB2QQBHIAAQ5QJBAkYgByACIAMQ2wIhASAAKAIQIAE2AngCQEH02wooAgAiAUUNACAAIAEQRSIBRQ0AIAEtAABFDQAgACABIAEQdkEAR0EAIAcgAiADENsCIQEgACgCECABNgJ8IAAQLSgCECIBIAEtAHFBEHI6AHELIABBgNwKKAIAQQBBABBiIQEgACgCECICQf8BIAEgAUH/AU4bOgCgASAAIAIoAggoAgQoAgARAQALRAACQCAAECgEQCAAECRBD0YNAQsgAEEAEH8LAkAgABAoBEAgAEEAOgAPDAELIABBADYCBAsgABAoBH8gAAUgACgCAAsLlAYBBH8jAEGQAWsiASQAAkACQCAARQ0AIAAtAABFDQBB8NoKKAIAIgMEQEG+3gotAAANASABIAM2AnBB/vkEIAFB8ABqECpBvt4KQQE6AAAMAQtBwN4KKAIAIQMCQEHk2gooAgAEQCADDQEDQEHM3gooAgAgAk0EQEHE3gpBCBAxQcTeChA0QcDeCkHk2gooAgAiAjYCACABQfQAaiACEP4JQdzeCiABKAKMATYCAEHU3gogASkChAE3AgBBzN4KIAEpAnw3AgBBxN4KIAEpAnQ3AgAMAwUgAUHM3gopAgA3A0ggAUHE3gopAgA3A0AgAUFAayACEBkhAwJAAkBB1N4KKAIAIgQOAgEHAAsgAUHE3gooAgAgA0EDdGopAgA3AzggAUE4aiAEEQEACyACQQFqIQIMAQsACwALAkAgA0Ho2gooAgBGDQADQEHM3gooAgAgAk0EQEHE3gpBCBAxQcTeChA0QcDeCkHo2gooAgAiAjYCACACRQ0CIAItAABFDQIgAUH0AGogAhD+CUHc3gogASgCjAE2AgBB1N4KIAEpAoQBNwIAQczeCiABKQJ8NwIAQcTeCiABKQJ0NwIABSABQczeCikCADcDMCABQcTeCikCADcDKCABQShqIAIQGSEDAkACQEHU3gooAgAiBA4CAQcACyABQcTeCigCACADQQN0aikCADcDICABQSBqIAQRAQALIAJBAWohAgwBCwsLAkAgAC0AAEEvRg0AQczeCigCAEUNACABQdzeCigCADYCGCABQdTeCikCADcDECABQczeCikCADcDCCABQcTeCikCADcDACABIAAQ/QkhAgwCCyAAIQIMAQtBACECA0AgAkEDRwRAIAAgAkH54gFqLAAAIAAQQEEBahDkCyIDQQFqIAAgAxshACACQQFqIQIMAQsLIAFB3N4K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AUEHcXRyOgAADwtBl7IDQe/6AEHRAEHfIRAAAAtQAQF/IAEoAhAoApwBRQRAQQAPCyAAIAFBMEEAIAEoAgBBA3FBA0cbaigCKBDDDgR/IAAgAUFQQQAgASgCAEEDcUECRxtqKAIoEMMOBUEACws1AQJ/AkAgABAcIgFFBEAMAQsgARCGAiECA0AgACABEB0iAUUNASACIAEQnggaDAALAAsgAguGAwEDfyABIAFBMGoiAyABKAIAQQNxQQNGGygCKCgCECICKALQASACKALUASICQQFqIAJBAmoQ2gEhAiABIAMgASgCAEEDcUEDRhsoAigoAhAgAjYC0AEgASADIAEoAgBBA3FBA0YbKAIoKAIQIgIgAigC1AEiBEEBajYC1AEgAigC0AEgBEECdGogATYCACABIAMgASgCAEEDcUEDRhsoAigoAhAiAygC0AEgAygC1AFBAnRqQQA2AgAgASABQTBrIgMgASgCAEEDcUECRhsoAigoAhAiAigC2AEgAigC3AEiAkEBaiACQQJqENoBIQIgASADIAEoAgBBA3FBAkYbKAIoKAIQIAI2AtgBIAEgAyABKAIAQQNxQQJGGygCKCgCECICIAIoAtwBIgRBAWo2AtwBIAIoAtgBIARBAnRqIAE2AgAgASADIAEoAgBBA3FBAkYbKAIoKAIQIgEoAtgBIAEoAtwBQQJ0akEANgIAIAAoAhBBAToA8AEgABBhKAIQQQE6APABC4ABAQJ/QcABIQMgACECA0AgAigCECADaigCACICBEBBuAEhAyABIAJHDQELCyACBEAgASgCECICKAK8ASEBIAIoArgBIgIEQCACKAIQIAE2ArwBCyABIAAgARsoAhBBuAFBwAEgARtqIAI2AgAPC0GbpANBq7oBQb8BQdyfARAAAAsJAEEBIAAQ1AILYQEEfyAAKAIEIQQCQANAIAIgBEYNASACQQJ0IAJBAWohAiAAKAIAIgVqIgMoAgAgAUcNAAsgACAEQQFrIgE2AgQgAyAFIAFBAnQiAWooAgA2AgAgACgCACABakEANgIACwtDAAJAIAAQKARAIAAQJEEPRg0BCyAAEI4PCwJAIAAQKARAIABBADoADwwBCyAAQQA2AgQLIAAQKAR/IAAFIAAoAgALC3QBAn8jAEEgayICJAACQCAArSABrX5CIIhQBEAgACABEE4iA0UNASACQSBqJAAgAw8LIAIgATYCBCACIAA2AgBBiPYIKAIAQabqAyACECAaEC8ACyACIAAgAWw2AhBBiPYIKAIAQfXpAyACQRBqECAaEC8AC7cNAgh/A3wjAEHAAmsiBCQAAkAgABA5IgkgACgCAEEDcSIKQQAQ5QMiBUUNAANAIAVFDQECQCAAIAUQRSIDRQ0AIAMtAABFBEAgBSgCCEHC8AAQPkUNAQsgAUG57QQQGxogASACKAIAEEQgBSgCCCACIAEQuwIgAUGTzQMQGxoCQCACLQAFQQFHDQACQCAFKAIIIgNBwcMBED4NACADQbHDARA+DQAgA0G5wwEQPg0AIANBl8MBED4NACADQajDARA+DQAgA0GfwwEQPkUNAQsgACAFEEUiA0UNASADLQAARQ0BIANBABCQCiIIRQRAIAQgAzYCAEHK+gQgBBAqDAILIAFB7v8EEBsaIAIgAigCACIDQQFqNgIAIAEgAxBEIAFB/s0EEBsaQQAhBwNAIAgoAgAgB00EQCACIAIoAgBBAWs2AgAgAUHu/wQQGxogASACKAIAEEQgAUH+yAEQGxogCBCOCgwDCyAHBEAgAUG57QQQGxoLIAgoAgghAyACIAIoAgAiBkEBajYCACABIAYQRCABQfDYAxAbGiABIAIoAgAQRAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADIAdB0ABsaiIDKAIAIgYOEAoKAAABAQIDBAQGBwsFBQgJCyAEQdAAQfAAIAZBAkYbNgJQIAFB7+wEIARB0ABqEB4gASACKAIAEEQgASADQQhqELQIDAoLIARBwgBB4gAgBkEERhs2AmAgAUHv7AQgBEHgAGoQHiABIAIoAgAQRCABIANBCGoQtAgMCQsgAUGk7QRBABAeIAEgAigCABBEIAEgA0EIahC0CAwICyABQYztBEEAEB4gASACKAIAEEQgAysDCCELIAQgAysDEDkDmAEgBCALOQOQASABQffqBCAEQZABahAeIAEgAigCABBEIARB4wBB8gAgAygCGCIGQQFGG0HsACAGGzYCgAEgAUH87AQgBEGAAWoQHiABIAIoAgAQRCAEIAMrAyA5A3AgAUG76gQgBEHwAGoQHiABIAIoAgAQRCABQdfMAxAbGiADKAIoIAIgARC7AiABQQoQZQwHCyAEQcMAQeMAIAZBCEYbNgKgASABQe/sBCAEQaABahAeIAEgAigCABBEIAFBo+wEQQAQHiABIAIoAgAQRCABQfDMAxAbGiADKAIIIAIgARC7AiABQQoQZQwGCyAEQcMAQeMAIAZBDUYbNgKQAiABQe/sBCAEQZACahAeIAEgAigCABBEAkACQAJAIAMoAggOAgABAgsgAUGj7ARBABAeIAEgAigCABBEIAFB8MwDEBsaIAMoAhAgAiABELsCIAFBChBlDAcLIAFB/esEQQAQHiABIAIoAgAQRCABIAIoAgAQRCADKwMQIQsgBCADKwMYOQOIAiAEIAs5A4ACIAFBo+sEIARBgAJqEB4gASACKAIAEEQgAysDICELIAQgAysDKDkD+AEgBCALOQPwASABQY3rBCAEQfABahAeIAEgAigCABBEIAEgAygCMCADKAI0IAIQkA8MBgsgAUGQ7ARBABAeIAEgAigCABBEIAEgAigCABBEIAMrAxAhCyADKwMYIQwgBCADKwMgOQPgASAEIAw5A9gBIAQgCzkD0AEgAUHV6wQgBEHQAWoQHiABIAIoAgAQRCADKwMoIQsgAysDMCEMIAQgAysDODkDwAEgBCAMOQO4ASAEIAs5A7ABIAFBuesEIARBsAFqEB4gASACKAIAEEQgASADKAJAIAMoAkQgAhCQDwwFCyABQbDtBEEAEB4gASACKAIAEEQgBCADKwMIOQOgAiABQczqBCAEQaACahAeIAEgAigCABBEIAFBjc0DEBsaIAMoAhAgAiABELsCIAFBChBlDAQLIAFBmO0EQQAQHiABIAIoAgAQRCABQYPNAxAbGiADKAIIIAIgARC7AiABQQoQZQwDCyABQfHrBEEAEB4gASACKAIAEEQgBCADKAIINgKwAiABQe7HBCAEQbACahAeDAILIARBsgI2AhQgBEGFuwE2AhBBiPYIKAIAQdi/BCAEQRBqECAaEDsACyAEQeUAQcUAIAYbNgJAIAFB7+wEIARBQGsQHiABIAIoAgAQRCADKwMIIQsgAysDECEMIAMrAxghDSAEIAMrAyA5AzggBCANOQMwIAQgDDkDKCAEIAs5AyAgAUHJygQgBEEgahAeCyACIAIoAgBBAWsiAzYCACABIAMQRCABQa8IEBsaIAdBAWohBwwACwALIAAgBRBFIAIgARC7AgsgCSAKIAUQ5QMhBQwACwALIARBwAJqJAAL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IAM2AgAgAUEgakG4MiABEIQBA0AgAi0AACACQQFqIQINAAtBuqADIQMMAQUgAUEgakEpEH8LCwsgAEGsywMgAUEgahDCARDAAwwACwALIAFBIGoQXCABQTBqJAALaQECfyMAQRBrIgMkACADQgA3AwggA0IANwMAA0ACQCACLQAAIgRB3ABHBEAgBA0BIAAgASADEMIBEHEgAxBcIANBEGokAA8LIANB3AAQfyACLQAAIQQLIAMgBMAQfyACQQFqIQIMAAsAC5ICAQV/IAAQhwUhAyAAECQhAQJAAkACQANAIAEiAkUNASADIAFBAWsiAWotAABBLkcNAAsgABAkIQEDQCABQQFrIQUgASACRwRAIAMgBWotAABBMEcNAgsCQCAAECgEQCAALQAPIgRFDQQgACAEQQFrOgAPDAELIAAgACgCBEEBazYCBAsgASACRyAFIQENAAsgABAkIgFBAkkNACABIANqIgFBAmsiAi0AAEEtRw0AIAFBAWstAABBMEcNACACQTA6AAAgABAoBEAgAC0ADyIBRQ0DIAAgAUEBazoADw8LIAAgACgCBEEBazYCBAsPC0HijwNBoPwAQZIDQegqEAAAC0HijwNBoPwAQagDQegqEAAAC8cBAQN/IwBBEGsiAiQAIAFBUEEAIAEoAgBBA3FBAkcbaiIBQVBBACABKAIAQQNxIgNBAkcbaigCKCEEIAFBMEEAIANBA0cbaigCKCEDIAIgASkDCDcDCCACIAEpAwA3AwACQCAAIAMgBCACENkCRQ0AIAAQOSAARgRAIAAtABhBIHEEQCABEMcLCyAAIAEQzwcgARCzByAAQQIgASkDCBC/BgsgACABQQ9BAEEAEMgDDQAgABA5IABGBEAgARAYCwsgAkEQaiQACxoAIAAgARCsASIBIAIQwQMgACABQQAQjAEaC0UAIAAgAUG+zgMgAisDAEQAAAAAAABSQKMQjQMgACABQb7OAyADIAIrAwgiA6EgA0G42wotAAAbRAAAAAAAAFJAoxCNAwt9AQN/IwBBMGsiAiQAIAAQISEDIAAQLSEEAkACQCADBEBBfyEAIAQgASADEJIGQX9HDQEMAgsgAiAAKQMINwMAIAJBEGoiA0EeQdTPASACELQBGkF/IQAgASADIAQoAkwoAgQoAgQRAABBf0YNAQtBACEACyACQTBqJAAgAAvN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ABCPATYCuAJBAEHk2wooAgBEAAAAAAAALEBEAAAAAAAA8D8QTCEOIABBnKAKNgLIAiAAIA45A8ACIAAgARAhNgK0ASAAKAKoAhAYIABBADYCqAIgACgCrAIQGCAAQQA2AqwCIAAoArQCEBggAEEANgK0AgJAAkAgAUGqKRAnIgUEQCAAIAFB/doAECciAkG8zgMgAhs2AqACIAAgAUHw2gAQJyICQbqgAyACGyIENgKkAiAAKAKgAiICIAQQyQIgAmoiAkEAIAItAAAbIgIEQCADIAIsAAA2AtACQYLkBCADQdACahAqIABB8f8ENgKkAgsgACAFEGQ2AqgCIANCADcD0AQgA0IANwPIBCADQgA3A8AEIANBwARqQQQQJiECIAMoAsAEIAJBAnRqIAMoAtQENgIAIAAoAqgCIQIDQCACIAAoAqACELEFIgIEQCADIAI2AtQEIANBwARqQQQQJiECIAMoAsAEIAJBAnRqIAMoAtQENgIAQQAhAgwBCwsgAygCyAQiAkEBayIFQQBIDQIgAkECTwRAIANBADYC1AQgA0HABGoiBEEEECYhAiADKALABCACQQJ0aiADKALUBDYCACAEIABBrAJqQQBBBBDHAQtBACECA0AgAygCyAQgAksEQCADIAMpA8gENwO4AiADIAMpA8AENwOwAiADQbACaiACEBkhCQJAAkACQCADKALQBCIEDgICAAELIAMoAsAEIAlBAnRqKAIAEBgMAQsgAygCwAQgCUECdGooAgAgBBEBAAsgAkEBaiECDAELCyADQcAEaiICQQQQMSACEDQgACAFNgKwAiABQZEkECciBUUNASAFLQAARQ0BQQAhBiAAKAKwAkECakEEED8hB0EBIQIDQCAAKAKwAiIEIAJOBEAgACACIAQgBRDfCARAIAcgBkEBaiIGQQJ0aiACNgIACyACQQFqIQIMAQsLAkAgBgRAIAcgBjYCACAHIAZBAnRqIARBAWo2AgQMAQsgAyAFNgLAAkHA5QQgA0HAAmoQKiAHEBhBACEHCyAAIAc2ArQCDAELIABBATYCsAILQQEQ2gIgA0GoBGohDCADQcgEaiENQYC/CCgCACEIIAAgACgCmAEiAjYCnAEDQAJAAkACQCACBEACfyAAKAI8IgRFBEBBACEGQQAMAQsgBCgCDCEGIAQoAggLIQQgAiAGNgIYIAIgBDYCFCACIAA2AgwgACgCsAEhBCACIAg2AtgEIAJB8J4KNgLUBCACIAQ2AhwgASgCECgCCEUEQEGFsARBABA3QQAQ2gJBfyECQezaCi0AAEUNCEGI9ggoAgAiBhDVASADENYBNwPABCADQcAEahDrASIIKAIUIQcgCCgCECEJIAgoAgwhBSAIKAIIIQQgCCgCBCEAIAMgCCgCADYCjAEgAyAANgKIASADIAQ2AoQBIAMgBTYCgAEgA0GIITYCdCADQYS5ATYCcCADIAlBAWo2AnwgAyAHQewOajYCeCAGQcbKAyADQfAAahAgGiABECEhACADEI4BOQNoIAMgADYCYCAGQf6eAyADQeAAahAzQQogBhCnARogBhDUAQwICyACIAIgAigCNBDZBCIENgI4QQEhBgJAIARBFUYNACAEQecHRgRAIAMgAigCNDYCoAJB97AEIANBoAJqEDdBABDaAkF/IQJB7NoKLQAARQ0JQYj2CCgCACIGENUBIAMQ1gE3A8AEIANBwARqEOsBIggoAhQhByAIKAIQIQkgCCgCDCEFIAgoAgghBCAIKAIEIQAgAyAIKAIANgKcAiADIAA2ApgCIAMgBDYClAIgAyAFNgKQAiADQZAhNgKEAiADQYS5ATYCgAIgAyAJQQFqNgKMAiADIAdB7A5qNgKIAiAGQcbKAyADQYACahAgGiABECEhACADEI4BOQP4ASADIAA2AvABIAZB/p4DIANB8AFqEDNBCiAGEKcBGiAGENQBDAkLAkAgAUG9ORAnIgRFDQAgBEG9GRBNRQ0BIARBshkQTQ0AQRAhBgwBC0EAIQYLIAIgAigCmAEgBnI2ApgBAkAgACgCuAEiBARAIAQtAJgBQSBxBEAgAigCNCAEKAI0EE1FDQILIAQQhwQgAEEANgIcIABBADYCuAELQcjiCkEANgIADAILQcjiCigCACIERQ0BIAQgAjYCCCACIAQoAiQ2AiQMAgtBACECQQAQ2gJB7NoKLQAARQ0GQYj2CCgCACIGENUBIAMQ1gE3A8AEIANBwARqEOsBIggoAhQhByAIKAIQIQkgCCgCDCEFIAgoAgghBCAIKAIEIQAgAyAIKAIANgJcIAMgADYCWCADIAQ2AlQgAyAFNgJQIANB3CE2AkQgA0GEuQE2AkAgAyAJQQFqNgJMIAMgB0HsDmo2AkggBkHGygMgA0FAaxAgGiABECEhACADEI4BOQM4IAMgADYCMCAGQf6eAyADQTBqEDNBCiAGEKcBGiAGENQBDAYLIAIoAjwhBkEBIQcjAEFAaiIKJAAgAigCACEFAn8CQAJAAkAgAigCTCIERQ0AIAQoAgAiBEUNACACIAQRAQAMAQsgAigCKA0AIAIoAiQNAAJAIAUtAA1FBEAgAigCICEFDAELQajeCiACKAIUIgRBkBcgBBsQkAUgAigCGCIEBEAgCiAEQQFqNgIwQajeCkHasQEgCkEwahCPBQtBqN4KQS4QygMgAigCNCILEEAgC2oiBCEFA0AgBS0AAEE6RgRAIAogBUEBajYCJCAKIAVBf3MgBGo2AiBBqN4KQZqfAyAKQSBqEI8FIAUhBAsgBSALRyAFQQFrIQUNAAsgCiALNgIUIAogBCALazYCEEGo3gpBszIgCkEQahCPBSACQajeChCNBSIFNgIgCyAFBEAgAiAFQe4WEJ8EIgQ2AiQgBA0BIAIoAgwoAhAhBSACKAIgIQQgCkH8gAsoAgAQswU2AgQgCiAENgIAQduBBCAKIAURBAAMAgsgAkGQ9ggoAgA2AiQLQQAgAi0AmQFBBHFFDQEaQf7eBEEAIAIoAgwoAhARBAALQQELIQQgCkFAayQAAkAgBA0AQQAhByAGRQ0AIAYoAgAiBEUNACACIAQRAQALIAcNASAAIAI2ArgBCyACQeCfCjYCaCACQQA2AggCQCACKAIAIgUtAJwCQQFGBEAgAiAFKQPQATcD8AEgAiAFKQPYATcD+AEMAQsgAigCOEGsAkYEQCACIAIoAkQrAwgiDjkD+AEgAiAOOQPwAQwBCyACQoCAgICAgICIwAA3A/ABIAJCgICAgICAgIjAADcD+AELAkAgBS0AnQJBAUYEQCACIAUpA8ABNwOgAyACIAUpA8gBNwOoAwwBCyACKAI4IgRBHktBASAEdEGYgICDBHFFckUEQCACQoCAgICAgIChwAA3A6ADIAJCgICAgICAgKHAADcDqAMMAQsgBEGsAkYEQCACIAIoAlQiBCkDCDcDoAMgAiAEKQMQNwOoAwwBCyACQgA3A6ADIAJCADcDqAMLAkAgASgCECgCCCsDGCIORAAAAAAAAAAAZARAIAIgDjkDsAMgAiAOOQO4AwwBCwJAIAUoArgBIgRFDQAgBC0AgAFBAUcNACACIAQpA3A3A7ADIAIgBCkDeDcDuAMMAQsgAigCOEGsAkYEQCACIAIoAlQiBCkDKDcDsAMgAiAEKQMwNwO4AwwBCyACQoCAgICAgICswAA3A7ADIAJCgICAgICAgKzAADcDuAMLIAUrA/gBIRcgBSsDgAIhFiAFKwOIAiESIAIgBSsDkAIiFSACKwD4ASIToCIUOQPoASACIBIgAisA8AEiDqAiDzkD4AEgAiAWIBOhIhM5A9gBIAIgFyAOoSIOOQPQASADQoCAgICAgID4PzcD+AQgFCAToSEQIA8gDqEhD0QAAAAAAADwPyERAkAgASgCECgCCCIEKwNAIhNE/Knx0k1iUD9kRQ0AIAQrA0giDkT8qfHSTWJQP2RFDQAgEyATIA8gD0T8qfHSTWJQP2UbIg9jIA4gDiAQIBBE/Knx0k1iUD9lGyIQY3JFBEAgDiAQZEUgDyATY0VyDQEgBC0AUEEBcUUNAQsgAyATIA+jIA4gEKMQKSIROQP4BAsgAyAVIBagRAAAAAAAAOA/ojkDyAQgAyASIBegRAAAAAAAAOA/ojkDwAQgAiAFKAKYAjYC6AIgAyARIBCiOQOoBCADIBEgD6I5A6AEIAFByhsQJyIEBEAgAyAEEEBBAWoQxgMiBTYC7AEgAyAMNgLkASADIANB+ARqNgLoASADIANBoARqNgLgAQJAIARB4KwDIANB4AFqEFFBBEYEQCABKAJIIAVBABCNASIERQ0BIAMgBCgCECIEKQMYNwPIBCADIAQpAxA3A8AEDAELIANBADoA9wQgAyAMNgLEASADIAU2AswBIAMgA0H3BGo2AtABIAMgA0GgBGo2AsABIAMgA0H4BGo2AsgBIARBir8BIANBwAFqEFFBBEYEQCABKAJIIAVBABCNASIERQ0BIAMgBCgCECIEKQMYNwPIBCADIAQpAxA3A8AEDAELIAMgDTYCsAEgAyAMNgKkASADIANBwARqNgKsASADIANB+ARqNgKoASADIANBoARqNgKgASAEQdCDASADQaABahBRGgsgBRAYIAMrA/gEIRELIAIgAykDoAQ3A/ACIAIgAykDqAQ3A/gCIAIgETkD4AIgAiADKQPABDcD0AIgAiADKQPIBDcD2AIgAisD8AIiEyACKwP4AiIOIAIoAugCIgQbIRIgDiATIAQbIREgAisDqAMhDyACKwOgAyEQAkACQCACKAIAIgUtAJ4CQQFHDQAgAi0AmAFBIHFFDQAgBSsA6AEgDyAPoKEhFQJAIAIgBSsA4AEgECAQoKEiFEQtQxzr4jYaP2MEf0EBBSACAn8gESAUoyIOmUQAAAAAAADgQWMEQCAOqgwBC0GAgICAeAsiBjYCpAEgESAGtyAUoqFELUMc6+I2Gj9kRQ0BIAZBAWoLIgY2AqQBCwJAIAIgFUQtQxzr4jYaP2MEf0EBBSACAn8gEiAVoyIOmUQAAAAAAADgQWMEQCAOqgwBC0GAgICAeAsiBzYCqAEgEiAHtyAVoqFELUMc6+I2Gj9kRQ0BIAdBAWoLIgc2AqgBCyACIAYgB2w2AswBIBIgFRApIRIgESAUECkhEQwBCwJ8IAIoAkRFBEBEAAAAAAAAAAAhFUQAAAAAAAAAAAwBCyACKAJUIgQrABggBCsAICAPIA+goUQAAAAAAAAAABAjIRUgECAQoKFEAAAAAAAAAAAQIwsgAkEBNgLMASACQoGAgIAQNwKkASAVIBIQIyEVIBEQIyEUCyACQgA3AqwBIAJCADcCtAEgAkIANwK8ASACAn8gECAQoCAUoCACKwOwA6JEAAAAAAAAUkCjIg5EAAAAAAAA4D9EAAAAAAAA4L8gDkQAAAAAAAAAAGYboCIOmUQAAAAAAADgQWMEQCAOqgwBC0GAgICAeAs2AsADIAICfyAPIA+gIBWgIAIrA7gDokQAAAAAAABSQKMiDkQAAAAAAADgP0QAAAAAAADgvyAORAAAAAAAAAAAZhugIg6ZRAAAAAAAAOBBYwRAIA6qDAELQYCAgIB4CzYCxAMgA0HABGoiBCACIAUoArwBLAAAEN4IIAIgAykDwAQ3ArQBIAQgAiAFKAK8ASwAARDeCCACIAMpA8AEIhg3ArwBAkAgAigCtAEgGKdqIgQgBEEfdSIEcyAEa0EBRgRAIAIoArgBIBhCIIinaiIEIARBH3UiBHMgBGtBAUYNAQsgAkIBNwK8ASACQoCAgIAQNwK0ASADIAUoArwBNgKQAUGNuAQgA0GQAWoQKgtEAAAAAAAAAAAhEwJ8RAAAAAAAAAAAIAEoAhAoAggtAFJBAUcNABogFCARoUQAAAAAAADgP6JEAAAAAAAAAAAgESAUYxshE0QAAAAAAAAAACASIBVjRQ0AGiAVIBKhRAAAAAAAAOA/ogshDgJAIAIoAugCIgZFBEAgECEUIA8hECARIRUgEiERIA4hDyATIQ4MAQsgDyEUIBIhFSATIQ8LIAIgECAPoCIWOQOIAyACIBQgDqAiEDkDgAMgAiARIBagIhI5A5gDIAIgFSAQoCIUOQOQAyACIBEgAisD4AIiDqM5A8gCIAIgFSAOozkDwAIgAgJ/IBAgAisDsAMiD6JEAAAAAAAAUkCjIg5EAAAAAAAA4D9EAAAAAAAA4L8gDkQAAAAAAAAAAGYboCIOmUQAAAAAAADgQWMEQCAOqgwBC0GAgICAeAsiBzYCyAMgAgJ/IBYgAisDuAMiE6JEAAAAAAAAUkCjIg5EAAAAAAAA4D9EAAAAAAAA4L8gDkQAAAAAAAAAAGYboCIOmUQAAAAAAADgQWMEQCAOqgwBC0GAgICAeAsiCTYCzAMgAgJ/IBIgE6JEAAAAAAAAUkCjIg5EAAAAAAAA4D9EAAAAAAAA4L8gDkQAAAAAAAAAAGYboCIOmUQAAAAAAADgQWMEQCAOqgwBC0GAgICAeAsiBTYC1AMgAgJ/IBQgD6JEAAAAAAAAUkCjIg5EAAAAAAAA4D9EAAAAAAAA4L8gDkQAAAAAAAAAAGYboCIOmUQAAAAAAADgQWMEQCAOqgwBC0GAgICAeAsiBDYC0AMgBgRAIAIgFDkDmAMgAiASOQOQAyACIBA5A4gDIAIgFjkDgAMgAiAFrSAErUIghoQ3A9ADIAIgCa0gB61CIIaENwPIAwsgAi0AmAFBgAFxRQRAIAIgARDnCAtByOIKIAI2AgALAkAgACgCnAEiBCgCBCICRQ0AIAIoAjQNACACIAQoAjQ2AjQLIAAgAjYCnAEMAAsAC0HNzAFBhLkBQakIQaQpEAAAC0GSlwNBhLkBQYUgQeW/ARAAAAsgA0GABWokACACC88BAQJ/IwBBkAFrIgMkAAJAIAAQ6AgEQCABKAAIRQRAIAEgACkDADcDGCABIAApAwg3AyAgAUEQECYhAiABKAIAIAJBBHRqIgIgASkDGDcDACACIAEpAyA3AwgLIAEgACkDMDcDGCABIAApAzg3AyAgAUEQECYhACABKAIAIABBBHRqIgAgASkDGDcDACAAIAEpAyA3AwgMAQsgAyAARAAAAAAAAOA/IANB0ABqIgAgA0EQaiICEKEBIAAgARCgBiACIAEQoAYLIANBkAFqJAALbAEEf0GI9ggoAgAiAhDVAUGk4AooAgAiAUUEQEGk4ApBhKAKQZTuCSgCABCTASIBNgIACyABIABBBCABKAIAEQMAIgFFBEBBpOAKKAIAIgMoAgAhBCADIAAQZEEBIAQRAwAaCyACENQBIAFFC0cBBH8gAUEQED8hAwN/IAEgAkYEfyADBSADIAJBBHRqIgQgACACQRhsaiIFKwMAOQMAIAQgBSsDCDkDCCACQQFqIQIMAQsLC5sBAQV/IwBBEGsiAyQAIAJBroUBECchBCACQaHaABAnIQUgAkHiIhAnIQYgA0IANwMIIANCADcDACABBH8gASgCAAVBAAshAQJAIAQEQCAELQAADQELIAJBn9IBECchBAsgACACIAMQpwYhByAAIAEgBCAFBH8gBSACEIgEBUEACyIBIAYgByACEOwIGiABEBggAxBcIANBEGokAAvsAQIFfAF/QQEgAiACQQFNGyEJIAErAwgiBSEGIAErAwAiByEIQQEhAgNAIAIgCUZFBEACQCAIIAErAxgiBGQEQCAEIQgMAQsgBCAHZEUNACAEIQcLAkAgBiABKwMgIgRkBEAgBCEGDAELIAQgBWRFDQAgBCEFCyABQRhqIQEgAkEBaiECDAELCyAAIAc5AxAgACAIOQMAIAAgBTkDGCAAIAY5AwggAyADKwMQIAgQIyAHECM5AxAgAyADKwMYIAYQIyAFECM5AxggAyADKwMAIAgQKSAHECk5AwAgAyADKwMIIAYQKSAFECk5AwgLoQUCA38EfCMAQbABayIEJAAgACgCECsDoAEhCSACIARBgAFqEN4EIgZBAWtBAk8EQEEwIQIgBEHwAGohBQJAIAMEQCAEIAEpAyA3A0AgBCABKQMoNwNIIAQgASkDODcDWCAEIAEpAzA3A1AgBCABKQMINwNoIAQgASkDADcDYEEQIQIMAQsgBCABKQMANwNAIAQgASkDCDcDSCAEIAEpAxg3A1ggBCABKQMQNwNQIAQgASkDKDcDaCAEIAEpAyA3A2ALIAUgASACaiIBKQMANwMAIAUgASkDCDcDCCAEKwNQIQogBCAEKwNAIgg5A1AgBCAIOQNgIAlEAAAAAAAA4D9kBEAgAEQAAAAAAADgPxCHAgsgCiAIoSEIQQAhAQNAAkAgASAEKAKIAU8NACAEIAQpA4gBNwM4IAQgBCkDgAE3AzAgBCgCgAEgBEEwaiABEBlBGGxqIgIoAgAiA0UNACACKwMIIgdEAAAAAAAAAABlBEAgAUEBaiEBDAIFIAAgAxBdIAQgCiAIIAeiIAQrA0CgIAFBAWoiASAEKAKIAUYbIgc5A2AgBCAHOQNQIAAgBEFAa0EEQQEQSCAEIAQrA1AiBzkDcCAEIAc5A0AMAgsACwsgCUQAAAAAAADgP2QEQCAAIAkQhwILQQAhAQNAIAQoAogBIAFNBEAgBEGAAWoiAEEYEDEgABA0BSAEIAQpA4gBNwMoIAQgBCkDgAE3AyAgBEEgaiABEBkhAAJAAkACQCAEKAKQASICDgICAAELQbCDBEHCAEEBQYj2CCgCABA6GhA7AAsgBCAEKAKAASAAQRhsaiIAKQMINwMQIAQgACkDEDcDGCAEIAApAwA3AwggBEEIaiACEQEACyABQQFqIQEMAQsLCyAEQbABaiQAIAYLcwEBfyAAECQgABBLTwRAIABBARDfBAsgABAkIQECQCAAECgEQCAAIAFqQQA6AAAgACAALQAPQQFqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABBrwJBxLIBEAAACyAAKAIAIAFqQQA6AAAgACAAKAIEQQFqNgIECwvuAQEDfyMAQSBrIgQkACAAKAIAKAKgASIFKAIQKAIIKAJcIQMgACACEOsIAkACQCABQbWnARAnIgBFDQAgAC0AAEUNACACIAAQxQMMAQsgASAFRiIFIANFckUEQCAEIAM2AhAgAkHNxAEgBEEQahB+C0EAIQBBACEDAkACQAJAAkAgARCSAg4DAAECAwtBiPoAQYkZIAUbIQMgASgCAEEEdiEADAILIAEoAgBBBHYhAEHonwEhAwwBCyABKAIAQQR2IQBB750BIQMLIAQgADYCBCAEIAM2AgAgAkHcpgEgBBB+CyACEMQDIARBIGokAAurEgMOfwt8AX4jAEGAAWsiBCQAIAArA+ACIRAgASsDCCERIAErAwAhEiAAKAIAKAKgASEIIAArA4AEIRQCfyAAKALoAgRAIBEgECAAKwOQBKKjIAArA/gDoSETIBKaIREgAEGIBGoMAQsgEiAQIAArA4gEoqMgACsD+AOhIRMgAEGQBGoLKwMAIRUgBCATRAAAAAAAAPA/IBCjIhKgOQNwIAQgEyASoTkDYCAEIBEgECAVoqMgFKEiECASoDkDeCAEIBAgEqE5A2ggCBAcIQMCQANAIAMEQCAIIAMQLCEBA0AgAQRAIAQgBCkDeDcDWCAEIAQpA3A3A1AgBCAEKQNoNwNIIAQgBCkDYDcDQAJ/IARBQGshBUEAIQojAEGwAmsiAiQAAkACfwJAIAEoAhAiBigCCCIJRQ0AIAkrABggBSsDAGZFDQAgBSsDECAJKwAIZkUNACAJKwAgIAUrAwhmRQ0AIAUrAxggCSsAEGZFDQACQANAIAogCSgCBE8NASAJKAIAIQYgAiAFKQMYNwOIAiACIAUpAxA3A4ACIAIgBSkDCDcD+AEgAiAFKQMANwPwASACQcABaiAGIApBMGxqQTAQHxogAigCxAEiDEUNBCACIAIoAsABIgspAwg3A6gCIAIgCykDADcDoAJBASEGAkADQCAGIAxHBEAgAiALIAZBBHRqIgcpAwg3A5gCIAIgBykDADcDkAIgAiAHKQMINwO4ASAHKQMAIRsgAiACKQOoAjcDqAEgAiACKQP4ATcDiAEgAiACKQOAAjcDkAEgAiACKQOIAjcDmAEgAiAbNwOwASACIAIpA6ACNwOgASACIAIpA/ABNwOAAQJ/QQAhByACKwOAASITIAIrA7ABIhBlIg1FIBAgAisDkAEiEmVFckUEQCACKwO4ASIRIAIrA4gBZiARIAIrA5gBZXEhBwsCQAJAIBMgAisDoAEiFGUiDiASIBRmcUUEQCAHRQ0BDAILIAcgAisDqAEiESACKwOIAWYgESACKwOYAWVxIg9HDQEgByAPcUUNAEEBDAILIAIrA7gBIRECQAJAIBAgFGEEQCANRQ0BIAIrA4gBIhMgAisDqAFlIBEgE2ZzRQ0BIBAgEmUNAwwBCyACKwOoASIWIBFhBEAgDiAQIBNmRg0BIAIrA4gBIBFlRQ0BIBEgAisDmAFlDQMMAQsgECAUECkhGCACKwOYASEVQQAhByATIBChIBYgEaEgFCAQoaMiGaIgEaAiGiACKwOIASIXZkUgEyAYZkUgECAUECMiFCATZkVyckUgFSAaZnENASASIBhmRSAXIBIgE6EgGaIgGqAiGGVFIBUgGGZFcnJFIBIgFGVxDQEgESAWECMhFCARIBYQKSIWIBdlRSATIBAgFyARoSAZo6AiEGVFIBAgEmVFcnJFIBQgF2ZxDQEgFSAWZkUgEyAQIBUgF6EgGaOgIhBlRSAQIBJlRXJyDQAgFCAVZg0BC0F/IQcLIAcMAQtBAAtBf0cNAiACIAIpA5gCNwOoAiACIAIpA5ACNwOgAiAGQQFqIQYMAQsLIAIoAsgBBEAgAiACKQPYATcDeCACIAIpA9ABNwNwIAIgCykDCDcDaCALKQMAIRsgAiACKQP4ATcDSCACIAIpA4ACNwNQIAIgAikDiAI3A1ggAiAbNwNgIAIgAikD8AE3A0AgAkHwAGogAkHgAGogAkFAaxDuCQ0BCyACKALMAQRAIAIgAikD6AE3AzggAiACKQPgATcDMCACIAIoAsABIAIoAsQBQQR0akEQayIGKQMINwMoIAYpAwAhGyACIAIpA/gBNwMIIAIgAikDgAI3AxAgAiACKQOIAjcDGCACIBs3AyAgAiACKQPwATcDACACQTBqIAJBIGogAhDuCQ0BCyAKQQFqIQoMAQsLQQEMAgsgASgCECEGCwJAIAYoAmAiBkUNACAFKwMQIAYrADgiECAGKwMYRAAAAAAAAOA/oiIRoWZFDQAgBSsDACARIBCgZUUNACAFKwMYIAYrAEAiECAGKwMgRAAAAAAAAOA/oiIRoWZFDQBBASAFKwMIIBEgEKBlDQEaC0EACyACQbACaiQADAELQaCIAUHMuQFBuQpBgDkQAAALDQQgCCABEDAhAQwBCwsgCCADEB0hAwwBCwsgCCgCLCIBQQBBgAIgASgCABEDACIBBH8gASgCEAVBAAshAQNAIAEEQCAEIAQpA3g3AzggBCAEKQNwNwMwIAQgBCkDaDcDKCAEIAQpA2A3AyBBACEFIwBB8ABrIgMkAAJAIAQrAzAiECABKAIQIgIrAzBmRQ0AIAQrAyAiESACKwNAZUUNACAEKwM4IhMgAisDOGZFDQAgBCsDKCISIAIrA0hlRQ0AIAIrABAhFCADIAIrABggEiAToEQAAAAAAADgP6KhOQNoIAMgFCAQIBGgRAAAAAAAAOA/oqE5A2AgA0EYaiIFQQBByAAQOBogAyABNgIYIAIoAggoAgQoAgwhAiADIAMpA2g3AxAgAyADKQNgNwMIIAUgA0EIaiACEQAAIQULIANB8ABqJAAgBQ0CQQAhAwJAIAggARDmASIBRQ0AIAgoAiwiAiABQRAgAigCABEDACIBRQ0AIAEoAhAhAwsgAyEBDAELCyAEIAQpA3g3AxggBCAEKQNwNwMQIAQgBCkDaDcDCCAEIAQpA2A3AwAgCCAEEO0IIgEgCCABGyEBCyAAKALABCIDIAFHBEACQCADRQ0AAkACQAJAIAMQkgIOAwABAgMLIAMoAhAiAyADLQBwQf4BcToAcAwCCyADKAIQIgMgAy0AhQFB/gFxOgCFAQwBCyADKAIQIgMgAy0AdEH+AXE6AHQLIABBADYCyAQgACABNgLABAJAIAFFDQACQAJAAkACQCABEJICDgMAAQIECyABKAIQIgMgAy0AcEEBcjoAcCABQQBBodoAQQAQIiIDDQIMAwsgASgCECIDIAMtAIUBQQFyOgCFASABEC1BAUGh2gBBABAiIgMNAQwCCyABKAIQIgMgAy0AdEEBcjoAdCABQVBBACABKAIAQQNxQQJHG2ooAigQLUECQaHaAEEAECIiA0UNAQsgACABIAMQRSABEIEBNgLIBAsgAEEBOgCZBAsgBEGAAWokAAu5AgIDfwJ8IwBBMGsiBCQAIAEgASgCSCABKAJMIgVBAWogBUECakE4EPEBIgU2AkggBSABKAJMIgZBOGxqIgUgAzoAMCAFIAI2AgACfAJAIAJFDQAgAi0AAEUNACAEQgA3AyggBEIANwMgIARCADcDGCAEQgA3AxAgBCABKAIENgIQIAQgASsDEDkDICAFIAAoAogBIgIgBEEQakEBIAIoAgARAwA2AgQgBCAAIAUQ4AYgBCsDCCEHIAEoAkwhBiAEKwMADAELIAUCfyABKwMQRDMzMzMzM/M/oiIImUQAAAAAAADgQWMEQCAIqgwBC0GAgICAeAu3Igc5AyhEAAAAAAAAAAALIQggASAGQQFqNgJMIAEgByABKwMgoDkDICABIAErAxgiByAIIAcgCGQbOQMYIARBMGokAAuzAgEGfyMAQRBrIgYkACAAKAIAIQICQAJAAkACQCAAKAIEQQFrDgMAAgECCyACQdQAaiEEAkAgAigCeEF/RgRAA0AgAigAXCADTQRAIARBBBAxIAQQNAwDBSAGIAQpAgg3AwggBiAEKQIANwMAIAYgAxAZIQUCQAJAAkAgAigCZCIHDgICAAELIAQoAgAgBUECdGooAgAQGAwBCyAEKAIAIAVBAnRqKAIAIAcRAQALIANBAWohAwwBCwALAAsgAigCVCEDIAIoAnAQGCACKAJ0EBgDQCADKAIAIgUEQCAFQdgAakEAEKoGIAUQ5AQgBRAYIANBBGohAwwBCwsgBCgCABAYCyACEOQEIAIQGAwCCyACKAIgEBggAhAYDAELIAIQ/ggLIAEEQCAAEBgLIAZBEGokAAs2AQF/IwBBIGsiAyQAIAMgAjkDGCADIAE5AxAgACADQQhqQQQgACgCABEDACADQSBqJABBAEcLWwEDfyAAKAIAIgAEfwJAIAAoAqgCIgFFDQAgASAAKAKwAiICSQ0AIAAoApwBIgMgAiABIABBsANqIAMoAjARBwAgACAAKAKoAjYCsAILIAAoArADQQFqBUEACwvbAwEEfyMAQRBrIgUkACAAIAE2AqgCIABB3AE2AqACAkACQAJAA0AgBUEANgIMIAAgACgCnAEiBCABIAIgBUEMaiAEKAIAEQYAIgcgASAFKAIMQYcxQQAQmwJFBEAgABDgAkErIQQMBAsgACAFKAIMIgY2AqwCQQkhBAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAdBC2sOBQIQAxABAAsCQCAHQQRqDgUHEAYFDAALIAdBcUcNDyADIAAoAlwEfyAAIAAoApwBIAEgBhCHASAAKAL4A0ECRg0PIAUoAgwFIAYLNgIAQQAhBAwPCyAAKAJcRQ0CIAAgACgCnAEgASAGEIcBDAILIAAgACgCnAEgASAGELMGDQEMCwsgACAAKAKcASABIAYQtAZFDQoLIAAoAvgDQQFrDgMFBAMGCyAALQD8A0UNAUEFIQQMCgsgAC0A/ANFDQBBBiEEDAkLIAMgATYCAEEAIQQMCAsgACAFKAIMIgA2AqgCIAMgADYCAEEAIQQMBwsgACAFKAIMNgKoAgwFCyAALQDgBEUNAEEXIQQMBQsgACAFKAIMIgE2AqgCDAELCyAAIAY2AqgCQQQhBAwCC0EBIQQMAQtBIyEECyAFQRBqJAAgBAuVAQIFfgF/IAApAxAhBCAAKQMYIQIgACkDACEFIAApAwghAwNAIAEgB0ZFBEAgAiAEfCIEIAMgBXwiBSADQg2JhSIDfCIGIANCEYmFIQMgBCACQhCJhSICQhWJIAIgBUIgiXwiBYUhAiAGQiCJIQQgB0EBaiEHDAELCyAAIAI3AxggACAFNwMAIAAgAzcDCCAAIAQ3AxALngECBH8BfiAAQSBqIQUgAEEoaiEDIAEgAmohBANAIAMoAgAiAiADTyABIARPckUEQCABLQAAIQYgAyACQQFqNgIAIAIgBjoAACABQQFqIQEMAQsgAiADTwRAIAAgACkDICIHIAApAxiFNwMYIABBAhCuBiAAIAU2AiggACAHIAApAwCFNwMAIAAgACkDMEIIfDcDMCABIARJDQELCyAAC94fAQ9/IwBBMGsiCCQAIAggAzYCLCAAKAL8AiESAn8gACgCnAEgAkYEQCAAQagCaiEOIABBrAJqDAELIAAoArQCIg5BBGoLIRMgDiADNgIAIBJB0ABqIRQgAEG4A2ohDSAIQSVqIRUCQAJAA0AgCCAIKAIsIgM2AigCfwJAAkAgAiADIAQgCEEoaiACKAIEEQYAIgNBBWoiCw4DAAEAAQsgCCgCLCIJIAQgBhsMAQsgCCgCLCEJIAgoAigLIQogACADIAkgCkGJGiAHEJsCRQRAIAAQ4AJBKyEJDAMLIBMgCCgCKCIDNgIAQREhCQJAIAgCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCALDhMMAQAEAwIGBgcHCA4KCwUJDx8QEQsgBgRAIAUgCCgCLDYCAEEAIQkMHwsgEyAENgIAAkAgACgCSCIDBEAgCEEKOgAMIAAoAgQgCEEMakEBIAMRBQAMAQsgACgCXEUNACAAIAIgCCgCLCAEEIcBCyABRQ0dIAAoAtACIAFGDQwMGwsgBgRAIAUgCCgCLDYCAEEAIQkMHgsgAUEATA0cIAAoAtACIAFHDRogBSAIKAIsNgIAQQAhCQwdCyAOIAM2AgBBBCEJDBwLIAZFBEBBBSEJDBwLIAUgCCgCLDYCAEEAIQkMGwsgBkUEQEEGIQkMGwsgBSAIKAIsNgIAQQAhCQwaCyAIIAIgAigCQCIJIAgoAixqIAMgCWsgAigCLBEDACIDOgAkIANB/wFxBEAgAEEJIAhBJGoiCiAVQcsaQQEQmwIaIAAoAkgiAwRAIAAoAgQgCkEBIAMRBQAMEwsgACgCXEUNEiAAIAIgCCgCLCAIKAIoEIcBDBILQQEhCSAUIAIgAigCQCIDIAgoAixqIAgoAiggA2sQhgEiA0UNGSAAIBIgA0EAEJcBIQsgEiASKAJgNgJcAkACQCASLQCBAQRAIBItAIIBRQ0BCyALRQRAQQshCQwcCyALLQAjDQFBGCEJDBsLIAsNACAAKAKEASIJBEAgACgCBCADQQAgCREFAAwTCyAAKAJcRQ0SIAAgAiAIKAIsIAgoAigQhwEMEgsgCy0AIARAQQwhCQwaCyALKAIcBEBBDyEJDBoLIAsoAgQEQCAALQDMAg0NIAAoAoQBIgMEQCAAKAIEIAsoAgBBACADEQUADBMLIAAoAlxFDRIgACACIAgoAiwgCCgCKBCHAQwSCyAAKAJ8BEAgC0EBOgAgAkAgACgC/AIiDygCnAEiDEUNACAAKALEAyIDIAAoAsADRgRAIA0QX0UNECAAKALEAyEDCyAAIANBAWo2AsQDIANBPToAAEEAIQMgDygCnAEoAhQgAC0A8ANBAEdrIgpBACAKQQBKGyEQA0AgAyAQRg0BIAAoAsQDIgogACgCwANGBEAgDRBfRQ0RIAAoAsQDIQoLIA8oApwBKAIQIANqLQAAIREgACAKQQFqNgLEAyAKIBE6AAAgA0EBaiEDDAALAAsgCCAPKAI8IgM2AgwgDEUhCiAIIAMEfyADIA8oAkRBAnRqBUEACzYCEANAIAhBDGoQvAYiEARAIBAoAgRFDQEgCkUEQCAAKALEAyIDIAAoAsADRgRAIA0QX0UNEiAAKALEAyEDCyAAIANBAWo2AsQDIANBDDoAAAsgECgCACEMA0ACQCAAKALAAyEKIAAoAsQDIQMgDC0AACIRRQ0AIAMgCkYEQCANEF9FDRMgDC0AACERIAAoAsQDIQMLIAAgA0EBajYCxAMgAyAROgAAIAxBAWohDAwBCwsgAyAKRgRAIA0QX0UNESAAKALEAyEDCyAAIANBAWo2AsQDIANBPToAAEEAIQogECgCBCgCFCAALQDwA0EAR2siA0EAIANBAEobIRFBACEDA0AgAyARRg0CIAAoAsQDIgwgACgCwANGBEAgDRBfRQ0SIAAoAsQDIQwLIBAoAgQoAhAgA2otAAAhFiAAIAxBAWo2AsQDIAwgFjoAACADQQFqIQMMAAsACwsgCCAPKAIAIgM2AgwgCCADBH8gAyAPKAIIQQJ0agVBAAs2AhADQCAIQQxqELwGIgMEQCADLQAgRQ0BIApFBEAgACgCxAMiCiAAKALAA0YEQCANEF9FDRIgACgCxAMhCgsgACAKQQFqNgLEAyAKQQw6AAALIAMoAgAhAwNAIAMtAAAiDEUEQEEAIQoMAwsgACgCxAMiCiAAKALAA0YEQCANEF9FDRIgAy0AACEMIAAoAsQDIQoLIAAgCkEBajYCxAMgCiAMOgAAIANBAWohAwwACwALCyAAKALEAyIDIAAoAsADRgRAIA0QX0UNDyAAKALEAyEDCyAAIANBAWo2AsQDIANBADoAACAAKALIAyEDIAtBADoAICADRQ0aIAAoAoABIAMgCygCFCALKAIQIAsoAhggACgCfBEIAEUEQEEVIQkMGwsgACAAKALIAzYCxAMMEgsgACgCXEUNESAAIAIgCCgCLCAIKAIoEIcBDBELAkAgACgCiAMiAwRAIAAgAygCADYCiAMMAQtBASEJIABBMEGVGxCYASIDRQ0ZIAMgAEEgQZgbEJgBIgo2AiQgCkUEQCAAIANBmhsQZwwaCyADIApBIGo2AigLIANBADYCLCADIAAoAoQDNgIAIAAgAzYChAMgA0IANwIQIAMgCCgCLCACKAJAaiIJNgIEIAMgAiAJIAIoAhwRAAAiCTYCCCAAIAAoAtACQQFqNgLQAiAIIAMoAgQiCzYCJCADQQxqIQogA0EsaiEQIAkgC2ohCyADKAIoIQwgAygCJCEJA0ACQCAIIAk2AgwgAiAIQSRqIAsgCEEMaiAMQQFrIAIoAjgRCAAgCCgCDCIRIAMoAiQiCWshD0EBRiAIKAIkIAtPcg0AIAMoAiggCWsiDEEASA0PIAAgCSAMQQF0IgxBuhsQmgIiCUUNDyADIAk2AiQgAyAJIAxqIgw2AiggCSAPaiEJDAELCyADIA82AhggAyAJNgIMIBFBADoAACAAIAIgCCgCLCAKIBAgBxCYCSIJDRggACgCQCIDBEAgACgCBCAKKAIAIAAoAqADIAMRBQAMEAsgACgCXEUNDyAAIAIgCCgCLCAIKAIoEIcBDA8LIAIoAkAhAyAIKAIsIQkgCEEANgIkIAggDSACIAMgCWoiAyACIAMgAigCHBEAACADahCGASIDNgIMIANFDQwgACAAKALEAzYCyAMgACACIAgoAiwgCEEMaiAIQSRqQQIQmAkiCQRAIAAgCCgCJBCXCQwYCyAAIAAoAsQDNgLIAwJAAkAgACgCQCIDRQRAIAAoAkQiAw0BIAAoAlxFDQIgACACIAgoAiwgCCgCKBCHAQwCCyAAKAIEIAgoAgwgACgCoAMgAxEFACAAKAJEIgNFDQEgACgCQEUNACAOIBMoAgA2AgAgACgCRCEDCyAAKAIEIAgoAgwgAxEEAAsgDRCcAiAAIAgoAiQQlwkgACgC0AINDwJAAkAgACgC+ANBAWsOAwASDwELIAAtAOAEDQ4LIAAgCCgCKCAEIAUQrQYhCQwXCyAAKALQAiABRg0TIAAoAoQDIQoCQCACIAgoAiwgAigCQEEBdGoiAyACKAIcEQAAIgkgCigCCEYEQCAKKAIEIAMgCRDOAUUNAQsgDiADNgIAQQchCQwXCyAAIAooAgA2AoQDIAogACgCiAM2AgAgACAKNgKIAyAAIAAoAtACQQFrNgLQAgJAIAAoAkQiAwRAAkAgAC0A9AFFDQAgCigCECIJRQ0AIAooAgwgCigCHGohAwNAIAktAAAiCwRAIAMgCzoAACADQQFqIQMgCUEBaiEJDAELCwJAIAAtAPUBRQ0AIAooAhQiCUUNACADIAAtAPADOgAAA0AgA0EBaiEDIAktAAAiC0UNASADIAs6AAAgCUEBaiEJDAALAAsgA0EAOgAAIAAoAkQhAwsgACgCBCAKKAIMIAMRBAAMAQsgACgCXEUNACAAIAIgCCgCLCAIKAIoEIcBCyAKKAIsIQMDQCADBEAgAyEJIAogACgCdCILBH8gACgCBCADKAIAKAIAIAsRBAAgCigCLAUgCQsoAgQiCTYCLCADIAAoApADNgIEIAAgAzYCkAMgAygCACADKAIINgIEIAkhAwwBCwsgACgC0AINDgJAAkAgACgC+ANBAWsOAwARDgELIAAtAOAEDQ0LIAAgCCgCKCAEIAUQrQYhCQwWCyACIAgoAiwgAigCKBEAACIDQQBIBEBBDiEJDBYLIAAoAkgiCQRAIAAoAgQgCEEMaiIKIAMgChCTBCAJEQUADA4LIAAoAlxFDQ0gACACIAgoAiwgCCgCKBCHAQwNCyAAKAJIIgkEQCAIQQo6AAwgACgCBCAIQQxqQQEgCREFAAwNCyAAKAJcRQ0MIAAgAiAIKAIsIAMQhwEMDAsCQCAAKAJUIgkEQCAAKAIEIAkRAQAMAQsgACgCXEUNACAAIAIgCCgCLCADEIcBCyAAIAIgCEEoaiAEIAUgBiAHEJYJIgkNEyAIKAIoDQsgAEHbATYCoAJBACEJDBMLIAYEQCAFIAgoAiw2AgBBACEJDBMLAkAgACgCSCIDBEAgAi0AREUEQCAIIAAoAjg2AgwgAiAIQSxqIAQgCEEMaiAAKAI8IAIoAjgRCAAaIAAoAgQgACgCOCICIAgoAgwgAmsgACgCSBEFAAwCCyAAKAIEIAgoAiwiAiAEIAJrIAMRBQAMAQsgACgCXEUNACAAIAIgCCgCLCAEEIcBCyABRQRAIA4gBDYCAAwSCyAAKALQAiABRg0AIA4gBDYCAAwPCyAFIAQ2AgBBACEJDBELIAAoAkgiCQRAIAItAERFBEADQCAIIAAoAjg2AgwgAiAIQSxqIAMgCEEMaiAAKAI8IAIoAjgRCAAgEyAIKAIsNgIAIAAoAgQgACgCOCIKIAgoAgwgCmsgCREFAEEBTQ0LIA4gCCgCLDYCACAIKAIoIQMMAAsACyAAKAIEIAgoAiwiCiADIAprIAkRBQAMCQsgACgCXEUNCCAAIAIgCCgCLCADEIcBDAgLIAAgAiAIKAIsIAMQswYNBwwECyAAIAIgCCgCLCADELQGRQ0DDAYLIAAoAlxFDQUgACACIAgoAiwgAxCHAQwFCyAAIAtBAEEAEOkERQ0EDAwLIAtBADoAIAwLC0EBIQkMCgsgAEHcATYCoAIMAQsgDRCcAgsCQCAAKAL4A0EBaw4DAgEAAwsgDiAIKAIoIgA2AgAgBSAANgIAQQAhCQwHCyAOIAgoAig2AgBBIyEJDAYLIAgoAigiAyAALQDgBEUNARogBSADNgIAQQAhCQwFCyAIKAIoCyIDNgIsIA4gAzYCAAwBCwtBDSEJDAELQQMhCQsgCEEwaiQAIAkLnAECAX8CfiMAQdAAayICJAAgACACQQhqEJsJIAJCADcDSCACIAJBOGo2AkAgAiACKQMIIgNC9crNg9es27fzAIU3AxggAiACKQMQIgRC88rRy6eM2bL0AIU3AzAgAiADQuHklfPW7Nm87ACFNwMoIAIgBELt3pHzlszct+QAhTcDICACQRhqIAEgARCaCRCvBhCZCSACQdAAaiQApwtuAQF/IABBABC/AiIAKAL0A0UEQCAAIAAoAtAEQQFqNgLQBCAAIAAoAtQEQQFqIgM2AtQEIAMgACgC2AQiA0sEQCAAIANBAWo2AtgECyAAIAFBr8sDIAIQngkPC0GtOEGfvQFBwcMAQfflABAAAAuqAQEDfwJAIAAoAkxFBEBBASEEIAAoAlxFDQEgACABIAIgAxCHAUEBDwsgAEG4A2oiBSABIAIgASgCQEEBdGoiAiABIAIgASgCHBEAACACaiICEIYBIgZFDQAgACAAKALEAzYCyAMgBSABIAEgAiABKAIgEQAAIAMgASgCQEEBdGsQhgEiAUUNACABEJwJIAAoAgQgBiABIAAoAkwRBQAgBRCcAkEBIQQLIAQLbAEBfwJAIAAoAlBFBEAgACgCXEUNASAAIAEgAiADEIcBQQEPCyAAQbgDaiIEIAEgAiABKAJAIgFBAnRqIAMgAUF9bGoQhgEiAUUEQEEADwsgARCcCSAAKAIEIAEgACgCUBEEACAEEJwCC0EBC2gBAn8CQCAAKAL8AiIEQdAAaiABIAIgAxCGASICRQ0AIAAgBEEUaiACQRgQlwEiAUUNAAJAIAIgASgCAEcEQCAEIAQoAmA2AlwMAQsgBCAEKAJcNgJgIAAgARCgCUUNAQsgASEFCyAFCzkAAkAgACAAKAL0A0EARyAAKAKcASABIAIgAyAALQD8A0VBABCwBiIDDQAgABChCQ0AQQEhAwsgAwuVAQEDfyAAIgEhAwNAAn8CQAJAAkACQCADLQAAIgJBCmsOBAEDAwEACyACQSBGDQAgAkUNAQwCCyAAIAAgAUYNAhpBICECIAFBAWstAABBIEcNASABDAILIAAgAUcEfyABQQFrIgAgASAALQAAQSBGGwUgAAtBADoAAA8LIAEgAjoAACABQQFqCyADQQFqIQMhAQwACwALWQECfyMAQRBrIgQkACAEIAE2AgwgACgCnAEiBSABIAIgBEEMaiAFKAIAEQYAIQUgACAAKAKcASABIAIgBSAEKAIMIAMgAC0A/ANFQQFBABCtCSAEQRBqJAALEwAgAEGAAXNBAnRBjKsIaigCAAsqAQF/A0AgAARAIAAoAgQgASAAKAIQQf8OEGcgASAAQYAPEGchAAwBCwsLmwYBCH8gASgCACEFAkAgAy0AACIGRQRAIAUEQEEcDwtBASELQSghBwwBC0EBIQtBKCEHIAVFDQAgBS0AAEH4AEcNACAFLQABQe0ARw0AIAUtAAJB7ABHDQAgBS0AAyIIBEAgCEHuAEcNASAFLQAEQfMARw0BIAUtAAUNAUEnDwtBASEKQQAhC0EmIQcLQQEhCEEBIQxBACEFAkADQCAGQf8BcSIJBEACQCAIQf8BcUUgBUEkS3JFBEAgCSAFQeCoCGotAABGDQELQQAhCAsCQCALIAxxRQ0AIAVBHU0EQCAJIAVBkKkIai0AAEYNAQtBACEMCwJAIAAtAPQBRQ0AIAkgAC0A8ANHDQBBAiEGIAlBIWsOXgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwADAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwADCyADIAVBAWoiBWotAAAhBgwBCwsgByEGIAogBUEkRiAIQf8BcUEAR3FHDQAgDEUgBUEdR3JFBEBBKA8LIAUgAC0A8ANBAEdqIQcCQCAAKAKQAyIFBEACQCAFKAIYIAdOBEAgBSgCECEIDAELQQEhBiAHQef///8HSw0DIAAgBSgCECAHQRhqIglBpSMQmgIiCEUNAyAFIAk2AhggBSAINgIQCyAAIAUoAgQ2ApADDAELQQEhBiAAQRxBrSMQmAEiBUUgB0Hn////B0tyDQEgBSAAIAdBGGoiBkG/IxCYASIINgIQIAhFBEAgACAFQcEjEGdBAQ8LIAUgBjYCGAsgBSAHNgIUIAggAyAHEB8aIAAtAPADIgYEQCAFKAIQIAdqQQFrIAY6AAALIAUgAjYCDCAFIAE2AgAgBSABKAIENgIIIAECfwJAIAMtAAANACABIAAoAvwCQZgBakcNAEEADAELIAULNgIEIAUgBCgCADYCBCAEIAU2AgBBACEGIAJFDQAgACgCcCICRQ0AIAAoAgQgASgCACADQQAgASgCBBsgAhEFAAsgBgs+AQR/IAAoAgAhASAAKAIEIQMDQCABIANGBEBBAA8LIAAgAUEEaiIENgIAIAEoAgAhAiAEIQEgAkUNAAsgAgvUAQEGfyAAKAIUIAAoAgxBAnRqKAIAKAIcIAAoAixqIQEgACgCJCEEIAAoAlAhAgNAIAIgBEkEQCACLQAAIgMEfyADQYCABWotAAAFQQELIQMgAUEBdEGAggVqLwEABEAgACACNgJEIAAgATYCQAsDQAJAA0AgASABQQF0IgVB4IcFai4BACADakEBdCIGQcCDBWouAQBGDQEgBUHAiQVqLgEAIgFB3QBIDQALIANBoIsFai0AACEDDAELCyACQQFqIQIgBkHgiwVqLgEAIQEMAQsLIAELvAICAX4CfyAABEAgACAAEEAiBEF4cWohAyAErSECA0AgAkKV08fetfKp0kZ+IQIgACADRkUEQCACIAApAABCldPH3rXyqdJGfiICQi+IIAKFQpXTx9618qnSRn6FIQIgAEEIaiEADAELCyACQoCAgICAgICAAUIAIAEbhSECAkACQAJAAkACQAJAAkACQCAEQQdxQQFrDgcGBQQDAgEABwsgAzEABkIwhiAChSECCyADMQAFQiiGIAKFIQILIAMxAARCIIYgAoUhAgsgAzEAA0IYhiAChSECCyADMQACQhCGIAKFIQILIAMxAAFCCIYgAoUhAgsgAiADMQAAhSECCyACQpXTx9618qnSRn4iAkIviCAChUKV08fetfKp0kZ+IgJCL4ggAoWnDwtBiNQBQaK6AUGaAUGe+QAQAAALJAAgACABIAIQ5QkgACgCTCIAKAIIIAEgAiAAKAIAKAIIESEAC9EDAQF/AkAgASACRgRAIANBADYCAAwBCwJAAkAgACABIAIQ4wJBCWsiB0EXS0EBIAd0QZOAgARxRXINAANAIAAgASAAKAJAaiIBIAIQ4wJBCWsiB0EXTQRAQQEgB3RBk4CABHENAQsLIAEgAkYEQCADQQA2AgAMAwsgAyABNgIAAkACQAJAA0ACQCAAIAEgAhDjAiIHQQlrQQJJDQAgB0E9Rg0CIAdBDUYgB0EgRnINACAHQX9GDQUgASAAKAJAaiEBDAELCyAEIAE2AgADQCAAIAEgACgCQGoiASACEOMCIgRBCWsiB0EXSw0CQQEgB3RBk4CABHENAAsMAQsgBCABNgIADAELIARBPUcNAQsgASADKAIARg0AA0AgACABIAAoAkBqIgEgAhDjAiIDQQlrQQJJDQACQCADQSBrDgMBAgMACyADQQ1GDQALIANBJ0YNAQsgBiABNgIAQQAPCyAFIAEgACgCQGoiBDYCAANAIAMgACAEIAIQ4wIiAUcEQCABQTprQXVLIAFBX3FB2wBrQWVLciABQd8ARiABQS1rQQJJcnIEQCAEIAAoAkBqIQQMAgUgBiAENgIAQQAPCwALCyAGIAQgACgCQGo2AgALQQELEQAgACABIAJB2wBB2gAQqwoLpgUBCn8gAEGw/QdB7AIQHyEEQQAhAANAAkACQCAAQYABRgRAIARB9AJqIQggBEH0BmohCSAEQcgAaiEHQQAhAAJ/A0AgAEGAAkcEQAJAIAEgAEECdCIKaigCACIFQX9GBEAgACAHakEBOgAAIAggAEEBdGpB//8DOwEAIAkgCmpBATsBAAwBCyAFQQBIBEBBACACRSAFQXxJcg0EGiAAIAdqQQMgBWs6AAAgCSAKakEAOgAAIAggAEEBdGpBADsBAAwBCyAFQf8ATQRAIAVB+P0Hai0AACIGRSAGQRxGckUgACAFR3ENBiAAIAdqIAY6AAAgCSAKaiIGIAU6AAEgBkEBOgAAIAggAEEBdGogBUF/IAUbOwEADAELIAUQkgRBAEgEQCAAIAdqQQA6AAAgCCAAQQF0akH//wM7AQAgCSAKakEBOwEADAELIAVB//8DSw0FAkBBASAFdCIMIAVBBXZBB3FBAnQiDSAFQQh2IgZBoIAIai0AAEEFdHJBsPMHaigCAHEEQCAAIAdqQRY6AAAMAQsgACAHaiELIAZBoIIIai0AAEEFdCANckGw8wdqKAIAIAxxBEAgC0EaOgAADAELIAtBHDoAAAsgCSAKaiIGIAUgBkEBahCTBDoAACAIIABBAXRqIAU7AQALIABBAWohAAwBCwsgBCACNgLsAiAEIAM2AvACIAIEQCAEQdQANgLoAiAEQdQANgLkAiAEQdQANgLgAiAEQdUANgLcAiAEQdUANgLYAiAEQdUANgLUAiAEQdYANgLQAiAEQdYANgLMAiAEQdYANgLIAgsgBEHXADYCPCAEQdgANgI4IAQLDwsgAEH4/QdqLQAAIgZFIAZBHEZyDQEgASAAQQJ0aigCACAARg0BC0EADwsgAEEBaiEADAALAAtJAQF/IwBBEGsiASQAAkAgAEHq4QAQJyIARQ0AIAEgAUEIajYCACAAQfCDASABEFFBAEwNAEGQ2wogASsDCDkDAAsgAUEQaiQAC3MBAn8CQCAAKAKYASICRQRAIAAQ8wQiAjYCnAEgACACNgKYAQwBC0Go3wooAgAiA0UNACADKAIEIgINABDzBCECQajfCigCACACNgIEC0Go3wogAjYCACACIAA2AgAgAiABNgI0IABBAyABQQAQ0gNBAEcLCgAgAEHfDhDZCQtHAQF/A0AgASAAKAIwTkUEQCAAKAI4IAFBAnRqKAIAEMYGIAFBAWohAQwBCwsgACgCPBAYIAAoAjQQvAEgACgCOBAYIAAQGAtYAQF/QZjfCigCAAR/A0BBnN8KKAIAIAFNBEBBAA8LQZjfCigCACABQQJ0aigCACgCACAAED5FBEAgAUEBaiEBDAELC0GY3wooAgAgAUECdGooAgAFQQALC7YKARF/IwBBEGsiDyQAQcgAEFIhC0Gg3wooAgAhBCAAKAIQKAJ4IQxBASEFA0ACQAJAAkACQCAELQAAIgpB3ABHBEAgCg0BDAQLIARBAWohByAELQABIgpB+wBrQQNJDQEgByEEIApB3ABGDQELAkACQAJAAkAgCkH7AGsOAwIBAAELIAlBAWshCQwCCyAKQfwARyAJcg0BIAVBAWohBUEAIQkMAwsgCUEBaiEJCyAJQQBIDQIMAQsgByEECyAEQQFqIQQMAQsLIAVBBBAaIQcgCyABOgBAIAsgBzYCOCADQQFqIREgAUEBcyESIANBAWshE0Gg3wooAgAhBCACQX9zIRRBACEHIAMhAUEAIQJBACEFQQAhCQJAA0BBASEKAkACQAJAAkACQAJAAkACQAJAA0AgCkEBcUUNBiAELQAAIgZBAWtB/wFxQR5NBEBBASEKQaDfCiAEQQFqIgQ2AgAMAQsCQAJAAkAgBkH7AGsOAwECAgALAkACQAJAIAZBPGsOAwEJAgALIAZFDQMgBkHcAEcNCCAELQABIgZB+wBrQQNJDQcgBkE8aw4DBwYHBQsgBUEGcQ0MIAwtAFINByAFQRJyIQUgAyIHIRAMCwsgDC0AUg0GIAVBEHFFDQsCQCAHIBFNDQAgB0EBayICIBBGDQAgAiAHIAItAABBIEYbIQcLIAdBADoAACADEKUBIgJFDQkgBUFvcSEFQaDfCigCACEEDAoLQaDfCiAEQQFqNgIAIAUNCiAELQABRQ0KIAAgEkEAIAMQyAYhBiALKAI4IAlBAnRqIAY2AgBBASEKIAlBAWohCUGg3wooAgAhBEEEIQUgBg0BDAoLIBQgBkVxIAVBEHFyDQkgBUEEcUUEQEHIABBSIQ0gCygCOCAJQQJ0aiANNgIAIAlBAWohCQsgAgRAIA0gAjYCPAsgBUEFcUUEQCADIAhqQSA6AAAgBUEBciEFIAhBAWohCAsgBUEBcQRAIAMgCGohBAJAIAhBAkgNACABIARBAWsiAkYNACACIAQgAi0AAEEgRhshBAtBACEIIARBADoAACAAIAMgDC0AUkEAIAwrAxAgDCgCBCAMKAIIENsCIQEgDUEBOgBAIA0gATYCNCADIQELQQAhAkEAIQpBoN8KKAIAIgQtAAAiBkUNAAsgBkH9AEYNBEEAIQUMBwsgBkUNAiAGQSBHDQAgDC0AUkEBRg0AQQEhDgwBCyADIAhqQdwAOgAAIAVBCXIhBSAIQQFqIQgLQaDfCiAEQQFqIgQ2AgALIAVBBHEEQCAELQAAQSBHDQULIAVBGHFFBEAgBSAFQQlyIAQtAABBIEYbIQULAkAgBUEIcQRAIAMgCGohCgJAAkAgDiAELQAAIgZBIEdyDQAgCkEBay0AAEEgRw0AIAwtAFJBAUcNAQsgCiAGOgAAIAhBAWohCAsgCCATaiABIA4bIQEMAQsgBUEQcUUNAAJAIA4gBC0AACIGQSBHckUEQCADIAdGDQEgB0EBay0AAEEgRg0BCyAHIAY6AAAgB0EBaiEHQaDfCigCACEECyAHQQFrIBAgDhshEAtBoN8KIARBAWoiBDYCAANAIAQsAAAiBkG/f0oNBkGg3wogBEEBaiIENgIAIAMgCGogBjoAACAIQQFqIQgMAAsAC0Gg3wogBEEBajYCAAsgCyAJNgIwDAQLIA8gAxBAQQFqNgIAQYj2CCgCAEH16QMgDxAgGhAvAAtBoN8KIARBAWoiBDYCAAwBCwsgCxDGBiACEBhBACELCyAPQRBqJAAgCwuuBAIGfwh8RAAAAAAAAChAIREgAUECdEEEakEQEBohBQNAIAEgBEYEQAJAIAIoAgBBDHZB/wBxQQFrIQhBACEEQQAhAgNAIAIhBiABIARGDQEgESAAIARBAWoiB0EAIAEgB0sbQQR0aiIJKwMAIAAgBEEEdGoiAisDACIMoSIPIAkrAwggAisDCCINoSIQEEejIQoCQAJAAkAgCA4FAQICAAACCyAKRAAAAAAAAAhAoyEKDAELIApEAAAAAAAA4D+iIQoLIAwhDiANIQsgAwRAIApEAAAAAAAA4D+iIg4gEKIgDaAhCyAOIA+iIAygIQ4LIAUgBkEEdGoiAiALOQMIIAIgDjkDACACRAAAAAAAAPA/IAqhIgsgEKIgDaA5AyggAiALIA+iIAygOQMgIAIgCiAQoiANoDkDGCACIAogD6IgDKA5AxAgBkEDaiECIAchBCADRQ0AIAUgAkEEdGoiAiAKRAAAAAAAAOC/okQAAAAAAADwP6AiCyAQoiANoDkDCCACIAsgD6IgDKA5AwAgBkEEaiECDAALAAsFIBEgACAEQQFqIgdBACABIAdLG0EEdGoiBisDACAAIARBBHRqIgQrAwChIAYrAwggBCsDCKEQR0QAAAAAAAAIQKMQKSERIAchBAwBCwsgBSAGQQR0aiIAIAUpAwA3AwAgACAFKQMINwMIIAAgBSkDEDcDECAAIAUpAxg3AxggACAFKQMgNwMgIAAgBSkDKDcDKCAFC2IBAn8jAEEQayIBJAACQCAAKAIAIgIEQCACIAAoAgQiABCQAiICRQ0BIAFBEGokACACDwtBntYBQYn7AEErQdw0EAAACyABIABBAWo2AgBBiPYIKAIAQfXpAyABECAaEC8AC1oBAn8CQCAAKAIAIgMEQCABRQ0BIAAoAgQiACABEEAiAkYgAyABIAAgAiAAIAJJGxDqAUVxDwtBwdYBQYn7AEHkAEH2OxAAAAtBlNYBQYn7AEHlAEH2OxAAAAuPGgINfwR8IwBBgAprIgMkAAJAAkAgAgRAIAItAAANAQsgAEJ/NwIADAELAn9B8NoKKAIABEBBjN8KKAIADAELQYzfCigCACIFQejaCigCACIEQZTfCigCAEYNABpBlN8KIAQ2AgBBACAFRQ0AGiAFEJkBGkGM3wpBADYCAEEACyADIAEoAhAoAggrAxgiEEQAAAAAAABYQCAQRAAAAAAAAPA/ZhsiEDkDsAEgAyAQOQO4AUUEQEGM3wpBlP0JQazuCSgCABCTATYCAAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACEOwJIgRFBEBBAUHQABAaIgRBACACEKwBNgIIIAQQ6wlFDRIgBCgCFCIBRQ0BQQAhAiADQQA2AtABIANCADcDyAEgA0IANwPAAQJAIANBwAFqQQFBFCABELsFQRRHDQADQCACQQpGDQEgAkEEdCEBIAJBAWohAiADQcABaiABQaDxB2oiBSgCACABQaTxB2ooAgAQzgENAAsgBCAFKAIIIgI2AhggBCAFKAIMNgIcAkACQCACQQlrDgIAAQYLAkAgA0HAAWpBPkEUEPoCDQADQCAEKAIUEK0CIgFBPkYNASABQX9HDQALDAULIANBADYC7AkgA0HsCWoiAUEBQQQgBCgCFBC7BUEERw0EIAFBAXIhAQNAIAMoAuwJQbzm2bsGRgRAQQghAiAEQQg2AhggBEG9/QA2AhwMBwsgBCgCFBCtAiICQX9GDQUgAS8AACEFIAMgAS0AAjoA7gkgAyAFOwHsCSADIAI6AO8JDAALAAsgAygCyAFB14qJggVHDREgBEELNgIYIARBy9sANgIcDAULIARBADYCGCAEQcqnAzYCHAwFCyAEEM0GDBILQdCFAUG9vQFB6AVB5uUAEAAACyAEKAIYIQILIAIODQEEAgMFCwYMCQwMAAoMCyAEQQA2AkAgBCgCFEEPQQAQrAIaIAQoAhQQrQIgBCgCFCEBQdgARw0GIAFBGEEAEKwCGiAEKAIUQQQgA0HAAWoQnwJFDQsgBCgCFEEEIANB7AlqEJ8CDQcMCwsgBCAEKAIIEMcGIgE2AkQgAQ0KIAMgBCgCCDYCEEG9iQQgA0EQahAqDAwLIARBADYCQCAEKAIUQQZBABCsAhogBCgCFEECIANBwAFqEJ8CRQ0JIAQoAhRBAiADQewJahCfAkUNCSAEIAMoAsABtzkDMCAEIAMoAuwJtzkDOAwJCyAEQQA2AkAgBCgCFEEQQQAQrAIaIAQoAhRBBCADQcABahCeAkUNCCAEKAIUQQQgA0HsCWoQngJFDQggBCADKALAAbc5AzAgBCADKALsCbc5AzgMCAsgBEEANgJAIAQoAhRBEEEAEKwCGiAEKAIUQQIgA0HAAWoQnwJFDQcgBCgCFEECIANB7AlqEJ8CRQ0HIAQoAhRBAiADQeAJahCfAkUNByAEKAIUQQIgA0HQCWoQnwJFDQcgBCADKALsCSADKALAAUEQdHK3OQMwIAQgAygC0AkgAygC4AlBEHRytzkDOAwHCyAEQQA2AkAgBCgCFBDmAwNAIAQoAhRBASADQcABahCeAkUEQCADIAQoAgg2AiBBwL8EIANBIGoQKgwICyADKALAASICQf8BRg0AQcXyByACQQsQ+gINACAEKAIUIQECQAJAAkAgAkHAAWsOAwACAQILIAFBA0EBEKwCDQkgBCgCFEECIANB0AlqEJ4CRQ0JIAQoAhRBAiADQeAJahCeAkUNCSAEIAMoAtAJtzkDOCAEIAMoAuAJtzkDMAwJCyABQQNBARCsAg0IIAQoAhRBAiADQdAJahCeAkUNCCAEKAIUQQIgA0HgCWoQngJFDQggBCADKALQCbc5AzggBCADKALgCbc5AzAMCAsgAUECIANB7AlqEJ4CRQ0HIAQoAhQgAygC7AlBAmtBARCsAhoMAAsACyAEQcgANgJAIAQoAhQQ5gMDQCADQcABaiIBQYAIIAQoAhQQqAdFDQYgAUGz4QEQsgUiAUUNACADIANByAlqNgI8IAMgA0HQCWo2AjggAyADQeAJajYCNCADIANB7AlqNgIwIAFB/LEBIANBMGoQUUEERw0ACyAEIAMoAuwJIgG3OQMgIAQgAygC4AkiArc5AyggBCADKALQCSABa7c5AzAgBCADKALICSACa7c5AzgMBQsgAUEaQQAQrAIaIAQoAhRBAiADQcABahCfAkUNBCAEKAIUQQIgA0HsCWoQnwJFDQQLIAQgAygCwAG3OQMwIAQgAygC7Am3OQM4DAMLIANCADcDyAEgA0IANwPAASAEKAIUEOYDIANB9AlqIQlEAAAAAAAAAAAhEEEAIQUCQANAIAcgBUEBcXENAQJ/A0AgBCgCFBCtAiIBQX9HBEBBACABQQpGDQIaIANBwAFqIAHAEJcDDAELC0EBCyADQcABahDpCSEIAkADQCAIQQJqIQxBACECAkADQCACIAhqIg0sAAAiBkUNAUEBIQECQCAGQeEAa0EZTQRAA0AgASIOQQFqIQEgCCACIgZBAWoiAmotAAAiCkHfAXHAQcEAa0EaSQ0ACyAKQT1HDQIgBiAMai0AAEEiRw0CQQAhASAGQQNqIgYhAgNAIAIgCGotAAAiCkUNAyAKQSJGDQIgAUEBaiEBIAJBAWohAgwACwALIAJBAWohAgwBCwsgAyAONgLwCSADIA02AuwJIAMgAykC7Ak3A6gBIAMgBiAIaiICNgL0CSADIAE2AvgJIAEgAmpBAWohCCADQagBakH49wAQywYEQCADIAkpAgA3A1ggA0HYAGoQygYhAiADIANB3QlqIgE2AlQgAyADQeAJaiIGNgJQAkAgAkH7MSADQdAAahBRQQJHBEAgAyAGNgJAIAJB8IMBIANBQGsQUUEBRw0BQd8cIQELQQEhBSADKwPgCSABEOcJIRELIAIQGCAHQQAhB0UNAkEBIQcMAQsgAyADKQLsCTcDoAEgA0GgAWpBgyEQywYEQCADIAkpAgA3A3ggA0H4AGoQygYhAiADIANB3QlqIgE2AnQgAyADQeAJaiIGNgJwAkAgAkH7MSADQfAAahBRQQJHBEAgAyAGNgJgIAJB8IMBIANB4ABqEFFBAUcNAUHfHCEBC0EBIQcgAysD4AkgARDnCSEQCyACEBhBASECIAVBAXFBACEFRQ0CDAMLIAMgAykC7Ak3A5gBIANBmAFqQZ4SEMsGRQ0BIAMgCSkCADcDkAEgA0GQAWoQygYhASADIANB0AlqNgKAASADIANByAlqNgKEASABQeSDASADQYABahBRQQJGBEAgAysD0AkhE0EBIQ8gAysDyAkhEgsgARAYDAELCyAFIQILIA8EQCARIBMgAkEBcRshESAQIBIgBxshEAwCCyACIQVFDQALIBFEAAAAAAAAAAAgAkEBcRshESAQRAAAAAAAAAAAIAcbIRALIARBADYCQAJAIBFEAAAAAAAAAABmRSARRAAAwP///99BZUVyRQRAIAQCfyARmUQAAAAAAADgQWMEQCARqgwBC0GAgICAeAu3OQMwIBBEAAAAAAAAAABmRSAQRAAAwP///99BZUVyDQEgBAJ/IBCZRAAAAAAAAOBBYwRAIBCqDAELQYCAgIB4C7c5AzggA0HAAWoQXAwEC0GWygFBvb0BQdkCQdiHARAAAAtBgcwBQb29AUHbAkHYhwEQAAALIARBADYCQCAEKAIUQQZBABCsAhogBCgCFEEBIANBwAFqEJ4CRQ0BIAQoAhRBASADQewJahCeAkUNASAEIAMoAsABtzkDMCAEIAMoAuwJtzkDOAwBC0EAIQEgBEEANgJAIAQoAhQQ5gMgBCgCFCIFRQ0BAkADQCABQQlGBEBBACECA0AgAkGyEmosAAAiB0UNAyAFEK0CIgFBf0YNBCACQQFqIAFBL0YgASAHRhshAgwACwALIAFBshJqLQAAIQcgAUEBaiIBIQIDQCACQbISai0AACIGRQ0BIAJBAWohAiAGIAdHDQALC0GfxwFBvb0BQd8EQdc0EAAACyADQfgJakIANwIAIANCADcC8AkgAyAFNgLsCSADQewJaiIBEOYJIANB8AlqIQICQCAFEK0CQdsARw0AIAEQ9wQgA0HAAWoQ9gQNACABEPcEIANByAFqEPYEDQAgARD3BCADQdABahD2BA0AIAEQ9wQgA0HYAWoQ9gQgAhBcDQEgBCADKwPAASIQOQMgIAQgAysDyAEiETkDKCAEIAMrA9ABIBChOQMwIAQgAysD2AEgEaE5AzgMAQsgAhBcCyAEEM0GQYzfCigCACIBIARBASABKAIAEQMAGgwCC0Go1QFBvb0BQdgEQdc0EAAACyAEKAIIIgEEQEEAIAFBABCMARoLIAQQGEEAIQQLIAMgAykDuAE3AwggAyADKQOwATcDACAAIAQgAxDqCQsgA0GACmokAAsnAQF/AkAgAC0AEUEBRw0AIAAoAhQiAUUNACABEOoDIABBADYCFAsLugMBBH8jAEEgayIEJABBASEFIAAiAiEDAkACQAJAIAEOAgIBAAsCQANAIAIiAS0AACIDRQ0BIAFBAWohAiADQf8ASQ0AIAFBAmohAkEAIQUgA0H8AXFBwAFGDQALQYTfCi0AAEGE3wpBAToAACAAIQNBAXENAkH8hgRBABAqDAILIAAhAyAFDQELIAAhASMAQRBrIgIkACACQgA3AwggAkIANwMAA0AgAS0AACIDBEAgA0H/AEkEfyABQQFqBSABLQABQT9xIANBBnRyIQMgAUECagshASACIAPAEH8MAQsLIAIQ0QYgAkEQaiQAIQMLIARCADcDGCAEQgA3AxBBKCEBIAMhAgJAA0ACQCAEQRBqIgUgAcAQlwMCQCACLQAAIgFBKGtBAkkgAUHcAEZyRQRAIAENASAFQSkQlwMgACADRwRAIAMQGAsgBEEQaiIAEChFDQIgACAAECQiABCQAiICDQQgBCAAQQFqNgIAQYj2CCgCAEH16QMgBBAgGhAvAAsgBEEQakHcABCXAyACLQAAIQELIAJBAWohAgwBCwsgBEEQakEAEJcDIAQoAhAhAgsgBEEgaiQAIAILqQIBA38jAEGgCGsiBSQAAkACQAJAIAFFDQBBASEEA0AgBEEBcUUNAiABIANBAnRqKAIAIgRFDQEgA0EBaiEDIAQtAABBAEchBAwACwALA0AgAigCACIEBEAgACAEEBsaIABB7v8EEBsaIAJBBGohAgwBCwsgAUUNAQtBACEEA0AgASAEQQJ0aigCACICRQ0BAkAgAi0AAEUNACACEPsEIgNFBEAgBSACNgIAQf76AyAFECoMAQsgA0HjOxCfBCICBEADQCAFQSBqIgNBAEGACBA4GiAAIAMgA0EBQYAIIAIQuwUiAxChAhogA0H/B0sNAAsgAEHu/wQQGxogAhDqAwwBCyAFIAM2AhBB4voDIAVBEGoQKgsgBEEBaiEEDAALAAsgBUGgCGokAAufAwIGfAN/IARBAXEhDAJAIAJBAkYEQCAAKwMIIgYgACsDGCAGoSIFoCEHIAYgBaEhBiAAKwMAIgUgACsDECAFoSIIoCEKIAUgCKEhCAwBCyAAKwMAIgohCCAAKwMIIgchBgNAIAIgC0YNASAAIAtBBHRqIg0rAwgiBSAHIAUgB2QbIQcgDSsDACIJIAogCSAKZBshCiAFIAYgBSAGYxshBiAJIAggCCAJZBshCCALQQFqIQsMAAsACyAEQQJxIQAgBiAHIAahRAAAAAAAAOA/oqAhBSAIIAogCKFEAAAAAAAA4D+ioCEJAn8gDARAIAEgCTkDACABIAUgBZogABs5AwggASAJIAihIAUgBqEQRyIDRAAAAAAAANA/ojkDEEEYDAELIAcgBaEhByAKIAmhIQggAxBKIQogAxBXIQMCfCAABEAgByADoiIDIAWgIQYgBSADoQwBCyAFIAahmiADoiAFoSEGIAcgA6IgBaELIQcgASAGOQMYIAEgBzkDCCABIAkgCCAKoiIDoTkDACADIAmgIQNBEAsgAWogAzkDAAtnAQN/IwBBEGsiASQAAkAgABAoBEAgACAAECQiAxCQAiICDQEgASADQQFqNgIAQYj2CCgCAEH16QMgARAgGhAvAAsgAEEAEH8gACgCACECCyAAQgA3AgAgAEIANwIIIAFBEGokACACC4gEAQV/IwBBMGsiAyQAIAMgADYCLCABQeTeCigCAEcEQEHk3gogATYCAEHo3gpBADoAAAsgA0IANwMgIANCADcDGANAIAMgAEEBajYCLCAALQAAIgIEQAJAAkACQAJAAn8gAkHAAU8EQEEBIAJB4AFJDQEaQQIgAkHwAUkNARpBAyACQfgBSQ0BGkHo3gotAABB6N4KQQE6AABBAXFFBEAgAyABECE2AhBBtNEEIANBEGoQKgsgAiADQRhqEPEJIQJBfwwBCyACQSZGDQFBAAshBUEAIQQgBUEAIAVBAEobIQYgAygCLCEAA0AgBCAGRg0DIAAsAABBv39KDQIgA0EYaiACwBB/IARBAWohBCAALQAAIQIgAEEBaiEADAALAAsgA0EsahDwCSICRQRAQSYhAgwDCyACQf4ATQ0CIAJB/g9NBEAgA0EYaiACQQZ2QUByEH8gAkE/cUGAf3IhAgwDCyADQRhqIgAgAkEMdkFgchB/IAAgAkEGdkE/cUGAf3IQfyACQT9xQYB/ciECDAILQejeCi0AAEHo3gpBAToAACADIAA2AixBAXFFBEAgAyABECE2AgQgAyAFQQFqNgIAQcfQBCADECoLIAJB/wFxIANBGGoQ8QkhAgwBCyADIAA2AiwLIANBGGogAsAQfyADKAIsIQAMAQsLIANBGGoQ0QYgA0EwaiQAC8EBAQR/IwBBMGsiBCQAIAQgAjYCJCAEIAE2AiAgBEIANwMYIAQgAyADQTBqIgUgAygCAEEDcSIGQQNGGygCKDYCKCAEIAMgA0EwayIHIAZBAkYbKAIoNgIsIAAgBEEYakEBIAAoAgARAwAaIAQgATYCDCAEIAI2AgggBEIANwMAIAQgAyAHIAMoAgBBA3EiAUECRhsoAig2AhAgBCADIAUgAUEDRhsoAig2AhQgACAEQQEgACgCABEDABogBEEwaiQACzMBAX8CQCAEDQBBACEEIAEQkgIiBUECSw0AIAAgBSACQfH/BBAiIQQLIAEgBCADEHEgBAtOACABIABB1NwKKAIARAAAAAAAACxARAAAAAAAAPA/EEw5AwAgASAAQdjcCigCAEHq6QAQjwE2AgggASAAQdzcCigCAEGF9QAQjwE2AgwLPAECfwNAAkAgASADQQJ0aigCACIERQ0AIAAEQCAAIAQQTUUNAQsgA0EBaiEDDAELCyACIANBAnRqKAIACzMAIAAgASgCECgClAEiASsDAEQAAAAAAABSQKI5AwAgACABKwMIRAAAAAAAAFJAojkDCAtlAQJ/AkAgAEUNACAALAAAIgNFDQACQCAAQfqTARAuRQ0AIABBrt4AEC5FDQBBASECIABBvooBEC5FDQAgAEH4LRAuRQ0AIAEhAiADQTBrQQlLDQAgABCRAkEARyECCyACDwsgAQvvAgIBfwJ8IwBBoAFrIgYkACAGIAAgBRDNAyIIOQMIIAQgBTYCCCAEIAEgAkEEdGoiBSkDADcDECAEIAUpAwg3AxgCQCACIANPDQAgBSsDACABIAJBA2oiAEEEdGoiAysDAKEiByAHoiAFKwMIIAMrAwihIgcgB6KgnyAIY0UNACAAIQILIAYgASACQQR0aiIAKQM4NwMYIAYgACkDMDcDECAGIAApAyg3AyggBiAAKQMgNwMgIAYgACkDGDcDOCAGIAApAxA3AzAgBiAFKQMINwNIIAYgBSkDADcDQCAGQUBrIQEgCEQAAAAAAAAAAGQEQCAGIAE2AlggBiAGQQhqNgJcIAZB2ABqQSYgBkEQakEAEIIFCyAAIAEpAwA3AwAgACABKQMINwMIIAAgBikDODcDGCAAIAYpAzA3AxAgACAGKQMoNwMoIAAgBikDIDcDICAAIAYpAxg3AzggACAGKQMQNwMwIAZBoAFqJAAgAgvtAgIBfwJ8IwBBoAFrIgYkACAGIAAgBRDNAyIIOQMIIAQgBTYCDCAEIAEgA0EEdGoiACIFQTBqKQMANwMgIAQgACkDODcDKAJAIAIgA08NACAAKwMAIAUrAzChIgcgB6IgACsDCCAAKwM4oSIHIAeioJ8gCGNFDQAgA0EDayEDCyAGIAEgA0EEdGoiAEEIaikDADcDSCAGIAApAwA3A0AgBiAAKQMYNwM4IAYgACkDEDcDMCAGIAApAyg3AyggBiAAKQMgNwMgIAYgBSkDMDcDECAGIAUpAzg3AxggCEQAAAAAAAAAAGQEQCAGIAZBCGo2AlwgBiAGQRBqIgE2AlggBkHYAGpBJiABQQEQggULIAAgBkFAayIBKQMANwMAIAAgASkDCDcDCCAAIAYpAzg3AxggACAGKQMwNwMQIAAgBikDKDcDKCAAIAYpAyA3AyAgACAGKQMYNwM4IAAgBikDEDcDMCAGQaABaiQAIAMLXwEBfwNAAkACQCABKAIAIgMEfyAARQ0BIAAgAyADEEAiAxDqAQ0CIAIgAigCACABKAIEcjYCACAAIANqBSAACw8LQYjUAUHr+wBBDEGe9wAQAAALIAFBCGohAQwACwAL+wIBBH8jAEEQayIEJAAgAUEANgIAIAIgABAtEIICQQBHIgM2AgACQEHo3AooAgAiBUUNAAJAIAAgBRBFIgUtAABFDQBBkN4HIQMDQCADKAIAIgZFDQEgBSAGEE0EQCADQQxqIQMMAQUgASADKAIENgIAIAIgAygCCCIDNgIADAMLAAsACyACKAIAIQMLAkAgA0EBRw0AIAAQLUECQY+xAUEAECIiA0UNACAAIAMQRSIDLQAARQ0AIAMgAhCGCgsCQCABKAIAQQFHDQAgABAtQQJB9O4AQQAQIiIDRQ0AIAAgAxBFIgMtAABFDQAgAyABEIYKCyAAKAIQLQCZAUEBRgRAIAAgAEEwayIDIAAoAgBBA3FBAkYbKAIoEC0gACADIAAoAgBBA3EiA0ECRhsoAiggAEEwQQAgA0EDRxtqKAIoQQBBABBeIARBDGogBEEIahDcBiACIAIoAgAgBCgCDHI2AgAgASABKAIAIAQoAghyNgIACyAEQRBqJAALmxcCCH8NfCMAQfAAayIHJAACQAJAAkACQAJAAkAgACgCACIIKAIQIgUtACwNACAFLQBUDQAgBS0AMSEGIAUtAFkhCQwBCyAFLQAxIgZBCHENASAFLQBZIglBCHENASAGQQVxRQ0AIAYgCUYNAgtBAUF/IAhBMEEAIAgoAgBBA3FBA0cbaigCKCILKAIQIggrAxgiDSAFKwMYoCIQIA0gBSsDQKAiEWYiChsgCCsDECISIAUrAzigIRYgEiAFKwMQoCEUIAgrA2AhDSAGIAkQ/wQhBiADRAAAAAAAAOA/oiABuKNEAAAAAAAAAEAQIyEOIBAgEaBEAAAAAAAA4D+iIRdEAAAAAAAAAAAhAyANIBIgDaAiDyAWoUQAAAAAAAAIQKIQKSETIA0gDyAUoUQAAAAAAAAIQKIQKSEPQX9BASAKGyAGQcEARyAGQSBHcSAQIBFichu3IA6iIRVBACEGA0AgASAGRg0EIAAgBkECdGooAgAhBSAHIBIgAiANoCINoCIOOQNAIAcgFzkDOCAHIA45AzAgByAOOQMgIAcgETkDaCAHIBEgFSADoCIDoSIOOQNYIAcgFjkDYCAHIBYgAiAToCITRAAAAAAAAAhAo6A5A1AgByAOOQNIIAcgEDkDCCAHIBAgA6AiDjkDKCAHIA45AxggByAUOQMAIAcgFCACIA+gIg9EAAAAAAAACECjoDkDEAJAIAUoAhAoAmBFDQAgBUEwQQAgBSgCAEEDcUEDRxtqKAIoEC0hCSAFKAIQKAJgIgggCEEgQRggCSgCECgCdEEBcRtqKwMAIg5EAAAAAAAA4D+iIA0gCygCECIJKwMQoKA5AzggCSsDGCEYIAhBAToAUSAIIBg5A0AgAiAOY0UNACANIA4gAqGgIQ0LIAUgBUFQQQAgBSgCAEEDcUECRxtqKAIoIAdBByAEEJQBIAZBAWohBgwACwALIAZBAnENASAFLQBZIglBAnENAUEBQX8gCEEwQQAgCCgCAEEDcUEDRxtqKAIoIgsoAhAiCCsDGCINIAUrAxigIhAgDSAFKwNAoCIRZiIKGyAIKwMQIhIgBSsDOKAhFiASIAUrAxCgIRQgCCsDWCENIAYgCRD/BCEGIANEAAAAAAAA4D+iIAG4o0QAAAAAAAAAQBAjIQ4gECARoEQAAAAAAADgP6IhF0QAAAAAAAAAACEDIA0gFiANoCASoUQAAAAAAAAIQKIQKSETIA0gFCANoCASoUQAAAAAAAAIQKIQKSEPQX9BASAKGyAGQcMARyAGQQxHcSAQIBFichu3IA6iIRVBACEGA0AgASAGRg0DIAAgBkECdGooAgAhBSAHIBIgAiANoCINoSIOOQNAIAcgFzkDOCAHIA45AzAgByAOOQMgIAcgETkDaCAHIBEgFSADoCIDoSIOOQNYIAcgFjkDYCAHIBYgAiAToCITRAAAAAAAAAhAo6E5A1AgByAOOQNIIAcgEDkDCCAHIBAgA6AiDjkDKCAHIA45AxggByAUOQMAIAcgFCACIA+gIg9EAAAAAAAACECjoTkDEAJAIAUoAhAoAmBFDQAgBUEwQQAgBSgCAEEDcUEDRxtqKAIoEC0hCSAFKAIQKAJgIgggCygCECIKKwMQIA2hIAhBIEEYIAkoAhAoAnRBAXEbaisDACIORAAAAAAAAOC/oqA5AzggCisDGCEYIAhBAToAUSAIIBg5A0AgAiAOY0UNACANIA4gAqGgIQ0LIAUgBUFQQQAgBSgCAEEDcUECRxtqKAIoIAdBByAEEJQBIAZBAWohBgwACwALIAZBBHENACAGQQFxBEAgCEEwQQAgCCgCAEEDcUEDRxtqKAIoIgsoAhAiCCsDGCETIAgrA1AgBSsDQCESIAUrAxghFCAGIAkQ/wQhBiAIKwMQIg0gBSsDEKAiECANIAUrAzigIhGgRAAAAAAAAOA/oiEXRAAAAAAAAAAAIQ0gAkQAAAAAAADgP6IgAbijRAAAAAAAAABAECMhDkQAAAAAAADgP6IiAiACIBMgEqAiEqAgE6FEAAAAAAAACECiECkhFiACIAIgEyAUoCIUoCAToUQAAAAAAAAIQKIQKSEPIA5BAEEBQX8gECARZhsiBWsgBSAGQcMARhu3oiEVQQAhBgNAIAEgBkYNAyAAIAZBAnRqKAIAIQUgByATIAMgAqAiAqEiDjkDSCAHIA45AzggByAXOQMwIAcgDjkDKCAHIBI5A2ggByASIAMgFqAiFkQAAAAAAAAIQKOhOQNYIAcgETkDYCAHIBEgFSANoCINoSIOOQNQIAcgDjkDQCAHIBA5AwAgByAQIA2gIg45AyAgByAUOQMIIAcgFCADIA+gIg9EAAAAAAAACECjoTkDGCAHIA45AxACQCAFKAIQKAJgRQ0AIAVBMEEAIAUoAgBBA3FBA0cbaigCKBAtIQkgBSgCECgCYCIIIAsoAhAiCisDGCACoSAIQRhBICAJKAIQKAJ0QQFxG2orAwAiDkQAAAAAAADgv6KgOQNAIAorAxAhGCAIQQE6AFEgCCAYOQM4IAMgDmNFDQAgAiAOIAOhoCECCyAFIAVBUEEAIAUoAgBBA3FBAkcbaigCKCAHQQcgBBCUASAGQQFqIQYMAAsAC0H0ngNB+bkBQbEJQYWeARAAAAsjAEHwAGsiBiQARAAAAAAAAPA/RAAAAAAAAPC/IAAoAgAiCEEwQQAgCCgCAEEDcUEDRxtqKAIoIgsoAhAiBSsDECINIAgoAhAiCCsDEKAiEyANIAgrAzigIhFmGyEQIAUrA1BEAAAAAAAA4D+iIRIgBSsDGCIWIAgrA0CgIRQgFiAIKwMYoCEOIAgtADEgCC0AWRD/BCEIIAJEAAAAAAAA4D+iIAG4o0QAAAAAAAAAQBAjIQICQAJAAkACQAJAAkACQAJAAkACQAJAIAhBJWsODwUBCgoCCgoKCgoFAwoKBQALAkAgCEHJAGsODQYJCQoKCgoKCgoHCAkACwJAIAhBDmsOAgUABAsgECACIAUrA2AgESANoaGgoiEPDAkLIBAgAiAFKwNYIA0gEaGhoKIhDwwICyAQIAIgBSsDYCATIA2hoaCiIQ8MBwsgECACIAUrA2AgEyANoaGgoiEPDAYLIAhBOWtBAk8NBQsgECAFKwNYIA0gE6GhIAUrA2AgESANoaGgRAAAAAAAAAhAo6IhDwwECyAQIAIgBSsDWCANIBOhoaCiIQ8MAwsgECAFKwNYIA0gE6GhoiEPDAILIBAgAiAFKwNYIA0gE6GhIAUrA2AgESANoaGgRAAAAAAAAOA/oqCiIQ8MAQsgECACIAKgIAUrA1ggDSAToaEgBSsDYCARIA2hoaBEAAAAAAAA4D+ioKIhDwsgEyARoEQAAAAAAADgP6IhGCASIBYgEqAiFyAUoUQAAAAAAAAIQKIQKSENIBIgFyAOoUQAAAAAAAAIQKIQKSEXQQAhCANAIAEgCEcEQCAAIAhBAnRqKAIAIQUgBiAWIAMgEqAiEqAiFTkDSCAGIBU5AzggBiAYOQMwIAYgFTkDKCAGIBQ5A2ggBiAUIAMgDaAiDUQAAAAAAAAIQKOgOQNYIAYgETkDYCAGIBEgECACoiAPoCIPoSIVOQNQIAYgFTkDQCAGIBM5AwAgBiATIA+gIhU5AyAgBiAOOQMIIAYgDiADIBegIhdEAAAAAAAACECjoDkDGCAGIBU5AxACQCAFKAIQKAJgRQ0AIAVBMEEAIAUoAgBBA3FBA0cbaigCKBAtIQogBSgCECgCYCIJIAlBGEEgIAooAhAoAnRBAXEbaisDACIVRAAAAAAAAOA/oiASIAsoAhAiCisDGKCgOQNAIAorAxAhGSAJQQE6AFEgCSAZOQM4IAMgFWNFDQAgEiAVIAOhoCESCyAFIAVBUEEAIAUoAgBBA3FBAkcbaigCKCAGQQcgBBCUASAIQQFqIQgMAQsLIAZB8ABqJAALIAdB8ABqJAAL+gEBBH8jAEEQayIEJAADQCAAIgMoAhAiAigCeCIABEAgAi0AcA0BCwsgAigCCCIARQRAQQFBKBAaIQAgAygCECAANgIICwJAIAAoAgQiAkHVqtUqSQRAIAAoAgAgAkEwbCICQTBqIgUQaiIARQ0BIAAgAmpBAEEwEDgaIAMoAhAoAggiAyAANgIAIAMgAygCBCIDQQFqNgIEIAFBEBAaIQIgACADQTBsaiIAIAE2AgQgACACNgIAIABBCGpBAEEoEDgaIARBEGokACAADwtBjsADQdL8AEHNAEG9swEQAAALIAQgBTYCAEGI9ggoAgBB9ekDIAQQIBoQLwAL0AECBX8BfCMAQUBqIgUkACABKAIQIgYrA2AhCQNAIARBBEZFBEAgBSAEQQR0IgdqIgggAiAHaiIHKwMAIAYrAxChOQMAIAggBysDCCAGKwMYoTkDCCAEQQFqIQQMAQsLIAAgBigCCCgCBCgCDCAFIAMQggUgASgCECEAQQAhBANAIARBBEZFBEAgAiAEQQR0IgFqIgMgASAFaiIBKwMAIAArAxCgOQMAIAMgASsDCCAAKwMYoDkDCCAEQQFqIQQMAQsLIAAgCTkDYCAFQUBrJAALzgUCCX8BfCMAQSBrIgQkACAEQQA2AhwCQCACKAIEIgUEQCAFKAIAIgNFDQEgBSgCCEUEQCAFIANB4PIJQSNBJEEiEOwDNgIIC0Hs2gotAAAEQCAEQRxqQQAgBSgCABChBhshBgtBACEDAkAgASgCjAEiAUUNACABKAIAIgFFDQAgAiAGIAERAAAhAwsCQAJAIANFBEAgAigCBCIBKAIYIQMgASsDECEMIAJCADcDICACIAw5AxAgAkIANwMIIAIgDEQzMzMzMzPzP6I5AyggAiAMRJqZmZmZmbk/ojkDGCACIAwCfCABKAIAIQEgAigCACEJIANBAXEhByADQQJxQQF2IQMjAEEgayIIJAACQAJAAkAgAQRAIAlFDQEgARCNCiIKQZAGQZACIAMbQZAEQRAgAxsgBxtqIQtBACEHA0AgCS0AACIBRQ0DAkAgAcBBAE4EQCABIQMMAQtBICEDQbzeCi0AAA0AQbzeCkEBOgAAIAggATYCEEGmiAQgCEEQahAqCwJAIAsgA0EBdGouAQAiAUF/RgRAQQAhAUG93gotAAANAUG93gpBAToAACAIIAM2AgBB190EIAgQKgwBCyABQQBIDQULIAlBAWohCSABIAdqIQcMAAsAC0HZmAFB7bcBQcMGQcocEAAAC0HHGEHttwFBxAZByhwQAAALIAorAwghDCAIQSBqJAAgB7ggDKMMAQtBi5kDQe23AUG9BkGa8gAQAAALojkDICAGRQ0CIAZBtMgBNgIADAELIAZFDQELIAUoAgAhAUGI9ggoAgAhAyAEKAIcIgUEQCAEIAU2AhQgBCABNgIQIANBo/8DIARBEGoQIBoMAQsgBCABNgIAIANBr/sEIAQQIBoLIAAgAikDIDcDACAAIAIpAyg3AwggBEEgaiQADwtB7R5BvLsBQc8AQcqHARAAAAtB45gBQby7AUHSAEHKhwEQAAALsgEBBn8jAEEQayICJAACQCAAIAJBDGoQkQoiBARAIAIoAgwiA0EYED8hBSABIAM2AgAgBSEAAkADQCADIAZLBEAgACAEIAJBCGoiBxDhATkDACAEIAIoAggiA0YNAiAAIAMgBxDhATkDCCADIAIoAggiBEYNAiAAQgA3AxAgBkEBaiEGIABBGGohACABKAIAIQMMAQsLIAEgBTYCBAwCCyAFEBgLQQAhBAsgAkEQaiQAIAQL1QICA3wCfyMAQRBrIgkkAAJAIAFEAAAAAAAAAABlBEAgAiIGIgEhAAwBCwJ/RAAAAAAAAAAAIABEAAAAAAAAGECiIABEAAAAAAAA8D9mGyIAmUQAAAAAAADgQWMEQCAAqgwBC0GAgICAeAshCiACRAAAAAAAAPA/IAEgACAKt6EiB6KhoiEIIAJEAAAAAAAA8D8gAaGiIQAgAiEGIAJEAAAAAAAA8D8gAUQAAAAAAADwPyAHoaKhoiIHIQECQAJAAkACQAJAAkAgCg4GBgUAAQIDBAsgACEGIAIhASAHIQAMBQsgACEGIAghASACIQAMBAsgByEGIAAhASACIQAMAwsgACEBIAghAAwCCyAJQdgANgIEIAlBlL0BNgIAQYj2CCgCAEHYvwQgCRAgGhA7AAsgCCEGIAIhAQsgAyAGOQMAIAQgATkDACAFIAA5AwAgCUEQaiQACysAIAAgAyABQQAQtQVFBEAgACADIAFB8f8EELUFGgsgACADIAEgAhC1BRoLagEBfyMAQRBrIggkAAJ/AkACQCABIAcQLkUEQCAAIAAvASQgBnI7ASQMAQsgASAFEC5FBEAgACAALwEkIARyOwEkDAELIAEgAxAuDQELQQAMAQsgCCABNgIAIAIgCBAqQQELIAhBEGokAAstAQF/IAMoAgAiBEUEQEGOrwNBovsAQRNB4zgQAAALIAAgASACKAIAIAQRAwALcgECfyMAQSBrIgQkAAJAIAAgA0kEQEEAIAAgACACEE4iBRsNASAEQSBqJAAgBQ8LIAQgAjYCBCAEIAA2AgBBiPYIKAIAQabqAyAEECAaEC8ACyAEIAAgAXQ2AhBBiPYIKAIAQfXpAyAEQRBqECAaEC8AC1QAIAchAiAGIQQgBSEDAkACQAJAAkAgAUEPaw4EAwEBAgALIAFBKUYNAQtBfyECQZ4BIQQgAUEcRw0AIAAoAhANAEE7DwsgACAENgIAIAIhAwsgAwvwAgEEfyMAQTBrIgMkACADIAE2AgwgAyABNgIsIAMgATYCEAJAAkACQAJAAkBBAEEAIAIgARBgIgZBAEgNACAGQQFqIQECQCAAEEsgABAkayIEIAZLDQAgASAEayEEIAAQKARAQQEhBSAEQQFGDQELIAAgBBC9AUEAIQULIANCADcDGCADQgA3AxAgBSAGQRBPcQ0BIANBEGohBCAGIAUEfyAEBSAAEHMLIAEgAiADKAIsEGAiAUcgAUEATnENAiABQQBMDQAgABAoBEAgAUGAAk8NBCAFBEAgABBzIANBEGogARAfGgsgACAALQAPIAFqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABB6gFB+B4QAAALIAUNBCAAIAAoAgQgAWo2AgQLIANBMGokAA8LQcamA0Gg/ABB3QFB+B4QAAALQa2eA0Gg/ABB4gFB+B4QAAALQfnNAUGg/ABB5QFB+B4QAAALQaOeAUGg/ABB7AFB+B4QAAALJAEBfyMAQRBrIgMkACADIAE2AgwgAiAAIAEQxRIgA0EQaiQAC0sBAn8gACgCBCIHQQh1IQYgB0EBcQRAIAMoAgAgBhDuBiEGCyAAKAIAIgAgASACIAMgBmogBEECIAdBAnEbIAUgACgCACgCFBELAAssAQJ/AkAgACgCJCICRQ0AIAAtAJABDQAgACgCACgCbA0AIAIQ6QMhAQsgAQsgAAJAIAEgACgCBEcNACAAKAIcQQFGDQAgACACNgIcCwuaAQAgAEEBOgA1AkAgAiAAKAIERw0AIABBAToANAJAIAAoAhAiAkUEQCAAQQE2AiQgACADNgIYIAAgATYCECADQQFHDQIgACgCMEEBRg0BDAILIAEgAkYEQCAAKAIYIgJBAkYEQCAAIAM2AhggAyECCyAAKAIwQQFHDQIgAkEBRg0BDAILIAAgACgCJEEBajYCJAsgAEEBOgA2CwsKACAAIAFqKAIAC3YBAX8gACgCJCIDRQRAIAAgAjYCGCAAIAE2AhAgAEEBNgIkIAAgACgCODYCFA8LAkACQCAAKAIUIAAoAjhHDQAgACgCECABRw0AIAAoAhhBAkcNASAAIAI2AhgPCyAAQQE6ADYgAEECNgIYIAAgA0EBajYCJAsLswEBA38jAEEQayICJAAgAiABNgIMAkACQAJ/IAAQowEiBEUEQEEBIQEgABClAwwBCyAAEPYCQQFrIQEgACgCBAsiAyABRgRAIAAgAUEBIAEgARDrCiAAEEYaDAELIAAQRhogBA0AIAAiASADQQFqENMBDAELIAAoAgAhASAAIANBAWoQvwELIAEgA0ECdGoiACACQQxqENwBIAJBADYCCCAAQQRqIAJBCGoQ3AEgAkEQaiQACxwAIAAQigUiAEGs7Ak2AgAgAEEEaiABEPIGIAALOAECfyABEEAiAkENahCJASIDQQA2AgggAyACNgIEIAMgAjYCACAAIANBDGogASACQQFqEB82AgALDQAgACABIAJCfxCwBQsHACAAQQxqCycBAX8gACgCACEBIwBBEGsiACQAIAAgATYCDCAAKAIMIABBEGokAAsIACAAIAEQGwsXACAAKAIIEGZHBEAgACgCCBCbCwsgAAs2AQF/IwBBEGsiAyQAIAMgAjYCDCADQQhqIANBDGoQjgIgACABEJgHIQAQjQIgA0EQaiQAIAALEwAgACAAKAIAQQFrIgA2AgAgAAtZAQN/AkAgACgCACICBEAgASgCACIDRQ0BIAAoAgQiACABKAIERgR/IAIgAyAAEIACBUEBC0UPC0HB1gFBifsAQTNBmTwQAAALQbLWAUGJ+wBBNEGZPBAAAAszAQF/IwBBEGsiAiQAIAIgACgCADYCDCACIAIoAgwgAUECdGo2AgwgAigCDCACQRBqJAALGwEBf0EBIQEgABCjAQR/IAAQ9gJBAWsFQQELCzABAX8jAEEQayICJAAgAiAAKAIANgIMIAIgAigCDCABajYCDCACKAIMIAJBEGokAAvQAQEDfyMAQRBrIgUkAAJAQff///8HIAFrIAJPBEAgABBGIQYgBUEEaiIHIAFB8////wNJBH8gBSABQQF0NgIMIAUgASACajYCBCAHIAVBDGoQ3wMoAgAQ3gNBAWoFQff///8HCxDdAyAFKAIEIQIgBSgCCBogBARAIAIgBiAEEKoCCyADIARHBEAgAiAEaiAEIAZqIAMgBGsQqgILIAFBCkcEQCAGEKEFCyAAIAIQ+gEgACAFKAIIEPkBIAVBEGokAAwBCxDKAQALIAAgAxC/AQvGAQEEfyMAQRBrIgQkAAJAIAEQowFFBEAgACABKAIINgIIIAAgASkCADcCACAAEKUDGgwBCyABKAIAIQUgASgCBCECIwBBEGsiAyQAAkACQAJAIAIQoAUEQCAAIgEgAhDTAQwBCyACQff///8HSw0BIANBCGogAhDeA0EBahDdAyADKAIMGiAAIAMoAggiARD6ASAAIAMoAgwQ+QEgACACEL8BCyABIAUgAkEBahCqAiADQRBqJAAMAQsQygEACwsgBEEQaiQACw8AIAAgACgCAEEEajYCAAshAQF/IwBBEGsiASQAIAFBDGogABCiAigCACABQRBqJAALDwAgACAAKAIAQQFqNgIAC1kBAn8jAEEQayIDJAAgAigCACEEIAACfyABIABrQQJ1IgIEQANAIAAgBCAAKAIARg0CGiAAQQRqIQAgAkEBayICDQALC0EACyIAIAEgABsQpAMgA0EQaiQAC/gDAQF/IwBBEGsiDCQAIAwgADYCDAJAAkAgACAFRgRAIAEtAABBAUcNAUEAIQAgAUEAOgAAIAQgBCgCACIBQQFqNgIAIAFBLjoAACAHECVFDQIgCSgCACIBIAhrQZ8BSg0CIAooAgAhAiAJIAFBBGo2AgAgASACNgIADAILAkACQCAAIAZHDQAgBxAlRQ0AIAEtAABBAUcNAiAJKAIAIgAgCGtBnwFKDQEgCigCACEBIAkgAEEEajYCACAAIAE2AgBBACEAIApBADYCAAwDCyALIAtBgAFqIAxBDGoQgwcgC2siAEECdSIGQR9KDQEgBkHAsQlqLAAAIQUCQAJAIABBe3EiAEHYAEcEQCAAQeAARw0BIAMgBCgCACIBRwRAQX8hACABQQFrLAAAENwDIAIsAAAQ3ANHDQYLIAQgAUEBajYCACABIAU6AAAMAwsgAkHQADoAAAwBCyAFENwDIgAgAiwAAEcNACACIAAQ/wE6AAAgAS0AAEEBRw0AIAFBADoAACAHECVFDQAgCSgCACIAIAhrQZ8BSg0AIAooAgAhASAJIABBBGo2AgAgACABNgIACyAEIAQoAgAiAEEBajYCACAAIAU6AABBACEAIAZBFUoNAiAKIAooAgBBAWo2AgAMAgtBACEADAELQX8hAAsgDEEQaiQAIAALVQECfyMAQRBrIgYkACAGQQxqIgUgARBTIAUQywFBwLEJQeCxCSACEMcCIAMgBRDYAyIBEPUBNgIAIAQgARDJATYCACAAIAEQyAEgBRBQIAZBEGokAAsvAQF/IwBBEGsiAyQAIAAgACACLAAAIAEgAGsQ+gIiACABIAAbEKQDIANBEGokAAsyAQF/IwBBEGsiAiQAIAIgACkCCDcDCCACIAApAgA3AwAgAiABENsDIAJBEGokAEF/RwvwAwEBfyMAQRBrIgwkACAMIAA6AA8CQAJAIAAgBUYEQCABLQAAQQFHDQFBACEAIAFBADoAACAEIAQoAgAiAUEBajYCACABQS46AAAgBxAlRQ0CIAkoAgAiASAIa0GfAUoNAiAKKAIAIQIgCSABQQRqNgIAIAEgAjYCAAwCCwJAAkAgACAGRw0AIAcQJUUNACABLQAAQQFHDQIgCSgCACIAIAhrQZ8BSg0BIAooAgAhASAJIABBBGo2AgAgACABNgIAQQAhACAKQQA2AgAMAwsgCyALQSBqIAxBD2oQhgcgC2siBUEfSg0BIAVBwLEJaiwAACEGAkACQAJAAkAgBUF+cUEWaw4DAQIAAgsgAyAEKAIAIgFHBEBBfyEAIAFBAWssAAAQ3AMgAiwAABDcA0cNBgsgBCABQQFqNgIAIAEgBjoAAAwDCyACQdAAOgAADAELIAYQ3AMiACACLAAARw0AIAIgABD/AToAACABLQAAQQFHDQAgAUEAOgAAIAcQJUUNACAJKAIAIgAgCGtBnwFKDQAgCigCACEBIAkgAEEEajYCACAAIAE2AgALIAQgBCgCACIAQQFqNgIAIAAgBjoAAEEAIQAgBUEVSg0CIAogCigCAEEBajYCAAwCC0EAIQAMAQtBfyEACyAMQRBqJAAgAAtVAQJ/IwBBEGsiBiQAIAZBDGoiBSABEFMgBRDMAUHAsQlB4LEJIAIQ9QIgAyAFENoDIgEQ9QE6AAAgBCABEMkBOgAAIAAgARDIASAFEFAgBkEQaiQAC5wBAQN/QTUhAQJAIAAoAhwiAiAAKAIYIgNBBmpBB3BrQQdqQQduIAMgAmsiAkHxAmpBB3BBA0lqIgNBNUcEQCADIgENAUE0IQECQAJAIAJBBmpBB3BBBGsOAgEAAwsgACgCFEGQA29BAWsQnAtFDQILQTUPCwJAAkAgAkHzAmpBB3BBA2sOAgACAQsgACgCFBCcCw0BC0EBIQELIAELagECfyAAQeSVCTYCACAAKAIoIQEDQCABBEBBACAAIAFBAWsiAUECdCICIAAoAiRqKAIAIAAoAiAgAmooAgARBQAMAQsLIABBHGoQUCAAKAIgEBggACgCJBAYIAAoAjAQGCAAKAI8EBggAAvzAQEGfyAABEAgASAAKAIMSwRAIAGtIAKtfkIgiFBFBEBBPQ8LIAAoAgAgASACbBBqIgQgAkVyRQRAQTAPCyAEIAAoAgwgAhCeBSEFIAEgACgCDCIDayACbCIGBEAgBUEAIAYQOBogACgCDCEDCyADIAAoAgQiBSAAKAIIakkEQCAEIAEgAyAFayIDayIFIAIQngUhBiAEIAAoAgQgAhCeBSEHIAIgA2wiCARAIAYgByAIELYBGgsgBCAAKAIIIANrIAIQngUaIAAgBTYCBAsgACABNgIMIAAgBDYCAAtBAA8LQdHTAUGJuAFB5QBBkYkBEAAACzoBAX8gAEHQlAkoAgAiATYCACAAIAFBDGsoAgBqQdyUCSgCADYCACAAQQRqEI4HGiAAQThqEMQLIAALGAAgAEHkkQk2AgAgAEEgahA1GiAAEJYHCx0AIwBBEGsiAyQAIAAgASACELELIANBEGokACAAC5kBAQJ/AkAgABAtIgQgACgCAEEDcSABQQAQIiIDDQACQCAEQfH/BBDLAyIDQfH/BEcNACADEHZFDQAgBCAAKAIAQQNxIAFB8f8EEOcDIQMMAQsgBCAAKAIAQQNxIAFB8f8EECIhAwsCQAJAIAJFDQAgBCACEMsDIgEgAkcNACABEHZFDQAgACADIAIQqAQMAQsgACADIAIQcQsLrgEBBn8jAEEQayICJAAgAkEIaiIDIAAQqQUaAkAgAy0AAEUNACACQQRqIgMgACAAKAIAQQxrKAIAahBTIAMQugshBCADEFAgAiAAELkLIQUgACAAKAIAQQxrKAIAaiIGELgLIQcgAiAEIAUoAgAgBiAHIAEgBCgCACgCIBEzADYCBCADEKcFRQ0AIAAgACgCAEEMaygCAGpBBRCqBQsgAkEIahCoBSACQRBqJAAgAAsMACAAQQRqEMQLIAALKAECfyMAQRBrIgIkACABKAIAIAAoAgBIIQMgAkEQaiQAIAEgACADGwsQACAAIAE3AwggAEIANwMACwIACxQAIABB9JAJNgIAIABBBGoQUCAAC/MDAgJ+BX8jAEEgayIFJAAgAUL///////8/gyECAn4gAUIwiEL//wGDIgOnIgRBgfgAa0H9D00EQCACQgSGIABCPIiEIQIgBEGA+ABrrSEDAkAgAEL//////////w+DIgBCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyAAQoCAgICAgICACFINACACQgGDIAJ8IQILQgAgAiACQv////////8HViIEGyEAIAStIAN8DAELIAAgAoRQIANC//8BUnJFBEAgAkIEhiAAQjyIhEKAgICAgICABIQhAEL/DwwBCyAEQf6HAUsEQEIAIQBC/w8MAQtBgPgAQYH4ACADUCIHGyIIIARrIgZB8ABKBEBCACEAQgAMAQsgBUEQaiAAIAIgAkKAgICAgIDAAIQgBxsiAkGAASAGaxCxASAFIAAgAiAGEKcDIAUpAwhCBIYgBSkDACICQjyIhCEAAkAgBCAIRyAFKQMQIAUpAxiEQgBSca0gAkL//////////w+DhCICQoGAgICAgICACFoEQCAAQgF8IQAMAQsgAkKAgICAgICAgAhSDQAgAEIBgyAAfCEACyAAQoCAgICAgIAIhSAAIABC/////////wdWIgQbIQAgBK0LIQIgBUEgaiQAIAFCgICAgICAgICAf4MgAkI0hoQgAIS/C4kCAAJAIAAEfyABQf8ATQ0BAkBBxIMLKAIAKAIARQRAIAFBgH9xQYC/A0YNAwwBCyABQf8PTQRAIAAgAUE/cUGAAXI6AAEgACABQQZ2QcABcjoAAEECDwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCABGtB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LC0H8gAtBGTYCAEF/BUEBCw8LIAAgAToAAEEBC8ICAQR/IwBB0AFrIgUkACAFIAI2AswBIAVBoAFqIgJBAEEoEDgaIAUgBSgCzAE2AsgBAkBBACABIAVByAFqIAVB0ABqIAIgAyAEENELQQBIBEBBfyEEDAELIAAoAkxBAEggACAAKAIAIghBX3E2AgACfwJAAkAgACgCMEUEQCAAQdAANgIwIABBADYCHCAAQgA3AxAgACgCLCEGIAAgBTYCLAwBCyAAKAIQDQELQX8gABCmBw0BGgsgACABIAVByAFqIAVB0ABqIAVBoAFqIAMgBBDRCwshAiAGBEAgAEEAQQAgACgCJBEDABogAEEANgIwIAAgBjYCLCAAQQA2AhwgACgCFCEBIABCADcDECACQX8gARshAgsgACAAKAIAIgAgCEEgcXI2AgBBfyACIABBIHEbIQQNAAsgBUHQAWokACAECxIAIAAgAUEKQoCAgIAIELAFpwthAAJAIAANACACKAIAIgANAEEADwsgACABEKoEIABqIgAtAABFBEAgAkEANgIAQQAPCyAAIAEQyQIgAGoiAS0AAARAIAIgAUEBajYCACABQQA6AAAgAA8LIAJBADYCACAAC38CAn8CfiMAQaABayIEJAAgBCABNgI8IAQgATYCFCAEQX82AhggBEEQaiIFQgAQjwIgBCAFIANBARDYCyAE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IABCADcCBCAAIAAoAiwiATYCHCAAIAE2AhQgACABIAAoAjBqNgIQQQALlAMCA34CfwJAIAC9IgJCNIinQf8PcSIEQf8PRw0AIABEAAAAAACAVkCiIgAgAKMPCyACQgGGIgFCgICAgICAwNaAf1gEQCAARAAAAAAAAAAAoiAAIAFCgICAgICAwNaAf1EbDwsCfiAERQRAQQAhBCACQgyGIgFCAFkEQANAIARBAWshBCABQgGGIgFCAFkNAAsLIAJBASAEa62GDAELIAJC/////////weDQoCAgICAgIAIhAshASAEQYUISgRAA0ACQCABQoCAgICAgKALfSIDQgBTDQAgAyIBQgBSDQAgAEQAAAAAAAAAAKIPCyABQgGGIQEgBEEBayIEQYUISg0AC0GFCCEECwJAIAFCgICAgICAoAt9IgNCAFMNACADIgFCAFINACAARAAAAAAAAAAAog8LIAFC/////////wdYBEADQCAEQQFrIQQgAUKAgICAgICABFQgAUIBhiEBDQALCyACQoCAgICAgICAgH+DIAFCgICAgICAgAh9IAStQjSGhCABQQEgBGutiCAEQQBKG4S/C+ICAQV/AkACQAJAIAIoAkxBAE4EQCABQQJIDQEMAgtBASEGIAFBAUoNAQsgAiACKAJIIgJBAWsgAnI2AkggAUEBRw0BIABBADoAACAADwsgAUEBayEEIAAhAQJAA0ACQAJAAkAgAigCBCIDIAIoAggiBUYNAAJ/IANBCiAFIANrEPoCIgcEQCAHIAIoAgQiA2tBAWoMAQsgAigCCCACKAIEIgNrCyEFIAEgAyAFIAQgBCAFSxsiAxAfGiACIAIoAgQgA2oiBTYCBCABIANqIQEgBw0CIAQgA2siBEUNAiAFIAIoAghGDQAgAiAFQQFqNgIEIAUtAAAhAwwBCyACEL0FIgNBAE4NAEEAIQQgACABRg0DIAItAABBEHENAQwDCyABIAM6AAAgAUEBaiEBIANB/wFxQQpGDQAgBEEBayIEDQELCyAARQRAQQAhBAwBCyABQQA6AAAgACEECyAGDQALIAQLpBgDE38EfAF+IwBBMGsiCSQAAkACQAJAIAC9IhlCIIinIgNB/////wdxIgZB+tS9gARNBEAgA0H//z9xQfvDJEYNASAGQfyyi4AETQRAIBlCAFkEQCABIABEAABAVPsh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IABEAAAAAAAA4D+ioiIDob1CgICAgHCDvyIERAAAIGVHFfc/oiIBIAkgCEEUdmq3IgKgIgUgASACIAWhoCAAIABEAAAAAAAAAECgoyIBIAMgASABoiICIAKiIgEgASABRJ/GeNAJmsM/okSveI4dxXHMP6CiRAT6l5mZmdk/oKIgAiABIAEgAUREUj7fEvHCP6JE3gPLlmRGxz+gokRZkyKUJEnSP6CiRJNVVVVVVeU/oKKgoKIgACAEoSADoaAiACAEoEQAou8u/AXnPaIgAEQAACBlRxX3P6KgoKAhAAsgAAtZAQF/IwBBIGsiAiQAIAAQ7AEiAAR/IAAoAgghACACQgA3AwggAkEANgIYIAJCADcDECACIAE2AgggAkIANwMAIAAgAkEEIAAoAgARAwAFQQALIAJBIGokAAuVAQIDfwV8IAMQVyIImiEJIAAoAgghBiADEEohByAGEBwhBANAIAQEQCAEKAIQKAKUASIFIAIgBSsDACIKIAiiIAcgBSsDCCILoqCgOQMIIAUgASAKIAeiIAsgCaKgoDkDACAGIAQQHSEEDAELCyAAQThqIQQDQCAEKAIAIgAEQCAAIAEgAiADEK8HIABBBGohBAwBCwsLtQIBBX8jAEEwayIDJAAgACgACCABTwRAIABBADYCFCAAQQQQJiEEIAAoAgAgBEECdGogACgCFDYCACAAQQQQjAIgACgACCABQX9zakECdCIEBEAgACgCACADIAApAgg3AyggAyAAKQIANwMgIANBIGogAUEBahAZIAAoAgAhByADIAApAgg3AxggAyAAKQIANwMQQQJ0aiAHIANBEGogARAZQQJ0aiAEELYBGgsgACACNgIUIAMgACkCCDcDCCADIAApAgA3AwAgAyABEBkhAQJAAkACQCAAKAIQIgIOAgIAAQsgACgCACABQQJ0aigCABAYDAELIAAoAgAgAUECdGooAgAgAhEBAAsgACgCACABQQJ0aiAAKAIUNgIAIANBMGokAA8LQfGhA0GFuAFBFkGhGhAAAAsdACAAKAIIIAFBARCFARogASgCECgCgAEgADYCDAtEAQF/IAAEQCAAKAIEIgEEQCABEG0LIAAoAggiAQRAIAEQbQsgACgCDBAYIAAoAhQiAQRAIAEgACgCEBEBAAsgABAYCws+AQN/IAAQLSECIAAoAhAiAQRAA0Ag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/wotAABB1P8KQQE6AABBAXFFBEAgCkEwQQAgCigCAEEDcUEDRxtqKAIoECEhACAEIApBUEEAIAooAgBBA3FBAkcbaigCKBAhNgIEIAQgADYCAEHo7QQgBBAqCyAGEBggChCZBAwFBSAEKAKMASENIAQrA1ghEyAFIAQrA4ABOQMIIAUgEzkDACABQQFrIQEgBUEQaiEFIAIgDWohAgwCCwALCwNAIAItAAAiBUEJayIBQRdLQQEgAXRBn4CABHFFckUEQCACQQFqIQIMAQsLIAogABDeBiEJIBIEQCAEKAJ8IQEgCSAVOQMYIAkgFjkDECAJIAE2AggLIAgEQCAEKAJ4IQEgCSAXOQMoIAkgFDkDICAJIAE2AgwLIAIgBUEARyIRaiECQQAhBQNAIAAgBUcEQCAFQQR0IgEgCSgCAGoiDSABIAZqIgEpAwA3AwAgDSABKQMINwMIIAVBAWohBQwBCwsgBhAYDAELCyAKKAIQIgUoAmAiAARAIAogAEH12QAQsQQgCigCECEFCyAFKAJsIgAEQCAKIABB2tkAELEEIAooAhAhBQsgBSgCZCIABH8gCiAAQfDZABCxBCAKKAIQBSAFCygCaCIABEAgCiAAQejZABCxBAsgC0EBaiELCyADIAoQMCEKDAELCyADIA8QHSEPDAELCyALRQRAQQAhAQwBC0ECQQEgAxC0AiALRhshAQtBACEAQQAhCiADKAIQKAIIIgIoAlgiCARAIAJBADYCVEEBIQoLAkAgCA0AQfjaCigCAEEBRw0AIAMQtgRFDQBBASEAIAMoAhAoAgwiAkUNACACQQA6AFELIAMQwQIgCARAIAMoAhAhD0QAAAAAAAAAACEVRAAAAAAAAAAAIRZBACERQQAhEkEAIQ4jAEFAaiILJAAgAygCECICKAKQASENIARB2ABqIgkgAikDEDcDACAJIAIpAyg3AxggCSACKQMgNwMQIAkgAikDGDcDCAJAIAIoAggoAlgiBkUNAAJAIAkrAwAgCSsDEGINACAJKwMIIAkrAxhiDQAgCUL/////////dzcDGCAJQv/////////3/wA3AwAgCUL/////////9/8ANwMIIAlC/////////3c3AxALIAYoAgghBwNAIBEgBigCAE8NASALQgA3AzggC0IANwMwIAtCADcDKCALQgA3AyACQAJAAkACQAJA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AisDAKEiGyAboiACKwMYIAIrAwihIhsgG6KgIAUrAxAgBSsDAKEgBCsDOKAgBCsDKKEiGyAbokQAAAAAAADQP6JlIQMMAQsgBSgCICEDIAUoAiQgASACKQMYNwPIAiABIAIpAxA3A8ACIAMgAUHAAmoQ5gwhBiAEKAJIIQMgBCgCTCABIAIpAwg3A7gCIAEgAikDADcDsAIgAyABQbACahDmDCEHIAQoAkgiEUEBdCEXIAUoAiAiDkEBdCEYIBFBAWshGSAOQQFrIRpBACEDQQAhCAJAA0AgASAGIAhBBHRqIgkpAwg3A6gCIAEgCSkDADcDoAIgASAGIAggGmogDm9BBHRqIhIpAwg3A5gCIAEgEikDADcDkAIgAUHABGogAUGgAmogAUGQAmoQ6wwgASAHIAxBBHRqIgspAwg3A4gCIAEgCykDADcDgAIgASAHIAwgGWogEW9BBHRqIhMpAwg3A/gBIAEgEykDADcD8AEgAUGwBGogAUGAAmogAUHwAWoQ6wwgAUIANwOYBCABQgA3A+gBIAEgASkDyAQ3A9gBIAEgASkDuAQ3A8gBIAFCADcDkAQgAUIANwPgASABIAEpA8AENwPQASABIAEpA7AENwPAASABKwPoASABKwPYASIboSABKwPAASABKwPQASIcoaIgASsDyAEgG6EgASsD4AEgHKGioSEfIAEgEikDCDcDuAEgASASKQMANwOwASABIAkpAwg3A6gBIAEgCSkDADcDoAEgASALKQMINwOYASABIAspAwA3A5ABIAFBsAFqIAFBoAFqIAFBkAFqEOoMIRUgASATKQMINwOIASABIBMpAwA3A4ABIAEgCykDCDcDeCABIAspAwA3A3AgASAJKQMINwNoIAEgCSkDADcDYCABQYABaiABQfAAaiABQeAAahDqDCEWIAEgEikDCDcDWCABIBIpAwA3A1AgASAJKQMINwNIIAEgCSkDADcDQCABIBMpAwg3AzggASATKQMANwMwIAEgCykDCDcDKCABIAspAwA3AyAgASsDMCIgIAErA1giGyABQUBrIgkrAwgiIaGiIAErAyAiJSAhIBuhIiKiIAErA1AiHiABKwMoIh0gASsDOCIcoaIiJiAJKwMAIiMgHCAdoaKgoKAiJEQAAAAAAAAAAGIEfyABICUgHCAboaIgJiAgIBsgHaGioKAgJKMi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AgAiESAKKAIASARAIBAgAkECdCIRaiAMNgIAIAMgEWogBCAFaigCADYCACACQQFqIQIMAQsgAyARQQJ0aiIMIAwoAgAgBCAFaigCAGo2AgALIABBAWohAAwBCwsgByAJaiACNgIAIAEhAAwACwALIANBACADQQBKGyEJQQAhAANAIAAgCUYNByAPIABBAWoiAUECdCIDaiEEIA8gAEECdCIFaigCACEAA0AgACAEKAIATkUEQCAGIBQgAEECdGooAgAiCEECdGogAjYCACAQIAJBAnRqIAg2AgAgAEEBaiEAIAJBAWohAgwBCwsgBSAHaiEEIAMgDmohCCAFIA5qKAIAIQADQCAAIAgoAgBORQRAIAYgEyAAQQJ0aigCACIFQQJ0aigCACAEKAIASARAIBAgAkECdGogBTYCACACQQFqIQILIABBAWohAAwBCwsgAyAHaiACNgIAIAEhAAwACwALIAVBAUYNBAsgEkHqBDYCBCASQZa3ATYCAEGI9ggoAgBB2L8EIBIQIBoQOwALQcLeAUGWtwFBlQRBr7ABEAAAC0GH0AFBlrcBQZYEQa+wARAAAAtB2pUBQZa3AUGXBEGvsAEQAAALIANBACADQQBKGyEIIA0oAhwhAyABKAIcIQUgACgCHCEVQQAhAANAIAAgCEYNASAPIABBAWoiAUECdCIJaiEKIA8gAEECdCIEaigCACEAA0AgACAKKAIATkUEQCAGIBQgAEECdGooAgAiC0ECdGogAjYCACAQIAJBAnRqIAs2AgAgAyACQQN0aiAVIABBA3RqKwMAOQMAIABBAWohACACQQFqIQIMAQsLIAQgB2ohCiAJIA5qIQsgBCAOaigCACEAA0AgACALKAIATkUEQAJAIAYgEyAAQQJ0aigCACIEQQJ0aigCACIMIAooAgBIBEAgECACQQJ0aiAENgIAIAMgAkEDdGogBSAAQQN0aisDADkDACACQQFqIQIMAQsgAyAMQQN0aiIEIAUgAEEDdGorAwAgBCsDAKA5AwALIABBAWohAAwBCwsgByAJaiACNgIAIAEhAAwACwALIA0gAjYCCCAGEBgLIBJBEGokACANC8sHAg9/AXwjAEEQayINJAACQCAARQRADAELAkACQCAAKAIgRQRAIAAoAhghDiAAKAIUIQcgACgCBCIIIAAoAgAiAiAAKAIIIgEgACgCEEEAELYCIgkgATYCCCAJKAIYIQ8gCSgCFCEDQX8gCCAIQQBIG0EBaiEKQQAhAQNAIAEgCkYEQEEAIQEgAkEAIAJBAEobIQogA0EEaiEFA0ACQCABIApGBEBBACEBIAhBACAIQQBKGyECDAELIAcgAUEBaiICQQJ0aiEEIAcgAUECdGooAgAhAQNAIAQoAgAgAUwEQCACIQEMAwUgBSAOIAFBAnRqKAIAQQJ0aiILIAsoAgBBAWo2AgAgAUEBaiEBDAELAAsACwsDQCABIAJGRQRAIAFBAnQhBSADIAFBAWoiAUECdGoiBCAEKAIAIAMgBWooAgBqNgIADAELC0EAIQICQAJAAkACQCAAKAIQIgFBBGsOBQADAwMBAgsgCSgCHCEFIAAoAhwhBEEAIQADQCAAIApGDQggByAAQQFqIgJBAnRqIQsgByAAQQJ0aigCACEBA0AgCygCACABTARAIAIhAAwCBSAPIAMgDiABQQJ0IgZqIgwoAgBBAnRqKAIAQQJ0aiAANgIAIAQgBmooAgAhBiADIAwoAgBBAnRqIgwgDCgCACIMQQFqNgIAIAUgDEECdGogBjYCACABQQFqIQEMAQsACwALAAsDQCACIApGDQcgByACQQFqIgBBAnRqIQUgByACQQJ0aigCACEBA0AgBSgCACABTARAIAAhAgwCBSADIA4gAUECdGooAgBBAnRqIgQgBCgCACIEQQFqNgIAIA8gBEECdGogAjYCACABQQFqIQEMAQsACwALAAsgAUEBRg0ECyANQfQANgIEIA1BlrcBNgIAQYj2CCgCAEHYvwQgDRAgGhA7AAUgAyABQQJ0akEANgIAIAFBAWohAQwBCwALAAtBodABQZa3AUHFAEGckwEQAAALIAkoAhwhBSAAKAIcIQQDQCACIApGDQEgByACQQFqIgBBAnRqIQsgByACQQJ0aigCACEBA0AgCygCACABTARAIAAhAgwCBSAPIAMgDiABQQJ0aiIGKAIAQQJ0aigCAEECdGogAjYCACAEIAFBA3RqKwMAIRAgAyAGKAIAQQJ0aiIGIAYoAgAiBkEBajYCACAFIAZBA3RqIBA5AwAgAUEBaiEBDAELAAsACwALA0AgCEEATEUEQCADIAhBAnRqIAMgCEEBayIIQQJ0aigCADYCAAwBCwsgA0EANgIACyANQRBqJAAgCQsLACAAIAFBAhD/Bws+AQJ8IAG3IQMDQEGc2wovAQAgAkoEQBDXASEEIAAoAhAoApQBIAJBA3RqIAQgA6I5AwAgAkEBaiECDAELCwv3AQICfwJ8IwBBMGsiAyQAIAAgARAsIQEDQCABBEACQAJAIAJFDQAgASACEEUiBC0AAEUNACADIANBKGo2AiACQCAEQfCDASADQSBqEFFBAEwNACADKwMoIgVEAAAAAAAAAABjDQAgBUQAAAAAAAAAAGINAkH42gooAgANAgsgAyAENgIQQem1AyADQRBqECogABAhIQQgA0KAgICAgICA+D83AwggAyAENgIAQbGmBCADEIABCyADQoCAgICAgID4PzcDKEQAAAAAAADwPyEFCyABKAIQIAU5A4gBIAYgBaAhBiAAIAEQMCEBDAELCyADQTBqJAAgBguQAQEFfyMAQeAAayIDJAAgAEEBQab0AEHx/wQQIiEFIABBAUHlOUHx/wQQIiEGIAAQHCECIAFBAkkhAQNAIAIEQCADQTdqIgQgAigCEDQC9AEQzA0gAiAFIAQQcSABRQRAIANBDmoiBCACKAIQNAL4ARDMDSACIAYgBBBxCyAAIAIQHSECDAELCyADQeAAaiQAC9gBAQJ/IAAQeSEBA0AgAQRAIAEQggggARB4IQEMAQsLAkAgAEHiJUEAQQEQNkUNACAAKAIQKAIIEBggACgCECIBQQA2AgggASgCuAEQGCAAKAIQKAKMAhAYIAAoAhAoAtgBEBggACgCECICKALEAQRAIAIoAugBIQEDQCABIAIoAuwBSkUEQCACKALEASABQcgAbGooAgwQGCABQQFqIQEgACgCECECDAELCyACKALEAUG4f0EAIAIoAugBQX9GG2oQGAsgABA5IABGDQAgACgCECgCDBC8AQsLzgIBA38jAEHQAGsiAiQAIAJCADcDSCACQgA3A0ACfyAAEDxFBEAgAUEANgIAQQAMAQsgAkIANwM4IAJCADcDMCACQgA3AyggAkIANwMYIAJCADcDECACQgA3AwggAkG6AzYCJCACQbsDNgIgIAAQHCEDA0AgAwRAIAMoAhBBADYCsAEgACADEB0hAwwBCwsgABAcIQMDQCADBEAgA0F/IAIoAiQRAABFBEAgAkFAayIEQQAQ6AUgAiACKAIwNgIAIAQgAhDnBSAAIAQQsQNBARCSASIEQeIl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AigCACAFIAIpAgg3A7gGIAUgAikCADcDsAYgBUGwBmogAxAZQcgAbGooAixBAWtBfUsNACACKAIAIAUgAikCCDcD+AMgBSACKQIANwPwAyAFQfADaiADEBlByABsaigCPCACKAIAIQAgBSACKQIINwPoAyAFIAIpAgA3A+ADIAVB4ANqIAMQGSEBQQFrQX1NBEAgAigCACEGAn8gACABQcgAbGooAkBBAUYEQCAFIAIpAgg3A8gBIAUgAikCADcDwAEgBiAFQcABaiADEBlByABsaigCLCEAIAIoAgAgBSACKQIINwO4ASAFIAIpAgA3A7ABIAVBsAFqIAQQGUHIAGxqIAA2AiggAigCACAFIAIpAgg3A6gBIAUgAikCADcDoAEgBUGgAWogAxAZQcgAbGpBfzYCLCACKAIAIAUgAikCCDcDmAEgBSACKQIANwOQASAFQZABaiADEBlByABsaigCPCEAIAIoAgAgBSACKQIINwOIASAFIAIpAgA3A4ABIAVBgAFqIAQQGUHIAGxqIAA2AiwgAigCACEAIAUgAikCCDcDeCAFIAIpAgA3A3AgACAFQfAAaiADEBlByABsaigCKCEBIAUgAikCCDcDaCAFIAIpAgA3A2AgACAFQeAAaiABEBlByABsaiADNgIwIAIoAgAhACAFIAIpAgg3A1ggBSACKQIANwNQIAAgBUHQAGogBBAZQcgAbGooAighASAFIAIpAgg3A0ggBSACKQIANwNAIAAgBUFAayABEBlByABsaiAENgIwIAIoAgAhACAFIAIpAgg3AzggBSACKQIANwMwIAAgBUEwaiAEEBlByABsakEsagwBCyAFIAIpAgg3A4gDIAUgAikCADcDgAMgBiAFQYADaiAEEBlByABsakF/NgIsIAIoAgAgBSACKQIINwP4AiAFIAIpAgA3A/ACIAVB8AJqIAMQGUHIAGxqKAIsIQAgAigCACAFIAIpAgg3A+gCIAUgAikCADcD4AIgBUHgAmogBBAZQcgAbGogADYCKCACKAIAIAUgAikCCDcD2AIgBSACKQIANwPQAiAFQdACaiADEBlByABsaigCKCEAIAIoAgAgBSACKQIINwPIAiAFIAIpAgA3A8ACIAVBwAJqIAMQGUHIAGxqIAA2AiwgAigCACAFIAIpAgg3A7gCIAUgAikCADcDsAIgBUGwAmogAxAZQcgAbGooAjwhACACKAIAIAUgAikCCDcDqAIgBSACKQIANwOgAiAFQaACaiADEBlByABsaiAANgIoIAIoAgAhACAFIAIpAgg3A5gCIAUgAikCADcDkAIgACAFQZACaiADEBlByABsaigCKCEBIAUgAikCCDcDiAIgBSACKQIANwOAAiAAIAVBgAJqIAEQGUHIAGxqIAM2AjAgAigCACEAIAUgAikCCDcD+AEgBSACKQIANwPwASAAIAVB8AFqIAMQGUHIAGxqKAIsIQEgBSACKQIINwPoASAFIAIpAgA3A+ABIAAgBUHgAWogARAZQcgAbGogAzYCMCACKAIAIQAgBSACKQIINwPYASAFIAIpAgA3A9ABIAAgBUHQAWogBBAZQcgAbGpBKGoLKAIAIQEgBSACKQIINwMoIAUgAikCADcDICAAIAVBIGogARAZQcgAbGogBDYCMCACKAIAIAUgAikCCDcDGCAFIAIpAgA3AxAgBUEQaiADEBlByABsakEANgI8IAIoAgAgBSACKQIINwMIIAUgAikCADcDACAFIAQQGUHIAGxqQQA2AjwMAgsgACABQcgAbGooAiwhACACKAIAIAUgAikCCDcD2AMgBSACKQIANwPQAyAFQdADaiAEEBlByABsaiAANgIoIAIoAgAgBSACKQIINwPIAyAFIAIpAgA3A8ADIAVBwANqIAMQGUHIAGxqQX82AiwgAigCACAFIAIpAgg3A7gDIAUgAikCADcDsAMgBUGwA2ogBBAZQcgAbGpBfzYCLCACKAIAIQAgBSACKQIINwOoAyAFIAIpAgA3A6ADIAAgBUGgA2ogBBAZQcgAbGooAighASAFIAIpAgg3A5gDIAUgAikCADcDkAMgACAFQZADaiABEBlByABsaiAENgIwDAELIAIoAgAgBSACKQIINwOoBiAFIAIpAgA3A6AGIAVBoAZqIAMQGUHIAGxqKAIoIQYgAigCACEHIAUgAikCCDcDmAYgBSACKQIANwOQBgJAIAcgBUGQBmogBhAZQcgAbGooAjAiB0EBa0F9Sw0AIAIoAgAgBSACKQIINwOIBiAFIAIpAgA3A4AGIAVBgAZqIAYQGUHIAGxqKAI0QQFrQX1LDQAgAigCACEGIAUgAikCCDcDuAUgBSACKQIANwOwBQJAIAYgBUGwBWogBxAZQcgAbGooAgRBAEwNACACKAIAIAUgAikCCDcDqAUgBSACKQIANwOgBSAFQaAFaiAHEBlByABsaigCBCABIABBEGoQxwQNACACKAIAIAUgAikCCDcDmAUgBSACKQIANwOQBSAFQZAFaiADEBlByABsakF/NgIoIAIoAgAgBSACKQIINwOIBSAFIAIpAgA3A4AFIAVBgAVqIAMQGUHIAGxqQX82AiwgAigCACAFIAIpAgg3A/gEIAUgAikCADcD8AQgBUHwBGogBBAZQcgAbGpBfzYCLCACKAIAIQAgBSACKQIINwPoBCAFIAIpAgA3A+AEIAAgBUHgBGogBBAZQcgAbGooAighASAFIAIpAgg3A9gEIAUgAikCADcD0AQgACAFQdAEaiABEBlByABsaiAENgI0DAILIAIoAgAgBSACKQIINwPIBCAFIAIpAgA3A8AEIAVBwARqIAQQGUHIAGxqQX82AiggAigCACAFIAIpAgg3A7gEIAUgAikCADcDsAQgBUGwBGogBBAZQcgAbGpBfzYCLCACKAIAIAUgAikCCDcDqAQgBSACKQIANwOgBCAFQaAEaiADEBlByABsakF/NgIsIAIoAgAhACAFIAIpAgg3A5gEIAUgAikCADcDkAQgACAFQZAEaiADEBlByABsaigCKCEBIAUgAikCCDcDiAQgBSACKQIANwOABCAAIAVBgARqIAEQGUHIAGxqIAM2AjAMAQsgAigCACEAIAUgAikCCDcD+AUgBSACKQIANwPwBSAAIAVB8AVqIAMQGUHIAGxqKAIoIQEgBSACKQIINwPoBSAFIAIpAgA3A+AFIAAgBUHgBWogARAZQcgAbGogAzYCMCACKAIAIQAgBSACKQIINwPYBSAFIAIpAgA3A9AFIAAgBUHQBWogAxAZQcgAbGooAighASAFIAIpAgg3A8gFIAUgAikCADcDwAUgACAFQcAFaiABEBlByABsaiAENgI0CyAFQdAGaiQAC1UCAnwBfyABQQAgAUEAShshASAAtyIDIQIDfyABIARGBH8gAyACo5siAplEAAAAAAAA4EFjBEAgAqoPC0GAgICAeAUgBEEBaiEEIAIQrQchAgwBCwsLPgECfCAAIAErAwAiAhAyOQMAIAAgASsDCCIDEDI5AwggACACIAErAxCgEDI5AxAgACADIAErAxigEDI5AxgLLAEBfyAAKAIEIgIE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RQRAAkAgASADKAK4ASACQQJ0aigCACIDECEiBUGABCABKAIAEQMABEAgBCAFNgIAQaG4BCAEECoMAQtBEBBSIgYgAzYCDCAGIAU2AgggASAGQQEgASgCABEDABoLIAMgARD0CSACQQFqIQIMAQsLIARBEGokAAsoAQF/A38gAAR/IAAoAgQQ9QkgAWpBAWohASAAKAIAIQAMAQUgAQsLC00BAn8gARAhIgMEQAJAIANB4jdBBxDqAQ0AIAAgARAhQYAEIAAoAgARAwAiAEUNACAAKAIMIQILIAIPC0GI1AFB6/sAQQxBnvcAEAAACxkAIABB5PwJQZTuCSgCABCTASIAEPQJIAAL8gECA38GfCAAIAEoAiwgASgCCCIDIAEoAgQiAUEBayICQQAgASACTxtsQQR0aiICKQMANwMQIAAgAikDCDcDGCAAIAIpAwg3AwggACACKQMANwMAQQEgAyADQQFNGyEDIAArAxghBSAAKwMIIQYgACsDECEHIAArAwAhCEEBIQEDQCABIANGBEAgACAFOQMYIAAgBjkDCCAAIAc5AxAgACAIOQMABSAFIAIgAUEEdGoiBCsDCCIJIAUgCWQbIQUgByAEKwMAIgogByAKZBshByAGIAkgBiAJYxshBiAIIAogCCAKYxshCCABQQFqIQEMAQsLCyoBAX8CQCABRQ0AIAAgARBFIgBFDQAgAC0AAEUNACAAEGhBAXMhAgsgAgtRAQF/AkACQCADRQ0AIANBOhDNASIERQ0AIARBADoAACAAIAIgAyAEQQFqIgMgAREHACAEQTo6AAAMAQsgACACIANBACABEQcACyAAIAM2AiQLXAAgASgCCEUEQCAAIAEQ1QYLIAIgAEGc3QooAgAgASsDAEQAAAAAAADwPxBMOQMAIAIgAEGg3QooAgAgASgCCBCPATYCCCACIABBpN0KKAIAIAEoAgwQjwE2AgwLlwQCCHwIfyMAQUBqIgwkACABKAIAIQ8gAisDCCEGIAIrAwAhByABKAIEIRBE////////738hA0F/IQ1BfyECA0ACQCALIBBGBEAgDyANQTBsaiIBKAIAIAIgAiABKAIEQQFrRmsiASABQQNwa0EEdGohAkEAIQEMAQsgDyALQTBsaiIBKAIEIREgASgCACESQQAhAQNAIAEgEUYEQCALQQFqIQsMAwUgEiABQQR0aiIOKwMAIAehIgQgBKIgDisDCCAGoSIEIASioCIEIAMgAkF/RiADIARkciIOGyEDIAEgAiAOGyECIAsgDSAOGyENIAFBAWohAQwBCwALAAsLA0AgAUEERkUEQCAMIAFBBHQiC2oiDSACIAtqIgsrAwA5AwAgDSALKwMIOQMIIAFBAWohAQwBCwsgDCsDMCAHoSIDIAOiIAwrAzggBqEiAyADoqAhBCAMKwMAIAehIgMgA6IgDCsDCCAGoSIDIAOioCEIRAAAAAAAAAAAIQNEAAAAAAAA8D8hCQNAIAAgDCAJIAOgRAAAAAAAAOA/oiIKQQBBABChASAIIAShmUQAAAAAAADwP2MgCSADoZlE8WjjiLX45D5jckUEQCAIIAArAwAgB6EiBSAFoiAAKwMIIAahIgUgBaKgIgUgBCAIZCIBGyEIIAUgBCABGyEEIAMgCiABGyEDIAogCSABGyEJDAELCyAMQUBrJAALnAECA38BfiMAQSBrIgIkAANAAkAgACgCCCAETQRAQQAhAwwBCyAAKAIAIAIgACkCCDcDGCACIAApAgA3AxAgAkEQaiAEEBlBA3RqKQIAIQUgAiABNgIMIAJBLzYCCCACIAVCIIk3AwBB7N4KQYozIAIQhAEgBEEBaiEEQZx/QezeChD6BCIDQQRBABAXEOQDDQELCyACQSBqJAAgAwuEAgEEfyAAQgA3AgAgAEEANgIYIABCADcCECAAQgA3AggCQCABBEACQANAIAJBAUYNASACQfviAWogAkH84gFqIQQgAkEBaiECLQAAIQMDQCAELQAAIgVFDQEgBEEBaiEEIAMgBUcNAAsLQfqyA0G4/ABBNUH48gAQAAALIAFB++IBEMkCIQIgASEEA0AgBEUNAiAAIAStIAKtQiCGhDcCFCAAQQgQJiEDIAAoAgAgA0EDdGogACkCFDcCACACIARqIQNBACEEQQAhAiADIAEQQCABakYNACADQfviARCqBCADaiIEQfviARDJAiECDAALAAtBw9MBQbj8AEEtQfjyABAAAAsLFwAgACgCECIAQQA6ALUBIABCATcC7AELEgAgAQR/IAAgARBFEGgFIAILC08BAXxBgNsKKwMAIgFEAAAAAAAAAABkBHwgAQVEAAAAAAAAUkAgACAAQQBBopwBQQAQIkQAAAAAAADwv0QAAAAAAAAAABBMIgEgAb1QGwsLmAQDAX8JfAF+IwBBkAFrIgYkACACKwMAIghEAAAAAAAACECjIQogAisDCCIJRAAAAAAAAOC/oiEHIAhEAAAAAAAA4L+iIQsgCUQAAAAAAAAIwKMhDAJAIARBgAFxBEAgBkIANwOIASAGQgA3A4ABDAELIAYgByAKoTkDiAEgBiALIAyhOQOAAQsgASsDCCENIAErAwAhDgJAIARBwABxBEAgBkIANwN4IAZCADcDcAwBCyAGIAcgCqA5A3ggBiAMIAugOQNwCyAGIAmaOQNoIAYgBikDiAE3AyggBiAGKQN4NwMIIAYgBikDaDcDGCAGIAiaOQNgIAYgBikDgAE3AyAgBiAGKQNwNwMAIAYgBikDYDcDECAGQTBqIAZBIGogBkEQaiAGIAMQ6QIgBisDMCEHIAEgDSAJIAYrAzigIgOhOQMIIAEgDiAIIAegIgehOQMAIAAgCSANoCADoSILOQMIIAAgCCAOoCAHoSIPOQMAIAUgACkDCDcDSCAFIAApAwA3A0AgBSAAKQMINwMIIAApAwAhECAFIAogCUQAAAAAAADgP6IgDaAgA6EiCaA5AxggBSAMIA4gCEQAAAAAAADgP6KgIAehIgigOQMQIAUgEDcDACAFIAEpAwg3AyggBSABKQMANwMgIAUgCSAKoTkDOCAFIAggDKE5AzAgACALIAOhOQMIIAAgDyAHoTkDACAGQZABaiQACx4AIAAgAaJEAAAAAAAAJECiIAJEAAAAAAAA4D+ioAvsDgMEfxJ8AX4jAEHQAmsiByQARM3MzMzMzNw/IQ0gBCADRAAAAAAAABBAoiILZEUgBUEgcSIIRXJFBEAgBCALo0TNzMzMzMzcP6IhDQsCfEQAAAAAAAAAACAERAAAAAAAAPA/ZEUNABpEAAAAAAAAAAAgCEUNABogBEQAAAAAAADwv6BEmpmZmZmZqT+iIAOjCyELRAAAAAAAAAAAIA0gAisDACIQoiIUIAVBgAFxIgkbIQxEAAAAAAAAAAAgFJogBUHAAHEiChshDkQAAAAAAAAAACANIAIrAwgiEpoiA6IiFSAJGyEPRAAAAAAAAAAAIBWaIAobIREgEiABKwMIIhigIRkgECABKwMAIhqgIRsgCyAQoiENIBJEAAAAAAAA4D+iIBigIRYgEEQAAAAAAADgP6IgGqAhFyALIAOiIRMgAAJ8AnwCQAJ8AkAgCEUEQCAHIAw5A8gCIAcgDzkDwAIgByAOOQO4AiAHIBE5A7ACIAcgAikDCDcDqAIgByACKQMANwOgAkQAAAAAAAAAACEMIBBEAAAAAAAAAABhBEBEAAAAAAAAAAAhDkQAAAAAAAAAACELRAAAAAAAAAAAIBJEAAAAAAAAAABhDQUaCyAHKwOoAiEDIAcrA6ACIQsMAQsgByAOOQPIAiAHIBE5A8ACIAcgDDkDuAIgByAPOQOwAiAHIAM5A6gCIAcgEJoiCzkDoAJEAAAAAAAAAAAhDCAQRAAAAAAAAAAAYg0ARAAAAAAAAAAAIQ5EAAAAAAAAAAAhEUQAAAAAAAAAACASRAAAAAAAAAAAYQ0BGgsgCyALIAMQRyIMoyIPEK8CIg4gDpogA0QAAAAAAAAAAGQbIRwgAyAMoyERAnwCQCAFQeAAcUHgAEcEQCAIQQBHIgIgCUVyDQELIAcgBykDyAI3A7gBIAcgBykDqAI3A6gBIAcgBykDuAI3A5gBIAcgBykDwAI3A7ABIAcgBykDoAI3A6ABIAcgBykDsAI3A5ABIAdB8AFqIAdBsAFqIAdBoAFqIAdBkAFqIAQQ6QIgESAHKwOQAiALoSILIAcrA5gCIAOhIgMQRyIMIAsgDKMQrwIiCyALmiADRAAAAAAAAAAAZBsgHKEQSqIiA6IhDiAPIAOiDAELIAVBoAFxQaABR0EAIApFIAJyG0UEQCAHIAcpA8gCNwOIASAHIAcpA6gCNwN4IAcgBykDuAI3A2ggByAHKQPAAjcDgAEgByAHKQOgAjcDcCAHIAcpA7ACNwNgIAdB8AFqIAdBgAFqIAdB8ABqIAdB4ABqIAQQ6QIgESAHKwOAAiALoSILIAcrA4gCIAOhIgMQRyIMIAsgDKMQrwIiCyALmiADRAAAAAAAAAAAZBsgHKEQSqIiA6IhDiAPIAOiDAELIAcgBykDyAI3A1ggByAHKQOoAjcDSCAHIAcpA7gCNwM4IAcgBykDwAI3A1AgByAHKQOgAjcDQCAHIAcpA7ACNwMwIAdB8AFqIAdB0ABqIAdBQGsgB0EwaiAEEOkCIAcrA/gBIAOhIQ4gBysD8AEgC6ELIQwgCEUNASAERAAAAAAAAOA/oiIDIBGiIREgAyAPogshDyABIBggDqE5AwggASAaIAyhOQMAIAAgGSAOoSIDOQMIIAAgGyAMoSIEOQMAIAYgASkDCDcDiAEgBiABKQMANwOAASAGIAEpAwA3AwAgBiABKQMINwMIIAYgAyANoTkDOCAGIAQgE6E5AzAgBiAWIA2hOQMoIAYgFyAToTkDICAGIAMgFKE5AxggBiAEIBWhOQMQIAYgACkDADcDQCAGIAApAwg3A0ggBiAUIAOgOQN4IAYgFSAEoDkDcCAGIA0gFqA5A2ggBiATIBegOQNgIAYgDSADoDkDWCAGIBMgBKA5A1AgACAEIA+hOQMAIAMgEaEMAgsgByANIBYgGaGgOQPoASAHIBMgFyAboaA5A+ABIAdCADcD2AEgB0IANwPQASAHIBQgEqEiAzkDyAEgByAHKQPoATcDKCAHIAcpA8gBNwMYIAcgBykD4AE3AyAgByAVIBChIgs5A8ABIAcgBykDwAE3AxAgB0IANwMIIAdCADcDACAHQfABaiAHQSBqIAdBEGogByAEEOkCIBEgBysDgAIgC6EiBCAEIAcrA4gCIAOhIgMQRyIEoxCvAiILIAuaIANEAAAAAAAAAABkGyAcoRBKIASaoiIDoiELIA8gA6ILIQMgACAZIAugIhI5AwggACAbIAOgIg85AwAgBiAAKQMINwOIASAGIAApAwA3A4ABIAYgACkDCDcDCCAAKQMAIR0gBiAUIBggC6AiBKA5A3ggBiAVIBogA6AiEKA5A3AgBiANIBagOQNoIAYgEyAXoDkDYCAGIAsgBKAiCzkDWCAGIAMgEKAiAzkDUCAGIAs5A0ggBiADOQNAIAYgCzkDOCAGIAM5AzAgBiAWIA2hOQMoIAYgFyAToTkDICAGIAQgFKE5AxggBiAQIBWhOQMQIAYgHTcDACAAIAwgD6A5AwAgDiASoAs5AwggB0HQAmokAAvOCQIDfwx8IwBB8AFrIgYkAEQAAAAAAAAAACADRAAAAAAAANA/okRmZmZmZmbWP6JEZmZmZmZm1j8gA0QAAAAAAAAQQGQbIgogAisDACIOoiISIARBwABxIgcbIQ1EAAAAAAAAAAAgCiACKwMIIhCaIguiIhMgBxshD0QAAAAAAAAAACASmiAEQYABcSIIGyEKRAAAAAAAAAAAIBOaIAgbIQkCQCAEQSBxIgQEQCAGIAIpAwg3A8gBIAYgAikDADcDwAEgDyELIA0hDAwBCyAGIAs5A8gBIAYgDpo5A8ABIAkhCyAKIQwgDyEJIA0hCgsgASsDCCENIAErAwAhDyAGIAw5A+gBIAYgCzkD4AEgBiAKOQPYASAGIAk5A9ABRAAAAAAAAAAAIQoCfCAORAAAAAAAAAAAYQRARAAAAAAAAAAAIQlEAAAAAAAAAAAhC0QAAAAAAAAAACAQRAAAAAAAAAAAYQ0BGgsgBisDwAEiCSAJIAYrA8gBIgoQRyILoyIMEK8CIhEgEZogCkQAAAAAAAAAAGQbIREgCiALoyELAnwgBwRAIAYgBikD6AE3A4gBIAYgBikDyAE3A3ggBiAGKQPYATcDaCAGIAYpA+ABNwOAASAGIAYpA8ABNwNwIAYgBikD0AE3A2AgBkGQAWogBkGAAWogBkHwAGogBkHgAGogAxDpAiALIAYrA6ABIAmhIgkgBisDqAEgCqEiChBHIhQgCSAUoxCvAiIJIAmaIApEAAAAAAAAAABkGyARoRBKoiIJoiEKIAwgCaIMAQsgCARAIAYgBikD6AE3A1ggBiAGKQPIATcDSCAGIAYpA9gBNwM4IAYgBikD4AE3A1AgBiAGKQPAATcDQCAGIAYpA9ABNwMwIAZBkAFqIAZB0ABqIAZBQGsgBkEwaiADEOkCIAsgBisDsAEgCaEiCSAGKwO4ASAKoSIKEEciFCAJIBSjEK8CIgkgCZogCkQAAAAAAAAAAGQbIBGhEEqiIgmiIQogDCAJogwBCyAGIAYpA+gBNwMoIAYgBikDyAE3AxggBiAGKQPYATcDCCAGIAYpA+ABNwMgIAYgBikDwAE3AxAgBiAGKQPQATcDACAGQZABaiAGQSBqIAZBEGogBiADEOkCIAYrA5gBIAqhIQogBisDkAEgCaELIQkgA0QAAAAAAADgP6IiAyALoiELIAMgDKILIQwgECANoCEQIA4gD6AhDiAFQUBrIQICfCAEBEAgASANIAugIgM5AwggASAPIAygIg05AwAgACAQIAugIgs5AwggACAOIAygIgw5AwAgAiABKQMINwMIIAIgASkDADcDACAFIAEpAwg3AwggBSABKQMANwMAIAUgACkDCDcDKCAFIAApAwA3AyAgCSAMoCEJIAogC6AMAQsgASANIAqhOQMIIAEgDyAJoTkDACAAIBAgCqEiAzkDCCAAIA4gCaEiDTkDACACIAApAwg3AwggAiAAKQMANwMAIAUgACkDCDcDCCAFIAApAwA3AwAgBSABKQMINwMoIAUgASkDADcDICANIAyhIQkgAyALoQshCiAFIBIgA6A5AzggBSATIA2gOQMwIAUgAyASoTkDGCAFIA0gE6E5AxAgACAKOQMIIAAgCTkDACAGQfABaiQAC/cBAQZ/IwBBEGsiBCQAA0AgASACNgIAIAAhAgNAAkAgAi0AAEUgAyIFQQNKckUEQCAEQQA2AgwgAiACQdDeByAEQQxqENsGIgBGBEADQCAAIABB4N4HIARBDGoiBxDbBiIDRyADIQANAAsgAEGQ3wcgBxDbBiEACyAEKAIMIgMgA0EPcUUgA0EAR3FyIgYNASAEIAI2AgBB+ZcEIAQQKgsgBEEQaiQADwsgBkEIRyIHRQRAQQMhAyAAIQIgBUEDRg0BCyAFIAdyRQRAQQAhAyAAIQIgAC0AAEUNAQsLIAVBAWohAyABKAIAIAYgBUEDdHRyIQIMAAsAC0ABAX8CQCABRQ0AIAAQvgMoAgAgAUEBEJcEIgJFIAJBCGogAUdyDQAgACABEMsDDwsgABC+AygCACABQQAQ7ggLwQUCB3wIfyMAQTBrIgokAAJ/IAIoAhAoAggiCygCACIMKAIIBEAgDEEQaiENIAxBGGoMAQsgDCgCACINQQhqCysDACEEAkAgDSsDACIDIAwgCygCBCINQTBsaiICQSRrKAIARQRAIAJBMGsoAgAgAkEsaygCAEEEdGohAgsgAkEQaysDACIHoSIFIAWiIAQgAkEIaysDACIFoSIGIAaioESN7bWg98awPmMEQCAAIAQ5AwggACADOQMADAELIAEoAhAvAYgBQQ5xIgFBCkYgAUEERnJFBEBBACEBRAAAAAAAAAAAIQMDQAJAIAEgDUYEQCADRAAAAAAAAOA/oiEDQQAhAQwBCyAMIAFBMGxqIgIoAgQhDyACKAIAIQ5BAyECQQAhCwNAIAIgD08EQCABQQFqIQEMAwUgAyAOIAtBBHRqIhArAwAgDiACQQR0aiIRKwMAoSIDIAOiIBArAwggESsDCKEiAyADoqCfoCEDIAJBA2ohAiALQQNqIQsMAQsACwALCwNAAkACQCABIA1HBEAgDCABQTBsaiICKAIEIQ8gAigCACEOQQMhAkEAIQsDQCACIA9PDQMgDiALQQR0aiIQKwMAIgcgDiACQQR0aiIRKwMAIgWhIgQgBKIgECsDCCIGIBErAwgiCKEiBCAEoqCfIgQgA2YNAiACQQNqIQIgC0EDaiELIAMgBKEhAwwACwALIApB/wk2AgQgCkH5uQE2AgBBiPYIKAIAQdi/BCAKECAaEDsACyAAIAggA6IgBiAEIAOhIgaioCAEozkDCCAAIAUgA6IgByAGoqAgBKM5AwAMAwsgAUEBaiEBDAALAAsgCiAEIAWgRAAAAAAAAOA/ojkDKCAKIAopAyg3AxggCiADIAegRAAAAAAAAOA/ojkDICAKIAopAyA3AxAgACALIApBEGoQ/AkLIApBMGokAAseACAARQRAQdTWAUHU+wBBDEHlOxAAAAsgAC0AAEULkwICBX8EfCAAKAIQIgMoAsABIQJBACEAA3wgAiAAQQJ0aigCACIBBHwgAEEBaiEAIAYgAUEwQQAgASgCAEEDcUEDRxtqKAIoKAIQKwMQoCEGDAEFIAMoAsgBIQRBACEBA0AgBCABQQJ0aigCACIFBEAgAUEBaiEBIAcgBUFQQQAgBSgCAEEDcUECRxtqKAIoKAIQKwMQoCEHDAELCyADKwMYIgggAigCACICQTBBACACKAIAQQNxQQNHG2ooAigoAhArAxihIAMrAxAiCSAGIAC4o6EQqAEgBCgCACIAQVBBACAAKAIAQQNxQQJHG2ooAigoAhArAxggCKEgByABuKMgCaEQqAGgRAAAAAAAAOA/ogsLC2EBBHwgAisDCCAAKwMIIgShIAErAwAgACsDACIDoSIFoiACKwMAIAOhIAErAwggBKEiBKKhIgMgA6IiA0S7vdfZ33zbPWMEfEQAAAAAAAAAAAUgAyAFIAWiIAQgBKKgowsLkwEBAXwgAgRAAkACQCACQdoARwRAIAJBtAFGDQEgAkGOAkYNAkGjkQNBx7sBQYQBQaWDARAAAAsgACABKwMIOQMAIAAgASsDAJo5AwgPCyAAIAErAwA5AwAgACABKwMImjkDCA8LIAErAwghAyAAIAErAwA5AwggACADOQMADwsgACABKQMANwMAIAAgASkDCDcDCAv9BwENfyMAQTBrIgIkAAJAAkACQANAIAZBC0cEQCAARQ0DIAAtAABFDQMgBkGQCGxBwIIHaiIFKAIAIghFDQQgCCgCACIDRQ0EQQAhCSAAEEAhCgNAIAMEQEEAIQQgAxBAIQtBACEBAkADQCAAIARqIQcCQAJAA0AgBCAKRiABIAtGcg0CIAcsAAAiDEFfcUHBAGtBGUsNASABIANqLAAAIg1BX3FBwQBrQRpPBEAgAUEBaiEBDAELCyAMEP8BIA0Q/wFHDQMgAUEBaiEBCyAEQQFqIQQMAQsLA0AgBCAKRwRAIAAgBGogBEEBaiEELAAAQV9xQcEAa0EaTw0BDAILCwNAIAEgC0YNBiABIANqIAFBAWohASwAAEFfcUHBAGtBGUsNAAsLIAggCUEBaiIJQQJ0aigCACEDDAELCyAGQQFqIQYMAQsLIAJCADcDKCACQgA3AyAgAiAANgIQIAJBIGohAEEAIQQjAEEwayIBJAAgASACQRBqIgM2AgwgASADNgIsIAEgAzYCEAJAAkACQAJAAkACQEEAQQBBp+8DIAMQYCIGQQBIDQAgBkEBaiEDAkAgABBLIAAQJGsiBSAGSw0AIAMgBWshBSAAECgEQEEBIQQgBUEBRg0BCyAAIAUQvQFBACEECyABQgA3AxggAUIANwMQIAQgBkEQT3ENASABQRBqIQUgBiAEBH8gBQUgABBzCyADQafvAyABKAIsEGAiA0cgA0EATnENAiADQQBMDQAgABAoBEAgA0GAAk8NBCAEBEAgABBzIAFBEGogAxAfGgsgACAALQAPIANqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABB6gFB+B4QAAALIAQNBCAAIAAoAgQgA2o2AgQLIAFBMGokAAwEC0HGpgNBoPwAQd0BQfgeEAAAC0GtngNBoPwAQeIBQfgeEAAAC0H5zQFBoPwAQeUBQfgeEAAAC0GjngFBoPwAQewBQfgeEAAACwJAIAAQKARAIAAQJEEPRg0BCyACQSBqIgAQJCAAEEtPBEAgAEEBEL0BCyACQSBqIgAQJCEBIAAQKARAIAAgAWpBADoAACACIAItAC9BAWo6AC8gABAkQRBJDQFBk7YDQaD8AEGvAkHEsgEQAAALIAIoAiAgAWpBADoAACACIAIoAiRBAWo2AiQLAkAgAkEgahAoBEAgAkEAOgAvDAELIAJBADYCJAsgAkEgaiIAECghASAAIAIoAiAgARsiABChBgRAIAIgADYCAEGvNCACECoLIAItAC9B/wFGBEAgAigCIBAYC0HsLhCNCiEFCyACQTBqJAAgBQ8LQYumA0HttwFB8wVB1YkBEAAAC0He1gFB7bcBQfQFQdWJARAAAAu/AgEGfyAAKAIIIQUgACgCDCEGA0AgACgCACAESwRAIAUgACgCBCAEbGohASAGBEAgASAGEQEACwJAAkACQAJAAkACQAJAAkACQAJAIAEoAgBBAmsODQAAAQECAwQEBgcIBQUJCyABKAIMEBgMCAsgASgCDBAYDAcLIAEoAgwQGAwGCyABKAIoEBgMBQsgASgCCBAYDAQLQQAhAgJAAkACQAJAIAEoAghBAWsOAgABAwsDQCABKAI0IQMgAiABKAIwTg0CIAMgAkEEdGooAggQGCACQQFqIQIMAAsACwNAIAEoAkQhAyACIAEoAkBODQEgAyACQQR0aigCCBAYIAJBAWohAgwACwALIAMQGAsMAwsgASgCEBAYDAILIAEoAggQGAwBCyABKAIoEBgLIARBAWohBAwBCwsgBRAYIAAQGAvfAQEDfyAAECQgABBLTwRAIAAQSyICQQFqIgMgAkEBdEGACCACGyIEIAMgBEsbIQMgABAkIQQCQCAALQAPQf8BRgRAIAAoAgAgAiADQQEQhQUhAgwBCyADQQEQPyICIAAgBBAfGiAAIAQ2AgQLIABB/wE6AA8gACADNgIIIAAgAjYCAAsgABAkIQICQCAAECgEQCAAIAJqIAE6AAAgACAALQAPQQFqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABBrwJBxLIBEAAACyAAKAIAIAJqIAE6AAAgACAAKAIEQQFqNgIECwueBwEKfyMAQaABayICJAACQCAARQ0AQQFBFBA/IgNB0AAgASABQdAATRsiBjYCBAJ/IAMoAgAiAUUEQEHkACEFQeQAIAYQPwwBCyADKAIIIAEgAUHkAGoiBSAGEIUFCyEHIAJBKGohCiACQRhqIQggAkEwaiEJIAJBEGohAQJAA0AgAC0AACIEQQlrIgtBF0tBASALdEGfgIAEcUVyRQRAIABBAWohAAwBCyAAQQFqIQACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEQcIAaw4TBggVAQsVFQ0VFQkVFRUDFRUMCgALAkAgBEHiAGsOBAUHFQIACyAEQfAAaw4FAxQUFA0OCyACQQA2AggMEQsgAkEBNgIIDBALIAJBAjYCCAwOCyACQQM2AggMDQsgAkEENgIIDAsLIAJBBTYCCAwKCyAAIAJBmAFqEOsCIgBFDQ0gAigCmAEgAkHYAGoQlApFDQ0gAigCWEUEQCACQQk2AgggAiACKAJgNgIQDA0LIAJBDjYCCAwICyAAIAJBmAFqEOsCIgBFDQwgAigCmAEgAkHYAGoQlApFDQwgAigCWEUEQCACQQg2AgggAiACKAJgNgIQDAwLIAJBDTYCCAwHCyACQQY2AgggACABEOEGIgBFDQsMCgsgAkEHNgIIIAAgARDGASIARQ0KIAAgCBDGASIARQ0KIAAgAkGcAWoQhAUhACACQQJBASACKAKcASIEG0EAIARBAE4bNgIgIABFDQogACAKEMYBIgBFDQogACAJEOsCIgBFDQoMCQsgAkEKNgIIIAAgARDGASIARQ0JIAAgCBDrAiIARQ0JDAgLIAJBCzYCCCAAIAEQ6wIiAEUNCAwHCyACQQw2AgggACABEJIKIgBFDQcgACAJEOsCIgBFDQcMBgsgAkEPNgIIIAAgARCRCiIARQ0GDAULIARFDQcMBQsgASACQdgAakHAABAfGgwDCyAAIAEQ4QYiAEUNAwwCCyAAIAEQ4QYiAEUNAgwBCyAAIAEQkgoiAEUNAQsgBSADKAIAIgRGBH8gByAFIAVBAXQiBSAGEIUFIQcgAygCAAUgBAsgBmwgB2ogAkEIakHQABAfGiADIAMoAgBBAWo2AgAMAQsLIAMgAygCEEEBcjYCEAsgAygCACIABEAgAyAHIAUgACAGEIUFNgIIDAELIAcQGCADEBhBACEDCyACQaABaiQAIAMLNgEBfyMAQRBrIgIkACABIAAgAkEMakEKEKkENgIAIAIoAgwhASACQRBqJAAgAUEAIAAgAUcbC4MBAQR/IwBBEGsiAiQAIAEgACACQQxqIgQQ4QE5AwACQCAAIAIoAgwiA0YNACABIAMgBBDhATkDCCADIAIoAgwiAEYNACABIAAgBBDhATkDECAAIAIoAgwiA0YNACABIAMgBBDhATkDGCACKAIMIgBBACAAIANHGyEFCyACQRBqJAAgBQsTAEHY3QooAgAaQdjdCkEANgIAC6YEAQV/IwBBEGsiBCQAAkACQAJAAkACQCAALQAAIgJBI0YNASACQShHBEAgAkEvRg0CIAJB2wBHDQEgAUEBNgIAQQAhAiAAQQFqIgUgAUEIahDGASIARQ0FIAAgAUEQahDGASIARQ0FIAAgAUEYahDGASIARQ0FIAAgAUEgahDGASIARQ0FIAAgAUEoahCEBSIDRQ0FQQAhACABKAIoQRAQPyECA0AgASgCKCAASgRAIAMgBEEIahDGASIDRQ0GIAIgAEEEdGoiBiAEKwMIOQMAIABBAWohACADIAZBCGoQ6wIiAw0BDAYLCyABIAI2AiwgBSECDAULIAFBAjYCAEEAIQIgAEEBaiIFIAFBCGoQxgEiAEUNBCAAIAFBEGoQxgEiAEUNBCAAIAFBGGoQxgEiAEUNBCAAIAFBIGoQxgEiAEUNBCAAIAFBKGoQxgEiAEUNBCAAIAFBMGoQxgEiAEUNBCAAIAFBOGoQhAUiA0UNBEEAIQAgASgCOEEQED8hAgNAIAEoAjggAEoEQCADIARBCGoQxgEiA0UNBCACIABBBHRqIgYgBCsDCDkDACAAQQFqIQAgAyAGQQhqEOsCIgMNAQwECwsgASACNgI8IAUhAgwECyACwCIFQV9xQcEAa0EaTwRAQQAhAiAFQTBrQQlLDQQLCyABIAA2AgggAUEANgIAIAAhAgwCCyACEBhBACECDAELIAIQGEEAIQILIARBEGokACACC50DAQR/IwBBEGsiBCQAIAQgAjYCBCAEIAE2AgBBACECIwBBMGsiASQAIAEgBDYCDCABIAQ2AiwgASAENgIQAkACQAJAAkACQAJAQQBBAEGiMyAEEGAiBkEASA0AIAZBAWohAwJAIAAQSyAAECRrIgUgBksNACADIAVrIQUgABAoBEBBASECIAVBAUYNAQsgACAFEL0BQQAhAgsgAUIANwMYIAFCADcDECACIAZBEE9xDQEgAUEQaiEFIAYgAgR/IAUFIAAQcwsgA0GiMyABKAIsEGAiA0cgA0EATnENAiADQQBMDQAgABAoBEAgA0GAAk8NBCACBEAgABBzIAFBEGogAxAfGgsgACAALQAPIANqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABB6gFB+B4QAAALIAINBCAAIAAoAgQgA2o2AgQLIAFBMGokAAwEC0HGpgNBoPwAQd0BQfgeEAAAC0GtngNBoPwAQeIBQfgeEAAAC0H5zQFBoPwAQeUBQfgeEAAAC0GjngFBoPwAQewBQfgeEAAACyAAEOICIARBEGokAAuIBAEGfyMAQSBrIgQkAAJAAkACQCABRAAANCb1awzDYwRAIABBgPEJEJAFDAELIAFEAAA0JvVrDENkBEAgAEGB8QkQkAUMAQsgBCABOQMQIABB1oUBIARBEGoQjwUgABCHBSEGIAAQJCECAkADQCACIgNFDQEgBiACQQFrIgJqLQAAQS5HDQALIAAQJCECA0AgAkEBayEFIAIgA0cEQCAFIAZqLQAAQTBHDQILAkAgABAoBEAgAC0ADyIHRQ0FIAAgB0EBazoADwwBCyAAIAAoAgRBAWs2AgQLIAIgA0cgBSECDQALIAAQJCICQQJJDQAgAiAGaiICQQJrIgMtAABBLUcNACACQQFrLQAAQTBHDQAgA0EwOgAAIAAQKARAIAAtAA8iAkUNBCAAIAJBAWs6AA8MAQsgACAAKAIEQQFrNgIECwJAIAAQKARAIAAgABAkIgIQkAIiAw0BIAQgAkEBajYCAEGI9ggoAgBB9ekDIAQQIBoQLwALIABBABDKAyAAKAIAIQMLIABCADcCACAAQgA3AghBASEFAkAgAyICQZ+gAxDCAkUEQCACQZ6gAxDCAkUNAUECIQUgAkEBaiECCyACIAMgBWogAhBAELYBGgsgACADEJAFIAMQGAsgBEEgaiQADwtB4o8DQaD8AEGSA0HoKhAAAAtB4o8DQaD8AEGoA0HoKhAAAAs/ACAAEIoGIAAQ1QQgACADBH8CQCADQX5xQQJGBEAgACADIAEgAhDACAwBCyAAEIkGCyAFBSAECyABIAIQvwgLTQBBASABLQACIgB0IABBBXZBAXEgAS0AASIAQQJ2QQ9xIAEtAABBBHRB8AFxciACai0AAEEDdCAAQQF0QQZxcnJBAnRBsPMHaigCAHELQABBASABLQABIgB0IABBBXZBAXEgAS0AACIAQQJ2QQdxIAJqLQAAQQN0IABBAXRBBnFyckECdEGw8wdqKAIAcQtHAQF/IAAoAvACIAEgACgC7AIRAAAiAEH//wNNBH8gAEEDdkEccSAAQQh2IAJqLQAAQQV0ckGw8wdqKAIAQQEgAHRxBUEACwujAQEDfyMAQZABayIAJAAgAEIlNwOIASAAQYgBaiIGQQFyQd/yACAFIAIoAgQQmQUQZiEHIAAgBDYCACAAQfsAaiIEIARBDSAHIAYgABDdASAEaiIHIAIQpwIhCCAAQQRqIgYgAhBTIAQgCCAHIABBEGoiBCAAQQxqIABBCGogBhCECyAGEFAgASAEIAAoAgwgACgCCCACIAMQoAMgAEGQAWokAAujAQEEfyMAQYACayIAJAAgAEIlNwP4ASAAQfgBaiIHQQFyQcruACAFIAIoAgQQmQUQZiEIIAAgBDcDACAAQeABaiIGIAZBGCAIIAcgABDdASAGaiIIIAIQpwIhCSAAQRRqIgcgAhBTIAYgCSAIIABBIGoiBiAAQRxqIABBGGogBxCECyAHEFAgASAGIAAoAhwgACgCGCACIAMQoAMgAEGAAmokAAueAQEDfyMAQUBqIgAkACAAQiU3AzggAEE4aiIGQQFyQd/yACAFIAIoAgQQmQUQZiEHIAAgBDYCACAAQStqIgQgBEENIAcgBiAAEN0BIARqIgcgAhCnAiEIIABBBGoiBiACEFMgBCAIIAcgAEEQaiIEIABBDGogAEEIaiAGEIkLIAYQUCABIAQgACgCDCAAKAIIIAIgAxChAyAAQUBrJAALogEBBH8jAEHwAGsiACQAIABCJTcDaCAAQegAaiIHQQFyQcruACAFIAIoAgQQmQUQZiEIIAAgBDcDACAAQdAAaiIGIAZBGCAIIAcgABDdASAGaiIIIAIQpwIhCSAAQRRqIgcgAhBTIAYgCSAIIABBIGoiBiAAQRxqIABBGGogBxCJCyAHEFAgASAGIAAoAhwgACgCGCACIAMQoQMgAEHwAGokAAs/AANAIAEgAkcEQCABIAEoAgAiAEH/AE0EfyADKAIAIAEoAgBBAnRqKAIABSAACzYCACABQQRqIQEMAQsLIAELPgADQCABIAJHBEAgASABLAAAIgBBAE4EfyADKAIAIAEsAABBAnRqKAIABSAACzoAACABQQFqIQEMAQsLIAELMwECfyAAQRhqQQAgARA4IQIgACABECYhAyAAKAIAIAMgAWxqIAIgARAfGiAAKAAIQQFrC10BA38gACgCECEFIAAoAjwhAyABQToQzQEiBARAIARBADoAAAsCQCADRQ0AIAAoAkQgASAFIAJqIgEQ2QggAygCXCIDRQ0AIAAgASADEQQACyAEBEAgBEE6OgAACwu6AQEBfyMAQSBrIgckAAJAAkAgASAGSQRAIAIgBU8NAQJAIAJFBEAgABAYQQAhAgwBCyAAIAIgBHQiABBqIgJFDQMgACABIAR0IgFNDQAgASACakEAIAAgAWsQOBoLIAdBIGokACACDwtBjsADQdL8AEHNAEG9swEQAAALIAcgAzYCBCAHIAI2AgBBiPYIKAIAQabqAyAHECAaEC8ACyAHIAA2AhBBiPYIKAIAQfXpAyAHQRBqECAaEC8ACzwBAn8jAEEQayIBJABBASAAEE4iAkUEQCABIAA2AgBBiPYIKAIAQfXpAyABECAaEC8ACyABQRBqJAAgAguoAQECfyMAQaABayIEJAAgBCABNgKcAUEAIQEgBEEQaiIFQQBBgAEQOBogBCAFNgIMIAAgBEGcAWogAiAEQQxqIARBjwFqIAAoAjgRCAAaAkAgBCgCnAEgAkcNACAEKAIMQQA6AAAgBUHChwgQ0QkEQCAAIgEoAkBBAkYNAQtBACEBIARBEGoQ0gkiAEF/Rg0AIABBAnQgA2ooAgAhAQsgBEGgAWokACABC04BAX9BASAAIAFBFGxqIgAoAgAiASABQQFNGyEEQQEhAQNAIAEgBEcEQCACIAAoAgQgAUECdGooAgBBAnRqIAM2AgAgAUEBaiEBDAELCwucAQEBf0ELIQcCQAJAAkACQAJAIAFBD2sOBAMCAgABCyAEIAIgA0HYpgggBCgCGBEGAARAIAAgBjYCAEELDwsgBCACIANB36YIIAQoAhgRBgBFDQEgACAFNgIAQQsPCyABQRtGDQILIAFBHEYEQEE7IQcgACgCEEUNAQsgAEGeATYCAEF/IQcLIAcPCyAAQQs2AgggAEGzATYCAEEMC0oAIAchAiAGIQQgBSEDAkACQAJAIAFBD2sOBAIAAAEAC0F/IQJBngEhBCABQRxHDQAgACgCEA0AQTsPCyAAIAQ2AgAgAiEDCyADC0QBAX8jAEEQayIEJAACfyABLQAAQSpHBEAgBCABNgIAIAMgBBAqQQEMAQsgACAALQCEASACcjoAhAFBAAsgBEEQaiQAC1oAQcABIQRBISEDAn8CQAJAAkACQCABQRVrDgQAAgIDAQsgBSEEDAILQSEgAUEPRg0CGgtBfyEDQZ4BIQQgAUEcRw0AQTsgACgCEEUNARoLIAAgBDYCACADCws/ACACENIJIgJBf0YEQEEADwsgACABNgJIIABB2QA2AjAgACAENgIEIAAgAzYCACAAIAI6AEUgASAANgIAQQELMgECfyMAQRBrIgMkACADQQRqIgQgACACELkTIAAgAWogBBC4EyAEEIECGiADQRBqJAALFQAgAEGs7Ak2AgAgAEEEahCvCiAACwwAIAAQsAoaIAAQGAseAAJAIAAoAgBBDGsiAEEIahD5BkEATg0AIAAQGAsLFQAgAEGY7Ak2AgAgAEEEahCvCiAAC4cBAQF/IAAtAJkBQQRxRQRAAkAgACgCTCIBRQ0AIAEoAggiAUUNACAAIAERAQAPCyAAEOsGGgJAIAAoAiBFDQAgACgCJCIBQZD2CCgCAEYNACAALQCQAQ0AIAEEQCABEOoDIABBADYCJAsgAEEANgIgCw8LQZPfA0EAIAAoAgwoAhARBAAQLwALgQEBA38gACgCBCIEQQFxIQUCfyABLQA3QQFGBEAgBEEIdSIGIAVFDQEaIAIoAgAgBhDuBgwBCyAEQQh1IAVFDQAaIAEgACgCACgCBDYCOCAAKAIEIQRBACECQQALIQUgACgCACIAIAEgAiAFaiADQQIgBEECcRsgACgCACgCHBEHAAvsAgEEfyMAQSBrIgMkACADIAI2AhwgAyACNgIAAkACQAJAAkACQEEAQQAgASACEGAiAkEASARAIAIhAQwBCyACQQFqIQYCQCAAEEsgABAkayIFIAJLDQAgBiAFayEFIAAQKARAQQEhBCAFQQFGDQELIAAgBRC9AUEAIQQLIANCADcDCCADQgA3AwAgBCACQRBPcQ0BIAMhBSACIAQEfyAFBSAAEHMLIAYgASADKAIcEGAiAUcgAUEATnENAiABQQBMDQAgABAoBEAgAUGAAk8NBCAEBEAgABBzIAMgARAfGgsgACAALQAPIAFqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABB6gFB+B4QAAALIAQNBCAAIAAoAgQgAWo2AgQLIANBIGokACABDwtBxqYDQaD8AEHdAUH4HhAAAAtBrZ4DQaD8AEHiAUH4HhAAAAtB+c0BQaD8AEHlAUH4HhAAAAtBo54BQaD8AEHsAUH4HhAAAAucAgEDfyMAQRBrIggkACABQX9zQff///8DaiACTwRAIAAQRiEJIAhBBGoiCiABQfP///8BSQR/IAggAUEBdDYCDCAIIAEgAmo2AgQgCiAIQQxqEN8DKAIAENADQQFqBUH3////AwsQzwMgCCgCBCECIAgoAggaIAQEQCACIAkgBBD3AgsgBgRAIARBAnQgAmogByAGEPcCCyADIAQgBWoiCmshByADIApHBEAgBEECdCIDIAJqIAZBAnRqIAMgCWogBUECdGogBxD3AgsgAUEBRwRAIAkQnAQLIAAgAhD6ASAAIAgoAggQ+QEgACAEIAZqIAdqIgAQvwEgCEEANgIMIAIgAEECdGogCEEMahDcASAIQRBqJAAPCxDKAQALjQEBAn8jAEEQayIDJAAgAUH3////B00EQAJAIAEQoAUEQCAAIAEQ0wEgACEEDAELIANBCGogARDeA0EBahDdAyADKAIMGiAAIAMoAggiBBD6ASAAIAMoAgwQ+QEgACABEL8BCyAEIAEgAhC2CiADQQA6AAcgASAEaiADQQdqENIBIANBEGokAA8LEMoBAAs9AQF/IwBBEGsiAyQAIAMgAjoADwNAIAEEQCAAIAMtAA86AAAgAUEBayEBIABBAWohAAwBCwsgA0EQaiQAC4sCAQN/IwBBEGsiCCQAIAFBf3NB9////wdqIAJPBEAgABBGIQkgCEEEaiIKIAFB8////wNJBH8gCCABQQF0NgIMIAggASACajYCBCAKIAhBDGoQ3wMoAgAQ3gNBAWoFQff///8HCxDdAyAIKAIEIQIgCCgCCBogBARAIAIgCSAEEKoCCyAGBEAgAiAEaiAHIAYQqgILIAMgBCAFaiIKayEHIAMgCkcEQCACIARqIAZqIAQgCWogBWogBxCqAgsgAUEKRwRAIAkQoQULIAAgAhD6ASAAIAgoAggQ+QEgACAEIAZqIAdqIgAQvwEgCEEAOgAMIAAgAmogCEEMahDSASAIQRBqJAAPCxDKAQALFgAgACABIAJCgICAgICAgICAfxCwBQsJACAAEGY2AgALIwECfyAAIQEDQCABIgJBBGohASACKAIADQALIAIgAGtBAnULDwAgACAAKAIAQQRrNgIACwoAIAAoAgBBBGsLBwAgACgCBAstAQF/IwBBEGsiAiQAAkAgACABRgRAIABBADoAeAwBCyABEJwECyACQRBqJAALEwAgABCLBSgCACAAKAIAa0ECdQssAQF/IAAoAgQhAgNAIAEgAkcEQCAAEJwDGiACQQRrIQIMAQsLIAAgATYCBAsJACAAQQA2AgALSQEBfyMAQRBrIgMkAAJAAkAgAkEeSw0AIAEtAHhBAXENACABQQE6AHgMAQsgAhDJCiEBCyADQRBqJAAgACACNgIEIAAgATYCAAtAAQF/IwBBEGsiASQAIAAQnAMaIAFB/////wM2AgwgAUH/////BzYCCCABQQxqIAFBCGoQrwsoAgAgAUEQaiQAC2cBAn8jAEEQayIDJAADQAJAIAEtAAAiAkHcAEcEQCACBEAgAsAiAkEATgRAIAAgAhBlDAMLIAMgAjYCACAAQbXfACADEB4MAgsgA0EQaiQADwsgAEGAyQEQGxoLIAFBAWohAQwACwALCwAgAEEANgIAIAALNwEBfyMAQRBrIgMkACADIAEQ7QI2AgwgAyACEO0CNgIIIAAgA0EMaiADQQhqEKIFIANBEGokAAtOAQF/IwBBEGsiAyQAIAMgATYCCCADIAA2AgwgAyACNgIEQQAhASADQQRqIgAgA0EMahCfBUUEQCAAIANBCGoQnwUhAQsgA0EQaiQAIAELNAEBfyMAQRBrIgMkACAAECUaIAAgAhCeAyADQQA6AA8gASACaiADQQ9qENIBIANBEGokAAscACAAQf////8DSwRAEJEBAAsgAEECdEEEEKQLCwkAIAAQ9wYQGAsVACAAQeC8CTYCACAAQRBqEDUaIAALFQAgAEG4vAk2AgAgAEEMahA1GiAAC7cDAQR/AkAgAyACIgBrQQNIQQFyDQAgAC0AAEHvAUcNACAALQABQbsBRw0AIABBA0EAIAAtAAJBvwFGG2ohAAsDQAJAIAQgB00gACADT3INACAALAAAIgFB/wFxIQUCf0EBIAFBAE4NABogAUFCSQ0BIAFBX00EQCADIABrQQJIDQIgAC0AAUHAAXFBgAFHDQJBAgwBCyABQW9NBEAgAyAAa0EDSA0CIAAtAAIgACwAASEBAkACQCAFQe0BRwRAIAVB4AFHDQEgAUFgcUGgf0YNAgwFCyABQaB/Tg0EDAELIAFBv39KDQMLQcABcUGAAUcNAkEDDAELIAMgAGtBBEggAUF0S3INASAALQADIQYgAC0AAiEIIAAsAAEhAQJAAkACQAJAIAVB8AFrDgUAAgICAQILIAFB8ABqQf8BcUEwTw0EDAILIAFBkH9ODQMMAQsgAUG/f0oNAgsgCEHAAXFBgAFHIAZBwAFxQYABR3IgBkE/cSAIQQZ0QcAfcSAFQRJ0QYCA8ABxIAFBP3FBDHRycnJB///DAEtyDQFBBAshASAHQQFqIQcgACABaiEADAELCyAAIAJrC9EEAQR/IwBBEGsiACQAIAAgAjYCDCAAIAU2AggCfyAAIAI2AgwgACAFNgIIAkACQANAAkAgACgCDCIBIANPDQAgACgCCCIKIAZPDQAgASwAACIFQf8BcSECAn8gBUEATgRAIAJB///DAEsNBUEBDAELIAVBQkkNBCAFQV9NBEBBASADIAFrQQJIDQYaQQIhBSABLQABIghBwAFxQYABRw0EIAhBP3EgAkEGdEHAD3FyIQJBAgwBCyAFQW9NBEBBASEFIAMgAWsiCUECSA0EIAEsAAEhCAJAAkAgAkHtAUcEQCACQeABRw0BIAhBYHFBoH9GDQIMCAsgCEGgf0gNAQwHCyAIQb9/Sg0GCyAJQQJGDQQgAS0AAiIFQcABcUGAAUcNBSAFQT9xIAJBDHRBgOADcSAIQT9xQQZ0cnIhAkEDDAELIAVBdEsNBEEBIQUgAyABayIJQQJIDQMgASwAASEIAkACQAJAAkAgAkHwAWsOBQACAgIBAgsgCEHwAGpB/wFxQTBPDQcMAgsgCEGQf04NBgwBCyAIQb9/Sg0FCyAJQQJGDQMgAS0AAiILQcABcUGAAUcNBCAJQQNGDQMgAS0AAyIJQcABcUGAAUcNBEECIQUgCUE/cSALQQZ0QcAfcSACQRJ0QYCA8ABxIAhBP3FBDHRycnIiAkH//8MASw0DQQQLIQUgCiACNgIAIAAgASAFajYCDCAAIAAoAghBBGo2AggMAQsLIAEgA0khBQsgBQwBC0ECCyAEIAAoAgw2AgAgByAAKAIINgIAIABBEGokAAuKBAAjAEEQayIAJAAgACACNgIMIAAgBTYCCAJ/IAAgAjYCDCAAIAU2AgggACgCDCEBAkADQAJAIAEgA08EQEEAIQIMAQtBAiECIAEoAgAiAUH//8MASyABQYBwcUGAsANGcg0AAkAgAUH/AE0EQEEBIQIgBiAAKAIIIgVrQQBMDQIgACAFQQFqNgIIIAUgAToAAAwBCyABQf8PTQRAIAYgACgCCCICa0ECSA0EIAAgAkEBajYCCCACIAFBBnZBwAFyOgAAIAAgACgCCCICQQFqNgIIIAIgAUE/cUGAAXI6AAAMAQsgBiAAKAIIIgJrIQUgAUH//wNNBEAgBUEDSA0EIAAgAkEBajYCCCACIAFBDHZB4AFyOgAAIAAgACgCCCICQQFqNgIIIAIgAUEGdkE/cUGAAXI6AAAgACAAKAIIIgJBAWo2AgggAiABQT9xQYABcjoAAAwBCyAFQQRIDQMgACACQQFqNgIIIAIgAUESdkHwAXI6AAAgACAAKAIIIgJBAWo2AgggAiABQQx2QT9xQYABcjoAACAAIAAoAggiAkEBajYCCCACIAFBBnZBP3FBgAFyOgAAIAAgACgCCCICQQFqNgIIIAIgAUE/cUGAAXI6AAALIAAgACgCDEEEaiIBNgIMDAELCyACDAELQQELIAQgACgCDDYCACAHIAAoAgg2AgAgAEEQaiQAC8kDAQR/AkAgAyACIgBrQQNIQQFyDQAgAC0AAEHvAUcNACAALQABQbsBRw0AIABBA0EAIAAtAAJBvwFGG2ohAAsDQAJAIAQgBk0gACADT3INAAJ/IABBAWogAC0AACIBwEEATg0AGiABQcIBSQ0BIAFB3wFNBEAgAyAAa0ECSA0CIAAtAAFBwAFxQYABRw0CIABBAmoMAQsgAUHvAU0EQCADIABrQQNIDQIgAC0AAiAALAABIQUCQAJAIAFB7QFHBEAgAUHgAUcNASAFQWBxQaB/Rg0CDAULIAVBoH9ODQQMAQsgBUG/f0oNAwtBwAFxQYABRw0CIABBA2oMAQsgAyAAa0EESCABQfQBS3IgBCAGa0ECSXINASAALQADIQcgAC0AAiEIIAAsAAEhBQJAAkACQAJAIAFB8AFrDgUAAgICAQILIAVB8ABqQf8BcUEwTw0EDAILIAVBkH9ODQMMAQsgBUG/f0oNAgsgCEHAAXFBgAFHIAdBwAFxQYABR3IgB0E/cSAIQQZ0QcAfcSABQRJ0QYCA8ABxIAVBP3FBDHRycnJB///DAEtyDQEgBkEBaiEGIABBBGoLIQAgBkEBaiEGDAELCyAAIAJrC6kFAQR/IwBBEGsiACQAIAAgAjYCDCAAIAU2AggCfyAAIAI2AgwgACAFNgIIAkACQANAAkAgACgCDCIBIANPDQAgACgCCCIFIAZPDQBBAiEJIAACfyABLQAAIgLAQQBOBEAgBSACOwEAIAFBAWoMAQsgAkHCAUkNBCACQd8BTQRAQQEgAyABa0ECSA0GGiABLQABIghBwAFxQYABRw0EIAUgCEE/cSACQQZ0QcAPcXI7AQAgAUECagwBCyACQe8BTQRAQQEhCSADIAFrIgpBAkgNBCABLAABIQgCQAJAIAJB7QFHBEAgAkHgAUcNASAIQWBxQaB/Rw0IDAILIAhBoH9ODQcMAQsgCEG/f0oNBgsgCkECRg0EIAEtAAIiCUHAAXFBgAFHDQUgBSAJQT9xIAhBP3FBBnQgAkEMdHJyOwEAIAFBA2oMAQsgAkH0AUsNBEEBIQkgAyABayIKQQJIDQMgAS0AASILwCEIAkACQAJAAkAgAkHwAWsOBQACAgIBAgsgCEHwAGpB/wFxQTBPDQcMAgsgCEGQf04NBgwBCyAIQb9/Sg0FCyAKQQJGDQMgAS0AAiIIQcABcUGAAUcNBCAKQQNGDQMgAS0AAyIBQcABcUGAAUcNBCAGIAVrQQNIDQNBAiEJIAFBP3EiASAIQQZ0IgpBwB9xIAtBDHRBgOAPcSACQQdxIgJBEnRycnJB///DAEsNAyAFIAhBBHZBA3EgC0ECdCIJQcABcSACQQh0ciAJQTxxcnJBwP8AakGAsANyOwEAIAAgBUECajYCCCAFIAEgCkHAB3FyQYC4A3I7AQIgACgCDEEEags2AgwgACAAKAIIQQJqNgIIDAELCyABIANJIQkLIAkMAQtBAgsgBCAAKAIMNgIAIAcgACgCCDYCACAAQRBqJAAL4wUBAX8jAEEQayIAJAAgACACNgIMIAAgBTYCCAJ/IAAgAjYCDCAAIAU2AgggACgCDCECAkACQANAIAIgA08EQEEAIQUMAgtBAiEFAkACQCACLwEAIgFB/wBNBEBBASEFIAYgACgCCCICa0EATA0EIAAgAkEBajYCCCACIAE6AAAMAQsgAUH/D00EQCAGIAAoAggiAmtBAkgNBSAAIAJBAWo2AgggAiABQQZ2QcABcjoAACAAIAAoAggiAkEBajYCCCACIAFBP3FBgAFyOgAADAELIAFB/68DTQRAIAYgACgCCCICa0EDSA0FIAAgAkEBajYCCCACIAFBDHZB4AFyOgAAIAAgACgCCCICQQFqNgIIIAIgAUEGdkE/cUGAAXI6AAAgACAAKAIIIgJBAWo2AgggAiABQT9xQYABcjoAAAwBCyABQf+3A00EQEEBIQUgAyACa0EDSA0EIAIvAQIiCEGA+ANxQYC4A0cNAiAGIAAoAghrQQRIDQQgCEH/B3EgAUEKdEGA+ANxIAFBwAdxIgVBCnRyckH//z9LDQIgACACQQJqNgIMIAAgACgCCCICQQFqNgIIIAIgBUEGdkEBaiICQQJ2QfABcjoAACAAIAAoAggiBUEBajYCCCAFIAJBBHRBMHEgAUECdkEPcXJBgAFyOgAAIAAgACgCCCICQQFqNgIIIAIgCEEGdkEPcSABQQR0QTBxckGAAXI6AAAgACAAKAIIIgFBAWo2AgggASAIQT9xQYABcjoAAAwBCyABQYDAA0kNAyAGIAAoAggiAmtBA0gNBCAAIAJBAWo2AgggAiABQQx2QeABcjoAACAAIAAoAggiAkEBajYCCCACIAFBBnZBvwFxOgAAIAAgACgCCCICQQFqNgIIIAIgAUE/cUGAAXI6AAALIAAgACgCDEECaiICNgIMDAELC0ECDAILIAUMAQtBAQsgBCAAKAIMNgIAIAcgACgCCDYCACAAQRBqJAALPgECfyMAQRBrIgEkACABIAA2AgwgAUEIaiABQQxqEI4CQQRBAUHEgwsoAgAoAgAbIQIQjQIgAUEQaiQAIAILOgEBfyMAQRBrIgUkACAFIAQ2AgwgBUEIaiAFQQxqEI4CIAAgASACIAMQrgUhABCNAiAFQRBqJAAgAAsiAQJ/EL8FIQAQ7QMhASAAQcjdCmogAEHI3QooAgBqIAEbCxIAIAQgAjYCACAHIAU2AgBBAwsqAQF/IABBzLMJNgIAAkAgACgCCCIBRQ0AIAAtAAxBAUcNACABEBgLIAALBAAgAQsnAQF/IAAoAgAoAgAoAgBBlJ0LQZSdCygCAEEBaiIANgIAIAA2AgQLywoBCH9BkJ0LLQAARQRAIwBBEGsiBSQAQYidCy0AAEUEQCMAQRBrIgYkACAGQQE2AgxB6JsLIAYoAgwQcCIBQbizCTYCACMAQRBrIgMkACABQQhqIgJCADcCACADQQA2AgwgAkEIahDFCkEAOgB8IANBBGogAhCiAigCABogA0EAOgAKIwBBEGsiBCQAIAIQwwpBHkkEQBDKAQALIARBCGogAhCcA0EeEMIKIAIgBCgCCCIHNgIEIAIgBzYCACAEKAIMIQggAhCLBSAHIAhBAnRqNgIAIARBEGokACACQR4Q4AogA0EBOgAKIANBEGokACABQZABakGL3gEQpgQgAhDEAhogAhDfCkH8pgtBARBwQdjHCTYCACABQfymC0HAmgsQbxB1QYSnC0EBEHBB+McJNgIAIAFBhKcLQciaCxBvEHVBjKcLQQEQcCICQQA6AAwgAkEANgIIIAJBzLMJNgIAIAJBgLQJNgIIIAFBjKcLQaCdCxBvEHVBnKcLQQEQcEG4vwk2AgAgAUGcpwtBmJ0LEG8QdUGkpwtBARBwQdDACTYCACABQaSnC0GonQsQbxB1QaynC0EBEHAiAkGIvAk2AgAgAhBmNgIIIAFBrKcLQbCdCxBvEHVBuKcLQQEQcEHkwQk2AgAgAUG4pwtBuJ0LEG8QdUHApwtBARBwQczDCTYCACABQcCnC0HInQsQbxB1QcinC0EBEHBB2MIJNgIAIAFByKcLQcCdCxBvEHVB0KcLQQEQcEHAxAk2AgAgAUHQpwtB0J0LEG8QdUHYpwtBARBwIgJBrtgAOwEIIAJBuLwJNgIAIAJBDGoQVBogAUHYpwtB2J0LEG8QdUHwpwtBARBwIgJCroCAgMAFNwIIIAJB4LwJNgIAIAJBEGoQVBogAUHwpwtB4J0LEG8QdUGMqAtBARBwQZjICTYCACABQYyoC0HQmgsQbxB1QZSoC0EBEHBBkMoJNgIAIAFBlKgLQdiaCxBvEHVBnKgLQQEQcEHkywk2AgAgAUGcqAtB4JoLEG8QdUGkqAtBARBwQdDNCTYCACABQaSoC0HomgsQbxB1QayoC0EBEHBBtNUJNgIAIAFBrKgLQZCbCxBvEHVBtKgLQQEQcEHI1gk2AgAgAUG0qAtBmJsLEG8QdUG8qAtBARBwQbzXCTYCACABQbyoC0GgmwsQbxB1QcSoC0EBEHBBsNgJNgIAIAFBxKgLQaibCxBvEHVBzKgLQQEQcEGk2Qk2AgAgAUHMqAtBsJsLEG8QdUHUqAtBARBwQczaCTYCACABQdSoC0G4mwsQbxB1QdyoC0EBEHBB9NsJNgIAIAFB3KgLQcCbCxBvEHVB5KgLQQEQcEGc3Qk2AgAgAUHkqAtByJsLEG8QdUHsqAtBARBwIgJBiOcJNgIIIAJBmM8JNgIAIAJByM8JNgIIIAFB7KgLQfCaCxBvEHVB+KgLQQEQcCICQaznCTYCCCACQaTRCTYCACACQdTRCTYCCCABQfioC0H4mgsQbxB1QYSpC0EBEHAiAkEIahC5CiACQZTTCTYCACABQYSpC0GAmwsQbxB1QZCpC0EBEHAiAkEIahC5CiACQbTUCTYCACABQZCpC0GImwsQbxB1QZypC0EBEHBBxN4JNgIAIAFBnKkLQdCbCxBvEHVBpKkLQQEQcEG83wk2AgAgAUGkqQtB2JsLEG8QdSAGQRBqJAAgBUHomws2AghBhJ0LIAUoAggQogIaQYidC0EBOgAACyAFQRBqJABBjJ0LQYSdCxDcCkGQnQtBAToAAAsgAEGMnQsoAgAiADYCACAAENsKCxEAIABB6JsLRwRAIAAQ3goLCxMAIAAgASgCACIANgIAIAAQ2woLnQEBBH8gAEG4swk2AgAgAEEIaiEBA0AgARDEAiACSwRAIAEgAhCdAygCAARAIAEgAhCdAygCABCRBQsgAkEBaiECDAELCyAAQZABahA1GiMAQRBrIgIkACACQQxqIAEQogIiASgCACIDKAIABEAgAxDfCiABKAIAGiABKAIAEJwDIAEoAgAiASgCACABEL8KGhC+CgsgAkEQaiQAIAALDwAgACAAKAIEQQFqNgIECwwAIAAgACgCABDACgt7AQN/IwBBEGsiBCQAIARBBGoiAiAANgIAIAIgACgCBCIDNgIEIAIgAyABQQJ0ajYCCCACIgMoAgQhASACKAIIIQIDQCABIAJGBEAgAygCACADKAIENgIEIARBEGokAAUgABCcAxogARDBCiADIAFBBGoiATYCBAwBCwsLIAAgAEGIvAk2AgAgACgCCBBmRwRAIAAoAggQmwsLIAALBABBfwumAQEDfyMAQRBrIgQkACMAQSBrIgMkACADQRhqIAAgARDGCiADQRBqIAMoAhggAygCHCACEKsLIAMoAhAhBSMAQRBrIgEkACABIAA2AgwgAUEMaiIAIAUgABD1BmtBAnUQ+wYhACABQRBqJAAgAyAANgIMIAMgAiADKAIUEKQDNgIIIARBCGogA0EMaiADQQhqEPsBIANBIGokACAEKAIMIARBEGokAAuBBgEKfyMAQRBrIhMkACACIAA2AgBBBEEAIAcbIRUgA0GABHEhFgNAIBRBBEYEQCANECVBAUsEQCATIA0Q3gE2AgwgAiATQQxqQQEQ+wYgDRDyAiACKAIAEOMKNgIACyADQbABcSIDQRBHBEAgASADQSBGBH8gAigCAAUgAAs2AgALIBNBEGokAAUCQAJAAkACQAJAAkAgCCAUai0AAA4FAAEDAgQFCyABIAIoAgA2AgAMBAsgASACKAIANgIAIAZBIBDRASEHIAIgAigCACIPQQRqNgIAIA8gBzYCAAwDCyANEPYBDQIgDUEAEJoFKAIAIQcgAiACKAIAIg9BBGo2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QQFqIQUgAUEBaiEBDAELCyADQQA6AAcgBSADQQdqENIBIANBEGokAAwBCxDKAQALCw8AIAAgACgCGCABajYCGAsXACAAIAI2AhwgACABNgIUIAAgATYCGAtXAQJ/AkAgACgCACICRQ0AAn8gAigCGCIDIAIoAhxGBEAgAiABIAIoAgAoAjQRAAAMAQsgAiADQQRqNgIYIAMgATYCACABC0F/EMgCRQ0AIABBADYCAAsLMQEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBBGo2AgwgASgCAAsnAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEoAgALJwEBfwJAIAAoAgAiAkUNACACIAEQvQtBfxDIAkUNACAAQQA2AgALC1MBA38CQEF/IAAoAkwQyAJFBEAgACgCTCEADAELIAAjAEEQayIBJAAgAUEMaiICIAAQUyACEMwBQSAQmwEhACACEFAgAUEQaiQAIAA2AkwLIADACxoAIAAgASABKAIAQQxrKAIAaigCGDYCACAACwsAIABB4JoLEKkCCw0AIAAgASACQQAQogcLCQAgABCSBxAYCz0BAX8gACgCGCICIAAoAhxGBEAgACABEKYDIAAoAgAoAjQRAAAPCyAAIAJBAWo2AhggAiABOgAAIAEQpgMLNAEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBAWo2AgwgASwAABCmAwsqAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEsAAAQpgMLDwAgACAAKAIAKAIYEQIACwgAIAAoAhBFCwQAQX8LLAAgACABEK4HIgFFBEAPCwJAIAMEQCAAIAEgAhCoBAwBCyAAIAEgAhC7CwsLCAAgABCLBxoLvg8CBX8PfiMAQdACayIFJAAgBEL///////8/gyEKIAJC////////P4MhCyACIASFQoCAgICAgICAgH+DIQwgBEIwiKdB//8BcSEIAkACQCACQjCIp0H//wFxIglB//8Ba0GCgH5PBEAgCEH//wFrQYGAfksNAQsgAVAgAkL///////////8AgyINQoCAgICAgMD//wBUIA1CgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhDAwCCyADUCAEQv///////////wCDIgJC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dGpBADYCAAsgDEUEQEEAIQwMAQsgBCAMakEAOgAACyACIQALIAMoAgQgAygCLGusIAMpA3ggFXx8IRUgDiAIQQBHaiEOCyABQQFqIQQgAS0AASIBDQEMCAsLIAIhAAwBC0EBIQVBACEMQQAhAAwCCyAPIQUMAgsgDyEFCyAOQX8gDhshDgsgBUUNASAMEBggABAYDAELQX8hDgsgBkGwAmokACADQZABaiQAIA4LQwACQCAARQ0AAkACQAJAAkAgAUECag4GAAECAgQDBAsgACACPAAADwsgACACPQEADwsgACACPgIADwsgACACNwMACwsPACAAIAEgAkEAQQAQmQcLFQEBfxDtAyEAQQ9B0N0KKAIAIAAbC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRBAALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC28BBX8gACgCACIDLAAAQTBrIgFBCUsEQEEADwsDQEF/IQQgAkHMmbPmAE0EQEF/IAEgAkEKbCIFaiABIAVB/////wdzSxshBAsgACADQQFqIgU2AgAgAywAASAEIQIgBSEDQTBrIgFBCkkNAAsgAgv1EgISfwJ+IwBBQGoiCCQAIAggATYCPCAIQSdqIRYgCEEoaiERAkACQAJAAkADQEEAIQcDQCABIQ0gByAOQf////8Hc0oNAiAHIA5qIQ4CQAJAAkACQCABIgctAAAiCwRAA0ACQAJAIAtB/wFxIgFFBEAgByEBDAELIAFBJUcNASAHIQsDQCALLQABQSVHBEAgCyEBDAILIAdBAWohByALLQACIAtBAmoiASELQSVGDQALCyAHIA1rIgcgDkH/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KQOIAyAWIAJBAE4iARshFiAEKQOAAyAXIAEbIRcgCSAGIAhHIAJBAEhycSAVIBhCAEIAEKgDQQBHcUUgFCABIA1qIg1B7gBqTnENAEH8gAtBxAA2AgALIARB8AJqIBcgFiANENoLIAQpA/gCIRUgBCkD8AILIRYgDiAVNwMoIA4gFjcDICAEQZDGAGokACAOKQMoIRUgDikDICEWDAELQgAhFQsgACAWNwMAIAAgFTcDCCAOQTBqJAALwwYCBH8DfiMAQYABayIFJAACQAJAAkAgAyAEQgBCABCoA0UNAAJ/IARC////////P4MhCgJ/IARCMIinQf//AXEiB0H//wFHBEBBBCAHDQEaQQJBAyADIAqEUBsMAgsgAyAKhFALC0UNACACQjCIpyIIQf//AXEiBkH//wFHDQELIAVBEGogASACIAMgBBBpIAUgBSkDECICIAUpAxgiASACIAEQxQsgBSkDCCECIAUpAwAhBAwBCyABIAJC////////////AIMiCiADIARC////////////AIMiCRCoA0EATARAIAEgCiADIAkQqAMEQCABIQQMAgsgBUHwAGogASACQgBCABBpIAUpA3ghAiAFKQNwIQQMAQsgBEIwiKdB//8BcSEHIAYEfiABBSAFQeAAaiABIApCAEKAgICAgIDAu8AAEGkgBSkDaCIKQjCIp0H4AGshBiAFKQNgCyEEIAdFBEAgBUHQAGogAyAJQgBCgICAgICAwLvAABBpIAUpA1giCUIwiKdB+ABrIQcgBSkDUCEDCyAJQv///////z+DQoCAgICAgMAAhCELIApC////////P4NCgICAgICAwACEIQogBiAHSgRAA0ACfiAKIAt9IAMgBFatfSIJQgBZBEAgCSAEIAN9IgSEUARAIAVBIGogASACQgBCABBpIAUpAyghAiAFKQMgIQQMBQsgCUIBhiAEQj+IhAwBCyAKQgGGIARCP4iECyEKIARCAYYhBCAGQQFrIgYgB0oNAAsgByEGCwJAIAogC30gAyAEVq19IglCAFMEQCAKIQkMAQsgCSAEIAN9IgSEQgBSDQAgBUEwaiABIAJCAEIAEGkgBSkDOCECIAUpAzAhBAwBCyAJQv///////z9YBEADQCAEQj+IIAZBAWshBiAEQgGGIQQgCUIBhoQiCUKAgICAgIDAAFQNAAsLIAhB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QfWrBCADQTBqEDMLIAAgAhAdIQIMAAsACyABQQFqIQdBASEEA0AgACgCECICKAK0ASAETgRAIAIoArgBIARBAnRqKAIAIQUgAQRAIAkgBSgCECICKwMooCEIIAogAisDIKAhCyAJIAIrAxigIQwgCiACKwMQoCENQezaCi0AAEECTwRAIAEQsAIgBRAhIQIgAyAIOQMgIAMgCzkDGCADIAw5AxAgAyANOQMIIAMgAjYCACAGQeOrBCADEDMgBSgCECECCyACIAg5AyggAiALOQMgIAIgDDkDGCACIA05AxALIAUgBxDzCyAEQQFqIQQMAQsLIANB4ABqJAALyhoDD38LfAF+IwBBwARrIgIkACAAKAJIIQpB7NoKLQAAQQJPBEAgARCwAiACIAAQITYCsANBiPYIKAIAQfDwAyACQbADahAgGgsgAUEBaiEJQQEhBANAIAAoAhAiAygCtAEgBEgEQAJAAkAgABA8IAdrIhBBACAAKAIQIgMoArQBayILRw0AIAMoAgwNACADQgA3AxAgA0KAgICAgICAmcAANwMoIANCgICAgICAgJnAADcDICADQgA3AxgMAQsCQAJ/AkAgAEEEQQQgAkGgBGoQ+QNBAk0EQCACQQM2ArAEDAELQQAgAigCsARBBEcNARpBACEJIAItALwEQQJxRQ0CIApBAEHwFkEAECIiCSAKQQFB8BZBABAiIgZyDQIgAiAAECE2AqADQcifAyACQaADahAqC0EACyEGQQAhCQsgAkHoA2pBAEE4EDgaIAJCADcD4AMgAkIANwPYAyACQgA3A9ADIAJCADcDyAMgAkIANwPAAyACQgA3A7gDQQEhBwNAAkAgACgCECIDKAK0ASAHSARAIBBBAEwNASAAEBwhBwNAIAdFDQIgBygCECIDKAKAAUUEQCADIAA2AoABIAJCADcDiAQgAkIANwOABCADKwNgIRIgAysDWCERIAIgAysDUDkDmAQgAiARIBKgOQOQBCACQegDakEgECYhAyACKALoAyADQQV0aiIDIAIpA4AENwMAIAMgAikDmAQ3AxggAyACKQOQBDcDECADIAIpA4gENwMIIAYEQCACIAcgBkEAQQAQYjYCzAMgAkG4A2pBBBAmIQMgAigCuAMgA0ECdGogAigCzAM2AgALIAIgBzYC5AMgAkHQA2pBBBAmIQMgAigC0AMg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EBwhAwNAIAMEQCADKAIQQQA2ArgBIAAgAxAdIQMMAQsLQezaCi0AAEECTwRAIAEoAhAhAyAFIAAQITYC5AEgBSADNgLgAUGI9ggoAgBBjfkDIAVB4AFqECAaCyABIAEoAhBBAWo2AhAgBUG88AkoAgA2AtwBQdKnASAFQdwBakEAEOMBIgpB4iVBmAJBARA2GkE4EFIhAyAKKAIQIAM2AowBIAAQOSEDIAooAhAgAygCEC8BsAE7AbABIAAgCkHa3AAQuQcgACAKQZjbABC5ByAAIApBsNgBELkHIAVBqAJqIQggBUGgAmohDCAFQZgCaiELQQEhDwNAIAAoAhAiAygCtAEgD04EQCADKAK4ASAPQQJ0aigCACIEEJQEIAogBBAhELgHIgYoAhAiAyAJNgKIASADIAQ2AugBAkACQCABKAIEIgdFBEBE////////738hG0T////////v/yEaDAELRP///////+9/IRtE////////7/8hGiAEIAcQRSIDLQAARQ0AIAEoAgAgBEcEQCADIAQoAkQgBxBFEE1FDQELIAVBADoA+AEgBSALNgLEASAFIAw2AsgBIAUgCDYCzAEgBSAFQfgBajYC0AEgBSAFQZACajYCwAEgA0H4vgEgBUHAAWoQUUEETgRAIAUrA6gCIRogBSsDoAIhHSAFKwOYAiEbIAUrA5ACIRxBgNsKKwMAIh5EAAAAAAAAAABkBEAgGyAeoyEbIBwgHqMhHCAdIB6jIR0gGiAeoyEaCyAGKAIQQQNBAkEBIAUtAPgBIgNBP0YbIANBIUYbOgCHAQwCCyAEECEhByAFIAM2ArQBIAUgBzYCsAFBh+sDIAVBsAFqECoLRP///////+//IR1E////////738hHAsgCUEBaiEJIAQQHCEDA0AgAwRAIAMoAhAgBjYCuAEgBCADEB0hAwwBCwsgBigCECIDLQCHAQRAIAMoApQBIgMgGiAboEQAAAAAAADgP6I5AwggAyAdIBygRAAAAAAAAOA/ojkDAAsgD0EBaiEPDAELCyAAEBwhAwJ/AkADQCADBEACQCADKAIQIgQoArgBDQACQCAEKALoASIGRQ0AIAYgACgCECgCjAEoAjBGDQAgAxAhIQEgABAhIQAgBSADKAIQKALoARAhNgKoASAFIAA2AqQBIAUgATYCoAFBiv0EIAVBoAFqEDcM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QRhqCyILKwMIIQggCysDACEHAn8gASgCECIAKAIEIAFGBEAgACgCAAwBCyABQRhqCyIAKwMIIQkgACsDACEKIAJBfyAHIAShIgcgBSADoaIgCCADoSIFIAYgBKGioSIGRAAAAAAAAAAAZCAGRAAAAAAAAAAAYxsiADYCACACQX8gByAJIAOhoiAFIAogBKGioSIDRAAAAAAAAAAAZCADRAAAAAAAAAAAYxsiATYCBCACIAAgAWw2AggLTQECfAJ/QQEgACgCACIAKwMAIgIgASgCACIBKwMAIgNkDQAaQX8gAiADYw0AGkEBIAArAwgiAiABKwMIIgNkDQAaQX9BACACIANjGwsLzg8DEH8KfAF+IwBBsAFrIgIkACABQQAgAUEAShshDyABQSgQGiENA0AgAyAPRkUEQCAAIANBAnRqKAIAKAIEIApqIQogA0EBaiEDDAELCyAKQRgQGiIOQRhrIQYDQCAIIA9HBEAgDSAIQShsaiIEIA4gB0EYbGo2AgAgACAIQQJ0aigCACILKAIEIQxBACEDRP///////+9/IRJE////////7/8hE0T////////v/yEVRP///////+9/IRQDQCADIAxGBEAgBCATOQMgIAQgFTkDGCAEIBI5AxAgBCAUOQMIIAQgBiAHQRhsajYCBCAIQQFqIQgMAwUgCygCACADQQR0aiIFKwMAIRYgBSsDCCEXIA4gB0EYbGoiBUEANgIUIAUgBDYCECAFIBc5AwggBSAWOQMAIANBAWohAyAHQQFqIQcgEyAXECMhEyAVIBYQIyEVIBIgFxApIRIgFCAWECkhFAwBCwALAAsLIAJCADcDiAEgAkIANwOAASACQgA3A3hBACEDIApBBBAaIQwCQANAIAMgCkYEQAJAIAwgCkEEQeADELUBIAJBjAFqIRBBACELA0AgCiALRg0BIAIgDCALQQJ0aiIRKAIAIgM2AnQgAgJ/IAMoAhAiBCgCACADRgRAIAQoAgQMAQsgA0EYawsiBTYCcEEAIQgDQAJAAkAgCEECRwRAAkAgAkH0AGogAkHwAGoQzQxBAWoOAwADAgMLIAVBGGohB0EAIQMDQAJAIAIoAoABIANLBEAgAiACKQOAATcDWCACIAIpA3g3A1AgAigCeCACQdAAaiADEBlBAnRqKAIAIgYgBSACQZQBaiIJEMwMIAIoApwBIgRBAEoNAQJAIARBAEgEQCAFIAYgCRDMDCACKAKcASIEQQBKDQMgBiAFIAJBqAFqIAJBoAFqIARBAEgEf0EDBSAFIAYgAigClAEiBCAEQR91IgRzIARrEMwCCxDLDA0BDAMLIAYgBSACQagBaiACQaABagJ/IAIoApQBIgQgAigCmAFGBEAgBiAFQQAQzAIiBCAGIAVBARDMAiIJIAQgCUobQQF0DAELIAYgBSAEIARBH3UiCXMgCWsQzAILEMsMRQ0CCyAGKwMAIRUCfyAGKAIQIgQoAgQgBkYEQCAEKAIADAELIAZBGGoLIgkrAwAhFCAHIQQgBisDCCEYIAIrA6ABIRIgAisDqAEhEyAFKwMIIRkgCSsDCCEaIAUoAhAiCSgCBCAFRgRAIAkoAgAhBAsgBCsDCCEbAkAgFCAVYiIJIAUrAwAiFiAEKwMAIhdicSATIBVhIBIgGGFxIAlyRSATIBRiIBIgGmJycXINACATIBZhIBIgGWFxIBYgF2JyDQIgEyAXYg0AIBIgG2ENAgtB7NoKLQAAQQJJDQggAiASOQNIIAIgEzkDQEGI9ggoAgBB0KUEIAJBQGsQM0EBIAYQygxBAiAFEMoMDAgLIAIgBTYCjAEgAkH4AGpBBBAmIQMgAigCeCADQQJ0aiACKAKMATYCACAFIAU2AhQMBAsgA0EBaiEDDAALAAsgC0EBaiELDAMLIAUoAhQiA0UEQEEAIQVBv7AEQQAQNwwHCyACIAIpA4ABNwNoIAIgAzYCjAEgAiACKQN4NwNgIAJB4ABqIBAQ2wMiA0F/RwRAAkACQAJAIAIoAogBIgQOAgIAAQsgAigCeCADQQJ0aigCABAYDAELIAIoAnggA0ECdGooAgAgBBEBAAsgAkH4AGogAxCkBAsgBUEANgIUCyACAn8gESgCACIFIAUoAhAiAygCBEYEQCADKAIADAELIAVBGGoLNgJwIAhBAWohCAwACwALAAsFIAwgA0ECdGogDiADQRhsajYCACADQQFqIQMMAQsLQQAhAwNAIAMgAigCgAFPRQRAIAIgAikDgAE3AwggAiACKQN4NwMAIAIgAxAZIQQCQAJAAkAgAigCiAEiBw4CAgABCyACKAJ4IARBAnRqKAIAEBgMAQsgAigCeCAEQQJ0aigCACAHEQEACyADQQFqIQMMAQsLIAJB+ABqIgRBBBAxIAQQNCAMEBhBACEFIAogC0cNAEEAIQNBASEFA0AgAyAPRg0BIAIgACADQQJ0aigCACIKKAIAIgQpAwg3A4ABIAIgBCkDADcDeCANIANBKGxqIQcgA0EBaiIEIQMDQCABIANGBEAgBCEDDAILIAAgA0ECdGooAgAhCAJAAkACQCAHKwMIIhMgDSADQShsaiIGKwMYIhVlIgtFIBMgBisDCCISZkVyDQAgBysDECIUIAYrAyAiFmVFDQAgFCAGKwMQIhdmRQ0AIAcrAxgiFCAVZUUgEiAUZUVyDQAgBysDICIUIBZlRSAUIBdmRXINACAIKQIAIRwgAiACKQOAATcDMCACIBw3AzggAiACKQN4NwMoIAJBOGogAkEoahC1BEUNAQwCCyASIBNmRQ0AIBIgBysDGCITZUUNACATIBVmRSAGKwMQIhIgBysDICIUZUUgC0Vycg0AIBIgBysDECITZkUNACAGKwMgIhIgFGVFIBIgE2ZFcg0AIAgoAgAhBiACIAopAgA3AyAgAiAGKQMINwMYIAIgBikDADcDECACQSBqIAJBEGoQtQQNAQsgA0EBaiEDDAELCwtBACEFCyANEBggDhAYIAJBsAFqJAAgBQs8AQF/IAAoAggQGCAAKAIMEBggACgCEBAYIAAoAhQQGCAAKAIYIgEEQCABKAIAEBggACgCGBAYCyAAEBgLhAgCDn8BfEEcEE8iBQRAIAFBACABQQBKGyELA0AgAyALRwRAIAAgA0ECdGooAgAoAgQgAmohAiADQQFqIQMMAQsLAkAgAkEASA0AIAUgAkEQEE4iDDYCCAJAIAFBAE4EQCAFIAFBAWpBBBBOIgo2AgwgBSACQQQQTiIHNgIQIAJBBBBOIQkgBSACNgIEIAUgCTYCFCAFIAE2AgACQCAKRQ0AIAJFDQIgDEUgB0VyDQAgCQ0CCyAJEBggBxAYIAoQGCAMEBgMAgtBr5gDQd63AUExQdTlABAAAAsDQAJAAkAgCyANRwRAIAogDUECdCIBaiAGNgIAIAAgAWooAgAiDigCBCIIQQBIDQEgBkEBayEPQQAhAiAIIQEgBiEDA0AgASACTA0DIAwgA0EEdGoiASAOKAIAIAJBBHRqIgQpAwA3AwAgASAEKQMINwMIIAcgA0ECdCIBaiADQQFqIgQ2AgAgASAJaiADQQFrNgIAIAJBAWohAiAOKAIEIQEgBCEDDAALAAsgCiALQQJ0aiAGNgIAQQAhBCMAQSBrIgMkAAJAIAUoAgQiAEEATgRAIABBAmoiCEEEEBohBiAAIABsQQgQGiEBIABBA3QhAgNAIAAgBEYEQANAIAAgCEcEQCAGIABBAnRqQQA2AgAgAEEBaiEADAELCyAFIAY2AhggBSgCBCICQQAgAkEAShshCyAFKAIUIQkgBSgCECEKIAUoAgghBEEAIQEDQCABIAtHBEAgBiABQQJ0IgBqKAIAIgwgACAJaigCACIAQQN0aiAEIAFBBHRqIggrAAAgBCAAQQR0aiIHKwAAoSIQIBCiIAgrAAggBysACKEiECAQoqCfIhA5AwAgAUEDdCINIAYgAEECdGooAgBqIBA5AwAgAUECayABQQFrIgcgACAHRhshAANAIABBAE4EQAJAIAEgACAEIAogCRDTDEUNACAAIAEgBCAKIAkQ0wxFDQAgAyAIKQMINwMYIAMgCCkDADcDECADIAQgAEEEdGoiBykDCDcDCCADIAcpAwA3AwAgA0EQaiADIAIgAiACIAQgChDOB0UNACAMIABBA3RqIAgrAAAgBysAAKEiECAQoiAIKwAIIAcrAAihIhAgEKKgnyIQOQMAIAYgAEECdGooAgAgDWogEDkDAAsgAEEBayEADAELCyABQQFqIQEMAQsLIANBIGokAAwDBSAGIARBAnRqIAE2AgAgBEEBaiEEIAEgAmohAQwBCwALAAtBhJoDQYm3AUEeQZoQEAAACyAFDwtBuMsBQd63AUHJAEHU5QAQAAALIAcgCCAPaiIBQQJ0aiAGNgIAIAkgBkECdGogATYCACANQQFqIQ0gAyEGDAALAAsgBRAYC0EAC/oIAwp/C3wBfiMAQfAAayIDJAAgACgCFCEMIAAoAhAhCiAAKAIIIQcgACgCBCIIQQJqQQgQGiEJAkAgAUHSbkcNACADIAIpAwg3A2AgAyACKQMANwNYA0AgBCIBIAAoAgBOBEBBqXchAQwCCyADIAAoAgggACgCDCIFIAFBAnRqKAIAIgZBBHRqNgJoIAUgAUEBaiIEQQJ0aigCACEFIAMgAykDYDcDSCADIAUgBms2AmwgAyADKQNYNwNAIAMgAykCaDcDUCADQdAAaiADQUBrELUERQ0ACwtBACEEIAgiBSEGIAFBAE4EQCAAKAIMIAFBAnRqIgAoAgQhBiAAKAIAIQULIAVBACAFQQBKGyELIAIrAwAhEyACKwMIIRQDQAJ8AkACQCAEIAtGBEAgBSAGIAUgBkobIQAgBSEEDAELIAMgByAEQQR0aiIAKQMINwNgIAMgACkDADcDWCAUIAMrA2AiDaEiECAHIAogBEECdCIBaigCAEEEdGoiACsAACADKwNYIg+hIhWiIAArAAggDaEiFiATIA+hIhGioSIORC1DHOviNho/ZCAORC1DHOviNhq/Y0VyIQAgFCAHIAEgDGooAgBBBHRqIgErAAgiDqEgDyABKwAAIhKhoiANIA6hIBMgEqGioSIXRC1DHOviNho/ZCAXRC1DHOviNhq/Y0VyIQECQCAOIA2hIBWiIBYgEiAPoaKhRC1DHOviNho/ZARAIAAgAXENAQwDCyAAIAFyRQ0CCyADIAIpAwg3AzggAikDACEYIAMgAykDYDcDKCADIBg3AzAgAyADKQNYNwMgIANBMGogA0EgaiAFIAYgCCAHIAoQzgdFDQEgESARoiAQIBCioJ8MAgsDQCAAIARGRQRAIAkgBEEDdGpCADcDACAEQQFqIQQMAQsLIAYgCCAGIAhKGyELIAYhBANAIAkgBEEDdGoCfAJAIAQgC0cEQCADIAcgBEEEdGoiACkDCDcDYCADIAApAwA3A1ggFCADKwNgIg2hIhAgByAKIARBAnQiAWooAgBBBHRqIgArAAAgAysDWCIPoSIVoiAAKwAIIA2hIhYgEyAPoSIRoqEiDkQtQxzr4jYaP2QgDkQtQxzr4jYav2NFciEAIBQgByABIAxqKAIAQQR0aiIBKwAIIg6hIA8gASsAACISoaIgDSAOoSATIBKhoqEiF0QtQxzr4jYaP2QgF0QtQxzr4jYav2NFciEBAkAgDiANoSAVoiAWIBIgD6GioUQtQxzr4jYaP2QEQCAAIAFxDQEMAwsgACABckUNAgsgAyACKQMINwMYIAIpAwAhGCADIAMpA2A3AwggAyAYNwMQIAMgAykDWDcDACADQRBqIAMgBSAGIAggByAKEM4HRQ0BIBEgEaIgECAQoqCfDAILIAkgCEEDdGoiAEIANwMAIABCADcDCCADQfAAaiQAIAkPC0QAAAAAAAAAAAs5AwAgBEEBaiEEDAALAAtEAAAAAAAAAAALIQ0gCSAEQQN0aiANOQMAIARBAWohBAwACwALXgEBfwJAIAJFDQAgACABIAIoAggQ0gxBCCEDAkACQAJAIAEoAgBBA3FBAWsOAwABAwILQRQhAwwBC0EgIQMLIAIoAgAgA2ooAgAiA0UNACAAIAEgAigCBCADEQUACwvxAQIHfAJ/IAIgAUEEdGoiASsACCIFIAIgAEEEdGoiDCsACCIHoSACIAMgAEECdCINaigCAEEEdGoiACsAACAMKwAAIgihIgqiIAArAAggB6EiCyABKwAAIgkgCKGioSIGRC1DHOviNho/ZCAGRC1DHOviNhq/Y0VyIQAgBSACIAQgDWooAgBBBHRqIgErAAgiBaEgCCABKwAAIgahoiAHIAWhIAkgBqGioSIJRC1DHOviNho/ZCAJRC1DHOviNhq/Y0VyIQEgBSAHoSAKoiALIAYgCKGioUQtQxzr4jYaP2QEfyAAIAFxBSAAIAFyC0EBcQuSAQECfyAAKAIARQRAIABB5P4KKAIAQQQQGiIBNgIAIAAgAUHk/gooAgBBAnRqNgIEC0EAIQEDQEHk/gooAgAiAiABTQRAIAAoAgAgAkEEQd8DELUBIAAgACgCADYCSAUgACgCACABQQJ0akGY/wooAgAgAUHgAGxqIgJBCGo2AgAgAkIANwNYIAFBAWohAQwBCwsLNwECfyMAQSBrIgMkACAAEDxBAk4EQCAAIAEgA0EIaiIBENgMIAAgARDwAyECCyADQSBqJAAgAgvmAgIGfwR8IAAQ1AwgACgCBCEFIAAoAgAhAANAAkAgBSAAIgFLBEAgAEEEaiIAIAVPDQIgASgCACIDKwMAIgcgASgCBCICKwMAYg0CIAMrAwgiCCACKwMIYg0CIAFBCGohA0ECIQICQANAIAMgBU8NASADKAIAIgQrAwghCSAEKwMAIgogB2IgCCAJYnJFBEAgA0EEaiEDIAJBAWohAgwBCwsgCCAJYg0AIAogB6EgArijIQdBASEBA0AgACADTw0DIAAoAgAiAiABuCAHoiACKwMAoDkDACAAQQRqIQAgAUEBaiEBDAALAAtBmP8KKAIAIQIDQCAAIANPDQIgACgCACIEIAEoAgAiBisDACACIAYoAhBB4ABsaiIGKwM4IAYrAyihIAIgBCgCEEHgAGxqIgQrAzggBCsDKKGgRAAAAAAAAOA/oqA5AwAgAEEEaiEAIAFBBGohAQwACwALDwsgAyEADAALAAtUAQJ/An8DQAJAQZj/CigCACEAQeT+CigCACABTQRAIAANAUEADAMFIAAgAUHgAGxqKAJMEBggAUEBaiEBDAILAAsLIAAoAlgQGEGY/wooAgALEBgLvQMCB38BfiMAQTBrIgUkAEHAlgEhCAJAAkAgAUUNACABLQAARQ0AQezJCCEEA0ACQAJAIAQoAgQiA0UEQEGsywghBAwBCyABIAMQLkUgBCgCACIGQRBGBH8gASADIAMQQBCAAgVBAQtFckUNASAEKAIIIgdFBEAgBSADNgIgQaa6BCAFQSBqECogAkHZ9QA2AgQgAkEBNgIAQezJCCEEDAELIAIgBzYCBCACIAY2AgAgBkEQRw0AIAQoAgQQQCABaiMAQRBrIgMkACADIANBDGo2AgBBwbIBIAMQUSEGIAJB6AdB6AcgAygCDCIHIAdBAEgbIAZBAEwbNgIIIAIgACAAQQBBqf8AQQAQIkQAAAAAAAAQwEQAAAAgX6ACwhBMOQMQIANBEGokAAsgBCgCBA0DAkAgARBoIgAgAUEBENgGRwRAIAUgATYCEEH8rgQgBUEQahAqDAELIAANAwtB2fUAIQhBASEJDAILIARBDGohBAwACwALIAIgCDYCBCACIAk2AgALQezaCi0AAARAIAIpAgQhCiAFIAIrAxA5AwggBSAKNwMAQYj2CCgCAEG6pAQgBRAzCyAFQTBqJAALGgAgACAAQdrcABAnIgBB8f8EIAAbIAEQ2AwLnQQCBX8HfCMAQRBrIgMkAAJAAkAgAEHsiAEQJyIBRQ0AIAEtAABFDQAgASADQQxqEOEBIQYgASADKAIMRgRARAAAAAAAAAAAIQYgARBoRQ0BCwNAIAZEAAAAAACAZkBkBEAgBkQAAAAAAIB2wKAhBgwBBQNAIAZEAAAAAACAZsBlBEAgBkQAAAAAAIB2QKAhBgwBCwsgBkQAAAAAAIBmQKMgABAcKAIQKAKUASIBKwMIIQYgASsDACEIIAAQHCEBA0AgAQRAIAEoAhAoApQBIgIgAisDACAIoTkDACACIAIrAwggBqE5AwggACABEB0hAQwBCwsgCEQAAAAAAAAAAGIgBkQAAAAAAAAAAGJyIQJEGC1EVPshCUCiIAAQHCEBA0AgAUUNBCAAIAEQLCIERQRAIAAgARAdIQEMAQsLIARBUEEAIAQoAgBBA3EiAUECRxtqKAIoKAIQKAKUASIFKwMIIARBMEEAIAFBA0cbaigCKCgCECgClAEiASsDCCIGoSAFKwMAIAErAwAiCKEQqAGhIgdEAAAAAAAAAABhDQMgBxBXIgmaIQogABAcIQEgBxBKIQcDQCABBEAgASgCECgClAEiAiAGIAIrAwAgCKEiCyAJoiAHIAIrAwggBqEiDKKgoDkDCCACIAggCyAHoiAMIAqioKA5AwAgACABEB0hAQwBBUEBIQIMBQsACwALAAsACwsgA0EQaiQAIAILJAAgAEUEQEGI1AFB6/sAQQxBnvcAEAAACyAAQbEIQQsQ6gFFC/0BAgR/AnxBnNsKLwEAIAAQPGxBCBAaIQYgABAcIQQgASsDCCEIIAErAwAhCQNAIAQEQCADBEAgBBAhENsMIAVqIQULIAYgBCgCECIBKAKIAUGc2wovAQBsQQN0aiIHIAErAyBEAAAAAAAA4D+iIAmgOQMAIAcgASsDKEQAAAAAAADgP6IgCKA5AwggACAEEB0hBAwBBQJAIANFIAVFcg0AQQAhASAFQQQQGiEFIAAQHCEEA0AgBARAIAQQIRDbDARAIAUgAUECdGogBCgCECgCiAE2AgAgAUEBaiEBCyAAIAQQHSEEDAEFIAMgBTYCACACIAE2AgALCwsLCyAGCyMBAX8gACgCCCIBBH8gAUEgQSQgAC0ADBtqBUHA/woLKAIAC2IBAX8CQCADRQ0AIAAgASACIAMoAggQ3gxBBCEEAkACQAJAIAEoAgBBA3FBAWsOAwABAwILQRAhBAwBC0EcIQQLIAMoAgAgBGooAgAiBEUNACAAIAEgAygCBCACIAQRBwALCyMBAn8gACgCACIBIAAoAgQiAjYCBCACIAE2AgAgAEF+NgIIC5MBAgJ/AXwgACgCBCIDQQBKBEACQCABKwMYQYD/CisDACIEoUGI/worAwAgBKGjIAO3oiIERAAAAAAAAAAAYw0AIAQgA0EBayICuGQNACAEmUQAAAAAAADgQWMEQCAEqiECDAELQYCAgIB4IQILIAAoAgwgAkoEQCAAIAI2AgwLIAIPC0G9N0H2ugFBIkHU2QAQAAALEwAgACABIAIgACgCTCgCKBDeDAv1BQIHfAJ/AkACQCAAKwMAIgNEAAAAAAAA8D9hBEAgAEEYQRwgACsDCCIDRAAAAAAAAAAAZiIIG2ooAgAhCQJAAnwgAEEcQRggCBtqKAIAIggEQCAIKwMIIgVBoP8KKwMAZA0FQaj/CisDACICIAVlBEAgCCsDACEEDAMLIAArAxAgAyACoqEMAQsgACsDECADQaj/CisDACICoqELIQQgAiEFCwJ8IAkEQCAJKwMIIgEgAmMNBEGg/worAwAiAiABZgRAIAkrAwAMAgsgACsDECADIAIiAaKhDAELIAArAxAgA0Gg/worAwAiAaKhCyEGIARBsP8KKwMAIgdkIgggBiAHZHENAkG4/worAwAiAiAEZCACIAZkcQ0CIAgEQCAAKwMQIAehIAOjIQUgByEECyACIARkBEAgACsDECACoSADoyEFIAIhBAsgBiAHZARAIAArAxAgB6EgA6MhASAHIQYLIAIgBmRFBEAgBiECDAILIAArAxAgAqEgA6MhAQwBCyAAKAIcIQkCQAJ8IAAoAhgiCARAIAgrAwAiBEGw/worAwBkDQRBuP8KKwMAIgEgBGUEQCAIKwMIIQUMAwsgACsDECADIAGioQwBCyAAKwMQIANBuP8KKwMAIgGioQshBSABIQQLAnwgCQRAIAkrAwAiAiABYw0DQbD/CisDACIBIAJmBEAgCSsDCAwCCyABIQIgACsDECADIAGioQwBCyAAKwMQIANBsP8KKwMAIgKioQshBiAFQaD/CisDACIHZCIIIAYgB2RxDQFBqP8KKwMAIgEgBWQgASAGZHENASAIBEAgByEFIAArAxAgB6EgA6MhBAsgASAFZARAIAEhBSAAKwMQIAGhIAOjIQQLIAYgB2QEQCAAKwMQIAehIAOjIQIgByEGCyABIAZkRQRAIAYhAQwBCyAAKwMQIAGhIAOjIQILIAAoAiAgBCAFEP4CIAAoAiAgAiABEP4CIAAoAiQgBCAFEP4CIAAoAiQgAiABEP4CCwvCAQEHfCACBEAgAkEoENcHIgIgATYCJCACIAA2AiAgAkIANwMYAnwgASsDACAAKwMAIgehIgOZIAErAwggACsDCCIIoSIEmWQEQCAEIAOjIQVEAAAAAAAA8D8hBiADDAELIAMgBKMhBkQAAAAAAADwPyEFIAQLIQkgAiAFOQMIIAIgBjkDACACIAMgA6IgBCAEoqBEAAAAAAAA4D+iIAcgA6IgCCAEoqCgIAmjOQMQIAIPC0Gf1AFBk7oBQRhBziMQAAALdwEDf0EIIQIDQCACIgNBAXYhAiADQQFxRQ0ACyADQQFGBEACf0EAIAAoAgQiBCABSQ0AGkEAIAQgACgCACICQQRqIgNqIAFrQXhxIgEgA0kNABogACABIAJrQQRrNgIEIAELDwtBnaIDQeG+AUHOAEHhswEQAAAL1wMCBX8EfCABQQAgAUEAShshBiABEM0CIQQgAisDCCEIIAIrAwAhCQNAIAMgBkYEQAJAIAFBAWshBUEAIQNEAAAAAAAAAAAhCANAIAMgBkcEQCADIAVqIAFvIQACQAJAIAQgA0EEdGoiAisDCCIJRAAAAAAAAAAAYg0AIAQgAEEEdGoiBysDCEQAAAAAAAAAAGINACACKwMAIAcrAwCiRAAAAAAAAAAAY0UNAQwECyAEIABBBHRqIgArAwgiCkQAAAAAAAAAAGUgCUQAAAAAAAAAAGZxRSAJRAAAAAAAAAAAZUUgCkQAAAAAAAAAAGZFcnENACACKwMAIAqiIAArAwAgCaKhIAogCaGjIgtEAAAAAAAAAABhDQMgC0QAAAAAAAAAAGRFDQAgCUQAAAAAAAAAAGIgCkQAAAAAAAAAAGJxRQRAIAhEAAAAAAAA4D+gIQgMAQsgCEQAAAAAAADwP6AhCAsgA0EBaiEDDAELCyAEEBgCfyAImUQAAAAAAADgQWMEQCAIqgwBC0GAgICAeAtBgYCAgHhxQQFGDwsFIAQgA0EEdCICaiIFIAAgAmoiAisDACAJoTkDACAFIAIrAwggCKE5AwggA0EBaiEDDAELCyAEEBhBAQtnAgJ/AnwgAUEAIAFBAEobIQQgARDNAiEBIAIrAwghBSACKwMAIQYDQCADIARGRQRAIAEgA0EEdGoiAiAAKwMAIAagOQMAIAIgACsDCCAFoDkDCCADQQFqIQMgAEEQaiEADAELCyABC4wBAgZ8AX9BASABIAFBAU0bIQogACsDACIEIQUgACsDCCIGIQdBASEBA0AgASAKRgRAIAIgBjkDCCACIAQ5AwAgAyAHOQMIIAMgBTkDAAUgAUEBaiEBIAArAxAhCCAHIAArAxgiCRAjIQcgBSAIECMhBSAGIAkQKSEGIAQgCBApIQQgAEEQaiEADAELCwtkAQF/AkAgAkUNACAAIAEgAigCCBDoDAJ/AkACQAJAIAEoAgBBA3FBAWsOAwECBAALIAIoAgAMAgsgAigCAEEMagwBCyACKAIAQRhqCygCACIDRQ0AIAAgASACKAIEIAMRBQALC3gCAX8CfAJAIAFBBEcNACAAKwMIIgMgACsDGCIEYQRAIAArAyggACsDOGINASAAKwMAIAArAzBiDQEgACsDECAAKwMgYQ8LIAArAwAgACsDEGINACAAKwMgIAArAzBiDQAgAyAAKwM4Yg0AIAQgACsDKGEhAgsgAgs7AQJ8IAArAwggASsDCCIDoSACKwMAIAErAwAiBKGiIAIrAwggA6EgACsDACAEoaKhRAAAAAAAAAAAZAsiACAAIAErAwAgAisDAKE5AwAgACABKwMIIAIrAwihOQMIC8wBAgN/AXwgAEEAQQAgAkEAENoHIgRDAACAPyABQQBBASACENMFIAQoAiQQ5gcgAEEAIABBAEobIQADQCAAIANGRQRAIANBAnQiBSAEKAIQaigCABDYBSEGIAEoAgAgBWogBrY4AgAgA0EBaiEDDAELC0EAIQMgBEMAAIA/IAFBAUEAIAIQ0wUgBCgCJBDmBwNAIAAgA0ZFBEAgA0ECdCICIAQoAhBqKAIAENgFIQYgASgCBCACaiAGtjgCACADQQFqIQMMAQsLIAQQ2QcL3QgDC38GfQF+IAAoAgggACgCBGohByAAKAIwIQogACgCLCELIAAoAighCAJAIAAoAhRBAEwEQCAHQQAgB0EAShshBgwBCyAHQQAgB0EAShshBgNAIAMgBkcEQCADQQJ0IgQgACgCEGooAgAgAiAEaioCALsQhw0gA0EBaiEDDAELCyAAKAIkEIkNQQAhAwNAIAMgBkYNASACIANBAnQiBGogACgCECAEaigCABDYBbY4AgAgA0EBaiEDDAALAAtBACEDA0ACQCAMQegHTg0AQQAhBCADQQFxDQADfyAEIAZGBH9DAAAAACEQQwAAAAAhD0EABSALIARBAnQiBWogAiAFaioCADgCACAFIAhqIgkgASAFaioCACIOIA6SIg44AgBBACEDA0AgAyAHRwRAIAkgA0ECdCINIAAoAgAgBWooAgBqKgIAQwAAAMCUIAIgDWoqAgCUIA6SIg44AgAgA0EBaiEDDAELCyAEQQFqIQQMAQsLIQQDQAJAIAQgBkcEQCAIIARBAnQiBWoqAgAhEUMAAAAAIQ5BACEDA0AgAyAHRg0CIANBAnQiCSAAKAIAIAVqKAIAaioCACISIBKSIAggCWoqAgCUIA6SIQ4gA0EBaiEDDAALAAsgEIwgD5VDAACAvyAPQwAAAABcGyEOQQAhAwNAIAMgBkcEQCACIANBAnQiBGoiBSAOIAQgCGoqAgCUIAUqAgCSOAIAIANBAWohAwwBCwtBACEDAkAgACgCFEEATA0AA0AgAyAGRwRAIANBAnQiBCAAKAIQaigCACACIARqKgIAuxCHDSADQQFqIQMMAQsLIAAoAiQQiQ1BACEDA0AgAyAGRg0BIAIgA0ECdCIEaiAAKAIQIARqKAIAENgFtjgCACADQQFqIQMMAAsAC0EAIQRBACEDA30gAyAGRgR9QwAAAAAhD0MAAAAABSAKIANBAnQiBWogAiAFaioCACAFIAtqKgIAkzgCACADQQFqIQMMAQsLIRADQAJAIAQgBkcEQCAKIARBAnQiBWoqAgAhESAFIAhqKgIAIRJDAAAAACEOQQAhAwNAIAMgB0YNAiADQQJ0IgkgACgCACAFaigCAGoqAgAiEyATkiAJIApqKgIAlCAOkiEOIANBAWohAwwACwALQwAAAAAhDkMAAIA/QwAAgD8gECAPlSAPu70iFEKAgICAgICAgIB/URsgFFAbIg9DAAAAAF4gD0MAAIA/XXEhBUEAIQMDQCADIAZHBEACQCAFRQRAIAIgA0ECdGoqAgAhEAwBCyACIANBAnQiBGogDyAEIApqKgIAlCAEIAtqKgIAkiIQOAIACyAOIBAgCyADQQJ0aioCAJOLkiEOIANBAWohAwwBCwsgDEEBaiEMIA67RC1DHOviNho/ZEUhAwwFCyAEQQFqIQQgDiARlCAPkiEPIBIgEZQgEJIhEAwACwALIARBAWohBCAPIA4gEZSTIQ8gESARlCAQkiEQDAALAAsLIAwL5QECCH8BfSABQQQQGiIEIAEgAWwiA0EEEBoiBTYCACADQwAAAAAgBRDyA0EBIAEgAUEBTBshA0EBIQIDfyACIANGBH8gAUEAIAFBAEobIQdBACEDA0AgAyAHRkUEQCAEIANBAnQiCGohCSADIQIDQCABIAJGRQRAIAJBAnQiBSAJKAIAaiAAIAZBAnRqKgIAIgo4AgAgBCAFaigCACAIaiAKOAIAIAZBAWohBiACQQFqIQIMAQsLIANBAWohAwwBCwsgBAUgBCACQQJ0aiAFIAEgAmxBAnRqNgIAIAJBAWohAgwBCwsLLQECfEF/IAIgACgCAEEDdGorAwAiAyACIAEoAgBBA3RqKwMAIgRkIAMgBGMbC14AQdz+CigCAEHg/gooAgByRQRAQeD+CiADNgIAQdz+CiACNgIAIAFBAk8EQCAAIAFBBEHaAxC1AQtB4P4KQQA2AgBB3P4KQQA2AgAPC0G1rgNBovsAQRxBwhsQAAALXgICfwJ8IAFBACABQQBKGyEBIANBA3QhAyACQQN0IQIDQCABIARGRQRAIAAgBEECdGooAgAiBSACaisDACADIAVqKwMAoSIHIAeiIAagIQYgBEEBaiEEDAELCyAGnwt3AQV/IAFBACABQQBKGyEFIAEgAWwQzwEhBiABEM8BIQQDfyADIAVGBH8DQCACIAVGRQRAIAIgACABIAQgAkECdGooAgAQuAQgAkEBaiECDAELCyAEBSAEIANBAnRqIAYgASADbEECdGo2AgAgA0EBaiEDDAELCwtlAQR/IAAoAgAiAyABQQJ0IgVqIgQoAgAhBiAEIAMgAkECdCIEaiIDKAIANgIAIAMgBjYCACAAKAIIIgMgACgCACIAIAVqKAIAQQJ0aiABNgIAIAMgACAEaigCAEECdGogAjYCAAurAQEEfwNAIAFBAXQiA0EBciEEAkAgACgCBCIFIANKBEAgAiAAKAIAIgYgA0ECdGooAgBBAnRqKgIAIAIgBiABQQJ0aigCAEECdGoqAgBdDQELIAEhAwsgBCAFSARAIAQgAyACIAAoAgAiBSAEQQJ0aigCAEECdGoqAgAgAiAFIANBAnRqKAIAQQJ0aioCAF0bIQMLIAEgA0cEQCAAIAMgARDzDCADIQEMAQsLC5oBAQZ/IAMgAUECdCIEaiIFKgIAIAJfRQRAIAAoAggiBiAEaiIHKAIAIQQgBSACOAIAIAAoAgAhBQNAAkAgBEEATA0AIAMgBSAEQQF2IgBBAnRqKAIAIghBAnQiCWoqAgAgAl5FDQAgBSAEQQJ0aiAINgIAIAYgCWogBDYCACAAIQQMAQsLIAUgBEECdGogATYCACAHIAQ2AgALCxQAQcDdCigCABpBwN0KQYEENgIAC2ABAX8gACgCBCIDBEAgASAAKAIAIgEoAgA2AgAgASABIAAoAgRBAnRqQQRrKAIAIgE2AgAgACgCCCABQQJ0akEANgIAIAAgACgCBEEBazYCBCAAQQAgAhD0DAsgA0EARwudAQEFfyADQQFrIgUQzwEhBiAAIAU2AgQgACAGNgIAIAAgAxDPASIHNgIIIANBACADQQBKGyEIQQAhAwNAIAQgCEZFBEAgASAERwRAIAYgA0ECdGogBDYCACAHIARBAnRqIAM2AgAgA0EBaiEDCyAEQQFqIQQMAQsLIAVBAm0hBANAIARBAEhFBEAgACAEIAIQ9AwgBEEBayEEDAELCwurAQEEfwNAIAFBAXQiA0EBciEEAkAgACgCBCIFIANKBEAgAiAAKAIAIgYgA0ECdGooAgBBAnRqKAIAIAIgBiABQQJ0aigCAEECdGooAgBIDQELIAEhAwsgBCAFSARAIAQgAyACIAAoAgAiBSAEQQJ0aigCAEECdGooAgAgAiAFIANBAnRqKAIAQQJ0aigCAEgbIQMLIAEgA0cEQCAAIAMgARDzDCADIQEMAQsLC9EGAgx/AnwgAUEAIAFBAEobIQkgAUEIEBohCiAAKAIIIQsDQAJAIAUgCUcEQCAAKAIQRQ0BQQEhBEEBIAAgBUEUbGoiBigCACIHIAdBAU0bIQdEAAAAAAAAAAAhEANAIAQgB0YEQCAKIAVBA3RqIBA5AwAMAwUgECAGKAIIIARBAnRqKgIAIAYoAhAgBGosAACylLugIRAgBEEBaiEEDAELAAsAC0EAIQQgAUEAIAFBAEobIQUDQCAEIAVHBEAgAiAEQQN0ahCmAUH0A2+3OQMAIARBAWohBAwBCwsgASACEM8CQQAhBEEAIQYDQCAEIAlHBEAgACAEQRRsaigCACAGaiEGIARBAWohBAwBCwtBACEFIAZBBBAaIQYDQCAFIAlHBEAgACAFQRRsaiIEIAY2AgggBiAEKAIAIgdBAWuzjDgCAEEBIQRBASAHIAdBAU0bIQgDQCAEIAhGBEAgBUEBaiEFIAYgB0ECdGohBgwDBSAGIARBAnRqQYCAgPwDNgIAIARBAWohBAwBCwALAAsLAn8gAUEIEBohBCABQQgQGiEFIAFBCBAaIQYgAUEIEBohByABQQgQGiEIIAEgCiABQQgQGiIMEJMCIAEgDBDPAiABIAIQzwIgACABIAIgBxCCDSABIAwgByAEENcFIAEgBCAFEJMCIANBACADQQBKGyEOIANBAWshDyABIAQgBBCqASEQQQAhAwNAAkACQAJAIAMgDkYNACABIAQQgA1E/Knx0k1iUD9kRQ0AIAAgASAFIAYQgg0gASAFIAYQqgEiEUQAAAAAAAAAAGENACABIAUgECARoyIRIAgQ7QEgASACIAggAhDWBSADIA9ODQIgASAGIBEgBhDtASABIAQgBiAEENcFIAEgBCAEEKoBIREgEEQAAAAAAAAAAGINAUHzgwRBABA3QQEhDQsgBBAYIAUQGCAGEBggBxAYIAgQGCAMEBggDQwDCyABIAUgESAQoyAFEO0BIAEgBCAFIAUQ1gUgESEQCyADQQFqIQMMAAsACyAAKAIIEBhBACEEA0AgBCAJRwRAIAAgBEEUbGoiAiALNgIIIARBAWohBCALIAIoAgBBAnRqIQsMAQsLIAoQGEEfdg8LIAVBAWohBQwACwAL9gICB38CfCADQQgQGiEHIANBCBAaIQggA0EIEBohCSADQQgQGiEKIANBCBAaIQsgAyACIANBCBAaIgIQkwIgBgRAIAMgAhDPAiADIAEQzwILIAAgAyABIAoQgQ0gAyACIAogBxDXBSADIAcgCBCTAkEAIQYgBUEAIAVBAEobIQwgBUEBayENIAMgByAHEKoBIQ9BACEFA0ACQAJAAkAgBSAMRg0AIAMgBxCADSAEZEUNACAAIAMgCCAJEIENIAMgCCAJEKoBIg5EAAAAAAAAAABhDQAgAyAIIA8gDqMiDiALEO0BIAMgASALIAEQ1gUgBSANTg0CIAMgCSAOIAkQ7QEgAyAHIAkgBxDXBSADIAcgBxCqASEOIA9EAAAAAAAAAABiDQFB84MEQQAQN0EBIQYLIAcQGCAIEBggCRAYIAoQGCALEBggAhAYIAYPCyADIAggDiAPoyAIEO0BIAMgByAIIAgQ1gUgDiEPCyAFQQFqIQUMAAsACzoBAn8gAEEAIABBAEobIQADQCAAIANGRQRAIAIgA0ECdCIEaiABIARqKgIAOAIAIANBAWohAwwBCwsLQwECfyAAQQAgAEEAShshBQNAIAQgBUZFBEAgAyAEQQJ0IgBqIAAgAWoqAgAgACACaioCAJI4AgAgBEEBaiEEDAELCwswAQF/IAAoAjwiAiABQQIgAigCABEDAEUEQA8LIAAoAkAiACABQQIgACgCABEDABoLiQECAn8BfCABQQAgAUEAShshBiACQQAgAkEAShshAgNARAAAAAAAAAAAIQdBACEBIAUgBkZFBEADQCABIAJGRQRAIAAgAUECdGooAgAgBUEDdGorAwAgAyABQQN0aisDAKIgB6AhByABQQFqIQEMAQsLIAQgBUEDdGogBzkDACAFQQFqIQUMAQsLC0YCAX8BfCAAQQAgAEEAShshAESaZH7FDhtRyiEDA0AgACACRkUEQCADIAEgAkEDdGorAwCZECMhAyACQQFqIQIMAQsLIAMLggECBH8BfCABQQAgAUEAShshBgNAIAQgBkZFBEAgACAEQQJ0aiEHRAAAAAAAAAAAIQhBACEFA0AgASAFRkUEQCAHKAIAIAVBAnRqKgIAuyACIAVBA3RqKwMAoiAIoCEIIAVBAWohBQwBCwsgAyAEQQN0aiAIOQMAIARBAWohBAwBCwsLkwECBX8BfCABQQAgAUEAShshBgNAIAQgBkcEQCAAIARBFGxqIgUoAgAhB0EAIQFEAAAAAAAAAAAhCQNAIAEgB0YEQCADIARBA3RqIAk5AwAgBEEBaiEEDAMFIAFBAnQiCCAFKAIIaioCALsgAiAFKAIEIAhqKAIAQQN0aisDAKIgCaAhCSABQQFqIQEMAQsACwALCwumAgIKfwF8IAIgA2xBFBAaIQUgBCACQQQQGiIGNgIAQQAhBCACQQAgAkEAShshBwNAIAQgB0YEQEEAIQIgA0EAIANBAEobIQUDQCACIAdGRQRAIAYgAkECdGohCCAAIAJBFGxqIgMoAgAhCSADKAIIIQogAygCBCELQQAhAwNAIAMgBUcEQCABIANBAnQiDGohDUEAIQREAAAAAAAAAAAhDwNAIAQgCUYEQCAIKAIAIAxqIA+2OAIAIANBAWohAwwDBSAKIARBAnQiDmoqAgC7IA0oAgAgCyAOaigCAEEDdGorAwCiIA+gIQ8gBEEBaiEEDAELAAsACwsgAkEBaiECDAELCwUgBiAEQQJ0aiAFNgIAIARBAWohBCAFIANBAnRqIQUMAQsLC4wBAgR/AXwgAUEAIAFBAEobIQYgAkEAIAJBAEobIQIDQCAFIAZGRQRAIAAgBUECdGohB0QAAAAAAAAAACEJQQAhAQNAIAEgAkZFBEAgAUEDdCIIIAcoAgBqKwMAIAMgCGorAwCiIAmgIQkgAUEBaiEBDAELCyAEIAVBA3RqIAk5AwAgBUEBaiEFDAELCwvTBgIMfwN8IAIgASABIAJKGyIJQQAgCUEAShshByABQQAgAUEAShshDiABQQFrIQggAUEebCEPIAFBCBAaIQwgAUEIEBohDSAJQQgQGiEKAkADQCAGIAdGDQEgAyAGQQJ0aigCACEFQQAhBANAQQAhAiAEIA5HBEAgBSAEQQN0ahCmAUHkAG+3OQMAIARBAWohBAwBCwNAIAIgBkZFBEAgBSAIIAEgAyACQQJ0aigCACIEIAUQqgGaIAQQuwQgAkEBaiECDAELC0EAIQQgBSAIEK0DIhBEu73X2d982z1jDQALIAEgBUQAAAAAAADwPyAQoyAFEO0BA0AgASAFIA0QkwIgACABIAEgBSAMEIQNIAEgDCAFEJMCQQAhAgNAIAIgBkYEQAJAIARBAWohCyAEIA9OIAUgCBCtAyIQRLu919nffNs9Y3INACABIAVEAAAAAAAA8D8gEKMgBRDtASALIQQgASAFIA0QqgEiEZlEK4cW2c737z9jDQMgCiAGQQN0aiAQIBGiOQMAIAZBAWohBgwECwUgBSAIIAEgAyACQQJ0aigCACILIAUQqgGaIAsQuwQgAkEBaiECDAELCwsLIAYhBwsgByAJIAcgCUobIQYDfyAGIAdGBH9BASAJIAlBAUwbQQFrIQdBACEGA0AgByAGIgBHBEAgCiAAIgRBA3RqIgUrAwAiESEQIARBAWoiBiECA0AgAiAJTgRAIAAgBEYNAyABIAMgAEECdGooAgAiACAMEJMCIAEgAyAEQQJ0aiICKAIAIAAQkwIgASAMIAIoAgAQkwIgCiAEQQN0aiAROQMAIAUgEDkDAAwDBSAKIAJBA3RqKwMAIhIgECAQIBJjIggbIRAgAiAEIAgbIQQgAkEBaiECDAELAAsACwsgChAYIAwQGCANEBggCyAPTAUgAyAHQQJ0aigCACEAQQAhAkEAIQQDQCAEIA5GRQRAIAAgBEEDdGoQpgFB5ABvtzkDACAEQQFqIQQMAQsLA0AgAiAHRkUEQCAAIAggASADIAJBAnRqKAIAIgQgABCqAZogBBC7BCACQQFqIQIMAQsLIAEgAEQAAAAAAADwPyAAIAgQrQOjIAAQ7QEgCiAHQQN0akIANwMAIAdBAWohBwwBCwsLdAEEfAJAIAErAwAhBSACKwMAIQYgAysDACEHIAAgBCsDACIIOQMYIAAgBzkDECAAIAY5AwggACAFOQMAAkAgBSAGZQRAIAcgCGVFDQEMAgtBwc4BQezYAEEnQeqaARAAAAtBrskBQezYAEEoQeqaARAAAAsLCQAgACABOQMICyYAIABFBEBB+TRBj9kAQdEAQdXdARAAAAsgACAAKAIAKAIMEQEACw8AIAAgACgCACgCABEBAAsdACAABEAgAEE0ahCBAhogAEEoahCBAhoLIAAQGAuVBAEFfyAAAn8gACgCBCIFIAAoAghJBEAgACgCBCIGIAEgAiADIAQQhg0gACAGQSBqNgIEIAVBIGoMAQsjAEEgayIJJAAgACgCBCAAKAIAa0EFdUEBaiIFQYCAgMAATwRAEMAEAAtB////PyAAKAIIIAAoAgBrIgZBBHUiByAFIAUgB0kbIAZB4P///wdPGyEGIAAoAgQgACgCAGtBBXUhCEEAIQcgCUEMaiIFIABBCGo2AhAgBUEANgIMIAYEQCAGQYCAgMAATwRAEOUHAAsgBkEFdBCJASEHCyAFIAc2AgAgBSAHIAhBBXRqIgg2AgggBSAHIAZBBXRqNgIMIAUgCDYCBCAFKAIIIAEgAiADIAQQhg0gBSAFKAIIQSBqNgIIIAUoAgQhBCAAKAIAIQEgACgCBCEDA0AgASADRwRAIARBIGsiBCADQSBrIgMpAwA3AwAgBCADKQMYNwMYIAQgAykDEDcDECAEIAMpAwg3AwgMAQsLIAUgBDYCBCAAKAIAIQEgACAENgIAIAUgATYCBCAAKAIEIQEgACAFKAIINgIEIAUgATYCCCAAKAIIIQEgACAFKAIMNgIIIAUgATYCDCAFIAUoAgQ2AgAgACgCBCAFKAIEIQIgBSgCCCEAA0AgACACRwRAIAUgAEEgayIANgIIDAELCyAFKAIAIgAEQCAFKAIMGiAAEBgLIAlBIGokAAs2AgQLhgQBBH9BMBCJASIFQYDSCjYCACMAQRBrIgYkACAFQQRqIgQgADYCECAEIAE2AgwgBEIANwIEIAQgBEEEajYCAEEAIQFB2P4KQQA2AgADfyAAIAFMBH8gBkEQaiQAIAQFIAZByAAQiQEgBCgCDCABQQJ0aigCABD5BzYCDCAGQQRqIAQgBkEMahD2AyABQQFqIQEgBCgCECEADAELCxogBSACNgIcIAUgAzYCGCAFQQA2AiwgBUIANwIkIAVB6NEKNgIAIAMgAkECdGoiACEBAkAgACADa0ECdSIGIAVBJGoiACgCCCAAKAIAIgJrQQJ1TQRAIAYgACgCBCIEIAJrIgdBAnVLBEAgAiAERwRAIAIgAyAHELYBGiAAKAIEIQQLIAEgAyAHaiICayEDIAEgAkcEQCAEIAIgAxC2ARoLIAAgAyAEajYCBAwCCyABIANrIQQgASADRwRAIAIgAyAEELYBGgsgACACIARqNgIEDAELIAAQoA0gACAGEO4HIgJBgICAgARPBEAQwAQACyAAIAIQqA0iBDYCBCAAIAQ2AgAgACAEIAJBAnRqNgIIIAEgA2shAiAAKAIEIQQgASADRwRAIAQgAyACELYBGgsgACACIARqNgIECyAFKAIoIQEgBSgCJCEAA38gACABRgR/IAUFIAAoAgBBADoAHCAAQQRqIQAMAQsLC7kCAQd/IwBBIGsiBiQAIAMgAGtBGG0hBAJAIAJBAkgNACACQQJrQQF2IgogBEgNACAAIARBAXQiCEEBciIFQRhsaiEEIAIgCEECaiIISgRAIARBGGoiByAEIAQgByABKAIAEQAAIgcbIQQgCCAFIAcbIQULIAQgAyABKAIAEQAADQAgBiADKAIANgIIIAYgAygCBDYCDCAGIAMoAgg2AhAgA0IANwIEIAYgAysDEDkDGCAGQQhqQQRyA0ACQCADIAQiAxCeASAFIApKDQAgACAFQQF0IgdBAXIiBUEYbGohBCACIAdBAmoiB0oEQCAEQRhqIgkgBCAEIAkgASgCABEAACIJGyEEIAcgBSAJGyEFCyAEIAZBCGogASgCABEAAEUNAQsLIAMgBkEIahCeARDZAQsgBkEgaiQAC/oCAQd/IwBBIGsiBCQAQQEhBwJAAkACQAJAAkACQCABIABrQRhtDgYFBQABAgMECyABQRhrIgEgACACKAIAEQAARQ0EIAAgARC4AQwECyAAIABBGGogAUEYayACENACDAMLIAAgAEEYaiAAQTBqIAFBGGsgAhDqBwwCCyAAIABBGGogAEEwaiAAQcgAaiABQRhrIAIQjw0MAQsgACAAQRhqIABBMGoiBiACENACIABByABqIQUgBEEIakEEciEJA0AgBSIDIAFGDQECQCADIAYgAigCABEAAARAIAQgAygCADYCCCAEIAMoAgQ2AgwgBCADKAIINgIQIANCADcCBCAEIAMrAxA5AxgDQAJAIAUgBiIFEJ4BIAAgBUYEQCAAIQUMAQsgBEEIaiAFQRhrIgYgAigCABEAAA0BCwsgBSAEQQhqEJ4BIAkQ2QEgCEEBaiIIQQhGDQELIANBGGohBSADIQYMAQsLIANBGGogAUYhBwsgBEEgaiQAIAcLagAgACABIAIgAyAFEOoHAkAgBCADIAUoAgARAABFDQAgAyAEELgBIAMgAiAFKAIAEQAARQ0AIAIgAxC4ASACIAEgBSgCABEAAEUNACABIAIQuAEgASAAIAUoAgARAABFDQAgACABELgBCwtOAQJ/IwBB0ABrIgIkACAAKAJAIgNBABD9BEGg8AlHBEAgA0Gg8AkQ/QQaCyACIAE3AwggACgCQCIAIAJBBCAAKAIAEQMAIAJB0ABqJAALvhABCX8jAEEQayINJAADQCABQcgAayEJIAFBMGshCCABQRhrIQsCQANAAkACQAJAAkACQCABIABrIgZBGG0iBw4GBgYAAQIDBAsgAUEYayIBIAAgAigCABEAAEUNBSAAIAEQuAEMBQsgACAAQRhqIAFBGGsgAhDQAgwECyAAIABBGGogAEEwaiABQRhrIAIQ6gcMAwsgACAAQRhqIABBMGogAEHIAGogAUEYayACEI8NDAILIAZBvwRMBEAgBEEBcQRAIAIhByMAQSBrIgUkAAJAIAEiBCAARg0AIAVBCGpBBHIhBiAAIQEDQCABIgNBGGoiASAERg0BIAEgAyAHKAIAEQAARQ0AIAUgAygCGDYCCCAFIAMoAhw2AgwgBSADKAIgNgIQIANCADcCHCAFIAMrAyg5AxggASECA0ACQCACIAMiAhCeASAAIAJGBEAgACECDAELIAVBCGogAkEYayIDIAcoAgARAAANAQsLIAIgBUEIahCeASAGENkBDAALAAsgBUEgaiQADAMLIAIhBCMAQSBrIgUkAAJAIAEiAyAARg0AIAVBCGpBBHIhBgNAIAAiAkEYaiIAIANGDQEgACACIAQoAgARAABFDQAgBSACKAIYNgIIIAUgAigCHDYCDCAFIAIoAiA2AhAgAkIANwIcIAUgAisDKDkDGCAAIQEDQCABIAIQngEgBUEIaiIHIAIiAUEYayICIAQoAgARAAANAAsgASAHEJ4BIAYQ2QEMAAsACyAFQSBqJAAMAgsgA0UEQCAAIAFHBH8gACABRgR/IAEFIAEgAGsiA0EYbSEEAkAgA0EZSA0AIARBAmtBAXYhAwNAIANBAEgNASAAIAIgBCAAIANBGGxqEI0NIANBAWshAwwACwALIAEgAGtBGG0hBCABIQMDQCABIANHBEAgAyAAIAIoAgARAAAEQCADIAAQuAEgACACIAQgABCNDQsgA0EYaiEDDAELCyABIABrQRhtIQMDQCADQQFKBEAgASEEQQAhBiMAQSBrIgwkACADQQJOBEAgDCAAKAIANgIIIAwgACgCBDYCDCAMIAAoAgg2AhAgAEIANwIEIAwgACsDEDkDGCAMQQhqIgtBBHIgACEBIANBAmtBAm0hCgNAIAZBAXQiCEEBciEHIAEgBkEYbGoiBkEYaiEFIAMgCEECaiIITAR/IAcFIAZBMGoiBiAFIAUgBiACKAIAEQAAIgYbIQUgCCAHIAYbCyEGIAEgBRCeASAFIQEgBiAKTA0ACwJAIARBGGsiByAFRgRAIAUgCxCeAQwBCyABIAcQngEgByAMQQhqEJ4BIAFBGGoiASEKIwBBIGsiCyQAAkAgASAAIgdrQRhtIgFBAkgNACAAIAFBAmtBAXYiCEEYbGoiASAKQRhrIgYgAigCABEAAEUNACALIAYoAgA2AgggCyAKQRRrIgUoAgA2AgwgCyAKQRBrKAIANgIQIAVCADcCACALIApBCGsrAwA5AxggC0EIakEEcgNAAkAgBiABIgYQngEgCEUNACAHIAhBAWtBAXYiCEEYbGoiASALQQhqIAIoAgARAAANAQsLIAYgC0EIahCeARDZAQsgC0EgaiQACxDZAQsgDEEgaiQAIANBAWshAyAEQRhrIQEMAQsLQQALBSABCxoMAgsgACAHQQF2QRhsIgVqIQoCQCAGQYEYTwRAIAAgCiALIAIQ0AIgAEEYaiIHIApBGGsiBiAIIAIQ0AIgAEEwaiAFIAdqIgcgCSACENACIAYgCiAHIAIQ0AIgACAKELgBDAELIAogACALIAIQ0AILIANBAWshAwJAIARBAXEiCg0AIABBGGsgACACKAIAEQAADQBBACEEIwBBIGsiBSQAIAUgACgCADYCCCAFIAAoAgQ2AgwgBSAAKAIINgIQIABCADcCBCAFIAArAxA5AxgCQCAFQQhqIAEiBkEYayACKAIAEQAABEAgACEHA0AgBUEIaiAHQRhqIgcgAigCABEAAEUNAAsMAQsgACEHA0AgB0EYaiIHIAZPDQEgBUEIaiAHIAIoAgARAABFDQALCyAGIAdLBEADQCAFQQhqIAZBGGsiBiACKAIAEQAADQALCwNAIAYgB0sEQCAHIAYQuAEDQCAFQQhqIAdBGGoiByACKAIAEQAARQ0ACwNAIAVBCGogBkEYayIGIAIoAgARAAANAAsMAQsLIAdBGGsiBiAARwRAIAAgBhCeAQsgBiAFQQhqIgAQngEgAEEEchDZASAFQSBqJAAgByEADAELCyABIQYjAEEgayIJJAAgCSAAKAIANgIIIAkgACgCBDYCDCAJIAAoAgg2AhAgAEIANwIEIAkgACsDEDkDGCAAIQcDQCAHIgVBGGoiByAJQQhqIAIoAgARAAANAAsCQCAAIAVGBEADQCAGIAdNDQIgBkEYayIGIAlBCGogAigCABEAAEUNAAwCCwALA0AgBkEYayIGIAlBCGogAigCABEAAEUNAAsLIAYhBSAHIQgDQCAFIAhLBEAgCCAFELgBA0AgCEEYaiIIIAlBCGogAigCABEAAA0ACwNAIAVBGGsiBSAJQQhqIAIoAgARAABFDQALDAELCyAIQRhrIgggAEcEQCAAIAgQngELIAggCUEIaiIFEJ4BIA0gBiAHTToADCANIAg2AgggBUEEchDZASAJQSBqJAAgDSgCCCEGAkAgDS0ADEEBRw0AIAAgBiACEI4NIQUgBkEYaiIHIAEgAhCODQRAIAYhASAFRQ0DDAILIAVFDQAgByEADAILIAAgBiACIAMgChCRDSAGQRhqIQBBACEEDAELCyANQRBqJAALDQAgAEGs0go2AgAgAAt4AgJ/AnwCQCAAKAIEIgNFBEAgAEEEaiIAIQIMAQsgAigCACIEKwMIIQUDQCAFIAMiACgCECICKwMIIgZjRSACIARNIAUgBmRycUUEQCAAIQIgACgCACIDDQEMAgsgACgCBCIDDQALIABBBGohAgsgASAANgIAIAILdQEDfyAAIAAoAgQiAzYCCCADBEACQCADKAIIIgFFBEBBACEBDAELAkAgAyABKAIAIgJGBEAgAUEANgIAIAEoAgQiAg0BDAILIAFBADYCBCACRQ0BCwNAIAIiASgCACICDQAgASgCBCICDQALCyAAIAE2AgQLCxsBAX8gACgCACEBIABBADYCACABBEAgARAYCwtDAQJ/IAAoAgQhAgNAIAAoAggiASACRwRAIAAgAUEYazYCCCABQRRrENkBDAELCyAAKAIAIgEEQCAAKAIMGiABEBgLC80CAQR/IAAoAgQhAyAAKAIAIQUgASgCBCEEIwBBIGsiAiQAIAIgBDYCHCACIAQ2AhggAkEAOgAUIAIgAEEIajYCCCACIAJBHGo2AhAgAiACQRhqNgIMA0AgAyAFRwRAIARBGGsiBCADQRhrIgMoAgA2AgAgBCADKAIENgIEIAQgAygCCDYCCCADQgA3AgQgBCADKwMQOQMQIAIgAigCHEEYayIENgIcDAELCyACQQE6ABQgAi0AFEUEQCACKAIIGiACKAIQKAIAIQMgAigCDCgCACEFA0AgAyAFRwRAIANBBGoQ2QEgA0EYaiEDDAELCwsgAkEgaiQAIAEgBDYCBCAAKAIAIQIgACAENgIAIAEgAjYCBCAAKAIEIQIgACABKAIINgIEIAEgAjYCCCAAKAIIIQIgACABKAIMNgIIIAEgAjYCDCABIAEoAgQ2AgALXQEBfyAAIAM2AhAgAEEANgIMIAEEQCABQavVqtUATwRAEOUHAAsgAUEYbBCJASEECyAAIAQ2AgAgACAEIAJBGGxqIgI2AgggACAEIAFBGGxqNgIMIAAgAjYCBCAAC6MBAgF/AXxBwAAQiQEiBEIANwIEIARBrNIKNgIAIAEoAgAhASADKwMAIQUgBEIANwIsIAQgBTkDGCAEIAI2AhQgBCABNgIQIARCADcCOCAEIARBLGo2AiggBCAEQThqNgI0IARCADcDICACKwMIIAIrAwChRKVcw/EpYz1IY0UEQEGHkgNB7NgAQTlB+58BEAAACyAAIAQ2AgQgACAEQRBqNgIAC2sBA38jAEEQayICJAAgAiAANgIMIAIoAgwiASgCAARAIAEoAgAhAyABKAIEIQADQCAAIANHBEAgAEEUaxDZASAAQRhrIQAMAQsLIAEgAzYCBCACKAIMIgAoAgAgACgCCBoQGAsgAkEQaiQAC8wCAQV/IwBBEGsiAiQAAkAgACABRg0AIAFBBGohBSABKAIAIQECQCAAKAIIRQ0AIAIgADYCBCAAKAIAIQMgACAAQQRqNgIAIAAoAgRBADYCCCAAQgA3AgQgAiADKAIEIgQgAyAEGzYCCCACQQRqEJQNA0AgAigCDCIDRSABIAVGckUEQCADIAEoAhA2AhAgACACIANBEGoQkw0hBCAAIAIoAgAgBCADEN0FIAJBBGoQlA0gARCrASEBDAELCyADEL0EIAIoAggiA0UNAANAIAMiBCgCCCIDDQALIAQQvQQLIABBBGohBANAIAEgBUYNAUEUEIkBIQMgAiAENgIIIAMgASgCEDYCECACQQE6AAwgACACIANBEGoQkw0hBiAAIAIoAgAgBiADEN0FIAJBADYCBCACQQRqEJUNIAEQqwEhAQwACwALIAJBEGokAAt6AQZ8IAErAxAiAiABKwMYIgQgAqFEAAAAAAAA4D+ioCEFIAArAxAiAyAAKwMYIgYgA6FEAAAAAAAA4D+ioCEHIAIgBmNFIAUgB2ZFckUEQCAGIAKhDwsgBCADoUQAAAAAAAAAACAFIAdlG0QAAAAAAAAAACADIARjGwtBAQF/IwBBEGsiAiQAIAJB0QM2AgwgACABIAJBDGpBPiABIABrQRhtZ0EBdGtBACAAIAFHG0EBEJENIAJBEGokAAtjAQJ/IwBBIGsiAiQAAkAgACgCCCAAKAIAIgNrQRhtIAFJBEAgAUGr1arVAE8NASAAIAJBDGogASAAKAIEIANrQRhtIABBCGoQmA0iABCXDSAAEJYNCyACQSBqJAAPCxDABAALqgYBBn8CfwJAIAEiAygCACIFBEAgAygCBEUNASADEKsBIgMoAgAiBQ0BCyADKAIEIgUNACADKAIIIQRBACEFQQEMAQsgBSADKAIIIgQ2AghBAAshBgJAIAQoAgAiAiADRgRAIAQgBTYCACAAIANGBEBBACECIAUhAAwCCyAEKAIEIQIMAQsgBCAFNgIECyADLQAMIQcgASADRwRAIAMgASgCCCIENgIIAkAgBCgCACABRgRAIAQgAzYCAAwBCyAEIAM2AgQLIAMgASgCACIENgIAIAQgAzYCCCADIAEoAgQiBDYCBCAEBEAgBCADNgIICyADIAEtAAw6AAwgAyAAIAAgAUYbIQALIABFIAdBAXFFckUEQCAGBEADQCACLQAMIQMCQCACKAIIIgEoAgAgAkcEQCADQQFxRQRAIAJBAToADCABQQA6AAwgARC/BCACIAAgACACKAIAIgFGGyEAIAEoAgQhAgsCQAJAAkACQCACKAIAIgEEQCABLQAMQQFHDQELIAIoAgQiAwRAIAMtAAxBAUcNAgsgAkEAOgAMIAAgAigCCCICRwRAIAItAAwNBgsgAkEBOgAMDwsgAigCBCIDRQ0BCyADLQAMQQFHDQELIAFBAToADCACQQA6AAwgAhC+BCACKAIIIgIoAgQhAwsgAiACKAIIIgAtAAw6AAwgAEEBOgAMIANBAToADCAAEL8EDwsgA0EBcUUEQCACQQE6AAwgAUEAOgAMIAEQvgQgAiAAIAAgAigCBCIBRhshACABKAIAIQILAkACQAJAAkAgAigCACIDBEAgAy0ADCIBQQFHDQELAkAgAigCBCIBBEAgAS0ADEEBRw0BCyACQQA6AAwgAigCCCICLQAMQQFGIAAgAkdxDQUgAkEBOgAMDwsgA0UNAiADLQAMQQFxDQEMAwsgAUUNAgsgAigCBCEBCyABQQE6AAwgAkEAOgAMIAIQvwQgAigCCCICKAIAIQMLIAIgAigCCCIALQAMOgAMIABBAToADCADQQE6AAwgABC+BA8LIAIoAggiASACIAEoAgBGQQJ0aigCACECDAALAAsgBUEBOgAMCwstAQF/IAAoAgAiAQRAIAAgATYCBCAAKAIIGiABEBggAEEANgIIIABCADcCAAsLGQAgAEHo0Qo2AgAgAEEkahCBAhogABDsBwuBAwIKfwF8IwBBIGsiAiQAIABBCGohBCAAKAIEIQEDQCABIARHBEAgASgCECIDIAMQsQ0iCzkDICADIAsgAysDGKM5AxAgARCrASEBDAELCyAAQQA2AiAgAEEkaiEHIABBCGohCCAAQQRqIQQgACgCBCEDAkADQCADIAhHBEAgAiADKAIQEKwNIgE2AhwCQCABRQ0AIAErAxBESK+8mvLXer5jRQ0AIAAgACgCIEEBajYCICABKAIAKAIgIQUgAkEANgIYIAJBADYCFCABKAIAKAIgIAEoAgQoAiBHDQMgBSsDECELIAUgAkEYaiIJIAJBFGoiCiABEO8HIAIoAhQiASALOQMQIAIoAhgiBiALOQMQIAYgCyAGKwMYojkDICABIAErAxAgASsDGKI5AyAgAkEMaiIBIAQgCRD2AyABIAQgChD2AyAFQQE6ACggByACQRxqEMABCyADEKsBIQMMAQsLIAQQ3gUgAkEgaiQADwtBwvQAQZDZAEH1AUGnLRAAAAsNACAALQAYQX9zQQFxC44BAgN8BH8gAEEEaiEGIAAoAgAhAAN8IAAgBkYEfCABBSABRAAAAAAAAAAAIQEgACgCECIEKAIEIQcgBCgCACEEA3wgBCAHRgR8IAEFIAQoAgAiBSsDECAFKAIgKwMQIAUrAxigIAUrAwihIgKiIAKiIAGgIQEgBEEEaiEEDAELC6AhASAAEKsBIQAMAQsLC5oCAgZ/A3xB2P4KQdj+CigCAEEBaiICNgIAIAAgAjYCLCAAEPgHA0ACQCAAEPUHIgJFDQAgAhC1AkQAAAAAAAAAAGNFDQAgAEEwahDBBCACKAIAIgEoAiAiAygCMCADKAI0RgRAIAMQ+AcgAigCACEBCyACKwMIIQcgASsDGCEIIAIoAgQrAxghCSAAKAIAIQEgACgCBCEEIAMoAgAhBSADKAIEIQZB2P4KQdj+CigCAEEBajYCACAAIAMgBCABayAGIAVrSSIEGyEBIAMgACAEGyIAIAEgAiAJIAihIAehIgeaIAcgBBsQ4QUgABD1BxogARD1BxogAEEwaiABQTBqEK4NIABB2P4KKAIANgIsIAFBAToAKAwBCwsL7AEBA38jAEEQayIDJAAgAyABNgIMIAFBAToAJCABKAI4IQQgASgCNCEBA0AgASAERwRAIAEoAgAoAgQiBS0AJEUEQCAAIAUgAhCmDQsgAUEEaiEBDAELCyMAQRBrIgAkACAAQQE2AgggAEEMEIkBNgIMIAAoAgwiAUEANgIEIAFBADYCACABIAMoAgw2AgggACgCDCEBIABBADYCDCAAKAIMIgQEQCAAKAIIGiAEEBgLIABBEGokACABIAI2AgAgASACKAIEIgA2AgQgACABNgIAIAIgATYCBCACIAIoAghBAWo2AgggA0EQaiQACxkAIABBPGoQgQIaIABBMGoQgQIaIAAQgQILGgAgAEGAgICABE8EQBDlBwALIABBAnQQiQELPwECfyAAKAIEIQIgACgCCCEBA0AgASACRwRAIAAgAUEEayIBNgIIDAELCyAAKAIAIgEEQCAAKAIMGiABEBgLC0oBAX8gACADNgIQIABBADYCDCABBEAgARCoDSEECyAAIAQ2AgAgACAEIAJBAnRqIgI2AgggACAEIAFBAnRqNgIMIAAgAjYCBCAAC34BAn8CQCADQQJIDQAgACADQQJrQQF2IgNBAnRqIgQoAgAgAUEEayIBKAIAIAIoAgARAABFDQAgASgCACEFA0ACQCABIAQiASgCADYCACADRQ0AIAAgA0EBa0EBdiIDQQJ0aiIEKAIAIAUgAigCABEAAA0BCwsgASAFNgIACwtEAQF/IwBBEGsiASQAIAFBADYCDCAAIAAoAgAoAgBBABDgBSAAIAAoAgAoAgBBACABQQxqEPEHGiABKAIMIAFBEGokAAsdAQF/IAAgASgCABDnASAAEJoBIAEgABDcAjYCAAvNBAEJfyAAIgIoAgQhBiABKAIAIgAhAyABKAIEIQEjAEEgayIJJAACQCABIABrQQJ1IgVBAEwNACACKAIIIAIoAgQiAGtBAnUgBU4EQAJAIAAgBmsiBEECdSIIIAVOBEAgAyAFQQJ0aiEHDAELIAEgAyAEaiIHayEEIAEgB0cEQCAAIAcgBBC2ARoLIAIgACAEajYCBCAIQQBMDQILIAAhBCAGIAIoAgQiASAGIAVBAnRqIgprIghqIQUgASEAA0AgBCAFTQRAIAIgADYCBCABIApHBEAgASAIayAGIAgQtgEaCwUgACAFKAIANgIAIABBBGohACAFQQRqIQUMAQsLIAMgB0YNASAGIAMgByADaxC2ARoMAQsgCUEMaiACIAAgAigCAGtBAnUgBWoQ7gcgBiACKAIAa0ECdSACQQhqEKoNIgEoAggiACAFQQJ0aiEEA0AgACAERwRAIAAgAygCADYCACADQQRqIQMgAEEEaiEADAELCyABIAQ2AgggAigCACEEIAYhACABKAIEIQMDQCAAIARHBEAgA0EEayIDIABBBGsiACgCADYCAAwBCwsgASADNgIEIAIoAgQiBSAGayEAIAEoAgghBCAFIAZHBEAgBCAGIAAQtgEaIAEoAgQhAwsgASAAIARqNgIIIAIoAgAhACACIAM2AgAgASAANgIEIAIoAgQhACACIAEoAgg2AgQgASAANgIIIAIoAgghACACIAEoAgw2AgggASAANgIMIAEgASgCBDYCACABEKkNCyAJQSBqJAAgAhCwDQtjAgJ/AXwgAigCBCIDKwMYIAIoAgAiBCsDGKEgAisDCKEhBSADKAIgIQMgBCgCICEEIAAoAgQgACgCAGsgASgCBCABKAIAa0kEQCADIAQgAiAFEOEFDwsgBCADIAIgBZoQ4QUL4gIBCX8gACgCACEFIAAoAgQhACMAQRBrIgMkACADQccDNgIMAkAgACAFa0ECdSIGQQJIDQAgBkECa0EBdiEIA0AgCEEASA0BIAUgCEECdGohBAJAIAZBAkgNACAGQQJrQQF2IgkgBCAFayIAQQJ1SA0AIAUgAEEBdSIBQQFyIgJBAnRqIQAgBiABQQJqIgFKBEAgASACIAAoAgAgACgCBCADKAIMEQAAIgEbIQIgAEEEaiAAIAEbIQALIAAoAgAgBCgCACADKAIMEQAADQAgBCgCACEBA0ACQCAEIAAiBCgCADYCACACIAlKDQAgBSACQQF0IgdBAXIiAkECdGohACAGIAdBAmoiB0oEQCAHIAIgACgCACAAKAIEIAMoAgwRAAAiBxshAiAAQQRqIAAgBxshAAsgACgCACABIAMoAgwRAABFDQELCyAEIAE2AgALIAhBAWshCAwACwALIANBEGokAAtGAgF8An8gACgCBCEDIAAoAgAhAAN8IAAgA0YEfCABBSAAKAIAIgIrAwggAisDGKEgAisDEKIgAaAhASAAQQRqIQAMAQsLC2wCAX8CfCMAQRBrIgIkACACIAE2AgwgASAANgIgIAAgAkEMahDAASAAIAIoAgwiASsDECIDIAArAxigIgQ5AxggACADIAErAwggASsDGKGiIAArAyCgIgM5AyAgACADIASjOQMQIAJBEGokAAsnACAAIAAoAhhFIAAoAhAgAXJyIgE2AhAgACgCFCABcQRAEJEBAAsLMQEDfyAAKAIEIgQgAUEEaiICayEDIAIgBEcEQCABIAIgAxC2ARoLIAAgASADajYCBAt+AQN/IAAoAgAiAUE0aiABKAI4IQMgASgCNCEBA0ACQCABIANGDQAgASgCACAARg0AIAFBBGohAQwBCwsgARC0DSAAKAIEIgFBKGogASgCLCEDIAEoAighAQNAAkAgASADRg0AIAEoAgAgAEYNACABQQRqIQEMAQsLIAEQtA0L6gEBCH8gAEHTrAMQ0QIhAiABKAIAIQYjAEEQayIDJAAgA0EIaiIEIAIQqQUaAkAgBC0AAEUNACACIAIoAgBBDGsoAgBqIgUoAgQaIANBBGoiBCAFEFMgBBC6CyEFIAQQUCADIAIQuQshByACIAIoAgBBDGsoAgBqIggQuAshCSADIAUgBygCACAIIAkgBiAFKAIAKAIQEQgANgIEIAQQpwVFDQAgAiACKAIAQQxrKAIAakEFEKoFCyADQQhqEKgFIANBEGokACACQdjgARDRAiABKAIgKwMQIAErAxigEJEH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EiACQQJ0akF/NgIAIAJBAWohAgwBCwtBhscBQZa3AUGLBkGBDhAAAAtBhscBQZa3AUGkBkGBDhAAAAtBhscBQZa3AUG4BkGBDhAAAAtBh9ABQZa3AUHQBUGBDhAAAAsgFEEQaiQAIA8L2AYCCn8BfCMAQRBrIgokACAAKAIgRQRAAkACQCAAKAIQQQFrIgQOBAEAAAEAC0HU0AFBlrcBQZAFQcg1EAAACyACKAIAIQUgACgCACEDIAAoAhghBiAAKAIUIQcCQAJAAkACQCAEDgQAAgIBAgsgACgCHCEJIAEEQCAFRQRAIANBCBA/IQULQQAhBCADQQAgA0EAShshAwNAIAMgBEYNBCAFIARBA3RqIgtCADcDACAHIARBAnRqKAIAIgAgByAEQQFqIgRBAnRqKAIAIgggACAIShshCEQAAAAAAAAAACENA0AgACAIRgRADAIFIAsgCSAAQQN0aisDACABIAYgAEECdGooAgBBA3RqKwMAoiANoCINOQMAIABBAWohAAwBCwALAAsACyAFRQRAIANBCBA/IQULQQAhASADQQAgA0EAShshBANAIAEgBEYNAyAFIAFBA3RqIgNCADcDACAHIAFBAnRqKAIAIgAgByABQQFqIgFBAnRqKAIAIgYgACAGShshBkQAAAAAAAAAACENA0AgACAGRgRADAIFIAMgCSAAQQN0aisDACANoCINOQMAIABBAWohAAwBCwALAAsACyAAKAIcIQkgAQRAIAVFBEAgA0EIED8hBQtBACEEIANBACADQQBKGyEDA0AgAyAERg0DIAUgBEEDdGoiC0IANwMAIAcgBEECdGooAgAiACAHIARBAWoiBEECdGooAgAiCCAAIAhKGyEIRAAAAAAAAAAAIQ0DQCAAIAhGBEAMAgUgCyAJIABBAnQiDGooAgC3IAEgBiAMaigCAEEDdGorAwCiIA2gIg05AwAgAEEBaiEADAELAAsACwALIAVFBEAgA0EIED8hBQtBACEBIANBACADQQBKGyEEA0AgASAERg0CIAUgAUEDdGoiA0IANwMAIAcgAUECdGooAgAiACAHIAFBAWoiAUECdGooAgAiBiAAIAZKGyEGRAAAAAAAAAAAIQ0DQCAAIAZGBEAMAgUgAyANIAkgAEECdGooAgC3oCINOQMAIABBAWohAAwBCwALAAsACyAKQcMFNgIE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AxggBiAAKALsAUHIAGxqIgEgASsDECAAKwN4ECM5AxALC4kDAgZ/BHwgABBhKAIQKALEASEFIAAQYSAARgR8RAAAAAAAACBABSAAQczbCigCAEEIQQAQYrcLIQkgACgCECIBKwOAASEHIAErA3ghCEEBIQIDQCACIAEoArQBSkUEQCABKAK4ASACQQJ0aigCACIBEO0NIQYgASgCECIEKALsASAAKAIQIgEoAuwBRgRAIAggCSAEKwN4oCIKIAggCmQbIQgLIAQoAugBIAEoAugBRgRAIAcgCSAEKwOAAaAiCiAHIApkGyEHCyADIAZyIQMgAkEBaiECDAELCyAAEGEhAiAAKAIQIQECQCAAIAJGDQAgASgCDEUNACAAEDlBASEDIAAoAhAhASgCEC0AdEEBcQ0AIAcgASsDWKAhByAIIAErAzigIQgLIAEgBzkDgAEgASAIOQN4IAAQYSAARwRAIAUgACgCECIAKALoAUHIAGxqIgEgASsDGCIJIAcgByAJYxs5AxggBSAAKALsAUHIAGxqIgAgACsDECIHIAggByAIZBs5AxALIAMLcAECf0EBIQQDQCAEIAAoAhAiAygCtAFKRQRAIAMoArgBIARBAnRqKAIAIAEgAhDuDSAEQQFqIQQMAQsLIAMgASADKwMQojkDECADIAIgAysDGKI5AxggAyABIAMrAyCiOQMgIAMgAiADKwMoojkDKAvlBAIIfwR8QQEhAgNAIAIgACgCECIDKAK0AUpFBEAgAygCuAEgAkECdGooAgAgARDvDSACQQFqIQIMAQsLIAAQYSECIAAoAhAhAwJAIAAgAkYEQCADKALsASEFRAAAwP///9/BIQpEAADA////30EhCyADKALoASIIIQQDQCAEIAVKBEAgAygCtAEiAEEAIABBAEobQQFqIQBBASECA0AgACACRg0EIAogAygCuAEgAkECdGooAgAoAhAiBCsDIEQAAAAAAAAgQKAiDCAKIAxkGyEKIAsgBCsDEEQAAAAAAAAgwKAiDCALIAxjGyELIAJBAWohAgwACwAFAkAgAygCxAEgBEHIAGxqIgAoAgAiBkUNAEEBIQIgACgCBCIHKAIAIgBFDQADQCAAKAIQIgAtAKwBIglFIAIgBk5yRQRAIAcgAkECdGooAgAhACACQQFqIQIMAQsLIAkNACAGQQJrIQIgACsDECAAKwNYoSEMIAcgBkECdGpBBGshAANAIAAoAgAoAhAiAC0ArAEEQCAHIAJBAnRqIQAgAkEBayECDAELCyAKIAArAxAgACsDYKAiDSAKIA1kGyEKIAsgDCALIAxjGyELCyAEQQFqIQQMAQsACwALIAMoAugBIQggAygC7AEhBSADKAKEAigCECgC9AG3IQogAygCgAIoAhAoAvQBtyELCyABKAIQKALEASIAIAVByABsaigCBCgCACgCECsDGCEMIAAgCEHIAGxqKAIEKAIAKAIQKwMYIQ0gAyAKOQMgIAMgCzkDECADIA0gAysDgAGgOQMoIAMgDCADKwN4oTkDGAuiAQICfAF/AkACf0H/////ByAAQdQgECciA0UNABogABA8IQAgAxCuAiEBIABBAEgNAUEAIAFEAAAAAAAAAABjDQAaIAC4IQIgAUQAAAAAAADwP2QEQEH/////B0QAAMD////fQSABoyACYw0BGgsgASACoiIBmUQAAAAAAADgQWMEQCABqg8LQYCAgIB4Cw8LQc+YA0GH/ABBzQBBztkAEAAAC4gCAgd/AXwjAEEQayIEJAAgAEHM2wooAgBBCEEAEGIgABDtBbchCCAAKAIQIgEoAugBIQMgASgChAIhBSABKAKAAiEGA0AgAyABKALsAUpFBEACQCADQcgAbCIHIAEoAsQBaiICKAIARQ0AIAIoAgQoAgAiAkUEQCAAECEhASAEIAM2AgQgBCABNgIAQdu0BCAEEDcMAQsgBiACIAIoAhArA1ggCKAgASsDYKBBABCfARogACgCECIBKALEASAHaiICKAIEIAIoAgBBAnRqQQRrKAIAIgIgBSACKAIQKwNgIAigIAErA0CgQQAQnwEaCyADQQFqIQMgACgCECEBDAELCyAEQRBqJAAL2wICCn8BfCAAQczbCigCAEEIQQAQYiEHQQEhAQNAIAAoAhAiBSgCtAEiBCABSARAIAe3IQtBASEBA0AgASAESkUEQCABQQJ0IQkgAUEBaiIHIQEDQCAFKAK4ASICIAlqKAIAIQMgASAESkUEQCACIAFBAnRqKAIAIgYgAyADKAIQKALoASAGKAIQKALoAUoiAhsiCCgCECIKKALsASADIAYgAhsiAygCECIGKALoASICTgRAIAggAyACQcgAbCICIAooAsQBaigCBCgCACgCECgC+AEg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P2UNACAAEPENIAAoAhAiASgCgAIgASgChAIgEiARIAEoAnRBAXEbIhFEAAAAAOD/70AgEUQAAAAA4P/vQGMbQegHEJ8BGgsCQCAAQQIgABDwDRDMBEUNACAAKAIQIgIoAugBIQUDQAJAAkAgAigC7AEiCiAFTgRAQQAhCCACKALEASAFQcgAbGoiBygCACIJQQAgCUEAShshA0EAIQEDQCABIANGDQNBACEEAkAgBygCBCABQQJ0aigCACIIKAIQIgsoApACIg1FDQADQCANIARBAnRqKAIAIgZFDQEgBkFQQQAgBigCAEEDcSIMQQJHG2ooAigoAhAoAvQBIAVKDQQgBEEBaiEEIAZBMEEAIAxBA0cbaigCKCgCECgC9AEgBUwNAAsMAwtBACEEAkAgCygCiAIiC0UNAANAIAsgBEECdGooAgAiBkUNASAGQTBBACAGKAIAQQNxIg1BA0cbaigCKCgCECgC9AEgBUoNBCAEQQFqIQQgBSAGQVBBACANQQJHG2ooAigoAhAoAvQBTg0ACwwDCyABQQFqIQEMAAsACyAAQQIgABDwDRDMBEUNA0GImwNBprsBQY0BQbHiABAAAAsgASEDCwJAIAhFIAMgCUhyRQRAIAdBzABBvH8gBSAKSBtqKAIAKAIAIgJFDQEgBygCBCgCACEDIAAQugIiASgCEEECOgCsASABIANEAAAAAAAAAABBABCfARogASACRAAAAAAAAAAAQQAQnwEaIAEoAhAgAygCECgC9AEiASACKAIQKAL0ASICIAEgAkgbNgL0ASAAKAIQIQILIAVBAWohBQwBCwtB0toAQaa7AUH2AEGO+gAQAAALIAAoAhAiASgC7AEhBSABKALoASECIAEoAsQBIQQDQCACIAVMBEBBACEBIAQgAkHIAGxqIgcoAgAiA0EAIANBAEobIQYDQCABIAZHBEAgBygCBCABQQJ0aigCACgCECIDKAL0ASEIIAMgAjYC9AEgAyAItzkDECABQQFqIQEMAQsLIAJBAWohAgwBCwsgACAAEO8NAkAgACgCECIBKALsAUEATA0AIAEoAggiAigCVCIFRQ0AIAErACgiESABKwAYoSIUIAErACAiEiABKwAQoSIVIAEoAnRBAXEiAxshEyAVIBQgAxshFAJAAnwCQAJAAkACQAJAIAVBAWsOBQQABwEDBwsgAisD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IAJB7BxqENAEIQcgAigC7BwhAwwBCyACQegMaiACQewcahDPBCEHIBogAigC7BwiA0EFSXINACAHIAcpAwA3AxAgByAHKQMINwMYIAcgByADQQR0akEQayIDKQMANwMgIAcgAykDCDcDKCADKQMAIWUgByADKQMINwM4IAcgZTcDMCACQQQ2AuwcQQQMAQsgA0UNASADCyEGQQAhAwwBCyAHEBhBACEDA0AgAigCmB0gA00EQCACQZAdaiIDQSAQMSADEDRBACEDA0AgAigC+B0gA00EQCACQfAdaiIDQRAQMSADEDRBACEDA0AgAigC0B0gA00EQCACQcgdaiIDQRAQMSADEDQMCwUgAkHwCWogAkHQHWopAwA3AwAgAiACKQPIHTcD6AkgAkHoCWogAxAZIQUCQAJAIAIoAtgdIgQOAgETAAsgAkHgCWogAigCyB0gBUEEdGoiBSkDCDcDACACIAUpAwA3A9gJIAJB2AlqIAQRAQALIANBAWohAwwBCwALAAUgAkHQCWogAkH4HWopAwA3AwAgAiACKQPwHTcDyAkgAkHICWogAxAZIQUCQAJAIAIoAoAeIgQOAgERAAsgAkHACWogAigC8B0gBUEEdGoiBSkDCDcDACACIAUpAwA3A7gJIAJBuAlqIAQRAQALIANBAWohAwwBCwALAAUgAkGwCWogAkGYHWopAwA3AwAgAiACKQOQHTcDqAkgAkGoCWogAxAZIQUCQAJAIAIoAqAdIgQOAgEPAAsgAkGQCWogAigCkB0gBUEFdGoiBSkDCDcDACACQZgJaiAFKQMQNwMAIAJBoAlqIAUpAxg3AwAgAiAFKQMANwOICSACQYgJaiAEEQEACyADQQFqIQMMAQsACwALA0AgAyAGSQRAIAwgByADQQR0aiIGKQMANwMAIAwgBikDCDcDCCACQfAdakEQECYhBiACKALwHSAGQQR0aiIGIAwpAwA3AwAgBiAMKQMINwMIIANBAWohAyACKALsHCEGDAELCyAHEBggCiEDA0AgCCgCACgCyAEoAgAhBiADBEAgA0EBayEDIAZBUEEAIAYoAgBBA3FBAkcbaigCKEEQaiEIDAELCyACKAL4HSIHBEAgAkHoCmogAkH4HWoiAykDADcDACACIAIpA/AdNwPgCiAMIAIoAvAdIAJB4ApqIAdBAWsQGUEEdGoiBykD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Dg0FIAIoAqwEIQggAigCqAQhCwJAAkACQCAJQQFqDgMAAQIDCyADKAIAIAIgAykCCDcDYCACIAMpAgA3A1ggAkHYAGogABAZQQJ0aigCACADKAIAIAIgAykCCDcDUCACIAMpAgA3A0ggAkHIAGogBRAZQQJ0aigCACAEQQAgBiABELgCIAMoAgAgAkFAayADKQIINwMAIAIgAykCADcDOCACQThqIAAQGUECdGooAgAgAygCACACIAMpAgg3AzAgAiADKQIANwMoIAJBKGogBRAZQQJ0aigCACAHQQEgCyABELgCIAhBAUcNAiADKAIAIAIgAykCCDcDICACIAMpAgA3AxggAkEYaiAFEBlBAnRqKAIAIAMoAgAgAiADKQIINwMQIAIgAykCADcDCCACQQhqIAAQGUECdGooAgAgByABEJcODAILAkACQAJAIAhBAWoOAwABAgQLIAMoAgAgAiADKQIINwOgASACIAMpAgA3A5gBIAJBmAFqIAAQGUECdGooAgAgAygCACACIAMpAgg3A5ABIAIgAykCADcDiAEgAkGIAWogBRAZQQJ0aigCACAEQQAgBiABELgCIAMoAgAgAiADKQIINwOAASACIAMpAgA3A3ggAkH4AGogABAZQQJ0aigCACADKAIAIAIgAykCCDcDcCACIAMpAgA3A2ggAkHoAGogBRAZQQJ0aigCACAHQQEgCyABELgCDAMLIAMoAgAgAiADKQIINwPgASACIAMpAgA3A9gBIAJB2AFqIAUQGUECdGooAgAgAygCACACIAMpAgg3A9ABIAIgAykCADcDyAEgAkHIAWogABAZQQJ0aigCAEEAIAQgBiABELgCIAMoAgAgAiADKQIINwPAASACIAMpAgA3A7gBIAJBuAFqIAUQGUECdGooAgAgAygCACACIAMpAgg3A7ABIAIgAykCADcDqAEgAkGoAWogABAZQQJ0aigCAEEBIAcgCyABELgCDAILIAMoAgAgAiADKQIINwOgAiACIAMpAgA3A5gCIAJBmAJqIAUQGUECdGooAgAgAygCACACIAMpAgg3A5ACIAIgAykCADcDiAIgAkGIAmogABAZQQJ0aigCAEEAIAQgBiABELgCIAMoAgAgAiADKQIINwOAAiACIAMpAgA3A/gBIAJB+AFqIAUQGUECdGooAgAgAygCACACIAMpAgg3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QbgCakEEECYhCiAEKAK4AiAKQQJ0aiAEKALMAjYCACACKAIAIAE2AhggCSACQQggCSgCABEDACECDAELCyAIIARB0AJqQYAEIAgoAgARAwAhAgNAAkAgASsDQCEbIAJFDQAgAisDECAbY0UNACAEIAIoAgA2AswCIARBuAJqQQQQJiEKIAQoArgCIApBAnRqIAQoAswCNgIAIAIoAgAgATYCGCAIIAJBCCAIKAIAEQMAIQIMAQsLIAQgGzkD2AIgCSAEQdACakGABCAJKAIAEQMAIQIDQAJAIAErAzghGyACRQ0AIAIrAwggG2NFDQAgBCACKAIANgLMAiAEQbgCakEEECYhCiAEKAK4AiAKQQJ0aiAEKALMAjYCACACKAIAIAE2AhQgCSACQQggCSgCABEDACECDAELCyAEIBs5A9ACIAQgASsDMDkD2AIgCCAEQdACakGABCAIKAIAEQMAIQIDQAJAIAJFDQAgAisDECABKwNAY0UNACAEIAIoAgA2AswCIARBuAJqQQQQJiEKIAQoArgCIApBAnRqIAQoAswCNgIAIAIoAgAgATYCFCAIIAJBCCAIKAIAEQMAIQIMAQsLIARBuAJqIAFBJGogAUEgakEEEMcBIAEoAiAiASAMIAEgDEsbIQwgBkEBaiEGDAELCwNAIBAgEUYEQCAAKAIQIAAoAgAiAUEobGoiAyABNgIgIAMgAUEBajYCSEEAIQMgACgCAEEGbCAMQQF0akEEEBohAiAAIAAoAgBBA2wgDGpBGBAaNgIUIAAoAgAiBkEAIAZBAEobIQEDQCABIANGBEAgBkECaiEDA0AgASADSARAIAAoAhAgAUEobGogAjYCHCABQQFqIQEgAiAMQQJ0aiECDAELCwUgACgCECADQShsaiACNgIcIANBAWohAyACQRhqIQIMAQsLQQAhBgJAAkADQCAGIA9GBEACQCAIEJkBGiAJEJkBGiALEBhBACEBQYj2CCgCACECA0AgASAAKAIATg0BIAAoAhAgAUEobGoiAygCFEUEQCAEIAE2AhAgAkH4zAQgBEEQahAgGiADKAIURQ0FCyADKAIYRQRAIAQgATYCACACQeLMBCAEECAaIAMoAhhFDQYLIAFBAWohAQwACwALBSASIAZByABsaiIBKwM4IAErAyihIhsgASsDQCABKwMwoSIfoEQAAAAAAADg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EmogBhAZQcgAbGogBTYCKAsgAigCACEGIARBkBJqIAIpAgg3AwAgBCACKQIANwOIEgJAIAYgBEGIEmogBRAZQcgAbGooAjQiBkEBa0F9Sw0AIAIoAgAgBEGAEmogAikCCDcDACAEIAIpAgA3A/gRIARB+BFqIAYQGUHIAGxqKAIsIAlHDQAgAigCACAEQfARaiACKQIINwMAIAQgAikCADcD6BEgBEHoEWogBhAZQcgAbGogBTYCLAsgAxDvASEHIAMQ7wEhCiACKAIAIARB4BFqIAIpAgg3AwAgBCACKQIANwPYESAEQdgRaiAJEBlByABsaigCOCEGIAMoAgAgBEHQEWogAykCCDcDACAEIAMpAgA3A8gRIARByBFqIAYQGUEobGpBAjYCACADKAIAIARBwBFqIAMpAgg3AwAgBCADKQIANwO4ESAEQbgRaiAGEBlBKGxqIg4gCCkDADcDCCAOIAgpAwg3AxAgAygCACAEQbARaiADKQIINwMAIAQgAykCADcDqBEgBEGoEWogBhAZQShsaiAANgIEIAMoAgAgBEGgEWogAykCCDcDACAEIAMpAgA3A5gRIARBmBFqIAYQGUEobGogCjYCICADKAIAIARBkBFqIAMpAgg3AwAgBCADKQIANwOIESAEQYgRaiAGEBlBKGxqIAc2AiQgAygCACAEQYARaiADKQIINwMAIAQgAykCADcD+BAgBEH4EGogBxAZQShsakEDNgIAIAMoAgAgBEHwEGogAykCCDcDACAEIAMpAgA3A+gQIARB6BBqIAcQGUEobGogCTYCGCADKAIAIARB4BBqIAMpAgg3AwAgBCADKQIANwPYECAEQdgQaiAHEBlBKGxqIAY2AhwgAygCACAEQdAQaiADKQIINwMAIAQgAykCADcDyBAgBEHIEGogChAZQShsakEDNgIAIAMoAgAgBEHAEGogAykCCDcDACAEIAMpAgA3A7gQIARBuBBqIAoQGUEobGogBTYCGCADKAIAIARBsBBqIAMpAgg3AwAgBCADKQIANwOoECAEQagQaiAKEBlBKGxqIAY2AhwgAigCACAEQaAQaiACKQIINwMAIAQgAikCADcDmBAgBEGYEGogCRAZQcgAbGogBzYCOCACKAIAIARBkBBqIAIpAgg3AwAgBCACKQIANwOIECAEQYgQaiAFEBlByABsaiAKNgI4CyAPIBBqIRMgAkEYaiEUQQAhECAMIQVBACEOA0ACQAJAIAUiCEEBa0F9Sw0AIAIoAgAhBSAEQYAQaiACKQIINwMAIAQgAikCADcD+A8gBEH4D2ogCBAZIQYgAigCACEHIARB8A9qIAIpAgg3AwAgBCACKQIANwPoDyAEQegPaiAJEBkhCgJAIAUgBkHIAGxqIgUrACAiFSAHIApByABsaiIGKwAgIhZESK+8mvLXej6gZA0AIBUgFkRIr7ya8td6vqBjRSAFKwAYIhcgBisAGCIYZHENACAVIBahmURIr7ya8td6PmVFIBcgGKGZREivvJry13o+ZUVyDQELIAIoAgAgBEHgD2ogAikCCDcDACAEIAIpAgA3A9gPIARB2A9qIAgQGUHIAGxqKAI4IQUgAxDvASEHIAMQ7wEhCiADKAIAIARB0A9qIAMpAgg3AwAgBCADKQIANwPIDyAEQcgPaiAFEBlBKGxqQQE2AgAgAygCACAEQcAPaiADKQIINwMAIAQgAykCADcDuA8gBEG4D2ogBRAZQShsaiAANgIEIAMoAgAgBEGwD2ogAykCCDcDACAEIAMpAgA3A6gPIARBqA9qIAUQGUEobGogBzYCICADKAIAIARBoA9qIAMpAgg3AwAgBCADKQIANwOYDyAEQZgPaiAFEBlBKGxqIAo2AiQgAygCACAEQZAPaiADKQIINwMAIAQgAykCADcDiA8gBEGID2ogBxAZQShsakEDNgIAIAMoAgAgBEGAD2ogAykCCDcDACAEIAMpAgA3A/gOIARB+A5qIAcQGUEobGogCDYCGCADKAIAIARB8A5qIAMpAgg3AwAgBCADKQIANwPoDiAEQegOaiAHEBlBKGxqIAU2AhwgAygCACAEQeAOaiADKQIINwMAIAQgAykCADcD2A4gBEHYDmogChAZQShsakEDNgIAIAIQtwMhBiADKAIAIARB0A5qIAMpAgg3AwAgBCADKQIANwPIDiAEQcgOaiAKEBlBKGxqIAY2AhggAigCACAEQcAOaiACKQIINwMAIAQgAikCADcDuA4gBEG4DmogBhAZQcgAbGpBAToARCADKAIAIARBsA5qIAMpAgg3AwAgBCADKQIANwOoDiAEQagOaiAKEBlBKGxqIAU2AhwgAigCACAEQaAOaiACKQIINwMAIAQgAikCADcDmA4gBEGYDmogCBAZIAIoAgAhESAEQZAOaiACKQIINwMAIAQgAikCADcDiA4gBEGIDmogCRAZIRJByABsaiIFKwAgIRUgESASQcgAbGoiDSsAICEWIAUrABghFyANKwAYIRggAigCACEFIARBgA5qIAIpAgg3AwAgBCACKQIANwP4DSAUIAUgBEH4DWogCBAZQcgAbGpByAAQHyENIARB8A1qIAIpAgg3AwAgBCACKQIANwPoDSAEQegNaiAGEBkhBQJAAkAgAigCECIRDgIBBQALIARBoA1qIhIgAigCACAFQcgAbGpByAAQHxogEiAREQEACyAGIBAgFyAYoZlESK+8mvLXej5lGyAQIBUgFqGZREivvJry13o+ZRshECAGIA4gCCAMRhshDiACKAIAIAVByABsaiANQcgAEB8aIAIoAgAgBEGYDWogAikCCDcDACAEIAIpAgA3A5ANIARBkA1qIAgQGUHIAGxqIAc2AjggAigCACAEQYgNaiACKQIINwMAIAQgAikCADcDgA0gBEGADWogBhAZQcgAbGogCjYCOCACKAIAIARB+AxqIAIpAgg3AwAgBCACKQIANwPwDCAEQfAMaiAIEBlByABsaigCMEEBa0F+SQ0BIAIoAgAgBEHoDGogAikCCDcDACAEIAIpAgA3A+AMIARB4AxqIAgQGUHIAGxqKAI0QQFrQX5JDQFBzIUEQRNBAUGI9ggoAgAQOhoLIAAgDCAJQQEgAiADEK8OIAAgDiAQQQIgAiADEK8OIA9BAToAICAEQZAaaiQADwsgAigCACEFIARB2AxqIAIpAgg3AwAgBCACKQIANwPQDAJ/AkAgBSAEQdAMaiAIEBlByABsaigCMEEBa0F9Sw0AIAIoAgAgBEHIDGogAikCCDcDACAEIAIpAgA3A8AMIARBwAxqIAgQGUHIAGxqKAI0QQFrQX5JDQAgBEHYGWoiByABIAIgCCAGEI8IIAIoAgAgBEG4DGogAikCCDcDACAEIAIpAgA3A7AMIARBsAxqIAgQGUHIAGxqKwMgIRUgAigCACEFIARBqAxqIAIpAgg3AwAgBCACKQIANwOgDAJAAkAgFSAFIARBoAxqIAkQGUHIAGxqKwMgoZlESK+8mvLXej5lRQ0AIAIoAgAgBEGYDGogAikCCDcDACAEIAIpAgA3A5AMIARBkAxqIAgQGUHIAGxqKwMYIAIoAgAgBEGIDGogAikCCDcDACAEIAIpAgA3A4AMIARBgAxqIAkQGUHIAGxqKwMYoZlESK+8mvLXej5lRSALRXINAAJAIBMoAgAiBUEATA0AIAUgASAHEMcERQ0AIAIoAgAhBSAEQbgLaiACKQIINwMAIAQgAikCADcDsAsgBSAEQbALaiAIEBlByABsaigCMCEHIARBqAtqIAIpAgg3AwAgBCACKQIANwOgCyAFIARBoAtqIAcQGUHIAGxqIAg2AiggAigCACAEQZgLaiACKQIINwMAIAQgAikCADcDkAsgBEGQC2ogBhAZQcgAbGpBfzYCMCACKAIAIARBiAtqIAIpAgg3AwAgBCACKQIANwOACyAEQYALaiAGEBlByABsakF/NgI0DAILIAIoAgAhBSAEQfgLaiACKQIINwMAIAQgAikCADcD8AsgBSAEQfALaiAGEBlByABsaigCMCEHIARB6AtqIAIpAgg3AwAgBCACKQIANwPgCyAFIARB4AtqIAcQGUHIAGxqIAY2AiwgAigCACAEQdgLaiACKQIINwMAIAQgAikCADcD0AsgBEHQC2ogCBAZQcgAbGpBfzYCMCACKAIAIARByAtqIAIpAgg3AwAgBCACKQIANwPACyAEQcALaiAIEBlByABsakF/NgI0DAELIAIoAgAhBSAEQfgKaiACKQIINwMAIAQgAikCADcD8AogBSAEQfAKaiAIEBlByABsaigCMCEHIARB6ApqIAIpAgg3AwAgBCACKQIANwPgCgJAIAUgBEHgCmogBxAZQcgAbGooAihBAWtBfUsNACACKAIAIQUgBEHYCmogAikCCDcDACAEIAIpAgA3A9AKIAUgBEHQCmogCBAZQcgAbGooAjAhByAEQcgKaiACKQIINwMAIAQgAikCADcDwAogBSAEQcAKaiAHEBlByABsaigCLEEBa0F9Sw0AIAIoAgAhBSAEQbgKaiACKQIINwMAIAQgAikCADcDsAogBSAEQbAKaiAIEBlByABsaigCMCEHIARBqApqIAIpAgg3AwAgBCACKQIANwOgCiAFIARBoApqIAcQGUHIAGxqKAIoIQcgAigCACEFIARBmApqIAIpAgg3AwAgBCACKQIANwOQCiAFIARBkApqIAgQGUHIAGxqKAIwIQogBEGICmogAikCCDcDACAEIAIpAgA3A4AKIAUg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aCAEIAIpAgA3A2AgBSAEQeAAaiAHEBlByABsaiAGNgIoIAIoAgAhBSAEIAIpAgg3A1ggBCACKQIANwNQIAUgBEHQAGogCBAZQcgAbGooAjQhByAEIAIpAgg3A0ggBCACKQIANwNAIAUgBEFAayAHEBlByABsakF/NgIsIAIoAgAgBCACKQIINwM4IAQgAikCADcDMCAEQTBqIAgQGUHIAGxqQX82AjQgAigCACAEIAIpAgg3AyggBCACKQIANwMgIARBIGogCBAZQcgAbGpBMGoMAQsgB0F/NgIsIAIoAgAhBSAEIAIpAgg3A/gBIAQgAikCADcD8AEgBSAEQfABaiAIEBlByABsaigCNCEHIAQgAikCCDcD6AEgBCACKQIANwPgASAFIARB4AFqIAcQGUHIAGxqIAg2AiggAigCACEFIAQgAikCCDcD2AEgBCACKQIANwPQASAFIARB0AFqIAgQGUHIAGxqKAI0IQcgBCACKQIINwPIASAEIAIpAgA3A8ABIAUgBEHAAWogBxAZQcgAbGogBjYCLCACKAIAIAQgAikCCDcDuAEgBCACKQIANwOwASAEQbABaiAIEBlByABsaigCNCEFIAIoAgAgBCACKQIINwOoASAEIAIpAgA3A6ABIARBoAFqIAYQGUHIAGxqIAU2AjAgAigCACAEIAIpAgg3A5gBIAQgAikCADcDkAEgBEGQAWogBhAZQcgAbGpBfzYCNCACKAIAIAQgAikCCDcDiAEgBCACKQIANwOAASAEQYABaiAIEBlByABsakE0agsoAgAhBSACKAIAIAQgAikCCDcDGCAEIAIpAgA3AxAgBEEQaiAIEBlByABsaiAANgIEIAIoAgAgBCACKQIINwMIIAQgAikCADcDACAEIAYQGUHIAGxqIAA2AgAMAAsAC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALySADEH8CfAJ+IwBBkAlrIgQkACAEQaAIaiIJQQBBwAAQOBogAEEAQeAAEDgiBUHIABAmIQAgBSgCACAAQcgAbGogBUEYakHIABAfGiADKAIAIRMgCRDvASEJIARBmAhqIARBqAhqIgApAwA3AwAgBCAEKQOgCDcDkAggBCgCoAggBEGQCGogCRAZQShsakECNgIAIARBiAhqIAApAwA3AwAgBCAEKQOgCDcDgAggBCgCoAggBEGACGog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AiACKAIAQQNxIQMLIAIgBiADQQNGGygCKCAFRw0CQZDdCigCACIDRQ0CIAIgAxBFIgMtAABFDQIgAUGwAmogAiADEMAODAILA0ACQCADIARPBEAgAUHgAmpBHBAxQQAhA0EAIQIDQCACIAEoArgCIgRPDQIgASABKQK4AjcD+AEgASABKQKwAjcD8AEgASgCsAIgAUHwAWogAhAZQRxsaigADEECTwRAIAEgASkCuAI3A+gBIAEgASkCsAI3A+ABIAEgASgCsAIgAUHgAWogAhAZQRxsaiIEKQIUNwPYASABIAQpAgw3A9ABIAEgBCkCBDcDyAEgBSABQcgBahDBDgsgAkEBaiECDAALAAsgASABKQLoAjcDwAEgASABKQLgAjcDuAEgAUG4AWogAxAZIQICQAJAIAEoAvACIgQOAgEJAAsgASABKALgAiACQRxsaiICKQIINwOgASABIAIpAhA3A6gBIAEgAigCGDYCsAEgASACKQIANwOYASABQZgBaiAEEQEACyADQQFqIQMgASgC6AIhBAwBCwsDQCADIARPBEAgAUGwAmpBHBAxIAAgBRAdIQUMBQUgASABKQK4AjcDqAIgASABKQKwAjcDoAIgAUGgAmogAxAZIQICQAJAIAEoAsACIgQOAgEJAAsgASABKAKwAiACQRxsaiICKQIINwOIAiABIAIpAhA3A5ACIAEgAigCGDYCmAIgASACKQIANwOAAiABQYACaiAEEQEACyADQQFqIQMgASgCuAIhBAwBCwALAAsgAUHgAmogAiADEMAOCyAAIAIgBRByIQIMAAsACwALIAFBkANqJAAPC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALHAEBf0EBIQIgACABENIOBH9BAQUgACABENEOCwtAAQJ/AkAgASAAKAIATw0AIAIgACgCBCIETw0AIAAoAgggASAEbCACaiIAQQN2ai0AACAAQQdxdkEBcSEDCyADC84CAQp/AkACQCAABEAgACgCACIFIAFLIAAoAgQiBCACS3FFBEAgBCACQQFqIgMgAyAESRsiBCAFIAFBAWoiAyADIAVJGyIFbCIDQQN2IANBB3FBAEdqEMYDIQcgACgCACEIA0AgBiAIRwRAIAQgBmwhCSAAKAIEIQpBACEDA0AgAyAKRgRAIAZBAWohBgwDCyAAIAYgAxDEDgRAIAcg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A0HMAGohCgJAA0AgAgRAAkAgAigCECIEIAhqKAIAKAIADQAgBCgCsAENACAEQQE2ArABIAMgAjYCTCADQThqQQQQJiEEIAMoAjggBEECdGogAygCTDYCAANAIAMoAkBFDQEgA0E4aiAKEKEEIAMoAkwiBSgCEC0AtQFBB0cEQCAAIAUQ0A4EQEEAIQIDQCADKAJAIAJNBEBBfyEEDAgFIAMgA0FAaykDADcDMCADIAMpAzg3AyggA0EoaiACEBkhAAJAAkACQCADKAJIIgEOAgIAAQsgAygCOCAAQQJ0aigCABAYDAELIAMoAjggAEECdGooAgAgAREBAAsgAkEBaiECDAELAAsACyADQThqIAUgARDPDgwBCyADQThqIQtBACEEAkAgAUEBaiIMIAUoAhAoAugBIgYoAhAiBSwAkQJGDQAgBSgC6AEhBQNAIAYoAhAiBCgC7AEiByAFTgRAIAVBAnQhByAFQQFqIQUgACAHIAQoAowCaigCABDQDiIERQ0BDAILCyAEKALoASEFA0AgBSAHTARAIAsgBCgCjAIgBUECdGooAgAgARDPDiAFQQFqIQUgBigCECIEKALsASEHDAELCyAEIAw6AJECQQAhBAsgBEUNAAtBACECA0AgAiADKAJATw0EIAMgA0FAaykDADcDICADIAMpAzg3AxggA0EYaiACEBkhAAJAAkACQCADKAJIIgEOAgIAAQsgAygCOCAAQQJ0aigCABAYDAELIAMoAjggAEECdGooAgAgAREBAAsgAkEBaiECDAALAAsgAigCECAJaigCACECDAELC0Ho/QooAgAhBSAAKAIQIgIoAugBIQQDQCACKALsASAETgRAIARByABsIgEgBSgCECgCxAFqQQA6ADECQCACLQB0QQFxRQ0AIAIoAsQBIAFqIgEoAgAiBkEATA0AIAZBAWsiBkEBdkEBaiEHIAEoAgQhAUEAIQIDQCACIAdHBEAgASACQQJ0aigCACABIAYgAmtBAnRqKAIAEJcIIAJBAWohAgwBCwsgACgCECECCyAEQQFqIQQMAQsLAkAgABBhIABHDQAQyQRCAFcNACAAQQAQlggLQQAhBEEAIQIDQCACIAMoAkBPDQEgAyADQUBrKQMANwMQIAMgAykDODcDCCADQQhqIAIQGSEAAkACQAJAIAMoAkgiAQ4CAgABCyADKAI4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IQILIAMgASACIAYQ6w4gASECCyAAIAYQMCEGDAALAAsACyAAEOoODAELIAAgA0EAQQAQ6Q4gAxAcIQEDQCABBEAgASgCECICQQA6ALQBIAJBADYCsAEgAyABEB0hAQwBCwsgAxAcIQEDQCABBEAgAyABEOgOIAMgARAdIQEMAQsLIAMQHCEBA0AgAQRAIAEoAhBBADYCkAEgAyABEB0hAQwBCwtBACEJIAMQHCEBA0AgAQRAIAEoAhAoApABRQRAIAMgASAJQQFqIgkQoAgLIAMgARAdIQEMAQsLAkAgCUECSA0AIANB5xwQygQhAiADEBwhAUEBIQgDQCABRQ0BIAggASgCECgCkAFGBEAgAyACIAFBAEEBEF4aIAhBAWohCAsgAyABEB0hAQwACwALIAMQHCEHA0AgBwRAIAMgBxAsIQEDQCABBEAgBygCECICKALIASACKALMASICQQFqIAJBAmoQ2gEhBCAHKAIQIgIgBDYCyAEgAiACKALMASICQQFqNgLMASAEIAJBAnRqIAE2AgAgBygCECICKALIASACKALMAUECdGpBADYCACABIAFBMGsiBSABKAIAQQNxQQJGGygCKCgCECICKALAASACKALEASICQQFqIAJBAmoQ2gEhAiABIAUgASgCAEEDcUECRhsoAigoAhAgAjYCwAEgASAFIAEoAgBBA3FBAkYbKAIoKAIQIgQgBCgCxAEiAkEBajYCxAEgBCgCwAEgAkECdGogATYCACABIAUgASgCAEEDcUECRhsoAigoAhAiAigCwAEgAigCxAFBAnRqQQA2AgAgAyABEDAhAQwBCwsgAyAHEB0hBwwBCwsgA0EBIBAgAEGnhwEQJyICBH8gAhCRAgVBfwsQ/w4aIAAoAhBC/////3c3A+gBQQAhBwJAIAlBAkgNACAJQQFqIgIQnwghB0EBIQEDQCABIAJGDQEgByABQQJ0akH/////BzYCACABQQFqIQEMAAsACyAAEBwhCANAIAgEQCAIEIYCIQIgCCgCECIBIAIoAhAoAqQBKAIQIgIoAvQBIgU2AvQBIAUgACgCECIEKALsAUoEQCAEIAU2AuwBCyAFIAQoAugBSARAIAQgBTYC6AELIAcEQCABIAIoApABIgI2ApABIAcgAkECdGoiAiACKAIAIgIgBSACIAVIGzYCAAsgACAIEB0hCAwB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IAFCADcDECABQgA3AwggASAANgIcIAFBCGpBBBAmIQAgASgCCCAAQQJ0aiABKAIcNgIAIAFBHGohCkH/////ByEEA0AgASgCEARAIAFBCGogCkEEEL4BQQAhACABKAIcIQcDQCAHKAIQIgIoAsgBIABBAnRqKAIAIgMEQCADQVBBACADKAIAQQNxIgtBAkcbaigCKCIMKAIQIg0oArACIQYCQCADKAIQIg4oAqQBQQBIBEAgBiAITCAGIAlOcQ0BIA0oAvQBIANBMEEAIAtBA0cbaigCKCgCECgC9AEgDigCrAFqayICIAQgBUUgAiAESHIiAhshBCADIAUgAhshBQwBCyAGIAIoArACTg0AIAEgDDYCHCABQQhqQQQQJiECIAEoAgggAkECdGogASgCHDYCAAsgAEEBaiEADAEFQQAhACAEQQBMDQMDQCACKAKYAiAAQQJ0aigCACIDRQ0EIANBMEEAIAMoAgBBA3FBA0cbaigCKCIDKAIQKAKwAiACKAKwAkgEQCABIAM2AhwgAUEIakEEECYhAiABKAIIIAJBAnRqIAEoAhw2AgAgBygCECECCyAAQQFqIQAMAAsACwALAAsLDAELIAQoAhAiACgCsAIhCCAAKAKsAiEJIAFBADYCGCABQgA3AxAgAUIANwMIIAEgBDYCHCABQQhqQQQQJiEAIAEoAgggAEECdGogASgCHDYCACABQRxqIQpB/////wchBANAIAEoAhAEQCABQQhqIApBBBC+AUEAIQAgASgCHCEHA0AgBygCECICKALAASAAQQJ0aigCACIDBEAgA0EwQQAgAygCAEEDcSILQQNHG2ooAigiDCgCECINKAKwAiEGAkAgAygCECIOKAKkAUEASARAIAYgCEwgBiAJTnENASADQVBBACALQQJHG2ooAigoAhAoAvQBIA0oAvQBIA4oAqwBamsiAiAEIAVFIAIgBEhyIgIbIQQgAyAFIAIbIQUMAQsgBiACKAKwAk4NACABIAw2AhwgAUEIakEEECYhAiABKAIIIAJBAnRqIAEoAhw2AgALIABBAWohAAwBBUEAIQAgBEEATA0DA0AgAigCoAIgAEECdGooAgAiA0UNBCADQVBBACADKAIAQQNxQQJHG2ooAigiAygCECgCsAIgAigCsAJIBEAgASADNgIcIAFBCGpBBBAmIQIgASgCCCAC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4woQwgEQcQtBkOMKECQEQCAAQeDjCigCACgCFEGQ4woQwgEQcQtBsOMKECQEQCAAQeDjCigCACgCHEGw4woQwgEQiwYLQcDjChAkBEAgAEHg4wooAgAoAiRBwOMKEMIBEHELQdDjChAkBEAgAEHg4wooAgAoAiBB0OMKEMIBEHELQYilCkKAgICAgICA+D83AwBB+KQKQoCAgICAgID4PzcDAEHopApCgICAgICAgPg/NwMAQeCkCkKAgICAgICA+D83AwBByKQKQoCAgICAgID4PzcDAEHApApCgICAgICAgPg/NwMAQYjkCkIANwMAQfjjCkIANwMAQZzkCkEANgIAQZTkCkEANgIAC30AIAAoAhAoAgghAEHw4goQJARAIABB4OMKKAIAKAIIQfDiChDCARBxC0Gw4woQJARAIABB4OMKKAIAKAIMQbDjChDCARCLBgtBgKUKQoCAgICAgID4PzcDAEHwpApCgICAgICAgPg/NwMAQZjkCkEANgIAQZDkCkEANgIAC3MAIAAoAhAoAggiAEHg4wooAgAoAgBB8OIKEMIBEHEgACgCECgCDARAIABB4OMKKAIAKAIEQbDjChDCARBxC0HYpApCgICAgICAgPg/NwMAQbikCkKAgICAgICA+D83AwBBhOQKQQA2AgBB9OMKQQA2AgALxAMBBH8jAEEQayIDJAAgACgCECgCCCEBQeTjCigCAEUEQEHs4wpBoAI2AgBB6OMKQaECNgIAQeTjCkHw7wkoAgA2AgALIAEoAkwiAigCBCEEIAJB5OMKNgIEAkACQAJAAkACQAJAIAAoAkAOBwEBBAACAgIDCyAAIAEgAEEBEMcIDAQLIAAtAJsBQQhxDQMgASAAENUIDAMLQeDiChAkBEBB4OMKKAIAKAIAIgJFBEAgAUEAQcHDARCIASECQeDjCigCACACNgIACyABIAJB4OIKEMIBEHELIAEoAhAoAgwEQCABQeDjCigCACgCBEGg4woQwgEQiwYLQQAhAiABQb7jAEHg4wooAgAoAiwQkAcDQCACQQhGRQRAIAJBBHRB4OIKahBcIAJBAWohAgwBCwtB4OMKKAIAEBhB0KQKQoCAgICAgID4PzcDAEGwpApCgICAgICAgPg/NwMAQYDkCkEANgIAQfDjCkEANgIAIAAtAJsBQQhxDQIgASAAENUIDAILIANB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IAUoAggoAghB4IYKRwRAIAQgATYCGCAGIQMLIAFBACAEQegAaiACIAQtAGcgAxCWBEUNASABIAIQ3wkMAQsgASAGIARB6ABqIANB6cUBIAMbIgMgBC0AZ0EAEJYERQ0AIAEQISEBIAQgAzYCCCAEIAI2AgQgBCABNgIAQd+9BCAEECoLIARBADYCjAEgACAEQegAakEoEB8aCyAEQZABaiQACxoAIAAoAhAoAgwiAARAIAAoAiwQGCAAEBgLC6kFAgR8CH9BMBBSIQYgACgCECgCCCgCCCgCBCEKAnwgAEHU2wooAgBE////////739EexSuR+F6hD8QTCAAQdDbCigCAET////////vf0R7FK5H4XqUPxBMIgEQKSICvUL/////////9/8AUiABvUL/////////9/8AUnJFBEAgACgCECIFQpqz5syZs+bUPzcDICAFQpqz5syZs+bUPzcDKETNzMzMzMwMQAwBCyACRGEyVTAqqTM/ECMhASAAKAIQIgUgASACIAJEAAAAAAAAAABkGyIBOQMgIAUgATkDKCABRAAAAAAAAFJAogshA0EBIQtBASAAQYjcCigCACAKQQAQYiIHIAdBAU0bIAdBAEcgAEG83AooAgBEAAAAAAAA8D9EAAAAAAAAAAAQTCIERAAAAAAAAAAAZHEiCmoiBUEBdEEQEBoiCCADRAAAAAAAAOA/oiICOQMYIAggAjkDECAIIAKaIgE5AwggCCABOQMAQQIhCQJAIAdBAkkEQCACIQEMAQsgAiEBA0AgByALRkUEQCAIIAlBBHRqIgwgAUQAAAAAAAAQQKAiAZo5AwggDCACRAAAAAAAABBAoCICmjkDACAMIAI5AxAgDCABOQMYIAtBAWohCyAJQQJqIQkMAQsLIAIgAqAhAwsgCkUgBSAHTXJFBEAgCCAJQQR0aiIFIAREAAAAAAAA4D+iIgQgAaAiATkDGCAFIAQgAqAiAjkDECAFIAGaOQMIIAUgApo5AwALIAZCADcDECAGQQI2AgggBiAHNgIEIAZBATYCACAGIAg2AiwgBkIANwMYIAZCADcDICAAKAIQIgAgAiACoEQAAAAAAABSQKMiATkDcCAAIAE5A2ggACADRAAAAAAAAFJAoyIBOQMoIAAgATkDICAAIAY2AgwLwQMCBH8CfCMAQdAAayIBJAAgABAtKAIQKAJ0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IAMgBBCIBSAFQQhqIgUgBkkNAAwDCwALA0AgAS0ANg0CIAEoAiRBAUYEQCABKAIYQQFGDQMLIAUgASACIAMgBBCIBSAFQQhqIgUgBkkNAAsMAQsgASACNgIUIAEgASgCKEEBajYCKCABKAIkQQFHDQAgASgCGEECRw0AIAFBAToANgsLcAECfyAAIAEoAghBABDbAQRAIAEgAiADEO8GDwsgACgCDCEEIABBEGoiBSABIAIgAxCyCgJAIARBAkkNACAFIARBA3RqIQQgAEEYaiEAA0AgACABIAIgAxCyCiABLQA2DQEgAEEIaiIAIARJDQALCwszACAAIAEoAghBABDbAQRAIAEgAiADEO8GDwsgACgCCCIAIAEgAiADIAAoAgAoAhwRBwALGgAgACABKAIIQQAQ2wEEQCABIAIgAxDvBgsLgwUBBn8jAEFAaiIEJAACf0EBIAAgAUEAENsBDQAaQQAgAUUNABojAEEQayIGJAAgBiABKAIAIgNBCGsoAgAiBTYCDCAGIAEgBWo2AgQgBiADQQRrKAIANgIIIAYoAggiA0Ho6AlBABDbASEFIAYoAgQhBwJAIAUEQCAGKAIMIQEjAEFAaiIDJAAgA0FAayQAQQAgByABGyEDDAELIAMhBSMAQUBqIgMkACABIAdOBEAgA0IANwIcIANCADcCJCADQgA3AiwgA0IANwIUIANBADYCECADQejoCTYCDCADIAU2AgQgA0EANgI8IANCgYCAgICAgIABNwI0IAMgATYCCCAFIANBBGogByAHQQFBACAFKAIAKAIUEQsAIAFBACADKAIcGyEICyADQUBrJAAgCCIDDQAjAEFAaiIDJAAgA0EANgIQIANBuOgJNgIMIAMgATYCCCADQejoCTYCBEEAIQEgA0EUakEAQScQOBogA0EANgI8IANBAToAOyAFIANBBGogB0EBQQAgBSgCACgCGBEKAAJAAkACQCADKAIoDgIAAQILIAMoAhhBACADKAIkQQFGG0EAIAMoAiBBAUYbQQAgAygCLEEBRhshAQwBCyADKAIcQQFHBEAgAygCLA0BIAMoAiBBAUcNASADKAIkQQFHDQELIAMoAhQhAQsgA0FAayQAIAEhAwsgBkEQaiQAQQAgA0UNABogBEEIakEAQTgQOBogBEEBOgA7IARBfzYCECAEIAA2AgwgBCADNgIE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KAIIEPgGIghBf0YNBCAGIAcoAgBrIAhJDQYDQCAIBEAgAi0AACEFIAcgBygCACIJQQFqNgIAIAkgBToAACAIQQFrIQggAkEBaiECDAELCyAEIAQoAgBBBGoiAjYCACACIQgDQCADIAhGBEAgAyEIDAULIAgoAgBFDQQgCEEEaiEIDAALAAsgBCACNgIADAMLIAQoAgALIANHIRAMAwsgBygCACEFDAELC0ECIRALIA9BEGokACAQCwkAIAAQ4QoQGAszACMAQRBrIgAkACAAIAQ2AgwgACADIAJrNgIIIABBDGogAEEIahCvCygCACAAQRBqJAALNAADQCABIAJGRQRAIAQgAyABLAAAIgAgAEEASBs6AAAgBEEBaiEEIAFBAWohAQwBCwsgAQsMACACIAEgAUEASBsLKgADQCABIAJGRQRAIAMgAS0AADoAACADQQFqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQbClCRCgCgseACABQQBOBH9BsKUJKAIAIAFBAnRqKAIABSABC8ALDwAgACABIAJBpJkJEKAKCx4AIAFBAE4Ef0GkmQkoAgAgAUECdGooAgAFIAELwAsJACAAENcKEBgLNQADQCABIAJGRQRAIAQgASgCACIAIAMgAEGAAUkbOgAAIARBAWohBCABQQRqIQEMAQsLIAELDgAgASACIAFBgAFJG8ALKgADQCABIAJGRQRAIAMgASwAADYCACADQQRqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQbClCRCfCgseACABQf8ATQR/QbClCSgCACABQQJ0aigCAAUgAQsLDwAgACABIAJBpJkJEJ8KCx4AIAFB/wBNBH9BpJkJKAIAIAFBAnRqKAIABSABCws6AANAAkAgAiADRg0AIAIoAgAiAEH/AEsNACAAQQJ0QYC0CWooAgAgAXFFDQAgAkEEaiECDAELCyACCzoAA0ACQCACIANGDQAgAigCACIAQf8ATQRAIABBAnRBgLQJaigCACABcQ0BCyACQQRqIQIMAQsLIAILSQEBfwNAIAEgAkZFBEBBACEAIAMgASgCACIEQf8ATQR/IARBAnRBgLQJaigCAAVBAAs2AgAgA0EEaiEDIAFBBGohAQwBCwsgAQslAEEAIQAgAkH/AE0EfyACQQJ0QYC0CWooAgAgAXFBAEcFQQALCwkAIAAQ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AkAgAEH8AWogAEH4AWoQWw0AIAAoArABIAEQJSACakYEQCABECUhAyABIAEQJUEBdBBBIAEgARBVEEEgACADIAFBABBDIgJqNgKwAQsgAEH8AWoiAxCDASAAQQdqIABBBmogAiAAQbABaiAALADPASAALADOASAAQcABaiAAQRBqIABBDGogAEEIaiAAQdABahCIBw0AIAMQlgEaDAELCwJAIABBwAFqECVFDQAgAC0AB0EBRw0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCsAEgBBCPCzgCACAAQcABaiAAQRBqIAAoAgwgBBCvASAAQfwBaiAAQfgBahBbBEAgBCAEKAIAQQJyNgIACyAAKAL8ASABEDUaIABBwAFqEDUaIABBgAJqJAALjwMBAX8jAEGAAmsiACQAIAAgAjYC+AEgACABNgL8ASADEKgCIQYgAEHEAWogAyAAQfcBahClBCAAQbgBahBUIgEgARBVEEEgACABQQAQQyICNgK0ASAAIABBEGo2AgwgAEEANgIIA0ACQCAAQfwBaiAAQfgBahBbDQAgACgCtAEgARAlIAJqRgRAIAEQJSEDIAEgARAlQQF0EEEgASABEFUQQSAAIAMgAUEAEEMiAmo2ArQBCyAAQfwBaiIDEIMBIAYgAiAAQbQBaiAAQQhqIAAsAPcBIABBxAFqIABBEGogAEEMakHAsQkQ2QMNACADEJYBGgwBCwsCQCAAQcQBahAlRQ0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCtAEgBCAGEJALNwMAIABBxAFqIABBEGogACgCDCAEEK8BIABB/AFqIABB+AFqEFsEQCAEIAQoAgBBAnI2AgALIAAoAvwBIAEQNRogAEHEAWoQNRogAEGAAmokAAuPAwEBfyMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIAMQqAIhBiAAQcQBaiADIABB9wFqEKUEIABBuAFqEFQiASABEFUQQSAAIAFBABBDIgI2ArQBIAAgAEEQajYCDCAAQQA2AggDQAJAIABB/AFqIABB+AFqEFsNACAAKAK0ASABECUgAmpGBEAgARAlIQMgASABECVBAXQQQSABIAEQVRBBIAAgAyABQQAQQyICajYC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AjgCQCABQeIlQQBBARA2BEAgASgCECgCCA0BCyACLQCbAUEEcQ0AQZqwBEEAEDdBfyEBDAELAkAgBQRAIAVBgCAQTyIGNgIAIAYNAQtBwf4AQQAQN0F/IQEMAQsgAkKAIDcCLCACIAY2AiggACABEJ8GIQEgAhCHBCABRQRAIAUgAigCKDYCACADIAIoAjA2AggLIAAQlQQLIARBEGokACADKAIMIQACQCABRQRAIAAhBwwBCyAAEBgLIANBEGokACAHCwsAEPYMELwMEJMKCzUAIAFB4iVBAEEBEDYEQCABKAIQKAKUASIABEAgASAAEQEAIAEoAhBBADYClAELIAEQ0wkLCwsAIAAgASACEJQGCwwAIAAQlwYgABCWBgsFABCVBgsHACAAELkBCwsAIAAgASACEJAHCw0AIAAgASACQQIQ4wYLDQAgACABIAJBARDjBgsNACAAIAEgAkEAEOMGCwsAIAAgAUEBEJIBCxwAIAAgACABQQEQjQEgACACQQEQjQFBAEEBEF4LCwAgACABQQEQjQELCwAgACABQQEQjAELCwAgACABQQAQjAELCQAgACABENUCCwkAIAAgARCsAQs2AQF/QQBBAUHC8ABBvdEBELUFGhD2DBC8DBCTCiAAENwNA0BBABDcDSIBBEAgARC5AQwBCwsLRwEBfyMAQRBrIgMkACADQQA7AA0gA0EAOgAPIANBAkEAIAIbIAFyOgAMIAMgAygCDDYCCCAAIANBCGpBABDjASADQRBqJAALsAMCBX8BfiMAQRBrIgMkACADQQA2AgwCfxCVBiEEIwBB4ABrIgEkACABQgA3A1ggAUIANwNQIAFCADcDSAJAAkACf0EAIABFDQAaAkADQCACQQVHBEAgACACQQJ0QbCWBWooAgAQLkUNAiACQQFqIQIMAQsLIAEgADYCAEHu+wQgARA3QQAMAQsgBCACQQJ0aigCQCECIAFCADcDQEEAIQADQCACBEAgAUE4aiACKAIEQToQ0AECQCAABEAgASABKQNANwMoIAEgASkDODcDICABQShqIAFBIGoQ+gYNAQsgASgCOCIARQ0EIAAgASgCPCIAEJACIgVFDQUgASAFNgJcIAFByABqQQQQJiEAIAEoAkggAEECdGogASgCXDYCAAsgASABKQM4IgY3A0AgBqchACACKAIAIQIMAQsLIAFB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iAFqQQAQGUECdGogAygCuAEQzgwEQCADIAMpA7gBNwOAASADIAMpA7ABNwN4IAchAiADKAKwASADQfgAakEAEBlBAnRqIAMoArgBENAMIgsNAUEAIQtBouwDQQAQKkEAIQIDQCACIAMoArgBTw0FIAMgAykDuAE3A1AgAyADKQOwATcDSCADQcgAaiACEBkhBAJAAkACQCADKALAASIFDgICAAELIAMoArABIARBAnRqKAIAEBgMAQsgAygCsAEgBEECdGooAgAgBREBAAsgAkEBaiECDAALAAsCQCAMDQAgA0GYAWogABD9AiAAQQhBCBDqBSECQcTtA0EAECogASsDACINIAK3Ig5mIA4gASsDCCIPZXIEQCADQUBrIA85AwAgAyANOQM4IAMgAjYCMEHj8AQgA0EwahCAAQwBCyADKwOYASIOIA1lIAMrA6ABIhAgD2VyRQ0AIAMgDzkDKCADIA05AyAgAyAQOQMYIAMgDjkDEEGV8QQgA0EQahCAAQtBACECA0AgAiADKAK4AU8NBCADIAMpA7gBNwMIIAMgAykDsAE3AwAgAyACEBkhBAJAAkACQCADKALAASIFDgICAAELIAMoArABIARBAnRqKAIAEBgMAQsgAygCsAEgBEECdGooAgAgBREBAAsgAkEBaiECDAALAAsDQCACRQRAQQAhAgNAIAIgAygCuAFPDQYgAyADKQO4ATcDYCADIAMpA7ABNwNYIANB2ABqIAIQGSEEAkACQAJAIAMoAsABIgUOAgIAAQsgAygCsAEgBEECdGooAgAQGAwBCyADKAKwASAEQQJ0aigCACAFEQEACyACQQFqIQIMAAsACyACKAIQIANBmAFqIAIgC0EAEMUMIAMpA5gBNwOQASADKAK4AUEATgRAIANBsAFqQQQQjAIgAyADKQO4ATcDcCADIAMpA7ABNwNoIAIgAygCsAEgA0HoAGpBABAZQQJ0aiADKAK4AUEAEMQMIAIoAhAoArABIQIMAQsLQYnNAUGDugFBggJBzDAQAAALQYnNAUGDugFB4QFBzDAQAAALIAAgChAdIQoMBQtBASEMCyADQbABaiICQQQQMSACEDQLIAAgBxAwIQcMAAsACwsgCwRAIAsQzwwLIANB0AFqJAAgDAtbAQJ/IAAQHCEBA0AgAQRAIAAgARAsIQIDQCACBEAgAhDAAiAA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AAAAUkCjoDkDMCAEIAUrAzhEAAAAAAAAUkCjIAOhOQM4CyAAIAQ2AiQgACAGKAIMIgE2AiAgBCABIAAgAEEQahDnDEEACyAGQRBqJAALEQAgACABQeD+CkHc/goQ5QYLLQECfUF/IAIgACgCAEECdGoqAgAiAyACIAEoAgBBAnRqKgIAIgReIAMgBF0bCxIAIABBNGoQ9QMgAEEoahD1AwsJACAAEJINEBgLGQECfiAAKQMIIgIgASkDCCIDViACIANUawsdACAAKAIAQQR2IgAgASgCAEEEdiIBSyAAIAFJawtEAgF/AnwgACgCBCgCBCABKAIEKAIERgRAIAAoAgBFIAEoAgBBAEdxDwsgACsDECIDIAErAxAiBGQEf0EABSADIARjCwsJACAAEKENEBgLCQAgABDsBxAYC4kIAgl/AnwjAEGgAWsiAyQAIAAQog0gA0EANgKcASAAQQRqIQcgAEEkaiEEAkACQAJAA0AgBCgCACECRP///////+9/IQogBCgCBCIFIQEDfCACIAVGBHwgCkRIr7ya8td6vmNFIAEgBUZyRQRAIAEgBCgCBEEEaygCADYCACAEIAQoAgRBBGs2AgQLIAoFIAogAigCACIGELUCIgtkBEAgAyAGNgKcASALIQogAiEBCyACQQRqIQIMAQsLREivvJry13q+YwRAIAMoApwBIgItABxBAUYNAiADIAIoAgAoAiAiATYCBCADIAIoAgQiBigCICIFNgKYASABIAVHBEAgASAFIAIQrw0MAgsgCEGRzgBODQMgAigCACEJIwBBEGsiBSQAIAEgASgCACgCAEEAEOAFIAUgASAGIAlBAEEAQQAQ8AcgBSgCCCEGIAVBEGokACABIANBBGoiBSADQZgBaiAGEO8HIAFBAToAKCADIAY2AhAgBCADQRBqIgEQwAEgAygCBCADKAKYASACEK8NIAEgByAFEPYDIAhBAWohCAwBCwsgBxDeBUEAIQEDQCABIAAoAhxPDQMgAUECdCABQQFqIQEgACgCGGooAgAiBBC1AkRIr7ya8td6vmNFDQALIANBEGoiAUHIlAk2AjggAUG0lAk2AgAgAUHUlAkoAgAiADYCACABIABBDGsoAgBqQdiUCSgCADYCACABIAEoAgBBDGsoAgBqIgJBADYCFCACIAFBBGoiADYCGCACQQA2AgwgAkKC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ACxBAXEEQCACQQFxRQ0CIAErABAiESADKwAQIhJjDQIgESASZA0BIAErABgiESADKwAYIhJjDQIgESASZCECCyACDQIgAS0AVCECIAMtAFRBAXEEQCACQQFxRQ0CIAErADgiESADKwA4IhJjDQIgESASZA0BIAErAEAiESADKwBAIhJjDQIgESASZCECCyACDQIgBygCECgCpAFBwAFxIgEgACgCECgCpAFBwAFxIgJJDQEgASACSw0AQX8hAiAHKAIAQQR2IgEgACgCAEEEdiIASQ0CIAAgAUkhAgwCC0EBIQIMAQtBfyECCyAFQbAEaiQAIAILQAICfAF/IAArAwAiAiABKwMAIgNkBEAgACsDCCABKwMIZUUPCyACIANjBH9BAEF/IAArAwggASsDCGYbBUEACwv0AgEJfyMAQRBrIgYkACAAKAIwIQEjAEEQayIDJAADQAJAQQAhByACIAEoAgBPDQADQCACQQV0IgUgASgCBGoiCEEIaiEEIAgoABAgB00EQCAEQQQQMSABKAIEIAVqQQhqEDQgAkEBaiECDAMFIAMgBCkCCDcDCCADIAQpAgA3AwAgAyAHEBkhBAJAAkACQCABKAIEIAVqIgUoAhgiCA4CAgABCyAFKAIIIARBAnRqKAIAEBgMAQsgBSgCCCAEQQJ0aigCACAIEQEACyAHQQFqIQcMAQsACwALCyABKAIEEBggARAYIANBEGokACAAQRhqIQEDQCAAKAAgIAlLBEAgBiABKQIINwMIIAYgASkCADcDACAGIAkQGSECAkACQAJAIAAoAigiAw4CAgABCyABKAIAIAJBAnRqKAIAEBgMAQsgASgCACACQQJ0aigCACADEQEACyAJQQFqIQkMAQsLIAFBBBAxIAEQNCAAEBggBkEQaiQACxsBAnxBfyAAKwMAIgIgASsDACIDZCACIANjGwsPACAAKAIQEJkBGiAAEBgLIAECfEEBQX9BACAAKwMAIgIgASsDACIDYxsgAiADZBsLWgIBfAF/QX8gACsDCCABKwMIoSICREivvJry13o+ZCACREivvJry13q+YxsiAwR/IAMFQX8gACsDACABKwMAoSICREivvJry13o+ZCACREivvJry13q+YxsLC1oCAXwBf0F/IAArAwAgASsDAKEiAkRIr7ya8td6PmQgAkRIr7ya8td6vmMbIgMEfyADBUF/IAArAwggASsDCKEiAkRIr7ya8td6PmQgAkRIr7ya8td6vmMbCwuTAQEFfyMAQRBrIgIkACAAQQRqIQEDQCADIAAoAgxPRQRAIAIgASkCCDcDCCACIAEpAgA3AwAgAiADEBkhBAJAAkACQCAAKAIUIgUOAgIAAQsgASgCACAEQQJ0aigCABAYDAELIAEoAgAgBEECdGooAgAgBREBAAsgA0EBaiEDDAELCyABQQQQMSABEDQgAkEQaiQACyUAIAAoAgAoAhAoAvgBIgAgASgCACgCECgC+AEiAUogACABSGsLEgAgAUHatgEgAigCCEEBEDYaCxIAIAFB6bYBIAIoAgRBARA2GgsSACABQcq2ASACKAIAQQEQNhoLGQBBfyAAKAIAIgAgASgCACIBSyAAIAFJGwslACAAKAIAKAIQKAL0ASIAIAEoAgAoAhAoAvQBIgFKIAAgAUhrCyUAIAEoAgAoAhAoAvQBIgEgACgCACgCECgC9AEiAEogACABSmsLIwAgACgCECgCAEEEdiIAIAEoAhAoAgBBBHYiAUsgACABSWsLlQEBBH8jAEEQayIBJAAgAARAA0AgACgACCACTQRAIABBBBAxIAAQNAUgASAAKQIINwMIIAEgACkCADcDACABIAIQGSEDAkACQAJAIAAoAhAiBA4CAgABCyAAKAIAIANBAnRqKAIAEBgMAQsgACgCACADQQJ0aigCACAEEQEACyACQQFqIQIMAQsLCyAAEBggAUEQaiQACxQAIAAoAhBBHGogAEcEQCAAEBgLC44BAgF/BHwjAEEwayIDJAAgAyABKAIIIgQ2AiQgAyAENgIgIABBivwEIANBIGoQHiACKwMAIQUgAisDECEGIAIrAwghByACKwMYIQggAyABKAIINgIQIAMgCCAHoEQAAAAAAADgP6I5AwggAyAGIAWgRAAAAAAAAOA/ojkDACAAQbH5BCADEB4gA0EwaiQACwIAC90DAgF/AnwjAEGgAWsiBCQAAkACQCAABEAgAUUNASABKAIIRQ0CIAEoAkQEQCAEIAIpAwA3A2AgBCACKQMINwNoIAQgAikDGDcDiAEgBCACKQMQNwOAASAEIAQrA2giBTkDmAEgBCAEKwNgIgY5A3AgBCAEKwOAATkDkAEgBCAEKwOIATkDeCADBEBBACECIABBpssDQQAQHgNA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AzggBEIANwMwIABBh9MEIARBMGoQHiAEQfT8CigCAEECazYCICAEQgA3AxAgBEIANwMYIABBptQEIARBEGoQHiAEIAM2AgAgAEHAzgMgBBAeIAMQGAUgASAFQQR0aiIGKwMAIQggBisDCCEJIAArA/gDIQogACsDgAQhCyAEQgA3A4ABIAQgCSALoDkDeCAEIAggCqA5A3AgAEGZ3wEgBEHwAGoQHiAFQQFqIQUMAQsLCwUgASAFQQR0aiIHKwMAIQggBysDCCEJIAArA/gDIQogACsDgAQhCyAEIAAoAhArA6ABOQPoAiAEQgA3A+ACIAQgCSALoDkD2AIgBCAIIAqgOQPQAiAAQZCmBCAEQdACahAeIAVBAWohBQwBCwsgBEGgA2okAAupBQICfwl8IwBB8AJrIgMkACAAQe2uBBAbGkH0/ApB8PwKKAIAQQZrNgIAIAArA4AEIQwgACsD+AMhDSAAKAIQIgQrA6ABIQUgACsD6AMhBiABKwMAIQcgASsDECEIIAArA/ADIQogASsDCCELIAErAxghCSADQbgCaiIBIARBEGpBKBAfGiABQwAAAAAQvAMhASADQgA3A+gCIANCgICAgICAgPg/NwOgAiADQgA3A+ACIAMgBSAGIAggB6GiIgUgCiAJIAuhoiIIoCIJo0QAAAAAAADgP6JEAAAAAAAAFECiOQOoAiADQeACaiIEQfylBCADQaACahB0IAMgCDkDkAIgAyAJRAAAAAAAANA/ojkDiAIgAyAFOQOAAiAEQavTBCADQYACahB0IAMgACgC6AKyuzkD8AEgA0IANwPoASADQoCAgICAgKCrwAA3A+ABIARBh9MEIANB4AFqEHQgA0H0/AooAgA2AtABIAMgBiAHIA2goiIGOQPAASADIAogCyAMoKIiBzkDyAEgBEGm1AQgA0HAAWoQdCADIAE2ArABIARBwM4DIANBsAFqEHQgACAEEP8FEBsaIAEQGCACBEAgA0GIAWoiASAAKAIQQThqQSgQHxogAUMAAAAAELwDIQEgA0IANwOAASADQgA3A3ggA0IANwNwIABBs90EIANB8ABqEB4gA0KAgICAgICA+D83A2AgAyAIOQNYIAMgBTkDUCAAQavTBCADQdAAahAeIANBQGsgACgC6AKyuzkDACADQgA3AzggA0IANwMwIABBh9MEIANBMGoQHiADQfT8CigCADYCICADIAY5AxAgAyAHOQMYIABBptQEIANBEGoQHiADIAE2AgAgAEHAzgMgAxAeIAEQGAsgA0HgAmoQXCADQfACaiQAC+gDAgN/BnwjAEHQAWsiAyQAIAIoAgAhBCACKAIEIgUrAxAhBiADIAUoAgA2ArABIAMgBjkDqAEgAyAENgKgASAAQY/+AyADQaABahAeQfT8CkHw/AooAgBBCWs2AgACfCABKwMAIgYgAi0AMCIEQewARg0AGiAEQfIARgRAIAYgAisDIKEMAQsgBiACKwMgRAAAAAAAAOC/oqALIQYgACsD8AMhByAAKwOABCEIIAErAwghCSAAKwPoAyEKIAArA/gDIQsgA0H4AGoiASAAKAIQQRBqQSgQHxogAUMAAAAAELwDIQEgA0IANwPIASADQgA3A8ABIAIoAgQoAgAhBCACKAIAIQUgA0IANwNwIANCgICAgICAgOg/NwNoIAMgBTYCZCADIAQ2AmAgA0HAAWoiBEGX3AMgA0HgAGoQdCADIAIoAgQrAxAgACsD6AOiOQNQIARB7KUEIANB0ABqEHQgA0FAayAAKALoArK7OQMAIANCADcDOCADQgA3AzAgBEGH0wQgA0EwahB0IANB9PwKKAIANgIgIAMgCiAGIAugojkDECADIAcgCSAIoKI5AxggBEGm1AQgA0EQahB0IAMgATYCACAEQcDOAyADEHQgACAEEP8FEBsaIAQQXCABEBggA0HQAWokAAscACAAQYmyBBAbGkHw/ApB8PwKKAIAQQVqNgIACxwAIABB97EEEBsaQfD8CkHw/AooAgBBBWs2AgALCwAgAEGitAQQGxoLLQEBfyMAQRBrIgEkACABIAAoAhAoAggQITYCACAAQZyBBCABEB4gAUEQaiQACwsAIABB84cEEBsaCxwAIABB3ocEEBsaQfD8CkHw/AooAgBBAms2AgALCwAgAEHYswQQGxoLCwAgAEHGswQQGxoLpgICB38BfiMAQTBrIgQkACAEQQxqQQBBJBA4GiAEIAE2AhwgACABEG4hAgNAIAIEQCAAIAIgARByIAAgAkEAEM4IIQIMAQsLIAEpAwghCkEAIQFBACEDAkAgACgCMCICBEAgCqchBSACKAIAIgYEQEEBIAIoAgh0IQMLIANBAWshBwNAIAEgA0YNAgJAAkAgBiABIAVq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b3BlbkF0dHJpYnV0ZUVudGl0aWVzID09IG9wZW5FbnRpdHkAaW5maW5pdHkAbGlzdC0+c2l6ZSA8IGxpc3QtPmNhcGFjaXR5AHJldC5zaXplIDwgcmV0LmNhcGFjaXR5AGZhbnRhc3kAL3N2Zy9pdm9yeQBvdXQgb2YgbWVtb3J5AEZlYnJ1YXJ5AEphbnVhcnkAZ3ZwbHVnaW5fZG90X2xheW91dF9MVFhfbGlicmFyeQBndnBsdWdpbl9uZWF0b19sYXlvdXRfTFRYX2xpYnJhcnkAZ3ZwbHVnaW5fY29yZV9MVFhfbGlicmFyeQBnYXRoZXJfdGltZV9lbnRyb3B5AGNvcHkAYWxiYW55AEp1bHkAU3BhcnNlTWF0cml4X211bHRpcGx5AGVxdWFsbHkAYXNzZW1ibHkAc3VtbWVyc2t5AHNoeQBzYXRpc2Z5AGJlYXV0aWZ5AG5vanVzdGlmeQBDbGFzc2lmeQAvc3ZnL2xpZ2h0Z3JleQAvc3ZnL2RpbWdyZXkAL3N2Zy9kYXJrZ3JleQAvc3ZnL2xpZ2h0c2xhdGVncmV5AC9zdmcvZGFya3NsYXRlZ3JleQAvc3ZnL3NsYXRlZ3JleQB3ZWJncmV5AHgxMWdyZXkAL3N2Zy9ncmV5AG1vdmUgdG8gZnJvbnQgbG9jayBpbmNvbnNpc3RlbmN5AGV4dHJhY3RfYWRqYWNlbmN5AG1lcmdlX29uZXdheQBhcnJheQBhbGxvY0FycmF5AC9zdmcvbGlnaHRncmF5AC9zdmcvZGltZ3JheQAvc3ZnL2RhcmtncmF5AC9zdmcvbGlnaHRzbGF0ZWdyYXkAL3N2Zy9kYXJrc2xhdGVncmF5AC9zdmcvc2xhdGVncmF5AHdlYmdyYXkAeDExZ3JheQAvc3ZnL2dyYXkAVGh1cnNkYXkAVHVlc2RheQBXZWRuZXNkYXkAU2F0dXJkYXkAU3VuZGF5AE1vbmRheQBGcmlkYXkATWF5AC4uLy4uL2xpYi9jZ3JhcGgvZ3JhbW1hci55ACVtLyVkLyV5AHBvcnRob3l4AHBvcnRob195eAB4eHgAcHgAYm94AHZpZXdCb3gAY2hrQm91bmRCb3gAL01lZGlhQm94AGdldF9lZGdlX2xhYmVsX21hdHJpeABpZGVhbF9kaXN0YW5jZV9tYXRyaXgAbXVzdCBub3QgdW5kZWNsYXJlIHByZWZpeAB1bmJvdW5kIHByZWZpeABodG1sbGV4AG1heAAjJTAyeCUwMnglMDJ4ACMlMnglMnglMnglMngAIyUxeCUxeCUxeAAtKyAgIDBYMHgALTBYKzBYIDBYLTB4KzB4IDB4AHJhcnJvdwBsYXJyb3cASGVsdmV0aWNhLU5hcnJvdwBhcnJvd19sZW5ndGhfY3JvdwAvc3ZnL3Nub3cAc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nX3Nsb3cAL3N2Zy9saWdodHllbGxvdwAvc3ZnL2dyZWVueWVsbG93AC9zdmcvbGlnaHRnb2xkZW5yb2R5ZWxsb3cAL3N2Zy95ZWxsb3cAZmF0YWwgZXJyb3IgLSBzY2FubmVyIGlucHV0IGJ1ZmZlciBvdmVyZmxvdwBmbGV4IHNjYW5uZXIgcHVzaC1iYWNrIG92ZXJmbG93AGNvdXJpZXJuZXcAU3ByaW5nU21vb3RoZXJfbmV3AFRyaWFuZ2xlU21vb3RoZXJfbmV3AGRpYWdfcHJlY29uX25ldwBRdWFkVHJlZV9uZXcAU3RyZXNzTWFqb3JpemF0aW9uU21vb3RoZXIyX25ldwBuICYmIG5ldwBza2V3AHN0cnZpZXcAL3N2Zy9ob25leWRldwAgLWFuY2hvciB3AHNvcnR2AHBvdjpwb3YATm92AGludgBlcXVpdgBwaXYAbm9uYW1lLmd2AEdEX3JhbmsoZylbcl0uYXYgPT0gR0RfcmFuayhnKVtyXS52AGNjJXNfJXp1AGNjJXMrJXp1AC9zdmcvcGVydQBudQBtdQAlYyVsbHUAVGh1AHRhdQBUYXUATnUATXUAX3BvcnRfJXNfKCVkKV8oJWQpXyV1AE51bWJlciBvZiBpdGVyYXRpb25zID0gJXUATnVtYmVyIG9mIGluY3JlYXNlcyA9ICV1AHBsYWludGV4dABzdHJlc3N3dABpbnB1dAB0ZXh0bGF5b3V0AGRvdF9sYXlvdXQAbmVhdG9fbGF5b3V0AGluaXRMYXlvdXQAY2x1c3QAbWFwQ2x1c3QAbGFiZWxqdXN0AHNjQWRqdXN0AEF1Z3VzdABlZGdlc2ZpcnN0AG5vZGVzZmlyc3QAbWF4aW1hbF9pbmRlcGVuZGVudF9lZGdlX3NldF9oZWF2ZXN0X2VkZ2VfcGVybm9kZV9zdXBlcm5vZGVzX2ZpcnN0AGV4aXN0AHJlYWxpZ25Ob2RlbGlzdABhcHBlbmROb2RlbGlzdABzbG90X2Zyb21fY29uc3RfbGlzdABzbG90X2Zyb21fbGlzdABkZWZhdWx0ZGlzdABtaW5kaXN0AHBvd2VyX2Rpc3QAZ3JhcGhfZGlzdABhdmdfZGlzdABnZXRFZGdlTGlzdABpcXVlc3QAbG93YXN0AHNwcmluZ19lbGVjdHJpY2FsX2VtYmVkZGluZ19mYXN0AGd2X3NvcnQAdmlld3BvcnQAdGFpbHBvcnQAdW5leHBlY3RlZCBwYXJzZXIgc3RhdGUgLSBwbGVhc2Ugc2VuZCBhIGJ1ZyByZXBvcnQAaGVhZHBvcnQAaHRtbF9wb3J0AGluc2VydABSVHJlZUluc2VydABmaW5kU1ZlcnQAc3RhcnQAcGFydABlc3RpbWF0ZV90ZXh0X3dpZHRoXzFwdABxdW90AH9yb290AG5vdABtYWtlX3ZuX3Nsb3QAZW1pdF94ZG90AHhkb3Q6eGRvdABlcHM6eGRvdABzdmc6eGRvdABqcGc6eGRvdABwbmc6eGRvdABqcGVnOnhkb3QAZ2lmOnhkb3QAanBlOnhkb3QAeGRvdDEuNDp4ZG90AHhkb3QxLjI6eGRvdABzZG90AG1pZGRvdABndjpkb3QAcGxhaW4tZXh0OmRvdABkb3Q6ZG90AGVwczpkb3QAY2Fub246ZG90AHBsYWluOmRvdABzdmc6ZG90AGpwZzpkb3QAcG5nOmRvdABqcGVnOmRvdABnaWY6ZG90AGpwZTpkb3QAf2JvdABkb0RvdABzcGFuLT5mb250AHZhZ3hicHJpbnQAZW5kcG9pbnQAeGRvdF9wb2ludABkZWNpZGVfcG9pbnQAVW5zYXRpc2ZpZWQgY29uc3RyYWludAB0cmFuc3BhcmVudABjb21wb25lbnQAaW52YWxpZCBhcmd1bWVudABjb21tZW50AGp1bmsgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudABjZW50AGkgPT0gZWNudABhcmlhbG10AGdldF9oYXNoX3NlY3JldF9zYWx0AGNpcmN1aXQAcG9seV9pbml0AE11bHRpbGV2ZWxfaW5pdABuc2xpbWl0AG1jbGltaXQAUG9ydHJhaXQAbGlnaHQAdmlydHVhbF93ZWlnaHQAbGhlaWdodABLUF9SaWdodABCb29rbWFuLUxpZ2h0AGd0AEtQX0xlZnQAY2hhcnNldABpbnNldABiaXRhcnJheV9yZXNldABndl9hcmVuYV9yZXNldABzdWJzZXQAYml0YXJyYXlfc2V0AG1hdHJpeF9zZXQAc2NhcmxldAAvc3ZnL2Rhcmt2aW9sZXQAL3N2Zy9ibHVldmlvbGV0AC9zdmcvdmlvbGV0AFRyZWJ1Y2hldABhZ3hnZXQAdGFpbHRhcmdldABsYWJlbHRhcmdldABlZGdldGFyZ2V0AGhlYWR0YXJnZXQAYml0YXJyYXlfZ2V0AHN0eWxlc2hlZXQAc3RyaWN0AGFnY29weWRpY3QAYWdtYWtlZGF0YWRpY3QAcmVjLT5kaWN0ID09IGRhdGFkaWN0AHdyaXRlX2RpY3QAaGludGVyc2VjdABndmJpc2VjdABlbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIGRlY2xhcmF0aW9uIGlzIGluY29ycmVjdABhc3BlY3QAbGF5ZXJzZWxlY3QAS1BfU3VidHJhY3QAUXVhZFRyZWVfcmVwdWxzaXZlX2ZvcmNlX2ludGVyYWN0AGNvbXBhY3QAT2N0AHJlcXVlc3RlZCBmZWF0dXJlIHJlcXVpcmVzIFhNTF9EVEQgc3VwcG9ydCBpbiBFeHBhdABsYWJlbGZsb2F0AGxhYmVsX2Zsb2F0AFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfZm9ybWF0AC9zdmcvd2hlYXQAbW9uY2hhaW5zX2F0AFNhdABBZ3JhcGhpbmZvX3QAQWdlZGdlaW5mb190AEFnbm9kZWluZm9fdABcdAByb3cgPCBtZS0+bnJvd3MAbWludXMAb3BsdXMAcmFkaXVzAGhlYXJ0cwBzYW1wbGVwb2ludHMAZGlyZWRnZWNvbnN0cmFpbnRzAGxldmVsIGFzc2lnbm1lbnQgY29uc3RyYWludHMAeHkgcHNldWRvLW9ydGhvZ29uYWwgY29uc3RyYWludHMAeXggcHNldWRvLW9ydGhvZ29uYWwgY29uc3RyYWludHMAeHkgb3J0aG9nb25hbCBjb25zdHJhaW50cwB5eCBvcnRob2dvbmFsIGNvbnN0cmFpbnRzAGxpbmUgc2VnbWVudHMAc2V0X2NlbGxfaGVpZ2h0cwByZWN0cwBhY2NvdW50aW5nUmVwb3J0U3RhdHMAZW50aXR5VHJhY2tpbmdSZXBvcnRTdGF0cwBaYXBmRGluZ2JhdHMAcmVtaW5jcm9zcwBjb21wcmVzcwBndnVzZXJzaGFwZV9maWxlX2FjY2VzcwBicmFzcwBjbGFzcwBhcHBseWF0dHJzAGFnbWFrZWF0dHJzAGJpbmRhdHRycwBwYXJzZV9sYXllcnMAbWtDbHVzdGVycwByb3VuZF9jb3JuZXJzAG1ha2VfYmFycmllcnMAY2RhdGEubnRvcGxldmVsID09IGFnbm5vZGVzKGcpIC0gY2RhdGEubnZhcnMAY2Fubm90IHJlYWxsb2Mgb3BzAGNhbm5vdCByZWFsbG9jIHBubHBzAGVwcwBjb3JlX2xvYWRpbWFnZV9wcwBlcHM6cHMAcHMyOnBzAChsaWIpOnBzAGd2X3RyaW1femVyb3MAYWd4YnVmX3RyaW1femVyb3MAdGV4Z3lyZWhlcm9zAGltYWdlcG9zAHRpbm9zAHNldEVkZ2VMYWJlbFBvcwBTZXR0aW5nIGluaXRpYWwgcG9zaXRpb25zAHhsaW50ZXJzZWN0aW9ucwBjb2x1bW5zAGRlamF2dXNhbnMAbmltYnVzc2FucwBsaWJlcmF0aW9uc2FucwBmcmVlc2FucwBzZXRDaGlsZFN1YnRyZWVTcGFucwBPcGVuU2FucwBvZmZzZXQgPT0gbl90ZXJtcwBkaXRlbXMAZGlhbXMAY29sIDwgbWUtPm5jb2xzAGNhbm5vdCByZWFsbG9jIGRxLnBubHMAY2Fubm90IHJlYWxsb2MgcG5scwBsZXZlbHMAZm9yY2VsYWJlbHMAZGlhZ29uYWxzAG1lcmdlX3JhbmtzAHNwbGl0QmxvY2tzAGludmlzAGNhbm5vdCByZWFsbG9jIHRyaXMAc2V0X2NlbGxfd2lkdGhzAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzAHllcwBzaG93Ym94ZXMAYmVhdXRpZnlfbGVhdmVzAGF0dGFjaF9lZGdlX2xhYmVsX2Nvb3JkaW5hdGVzAHBvbHlsaW5lcwBzcGxpbmVzAG9ydGhvZ29uYWwgbGluZXMAdGV4Z3lyZXRlcm1lcwBvdGltZXMAVGltZXMAZm9udG5hbWVzAHByZWZpeCBtdXN0IG5vdCBiZSBib3VuZCB0byBvbmUgb2YgdGhlIHJlc2VydmVkIG5hbWVzcGFjZSBuYW1lcwBTcGFyc2VNYXRyaXhfc3VtX3JlcGVhdF9lbnRyaWVzAHBlcmlwaGVyaWVzAEdldEJyYW5jaGVzAGYgPCBncmFwaFtqXS5uZWRnZXMAbWlubWF4X2VkZ2VzAGV4Y2hhbmdlX3RyZWVfZWRnZXMAbWFrZVN0cmFpZ2h0RWRnZXMAdW5kb0NsdXN0ZXJFZGdlcwBjb21wb3VuZEVkZ2VzAG1lcmdlX3RyZWVzAF9fY2x1c3Rlcm5vZGVzAGFnbm5vZGVzAE5EX2lkKG5wKSA9PSBuX25vZGVzAExvYWROb2RlcwBzaWRlcwBzcGFkZXMAdmVydGljZXMAY29vcmRzAHNldGJvdW5kcwBtZHMAY2RzAG1ha2VTZWxmQXJjcwBlbWl0X2VkZ2VfZ3JhcGhpY3MAY2x1YnMAY29uc29sYXMAJWxmJTJzAApTdHJpbmcgc3RhcnRpbmc6PCUuODBzAApTdHJpbmcgc3RhcnRpbmc6IiUuODBzACAlLipzACVzJXMAZXhwYXQ6IEFjY291bnRpbmcoJXApOiBEaXJlY3QgJTEwbGx1LCBpbmRpcmVjdCAlMTBsbHUsIGFtcGxpZmljYXRpb24gJTguMmYlcwAlLipzJWMlcwAgJXM6JXMAX18lZDolcwAvJXMvJXMAJXMtJXMALCVzACBmb250LWZhbWlseT0iJXMAIiBzdHJva2UtZGFzaGFycmF5PSIlcwAiIGNsYXNzPSIlcwBwb2x5ICVzACgoJWYsJWYpLCglZiwlZikpICVzICVzAGNvbG9yICVzAHJvb3QgPSAlcwAgVGl0bGU6ICVzACJzdHJpY3QiOiAlcwBjb3VyAHV0cgBhcHBlbmRhdHRyAGFkZGF0dHIAYmVnaW5zdHIAZnN0cgBzdHJ2aWV3X3N0cgBwb3ZfY29sb3JfYXNfc3RyAHZwc2MhPW51bGxwdHIAYmVuZFRvU3RyAHVhcnIAY3JhcnIAbGFycgBoYXJyAGRhcnIAdUFycgByQXJyAGxBcnIAaEFycgBkQXJyAEFwcgBTcGFyc2VNYXRyaXhfbXVsdGlwbHlfdmVjdG9yAHRlcm1pbmF0b3IAaW5zdWxhdG9yAGludGVybmFsRW50aXR5UHJvY2Vzc29yAHRleGd5cmVjdXJzb3IAc3ludGF4IGVycm9yAG1vbmV5X2dldCBlcnJvcgBFcnJvcgByZmxvb3IAbGZsb29yAGxhYmVsZm9udGNvbG9yAHBlbmNvbG9yAGZpbGxjb2xvcgBiZ2NvbG9yAHJvdyBtYWpvcgBjb2x1bW4gbWFqb3IAbmVpZ2hib3IAc3R5bGVfb3IAbXIAcmFua2RpcgBwYWdlZGlyAGxheWVyAHVwcGVyID49IGxvd2VyAE5vZGVDb3ZlcgAvc3ZnL3NpbHZlcgBjbHVzdGVyAGV4cGFuZENsdXN0ZXIAcnByb21vdGVyAGxwcm9tb3RlcgBjZW50ZXIAbWF4aXRlcgBwYXJ0aWFsIGNoYXJhY3RlcgAhIHJvb3RQYXJzZXItPm1fcGFyZW50UGFyc2VyAGRrZ3JlZW5jb3BwZXIAY29vbGNvcHBlcgBndl9zb3J0X2NvbXBhcl93cmFwcGVyAHRhcGVyAG92ZXJsYXBfYmV6aWVyAGZpZ19iZXppZXIAY291cmllcgBDb3VyaWVyAGhpZXIAZGFnZ2VyAERhZ2dlcgBvdXRwdXRvcmRlcgBwb3N0b3JkZXIAZmxhdF9yZW9yZGVyAGNlbGxib3JkZXIAZml4TGFiZWxPcmRlcgBjeWxpbmRlcgAvc3ZnL2xhdmVuZGVyAHJlbmRlcgBmb2xkZXIAY2x1c3Rlcl9sZWFkZXIATkRfVUZfc2l6ZShuKSA8PSAxIHx8IG4gPT0gbGVhZGVyAE9jdG9iZXIAcmVmZXJlbmNlIHRvIGludmFsaWQgY2hhcmFjdGVyIG51bWJlcgBOb3ZlbWJlcgBTZXB0ZW1iZXIARGVjZW1iZXIAbWFjcgBicgBzdGFyAGZlbGRzcGFyAHJlZ3VsYXIAaW9zX2Jhc2U6OmNsZWFyAGJydmJhcgBNYXIAXHIATkRfcmFuayh2KSA9PSByAHN0cmVxAHN0cnZpZXdfZXEAc3Rydmlld19zdHJfZXEAc3Rydmlld19jYXNlX3N0cl9lcQBzdHJ2aWV3X2Nhc2VfZXEAdnAAJSVCZWdpblByb2xvZwovRG90RGljdCAyMDAgZGljdCBkZWYKRG90RGljdCBiZWdpbgoKL3NldHVwTGF0aW4xIHsKbWFyawovRW5jb2RpbmdWZWN0b3IgMjU2IGFycmF5IGRlZgogRW5jb2RpbmdWZWN0b3IgMAoKSVNPTGF0aW4xRW5jb2RpbmcgMCAyNTUgZ2V0aW50ZXJ2YWwgcHV0aW50ZXJ2YWwKRW5jb2RpbmdWZWN0b3IgNDUgL2h5cGhlbiBwdXQKCiUgU2V0IHVwIElTTyBMYXRpbiAxIGNoYXJhY3RlciBlbmNvZGluZwovc3Rhcm5ldElTTyB7CiAgICAgICAgZHVwIGR1cCBmaW5kZm9udCBkdXAgbGVuZ3RoIGRpY3QgYmVnaW4KICAgICAgICB7IDEgaW5kZXggL0ZJRCBuZSB7IGRlZiB9eyBwb3AgcG9wIH0gaWZlbHNlCiAgICAgICAgfSBmb3JhbGwKICAgICAgICAvRW5jb2RpbmcgRW5jb2RpbmdWZWN0b3IgZGVmCiAgICAgICAgY3VycmVudGRpY3QgZW5kIGRlZmluZWZvbnQKfSBkZWYKL1RpbWVzLVJvbWFuIHN0YXJuZXRJU08gZGVmCi9UaW1lcy1JdGFsaWMgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGQgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGRJdGFsaWMgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYSBzdGFybmV0SVNPIGRlZgovSGVsdmV0aWNhLU9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYS1Cb2xkIHN0YXJuZXRJU08gZGVmCi9IZWx2ZXRpY2EtQm9sZE9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXIgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXItT2JsaXF1ZSBzdGFybmV0SVNPIGRlZgovQ291cmllci1Cb2xkIHN0YXJuZXRJU08gZGVmCi9Db3VyaWVyLUJvbGRPYmxpcXVlIHN0YXJuZXRJU08gZGVmCmNsZWFydG9tYXJrCn0gYmluZCBkZWYKCiUlQmVnaW5SZXNvdXJjZTogcHJvY3NldCBncmFwaHZpeiAwIDAKL2Nvb3JkLWZvbnQtZmFtaWx5IC9UaW1lcy1Sb21hbiBkZWYKL2RlZmF1bHQtZm9udC1mYW1pbHkgL1RpbWVzLVJvbWFuIGRlZgovY29vcmRmb250IGNvb3JkLWZvbnQtZmFtaWx5IGZpbmRmb250IDggc2NhbGVmb250IGRlZgoKL0ludlNjYWxlRmFjdG9yIDEuMCBkZWYKL3NldF9zY2FsZSB7CiAgICAgICBkdXAgMSBleGNoIGRpdiAvSW52U2NhbGVGYWN0b3IgZXhjaCBkZWYKICAgICAgIHNjYWxlCn0gYmluZCBkZWYKCiUgc3R5bGVzCi9zb2xpZCB7IFtdIDAgc2V0ZGFzaCB9IGJpbmQgZGVmCi9kYXNoZWQgeyBbOSBJbnZTY2FsZUZhY3RvciBtdWwgZHVwIF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2RvdHRlZCB7IFsxIEludlNjYWxlRmFjdG9yIG11bCA2IEludlNjYWxlRmFjdG9yIG11bF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2ludmlzIHsvZmlsbCB7bmV3cGF0aH0gZGVmIC9zdHJva2Uge25ld3BhdGh9IGRlZiAvc2hvdyB7cG9wIG5ld3BhdGh9IGRlZn0gYmluZCBkZWYKL2JvbGQgeyAyIHNldGxpbmV3aWR0aCB9IGJpbmQgZGVmCi9maWxsZWQgeyB9IGJpbmQgZGVmCi91bmZpbGxlZCB7IH0gYmluZCBkZWYKL3JvdW5kZWQgeyB9IGJpbmQgZGVmCi9kaWFnb25hbHMgeyB9IGJpbmQgZGVmCi90YXBlcmVkIHsgfSBiaW5kIGRlZgoKJSBob29rcyBmb3Igc2V0dGluZyBjb2xvciAKL25vZGVjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2VkZ2Vjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2dyYXBoY29sb3IgeyBzZXRoc2Jjb2xvciB9IGJpbmQgZGVmCi9ub3Bjb2xvciB7cG9wIHBvcCBwb3B9IGJpbmQgZGVmCgovYmVnaW5wYWdlIHsJJSBpIGogbnBhZ2VzCgkvbnBhZ2VzIGV4Y2ggZGVmCgkvaiBleGNoIGRlZgoJL2kgZXhjaCBkZWYKCS9zdHIgMTAgc3RyaW5nIGRlZgoJbnBhZ2VzIDEgZ3QgewoJCWdzYXZlCgkJCWNvb3JkZm9udCBzZXRmb250CgkJCTAgMCBtb3ZldG8KCQkJKFwoKSBzaG93IGkgc3RyIGN2cyBzaG93ICgsKSBzaG93IGogc3RyIGN2cyBzaG93IChcKSkgc2hvdwoJCWdyZXN0b3JlCgl9IGlmCn0gYmluZCBkZWYKCi9zZXRfZm9udCB7CglmaW5kZm9udCBleGNoCglzY2FsZWZvbnQgc2V0Zm9udAp9IGRlZgoKJSBkcmF3IHRleHQgZml0dGVkIHRvIGl0cyBleHBlY3RlZCB3aWR0aAovYWxpZ25lZHRleHQgewkJCSUgd2lkdGggdGV4dAoJL3RleHQgZXhjaCBkZWYKCS93aWR0aCBleGNoIGRlZgoJZ3NhdmUKCQl3aWR0aCAwIGd0IHsKCQkJW10gMCBzZXRkYXNoCgkJCXRleHQgc3RyaW5nd2lkdGggcG9wIHdpZHRoIGV4Y2ggc3ViIHRleHQgbGVuZ3RoIGRpdiAwIHRleHQgYXNob3cKCQl9IGlmCglncmVzdG9yZQp9IGRlZgoKL2JveHByaW0gewkJCQklIHhjb3JuZXIgeWNvcm5lciB4c2l6ZSB5c2l6ZQoJCTQgMiByb2xsCgkJbW92ZXRvCgkJMiBjb3B5CgkJZXhjaCAwIHJsaW5ldG8KCQkwIGV4Y2ggcmxpbmV0bwoJCXBvcCBuZWcgMCBybGluZXRvCgkJY2xvc2VwYXRoCn0gYmluZCBkZWYKCi9lbGxpcHNlX3BhdGggewoJL3J5IGV4Y2ggZGVmCgkvcnggZXhjaCBkZWYKCS95IGV4Y2ggZGVmCgkveCBleGNoIGRlZgoJbWF0cml4IGN1cnJlbnRtYXRyaXgKCW5ld3BhdGgKCXggeSB0cmFuc2xhdGUKCXJ4IHJ5IHNjYWxlCgkwIDAgMSAwIDM2MCBhcmMKCXNldG1hdHJpeAp9IGJpbmQgZGVmCgovZW5kcGFnZSB7IHNob3dwYWdlIH0gYmluZCBkZWYKL3Nob3dwYWdlIHsgfSBkZWYKCi9sYXllcmNvbG9yc2VxCglbCSUgbGF5ZXIgY29sb3Igc2VxdWVuY2UgLSBkYXJrZXN0IHRvIGxpZ2h0ZXN0CgkJWzAgMCAwXQoJCVsuMiAuOCAuOF0KCQlbLjQgLjggLjhdCgkJWy42IC44IC44XQoJCVsuOCAuOCAuOF0KCV0KZGVmCgovbGF5ZXJsZW4gbGF5ZXJjb2xvcnNlcSBsZW5ndGggZGVmCgovc2V0bGF5ZXIgey9tYXhsYXllciBleGNoIGRlZiAvY3VybGF5ZXIgZXhjaCBkZWYKCWxheWVyY29sb3JzZXEgY3VybGF5ZXIgMSBzdWIgbGF5ZXJsZW4gbW9kIGdldAoJYWxvYWQgcG9wIHNldGhzYmNvbG9yCgkvbm9kZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZWRnZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZ3JhcGhjb2xvciB7bm9wY29sb3J9IGRlZgp9IGJpbmQgZGVmCgovb25sYXllciB7IGN1cmxheWVyIG5lIHtpbnZpc30gaWYgfSBkZWYKCi9vbmxheWVycyB7CgkvbXl1cHBlciBleGNoIGRlZgoJL215bG93ZXIgZXhjaCBkZWYKCWN1cmxheWVyIG15bG93ZXIgbHQKCWN1cmxheWVyIG15dXBwZXIgZ3QKCW9yCgl7aW52aXN9IGlmCn0gZGVmCgovY3VybGF5ZXIgMCBkZWYKCiUlRW5kUmVzb3VyY2UKJSVFbmRQcm9sb2cKJSVCZWdpblNldHVwCjE0IGRlZmF1bHQtZm9udC1mYW1pbHkgc2V0X2ZvbnQKJSAvYXJyb3dsZW5ndGggMTAgZGVmCiUgL2Fycm93d2lkdGggNSBkZWYKCiUgbWFrZSBzdXJlIHBkZm1hcmsgaXMgaGFybWxlc3MgZm9yIFBTLWludGVycHJldGVycyBvdGhlciB0aGFuIERpc3RpbGxlcgovcGRmbWFyayB3aGVyZSB7cG9wfSB7dXNlcmRpY3QgL3BkZm1hcmsgL2NsZWFydG9tYXJrIGxvYWQgcHV0fSBpZmVsc2UKJSBtYWtlICc8PCcgYW5kICc+Picgc2FmZSBvbiBQUyBMZXZlbCAxIGRldmljZXMKL2xhbmd1YWdlbGV2ZWwgd2hlcmUge3BvcCBsYW5ndWFnZWxldmVsfXsxfSBpZmVsc2UKMiBsdCB7CiAgICB1c2VyZGljdCAoPDwpIGN2biAoWykgY3ZuIGxvYWQgcHV0CiAgICB1c2VyZGljdCAoPj4pIGN2biAoWykgY3ZuIGxvYWQgcHV0Cn0gaWYKCiUlRW5kU2V0dXAAc3VwAGdyb3VwAGN1cAB0aGluc3AAZW5zcABlbXNwAG5ic3AAcGVycAB3ZWllcnAAZ2VuZXJhdGUtY29uc3RyYWludHMuY3BwAGJsb2NrLmNwcABjc29sdmVfVlBTQy5jcHAAf3RvcABwcm9wAGFneGJwb3AAbm9wAGFzeW1wAGNvbXAAZmluZENDb21wAGJtcABzY2FsZV9jbGFtcAB4bHAAbHAgIT0gY2xwAHRhaWxfbHAAaGVhZF9scAB0YWlsdG9vbHRpcABsYWJlbHRvb2x0aXAAZWRnZXRvb2x0aXAAaGVhZHRvb2x0aXAAaGVsbGlwAHRhaWxjbGlwAGhlYWRjbGlwAC9zdmcvcGFwYXlhd2hpcABocAB0cmFuc3Bvc2Vfc3RlcABjb21wdXRlU3RlcABsYXllcmxpc3RzZXAAbGF5ZXJzZXAAaXBzZXAAcmFua3NlcABub2Rlc2VwAHN1YmdyYXBocyBuZXN0ZWQgbW9yZSB0aGFuICVkIGRlZXAAU2VwAHNmZHAAY3AAd2VicABpZG1hcABjbHVzdGVyX21hcABjbWFweDptYXAAZXBzOm1hcABjbWFweF9ucDptYXAAaW1hcF9ucDptYXAAaXNtYXA6bWFwAGltYXA6bWFwAGNtYXA6bWFwAHN2ZzptYXAAanBnOm1hcABwbmc6bWFwAGpwZWc6bWFwAGdpZjptYXAAanBlOm1hcABvdmVybGFwAGxldmVsc2dhcABjYXAAS1BfVXAAJUk6JU06JVMgJXAAc3RhcnQgPD0gcAByc3F1bwBsc3F1bwByZHF1bwBsZHF1bwBiZHF1bwBzYnF1bwByc2FxdW8AbHNhcXVvAHJhcXVvAGxhcXVvAGF1dG8ATnVuaXRvAC9zdmcvdG9tYXRvAG5lYXRvAGV1cm8AL3N2Zy9nYWluc2Jvcm8ATWV0aG9kWmVybwBtaWNybwBuaW1idXNtb25vAGxpYmVyYXRpb25tb25vAGZyZWVtb25vAGFyaW1vAHJhdGlvAHBvcnRobwByaG8AUmhvAC9zdmcvaW5kaWdvAHBpbmZvAGNjZ3JhcGhpbmZvAGNjZ25vZGVpbmZvAGNsX2VkZ2VfaW5mbwBnZXRQYWNrSW5mbwBtYWtlSW5mbwBwYXJzZVBhY2tNb2RlSW5mbwBjaXJjbwBpY28AXCUwM28AL3N2Zy9yb3N5YnJvd24AL3N2Zy9zYW5keWJyb3duAHZlcnlkYXJrYnJvd24AL3N2Zy9zYWRkbGVicm93bgAvc3ZnL2Jyb3duAEtQX0Rvd24AY2Fubm90IGNoYW5nZSBzZXR0aW5nIG9uY2UgcGFyc2luZyBoYXMgYmVndW4AU3VuAEp1bgB0aG9ybgAvc3ZnL2NyaW1zb24AeGRvdF9qc29uAHhkb3RfanNvbjpqc29uAGpzb24wOmpzb24Ab21pY3JvbgBPbWljcm9uAHNjYXJvbgBTY2Fyb24Ad2VibWFyb29uAHgxMW1hcm9vbgAvc3ZnL21hcm9vbgAvc3ZnL2xpZ2h0c2FsbW9uAC9zdmcvZGFya3NhbG1vbgAvc3ZnL3NhbG1vbgB1cHNpbG9uAGVwc2lsb24AVXBzaWxvbgBFcHNpbG9uAHJlc29sdXRpb24AZGlzdG9ydGlvbgBzdGQ6OmV4Y2VwdGlvbgBwYXJ0aXRpb24AZG90X3Bvc2l0aW9uAFNldHRpbmcgdXAgc3RyZXNzIGZ1bmN0aW9uAHVuY2xvc2VkIENEQVRBIHNlY3Rpb24AcG9zdGFjdGlvbgByb3RhdGlvbgBvcmllbnRhdGlvbgBhYm9taW5hdGlvbgBhY2NvdW50aW5nR2V0Q3VycmVudEFtcGxpZmljYXRpb24AeGRvdHZlcnNpb24AU1RzZXRVbmlvbgA8cG9seWdvbgBoZXhhZ29uAHNlcHRhZ29uAHBlbnRhZ29uAHRyaXBsZW9jdGFnb24AZG91Ymxlb2N0YWdvbgAvc3ZnL2xlbW9uY2hpZmZvbgBNb24AcGx1c21uAG5vdGluAGlzaW4AL3N2Zy9tb2NjYXNpbgBwaW4AbWluAHZvcm9fbWFyZ2luAGluZmluAG9uZWRfb3B0aW1pemVyX3RyYWluAHBsYWluAG1ha2VfY2hhaW4AbWVyZ2VfY2hhaW4AZGVsZXRlTWluAGZpbmRNaW4AdmFsaWduAGJhbGlnbgB5ZW4ATXVsdGlsZXZlbF9jb2Fyc2VuAGN1cnJlbgBQb2Jzb3BlbgBndl9mb3BlbgBndnVzZXJzaGFwZV9vcGVuAGVudGl0eVRyYWNraW5nT25PcGVuAC9zdmcvbGluZW4AZGltZW4AbWlubGVuAHN0eWxlX3Rva2VuAHVuY2xvc2VkIHRva2VuAC9zdmcveWVsbG93Z3JlZW4AbWVkaXVtZm9yZXN0Z3JlZW4AL3N2Zy9mb3Jlc3RncmVlbgAvc3ZnL2xpZ2h0Z3JlZW4AaHVudGVyc2dyZWVuAC9zdmcvbGF3bmdyZWVuAC9zdmcvZGFya2dyZWVuAC9zdmcvbWVkaXVtc3ByaW5nZ3JlZW4AL3N2Zy9zcHJpbmdncmVlbgAvc3ZnL2RhcmtvbGl2ZWdyZWVuAC9zdmcvbGltZWdyZWVuAC9zdmcvcGFsZWdyZWVuAHdlYmdyZWVuAC9zdmcvbGlnaHRzZWFncmVlbgAvc3ZnL21lZGl1bXNlYWdyZWVuAC9zdmcvZGFya3NlYWdyZWVuAC9zdmcvc2VhZ3JlZW4AeDExZ3JlZW4AL3N2Zy9ncmVlbgBHcmVlbgAvc3ZnL2xpZ2h0Y3lhbgAvc3ZnL2RhcmtjeWFuAC9zdmcvY3lhbgBuZXd0YW4AZGFya3RhbgAvc3ZnL3RhbgByb3dzcGFuAGNvbHNwYW4AbmFuAHRpbWVzbmV3cm9tYW4AbmltYnVzcm9tYW4AdGltZXNyb21hbgBUaW1lcy1Sb21hbgBQYWxhdGluby1Sb21hbgBOZXdDZW50dXJ5U2NobGJrLVJvbWFuAEphbgBHRF9yYW5rKGcpW3JdLm4gPD0gR0RfcmFuayhnKVtyXS5hbgBhZ3hicHV0X24AXG4Abl9ub2RlcyA9PSBncmFwaC0+bgBBLT5tID09IEEtPm4Aam9iLT5vYmotPnUubgBuemMgPT0gKHNpemVfdCluAHMsJWxmLCVsZiVuACBlLCVsZiwlbGYlbgAlZCAlMVsiXSVuAHYgPT0gbgBiID09IG4AbmNsdXN0ZXIgPD0gbgBwc3ltAGFsZWZzeW0AdGhldGFzeW0AcXVhbnR1bQBzdW0AL3N2Zy9wbHVtAGludnRyYXBleml1bQBtZWRpdW0AOTpwcmlzbQBscm0AY3VzdG9tAGFwdHItPnRhZyA9PSBUX2F0b20AL2Rldi91cmFuZG9tAGd2X3JhbmRvbQBtbQBybG0Ac2ltAElNRFNfZ2l2ZW5fZGltAG9yZG0AY20AcGFyYWxsZWxvZ3JhbQAvc3ZnL21pbnRjcmVhbQBKdWwAdGwAZnJhc2wAU3ltYm9sAGZpbmRDb2wAPD94bWwAeXVtbAB1dW1sAG91bWwAaXVtbABldW1sAGF1bWwAWXVtbABVdW1sAE91bWwASXVtbABFdW1sAEF1bWwAY29yZV9sb2FkaW1hZ2VfdnJtbABqcGc6dnJtbABwbmc6dnJtbABqcGVnOnZybWwAZ2lmOnZybWwAanBlOnZybWwAYnVsbABmaWxsAC9zdmcvc2Vhc2hlbGwAZm9yYWxsAEFwcmlsAHBlcm1pbAByY2VpbABsY2VpbABjY2VkaWwAQ2NlZGlsAGFycm93dGFpbABsdGFpbABzYW1ldGFpbABsZXZlbCA+PSAwICYmIGxldmVsIDw9IG4tPmxldmVsAHN0cmVzc19tYWpvcml6YXRpb25fa0RfbWtlcm5lbABpc19wYXJhbGxlbABDYWxjdWxhdGluZyBjaXJjdWl0IG1vZGVsAENhbGN1bGF0aW5nIHN1YnNldCBtb2RlbABDYWxjdWxhdGluZyBNRFMgbW9kZWwAeGxhYmVsAHRhaWxsYWJlbABoZWFkbGFiZWwAZ3JhcGggbGFiZWwAaWV4Y2wAb2JqcC0+bGJsAG92YWwAbWVyZ2V2aXJ0dWFsAC9zdmcvbGlnaHRjb3JhbAAvc3ZnL2NvcmFsAFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfYXJyYXlzX2ludGVybmFsAE11bHRpbGV2ZWxfY29hcnNlbl9pbnRlcm5hbABRdWFkVHJlZV9hZGRfaW50ZXJuYWwAYXJyb3dfbGVuZ3RoX25vcm1hbABhcmlhbAByYWRpYWwAL3N2Zy90ZWFsAHJlYWwAbG9jYWwAZXN0aW1hdGVfY2hhcmFjdGVyX3dpZHRoX2Nhbm9uaWNhbABnbG9iYWwAcS0+bAAuLi8uLi9saWIvY2dyYXBoL3NjYW4ubAB0azp0awBnaWY6dGsAcGF0Y2h3b3JrAHRvawBib29rAEF2YW50R2FyZGUtQm9vawBzaW5rAG92ZXJsYXBfc2hyaW5rAHNwaWN5cGluawAvc3ZnL2hvdHBpbmsAL3N2Zy9saWdodHBpbmsAL3N2Zy9kZWVwcGluawBuZW9ucGluawAvc3ZnL3BpbmsAbmV3cmFuawBjbHVzdGVycmFuawBfbmV3X3JhbmsAaW5zdGFsbF9pbl9yYW5rAHJlbW92ZV9mcm9tX3JhbmsAL3N2Zy9jb3Juc2lsawBvbmVibG9jawB2LT5sZWZ0LT5ibG9jayA9PSB2LT5yaWdodC0+YmxvY2sAL3N2Zy9maXJlYnJpY2sAUFFjaGVjawBwYWNrAC9zdmcvYmxhY2sAQmxhY2sAYmFjawB6d2oAenduagBqb2ItPm9iagBnZXRpbnRyc3hpAHBzaQBQc2kAQ2FsaWJyaQBGcmkAdHdvcGkAZHBpAHZvcm9ub2kAVm9yb25vaQBjaGFuaQBkZW1pAEJvb2ttYW4tRGVtaQBBdmFudEdhcmRlLURlbWkAL3N2Zy9kYXJra2hha2kAL3N2Zy9raGFraQBwaGkAY2hpAFBoaQBDaGkAZGkAWGkAUGkATkRfaWQobnApID09IGkATl9JRFgocHEtPnBxW2ldKSA9PSBpAFN0cmVzc01ham9yaXphdGlvblNtb290aGVyX3Ntb290aABTcHJpbmdTbW9vdGhlcl9zbW9vdGgAYm90aABzdGFydHN3aXRoAGxpbmVsZW5ndGgAYmFkX2FycmF5X25ld19sZW5ndGgAYXZlcmFnZV9lZGdlX2xlbmd0aABldGgAcGVud2lkdGgAbHdpZHRoAHNldGxpbmV3aWR0aABzaG9ydHBhdGgAZm9udHBhdGgAUG9ic3BhdGgAYmVnaW5wYXRoAGltYWdlcGF0aABlbmRwYXRoAHN0cmFpZ2h0X3BhdGgAbWFwX3BhdGgAPHBhdGgAY2Fubm90IGZpbmQgdHJpYW5nbGUgcGF0aAAvc3ZnL2xhdmVuZGVyYmx1c2gAZmxlc2gAb3NsYXNoAE9zbGFzaABkdHN0cmhhc2gAc3RyZGljdF9oYXNoAG5kYXNoAG1kYXNoAGRpZ3JhcGgAc3ViZ3JhcGgAY29uc3RydWN0X2dyYXBoAGNoa1NncmFwaABjbG9zZXN0X3BhaXJzMmdyYXBoAGFnZGVsZXRlIG9uIHdyb25nIGdyYXBoAGNvbm5lY3RHcmFwaAB1cHNpaAAlc2xpbmUtdGhyb3VnaABjaGFuU2VhcmNoAFJUcmVlU2VhcmNoAE1hcmNoAERpc2NvbkJyYW5jaABQaWNrQnJhbmNoAEFkZEJyYW5jaAAuLi8uLi9saWIvdXRpbC9iaXRhcnJheS5oAC4uLy4uL2xpYi91dGlsL3N0cnZpZXcuaAAuLi8uLi9saWIvdXRpbC9zb3J0LmgALi4vLi4vbGliL2NncmFwaC9ub2RlX3NldC5oAC4uLy4uL2xpYi91dGlsL3N0cmVxLmgALi4vLi4vbGliL3V0aWwvc3RhcnRzd2l0aC5oAC4uLy4uL2xpYi91dGlsL2d2X21hdGguaAAuLi8uLi9saWIvdXRpbC9hZ3hidWYuaAAuLi8uLi9saWIvdXRpbC90b2tlbml6ZS5oAC4uLy4uL2xpYi91dGlsL2FsbG9jLmgAYXV4ZwBjb3JlX2xvYWRpbWFnZV9zdmcAc3ZnOnN2ZwBqcGc6c3ZnAHBuZzpzdmcAanBlZzpzdmcAZ2lmOnN2ZwBqcGU6c3ZnAHN2Z19pbmxpbmU6c3ZnAEF1ZwBkb1Byb2xvZwBwb3dlcl9pdGVyYXRpb25fb3J0aG9nAHBuZwBpZGVhbF9kaXN0X3NjaGVtZSB2YWx1ZSB3cm9uZwB4ZG90IHZlcnNpb24gIiVzIiB0b28gbG9uZwBjb25nAGxibGVuY2xvc2luZwBiYXNpY19zdHJpbmcAZmFpbHVyZSBtYWxsb2MnaW5nIGZvciByZXN1bHQgc3RyaW5nAHNwcmluZwBvcmRlcmluZwBnZW5lcmF0ZVJhbmRvbU9yZGVyaW5nAGFyaW5nAEFyaW5nAERhbXBpbmcAV2FybmluZwBvdmVybGFwX3NjYWxpbmcAeCBhbmQgeSBzY2FsaW5nAG9sZCBzY2FsaW5nAHNtb290aGluZwB1bmtub3duIGVuY29kaW5nAG11bHRpbGV2ZWxfc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nAHNwcmluZ19lbGVjdHJpY2FsX3NwcmluZ19lbWJlZGRpbmcAY2VsbHBhZGRpbmcAY2VsbHNwYWNpbmcAcmFuZwBsYW5nAGZpdmVwb3ZlcmhhbmcAdGhyZWVwb3ZlcmhhbmcAbm92ZXJoYW5nAGVtaXRfaHRtbF9pbWcAbGcAb3JpZwBzemxpZwBvZWxpZwBhZWxpZwBPRWxpZwBBRWxpZwBjb3JlX2xvYWRpbWFnZV9maWcAanBnOmZpZwBwbmc6ZmlnAGZpZzpmaWcAanBlZzpmaWcAZ2lmOmZpZwBqcGU6ZmlnAGVnZwBuZXh0X3NlZwByZWcAanBlZwBpID09IGRlZwBkZwBjZwBjbG9zZXN1YmcAbWlzbWF0Y2hlZCB0YWcAYmV6LT5zZmxhZwBiZXotPmVmbGFnACEqZmxhZwAhZmxhZwA8ZwAlLjVnLCUuNWcsJS41ZywlLjVnACUuNWcgJS41ZwAlZyAlZwBib3hJbnRlcnNlY3RmAGVwc2YAYWdlZGdlc2VxY21wZgBjY3dyb3RhdGVwZgBmbm9mAGluZgBzZWxmAGhhbGYAJWxmJWxmJWxmJWxmACVsZiwlbGYsJWxmLCVsZiwlbGYAJSpmICUqZiAlbGYgJWxmAGxpYmVyYXRpb25zZXJpZgBmcmVlc2VyaWYAc2Fucy1TZXJpZgBnaWYAL3N2Zy9wZWFjaHB1ZmYAcmlmZgBhY2NvdW50aW5nUmVwb3J0RGlmZgAoWG1sQmlnQ291bnQpLTEgLSByb290UGFyc2VyLT5tX2FsbG9jX3RyYWNrZXIuYnl0ZXNBbGxvY2F0ZWQgPj0gYWJzRGlmZgB0YWlsaHJlZgBsYWJlbGhyZWYAZWRnZWhyZWYAaGVhZGhyZWYAb3JkZgBwZGYAc2lnbWFmAFxmACUuMExmACVMZgB1cy0+ZgAlLjAzZgAlcyB0cmFuc21pdCAlLjNmAHJnYjwlOS4zZiwgJTkuM2YsICU5LjNmPiB0cmFuc21pdCAlLjNmACUuMDJmACUuMmYAJS4wZiwlLjBmLCUuMGYsJS4wZgAgJS4wZiwlLjBmACUuMGYgJS4wZiAlLjBmICUuMGYAIiBmaWxsLW9wYWNpdHk9IiVmACIgc3Ryb2tlLW9wYWNpdHk9IiVmAApmaW5hbCBlID0gJWYAYnJvbnplAGFycm93c2l6ZQBsYWJlbGZvbnRzaXplAHNlYXJjaHNpemUAZml4ZWRzaXplAG5vZGVfc2V0X3NpemUAdGV4dHNwYW5fc2l6ZQBzdmdfc2l6ZQBpbmRleCA8IGxpc3QtPnNpemUAY2FwYWNpdHkgPiBkaWN0LT5zaXplAGNhcGFjaXR5ID4gc2VsZi0+c2l6ZQBiei5zaXplAHBvaW50LXNpemUAU0laRV9NQVggLSBzaXplb2Yoc2l6ZV90KSAtIEVYUEFUX01BTExPQ19QQURESU5HID49IHNpemUAbm9ybWFsaXplAEVMaW5pdGlhbGl6ZQBta01hemUAaWN1cnZlAHRyeV9yZXNlcnZlAG5vZGVfc2V0X3JlbW92ZQBzdHJkaWN0X3JlbW92ZQBzb2x2ZQAhdi0+YWN0aXZlAC1hY3RpdmUAZm9udF9pbl9saXN0X3Blcm1pc3NpdmUAL3N2Zy9vbGl2ZQB1Z3JhdmUAb2dyYXZlAGlncmF2ZQBlZ3JhdmUAYWdyYXZlAFVncmF2ZQBPZ3JhdmUASWdyYXZlAEVncmF2ZQBBZ3JhdmUAdHJ1ZQAvc3ZnL2Jpc3F1ZQBvYmxpcXVlAEF2YW50R2FyZGUtQm9va09ibGlxdWUAQXZhbnRHYXJkZS1EZW1pT2JsaXF1ZQBIZWx2ZXRpY2EtTmFycm93LUJvbGRPYmxpcXVlAENvdXJpZXItQm9sZE9ibGlxdWUASGVsdmV0aWNhLUJvbGRPYmxpcXVlAEhlbHZldGljYS1OYXJyb3ctT2JsaXF1ZQBDb3VyaWVyLU9ibGlxdWUASGVsdmV0aWNhLU9ibGlxdWUAbmF2eWJsdWUAL3N2Zy9saWdodHNreWJsdWUAL3N2Zy9kZWVwc2t5Ymx1ZQAvc3ZnL3NreWJsdWUAbmV3bWlkbmlnaHRibHVlAC9zdmcvbWlkbmlnaHRibHVlAC9zdmcvbGlnaHRibHVlAC9zdmcvY2FkZXRibHVlAC9zdmcvY29ybmZsb3dlcmJsdWUAL3N2Zy9kb2RnZXJibHVlAC9zdmcvcG93ZGVyYmx1ZQBuZW9uYmx1ZQAvc3ZnL21lZGl1bWJsdWUAL3N2Zy9saWdodHN0ZWVsYmx1ZQAvc3ZnL3N0ZWVsYmx1ZQAvc3ZnL3JveWFsYmx1ZQAvc3ZnL2RhcmtibHVlAHJpY2hibHVlAGxpZ2h0c2xhdGVibHVlAC9zdmcvbWVkaXVtc2xhdGVibHVlAC9zdmcvZGFya3NsYXRlYmx1ZQAvc3ZnL3NsYXRlYmx1ZQAvc3ZnL2FsaWNlYmx1ZQAvc3ZnL2JsdWUAY2FsbFN0b3JlRW50aXR5VmFsdWUAc3RvcmVBdHRyaWJ1dGVWYWx1ZQBCbHVlAG5lYXRvX2VucXVldWUAVHVlAHlhY3V0ZQB1YWN1dGUAb2FjdXRlAGlhY3V0ZQBlYWN1dGUAYWFjdXRlAFlhY3V0ZQBVYWN1dGUAT2FjdXRlAElhY3V0ZQBFYWN1dGUAQWFjdXRlAHJlZmVyZW5jZSB0byBleHRlcm5hbCBlbnRpdHkgaW4gYXR0cmlidXRlAGR1cGxpY2F0ZSBhdHRyaWJ1dGUAbm90ZQBwcmltZXJzaXRlAHJpYm9zaXRlAHJlc3RyaWN0aW9uc2l0ZQBwcm90ZWFzZXNpdGUAL3N2Zy9naG9zdHdoaXRlAC9zdmcvbmF2YWpvd2hpdGUAL3N2Zy9mbG9yYWx3aGl0ZQAvc3ZnL2FudGlxdWV3aGl0ZQAvc3ZnL3doaXRlAFdoaXRlAHBvcF9vYmpfc3RhdGUAcGNwX3JvdGF0ZQBjb25jZW50cmF0ZQBkZWNvcmF0ZQBRdWFkVHJlZV9yZXB1bHNpdmVfZm9yY2VfYWNjdW11bGF0ZQBub3RyYW5zbGF0ZQAvc3ZnL2Nob2NvbGF0ZQBwYXJzZXJDcmVhdGUAZ2VvbVVwZGF0ZQBpbnZob3VzZQAvc3ZnL2NoYXJ0cmV1c2UAWE1MX1BhcnNlADxlbGxpcHNlAGR1c3R5cm9zZQAvc3ZnL21pc3R5cm9zZQBTcGFyc2VNYXRyaXhfdHJhbnNwb3NlAGx1X2RlY29tcG9zZQBhZ2Nsb3NlAGVudGl0eVRyYWNraW5nT25DbG9zZQBTcGFyc2VNYXRyaXhfbXVsdGlwbHlfZGVuc2UAZmFsc2UAL3N2Zy9tZWRpdW10dXJxdW9pc2UAL3N2Zy9kYXJrdHVycXVvaXNlAC9zdmcvcGFsZXR1cnF1b2lzZQAvc3ZnL3R1cnF1b2lzZQBwaGFzZQBTSVpFX01BWCAtIHJvb3RQYXJzZXItPm1fYWxsb2NfdHJhY2tlci5ieXRlc0FsbG9jYXRlZCA+PSBpbmNyZWFzZQBzbG90X2Zyb21fYmFzZQAvc3ZnL2F6dXJlAHNpZ25hdHVyZQBtb3JlX2NvcmUATXNxdWFyZQBQYWxhdGlubyBMaW5vdHlwZQBBLT50eXBlID09IEItPnR5cGUAc3VwZQBlbGxpcHNlX3RhbmdlbnRfc2xvcGUAZ3ZyZW5kZXJfdXNlcnNoYXBlAG1pdGVyX3NoYXBlAGxhbmRzY2FwZQBMYW5kc2NhcGUASnVuZQBub25lAGRvY3VtZW50IGlzIG5vdCBzdGFuZGFsb25lAGNvdXNpbmUAL3N2Zy9tZWRpdW1hcXVhbWFyaW5lAC9zdmcvYXF1YW1hcmluZQA8cG9seWxpbmUAJXNvdmVybGluZQB1bmRlcmxpbmUAcmVhbGx5cm91dGVzcGxpbmUAUHJvdXRlc3BsaW5lAGxpbmVhcl9zcGxpbmUAYl9zcGxpbmUAb2xpbmUAYWd4YnVmX2lzX2lubGluZQBzdmdfaW5saW5lAHJlZmluZQBwcmltZQBQcmltZQAvc3ZnL2xpbWUAY29sb3JzY2hlbWUAbGFiZWxfc2NoZW1lAHNhbWUAbGFiZWxmb250bmFtZQBVRl9zZXRuYW1lAGZvbnRfbmFtZQBmb250LT5uYW1lAHVzLT5uYW1lAHJlc2VydmVkIHByZWZpeCAoeG1sKSBtdXN0IG5vdCBiZSB1bmRlY2xhcmVkIG9yIGJvdW5kIHRvIGFub3RoZXIgbmFtZXNwYWNlIG5hbWUAc3R5bGUAL3N2Zy90aGlzdGxlAHRpdGxlAC9zdmcvbWVkaXVtcHVycGxlAGRhcmtwdXJwbGUAd2VicHVycGxlAHJlYmVjY2FwdXJwbGUAdmVyeV9saWdodF9wdXJwbGUAbWVkX3B1cnBsZQB4MTFwdXJwbGUAL3N2Zy9wdXJwbGUAc2hhcGVmaWxlAGdyYWRpZW50YW5nbGUAcmVjdGFuZ2xlAFJlY3RhbmdsZQBsYWJlbGFuZ2xlAGludnRyaWFuZ2xlAGRlc3RpbmF0aW9uIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAc291cmNlIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAZGZzQ3ljbGUAZG91YmxlY2lyY2xlAE1jaXJjbGUAaW52aXNpYmxlAGV4cGF0X2hlYXBfaW5jcmVhc2VfdG9sZXJhYmxlAHRob3JuZGFsZQBpbnB1dHNjYWxlAG9zY2FsZQBpbWFnZXNjYWxlAC9zdmcvd2hpdGVzbW9rZQBtYW5kYXJpbm9yYW5nZQAvc3ZnL2RhcmtvcmFuZ2UAL3N2Zy9vcmFuZ2UAZXhjaGFuZ2UAL3N2Zy9iZWlnZQBuZXdlZGdlAGRlbGV0ZV9mYXN0X2VkZ2UAZGVsZXRlX2ZsYXRfZWRnZQBhZGRfdHJlZV9lZGdlAHBhdGNod29ya19pbml0X25vZGVfZWRnZQB0d29waV9pbml0X25vZGVfZWRnZQBtYWtlU3RyYWlnaHRFZGdlAG1ha2VTZWxmRWRnZQBtYWtlQ29tcG91bmRFZGdlACF1c2Vfc3RhZ2UAb3NhZ2UAcGFnZQBndmxvYWRpbWFnZQB2ZWUAdGVlAFFVQURfVFJFRV9IWUJSSUQsIHNpemUgbGFyZ2VyIHRoYW4gJWQsIHN3aXRjaCB0byBmYXN0IHF1YWR0cmVlAGZlYXNpYmxlX3RyZWUAbm9kZV9zZXRfZnJlZQBleHBhdF9mcmVlAGd2X2FyZW5hX2ZyZWUAbmV3bm9kZQBpbnN0YWxsbm9kZQBhZ25vZGUAZGVsZXRlX2Zhc3Rfbm9kZQBwYWNrbW9kZQBTcGxpdE5vZGUAb3RpbGRlAG50aWxkZQBhdGlsZGUAT3RpbGRlAE50aWxkZQBBdGlsZGUAZGl2aWRlAHRyYWRlAGdyYXBodml6X25vZGVfaW5kdWNlAHNvdXJjZQByZXB1bHNpdmVmb3JjZQBpbGxlZ2FsIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlAGVycm9yIGluIHByb2Nlc3NpbmcgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZQByZWN1cnNpdmUgZW50aXR5IHJlZmVyZW5jZQBsYWJlbGRpc3RhbmNlAFRCX2JhbGFuY2UAVEJiYWxhbmNlAGRldmljZQBtb25vc3BhY2UAL3N2Zy9vbGRsYWNlAGZhY2UAc3ViZQAgLWFuY2hvciBlAHMxLT5jb21tX2Nvb3JkPT1zMi0+Y29tbV9jb29yZABNcmVjb3JkAGZvcndhcmQAcHJvZABsaWdodGdvbGRlbnJvZABtZWRpdW1nb2xkZW5yb2QAL3N2Zy9kYXJrZ29sZGVucm9kAC9zdmcvcGFsZWdvbGRlbnJvZAAvc3ZnL2dvbGRlbnJvZAAvc3ZnL2J1cmx5d29vZABsaWdodHdvb2QAbWVkaXVtd29vZABkYXJrd29vZABfYmFja2dyb3VuZABjb21wb3VuZABubyBlbGVtZW50IGZvdW5kAGZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tbm8gYWN0aW9uIGZvdW5kAC9zdmcvYmxhbmNoZWRhbG1vbmQAYXJyb3dfbGVuZ3RoX2RpYW1vbmQATWRpYW1vbmQAbm9kZV9zZXRfZmluZABzdHJkaWN0X2ZpbmQAZ3Z1c2Vyc2hhcGVfZmluZABFTGxlZnRibmQAZXhwYW5kAGN1bWJlcmxhbmQAYnJpZ2h0Z29sZABvbGRnb2xkAC9zdmcvZ29sZABib2xkAEhlbHZldGljYS1OYXJyb3ctQm9sZABUaW1lcy1Cb2xkAENvdXJpZXItQm9sZABQYWxhdGluby1Cb2xkAE5ld0NlbnR1cnlTY2hsYmstQm9sZABIZWx2ZXRpY2EtQm9sZAAlMCpsbGQAJSpsbGQAKyVsbGQAbi0+YnJhbmNoW2ldLmNoaWxkACUrLjRsZAAlcyVsZABzb2xpZAAvc3ZnL21lZGl1bW9yY2hpZAAvc3ZnL2RhcmtvcmNoaWQAL3N2Zy9vcmNoaWQAaWxsZWdhbCBjaGFyYWN0ZXIocykgaW4gcHVibGljIGlkAGRpamtzdHJhX3NnZABmaXhlZABjdXJ2ZWQAZGVyaXZlZABkb3R0ZWQAbWVtb3J5IGV4aGF1c3RlZABsb2NhbGUgbm90IHN1cHBvcnRlZABwYXJzaW5nIGFib3J0ZWQAcGFyc2VyIG5vdCBzdGFydGVkAGF0dHJpYnV0ZSBtYWNyb3Mgbm90IGltcGxlbWVudGVkAGFjY291bnRpbmdEaWZmVG9sZXJhdGVkAHJvb3RQYXJzZXItPm1fYWxsb2NfdHJhY2tlci5ieXRlc0FsbG9jYXRlZCA+PSBieXRlc0FsbG9jYXRlZABmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkAGNvbmRlbnNlZAAvc3ZnL21lZGl1bXZpb2xldHJlZAAvc3ZnL3BhbGV2aW9sZXRyZWQASW1wcm9wZXIgJXMgdmFsdWUgJXMgLSBpZ25vcmVkACVzIHZhbHVlICVzIDwgJWQgLSB0b28gc21hbGwgLSBpZ25vcmVkACVzIHZhbHVlICVzID4gJWQgLSB0b28gbGFyZ2UgLSBpZ25vcmVkAC9zdmcvaW5kaWFucmVkAC9zdmcvZGFya3JlZABhIHN1Y2Nlc3NmdWwgcHJpb3IgY2FsbCB0byBmdW5jdGlvbiBYTUxfR2V0QnVmZmVyIGlzIHJlcXVpcmVkAHRhcGVyZWQAL3N2Zy9vcmFuZ2VyZWQAcmVzZXJ2ZWQgcHJlZml4ICh4bWxucykgbXVzdCBub3QgYmUgZGVjbGFyZWQgb3IgdW5kZWNsYXJlZAAvc3ZnL3JlZABzdHJpcGVkAGlsbC1jb25kaXRpb25lZAB1bmRlZmluZWQAbm90IGNvbnN0cmFpbmVkAGxhYmVsYWxpZ25lZAB0ZXh0IGRlY2xhcmF0aW9uIG5vdCB3ZWxsLWZvcm1lZABYTUwgZGVjbGFyYXRpb24gbm90IHdlbGwtZm9ybWVkAHVuZmlsbGVkAGlucHV0IGluIGZsZXggc2Nhbm5lciBmYWlsZWQAdHJpYW5ndWxhdGlvbiBmYWlsZWQAcGFyc2luZyBmaW5pc2hlZABkYXNoZWQAbGltaXQgb24gaW5wdXQgYW1wbGlmaWNhdGlvbiBmYWN0b3IgKGZyb20gRFREIGFuZCBlbnRpdGllcykgYnJlYWNoZWQAd2VkZ2VkAHNpemUgPT0gZnJlZWQAcm91bmRlZABzcGxpbmUgWyUuMDNmLCAlLjAzZl0gLS0gWyUuMDNmLCAlLjAzZl0gaXMgaG9yaXpvbnRhbDsgd2lsbCBiZSB0cml2aWFsbHkgYm91bmRlZABzcGxpbmUgWyUuMDNmLCAlLjAzZl0gLS0gWyUuMDNmLCAlLjAzZl0gaXMgdmVydGljYWw7IHdpbGwgYmUgdHJpdmlhbGx5IGJvdW5kZWQAcGFyc2VyIG5vdCBzdXNwZW5kZWQAcGFyc2VyIHN1c3BlbmRlZABXZWQAUmVkAFNwYXJzZU1hdHJpeF9hZGQAbm9kZV9zZXRfYWRkAHN0cmRpY3RfYWRkAGRkICE9IHBhcmVudF9kZABLUF9BZGQAcGFkAHhsaGR4bG9hZAB4bGhkeHVubG9hZAByZWFkAGFycm93aGVhZABsaGVhZABzYW1laGVhZABib3gzZAAlc18lZABfc3Bhbl8lZABfYmxvY2tfJWQAX3dlYWtfJWQAX2Nsb25lXyVkAC4lZAAlWS0lbS0lZAAlbGYsJWQAJXMgaW4gbGluZSAlZAAlJSUlQm91bmRpbmdCb3g6ICVkICVkICVkICVkACJfc3ViZ3JhcGhfY250IjogJWQAIl9ndmlkIjogJWQAImhlYWQiOiAlZABhZ3hicHV0YwB2cHNjAGNwLT5zcmMAdWNpcmMAb2NpcmMAaWNpcmMAZWNpcmMAYWNpcmMAVWNpcmMAT2NpcmMASWNpcmMARWNpcmMAQWNpcmMAcGMAbGFiZWxsb2MAZXhwYXRfbWFsbG9jAGV4cGF0X3JlYWxsb2MAZ3ZfcmVjYWxsb2MAc3RkOjpiYWRfYWxsb2MAZ3ZfYXJlbmFfYWxsb2MAYmFrZXJzY2hvYwBzZW1pU3dlZXRDaG9jAG1jAFNwYXJzZU1hdHJpeF9pc19zeW1tZXRyaWMAQS0+aXNfcGF0dGVybl9zeW1tZXRyaWMAcGljOnBpYwBpdGFsaWMAQm9va21hbi1MaWdodEl0YWxpYwBaYXBmQ2hhbmNlcnktTWVkaXVtSXRhbGljAEJvb2ttYW4tRGVtaUl0YWxpYwBUaW1lcy1Cb2xkSXRhbGljAFBhbGF0aW5vLUJvbGRJdGFsaWMATmV3Q2VudHVyeVNjaGxiay1Cb2xkSXRhbGljAFRpbWVzLUl0YWxpYwBQYWxhdGluby1JdGFsaWMATmV3Q2VudHVyeVNjaGxiay1JdGFsaWMAcmFkaWMAI2ZjZmNmYwByb3V0ZXNwbGluZXM6ICVkIGVkZ2VzLCAlenUgYm94ZXMgJS4yZiBzZWMAOiAlLjJmIHNlYwBsaXN0ZGVscmVjAGxldmVsIGdyYXBoIHJlYwBsZXZlbCBlZGdlIHJlYwBsZXZlbCBub2RlIHJlYwBEZWMAX25lYXRvX2NjAGJjAHZpc2liaWxpdHkuYwBTcGFyc2VNYXRyaXguYwBodG1sbGV4LmMAaW5kZXguYwBzbWFydF9pbmlfeC5jAGd2cmVuZGVyX2NvcmVfcG92LmMAbHUuYwBjdnQuYwBsYXlvdXQuYwB0ZXh0c3Bhbl9sdXQuYwBhZGp1c3QuYwBub2RlbGlzdC5jAHNob3J0ZXN0LmMAY2xvc2VzdC5jAGd2cmVuZGVyX2NvcmVfZG90LmMAY29uc3RyYWludC5jAGRvdGluaXQuYwBuZWF0b2luaXQuYwBwYXRjaHdvcmtpbml0LmMAdHdvcGlpbml0LmMAb3NhZ2Vpbml0LmMAZW1pdC5jAGZsYXQuYwBhcnJvd3MuYwBtaW5jcm9zcy5jAHN0cmVzcy5jAHBvc3RfcHJvY2Vzcy5jAGNjb21wcy5jAG5zLmMAdXRpbHMuYwB4bGFiZWxzLmMAc2hhcGVzLmMAZG90c3BsaW5lcy5jAG5lYXRvc3BsaW5lcy5jAGNsdXN0ZXJlZGdlcy5jAGhlZGdlcy5jAGF0dHIuYwByZWZzdHIuYwBmYXN0Z3IuYwBjbHVzdGVyLmMAdGFwZXIuYwBndnJlbmRlci5jAHNwbGl0LnEuYwBjb21wLmMAZ3ZyZW5kZXJfY29yZV9tYXAuYwBoZWFwLmMAb3J0aG8uYwBndnJlbmRlcl9jb3JlX2pzb24uYwBwYXJ0aXRpb24uYwBwb3NpdGlvbi5jAGd2X2ZvcGVuLmMAdGV4dHNwYW4uYwBnZW9tLmMAcmFuZG9tLmMAcm91dGVzcGwuYwB4bWwuYwBNdWx0aWxldmVsLmMAc3ByaW5nX2VsZWN0cmljYWwuYwBndnJlbmRlcl9jb3JlX3RrLmMAcmFuay5jAHBhY2suYwBkdHN0cmhhc2guYwBncmFwaC5jAGd2cmVuZGVyX2NvcmVfc3ZnLmMAZ3ZyZW5kZXJfY29yZV9maWcuYwBzdHVmZi5jAG1hemUuYwBzcGFyc2Vfc29sdmUuYwByb3V0ZS5jAHdyaXRlLmMAY29seGxhdGUuYwB4bWxwYXJzZS5jAGd2bG9hZGltYWdlX2NvcmUuYwBndnVzZXJzaGFwZS5jAGNpcmNsZS5jAGh0bWx0YWJsZS5jAGVkZ2UuYwBndmxvYWRpbWFnZS5jAGJsb2NrdHJlZS5jAFF1YWRUcmVlLmMAbm9kZS5jAG5vZGVfaW5kdWNlLmMAZ3ZkZXZpY2UuYwBjb21wb3VuZC5jAHRyYXBlem9pZC5jAHNnZC5jAGNvbmMuYwByZWMuYwBkaWprc3RyYS5jAGFyZW5hLmMAZlBRLmMAY2xhc3MyLmMAJWxmLCVsZiwlbGYsJWxmJWMAJWxmLCVsZiwlbGYsJVteLF0lYwBcJWMAJGMAd2IAbnN1YgBzZXRoc2IAcmIAcHJvdGVjdF9yc3FiAGpvYgBjb3JlX2xvYWRpbWFnZV9wc2xpYgBGZWIAb2RiAGluaXRfc3BsaW5lc19iYgBiZXppZXJfYmIAcHJvdGVpbnN0YWIAcm5hc3RhYgAvc3ZnL29saXZlZHJhYgBcYgByd2EAL3N2Zy9hcXVhAGlvdGEASW90YQAvc3ZnL2RhcmttYWdlbnRhAC9zdmcvbWFnZW50YQBkZWx0YQBEZWx0YQB6ZXRhAHRoZXRhAFRoZXRhAGJldGEAWmV0YQBCZXRhAHByZXYgIT0gb2JqLT5kYXRhAG1ha2VHcmFwaERhdGEARXRhAG5pbWJ1c3NhbnNhAHBhcmEAa2FwcGEAS2FwcGEAL3N2Zy9zaWVubmEAVmVyZGFuYQBnYW1tYQBHYW1tYQBzaWdtYQBTaWdtYQBjb25zb2xhAG5hYmxhAC9zdmcvZnVjaHNpYQBHZW9yZ2lhAGFscGhhAEFscGhhAG9tZWdhAE9tZWdhAGFyZWEAbGFtYmRhAExhbWJkYQBoZWx2ZXRpY2EASGVsdmV0aWNhAG1pY2EAPjxhAGAAU3BhcnNlTWF0cml4X2Nvb3JkaW5hdGVfZm9ybV9hZGRfZW50cnlfAGd2X2xpc3RfY29weV8AX3RkcmF3XwBfdGxkcmF3XwBfaGxkcmF3XwBfbGRyYXdfAF9oZHJhd18AX2RyYXdfAGd2X2xpc3Rfc29ydF8AZ3ZfbGlzdF9hcHBlbmRfc2xvdF8AZ3ZfbGlzdF9wcmVwZW5kX3Nsb3RfAGd2X2xpc3RfcG9wX2Zyb250XwBndl9saXN0X3Nocmlua190b19maXRfAGFneHNldF8AZ3ZfbGlzdF9nZXRfAGRvdF9zcGxpbmVzXwAlc18AZ3ZfbGlzdF9jbGVhcl8AZ3ZfbGlzdF9wb3BfYmFja18AZ3ZfbGlzdF9kZXRhY2hfAGd2X2xpc3RfcmVtb3ZlXwBndl9saXN0X3JldmVyc2VfAGd2X2xpc3RfZnJlZV8AZ3ZfbGlzdF90cnlfYXBwZW5kXwBwYWdlJWQsJWRfAGd2X2xpc3Rfc3luY18AX2NjXwAgaWQ9ImFfAF4AU3RhcnRpbmcgcGhhc2UgMiBbZG90X21pbmNyb3NzXQBTdGFydGluZyBwaGFzZSAzIFtkb3RfcG9zaXRpb25dAG5fZWRnZXMgPT0gZ3JhcGgtPnNvdXJjZXNbZ3JhcGgtPm5dAFN0YXJ0aW5nIHBoYXNlIDEgW2RvdF9yYW5rXQBqZFttYXNrW2pjW2tdXV0gPT0gamNba10AamNbbWFza1tqYltrXV1dID09IGpiW2tdAG5lZWRsZVtpXSAhPSBuZWVkbGVbal0AamFbbWFza1tqYVtqXV1dID09IGphW2pdAHEtPnF0c1tpaV0AIXJ0cC0+c3BsaXQuUGFydGl0aW9uc1swXS50YWtlbltpXQByLmJvdW5kYXJ5W2ldIDw9IHIuYm91bmRhcnlbTlVNRElNUyArIGldAFslLjAzZiwlLjAzZl0AW2ludGVybmFsIGhhcmQtY29kZWRdAG5wLT5jZWxsc1sxXQBucC0+Y2VsbHNbMF0AdXMtPm5hbWVbMF0AY3AtPnNyY1swXQBbLi5dAFxcACJwb2ludHMiOiBbACJzdG9wcyI6IFsACVsAWgBjb21wdXRlU2NhbGVYWQB5PD1ZACVhICViICVkICVIOiVNOiVTICVZAFBPU0lYAG56IDw9IElOVF9NQVgAeSA+PSBJTlRfTUlOICYmIHkgPD0gSU5UX01BWAB4ID49IElOVF9NSU4gJiYgeCA8PSBJTlRfTUFYAHcgPj0gMCAmJiB3IDw9IElOVF9NQVgAZV9jbnQgPD0gSU5UX01BWABwYWlyLnJpZ2h0IDw9IElOVF9NQVgAcGFpci5sZWZ0IDw9IElOVF9NQVgAdGFyZ2V0IDw9IElOVF9NQVgAbnNlZ3MgPD0gSU5UX01BWABuX2VkZ2VzIDw9IElOVF9NQVgAc3RwLm52ZXJ0aWNlcyA8PSBJTlRfTUFYAG9ic1twb2x5X2ldLT5wbiA8PSBJTlRfTUFYAGlucHV0X3JvdXRlLnBuIDw9IElOVF9NQVgAZ3JhcGgtPm4gPD0gSU5UX01BWABoID49IDAgJiYgaCA8PSBJTlRfTUFYAGVfY250IC0gMSA8PSBJTlRfTUFYAExJU1RfU0laRSgmbGlzdCkgLSAxIDw9IElOVF9NQVgATElTVF9TSVpFKCZsYXllcklEcykgLSAxIDw9IElOVF9NQVgAc3RybGVuKGFyZ3MpIDw9IElOVF9NQVgATElTVF9TSVpFKCZvYmpsKSA8PSBJTlRfTUFYAExJU1RfU0laRSgmY3R4LT5UcmVlX2VkZ2UpIDw9IElOVF9NQVgAbm9kZV9zZXRfc2l6ZShnLT5uX2lkKSA8PSBJTlRfTUFYAGkgPCBJTlRfTUFYAHJlc3VsdCA8PSAoaW50KVVDSEFSX01BWABzc3ogPD0gVUNIQVJfTUFYAGNvbCA+PSAwICYmIGNvbCA8PSBVSU5UMTZfTUFYAHg8PVgAVwBWAFUAXFQAVEVYVABTVFJFU1NfTUFKT1JJWkFUSU9OX1BPV0VSX0RJU1QAU1RSRVNTX01BSk9SSVpBVElPTl9HUkFQSF9ESVNUAFNUUkVTU19NQUpPUklaQVRJT05fQVZHX0RJU1QARkFTVABGT05UAGIgPT0gQl9SSUdIVABIRUlHSFQAQl9MRUZUAF8lbGx1X1NVU1BFQ1QAQlQAVHJlYnVjaGV0IE1TAElOVklTACVIOiVNOiVTAFZSAFRSAEEtPmZvcm1hdCA9PSBCLT5mb3JtYXQgJiYgQS0+Zm9ybWF0ID09IEZPUk1BVF9DU1IATFIARElSAEhSAENFTlRFUgAlJVRSQUlMRVIAQS0+dHlwZSA9PSBNQVRSSVhfVFlQRV9SRUFMIHx8IEEtPnR5cGUgPT0gTUFUUklYX1RZUEVfSU5URUdFUgBDRUxMQk9SREVSAEJSACpSAFEARVhQAEJfVVAAU1VQAFRPUABPAG1hcE4AXE4AQl9ET1dOAFRIT1JOACUlQkVHSU4AUk9XU1BBTgBDT0xTUEFOAE5BTgBQTQBCT1RUT00AQk0AQU0AJUg6JU0AXEwAdGFpbFVSTABsYWJlbFVSTABlZGdlVVJMAGhlYWRVUkwASFRNTAB4IT1OVUxMAHJvb3RQYXJzZXItPm1fcGFyZW50UGFyc2VyID09IE5VTEwARURfdG9fdmlydChvcmlnKSA9PSBOVUxMAEVEX3RvX3ZpcnQoZSkgPT0gTlVMTABwcmVmaXggIT0gTlVMTABkdGQtPnNjYWZmSW5kZXggIT0gTlVMTABzbS0+THcgIT0gTlVMTABsdSAhPSBOVUxMAGlucHV0ICE9IE5VTEwAbGlzdCAhPSBOVUxMAHJlZmVyZW50ICE9IE5VTEwAZGljdCAhPSBOVUxMAGRpY3QtPmJ1Y2tldHMgIT0gTlVMTABhdHRyICE9IE5VTEwAYWxsb2NhdG9yICE9IE5VTEwAcGFyc2VyICE9IE5VTEwAcm9vdFBhcnNlciAhPSBOVUxMAGxlYWRlciAhPSBOVUxMAGNtcCAhPSBOVUxMAGRhdGFwICE9IE5VTEwAaW50byAhPSBOVUxMAGl0ZW0gIT0gTlVMTABvcnRob2cgIT0gTlVMTABzZWxmICE9IE5VTEwAdmFsdWUgIT0gTlVMTABmaWxlbmFtZSAhPSBOVUxMAGpvYi0+b3V0cHV0X2ZpbGUgIT0gTlVMTABtb2RlICE9IE5VTEwAeGQgIT0gTlVMTABzbS0+THdkICE9IE5VTEwAam9iICE9IE5VTEwAc291cmNlLmRhdGEgIT0gTlVMTABiLmRhdGEgIT0gTlVMTABhLmRhdGEgIT0gTlVMTABhcmVuYSAhPSBOVUxMAGxpc3QgJiYgbGlzdFswXSAhPSBOVUxMAEFGICE9IE5VTEwAc20tPkQgIT0gTlVMTABFRF90b192aXJ0KG9yaWcpICE9IE5VTEwATENfQUxMAEJMAGJlc3Rjb3N0IDwgSFVHRV9WQUwATk9STUFMAFJBRElBTABBLT50eXBlID09IE1BVFJJWF9UWVBFX1JFQUwAVVJXIENoYW5jZXJ5IEwAVVJXIEJvb2ttYW4gTABDZW50dXJ5IFNjaG9vbGJvb2sgTABVUlcgR290aGljIEwAS0sASgBpIDwgTUFYX0kAUC0+ZW5kLnRoZXRhIDwgMiAqIE1fUEkAQVNDSUkAXEgARVRIAFdJRFRIAERPVEZPTlRQQVRIAEdERk9OVFBBVEgAbWtOQ29uc3RyYWludEcAXEcARVhQQVRfRU5USVRZX0RFQlVHAEVYUEFUX0VOVFJPUFlfREVCVUcARVhQQVRfQUNDT1VOVElOR19ERUJVRwBFWFBBVF9NQUxMT0NfREVCVUcAUk5HAFNQUklORwBDRUxMUEFERElORwBDRUxMU1BBQ0lORwBMQU5HAElNRwBceEYAJSVFT0YASU5GAFx4RkYAUklGRgBkZWx0YSA8PSAweEZGRkYAXHhFRgBceERGAFx4Q0YAXHhCRgBceEFGAFx4OUYAXHg4RgBceDdGAFx4MUYAXHhFAFxFAFBPSU5ULVNJWkUAVFJVRQBDTE9TRQBGQUxTRQBrZXkgIT0gVE9NQlNUT05FAHIgIT0gVE9NQlNUT05FAE5PTkUAR1JBRElFTlRBTkdMRQBUUklBTkdMRQBNSURETEUASU5WSVNJQkxFAFRBQkxFAEFHVFlQRShvYmopID09IEFHSU5FREdFIHx8IEFHVFlQRShvYmopID09IEFHT1VURURHRQBceEZFAFx4RUUAXHhERQBCX05PREUAXHhDRQBceEJFAFx4QUUAXHg5RQBceDhFAFx4MUUAVEQAQS0+Zm9ybWF0ID09IEZPUk1BVF9DT09SRABuICYmIGkgPj0gMCAmJiBpIDwgTk9ERUNBUkQAJSVFTkQASFlCUklEAFNPTElEAFx4RkQAXHhFRABET1RURUQAREFTSEVEAFJPVU5ERUQAXHhERABceENEAFx4QkQAXHhBRABceDlEAFx4OEQAXHgxRABceEMAZGVsZXRlVlBTQwBceEZDAFx4RUMAXHhEQwBceENDAFx4QkMAXHhBQwBceDlDAFx4OEMAXHgxQwBceEIAU1VCAFx4RkIAXHhFQgBceERCAFx4Q0IAXHhCQgBceEFCAFx4OUIAXHg4QgBceDFCAEEgJiYgQgBceEZBAFx4RUEAXHhEQQBceENBAFx4QkEAXHhBQQBceDlBAFx4OEEAXHgxQQBAAD8APCVzPgA8bmlsPgA8L3RzcGFuPjwvdGV4dFBhdGg+AAogICAgPCU5LjNmLCAlOS4zZiwgJTkuM2Y+AD4KPHRpdGxlPgA8Rk9OVD4APEJSPgA8SFRNTD4APC9IVE1MPgA8SU1HPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBiZWZvcmUgPFRBQkxFPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBhZnRlciA8L1RBQkxFPgA8VEQ+AC0+ACI+AAlba2V5PQA8PQA8ACYjeCV4OwAmcXVvdDsAJmx0OwAmZ3Q7ACZhbXA7ACMlZDsAJiMzOTsAJiM0NTsAJiM5MzsAJiMxMzsAJiMxNjA7ACYjMTA7ADtzdG9wLW9wYWNpdHk6ACUlQm91bmRpbmdCb3g6AGNhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzIGFuZCBzZXR0aW5nIHVwIHN0cmVzcyB0ZXJtczoAPHN0b3Agb2Zmc2V0PSIlLjAzZiIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6AHNvbHZpbmcgbW9kZWw6AC9cOgBncmV5OQBncmF5OQBceEY5AFx4RTkAXHhEOQBceEM5AFx4QjkAXHhBOQBncmV5OTkAZ3JheTk5AFx4OTkAZ3JleTg5AGdyYXk4OQBceDg5ADAxMjM0NTY3ODkAZ3JleTc5AGdyYXk3OQBncmV5NjkAZ3JheTY5AGdyZXk1OQBncmF5NTkAZ3JleTQ5AGdyYXk0OQBncmV5MzkAZ3JheTM5AGdyZXkyOQBncmF5MjkAZ3JleTE5AGdyYXkxOQBceDE5AC9yZGd5OS85AC9idXB1OS85AC9yZHB1OS85AC9wdWJ1OS85AC95bGduYnU5LzkAL2duYnU5LzkAL3JkeWxidTkvOQAvcmRidTkvOQAvZ3JleXM5LzkAL2dyZWVuczkvOQAvYmx1ZXM5LzkAL3B1cnBsZXM5LzkAL29yYW5nZXM5LzkAL3JlZHM5LzkAL3B1b3I5LzkAL3lsb3JicjkvOQAvcHVidWduOS85AC9idWduOS85AC9wcmduOS85AC9yZHlsZ245LzkAL3lsZ245LzkAL3NwZWN0cmFsOS85AC9waXlnOS85AC9icmJnOS85AC9wdXJkOS85AC95bG9ycmQ5LzkAL29ycmQ5LzkAL3BhaXJlZDkvOQAvc2V0MzkvOQAvc2V0MTkvOQAvcGFzdGVsMTkvOQAvcGFpcmVkMTIvOQAvc2V0MzEyLzkAL3JkZ3kxMS85AC9yZHlsYnUxMS85AC9yZGJ1MTEvOQAvcHVvcjExLzkAL3ByZ24xMS85AC9yZHlsZ24xMS85AC9zcGVjdHJhbDExLzkAL3BpeWcxMS85AC9icmJnMTEvOQAvcGFpcmVkMTEvOQAvc2V0MzExLzkAL3JkZ3kxMC85AC9yZHlsYnUxMC85AC9yZGJ1MTAvOQAvcHVvcjEwLzkAL3ByZ24xMC85AC9yZHlsZ24xMC85AC9zcGVjdHJhbDEwLzkAL3BpeWcxMC85AC9icmJnMTAvOQAvcGFpcmVkMTAvOQAvc2V0MzEwLzkAZ3JleTgAZ3JheTgAXHg4AHV0ZjgAI2Y4ZjhmOAAjZThlOGU4AFx4RjgAR0lGOABceEU4AFx4RDgAXHhDOABceEI4AFx4QTgAZ3JleTk4AGdyYXk5OABceDk4AGdyZXk4OABncmF5ODgAXHg4OABncmV5NzgAZ3JheTc4AGdyZXk2OABncmF5NjgAZ3JleTU4AGdyYXk1OABncmV5NDgAZ3JheTQ4AGdyZXkzOABncmF5MzgAZ3JleTI4AGdyYXkyOABncmV5MTgAZ3JheTE4AFx4MTgAL3JkZ3k5LzgAL2J1cHU5LzgAL3JkcHU5LzgAL3B1YnU5LzgAL3lsZ25idTkvOAAvZ25idTkvOAAvcmR5bGJ1OS84AC9yZGJ1OS84AC9ncmV5czkvOAAvZ3JlZW5zOS84AC9ibHVlczkvOAAvcHVycGxlczkvOAAvb3JhbmdlczkvOAAvcmVkczkvOAAvcHVvcjkvOAAveWxvcmJyOS84AC9wdWJ1Z245LzgAL2J1Z245LzgAL3ByZ245LzgAL3JkeWxnbjkvOAAveWxnbjkvOAAvc3BlY3RyYWw5LzgAL3BpeWc5LzgAL2JyYmc5LzgAL3B1cmQ5LzgAL3lsb3JyZDkvOAAvb3JyZDkvOAAvcGFpcmVkOS84AC9zZXQzOS84AC9zZXQxOS84AC9wYXN0ZWwxOS84AC9yZGd5OC84AC9idXB1OC84AC9yZHB1OC84AC9wdWJ1OC84AC95bGduYnU4LzgAL2duYnU4LzgAL3JkeWxidTgvOAAvcmRidTgvOAAvYWNjZW50OC84AC9ncmV5czgvOAAvZ3JlZW5zOC84AC9ibHVlczgvOAAvcHVycGxlczgvOAAvb3JhbmdlczgvOAAvcmVkczgvOAAvcHVvcjgvOAAveWxvcmJyOC84AC9wdWJ1Z244LzgAL2J1Z244LzgAL3ByZ244LzgAL3JkeWxnbjgvOAAveWxnbjgvOAAvc3BlY3RyYWw4LzgAL3BpeWc4LzgAL2JyYmc4LzgAL3B1cmQ4LzgAL3lsb3JyZDgvOAAvb3JyZDgvOAAvcGFpcmVkOC84AC9zZXQzOC84AC9zZXQyOC84AC9wYXN0ZWwyOC84AC9kYXJrMjgvOAAvc2V0MTgvOAAvcGFzdGVsMTgvOAAvcGFpcmVkMTIvOAAvc2V0MzEyLzgAL3JkZ3kxMS84AC9yZHlsYnUxMS84AC9yZGJ1MTEvOAAvcHVvcjExLzgAL3ByZ24xMS84AC9yZHlsZ24xMS84AC9zcGVjdHJhbDExLzgAL3BpeWcxMS84AC9icmJnMTEvOAAvcGFpcmVkMTEvOAAvc2V0MzExLzgAL3JkZ3kxMC84AC9yZHlsYnUxMC84AC9yZGJ1MTAvOAAvcHVvcjEwLzgAL3ByZ24xMC84AC9yZHlsZ24xMC84AC9zcGVjdHJhbDEwLzgAL3BpeWcxMC84AC9icmJnMTAvOAAvcGFpcmVkMTAvOAAvc2V0MzEwLzgAdXRmLTgAQy5VVEYtOABncmV5NwBncmF5NwBceDcAXHhGNwBceEU3AFx4RDcAXHhDNwBceEI3AFx4QTcAZ3JleTk3AGdyYXk5NwBceDk3AGdyZXk4NwBncmF5ODcAXHg4NwBncmV5NzcAZ3JheTc3AGdyZXk2NwBncmF5NjcAZ3JleTU3AGdyYXk1NwBncmV5NDcAZ3JheTQ3AGdyZXkzNwBncmF5MzcAZ3JleTI3AGdyYXkyNwBncmV5MTcAZ3JheTE3AFx4MTcAL3JkZ3k5LzcAL2J1cHU5LzcAL3JkcHU5LzcAL3B1YnU5LzcAL3lsZ25idTkvNwAvZ25idTkvNwAvcmR5bGJ1OS83AC9yZGJ1OS83AC9ncmV5czkvNwAvZ3JlZW5zOS83AC9ibHVlczkvNwAvcHVycGxlczkvNwAvb3JhbmdlczkvNwAvcmVkczkvNwAvcHVvcjkvNwAveWxvcmJyOS83AC9wdWJ1Z245LzcAL2J1Z245LzcAL3ByZ245LzcAL3JkeWxnbjkvNwAveWxnbjkvNwAvc3BlY3RyYWw5LzcAL3BpeWc5LzcAL2JyYmc5LzcAL3B1cmQ5LzcAL3lsb3JyZDkvNwAvb3JyZDkvNwAvcGFpcmVkOS83AC9zZXQzOS83AC9zZXQxOS83AC9wYXN0ZWwxOS83AC9yZGd5OC83AC9idXB1OC83AC9yZHB1OC83AC9wdWJ1OC83AC95bGduYnU4LzcAL2duYnU4LzcAL3JkeWxidTgvNwAvcmRidTgvNwAvYWNjZW50OC83AC9ncmV5czgvNwAvZ3JlZW5zOC83AC9ibHVlczgvNwAvcHVycGxlczgvNwAvb3JhbmdlczgvNwAvcmVkczgvNwAvcHVvcjgvNwAveWxvcmJyOC83AC9wdWJ1Z244LzcAL2J1Z244LzcAL3ByZ244LzcAL3JkeWxnbjgvNwAveWxnbjgvNwAvc3BlY3RyYWw4LzcAL3BpeWc4LzcAL2JyYmc4LzcAL3B1cmQ4LzcAL3lsb3JyZDgvNwAvb3JyZDgvNwAvcGFpcmVkOC83AC9zZXQzOC83AC9zZXQyOC83AC9wYXN0ZWwyOC83AC9kYXJrMjgvNwAvc2V0MTgvNwAvcGFzdGVsMTgvNwAvcmRneTcvNwAvYnVwdTcvNwAvcmRwdTcvNwAvcHVidTcvNwAveWxnbmJ1Ny83AC9nbmJ1Ny83AC9yZHlsYnU3LzcAL3JkYnU3LzcAL2FjY2VudDcvNwAvZ3JleXM3LzcAL2dyZWVuczcvNwAvYmx1ZXM3LzcAL3B1cnBsZXM3LzcAL29yYW5nZXM3LzcAL3JlZHM3LzcAL3B1b3I3LzcAL3lsb3JicjcvNwAvcHVidWduNy83AC9idWduNy83AC9wcmduNy83AC9yZHlsZ243LzcAL3lsZ243LzcAL3NwZWN0cmFsNy83AC9waXlnNy83AC9icmJnNy83AC9wdXJkNy83AC95bG9ycmQ3LzcAL29ycmQ3LzcAL3BhaXJlZDcvNwAvc2V0MzcvNwAvc2V0MjcvNwAvcGFzdGVsMjcvNwAvZGFyazI3LzcAL3NldDE3LzcAL3Bhc3RlbDE3LzcAL3BhaXJlZDEyLzcAL3NldDMxMi83AC9yZGd5MTEvNwAvcmR5bGJ1MTEvNwAvcmRidTExLzcAL3B1b3IxMS83AC9wcmduMTEvNwAvcmR5bGduMTEvNwAvc3BlY3RyYWwxMS83AC9waXlnMTEvNwAvYnJiZzExLzcAL3BhaXJlZDExLzcAL3NldDMxMS83AC9yZGd5MTAvNwAvcmR5bGJ1MTAvNwAvcmRidTEwLzcAL3B1b3IxMC83AC9wcmduMTAvNwAvcmR5bGduMTAvNwAvc3BlY3RyYWwxMC83AC9waXlnMTAvNwAvYnJiZzEwLzcAL3BhaXJlZDEwLzcAL3NldDMxMC83ADEuNwBncmV5NgBncmF5NgBceDYAXHhGNgBceEU2AFx4RDYAXHhDNgBceEI2AFx4QTYAZ3JleTk2AGdyYXk5NgBceDk2AGdyZXk4NgBncmF5ODYAXHg4NgBncmV5NzYAZ3JheTc2AGdyZXk2NgBncmF5NjYAZ3JleTU2AGdyYXk1NgBncmV5NDYAZ3JheTQ2AGdyZXkzNgBncmF5MzYAZ3JleTI2AGdyYXkyNgBncmV5MTYAZ3JheTE2AFx4MTYAL3JkZ3k5LzYAL2J1cHU5LzYAL3JkcHU5LzYAL3B1YnU5LzYAL3lsZ25idTkvNgAvZ25idTkvNgAvcmR5bGJ1OS82AC9yZGJ1OS82AC9ncmV5czkvNgAvZ3JlZW5zOS82AC9ibHVlczkvNgAvcHVycGxlczkvNgAvb3JhbmdlczkvNgAvcmVkczkvNgAvcHVvcjkvNgAveWxvcmJyOS82AC9wdWJ1Z245LzYAL2J1Z245LzYAL3ByZ245LzYAL3JkeWxnbjkvNgAveWxnbjkvNgAvc3BlY3RyYWw5LzYAL3BpeWc5LzYAL2JyYmc5LzYAL3B1cmQ5LzYAL3lsb3JyZDkvNgAvb3JyZDkvNgAvcGFpcmVkOS82AC9zZXQzOS82AC9zZXQxOS82AC9wYXN0ZWwxOS82AC9yZGd5OC82AC9idXB1OC82AC9yZHB1OC82AC9wdWJ1OC82AC95bGduYnU4LzYAL2duYnU4LzYAL3JkeWxidTgvNgAvcmRidTgvNgAvYWNjZW50OC82AC9ncmV5czgvNgAvZ3JlZW5zOC82AC9ibHVlczgvNgAvcHVycGxlczgvNgAvb3JhbmdlczgvNgAvcmVkczgvNgAvcHVvcjgvNgAveWxvcmJyOC82AC9wdWJ1Z244LzYAL2J1Z244LzYAL3ByZ244LzYAL3JkeWxnbjgvNgAveWxnbjgvNgAvc3BlY3RyYWw4LzYAL3BpeWc4LzYAL2JyYmc4LzYAL3B1cmQ4LzYAL3lsb3JyZDgvNgAvb3JyZDgvNgAvcGFpcmVkOC82AC9zZXQzOC82AC9zZXQyOC82AC9wYXN0ZWwyOC82AC9kYXJrMjgvNgAvc2V0MTgvNgAvcGFzdGVsMTgvNgAvcmRneTcvNgAvYnVwdTcvNgAvcmRwdTcvNgAvcHVidTcvNgAveWxnbmJ1Ny82AC9nbmJ1Ny82AC9yZHlsYnU3LzYAL3JkYnU3LzYAL2FjY2VudDcvNgAvZ3JleXM3LzYAL2dyZWVuczcvNgAvYmx1ZXM3LzYAL3B1cnBsZXM3LzYAL29yYW5nZXM3LzYAL3JlZHM3LzYAL3B1b3I3LzYAL3lsb3JicjcvNgAvcHVidWduNy82AC9idWduNy82AC9wcmduNy82AC9yZHlsZ243LzYAL3lsZ243LzYAL3NwZWN0cmFsNy82AC9waXlnNy82AC9icmJnNy82AC9wdXJkNy82AC95bG9ycmQ3LzYAL29ycmQ3LzYAL3BhaXJlZDcvNgAvc2V0MzcvNgAvc2V0MjcvNgAvcGFzdGVsMjcvNgAvZGFyazI3LzYAL3NldDE3LzYAL3Bhc3RlbDE3LzYAL3JkZ3k2LzYAL2J1cHU2LzYAL3JkcHU2LzYAL3B1YnU2LzYAL3lsZ25idTYvNgAvZ25idTYvNgAvcmR5bGJ1Ni82AC9yZGJ1Ni82AC9hY2NlbnQ2LzYAL2dyZXlzNi82AC9ncmVlbnM2LzYAL2JsdWVzNi82AC9wdXJwbGVzNi82AC9vcmFuZ2VzNi82AC9yZWRzNi82AC9wdW9yNi82AC95bG9yYnI2LzYAL3B1YnVnbjYvNgAvYnVnbjYvNgAvcHJnbjYvNgAvcmR5bGduNi82AC95bGduNi82AC9zcGVjdHJhbDYvNgAvcGl5ZzYvNgAvYnJiZzYvNgAvcHVyZDYvNgAveWxvcnJkNi82AC9vcnJkNi82AC9wYWlyZWQ2LzYAL3NldDM2LzYAL3NldDI2LzYAL3Bhc3RlbDI2LzYAL2RhcmsyNi82AC9zZXQxNi82AC9wYXN0ZWwxNi82AC9wYWlyZWQxMi82AC9zZXQzMTIvNgAvcmRneTExLzYAL3JkeWxidTExLzYAL3JkYnUxMS82AC9wdW9yMTEvNgAvcHJnbjExLzYAL3JkeWxnbjExLzYAL3NwZWN0cmFsMTEvNgAvcGl5ZzExLzYAL2JyYmcxMS82AC9wYWlyZWQxMS82AC9zZXQzMTEvNgAvcmRneTEwLzYAL3JkeWxidTEwLzYAL3JkYnUxMC82AC9wdW9yMTAvNgAvcHJnbjEwLzYAL3JkeWxnbjEwLzYAL3NwZWN0cmFsMTAvNgAvcGl5ZzEwLzYAL2JyYmcxMC82AC9wYWlyZWQxMC82AC9zZXQzMTAvNgBncmV5NQBncmF5NQBceDUAYmlnNQBceEY1AFx4RTUAXHhENQBceEM1AFx4QjUAXHhBNQBncmV5OTUAZ3JheTk1AFx4OTUAZ3JleTg1AGdyYXk4NQBceDg1AGdyZXk3NQBncmF5NzUAZ3JleTY1AGdyYXk2NQBncmV5NTUAZ3JheTU1AGdyZXk0NQBncmF5NDUAZ3JleTM1AGdyYXkzNQBncmV5MjUAZ3JheTI1AGdyZXkxNQBncmF5MTUAXHgxNQBncmF5MDUAL3JkZ3k5LzUAL2J1cHU5LzUAL3JkcHU5LzUAL3B1YnU5LzUAL3lsZ25idTkvNQAvZ25idTkvNQAvcmR5bGJ1OS81AC9yZGJ1OS81AC9ncmV5czkvNQAvZ3JlZW5zOS81AC9ibHVlczkvNQAvcHVycGxlczkvNQAvb3JhbmdlczkvNQAvcmVkczkvNQAvcHVvcjkvNQAveWxvcmJyOS81AC9wdWJ1Z245LzUAL2J1Z245LzUAL3ByZ245LzUAL3JkeWxnbjkvNQAveWxnbjkvNQAvc3BlY3RyYWw5LzUAL3BpeWc5LzUAL2JyYmc5LzUAL3B1cmQ5LzUAL3lsb3JyZDkvNQAvb3JyZDkvNQAvcGFpcmVkOS81AC9zZXQzOS81AC9zZXQxOS81AC9wYXN0ZWwxOS81AC9yZGd5OC81AC9idXB1OC81AC9yZHB1OC81AC9wdWJ1OC81AC95bGduYnU4LzUAL2duYnU4LzUAL3JkeWxidTgvNQAvcmRidTgvNQAvYWNjZW50OC81AC9ncmV5czgvNQAvZ3JlZW5zOC81AC9ibHVlczgvNQAvcHVycGxlczgvNQAvb3JhbmdlczgvNQAvcmVkczgvNQAvcHVvcjgvNQAveWxvcmJyOC81AC9wdWJ1Z244LzUAL2J1Z244LzUAL3ByZ244LzUAL3JkeWxnbjgvNQAveWxnbjgvNQAvc3BlY3RyYWw4LzUAL3BpeWc4LzUAL2JyYmc4LzUAL3B1cmQ4LzUAL3lsb3JyZDgvNQAvb3JyZDgvNQAvcGFpcmVkOC81AC9zZXQzOC81AC9zZXQyOC81AC9wYXN0ZWwyOC81AC9kYXJrMjgvNQAvc2V0MTgvNQAvcGFzdGVsMTgvNQAvcmRneTcvNQAvYnVwdTcvNQAvcmRwdTcvNQAvcHVidTcvNQAveWxnbmJ1Ny81AC9nbmJ1Ny81AC9yZHlsYnU3LzUAL3JkYnU3LzUAL2FjY2VudDcvNQAvZ3JleXM3LzUAL2dyZWVuczcvNQAvYmx1ZXM3LzUAL3B1cnBsZXM3LzUAL29yYW5nZXM3LzUAL3JlZHM3LzUAL3B1b3I3LzUAL3lsb3JicjcvNQAvcHVidWduNy81AC9idWduNy81AC9wcmduNy81AC9yZHlsZ243LzUAL3lsZ243LzUAL3NwZWN0cmFsNy81AC9waXlnNy81AC9icmJnNy81AC9wdXJkNy81AC95bG9ycmQ3LzUAL29ycmQ3LzUAL3BhaXJlZDcvNQAvc2V0MzcvNQAvc2V0MjcvNQAvcGFzdGVsMjcvNQAvZGFyazI3LzUAL3NldDE3LzUAL3Bhc3RlbDE3LzUAL3JkZ3k2LzUAL2J1cHU2LzUAL3JkcHU2LzUAL3B1YnU2LzUAL3lsZ25idTYvNQAvZ25idTYvNQAvcmR5bGJ1Ni81AC9yZGJ1Ni81AC9hY2NlbnQ2LzUAL2dyZXlzNi81AC9ncmVlbnM2LzUAL2JsdWVzNi81AC9wdXJwbGVzNi81AC9vcmFuZ2VzNi81AC9yZWRzNi81AC9wdW9yNi81AC95bG9yYnI2LzUAL3B1YnVnbjYvNQAvYnVnbjYvNQAvcHJnbjYvNQAvcmR5bGduNi81AC95bGduNi81AC9zcGVjdHJhbDYvNQAvcGl5ZzYvNQAvYnJiZzYvNQAvcHVyZDYvNQAveWxvcnJkNi81AC9vcnJkNi81AC9wYWlyZWQ2LzUAL3NldDM2LzUAL3NldDI2LzUAL3Bhc3RlbDI2LzUAL2RhcmsyNi81AC9zZXQxNi81AC9wYXN0ZWwxNi81AC9yZGd5NS81AC9idXB1NS81AC9yZHB1NS81AC9wdWJ1NS81AC95bGduYnU1LzUAL2duYnU1LzUAL3JkeWxidTUvNQAvcmRidTUvNQAvYWNjZW50NS81AC9ncmV5czUvNQAvZ3JlZW5zNS81AC9ibHVlczUvNQAvcHVycGxlczUvNQAvb3JhbmdlczUvNQAvcmVkczUvNQAvcHVvcjUvNQAveWxvcmJyNS81AC9wdWJ1Z241LzUAL2J1Z241LzUAL3ByZ241LzUAL3JkeWxnbjUvNQAveWxnbjUvNQAvc3BlY3RyYWw1LzUAL3BpeWc1LzUAL2JyYmc1LzUAL3B1cmQ1LzUAL3lsb3JyZDUvNQAvb3JyZDUvNQAvcGFpcmVkNS81AC9zZXQzNS81AC9zZXQyNS81AC9wYXN0ZWwyNS81AC9kYXJrMjUvNQAvc2V0MTUvNQAvcGFzdGVsMTUvNQAvcGFpcmVkMTIvNQAvc2V0MzEyLzUAL3JkZ3kxMS81AC9yZHlsYnUxMS81AC9yZGJ1MTEvNQAvcHVvcjExLzUAL3ByZ24xMS81AC9yZHlsZ24xMS81AC9zcGVjdHJhbDExLzUAL3BpeWcxMS81AC9icmJnMTEvNQAvcGFpcmVkMTEvNQAvc2V0MzExLzUAL3JkZ3kxMC81AC9yZHlsYnUxMC81AC9yZGJ1MTAvNQAvcHVvcjEwLzUAL3ByZ24xMC81AC9yZHlsZ24xMC81AC9zcGVjdHJhbDEwLzUAL3BpeWcxMC81AC9icmJnMTAvNQAvcGFpcmVkMTAvNQAvc2V0MzEwLzUAYmlnLTUAQklHLTUAIC1kYXNoIDUAaXZvcnk0AGdyZXk0AGRhcmtzbGF0ZWdyYXk0AFx4NABzbm93NABsaWdodHllbGxvdzQAaG9uZXlkZXc0AHdoZWF0NAB0b21hdG80AHJvc3licm93bjQAbWFyb29uNABsaWdodHNhbG1vbjQAbGVtb25jaGlmZm9uNABzcHJpbmdncmVlbjQAZGFya29saXZlZ3JlZW40AHBhbGVncmVlbjQAZGFya3NlYWdyZWVuNABsaWdodGN5YW40AHRhbjQAcGx1bTQAc2Vhc2hlbGw0AGNvcmFsNABob3RwaW5rNABsaWdodHBpbms0AGRlZXBwaW5rNABjb3Juc2lsazQAZmlyZWJyaWNrNABraGFraTQAbGF2ZW5kZXJibHVzaDQAcGVhY2hwdWZmNABiaXNxdWU0AGxpZ2h0c2t5Ymx1ZTQAZGVlcHNreWJsdWU0AGxpZ2h0Ymx1ZTQAY2FkZXRibHVlNABkb2RnZXJibHVlNABsaWdodHN0ZWVsYmx1ZTQAcm95YWxibHVlNABzbGF0ZWJsdWU0AG5hdmFqb3doaXRlNABhbnRpcXVld2hpdGU0AGNob2NvbGF0ZTQAY2hhcnRyZXVzZTQAbWlzdHlyb3NlNABwYWxldHVycXVvaXNlNABhenVyZTQAdGhlcmU0AGFxdWFtYXJpbmU0AHRoaXN0bGU0AG1lZGl1bXB1cnBsZTQAZGFya29yYW5nZTQAbGlnaHRnb2xkZW5yb2Q0AGRhcmtnb2xkZW5yb2Q0AGJ1cmx5d29vZDQAZ29sZDQAbWVkaXVtb3JjaGlkNABkYXJrb3JjaGlkNABwYWxldmlvbGV0cmVkNABpbmRpYW5yZWQ0AG9yYW5nZXJlZDQAb2xpdmVkcmFiNABtYWdlbnRhNABzaWVubmE0AFx4RjQAXHhFNABceEQ0AFx4QzQAXHhCNABceEE0AGdyZXk5NABncmF5OTQAXHg5NABncmV5ODQAZ3JheTg0AFx4ODQAZ3JleTc0AGdyYXk3NABncmV5NjQAZ3JheTY0AGdyZXk1NABncmF5NTQAMjAyNjAzMDMuMDQ1NABncmV5NDQAZ3JheTQ0AGdyZXkzNABncmF5MzQAZnJhYzM0AGdyZXkyNABncmF5MjQAZ3JleTE0AGdyYXkxNABceDE0AGZyYWMxNAAvcmRneTkvNAAvYnVwdTkvNAAvcmRwdTkvNAAvcHVidTkvNAAveWxnbmJ1OS80AC9nbmJ1OS80AC9yZHlsYnU5LzQAL3JkYnU5LzQAL2dyZXlzOS80AC9ncmVlbnM5LzQAL2JsdWVzOS80AC9wdXJwbGVzOS80AC9vcmFuZ2VzOS80AC9yZWRzOS80AC9wdW9yOS80AC95bG9yYnI5LzQAL3B1YnVnbjkvNAAvYnVnbjkvNAAvcHJnbjkvNAAvcmR5bGduOS80AC95bGduOS80AC9zcGVjdHJhbDkvNAAvcGl5ZzkvNAAvYnJiZzkvNAAvcHVyZDkvNAAveWxvcnJkOS80AC9vcnJkOS80AC9wYWlyZWQ5LzQAL3NldDM5LzQAL3NldDE5LzQAL3Bhc3RlbDE5LzQAL3JkZ3k4LzQAL2J1cHU4LzQAL3JkcHU4LzQAL3B1YnU4LzQAL3lsZ25idTgvNAAvZ25idTgvNAAvcmR5bGJ1OC80AC9yZGJ1OC80AC9hY2NlbnQ4LzQAL2dyZXlzOC80AC9ncmVlbnM4LzQAL2JsdWVzOC80AC9wdXJwbGVzOC80AC9vcmFuZ2VzOC80AC9yZWRzOC80AC9wdW9yOC80AC95bG9yYnI4LzQAL3B1YnVnbjgvNAAvYnVnbjgvNAAvcHJnbjgvNAAvcmR5bGduOC80AC95bGduOC80AC9zcGVjdHJhbDgvNAAvcGl5ZzgvNAAvYnJiZzgvNAAvcHVyZDgvNAAveWxvcnJkOC80AC9vcnJkOC80AC9wYWlyZWQ4LzQAL3NldDM4LzQAL3NldDI4LzQAL3Bhc3RlbDI4LzQAL2RhcmsyOC80AC9zZXQxOC80AC9wYXN0ZWwxOC80AC9yZGd5Ny80AC9idXB1Ny80AC9yZHB1Ny80AC9wdWJ1Ny80AC95bGduYnU3LzQAL2duYnU3LzQAL3JkeWxidTcvNAAvcmRidTcvNAAvYWNjZW50Ny80AC9ncmV5czcvNAAvZ3JlZW5zNy80AC9ibHVlczcvNAAvcHVycGxlczcvNAAvb3JhbmdlczcvNAAvcmVkczcvNAAvcHVvcjcvNAAveWxvcmJyNy80AC9wdWJ1Z243LzQAL2J1Z243LzQAL3ByZ243LzQAL3JkeWxnbjcvNAAveWxnbjcvNAAvc3BlY3RyYWw3LzQAL3BpeWc3LzQAL2JyYmc3LzQAL3B1cmQ3LzQAL3lsb3JyZDcvNAAvb3JyZDcvNAAvcGFpcmVkNy80AC9zZXQzNy80AC9zZXQyNy80AC9wYXN0ZWwyNy80AC9kYXJrMjcvNAAvc2V0MTcvNAAvcGFzdGVsMTcvNAAvcmRneTYvNAAvYnVwdTYvNAAvcmRwdTYvNAAvcHVidTYvNAAveWxnbmJ1Ni80AC9nbmJ1Ni80AC9yZHlsYnU2LzQAL3JkYnU2LzQAL2FjY2VudDYvNAAvZ3JleXM2LzQAL2dyZWVuczYvNAAvYmx1ZXM2LzQAL3B1cnBsZXM2LzQAL29yYW5nZXM2LzQAL3JlZHM2LzQAL3B1b3I2LzQAL3lsb3JicjYvNAAvcHVidWduNi80AC9idWduNi80AC9wcmduNi80AC9yZHlsZ242LzQAL3lsZ242LzQAL3NwZWN0cmFsNi80AC9waXlnNi80AC9icmJnNi80AC9wdXJkNi80AC95bG9ycmQ2LzQAL29ycmQ2LzQAL3BhaXJlZDYvNAAvc2V0MzYvNAAvc2V0MjYvNAAvcGFzdGVsMjYvNAAvZGFyazI2LzQAL3NldDE2LzQAL3Bhc3RlbDE2LzQAL3JkZ3k1LzQAL2J1cHU1LzQAL3JkcHU1LzQAL3B1YnU1LzQAL3lsZ25idTUvNAAvZ25idTUvNAAvcmR5bGJ1NS80AC9yZGJ1NS80AC9hY2NlbnQ1LzQAL2dyZXlzNS80AC9ncmVlbnM1LzQAL2JsdWVzNS80AC9wdXJwbGVzNS80AC9vcmFuZ2VzNS80AC9yZWRzNS80AC9wdW9yNS80AC95bG9yYnI1LzQAL3B1YnVnbjUvNAAvYnVnbjUvNAAvcHJnbjUvNAAvcmR5bGduNS80AC95bGduNS80AC9zcGVjdHJhbDUvNAAvcGl5ZzUvNAAvYnJiZzUvNAAvcHVyZDUvNAAveWxvcnJkNS80AC9vcnJkNS80AC9wYWlyZWQ1LzQAL3NldDM1LzQAL3NldDI1LzQAL3Bhc3RlbDI1LzQAL2RhcmsyNS80AC9zZXQxNS80AC9wYXN0ZWwxNS80AC9yZGd5NC80AC9idXB1NC80AC9yZHB1NC80AC9wdWJ1NC80AC95bGduYnU0LzQAL2duYnU0LzQAL3JkeWxidTQvNAAvcmRidTQvNAAvYWNjZW50NC80AC9ncmV5czQvNAAvZ3JlZW5zNC80AC9ibHVlczQvNAAvcHVycGxlczQvNAAvb3JhbmdlczQvNAAvcmVkczQvNAAvcHVvcjQvNAAveWxvcmJyNC80AC9wdWJ1Z240LzQAL2J1Z240LzQAL3ByZ240LzQAL3JkeWxnbjQvNAAveWxnbjQvNAAvc3BlY3RyYWw0LzQAL3BpeWc0LzQAL2JyYmc0LzQAL3B1cmQ0LzQAL3lsb3JyZDQvNAAvb3JyZDQvNAAvcGFpcmVkNC80AC9zZXQzNC80AC9zZXQyNC80AC9wYXN0ZWwyNC80AC9kYXJrMjQvNAAvc2V0MTQvNAAvcGFzdGVsMTQvNAAvcGFpcmVkMTIvNAAvc2V0MzEyLzQAL3JkZ3kxMS80AC9yZHlsYnUxMS80AC9yZGJ1MTEvNAAvcHVvcjExLzQAL3ByZ24xMS80AC9yZHlsZ24xMS80AC9zcGVjdHJhbDExLzQAL3BpeWcxMS80AC9icmJnMTEvNAAvcGFpcmVkMTEvNAAvc2V0MzExLzQAL3JkZ3kxMC80AC9yZHlsYnUxMC80AC9yZGJ1MTAvNAAvcHVvcjEwLzQAL3ByZ24xMC80AC9yZHlsZ24xMC80AC9zcGVjdHJhbDEwLzQAL3BpeWcxMC80AC9icmJnMTAvNAAvcGFpcmVkMTAvNAAvc2V0MzEwLzQAMS40AG4gPj0gNABzaWRlcyA9PSA0AGl2b3J5MwBTcGFyc2VNYXRyaXhfbXVsdGlwbHkzAGdyZXkzAGRhcmtzbGF0ZWdyYXkzAFx4MwBzbm93MwBsaWdodHllbGxvdzMAaG9uZXlkZXczAHdoZWF0MwBzdXAzAHRvbWF0bzMAcm9zeWJyb3duMwBtYXJvb24zAGxpZ2h0c2FsbW9uMwBsZW1vbmNoaWZmb24zAHNwcmluZ2dyZWVuMwBkYXJrb2xpdmVncmVlbjMAcGFsZWdyZWVuMwBkYXJrc2VhZ3JlZW4zAGxpZ2h0Y3lhbjMAdGFuMwBwbHVtMwBzZWFzaGVsbDMAY29yYWwzAGhvdHBpbmszAGxpZ2h0cGluazMAZGVlcHBpbmszAGNvcm5zaWxrMwBmaXJlYnJpY2szAGtoYWtpMwBsYXZlbmRlcmJsdXNoMwBwZWFjaHB1ZmYzAGJpc3F1ZTMAbGlnaHRza3libHVlMwBkZWVwc2t5Ymx1ZTMAbGlnaHRibHVlMwBjYWRldGJsdWUzAGRvZGdlcmJsdWUzAGxpZ2h0c3RlZWxibHVlMwByb3lhbGJsdWUzAHNsYXRlYmx1ZTMAbmF2YWpvd2hpdGUzAGFudGlxdWV3aGl0ZTMAY2hvY29sYXRlMwBjaGFydHJldXNlMwBtaXN0eXJvc2UzAHBhbGV0dXJxdW9pc2UzAGF6dXJlMwBhcXVhbWFyaW5lMwB0aGlzdGxlMwBtZWRpdW1wdXJwbGUzAGRhcmtvcmFuZ2UzAGxpZ2h0Z29sZGVucm9kMwBkYXJrZ29sZGVucm9kMwBidXJseXdvb2QzAGdvbGQzAG1lZGl1bW9yY2hpZDMAZGFya29yY2hpZDMAcGFsZXZpb2xldHJlZDMAaW5kaWFucmVkMwBvcmFuZ2VyZWQzAG9saXZlZHJhYjMAbWFnZW50YTMAc2llbm5hMwBceEYzAFx4RTMAXHhEMwBceEMzAFx4QjMAXHhBMwBncmV5OTMAZ3JheTkzAFx4OTMAZ3JleTgzAGdyYXk4MwBceDgzAGdyZXk3MwBncmF5NzMAZ3JleTYzAGdyYXk2MwBncmV5NTMAZ3JheTUzAFNUU0laRShuZXh0KSA8PSBVSU5UNjRfQygxKSA8PCA1MwBTVFNJWkUobikgPD0gVUlOVDY0X0MoMSkgPDwgNTMAZ3JleTQzAGdyYXk0MwBncmV5MzMAZ3JheTMzAGdyZXkyMwBncmF5MjMAZ3JleTEzAGdyYXkxMwBceDEzAC9yZGd5OS8zAC9idXB1OS8zAC9yZHB1OS8zAC9wdWJ1OS8zAC95bGduYnU5LzMAL2duYnU5LzMAL3JkeWxidTkvMwAvcmRidTkvMwAvZ3JleXM5LzMAL2dyZWVuczkvMwAvYmx1ZXM5LzMAL3B1cnBsZXM5LzMAL29yYW5nZXM5LzMAL3JlZHM5LzMAL3B1b3I5LzMAL3lsb3JicjkvMwAvcHVidWduOS8zAC9idWduOS8zAC9wcmduOS8zAC9yZHlsZ245LzMAL3lsZ245LzMAL3NwZWN0cmFsOS8zAC9waXlnOS8zAC9icmJnOS8zAC9wdXJkOS8zAC95bG9ycmQ5LzMAL29ycmQ5LzMAL3BhaXJlZDkvMwAvc2V0MzkvMwAvc2V0MTkvMwAvcGFzdGVsMTkvMwAvcmRneTgvMwAvYnVwdTgvMwAvcmRwdTgvMwAvcHVidTgvMwAveWxnbmJ1OC8zAC9nbmJ1OC8zAC9yZHlsYnU4LzMAL3JkYnU4LzMAL2FjY2VudDgvMwAvZ3JleXM4LzMAL2dyZWVuczgvMwAvYmx1ZXM4LzMAL3B1cnBsZXM4LzMAL29yYW5nZXM4LzMAL3JlZHM4LzMAL3B1b3I4LzMAL3lsb3JicjgvMwAvcHVidWduOC8zAC9idWduOC8zAC9wcmduOC8zAC9yZHlsZ244LzMAL3lsZ244LzMAL3NwZWN0cmFsOC8zAC9waXlnOC8zAC9icmJnOC8zAC9wdXJkOC8zAC95bG9ycmQ4LzMAL29ycmQ4LzMAL3BhaXJlZDgvMwAvc2V0MzgvMwAvc2V0MjgvMwAvcGFzdGVsMjgvMwAvZGFyazI4LzMAL3NldDE4LzMAL3Bhc3RlbDE4LzMAL3JkZ3k3LzMAL2J1cHU3LzMAL3JkcHU3LzMAL3B1YnU3LzMAL3lsZ25idTcvMwAvZ25idTcvMwAvcmR5bGJ1Ny8zAC9yZGJ1Ny8zAC9hY2NlbnQ3LzMAL2dyZXlzNy8zAC9ncmVlbnM3LzMAL2JsdWVzNy8zAC9wdXJwbGVzNy8zAC9vcmFuZ2VzNy8zAC9yZWRzNy8zAC9wdW9yNy8zAC95bG9yYnI3LzMAL3B1YnVnbjcvMwAvYnVnbjcvMwAvcHJnbjcvMwAvcmR5bGduNy8zAC95bGduNy8zAC9zcGVjdHJhbDcvMwAvcGl5ZzcvMwAvYnJiZzcvMwAvcHVyZDcvMwAveWxvcnJkNy8zAC9vcnJkNy8zAC9wYWlyZWQ3LzMAL3NldDM3LzMAL3NldDI3LzMAL3Bhc3RlbDI3LzMAL2RhcmsyNy8zAC9zZXQxNy8zAC9wYXN0ZWwxNy8zAC9yZGd5Ni8zAC9idXB1Ni8zAC9yZHB1Ni8zAC9wdWJ1Ni8zAC95bGduYnU2LzMAL2duYnU2LzMAL3JkeWxidTYvMwAvcmRidTYvMwAvYWNjZW50Ni8zAC9ncmV5czYvMwAvZ3JlZW5zNi8zAC9ibHVlczYvMwAvcHVycGxlczYvMwAvb3JhbmdlczYvMwAvcmVkczYvMwAvcHVvcjYvMwAveWxvcmJyNi8zAC9wdWJ1Z242LzMAL2J1Z242LzMAL3ByZ242LzMAL3JkeWxnbjYvMwAveWxnbjYvMwAvc3BlY3RyYWw2LzMAL3BpeWc2LzMAL2JyYmc2LzMAL3B1cmQ2LzMAL3lsb3JyZDYvMwAvb3JyZDYvMwAvcGFpcmVkNi8zAC9zZXQzNi8zAC9zZXQyNi8zAC9wYXN0ZWwyNi8zAC9kYXJrMjYvMwAvc2V0MTYvMwAvcGFzdGVsMTYvMwAvcmRneTUvMwAvYnVwdTUvMwAvcmRwdTUvMwAvcHVidTUvMwAveWxnbmJ1NS8zAC9nbmJ1NS8zAC9yZHlsYnU1LzMAL3JkYnU1LzMAL2FjY2VudDUvMwAvZ3JleXM1LzMAL2dyZWVuczUvMwAvYmx1ZXM1LzMAL3B1cnBsZXM1LzMAL29yYW5nZXM1LzMAL3JlZHM1LzMAL3B1b3I1LzMAL3lsb3JicjUvMwAvcHVidWduNS8zAC9idWduNS8zAC9wcmduNS8zAC9yZHlsZ241LzMAL3lsZ241LzMAL3NwZWN0cmFsNS8zAC9waXlnNS8zAC9icmJnNS8zAC9wdXJkNS8zAC95bG9ycmQ1LzMAL29ycmQ1LzMAL3BhaXJlZDUvMwAvc2V0MzUvMwAvc2V0MjUvMwAvcGFzdGVsMjUvMwAvZGFyazI1LzMAL3NldDE1LzMAL3Bhc3RlbDE1LzMAL3JkZ3k0LzMAL2J1cHU0LzMAL3JkcHU0LzMAL3B1YnU0LzMAL3lsZ25idTQvMwAvZ25idTQvMwAvcmR5bGJ1NC8zAC9yZGJ1NC8zAC9hY2NlbnQ0LzMAL2dyZXlzNC8zAC9ncmVlbnM0LzMAL2JsdWVzNC8zAC9wdXJwbGVzNC8zAC9vcmFuZ2VzNC8zAC9yZWRzNC8zAC9wdW9yNC8zAC95bG9yYnI0LzMAL3B1YnVnbjQvMwAvYnVnbjQvMwAvcHJnbjQvMwAvcmR5bGduNC8zAC95bGduNC8zAC9zcGVjdHJhbDQvMwAvcGl5ZzQvMwAvYnJiZzQvMwAvcHVyZDQvMwAveWxvcnJkNC8zAC9vcnJkNC8zAC9wYWlyZWQ0LzMAL3NldDM0LzMAL3NldDI0LzMAL3Bhc3RlbDI0LzMAL2RhcmsyNC8zAC9zZXQxNC8zAC9wYXN0ZWwxNC8zAC9yZGd5My8zAC9idXB1My8zAC9yZHB1My8zAC9wdWJ1My8zAC95bGduYnUzLzMAL2duYnUzLzMAL3JkeWxidTMvMwAvcmRidTMvMwAvYWNjZW50My8zAC9ncmV5czMvMwAvZ3JlZW5zMy8zAC9ibHVlczMvMwAvcHVycGxlczMvMwAvb3JhbmdlczMvMwAvcmVkczMvMwAvcHVvcjMvMwAveWxvcmJyMy8zAC9wdWJ1Z24zLzMAL2J1Z24zLzMAL3ByZ24zLzMAL3JkeWxnbjMvMwAveWxnbjMvMwAvc3BlY3RyYWwzLzMAL3BpeWczLzMAL2JyYmczLzMAL3B1cmQzLzMAL3lsb3JyZDMvMwAvb3JyZDMvMwAvcGFpcmVkMy8zAC9zZXQzMy8zAC9zZXQyMy8zAC9wYXN0ZWwyMy8zAC9kYXJrMjMvMwAvc2V0MTMvMwAvcGFzdGVsMTMvMwAvcGFpcmVkMTIvMwAvc2V0MzEyLzMAL3JkZ3kxMS8zAC9yZHlsYnUxMS8zAC9yZGJ1MTEvMwAvcHVvcjExLzMAL3ByZ24xMS8zAC9yZHlsZ24xMS8zAC9zcGVjdHJhbDExLzMAL3BpeWcxMS8zAC9icmJnMTEvMwAvcGFpcmVkMTEvMwAvc2V0MzExLzMAL3JkZ3kxMC8zAC9yZHlsYnUxMC8zAC9yZGJ1MTAvMwAvcHVvcjEwLzMAL3ByZ24xMC8zAC9yZHlsZ24xMC8zAC9zcGVjdHJhbDEwLzMAL3BpeWcxMC8zAC9icmJnMTAvMwAvcGFpcmVkMTAvMwAvc2V0MzEwLzMAMTQuMS4zAGl2b3J5MgBncmV5MgBkYXJrc2xhdGVncmF5MgBceDIAc25vdzIAbGlnaHR5ZWxsb3cyAGhvbmV5ZGV3MgBSVHJlZUluc2VydDIAd2hlYXQyAHN1cDIAbm9wMgB0b21hdG8yAHJvc3licm93bjIAbWFyb29uMgBsaWdodHNhbG1vbjIAbGVtb25jaGlmZm9uMgBzcHJpbmdncmVlbjIAZGFya29saXZlZ3JlZW4yAHBhbGVncmVlbjIAZGFya3NlYWdyZWVuMgBsaWdodGN5YW4yAHRhbjIAcGx1bTIAc2Vhc2hlbGwyAGNvcmFsMgBob3RwaW5rMgBsaWdodHBpbmsyAGRlZXBwaW5rMgBjb3Juc2lsazIAZmlyZWJyaWNrMgBraGFraTIAbGF2ZW5kZXJibHVzaDIAcGVhY2hwdWZmMgBicm9uemUyAGJpc3F1ZTIAbGlnaHRza3libHVlMgBkZWVwc2t5Ymx1ZTIAbGlnaHRibHVlMgBjYWRldGJsdWUyAGRvZGdlcmJsdWUyAGxpZ2h0c3RlZWxibHVlMgByb3lhbGJsdWUyAHNsYXRlYmx1ZTIAbmF2YWpvd2hpdGUyAGFudGlxdWV3aGl0ZTIAY2hvY29sYXRlMgBjaGFydHJldXNlMgBtaXN0eXJvc2UyAHBhbGV0dXJxdW9pc2UyAGF6dXJlMgBhcXVhbWFyaW5lMgB0aGlzdGxlMgBtZWRpdW1wdXJwbGUyAGRhcmtvcmFuZ2UyAGxpZ2h0Z29sZGVucm9kMgBkYXJrZ29sZGVucm9kMgBidXJseXdvb2QyAGdvbGQyAG1lZGl1bW9yY2hpZDIAZGFya29yY2hpZDIAcGFsZXZpb2xldHJlZDIAaW5kaWFucmVkMgBvcmFuZ2VyZWQyAG9saXZlZHJhYjIAbWFnZW50YTIAc2llbm5hMgBceEYyAFx4RTIAXHhEMgBceEMyAFx4QjIAXHhBMgBncmV5OTIAZ3JheTkyAFx4OTIAZ3JleTgyAGdyYXk4MgBceDgyAGdyZXk3MgBncmF5NzIAZ3JleTYyAGdyYXk2MgBncmV5NTIAZ3JheTUyAGdyZXk0MgBncmF5NDIAZ3JleTMyAGdyYXkzMgBncmV5MjIAZ3JheTIyAGdyZXkxMgBncmF5MTIAXHgxMgBmcmFjMTIAL3BhaXJlZDEyLzEyAC9zZXQzMTIvMTIAL3JkZ3k5LzIAL2J1cHU5LzIAL3JkcHU5LzIAL3B1YnU5LzIAL3lsZ25idTkvMgAvZ25idTkvMgAvcmR5bGJ1OS8yAC9yZGJ1OS8yAC9ncmV5czkvMgAvZ3JlZW5zOS8yAC9ibHVlczkvMgAvcHVycGxlczkvMgAvb3JhbmdlczkvMgAvcmVkczkvMgAvcHVvcjkvMgAveWxvcmJyOS8yAC9wdWJ1Z245LzIAL2J1Z245LzIAL3ByZ245LzIAL3JkeWxnbjkvMgAveWxnbjkvMgAvc3BlY3RyYWw5LzIAL3BpeWc5LzIAL2JyYmc5LzIAL3B1cmQ5LzIAL3lsb3JyZDkvMgAvb3JyZDkvMgAvcGFpcmVkOS8yAC9zZXQzOS8yAC9zZXQxOS8yAC9wYXN0ZWwxOS8yAC9yZGd5OC8yAC9idXB1OC8yAC9yZHB1OC8yAC9wdWJ1OC8yAC95bGduYnU4LzIAL2duYnU4LzIAL3JkeWxidTgvMgAvcmRidTgvMgAvYWNjZW50OC8yAC9ncmV5czgvMgAvZ3JlZW5zOC8yAC9ibHVlczgvMgAvcHVycGxlczgvMgAvb3JhbmdlczgvMgAvcmVkczgvMgAvcHVvcjgvMgAveWxvcmJyOC8yAC9wdWJ1Z244LzIAL2J1Z244LzIAL3ByZ244LzIAL3JkeWxnbjgvMgAveWxnbjgvMgAvc3BlY3RyYWw4LzIAL3BpeWc4LzIAL2JyYmc4LzIAL3B1cmQ4LzIAL3lsb3JyZDgvMgAvb3JyZDgvMgAvcGFpcmVkOC8yAC9zZXQzOC8yAC9zZXQyOC8yAC9wYXN0ZWwyOC8yAC9kYXJrMjgvMgAvc2V0MTgvMgAvcGFzdGVsMTgvMgAvcmRneTcvMgAvYnVwdTcvMgAvcmRwdTcvMgAvcHVidTcvMgAveWxnbmJ1Ny8yAC9nbmJ1Ny8yAC9yZHlsYnU3LzIAL3JkYnU3LzIAL2FjY2VudDcvMgAvZ3JleXM3LzIAL2dyZWVuczcvMgAvYmx1ZXM3LzIAL3B1cnBsZXM3LzIAL29yYW5nZXM3LzIAL3JlZHM3LzIAL3B1b3I3LzIAL3lsb3JicjcvMgAvcHVidWduNy8yAC9idWduNy8yAC9wcmduNy8yAC9yZHlsZ243LzIAL3lsZ243LzIAL3NwZWN0cmFsNy8yAC9waXlnNy8yAC9icmJnNy8yAC9wdXJkNy8yAC95bG9ycmQ3LzIAL29ycmQ3LzIAL3BhaXJlZDcvMgAvc2V0MzcvMgAvc2V0MjcvMgAvcGFzdGVsMjcvMgAvZGFyazI3LzIAL3NldDE3LzIAL3Bhc3RlbDE3LzIAL3JkZ3k2LzIAL2J1cHU2LzIAL3JkcHU2LzIAL3B1YnU2LzIAL3lsZ25idTYvMgAvZ25idTYvMgAvcmR5bGJ1Ni8yAC9yZGJ1Ni8yAC9hY2NlbnQ2LzIAL2dyZXlzNi8yAC9ncmVlbnM2LzIAL2JsdWVzNi8yAC9wdXJwbGVzNi8yAC9vcmFuZ2VzNi8yAC9yZWRzNi8yAC9wdW9yNi8yAC95bG9yYnI2LzIAL3B1YnVnbjYvMgAvYnVnbjYvMgAvcHJnbjYvMgAvcmR5bGduNi8yAC95bGduNi8yAC9zcGVjdHJhbDYvMgAvcGl5ZzYvMgAvYnJiZzYvMgAvcHVyZDYvMgAveWxvcnJkNi8yAC9vcnJkNi8yAC9wYWlyZWQ2LzIAL3NldDM2LzIAL3NldDI2LzIAL3Bhc3RlbDI2LzIAL2RhcmsyNi8yAC9zZXQxNi8yAC9wYXN0ZWwxNi8yAC9yZGd5NS8yAC9idXB1NS8yAC9yZHB1NS8yAC9wdWJ1NS8yAC95bGduYnU1LzIAL2duYnU1LzIAL3JkeWxidTUvMgAvcmRidTUvMgAvYWNjZW50NS8yAC9ncmV5czUvMgAvZ3JlZW5zNS8yAC9ibHVlczUvMgAvcHVycGxlczUvMgAvb3JhbmdlczUvMgAvcmVkczUvMgAvcHVvcjUvMgAveWxvcmJyNS8yAC9wdWJ1Z241LzIAL2J1Z241LzIAL3ByZ241LzIAL3JkeWxnbjUvMgAveWxnbjUvMgAvc3BlY3RyYWw1LzIAL3BpeWc1LzIAL2JyYmc1LzIAL3B1cmQ1LzIAL3lsb3JyZDUvMgAvb3JyZDUvMgAvcGFpcmVkNS8yAC9zZXQzNS8yAC9zZXQyNS8yAC9wYXN0ZWwyNS8yAC9kYXJrMjUvMgAvc2V0MTUvMgAvcGFzdGVsMTUvMgAvcmRneTQvMgAvYnVwdTQvMgAvcmRwdTQvMgAvcHVidTQvMgAveWxnbmJ1NC8yAC9nbmJ1NC8yAC9yZHlsYnU0LzIAL3JkYnU0LzIAL2FjY2VudDQvMgAvZ3JleXM0LzIAL2dyZWVuczQvMgAvYmx1ZXM0LzIAL3B1cnBsZXM0LzIAL29yYW5nZXM0LzIAL3JlZHM0LzIAL3B1b3I0LzIAL3lsb3JicjQvMgAvcHVidWduNC8yAC9idWduNC8yAC9wcmduNC8yAC9yZHlsZ240LzIAL3lsZ240LzIAL3NwZWN0cmFsNC8yAC9waXlnNC8yAC9icmJnNC8yAC9wdXJkNC8yAC95bG9ycmQ0LzIAL29ycmQ0LzIAL3BhaXJlZDQvMgAvc2V0MzQvMgAvc2V0MjQvMgAvcGFzdGVsMjQvMgAvZGFyazI0LzIAL3NldDE0LzIAL3Bhc3RlbDE0LzIAL3JkZ3kzLzIAL2J1cHUzLzIAL3JkcHUzLzIAL3B1YnUzLzIAL3lsZ25idTMvMgAvZ25idTMvMgAvcmR5bGJ1My8yAC9yZGJ1My8yAC9hY2NlbnQzLzIAL2dyZXlzMy8yAC9ncmVlbnMzLzIAL2JsdWVzMy8yAC9wdXJwbGVzMy8yAC9vcmFuZ2VzMy8yAC9yZWRzMy8yAC9wdW9yMy8yAC95bG9yYnIzLzIAL3B1YnVnbjMvMgAvYnVnbjMvMgAvcHJnbjMvMgAvcmR5bGduMy8yAC95bGduMy8yAC9zcGVjdHJhbDMvMgAvcGl5ZzMvMgAvYnJiZzMvMgAvcHVyZDMvMgAveWxvcnJkMy8yAC9vcnJkMy8yAC9wYWlyZWQzLzIAL3NldDMzLzIAL3NldDIzLzIAL3Bhc3RlbDIzLzIAL2RhcmsyMy8yAC9zZXQxMy8yAC9wYXN0ZWwxMy8yAC9wYWlyZWQxMi8yAC9zZXQzMTIvMgAvcmRneTExLzIAL3JkeWxidTExLzIAL3JkYnUxMS8yAC9wdW9yMTEvMgAvcHJnbjExLzIAL3JkeWxnbjExLzIAL3NwZWN0cmFsMTEvMgAvcGl5ZzExLzIAL2JyYmcxMS8yAC9wYWlyZWQxMS8yAC9zZXQzMTEvMgAvcmRneTEwLzIAL3JkeWxidTEwLzIAL3JkYnUxMC8yAC9wdW9yMTAvMgAvcHJnbjEwLzIAL3JkeWxnbjEwLzIAL3NwZWN0cmFsMTAvMgAvcGl5ZzEwLzIAL2JyYmcxMC8yAC9wYWlyZWQxMC8yAC9zZXQzMTAvMgAxLjIAIC1kYXNoIDIAbGVuID49IDIAZXhwID09IDEgfHwgZXhwID09IDIAZGltID09IDIATkRfb3V0KHYpLnNpemUgPT0gMgBpdm9yeTEAZ3JleTEAZGFya3NsYXRlZ3JheTEAXHgxAHNub3cxAGxpZ2h0eWVsbG93MQBob25leWRldzEAbnNsaW1pdDEAd2hlYXQxAHN1cDEAbm9wMQB0b21hdG8xAHJvc3licm93bjEAbWFyb29uMQBsaWdodHNhbG1vbjEAbGVtb25jaGlmZm9uMQBsYXRpbjEAYWdvcGVuMQBzcHJpbmdncmVlbjEAZGFya29saXZlZ3JlZW4xAHBhbGVncmVlbjEAZGFya3NlYWdyZWVuMQBsaWdodGN5YW4xAHRhbjEAcGx1bTEAc2Vhc2hlbGwxAGNvcmFsMQBob3RwaW5rMQBsaWdodHBpbmsxAGRlZXBwaW5rMQBjb3Juc2lsazEAZmlyZWJyaWNrMQBqMCA8PSBpMSAmJiBpMSA8PSBqMQBraGFraTEAbGF2ZW5kZXJibHVzaDEAcGVhY2hwdWZmMQBiaXNxdWUxAGxpZ2h0c2t5Ymx1ZTEAZGVlcHNreWJsdWUxAGxpZ2h0Ymx1ZTEAY2FkZXRibHVlMQBkb2RnZXJibHVlMQBsaWdodHN0ZWVsYmx1ZTEAcm95YWxibHVlMQBzbGF0ZWJsdWUxAG5hdmFqb3doaXRlMQBhbnRpcXVld2hpdGUxAGNob2NvbGF0ZTEAY2hhcnRyZXVzZTEAbWlzdHlyb3NlMQBwYWxldHVycXVvaXNlMQBhenVyZTEAYXF1YW1hcmluZTEAdGhpc3RsZTEAbWVkaXVtcHVycGxlMQBkYXJrb3JhbmdlMQBhcmdfZTAgJiYgYXJnX2UxAGxpZ2h0Z29sZGVucm9kMQBkYXJrZ29sZGVucm9kMQBidXJseXdvb2QxAGdvbGQxAG1lZGl1bW9yY2hpZDEAZGFya29yY2hpZDEAcGFsZXZpb2xldHJlZDEAaW5kaWFucmVkMQBvcmFuZ2VyZWQxAG9saXZlZHJhYjEAbWFnZW50YTEAc2llbm5hMQBceEYxAFx4RTEAXHhEMQBceEMxAFx4QjEAXHhBMQBncmV5OTEAZ3JheTkxAFx4OTEAZ3JleTgxAGdyYXk4MQBceDgxAGdyZXk3MQBncmF5NzEAZ3JleTYxAGdyYXk2MQBncmV5NTEAZ3JheTUxAGdyZXk0MQBncmF5NDEAZ3JleTMxAGdyYXkzMQBncmV5MjEAZ3JheTIxAGdyZXkxMQBncmF5MTEAXHgxMQAvcGFpcmVkMTIvMTEAL3NldDMxMi8xMQAvcmRneTExLzExAC9yZHlsYnUxMS8xMQAvcmRidTExLzExAC9wdW9yMTEvMTEAL3ByZ24xMS8xMQAvcmR5bGduMTEvMTEAL3NwZWN0cmFsMTEvMTEAL3BpeWcxMS8xMQAvYnJiZzExLzExAC9wYWlyZWQxMS8xMQAvc2V0MzExLzExAGNzW2ldLT5zbGFjaygpPi0wLjAwMDAwMDEAL3JkZ3k5LzEAL2J1cHU5LzEAL3JkcHU5LzEAL3B1YnU5LzEAL3lsZ25idTkvMQAvZ25idTkvMQAvcmR5bGJ1OS8xAC9yZGJ1OS8xAC9ncmV5czkvMQAvZ3JlZW5zOS8xAC9ibHVlczkvMQAvcHVycGxlczkvMQAvb3JhbmdlczkvMQAvcmVkczkvMQAvcHVvcjkvMQAveWxvcmJyOS8xAC9wdWJ1Z245LzEAL2J1Z245LzEAL3ByZ245LzEAL3JkeWxnbjkvMQAveWxnbjkvMQAvc3BlY3RyYWw5LzEAL3BpeWc5LzEAL2JyYmc5LzEAL3B1cmQ5LzEAL3lsb3JyZDkvMQAvb3JyZDkvMQAvcGFpcmVkOS8xAC9zZXQzOS8xAC9zZXQxOS8xAC9wYXN0ZWwxOS8xAC9yZGd5OC8xAC9idXB1OC8xAC9yZHB1OC8xAC9wdWJ1OC8xAC95bGduYnU4LzEAL2duYnU4LzEAL3JkeWxidTgvMQAvcmRidTgvMQAvYWNjZW50OC8xAC9ncmV5czgvMQAvZ3JlZW5zOC8xAC9ibHVlczgvMQAvcHVycGxlczgvMQAvb3JhbmdlczgvMQAvcmVkczgvMQAvcHVvcjgvMQAveWxvcmJyOC8xAC9wdWJ1Z244LzEAL2J1Z244LzEAL3ByZ244LzEAL3JkeWxnbjgvMQAveWxnbjgvMQAvc3BlY3RyYWw4LzEAL3BpeWc4LzEAL2JyYmc4LzEAL3B1cmQ4LzEAL3lsb3JyZDgvMQAvb3JyZDgvMQAvcGFpcmVkOC8xAC9zZXQzOC8xAC9zZXQyOC8xAC9wYXN0ZWwyOC8xAC9kYXJrMjgvMQAvc2V0MTgvMQAvcGFzdGVsMTgvMQAvcmRneTcvMQAvYnVwdTcvMQAvcmRwdTcvMQAvcHVidTcvMQAveWxnbmJ1Ny8xAC9nbmJ1Ny8xAC9yZHlsYnU3LzEAL3JkYnU3LzEAL2FjY2VudDcvMQAvZ3JleXM3LzEAL2dyZWVuczcvMQAvYmx1ZXM3LzEAL3B1cnBsZXM3LzEAL29yYW5nZXM3LzEAL3JlZHM3LzEAL3B1b3I3LzEAL3lsb3JicjcvMQAvcHVidWduNy8xAC9idWduNy8xAC9wcmduNy8xAC9yZHlsZ243LzEAL3lsZ243LzEAL3NwZWN0cmFsNy8xAC9waXlnNy8xAC9icmJnNy8xAC9wdXJkNy8xAC95bG9ycmQ3LzEAL29ycmQ3LzEAL3BhaXJlZDcvMQAvc2V0MzcvMQAvc2V0MjcvMQAvcGFzdGVsMjcvMQAvZGFyazI3LzEAL3NldDE3LzEAL3Bhc3RlbDE3LzEAL3JkZ3k2LzEAL2J1cHU2LzEAL3JkcHU2LzEAL3B1YnU2LzEAL3lsZ25idTYvMQAvZ25idTYvMQAvcmR5bGJ1Ni8xAC9yZGJ1Ni8xAC9hY2NlbnQ2LzEAL2dyZXlzNi8xAC9ncmVlbnM2LzEAL2JsdWVzNi8xAC9wdXJwbGVzNi8xAC9vcmFuZ2VzNi8xAC9yZWRzNi8xAC9wdW9yNi8xAC95bG9yYnI2LzEAL3B1YnVnbjYvMQAvYnVnbjYvMQAvcHJnbjYvMQAvcmR5bGduNi8xAC95bGduNi8xAC9zcGVjdHJhbDYvMQAvcGl5ZzYvMQAvYnJiZzYvMQAvcHVyZDYvMQAveWxvcnJkNi8xAC9vcnJkNi8xAC9wYWlyZWQ2LzEAL3NldDM2LzEAL3NldDI2LzEAL3Bhc3RlbDI2LzEAL2RhcmsyNi8xAC9zZXQxNi8xAC9wYXN0ZWwxNi8xAC9yZGd5NS8xAC9idXB1NS8xAC9yZHB1NS8xAC9wdWJ1NS8xAC95bGduYnU1LzEAL2duYnU1LzEAL3JkeWxidTUvMQAvcmRidTUvMQAvYWNjZW50NS8xAC9ncmV5czUvMQAvZ3JlZW5zNS8xAC9ibHVlczUvMQAvcHVycGxlczUvMQAvb3JhbmdlczUvMQAvcmVkczUvMQAvcHVvcjUvMQAveWxvcmJyNS8xAC9wdWJ1Z241LzEAL2J1Z241LzEAL3ByZ241LzEAL3JkeWxnbjUvMQAveWxnbjUvMQAvc3BlY3RyYWw1LzEAL3BpeWc1LzEAL2JyYmc1LzEAL3B1cmQ1LzEAL3lsb3JyZDUvMQAvb3JyZDUvMQAvcGFpcmVkNS8xAC9zZXQzNS8xAC9zZXQyNS8xAC9wYXN0ZWwyNS8xAC9kYXJrMjUvMQAvc2V0MTUvMQAvcGFzdGVsMTUvMQAvcmRneTQvMQAvYnVwdTQvMQAvcmRwdTQvMQAvcHVidTQvMQAveWxnbmJ1NC8xAC9nbmJ1NC8xAC9yZHlsYnU0LzEAL3JkYnU0LzEAL2FjY2VudDQvMQAvZ3JleXM0LzEAL2dyZWVuczQvMQAvYmx1ZXM0LzEAL3B1cnBsZXM0LzEAL29yYW5nZXM0LzEAL3JlZHM0LzEAL3B1b3I0LzEAL3lsb3JicjQvMQAvcHVidWduNC8xAC9idWduNC8xAC9wcmduNC8xAC9yZHlsZ240LzEAL3lsZ240LzEAL3NwZWN0cmFsNC8xAC9waXlnNC8xAC9icmJnNC8xAC9wdXJkNC8xAC95bG9ycmQ0LzEAL29ycmQ0LzEAL3BhaXJlZDQvMQAvc2V0MzQvMQAvc2V0MjQvMQAvcGFzdGVsMjQvMQAvZGFyazI0LzEAL3NldDE0LzEAL3Bhc3RlbDE0LzEAL3JkZ3kzLzEAL2J1cHUzLzEAL3JkcHUzLzEAL3B1YnUzLzEAL3lsZ25idTMvMQAvZ25idTMvMQAvcmR5bGJ1My8xAC9yZGJ1My8xAC9hY2NlbnQzLzEAL2dyZXlzMy8xAC9ncmVlbnMzLzEAL2JsdWVzMy8xAC9wdXJwbGVzMy8xAC9vcmFuZ2VzMy8xAC9yZWRzMy8xAC9wdW9yMy8xAC95bG9yYnIzLzEAL3B1YnVnbjMvMQAvYnVnbjMvMQAvcHJnbjMvMQAvcmR5bGduMy8xAC95bGduMy8xAC9zcGVjdHJhbDMvMQAvcGl5ZzMvMQAvYnJiZzMvMQAvcHVyZDMvMQAveWxvcnJkMy8xAC9vcnJkMy8xAC9wYWlyZWQzLzEAL3NldDMzLzEAL3NldDIzLzEAL3Bhc3RlbDIzLzEAL2RhcmsyMy8xAC9zZXQxMy8xAC9wYXN0ZWwxMy8xAC9wYWlyZWQxMi8xAC9zZXQzMTIvMQAvcmRneTExLzEAL3JkeWxidTExLzEAL3JkYnUxMS8xAC9wdW9yMTEvMQAvcHJnbjExLzEAL3JkeWxnbjExLzEAL3NwZWN0cmFsMTEvMQAvcGl5ZzExLzEAL2JyYmcxMS8xAC9wYWlyZWQxMS8xAC9zZXQzMTEvMQAvcmRneTEwLzEAL3JkeWxidTEwLzEAL3JkYnUxMC8xAC9wdW9yMTAvMQAvcHJnbjEwLzEAL3JkeWxnbjEwLzEAL3NwZWN0cmFsMTAvMQAvcGl5ZzEwLzEAL2JyYmcxMC8xAC9wYWlyZWQxMC8xAC9zZXQzMTAvMQBsYXRpbi0xAElTT184ODU5LTEASVNPODg1OS0xAElTTy04ODU5LTEAaSA+PSAxAHEtPm4gPT0gMQBydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0ucGFydGl0aW9uW2ldID09IDAgfHwgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLnBhcnRpdGlvbltpXSA9PSAxAGJ6LnNpemUgJSAzID09IDEATElTVF9TSVpFKCZjdHgtPlRyZWVfZWRnZSkgPT0gY3R4LT5OX25vZGVzIC0gMQBub2RlX3NldF9zaXplKGctPm5faWQpID09IG9zaXplICsgMQBuLT5jb3VudCArICgqbm4pLT5jb3VudCA9PSBOT0RFQ0FSRCArIDEAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdICsgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID09IE5PREVDQVJEICsgMQBncmV5MABncmF5MABqc29uMAAjZjBmMGYwACNlMGUwZTAAeGItPmxvY2F0ZWQgPiBBR1hCVUZfSU5MSU5FX1NJWkVfMABcMABUMABceEYwAFx4RTAAXHhEMABceEMwAFx4QjAAXHhBMABncmV5OTAAZ3JheTkwAFx4OTAAZ3JleTgwAGdyYXk4MABceDgwACM4MDgwODAAZ3JleTcwAGdyYXk3MABjY3dyb3QgPT0gMCB8fCBjY3dyb3QgPT0gOTAgfHwgY2N3cm90ID09IDE4MCB8fCBjY3dyb3QgPT0gMjcwAGN3cm90ID09IDAgfHwgY3dyb3QgPT0gOTAgfHwgY3dyb3QgPT0gMTgwIHx8IGN3cm90ID09IDI3MABncmV5NjAAZ3JheTYwAGdyZXk1MABncmF5NTAAZ3JleTQwAGdyYXk0MAByLndpZHRoKCk8MWU0MABncmV5MzAAZ3JheTMwACMzMDMwMzAAZ3JleTIwAGdyYXkyMABncmV5MTAAZ3JheTEwAFx4MTAAIzEwMTAxMAAvcGFpcmVkMTIvMTAAL3NldDMxMi8xMAAvcmRneTExLzEwAC9yZHlsYnUxMS8xMAAvcmRidTExLzEwAC9wdW9yMTEvMTAAL3ByZ24xMS8xMAAvcmR5bGduMTEvMTAAL3NwZWN0cmFsMTEvMTAAL3BpeWcxMS8xMAAvYnJiZzExLzEwAC9wYWlyZWQxMS8xMAAvc2V0MzExLzEwAC9yZGd5MTAvMTAAL3JkeWxidTEwLzEwAC9yZGJ1MTAvMTAAL3B1b3IxMC8xMAAvcHJnbjEwLzEwAC9yZHlsZ24xMC8xMAAvc3BlY3RyYWwxMC8xMAAvcGl5ZzEwLzEwAC9icmJnMTAvMTAAL3BhaXJlZDEwLzEwAC9zZXQzMTAvMTAAMTIwMABncmV5MTAwAGdyYXkxMDAASVNPLUlSLTEwMAAxMDAwMAAlIVBTLUFkb2JlLTMuMABueiA+IDAAbGlzdC0+Y2FwYWNpdHkgPiAwAGRpc3QgPiAwAHBhdGhjb3VudCA+IDAAd2d0ID4gMABuc2l0ZXMgPiAwAHNpZGVzID4gMABydiA9PSAwIHx8IChORF9vcmRlcihydiktTkRfb3JkZXIodikpKmRpciA+IDAAaW5wbiA+IDAAbGVuID4gMABxdDEtPm4gPiAwICYmIHF0Mi0+biA+IDAAbSA+IDAgJiYgbiA+IDAAbmV3VG90YWwgPiAwAHdpZHRoID4gMABsaXN0LT5zaXplID4gMABkaWN0LT5zaXplID4gMABzcGwtPnNpemUgPiAwAHNlbGYtPnNpemUgPiAwAGJ6LnNpemUgPiAwAGluY3JlYXNlID4gMABib3VuZCA+IDAAZ3JhcGgtPndlaWdodHNbeF0gPiAwAGdyYXBoLT53ZWlnaHRzW25fZWRnZXNdID4gMABpbmRleCA+PSAwAHQgPj0gMABubm9kZXMgPj0gMABuX25vZGVzID49IDAAbl9vYnMgPj0gMABuID49IDAAbi0+bGV2ZWwgPj0gMABvcmlnaW5hbCA+PSAwAE1heHJhbmsgPj0gMABQYWNrID49IDAAaWkgPCAxPDxkaW0gJiYgaWkgPj0gMAB3aWR0aCA+PSAwAGpkaWFnID49IDAAaWRpYWcgPj0gMABkID49IDAAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdID49IDAgJiYgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID49IDAAViA+PSAwAGFnbm5vZGVzKGdyYXBoKSA+PSAwAGFnbm5vZGVzKGcpID49IDAARURfdHJlZV9pbmRleChlKSA+PSAwAEVEX2NvdW50KGUpID49IDAAb2JqcDEtPnN6LnggPT0gMCAmJiBvYmpwMS0+c3oueSA9PSAwAGNfY250ID09IDAAcmFua19yZXN1bHQgPT0gMABnZXR0aW1lb2ZkYXlfcmVzID09IDAAaiA9PSAwAE5EX2luKHJpZ2h0KS5zaXplICsgTkRfb3V0KHJpZ2h0KS5zaXplID09IDAAYS5zaGFwZSA9PSAwIHx8IGIuc2hhcGUgPT0gMABsaXN0LT5iYXNlICE9IE5VTEwgfHwgaW5kZXggPT0gMCB8fCBzdHJpZGUgPT0gMABkdHNpemUoZGVzdCkgPT0gMABkdHNpemUoZy0+bl9zZXEpID09IDAAZHRzaXplKGctPmdfc2VxKSA9PSAwAGR0c2l6ZShnLT5lX3NlcSkgPT0gMABHRF9taW5yYW5rKGcpID09IDAAZHRzaXplKGctPmdfaWQpID09IDAAZHRzaXplKGctPmVfaWQpID09IDAAY29zeCAhPSAwIHx8IHNpbnggIT0gMAByZXFfYWxpZ25tZW50ICE9IDAAbWVtY21wKCZzdHlsZSwgJihncmFwaHZpel9wb2x5Z29uX3N0eWxlX3QpezB9LCBzaXplb2Yoc3R5bGUpKSAhPSAwAHJlc3VsdCA9PSAoaW50KShzaXplIC0gMSkgfHwgcmVzdWx0IDwgMABtYXNrW2lpXSA8IDAATkRfaGVhcGluZGV4KHYpIDwgMABcLwBYMTEvAGd2UmVuZGVySm9icyAlczogJS4yZiBzZWNzLgAlLipzLgBzcGVjaWZpZWQgcm9vdCBub2RlICIlcyIgd2FzIG5vdCBmb3VuZC4AR3JhcGggJXMgaGFzIGFycmF5IHBhY2tpbmcgd2l0aCB1c2VyIHZhbHVlcyBidXQgbm8gInNvcnR2IiBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkLgAxLgAtMC4AJSFQUy1BZG9iZS0AJVBERi0APCEtLQAgLAArACoAc3RyZXEoYXB0ci0+dS5uYW1lLEtleSkAIWlzX2V4YWN0bHlfZXF1YWwoUi54LCBRLngpIHx8ICFpc19leGFjdGx5X2VxdWFsKFIueSwgUS55KQBORF9vcmRlcih2KSA8IE5EX29yZGVyKHcpAHUgPT0gVUZfZmluZCh1KQAhTElTVF9JU19FTVBUWShwbGlzdCkAZ3ZfbGlzdF9pc19jb250aWd1b3VzXygqbGlzdCkAb25lIDw9IExJU1RfU0laRShsaXN0KQBucCA8IExJU1RfU0laRShsaXN0KQBpc19wb3dlcl9vZl8yKGFsaWdubWVudCkAc3RkOjppc19oZWFwKGhlYXAuYmVnaW4oKSwgaGVhcC5lbmQoKSwgZ3QpACEocS0+cXRzKQAhTElTVF9JU19FTVBUWSgmbGVhdmVzKQBvbl9oZWFwKHIpAG5vZGVfc2V0X3NpemUoZy0+bl9pZCkgPT0gKHNpemVfdClkdHNpemUoZy0+bl9zZXEpAE5EX3JhbmsoZnJvbSkgPCBORF9yYW5rKHRvKQBub3Qgd2VsbC1mb3JtZWQgKGludmFsaWQgdG9rZW4pAGFnc3VicmVwKGcsbikAbiAhPSBORF9uZXh0KG4pAGZpbmRfZmFzdF9ub2RlKGcsIG4pAChudWxsKQAoIWpjbikgJiYgKCF2YWwpACEocS0+bCkAc3ltLT5pZCA+PSAwICYmIHN5bS0+aWQgPCB0b3BkaWN0c2l6ZShvYmopAExJU1RfU0laRSgmYXJyKSA9PSAoc2l6ZV90KWFnbm5vZGVzKHNnKQBtb3ZlIHRvICglLjBmLCAlLjBmKQA7IHNwbGluZSB0byAoJS4wZiwgJS4wZikAOyBsaW5lIHRvICglLjBmLCAlLjBmKQBTcGFyc2VNYXRyaXhfaXNfc3ltbWV0cmljKEEsIHRydWUpAHZhbHVlICYmIHN0cmxlbih2YWx1ZSkAU3BhcnNlTWF0cml4X2lzX3N5bW1ldHJpYyhBLCBmYWxzZSkAIXVzZV9zdGFnZSB8fCBzaXplIDw9IHNpemVvZihzdGFnZSkARURfbGFiZWwoZmUpACFUUkVFX0VER0UoZSkAIWNvbnN0cmFpbmluZ19mbGF0X2VkZ2UoZywgZSkAbm9kZV9zZXRfaXNfZW1wdHkoZy0+bl9pZCkAcl8lZCkAbF8lZCkAKGxpYikAIVNwYXJzZU1hdHJpeF9oYXNfZGlhZ29uYWwoQSkAIHNjYW5uaW5nIGEgSFRNTCBzdHJpbmcgKG1pc3NpbmcgJz4nPyBiYWQgbmVzdGluZz8gbG9uZ2VyIHRoYW4gJWQ/KQAgc2Nhbm5pbmcgYSBxdW90ZWQgc3RyaW5nIChtaXNzaW5nIGVuZHF1b3RlPyBsb25nZXIgdGhhbiAlZD8pACBzY2FubmluZyBhIC8qLi4uKi8gY29tbWVudCAobWlzc2luZyAnKi8/IGxvbmdlciB0aGFuICVkPykAZmFsbGJhY2soNCkAb25faGVhcChyMCkgfHwgb25faGVhcChyMSkAYWd0YWlsKGUpID09IFVGX2ZpbmQoYWd0YWlsKGUpKQBhZ2hlYWQoZSkgPT0gVUZfZmluZChhZ2hlYWQoZSkpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9nZXRfbmV4dF9idWZmZXIoKQBvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eWVuc3VyZV9idWZmZXJfc3RhY2soKQBzdHJlcShtb2RlLCAiciIpIHx8IHN0cmVxKG1vZGUsICJyYiIpIHx8IHN0cmVxKG1vZGUsICJ3IikgfHwgc3RyZXEobW9kZSwgIndiIikAcG5hbWUgIT0gTlVMTCAmJiAhc3RyZXEocG5hbWUsICIiKQBzZXRsaW5ld2lkdGgoACkgcm90YXRlKCVkKSB0cmFuc2xhdGUoACB0cmFuc2Zvcm09InNjYWxlKABOT1RBVElPTigAICgAIG5lYXIgJyVzJwAlbGYsJWxmLCVsZiwnJVteJ10nAGlzZGlnaXQoKGludClkb3RwWzFdKSAmJiBpc2RpZ2l0KChpbnQpZG90cFsyXSkgJiYgZG90cFszXSA9PSAnXDAnACYAJQAkAHVybCgjADx0ZXh0UGF0aCB4bGluazpocmVmPSIjADxhcmVhIHNoYXBlPSJwb2x5IgAgZmlsbD0iIyUwMnglMDJ4JTAyeCIAKHNlcSAmIFNFUV9NQVNLKSA9PSBzZXEgJiYgInNlcXVlbmNlIElEIG92ZXJmbG93IgBndl9zb3J0X2NvbXBhciA9PSBOVUxMICYmIGd2X3NvcnRfYXJnID09IE5VTEwgJiYgInVuc3VwcG9ydGVkIHJlY3Vyc2l2ZSBjYWxsIHRvIGd2X3NvcnQiAGd2X3NvcnRfY29tcGFyICE9IE5VTEwgJiYgIm5vIGNvbXBhcmF0b3Igc2V0IGluIGd2X3NvcnQiAG9wLT5vcC51LnBvbHlnb24uY250IDw9IElOVF9NQVggJiYgInBvbHlnb24gY291bnQgZXhjZWVkcyBndnJlbmRlcl9wb2x5Z29uIHN1cHBvcnQiACB0ZXh0LWFuY2hvcj0ic3RhcnQiAHAueCAhPSBhICYmICJjYW5ub3QgaGFuZGxlIGVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpbiBob3Jpem9udGFsIGV4dHJlbWUgcG9pbnQiAGZ1bGxfbGVuZ3RoX3dpdGhvdXRfc2hhZnQgPiAwICYmICJub24tcG9zaXRpdmUgZnVsbCBsZW5ndGggd2l0aG91dCBzaGFmdCIAPGFyZWEgc2hhcGU9InJlY3QiAHNpemUgPiAwICYmICJhdHRlbXB0IHRvIGFsbG9jYXRlIGFycmF5IG9mIDAtc2l6ZWQgZWxlbWVudHMiAGluZGV4IDwgc2VsZi0+c2l6ZV9iaXRzICYmICJvdXQgb2YgYm91bmRzIGFjY2VzcyIAaW5kZXggPCBzZWxmLnNpemVfYml0cyAmJiAib3V0IG9mIGJvdW5kcyBhY2Nlc3MiACpzMSAhPSAqczIgJiYgImR1cGxpY2F0ZSBzZXBhcmF0b3IgY2hhcmFjdGVycyIAR0RfbWlucmFuayhzdWJnKSA8PSBHRF9tYXhyYW5rKHN1YmcpICYmICJjb3JydXB0ZWQgcmFuayBib3VuZHMiAGluZGV4IDwgbGlzdC5zaXplICYmICJpbmRleCBvdXQgb2YgYm91bmRzIgAodWludHB0cl90KXMgJSAyID09IDAgJiYgImhlYXAgcG9pbnRlciB3aXRoIGxvdyBiaXQgc2V0IHdpbGwgY29sbGlkZSB3aXRoIGFub255bW91cyBJRHMiACAoKyU2bGQgYnl0ZXMgJXN8JXUsIHhtbHBhcnNlLmM6JWQpICUqcyIAIGZvbnQtZmFtaWx5PSIlcyIAIGZvbnQtd2VpZ2h0PSIlcyIAIGZpbGw9IiVzIgAgZm9udC1zdHJldGNoPSIlcyIAIGZvbnQtc3R5bGU9IiVzIgBiYWQgZWRnZSBsZW4gIiVzIgAgYmFzZWxpbmUtc2hpZnQ9InN1cGVyIgBhZ3hibGVuKHhiKSA8PSBzaXplb2YoeGItPnN0b3JlKSAmJiAiYWd4YnVmIGNvcnJ1cHRpb24iAGNlbGwucm93IDwgdGFibGUtPnJvd19jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiAGNlbGwuY29sIDwgdGFibGUtPmNvbHVtbl9jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiACB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgBmdWxsX2xlbmd0aCA+IDAgJiYgIm5vbi1wb3NpdGl2ZSBmdWxsIGxlbmd0aCIAZnVsbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIGZ1bGwgYmFzZSB3aWR0aCIAbm9taW5hbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIG5vbWluYWwgYmFzZSB3aWR0aCIAIiB3aWR0aD0iJWdweCIgaGVpZ2h0PSIlZ3B4IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0IiB4PSIlZyIgeT0iJWciACIgd2lkdGg9IiVncHgiIGhlaWdodD0iJWdweCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgeD0iJWciIHk9IiVnIgAgZm9udC1zaXplPSIlLjJmIgAgZmlsbC1vcGFjaXR5PSIlZiIAPHRleHQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIAaXNmaW5pdGUobSkgJiYgImVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpcyBpbmZpbml0ZSIAKHhiLT5sb2NhdGVkID09IEFHWEJVRl9PTl9IRUFQIHx8IHhiLT5sb2NhdGVkIDw9IHNpemVvZih4Yi0+c3RvcmUpKSAmJiAiY29ycnVwdGVkIGFneGJ1ZiB0eXBlIgBBLT50eXBlID09IHR5cGUgJiYgImNhbGwgdG8gU3BhcnNlTWF0cml4X2Nvb3JkaW5hdGVfZm9ybV9hZGRfZW50cnkgIiAid2l0aCBpbmNvbXBhdGlibGUgdmFsdWUgdHlwZSIAIHRleHQtYW5jaG9yPSJtaWRkbGUiADxhcmVhIHNoYXBlPSJjaXJjbGUiAGNlbGwtPnJvdyArIGNlbGwtPnJvd3NwYW4gPD0gdGFibGUtPnJvd19jb3VudCAmJiAiY2VsbCBzcGFucyBoaWdoZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBjZWxsLnJvdyArIGNlbGwucm93c3BhbiA8PSB0YWJsZS0+cm93X2NvdW50ICYmICJjZWxsIHNwYW5zIGhpZ2hlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwtPmNvbCArIGNlbGwtPmNvbHNwYW4gPD0gdGFibGUtPmNvbHVtbl9jb3VudCAmJiAiY2VsbCBzcGFucyB3aWRlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwuY29sICsgY2VsbC5jb2xzcGFuIDw9IHRhYmxlLT5jb2x1bW5fY291bnQgJiYgImNlbGwgc3BhbnMgd2lkZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBvbGRfbm1lbWIgPCBTSVpFX01BWCAvIHNpemUgJiYgImNsYWltZWQgcHJldmlvdXMgZXh0ZW50IGlzIHRvbyBsYXJnZSIAdGhldGEgPj0gMCAmJiB0aGV0YSA8PSBNX1BJICYmICJ0aGV0YSBvdXQgb2YgcmFuZ2UiAHRhYmxlLT5oZWlnaHRzID09IE5VTEwgJiYgInRhYmxlIGhlaWdodHMgY29tcHV0ZWQgdHdpY2UiAHRhYmxlLT53aWR0aHMgPT0gTlVMTCAmJiAidGFibGUgd2lkdGhzIGNvbXB1dGVkIHR3aWNlIgAgdGV4dC1hbmNob3I9ImVuZCIAIGZvbnQtd2VpZ2h0PSJib2xkIgAgZm9udC1zdHlsZT0iaXRhbGljIgAgYmFzZWxpbmUtc2hpZnQ9InN1YiIAXCIAbGxlbiA8PSBJTlRfTUFYICYmICJYTUwgdG9rZW4gdG9vIGxvbmcgZm9yIGV4cGF0IEFQSSIAIiByeT0iAF9wIiBzdGFydE9mZnNldD0iNTAlIj48dHNwYW4geD0iMCIgZHk9IgAiIGN5PSIAIiB5PSIAIiByeD0iACBjeD0iACB4PSIAIHRhcmdldD0iACBwb2ludHM9IgAgY29vcmRzPSIAIHRleHQtZGVjb3JhdGlvbj0iACBmaWxsPSIAIiBzdHJva2Utd2lkdGg9IgA8aW1hZ2UgeGxpbms6aHJlZj0iADw/eG1sLXN0eWxlc2hlZXQgaHJlZj0iACIgbmFtZT0iACB4bGluazp0aXRsZT0iACB0aXRsZT0iACIgc3Ryb2tlPSIAPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0iADxkZWZzPgo8cmFkaWFsR3JhZGllbnQgaWQ9IgA8bWFwIGlkPSIAPGcgaWQ9IgAgZD0iACIgeTI9IgAiIHgyPSIAIiB5MT0iAHgxPSIAIHZpZXdCb3g9IiVkLjAwICVkLjAwICVkLjAwICVkLjAwIgAgdHJhbnNmb3JtPSJyb3RhdGUoJWQgJWcgJWcpIgBhZ3hibGVuKCZjdHgtPlNidWYpID09IDAgJiYgInBlbmRpbmcgc3RyaW5nIGRhdGEgdGhhdCB3YXMgbm90IGNvbnN1bWVkIChtaXNzaW5nICIgImVuZHN0cigpL2VuZGh0bWxzdHIoKT8pIgAgYWx0PSIiAEN5Y2xlIEVycm9yIQBQdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbGVkIQA8IS0tIEdlbmVyYXRlZCBieSAAJXMlenUgLSMlMDJ4JTAyeCUwMnglMDJ4IAAlcyV6dSAtIyUwMnglMDJ4JTAyeCAAJWMgJXp1IAB0ICV1IAAgY3JlYXRlIHRleHQgAHhMYXlvdXQgAGRlZmF1bHQgAHN0cmljdCAAJXMlenUgLSVzIAAgLXNtb290aCBiZXppZXIgACBtb3ZldG8gACB2ZXJzaW9uIAAgY3JlYXRlIHBvbHlnb24gACAtdGV4dCB7JXN9IC1maWxsIAAgY3JlYXRlIG92YWwgACAtd2lkdGggAG5ld3BhdGggAGdyYXBoIABzLCUuNWcsJS41ZyAAJS41ZywlLjVnLCUuNWcsJS41ZyAAZSwlLjVnLCUuNWcgACVnICVnIAAlLjAzbGYgACUuM2YgACVkICVkICVkICVkICVkICVkICUuMWYgJS40ZiAlZCAlLjFmICUuMWYgJS4wZiAlLjBmIAAgLW91dGxpbmUgACBjcmVhdGUgbGluZSAAbm9kZSAAW0dyYXBodml6XSAlczolZDogJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgACVkIABUb3RhbCBzaXplID4gMSBpbiAiJXMiIGNvbG9yIHNwZWMgAFsgL1JlY3QgWyAAVCAAUyAAT1BFTiAASSAARiAARSAAQyAAIC0+IABSYW5rIHNlcGFyYXRpb24gPSAAVW5zYXRpc2ZpZWQgY29uc3RyYWludDogAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzOiAAJXM6IABTb2x2aW5nIG1vZGVsOiAAU2V0dGluZyB1cCBzcHJpbmcgbW9kZWw6IABjb252ZXJ0IGdyYXBoOiAAIFRpdGxlOiAAInRleHQiOiAAeyJmcmFjIjogJS4wM2YsICJjb2xvciI6IAAibmFtZSI6IAAic3R5bGUiOiAAImZhY2UiOiAAMiAAPCEtLSAAIC0tIAAlIABfcCIgAGxfJWQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAADSAgICAgICAgICAgICAgICBpdGVyID0gJWQsIHN0ZXAgPSAlZiBGbm9ybSA9ICVmIG56ID0gJXp1ICBLID0gJWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgAAogICAgADoJIAAgICAgJXN9CgB0cnlpbmcgdG8gYWRkIHRvIHJlY3QgeyVmICsvLSAlZiwgJWYgKy8tICVmfQoAI2RlZmF1bHQgeyBmaW5pc2ggeyBhbWJpZW50IDAuMSBkaWZmdXNlIDAuOSB9IH0KAHBpZ21lbnQgeyBjb2xvciAlcyB9CgBsaWdodF9zb3VyY2UgeyA8MTUwMCwzMDAwLC0yNTAwPiBjb2xvciBXaGl0ZSB9CgBnbG9iYWxfc2V0dGluZ3MgeyBhc3N1bWVkX2dhbW1hIDEuMCB9CgAgICAgdGV4dHVyZSBJbWFnZVRleHR1cmUgeyB1cmwgIiVzIiB9CgAgICAgfQoALy9za3kKcGxhbmUgeyA8MCwgMSwgMD4sIDEgaG9sbG93CiAgICB0ZXh0dXJlIHsKICAgICAgICBwaWdtZW50IHsgYm96byB0dXJidWxlbmNlIDAuOTUKICAgICAgICAgICAgY29sb3JfbWFwIHsKICAgICAgICAgICAgICAgIFswLjAwIHJnYiA8MC4wNSwgMC4yMCwgMC41MD5dCiAgICAgICAgICAgICAgICBbMC41MCByZ2IgPDAuMDUsIDAuMjAsIDAuNTA+XQogICAgICAgICAgICAgICAgWzAuNzUgcmdiIDwxLjAwLCAxLjAwLCAxLjAwPl0KICAgICAgICAgICAgICAgIFswLjc1IHJnYiA8MC4yNSwgMC4yNSwgMC4yNT5dCiAgICAgICAgICAgICAgICBbMS4wMCByZ2IgPDAuNTAsIDAuNTAsIDAuNTA+XQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNjYWxlIDwxLjAwLCAxLjAwLCAxLjUwPiAqIDIuNTAKICAgICAgICAgICAgdHJhbnNsYXRlIDwwLjAwLCAwLjAwLCAwLjAwPgogICAgICAgIH0KICAgICAgICBmaW5pc2ggeyBhbWJpZW50IDEgZGlmZnVzZSAwIH0KICAgIH0KICAgIHNjYWxlIDEwMDAwCn0KLy9taXN0CmZvZyB7IGZvZ190eXBlIDIKICAgIGRpc3RhbmNlIDUwCiAgICBj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ZCBjZWxsIHNpemUgd2l0aCB1bnNwZWNpZmllZCB3aWR0aCBvciBoZWlnaHQKAGZpeGVkIHRhYmxlIHNpemUgd2l0aCB1bnNwZWNpZmllZCB3aWR0aCBvciBoZWlnaHQKAHBvcyBhdHRyaWJ1dGUgZm9yIGVkZ2UgKCVzLCVzKSBkb2Vzbid0IGhhdmUgM24rMSBwb2ludHMKACAgZ2VuZXJhdGVkICVkIGNvbnN0cmFpbnRzCgBzcGxpbmVzIGFuZCBjbHVzdGVyIGVkZ2VzIG5vdCBzdXBwb3J0ZWQgLSB1c2luZyBsaW5lIHNlZ21lbnRzCgBvYmplY3RzCgBXYXJuaW5nOiBub2RlICVzLCBwb3NpdGlvbiAlcywgZXhwZWN0ZWQgdHdvIGZsb2F0cwoAZm9udCBuYW1lICVzIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBtYXkgbm90IGJlIGFjY2VwdGVkIGJ5IHNvbWUgUFMgdmlld2VycwoAZm9udCBuYW1lICVzIGlzIGxvbmdlciB0aGFuIDI5IGNoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHJlamVjdGVkIGJ5IHNvbWUgUFMgdmlld2VycwoAY2Fubm90IGFsbG9jYXRlIHBzCgBzY2FsZT0xLjAgJXMgcmVxdWlyZWQgZm9yIGNvbXBhcmlzb25zCgBTZXR0aW5nIGluaXRpYWwgcG9zaXRpb25zCgAlcyBEV0IgMiBjb21wYXRpYmlsaXR5IGRlZmluaXRpb25zCgBhcnJheSBwYWNraW5nOiAlcyAlenUgcm93cyAlenUgY29sdW1ucwoAc3ludGF4IGFtYmlndWl0eSAtIGJhZGx5IGRlbGltaXRlZCBudW1iZXIgJyVzJyBpbiBsaW5lICVkIG9mICVzIHNwbGl0cyBpbnRvIHR3byB0b2tlbnMKAGVkZ2UgbGFiZWxzIHdpdGggc3BsaW5lcz1jdXJ2ZWQgbm90IHN1cHBvcnRlZCBpbiBkb3QgLSB1c2UgeGxhYmVscwoAZmxhdCBlZGdlIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgb25lIG9mIHdoaWNoIGhhcyBhIHJlY29yZCBzaGFwZSAtIHJlcGxhY2UgcmVjb3JkcyB3aXRoIEhUTUwtbGlrZSBsYWJlbHMKAG91dCBvZiBtZW1vcnkgd2hlbiB0cnlpbmcgdG8gYWxsb2NhdGUgJXp1IGJ5dGVzCgBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gdHJ5aW5nIHRvIGFsbG9jYXRlICV6dSAqICV6dSBieXRlcwoAdXBkYXRlOiBtaXNtYXRjaGVkIGxjYSBpbiB0cmVldXBkYXRlcwoAZ3JhcGggJXMsIGNvb3JkICVzLCBleHBlY3RlZCBmb3VyIGRvdWJsZXMKAG5vZGUgJXMsIHBvc2l0aW9uICVzLCBleHBlY3RlZCB0d28gZG91YmxlcwoARm91bmQgJWQgRGlHLUNvTGEgYm91bmRhcmllcwoASW5jaGVzCgAoJTR6dSkgJTd6dSBub2RlcyAlN3p1IGVkZ2VzCgBjb21wb3VuZEVkZ2VzOiBjb3VsZCBub3QgY29uc3RydWN0IG9ic3RhY2xlcyAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgB0aGUgYm91bmRpbmcgYm94ZXMgb2Ygc29tZSBub2RlcyB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBjb21wb3VuZEVkZ2VzOiBub2RlcyB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBzb21lIG5vZGVzIHdpdGggbWFyZ2luICglLjAyZiwlLjAyZikgdG91Y2ggLSBmYWxsaW5nIGJhY2sgdG8gc3RyYWlnaHQgbGluZSBlZGdlcwoAbWVyZ2UyOiBncmFwaCAlcywgcmFuayAlZCBoYXMgb25seSAlZCA8ICVkIG5vZGVzCgBTY2FubmluZyBncmFwaCAlcywgJWQgbm9kZXMKAFdhcm5pbmc6IG5vIGhhcmQtY29kZWQgbWV0cmljcyBmb3IgJyVzJy4gIEZhbGxpbmcgYmFjayB0byAnVGltZXMnIG1ldHJpY3MKAGluIGVkZ2UgJXMlcyVzCgBVc2luZyAlczogJXM6JXMKAEZvcm1hdDogIiVzIiBub3QgcmVjb2duaXplZC4gVXNlIG9uZSBvZjolcwoATGF5b3V0IHR5cGU6ICIlcyIgbm90IHJlY29nbml6ZWQuIFVzZSBvbmUgb2Y6JXMKAGxheW91dCAlcwoALmZ0ICVzCgBiYWQgbGFiZWwgZm9ybWF0ICVzCgBpbiByb3V0ZXNwbGluZXMsIGVkZ2UgaXMgYSBsb29wIGF0ICVzCgAgICAgICAgJTdkIG5vZGVzICU3ZCBlZGdlcyAlN3p1IGNvbXBvbmVudHMgJXMKAGluIGxhYmVsIG9mIGVkZ2UgJXMgJXMgJXMKACAgRWRnZSAlcyAlcyAlcwoAb3J0aG8gJXMgJXMKAHBvbHlsaW5lICVzICVzCgBzcGxpbmUgJXMgJXMKAHJlY3RhbmdsZSAoJS4wZiwlLjBmKSAoJS4wZiwlLjBmKSAlcyAlcwoAaW4gY2x1c3RlciAlcwoAJXMgd2FzIGFscmVhZHkgaW4gYSByYW5rc2V0LCBkZWxldGVkIGZyb20gY2x1c3RlciAlcwoAJXMgLT4gJXM6IHRhaWwgbm90IGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiBoZWFkIGlzIGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKAGhlYWQgY2x1c3RlciAlcyBpbnNpZGUgdGFpbCBjbHVzdGVyICVzCgBoZWFkIG5vZGUgJXMgaW5zaWRlIHRhaWwgY2x1c3RlciAlcwoAJXMgLT4gJXM6IGhlYWQgbm90IGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiB0YWlsIGlzIGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKAHRhaWwgY2x1c3RlciAlcyBpbnNpZGUgaGVhZCBjbHVzdGVyICVzCgB0YWlsIG5vZGUgJXMgaW5zaWRlIGhlYWQgY2x1c3RlciAlcwoAVW5oYW5kbGVkIGFkanVzdCBvcHRpb24gJXMKAHJlcG9zaXRpb24gJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggeGxhYmVsICVzCgBubyBwb3NpdGlvbiBmb3IgZWRnZSB3aXRoIHRhaWwgbGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggbGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggaGVhZCBsYWJlbCAlcwoALy8qKiogYmVnaW5fZ3JhcGggJXMKAE1heC4gaXRlcmF0aW9ucyAoJWQpIHJlYWNoZWQgb24gZ3JhcGggJXMKAENvdWxkIG5vdCBwYXJzZSAiX2JhY2tncm91bmQiIGF0dHJpYnV0ZSBpbiBncmFwaCAlcwoAaW4gbGFiZWwgb2YgZ3JhcGggJXMKAENyZWF0aW5nIGVkZ2VzIHVzaW5nICVzCgBBZGp1c3RpbmcgJXMgdXNpbmcgJXMKACVzIHdoaWxlIG9wZW5pbmcgJXMKAGRlcml2ZSBncmFwaCBfZGdfJWQgb2YgJXMKACBdICAlenUgdHJ1ZSAlcwoAXSAgJWQgdHJ1ZSAlcwoAIF0gICV6dSBmYWxzZSAlcwoAXSAgJWQgZmFsc2UgJXMKAG1ha2VQb2x5OiB1bmtub3duIHNoYXBlIHR5cGUgJXMKAG1ha2VBZGRQb2x5OiB1bmtub3duIHNoYXBlIHR5cGUgJXMKAHVzaW5nICVzIGZvciB1bmtub3duIHNoYXBlICVzCgAgIG9jdHJlZSBzY2hlbWUgJXMKAGNhbid0IG9wZW4gbGlicmFyeSBmaWxlICVzCgBjYW4ndCBmaW5kIGxpYnJhcnkgZmlsZSAlcwoAQm91bmRpbmdCb3ggbm90IGZvdW5kIGluIGVwc2YgZmlsZSAlcwoAY291bGRuJ3Qgb3BlbiBlcHNmIGZpbGUgJXMKAGNvdWxkbid0IHJlYWQgZnJvbSBlcHNmIGZpbGUgJXMKAGluIG5vZGUgJXMKAHNoYXBlZmlsZSBub3Qgc2V0IG9yIG5vdCBmb3VuZCBmb3IgZXBzZiBub2RlICVzCgBpbiBsYWJlbCBvZiBub2RlICVzCgBlbmQgJXMKAHJhbmtpbmc6IGZhaWx1cmUgdG8gY3JlYXRlIHN0cm9uZyBjb25zdHJhaW50IGVkZ2UgYmV0d2VlbiBub2RlcyAlcyBhbmQgJXMKAG9vcHMsIGludGVybmFsIGVycm9yOiB1bmhhbmRsZWQgY29sb3IgdHlwZT0lZCAlcwoAJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJS4xZiAlZCAlZCAlZCAlZCAlZCAlZAogJWQgJXMKAC8vKioqIHRleHRzcGFuOiAlcywgZm9udHNpemUgPSAlLjNmLCBmb250bmFtZSA9ICVzCgB0cmllcyA9ICVkLCBtb2RlID0gJXMKAC8vKioqIGNvbW1lbnQ6ICVzCgBmYWlsZWQgdG8gcmVzZXJ2ZSAlenUgZWxlbWVudHMgb2Ygc2l6ZSAlenUgYnl0ZXM6ICVzCgBmb250bmFtZTogIiVzIiByZXNvbHZlZCB0bzogJXMKACUlJSVQYWdlT3JpZW50YXRpb246ICVzCgBkZWxhdW5heV90cmlhbmd1bGF0aW9uOiAlcwoAZGVsYXVuYXlfdHJpOiAlcwoAZ3ZwcmludGY6ICVzCgBuZXN0aW5nIG5vdCBhbGxvd2VkIGluIHN0eWxlOiAlcwoAdW5tYXRjaGVkICcpJyBpbiBzdHlsZTogJXMKAHVubWF0Y2hlZCAnKCcgaW4gc3R5bGU6ICVzCgAlJSUlVGl0bGU6ICVzCgAlcyBUaXRsZTogJXMKACMgVGl0bGU6ICVzCgAvLyoqKiBiZWdpbl9ub2RlOiAlcwoAbGliL3BhdGhwbGFuLyVzOiVkOiAlcwoAZ3JpZCglZCwlZCk6ICVzCgBDb3VsZCBub3Qgb3BlbiAiJXMiIGZvciB3cml0aW5nIDogJXMKAHN0YXJ0IHBvcnQ6ICglLjVnLCAlLjVnKSwgdGFuZ2VudCBhbmdsZTogJS41ZywgJXMKAGVuZCBwb3J0OiAoJS41ZywgJS41ZyksIHRhbmdlbnQgYW5nbGU6ICUuNWcsICVzCgAgWyV6dV0gJXAgc2V0ICVkICglLjAyZiwlLjAyZikgKCUuMDJmLCUuMDJmKSAlcwoAJSUgJXMKACMgJXMKACAgbW9kZSAgICVzCgBsaXN0IGVsZW1lbnQgdHlwZSBpcyBub3QgYSBwb2ludGVyLCBidXQgYGZyZWVgIHVzZWQgYXMgZGVzdHJ1Y3RvcgoAY29uanVnYXRlX2dyYWRpZW50OiB1bmV4cGVjdGVkIGxlbmd0aCAwIHZlY3RvcgoAJXMgdG8gY2hhbmdlIGRyYXdpbmcgc2l6ZSwgbXVsdGlwbHkgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb24gdGhlIC5QUyBsaW5lIGFib3ZlIGFuZCB0aGUgbnVtYmVyIG9uIHRoZSB0d28gbGluZXMgYmVsb3cgKHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlcikgYnkgYSBzY2FsZSBmYWN0b3IKAGFkZF9zZWdtZW50OiBlcnJvcgoAJS41ZyAlLjVnICUuNWcgJXNjb2xvcgoAMCAwIDAgZWRnZWNvbG9yCgAwLjggMC44IDAuOCBzZXRyZ2Jjb2xvcgoAMCAwIDEgc2V0cmdiY29sb3IKADEgMCAwIHNldHJnYmNvbG9yCgAwIDAgMCBzZXRyZ2Jjb2xvcgoAJWQgJWQgc2V0bGF5ZXIKAC8vKioqIGVuZF9sYXllcgoAVVRGLTggaW5wdXQgdXNlcyBub24tTGF0aW4xIGNoYXJhY3RlcnMgd2hpY2ggY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhpcyBQb3N0U2NyaXB0IGRyaXZlcgoATGV0dGVyCgAvLyoqKiBiZWdpbl9jbHVzdGVyCgAvLyoqKiBlbmRfY2x1c3RlcgoAcmVtb3ZpbmcgZW1wdHkgY2x1c3RlcgoAQ2VudGVyCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlciAldS4gRmFsbGluZyBiYWNrIHRvIHdpZHRoIG9mIHNwYWNlIGNoYXJhY3RlcgoAYmFzZSByZWZlcmVyCgAlJVBhZ2VUcmFpbGVyCgAlJVRyYWlsZXIKAC8vKioqIGJlemllcgoAIiVzIiB3YXMgbm90IGZvdW5kIGFzIGEgZmlsZSBvciBhcyBhIHNoYXBlIGxpYnJhcnkgbWVtYmVyCgBzdG9wCgAgY3VydmV0bwoAbmV3cGF0aCAlLjBmICUuMGYgbW92ZXRvCgAlLjBmICUuMGYgbGluZXRvCgAgbGF5b3V0PW5lYXRvCgBub2RlICVzIGluIGdyYXBoICVzIGhhcyBubyBwb3NpdGlvbgoAJXMgbWF4cHNodCBhbmQgbWF4cHN3aWQgaGF2ZSBubyBtZWFuaW5nIGluIERXQiAyLjAsIHNldCBwYWdlIGJvdW5kYXJpZXMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaGFzIG5vIG1lYW5pbmcgaW4gRFdCIDIsIGFycm93aGVhZCA9IDcgbWFrZXMgZmlsbGVkIGFycm93aGVhZHMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaXMgdW5kZWZpbmVkIGluIERXQiAyLCBpbml0aWFsbHkgMSBpbiBncGljLCAyIGluIDEwdGggRWRpdGlvbgoAbWFqb3JpemF0aW9uCgAvLyoqKiBwb2x5Z29uCgBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyBlZGdlIHdlaWdodCBzdW0KAHNmZHAgb25seSBzdXBwb3J0cyBzdGFydD1yYW5kb20KAG5vZGUgcG9zaXRpb25zIGFyZSBpZ25vcmVkIHVubGVzcyBzdGFydD1yYW5kb20KAGNsb3NlcGF0aCBmaWxsCgAgZWxsaXBzZV9wYXRoIGZpbGwKACAgJS4wZiAlLjBmIGNlbGwKACVmICVmICVmICVmIGNlbGwKAGdyYXBoICVzIGlzIGRpc2Nvbm5lY3RlZC4gSGVuY2UsIHRoZSBjaXJjdWl0IG1vZGVsCgBncmFwaCBpcyBkaXNjb25uZWN0ZWQuIEhlbmNlLCB0aGUgY2lyY3VpdCBtb2RlbAoAZWRnZXMgaW4gZ3JhcGggJXMgaGF2ZSBubyBsZW4gYXR0cmlidXRlLiBIZW5jZSwgdGhlIG1kcyBtb2RlbAoAY2lyY3VpdCBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG1kcyBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG5vZGUgJyVzJywgZ3JhcGggJyVzJyBzaXplIHRvbyBzbWFsbCBmb3IgbGFiZWwKACVzIERXQiAyIGRvZXNuJ3QgdXNlIGZpbGwgYW5kIGRvZXNuJ3QgZGVmaW5lIGZpbGx2YWwKAFsge0NhdGFsb2d9IDw8IC9VUkkgPDwgL0Jhc2UgJXMgPj4gPj4KL1BVVCBwZGZtYXJrCgBbIC9Dcm9wQm94IFslZCAlZCAlZCAlZF0gL1BBR0VTIHBkZm1hcmsKACAgL0JvcmRlciBbIDAgMCAwIF0KICAvQWN0aW9uIDw8IC9TdWJ0eXBlIC9VUkkgL1VSSSAlcyA+PgogIC9TdWJ0eXBlIC9MaW5rCi9BTk4gcGRmbWFyawoAdHJvdWJsZSBpbiBpbml0X3JhbmsKAGxpbmV0aGljayA9IDA7IG9sZGxpbmV0aGljayA9IGxpbmV0aGljawoAIHNldGxpbmV3aWR0aAoAZ3NhdmUKJWQgJWQgJWQgJWQgYm94cHJpbSBjbGlwIG5ld3BhdGgKAGdzYXZlICVnICVnIHRyYW5zbGF0ZSBuZXdwYXRoCgAvLyoqKiBlbmRfZ3JhcGgKAGxheW91dCBhdHRyaWJ1dGUgaXMgaW52YWxpZCBleGNlcHQgb24gdGhlIHJvb3QgZ3JhcGgKAGluIGNoZWNrcGF0aCwgYm94ZXMgJXp1IGFuZCAlenUgZG9uJ3QgdG91Y2gKAG1lcmdlX29uZXdheSBnbGl0Y2gKACVzIGRvbid0IGNoYW5nZSBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaW4gdGhpcyBkcmF3aW5nCgBOb2RlIG5vdCBhZGphY2VudCB0byBjZWxsIC0tIEFib3J0aW5nCgBpbmNvbXBhcmFibGUgc2VnbWVudHMgISEgLS0gQWJvcnRpbmcKAEFsdGVybmF0aXZlbHksIGNvbnNpZGVyIHJ1bm5pbmcgbmVhdG8gdXNpbmcgLUdwYWNrPXRydWUgb3IgZGVjb21wb3NpbmcKAGxhYmVsX3NjaGVtZSA9ICVkID4gNCA6IGlnbm9yaW5nCgBndnJlbmRlcl9zZXRfc3R5bGU6IHVuc3VwcG9ydGVkIHN0eWxlICVzIC0gaWdub3JpbmcKAEFycm93IHR5cGUgIiVzIiB1bmtub3duIC0gaWdub3JpbmcKAGZkcCBkb2VzIG5vdCBzdXBwb3J0IHN0YXJ0PXNlbGYgLSBpZ25vcmluZwoAJXMgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgMSBvciAyIC0gaWdub3JpbmcKAE1vcmUgdGhhbiAyIGNvbG9ycyBzcGVjaWZpZWQgZm9yIGEgZ3JhZGllbnQgLSBpZ25vcmluZyByZW1haW5pbmcKAGFzIHJlcXVpcmVkIGJ5IHRoZSAtbiBmbGFnCgBiYlslc10gJS41ZyAlLjVnICUuNWcgJS41ZwoAL3BhdGhib3ggewogICAgL1kgZXhjaCAlLjVnIHN1YiBkZWYKICAgIC9YIGV4Y2ggJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCAlLjVnIHN1YiBkZWYKICAgIG5ld3BhdGggeCB5IG1vdmV0bwogICAgWCB5IGxpbmV0bwogICAgWCBZIGxpbmV0bwogICAgeCBZIGxpbmV0bwogICAgY2xvc2VwYXRoIHN0cm9rZQogfSBkZWYKL2RiZ3N0YXJ0IHsgZ3NhdmUgJS41ZyAlLjVnIHRyYW5zbGF0ZSB9IGRlZgovYXJyb3dsZW5ndGggMTAgZGVmCi9hcnJvd3dpZHRoIGFycm93bGVuZ3RoIDIgZGl2IGRlZgovYXJyb3doZWFkIHsKICAgIGdzYXZlCiAgICByb3RhdGUKICAgIGN1cnJlbnRwb2ludAogICAgbmV3cGF0aAogICAgbW92ZXRvCiAgICBhcnJvd2xlbmd0aCBhcnJvd3dpZHRoIDIgZGl2IHJsaW5ldG8KICAgIDAgYXJyb3d3aWR0aCBuZWcgcmxpbmV0bwogICAgY2xvc2VwYXRoIGZpbGwKICAgIGdyZXN0b3JlCn0gYmluZCBkZWYKL21ha2VhcnJvdyB7CiAgICBjdXJyZW50cG9pbnQgZXhjaCBwb3Agc3ViIGV4Y2ggY3VycmVudHBvaW50IHBvcCBzdWIgYXRhbgogICAgYXJyb3doZWFkCn0gYmluZCBkZWYKL3BvaW50IHsgICAgbmV3cGF0aCAgICAyIDAgMzYwIGFyYyBmaWxsfSBkZWYvbWFrZXZlYyB7CiAgICAvWSBleGNoIGRlZgogICAgL1ggZXhjaCBkZWYKICAgIC95IGV4Y2ggZGVmCiAgICAveCBleGNoIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIFkgbGluZXRvIHN0cm9rZQogICAgWCBZIG1vdmV0bwogICAgeCB5IG1ha2VhcnJvdwp9IGRlZgoAL3BhdGhib3ggewogICAgL1ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAvWSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIHkgbGluZXRvCiAgICBYIFkgbGluZXRvCiAgICB4IFkgbGluZXRvCiAgICBjbG9zZXBhdGggc3Ryb2tlCn0gZGVmCgAlIVBTLUFkb2JlLTIuMAovbm9kZSB7CiAgL1kgZXhjaCBkZWYKICAvWCBleGNoIGRlZgogIC95IGV4Y2ggZGVmCiAgL3ggZXhjaCBkZWYKICBuZXdwYXRoCiAgeCB5IG1vdmV0bwogIHggWSBsaW5ldG8KICBYIFkgbGluZXRvCiAgWCB5IGxpbmV0bwogIGNsb3NlcGF0aCBmaWxsCn0gZGVmCi9jZWxsIHsKICAvWSBleGNoIGRlZgogIC9YIGV4Y2ggZGVmCiAgL3kgZXhjaCBkZWYKICAveCBleGNoIGRlZgogIG5ld3BhdGgKICB4IHkgbW92ZXRvCiAgeCBZIGxpbmV0bwogIFggWSBsaW5ldG8KICBYIHkgbGluZXRvCiAgY2xvc2VwYXRoIHN0cm9rZQp9IGRlZgoAfSBiaW5kIGRlZgoALlBTICUuNWYgJS41ZgoAb3ZlcmxhcDogJXMgdmFsdWUgJWQgc2NhbGluZyAlLjA0ZgoAICBiZWF1dGlmeV9sZWF2ZXMgJWQgbm9kZSB3ZWlnaHRzICVkIHJvdGF0aW9uICUuMDNmCgAgIHJlcHVsc2l2ZSBleHBvbmVudDogJS4wM2YKACAgSyA6ICUuMDNmIEMgOiAlLjAzZgoAJXMgJS4zZgoACmludGVyc2VjdGlvbiBhdCAlLjNmICUuM2YKACAgICBzY2FsZSAlLjNmCgB0b3J1cyB7ICUuM2YsICUuM2YKACAgICA8JTkuM2YsICU5LjNmLCAlOS4zZj4sICUuM2YKACBpbiAlcyAtIHNldHRpbmcgdG8gJS4wMmYKAGNpcmNsZSAlcyAlLjBmLCUuMGYsJS4wZgoAcmVjdCAlcyAlLjBmLCUuMGYgJS4wZiwlLjBmCgAlZCAlZCAlZCAlLjBmICVkICVkICVkICVkICVkICUuM2YgJWQgJS40ZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYKACAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmCgAlJSUlUGFnZTogMSAxCiUlJSVQYWdlQm91bmRpbmdCb3g6ICUuMGYgJS4wZiAlLjBmICUuMGYKAHBvc1slenVdICUuMGYgJS4wZgoALm5yIFNGICUuMGYKc2NhbGV0aGlja25lc3MgPSAlLjBmCgAlcyBzYXZlIHBvaW50IHNpemUgYW5kIGZvbnQKLm5yIC5TIFxuKC5zCi5uciBERiBcbiguZgoAc2hvd3BhZ2UKJSUlJVRyYWlsZXIKJSUlJUJvdW5kaW5nQm94OiAlLmYgJS5mICUuZiAlLmYKAGFkZGluZyAlenUgaXRlbXMsIHRvdGFsIGFyZWEgPSAlZiwgdyA9ICVmLCBhcmVhL3c9JWYKAGdhcD0lZiwlZgoAICBhc3BlY3QgJWYKAGEgJWYgYiAlZiBjICVmIGQgJWYgciAlZgoAbW9kZWwgJWQgc21hcnRfaW5pdCAlZCBzdHJlc3N3dCAlZCBpdGVyYXRpb25zICVkIHRvbCAlZgoAU29sdmluZyBtb2RlbCAlZCBpdGVyYXRpb25zICVkIHRvbCAlZgoAJXMgY29vcmQgJS41ZyAlLjVnIGh0ICVmIHdpZHRoICVmCgByZWMgJWYgJWYgJWYgJWYKACVzIDogJWYgJWYgJWYgJWYKACVzIDogJWYgJWYKAG1heHBzaHQgPSAlZgptYXhwc3dpZCA9ICVmCgBtZHNNb2RlbDogZGVsdGEgPSAlZgoAIHIxICVmIHIyICVmCgBQYWNraW5nOiBjb21wdXRlIGdyaWQgc2l6ZQoAZ3NhdmUKACUlRW5kQ29tbWVudHMKc2F2ZQoAVW5yZWNvZ25pemVkIGNoYXJhY3RlciAnJWMnICglZCkgaW4gc2lkZXMgYXR0cmlidXRlCgBJbWFnZXMgdW5zdXBwb3J0ZWQgaW4gImJhY2tncm91bmQiIGF0dHJpYnV0ZQoAJXMgR05VIHBpYyB2cy4gMTB0aCBFZGl0aW9uIGRcKGUndGVudGUKAHJlc2V0ICVzIHNldCB0byBrbm93biBzdGF0ZQoAJWcgJWcgc2V0X3NjYWxlICVkIHJvdGF0ZSAlZyAlZyB0cmFuc2xhdGUKACVmICVmIHRyYW5zbGF0ZQoAJWQgJWQgdHJhbnNsYXRlCgAvLyoqKiBlbGxpcHNlCgBVbnJlY29nbml6ZWQgb3ZlcmxhcCB2YWx1ZSAiJXMiIC0gdXNpbmcgZmFsc2UKAG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKACVzOiB2c25wcmludGYgZmFpbHVyZQoAZW5kcGFnZQpzaG93cGFnZQpncmVzdG9yZQoAZW5kCnJlc3RvcmUKAGxheW91dCB3YXMgbm90IGRvbmUKAExheW91dCB3YXMgbm90IGRvbmUKAC8vKioqIHBvbHlsaW5lCgB0cnlpbmcgdG8gZGVsZXRlIGEgbm9uLWxpbmUKACMgZW5kIG9mIEZJRyBmaWxlCgBTaW5nbGUKAHJlbmRlcmVyIGZvciAlcyBpcyB1bmF2YWlsYWJsZQoAZHluYW1pYyBsb2FkaW5nIG5vdCBhdmFpbGFibGUKACUuMGYgJS4wZiBsaW5ldG8gc3Ryb2tlCgBjbG9zZXBhdGggc3Ryb2tlCgAgZWxsaXBzZV9wYXRoIHN0cm9rZQoALy8qKiogYmVnaW5fZWRnZQoALy8qKiogZW5kX2VkZ2UKAGxvc3QgJXMgJXMgZWRnZQoAb3ZlcmZsb3cgd2hlbiBjYWxjdWxhdGluZyB2aXJ0dWFsIHdlaWdodCBvZiBlZGdlCgBhZGRfdHJlZV9lZGdlOiBtaXNzaW5nIHRyZWUgZWRnZQoAaW4gcm91dGVzcGxpbmVzLCBjYW5ub3QgZmluZCBOT1JNQUwgZWRnZQoAc2hvd3BhZ2UKACVkICVkICVkIGJlZ2lucGFnZQoALy8qKiogYmVnaW5fcGFnZQoALy8qKiogZW5kX3BhZ2UKAEZpbGVuYW1lICIlcyIgaXMgdW5zYWZlCgBsYWJlbDogYXJlYSB0b28gbGFyZ2UgZm9yIHJ0cmVlCgAvLyoqKiBlbmRfbm9kZQoAVXNpbmcgZGVmYXVsdCBjYWxjdWxhdGlvbiBmb3Igcm9vdCBub2RlCgBjb250YWluX25vZGVzIGNsdXN0ICVzIHJhbmsgJWQgbWlzc2luZyBub2RlCgAlZiAlZiAlZiAlZiBub2RlCgA8PCAvUGFnZVNpemUgWyVkICVkXSA+PiBzZXRwYWdlZGV2aWNlCgBpbiBjaGVja3BhdGgsIGJveCAlenUgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGluIGNoZWNrcGF0aCwgYm94IDAgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGNsdXN0ZXIgbmFtZWQgJXMgbm90IGZvdW5kCgBtaW5jcm9zczogcGFzcyAlZCBpdGVyICVkIHRyeWluZyAlZCBjdXJfY3Jvc3MgJWxsZCBiZXN0X2Nyb3NzICVsbGQKAG5vZGUgJXMsIHBvcnQgJXMgdW5yZWNvZ25pemVkCgAlcyVzIHVuc3VwcG9ydGVkCgBjbHVzdGVyIGN5Y2xlICVzIC0tICVzIG5vdCBzdXBwb3J0ZWQKACVzIC0+ICVzOiBzcGxpbmUgc2l6ZSA+IDEgbm90IHN1cHBvcnRlZAoAbGF5b3V0IGFib3J0ZWQKAHBhZ2VkaXI9JXMgaWdub3JlZAoAVHdvIGNsdXN0ZXJzIG5hbWVkICVzIC0gdGhlIHNlY29uZCB3aWxsIGJlIGlnbm9yZWQKAElsbGVnYWwgYXR0cmlidXRlICVzIGluICVzIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgYXR0cmlidXRlICJtb2RlbCIgaW4gZ3JhcGggJXMgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBhdHRyaWJ1dGUgIm1vZGUiIGluIGdyYXBoICVzIC0gaWdub3JlZAoAc3RhcnQ9MCBub3Qgc3VwcG9ydGVkIHdpdGggbW9kZT1zZWxmIC0gaWdub3JlZAoAT3ZlcmxhcCB2YWx1ZSAiJXMiIHVuc3VwcG9ydGVkIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgUk9XUyAtIGlnbm9yZWQKAFVua25vd24gdmFsdWUgJXMgZm9yIENPTFVNTlMgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBWQUxJR04gLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBBTElHTiAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJXMgZm9yIEZJWEVEU0laRSAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJS4qcyBmb3IgU1RZTEUgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBCQUxJR04gaW4gVEQgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBBTElHTiBpbiBURCAtIGlnbm9yZWQKAFJPV1NQQU4gdmFsdWUgY2Fubm90IGJlIDAgLSBpZ25vcmVkCgBDT0xTUEFOIHZhbHVlIGNhbm5vdCBiZSAwIC0gaWdub3JlZAoAbm9kZSAlcywgcG9ydCAlcywgdW5yZWNvZ25pemVkIGNvbXBhc3MgcG9pbnQgJyVzJyAtIGlnbm9yZWQKAFVua25vd24gInNwbGluZXMiIHZhbHVlOiAiJXMiIC0gaWdub3JlZAoAaW4gcm91dGVzcGxpbmVzLCBQc2hvcnRlc3RwYXRoIGZhaWxlZAoAaW4gcm91dGVzcGxpbmVzLCBQcm91dGVzcGxpbmUgZmFpbGVkCgAjIHBsdWdpbiBsb2FkaW5nIG9mIGRlcGVuZGVuY3kgIiUuKnMiIGZhaWxlZAoAUGFyc2luZyBvZiAiJXMiIGZhaWxlZAoAJXM6JWQ6IGNsYWltZWQgdW5yZWFjaGFibGUgY29kZSB3YXMgcmVhY2hlZAoAIyB1bnN1Y2Nlc3NmdWwgcGx1Z2luIGxvYWQKACUuNWcgJS41ZyB0cmFuc2xhdGUgbmV3cGF0aCB1c2VyX3NoYXBlXyVkCgBuc2l6ZXNjYWxlPSVmLGl0ZXJhdGlvbnM9JWQKAGN0cmwtPm92ZXJsYXA9JWQKACVzICV6dSBub2RlcyAlenUgZWRnZXMgbWF4aXRlcj0lZCBiYWxhbmNlPSVkCgAvLyoqKiBiZWdpbl9sYXllcjogJXMsICVkLyVkCgBkZWdlbmVyYXRlIGNvbmNlbnRyYXRlZCByYW5rICVzLCVkCgAgIG1heCBsZXZlbHMgJWQKAAklcyAlZAoAICBCYXJuZXMtSHV0dCBjb25zdGFudCAlLjAzZiB0b2xlcmFuY2UgICUuMDNmIG1heGl0ZXIgJWQKAGd2d3JpdGVfbm9feiBwcm9ibGVtICVkCgAgIHF1YWR0cmVlIHNpemUgJWQgbWF4X2xldmVsICVkCgByZWJ1aWxkX3ZsaXN0czogbGVhZCBpcyBudWxsIGZvciByYW5rICVkCgByZWJ1aWxkX3ZsaXN0czogcmFuayBsZWFkICVzIG5vdCBpbiBvcmRlciAlZCBvZiByYW5rICVkCgAgIHNtb290aGluZyAlcyBvdmVybGFwICVkIGluaXRpYWxfc2NhbGluZyAlLjAzZiBkb19zaHJpbmtpbmcgJWQKACAgY29vbGluZyAlLjAzZiBzdGVwIHNpemUgICUuMDNmIGFkYXB0aXZlICVkCgBVbnN1cHBvcnRlZCBjaGFyc2V0IHZhbHVlICVkCgBpbiByb3V0ZXNwbGluZXMsIGlsbGVnYWwgdmFsdWVzIG9mIHByZXYgJWQgYW5kIG5leHQgJWQsIGxpbmUgJWQKACAgZWRnZV9s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bWluYXRpb24sIHZlcnNpb24gMgoAJXMgZmlsbHZhbCBpcyAwLjMgaW4gMTB0aCBFZGl0aW9uIChmaWxsIDAgbWVhbnMgYmxhY2spLCAwLjUgaW4gZ3BpYyAoZmlsbCAwIG1lYW5zIHdoaXRlKSwgdW5kZWZpbmVkIGluIERXQiAyCgAlcyByZXNldCB3b3JrcyBpbiBncGljIGFuZCAxMHRoIGVkaXRpb24sIGJ1dCBpc24ndCBkZWZpbmVkIGluIERXQiAyCgBzZXR1cExhdGluMQoAXDAwMQoAJXMgICAgICAgIHRvbGVyYW5jZSAwLjAxCgAgICAgdG9sZXJhbmNlIDAuMQoAJSVQYWdlczogMQoAICAgICAgICBkaWZmdXNlQ29sb3IgMSAxIDEKADEwMC4wMAoAIEVQU0YtMy4wCgAlcyBib3hyYWQgaXMgbm93IDAuMCBpbiBncGljLCBlbHNlIGl0IHJlbWFpbnMgMi4wCgBzcGhlcmUgezwlOS4zZiwgJTkuM2YsICU5LjNmPiwgMS4wCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2YgQVNDSUkgY2hhcmFjdGVyICV1LiBGYWxsaW5nIGJhY2sgdG8gMAoAaW5zdGFsbF9pbl9yYW5rLCBsaW5lICVkOiAlcyAlcyByYW5rICVkIGkgPSAlZCBhbiA9IDAKAGNvbmNlbnRyYXRlPXRydWUgbWF5IG5vdCB3b3JrIGNvcnJlY3RseS4KAE5vIGxpYnogc3VwcG9ydC4KAHR3b3BpOiB1c2Ugb2Ygd2VpZ2h0PTAgY3JlYXRlcyBkaXNjb25uZWN0ZWQgY29tcG9uZW50LgoAdGhlIGdyYXBoIGludG8gY29ubmVjdGVkIGNvbXBvbmVudHMuCgBPcnRob2dvbmFsIGVkZ2VzIGRvIG5vdCBjdXJyZW50bHkgaGFuZGxlIGVkZ2UgbGFiZWxzLiBUcnkgdXNpbmcgeGxhYmVscy4KAG1pbmNyb3NzICVzOiAlbGxkIGNyb3NzaW5ncywgJS4yZiBzZWNzLgoAJXMgaXMgbm90IGEga25vd24gY29sb3IuCgBpcyBpbmFwcHJvcHJpYXRlLiBSZXZlcnRpbmcgdG8gdGhlIHNob3J0ZXN0IHBhdGggbW9kZWwuCgBpcyB1bmRlZmluZWQuIFJldmVydGluZyB0byB0aGUgc2hvcnRlc3QgcGF0aCBtb2RlbC4KAFVuYWJsZSB0byByZWNsYWltIGJveCBzcGFjZSBpbiBzcGxpbmUgcm91dGluZyBmb3IgZWRnZSAiJXMiIC0+ICIlcyIuIFNvbWV0aGluZyBpcyBwcm9iYWJseSBzZXJpb3VzbHkgd3JvbmcuCgBFcnJvciBkdXJpbmcgY29udmVyc2lvbiB0byAiVVRGLTgiLiBRdWl0aW5nLgoAb3JkZXJpbmcgJyVzJyBub3QgcmVjb2duaXplZC4KAGdyYWRpZW50IHBlbiBjb2xvcnMgbm90IHlldCBzdXBwb3J0ZWQuCgAgIGluaXRDTWFqVlBTQyBkb25lOiAlZCBnbG9iYWwgY29uc3RyYWludHMgZ2VuZXJhdGVkLgoAVGhlIGNoYXJhY3RlciAnJWMnIGFwcGVhcnMgaW4gYm90aCB0aGUgbGF5ZXJzZXAgYW5kIGxheWVybGlzdHNlcCBhdHRyaWJ1dGVzIC0gbGF5ZXJsaXN0c2VwIGlnbm9yZWQuCgB0aGUgYXNwZWN0IGF0dHJpYnV0ZSBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gaW1wbGVtZW50YXRpb24gZmxhd3MgLSBhdHRyaWJ1dGUgaWdub3JlZC4KAFRoZSBsYXllcnNlbGVjdCBhdHRyaWJ1dGUgIiVzIiBkb2VzIG5vdCBtYXRjaCBhbnkgbGF5ZXIgc3BlY2lmZWQgYnkgdGhlIGxheWVycyBhdHRyaWJ1dGUgLSBpZ25vcmVkLgoAZWRnZSAlcyAtPiAlcyA6IHNldCBtb3JlIHRoYW4gb25lIHNwbGluZS4gRmlyc3QgdXNlZCwgb3RoZXIgZHJvcHBlZC4KACV6dSBvdXQgb2YgJXp1IGxhYmVscyBwb3NpdGlvbmVkLgoAJXp1IG91dCBvZiAlenUgZXh0ZXJpb3IgbGFiZWxzIHBvc2l0aW9uZWQuCgAgIGdlbmVyYXRlIGVkZ2UgY29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgTm9uLW92ZXJsYXAgQ29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgRWRnZSBDb25zdHJhaW50cy4uLgoAR2VuZXJhdGluZyBEaUctQ29MYSBFZGdlIENvbnN0cmFpbnRz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c2V0dGluZyBhIGJvdW5kaW5nIGJveCBzaXplLCBzZWUgZG90KDEpKQoAZXJyb3IgaW4gY29sb3J4bGF0ZSgpCgB0cnVuY2F0aW5nIHN0eWxlICclcycKAElsbGVnYWwgdmFsdWUgaW4gIiVzIiBjb2xvciBhdHRyaWJ1dGU7IGZsb2F0IGV4cGVjdGVkIGFmdGVyICc7JwoAZGVmaW5lIGF0dHJzMCAlJSAlJTsgZGVmaW5lIHVuZmlsbGVkICUlICUlOyBkZWZpbmUgcm91bmRlZCAlJSAlJTsgZGVmaW5lIGRpYWdvbmFscyAlJSAlJQoAPHN2ZyB3aWR0aD0iJWRwdCIgaGVpZ2h0PSIlZHB0IgoAIyBkZXBlbmRlbmNpZXMgIiUuKnMiIGRpZCBub3QgbWF0Y2ggIiUuKnMiCgAjIHR5cGUgIiUuKnMiIGRpZCBub3QgbWF0Y2ggIiUuKnMiCgAkYyBjcmVhdGUgaW1hZ2UgJS4yZiAlLjJmIC1pbWFnZSAicGhvdG9fJXMiCgBObyBvciBpbXByb3BlciBpbWFnZSBmaWxlPSIlcyIKAGZpbGUgbG9hZGluZyBpcyBkaXNhYmxlZCBiZWNhdXNlIHRoZSBlbnZpcm9ubWVudCBjb250YWlucyBTRVJWRVJfTkFNRT0iJXMiCgBDb3VsZCBub3QgcGFyc2UgeGRvdCAiJXMiCgBObyBsb2FkaW1hZ2UgcGx1Z2luIGZvciAiJXMiCgAgWyV6dV0gKCUuMDJmLCUuMDJmKSAoJS4wMmYsJS4wMmYpICVwICIlcyIKAGZvbnRuYW1lOiB1bmFibGUgdG8gcmVzb2x2ZSAiJXMiCgBEdXBsaWNhdGUgY2x1c3RlciBuYW1lICIlcyIKAHVucmVjb2duaXplZCBhcGkgbmFtZSAiJXMiCgBpbWFnZSBjcmVhdGUgcGhvdG8gInBob3RvXyVzIiAtZmlsZSAiJXMiCgBObyBvciBpbXByb3BlciBzaGFwZWZpbGU9IiVzIiBmb3Igbm9kZSAiJXMiCgBObyBvciBpbXByb3BlciBpbWFnZT0iJXMiIGZvciBub2RlICIlcyIKAG5vZGUgIiVzIiBpcyBjb250YWluZWQgaW4gdHdvIG5vbi1jb21wYXJhYmxlIGNsdXN0ZXJzICIlcyIgYW5kICIlcyIKAEVycm9yOiBub2RlICIlcyIgYmVsb25ncyB0byB0d28gbm9uLW5lc3RlZCBjbHVzdGVycyAiJXMiIGFuZCAiJXMiCgAgICIlcyIKACNpbmNsdWRlICJjb2xvcnMuaW5jIgojaW5jbHVkZSAidGV4dHVyZXMuaW5jIgojaW5jbHVkZSAic2hhcGVzLmluYyIKAFVua25vd24gSFRNTCBlbGVtZW50IDwlcz4gb24gbGluZSAlbHUgCgAlcyBpbiBsaW5lICVsdSAKAHNjYWxlIGJ5ICVnLCVnIAoAY29tcHJlc3MgJWcgCgBMYXlvdXQgd2FzIG5vdCBkb25lLiAgTWlzc2luZyBsYXlvdXQgcGx1Z2lucz8gCgCJUE5HDQoaCgAJAEGBgAULtgMBAQEBAQEBAQIDAQECAQEBAQEBAQEBAQEBAQEBAQEBAgEEBQEBAQEBAQYBAQcICQoKCgoKCgoKCgoBAQsBDAENDg8QERITFBUWExMTExcYGRMaGxwdExMTExMBHgEBEwEfICEiIxMkJSYTExMTJygpEyorLC0TExMTEwEBAQEBExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMuExMTLxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTMBMTExMTExMTExMTExMTExMAAAAAAAAEAAQAHAAcACEAIQAkACIACgACABYACQAiACIAIgAVAB0AAQAUABQAFAAUABQAFAAUAAgABAAFABwAGwAXABwAIQAgAB8AHgAJABMAAAAVABIAFQADAAcAFQAVABQAFAAUABQAFAAUABQAFAAIAAQABQAFAAYAHAAaABgAGQAhAAcAFQAUABQAFAAUABQAFAALABQADQAUAAwAFAAUABQADgAUABQAFAAQABQADwAUABEAQcKDBQuVBAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMABAAHAAMABAAFAAUABgAGAAgABwAHABEAFgASABEAEgAIAAgADwAPABcADwAYAA8AGQAaABoAHgAWADQAHgAFADIABgAiACIAMwAXABgANQAZABoAGgAqADYAKgA0ADcAMgBFADsAPAAzADsAPABGADUARwBIAEwANgAiAEkASgA3AEUATgBQAGIAUQBSAFQARgBHAFUASABMAFYASQBKAFgAWgBOAEQAUABRAFIAVAA4AC8ALABVACkAVgAbABAAWABaAF0AXQBdAF0AXQBdAF0AXgBeAF4AXgBeAF4AXgBfAF8AXwBfAF8AXwBfAGAACQBgAGAAYABgAGAAYQBhAGMAAgBjAGMAYwBjAGMAZAAAAGQAAABkAGQAZABlAAAAZQBlAGUAZQBlAGYAAAAAAGYAZgBmAGYAZwAAAGcAZwBnAGcAaAAAAGgAaABoAGgAaABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAEHkhwULzQGuAC4ALwAzADUAMAA3AKoA2wDbANsA2wAAAD0AhwA3ADcA2wDbAAAAKAA1AC4AMgAvAGIAAAAAAEcAAADbANsAUQAAANsA2wDbAAAA2wCEAFUA2wCCANsAAACBANsAAAA+AEIAQQBIAEQAUgBbAAAAAABeAF8A2wAAANsA2wDbAAAAAAB7AEkAVwBSAFoAWgBdAAAAXwAAAF8AAABlAF0AXwAAAF0AbgBqAAAAaQAAAG4AAADbAJMAmgChAKgAqwBwALEAuAC/AMYAzQDTAEHCiQULzwFcAAEAXQBdAF4AXgBfAF8AXABcAFwAXABcAGAAXABcAFwAYQBcAFwAYgBiAGIAYgBiAGIAYgBjAGQAZQBmAFwAXABcAGcAXABcAFwAYABcAFwAYQBcAGEAXABoAGEAXABiAGIAYgBiAGIAYgBiAGIAYwBkAGUAZQBcAGYAXABcAFwAZwBoAGEAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAAAAXABcAFwAXABcAFwAXABcAFwAXABcAFwAQaGLBQswAQECAwEEAQUBBgcHAQYGBgYGBgYGBgYGBgYGBgYDBgYGBgYGBgYGBgYGBgYGBgYGAEHiiwULowQKAAsADAANAA4ACgAPABAAEQASABMACgAUABUAFQAVABYAFwAVABgAFQAVABkAFQAVABUAGgAVABUACgAVABUAFQAWABcAGAAVABUAGQAVABUAFQAaABUAFQAVABUAGwAMAAwAJAAeAB4AIAAhACAAIQAkACUAJgAtADIALwAuACoAJQAmACgAKQAzACoANAArADUANgA3ADwAMgBHAD0AIgBFACIAPwBAAEYAMwA0AEgANQA2ADcALwBJACoARwBKAEUATABcADwARgBcAD0ATQBIAE4ATwBSAEkAQQBQAFEASgBMAFMAVAAxAFUAVgBXAE0ATgBYAE8AUgBZAFAAUQBaAFsAUwBEAFQAVQBWAFcASwBEACwAWAAsAFkAOAAsAFoAWwAdAB0AHQAdAB0AHQAdAB8AHwAfAB8AHwAfAB8AIwAjACMAIwAjACMAIwAnAFwAJwAnACcAJwAnADAAMAA5ABwAOQA5ADkAOQA5ADoAXAA6AFwAOgA6ADoAOwBcADsAOwA7ADsAOwA+AFwAXAA+AD4APgA+AEIAXABCAEIAQgBCAEMAXABDAEMAQwBDAEMACQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAMAAAADQAAAA4AAAAOAEGQkAUL0QUR7u4TCAPu/u7u7gHu7u4B7u4J/u4SFRfuEgHu7u7uCg3u7u7u7u7u7u4B7u4WCAEBGQ4Y7u4bGBru7h3u7u7uARX77u7u7hAe7u7uAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWEQICAgICAgICAgICAgISEAITAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUAhUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4CDwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBAgMEBQYHCAkKCwwNAAAACwMEBQ8HAwwNBgwNDgwNGhUAAQADBw4GDwgM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ADekAAB7Zcx7zMT/AFqXAACMqspDosr/ABiMAACR86wIaKz/APW/AABBEfnw+ej/AOawAABNKevM68X/ANeiAABfPd2o3bX/APqVAAB7Zcx7zMT/ALiKAACMqspDosr/AJWDAACR86wIaKz/AJW+AABBEfnw+ej/AIavAABNKevM68X/AHehAABfPd2o3bX/AJqUAAB7Zcx7zMT/AFiJAACJoNNOs9P/ADWCAACNxb4rjL7/AHp8AACT8p4IWJ7/ADW9AAA8DPz3/PD/ACauAABMGfPg89v/ABegAABNKevM68X/ADqTAABfPd2o3bX/APiHAAB7Zcx7zMT/ANWAAACJoNNOs9P/ABp7AACNxb4rjL7/ALV2AACT8p4IWJ7/AP+7AAA8DPz3/PD/APCsAABMGfPg89v/AOGeAABNKevM68X/AASSAABfPd2o3bX/AMKGAAB7Zcx7zMT/AJ9/AACJoNNOs9P/AOR5AACNxb4rjL7/AH91AACR86wIaKz/AG5yAACW74EIQIH/AEfEAABKFfXl9eD/ADi1AABQSNmh2Zv/ACmnAABisqMxo1T/AOfCAABJD/jt+On/ANizAABONuS65LP/AMmlAABWaMR0xHb/AOyYAABivosji0X/AIfBAABJD/jt+On/AHiyAABONuS65LP/AGmkAABWaMR0xHb/AIyXAABisqMxo1T/AEqMAABm/20AbSz/ACfAAABJD/jt+On/ABixAABNLOnH6cD/AAmjAABQSNmh2Zv/ACyWAABWaMR0xHb/AOqKAABisqMxo1T/AMeDAABm/20AbSz/AMe+AABJD/jt+On/ALivAABNLOnH6cD/AKmhAABQSNmh2Zv/AMyUAABWaMR0xHb/AIqJAABgnqtBq13/AGeCAABivosji0X/AKx8AABs/1oAWjL/AGe9AABIB/z3/PX/AFiuAABKFfXl9eD/AEmgAABNLOnH6cD/AGyTAABQSNmh2Zv/ACqIAABWaMR0xHb/AAeBAABgnqtBq13/AEx7AABivosji0X/AOd2AABs/1oAWjL/ACa8AABIB/z3/PX/ABetAABKFfXl9eD/AAifAABNLOnH6cD/ACuSAABQSNmh2Zv/AOmGAABWaMR0xHb/AMZ/AABgnqtBq13/AAt6AABivosji0X/AKZ1AABm/20AbSz/AJVyAABl/0QARBv/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AG/DAADk3NDQHIv/AGC0AADlPvHxttr/AFGmAAA9Z+G44Yb/AHSZAABIxqxNrCb/AA/CAADk3NDQHIv/AACzAADlPvHxttr/APGkAAAAAPf39/f/ABSYAAA9Z+G44Yb/ANKMAABIxqxNrCb/AK/AAADm3MXFG33/AKCxAADnTOnpo8n/AJGjAADpHf394O//ALSWAAA7JvXm9dD/AHKLAAA/gdeh12r/AE+EAABExZJNkiH/AE+/AADm3MXFG33/AECwAADnTOnpo8n/ADGiAADpHf394O//AFSVAAAAAPf39/f/ABKKAAA7JvXm9dD/AO+CAAA/gdeh12r/ADR9AABExZJNkiH/AO+9AADm3MXFG33/AOCuAADodt7ed67/ANGgAADlPvHxttr/APSTAADpHf394O//ALKIAAA7JvXm9dD/AI+BAAA9Z+G44Yb/ANR7AAA/prx/vEH/AG93AABExZJNkiH/AK68AADm3MXFG33/AJ+tAADodt7ed67/AJCfAADlPvHxttr/ALOSAADpHf394O//AHGHAAAAAPf39/f/AE6AAAA7JvXm9dD/AJN6AAA9Z+G44Yb/AC52AAA/prx/vEH/AB1zAABExZJNkiH/AP7FAADO/0tAAEv/AB7KAABl/0QARBv/AO+2AADOrYN2KoP/AOCoAADHV6uZcKv/AKOaAADHM8/Cpc//AAGOAADSFejn1Oj/AH6FAABMHvDZ8NP/AGN+AABQRNum26D/AJ54AABYe65armH/AC10AABhxXgbeDf/AIbFAADO/0tAAEv/AJvJAABhxXgbeDf/AGG7AABl/0QARBv/AHe2AADOrYN2KoP/AGioAADHV6uZcKv/ACuaAADHM8/Cpc//AImNAADSFejn1Oj/AAaFAAAAAPf39/f/AOt9AABMHvDZ8NP/ACZ4AABQRNum26D/ALVzAABYe65armH/AKXEAADERsOvjcP/AJa1AAAAAPf39/f/AIenAABSWr9/v3v/AEXDAADJqJR7MpT/ADa0AADHM8/Cpc//ACemAABQRNum26D/AEqZAABm/4gAiDf/AOXBAADJqJR7MpT/ANayAADHM8/Cpc//AMekAAAAAPf39/f/AOqXAABQRNum26D/AKiMAABm/4gAiDf/AIXAAADOrYN2KoP/AHaxAADERsOvjcP/AGejAADSFejn1Oj/AIqWAABMHvDZ8NP/AEiLAABSWr9/v3v/ACWEAABhxXgbeDf/ACW/AADOrYN2KoP/ABawAADERsOvjcP/AAeiAADSFejn1Oj/ACqVAAAAAPf39/f/AOiJAABMHvDZ8NP/AMWCAABSWr9/v3v/AAp9AABhxXgbeDf/AMW9AADOrYN2KoP/ALauAADHV6uZcKv/AKegAADHM8/Cpc//AMqTAADSFejn1Oj/AIiIAABMHvDZ8NP/AGWBAABQRNum26D/AKp7AABYe65armH/AEV3AABhxXgbeDf/AIS8AADOrYN2KoP/AHWtAADHV6uZcKv/AGafAADHM8/Cpc//AImSAADSFejn1Oj/AEeHAAAAAPf39/f/ACSAAABMHvDZ8NP/AGl6AABQRNum26D/AAR2AABYe65armH/APNyAABhxXgbeDf/AAHEAAC9C/Ls5/L/APK0AACXPdumvdv/AOOmAACNxb4rjL7/AKHCAAC5CPbx7vb/AJKzAACbKOG9yeH/AIOlAACRcM90qc//AKaYAACP97AFcLD/AEHBAAC5CPbx7vb/ADKyAACbKOG9yeH/ACOkAACRcM90qc//AEaXAACNxb4rjL7/AASMAACP940EWo3/AOG/AAC5CPbx7vb/ANKwAACoGObQ0eb/AMOiAACXPdumvdv/AOaVAACRcM90qc//AKSKAACNxb4rjL7/AIGDAACP940EWo3/AIG+AAC5CPbx7vb/AHKvAACoGObQ0eb/AGOhAACXPdumvdv/AIaUAACRcM90qc//AESJAACOt8A2kMD/ACGCAACP97AFcLD/AGZ8AACP+HsDTnv/ACG9AADpCP//9/v/ABKuAAC9C/Ls5/L/AAOgAACoGObQ0eb/ACaTAACXPdumvdv/AOSHAACRcM90qc//AMGAAACOt8A2kMD/AAZ7AACP97AFcLD/AKF2AACP+HsDTnv/AOu7AADpCP//9/v/ANysAAC9C/Ls5/L/AM2eAACoGObQ0eb/APCRAACXPdumvdv/AK6GAACRcM90qc//AIt/AACOt8A2kMD/ANB5AACP97AFcLD/AGt1AACP940EWo3/AFpyAACP+VgCOFj/AJHEAADIDvDs4vD/AIK1AACXPdumvdv/AHOnAACC0JkckJn/ADHDAADPCPf27/f/ACK0AACbKOG9yeH/ABOmAACPgM9nqc//ADaZAACC+4oCgYr/ANHBAADPCPf27/f/AMKyAACbKOG9yeH/ALOkAACPgM9nqc//ANaXAACC0JkckJn/AJSMAAB3/GwBbFn/AHHAAADPCPf27/f/AGKxAACoGObQ0eb/AFOjAACXPdumvdv/AHaWAACPgM9nqc//ADSLAACC0JkckJn/ABGEAAB3/GwBbFn/ABG/AADPCPf27/f/AAKwAACoGObQ0eb/APOhAACXPdumvdv/ABaVAACPgM9nqc//ANSJAACOt8A2kMD/ALGCAACC+4oCgYr/APZ8AAB2/GQBZFD/ALG9AADpCP//9/v/AKKuAADIDvDs4vD/AJOgAACoGObQ0eb/ALaTAACXPdumvdv/AHSIAACPgM9nqc//AFGBAACOt8A2kMD/AJZ7AACC+4oCgYr/ADF3AAB2/GQBZFD/AHC8AADpCP//9/v/AGGtAADIDvDs4vD/AFKfAACoGObQ0eb/AHWSAACXPdumvdv/ADOHAACPgM9nqc//ABCAAACOt8A2kMD/AFV6AACC+4oCgYr/APB1AAB3/GwBbFn/AN9yAAB1+0YBRjb/APTFAAAS7n9/Owj/ABPKAADD/0stAEv/AOW2AAAU9rOzWAb/ANaoAAAW6ODgghT/AJmaAAAXm/39uGP/APeNAAAYSP7+4Lb/AHSFAAClFOvY2uv/AFl+AACxL9Kyq9L/AJR4AACzVKyAc6z/ACN0AAC9tYhUJ4j/AHzFAAAS7n9/Owj/AJDJAAC9tYhUJ4j/AFa7AADD/0stAEv/AG22AAAU9rOzWAb/AF6oAAAW6ODgghT/ACGaAAAXm/39uGP/AH+NAAAYSP7+4Lb/APyEAAAAAPf39/f/AOF9AAClFOvY2uv/ABx4AACxL9Kyq9L/AKtzAACzVKyAc6z/AH3EAAAXu/Hxo0D/AG61AAAAAPf39/f/AF+nAACyRcOZjsP/AB3DAAAR/ebmYQH/AA60AAAXm/39uGP/AP+lAACxL9Kyq9L/ACKZAAC5m5lePJn/AL3BAAAR/ebmYQH/AK6yAAAXm/39uGP/AJ+kAAAAAPf39/f/AMKXAACxL9Kyq9L/AICMAAC5m5lePJn/AF3AAAAU9rOzWAb/AE6xAAAXu/Hxo0D/AD+jAAAYSP7+4Lb/AGKWAAClFOvY2uv/ACCLAACyRcOZjsP/AP2DAAC9tYhUJ4j/AP2+AAAU9rOzWAb/AO6vAAAXu/Hxo0D/AN+hAAAYSP7+4Lb/AAKVAAAAAPf39/f/AMCJAAClFOvY2uv/AJ2CAACyRcOZjsP/AOJ8AAC9tYhUJ4j/AJ29AAAU9rOzWAb/AI6uAAAW6ODgghT/AH+gAAAXm/39uGP/AKKTAAAYSP7+4Lb/AGCIAAClFOvY2uv/AD2BAACxL9Kyq9L/AIJ7AACzVKyAc6z/AB13AAC9tYhUJ4j/AFy8AAAU9rOzWAb/AE2tAAAW6ODgghT/AD6fAAAXm/39uGP/AGGSAAAYSP7+4Lb/AB+HAAAAAPf39/f/APx/AAClFOvY2uv/AEF6AACxL9Kyq9L/ANx1AACzVKyAc6z/AMtyAAC9tYhUJ4j/AOHEAAC8Du/n4e//ANK1AADWQ8nJlMf/AMOnAADq3t3dHHf/AIHDAAC5CPbx7vb/AHK0AADTKdjXtdj/AGOmAADki9/fZbD/AIaZAADv6M7OElb/ACHCAAC5CPbx7vb/ABKzAADTKdjXtdj/AAOlAADki9/fZbD/ACaYAADq3t3dHHf/AOSMAADs/5iYAEP/AMHAAAC5CPbx7vb/ALKxAADMJtrUudr/AKOjAADWQ8nJlMf/AMaWAADki9/fZbD/AISLAADq3t3dHHf/AGGEAADs/5iYAEP/AGG/AAC5CPbx7vb/AFKwAADMJtrUudr/AEOiAADWQ8nJlMf/AGaVAADki9/fZbD/ACSKAADp0efnKYr/AAGDAADv6M7OElb/AEZ9AADs/5GRAD//AAG+AADDBfn39Pn/APKuAAC8Du/n4e//AOOgAADMJtrUudr/AAaUAADWQ8nJlMf/AMSIAADki9/fZbD/AKGBAADp0efnKYr/AOZ7AADv6M7OElb/AIF3AADs/5GRAD//AMC8AADDBfn39Pn/ALGtAAC8Du/n4e//AKKfAADMJtrUudr/AMWSAADWQ8nJlMf/AIOHAADki9/fZbD/AGCAAADp0efnKYr/AKV6AADv6M7OElb/AEB2AADs/5iYAEP/AC9zAADy/2dnAB//AFzEAAC0CPXv7fX/AE21AACoJdy8vdz/AD6nAACwZLF1a7H/APzCAAC2B/fy8Pf/AO2zAACtHOLLyeL/AN6lAACtOsiemsj/AAGZAAC2gKNqUaP/AJzBAAC2B/fy8Pf/AI2yAACtHOLLyeL/AH6kAACtOsiemsj/AKGXAACwZLF1a7H/AF+MAAC8uY9UJ4//ADzAAAC2B/fy8Pf/AC2xAACqEuva2uv/AB6jAACoJdy8vdz/AEGWAACtOsiemsj/AP+KAACwZLF1a7H/ANyDAAC8uY9UJ4//ANy+AAC2B/fy8Pf/AM2vAACqEuva2uv/AL6hAACoJdy8vdz/AOGUAACtOsiemsj/AJ+JAACsU7qAfbr/AHyCAAC2gKNqUaP/AMF8AAC+2IZKFIb/AHy9AAC/Av38+/3/AG2uAAC0CPXv7fX/AF6gAACqEuva2uv/AIGTAACoJdy8vdz/AD+IAACtOsiemsj/AByBAACsU7qAfbr/AGF7AAC2gKNqUaP/APx2AAC+2IZKFIb/ADu8AAC/Av38+/3/ACytAAC0CPXv7fX/AB2fAACqEuva2uv/AECSAACoJdy8vdz/AP6GAACtOsiemsj/ANt/AACsU7qAfbr/ACB6AAC2gKNqUaP/ALt1AAC8uY9UJ4//AKpyAAC//30/AH3/AOrFAADy/2dnAB//AAjKAACW8WEFMGH/ANu2AAD53LKyGCv/AMyoAAAFo9bWYE3/AI+aAAANd/T0pYL/AO2NAAAPNv3928f/AGqFAACOIPDR5fD/AE9+AACNV96Sxd7/AIp4AACPp8NDk8P/ABl0AACUzqwhZqz/AHLFAADy/2dnAB//AIXJAACUzqwhZqz/AEu7AACW8WEFMGH/AGO2AAD53LKyGCv/AFSoAAAFo9bWYE3/ABeaAAANd/T0pYL/AHWNAAAPNv3928f/APKEAAAAAPf39/f/ANd9AACOIPDR5fD/ABJ4AACNV96Sxd7/AKFzAACPp8NDk8P/ACnEAAAMlu/vimL/ABq1AAAAAPf39/f/AAunAACPgM9nqc//AMnCAAD4/8rKACD/ALqzAAANd/T0pYL/AKulAACNV96Sxd7/AM6YAACP97AFcbD/AGnBAAD4/8rKACD/AFqyAAANd/T0pYL/AEukAAAAAPf39/f/AG6XAACNV96Sxd7/ACyMAACP97AFcbD/AAnAAAD53LKyGCv/APqwAAAMlu/vimL/AOuiAAAPNv3928f/AA6WAACOIPDR5fD/AMyKAACPgM9nqc//AKmDAACUzqwhZqz/AKm+AAD53LKyGCv/AJqvAAAMlu/vimL/AIuhAAAPNv3928f/AK6UAAAAAPf39/f/AGyJAACOIPDR5fD/AEmCAACPgM9nqc//AI58AACUzqwhZqz/AEm9AAD53LKyGCv/ADquAAAFo9bWYE3/ACugAAANd/T0pYL/AE6TAAAPNv3928f/AAyIAACOIPDR5fD/AOmAAACNV96Sxd7/AC57AACPp8NDk8P/AMl2AACUzqwhZqz/ABO8AAD53LKyGCv/AAStAAAFo9bWYE3/APWeAAANd/T0pYL/ABiSAAAPNv3928f/ANaGAAAAAPf39/f/ALN/AACOIPDR5fD/APh5AACNV96Sxd7/AJN1AACPp8NDk8P/AIJyAACUzqwhZqz/ANTFAADy/2dnAB//APDJAAAAABoaGhr/AMW2AAD53LKyGCv/ALaoAAAFo9bWYE3/AHmaAAANd/T0pYL/ANeNAAAPNv3928f/AFSFAAAAAODg4OD/ADl+AAAAALq6urr/AHR4AAAAAIeHh4f/AAN0AAAAAE1NTU3/AFzFAADy/2dnAB//AG3JAAAAAE1NTU3/ADO7AAAAABoaGhr/AE22AAD53LKyGCv/AD6oAAAFo9bWYE3/AAGaAAANd/T0pYL/AF+NAAAPNv3928f/ANyEAAAAAP//////AMF9AAAAAODg4OD/APx3AAAAALq6urr/AItzAAAAAIeHh4f/AObDAAAMlu/vimL/ANe0AAAAAP//////AMimAAAAAJmZmZn/AIbCAAD4/8rKACD/AHezAAANd/T0pYL/AGilAAAAALq6urr/AIuYAAAAAEBAQED/ACbBAAD4/8rKACD/ABeyAAANd/T0pYL/AAikAAAAAP//////ACuXAAAAALq6urr/AOmLAAAAAEBAQED/AMa/AAD53LKyGCv/ALewAAAMlu/vimL/AKiiAAAPNv3928f/AMuVAAAAAODg4OD/AImKAAAAAJmZmZn/AGaDAAAAAE1NTU3/AGa+AAD53LKyGCv/AFevAAAMlu/vimL/AEihAAAPNv3928f/AGuUAAAAAP//////ACmJAAAAAODg4OD/AAaCAAAAAJmZmZn/AEt8AAAAAE1NTU3/AAa9AAD53LKyGCv/APetAAAFo9bWYE3/AOifAAANd/T0pYL/AAuTAAAPNv3928f/AMmHAAAAAODg4OD/AKaAAAAAALq6urr/AOt6AAAAAIeHh4f/AIZ2AAAAAE1NTU3/ANC7AAD53LKyGCv/AMGsAAAFo9bWYE3/ALKeAAANd/T0pYL/ANWRAAAPNv3928f/AJOGAAAAAP//////AHB/AAAAAODg4OD/ALV5AAAAALq6urr/AFB1AAAAAIeHh4f/AD9yAAAAAE1NTU3/APjDAAADIP394N3/AOm0AAD0XPr6n7X/ANqmAADj3MXFG4r/AJjCAAANHP7+6+L/AImzAAD8SPv7tLn/AHqlAADuk/f3aKH/AJ2YAADg/a6uAX7/ADjBAAANHP7+6+L/ACmyAAD8SPv7tLn/ABqkAADuk/f3aKH/AD2XAADj3MXFG4r/APuLAADV/Hp6AXf/ANi/AAANHP7+6+L/AMmwAAADPPz8xcD/ALqiAAD0XPr6n7X/AN2VAADuk/f3aKH/AJuKAADj3MXFG4r/AHiDAADV/Hp6AXf/AHi+AAANHP7+6+L/AGmvAAADPPz8xcD/AFqhAAD0XPr6n7X/AH2UAADuk/f3aKH/ADuJAADmw93dNJf/ABiCAADg/a6uAX7/AF18AADV/Hp6AXf/ABi9AAAODP//9/P/AAmuAAADIP394N3/APqfAAADPPz8xcD/AB2TAAD0XPr6n7X/ANuHAADuk/f3aKH/ALiAAADmw93dNJf/AP16AADg/a6uAX7/AJh2AADV/Hp6AXf/AOK7AAAODP//9/P/ANOsAAADIP394N3/AMSeAAADPPz8xcD/AOeRAAD0XPr6n7X/AKWGAADuk/f3aKH/AIJ/AADmw93dNJf/AMd5AADg/a6uAX7/AGJ1AADV/Hp6AXf/AFFyAADH/2pJAGr/AN7FAAD1/6WlACb/APvJAACnq5UxNpX/AM+2AAAC0NfXMCf/AMCoAAAKuPT0bUP/AIOaAAAUnf39rmH/AOGNAAAebv7+4JD/AF6FAACIGPjg8/j/AEN+AACKQ+mr2en/AH54AACPcdF0rdH/AA10AACXnbRFdbT/AGbFAAD1/6WlACb/AHjJAACXnbRFdbT/AD67AACnq5UxNpX/AFe2AAAC0NfXMCf/AEioAAAKuPT0bUP/AAuaAAAUnf39rmH/AGmNAAAebv7+4JD/AOaEAAAqQP///7//AMt9AACIGPjg8/j/AAZ4AACKQ+mr2en/AJVzAACPcdF0rdH/AB7EAAANpPz8jVn/AA+1AAAqQP///7//AACnAACPVtuRv9v/AL7CAAD+4dfXGRz/AK+zAAAUnf39rmH/AKClAACKQ+mr2en/AMOYAACRwbYse7b/AF7BAAD+4dfXGRz/AE+yAAAUnf39rmH/AECkAAAqQP///7//AGOXAACKQ+mr2en/ACGMAACRwbYse7b/AP6/AAAC0NfXMCf/AO+wAAANpPz8jVn/AOCiAAAebv7+4JD/AAOWAACIGPjg8/j/AMGKAACPVtuRv9v/AJ6DAACXnbRFdbT/AJ6+AAAC0NfXMCf/AI+vAAANpPz8jVn/AIChAAAebv7+4JD/AKOUAAAqQP///7//AGGJAACIGPjg8/j/AD6CAACPVtuRv9v/AIN8AACXnbRFdbT/AD69AAAC0NfXMCf/AC+uAAAKuPT0bUP/ACCgAAAUnf39rmH/AEOTAAAebv7+4JD/AAGIAACIGPjg8/j/AN6AAACKQ+mr2en/ACN7AACPcdF0rdH/AL52AACXnbRFdbT/AAi8AAAC0NfXMCf/APmsAAAKuPT0bUP/AOqeAAAUnf39rmH/AA2SAAAebv7+4JD/AMuGAAAqQP///7//AKh/AACIGPjg8/j/AO15AACKQ+mr2en/AIh1AACPcdF0rdH/AHdyAACXnbRFdbT/AAjGAAD1/6WlACb/ACnKAABr/2gAaDf/APm2AAAC0NfXMCf/AOqoAAAKuPT0bUP/AK2aAAAUnf39rmH/AAuOAAAfc/7+4Iv/AIiFAAAzau/Z74v/AG1+AAA+gtmm2Wr/AKh4AABTeb1mvWP/ADd0AABn05gamFD/AJDFAAD1/6WlACb/AKbJAABn05gamFD/AGy7AABr/2gAaDf/AIG2AAAC0NfXMCf/AHKoAAAKuPT0bUP/ADWaAAAUnf39rmH/AJONAAAfc/7+4Iv/ABCFAAAqQP///7//APV9AAAzau/Z74v/ADB4AAA+gtmm2Wr/AL9zAABTeb1mvWP/AK7EAAANpPz8jVn/AJ+1AAAqQP///7//AJCnAABCiM+Rz2D/AE7DAAD+4dfXGRz/AD+0AAAUnf39rmH/ADCmAAA+gtmm2Wr/AFOZAABi0pYalkH/AO7BAAD+4dfXGRz/AN+yAAAUnf39rmH/ANCkAAAqQP///7//APOXAAA+gtmm2Wr/ALGMAABi0pYalkH/AI7AAAAC0NfXMCf/AH+xAAANpPz8jVn/AHCjAAAfc/7+4Iv/AJOWAAAzau/Z74v/AFGLAABCiM+Rz2D/AC6EAABn05gamFD/AC6/AAAC0NfXMCf/AB+wAAANpPz8jVn/ABCiAAAfc/7+4Iv/ADOVAAAqQP///7//APGJAAAzau/Z74v/AM6CAABCiM+Rz2D/ABN9AABn05gamFD/AM69AAAC0NfXMCf/AL+uAAAKuPT0bUP/ALCgAAAUnf39rmH/ANOTAAAfc/7+4Iv/AJGIAAAzau/Z74v/AG6BAAA+gtmm2Wr/ALN7AABTeb1mvWP/AE53AABn05gamFD/AI28AAAC0NfXMCf/AH6tAAAKuPT0bUP/AG+fAAAUnf39rmH/AJKSAAAfc/7+4Iv/AFCHAAAqQP///7//AC2AAAAzau/Z74v/AHJ6AAA+gtmm2Wr/AA12AABTeb1mvWP/APxyAABn05gamFD/AHTEAAANLP7+4NL/AGW1AAAJi/z8knL/AFanAAAB097eLSb/ABTDAAANJf7+5dn/AAW0AAALbPz8rpH/APalAAAHs/v7akr/ABmZAAD94MvLGB3/ALTBAAANJf7+5dn/AKWyAAALbPz8rpH/AJakAAAHs/v7akr/ALmXAAAB097eLSb/AHeMAAD956WlDxX/AFTAAAANJf7+5dn/AEWxAAAMXPz8u6H/ADajAAAJi/z8knL/AFmWAAAHs/v7akr/ABeLAAAB097eLSb/APSDAAD956WlDxX/APS+AAANJf7+5dn/AOWvAAAMXPz8u6H/ANahAAAJi/z8knL/APmUAAAHs/v7akr/ALeJAAAD0O/vOyz/AJSCAAD94MvLGB3/ANl8AAD7/5mZAA3/AJS9AAAOD///9fD/AIWuAAANLP7+4NL/AHagAAAMXPz8u6H/AJmTAAAJi/z8knL/AFeIAAAHs/v7akr/ADSBAAAD0O/vOyz/AHl7AAD94MvLGB3/ABR3AAD7/5mZAA3/AFO8AAAOD///9fD/AEStAAANLP7+4NL/ADWfAAAMXPz8u6H/AFiSAAAJi/z8knL/ABaHAAAHs/v7akr/APN/AAAD0O/vOyz/ADh6AAD94MvLGB3/ANN1AAD956WlDxX/AMJyAAD5/2dnAA3/ADHFAAD+4eTkGhz/ACK2AACSsrg3frj/ABOoAABTk69Nr0r/ANHDAAD+4eTkGhz/AMK0AACSsrg3frj/ALOmAABTk69Nr0r/ANaZAADPhKOYTqP/AHHCAAD+4eTkGhz/AGKzAACSsrg3frj/AFOlAABTk69Nr0r/AHaYAADPhKOYTqP/ADSNAAAV////fwD/ABHBAAD+4eTkGhz/AAKyAACSsrg3frj/APOjAABTk69Nr0r/ABaXAADPhKOYTqP/ANSLAAAV////fwD/ALGEAAAqzP///zP/ALG/AAD+4eTkGhz/AKKwAACSsrg3frj/AJOiAABTk69Nr0r/ALaVAADPhKOYTqP/AHSKAAAV////fwD/AFGDAAAqzP///zP/AJZ9AAAPwaamVij/AFG+AAD+4eTkGhz/AEKvAACSsrg3frj/ADOhAABTk69Nr0r/AFaUAADPhKOYTqP/ABSJAAAV////fwD/APGBAAAqzP///zP/ADZ8AAAPwaamVij/ANF3AADoeff3gb//APG8AAD+4eTkGhz/AOKtAACSsrg3frj/ANOfAABTk69Nr0r/APaSAADPhKOYTqP/ALSHAAAV////fwD/AJGAAAAqzP///zP/ANZ6AAAPwaamVij/AHF2AADoeff3gb//AGBzAAAAAJmZmZn/ABLFAAByeMJmwqX/AAO2AAALm/z8jWL/APSnAACcTcuNoMv/ALLDAAByeMJmwqX/AKO0AAALm/z8jWL/AJSmAACcTcuNoMv/ALeZAADkZufnisP/AFLCAAByeMJmwqX/AEOzAAALm/z8jWL/ADSlAACcTcuNoMv/AFeYAADkZufnisP/ABWNAAA6m9im2FT/APLAAAByeMJmwqX/AOOxAAALm/z8jWL/ANSjAACcTcuNoMv/APeWAADkZufnisP/ALWLAAA6m9im2FT/AJKEAAAi0P//2S//AJK/AAByeMJmwqX/AIOwAAALm/z8jWL/AHSiAACcTcuNoMv/AJeVAADkZufnisP/AFWKAAA6m9im2FT/ADKDAAAi0P//2S//AHd9AAAZWuXlxJT/ADK+AAByeMJmwqX/ACOvAAALm/z8jWL/ABShAACcTcuNoMv/ADeUAADkZufnisP/APWIAAA6m9im2FT/ANKBAAAi0P//2S//ABd8AAAZWuXlxJT/ALJ3AAAAALOzs7P/AELGAAB4VNON08f/AGjKAADTUr28gL3/ADO3AAAqTP///7P/ACSpAACvJdq+utr/AOeaAAAEi/v7gHL/AEWOAACQZNOAsdP/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ACs6AAAhIv//+Nz/AEYwAAD259zcFDz/AI80AAB///8A////AP9GAACq/4sAAIv/AIE0AAB//4sAi4v/AHdRAAAe77i4hgv/AEEIAAAAAKmpqan/AJ8zAABV/2QAZAD/AHYHAAAAAKmpqan/AAk7AAAnbr29t2v/AD1gAADU/4uLAIv/ANYzAAA6jmtVay//AF5OAAAX////jAD/AHpTAADGwMyZMsz/AIZVAAAA/4uLAAD/AMYwAAAKeenplnr/ADg0AABVPbyPvI//ADpHAACvj4tIPYv/AGMIAAB/Z08vT0//AJgHAAB/Z08vT0//ABVKAACA/9EAztH/AP8QAADH/9OUANP/AMs5AADo6///FJP/ACJGAACK//8Av///ADQIAAAAAGlpaWn/AGkHAAAAAGlpaWn/AJRGAACU4f8ekP//AGQ6AAAAzrKyIiL/AJ5IAAAcD///+vD/AGIzAABVwIsiiyL/AAJhAADU////AP//AO4uAAAAANzc3Nz/AH1IAACqB//4+P//AL9SAAAj////1wD/AJ1RAAAe2drapSD/AJUIAAAAAICAgID/AGE0AABV/4AAgAD/AE4KAAA70P+t/y//AMoHAAAAAICAgID/AFcLAABVD//w//D/AK85AADplv//abT/AHdVAAAAjM3NXFz/AEwvAADC/4JLAIL/AFYGAAAqD/////D/ABg7AAAmavDw5oz/AAIdAACqFPrm5vr/AG08AADwD///8PX/AJAzAABA//x8/AD/ABQyAAAmMf//+s3/AGJGAACJP+at2Ob/AGo4AAAAd/DwgID/AHI0AAB/H//g////AF8KAAAqKPr6+tL/ACUIAAAAANPT09P/AHMzAABVZO6Q7pD/AFoHAAAAANPT09P/ALw5AAD4Sf//tsH/ALUwAAAMhP//oHr/ABE0AAB90bIgsqr/ABBGAACPdfqHzvr/AE8IAACUOJl3iJn/AIQHAACUOJl3iJn/AM1GAACXNN6wxN7/AD0KAAAqH////+D/ABhMAABV//8A/wD/AOozAABVwM0yzTL/AAwzAAAVFPr68Ob/AE5gAADU////AP//AKkwAAAA/4CAAAD/AGhLAABxgM1mzar/AL1GAACq/80AAM3/AGhTAADMmNO6VdP/AOBMAAC3fNuTcNv/ACQ0AABnqbM8s3H/ACVHAACwj+57aO7/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APeqAAAXJO7u38z/AMacAAAXJM3NwLD/AAeQAAAYIouLg3j/AC5gAAB///8A////AINLAABxgP9//9T/AKW5AABxgP9//9T/AD2rAABxgO527sb/AAydAABxgM1mzar/AFSQAABxgItFi3T/AKZKAAB/D//w////AJ65AAB/D//w////ADarAAB/D+7g7u7/AAWdAAB/Ds3Bzc3/AEaQAAB/DouDi4v/AIhOAAAqGvX19dz/AEhFAAAXOv//5MT/AOe4AAAXOv//5MT/AH+qAAAXOu7u1bf/AE6cAAAWOs3Nt57/AI+PAAAXOouLfWv/AIU6AAAAAAAAAAD/ADdSAAAZMf//683/AHBHAACq//8AAP//AEy5AACq//8AAP//AOSqAACq/+4AAO7/ALOcAACq/80AAM3/APSPAACq/4sAAIv/ABQRAADAzuKKK+L/AP0vAAAAvqWlKir/AOi3AAAAv///QED/AJypAAAAv+7uOzv/AHObAAAAv83NMzP/ALSOAAAAvouLIyP/ALFRAAAXY97euIf/AAS6AAAXZP//05v/AIurAAAXY+7uxZH/AFqdAAAXY83Nqn3/AKKQAAAXY4uLc1X/AHZGAACAZ6BfnqD/ABW5AACDZ/+Y9f//AK2qAACDZu6O5e7/AHycAACDZ816xc3/AL2PAACDZotThov/AGVJAAA///9//wD/AHi5AAA///9//wD/ABCrAAA//+527gD/AN+cAAA//81mzQD/ACCQAAA//4tFiwD/ADVJAAAR2tLSaR7/AG25AAAR2///fyT/AAWrAAAR2+7udiH/ANScAAAR2s3NZh3/ABWQAAAR3IuLRRP/AH84AAALr///f1D/AHe4AAAHqf//clb/AByqAAAGqe7ualD/APObAAAGqc3NW0X/ADSPAAAGqIuLPi//AIVGAACak+1kle3/ADA6AAAhIv//+Nz/AJy4AAAhIv//+Nz/AEGqAAAiI+7u6M3/ABicAAAiIs3NyLH/AFmPAAAjIouLiHj/AEswAAD259zcFDz/AJQ0AAB///8A////AFy4AAB///8A////AAGqAAB//+4A7u7/ANibAAB//80Azc3/ABmPAAB//4sAi4v/AARHAACq/4sAAIv/AIY0AAB//4sAi4v/AHxRAAAe77i4hgv/APW5AAAe8P//uQ//AHyrAAAe8O7urQ7/AEudAAAe8M3NlQz/AJOQAAAe8IuLZQj/AEYIAAAAAKmpqan/AKQzAABV/2QAZAD/AHsHAAAAAKmpqan/AA47AAAnbr29t2v/AEJgAADU/4uLAIv/ANszAAA6jmtVay//AC64AAA6j//K/3D/ANOpAAA6j+687mj/AKqbAAA6j82izVr/AOuOAAA6j4tuiz3/AGNOAAAX////jAD/AMi5AAAV////fwD/AGCrAAAV/+7udgD/AC+dAAAV/83NZgD/AHeQAAAV/4uLRQD/AH9TAADGwMyZMsz/ACO6AADGwf+/Pv//AKqrAADGwO6yOu7/AHmdAADGwM2aMs3/AMGQAADGwItoIov/AItVAAAA/4uLAAD/AMswAAAKeenplnr/AD00AABVPbyPvI//AEm4AABVPv/B/8H/AO6pAABVPu607rT/AMWbAABVPs2bzZv/AAaPAABVPotpi2n/AD9HAACvj4tIPYv/AGgIAAB/Z08vT0//AJK3AAB/aP+X////AEKpAAB/Z+6N7u7/ACubAAB/aM15zc3/AHGOAAB/aItSi4v/AJ0HAAB/Z08vT0//ABpKAACA/9EAztH/AAQRAADH/9OUANP/ANA5AADo6///FJP/AJK4AADo6///FJP/ADeqAADo6+7uEon/AA6cAADo683NEHb/AE+PAADn7IuLClD/ACdGAACK//8Av///AP24AACK//8Av///AJWqAACK/+4Asu7/AGScAACK/80Ams3/AKWPAACK/4sAaIv/ADkIAAAAAGlpaWn/AG4HAAAAAGlpaWn/AJlGAACU4f8ekP//ACC5AACU4f8ekP//ALiqAACU4e4chu7/AIecAACU4c0YdM3/AMiPAACU4YsQTov/AGk6AAAAzrKyIiL/AKa4AAAAz///MDD/AEuqAAAAz+7uLCz/ACKcAAAAz83NJib/AGOPAAAAz4uLGhr/AKNIAAAcD///+vD/AGczAABVwIsiiyL/AAdhAADU////AP//APMuAAAAANzc3Nz/AIJIAACqB//4+P//AMRSAAAj////1wD/AA+6AAAj////1wD/AJarAAAj/+7uyQD/AGWdAAAj/83NrQD/AK2QAAAj/4uLdQD/AKJRAAAe2drapSD/APm5AAAe2v//wSX/AICrAAAe2u7utCL/AE+dAAAe2s3Nmx3/AJeQAAAe2ouLaRT/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AFEvAADC/4JLAIL/ALMWAAAqAP////4AAFsGAAAqD/////D/AIW3AAAqD/////D/ADWpAAAqD+7u7uD/AAebAAAqDs3NzcH/AGSOAAAqDouLi4P/AB07AAAmavDw5oz/AMa4AAAncP//9o//AFaqAAAncO7u5oX/AC2cAAAnb83NxnP/AG6PAAAnb4uLhk7/AAcdAACqFPrm5vr/AHI8AADwD///8PX/AM24AADwD///8PX/AF2qAADvD+7u4OX/ADScAADwDs3NwcX/AHWPAADvDouLg4b/AJUzAABA//x8/AD/ABkyAAAmMf//+s3/AAS4AAAmMf//+s3/ALipAAAlMu7u6b//AI+bAAAmMc3NyaX/ANCOAAAnMYuLiXD/AGdGAACJP+at2Ob/AAq5AACKQP+/7///AKKqAACKQO6y3+7/AHGcAACKP82awM3/ALKPAACJQItog4v/AG84AAAAd/DwgID/AHc0AAB/H//g////AFe4AAB/H//g////APypAAB/H+7R7u7/ANObAAB/H820zc3/ABSPAAB/H4t6i4v/AFhRAAAjc+7u3YL/AOW5AAAjdP//7Iv/AGyrAAAjc+7u3IL/ADudAAAjc83NvnD/AIOQAAAjc4uLgUz/AGQKAAAqKPr6+tL/ACoIAAAAANPT09P/AHgzAABVZO6Q7pD/AF8HAAAAANPT09P/AME5AAD4Sf//tsH/AIe4AAD5Uf//rrn/ACyqAAD4Ue7uoq3/AAOcAAD5UM3NjJX/AESPAAD5UIuLX2X/ALowAAAMhP//oHr/APe3AAAMhP//oHr/AKupAAALhO7ulXL/AIKbAAAMhc3NgWL/AMOOAAAMhYuLV0L/ABY0AAB90bIgsqr/ABVGAACPdfqHzvr/AO+4AACPT/+w4v//AIeqAACPT+6k0+7/AFacAACOT82Nts3/AJePAACPTotge4v/ABZHAACvj/+EcP//AFQIAACUOJl3iJn/AIkHAACUOJl3iJn/ANJGAACXNN6wxN7/ACy5AACXNf/K4f//AMSqAACXNe680u7/AJOcAACXNc2itc3/ANSPAACWNYtue4v/AEIKAAAqH////+D/AKu3AAAqH////+D/AFupAAAqH+7u7tH/AESbAAAqH83NzbT/AIqOAAAqH4uLi3r/AB1MAABV//8A/wD/AO8zAABVwM0yzTL/ABEzAAAVFPr68Ob/AFNgAADU////AP//AF+6AADU////AP//AOarAADU/+7uAO7/ALWdAADU/83NAM3/AP2QAADU/4uLAIv/AK4wAADvubCwMGD/AO+3AADky///NLP/AKOpAADky+7uMKf/AHqbAADkzM3NKZD/ALuOAADky4uLHGL/AG1LAABxgM1mzar/AMJGAACq/80AAM3/AG1TAADMmNO6VdP/ABW6AADLmf/gZv//AJyrAADLme7RX+7/AGudAADLmc20Us3/ALOQAADLmot6N4v/AOVMAAC3fNuTcNv/ALq5AAC3ff+rgv//AFKrAAC3fe6fee7/ACGdAAC3fc2JaM3/AGmQAAC3fItdR4v/ACk0AABnqbM8s3H/ACpHAACwj+57aO7/ALMzAABv//oA+pr/AAVKAAB9p9FI0cz/AOdUAADk5MfHFYX/AFVGAACqxnAZGXD/AIQ2AABqCf/1//r/AJJJAAAEHv//5OH/AIS5AAAEHv//5OH/AByrAAAEHu7u1dL/AOucAAADHc3Nt7X/ACyQAAAFHYuLfXv/AEEyAAAaSf//5LX/AJJIAAAZUf//3q3/AFK5AAAZUf//3q3/AOqqAAAZUu7uz6H/ALmcAAAZUs3Ns4v/APqPAAAZUouLeV7/AIcEAACq/4AAAID/AAdGAACq/4AAAID/AEBLAAAqAP////4AAAdRAAAbF/399eb/APJEAAAq/4CAgAD/ABhgAAA4wI5rjiP/AFS6AAA4wf/A/z7/ANurAAA4wO6z7jr/AKqdAAA4wM2azTL/APKQAAA4wItpiyL/AHNOAAAb////pQD/AMy5AAAb////pQD/AGSrAAAb/+7umgD/ADOdAAAb/83NhQD/AHuQAAAb/4uLWgD/AN5VAAAL////RQD/AEm6AAAL////RQD/ANCrAAAL/+7uQAD/AJ+dAAAL/83NNwD/AOeQAAAL/4uLJQD/AI9TAADWe9racNb/ACe6AADWfP//g/r/AK6rAADWfO7ueun/AH2dAADWfM3Nacn/AMWQAADVfIuLR4n/AI9RAAAmSO7u6Kr/AP4zAABVZPuY+5j/AD64AABVZf+a/5r/AOOpAABVZO6Q7pD/ALqbAABVZM18zXz/APuOAABVZItUi1T/AC1KAAB/Q+6v7u7/AI+5AAB/RP+7////ACerAAB/RO6u7u7/APacAAB/RM2Wzc3/ADeQAAB/Q4tmi4v/APxUAADxfNvbcJP/AC+6AADxff//gqv/ALarAADxfe7ueZ//AIWdAADxfc3NaIn/AM2QAADxfIuLR13/AEctAAAaKf//79X/ACJCAAAURv//2rn/ANy4AAAURv//2rn/AGyqAAATRe7uy63/AEOcAAATRc3Nr5X/AISPAAAURYuLd2X/ANULAAAUsM3NhT//AOc5AAD3P///wMv/AJa4AAD1Sf//tcX/ADuqAAD1Se7uqbj/ABKcAAD1Ss3NkZ7/AFOPAAD1SYuLY2z/APg1AADURt3doN3/AGe4AADURP//u///AAyqAADURO7uru7/AOObAADURM3Nls3/ACSPAADUQ4uLZov/AKlGAACEO+aw4Ob/AEFNAADE3fCgIPD/AMC5AAC/z/+bMP//AFirAADAz+6RLO7/ACedAADAz819Js3/AG+QAADAz4tVGov/AAdNAAC/qplmM5n/AChWAAAA////AAD/AE+6AAAA////AAD/ANarAAAA/+7uAAD/AKWdAAAA/83NAAD/AO2QAAAA/4uLAAD/AL8vAAAAPby8j4//AOS3AAAAPv//wcH/AJipAAAAPu7utLT/AG+bAAAAPs3Nm5v/ALCOAAAAPouLaWn/APVGAACfteFBaeH/ADy5AACft/9Idv//ANSqAACft+5Dbu7/AKOcAACfts06X83/AOSPAACft4snQIv/AOwvAAAR3IuLRRP/ANswAAAEivr6gHL/APy3AAAJlv//jGn/ALCpAAAJlu7ugmL/AIebAAAJls3NcFT/AMiOAAAJlouLTDn/AM4vAAATmvT0pGD/AE80AABnqosui1f/AE24AABnq/9U/5//APKpAABnq+5O7pT/AMmbAABnq81DzYD/AAqPAABnqosui1f/AD03AAAREP//9e7/AG24AAAREP//9e7/ABKqAAASEe7u5d7/AOmbAAASEc3Nxb//ACqPAAASEIuLhoL/AM1gAAANt6CgUi3/AGi6AAANuP//gkf/AO+rAAANuO7ueUL/AL6dAAANuM3NaDn/AAaRAAANuYuLRyb/ANsbAAAAAMDAwMD/ADhGAACLbOuHzuv/AAG5AACQeP+Hzv//AJmqAACQeO5+wO7/AGicAACQeM1sps3/AKmPAACRd4tKcIv/AFJHAACvj81qWs3/AEe5AACvkP+Db///AN+qAACvkO56Z+7/AK6cAACvkM1pWc3/AO+PAACvkItHPIv/AHsIAACUOJBwgJD/AJa3AACVOP/G4v//AEapAACVOO650+7/AC+bAACUOc2fts3/AHWOAACVOItse4v/ALAHAACUOJBwgJD/ABcKAAAABf//+vr/AKW3AAAABf//+vr/AFWpAAAABe7u6en/AD6bAAAABM3Nycn/AISOAAAAA4uLiYn/AMozAABq//8A/3//ACG4AABq//8A/3//AMapAABq/+4A7nb/AJ2bAABq/80AzWb/AN6OAABq/4sAi0X/AOZGAACSm7RGgrT/ADG5AACSnP9juP//AMmqAACSnO5crO7/AJicAACSnM1PlM3/ANmPAACTm4s2ZIv/AK00AAAYVNLStIz/AGK4AAAUsP//pU//AAeqAAAUsO7umkn/AN6bAAAUsM3NhT//AB+PAAAUsIuLWiv/AAo5AAB//4AAgID/ANJMAADUHdjYv9j/ALG5AADUHv//4f//AEmrAADUHu7u0u7/ABidAADUHc3Ntc3/AGCQAADUHYuLe4v/ANwuAAAGuP//Y0f/ANy3AAAGuP//Y0f/AJCpAAAGuO7uXEL/AGebAAAGuM3NTzn/AKiOAAAGuYuLNib/ALsPAAAqAP////4AAEBKAAB7tuBA4ND/AJO5AACB//8A9f//ACurAACB/+4A5e7/APqcAACB/80Axc3/ADuQAACB/4sAhov/ACQRAADUc+7ugu7/AABVAADj19DQIJD/ADO6AADrwf//Ppb/ALqrAADrwO7uOoz/AImdAADrwM3NMnj/ANGQAADrwIuLIlL/AIUIAAAAAICAgID/AAg0AABV/4AAgAD/ALoHAAAAAICAgID/AJUwAAAA/4CAAAD/AP1MAADU/4CAAID/AMsSAAAbRPX13rP/AMu3AAAbRf//57r/AH+pAAAbRO7u2K7/AFubAAAbRM3Nupb/AKGOAAAbQ4uLfmb/AMZIAAAAAP//////AEROAAAAAPX19fX/AI0IAAAAAL6+vr7/AFg0AABV//8A/wD/AMIHAAAAAL6+vr7/AJ8wAADvubCwMGD/ADJNAADE3fCgIPD/AH4KAAAq/////wD/ALC3AAAq/////wD/AGCpAAAq/+7u7gD/AEmbAAAq/83NzQD/AI+OAAAq/4uLiwD/AEQzAAA4wM2azTL/AEHAggcLA5R4AgBBzoIHC4UIoED/////////////////////////////////////////////////////////////////////////////////////AAKqAkQDAAQABKoGOQZxAaoCqgIABIMEAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABDkCOQKDBIMEgwSNA14HxwVWBVYFxwXjBHMExwXHBaoCHQPHBeMEHQfHBccFcwTHBVYFcwTjBMcFxwWNB8cFxwXjBKoCOQKqAsEDAASqAo0DAASNAwAEjQOqAgAEAAQ5AjkCAAQ5AjkGAAQABAAEAASqAh0DOQIABAAExwUABAAEjQPXA5oB1wNUBP///////////////////////////////////////////////////////////////////////////////////////wACqgJxBAAEAAQACKoGOQKqAqoCAASPBAACqgIAAjkCAAQABAAEAAQABAAEAAQABAAEAASqAqoCjwSPBI8EAARxB8cFVgXHBccFVgXjBDkGOQYdAwAEOQZWBY0HxwU5BuMEOQbHBXMEVgXHBccFAAjHBccFVgWqAjkCqgKmBAAEqgIABHMEjQNzBI0DqgIABHMEOQKqAnMEOQKqBnMEAARzBHMEjQMdA6oCcwQABMcFAAQABI0DJwPDAScDKQT///////////////////////////////////////////////////////////////////////////////////////8AAqoCXAMABAAEqgY5BrYBqgKqAgAEZgUAAqoCAAI5AgAEAAQABAAEAAQABAAEAAQABAAEqgKqAmYFZgVmBQAEXAfjBOMEVgXHBeME4wTHBccFqgKNA1YFcwSqBlYFxwXjBMcF4wQABHMExwXjBKoG4wRzBHMEHQM5Ah0DYAMABKoCAAQABI0DAASNAzkCAAQABDkCOQKNAzkCxwUABAAEAAQABB0DHQM5AgAEjQNWBY0DjQMdAzMDMwIzA1QE////////////////////////////////////////////////////////////////////////////////////////AAIdA3EEAAQABKoGOQY5AqoCqgIABI8EAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABKoCqgKPBI8EjwQABKgGVgVWBVYFxwVWBVYFxwU5Bh0DAARWBeMEHQfHBccF4wTHBVYFcwTjBMcFVgUdB1YF4wTjBKoCOQKqAo8EAASqAgAEAASNAwAEjQOqAgAEcwQ5AjkCAAQ5AjkGcwQABAAEAAQdAx0DOQJzBI0DVgUABI0DHQPJAsMByQKPBP//vHgCAEHeigcLhQigQP////////////////////////////////////////////////////////////////////////////////////85AjkC1wJzBHMEHQdWBYcBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEOQI5AqwErASsBHMEHwhWBVYFxwXHBVYF4wQ5BscFOQIABFYFcwSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEOQI5AjkCwQNzBKoCcwRzBAAEcwRzBDkCcwRzBMcBxwEABMcBqgZzBHMEcwRzBKoCAAQ5AnMEAATHBQAEAAQABKwCFAKsAqwE////////////////////////////////////////////////////////////////////////////////////////OQKqAssDcwRzBB0HxwXnAaoCqgIdA6wEOQKqAjkCOQJzBHMEcwRzBHMEcwRzBHMEcwRzBKoCqgKsBKwErATjBM0HxwXHBccFxwVWBeMEOQbHBTkCcwTHBeMEqgbHBTkGVgU5BscFVgXjBMcFVgWNB1YFVgXjBKoCOQKqAqwEcwSqAnME4wRzBOMEcwSqAuME4wQ5AjkCcwQ5Ah0H4wTjBOME4wQdA3MEqgLjBHMEOQZzBHMEAAQdAz0CHQOsBP///////////////////////////////////////////////////////////////////////////////////////zkCOQLXAnMEcwQdB1YFhwGqAqoCHQOsBDkCqgI5AjkCcwRzBHMEcwRzBHMEcwRzBHMEcwQ5AjkCrASsBKwEcwQfCFYFVgXHBccFVgXjBDkGxwU5AgAEVgVzBKoGxwU5BlYFOQbHBVYF4wTHBVYFjQdWBVYF4wQ5AjkCOQLBA3MEqgJzBHMEAARzBHMEOQJzBHMExwHHAQAExwGqBnMEcwRzBHMEqgIABDkCcwQABMcFAAQABAAErAIUAqwCrAT///////////////////////////////////////////////////////////////////////////////////////85AqoCywNzBHMEHQfHBecBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEqgKqAqwErASsBOMEzQfHBccFxwXHBVYF4wQ5BscFOQJzBMcF4wSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEqgI5AqoCrARzBKoCcwTjBHME4wRzBKoC4wTjBDkCOQJzBDkCHQfjBOME4wTjBB0DcwSqAuMEcwQ5BnMEcwQABB0DPQIdA6wE///weAIAQe6SBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT////////////////////////////////////////////////////////////////////////////////////////NBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0E////////////////////////////////////////////////////////////////////////////////////////zQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBP///////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT//xh5AgBB/ZoHC4YIQI9AAAD///////////////////////////////8CAf///////////////////////////////////////////////wIB5ACIAVgCWAKiA7UC3QA9AT0BwgFYAuQAqAHkABsBWAJYAlgCWAJYAlgCWAJYAlgCWALkAOQAWAJYAlgCuwGyA9kCpAKhAuYCRwIkAtYC+QIBAUQBcQIfAlcD5AL/AnkC/wKdAmcCWgLYArECTQSKAlQCTQI7ARsBOwFYAvQB9AESAkcCzwFHAhQCTQFKAjgC6ADsAPQBKAFYAzgCLAJHAkcCZgHhAV4BMQIDAkkDDQICAs8BYAEJAWABWAL//wAA////////////////////////////////DwH///////////////////////////////////////////////8PAfgAwAFYAlgCsQPWAvMAZgFmAcUBWAL4ALIB+AA5AVgCWAJYAlgCWAJYAlgCWAJYAlgC+AD4AFgCWAJYAssBtgPoArACqAL6AlUCMgLgAgUDGgFiAZkCMgJkA+wCEQOMAhEDrgJ3Am0C4gLJAlkEoAJqAl0CYgE5AWIBWAL0AfQBIwJYAtgBWAIeAmwBXAJJAv8AAwEYAj8BbQNJAkACWAJYAogB6AGAAUMCDwJVAyICDgLaAYcBIAGHAVgC//8AAP///////////////////////////////wIB////////////////////////////////////////////////AgHkAIgBWAJYAqIDtQLdAD0BPQHCAVgC5ACoAeQAGwFYAlgCWAJYAlgCWAJYAlgCWAJYAuQA5ABYAlgCWAK7AbID2QKkAqEC5gJHAiQC1gL5AgEBRAFxAh8CWAPjAv8CeQL/Ap0CZwJaAtgCsAJNBIoCVAJNAjsBGwE7AVgC9AH0ARICRwLPAUcCFAJNAUoCOALoAOwA9AEoAVgDOAIsAkcCRwJmAeEBXgExAgMCSQMNAgICzwFgAQkBYAFYAv//AAD///////////////////////////////8PAf///////////////////////////////////////////////w8B+ADAAVgCWAKxA9YC8wBmAWYBxQFYAvgAsgH4ADkBWAJYAlgCWAJYAlgCWAJYAlgCWAL4APgAWAJYAlgCywG2A+gCsAKoAvoCVQIyAuACBQMaAWIBmAIyAmUD6wIRA4wCEQOuAncCbQLiAskCWQSgAmoCXQJiATkBYgFYAvQB9AEjAlgC2AFYAh4CbAFcAkkC/wADARgCPwFtA0kCQAJYAlgCiAHoAYABQwIPAlUDIgIOAtoBhwEgAYcBWAL//yB5AgBBjqMHC4UIoED/////////////////////////////////////////////////////////////////////////////////////iwI1A64DtAYXBZoHPQYzAh8DHwMABLQGiwLjAosCsgIXBRcFFwUXBRcFFwUXBRcFFwUXBbICsgK0BrQGtAY/BAAIeQV9BZYFKQYOBZoEMwYEBlwCXAI/BXUE5wb8BUwG0wRMBo8FFAXjBNsFeQXpB3sF4wR7BR8DsgIfA7QGAAQABOcEFAVmBBQF7ATRAhQFEgU5AjkCogQ5AssHEgXlBBQFFAVKAysEIwMSBbwEiwa8BLwEMwQXBbICFwW0Bv///////////////////////////////////////////////////////////////////////////////////////8kCpgMrBLQGkQUECPoGcwKoA6gDLwS0BgoDUgMKA+wCkQWRBZEFkQWRBZEFkQWRBZEFkQUzAzMDtAa0BrQGpAQACDEGGQbfBaQGdwV3BZEGsgb6AvoCMwYZBfYHsgbNBt0FzQYpBsMFdQV/BjEG0wgrBssFzQWoA+wCqAO0BgAEAARmBboFvgS6BW0FewO6BbIFvgK+AlIFvgJWCLIFfwW6BboF8gPDBNMDsgU3BWQHKQU3BagEsgXsArIFtAb///////////////////////////////////////////////////////////////////////////////////////+LAjUDrgO0BhcFmgc9BjMCHwMfAwAEtAaLAuMCiwKyAhcFFwUXBRcFFwUXBRcFFwUXBRcFsgKyArQGtAa0Bj8EAAh5BX0FlgUpBg4FmgQzBgQGXAJcAj8FdQTnBvwFTAbTBEwGjwUUBeME2wV5BekHewXjBHsFHwOyAh8DtAYABAAE5wQUBWYEFAXsBNECFAUSBTkCOQKiBDkCywcSBeUEFAUUBUoDKwQjAxIFvASLBrwEvAQzBBcFsgIXBbQG////////////////////////////////////////////////////////////////////////////////////////yQKmAysEkQWRBQQI+gZzAqgDqAMvBLQGCgNSAwoD7AKRBZEFkQWRBZEFkQWRBZEFkQWRBTMDMwO0BrQGtAakBAAIMQYZBt8FpAZ3BXcFkQayBvoC+gIzBhkF9geyBs0G3QXNBikGwwV1BX8GMQbTCCsGywXNBagD7AKoA7QGAAQABGYFugW+BLoFbQV7A7oFsgW+Ar4CUgW+AlYIsgV/BboFugXyA8ME0wOyBTcFZAcpBTcFqASyBewCsgW0Bv//KHkCAEGeqwcLhQigQGYE////////////////////////////////AAD///////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//9mBP///////////////////////////////wAA////////////////////////////////////////////////ZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBP//ZgT///////////////////////////////8AAP///////////////////////////////////////////////2YEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgT///////////////////////////////////////////////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//80eQIAQa6zBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////2kC8AKZAjIEMgTNBKYFRwHwAvAC8AIyBPAC8ALwAjIEMgQyBDIEMgQyBDIEMgQyBDIEMgTwAvACMgQyBDIE8AIqBrgEhwTJBOgESQQzBGkFPAU6AtADmwQNBK0FGwVkBXYEaAWoBNkDpQQwBbME0QZ0BJAEZwTwAtgC8AIyBDIEMgQ0BHUE9gN1BF0E9QIEBF8ESALvAgkEXAKkBl8ESwR1BHUEHAM9AywDXwTrA/QFAgTyA8wD8AIyBPACMgT///////////////////////////////////////////////////////////////////////////////////////9pAvAC7wKwBLAEeQWmBdYB8ALwAnUDsATwAvAC8AIfA7AEsASwBLAEsASwBLAEsASwBLAE8ALwArAEsASwBIEDKgYRBcME5QQkBY0EqwRfBXgFOgJDBPAEbAT2BVcFoAWyBKwF4wQXBOUEbAX5BBIHzgToBHsENwPYAjcDsASwBLAEQwSnBBgEpQSZBPUCBAS+BGMC7wJiBFwC4Aa5BIcEqQSsBGsDcgMsA7oEOARFBmsERQQ6BHgDsAR4A7AE////////////////////////////////////////////////////////////////////////////////////////aQLwApkCMgTZA80EpgVHAfAC8ALwAjIE8ALwAvACMgQyBDIEMgQyBDIEMgQyBDIEMgQyBPAC8AIyBDIEMgTwAioG4wSHBMkE6ARJBDMEaQU8BToC0AObBA0EFwYbBWQFWQRkBagE2QOlBDAFswTRBnQEkARnBPAC2ALwAjIEMgQyBDQEdQSuA3UETAQ2AwQEdQR0Au8CCQSQAqQGXwRLBHUEdQRVAz0DXAN0BOsD9AUCBPIDzAPwAjIE8AIyBP///////////////////////////////////////////////////////////////////////////////////////2kC8AIgA7AEsATcBaYFaQLwAvACdQOwBPAC8ALwAi0DsASwBLAEsASwBLAEsASwBLAEsATwAvACsASwBLAELQMqBukEuATnBA8FvwSvBGkFbQU6Av0DMwU6BEoGSAWeBasEKAb9BAMEewVLBXcFaQdBBXgF5ATiA9ID4gOwBLAEsAS+BL8E8QO/BGoESANIBH8EnQIaA1EEjwKkBn8EjwTKBMoEkwOsA4EDdQRrBDAGmwSDBEME4gOwBOIDsAT//0B5AgBBvrsHC4UIoED/////////////////////////////////////////////////////////////////////////////////////0AImA6wDjAYWBZwI0AUmAqIDogMWBYwG6QKiA+kCogMWBRYFFgUWBRYFFgUWBRYFFgUWBaIDogOMBowGjAZdBAAIeAV8BZYFKgYPBZkENAYDBl4DowOLBXQEvgb8BUwG0wRMBpAFeAXuBNsFeAXpB3sF7AR7BaIDogOiA4wGFgUWBc4E/AQrBPwExATQAvwEEAUyAsECvAQyAsgHEAXbBPwE/ARqAysEJwMQBbwEjAa8BLwENAQUBaIDFAWMBv///////////////////////////////////////////////////////////////////////////////////////7wCOAOzBPAGsAUtCuYGqAJZBFkEsAXwBuQC1wPkAoQFsAWwBbAFsAWwBbAFsAWwBbAFsAU4AzgD8AbwBvAG7wS2BzYGGAbKBaQGdwU0BX0GswZeBHEEKwYZBZUHxgbNBt0FzQZCBq8FdAV/BhwGBwkcBuUFiQVZBIQFWQTwBrAFsAVYBZgFtQSYBVAFYQOYBbMFvAI5A14FvAJ3CLMFfgWYBZgF+gO/BKUDswUzBdYHWgU1BcYEsAVZBLAF8Ab////////////////////////////////////////////////////////////////////////////////////////QAiYDrAOMBhYFnAjQBSYCogOiAxYFjAbpAqID6QKiAxYFFgUWBRYFFgUWBRYFFgUWBRYFogOiA4wGjAaMBl0EAAh2BXwFlgUgBg8FmQQ0BgMGXgOjA4sFdAS+BvwFTAbTBEwGkAV4Be4E2wV2BewHewXsBHsFogOiA6IDjAYWBRYFzgT8BCsE/ATEBNAC+QQQBTICwQKyBDICyQcQBdsE/AT8BGoDKwQnAxAFugSMBrwEugQ0BBQFogMUBYwG////////////////////////////////////////////////////////////////////////////////////////vAI4A7ME8AawBS0K5gaoAlkEWQSwBfAG5ALXA+QChAWwBbAFsAWwBbAFsAWwBbAFsAWwBTgDOAPwBvAG8AbvBLYHNgYYBsoFpAZ3BTQFfQazBl4EcQQrBhkFlQfGBs0G3QXNBkIGrwV0BX8GHAYHCRwG5QWJBVkEhAVZBPAGsAWwBVgFmAW1BJgFUAVhA5gFswW8AjkDXgW8AncIswV8BZgFmAX6A78EpQOzBTEF1gdaBTUFxgSwBVkEsAXwBv//SHkCAEHOwwcLhQigQP////////////////////////////////////////////////////////////////////////////////////8UAiMCNQMrBZMElgbXBcUBXgJeAmoEkwT2AZMCIQLwApMEkwSTBJMEkwSTBJMEkwSTBJMEIQIhApMEkwSTBG8DMQcQBS8FDAXVBXMEIQTTBecFOwIjAukEJwQ5BwgGOwbRBDsG8gRkBG0E0wXDBGgHngR7BJEEogLwAqICVgSWA54EcwTnBM8D5wR9BLYCYgTpBAYCBgIzBAYCcQfpBNUE5wTnBEQD0QPTAukEAgQ5BjEECAS+AwgDaAQIA5ME////////////////////////////////////////////////////////////////////////////////////////FAJKAscDKwWRBDUHAAYhArYCtgJcBJEEUgKTAkgCTgORBJEEkQSRBJEEkQSRBJEEkQSRBEgCUgKRBJEEkQTRAy0HhQVgBRkF7AV7BGQEywUfBqYCpgJQBYUEiweBBl4GBgVeBkgFaASiBAwGMwW8B1YF/gSiBKYCTgOmAkIESgPbBNUEEAUdBBAFugQZA4UEQgVxAnEC9gRxAtsHQgX0BBAFEAWiA/oDeQNCBY0E2QagBI0E5wMnA2gEJwORBP///////////////////////////////////////////////////////////////////////////////////////xQCEgIXAysFaARYBlwFvAFIAkgCagRoBOwBfwIGAs0CaARoBGgEaARoBGgEaARoBGgEaAQGAgYCaARoBGgEagPHBnEEyQSuBFQFFwTHA2oFbQUvAiMCdQTLA7IGngXDBYcEwwWNBAQE/ANoBWIE0QYnBAYEPwRKAs0CSgIjBCcDbwSFBJ4EmgOeBPIDgQICBJ4ECAIIAucDCAL6Bp4EfQSeBJ4EKwNtA5gCngSyA7wF0wOyA40DywJoBMsCaAT///////////////////////////////////////////////////////////////////////////////////////8UAkoCoAMrBWgE2QaqBQoCtgK2AlwEaAQ5ApMCSAJeA2gEaARoBGgEaARoBGgEaARoBGgESAJIAmgEaARoBKwD2QYGBfYE5QRqBVYEPwSFBZoFkwKmAucEJQQKBwoG1wWkBNcF3wQ9BD8EhwW4BCcH2QSDBEoEpgJeA6YCOQQzA28EwQTDBN0DwQR1BPwCVATVBGACYAKLBGACPQfVBK4EwwTBBF4DyQNIA9UEGQROBj8EJwSkA9cCaATXAmgE//9QeQIAQd7LBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////+4BpgJLAyUF4QSKBq8FuQEAAwADxwMlBSgC/gIoAsAD6QRwA3gEagSFBDoEhwQFBMUEhwSAAoACJQUlBSUF1ANuB14FOwUjBf4FOgXLBM0FhQYeAyQEjgXUBGsHIwb0BeEE9AWdBX0E8wQNBlUFzgevBewE0AQAA8ADAAMlBSUFAAQIBHsEogOYBN4DmgITBKgEWAJWAkkESgIMB7oEUASSBHoERwN1A8MCmgT5A+YFCgTwA40DcQMAA3EDJQX///////////////////////////////////////////////////////////////////////////////////////8IAgMDFASgBSAFCQdlBicCkwOTA9sDoAWgAggDoALGA5wF6wMDBf8EMgXLBC8FbwRpBS8F8ALwAqAFoAWgBWMEvAcRBg8GuQWsBsUFXwV1Bk4HkQPDBIkGfAUwCLcGjwacBY8GYQYxBXkFqwYZBgMJeAbbBYQFkwPGA5MDoAWgBQAExAQqBUAETgWTBCUDnQRwBdQCxQIOBcECIAiFBRYFQwUwBSkEGgQuA2oFiQToBrQEfwQ0BAAEGgMABKAF////////////////////////////////////////////////////////////////////////////////////////7gGmAksDJQXhBIoGrwW5AQADAAPHAyUFKAL+AigCwAPpBHADeARqBIUEOgSHBPkDxQSHBBIDEgMlBSUFJQXUA24HXgU7BSMF/gU6BcsEzQWFBh4DJASOBdQEawcjBtgF4QTYBZ0FfQTzBA0GVQXOB68F7ATQBAADwAMAAyUFJQUABJUEbgShA5oExgOhApUEgARhAlQCOQRIAgkHuARMBKAEcQSxA3MDxwKaBE4ElAYCBHoEjQNxAwADcQMlBf///////////////////////////////////////////////////////////////////////////////////////wgCAwMUBKAFIAUJB2UGJwKTA5MD2wOgBaACCAOgAsYDnAXrAwMF/wQyBcsELwWIBGkFLwXwAvACoAWgBaAFYwS8BxEGEwa5BawGxQVfBXUGTgebA8MEiQZ8BUQIowaPBqYFjwZhBjkFeQWrBhkGAwlrBtsFhAWTA8YDkwOgBaAFAARIBTEFSQRNBXUEDAMyBWcF7QLrAiEF1gIECIUFFgVNBTMFRQQjBFYDewXmBHgHqwRbBSMEAAQaAwAEoAX//1h5AgBB7tMHC8gKoED/////////////////////////////////////////////////////////////////////////////////////zwGbAjUD/AMOBLgFdQXEAW0CbQL8A/wD/wFzAgUCFwMOBA4EDgQOBA4EDgQOBA4EDgQOBCQCJAL8A/wD/AO1AycHoQRaBEQE7AToA60DDAX8BAQCjQIoBF0D1wYqBUwFIgRiBVgErQPmAyIFigQeBycE5gO/A3QCFwN0AvwD/ANUAtUDNARiAzQE+wNxAsQDNATWAeoBowPWAWQGNAQ4BDQENATKAiEDrgI0BJ0DuAV3A58DKQOEAq8DhAL8A///AAD///////////////////////////////8AAP///////////////////////////////////////////////88BmwKCA/wDDgTVBaMF3gF+An4C/AP8AxACcwIjAnADDgQOBA4EDgQOBA4EDgQOBA4EDgQ1AjUC/AP8A/wDtQMwB9kEfAQ8BAsF5wOsAxkFDAUiAqYCYARiA/4GRQVpBUIEfQWBBMgD9gM5BbsEQAdoBCgE0wOZAnADmQL8A/wDZwLzA0sEWQNLBAcEiALLA0sE9wELAtcD9wGCBksETQRLBEsE2AIxA8YCSwTJA/YFrQPKAy4DwALNA8AC/AP////////////////////////////////////////////////////////////////////////////////////////PAZsCNQP8Aw4EuAV1BcQBbQJtAvwD/AP/AXMCBQIaAw4EDgQOBA4EDgQOBA4EDgQOBA4EJAIkAvwD/AP8A7UDJwehBFoELgTsBOgDrQMMBfwEBAKNAigEXQPXBigFPAUiBFAFWASeA+YDIgWKBB8HJwTmA78DdAITA3QC/AP8A1QCHQQdBFQDHQTSA3ECHQQdBNYB6gGjA9YBVAYdBBsEHQQdBL4CHQOuAh0EkQO4BXcDlAMpA4QCrwOEAvwD////////////////////////////////////////////////////////////////////////////////////////zwGbAoID/AMOBNUFowXeAX4CfgL8A/wDEAJzAiMCeQMOBA4EDgQOBA4EDgQOBA4EDgQOBDUCNQL8A/wD/AO1AzAH2QR8BCYECwXnA6wDGQUMBSICpgJgBGID/gZABVkFQgRrBYEEuQP2AzkFuwRBB2gEKATTA5kCZgOZAvwD/ANnAjkEOQRLAzkE7gOIAjkEOAT3AQsC1wP3AW4GOAQ4BDkEOQTRAicDxgI4BMED9gWtA8MDLgPAAs0DwAL8A///DAAAAAQAAAAGAAAAAgAAAAMAAAABAAAACQAAAAgAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAFEAAABSAAAAUwAAAFQAAABV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APUAAABlFwAAlyIAALo2AAD2AAAAt2AAALYAAABFDgAAAiIAAFM3AAAwIAAAYCwAAKUiAAAjOwAAxgMAAM46AADAAwAAjAsAANYDAAAqMgAAsQAAAOhRAACjAAAADEwAADIgAABTUQAADyIAAKQsAAAdIgAAszoAAMgDAABiDgAAIgAAALAaAADSIQAA+1oAABoiAABSQAAAKiMAAL8uAAC7AAAAlxoAAJIhAABaNwAACSMAAJkuAAAdIAAADzkAABwhAAAIQQAArgAAAEMbAAALIwAARC8AAMEDAABSNgAADyAAALEuAAA6IAAAjS4AABkgAACrLgAAGiAAAIcwAABhAQAA7A4AAMUiAADSEQAApwAAADIHAACtAAAA6GAAAMMDAAC8QgAAwgMAAFY2AAA8IgAAoxgAAGAmAACpXwAAgiIAABRRAACGIgAA7zUAABEiAAA8LAAAgyIAANK3AAC5AAAAhqkAALIAAABimwAAswAAAO1KAACHIgAAmUAAAN8AAADrCwAAxAMAAE2QAAA0IgAAbGAAALgDAADeNQAA0QMAAEosAAAJIAAAQDAAAP4AAAAkUAAA3AIAAGYXAADXAAAAMVAAACIhAACrGgAA0SEAALxHAAD6AAAAkRoAAJEhAABaWQAA+wAAAPhEAAD5AAAA6DYAAKgAAAAbPQAA0gMAAOIwAADFAwAAtTYAAPwAAABlLAAAGCEAALA6AAC+AwAAtUcAAP0AAAC2MgAApQAAALA2AAD/AAAAZ2AAALYDAACWOgAADSAAAJo6AAAMIAAA5z8BAAgAAAADAAAA5T4AACLQAAALAAAABgAAAFcVAADzaAAAAgAAAAEAAADKLAAApXQAAAQAAAACAAAAGUIAAAAEAAADAAAABAAAAAxBAAAu0AAABQAAAAUAAAC4QgAABAQAAAQAAAAHAAAALRUAAKo2AAAFAAAACQAAAKw2AAAibQAABAAAAAoAAAAsQgAAQPkBAAQAAAAMAAAAsC8AAAAAAQAAAdDR0tPU1dbX2NkAQebyBwsJ8L8AAAAAAAABAEH48gcLDWludmlzAABmaWxsZWQAQZDzBwsaMBoAACJRAADPNQAAbgsAAPR4AABpxgAAVY4AQdDzBwt5//////////////////////////////////////////8AAAAAAAAABP7//4f+//8HAAAAAAAAAAD//3////9///////////N//v3//////3///////////w/g/////zH8////AAAAAAAAAP//////////////AQD4AwBB4PQHC0FA1///+/////9/f1T9/w8A/t////////////7f/////wMA////////nxn////PPwMAAAAAAAD+////fwL+////fwBBqvUHC7MB////BwcAAAAAAP7//wf+BwAAAAD+//////////98/38vAGAAAADg////////IwAAAP8DAAAA4J/5///9xQMAAACwAwADAOCH+f///W0DAAAAXgAAHADgr/v///3tIwAAAAABAAAA4J/5///9zSMAAACwAwAAAODHPdYYx78DAAAAAAAAAADg3/3///3vAwAAAAADAAAA4N/9///97wMAAABAAwAAAODf/f///f8DAAAAAAMAQfD2BwsZ/v////9/DQA/AAAAAAAAAJYl8P6ubA0gHwBBmPcHCwb//v///wMAQcT3Bwty/////z8A/////38A7doHAAAAAFABUDGCq2IsAAAAAEAAyYD1BwAAAAAIAQL/////////////////////////D///////////////A///Pz//////Pz//qv///z/////////fX9wfzw//H9wfAAAAAEBMAEHA+AcLAQcAQdD4BwsmgAAAAP4DAAD+////////////HwD+/////////////wfg/////x8AQZD5BwsV//////////////////////////8/AEGw+QcLFf//////////////////////////DwBB1fkHC8kCYP8H/v//h/7//wcAAAAAAACAAP//f////3//////AAAAAAAAAP//////////////AQD4AwADAAAAAAD//////////z8AAAADAAAAwNf///v/////f39U/f8PAP7f///////////+3/////97AP///////58Z////zz8DAAAAAAAA/v///38C/v///38A/v/7//+7FgD///8HBwAAAAAA/v//B///BwD/A////////////3z/f+///z3/A+7////////z/z8e/8//AADun/n///3F0585gLDP/wMA5If5///9bdOHOQBewP8fAO6v+////e3zvzsAAMH/AADun/n///3N8485wLDD/wAA7Mc91hjHv8PHPYAAgP8AAO7f/f//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rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/xcArv93AK7/BwAuAK7/JgCu/xcAEQAjAK7/DQCu/67/rv+u/zoArv+u/zUArv+u/67/KACu/wcArv87AEUArv9IAK7/rv+u/67/rv8AQYG1CAvBBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygAAAAAAAAAAAICAgICAhAMWQEAH1AIAwcSExRXFhcIC2kMHwoFDA4pESsPLRAvMCAyBjQ1GxwdHgsMISIjJCUmJygMGBkXBAobHBogKgohIiMkJSYnKAwKDlMKLFgxWFhYWFhYDBscDy5YMyEiIyQlJicoGxz/U///ISIjJCUmJygM//8F////CRT//////wwbHP8QFRYhIiMkJSYnKBsc/////yEiIyQlJicoDP8SExQRFhf///////8MGxz///8SISIjJCUmJygbHP////8hIiMkJSYnKAz///////8T////////DBsc/////yEiIyQlJicoGxz/////ISIjJCUmJygSExQVFhcYGf///////////yMkJSYnGxITFBYXIjZoAR84ViEgAhsbG14bGzc5cDbSwk8EPCJHIj8iRCIiWCJlIiIFBl9gOQQHCAkKCwwNDgRmZ11qbQUGb1g7cQcICQoLDA0OBHI8W3M+YUYbEhMUFhcEBQY/QWJJBwgJCgsMDQ4FBgBcAAAHCAkKCwwNDgQAAE8AAABTQgAAAAAABAUGAERUVQcICQoLDA0OBQYAAAAABwgJCgsMDQ4EACosLkcxMwAAAAAAAAQFBgAAAEoHCAkKCwwNDgUGAAAAAAcICQoLDA0OBAAAAAAA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X0NUWVBFAAAAAExDX05VTUVSSUMAAExDX1RJTUUAAAAAAExDX0NPTExBVEUAAExDX01PTkVUQVJZAExDX01FU1NBR0VTAEHw9QgLB0MuVVRGLTgAQYj2CAugEDCrAgDIqwIAWKwCAE5vIGVycm9yIGluZm9ybWF0aW9uAElsbGVnYWwgYnl0ZSBzZXF1ZW5jZQBEb21haW4gZXJyb3IAUmVzdWx0IG5vdCByZXByZXNlbnRhYmxlAE5vdCBhIHR0eQBQZXJtaXNzaW9uIGRlbmllZABPcGVyYXRpb24gbm90IHBlcm1pdHRlZABObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5AE5vIHN1Y2ggcHJvY2VzcwBGaWxlIGV4aXN0cwBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRhdGEgdHlwZQBObyBzcGFjZSBsZWZ0IG9uIGRldmljZQBPdXQgb2YgbWVtb3J5AFJlc291cmNlIGJ1c3kASW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwAUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUASW52YWxpZCBzZWVrAENyb3NzLWRldmljZSBsaW5rAFJlYWQtb25seSBmaWxlIHN5c3RlbQBEaXJlY3Rvcnkgbm90IGVtcHR5AENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgBPcGVyYXRpb24gdGltZWQgb3V0AENvbm5lY3Rpb24gcmVmdXNlZABIb3N0IGlzIGRvd24ASG9zdCBpcyB1bnJlYWNoYWJsZQBBZGRyZXNzIGluIHVzZQBCcm9rZW4gcGlwZQBJL08gZXJyb3IATm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwBCbG9jayBkZXZpY2UgcmVxdWlyZWQATm8gc3VjaCBkZXZpY2UATm90IGEgZGlyZWN0b3J5AElzIGEgZGlyZWN0b3J5AFRleHQgZmlsZSBidXN5AEV4ZWMgZm9ybWF0IGVycm9yAEludmFsaWQgYXJndW1lbnQAQXJndW1lbnQgbGlzdCB0b28gbG9uZwBTeW1ib2xpYyBsaW5rIGxvb3AARmlsZW5hbWUgdG9vIGxvbmcAVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0ATm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUAQmFkIGZpbGUgZGVzY3JpcHRvcgBObyBjaGlsZCBwcm9jZXNzAEJhZCBhZGRyZXNzAEZpbGUgdG9vIGxhcmdlAFRvbyBtYW55IGxpbmtzAE5vIGxvY2tzIGF2YWlsYWJsZQBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1cgBTdGF0ZSBub3QgcmVjb3ZlcmFibGUAUHJldmlvdXMgb3duZXIgZGllZABPcGVyYXRpb24gY2FuY2VsZWQARnVuY3Rpb24gbm90IGltcGxlbWVudGVkAE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlAElkZW50aWZpZXIgcmVtb3ZlZABEZXZpY2Ugbm90IGEgc3RyZWFtAE5vIGRhdGEgYXZhaWxhYmxlAERldmljZSB0aW1lb3V0AE91dCBvZiBzdHJlYW1zIHJlc291cmNlcwBMaW5rIGhhcyBiZWVuIHNldmVyZWQAUHJvdG9jb2wgZXJyb3IAQmFkIG1lc3NhZ2UARmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZQBOb3QgYSBzb2NrZXQARGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZABNZXNzYWdlIHRvbyBsYXJnZQBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQAUHJvdG9jb2wgbm90IGF2YWlsYWJsZQBQcm90b2NvbCBub3Qgc3VwcG9ydGVkAFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQATm90IHN1cHBvcnRlZABQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZABBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sAEFkZHJlc3Mgbm90IGF2YWlsYWJsZQBOZXR3b3JrIGlzIGRvd24ATmV0d29yayB1bnJlYWNoYWJsZQBDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsAQ29ubmVjdGlvbiBhYm9ydGVkAE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUAU29ja2V0IGlzIGNvbm5lY3RlZABTb2NrZXQgbm90IGNvbm5lY3RlZABDYW5ub3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24AT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MAT3BlcmF0aW9uIGluIHByb2dyZXNzAFN0YWxlIGZpbGUgaGFuZGxlAFJlbW90ZSBJL08gZXJyb3IAUXVvdGEgZXhjZWVkZWQATm8gbWVkaXVtIGZvdW5kAFdyb25nIG1lZGl1bSB0eXBlAE11bHRpaG9wIGF0dGVtcHRlZABSZXF1aXJlZCBrZXkgbm90IGF2YWlsYWJsZQBLZXkgaGFzIGV4cGlyZWQAS2V5IGhhcyBiZWVuIHJldm9rZWQAS2V5IHdhcyByZWplY3RlZCBieSBzZXJ2aWNlAAAAAAClAlsA8AG1BYwFJQGDBh0DlAT/AMcDMQMLBrwBjwF/A8oEKwDaBq8AQgNOA9wBDgQVAKEGDQGUAgsCOAZkArwC/wJdA+cECwfPAssF7wXbBeECHgZFAoUAggJsA28E8QDzAxgF2QDaA0wGVAJ7AZ0DvQQAAFEAFQK7ALMDbQD/AYUELwX5BDgAZQFGAZ8AtwaoAXMCUwEAQdiGCQsMIQQAAAAAAAAAAC8CAEH4hgkLBjUERwRWBABBjocJCwKgBABBoocJCyJGBWAFbgVhBgAAzwEAAAAAAAAAAMkG6Qb5Bh4HOQdJB14HAEHQhwkLkQHRdJ4AV529KoBwUg///z4nCgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QUYAAAANQAAAHEAAABr////zvv//5K///8AAAAAAAAAABkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEHxiAkLIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBBq4kJCwEMAEG3iQkLFRMAAAAAEwAAAAAJDAAAAAAADAAADABB5YkJCwEQAEHxiQkLFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABBn4oJCwESAEGrigkLHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBB4ooJCw4aAAAAGhoaAAAAAAAACQBBk4sJCwEUAEGfiwkLFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABBzYsJCwEWAEHZiwkLJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBBpIwJCwILAgBBzIwJCwj//////////wBBkI0JC/UI/////////////////////////////////////////////////////////////////wABAgMEBQYHCAn/////////CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiP///////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAQIEBwMGBQAAAAAAAAACAADAAwAAwAQAAMAFAADABgAAwAcAAMAIAADACQAAwAoAAMALAADADAAAwA0AAMAOAADADwAAwBAAAMARAADAEgAAwBMAAMAUAADAFQAAwBYAAMAXAADAGAAAwBkAAMAaAADAGwAAwBwAAMAdAADAHgAAwB8AAMAAAACzAQAAwwIAAMMDAADDBAAAwwUAAMMGAADDBwAAwwgAAMMJAADDCgAAwwsAAMMMAADDDQAA0w4AAMMPAADDAAAMuwEADMMCAAzDAwAMwwQADNsAAAAAVEkCAA0CAAAOAgAADwIAABACAAARAgAAEgIAABMCAAAUAgAAFQIAABYCAAAXAgAAGAIAABkCAAAaAgAABAAAAAAAAACQSQIAGwIAABwCAAD8/////P///5BJAgAdAgAAHgIAALhIAgDMSAIAAAAAANhJAgAfAgAAIAIAAA8CAAAQAgAAIQIAACICAAATAgAAFAIAABUCAAAjAgAAFwIAACQCAAAZAgAAJQIAAMh0AgAoSQIA7EoCAE5TdDNfXzI5YmFzaWNfaW9zSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFAAAAoHQCAFxJAgBOU3QzX18yMTViYXNpY19zdHJlYW1idWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUUAAAAAJHUCAKhJAgAAAAAAAQAAABxJAgAD9P//TlN0M19fMjEzYmFzaWNfb3N0cmVhbUljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQAAyHQCAORJAgBUSQIATlN0M19fMjE1YmFzaWNfc3RyaW5nYnVmSWNOU18xMWNoYXJfdHJhaXRz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";return D}var EA;function XA(D){if(D==EA&&h)return new Uint8Array(h);var b=m(D);if(b)return b;throw"both async and sync fetching of the wasm failed"}function pA(D){return Promise.resolve().then(()=>XA(D))}function Ae(D,b,R){return pA(D).then(V=>WebAssembly.instantiate(V,b)).then(R,V=>{Q(`failed to asynchronously prepare wasm: ${V}`),PA(V)})}function NA(D,b,R,V){return Ae(b,R,V)}function Ne(){return{a:Tt}}function YA(){var D=Ne();function b(V,_){return ct=V.exports,v=ct.y,W(),dA(ct.z),vA(),ct}HA();function R(V){b(V.instance)}return EA??=OA(),NA(h,EA,D,R).catch(o),{}}function DA(D){return t.agerrMessages.push(Fe(D)),0}function Kt(D){this.name="ExitStatus",this.message=`Program terminated with exit(${D})`,this.status=D}var pt=D=>{D.forEach(b=>b(t))};function ue(D,b="i8"){switch(b.endsWith("*")&&(b="*"),b){case"i1":return k[D];case"i8":return k[D];case"i16":return x[D>>1];case"i32":return F[D>>2];case"i64":return Z[D>>3];case"float":return P[D>>2];case"double":return AA[D>>3];case"*":return z[D>>2];default:PA(`invalid type for getValue: ${b}`)}}var Ot=D=>en(D),He=()=>mn(),je=typeof TextDecoder<"u"?new TextDecoder:void 0,ft=(D,b=0,R=NaN)=>{for(var V=b+R,_=b;D[_]&&!(_>=V);)++_;if(_-b>16&&D.buffer&&je)return je.decode(D.subarray(b,_));for(var q="";b<_;){var eA=D[b++];if(!(eA&128)){q+=String.fromCharCode(eA);continue}var aA=D[b++]&63;if((eA&224)==192){q+=String.fromCharCode((eA&31)<<6|aA);continue}var yA=D[b++]&63;if((eA&240)==224?eA=(eA&15)<<12|aA<<6|yA:eA=(eA&7)<<18|aA<<12|yA<<6|D[b++]&63,eA<65536)q+=String.fromCharCode(eA);else{var ne=eA-65536;q+=String.fromCharCode(55296|ne>>10,56320|ne&1023)}}return q},Fe=(D,b)=>D?ft(M,D,b):"",ri=(D,b,R,V)=>{PA(`Assertion failed: ${Fe(D)}, at: `+[b?Fe(b):"unknown filename",R,V?Fe(V):"unknown function"])};class j{constructor(b){this.excPtr=b,this.ptr=b-24}set_type(b){z[this.ptr+4>>2]=b}get_type(){return z[this.ptr+4>>2]}set_destructor(b){z[this.ptr+8>>2]=b}get_destructor(){return z[this.ptr+8>>2]}set_caught(b){b=b?1:0,k[this.ptr+12]=b}get_caught(){return k[this.ptr+12]!=0}set_rethrown(b){b=b?1:0,k[this.ptr+13]=b}get_rethrown(){return k[this.ptr+13]!=0}init(b,R){this.set_adjusted_ptr(0),this.set_type(b),this.set_destructor(R)}set_adjusted_ptr(b){z[this.ptr+16>>2]=b}get_adjusted_ptr(){return z[this.ptr+16>>2]}}var X=0,tA=(D,b,R)=>{var V=new j(D);throw V.init(b,R),X=D,X},nA={isAbs:D=>D.charAt(0)==="/",splitPath:D=>{var b=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return b.exec(D).slice(1)},normalizeArray:(D,b)=>{for(var R=0,V=D.length-1;V>=0;V--){var _=D[V];_==="."?D.splice(V,1):_===".."?(D.splice(V,1),R++):R&&(D.splice(V,1),R--)}if(b)for(;R;R--)D.unshift("..");return D},normalize:D=>{var b=nA.isAbs(D),R=D.substr(-1)==="/";return D=nA.normalizeArray(D.split("/").filter(V=>!!V),!b).join("/"),!D&&!b&&(D="."),D&&R&&(D+="/"),(b?"/":"")+D},dirname:D=>{var b=nA.splitPath(D),R=b[0],V=b[1];return!R&&!V?".":(V&&(V=V.substr(0,V.length-1)),R+V)},basename:D=>{if(D==="/")return"/";D=nA.normalize(D),D=D.replace(/\/$/,"");var b=D.lastIndexOf("/");return b===-1?D:D.substr(b+1)},join:(...D)=>nA.normalize(D.join("/")),join2:(D,b)=>nA.normalize(D+"/"+b)},UA=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return D=>crypto.getRandomValues(D);PA("initRandomDevice")},de=D=>(de=UA())(D),pe={resolve:(...D)=>{for(var b="",R=!1,V=D.length-1;V>=-1&&!R;V--){var _=V>=0?D[V]:U.cwd();if(typeof _!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!_)return"";b=_+"/"+b,R=nA.isAbs(_)}return b=nA.normalizeArray(b.split("/").filter(q=>!!q),!R).join("/"),(R?"/":"")+b||"."},relative:(D,b)=>{D=pe.resolve(D).substr(1),b=pe.resolve(b).substr(1);function R(ne){for(var re=0;re=0&&ne[Qe]==="";Qe--);return re>Qe?[]:ne.slice(re,Qe-re+1)}for(var V=R(D.split("/")),_=R(b.split("/")),q=Math.min(V.length,_.length),eA=q,aA=0;aA{for(var b=0,R=0;R=55296&&V<=57343?(b+=4,++R):b+=3}return b},Qt=(D,b,R,V)=>{if(!(V>0))return 0;for(var _=R,q=R+V-1,eA=0;eA=55296&&aA<=57343){var yA=D.charCodeAt(++eA);aA=65536+((aA&1023)<<10)|yA&1023}if(aA<=127){if(R>=q)break;b[R++]=aA}else if(aA<=2047){if(R+1>=q)break;b[R++]=192|aA>>6,b[R++]=128|aA&63}else if(aA<=65535){if(R+2>=q)break;b[R++]=224|aA>>12,b[R++]=128|aA>>6&63,b[R++]=128|aA&63}else{if(R+3>=q)break;b[R++]=240|aA>>18,b[R++]=128|aA>>12&63,b[R++]=128|aA>>6&63,b[R++]=128|aA&63}}return b[R]=0,R-_};function nt(D,b,R){var V=R>0?R:JA(D)+1,_=new Array(V),q=Qt(D,_,0,_.length);return b&&(_.length=q),_}var ze=()=>{if(!GA.length){var D=null;if(typeof window<"u"&&typeof window.prompt=="function"&&(D=window.prompt("Input: "),D!==null&&(D+=` +`)),!D)return null;GA=nt(D,!0)}return GA.shift()},Ye={ttys:[],init(){},shutdown(){},register(D,b){Ye.ttys[D]={input:[],output:[],ops:b},U.registerDevice(D,Ye.stream_ops)},stream_ops:{open(D){var b=Ye.ttys[D.node.rdev];if(!b)throw new U.ErrnoError(43);D.tty=b,D.seekable=!1},close(D){D.tty.ops.fsync(D.tty)},fsync(D){D.tty.ops.fsync(D.tty)},read(D,b,R,V,_){if(!D.tty||!D.tty.ops.get_char)throw new U.ErrnoError(60);for(var q=0,eA=0;eA0&&(B(ft(D.output)),D.output=[])},ioctl_tcgets(D){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(D,b,R){return 0},ioctl_tiocgwinsz(D){return[24,80]}},default_tty1_ops:{put_char(D,b){b===null||b===10?(Q(ft(D.output)),D.output=[]):b!=0&&D.output.push(b)},fsync(D){D.output&&D.output.length>0&&(Q(ft(D.output)),D.output=[])}}},di=(D,b)=>{M.fill(0,D,D+b)},Cn=(D,b)=>Math.ceil(D/b)*b,Qn=D=>{D=Cn(D,65536);var b=Hi(65536,D);return b&&di(b,D),b},Je={ops_table:null,mount(D){return Je.createNode(null,"/",16895,0)},createNode(D,b,R,V){if(U.isBlkdev(R)||U.isFIFO(R))throw new U.ErrnoError(63);Je.ops_table||={dir:{node:{getattr:Je.node_ops.getattr,setattr:Je.node_ops.setattr,lookup:Je.node_ops.lookup,mknod:Je.node_ops.mknod,rename:Je.node_ops.rename,unlink:Je.node_ops.unlink,rmdir:Je.node_ops.rmdir,readdir:Je.node_ops.readdir,symlink:Je.node_ops.symlink},stream:{llseek:Je.stream_ops.llseek}},file:{node:{getattr:Je.node_ops.getattr,setattr:Je.node_ops.setattr},stream:{llseek:Je.stream_ops.llseek,read:Je.stream_ops.read,write:Je.stream_ops.write,allocate:Je.stream_ops.allocate,mmap:Je.stream_ops.mmap,msync:Je.stream_ops.msync}},link:{node:{getattr:Je.node_ops.getattr,setattr:Je.node_ops.setattr,readlink:Je.node_ops.readlink},stream:{}},chrdev:{node:{getattr:Je.node_ops.getattr,setattr:Je.node_ops.setattr},stream:U.chrdev_stream_ops}};var _=U.createNode(D,b,R,V);return U.isDir(_.mode)?(_.node_ops=Je.ops_table.dir.node,_.stream_ops=Je.ops_table.dir.stream,_.contents={}):U.isFile(_.mode)?(_.node_ops=Je.ops_table.file.node,_.stream_ops=Je.ops_table.file.stream,_.usedBytes=0,_.contents=null):U.isLink(_.mode)?(_.node_ops=Je.ops_table.link.node,_.stream_ops=Je.ops_table.link.stream):U.isChrdev(_.mode)&&(_.node_ops=Je.ops_table.chrdev.node,_.stream_ops=Je.ops_table.chrdev.stream),_.timestamp=Date.now(),D&&(D.contents[b]=_,D.timestamp=_.timestamp),_},getFileDataAsTypedArray(D){return D.contents?D.contents.subarray?D.contents.subarray(0,D.usedBytes):new Uint8Array(D.contents):new Uint8Array(0)},expandFileStorage(D,b){var R=D.contents?D.contents.length:0;if(!(R>=b)){var V=1024*1024;b=Math.max(b,R*(R>>0),R!=0&&(b=Math.max(b,256));var _=D.contents;D.contents=new Uint8Array(b),D.usedBytes>0&&D.contents.set(_.subarray(0,D.usedBytes),0)}},resizeFileStorage(D,b){if(D.usedBytes!=b)if(b==0)D.contents=null,D.usedBytes=0;else{var R=D.contents;D.contents=new Uint8Array(b),R&&D.contents.set(R.subarray(0,Math.min(b,D.usedBytes))),D.usedBytes=b}},node_ops:{getattr(D){var b={};return b.dev=U.isChrdev(D.mode)?D.id:1,b.ino=D.id,b.mode=D.mode,b.nlink=1,b.uid=0,b.gid=0,b.rdev=D.rdev,U.isDir(D.mode)?b.size=4096:U.isFile(D.mode)?b.size=D.usedBytes:U.isLink(D.mode)?b.size=D.link.length:b.size=0,b.atime=new Date(D.timestamp),b.mtime=new Date(D.timestamp),b.ctime=new Date(D.timestamp),b.blksize=4096,b.blocks=Math.ceil(b.size/b.blksize),b},setattr(D,b){b.mode!==void 0&&(D.mode=b.mode),b.timestamp!==void 0&&(D.timestamp=b.timestamp),b.size!==void 0&&Je.resizeFileStorage(D,b.size)},lookup(D,b){throw U.genericErrors[44]},mknod(D,b,R,V){return Je.createNode(D,b,R,V)},rename(D,b,R){if(U.isDir(D.mode)){var V;try{V=U.lookupNode(b,R)}catch(q){}if(V)for(var _ in V.contents)throw new U.ErrnoError(55)}delete D.parent.contents[D.name],D.parent.timestamp=Date.now(),D.name=R,b.contents[R]=D,b.timestamp=D.parent.timestamp},unlink(D,b){delete D.contents[b],D.timestamp=Date.now()},rmdir(D,b){var R=U.lookupNode(D,b);for(var V in R.contents)throw new U.ErrnoError(55);delete D.contents[b],D.timestamp=Date.now()},readdir(D){var b=[".",".."];for(var R of Object.keys(D.contents))b.push(R);return b},symlink(D,b,R){var V=Je.createNode(D,b,41471,0);return V.link=R,V},readlink(D){if(!U.isLink(D.mode))throw new U.ErrnoError(28);return D.link}},stream_ops:{read(D,b,R,V,_){var q=D.node.contents;if(_>=D.node.usedBytes)return 0;var eA=Math.min(D.node.usedBytes-_,V);if(eA>8&&q.subarray)b.set(q.subarray(_,_+eA),R);else for(var aA=0;aA0||R+b{var _=V?"":`al ${D}`;C(D).then(q=>{b(new Uint8Array(q)),_&&vA()},q=>{if(R)R();else throw`Loading data file "${D}" failed.`}),_&&HA()},ki=(D,b,R,V,_,q)=>{U.createDataFile(D,b,R,V,_,q)},Ki=[],An=(D,b,R,V)=>{typeof Browser<"u"&&Browser.init();var _=!1;return Ki.forEach(q=>{_||q.canHandle(b)&&(q.handle(D,b,R,V),_=!0)}),_},Mt=(D,b,R,V,_,q,eA,aA,yA,ne)=>{var re=b?pe.resolve(nA.join2(D,b)):D;function Qe(Pe){function Le(Ue){ne?.(),aA||ki(D,b,Ue,V,_,yA),q?.(),vA()}An(Pe,re,Le,()=>{eA?.(),vA()})||Le(Pe)}HA(),typeof R=="string"?an(R,Qe,eA):Qe(R)},rn=D=>{var b={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},R=b[D];if(typeof R>"u")throw new Error(`Unknown file open mode: ${D}`);return R},Ut=(D,b)=>{var R=0;return D&&(R|=365),b&&(R|=146),R},U={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(D){this.name="ErrnoError",this.errno=D}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(D){this.node=D}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(D){this.shared.flags=D}get position(){return this.shared.position}set position(D){this.shared.position=D}},FSNode:class{constructor(D,b,R,V){D||(D=this),this.parent=D,this.mount=D.mount,this.mounted=null,this.id=U.nextInode++,this.name=b,this.mode=R,this.node_ops={},this.stream_ops={},this.rdev=V,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(D){D?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(D){D?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return U.isDir(this.mode)}get isDevice(){return U.isChrdev(this.mode)}},lookupPath(D,b={}){if(D=pe.resolve(D),!D)return{path:"",node:null};var R={follow_mount:!0,recurse_count:0};if(b=Object.assign(R,b),b.recurse_count>8)throw new U.ErrnoError(32);for(var V=D.split("/").filter(Qe=>!!Qe),_=U.root,q="/",eA=0;eA40)throw new U.ErrnoError(32)}}return{path:q,node:_}},getPath(D){for(var b;;){if(U.isRoot(D)){var R=D.mount.mountpoint;return b?R[R.length-1]!=="/"?`${R}/${b}`:R+b:R}b=b?`${D.name}/${b}`:D.name,D=D.parent}},hashName(D,b){for(var R=0,V=0;V>>0)%U.nameTable.length},hashAddNode(D){var b=U.hashName(D.parent.id,D.name);D.name_next=U.nameTable[b],U.nameTable[b]=D},hashRemoveNode(D){var b=U.hashName(D.parent.id,D.name);if(U.nameTable[b]===D)U.nameTable[b]=D.name_next;else for(var R=U.nameTable[b];R;){if(R.name_next===D){R.name_next=D.name_next;break}R=R.name_next}},lookupNode(D,b){var R=U.mayLookup(D);if(R)throw new U.ErrnoError(R);for(var V=U.hashName(D.id,b),_=U.nameTable[V];_;_=_.name_next){var q=_.name;if(_.parent.id===D.id&&q===b)return _}return U.lookup(D,b)},createNode(D,b,R,V){var _=new U.FSNode(D,b,R,V);return U.hashAddNode(_),_},destroyNode(D){U.hashRemoveNode(D)},isRoot(D){return D===D.parent},isMountpoint(D){return!!D.mounted},isFile(D){return(D&61440)===32768},isDir(D){return(D&61440)===16384},isLink(D){return(D&61440)===40960},isChrdev(D){return(D&61440)===8192},isBlkdev(D){return(D&61440)===24576},isFIFO(D){return(D&61440)===4096},isSocket(D){return(D&49152)===49152},flagsToPermissionString(D){var b=["r","w","rw"][D&3];return D&512&&(b+="w"),b},nodePermissions(D,b){return U.ignorePermissions?0:b.includes("r")&&!(D.mode&292)||b.includes("w")&&!(D.mode&146)||b.includes("x")&&!(D.mode&73)?2:0},mayLookup(D){if(!U.isDir(D.mode))return 54;var b=U.nodePermissions(D,"x");return b||(D.node_ops.lookup?0:2)},mayCreate(D,b){try{var R=U.lookupNode(D,b);return 20}catch(V){}return U.nodePermissions(D,"wx")},mayDelete(D,b,R){var V;try{V=U.lookupNode(D,b)}catch(q){return q.errno}var _=U.nodePermissions(D,"wx");if(_)return _;if(R){if(!U.isDir(V.mode))return 54;if(U.isRoot(V)||U.getPath(V)===U.cwd())return 10}else if(U.isDir(V.mode))return 31;return 0},mayOpen(D,b){return D?U.isLink(D.mode)?32:U.isDir(D.mode)&&(U.flagsToPermissionString(b)!=="r"||b&512)?31:U.nodePermissions(D,U.flagsToPermissionString(b)):44},MAX_OPEN_FDS:4096,nextfd(){for(var D=0;D<=U.MAX_OPEN_FDS;D++)if(!U.streams[D])return D;throw new U.ErrnoError(33)},getStreamChecked(D){var b=U.getStream(D);if(!b)throw new U.ErrnoError(8);return b},getStream:D=>U.streams[D],createStream(D,b=-1){return D=Object.assign(new U.FSStream,D),b==-1&&(b=U.nextfd()),D.fd=b,U.streams[b]=D,D},closeStream(D){U.streams[D]=null},dupStream(D,b=-1){var R=U.createStream(D,b);return R.stream_ops?.dup?.(R),R},chrdev_stream_ops:{open(D){var b=U.getDevice(D.node.rdev);D.stream_ops=b.stream_ops,D.stream_ops.open?.(D)},llseek(){throw new U.ErrnoError(70)}},major:D=>D>>8,minor:D=>D&255,makedev:(D,b)=>D<<8|b,registerDevice(D,b){U.devices[D]={stream_ops:b}},getDevice:D=>U.devices[D],getMounts(D){for(var b=[],R=[D];R.length;){var V=R.pop();b.push(V),R.push(...V.mounts)}return b},syncfs(D,b){typeof D=="function"&&(b=D,D=!1),U.syncFSRequests++,U.syncFSRequests>1&&Q(`warning: ${U.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var R=U.getMounts(U.root.mount),V=0;function _(eA){return U.syncFSRequests--,b(eA)}function q(eA){if(eA)return q.errored?void 0:(q.errored=!0,_(eA));++V>=R.length&&_(null)}R.forEach(eA=>{if(!eA.type.syncfs)return q(null);eA.type.syncfs(eA,D,q)})},mount(D,b,R){var V=R==="/",_=!R,q;if(V&&U.root)throw new U.ErrnoError(10);if(!V&&!_){var eA=U.lookupPath(R,{follow_mount:!1});if(R=eA.path,q=eA.node,U.isMountpoint(q))throw new U.ErrnoError(10);if(!U.isDir(q.mode))throw new U.ErrnoError(54)}var aA={type:D,opts:b,mountpoint:R,mounts:[]},yA=D.mount(aA);return yA.mount=aA,aA.root=yA,V?U.root=yA:q&&(q.mounted=aA,q.mount&&q.mount.mounts.push(aA)),yA},unmount(D){var b=U.lookupPath(D,{follow_mount:!1});if(!U.isMountpoint(b.node))throw new U.ErrnoError(28);var R=b.node,V=R.mounted,_=U.getMounts(V);Object.keys(U.nameTable).forEach(eA=>{for(var aA=U.nameTable[eA];aA;){var yA=aA.name_next;_.includes(aA.mount)&&U.destroyNode(aA),aA=yA}}),R.mounted=null;var q=R.mount.mounts.indexOf(V);R.mount.mounts.splice(q,1)},lookup(D,b){return D.node_ops.lookup(D,b)},mknod(D,b,R){var V=U.lookupPath(D,{parent:!0}),_=V.node,q=nA.basename(D);if(!q||q==="."||q==="..")throw new U.ErrnoError(28);var eA=U.mayCreate(_,q);if(eA)throw new U.ErrnoError(eA);if(!_.node_ops.mknod)throw new U.ErrnoError(63);return _.node_ops.mknod(_,q,b,R)},create(D,b){return b=b!==void 0?b:438,b&=4095,b|=32768,U.mknod(D,b,0)},mkdir(D,b){return b=b!==void 0?b:511,b&=1023,b|=16384,U.mknod(D,b,0)},mkdirTree(D,b){for(var R=D.split("/"),V="",_=0;_"u"&&(R=b,b=438),b|=8192,U.mknod(D,b,R)},symlink(D,b){if(!pe.resolve(D))throw new U.ErrnoError(44);var R=U.lookupPath(b,{parent:!0}),V=R.node;if(!V)throw new U.ErrnoError(44);var _=nA.basename(b),q=U.mayCreate(V,_);if(q)throw new U.ErrnoError(q);if(!V.node_ops.symlink)throw new U.ErrnoError(63);return V.node_ops.symlink(V,_,D)},rename(D,b){var R=nA.dirname(D),V=nA.dirname(b),_=nA.basename(D),q=nA.basename(b),eA,aA,yA;if(eA=U.lookupPath(D,{parent:!0}),aA=eA.node,eA=U.lookupPath(b,{parent:!0}),yA=eA.node,!aA||!yA)throw new U.ErrnoError(44);if(aA.mount!==yA.mount)throw new U.ErrnoError(75);var ne=U.lookupNode(aA,_),re=pe.relative(D,V);if(re.charAt(0)!==".")throw new U.ErrnoError(28);if(re=pe.relative(b,R),re.charAt(0)!==".")throw new U.ErrnoError(55);var Qe;try{Qe=U.lookupNode(yA,q)}catch(Ue){}if(ne!==Qe){var Pe=U.isDir(ne.mode),Le=U.mayDelete(aA,_,Pe);if(Le)throw new U.ErrnoError(Le);if(Le=Qe?U.mayDelete(yA,q,Pe):U.mayCreate(yA,q),Le)throw new U.ErrnoError(Le);if(!aA.node_ops.rename)throw new U.ErrnoError(63);if(U.isMountpoint(ne)||Qe&&U.isMountpoint(Qe))throw new U.ErrnoError(10);if(yA!==aA&&(Le=U.nodePermissions(aA,"w"),Le))throw new U.ErrnoError(Le);U.hashRemoveNode(ne);try{aA.node_ops.rename(ne,yA,q),ne.parent=yA}catch(Ue){throw Ue}finally{U.hashAddNode(ne)}}},rmdir(D){var b=U.lookupPath(D,{parent:!0}),R=b.node,V=nA.basename(D),_=U.lookupNode(R,V),q=U.mayDelete(R,V,!0);if(q)throw new U.ErrnoError(q);if(!R.node_ops.rmdir)throw new U.ErrnoError(63);if(U.isMountpoint(_))throw new U.ErrnoError(10);R.node_ops.rmdir(R,V),U.destroyNode(_)},readdir(D){var b=U.lookupPath(D,{follow:!0}),R=b.node;if(!R.node_ops.readdir)throw new U.ErrnoError(54);return R.node_ops.readdir(R)},unlink(D){var b=U.lookupPath(D,{parent:!0}),R=b.node;if(!R)throw new U.ErrnoError(44);var V=nA.basename(D),_=U.lookupNode(R,V),q=U.mayDelete(R,V,!1);if(q)throw new U.ErrnoError(q);if(!R.node_ops.unlink)throw new U.ErrnoError(63);if(U.isMountpoint(_))throw new U.ErrnoError(10);R.node_ops.unlink(R,V),U.destroyNode(_)},readlink(D){var b=U.lookupPath(D),R=b.node;if(!R)throw new U.ErrnoError(44);if(!R.node_ops.readlink)throw new U.ErrnoError(28);return pe.resolve(U.getPath(R.parent),R.node_ops.readlink(R))},stat(D,b){var R=U.lookupPath(D,{follow:!b}),V=R.node;if(!V)throw new U.ErrnoError(44);if(!V.node_ops.getattr)throw new U.ErrnoError(63);return V.node_ops.getattr(V)},lstat(D){return U.stat(D,!0)},chmod(D,b,R){var V;if(typeof D=="string"){var _=U.lookupPath(D,{follow:!R});V=_.node}else V=D;if(!V.node_ops.setattr)throw new U.ErrnoError(63);V.node_ops.setattr(V,{mode:b&4095|V.mode&-4096,timestamp:Date.now()})},lchmod(D,b){U.chmod(D,b,!0)},fchmod(D,b){var R=U.getStreamChecked(D);U.chmod(R.node,b)},chown(D,b,R,V){var _;if(typeof D=="string"){var q=U.lookupPath(D,{follow:!V});_=q.node}else _=D;if(!_.node_ops.setattr)throw new U.ErrnoError(63);_.node_ops.setattr(_,{timestamp:Date.now()})},lchown(D,b,R){U.chown(D,b,R,!0)},fchown(D,b,R){var V=U.getStreamChecked(D);U.chown(V.node,b,R)},truncate(D,b){if(b<0)throw new U.ErrnoError(28);var R;if(typeof D=="string"){var V=U.lookupPath(D,{follow:!0});R=V.node}else R=D;if(!R.node_ops.setattr)throw new U.ErrnoError(63);if(U.isDir(R.mode))throw new U.ErrnoError(31);if(!U.isFile(R.mode))throw new U.ErrnoError(28);var _=U.nodePermissions(R,"w");if(_)throw new U.ErrnoError(_);R.node_ops.setattr(R,{size:b,timestamp:Date.now()})},ftruncate(D,b){var R=U.getStreamChecked(D);if((R.flags&2097155)===0)throw new U.ErrnoError(28);U.truncate(R.node,b)},utime(D,b,R){var V=U.lookupPath(D,{follow:!0}),_=V.node;_.node_ops.setattr(_,{timestamp:Math.max(b,R)})},open(D,b,R){if(D==="")throw new U.ErrnoError(44);b=typeof b=="string"?rn(b):b,b&64?(R=typeof R>"u"?438:R,R=R&4095|32768):R=0;var V;if(typeof D=="object")V=D;else{D=nA.normalize(D);try{var _=U.lookupPath(D,{follow:!(b&131072)});V=_.node}catch(yA){}}var q=!1;if(b&64)if(V){if(b&128)throw new U.ErrnoError(20)}else V=U.mknod(D,R,0),q=!0;if(!V)throw new U.ErrnoError(44);if(U.isChrdev(V.mode)&&(b&=-513),b&65536&&!U.isDir(V.mode))throw new U.ErrnoError(54);if(!q){var eA=U.mayOpen(V,b);if(eA)throw new U.ErrnoError(eA)}b&512&&!q&&U.truncate(V,0),b&=-131713;var aA=U.createStream({node:V,path:U.getPath(V),flags:b,seekable:!0,position:0,stream_ops:V.stream_ops,ungotten:[],error:!1});return aA.stream_ops.open&&aA.stream_ops.open(aA),aA},close(D){if(U.isClosed(D))throw new U.ErrnoError(8);D.getdents&&(D.getdents=null);try{D.stream_ops.close&&D.stream_ops.close(D)}catch(b){throw b}finally{U.closeStream(D.fd)}D.fd=null},isClosed(D){return D.fd===null},llseek(D,b,R){if(U.isClosed(D))throw new U.ErrnoError(8);if(!D.seekable||!D.stream_ops.llseek)throw new U.ErrnoError(70);if(R!=0&&R!=1&&R!=2)throw new U.ErrnoError(28);return D.position=D.stream_ops.llseek(D,b,R),D.ungotten=[],D.position},read(D,b,R,V,_){if(V<0||_<0)throw new U.ErrnoError(28);if(U.isClosed(D))throw new U.ErrnoError(8);if((D.flags&2097155)===1)throw new U.ErrnoError(8);if(U.isDir(D.node.mode))throw new U.ErrnoError(31);if(!D.stream_ops.read)throw new U.ErrnoError(28);var q=typeof _<"u";if(!q)_=D.position;else if(!D.seekable)throw new U.ErrnoError(70);var eA=D.stream_ops.read(D,b,R,V,_);return q||(D.position+=eA),eA},write(D,b,R,V,_,q){if(V<0||_<0)throw new U.ErrnoError(28);if(U.isClosed(D))throw new U.ErrnoError(8);if((D.flags&2097155)===0)throw new U.ErrnoError(8);if(U.isDir(D.node.mode))throw new U.ErrnoError(31);if(!D.stream_ops.write)throw new U.ErrnoError(28);D.seekable&&D.flags&1024&&U.llseek(D,0,2);var eA=typeof _<"u";if(!eA)_=D.position;else if(!D.seekable)throw new U.ErrnoError(70);var aA=D.stream_ops.write(D,b,R,V,_,q);return eA||(D.position+=aA),aA},allocate(D,b,R){if(U.isClosed(D))throw new U.ErrnoError(8);if(b<0||R<=0)throw new U.ErrnoError(28);if((D.flags&2097155)===0)throw new U.ErrnoError(8);if(!U.isFile(D.node.mode)&&!U.isDir(D.node.mode))throw new U.ErrnoError(43);if(!D.stream_ops.allocate)throw new U.ErrnoError(138);D.stream_ops.allocate(D,b,R)},mmap(D,b,R,V,_){if((V&2)!==0&&(_&2)===0&&(D.flags&2097155)!==2)throw new U.ErrnoError(2);if((D.flags&2097155)===1)throw new U.ErrnoError(2);if(!D.stream_ops.mmap)throw new U.ErrnoError(43);if(!b)throw new U.ErrnoError(28);return D.stream_ops.mmap(D,b,R,V,_)},msync(D,b,R,V,_){return D.stream_ops.msync?D.stream_ops.msync(D,b,R,V,_):0},ioctl(D,b,R){if(!D.stream_ops.ioctl)throw new U.ErrnoError(59);return D.stream_ops.ioctl(D,b,R)},readFile(D,b={}){if(b.flags=b.flags||0,b.encoding=b.encoding||"binary",b.encoding!=="utf8"&&b.encoding!=="binary")throw new Error(`Invalid encoding type "${b.encoding}"`);var R,V=U.open(D,b.flags),_=U.stat(D),q=_.size,eA=new Uint8Array(q);return U.read(V,eA,0,q,0),b.encoding==="utf8"?R=ft(eA):b.encoding==="binary"&&(R=eA),U.close(V),R},writeFile(D,b,R={}){R.flags=R.flags||577;var V=U.open(D,R.flags,R.mode);if(typeof b=="string"){var _=new Uint8Array(JA(b)+1),q=Qt(b,_,0,_.length);U.write(V,_,0,q,void 0,R.canOwn)}else if(ArrayBuffer.isView(b))U.write(V,b,0,b.byteLength,void 0,R.canOwn);else throw new Error("Unsupported data type");U.close(V)},cwd:()=>U.currentPath,chdir(D){var b=U.lookupPath(D,{follow:!0});if(b.node===null)throw new U.ErrnoError(44);if(!U.isDir(b.node.mode))throw new U.ErrnoError(54);var R=U.nodePermissions(b.node,"x");if(R)throw new U.ErrnoError(R);U.currentPath=b.path},createDefaultDirectories(){U.mkdir("/tmp"),U.mkdir("/home"),U.mkdir("/home/web_user")},createDefaultDevices(){U.mkdir("/dev"),U.registerDevice(U.makedev(1,3),{read:()=>0,write:(V,_,q,eA,aA)=>eA}),U.mkdev("/dev/null",U.makedev(1,3)),Ye.register(U.makedev(5,0),Ye.default_tty_ops),Ye.register(U.makedev(6,0),Ye.default_tty1_ops),U.mkdev("/dev/tty",U.makedev(5,0)),U.mkdev("/dev/tty1",U.makedev(6,0));var D=new Uint8Array(1024),b=0,R=()=>(b===0&&(b=de(D).byteLength),D[--b]);U.createDevice("/dev","random",R),U.createDevice("/dev","urandom",R),U.mkdir("/dev/shm"),U.mkdir("/dev/shm/tmp")},createSpecialDirectories(){U.mkdir("/proc");var D=U.mkdir("/proc/self");U.mkdir("/proc/self/fd"),U.mount({mount(){var b=U.createNode(D,"fd",16895,73);return b.node_ops={lookup(R,V){var _=+V,q=U.getStreamChecked(_),eA={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>q.path}};return eA.parent=eA,eA}},b}},{},"/proc/self/fd")},createStandardStreams(D,b,R){D?U.createDevice("/dev","stdin",D):U.symlink("/dev/tty","/dev/stdin"),b?U.createDevice("/dev","stdout",null,b):U.symlink("/dev/tty","/dev/stdout"),R?U.createDevice("/dev","stderr",null,R):U.symlink("/dev/tty1","/dev/stderr"),U.open("/dev/stdin",0),U.open("/dev/stdout",1),U.open("/dev/stderr",1)},staticInit(){[44].forEach(D=>{U.genericErrors[D]=new U.ErrnoError(D),U.genericErrors[D].stack=""}),U.nameTable=new Array(4096),U.mount(Je,{},"/"),U.createDefaultDirectories(),U.createDefaultDevices(),U.createSpecialDirectories(),U.filesystems={MEMFS:Je}},init(D,b,R){U.initialized=!0,U.createStandardStreams(D,b,R)},quit(){U.initialized=!1;for(var D=0;Dthis.length-1||Le<0)){var Ue=Le%this.chunkSize,li=Le/this.chunkSize|0;return this.getter(li)[Ue]}}setDataGetter(Le){this.getter=Le}cacheLength(){var Le=new XMLHttpRequest;if(Le.open("HEAD",R,!1),Le.send(null),!(Le.status>=200&&Le.status<300||Le.status===304))throw new Error("Couldn't load "+R+". Status: "+Le.status);var Ue=Number(Le.getResponseHeader("Content-length")),li,Pn=(li=Le.getResponseHeader("Accept-Ranges"))&&li==="bytes",$=(li=Le.getResponseHeader("Content-Encoding"))&&li==="gzip",fA=1024*1024;Pn||(fA=Ue);var ZA=(be,Se)=>{if(be>Se)throw new Error("invalid range ("+be+", "+Se+") or no bytes requested!");if(Se>Ue-1)throw new Error("only "+Ue+" bytes available! programmer error!");var st=new XMLHttpRequest;if(st.open("GET",R,!1),Ue!==fA&&st.setRequestHeader("Range","bytes="+be+"-"+Se),st.responseType="arraybuffer",st.overrideMimeType&&st.overrideMimeType("text/plain; charset=x-user-defined"),st.send(null),!(st.status>=200&&st.status<300||st.status===304))throw new Error("Couldn't load "+R+". Status: "+st.status);return st.response!==void 0?new Uint8Array(st.response||[]):nt(st.responseText||"",!0)},Te=this;Te.setDataGetter(be=>{var Se=be*fA,st=(be+1)*fA-1;if(st=Math.min(st,Ue-1),typeof Te.chunks[be]>"u"&&(Te.chunks[be]=ZA(Se,st)),typeof Te.chunks[be]>"u")throw new Error("doXHR failed!");return Te.chunks[be]}),($||!Ue)&&(fA=Ue=1,Ue=this.getter(0).length,fA=Ue,B("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=Ue,this._chunkSize=fA,this.lengthKnown=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if(typeof XMLHttpRequest<"u"){throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var eA,aA}else var aA={isDevice:!1,url:R};var yA=U.createFile(D,b,aA,V,_);aA.contents?yA.contents=aA.contents:aA.url&&(yA.contents=null,yA.url=aA.url),Object.defineProperties(yA,{usedBytes:{get:function(){return this.contents.length}}});var ne={},re=Object.keys(yA.stream_ops);re.forEach(Pe=>{var Le=yA.stream_ops[Pe];ne[Pe]=(...Ue)=>(U.forceLoadFile(yA),Le(...Ue))});function Qe(Pe,Le,Ue,li,Pn){var $=Pe.node.contents;if(Pn>=$.length)return 0;var fA=Math.min($.length-Pn,li);if($.slice)for(var ZA=0;ZA(U.forceLoadFile(yA),Qe(Pe,Le,Ue,li,Pn)),ne.mmap=(Pe,Le,Ue,li,Pn)=>{U.forceLoadFile(yA);var $=Qn(Le);if(!$)throw new U.ErrnoError(48);return Qe(Pe,k,$,Le,Ue),{ptr:$,allocated:!0}},yA.stream_ops=ne,yA}},Bt={DEFAULT_POLLMASK:5,calculateAt(D,b,R){if(nA.isAbs(b))return b;var V;if(D===-100)V=U.cwd();else{var _=Bt.getStreamFromFD(D);V=_.path}if(b.length==0){if(!R)throw new U.ErrnoError(44);return V}return nA.join2(V,b)},doStat(D,b,R){var V=D(b);F[R>>2]=V.dev,F[R+4>>2]=V.mode,z[R+8>>2]=V.nlink,F[R+12>>2]=V.uid,F[R+16>>2]=V.gid,F[R+20>>2]=V.rdev,Z[R+24>>3]=BigInt(V.size),F[R+32>>2]=4096,F[R+36>>2]=V.blocks;var _=V.atime.getTime(),q=V.mtime.getTime(),eA=V.ctime.getTime();return Z[R+40>>3]=BigInt(Math.floor(_/1e3)),z[R+48>>2]=_%1e3*1e3*1e3,Z[R+56>>3]=BigInt(Math.floor(q/1e3)),z[R+64>>2]=q%1e3*1e3*1e3,Z[R+72>>3]=BigInt(Math.floor(eA/1e3)),z[R+80>>2]=eA%1e3*1e3*1e3,Z[R+88>>3]=BigInt(V.ino),0},doMsync(D,b,R,V,_){if(!U.isFile(b.node.mode))throw new U.ErrnoError(43);if(V&2)return 0;var q=M.slice(D,D+R);U.msync(b,q,_,R,V)},getStreamFromFD(D){var b=U.getStreamChecked(D);return b},varargs:void 0,getStr(D){var b=Fe(D);return b}};function ui(D,b,R,V){try{if(b=Bt.getStr(b),b=Bt.calculateAt(D,b),R&-8)return-28;var _=U.lookupPath(b,{follow:!0}),q=_.node;if(!q)return-44;var eA="";return R&4&&(eA+="r"),R&2&&(eA+="w"),R&1&&(eA+="x"),eA&&U.nodePermissions(q,eA)?-2:0}catch(aA){if(typeof U>"u"||aA.name!=="ErrnoError")throw aA;return-aA.errno}}function un(){var D=F[+Bt.varargs>>2];return Bt.varargs+=4,D}var pn=un;function Xn(D,b,R){Bt.varargs=R;try{var V=Bt.getStreamFromFD(D);switch(b){case 0:{var _=un();if(_<0)return-28;for(;U.streams[_];)_++;var q;return q=U.dupStream(V,_),q.fd}case 1:case 2:return 0;case 3:return V.flags;case 4:{var _=un();return V.flags|=_,0}case 12:{var _=pn(),eA=0;return x[_+eA>>1]=2,0}case 13:case 14:return 0}return-28}catch(aA){if(typeof U>"u"||aA.name!=="ErrnoError")throw aA;return-aA.errno}}function zo(D,b){try{var R=Bt.getStreamFromFD(D);return Bt.doStat(U.stat,R.path,b)}catch(V){if(typeof U>"u"||V.name!=="ErrnoError")throw V;return-V.errno}}function Eo(D,b,R){Bt.varargs=R;try{var V=Bt.getStreamFromFD(D);switch(b){case 21509:return V.tty?0:-59;case 21505:{if(!V.tty)return-59;if(V.tty.ops.ioctl_tcgets){var _=V.tty.ops.ioctl_tcgets(V),q=pn();F[q>>2]=_.c_iflag||0,F[q+4>>2]=_.c_oflag||0,F[q+8>>2]=_.c_cflag||0,F[q+12>>2]=_.c_lflag||0;for(var eA=0;eA<32;eA++)k[q+eA+17]=_.c_cc[eA]||0;return 0}return 0}case 21510:case 21511:case 21512:return V.tty?0:-59;case 21506:case 21507:case 21508:{if(!V.tty)return-59;if(V.tty.ops.ioctl_tcsets){for(var q=pn(),aA=F[q>>2],yA=F[q+4>>2],ne=F[q+8>>2],re=F[q+12>>2],Qe=[],eA=0;eA<32;eA++)Qe.push(k[q+eA+17]);return V.tty.ops.ioctl_tcsets(V.tty,b,{c_iflag:aA,c_oflag:yA,c_cflag:ne,c_lflag:re,c_cc:Qe})}return 0}case 21519:{if(!V.tty)return-59;var q=pn();return F[q>>2]=0,0}case 21520:return V.tty?-28:-59;case 21531:{var q=pn();return U.ioctl(V,b,q)}case 21523:{if(!V.tty)return-59;if(V.tty.ops.ioctl_tiocgwinsz){var Pe=V.tty.ops.ioctl_tiocgwinsz(V.tty),q=pn();x[q>>1]=Pe[0],x[q+2>>1]=Pe[1]}return 0}case 21524:return V.tty?0:-59;case 21515:return V.tty?0:-59;default:return-28}}catch(Le){if(typeof U>"u"||Le.name!=="ErrnoError")throw Le;return-Le.errno}}function Lo(D,b,R,V){try{b=Bt.getStr(b);var _=V&256,q=V&4096;return V=V&-6401,b=Bt.calculateAt(D,b,q),Bt.doStat(_?U.lstat:U.stat,b,R)}catch(eA){if(typeof U>"u"||eA.name!=="ErrnoError")throw eA;return-eA.errno}}function $o(D,b,R,V){Bt.varargs=V;try{b=Bt.getStr(b),b=Bt.calculateAt(D,b);var _=V?un():0;return U.open(b,R,_).fd}catch(q){if(typeof U>"u"||q.name!=="ErrnoError")throw q;return-q.errno}}function yo(D,b){try{return D=Bt.getStr(D),Bt.doStat(U.stat,D,b)}catch(R){if(typeof U>"u"||R.name!=="ErrnoError")throw R;return-R.errno}}var da=()=>{PA("")},Aa=D=>D%4===0&&(D%100!==0||D%400===0),sa=[0,31,60,91,121,152,182,213,244,274,305,335],vo=[0,31,59,90,120,151,181,212,243,273,304,334],ge=D=>{var b=Aa(D.getFullYear()),R=b?sa:vo,V=R[D.getMonth()]+D.getDate()-1;return V},wi=9007199254740992,In=-9007199254740992,fn=D=>Dwi?NaN:Number(D);function Po(D,b){D=fn(D);var R=new Date(D*1e3);F[b>>2]=R.getSeconds(),F[b+4>>2]=R.getMinutes(),F[b+8>>2]=R.getHours(),F[b+12>>2]=R.getDate(),F[b+16>>2]=R.getMonth(),F[b+20>>2]=R.getFullYear()-1900,F[b+24>>2]=R.getDay();var V=ge(R)|0;F[b+28>>2]=V,F[b+36>>2]=-(R.getTimezoneOffset()*60);var _=new Date(R.getFullYear(),0,1),q=new Date(R.getFullYear(),6,1).getTimezoneOffset(),eA=_.getTimezoneOffset(),aA=(q!=eA&&R.getTimezoneOffset()==Math.min(eA,q))|0;F[b+32>>2]=aA}function wa(D,b,R,V,_,q,eA){_=fn(_);try{if(isNaN(_))return 61;var aA=Bt.getStreamFromFD(V),yA=U.mmap(aA,D,_,b,R),ne=yA.ptr;return F[q>>2]=yA.allocated,z[eA>>2]=ne,0}catch(re){if(typeof U>"u"||re.name!=="ErrnoError")throw re;return-re.errno}}function Ri(D,b,R,V,_,q){q=fn(q);try{var eA=Bt.getStreamFromFD(_);R&2&&Bt.doMsync(D,eA,b,V,q)}catch(aA){if(typeof U>"u"||aA.name!=="ErrnoError")throw aA;return-aA.errno}}var ho=(D,b,R)=>Qt(D,M,b,R),Va=(D,b,R,V)=>{var _=new Date().getFullYear(),q=new Date(_,0,1),eA=new Date(_,6,1),aA=q.getTimezoneOffset(),yA=eA.getTimezoneOffset(),ne=Math.max(aA,yA);z[D>>2]=ne*60,F[b>>2]=+(aA!=yA);var re=Le=>{var Ue=Le>=0?"-":"+",li=Math.abs(Le),Pn=String(Math.floor(li/60)).padStart(2,"0"),$=String(li%60).padStart(2,"0");return`UTC${Ue}${Pn}${$}`},Qe=re(aA),Pe=re(yA);yADate.now(),La=()=>2147483648,Hn=D=>{var b=v.buffer,R=(D-b.byteLength+65535)/65536|0;try{return v.grow(R),W(),1}catch(V){}},Ji=D=>{var b=M.length;D>>>=0;var R=La();if(D>R)return!1;for(var V=1;V<=4;V*=2){var _=b*(1+.2/V);_=Math.min(_,D+100663296);var q=Math.min(R,Cn(Math.max(D,_),65536)),eA=Hn(q);if(eA)return!0}return!1},Vt={},Gn=()=>s,Qo=()=>{if(!Qo.strings){var D=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",b={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:D,_:Gn()};for(var R in Vt)Vt[R]===void 0?delete b[R]:b[R]=Vt[R];var V=[];for(var R in b)V.push(`${R}=${b[R]}`);Qo.strings=V}return Qo.strings},Go=(D,b)=>{for(var R=0;R{var R=0;return Qo().forEach((V,_)=>{var q=b+R;z[D+_*4>>2]=q,Go(V,q),R+=V.length+1}),0},$A=(D,b)=>{var R=Qo();z[D>>2]=R.length;var V=0;return R.forEach(_=>V+=_.length+1),z[b>>2]=V,0},ve=D=>{l(D,new Kt(D))},hA=(D,b)=>{ve(D)},FA=hA;function le(D){try{var b=Bt.getStreamFromFD(D);return U.close(b),0}catch(R){if(typeof U>"u"||R.name!=="ErrnoError")throw R;return R.errno}}var Ge=(D,b,R,V)=>{for(var _=0,q=0;q>2],aA=z[b+4>>2];b+=8;var yA=U.read(D,k,eA,aA,V);if(yA<0)return-1;if(_+=yA,yA>2]=q,0}catch(eA){if(typeof U>"u"||eA.name!=="ErrnoError")throw eA;return eA.errno}}function gt(D,b,R,V){b=fn(b);try{if(isNaN(b))return 61;var _=Bt.getStreamFromFD(D);return U.llseek(_,b,R),Z[V>>3]=BigInt(_.position),_.getdents&&b===0&&R===0&&(_.getdents=null),0}catch(q){if(typeof U>"u"||q.name!=="ErrnoError")throw q;return q.errno}}var xt=(D,b,R,V)=>{for(var _=0,q=0;q>2],aA=z[b+4>>2];b+=8;var yA=U.write(D,k,eA,aA,V);if(yA<0)return-1;if(_+=yA,yA>2]=q,0}catch(eA){if(typeof U>"u"||eA.name!=="ErrnoError")throw eA;return eA.errno}}var Yi=D=>{var b=t["_"+D];return b},ji=(D,b)=>{k.set(D,b)},$t=D=>$n(D),Oi=D=>{var b=JA(D)+1,R=$t(b);return ho(D,R,b),R},Da=(D,b,R,V,_)=>{var q={string:Ue=>{var li=0;return Ue!=null&&Ue!==0&&(li=Oi(Ue)),li},array:Ue=>{var li=$t(Ue.length);return ji(Ue,li),li}};function eA(Ue){return b==="string"?Fe(Ue):b==="boolean"?!!Ue:Ue}var aA=Yi(D),yA=[],ne=0;if(V)for(var re=0;re(t._viz_set_y_invert=ct.A)(D),t._viz_set_reduce=D=>(t._viz_set_reduce=ct.B)(D),t._viz_get_graphviz_version=()=>(t._viz_get_graphviz_version=ct.C)(),t._free=D=>(t._free=ct.D)(D),t._malloc=D=>(t._malloc=ct.E)(D),t._viz_get_plugin_list=D=>(t._viz_get_plugin_list=ct.G)(D),t._viz_create_graph=(D,b,R)=>(t._viz_create_graph=ct.H)(D,b,R),t._viz_read_one_graph=D=>(t._viz_read_one_graph=ct.I)(D),t._viz_string_dup=(D,b)=>(t._viz_string_dup=ct.J)(D,b),t._viz_string_dup_html=(D,b)=>(t._viz_string_dup_html=ct.K)(D,b),t._viz_string_free=(D,b)=>(t._viz_string_free=ct.L)(D,b),t._viz_string_free_html=(D,b)=>(t._viz_string_free_html=ct.M)(D,b),t._viz_add_node=(D,b)=>(t._viz_add_node=ct.N)(D,b),t._viz_add_edge=(D,b,R)=>(t._viz_add_edge=ct.O)(D,b,R),t._viz_add_subgraph=(D,b)=>(t._viz_add_subgraph=ct.P)(D,b),t._viz_set_default_graph_attribute=(D,b,R)=>(t._viz_set_default_graph_attribute=ct.Q)(D,b,R),t._viz_set_default_node_attribute=(D,b,R)=>(t._viz_set_default_node_attribute=ct.R)(D,b,R),t._viz_set_default_edge_attribute=(D,b,R)=>(t._viz_set_default_edge_attribute=ct.S)(D,b,R),t._viz_set_attribute=(D,b,R)=>(t._viz_set_attribute=ct.T)(D,b,R),t._viz_free_graph=D=>(t._viz_free_graph=ct.U)(D),t._viz_create_context=()=>(t._viz_create_context=ct.V)(),t._viz_free_context=D=>(t._viz_free_context=ct.W)(D),t._viz_layout=(D,b,R)=>(t._viz_layout=ct.X)(D,b,R),t._viz_free_layout=(D,b)=>(t._viz_free_layout=ct.Y)(D,b),t._viz_reset_errors=()=>(t._viz_reset_errors=ct.Z)(),t._viz_render=(D,b,R)=>(t._viz_render=ct._)(D,b,R);var Hi=(D,b)=>(Hi=ct.$)(D,b),en=D=>(en=ct.aa)(D),$n=D=>($n=ct.ba)(D),mn=()=>(mn=ct.ca)();t.ccall=Da,t.getValue=ue,t.PATH=nA,t.UTF8ToString=Fe,t.stringToUTF8=ho,t.lengthBytesUTF8=JA,t.FS=U;var Rt,la;VA=function D(){Rt||jo(),Rt||(VA=D)};function jo(){if(_A>0||!la&&(la=1,QA(),_A>0))return;function D(){Rt||(Rt=1,t.calledRun=1,!S&&(RA(),n(t),IA()))}D()}return jo(),A=a,A}})(),sX=[[/^Error: (.*)/,"error"],[/^Warning: (.*)/,"warning"]];function lMA(i){return i.map(e=>{for(let A=0;A{if(typeof A.name!="string")throw new Error("image name must be a string");if(typeof A.width!="number"&&typeof A.width!="string")throw new Error("image width must be a number or string");if(typeof A.height!="number"&&typeof A.height!="string")throw new Error("image height must be a number or string");let t=i.PATH.join("/",A.name),n=` + +`;return i.FS.createPath("/",i.PATH.dirname(t)),i.FS.writeFile(t,n),t}):[]}function IMA(i,e){for(let A of e)i.FS.analyzePath(A).exists&&i.FS.unlink(A)}function dMA(i,e,A){let t;try{let n=i.lengthBytesUTF8(e);return t=i.ccall("malloc","number",["number"],[n+1]),i.stringToUTF8(e,t,n+1),i.ccall("viz_read_one_graph","number",["number"],[t])}finally{t&&i.ccall("free","number",["number"],[t])}}function BMA(i,e,A){let t=i.ccall("viz_create_graph","number",["string","number","number"],[e.name,typeof e.directed<"u"?e.directed:!0,typeof e.strict<"u"?e.strict:!1]);return CX(i,t,e),t}function CX(i,e,A){IX(i,e,A),A.nodes&&A.nodes.forEach(t=>{if(typeof t.name>"u")throw new Error("nodes must have a name");let n=i.ccall("viz_add_node","number",["number","string"],[e,String(t.name)]);t.attributes&&cX(i,e,n,t.attributes)}),A.edges&&A.edges.forEach(t=>{if(typeof t.tail>"u")throw new Error("edges must have a tail");if(typeof t.head>"u")throw new Error("edges must have a head");let n=i.ccall("viz_add_edge","number",["number","string","string"],[e,String(t.tail),String(t.head)]);t.attributes&&cX(i,e,n,t.attributes)}),A.subgraphs&&A.subgraphs.forEach(t=>{let n=i.ccall("viz_add_subgraph","number",["number","string"],[e,typeof t.name<"u"?String(t.name):0]);CX(i,n,t)})}function IX(i,e,A){if(A.graphAttributes)for(let[t,n]of Object.entries(A.graphAttributes))gD(i,e,n,o=>{i.ccall("viz_set_default_graph_attribute","number",["number","string","number"],[e,t,o])});if(A.nodeAttributes)for(let[t,n]of Object.entries(A.nodeAttributes))gD(i,e,n,o=>{i.ccall("viz_set_default_node_attribute","number",["number","string","number"],[e,t,o])});if(A.edgeAttributes)for(let[t,n]of Object.entries(A.edgeAttributes))gD(i,e,n,o=>{i.ccall("viz_set_default_edge_attribute","number",["number","string","number"],[e,t,o])})}function cX(i,e,A,t){for(let[n,o]of Object.entries(t))gD(i,e,o,a=>{i.ccall("viz_set_attribute","number",["number","string","number"],[A,n,a])})}function gD(i,e,A,t){let n;if(typeof A=="object"&&"html"in A?n=i.ccall("viz_string_dup_html","number",["number","string"],[e,String(A.html)]):n=i.ccall("viz_string_dup","number",["number","string"],[e,String(A)]),n==0)throw new Error("couldn't dup string");t(n),typeof A=="object"&&"html"in A?i.ccall("viz_string_free_html","number",["number","number"],[e,n]):i.ccall("viz_string_free","number",["number","number"],[e,n])}var Lx=class{constructor(e){this.module=e}get graphvizVersion(){return cMA(this.module)}get formats(){return lX(this.module,"device")}get engines(){return lX(this.module,"layout")}renderFormats(e,A,t={}){return gX(this.module,e,A,oA({engine:"dot"},t))}render(e,A={}){let t;A.format===void 0?t="dot":t=A.format;let n=gX(this.module,e,[t],oA({engine:"dot"},A));return n.status==="success"&&(n.output=n.output[t]),n}renderString(e,A={}){let t=this.render(e,A);if(t.status!=="success")throw new Error(t.errors.find(n=>n.level=="error")?.message||"render failed");return t.output}renderSVGElement(e,A={}){let t=this.renderString(e,Oe(oA({},A),{format:"svg"})),n;return typeof A.trustedTypePolicy<"u"?n=A.trustedTypePolicy.createHTML(t):n=t,new DOMParser().parseFromString(n,"image/svg+xml").documentElement}renderJSON(e,A={}){let t=this.renderString(e,Oe(oA({},A),{format:"json"}));return JSON.parse(t)}};function dX(){return sMA().then(i=>new Lx(i))}var cD=class i{render(e){return Ie(this,null,function*(){let A={format:"svg",engine:"dot"};return(yield dX()).renderString(e,A)})}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var CD=new MA("VideoService");var ID=class i{createMessagePartFromFile(e){return Ie(this,null,function*(){return{inlineData:{displayName:e.name,data:yield this.readFileAsBytes(e),mimeType:e.type}}})}readFileAsBytes(e){return new Promise((A,t)=>{let n=new FileReader;n.onload=o=>{let a=o.target.result.split(",")[1];A(a)},n.onerror=t,n.readAsDataURL(e)})}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var dD=class i extends Kf{sanitizer=w(SC);windowOpen(e,A,t,n){return e.open(A,t,n)}createObjectUrl(e){return URL.createObjectURL(e)}openBlobUrl(e){let A=this.createObjectUrl(e);return this.windowOpen(window,A,"_blank")}setAnchorHref(e,A){e.href=A}bypassSecurityTrustHtml(e){return this.sanitizer.bypassSecurityTrustHtml(e)}bypassSecurityTrustUrl(e){return this.sanitizer.bypassSecurityTrustUrl(e)}static \u0275fac=(()=>{let e;return function(t){return(e||(e=Mi(i)))(t||i)}})();static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var BD=class i{constructor(e){this.http=e}apiServerDomain=fr.getApiServerBaseUrl();createSession(e,A,t){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`,o={};return t?o.state=t:o.state={},this.http.post(n,t?o:null)}return new bi}updateSession(e,A,t,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${t}`;return this.http.patch(o,n)}listSessions(e,A){if(this.apiServerDomain!=null){let t=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.get(t).pipe(ye(n=>({items:n,nextPageToken:""})))}return ie({items:[],nextPageToken:""})}deleteSession(e,A,t){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${t}`;return this.http.delete(n)}getSession(e,A,t){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${t}`;return this.http.get(n)}importSession(e,A,t,n){if(this.apiServerDomain!=null){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`,a={events:t};return n&&(a.state=n),this.http.post(o,a)}return new bi}canEdit(e,A){return ie(!0)}static \u0275fac=function(A){return new(A||i)(Ko(hr))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var ED=class i{audioRecordingService=w(Zd);videoService=w(CD);webSocketService=w($d);audioIntervalId=void 0;videoIntervalId=void 0;constructor(){}getWsUrl(e,A,t,n){let a=`${window.location.protocol==="https:"?"wss":"ws"}://${fr.getWSServerUrl()}/run_live?app_name=${e}&user_id=${A}&session_id=${t}`;return n&&(n.proactiveAudio&&(a+="&proactive_audio=true"),n.enableAffectiveDialog&&(a+="&enable_affective_dialog=true"),n.enableSessionResumption&&(a+="&enable_session_resumption=true"),n.saveLiveBlob&&(a+="&save_live_blob=true")),a}startAudioChat(o){return Ie(this,arguments,function*({appName:e,userId:A,sessionId:t,flags:n}){this.webSocketService.connect(this.getWsUrl(e,A,t,n)),yield this.startAudioStreaming()})}stopAudioChat(){this.stopAudioStreaming(),this.webSocketService.closeConnection()}startAudioStreaming(){return Ie(this,null,function*(){try{yield this.audioRecordingService.startRecording(),this.audioIntervalId=window.setInterval(()=>this.sendBufferedAudio(),250)}catch(e){console.error("Error accessing microphone:",e)}})}stopAudioStreaming(){clearInterval(this.audioIntervalId),this.audioIntervalId=void 0,this.audioRecordingService.stopRecording()}sendBufferedAudio(){let e=this.audioRecordingService.getCombinedAudioBuffer();if(!e)return;let A={blob:{mime_type:"audio/pcm",data:e}};this.webSocketService.sendMessage(A),this.audioRecordingService.cleanAudioBuffer()}startVideoChat(a){return Ie(this,arguments,function*({appName:e,userId:A,sessionId:t,videoContainer:n,flags:o}){this.webSocketService.connect(this.getWsUrl(e,A,t,o)),yield this.startAudioStreaming(),yield this.startVideoStreaming(n)})}stopVideoChat(e){this.stopAudioStreaming(),this.stopVideoStreaming(e),this.webSocketService.closeConnection()}startVideoStreaming(e){return Ie(this,null,function*(){try{yield this.videoService.startRecording(e),this.videoIntervalId=window.setInterval(()=>Ie(this,null,function*(){return yield this.sendCapturedFrame()}),1e3)}catch(A){console.error("Error accessing camera:",A)}})}sendCapturedFrame(){return Ie(this,null,function*(){let e=yield this.videoService.getCapturedFrame();if(!e)return;let A={blob:{mime_type:"image/jpeg",data:e}};this.webSocketService.sendMessage(A)})}stopVideoStreaming(e){clearInterval(this.videoIntervalId),this.videoIntervalId=void 0,this.videoService.stopRecording(e)}onStreamClose(){return this.webSocketService.onCloseReason()}closeStream(){this.webSocketService.closeConnection()}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var hD=class i{stc(e,A){let t=this.hashCode(e),n=Math.abs(t%360),o=60+Math.abs((t>>8)%40),a;return A==="dark"?a=15+Math.abs((t>>16)%30):a=40+Math.abs((t>>16)%30),this.hslToHex(n,o,a)}hashCode(e){let A=0;for(let t=0,n=e.length;t{let r=(a+e/30)%12,s=t-n*Math.max(Math.min(r-3,9-r,1),-1);return Math.round(255*s).toString(16).padStart(2,"0")};return`#${o(0)}${o(8)}${o(4)}ff`}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var QD=class i{THEME_STORAGE_KEY="adk-theme-preference";currentTheme=mA(this.getInitialTheme());constructor(){_n(()=>{this.applyTheme(this.currentTheme())})}getInitialTheme(){let e=window.localStorage.getItem(this.THEME_STORAGE_KEY);return e==="light"||e==="dark"?e:"dark"}applyTheme(e){let A=document.documentElement;A.classList.remove("light-theme","dark-theme"),A.classList.add(`${e}-theme`),A.style.colorScheme=e,window.localStorage.setItem(this.THEME_STORAGE_KEY,e),this.updatePrismTheme(e)}updatePrismTheme(e){let A="prism-theme-style",t=document.getElementById(A);t||(t=document.createElement("link"),t.id=A,t.rel="stylesheet",document.head.appendChild(t)),t.href=e==="light"?"prism-light.css":"prism-dark.css"}toggleTheme(){this.currentTheme.update(e=>e==="light"?"dark":"light")}setTheme(e){this.currentTheme.set(e)}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var uD=class i{selectedTraceRowSource=new ti(void 0);selectedTraceRow$=this.selectedTraceRowSource.asObservable();eventDataSource=new ti(void 0);eventData$=this.eventDataSource.asObservable();messagesSource=new ti([]);messages$=this.messagesSource.asObservable();selectedRow(e){this.selectedTraceRowSource.next(e)}setEventData(e){this.eventDataSource.next(e)}setMessages(e){this.messagesSource.next(e)}resetTraceService(){this.selectedTraceRowSource.next(void 0),this.eventDataSource.next(void 0),this.messagesSource.next([])}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var pD=class i{_isSessionLoading=new ti(!1);_isSessionListLoading=new ti(!1);_isEventRequestResponseLoading=new ti(!1);_isMessagesLoading=new ti(!1);_newMessagesLoadedResponse=new te;_newMessagesLoadingFailedResponse=new te;featureFlagService=w(mr);isSessionLoading(){return this._isSessionLoading.pipe(ph(this.featureFlagService.isLoadingAnimationsEnabled()),ye(([e,A])=>e&&A),Ss({bufferSize:1,refCount:!0}))}setIsSessionLoading(e){this._isSessionLoading.next(e)}isSessionListLoading(){return this._isSessionListLoading.pipe(ph(this.featureFlagService.isLoadingAnimationsEnabled()),ye(([e,A])=>e&&A),Ss({bufferSize:1,refCount:!0}))}setIsSessionListLoading(e){this._isSessionListLoading.next(e)}isEventRequestResponseLoading(){return this._isEventRequestResponseLoading.pipe(ph(this.featureFlagService.isLoadingAnimationsEnabled()),ye(([e,A])=>e&&A),Ss({bufferSize:1,refCount:!0}))}setIsEventRequestResponseLoading(e){this._isEventRequestResponseLoading.next(e)}setIsMessagesLoading(e){this._isMessagesLoading.next(e)}isMessagesLoading(){return this._isMessagesLoading.pipe(ph(this.featureFlagService.isLoadingAnimationsEnabled()),ye(([e,A])=>e&&A),Ss({bufferSize:1,refCount:!0}))}lazyLoadMessages(e,A,t){throw new Error("Not implemented")}onNewMessagesLoaded(){return this._newMessagesLoadedResponse}onNewMessagesLoadingFailed(){return this._newMessagesLoadingFailedResponse}static \u0275fac=function(A){return new(A||i)};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var fD=class i{mediaRecorder;stream;renderer;videoElement;videoBuffer=[];constructor(e){this.renderer=e.createRenderer(null,null)}createVideoElement(e){e?.nativeElement&&(this.clearVideoElement(e),this.videoElement=this.renderer.createElement("video"),this.renderer.setAttribute(this.videoElement,"width","400"),this.renderer.setAttribute(this.videoElement,"height","300"),this.renderer.setAttribute(this.videoElement,"autoplay","true"),this.renderer.setAttribute(this.videoElement,"muted","true"),this.renderer.appendChild(e.nativeElement,this.videoElement))}startRecording(e){return Ie(this,null,function*(){this.createVideoElement(e);try{this.stream=yield navigator.mediaDevices.getUserMedia({video:!0}),this.videoElement&&(this.videoElement.srcObject=this.stream),this.mediaRecorder=new MediaRecorder(this.stream,{mimeType:"video/webm"}),this.mediaRecorder.start(1e3)}catch(A){console.error("Error accessing camera/microphone:",A)}})}getCapturedFrame(){return Ie(this,null,function*(){try{let e=yield this.captureFrame();return this.blobToUint8Array(e)}catch(e){console.error("Error capturing frame:",e);return}})}blobToUint8Array(e){return Ie(this,null,function*(){let A=yield e.arrayBuffer();return new Uint8Array(A)})}captureFrame(){return Ie(this,null,function*(){return new Promise((e,A)=>{try{if(!this.videoElement){A(new Error("Video element not available"));return}let t=document.createElement("canvas");t.width=this.videoElement.videoWidth,t.height=this.videoElement.videoHeight;let n=t.getContext("2d");if(!n){A(new Error("Canvas context not supported"));return}n.drawImage(this.videoElement,0,0,t.width,t.height),t.toBlob(o=>{o?e(o):A(new Error("Failed to create image blob"))},"image/png")}catch(t){A(t)}})})}stopRecording(e){this.mediaRecorder&&this.mediaRecorder.stop(),this.stream&&this.stream.getTracks().forEach(A=>A.stop()),this.clearVideoElement(e)}clearVideoElement(e){let A=e.nativeElement.querySelector("video");A&&this.renderer.removeChild(e.nativeElement,A)}static \u0275fac=function(A){return new(A||i)(Ko(Rr))};static \u0275prov=jA({token:i,factory:i.\u0275fac,providedIn:"root"})};var EMA={url:"",deserializer:i=>JSON.parse(i.data),serializer:i=>JSON.stringify(i)},hMA="WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }",o3=class i extends Hx{constructor(e,A){if(super(),this._socket=null,e instanceof bi)this.destination=A,this.source=e;else{let t=this._config=Object.assign({},EMA);if(this._output=new te,typeof e=="string")t.url=e;else for(let n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);if(!t.WebSocketCtor&&WebSocket)t.WebSocketCtor=WebSocket;else if(!t.WebSocketCtor)throw new Error("no WebSocket constructor can be found");this.destination=new Qg}}lift(e){let A=new i(this._config,this.destination);return A.operator=e,A.source=this,A}_resetState(){this._socket=null,this.source||(this.destination=new Qg),this._output=new te}multiplex(e,A,t){let n=this;return new bi(o=>{try{n.next(e())}catch(r){o.error(r)}let a=n.subscribe({next:r=>{try{t(r)&&o.next(r)}catch(s){o.error(s)}},error:r=>o.error(r),complete:()=>o.complete()});return()=>{try{n.next(A())}catch(r){o.error(r)}a.unsubscribe()}})}_connectSocket(){let{WebSocketCtor:e,protocol:A,url:t,binaryType:n}=this._config,o=this._output,a=null;try{a=A?new e(t,A):new e(t),this._socket=a,n&&(this._socket.binaryType=n)}catch(s){o.error(s);return}let r=new Mo(()=>{this._socket=null,a&&a.readyState===1&&a.close()});a.onopen=s=>{let{_socket:l}=this;if(!l){a.close(),this._resetState();return}let{openObserver:g}=this._config;g&&g.next(s);let C=this.destination;this.destination=Jx.create(I=>{if(a.readyState===1)try{let{serializer:B}=this._config;a.send(B(I))}catch(B){this.destination.error(B)}},I=>{let{closingObserver:B}=this._config;B&&B.next(void 0),I&&I.code?a.close(I.code,I.reason):o.error(new TypeError(hMA)),this._resetState()},()=>{let{closingObserver:I}=this._config;I&&I.next(void 0),a.close(),this._resetState()}),C&&C instanceof Qg&&r.add(C.subscribe(this.destination))},a.onerror=s=>{this._resetState(),o.error(s)},a.onclose=s=>{a===this._socket&&this._resetState();let{closeObserver:l}=this._config;l&&l.next(s),s.wasClean?o.complete():o.error(s)},a.onmessage=s=>{try{let{deserializer:l}=this._config;o.next(l(s))}catch(l){o.error(l)}}}_subscribe(e){let{source:A}=this;return A?A.subscribe(e):(this._socket||this._connectSocket(),this._output.subscribe(e),e.add(()=>{let{_socket:t}=this;this._output.observers.length===0&&(t&&(t.readyState===1||t.readyState===0)&&t.close(),this._resetState())}),e)}unsubscribe(){let{_socket:e}=this;e&&(e.readyState===1||e.readyState===0)&&e.close(),this._resetState(),super.unsubscribe()}};var mD=class i{audioPlayingService=w(Xd);socket$;messages$=new ti("");audioBuffer=[];audioIntervalId=null;closeReasonSubject=new te;connect(e){this.socket$=new o3({url:e,serializer:A=>JSON.stringify(A),deserializer:A=>A.data,closeObserver:{next:A=>{this.emitWsCloseReason(A.reason)}}}),this.socket$.subscribe(A=>{this.handleIncomingEvent(A)},A=>{console.error("WebSocket error:",A)}),this.audioIntervalId=setInterval(()=>this.playIncomingAudio(),250)}playIncomingAudio(){this.audioPlayingService.playAudio(this.audioBuffer),this.audioBuffer=[]}sendMessage(e){if(e.blob.data=this.arrayBufferToBase64(e.blob.data.buffer),!this.socket$||this.socket$.closed){console.error("WebSocket is not open.");return}this.socket$.next(e)}closeConnection(){clearInterval(this.audioIntervalId),this.audioIntervalId=null,this.socket$&&this.socket$.complete()}getMessages(){return this.messages$.asObservable()}arrayBufferToBase64(e){let A="",t=new Uint8Array(e),n=t.byteLength;for(let o=0;oi.json()).then(i=>{window.runtimeConfig=i,fR(gh,{providers:[Zx(mR,cn,wR,W5,Gs,Ta,Wi),{provide:Os,useClass:BD},{provide:Ys,useClass:HE},{provide:Q5,useClass:lD},{provide:$d,useClass:mD},{provide:Tf,useValue:"./assets/audio-processor.js"},{provide:Zd,useClass:tD},{provide:Xd,useClass:eD},{provide:CD,useClass:fD},{provide:Uf,useClass:ED},{provide:Lf,useClass:rD},{provide:Jc,useClass:nD},{provide:qd,useClass:AD},{provide:Vd,useClass:iD},{provide:Pl,useClass:uD},{provide:mr,useClass:sD},{provide:Wd,useClass:cD},{provide:PC,useClass:hD},{provide:as,useClass:dD},{provide:Gf,useClass:ID},{provide:yR,useValue:MR},{provide:bR,useValue:eX},{provide:P2,useValue:Z2},...i.logo?[{provide:AB,useValue:X5}]:[],{provide:Tc,useClass:$5},{provide:J5,useValue:Bc},NL(),aQ(),{provide:Jf,useClass:Dc},{provide:ql,useClass:pD},{provide:jl,useClass:QD}]}).catch(e=>console.error(e))}); diff --git a/src/google/adk/cli/browser/main-TCIQIOZ3.js b/src/google/adk/cli/browser/main-TCIQIOZ3.js deleted file mode 100644 index a6d773b6a4..0000000000 --- a/src/google/adk/cli/browser/main-TCIQIOZ3.js +++ /dev/null @@ -1,4155 +0,0 @@ -import{$ as RQ,$a as SA,$b as lA,$c as nL,A as Fc,Aa as Ao,Ab as hA,Ac as ZF,B as qC,Ba as Yt,Bb as wn,Bc as ui,C as Lc,Ca as bi,Cb as Gn,Cc as me,D as Y3,Da as ce,Db as Kn,Dc as So,E as Ki,Ea as xg,Eb as Dl,Ec as XF,F as _F,Fa as P3,Fb as yl,Fc as J0,G as gt,Ga as j3,Gb as sn,Gc as wt,H as RF,Ha as qI,Hb as QA,Hc as ZI,I as jI,Ia as TF,Ib as ha,Ic as Be,J as Po,Ja as JF,Jb as U,Jc as Cn,K as xQ,Ka as _g,Kb as qd,Kc as $F,L as Ls,La as Gc,Lb as p,Lc as tp,M as uo,Ma as Go,Mb as Rt,Mc as AL,N as _Q,Na as ZC,Nb as Ve,Nc as Ts,O as kg,Oa as Pd,Ob as jo,Oc as Ab,P as H3,Pa as u,Pb as Jt,Pc as eL,Q as $n,Qa as q3,Qb as ae,Qc as eb,R as Vv,Ra as Hn,Rb as re,Rc as tL,S as VC,Sa as ao,Sb as ep,Sc as Uc,T as WC,Ta as Kr,Tb as ns,Tc as iL,U as Gs,Ua as Pi,Ub as ur,Uc as zl,V as wl,Va as ct,Vb as Qi,Vc as Tc,W as Sn,Wa as V3,Wb as ut,Wc as A2,X as hi,Xa as Mo,Xb as RA,Xc as Js,Y as Qt,Ya as Zv,Yb as zF,Yc as Vd,Z as NF,Za as OF,Zb as ro,Zc as Jc,_ as di,_a as W3,_b as y,_c as os,a as bo,aa as Mt,ab as Ze,ac as ue,ad as oL,b as bF,ba as FF,bb as VA,bc as ba,bd as ip,c as MF,ca as Ja,cb as Xv,cc as wi,cd as li,d as vi,da as qA,db as Z3,dc as Bi,dd as O0,e as SF,ea as We,eb as mt,ec as Di,ed as tb,f as ie,fa as LF,fb as Et,fc as ta,fd as aL,g as kF,ga as kA,gb as X3,gc as ga,gd as rL,h as ei,ha as Lo,hb as YF,hc as zn,hd as sL,i as Sg,ia as w,ib as VI,ic as XC,id as fr,j as jv,ja as GF,jb as $3,jc as NQ,jd as lL,k as U3,ka as Gr,kb as $v,kc as PF,kd as gL,l as Yd,la as Xa,lb as HF,lc as Bt,ld as e2,m as ar,ma as KF,mb as K0,mc as Kc,md as cL,n as kQ,na as T,nb as Ap,nc as Ks,nd as CL,o as Hd,oa as J,ob as te,oc as U0,od as IL,p as Lr,pa as Ct,pb as jd,pc as Ht,q as ne,qa as rr,qb as O,qc as si,r as T3,ra as Dt,rb as WI,rc as T0,rd as dL,s as zd,sa as ti,sb as Y,sc as $C,sd as BL,t as xF,ta as sr,tb as ws,tc as jF,u as J3,ua as UF,ub as ri,uc as qF,v as we,va as LA,vb as Ue,vc as ca,w as Qr,wa as qe,wb as Te,wc as pe,x as Nc,xa as z3,xb as H,xc as VF,y as qv,ya as Wv,yb as B,yc as WF,z as O3,za as bA,zb as Q,zc as Us}from"./chunk-EN473UE3.js";import{a as gA,b as Ye,c as vF,d as G3,f as K3,g as lt,h as Ce}from"./chunk-W7GRJBO5.js";var cO=G3(f9=>{"use strict";var gO={b:"\b",f:"\f",n:` -`,r:"\r",t:" ",'"':'"',"/":"/","\\":"\\"},q0A=97;f9.parse=function(t,e,A){var i={},n=0,o=0,a=0,r=A&&A.bigint&&typeof BigInt<"u";return{data:s("",!0),pointers:i};function s(P,Z){l();var tA;k(P,"value");var W=E();switch(W){case"t":h("rue"),tA=!0;break;case"f":h("alse"),tA=!1;break;case"n":h("ull"),tA=null;break;case'"':tA=g();break;case"[":tA=I(P);break;case"{":tA=d(P);break;default:f(),"-0123456789".indexOf(W)>=0?tA=C():x()}return k(P,"valueEnd"),l(),Z&&aNumber.MAX_SAFE_INTEGER||tA="a"&&tA<="f"?Z+=tA.charCodeAt()-q0A+10:tA>="0"&&tA<="9"?Z+=+tA:F()}return String.fromCharCode(Z)}function v(){for(var P="";t[a]>="0"&&t[a]<="9";)P+=E();if(P.length)return P;z(),x()}function k(P,Z){S(P,Z,b())}function S(P,Z,tA){i[P]=i[P]||{},i[P][Z]=tA}function b(){return{line:n,column:o,pos:a}}function x(){throw new SyntaxError("Unexpected token "+t[a]+" in JSON at position "+a)}function F(){f(),x()}function z(){if(a>=t.length)throw new SyntaxError("Unexpected end of JSON input")}};f9.stringify=function(t,e,A){if(!t8(t))return;var i=0,n,o,a=typeof A=="object"?A.space:A;switch(typeof a){case"number":var r=a>10?10:a<0?0:Math.floor(a);a=r&&S(r," "),n=r,o=r;break;case"string":a=a.slice(0,10),n=0,o=0;for(var s=0;s=0}var W0A=/"|\\/g,Z0A=/[\b]/g,X0A=/\f/g,$0A=/\n/g,ACA=/\r/g,eCA=/\t/g;function i8(t){return t=t.replace(W0A,"\\$&").replace(X0A,"\\f").replace(Z0A,"\\b").replace($0A,"\\n").replace(ACA,"\\r").replace(eCA,"\\t"),'"'+t+'"'}var tCA=/~/g,iCA=/\//g;function u9(t){return t.replace(tCA,"~0").replace(iCA,"~1")}});var Rz=G3((rBe,_z)=>{"use strict";var xz=function(t,e){var A,i,n=1,o=0,a=0,r=String.alphabet;function s(l,g,C){if(C){for(A=g;C=s(l,A),C<76&&C>65;)++A;return+l.slice(g-1,A)}return C=r&&r.indexOf(l.charAt(g)),C>-1?C+76:(C=l.charCodeAt(g)||0,C<45||C>127?C:C<46?65:C<48?C-1:C<58?C+18:C<65?C-11:C<91?C+11:C<97?C-37:C<123?C+5:C-63)}if((t+="")!=(e+="")){for(;n;)if(i=s(t,o++),n=s(e,a++),i<76&&n<76&&i>66&&n>66&&(i=s(t,o,o),n=s(e,a,o=A),a=A),i!=n)return i{"use strict";(function(t){"use strict";function e(j){return j!==null?Object.prototype.toString.call(j)==="[object Array]":!1}function A(j){return j!==null?Object.prototype.toString.call(j)==="[object Object]":!1}function i(j,$){if(j===$)return!0;var oA=Object.prototype.toString.call(j);if(oA!==Object.prototype.toString.call($))return!1;if(e(j)===!0){if(j.length!==$.length)return!1;for(var sA=0;sA",9:"Array"},k="EOF",S="UnquotedIdentifier",b="QuotedIdentifier",x="Rbracket",F="Rparen",z="Comma",P="Colon",Z="Rbrace",tA="Number",W="Current",BA="Expref",X="Pipe",iA="Or",AA="And",IA="EQ",aA="GT",rA="LT",uA="GTE",UA="LTE",$A="NE",zA="Flatten",pA="Star",PA="Filter",Je="Dot",_e="Not",YA="Lbrace",fA="Lbracket",XA="Lparen",DA="Literal",ee={".":Je,"*":pA,",":z,":":P,"{":YA,"}":Z,"]":x,"(":XA,")":F,"@":W},NA={"<":!0,">":!0,"=":!0,"!":!0},ke={" ":!0," ":!0,"\n":!0};function HA(j){return j>="a"&&j<="z"||j>="A"&&j<="Z"||j==="_"}function vA(j){return j>="0"&&j<="9"||j==="-"}function Gt(j){return j>="a"&&j<="z"||j>="A"&&j<="Z"||j>="0"&&j<="9"||j==="_"}function ft(){}ft.prototype={tokenize:function(j){var $=[];this._current=0;for(var oA,sA,TA;this._current")return j[this._current]==="="?(this._current++,{type:uA,value:">=",start:$}):{type:aA,value:">",start:$};if(oA==="="&&j[this._current]==="=")return this._current++,{type:IA,value:"==",start:$}},_consumeLiteral:function(j){this._current++;for(var $=this._current,oA=j.length,sA;j[this._current]!=="`"&&this._current=0)return!0;if(oA.indexOf(j)>=0)return!0;if(sA.indexOf(j[0])>=0)try{return JSON.parse(j),!0}catch(TA){return!1}else return!1}};var he={};he[k]=0,he[S]=0,he[b]=0,he[x]=0,he[F]=0,he[z]=0,he[Z]=0,he[tA]=0,he[W]=0,he[BA]=0,he[X]=1,he[iA]=2,he[AA]=3,he[IA]=5,he[aA]=5,he[rA]=5,he[uA]=5,he[UA]=5,he[$A]=5,he[zA]=9,he[pA]=20,he[PA]=21,he[Je]=40,he[_e]=45,he[YA]=50,he[fA]=55,he[XA]=60;function Ot(){}Ot.prototype={parse:function(j){this._loadTokens(j),this.index=0;var $=this.expression(0);if(this._lookahead(0)!==k){var oA=this._lookaheadToken(0),sA=new Error("Unexpected token type: "+oA.type+", value: "+oA.value);throw sA.name="ParserError",sA}return $},_loadTokens:function(j){var $=new ft,oA=$.tokenize(j);oA.push({type:k,value:"",start:j.length}),this.tokens=oA},expression:function(j){var $=this._lookaheadToken(0);this._advance();for(var oA=this.nud($),sA=this._lookahead(0);j=0)return this.expression(j);if($===fA)return this._match(fA),this._parseMultiselectList();if($===YA)return this._match(YA),this._parseMultiselectHash()},_parseProjectionRHS:function(j){var $;if(he[this._lookahead(0)]<10)$={type:"Identity"};else if(this._lookahead(0)===fA)$=this.expression(j);else if(this._lookahead(0)===PA)$=this.expression(j);else if(this._lookahead(0)===Je)this._match(Je),$=this._parseDotRHS(j);else{var oA=this._lookaheadToken(0),sA=new Error("Sytanx error, unexpected token: "+oA.value+"("+oA.type+")");throw sA.name="ParserError",sA}return $},_parseMultiselectList:function(){for(var j=[];this._lookahead(0)!==x;){var $=this.expression(0);if(j.push($),this._lookahead(0)===z&&(this._match(z),this._lookahead(0)===x))throw new Error("Unexpected token Rbracket")}return this._match(x),{type:"MultiSelectList",children:j}},_parseMultiselectHash:function(){for(var j=[],$=[S,b],oA,sA,TA,de;;){if(oA=this._lookaheadToken(0),$.indexOf(oA.type)<0)throw new Error("Expecting an identifier token, got: "+oA.type);if(sA=oA.value,this._advance(),this._match(P),TA=this.expression(0),de={type:"KeyValuePair",name:sA,value:TA},j.push(de),this._lookahead(0)===z)this._match(z);else if(this._lookahead(0)===Z){this._match(Z);break}}return{type:"MultiSelectHash",children:j}}};function He(j){this.runtime=j}He.prototype={search:function(j,$){return this.visit(j,$)},visit:function(j,$){var oA,sA,TA,de,Qe,GA,OA,ht,tt,ze;switch(j.type){case"Field":return $!==null&&A($)?(GA=$[j.name],GA===void 0?null:GA):null;case"Subexpression":for(TA=this.visit(j.children[0],$),ze=1;ze0)for(ze=hn;zeKe;ze+=nn)TA.push($[ze]);return TA;case"Projection":var Si=this.visit(j.children[0],$);if(!e(Si))return null;for(tt=[],ze=0;zeQe;break;case uA:TA=de>=Qe;break;case rA:TA=de=j&&($=oA<0?j-1:j),$}};function je(j){this._interpreter=j,this.functionTable={abs:{_func:this._functionAbs,_signature:[{types:[s]}]},avg:{_func:this._functionAvg,_signature:[{types:[f]}]},ceil:{_func:this._functionCeil,_signature:[{types:[s]}]},contains:{_func:this._functionContains,_signature:[{types:[g,C]},{types:[l]}]},ends_with:{_func:this._functionEndsWith,_signature:[{types:[g]},{types:[g]}]},floor:{_func:this._functionFloor,_signature:[{types:[s]}]},length:{_func:this._functionLength,_signature:[{types:[g,C,I]}]},map:{_func:this._functionMap,_signature:[{types:[h]},{types:[C]}]},max:{_func:this._functionMax,_signature:[{types:[f,m]}]},merge:{_func:this._functionMerge,_signature:[{types:[I],variadic:!0}]},max_by:{_func:this._functionMaxBy,_signature:[{types:[C]},{types:[h]}]},sum:{_func:this._functionSum,_signature:[{types:[f]}]},starts_with:{_func:this._functionStartsWith,_signature:[{types:[g]},{types:[g]}]},min:{_func:this._functionMin,_signature:[{types:[f,m]}]},min_by:{_func:this._functionMinBy,_signature:[{types:[C]},{types:[h]}]},type:{_func:this._functionType,_signature:[{types:[l]}]},keys:{_func:this._functionKeys,_signature:[{types:[I]}]},values:{_func:this._functionValues,_signature:[{types:[I]}]},sort:{_func:this._functionSort,_signature:[{types:[m,f]}]},sort_by:{_func:this._functionSortBy,_signature:[{types:[C]},{types:[h]}]},join:{_func:this._functionJoin,_signature:[{types:[g]},{types:[m]}]},reverse:{_func:this._functionReverse,_signature:[{types:[g,C]}]},to_array:{_func:this._functionToArray,_signature:[{types:[l]}]},to_string:{_func:this._functionToString,_signature:[{types:[l]}]},to_number:{_func:this._functionToNumber,_signature:[{types:[l]}]},not_null:{_func:this._functionNotNull,_signature:[{types:[l],variadic:!0}]}}}je.prototype={callFunction:function(j,$){var oA=this.functionTable[j];if(oA===void 0)throw new Error("Unknown function: "+j+"()");return this._validateArgs(j,$,oA._signature),oA._func.call(this,$)},_validateArgs:function(j,$,oA){var sA;if(oA[oA.length-1].variadic){if($.length=0;TA--)sA+=oA[TA];return sA}else{var de=j[0].slice(0);return de.reverse(),de}},_functionAbs:function(j){return Math.abs(j[0])},_functionCeil:function(j){return Math.ceil(j[0])},_functionAvg:function(j){for(var $=0,oA=j[0],sA=0;sA=0},_functionFloor:function(j){return Math.floor(j[0])},_functionLength:function(j){return A(j[0])?Object.keys(j[0]).length:j[0].length},_functionMap:function(j){for(var $=[],oA=this._interpreter,sA=j[0],TA=j[1],de=0;de0){var $=this._getTypeName(j[0][0]);if($===s)return Math.max.apply(Math,j[0]);for(var oA=j[0],sA=oA[0],TA=1;TA0){var $=this._getTypeName(j[0][0]);if($===s)return Math.min.apply(Math,j[0]);for(var oA=j[0],sA=oA[0],TA=1;TAOe?1:zeTA&&(TA=Qe,de=oA[GA]);return de},_functionMinBy:function(j){for(var $=j[1],oA=j[0],sA=this.createKeyFunction($,[s,g]),TA=1/0,de,Qe,GA=0;GA"u"?H8.jmespath={}:H8)});var ktA=G3((Xwe,Yy)=>{"use strict";var hSA=typeof window<"u"?window:typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope?self:{};var kt=(function(t){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,A=0,i={},n={manual:t.Prism&&t.Prism.manual,disableWorkerMessageHandler:t.Prism&&t.Prism.disableWorkerMessageHandler,util:{encode:function E(f){return f instanceof o?new o(f.type,E(f.content),f.alias):Array.isArray(f)?f.map(E):f.replace(/&/g,"&").replace(/"u")return null;if(document.currentScript&&document.currentScript.tagName==="SCRIPT")return document.currentScript;try{throw new Error}catch(v){var E=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(v.stack)||[])[1];if(E){var f=document.getElementsByTagName("script");for(var m in f)if(f[m].src==E)return f[m]}return null}},isActive:function(E,f,m){for(var v="no-"+f;E;){var k=E.classList;if(k.contains(f))return!0;if(k.contains(v))return!1;E=E.parentElement}return!!m}},languages:{plain:i,plaintext:i,text:i,txt:i,extend:function(E,f){var m=n.util.clone(n.languages[E]);for(var v in f)m[v]=f[v];return m},insertBefore:function(E,f,m,v){v=v||n.languages;var k=v[E],S={};for(var b in k)if(k.hasOwnProperty(b)){if(b==f)for(var x in m)m.hasOwnProperty(x)&&(S[x]=m[x]);m.hasOwnProperty(b)||(S[b]=k[b])}var F=v[E];return v[E]=S,n.languages.DFS(n.languages,function(z,P){P===F&&z!=E&&(this[z]=S)}),S},DFS:function E(f,m,v,k){k=k||{};var S=n.util.objId;for(var b in f)if(f.hasOwnProperty(b)){m.call(f,b,f[b],v||b);var x=f[b],F=n.util.type(x);F==="Object"&&!k[S(x)]?(k[S(x)]=!0,E(x,m,null,k)):F==="Array"&&!k[S(x)]&&(k[S(x)]=!0,E(x,m,b,k))}}},plugins:{},highlightAll:function(E,f){n.highlightAllUnder(document,E,f)},highlightAllUnder:function(E,f,m){var v={callback:m,container:E,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};n.hooks.run("before-highlightall",v),v.elements=Array.prototype.slice.apply(v.container.querySelectorAll(v.selector)),n.hooks.run("before-all-elements-highlight",v);for(var k=0,S;S=v.elements[k++];)n.highlightElement(S,f===!0,v.callback)},highlightElement:function(E,f,m){var v=n.util.getLanguage(E),k=n.languages[v];n.util.setLanguage(E,v);var S=E.parentElement;S&&S.nodeName.toLowerCase()==="pre"&&n.util.setLanguage(S,v);var b=E.textContent,x={element:E,language:v,grammar:k,code:b};function F(P){x.highlightedCode=P,n.hooks.run("before-insert",x),x.element.innerHTML=x.highlightedCode,n.hooks.run("after-highlight",x),n.hooks.run("complete",x),m&&m.call(x.element)}if(n.hooks.run("before-sanity-check",x),S=x.element.parentElement,S&&S.nodeName.toLowerCase()==="pre"&&!S.hasAttribute("tabindex")&&S.setAttribute("tabindex","0"),!x.code){n.hooks.run("complete",x),m&&m.call(x.element);return}if(n.hooks.run("before-highlight",x),!x.grammar){F(n.util.encode(x.code));return}if(f&&t.Worker){var z=new Worker(n.filename);z.onmessage=function(P){F(P.data)},z.postMessage(JSON.stringify({language:x.language,code:x.code,immediateClose:!0}))}else F(n.highlight(x.code,x.grammar,x.language))},highlight:function(E,f,m){var v={code:E,grammar:f,language:m};if(n.hooks.run("before-tokenize",v),!v.grammar)throw new Error('The language "'+v.language+'" has no grammar.');return v.tokens=n.tokenize(v.code,v.grammar),n.hooks.run("after-tokenize",v),o.stringify(n.util.encode(v.tokens),v.language)},tokenize:function(E,f){var m=f.rest;if(m){for(var v in m)f[v]=m[v];delete f.rest}var k=new s;return l(k,k.head,E),r(E,k,f,k.head,0),C(k)},hooks:{all:{},add:function(E,f){var m=n.hooks.all;m[E]=m[E]||[],m[E].push(f)},run:function(E,f){var m=n.hooks.all[E];if(!(!m||!m.length))for(var v=0,k;k=m[v++];)k(f)}},Token:o};t.Prism=n;function o(E,f,m,v){this.type=E,this.content=f,this.alias=m,this.length=(v||"").length|0}o.stringify=function E(f,m){if(typeof f=="string")return f;if(Array.isArray(f)){var v="";return f.forEach(function(F){v+=E(F,m)}),v}var k={type:f.type,content:E(f.content,m),tag:"span",classes:["token",f.type],attributes:{},language:m},S=f.alias;S&&(Array.isArray(S)?Array.prototype.push.apply(k.classes,S):k.classes.push(S)),n.hooks.run("wrap",k);var b="";for(var x in k.attributes)b+=" "+x+'="'+(k.attributes[x]||"").replace(/"/g,""")+'"';return"<"+k.tag+' class="'+k.classes.join(" ")+'"'+b+">"+k.content+""};function a(E,f,m,v){E.lastIndex=f;var k=E.exec(m);if(k&&v&&k[1]){var S=k[1].length;k.index+=S,k[0]=k[0].slice(S)}return k}function r(E,f,m,v,k,S){for(var b in m)if(!(!m.hasOwnProperty(b)||!m[b])){var x=m[b];x=Array.isArray(x)?x:[x];for(var F=0;F=S.reach);AA+=iA.value.length,iA=iA.next){var IA=iA.value;if(f.length>E.length)return;if(!(IA instanceof o)){var aA=1,rA;if(tA){if(rA=a(X,AA,E,Z),!rA||rA.index>=E.length)break;var zA=rA.index,uA=rA.index+rA[0].length,UA=AA;for(UA+=iA.value.length;zA>=UA;)iA=iA.next,UA+=iA.value.length;if(UA-=iA.value.length,AA=UA,iA.value instanceof o)continue;for(var $A=iA;$A!==f.tail&&(UAS.reach&&(S.reach=_e);var YA=iA.prev;PA&&(YA=l(f,YA,PA),AA+=PA.length),g(f,YA,aA);var fA=new o(b,P?n.tokenize(pA,P):pA,W,pA);if(iA=l(f,YA,fA),Je&&l(f,iA,Je),aA>1){var XA={cause:b+","+F,reach:_e};r(E,f,m,iA.prev,AA,XA),S&&XA.reach>S.reach&&(S.reach=XA.reach)}}}}}}function s(){var E={value:null,prev:null,next:null},f={value:null,prev:E,next:null};E.next=f,this.head=E,this.tail=f,this.length=0}function l(E,f,m){var v=f.next,k={value:m,prev:f,next:v};return f.next=k,v.prev=k,E.length++,k}function g(E,f,m){for(var v=f.next,k=0;k/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]};kt.languages.markup.tag.inside["attr-value"].inside.entity=kt.languages.markup.entity;kt.languages.markup.doctype.inside["internal-subset"].inside=kt.languages.markup;kt.hooks.add("wrap",function(t){t.type==="entity"&&(t.attributes.title=t.content.replace(/&/,"&"))});Object.defineProperty(kt.languages.markup.tag,"addInlined",{value:function(e,A){var i={};i["language-"+A]={pattern:/(^$)/i,lookbehind:!0,inside:kt.languages[A]},i.cdata=/^$/i;var n={"included-cdata":{pattern://i,inside:i}};n["language-"+A]={pattern:/[\s\S]+/,inside:kt.languages[A]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:n},kt.languages.insertBefore("markup","cdata",o)}});Object.defineProperty(kt.languages.markup.tag,"addAttribute",{value:function(t,e){kt.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+t+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:kt.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}});kt.languages.html=kt.languages.markup;kt.languages.mathml=kt.languages.markup;kt.languages.svg=kt.languages.markup;kt.languages.xml=kt.languages.extend("markup",{});kt.languages.ssml=kt.languages.xml;kt.languages.atom=kt.languages.xml;kt.languages.rss=kt.languages.xml;(function(t){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;t.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},t.languages.css.atrule.inside.rest=t.languages.css;var A=t.languages.markup;A&&(A.tag.addInlined("style","css"),A.tag.addAttribute("style","css"))})(kt);kt.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};kt.languages.javascript=kt.languages.extend("clike",{"class-name":[kt.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});kt.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;kt.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:kt.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:kt.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:kt.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:kt.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:kt.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});kt.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:kt.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});kt.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});kt.languages.markup&&(kt.languages.markup.tag.addInlined("script","javascript"),kt.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));kt.languages.js=kt.languages.javascript;(function(){if(typeof kt>"u"||typeof document>"u")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var t="Loading\u2026",e=function(I,d){return"\u2716 Error "+I+" while fetching file: "+d},A="\u2716 Error: File does not exist or is empty",i={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},n="data-src-status",o="loading",a="loaded",r="failed",s="pre[data-src]:not(["+n+'="'+a+'"]):not(['+n+'="'+o+'"])';function l(I,d,h){var E=new XMLHttpRequest;E.open("GET",I,!0),E.onreadystatechange=function(){E.readyState==4&&(E.status<400&&E.responseText?d(E.responseText):E.status>=400?h(e(E.status,E.statusText)):h(A))},E.send(null)}function g(I){var d=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(I||"");if(d){var h=Number(d[1]),E=d[2],f=d[3];return E?f?[h,Number(f)]:[h,void 0]:[h,h]}}kt.hooks.add("before-highlightall",function(I){I.selector+=", "+s}),kt.hooks.add("before-sanity-check",function(I){var d=I.element;if(d.matches(s)){I.code="",d.setAttribute(n,o);var h=d.appendChild(document.createElement("CODE"));h.textContent=t;var E=d.getAttribute("data-src"),f=I.language;if(f==="none"){var m=(/\.(\w+)$/.exec(E)||[,"none"])[1];f=i[m]||m}kt.util.setLanguage(h,f),kt.util.setLanguage(d,f);var v=kt.plugins.autoloader;v&&v.loadLanguages(f),l(E,function(k){d.setAttribute(n,a);var S=g(d.getAttribute("data-range"));if(S){var b=k.split(/\r\n?|\n/g),x=S[0],F=S[1]==null?b.length:S[1];x<0&&(x+=b.length),x=Math.max(0,Math.min(x-1,b.length)),F<0&&(F+=b.length),F=Math.max(0,Math.min(F,b.length)),k=b.slice(x,F).join(` -`),d.hasAttribute("data-start")||d.setAttribute("data-start",String(x+1))}h.textContent=k,kt.highlightElement(h)},function(k){d.setAttribute(n,r),h.textContent=k})}}),kt.plugins.fileHighlight={highlight:function(d){for(var h=(d||document).querySelectorAll(s),E=0,f;f=h[E++];)kt.highlightElement(f)}};var C=!1;kt.fileHighlight=function(){C||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),C=!0),kt.plugins.fileHighlight.highlight.apply(this,arguments)}})()});var wL=(()=>{class t{_renderer;_elementRef;onChange=A=>{};onTouched=()=>{};constructor(A,i){this._renderer=A,this._elementRef=i}setProperty(A,i){this._renderer.setProperty(this._elementRef.nativeElement,A,i)}registerOnTouched(A){this.onTouched=A}registerOnChange(A){this.onChange=A}setDisabledState(A){this.setProperty("disabled",A)}static \u0275fac=function(i){return new(i||t)(ct(Pi),ct(ce))};static \u0275dir=VA({type:t})}return t})(),ab=(()=>{class t extends wL{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,features:[mt]})}return t})(),as=new kA(""),LiA={provide:as,useExisting:Ja(()=>rb),multi:!0},rb=(()=>{class t extends ab{writeValue(A){this.setProperty("checked",A)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["input","type","checkbox","formControlName",""],["input","type","checkbox","formControl",""],["input","type","checkbox","ngModel",""]],hostBindings:function(i,n){i&1&&U("change",function(a){return n.onChange(a.target.checked)})("blur",function(){return n.onTouched()})},standalone:!1,features:[Bt([LiA]),mt]})}return t})(),GiA={provide:as,useExisting:Ja(()=>Dn),multi:!0};function KiA(){let t=Ab()?Ab().getUserAgent():"";return/android (\d+)/.test(t.toLowerCase())}var UiA=new kA(""),Dn=(()=>{class t extends wL{_compositionMode;_composing=!1;constructor(A,i,n){super(A,i),this._compositionMode=n,this._compositionMode==null&&(this._compositionMode=!KiA())}writeValue(A){let i=A??"";this.setProperty("value",i)}_handleInput(A){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(A)}_compositionStart(){this._composing=!0}_compositionEnd(A){this._composing=!1,this._compositionMode&&this.onChange(A)}static \u0275fac=function(i){return new(i||t)(ct(Pi),ct(ce),ct(UiA,8))};static \u0275dir=VA({type:t,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(i,n){i&1&&U("input",function(a){return n._handleInput(a.target.value)})("blur",function(){return n.onTouched()})("compositionstart",function(){return n._compositionStart()})("compositionend",function(a){return n._compositionEnd(a.target.value)})},standalone:!1,features:[Bt([GiA]),mt]})}return t})();function sb(t){return t==null||lb(t)===0}function lb(t){return t==null?null:Array.isArray(t)||typeof t=="string"?t.length:t instanceof Set?t.size:null}var Oc=new kA(""),OQ=new kA(""),TiA=/^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,Ys=class{static min(e){return DL(e)}static max(e){return JiA(e)}static required(e){return OiA(e)}static requiredTrue(e){return YiA(e)}static email(e){return HiA(e)}static minLength(e){return ziA(e)}static maxLength(e){return PiA(e)}static pattern(e){return jiA(e)}static nullValidator(e){return op()}static compose(e){return kL(e)}static composeAsync(e){return xL(e)}};function DL(t){return e=>{if(e.value==null||t==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A{if(e.value==null||t==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A>t?{max:{max:t,actual:e.value}}:null}}function OiA(t){return sb(t.value)?{required:!0}:null}function YiA(t){return t.value===!0?null:{required:!0}}function HiA(t){return sb(t.value)||TiA.test(t.value)?null:{email:!0}}function ziA(t){return e=>{let A=e.value?.length??lb(e.value);return A===null||A===0?null:A{let A=e.value?.length??lb(e.value);return A!==null&&A>t?{maxlength:{requiredLength:t,actualLength:A}}:null}}function jiA(t){if(!t)return op;let e,A;return typeof t=="string"?(A="",t.charAt(0)!=="^"&&(A+="^"),A+=t,t.charAt(t.length-1)!=="$"&&(A+="$"),e=new RegExp(A)):(A=t.toString(),e=t),i=>{if(sb(i.value))return null;let n=i.value;return e.test(n)?null:{pattern:{requiredPattern:A,actualValue:n}}}}function op(t){return null}function yL(t){return t!=null}function vL(t){return $3(t)?Lr(t):t}function bL(t){let e={};return t.forEach(A=>{e=A!=null?gA(gA({},e),A):e}),Object.keys(e).length===0?null:e}function ML(t,e){return e.map(A=>A(t))}function qiA(t){return!t.validate}function SL(t){return t.map(e=>qiA(e)?e:A=>e.validate(A))}function kL(t){if(!t)return null;let e=t.filter(yL);return e.length==0?null:function(A){return bL(ML(A,e))}}function gb(t){return t!=null?kL(SL(t)):null}function xL(t){if(!t)return null;let e=t.filter(yL);return e.length==0?null:function(A){let i=ML(A,e).map(vL);return qC(i).pipe(we(bL))}}function cb(t){return t!=null?xL(SL(t)):null}function EL(t,e){return t===null?[e]:Array.isArray(t)?[...t,e]:[t,e]}function _L(t){return t._rawValidators}function RL(t){return t._rawAsyncValidators}function ib(t){return t?Array.isArray(t)?t:[t]:[]}function ap(t,e){return Array.isArray(t)?t.includes(e):t===e}function hL(t,e){let A=ib(e);return ib(t).forEach(n=>{ap(A,n)||A.push(n)}),A}function QL(t,e){return ib(e).filter(A=>!ap(t,A))}var rp=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(e){this._rawValidators=e||[],this._composedValidatorFn=gb(this._rawValidators)}_setAsyncValidators(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=cb(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(e){this._onDestroyCallbacks.push(e)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(e=>e()),this._onDestroyCallbacks=[]}reset(e=void 0){this.control?.reset(e)}hasError(e,A){return this.control?this.control.hasError(e,A):!1}getError(e,A){return this.control?this.control.getError(e,A):null}},Y0=class extends rp{name;get formDirective(){return null}get path(){return null}},Hs=class extends rp{_parent=null;name=null;valueAccessor=null},sp=class{_cd;constructor(e){this._cd=e}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}};var yn=(()=>{class t extends sp{constructor(A){super(A)}static \u0275fac=function(i){return new(i||t)(ct(Hs,2))};static \u0275dir=VA({type:t,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(i,n){i&2&&RA("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)},standalone:!1,features:[mt]})}return t})(),NL=(()=>{class t extends sp{constructor(A){super(A)}static \u0275fac=function(i){return new(i||t)(ct(Y0,10))};static \u0275dir=VA({type:t,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["","formArray",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(i,n){i&2&&RA("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)("ng-submitted",n.isSubmitted)},standalone:!1,features:[mt]})}return t})();var FQ="VALID",np="INVALID",Wd="PENDING",LQ="DISABLED",t2=class{},lp=class extends t2{value;source;constructor(e,A){super(),this.value=e,this.source=A}},KQ=class extends t2{pristine;source;constructor(e,A){super(),this.pristine=e,this.source=A}},UQ=class extends t2{touched;source;constructor(e,A){super(),this.touched=e,this.source=A}},Zd=class extends t2{status;source;constructor(e,A){super(),this.status=e,this.source=A}},gp=class extends t2{source;constructor(e){super(),this.source=e}},TQ=class extends t2{source;constructor(e){super(),this.source=e}};function Cb(t){return(dp(t)?t.validators:t)||null}function ViA(t){return Array.isArray(t)?gb(t):t||null}function Ib(t,e){return(dp(e)?e.asyncValidators:t)||null}function WiA(t){return Array.isArray(t)?cb(t):t||null}function dp(t){return t!=null&&!Array.isArray(t)&&typeof t=="object"}function FL(t,e,A){let i=t.controls;if(!(e?Object.keys(i):i).length)throw new Mt(1e3,"");if(!i[A])throw new Mt(1001,"")}function LL(t,e,A){t._forEachChild((i,n)=>{if(A[n]===void 0)throw new Mt(1002,"")})}var Xd=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(e,A){this._assignValidators(e),this._assignAsyncValidators(A)}get validator(){return this._composedValidatorFn}set validator(e){this._rawValidators=this._composedValidatorFn=e}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}get parent(){return this._parent}get status(){return ca(this.statusReactive)}set status(e){ca(()=>this.statusReactive.set(e))}_status=pe(()=>this.statusReactive());statusReactive=bA(void 0);get valid(){return this.status===FQ}get invalid(){return this.status===np}get pending(){return this.status==Wd}get disabled(){return this.status===LQ}get enabled(){return this.status!==LQ}errors;get pristine(){return ca(this.pristineReactive)}set pristine(e){ca(()=>this.pristineReactive.set(e))}_pristine=pe(()=>this.pristineReactive());pristineReactive=bA(!0);get dirty(){return!this.pristine}get touched(){return ca(this.touchedReactive)}set touched(e){ca(()=>this.touchedReactive.set(e))}_touched=pe(()=>this.touchedReactive());touchedReactive=bA(!1);get untouched(){return!this.touched}_events=new ie;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(e){this._assignValidators(e)}setAsyncValidators(e){this._assignAsyncValidators(e)}addValidators(e){this.setValidators(hL(e,this._rawValidators))}addAsyncValidators(e){this.setAsyncValidators(hL(e,this._rawAsyncValidators))}removeValidators(e){this.setValidators(QL(e,this._rawValidators))}removeAsyncValidators(e){this.setAsyncValidators(QL(e,this._rawAsyncValidators))}hasValidator(e){return ap(this._rawValidators,e)}hasAsyncValidator(e){return ap(this._rawAsyncValidators,e)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(e={}){let A=this.touched===!1;this.touched=!0;let i=e.sourceControl??this;e.onlySelf||this._parent?.markAsTouched(Ye(gA({},e),{sourceControl:i})),A&&e.emitEvent!==!1&&this._events.next(new UQ(!0,i))}markAllAsDirty(e={}){this.markAsDirty({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsDirty(e))}markAllAsTouched(e={}){this.markAsTouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsTouched(e))}markAsUntouched(e={}){let A=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let i=e.sourceControl??this;this._forEachChild(n=>{n.markAsUntouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:i})}),e.onlySelf||this._parent?._updateTouched(e,i),A&&e.emitEvent!==!1&&this._events.next(new UQ(!1,i))}markAsDirty(e={}){let A=this.pristine===!0;this.pristine=!1;let i=e.sourceControl??this;e.onlySelf||this._parent?.markAsDirty(Ye(gA({},e),{sourceControl:i})),A&&e.emitEvent!==!1&&this._events.next(new KQ(!1,i))}markAsPristine(e={}){let A=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let i=e.sourceControl??this;this._forEachChild(n=>{n.markAsPristine({onlySelf:!0,emitEvent:e.emitEvent})}),e.onlySelf||this._parent?._updatePristine(e,i),A&&e.emitEvent!==!1&&this._events.next(new KQ(!0,i))}markAsPending(e={}){this.status=Wd;let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new Zd(this.status,A)),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.markAsPending(Ye(gA({},e),{sourceControl:A}))}disable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=LQ,this.errors=null,this._forEachChild(n=>{n.disable(Ye(gA({},e),{onlySelf:!0}))}),this._updateValue();let i=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new lp(this.value,i)),this._events.next(new Zd(this.status,i)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Ye(gA({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(n=>n(!0))}enable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=FQ,this._forEachChild(i=>{i.enable(Ye(gA({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(Ye(gA({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(e,A){e.onlySelf||(this._parent?.updateValueAndValidity(e),e.skipPristineCheck||this._parent?._updatePristine({},A),this._parent?._updateTouched({},A))}setParent(e){this._parent=e}getRawValue(){return this.value}updateValueAndValidity(e={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let i=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===FQ||this.status===Wd)&&this._runAsyncValidator(i,e.emitEvent)}let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new lp(this.value,A)),this._events.next(new Zd(this.status,A)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.updateValueAndValidity(Ye(gA({},e),{sourceControl:A}))}_updateTreeValidity(e={emitEvent:!0}){this._forEachChild(A=>A._updateTreeValidity(e)),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?LQ:FQ}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(e,A){if(this.asyncValidator){this.status=Wd,this._hasOwnPendingAsyncValidator={emitEvent:A!==!1,shouldHaveEmitted:e!==!1};let i=vL(this.asyncValidator(this));this._asyncValidationSubscription=i.subscribe(n=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(n,{emitEvent:A,shouldHaveEmitted:e})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let e=(this._hasOwnPendingAsyncValidator?.emitEvent||this._hasOwnPendingAsyncValidator?.shouldHaveEmitted)??!1;return this._hasOwnPendingAsyncValidator=null,e}return!1}setErrors(e,A={}){this.errors=e,this._updateControlsErrors(A.emitEvent!==!1,this,A.shouldHaveEmitted)}get(e){let A=e;return A==null||(Array.isArray(A)||(A=A.split(".")),A.length===0)?null:A.reduce((i,n)=>i&&i._find(n),this)}getError(e,A){let i=A?this.get(A):this;return i?.errors?i.errors[e]:null}hasError(e,A){return!!this.getError(e,A)}get root(){let e=this;for(;e._parent;)e=e._parent;return e}_updateControlsErrors(e,A,i){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),(e||i)&&this._events.next(new Zd(this.status,A)),this._parent&&this._parent._updateControlsErrors(e,A,i)}_initObservables(){this.valueChanges=new LA,this.statusChanges=new LA}_calculateStatus(){return this._allControlsDisabled()?LQ:this.errors?np:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(Wd)?Wd:this._anyControlsHaveStatus(np)?np:FQ}_anyControlsHaveStatus(e){return this._anyControls(A=>A.status===e)}_anyControlsDirty(){return this._anyControls(e=>e.dirty)}_anyControlsTouched(){return this._anyControls(e=>e.touched)}_updatePristine(e,A){let i=!this._anyControlsDirty(),n=this.pristine!==i;this.pristine=i,e.onlySelf||this._parent?._updatePristine(e,A),n&&this._events.next(new KQ(this.pristine,A))}_updateTouched(e={},A){this.touched=this._anyControlsTouched(),this._events.next(new UQ(this.touched,A)),e.onlySelf||this._parent?._updateTouched(e,A)}_onDisabledChange=[];_registerOnCollectionChange(e){this._onCollectionChange=e}_setUpdateStrategy(e){dp(e)&&e.updateOn!=null&&(this._updateOn=e.updateOn)}_parentMarkedDirty(e){return!e&&!!this._parent?.dirty&&!this._parent._anyControlsDirty()}_find(e){return null}_assignValidators(e){this._rawValidators=Array.isArray(e)?e.slice():e,this._composedValidatorFn=ViA(this._rawValidators)}_assignAsyncValidators(e){this._rawAsyncValidators=Array.isArray(e)?e.slice():e,this._composedAsyncValidatorFn=WiA(this._rawAsyncValidators)}},$d=class extends Xd{constructor(e,A,i){super(Cb(A),Ib(i,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;registerControl(e,A){return this.controls[e]?this.controls[e]:(this.controls[e]=A,A.setParent(this),A._registerOnCollectionChange(this._onCollectionChange),A)}addControl(e,A,i={}){this.registerControl(e,A),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}removeControl(e,A={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}setControl(e,A,i={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],A&&this.registerControl(e,A),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}contains(e){return this.controls.hasOwnProperty(e)&&this.controls[e].enabled}setValue(e,A={}){LL(this,!0,e),Object.keys(e).forEach(i=>{FL(this,!0,i),this.controls[i].setValue(e[i],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(Object.keys(e).forEach(i=>{let n=this.controls[i];n&&n.patchValue(e[i],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e={},A={}){this._forEachChild((i,n)=>{i.reset(e?e[n]:null,Ye(gA({},A),{onlySelf:!0}))}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A),A?.emitEvent!==!1&&this._events.next(new TQ(this))}getRawValue(){return this._reduceChildren({},(e,A,i)=>(e[i]=A.getRawValue(),e))}_syncPendingControls(){let e=this._reduceChildren(!1,(A,i)=>i._syncPendingControls()?!0:A);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){Object.keys(this.controls).forEach(A=>{let i=this.controls[A];i&&e(i,A)})}_setUpControls(){this._forEachChild(e=>{e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(e){for(let[A,i]of Object.entries(this.controls))if(this.contains(A)&&e(i))return!0;return!1}_reduceValue(){let e={};return this._reduceChildren(e,(A,i,n)=>((i.enabled||this.disabled)&&(A[n]=i.value),A))}_reduceChildren(e,A){let i=e;return this._forEachChild((n,o)=>{i=A(i,n,o)}),i}_allControlsDisabled(){for(let e of Object.keys(this.controls))if(this.controls[e].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_find(e){return this.controls.hasOwnProperty(e)?this.controls[e]:null}};var nb=class extends $d{};var AB=new kA("",{factory:()=>Bp}),Bp="always";function GL(t,e){return[...e.path,t]}function JQ(t,e,A=Bp){db(t,e),e.valueAccessor.writeValue(t.value),(t.disabled||A==="always")&&e.valueAccessor.setDisabledState?.(t.disabled),XiA(t,e),AnA(t,e),$iA(t,e),ZiA(t,e)}function cp(t,e,A=!0){let i=()=>{};e?.valueAccessor?.registerOnChange(i),e?.valueAccessor?.registerOnTouched(i),Ip(t,e),t&&(e._invokeOnDestroyCallbacks(),t._registerOnCollectionChange(()=>{}))}function Cp(t,e){t.forEach(A=>{A.registerOnValidatorChange&&A.registerOnValidatorChange(e)})}function ZiA(t,e){if(e.valueAccessor.setDisabledState){let A=i=>{e.valueAccessor.setDisabledState(i)};t.registerOnDisabledChange(A),e._registerOnDestroy(()=>{t._unregisterOnDisabledChange(A)})}}function db(t,e){let A=_L(t);e.validator!==null?t.setValidators(EL(A,e.validator)):typeof A=="function"&&t.setValidators([A]);let i=RL(t);e.asyncValidator!==null?t.setAsyncValidators(EL(i,e.asyncValidator)):typeof i=="function"&&t.setAsyncValidators([i]);let n=()=>t.updateValueAndValidity();Cp(e._rawValidators,n),Cp(e._rawAsyncValidators,n)}function Ip(t,e){let A=!1;if(t!==null){if(e.validator!==null){let n=_L(t);if(Array.isArray(n)&&n.length>0){let o=n.filter(a=>a!==e.validator);o.length!==n.length&&(A=!0,t.setValidators(o))}}if(e.asyncValidator!==null){let n=RL(t);if(Array.isArray(n)&&n.length>0){let o=n.filter(a=>a!==e.asyncValidator);o.length!==n.length&&(A=!0,t.setAsyncValidators(o))}}}let i=()=>{};return Cp(e._rawValidators,i),Cp(e._rawAsyncValidators,i),A}function XiA(t,e){e.valueAccessor.registerOnChange(A=>{t._pendingValue=A,t._pendingChange=!0,t._pendingDirty=!0,t.updateOn==="change"&&KL(t,e)})}function $iA(t,e){e.valueAccessor.registerOnTouched(()=>{t._pendingTouched=!0,t.updateOn==="blur"&&t._pendingChange&&KL(t,e),t.updateOn!=="submit"&&t.markAsTouched()})}function KL(t,e){t._pendingDirty&&t.markAsDirty(),t.setValue(t._pendingValue,{emitModelToViewChange:!1}),e.viewToModelUpdate(t._pendingValue),t._pendingChange=!1}function AnA(t,e){let A=(i,n)=>{e.valueAccessor.writeValue(i),n&&e.viewToModelUpdate(i)};t.registerOnChange(A),e._registerOnDestroy(()=>{t._unregisterOnChange(A)})}function UL(t,e){t==null,db(t,e)}function enA(t,e){return Ip(t,e)}function Bb(t,e){if(!t.hasOwnProperty("model"))return!1;let A=t.model;return A.isFirstChange()?!0:!Object.is(e,A.currentValue)}function tnA(t){return Object.getPrototypeOf(t.constructor)===ab}function TL(t,e){t._syncPendingControls(),e.forEach(A=>{let i=A.control;i.updateOn==="submit"&&i._pendingChange&&(A.viewToModelUpdate(i._pendingValue),i._pendingChange=!1)})}function Eb(t,e){if(!e)return null;Array.isArray(e);let A,i,n;return e.forEach(o=>{o.constructor===Dn?A=o:tnA(o)?i=o:n=o}),n||i||A||null}function inA(t,e){let A=t.indexOf(e);A>-1&&t.splice(A,1)}var nnA={provide:Y0,useExisting:Ja(()=>eB)},GQ=Promise.resolve(),eB=(()=>{class t extends Y0{callSetDisabledState;get submitted(){return ca(this.submittedReactive)}_submitted=pe(()=>this.submittedReactive());submittedReactive=bA(!1);_directives=new Set;form;ngSubmit=new LA;options;constructor(A,i,n){super(),this.callSetDisabledState=n,this.form=new $d({},gb(A),cb(i))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(A){GQ.then(()=>{let i=this._findContainer(A.path);A.control=i.registerControl(A.name,A.control),JQ(A.control,A,this.callSetDisabledState),A.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(A)})}getControl(A){return this.form.get(A.path)}removeControl(A){GQ.then(()=>{this._findContainer(A.path)?.removeControl(A.name),this._directives.delete(A)})}addFormGroup(A){GQ.then(()=>{let i=this._findContainer(A.path),n=new $d({});UL(n,A),i.registerControl(A.name,n),n.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(A){GQ.then(()=>{this._findContainer(A.path)?.removeControl?.(A.name)})}getFormGroup(A){return this.form.get(A.path)}updateModel(A,i){GQ.then(()=>{this.form.get(A.path).setValue(i)})}setValue(A){this.control.setValue(A)}onSubmit(A){return this.submittedReactive.set(!0),TL(this.form,this._directives),this.ngSubmit.emit(A),this.form._events.next(new gp(this.control)),A?.target?.method==="dialog"}onReset(){this.resetForm()}resetForm(A=void 0){this.form.reset(A),this.submittedReactive.set(!1)}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.form._updateOn=this.options.updateOn)}_findContainer(A){return A.pop(),A.length?this.form.get(A):this.form}static \u0275fac=function(i){return new(i||t)(ct(Oc,10),ct(OQ,10),ct(AB,8))};static \u0275dir=VA({type:t,selectors:[["form",3,"ngNoForm","",3,"formGroup","",3,"formArray",""],["ng-form"],["","ngForm",""]],hostBindings:function(i,n){i&1&&U("submit",function(a){return n.onSubmit(a)})("reset",function(){return n.onReset()})},inputs:{options:[0,"ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[Bt([nnA]),mt]})}return t})();function uL(t,e){let A=t.indexOf(e);A>-1&&t.splice(A,1)}function fL(t){return typeof t=="object"&&t!==null&&Object.keys(t).length===2&&"value"in t&&"disabled"in t}var Os=class extends Xd{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(e=null,A,i){super(Cb(A),Ib(i,A)),this._applyFormState(e),this._setUpdateStrategy(A),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),dp(A)&&(A.nonNullable||A.initialValueIsDefault)&&(fL(e)?this.defaultValue=e.value:this.defaultValue=e)}setValue(e,A={}){this.value=this._pendingValue=e,this._onChange.length&&A.emitModelToViewChange!==!1&&this._onChange.forEach(i=>i(this.value,A.emitViewToModelChange!==!1)),this.updateValueAndValidity(A)}patchValue(e,A={}){this.setValue(e,A)}reset(e=this.defaultValue,A={}){this._applyFormState(e),this.markAsPristine(A),this.markAsUntouched(A),this.setValue(this.value,A),A.overwriteDefaultValue&&(this.defaultValue=this.value),this._pendingChange=!1,A?.emitEvent!==!1&&this._events.next(new TQ(this))}_updateValue(){}_anyControls(e){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(e){this._onChange.push(e)}_unregisterOnChange(e){uL(this._onChange,e)}registerOnDisabledChange(e){this._onDisabledChange.push(e)}_unregisterOnDisabledChange(e){uL(this._onDisabledChange,e)}_forEachChild(e){}_syncPendingControls(){return this.updateOn==="submit"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(e){fL(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}};var onA=t=>t instanceof Os;var anA={provide:Hs,useExisting:Ja(()=>ko)},pL=Promise.resolve(),ko=(()=>{class t extends Hs{_changeDetectorRef;callSetDisabledState;control=new Os;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name="";isDisabled;model;options;update=new LA;constructor(A,i,n,o,a,r){super(),this._changeDetectorRef=a,this.callSetDisabledState=r,this._parent=A,this._setValidators(i),this._setAsyncValidators(n),this.valueAccessor=Eb(this,o)}ngOnChanges(A){if(this._checkForErrors(),!this._registered||"name"in A){if(this._registered&&(this._checkName(),this.formDirective)){let i=A.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}"isDisabled"in A&&this._updateDisabled(A),Bb(A,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective?.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){JQ(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(A){pL.then(()=>{this.control.setValue(A,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(A){let i=A.isDisabled.currentValue,n=i!==0&&Be(i);pL.then(()=>{n&&!this.control.disabled?this.control.disable():!n&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(A){return this._parent?GL(A,this._parent):[A]}static \u0275fac=function(i){return new(i||t)(ct(Y0,9),ct(Oc,10),ct(OQ,10),ct(as,10),ct(wt,8),ct(AB,8))};static \u0275dir=VA({type:t,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],standalone:!1,features:[Bt([anA]),mt,Yt]})}return t})();var JL=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""],standalone:!1})}return t})(),rnA={provide:as,useExisting:Ja(()=>YQ),multi:!0},YQ=(()=>{class t extends ab{writeValue(A){let i=A??"";this.setProperty("value",i)}registerOnChange(A){this.onChange=i=>{A(i==""?null:parseFloat(i))}}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["input","type","number","formControlName",""],["input","type","number","formControl",""],["input","type","number","ngModel",""]],hostBindings:function(i,n){i&1&&U("input",function(a){return n.onChange(a.target.value)})("blur",function(){return n.onTouched()})},standalone:!1,features:[Bt([rnA]),mt]})}return t})();var ob=class extends Xd{constructor(e,A,i){super(Cb(A),Ib(i,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;at(e){return this.controls[this._adjustIndex(e)]}push(e,A={}){Array.isArray(e)?e.forEach(i=>{this.controls.push(i),this._registerControl(i)}):(this.controls.push(e),this._registerControl(e)),this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}insert(e,A,i={}){this.controls.splice(e,0,A),this._registerControl(A),this.updateValueAndValidity({emitEvent:i.emitEvent})}removeAt(e,A={}){let i=this._adjustIndex(e);i<0&&(i=0),this.controls[i]&&this.controls[i]._registerOnCollectionChange(()=>{}),this.controls.splice(i,1),this.updateValueAndValidity({emitEvent:A.emitEvent})}setControl(e,A,i={}){let n=this._adjustIndex(e);n<0&&(n=0),this.controls[n]&&this.controls[n]._registerOnCollectionChange(()=>{}),this.controls.splice(n,1),A&&(this.controls.splice(n,0,A),this._registerControl(A)),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}get length(){return this.controls.length}setValue(e,A={}){LL(this,!1,e),e.forEach((i,n)=>{FL(this,!1,n),this.at(n).setValue(i,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(e.forEach((i,n)=>{this.at(n)&&this.at(n).patchValue(i,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e=[],A={}){this._forEachChild((i,n)=>{i.reset(e[n],Ye(gA({},A),{onlySelf:!0}))}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A),A?.emitEvent!==!1&&this._events.next(new TQ(this))}getRawValue(){return this.controls.map(e=>e.getRawValue())}clear(e={}){this.controls.length<1||(this._forEachChild(A=>A._registerOnCollectionChange(()=>{})),this.controls.splice(0),this.updateValueAndValidity({emitEvent:e.emitEvent}))}_adjustIndex(e){return e<0?e+this.length:e}_syncPendingControls(){let e=this.controls.reduce((A,i)=>i._syncPendingControls()?!0:A,!1);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){this.controls.forEach((A,i)=>{e(A,i)})}_updateValue(){this.value=this.controls.filter(e=>e.enabled||this.disabled).map(e=>e.value)}_anyControls(e){return this.controls.some(A=>A.enabled&&e(A))}_setUpControls(){this._forEachChild(e=>this._registerControl(e))}_allControlsDisabled(){for(let e of this.controls)if(e.enabled)return!1;return this.controls.length>0||this.disabled}_registerControl(e){e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)}_find(e){return this.at(e)??null}};var snA=(()=>{class t extends Y0{callSetDisabledState;get submitted(){return ca(this._submittedReactive)}set submitted(A){this._submittedReactive.set(A)}_submitted=pe(()=>this._submittedReactive());_submittedReactive=bA(!1);_oldForm;_onCollectionChange=()=>this._updateDomValue();directives=[];constructor(A,i,n){super(),this.callSetDisabledState=n,this._setValidators(A),this._setAsyncValidators(i)}ngOnChanges(A){this.onChanges(A)}ngOnDestroy(){this.onDestroy()}onChanges(A){this._checkFormPresent(),A.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations(),this._oldForm=this.form)}onDestroy(){this.form&&(Ip(this.form,this),this.form._onCollectionChange===this._onCollectionChange&&this.form._registerOnCollectionChange(()=>{}))}get formDirective(){return this}get path(){return[]}addControl(A){let i=this.form.get(A.path);return JQ(i,A,this.callSetDisabledState),i.updateValueAndValidity({emitEvent:!1}),this.directives.push(A),i}getControl(A){return this.form.get(A.path)}removeControl(A){cp(A.control||null,A,!1),inA(this.directives,A)}addFormGroup(A){this._setUpFormContainer(A)}removeFormGroup(A){this._cleanUpFormContainer(A)}getFormGroup(A){return this.form.get(A.path)}getFormArray(A){return this.form.get(A.path)}addFormArray(A){this._setUpFormContainer(A)}removeFormArray(A){this._cleanUpFormContainer(A)}updateModel(A,i){this.form.get(A.path).setValue(i)}onReset(){this.resetForm()}resetForm(A=void 0,i={}){this.form.reset(A,i),this._submittedReactive.set(!1)}onSubmit(A){return this.submitted=!0,TL(this.form,this.directives),this.ngSubmit.emit(A),this.form._events.next(new gp(this.control)),A?.target?.method==="dialog"}_updateDomValue(){this.directives.forEach(A=>{let i=A.control,n=this.form.get(A.path);i!==n&&(cp(i||null,A),onA(n)&&(JQ(n,A,this.callSetDisabledState),A.control=n))}),this.form._updateTreeValidity({emitEvent:!1})}_setUpFormContainer(A){let i=this.form.get(A.path);UL(i,A),i.updateValueAndValidity({emitEvent:!1})}_cleanUpFormContainer(A){let i=this.form?.get(A.path);i&&enA(i,A)&&i.updateValueAndValidity({emitEvent:!1})}_updateRegistrations(){this.form._registerOnCollectionChange(this._onCollectionChange),this._oldForm?._registerOnCollectionChange(()=>{})}_updateValidators(){db(this.form,this),this._oldForm&&Ip(this._oldForm,this)}_checkFormPresent(){this.form}static \u0275fac=function(i){return new(i||t)(ct(Oc,10),ct(OQ,10),ct(AB,8))};static \u0275dir=VA({type:t,features:[mt,Yt]})}return t})();var hb=new kA(""),lnA={provide:Hs,useExisting:Ja(()=>XI)},XI=(()=>{class t extends Hs{_ngModelWarningConfig;callSetDisabledState;viewModel;form;set isDisabled(A){}model;update=new LA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,i,n,o,a){super(),this._ngModelWarningConfig=o,this.callSetDisabledState=a,this._setValidators(A),this._setAsyncValidators(i),this.valueAccessor=Eb(this,n)}ngOnChanges(A){if(this._isControlChanged(A)){let i=A.form.previousValue;i&&cp(i,this,!1),JQ(this.form,this,this.callSetDisabledState),this.form.updateValueAndValidity({emitEvent:!1})}Bb(A,this.viewModel)&&(this.form.setValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.form&&cp(this.form,this,!1)}get path(){return[]}get control(){return this.form}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_isControlChanged(A){return A.hasOwnProperty("form")}static \u0275fac=function(i){return new(i||t)(ct(Oc,10),ct(OQ,10),ct(as,10),ct(hb,8),ct(AB,8))};static \u0275dir=VA({type:t,selectors:[["","formControl",""]],inputs:{form:[0,"formControl","form"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},exportAs:["ngForm"],standalone:!1,features:[Bt([lnA]),mt,Yt]})}return t})();var gnA={provide:Hs,useExisting:Ja(()=>Qb)},Qb=(()=>{class t extends Hs{_ngModelWarningConfig;_added=!1;viewModel;control;name=null;set isDisabled(A){}model;update=new LA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,i,n,o,a){super(),this._ngModelWarningConfig=a,this._parent=A,this._setValidators(i),this._setAsyncValidators(n),this.valueAccessor=Eb(this,o)}ngOnChanges(A){this._added||this._setUpControl(),Bb(A,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}ngOnDestroy(){this.formDirective?.removeControl(this)}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}get path(){return GL(this.name==null?this.name:this.name.toString(),this._parent)}get formDirective(){return this._parent?this._parent.formDirective:null}_setUpControl(){this.control=this.formDirective.addControl(this),this._added=!0}static \u0275fac=function(i){return new(i||t)(ct(Y0,13),ct(Oc,10),ct(OQ,10),ct(as,10),ct(hb,8))};static \u0275dir=VA({type:t,selectors:[["","formControlName",""]],inputs:{name:[0,"formControlName","name"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},standalone:!1,features:[Bt([gnA]),mt,Yt]})}return t})();var cnA={provide:Y0,useExisting:Ja(()=>i2)},i2=(()=>{class t extends snA{form=null;ngSubmit=new LA;get control(){return this.form}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","formGroup",""]],hostBindings:function(i,n){i&1&&U("submit",function(a){return n.onSubmit(a)})("reset",function(){return n.onReset()})},inputs:{form:[0,"formGroup","form"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[Bt([cnA]),mt]})}return t})();function CnA(t){return typeof t=="number"?t:parseFloat(t)}var InA=(()=>{class t{_validator=op;_onChange;_enabled;ngOnChanges(A){if(this.inputName in A){let i=this.normalizeInput(A[this.inputName].currentValue);this._enabled=this.enabled(i),this._validator=this._enabled?this.createValidator(i):op,this._onChange?.()}}validate(A){return this._validator(A)}registerOnValidatorChange(A){this._onChange=A}enabled(A){return A!=null}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,features:[Yt]})}return t})();var dnA={provide:Oc,useExisting:Ja(()=>ub),multi:!0},ub=(()=>{class t extends InA{min;inputName="min";normalizeInput=A=>CnA(A);createValidator=A=>DL(A);static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["input","type","number","min","","formControlName",""],["input","type","number","min","","formControl",""],["input","type","number","min","","ngModel",""]],hostVars:1,hostBindings:function(i,n){i&2&&te("min",n._enabled?n.min:null)},inputs:{min:"min"},standalone:!1,features:[Bt([dnA]),mt]})}return t})();var OL=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})();function mL(t){return!!t&&(t.asyncValidators!==void 0||t.validators!==void 0||t.updateOn!==void 0)}var YL=(()=>{class t{useNonNullable=!1;get nonNullable(){let A=new t;return A.useNonNullable=!0,A}group(A,i=null){let n=this._reduceControls(A),o={};return mL(i)?o=i:i!==null&&(o.validators=i.validator,o.asyncValidators=i.asyncValidator),new $d(n,o)}record(A,i=null){let n=this._reduceControls(A);return new nb(n,i)}control(A,i,n){let o={};return this.useNonNullable?(mL(i)?o=i:(o.validators=i,o.asyncValidators=n),new Os(A,Ye(gA({},o),{nonNullable:!0}))):new Os(A,i,n)}array(A,i,n){let o=A.map(a=>this._createControl(a));return new ob(o,i,n)}_reduceControls(A){let i={};return Object.keys(A).forEach(n=>{i[n]=this._createControl(A[n])}),i}_createControl(A){if(A instanceof Os)return A;if(A instanceof Xd)return A;if(Array.isArray(A)){let i=A[0],n=A.length>1?A[1]:null,o=A.length>2?A[2]:null;return this.control(i,n,o)}else return this.control(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var ln=(()=>{class t{static withConfig(A){return{ngModule:t,providers:[{provide:AB,useValue:A.callSetDisabledState??Bp}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[OL]})}return t})(),n2=(()=>{class t{static withConfig(A){return{ngModule:t,providers:[{provide:hb,useValue:A.warnOnNgModelWithFormControl??"always"},{provide:AB,useValue:A.callSetDisabledState??Bp}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[OL]})}return t})();function $I(t){return t.buttons===0||t.detail===0}function A1(t){let e=t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0];return!!e&&e.identifier===-1&&(e.radiusX==null||e.radiusX===1)&&(e.radiusY==null||e.radiusY===1)}var fb;function HL(){if(fb==null){let t=typeof document<"u"?document.head:null;fb=!!(t&&(t.createShadowRoot||t.attachShadow))}return fb}function pb(t){if(HL()){let e=t.getRootNode?t.getRootNode():null;if(typeof ShadowRoot<"u"&&ShadowRoot&&e instanceof ShadowRoot)return e}return null}function HQ(){let t=typeof document<"u"&&document?document.activeElement:null;for(;t&&t.shadowRoot;){let e=t.shadowRoot.activeElement;if(e===t)break;t=e}return t}function Ur(t){return t.composedPath?t.composedPath()[0]:t.target}var mb;try{mb=typeof Intl<"u"&&Intl.v8BreakIterator}catch(t){mb=!1}var gi=(()=>{class t{_platformId=w(j3);isBrowser=this._platformId?O0(this._platformId):typeof document=="object"&&!!document;EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent);TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent);BLINK=this.isBrowser&&!!(window.chrome||mb)&&typeof CSS<"u"&&!this.EDGE&&!this.TRIDENT;WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT;IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window);FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent);ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT;SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT;constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var zQ;function zL(){if(zQ==null&&typeof window<"u")try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:()=>zQ=!0}))}finally{zQ=zQ||!1}return zQ}function tB(t){return zL()?t:!!t.capture}function zs(t,e=0){return Ep(t)?Number(t):arguments.length===2?e:0}function Ep(t){return!isNaN(parseFloat(t))&&!isNaN(Number(t))}function Ds(t){return t instanceof ce?t.nativeElement:t}var PL=new kA("cdk-input-modality-detector-options"),jL={ignoreKeys:[18,17,224,91,16]},qL=650,wb={passive:!0,capture:!0},VL=(()=>{class t{_platform=w(gi);_listenerCleanups;modalityDetected;modalityChanged;get mostRecentModality(){return this._modality.value}_mostRecentTarget=null;_modality=new ei(null);_options;_lastTouchMs=0;_onKeydown=A=>{this._options?.ignoreKeys?.some(i=>i===A.keyCode)||(this._modality.next("keyboard"),this._mostRecentTarget=Ur(A))};_onMousedown=A=>{Date.now()-this._lastTouchMs{if(A1(A)){this._modality.next("keyboard");return}this._lastTouchMs=Date.now(),this._modality.next("touch"),this._mostRecentTarget=Ur(A)};constructor(){let A=w(qe),i=w(ti),n=w(PL,{optional:!0});if(this._options=gA(gA({},jL),n),this.modalityDetected=this._modality.pipe(wl(1)),this.modalityChanged=this.modalityDetected.pipe(kg()),this._platform.isBrowser){let o=w(Kr).createRenderer(null,null);this._listenerCleanups=A.runOutsideAngular(()=>[o.listen(i,"keydown",this._onKeydown,wb),o.listen(i,"mousedown",this._onMousedown,wb),o.listen(i,"touchstart",this._onTouchstart,wb)])}}ngOnDestroy(){this._modality.complete(),this._listenerCleanups?.forEach(A=>A())}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),PQ=(function(t){return t[t.IMMEDIATE=0]="IMMEDIATE",t[t.EVENTUAL=1]="EVENTUAL",t})(PQ||{}),WL=new kA("cdk-focus-monitor-default-options"),hp=tB({passive:!0,capture:!0}),$a=(()=>{class t{_ngZone=w(qe);_platform=w(gi);_inputModalityDetector=w(VL);_origin=null;_lastFocusOrigin=null;_windowFocused=!1;_windowFocusTimeoutId;_originTimeoutId;_originFromTouchInteraction=!1;_elementInfo=new Map;_monitoredElementCount=0;_rootNodeFocusListenerCount=new Map;_detectionMode;_windowFocusListener=()=>{this._windowFocused=!0,this._windowFocusTimeoutId=setTimeout(()=>this._windowFocused=!1)};_document=w(ti);_stopInputModalityDetector=new ie;constructor(){let A=w(WL,{optional:!0});this._detectionMode=A?.detectionMode||PQ.IMMEDIATE}_rootNodeFocusAndBlurListener=A=>{let i=Ur(A);for(let n=i;n;n=n.parentElement)A.type==="focus"?this._onFocus(A,n):this._onBlur(A,n)};monitor(A,i=!1){let n=Ds(A);if(!this._platform.isBrowser||n.nodeType!==1)return ne();let o=pb(n)||this._document,a=this._elementInfo.get(n);if(a)return i&&(a.checkChildren=!0),a.subject;let r={checkChildren:i,subject:new ie,rootNode:o};return this._elementInfo.set(n,r),this._registerGlobalListeners(r),r.subject}stopMonitoring(A){let i=Ds(A),n=this._elementInfo.get(i);n&&(n.subject.complete(),this._setClasses(i),this._elementInfo.delete(i),this._removeGlobalListeners(n))}focusVia(A,i,n){let o=Ds(A),a=this._document.activeElement;o===a?this._getClosestElementsInfo(o).forEach(([r,s])=>this._originChanged(r,i,s)):(this._setOrigin(i),typeof o.focus=="function"&&o.focus(n))}ngOnDestroy(){this._elementInfo.forEach((A,i)=>this.stopMonitoring(i))}_getWindow(){return this._document.defaultView||window}_getFocusOrigin(A){return this._origin?this._originFromTouchInteraction?this._shouldBeAttributedToTouch(A)?"touch":"program":this._origin:this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:A&&this._isLastInteractionFromInputLabel(A)?"mouse":"program"}_shouldBeAttributedToTouch(A){return this._detectionMode===PQ.EVENTUAL||!!A?.contains(this._inputModalityDetector._mostRecentTarget)}_setClasses(A,i){A.classList.toggle("cdk-focused",!!i),A.classList.toggle("cdk-touch-focused",i==="touch"),A.classList.toggle("cdk-keyboard-focused",i==="keyboard"),A.classList.toggle("cdk-mouse-focused",i==="mouse"),A.classList.toggle("cdk-program-focused",i==="program")}_setOrigin(A,i=!1){this._ngZone.runOutsideAngular(()=>{if(this._origin=A,this._originFromTouchInteraction=A==="touch"&&i,this._detectionMode===PQ.IMMEDIATE){clearTimeout(this._originTimeoutId);let n=this._originFromTouchInteraction?qL:1;this._originTimeoutId=setTimeout(()=>this._origin=null,n)}})}_onFocus(A,i){let n=this._elementInfo.get(i),o=Ur(A);!n||!n.checkChildren&&i!==o||this._originChanged(i,this._getFocusOrigin(o),n)}_onBlur(A,i){let n=this._elementInfo.get(i);!n||n.checkChildren&&A.relatedTarget instanceof Node&&i.contains(A.relatedTarget)||(this._setClasses(i),this._emitOrigin(n,null))}_emitOrigin(A,i){A.subject.observers.length&&this._ngZone.run(()=>A.subject.next(i))}_registerGlobalListeners(A){if(!this._platform.isBrowser)return;let i=A.rootNode,n=this._rootNodeFocusListenerCount.get(i)||0;n||this._ngZone.runOutsideAngular(()=>{i.addEventListener("focus",this._rootNodeFocusAndBlurListener,hp),i.addEventListener("blur",this._rootNodeFocusAndBlurListener,hp)}),this._rootNodeFocusListenerCount.set(i,n+1),++this._monitoredElementCount===1&&(this._ngZone.runOutsideAngular(()=>{this._getWindow().addEventListener("focus",this._windowFocusListener)}),this._inputModalityDetector.modalityDetected.pipe(Qt(this._stopInputModalityDetector)).subscribe(o=>{this._setOrigin(o,!0)}))}_removeGlobalListeners(A){let i=A.rootNode;if(this._rootNodeFocusListenerCount.has(i)){let n=this._rootNodeFocusListenerCount.get(i);n>1?this._rootNodeFocusListenerCount.set(i,n-1):(i.removeEventListener("focus",this._rootNodeFocusAndBlurListener,hp),i.removeEventListener("blur",this._rootNodeFocusAndBlurListener,hp),this._rootNodeFocusListenerCount.delete(i))}--this._monitoredElementCount||(this._getWindow().removeEventListener("focus",this._windowFocusListener),this._stopInputModalityDetector.next(),clearTimeout(this._windowFocusTimeoutId),clearTimeout(this._originTimeoutId))}_originChanged(A,i,n){this._setClasses(A,i),this._emitOrigin(n,i),this._lastFocusOrigin=i}_getClosestElementsInfo(A){let i=[];return this._elementInfo.forEach((n,o)=>{(o===A||n.checkChildren&&o.contains(A))&&i.push([o,n])}),i}_isLastInteractionFromInputLabel(A){let{_mostRecentTarget:i,mostRecentModality:n}=this._inputModalityDetector;if(n!=="mouse"||!i||i===A||A.nodeName!=="INPUT"&&A.nodeName!=="TEXTAREA"||A.disabled)return!1;let o=A.labels;if(o){for(let a=0;a{class t{_elementRef=w(ce);_focusMonitor=w($a);_monitorSubscription;_focusOrigin=null;cdkFocusChange=new LA;constructor(){}get focusOrigin(){return this._focusOrigin}ngAfterViewInit(){let A=this._elementRef.nativeElement;this._monitorSubscription=this._focusMonitor.monitor(A,A.nodeType===1&&A.hasAttribute("cdkMonitorSubtreeFocus")).subscribe(i=>{this._focusOrigin=i,this.cdkFocusChange.emit(i)})}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._monitorSubscription?.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkMonitorElementFocus",""],["","cdkMonitorSubtreeFocus",""]],outputs:{cdkFocusChange:"cdkFocusChange"},exportAs:["cdkMonitorFocus"]})}return t})();var Qp=new WeakMap,eo=(()=>{class t{_appRef;_injector=w(Dt);_environmentInjector=w(Gr);load(A){let i=this._appRef=this._appRef||this._injector.get(K0),n=Qp.get(i);n||(n={loaders:new Set,refs:[]},Qp.set(i,n),i.onDestroy(()=>{Qp.get(i)?.refs.forEach(o=>o.destroy()),Qp.delete(i)})),n.loaders.has(A)||(n.loaders.add(A),n.refs.push(tp(A,{environmentInjector:this._environmentInjector})))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var o2=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["ng-component"]],exportAs:["cdkVisuallyHidden"],decls:0,vars:0,template:function(i,n){},styles:[`.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0} -`],encapsulation:2,changeDetection:0})}return t})(),up;function BnA(){if(up===void 0&&(up=null,typeof window<"u")){let t=window;t.trustedTypes!==void 0&&(up=t.trustedTypes.createPolicy("angular#components",{createHTML:e=>e}))}return up}function e1(t){return BnA()?.createHTML(t)||t}function ZL(t,e,A){let i=A.sanitize(_g.HTML,e);t.innerHTML=e1(i||"")}function iB(t){return Array.isArray(t)?t:[t]}var XL=new Set,t1,nB=(()=>{class t{_platform=w(gi);_nonce=w(TF,{optional:!0});_matchMedia;constructor(){this._matchMedia=this._platform.isBrowser&&window.matchMedia?window.matchMedia.bind(window):hnA}matchMedia(A){return(this._platform.WEBKIT||this._platform.BLINK)&&EnA(A,this._nonce),this._matchMedia(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function EnA(t,e){if(!XL.has(t))try{t1||(t1=document.createElement("style"),e&&t1.setAttribute("nonce",e),t1.setAttribute("type","text/css"),document.head.appendChild(t1)),t1.sheet&&(t1.sheet.insertRule(`@media ${t} {body{ }}`,0),XL.add(t))}catch(A){console.error(A)}}function hnA(t){return{matches:t==="all"||t==="",media:t,addListener:()=>{},removeListener:()=>{}}}var jQ=(()=>{class t{_mediaMatcher=w(nB);_zone=w(qe);_queries=new Map;_destroySubject=new ie;constructor(){}ngOnDestroy(){this._destroySubject.next(),this._destroySubject.complete()}isMatched(A){return $L(iB(A)).some(n=>this._registerQuery(n).mql.matches)}observe(A){let n=$L(iB(A)).map(a=>this._registerQuery(a).observable),o=Qr(n);return o=O3(o.pipe(uo(1)),o.pipe(wl(1),Ls(0))),o.pipe(we(a=>{let r={matches:!1,breakpoints:{}};return a.forEach(({matches:s,query:l})=>{r.matches=r.matches||s,r.breakpoints[l]=s}),r}))}_registerQuery(A){if(this._queries.has(A))return this._queries.get(A);let i=this._mediaMatcher.matchMedia(A),o={observable:new vi(a=>{let r=s=>this._zone.run(()=>a.next(s));return i.addListener(r),()=>{i.removeListener(r)}}).pipe(Sn(i),we(({matches:a})=>({query:A,matches:a})),Qt(this._destroySubject)),mql:i};return this._queries.set(A,o),o}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function $L(t){return t.map(e=>e.split(",")).reduce((e,A)=>e.concat(A)).map(e=>e.trim())}function QnA(t){if(t.type==="characterData"&&t.target instanceof Comment)return!0;if(t.type==="childList"){for(let e=0;e{class t{create(A){return typeof MutationObserver>"u"?null:new MutationObserver(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),eG=(()=>{class t{_mutationObserverFactory=w(AG);_observedElements=new Map;_ngZone=w(qe);constructor(){}ngOnDestroy(){this._observedElements.forEach((A,i)=>this._cleanupObserver(i))}observe(A){let i=Ds(A);return new vi(n=>{let a=this._observeElement(i).pipe(we(r=>r.filter(s=>!QnA(s))),gt(r=>!!r.length)).subscribe(r=>{this._ngZone.run(()=>{n.next(r)})});return()=>{a.unsubscribe(),this._unobserveElement(i)}})}_observeElement(A){return this._ngZone.runOutsideAngular(()=>{if(this._observedElements.has(A))this._observedElements.get(A).count++;else{let i=new ie,n=this._mutationObserverFactory.create(o=>i.next(o));n&&n.observe(A,{characterData:!0,childList:!0,subtree:!0}),this._observedElements.set(A,{observer:n,stream:i,count:1})}return this._observedElements.get(A).stream})}_unobserveElement(A){this._observedElements.has(A)&&(this._observedElements.get(A).count--,this._observedElements.get(A).count||this._cleanupObserver(A))}_cleanupObserver(A){if(this._observedElements.has(A)){let{observer:i,stream:n}=this._observedElements.get(A);i&&i.disconnect(),n.complete(),this._observedElements.delete(A)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),tG=(()=>{class t{_contentObserver=w(eG);_elementRef=w(ce);event=new LA;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._disabled?this._unsubscribe():this._subscribe()}_disabled=!1;get debounce(){return this._debounce}set debounce(A){this._debounce=zs(A),this._subscribe()}_debounce;_currentSubscription=null;constructor(){}ngAfterContentInit(){!this._currentSubscription&&!this.disabled&&this._subscribe()}ngOnDestroy(){this._unsubscribe()}_subscribe(){this._unsubscribe();let A=this._contentObserver.observe(this._elementRef);this._currentSubscription=(this.debounce?A.pipe(Ls(this.debounce)):A).subscribe(this.event)}_unsubscribe(){this._currentSubscription?.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkObserveContent",""]],inputs:{disabled:[2,"cdkObserveContentDisabled","disabled",Be],debounce:"debounce"},outputs:{event:"cdkObserveContent"},exportAs:["cdkObserveContent"]})}return t})(),fp=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({providers:[AG]})}return t})();var oB=(()=>{class t{_platform=w(gi);constructor(){}isDisabled(A){return A.hasAttribute("disabled")}isVisible(A){return fnA(A)&&getComputedStyle(A).visibility==="visible"}isTabbable(A){if(!this._platform.isBrowser)return!1;let i=unA(MnA(A));if(i&&(iG(i)===-1||!this.isVisible(i)))return!1;let n=A.nodeName.toLowerCase(),o=iG(A);return A.hasAttribute("contenteditable")?o!==-1:n==="iframe"||n==="object"||this._platform.WEBKIT&&this._platform.IOS&&!vnA(A)?!1:n==="audio"?A.hasAttribute("controls")?o!==-1:!1:n==="video"?o===-1?!1:o!==null?!0:this._platform.FIREFOX||A.hasAttribute("controls"):A.tabIndex>=0}isFocusable(A,i){return bnA(A)&&!this.isDisabled(A)&&(i?.ignoreVisibility||this.isVisible(A))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function unA(t){try{return t.frameElement}catch(e){return null}}function fnA(t){return!!(t.offsetWidth||t.offsetHeight||typeof t.getClientRects=="function"&&t.getClientRects().length)}function pnA(t){let e=t.nodeName.toLowerCase();return e==="input"||e==="select"||e==="button"||e==="textarea"}function mnA(t){return DnA(t)&&t.type=="hidden"}function wnA(t){return ynA(t)&&t.hasAttribute("href")}function DnA(t){return t.nodeName.toLowerCase()=="input"}function ynA(t){return t.nodeName.toLowerCase()=="a"}function aG(t){if(!t.hasAttribute("tabindex")||t.tabIndex===void 0)return!1;let e=t.getAttribute("tabindex");return!!(e&&!isNaN(parseInt(e,10)))}function iG(t){if(!aG(t))return null;let e=parseInt(t.getAttribute("tabindex")||"",10);return isNaN(e)?-1:e}function vnA(t){let e=t.nodeName.toLowerCase(),A=e==="input"&&t.type;return A==="text"||A==="password"||e==="select"||e==="textarea"}function bnA(t){return mnA(t)?!1:pnA(t)||wnA(t)||t.hasAttribute("contenteditable")||aG(t)}function MnA(t){return t.ownerDocument&&t.ownerDocument.defaultView||window}var pp=class{_element;_checker;_ngZone;_document;_injector;_startAnchor=null;_endAnchor=null;_hasAttached=!1;startAnchorListener=()=>this.focusLastTabbableElement();endAnchorListener=()=>this.focusFirstTabbableElement();get enabled(){return this._enabled}set enabled(e){this._enabled=e,this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_enabled=!0;constructor(e,A,i,n,o=!1,a){this._element=e,this._checker=A,this._ngZone=i,this._document=n,this._injector=a,o||this.attachAnchors()}destroy(){let e=this._startAnchor,A=this._endAnchor;e&&(e.removeEventListener("focus",this.startAnchorListener),e.remove()),A&&(A.removeEventListener("focus",this.endAnchorListener),A.remove()),this._startAnchor=this._endAnchor=null,this._hasAttached=!1}attachAnchors(){return this._hasAttached?!0:(this._ngZone.runOutsideAngular(()=>{this._startAnchor||(this._startAnchor=this._createAnchor(),this._startAnchor.addEventListener("focus",this.startAnchorListener)),this._endAnchor||(this._endAnchor=this._createAnchor(),this._endAnchor.addEventListener("focus",this.endAnchorListener))}),this._element.parentNode&&(this._element.parentNode.insertBefore(this._startAnchor,this._element),this._element.parentNode.insertBefore(this._endAnchor,this._element.nextSibling),this._hasAttached=!0),this._hasAttached)}focusInitialElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusInitialElement(e)))})}focusFirstTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusFirstTabbableElement(e)))})}focusLastTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusLastTabbableElement(e)))})}_getRegionBoundary(e){let A=this._element.querySelectorAll(`[cdk-focus-region-${e}], [cdkFocusRegion${e}], [cdk-focus-${e}]`);return e=="start"?A.length?A[0]:this._getFirstTabbableElement(this._element):A.length?A[A.length-1]:this._getLastTabbableElement(this._element)}focusInitialElement(e){let A=this._element.querySelector("[cdk-focus-initial], [cdkFocusInitial]");if(A){if(!this._checker.isFocusable(A)){let i=this._getFirstTabbableElement(A);return i?.focus(e),!!i}return A.focus(e),!0}return this.focusFirstTabbableElement(e)}focusFirstTabbableElement(e){let A=this._getRegionBoundary("start");return A&&A.focus(e),!!A}focusLastTabbableElement(e){let A=this._getRegionBoundary("end");return A&&A.focus(e),!!A}hasAttached(){return this._hasAttached}_getFirstTabbableElement(e){if(this._checker.isFocusable(e)&&this._checker.isTabbable(e))return e;let A=e.children;for(let i=0;i=0;i--){let n=A[i].nodeType===this._document.ELEMENT_NODE?this._getLastTabbableElement(A[i]):null;if(n)return n}return null}_createAnchor(){let e=this._document.createElement("div");return this._toggleAnchorTabIndex(this._enabled,e),e.classList.add("cdk-visually-hidden"),e.classList.add("cdk-focus-trap-anchor"),e.setAttribute("aria-hidden","true"),e}_toggleAnchorTabIndex(e,A){e?A.setAttribute("tabindex","0"):A.removeAttribute("tabindex")}toggleAnchors(e){this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_executeOnStable(e){this._injector?Hn(e,{injector:this._injector}):setTimeout(e)}},qQ=(()=>{class t{_checker=w(oB);_ngZone=w(qe);_document=w(ti);_injector=w(Dt);constructor(){w(eo).load(o2)}create(A,i=!1){return new pp(A,this._checker,this._ngZone,this._document,i,this._injector)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var rG=new kA("liveAnnouncerElement",{providedIn:"root",factory:()=>null}),sG=new kA("LIVE_ANNOUNCER_DEFAULT_OPTIONS"),SnA=0,VQ=(()=>{class t{_ngZone=w(qe);_defaultOptions=w(sG,{optional:!0});_liveElement;_document=w(ti);_sanitizer=w(e2);_previousTimeout;_currentPromise;_currentResolve;constructor(){let A=w(rG,{optional:!0});this._liveElement=A||this._createLiveElement()}announce(A,...i){let n=this._defaultOptions,o,a;return i.length===1&&typeof i[0]=="number"?a=i[0]:[o,a]=i,this.clear(),clearTimeout(this._previousTimeout),o||(o=n&&n.politeness?n.politeness:"polite"),a==null&&n&&(a=n.duration),this._liveElement.setAttribute("aria-live",o),this._liveElement.id&&this._exposeAnnouncerToModals(this._liveElement.id),this._ngZone.runOutsideAngular(()=>(this._currentPromise||(this._currentPromise=new Promise(r=>this._currentResolve=r)),clearTimeout(this._previousTimeout),this._previousTimeout=setTimeout(()=>{!A||typeof A=="string"?this._liveElement.textContent=A:ZL(this._liveElement,A,this._sanitizer),typeof a=="number"&&(this._previousTimeout=setTimeout(()=>this.clear(),a)),this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0},100),this._currentPromise))}clear(){this._liveElement&&(this._liveElement.textContent="")}ngOnDestroy(){clearTimeout(this._previousTimeout),this._liveElement?.remove(),this._liveElement=null,this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0}_createLiveElement(){let A="cdk-live-announcer-element",i=this._document.getElementsByClassName(A),n=this._document.createElement("div");for(let o=0;o .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{class t{_platform=w(gi);_hasCheckedHighContrastMode=!1;_document=w(ti);_breakpointSubscription;constructor(){this._breakpointSubscription=w(jQ).observe("(forced-colors: active)").subscribe(()=>{this._hasCheckedHighContrastMode&&(this._hasCheckedHighContrastMode=!1,this._applyBodyHighContrastModeCssClasses())})}getHighContrastMode(){if(!this._platform.isBrowser)return a2.NONE;let A=this._document.createElement("div");A.style.backgroundColor="rgb(1,2,3)",A.style.position="absolute",this._document.body.appendChild(A);let i=this._document.defaultView||window,n=i&&i.getComputedStyle?i.getComputedStyle(A):null,o=(n&&n.backgroundColor||"").replace(/ /g,"");switch(A.remove(),o){case"rgb(0,0,0)":case"rgb(45,50,54)":case"rgb(32,32,32)":return a2.WHITE_ON_BLACK;case"rgb(255,255,255)":case"rgb(255,250,239)":return a2.BLACK_ON_WHITE}return a2.NONE}ngOnDestroy(){this._breakpointSubscription.unsubscribe()}_applyBodyHighContrastModeCssClasses(){if(!this._hasCheckedHighContrastMode&&this._platform.isBrowser&&this._document.body){let A=this._document.body.classList;A.remove(yb,nG,oG),this._hasCheckedHighContrastMode=!0;let i=this.getHighContrastMode();i===a2.BLACK_ON_WHITE?A.add(yb,nG):i===a2.WHITE_ON_BLACK&&A.add(yb,oG)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),WQ=(()=>{class t{constructor(){w(lG)._applyBodyHighContrastModeCssClasses()}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fp]})}return t})();var vb={},In=class t{_appId=w(P3);static _infix=`a${Math.floor(Math.random()*1e5).toString()}`;getId(e,A=!1){return this._appId!=="ng"&&(e+=this._appId),vb.hasOwnProperty(e)||(vb[e]=0),`${e}${A?t._infix+"-":""}${vb[e]++}`}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var knA=200,mp=class{_letterKeyStream=new ie;_items=[];_selectedItemIndex=-1;_pressedLetters=[];_skipPredicateFn;_selectedItem=new ie;selectedItem=this._selectedItem;constructor(e,A){let i=typeof A?.debounceInterval=="number"?A.debounceInterval:knA;A?.skipPredicate&&(this._skipPredicateFn=A.skipPredicate),this.setItems(e),this._setupKeyHandler(i)}destroy(){this._pressedLetters=[],this._letterKeyStream.complete(),this._selectedItem.complete()}setCurrentSelectedItemIndex(e){this._selectedItemIndex=e}setItems(e){this._items=e}handleKey(e){let A=e.keyCode;e.key&&e.key.length===1?this._letterKeyStream.next(e.key.toLocaleUpperCase()):(A>=65&&A<=90||A>=48&&A<=57)&&this._letterKeyStream.next(String.fromCharCode(A))}isTyping(){return this._pressedLetters.length>0}reset(){this._pressedLetters=[]}_setupKeyHandler(e){this._letterKeyStream.pipe(di(A=>this._pressedLetters.push(A)),Ls(e),gt(()=>this._pressedLetters.length>0),we(()=>this._pressedLetters.join("").toLocaleUpperCase())).subscribe(A=>{for(let i=1;it[A]):t.altKey||t.shiftKey||t.ctrlKey||t.metaKey}var aB=class{_items;_activeItemIndex=bA(-1);_activeItem=bA(null);_wrap=!1;_typeaheadSubscription=bo.EMPTY;_itemChangesSubscription;_vertical=!0;_horizontal=null;_allowedModifierKeys=[];_homeAndEnd=!1;_pageUpAndDown={enabled:!1,delta:10};_effectRef;_typeahead;_skipPredicateFn=e=>e.disabled;constructor(e,A){this._items=e,e instanceof xg?this._itemChangesSubscription=e.changes.subscribe(i=>this._itemsChanged(i.toArray())):VI(e)&&(this._effectRef=Ao(()=>this._itemsChanged(e()),{injector:A}))}tabOut=new ie;change=new ie;skipPredicate(e){return this._skipPredicateFn=e,this}withWrap(e=!0){return this._wrap=e,this}withVerticalOrientation(e=!0){return this._vertical=e,this}withHorizontalOrientation(e){return this._horizontal=e,this}withAllowedModifierKeys(e){return this._allowedModifierKeys=e,this}withTypeAhead(e=200){this._typeaheadSubscription.unsubscribe();let A=this._getItemsArray();return this._typeahead=new mp(A,{debounceInterval:typeof e=="number"?e:void 0,skipPredicate:i=>this._skipPredicateFn(i)}),this._typeaheadSubscription=this._typeahead.selectedItem.subscribe(i=>{this.setActiveItem(i)}),this}cancelTypeahead(){return this._typeahead?.reset(),this}withHomeAndEnd(e=!0){return this._homeAndEnd=e,this}withPageUpDown(e=!0,A=10){return this._pageUpAndDown={enabled:e,delta:A},this}setActiveItem(e){let A=this._activeItem();this.updateActiveItem(e),this._activeItem()!==A&&this.change.next(this._activeItemIndex())}onKeydown(e){let A=e.keyCode,n=["altKey","ctrlKey","metaKey","shiftKey"].every(o=>!e[o]||this._allowedModifierKeys.indexOf(o)>-1);switch(A){case 9:this.tabOut.next();return;case 40:if(this._vertical&&n){this.setNextItemActive();break}else return;case 38:if(this._vertical&&n){this.setPreviousItemActive();break}else return;case 39:if(this._horizontal&&n){this._horizontal==="rtl"?this.setPreviousItemActive():this.setNextItemActive();break}else return;case 37:if(this._horizontal&&n){this._horizontal==="rtl"?this.setNextItemActive():this.setPreviousItemActive();break}else return;case 36:if(this._homeAndEnd&&n){this.setFirstItemActive();break}else return;case 35:if(this._homeAndEnd&&n){this.setLastItemActive();break}else return;case 33:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex()-this._pageUpAndDown.delta;this._setActiveItemByIndex(o>0?o:0,1);break}else return;case 34:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex()+this._pageUpAndDown.delta,a=this._getItemsArray().length;this._setActiveItemByIndex(o-1&&i!==this._activeItemIndex()&&(this._activeItemIndex.set(i),this._typeahead?.setCurrentSelectedItemIndex(i))}}};var ZQ=class extends aB{setActiveItem(e){this.activeItem&&this.activeItem.setInactiveStyles(),super.setActiveItem(e),this.activeItem&&this.activeItem.setActiveStyles()}};var H0=class extends aB{_origin="program";setFocusOrigin(e){return this._origin=e,this}setActiveItem(e){super.setActiveItem(e),this.activeItem&&this.activeItem.focus(this._origin)}};var CG=" ";function Sb(t,e,A){let i=Dp(t,e);A=A.trim(),!i.some(n=>n.trim()===A)&&(i.push(A),t.setAttribute(e,i.join(CG)))}function yp(t,e,A){let i=Dp(t,e);A=A.trim();let n=i.filter(o=>o!==A);n.length?t.setAttribute(e,n.join(CG)):t.removeAttribute(e)}function Dp(t,e){return t.getAttribute(e)?.match(/\S+/g)??[]}var IG="cdk-describedby-message",wp="cdk-describedby-host",Mb=0,dG=(()=>{class t{_platform=w(gi);_document=w(ti);_messageRegistry=new Map;_messagesContainer=null;_id=`${Mb++}`;constructor(){w(eo).load(o2),this._id=w(P3)+"-"+Mb++}describe(A,i,n){if(!this._canBeDescribed(A,i))return;let o=bb(i,n);typeof i!="string"?(cG(i,this._id),this._messageRegistry.set(o,{messageElement:i,referenceCount:0})):this._messageRegistry.has(o)||this._createMessageElement(i,n),this._isElementDescribedByMessage(A,o)||this._addMessageReference(A,o)}removeDescription(A,i,n){if(!i||!this._isElementNode(A))return;let o=bb(i,n);if(this._isElementDescribedByMessage(A,o)&&this._removeMessageReference(A,o),typeof i=="string"){let a=this._messageRegistry.get(o);a&&a.referenceCount===0&&this._deleteMessageElement(o)}this._messagesContainer?.childNodes.length===0&&(this._messagesContainer.remove(),this._messagesContainer=null)}ngOnDestroy(){let A=this._document.querySelectorAll(`[${wp}="${this._id}"]`);for(let i=0;in.indexOf(IG)!=0);A.setAttribute("aria-describedby",i.join(" "))}_addMessageReference(A,i){let n=this._messageRegistry.get(i);Sb(A,"aria-describedby",n.messageElement.id),A.setAttribute(wp,this._id),n.referenceCount++}_removeMessageReference(A,i){let n=this._messageRegistry.get(i);n.referenceCount--,yp(A,"aria-describedby",n.messageElement.id),A.removeAttribute(wp)}_isElementDescribedByMessage(A,i){let n=Dp(A,"aria-describedby"),o=this._messageRegistry.get(i),a=o&&o.messageElement.id;return!!a&&n.indexOf(a)!=-1}_canBeDescribed(A,i){if(!this._isElementNode(A))return!1;if(i&&typeof i=="object")return!0;let n=i==null?"":`${i}`.trim(),o=A.getAttribute("aria-label");return n?!o||o.trim()!==n:!1}_isElementNode(A){return A.nodeType===this._document.ELEMENT_NODE}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function bb(t,e){return typeof t=="string"?`${e||""}/${t}`:t}function cG(t,e){t.id||(t.id=`${IG}-${e}-${Mb++}`)}var Rg=(function(t){return t[t.NORMAL=0]="NORMAL",t[t.NEGATED=1]="NEGATED",t[t.INVERTED=2]="INVERTED",t})(Rg||{}),vp,r1;function bp(){if(r1==null){if(typeof document!="object"||!document||typeof Element!="function"||!Element)return r1=!1,r1;if(document.documentElement?.style&&"scrollBehavior"in document.documentElement.style)r1=!0;else{let t=Element.prototype.scrollTo;t?r1=!/\{\s*\[native code\]\s*\}/.test(t.toString()):r1=!1}}return r1}function rB(){if(typeof document!="object"||!document)return Rg.NORMAL;if(vp==null){let t=document.createElement("div"),e=t.style;t.dir="rtl",e.width="1px",e.overflow="auto",e.visibility="hidden",e.pointerEvents="none",e.position="absolute";let A=document.createElement("div"),i=A.style;i.width="2px",i.height="1px",t.appendChild(A),document.body.appendChild(t),vp=Rg.NORMAL,t.scrollLeft===0&&(t.scrollLeft=1,vp=t.scrollLeft===0?Rg.NEGATED:Rg.INVERTED),t.remove()}return vp}function kb(){return typeof __karma__<"u"&&!!__karma__||typeof jasmine<"u"&&!!jasmine||typeof jest<"u"&&!!jest||typeof Mocha<"u"&&!!Mocha}var sB,BG=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function xb(){if(sB)return sB;if(typeof document!="object"||!document)return sB=new Set(BG),sB;let t=document.createElement("input");return sB=new Set(BG.filter(e=>(t.setAttribute("type",e),t.type===e))),sB}var EG={XSmall:"(max-width: 599.98px)",Small:"(min-width: 600px) and (max-width: 959.98px)",Medium:"(min-width: 960px) and (max-width: 1279.98px)",Large:"(min-width: 1280px) and (max-width: 1919.98px)",XLarge:"(min-width: 1920px)",Handset:"(max-width: 599.98px) and (orientation: portrait), (max-width: 959.98px) and (orientation: landscape)",Tablet:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait), (min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",Web:"(min-width: 840px) and (orientation: portrait), (min-width: 1280px) and (orientation: landscape)",HandsetPortrait:"(max-width: 599.98px) and (orientation: portrait)",TabletPortrait:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait)",WebPortrait:"(min-width: 840px) and (orientation: portrait)",HandsetLandscape:"(max-width: 959.98px) and (orientation: landscape)",TabletLandscape:"(min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",WebLandscape:"(min-width: 1280px) and (orientation: landscape)"};var _nA=new kA("MATERIAL_ANIMATIONS"),hG=null;function XQ(){return w(_nA,{optional:!0})?.animationsDisabled||w(qI,{optional:!0})==="NoopAnimations"?"di-disabled":(hG??=w(nB).matchMedia("(prefers-reduced-motion)").matches,hG?"reduced-motion":"enabled")}function An(){return XQ()!=="enabled"}function Oa(t){return t==null?"":typeof t=="string"?t:`${t}px`}function mr(t){return t!=null&&`${t}`!="false"}var ys=(function(t){return t[t.FADING_IN=0]="FADING_IN",t[t.VISIBLE=1]="VISIBLE",t[t.FADING_OUT=2]="FADING_OUT",t[t.HIDDEN=3]="HIDDEN",t})(ys||{}),_b=class{_renderer;element;config;_animationForciblyDisabledThroughCss;state=ys.HIDDEN;constructor(e,A,i,n=!1){this._renderer=e,this.element=A,this.config=i,this._animationForciblyDisabledThroughCss=n}fadeOut(){this._renderer.fadeOutRipple(this)}},QG=tB({passive:!0,capture:!0}),Rb=class{_events=new Map;addHandler(e,A,i,n){let o=this._events.get(A);if(o){let a=o.get(i);a?a.add(n):o.set(i,new Set([n]))}else this._events.set(A,new Map([[i,new Set([n])]])),e.runOutsideAngular(()=>{document.addEventListener(A,this._delegateEventHandler,QG)})}removeHandler(e,A,i){let n=this._events.get(e);if(!n)return;let o=n.get(A);o&&(o.delete(i),o.size===0&&n.delete(A),n.size===0&&(this._events.delete(e),document.removeEventListener(e,this._delegateEventHandler,QG)))}_delegateEventHandler=e=>{let A=Ur(e);A&&this._events.get(e.type)?.forEach((i,n)=>{(n===A||n.contains(A))&&i.forEach(o=>o.handleEvent(e))})}},$Q={enterDuration:225,exitDuration:150},RnA=800,uG=tB({passive:!0,capture:!0}),fG=["mousedown","touchstart"],pG=["mouseup","mouseleave","touchend","touchcancel"],NnA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["ng-component"]],hostAttrs:["mat-ripple-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[`.mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale3d(0, 0, 0);background-color:var(--mat-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface) 10%, transparent))}@media(forced-colors: active){.mat-ripple-element{display:none}}.cdk-drag-preview .mat-ripple-element,.cdk-drag-placeholder .mat-ripple-element{display:none} -`],encapsulation:2,changeDetection:0})}return t})(),Au=class t{_target;_ngZone;_platform;_containerElement;_triggerElement=null;_isPointerDown=!1;_activeRipples=new Map;_mostRecentTransientRipple=null;_lastTouchStartEvent;_pointerUpEventsRegistered=!1;_containerRect=null;static _eventManager=new Rb;constructor(e,A,i,n,o){this._target=e,this._ngZone=A,this._platform=n,n.isBrowser&&(this._containerElement=Ds(i)),o&&o.get(eo).load(NnA)}fadeInRipple(e,A,i={}){let n=this._containerRect=this._containerRect||this._containerElement.getBoundingClientRect(),o=gA(gA({},$Q),i.animation);i.centered&&(e=n.left+n.width/2,A=n.top+n.height/2);let a=i.radius||FnA(e,A,n),r=e-n.left,s=A-n.top,l=o.enterDuration,g=document.createElement("div");g.classList.add("mat-ripple-element"),g.style.left=`${r-a}px`,g.style.top=`${s-a}px`,g.style.height=`${a*2}px`,g.style.width=`${a*2}px`,i.color!=null&&(g.style.backgroundColor=i.color),g.style.transitionDuration=`${l}ms`,this._containerElement.appendChild(g);let C=window.getComputedStyle(g),I=C.transitionProperty,d=C.transitionDuration,h=I==="none"||d==="0s"||d==="0s, 0s"||n.width===0&&n.height===0,E=new _b(this,g,i,h);g.style.transform="scale3d(1, 1, 1)",E.state=ys.FADING_IN,i.persistent||(this._mostRecentTransientRipple=E);let f=null;return!h&&(l||o.exitDuration)&&this._ngZone.runOutsideAngular(()=>{let m=()=>{f&&(f.fallbackTimer=null),clearTimeout(k),this._finishRippleTransition(E)},v=()=>this._destroyRipple(E),k=setTimeout(v,l+100);g.addEventListener("transitionend",m),g.addEventListener("transitioncancel",v),f={onTransitionEnd:m,onTransitionCancel:v,fallbackTimer:k}}),this._activeRipples.set(E,f),(h||!l)&&this._finishRippleTransition(E),E}fadeOutRipple(e){if(e.state===ys.FADING_OUT||e.state===ys.HIDDEN)return;let A=e.element,i=gA(gA({},$Q),e.config.animation);A.style.transitionDuration=`${i.exitDuration}ms`,A.style.opacity="0",e.state=ys.FADING_OUT,(e._animationForciblyDisabledThroughCss||!i.exitDuration)&&this._finishRippleTransition(e)}fadeOutAll(){this._getActiveRipples().forEach(e=>e.fadeOut())}fadeOutAllNonPersistent(){this._getActiveRipples().forEach(e=>{e.config.persistent||e.fadeOut()})}setupTriggerEvents(e){let A=Ds(e);!this._platform.isBrowser||!A||A===this._triggerElement||(this._removeTriggerEvents(),this._triggerElement=A,fG.forEach(i=>{t._eventManager.addHandler(this._ngZone,i,A,this)}))}handleEvent(e){e.type==="mousedown"?this._onMousedown(e):e.type==="touchstart"?this._onTouchStart(e):this._onPointerUp(),this._pointerUpEventsRegistered||(this._ngZone.runOutsideAngular(()=>{pG.forEach(A=>{this._triggerElement.addEventListener(A,this,uG)})}),this._pointerUpEventsRegistered=!0)}_finishRippleTransition(e){e.state===ys.FADING_IN?this._startFadeOutTransition(e):e.state===ys.FADING_OUT&&this._destroyRipple(e)}_startFadeOutTransition(e){let A=e===this._mostRecentTransientRipple,{persistent:i}=e.config;e.state=ys.VISIBLE,!i&&(!A||!this._isPointerDown)&&e.fadeOut()}_destroyRipple(e){let A=this._activeRipples.get(e)??null;this._activeRipples.delete(e),this._activeRipples.size||(this._containerRect=null),e===this._mostRecentTransientRipple&&(this._mostRecentTransientRipple=null),e.state=ys.HIDDEN,A!==null&&(e.element.removeEventListener("transitionend",A.onTransitionEnd),e.element.removeEventListener("transitioncancel",A.onTransitionCancel),A.fallbackTimer!==null&&clearTimeout(A.fallbackTimer)),e.element.remove()}_onMousedown(e){let A=$I(e),i=this._lastTouchStartEvent&&Date.now(){let A=e.state===ys.VISIBLE||e.config.terminateOnPointerUp&&e.state===ys.FADING_IN;!e.config.persistent&&A&&e.fadeOut()}))}_getActiveRipples(){return Array.from(this._activeRipples.keys())}_removeTriggerEvents(){let e=this._triggerElement;e&&(fG.forEach(A=>t._eventManager.removeHandler(A,e,this)),this._pointerUpEventsRegistered&&(pG.forEach(A=>e.removeEventListener(A,this,uG)),this._pointerUpEventsRegistered=!1))}};function FnA(t,e,A){let i=Math.max(Math.abs(t-A.left),Math.abs(t-A.right)),n=Math.max(Math.abs(e-A.top),Math.abs(e-A.bottom));return Math.sqrt(i*i+n*n)}var r2=new kA("mat-ripple-global-options"),rs=(()=>{class t{_elementRef=w(ce);_animationsDisabled=An();color;unbounded=!1;centered=!1;radius=0;animation;get disabled(){return this._disabled}set disabled(A){A&&this.fadeOutAllNonPersistent(),this._disabled=A,this._setupTriggerEventsIfEnabled()}_disabled=!1;get trigger(){return this._trigger||this._elementRef.nativeElement}set trigger(A){this._trigger=A,this._setupTriggerEventsIfEnabled()}_trigger;_rippleRenderer;_globalOptions;_isInitialized=!1;constructor(){let A=w(qe),i=w(gi),n=w(r2,{optional:!0}),o=w(Dt);this._globalOptions=n||{},this._rippleRenderer=new Au(this,A,this._elementRef,i,o)}ngOnInit(){this._isInitialized=!0,this._setupTriggerEventsIfEnabled()}ngOnDestroy(){this._rippleRenderer._removeTriggerEvents()}fadeOutAll(){this._rippleRenderer.fadeOutAll()}fadeOutAllNonPersistent(){this._rippleRenderer.fadeOutAllNonPersistent()}get rippleConfig(){return{centered:this.centered,radius:this.radius,color:this.color,animation:gA(gA(gA({},this._globalOptions.animation),this._animationsDisabled?{enterDuration:0,exitDuration:0}:{}),this.animation),terminateOnPointerUp:this._globalOptions.terminateOnPointerUp}}get rippleDisabled(){return this.disabled||!!this._globalOptions.disabled}_setupTriggerEventsIfEnabled(){!this.disabled&&this._isInitialized&&this._rippleRenderer.setupTriggerEvents(this.trigger)}launch(A,i=0,n){return typeof A=="number"?this._rippleRenderer.fadeInRipple(A,i,gA(gA({},this.rippleConfig),n)):this._rippleRenderer.fadeInRipple(0,0,gA(gA({},this.rippleConfig),A))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","mat-ripple",""],["","matRipple",""]],hostAttrs:[1,"mat-ripple"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mat-ripple-unbounded",n.unbounded)},inputs:{color:[0,"matRippleColor","color"],unbounded:[0,"matRippleUnbounded","unbounded"],centered:[0,"matRippleCentered","centered"],radius:[0,"matRippleRadius","radius"],animation:[0,"matRippleAnimation","animation"],disabled:[0,"matRippleDisabled","disabled"],trigger:[0,"matRippleTrigger","trigger"]},exportAs:["matRipple"]})}return t})();var LnA={capture:!0},GnA=["focus","mousedown","mouseenter","touchstart"],Nb="mat-ripple-loader-uninitialized",Fb="mat-ripple-loader-class-name",mG="mat-ripple-loader-centered",Mp="mat-ripple-loader-disabled",Sp=(()=>{class t{_document=w(ti);_animationsDisabled=An();_globalRippleOptions=w(r2,{optional:!0});_platform=w(gi);_ngZone=w(qe);_injector=w(Dt);_eventCleanups;_hosts=new Map;constructor(){let A=w(Kr).createRenderer(null,null);this._eventCleanups=this._ngZone.runOutsideAngular(()=>GnA.map(i=>A.listen(this._document,i,this._onInteraction,LnA)))}ngOnDestroy(){let A=this._hosts.keys();for(let i of A)this.destroyRipple(i);this._eventCleanups.forEach(i=>i())}configureRipple(A,i){A.setAttribute(Nb,this._globalRippleOptions?.namespace??""),(i.className||!A.hasAttribute(Fb))&&A.setAttribute(Fb,i.className||""),i.centered&&A.setAttribute(mG,""),i.disabled&&A.setAttribute(Mp,"")}setDisabled(A,i){let n=this._hosts.get(A);n?(n.target.rippleDisabled=i,!i&&!n.hasSetUpEvents&&(n.hasSetUpEvents=!0,n.renderer.setupTriggerEvents(A))):i?A.setAttribute(Mp,""):A.removeAttribute(Mp)}_onInteraction=A=>{let i=Ur(A);if(i instanceof HTMLElement){let n=i.closest(`[${Nb}="${this._globalRippleOptions?.namespace??""}"]`);n&&this._createRipple(n)}};_createRipple(A){if(!this._document||this._hosts.has(A))return;A.querySelector(".mat-ripple")?.remove();let i=this._document.createElement("span");i.classList.add("mat-ripple",A.getAttribute(Fb)),A.append(i);let n=this._globalRippleOptions,o=this._animationsDisabled?0:n?.animation?.enterDuration??$Q.enterDuration,a=this._animationsDisabled?0:n?.animation?.exitDuration??$Q.exitDuration,r={rippleDisabled:this._animationsDisabled||n?.disabled||A.hasAttribute(Mp),rippleConfig:{centered:A.hasAttribute(mG),terminateOnPointerUp:n?.terminateOnPointerUp,animation:{enterDuration:o,exitDuration:a}}},s=new Au(r,this._ngZone,i,this._platform,this._injector),l=!r.rippleDisabled;l&&s.setupTriggerEvents(A),this._hosts.set(A,{target:r,renderer:s,hasSetUpEvents:l}),A.removeAttribute(Nb)}destroyRipple(A){let i=this._hosts.get(A);i&&(i.renderer._removeTriggerEvents(),this._hosts.delete(A))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var lr=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["structural-styles"]],decls:0,vars:0,template:function(i,n){},styles:[`.mat-focus-indicator{position:relative}.mat-focus-indicator::before{top:0;left:0;right:0;bottom:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border-width:var(--mat-focus-indicator-border-width, 3px);border-style:var(--mat-focus-indicator-border-style, solid);border-color:var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus-visible::before{content:""}@media(forced-colors: active){html{--mat-focus-indicator-display: block}} -`],encapsulation:2,changeDetection:0})}return t})();var KnA=["mat-icon-button",""],UnA=["*"],TnA=new kA("MAT_BUTTON_CONFIG");function wG(t){return t==null?void 0:Cn(t)}var Lb=(()=>{class t{_elementRef=w(ce);_ngZone=w(qe);_animationsDisabled=An();_config=w(TnA,{optional:!0});_focusMonitor=w($a);_cleanupClick;_renderer=w(Pi);_rippleLoader=w(Sp);_isAnchor;_isFab=!1;color;get disableRipple(){return this._disableRipple}set disableRipple(A){this._disableRipple=A,this._updateRippleDisabled()}_disableRipple=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._updateRippleDisabled()}_disabled=!1;ariaDisabled;disabledInteractive;tabIndex;set _tabindex(A){this.tabIndex=A}constructor(){w(eo).load(lr);let A=this._elementRef.nativeElement;this._isAnchor=A.tagName==="A",this.disabledInteractive=this._config?.disabledInteractive??!1,this.color=this._config?.color??null,this._rippleLoader?.configureRipple(A,{className:"mat-mdc-button-ripple"})}ngAfterViewInit(){this._focusMonitor.monitor(this._elementRef,!0),this._isAnchor&&this._setupAsAnchor()}ngOnDestroy(){this._cleanupClick?.(),this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement)}focus(A="program",i){A?this._focusMonitor.focusVia(this._elementRef.nativeElement,A,i):this._elementRef.nativeElement.focus(i)}_getAriaDisabled(){return this.ariaDisabled!=null?this.ariaDisabled:this._isAnchor?this.disabled||null:this.disabled&&this.disabledInteractive?!0:null}_getDisabledAttribute(){return this.disabledInteractive||!this.disabled?null:!0}_updateRippleDisabled(){this._rippleLoader?.setDisabled(this._elementRef.nativeElement,this.disableRipple||this.disabled)}_getTabIndex(){return this._isAnchor?this.disabled&&!this.disabledInteractive?-1:this.tabIndex:this.tabIndex}_setupAsAnchor(){this._cleanupClick=this._ngZone.runOutsideAngular(()=>this._renderer.listen(this._elementRef.nativeElement,"click",A=>{this.disabled&&(A.preventDefault(),A.stopImmediatePropagation())}))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,hostAttrs:[1,"mat-mdc-button-base"],hostVars:13,hostBindings:function(i,n){i&2&&(te("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled())("tabindex",n._getTabIndex()),ro(n.color?"mat-"+n.color:""),RA("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("mat-unthemed",!n.color)("_mat-animation-noopable",n._animationsDisabled))},inputs:{color:"color",disableRipple:[2,"disableRipple","disableRipple",Be],disabled:[2,"disabled","disabled",Be],ariaDisabled:[2,"aria-disabled","ariaDisabled",Be],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Be],tabIndex:[2,"tabIndex","tabIndex",wG],_tabindex:[2,"tabindex","_tabindex",wG]}})}return t})(),ji=(()=>{class t extends Lb{constructor(){super(),this._rippleLoader.configureRipple(this._elementRef.nativeElement,{centered:!0})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["button","mat-icon-button",""],["a","mat-icon-button",""],["button","matIconButton",""],["a","matIconButton",""]],hostAttrs:[1,"mdc-icon-button","mat-mdc-icon-button"],exportAs:["matButton","matAnchor"],features:[mt],attrs:KnA,ngContentSelectors:UnA,decls:4,vars:0,consts:[[1,"mat-mdc-button-persistent-ripple","mdc-icon-button__ripple"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(Rt(),Kn(0,"span",0),Ve(1),Kn(2,"span",1)(3,"span",2))},styles:[`.mat-mdc-icon-button{-webkit-user-select:none;user-select:none;display:inline-block;position:relative;box-sizing:border-box;border:none;outline:none;background-color:rgba(0,0,0,0);fill:currentColor;text-decoration:none;cursor:pointer;z-index:0;overflow:visible;border-radius:var(--mat-icon-button-container-shape, var(--mat-sys-corner-full, 50%));flex-shrink:0;text-align:center;width:var(--mat-icon-button-state-layer-size, 40px);height:var(--mat-icon-button-state-layer-size, 40px);padding:calc(calc(var(--mat-icon-button-state-layer-size, 40px) - var(--mat-icon-button-icon-size, 24px)) / 2);font-size:var(--mat-icon-button-icon-size, 24px);color:var(--mat-icon-button-icon-color, var(--mat-sys-on-surface-variant));-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-icon-button .mat-mdc-button-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-icon-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-icon-button .mdc-button__label,.mat-mdc-icon-button .mat-icon{z-index:1;position:relative}.mat-mdc-icon-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-icon-button:focus-visible>.mat-focus-indicator::before{content:"";border-radius:inherit}.mat-mdc-icon-button .mat-ripple-element{background-color:var(--mat-icon-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface-variant) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-icon-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-icon-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-icon-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-icon-button-touch-target-size, 48px);display:var(--mat-icon-button-touch-target-display, block);left:50%;width:var(--mat-icon-button-touch-target-size, 48px);transform:translate(-50%, -50%)}.mat-mdc-icon-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-icon-button[disabled],.mat-mdc-icon-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-icon-button-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-icon-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-icon-button img,.mat-mdc-icon-button svg{width:var(--mat-icon-button-icon-size, 24px);height:var(--mat-icon-button-icon-size, 24px);vertical-align:baseline}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple{border-radius:var(--mat-icon-button-container-shape, var(--mat-sys-corner-full, 50%))}.mat-mdc-icon-button[hidden]{display:none}.mat-mdc-icon-button.mat-unthemed:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-primary:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-accent:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-warn:not(.mdc-ripple-upgraded):focus::before{background:rgba(0,0,0,0);opacity:1} -`,`@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-button-base.mat-tonal-button,.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}} -`],encapsulation:2,changeDetection:0})}return t})();var JnA=new kA("cdk-dir-doc",{providedIn:"root",factory:()=>w(ti)}),OnA=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;function DG(t){let e=t?.toLowerCase()||"";return e==="auto"&&typeof navigator<"u"&&navigator?.language?OnA.test(navigator.language)?"rtl":"ltr":e==="rtl"?"rtl":"ltr"}var fo=(()=>{class t{get value(){return this.valueSignal()}valueSignal=bA("ltr");change=new LA;constructor(){let A=w(JnA,{optional:!0});if(A){let i=A.body?A.body.dir:null,n=A.documentElement?A.documentElement.dir:null;this.valueSignal.set(DG(i||n||"ltr"))}}ngOnDestroy(){this.change.complete()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var fi=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})();var Yc=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();var YnA=["matButton",""],HnA=[[["",8,"material-icons",3,"iconPositionEnd",""],["mat-icon",3,"iconPositionEnd",""],["","matButtonIcon","",3,"iconPositionEnd",""]],"*",[["","iconPositionEnd","",8,"material-icons"],["mat-icon","iconPositionEnd",""],["","matButtonIcon","","iconPositionEnd",""]]],znA=[".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])","*",".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"];var yG=new Map([["text",["mat-mdc-button"]],["filled",["mdc-button--unelevated","mat-mdc-unelevated-button"]],["elevated",["mdc-button--raised","mat-mdc-raised-button"]],["outlined",["mdc-button--outlined","mat-mdc-outlined-button"]],["tonal",["mat-tonal-button"]]]),pi=(()=>{class t extends Lb{get appearance(){return this._appearance}set appearance(A){this.setAppearance(A||this._config?.defaultAppearance||"text")}_appearance=null;constructor(){super();let A=PnA(this._elementRef.nativeElement);A&&this.setAppearance(A)}setAppearance(A){if(A===this._appearance)return;let i=this._elementRef.nativeElement.classList,n=this._appearance?yG.get(this._appearance):null,o=yG.get(A);n&&i.remove(...n),i.add(...o),this._appearance=A}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["button","matButton",""],["a","matButton",""],["button","mat-button",""],["button","mat-raised-button",""],["button","mat-flat-button",""],["button","mat-stroked-button",""],["a","mat-button",""],["a","mat-raised-button",""],["a","mat-flat-button",""],["a","mat-stroked-button",""]],hostAttrs:[1,"mdc-button"],inputs:{appearance:[0,"matButton","appearance"]},exportAs:["matButton","matAnchor"],features:[mt],attrs:YnA,ngContentSelectors:znA,decls:7,vars:4,consts:[[1,"mat-mdc-button-persistent-ripple"],[1,"mdc-button__label"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(Rt(HnA),Kn(0,"span",0),Ve(1),wn(2,"span",1),Ve(3,1),Gn(),Ve(4,2),Kn(5,"span",2)(6,"span",3)),i&2&&RA("mdc-button__ripple",!n._isFab)("mdc-fab__ripple",n._isFab)},styles:[`.mat-mdc-button-base{text-decoration:none}.mat-mdc-button-base .mat-icon{min-height:fit-content;flex-shrink:0}@media(hover: none){.mat-mdc-button-base:hover>span.mat-mdc-button-persistent-ripple::before{opacity:0}}.mdc-button{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:64px;border:none;outline:none;line-height:inherit;-webkit-appearance:none;overflow:visible;vertical-align:middle;background:rgba(0,0,0,0);padding:0 8px}.mdc-button::-moz-focus-inner{padding:0;border:0}.mdc-button:active{outline:none}.mdc-button:hover{cursor:pointer}.mdc-button:disabled{cursor:default;pointer-events:none}.mdc-button[hidden]{display:none}.mdc-button .mdc-button__label{position:relative}.mat-mdc-button{padding:0 var(--mat-button-text-horizontal-padding, 12px);height:var(--mat-button-text-container-height, 40px);font-family:var(--mat-button-text-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-text-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-text-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-text-label-text-transform);font-weight:var(--mat-button-text-label-text-weight, var(--mat-sys-label-large-weight))}.mat-mdc-button,.mat-mdc-button .mdc-button__ripple{border-radius:var(--mat-button-text-container-shape, var(--mat-sys-corner-full))}.mat-mdc-button:not(:disabled){color:var(--mat-button-text-label-text-color, var(--mat-sys-primary))}.mat-mdc-button[disabled],.mat-mdc-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-text-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-button:has(.material-icons,mat-icon,[matButtonIcon]){padding:0 var(--mat-button-text-with-icon-horizontal-padding, 16px)}.mat-mdc-button>.mat-icon{margin-right:var(--mat-button-text-icon-spacing, 8px);margin-left:var(--mat-button-text-icon-offset, -4px)}[dir=rtl] .mat-mdc-button>.mat-icon{margin-right:var(--mat-button-text-icon-offset, -4px);margin-left:var(--mat-button-text-icon-spacing, 8px)}.mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-text-icon-offset, -4px);margin-left:var(--mat-button-text-icon-spacing, 8px)}[dir=rtl] .mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-text-icon-spacing, 8px);margin-left:var(--mat-button-text-icon-offset, -4px)}.mat-mdc-button .mat-ripple-element{background-color:var(--mat-button-text-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-text-state-layer-color, var(--mat-sys-primary))}.mat-mdc-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-text-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-text-touch-target-size, 48px);display:var(--mat-button-text-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-unelevated-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-filled-container-height, 40px);font-family:var(--mat-button-filled-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-filled-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-filled-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-filled-label-text-transform);font-weight:var(--mat-button-filled-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-filled-horizontal-padding, 24px)}.mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-button-filled-icon-spacing, 8px);margin-left:var(--mat-button-filled-icon-offset, -8px)}[dir=rtl] .mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-button-filled-icon-offset, -8px);margin-left:var(--mat-button-filled-icon-spacing, 8px)}.mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-filled-icon-offset, -8px);margin-left:var(--mat-button-filled-icon-spacing, 8px)}[dir=rtl] .mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-filled-icon-spacing, 8px);margin-left:var(--mat-button-filled-icon-offset, -8px)}.mat-mdc-unelevated-button .mat-ripple-element{background-color:var(--mat-button-filled-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-filled-state-layer-color, var(--mat-sys-on-primary))}.mat-mdc-unelevated-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-filled-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-unelevated-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-unelevated-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-unelevated-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-unelevated-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-filled-touch-target-size, 48px);display:var(--mat-button-filled-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-unelevated-button:not(:disabled){color:var(--mat-button-filled-label-text-color, var(--mat-sys-on-primary));background-color:var(--mat-button-filled-container-color, var(--mat-sys-primary))}.mat-mdc-unelevated-button,.mat-mdc-unelevated-button .mdc-button__ripple{border-radius:var(--mat-button-filled-container-shape, var(--mat-sys-corner-full))}.mat-mdc-unelevated-button[disabled],.mat-mdc-unelevated-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-filled-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-filled-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-raised-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);box-shadow:var(--mat-button-protected-container-elevation-shadow, var(--mat-sys-level1));height:var(--mat-button-protected-container-height, 40px);font-family:var(--mat-button-protected-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-protected-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-protected-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-protected-label-text-transform);font-weight:var(--mat-button-protected-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-protected-horizontal-padding, 24px)}.mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-button-protected-icon-spacing, 8px);margin-left:var(--mat-button-protected-icon-offset, -8px)}[dir=rtl] .mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-button-protected-icon-offset, -8px);margin-left:var(--mat-button-protected-icon-spacing, 8px)}.mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-protected-icon-offset, -8px);margin-left:var(--mat-button-protected-icon-spacing, 8px)}[dir=rtl] .mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-protected-icon-spacing, 8px);margin-left:var(--mat-button-protected-icon-offset, -8px)}.mat-mdc-raised-button .mat-ripple-element{background-color:var(--mat-button-protected-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-protected-state-layer-color, var(--mat-sys-primary))}.mat-mdc-raised-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-protected-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-raised-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-raised-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-raised-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-raised-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-protected-touch-target-size, 48px);display:var(--mat-button-protected-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-raised-button:not(:disabled){color:var(--mat-button-protected-label-text-color, var(--mat-sys-primary));background-color:var(--mat-button-protected-container-color, var(--mat-sys-surface))}.mat-mdc-raised-button,.mat-mdc-raised-button .mdc-button__ripple{border-radius:var(--mat-button-protected-container-shape, var(--mat-sys-corner-full))}@media(hover: hover){.mat-mdc-raised-button:hover{box-shadow:var(--mat-button-protected-hover-container-elevation-shadow, var(--mat-sys-level2))}}.mat-mdc-raised-button:focus{box-shadow:var(--mat-button-protected-focus-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button:active,.mat-mdc-raised-button:focus:active{box-shadow:var(--mat-button-protected-pressed-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button[disabled],.mat-mdc-raised-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-protected-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-protected-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-raised-button[disabled].mat-mdc-button-disabled,.mat-mdc-raised-button.mat-mdc-button-disabled.mat-mdc-button-disabled{box-shadow:var(--mat-button-protected-disabled-container-elevation-shadow, var(--mat-sys-level0))}.mat-mdc-raised-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-outlined-button{border-style:solid;transition:border 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-outlined-container-height, 40px);font-family:var(--mat-button-outlined-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-outlined-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-outlined-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-outlined-label-text-transform);font-weight:var(--mat-button-outlined-label-text-weight, var(--mat-sys-label-large-weight));border-radius:var(--mat-button-outlined-container-shape, var(--mat-sys-corner-full));border-width:var(--mat-button-outlined-outline-width, 1px);padding:0 var(--mat-button-outlined-horizontal-padding, 24px)}.mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-button-outlined-icon-spacing, 8px);margin-left:var(--mat-button-outlined-icon-offset, -8px)}[dir=rtl] .mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-button-outlined-icon-offset, -8px);margin-left:var(--mat-button-outlined-icon-spacing, 8px)}.mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-outlined-icon-offset, -8px);margin-left:var(--mat-button-outlined-icon-spacing, 8px)}[dir=rtl] .mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-outlined-icon-spacing, 8px);margin-left:var(--mat-button-outlined-icon-offset, -8px)}.mat-mdc-outlined-button .mat-ripple-element{background-color:var(--mat-button-outlined-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-outlined-state-layer-color, var(--mat-sys-primary))}.mat-mdc-outlined-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-outlined-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-outlined-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-outlined-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-outlined-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-outlined-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-outlined-touch-target-size, 48px);display:var(--mat-button-outlined-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-outlined-button:not(:disabled){color:var(--mat-button-outlined-label-text-color, var(--mat-sys-primary));border-color:var(--mat-button-outlined-outline-color, var(--mat-sys-outline))}.mat-mdc-outlined-button[disabled],.mat-mdc-outlined-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-outlined-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:var(--mat-button-outlined-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-tonal-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-tonal-container-height, 40px);font-family:var(--mat-button-tonal-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-tonal-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-tonal-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-tonal-label-text-transform);font-weight:var(--mat-button-tonal-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-tonal-horizontal-padding, 24px)}.mat-tonal-button:not(:disabled){color:var(--mat-button-tonal-label-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-button-tonal-container-color, var(--mat-sys-secondary-container))}.mat-tonal-button,.mat-tonal-button .mdc-button__ripple{border-radius:var(--mat-button-tonal-container-shape, var(--mat-sys-corner-full))}.mat-tonal-button[disabled],.mat-tonal-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-tonal-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-tonal-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-tonal-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-tonal-button>.mat-icon{margin-right:var(--mat-button-tonal-icon-spacing, 8px);margin-left:var(--mat-button-tonal-icon-offset, -8px)}[dir=rtl] .mat-tonal-button>.mat-icon{margin-right:var(--mat-button-tonal-icon-offset, -8px);margin-left:var(--mat-button-tonal-icon-spacing, 8px)}.mat-tonal-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-tonal-icon-offset, -8px);margin-left:var(--mat-button-tonal-icon-spacing, 8px)}[dir=rtl] .mat-tonal-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-tonal-icon-spacing, 8px);margin-left:var(--mat-button-tonal-icon-offset, -8px)}.mat-tonal-button .mat-ripple-element{background-color:var(--mat-button-tonal-ripple-color, color-mix(in srgb, var(--mat-sys-on-secondary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-tonal-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-tonal-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-tonal-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-tonal-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-tonal-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-tonal-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-tonal-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-tonal-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-tonal-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-tonal-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-tonal-touch-target-size, 48px);display:var(--mat-button-tonal-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-button,.mat-mdc-unelevated-button,.mat-mdc-raised-button,.mat-mdc-outlined-button,.mat-tonal-button{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before,.mat-tonal-button .mat-mdc-button-ripple,.mat-tonal-button .mat-mdc-button-persistent-ripple,.mat-tonal-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-tonal-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before,.mat-tonal-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-button .mdc-button__label,.mat-mdc-button .mat-icon,.mat-mdc-unelevated-button .mdc-button__label,.mat-mdc-unelevated-button .mat-icon,.mat-mdc-raised-button .mdc-button__label,.mat-mdc-raised-button .mat-icon,.mat-mdc-outlined-button .mdc-button__label,.mat-mdc-outlined-button .mat-icon,.mat-tonal-button .mdc-button__label,.mat-tonal-button .mat-icon{z-index:1;position:relative}.mat-mdc-button .mat-focus-indicator,.mat-mdc-unelevated-button .mat-focus-indicator,.mat-mdc-raised-button .mat-focus-indicator,.mat-mdc-outlined-button .mat-focus-indicator,.mat-tonal-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-unelevated-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-raised-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-outlined-button:focus-visible>.mat-focus-indicator::before,.mat-tonal-button:focus-visible>.mat-focus-indicator::before{content:"";border-radius:inherit}.mat-mdc-button._mat-animation-noopable,.mat-mdc-unelevated-button._mat-animation-noopable,.mat-mdc-raised-button._mat-animation-noopable,.mat-mdc-outlined-button._mat-animation-noopable,.mat-tonal-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-button>.mat-icon,.mat-mdc-unelevated-button>.mat-icon,.mat-mdc-raised-button>.mat-icon,.mat-mdc-outlined-button>.mat-icon,.mat-tonal-button>.mat-icon{display:inline-block;position:relative;vertical-align:top;font-size:1.125rem;height:1.125rem;width:1.125rem}.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mdc-button__ripple{top:-1px;left:-1px;bottom:-1px;right:-1px}.mat-mdc-unelevated-button .mat-focus-indicator::before,.mat-tonal-button .mat-focus-indicator::before,.mat-mdc-raised-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-outlined-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 3px)*-1)} -`,`@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-button-base.mat-tonal-button,.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}} -`],encapsulation:2,changeDetection:0})}return t})();function PnA(t){return t.hasAttribute("mat-raised-button")?"elevated":t.hasAttribute("mat-stroked-button")?"outlined":t.hasAttribute("mat-flat-button")?"filled":t.hasAttribute("mat-button")?"text":null}var qi=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Yc,fi]})}return t})();var Gb=class{_box;_destroyed=new ie;_resizeSubject=new ie;_resizeObserver;_elementObservables=new Map;constructor(e){this._box=e,typeof ResizeObserver<"u"&&(this._resizeObserver=new ResizeObserver(A=>this._resizeSubject.next(A)))}observe(e){return this._elementObservables.has(e)||this._elementObservables.set(e,new vi(A=>{let i=this._resizeSubject.subscribe(A);return this._resizeObserver?.observe(e,{box:this._box}),()=>{this._resizeObserver?.unobserve(e),i.unsubscribe(),this._elementObservables.delete(e)}}).pipe(gt(A=>A.some(i=>i.target===e)),Gs({bufferSize:1,refCount:!0}),Qt(this._destroyed))),this._elementObservables.get(e)}destroy(){this._destroyed.next(),this._destroyed.complete(),this._resizeSubject.complete(),this._elementObservables.clear()}},kp=(()=>{class t{_cleanupErrorListener;_observers=new Map;_ngZone=w(qe);constructor(){typeof ResizeObserver<"u"}ngOnDestroy(){for(let[,A]of this._observers)A.destroy();this._observers.clear(),this._cleanupErrorListener?.()}observe(A,i){let n=i?.box||"content-box";return this._observers.has(n)||this._observers.set(n,new Gb(n)),this._observers.get(n).observe(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var jnA=["notch"],qnA=["matFormFieldNotchedOutline",""],VnA=["*"],vG=["iconPrefixContainer"],bG=["textPrefixContainer"],MG=["iconSuffixContainer"],SG=["textSuffixContainer"],WnA=["textField"],ZnA=["*",[["mat-label"]],[["","matPrefix",""],["","matIconPrefix",""]],[["","matTextPrefix",""]],[["","matTextSuffix",""]],[["","matSuffix",""],["","matIconSuffix",""]],[["mat-error"],["","matError",""]],[["mat-hint",3,"align","end"]],[["mat-hint","align","end"]]],XnA=["*","mat-label","[matPrefix], [matIconPrefix]","[matTextPrefix]","[matTextSuffix]","[matSuffix], [matIconSuffix]","mat-error, [matError]","mat-hint:not([align='end'])","mat-hint[align='end']"];function $nA(t,e){t&1&&hA(0,"span",21)}function AoA(t,e){if(t&1&&(B(0,"label",20),Ve(1,1),O(2,$nA,1,0,"span",21),Q()),t&2){let A=p(2);H("floating",A._shouldLabelFloat())("monitorResize",A._hasOutline())("id",A._labelId),te("for",A._control.disableAutomaticLabeling?null:A._control.id),u(2),Y(!A.hideRequiredMarker&&A._control.required?2:-1)}}function eoA(t,e){if(t&1&&O(0,AoA,3,5,"label",20),t&2){let A=p();Y(A._hasFloatingLabel()?0:-1)}}function toA(t,e){t&1&&hA(0,"div",7)}function ioA(t,e){}function noA(t,e){if(t&1&&Et(0,ioA,0,0,"ng-template",13),t&2){p(2);let A=Qi(1);H("ngTemplateOutlet",A)}}function ooA(t,e){if(t&1&&(B(0,"div",9),O(1,noA,1,1,null,13),Q()),t&2){let A=p();H("matFormFieldNotchedOutlineOpen",A._shouldLabelFloat()),u(),Y(A._forceDisplayInfixLabel()?-1:1)}}function aoA(t,e){t&1&&(B(0,"div",10,2),Ve(2,2),Q())}function roA(t,e){t&1&&(B(0,"div",11,3),Ve(2,3),Q())}function soA(t,e){}function loA(t,e){if(t&1&&Et(0,soA,0,0,"ng-template",13),t&2){p();let A=Qi(1);H("ngTemplateOutlet",A)}}function goA(t,e){t&1&&(B(0,"div",14,4),Ve(2,4),Q())}function coA(t,e){t&1&&(B(0,"div",15,5),Ve(2,5),Q())}function CoA(t,e){t&1&&hA(0,"div",16)}function IoA(t,e){t&1&&(B(0,"div",18),Ve(1,6),Q())}function doA(t,e){if(t&1&&(B(0,"mat-hint",22),y(1),Q()),t&2){let A=p(2);H("id",A._hintLabelId),u(),lA(A.hintLabel)}}function BoA(t,e){if(t&1&&(B(0,"div",19),O(1,doA,2,2,"mat-hint",22),Ve(2,7),hA(3,"div",23),Ve(4,8),Q()),t&2){let A=p();u(),Y(A.hintLabel?1:-1)}}var vs=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["mat-label"]]})}return t})(),LG=new kA("MatError"),Kb=(()=>{class t{id=w(In).getId("mat-mdc-error-");constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["mat-error"],["","matError",""]],hostAttrs:[1,"mat-mdc-form-field-error","mat-mdc-form-field-bottom-align"],hostVars:1,hostBindings:function(i,n){i&2&&ha("id",n.id)},inputs:{id:"id"},features:[Bt([{provide:LG,useExisting:t}])]})}return t})(),s1=(()=>{class t{align="start";id=w(In).getId("mat-mdc-hint-");static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["mat-hint"]],hostAttrs:[1,"mat-mdc-form-field-hint","mat-mdc-form-field-bottom-align"],hostVars:4,hostBindings:function(i,n){i&2&&(ha("id",n.id),te("align",null),RA("mat-mdc-form-field-hint-end",n.align==="end"))},inputs:{align:"align",id:"id"}})}return t})(),GG=new kA("MatPrefix"),Ub=(()=>{class t{set _isTextSelector(A){this._isText=!0}_isText=!1;static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matPrefix",""],["","matIconPrefix",""],["","matTextPrefix",""]],inputs:{_isTextSelector:[0,"matTextPrefix","_isTextSelector"]},features:[Bt([{provide:GG,useExisting:t}])]})}return t})(),KG=new kA("MatSuffix"),Tb=(()=>{class t{set _isTextSelector(A){this._isText=!0}_isText=!1;static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matSuffix",""],["","matIconSuffix",""],["","matTextSuffix",""]],inputs:{_isTextSelector:[0,"matTextSuffix","_isTextSelector"]},features:[Bt([{provide:KG,useExisting:t}])]})}return t})(),UG=new kA("FloatingLabelParent"),kG=(()=>{class t{_elementRef=w(ce);get floating(){return this._floating}set floating(A){this._floating=A,this.monitorResize&&this._handleResize()}_floating=!1;get monitorResize(){return this._monitorResize}set monitorResize(A){this._monitorResize=A,this._monitorResize?this._subscribeToResize():this._resizeSubscription.unsubscribe()}_monitorResize=!1;_resizeObserver=w(kp);_ngZone=w(qe);_parent=w(UG);_resizeSubscription=new bo;constructor(){}ngOnDestroy(){this._resizeSubscription.unsubscribe()}getWidth(){return EoA(this._elementRef.nativeElement)}get element(){return this._elementRef.nativeElement}_handleResize(){setTimeout(()=>this._parent._handleLabelResized())}_subscribeToResize(){this._resizeSubscription.unsubscribe(),this._ngZone.runOutsideAngular(()=>{this._resizeSubscription=this._resizeObserver.observe(this._elementRef.nativeElement,{box:"border-box"}).subscribe(()=>this._handleResize())})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["label","matFormFieldFloatingLabel",""]],hostAttrs:[1,"mdc-floating-label","mat-mdc-floating-label"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mdc-floating-label--float-above",n.floating)},inputs:{floating:"floating",monitorResize:"monitorResize"}})}return t})();function EoA(t){let e=t;if(e.offsetParent!==null)return e.scrollWidth;let A=e.cloneNode(!0);A.style.setProperty("position","absolute"),A.style.setProperty("transform","translate(-9999px, -9999px)"),document.documentElement.appendChild(A);let i=A.scrollWidth;return A.remove(),i}var xG="mdc-line-ripple--active",xp="mdc-line-ripple--deactivating",_G=(()=>{class t{_elementRef=w(ce);_cleanupTransitionEnd;constructor(){let A=w(qe),i=w(Pi);A.runOutsideAngular(()=>{this._cleanupTransitionEnd=i.listen(this._elementRef.nativeElement,"transitionend",this._handleTransitionEnd)})}activate(){let A=this._elementRef.nativeElement.classList;A.remove(xp),A.add(xG)}deactivate(){this._elementRef.nativeElement.classList.add(xp)}_handleTransitionEnd=A=>{let i=this._elementRef.nativeElement.classList,n=i.contains(xp);A.propertyName==="opacity"&&n&&i.remove(xG,xp)};ngOnDestroy(){this._cleanupTransitionEnd()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["div","matFormFieldLineRipple",""]],hostAttrs:[1,"mdc-line-ripple"]})}return t})(),RG=(()=>{class t{_elementRef=w(ce);_ngZone=w(qe);open=!1;_notch;ngAfterViewInit(){let A=this._elementRef.nativeElement,i=A.querySelector(".mdc-floating-label");i?(A.classList.add("mdc-notched-outline--upgraded"),typeof requestAnimationFrame=="function"&&(i.style.transitionDuration="0s",this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>i.style.transitionDuration="")}))):A.classList.add("mdc-notched-outline--no-label")}_setNotchWidth(A){let i=this._notch.nativeElement;!this.open||!A?i.style.width="":i.style.width=`calc(${A}px * var(--mat-mdc-form-field-floating-label-scale, 0.75) + 9px)`}_setMaxWidth(A){this._notch.nativeElement.style.setProperty("--mat-form-field-notch-max-width",`calc(100% - ${A}px)`)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["div","matFormFieldNotchedOutline",""]],viewQuery:function(i,n){if(i&1&&Jt(jnA,5),i&2){let o;ae(o=re())&&(n._notch=o.first)}},hostAttrs:[1,"mdc-notched-outline"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mdc-notched-outline--notched",n.open)},inputs:{open:[0,"matFormFieldNotchedOutlineOpen","open"]},attrs:qnA,ngContentSelectors:VnA,decls:5,vars:0,consts:[["notch",""],[1,"mat-mdc-notch-piece","mdc-notched-outline__leading"],[1,"mat-mdc-notch-piece","mdc-notched-outline__notch"],[1,"mat-mdc-notch-piece","mdc-notched-outline__trailing"]],template:function(i,n){i&1&&(Rt(),Kn(0,"div",1),wn(1,"div",2,0),Ve(3),Gn(),Kn(4,"div",3))},encapsulation:2,changeDetection:0})}return t})(),eu=(()=>{class t{value=null;stateChanges;id;placeholder;ngControl=null;focused=!1;empty=!1;shouldLabelFloat=!1;required=!1;disabled=!1;errorState=!1;controlType;autofilled;userAriaDescribedBy;disableAutomaticLabeling;describedByIds;static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t})}return t})();var tu=new kA("MatFormField"),hoA=new kA("MAT_FORM_FIELD_DEFAULT_OPTIONS"),NG="fill",QoA="auto",FG="fixed",uoA="translateY(-50%)",Ko=(()=>{class t{_elementRef=w(ce);_changeDetectorRef=w(wt);_platform=w(gi);_idGenerator=w(In);_ngZone=w(qe);_defaults=w(hoA,{optional:!0});_currentDirection;_textField;_iconPrefixContainer;_textPrefixContainer;_iconSuffixContainer;_textSuffixContainer;_floatingLabel;_notchedOutline;_lineRipple;_iconPrefixContainerSignal=So("iconPrefixContainer");_textPrefixContainerSignal=So("textPrefixContainer");_iconSuffixContainerSignal=So("iconSuffixContainer");_textSuffixContainerSignal=So("textSuffixContainer");_prefixSuffixContainers=pe(()=>[this._iconPrefixContainerSignal(),this._textPrefixContainerSignal(),this._iconSuffixContainerSignal(),this._textSuffixContainerSignal()].map(A=>A?.nativeElement).filter(A=>A!==void 0));_formFieldControl;_prefixChildren;_suffixChildren;_errorChildren;_hintChildren;_labelChild=J0(vs);get hideRequiredMarker(){return this._hideRequiredMarker}set hideRequiredMarker(A){this._hideRequiredMarker=mr(A)}_hideRequiredMarker=!1;color="primary";get floatLabel(){return this._floatLabel||this._defaults?.floatLabel||QoA}set floatLabel(A){A!==this._floatLabel&&(this._floatLabel=A,this._changeDetectorRef.markForCheck())}_floatLabel;get appearance(){return this._appearanceSignal()}set appearance(A){let i=A||this._defaults?.appearance||NG;this._appearanceSignal.set(i)}_appearanceSignal=bA(NG);get subscriptSizing(){return this._subscriptSizing||this._defaults?.subscriptSizing||FG}set subscriptSizing(A){this._subscriptSizing=A||this._defaults?.subscriptSizing||FG}_subscriptSizing=null;get hintLabel(){return this._hintLabel}set hintLabel(A){this._hintLabel=A,this._processHints()}_hintLabel="";_hasIconPrefix=!1;_hasTextPrefix=!1;_hasIconSuffix=!1;_hasTextSuffix=!1;_labelId=this._idGenerator.getId("mat-mdc-form-field-label-");_hintLabelId=this._idGenerator.getId("mat-mdc-hint-");_describedByIds;get _control(){return this._explicitFormFieldControl||this._formFieldControl}set _control(A){this._explicitFormFieldControl=A}_destroyed=new ie;_isFocused=null;_explicitFormFieldControl;_previousControl=null;_previousControlValidatorFn=null;_stateChanges;_valueChanges;_describedByChanges;_outlineLabelOffsetResizeObserver=null;_animationsDisabled=An();constructor(){let A=this._defaults,i=w(fo);A&&(A.appearance&&(this.appearance=A.appearance),this._hideRequiredMarker=!!A?.hideRequiredMarker,A.color&&(this.color=A.color)),Ao(()=>this._currentDirection=i.valueSignal()),this._syncOutlineLabelOffset()}ngAfterViewInit(){this._updateFocusState(),this._animationsDisabled||this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._elementRef.nativeElement.classList.add("mat-form-field-animations-enabled")},300)}),this._changeDetectorRef.detectChanges()}ngAfterContentInit(){this._assertFormFieldControl(),this._initializeSubscript(),this._initializePrefixAndSuffix()}ngAfterContentChecked(){this._assertFormFieldControl(),this._control!==this._previousControl&&(this._initializeControl(this._previousControl),this._control.ngControl&&this._control.ngControl.control&&(this._previousControlValidatorFn=this._control.ngControl.control.validator),this._previousControl=this._control),this._control.ngControl&&this._control.ngControl.control&&this._control.ngControl.control.validator!==this._previousControlValidatorFn&&this._changeDetectorRef.markForCheck()}ngOnDestroy(){this._outlineLabelOffsetResizeObserver?.disconnect(),this._stateChanges?.unsubscribe(),this._valueChanges?.unsubscribe(),this._describedByChanges?.unsubscribe(),this._destroyed.next(),this._destroyed.complete()}getLabelId=pe(()=>this._hasFloatingLabel()?this._labelId:null);getConnectedOverlayOrigin(){return this._textField||this._elementRef}_animateAndLockLabel(){this._hasFloatingLabel()&&(this.floatLabel="always")}_initializeControl(A){let i=this._control,n="mat-mdc-form-field-type-";A&&this._elementRef.nativeElement.classList.remove(n+A.controlType),i.controlType&&this._elementRef.nativeElement.classList.add(n+i.controlType),this._stateChanges?.unsubscribe(),this._stateChanges=i.stateChanges.subscribe(()=>{this._updateFocusState(),this._changeDetectorRef.markForCheck()}),this._describedByChanges?.unsubscribe(),this._describedByChanges=i.stateChanges.pipe(Sn([void 0,void 0]),we(()=>[i.errorState,i.userAriaDescribedBy]),VC(),gt(([[o,a],[r,s]])=>o!==r||a!==s)).subscribe(()=>this._syncDescribedByIds()),this._valueChanges?.unsubscribe(),i.ngControl&&i.ngControl.valueChanges&&(this._valueChanges=i.ngControl.valueChanges.pipe(Qt(this._destroyed)).subscribe(()=>this._changeDetectorRef.markForCheck()))}_checkPrefixAndSuffixTypes(){this._hasIconPrefix=!!this._prefixChildren.find(A=>!A._isText),this._hasTextPrefix=!!this._prefixChildren.find(A=>A._isText),this._hasIconSuffix=!!this._suffixChildren.find(A=>!A._isText),this._hasTextSuffix=!!this._suffixChildren.find(A=>A._isText)}_initializePrefixAndSuffix(){this._checkPrefixAndSuffixTypes(),Ki(this._prefixChildren.changes,this._suffixChildren.changes).subscribe(()=>{this._checkPrefixAndSuffixTypes(),this._changeDetectorRef.markForCheck()})}_initializeSubscript(){this._hintChildren.changes.subscribe(()=>{this._processHints(),this._changeDetectorRef.markForCheck()}),this._errorChildren.changes.subscribe(()=>{this._syncDescribedByIds(),this._changeDetectorRef.markForCheck()}),this._validateHints(),this._syncDescribedByIds()}_assertFormFieldControl(){this._control}_updateFocusState(){let A=this._control.focused;A&&!this._isFocused?(this._isFocused=!0,this._lineRipple?.activate()):!A&&(this._isFocused||this._isFocused===null)&&(this._isFocused=!1,this._lineRipple?.deactivate()),this._elementRef.nativeElement.classList.toggle("mat-focused",A),this._textField?.nativeElement.classList.toggle("mdc-text-field--focused",A)}_syncOutlineLabelOffset(){$F({earlyRead:()=>{if(this._appearanceSignal()!=="outline")return this._outlineLabelOffsetResizeObserver?.disconnect(),null;if(globalThis.ResizeObserver){this._outlineLabelOffsetResizeObserver||=new globalThis.ResizeObserver(()=>{this._writeOutlinedLabelStyles(this._getOutlinedLabelOffset())});for(let A of this._prefixSuffixContainers())this._outlineLabelOffsetResizeObserver.observe(A,{box:"border-box"})}return this._getOutlinedLabelOffset()},write:A=>this._writeOutlinedLabelStyles(A())})}_shouldAlwaysFloat(){return this.floatLabel==="always"}_hasOutline(){return this.appearance==="outline"}_forceDisplayInfixLabel(){return!this._platform.isBrowser&&this._prefixChildren.length&&!this._shouldLabelFloat()}_hasFloatingLabel=pe(()=>!!this._labelChild());_shouldLabelFloat(){return this._hasFloatingLabel()?this._control.shouldLabelFloat||this._shouldAlwaysFloat():!1}_shouldForward(A){let i=this._control?this._control.ngControl:null;return i&&i[A]}_getSubscriptMessageType(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"}_handleLabelResized(){this._refreshOutlineNotchWidth()}_refreshOutlineNotchWidth(){!this._hasOutline()||!this._floatingLabel||!this._shouldLabelFloat()?this._notchedOutline?._setNotchWidth(0):this._notchedOutline?._setNotchWidth(this._floatingLabel.getWidth())}_processHints(){this._validateHints(),this._syncDescribedByIds()}_validateHints(){this._hintChildren}_syncDescribedByIds(){if(this._control){let A=[];if(this._control.userAriaDescribedBy&&typeof this._control.userAriaDescribedBy=="string"&&A.push(...this._control.userAriaDescribedBy.split(" ")),this._getSubscriptMessageType()==="hint"){let o=this._hintChildren?this._hintChildren.find(r=>r.align==="start"):null,a=this._hintChildren?this._hintChildren.find(r=>r.align==="end"):null;o?A.push(o.id):this._hintLabel&&A.push(this._hintLabelId),a&&A.push(a.id)}else this._errorChildren&&A.push(...this._errorChildren.map(o=>o.id));let i=this._control.describedByIds,n;if(i){let o=this._describedByIds||A;n=A.concat(i.filter(a=>a&&!o.includes(a)))}else n=A;this._control.setDescribedByIds(n),this._describedByIds=A}}_getOutlinedLabelOffset(){if(!this._hasOutline()||!this._floatingLabel)return null;if(!this._iconPrefixContainer&&!this._textPrefixContainer)return["",null];if(!this._isAttachedToDom())return null;let A=this._iconPrefixContainer?.nativeElement,i=this._textPrefixContainer?.nativeElement,n=this._iconSuffixContainer?.nativeElement,o=this._textSuffixContainer?.nativeElement,a=A?.getBoundingClientRect().width??0,r=i?.getBoundingClientRect().width??0,s=n?.getBoundingClientRect().width??0,l=o?.getBoundingClientRect().width??0,g=this._currentDirection==="rtl"?"-1":"1",C=`${a+r}px`,d=`calc(${g} * (${C} + var(--mat-mdc-form-field-label-offset-x, 0px)))`,h=`var(--mat-mdc-form-field-label-transform, ${uoA} translateX(${d}))`,E=a+r+s+l;return[h,E]}_writeOutlinedLabelStyles(A){if(A!==null){let[i,n]=A;this._floatingLabel&&(this._floatingLabel.element.style.transform=i),n!==null&&this._notchedOutline?._setMaxWidth(n)}}_isAttachedToDom(){let A=this._elementRef.nativeElement;if(A.getRootNode){let i=A.getRootNode();return i&&i!==A}return document.documentElement.contains(A)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-form-field"]],contentQueries:function(i,n,o){if(i&1&&(ep(o,n._labelChild,vs,5),jo(o,eu,5)(o,GG,5)(o,KG,5)(o,LG,5)(o,s1,5)),i&2){ur();let a;ae(a=re())&&(n._formFieldControl=a.first),ae(a=re())&&(n._prefixChildren=a),ae(a=re())&&(n._suffixChildren=a),ae(a=re())&&(n._errorChildren=a),ae(a=re())&&(n._hintChildren=a)}},viewQuery:function(i,n){if(i&1&&(ns(n._iconPrefixContainerSignal,vG,5)(n._textPrefixContainerSignal,bG,5)(n._iconSuffixContainerSignal,MG,5)(n._textSuffixContainerSignal,SG,5),Jt(WnA,5)(vG,5)(bG,5)(MG,5)(SG,5)(kG,5)(RG,5)(_G,5)),i&2){ur(4);let o;ae(o=re())&&(n._textField=o.first),ae(o=re())&&(n._iconPrefixContainer=o.first),ae(o=re())&&(n._textPrefixContainer=o.first),ae(o=re())&&(n._iconSuffixContainer=o.first),ae(o=re())&&(n._textSuffixContainer=o.first),ae(o=re())&&(n._floatingLabel=o.first),ae(o=re())&&(n._notchedOutline=o.first),ae(o=re())&&(n._lineRipple=o.first)}},hostAttrs:[1,"mat-mdc-form-field"],hostVars:38,hostBindings:function(i,n){i&2&&RA("mat-mdc-form-field-label-always-float",n._shouldAlwaysFloat())("mat-mdc-form-field-has-icon-prefix",n._hasIconPrefix)("mat-mdc-form-field-has-icon-suffix",n._hasIconSuffix)("mat-form-field-invalid",n._control.errorState)("mat-form-field-disabled",n._control.disabled)("mat-form-field-autofilled",n._control.autofilled)("mat-form-field-appearance-fill",n.appearance=="fill")("mat-form-field-appearance-outline",n.appearance=="outline")("mat-form-field-hide-placeholder",n._hasFloatingLabel()&&!n._shouldLabelFloat())("mat-primary",n.color!=="accent"&&n.color!=="warn")("mat-accent",n.color==="accent")("mat-warn",n.color==="warn")("ng-untouched",n._shouldForward("untouched"))("ng-touched",n._shouldForward("touched"))("ng-pristine",n._shouldForward("pristine"))("ng-dirty",n._shouldForward("dirty"))("ng-valid",n._shouldForward("valid"))("ng-invalid",n._shouldForward("invalid"))("ng-pending",n._shouldForward("pending"))},inputs:{hideRequiredMarker:"hideRequiredMarker",color:"color",floatLabel:"floatLabel",appearance:"appearance",subscriptSizing:"subscriptSizing",hintLabel:"hintLabel"},exportAs:["matFormField"],features:[Bt([{provide:tu,useExisting:t},{provide:UG,useExisting:t}])],ngContentSelectors:XnA,decls:18,vars:21,consts:[["labelTemplate",""],["textField",""],["iconPrefixContainer",""],["textPrefixContainer",""],["textSuffixContainer",""],["iconSuffixContainer",""],[1,"mat-mdc-text-field-wrapper","mdc-text-field",3,"click"],[1,"mat-mdc-form-field-focus-overlay"],[1,"mat-mdc-form-field-flex"],["matFormFieldNotchedOutline","",3,"matFormFieldNotchedOutlineOpen"],[1,"mat-mdc-form-field-icon-prefix"],[1,"mat-mdc-form-field-text-prefix"],[1,"mat-mdc-form-field-infix"],[3,"ngTemplateOutlet"],[1,"mat-mdc-form-field-text-suffix"],[1,"mat-mdc-form-field-icon-suffix"],["matFormFieldLineRipple",""],["aria-atomic","true","aria-live","polite",1,"mat-mdc-form-field-subscript-wrapper","mat-mdc-form-field-bottom-align"],[1,"mat-mdc-form-field-error-wrapper"],[1,"mat-mdc-form-field-hint-wrapper"],["matFormFieldFloatingLabel","",3,"floating","monitorResize","id"],["aria-hidden","true",1,"mat-mdc-form-field-required-marker","mdc-floating-label--required"],[3,"id"],[1,"mat-mdc-form-field-hint-spacer"]],template:function(i,n){if(i&1&&(Rt(ZnA),Et(0,eoA,1,1,"ng-template",null,0,$C),B(2,"div",6,1),U("click",function(a){return n._control.onContainerClick(a)}),O(4,toA,1,0,"div",7),B(5,"div",8),O(6,ooA,2,2,"div",9),O(7,aoA,3,0,"div",10),O(8,roA,3,0,"div",11),B(9,"div",12),O(10,loA,1,1,null,13),Ve(11),Q(),O(12,goA,3,0,"div",14),O(13,coA,3,0,"div",15),Q(),O(14,CoA,1,0,"div",16),Q(),B(15,"div",17),O(16,IoA,2,0,"div",18)(17,BoA,5,1,"div",19),Q()),i&2){let o;u(2),RA("mdc-text-field--filled",!n._hasOutline())("mdc-text-field--outlined",n._hasOutline())("mdc-text-field--no-label",!n._hasFloatingLabel())("mdc-text-field--disabled",n._control.disabled)("mdc-text-field--invalid",n._control.errorState),u(2),Y(!n._hasOutline()&&!n._control.disabled?4:-1),u(2),Y(n._hasOutline()?6:-1),u(),Y(n._hasIconPrefix?7:-1),u(),Y(n._hasTextPrefix?8:-1),u(2),Y(!n._hasOutline()||n._forceDisplayInfixLabel()?10:-1),u(2),Y(n._hasTextSuffix?12:-1),u(),Y(n._hasIconSuffix?13:-1),u(),Y(n._hasOutline()?-1:14),u(),RA("mat-mdc-form-field-subscript-dynamic-size",n.subscriptSizing==="dynamic");let a=n._getSubscriptMessageType();u(),Y((o=a)==="error"?16:o==="hint"?17:-1)}},dependencies:[kG,RG,Jc,_G,s1],styles:[`.mdc-text-field{display:inline-flex;align-items:baseline;padding:0 16px;position:relative;box-sizing:border-box;overflow:hidden;will-change:opacity,transform,color;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.mdc-text-field__input{width:100%;min-width:0;border:none;border-radius:0;background:none;padding:0;-moz-appearance:none;-webkit-appearance:none;height:28px}.mdc-text-field__input::-webkit-calendar-picker-indicator,.mdc-text-field__input::-webkit-search-cancel-button{display:none}.mdc-text-field__input::-ms-clear{display:none}.mdc-text-field__input:focus{outline:none}.mdc-text-field__input:invalid{box-shadow:none}.mdc-text-field__input::placeholder{opacity:0}.mdc-text-field__input::-moz-placeholder{opacity:0}.mdc-text-field__input::-webkit-input-placeholder{opacity:0}.mdc-text-field__input:-ms-input-placeholder{opacity:0}.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mdc-text-field--focused .mdc-text-field__input::placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{opacity:1}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-moz-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-webkit-input-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive:-ms-input-placeholder{opacity:0}.mdc-text-field--outlined .mdc-text-field__input,.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input{height:100%}.mdc-text-field--outlined .mdc-text-field__input{display:flex;border:none !important;background-color:rgba(0,0,0,0)}.mdc-text-field--disabled .mdc-text-field__input{pointer-events:auto}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mat-form-field-filled-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mat-form-field-filled-caret-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mat-form-field-outlined-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mat-form-field-outlined-caret-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mat-form-field-filled-error-caret-color, var(--mat-sys-error))}.mdc-text-field--outlined.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mat-form-field-outlined-error-caret-color, var(--mat-sys-error))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-text-field__input{color:var(--mat-form-field-filled-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-text-field__input{color:var(--mat-form-field-outlined-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-text-field--disabled .mdc-text-field__input{background-color:Window}}.mdc-text-field--filled{height:56px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:var(--mat-form-field-filled-container-shape, var(--mat-sys-corner-extra-small));border-top-right-radius:var(--mat-form-field-filled-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--mat-form-field-filled-container-color, var(--mat-sys-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled{background-color:var(--mat-form-field-filled-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 4%, transparent))}.mdc-text-field--outlined{height:56px;overflow:visible;padding-right:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)));padding-left:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)) + 4px)}[dir=rtl] .mdc-text-field--outlined{padding-right:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)) + 4px);padding-left:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)))}.mdc-floating-label{position:absolute;left:0;transform-origin:left top;line-height:1.15rem;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text;overflow:hidden;will-change:transform}[dir=rtl] .mdc-floating-label{right:0;left:auto;transform-origin:right top;text-align:right}.mdc-text-field .mdc-floating-label{top:50%;transform:translateY(-50%);pointer-events:none}.mdc-notched-outline .mdc-floating-label{display:inline-block;position:relative;max-width:100%}.mdc-text-field--outlined .mdc-floating-label{left:4px;right:auto}[dir=rtl] .mdc-text-field--outlined .mdc-floating-label{left:auto;right:4px}.mdc-text-field--filled .mdc-floating-label{left:16px;right:auto}[dir=rtl] .mdc-text-field--filled .mdc-floating-label{left:auto;right:16px}.mdc-text-field--disabled .mdc-floating-label{cursor:default}@media(forced-colors: active){.mdc-text-field--disabled .mdc-floating-label{z-index:1}}.mdc-text-field--filled.mdc-text-field--no-label .mdc-floating-label{display:none}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mat-form-field-filled-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-filled-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mat-form-field-filled-hover-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-floating-label{color:var(--mat-form-field-filled-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mat-form-field-filled-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-filled-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mat-form-field-filled-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--filled .mdc-floating-label{font-family:var(--mat-form-field-filled-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-form-field-filled-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-form-field-filled-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-form-field-filled-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mat-form-field-outlined-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-outlined-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mat-form-field-outlined-hover-label-text-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-floating-label{color:var(--mat-form-field-outlined-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mat-form-field-outlined-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-outlined-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mat-form-field-outlined-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined .mdc-floating-label{font-family:var(--mat-form-field-outlined-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-form-field-outlined-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-form-field-outlined-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-form-field-outlined-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-floating-label--float-above{cursor:auto;transform:translateY(-106%) scale(0.75)}.mdc-text-field--filled .mdc-floating-label--float-above{transform:translateY(-106%) scale(0.75)}.mdc-text-field--outlined .mdc-floating-label--float-above{transform:translateY(-37.25px) scale(1);font-size:.75rem}.mdc-notched-outline .mdc-floating-label--float-above{text-overflow:clip}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:133.3333333333%}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{transform:translateY(-34.75px) scale(0.75)}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:1px;margin-right:0;content:"*"}[dir=rtl] .mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:0;margin-right:1px}.mdc-notched-outline{display:flex;position:absolute;top:0;right:0;left:0;box-sizing:border-box;width:100%;max-width:100%;height:100%;text-align:left;pointer-events:none}[dir=rtl] .mdc-notched-outline{text-align:right}.mdc-text-field--outlined .mdc-notched-outline{z-index:1}.mat-mdc-notch-piece{box-sizing:border-box;height:100%;pointer-events:none;border:none;border-top:1px solid;border-bottom:1px solid}.mdc-text-field--focused .mat-mdc-notch-piece{border-width:2px}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-outline-color, var(--mat-sys-outline));border-width:var(--mat-form-field-outlined-outline-width, 1px)}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-hover-outline-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-focus-outline-color, var(--mat-sys-primary))}.mdc-text-field--outlined.mdc-text-field--disabled .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-notched-outline .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-hover-outline-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-focus-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline .mat-mdc-notch-piece{border-width:var(--mat-form-field-outlined-focus-outline-width, 2px)}.mdc-notched-outline__leading{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading{width:max(12px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)))}[dir=rtl] .mdc-notched-outline__leading{border-left:none;border-right:1px solid;border-bottom-left-radius:0;border-top-left-radius:0;border-top-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__trailing{flex-grow:1;border-left:none;border-right:1px solid;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}[dir=rtl] .mdc-notched-outline__trailing{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__notch{flex:0 0 auto;width:auto}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__notch{max-width:min(var(--mat-form-field-notch-max-width, 100%),calc(100% - max(12px, var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))) * 2))}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{max-width:min(100%,calc(100% - max(12px, var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))) * 2))}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:1px}.mdc-text-field--focused.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:2px}.mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:0;padding-right:8px;border-top:none}[dir=rtl] .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:8px;padding-right:0}.mdc-notched-outline--no-label .mdc-notched-outline__notch{display:none}.mdc-line-ripple::before,.mdc-line-ripple::after{position:absolute;bottom:0;left:0;width:100%;border-bottom-style:solid;content:""}.mdc-line-ripple::before{z-index:1;border-bottom-width:var(--mat-form-field-filled-active-indicator-height, 1px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-active-indicator-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-hover-active-indicator-color, var(--mat-sys-on-surface))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-disabled-active-indicator-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-error-active-indicator-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-error-hover-active-indicator-color, var(--mat-sys-on-error-container))}.mdc-line-ripple::after{transform:scaleX(0);opacity:0;z-index:2}.mdc-text-field--filled .mdc-line-ripple::after{border-bottom-width:var(--mat-form-field-filled-focus-active-indicator-height, 2px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mat-form-field-filled-focus-active-indicator-color, var(--mat-sys-primary))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mat-form-field-filled-error-focus-active-indicator-color, var(--mat-sys-error))}.mdc-line-ripple--active::after{transform:scaleX(1);opacity:1}.mdc-line-ripple--deactivating::after{opacity:0}.mdc-text-field--disabled{pointer-events:none}.mat-mdc-form-field-textarea-control{vertical-align:middle;resize:vertical;box-sizing:border-box;height:auto;margin:0;padding:0;border:none;overflow:auto}.mat-mdc-form-field-input-control.mat-mdc-form-field-input-control{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font:inherit;letter-spacing:inherit;text-decoration:inherit;text-transform:inherit;border:none}.mat-mdc-form-field .mat-mdc-floating-label.mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;line-height:normal;pointer-events:all;will-change:auto}.mat-mdc-form-field:not(.mat-form-field-disabled) .mat-mdc-floating-label.mdc-floating-label{cursor:inherit}.mdc-text-field--no-label:not(.mdc-text-field--textarea) .mat-mdc-form-field-input-control.mdc-text-field__input,.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control{height:auto}.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control.mdc-text-field__input[type=color]{height:23px}.mat-mdc-text-field-wrapper{height:auto;flex:auto;will-change:auto}.mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-left:0;--mat-mdc-form-field-label-offset-x: -16px}.mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:0}[dir=rtl] .mat-mdc-text-field-wrapper{padding-left:16px;padding-right:16px}[dir=rtl] .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-left:0}[dir=rtl] .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-right:0}.mat-form-field-disabled .mdc-text-field__input::placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-label-always-float .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}.mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .mat-mdc-floating-label{left:auto;right:auto}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-text-field__input{display:inline-block}.mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field .mdc-notched-outline__notch{padding-top:0}.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:1px solid rgba(0,0,0,0)}[dir=rtl] .mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:none;border-right:1px solid rgba(0,0,0,0)}.mat-mdc-form-field-infix{min-height:var(--mat-form-field-container-height, 56px);padding-top:var(--mat-form-field-filled-with-label-container-padding-top, 24px);padding-bottom:var(--mat-form-field-filled-with-label-container-padding-bottom, 8px)}.mdc-text-field--outlined .mat-mdc-form-field-infix,.mdc-text-field--no-label .mat-mdc-form-field-infix{padding-top:var(--mat-form-field-container-vertical-padding, 16px);padding-bottom:var(--mat-form-field-container-vertical-padding, 16px)}.mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:calc(var(--mat-form-field-container-height, 56px)/2)}.mdc-text-field--filled .mat-mdc-floating-label{display:var(--mat-form-field-filled-label-display, block)}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY(calc(calc(6.75px + var(--mat-form-field-container-height, 56px) / 2) * -1)) scale(var(--mat-mdc-form-field-floating-label-scale, 0.75));transform:var(--mat-mdc-form-field-label-transform)}@keyframes _mat-form-field-subscript-animation{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.mat-mdc-form-field-subscript-wrapper{box-sizing:border-box;width:100%;position:relative}.mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-error-wrapper{position:absolute;top:0;left:0;right:0;padding:0 16px;opacity:1;transform:translateY(0);animation:_mat-form-field-subscript-animation 0ms cubic-bezier(0.55, 0, 0.55, 0.2)}.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-error-wrapper{position:static}.mat-mdc-form-field-bottom-align::before{content:"";display:inline-block;height:16px}.mat-mdc-form-field-bottom-align.mat-mdc-form-field-subscript-dynamic-size::before{content:unset}.mat-mdc-form-field-hint-end{order:1}.mat-mdc-form-field-hint-wrapper{display:flex}.mat-mdc-form-field-hint-spacer{flex:1 0 1em}.mat-mdc-form-field-error{display:block;color:var(--mat-form-field-error-text-color, var(--mat-sys-error))}.mat-mdc-form-field-subscript-wrapper,.mat-mdc-form-field-bottom-align::before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-subscript-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-form-field-subscript-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-form-field-subscript-text-size, var(--mat-sys-body-small-size));letter-spacing:var(--mat-form-field-subscript-text-tracking, var(--mat-sys-body-small-tracking));font-weight:var(--mat-form-field-subscript-text-weight, var(--mat-sys-body-small-weight))}.mat-mdc-form-field-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;opacity:0;pointer-events:none;background-color:var(--mat-form-field-state-layer-color, var(--mat-sys-on-surface))}.mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-focus-state-layer-opacity, 0)}select.mat-mdc-form-field-input-control{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(0,0,0,0);display:inline-flex;box-sizing:border-box}select.mat-mdc-form-field-input-control:not(:disabled){cursor:pointer}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option{color:var(--mat-form-field-select-option-text-color, var(--mat-sys-neutral10))}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option:disabled{color:var(--mat-form-field-select-disabled-option-text-color, color-mix(in srgb, var(--mat-sys-neutral10) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{content:"";width:0;height:0;border-left:5px solid rgba(0,0,0,0);border-right:5px solid rgba(0,0,0,0);border-top:5px solid;position:absolute;right:0;top:50%;margin-top:-2.5px;pointer-events:none;color:var(--mat-form-field-enabled-select-arrow-color, var(--mat-sys-on-surface-variant))}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{right:auto;left:0}.mat-mdc-form-field-type-mat-native-select.mat-focused .mat-mdc-form-field-infix::after{color:var(--mat-form-field-focus-select-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field-type-mat-native-select.mat-form-field-disabled .mat-mdc-form-field-infix::after{color:var(--mat-form-field-disabled-select-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:15px}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:0;padding-left:15px}@media(forced-colors: active){.mat-form-field-appearance-fill .mat-mdc-text-field-wrapper{outline:solid 1px}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-form-field-disabled .mat-mdc-text-field-wrapper{outline-color:GrayText}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-focused .mat-mdc-text-field-wrapper{outline:dashed 3px}}@media(forced-colors: active){.mat-mdc-form-field.mat-focused .mdc-notched-outline{border:dashed 3px}}.mat-mdc-form-field-input-control[type=date],.mat-mdc-form-field-input-control[type=datetime],.mat-mdc-form-field-input-control[type=datetime-local],.mat-mdc-form-field-input-control[type=month],.mat-mdc-form-field-input-control[type=week],.mat-mdc-form-field-input-control[type=time]{line-height:1}.mat-mdc-form-field-input-control::-webkit-datetime-edit{line-height:1;padding:0;margin-bottom:-2px}.mat-mdc-form-field{--mat-mdc-form-field-floating-label-scale: 0.75;display:inline-flex;flex-direction:column;min-width:0;text-align:left;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-container-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-form-field-container-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-form-field-container-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-form-field-container-text-tracking, var(--mat-sys-body-large-tracking));font-weight:var(--mat-form-field-container-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-floating-label--float-above{font-size:calc(var(--mat-form-field-outlined-label-text-populated-size)*var(--mat-mdc-form-field-floating-label-scale))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:var(--mat-form-field-outlined-label-text-populated-size)}[dir=rtl] .mat-mdc-form-field{text-align:right}.mat-mdc-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-mdc-text-field-wrapper{width:100%;z-index:0}.mat-mdc-form-field-icon-prefix,.mat-mdc-form-field-icon-suffix{align-self:center;line-height:0;pointer-events:auto;position:relative;z-index:1}.mat-mdc-form-field-icon-prefix>.mat-icon,.mat-mdc-form-field-icon-suffix>.mat-icon{padding:0 12px;box-sizing:content-box}.mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-leading-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-disabled-leading-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-disabled-trailing-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-invalid .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-trailing-icon-color, var(--mat-sys-error))}.mat-form-field-invalid:not(.mat-focused):not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-hover-trailing-icon-color, var(--mat-sys-on-error-container))}.mat-form-field-invalid.mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-focus-trailing-icon-color, var(--mat-sys-error))}.mat-mdc-form-field-icon-prefix,[dir=rtl] .mat-mdc-form-field-icon-suffix{padding:0 4px 0 0}.mat-mdc-form-field-icon-suffix,[dir=rtl] .mat-mdc-form-field-icon-prefix{padding:0 0 0 4px}.mat-mdc-form-field-subscript-wrapper .mat-icon,.mat-mdc-form-field label .mat-icon{width:1em;height:1em;font-size:inherit}.mat-mdc-form-field-infix{flex:auto;min-width:0;width:180px;position:relative;box-sizing:border-box}.mat-mdc-form-field-infix:has(textarea[cols]){width:auto}.mat-mdc-form-field .mdc-notched-outline__notch{margin-left:-1px;-webkit-clip-path:inset(-9em -999em -9em 1px);clip-path:inset(-9em -999em -9em 1px)}[dir=rtl] .mat-mdc-form-field .mdc-notched-outline__notch{margin-left:0;margin-right:-1px;-webkit-clip-path:inset(-9em 1px -9em -999em);clip-path:inset(-9em 1px -9em -999em)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-floating-label{transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1),color 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input{transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::-moz-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::-webkit-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input:-ms-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field--filled:not(.mdc-ripple-upgraded):focus .mdc-text-field__ripple::before{transition-duration:75ms}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-line-ripple::after{transition:transform 180ms cubic-bezier(0.4, 0, 0.2, 1),opacity 180ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field.mat-form-field-animations-enabled .mat-mdc-form-field-error-wrapper{animation-duration:300ms}.mdc-notched-outline .mdc-floating-label{max-width:calc(100% + 1px)}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:calc(133.3333333333% + 1px)} -`],encapsulation:2,changeDetection:0})}return t})();var Ya=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fp,Ko,fi]})}return t})();var TG=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["ng-component"]],hostAttrs:["cdk-text-field-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[`textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0 !important;box-sizing:content-box !important;height:auto !important;overflow:hidden !important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0 !important;box-sizing:content-box !important;height:0 !important}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms} -`],encapsulation:2,changeDetection:0})}return t})(),foA={passive:!0},JG=(()=>{class t{_platform=w(gi);_ngZone=w(qe);_renderer=w(Kr).createRenderer(null,null);_styleLoader=w(eo);_monitoredElements=new Map;constructor(){}monitor(A){if(!this._platform.isBrowser)return ar;this._styleLoader.load(TG);let i=Ds(A),n=this._monitoredElements.get(i);if(n)return n.subject;let o=new ie,a="cdk-text-field-autofilled",r=l=>{l.animationName==="cdk-text-field-autofill-start"&&!i.classList.contains(a)?(i.classList.add(a),this._ngZone.run(()=>o.next({target:l.target,isAutofilled:!0}))):l.animationName==="cdk-text-field-autofill-end"&&i.classList.contains(a)&&(i.classList.remove(a),this._ngZone.run(()=>o.next({target:l.target,isAutofilled:!1})))},s=this._ngZone.runOutsideAngular(()=>(i.classList.add("cdk-text-field-autofill-monitored"),this._renderer.listen(i,"animationstart",r,foA)));return this._monitoredElements.set(i,{subject:o,unlisten:s}),o}stopMonitoring(A){let i=Ds(A),n=this._monitoredElements.get(i);n&&(n.unlisten(),n.subject.complete(),i.classList.remove("cdk-text-field-autofill-monitored"),i.classList.remove("cdk-text-field-autofilled"),this._monitoredElements.delete(i))}ngOnDestroy(){this._monitoredElements.forEach((A,i)=>this.stopMonitoring(i))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var _p=(()=>{class t{_elementRef=w(ce);_platform=w(gi);_ngZone=w(qe);_renderer=w(Pi);_resizeEvents=new ie;_previousValue;_initialHeight;_destroyed=new ie;_listenerCleanups;_minRows;_maxRows;_enabled=!0;_previousMinRows=-1;_textareaElement;get minRows(){return this._minRows}set minRows(A){this._minRows=zs(A),this._setMinHeight()}get maxRows(){return this._maxRows}set maxRows(A){this._maxRows=zs(A),this._setMaxHeight()}get enabled(){return this._enabled}set enabled(A){this._enabled!==A&&((this._enabled=A)?this.resizeToFitContent(!0):this.reset())}get placeholder(){return this._textareaElement.placeholder}set placeholder(A){this._cachedPlaceholderHeight=void 0,A?this._textareaElement.setAttribute("placeholder",A):this._textareaElement.removeAttribute("placeholder"),this._cacheTextareaPlaceholderHeight()}_cachedLineHeight;_cachedPlaceholderHeight;_document=w(ti);_hasFocus=!1;_isViewInited=!1;constructor(){w(eo).load(TG),this._textareaElement=this._elementRef.nativeElement}_setMinHeight(){let A=this.minRows&&this._cachedLineHeight?`${this.minRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.minHeight=A)}_setMaxHeight(){let A=this.maxRows&&this._cachedLineHeight?`${this.maxRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.maxHeight=A)}ngAfterViewInit(){this._platform.isBrowser&&(this._initialHeight=this._textareaElement.style.height,this.resizeToFitContent(),this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[this._renderer.listen("window","resize",()=>this._resizeEvents.next()),this._renderer.listen(this._textareaElement,"focus",this._handleFocusEvent),this._renderer.listen(this._textareaElement,"blur",this._handleFocusEvent)],this._resizeEvents.pipe(jI(16)).subscribe(()=>{this._cachedLineHeight=this._cachedPlaceholderHeight=void 0,this.resizeToFitContent(!0)})}),this._isViewInited=!0,this.resizeToFitContent(!0))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A()),this._resizeEvents.complete(),this._destroyed.next(),this._destroyed.complete()}_cacheTextareaLineHeight(){if(this._cachedLineHeight)return;let A=this._textareaElement.cloneNode(!1),i=A.style;A.rows=1,i.position="absolute",i.visibility="hidden",i.border="none",i.padding="0",i.height="",i.minHeight="",i.maxHeight="",i.top=i.bottom=i.left=i.right="auto",i.overflow="hidden",this._textareaElement.parentNode.appendChild(A),this._cachedLineHeight=A.clientHeight,A.remove(),this._setMinHeight(),this._setMaxHeight()}_measureScrollHeight(){let A=this._textareaElement,i=A.style.marginBottom||"",n=this._platform.FIREFOX,o=this._hasFocus,a=n?"cdk-textarea-autosize-measuring-firefox":"cdk-textarea-autosize-measuring";o&&(A.style.marginBottom=`${A.clientHeight}px`),A.classList.add(a);let r=A.scrollHeight-4;return A.classList.remove(a),o&&(A.style.marginBottom=i),r}_cacheTextareaPlaceholderHeight(){if(!this._isViewInited||this._cachedPlaceholderHeight!=null)return;if(!this.placeholder){this._cachedPlaceholderHeight=0;return}let A=this._textareaElement.value;this._textareaElement.value=this._textareaElement.placeholder,this._cachedPlaceholderHeight=this._measureScrollHeight(),this._textareaElement.value=A}_handleFocusEvent=A=>{this._hasFocus=A.type==="focus"};ngDoCheck(){this._platform.isBrowser&&this.resizeToFitContent()}resizeToFitContent(A=!1){if(!this._enabled||(this._cacheTextareaLineHeight(),this._cacheTextareaPlaceholderHeight(),!this._cachedLineHeight))return;let i=this._elementRef.nativeElement,n=i.value;if(!A&&this._minRows===this._previousMinRows&&n===this._previousValue)return;let o=this._measureScrollHeight(),a=Math.max(o,this._cachedPlaceholderHeight||0);i.style.height=`${a}px`,this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame<"u"?requestAnimationFrame(()=>this._scrollToCaretPosition(i)):setTimeout(()=>this._scrollToCaretPosition(i))}),this._previousValue=n,this._previousMinRows=this._minRows}reset(){this._initialHeight!==void 0&&(this._textareaElement.style.height=this._initialHeight)}_noopInputHandler(){}_scrollToCaretPosition(A){let{selectionStart:i,selectionEnd:n}=A;!this._destroyed.isStopped&&this._hasFocus&&A.setSelectionRange(i,n)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["textarea","cdkTextareaAutosize",""]],hostAttrs:["rows","1",1,"cdk-textarea-autosize"],hostBindings:function(i,n){i&1&&U("input",function(){return n._noopInputHandler()})},inputs:{minRows:[0,"cdkAutosizeMinRows","minRows"],maxRows:[0,"cdkAutosizeMaxRows","maxRows"],enabled:[2,"cdkTextareaAutosize","enabled",Be],placeholder:"placeholder"},exportAs:["cdkTextareaAutosize"]})}return t})(),lB=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})();var YG=new kA("MAT_INPUT_VALUE_ACCESSOR");var gB=(()=>{class t{isErrorState(A,i){return!!(A&&A.invalid&&(A.touched||i&&i.submitted))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var cB=class{_defaultMatcher;ngControl;_parentFormGroup;_parentForm;_stateChanges;errorState=!1;matcher;constructor(e,A,i,n,o){this._defaultMatcher=e,this.ngControl=A,this._parentFormGroup=i,this._parentForm=n,this._stateChanges=o}updateErrorState(){let e=this.errorState,A=this._parentFormGroup||this._parentForm,i=this.matcher||this._defaultMatcher,n=this.ngControl?this.ngControl.control:null,o=i?.isErrorState(n,A)??!1;o!==e&&(this.errorState=o,this._stateChanges.next())}};var poA=["button","checkbox","file","hidden","image","radio","range","reset","submit"],moA=new kA("MAT_INPUT_CONFIG"),ua=(()=>{class t{_elementRef=w(ce);_platform=w(gi);ngControl=w(Hs,{optional:!0,self:!0});_autofillMonitor=w(JG);_ngZone=w(qe);_formField=w(tu,{optional:!0});_renderer=w(Pi);_uid=w(In).getId("mat-input-");_previousNativeValue;_inputValueAccessor;_signalBasedValueAccessor;_previousPlaceholder=null;_errorStateTracker;_config=w(moA,{optional:!0});_cleanupIosKeyup;_cleanupWebkitWheel;_isServer=!1;_isNativeSelect=!1;_isTextarea=!1;_isInFormField=!1;focused=!1;stateChanges=new ie;controlType="mat-input";autofilled=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=mr(A),this.focused&&(this.focused=!1,this.stateChanges.next())}_disabled=!1;get id(){return this._id}set id(A){this._id=A||this._uid}_id;placeholder;name;get required(){return this._required??this.ngControl?.control?.hasValidator(Ys.required)??!1}set required(A){this._required=mr(A)}_required;get type(){return this._type}set type(A){this._type=A||"text",this._validateType(),!this._isTextarea&&xb().has(this._type)&&(this._elementRef.nativeElement.type=this._type)}_type="text";get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}userAriaDescribedBy;get value(){return this._signalBasedValueAccessor?this._signalBasedValueAccessor.value():this._inputValueAccessor.value}set value(A){A!==this.value&&(this._signalBasedValueAccessor?this._signalBasedValueAccessor.value.set(A):this._inputValueAccessor.value=A,this.stateChanges.next())}get readonly(){return this._readonly}set readonly(A){this._readonly=mr(A)}_readonly=!1;disabledInteractive;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}_neverEmptyInputTypes=["date","datetime","datetime-local","month","time","week"].filter(A=>xb().has(A));constructor(){let A=w(eB,{optional:!0}),i=w(i2,{optional:!0}),n=w(gB),o=w(YG,{optional:!0,self:!0}),a=this._elementRef.nativeElement,r=a.nodeName.toLowerCase();o?VI(o.value)?this._signalBasedValueAccessor=o:this._inputValueAccessor=o:this._inputValueAccessor=a,this._previousNativeValue=this.value,this.id=this.id,this._platform.IOS&&this._ngZone.runOutsideAngular(()=>{this._cleanupIosKeyup=this._renderer.listen(a,"keyup",this._iOSKeyupListener)}),this._errorStateTracker=new cB(n,this.ngControl,i,A,this.stateChanges),this._isServer=!this._platform.isBrowser,this._isNativeSelect=r==="select",this._isTextarea=r==="textarea",this._isInFormField=!!this._formField,this.disabledInteractive=this._config?.disabledInteractive||!1,this._isNativeSelect&&(this.controlType=a.multiple?"mat-native-select-multiple":"mat-native-select"),this._signalBasedValueAccessor&&Ao(()=>{this._signalBasedValueAccessor.value(),this.stateChanges.next()})}ngAfterViewInit(){this._platform.isBrowser&&this._autofillMonitor.monitor(this._elementRef.nativeElement).subscribe(A=>{this.autofilled=A.isAutofilled,this.stateChanges.next()})}ngOnChanges(){this.stateChanges.next()}ngOnDestroy(){this.stateChanges.complete(),this._platform.isBrowser&&this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement),this._cleanupIosKeyup?.(),this._cleanupWebkitWheel?.()}ngDoCheck(){this.ngControl&&(this.updateErrorState(),this.ngControl.disabled!==null&&this.ngControl.disabled!==this.disabled&&(this.disabled=this.ngControl.disabled,this.stateChanges.next())),this._dirtyCheckNativeValue(),this._dirtyCheckPlaceholder()}focus(A){this._elementRef.nativeElement.focus(A)}updateErrorState(){this._errorStateTracker.updateErrorState()}_focusChanged(A){if(A!==this.focused){if(!this._isNativeSelect&&A&&this.disabled&&this.disabledInteractive){let i=this._elementRef.nativeElement;i.type==="number"?(i.type="text",i.setSelectionRange(0,0),i.type="number"):i.setSelectionRange(0,0)}this.focused=A,this.stateChanges.next()}}_onInput(){}_dirtyCheckNativeValue(){let A=this._elementRef.nativeElement.value;this._previousNativeValue!==A&&(this._previousNativeValue=A,this.stateChanges.next())}_dirtyCheckPlaceholder(){let A=this._getPlaceholder();if(A!==this._previousPlaceholder){let i=this._elementRef.nativeElement;this._previousPlaceholder=A,A?i.setAttribute("placeholder",A):i.removeAttribute("placeholder")}}_getPlaceholder(){return this.placeholder||null}_validateType(){poA.indexOf(this._type)>-1}_isNeverEmpty(){return this._neverEmptyInputTypes.indexOf(this._type)>-1}_isBadInput(){let A=this._elementRef.nativeElement.validity;return A&&A.badInput}get empty(){return!this._isNeverEmpty()&&!this._elementRef.nativeElement.value&&!this._isBadInput()&&!this.autofilled}get shouldLabelFloat(){if(this._isNativeSelect){let A=this._elementRef.nativeElement,i=A.options[0];return this.focused||A.multiple||!this.empty||!!(A.selectedIndex>-1&&i&&i.label)}else return this.focused&&!this.disabled||!this.empty}get describedByIds(){return this._elementRef.nativeElement.getAttribute("aria-describedby")?.split(" ")||[]}setDescribedByIds(A){let i=this._elementRef.nativeElement;A.length?i.setAttribute("aria-describedby",A.join(" ")):i.removeAttribute("aria-describedby")}onContainerClick(){this.focused||this.focus()}_isInlineSelect(){let A=this._elementRef.nativeElement;return this._isNativeSelect&&(A.multiple||A.size>1)}_iOSKeyupListener=A=>{let i=A.target;!i.value&&i.selectionStart===0&&i.selectionEnd===0&&(i.setSelectionRange(1,1),i.setSelectionRange(0,0))};_getReadonlyAttribute(){return this._isNativeSelect?null:this.readonly||this.disabled&&this.disabledInteractive?"true":null}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["input","matInput",""],["textarea","matInput",""],["select","matNativeControl",""],["input","matNativeControl",""],["textarea","matNativeControl",""]],hostAttrs:[1,"mat-mdc-input-element"],hostVars:21,hostBindings:function(i,n){i&1&&U("focus",function(){return n._focusChanged(!0)})("blur",function(){return n._focusChanged(!1)})("input",function(){return n._onInput()}),i&2&&(ha("id",n.id)("disabled",n.disabled&&!n.disabledInteractive)("required",n.required),te("name",n.name||null)("readonly",n._getReadonlyAttribute())("aria-disabled",n.disabled&&n.disabledInteractive?"true":null)("aria-invalid",n.empty&&n.required?null:n.errorState)("aria-required",n.required)("id",n.id),RA("mat-input-server",n._isServer)("mat-mdc-form-field-textarea-control",n._isInFormField&&n._isTextarea)("mat-mdc-form-field-input-control",n._isInFormField)("mat-mdc-input-disabled-interactive",n.disabledInteractive)("mdc-text-field__input",n._isInFormField)("mat-mdc-native-select-inline",n._isInlineSelect()))},inputs:{disabled:"disabled",id:"id",placeholder:"placeholder",name:"name",required:"required",type:"type",errorStateMatcher:"errorStateMatcher",userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],value:"value",readonly:"readonly",disabledInteractive:[2,"disabledInteractive","disabledInteractive",Be]},exportAs:["matInput"],features:[Bt([{provide:eu,useExisting:t}]),Yt]})}return t})(),Ps=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Ya,Ya,lB,fi]})}return t})();var rn=(function(t){return t[t.State=0]="State",t[t.Transition=1]="Transition",t[t.Sequence=2]="Sequence",t[t.Group=3]="Group",t[t.Animate=4]="Animate",t[t.Keyframes=5]="Keyframes",t[t.Style=6]="Style",t[t.Trigger=7]="Trigger",t[t.Reference=8]="Reference",t[t.AnimateChild=9]="AnimateChild",t[t.AnimateRef=10]="AnimateRef",t[t.Query=11]="Query",t[t.Stagger=12]="Stagger",t})(rn||{}),Ng="*";function HG(t,e=null){return{type:rn.Sequence,steps:t,options:e}}function Jb(t){return{type:rn.Style,styles:t,offset:null}}var z0=class{_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_originalOnDoneFns=[];_originalOnStartFns=[];_started=!1;_destroyed=!1;_finished=!1;_position=0;parentPlayer=null;totalTime;constructor(e=0,A=0){this.totalTime=e+A}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}init(){}play(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}triggerMicrotask(){queueMicrotask(()=>this._onFinish())}_onStart(){this._onStartFns.forEach(e=>e()),this._onStartFns=[]}pause(){}restart(){}finish(){this._onFinish()}destroy(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this._started=!1,this._finished=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}setPosition(e){this._position=this.totalTime?e*this.totalTime:1}getPosition(){return this.totalTime?this._position/this.totalTime:1}triggerCallback(e){let A=e=="start"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},IB=class{_onDoneFns=[];_onStartFns=[];_finished=!1;_started=!1;_destroyed=!1;_onDestroyFns=[];parentPlayer=null;totalTime=0;players;constructor(e){this.players=e;let A=0,i=0,n=0,o=this.players.length;o==0?queueMicrotask(()=>this._onFinish()):this.players.forEach(a=>{a.onDone(()=>{++A==o&&this._onFinish()}),a.onDestroy(()=>{++i==o&&this._onDestroy()}),a.onStart(()=>{++n==o&&this._onStart()})}),this.totalTime=this.players.reduce((a,r)=>Math.max(a,r.totalTime),0)}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this.players.forEach(e=>e.init())}onStart(e){this._onStartFns.push(e)}_onStart(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(e=>e()),this._onStartFns=[])}onDone(e){this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}play(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(e=>e.play())}pause(){this.players.forEach(e=>e.pause())}restart(){this.players.forEach(e=>e.restart())}finish(){this._onFinish(),this.players.forEach(e=>e.finish())}destroy(){this._onDestroy()}_onDestroy(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(e=>e.destroy()),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this.players.forEach(e=>e.reset()),this._destroyed=!1,this._finished=!1,this._started=!1}setPosition(e){let A=e*this.totalTime;this.players.forEach(i=>{let n=i.totalTime?Math.min(1,A/i.totalTime):1;i.setPosition(n)})}getPosition(){let e=this.players.reduce((A,i)=>A===null||i.totalTime>A.totalTime?i:A,null);return e!=null?e.getPosition():0}beforeDestroy(){this.players.forEach(e=>{e.beforeDestroy&&e.beforeDestroy()})}triggerCallback(e){let A=e=="start"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},iu="!";function zG(t){return new Mt(3e3,!1)}function woA(){return new Mt(3100,!1)}function DoA(){return new Mt(3101,!1)}function yoA(t){return new Mt(3001,!1)}function voA(t){return new Mt(3003,!1)}function boA(t){return new Mt(3004,!1)}function jG(t,e){return new Mt(3005,!1)}function qG(){return new Mt(3006,!1)}function VG(){return new Mt(3007,!1)}function WG(t,e){return new Mt(3008,!1)}function ZG(t){return new Mt(3002,!1)}function XG(t,e,A,i,n){return new Mt(3010,!1)}function $G(){return new Mt(3011,!1)}function AK(){return new Mt(3012,!1)}function eK(){return new Mt(3200,!1)}function tK(){return new Mt(3202,!1)}function iK(){return new Mt(3013,!1)}function nK(t){return new Mt(3014,!1)}function oK(t){return new Mt(3015,!1)}function aK(t){return new Mt(3016,!1)}function rK(t,e){return new Mt(3404,!1)}function MoA(t){return new Mt(3502,!1)}function sK(t){return new Mt(3503,!1)}function lK(){return new Mt(3300,!1)}function gK(t){return new Mt(3504,!1)}function cK(t){return new Mt(3301,!1)}function CK(t,e){return new Mt(3302,!1)}function IK(t){return new Mt(3303,!1)}function dK(t,e){return new Mt(3400,!1)}function BK(t){return new Mt(3401,!1)}function EK(t){return new Mt(3402,!1)}function hK(t,e){return new Mt(3505,!1)}function P0(t){switch(t.length){case 0:return new z0;case 1:return t[0];default:return new IB(t)}}function zb(t,e,A=new Map,i=new Map){let n=[],o=[],a=-1,r=null;if(e.forEach(s=>{let l=s.get("offset"),g=l==a,C=g&&r||new Map;s.forEach((I,d)=>{let h=d,E=I;if(d!=="offset")switch(h=t.normalizePropertyName(h,n),E){case iu:E=A.get(d);break;case Ng:E=i.get(d);break;default:E=t.normalizeStyleValue(d,h,E,n);break}C.set(h,E)}),g||o.push(C),r=C,a=l}),n.length)throw MoA(n);return o}function Rp(t,e,A,i){switch(e){case"start":t.onStart(()=>i(A&&Ob(A,"start",t)));break;case"done":t.onDone(()=>i(A&&Ob(A,"done",t)));break;case"destroy":t.onDestroy(()=>i(A&&Ob(A,"destroy",t)));break}}function Ob(t,e,A){let i=A.totalTime,n=!!A.disabled,o=Np(t.element,t.triggerName,t.fromState,t.toState,e||t.phaseName,i??t.totalTime,n),a=t._data;return a!=null&&(o._data=a),o}function Np(t,e,A,i,n="",o=0,a){return{element:t,triggerName:e,fromState:A,toState:i,phaseName:n,totalTime:o,disabled:!!a}}function js(t,e,A){let i=t.get(e);return i||t.set(e,i=A),i}function Pb(t){let e=t.indexOf(":"),A=t.substring(1,e),i=t.slice(e+1);return[A,i]}var SoA=typeof document>"u"?null:document.documentElement;function Fp(t){let e=t.parentNode||t.host||null;return e===SoA?null:e}function koA(t){return t.substring(1,6)=="ebkit"}var g1=null,PG=!1;function QK(t){g1||(g1=xoA()||{},PG=g1.style?"WebkitAppearance"in g1.style:!1);let e=!0;return g1.style&&!koA(t)&&(e=t in g1.style,!e&&PG&&(e="Webkit"+t.charAt(0).toUpperCase()+t.slice(1)in g1.style)),e}function xoA(){return typeof document<"u"?document.body:null}function jb(t,e){for(;e;){if(e===t)return!0;e=Fp(e)}return!1}function qb(t,e,A){if(A)return Array.from(t.querySelectorAll(e));let i=t.querySelector(e);return i?[i]:[]}var _oA=1e3,Vb="{{",RoA="}}",Wb="ng-enter",Lp="ng-leave",nu="ng-trigger",ou=".ng-trigger",Zb="ng-animating",Gp=".ng-animating";function Hc(t){if(typeof t=="number")return t;let e=t.match(/^(-?[\.\d]+)(m?s)/);return!e||e.length<2?0:Yb(parseFloat(e[1]),e[2])}function Yb(t,e){return e==="s"?t*_oA:t}function au(t,e,A){return t.hasOwnProperty("duration")?t:FoA(t,e,A)}var NoA=/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i;function FoA(t,e,A){let i,n=0,o="";if(typeof t=="string"){let a=t.match(NoA);if(a===null)return e.push(zG(t)),{duration:0,delay:0,easing:""};i=Yb(parseFloat(a[1]),a[2]);let r=a[3];r!=null&&(n=Yb(parseFloat(r),a[4]));let s=a[5];s&&(o=s)}else i=t;if(!A){let a=!1,r=e.length;i<0&&(e.push(woA()),a=!0),n<0&&(e.push(DoA()),a=!0),a&&e.splice(r,0,zG(t))}return{duration:i,delay:n,easing:o}}function uK(t){return t.length?t[0]instanceof Map?t:t.map(e=>new Map(Object.entries(e))):[]}function Fg(t,e,A){e.forEach((i,n)=>{let o=Kp(n);A&&!A.has(n)&&A.set(n,t.style[o]),t.style[o]=i})}function s2(t,e){e.forEach((A,i)=>{let n=Kp(i);t.style[n]=""})}function dB(t){return Array.isArray(t)?t.length==1?t[0]:HG(t):t}function fK(t,e,A){let i=e.params||{},n=Xb(t);n.length&&n.forEach(o=>{i.hasOwnProperty(o)||A.push(yoA(o))})}var Hb=new RegExp(`${Vb}\\s*(.+?)\\s*${RoA}`,"g");function Xb(t){let e=[];if(typeof t=="string"){let A;for(;A=Hb.exec(t);)e.push(A[1]);Hb.lastIndex=0}return e}function BB(t,e,A){let i=`${t}`,n=i.replace(Hb,(o,a)=>{let r=e[a];return r==null&&(A.push(voA(a)),r=""),r.toString()});return n==i?t:n}var LoA=/-+([a-z0-9])/g;function Kp(t){return t.replace(LoA,(...e)=>e[1].toUpperCase())}function pK(t,e){return t===0||e===0}function mK(t,e,A){if(A.size&&e.length){let i=e[0],n=[];if(A.forEach((o,a)=>{i.has(a)||n.push(a),i.set(a,o)}),n.length)for(let o=1;oa.set(r,Up(t,r)))}}return e}function qs(t,e,A){switch(e.type){case rn.Trigger:return t.visitTrigger(e,A);case rn.State:return t.visitState(e,A);case rn.Transition:return t.visitTransition(e,A);case rn.Sequence:return t.visitSequence(e,A);case rn.Group:return t.visitGroup(e,A);case rn.Animate:return t.visitAnimate(e,A);case rn.Keyframes:return t.visitKeyframes(e,A);case rn.Style:return t.visitStyle(e,A);case rn.Reference:return t.visitReference(e,A);case rn.AnimateChild:return t.visitAnimateChild(e,A);case rn.AnimateRef:return t.visitAnimateRef(e,A);case rn.Query:return t.visitQuery(e,A);case rn.Stagger:return t.visitStagger(e,A);default:throw boA(e.type)}}function Up(t,e){return window.getComputedStyle(t)[e]}var B7=(()=>{class t{validateStyleProperty(A){return QK(A)}containsElement(A,i){return jb(A,i)}getParentElement(A){return Fp(A)}query(A,i,n){return qb(A,i,n)}computeStyle(A,i,n){return n||""}animate(A,i,n,o,a,r=[],s){return new z0(n,o)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac})}return t})(),C1=class{static NOOP=new B7},I1=class{};var GoA=new Set(["width","height","minWidth","minHeight","maxWidth","maxHeight","left","top","bottom","right","fontSize","outlineWidth","outlineOffset","paddingTop","paddingLeft","paddingBottom","paddingRight","marginTop","marginLeft","marginBottom","marginRight","borderRadius","borderWidth","borderTopWidth","borderLeftWidth","borderRightWidth","borderBottomWidth","textIndent","perspective"]),Hp=class extends I1{normalizePropertyName(e,A){return Kp(e)}normalizeStyleValue(e,A,i,n){let o="",a=i.toString().trim();if(GoA.has(A)&&i!==0&&i!=="0")if(typeof i=="number")o="px";else{let r=i.match(/^[+-]?[\d\.]+([a-z]*)$/);r&&r[1].length==0&&n.push(jG(e,i))}return a+o}};var zp="*";function KoA(t,e){let A=[];return typeof t=="string"?t.split(/\s*,\s*/).forEach(i=>UoA(i,A,e)):A.push(t),A}function UoA(t,e,A){if(t[0]==":"){let s=ToA(t,A);if(typeof s=="function"){e.push(s);return}t=s}let i=t.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(i==null||i.length<4)return A.push(oK(t)),e;let n=i[1],o=i[2],a=i[3];e.push(wK(n,a));let r=n==zp&&a==zp;o[0]=="<"&&!r&&e.push(wK(a,n))}function ToA(t,e){switch(t){case":enter":return"void => *";case":leave":return"* => void";case":increment":return(A,i)=>parseFloat(i)>parseFloat(A);case":decrement":return(A,i)=>parseFloat(i) *"}}var Tp=new Set(["true","1"]),Jp=new Set(["false","0"]);function wK(t,e){let A=Tp.has(t)||Jp.has(t),i=Tp.has(e)||Jp.has(e);return(n,o)=>{let a=t==zp||t==n,r=e==zp||e==o;return!a&&A&&typeof n=="boolean"&&(a=n?Tp.has(t):Jp.has(t)),!r&&i&&typeof o=="boolean"&&(r=o?Tp.has(e):Jp.has(e)),a&&r}}var RK=":self",JoA=new RegExp(`s*${RK}s*,?`,"g");function NK(t,e,A,i){return new n7(t).build(e,A,i)}var DK="",n7=class{_driver;constructor(e){this._driver=e}build(e,A,i){let n=new o7(A);return this._resetContextStyleTimingState(n),qs(this,dB(e),n)}_resetContextStyleTimingState(e){e.currentQuerySelector=DK,e.collectedStyles=new Map,e.collectedStyles.set(DK,new Map),e.currentTime=0}visitTrigger(e,A){let i=A.queryCount=0,n=A.depCount=0,o=[],a=[];return e.name.charAt(0)=="@"&&A.errors.push(qG()),e.definitions.forEach(r=>{if(this._resetContextStyleTimingState(A),r.type==rn.State){let s=r,l=s.name;l.toString().split(/\s*,\s*/).forEach(g=>{s.name=g,o.push(this.visitState(s,A))}),s.name=l}else if(r.type==rn.Transition){let s=this.visitTransition(r,A);i+=s.queryCount,n+=s.depCount,a.push(s)}else A.errors.push(VG())}),{type:rn.Trigger,name:e.name,states:o,transitions:a,queryCount:i,depCount:n,options:null}}visitState(e,A){let i=this.visitStyle(e.styles,A),n=e.options&&e.options.params||null;if(i.containsDynamicStyles){let o=new Set,a=n||{};i.styles.forEach(r=>{r instanceof Map&&r.forEach(s=>{Xb(s).forEach(l=>{a.hasOwnProperty(l)||o.add(l)})})}),o.size&&A.errors.push(WG(e.name,[...o.values()]))}return{type:rn.State,name:e.name,style:i,options:n?{params:n}:null}}visitTransition(e,A){A.queryCount=0,A.depCount=0;let i=qs(this,dB(e.animation),A),n=KoA(e.expr,A.errors);return{type:rn.Transition,matchers:n,animation:i,queryCount:A.queryCount,depCount:A.depCount,options:c1(e.options)}}visitSequence(e,A){return{type:rn.Sequence,steps:e.steps.map(i=>qs(this,i,A)),options:c1(e.options)}}visitGroup(e,A){let i=A.currentTime,n=0,o=e.steps.map(a=>{A.currentTime=i;let r=qs(this,a,A);return n=Math.max(n,A.currentTime),r});return A.currentTime=n,{type:rn.Group,steps:o,options:c1(e.options)}}visitAnimate(e,A){let i=zoA(e.timings,A.errors);A.currentAnimateTimings=i;let n,o=e.styles?e.styles:Jb({});if(o.type==rn.Keyframes)n=this.visitKeyframes(o,A);else{let a=e.styles,r=!1;if(!a){r=!0;let l={};i.easing&&(l.easing=i.easing),a=Jb(l)}A.currentTime+=i.duration+i.delay;let s=this.visitStyle(a,A);s.isEmptyStep=r,n=s}return A.currentAnimateTimings=null,{type:rn.Animate,timings:i,style:n,options:null}}visitStyle(e,A){let i=this._makeStyleAst(e,A);return this._validateStyleAst(i,A),i}_makeStyleAst(e,A){let i=[],n=Array.isArray(e.styles)?e.styles:[e.styles];for(let r of n)typeof r=="string"?r===Ng?i.push(r):A.errors.push(ZG(r)):i.push(new Map(Object.entries(r)));let o=!1,a=null;return i.forEach(r=>{if(r instanceof Map&&(r.has("easing")&&(a=r.get("easing"),r.delete("easing")),!o)){for(let s of r.values())if(s.toString().indexOf(Vb)>=0){o=!0;break}}}),{type:rn.Style,styles:i,easing:a,offset:e.offset,containsDynamicStyles:o,options:null}}_validateStyleAst(e,A){let i=A.currentAnimateTimings,n=A.currentTime,o=A.currentTime;i&&o>0&&(o-=i.duration+i.delay),e.styles.forEach(a=>{typeof a!="string"&&a.forEach((r,s)=>{let l=A.collectedStyles.get(A.currentQuerySelector),g=l.get(s),C=!0;g&&(o!=n&&o>=g.startTime&&n<=g.endTime&&(A.errors.push(XG(s,g.startTime,g.endTime,o,n)),C=!1),o=g.startTime),C&&l.set(s,{startTime:o,endTime:n}),A.options&&fK(r,A.options,A.errors)})})}visitKeyframes(e,A){let i={type:rn.Keyframes,styles:[],options:null};if(!A.currentAnimateTimings)return A.errors.push($G()),i;let n=1,o=0,a=[],r=!1,s=!1,l=0,g=e.steps.map(m=>{let v=this._makeStyleAst(m,A),k=v.offset!=null?v.offset:HoA(v.styles),S=0;return k!=null&&(o++,S=v.offset=k),s=s||S<0||S>1,r=r||S0&&o{let k=I>0?v==d?1:I*v:a[v],S=k*f;A.currentTime=h+E.delay+S,E.duration=S,this._validateStyleAst(m,A),m.offset=k,i.styles.push(m)}),i}visitReference(e,A){return{type:rn.Reference,animation:qs(this,dB(e.animation),A),options:c1(e.options)}}visitAnimateChild(e,A){return A.depCount++,{type:rn.AnimateChild,options:c1(e.options)}}visitAnimateRef(e,A){return{type:rn.AnimateRef,animation:this.visitReference(e.animation,A),options:c1(e.options)}}visitQuery(e,A){let i=A.currentQuerySelector,n=e.options||{};A.queryCount++,A.currentQuery=e;let[o,a]=OoA(e.selector);A.currentQuerySelector=i.length?i+" "+o:o,js(A.collectedStyles,A.currentQuerySelector,new Map);let r=qs(this,dB(e.animation),A);return A.currentQuery=null,A.currentQuerySelector=i,{type:rn.Query,selector:o,limit:n.limit||0,optional:!!n.optional,includeSelf:a,animation:r,originalSelector:e.selector,options:c1(e.options)}}visitStagger(e,A){A.currentQuery||A.errors.push(iK());let i=e.timings==="full"?{duration:0,delay:0,easing:"full"}:au(e.timings,A.errors,!0);return{type:rn.Stagger,animation:qs(this,dB(e.animation),A),timings:i,options:null}}};function OoA(t){let e=!!t.split(/\s*,\s*/).find(A=>A==RK);return e&&(t=t.replace(JoA,"")),t=t.replace(/@\*/g,ou).replace(/@\w+/g,A=>ou+"-"+A.slice(1)).replace(/:animating/g,Gp),[t,e]}function YoA(t){return t?gA({},t):null}var o7=class{errors;queryCount=0;depCount=0;currentTransition=null;currentQuery=null;currentQuerySelector=null;currentAnimateTimings=null;currentTime=0;collectedStyles=new Map;options=null;unsupportedCSSPropertiesFound=new Set;constructor(e){this.errors=e}};function HoA(t){if(typeof t=="string")return null;let e=null;if(Array.isArray(t))t.forEach(A=>{if(A instanceof Map&&A.has("offset")){let i=A;e=parseFloat(i.get("offset")),i.delete("offset")}});else if(t instanceof Map&&t.has("offset")){let A=t;e=parseFloat(A.get("offset")),A.delete("offset")}return e}function zoA(t,e){if(t.hasOwnProperty("duration"))return t;if(typeof t=="number"){let o=au(t,e).duration;return $b(o,0,"")}let A=t;if(A.split(/\s+/).some(o=>o.charAt(0)=="{"&&o.charAt(1)=="{")){let o=$b(0,0,"");return o.dynamic=!0,o.strValue=A,o}let n=au(A,e);return $b(n.duration,n.delay,n.easing)}function c1(t){return t?(t=gA({},t),t.params&&(t.params=YoA(t.params))):t={},t}function $b(t,e,A){return{duration:t,delay:e,easing:A}}function E7(t,e,A,i,n,o,a=null,r=!1){return{type:1,element:t,keyframes:e,preStyleProps:A,postStyleProps:i,duration:n,delay:o,totalTime:n+o,easing:a,subTimeline:r}}var su=class{_map=new Map;get(e){return this._map.get(e)||[]}append(e,A){let i=this._map.get(e);i||this._map.set(e,i=[]),i.push(...A)}has(e){return this._map.has(e)}clear(){this._map.clear()}},PoA=1,joA=":enter",qoA=new RegExp(joA,"g"),VoA=":leave",WoA=new RegExp(VoA,"g");function FK(t,e,A,i,n,o=new Map,a=new Map,r,s,l=[]){return new a7().buildKeyframes(t,e,A,i,n,o,a,r,s,l)}var a7=class{buildKeyframes(e,A,i,n,o,a,r,s,l,g=[]){l=l||new su;let C=new r7(e,A,l,n,o,g,[]);C.options=s;let I=s.delay?Hc(s.delay):0;C.currentTimeline.delayNextStep(I),C.currentTimeline.setStyles([a],null,C.errors,s),qs(this,i,C);let d=C.timelines.filter(h=>h.containsAnimation());if(d.length&&r.size){let h;for(let E=d.length-1;E>=0;E--){let f=d[E];if(f.element===A){h=f;break}}h&&!h.allowOnlyTimelineStyles()&&h.setStyles([r],null,C.errors,s)}return d.length?d.map(h=>h.buildKeyframes()):[E7(A,[],[],[],0,I,"",!1)]}visitTrigger(e,A){}visitState(e,A){}visitTransition(e,A){}visitAnimateChild(e,A){let i=A.subInstructions.get(A.element);if(i){let n=A.createSubContext(e.options),o=A.currentTimeline.currentTime,a=this._visitSubInstructions(i,n,n.options);o!=a&&A.transformIntoNewTimeline(a)}A.previousNode=e}visitAnimateRef(e,A){let i=A.createSubContext(e.options);i.transformIntoNewTimeline(),this._applyAnimationRefDelays([e.options,e.animation.options],A,i),this.visitReference(e.animation,i),A.transformIntoNewTimeline(i.currentTimeline.currentTime),A.previousNode=e}_applyAnimationRefDelays(e,A,i){for(let n of e){let o=n?.delay;if(o){let a=typeof o=="number"?o:Hc(BB(o,n?.params??{},A.errors));i.delayNextStep(a)}}}_visitSubInstructions(e,A,i){let o=A.currentTimeline.currentTime,a=i.duration!=null?Hc(i.duration):null,r=i.delay!=null?Hc(i.delay):null;return a!==0&&e.forEach(s=>{let l=A.appendInstructionToTimeline(s,a,r);o=Math.max(o,l.duration+l.delay)}),o}visitReference(e,A){A.updateOptions(e.options,!0),qs(this,e.animation,A),A.previousNode=e}visitSequence(e,A){let i=A.subContextCount,n=A,o=e.options;if(o&&(o.params||o.delay)&&(n=A.createSubContext(o),n.transformIntoNewTimeline(),o.delay!=null)){n.previousNode.type==rn.Style&&(n.currentTimeline.snapshotCurrentStyles(),n.previousNode=Pp);let a=Hc(o.delay);n.delayNextStep(a)}e.steps.length&&(e.steps.forEach(a=>qs(this,a,n)),n.currentTimeline.applyStylesToKeyframe(),n.subContextCount>i&&n.transformIntoNewTimeline()),A.previousNode=e}visitGroup(e,A){let i=[],n=A.currentTimeline.currentTime,o=e.options&&e.options.delay?Hc(e.options.delay):0;e.steps.forEach(a=>{let r=A.createSubContext(e.options);o&&r.delayNextStep(o),qs(this,a,r),n=Math.max(n,r.currentTimeline.currentTime),i.push(r.currentTimeline)}),i.forEach(a=>A.currentTimeline.mergeTimelineCollectedStyles(a)),A.transformIntoNewTimeline(n),A.previousNode=e}_visitTiming(e,A){if(e.dynamic){let i=e.strValue,n=A.params?BB(i,A.params,A.errors):i;return au(n,A.errors)}else return{duration:e.duration,delay:e.delay,easing:e.easing}}visitAnimate(e,A){let i=A.currentAnimateTimings=this._visitTiming(e.timings,A),n=A.currentTimeline;i.delay&&(A.incrementTime(i.delay),n.snapshotCurrentStyles());let o=e.style;o.type==rn.Keyframes?this.visitKeyframes(o,A):(A.incrementTime(i.duration),this.visitStyle(o,A),n.applyStylesToKeyframe()),A.currentAnimateTimings=null,A.previousNode=e}visitStyle(e,A){let i=A.currentTimeline,n=A.currentAnimateTimings;!n&&i.hasCurrentStyleProperties()&&i.forwardFrame();let o=n&&n.easing||e.easing;e.isEmptyStep?i.applyEmptyStep(o):i.setStyles(e.styles,o,A.errors,A.options),A.previousNode=e}visitKeyframes(e,A){let i=A.currentAnimateTimings,n=A.currentTimeline.duration,o=i.duration,r=A.createSubContext().currentTimeline;r.easing=i.easing,e.styles.forEach(s=>{let l=s.offset||0;r.forwardTime(l*o),r.setStyles(s.styles,s.easing,A.errors,A.options),r.applyStylesToKeyframe()}),A.currentTimeline.mergeTimelineCollectedStyles(r),A.transformIntoNewTimeline(n+o),A.previousNode=e}visitQuery(e,A){let i=A.currentTimeline.currentTime,n=e.options||{},o=n.delay?Hc(n.delay):0;o&&(A.previousNode.type===rn.Style||i==0&&A.currentTimeline.hasCurrentStyleProperties())&&(A.currentTimeline.snapshotCurrentStyles(),A.previousNode=Pp);let a=i,r=A.invokeQuery(e.selector,e.originalSelector,e.limit,e.includeSelf,!!n.optional,A.errors);A.currentQueryTotal=r.length;let s=null;r.forEach((l,g)=>{A.currentQueryIndex=g;let C=A.createSubContext(e.options,l);o&&C.delayNextStep(o),l===A.element&&(s=C.currentTimeline),qs(this,e.animation,C),C.currentTimeline.applyStylesToKeyframe();let I=C.currentTimeline.currentTime;a=Math.max(a,I)}),A.currentQueryIndex=0,A.currentQueryTotal=0,A.transformIntoNewTimeline(a),s&&(A.currentTimeline.mergeTimelineCollectedStyles(s),A.currentTimeline.snapshotCurrentStyles()),A.previousNode=e}visitStagger(e,A){let i=A.parentContext,n=A.currentTimeline,o=e.timings,a=Math.abs(o.duration),r=a*(A.currentQueryTotal-1),s=a*A.currentQueryIndex;switch(o.duration<0?"reverse":o.easing){case"reverse":s=r-s;break;case"full":s=i.currentStaggerTime;break}let g=A.currentTimeline;s&&g.delayNextStep(s);let C=g.currentTime;qs(this,e.animation,A),A.previousNode=e,i.currentStaggerTime=n.currentTime-C+(n.startTime-i.currentTimeline.startTime)}},Pp={},r7=class t{_driver;element;subInstructions;_enterClassName;_leaveClassName;errors;timelines;parentContext=null;currentTimeline;currentAnimateTimings=null;previousNode=Pp;subContextCount=0;options={};currentQueryIndex=0;currentQueryTotal=0;currentStaggerTime=0;constructor(e,A,i,n,o,a,r,s){this._driver=e,this.element=A,this.subInstructions=i,this._enterClassName=n,this._leaveClassName=o,this.errors=a,this.timelines=r,this.currentTimeline=s||new jp(this._driver,A,0),r.push(this.currentTimeline)}get params(){return this.options.params}updateOptions(e,A){if(!e)return;let i=e,n=this.options;i.duration!=null&&(n.duration=Hc(i.duration)),i.delay!=null&&(n.delay=Hc(i.delay));let o=i.params;if(o){let a=n.params;a||(a=this.options.params={}),Object.keys(o).forEach(r=>{(!A||!a.hasOwnProperty(r))&&(a[r]=BB(o[r],a,this.errors))})}}_copyOptions(){let e={};if(this.options){let A=this.options.params;if(A){let i=e.params={};Object.keys(A).forEach(n=>{i[n]=A[n]})}}return e}createSubContext(e=null,A,i){let n=A||this.element,o=new t(this._driver,n,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(n,i||0));return o.previousNode=this.previousNode,o.currentAnimateTimings=this.currentAnimateTimings,o.options=this._copyOptions(),o.updateOptions(e),o.currentQueryIndex=this.currentQueryIndex,o.currentQueryTotal=this.currentQueryTotal,o.parentContext=this,this.subContextCount++,o}transformIntoNewTimeline(e){return this.previousNode=Pp,this.currentTimeline=this.currentTimeline.fork(this.element,e),this.timelines.push(this.currentTimeline),this.currentTimeline}appendInstructionToTimeline(e,A,i){let n={duration:A??e.duration,delay:this.currentTimeline.currentTime+(i??0)+e.delay,easing:""},o=new s7(this._driver,e.element,e.keyframes,e.preStyleProps,e.postStyleProps,n,e.stretchStartingKeyframe);return this.timelines.push(o),n}incrementTime(e){this.currentTimeline.forwardTime(this.currentTimeline.duration+e)}delayNextStep(e){e>0&&this.currentTimeline.delayNextStep(e)}invokeQuery(e,A,i,n,o,a){let r=[];if(n&&r.push(this.element),e.length>0){e=e.replace(qoA,"."+this._enterClassName),e=e.replace(WoA,"."+this._leaveClassName);let s=i!=1,l=this._driver.query(this.element,e,s);i!==0&&(l=i<0?l.slice(l.length+i,l.length):l.slice(0,i)),r.push(...l)}return!o&&r.length==0&&a.push(nK(A)),r}},jp=class t{_driver;element;startTime;_elementTimelineStylesLookup;duration=0;easing=null;_previousKeyframe=new Map;_currentKeyframe=new Map;_keyframes=new Map;_styleSummary=new Map;_localTimelineStyles=new Map;_globalTimelineStyles;_pendingStyles=new Map;_backFill=new Map;_currentEmptyStepKeyframe=null;constructor(e,A,i,n){this._driver=e,this.element=A,this.startTime=i,this._elementTimelineStylesLookup=n,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(A),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(A,this._localTimelineStyles)),this._loadKeyframe()}containsAnimation(){switch(this._keyframes.size){case 0:return!1;case 1:return this.hasCurrentStyleProperties();default:return!0}}hasCurrentStyleProperties(){return this._currentKeyframe.size>0}get currentTime(){return this.startTime+this.duration}delayNextStep(e){let A=this._keyframes.size===1&&this._pendingStyles.size;this.duration||A?(this.forwardTime(this.currentTime+e),A&&this.snapshotCurrentStyles()):this.startTime+=e}fork(e,A){return this.applyStylesToKeyframe(),new t(this._driver,e,A||this.currentTime,this._elementTimelineStylesLookup)}_loadKeyframe(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=new Map,this._keyframes.set(this.duration,this._currentKeyframe))}forwardFrame(){this.duration+=PoA,this._loadKeyframe()}forwardTime(e){this.applyStylesToKeyframe(),this.duration=e,this._loadKeyframe()}_updateStyle(e,A){this._localTimelineStyles.set(e,A),this._globalTimelineStyles.set(e,A),this._styleSummary.set(e,{time:this.currentTime,value:A})}allowOnlyTimelineStyles(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}applyEmptyStep(e){e&&this._previousKeyframe.set("easing",e);for(let[A,i]of this._globalTimelineStyles)this._backFill.set(A,i||Ng),this._currentKeyframe.set(A,Ng);this._currentEmptyStepKeyframe=this._currentKeyframe}setStyles(e,A,i,n){A&&this._previousKeyframe.set("easing",A);let o=n&&n.params||{},a=ZoA(e,this._globalTimelineStyles);for(let[r,s]of a){let l=BB(s,o,i);this._pendingStyles.set(r,l),this._localTimelineStyles.has(r)||this._backFill.set(r,this._globalTimelineStyles.get(r)??Ng),this._updateStyle(r,l)}}applyStylesToKeyframe(){this._pendingStyles.size!=0&&(this._pendingStyles.forEach((e,A)=>{this._currentKeyframe.set(A,e)}),this._pendingStyles.clear(),this._localTimelineStyles.forEach((e,A)=>{this._currentKeyframe.has(A)||this._currentKeyframe.set(A,e)}))}snapshotCurrentStyles(){for(let[e,A]of this._localTimelineStyles)this._pendingStyles.set(e,A),this._updateStyle(e,A)}getFinalKeyframe(){return this._keyframes.get(this.duration)}get properties(){let e=[];for(let A in this._currentKeyframe)e.push(A);return e}mergeTimelineCollectedStyles(e){e._styleSummary.forEach((A,i)=>{let n=this._styleSummary.get(i);(!n||A.time>n.time)&&this._updateStyle(i,A.value)})}buildKeyframes(){this.applyStylesToKeyframe();let e=new Set,A=new Set,i=this._keyframes.size===1&&this.duration===0,n=[];this._keyframes.forEach((r,s)=>{let l=new Map([...this._backFill,...r]);l.forEach((g,C)=>{g===iu?e.add(C):g===Ng&&A.add(C)}),i||l.set("offset",s/this.duration),n.push(l)});let o=[...e.values()],a=[...A.values()];if(i){let r=n[0],s=new Map(r);r.set("offset",0),s.set("offset",1),n=[r,s]}return E7(this.element,n,o,a,this.duration,this.startTime,this.easing,!1)}},s7=class extends jp{keyframes;preStyleProps;postStyleProps;_stretchStartingKeyframe;timings;constructor(e,A,i,n,o,a,r=!1){super(e,A,a.delay),this.keyframes=i,this.preStyleProps=n,this.postStyleProps=o,this._stretchStartingKeyframe=r,this.timings={duration:a.duration,delay:a.delay,easing:a.easing}}containsAnimation(){return this.keyframes.length>1}buildKeyframes(){let e=this.keyframes,{delay:A,duration:i,easing:n}=this.timings;if(this._stretchStartingKeyframe&&A){let o=[],a=i+A,r=A/a,s=new Map(e[0]);s.set("offset",0),o.push(s);let l=new Map(e[0]);l.set("offset",yK(r)),o.push(l);let g=e.length-1;for(let C=1;C<=g;C++){let I=new Map(e[C]),d=I.get("offset"),h=A+d*i;I.set("offset",yK(h/a)),o.push(I)}i=a,A=0,n="",e=o}return E7(this.element,e,this.preStyleProps,this.postStyleProps,i,A,n,!0)}};function yK(t,e=3){let A=Math.pow(10,e-1);return Math.round(t*A)/A}function ZoA(t,e){let A=new Map,i;return t.forEach(n=>{if(n==="*"){i??=e.keys();for(let o of i)A.set(o,Ng)}else for(let[o,a]of n)A.set(o,a)}),A}function vK(t,e,A,i,n,o,a,r,s,l,g,C,I){return{type:0,element:t,triggerName:e,isRemovalTransition:n,fromState:A,fromStyles:o,toState:i,toStyles:a,timelines:r,queriedElements:s,preStyleProps:l,postStyleProps:g,totalTime:C,errors:I}}var A7={},qp=class{_triggerName;ast;_stateStyles;constructor(e,A,i){this._triggerName=e,this.ast=A,this._stateStyles=i}match(e,A,i,n){return XoA(this.ast.matchers,e,A,i,n)}buildStyles(e,A,i){let n=this._stateStyles.get("*");return e!==void 0&&(n=this._stateStyles.get(e?.toString())||n),n?n.buildStyles(A,i):new Map}build(e,A,i,n,o,a,r,s,l,g){let C=[],I=this.ast.options&&this.ast.options.params||A7,d=r&&r.params||A7,h=this.buildStyles(i,d,C),E=s&&s.params||A7,f=this.buildStyles(n,E,C),m=new Set,v=new Map,k=new Map,S=n==="void",b={params:LK(E,I),delay:this.ast.options?.delay},x=g?[]:FK(e,A,this.ast.animation,o,a,h,f,b,l,C),F=0;return x.forEach(z=>{F=Math.max(z.duration+z.delay,F)}),C.length?vK(A,this._triggerName,i,n,S,h,f,[],[],v,k,F,C):(x.forEach(z=>{let P=z.element,Z=js(v,P,new Set);z.preStyleProps.forEach(W=>Z.add(W));let tA=js(k,P,new Set);z.postStyleProps.forEach(W=>tA.add(W)),P!==A&&m.add(P)}),vK(A,this._triggerName,i,n,S,h,f,x,[...m.values()],v,k,F))}};function XoA(t,e,A,i,n){return t.some(o=>o(e,A,i,n))}function LK(t,e){let A=gA({},e);return Object.entries(t).forEach(([i,n])=>{n!=null&&(A[i]=n)}),A}var l7=class{styles;defaultParams;normalizer;constructor(e,A,i){this.styles=e,this.defaultParams=A,this.normalizer=i}buildStyles(e,A){let i=new Map,n=LK(e,this.defaultParams);return this.styles.styles.forEach(o=>{typeof o!="string"&&o.forEach((a,r)=>{a&&(a=BB(a,n,A));let s=this.normalizer.normalizePropertyName(r,A);a=this.normalizer.normalizeStyleValue(r,s,a,A),i.set(r,a)})}),i}};function $oA(t,e,A){return new g7(t,e,A)}var g7=class{name;ast;_normalizer;transitionFactories=[];fallbackTransition;states=new Map;constructor(e,A,i){this.name=e,this.ast=A,this._normalizer=i,A.states.forEach(n=>{let o=n.options&&n.options.params||{};this.states.set(n.name,new l7(n.style,o,i))}),bK(this.states,"true","1"),bK(this.states,"false","0"),A.transitions.forEach(n=>{this.transitionFactories.push(new qp(e,n,this.states))}),this.fallbackTransition=AaA(e,this.states)}get containsQueries(){return this.ast.queryCount>0}matchTransition(e,A,i,n){return this.transitionFactories.find(a=>a.match(e,A,i,n))||null}matchStyles(e,A,i){return this.fallbackTransition.buildStyles(e,A,i)}};function AaA(t,e,A){let i=[(a,r)=>!0],n={type:rn.Sequence,steps:[],options:null},o={type:rn.Transition,animation:n,matchers:i,options:null,queryCount:0,depCount:0};return new qp(t,o,e)}function bK(t,e,A){t.has(e)?t.has(A)||t.set(A,t.get(e)):t.has(A)&&t.set(e,t.get(A))}var eaA=new su,c7=class{bodyNode;_driver;_normalizer;_animations=new Map;_playersById=new Map;players=[];constructor(e,A,i){this.bodyNode=e,this._driver=A,this._normalizer=i}register(e,A){let i=[],n=[],o=NK(this._driver,A,i,n);if(i.length)throw sK(i);this._animations.set(e,o)}_buildPlayer(e,A,i){let n=e.element,o=zb(this._normalizer,e.keyframes,A,i);return this._driver.animate(n,o,e.duration,e.delay,e.easing,[],!0)}create(e,A,i={}){let n=[],o=this._animations.get(e),a,r=new Map;if(o?(a=FK(this._driver,A,o,Wb,Lp,new Map,new Map,i,eaA,n),a.forEach(g=>{let C=js(r,g.element,new Map);g.postStyleProps.forEach(I=>C.set(I,null))})):(n.push(lK()),a=[]),n.length)throw gK(n);r.forEach((g,C)=>{g.forEach((I,d)=>{g.set(d,this._driver.computeStyle(C,d,Ng))})});let s=a.map(g=>{let C=r.get(g.element);return this._buildPlayer(g,new Map,C)}),l=P0(s);return this._playersById.set(e,l),l.onDestroy(()=>this.destroy(e)),this.players.push(l),l}destroy(e){let A=this._getPlayer(e);A.destroy(),this._playersById.delete(e);let i=this.players.indexOf(A);i>=0&&this.players.splice(i,1)}_getPlayer(e){let A=this._playersById.get(e);if(!A)throw cK(e);return A}listen(e,A,i,n){let o=Np(A,"","","");return Rp(this._getPlayer(e),i,o,n),()=>{}}command(e,A,i,n){if(i=="register"){this.register(e,n[0]);return}if(i=="create"){let a=n[0]||{};this.create(e,A,a);return}let o=this._getPlayer(e);switch(i){case"play":o.play();break;case"pause":o.pause();break;case"reset":o.reset();break;case"restart":o.restart();break;case"finish":o.finish();break;case"init":o.init();break;case"setPosition":o.setPosition(parseFloat(n[0]));break;case"destroy":this.destroy(e);break}}},MK="ng-animate-queued",taA=".ng-animate-queued",e7="ng-animate-disabled",iaA=".ng-animate-disabled",naA="ng-star-inserted",oaA=".ng-star-inserted",aaA=[],GK={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},raA={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},Lg="__ng_removed",lu=class{namespaceId;value;options;get params(){return this.options.params}constructor(e,A=""){this.namespaceId=A;let i=e&&e.hasOwnProperty("value"),n=i?e.value:e;if(this.value=laA(n),i){let o=e,{value:a}=o,r=vF(o,["value"]);this.options=r}else this.options={};this.options.params||(this.options.params={})}absorbOptions(e){let A=e.params;if(A){let i=this.options.params;Object.keys(A).forEach(n=>{i[n]==null&&(i[n]=A[n])})}}},ru="void",t7=new lu(ru),C7=class{id;hostElement;_engine;players=[];_triggers=new Map;_queue=[];_elementListeners=new Map;_hostClassName;constructor(e,A,i){this.id=e,this.hostElement=A,this._engine=i,this._hostClassName="ng-tns-"+e,Pl(A,this._hostClassName)}listen(e,A,i,n){if(!this._triggers.has(A))throw CK(i,A);if(i==null||i.length==0)throw IK(A);if(!gaA(i))throw dK(i,A);let o=js(this._elementListeners,e,[]),a={name:A,phase:i,callback:n};o.push(a);let r=js(this._engine.statesByElement,e,new Map);return r.has(A)||(Pl(e,nu),Pl(e,nu+"-"+A),r.set(A,t7)),()=>{this._engine.afterFlush(()=>{let s=o.indexOf(a);s>=0&&o.splice(s,1),this._triggers.has(A)||r.delete(A)})}}register(e,A){return this._triggers.has(e)?!1:(this._triggers.set(e,A),!0)}_getTrigger(e){let A=this._triggers.get(e);if(!A)throw BK(e);return A}trigger(e,A,i,n=!0){let o=this._getTrigger(A),a=new gu(this.id,A,e),r=this._engine.statesByElement.get(e);r||(Pl(e,nu),Pl(e,nu+"-"+A),this._engine.statesByElement.set(e,r=new Map));let s=r.get(A),l=new lu(i,this.id);if(!(i&&i.hasOwnProperty("value"))&&s&&l.absorbOptions(s.options),r.set(A,l),s||(s=t7),!(l.value===ru)&&s.value===l.value){if(!IaA(s.params,l.params)){let E=[],f=o.matchStyles(s.value,s.params,E),m=o.matchStyles(l.value,l.params,E);E.length?this._engine.reportError(E):this._engine.afterFlush(()=>{s2(e,f),Fg(e,m)})}return}let I=js(this._engine.playersByElement,e,[]);I.forEach(E=>{E.namespaceId==this.id&&E.triggerName==A&&E.queued&&E.destroy()});let d=o.matchTransition(s.value,l.value,e,l.params),h=!1;if(!d){if(!n)return;d=o.fallbackTransition,h=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:A,transition:d,fromState:s,toState:l,player:a,isFallbackTransition:h}),h||(Pl(e,MK),a.onStart(()=>{EB(e,MK)})),a.onDone(()=>{let E=this.players.indexOf(a);E>=0&&this.players.splice(E,1);let f=this._engine.playersByElement.get(e);if(f){let m=f.indexOf(a);m>=0&&f.splice(m,1)}}),this.players.push(a),I.push(a),a}deregister(e){this._triggers.delete(e),this._engine.statesByElement.forEach(A=>A.delete(e)),this._elementListeners.forEach((A,i)=>{this._elementListeners.set(i,A.filter(n=>n.name!=e))})}clearElementCache(e){this._engine.statesByElement.delete(e),this._elementListeners.delete(e);let A=this._engine.playersByElement.get(e);A&&(A.forEach(i=>i.destroy()),this._engine.playersByElement.delete(e))}_signalRemovalForInnerTriggers(e,A){let i=this._engine.driver.query(e,ou,!0);i.forEach(n=>{if(n[Lg])return;let o=this._engine.fetchNamespacesByElement(n);o.size?o.forEach(a=>a.triggerLeaveAnimation(n,A,!1,!0)):this.clearElementCache(n)}),this._engine.afterFlushAnimationsDone(()=>i.forEach(n=>this.clearElementCache(n)))}triggerLeaveAnimation(e,A,i,n){let o=this._engine.statesByElement.get(e),a=new Map;if(o){let r=[];if(o.forEach((s,l)=>{if(a.set(l,s.value),this._triggers.has(l)){let g=this.trigger(e,l,ru,n);g&&r.push(g)}}),r.length)return this._engine.markElementAsRemoved(this.id,e,!0,A,a),i&&P0(r).onDone(()=>this._engine.processLeaveNode(e)),!0}return!1}prepareLeaveAnimationListeners(e){let A=this._elementListeners.get(e),i=this._engine.statesByElement.get(e);if(A&&i){let n=new Set;A.forEach(o=>{let a=o.name;if(n.has(a))return;n.add(a);let s=this._triggers.get(a).fallbackTransition,l=i.get(a)||t7,g=new lu(ru),C=new gu(this.id,a,e);this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:a,transition:s,fromState:l,toState:g,player:C,isFallbackTransition:!0})})}}removeNode(e,A){let i=this._engine;if(e.childElementCount&&this._signalRemovalForInnerTriggers(e,A),this.triggerLeaveAnimation(e,A,!0))return;let n=!1;if(i.totalAnimations){let o=i.players.length?i.playersByQueriedElement.get(e):[];if(o&&o.length)n=!0;else{let a=e;for(;a=a.parentNode;)if(i.statesByElement.get(a)){n=!0;break}}}if(this.prepareLeaveAnimationListeners(e),n)i.markElementAsRemoved(this.id,e,!1,A);else{let o=e[Lg];(!o||o===GK)&&(i.afterFlush(()=>this.clearElementCache(e)),i.destroyInnerAnimations(e),i._onRemovalComplete(e,A))}}insertNode(e,A){Pl(e,this._hostClassName)}drainQueuedTransitions(e){let A=[];return this._queue.forEach(i=>{let n=i.player;if(n.destroyed)return;let o=i.element,a=this._elementListeners.get(o);a&&a.forEach(r=>{if(r.name==i.triggerName){let s=Np(o,i.triggerName,i.fromState.value,i.toState.value);s._data=e,Rp(i.player,r.phase,s,r.callback)}}),n.markedForDestroy?this._engine.afterFlush(()=>{n.destroy()}):A.push(i)}),this._queue=[],A.sort((i,n)=>{let o=i.transition.ast.depCount,a=n.transition.ast.depCount;return o==0||a==0?o-a:this._engine.driver.containsElement(i.element,n.element)?1:-1})}destroy(e){this.players.forEach(A=>A.destroy()),this._signalRemovalForInnerTriggers(this.hostElement,e)}},I7=class{bodyNode;driver;_normalizer;players=[];newHostElements=new Map;playersByElement=new Map;playersByQueriedElement=new Map;statesByElement=new Map;disabledNodes=new Set;totalAnimations=0;totalQueuedPlayers=0;_namespaceLookup={};_namespaceList=[];_flushFns=[];_whenQuietFns=[];namespacesByHostElement=new Map;collectedEnterElements=[];collectedLeaveElements=[];onRemovalComplete=(e,A)=>{};_onRemovalComplete(e,A){this.onRemovalComplete(e,A)}constructor(e,A,i){this.bodyNode=e,this.driver=A,this._normalizer=i}get queuedPlayers(){let e=[];return this._namespaceList.forEach(A=>{A.players.forEach(i=>{i.queued&&e.push(i)})}),e}createNamespace(e,A){let i=new C7(e,A,this);return this.bodyNode&&this.driver.containsElement(this.bodyNode,A)?this._balanceNamespaceList(i,A):(this.newHostElements.set(A,i),this.collectEnterElement(A)),this._namespaceLookup[e]=i}_balanceNamespaceList(e,A){let i=this._namespaceList,n=this.namespacesByHostElement;if(i.length-1>=0){let a=!1,r=this.driver.getParentElement(A);for(;r;){let s=n.get(r);if(s){let l=i.indexOf(s);i.splice(l+1,0,e),a=!0;break}r=this.driver.getParentElement(r)}a||i.unshift(e)}else i.push(e);return n.set(A,e),e}register(e,A){let i=this._namespaceLookup[e];return i||(i=this.createNamespace(e,A)),i}registerTrigger(e,A,i){let n=this._namespaceLookup[e];n&&n.register(A,i)&&this.totalAnimations++}destroy(e,A){e&&(this.afterFlush(()=>{}),this.afterFlushAnimationsDone(()=>{let i=this._fetchNamespace(e);this.namespacesByHostElement.delete(i.hostElement);let n=this._namespaceList.indexOf(i);n>=0&&this._namespaceList.splice(n,1),i.destroy(A),delete this._namespaceLookup[e]}))}_fetchNamespace(e){return this._namespaceLookup[e]}fetchNamespacesByElement(e){let A=new Set,i=this.statesByElement.get(e);if(i){for(let n of i.values())if(n.namespaceId){let o=this._fetchNamespace(n.namespaceId);o&&A.add(o)}}return A}trigger(e,A,i,n){if(Op(A)){let o=this._fetchNamespace(e);if(o)return o.trigger(A,i,n),!0}return!1}insertNode(e,A,i,n){if(!Op(A))return;let o=A[Lg];if(o&&o.setForRemoval){o.setForRemoval=!1,o.setForMove=!0;let a=this.collectedLeaveElements.indexOf(A);a>=0&&this.collectedLeaveElements.splice(a,1)}if(e){let a=this._fetchNamespace(e);a&&a.insertNode(A,i)}n&&this.collectEnterElement(A)}collectEnterElement(e){this.collectedEnterElements.push(e)}markElementAsDisabled(e,A){A?this.disabledNodes.has(e)||(this.disabledNodes.add(e),Pl(e,e7)):this.disabledNodes.has(e)&&(this.disabledNodes.delete(e),EB(e,e7))}removeNode(e,A,i){if(Op(A)){let n=e?this._fetchNamespace(e):null;n?n.removeNode(A,i):this.markElementAsRemoved(e,A,!1,i);let o=this.namespacesByHostElement.get(A);o&&o.id!==e&&o.removeNode(A,i)}else this._onRemovalComplete(A,i)}markElementAsRemoved(e,A,i,n,o){this.collectedLeaveElements.push(A),A[Lg]={namespaceId:e,setForRemoval:n,hasAnimation:i,removedBeforeQueried:!1,previousTriggersValues:o}}listen(e,A,i,n,o){return Op(A)?this._fetchNamespace(e).listen(A,i,n,o):()=>{}}_buildInstruction(e,A,i,n,o){return e.transition.build(this.driver,e.element,e.fromState.value,e.toState.value,i,n,e.fromState.options,e.toState.options,A,o)}destroyInnerAnimations(e){let A=this.driver.query(e,ou,!0);A.forEach(i=>this.destroyActiveAnimationsForElement(i)),this.playersByQueriedElement.size!=0&&(A=this.driver.query(e,Gp,!0),A.forEach(i=>this.finishActiveQueriedAnimationOnElement(i)))}destroyActiveAnimationsForElement(e){let A=this.playersByElement.get(e);A&&A.forEach(i=>{i.queued?i.markedForDestroy=!0:i.destroy()})}finishActiveQueriedAnimationOnElement(e){let A=this.playersByQueriedElement.get(e);A&&A.forEach(i=>i.finish())}whenRenderingDone(){return new Promise(e=>{if(this.players.length)return P0(this.players).onDone(()=>e());e()})}processLeaveNode(e){let A=e[Lg];if(A&&A.setForRemoval){if(e[Lg]=GK,A.namespaceId){this.destroyInnerAnimations(e);let i=this._fetchNamespace(A.namespaceId);i&&i.clearElementCache(e)}this._onRemovalComplete(e,A.setForRemoval)}e.classList?.contains(e7)&&this.markElementAsDisabled(e,!1),this.driver.query(e,iaA,!0).forEach(i=>{this.markElementAsDisabled(i,!1)})}flush(e=-1){let A=[];if(this.newHostElements.size&&(this.newHostElements.forEach((i,n)=>this._balanceNamespaceList(i,n)),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(let i=0;ii()),this._flushFns=[],this._whenQuietFns.length){let i=this._whenQuietFns;this._whenQuietFns=[],A.length?P0(A).onDone(()=>{i.forEach(n=>n())}):i.forEach(n=>n())}}reportError(e){throw EK(e)}_flushAnimations(e,A){let i=new su,n=[],o=new Map,a=[],r=new Map,s=new Map,l=new Map,g=new Set;this.disabledNodes.forEach(AA=>{g.add(AA);let IA=this.driver.query(AA,taA,!0);for(let aA=0;aA{let aA=Wb+E++;h.set(IA,aA),AA.forEach(rA=>Pl(rA,aA))});let f=[],m=new Set,v=new Set;for(let AA=0;AAm.add(rA)):v.add(IA))}let k=new Map,S=xK(I,Array.from(m));S.forEach((AA,IA)=>{let aA=Lp+E++;k.set(IA,aA),AA.forEach(rA=>Pl(rA,aA))}),e.push(()=>{d.forEach((AA,IA)=>{let aA=h.get(IA);AA.forEach(rA=>EB(rA,aA))}),S.forEach((AA,IA)=>{let aA=k.get(IA);AA.forEach(rA=>EB(rA,aA))}),f.forEach(AA=>{this.processLeaveNode(AA)})});let b=[],x=[];for(let AA=this._namespaceList.length-1;AA>=0;AA--)this._namespaceList[AA].drainQueuedTransitions(A).forEach(aA=>{let rA=aA.player,uA=aA.element;if(b.push(rA),this.collectedEnterElements.length){let _e=uA[Lg];if(_e&&_e.setForMove){if(_e.previousTriggersValues&&_e.previousTriggersValues.has(aA.triggerName)){let YA=_e.previousTriggersValues.get(aA.triggerName),fA=this.statesByElement.get(aA.element);if(fA&&fA.has(aA.triggerName)){let XA=fA.get(aA.triggerName);XA.value=YA,fA.set(aA.triggerName,XA)}}rA.destroy();return}}let UA=!C||!this.driver.containsElement(C,uA),$A=k.get(uA),zA=h.get(uA),pA=this._buildInstruction(aA,i,zA,$A,UA);if(pA.errors&&pA.errors.length){x.push(pA);return}if(UA){rA.onStart(()=>s2(uA,pA.fromStyles)),rA.onDestroy(()=>Fg(uA,pA.toStyles)),n.push(rA);return}if(aA.isFallbackTransition){rA.onStart(()=>s2(uA,pA.fromStyles)),rA.onDestroy(()=>Fg(uA,pA.toStyles)),n.push(rA);return}let PA=[];pA.timelines.forEach(_e=>{_e.stretchStartingKeyframe=!0,this.disabledNodes.has(_e.element)||PA.push(_e)}),pA.timelines=PA,i.append(uA,pA.timelines);let Je={instruction:pA,player:rA,element:uA};a.push(Je),pA.queriedElements.forEach(_e=>js(r,_e,[]).push(rA)),pA.preStyleProps.forEach((_e,YA)=>{if(_e.size){let fA=s.get(YA);fA||s.set(YA,fA=new Set),_e.forEach((XA,DA)=>fA.add(DA))}}),pA.postStyleProps.forEach((_e,YA)=>{let fA=l.get(YA);fA||l.set(YA,fA=new Set),_e.forEach((XA,DA)=>fA.add(DA))})});if(x.length){let AA=[];x.forEach(IA=>{AA.push(hK(IA.triggerName,IA.errors))}),b.forEach(IA=>IA.destroy()),this.reportError(AA)}let F=new Map,z=new Map;a.forEach(AA=>{let IA=AA.element;i.has(IA)&&(z.set(IA,IA),this._beforeAnimationBuild(AA.player.namespaceId,AA.instruction,F))}),n.forEach(AA=>{let IA=AA.element;this._getPreviousPlayers(IA,!1,AA.namespaceId,AA.triggerName,null).forEach(rA=>{js(F,IA,[]).push(rA),rA.destroy()})});let P=f.filter(AA=>_K(AA,s,l)),Z=new Map;kK(Z,this.driver,v,l,Ng).forEach(AA=>{_K(AA,s,l)&&P.push(AA)});let W=new Map;d.forEach((AA,IA)=>{kK(W,this.driver,new Set(AA),s,iu)}),P.forEach(AA=>{let IA=Z.get(AA),aA=W.get(AA);Z.set(AA,new Map([...IA?.entries()??[],...aA?.entries()??[]]))});let BA=[],X=[],iA={};a.forEach(AA=>{let{element:IA,player:aA,instruction:rA}=AA;if(i.has(IA)){if(g.has(IA)){aA.onDestroy(()=>Fg(IA,rA.toStyles)),aA.disabled=!0,aA.overrideTotalTime(rA.totalTime),n.push(aA);return}let uA=iA;if(z.size>1){let $A=IA,zA=[];for(;$A=$A.parentNode;){let pA=z.get($A);if(pA){uA=pA;break}zA.push($A)}zA.forEach(pA=>z.set(pA,uA))}let UA=this._buildAnimation(aA.namespaceId,rA,F,o,W,Z);if(aA.setRealPlayer(UA),uA===iA)BA.push(aA);else{let $A=this.playersByElement.get(uA);$A&&$A.length&&(aA.parentPlayer=P0($A)),n.push(aA)}}else s2(IA,rA.fromStyles),aA.onDestroy(()=>Fg(IA,rA.toStyles)),X.push(aA),g.has(IA)&&n.push(aA)}),X.forEach(AA=>{let IA=o.get(AA.element);if(IA&&IA.length){let aA=P0(IA);AA.setRealPlayer(aA)}}),n.forEach(AA=>{AA.parentPlayer?AA.syncPlayerEvents(AA.parentPlayer):AA.destroy()});for(let AA=0;AA!UA.destroyed);uA.length?caA(this,IA,uA):this.processLeaveNode(IA)}return f.length=0,BA.forEach(AA=>{this.players.push(AA),AA.onDone(()=>{AA.destroy();let IA=this.players.indexOf(AA);this.players.splice(IA,1)}),AA.play()}),BA}afterFlush(e){this._flushFns.push(e)}afterFlushAnimationsDone(e){this._whenQuietFns.push(e)}_getPreviousPlayers(e,A,i,n,o){let a=[];if(A){let r=this.playersByQueriedElement.get(e);r&&(a=r)}else{let r=this.playersByElement.get(e);if(r){let s=!o||o==ru;r.forEach(l=>{l.queued||!s&&l.triggerName!=n||a.push(l)})}}return(i||n)&&(a=a.filter(r=>!(i&&i!=r.namespaceId||n&&n!=r.triggerName))),a}_beforeAnimationBuild(e,A,i){let n=A.triggerName,o=A.element,a=A.isRemovalTransition?void 0:e,r=A.isRemovalTransition?void 0:n;for(let s of A.timelines){let l=s.element,g=l!==o,C=js(i,l,[]);this._getPreviousPlayers(l,g,a,r,A.toState).forEach(d=>{let h=d.getRealPlayer();h.beforeDestroy&&h.beforeDestroy(),d.destroy(),C.push(d)})}s2(o,A.fromStyles)}_buildAnimation(e,A,i,n,o,a){let r=A.triggerName,s=A.element,l=[],g=new Set,C=new Set,I=A.timelines.map(h=>{let E=h.element;g.add(E);let f=E[Lg];if(f&&f.removedBeforeQueried)return new z0(h.duration,h.delay);let m=E!==s,v=CaA((i.get(E)||aaA).map(F=>F.getRealPlayer())).filter(F=>{let z=F;return z.element?z.element===E:!1}),k=o.get(E),S=a.get(E),b=zb(this._normalizer,h.keyframes,k,S),x=this._buildPlayer(h,b,v);if(h.subTimeline&&n&&C.add(E),m){let F=new gu(e,r,E);F.setRealPlayer(x),l.push(F)}return x});l.forEach(h=>{js(this.playersByQueriedElement,h.element,[]).push(h),h.onDone(()=>saA(this.playersByQueriedElement,h.element,h))}),g.forEach(h=>Pl(h,Zb));let d=P0(I);return d.onDestroy(()=>{g.forEach(h=>EB(h,Zb)),Fg(s,A.toStyles)}),C.forEach(h=>{js(n,h,[]).push(d)}),d}_buildPlayer(e,A,i){return A.length>0?this.driver.animate(e.element,A,e.duration,e.delay,e.easing,i):new z0(e.duration,e.delay)}},gu=class{namespaceId;triggerName;element;_player=new z0;_containsRealPlayer=!1;_queuedCallbacks=new Map;destroyed=!1;parentPlayer=null;markedForDestroy=!1;disabled=!1;queued=!0;totalTime=0;constructor(e,A,i){this.namespaceId=e,this.triggerName=A,this.element=i}setRealPlayer(e){this._containsRealPlayer||(this._player=e,this._queuedCallbacks.forEach((A,i)=>{A.forEach(n=>Rp(e,i,void 0,n))}),this._queuedCallbacks.clear(),this._containsRealPlayer=!0,this.overrideTotalTime(e.totalTime),this.queued=!1)}getRealPlayer(){return this._player}overrideTotalTime(e){this.totalTime=e}syncPlayerEvents(e){let A=this._player;A.triggerCallback&&e.onStart(()=>A.triggerCallback("start")),e.onDone(()=>this.finish()),e.onDestroy(()=>this.destroy())}_queueEvent(e,A){js(this._queuedCallbacks,e,[]).push(A)}onDone(e){this.queued&&this._queueEvent("done",e),this._player.onDone(e)}onStart(e){this.queued&&this._queueEvent("start",e),this._player.onStart(e)}onDestroy(e){this.queued&&this._queueEvent("destroy",e),this._player.onDestroy(e)}init(){this._player.init()}hasStarted(){return this.queued?!1:this._player.hasStarted()}play(){!this.queued&&this._player.play()}pause(){!this.queued&&this._player.pause()}restart(){!this.queued&&this._player.restart()}finish(){this._player.finish()}destroy(){this.destroyed=!0,this._player.destroy()}reset(){!this.queued&&this._player.reset()}setPosition(e){this.queued||this._player.setPosition(e)}getPosition(){return this.queued?0:this._player.getPosition()}triggerCallback(e){let A=this._player;A.triggerCallback&&A.triggerCallback(e)}};function saA(t,e,A){let i=t.get(e);if(i){if(i.length){let n=i.indexOf(A);i.splice(n,1)}i.length==0&&t.delete(e)}return i}function laA(t){return t??null}function Op(t){return t&&t.nodeType===1}function gaA(t){return t=="start"||t=="done"}function SK(t,e){let A=t.style.display;return t.style.display=e??"none",A}function kK(t,e,A,i,n){let o=[];A.forEach(s=>o.push(SK(s)));let a=[];i.forEach((s,l)=>{let g=new Map;s.forEach(C=>{let I=e.computeStyle(l,C,n);g.set(C,I),(!I||I.length==0)&&(l[Lg]=raA,a.push(l))}),t.set(l,g)});let r=0;return A.forEach(s=>SK(s,o[r++])),a}function xK(t,e){let A=new Map;if(t.forEach(r=>A.set(r,[])),e.length==0)return A;let i=1,n=new Set(e),o=new Map;function a(r){if(!r)return i;let s=o.get(r);if(s)return s;let l=r.parentNode;return A.has(l)?s=l:n.has(l)?s=i:s=a(l),o.set(r,s),s}return e.forEach(r=>{let s=a(r);s!==i&&A.get(s).push(r)}),A}function Pl(t,e){t.classList?.add(e)}function EB(t,e){t.classList?.remove(e)}function caA(t,e,A){P0(A).onDone(()=>t.processLeaveNode(e))}function CaA(t){let e=[];return KK(t,e),e}function KK(t,e){for(let A=0;An.add(o)):e.set(t,i),A.delete(t),!0}var hB=class{_driver;_normalizer;_transitionEngine;_timelineEngine;_triggerCache={};onRemovalComplete=(e,A)=>{};constructor(e,A,i){this._driver=A,this._normalizer=i,this._transitionEngine=new I7(e.body,A,i),this._timelineEngine=new c7(e.body,A,i),this._transitionEngine.onRemovalComplete=(n,o)=>this.onRemovalComplete(n,o)}registerTrigger(e,A,i,n,o){let a=e+"-"+n,r=this._triggerCache[a];if(!r){let s=[],l=[],g=NK(this._driver,o,s,l);if(s.length)throw rK(n,s);r=$oA(n,g,this._normalizer),this._triggerCache[a]=r}this._transitionEngine.registerTrigger(A,n,r)}register(e,A){this._transitionEngine.register(e,A)}destroy(e,A){this._transitionEngine.destroy(e,A)}onInsert(e,A,i,n){this._transitionEngine.insertNode(e,A,i,n)}onRemove(e,A,i){this._transitionEngine.removeNode(e,A,i)}disableAnimations(e,A){this._transitionEngine.markElementAsDisabled(e,A)}process(e,A,i,n){if(i.charAt(0)=="@"){let[o,a]=Pb(i),r=n;this._timelineEngine.command(o,A,a,r)}else this._transitionEngine.trigger(e,A,i,n)}listen(e,A,i,n,o){if(i.charAt(0)=="@"){let[a,r]=Pb(i);return this._timelineEngine.listen(a,A,r,o)}return this._transitionEngine.listen(e,A,i,n,o)}flush(e=-1){this._transitionEngine.flush(e)}get players(){return[...this._transitionEngine.players,...this._timelineEngine.players]}whenRenderingDone(){return this._transitionEngine.whenRenderingDone()}afterFlushAnimationsDone(e){this._transitionEngine.afterFlushAnimationsDone(e)}};function daA(t,e){let A=null,i=null;return Array.isArray(e)&&e.length?(A=i7(e[0]),e.length>1&&(i=i7(e[e.length-1]))):e instanceof Map&&(A=i7(e)),A||i?new BaA(t,A,i):null}var BaA=(()=>{class t{_element;_startStyles;_endStyles;static initialStylesByElement=new WeakMap;_state=0;_initialStyles;constructor(A,i,n){this._element=A,this._startStyles=i,this._endStyles=n;let o=t.initialStylesByElement.get(A);o||t.initialStylesByElement.set(A,o=new Map),this._initialStyles=o}start(){this._state<1&&(this._startStyles&&Fg(this._element,this._startStyles,this._initialStyles),this._state=1)}finish(){this.start(),this._state<2&&(Fg(this._element,this._initialStyles),this._endStyles&&(Fg(this._element,this._endStyles),this._endStyles=null),this._state=1)}destroy(){this.finish(),this._state<3&&(t.initialStylesByElement.delete(this._element),this._startStyles&&(s2(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(s2(this._element,this._endStyles),this._endStyles=null),Fg(this._element,this._initialStyles),this._state=3)}}return t})();function i7(t){let e=null;return t.forEach((A,i)=>{EaA(i)&&(e=e||new Map,e.set(i,A))}),e}function EaA(t){return t==="display"||t==="position"}var Vp=class{element;keyframes;options;_specialStyles;_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_duration;_delay;_initialized=!1;_finished=!1;_started=!1;_destroyed=!1;_finalKeyframe;_originalOnDoneFns=[];_originalOnStartFns=[];domPlayer=null;time=0;parentPlayer=null;currentSnapshot=new Map;constructor(e,A,i,n){this.element=e,this.keyframes=A,this.options=i,this._specialStyles=n,this._duration=i.duration,this._delay=i.delay||0,this.time=this._duration+this._delay}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this._buildPlayer()&&this._preparePlayerBeforeStart()}_buildPlayer(){if(this._initialized)return this.domPlayer;this._initialized=!0;let e=this.keyframes,A=this._triggerWebAnimation(this.element,e,this.options);if(!A)return this._onFinish(),null;this.domPlayer=A,this._finalKeyframe=e.length?e[e.length-1]:new Map;let i=()=>this._onFinish();return A.addEventListener("finish",i),this.onDestroy(()=>{A.removeEventListener("finish",i)}),A}_preparePlayerBeforeStart(){this._delay?this._resetDomPlayerState():this.domPlayer?.pause()}_convertKeyframesToObject(e){let A=[];return e.forEach(i=>{A.push(Object.fromEntries(i))}),A}_triggerWebAnimation(e,A,i){let n=this._convertKeyframesToObject(A);try{return e.animate(n,i)}catch(o){return null}}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}play(){let e=this._buildPlayer();e&&(this.hasStarted()||(this._onStartFns.forEach(A=>A()),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),e.play())}pause(){this.init(),this.domPlayer?.pause()}finish(){this.init(),this.domPlayer&&(this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish())}reset(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}_resetDomPlayerState(){this.domPlayer?.cancel()}restart(){this.reset(),this.play()}hasStarted(){return this._started}destroy(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}setPosition(e){this.domPlayer||this.init(),this.domPlayer&&(this.domPlayer.currentTime=e*this.time)}getPosition(){return this.domPlayer?+(this.domPlayer.currentTime??0)/this.time:this._initialized?1:0}get totalTime(){return this._delay+this._duration}beforeDestroy(){let e=new Map;this.hasStarted()&&this._finalKeyframe.forEach((i,n)=>{n!=="offset"&&e.set(n,this._finished?i:Up(this.element,n))}),this.currentSnapshot=e}triggerCallback(e){let A=e==="start"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},Wp=class{validateStyleProperty(e){return!0}validateAnimatableStyleProperty(e){return!0}containsElement(e,A){return jb(e,A)}getParentElement(e){return Fp(e)}query(e,A,i){return qb(e,A,i)}computeStyle(e,A,i){return Up(e,A)}animate(e,A,i,n,o,a=[]){let r=n==0?"both":"forwards",s={duration:i,delay:n,fill:r};o&&(s.easing=o);let l=new Map,g=a.filter(d=>d instanceof Vp);pK(i,n)&&g.forEach(d=>{d.currentSnapshot.forEach((h,E)=>l.set(E,h))});let C=uK(A).map(d=>new Map(d));C=mK(e,C,l);let I=daA(e,C);return new Vp(e,C,s,I)}};var Yp="@",UK="@.disabled",Zp=class{namespaceId;delegate;engine;_onDestroy;\u0275type=0;constructor(e,A,i,n){this.namespaceId=e,this.delegate=A,this.engine=i,this._onDestroy=n}get data(){return this.delegate.data}destroyNode(e){this.delegate.destroyNode?.(e)}destroy(){this.engine.destroy(this.namespaceId,this.delegate),this.engine.afterFlushAnimationsDone(()=>{queueMicrotask(()=>{this.delegate.destroy()})}),this._onDestroy?.()}createElement(e,A){return this.delegate.createElement(e,A)}createComment(e){return this.delegate.createComment(e)}createText(e){return this.delegate.createText(e)}appendChild(e,A){this.delegate.appendChild(e,A),this.engine.onInsert(this.namespaceId,A,e,!1)}insertBefore(e,A,i,n=!0){this.delegate.insertBefore(e,A,i),this.engine.onInsert(this.namespaceId,A,e,n)}removeChild(e,A,i,n){if(n){this.delegate.removeChild(e,A,i,n);return}this.parentNode(A)&&this.engine.onRemove(this.namespaceId,A,this.delegate)}selectRootElement(e,A){return this.delegate.selectRootElement(e,A)}parentNode(e){return this.delegate.parentNode(e)}nextSibling(e){return this.delegate.nextSibling(e)}setAttribute(e,A,i,n){this.delegate.setAttribute(e,A,i,n)}removeAttribute(e,A,i){this.delegate.removeAttribute(e,A,i)}addClass(e,A){this.delegate.addClass(e,A)}removeClass(e,A){this.delegate.removeClass(e,A)}setStyle(e,A,i,n){this.delegate.setStyle(e,A,i,n)}removeStyle(e,A,i){this.delegate.removeStyle(e,A,i)}setProperty(e,A,i){A.charAt(0)==Yp&&A==UK?this.disableAnimations(e,!!i):this.delegate.setProperty(e,A,i)}setValue(e,A){this.delegate.setValue(e,A)}listen(e,A,i,n){return this.delegate.listen(e,A,i,n)}disableAnimations(e,A){this.engine.disableAnimations(e,A)}},d7=class extends Zp{factory;constructor(e,A,i,n,o){super(A,i,n,o),this.factory=e,this.namespaceId=A}setProperty(e,A,i){A.charAt(0)==Yp?A.charAt(1)=="."&&A==UK?(i=i===void 0?!0:!!i,this.disableAnimations(e,i)):this.engine.process(this.namespaceId,e,A.slice(1),i):this.delegate.setProperty(e,A,i)}listen(e,A,i,n){if(A.charAt(0)==Yp){let o=haA(e),a=A.slice(1),r="";return a.charAt(0)!=Yp&&([a,r]=QaA(a)),this.engine.listen(this.namespaceId,o,a,r,s=>{let l=s._data||-1;this.factory.scheduleListenerCallback(l,i,s)})}return this.delegate.listen(e,A,i,n)}};function haA(t){switch(t){case"body":return document.body;case"document":return document;case"window":return window;default:return t}}function QaA(t){let e=t.indexOf("."),A=t.substring(0,e),i=t.slice(e+1);return[A,i]}var Xp=class{delegate;engine;_zone;_currentId=0;_microtaskId=1;_animationCallbacksBuffer=[];_rendererCache=new Map;_cdRecurDepth=0;constructor(e,A,i){this.delegate=e,this.engine=A,this._zone=i,A.onRemovalComplete=(n,o)=>{o?.removeChild(null,n)}}createRenderer(e,A){let n=this.delegate.createRenderer(e,A);if(!e||!A?.data?.animation){let l=this._rendererCache,g=l.get(n);if(!g){let C=()=>l.delete(n);g=new Zp("",n,this.engine,C),l.set(n,g)}return g}let o=A.id,a=A.id+"-"+this._currentId;this._currentId++,this.engine.register(a,e);let r=l=>{Array.isArray(l)?l.forEach(r):this.engine.registerTrigger(o,a,e,l.name,l)};return A.data.animation.forEach(r),new d7(this,a,n,this.engine)}begin(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()}_scheduleCountTask(){queueMicrotask(()=>{this._microtaskId++})}scheduleListenerCallback(e,A,i){if(e>=0&&eA(i));return}let n=this._animationCallbacksBuffer;n.length==0&&queueMicrotask(()=>{this._zone.run(()=>{n.forEach(o=>{let[a,r]=o;a(r)}),this._animationCallbacksBuffer=[]})}),n.push([A,i])}end(){this._cdRecurDepth--,this._cdRecurDepth==0&&this._zone.runOutsideAngular(()=>{this._scheduleCountTask(),this.engine.flush(this._microtaskId)}),this.delegate.end&&this.delegate.end()}whenRenderingDone(){return this.engine.whenRenderingDone()}componentReplaced(e){this.engine.flush(),this.delegate.componentReplaced?.(e)}};var faA=(()=>{class t extends hB{constructor(A,i,n){super(A,i,n)}ngOnDestroy(){this.flush()}static \u0275fac=function(i){return new(i||t)(Lo(ti),Lo(C1),Lo(I1))};static \u0275prov=qA({token:t,factory:t.\u0275fac})}return t})();function paA(){return new Hp}function maA(){return new Xp(w(aL),w(hB),w(qe))}var TK=[{provide:I1,useFactory:paA},{provide:hB,useClass:faA},{provide:Kr,useFactory:maA}],rYA=[{provide:C1,useClass:B7},{provide:qI,useValue:"NoopAnimations"},...TK],waA=[{provide:C1,useFactory:()=>new Wp},{provide:qI,useFactory:()=>"BrowserAnimations"},...TK];function JK(){return q3("NgEagerAnimations"),[...waA]}function wr(t){t||(t=w(sr));let e=new vi(A=>{if(t.destroyed){A.next();return}return t.onDestroy(A.next.bind(A))});return A=>A.pipe(Qt(e))}var h7=class{source;destroyed=!1;destroyRef=w(sr);constructor(e){this.source=e,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}subscribe(e){if(this.destroyed)throw new Mt(953,!1);let A=this.source.pipe(wr(this.destroyRef)).subscribe({next:i=>e(i)});return{unsubscribe:()=>A.unsubscribe()}}};function kn(t,e){return new h7(t)}function po(t,e){let A=e?.injector??w(Dt),i=new Sg(1),n=Ao(()=>{let o;try{o=t()}catch(a){ca(()=>i.error(a));return}ca(()=>i.next(o))},{injector:A,manualCleanup:!0});return A.get(sr).onDestroy(()=>{n.destroy(),i.complete()}),i.asObservable()}function Ar(t,e){let i=!e?.manualCleanup?e?.injector?.get(sr)??w(sr):null,n=DaA(e?.equal),o;e?.requireSync?o=bA({kind:0},{equal:n}):o=bA({kind:1,value:e?.initialValue},{equal:n});let a,r=t.subscribe({next:s=>o.set({kind:1,value:s}),error:s=>{o.set({kind:2,error:s}),a?.()},complete:()=>{a?.()}});if(e?.requireSync&&o().kind===0)throw new Mt(601,!1);return a=i?.onDestroy(r.unsubscribe.bind(r)),pe(()=>{let s=o();switch(s.kind){case 1:return s.value;case 2:throw s.error;case 0:throw new Mt(601,!1)}},{equal:e?.equal})}function DaA(t=Object.is){return(e,A)=>e.kind===1&&A.kind===1&&t(e.value,A.value)}function $p(t){return VF(Ye(gA({},t),{loader:void 0,stream:e=>{let A,i=()=>A?.unsubscribe();e.abortSignal.addEventListener("abort",i);let n=bA({value:void 0}),o,a=new Promise(l=>o=l);function r(l){n.set(l),o?.(n),o=void 0}let s=t.stream;if(s===void 0)throw new Mt(990,!1);return A=s(e).subscribe({next:l=>r({value:l}),error:l=>{r({error:WF(l)}),e.abortSignal.removeEventListener("abort",i)},complete:()=>{o&&r({error:new Mt(991,!1)}),e.abortSignal.removeEventListener("abort",i)}}),a}}))}function p7(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var E1=p7();function qK(t){E1=t}var d1={exec:()=>null};function Un(t,e=""){let A=typeof t=="string"?t:t.source,i={replace:(n,o)=>{let a=typeof o=="string"?o:o.source;return a=a.replace(bs.caret,"$1"),A=A.replace(n,a),i},getRegex:()=>new RegExp(A,e)};return i}var yaA=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),htmlBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}>`)},vaA=/^(?:[ \t]*(?:\n|$))+/,baA=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,MaA=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,du=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,SaA=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,m7=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,VK=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,WK=Un(VK).replace(/bull/g,m7).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),kaA=Un(VK).replace(/bull/g,m7).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),w7=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,xaA=/^[^\n]+/,D7=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,_aA=Un(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",D7).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),RaA=Un(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,m7).getRegex(),im="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",y7=/|$))/,NaA=Un("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",y7).replace("tag",im).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),ZK=Un(w7).replace("hr",du).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",im).getRegex(),FaA=Un(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",ZK).getRegex(),v7={blockquote:FaA,code:baA,def:_aA,fences:MaA,heading:SaA,hr:du,html:NaA,lheading:WK,list:RaA,newline:vaA,paragraph:ZK,table:d1,text:xaA},OK=Un("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",du).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",im).getRegex(),LaA=Ye(gA({},v7),{lheading:kaA,table:OK,paragraph:Un(w7).replace("hr",du).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",OK).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",im).getRegex()}),GaA=Ye(gA({},v7),{html:Un(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",y7).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:d1,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Un(w7).replace("hr",du).replace("heading",` *#{1,6} *[^ -]`).replace("lheading",WK).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()}),KaA=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,UaA=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,XK=/^( {2,}|\\)\n(?!\s*$)/,TaA=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",yaA?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),tU=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,jaA=Un(tU,"u").replace(/punct/g,nm).getRegex(),qaA=Un(tU,"u").replace(/punct/g,AU).getRegex(),iU="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",VaA=Un(iU,"gu").replace(/notPunctSpace/g,$K).replace(/punctSpace/g,b7).replace(/punct/g,nm).getRegex(),WaA=Un(iU,"gu").replace(/notPunctSpace/g,YaA).replace(/punctSpace/g,OaA).replace(/punct/g,AU).getRegex(),ZaA=Un("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,$K).replace(/punctSpace/g,b7).replace(/punct/g,nm).getRegex(),XaA=Un(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,eU).getRegex(),$aA="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",ArA=Un($aA,"gu").replace(/notPunctSpace/g,zaA).replace(/punctSpace/g,HaA).replace(/punct/g,eU).getRegex(),erA=Un(/\\(punct)/,"gu").replace(/punct/g,nm).getRegex(),trA=Un(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),irA=Un(y7).replace("(?:-->|$)","-->").getRegex(),nrA=Un("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",irA).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),em=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,orA=Un(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",em).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),nU=Un(/^!?\[(label)\]\[(ref)\]/).replace("label",em).replace("ref",D7).getRegex(),oU=Un(/^!?\[(ref)\](?:\[\])?/).replace("ref",D7).getRegex(),arA=Un("reflink|nolink(?!\\()","g").replace("reflink",nU).replace("nolink",oU).getRegex(),YK=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,M7={_backpedal:d1,anyPunctuation:erA,autolink:trA,blockSkip:PaA,br:XK,code:UaA,del:d1,delLDelim:d1,delRDelim:d1,emStrongLDelim:jaA,emStrongRDelimAst:VaA,emStrongRDelimUnd:ZaA,escape:KaA,link:orA,nolink:oU,punctuation:JaA,reflink:nU,reflinkSearch:arA,tag:nrA,text:TaA,url:d1},rrA=Ye(gA({},M7),{link:Un(/^!?\[(label)\]\((.*?)\)/).replace("label",em).getRegex(),reflink:Un(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",em).getRegex()}),Q7=Ye(gA({},M7),{emStrongRDelimAst:WaA,emStrongLDelim:qaA,delLDelim:XaA,delRDelim:ArA,url:Un(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",YK).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:Un(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},HK=t=>lrA[t];function zc(t,e){if(e){if(bs.escapeTest.test(t))return t.replace(bs.escapeReplace,HK)}else if(bs.escapeTestNoEncode.test(t))return t.replace(bs.escapeReplaceNoEncode,HK);return t}function zK(t){try{t=encodeURI(t).replace(bs.percentDecode,"%")}catch(e){return null}return t}function PK(t,e){let A=t.replace(bs.findPipe,(o,a,r)=>{let s=!1,l=a;for(;--l>=0&&r[l]==="\\";)s=!s;return s?"|":" |"}),i=A.split(bs.splitPipe),n=0;if(i[0].trim()||i.shift(),i.length>0&&!i.at(-1)?.trim()&&i.pop(),e)if(i.length>e)i.splice(e);else for(;i.length0?-2:-1}function crA(t,e=0){let A=e,i="";for(let n of t)if(n===" "){let o=4-A%4;i+=" ".repeat(o),A+=o}else i+=n,A++;return i}function jK(t,e,A,i,n){let o=e.href,a=e.title||null,r=t[1].replace(n.other.outputLinkReplace,"$1");i.state.inLink=!0;let s={type:t[0].charAt(0)==="!"?"image":"link",raw:A,href:o,title:a,text:r,tokens:i.inlineTokens(r)};return i.state.inLink=!1,s}function CrA(t,e,A){let i=t.match(A.other.indentCodeCompensation);if(i===null)return e;let n=i[1];return e.split(` -`).map(o=>{let a=o.match(A.other.beginningSpace);if(a===null)return o;let[r]=a;return r.length>=n.length?o.slice(n.length):o}).join(` -`)}var tm=class{options;rules;lexer;constructor(t){this.options=t||E1}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let A=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?A:Cu(A,` -`)}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let A=e[0],i=CrA(A,e[3]||"",this.rules);return{type:"code",raw:A,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:i}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let A=e[2].trim();if(this.rules.other.endingHash.test(A)){let i=Cu(A,"#");(this.options.pedantic||!i||this.rules.other.endingSpaceChar.test(i))&&(A=i.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:A,tokens:this.lexer.inline(A)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:Cu(e[0],` -`)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let A=Cu(e[0],` -`).split(` -`),i="",n="",o=[];for(;A.length>0;){let a=!1,r=[],s;for(s=0;s1,n={type:"list",raw:"",ordered:i,start:i?+A.slice(0,-1):"",loose:!1,items:[]};A=i?`\\d{1,9}\\${A.slice(-1)}`:`\\${A}`,this.options.pedantic&&(A=i?A:"[*+-]");let o=this.rules.other.listItemRegex(A),a=!1;for(;t;){let s=!1,l="",g="";if(!(e=o.exec(t))||this.rules.block.hr.test(t))break;l=e[0],t=t.substring(l.length);let C=crA(e[2].split(` -`,1)[0],e[1].length),I=t.split(` -`,1)[0],d=!C.trim(),h=0;if(this.options.pedantic?(h=2,g=C.trimStart()):d?h=e[1].length+1:(h=C.search(this.rules.other.nonSpaceChar),h=h>4?1:h,g=C.slice(h),h+=e[1].length),d&&this.rules.other.blankLine.test(I)&&(l+=I+` -`,t=t.substring(I.length+1),s=!0),!s){let E=this.rules.other.nextBulletRegex(h),f=this.rules.other.hrRegex(h),m=this.rules.other.fencesBeginRegex(h),v=this.rules.other.headingBeginRegex(h),k=this.rules.other.htmlBeginRegex(h),S=this.rules.other.blockquoteBeginRegex(h);for(;t;){let b=t.split(` -`,1)[0],x;if(I=b,this.options.pedantic?(I=I.replace(this.rules.other.listReplaceNesting," "),x=I):x=I.replace(this.rules.other.tabCharGlobal," "),m.test(I)||v.test(I)||k.test(I)||S.test(I)||E.test(I)||f.test(I))break;if(x.search(this.rules.other.nonSpaceChar)>=h||!I.trim())g+=` -`+x.slice(h);else{if(d||C.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||m.test(C)||v.test(C)||f.test(C))break;g+=` -`+I}d=!I.trim(),l+=b+` -`,t=t.substring(b.length+1),C=x.slice(h)}}n.loose||(a?n.loose=!0:this.rules.other.doubleBlankLine.test(l)&&(a=!0)),n.items.push({type:"list_item",raw:l,task:!!this.options.gfm&&this.rules.other.listIsTask.test(g),loose:!1,text:g,tokens:[]}),n.raw+=l}let r=n.items.at(-1);if(r)r.raw=r.raw.trimEnd(),r.text=r.text.trimEnd();else return;n.raw=n.raw.trimEnd();for(let s of n.items){if(this.lexer.state.top=!1,s.tokens=this.lexer.blockTokens(s.text,[]),s.task){if(s.text=s.text.replace(this.rules.other.listReplaceTask,""),s.tokens[0]?.type==="text"||s.tokens[0]?.type==="paragraph"){s.tokens[0].raw=s.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),s.tokens[0].text=s.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let g=this.lexer.inlineQueue.length-1;g>=0;g--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[g].src)){this.lexer.inlineQueue[g].src=this.lexer.inlineQueue[g].src.replace(this.rules.other.listReplaceTask,"");break}}let l=this.rules.other.listTaskCheckbox.exec(s.raw);if(l){let g={type:"checkbox",raw:l[0]+" ",checked:l[0]!=="[ ]"};s.checked=g.checked,n.loose?s.tokens[0]&&["paragraph","text"].includes(s.tokens[0].type)&&"tokens"in s.tokens[0]&&s.tokens[0].tokens?(s.tokens[0].raw=g.raw+s.tokens[0].raw,s.tokens[0].text=g.raw+s.tokens[0].text,s.tokens[0].tokens.unshift(g)):s.tokens.unshift({type:"paragraph",raw:g.raw,text:g.raw,tokens:[g]}):s.tokens.unshift(g)}}if(!n.loose){let l=s.tokens.filter(C=>C.type==="space"),g=l.length>0&&l.some(C=>this.rules.other.anyLine.test(C.raw));n.loose=g}}if(n.loose)for(let s of n.items){s.loose=!0;for(let l of s.tokens)l.type==="text"&&(l.type="paragraph")}return n}}html(t){let e=this.rules.block.html.exec(t);if(e)return{type:"html",block:!0,raw:e[0],pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:e[0]}}def(t){let e=this.rules.block.def.exec(t);if(e){let A=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),i=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",n=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:A,raw:e[0],href:i,title:n}}}table(t){let e=this.rules.block.table.exec(t);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let A=PK(e[1]),i=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),n=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(` -`):[],o={type:"table",raw:e[0],header:[],align:[],rows:[]};if(A.length===i.length){for(let a of i)this.rules.other.tableAlignRight.test(a)?o.align.push("right"):this.rules.other.tableAlignCenter.test(a)?o.align.push("center"):this.rules.other.tableAlignLeft.test(a)?o.align.push("left"):o.align.push(null);for(let a=0;a({text:r,tokens:this.lexer.inline(r),header:!1,align:o.align[s]})));return o}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let A=e[1].charAt(e[1].length-1)===` -`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:A,tokens:this.lexer.inline(A)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){let e=this.rules.inline.link.exec(t);if(e){let A=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(A)){if(!this.rules.other.endAngleBracket.test(A))return;let o=Cu(A.slice(0,-1),"\\");if((A.length-o.length)%2===0)return}else{let o=grA(e[2],"()");if(o===-2)return;if(o>-1){let a=(e[0].indexOf("!")===0?5:4)+e[1].length+o;e[2]=e[2].substring(0,o),e[0]=e[0].substring(0,a).trim(),e[3]=""}}let i=e[2],n="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(i);o&&(i=o[1],n=o[3])}else n=e[3]?e[3].slice(1,-1):"";return i=i.trim(),this.rules.other.startAngleBracket.test(i)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(A)?i=i.slice(1):i=i.slice(1,-1)),jK(e,{href:i&&i.replace(this.rules.inline.anyPunctuation,"$1"),title:n&&n.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let A;if((A=this.rules.inline.reflink.exec(t))||(A=this.rules.inline.nolink.exec(t))){let i=(A[2]||A[1]).replace(this.rules.other.multipleSpaceGlobal," "),n=e[i.toLowerCase()];if(!n){let o=A[0].charAt(0);return{type:"text",raw:o,text:o}}return jK(A,n,A[0],this.lexer,this.rules)}}emStrong(t,e,A=""){let i=this.rules.inline.emStrongLDelim.exec(t);if(!(!i||i[3]&&A.match(this.rules.other.unicodeAlphaNumeric))&&(!(i[1]||i[2])||!A||this.rules.inline.punctuation.exec(A))){let n=[...i[0]].length-1,o,a,r=n,s=0,l=i[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(l.lastIndex=0,e=e.slice(-1*t.length+n);(i=l.exec(e))!=null;){if(o=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!o)continue;if(a=[...o].length,i[3]||i[4]){r+=a;continue}else if((i[5]||i[6])&&n%3&&!((n+a)%3)){s+=a;continue}if(r-=a,r>0)continue;a=Math.min(a,a+r+s);let g=[...i[0]][0].length,C=t.slice(0,n+i.index+g+a);if(Math.min(n,a)%2){let d=C.slice(1,-1);return{type:"em",raw:C,text:d,tokens:this.lexer.inlineTokens(d)}}let I=C.slice(2,-2);return{type:"strong",raw:C,text:I,tokens:this.lexer.inlineTokens(I)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let A=e[2].replace(this.rules.other.newLineCharGlobal," "),i=this.rules.other.nonSpaceChar.test(A),n=this.rules.other.startingSpaceChar.test(A)&&this.rules.other.endingSpaceChar.test(A);return i&&n&&(A=A.substring(1,A.length-1)),{type:"codespan",raw:e[0],text:A}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t,e,A=""){let i=this.rules.inline.delLDelim.exec(t);if(i&&(!i[1]||!A||this.rules.inline.punctuation.exec(A))){let n=[...i[0]].length-1,o,a,r=n,s=this.rules.inline.delRDelim;for(s.lastIndex=0,e=e.slice(-1*t.length+n);(i=s.exec(e))!=null;){if(o=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!o||(a=[...o].length,a!==n))continue;if(i[3]||i[4]){r+=a;continue}if(r-=a,r>0)continue;a=Math.min(a,a+r);let l=[...i[0]][0].length,g=t.slice(0,n+i.index+l+a),C=g.slice(n,-n);return{type:"del",raw:g,text:C,tokens:this.lexer.inlineTokens(C)}}}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let A,i;return e[2]==="@"?(A=e[1],i="mailto:"+A):(A=e[1],i=A),{type:"link",raw:e[0],text:A,href:i,tokens:[{type:"text",raw:A,text:A}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let A,i;if(e[2]==="@")A=e[0],i="mailto:"+A;else{let n;do n=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(n!==e[0]);A=e[0],e[1]==="www."?i="http://"+e[0]:i=e[0]}return{type:"link",raw:e[0],text:A,href:i,tokens:[{type:"text",raw:A,text:A}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let A=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:A}}}},Gg=class u7{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||E1,this.options.tokenizer=this.options.tokenizer||new tm,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let A={other:bs,block:Am.normal,inline:cu.normal};this.options.pedantic?(A.block=Am.pedantic,A.inline=cu.pedantic):this.options.gfm&&(A.block=Am.gfm,this.options.breaks?A.inline=cu.breaks:A.inline=cu.gfm),this.tokenizer.rules=A}static get rules(){return{block:Am,inline:cu}}static lex(e,A){return new u7(A).lex(e)}static lexInline(e,A){return new u7(A).inlineTokens(e)}lex(e){e=e.replace(bs.carriageReturn,` -`),this.blockTokens(e,this.tokens);for(let A=0;A(n=a.call({lexer:this},e,A))?(e=e.substring(n.raw.length),A.push(n),!0):!1))continue;if(n=this.tokenizer.space(e)){e=e.substring(n.raw.length);let a=A.at(-1);n.raw.length===1&&a!==void 0?a.raw+=` -`:A.push(n);continue}if(n=this.tokenizer.code(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(` -`)?"":` -`)+n.raw,a.text+=` -`+n.text,this.inlineQueue.at(-1).src=a.text):A.push(n);continue}if(n=this.tokenizer.fences(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.heading(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.hr(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.blockquote(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.list(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.html(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.def(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(` -`)?"":` -`)+n.raw,a.text+=` -`+n.raw,this.inlineQueue.at(-1).src=a.text):this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title},A.push(n));continue}if(n=this.tokenizer.table(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.lheading(e)){e=e.substring(n.raw.length),A.push(n);continue}let o=e;if(this.options.extensions?.startBlock){let a=1/0,r=e.slice(1),s;this.options.extensions.startBlock.forEach(l=>{s=l.call({lexer:this},r),typeof s=="number"&&s>=0&&(a=Math.min(a,s))}),a<1/0&&a>=0&&(o=e.substring(0,a+1))}if(this.state.top&&(n=this.tokenizer.paragraph(o))){let a=A.at(-1);i&&a?.type==="paragraph"?(a.raw+=(a.raw.endsWith(` -`)?"":` -`)+n.raw,a.text+=` -`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):A.push(n),i=o.length!==e.length,e=e.substring(n.raw.length);continue}if(n=this.tokenizer.text(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="text"?(a.raw+=(a.raw.endsWith(` -`)?"":` -`)+n.raw,a.text+=` -`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):A.push(n);continue}if(e){let a="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(a);break}else throw new Error(a)}}return this.state.top=!0,A}inline(e,A=[]){return this.inlineQueue.push({src:e,tokens:A}),A}inlineTokens(e,A=[]){let i=e,n=null;if(this.tokens.links){let s=Object.keys(this.tokens.links);if(s.length>0)for(;(n=this.tokenizer.rules.inline.reflinkSearch.exec(i))!=null;)s.includes(n[0].slice(n[0].lastIndexOf("[")+1,-1))&&(i=i.slice(0,n.index)+"["+"a".repeat(n[0].length-2)+"]"+i.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(n=this.tokenizer.rules.inline.anyPunctuation.exec(i))!=null;)i=i.slice(0,n.index)+"++"+i.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let o;for(;(n=this.tokenizer.rules.inline.blockSkip.exec(i))!=null;)o=n[2]?n[2].length:0,i=i.slice(0,n.index+o)+"["+"a".repeat(n[0].length-o-2)+"]"+i.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);i=this.options.hooks?.emStrongMask?.call({lexer:this},i)??i;let a=!1,r="";for(;e;){a||(r=""),a=!1;let s;if(this.options.extensions?.inline?.some(g=>(s=g.call({lexer:this},e,A))?(e=e.substring(s.raw.length),A.push(s),!0):!1))continue;if(s=this.tokenizer.escape(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.tag(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.link(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(s.raw.length);let g=A.at(-1);s.type==="text"&&g?.type==="text"?(g.raw+=s.raw,g.text+=s.text):A.push(s);continue}if(s=this.tokenizer.emStrong(e,i,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.codespan(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.br(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.del(e,i,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.autolink(e)){e=e.substring(s.raw.length),A.push(s);continue}if(!this.state.inLink&&(s=this.tokenizer.url(e))){e=e.substring(s.raw.length),A.push(s);continue}let l=e;if(this.options.extensions?.startInline){let g=1/0,C=e.slice(1),I;this.options.extensions.startInline.forEach(d=>{I=d.call({lexer:this},C),typeof I=="number"&&I>=0&&(g=Math.min(g,I))}),g<1/0&&g>=0&&(l=e.substring(0,g+1))}if(s=this.tokenizer.inlineText(l)){e=e.substring(s.raw.length),s.raw.slice(-1)!=="_"&&(r=s.raw.slice(-1)),a=!0;let g=A.at(-1);g?.type==="text"?(g.raw+=s.raw,g.text+=s.text):A.push(s);continue}if(e){let g="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(g);break}else throw new Error(g)}}return A}},l2=class{options;parser;constructor(t){this.options=t||E1}space(t){return""}code({text:t,lang:e,escaped:A}){let i=(e||"").match(bs.notSpaceStart)?.[0],n=t.replace(bs.endingNewline,"")+` -`;return i?'
          '+(A?n:zc(n,!0))+`
          -`:"
          "+(A?n:zc(n,!0))+`
          -`}blockquote({tokens:t}){return`
          -${this.parser.parse(t)}
          -`}html({text:t}){return t}def(t){return""}heading({tokens:t,depth:e}){return`${this.parser.parseInline(t)} -`}hr(t){return`
          -`}list(t){let e=t.ordered,A=t.start,i="";for(let a=0;a -`+i+" -`}listitem(t){return`
        • ${this.parser.parse(t.tokens)}
        • -`}checkbox({checked:t}){return" '}paragraph({tokens:t}){return`

          ${this.parser.parseInline(t)}

          -`}table(t){let e="",A="";for(let n=0;n${i}`),` - -`+e+` -`+i+`
          -`}tablerow({text:t}){return` -${t} -`}tablecell(t){let e=this.parser.parseInline(t.tokens),A=t.header?"th":"td";return(t.align?`<${A} align="${t.align}">`:`<${A}>`)+e+` -`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${zc(t,!0)}`}br(t){return"
          "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:A}){let i=this.parser.parseInline(A),n=zK(t);if(n===null)return i;t=n;let o='
          ",o}image({href:t,title:e,text:A,tokens:i}){i&&(A=this.parser.parseInline(i,this.parser.textRenderer));let n=zK(t);if(n===null)return zc(A);t=n;let o=`${zc(A)}{let a=n[o].flat(1/0);A=A.concat(this.walkTokens(a,e))}):n.tokens&&(A=A.concat(this.walkTokens(n.tokens,e)))}}return A}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(A=>{let i=gA({},A);if(i.async=this.defaults.async||i.async||!1,A.extensions&&(A.extensions.forEach(n=>{if(!n.name)throw new Error("extension name required");if("renderer"in n){let o=e.renderers[n.name];o?e.renderers[n.name]=function(...a){let r=n.renderer.apply(this,a);return r===!1&&(r=o.apply(this,a)),r}:e.renderers[n.name]=n.renderer}if("tokenizer"in n){if(!n.level||n.level!=="block"&&n.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=e[n.level];o?o.unshift(n.tokenizer):e[n.level]=[n.tokenizer],n.start&&(n.level==="block"?e.startBlock?e.startBlock.push(n.start):e.startBlock=[n.start]:n.level==="inline"&&(e.startInline?e.startInline.push(n.start):e.startInline=[n.start]))}"childTokens"in n&&n.childTokens&&(e.childTokens[n.name]=n.childTokens)}),i.extensions=e),A.renderer){let n=this.defaults.renderer||new l2(this.defaults);for(let o in A.renderer){if(!(o in n))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let a=o,r=A.renderer[a],s=n[a];n[a]=(...l)=>{let g=r.apply(n,l);return g===!1&&(g=s.apply(n,l)),g||""}}i.renderer=n}if(A.tokenizer){let n=this.defaults.tokenizer||new tm(this.defaults);for(let o in A.tokenizer){if(!(o in n))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let a=o,r=A.tokenizer[a],s=n[a];n[a]=(...l)=>{let g=r.apply(n,l);return g===!1&&(g=s.apply(n,l)),g}}i.tokenizer=n}if(A.hooks){let n=this.defaults.hooks||new Iu;for(let o in A.hooks){if(!(o in n))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let a=o,r=A.hooks[a],s=n[a];Iu.passThroughHooks.has(o)?n[a]=l=>{if(this.defaults.async&&Iu.passThroughHooksRespectAsync.has(o))return lt(this,null,function*(){let C=yield r.call(n,l);return s.call(n,C)});let g=r.call(n,l);return s.call(n,g)}:n[a]=(...l)=>{if(this.defaults.async)return lt(this,null,function*(){let C=yield r.apply(n,l);return C===!1&&(C=yield s.apply(n,l)),C});let g=r.apply(n,l);return g===!1&&(g=s.apply(n,l)),g}}i.hooks=n}if(A.walkTokens){let n=this.defaults.walkTokens,o=A.walkTokens;i.walkTokens=function(a){let r=[];return r.push(o.call(this,a)),n&&(r=r.concat(n.call(this,a))),r}}this.defaults=gA(gA({},this.defaults),i)}),this}setOptions(t){return this.defaults=gA(gA({},this.defaults),t),this}lexer(t,e){return Gg.lex(t,e??this.defaults)}parser(t,e){return Kg.parse(t,e??this.defaults)}parseMarkdown(t){return(e,A)=>{let i=gA({},A),n=gA(gA({},this.defaults),i),o=this.onError(!!n.silent,!!n.async);if(this.defaults.async===!0&&i.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(n.hooks&&(n.hooks.options=n,n.hooks.block=t),n.async)return lt(this,null,function*(){let a=n.hooks?yield n.hooks.preprocess(e):e,r=yield(n.hooks?yield n.hooks.provideLexer():t?Gg.lex:Gg.lexInline)(a,n),s=n.hooks?yield n.hooks.processAllTokens(r):r;n.walkTokens&&(yield Promise.all(this.walkTokens(s,n.walkTokens)));let l=yield(n.hooks?yield n.hooks.provideParser():t?Kg.parse:Kg.parseInline)(s,n);return n.hooks?yield n.hooks.postprocess(l):l}).catch(o);try{n.hooks&&(e=n.hooks.preprocess(e));let a=(n.hooks?n.hooks.provideLexer():t?Gg.lex:Gg.lexInline)(e,n);n.hooks&&(a=n.hooks.processAllTokens(a)),n.walkTokens&&this.walkTokens(a,n.walkTokens);let r=(n.hooks?n.hooks.provideParser():t?Kg.parse:Kg.parseInline)(a,n);return n.hooks&&(r=n.hooks.postprocess(r)),r}catch(a){return o(a)}}}onError(t,e){return A=>{if(A.message+=` -Please report this to https://github.com/markedjs/marked.`,t){let i="

          An error occurred:

          "+zc(A.message+"",!0)+"
          ";return e?Promise.resolve(i):i}if(e)return Promise.reject(A);throw A}}},B1=new IrA;function Pn(t,e){return B1.parse(t,e)}Pn.options=Pn.setOptions=function(t){return B1.setOptions(t),Pn.defaults=B1.defaults,qK(Pn.defaults),Pn};Pn.getDefaults=p7;Pn.defaults=E1;Pn.use=function(...t){return B1.use(...t),Pn.defaults=B1.defaults,qK(Pn.defaults),Pn};Pn.walkTokens=function(t,e){return B1.walkTokens(t,e)};Pn.parseInline=B1.parseInline;Pn.Parser=Kg;Pn.parser=Kg.parse;Pn.Renderer=l2;Pn.TextRenderer=S7;Pn.Lexer=Gg;Pn.lexer=Gg.lex;Pn.Tokenizer=tm;Pn.Hooks=Iu;Pn.parse=Pn;var uYA=Pn.options,fYA=Pn.setOptions,pYA=Pn.use,mYA=Pn.walkTokens,wYA=Pn.parseInline;var DYA=Kg.parse,yYA=Gg.lex;var drA=["*"],BrA="Copy",ErA="Copied",hrA=(()=>{class t{constructor(){this._buttonClick$=new ie,this.copied=Ar(this._buttonClick$.pipe(hi(()=>Ki(ne(!0),Y3(3e3).pipe(_Q(!1)))),kg(),Gs(1))),this.copiedText=pe(()=>this.copied()?ErA:BrA)}onCopyToClipboardClick(){this._buttonClick$.next()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["markdown-clipboard"]],decls:2,vars:3,consts:[[1,"markdown-clipboard-button",3,"click"]],template:function(i,n){i&1&&(wn(0,"button",0),qd("click",function(){return n.onCopyToClipboardClick()}),y(1),Gn()),i&2&&(RA("copied",n.copied()),u(),lA(n.copiedText()))},encapsulation:2,changeDetection:0})}}return t})(),QrA=new kA("CLIPBOARD_OPTIONS");var urA=new kA("MARKED_EXTENSIONS"),frA=new kA("MARKED_OPTIONS"),prA=new kA("MERMAID_OPTIONS"),mrA=new kA("SANITIZE");function wrA(t){return typeof t=="function"}var DrA="[ngx-markdown] When using the `emoji` attribute you *have to* include Emoji-Toolkit files to `angular.json` or use imports. See README for more information",yrA="[ngx-markdown] When using the `katex` attribute you *have to* include KaTeX files to `angular.json` or use imports. See README for more information",vrA="[ngx-markdown] When using the `mermaid` attribute you *have to* include Mermaid files to `angular.json` or use imports. See README for more information",brA="[ngx-markdown] When using the `clipboard` attribute you *have to* include Clipboard files to `angular.json` or use imports. See README for more information",MrA="[ngx-markdown] When using the `clipboard` attribute you *have to* provide the `viewContainerRef` parameter to `MarkdownService.render()` function",SrA="[ngx-markdown] When using the `src` attribute you *have to* pass the `HttpClient` as a parameter of the `forRoot` method. See README for more information";var aU=(()=>{class t{get options(){return this._options}set options(A){this._options=gA(gA({},this.DEFAULT_MARKED_OPTIONS),A)}get renderer(){return this.options.renderer}set renderer(A){this.options.renderer=A}constructor(){this.clipboardOptions=w(QrA,{optional:!0}),this.extensions=w(urA,{optional:!0}),this.http=w(fr,{optional:!0}),this.mermaidOptions=w(prA,{optional:!0}),this.platform=w(j3),this.sanitize=w(mrA,{optional:!0}),this.sanitizer=w(e2),this.DEFAULT_MARKED_OPTIONS={renderer:new l2},this.DEFAULT_KATEX_OPTIONS={delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}]},this.DEFAULT_MERMAID_OPTIONS={startOnLoad:!1},this.DEFAULT_CLIPBOARD_OPTIONS={buttonComponent:void 0},this.DEFAULT_PARSE_OPTIONS={decodeHtml:!1,inline:!1,emoji:!1,mermaid:!1,markedOptions:void 0,disableSanitizer:!1},this.DEFAULT_RENDER_OPTIONS={clipboard:!1,clipboardOptions:void 0,katex:!1,katexOptions:void 0,mermaid:!1,mermaidOptions:void 0},this.DEFAULT_SECURITY_CONTEXT=_g.HTML,this._options=null,this._reload$=new ie,this.reload$=this._reload$.asObservable(),this.options=w(frA,{optional:!0})}parse(A,i=this.DEFAULT_PARSE_OPTIONS){let{decodeHtml:n,inline:o,emoji:a,mermaid:r,disableSanitizer:s}=i,l=gA(gA({},this.options),i.markedOptions),g=l.renderer||this.renderer||new l2;this.extensions&&(this.renderer=this.extendsRendererForExtensions(g)),r&&(this.renderer=this.extendsRendererForMermaid(g));let C=this.trimIndentation(A),I=n?this.decodeHtml(C):C,d=a?this.parseEmoji(I):I,h=this.parseMarked(d,l,o);return s?h:this.sanitizeHtml(h)}render(A,i=this.DEFAULT_RENDER_OPTIONS,n){let{clipboard:o,clipboardOptions:a,katex:r,katexOptions:s,mermaid:l,mermaidOptions:g}=i;r&&this.renderKatex(A,gA(gA({},this.DEFAULT_KATEX_OPTIONS),s)),l&&this.renderMermaid(A,gA(gA(gA({},this.DEFAULT_MERMAID_OPTIONS),this.mermaidOptions),g)),o&&this.renderClipboard(A,n,gA(gA(gA({},this.DEFAULT_CLIPBOARD_OPTIONS),this.clipboardOptions),a)),this.highlight(A)}reload(){this._reload$.next()}getSource(A){if(!this.http)throw new Error(SrA);return this.http.get(A,{responseType:"text"}).pipe(we(i=>this.handleExtension(A,i)))}highlight(A){if(!O0(this.platform)||typeof Prism>"u"||typeof Prism.highlightAllUnder>"u")return;A||(A=document);let i=A.querySelectorAll('pre code:not([class*="language-"])');Array.prototype.forEach.call(i,n=>n.classList.add("language-none")),Prism.highlightAllUnder(A)}decodeHtml(A){if(!O0(this.platform))return A;let i=document.createElement("textarea");return i.innerHTML=A,i.value}extendsRendererForExtensions(A){let i=A;return i.\u0275NgxMarkdownRendererExtendedForExtensions===!0||(this.extensions&&this.extensions.length>0&&Pn.use(...this.extensions),i.\u0275NgxMarkdownRendererExtendedForExtensions=!0),A}extendsRendererForMermaid(A){let i=A;if(i.\u0275NgxMarkdownRendererExtendedForMermaid===!0)return A;let n=A.code;return A.code=o=>o.lang==="mermaid"?`
          ${o.text}
          `:n(o),i.\u0275NgxMarkdownRendererExtendedForMermaid=!0,A}handleExtension(A,i){let n=A.lastIndexOf("://"),o=n>-1?A.substring(n+4):A,a=o.lastIndexOf("/"),r=a>-1?o.substring(a+1).split("?")[0]:"",s=r.lastIndexOf("."),l=s>-1?r.substring(s+1):"";return l&&l!=="md"?"```"+l+` -`+i+"\n```":i}parseMarked(A,i,n=!1){if(i.renderer){let o=gA({},i.renderer);delete o.\u0275NgxMarkdownRendererExtendedForExtensions,delete o.\u0275NgxMarkdownRendererExtendedForMermaid,delete i.renderer,Pn.use({renderer:o})}return n?Pn.parseInline(A,i):Pn.parse(A,i)}parseEmoji(A){if(!O0(this.platform))return A;if(typeof joypixels>"u"||typeof joypixels.shortnameToUnicode>"u")throw new Error(DrA);return joypixels.shortnameToUnicode(A)}renderKatex(A,i){if(O0(this.platform)){if(typeof katex>"u"||typeof renderMathInElement>"u")throw new Error(yrA);renderMathInElement(A,i)}}renderClipboard(A,i,n){if(!O0(this.platform))return;if(typeof ClipboardJS>"u")throw new Error(brA);if(!i)throw new Error(MrA);let{buttonComponent:o,buttonTemplate:a}=n,r=A.querySelectorAll("pre");for(let s=0;sC.classList.add("hover"),g.onmouseleave=()=>C.classList.remove("hover");let I;if(o){let h=i.createComponent(o);I=h.hostView,h.changeDetectorRef.markForCheck()}else if(a)I=i.createEmbeddedView(a);else{let h=i.createComponent(hrA);I=h.hostView,h.changeDetectorRef.markForCheck()}let d;I.rootNodes.forEach(h=>{C.appendChild(h),d=new ClipboardJS(h,{text:()=>l.innerText})}),I.onDestroy(()=>d.destroy())}}renderMermaid(A,i=this.DEFAULT_MERMAID_OPTIONS){if(!O0(this.platform))return;if(typeof mermaid>"u"||typeof mermaid.initialize>"u")throw new Error(vrA);let n=A.querySelectorAll(".mermaid");n.length!==0&&(mermaid.initialize(i),mermaid.run({nodes:n}))}trimIndentation(A){if(!A)return"";let i;return A.split(` -`).map(n=>{let o=i;return n.length>0&&(o=isNaN(o)?n.search(/\S|$/):Math.min(n.search(/\S|$/),o)),isNaN(i)&&(i=o),o?n.substring(o):n}).join(` -`)}sanitizeHtml(A){return lt(this,null,function*(){return wrA(this.sanitize)?this.sanitize(yield A):this.sanitize!==_g.NONE?this.sanitizer.sanitize(this.sanitize??this.DEFAULT_SECURITY_CONTEXT,A)??"":A})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),k7=(function(t){return t.CommandLine="command-line",t.LineHighlight="line-highlight",t.LineNumbers="line-numbers",t})(k7||{}),rU=(()=>{class t{constructor(){this.element=w(ce),this.markdownService=w(aU),this.viewContainerRef=w(Mo),this.error=new LA,this.load=new LA,this.ready=new LA,this._clipboard=!1,this._commandLine=!1,this._disableSanitizer=!1,this._emoji=!1,this._inline=!1,this._katex=!1,this._lineHighlight=!1,this._lineNumbers=!1,this._mermaid=!1,this.destroyed$=new ie}get disableSanitizer(){return this._disableSanitizer}set disableSanitizer(A){this._disableSanitizer=this.coerceBooleanProperty(A)}get inline(){return this._inline}set inline(A){this._inline=this.coerceBooleanProperty(A)}get clipboard(){return this._clipboard}set clipboard(A){this._clipboard=this.coerceBooleanProperty(A)}get emoji(){return this._emoji}set emoji(A){this._emoji=this.coerceBooleanProperty(A)}get katex(){return this._katex}set katex(A){this._katex=this.coerceBooleanProperty(A)}get mermaid(){return this._mermaid}set mermaid(A){this._mermaid=this.coerceBooleanProperty(A)}get lineHighlight(){return this._lineHighlight}set lineHighlight(A){this._lineHighlight=this.coerceBooleanProperty(A)}get lineNumbers(){return this._lineNumbers}set lineNumbers(A){this._lineNumbers=this.coerceBooleanProperty(A)}get commandLine(){return this._commandLine}set commandLine(A){this._commandLine=this.coerceBooleanProperty(A)}ngOnChanges(){this.loadContent()}loadContent(){if(this.data!=null){this.handleData();return}if(this.src!=null){this.handleSrc();return}}ngAfterViewInit(){!this.data&&!this.src&&this.handleTransclusion(),this.markdownService.reload$.pipe(Qt(this.destroyed$)).subscribe(()=>this.loadContent())}ngOnDestroy(){this.destroyed$.next(),this.destroyed$.complete()}render(A,i=!1){return lt(this,null,function*(){let n={decodeHtml:i,inline:this.inline,emoji:this.emoji,mermaid:this.mermaid,disableSanitizer:this.disableSanitizer},o={clipboard:this.clipboard,clipboardOptions:this.getClipboardOptions(),katex:this.katex,katexOptions:this.katexOptions,mermaid:this.mermaid,mermaidOptions:this.mermaidOptions},a=yield this.markdownService.parse(A,n);this.element.nativeElement.innerHTML=a,this.handlePlugins(),this.markdownService.render(this.element.nativeElement,o,this.viewContainerRef),this.ready.emit()})}coerceBooleanProperty(A){return A!=null&&`${String(A)}`!="false"}getClipboardOptions(){if(this.clipboardButtonComponent||this.clipboardButtonTemplate)return{buttonComponent:this.clipboardButtonComponent,buttonTemplate:this.clipboardButtonTemplate}}handleData(){this.render(this.data)}handleSrc(){this.markdownService.getSource(this.src).subscribe({next:A=>{this.render(A).then(()=>{this.load.emit(A)})},error:A=>this.error.emit(A)})}handleTransclusion(){this.render(this.element.nativeElement.innerHTML,!0)}handlePlugins(){this.commandLine&&(this.setPluginClass(this.element.nativeElement,k7.CommandLine),this.setPluginOptions(this.element.nativeElement,{dataFilterOutput:this.filterOutput,dataHost:this.host,dataPrompt:this.prompt,dataOutput:this.output,dataUser:this.user})),this.lineHighlight&&this.setPluginOptions(this.element.nativeElement,{dataLine:this.line,dataLineOffset:this.lineOffset}),this.lineNumbers&&(this.setPluginClass(this.element.nativeElement,k7.LineNumbers),this.setPluginOptions(this.element.nativeElement,{dataStart:this.start}))}setPluginClass(A,i){let n=A.querySelectorAll("pre");for(let o=0;o{let r=i[a];if(r){let s=this.toLispCase(a);n.item(o).setAttribute(s,r.toString())}})}toLispCase(A){let i=A.match(/([A-Z])/g);if(!i)return A;let n=A.toString();for(let o=0,a=i.length;o{class t{static forRoot(A){return{ngModule:t,providers:[Bu(A)]}}static forChild(){return{ngModule:t}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275mod=Ze({type:t})}static{this.\u0275inj=We({})}}return t})();var Ri="primary",bu=Symbol("RouteTitle"),F7=class{params;constructor(e){this.params=e||{}}has(e){return Object.prototype.hasOwnProperty.call(this.params,e)}get(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A[0]:A}return null}getAll(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A:[A]}return[]}get keys(){return Object.keys(this.params)}};function Q1(t){return new F7(t)}function x7(t,e,A){for(let i=0;it.length||A.pathMatch==="full"&&(e.hasChildren()||i.lengtht.length||A.pathMatch==="full"&&e.hasChildren()&&A.path!=="**")return null;let r={};return!x7(o,t.slice(0,o.length),r)||!x7(a,t.slice(t.length-a.length),r)?null:{consumed:t,posParams:r}}function gm(t){return new Promise((e,A)=>{t.pipe($n()).subscribe({next:i=>e(i),error:i=>A(i)})})}function _rA(t,e){if(t.length!==e.length)return!1;for(let A=0;Ai[o]===n)}else return t===e}function RrA(t){return t.length>0?t[t.length-1]:null}function f1(t){return zd(t)?t:$3(t)?Lr(Promise.resolve(t)):ne(t)}function QU(t){return zd(t)?gm(t):Promise.resolve(t)}var NrA={exact:pU,subset:mU},uU={exact:FrA,subset:LrA,ignored:()=>!0},fU={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},G7={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"};function lU(t,e,A){return NrA[A.paths](t.root,e.root,A.matrixParams)&&uU[A.queryParams](t.queryParams,e.queryParams)&&!(A.fragment==="exact"&&t.fragment!==e.fragment)}function FrA(t,e){return Pc(t,e)}function pU(t,e,A){if(!h1(t.segments,e.segments)||!rm(t.segments,e.segments,A)||t.numberOfChildren!==e.numberOfChildren)return!1;for(let i in e.children)if(!t.children[i]||!pU(t.children[i],e.children[i],A))return!1;return!0}function LrA(t,e){return Object.keys(e).length<=Object.keys(t).length&&Object.keys(e).every(A=>hU(t[A],e[A]))}function mU(t,e,A){return wU(t,e,e.segments,A)}function wU(t,e,A,i){if(t.segments.length>A.length){let n=t.segments.slice(0,A.length);return!(!h1(n,A)||e.hasChildren()||!rm(n,A,i))}else if(t.segments.length===A.length){if(!h1(t.segments,A)||!rm(t.segments,A,i))return!1;for(let n in e.children)if(!t.children[n]||!mU(t.children[n],e.children[n],i))return!1;return!0}else{let n=A.slice(0,t.segments.length),o=A.slice(t.segments.length);return!h1(t.segments,n)||!rm(t.segments,n,i)||!t.children[Ri]?!1:wU(t.children[Ri],e,o,i)}}function rm(t,e,A){return e.every((i,n)=>uU[A](t[n].parameters,i.parameters))}var ql=class{root;queryParams;fragment;_queryParamMap;constructor(e=new so([],{}),A={},i=null){this.root=e,this.queryParams=A,this.fragment=i}get queryParamMap(){return this._queryParamMap??=Q1(this.queryParams),this._queryParamMap}toString(){return UrA.serialize(this)}},so=class{segments;children;parent=null;constructor(e,A){this.segments=e,this.children=A,Object.values(A).forEach(i=>i.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return sm(this)}},g2=class{path;parameters;_parameterMap;constructor(e,A){this.path=e,this.parameters=A}get parameterMap(){return this._parameterMap??=Q1(this.parameters),this._parameterMap}toString(){return yU(this)}};function GrA(t,e){return h1(t,e)&&t.every((A,i)=>Pc(A.parameters,e[i].parameters))}function h1(t,e){return t.length!==e.length?!1:t.every((A,i)=>A.path===e[i].path)}function KrA(t,e){let A=[];return Object.entries(t.children).forEach(([i,n])=>{i===Ri&&(A=A.concat(e(n,i)))}),Object.entries(t.children).forEach(([i,n])=>{i!==Ri&&(A=A.concat(e(n,i)))}),A}var p1=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:()=>new q0,providedIn:"root"})}return t})(),q0=class{parse(e){let A=new U7(e);return new ql(A.parseRootSegment(),A.parseQueryParams(),A.parseFragment())}serialize(e){let A=`/${Eu(e.root,!0)}`,i=OrA(e.queryParams),n=typeof e.fragment=="string"?`#${TrA(e.fragment)}`:"";return`${A}${i}${n}`}},UrA=new q0;function sm(t){return t.segments.map(e=>yU(e)).join("/")}function Eu(t,e){if(!t.hasChildren())return sm(t);if(e){let A=t.children[Ri]?Eu(t.children[Ri],!1):"",i=[];return Object.entries(t.children).forEach(([n,o])=>{n!==Ri&&i.push(`${n}:${Eu(o,!1)}`)}),i.length>0?`${A}(${i.join("//")})`:A}else{let A=KrA(t,(i,n)=>n===Ri?[Eu(t.children[Ri],!1)]:[`${n}:${Eu(i,!1)}`]);return Object.keys(t.children).length===1&&t.children[Ri]!=null?`${sm(t)}/${A[0]}`:`${sm(t)}/(${A.join("//")})`}}function DU(t){return encodeURIComponent(t).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function om(t){return DU(t).replace(/%3B/gi,";")}function TrA(t){return encodeURI(t)}function K7(t){return DU(t).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function lm(t){return decodeURIComponent(t)}function gU(t){return lm(t.replace(/\+/g,"%20"))}function yU(t){return`${K7(t.path)}${JrA(t.parameters)}`}function JrA(t){return Object.entries(t).map(([e,A])=>`;${K7(e)}=${K7(A)}`).join("")}function OrA(t){let e=Object.entries(t).map(([A,i])=>Array.isArray(i)?i.map(n=>`${om(A)}=${om(n)}`).join("&"):`${om(A)}=${om(i)}`).filter(A=>A);return e.length?`?${e.join("&")}`:""}var YrA=/^[^\/()?;#]+/;function _7(t){let e=t.match(YrA);return e?e[0]:""}var HrA=/^[^\/()?;=#]+/;function zrA(t){let e=t.match(HrA);return e?e[0]:""}var PrA=/^[^=?&#]+/;function jrA(t){let e=t.match(PrA);return e?e[0]:""}var qrA=/^[^&#]+/;function VrA(t){let e=t.match(qrA);return e?e[0]:""}var U7=class{url;remaining;constructor(e){this.url=e,this.remaining=e}parseRootSegment(){return this.consumeOptional("/"),this.remaining===""||this.peekStartsWith("?")||this.peekStartsWith("#")?new so([],{}):new so([],this.parseChildren())}parseQueryParams(){let e={};if(this.consumeOptional("?"))do this.parseQueryParam(e);while(this.consumeOptional("&"));return e}parseFragment(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}parseChildren(e=0){if(e>50)throw new Mt(4010,!1);if(this.remaining==="")return{};this.consumeOptional("/");let A=[];for(this.peekStartsWith("(")||A.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),A.push(this.parseSegment());let i={};this.peekStartsWith("/(")&&(this.capture("/"),i=this.parseParens(!0,e));let n={};return this.peekStartsWith("(")&&(n=this.parseParens(!1,e)),(A.length>0||Object.keys(i).length>0)&&(n[Ri]=new so(A,i)),n}parseSegment(){let e=_7(this.remaining);if(e===""&&this.peekStartsWith(";"))throw new Mt(4009,!1);return this.capture(e),new g2(lm(e),this.parseMatrixParams())}parseMatrixParams(){let e={};for(;this.consumeOptional(";");)this.parseParam(e);return e}parseParam(e){let A=zrA(this.remaining);if(!A)return;this.capture(A);let i="";if(this.consumeOptional("=")){let n=_7(this.remaining);n&&(i=n,this.capture(i))}e[lm(A)]=lm(i)}parseQueryParam(e){let A=jrA(this.remaining);if(!A)return;this.capture(A);let i="";if(this.consumeOptional("=")){let a=VrA(this.remaining);a&&(i=a,this.capture(i))}let n=gU(A),o=gU(i);if(e.hasOwnProperty(n)){let a=e[n];Array.isArray(a)||(a=[a],e[n]=a),a.push(o)}else e[n]=o}parseParens(e,A){let i={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){let n=_7(this.remaining),o=this.remaining[n.length];if(o!=="/"&&o!==")"&&o!==";")throw new Mt(4010,!1);let a;n.indexOf(":")>-1?(a=n.slice(0,n.indexOf(":")),this.capture(a),this.capture(":")):e&&(a=Ri);let r=this.parseChildren(A+1);i[a??Ri]=Object.keys(r).length===1&&r[Ri]?r[Ri]:new so([],r),this.consumeOptional("//")}return i}peekStartsWith(e){return this.remaining.startsWith(e)}consumeOptional(e){return this.peekStartsWith(e)?(this.remaining=this.remaining.substring(e.length),!0):!1}capture(e){if(!this.consumeOptional(e))throw new Mt(4011,!1)}};function vU(t){return t.segments.length>0?new so([],{[Ri]:t}):t}function bU(t){let e={};for(let[i,n]of Object.entries(t.children)){let o=bU(n);if(i===Ri&&o.segments.length===0&&o.hasChildren())for(let[a,r]of Object.entries(o.children))e[a]=r;else(o.segments.length>0||o.hasChildren())&&(e[i]=o)}let A=new so(t.segments,e);return WrA(A)}function WrA(t){if(t.numberOfChildren===1&&t.children[Ri]){let e=t.children[Ri];return new so(t.segments.concat(e.segments),e.children)}return t}function mB(t){return t instanceof ql}function MU(t,e,A=null,i=null,n=new q0){let o=SU(t);return kU(o,e,A,i,n)}function SU(t){let e;function A(o){let a={};for(let s of o.children){let l=A(s);a[s.outlet]=l}let r=new so(o.url,a);return o===t&&(e=r),r}let i=A(t.root),n=vU(i);return e??n}function kU(t,e,A,i,n){let o=t;for(;o.parent;)o=o.parent;if(e.length===0)return R7(o,o,o,A,i,n);let a=ZrA(e);if(a.toRoot())return R7(o,o,new so([],{}),A,i,n);let r=XrA(a,o,t),s=r.processChildren?Qu(r.segmentGroup,r.index,a.commands):_U(r.segmentGroup,r.index,a.commands);return R7(o,r.segmentGroup,s,A,i,n)}function cm(t){return typeof t=="object"&&t!=null&&!t.outlets&&!t.segmentPath}function fu(t){return typeof t=="object"&&t!=null&&t.outlets}function cU(t,e,A){t||="\u0275";let i=new ql;return i.queryParams={[t]:e},A.parse(A.serialize(i)).queryParams[t]}function R7(t,e,A,i,n,o){let a={};for(let[l,g]of Object.entries(i??{}))a[l]=Array.isArray(g)?g.map(C=>cU(l,C,o)):cU(l,g,o);let r;t===e?r=A:r=xU(t,e,A);let s=vU(bU(r));return new ql(s,a,n)}function xU(t,e,A){let i={};return Object.entries(t.children).forEach(([n,o])=>{o===e?i[n]=A:i[n]=xU(o,e,A)}),new so(t.segments,i)}var Cm=class{isAbsolute;numberOfDoubleDots;commands;constructor(e,A,i){if(this.isAbsolute=e,this.numberOfDoubleDots=A,this.commands=i,e&&i.length>0&&cm(i[0]))throw new Mt(4003,!1);let n=i.find(fu);if(n&&n!==RrA(i))throw new Mt(4004,!1)}toRoot(){return this.isAbsolute&&this.commands.length===1&&this.commands[0]=="/"}};function ZrA(t){if(typeof t[0]=="string"&&t.length===1&&t[0]==="/")return new Cm(!0,0,t);let e=0,A=!1,i=t.reduce((n,o,a)=>{if(typeof o=="object"&&o!=null){if(o.outlets){let r={};return Object.entries(o.outlets).forEach(([s,l])=>{r[s]=typeof l=="string"?l.split("/"):l}),[...n,{outlets:r}]}if(o.segmentPath)return[...n,o.segmentPath]}return typeof o!="string"?[...n,o]:a===0?(o.split("/").forEach((r,s)=>{s==0&&r==="."||(s==0&&r===""?A=!0:r===".."?e++:r!=""&&n.push(r))}),n):[...n,o]},[]);return new Cm(A,e,i)}var uB=class{segmentGroup;processChildren;index;constructor(e,A,i){this.segmentGroup=e,this.processChildren=A,this.index=i}};function XrA(t,e,A){if(t.isAbsolute)return new uB(e,!0,0);if(!A)return new uB(e,!1,NaN);if(A.parent===null)return new uB(A,!0,0);let i=cm(t.commands[0])?0:1,n=A.segments.length-1+i;return $rA(A,n,t.numberOfDoubleDots)}function $rA(t,e,A){let i=t,n=e,o=A;for(;o>n;){if(o-=n,i=i.parent,!i)throw new Mt(4005,!1);n=i.segments.length}return new uB(i,!1,n-o)}function AsA(t){return fu(t[0])?t[0].outlets:{[Ri]:t}}function _U(t,e,A){if(t??=new so([],{}),t.segments.length===0&&t.hasChildren())return Qu(t,e,A);let i=esA(t,e,A),n=A.slice(i.commandIndex);if(i.match&&i.pathIndexo!==Ri)&&t.children[Ri]&&t.numberOfChildren===1&&t.children[Ri].segments.length===0){let o=Qu(t.children[Ri],e,A);return new so(t.segments,o.children)}return Object.entries(i).forEach(([o,a])=>{typeof a=="string"&&(a=[a]),a!==null&&(n[o]=_U(t.children[o],e,a))}),Object.entries(t.children).forEach(([o,a])=>{i[o]===void 0&&(n[o]=a)}),new so(t.segments,n)}}function esA(t,e,A){let i=0,n=e,o={match:!1,pathIndex:0,commandIndex:0};for(;n=A.length)return o;let a=t.segments[n],r=A[i];if(fu(r))break;let s=`${r}`,l=i0&&s===void 0)break;if(s&&l&&typeof l=="object"&&l.outlets===void 0){if(!IU(s,l,a))return o;i+=2}else{if(!IU(s,{},a))return o;i++}n++}return{match:!0,pathIndex:n,commandIndex:i}}function T7(t,e,A){let i=t.segments.slice(0,e),n=0;for(;n{typeof i=="string"&&(i=[i]),i!==null&&(e[A]=T7(new so([],{}),0,i))}),e}function CU(t){let e={};return Object.entries(t).forEach(([A,i])=>e[A]=`${i}`),e}function IU(t,e,A){return t==A.path&&Pc(e,A.parameters)}var fB="imperative",gr=(function(t){return t[t.NavigationStart=0]="NavigationStart",t[t.NavigationEnd=1]="NavigationEnd",t[t.NavigationCancel=2]="NavigationCancel",t[t.NavigationError=3]="NavigationError",t[t.RoutesRecognized=4]="RoutesRecognized",t[t.ResolveStart=5]="ResolveStart",t[t.ResolveEnd=6]="ResolveEnd",t[t.GuardsCheckStart=7]="GuardsCheckStart",t[t.GuardsCheckEnd=8]="GuardsCheckEnd",t[t.RouteConfigLoadStart=9]="RouteConfigLoadStart",t[t.RouteConfigLoadEnd=10]="RouteConfigLoadEnd",t[t.ChildActivationStart=11]="ChildActivationStart",t[t.ChildActivationEnd=12]="ChildActivationEnd",t[t.ActivationStart=13]="ActivationStart",t[t.ActivationEnd=14]="ActivationEnd",t[t.Scroll=15]="Scroll",t[t.NavigationSkipped=16]="NavigationSkipped",t})(gr||{}),bl=class{id;url;constructor(e,A){this.id=e,this.url=A}},c2=class extends bl{type=gr.NavigationStart;navigationTrigger;restoredState;constructor(e,A,i="imperative",n=null){super(e,A),this.navigationTrigger=i,this.restoredState=n}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}},Ug=class extends bl{urlAfterRedirects;type=gr.NavigationEnd;constructor(e,A,i){super(e,A),this.urlAfterRedirects=i}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}},ss=(function(t){return t[t.Redirect=0]="Redirect",t[t.SupersededByNewNavigation=1]="SupersededByNewNavigation",t[t.NoDataFromResolver=2]="NoDataFromResolver",t[t.GuardRejected=3]="GuardRejected",t[t.Aborted=4]="Aborted",t})(ss||{}),wB=(function(t){return t[t.IgnoredSameUrlNavigation=0]="IgnoredSameUrlNavigation",t[t.IgnoredByUrlHandlingStrategy=1]="IgnoredByUrlHandlingStrategy",t})(wB||{}),jl=class extends bl{reason;code;type=gr.NavigationCancel;constructor(e,A,i,n){super(e,A),this.reason=i,this.code=n}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}};function RU(t){return t instanceof jl&&(t.code===ss.Redirect||t.code===ss.SupersededByNewNavigation)}var qc=class extends bl{reason;code;type=gr.NavigationSkipped;constructor(e,A,i,n){super(e,A),this.reason=i,this.code=n}},u1=class extends bl{error;target;type=gr.NavigationError;constructor(e,A,i,n){super(e,A),this.error=i,this.target=n}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}},pu=class extends bl{urlAfterRedirects;state;type=gr.RoutesRecognized;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Im=class extends bl{urlAfterRedirects;state;type=gr.GuardsCheckStart;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},dm=class extends bl{urlAfterRedirects;state;shouldActivate;type=gr.GuardsCheckEnd;constructor(e,A,i,n,o){super(e,A),this.urlAfterRedirects=i,this.state=n,this.shouldActivate=o}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}},Bm=class extends bl{urlAfterRedirects;state;type=gr.ResolveStart;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Em=class extends bl{urlAfterRedirects;state;type=gr.ResolveEnd;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},hm=class{route;type=gr.RouteConfigLoadStart;constructor(e){this.route=e}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}},Qm=class{route;type=gr.RouteConfigLoadEnd;constructor(e){this.route=e}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}},um=class{snapshot;type=gr.ChildActivationStart;constructor(e){this.snapshot=e}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},fm=class{snapshot;type=gr.ChildActivationEnd;constructor(e){this.snapshot=e}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},pm=class{snapshot;type=gr.ActivationStart;constructor(e){this.snapshot=e}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},mm=class{snapshot;type=gr.ActivationEnd;constructor(e){this.snapshot=e}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},DB=class{routerEvent;position;anchor;scrollBehavior;type=gr.Scroll;constructor(e,A,i,n){this.routerEvent=e,this.position=A,this.anchor=i,this.scrollBehavior=n}toString(){let e=this.position?`${this.position[0]}, ${this.position[1]}`:null;return`Scroll(anchor: '${this.anchor}', position: '${e}')`}},yB=class{},mu=class{},vB=class{url;navigationBehaviorOptions;constructor(e,A){this.url=e,this.navigationBehaviorOptions=A}};function isA(t){return!(t instanceof yB)&&!(t instanceof vB)&&!(t instanceof mu)}var wm=class{rootInjector;outlet=null;route=null;children;attachRef=null;get injector(){return this.route?.snapshot._environmentInjector??this.rootInjector}constructor(e){this.rootInjector=e,this.children=new m1(this.rootInjector)}},m1=(()=>{class t{rootInjector;contexts=new Map;constructor(A){this.rootInjector=A}onChildOutletCreated(A,i){let n=this.getOrCreateContext(A);n.outlet=i,this.contexts.set(A,n)}onChildOutletDestroyed(A){let i=this.getContext(A);i&&(i.outlet=null,i.attachRef=null)}onOutletDeactivated(){let A=this.contexts;return this.contexts=new Map,A}onOutletReAttached(A){this.contexts=A}getOrCreateContext(A){let i=this.getContext(A);return i||(i=new wm(this.rootInjector),this.contexts.set(A,i)),i}getContext(A){return this.contexts.get(A)||null}static \u0275fac=function(i){return new(i||t)(Lo(Gr))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Dm=class{_root;constructor(e){this._root=e}get root(){return this._root.value}parent(e){let A=this.pathFromRoot(e);return A.length>1?A[A.length-2]:null}children(e){let A=J7(e,this._root);return A?A.children.map(i=>i.value):[]}firstChild(e){let A=J7(e,this._root);return A&&A.children.length>0?A.children[0].value:null}siblings(e){let A=O7(e,this._root);return A.length<2?[]:A[A.length-2].children.map(n=>n.value).filter(n=>n!==e)}pathFromRoot(e){return O7(e,this._root).map(A=>A.value)}};function J7(t,e){if(t===e.value)return e;for(let A of e.children){let i=J7(t,A);if(i)return i}return null}function O7(t,e){if(t===e.value)return[e];for(let A of e.children){let i=O7(t,A);if(i.length)return i.unshift(e),i}return[]}var vl=class{value;children;constructor(e,A){this.value=e,this.children=A}toString(){return`TreeNode(${this.value})`}};function QB(t){let e={};return t&&t.children.forEach(A=>e[A.value.outlet]=A),e}var wu=class extends Dm{snapshot;constructor(e,A){super(e),this.snapshot=A,Z7(this,e)}toString(){return this.snapshot.toString()}};function NU(t,e){let A=nsA(t,e),i=new ei([new g2("",{})]),n=new ei({}),o=new ei({}),a=new ei({}),r=new ei(""),s=new Vs(i,n,a,r,o,Ri,t,A.root);return s.snapshot=A.root,new wu(new vl(s,[]),A)}function nsA(t,e){let A={},i={},n={},a=new bB([],A,n,"",i,Ri,t,null,{},e);return new Du("",new vl(a,[]))}var Vs=class{urlSubject;paramsSubject;queryParamsSubject;fragmentSubject;dataSubject;outlet;component;snapshot;_futureSnapshot;_routerState;_paramMap;_queryParamMap;title;url;params;queryParams;fragment;data;constructor(e,A,i,n,o,a,r,s){this.urlSubject=e,this.paramsSubject=A,this.queryParamsSubject=i,this.fragmentSubject=n,this.dataSubject=o,this.outlet=a,this.component=r,this._futureSnapshot=s,this.title=this.dataSubject?.pipe(we(l=>l[bu]))??ne(void 0),this.url=e,this.params=A,this.queryParams=i,this.fragment=n,this.data=o}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=this.params.pipe(we(e=>Q1(e))),this._paramMap}get queryParamMap(){return this._queryParamMap??=this.queryParams.pipe(we(e=>Q1(e))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}};function W7(t,e,A="emptyOnly"){let i,{routeConfig:n}=t;return e!==null&&(A==="always"||n?.path===""||!e.component&&!e.routeConfig?.loadComponent)?i={params:gA(gA({},e.params),t.params),data:gA(gA({},e.data),t.data),resolve:gA(gA(gA(gA({},t.data),e.data),n?.data),t._resolvedData)}:i={params:gA({},t.params),data:gA({},t.data),resolve:gA(gA({},t.data),t._resolvedData??{})},n&&LU(n)&&(i.resolve[bu]=n.title),i}var bB=class{url;params;queryParams;fragment;data;outlet;component;routeConfig;_resolve;_resolvedData;_routerState;_paramMap;_queryParamMap;_environmentInjector;get title(){return this.data?.[bu]}constructor(e,A,i,n,o,a,r,s,l,g){this.url=e,this.params=A,this.queryParams=i,this.fragment=n,this.data=o,this.outlet=a,this.component=r,this.routeConfig=s,this._resolve=l,this._environmentInjector=g}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=Q1(this.params),this._paramMap}get queryParamMap(){return this._queryParamMap??=Q1(this.queryParams),this._queryParamMap}toString(){let e=this.url.map(i=>i.toString()).join("/"),A=this.routeConfig?this.routeConfig.path:"";return`Route(url:'${e}', path:'${A}')`}},Du=class extends Dm{url;constructor(e,A){super(A),this.url=e,Z7(this,A)}toString(){return FU(this._root)}};function Z7(t,e){e.value._routerState=t,e.children.forEach(A=>Z7(t,A))}function FU(t){let e=t.children.length>0?` { ${t.children.map(FU).join(", ")} } `:"";return`${t.value}${e}`}function N7(t){if(t.snapshot){let e=t.snapshot,A=t._futureSnapshot;t.snapshot=A,Pc(e.queryParams,A.queryParams)||t.queryParamsSubject.next(A.queryParams),e.fragment!==A.fragment&&t.fragmentSubject.next(A.fragment),Pc(e.params,A.params)||t.paramsSubject.next(A.params),_rA(e.url,A.url)||t.urlSubject.next(A.url),Pc(e.data,A.data)||t.dataSubject.next(A.data)}else t.snapshot=t._futureSnapshot,t.dataSubject.next(t._futureSnapshot.data)}function Y7(t,e){let A=Pc(t.params,e.params)&&GrA(t.url,e.url),i=!t.parent!=!e.parent;return A&&!i&&(!t.parent||Y7(t.parent,e.parent))}function LU(t){return typeof t.title=="string"||t.title===null}var GU=new kA(""),X7=(()=>{class t{activated=null;get activatedComponentRef(){return this.activated}_activatedRoute=null;name=Ri;activateEvents=new LA;deactivateEvents=new LA;attachEvents=new LA;detachEvents=new LA;routerOutletData=me();parentContexts=w(m1);location=w(Mo);changeDetector=w(wt);inputBinder=w(Mu,{optional:!0});supportsBindingToComponentInputs=!0;ngOnChanges(A){if(A.name){let{firstChange:i,previousValue:n}=A.name;if(i)return;this.isTrackedInParentContexts(n)&&(this.deactivate(),this.parentContexts.onChildOutletDestroyed(n)),this.initializeOutletWithName()}}ngOnDestroy(){this.isTrackedInParentContexts(this.name)&&this.parentContexts.onChildOutletDestroyed(this.name),this.inputBinder?.unsubscribeFromRouteData(this)}isTrackedInParentContexts(A){return this.parentContexts.getContext(A)?.outlet===this}ngOnInit(){this.initializeOutletWithName()}initializeOutletWithName(){if(this.parentContexts.onChildOutletCreated(this.name,this),this.activated)return;let A=this.parentContexts.getContext(this.name);A?.route&&(A.attachRef?this.attach(A.attachRef,A.route):this.activateWith(A.route,A.injector))}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new Mt(4012,!1);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new Mt(4012,!1);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new Mt(4012,!1);this.location.detach();let A=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(A.instance),A}attach(A,i){this.activated=A,this._activatedRoute=i,this.location.insert(A.hostView),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.attachEvents.emit(A.instance)}deactivate(){if(this.activated){let A=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(A)}}activateWith(A,i){if(this.isActivated)throw new Mt(4013,!1);this._activatedRoute=A;let n=this.location,a=A.snapshot.component,r=this.parentContexts.getOrCreateContext(this.name).children,s=new H7(A,r,n.injector,this.routerOutletData);this.activated=n.createComponent(a,{index:n.length,injector:s,environmentInjector:i}),this.changeDetector.markForCheck(),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.activateEvents.emit(this.activated.instance)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["router-outlet"]],inputs:{name:"name",routerOutletData:[1,"routerOutletData"]},outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"],features:[Yt]})}return t})(),H7=class{route;childContexts;parent;outletData;constructor(e,A,i,n){this.route=e,this.childContexts=A,this.parent=i,this.outletData=n}get(e,A){return e===Vs?this.route:e===m1?this.childContexts:e===GU?this.outletData:this.parent.get(e,A)}},Mu=new kA(""),$7=(()=>{class t{outletDataSubscriptions=new Map;bindActivatedRouteToOutletComponent(A){this.unsubscribeFromRouteData(A),this.subscribeToRouteData(A)}unsubscribeFromRouteData(A){this.outletDataSubscriptions.get(A)?.unsubscribe(),this.outletDataSubscriptions.delete(A)}subscribeToRouteData(A){let{activatedRoute:i}=A,n=Qr([i.queryParams,i.params,i.data]).pipe(hi(([o,a,r],s)=>(r=gA(gA(gA({},o),a),r),s===0?ne(r):Promise.resolve(r)))).subscribe(o=>{if(!A.isActivated||!A.activatedComponentRef||A.activatedRoute!==i||i.component===null){this.unsubscribeFromRouteData(A);return}let a=AL(i.component);if(!a){this.unsubscribeFromRouteData(A);return}for(let{templateName:r}of a.inputs)A.activatedComponentRef.setInput(r,o[r])});this.outletDataSubscriptions.set(A,n)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac})}return t})(),AM=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["ng-component"]],exportAs:["emptyRouterOutlet"],decls:1,vars:0,template:function(i,n){i&1&&hA(0,"router-outlet")},dependencies:[X7],encapsulation:2})}return t})();function eM(t){let e=t.children&&t.children.map(eM),A=e?Ye(gA({},t),{children:e}):gA({},t);return!A.component&&!A.loadComponent&&(e||A.loadChildren)&&A.outlet&&A.outlet!==Ri&&(A.component=AM),A}function osA(t,e,A){let i=yu(t,e._root,A?A._root:void 0);return new wu(i,e)}function yu(t,e,A){if(A&&t.shouldReuseRoute(e.value,A.value.snapshot)){let i=A.value;i._futureSnapshot=e.value;let n=asA(t,e,A);return new vl(i,n)}else{if(t.shouldAttach(e.value)){let o=t.retrieve(e.value);if(o!==null){let a=o.route;return a.value._futureSnapshot=e.value,a.children=e.children.map(r=>yu(t,r)),a}}let i=rsA(e.value),n=e.children.map(o=>yu(t,o));return new vl(i,n)}}function asA(t,e,A){return e.children.map(i=>{for(let n of A.children)if(t.shouldReuseRoute(i.value,n.value.snapshot))return yu(t,i,n);return yu(t,i)})}function rsA(t){return new Vs(new ei(t.url),new ei(t.params),new ei(t.queryParams),new ei(t.fragment),new ei(t.data),t.outlet,t.component,t)}var MB=class{redirectTo;navigationBehaviorOptions;constructor(e,A){this.redirectTo=e,this.navigationBehaviorOptions=A}},KU="ngNavigationCancelingError";function ym(t,e){let{redirectTo:A,navigationBehaviorOptions:i}=mB(e)?{redirectTo:e,navigationBehaviorOptions:void 0}:e,n=UU(!1,ss.Redirect);return n.url=A,n.navigationBehaviorOptions=i,n}function UU(t,e){let A=new Error(`NavigationCancelingError: ${t||""}`);return A[KU]=!0,A.cancellationCode=e,A}function ssA(t){return TU(t)&&mB(t.url)}function TU(t){return!!t&&t[KU]}var z7=class{routeReuseStrategy;futureState;currState;forwardEvent;inputBindingEnabled;constructor(e,A,i,n,o){this.routeReuseStrategy=e,this.futureState=A,this.currState=i,this.forwardEvent=n,this.inputBindingEnabled=o}activate(e){let A=this.futureState._root,i=this.currState?this.currState._root:null;this.deactivateChildRoutes(A,i,e),N7(this.futureState.root),this.activateChildRoutes(A,i,e)}deactivateChildRoutes(e,A,i){let n=QB(A);e.children.forEach(o=>{let a=o.value.outlet;this.deactivateRoutes(o,n[a],i),delete n[a]}),Object.values(n).forEach(o=>{this.deactivateRouteAndItsChildren(o,i)})}deactivateRoutes(e,A,i){let n=e.value,o=A?A.value:null;if(n===o)if(n.component){let a=i.getContext(n.outlet);a&&this.deactivateChildRoutes(e,A,a.children)}else this.deactivateChildRoutes(e,A,i);else o&&this.deactivateRouteAndItsChildren(A,i)}deactivateRouteAndItsChildren(e,A){e.value.component&&this.routeReuseStrategy.shouldDetach(e.value.snapshot)?this.detachAndStoreRouteSubtree(e,A):this.deactivateRouteAndOutlet(e,A)}detachAndStoreRouteSubtree(e,A){let i=A.getContext(e.value.outlet),n=i&&e.value.component?i.children:A,o=QB(e);for(let a of Object.values(o))this.deactivateRouteAndItsChildren(a,n);if(i&&i.outlet){let a=i.outlet.detach(),r=i.children.onOutletDeactivated();this.routeReuseStrategy.store(e.value.snapshot,{componentRef:a,route:e,contexts:r})}}deactivateRouteAndOutlet(e,A){let i=A.getContext(e.value.outlet),n=i&&e.value.component?i.children:A,o=QB(e);for(let a of Object.values(o))this.deactivateRouteAndItsChildren(a,n);i&&(i.outlet&&(i.outlet.deactivate(),i.children.onOutletDeactivated()),i.attachRef=null,i.route=null)}activateChildRoutes(e,A,i){let n=QB(A);e.children.forEach(o=>{this.activateRoutes(o,n[o.value.outlet],i),this.forwardEvent(new mm(o.value.snapshot))}),e.children.length&&this.forwardEvent(new fm(e.value.snapshot))}activateRoutes(e,A,i){let n=e.value,o=A?A.value:null;if(N7(n),n===o)if(n.component){let a=i.getOrCreateContext(n.outlet);this.activateChildRoutes(e,A,a.children)}else this.activateChildRoutes(e,A,i);else if(n.component){let a=i.getOrCreateContext(n.outlet);if(this.routeReuseStrategy.shouldAttach(n.snapshot)){let r=this.routeReuseStrategy.retrieve(n.snapshot);this.routeReuseStrategy.store(n.snapshot,null),a.children.onOutletReAttached(r.contexts),a.attachRef=r.componentRef,a.route=r.route.value,a.outlet&&a.outlet.attach(r.componentRef,r.route.value),N7(r.route.value),this.activateChildRoutes(e,null,a.children)}else a.attachRef=null,a.route=n,a.outlet&&a.outlet.activateWith(n,a.injector),this.activateChildRoutes(e,null,a.children)}else this.activateChildRoutes(e,null,i)}},vm=class{path;route;constructor(e){this.path=e,this.route=this.path[this.path.length-1]}},pB=class{component;route;constructor(e,A){this.component=e,this.route=A}};function lsA(t,e,A){let i=t._root,n=e?e._root:null;return hu(i,n,A,[i.value])}function gsA(t){let e=t.routeConfig?t.routeConfig.canActivateChild:null;return!e||e.length===0?null:{node:t,guards:e}}function kB(t,e){let A=Symbol(),i=e.get(t,A);return i===A?typeof t=="function"&&!LF(t)?t:e.get(t):i}function hu(t,e,A,i,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=QB(e);return t.children.forEach(a=>{csA(a,o[a.value.outlet],A,i.concat([a.value]),n),delete o[a.value.outlet]}),Object.entries(o).forEach(([a,r])=>uu(r,A.getContext(a),n)),n}function csA(t,e,A,i,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=t.value,a=e?e.value:null,r=A?A.getContext(t.value.outlet):null;if(a&&o.routeConfig===a.routeConfig){let s=CsA(a,o,o.routeConfig.runGuardsAndResolvers);s?n.canActivateChecks.push(new vm(i)):(o.data=a.data,o._resolvedData=a._resolvedData),o.component?hu(t,e,r?r.children:null,i,n):hu(t,e,A,i,n),s&&r&&r.outlet&&r.outlet.isActivated&&n.canDeactivateChecks.push(new pB(r.outlet.component,a))}else a&&uu(e,r,n),n.canActivateChecks.push(new vm(i)),o.component?hu(t,null,r?r.children:null,i,n):hu(t,null,A,i,n);return n}function CsA(t,e,A){if(typeof A=="function")return Xa(e._environmentInjector,()=>A(t,e));switch(A){case"pathParamsChange":return!h1(t.url,e.url);case"pathParamsOrQueryParamsChange":return!h1(t.url,e.url)||!Pc(t.queryParams,e.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!Y7(t,e)||!Pc(t.queryParams,e.queryParams);default:return!Y7(t,e)}}function uu(t,e,A){let i=QB(t),n=t.value;Object.entries(i).forEach(([o,a])=>{n.component?e?uu(a,e.children.getContext(o),A):uu(a,null,A):uu(a,e,A)}),n.component?e&&e.outlet&&e.outlet.isActivated?A.canDeactivateChecks.push(new pB(e.outlet.component,n)):A.canDeactivateChecks.push(new pB(null,n)):A.canDeactivateChecks.push(new pB(null,n))}function Su(t){return typeof t=="function"}function IsA(t){return typeof t=="boolean"}function dsA(t){return t&&Su(t.canLoad)}function BsA(t){return t&&Su(t.canActivate)}function EsA(t){return t&&Su(t.canActivateChild)}function hsA(t){return t&&Su(t.canDeactivate)}function QsA(t){return t&&Su(t.canMatch)}function JU(t){return t instanceof xF||t?.name==="EmptyError"}var am=Symbol("INITIAL_VALUE");function SB(){return hi(t=>Qr(t.map(e=>e.pipe(uo(1),Sn(am)))).pipe(we(e=>{for(let A of e)if(A!==!0){if(A===am)return am;if(A===!1||usA(A))return A}return!0}),gt(e=>e!==am),uo(1)))}function usA(t){return mB(t)||t instanceof MB}function OU(t){return t.aborted?ne(void 0).pipe(uo(1)):new vi(e=>{let A=()=>{e.next(),e.complete()};return t.addEventListener("abort",A),()=>t.removeEventListener("abort",A)})}function YU(t){return Qt(OU(t))}function fsA(t){return Nc(e=>{let{targetSnapshot:A,currentSnapshot:i,guards:{canActivateChecks:n,canDeactivateChecks:o}}=e;return o.length===0&&n.length===0?ne(Ye(gA({},e),{guardsResult:!0})):psA(o,A,i).pipe(Nc(a=>a&&IsA(a)?msA(A,n,t):ne(a)),we(a=>Ye(gA({},e),{guardsResult:a})))})}function psA(t,e,A){return Lr(t).pipe(Nc(i=>bsA(i.component,i.route,A,e)),$n(i=>i!==!0,!0))}function msA(t,e,A){return Lr(e).pipe(xQ(i=>O3(DsA(i.route.parent,A),wsA(i.route,A),vsA(t,i.path),ysA(t,i.route))),$n(i=>i!==!0,!0))}function wsA(t,e){return t!==null&&e&&e(new pm(t)),ne(!0)}function DsA(t,e){return t!==null&&e&&e(new um(t)),ne(!0)}function ysA(t,e){let A=e.routeConfig?e.routeConfig.canActivate:null;if(!A||A.length===0)return ne(!0);let i=A.map(n=>Fc(()=>{let o=e._environmentInjector,a=kB(n,o),r=BsA(a)?a.canActivate(e,t):Xa(o,()=>a(e,t));return f1(r).pipe($n())}));return ne(i).pipe(SB())}function vsA(t,e){let A=e[e.length-1],n=e.slice(0,e.length-1).reverse().map(o=>gsA(o)).filter(o=>o!==null).map(o=>Fc(()=>{let a=o.guards.map(r=>{let s=o.node._environmentInjector,l=kB(r,s),g=EsA(l)?l.canActivateChild(A,t):Xa(s,()=>l(A,t));return f1(g).pipe($n())});return ne(a).pipe(SB())}));return ne(n).pipe(SB())}function bsA(t,e,A,i){let n=e&&e.routeConfig?e.routeConfig.canDeactivate:null;if(!n||n.length===0)return ne(!0);let o=n.map(a=>{let r=e._environmentInjector,s=kB(a,r),l=hsA(s)?s.canDeactivate(t,e,A,i):Xa(r,()=>s(t,e,A,i));return f1(l).pipe($n())});return ne(o).pipe(SB())}function MsA(t,e,A,i,n){let o=e.canLoad;if(o===void 0||o.length===0)return ne(!0);let a=o.map(r=>{let s=kB(r,t),l=dsA(s)?s.canLoad(e,A):Xa(t,()=>s(e,A)),g=f1(l);return n?g.pipe(YU(n)):g});return ne(a).pipe(SB(),HU(i))}function HU(t){return MF(di(e=>{if(typeof e!="boolean")throw ym(t,e)}),we(e=>e===!0))}function SsA(t,e,A,i,n,o){let a=e.canMatch;if(!a||a.length===0)return ne(!0);let r=a.map(s=>{let l=kB(s,t),g=QsA(l)?l.canMatch(e,A,n):Xa(t,()=>l(e,A,n));return f1(g).pipe(YU(o))});return ne(r).pipe(SB(),HU(i))}var j0=class t extends Error{segmentGroup;constructor(e){super(),this.segmentGroup=e||null,Object.setPrototypeOf(this,t.prototype)}},vu=class t extends Error{urlTree;constructor(e){super(),this.urlTree=e,Object.setPrototypeOf(this,t.prototype)}};function ksA(t){throw new Mt(4e3,!1)}function xsA(t){throw UU(!1,ss.GuardRejected)}var P7=class{urlSerializer;urlTree;constructor(e,A){this.urlSerializer=e,this.urlTree=A}lineralizeSegments(e,A){return lt(this,null,function*(){let i=[],n=A.root;for(;;){if(i=i.concat(n.segments),n.numberOfChildren===0)return i;if(n.numberOfChildren>1||!n.children[Ri])throw ksA(`${e.redirectTo}`);n=n.children[Ri]}})}applyRedirectCommands(e,A,i,n,o){return lt(this,null,function*(){let a=yield _sA(A,n,o);if(a instanceof ql)throw new vu(a);let r=this.applyRedirectCreateUrlTree(a,this.urlSerializer.parse(a),e,i);if(a[0]==="/")throw new vu(r);return r})}applyRedirectCreateUrlTree(e,A,i,n){let o=this.createSegmentGroup(e,A.root,i,n);return new ql(o,this.createQueryParams(A.queryParams,this.urlTree.queryParams),A.fragment)}createQueryParams(e,A){let i={};return Object.entries(e).forEach(([n,o])=>{if(typeof o=="string"&&o[0]===":"){let r=o.substring(1);i[n]=A[r]}else i[n]=o}),i}createSegmentGroup(e,A,i,n){let o=this.createSegments(e,A.segments,i,n),a={};return Object.entries(A.children).forEach(([r,s])=>{a[r]=this.createSegmentGroup(e,s,i,n)}),new so(o,a)}createSegments(e,A,i,n){return A.map(o=>o.path[0]===":"?this.findPosParam(e,o,n):this.findOrReturn(o,i))}findPosParam(e,A,i){let n=i[A.path.substring(1)];if(!n)throw new Mt(4001,!1);return n}findOrReturn(e,A){let i=0;for(let n of A){if(n.path===e.path)return A.splice(i),n;i++}return e}};function _sA(t,e,A){if(typeof t=="string")return Promise.resolve(t);let i=t;return gm(f1(Xa(A,()=>i(e))))}function RsA(t,e){return t.providers&&!t._injector&&(t._injector=W3(t.providers,e,`Route: ${t.path}`)),t._injector??e}function jc(t){return t.outlet||Ri}function NsA(t,e){let A=t.filter(i=>jc(i)===e);return A.push(...t.filter(i=>jc(i)!==e)),A}var j7={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function zU(t){return{routeConfig:t.routeConfig,url:t.url,params:t.params,queryParams:t.queryParams,fragment:t.fragment,data:t.data,outlet:t.outlet,title:t.title,paramMap:t.paramMap,queryParamMap:t.queryParamMap}}function FsA(t,e,A,i,n,o,a){let r=PU(t,e,A);if(!r.matched)return ne(r);let s=zU(o(r));return i=RsA(e,i),SsA(i,e,A,n,s,a).pipe(we(l=>l===!0?r:gA({},j7)))}function PU(t,e,A){if(e.path==="")return e.pathMatch==="full"&&(t.hasChildren()||A.length>0)?gA({},j7):{matched:!0,consumedSegments:[],remainingSegments:A,parameters:{},positionalParamSegments:{}};let n=(e.matcher||EU)(A,t,e);if(!n)return gA({},j7);let o={};Object.entries(n.posParams??{}).forEach(([r,s])=>{o[r]=s.path});let a=n.consumed.length>0?gA(gA({},o),n.consumed[n.consumed.length-1].parameters):o;return{matched:!0,consumedSegments:n.consumed,remainingSegments:A.slice(n.consumed.length),parameters:a,positionalParamSegments:n.posParams??{}}}function dU(t,e,A,i){return A.length>0&&KsA(t,A,i)?{segmentGroup:new so(e,GsA(i,new so(A,t.children))),slicedSegments:[]}:A.length===0&&UsA(t,A,i)?{segmentGroup:new so(t.segments,LsA(t,A,i,t.children)),slicedSegments:A}:{segmentGroup:new so(t.segments,t.children),slicedSegments:A}}function LsA(t,e,A,i){let n={};for(let o of A)if(Mm(t,e,o)&&!i[jc(o)]){let a=new so([],{});n[jc(o)]=a}return gA(gA({},i),n)}function GsA(t,e){let A={};A[Ri]=e;for(let i of t)if(i.path===""&&jc(i)!==Ri){let n=new so([],{});A[jc(i)]=n}return A}function KsA(t,e,A){return A.some(i=>Mm(t,e,i)&&jc(i)!==Ri)}function UsA(t,e,A){return A.some(i=>Mm(t,e,i))}function Mm(t,e,A){return(t.hasChildren()||e.length>0)&&A.pathMatch==="full"?!1:A.path===""}function TsA(t,e,A){return e.length===0&&!t.children[A]}var q7=class{};function JsA(t,e,A,i,n,o,a="emptyOnly",r){return lt(this,null,function*(){return new V7(t,e,A,i,n,a,o,r).recognize()})}var OsA=31,V7=class{injector;configLoader;rootComponentType;config;urlTree;paramsInheritanceStrategy;urlSerializer;abortSignal;applyRedirects;absoluteRedirectCount=0;allowRedirects=!0;constructor(e,A,i,n,o,a,r,s){this.injector=e,this.configLoader=A,this.rootComponentType=i,this.config=n,this.urlTree=o,this.paramsInheritanceStrategy=a,this.urlSerializer=r,this.abortSignal=s,this.applyRedirects=new P7(this.urlSerializer,this.urlTree)}noMatchError(e){return new Mt(4002,`'${e.segmentGroup}'`)}recognize(){return lt(this,null,function*(){let e=dU(this.urlTree.root,[],[],this.config).segmentGroup,{children:A,rootSnapshot:i}=yield this.match(e),n=new vl(i,A),o=new Du("",n),a=MU(i,[],this.urlTree.queryParams,this.urlTree.fragment);return a.queryParams=this.urlTree.queryParams,o.url=this.urlSerializer.serialize(a),{state:o,tree:a}})}match(e){return lt(this,null,function*(){let A=new bB([],Object.freeze({}),Object.freeze(gA({},this.urlTree.queryParams)),this.urlTree.fragment,Object.freeze({}),Ri,this.rootComponentType,null,{},this.injector);try{return{children:yield this.processSegmentGroup(this.injector,this.config,e,Ri,A),rootSnapshot:A}}catch(i){if(i instanceof vu)return this.urlTree=i.urlTree,this.match(i.urlTree.root);throw i instanceof j0?this.noMatchError(i):i}})}processSegmentGroup(e,A,i,n,o){return lt(this,null,function*(){if(i.segments.length===0&&i.hasChildren())return this.processChildren(e,A,i,o);let a=yield this.processSegment(e,A,i,i.segments,n,!0,o);return a instanceof vl?[a]:[]})}processChildren(e,A,i,n){return lt(this,null,function*(){let o=[];for(let s of Object.keys(i.children))s==="primary"?o.unshift(s):o.push(s);let a=[];for(let s of o){let l=i.children[s],g=NsA(A,s),C=yield this.processSegmentGroup(e,g,l,s,n);a.push(...C)}let r=jU(a);return YsA(r),r})}processSegment(e,A,i,n,o,a,r){return lt(this,null,function*(){for(let s of A)try{return yield this.processSegmentAgainstRoute(s._injector??e,A,s,i,n,o,a,r)}catch(l){if(l instanceof j0||JU(l))continue;throw l}if(TsA(i,n,o))return new q7;throw new j0(i)})}processSegmentAgainstRoute(e,A,i,n,o,a,r,s){return lt(this,null,function*(){if(jc(i)!==a&&(a===Ri||!Mm(n,o,i)))throw new j0(n);if(i.redirectTo===void 0)return this.matchSegmentAgainstRoute(e,n,i,o,a,s);if(this.allowRedirects&&r)return this.expandSegmentAgainstRouteUsingRedirect(e,n,A,i,o,a,s);throw new j0(n)})}expandSegmentAgainstRouteUsingRedirect(e,A,i,n,o,a,r){return lt(this,null,function*(){let{matched:s,parameters:l,consumedSegments:g,positionalParamSegments:C,remainingSegments:I}=PU(A,n,o);if(!s)throw new j0(A);typeof n.redirectTo=="string"&&n.redirectTo[0]==="/"&&(this.absoluteRedirectCount++,this.absoluteRedirectCount>OsA&&(this.allowRedirects=!1));let d=this.createSnapshot(e,n,o,l,r);if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let h=yield this.applyRedirects.applyRedirectCommands(g,n.redirectTo,C,zU(d),e),E=yield this.applyRedirects.lineralizeSegments(n,h);return this.processSegment(e,i,A,E.concat(I),a,!1,r)})}createSnapshot(e,A,i,n,o){let a=new bB(i,n,Object.freeze(gA({},this.urlTree.queryParams)),this.urlTree.fragment,zsA(A),jc(A),A.component??A._loadedComponent??null,A,PsA(A),e),r=W7(a,o,this.paramsInheritanceStrategy);return a.params=Object.freeze(r.params),a.data=Object.freeze(r.data),a}matchSegmentAgainstRoute(e,A,i,n,o,a){return lt(this,null,function*(){if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let r=k=>this.createSnapshot(e,i,k.consumedSegments,k.parameters,a),s=yield gm(FsA(A,i,n,e,this.urlSerializer,r,this.abortSignal));if(i.path==="**"&&(A.children={}),!s?.matched)throw new j0(A);e=i._injector??e;let{routes:l}=yield this.getChildConfig(e,i,n),g=i._loadedInjector??e,{parameters:C,consumedSegments:I,remainingSegments:d}=s,h=this.createSnapshot(e,i,I,C,a),{segmentGroup:E,slicedSegments:f}=dU(A,I,d,l);if(f.length===0&&E.hasChildren()){let k=yield this.processChildren(g,l,E,h);return new vl(h,k)}if(l.length===0&&f.length===0)return new vl(h,[]);let m=jc(i)===o,v=yield this.processSegment(g,l,E,f,m?Ri:o,!0,h);return new vl(h,v instanceof vl?[v]:[])})}getChildConfig(e,A,i){return lt(this,null,function*(){if(A.children)return{routes:A.children,injector:e};if(A.loadChildren){if(A._loadedRoutes!==void 0){let o=A._loadedNgModuleFactory;return o&&!A._loadedInjector&&(A._loadedInjector=o.create(e).injector),{routes:A._loadedRoutes,injector:A._loadedInjector}}if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);if(yield gm(MsA(e,A,i,this.urlSerializer,this.abortSignal))){let o=yield this.configLoader.loadChildren(e,A);return A._loadedRoutes=o.routes,A._loadedInjector=o.injector,A._loadedNgModuleFactory=o.factory,o}throw xsA(A)}return{routes:[],injector:e}})}};function YsA(t){t.sort((e,A)=>e.value.outlet===Ri?-1:A.value.outlet===Ri?1:e.value.outlet.localeCompare(A.value.outlet))}function HsA(t){let e=t.value.routeConfig;return e&&e.path===""}function jU(t){let e=[],A=new Set;for(let i of t){if(!HsA(i)){e.push(i);continue}let n=e.find(o=>i.value.routeConfig===o.value.routeConfig);n!==void 0?(n.children.push(...i.children),A.add(n)):e.push(i)}for(let i of A){let n=jU(i.children);e.push(new vl(i.value,n))}return e.filter(i=>!A.has(i))}function zsA(t){return t.data||{}}function PsA(t){return t.resolve||{}}function jsA(t,e,A,i,n,o,a){return Nc(r=>lt(null,null,function*(){let{state:s,tree:l}=yield JsA(t,e,A,i,r.extractedUrl,n,o,a);return Ye(gA({},r),{targetSnapshot:s,urlAfterRedirects:l})}))}function qsA(t){return Nc(e=>{let{targetSnapshot:A,guards:{canActivateChecks:i}}=e;if(!i.length)return ne(e);let n=new Set(i.map(r=>r.route)),o=new Set;for(let r of n)if(!o.has(r))for(let s of qU(r))o.add(s);let a=0;return Lr(o).pipe(xQ(r=>n.has(r)?VsA(r,A,t):(r.data=W7(r,r.parent,t).resolve,ne(void 0))),di(()=>a++),Vv(1),Nc(r=>a===o.size?ne(e):ar))})}function qU(t){let e=t.children.map(A=>qU(A)).flat();return[t,...e]}function VsA(t,e,A){let i=t.routeConfig,n=t._resolve;return i?.title!==void 0&&!LU(i)&&(n[bu]=i.title),Fc(()=>(t.data=W7(t,t.parent,A).resolve,WsA(n,t,e).pipe(we(o=>(t._resolvedData=o,t.data=gA(gA({},t.data),o),null)))))}function WsA(t,e,A){let i=L7(t);if(i.length===0)return ne({});let n={};return Lr(i).pipe(Nc(o=>ZsA(t[o],e,A).pipe($n(),di(a=>{if(a instanceof MB)throw ym(new q0,a);n[o]=a}))),Vv(1),we(()=>n),Po(o=>JU(o)?ar:T3(o)))}function ZsA(t,e,A){let i=e._environmentInjector,n=kB(t,i),o=n.resolve?n.resolve(e,A):Xa(i,()=>n(e,A));return f1(o)}function BU(t){return hi(e=>{let A=t(e);return A?Lr(A).pipe(we(()=>e)):ne(e)})}var tM=(()=>{class t{buildTitle(A){let i,n=A.root;for(;n!==void 0;)i=this.getResolvedTitleForRoute(n)??i,n=n.children.find(o=>o.outlet===Ri);return i}getResolvedTitleForRoute(A){return A.data[bu]}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:()=>w(VU),providedIn:"root"})}return t})(),VU=(()=>{class t extends tM{title;constructor(A){super(),this.title=A}updateTitle(A){let i=this.buildTitle(A);i!==void 0&&this.title.setTitle(i)}static \u0275fac=function(i){return new(i||t)(Lo(gL))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),w1=new kA("",{factory:()=>({})}),xB=new kA(""),Sm=(()=>{class t{componentLoaders=new WeakMap;childrenLoaders=new WeakMap;onLoadStartListener;onLoadEndListener;compiler=w(jF);loadComponent(A,i){return lt(this,null,function*(){if(this.componentLoaders.get(i))return this.componentLoaders.get(i);if(i._loadedComponent)return Promise.resolve(i._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(i);let n=lt(this,null,function*(){try{let o=yield QU(Xa(A,()=>i.loadComponent())),a=yield XU(ZU(o));return this.onLoadEndListener&&this.onLoadEndListener(i),i._loadedComponent=a,a}finally{this.componentLoaders.delete(i)}});return this.componentLoaders.set(i,n),n})}loadChildren(A,i){if(this.childrenLoaders.get(i))return this.childrenLoaders.get(i);if(i._loadedRoutes)return Promise.resolve({routes:i._loadedRoutes,injector:i._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(i);let n=lt(this,null,function*(){try{let o=yield WU(i,this.compiler,A,this.onLoadEndListener);return i._loadedRoutes=o.routes,i._loadedInjector=o.injector,i._loadedNgModuleFactory=o.factory,o}finally{this.childrenLoaders.delete(i)}});return this.childrenLoaders.set(i,n),n}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function WU(t,e,A,i){return lt(this,null,function*(){let n=yield QU(Xa(A,()=>t.loadChildren())),o=yield XU(ZU(n)),a;o instanceof OF||Array.isArray(o)?a=o:a=yield e.compileModuleAsync(o),i&&i(t);let r,s,l=!1,g;return Array.isArray(a)?(s=a,l=!0):(r=a.create(A).injector,g=a,s=r.get(xB,[],{optional:!0,self:!0}).flat()),{routes:s.map(eM),injector:r,factory:g}})}function XsA(t){return t&&typeof t=="object"&&"default"in t}function ZU(t){return XsA(t)?t.default:t}function XU(t){return lt(this,null,function*(){return t})}var km=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:()=>w($sA),providedIn:"root"})}return t})(),$sA=(()=>{class t{shouldProcessUrl(A){return!0}extract(A){return A}merge(A,i){return A}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),iM=new kA(""),nM=new kA("");function $U(t,e,A){let i=t.get(nM),n=t.get(ti);if(!n.startViewTransition||i.skipNextTransition)return i.skipNextTransition=!1,new Promise(l=>setTimeout(l));let o,a=new Promise(l=>{o=l}),r=n.startViewTransition(()=>(o(),AlA(t)));r.updateCallbackDone.catch(l=>{}),r.ready.catch(l=>{}),r.finished.catch(l=>{});let{onViewTransitionCreated:s}=i;return s&&Xa(t,()=>s({transition:r,from:e,to:A})),a}function AlA(t){return new Promise(e=>{Hn({read:()=>setTimeout(e)},{injector:t})})}var elA=()=>{},oM=new kA(""),xm=(()=>{class t{currentNavigation=bA(null,{equal:()=>!1});currentTransition=null;lastSuccessfulNavigation=bA(null);events=new ie;transitionAbortWithErrorSubject=new ie;configLoader=w(Sm);environmentInjector=w(Gr);destroyRef=w(sr);urlSerializer=w(p1);rootContexts=w(m1);location=w(Uc);inputBindingEnabled=w(Mu,{optional:!0})!==null;titleStrategy=w(tM);options=w(w1,{optional:!0})||{};paramsInheritanceStrategy=this.options.paramsInheritanceStrategy||"emptyOnly";urlHandlingStrategy=w(km);createViewTransition=w(iM,{optional:!0});navigationErrorHandler=w(oM,{optional:!0});navigationId=0;get hasRequestedNavigation(){return this.navigationId!==0}transitions;afterPreactivation=()=>ne(void 0);rootComponentType=null;destroyed=!1;constructor(){let A=n=>this.events.next(new hm(n)),i=n=>this.events.next(new Qm(n));this.configLoader.onLoadEndListener=i,this.configLoader.onLoadStartListener=A,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}complete(){this.transitions?.complete()}handleNavigationRequest(A){let i=++this.navigationId;ca(()=>{this.transitions?.next(Ye(gA({},A),{extractedUrl:this.urlHandlingStrategy.extract(A.rawUrl),targetSnapshot:null,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null,id:i,routesRecognizeHandler:{},beforeActivateHandler:{}}))})}setupNavigations(A){return this.transitions=new ei(null),this.transitions.pipe(gt(i=>i!==null),hi(i=>{let n=!1,o=new AbortController,a=()=>!n&&this.currentTransition?.id===i.id;return ne(i).pipe(hi(r=>{if(this.navigationId>i.id)return this.cancelNavigationTransition(i,"",ss.SupersededByNewNavigation),ar;this.currentTransition=i;let s=this.lastSuccessfulNavigation();this.currentNavigation.set({id:r.id,initialUrl:r.rawUrl,extractedUrl:r.extractedUrl,targetBrowserUrl:typeof r.extras.browserUrl=="string"?this.urlSerializer.parse(r.extras.browserUrl):r.extras.browserUrl,trigger:r.source,extras:r.extras,previousNavigation:s?Ye(gA({},s),{previousNavigation:null}):null,abort:()=>o.abort(),routesRecognizeHandler:r.routesRecognizeHandler,beforeActivateHandler:r.beforeActivateHandler});let l=!A.navigated||this.isUpdatingInternalState()||this.isUpdatedBrowserUrl(),g=r.extras.onSameUrlNavigation??A.onSameUrlNavigation;if(!l&&g!=="reload")return this.events.next(new qc(r.id,this.urlSerializer.serialize(r.rawUrl),"",wB.IgnoredSameUrlNavigation)),r.resolve(!1),ar;if(this.urlHandlingStrategy.shouldProcessUrl(r.rawUrl))return ne(r).pipe(hi(C=>(this.events.next(new c2(C.id,this.urlSerializer.serialize(C.extractedUrl),C.source,C.restoredState)),C.id!==this.navigationId?ar:Promise.resolve(C))),jsA(this.environmentInjector,this.configLoader,this.rootComponentType,A.config,this.urlSerializer,this.paramsInheritanceStrategy,o.signal),di(C=>{i.targetSnapshot=C.targetSnapshot,i.urlAfterRedirects=C.urlAfterRedirects,this.currentNavigation.update(I=>(I.finalUrl=C.urlAfterRedirects,I)),this.events.next(new mu)}),hi(C=>Lr(i.routesRecognizeHandler.deferredHandle??ne(void 0)).pipe(we(()=>C))),di(()=>{let C=new pu(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(C)}));if(l&&this.urlHandlingStrategy.shouldProcessUrl(r.currentRawUrl)){let{id:C,extractedUrl:I,source:d,restoredState:h,extras:E}=r,f=new c2(C,this.urlSerializer.serialize(I),d,h);this.events.next(f);let m=NU(this.rootComponentType,this.environmentInjector).snapshot;return this.currentTransition=i=Ye(gA({},r),{targetSnapshot:m,urlAfterRedirects:I,extras:Ye(gA({},E),{skipLocationChange:!1,replaceUrl:!1})}),this.currentNavigation.update(v=>(v.finalUrl=I,v)),ne(i)}else return this.events.next(new qc(r.id,this.urlSerializer.serialize(r.extractedUrl),"",wB.IgnoredByUrlHandlingStrategy)),r.resolve(!1),ar}),we(r=>{let s=new Im(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);return this.events.next(s),this.currentTransition=i=Ye(gA({},r),{guards:lsA(r.targetSnapshot,r.currentSnapshot,this.rootContexts)}),i}),fsA(r=>this.events.next(r)),hi(r=>{if(i.guardsResult=r.guardsResult,r.guardsResult&&typeof r.guardsResult!="boolean")throw ym(this.urlSerializer,r.guardsResult);let s=new dm(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot,!!r.guardsResult);if(this.events.next(s),!a())return ar;if(!r.guardsResult)return this.cancelNavigationTransition(r,"",ss.GuardRejected),ar;if(r.guards.canActivateChecks.length===0)return ne(r);let l=new Bm(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);if(this.events.next(l),!a())return ar;let g=!1;return ne(r).pipe(qsA(this.paramsInheritanceStrategy),di({next:()=>{g=!0;let C=new Em(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(C)},complete:()=>{g||this.cancelNavigationTransition(r,"",ss.NoDataFromResolver)}}))}),BU(r=>{let s=g=>{let C=[];if(g.routeConfig?._loadedComponent)g.component=g.routeConfig?._loadedComponent;else if(g.routeConfig?.loadComponent){let I=g._environmentInjector;C.push(this.configLoader.loadComponent(I,g.routeConfig).then(d=>{g.component=d}))}for(let I of g.children)C.push(...s(I));return C},l=s(r.targetSnapshot.root);return l.length===0?ne(r):Lr(Promise.all(l).then(()=>r))}),BU(()=>this.afterPreactivation()),hi(()=>{let{currentSnapshot:r,targetSnapshot:s}=i,l=this.createViewTransition?.(this.environmentInjector,r.root,s.root);return l?Lr(l).pipe(we(()=>i)):ne(i)}),uo(1),hi(r=>{let s=osA(A.routeReuseStrategy,r.targetSnapshot,r.currentRouterState);this.currentTransition=i=r=Ye(gA({},r),{targetRouterState:s}),this.currentNavigation.update(g=>(g.targetRouterState=s,g)),this.events.next(new yB);let l=i.beforeActivateHandler.deferredHandle;return l?Lr(l.then(()=>r)):ne(r)}),di(r=>{new z7(A.routeReuseStrategy,i.targetRouterState,i.currentRouterState,s=>this.events.next(s),this.inputBindingEnabled).activate(this.rootContexts),a()&&(n=!0,this.currentNavigation.update(s=>(s.abort=elA,s)),this.lastSuccessfulNavigation.set(ca(this.currentNavigation)),this.events.next(new Ug(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects))),this.titleStrategy?.updateTitle(r.targetRouterState.snapshot),r.resolve(!0))}),Qt(OU(o.signal).pipe(gt(()=>!n&&!i.targetRouterState),di(()=>{this.cancelNavigationTransition(i,o.signal.reason+"",ss.Aborted)}))),di({complete:()=>{n=!0}}),Qt(this.transitionAbortWithErrorSubject.pipe(di(r=>{throw r}))),H3(()=>{o.abort(),n||this.cancelNavigationTransition(i,"",ss.SupersededByNewNavigation),this.currentTransition?.id===i.id&&(this.currentNavigation.set(null),this.currentTransition=null)}),Po(r=>{if(n=!0,this.destroyed)return i.resolve(!1),ar;if(TU(r))this.events.next(new jl(i.id,this.urlSerializer.serialize(i.extractedUrl),r.message,r.cancellationCode)),ssA(r)?this.events.next(new vB(r.url,r.navigationBehaviorOptions)):i.resolve(!1);else{let s=new u1(i.id,this.urlSerializer.serialize(i.extractedUrl),r,i.targetSnapshot??void 0);try{let l=Xa(this.environmentInjector,()=>this.navigationErrorHandler?.(s));if(l instanceof MB){let{message:g,cancellationCode:C}=ym(this.urlSerializer,l);this.events.next(new jl(i.id,this.urlSerializer.serialize(i.extractedUrl),g,C)),this.events.next(new vB(l.redirectTo,l.navigationBehaviorOptions))}else throw this.events.next(s),r}catch(l){this.options.resolveNavigationPromiseOnError?i.resolve(!1):i.reject(l)}}return ar}))}))}cancelNavigationTransition(A,i,n){let o=new jl(A.id,this.urlSerializer.serialize(A.extractedUrl),i,n);this.events.next(o),A.resolve(!1)}isUpdatingInternalState(){return this.currentTransition?.extractedUrl.toString()!==this.currentTransition?.currentUrlTree.toString()}isUpdatedBrowserUrl(){let A=this.urlHandlingStrategy.extract(this.urlSerializer.parse(this.location.path(!0))),i=ca(this.currentNavigation),n=i?.targetBrowserUrl??i?.extractedUrl;return A.toString()!==n?.toString()&&!i?.extras.skipLocationChange}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function tlA(t){return t!==fB}var AT=new kA("");var eT=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:()=>w(ilA),providedIn:"root"})}return t})(),bm=class{shouldDetach(e){return!1}store(e,A){}shouldAttach(e){return!1}retrieve(e){return null}shouldReuseRoute(e,A){return e.routeConfig===A.routeConfig}shouldDestroyInjector(e){return!0}},ilA=(()=>{class t extends bm{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),aM=(()=>{class t{urlSerializer=w(p1);options=w(w1,{optional:!0})||{};canceledNavigationResolution=this.options.canceledNavigationResolution||"replace";location=w(Uc);urlHandlingStrategy=w(km);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";currentUrlTree=new ql;getCurrentUrlTree(){return this.currentUrlTree}rawUrlTree=this.currentUrlTree;getRawUrlTree(){return this.rawUrlTree}createBrowserPath({finalUrl:A,initialUrl:i,targetBrowserUrl:n}){let o=A!==void 0?this.urlHandlingStrategy.merge(A,i):i,a=n??o;return a instanceof ql?this.urlSerializer.serialize(a):a}commitTransition({targetRouterState:A,finalUrl:i,initialUrl:n}){i&&A?(this.currentUrlTree=i,this.rawUrlTree=this.urlHandlingStrategy.merge(i,n),this.routerState=A):this.rawUrlTree=n}routerState=NU(null,w(Gr));getRouterState(){return this.routerState}_stateMemento=this.createStateMemento();get stateMemento(){return this._stateMemento}updateStateMemento(){this._stateMemento=this.createStateMemento()}createStateMemento(){return{rawUrlTree:this.rawUrlTree,currentUrlTree:this.currentUrlTree,routerState:this.routerState}}restoredState(){return this.location.getState()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:()=>w(nlA),providedIn:"root"})}return t})(),nlA=(()=>{class t extends aM{currentPageId=0;lastSuccessfulId=-1;get browserPageId(){return this.canceledNavigationResolution!=="computed"?this.currentPageId:this.restoredState()?.\u0275routerPageId??this.currentPageId}registerNonRouterCurrentEntryChangeListener(A){return this.location.subscribe(i=>{i.type==="popstate"&&setTimeout(()=>{A(i.url,i.state,"popstate",{replaceUrl:!0})})})}handleRouterEvent(A,i){A instanceof c2?this.updateStateMemento():A instanceof qc?this.commitTransition(i):A instanceof pu?this.urlUpdateStrategy==="eager"&&(i.extras.skipLocationChange||this.setBrowserUrl(this.createBrowserPath(i),i)):A instanceof yB?(this.commitTransition(i),this.urlUpdateStrategy==="deferred"&&!i.extras.skipLocationChange&&this.setBrowserUrl(this.createBrowserPath(i),i)):A instanceof jl&&!RU(A)?this.restoreHistory(i):A instanceof u1?this.restoreHistory(i,!0):A instanceof Ug&&(this.lastSuccessfulId=A.id,this.currentPageId=this.browserPageId)}setBrowserUrl(A,{extras:i,id:n}){let{replaceUrl:o,state:a}=i;if(this.location.isCurrentPathEqualTo(A)||o){let r=this.browserPageId,s=gA(gA({},a),this.generateNgRouterState(n,r));this.location.replaceState(A,"",s)}else{let r=gA(gA({},a),this.generateNgRouterState(n,this.browserPageId+1));this.location.go(A,"",r)}}restoreHistory(A,i=!1){if(this.canceledNavigationResolution==="computed"){let n=this.browserPageId,o=this.currentPageId-n;o!==0?this.location.historyGo(o):this.getCurrentUrlTree()===A.finalUrl&&o===0&&(this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}else this.canceledNavigationResolution==="replace"&&(i&&this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}resetInternalState({finalUrl:A}){this.routerState=this.stateMemento.routerState,this.currentUrlTree=this.stateMemento.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,A??this.rawUrlTree)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.getRawUrlTree()),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}generateNgRouterState(A,i){return this.canceledNavigationResolution==="computed"?{navigationId:A,\u0275routerPageId:i}:{navigationId:A}}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function _m(t,e){t.events.pipe(gt(A=>A instanceof Ug||A instanceof jl||A instanceof u1||A instanceof qc),we(A=>A instanceof Ug||A instanceof qc?0:(A instanceof jl?A.code===ss.Redirect||A.code===ss.SupersededByNewNavigation:!1)?2:1),gt(A=>A!==2),uo(1)).subscribe(()=>{e()})}var ls=(()=>{class t{get currentUrlTree(){return this.stateManager.getCurrentUrlTree()}get rawUrlTree(){return this.stateManager.getRawUrlTree()}disposed=!1;nonRouterCurrentEntryChangeSubscription;console=w(YF);stateManager=w(aM);options=w(w1,{optional:!0})||{};pendingTasks=w(UF);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";navigationTransitions=w(xm);urlSerializer=w(p1);location=w(Uc);urlHandlingStrategy=w(km);injector=w(Gr);_events=new ie;get events(){return this._events}get routerState(){return this.stateManager.getRouterState()}navigated=!1;routeReuseStrategy=w(eT);injectorCleanup=w(AT,{optional:!0});onSameUrlNavigation=this.options.onSameUrlNavigation||"ignore";config=w(xB,{optional:!0})?.flat()??[];componentInputBindingEnabled=!!w(Mu,{optional:!0});currentNavigation=this.navigationTransitions.currentNavigation.asReadonly();constructor(){this.resetConfig(this.config),this.navigationTransitions.setupNavigations(this).subscribe({error:A=>{}}),this.subscribeToNavigationEvents()}eventsSubscription=new bo;subscribeToNavigationEvents(){let A=this.navigationTransitions.events.subscribe(i=>{try{let n=this.navigationTransitions.currentTransition,o=ca(this.navigationTransitions.currentNavigation);if(n!==null&&o!==null){if(this.stateManager.handleRouterEvent(i,o),i instanceof jl&&i.code!==ss.Redirect&&i.code!==ss.SupersededByNewNavigation)this.navigated=!0;else if(i instanceof Ug)this.navigated=!0,this.injectorCleanup?.(this.routeReuseStrategy,this.routerState,this.config);else if(i instanceof vB){let a=i.navigationBehaviorOptions,r=this.urlHandlingStrategy.merge(i.url,n.currentRawUrl),s=gA({scroll:n.extras.scroll,browserUrl:n.extras.browserUrl,info:n.extras.info,skipLocationChange:n.extras.skipLocationChange,replaceUrl:n.extras.replaceUrl||this.urlUpdateStrategy==="eager"||tlA(n.source)},a);this.scheduleNavigation(r,fB,null,s,{resolve:n.resolve,reject:n.reject,promise:n.promise})}}isA(i)&&this._events.next(i)}catch(n){this.navigationTransitions.transitionAbortWithErrorSubject.next(n)}});this.eventsSubscription.add(A)}resetRootComponentType(A){this.routerState.root.component=A,this.navigationTransitions.rootComponentType=A}initialNavigation(){this.setUpLocationChangeListener(),this.navigationTransitions.hasRequestedNavigation||this.navigateToSyncWithBrowser(this.location.path(!0),fB,this.stateManager.restoredState(),{replaceUrl:!0})}setUpLocationChangeListener(){this.nonRouterCurrentEntryChangeSubscription??=this.stateManager.registerNonRouterCurrentEntryChangeListener((A,i,n,o)=>{this.navigateToSyncWithBrowser(A,n,i,o)})}navigateToSyncWithBrowser(A,i,n,o){let a=n?.navigationId?n:null;if(n){let s=gA({},n);delete s.navigationId,delete s.\u0275routerPageId,Object.keys(s).length!==0&&(o.state=s)}let r=this.parseUrl(A);this.scheduleNavigation(r,i,a,o).catch(s=>{this.disposed||this.injector.get(Wv)(s)})}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return ca(this.navigationTransitions.currentNavigation)}get lastSuccessfulNavigation(){return this.navigationTransitions.lastSuccessfulNavigation}resetConfig(A){this.config=A.map(eM),this.navigated=!1}ngOnDestroy(){this.dispose()}dispose(){this._events.unsubscribe(),this.navigationTransitions.complete(),this.nonRouterCurrentEntryChangeSubscription?.unsubscribe(),this.nonRouterCurrentEntryChangeSubscription=void 0,this.disposed=!0,this.eventsSubscription.unsubscribe()}createUrlTree(A,i={}){let{relativeTo:n,queryParams:o,fragment:a,queryParamsHandling:r,preserveFragment:s}=i,l=s?this.currentUrlTree.fragment:a,g=null;switch(r??this.options.defaultQueryParamsHandling){case"merge":g=gA(gA({},this.currentUrlTree.queryParams),o);break;case"preserve":g=this.currentUrlTree.queryParams;break;default:g=o||null}g!==null&&(g=this.removeEmptyProps(g));let C;try{let I=n?n.snapshot:this.routerState.snapshot.root;C=SU(I)}catch(I){(typeof A[0]!="string"||A[0][0]!=="/")&&(A=[]),C=this.currentUrlTree.root}return kU(C,A,g,l??null,this.urlSerializer)}navigateByUrl(A,i={skipLocationChange:!1}){let n=mB(A)?A:this.parseUrl(A),o=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(o,fB,null,i)}navigate(A,i={skipLocationChange:!1}){return olA(A),this.navigateByUrl(this.createUrlTree(A,i),i)}serializeUrl(A){return this.urlSerializer.serialize(A)}parseUrl(A){try{return this.urlSerializer.parse(A)}catch(i){return this.console.warn(FF(4018,!1)),this.urlSerializer.parse("/")}}isActive(A,i){let n;if(i===!0?n=gA({},fU):i===!1?n=gA({},G7):n=gA(gA({},G7),i),mB(A))return lU(this.currentUrlTree,A,n);let o=this.parseUrl(A);return lU(this.currentUrlTree,o,n)}removeEmptyProps(A){return Object.entries(A).reduce((i,[n,o])=>(o!=null&&(i[n]=o),i),{})}scheduleNavigation(A,i,n,o,a){if(this.disposed)return Promise.resolve(!1);let r,s,l;a?(r=a.resolve,s=a.reject,l=a.promise):l=new Promise((C,I)=>{r=C,s=I});let g=this.pendingTasks.add();return _m(this,()=>{queueMicrotask(()=>this.pendingTasks.remove(g))}),this.navigationTransitions.handleNavigationRequest({source:i,restoredState:n,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,rawUrl:A,extras:o,resolve:r,reject:s,promise:l,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),l.catch(Promise.reject.bind(Promise))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function olA(t){for(let e=0;e{class t{router;injector;preloadingStrategy;loader;subscription;constructor(A,i,n,o){this.router=A,this.injector=i,this.preloadingStrategy=n,this.loader=o}setUpPreloading(){this.subscription=this.router.events.pipe(gt(A=>A instanceof Ug),xQ(()=>this.preload())).subscribe(()=>{})}preload(){return this.processRoutes(this.injector,this.router.config)}ngOnDestroy(){this.subscription?.unsubscribe()}processRoutes(A,i){let n=[];for(let o of i){o.providers&&!o._injector&&(o._injector=W3(o.providers,A,""));let a=o._injector??A;o._loadedNgModuleFactory&&!o._loadedInjector&&(o._loadedInjector=o._loadedNgModuleFactory.create(a).injector);let r=o._loadedInjector??a;(o.loadChildren&&!o._loadedRoutes&&o.canLoad===void 0||o.loadComponent&&!o._loadedComponent)&&n.push(this.preloadConfig(a,o)),(o.children||o._loadedRoutes)&&n.push(this.processRoutes(r,o.children??o._loadedRoutes))}return Lr(n).pipe(qv())}preloadConfig(A,i){return this.preloadingStrategy.preload(i,()=>{if(A.destroyed)return ne(null);let n;i.loadChildren&&i.canLoad===void 0?n=Lr(this.loader.loadChildren(A,i)):n=ne(null);let o=n.pipe(Nc(a=>a===null?ne(void 0):(i._loadedRoutes=a.routes,i._loadedInjector=a.injector,i._loadedNgModuleFactory=a.factory,this.processRoutes(a.injector??A,a.routes))));if(i.loadComponent&&!i._loadedComponent){let a=this.loader.loadComponent(A,i);return Lr([o,a]).pipe(qv())}else return o})}static \u0275fac=function(i){return new(i||t)(Lo(ls),Lo(Gr),Lo(ku),Lo(Sm))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),iT=new kA(""),rlA=(()=>{class t{options;routerEventsSubscription;scrollEventsSubscription;lastId=0;lastSource=fB;restoredId=0;store={};urlSerializer=w(p1);zone=w(qe);viewportScroller=w(tb);transitions=w(xm);constructor(A){this.options=A,this.options.scrollPositionRestoration||="disabled",this.options.anchorScrolling||="disabled"}init(){this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.transitions.events.subscribe(A=>{A instanceof c2?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=A.navigationTrigger,this.restoredId=A.restoredState?A.restoredState.navigationId:0):A instanceof Ug?(this.lastId=A.id,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.urlAfterRedirects).fragment)):A instanceof qc&&A.code===wB.IgnoredSameUrlNavigation&&(this.lastSource=void 0,this.restoredId=0,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.url).fragment))})}consumeScrollEvents(){return this.transitions.events.subscribe(A=>{if(!(A instanceof DB)||A.scrollBehavior==="manual")return;let i={behavior:"instant"};A.position?this.options.scrollPositionRestoration==="top"?this.viewportScroller.scrollToPosition([0,0],i):this.options.scrollPositionRestoration==="enabled"&&this.viewportScroller.scrollToPosition(A.position,i):A.anchor&&this.options.anchorScrolling==="enabled"?this.viewportScroller.scrollToAnchor(A.anchor):this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.scrollToPosition([0,0])})}scheduleScrollEvent(A,i){let n=ca(this.transitions.currentNavigation)?.extras.scroll;this.zone.runOutsideAngular(()=>lt(this,null,function*(){yield new Promise(o=>{setTimeout(o),typeof requestAnimationFrame<"u"&&requestAnimationFrame(o)}),this.zone.run(()=>{this.transitions.events.next(new DB(A,this.lastSource==="popstate"?this.store[this.restoredId]:null,i,n))})}))}ngOnDestroy(){this.routerEventsSubscription?.unsubscribe(),this.scrollEventsSubscription?.unsubscribe()}static \u0275fac=function(i){V3()};static \u0275prov=qA({token:t,factory:t.\u0275fac})}return t})();function slA(){return w(ls).routerState.root}function xu(t,e){return{\u0275kind:t,\u0275providers:e}}function llA(){let t=w(Dt);return e=>{let A=t.get(K0);if(e!==A.components[0])return;let i=t.get(ls),n=t.get(nT);t.get(sM)===1&&i.initialNavigation(),t.get(rT,null,{optional:!0})?.setUpPreloading(),t.get(iT,null,{optional:!0})?.init(),i.resetRootComponentType(A.componentTypes[0]),n.closed||(n.next(),n.complete(),n.unsubscribe())}}var nT=new kA("",{factory:()=>new ie}),sM=new kA("",{factory:()=>1});function oT(){let t=[{provide:JF,useValue:!0},{provide:sM,useValue:0},$v(()=>{let e=w(Dt);return e.get(eL,Promise.resolve()).then(()=>new Promise(i=>{let n=e.get(ls),o=e.get(nT);_m(n,()=>{i(!0)}),e.get(xm).afterPreactivation=()=>(i(!0),o.closed?ne(void 0):o),n.initialNavigation()}))})];return xu(2,t)}function aT(){let t=[$v(()=>{w(ls).setUpLocationChangeListener()}),{provide:sM,useValue:2}];return xu(3,t)}var rT=new kA("");function sT(t){return xu(0,[{provide:rT,useExisting:tT},{provide:ku,useExisting:t}])}function lT(){return xu(8,[$7,{provide:Mu,useExisting:$7}])}function gT(t){q3("NgRouterViewTransitions");let e=[{provide:iM,useValue:$U},{provide:nM,useValue:gA({skipNextTransition:!!t?.skipInitialTransition},t)}];return xu(9,e)}var cT=[Uc,{provide:p1,useClass:q0},ls,m1,{provide:Vs,useFactory:slA},Sm,[]],Rm=(()=>{class t{constructor(){}static forRoot(A,i){return{ngModule:t,providers:[cT,[],{provide:xB,multi:!0,useValue:A},[],i?.errorHandler?{provide:oM,useValue:i.errorHandler}:[],{provide:w1,useValue:i||{}},i?.useHash?clA():ClA(),glA(),i?.preloadingStrategy?sT(i.preloadingStrategy).\u0275providers:[],i?.initialNavigation?IlA(i):[],i?.bindToComponentInputs?lT().\u0275providers:[],i?.enableViewTransitions?gT().\u0275providers:[],dlA()]}}static forChild(A){return{ngModule:t,providers:[{provide:xB,multi:!0,useValue:A}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})();function glA(){return{provide:iT,useFactory:()=>{let t=w(tb),e=w(w1);return e.scrollOffset&&t.setOffset(e.scrollOffset),new rlA(e)}}}function clA(){return{provide:eb,useClass:iL}}function ClA(){return{provide:eb,useClass:tL}}function IlA(t){return[t.initialNavigation==="disabled"?aT().\u0275providers:[],t.initialNavigation==="enabledBlocking"?oT().\u0275providers:[]]}var rM=new kA("");function dlA(){return[{provide:rM,useFactory:llA},{provide:HF,multi:!0,useExisting:rM}]}var hlA=["*"];var QlA=new kA("MAT_CARD_CONFIG"),Nm=(()=>{class t{appearance;constructor(){let A=w(QlA,{optional:!0});this.appearance=A?.appearance||"raised"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-card"]],hostAttrs:[1,"mat-mdc-card","mdc-card"],hostVars:8,hostBindings:function(i,n){i&2&&RA("mat-mdc-card-outlined",n.appearance==="outlined")("mdc-card--outlined",n.appearance==="outlined")("mat-mdc-card-filled",n.appearance==="filled")("mdc-card--filled",n.appearance==="filled")},inputs:{appearance:"appearance"},exportAs:["matCard"],ngContentSelectors:hlA,decls:1,vars:0,template:function(i,n){i&1&&(Rt(),Ve(0))},styles:[`.mat-mdc-card{display:flex;flex-direction:column;box-sizing:border-box;position:relative;border-style:solid;border-width:0;background-color:var(--mat-card-elevated-container-color, var(--mat-sys-surface-container-low));border-color:var(--mat-card-elevated-container-color, var(--mat-sys-surface-container-low));border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mat-card-elevated-container-elevation, var(--mat-sys-level1))}.mat-mdc-card::after{position:absolute;top:0;left:0;width:100%;height:100%;border:solid 1px rgba(0,0,0,0);content:"";display:block;pointer-events:none;box-sizing:border-box;border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium))}.mat-mdc-card-outlined{background-color:var(--mat-card-outlined-container-color, var(--mat-sys-surface));border-radius:var(--mat-card-outlined-container-shape, var(--mat-sys-corner-medium));border-width:var(--mat-card-outlined-outline-width, 1px);border-color:var(--mat-card-outlined-outline-color, var(--mat-sys-outline-variant));box-shadow:var(--mat-card-outlined-container-elevation, var(--mat-sys-level0))}.mat-mdc-card-outlined::after{border:none}.mat-mdc-card-filled{background-color:var(--mat-card-filled-container-color, var(--mat-sys-surface-container-highest));border-radius:var(--mat-card-filled-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mat-card-filled-container-elevation, var(--mat-sys-level0))}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media::before{display:block;content:""}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mat-mdc-card-actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px;padding:8px}.mat-mdc-card-title{font-family:var(--mat-card-title-text-font, var(--mat-sys-title-large-font));line-height:var(--mat-card-title-text-line-height, var(--mat-sys-title-large-line-height));font-size:var(--mat-card-title-text-size, var(--mat-sys-title-large-size));letter-spacing:var(--mat-card-title-text-tracking, var(--mat-sys-title-large-tracking));font-weight:var(--mat-card-title-text-weight, var(--mat-sys-title-large-weight))}.mat-mdc-card-subtitle{color:var(--mat-card-subtitle-text-color, var(--mat-sys-on-surface));font-family:var(--mat-card-subtitle-text-font, var(--mat-sys-title-medium-font));line-height:var(--mat-card-subtitle-text-line-height, var(--mat-sys-title-medium-line-height));font-size:var(--mat-card-subtitle-text-size, var(--mat-sys-title-medium-size));letter-spacing:var(--mat-card-subtitle-text-tracking, var(--mat-sys-title-medium-tracking));font-weight:var(--mat-card-subtitle-text-weight, var(--mat-sys-title-medium-weight))}.mat-mdc-card-title,.mat-mdc-card-subtitle{display:block;margin:0}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle{padding:16px 16px 0}.mat-mdc-card-header{display:flex;padding:16px 16px 0}.mat-mdc-card-content{display:block;padding:0 16px}.mat-mdc-card-content:first-child{padding-top:16px}.mat-mdc-card-content:last-child{padding-bottom:16px}.mat-mdc-card-title-group{display:flex;justify-content:space-between;width:100%}.mat-mdc-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;margin-bottom:16px;object-fit:cover}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title{line-height:normal}.mat-mdc-card-sm-image{width:80px;height:80px}.mat-mdc-card-md-image{width:112px;height:112px}.mat-mdc-card-lg-image{width:152px;height:152px}.mat-mdc-card-xl-image{width:240px;height:240px}.mat-mdc-card-subtitle~.mat-mdc-card-title,.mat-mdc-card-title~.mat-mdc-card-subtitle,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-title-group .mat-mdc-card-title,.mat-mdc-card-title-group .mat-mdc-card-subtitle{padding-top:0}.mat-mdc-card-content>:last-child:not(.mat-mdc-card-footer){margin-bottom:0}.mat-mdc-card-actions-align-end{justify-content:flex-end} -`],encapsulation:2,changeDetection:0})}return t})();var CT=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();var _u=class{};function Ru(t){return t&&typeof t.connect=="function"&&!(t instanceof SF)}var Tg=(function(t){return t[t.REPLACED=0]="REPLACED",t[t.INSERTED=1]="INSERTED",t[t.MOVED=2]="MOVED",t[t.REMOVED=3]="REMOVED",t})(Tg||{}),Fm=class{viewCacheSize=20;_viewCache=[];applyChanges(e,A,i,n,o){e.forEachOperation((a,r,s)=>{let l,g;if(a.previousIndex==null){let C=()=>i(a,r,s);l=this._insertView(C,s,A,n(a)),g=l?Tg.INSERTED:Tg.REPLACED}else s==null?(this._detachAndCacheView(r,A),g=Tg.REMOVED):(l=this._moveView(r,s,A,n(a)),g=Tg.MOVED);o&&o({context:l?.context,operation:g,record:a})})}detach(){for(let e of this._viewCache)e.destroy();this._viewCache=[]}_insertView(e,A,i,n){let o=this._insertViewFromCache(A,i);if(o){o.context.$implicit=n;return}let a=e();return i.createEmbeddedView(a.templateRef,a.context,a.index)}_detachAndCacheView(e,A){let i=A.detach(e);this._maybeCacheView(i,A)}_moveView(e,A,i,n){let o=i.get(e);return i.move(o,A),o.context.$implicit=n,o}_maybeCacheView(e,A){if(this._viewCache.length{let l,g;if(a.previousIndex==null){let C=i(a,r,s);l=A.createEmbeddedView(C.templateRef,C.context,C.index),g=Tg.INSERTED}else s==null?(A.remove(r),g=Tg.REMOVED):(l=A.get(r),A.move(l,s),g=Tg.MOVED);o&&o({context:l?.context,operation:g,record:a})})}detach(){}};var V0=class{_multiple;_emitChanges;compareWith;_selection=new Set;_deselectedToEmit=[];_selectedToEmit=[];_selected=null;get selected(){return this._selected||(this._selected=Array.from(this._selection.values())),this._selected}changed=new ie;constructor(e=!1,A,i=!0,n){this._multiple=e,this._emitChanges=i,this.compareWith=n,A&&A.length&&(e?A.forEach(o=>this._markSelected(o)):this._markSelected(A[0]),this._selectedToEmit.length=0)}select(...e){this._verifyValueAssignment(e),e.forEach(i=>this._markSelected(i));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}deselect(...e){this._verifyValueAssignment(e),e.forEach(i=>this._unmarkSelected(i));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}setSelection(...e){this._verifyValueAssignment(e);let A=this.selected,i=new Set(e.map(o=>this._getConcreteValue(o)));e.forEach(o=>this._markSelected(o)),A.filter(o=>!i.has(this._getConcreteValue(o,i))).forEach(o=>this._unmarkSelected(o));let n=this._hasQueuedChanges();return this._emitChangeEvent(),n}toggle(e){return this.isSelected(e)?this.deselect(e):this.select(e)}clear(e=!0){this._unmarkAll();let A=this._hasQueuedChanges();return e&&this._emitChangeEvent(),A}isSelected(e){return this._selection.has(this._getConcreteValue(e))}isEmpty(){return this._selection.size===0}hasValue(){return!this.isEmpty()}sort(e){this._multiple&&this.selected&&this._selected.sort(e)}isMultipleSelection(){return this._multiple}_emitChangeEvent(){this._selected=null,(this._selectedToEmit.length||this._deselectedToEmit.length)&&(this.changed.next({source:this,added:this._selectedToEmit,removed:this._deselectedToEmit}),this._deselectedToEmit=[],this._selectedToEmit=[])}_markSelected(e){e=this._getConcreteValue(e),this.isSelected(e)||(this._multiple||this._unmarkAll(),this.isSelected(e)||this._selection.add(e),this._emitChanges&&this._selectedToEmit.push(e))}_unmarkSelected(e){e=this._getConcreteValue(e),this.isSelected(e)&&(this._selection.delete(e),this._emitChanges&&this._deselectedToEmit.push(e))}_unmarkAll(){this.isEmpty()||this._selection.forEach(e=>this._unmarkSelected(e))}_verifyValueAssignment(e){e.length>1&&this._multiple}_hasQueuedChanges(){return!!(this._deselectedToEmit.length||this._selectedToEmit.length)}_getConcreteValue(e,A){if(this.compareWith){A=A??this._selection;for(let i of A)if(this.compareWith(e,i))return i;return e}else return e}};var Gm=(()=>{class t{_animationsDisabled=An();state="unchecked";disabled=!1;appearance="full";constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-pseudo-checkbox"]],hostAttrs:[1,"mat-pseudo-checkbox"],hostVars:12,hostBindings:function(i,n){i&2&&RA("mat-pseudo-checkbox-indeterminate",n.state==="indeterminate")("mat-pseudo-checkbox-checked",n.state==="checked")("mat-pseudo-checkbox-disabled",n.disabled)("mat-pseudo-checkbox-minimal",n.appearance==="minimal")("mat-pseudo-checkbox-full",n.appearance==="full")("_mat-animation-noopable",n._animationsDisabled)},inputs:{state:"state",disabled:"disabled",appearance:"appearance"},decls:0,vars:0,template:function(i,n){},styles:[`.mat-pseudo-checkbox{border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox._mat-animation-noopable{transition:none !important;animation:none !important}.mat-pseudo-checkbox._mat-animation-noopable::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{left:1px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{left:1px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-minimal-selected-checkmark-color, var(--mat-sys-primary))}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full{border-color:var(--mat-pseudo-checkbox-full-unselected-icon-color, var(--mat-sys-on-surface-variant));border-width:2px;border-style:solid}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-disabled{border-color:var(--mat-pseudo-checkbox-full-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate{background-color:var(--mat-pseudo-checkbox-full-selected-icon-color, var(--mat-sys-primary));border-color:rgba(0,0,0,0)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-full-selected-checkmark-color, var(--mat-sys-on-primary))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background-color:var(--mat-pseudo-checkbox-full-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-full-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mat-pseudo-checkbox{width:18px;height:18px}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after{width:14px;height:6px;transform-origin:center;top:-4.2426406871px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{top:8px;width:16px}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after{width:10px;height:4px;transform-origin:center;top:-2.8284271247px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{top:6px;width:12px} -`],encapsulation:2,changeDetection:0})}return t})();var ulA=["button"],flA=["*"];function plA(t,e){if(t&1&&(B(0,"div",2),hA(1,"mat-pseudo-checkbox",6),Q()),t&2){let A=p();u(),H("disabled",A.disabled)}}var IT=new kA("MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS",{providedIn:"root",factory:()=>({hideSingleSelectionIndicator:!1,hideMultipleSelectionIndicator:!1,disabledInteractive:!1})}),dT=new kA("MatButtonToggleGroup"),mlA={provide:as,useExisting:Ja(()=>lM),multi:!0},Km=class{source;value;constructor(e,A){this.source=e,this.value=A}},lM=(()=>{class t{_changeDetector=w(wt);_dir=w(fo,{optional:!0});_multiple=!1;_disabled=!1;_disabledInteractive=!1;_selectionModel;_rawValue;_controlValueAccessorChangeFn=()=>{};_onTouched=()=>{};_buttonToggles;appearance;get name(){return this._name}set name(A){this._name=A,this._markButtonsForCheck()}_name=w(In).getId("mat-button-toggle-group-");vertical=!1;get value(){let A=this._selectionModel?this._selectionModel.selected:[];return this.multiple?A.map(i=>i.value):A[0]?A[0].value:void 0}set value(A){this._setSelectionByValue(A),this.valueChange.emit(this.value)}valueChange=new LA;get selected(){let A=this._selectionModel?this._selectionModel.selected:[];return this.multiple?A:A[0]||null}get multiple(){return this._multiple}set multiple(A){this._multiple=A,this._markButtonsForCheck()}get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._markButtonsForCheck()}get disabledInteractive(){return this._disabledInteractive}set disabledInteractive(A){this._disabledInteractive=A,this._markButtonsForCheck()}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}change=new LA;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._markButtonsForCheck()}_hideSingleSelectionIndicator;get hideMultipleSelectionIndicator(){return this._hideMultipleSelectionIndicator}set hideMultipleSelectionIndicator(A){this._hideMultipleSelectionIndicator=A,this._markButtonsForCheck()}_hideMultipleSelectionIndicator;constructor(){let A=w(IT,{optional:!0});this.appearance=A&&A.appearance?A.appearance:"standard",this._hideSingleSelectionIndicator=A?.hideSingleSelectionIndicator??!1,this._hideMultipleSelectionIndicator=A?.hideMultipleSelectionIndicator??!1}ngOnInit(){this._selectionModel=new V0(this.multiple,void 0,!1)}ngAfterContentInit(){this._selectionModel.select(...this._buttonToggles.filter(A=>A.checked)),this.multiple||this._initializeTabIndex()}writeValue(A){this.value=A,this._changeDetector.markForCheck()}registerOnChange(A){this._controlValueAccessorChangeFn=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}_keydown(A){if(this.multiple||this.disabled||Qa(A))return;let n=A.target.id,o=this._buttonToggles.toArray().findIndex(r=>r.buttonId===n),a=null;switch(A.keyCode){case 32:case 13:a=this._buttonToggles.get(o)||null;break;case 38:a=this._getNextButton(o,-1);break;case 37:a=this._getNextButton(o,this.dir==="ltr"?-1:1);break;case 40:a=this._getNextButton(o,1);break;case 39:a=this._getNextButton(o,this.dir==="ltr"?1:-1);break;default:return}a&&(A.preventDefault(),a._onButtonClick(),a.focus())}_emitChangeEvent(A){let i=new Km(A,this.value);this._rawValue=i.value,this._controlValueAccessorChangeFn(i.value),this.change.emit(i)}_syncButtonToggle(A,i,n=!1,o=!1){!this.multiple&&this.selected&&!A.checked&&(this.selected.checked=!1),this._selectionModel?i?this._selectionModel.select(A):this._selectionModel.deselect(A):o=!0,o?Promise.resolve().then(()=>this._updateModelValue(A,n)):this._updateModelValue(A,n)}_isSelected(A){return this._selectionModel&&this._selectionModel.isSelected(A)}_isPrechecked(A){return typeof this._rawValue>"u"?!1:this.multiple&&Array.isArray(this._rawValue)?this._rawValue.some(i=>A.value!=null&&i===A.value):A.value===this._rawValue}_initializeTabIndex(){if(this._buttonToggles.forEach(A=>{A.tabIndex=-1}),this.selected)this.selected.tabIndex=0;else for(let A=0;Athis._selectValue(n,i))):(this._clearSelection(),this._selectValue(A,i)),!this.multiple&&i.every(n=>n.tabIndex===-1)){for(let n of i)if(!n.disabled){n.tabIndex=0;break}}}_clearSelection(){this._selectionModel.clear(),this._buttonToggles.forEach(A=>{A.checked=!1,this.multiple||(A.tabIndex=-1)})}_selectValue(A,i){for(let n of i)if(n.value===A){n.checked=!0,this._selectionModel.select(n),this.multiple||(n.tabIndex=0);break}}_updateModelValue(A,i){i&&this._emitChangeEvent(A),this.valueChange.emit(this.value)}_markButtonsForCheck(){this._buttonToggles?.forEach(A=>A._markForCheck())}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["mat-button-toggle-group"]],contentQueries:function(i,n,o){if(i&1&&jo(o,Um,5),i&2){let a;ae(a=re())&&(n._buttonToggles=a)}},hostAttrs:[1,"mat-button-toggle-group"],hostVars:6,hostBindings:function(i,n){i&1&&U("keydown",function(a){return n._keydown(a)}),i&2&&(te("role",n.multiple?"group":"radiogroup")("aria-disabled",n.disabled),RA("mat-button-toggle-vertical",n.vertical)("mat-button-toggle-group-appearance-standard",n.appearance==="standard"))},inputs:{appearance:"appearance",name:"name",vertical:[2,"vertical","vertical",Be],value:"value",multiple:[2,"multiple","multiple",Be],disabled:[2,"disabled","disabled",Be],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Be],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",Be],hideMultipleSelectionIndicator:[2,"hideMultipleSelectionIndicator","hideMultipleSelectionIndicator",Be]},outputs:{valueChange:"valueChange",change:"change"},exportAs:["matButtonToggleGroup"],features:[Bt([mlA,{provide:dT,useExisting:t}])]})}return t})(),Um=(()=>{class t{_changeDetectorRef=w(wt);_elementRef=w(ce);_focusMonitor=w($a);_idGenerator=w(In);_animationDisabled=An();_checked=!1;ariaLabel;ariaLabelledby=null;_buttonElement;buttonToggleGroup;get buttonId(){return`${this.id}-button`}id;name;value;get tabIndex(){return this._tabIndex()}set tabIndex(A){this._tabIndex.set(A)}_tabIndex;disableRipple=!1;get appearance(){return this.buttonToggleGroup?this.buttonToggleGroup.appearance:this._appearance}set appearance(A){this._appearance=A}_appearance;get checked(){return this.buttonToggleGroup?this.buttonToggleGroup._isSelected(this):this._checked}set checked(A){A!==this._checked&&(this._checked=A,this.buttonToggleGroup&&this.buttonToggleGroup._syncButtonToggle(this,this._checked),this._changeDetectorRef.markForCheck())}get disabled(){return this._disabled||this.buttonToggleGroup&&this.buttonToggleGroup.disabled}set disabled(A){this._disabled=A}_disabled=!1;get disabledInteractive(){return this._disabledInteractive||this.buttonToggleGroup!==null&&this.buttonToggleGroup.disabledInteractive}set disabledInteractive(A){this._disabledInteractive=A}_disabledInteractive;change=new LA;constructor(){w(eo).load(lr);let A=w(dT,{optional:!0}),i=w(new Us("tabindex"),{optional:!0})||"",n=w(IT,{optional:!0});this._tabIndex=bA(parseInt(i)||0),this.buttonToggleGroup=A,this._appearance=n&&n.appearance?n.appearance:"standard",this._disabledInteractive=n?.disabledInteractive??!1}ngOnInit(){let A=this.buttonToggleGroup;this.id=this.id||this._idGenerator.getId("mat-button-toggle-"),A&&(A._isPrechecked(this)?this.checked=!0:A._isSelected(this)!==this._checked&&A._syncButtonToggle(this,this._checked))}ngAfterViewInit(){this._animationDisabled||this._elementRef.nativeElement.classList.add("mat-button-toggle-animations-enabled"),this._focusMonitor.monitor(this._elementRef,!0)}ngOnDestroy(){let A=this.buttonToggleGroup;this._focusMonitor.stopMonitoring(this._elementRef),A&&A._isSelected(this)&&A._syncButtonToggle(this,!1,!1,!0)}focus(A){this._buttonElement.nativeElement.focus(A)}_onButtonClick(){if(this.disabled)return;let A=this.isSingleSelector()?!0:!this._checked;if(A!==this._checked&&(this._checked=A,this.buttonToggleGroup&&(this.buttonToggleGroup._syncButtonToggle(this,this._checked,!0),this.buttonToggleGroup._onTouched())),this.isSingleSelector()){let i=this.buttonToggleGroup._buttonToggles.find(n=>n.tabIndex===0);i&&(i.tabIndex=-1),this.tabIndex=0}this.change.emit(new Km(this,this.value))}_markForCheck(){this._changeDetectorRef.markForCheck()}_getButtonName(){return this.isSingleSelector()?this.buttonToggleGroup.name:this.name||null}isSingleSelector(){return this.buttonToggleGroup&&!this.buttonToggleGroup.multiple}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-button-toggle"]],viewQuery:function(i,n){if(i&1&&Jt(ulA,5),i&2){let o;ae(o=re())&&(n._buttonElement=o.first)}},hostAttrs:["role","presentation",1,"mat-button-toggle"],hostVars:14,hostBindings:function(i,n){i&1&&U("focus",function(){return n.focus()}),i&2&&(te("aria-label",null)("aria-labelledby",null)("id",n.id)("name",null),RA("mat-button-toggle-standalone",!n.buttonToggleGroup)("mat-button-toggle-checked",n.checked)("mat-button-toggle-disabled",n.disabled)("mat-button-toggle-disabled-interactive",n.disabledInteractive)("mat-button-toggle-appearance-standard",n.appearance==="standard"))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],id:"id",name:"name",value:"value",tabIndex:"tabIndex",disableRipple:[2,"disableRipple","disableRipple",Be],appearance:"appearance",checked:[2,"checked","checked",Be],disabled:[2,"disabled","disabled",Be],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Be]},outputs:{change:"change"},exportAs:["matButtonToggle"],ngContentSelectors:flA,decls:7,vars:13,consts:[["button",""],["type","button",1,"mat-button-toggle-button","mat-focus-indicator",3,"click","id","disabled"],[1,"mat-button-toggle-checkbox-wrapper"],[1,"mat-button-toggle-label-content"],[1,"mat-button-toggle-focus-overlay"],["matRipple","",1,"mat-button-toggle-ripple",3,"matRippleTrigger","matRippleDisabled"],["state","checked","aria-hidden","true","appearance","minimal",3,"disabled"]],template:function(i,n){if(i&1&&(Rt(),B(0,"button",1,0),U("click",function(){return n._onButtonClick()}),O(2,plA,2,1,"div",2),B(3,"span",3),Ve(4),Q()(),hA(5,"span",4)(6,"span",5)),i&2){let o=Qi(1);H("id",n.buttonId)("disabled",n.disabled&&!n.disabledInteractive||null),te("role",n.isSingleSelector()?"radio":"button")("tabindex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("aria-pressed",n.isSingleSelector()?null:n.checked)("aria-checked",n.isSingleSelector()?n.checked:null)("name",n._getButtonName())("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),u(2),Y(n.buttonToggleGroup&&(!n.buttonToggleGroup.multiple&&!n.buttonToggleGroup.hideSingleSelectionIndicator||n.buttonToggleGroup.multiple&&!n.buttonToggleGroup.hideMultipleSelectionIndicator)?2:-1),u(4),H("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)}},dependencies:[rs,Gm],styles:[`.mat-button-toggle-standalone,.mat-button-toggle-group{position:relative;display:inline-flex;flex-direction:row;white-space:nowrap;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0);border-radius:var(--mat-button-toggle-legacy-shape);transform:translateZ(0)}.mat-button-toggle-standalone:not([class*=mat-elevation-z]),.mat-button-toggle-group:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)}@media(forced-colors: active){.mat-button-toggle-standalone,.mat-button-toggle-group{outline:solid 1px}}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard .mat-pseudo-checkbox,.mat-button-toggle-group-appearance-standard .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard:not([class*=mat-elevation-z]),.mat-button-toggle-group-appearance-standard:not([class*=mat-elevation-z]){box-shadow:none}@media(forced-colors: active){.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{outline:0}}.mat-button-toggle-vertical{flex-direction:column}.mat-button-toggle-vertical .mat-button-toggle-label-content{display:block}.mat-button-toggle{white-space:nowrap;position:relative;color:var(--mat-button-toggle-legacy-text-color);font-family:var(--mat-button-toggle-legacy-label-text-font);font-size:var(--mat-button-toggle-legacy-label-text-size);line-height:var(--mat-button-toggle-legacy-label-text-line-height);font-weight:var(--mat-button-toggle-legacy-label-text-weight);letter-spacing:var(--mat-button-toggle-legacy-label-text-tracking);--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-button-toggle-legacy-selected-state-text-color)}.mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-button-toggle-legacy-focus-state-layer-opacity)}.mat-button-toggle .mat-icon svg{vertical-align:top}.mat-button-toggle-checkbox-wrapper{display:inline-block;justify-content:flex-start;align-items:center;width:0;height:18px;line-height:18px;overflow:hidden;box-sizing:border-box;position:absolute;top:50%;left:16px;transform:translate3d(0, -50%, 0)}[dir=rtl] .mat-button-toggle-checkbox-wrapper{left:auto;right:16px}.mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:12px}[dir=rtl] .mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:auto;right:12px}.mat-button-toggle-checked .mat-button-toggle-checkbox-wrapper{width:18px}.mat-button-toggle-animations-enabled .mat-button-toggle-checkbox-wrapper{transition:width 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-checkbox-wrapper{transition:none}.mat-button-toggle-checked{color:var(--mat-button-toggle-legacy-selected-state-text-color);background-color:var(--mat-button-toggle-legacy-selected-state-background-color)}.mat-button-toggle-disabled{pointer-events:none;color:var(--mat-button-toggle-legacy-disabled-state-text-color);background-color:var(--mat-button-toggle-legacy-disabled-state-background-color);--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color: var(--mat-button-toggle-legacy-disabled-state-text-color)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:var(--mat-button-toggle-legacy-disabled-selected-state-background-color)}.mat-button-toggle-disabled-interactive{pointer-events:auto}.mat-button-toggle-appearance-standard{color:var(--mat-button-toggle-text-color, var(--mat-sys-on-surface));background-color:var(--mat-button-toggle-background-color, transparent);font-family:var(--mat-button-toggle-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-toggle-label-text-size, var(--mat-sys-label-large-size));line-height:var(--mat-button-toggle-label-text-line-height, var(--mat-sys-label-large-line-height));font-weight:var(--mat-button-toggle-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-button-toggle-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:none;border-top:solid 1px var(--mat-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:var(--mat-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-button-toggle-selected-state-background-color, var(--mat-sys-secondary-container))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled{color:var(--mat-button-toggle-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-toggle-disabled-state-background-color, transparent)}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color: var(--mat-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled.mat-button-toggle-checked{color:var(--mat-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-toggle-disabled-selected-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:var(--mat-button-toggle-state-layer-color, var(--mat-sys-on-surface))}.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{opacity:var(--mat-button-toggle-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-button-toggle-appearance-standard.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-button-toggle-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}@media(hover: none){.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{display:none}}.mat-button-toggle-label-content{-webkit-user-select:none;user-select:none;display:inline-block;padding:0 16px;line-height:var(--mat-button-toggle-legacy-height);position:relative}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{padding:0 12px;line-height:var(--mat-button-toggle-height, 40px)}.mat-button-toggle-label-content>*{vertical-align:middle}.mat-button-toggle-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit;pointer-events:none;opacity:0;background-color:var(--mat-button-toggle-legacy-state-layer-color)}@media(forced-colors: active){.mat-button-toggle-checked .mat-button-toggle-focus-overlay{border-bottom:solid 500px;opacity:.5;height:0}.mat-button-toggle-checked:hover .mat-button-toggle-focus-overlay{opacity:.6}.mat-button-toggle-checked.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{border-bottom:solid 500px}}.mat-button-toggle .mat-button-toggle-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-toggle-button{border:0;background:none;color:inherit;padding:0;margin:0;font:inherit;outline:none;width:100%;cursor:pointer}.mat-button-toggle-animations-enabled .mat-button-toggle-button{transition:padding 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-button{transition:none}.mat-button-toggle-disabled .mat-button-toggle-button{cursor:default}.mat-button-toggle-button::-moz-focus-inner{border:0}.mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:30px}[dir=rtl] .mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:0;padding-right:30px}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{--mat-focus-indicator-border-radius: var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-bottom-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-bottom-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-bottom-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-bottom-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large));border-top-left-radius:var(--mat-button-toggle-shape, var(--mat-sys-corner-extra-large))} -`],encapsulation:2,changeDetection:0})}return t})(),BT=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Yc,Um,fi]})}return t})();var wlA=20,Wc=(()=>{class t{_ngZone=w(qe);_platform=w(gi);_renderer=w(Kr).createRenderer(null,null);_cleanupGlobalListener;constructor(){}_scrolled=new ie;_scrolledCount=0;scrollContainers=new Map;register(A){this.scrollContainers.has(A)||this.scrollContainers.set(A,A.elementScrolled().subscribe(()=>this._scrolled.next(A)))}deregister(A){let i=this.scrollContainers.get(A);i&&(i.unsubscribe(),this.scrollContainers.delete(A))}scrolled(A=wlA){return this._platform.isBrowser?new vi(i=>{this._cleanupGlobalListener||(this._cleanupGlobalListener=this._ngZone.runOutsideAngular(()=>this._renderer.listen("document","scroll",()=>this._scrolled.next())));let n=A>0?this._scrolled.pipe(jI(A)).subscribe(i):this._scrolled.subscribe(i);return this._scrolledCount++,()=>{n.unsubscribe(),this._scrolledCount--,this._scrolledCount||(this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0)}}):ne()}ngOnDestroy(){this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0,this.scrollContainers.forEach((A,i)=>this.deregister(i)),this._scrolled.complete()}ancestorScrolled(A,i){let n=this.getAncestorScrollContainers(A);return this.scrolled(i).pipe(gt(o=>!o||n.indexOf(o)>-1))}getAncestorScrollContainers(A){let i=[];return this.scrollContainers.forEach((n,o)=>{this._scrollableContainsElement(o,A)&&i.push(o)}),i}_scrollableContainsElement(A,i){let n=Ds(i),o=A.getElementRef().nativeElement;do if(n==o)return!0;while(n=n.parentElement);return!1}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),W0=(()=>{class t{elementRef=w(ce);scrollDispatcher=w(Wc);ngZone=w(qe);dir=w(fo,{optional:!0});_scrollElement=this.elementRef.nativeElement;_destroyed=new ie;_renderer=w(Pi);_cleanupScroll;_elementScrolled=new ie;constructor(){}ngOnInit(){this._cleanupScroll=this.ngZone.runOutsideAngular(()=>this._renderer.listen(this._scrollElement,"scroll",A=>this._elementScrolled.next(A))),this.scrollDispatcher.register(this)}ngOnDestroy(){this._cleanupScroll?.(),this._elementScrolled.complete(),this.scrollDispatcher.deregister(this),this._destroyed.next(),this._destroyed.complete()}elementScrolled(){return this._elementScrolled}getElementRef(){return this.elementRef}scrollTo(A){let i=this.elementRef.nativeElement,n=this.dir&&this.dir.value=="rtl";A.left==null&&(A.left=n?A.end:A.start),A.right==null&&(A.right=n?A.start:A.end),A.bottom!=null&&(A.top=i.scrollHeight-i.clientHeight-A.bottom),n&&rB()!=Rg.NORMAL?(A.left!=null&&(A.right=i.scrollWidth-i.clientWidth-A.left),rB()==Rg.INVERTED?A.left=A.right:rB()==Rg.NEGATED&&(A.left=A.right?-A.right:A.right)):A.right!=null&&(A.left=i.scrollWidth-i.clientWidth-A.right),this._applyScrollToOptions(A)}_applyScrollToOptions(A){let i=this.elementRef.nativeElement;bp()?i.scrollTo(A):(A.top!=null&&(i.scrollTop=A.top),A.left!=null&&(i.scrollLeft=A.left))}measureScrollOffset(A){let i="left",n="right",o=this.elementRef.nativeElement;if(A=="top")return o.scrollTop;if(A=="bottom")return o.scrollHeight-o.clientHeight-o.scrollTop;let a=this.dir&&this.dir.value=="rtl";return A=="start"?A=a?n:i:A=="end"&&(A=a?i:n),a&&rB()==Rg.INVERTED?A==i?o.scrollWidth-o.clientWidth-o.scrollLeft:o.scrollLeft:a&&rB()==Rg.NEGATED?A==i?o.scrollLeft+o.scrollWidth-o.clientWidth:-o.scrollLeft:A==i?o.scrollLeft:o.scrollWidth-o.clientWidth-o.scrollLeft}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdk-scrollable",""],["","cdkScrollable",""]]})}return t})(),DlA=20,Ms=(()=>{class t{_platform=w(gi);_listeners;_viewportSize=null;_change=new ie;_document=w(ti);constructor(){let A=w(qe),i=w(Kr).createRenderer(null,null);A.runOutsideAngular(()=>{if(this._platform.isBrowser){let n=o=>this._change.next(o);this._listeners=[i.listen("window","resize",n),i.listen("window","orientationchange",n)]}this.change().subscribe(()=>this._viewportSize=null)})}ngOnDestroy(){this._listeners?.forEach(A=>A()),this._change.complete()}getViewportSize(){this._viewportSize||this._updateViewportSize();let A={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),A}getViewportRect(){let A=this.getViewportScrollPosition(),{width:i,height:n}=this.getViewportSize();return{top:A.top,left:A.left,bottom:A.top+n,right:A.left+i,height:n,width:i}}getViewportScrollPosition(){if(!this._platform.isBrowser)return{top:0,left:0};let A=this._document,i=this._getWindow(),n=A.documentElement,o=n.getBoundingClientRect(),a=-o.top||A.body?.scrollTop||i.scrollY||n.scrollTop||0,r=-o.left||A.body?.scrollLeft||i.scrollX||n.scrollLeft||0;return{top:a,left:r}}change(A=DlA){return A>0?this._change.pipe(jI(A)):this._change}_getWindow(){return this._document.defaultView||window}_updateViewportSize(){let A=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:A.innerWidth,height:A.innerHeight}:{width:0,height:0}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var ET=new kA("CDK_VIRTUAL_SCROLL_VIEWPORT");var Vc=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})(),Tm=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi,Vc,fi,Vc]})}return t})();var Nu=class{_attachedHost=null;attach(e){return this._attachedHost=e,e.attach(this)}detach(){let e=this._attachedHost;e!=null&&(this._attachedHost=null,e.detach())}get isAttached(){return this._attachedHost!=null}setAttachedHost(e){this._attachedHost=e}},Ss=class extends Nu{component;viewContainerRef;injector;projectableNodes;bindings;constructor(e,A,i,n,o){super(),this.component=e,this.viewContainerRef=A,this.injector=i,this.projectableNodes=n,this.bindings=o||null}},Jr=class extends Nu{templateRef;viewContainerRef;context;injector;constructor(e,A,i,n){super(),this.templateRef=e,this.viewContainerRef=A,this.context=i,this.injector=n}get origin(){return this.templateRef.elementRef}attach(e,A=this.context){return this.context=A,super.attach(e)}detach(){return this.context=void 0,super.detach()}},gM=class extends Nu{element;constructor(e){super(),this.element=e instanceof ce?e.nativeElement:e}},C2=class{_attachedPortal=null;_disposeFn=null;_isDisposed=!1;hasAttached(){return!!this._attachedPortal}attach(e){if(e instanceof Ss)return this._attachedPortal=e,this.attachComponentPortal(e);if(e instanceof Jr)return this._attachedPortal=e,this.attachTemplatePortal(e);if(this.attachDomPortal&&e instanceof gM)return this._attachedPortal=e,this.attachDomPortal(e)}attachDomPortal=null;detach(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()}dispose(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0}setDisposeFn(e){this._disposeFn=e}_invokeDisposeFn(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)}},Fu=class extends C2{outletElement;_appRef;_defaultInjector;constructor(e,A,i){super(),this.outletElement=e,this._appRef=A,this._defaultInjector=i}attachComponentPortal(e){let A;if(e.viewContainerRef){let i=e.injector||e.viewContainerRef.injector,n=i.get(Zv,null,{optional:!0})||void 0;A=e.viewContainerRef.createComponent(e.component,{index:e.viewContainerRef.length,injector:i,ngModuleRef:n,projectableNodes:e.projectableNodes||void 0,bindings:e.bindings||void 0}),this.setDisposeFn(()=>A.destroy())}else{let i=this._appRef,n=e.injector||this._defaultInjector||Dt.NULL,o=n.get(Gr,i.injector);A=tp(e.component,{elementInjector:n,environmentInjector:o,projectableNodes:e.projectableNodes||void 0,bindings:e.bindings||void 0}),i.attachView(A.hostView),this.setDisposeFn(()=>{i.viewCount>0&&i.detachView(A.hostView),A.destroy()})}return this.outletElement.appendChild(this._getComponentRootNode(A)),this._attachedPortal=e,A}attachTemplatePortal(e){let A=e.viewContainerRef,i=A.createEmbeddedView(e.templateRef,e.context,{injector:e.injector});return i.rootNodes.forEach(n=>this.outletElement.appendChild(n)),i.detectChanges(),this.setDisposeFn(()=>{let n=A.indexOf(i);n!==-1&&A.remove(n)}),this._attachedPortal=e,i}attachDomPortal=e=>{let A=e.element;A.parentNode;let i=this.outletElement.ownerDocument.createComment("dom-portal");A.parentNode.insertBefore(i,A),this.outletElement.appendChild(A),this._attachedPortal=e,super.setDisposeFn(()=>{i.parentNode&&i.parentNode.replaceChild(A,i)})};dispose(){super.dispose(),this.outletElement.remove()}_getComponentRootNode(e){return e.hostView.rootNodes[0]}},hT=(()=>{class t extends Jr{constructor(){let A=w(ao),i=w(Mo);super(A,i)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkPortal",""]],exportAs:["cdkPortal"],features:[mt]})}return t})(),Wl=(()=>{class t extends C2{_moduleRef=w(Zv,{optional:!0});_document=w(ti);_viewContainerRef=w(Mo);_isInitialized=!1;_attachedRef=null;constructor(){super()}get portal(){return this._attachedPortal}set portal(A){this.hasAttached()&&!A&&!this._isInitialized||(this.hasAttached()&&super.detach(),A&&super.attach(A),this._attachedPortal=A||null)}attached=new LA;get attachedRef(){return this._attachedRef}ngOnInit(){this._isInitialized=!0}ngOnDestroy(){super.dispose(),this._attachedRef=this._attachedPortal=null}attachComponentPortal(A){A.setAttachedHost(this);let i=A.viewContainerRef!=null?A.viewContainerRef:this._viewContainerRef,n=i.createComponent(A.component,{index:i.length,injector:A.injector||i.injector,projectableNodes:A.projectableNodes||void 0,ngModuleRef:this._moduleRef||void 0,bindings:A.bindings||void 0});return i!==this._viewContainerRef&&this._getRootNode().appendChild(n.hostView.rootNodes[0]),super.setDisposeFn(()=>n.destroy()),this._attachedPortal=A,this._attachedRef=n,this.attached.emit(n),n}attachTemplatePortal(A){A.setAttachedHost(this);let i=this._viewContainerRef.createEmbeddedView(A.templateRef,A.context,{injector:A.injector});return super.setDisposeFn(()=>this._viewContainerRef.clear()),this._attachedPortal=A,this._attachedRef=i,this.attached.emit(i),i}attachDomPortal=A=>{let i=A.element;i.parentNode;let n=this._document.createComment("dom-portal");A.setAttachedHost(this),i.parentNode.insertBefore(n,i),this._getRootNode().appendChild(i),this._attachedPortal=A,super.setDisposeFn(()=>{n.parentNode&&n.parentNode.replaceChild(i,n)})};_getRootNode(){let A=this._viewContainerRef.element.nativeElement;return A.nodeType===A.ELEMENT_NODE?A:A.parentNode}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkPortalOutlet",""]],inputs:{portal:[0,"cdkPortalOutlet","portal"]},outputs:{attached:"attached"},exportAs:["cdkPortalOutlet"],features:[mt]})}return t})(),Zc=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})();var QT=bp();function NB(t){return new Jm(t.get(Ms),t.get(ti))}var Jm=class{_viewportRuler;_previousHTMLStyles={top:"",left:""};_previousScrollPosition;_isEnabled=!1;_document;constructor(e,A){this._viewportRuler=e,this._document=A}attach(){}enable(){if(this._canBeEnabled()){let e=this._document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=e.style.left||"",this._previousHTMLStyles.top=e.style.top||"",e.style.left=Oa(-this._previousScrollPosition.left),e.style.top=Oa(-this._previousScrollPosition.top),e.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}}disable(){if(this._isEnabled){let e=this._document.documentElement,A=this._document.body,i=e.style,n=A.style,o=i.scrollBehavior||"",a=n.scrollBehavior||"";this._isEnabled=!1,i.left=this._previousHTMLStyles.left,i.top=this._previousHTMLStyles.top,e.classList.remove("cdk-global-scrollblock"),QT&&(i.scrollBehavior=n.scrollBehavior="auto"),window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),QT&&(i.scrollBehavior=o,n.scrollBehavior=a)}}_canBeEnabled(){if(this._document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;let A=this._document.documentElement,i=this._viewportRuler.getViewportSize();return A.scrollHeight>i.height||A.scrollWidth>i.width}};function yT(t,e){return new Om(t.get(Wc),t.get(qe),t.get(Ms),e)}var Om=class{_scrollDispatcher;_ngZone;_viewportRuler;_config;_scrollSubscription=null;_overlayRef;_initialScrollPosition;constructor(e,A,i,n){this._scrollDispatcher=e,this._ngZone=A,this._viewportRuler=i,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(this._scrollSubscription)return;let e=this._scrollDispatcher.scrolled(0).pipe(gt(A=>!A||!this._overlayRef.overlayElement.contains(A.getElementRef().nativeElement)));this._config&&this._config.threshold&&this._config.threshold>1?(this._initialScrollPosition=this._viewportRuler.getViewportScrollPosition().top,this._scrollSubscription=e.subscribe(()=>{let A=this._viewportRuler.getViewportScrollPosition().top;Math.abs(A-this._initialScrollPosition)>this._config.threshold?this._detach():this._overlayRef.updatePosition()})):this._scrollSubscription=e.subscribe(this._detach)}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}_detach=()=>{this.disable(),this._overlayRef.hasAttached()&&this._ngZone.run(()=>this._overlayRef.detach())}};var Lu=class{enable(){}disable(){}attach(){}};function cM(t,e){return e.some(A=>{let i=t.bottomA.bottom,o=t.rightA.right;return i||n||o||a})}function uT(t,e){return e.some(A=>{let i=t.topA.bottom,o=t.leftA.right;return i||n||o||a})}function Z0(t,e){return new Ym(t.get(Wc),t.get(Ms),t.get(qe),e)}var Ym=class{_scrollDispatcher;_viewportRuler;_ngZone;_config;_scrollSubscription=null;_overlayRef;constructor(e,A,i,n){this._scrollDispatcher=e,this._viewportRuler=A,this._ngZone=i,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(!this._scrollSubscription){let e=this._config?this._config.scrollThrottle:0;this._scrollSubscription=this._scrollDispatcher.scrolled(e).subscribe(()=>{if(this._overlayRef.updatePosition(),this._config&&this._config.autoClose){let A=this._overlayRef.overlayElement.getBoundingClientRect(),{width:i,height:n}=this._viewportRuler.getViewportSize();cM(A,[{width:i,height:n,bottom:n,right:i,top:0,left:0}])&&(this.disable(),this._ngZone.run(()=>this._overlayRef.detach()))}})}}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}},vT=(()=>{class t{_injector=w(Dt);constructor(){}noop=()=>new Lu;close=A=>yT(this._injector,A);block=()=>NB(this._injector);reposition=A=>Z0(this._injector,A);static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Jg=class{positionStrategy;scrollStrategy=new Lu;panelClass="";hasBackdrop=!1;backdropClass="cdk-overlay-dark-backdrop";disableAnimations;width;height;minWidth;minHeight;maxWidth;maxHeight;direction;disposeOnNavigation=!1;usePopover;eventPredicate;constructor(e){if(e){let A=Object.keys(e);for(let i of A)e[i]!==void 0&&(this[i]=e[i])}}};var Hm=class{connectionPair;scrollableViewProperties;constructor(e,A){this.connectionPair=e,this.scrollableViewProperties=A}};var bT=(()=>{class t{_attachedOverlays=[];_document=w(ti);_isAttached=!1;constructor(){}ngOnDestroy(){this.detach()}add(A){this.remove(A),this._attachedOverlays.push(A)}remove(A){let i=this._attachedOverlays.indexOf(A);i>-1&&this._attachedOverlays.splice(i,1),this._attachedOverlays.length===0&&this.detach()}canReceiveEvent(A,i,n){return n.observers.length<1?!1:A.eventPredicate?A.eventPredicate(i):!0}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),MT=(()=>{class t extends bT{_ngZone=w(qe);_renderer=w(Kr).createRenderer(null,null);_cleanupKeydown;add(A){super.add(A),this._isAttached||(this._ngZone.runOutsideAngular(()=>{this._cleanupKeydown=this._renderer.listen("body","keydown",this._keydownListener)}),this._isAttached=!0)}detach(){this._isAttached&&(this._cleanupKeydown?.(),this._isAttached=!1)}_keydownListener=A=>{let i=this._attachedOverlays;for(let n=i.length-1;n>-1;n--){let o=i[n];if(this.canReceiveEvent(o,A,o._keydownEvents)){this._ngZone.run(()=>o._keydownEvents.next(A));break}}};static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),ST=(()=>{class t extends bT{_platform=w(gi);_ngZone=w(qe);_renderer=w(Kr).createRenderer(null,null);_cursorOriginalValue;_cursorStyleIsSet=!1;_pointerDownEventTarget=null;_cleanups;add(A){if(super.add(A),!this._isAttached){let i=this._document.body,n={capture:!0},o=this._renderer;this._cleanups=this._ngZone.runOutsideAngular(()=>[o.listen(i,"pointerdown",this._pointerDownListener,n),o.listen(i,"click",this._clickListener,n),o.listen(i,"auxclick",this._clickListener,n),o.listen(i,"contextmenu",this._clickListener,n)]),this._platform.IOS&&!this._cursorStyleIsSet&&(this._cursorOriginalValue=i.style.cursor,i.style.cursor="pointer",this._cursorStyleIsSet=!0),this._isAttached=!0}}detach(){this._isAttached&&(this._cleanups?.forEach(A=>A()),this._cleanups=void 0,this._platform.IOS&&this._cursorStyleIsSet&&(this._document.body.style.cursor=this._cursorOriginalValue,this._cursorStyleIsSet=!1),this._isAttached=!1)}_pointerDownListener=A=>{this._pointerDownEventTarget=Ur(A)};_clickListener=A=>{let i=Ur(A),n=A.type==="click"&&this._pointerDownEventTarget?this._pointerDownEventTarget:i;this._pointerDownEventTarget=null;let o=this._attachedOverlays.slice();for(let a=o.length-1;a>-1;a--){let r=o[a],s=r._outsidePointerEvents;if(!(!r.hasAttached()||!this.canReceiveEvent(r,A,s))){if(fT(r.overlayElement,i)||fT(r.overlayElement,n))break;this._ngZone?this._ngZone.run(()=>s.next(A)):s.next(A)}}};static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function fT(t,e){let A=typeof ShadowRoot<"u"&&ShadowRoot,i=e;for(;i;){if(i===t)return!0;i=A&&i instanceof ShadowRoot?i.host:i.parentNode}return!1}var kT=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["ng-component"]],hostAttrs:["cdk-overlay-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[`.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed}@layer cdk-overlay{.cdk-overlay-container{z-index:1000}}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute}@layer cdk-overlay{.cdk-global-overlay-wrapper{z-index:1000}}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;display:flex;max-width:100%;max-height:100%}@layer cdk-overlay{.cdk-overlay-pane{z-index:1000}}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);opacity:0;touch-action:manipulation}@layer cdk-overlay{.cdk-overlay-backdrop{z-index:1000;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}}@media(prefers-reduced-motion){.cdk-overlay-backdrop{transition-duration:1ms}}.cdk-overlay-backdrop-showing{opacity:1}@media(forced-colors: active){.cdk-overlay-backdrop-showing{opacity:.6}}@layer cdk-overlay{.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing,.cdk-high-contrast-active .cdk-overlay-transparent-backdrop{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;display:flex;flex-direction:column;min-width:1px;min-height:1px}@layer cdk-overlay{.cdk-overlay-connected-position-bounding-box{z-index:1000}}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.cdk-overlay-popover{background:none;border:none;padding:0;outline:0;overflow:visible;position:fixed;pointer-events:none;white-space:normal;color:inherit;text-decoration:none;width:100%;height:100%;inset:auto;top:0;left:0}.cdk-overlay-popover::backdrop{display:none}.cdk-overlay-popover .cdk-overlay-backdrop{position:fixed;z-index:auto} -`],encapsulation:2,changeDetection:0})}return t})(),jm=(()=>{class t{_platform=w(gi);_containerElement;_document=w(ti);_styleLoader=w(eo);constructor(){}ngOnDestroy(){this._containerElement?.remove()}getContainerElement(){return this._loadStyles(),this._containerElement||this._createContainer(),this._containerElement}_createContainer(){let A="cdk-overlay-container";if(this._platform.isBrowser||kb()){let n=this._document.querySelectorAll(`.${A}[platform="server"], .${A}[platform="test"]`);for(let o=0;o{let e=this.element;clearTimeout(this._fallbackTimeout),this._cleanupTransitionEnd?.(),this._cleanupTransitionEnd=this._renderer.listen(e,"transitionend",this.dispose),this._fallbackTimeout=setTimeout(this.dispose,500),e.style.pointerEvents="none",e.classList.remove("cdk-overlay-backdrop-showing")})}dispose=()=>{clearTimeout(this._fallbackTimeout),this._cleanupClick?.(),this._cleanupTransitionEnd?.(),this._cleanupClick=this._cleanupTransitionEnd=this._fallbackTimeout=void 0,this.element.remove()}};function IM(t){return t&&t.nodeType===1}var _B=class{_portalOutlet;_host;_pane;_config;_ngZone;_keyboardDispatcher;_document;_location;_outsideClickDispatcher;_animationsDisabled;_injector;_renderer;_backdropClick=new ie;_attachments=new ie;_detachments=new ie;_positionStrategy;_scrollStrategy;_locationChanges=bo.EMPTY;_backdropRef=null;_detachContentMutationObserver;_detachContentAfterRenderRef;_disposed=!1;_previousHostParent;_keydownEvents=new ie;_outsidePointerEvents=new ie;_afterNextRenderRef;constructor(e,A,i,n,o,a,r,s,l,g=!1,C,I){this._portalOutlet=e,this._host=A,this._pane=i,this._config=n,this._ngZone=o,this._keyboardDispatcher=a,this._document=r,this._location=s,this._outsideClickDispatcher=l,this._animationsDisabled=g,this._injector=C,this._renderer=I,n.scrollStrategy&&(this._scrollStrategy=n.scrollStrategy,this._scrollStrategy.attach(this)),this._positionStrategy=n.positionStrategy}get overlayElement(){return this._pane}get backdropElement(){return this._backdropRef?.element||null}get hostElement(){return this._host}get eventPredicate(){return this._config?.eventPredicate||null}attach(e){if(this._disposed)return null;this._attachHost();let A=this._portalOutlet.attach(e);return this._positionStrategy?.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._scrollStrategy&&this._scrollStrategy.enable(),this._afterNextRenderRef?.destroy(),this._afterNextRenderRef=Hn(()=>{this.hasAttached()&&this.updatePosition()},{injector:this._injector}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!0),this._attachments.next(),this._completeDetachContent(),this._keyboardDispatcher.add(this),this._config.disposeOnNavigation&&(this._locationChanges=this._location.subscribe(()=>this.dispose())),this._outsideClickDispatcher.add(this),typeof A?.onDestroy=="function"&&A.onDestroy(()=>{this.hasAttached()&&this._ngZone.runOutsideAngular(()=>Promise.resolve().then(()=>this.detach()))}),A}detach(){if(!this.hasAttached())return;this.detachBackdrop(),this._togglePointerEvents(!1),this._positionStrategy&&this._positionStrategy.detach&&this._positionStrategy.detach(),this._scrollStrategy&&this._scrollStrategy.disable();let e=this._portalOutlet.detach();return this._detachments.next(),this._completeDetachContent(),this._keyboardDispatcher.remove(this),this._detachContentWhenEmpty(),this._locationChanges.unsubscribe(),this._outsideClickDispatcher.remove(this),e}dispose(){if(this._disposed)return;let e=this.hasAttached();this._positionStrategy&&this._positionStrategy.dispose(),this._disposeScrollStrategy(),this._backdropRef?.dispose(),this._locationChanges.unsubscribe(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),this._outsidePointerEvents.complete(),this._outsideClickDispatcher.remove(this),this._host?.remove(),this._afterNextRenderRef?.destroy(),this._previousHostParent=this._pane=this._host=this._backdropRef=null,e&&this._detachments.next(),this._detachments.complete(),this._completeDetachContent(),this._disposed=!0}hasAttached(){return this._portalOutlet.hasAttached()}backdropClick(){return this._backdropClick}attachments(){return this._attachments}detachments(){return this._detachments}keydownEvents(){return this._keydownEvents}outsidePointerEvents(){return this._outsidePointerEvents}getConfig(){return this._config}updatePosition(){this._positionStrategy&&this._positionStrategy.apply()}updatePositionStrategy(e){e!==this._positionStrategy&&(this._positionStrategy&&this._positionStrategy.dispose(),this._positionStrategy=e,this.hasAttached()&&(e.attach(this),this.updatePosition()))}updateSize(e){this._config=gA(gA({},this._config),e),this._updateElementSize()}setDirection(e){this._config=Ye(gA({},this._config),{direction:e}),this._updateElementDirection()}addPanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!0)}removePanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!1)}getDirection(){let e=this._config.direction;return e?typeof e=="string"?e:e.value:"ltr"}updateScrollStrategy(e){e!==this._scrollStrategy&&(this._disposeScrollStrategy(),this._scrollStrategy=e,this.hasAttached()&&(e.attach(this),e.enable()))}_updateElementDirection(){this._host.setAttribute("dir",this.getDirection())}_updateElementSize(){if(!this._pane)return;let e=this._pane.style;e.width=Oa(this._config.width),e.height=Oa(this._config.height),e.minWidth=Oa(this._config.minWidth),e.minHeight=Oa(this._config.minHeight),e.maxWidth=Oa(this._config.maxWidth),e.maxHeight=Oa(this._config.maxHeight)}_togglePointerEvents(e){this._pane.style.pointerEvents=e?"":"none"}_attachHost(){if(!this._host.parentElement){let e=this._config.usePopover?this._positionStrategy?.getPopoverInsertionPoint?.():null;IM(e)?e.after(this._host):e?.type==="parent"?e.element.appendChild(this._host):this._previousHostParent?.appendChild(this._host)}if(this._config.usePopover)try{this._host.showPopover()}catch(e){}}_attachBackdrop(){let e="cdk-overlay-backdrop-showing";this._backdropRef?.dispose(),this._backdropRef=new CM(this._document,this._renderer,this._ngZone,A=>{this._backdropClick.next(A)}),this._animationsDisabled&&this._backdropRef.element.classList.add("cdk-overlay-backdrop-noop-animation"),this._config.backdropClass&&this._toggleClasses(this._backdropRef.element,this._config.backdropClass,!0),this._config.usePopover?this._host.prepend(this._backdropRef.element):this._host.parentElement.insertBefore(this._backdropRef.element,this._host),!this._animationsDisabled&&typeof requestAnimationFrame<"u"?this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>this._backdropRef?.element.classList.add(e))}):this._backdropRef.element.classList.add(e)}_updateStackingOrder(){!this._config.usePopover&&this._host.nextSibling&&this._host.parentNode.appendChild(this._host)}detachBackdrop(){this._animationsDisabled?(this._backdropRef?.dispose(),this._backdropRef=null):this._backdropRef?.detach()}_toggleClasses(e,A,i){let n=iB(A||[]).filter(o=>!!o);n.length&&(i?e.classList.add(...n):e.classList.remove(...n))}_detachContentWhenEmpty(){let e=!1;try{this._detachContentAfterRenderRef=Hn(()=>{e=!0,this._detachContent()},{injector:this._injector})}catch(A){if(e)throw A;this._detachContent()}globalThis.MutationObserver&&this._pane&&(this._detachContentMutationObserver||=new globalThis.MutationObserver(()=>{this._detachContent()}),this._detachContentMutationObserver.observe(this._pane,{childList:!0}))}_detachContent(){(!this._pane||!this._host||this._pane.children.length===0)&&(this._pane&&this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!1),this._host&&this._host.parentElement&&(this._previousHostParent=this._host.parentElement,this._host.remove()),this._completeDetachContent())}_completeDetachContent(){this._detachContentAfterRenderRef?.destroy(),this._detachContentAfterRenderRef=void 0,this._detachContentMutationObserver?.disconnect()}_disposeScrollStrategy(){let e=this._scrollStrategy;e?.disable(),e?.detach?.()}},pT="cdk-overlay-connected-position-bounding-box",vlA=/([A-Za-z%]+)$/;function y1(t,e){return new zm(e,t.get(Ms),t.get(ti),t.get(gi),t.get(jm))}var zm=class{_viewportRuler;_document;_platform;_overlayContainer;_overlayRef;_isInitialRender=!1;_lastBoundingBoxSize={width:0,height:0};_isPushed=!1;_canPush=!0;_growAfterOpen=!1;_hasFlexibleDimensions=!0;_positionLocked=!1;_originRect;_overlayRect;_viewportRect;_containerRect;_viewportMargin=0;_scrollables=[];_preferredPositions=[];_origin;_pane;_isDisposed=!1;_boundingBox=null;_lastPosition=null;_lastScrollVisibility=null;_positionChanges=new ie;_resizeSubscription=bo.EMPTY;_offsetX=0;_offsetY=0;_transformOriginSelector;_appliedPanelClasses=[];_previousPushAmount=null;_popoverLocation="global";positionChanges=this._positionChanges;get positions(){return this._preferredPositions}constructor(e,A,i,n,o){this._viewportRuler=A,this._document=i,this._platform=n,this._overlayContainer=o,this.setOrigin(e)}attach(e){this._overlayRef&&this._overlayRef,this._validatePositions(),e.hostElement.classList.add(pT),this._overlayRef=e,this._boundingBox=e.hostElement,this._pane=e.overlayElement,this._isDisposed=!1,this._isInitialRender=!0,this._lastPosition=null,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(()=>{this._isInitialRender=!0,this.apply()})}apply(){if(this._isDisposed||!this._platform.isBrowser)return;if(!this._isInitialRender&&this._positionLocked&&this._lastPosition){this.reapplyLastPosition();return}this._clearPanelClasses(),this._resetOverlayElementStyles(),this._resetBoundingBoxStyles(),this._viewportRect=this._getNarrowedViewportRect(),this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._containerRect=this._getContainerRect();let e=this._originRect,A=this._overlayRect,i=this._viewportRect,n=this._containerRect,o=[],a;for(let r of this._preferredPositions){let s=this._getOriginPoint(e,n,r),l=this._getOverlayPoint(s,A,r),g=this._getOverlayFit(l,A,i,r);if(g.isCompletelyWithinViewport){this._isPushed=!1,this._applyPosition(r,s);return}if(this._canFitWithFlexibleDimensions(g,l,i)){o.push({position:r,origin:s,overlayRect:A,boundingBoxRect:this._calculateBoundingBoxRect(s,r)});continue}(!a||a.overlayFit.visibleAreas&&(s=g,r=l)}this._isPushed=!1,this._applyPosition(r.position,r.origin);return}if(this._canPush){this._isPushed=!0,this._applyPosition(a.position,a.originPoint);return}this._applyPosition(a.position,a.originPoint)}detach(){this._clearPanelClasses(),this._lastPosition=null,this._previousPushAmount=null,this._resizeSubscription.unsubscribe()}dispose(){this._isDisposed||(this._boundingBox&&D1(this._boundingBox.style,{top:"",left:"",right:"",bottom:"",height:"",width:"",alignItems:"",justifyContent:""}),this._pane&&this._resetOverlayElementStyles(),this._overlayRef&&this._overlayRef.hostElement.classList.remove(pT),this.detach(),this._positionChanges.complete(),this._overlayRef=this._boundingBox=null,this._isDisposed=!0)}reapplyLastPosition(){if(this._isDisposed||!this._platform.isBrowser)return;let e=this._lastPosition;e?(this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._viewportRect=this._getNarrowedViewportRect(),this._containerRect=this._getContainerRect(),this._applyPosition(e,this._getOriginPoint(this._originRect,this._containerRect,e))):this.apply()}withScrollableContainers(e){return this._scrollables=e,this}withPositions(e){return this._preferredPositions=e,e.indexOf(this._lastPosition)===-1&&(this._lastPosition=null),this._validatePositions(),this}withViewportMargin(e){return this._viewportMargin=e,this}withFlexibleDimensions(e=!0){return this._hasFlexibleDimensions=e,this}withGrowAfterOpen(e=!0){return this._growAfterOpen=e,this}withPush(e=!0){return this._canPush=e,this}withLockedPosition(e=!0){return this._positionLocked=e,this}setOrigin(e){return this._origin=e,this}withDefaultOffsetX(e){return this._offsetX=e,this}withDefaultOffsetY(e){return this._offsetY=e,this}withTransformOriginOn(e){return this._transformOriginSelector=e,this}withPopoverLocation(e){return this._popoverLocation=e,this}getPopoverInsertionPoint(){return this._popoverLocation==="global"?null:this._popoverLocation!=="inline"?this._popoverLocation:this._origin instanceof ce?this._origin.nativeElement:IM(this._origin)?this._origin:null}_getOriginPoint(e,A,i){let n;if(i.originX=="center")n=e.left+e.width/2;else{let a=this._isRtl()?e.right:e.left,r=this._isRtl()?e.left:e.right;n=i.originX=="start"?a:r}A.left<0&&(n-=A.left);let o;return i.originY=="center"?o=e.top+e.height/2:o=i.originY=="top"?e.top:e.bottom,A.top<0&&(o-=A.top),{x:n,y:o}}_getOverlayPoint(e,A,i){let n;i.overlayX=="center"?n=-A.width/2:i.overlayX==="start"?n=this._isRtl()?-A.width:0:n=this._isRtl()?0:-A.width;let o;return i.overlayY=="center"?o=-A.height/2:o=i.overlayY=="top"?0:-A.height,{x:e.x+n,y:e.y+o}}_getOverlayFit(e,A,i,n){let o=wT(A),{x:a,y:r}=e,s=this._getOffset(n,"x"),l=this._getOffset(n,"y");s&&(a+=s),l&&(r+=l);let g=0-a,C=a+o.width-i.width,I=0-r,d=r+o.height-i.height,h=this._subtractOverflows(o.width,g,C),E=this._subtractOverflows(o.height,I,d),f=h*E;return{visibleArea:f,isCompletelyWithinViewport:o.width*o.height===f,fitsInViewportVertically:E===o.height,fitsInViewportHorizontally:h==o.width}}_canFitWithFlexibleDimensions(e,A,i){if(this._hasFlexibleDimensions){let n=i.bottom-A.y,o=i.right-A.x,a=mT(this._overlayRef.getConfig().minHeight),r=mT(this._overlayRef.getConfig().minWidth),s=e.fitsInViewportVertically||a!=null&&a<=n,l=e.fitsInViewportHorizontally||r!=null&&r<=o;return s&&l}return!1}_pushOverlayOnScreen(e,A,i){if(this._previousPushAmount&&this._positionLocked)return{x:e.x+this._previousPushAmount.x,y:e.y+this._previousPushAmount.y};let n=wT(A),o=this._viewportRect,a=Math.max(e.x+n.width-o.width,0),r=Math.max(e.y+n.height-o.height,0),s=Math.max(o.top-i.top-e.y,0),l=Math.max(o.left-i.left-e.x,0),g=0,C=0;return n.width<=o.width?g=l||-a:g=e.xh&&!this._isInitialRender&&!this._growAfterOpen&&(a=e.y-h/2)}let s=A.overlayX==="start"&&!n||A.overlayX==="end"&&n,l=A.overlayX==="end"&&!n||A.overlayX==="start"&&n,g,C,I;if(l)I=i.width-e.x+this._getViewportMarginStart()+this._getViewportMarginEnd(),g=e.x-this._getViewportMarginStart();else if(s)C=e.x,g=i.right-e.x-this._getViewportMarginEnd();else{let d=Math.min(i.right-e.x+i.left,e.x),h=this._lastBoundingBoxSize.width;g=d*2,C=e.x-d,g>h&&!this._isInitialRender&&!this._growAfterOpen&&(C=e.x-h/2)}return{top:a,left:C,bottom:r,right:I,width:g,height:o}}_setBoundingBoxStyles(e,A){let i=this._calculateBoundingBoxRect(e,A);!this._isInitialRender&&!this._growAfterOpen&&(i.height=Math.min(i.height,this._lastBoundingBoxSize.height),i.width=Math.min(i.width,this._lastBoundingBoxSize.width));let n={};if(this._hasExactPosition())n.top=n.left="0",n.bottom=n.right="auto",n.maxHeight=n.maxWidth="",n.width=n.height="100%";else{let o=this._overlayRef.getConfig().maxHeight,a=this._overlayRef.getConfig().maxWidth;n.width=Oa(i.width),n.height=Oa(i.height),n.top=Oa(i.top)||"auto",n.bottom=Oa(i.bottom)||"auto",n.left=Oa(i.left)||"auto",n.right=Oa(i.right)||"auto",A.overlayX==="center"?n.alignItems="center":n.alignItems=A.overlayX==="end"?"flex-end":"flex-start",A.overlayY==="center"?n.justifyContent="center":n.justifyContent=A.overlayY==="bottom"?"flex-end":"flex-start",o&&(n.maxHeight=Oa(o)),a&&(n.maxWidth=Oa(a))}this._lastBoundingBoxSize=i,D1(this._boundingBox.style,n)}_resetBoundingBoxStyles(){D1(this._boundingBox.style,{top:"0",left:"0",right:"0",bottom:"0",height:"",width:"",alignItems:"",justifyContent:""})}_resetOverlayElementStyles(){D1(this._pane.style,{top:"",left:"",bottom:"",right:"",position:"",transform:""})}_setOverlayElementStyles(e,A){let i={},n=this._hasExactPosition(),o=this._hasFlexibleDimensions,a=this._overlayRef.getConfig();if(n){let g=this._viewportRuler.getViewportScrollPosition();D1(i,this._getExactOverlayY(A,e,g)),D1(i,this._getExactOverlayX(A,e,g))}else i.position="static";let r="",s=this._getOffset(A,"x"),l=this._getOffset(A,"y");s&&(r+=`translateX(${s}px) `),l&&(r+=`translateY(${l}px)`),i.transform=r.trim(),a.maxHeight&&(n?i.maxHeight=Oa(a.maxHeight):o&&(i.maxHeight="")),a.maxWidth&&(n?i.maxWidth=Oa(a.maxWidth):o&&(i.maxWidth="")),D1(this._pane.style,i)}_getExactOverlayY(e,A,i){let n={top:"",bottom:""},o=this._getOverlayPoint(A,this._overlayRect,e);if(this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,i)),e.overlayY==="bottom"){let a=this._document.documentElement.clientHeight;n.bottom=`${a-(o.y+this._overlayRect.height)}px`}else n.top=Oa(o.y);return n}_getExactOverlayX(e,A,i){let n={left:"",right:""},o=this._getOverlayPoint(A,this._overlayRect,e);this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,i));let a;if(this._isRtl()?a=e.overlayX==="end"?"left":"right":a=e.overlayX==="end"?"right":"left",a==="right"){let r=this._document.documentElement.clientWidth;n.right=`${r-(o.x+this._overlayRect.width)}px`}else n.left=Oa(o.x);return n}_getScrollVisibility(){let e=this._getOriginRect(),A=this._pane.getBoundingClientRect(),i=this._scrollables.map(n=>n.getElementRef().nativeElement.getBoundingClientRect());return{isOriginClipped:uT(e,i),isOriginOutsideView:cM(e,i),isOverlayClipped:uT(A,i),isOverlayOutsideView:cM(A,i)}}_subtractOverflows(e,...A){return A.reduce((i,n)=>i-Math.max(n,0),e)}_getNarrowedViewportRect(){let e=this._document.documentElement.clientWidth,A=this._document.documentElement.clientHeight,i=this._viewportRuler.getViewportScrollPosition();return{top:i.top+this._getViewportMarginTop(),left:i.left+this._getViewportMarginStart(),right:i.left+e-this._getViewportMarginEnd(),bottom:i.top+A-this._getViewportMarginBottom(),width:e-this._getViewportMarginStart()-this._getViewportMarginEnd(),height:A-this._getViewportMarginTop()-this._getViewportMarginBottom()}}_isRtl(){return this._overlayRef.getDirection()==="rtl"}_hasExactPosition(){return!this._hasFlexibleDimensions||this._isPushed}_getOffset(e,A){return A==="x"?e.offsetX==null?this._offsetX:e.offsetX:e.offsetY==null?this._offsetY:e.offsetY}_validatePositions(){}_addPanelClasses(e){this._pane&&iB(e).forEach(A=>{A!==""&&this._appliedPanelClasses.indexOf(A)===-1&&(this._appliedPanelClasses.push(A),this._pane.classList.add(A))})}_clearPanelClasses(){this._pane&&(this._appliedPanelClasses.forEach(e=>{this._pane.classList.remove(e)}),this._appliedPanelClasses=[])}_getViewportMarginStart(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.start??0}_getViewportMarginEnd(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.end??0}_getViewportMarginTop(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.top??0}_getViewportMarginBottom(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.bottom??0}_getOriginRect(){let e=this._origin;if(e instanceof ce)return e.nativeElement.getBoundingClientRect();if(e instanceof Element)return e.getBoundingClientRect();let A=e.width||0,i=e.height||0;return{top:e.y,bottom:e.y+i,left:e.x,right:e.x+A,height:i,width:A}}_getContainerRect(){let e=this._overlayRef.getConfig().usePopover&&this._popoverLocation!=="global",A=this._overlayContainer.getContainerElement();e&&(A.style.display="block");let i=A.getBoundingClientRect();return e&&(A.style.display=""),i}};function D1(t,e){for(let A in e)e.hasOwnProperty(A)&&(t[A]=e[A]);return t}function mT(t){if(typeof t!="number"&&t!=null){let[e,A]=t.split(vlA);return!A||A==="px"?parseFloat(e):null}return t||null}function wT(t){return{top:Math.floor(t.top),right:Math.floor(t.right),bottom:Math.floor(t.bottom),left:Math.floor(t.left),width:Math.floor(t.width),height:Math.floor(t.height)}}function blA(t,e){return t===e?!0:t.isOriginClipped===e.isOriginClipped&&t.isOriginOutsideView===e.isOriginOutsideView&&t.isOverlayClipped===e.isOverlayClipped&&t.isOverlayOutsideView===e.isOverlayOutsideView}var DT="cdk-global-overlay-wrapper";function I2(t){return new Pm}var Pm=class{_overlayRef;_cssPosition="static";_topOffset="";_bottomOffset="";_alignItems="";_xPosition="";_xOffset="";_width="";_height="";_isDisposed=!1;attach(e){let A=e.getConfig();this._overlayRef=e,this._width&&!A.width&&e.updateSize({width:this._width}),this._height&&!A.height&&e.updateSize({height:this._height}),e.hostElement.classList.add(DT),this._isDisposed=!1}top(e=""){return this._bottomOffset="",this._topOffset=e,this._alignItems="flex-start",this}left(e=""){return this._xOffset=e,this._xPosition="left",this}bottom(e=""){return this._topOffset="",this._bottomOffset=e,this._alignItems="flex-end",this}right(e=""){return this._xOffset=e,this._xPosition="right",this}start(e=""){return this._xOffset=e,this._xPosition="start",this}end(e=""){return this._xOffset=e,this._xPosition="end",this}width(e=""){return this._overlayRef?this._overlayRef.updateSize({width:e}):this._width=e,this}height(e=""){return this._overlayRef?this._overlayRef.updateSize({height:e}):this._height=e,this}centerHorizontally(e=""){return this.left(e),this._xPosition="center",this}centerVertically(e=""){return this.top(e),this._alignItems="center",this}apply(){if(!this._overlayRef||!this._overlayRef.hasAttached())return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement.style,i=this._overlayRef.getConfig(),{width:n,height:o,maxWidth:a,maxHeight:r}=i,s=(n==="100%"||n==="100vw")&&(!a||a==="100%"||a==="100vw"),l=(o==="100%"||o==="100vh")&&(!r||r==="100%"||r==="100vh"),g=this._xPosition,C=this._xOffset,I=this._overlayRef.getConfig().direction==="rtl",d="",h="",E="";s?E="flex-start":g==="center"?(E="center",I?h=C:d=C):I?g==="left"||g==="end"?(E="flex-end",d=C):(g==="right"||g==="start")&&(E="flex-start",h=C):g==="left"||g==="start"?(E="flex-start",d=C):(g==="right"||g==="end")&&(E="flex-end",h=C),e.position=this._cssPosition,e.marginLeft=s?"0":d,e.marginTop=l?"0":this._topOffset,e.marginBottom=this._bottomOffset,e.marginRight=s?"0":h,A.justifyContent=E,A.alignItems=l?"flex-start":this._alignItems}dispose(){if(this._isDisposed||!this._overlayRef)return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement,i=A.style;A.classList.remove(DT),i.justifyContent=i.alignItems=e.marginTop=e.marginBottom=e.marginLeft=e.marginRight=e.position="",this._overlayRef=null,this._isDisposed=!0}},qm=(()=>{class t{_injector=w(Dt);constructor(){}global(){return I2()}flexibleConnectedTo(A){return y1(this._injector,A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Gu=new kA("OVERLAY_DEFAULT_CONFIG");function Yg(t,e){t.get(eo).load(kT);let A=t.get(jm),i=t.get(ti),n=t.get(In),o=t.get(K0),a=t.get(fo),r=t.get(Pi,null,{optional:!0})||t.get(Kr).createRenderer(null,null),s=new Jg(e),l=t.get(Gu,null,{optional:!0})?.usePopover??!0;s.direction=s.direction||a.value,"showPopover"in i.body?s.usePopover=e?.usePopover??l:s.usePopover=!1;let g=i.createElement("div"),C=i.createElement("div");g.id=n.getId("cdk-overlay-"),g.classList.add("cdk-overlay-pane"),C.appendChild(g),s.usePopover&&(C.setAttribute("popover","manual"),C.classList.add("cdk-overlay-popover"));let I=s.usePopover?s.positionStrategy?.getPopoverInsertionPoint?.():null;return IM(I)?I.after(C):I?.type==="parent"?I.element.appendChild(C):A.getContainerElement().appendChild(C),new _B(new Fu(g,o,t),C,g,s,t.get(qe),t.get(MT),i,t.get(Uc),t.get(ST),e?.disableAnimations??t.get(qI,null,{optional:!0})==="NoopAnimations",t.get(Gr),r)}var v1=(()=>{class t{scrollStrategies=w(vT);_positionBuilder=w(qm);_injector=w(Dt);constructor(){}create(A){return Yg(this._injector,A)}position(){return this._positionBuilder}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),MlA=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],SlA=new kA("cdk-connected-overlay-scroll-strategy",{providedIn:"root",factory:()=>{let t=w(Dt);return()=>Z0(t)}}),RB=(()=>{class t{elementRef=w(ce);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdk-overlay-origin",""],["","overlay-origin",""],["","cdkOverlayOrigin",""]],exportAs:["cdkOverlayOrigin"]})}return t})(),xT=new kA("cdk-connected-overlay-default-config"),Vm=(()=>{class t{_dir=w(fo,{optional:!0});_injector=w(Dt);_overlayRef;_templatePortal;_backdropSubscription=bo.EMPTY;_attachSubscription=bo.EMPTY;_detachSubscription=bo.EMPTY;_positionSubscription=bo.EMPTY;_offsetX;_offsetY;_position;_scrollStrategyFactory=w(SlA);_ngZone=w(qe);origin;positions;positionStrategy;get offsetX(){return this._offsetX}set offsetX(A){this._offsetX=A,this._position&&this._updatePositionStrategy(this._position)}get offsetY(){return this._offsetY}set offsetY(A){this._offsetY=A,this._position&&this._updatePositionStrategy(this._position)}width;height;minWidth;minHeight;backdropClass;panelClass;viewportMargin=0;scrollStrategy;open=!1;disableClose=!1;transformOriginSelector;hasBackdrop=!1;lockPosition=!1;flexibleDimensions=!1;growAfterOpen=!1;push=!1;disposeOnNavigation=!1;usePopover;matchWidth=!1;set _config(A){typeof A!="string"&&this._assignConfig(A)}backdropClick=new LA;positionChange=new LA;attach=new LA;detach=new LA;overlayKeydown=new LA;overlayOutsideClick=new LA;constructor(){let A=w(ao),i=w(Mo),n=w(xT,{optional:!0}),o=w(Gu,{optional:!0});this.usePopover=o?.usePopover===!1?null:"global",this._templatePortal=new Jr(A,i),this.scrollStrategy=this._scrollStrategyFactory(),n&&this._assignConfig(n)}get overlayRef(){return this._overlayRef}get dir(){return this._dir?this._dir.value:"ltr"}ngOnDestroy(){this._attachSubscription.unsubscribe(),this._detachSubscription.unsubscribe(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._overlayRef?.dispose()}ngOnChanges(A){this._position&&(this._updatePositionStrategy(this._position),this._overlayRef?.updateSize({width:this._getWidth(),minWidth:this.minWidth,height:this.height,minHeight:this.minHeight}),A.origin&&this.open&&this._position.apply()),A.open&&(this.open?this.attachOverlay():this.detachOverlay())}_createOverlay(){(!this.positions||!this.positions.length)&&(this.positions=MlA);let A=this._overlayRef=Yg(this._injector,this._buildConfig());this._attachSubscription=A.attachments().subscribe(()=>this.attach.emit()),this._detachSubscription=A.detachments().subscribe(()=>this.detach.emit()),A.keydownEvents().subscribe(i=>{this.overlayKeydown.next(i),i.keyCode===27&&!this.disableClose&&!Qa(i)&&(i.preventDefault(),this.detachOverlay())}),this._overlayRef.outsidePointerEvents().subscribe(i=>{let n=this._getOriginElement(),o=Ur(i);(!n||n!==o&&!n.contains(o))&&this.overlayOutsideClick.next(i)})}_buildConfig(){let A=this._position=this.positionStrategy||this._createPositionStrategy(),i=new Jg({direction:this._dir||"ltr",positionStrategy:A,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop,disposeOnNavigation:this.disposeOnNavigation,usePopover:!!this.usePopover});return(this.height||this.height===0)&&(i.height=this.height),(this.minWidth||this.minWidth===0)&&(i.minWidth=this.minWidth),(this.minHeight||this.minHeight===0)&&(i.minHeight=this.minHeight),this.backdropClass&&(i.backdropClass=this.backdropClass),this.panelClass&&(i.panelClass=this.panelClass),i}_updatePositionStrategy(A){let i=this.positions.map(n=>({originX:n.originX,originY:n.originY,overlayX:n.overlayX,overlayY:n.overlayY,offsetX:n.offsetX||this.offsetX,offsetY:n.offsetY||this.offsetY,panelClass:n.panelClass||void 0}));return A.setOrigin(this._getOrigin()).withPositions(i).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector).withPopoverLocation(this.usePopover===null?"global":this.usePopover)}_createPositionStrategy(){let A=y1(this._injector,this._getOrigin());return this._updatePositionStrategy(A),A}_getOrigin(){return this.origin instanceof RB?this.origin.elementRef:this.origin}_getOriginElement(){return this.origin instanceof RB?this.origin.elementRef.nativeElement:this.origin instanceof ce?this.origin.nativeElement:typeof Element<"u"&&this.origin instanceof Element?this.origin:null}_getWidth(){return this.width?this.width:this.matchWidth?this._getOriginElement()?.getBoundingClientRect?.().width:void 0}attachOverlay(){this._overlayRef||this._createOverlay();let A=this._overlayRef;A.getConfig().hasBackdrop=this.hasBackdrop,A.updateSize({width:this._getWidth()}),A.hasAttached()||A.attach(this._templatePortal),this.hasBackdrop?this._backdropSubscription=A.backdropClick().subscribe(i=>this.backdropClick.emit(i)):this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.positionChange.observers.length>0&&(this._positionSubscription=this._position.positionChanges.pipe(NF(()=>this.positionChange.observers.length>0)).subscribe(i=>{this._ngZone.run(()=>this.positionChange.emit(i)),this.positionChange.observers.length===0&&this._positionSubscription.unsubscribe()})),this.open=!0}detachOverlay(){this._overlayRef?.detach(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.open=!1}_assignConfig(A){this.origin=A.origin??this.origin,this.positions=A.positions??this.positions,this.positionStrategy=A.positionStrategy??this.positionStrategy,this.offsetX=A.offsetX??this.offsetX,this.offsetY=A.offsetY??this.offsetY,this.width=A.width??this.width,this.height=A.height??this.height,this.minWidth=A.minWidth??this.minWidth,this.minHeight=A.minHeight??this.minHeight,this.backdropClass=A.backdropClass??this.backdropClass,this.panelClass=A.panelClass??this.panelClass,this.viewportMargin=A.viewportMargin??this.viewportMargin,this.scrollStrategy=A.scrollStrategy??this.scrollStrategy,this.disableClose=A.disableClose??this.disableClose,this.transformOriginSelector=A.transformOriginSelector??this.transformOriginSelector,this.hasBackdrop=A.hasBackdrop??this.hasBackdrop,this.lockPosition=A.lockPosition??this.lockPosition,this.flexibleDimensions=A.flexibleDimensions??this.flexibleDimensions,this.growAfterOpen=A.growAfterOpen??this.growAfterOpen,this.push=A.push??this.push,this.disposeOnNavigation=A.disposeOnNavigation??this.disposeOnNavigation,this.usePopover=A.usePopover??this.usePopover,this.matchWidth=A.matchWidth??this.matchWidth}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdk-connected-overlay",""],["","connected-overlay",""],["","cdkConnectedOverlay",""]],inputs:{origin:[0,"cdkConnectedOverlayOrigin","origin"],positions:[0,"cdkConnectedOverlayPositions","positions"],positionStrategy:[0,"cdkConnectedOverlayPositionStrategy","positionStrategy"],offsetX:[0,"cdkConnectedOverlayOffsetX","offsetX"],offsetY:[0,"cdkConnectedOverlayOffsetY","offsetY"],width:[0,"cdkConnectedOverlayWidth","width"],height:[0,"cdkConnectedOverlayHeight","height"],minWidth:[0,"cdkConnectedOverlayMinWidth","minWidth"],minHeight:[0,"cdkConnectedOverlayMinHeight","minHeight"],backdropClass:[0,"cdkConnectedOverlayBackdropClass","backdropClass"],panelClass:[0,"cdkConnectedOverlayPanelClass","panelClass"],viewportMargin:[0,"cdkConnectedOverlayViewportMargin","viewportMargin"],scrollStrategy:[0,"cdkConnectedOverlayScrollStrategy","scrollStrategy"],open:[0,"cdkConnectedOverlayOpen","open"],disableClose:[0,"cdkConnectedOverlayDisableClose","disableClose"],transformOriginSelector:[0,"cdkConnectedOverlayTransformOriginOn","transformOriginSelector"],hasBackdrop:[2,"cdkConnectedOverlayHasBackdrop","hasBackdrop",Be],lockPosition:[2,"cdkConnectedOverlayLockPosition","lockPosition",Be],flexibleDimensions:[2,"cdkConnectedOverlayFlexibleDimensions","flexibleDimensions",Be],growAfterOpen:[2,"cdkConnectedOverlayGrowAfterOpen","growAfterOpen",Be],push:[2,"cdkConnectedOverlayPush","push",Be],disposeOnNavigation:[2,"cdkConnectedOverlayDisposeOnNavigation","disposeOnNavigation",Be],usePopover:[0,"cdkConnectedOverlayUsePopover","usePopover"],matchWidth:[2,"cdkConnectedOverlayMatchWidth","matchWidth",Be],_config:[0,"cdkConnectedOverlay","_config"]},outputs:{backdropClick:"backdropClick",positionChange:"positionChange",attach:"attach",detach:"detach",overlayKeydown:"overlayKeydown",overlayOutsideClick:"overlayOutsideClick"},exportAs:["cdkConnectedOverlay"],features:[Yt]})}return t})(),Zl=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({providers:[v1],imports:[fi,Zc,Tm,Tm]})}return t})();function klA(t,e){}var d2=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;closePredicate;width="";height="";minWidth;minHeight;maxWidth;maxHeight;positionStrategy;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;scrollStrategy;closeOnNavigation=!0;closeOnDestroy=!0;closeOnOverlayDetachments=!0;disableAnimations=!1;providers;container;templateContext};var BM=(()=>{class t extends C2{_elementRef=w(ce);_focusTrapFactory=w(qQ);_config;_interactivityChecker=w(oB);_ngZone=w(qe);_focusMonitor=w($a);_renderer=w(Pi);_changeDetectorRef=w(wt);_injector=w(Dt);_platform=w(gi);_document=w(ti);_portalOutlet;_focusTrapped=new ie;_focusTrap=null;_elementFocusedBeforeDialogWasOpened=null;_closeInteractionType=null;_ariaLabelledByQueue=[];_isDestroyed=!1;constructor(){super(),this._config=w(d2,{optional:!0})||new d2,this._config.ariaLabelledBy&&this._ariaLabelledByQueue.push(this._config.ariaLabelledBy)}_addAriaLabelledBy(A){this._ariaLabelledByQueue.push(A),this._changeDetectorRef.markForCheck()}_removeAriaLabelledBy(A){let i=this._ariaLabelledByQueue.indexOf(A);i>-1&&(this._ariaLabelledByQueue.splice(i,1),this._changeDetectorRef.markForCheck())}_contentAttached(){this._initializeFocusTrap(),this._captureInitialFocus()}_captureInitialFocus(){this._trapFocus()}ngOnDestroy(){this._focusTrapped.complete(),this._isDestroyed=!0,this._restoreFocus()}attachComponentPortal(A){this._portalOutlet.hasAttached();let i=this._portalOutlet.attachComponentPortal(A);return this._contentAttached(),i}attachTemplatePortal(A){this._portalOutlet.hasAttached();let i=this._portalOutlet.attachTemplatePortal(A);return this._contentAttached(),i}attachDomPortal=A=>{this._portalOutlet.hasAttached();let i=this._portalOutlet.attachDomPortal(A);return this._contentAttached(),i};_recaptureFocus(){this._containsFocus()||this._trapFocus()}_forceFocus(A,i){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),a(),A.removeAttribute("tabindex")},o=this._renderer.listen(A,"blur",n),a=this._renderer.listen(A,"mousedown",n)})),A.focus(i)}_focusByCssSelector(A,i){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,i)}_trapFocus(A){this._isDestroyed||Hn(()=>{let i=this._elementRef.nativeElement;switch(this._config.autoFocus){case!1:case"dialog":this._containsFocus()||i.focus(A);break;case!0:case"first-tabbable":this._focusTrap?.focusInitialElement(A)||this._focusDialogContainer(A);break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]',A);break;default:this._focusByCssSelector(this._config.autoFocus,A);break}this._focusTrapped.next()},{injector:this._injector})}_restoreFocus(){let A=this._config.restoreFocus,i=null;if(typeof A=="string"?i=this._document.querySelector(A):typeof A=="boolean"?i=A?this._elementFocusedBeforeDialogWasOpened:null:A&&(i=A),this._config.restoreFocus&&i&&typeof i.focus=="function"){let n=HQ(),o=this._elementRef.nativeElement;(!n||n===this._document.body||n===o||o.contains(n))&&(this._focusMonitor?(this._focusMonitor.focusVia(i,this._closeInteractionType),this._closeInteractionType=null):i.focus())}this._focusTrap&&this._focusTrap.destroy()}_focusDialogContainer(A){this._elementRef.nativeElement.focus?.(A)}_containsFocus(){let A=this._elementRef.nativeElement,i=HQ();return A===i||A.contains(i)}_initializeFocusTrap(){this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._document&&(this._elementFocusedBeforeDialogWasOpened=HQ()))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["cdk-dialog-container"]],viewQuery:function(i,n){if(i&1&&Jt(Wl,7),i&2){let o;ae(o=re())&&(n._portalOutlet=o.first)}},hostAttrs:["tabindex","-1",1,"cdk-dialog-container"],hostVars:6,hostBindings:function(i,n){i&2&&te("id",n._config.id||null)("role",n._config.role)("aria-modal",n._config.ariaModal)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null)},features:[mt],decls:1,vars:0,consts:[["cdkPortalOutlet",""]],template:function(i,n){i&1&&Et(0,klA,0,0,"ng-template",0)},dependencies:[Wl],styles:[`.cdk-dialog-container{display:block;width:100%;height:100%;min-height:inherit;max-height:inherit} -`],encapsulation:2})}return t})(),Ku=class{overlayRef;config;componentInstance=null;componentRef=null;containerInstance;disableClose;closed=new ie;backdropClick;keydownEvents;outsidePointerEvents;id;_detachSubscription;constructor(e,A){this.overlayRef=e,this.config=A,this.disableClose=A.disableClose,this.backdropClick=e.backdropClick(),this.keydownEvents=e.keydownEvents(),this.outsidePointerEvents=e.outsidePointerEvents(),this.id=A.id,this.keydownEvents.subscribe(i=>{i.keyCode===27&&!this.disableClose&&!Qa(i)&&(i.preventDefault(),this.close(void 0,{focusOrigin:"keyboard"}))}),this.backdropClick.subscribe(()=>{!this.disableClose&&this._canClose()?this.close(void 0,{focusOrigin:"mouse"}):this.containerInstance._recaptureFocus?.()}),this._detachSubscription=e.detachments().subscribe(()=>{A.closeOnOverlayDetachments!==!1&&this.close()})}close(e,A){if(this._canClose(e)){let i=this.closed;this.containerInstance._closeInteractionType=A?.focusOrigin||"program",this._detachSubscription.unsubscribe(),this.overlayRef.dispose(),i.next(e),i.complete(),this.componentInstance=this.containerInstance=null}}updatePosition(){return this.overlayRef.updatePosition(),this}updateSize(e="",A=""){return this.overlayRef.updateSize({width:e,height:A}),this}addPanelClass(e){return this.overlayRef.addPanelClass(e),this}removePanelClass(e){return this.overlayRef.removePanelClass(e),this}_canClose(e){let A=this.config;return!!this.containerInstance&&(!A.closePredicate||A.closePredicate(e,A,this.componentInstance))}},xlA=new kA("DialogScrollStrategy",{providedIn:"root",factory:()=>{let t=w(Dt);return()=>NB(t)}}),_lA=new kA("DialogData"),RlA=new kA("DefaultDialogConfig");function NlA(t){let e=bA(t),A=new LA;return{valueSignal:e,get value(){return e()},change:A,ngOnDestroy(){A.complete()}}}var EM=(()=>{class t{_injector=w(Dt);_defaultOptions=w(RlA,{optional:!0});_parentDialog=w(t,{optional:!0,skipSelf:!0});_overlayContainer=w(jm);_idGenerator=w(In);_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new ie;_afterOpenedAtThisLevel=new ie;_ariaHiddenElements=new Map;_scrollStrategy=w(xlA);get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}afterAllClosed=Fc(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(Sn(void 0)));constructor(){}open(A,i){let n=this._defaultOptions||new d2;i=gA(gA({},n),i),i.id=i.id||this._idGenerator.getId("cdk-dialog-"),i.id&&this.getDialogById(i.id);let o=this._getOverlayConfig(i),a=Yg(this._injector,o),r=new Ku(a,i),s=this._attachContainer(a,r,i);if(r.containerInstance=s,!this.openDialogs.length){let l=this._overlayContainer.getContainerElement();s._focusTrapped?s._focusTrapped.pipe(uo(1)).subscribe(()=>{this._hideNonDialogContentFromAssistiveTechnology(l)}):this._hideNonDialogContentFromAssistiveTechnology(l)}return this._attachDialogContent(A,r,s,i),this.openDialogs.push(r),r.closed.subscribe(()=>this._removeOpenDialog(r,!0)),this.afterOpened.next(r),r}closeAll(){dM(this.openDialogs,A=>A.close())}getDialogById(A){return this.openDialogs.find(i=>i.id===A)}ngOnDestroy(){dM(this._openDialogsAtThisLevel,A=>{A.config.closeOnDestroy===!1&&this._removeOpenDialog(A,!1)}),dM(this._openDialogsAtThisLevel,A=>A.close()),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete(),this._openDialogsAtThisLevel=[]}_getOverlayConfig(A){let i=new Jg({positionStrategy:A.positionStrategy||I2().centerHorizontally().centerVertically(),scrollStrategy:A.scrollStrategy||this._scrollStrategy(),panelClass:A.panelClass,hasBackdrop:A.hasBackdrop,direction:A.direction,minWidth:A.minWidth,minHeight:A.minHeight,maxWidth:A.maxWidth,maxHeight:A.maxHeight,width:A.width,height:A.height,disposeOnNavigation:A.closeOnNavigation,disableAnimations:A.disableAnimations});return A.backdropClass&&(i.backdropClass=A.backdropClass),i}_attachContainer(A,i,n){let o=n.injector||n.viewContainerRef?.injector,a=[{provide:d2,useValue:n},{provide:Ku,useValue:i},{provide:_B,useValue:A}],r;n.container?typeof n.container=="function"?r=n.container:(r=n.container.type,a.push(...n.container.providers(n))):r=BM;let s=new Ss(r,n.viewContainerRef,Dt.create({parent:o||this._injector,providers:a}));return A.attach(s).instance}_attachDialogContent(A,i,n,o){if(A instanceof ao){let a=this._createInjector(o,i,n,void 0),r={$implicit:o.data,dialogRef:i};o.templateContext&&(r=gA(gA({},r),typeof o.templateContext=="function"?o.templateContext():o.templateContext)),n.attachTemplatePortal(new Jr(A,null,r,a))}else{let a=this._createInjector(o,i,n,this._injector),r=n.attachComponentPortal(new Ss(A,o.viewContainerRef,a));i.componentRef=r,i.componentInstance=r.instance}}_createInjector(A,i,n,o){let a=A.injector||A.viewContainerRef?.injector,r=[{provide:_lA,useValue:A.data},{provide:Ku,useValue:i}];return A.providers&&(typeof A.providers=="function"?r.push(...A.providers(i,A,n)):r.push(...A.providers)),A.direction&&(!a||!a.get(fo,null,{optional:!0}))&&r.push({provide:fo,useValue:NlA(A.direction)}),Dt.create({parent:a||o,providers:r})}_removeOpenDialog(A,i){let n=this.openDialogs.indexOf(A);n>-1&&(this.openDialogs.splice(n,1),this.openDialogs.length||(this._ariaHiddenElements.forEach((o,a)=>{o?a.setAttribute("aria-hidden",o):a.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),i&&this._getAfterAllClosed().next()))}_hideNonDialogContentFromAssistiveTechnology(A){if(A.parentElement){let i=A.parentElement.children;for(let n=i.length-1;n>-1;n--){let o=i[n];o!==A&&o.nodeName!=="SCRIPT"&&o.nodeName!=="STYLE"&&!o.hasAttribute("aria-live")&&!o.hasAttribute("popover")&&(this._ariaHiddenElements.set(o,o.getAttribute("aria-hidden")),o.setAttribute("aria-hidden","true"))}}}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function dM(t,e){let A=t.length;for(;A--;)e(t[A])}var _T=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({providers:[EM],imports:[Zl,Zc,WQ,Zc]})}return t})();function FlA(t,e){}var Zm=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;closePredicate;width="";height="";minWidth;minHeight;maxWidth;maxHeight;position;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;delayFocusTrap=!0;scrollStrategy;closeOnNavigation=!0;enterAnimationDuration;exitAnimationDuration},hM="mdc-dialog--open",RT="mdc-dialog--opening",NT="mdc-dialog--closing",LlA=150,GlA=75,KlA=(()=>{class t extends BM{_animationStateChanged=new LA;_animationsEnabled=!An();_actionSectionCount=0;_hostElement=this._elementRef.nativeElement;_enterAnimationDuration=this._animationsEnabled?LT(this._config.enterAnimationDuration)??LlA:0;_exitAnimationDuration=this._animationsEnabled?LT(this._config.exitAnimationDuration)??GlA:0;_animationTimer=null;_contentAttached(){super._contentAttached(),this._startOpenAnimation()}_startOpenAnimation(){this._animationStateChanged.emit({state:"opening",totalTime:this._enterAnimationDuration}),this._animationsEnabled?(this._hostElement.style.setProperty(FT,`${this._enterAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(RT,hM)),this._waitForAnimationToComplete(this._enterAnimationDuration,this._finishDialogOpen)):(this._hostElement.classList.add(hM),Promise.resolve().then(()=>this._finishDialogOpen()))}_startExitAnimation(){this._animationStateChanged.emit({state:"closing",totalTime:this._exitAnimationDuration}),this._hostElement.classList.remove(hM),this._animationsEnabled?(this._hostElement.style.setProperty(FT,`${this._exitAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(NT)),this._waitForAnimationToComplete(this._exitAnimationDuration,this._finishDialogClose)):Promise.resolve().then(()=>this._finishDialogClose())}_updateActionSectionCount(A){this._actionSectionCount+=A,this._changeDetectorRef.markForCheck()}_finishDialogOpen=()=>{this._clearAnimationClasses(),this._openAnimationDone(this._enterAnimationDuration)};_finishDialogClose=()=>{this._clearAnimationClasses(),this._animationStateChanged.emit({state:"closed",totalTime:this._exitAnimationDuration})};_clearAnimationClasses(){this._hostElement.classList.remove(RT,NT)}_waitForAnimationToComplete(A,i){this._animationTimer!==null&&clearTimeout(this._animationTimer),this._animationTimer=setTimeout(i,A)}_requestAnimationFrame(A){this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(A):A()})}_captureInitialFocus(){this._config.delayFocusTrap||this._trapFocus()}_openAnimationDone(A){this._config.delayFocusTrap&&this._trapFocus(),this._animationStateChanged.next({state:"opened",totalTime:A})}ngOnDestroy(){super.ngOnDestroy(),this._animationTimer!==null&&clearTimeout(this._animationTimer)}attachComponentPortal(A){let i=super.attachComponentPortal(A);return i.location.nativeElement.classList.add("mat-mdc-dialog-component-host"),i}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275cmp=SA({type:t,selectors:[["mat-dialog-container"]],hostAttrs:["tabindex","-1",1,"mat-mdc-dialog-container","mdc-dialog"],hostVars:10,hostBindings:function(i,n){i&2&&(ha("id",n._config.id),te("aria-modal",n._config.ariaModal)("role",n._config.role)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null),RA("_mat-animation-noopable",!n._animationsEnabled)("mat-mdc-dialog-container-with-actions",n._actionSectionCount>0))},features:[mt],decls:3,vars:0,consts:[[1,"mat-mdc-dialog-inner-container","mdc-dialog__container"],[1,"mat-mdc-dialog-surface","mdc-dialog__surface"],["cdkPortalOutlet",""]],template:function(i,n){i&1&&(B(0,"div",0)(1,"div",1),Et(2,FlA,0,0,"ng-template",2),Q()())},dependencies:[Wl],styles:[`.mat-mdc-dialog-container{width:100%;height:100%;display:block;box-sizing:border-box;max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;outline:0}.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-max-width, 560px);min-width:var(--mat-dialog-container-min-width, 280px)}@media(max-width: 599px){.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-small-max-width, calc(100vw - 32px))}}.mat-mdc-dialog-inner-container{display:flex;flex-direction:row;align-items:center;justify-content:space-around;box-sizing:border-box;height:100%;opacity:0;transition:opacity linear var(--mat-dialog-transition-duration, 0ms);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit}.mdc-dialog--closing .mat-mdc-dialog-inner-container{transition:opacity 75ms linear;transform:none}.mdc-dialog--open .mat-mdc-dialog-inner-container{opacity:1}._mat-animation-noopable .mat-mdc-dialog-inner-container{transition:none}.mat-mdc-dialog-surface{display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;box-sizing:border-box;width:100%;height:100%;position:relative;overflow-y:auto;outline:0;transform:scale(0.8);transition:transform var(--mat-dialog-transition-duration, 0ms) cubic-bezier(0, 0, 0.2, 1);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;box-shadow:var(--mat-dialog-container-elevation-shadow, none);border-radius:var(--mat-dialog-container-shape, var(--mat-sys-corner-extra-large, 4px));background-color:var(--mat-dialog-container-color, var(--mat-sys-surface, white))}[dir=rtl] .mat-mdc-dialog-surface{text-align:right}.mdc-dialog--open .mat-mdc-dialog-surface,.mdc-dialog--closing .mat-mdc-dialog-surface{transform:none}._mat-animation-noopable .mat-mdc-dialog-surface{transition:none}.mat-mdc-dialog-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:2px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mat-mdc-dialog-title{display:block;position:relative;flex-shrink:0;box-sizing:border-box;margin:0 0 1px;padding:var(--mat-dialog-headline-padding, 6px 24px 13px)}.mat-mdc-dialog-title::before{display:inline-block;width:0;height:40px;content:"";vertical-align:0}[dir=rtl] .mat-mdc-dialog-title{text-align:right}.mat-mdc-dialog-container .mat-mdc-dialog-title{color:var(--mat-dialog-subhead-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-dialog-subhead-font, var(--mat-sys-headline-small-font, inherit));line-height:var(--mat-dialog-subhead-line-height, var(--mat-sys-headline-small-line-height, 1.5rem));font-size:var(--mat-dialog-subhead-size, var(--mat-sys-headline-small-size, 1rem));font-weight:var(--mat-dialog-subhead-weight, var(--mat-sys-headline-small-weight, 400));letter-spacing:var(--mat-dialog-subhead-tracking, var(--mat-sys-headline-small-tracking, 0.03125em))}.mat-mdc-dialog-content{display:block;flex-grow:1;box-sizing:border-box;margin:0;overflow:auto;max-height:65vh}.mat-mdc-dialog-content>:first-child{margin-top:0}.mat-mdc-dialog-content>:last-child{margin-bottom:0}.mat-mdc-dialog-container .mat-mdc-dialog-content{color:var(--mat-dialog-supporting-text-color, var(--mat-sys-on-surface-variant, rgba(0, 0, 0, 0.6)));font-family:var(--mat-dialog-supporting-text-font, var(--mat-sys-body-medium-font, inherit));line-height:var(--mat-dialog-supporting-text-line-height, var(--mat-sys-body-medium-line-height, 1.5rem));font-size:var(--mat-dialog-supporting-text-size, var(--mat-sys-body-medium-size, 1rem));font-weight:var(--mat-dialog-supporting-text-weight, var(--mat-sys-body-medium-weight, 400));letter-spacing:var(--mat-dialog-supporting-text-tracking, var(--mat-sys-body-medium-tracking, 0.03125em))}.mat-mdc-dialog-container .mat-mdc-dialog-content{padding:var(--mat-dialog-content-padding, 20px 24px)}.mat-mdc-dialog-container-with-actions .mat-mdc-dialog-content{padding:var(--mat-dialog-with-actions-content-padding, 20px 24px 0)}.mat-mdc-dialog-container .mat-mdc-dialog-title+.mat-mdc-dialog-content{padding-top:0}.mat-mdc-dialog-actions{display:flex;position:relative;flex-shrink:0;flex-wrap:wrap;align-items:center;box-sizing:border-box;min-height:52px;margin:0;border-top:1px solid rgba(0,0,0,0);padding:var(--mat-dialog-actions-padding, 16px 24px);justify-content:var(--mat-dialog-actions-alignment, flex-end)}@media(forced-colors: active){.mat-mdc-dialog-actions{border-top-color:CanvasText}}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-start,.mat-mdc-dialog-actions[align=start]{justify-content:start}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-center,.mat-mdc-dialog-actions[align=center]{justify-content:center}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-end,.mat-mdc-dialog-actions[align=end]{justify-content:flex-end}.mat-mdc-dialog-actions .mat-button-base+.mat-button-base,.mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-mdc-dialog-actions .mat-button-base+.mat-button-base,[dir=rtl] .mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}.mat-mdc-dialog-component-host{display:contents} -`],encapsulation:2})}return t})(),FT="--mat-dialog-transition-duration";function LT(t){return t==null?null:typeof t=="number"?t:t.endsWith("ms")?zs(t.substring(0,t.length-2)):t.endsWith("s")?zs(t.substring(0,t.length-1))*1e3:t==="0"?0:null}var Wm=(function(t){return t[t.OPEN=0]="OPEN",t[t.CLOSING=1]="CLOSING",t[t.CLOSED=2]="CLOSED",t})(Wm||{}),lo=class{_ref;_config;_containerInstance;componentInstance;componentRef=null;disableClose;id;_afterOpened=new Sg(1);_beforeClosed=new Sg(1);_result;_closeFallbackTimeout;_state=Wm.OPEN;_closeInteractionType;constructor(e,A,i){this._ref=e,this._config=A,this._containerInstance=i,this.disableClose=A.disableClose,this.id=e.id,e.addPanelClass("mat-mdc-dialog-panel"),i._animationStateChanged.pipe(gt(n=>n.state==="opened"),uo(1)).subscribe(()=>{this._afterOpened.next(),this._afterOpened.complete()}),i._animationStateChanged.pipe(gt(n=>n.state==="closed"),uo(1)).subscribe(()=>{clearTimeout(this._closeFallbackTimeout),this._finishDialogClose()}),e.overlayRef.detachments().subscribe(()=>{this._beforeClosed.next(this._result),this._beforeClosed.complete(),this._finishDialogClose()}),Ki(this.backdropClick(),this.keydownEvents().pipe(gt(n=>n.keyCode===27&&!this.disableClose&&!Qa(n)))).subscribe(n=>{this.disableClose||(n.preventDefault(),GT(this,n.type==="keydown"?"keyboard":"mouse"))})}close(e){let A=this._config.closePredicate;A&&!A(e,this._config,this.componentInstance)||(this._result=e,this._containerInstance._animationStateChanged.pipe(gt(i=>i.state==="closing"),uo(1)).subscribe(i=>{this._beforeClosed.next(e),this._beforeClosed.complete(),this._ref.overlayRef.detachBackdrop(),this._closeFallbackTimeout=setTimeout(()=>this._finishDialogClose(),i.totalTime+100)}),this._state=Wm.CLOSING,this._containerInstance._startExitAnimation())}afterOpened(){return this._afterOpened}afterClosed(){return this._ref.closed}beforeClosed(){return this._beforeClosed}backdropClick(){return this._ref.backdropClick}keydownEvents(){return this._ref.keydownEvents}updatePosition(e){let A=this._ref.config.positionStrategy;return e&&(e.left||e.right)?e.left?A.left(e.left):A.right(e.right):A.centerHorizontally(),e&&(e.top||e.bottom)?e.top?A.top(e.top):A.bottom(e.bottom):A.centerVertically(),this._ref.updatePosition(),this}updateSize(e="",A=""){return this._ref.updateSize(e,A),this}addPanelClass(e){return this._ref.addPanelClass(e),this}removePanelClass(e){return this._ref.removePanelClass(e),this}getState(){return this._state}_finishDialogClose(){this._state=Wm.CLOSED,this._ref.close(this._result,{focusOrigin:this._closeInteractionType}),this.componentInstance=null}};function GT(t,e,A){return t._closeInteractionType=e,t.close(A)}var qo=new kA("MatMdcDialogData"),UlA=new kA("mat-mdc-dialog-default-options"),TlA=new kA("mat-mdc-dialog-scroll-strategy",{providedIn:"root",factory:()=>{let t=w(Dt);return()=>NB(t)}}),Or=(()=>{class t{_defaultOptions=w(UlA,{optional:!0});_scrollStrategy=w(TlA);_parentDialog=w(t,{optional:!0,skipSelf:!0});_idGenerator=w(In);_injector=w(Dt);_dialog=w(EM);_animationsDisabled=An();_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new ie;_afterOpenedAtThisLevel=new ie;dialogConfigClass=Zm;_dialogRefConstructor;_dialogContainerType;_dialogDataToken;get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}afterAllClosed=Fc(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(Sn(void 0)));constructor(){this._dialogRefConstructor=lo,this._dialogContainerType=KlA,this._dialogDataToken=qo}open(A,i){let n;i=gA(gA({},this._defaultOptions||new Zm),i),i.id=i.id||this._idGenerator.getId("mat-mdc-dialog-"),i.scrollStrategy=i.scrollStrategy||this._scrollStrategy();let o=this._dialog.open(A,Ye(gA({},i),{positionStrategy:I2(this._injector).centerHorizontally().centerVertically(),disableClose:!0,closePredicate:void 0,closeOnDestroy:!1,closeOnOverlayDetachments:!1,disableAnimations:this._animationsDisabled||i.enterAnimationDuration?.toLocaleString()==="0"||i.exitAnimationDuration?.toString()==="0",container:{type:this._dialogContainerType,providers:()=>[{provide:this.dialogConfigClass,useValue:i},{provide:d2,useValue:i}]},templateContext:()=>({dialogRef:n}),providers:(a,r,s)=>(n=new this._dialogRefConstructor(a,i,s),n.updatePosition(i?.position),[{provide:this._dialogContainerType,useValue:s},{provide:this._dialogDataToken,useValue:r.data},{provide:this._dialogRefConstructor,useValue:n}])}));return n.componentRef=o.componentRef,n.componentInstance=o.componentInstance,this.openDialogs.push(n),this.afterOpened.next(n),n.afterClosed().subscribe(()=>{let a=this.openDialogs.indexOf(n);a>-1&&(this.openDialogs.splice(a,1),this.openDialogs.length||this._getAfterAllClosed().next())}),n}closeAll(){this._closeDialogs(this.openDialogs)}getDialogById(A){return this.openDialogs.find(i=>i.id===A)}ngOnDestroy(){this._closeDialogs(this._openDialogsAtThisLevel),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete()}_closeDialogs(A){let i=A.length;for(;i--;)A[i].close()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),B2=(()=>{class t{dialogRef=w(lo,{optional:!0});_elementRef=w(ce);_dialog=w(Or);ariaLabel;type="button";dialogResult;_matDialogClose;constructor(){}ngOnInit(){this.dialogRef||(this.dialogRef=UT(this._elementRef,this._dialog.openDialogs))}ngOnChanges(A){let i=A._matDialogClose||A._matDialogCloseResult;i&&(this.dialogResult=i.currentValue)}_onButtonClick(A){GT(this.dialogRef,A.screenX===0&&A.screenY===0?"keyboard":"mouse",this.dialogResult)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","mat-dialog-close",""],["","matDialogClose",""]],hostVars:2,hostBindings:function(i,n){i&1&&U("click",function(a){return n._onButtonClick(a)}),i&2&&te("aria-label",n.ariaLabel||null)("type",n.type)},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],type:"type",dialogResult:[0,"mat-dialog-close","dialogResult"],_matDialogClose:[0,"matDialogClose","_matDialogClose"]},exportAs:["matDialogClose"],features:[Yt]})}return t})(),KT=(()=>{class t{_dialogRef=w(lo,{optional:!0});_elementRef=w(ce);_dialog=w(Or);constructor(){}ngOnInit(){this._dialogRef||(this._dialogRef=UT(this._elementRef,this._dialog.openDialogs)),this._dialogRef&&Promise.resolve().then(()=>{this._onAdd()})}ngOnDestroy(){this._dialogRef?._containerInstance&&Promise.resolve().then(()=>{this._onRemove()})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t})}return t})(),fa=(()=>{class t extends KT{id=w(In).getId("mat-mdc-dialog-title-");_onAdd(){this._dialogRef._containerInstance?._addAriaLabelledBy?.(this.id)}_onRemove(){this._dialogRef?._containerInstance?._removeAriaLabelledBy?.(this.id)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","mat-dialog-title",""],["","matDialogTitle",""]],hostAttrs:[1,"mat-mdc-dialog-title","mdc-dialog__title"],hostVars:1,hostBindings:function(i,n){i&2&&ha("id",n.id)},inputs:{id:"id"},exportAs:["matDialogTitle"],features:[mt]})}return t})(),Na=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","mat-dialog-content",""],["mat-dialog-content"],["","matDialogContent",""]],hostAttrs:[1,"mat-mdc-dialog-content","mdc-dialog__content"],features:[Z3([W0])]})}return t})(),pa=(()=>{class t extends KT{align;_onAdd(){this._dialogRef._containerInstance?._updateActionSectionCount?.(1)}_onRemove(){this._dialogRef._containerInstance?._updateActionSectionCount?.(-1)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","mat-dialog-actions",""],["mat-dialog-actions"],["","matDialogActions",""]],hostAttrs:[1,"mat-mdc-dialog-actions","mdc-dialog__actions"],hostVars:6,hostBindings:function(i,n){i&2&&RA("mat-mdc-dialog-actions-align-start",n.align==="start")("mat-mdc-dialog-actions-align-center",n.align==="center")("mat-mdc-dialog-actions-align-end",n.align==="end")},inputs:{align:"align"},features:[mt]})}return t})();function UT(t,e){let A=t.nativeElement.parentElement;for(;A&&!A.classList.contains("mat-mdc-dialog-container");)A=A.parentElement;return A?e.find(i=>i.id===A.id):null}var Xc=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({providers:[Or],imports:[_T,Zl,Zc,fi]})}return t})();function TT(t){return Error(`Unable to find icon with the name "${t}"`)}function JlA(){return Error("Could not find HttpClient for use with Angular Material icons. Please add provideHttpClient() to your providers.")}function JT(t){return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was "${t}".`)}function OT(t){return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by Angular's DomSanitizer. Attempted literal was "${t}".`)}var X0=class{url;svgText;options;svgElement=null;constructor(e,A,i){this.url=e,this.svgText=A,this.options=i}},HT=(()=>{class t{_httpClient;_sanitizer;_errorHandler;_document;_svgIconConfigs=new Map;_iconSetConfigs=new Map;_cachedIconsByUrl=new Map;_inProgressUrlFetches=new Map;_fontCssClassesByAlias=new Map;_resolvers=[];_defaultFontSetClass=["material-icons","mat-ligature-font"];constructor(A,i,n,o){this._httpClient=A,this._sanitizer=i,this._errorHandler=o,this._document=n}addSvgIcon(A,i,n){return this.addSvgIconInNamespace("",A,i,n)}addSvgIconLiteral(A,i,n){return this.addSvgIconLiteralInNamespace("",A,i,n)}addSvgIconInNamespace(A,i,n,o){return this._addSvgIconConfig(A,i,new X0(n,null,o))}addSvgIconResolver(A){return this._resolvers.push(A),this}addSvgIconLiteralInNamespace(A,i,n,o){let a=this._sanitizer.sanitize(_g.HTML,n);if(!a)throw OT(n);let r=e1(a);return this._addSvgIconConfig(A,i,new X0("",r,o))}addSvgIconSet(A,i){return this.addSvgIconSetInNamespace("",A,i)}addSvgIconSetLiteral(A,i){return this.addSvgIconSetLiteralInNamespace("",A,i)}addSvgIconSetInNamespace(A,i,n){return this._addSvgIconSetConfig(A,new X0(i,null,n))}addSvgIconSetLiteralInNamespace(A,i,n){let o=this._sanitizer.sanitize(_g.HTML,i);if(!o)throw OT(i);let a=e1(o);return this._addSvgIconSetConfig(A,new X0("",a,n))}registerFontClassAlias(A,i=A){return this._fontCssClassesByAlias.set(A,i),this}classNameForFontAlias(A){return this._fontCssClassesByAlias.get(A)||A}setDefaultFontSetClass(...A){return this._defaultFontSetClass=A,this}getDefaultFontSetClass(){return this._defaultFontSetClass}getSvgIconFromUrl(A){let i=this._sanitizer.sanitize(_g.RESOURCE_URL,A);if(!i)throw JT(A);let n=this._cachedIconsByUrl.get(i);return n?ne(Xm(n)):this._loadSvgIconFromConfig(new X0(A,null)).pipe(di(o=>this._cachedIconsByUrl.set(i,o)),we(o=>Xm(o)))}getNamedSvgIcon(A,i=""){let n=YT(i,A),o=this._svgIconConfigs.get(n);if(o)return this._getSvgFromConfig(o);if(o=this._getIconConfigFromResolvers(i,A),o)return this._svgIconConfigs.set(n,o),this._getSvgFromConfig(o);let a=this._iconSetConfigs.get(i);return a?this._getSvgFromIconSetConfigs(A,a):T3(TT(n))}ngOnDestroy(){this._resolvers=[],this._svgIconConfigs.clear(),this._iconSetConfigs.clear(),this._cachedIconsByUrl.clear()}_getSvgFromConfig(A){return A.svgText?ne(Xm(this._svgElementFromConfig(A))):this._loadSvgIconFromConfig(A).pipe(we(i=>Xm(i)))}_getSvgFromIconSetConfigs(A,i){let n=this._extractIconWithNameFromAnySet(A,i);if(n)return ne(n);let o=i.filter(a=>!a.svgText).map(a=>this._loadSvgIconSetFromConfig(a).pipe(Po(r=>{let l=`Loading icon set URL: ${this._sanitizer.sanitize(_g.RESOURCE_URL,a.url)} failed: ${r.message}`;return this._errorHandler.handleError(new Error(l)),ne(null)})));return qC(o).pipe(we(()=>{let a=this._extractIconWithNameFromAnySet(A,i);if(!a)throw TT(A);return a}))}_extractIconWithNameFromAnySet(A,i){for(let n=i.length-1;n>=0;n--){let o=i[n];if(o.svgText&&o.svgText.toString().indexOf(A)>-1){let a=this._svgElementFromConfig(o),r=this._extractSvgIconFromSet(a,A,o.options);if(r)return r}}return null}_loadSvgIconFromConfig(A){return this._fetchIcon(A).pipe(di(i=>A.svgText=i),we(()=>this._svgElementFromConfig(A)))}_loadSvgIconSetFromConfig(A){return A.svgText?ne(null):this._fetchIcon(A).pipe(di(i=>A.svgText=i))}_extractSvgIconFromSet(A,i,n){let o=A.querySelector(`[id="${i}"]`);if(!o)return null;let a=o.cloneNode(!0);if(a.removeAttribute("id"),a.nodeName.toLowerCase()==="svg")return this._setSvgAttributes(a,n);if(a.nodeName.toLowerCase()==="symbol")return this._setSvgAttributes(this._toSvgElement(a),n);let r=this._svgElementFromString(e1(""));return r.appendChild(a),this._setSvgAttributes(r,n)}_svgElementFromString(A){let i=this._document.createElement("DIV");i.innerHTML=A;let n=i.querySelector("svg");if(!n)throw Error(" tag not found");return n}_toSvgElement(A){let i=this._svgElementFromString(e1("")),n=A.attributes;for(let o=0;oe1(l)),H3(()=>this._inProgressUrlFetches.delete(a)),WC());return this._inProgressUrlFetches.set(a,s),s}_addSvgIconConfig(A,i,n){return this._svgIconConfigs.set(YT(A,i),n),this}_addSvgIconSetConfig(A,i){let n=this._iconSetConfigs.get(A);return n?n.push(i):this._iconSetConfigs.set(A,[i]),this}_svgElementFromConfig(A){if(!A.svgElement){let i=this._svgElementFromString(A.svgText);this._setSvgAttributes(i,A.options),A.svgElement=i}return A.svgElement}_getIconConfigFromResolvers(A,i){for(let n=0;n{let t=w(ti),e=t?t.location:null;return{getPathname:()=>e?e.pathname+e.search:""}}}),zT=["clip-path","color-profile","src","cursor","fill","filter","marker","marker-start","marker-mid","marker-end","mask","stroke"],PlA=zT.map(t=>`[${t}]`).join(", "),jlA=/^url\(['"]?#(.*?)['"]?\)$/,Wt=(()=>{class t{_elementRef=w(ce);_iconRegistry=w(HT);_location=w(zlA);_errorHandler=w(z3);_defaultColor;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;inline=!1;get svgIcon(){return this._svgIcon}set svgIcon(A){A!==this._svgIcon&&(A?this._updateSvgIcon(A):this._svgIcon&&this._clearSvgElement(),this._svgIcon=A)}_svgIcon;get fontSet(){return this._fontSet}set fontSet(A){let i=this._cleanupFontValue(A);i!==this._fontSet&&(this._fontSet=i,this._updateFontIconClasses())}_fontSet;get fontIcon(){return this._fontIcon}set fontIcon(A){let i=this._cleanupFontValue(A);i!==this._fontIcon&&(this._fontIcon=i,this._updateFontIconClasses())}_fontIcon;_previousFontSetClass=[];_previousFontIconClass;_svgName=null;_svgNamespace=null;_previousPath;_elementsWithExternalReferences;_currentIconFetch=bo.EMPTY;constructor(){let A=w(new Us("aria-hidden"),{optional:!0}),i=w(HlA,{optional:!0});i&&(i.color&&(this.color=this._defaultColor=i.color),i.fontSet&&(this.fontSet=i.fontSet)),A||this._elementRef.nativeElement.setAttribute("aria-hidden","true")}_splitIconName(A){if(!A)return["",""];let i=A.split(":");switch(i.length){case 1:return["",i[0]];case 2:return i;default:throw Error(`Invalid icon name: "${A}"`)}}ngOnInit(){this._updateFontIconClasses()}ngAfterViewChecked(){let A=this._elementsWithExternalReferences;if(A&&A.size){let i=this._location.getPathname();i!==this._previousPath&&(this._previousPath=i,this._prependPathToReferences(i))}}ngOnDestroy(){this._currentIconFetch.unsubscribe(),this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear()}_usingFontIcon(){return!this.svgIcon}_setSvgElement(A){this._clearSvgElement();let i=this._location.getPathname();this._previousPath=i,this._cacheChildrenWithExternalReferences(A),this._prependPathToReferences(i),this._elementRef.nativeElement.appendChild(A)}_clearSvgElement(){let A=this._elementRef.nativeElement,i=A.childNodes.length;for(this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear();i--;){let n=A.childNodes[i];(n.nodeType!==1||n.nodeName.toLowerCase()==="svg")&&n.remove()}}_updateFontIconClasses(){if(!this._usingFontIcon())return;let A=this._elementRef.nativeElement,i=(this.fontSet?this._iconRegistry.classNameForFontAlias(this.fontSet).split(/ +/):this._iconRegistry.getDefaultFontSetClass()).filter(n=>n.length>0);this._previousFontSetClass.forEach(n=>A.classList.remove(n)),i.forEach(n=>A.classList.add(n)),this._previousFontSetClass=i,this.fontIcon!==this._previousFontIconClass&&!i.includes("mat-ligature-font")&&(this._previousFontIconClass&&A.classList.remove(this._previousFontIconClass),this.fontIcon&&A.classList.add(this.fontIcon),this._previousFontIconClass=this.fontIcon)}_cleanupFontValue(A){return typeof A=="string"?A.trim().split(" ")[0]:A}_prependPathToReferences(A){let i=this._elementsWithExternalReferences;i&&i.forEach((n,o)=>{n.forEach(a=>{o.setAttribute(a.name,`url('${A}#${a.value}')`)})})}_cacheChildrenWithExternalReferences(A){let i=A.querySelectorAll(PlA),n=this._elementsWithExternalReferences=this._elementsWithExternalReferences||new Map;for(let o=0;o{let r=i[o],s=r.getAttribute(a),l=s?s.match(jlA):null;if(l){let g=n.get(r);g||(g=[],n.set(r,g)),g.push({name:a,value:l[1]})}})}_updateSvgIcon(A){if(this._svgNamespace=null,this._svgName=null,this._currentIconFetch.unsubscribe(),A){let[i,n]=this._splitIconName(A);i&&(this._svgNamespace=i),n&&(this._svgName=n),this._currentIconFetch=this._iconRegistry.getNamedSvgIcon(n,i).pipe(uo(1)).subscribe(o=>this._setSvgElement(o),o=>{let a=`Error retrieving icon ${i}:${n}! ${o.message}`;this._errorHandler.handleError(new Error(a))})}}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-icon"]],hostAttrs:["role","img",1,"mat-icon","notranslate"],hostVars:10,hostBindings:function(i,n){i&2&&(te("data-mat-icon-type",n._usingFontIcon()?"font":"svg")("data-mat-icon-name",n._svgName||n.fontIcon)("data-mat-icon-namespace",n._svgNamespace||n.fontSet)("fontIcon",n._usingFontIcon()?n.fontIcon:null),ro(n.color?"mat-"+n.color:""),RA("mat-icon-inline",n.inline)("mat-icon-no-color",n.color!=="primary"&&n.color!=="accent"&&n.color!=="warn"))},inputs:{color:"color",inline:[2,"inline","inline",Be],svgIcon:"svgIcon",fontSet:"fontSet",fontIcon:"fontIcon"},exportAs:["matIcon"],ngContentSelectors:YlA,decls:1,vars:0,template:function(i,n){i&1&&(Rt(),Ve(0))},styles:[`mat-icon,mat-icon.mat-primary,mat-icon.mat-accent,mat-icon.mat-warn{color:var(--mat-icon-color, inherit)}.mat-icon{-webkit-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px;overflow:hidden}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}.mat-icon.mat-ligature-font[fontIcon]::before{content:attr(fontIcon)}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto} -`],encapsulation:2,changeDetection:0})}return t})(),Tn=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();var qlA=["mat-menu-item",""],VlA=[[["mat-icon"],["","matMenuItemIcon",""]],"*"],WlA=["mat-icon, [matMenuItemIcon]","*"];function ZlA(t,e){t&1&&(Ct(),B(0,"svg",2),hA(1,"polygon",3),Q())}var XlA=["*"];function $lA(t,e){if(t&1){let A=QA();wn(0,"div",0),qd("click",function(){T(A);let n=p();return J(n.closed.emit("click"))})("animationstart",function(n){T(A);let o=p();return J(o._onAnimationStart(n.animationName))})("animationend",function(n){T(A);let o=p();return J(o._onAnimationDone(n.animationName))})("animationcancel",function(n){T(A);let o=p();return J(o._onAnimationDone(n.animationName))}),wn(1,"div",1),Ve(2),Gn()()}if(t&2){let A=p();ro(A._classList),RA("mat-menu-panel-animations-disabled",A._animationsDisabled)("mat-menu-panel-exit-animation",A._panelAnimationState==="void")("mat-menu-panel-animating",A._isAnimating()),ha("id",A.panelId),te("aria-label",A.ariaLabel||null)("aria-labelledby",A.ariaLabelledby||null)("aria-describedby",A.ariaDescribedby||null)}}var uM=new kA("MAT_MENU_PANEL"),Ml=(()=>{class t{_elementRef=w(ce);_document=w(ti);_focusMonitor=w($a);_parentMenu=w(uM,{optional:!0});_changeDetectorRef=w(wt);role="menuitem";disabled=!1;disableRipple=!1;_hovered=new ie;_focused=new ie;_highlighted=!1;_triggersSubmenu=!1;constructor(){w(eo).load(lr),this._parentMenu?.addItem?.(this)}focus(A,i){this._focusMonitor&&A?this._focusMonitor.focusVia(this._getHostElement(),A,i):this._getHostElement().focus(i),this._focused.next(this)}ngAfterViewInit(){this._focusMonitor&&this._focusMonitor.monitor(this._elementRef,!1)}ngOnDestroy(){this._focusMonitor&&this._focusMonitor.stopMonitoring(this._elementRef),this._parentMenu&&this._parentMenu.removeItem&&this._parentMenu.removeItem(this),this._hovered.complete(),this._focused.complete()}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._elementRef.nativeElement}_checkDisabled(A){this.disabled&&(A.preventDefault(),A.stopPropagation())}_handleMouseEnter(){this._hovered.next(this)}getLabel(){let A=this._elementRef.nativeElement.cloneNode(!0),i=A.querySelectorAll("mat-icon, .material-icons");for(let n=0;n({overlapTrigger:!1,xPosition:"after",yPosition:"below",backdropClass:"cdk-overlay-transparent-backdrop"})}),QM="_mat-menu-enter",A6="_mat-menu-exit",Zs=(()=>{class t{_elementRef=w(ce);_changeDetectorRef=w(wt);_injector=w(Dt);_keyManager;_xPosition;_yPosition;_firstItemFocusRef;_exitFallbackTimeout;_animationsDisabled=An();_allItems;_directDescendantItems=new xg;_classList={};_panelAnimationState="void";_animationDone=new ie;_isAnimating=bA(!1);parentMenu;direction;overlayPanelClass;backdropClass;ariaLabel;ariaLabelledby;ariaDescribedby;get xPosition(){return this._xPosition}set xPosition(A){this._xPosition=A,this.setPositionClasses()}get yPosition(){return this._yPosition}set yPosition(A){this._yPosition=A,this.setPositionClasses()}templateRef;items;lazyContent;overlapTrigger=!1;hasBackdrop;set panelClass(A){let i=this._previousPanelClass,n=gA({},this._classList);i&&i.length&&i.split(" ").forEach(o=>{n[o]=!1}),this._previousPanelClass=A,A&&A.length&&(A.split(" ").forEach(o=>{n[o]=!0}),this._elementRef.nativeElement.className=""),this._classList=n}_previousPanelClass;get classList(){return this.panelClass}set classList(A){this.panelClass=A}closed=new LA;close=this.closed;panelId=w(In).getId("mat-menu-panel-");constructor(){let A=w(egA);this.overlayPanelClass=A.overlayPanelClass||"",this._xPosition=A.xPosition,this._yPosition=A.yPosition,this.backdropClass=A.backdropClass,this.overlapTrigger=A.overlapTrigger,this.hasBackdrop=A.hasBackdrop}ngOnInit(){this.setPositionClasses()}ngAfterContentInit(){this._updateDirectDescendants(),this._keyManager=new H0(this._directDescendantItems).withWrap().withTypeAhead().withHomeAndEnd(),this._keyManager.tabOut.subscribe(()=>this.closed.emit("tab")),this._directDescendantItems.changes.pipe(Sn(this._directDescendantItems),hi(A=>Ki(...A.map(i=>i._focused)))).subscribe(A=>this._keyManager.updateActiveItem(A)),this._directDescendantItems.changes.subscribe(A=>{let i=this._keyManager;if(this._panelAnimationState==="enter"&&i.activeItem?._hasFocus()){let n=A.toArray(),o=Math.max(0,Math.min(n.length-1,i.activeItemIndex||0));n[o]&&!n[o].disabled?i.setActiveItem(o):i.setNextItemActive()}})}ngOnDestroy(){this._keyManager?.destroy(),this._directDescendantItems.destroy(),this.closed.complete(),this._firstItemFocusRef?.destroy(),clearTimeout(this._exitFallbackTimeout)}_hovered(){return this._directDescendantItems.changes.pipe(Sn(this._directDescendantItems),hi(i=>Ki(...i.map(n=>n._hovered))))}addItem(A){}removeItem(A){}_handleKeydown(A){let i=A.keyCode,n=this._keyManager;switch(i){case 27:Qa(A)||(A.preventDefault(),this.closed.emit("keydown"));break;case 37:this.parentMenu&&this.direction==="ltr"&&this.closed.emit("keydown");break;case 39:this.parentMenu&&this.direction==="rtl"&&this.closed.emit("keydown");break;default:(i===38||i===40)&&n.setFocusOrigin("keyboard"),n.onKeydown(A);return}}focusFirstItem(A="program"){this._firstItemFocusRef?.destroy(),this._firstItemFocusRef=Hn(()=>{let i=this._resolvePanel();if(!i||!i.contains(document.activeElement)){let n=this._keyManager;n.setFocusOrigin(A).setFirstItemActive(),!n.activeItem&&i&&i.focus()}},{injector:this._injector})}resetActiveItem(){this._keyManager.setActiveItem(-1)}setElevation(A){}setPositionClasses(A=this.xPosition,i=this.yPosition){this._classList=Ye(gA({},this._classList),{"mat-menu-before":A==="before","mat-menu-after":A==="after","mat-menu-above":i==="above","mat-menu-below":i==="below"}),this._changeDetectorRef.markForCheck()}_onAnimationDone(A){let i=A===A6;(i||A===QM)&&(i&&(clearTimeout(this._exitFallbackTimeout),this._exitFallbackTimeout=void 0),this._animationDone.next(i?"void":"enter"),this._isAnimating.set(!1))}_onAnimationStart(A){(A===QM||A===A6)&&this._isAnimating.set(!0)}_setIsOpen(A){if(this._panelAnimationState=A?"enter":"void",A){if(this._keyManager.activeItemIndex===0){let i=this._resolvePanel();i&&(i.scrollTop=0)}}else this._animationsDisabled||(this._exitFallbackTimeout=setTimeout(()=>this._onAnimationDone(A6),200));this._animationsDisabled&&setTimeout(()=>{this._onAnimationDone(A?QM:A6)}),this._changeDetectorRef.markForCheck()}_updateDirectDescendants(){this._allItems.changes.pipe(Sn(this._allItems)).subscribe(A=>{this._directDescendantItems.reset(A.filter(i=>i._parentMenu===this)),this._directDescendantItems.notifyOnChanges()})}_resolvePanel(){let A=null;return this._directDescendantItems.length&&(A=this._directDescendantItems.first._getHostElement().closest('[role="menu"]')),A}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-menu"]],contentQueries:function(i,n,o){if(i&1&&jo(o,AgA,5)(o,Ml,5)(o,Ml,4),i&2){let a;ae(a=re())&&(n.lazyContent=a.first),ae(a=re())&&(n._allItems=a),ae(a=re())&&(n.items=a)}},viewQuery:function(i,n){if(i&1&&Jt(ao,5),i&2){let o;ae(o=re())&&(n.templateRef=o.first)}},hostVars:3,hostBindings:function(i,n){i&2&&te("aria-label",null)("aria-labelledby",null)("aria-describedby",null)},inputs:{backdropClass:"backdropClass",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],xPosition:"xPosition",yPosition:"yPosition",overlapTrigger:[2,"overlapTrigger","overlapTrigger",Be],hasBackdrop:[2,"hasBackdrop","hasBackdrop",A=>A==null?null:Be(A)],panelClass:[0,"class","panelClass"],classList:"classList"},outputs:{closed:"closed",close:"close"},exportAs:["matMenu"],features:[Bt([{provide:uM,useExisting:t}])],ngContentSelectors:XlA,decls:1,vars:0,consts:[["tabindex","-1","role","menu",1,"mat-mdc-menu-panel",3,"click","animationstart","animationend","animationcancel","id"],[1,"mat-mdc-menu-content"]],template:function(i,n){i&1&&(Rt(),X3(0,$lA,3,12,"ng-template"))},styles:[`mat-menu{display:none}.mat-mdc-menu-content{margin:0;padding:8px 0;outline:0}.mat-mdc-menu-content,.mat-mdc-menu-content .mat-mdc-menu-item .mat-mdc-menu-item-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;flex:1;white-space:normal;font-family:var(--mat-menu-item-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-menu-item-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-menu-item-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-menu-item-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-menu-item-label-text-weight, var(--mat-sys-label-large-weight))}@keyframes _mat-menu-enter{from{opacity:0;transform:scale(0.8)}to{opacity:1;transform:none}}@keyframes _mat-menu-exit{from{opacity:1}to{opacity:0}}.mat-mdc-menu-panel{min-width:112px;max-width:280px;overflow:auto;box-sizing:border-box;outline:0;animation:_mat-menu-enter 120ms cubic-bezier(0, 0, 0.2, 1);border-radius:var(--mat-menu-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-menu-container-color, var(--mat-sys-surface-container));box-shadow:var(--mat-menu-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));will-change:transform,opacity}.mat-mdc-menu-panel.mat-menu-panel-exit-animation{animation:_mat-menu-exit 100ms 25ms linear forwards}.mat-mdc-menu-panel.mat-menu-panel-animations-disabled{animation:none}.mat-mdc-menu-panel.mat-menu-panel-animating{pointer-events:none}.mat-mdc-menu-panel.mat-menu-panel-animating:has(.mat-mdc-menu-content:empty){display:none}@media(forced-colors: active){.mat-mdc-menu-panel{outline:solid 1px}}.mat-mdc-menu-panel .mat-divider{border-top-color:var(--mat-menu-divider-color, var(--mat-sys-surface-variant));margin-bottom:var(--mat-menu-divider-bottom-spacing, 8px);margin-top:var(--mat-menu-divider-top-spacing, 8px)}.mat-mdc-menu-item{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;cursor:pointer;width:100%;text-align:left;box-sizing:border-box;color:inherit;font-size:inherit;background:none;text-decoration:none;margin:0;min-height:48px;padding-left:var(--mat-menu-item-leading-spacing, 12px);padding-right:var(--mat-menu-item-trailing-spacing, 12px);-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-menu-item::-moz-focus-inner{border:0}[dir=rtl] .mat-mdc-menu-item{padding-left:var(--mat-menu-item-trailing-spacing, 12px);padding-right:var(--mat-menu-item-leading-spacing, 12px)}.mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-leading-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-trailing-spacing, 12px)}[dir=rtl] .mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-trailing-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-leading-spacing, 12px)}.mat-mdc-menu-item,.mat-mdc-menu-item:visited,.mat-mdc-menu-item:link{color:var(--mat-menu-item-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-menu-item .mat-icon-no-color,.mat-mdc-menu-item .mat-mdc-menu-submenu-icon{color:var(--mat-menu-item-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-menu-item[disabled]{cursor:default;opacity:.38}.mat-mdc-menu-item[disabled]::after{display:block;position:absolute;content:"";top:0;left:0;bottom:0;right:0}.mat-mdc-menu-item:focus{outline:0}.mat-mdc-menu-item .mat-icon{flex-shrink:0;margin-right:var(--mat-menu-item-spacing, 12px);height:var(--mat-menu-item-icon-size, 24px);width:var(--mat-menu-item-icon-size, 24px)}[dir=rtl] .mat-mdc-menu-item{text-align:right}[dir=rtl] .mat-mdc-menu-item .mat-icon{margin-right:0;margin-left:var(--mat-menu-item-spacing, 12px)}.mat-mdc-menu-item:not([disabled]):hover{background-color:var(--mat-menu-item-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-menu-item:not([disabled]).cdk-program-focused,.mat-mdc-menu-item:not([disabled]).cdk-keyboard-focused,.mat-mdc-menu-item:not([disabled]).mat-mdc-menu-item-highlighted{background-color:var(--mat-menu-item-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}@media(forced-colors: active){.mat-mdc-menu-item{margin-top:1px}}.mat-mdc-menu-submenu-icon{width:var(--mat-menu-item-icon-size, 24px);height:10px;fill:currentColor;padding-left:var(--mat-menu-item-spacing, 12px)}[dir=rtl] .mat-mdc-menu-submenu-icon{padding-right:var(--mat-menu-item-spacing, 12px);padding-left:0}[dir=rtl] .mat-mdc-menu-submenu-icon polygon{transform:scaleX(-1);transform-origin:center}@media(forced-colors: active){.mat-mdc-menu-submenu-icon{fill:CanvasText}}.mat-mdc-menu-item .mat-mdc-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none} -`],encapsulation:2,changeDetection:0})}return t})(),tgA=new kA("mat-menu-scroll-strategy",{providedIn:"root",factory:()=>{let t=w(Dt);return()=>Z0(t)}});var FB=new WeakMap,igA=(()=>{class t{_canHaveBackdrop;_element=w(ce);_viewContainerRef=w(Mo);_menuItemInstance=w(Ml,{optional:!0,self:!0});_dir=w(fo,{optional:!0});_focusMonitor=w($a);_ngZone=w(qe);_injector=w(Dt);_scrollStrategy=w(tgA);_changeDetectorRef=w(wt);_animationsDisabled=An();_portal;_overlayRef=null;_menuOpen=!1;_closingActionsSubscription=bo.EMPTY;_menuCloseSubscription=bo.EMPTY;_pendingRemoval;_parentMaterialMenu;_parentInnerPadding;_openedBy=void 0;get _menu(){return this._menuInternal}set _menu(A){A!==this._menuInternal&&(this._menuInternal=A,this._menuCloseSubscription.unsubscribe(),A&&(this._parentMaterialMenu,this._menuCloseSubscription=A.close.subscribe(i=>{this._destroyMenu(i),(i==="click"||i==="tab")&&this._parentMaterialMenu&&this._parentMaterialMenu.closed.emit(i)})),this._menuItemInstance?._setTriggersSubmenu(this._triggersSubmenu()))}_menuInternal=null;constructor(A){this._canHaveBackdrop=A;let i=w(uM,{optional:!0});this._parentMaterialMenu=i instanceof Zs?i:void 0}ngOnDestroy(){this._menu&&this._ownsMenu(this._menu)&&FB.delete(this._menu),this._pendingRemoval?.unsubscribe(),this._menuCloseSubscription.unsubscribe(),this._closingActionsSubscription.unsubscribe(),this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null)}get menuOpen(){return this._menuOpen}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_triggersSubmenu(){return!!(this._menuItemInstance&&this._parentMaterialMenu&&this._menu)}_closeMenu(){this._menu?.close.emit()}_openMenu(A){if(this._triggerIsAriaDisabled())return;let i=this._menu;if(this._menuOpen||!i)return;this._pendingRemoval?.unsubscribe();let n=FB.get(i);FB.set(i,this),n&&n!==this&&n._closeMenu();let o=this._createOverlay(i),a=o.getConfig(),r=a.positionStrategy;this._setPosition(i,r),this._canHaveBackdrop?a.hasBackdrop=i.hasBackdrop==null?!this._triggersSubmenu():i.hasBackdrop:a.hasBackdrop=i.hasBackdrop??!1,o.hasAttached()||(o.attach(this._getPortal(i)),i.lazyContent?.attach(this.menuData)),this._closingActionsSubscription=this._menuClosingActions().subscribe(()=>this._closeMenu()),i.parentMenu=this._triggersSubmenu()?this._parentMaterialMenu:void 0,i.direction=this.dir,A&&i.focusFirstItem(this._openedBy||"program"),this._setIsMenuOpen(!0),i instanceof Zs&&(i._setIsOpen(!0),i._directDescendantItems.changes.pipe(Qt(i.close)).subscribe(()=>{r.withLockedPosition(!1).reapplyLastPosition(),r.withLockedPosition(!0)}))}focus(A,i){this._focusMonitor&&A?this._focusMonitor.focusVia(this._element,A,i):this._element.nativeElement.focus(i)}_destroyMenu(A){let i=this._overlayRef,n=this._menu;!i||!this.menuOpen||(this._closingActionsSubscription.unsubscribe(),this._pendingRemoval?.unsubscribe(),n instanceof Zs&&this._ownsMenu(n)?(this._pendingRemoval=n._animationDone.pipe(uo(1)).subscribe(()=>{i.detach(),FB.has(n)||n.lazyContent?.detach()}),n._setIsOpen(!1)):(i.detach(),n?.lazyContent?.detach()),n&&this._ownsMenu(n)&&FB.delete(n),this.restoreFocus&&(A==="keydown"||!this._openedBy||!this._triggersSubmenu())&&this.focus(this._openedBy),this._openedBy=void 0,this._setIsMenuOpen(!1))}_setIsMenuOpen(A){A!==this._menuOpen&&(this._menuOpen=A,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this._triggersSubmenu()&&this._menuItemInstance._setHighlighted(A),this._changeDetectorRef.markForCheck())}_createOverlay(A){if(!this._overlayRef){let i=this._getOverlayConfig(A);this._subscribeToPositions(A,i.positionStrategy),this._overlayRef=Yg(this._injector,i),this._overlayRef.keydownEvents().subscribe(n=>{this._menu instanceof Zs&&this._menu._handleKeydown(n)})}return this._overlayRef}_getOverlayConfig(A){return new Jg({positionStrategy:y1(this._injector,this._getOverlayOrigin()).withLockedPosition().withGrowAfterOpen().withTransformOriginOn(".mat-menu-panel, .mat-mdc-menu-panel"),backdropClass:A.backdropClass||"cdk-overlay-transparent-backdrop",panelClass:A.overlayPanelClass,scrollStrategy:this._scrollStrategy(),direction:this._dir||"ltr",disableAnimations:this._animationsDisabled})}_subscribeToPositions(A,i){A.setPositionClasses&&i.positionChanges.subscribe(n=>{this._ngZone.run(()=>{let o=n.connectionPair.overlayX==="start"?"after":"before",a=n.connectionPair.overlayY==="top"?"below":"above";A.setPositionClasses(o,a)})})}_setPosition(A,i){let[n,o]=A.xPosition==="before"?["end","start"]:["start","end"],[a,r]=A.yPosition==="above"?["bottom","top"]:["top","bottom"],[s,l]=[a,r],[g,C]=[n,o],I=0;if(this._triggersSubmenu()){if(C=n=A.xPosition==="before"?"start":"end",o=g=n==="end"?"start":"end",this._parentMaterialMenu){if(this._parentInnerPadding==null){let d=this._parentMaterialMenu.items.first;this._parentInnerPadding=d?d._getHostElement().offsetTop:0}I=a==="bottom"?this._parentInnerPadding:-this._parentInnerPadding}}else A.overlapTrigger||(s=a==="top"?"bottom":"top",l=r==="top"?"bottom":"top");i.withPositions([{originX:n,originY:s,overlayX:g,overlayY:a,offsetY:I},{originX:o,originY:s,overlayX:C,overlayY:a,offsetY:I},{originX:n,originY:l,overlayX:g,overlayY:r,offsetY:-I},{originX:o,originY:l,overlayX:C,overlayY:r,offsetY:-I}])}_menuClosingActions(){let A=this._getOutsideClickStream(this._overlayRef),i=this._overlayRef.detachments(),n=this._parentMaterialMenu?this._parentMaterialMenu.closed:ne(),o=this._parentMaterialMenu?this._parentMaterialMenu._hovered().pipe(gt(a=>this._menuOpen&&a!==this._menuItemInstance)):ne();return Ki(A,n,o,i)}_getPortal(A){return(!this._portal||this._portal.templateRef!==A.templateRef)&&(this._portal=new Jr(A.templateRef,this._viewContainerRef)),this._portal}_ownsMenu(A){return FB.get(A)===this}_triggerIsAriaDisabled(){return Be(this._element.nativeElement.getAttribute("aria-disabled"))}static \u0275fac=function(i){V3()};static \u0275dir=VA({type:t})}return t})(),$c=(()=>{class t extends igA{_cleanupTouchstart;_hoverSubscription=bo.EMPTY;get _deprecatedMatMenuTriggerFor(){return this.menu}set _deprecatedMatMenuTriggerFor(A){this.menu=A}get menu(){return this._menu}set menu(A){this._menu=A}menuData;restoreFocus=!0;menuOpened=new LA;onMenuOpen=this.menuOpened;menuClosed=new LA;onMenuClose=this.menuClosed;constructor(){super(!0);let A=w(Pi);this._cleanupTouchstart=A.listen(this._element.nativeElement,"touchstart",i=>{A1(i)||(this._openedBy="touch")},{passive:!0})}triggersSubmenu(){return super._triggersSubmenu()}toggleMenu(){return this.menuOpen?this.closeMenu():this.openMenu()}openMenu(){this._openMenu(!0)}closeMenu(){this._closeMenu()}updatePosition(){this._overlayRef?.updatePosition()}ngAfterContentInit(){this._handleHover()}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTouchstart(),this._hoverSubscription.unsubscribe()}_getOverlayOrigin(){return this._element}_getOutsideClickStream(A){return A.backdropClick()}_handleMousedown(A){$I(A)||(this._openedBy=A.button===0?"mouse":void 0,this.triggersSubmenu()&&A.preventDefault())}_handleKeydown(A){let i=A.keyCode;(i===13||i===32)&&(this._openedBy="keyboard"),this.triggersSubmenu()&&(i===39&&this.dir==="ltr"||i===37&&this.dir==="rtl")&&(this._openedBy="keyboard",this.openMenu())}_handleClick(A){this.triggersSubmenu()?(A.stopPropagation(),this.openMenu()):this.toggleMenu()}_handleHover(){this.triggersSubmenu()&&this._parentMaterialMenu&&(this._hoverSubscription=this._parentMaterialMenu._hovered().subscribe(A=>{A===this._menuItemInstance&&!A.disabled&&this._parentMaterialMenu?._panelAnimationState!=="void"&&(this._openedBy="mouse",this._openMenu(!1))}))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","mat-menu-trigger-for",""],["","matMenuTriggerFor",""]],hostAttrs:[1,"mat-mdc-menu-trigger"],hostVars:3,hostBindings:function(i,n){i&1&&U("click",function(a){return n._handleClick(a)})("mousedown",function(a){return n._handleMousedown(a)})("keydown",function(a){return n._handleKeydown(a)}),i&2&&te("aria-haspopup",n.menu?"menu":null)("aria-expanded",n.menuOpen)("aria-controls",n.menuOpen?n.menu==null?null:n.menu.panelId:null)},inputs:{_deprecatedMatMenuTriggerFor:[0,"mat-menu-trigger-for","_deprecatedMatMenuTriggerFor"],menu:[0,"matMenuTriggerFor","menu"],menuData:[0,"matMenuTriggerData","menuData"],restoreFocus:[0,"matMenuTriggerRestoreFocus","restoreFocus"]},outputs:{menuOpened:"menuOpened",onMenuOpen:"onMenuOpen",menuClosed:"menuClosed",onMenuClose:"onMenuClose"},exportAs:["matMenuTrigger"],features:[mt]})}return t})();var LB=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Yc,Zl,fi,Vc]})}return t})();var ngA=["text"],ogA=[[["mat-icon"]],"*"],agA=["mat-icon","*"];function rgA(t,e){if(t&1&&hA(0,"mat-pseudo-checkbox",1),t&2){let A=p();H("disabled",A.disabled)("state",A.selected?"checked":"unchecked")}}function sgA(t,e){if(t&1&&hA(0,"mat-pseudo-checkbox",3),t&2){let A=p();H("disabled",A.disabled)}}function lgA(t,e){if(t&1&&(B(0,"span",4),y(1),Q()),t&2){let A=p();u(),ue("(",A.group.label,")")}}var t6=new kA("MAT_OPTION_PARENT_COMPONENT"),i6=new kA("MatOptgroup");var e6=class{source;isUserInput;constructor(e,A=!1){this.source=e,this.isUserInput=A}},Yr=(()=>{class t{_element=w(ce);_changeDetectorRef=w(wt);_parent=w(t6,{optional:!0});group=w(i6,{optional:!0});_signalDisableRipple=!1;_selected=!1;_active=!1;_mostRecentViewValue="";get multiple(){return this._parent&&this._parent.multiple}get selected(){return this._selected}value;id=w(In).getId("mat-option-");get disabled(){return this.group&&this.group.disabled||this._disabled()}set disabled(A){this._disabled.set(A)}_disabled=bA(!1);get disableRipple(){return this._signalDisableRipple?this._parent.disableRipple():!!this._parent?.disableRipple}get hideSingleSelectionIndicator(){return!!(this._parent&&this._parent.hideSingleSelectionIndicator)}onSelectionChange=new LA;_text;_stateChanges=new ie;constructor(){let A=w(eo);A.load(lr),A.load(o2),this._signalDisableRipple=!!this._parent&&VI(this._parent.disableRipple)}get active(){return this._active}get viewValue(){return(this._text?.nativeElement.textContent||"").trim()}select(A=!0){this._selected||(this._selected=!0,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}deselect(A=!0){this._selected&&(this._selected=!1,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}focus(A,i){let n=this._getHostElement();typeof n.focus=="function"&&n.focus(i)}setActiveStyles(){this._active||(this._active=!0,this._changeDetectorRef.markForCheck())}setInactiveStyles(){this._active&&(this._active=!1,this._changeDetectorRef.markForCheck())}getLabel(){return this.viewValue}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!Qa(A)&&(this._selectViaInteraction(),A.preventDefault())}_selectViaInteraction(){this.disabled||(this._selected=this.multiple?!this._selected:!0,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent(!0))}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._element.nativeElement}ngAfterViewChecked(){if(this._selected){let A=this.viewValue;A!==this._mostRecentViewValue&&(this._mostRecentViewValue&&this._stateChanges.next(),this._mostRecentViewValue=A)}}ngOnDestroy(){this._stateChanges.complete()}_emitSelectionChangeEvent(A=!1){this.onSelectionChange.emit(new e6(this,A))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-option"]],viewQuery:function(i,n){if(i&1&&Jt(ngA,7),i&2){let o;ae(o=re())&&(n._text=o.first)}},hostAttrs:["role","option",1,"mat-mdc-option","mdc-list-item"],hostVars:11,hostBindings:function(i,n){i&1&&U("click",function(){return n._selectViaInteraction()})("keydown",function(a){return n._handleKeydown(a)}),i&2&&(ha("id",n.id),te("aria-selected",n.selected)("aria-disabled",n.disabled.toString()),RA("mdc-list-item--selected",n.selected)("mat-mdc-option-multiple",n.multiple)("mat-mdc-option-active",n.active)("mdc-list-item--disabled",n.disabled))},inputs:{value:"value",id:"id",disabled:[2,"disabled","disabled",Be]},outputs:{onSelectionChange:"onSelectionChange"},exportAs:["matOption"],ngContentSelectors:agA,decls:8,vars:5,consts:[["text",""],["aria-hidden","true",1,"mat-mdc-option-pseudo-checkbox",3,"disabled","state"],[1,"mdc-list-item__primary-text"],["state","checked","aria-hidden","true","appearance","minimal",1,"mat-mdc-option-pseudo-checkbox",3,"disabled"],[1,"cdk-visually-hidden"],["aria-hidden","true","mat-ripple","",1,"mat-mdc-option-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled"]],template:function(i,n){i&1&&(Rt(ogA),O(0,rgA,1,2,"mat-pseudo-checkbox",1),Ve(1),B(2,"span",2,0),Ve(4,1),Q(),O(5,sgA,1,1,"mat-pseudo-checkbox",3),O(6,lgA,2,1,"span",4),hA(7,"div",5)),i&2&&(Y(n.multiple?0:-1),u(5),Y(!n.multiple&&n.selected&&!n.hideSingleSelectionIndicator?5:-1),u(),Y(n.group&&n.group._inert?6:-1),u(),H("matRippleTrigger",n._getHostElement())("matRippleDisabled",n.disabled||n.disableRipple))},dependencies:[Gm,rs],styles:[`.mat-mdc-option{-webkit-user-select:none;user-select:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;min-height:48px;padding:0 16px;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0);color:var(--mat-option-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-option-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-option-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-option-label-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-option-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-option-label-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-option:hover:not(.mdc-list-item--disabled){background-color:var(--mat-option-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:var(--mat-option-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent));outline:0}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-active,.mat-mdc-option-multiple,:focus,:hover){background-color:var(--mat-option-selected-state-layer-color, var(--mat-sys-secondary-container))}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-active,.mat-mdc-option-multiple,:focus,:hover) .mdc-list-item__primary-text{color:var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option.mdc-list-item{align-items:center;background:rgba(0,0,0,0)}.mat-mdc-option.mdc-list-item--disabled{cursor:default;pointer-events:none}.mat-mdc-option.mdc-list-item--disabled .mat-mdc-option-pseudo-checkbox,.mat-mdc-option.mdc-list-item--disabled .mdc-list-item__primary-text,.mat-mdc-option.mdc-list-item--disabled>mat-icon{opacity:.38}.mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:32px}[dir=rtl] .mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:16px;padding-right:32px}.mat-mdc-option .mat-icon,.mat-mdc-option .mat-pseudo-checkbox-full{margin-right:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-icon,[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:0;margin-left:16px}.mat-mdc-option .mat-pseudo-checkbox-minimal{margin-left:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-minimal{margin-right:16px;margin-left:0}.mat-mdc-option .mat-mdc-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-option .mdc-list-item__primary-text{white-space:normal;font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;margin-right:auto}[dir=rtl] .mat-mdc-option .mdc-list-item__primary-text{margin-right:0;margin-left:auto}@media(forced-colors: active){.mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{content:"";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}[dir=rtl] .mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{right:auto;left:16px}}.mat-mdc-option-multiple{--mat-list-list-item-selected-container-color: var(--mat-list-list-item-container-color, transparent)}.mat-mdc-option-active .mat-focus-indicator::before{content:""} -`],encapsulation:2,changeDetection:0})}return t})();function pM(t,e,A){if(A.length){let i=e.toArray(),n=A.toArray(),o=0;for(let a=0;aA+i?Math.max(0,t-i+e):A}var PT=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();var wM=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Yc,PT,Yr,fi]})}return t})();var ggA=["trigger"],cgA=["panel"],CgA=[[["mat-select-trigger"]],"*"],IgA=["mat-select-trigger","*"];function dgA(t,e){if(t&1&&(B(0,"span",4),y(1),Q()),t&2){let A=p();u(),lA(A.placeholder)}}function BgA(t,e){t&1&&Ve(0)}function EgA(t,e){if(t&1&&(B(0,"span",11),y(1),Q()),t&2){let A=p(2);u(),lA(A.triggerValue)}}function hgA(t,e){if(t&1&&(B(0,"span",5),O(1,BgA,1,0)(2,EgA,2,1,"span",11),Q()),t&2){let A=p();u(),Y(A.customTrigger?1:2)}}function QgA(t,e){if(t&1){let A=QA();B(0,"div",12,1),U("keydown",function(n){T(A);let o=p();return J(o._handleKeydown(n))}),Ve(2,1),Q()}if(t&2){let A=p();ro(A.panelClass),RA("mat-select-panel-animations-enabled",!A._animationsDisabled)("mat-primary",(A._parentFormField==null?null:A._parentFormField.color)==="primary")("mat-accent",(A._parentFormField==null?null:A._parentFormField.color)==="accent")("mat-warn",(A._parentFormField==null?null:A._parentFormField.color)==="warn")("mat-undefined",!(A._parentFormField!=null&&A._parentFormField.color)),te("id",A.id+"-panel")("aria-multiselectable",A.multiple)("aria-label",A.ariaLabel||null)("aria-labelledby",A._getPanelAriaLabelledby())}}var ugA=new kA("mat-select-scroll-strategy",{providedIn:"root",factory:()=>{let t=w(Dt);return()=>Z0(t)}}),fgA=new kA("MAT_SELECT_CONFIG"),pgA=new kA("MatSelectTrigger"),DM=class{source;value;constructor(e,A){this.source=e,this.value=A}},Xl=(()=>{class t{_viewportRuler=w(Ms);_changeDetectorRef=w(wt);_elementRef=w(ce);_dir=w(fo,{optional:!0});_idGenerator=w(In);_renderer=w(Pi);_parentFormField=w(tu,{optional:!0});ngControl=w(Hs,{self:!0,optional:!0});_liveAnnouncer=w(VQ);_defaultOptions=w(fgA,{optional:!0});_animationsDisabled=An();_popoverLocation;_initialized=new ie;_cleanupDetach;options;optionGroups;customTrigger;_positions=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"}];_scrollOptionIntoView(A){let i=this.options.toArray()[A];if(i){let n=this.panel.nativeElement,o=pM(A,this.options,this.optionGroups),a=i._getHostElement();A===0&&o===1?n.scrollTop=0:n.scrollTop=mM(a.offsetTop,a.offsetHeight,n.scrollTop,n.offsetHeight)}}_positioningSettled(){this._scrollOptionIntoView(this._keyManager.activeItemIndex||0)}_getChangeEvent(A){return new DM(this,A)}_scrollStrategyFactory=w(ugA);_panelOpen=!1;_compareWith=(A,i)=>A===i;_uid=this._idGenerator.getId("mat-select-");_triggerAriaLabelledBy=null;_previousControl;_destroy=new ie;_errorStateTracker;stateChanges=new ie;disableAutomaticLabeling=!0;userAriaDescribedBy;_selectionModel;_keyManager;_preferredOverlayOrigin;_overlayWidth;_onChange=()=>{};_onTouched=()=>{};_valueId=this._idGenerator.getId("mat-select-value-");_scrollStrategy;_overlayPanelClass=this._defaultOptions?.overlayPanelClass||"";get focused(){return this._focused||this._panelOpen}_focused=!1;controlType="mat-select";trigger;panel;_overlayDir;panelClass;disabled=!1;get disableRipple(){return this._disableRipple()}set disableRipple(A){this._disableRipple.set(A)}_disableRipple=bA(!1);tabIndex=0;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncParentProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get placeholder(){return this._placeholder}set placeholder(A){this._placeholder=A,this.stateChanges.next()}_placeholder;get required(){return this._required??this.ngControl?.control?.hasValidator(Ys.required)??!1}set required(A){this._required=A,this.stateChanges.next()}_required;get multiple(){return this._multiple}set multiple(A){this._selectionModel,this._multiple=A}_multiple=!1;disableOptionCentering=this._defaultOptions?.disableOptionCentering??!1;get compareWith(){return this._compareWith}set compareWith(A){this._compareWith=A,this._selectionModel&&this._initializeSelection()}get value(){return this._value}set value(A){this._assignValue(A)&&this._onChange(A)}_value;ariaLabel="";ariaLabelledby;get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}typeaheadDebounceInterval;sortComparator;get id(){return this._id}set id(A){this._id=A||this._uid,this.stateChanges.next()}_id;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}panelWidth=this._defaultOptions&&typeof this._defaultOptions.panelWidth<"u"?this._defaultOptions.panelWidth:"auto";canSelectNullableOptions=this._defaultOptions?.canSelectNullableOptions??!1;optionSelectionChanges=Fc(()=>{let A=this.options;return A?A.changes.pipe(Sn(A),hi(()=>Ki(...A.map(i=>i.onSelectionChange)))):this._initialized.pipe(hi(()=>this.optionSelectionChanges))});openedChange=new LA;_openedStream=this.openedChange.pipe(gt(A=>A),we(()=>{}));_closedStream=this.openedChange.pipe(gt(A=>!A),we(()=>{}));selectionChange=new LA;valueChange=new LA;constructor(){let A=w(gB),i=w(eB,{optional:!0}),n=w(i2,{optional:!0}),o=w(new Us("tabindex"),{optional:!0}),a=w(Gu,{optional:!0});this.ngControl&&(this.ngControl.valueAccessor=this),this._defaultOptions?.typeaheadDebounceInterval!=null&&(this.typeaheadDebounceInterval=this._defaultOptions.typeaheadDebounceInterval),this._errorStateTracker=new cB(A,this.ngControl,n,i,this.stateChanges),this._scrollStrategy=this._scrollStrategyFactory(),this.tabIndex=o==null?0:parseInt(o)||0,this._popoverLocation=a?.usePopover===!1?null:"inline",this.id=this.id}ngOnInit(){this._selectionModel=new V0(this.multiple),this.stateChanges.next(),this._viewportRuler.change().pipe(Qt(this._destroy)).subscribe(()=>{this.panelOpen&&(this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._changeDetectorRef.detectChanges())})}ngAfterContentInit(){this._initialized.next(),this._initialized.complete(),this._initKeyManager(),this._selectionModel.changed.pipe(Qt(this._destroy)).subscribe(A=>{A.added.forEach(i=>i.select()),A.removed.forEach(i=>i.deselect())}),this.options.changes.pipe(Sn(null),Qt(this._destroy)).subscribe(()=>{this._resetOptions(),this._initializeSelection()})}ngDoCheck(){let A=this._getTriggerAriaLabelledby(),i=this.ngControl;if(A!==this._triggerAriaLabelledBy){let n=this._elementRef.nativeElement;this._triggerAriaLabelledBy=A,A?n.setAttribute("aria-labelledby",A):n.removeAttribute("aria-labelledby")}i&&(this._previousControl!==i.control&&(this._previousControl!==void 0&&i.disabled!==null&&i.disabled!==this.disabled&&(this.disabled=i.disabled),this._previousControl=i.control),this.updateErrorState())}ngOnChanges(A){(A.disabled||A.userAriaDescribedBy)&&this.stateChanges.next(),A.typeaheadDebounceInterval&&this._keyManager&&this._keyManager.withTypeAhead(this.typeaheadDebounceInterval),A.panelClass&&this.panelClass instanceof Set&&(this.panelClass=Array.from(this.panelClass))}ngOnDestroy(){this._cleanupDetach?.(),this._keyManager?.destroy(),this._destroy.next(),this._destroy.complete(),this.stateChanges.complete(),this._clearFromModal()}toggle(){this.panelOpen?this.close():this.open()}open(){this._canOpen()&&(this._parentFormField&&(this._preferredOverlayOrigin=this._parentFormField.getConnectedOverlayOrigin()),this._cleanupDetach?.(),this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._applyModalPanelOwnership(),this._panelOpen=!0,this._overlayDir.positionChange.pipe(uo(1)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this._positioningSettled()}),this._overlayDir.attachOverlay(),this._keyManager.withHorizontalOrientation(null),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this.stateChanges.next(),Promise.resolve().then(()=>this.openedChange.emit(!0)))}_trackedModal=null;_applyModalPanelOwnership(){let A=this._elementRef.nativeElement.closest('body > .cdk-overlay-container [aria-modal="true"]');if(!A)return;let i=`${this.id}-panel`;this._trackedModal&&yp(this._trackedModal,"aria-owns",i),Sb(A,"aria-owns",i),this._trackedModal=A}_clearFromModal(){if(!this._trackedModal)return;let A=`${this.id}-panel`;yp(this._trackedModal,"aria-owns",A),this._trackedModal=null}close(){this._panelOpen&&(this._panelOpen=!1,this._exitAndDetach(),this._keyManager.withHorizontalOrientation(this._isRtl()?"rtl":"ltr"),this._changeDetectorRef.markForCheck(),this._onTouched(),this.stateChanges.next(),Promise.resolve().then(()=>this.openedChange.emit(!1)))}_exitAndDetach(){if(this._animationsDisabled||!this.panel){this._detachOverlay();return}this._cleanupDetach?.(),this._cleanupDetach=()=>{i(),clearTimeout(n),this._cleanupDetach=void 0};let A=this.panel.nativeElement,i=this._renderer.listen(A,"animationend",o=>{o.animationName==="_mat-select-exit"&&(this._cleanupDetach?.(),this._detachOverlay())}),n=setTimeout(()=>{this._cleanupDetach?.(),this._detachOverlay()},200);A.classList.add("mat-select-panel-exit")}_detachOverlay(){this._overlayDir.detachOverlay(),this._changeDetectorRef.markForCheck()}writeValue(A){this._assignValue(A)}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck(),this.stateChanges.next()}get panelOpen(){return this._panelOpen}get selected(){return this.multiple?this._selectionModel?.selected||[]:this._selectionModel?.selected[0]}get triggerValue(){if(this.empty)return"";if(this._multiple){let A=this._selectionModel.selected.map(i=>i.viewValue);return this._isRtl()&&A.reverse(),A.join(", ")}return this._selectionModel.selected[0].viewValue}updateErrorState(){this._errorStateTracker.updateErrorState()}_isRtl(){return this._dir?this._dir.value==="rtl":!1}_handleKeydown(A){this.disabled||(this.panelOpen?this._handleOpenKeydown(A):this._handleClosedKeydown(A))}_handleClosedKeydown(A){let i=A.keyCode,n=i===40||i===38||i===37||i===39,o=i===13||i===32,a=this._keyManager;if(!a.isTyping()&&o&&!Qa(A)||(this.multiple||A.altKey)&&n)A.preventDefault(),this.open();else if(!this.multiple){let r=this.selected;a.onKeydown(A);let s=this.selected;s&&r!==s&&this._liveAnnouncer.announce(s.viewValue,1e4)}}_handleOpenKeydown(A){let i=this._keyManager,n=A.keyCode,o=n===40||n===38,a=i.isTyping();if(o&&A.altKey)A.preventDefault(),this.close();else if(!a&&(n===13||n===32)&&i.activeItem&&!Qa(A))A.preventDefault(),i.activeItem._selectViaInteraction();else if(!a&&this._multiple&&n===65&&A.ctrlKey){A.preventDefault();let r=this.options.some(s=>!s.disabled&&!s.selected);this.options.forEach(s=>{s.disabled||(r?s.select():s.deselect())})}else{let r=i.activeItemIndex;i.onKeydown(A),this._multiple&&o&&A.shiftKey&&i.activeItem&&i.activeItemIndex!==r&&i.activeItem._selectViaInteraction()}}_handleOverlayKeydown(A){A.keyCode===27&&!Qa(A)&&(A.preventDefault(),this.close())}_onFocus(){this.disabled||(this._focused=!0,this.stateChanges.next())}_onBlur(){this._focused=!1,this._keyManager?.cancelTypeahead(),!this.disabled&&!this.panelOpen&&(this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}get empty(){return!this._selectionModel||this._selectionModel.isEmpty()}_initializeSelection(){Promise.resolve().then(()=>{this.ngControl&&(this._value=this.ngControl.value),this._setSelectionByValue(this._value),this.stateChanges.next()})}_setSelectionByValue(A){if(this.options.forEach(i=>i.setInactiveStyles()),this._selectionModel.clear(),this.multiple&&A)Array.isArray(A),A.forEach(i=>this._selectOptionByValue(i)),this._sortValues();else{let i=this._selectOptionByValue(A);i?this._keyManager.updateActiveItem(i):this.panelOpen||this._keyManager.updateActiveItem(-1)}this._changeDetectorRef.markForCheck()}_selectOptionByValue(A){let i=this.options.find(n=>{if(this._selectionModel.isSelected(n))return!1;try{return(n.value!=null||this.canSelectNullableOptions)&&this._compareWith(n.value,A)}catch(o){return!1}});return i&&this._selectionModel.select(i),i}_assignValue(A){return A!==this._value||this._multiple&&Array.isArray(A)?(this.options&&this._setSelectionByValue(A),this._value=A,!0):!1}_skipPredicate=A=>this.panelOpen?!1:A.disabled;_getOverlayWidth(A){return this.panelWidth==="auto"?(A instanceof RB?A.elementRef:A||this._elementRef).nativeElement.getBoundingClientRect().width:this.panelWidth===null?"":this.panelWidth}_syncParentProperties(){if(this.options)for(let A of this.options)A._changeDetectorRef.markForCheck()}_initKeyManager(){this._keyManager=new ZQ(this.options).withTypeAhead(this.typeaheadDebounceInterval).withVerticalOrientation().withHorizontalOrientation(this._isRtl()?"rtl":"ltr").withHomeAndEnd().withPageUpDown().withAllowedModifierKeys(["shiftKey"]).skipPredicate(this._skipPredicate),this._keyManager.tabOut.subscribe(()=>{this.panelOpen&&(!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction(),this.focus(),this.close())}),this._keyManager.change.subscribe(()=>{this._panelOpen&&this.panel?this._scrollOptionIntoView(this._keyManager.activeItemIndex||0):!this._panelOpen&&!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction()})}_resetOptions(){let A=Ki(this.options.changes,this._destroy);this.optionSelectionChanges.pipe(Qt(A)).subscribe(i=>{this._onSelect(i.source,i.isUserInput),i.isUserInput&&!this.multiple&&this._panelOpen&&(this.close(),this.focus())}),Ki(...this.options.map(i=>i._stateChanges)).pipe(Qt(A)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this.stateChanges.next()})}_onSelect(A,i){let n=this._selectionModel.isSelected(A);!this.canSelectNullableOptions&&A.value==null&&!this._multiple?(A.deselect(),this._selectionModel.clear(),this.value!=null&&this._propagateChanges(A.value)):(n!==A.selected&&(A.selected?this._selectionModel.select(A):this._selectionModel.deselect(A)),i&&this._keyManager.setActiveItem(A),this.multiple&&(this._sortValues(),i&&this.focus())),n!==this._selectionModel.isSelected(A)&&this._propagateChanges(),this.stateChanges.next()}_sortValues(){if(this.multiple){let A=this.options.toArray();this._selectionModel.sort((i,n)=>this.sortComparator?this.sortComparator(i,n,A):A.indexOf(i)-A.indexOf(n)),this.stateChanges.next()}}_propagateChanges(A){let i;this.multiple?i=this.selected.map(n=>n.value):i=this.selected?this.selected.value:A,this._value=i,this.valueChange.emit(i),this._onChange(i),this.selectionChange.emit(this._getChangeEvent(i)),this._changeDetectorRef.markForCheck()}_highlightCorrectOption(){if(this._keyManager)if(this.empty){let A=-1;for(let i=0;i0&&!!this._overlayDir}focus(A){this._elementRef.nativeElement.focus(A)}_getPanelAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||null,i=A?A+" ":"";return this.ariaLabelledby?i+this.ariaLabelledby:A}_getAriaActiveDescendant(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null}_getTriggerAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||"";return this.ariaLabelledby&&(A+=" "+this.ariaLabelledby),A||(A=this._valueId),A}get describedByIds(){return this._elementRef.nativeElement.getAttribute("aria-describedby")?.split(" ")||[]}setDescribedByIds(A){let i=this._elementRef.nativeElement;A.length?i.setAttribute("aria-describedby",A.join(" ")):i.removeAttribute("aria-describedby")}onContainerClick(A){let i=Ur(A);i&&(i.tagName==="MAT-OPTION"||i.classList.contains("cdk-overlay-backdrop")||i.closest(".mat-mdc-select-panel"))||(this.focus(),this.open())}get shouldLabelFloat(){return this.panelOpen||!this.empty||this.focused&&!!this.placeholder}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-select"]],contentQueries:function(i,n,o){if(i&1&&jo(o,pgA,5)(o,Yr,5)(o,i6,5),i&2){let a;ae(a=re())&&(n.customTrigger=a.first),ae(a=re())&&(n.options=a),ae(a=re())&&(n.optionGroups=a)}},viewQuery:function(i,n){if(i&1&&Jt(ggA,5)(cgA,5)(Vm,5),i&2){let o;ae(o=re())&&(n.trigger=o.first),ae(o=re())&&(n.panel=o.first),ae(o=re())&&(n._overlayDir=o.first)}},hostAttrs:["role","combobox","aria-haspopup","listbox",1,"mat-mdc-select"],hostVars:21,hostBindings:function(i,n){i&1&&U("keydown",function(a){return n._handleKeydown(a)})("focus",function(){return n._onFocus()})("blur",function(){return n._onBlur()}),i&2&&(te("id",n.id)("tabindex",n.disabled?-1:n.tabIndex)("aria-controls",n.panelOpen?n.id+"-panel":null)("aria-expanded",n.panelOpen)("aria-label",n.ariaLabel||null)("aria-required",n.required.toString())("aria-disabled",n.disabled.toString())("aria-invalid",n.errorState)("aria-activedescendant",n._getAriaActiveDescendant()),RA("mat-mdc-select-disabled",n.disabled)("mat-mdc-select-invalid",n.errorState)("mat-mdc-select-required",n.required)("mat-mdc-select-empty",n.empty)("mat-mdc-select-multiple",n.multiple)("mat-select-open",n.panelOpen))},inputs:{userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],panelClass:"panelClass",disabled:[2,"disabled","disabled",Be],disableRipple:[2,"disableRipple","disableRipple",Be],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:Cn(A)],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",Be],placeholder:"placeholder",required:[2,"required","required",Be],multiple:[2,"multiple","multiple",Be],disableOptionCentering:[2,"disableOptionCentering","disableOptionCentering",Be],compareWith:"compareWith",value:"value",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],errorStateMatcher:"errorStateMatcher",typeaheadDebounceInterval:[2,"typeaheadDebounceInterval","typeaheadDebounceInterval",Cn],sortComparator:"sortComparator",id:"id",panelWidth:"panelWidth",canSelectNullableOptions:[2,"canSelectNullableOptions","canSelectNullableOptions",Be]},outputs:{openedChange:"openedChange",_openedStream:"opened",_closedStream:"closed",selectionChange:"selectionChange",valueChange:"valueChange"},exportAs:["matSelect"],features:[Bt([{provide:eu,useExisting:t},{provide:t6,useExisting:t}]),Yt],ngContentSelectors:IgA,decls:11,vars:10,consts:[["fallbackOverlayOrigin","cdkOverlayOrigin","trigger",""],["panel",""],["cdk-overlay-origin","",1,"mat-mdc-select-trigger",3,"click"],[1,"mat-mdc-select-value"],[1,"mat-mdc-select-placeholder","mat-mdc-select-min-line"],[1,"mat-mdc-select-value-text"],[1,"mat-mdc-select-arrow-wrapper"],[1,"mat-mdc-select-arrow"],["viewBox","0 0 24 24","width","24px","height","24px","focusable","false","aria-hidden","true"],["d","M7 10l5 5 5-5z"],["cdk-connected-overlay","","cdkConnectedOverlayHasBackdrop","","cdkConnectedOverlayBackdropClass","cdk-overlay-transparent-backdrop",3,"detach","backdropClick","overlayKeydown","cdkConnectedOverlayDisableClose","cdkConnectedOverlayPanelClass","cdkConnectedOverlayScrollStrategy","cdkConnectedOverlayOrigin","cdkConnectedOverlayPositions","cdkConnectedOverlayWidth","cdkConnectedOverlayFlexibleDimensions","cdkConnectedOverlayUsePopover"],[1,"mat-mdc-select-min-line"],["role","listbox","tabindex","-1",1,"mat-mdc-select-panel","mdc-menu-surface","mdc-menu-surface--open",3,"keydown"]],template:function(i,n){if(i&1&&(Rt(CgA),B(0,"div",2,0),U("click",function(){return n.open()}),B(3,"div",3),O(4,dgA,2,1,"span",4)(5,hgA,3,1,"span",5),Q(),B(6,"div",6)(7,"div",7),Ct(),B(8,"svg",8),hA(9,"path",9),Q()()()(),Et(10,QgA,3,16,"ng-template",10),U("detach",function(){return n.close()})("backdropClick",function(){return n.close()})("overlayKeydown",function(a){return n._handleOverlayKeydown(a)})),i&2){let o=Qi(1);u(3),te("id",n._valueId),u(),Y(n.empty?4:5),u(6),H("cdkConnectedOverlayDisableClose",!0)("cdkConnectedOverlayPanelClass",n._overlayPanelClass)("cdkConnectedOverlayScrollStrategy",n._scrollStrategy)("cdkConnectedOverlayOrigin",n._preferredOverlayOrigin||o)("cdkConnectedOverlayPositions",n._positions)("cdkConnectedOverlayWidth",n._overlayWidth)("cdkConnectedOverlayFlexibleDimensions",!0)("cdkConnectedOverlayUsePopover",n._popoverLocation)}},dependencies:[RB,Vm],styles:[`@keyframes _mat-select-enter{from{opacity:0;transform:scaleY(0.8)}to{opacity:1;transform:none}}@keyframes _mat-select-exit{from{opacity:1}to{opacity:0}}.mat-mdc-select{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-sys-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-sys-body-large-tracking))}div.mat-mdc-select-panel{box-shadow:var(--mat-select-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12))}.mat-mdc-select-disabled{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-disabled .mat-mdc-select-placeholder{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-trigger{display:inline-flex;align-items:center;cursor:pointer;position:relative;box-sizing:border-box;width:100%}.mat-mdc-select-disabled .mat-mdc-select-trigger{-webkit-user-select:none;user-select:none;cursor:default}.mat-mdc-select-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-mdc-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-mdc-select-arrow-wrapper{height:24px;flex-shrink:0;display:inline-flex;align-items:center}.mat-form-field-appearance-fill .mdc-text-field--no-label .mat-mdc-select-arrow-wrapper{transform:none}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-invalid .mat-mdc-select-arrow,.mat-form-field-invalid:not(.mat-form-field-disabled) .mat-mdc-form-field-infix::after{color:var(--mat-select-invalid-arrow-color, var(--mat-sys-error))}.mat-mdc-select-arrow{width:10px;height:5px;position:relative;color:var(--mat-select-enabled-arrow-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field.mat-focused .mat-mdc-select-arrow{color:var(--mat-select-focused-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-disabled .mat-mdc-select-arrow{color:var(--mat-select-disabled-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-select-open .mat-mdc-select-arrow{transform:rotate(180deg)}.mat-form-field-animations-enabled .mat-mdc-select-arrow{transition:transform 80ms linear}.mat-mdc-select-arrow svg{fill:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}@media(forced-colors: active){.mat-mdc-select-arrow svg{fill:CanvasText}.mat-mdc-select-disabled .mat-mdc-select-arrow svg{fill:GrayText}}div.mat-mdc-select-panel{width:100%;max-height:275px;outline:0;overflow:auto;padding:8px 0;border-radius:4px;box-sizing:border-box;position:relative;background-color:var(--mat-select-panel-background-color, var(--mat-sys-surface-container))}@media(forced-colors: active){div.mat-mdc-select-panel{outline:solid 1px}}.cdk-overlay-pane:not(.mat-mdc-select-panel-above) div.mat-mdc-select-panel{border-top-left-radius:0;border-top-right-radius:0;transform-origin:top center}.mat-mdc-select-panel-above div.mat-mdc-select-panel{border-bottom-left-radius:0;border-bottom-right-radius:0;transform-origin:bottom center}.mat-select-panel-animations-enabled{animation:_mat-select-enter 120ms cubic-bezier(0, 0, 0.2, 1)}.mat-select-panel-animations-enabled.mat-select-panel-exit{animation:_mat-select-exit 100ms linear}.mat-mdc-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1);color:var(--mat-select-placeholder-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field:not(.mat-form-field-animations-enabled) .mat-mdc-select-placeholder,._mat-animation-noopable .mat-mdc-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-mdc-select-placeholder{color:rgba(0,0,0,0);-webkit-text-fill-color:rgba(0,0,0,0);transition:none;display:block}.mat-mdc-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mat-mdc-floating-label{max-width:calc(100% - 18px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mdc-floating-label--float-above{max-width:calc(100%/0.75 - 24px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-text-field--label-floating .mdc-notched-outline__notch{max-width:calc(100% - 24px)}.mat-mdc-select-min-line:empty::before{content:" ";white-space:pre;width:1px;display:inline-block;visibility:hidden}.mat-form-field-appearance-fill .mat-mdc-select-arrow-wrapper{transform:var(--mat-select-arrow-transform, translateY(-8px))} -`],encapsulation:2,changeDetection:0})}return t})();var $0=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Zl,wM,fi,Vc,Ya,wM]})}return t})();var mgA=["tooltip"],wgA=20;var DgA=new kA("mat-tooltip-scroll-strategy",{providedIn:"root",factory:()=>{let t=w(Dt);return()=>Z0(t,{scrollThrottle:wgA})}}),ygA=new kA("mat-tooltip-default-options",{providedIn:"root",factory:()=>({showDelay:0,hideDelay:0,touchendHideDelay:1500})});var qT="tooltip-panel",vgA={passive:!0},bgA=8,MgA=8,SgA=24,kgA=200,dn=(()=>{class t{_elementRef=w(ce);_ngZone=w(qe);_platform=w(gi);_ariaDescriber=w(dG);_focusMonitor=w($a);_dir=w(fo);_injector=w(Dt);_viewContainerRef=w(Mo);_mediaMatcher=w(nB);_document=w(ti);_renderer=w(Pi);_animationsDisabled=An();_defaultOptions=w(ygA,{optional:!0});_overlayRef=null;_tooltipInstance=null;_overlayPanelClass;_portal;_position="below";_positionAtOrigin=!1;_disabled=!1;_tooltipClass;_viewInitialized=!1;_pointerExitEventsInitialized=!1;_tooltipComponent=VT;_viewportMargin=8;_currentPosition;_cssClassPrefix="mat-mdc";_ariaDescriptionPending=!1;_dirSubscribed=!1;get position(){return this._position}set position(A){A!==this._position&&(this._position=A,this._overlayRef&&(this._updatePosition(this._overlayRef),this._tooltipInstance?.show(0),this._overlayRef.updatePosition()))}get positionAtOrigin(){return this._positionAtOrigin}set positionAtOrigin(A){this._positionAtOrigin=mr(A),this._detach(),this._overlayRef=null}get disabled(){return this._disabled}set disabled(A){let i=mr(A);this._disabled!==i&&(this._disabled=i,i?this.hide(0):this._setupPointerEnterEventsIfNeeded(),this._syncAriaDescription(this.message))}get showDelay(){return this._showDelay}set showDelay(A){this._showDelay=zs(A)}_showDelay;get hideDelay(){return this._hideDelay}set hideDelay(A){this._hideDelay=zs(A),this._tooltipInstance&&(this._tooltipInstance._mouseLeaveHideDelay=this._hideDelay)}_hideDelay;touchGestures="auto";get message(){return this._message}set message(A){let i=this._message;this._message=A!=null?String(A).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._setupPointerEnterEventsIfNeeded(),this._updateTooltipMessage()),this._syncAriaDescription(i)}_message="";get tooltipClass(){return this._tooltipClass}set tooltipClass(A){this._tooltipClass=A,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)}_eventCleanups=[];_touchstartTimeout=null;_destroyed=new ie;_isDestroyed=!1;constructor(){let A=this._defaultOptions;A&&(this._showDelay=A.showDelay,this._hideDelay=A.hideDelay,A.position&&(this.position=A.position),A.positionAtOrigin&&(this.positionAtOrigin=A.positionAtOrigin),A.touchGestures&&(this.touchGestures=A.touchGestures),A.tooltipClass&&(this.tooltipClass=A.tooltipClass)),this._viewportMargin=bgA}ngAfterViewInit(){this._viewInitialized=!0,this._setupPointerEnterEventsIfNeeded(),this._focusMonitor.monitor(this._elementRef).pipe(Qt(this._destroyed)).subscribe(A=>{A?A==="keyboard"&&this._ngZone.run(()=>this.show()):this._ngZone.run(()=>this.hide(0))})}ngOnDestroy(){let A=this._elementRef.nativeElement;this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this._overlayRef&&(this._overlayRef.dispose(),this._tooltipInstance=null),this._eventCleanups.forEach(i=>i()),this._eventCleanups.length=0,this._destroyed.next(),this._destroyed.complete(),this._isDestroyed=!0,this._ariaDescriber.removeDescription(A,this.message,"tooltip"),this._focusMonitor.stopMonitoring(A)}show(A=this.showDelay,i){if(this.disabled||!this.message||this._isTooltipVisible()){this._tooltipInstance?._cancelPendingAnimations();return}let n=this._createOverlay(i);this._detach(),this._portal=this._portal||new Ss(this._tooltipComponent,this._viewContainerRef);let o=this._tooltipInstance=n.attach(this._portal).instance;o._triggerElement=this._elementRef.nativeElement,o._mouseLeaveHideDelay=this._hideDelay,o.afterHidden().pipe(Qt(this._destroyed)).subscribe(()=>this._detach()),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),o.show(A)}hide(A=this.hideDelay){let i=this._tooltipInstance;i&&(i.isVisible()?i.hide(A):(i._cancelPendingAnimations(),this._detach()))}toggle(A){this._isTooltipVisible()?this.hide():this.show(void 0,A)}_isTooltipVisible(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()}_createOverlay(A){if(this._overlayRef){let a=this._overlayRef.getConfig().positionStrategy;if((!this.positionAtOrigin||!A)&&a._origin instanceof ce)return this._overlayRef;this._detach()}let i=this._injector.get(Wc).getAncestorScrollContainers(this._elementRef),n=`${this._cssClassPrefix}-${qT}`,o=y1(this._injector,this.positionAtOrigin?A||this._elementRef:this._elementRef).withTransformOriginOn(`.${this._cssClassPrefix}-tooltip`).withFlexibleDimensions(!1).withViewportMargin(this._viewportMargin).withScrollableContainers(i).withPopoverLocation("global");return o.positionChanges.pipe(Qt(this._destroyed)).subscribe(a=>{this._updateCurrentPositionClass(a.connectionPair),this._tooltipInstance&&a.scrollableViewProperties.isOverlayClipped&&this._tooltipInstance.isVisible()&&this._ngZone.run(()=>this.hide(0))}),this._overlayRef=Yg(this._injector,{direction:this._dir,positionStrategy:o,panelClass:this._overlayPanelClass?[...this._overlayPanelClass,n]:n,scrollStrategy:this._injector.get(DgA)(),disableAnimations:this._animationsDisabled,eventPredicate:this._overlayEventPredicate}),this._updatePosition(this._overlayRef),this._overlayRef.detachments().pipe(Qt(this._destroyed)).subscribe(()=>this._detach()),this._overlayRef.outsidePointerEvents().pipe(Qt(this._destroyed)).subscribe(()=>this._tooltipInstance?._handleBodyInteraction()),this._overlayRef.keydownEvents().pipe(Qt(this._destroyed)).subscribe(a=>{a.preventDefault(),a.stopPropagation(),this._ngZone.run(()=>this.hide(0))}),this._defaultOptions?.disableTooltipInteractivity&&this._overlayRef.addPanelClass(`${this._cssClassPrefix}-tooltip-panel-non-interactive`),this._dirSubscribed||(this._dirSubscribed=!0,this._dir.change.pipe(Qt(this._destroyed)).subscribe(()=>{this._overlayRef&&this._updatePosition(this._overlayRef)})),this._overlayRef}_detach(){this._overlayRef&&this._overlayRef.hasAttached()&&this._overlayRef.detach(),this._tooltipInstance=null}_updatePosition(A){let i=A.getConfig().positionStrategy,n=this._getOrigin(),o=this._getOverlayPosition();i.withPositions([this._addOffset(gA(gA({},n.main),o.main)),this._addOffset(gA(gA({},n.fallback),o.fallback))])}_addOffset(A){let i=MgA,n=!this._dir||this._dir.value=="ltr";return A.originY==="top"?A.offsetY=-i:A.originY==="bottom"?A.offsetY=i:A.originX==="start"?A.offsetX=n?-i:i:A.originX==="end"&&(A.offsetX=n?i:-i),A}_getOrigin(){let A=!this._dir||this._dir.value=="ltr",i=this.position,n;i=="above"||i=="below"?n={originX:"center",originY:i=="above"?"top":"bottom"}:i=="before"||i=="left"&&A||i=="right"&&!A?n={originX:"start",originY:"center"}:(i=="after"||i=="right"&&A||i=="left"&&!A)&&(n={originX:"end",originY:"center"});let{x:o,y:a}=this._invertPosition(n.originX,n.originY);return{main:n,fallback:{originX:o,originY:a}}}_getOverlayPosition(){let A=!this._dir||this._dir.value=="ltr",i=this.position,n;i=="above"?n={overlayX:"center",overlayY:"bottom"}:i=="below"?n={overlayX:"center",overlayY:"top"}:i=="before"||i=="left"&&A||i=="right"&&!A?n={overlayX:"end",overlayY:"center"}:(i=="after"||i=="right"&&A||i=="left"&&!A)&&(n={overlayX:"start",overlayY:"center"});let{x:o,y:a}=this._invertPosition(n.overlayX,n.overlayY);return{main:n,fallback:{overlayX:o,overlayY:a}}}_updateTooltipMessage(){this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),Hn(()=>{this._tooltipInstance&&this._overlayRef.updatePosition()},{injector:this._injector}))}_setTooltipClass(A){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=A instanceof Set?Array.from(A):A,this._tooltipInstance._markForCheck())}_invertPosition(A,i){return this.position==="above"||this.position==="below"?i==="top"?i="bottom":i==="bottom"&&(i="top"):A==="end"?A="start":A==="start"&&(A="end"),{x:A,y:i}}_updateCurrentPositionClass(A){let{overlayY:i,originX:n,originY:o}=A,a;if(i==="center"?this._dir&&this._dir.value==="rtl"?a=n==="end"?"left":"right":a=n==="start"?"left":"right":a=i==="bottom"&&o==="top"?"above":"below",a!==this._currentPosition){let r=this._overlayRef;if(r){let s=`${this._cssClassPrefix}-${qT}-`;r.removePanelClass(s+this._currentPosition),r.addPanelClass(s+a)}this._currentPosition=a}}_setupPointerEnterEventsIfNeeded(){this._disabled||!this.message||!this._viewInitialized||this._eventCleanups.length||(this._isTouchPlatform()?this.touchGestures!=="off"&&(this._disableNativeGesturesIfNecessary(),this._addListener("touchstart",A=>{let i=A.targetTouches?.[0],n=i?{x:i.clientX,y:i.clientY}:void 0;this._setupPointerExitEventsIfNeeded(),this._touchstartTimeout&&clearTimeout(this._touchstartTimeout);let o=500;this._touchstartTimeout=setTimeout(()=>{this._touchstartTimeout=null,this.show(void 0,n)},this._defaultOptions?.touchLongPressShowDelay??o)})):this._addListener("mouseenter",A=>{this._setupPointerExitEventsIfNeeded();let i;A.x!==void 0&&A.y!==void 0&&(i=A),this.show(void 0,i)}))}_setupPointerExitEventsIfNeeded(){if(!this._pointerExitEventsInitialized){if(this._pointerExitEventsInitialized=!0,!this._isTouchPlatform())this._addListener("mouseleave",A=>{let i=A.relatedTarget;(!i||!this._overlayRef?.overlayElement.contains(i))&&this.hide()}),this._addListener("wheel",A=>{if(this._isTooltipVisible()){let i=this._document.elementFromPoint(A.clientX,A.clientY),n=this._elementRef.nativeElement;i!==n&&!n.contains(i)&&this.hide()}});else if(this.touchGestures!=="off"){this._disableNativeGesturesIfNecessary();let A=()=>{this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this.hide(this._defaultOptions?.touchendHideDelay)};this._addListener("touchend",A),this._addListener("touchcancel",A)}}}_addListener(A,i){this._eventCleanups.push(this._renderer.listen(this._elementRef.nativeElement,A,i,vgA))}_isTouchPlatform(){return this._platform.IOS||this._platform.ANDROID?!0:this._platform.isBrowser?!!this._defaultOptions?.detectHoverCapability&&this._mediaMatcher.matchMedia("(any-hover: none)").matches:!1}_disableNativeGesturesIfNecessary(){let A=this.touchGestures;if(A!=="off"){let i=this._elementRef.nativeElement,n=i.style;(A==="on"||i.nodeName!=="INPUT"&&i.nodeName!=="TEXTAREA")&&(n.userSelect=n.msUserSelect=n.webkitUserSelect=n.MozUserSelect="none"),(A==="on"||!i.draggable)&&(n.webkitUserDrag="none"),n.touchAction="none",n.webkitTapHighlightColor="transparent"}}_syncAriaDescription(A){this._ariaDescriptionPending||(this._ariaDescriptionPending=!0,this._ariaDescriber.removeDescription(this._elementRef.nativeElement,A,"tooltip"),this._isDestroyed||Hn({write:()=>{this._ariaDescriptionPending=!1,this.message&&!this.disabled&&this._ariaDescriber.describe(this._elementRef.nativeElement,this.message,"tooltip")}},{injector:this._injector}))}_overlayEventPredicate=A=>A.type==="keydown"?this._isTooltipVisible()&&A.keyCode===27&&!Qa(A):!0;static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matTooltip",""]],hostAttrs:[1,"mat-mdc-tooltip-trigger"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mat-mdc-tooltip-disabled",n.disabled)},inputs:{position:[0,"matTooltipPosition","position"],positionAtOrigin:[0,"matTooltipPositionAtOrigin","positionAtOrigin"],disabled:[0,"matTooltipDisabled","disabled"],showDelay:[0,"matTooltipShowDelay","showDelay"],hideDelay:[0,"matTooltipHideDelay","hideDelay"],touchGestures:[0,"matTooltipTouchGestures","touchGestures"],message:[0,"matTooltip","message"],tooltipClass:[0,"matTooltipClass","tooltipClass"]},exportAs:["matTooltip"]})}return t})(),VT=(()=>{class t{_changeDetectorRef=w(wt);_elementRef=w(ce);_isMultiline=!1;message;tooltipClass;_showTimeoutId;_hideTimeoutId;_triggerElement;_mouseLeaveHideDelay;_animationsDisabled=An();_tooltip;_closeOnInteraction=!1;_isVisible=!1;_onHide=new ie;_showAnimation="mat-mdc-tooltip-show";_hideAnimation="mat-mdc-tooltip-hide";constructor(){}show(A){this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=setTimeout(()=>{this._toggleVisibility(!0),this._showTimeoutId=void 0},A)}hide(A){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(()=>{this._toggleVisibility(!1),this._hideTimeoutId=void 0},A)}afterHidden(){return this._onHide}isVisible(){return this._isVisible}ngOnDestroy(){this._cancelPendingAnimations(),this._onHide.complete(),this._triggerElement=null}_handleBodyInteraction(){this._closeOnInteraction&&this.hide(0)}_markForCheck(){this._changeDetectorRef.markForCheck()}_handleMouseLeave({relatedTarget:A}){(!A||!this._triggerElement.contains(A))&&(this.isVisible()?this.hide(this._mouseLeaveHideDelay):this._finalizeAnimation(!1))}_onShow(){this._isMultiline=this._isTooltipMultiline(),this._markForCheck()}_isTooltipMultiline(){let A=this._elementRef.nativeElement.getBoundingClientRect();return A.height>SgA&&A.width>=kgA}_handleAnimationEnd({animationName:A}){(A===this._showAnimation||A===this._hideAnimation)&&this._finalizeAnimation(A===this._showAnimation)}_cancelPendingAnimations(){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=this._hideTimeoutId=void 0}_finalizeAnimation(A){A?this._closeOnInteraction=!0:this.isVisible()||this._onHide.next()}_toggleVisibility(A){let i=this._tooltip.nativeElement,n=this._showAnimation,o=this._hideAnimation;if(i.classList.remove(A?o:n),i.classList.add(A?n:o),this._isVisible!==A&&(this._isVisible=A,this._changeDetectorRef.markForCheck()),A&&!this._animationsDisabled&&typeof getComputedStyle=="function"){let a=getComputedStyle(i);(a.getPropertyValue("animation-duration")==="0s"||a.getPropertyValue("animation-name")==="none")&&(this._animationsDisabled=!0)}A&&this._onShow(),this._animationsDisabled&&(i.classList.add("_mat-animation-noopable"),this._finalizeAnimation(A))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-tooltip-component"]],viewQuery:function(i,n){if(i&1&&Jt(mgA,7),i&2){let o;ae(o=re())&&(n._tooltip=o.first)}},hostAttrs:["aria-hidden","true"],hostBindings:function(i,n){i&1&&U("mouseleave",function(a){return n._handleMouseLeave(a)})},decls:4,vars:5,consts:[["tooltip",""],[1,"mdc-tooltip","mat-mdc-tooltip",3,"animationend"],[1,"mat-mdc-tooltip-surface","mdc-tooltip__surface"]],template:function(i,n){i&1&&(wn(0,"div",1,0),qd("animationend",function(a){return n._handleAnimationEnd(a)}),wn(2,"div",2),y(3),Gn()()),i&2&&(ro(n.tooltipClass),RA("mdc-tooltip--multiline",n._isMultiline),u(3),lA(n.message))},styles:[`.mat-mdc-tooltip{position:relative;transform:scale(0);display:inline-flex}.mat-mdc-tooltip::before{content:"";top:0;right:0;bottom:0;left:0;z-index:-1;position:absolute}.mat-mdc-tooltip-panel-below .mat-mdc-tooltip::before{top:-8px}.mat-mdc-tooltip-panel-above .mat-mdc-tooltip::before{bottom:-8px}.mat-mdc-tooltip-panel-right .mat-mdc-tooltip::before{left:-8px}.mat-mdc-tooltip-panel-left .mat-mdc-tooltip::before{right:-8px}.mat-mdc-tooltip._mat-animation-noopable{animation:none;transform:scale(1)}.mat-mdc-tooltip-surface{word-break:normal;overflow-wrap:anywhere;padding:4px 8px;min-width:40px;max-width:200px;min-height:24px;max-height:40vh;box-sizing:border-box;overflow:hidden;text-align:center;will-change:transform,opacity;background-color:var(--mat-tooltip-container-color, var(--mat-sys-inverse-surface));color:var(--mat-tooltip-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mat-tooltip-container-shape, var(--mat-sys-corner-extra-small));font-family:var(--mat-tooltip-supporting-text-font, var(--mat-sys-body-small-font));font-size:var(--mat-tooltip-supporting-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-tooltip-supporting-text-weight, var(--mat-sys-body-small-weight));line-height:var(--mat-tooltip-supporting-text-line-height, var(--mat-sys-body-small-line-height));letter-spacing:var(--mat-tooltip-supporting-text-tracking, var(--mat-sys-body-small-tracking))}.mat-mdc-tooltip-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:left}[dir=rtl] .mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:right}.mat-mdc-tooltip-panel{line-height:normal}.mat-mdc-tooltip-panel.mat-mdc-tooltip-panel-non-interactive{pointer-events:none}@keyframes mat-mdc-tooltip-show{0%{opacity:0;transform:scale(0.8)}100%{opacity:1;transform:scale(1)}}@keyframes mat-mdc-tooltip-hide{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(0.8)}}.mat-mdc-tooltip-show{animation:mat-mdc-tooltip-show 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-mdc-tooltip-hide{animation:mat-mdc-tooltip-hide 75ms cubic-bezier(0.4, 0, 1, 1) forwards} -`],encapsulation:2,changeDetection:0})}return t})();var Fa=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[WQ,Zl,fi,Vc]})}return t})();function xgA(t,e){if(t&1&&(B(0,"mat-option",17),y(1),Q()),t&2){let A=e.$implicit;H("value",A),u(),ue(" ",A," ")}}function _gA(t,e){if(t&1){let A=QA();B(0,"mat-form-field",14)(1,"mat-select",16,0),U("selectionChange",function(n){T(A);let o=p(2);return J(o._changePageSize(n.value))}),Ue(3,xgA,2,2,"mat-option",17,ri),Q(),B(5,"div",18),U("click",function(){T(A);let n=Qi(2);return J(n.open())}),Q()()}if(t&2){let A=p(2);H("appearance",A._formFieldAppearance)("color",A.color),u(),H("value",A.pageSize)("disabled",A.disabled),Ap("aria-labelledby",A._pageSizeLabelId),H("panelClass",A.selectConfig.panelClass||"")("disableOptionCentering",A.selectConfig.disableOptionCentering),u(2),Te(A._displayedPageSizeOptions)}}function RgA(t,e){if(t&1&&(B(0,"div",15),y(1),Q()),t&2){let A=p(2);u(),lA(A.pageSize)}}function NgA(t,e){if(t&1&&(B(0,"div",3)(1,"div",13),y(2),Q(),O(3,_gA,6,7,"mat-form-field",14),O(4,RgA,2,1,"div",15),Q()),t&2){let A=p();u(),te("id",A._pageSizeLabelId),u(),ue(" ",A._intl.itemsPerPageLabel," "),u(),Y(A._displayedPageSizeOptions.length>1?3:-1),u(),Y(A._displayedPageSizeOptions.length<=1?4:-1)}}function FgA(t,e){if(t&1){let A=QA();B(0,"button",19),U("click",function(){T(A);let n=p();return J(n._buttonClicked(0,n._previousButtonsDisabled()))}),Ct(),B(1,"svg",8),hA(2,"path",20),Q()()}if(t&2){let A=p();H("matTooltip",A._intl.firstPageLabel)("matTooltipDisabled",A._previousButtonsDisabled())("disabled",A._previousButtonsDisabled())("tabindex",A._previousButtonsDisabled()?-1:null),te("aria-label",A._intl.firstPageLabel)}}function LgA(t,e){if(t&1){let A=QA();B(0,"button",21),U("click",function(){T(A);let n=p();return J(n._buttonClicked(n.getNumberOfPages()-1,n._nextButtonsDisabled()))}),Ct(),B(1,"svg",8),hA(2,"path",22),Q()()}if(t&2){let A=p();H("matTooltip",A._intl.lastPageLabel)("matTooltipDisabled",A._nextButtonsDisabled())("disabled",A._nextButtonsDisabled())("tabindex",A._nextButtonsDisabled()?-1:null),te("aria-label",A._intl.lastPageLabel)}}var b1=(()=>{class t{changes=new ie;itemsPerPageLabel="Items per page:";nextPageLabel="Next page";previousPageLabel="Previous page";firstPageLabel="First page";lastPageLabel="Last page";getRangeLabel=(A,i,n)=>{if(n==0||i==0)return`0 of ${n}`;n=Math.max(n,0);let o=A*i,a=o{class t{_intl=w(b1);_changeDetectorRef=w(wt);_formFieldAppearance;_pageSizeLabelId=w(In).getId("mat-paginator-page-size-label-");_intlChanges;_isInitialized=!1;_initializedStream=new Sg(1);color;get pageIndex(){return this._pageIndex}set pageIndex(A){this._pageIndex=Math.max(A||0,0),this._changeDetectorRef.markForCheck()}_pageIndex=0;get length(){return this._length}set length(A){this._length=A||0,this._changeDetectorRef.markForCheck()}_length=0;get pageSize(){return this._pageSize}set pageSize(A){this._pageSize=Math.max(A||0,0),this._updateDisplayedPageSizeOptions()}_pageSize;get pageSizeOptions(){return this._pageSizeOptions}set pageSizeOptions(A){this._pageSizeOptions=(A||[]).map(i=>Cn(i,0)),this._updateDisplayedPageSizeOptions()}_pageSizeOptions=[];hidePageSize=!1;showFirstLastButtons=!1;selectConfig={};disabled=!1;page=new LA;_displayedPageSizeOptions;initialized=this._initializedStream;constructor(){let A=this._intl,i=w(KgA,{optional:!0});if(this._intlChanges=A.changes.subscribe(()=>this._changeDetectorRef.markForCheck()),i){let{pageSize:n,pageSizeOptions:o,hidePageSize:a,showFirstLastButtons:r}=i;n!=null&&(this._pageSize=n),o!=null&&(this._pageSizeOptions=o),a!=null&&(this.hidePageSize=a),r!=null&&(this.showFirstLastButtons=r)}this._formFieldAppearance=i?.formFieldAppearance||"outline"}ngOnInit(){this._isInitialized=!0,this._updateDisplayedPageSizeOptions(),this._initializedStream.next()}ngOnDestroy(){this._initializedStream.complete(),this._intlChanges.unsubscribe()}nextPage(){this.hasNextPage()&&this._navigate(this.pageIndex+1)}previousPage(){this.hasPreviousPage()&&this._navigate(this.pageIndex-1)}firstPage(){this.hasPreviousPage()&&this._navigate(0)}lastPage(){this.hasNextPage()&&this._navigate(this.getNumberOfPages()-1)}hasPreviousPage(){return this.pageIndex>=1&&this.pageSize!=0}hasNextPage(){let A=this.getNumberOfPages()-1;return this.pageIndexA-i),this._changeDetectorRef.markForCheck())}_emitPageEvent(A){this.page.emit({previousPageIndex:A,pageIndex:this.pageIndex,pageSize:this.pageSize,length:this.length})}_navigate(A){let i=this.pageIndex;A!==i&&(this.pageIndex=A,this._emitPageEvent(i))}_buttonClicked(A,i){i||this._navigate(A)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-paginator"]],hostAttrs:["role","group",1,"mat-mdc-paginator"],inputs:{color:"color",pageIndex:[2,"pageIndex","pageIndex",Cn],length:[2,"length","length",Cn],pageSize:[2,"pageSize","pageSize",Cn],pageSizeOptions:"pageSizeOptions",hidePageSize:[2,"hidePageSize","hidePageSize",Be],showFirstLastButtons:[2,"showFirstLastButtons","showFirstLastButtons",Be],selectConfig:"selectConfig",disabled:[2,"disabled","disabled",Be]},outputs:{page:"page"},exportAs:["matPaginator"],decls:14,vars:14,consts:[["selectRef",""],[1,"mat-mdc-paginator-outer-container"],[1,"mat-mdc-paginator-container"],[1,"mat-mdc-paginator-page-size"],[1,"mat-mdc-paginator-range-actions"],["aria-atomic","true","aria-live","polite","role","status",1,"mat-mdc-paginator-range-label"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"matTooltip","matTooltipDisabled","disabled","tabindex"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-previous",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["viewBox","0 0 24 24","focusable","false","aria-hidden","true",1,"mat-mdc-paginator-icon"],["d","M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-next",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"matTooltip","matTooltipDisabled","disabled","tabindex"],["aria-hidden","true",1,"mat-mdc-paginator-page-size-label"],[1,"mat-mdc-paginator-page-size-select",3,"appearance","color"],[1,"mat-mdc-paginator-page-size-value"],["hideSingleSelectionIndicator","",3,"selectionChange","value","disabled","aria-labelledby","panelClass","disableOptionCentering"],[3,"value"],[1,"mat-mdc-paginator-touch-target",3,"click"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"]],template:function(i,n){i&1&&(B(0,"div",1)(1,"div",2),O(2,NgA,5,4,"div",3),B(3,"div",4)(4,"div",5),y(5),Q(),O(6,FgA,3,5,"button",6),B(7,"button",7),U("click",function(){return n._buttonClicked(n.pageIndex-1,n._previousButtonsDisabled())}),Ct(),B(8,"svg",8),hA(9,"path",9),Q()(),rr(),B(10,"button",10),U("click",function(){return n._buttonClicked(n.pageIndex+1,n._nextButtonsDisabled())}),Ct(),B(11,"svg",8),hA(12,"path",11),Q()(),O(13,LgA,3,5,"button",12),Q()()()),i&2&&(u(2),Y(n.hidePageSize?-1:2),u(3),ue(" ",n._intl.getRangeLabel(n.pageIndex,n.pageSize,n.length)," "),u(),Y(n.showFirstLastButtons?6:-1),u(),H("matTooltip",n._intl.previousPageLabel)("matTooltipDisabled",n._previousButtonsDisabled())("disabled",n._previousButtonsDisabled())("tabindex",n._previousButtonsDisabled()?-1:null),te("aria-label",n._intl.previousPageLabel),u(3),H("matTooltip",n._intl.nextPageLabel)("matTooltipDisabled",n._nextButtonsDisabled())("disabled",n._nextButtonsDisabled())("tabindex",n._nextButtonsDisabled()?-1:null),te("aria-label",n._intl.nextPageLabel),u(3),Y(n.showFirstLastButtons?13:-1))},dependencies:[Ko,Xl,Yr,ji,dn],styles:[`.mat-mdc-paginator{display:block;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-paginator-container-text-color, var(--mat-sys-on-surface));background-color:var(--mat-paginator-container-background-color, var(--mat-sys-surface));font-family:var(--mat-paginator-container-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-paginator-container-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-paginator-container-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-paginator-container-text-weight, var(--mat-sys-body-small-weight));letter-spacing:var(--mat-paginator-container-text-tracking, var(--mat-sys-body-small-tracking));--mat-form-field-container-height: var(--mat-paginator-form-field-container-height, 40px);--mat-form-field-container-vertical-padding: var(--mat-paginator-form-field-container-vertical-padding, 8px)}.mat-mdc-paginator .mat-mdc-select-value{font-size:var(--mat-paginator-select-trigger-text-size, var(--mat-sys-body-small-size))}.mat-mdc-paginator .mat-mdc-form-field-subscript-wrapper{display:none}.mat-mdc-paginator .mat-mdc-select{line-height:1.5}.mat-mdc-paginator-outer-container{display:flex}.mat-mdc-paginator-container{display:flex;align-items:center;justify-content:flex-end;padding:0 8px;flex-wrap:wrap;width:100%;min-height:var(--mat-paginator-container-size, 56px)}.mat-mdc-paginator-page-size{display:flex;align-items:baseline;margin-right:8px}[dir=rtl] .mat-mdc-paginator-page-size{margin-right:0;margin-left:8px}.mat-mdc-paginator-page-size-label{margin:0 4px}.mat-mdc-paginator-page-size-select{margin:0 4px;width:var(--mat-paginator-page-size-select-width, 84px)}.mat-mdc-paginator-range-label{margin:0 32px 0 24px}.mat-mdc-paginator-range-actions{display:flex;align-items:center}.mat-mdc-paginator-icon{display:inline-block;width:28px;fill:var(--mat-paginator-enabled-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon{fill:var(--mat-paginator-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}[dir=rtl] .mat-mdc-paginator-icon{transform:rotate(180deg)}@media(forced-colors: active){.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon,.mat-mdc-paginator-icon{fill:currentColor}.mat-mdc-paginator-range-actions .mat-mdc-icon-button{outline:solid 1px}.mat-mdc-paginator-range-actions .mat-mdc-icon-button[aria-disabled]{color:GrayText}}.mat-mdc-paginator-touch-target{display:var(--mat-paginator-touch-target-display, block);position:absolute;top:50%;left:50%;width:var(--mat-paginator-page-size-select-width, 84px);height:var(--mat-paginator-page-size-select-touch-target-height, 48px);background-color:rgba(0,0,0,0);transform:translate(-50%, -50%);cursor:pointer} -`],encapsulation:2,changeDetection:0})}return t})();var WT=["*"],UgA=["content"],TgA=[[["mat-drawer"]],[["mat-drawer-content"]],"*"],JgA=["mat-drawer","mat-drawer-content","*"];function OgA(t,e){if(t&1){let A=QA();B(0,"div",1),U("click",function(){T(A);let n=p();return J(n._onBackdropClicked())}),Q()}if(t&2){let A=p();RA("mat-drawer-shown",A._isShowingBackdrop())}}function YgA(t,e){t&1&&(B(0,"mat-drawer-content"),Ve(1,2),Q())}var HgA=new kA("MAT_DRAWER_DEFAULT_AUTOSIZE",{providedIn:"root",factory:()=>!1}),ZT=new kA("MAT_DRAWER_CONTAINER"),yM=(()=>{class t extends W0{_platform=w(gi);_changeDetectorRef=w(wt);_container=w(bM);constructor(){let A=w(ce),i=w(Wc),n=w(qe);super(A,i,n)}ngAfterContentInit(){this._container._contentMarginChanges.subscribe(()=>{this._changeDetectorRef.markForCheck()})}_shouldBeHidden(){if(this._platform.isBrowser)return!1;let{start:A,end:i}=this._container;return A!=null&&A.mode!=="over"&&A.opened||i!=null&&i.mode!=="over"&&i.opened}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-drawer-content"]],hostAttrs:[1,"mat-drawer-content"],hostVars:6,hostBindings:function(i,n){i&2&&(ut("margin-left",n._container._contentMargins.left,"px")("margin-right",n._container._contentMargins.right,"px"),RA("mat-drawer-content-hidden",n._shouldBeHidden()))},features:[Bt([{provide:W0,useExisting:t}]),mt],ngContentSelectors:WT,decls:1,vars:0,template:function(i,n){i&1&&(Rt(),Ve(0))},encapsulation:2,changeDetection:0})}return t})(),vM=(()=>{class t{_elementRef=w(ce);_focusTrapFactory=w(qQ);_focusMonitor=w($a);_platform=w(gi);_ngZone=w(qe);_renderer=w(Pi);_interactivityChecker=w(oB);_doc=w(ti);_container=w(ZT,{optional:!0});_focusTrap=null;_elementFocusedBeforeDrawerWasOpened=null;_eventCleanups;_isAttached=!1;_anchor=null;get position(){return this._position}set position(A){A=A==="end"?"end":"start",A!==this._position&&(this._isAttached&&this._updatePositionInParent(A),this._position=A,this.onPositionChanged.emit())}_position="start";get mode(){return this._mode}set mode(A){this._mode=A,this._updateFocusTrapState(),this._modeChanged.next()}_mode="over";get disableClose(){return this._disableClose}set disableClose(A){this._disableClose=mr(A)}_disableClose=!1;get autoFocus(){let A=this._autoFocus;return A??(this.mode==="side"?"dialog":"first-tabbable")}set autoFocus(A){(A==="true"||A==="false"||A==null)&&(A=mr(A)),this._autoFocus=A}_autoFocus;get opened(){return this._opened()}set opened(A){this.toggle(mr(A))}_opened=bA(!1);_openedVia=null;_animationStarted=new ie;_animationEnd=new ie;openedChange=new LA(!0);_openedStream=this.openedChange.pipe(gt(A=>A),we(()=>{}));openedStart=this._animationStarted.pipe(gt(()=>this.opened),_Q(void 0));_closedStream=this.openedChange.pipe(gt(A=>!A),we(()=>{}));closedStart=this._animationStarted.pipe(gt(()=>!this.opened),_Q(void 0));_destroyed=new ie;onPositionChanged=new LA;_content;_modeChanged=new ie;_injector=w(Dt);_changeDetectorRef=w(wt);constructor(){this.openedChange.pipe(Qt(this._destroyed)).subscribe(A=>{A?(this._elementFocusedBeforeDrawerWasOpened=this._doc.activeElement,this._takeFocus()):this._isFocusWithinDrawer()&&this._restoreFocus(this._openedVia||"program")}),this._eventCleanups=this._ngZone.runOutsideAngular(()=>{let A=this._renderer,i=this._elementRef.nativeElement;return[A.listen(i,"keydown",n=>{n.keyCode===27&&!this.disableClose&&!Qa(n)&&this._ngZone.run(()=>{this.close(),n.stopPropagation(),n.preventDefault()})}),A.listen(i,"transitionrun",this._handleTransitionEvent),A.listen(i,"transitionend",this._handleTransitionEvent),A.listen(i,"transitioncancel",this._handleTransitionEvent)]}),this._animationEnd.subscribe(()=>{this.openedChange.emit(this.opened)})}_forceFocus(A,i){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),a(),A.removeAttribute("tabindex")},o=this._renderer.listen(A,"blur",n),a=this._renderer.listen(A,"mousedown",n)})),A.focus(i)}_focusByCssSelector(A,i){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,i)}_takeFocus(){if(!this._focusTrap)return;let A=this._elementRef.nativeElement;switch(this.autoFocus){case!1:case"dialog":return;case!0:case"first-tabbable":Hn(()=>{!this._focusTrap.focusInitialElement()&&typeof A.focus=="function"&&A.focus()},{injector:this._injector});break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]');break;default:this._focusByCssSelector(this.autoFocus);break}}_restoreFocus(A){this.autoFocus!=="dialog"&&(this._elementFocusedBeforeDrawerWasOpened?this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened,A):this._elementRef.nativeElement.blur(),this._elementFocusedBeforeDrawerWasOpened=null)}_isFocusWithinDrawer(){let A=this._doc.activeElement;return!!A&&this._elementRef.nativeElement.contains(A)}ngAfterViewInit(){this._isAttached=!0,this._position==="end"&&this._updatePositionInParent("end"),this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._updateFocusTrapState())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._focusTrap?.destroy(),this._anchor?.remove(),this._anchor=null,this._animationStarted.complete(),this._animationEnd.complete(),this._modeChanged.complete(),this._destroyed.next(),this._destroyed.complete()}open(A){return this.toggle(!0,A)}close(){return this.toggle(!1)}_closeViaBackdropClick(){return this._setOpen(!1,!0,"mouse")}toggle(A=!this.opened,i){A&&i&&(this._openedVia=i);let n=this._setOpen(A,!A&&this._isFocusWithinDrawer(),this._openedVia||"program");return A||(this._openedVia=null),n}_setOpen(A,i,n){return A===this.opened?Promise.resolve(A?"open":"close"):(this._opened.set(A),this._container?._transitionsEnabled?this._setIsAnimating(!0):setTimeout(()=>{this._animationStarted.next(),this._animationEnd.next()}),this._elementRef.nativeElement.classList.toggle("mat-drawer-opened",A),!A&&i&&this._restoreFocus(n),this._changeDetectorRef.markForCheck(),this._updateFocusTrapState(),new Promise(o=>{this.openedChange.pipe(uo(1)).subscribe(a=>o(a?"open":"close"))}))}_setIsAnimating(A){this._elementRef.nativeElement.classList.toggle("mat-drawer-animating",A)}_getWidth(){return this._elementRef.nativeElement.offsetWidth||0}_updateFocusTrapState(){this._focusTrap&&(this._focusTrap.enabled=this.opened&&!!this._container?._isShowingBackdrop())}_updatePositionInParent(A){if(!this._platform.isBrowser)return;let i=this._elementRef.nativeElement,n=i.parentNode;A==="end"?(this._anchor||(this._anchor=this._doc.createComment("mat-drawer-anchor"),n.insertBefore(this._anchor,i)),n.appendChild(i)):this._anchor&&this._anchor.parentNode.insertBefore(i,this._anchor)}_handleTransitionEvent=A=>{let i=this._elementRef.nativeElement;A.target===i&&this._ngZone.run(()=>{A.type==="transitionrun"?this._animationStarted.next(A):(A.type==="transitionend"&&this._setIsAnimating(!1),this._animationEnd.next(A))})};static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-drawer"]],viewQuery:function(i,n){if(i&1&&Jt(UgA,5),i&2){let o;ae(o=re())&&(n._content=o.first)}},hostAttrs:[1,"mat-drawer"],hostVars:12,hostBindings:function(i,n){i&2&&(te("align",null)("tabIndex",n.mode!=="side"?"-1":null),ut("visibility",!n._container&&!n.opened?"hidden":null),RA("mat-drawer-end",n.position==="end")("mat-drawer-over",n.mode==="over")("mat-drawer-push",n.mode==="push")("mat-drawer-side",n.mode==="side"))},inputs:{position:"position",mode:"mode",disableClose:"disableClose",autoFocus:"autoFocus",opened:"opened"},outputs:{openedChange:"openedChange",_openedStream:"opened",openedStart:"openedStart",_closedStream:"closed",closedStart:"closedStart",onPositionChanged:"positionChanged"},exportAs:["matDrawer"],ngContentSelectors:WT,decls:3,vars:0,consts:[["content",""],["cdkScrollable","",1,"mat-drawer-inner-container"]],template:function(i,n){i&1&&(Rt(),B(0,"div",1,0),Ve(2),Q())},dependencies:[W0],encapsulation:2,changeDetection:0})}return t})(),bM=(()=>{class t{_dir=w(fo,{optional:!0});_element=w(ce);_ngZone=w(qe);_changeDetectorRef=w(wt);_animationDisabled=An();_transitionsEnabled=!1;_allDrawers;_drawers=new xg;_content;_userContent;get start(){return this._start}get end(){return this._end}get autosize(){return this._autosize}set autosize(A){this._autosize=mr(A)}_autosize=w(HgA);get hasBackdrop(){return this._drawerHasBackdrop(this._start)||this._drawerHasBackdrop(this._end)}set hasBackdrop(A){this._backdropOverride=A==null?null:mr(A)}_backdropOverride=null;backdropClick=new LA;_start=null;_end=null;_left=null;_right=null;_destroyed=new ie;_doCheckSubject=new ie;_contentMargins={left:null,right:null};_contentMarginChanges=new ie;get scrollable(){return this._userContent||this._content}_injector=w(Dt);constructor(){let A=w(gi),i=w(Ms);this._dir?.change.pipe(Qt(this._destroyed)).subscribe(()=>{this._validateDrawers(),this.updateContentMargins()}),i.change().pipe(Qt(this._destroyed)).subscribe(()=>this.updateContentMargins()),!this._animationDisabled&&A.isBrowser&&this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._element.nativeElement.classList.add("mat-drawer-transition"),this._transitionsEnabled=!0},200)})}ngAfterContentInit(){this._allDrawers.changes.pipe(Sn(this._allDrawers),Qt(this._destroyed)).subscribe(A=>{this._drawers.reset(A.filter(i=>!i._container||i._container===this)),this._drawers.notifyOnChanges()}),this._drawers.changes.pipe(Sn(null)).subscribe(()=>{this._validateDrawers(),this._drawers.forEach(A=>{this._watchDrawerToggle(A),this._watchDrawerPosition(A),this._watchDrawerMode(A)}),(!this._drawers.length||this._isDrawerOpen(this._start)||this._isDrawerOpen(this._end))&&this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),this._ngZone.runOutsideAngular(()=>{this._doCheckSubject.pipe(Ls(10),Qt(this._destroyed)).subscribe(()=>this.updateContentMargins())})}ngOnDestroy(){this._contentMarginChanges.complete(),this._doCheckSubject.complete(),this._drawers.destroy(),this._destroyed.next(),this._destroyed.complete()}open(){this._drawers.forEach(A=>A.open())}close(){this._drawers.forEach(A=>A.close())}updateContentMargins(){let A=0,i=0;if(this._left&&this._left.opened){if(this._left.mode=="side")A+=this._left._getWidth();else if(this._left.mode=="push"){let n=this._left._getWidth();A+=n,i-=n}}if(this._right&&this._right.opened){if(this._right.mode=="side")i+=this._right._getWidth();else if(this._right.mode=="push"){let n=this._right._getWidth();i+=n,A-=n}}A=A||null,i=i||null,(A!==this._contentMargins.left||i!==this._contentMargins.right)&&(this._contentMargins={left:A,right:i},this._ngZone.run(()=>this._contentMarginChanges.next(this._contentMargins)))}ngDoCheck(){this._autosize&&this._isPushed()&&this._ngZone.runOutsideAngular(()=>this._doCheckSubject.next())}_watchDrawerToggle(A){A._animationStarted.pipe(Qt(this._drawers.changes)).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),A.mode!=="side"&&A.openedChange.pipe(Qt(this._drawers.changes)).subscribe(()=>this._setContainerClass(A.opened))}_watchDrawerPosition(A){A.onPositionChanged.pipe(Qt(this._drawers.changes)).subscribe(()=>{Hn({read:()=>this._validateDrawers()},{injector:this._injector})})}_watchDrawerMode(A){A._modeChanged.pipe(Qt(Ki(this._drawers.changes,this._destroyed))).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()})}_setContainerClass(A){let i=this._element.nativeElement.classList,n="mat-drawer-container-has-open";A?i.add(n):i.remove(n)}_validateDrawers(){this._start=this._end=null,this._drawers.forEach(A=>{A.position=="end"?(this._end!=null,this._end=A):(this._start!=null,this._start=A)}),this._right=this._left=null,this._dir&&this._dir.value==="rtl"?(this._left=this._end,this._right=this._start):(this._left=this._start,this._right=this._end)}_isPushed(){return this._isDrawerOpen(this._start)&&this._start.mode!="over"||this._isDrawerOpen(this._end)&&this._end.mode!="over"}_onBackdropClicked(){this.backdropClick.emit(),this._closeModalDrawersViaBackdrop()}_closeModalDrawersViaBackdrop(){[this._start,this._end].filter(A=>A&&!A.disableClose&&this._drawerHasBackdrop(A)).forEach(A=>A._closeViaBackdropClick())}_isShowingBackdrop(){return this._isDrawerOpen(this._start)&&this._drawerHasBackdrop(this._start)||this._isDrawerOpen(this._end)&&this._drawerHasBackdrop(this._end)}_isDrawerOpen(A){return A!=null&&A.opened}_drawerHasBackdrop(A){return this._backdropOverride==null?!!A&&A.mode!=="side":this._backdropOverride}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-drawer-container"]],contentQueries:function(i,n,o){if(i&1&&jo(o,yM,5)(o,vM,5),i&2){let a;ae(a=re())&&(n._content=a.first),ae(a=re())&&(n._allDrawers=a)}},viewQuery:function(i,n){if(i&1&&Jt(yM,5),i&2){let o;ae(o=re())&&(n._userContent=o.first)}},hostAttrs:[1,"mat-drawer-container"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mat-drawer-container-explicit-backdrop",n._backdropOverride)},inputs:{autosize:"autosize",hasBackdrop:"hasBackdrop"},outputs:{backdropClick:"backdropClick"},exportAs:["matDrawerContainer"],features:[Bt([{provide:ZT,useExisting:t}])],ngContentSelectors:JgA,decls:4,vars:2,consts:[[1,"mat-drawer-backdrop",3,"mat-drawer-shown"],[1,"mat-drawer-backdrop",3,"click"]],template:function(i,n){i&1&&(Rt(TgA),O(0,OgA,1,2,"div",0),Ve(1),Ve(2,1),O(3,YgA,2,0,"mat-drawer-content")),i&2&&(Y(n.hasBackdrop?0:-1),u(3),Y(n._content?-1:3))},dependencies:[yM],styles:[`.mat-drawer-container{position:relative;z-index:1;color:var(--mat-sidenav-content-text-color, var(--mat-sys-on-background));background-color:var(--mat-sidenav-content-background-color, var(--mat-sys-background));box-sizing:border-box;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible;background-color:var(--mat-sidenav-scrim-color, color-mix(in srgb, var(--mat-sys-neutral-variant20) 40%, transparent))}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}@media(forced-colors: active){.mat-drawer-backdrop{opacity:.5}}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-content.mat-drawer-content-hidden{opacity:0}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;color:var(--mat-sidenav-container-text-color, var(--mat-sys-on-surface-variant));box-shadow:var(--mat-sidenav-container-elevation-shadow, none);background-color:var(--mat-sidenav-container-background-color, var(--mat-sys-surface));border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));width:var(--mat-sidenav-container-width, 360px);display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}@media(forced-colors: active){.mat-drawer,[dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}}@media(forced-colors: active){[dir=rtl] .mat-drawer,.mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0);border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .mat-drawer{border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-left-radius:0;border-bottom-left-radius:0;left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-transition .mat-drawer{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating){visibility:hidden;box-shadow:none}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container{display:none}.mat-drawer.mat-drawer-opened.mat-drawer-opened{transform:none}.mat-drawer-side{box-shadow:none;border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid}.mat-drawer-side.mat-drawer-end{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid;border-left:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto}.mat-sidenav-fixed{position:fixed} -`],encapsulation:2,changeDetection:0})}return t})();var zgA=["determinateSpinner"];function PgA(t,e){if(t&1&&(Ct(),B(0,"svg",11),hA(1,"circle",12),Q()),t&2){let A=p();te("viewBox",A._viewBox()),u(),ut("stroke-dasharray",A._strokeCircumference(),"px")("stroke-dashoffset",A._strokeCircumference()/2,"px")("stroke-width",A._circleStrokeWidth(),"%"),te("r",A._circleRadius())}}var jgA=new kA("mat-progress-spinner-default-options",{providedIn:"root",factory:()=>({diameter:XT})}),XT=100,qgA=10,gs=(()=>{class t{_elementRef=w(ce);_noopAnimations;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor="primary";_determinateCircle;constructor(){let A=w(jgA),i=XQ(),n=this._elementRef.nativeElement;this._noopAnimations=i==="di-disabled"&&!!A&&!A._forceAnimations,this.mode=n.nodeName.toLowerCase()==="mat-spinner"?"indeterminate":"determinate",!this._noopAnimations&&i==="reduced-motion"&&n.classList.add("mat-progress-spinner-reduced-motion"),A&&(A.color&&(this.color=this._defaultColor=A.color),A.diameter&&(this.diameter=A.diameter),A.strokeWidth&&(this.strokeWidth=A.strokeWidth))}mode;get value(){return this.mode==="determinate"?this._value:0}set value(A){this._value=Math.max(0,Math.min(100,A||0))}_value=0;get diameter(){return this._diameter}set diameter(A){this._diameter=A||0}_diameter=XT;get strokeWidth(){return this._strokeWidth??this.diameter/10}set strokeWidth(A){this._strokeWidth=A||0}_strokeWidth;_circleRadius(){return(this.diameter-qgA)/2}_viewBox(){let A=this._circleRadius()*2+this.strokeWidth;return`0 0 ${A} ${A}`}_strokeCircumference(){return 2*Math.PI*this._circleRadius()}_strokeDashOffset(){return this.mode==="determinate"?this._strokeCircumference()*(100-this._value)/100:null}_circleStrokeWidth(){return this.strokeWidth/this.diameter*100}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-progress-spinner"],["mat-spinner"]],viewQuery:function(i,n){if(i&1&&Jt(zgA,5),i&2){let o;ae(o=re())&&(n._determinateCircle=o.first)}},hostAttrs:["role","progressbar","tabindex","-1",1,"mat-mdc-progress-spinner","mdc-circular-progress"],hostVars:18,hostBindings:function(i,n){i&2&&(te("aria-valuemin",0)("aria-valuemax",100)("aria-valuenow",n.mode==="determinate"?n.value:null)("mode",n.mode),ro("mat-"+n.color),ut("width",n.diameter,"px")("height",n.diameter,"px")("--mat-progress-spinner-size",n.diameter+"px")("--mat-progress-spinner-active-indicator-width",n.diameter+"px"),RA("_mat-animation-noopable",n._noopAnimations)("mdc-circular-progress--indeterminate",n.mode==="indeterminate"))},inputs:{color:"color",mode:"mode",value:[2,"value","value",Cn],diameter:[2,"diameter","diameter",Cn],strokeWidth:[2,"strokeWidth","strokeWidth",Cn]},exportAs:["matProgressSpinner"],decls:14,vars:11,consts:[["circle",""],["determinateSpinner",""],["aria-hidden","true",1,"mdc-circular-progress__determinate-container"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__determinate-circle-graphic"],["cx","50%","cy","50%",1,"mdc-circular-progress__determinate-circle"],["aria-hidden","true",1,"mdc-circular-progress__indeterminate-container"],[1,"mdc-circular-progress__spinner-layer"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-left"],[3,"ngTemplateOutlet"],[1,"mdc-circular-progress__gap-patch"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-right"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__indeterminate-circle-graphic"],["cx","50%","cy","50%"]],template:function(i,n){if(i&1&&(Et(0,PgA,2,8,"ng-template",null,0,$C),B(2,"div",2,1),Ct(),B(4,"svg",3),hA(5,"circle",4),Q()(),rr(),B(6,"div",5)(7,"div",6)(8,"div",7),sn(9,8),Q(),B(10,"div",9),sn(11,8),Q(),B(12,"div",10),sn(13,8),Q()()()),i&2){let o=Qi(1);u(4),te("viewBox",n._viewBox()),u(),ut("stroke-dasharray",n._strokeCircumference(),"px")("stroke-dashoffset",n._strokeDashOffset(),"px")("stroke-width",n._circleStrokeWidth(),"%"),te("r",n._circleRadius()),u(4),H("ngTemplateOutlet",o),u(2),H("ngTemplateOutlet",o),u(2),H("ngTemplateOutlet",o)}},dependencies:[Jc],styles:[`.mat-mdc-progress-spinner{--mat-progress-spinner-animation-multiplier: 1;display:block;overflow:hidden;line-height:0;position:relative;direction:ltr;transition:opacity 250ms cubic-bezier(0.4, 0, 0.6, 1)}.mat-mdc-progress-spinner circle{stroke-width:var(--mat-progress-spinner-active-indicator-width, 4px)}.mat-mdc-progress-spinner._mat-animation-noopable,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__determinate-circle{transition:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__spinner-layer,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container{animation:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container circle{stroke-dasharray:0 !important}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle{stroke:currentColor;stroke:CanvasText}}.mat-progress-spinner-reduced-motion{--mat-progress-spinner-animation-multiplier: 1.25}.mdc-circular-progress__determinate-container,.mdc-circular-progress__indeterminate-circle-graphic,.mdc-circular-progress__indeterminate-container,.mdc-circular-progress__spinner-layer{position:absolute;width:100%;height:100%}.mdc-circular-progress__determinate-container{transform:rotate(-90deg)}.mdc-circular-progress--indeterminate .mdc-circular-progress__determinate-container{opacity:0}.mdc-circular-progress__indeterminate-container{font-size:0;letter-spacing:0;white-space:nowrap;opacity:0}.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container{opacity:1;animation:mdc-circular-progress-container-rotate calc(1568.2352941176ms*var(--mat-progress-spinner-animation-multiplier)) linear infinite}.mdc-circular-progress__determinate-circle-graphic,.mdc-circular-progress__indeterminate-circle-graphic{fill:rgba(0,0,0,0)}.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:var(--mat-progress-spinner-active-indicator-color, var(--mat-sys-primary))}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:CanvasText}}.mdc-circular-progress__determinate-circle{transition:stroke-dashoffset 500ms cubic-bezier(0, 0, 0.2, 1)}.mdc-circular-progress__gap-patch{position:absolute;top:0;left:47.5%;box-sizing:border-box;width:5%;height:100%;overflow:hidden}.mdc-circular-progress__gap-patch .mdc-circular-progress__indeterminate-circle-graphic{left:-900%;width:2000%;transform:rotate(180deg)}.mdc-circular-progress__circle-clipper .mdc-circular-progress__indeterminate-circle-graphic{width:200%}.mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{left:-100%}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-left .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-left-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-right-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress__circle-clipper{display:inline-flex;position:relative;width:50%;height:100%;overflow:hidden}.mdc-circular-progress--indeterminate .mdc-circular-progress__spinner-layer{animation:mdc-circular-progress-spinner-layer-rotate calc(5332ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}@keyframes mdc-circular-progress-container-rotate{to{transform:rotate(360deg)}}@keyframes mdc-circular-progress-spinner-layer-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}100%{transform:rotate(1080deg)}}@keyframes mdc-circular-progress-left-spin{from{transform:rotate(265deg)}50%{transform:rotate(130deg)}to{transform:rotate(265deg)}}@keyframes mdc-circular-progress-right-spin{from{transform:rotate(-265deg)}50%{transform:rotate(-130deg)}to{transform:rotate(-265deg)}} -`],encapsulation:2,changeDetection:0})}return t})();var E2=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();function VgA(t,e){if(t&1){let A=QA();B(0,"div",1)(1,"button",2),U("click",function(){T(A);let n=p();return J(n.action())}),y(2),Q()()}if(t&2){let A=p();u(2),ue(" ",A.data.action," ")}}var WgA=["label"];function ZgA(t,e){}var XgA=Math.pow(2,31)-1,Uu=class{_overlayRef;instance;containerInstance;_afterDismissed=new ie;_afterOpened=new ie;_onAction=new ie;_durationTimeoutId;_dismissedByAction=!1;constructor(e,A){this._overlayRef=A,this.containerInstance=e,e._onExit.subscribe(()=>this._finishDismiss())}dismiss(){this._afterDismissed.closed||this.containerInstance.exit(),clearTimeout(this._durationTimeoutId)}dismissWithAction(){this._onAction.closed||(this._dismissedByAction=!0,this._onAction.next(),this._onAction.complete(),this.dismiss()),clearTimeout(this._durationTimeoutId)}closeWithAction(){this.dismissWithAction()}_dismissAfter(e){this._durationTimeoutId=setTimeout(()=>this.dismiss(),Math.min(e,XgA))}_open(){this._afterOpened.closed||(this._afterOpened.next(),this._afterOpened.complete())}_finishDismiss(){this._overlayRef.dispose(),this._onAction.closed||this._onAction.complete(),this._afterDismissed.next({dismissedByAction:this._dismissedByAction}),this._afterDismissed.complete(),this._dismissedByAction=!1}afterDismissed(){return this._afterDismissed}afterOpened(){return this.containerInstance._onEnter}onAction(){return this._onAction}},$T=new kA("MatSnackBarData"),GB=class{politeness="polite";announcementMessage="";viewContainerRef;duration=0;panelClass;direction;data=null;horizontalPosition="center";verticalPosition="bottom"},$gA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matSnackBarLabel",""]],hostAttrs:[1,"mat-mdc-snack-bar-label","mdc-snackbar__label"]})}return t})(),AcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matSnackBarActions",""]],hostAttrs:[1,"mat-mdc-snack-bar-actions","mdc-snackbar__actions"]})}return t})(),ecA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matSnackBarAction",""]],hostAttrs:[1,"mat-mdc-snack-bar-action","mdc-snackbar__action"]})}return t})(),tcA=(()=>{class t{snackBarRef=w(Uu);data=w($T);constructor(){}action(){this.snackBarRef.dismissWithAction()}get hasAction(){return!!this.data.action}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["simple-snack-bar"]],hostAttrs:[1,"mat-mdc-simple-snack-bar"],exportAs:["matSnackBar"],decls:3,vars:2,consts:[["matSnackBarLabel",""],["matSnackBarActions",""],["matButton","","matSnackBarAction","",3,"click"]],template:function(i,n){i&1&&(B(0,"div",0),y(1),Q(),O(2,VgA,3,1,"div",1)),i&2&&(u(),ue(" ",n.data.message,` -`),u(),Y(n.hasAction?2:-1))},dependencies:[pi,$gA,AcA,ecA],styles:[`.mat-mdc-simple-snack-bar{display:flex}.mat-mdc-simple-snack-bar .mat-mdc-snack-bar-label{max-height:50vh;overflow:auto} -`],encapsulation:2,changeDetection:0})}return t})(),SM="_mat-snack-bar-enter",kM="_mat-snack-bar-exit",icA=(()=>{class t extends C2{_ngZone=w(qe);_elementRef=w(ce);_changeDetectorRef=w(wt);_platform=w(gi);_animationsDisabled=An();snackBarConfig=w(GB);_document=w(ti);_trackedModals=new Set;_enterFallback;_exitFallback;_injector=w(Dt);_announceDelay=150;_announceTimeoutId;_destroyed=!1;_portalOutlet;_onAnnounce=new ie;_onExit=new ie;_onEnter=new ie;_animationState="void";_live;_label;_role;_liveElementId=w(In).getId("mat-snack-bar-container-live-");constructor(){super();let A=this.snackBarConfig;A.politeness==="assertive"&&!A.announcementMessage?this._live="assertive":A.politeness==="off"?this._live="off":this._live="polite",this._platform.FIREFOX&&(this._live==="polite"&&(this._role="status"),this._live==="assertive"&&(this._role="alert"))}attachComponentPortal(A){this._assertNotAttached();let i=this._portalOutlet.attachComponentPortal(A);return this._afterPortalAttached(),i}attachTemplatePortal(A){this._assertNotAttached();let i=this._portalOutlet.attachTemplatePortal(A);return this._afterPortalAttached(),i}attachDomPortal=A=>{this._assertNotAttached();let i=this._portalOutlet.attachDomPortal(A);return this._afterPortalAttached(),i};onAnimationEnd(A){A===kM?this._completeExit():A===SM&&(clearTimeout(this._enterFallback),this._ngZone.run(()=>{this._onEnter.next(),this._onEnter.complete()}))}enter(){this._destroyed||(this._animationState="visible",this._changeDetectorRef.markForCheck(),this._changeDetectorRef.detectChanges(),this._screenReaderAnnounce(),this._animationsDisabled?Hn(()=>{this._ngZone.run(()=>queueMicrotask(()=>this.onAnimationEnd(SM)))},{injector:this._injector}):(clearTimeout(this._enterFallback),this._enterFallback=setTimeout(()=>{this._elementRef.nativeElement.classList.add("mat-snack-bar-fallback-visible"),this.onAnimationEnd(SM)},200)))}exit(){return this._destroyed?ne(void 0):(this._ngZone.run(()=>{this._animationState="hidden",this._changeDetectorRef.markForCheck(),this._elementRef.nativeElement.setAttribute("mat-exit",""),clearTimeout(this._announceTimeoutId),this._animationsDisabled?Hn(()=>{this._ngZone.run(()=>queueMicrotask(()=>this.onAnimationEnd(kM)))},{injector:this._injector}):(clearTimeout(this._exitFallback),this._exitFallback=setTimeout(()=>this.onAnimationEnd(kM),200))}),this._onExit)}ngOnDestroy(){this._destroyed=!0,this._clearFromModals(),this._completeExit()}_completeExit(){clearTimeout(this._exitFallback),queueMicrotask(()=>{this._onExit.next(),this._onExit.complete()})}_afterPortalAttached(){let A=this._elementRef.nativeElement,i=this.snackBarConfig.panelClass;i&&(Array.isArray(i)?i.forEach(a=>A.classList.add(a)):A.classList.add(i)),this._exposeToModals();let n=this._label.nativeElement,o="mdc-snackbar__label";n.classList.toggle(o,!n.querySelector(`.${o}`))}_exposeToModals(){let A=this._liveElementId,i=this._document.querySelectorAll('body > .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{let i=A.getAttribute("aria-owns");if(i){let n=i.replace(this._liveElementId,"").trim();n.length>0?A.setAttribute("aria-owns",n):A.removeAttribute("aria-owns")}}),this._trackedModals.clear()}_assertNotAttached(){this._portalOutlet.hasAttached()}_screenReaderAnnounce(){this._announceTimeoutId||this._ngZone.runOutsideAngular(()=>{this._announceTimeoutId=setTimeout(()=>{if(this._destroyed)return;let A=this._elementRef.nativeElement,i=A.querySelector("[aria-hidden]"),n=A.querySelector("[aria-live]");if(i&&n){let o=null;this._platform.isBrowser&&document.activeElement instanceof HTMLElement&&i.contains(document.activeElement)&&(o=document.activeElement),i.removeAttribute("aria-hidden"),n.appendChild(i),o?.focus(),this._onAnnounce.next(),this._onAnnounce.complete()}},this._announceDelay)})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-snack-bar-container"]],viewQuery:function(i,n){if(i&1&&Jt(Wl,7)(WgA,7),i&2){let o;ae(o=re())&&(n._portalOutlet=o.first),ae(o=re())&&(n._label=o.first)}},hostAttrs:[1,"mdc-snackbar","mat-mdc-snack-bar-container"],hostVars:6,hostBindings:function(i,n){i&1&&U("animationend",function(a){return n.onAnimationEnd(a.animationName)})("animationcancel",function(a){return n.onAnimationEnd(a.animationName)}),i&2&&RA("mat-snack-bar-container-enter",n._animationState==="visible")("mat-snack-bar-container-exit",n._animationState==="hidden")("mat-snack-bar-container-animations-enabled",!n._animationsDisabled)},features:[mt],decls:6,vars:3,consts:[["label",""],[1,"mdc-snackbar__surface","mat-mdc-snackbar-surface"],[1,"mat-mdc-snack-bar-label"],["aria-hidden","true"],["cdkPortalOutlet",""]],template:function(i,n){i&1&&(B(0,"div",1)(1,"div",2,0)(3,"div",3),Et(4,ZgA,0,0,"ng-template",4),Q(),hA(5,"div"),Q()()),i&2&&(u(5),te("aria-live",n._live)("role",n._role)("id",n._liveElementId))},dependencies:[Wl],styles:[`@keyframes _mat-snack-bar-enter{from{transform:scale(0.8);opacity:0}to{transform:scale(1);opacity:1}}@keyframes _mat-snack-bar-exit{from{opacity:1}to{opacity:0}}.mat-mdc-snack-bar-container{display:flex;align-items:center;justify-content:center;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);margin:8px}.mat-mdc-snack-bar-handset .mat-mdc-snack-bar-container{width:100vw}.mat-snack-bar-container-animations-enabled{opacity:0}.mat-snack-bar-container-animations-enabled.mat-snack-bar-fallback-visible{opacity:1}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-enter{animation:_mat-snack-bar-enter 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-exit{animation:_mat-snack-bar-exit 75ms cubic-bezier(0.4, 0, 1, 1) forwards}.mat-mdc-snackbar-surface{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);display:flex;align-items:center;justify-content:flex-start;box-sizing:border-box;padding-left:0;padding-right:8px}[dir=rtl] .mat-mdc-snackbar-surface{padding-right:0;padding-left:8px}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{min-width:344px;max-width:672px}.mat-mdc-snack-bar-handset .mat-mdc-snackbar-surface{width:100%;min-width:0}@media(forced-colors: active){.mat-mdc-snackbar-surface{outline:solid 1px}}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{color:var(--mat-snack-bar-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mat-snack-bar-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-snack-bar-container-color, var(--mat-sys-inverse-surface))}.mdc-snackbar__label{width:100%;flex-grow:1;box-sizing:border-box;margin:0;padding:14px 8px 14px 16px}[dir=rtl] .mdc-snackbar__label{padding-left:8px;padding-right:16px}.mat-mdc-snack-bar-container .mdc-snackbar__label{font-family:var(--mat-snack-bar-supporting-text-font, var(--mat-sys-body-medium-font));font-size:var(--mat-snack-bar-supporting-text-size, var(--mat-sys-body-medium-size));font-weight:var(--mat-snack-bar-supporting-text-weight, var(--mat-sys-body-medium-weight));line-height:var(--mat-snack-bar-supporting-text-line-height, var(--mat-sys-body-medium-line-height))}.mat-mdc-snack-bar-actions{display:flex;flex-shrink:0;align-items:center;box-sizing:border-box}.mat-mdc-snack-bar-handset,.mat-mdc-snack-bar-container,.mat-mdc-snack-bar-label{flex:1 1 auto}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled).mat-unthemed{color:var(--mat-snack-bar-button-color, var(--mat-sys-inverse-primary))}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled){--mat-button-text-state-layer-color: currentColor;--mat-button-text-ripple-color: currentColor}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled) .mat-ripple-element{opacity:.1} -`],encapsulation:2})}return t})(),ncA=new kA("mat-snack-bar-default-options",{providedIn:"root",factory:()=>new GB}),h2=(()=>{class t{_live=w(VQ);_injector=w(Dt);_breakpointObserver=w(jQ);_parentSnackBar=w(t,{optional:!0,skipSelf:!0});_defaultConfig=w(ncA);_animationsDisabled=An();_snackBarRefAtThisLevel=null;simpleSnackBarComponent=tcA;snackBarContainerComponent=icA;handsetCssClass="mat-mdc-snack-bar-handset";get _openedSnackBarRef(){let A=this._parentSnackBar;return A?A._openedSnackBarRef:this._snackBarRefAtThisLevel}set _openedSnackBarRef(A){this._parentSnackBar?this._parentSnackBar._openedSnackBarRef=A:this._snackBarRefAtThisLevel=A}constructor(){}openFromComponent(A,i){return this._attach(A,i)}openFromTemplate(A,i){return this._attach(A,i)}open(A,i="",n){let o=gA(gA({},this._defaultConfig),n);return o.data={message:A,action:i},o.announcementMessage===A&&(o.announcementMessage=void 0),this.openFromComponent(this.simpleSnackBarComponent,o)}dismiss(){this._openedSnackBarRef&&this._openedSnackBarRef.dismiss()}ngOnDestroy(){this._snackBarRefAtThisLevel&&this._snackBarRefAtThisLevel.dismiss()}_attachSnackBarContainer(A,i){let n=i&&i.viewContainerRef&&i.viewContainerRef.injector,o=Dt.create({parent:n||this._injector,providers:[{provide:GB,useValue:i}]}),a=new Ss(this.snackBarContainerComponent,i.viewContainerRef,o),r=A.attach(a);return r.instance.snackBarConfig=i,r.instance}_attach(A,i){let n=gA(gA(gA({},new GB),this._defaultConfig),i),o=this._createOverlay(n),a=this._attachSnackBarContainer(o,n),r=new Uu(a,o);if(A instanceof ao){let s=new Jr(A,null,{$implicit:n.data,snackBarRef:r});r.instance=a.attachTemplatePortal(s)}else{let s=this._createInjector(n,r),l=new Ss(A,void 0,s),g=a.attachComponentPortal(l);r.instance=g.instance}return this._breakpointObserver.observe(EG.HandsetPortrait).pipe(Qt(o.detachments())).subscribe(s=>{o.overlayElement.classList.toggle(this.handsetCssClass,s.matches)}),n.announcementMessage&&a._onAnnounce.subscribe(()=>{this._live.announce(n.announcementMessage,n.politeness)}),this._animateSnackBar(r,n),this._openedSnackBarRef=r,this._openedSnackBarRef}_animateSnackBar(A,i){A.afterDismissed().subscribe(()=>{this._openedSnackBarRef==A&&(this._openedSnackBarRef=null),i.announcementMessage&&this._live.clear()}),i.duration&&i.duration>0&&A.afterOpened().subscribe(()=>A._dismissAfter(i.duration)),this._openedSnackBarRef?(this._openedSnackBarRef.afterDismissed().subscribe(()=>{A.containerInstance.enter()}),this._openedSnackBarRef.dismiss()):A.containerInstance.enter()}_createOverlay(A){let i=new Jg;i.direction=A.direction;let n=I2(this._injector),o=A.direction==="rtl",a=A.horizontalPosition==="left"||A.horizontalPosition==="start"&&!o||A.horizontalPosition==="end"&&o,r=!a&&A.horizontalPosition!=="center";return a?n.left("0"):r?n.right("0"):n.centerHorizontally(),A.verticalPosition==="top"?n.top("0"):n.bottom("0"),i.positionStrategy=n,i.disableAnimations=this._animationsDisabled,Yg(this._injector,i)}_createInjector(A,i){let n=A&&A.viewContainerRef&&A.viewContainerRef.injector;return Dt.create({parent:n||this._injector,providers:[{provide:Uu,useValue:i},{provide:$T,useValue:A.data}]})}static \u0275fac=function(i){return new(i||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var ocA=["*",[["mat-toolbar-row"]]],acA=["*","mat-toolbar-row"],rcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["mat-toolbar-row"]],hostAttrs:[1,"mat-toolbar-row"],exportAs:["matToolbarRow"]})}return t})(),AJ=(()=>{class t{_elementRef=w(ce);_platform=w(gi);_document=w(ti);color;_toolbarRows;constructor(){}ngAfterViewInit(){this._platform.isBrowser&&(this._checkToolbarMixedModes(),this._toolbarRows.changes.subscribe(()=>this._checkToolbarMixedModes()))}_checkToolbarMixedModes(){this._toolbarRows.length}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-toolbar"]],contentQueries:function(i,n,o){if(i&1&&jo(o,rcA,5),i&2){let a;ae(a=re())&&(n._toolbarRows=a)}},hostAttrs:[1,"mat-toolbar"],hostVars:6,hostBindings:function(i,n){i&2&&(ro(n.color?"mat-"+n.color:""),RA("mat-toolbar-multiple-rows",n._toolbarRows.length>0)("mat-toolbar-single-row",n._toolbarRows.length===0))},inputs:{color:"color"},exportAs:["matToolbar"],ngContentSelectors:acA,decls:2,vars:0,template:function(i,n){i&1&&(Rt(ocA),Ve(0),Ve(1,1))},styles:[`.mat-toolbar{background:var(--mat-toolbar-container-background-color, var(--mat-sys-surface));color:var(--mat-toolbar-container-text-color, var(--mat-sys-on-surface))}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font-family:var(--mat-toolbar-title-text-font, var(--mat-sys-title-large-font));font-size:var(--mat-toolbar-title-text-size, var(--mat-sys-title-large-size));line-height:var(--mat-toolbar-title-text-line-height, var(--mat-sys-title-large-line-height));font-weight:var(--mat-toolbar-title-text-weight, var(--mat-sys-title-large-weight));letter-spacing:var(--mat-toolbar-title-text-tracking, var(--mat-sys-title-large-tracking));margin:0}@media(forced-colors: active){.mat-toolbar{outline:solid 1px}}.mat-toolbar .mat-form-field-underline,.mat-toolbar .mat-form-field-ripple,.mat-toolbar .mat-focused .mat-form-field-ripple{background-color:currentColor}.mat-toolbar .mat-form-field-label,.mat-toolbar .mat-focused .mat-form-field-label,.mat-toolbar .mat-select-value,.mat-toolbar .mat-select-arrow,.mat-toolbar .mat-form-field.mat-focused .mat-select-arrow{color:inherit}.mat-toolbar .mat-input-element{caret-color:currentColor}.mat-toolbar .mat-mdc-button-base.mat-mdc-button-base.mat-unthemed{--mat-button-text-label-text-color: var(--mat-toolbar-container-text-color, var(--mat-sys-on-surface));--mat-button-outlined-label-text-color: var(--mat-toolbar-container-text-color, var(--mat-sys-on-surface))}.mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap;height:var(--mat-toolbar-standard-height, 64px)}@media(max-width: 599px){.mat-toolbar-row,.mat-toolbar-single-row{height:var(--mat-toolbar-mobile-height, 56px)}}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%;min-height:var(--mat-toolbar-standard-height, 64px)}@media(max-width: 599px){.mat-toolbar-multiple-rows{min-height:var(--mat-toolbar-mobile-height, 56px)}} -`],encapsulation:2,changeDetection:0})}return t})();var scA=t=>["segment",t],lcA=(t,e)=>({"segment-main":!0,expandable:t,expanded:e});function gcA(t,e){t&1&&hA(0,"div",9)}function ccA(t,e){if(t&1&&(B(0,"span",10),y(1),Q()),t&2){let A=p().$implicit;u(),lA(A.description)}}function CcA(t,e){if(t&1&&(B(0,"section",11),hA(1,"ngx-json-viewer",12),Q()),t&2){let A=p().$implicit,i=p();u(),H("json",A.value)("expanded",i.expanded)("depth",i.depth)("_currentDepth",i._currentDepth+1)}}function IcA(t,e){if(t&1){let A=QA();B(0,"section",2)(1,"section",3),U("click",function(){let n=T(A).$implicit,o=p();return J(o.toggle(n))}),Et(2,gcA,1,0,"div",4),B(3,"span",5),y(4),Q(),B(5,"span",6),y(6,": "),Q(),Et(7,ccA,2,1,"span",7),Q(),Et(8,CcA,2,4,"section",8),Q()}if(t&2){let A=e.$implicit,i=p();H("ngClass",Ks(6,scA,"segment-type-"+A.type)),u(),H("ngClass",U0(8,lcA,i.isExpandable(A),A.expanded)),u(),H("ngIf",i.isExpandable(A)),u(2),lA(A.key),u(3),H("ngIf",!A.expanded||!i.isExpandable(A)),u(),H("ngIf",A.expanded&&i.isExpandable(A))}}var $l=(()=>{class t{constructor(){this.expanded=!0,this.depth=-1,this._currentDepth=0,this.segments=[]}ngOnChanges(){this.segments=[],this.json=this.decycle(this.json),typeof this.json=="object"?Object.keys(this.json).forEach(A=>{this.segments.push(this.parseKeyValue(A,this.json[A]))}):this.segments.push(this.parseKeyValue(`(${typeof this.json})`,this.json))}isExpandable(A){return A.type==="object"||A.type==="array"}toggle(A){this.isExpandable(A)&&(A.expanded=!A.expanded)}parseKeyValue(A,i){let n={key:A,value:i,type:void 0,description:""+i,expanded:this.isExpanded()};switch(typeof n.value){case"number":{n.type="number";break}case"boolean":{n.type="boolean";break}case"function":{n.type="function";break}case"string":{n.type="string",n.description='"'+n.value+'"';break}case"undefined":{n.type="undefined",n.description="undefined";break}case"object":{n.value===null?(n.type="null",n.description="null"):Array.isArray(n.value)?(n.type="array",n.description="Array["+n.value.length+"] "+JSON.stringify(n.value)):n.value instanceof Date?n.type="date":(n.type="object",n.description="Object "+JSON.stringify(n.value));break}}return n}isExpanded(){return this.expanded&&!(this.depth>-1&&this._currentDepth>=this.depth)}decycle(A){let i=new WeakMap;return(function n(o,a){let r,s;return typeof o=="object"&&o!==null&&!(o instanceof Boolean)&&!(o instanceof Date)&&!(o instanceof Number)&&!(o instanceof RegExp)&&!(o instanceof String)?(r=i.get(o),r!==void 0?{$ref:r}:(i.set(o,a),Array.isArray(o)?(s=[],o.forEach(function(l,g){s[g]=n(l,a+"["+g+"]")})):(s={},Object.keys(o).forEach(function(l){s[l]=n(o[l],a+"["+JSON.stringify(l)+"]")})),s)):o})(A,"$")}}return t.\u0275fac=function(A){return new(A||t)},t.\u0275cmp=SA({type:t,selectors:[["ngx-json-viewer"]],inputs:{json:"json",expanded:"expanded",depth:"depth",_currentDepth:"_currentDepth"},standalone:!1,features:[Yt],decls:2,vars:1,consts:[[1,"ngx-json-viewer"],[3,"ngClass",4,"ngFor","ngForOf"],[3,"ngClass"],[3,"click","ngClass"],["class","toggler",4,"ngIf"],[1,"segment-key"],[1,"segment-separator"],["class","segment-value",4,"ngIf"],["class","children",4,"ngIf"],[1,"toggler"],[1,"segment-value"],[1,"children"],[3,"json","expanded","depth","_currentDepth"]],template:function(A,i){A&1&&(B(0,"section",0),Et(1,IcA,9,11,"section",1),Q()),A&2&&(u(),H("ngForOf",i.segments))},dependencies:[zl,A2,Js,t],styles:['@charset "UTF-8";.ngx-json-viewer[_ngcontent-%COMP%]{font-family:var(--ngx-json-font-family, monospace);font-size:var(--ngx-json-font-size, 1em);width:100%;height:100%;overflow:hidden;position:relative}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%]{padding:2px;margin:1px 1px 1px 12px}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%]{word-wrap:break-word}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .toggler[_ngcontent-%COMP%]{position:absolute;margin-left:-14px;margin-top:3px;font-size:.8em;line-height:1.2em;vertical-align:middle;color:var(--ngx-json-toggler, #787878)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .toggler[_ngcontent-%COMP%]:after{display:inline-block;content:"\\25ba";transition:transform .1s ease-in}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-key[_ngcontent-%COMP%]{color:var(--ngx-json-key, #4E187C)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-separator[_ngcontent-%COMP%]{color:var(--ngx-json-separator, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-value, #000)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .children[_ngcontent-%COMP%]{margin-left:12px}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-string[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-string, #FF6B6B)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-number[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-number, #009688)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-boolean[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-boolean, #B938A4)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-date[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-date, #05668D)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-array[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-array, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-object[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-object, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-function[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-function, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-null[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-null, #fff)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-undefined, #fff)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-null[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{background-color:var(--ngx-json-null-bg, red)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-key[_ngcontent-%COMP%]{color:var(--ngx-json-undefined-key, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{background-color:var(--ngx-json-undefined-key, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-object[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%], .ngx-json-viewer[_ngcontent-%COMP%] .segment-type-array[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%]{white-space:nowrap}.ngx-json-viewer[_ngcontent-%COMP%] .expanded[_ngcontent-%COMP%] > .toggler[_ngcontent-%COMP%]:after{transform:rotate(90deg)}.ngx-json-viewer[_ngcontent-%COMP%] .expandable[_ngcontent-%COMP%], .ngx-json-viewer[_ngcontent-%COMP%] .expandable[_ngcontent-%COMP%] > .toggler[_ngcontent-%COMP%]{cursor:pointer}']}),t})(),cs=(()=>{class t{}return t.\u0275fac=function(A){return new(A||t)},t.\u0275mod=Ze({type:t}),t.\u0275inj=We({imports:[li]}),t})();var Dr=class t{static getBaseUrlWithoutPath(){let e=window.location.href;return new URL(e).origin+"/dev-ui/"}static getApiServerBaseUrl(){return window.runtimeConfig?.backendUrl||""}static getWSServerUrl(){let e=t.getApiServerBaseUrl();return!e||e==""?window.location.host:e.startsWith("http://")?e.slice(7):e.startsWith("https://")?e.slice(8):e}};var UB=class{role;text;thought;isLoading;isEditing;evalStatus;failedMetric;attachments;renderedContent;a2uiData;executableCode;codeExecutionResult;event;inlineData;functionCalls;functionResponses;actualInvocationToolUses;expectedInvocationToolUses;actualFinalResponse;expectedFinalResponse;evalScore;evalThreshold;invocationIndex;finalResponsePartIndex;toolUseIndex;error;constructor(e){if(Object.assign(this,e),this.event?.actions)for(let[A,i]of Object.entries(this.event.actions))i!==null&&typeof i=="object"&&Object.keys(i).length===0&&delete this.event.actions[A]}get stateDelta(){return this.event?.actions?.stateDelta}get artifactDelta(){return this.event?.actions?.artifactDelta}get route(){return this.event?.actions?.route}get nodePath(){return this.event?.nodeInfo?.path||null}get bareNodePath(){let e=this.nodePath;return e?e.split("/").map(A=>A.split("@")[0]).join("/"):null}get author(){return this.event?.author??"root_agent"}};var $s=new kA("AgentService");var e0=new kA("AgentBuilderService");var TB=new kA("ArtifactService");var JB=new kA("DownloadService");var t0=new kA("EvalService");var o6=new kA("EventService");var eJ="edit_function_args";var tJ="a2a_card",iJ="tests",nJ="eval_v2",yr=new kA("FeatureFlagService");var OB=new kA("GraphService");var a6=new kA("LocalFileService");var Cs=new kA("SafeValuesService"),r6=class{openBase64InNewTab(e,A){try{if(!e)return;let i=e;if(e.startsWith("data:")&&e.includes(";base64,")&&(i=i.substring(i.indexOf(";base64,")+8)),!A||!i)return;let n=atob(i),o=new Array(n.length);for(let l=0;l{fetch(i,{method:"POST"}).then(o=>{if(!o.body){n.error("No response body");return}let a=o.body.getReader(),r=new TextDecoder("utf-8"),s=()=>{a.read().then(({done:l,value:g})=>{if(l){this.zone.run(()=>n.complete());return}let C=r.decode(g,{stream:!0});this.zone.run(()=>n.next(C)),s()}).catch(l=>{this.zone.run(()=>n.error(l))})};s()}).catch(o=>{this.zone.run(()=>n.error(o))})})}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var c6=class t{constructor(e,A){this.el=e;this.renderer=A}sideDrawerMinWidth=360;sideDrawerMaxWidth=window.innerWidth/2;resizeHandle=null;resizingEvent={isResizing:!1,startingCursorX:0,startingWidth:0};ngAfterViewInit(){this.sideDrawerMaxWidth=window.innerWidth/2,this.resizeHandle=document.getElementsByClassName("resize-handler")[0],this.resizeHandle&&this.renderer.listen(this.resizeHandle,"mousedown",e=>this.onResizeHandleMouseDown(e)),document.documentElement.style.setProperty("--side-drawer-width","570px"),this.renderer.setStyle(this.el.nativeElement,"width","var(--side-drawer-width)")}onResizeHandleMouseDown(e){this.resizingEvent={isResizing:!0,startingCursorX:e.clientX,startingWidth:this.sideDrawerWidth},e.preventDefault()}onMouseMove(e){if(!this.resizingEvent.isResizing)return;let A=e.clientX-this.resizingEvent.startingCursorX,i=this.resizingEvent.startingWidth+A;this.sideDrawerWidth=i,this.renderer.addClass(document.body,"resizing")}onMouseUp(){this.resizingEvent.isResizing=!1,this.renderer.removeClass(document.body,"resizing")}onResize(){this.sideDrawerMaxWidth=window.innerWidth/2,this.sideDrawerWidth=this.sideDrawerWidth}set sideDrawerWidth(e){let A=Math.min(Math.max(e,this.sideDrawerMinWidth),this.sideDrawerMaxWidth);document.documentElement.style.setProperty("--side-drawer-width",`${A}px`)}get sideDrawerWidth(){let e=getComputedStyle(document.documentElement).getPropertyValue("--side-drawer-width"),A=parseFloat(e);return isNaN(A)?500:A}static \u0275fac=function(A){return new(A||t)(ct(ce),ct(Pi))};static \u0275dir=VA({type:t,selectors:[["","appResizableDrawer",""]],hostBindings:function(A,i){A&1&&U("mousemove",function(o){return i.onMouseMove(o)},Pd)("mouseup",function(){return i.onMouseUp()},Pd)("resize",function(){return i.onResize()},ZC)}})};var C6=Symbol.for("yaml.alias"),I6=Symbol.for("yaml.document"),zg=Symbol.for("yaml.map"),xM=Symbol.for("yaml.pair"),Sl=Symbol.for("yaml.scalar"),AC=Symbol.for("yaml.seq"),xs=Symbol.for("yaml.node.type"),ig=t=>!!t&&typeof t=="object"&&t[xs]===C6,Pg=t=>!!t&&typeof t=="object"&&t[xs]===I6,jg=t=>!!t&&typeof t=="object"&&t[xs]===zg,vn=t=>!!t&&typeof t=="object"&&t[xs]===xM,Vi=t=>!!t&&typeof t=="object"&&t[xs]===Sl,qg=t=>!!t&&typeof t=="object"&&t[xs]===AC;function go(t){if(t&&typeof t=="object")switch(t[xs]){case zg:case AC:return!0}return!1}function xn(t){if(t&&typeof t=="object")switch(t[xs]){case C6:case zg:case Sl:case AC:return!0}return!1}var d6=t=>(Vi(t)||go(t))&&!!t.anchor;var el=Symbol("break visit"),oJ=Symbol("skip children"),i0=Symbol("remove node");function n0(t,e){let A=aJ(e);Pg(t)?jB(null,t.contents,A,Object.freeze([t]))===i0&&(t.contents=null):jB(null,t,A,Object.freeze([]))}n0.BREAK=el;n0.SKIP=oJ;n0.REMOVE=i0;function jB(t,e,A,i){let n=rJ(t,e,A,i);if(xn(n)||vn(n))return sJ(t,i,n),jB(t,n,A,i);if(typeof n!="symbol"){if(go(e)){i=Object.freeze(i.concat(e));for(let o=0;ot.replace(/[!,[\]{}]/g,e=>dcA[e]),VB=(()=>{class t{constructor(A,i){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},t.defaultYaml,A),this.tags=Object.assign({},t.defaultTags,i)}clone(){let A=new t(this.yaml,this.tags);return A.docStart=this.docStart,A}atDocument(){let A=new t(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:t.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},t.defaultTags);break}return A}add(A,i){this.atNextDocument&&(this.yaml={explicit:t.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},t.defaultTags),this.atNextDocument=!1);let n=A.trim().split(/[ \t]+/),o=n.shift();switch(o){case"%TAG":{if(n.length!==2&&(i(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;let[a,r]=n;return this.tags[a]=r,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return i(0,"%YAML directive should contain exactly one part"),!1;let[a]=n;if(a==="1.1"||a==="1.2")return this.yaml.version=a,!0;{let r=/^\d+\.\d+$/.test(a);return i(6,`Unsupported YAML version ${a}`,r),!1}}default:return i(0,`Unknown directive ${o}`,!0),!1}}tagName(A,i){if(A==="!")return"!";if(A[0]!=="!")return i(`Not a valid tag: ${A}`),null;if(A[1]==="<"){let r=A.slice(2,-1);return r==="!"||r==="!!"?(i(`Verbatim tags aren't resolved, so ${A} is invalid.`),null):(A[A.length-1]!==">"&&i("Verbatim tags must end with a >"),r)}let[,n,o]=A.match(/^(.*!)([^!]*)$/s);o||i(`The ${A} tag has no suffix`);let a=this.tags[n];if(a)try{return a+decodeURIComponent(o)}catch(r){return i(String(r)),null}return n==="!"?A:(i(`Could not resolve tag: ${A}`),null)}tagString(A){for(let[i,n]of Object.entries(this.tags))if(A.startsWith(n))return i+BcA(A.substring(n.length));return A[0]==="!"?A:`!<${A}>`}toString(A){let i=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],n=Object.entries(this.tags),o;if(A&&n.length>0&&xn(A.contents)){let a={};n0(A.contents,(r,s)=>{xn(s)&&s.tag&&(a[s.tag]=!0)}),o=Object.keys(a)}else o=[];for(let[a,r]of n)a==="!!"&&r==="tag:yaml.org,2002:"||(!A||o.some(s=>s.startsWith(r)))&&i.push(`%TAG ${a} ${r}`);return i.join(` -`)}}return t.defaultYaml={explicit:!1,version:"1.2"},t.defaultTags={"!!":"tag:yaml.org,2002:"},t})();function E6(t){if(/[\x00-\x19\s,[\]{}]/.test(t)){let A=`Anchor must not contain whitespace or control characters: ${JSON.stringify(t)}`;throw new Error(A)}return!0}function _M(t){let e=new Set;return n0(t,{Value(A,i){i.anchor&&e.add(i.anchor)}}),e}function RM(t,e){for(let A=1;;++A){let i=`${t}${A}`;if(!e.has(i))return i}}function lJ(t,e){let A=[],i=new Map,n=null;return{onAnchor:o=>{A.push(o),n??(n=_M(t));let a=RM(e,n);return n.add(a),a},setAnchors:()=>{for(let o of A){let a=i.get(o);if(typeof a=="object"&&a.anchor&&(Vi(a.node)||go(a.node)))a.node.anchor=a.anchor;else{let r=new Error("Failed to resolve repeated object (this should not happen)");throw r.source=o,r}}},sourceObjects:i}}function f2(t,e,A,i){if(i&&typeof i=="object")if(Array.isArray(i))for(let n=0,o=i.length;ncr(i,String(n),A));if(t&&typeof t.toJSON=="function"){if(!A||!d6(t))return t.toJSON(e,A);let i={aliasCount:0,count:1,res:void 0};A.anchors.set(t,i),A.onCreate=o=>{i.res=o,delete A.onCreate};let n=t.toJSON(e,A);return A.onCreate&&A.onCreate(n),n}return typeof t=="bigint"&&!A?.keep?Number(t):t}var p2=class{constructor(e){Object.defineProperty(this,xs,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:A,maxAliasCount:i,onAnchor:n,reviver:o}={}){if(!Pg(e))throw new TypeError("A document argument is required");let a={anchors:new Map,doc:e,keep:!0,mapAsMap:A===!0,mapKeyWarned:!1,maxAliasCount:typeof i=="number"?i:100},r=cr(this,"",a);if(typeof n=="function")for(let{count:s,res:l}of a.anchors.values())n(l,s);return typeof o=="function"?f2(o,{"":r},"",r):r}};var eC=class extends p2{constructor(e){super(C6),this.source=e,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(e,A){let i;A?.aliasResolveCache?i=A.aliasResolveCache:(i=[],n0(e,{Node:(o,a)=>{(ig(a)||d6(a))&&i.push(a)}}),A&&(A.aliasResolveCache=i));let n;for(let o of i){if(o===this)break;o.anchor===this.source&&(n=o)}return n}toJSON(e,A){if(!A)return{source:this.source};let{anchors:i,doc:n,maxAliasCount:o}=A,a=this.resolve(n,A);if(!a){let s=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(s)}let r=i.get(a);if(r||(cr(a,null,A),r=i.get(a)),r?.res===void 0){let s="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(s)}if(o>=0&&(r.count+=1,r.aliasCount===0&&(r.aliasCount=h6(n,a,i)),r.count*r.aliasCount>o)){let s="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(s)}return r.res}toString(e,A,i){let n=`*${this.source}`;if(e){if(E6(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let o=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(o)}if(e.implicitKey)return`${n} `}return n}};function h6(t,e,A){if(ig(e)){let i=e.resolve(t),n=A&&i&&A.get(i);return n?n.count*n.aliasCount:0}else if(go(e)){let i=0;for(let n of e.items){let o=h6(t,n,A);o>i&&(i=o)}return i}else if(vn(e)){let i=h6(t,e.key,A),n=h6(t,e.value,A);return Math.max(i,n)}return 1}var Q6=t=>!t||typeof t!="function"&&typeof t!="object",Pt=(()=>{class t extends p2{constructor(A){super(Sl),this.value=A}toJSON(A,i){return i?.keep?this.value:cr(this.value,A,i)}toString(){return String(this.value)}}return t.BLOCK_FOLDED="BLOCK_FOLDED",t.BLOCK_LITERAL="BLOCK_LITERAL",t.PLAIN="PLAIN",t.QUOTE_DOUBLE="QUOTE_DOUBLE",t.QUOTE_SINGLE="QUOTE_SINGLE",t})();var EcA="tag:yaml.org,2002:";function hcA(t,e,A){if(e){let i=A.filter(o=>o.tag===e),n=i.find(o=>!o.format)??i[0];if(!n)throw new Error(`Tag ${e} not found`);return n}return A.find(i=>i.identify?.(t)&&!i.format)}function tC(t,e,A){if(Pg(t)&&(t=t.contents),xn(t))return t;if(vn(t)){let C=A.schema[zg].createNode?.(A.schema,null,A);return C.items.push(t),C}(t instanceof String||t instanceof Number||t instanceof Boolean||typeof BigInt<"u"&&t instanceof BigInt)&&(t=t.valueOf());let{aliasDuplicateObjects:i,onAnchor:n,onTagObj:o,schema:a,sourceObjects:r}=A,s;if(i&&t&&typeof t=="object"){if(s=r.get(t),s)return s.anchor??(s.anchor=n(t)),new eC(s.anchor);s={anchor:null,node:null},r.set(t,s)}e?.startsWith("!!")&&(e=EcA+e.slice(2));let l=hcA(t,e,a.tags);if(!l){if(t&&typeof t.toJSON=="function"&&(t=t.toJSON()),!t||typeof t!="object"){let C=new Pt(t);return s&&(s.node=C),C}l=t instanceof Map?a[zg]:Symbol.iterator in Object(t)?a[AC]:a[zg]}o&&(o(l),delete A.onTagObj);let g=l?.createNode?l.createNode(A.schema,t,A):typeof l?.nodeClass?.from=="function"?l.nodeClass.from(A.schema,t,A):new Pt(t);return e?g.tag=e:l.default||(g.tag=l.tag),s&&(s.node=g),g}function Tu(t,e,A){let i=A;for(let n=e.length-1;n>=0;--n){let o=e[n];if(typeof o=="number"&&Number.isInteger(o)&&o>=0){let a=[];a[o]=i,i=a}else i=new Map([[o,i]])}return tC(i,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:t,sourceObjects:new Map})}var ZB=t=>t==null||typeof t=="object"&&!!t[Symbol.iterator]().next().done,WB=class extends p2{constructor(e,A){super(e),Object.defineProperty(this,"schema",{value:A,configurable:!0,enumerable:!1,writable:!0})}clone(e){let A=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(A.schema=e),A.items=A.items.map(i=>xn(i)||vn(i)?i.clone(e):i),this.range&&(A.range=this.range.slice()),A}addIn(e,A){if(ZB(e))this.add(A);else{let[i,...n]=e,o=this.get(i,!0);if(go(o))o.addIn(n,A);else if(o===void 0&&this.schema)this.set(i,Tu(this.schema,n,A));else throw new Error(`Expected YAML collection at ${i}. Remaining path: ${n}`)}}deleteIn(e){let[A,...i]=e;if(i.length===0)return this.delete(A);let n=this.get(A,!0);if(go(n))return n.deleteIn(i);throw new Error(`Expected YAML collection at ${A}. Remaining path: ${i}`)}getIn(e,A){let[i,...n]=e,o=this.get(i,!0);return n.length===0?!A&&Vi(o)?o.value:o:go(o)?o.getIn(n,A):void 0}hasAllNullValues(e){return this.items.every(A=>{if(!vn(A))return!1;let i=A.value;return i==null||e&&Vi(i)&&i.value==null&&!i.commentBefore&&!i.comment&&!i.tag})}hasIn(e){let[A,...i]=e;if(i.length===0)return this.has(A);let n=this.get(A,!0);return go(n)?n.hasIn(i):!1}setIn(e,A){let[i,...n]=e;if(n.length===0)this.set(i,A);else{let o=this.get(i,!0);if(go(o))o.setIn(n,A);else if(o===void 0&&this.schema)this.set(i,Tu(this.schema,n,A));else throw new Error(`Expected YAML collection at ${i}. Remaining path: ${n}`)}}};var gJ=t=>t.replace(/^(?!$)(?: $)?/gm,"#");function ng(t,e){return/^\n+$/.test(t)?t.substring(1):e?t.replace(/^(?! *$)/gm,e):t}var o0=(t,e,A)=>t.endsWith(` -`)?ng(A,e):A.includes(` -`)?` -`+ng(A,e):(t.endsWith(" ")?"":" ")+A;var NM="flow",u6="block",Ju="quoted";function Ou(t,e,A="flow",{indentAtStart:i,lineWidth:n=80,minContentWidth:o=20,onFold:a,onOverflow:r}={}){if(!n||n<0)return t;nn-Math.max(2,o)?l.push(0):C=n-i);let I,d,h=!1,E=-1,f=-1,m=-1;A===u6&&(E=cJ(t,E,e.length),E!==-1&&(C=E+s));for(let k;k=t[E+=1];){if(A===Ju&&k==="\\"){switch(f=E,t[E+1]){case"x":E+=3;break;case"u":E+=5;break;case"U":E+=9;break;default:E+=1}m=E}if(k===` -`)A===u6&&(E=cJ(t,E,e.length)),C=E+e.length+s,I=void 0;else{if(k===" "&&d&&d!==" "&&d!==` -`&&d!==" "){let S=t[E+1];S&&S!==" "&&S!==` -`&&S!==" "&&(I=E)}if(E>=C)if(I)l.push(I),C=I+s,I=void 0;else if(A===Ju){for(;d===" "||d===" ";)d=k,k=t[E+=1],h=!0;let S=E>m+1?E-2:f-1;if(g[S])return t;l.push(S),g[S]=!0,C=S+s,I=void 0}else h=!0}d=k}if(h&&r&&r(),l.length===0)return t;a&&a();let v=t.slice(0,l[0]);for(let k=0;k({indentAtStart:e?t.indent.length:t.indentAtStart,lineWidth:t.options.lineWidth,minContentWidth:t.options.minContentWidth}),m6=t=>/^(%|---|\.\.\.)/m.test(t);function QcA(t,e,A){if(!e||e<0)return!1;let i=e-A,n=t.length;if(n<=i)return!1;for(let o=0,a=0;oi)return!0;if(a=o+1,n-a<=i)return!1}return!0}function Yu(t,e){let A=JSON.stringify(t);if(e.options.doubleQuotedAsJSON)return A;let{implicitKey:i}=e,n=e.options.doubleQuotedMinMultiLineLength,o=e.indent||(m6(t)?" ":""),a="",r=0;for(let s=0,l=A[s];l;l=A[++s])if(l===" "&&A[s+1]==="\\"&&A[s+2]==="n"&&(a+=A.slice(r,s)+"\\ ",s+=1,r=s,l="\\"),l==="\\")switch(A[s+1]){case"u":{a+=A.slice(r,s);let g=A.substr(s+2,4);switch(g){case"0000":a+="\\0";break;case"0007":a+="\\a";break;case"000b":a+="\\v";break;case"001b":a+="\\e";break;case"0085":a+="\\N";break;case"00a0":a+="\\_";break;case"2028":a+="\\L";break;case"2029":a+="\\P";break;default:g.substr(0,2)==="00"?a+="\\x"+g.substr(2):a+=A.substr(s,6)}s+=5,r=s+1}break;case"n":if(i||A[s+2]==='"'||A.length -`;let C,I;for(I=A.length;I>0;--I){let b=A[I-1];if(b!==` -`&&b!==" "&&b!==" ")break}let d=A.substring(I),h=d.indexOf(` -`);h===-1?C="-":A===d||h!==d.length-1?(C="+",o&&o()):C="",d&&(A=A.slice(0,-d.length),d[d.length-1]===` -`&&(d=d.slice(0,-1)),d=d.replace(LM,`$&${l}`));let E=!1,f,m=-1;for(f=0;f{x=!0});let z=Ou(`${v}${b}${d}`,l,u6,F);if(!x)return`>${S} -${l}${z}`}return A=A.replace(/\n+/g,`$&${l}`),`|${S} -${l}${v}${A}${d}`}function ucA(t,e,A,i){let{type:n,value:o}=t,{actualString:a,implicitKey:r,indent:s,indentStep:l,inFlow:g}=e;if(r&&o.includes(` -`)||g&&/[[\]{},]/.test(o))return XB(o,e);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(o))return r||g||!o.includes(` -`)?XB(o,e):f6(t,e,A,i);if(!r&&!g&&n!==Pt.PLAIN&&o.includes(` -`))return f6(t,e,A,i);if(m6(o)){if(s==="")return e.forceBlockIndent=!0,f6(t,e,A,i);if(r&&s===l)return XB(o,e)}let C=o.replace(/\n+/g,`$& -${s}`);if(a){let I=E=>E.default&&E.tag!=="tag:yaml.org,2002:str"&&E.test?.test(C),{compat:d,tags:h}=e.doc.schema;if(h.some(I)||d?.some(I))return XB(o,e)}return r?C:Ou(C,s,NM,p6(e,!1))}function M1(t,e,A,i){let{implicitKey:n,inFlow:o}=e,a=typeof t.value=="string"?t:Object.assign({},t,{value:String(t.value)}),{type:r}=t;r!==Pt.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(a.value)&&(r=Pt.QUOTE_DOUBLE);let s=g=>{switch(g){case Pt.BLOCK_FOLDED:case Pt.BLOCK_LITERAL:return n||o?XB(a.value,e):f6(a,e,A,i);case Pt.QUOTE_DOUBLE:return Yu(a.value,e);case Pt.QUOTE_SINGLE:return FM(a.value,e);case Pt.PLAIN:return ucA(a,e,A,i);default:return null}},l=s(r);if(l===null){let{defaultKeyType:g,defaultStringType:C}=e.options,I=n&&g||C;if(l=s(I),l===null)throw new Error(`Unsupported default string type ${I}`)}return l}function w6(t,e){let A=Object.assign({blockQuote:!0,commentString:gJ,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trueStr:"true",verifyAliasOrder:!0},t.schema.toStringOptions,e),i;switch(A.collectionStyle){case"block":i=!1;break;case"flow":i=!0;break;default:i=null}return{anchors:new Set,doc:t,flowCollectionPadding:A.flowCollectionPadding?" ":"",indent:"",indentStep:typeof A.indent=="number"?" ".repeat(A.indent):" ",inFlow:i,options:A}}function fcA(t,e){if(e.tag){let n=t.filter(o=>o.tag===e.tag);if(n.length>0)return n.find(o=>o.format===e.format)??n[0]}let A,i;if(Vi(e)){i=e.value;let n=t.filter(o=>o.identify?.(i));if(n.length>1){let o=n.filter(a=>a.test);o.length>0&&(n=o)}A=n.find(o=>o.format===e.format)??n.find(o=>!o.format)}else i=e,A=t.find(n=>n.nodeClass&&i instanceof n.nodeClass);if(!A){let n=i?.constructor?.name??(i===null?"null":typeof i);throw new Error(`Tag not resolved for ${n} value`)}return A}function pcA(t,e,{anchors:A,doc:i}){if(!i.directives)return"";let n=[],o=(Vi(t)||go(t))&&t.anchor;o&&E6(o)&&(A.add(o),n.push(`&${o}`));let a=t.tag??(e.default?null:e.tag);return a&&n.push(i.directives.tagString(a)),n.join(" ")}function iC(t,e,A,i){if(vn(t))return t.toString(e,A,i);if(ig(t)){if(e.doc.directives)return t.toString(e);if(e.resolvedAliases?.has(t))throw new TypeError("Cannot stringify circular structure without alias nodes");e.resolvedAliases?e.resolvedAliases.add(t):e.resolvedAliases=new Set([t]),t=t.resolve(e.doc)}let n,o=xn(t)?t:e.doc.createNode(t,{onTagObj:s=>n=s});n??(n=fcA(e.doc.schema.tags,o));let a=pcA(o,n,e);a.length>0&&(e.indentAtStart=(e.indentAtStart??0)+a.length+1);let r=typeof n.stringify=="function"?n.stringify(o,e,A,i):Vi(o)?M1(o,e,A,i):o.toString(e,A,i);return a?Vi(o)||r[0]==="{"||r[0]==="["?`${a} ${r}`:`${a} -${e.indent}${r}`:r}function CJ({key:t,value:e},A,i,n){let{allNullValues:o,doc:a,indent:r,indentStep:s,options:{commentString:l,indentSeq:g,simpleKeys:C}}=A,I=xn(t)&&t.comment||null;if(C){if(I)throw new Error("With simple keys, key nodes cannot have comments");if(go(t)||!xn(t)&&typeof t=="object"){let F="With simple keys, collection cannot be used as a key value";throw new Error(F)}}let d=!C&&(!t||I&&e==null&&!A.inFlow||go(t)||(Vi(t)?t.type===Pt.BLOCK_FOLDED||t.type===Pt.BLOCK_LITERAL:typeof t=="object"));A=Object.assign({},A,{allNullValues:!1,implicitKey:!d&&(C||!o),indent:r+s});let h=!1,E=!1,f=iC(t,A,()=>h=!0,()=>E=!0);if(!d&&!A.inFlow&&f.length>1024){if(C)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");d=!0}if(A.inFlow){if(o||e==null)return h&&i&&i(),f===""?"?":d?`? ${f}`:f}else if(o&&!C||e==null&&d)return f=`? ${f}`,I&&!h?f+=o0(f,A.indent,l(I)):E&&n&&n(),f;h&&(I=null),d?(I&&(f+=o0(f,A.indent,l(I))),f=`? ${f} -${r}:`):(f=`${f}:`,I&&(f+=o0(f,A.indent,l(I))));let m,v,k;xn(e)?(m=!!e.spaceBefore,v=e.commentBefore,k=e.comment):(m=!1,v=null,k=null,e&&typeof e=="object"&&(e=a.createNode(e))),A.implicitKey=!1,!d&&!I&&Vi(e)&&(A.indentAtStart=f.length+1),E=!1,!g&&s.length>=2&&!A.inFlow&&!d&&qg(e)&&!e.flow&&!e.tag&&!e.anchor&&(A.indent=A.indent.substring(2));let S=!1,b=iC(e,A,()=>S=!0,()=>E=!0),x=" ";if(I||m||v){if(x=m?` -`:"",v){let F=l(v);x+=` -${ng(F,A.indent)}`}b===""&&!A.inFlow?x===` -`&&k&&(x=` - -`):x+=` -${A.indent}`}else if(!d&&go(e)){let F=b[0],z=b.indexOf(` -`),P=z!==-1,Z=A.inFlow??e.flow??e.items.length===0;if(P||!Z){let tA=!1;if(P&&(F==="&"||F==="!")){let W=b.indexOf(" ");F==="&"&&W!==-1&&Wt===y6||typeof t=="symbol"&&t.description===y6,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new Pt(Symbol(y6)),{addToJSMap:KM}),stringify:()=>y6},IJ=(t,e)=>(Vg.identify(e)||Vi(e)&&(!e.type||e.type===Pt.PLAIN)&&Vg.identify(e.value))&&t?.doc.schema.tags.some(A=>A.tag===Vg.tag&&A.default);function KM(t,e,A){if(A=t&&ig(A)?A.resolve(t.doc):A,qg(A))for(let i of A.items)GM(t,e,i);else if(Array.isArray(A))for(let i of A)GM(t,e,i);else GM(t,e,A)}function GM(t,e,A){let i=t&&ig(A)?A.resolve(t.doc):A;if(!jg(i))throw new Error("Merge sources must be maps or map aliases");let n=i.toJSON(null,t,Map);for(let[o,a]of n)e instanceof Map?e.has(o)||e.set(o,a):e instanceof Set?e.add(o):Object.prototype.hasOwnProperty.call(e,o)||Object.defineProperty(e,o,{value:a,writable:!0,enumerable:!0,configurable:!0});return e}function v6(t,e,{key:A,value:i}){if(xn(A)&&A.addToJSMap)A.addToJSMap(t,e,i);else if(IJ(t,A))KM(t,e,i);else{let n=cr(A,"",t);if(e instanceof Map)e.set(n,cr(i,n,t));else if(e instanceof Set)e.add(n);else{let o=mcA(A,n,t),a=cr(i,o,t);o in e?Object.defineProperty(e,o,{value:a,writable:!0,enumerable:!0,configurable:!0}):e[o]=a}}return e}function mcA(t,e,A){if(e===null)return"";if(typeof e!="object")return String(e);if(xn(t)&&A?.doc){let i=w6(A.doc,{});i.anchors=new Set;for(let o of A.anchors.keys())i.anchors.add(o.anchor);i.inFlow=!0,i.inStringifyKey=!0;let n=t.toString(i);if(!A.mapKeyWarned){let o=JSON.stringify(n);o.length>40&&(o=o.substring(0,36)+'..."'),D6(A.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${o}. Set mapAsMap: true to use object keys.`),A.mapKeyWarned=!0}return n}return JSON.stringify(e)}function $B(t,e,A){let i=tC(t,void 0,A),n=tC(e,void 0,A);return new La(i,n)}var La=class t{constructor(e,A=null){Object.defineProperty(this,xs,{value:xM}),this.key=e,this.value=A}clone(e){let{key:A,value:i}=this;return xn(A)&&(A=A.clone(e)),xn(i)&&(i=i.clone(e)),new t(A,i)}toJSON(e,A){let i=A?.mapAsMap?new Map:{};return v6(A,i,this)}toString(e,A,i){return e?.doc?CJ(this,e,A,i):JSON.stringify(this)}};function M6(t,e,A){return(e.inFlow??t.flow?DcA:wcA)(t,e,A)}function wcA({comment:t,items:e},A,{blockItemPrefix:i,flowChars:n,itemIndent:o,onChompKeep:a,onComment:r}){let{indent:s,options:{commentString:l}}=A,g=Object.assign({},A,{indent:o,type:null}),C=!1,I=[];for(let h=0;hf=null,()=>C=!0);f&&(m+=o0(m,o,l(f))),C&&f&&(C=!1),I.push(i+m)}let d;if(I.length===0)d=n.start+n.end;else{d=I[0];for(let h=1;hf=null);hg||m.includes(` -`))&&(l=!0),C.push(m),g=C.length}let{start:I,end:d}=A;if(C.length===0)return I+d;if(!l){let h=C.reduce((E,f)=>E+f.length+2,2);l=e.options.lineWidth>0&&h>e.options.lineWidth}if(l){let h=I;for(let E of C)h+=E?` -${o}${n}${E}`:` -`;return`${h} -${n}${d}`}else return`${I}${a}${C.join(" ")}${a}${d}`}function b6({indent:t,options:{commentString:e}},A,i,n){if(i&&n&&(i=i.replace(/^\n+/,"")),i){let o=ng(e(i),t);A.push(o.trimStart())}}function m2(t,e){let A=Vi(e)?e.value:e;for(let i of t)if(vn(i)&&(i.key===e||i.key===A||Vi(i.key)&&i.key.value===A))return i}var Ha=class extends WB{static get tagName(){return"tag:yaml.org,2002:map"}constructor(e){super(zg,e),this.items=[]}static from(e,A,i){let{keepUndefined:n,replacer:o}=i,a=new this(e),r=(s,l)=>{if(typeof o=="function")l=o.call(A,s,l);else if(Array.isArray(o)&&!o.includes(s))return;(l!==void 0||n)&&a.items.push($B(s,l,i))};if(A instanceof Map)for(let[s,l]of A)r(s,l);else if(A&&typeof A=="object")for(let s of Object.keys(A))r(s,A[s]);return typeof e.sortMapEntries=="function"&&a.items.sort(e.sortMapEntries),a}add(e,A){let i;vn(e)?i=e:!e||typeof e!="object"||!("key"in e)?i=new La(e,e?.value):i=new La(e.key,e.value);let n=m2(this.items,i.key),o=this.schema?.sortMapEntries;if(n){if(!A)throw new Error(`Key ${i.key} already set`);Vi(n.value)&&Q6(i.value)?n.value.value=i.value:n.value=i.value}else if(o){let a=this.items.findIndex(r=>o(i,r)<0);a===-1?this.items.push(i):this.items.splice(a,0,i)}else this.items.push(i)}delete(e){let A=m2(this.items,e);return A?this.items.splice(this.items.indexOf(A),1).length>0:!1}get(e,A){let n=m2(this.items,e)?.value;return(!A&&Vi(n)?n.value:n)??void 0}has(e){return!!m2(this.items,e)}set(e,A){this.add(new La(e,A),!0)}toJSON(e,A,i){let n=i?new i:A?.mapAsMap?new Map:{};A?.onCreate&&A.onCreate(n);for(let o of this.items)v6(A,n,o);return n}toString(e,A,i){if(!e)return JSON.stringify(this);for(let n of this.items)if(!vn(n))throw new Error(`Map items must all be pairs; found ${JSON.stringify(n)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),M6(this,e,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:e.indent||"",onChompKeep:i,onComment:A})}};var Wg={collection:"map",default:!0,nodeClass:Ha,tag:"tag:yaml.org,2002:map",resolve(t,e){return jg(t)||e("Expected a mapping for this tag"),t},createNode:(t,e,A)=>Ha.from(t,e,A)};var Is=class extends WB{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(e){super(AC,e),this.items=[]}add(e){this.items.push(e)}delete(e){let A=S6(e);return typeof A!="number"?!1:this.items.splice(A,1).length>0}get(e,A){let i=S6(e);if(typeof i!="number")return;let n=this.items[i];return!A&&Vi(n)?n.value:n}has(e){let A=S6(e);return typeof A=="number"&&A=0?e:null}var Zg={collection:"seq",default:!0,nodeClass:Is,tag:"tag:yaml.org,2002:seq",resolve(t,e){return qg(t)||e("Expected a sequence for this tag"),t},createNode:(t,e,A)=>Is.from(t,e,A)};var w2={identify:t=>typeof t=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:t=>t,stringify(t,e,A,i){return e=Object.assign({actualString:!0},e),M1(t,e,A,i)}};var S1={identify:t=>t==null,createNode:()=>new Pt(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new Pt(null),stringify:({source:t},e)=>typeof t=="string"&&S1.test.test(t)?t:e.options.nullStr};var Hu={identify:t=>typeof t=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:t=>new Pt(t[0]==="t"||t[0]==="T"),stringify({source:t,value:e},A){if(t&&Hu.test.test(t)){let i=t[0]==="t"||t[0]==="T";if(e===i)return t}return e?A.options.trueStr:A.options.falseStr}};function ds({format:t,minFractionDigits:e,tag:A,value:i}){if(typeof i=="bigint")return String(i);let n=typeof i=="number"?i:Number(i);if(!isFinite(n))return isNaN(n)?".nan":n<0?"-.inf":".inf";let o=Object.is(i,-0)?"-0":JSON.stringify(i);if(!t&&e&&(!A||A==="tag:yaml.org,2002:float")&&/^\d/.test(o)){let a=o.indexOf(".");a<0&&(a=o.length,o+=".");let r=e-(o.length-a-1);for(;r-- >0;)o+="0"}return o}var k6={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()==="nan"?NaN:t[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:ds},x6={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t),stringify(t){let e=Number(t.value);return isFinite(e)?e.toExponential():ds(t)}},_6={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(t){let e=new Pt(parseFloat(t)),A=t.indexOf(".");return A!==-1&&t[t.length-1]==="0"&&(e.minFractionDigits=t.length-A-1),e},stringify:ds};var R6=t=>typeof t=="bigint"||Number.isInteger(t),UM=(t,e,A,{intAsBigInt:i})=>i?BigInt(t):parseInt(t.substring(e),A);function dJ(t,e,A){let{value:i}=t;return R6(i)&&i>=0?A+i.toString(e):ds(t)}var N6={identify:t=>R6(t)&&t>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(t,e,A)=>UM(t,2,8,A),stringify:t=>dJ(t,8,"0o")},F6={identify:R6,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(t,e,A)=>UM(t,0,10,A),stringify:ds},L6={identify:t=>R6(t)&&t>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(t,e,A)=>UM(t,2,16,A),stringify:t=>dJ(t,16,"0x")};var BJ=[Wg,Zg,w2,S1,Hu,N6,F6,L6,k6,x6,_6];function EJ(t){return typeof t=="bigint"||Number.isInteger(t)}var G6=({value:t})=>JSON.stringify(t),ycA=[{identify:t=>typeof t=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:t=>t,stringify:G6},{identify:t=>t==null,createNode:()=>new Pt(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:G6},{identify:t=>typeof t=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:t=>t==="true",stringify:G6},{identify:EJ,default:!0,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(t,e,{intAsBigInt:A})=>A?BigInt(t):parseInt(t,10),stringify:({value:t})=>EJ(t)?t.toString():JSON.stringify(t)},{identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:t=>parseFloat(t),stringify:G6}],vcA={default:!0,tag:"",test:/^/,resolve(t,e){return e(`Unresolved plain scalar ${JSON.stringify(t)}`),t}},hJ=[Wg,Zg].concat(ycA,vcA);var zu={identify:t=>t instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(t,e){if(typeof atob=="function"){let A=atob(t.replace(/[\n\r]/g,"")),i=new Uint8Array(A.length);for(let n=0;n1&&e("Each pair must have its own sequence indicator");let n=i.items[0]||new La(new Pt(null));if(i.commentBefore&&(n.key.commentBefore=n.key.commentBefore?`${i.commentBefore} -${n.key.commentBefore}`:i.commentBefore),i.comment){let o=n.value??n.key;o.comment=o.comment?`${i.comment} -${o.comment}`:i.comment}i=n}t.items[A]=vn(i)?i:new La(i)}}else e("Expected a sequence for this tag");return t}function JM(t,e,A){let{replacer:i}=A,n=new Is(t);n.tag="tag:yaml.org,2002:pairs";let o=0;if(e&&Symbol.iterator in Object(e))for(let a of e){typeof i=="function"&&(a=i.call(e,String(o++),a));let r,s;if(Array.isArray(a))if(a.length===2)r=a[0],s=a[1];else throw new TypeError(`Expected [key, value] tuple: ${a}`);else if(a&&a instanceof Object){let l=Object.keys(a);if(l.length===1)r=l[0],s=a[r];else throw new TypeError(`Expected tuple with one key, not ${l.length} keys`)}else r=a;n.items.push($B(r,s,A))}return n}var Pu={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:TM,createNode:JM};var OM=(()=>{class t extends Is{constructor(){super(),this.add=Ha.prototype.add.bind(this),this.delete=Ha.prototype.delete.bind(this),this.get=Ha.prototype.get.bind(this),this.has=Ha.prototype.has.bind(this),this.set=Ha.prototype.set.bind(this),this.tag=t.tag}toJSON(A,i){if(!i)return super.toJSON(A);let n=new Map;i?.onCreate&&i.onCreate(n);for(let o of this.items){let a,r;if(vn(o)?(a=cr(o.key,"",i),r=cr(o.value,a,i)):a=cr(o,"",i),n.has(a))throw new Error("Ordered maps must not include duplicate keys");n.set(a,r)}return n}static from(A,i,n){let o=JM(A,i,n),a=new this;return a.items=o.items,a}}return t.tag="tag:yaml.org,2002:omap",t})(),ju={collection:"seq",identify:t=>t instanceof Map,nodeClass:OM,default:!1,tag:"tag:yaml.org,2002:omap",resolve(t,e){let A=TM(t,e),i=[];for(let{key:n}of A.items)Vi(n)&&(i.includes(n.value)?e(`Ordered maps must not include duplicate keys: ${n.value}`):i.push(n.value));return Object.assign(new OM,A)},createNode:(t,e,A)=>OM.from(t,e,A)};function QJ({value:t,source:e},A){return e&&(t?YM:HM).test.test(e)?e:t?A.options.trueStr:A.options.falseStr}var YM={identify:t=>t===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new Pt(!0),stringify:QJ},HM={identify:t=>t===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new Pt(!1),stringify:QJ};var uJ={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()==="nan"?NaN:t[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:ds},fJ={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t.replace(/_/g,"")),stringify(t){let e=Number(t.value);return isFinite(e)?e.toExponential():ds(t)}},pJ={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(t){let e=new Pt(parseFloat(t.replace(/_/g,""))),A=t.indexOf(".");if(A!==-1){let i=t.substring(A+1).replace(/_/g,"");i[i.length-1]==="0"&&(e.minFractionDigits=i.length)}return e},stringify:ds};var qu=t=>typeof t=="bigint"||Number.isInteger(t);function K6(t,e,A,{intAsBigInt:i}){let n=t[0];if((n==="-"||n==="+")&&(e+=1),t=t.substring(e).replace(/_/g,""),i){switch(A){case 2:t=`0b${t}`;break;case 8:t=`0o${t}`;break;case 16:t=`0x${t}`;break}let a=BigInt(t);return n==="-"?BigInt(-1)*a:a}let o=parseInt(t,A);return n==="-"?-1*o:o}function zM(t,e,A){let{value:i}=t;if(qu(i)){let n=i.toString(e);return i<0?"-"+A+n.substr(1):A+n}return ds(t)}var mJ={identify:qu,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(t,e,A)=>K6(t,2,2,A),stringify:t=>zM(t,2,"0b")},wJ={identify:qu,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(t,e,A)=>K6(t,1,8,A),stringify:t=>zM(t,8,"0")},DJ={identify:qu,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(t,e,A)=>K6(t,0,10,A),stringify:ds},yJ={identify:qu,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(t,e,A)=>K6(t,2,16,A),stringify:t=>zM(t,16,"0x")};var PM=(()=>{class t extends Ha{constructor(A){super(A),this.tag=t.tag}add(A){let i;vn(A)?i=A:A&&typeof A=="object"&&"key"in A&&"value"in A&&A.value===null?i=new La(A.key,null):i=new La(A,null),m2(this.items,i.key)||this.items.push(i)}get(A,i){let n=m2(this.items,A);return!i&&vn(n)?Vi(n.key)?n.key.value:n.key:n}set(A,i){if(typeof i!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof i}`);let n=m2(this.items,A);n&&!i?this.items.splice(this.items.indexOf(n),1):!n&&i&&this.items.push(new La(A))}toJSON(A,i){return super.toJSON(A,i,Set)}toString(A,i,n){if(!A)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},A,{allNullValues:!0}),i,n);throw new Error("Set items must all have null values")}static from(A,i,n){let{replacer:o}=n,a=new this(A);if(i&&Symbol.iterator in Object(i))for(let r of i)typeof o=="function"&&(r=o.call(i,r,r)),a.items.push($B(r,null,n));return a}}return t.tag="tag:yaml.org,2002:set",t})(),Vu={collection:"map",identify:t=>t instanceof Set,nodeClass:PM,default:!1,tag:"tag:yaml.org,2002:set",createNode:(t,e,A)=>PM.from(t,e,A),resolve(t,e){if(jg(t)){if(t.hasAllNullValues(!0))return Object.assign(new PM,t);e("Set items must all have null values")}else e("Expected a mapping for this tag");return t}};function jM(t,e){let A=t[0],i=A==="-"||A==="+"?t.substring(1):t,n=a=>e?BigInt(a):Number(a),o=i.replace(/_/g,"").split(":").reduce((a,r)=>a*n(60)+n(r),n(0));return A==="-"?n(-1)*o:o}function vJ(t){let{value:e}=t,A=a=>a;if(typeof e=="bigint")A=a=>BigInt(a);else if(isNaN(e)||!isFinite(e))return ds(t);let i="";e<0&&(i="-",e*=A(-1));let n=A(60),o=[e%n];return e<60?o.unshift(0):(e=(e-o[0])/n,o.unshift(e%n),e>=60&&(e=(e-o[0])/n,o.unshift(e))),i+o.map(a=>String(a).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var U6={identify:t=>typeof t=="bigint"||Number.isInteger(t),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(t,e,{intAsBigInt:A})=>jM(t,A),stringify:vJ},T6={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:t=>jM(t,!1),stringify:vJ},AE={identify:t=>t instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(t){let e=t.match(AE.test);if(!e)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,A,i,n,o,a,r]=e.map(Number),s=e[7]?Number((e[7]+"00").substr(1,3)):0,l=Date.UTC(A,i-1,n,o||0,a||0,r||0,s),g=e[8];if(g&&g!=="Z"){let C=jM(g,!1);Math.abs(C)<30&&(C*=60),l-=6e4*C}return new Date(l)},stringify:({value:t})=>t?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};var qM=[Wg,Zg,w2,S1,YM,HM,mJ,wJ,DJ,yJ,uJ,fJ,pJ,zu,Vg,ju,Pu,Vu,U6,T6,AE];var bJ=new Map([["core",BJ],["failsafe",[Wg,Zg,w2]],["json",hJ],["yaml11",qM],["yaml-1.1",qM]]),MJ={binary:zu,bool:Hu,float:_6,floatExp:x6,floatNaN:k6,floatTime:T6,int:F6,intHex:L6,intOct:N6,intTime:U6,map:Wg,merge:Vg,null:S1,omap:ju,pairs:Pu,seq:Zg,set:Vu,timestamp:AE},SJ={"tag:yaml.org,2002:binary":zu,"tag:yaml.org,2002:merge":Vg,"tag:yaml.org,2002:omap":ju,"tag:yaml.org,2002:pairs":Pu,"tag:yaml.org,2002:set":Vu,"tag:yaml.org,2002:timestamp":AE};function J6(t,e,A){let i=bJ.get(e);if(i&&!t)return A&&!i.includes(Vg)?i.concat(Vg):i.slice();let n=i;if(!n)if(Array.isArray(t))n=[];else{let o=Array.from(bJ.keys()).filter(a=>a!=="yaml11").map(a=>JSON.stringify(a)).join(", ");throw new Error(`Unknown schema "${e}"; use one of ${o} or define customTags array`)}if(Array.isArray(t))for(let o of t)n=n.concat(o);else typeof t=="function"&&(n=t(n.slice()));return A&&(n=n.concat(Vg)),n.reduce((o,a)=>{let r=typeof a=="string"?MJ[a]:a;if(!r){let s=JSON.stringify(a),l=Object.keys(MJ).map(g=>JSON.stringify(g)).join(", ");throw new Error(`Unknown custom tag ${s}; use one of ${l}`)}return o.includes(r)||o.push(r),o},[])}var bcA=(t,e)=>t.keye.key?1:0,Wu=class t{constructor({compat:e,customTags:A,merge:i,resolveKnownTags:n,schema:o,sortMapEntries:a,toStringDefaults:r}){this.compat=Array.isArray(e)?J6(e,"compat"):e?J6(null,e):null,this.name=typeof o=="string"&&o||"core",this.knownTags=n?SJ:{},this.tags=J6(A,this.name,i),this.toStringOptions=r??null,Object.defineProperty(this,zg,{value:Wg}),Object.defineProperty(this,Sl,{value:w2}),Object.defineProperty(this,AC,{value:Zg}),this.sortMapEntries=typeof a=="function"?a:a===!0?bcA:null}clone(){let e=Object.create(t.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}};function kJ(t,e){let A=[],i=e.directives===!0;if(e.directives!==!1&&t.directives){let s=t.directives.toString(t);s?(A.push(s),i=!0):t.directives.docStart&&(i=!0)}i&&A.push("---");let n=w6(t,e),{commentString:o}=n.options;if(t.commentBefore){A.length!==1&&A.unshift("");let s=o(t.commentBefore);A.unshift(ng(s,""))}let a=!1,r=null;if(t.contents){if(xn(t.contents)){if(t.contents.spaceBefore&&i&&A.push(""),t.contents.commentBefore){let g=o(t.contents.commentBefore);A.push(ng(g,""))}n.forceBlockIndent=!!t.comment,r=t.contents.comment}let s=r?void 0:()=>a=!0,l=iC(t.contents,n,()=>r=null,s);r&&(l+=o0(l,"",o(r))),(l[0]==="|"||l[0]===">")&&A[A.length-1]==="---"?A[A.length-1]=`--- ${l}`:A.push(l)}else A.push(iC(t.contents,n));if(t.directives?.docEnd)if(t.comment){let s=o(t.comment);s.includes(` -`)?(A.push("..."),A.push(ng(s,""))):A.push(`... ${s}`)}else A.push("...");else{let s=t.comment;s&&a&&(s=s.replace(/^\n+/,"")),s&&((!a||r)&&A[A.length-1]!==""&&A.push(""),A.push(ng(o(s),"")))}return A.join(` -`)+` -`}var nC=class t{constructor(e,A,i){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,xs,{value:I6});let n=null;typeof A=="function"||Array.isArray(A)?n=A:i===void 0&&A&&(i=A,A=void 0);let o=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:"1.2"},i);this.options=o;let{version:a}=o;i?._directives?(this.directives=i._directives.atDocument(),this.directives.yaml.explicit&&(a=this.directives.yaml.version)):this.directives=new VB({version:a}),this.setSchema(a,i),this.contents=e===void 0?null:this.createNode(e,n,i)}clone(){let e=Object.create(t.prototype,{[xs]:{value:I6}});return e.commentBefore=this.commentBefore,e.comment=this.comment,e.errors=this.errors.slice(),e.warnings=this.warnings.slice(),e.options=Object.assign({},this.options),this.directives&&(e.directives=this.directives.clone()),e.schema=this.schema.clone(),e.contents=xn(this.contents)?this.contents.clone(e.schema):this.contents,this.range&&(e.range=this.range.slice()),e}add(e){eE(this.contents)&&this.contents.add(e)}addIn(e,A){eE(this.contents)&&this.contents.addIn(e,A)}createAlias(e,A){if(!e.anchor){let i=_M(this);e.anchor=!A||i.has(A)?RM(A||"a",i):A}return new eC(e.anchor)}createNode(e,A,i){let n;if(typeof A=="function")e=A.call({"":e},"",e),n=A;else if(Array.isArray(A)){let f=v=>typeof v=="number"||v instanceof String||v instanceof Number,m=A.filter(f).map(String);m.length>0&&(A=A.concat(m)),n=A}else i===void 0&&A&&(i=A,A=void 0);let{aliasDuplicateObjects:o,anchorPrefix:a,flow:r,keepUndefined:s,onTagObj:l,tag:g}=i??{},{onAnchor:C,setAnchors:I,sourceObjects:d}=lJ(this,a||"a"),h={aliasDuplicateObjects:o??!0,keepUndefined:s??!1,onAnchor:C,onTagObj:l,replacer:n,schema:this.schema,sourceObjects:d},E=tC(e,g,h);return r&&go(E)&&(E.flow=!0),I(),E}createPair(e,A,i={}){let n=this.createNode(e,null,i),o=this.createNode(A,null,i);return new La(n,o)}delete(e){return eE(this.contents)?this.contents.delete(e):!1}deleteIn(e){return ZB(e)?this.contents==null?!1:(this.contents=null,!0):eE(this.contents)?this.contents.deleteIn(e):!1}get(e,A){return go(this.contents)?this.contents.get(e,A):void 0}getIn(e,A){return ZB(e)?!A&&Vi(this.contents)?this.contents.value:this.contents:go(this.contents)?this.contents.getIn(e,A):void 0}has(e){return go(this.contents)?this.contents.has(e):!1}hasIn(e){return ZB(e)?this.contents!==void 0:go(this.contents)?this.contents.hasIn(e):!1}set(e,A){this.contents==null?this.contents=Tu(this.schema,[e],A):eE(this.contents)&&this.contents.set(e,A)}setIn(e,A){ZB(e)?this.contents=A:this.contents==null?this.contents=Tu(this.schema,Array.from(e),A):eE(this.contents)&&this.contents.setIn(e,A)}setSchema(e,A={}){typeof e=="number"&&(e=String(e));let i;switch(e){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new VB({version:"1.1"}),i={resolveKnownTags:!1,schema:"yaml-1.1"};break;case"1.2":case"next":this.directives?this.directives.yaml.version=e:this.directives=new VB({version:e}),i={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,i=null;break;default:{let n=JSON.stringify(e);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${n}`)}}if(A.schema instanceof Object)this.schema=A.schema;else if(i)this.schema=new Wu(Object.assign(i,A));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:e,jsonArg:A,mapAsMap:i,maxAliasCount:n,onAnchor:o,reviver:a}={}){let r={anchors:new Map,doc:this,keep:!e,mapAsMap:i===!0,mapKeyWarned:!1,maxAliasCount:typeof n=="number"?n:100},s=cr(this.contents,A??"",r);if(typeof o=="function")for(let{count:l,res:g}of r.anchors.values())o(g,l);return typeof a=="function"?f2(a,{"":s},"",s):s}toJSON(e,A){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:A})}toString(e={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){let A=JSON.stringify(e.indent);throw new Error(`"indent" option must be a positive integer, not ${A}`)}return kJ(this,e)}};function eE(t){if(go(t))return!0;throw new Error("Expected a YAML collection as document contents")}var Zu=class extends Error{constructor(e,A,i,n){super(),this.name=e,this.code=i,this.message=n,this.pos=A}},Xg=class extends Zu{constructor(e,A,i){super("YAMLParseError",e,A,i)}},Xu=class extends Zu{constructor(e,A,i){super("YAMLWarning",e,A,i)}},VM=(t,e)=>A=>{if(A.pos[0]===-1)return;A.linePos=A.pos.map(r=>e.linePos(r));let{line:i,col:n}=A.linePos[0];A.message+=` at line ${i}, column ${n}`;let o=n-1,a=t.substring(e.lineStarts[i-1],e.lineStarts[i]).replace(/[\n\r]+$/,"");if(o>=60&&a.length>80){let r=Math.min(o-39,a.length-79);a="\u2026"+a.substring(r),o-=r-1}if(a.length>80&&(a=a.substring(0,79)+"\u2026"),i>1&&/^ *$/.test(a.substring(0,o))){let r=t.substring(e.lineStarts[i-2],e.lineStarts[i-1]);r.length>80&&(r=r.substring(0,79)+`\u2026 -`),a=r+a}if(/[^ ]/.test(a)){let r=1,s=A.linePos[1];s?.line===i&&s.col>n&&(r=Math.max(1,Math.min(s.col-n,80-o)));let l=" ".repeat(o)+"^".repeat(r);A.message+=`: - -${a} -${l} -`}};function a0(t,{flow:e,indicator:A,next:i,offset:n,onError:o,parentIndent:a,startOnNewline:r}){let s=!1,l=r,g=r,C="",I="",d=!1,h=!1,E=null,f=null,m=null,v=null,k=null,S=null,b=null;for(let z of t)switch(h&&(z.type!=="space"&&z.type!=="newline"&&z.type!=="comma"&&o(z.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),h=!1),E&&(l&&z.type!=="comment"&&z.type!=="newline"&&o(E,"TAB_AS_INDENT","Tabs are not allowed as indentation"),E=null),z.type){case"space":!e&&(A!=="doc-start"||i?.type!=="flow-collection")&&z.source.includes(" ")&&(E=z),g=!0;break;case"comment":{g||o(z,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let P=z.source.substring(1)||" ";C?C+=I+P:C=P,I="",l=!1;break}case"newline":l?C?C+=z.source:(!S||A!=="seq-item-ind")&&(s=!0):I+=z.source,l=!0,d=!0,(f||m)&&(v=z),g=!0;break;case"anchor":f&&o(z,"MULTIPLE_ANCHORS","A node can have at most one anchor"),z.source.endsWith(":")&&o(z.offset+z.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),f=z,b??(b=z.offset),l=!1,g=!1,h=!0;break;case"tag":{m&&o(z,"MULTIPLE_TAGS","A node can have at most one tag"),m=z,b??(b=z.offset),l=!1,g=!1,h=!0;break}case A:(f||m)&&o(z,"BAD_PROP_ORDER",`Anchors and tags must be after the ${z.source} indicator`),S&&o(z,"UNEXPECTED_TOKEN",`Unexpected ${z.source} in ${e??"collection"}`),S=z,l=A==="seq-item-ind"||A==="explicit-key-ind",g=!1;break;case"comma":if(e){k&&o(z,"UNEXPECTED_TOKEN",`Unexpected , in ${e}`),k=z,l=!1,g=!1;break}default:o(z,"UNEXPECTED_TOKEN",`Unexpected ${z.type} token`),l=!1,g=!1}let x=t[t.length-1],F=x?x.offset+x.source.length:n;return h&&i&&i.type!=="space"&&i.type!=="newline"&&i.type!=="comma"&&(i.type!=="scalar"||i.source!=="")&&o(i.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),E&&(l&&E.indent<=a||i?.type==="block-map"||i?.type==="block-seq")&&o(E,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:k,found:S,spaceBefore:s,comment:C,hasNewline:d,anchor:f,tag:m,newlineAfterProp:v,end:F,start:b??F}}function D2(t){if(!t)return null;switch(t.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(t.source.includes(` -`))return!0;if(t.end){for(let e of t.end)if(e.type==="newline")return!0}return!1;case"flow-collection":for(let e of t.items){for(let A of e.start)if(A.type==="newline")return!0;if(e.sep){for(let A of e.sep)if(A.type==="newline")return!0}if(D2(e.key)||D2(e.value))return!0}return!1;default:return!0}}function $u(t,e,A){if(e?.type==="flow-collection"){let i=e.end[0];i.indent===t&&(i.source==="]"||i.source==="}")&&D2(e)&&A(i,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function O6(t,e,A){let{uniqueKeys:i}=t.options;if(i===!1)return!1;let n=typeof i=="function"?i:(o,a)=>o===a||Vi(o)&&Vi(a)&&o.value===a.value;return e.some(o=>n(o.key,A))}var xJ="All mapping items must start at the same column";function _J({composeNode:t,composeEmptyNode:e},A,i,n,o){let a=o?.nodeClass??Ha,r=new a(A.schema);A.atRoot&&(A.atRoot=!1);let s=i.offset,l=null;for(let g of i.items){let{start:C,key:I,sep:d,value:h}=g,E=a0(C,{indicator:"explicit-key-ind",next:I??d?.[0],offset:s,onError:n,parentIndent:i.indent,startOnNewline:!0}),f=!E.found;if(f){if(I&&(I.type==="block-seq"?n(s,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in I&&I.indent!==i.indent&&n(s,"BAD_INDENT",xJ)),!E.anchor&&!E.tag&&!d){l=E.end,E.comment&&(r.comment?r.comment+=` -`+E.comment:r.comment=E.comment);continue}(E.newlineAfterProp||D2(I))&&n(I??C[C.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else E.found?.indent!==i.indent&&n(s,"BAD_INDENT",xJ);A.atKey=!0;let m=E.end,v=I?t(A,I,E,n):e(A,m,C,null,E,n);A.schema.compat&&$u(i.indent,I,n),A.atKey=!1,O6(A,r.items,v)&&n(m,"DUPLICATE_KEY","Map keys must be unique");let k=a0(d??[],{indicator:"map-value-ind",next:h,offset:v.range[2],onError:n,parentIndent:i.indent,startOnNewline:!I||I.type==="block-scalar"});if(s=k.end,k.found){f&&(h?.type==="block-map"&&!k.hasNewline&&n(s,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),A.options.strict&&E.startt&&(t.type==="block-map"||t.type==="block-seq");function NJ({composeNode:t,composeEmptyNode:e},A,i,n,o){let a=i.start.source==="{",r=a?"flow map":"flow sequence",s=o?.nodeClass??(a?Ha:Is),l=new s(A.schema);l.flow=!0;let g=A.atRoot;g&&(A.atRoot=!1),A.atKey&&(A.atKey=!1);let C=i.offset+i.start.source.length;for(let f=0;f0){let f=r0(h,E,A.options.strict,n);f.comment&&(l.comment?l.comment+=` -`+f.comment:l.comment=f.comment),l.range=[i.offset,E,f.offset]}else l.range=[i.offset,E,E];return l}function XM(t,e,A,i,n,o){let a=A.type==="block-map"?_J(t,e,A,i,o):A.type==="block-seq"?RJ(t,e,A,i,o):NJ(t,e,A,i,o),r=a.constructor;return n==="!"||n===r.tagName?(a.tag=r.tagName,a):(n&&(a.tag=n),a)}function FJ(t,e,A,i,n){let o=i.tag,a=o?e.directives.tagName(o.source,I=>n(o,"TAG_RESOLVE_FAILED",I)):null;if(A.type==="block-seq"){let{anchor:I,newlineAfterProp:d}=i,h=I&&o?I.offset>o.offset?I:o:I??o;h&&(!d||d.offsetI.tag===a&&I.collection===r);if(!s){let I=e.schema.knownTags[a];if(I?.collection===r)e.schema.tags.push(Object.assign({},I,{default:!1})),s=I;else return I?n(o,"BAD_COLLECTION_TYPE",`${I.tag} used for ${r} collection, but expects ${I.collection??"scalar"}`,!0):n(o,"TAG_RESOLVE_FAILED",`Unresolved tag: ${a}`,!0),XM(t,e,A,n,a)}let l=XM(t,e,A,n,a,s),g=s.resolve?.(l,I=>n(o,"TAG_RESOLVE_FAILED",I),e.options)??l,C=xn(g)?g:new Pt(g);return C.range=l.range,C.tag=a,s?.format&&(C.format=s.format),C}function $M(t,e,A){let i=e.offset,n=McA(e,t.options.strict,A);if(!n)return{value:"",type:null,comment:"",range:[i,i,i]};let o=n.mode===">"?Pt.BLOCK_FOLDED:Pt.BLOCK_LITERAL,a=e.source?ScA(e.source):[],r=a.length;for(let E=a.length-1;E>=0;--E){let f=a[E][1];if(f===""||f==="\r")r=E;else break}if(r===0){let E=n.chomp==="+"&&a.length>0?` -`.repeat(Math.max(1,a.length-1)):"",f=i+n.length;return e.source&&(f+=e.source.length),{value:E,type:o,comment:n.comment,range:[i,f,f]}}let s=e.indent+n.indent,l=e.offset+n.length,g=0;for(let E=0;Es&&(s=f.length);else{f.length=r;--E)a[E][0].length>s&&(r=E+1);let C="",I="",d=!1;for(let E=0;Es||m[0]===" "?(I===" "?I=` -`:!d&&I===` -`&&(I=` - -`),C+=I+f.slice(s)+m,I=` -`,d=!0):m===""?I===` -`?C+=` -`:I=` -`:(C+=I+m,I=" ",d=!1)}switch(n.chomp){case"-":break;case"+":for(let E=r;EA(i+I,d,h);switch(n){case"scalar":r=Pt.PLAIN,s=kcA(o,l);break;case"single-quoted-scalar":r=Pt.QUOTE_SINGLE,s=xcA(o,l);break;case"double-quoted-scalar":r=Pt.QUOTE_DOUBLE,s=_cA(o,l);break;default:return A(t,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${n}`),{value:"",type:null,comment:"",range:[i,i+o.length,i+o.length]}}let g=i+o.length,C=r0(a,g,e,A);return{value:s,type:r,comment:C.comment,range:[i,g,C.offset]}}function kcA(t,e){let A="";switch(t[0]){case" ":A="a tab character";break;case",":A="flow indicator character ,";break;case"%":A="directive indicator character %";break;case"|":case">":{A=`block scalar indicator ${t[0]}`;break}case"@":case"`":{A=`reserved character ${t[0]}`;break}}return A&&e(0,"BAD_SCALAR_START",`Plain value cannot start with ${A}`),LJ(t)}function xcA(t,e){return(t[t.length-1]!=="'"||t.length===1)&&e(t.length,"MISSING_CHAR","Missing closing 'quote"),LJ(t.slice(1,-1)).replace(/''/g,"'")}function LJ(t){let e,A;try{e=new RegExp(`(.*?)(?o?t.slice(o,i+1):n)}else A+=n}return(t[t.length-1]!=='"'||t.length===1)&&e(t.length,"MISSING_CHAR",'Missing closing "quote'),A}function RcA(t,e){let A="",i=t[e+1];for(;(i===" "||i===" "||i===` -`||i==="\r")&&!(i==="\r"&&t[e+2]!==` -`);)i===` -`&&(A+=` -`),e+=1,i=t[e+1];return A||(A=" "),{fold:A,offset:e}}var NcA={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:` -`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function FcA(t,e,A,i){let n=t.substr(e,A),a=n.length===A&&/^[0-9a-fA-F]+$/.test(n)?parseInt(n,16):NaN;if(isNaN(a)){let r=t.substr(e-2,A+2);return i(e-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${r}`),r}return String.fromCodePoint(a)}function e9(t,e,A,i){let{value:n,type:o,comment:a,range:r}=e.type==="block-scalar"?$M(t,e,i):A9(e,t.options.strict,i),s=A?t.directives.tagName(A.source,C=>i(A,"TAG_RESOLVE_FAILED",C)):null,l;t.options.stringKeys&&t.atKey?l=t.schema[Sl]:s?l=LcA(t.schema,n,s,A,i):e.type==="scalar"?l=GcA(t,n,e,i):l=t.schema[Sl];let g;try{let C=l.resolve(n,I=>i(A??e,"TAG_RESOLVE_FAILED",I),t.options);g=Vi(C)?C:new Pt(C)}catch(C){let I=C instanceof Error?C.message:String(C);i(A??e,"TAG_RESOLVE_FAILED",I),g=new Pt(n)}return g.range=r,g.source=n,o&&(g.type=o),s&&(g.tag=s),l.format&&(g.format=l.format),a&&(g.comment=a),g}function LcA(t,e,A,i,n){if(A==="!")return t[Sl];let o=[];for(let r of t.tags)if(!r.collection&&r.tag===A)if(r.default&&r.test)o.push(r);else return r;for(let r of o)if(r.test?.test(e))return r;let a=t.knownTags[A];return a&&!a.collection?(t.tags.push(Object.assign({},a,{default:!1,test:void 0})),a):(n(i,"TAG_RESOLVE_FAILED",`Unresolved tag: ${A}`,A!=="tag:yaml.org,2002:str"),t[Sl])}function GcA({atKey:t,directives:e,schema:A},i,n,o){let a=A.tags.find(r=>(r.default===!0||t&&r.default==="key")&&r.test?.test(i))||A[Sl];if(A.compat){let r=A.compat.find(s=>s.default&&s.test?.test(i))??A[Sl];if(a.tag!==r.tag){let s=e.tagString(a.tag),l=e.tagString(r.tag),g=`Value may be parsed as either ${s} or ${l}`;o(n,"TAG_RESOLVE_FAILED",g,!0)}}return a}function GJ(t,e,A){if(e){A??(A=e.length);for(let i=A-1;i>=0;--i){let n=e[i];switch(n.type){case"space":case"comment":case"newline":t-=n.source.length;continue}for(n=e[++i];n?.type==="space";)t+=n.source.length,n=e[++i];break}}return t}var KcA={composeNode:t9,composeEmptyNode:Y6};function t9(t,e,A,i){let n=t.atKey,{spaceBefore:o,comment:a,anchor:r,tag:s}=A,l,g=!0;switch(e.type){case"alias":l=UcA(t,e,i),(r||s)&&i(e,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":l=e9(t,e,s,i),r&&(l.anchor=r.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":l=FJ(KcA,t,e,A,i),r&&(l.anchor=r.source.substring(1));break;default:{let C=e.type==="error"?e.message:`Unsupported token (type: ${e.type})`;i(e,"UNEXPECTED_TOKEN",C),l=Y6(t,e.offset,void 0,null,A,i),g=!1}}return r&&l.anchor===""&&i(r,"BAD_ALIAS","Anchor cannot be an empty string"),n&&t.options.stringKeys&&(!Vi(l)||typeof l.value!="string"||l.tag&&l.tag!=="tag:yaml.org,2002:str")&&i(s??e,"NON_STRING_KEY","With stringKeys, all keys must be strings"),o&&(l.spaceBefore=!0),a&&(e.type==="scalar"&&e.source===""?l.comment=a:l.commentBefore=a),t.options.keepSourceTokens&&g&&(l.srcToken=e),l}function Y6(t,e,A,i,{spaceBefore:n,comment:o,anchor:a,tag:r,end:s},l){let g={type:"scalar",offset:GJ(e,A,i),indent:-1,source:""},C=e9(t,g,r,l);return a&&(C.anchor=a.source.substring(1),C.anchor===""&&l(a,"BAD_ALIAS","Anchor cannot be an empty string")),n&&(C.spaceBefore=!0),o&&(C.comment=o,C.range[2]=s),C}function UcA({options:t},{offset:e,source:A,end:i},n){let o=new eC(A.substring(1));o.source===""&&n(e,"BAD_ALIAS","Alias cannot be an empty string"),o.source.endsWith(":")&&n(e+A.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let a=e+A.length,r=r0(i,a,t.strict,n);return o.range=[e,a,r.offset],r.comment&&(o.comment=r.comment),o}function KJ(t,e,{offset:A,start:i,value:n,end:o},a){let r=Object.assign({_directives:e},t),s=new nC(void 0,r),l={atKey:!1,atRoot:!0,directives:s.directives,options:s.options,schema:s.schema},g=a0(i,{indicator:"doc-start",next:n??o?.[0],offset:A,onError:a,parentIndent:0,startOnNewline:!0});g.found&&(s.directives.docStart=!0,n&&(n.type==="block-map"||n.type==="block-seq")&&!g.hasNewline&&a(g.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),s.contents=n?t9(l,n,g,a):Y6(l,g.end,i,null,g,a);let C=s.contents.range[2],I=r0(o,C,!1,a);return I.comment&&(s.comment=I.comment),s.range=[A,C,I.offset],s}function A4(t){if(typeof t=="number")return[t,t+1];if(Array.isArray(t))return t.length===2?t:[t[0],t[1]];let{offset:e,source:A}=t;return[e,e+(typeof A=="string"?A.length:1)]}function UJ(t){let e="",A=!1,i=!1;for(let n=0;n{let a=A4(A);o?this.warnings.push(new Xu(a,i,n)):this.errors.push(new Xg(a,i,n))},this.directives=new VB({version:e.version||"1.2"}),this.options=e}decorate(e,A){let{comment:i,afterEmptyLine:n}=UJ(this.prelude);if(i){let o=e.contents;if(A)e.comment=e.comment?`${e.comment} -${i}`:i;else if(n||e.directives.docStart||!o)e.commentBefore=i;else if(go(o)&&!o.flow&&o.items.length>0){let a=o.items[0];vn(a)&&(a=a.key);let r=a.commentBefore;a.commentBefore=r?`${i} -${r}`:i}else{let a=o.commentBefore;o.commentBefore=a?`${i} -${a}`:i}}A?(Array.prototype.push.apply(e.errors,this.errors),Array.prototype.push.apply(e.warnings,this.warnings)):(e.errors=this.errors,e.warnings=this.warnings),this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:UJ(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,A=!1,i=-1){for(let n of e)yield*Ce(this.next(n));yield*Ce(this.end(A,i))}*next(e){switch(e.type){case"directive":this.directives.add(e.source,(A,i,n)=>{let o=A4(e);o[0]+=A,this.onError(o,"BAD_DIRECTIVE",i,n)}),this.prelude.push(e.source),this.atDirectives=!0;break;case"document":{let A=KJ(this.options,this.directives,e,this.onError);this.atDirectives&&!A.directives.docStart&&this.onError(e,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(A,!1),this.doc&&(yield this.doc),this.doc=A,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(e.source);break;case"error":{let A=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,i=new Xg(A4(e),"UNEXPECTED_TOKEN",A);this.atDirectives||!this.doc?this.errors.push(i):this.doc.errors.push(i);break}case"doc-end":{if(!this.doc){let i="Unexpected doc-end without preceding document";this.errors.push(new Xg(A4(e),"UNEXPECTED_TOKEN",i));break}this.doc.directives.docEnd=!0;let A=r0(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),A.comment){let i=this.doc.comment;this.doc.comment=i?`${i} -${A.comment}`:A.comment}this.doc.range[2]=A.offset;break}default:this.errors.push(new Xg(A4(e),"UNEXPECTED_TOKEN",`Unsupported token ${e.type}`))}}*end(e=!1,A=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){let i=Object.assign({_directives:this.directives},this.options),n=new nC(void 0,i);this.atDirectives&&this.onError(A,"MISSING_CHAR","Missing directives-end indicator line"),n.range=[0,A,A],this.decorate(n,!1),yield n}}};var i9=Symbol("break visit"),TcA=Symbol("skip children"),TJ=Symbol("remove item");function k1(t,e){"type"in t&&t.type==="document"&&(t={start:t.start,value:t.value}),JJ(Object.freeze([]),t,e)}k1.BREAK=i9;k1.SKIP=TcA;k1.REMOVE=TJ;k1.itemAtPath=(t,e)=>{let A=t;for(let[i,n]of e){let o=A?.[i];if(o&&"items"in o)A=o.items[n];else return}return A};k1.parentCollection=(t,e)=>{let A=k1.itemAtPath(t,e.slice(0,-1)),i=e[e.length-1][0],n=A?.[i];if(n&&"items"in n)return n;throw new Error("Parent collection not found")};function JJ(t,e,A){let i=A(e,t);if(typeof i=="symbol")return i;for(let n of["key","value"]){let o=e[n];if(o&&"items"in o){for(let a=0;a":return"block-scalar-header"}return null}function $g(t){switch(t){case void 0:case" ":case` -`:case"\r":case" ":return!0;default:return!1}}var YJ=new Set("0123456789ABCDEFabcdef"),OcA=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),z6=new Set(",[]{}"),YcA=new Set(` ,[]{} -\r `),r9=t=>!t||YcA.has(t),t4=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,A=!1){if(e){if(typeof e!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null}this.atEnd=!A;let i=this.next??"stream";for(;i&&(A||this.hasChars(1));)i=yield*Ce(this.parseNext(i))}atLineEnd(){let e=this.pos,A=this.buffer[e];for(;A===" "||A===" ";)A=this.buffer[++e];return!A||A==="#"||A===` -`?!0:A==="\r"?this.buffer[e+1]===` -`:!1}charAt(e){return this.buffer[this.pos+e]}continueScalar(e){let A=this.buffer[e];if(this.indentNext>0){let i=0;for(;A===" ";)A=this.buffer[++i+e];if(A==="\r"){let n=this.buffer[i+e+1];if(n===` -`||!n&&!this.atEnd)return e+i+1}return A===` -`||i>=this.indentNext||!A&&!this.atEnd?e+i:-1}if(A==="-"||A==="."){let i=this.buffer.substr(e,3);if((i==="---"||i==="...")&&$g(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!="number"||e!==-1&&ethis.indentValue&&!$g(this.charAt(1))&&(this.indentNext=this.indentValue),yield*Ce(this.parseBlockStart())}*parseBlockStart(){let[e,A]=this.peek(2);if(!A&&!this.atEnd)return this.setNext("block-start");if((e==="-"||e==="?"||e===":")&&$g(A)){let i=(yield*Ce(this.pushCount(1)))+(yield*Ce(this.pushSpaces(!0)));return this.indentNext=this.indentValue+1,this.indentValue+=i,yield*Ce(this.parseBlockStart())}return"doc"}*parseDocument(){yield*Ce(this.pushSpaces(!0));let e=this.getLine();if(e===null)return this.setNext("doc");let A=yield*Ce(this.pushIndicators());switch(e[A]){case"#":yield*Ce(this.pushCount(e.length-A));case void 0:return yield*Ce(this.pushNewline()),yield*Ce(this.parseLineStart());case"{":case"[":return yield*Ce(this.pushCount(1)),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*Ce(this.pushCount(1)),"doc";case"*":return yield*Ce(this.pushUntil(r9)),"doc";case'"':case"'":return yield*Ce(this.parseQuotedScalar());case"|":case">":return A+=yield*Ce(this.parseBlockScalarHeader()),A+=yield*Ce(this.pushSpaces(!0)),yield*Ce(this.pushCount(e.length-A)),yield*Ce(this.pushNewline()),yield*Ce(this.parseBlockScalar());default:return yield*Ce(this.parsePlainScalar())}}*parseFlowCollection(){let e,A,i=-1;do e=yield*Ce(this.pushNewline()),e>0?(A=yield*Ce(this.pushSpaces(!1)),this.indentValue=i=A):A=0,A+=yield*Ce(this.pushSpaces(!0));while(e+A>0);let n=this.getLine();if(n===null)return this.setNext("flow");if((i!==-1&&i"0"&&A<="9")this.blockScalarIndent=Number(A)-1;else if(A!=="-")break}return yield*Ce(this.pushUntil(A=>$g(A)||A==="#"))}*parseBlockScalar(){let e=this.pos-1,A=0,i;A:for(let o=this.pos;i=this.buffer[o];++o)switch(i){case" ":A+=1;break;case` -`:e=o,A=0;break;case"\r":{let a=this.buffer[o+1];if(!a&&!this.atEnd)return this.setNext("block-scalar");if(a===` -`)break}default:break A}if(!i&&!this.atEnd)return this.setNext("block-scalar");if(A>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=A:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let o=this.continueScalar(e+1);if(o===-1)break;e=this.buffer.indexOf(` -`,o)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext("block-scalar");e=this.buffer.length}}let n=e+1;for(i=this.buffer[n];i===" ";)i=this.buffer[++n];if(i===" "){for(;i===" "||i===" "||i==="\r"||i===` -`;)i=this.buffer[++n];e=n-1}else if(!this.blockScalarKeep)do{let o=e-1,a=this.buffer[o];a==="\r"&&(a=this.buffer[--o]);let r=o;for(;a===" ";)a=this.buffer[--o];if(a===` -`&&o>=this.pos&&o+1+A>r)e=o;else break}while(!0);return yield H6,yield*Ce(this.pushToIndex(e+1,!0)),yield*Ce(this.parseLineStart())}*parsePlainScalar(){let e=this.flowLevel>0,A=this.pos-1,i=this.pos-1,n;for(;n=this.buffer[++i];)if(n===":"){let o=this.buffer[i+1];if($g(o)||e&&z6.has(o))break;A=i}else if($g(n)){let o=this.buffer[i+1];if(n==="\r"&&(o===` -`?(i+=1,n=` -`,o=this.buffer[i+1]):A=i),o==="#"||e&&z6.has(o))break;if(n===` -`){let a=this.continueScalar(i+1);if(a===-1)break;i=Math.max(i,a-2)}}else{if(e&&z6.has(n))break;A=i}return!n&&!this.atEnd?this.setNext("plain-scalar"):(yield H6,yield*Ce(this.pushToIndex(A+1,!0)),e?"flow":"doc")}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,A){let i=this.buffer.slice(this.pos,e);return i?(yield i,this.pos+=i.length,i.length):(A&&(yield""),0)}*pushIndicators(){switch(this.charAt(0)){case"!":return(yield*Ce(this.pushTag()))+(yield*Ce(this.pushSpaces(!0)))+(yield*Ce(this.pushIndicators()));case"&":return(yield*Ce(this.pushUntil(r9)))+(yield*Ce(this.pushSpaces(!0)))+(yield*Ce(this.pushIndicators()));case"-":case"?":case":":{let e=this.flowLevel>0,A=this.charAt(1);if($g(A)||e&&z6.has(A))return e?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,(yield*Ce(this.pushCount(1)))+(yield*Ce(this.pushSpaces(!0)))+(yield*Ce(this.pushIndicators()))}}return 0}*pushTag(){if(this.charAt(1)==="<"){let e=this.pos+2,A=this.buffer[e];for(;!$g(A)&&A!==">";)A=this.buffer[++e];return yield*Ce(this.pushToIndex(A===">"?e+1:e,!1))}else{let e=this.pos+1,A=this.buffer[e];for(;A;)if(OcA.has(A))A=this.buffer[++e];else if(A==="%"&&YJ.has(this.buffer[e+1])&&YJ.has(this.buffer[e+2]))A=this.buffer[e+=3];else break;return yield*Ce(this.pushToIndex(e,!1))}}*pushNewline(){let e=this.buffer[this.pos];return e===` -`?yield*Ce(this.pushCount(1)):e==="\r"&&this.charAt(1)===` -`?yield*Ce(this.pushCount(2)):0}*pushSpaces(e){let A=this.pos-1,i;do i=this.buffer[++A];while(i===" "||e&&i===" ");let n=A-this.pos;return n>0&&(yield this.buffer.substr(this.pos,n),this.pos=A),n}*pushUntil(e){let A=this.pos,i=this.buffer[A];for(;!e(i);)i=this.buffer[++A];return yield*Ce(this.pushToIndex(A,!1))}};var i4=class{constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let A=0,i=this.lineStarts.length;for(;A>1;this.lineStarts[o]=0;)switch(t[e].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break A}for(;t[++e]?.type==="space";);return t.splice(e,t.length)}function zJ(t){if(t.start.type==="flow-seq-start")for(let e of t.items)e.sep&&!e.value&&!y2(e.start,"explicit-key-ind")&&!y2(e.sep,"map-value-ind")&&(e.key&&(e.value=e.key),delete e.key,PJ(e.value)?e.value.end?Array.prototype.push.apply(e.value.end,e.sep):e.value.end=e.sep:Array.prototype.push.apply(e.start,e.sep),delete e.sep)}var n4=class{constructor(e){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new t4,this.onNewLine=e}*parse(e,A=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let i of this.lexer.lex(e,A))yield*Ce(this.next(i));A||(yield*Ce(this.end()))}*next(e){if(this.source=e,this.atScalar){this.atScalar=!1,yield*Ce(this.step()),this.offset+=e.length;return}let A=OJ(e);if(A)if(A==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=A,yield*Ce(this.step()),A){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+e.length);break;case"space":this.atNewLine&&e[0]===" "&&(this.indent+=e.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=e.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=e.length}else{let i=`Not a YAML token: ${e}`;yield*Ce(this.pop({type:"error",offset:this.offset,message:i,source:e})),this.offset+=e.length}}*end(){for(;this.stack.length>0;)yield*Ce(this.pop())}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let e=this.peek(1);if(this.type==="doc-end"&&e?.type!=="doc-end"){for(;this.stack.length>0;)yield*Ce(this.pop());this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!e)return yield*Ce(this.stream());switch(e.type){case"document":return yield*Ce(this.document(e));case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*Ce(this.scalar(e));case"block-scalar":return yield*Ce(this.blockScalar(e));case"block-map":return yield*Ce(this.blockMap(e));case"block-seq":return yield*Ce(this.blockSequence(e));case"flow-collection":return yield*Ce(this.flowCollection(e));case"doc-end":return yield*Ce(this.documentEnd(e))}yield*Ce(this.pop())}peek(e){return this.stack[this.stack.length-e]}*pop(e){let A=e??this.stack.pop();if(!A)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield A;else{let i=this.peek(1);switch(A.type==="block-scalar"?A.indent="indent"in i?i.indent:0:A.type==="flow-collection"&&i.type==="document"&&(A.indent=0),A.type==="flow-collection"&&zJ(A),i.type){case"document":i.value=A;break;case"block-scalar":i.props.push(A);break;case"block-map":{let n=i.items[i.items.length-1];if(n.value){i.items.push({start:[],key:A,sep:[]}),this.onKeyLine=!0;return}else if(n.sep)n.value=A;else{Object.assign(n,{key:A,sep:[]}),this.onKeyLine=!n.explicitKey;return}break}case"block-seq":{let n=i.items[i.items.length-1];n.value?i.items.push({start:[],value:A}):n.value=A;break}case"flow-collection":{let n=i.items[i.items.length-1];!n||n.value?i.items.push({start:[],key:A,sep:[]}):n.sep?n.value=A:Object.assign(n,{key:A,sep:[]});return}default:yield*Ce(this.pop()),yield*Ce(this.pop(A))}if((i.type==="document"||i.type==="block-map"||i.type==="block-seq")&&(A.type==="block-map"||A.type==="block-seq")){let n=A.items[A.items.length-1];n&&!n.sep&&!n.value&&n.start.length>0&&HJ(n.start)===-1&&(A.indent===0||n.start.every(o=>o.type!=="comment"||o.indent=e.indent){let i=!this.onKeyLine&&this.indent===e.indent,n=i&&(A.sep||A.explicitKey)&&this.type!=="seq-item-ind",o=[];if(n&&A.sep&&!A.value){let a=[];for(let r=0;re.indent&&(a.length=0);break;default:a.length=0}}a.length>=2&&(o=A.sep.splice(a[1]))}switch(this.type){case"anchor":case"tag":n||A.value?(o.push(this.sourceToken),e.items.push({start:o}),this.onKeyLine=!0):A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case"explicit-key-ind":!A.sep&&!A.explicitKey?(A.start.push(this.sourceToken),A.explicitKey=!0):n||A.value?(o.push(this.sourceToken),e.items.push({start:o,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(A.explicitKey)if(A.sep)if(A.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(y2(A.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]});else if(PJ(A.key)&&!y2(A.sep,"newline")){let a=tE(A.start),r=A.key,s=A.sep;s.push(this.sourceToken),delete A.key,delete A.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:a,key:r,sep:s}]})}else o.length>0?A.sep=A.sep.concat(o,this.sourceToken):A.sep.push(this.sourceToken);else if(y2(A.start,"newline"))Object.assign(A,{key:null,sep:[this.sourceToken]});else{let a=tE(A.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:a,key:null,sep:[this.sourceToken]}]})}else A.sep?A.value||n?e.items.push({start:o,key:null,sep:[this.sourceToken]}):y2(A.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):A.sep.push(this.sourceToken):Object.assign(A,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let a=this.flowScalar(this.type);n||A.value?(e.items.push({start:o,key:a,sep:[]}),this.onKeyLine=!0):A.sep?this.stack.push(a):(Object.assign(A,{key:a,sep:[]}),this.onKeyLine=!0);return}default:{let a=this.startBlockValue(e);if(a){if(a.type==="block-seq"){if(!A.explicitKey&&A.sep&&!y2(A.sep,"newline")){yield*Ce(this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source}));return}}else i&&e.items.push({start:o});this.stack.push(a);return}}}}yield*Ce(this.pop()),yield*Ce(this.step())}*blockSequence(e){let A=e.items[e.items.length-1];switch(this.type){case"newline":if(A.value){let i="end"in A.value?A.value.end:void 0;(Array.isArray(i)?i[i.length-1]:void 0)?.type==="comment"?i?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else A.start.push(this.sourceToken);return;case"space":case"comment":if(A.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(A.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){Array.prototype.push.apply(n,A.start),n.push(this.sourceToken),e.items.pop();return}}A.start.push(this.sourceToken)}return;case"anchor":case"tag":if(A.value||this.indent<=e.indent)break;A.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;A.value||y2(A.start,"seq-item-ind")?e.items.push({start:[this.sourceToken]}):A.start.push(this.sourceToken);return}if(this.indent>e.indent){let i=this.startBlockValue(e);if(i){this.stack.push(i);return}}yield*Ce(this.pop()),yield*Ce(this.step())}*flowCollection(e){let A=e.items[e.items.length-1];if(this.type==="flow-error-end"){let i;do yield*Ce(this.pop()),i=this.peek(1);while(i?.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!A||A.sep?e.items.push({start:[this.sourceToken]}):A.start.push(this.sourceToken);return;case"map-value-ind":!A||A.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):A.sep?A.sep.push(this.sourceToken):Object.assign(A,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!A||A.value?e.items.push({start:[this.sourceToken]}):A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let n=this.flowScalar(this.type);!A||A.value?e.items.push({start:[],key:n,sep:[]}):A.sep?this.stack.push(n):Object.assign(A,{key:n,sep:[]});return}case"flow-map-end":case"flow-seq-end":e.end.push(this.sourceToken);return}let i=this.startBlockValue(e);i?this.stack.push(i):(yield*Ce(this.pop()),yield*Ce(this.step()))}else{let i=this.peek(2);if(i.type==="block-map"&&(this.type==="map-value-ind"&&i.indent===e.indent||this.type==="newline"&&!i.items[i.items.length-1].sep))yield*Ce(this.pop()),yield*Ce(this.step());else if(this.type==="map-value-ind"&&i.type!=="flow-collection"){let n=P6(i),o=tE(n);zJ(e);let a=e.end.splice(1,e.end.length);a.push(this.sourceToken);let r={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:o,key:e,sep:a}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=r}else yield*Ce(this.lineEnd(e))}}flowScalar(e){if(this.onNewLine){let A=this.source.indexOf(` -`)+1;for(;A!==0;)this.onNewLine(this.offset+A),A=this.source.indexOf(` -`,A)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let A=P6(e),i=tE(A);return i.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let A=P6(e),i=tE(A);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,A){return this.type!=="comment"||this.indent<=A?!1:e.every(i=>i.type==="newline"||i.type==="space")}*documentEnd(e){this.type!=="doc-mode"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*Ce(this.pop())))}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*Ce(this.pop()),yield*Ce(this.step());break;case"newline":this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*Ce(this.pop()))}}};function HcA(t){let e=t.prettyErrors!==!1;return{lineCounter:t.lineCounter||e&&new i4||null,prettyErrors:e}}function jJ(t,e={}){let{lineCounter:A,prettyErrors:i}=HcA(e),n=new n4(A?.addNewLine),o=new e4(e),a=null;for(let r of o.compose(n.parse(t),!0,t.length))if(!a)a=r;else if(a.options.logLevel!=="silent"){a.errors.push(new Xg(r.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return i&&A&&(a.errors.forEach(VM(t,A)),a.warnings.forEach(VM(t,A))),a}function iE(t,e,A){let i;typeof e=="function"?i=e:A===void 0&&e&&typeof e=="object"&&(A=e);let n=jJ(t,A);if(!n)return null;if(n.warnings.forEach(o=>D6(n.options.logLevel,o)),n.errors.length>0){if(n.options.logLevel!=="silent")throw n.errors[0];n.errors=[]}return n.toJS(Object.assign({reviver:i},A))}function s9(t,e,A){let i=null;if(typeof e=="function"||Array.isArray(e)?i=e:A===void 0&&e&&(A=e),typeof A=="string"&&(A=A.length),typeof A=="number"){let n=Math.round(A);A=n<1?void 0:n>8?{indent:8}:{indent:n}}if(t===void 0){let{keepUndefined:n}=A??e??{};if(!n)return}return Pg(t)&&!i?t.toString(A):new nC(t,i,A).toString(A)}var s0=class t{static generateYamlFile(e,A,i,n,o=new Set){if(o.has(e.name))return;o.add(e.name);let a=e.isRoot?"root_agent.yaml":`${e.name}.yaml`,r=`${i}/${a}`,s=e.sub_agents?e.sub_agents.map(h=>({config_path:`./${h.name}.yaml`})):[],l={name:e.name,model:e.model,agent_class:e.agent_class,description:e.description||"",instruction:e.instruction,sub_agents:s,tools:t.buildToolsConfig(e.tools,n)};(!e.description||e.description.trim()==="")&&delete l.description,e.agent_class!="LlmAgent"&&(delete l.model,delete l.instruction,delete l.tools),e.agent_class==="LoopAgent"&&e.max_iterations&&(l.max_iterations=e.max_iterations);let g=t.buildCallbacksConfig(e.callbacks);Object.keys(g).length>0&&Object.assign(l,g);let C=s9(l),I=new Blob([C],{type:"application/x-yaml"}),d=new File([I],r,{type:"application/x-yaml"});A.append("files",d);for(let h of e.sub_agents??[])t.generateYamlFile(h,A,i,n,o);if(e.tools){for(let h of e.tools)if(h.toolType==="Agent Tool"){let E=h.toolAgentName||h.name;if(!E||E==="undefined"||E.trim()==="")continue;let f=n.get(E);f&&t.generateYamlFile(f,A,i,n,o)}}}static buildToolsConfig(e,A){return!e||e.length===0?[]:e.map(i=>{let n={name:i.name};if(i.toolType==="Agent Tool"){n.name="AgentTool";let o=i.toolAgentName||i.name;if(!o||o==="undefined"||o.trim()==="")return null;let a=A.get(o);return n.args={agent:{config_path:`./${o}.yaml`},skip_summarization:a?.skip_summarization||!1},n}return i.args&&Object.keys(i.args).some(a=>{let r=i.args[a];return r!=null&&r!==""})&&(n.args=i.args),n}).filter(i=>i!==null)}static buildCallbacksConfig(e){if(!e||e.length===0)return{};let A={};return e.forEach(i=>{let n=`${i.type}_callbacks`;A[n]||(A[n]=[]),A[n].push({name:i.name})}),A}};function PcA(t,e){t&1&&(B(0,"mat-hint",3),y(1," Start with a letter or underscore, and contain only letters, digits, and underscores. "),Q())}var j6=class t{constructor(e,A){this.data=e;this.dialogRef=A}newAppName="";agentService=w($s);_snackBar=w(h2);router=w(ls);isNameValid(){let e=this.newAppName.trim();return!(!e||!/^[a-zA-Z_]/.test(e)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))}createNewApp(){let e=this.newAppName.trim();if(!this.isNameValid()){this._snackBar.open("App name must start with a letter or underscore and can only contain letters, digits, and underscores.","OK");return}if(this.data.existingAppNames.includes(e)){this._snackBar.open("App name already exists. Please choose a different name.","OK");return}let A={agent_class:"LlmAgent",instruction:"You are the root agent that coordinates other agents.",isRoot:!0,model:"gemini-2.5-flash",name:e,sub_agents:[],tools:[]},i=new FormData,n=new Map;s0.generateYamlFile(A,i,e,n),this.agentService.agentBuildTmp(i).subscribe(o=>{o?(this.router.navigate(["/"],{queryParams:{app:e,mode:"builder"}}).then(()=>{window.location.reload()}),this.dialogRef.close(!0)):this._snackBar.open("Something went wrong, please try again","OK")})}static \u0275fac=function(A){return new(A||t)(ct(qo),ct(lo))};static \u0275cmp=SA({type:t,selectors:[["app-add-item-dialog"]],decls:10,vars:3,consts:[["mat-dialog-title","",1,"new-app-title"],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],[1,"validation-hint"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click","disabled"]],template:function(A,i){A&1&&(B(0,"h2",0),y(1,"Create a new app"),Q(),B(2,"mat-form-field",1)(3,"input",2),Di("ngModelChange",function(o){return Bi(i.newAppName,o)||(i.newAppName=o),o}),U("keydown.enter",function(){return i.createNewApp()}),Q(),O(4,PcA,2,0,"mat-hint",3),Q(),B(5,"mat-dialog-actions",4)(6,"button",5),y(7,"Cancel"),Q(),B(8,"button",6),U("click",function(){return i.createNewApp()}),y(9," Create "),Q()()),A&2&&(u(3),wi("ngModel",i.newAppName),u(),Y(i.isNameValid()?-1:4),u(4),H("disabled",!i.isNameValid()))},dependencies:[fa,Ko,ua,ln,Dn,yn,ko,pa,pi,B2,s1],styles:[".new-app-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-subhead-color)!important;font-family:Google Sans;font-size:24px}.validation-hint[_ngcontent-%COMP%]{font-size:12px;color:var(--mdc-dialog-supporting-text-color)}"]})};function nE(t,e,A){let i=typeof t=="string"?document.querySelector(t):t;if(!i)return;i.querySelectorAll("g.node").forEach(o=>{let a=o,s=o.querySelector("title")?.textContent||"";s==="__LEGEND__"||s==="__START__"||s==="__END__"||a.classList.contains("unvisited-node")||A&&!A.has(s)||(a.style.cursor="pointer",a.addEventListener("mouseenter",()=>{let l=o.querySelector("ellipse, polygon, path, rect");l&&(l.style.stroke="#42A5F5",l.style.strokeWidth="3")}),a.addEventListener("mouseleave",()=>{let l=o.querySelector("ellipse, polygon, path, rect");l&&(l.style.stroke="",l.style.strokeWidth="")}),e&&a.addEventListener("click",l=>{let C=o.querySelector("title")?.textContent||"";C&&e(C,l)}))})}function VJ(t,e,A={}){let{ySpacing:i=200,xSpacing:n=350,startX:o=400,startY:a=100}=A,r=t.map(m=>m.name||m.agent?.name||""),s=new Map,l=new Map;r.forEach(m=>{s.set(m,[]),l.set(m,0)}),e.forEach(m=>{let v=m.from_node?.name||m.from_node?.agent?.name,k=m.to_node?.name||m.to_node?.agent?.name;v&&k&&(s.get(v)?.push(k),l.set(k,(l.get(k)||0)+1))});let g=new Map,C=[],I=new Map(l),d=new Set;for(r.forEach(m=>{I.get(m)===0&&(C.push(m),g.set(m,0),d.add(m))});C.length>0;){let m=C.shift(),v=g.get(m)||0;s.get(m)?.forEach(k=>{let S=g.get(k);if(S!==void 0&&S<=v)return;let b=v+1;S===void 0&&g.set(k,b);let x=I.get(k)||0;I.set(k,x-1),I.get(k)===0&&!d.has(k)&&(C.push(k),d.add(k))})}let h=Math.max(...Array.from(g.values()),0);r.forEach(m=>{g.has(m)||(g.set(m,h+1),h++)});let E=new Map;g.forEach((m,v)=>{E.has(m)||E.set(m,[]),E.get(m)?.push(v)});let f=new Map;return t.forEach(m=>{let v=m.name||m.agent?.name||"",k=g.get(v)||0,S=E.get(k)||[],b=S.indexOf(v),x=S.length,F=(b-(x-1)/2)*n;f.set(v,{x:o+F,y:a+k*i})}),{levels:g,nodesByLevel:E,positions:f}}function Ac(t,e=""){return t?.name||t?.agent?.name||e}function WJ(t){switch(t){case"start":return"play_arrow";case"function":return"code";case"tool":return"build";case"join":return"merge";default:return"smart_toy"}}function ZJ(t){switch(t){case"start":return"Start";case"function":return"Function";case"tool":return"Tool";case"join":return"Join";default:return"Agent"}}var q6={ySpacing:200,xSpacing:350,startX:400,startY:100};function XJ(t){return t.map(e=>e.name).join("/")}function oC(t){return!!(t.graph||t.nodes||t.sub_agents&&t.sub_agents.length>0)}function l9(t){return t.graph?.nodes?t.graph.nodes:t.nodes?t.nodes:[]}function oE(t,e){if(t.nodes){let A=t.nodes.find(i=>i.name===e);if(A)return A}if(t.graph?.nodes){let A=t.graph.nodes.find(i=>i.name===e);if(A)return A}if(t.sub_agents){let A=t.sub_agents.find(i=>i.name===e);if(A)return A}return null}function $J(t,e){let A=e.split("/"),i=[{name:t.name,data:t}],n=t;for(let o=1;oAc(l)===a);if(s)i.push({name:a,data:s}),n=s;else{console.warn(`Could not find node '${a}' in path '${e}'`);break}}return i}function jcA(t,e){t&1&&(B(0,"mat-icon",20),y(1,"chevron_right"),Q())}function qcA(t,e){if(t&1){let A=QA();O(0,jcA,2,0,"mat-icon",20),B(1,"button",21),U("click",function(){let n=T(A).$index,o=p(2);return J(o.navigateToLevel(n))}),y(2),Q()}if(t&2){let A=e.$implicit,i=e.$index,n=p(2);Y(i>0?0:-1),u(),RA("active",i===n.breadcrumbs().length-1),H("disabled",i===n.breadcrumbs().length-1),u(),ue(" ",A," ")}}function VcA(t,e){if(t&1&&(B(0,"div",3)(1,"span"),y(2,"Agent Structure:"),Q(),B(3,"button",19),y(4),Q(),B(5,"mat-icon",20),y(6,"chevron_right"),Q(),Ue(7,qcA,3,5,null,null,ws),Q()),t&2){let A=p();u(4),lA(A.appName),u(3),Te(A.breadcrumbs())}}function WcA(t,e){t&1&&(B(0,"div",15),hA(1,"mat-spinner",22),B(2,"p"),y(3,"Loading agent structure..."),Q()())}function ZcA(t,e){if(t&1&&(B(0,"div",16)(1,"mat-icon",23),y(2,"error_outline"),Q(),B(3,"p",24),y(4),Q()()),t&2){let A=p();u(4),lA(A.errorMessage())}}function XcA(t,e){if(t&1){let A=QA();B(0,"div",25),U("wheel",function(n){T(A);let o=p();return J(o.onWheel(n))})("mousedown",function(n){T(A);let o=p();return J(o.onMouseDown(n))})("mousemove",function(n){T(A);let o=p();return J(o.onMouseMove(n))})("mouseup",function(){T(A);let n=p();return J(n.onMouseUp())})("mouseleave",function(){T(A);let n=p();return J(n.onMouseUp())}),Q()}if(t&2){let A=p();H("innerHTML",A.renderedGraph(),Gc)}}function $cA(t,e){t&1&&(B(0,"div",18)(1,"mat-icon",26),y(2,"account_tree"),Q(),B(3,"p"),y(4,"Agent structure graph not available."),Q()())}var V6=class t{appName;preloadedAppData;preloadedLightGraphSvg;preloadedDarkGraphSvg;startPath;close=new LA;agentService=w($s);graphService=w(OB);sanitizer=w(Cs);themeService=w(eg);renderedGraph=bA(null);isLoading=bA(!0);errorMessage=bA(null);fullAppData=null;navigationStack=[];breadcrumbs=bA([]);isPanning=!1;wasDragging=!1;dragStartX=0;dragStartY=0;startPanX=0;startPanY=0;scale=1;translateX=0;translateY=0;lastMousedownTarget=null;onOverlayMouseDown(e){this.lastMousedownTarget=e.target}onBackdropClick(e){if(this.wasDragging||this.lastMousedownTarget&&(this.lastMousedownTarget.closest("svg")||this.lastMousedownTarget.closest(".overlay-header")||this.lastMousedownTarget.closest(".loading-container")||this.lastMousedownTarget.closest(".error-container")||this.lastMousedownTarget.closest(".no-graph-container")))return;let A=e.target;!A.closest("svg")&&!A.closest(".overlay-header")&&!A.closest(".loading-container")&&!A.closest(".error-container")&&!A.closest(".no-graph-container")&&this.close.emit()}ngOnInit(){this.loadAgentGraph()}loadAgentGraph(){if(this.isLoading.set(!0),this.errorMessage.set(null),this.renderedGraph.set(null),this.preloadedAppData){if(this.fullAppData=this.preloadedAppData,this.navigationStack=[{name:this.fullAppData.root_agent?.name||this.appName,data:this.fullAppData.root_agent}],this.startPath){let e=this.fullAppData.root_agent,A=this.startPath.split("/");for(let i of A){if(!i)continue;let n=oE(e,i);if(n)this.navigationStack.push({name:i,data:n}),e=n;else break}}this.updateBreadcrumbs(),this.renderCurrentLevel();return}this.agentService.getAppInfo(this.appName).subscribe({next:e=>{if(this.fullAppData=e,this.navigationStack=[{name:e.root_agent?.name||this.appName,data:e.root_agent}],this.startPath){let A=this.fullAppData.root_agent,i=this.startPath.split("/");for(let n of i){if(!n)continue;let o=oE(A,n);if(o)this.navigationStack.push({name:n,data:o}),A=o;else break}}this.updateBreadcrumbs(),this.renderCurrentLevel()},error:e=>{console.error("Error loading app data:",e),this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1)}})}renderCurrentLevel(){let e=this.themeService.currentTheme()==="dark",A=this.getCurrentPath(),i=e?this.preloadedDarkGraphSvg:this.preloadedLightGraphSvg,n=i?i[A]:null;if(n){this.renderedGraph.set(this.sanitizer.bypassSecurityTrustHtml(n)),this.isLoading.set(!1),setTimeout(()=>{let o=this.getExpandableNodes();nE(".svg-container",a=>{this.wasDragging||this.onNodeClick(a)},o),this.initializeSvgTransform()},50);return}this.agentService.getAppGraphImage(this.appName,e,A).subscribe({next:o=>lt(this,null,function*(){try{if(!o?.dotSrc){this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1);return}let a=yield this.graphService.render(o.dotSrc);this.renderedGraph.set(this.sanitizer.bypassSecurityTrustHtml(a)),this.isLoading.set(!1),setTimeout(()=>{let r=this.getExpandableNodes();nE(".svg-container",s=>{this.wasDragging||this.onNodeClick(s)},r),this.initializeSvgTransform()},50)}catch(a){console.error("Error rendering graph:",a),this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1)}}),error:o=>{console.error("Error loading agent graph:",o),this.errorMessage.set("Agent structure graph not available."),this.isLoading.set(!1)}})}getCurrentPath(){return this.navigationStack.length<=1?"":this.navigationStack.slice(1).map(e=>e.name).join("/")}updateBreadcrumbs(){this.breadcrumbs.set(this.navigationStack.map(e=>e.name))}onNodeClick(e){let A=this.navigationStack[this.navigationStack.length-1].data,i=oE(A,e);i&&oC(i)&&this.navigateIntoNode(e,i)}navigateIntoNode(e,A){this.navigationStack.push({name:e,data:A}),this.updateBreadcrumbs(),this.isLoading.set(!0),this.renderCurrentLevel()}navigateToLevel(e){e>=0&&e{let a=Ac(o);a!==i&&oC(o)&&e.add(a)}),e}getSvgElement(){return document.querySelector(".svg-container svg")}applyTransform(){let e=this.getSvgElement();e&&(e.style.transform=`translate(${this.translateX}px, ${this.translateY}px) scale(${this.scale})`)}initializeSvgTransform(){let e=this.getSvgElement(),A=document.querySelector(".svg-container");if(!e||!A)return;let i=e.getBoundingClientRect(),n=A.getBoundingClientRect(),o=48,a=(n.width-o)/i.width,r=(n.height-o)/i.height;this.scale=Math.min(1,a,r);let s=i.width*this.scale,l=i.height*this.scale;this.translateX=(n.width-s)/2,this.translateY=(n.height-l)/2,this.applyTransform(),requestAnimationFrame(()=>{e.classList.add("ready")})}onWheel(e){let A=document.querySelector(".svg-container"),i=this.getSvgElement();if(!A||!i)return;e.preventDefault();let n=Math.max(-100,Math.min(100,e.deltaY)),o=Math.pow(1.002,-n),a=this.scale*o,r=A.getBoundingClientRect(),s=e.clientX-r.left,l=e.clientY-r.top,g=(s-this.translateX)/this.scale,C=(l-this.translateY)/this.scale;this.translateX=s-g*a,this.translateY=l-C*a,this.scale=a,this.applyTransform()}onMouseDown(e){if(e.button!==0||!e.target.closest("svg"))return;this.isPanning=!0,this.wasDragging=!1,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.startPanX=e.clientX,this.startPanY=e.clientY;let i=this.getSvgElement();i&&(i.style.cursor="grabbing")}onMouseMove(e){if(this.isPanning){if(!this.wasDragging){let A=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;A*A+i*i>25&&(this.wasDragging=!0)}this.translateX+=e.clientX-this.startPanX,this.translateY+=e.clientY-this.startPanY,this.startPanX=e.clientX,this.startPanY=e.clientY,this.applyTransform()}}onMouseUp(){this.isPanning=!1;let e=this.getSvgElement();e&&(e.style.cursor=""),setTimeout(()=>{this.wasDragging=!1},50)}resetZoomPan(){this.initializeSvgTransform()}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-agent-structure-graph-dialog"]],inputs:{appName:"appName",preloadedAppData:"preloadedAppData",preloadedLightGraphSvg:"preloadedLightGraphSvg",preloadedDarkGraphSvg:"preloadedDarkGraphSvg",startPath:"startPath"},outputs:{close:"close"},decls:35,vars:2,consts:[[1,"overlay-backdrop"],[1,"overlay-panel",3,"mousedown","click"],[1,"overlay-header"],[1,"breadcrumb-container"],[2,"flex","1"],[1,"graph-legend"],[1,"legend-item"],[2,"color","#42A5F5","font-size","16px"],[2,"color","#9333EA","font-size","16px"],[2,"color","#10B981","font-size","16px"],[2,"color","#F59E0B","font-size","16px"],[2,"color","#6B7280","font-size","16px"],["mat-icon-button","","aria-label","Close",3,"click"],[1,"overlay-content"],[1,"graph-container"],[1,"loading-container"],[1,"error-container"],[1,"svg-container",3,"innerHTML"],[1,"no-graph-container"],["disabled","",1,"breadcrumb-item"],[1,"breadcrumb-separator"],[1,"breadcrumb-item",3,"click","disabled"],["diameter","50"],[1,"error-icon"],[1,"error-message"],[1,"svg-container",3,"wheel","mousedown","mousemove","mouseup","mouseleave","innerHTML"],[1,"large-icon"]],template:function(A,i){A&1&&(hA(0,"div",0),B(1,"div",1),U("mousedown",function(o){return i.onOverlayMouseDown(o)})("click",function(o){return i.onBackdropClick(o)}),B(2,"div",2),O(3,VcA,9,1,"div",3),hA(4,"span",4),B(5,"div",5)(6,"span",6)(7,"span",7),y(8,"\u2726"),Q(),y(9," Agent"),Q(),B(10,"span",6)(11,"span",8),y(12,"\u22B7"),Q(),y(13," Workflow"),Q(),B(14,"span",6)(15,"span",9),y(16,"\u0192"),Q(),y(17," Function"),Q(),B(18,"span",6)(19,"span",10),y(20,"\u2335"),Q(),y(21," Join"),Q(),B(22,"span",6)(23,"span",11),y(24,"\u{1F527}"),Q(),y(25," Tool"),Q()(),B(26,"button",12),U("click",function(){return i.close.emit()}),B(27,"mat-icon"),y(28,"close"),Q()()(),B(29,"div",13)(30,"div",14),O(31,WcA,4,0,"div",15)(32,ZcA,5,1,"div",16)(33,XcA,1,1,"div",17)(34,$cA,5,0,"div",18),Q()()()),A&2&&(u(3),Y(i.renderedGraph()&&i.breadcrumbs().length>0?3:-1),u(28),Y(i.isLoading()?31:i.errorMessage()?32:i.renderedGraph()?33:34))},dependencies:[li,qi,ji,Tn,Wt,E2,gs],styles:["[_nghost-%COMP%]{display:block;position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center}.overlay-backdrop[_ngcontent-%COMP%]{position:absolute;inset:0;background-color:#000000b3}.overlay-panel[_ngcontent-%COMP%]{position:relative;width:100vw;height:100vh;display:flex;flex-direction:column;background-color:transparent;color:var(--mat-sys-on-surface);border-radius:0;overflow:hidden;box-shadow:none}.overlay-header[_ngcontent-%COMP%]{display:flex;align-items:center;height:48px;padding:0 16px;box-sizing:border-box;border-bottom:1px solid var(--mat-sys-outline-variant);background-color:var(--mat-sys-surface-container)}.overlay-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden}.graph-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-height:0}.agent-info[_ngcontent-%COMP%]{margin:0 0 8px;font-size:14px;color:var(--mdc-dialog-supporting-text-color)}.agent-info[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{font-weight:600;color:var(--mdc-dialog-supporting-text-color)}.svg-container[_ngcontent-%COMP%]{flex:1;position:relative;overflow:hidden;background-color:transparent}.svg-container[_ngcontent-%COMP%] svg{position:absolute;top:0;left:0;transform-origin:0 0;cursor:grab;border-radius:16px;box-shadow:0 4px 12px #0000004d}.svg-container[_ngcontent-%COMP%] svg>g.graph>polygon:first-child{fill:transparent!important;stroke:transparent!important}.svg-container[_ngcontent-%COMP%] svg{opacity:0;transition:opacity .1s ease-in-out}.svg-container[_ngcontent-%COMP%] svg.ready{opacity:1}.svg-container[_ngcontent-%COMP%] svg:active{cursor:grabbing}.dark-theme[_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg, .dark-theme [_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg{background-color:#0e172a}.light-theme[_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg, .light-theme [_nghost-%COMP%] .svg-container[_ngcontent-%COMP%] svg{background-color:#f9fafc}.loading-container[_ngcontent-%COMP%], .error-container[_ngcontent-%COMP%], .no-graph-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:400px;padding:40px}.loading-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .error-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .no-graph-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-top:16px;font-size:14px;color:var(--mdc-dialog-supporting-text-color)}.error-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;color:#f44336}.error-message[_ngcontent-%COMP%]{color:#f44336!important}.large-icon[_ngcontent-%COMP%]{font-size:64px;width:64px;height:64px;color:var(--mdc-dialog-supporting-text-color);opacity:.6}.breadcrumb-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;margin-left:8px;padding:0;background-color:transparent;flex-wrap:wrap}.breadcrumb-item[_ngcontent-%COMP%]{background:none;border:none;padding:4px 8px;cursor:pointer;color:var(--mat-sys-primary);font-size:13px;border-radius:4px;transition:background-color .2s}.breadcrumb-item[_ngcontent-%COMP%]:hover:not(:disabled){background-color:var(--mat-sys-surface-container-high)}.breadcrumb-item[_ngcontent-%COMP%]:disabled, .breadcrumb-item.active[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);cursor:default;font-weight:600}.breadcrumb-separator[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:var(--mat-sys-on-surface-variant)}.graph-legend[_ngcontent-%COMP%]{display:flex;align-items:center;gap:16px;margin-right:16px;font-size:13px;color:var(--mat-sys-on-surface-variant);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:6px 16px;background-color:var(--mat-sys-surface-container-lowest)}.graph-legend[_ngcontent-%COMP%] .legend-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;font-weight:500}"]})};var A0A=["mat-internal-form-field",""],e0A=["*"],W6=(()=>{class t{labelPosition="after";static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["div","mat-internal-form-field",""]],hostAttrs:[1,"mdc-form-field","mat-internal-form-field"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mdc-form-field--align-end",n.labelPosition==="before")},inputs:{labelPosition:"labelPosition"},attrs:A0A,ngContentSelectors:e0A,decls:1,vars:0,template:function(i,n){i&1&&(Rt(),Ve(0))},styles:[`.mat-internal-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-flex;align-items:center;vertical-align:middle}.mat-internal-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mat-internal-form-field>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end .mdc-form-field--align-end label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0} -`],encapsulation:2,changeDetection:0})}return t})();var t0A=["audioPlayer"],aE=class t{base64data=me("");audioPlayerRef=So("audioPlayer");audioSrc="";constructor(){}ngOnChanges(e){e.base64data&&this.base64data()&&this.setAudioSource(this.base64data())}setAudioSource(e){e.startsWith("data:")||e.startsWith("http")||e.startsWith("blob:")?this.audioSrc=e:this.audioSrc=`data:audio/mpeg;base64,${e}`,this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.load()}play(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.play()}pause(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.pause()}stop(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&(this.audioPlayerRef().nativeElement.pause(),this.audioPlayerRef().nativeElement.currentTime=0)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-audio-player"]],viewQuery:function(A,i){A&1&&ns(i.audioPlayerRef,t0A,5),A&2&&ur()},inputs:{base64data:[1,"base64data"]},features:[Yt],decls:3,vars:1,consts:[["audioPlayer",""],["controls","",3,"src"]],template:function(A,i){A&1&&(wn(0,"div"),Kn(1,"audio",1,0),Gn()),A&2&&(u(),ha("src",i.audioSrc))},styles:[".audio-player-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;padding:15px;border-radius:8px;box-shadow:0 2px 5px var(--audio-player-container-box-shadow-color);margin:20px auto;max-width:350px}audio[_ngcontent-%COMP%]{outline:none;border-radius:5px;width:350px}.custom-controls[_ngcontent-%COMP%]{margin-top:10px;display:flex;gap:10px}.custom-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:8px 15px;border:none;border-radius:5px;color:var(--audio-player-custom-controls-button-color);cursor:pointer;font-size:14px;transition:background-color .2s ease}"]})};function i0A(t,e){if(t&1){let A=QA();B(0,"div",0)(1,"div",4),y(2),Q(),B(3,"button",5),U("click",function(){T(A);let n=p();return J(n.close())}),Ct(),B(4,"svg",6),hA(5,"path",7),Q()()()}if(t&2){let A=p();u(),H("title",A.currentUrl),u(),lA(A.currentUrl)}}function n0A(t,e){if(t&1){let A=QA();B(0,"button",5),U("click",function(){T(A);let n=p();return J(n.close())}),Ct(),B(1,"svg",6),hA(2,"path",7),Q()()}}function o0A(t,e){if(t&1){let A=QA();B(0,"button",8),U("click",function(){T(A);let n=p();return J(n.prevImage())}),Ct(),B(1,"svg",6),hA(2,"path",9),Q()(),rr(),B(3,"button",10),U("click",function(){T(A);let n=p();return J(n.nextImage())}),Ct(),B(4,"svg",6),hA(5,"path",11),Q()(),rr(),B(6,"div",12),y(7),Q()}if(t&2){let A=p();H("disabled",A.currentIndex===0),u(3),H("disabled",A.currentIndex===A.images.length-1),u(4),ba("",A.currentIndex+1," / ",A.images.length)}}function a0A(t,e){if(t&1&&hA(0,"div",16),t&2){let A=p(3);H("ngStyle",A.getHighlightStyle())}}function r0A(t,e){if(t&1&&(B(0,"div",13),hA(1,"img",15),O(2,a0A,1,1,"div",16),Q()),t&2){let A=p(2);u(),H("src",A.displayContent,Go),u(),Y(A.shouldShowHighlight()?2:-1)}}function s0A(t,e){t&1&&(B(0,"div",14),y(1," No image data provided. "),Q())}function l0A(t,e){if(t&1&&(B(0,"div",2),O(1,r0A,3,2,"div",13),O(2,s0A,2,0,"div",14),Q()),t&2){let A=p();u(),Y(A.displayContent?1:-1),u(),Y(A.displayContent?-1:2)}}function g0A(t,e){if(t&1&&hA(0,"div",3),t&2){let A=p();H("innerHTML",A.displayContent,Gc)}}var rE=class t{displayContent=null;isSvgContent=!1;images=[];currentIndex=0;currentUrl=null;urls=[];coordinates=[];dialogRef=w(lo);data=w(qo);safeValuesService=w(Cs);ngOnInit(){this.images=this.data.images||[],this.currentIndex=this.data.currentIndex||0,this.urls=this.data.urls||[],this.coordinates=this.data.coordinates||[],this.updateImage()}updateImage(){let e=this.data.imageData,A="";this.images.length>0&&(e=this.images[this.currentIndex],A=this.urls[this.currentIndex]||""),this.currentUrl=A,this.processImageData(e)}getHighlightStyle(){let e=this.coordinates[this.currentIndex];return e?{left:`${e.x/1e3*100}%`,top:`${e.y/1e3*100}%`}:{}}shouldShowHighlight(){return!!this.coordinates[this.currentIndex]}processImageData(e){if(!e){this.displayContent=null,this.isSvgContent=!1;return}if(e.trim().includes("0&&(this.currentIndex--,this.updateImage())}close(){this.dialogRef.close()}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-view-image-dialog"]],decls:6,vars:4,consts:[[1,"header-bar"],[1,"close-button"],[1,"image-wrapper"],[3,"innerHTML"],[1,"image-title",3,"title"],[1,"close-button",3,"click"],["xmlns","http://www.w3.org/2000/svg","viewBox","0 0 24 24","fill","currentColor","width","24px","height","24px"],["d","M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"],[1,"nav-button","prev-button",3,"click","disabled"],["d","M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"],[1,"nav-button","next-button",3,"click","disabled"],["d","M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"],[1,"image-counter"],[1,"image-container",2,"position","relative","display","inline-block"],[1,"no-image-placeholder"],["alt","Viewed Image",3,"src"],[1,"highlight-circle",3,"ngStyle"]],template:function(A,i){A&1&&(B(0,"div"),O(1,i0A,6,2,"div",0)(2,n0A,3,0,"button",1),O(3,o0A,8,4),O(4,l0A,3,2,"div",2),O(5,g0A,1,1,"div",3),Q()),A&2&&(u(),Y(i.currentUrl?1:2),u(2),Y(i.images.length>1?3:-1),u(),Y(i.isSvgContent?-1:4),u(),Y(i.isSvgContent?5:-1))},dependencies:[Vd],styles:["[_nghost-%COMP%]{display:block;padding:16px}.close-button[_ngcontent-%COMP%]{position:absolute;top:5px;right:10px;border:none;cursor:pointer;padding:8px;border-radius:50%;transition:background-color .2s ease;color:var(--mdc-dialog-supporting-text-color);display:flex;align-items:center;justify-content:center;margin-bottom:15px}.close-button[_ngcontent-%COMP%]:hover{background-color:#0000000d}.close-button[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{width:24px;height:24px;fill:currentColor}.image-wrapper[_ngcontent-%COMP%]{flex-grow:1;display:flex;justify-content:center;align-items:center;overflow:auto}.image-wrapper[_ngcontent-%COMP%] img[_ngcontent-%COMP%], .image-wrapper[_ngcontent-%COMP%] .svg-container[_ngcontent-%COMP%]{max-width:90vw;max-height:90vh;object-fit:contain;border-radius:8px}.no-image-placeholder[_ngcontent-%COMP%]{color:var(--trace-chart-trace-duration-color);font-style:italic;text-align:center;padding:20px}@media(max-width:1768px){.close-button[_ngcontent-%COMP%]{top:5px;right:5px;padding:5px}}.nav-button[_ngcontent-%COMP%]{position:absolute;top:50%;transform:translateY(-50%);background:#00000080;color:#fff;border:none;border-radius:50%;width:40px;height:40px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background-color .2s ease;z-index:10}.nav-button[_ngcontent-%COMP%]:hover:not(:disabled){background:#000000b3}.nav-button[_ngcontent-%COMP%]:disabled{opacity:.3;cursor:default}.nav-button[_ngcontent-%COMP%] svg[_ngcontent-%COMP%]{width:24px;height:24px;fill:currentColor}.prev-button[_ngcontent-%COMP%]{left:20px}.next-button[_ngcontent-%COMP%]{right:20px}.image-counter[_ngcontent-%COMP%]{position:absolute;bottom:20px;left:50%;transform:translate(-50%);background:#00000080;color:#fff;padding:4px 12px;border-radius:12px;font-size:14px;z-index:10}.header-bar[_ngcontent-%COMP%]{position:absolute;top:0;left:0;width:100%;background:#000000b3;color:#fff;z-index:20;display:flex;align-items:center;justify-content:center;padding:8px 40px;box-sizing:border-box}.image-title[_ngcontent-%COMP%]{font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:90%}.header-bar[_ngcontent-%COMP%] .close-button[_ngcontent-%COMP%]{position:absolute;top:50%;right:10px;transform:translateY(-50%);color:#fff;margin-bottom:0}.header-bar[_ngcontent-%COMP%] .close-button[_ngcontent-%COMP%]:hover{background-color:#ffffff1a}.highlight-circle[_ngcontent-%COMP%]{position:absolute;width:30px;height:30px;border-radius:50%;background-color:#ff000080;border:2px solid red;transform:translate(-50%,-50%);pointer-events:none;z-index:5}"]})};function c0A(t,e){t&1&&hA(0,"hr",2)}function C0A(t,e){if(t&1&&(B(0,"mat-option",7),y(1),Q()),t&2){let A=e.$implicit;H("value",A),u(),lA(A.versionId)}}function I0A(t,e){if(t&1){let A=QA();B(0,"div")(1,"img",9),U("click",function(){T(A);let n=p().$index,o=p();return J(o.openViewImageDialog(o.selectedArtifacts[n].data))}),Q()()}if(t&2){let A=p().$index,i=p();u(),H("src",i.selectedArtifacts[A].data??"",Go)}}function d0A(t,e){if(t&1&&(B(0,"div"),hA(1,"app-audio-player",10),Q()),t&2){let A=p().$index,i=p();u(),H("base64data",i.selectedArtifacts[A].data)}}function B0A(t,e){if(t&1){let A=QA();B(0,"div",1),O(1,c0A,1,0,"hr",2),B(2,"div",3)(3,"button",4),U("click",function(){let n=T(A).$index,o=p();return J(o.openArtifact(o.selectedArtifacts[n].data,o.selectedArtifacts[n].mimeType))}),y(4),Q()(),B(5,"div",3)(6,"span"),y(7," Version: "),Q(),B(8,"div",5)(9,"mat-select",6),Di("ngModelChange",function(n){let o=T(A).$index,a=p();return Bi(a.selectedArtifacts[o],n)||(a.selectedArtifacts[o]=n),J(n)}),U("selectionChange",function(n){let o=T(A).$index,a=p();return J(a.onArtifactVersionChange(n,o))}),Ue(10,C0A,2,2,"mat-option",7,ri),Q()(),B(12,"button",8),U("click",function(){let n=T(A).$index,o=p();return J(o.downloadArtifact(o.selectedArtifacts[n]))}),B(13,"mat-icon"),y(14,"file_download"),Q(),y(15," Download "),Q()(),B(16,"div"),O(17,I0A,2,1,"div")(18,d0A,2,1,"div"),Q()()}if(t&2){let A,i=e.$implicit,n=e.$index,o=p();u(),Y(n>0?1:-1),u(3),ue(" ",o.getArtifactName(i)," "),u(5),wi("ngModel",o.selectedArtifacts[n]),u(),Te(o.getSortedArtifactsFromId(i)),u(7),Y((A=o.selectedArtifacts[n].mediaType)===o.MediaType.IMAGE?17:A===o.MediaType.AUDIO?18:-1)}}var E0A="default_artifact_name",aC=(n=>(n.IMAGE="image",n.AUDIO="audio",n.TEXT="text",n.UNSPECIFIED="unspecified",n))(aC||{});function X6(t){let e=t.toLowerCase();for(let A of Object.values(aC))if(A!=="unspecified"&&e.startsWith(A+"/"))return A;return"unspecified"}function h0A(t){return t?t.startsWith("image/"):!1}function Q0A(t){return t?t.startsWith("audio/"):!1}var Z6=class t{artifacts=me([]);selectedArtifacts=[];isArtifactAudio=Q0A;isArtifactImage=h0A;MediaType=aC;downloadService=w(JB);dialog=w(Or);safeValuesService=w(Cs);ngOnChanges(e){if(e.artifacts){this.selectedArtifacts=[];for(let A of this.getDistinctArtifactIds())this.selectedArtifacts.push(this.getSortedArtifactsFromId(A)[0])}}downloadArtifact(e){this.downloadService.downloadBase64Data(e.data,e.mimeType,e.id)}getArtifactName(e){return e??E0A}getDistinctArtifactIds(){return[...new Set(this.artifacts().map(e=>e.id))]}getSortedArtifactsFromId(e){return this.artifacts().filter(A=>A.id===e).sort((A,i)=>i.versionId-A.versionId)}onArtifactVersionChange(e,A){this.selectedArtifacts[A]=e.value}openViewImageDialog(e){if(!e||!e.startsWith("data:")||e.indexOf(";base64,")===-1)return;let A=this.dialog.open(rE,{maxWidth:"90vw",maxHeight:"90vh",data:{imageData:e}})}openArtifact(e,A){if(this.isArtifactImage(A)){this.openViewImageDialog(e);return}this.openBase64InNewTab(e,A)}openBase64InNewTab(e,A){}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-artifact-tab"]],inputs:{artifacts:[1,"artifacts"]},features:[Yt],decls:3,vars:0,consts:[[1,"artifact-container"],[1,"artifact-box"],[1,"white-separator"],[1,"artifact-metadata"],[1,"link-style-button",3,"click"],[1,"version-select-container"],[3,"ngModelChange","selectionChange","ngModel"],[3,"value"],["mat-flat-button","",1,"download-button",3,"click"],["alt","artifact.id",1,"generated-image",3,"click","src"],[3,"base64data"]],template:function(A,i){A&1&&(B(0,"div",0),Ue(1,B0A,19,4,"div",1,ri),Q()),A&2&&(u(),Te(i.getDistinctArtifactIds()))},dependencies:[Xl,ln,yn,ko,Yr,pi,Wt,aE],styles:[".artifact-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap}.artifact-box[_ngcontent-%COMP%]{padding:10px;max-width:100%;margin-left:26px;display:flex;flex-direction:column}.artifact-metadata[_ngcontent-%COMP%]{display:flex;align-items:center;margin-bottom:15px;flex-wrap:wrap;gap:5px}.download-button[_ngcontent-%COMP%]{margin-left:35px;width:130px;height:28px;font-size:14px}.generated-image[_ngcontent-%COMP%]{max-width:60%;border-radius:8px;cursor:pointer}hr.white-separator[_ngcontent-%COMP%]{border:none;border-top:1px solid var(--artifact-tab-white-separator-border-top-color);margin-bottom:1.2em;margin-right:15px}.version-select-container[_ngcontent-%COMP%]{width:80px;margin-left:15px}.link-style-button[_ngcontent-%COMP%]{border:none;padding:0;font:inherit;color:var(--artifact-tab-link-style-button-color)!important;text-decoration:underline;cursor:pointer;outline:none}.link-style-button[_ngcontent-%COMP%]:hover{color:var(--artifact-tab-link-style-button-hover-color);text-decoration:underline}.link-style-button[_ngcontent-%COMP%]:focus{outline:1px dotted var(--artifact-tab-link-style-button-focus-outline-color)}.link-style-button[_ngcontent-%COMP%]:active{color:var(--artifact-tab-link-style-button-active-color)}.link-style-button[_ngcontent-%COMP%]:disabled{color:var(--artifact-tab-link-style-button-disabled-color);text-decoration:none;cursor:not-allowed}"]})};var u0A=["input"],f0A=["label"],p0A=["*"],g9={color:"accent",clickAction:"check-indeterminate",disabledInteractive:!1},m0A=new kA("mat-checkbox-default-options",{providedIn:"root",factory:()=>g9}),Bs=(function(t){return t[t.Init=0]="Init",t[t.Checked=1]="Checked",t[t.Unchecked=2]="Unchecked",t[t.Indeterminate=3]="Indeterminate",t})(Bs||{}),c9=class{source;checked},ec=(()=>{class t{_elementRef=w(ce);_changeDetectorRef=w(wt);_ngZone=w(qe);_animationsDisabled=An();_options=w(m0A,{optional:!0});focus(){this._inputElement.nativeElement.focus()}_createChangeEvent(A){let i=new c9;return i.source=this,i.checked=A,i}_getAnimationTargetElement(){return this._inputElement?.nativeElement}_animationClasses={uncheckedToChecked:"mdc-checkbox--anim-unchecked-checked",uncheckedToIndeterminate:"mdc-checkbox--anim-unchecked-indeterminate",checkedToUnchecked:"mdc-checkbox--anim-checked-unchecked",checkedToIndeterminate:"mdc-checkbox--anim-checked-indeterminate",indeterminateToChecked:"mdc-checkbox--anim-indeterminate-checked",indeterminateToUnchecked:"mdc-checkbox--anim-indeterminate-unchecked"};ariaLabel="";ariaLabelledby=null;ariaDescribedby;ariaExpanded;ariaControls;ariaOwns;_uniqueId;id;get inputId(){return`${this.id||this._uniqueId}-input`}required=!1;labelPosition="after";name=null;change=new LA;indeterminateChange=new LA;value;disableRipple=!1;_inputElement;_labelElement;tabIndex;color;disabledInteractive;_onTouched=()=>{};_currentAnimationClass="";_currentCheckState=Bs.Init;_controlValueAccessorChangeFn=()=>{};_validatorChangeFn=()=>{};constructor(){w(eo).load(lr);let A=w(new Us("tabindex"),{optional:!0});this._options=this._options||g9,this.color=this._options.color||g9.color,this.tabIndex=A==null?0:parseInt(A)||0,this.id=this._uniqueId=w(In).getId("mat-mdc-checkbox-"),this.disabledInteractive=this._options?.disabledInteractive??!1}ngOnChanges(A){A.required&&this._validatorChangeFn()}ngAfterViewInit(){this._syncIndeterminate(this.indeterminate)}get checked(){return this._checked}set checked(A){A!=this.checked&&(this._checked=A,this._changeDetectorRef.markForCheck())}_checked=!1;get disabled(){return this._disabled}set disabled(A){A!==this.disabled&&(this._disabled=A,this._changeDetectorRef.markForCheck())}_disabled=!1;get indeterminate(){return this._indeterminate()}set indeterminate(A){let i=A!=this._indeterminate();this._indeterminate.set(A),i&&(A?this._transitionCheckState(Bs.Indeterminate):this._transitionCheckState(this.checked?Bs.Checked:Bs.Unchecked),this.indeterminateChange.emit(A)),this._syncIndeterminate(A)}_indeterminate=bA(!1);_isRippleDisabled(){return this.disableRipple||this.disabled}_onLabelTextChange(){this._changeDetectorRef.detectChanges()}writeValue(A){this.checked=!!A}registerOnChange(A){this._controlValueAccessorChangeFn=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorChangeFn=A}_transitionCheckState(A){let i=this._currentCheckState,n=this._getAnimationTargetElement();if(!(i===A||!n)&&(this._currentAnimationClass&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(i,A),this._currentCheckState=A,this._currentAnimationClass.length>0)){n.classList.add(this._currentAnimationClass);let o=this._currentAnimationClass;this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{n.classList.remove(o)},1e3)})}}_emitChangeEvent(){this._controlValueAccessorChangeFn(this.checked),this.change.emit(this._createChangeEvent(this.checked)),this._inputElement&&(this._inputElement.nativeElement.checked=this.checked)}toggle(){this.checked=!this.checked,this._controlValueAccessorChangeFn(this.checked)}_handleInputClick(){let A=this._options?.clickAction;!this.disabled&&A!=="noop"?(this.indeterminate&&A!=="check"&&Promise.resolve().then(()=>{this._indeterminate.set(!1),this.indeterminateChange.emit(!1)}),this._checked=!this._checked,this._transitionCheckState(this._checked?Bs.Checked:Bs.Unchecked),this._emitChangeEvent()):(this.disabled&&this.disabledInteractive||!this.disabled&&A==="noop")&&(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate)}_onInteractionEvent(A){A.stopPropagation()}_onBlur(){Promise.resolve().then(()=>{this._onTouched(),this._changeDetectorRef.markForCheck()})}_getAnimationClassForCheckStateTransition(A,i){if(this._animationsDisabled)return"";switch(A){case Bs.Init:if(i===Bs.Checked)return this._animationClasses.uncheckedToChecked;if(i==Bs.Indeterminate)return this._checked?this._animationClasses.checkedToIndeterminate:this._animationClasses.uncheckedToIndeterminate;break;case Bs.Unchecked:return i===Bs.Checked?this._animationClasses.uncheckedToChecked:this._animationClasses.uncheckedToIndeterminate;case Bs.Checked:return i===Bs.Unchecked?this._animationClasses.checkedToUnchecked:this._animationClasses.checkedToIndeterminate;case Bs.Indeterminate:return i===Bs.Checked?this._animationClasses.indeterminateToChecked:this._animationClasses.indeterminateToUnchecked}return""}_syncIndeterminate(A){let i=this._inputElement;i&&(i.nativeElement.indeterminate=A)}_onInputClick(){this._handleInputClick()}_onTouchTargetClick(){this._handleInputClick(),this.disabled||this._inputElement.nativeElement.focus()}_preventBubblingFromLabel(A){A.target&&this._labelElement.nativeElement.contains(A.target)&&A.stopPropagation()}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-checkbox"]],viewQuery:function(i,n){if(i&1&&Jt(u0A,5)(f0A,5),i&2){let o;ae(o=re())&&(n._inputElement=o.first),ae(o=re())&&(n._labelElement=o.first)}},hostAttrs:[1,"mat-mdc-checkbox"],hostVars:16,hostBindings:function(i,n){i&2&&(ha("id",n.id),te("tabindex",null)("aria-label",null)("aria-labelledby",null),ro(n.color?"mat-"+n.color:"mat-accent"),RA("_mat-animation-noopable",n._animationsDisabled)("mdc-checkbox--disabled",n.disabled)("mat-mdc-checkbox-disabled",n.disabled)("mat-mdc-checkbox-checked",n.checked)("mat-mdc-checkbox-disabled-interactive",n.disabledInteractive))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],ariaExpanded:[2,"aria-expanded","ariaExpanded",Be],ariaControls:[0,"aria-controls","ariaControls"],ariaOwns:[0,"aria-owns","ariaOwns"],id:"id",required:[2,"required","required",Be],labelPosition:"labelPosition",name:"name",value:"value",disableRipple:[2,"disableRipple","disableRipple",Be],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?void 0:Cn(A)],color:"color",disabledInteractive:[2,"disabledInteractive","disabledInteractive",Be],checked:[2,"checked","checked",Be],disabled:[2,"disabled","disabled",Be],indeterminate:[2,"indeterminate","indeterminate",Be]},outputs:{change:"change",indeterminateChange:"indeterminateChange"},exportAs:["matCheckbox"],features:[Bt([{provide:as,useExisting:Ja(()=>t),multi:!0},{provide:Oc,useExisting:t,multi:!0}]),Yt],ngContentSelectors:p0A,decls:15,vars:23,consts:[["checkbox",""],["input",""],["label",""],["mat-internal-form-field","",3,"click","labelPosition"],[1,"mdc-checkbox"],["aria-hidden","true",1,"mat-mdc-checkbox-touch-target",3,"click"],["type","checkbox",1,"mdc-checkbox__native-control",3,"blur","click","change","checked","indeterminate","disabled","id","required","tabIndex"],["aria-hidden","true",1,"mdc-checkbox__ripple"],["aria-hidden","true",1,"mdc-checkbox__background"],["focusable","false","viewBox","0 0 24 24",1,"mdc-checkbox__checkmark"],["fill","none","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-checkbox__checkmark-path"],[1,"mdc-checkbox__mixedmark"],["mat-ripple","","aria-hidden","true",1,"mat-mdc-checkbox-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-label",3,"for"]],template:function(i,n){if(i&1&&(Rt(),B(0,"div",3),U("click",function(a){return n._preventBubblingFromLabel(a)}),B(1,"div",4,0)(3,"div",5),U("click",function(){return n._onTouchTargetClick()}),Q(),B(4,"input",6,1),U("blur",function(){return n._onBlur()})("click",function(){return n._onInputClick()})("change",function(a){return n._onInteractionEvent(a)}),Q(),hA(6,"div",7),B(7,"div",8),Ct(),B(8,"svg",9),hA(9,"path",10),Q(),rr(),hA(10,"div",11),Q(),hA(11,"div",12),Q(),B(12,"label",13,2),Ve(14),Q()()),i&2){let o=Qi(2);H("labelPosition",n.labelPosition),u(4),RA("mdc-checkbox--selected",n.checked),H("checked",n.checked)("indeterminate",n.indeterminate)("disabled",n.disabled&&!n.disabledInteractive)("id",n.inputId)("required",n.required)("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex),te("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby)("aria-describedby",n.ariaDescribedby)("aria-checked",n.indeterminate?"mixed":null)("aria-controls",n.ariaControls)("aria-disabled",n.disabled&&n.disabledInteractive?!0:null)("aria-expanded",n.ariaExpanded)("aria-owns",n.ariaOwns)("name",n.name)("value",n.value),u(7),H("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),u(),H("for",n.inputId)}},dependencies:[rs,W6],styles:[`.mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:18px;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2);margin:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox:hover>.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:hover>.mat-mdc-checkbox-ripple>.mat-ripple-element{background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mat-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mat-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mat-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mat-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mat-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control+.mdc-checkbox__ripple{background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control{position:absolute;margin:0;padding:0;opacity:0;cursor:inherit;z-index:1;width:var(--mat-checkbox-state-layer-size, 40px);height:var(--mat-checkbox-state-layer-size, 40px);top:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2);right:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2);left:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox--disabled{cursor:default;pointer-events:none}.mdc-checkbox__background{display:inline-flex;position:absolute;align-items:center;justify-content:center;box-sizing:border-box;width:18px;height:18px;border:2px solid currentColor;border-radius:2px;background-color:rgba(0,0,0,0);pointer-events:none;will-change:background-color,border-color;transition:background-color 90ms cubic-bezier(0.4, 0, 0.6, 1),border-color 90ms cubic-bezier(0.4, 0, 0.6, 1);-webkit-print-color-adjust:exact;color-adjust:exact;border-color:var(--mat-checkbox-unselected-icon-color, var(--mat-sys-on-surface-variant));top:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2);left:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2)}.mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled .mdc-checkbox__background{border-color:var(--mat-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{background-color:var(--mat-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}@media(forced-colors: active){.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:checked)~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mat-checkbox-unselected-hover-icon-color, var(--mat-sys-on-surface));background-color:rgba(0,0,0,0)}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-hover-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-hover-icon-color, var(--mat-sys-primary))}.mdc-checkbox__native-control:focus:focus:not(:checked)~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mat-checkbox-unselected-focus-icon-color, var(--mat-sys-on-surface))}.mdc-checkbox__native-control:focus:focus:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-focus-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-focus-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:var(--mat-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{background-color:var(--mat-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}.mdc-checkbox__checkmark{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;opacity:0;transition:opacity 180ms cubic-bezier(0.4, 0, 0.6, 1);color:var(--mat-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__checkmark{color:CanvasText}}.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:var(--mat-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:GrayText}}.mdc-checkbox__checkmark-path{transition:stroke-dashoffset 180ms cubic-bezier(0.4, 0, 0.6, 1);stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.7833385;stroke-dasharray:29.7833385}.mdc-checkbox__mixedmark{width:100%;height:0;transform:scaleX(0) rotate(0deg);border-width:1px;border-style:solid;opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1);border-color:var(--mat-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__mixedmark{margin:0 1px}}.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:var(--mat-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:GrayText}}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background,.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background,.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background,.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background{animation-duration:180ms;animation-timing-function:linear}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-unchecked-checked-checkmark-path 180ms linear;transition:none}.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-checked-unchecked-checkmark-path 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark{animation:mdc-checkbox-checked-indeterminate-checkmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-checked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark{animation:mdc-checkbox-indeterminate-checked-checkmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-checked-mixedmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear;transition:none}.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{transition:border-color 90ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path{stroke-dashoffset:0}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark{transition:opacity 180ms cubic-bezier(0, 0, 0.2, 1),transform 180ms cubic-bezier(0, 0, 0.2, 1);opacity:1}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(-45deg)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark{transform:rotate(45deg);opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(0deg);opacity:1}@keyframes mdc-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:29.7833385}50%{animation-timing-function:cubic-bezier(0, 0, 0.2, 1)}100%{stroke-dashoffset:0}}@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{transform:scaleX(1)}}@keyframes mdc-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(0.4, 0, 1, 1);opacity:1;stroke-dashoffset:0}to{opacity:0;stroke-dashoffset:-29.7833385}}@keyframes mdc-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(45deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(45deg);opacity:0}to{transform:rotate(360deg);opacity:1}}@keyframes mdc-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(-45deg);opacity:0}to{transform:rotate(0deg);opacity:1}}@keyframes mdc-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(315deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;transform:scaleX(1);opacity:1}32.8%,100%{transform:scaleX(0);opacity:0}}.mat-mdc-checkbox{display:inline-block;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-touch-target,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__native-control,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__ripple,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-ripple::before,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__mixedmark{transition:none !important;animation:none !important}.mat-mdc-checkbox label{cursor:pointer}.mat-mdc-checkbox .mat-internal-form-field{color:var(--mat-checkbox-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-checkbox-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-checkbox-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-checkbox-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-checkbox-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-checkbox-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive{pointer-events:auto}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive input{cursor:default}.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{cursor:default;color:var(--mat-checkbox-disabled-label-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{color:GrayText}}.mat-mdc-checkbox label:empty{display:none}.mat-mdc-checkbox .mdc-checkbox__ripple{opacity:0}.mat-mdc-checkbox .mat-mdc-checkbox-ripple,.mdc-checkbox__ripple{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-checkbox .mat-mdc-checkbox-ripple:not(:empty),.mdc-checkbox__ripple:not(:empty){transform:translateZ(0)}.mat-mdc-checkbox-ripple .mat-ripple-element{opacity:.1}.mat-mdc-checkbox-touch-target{position:absolute;top:50%;left:50%;height:var(--mat-checkbox-touch-target-size, 48px);width:var(--mat-checkbox-touch-target-size, 48px);transform:translate(-50%, -50%);display:var(--mat-checkbox-touch-target-display, block)}.mat-mdc-checkbox .mat-mdc-checkbox-ripple::before{border-radius:50%}.mdc-checkbox__native-control:focus-visible~.mat-focus-indicator::before{content:""} -`],encapsulation:2,changeDetection:0})}return t})(),AO=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[ec,fi]})}return t})();var eO=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({})}return t})();var tO=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[eO,Zc,fi]})}return t})();var D0A={google_search:"search",EnterpriseWebSearchTool:"web",VertexAiSearchTool:"search",FilesRetrieval:"find_in_page",load_memory:"memory",preload_memory:"memory",url_context:"link",VertexAiRagRetrieval:"find_in_page",exit_loop:"sync",get_user_choice:"how_to_reg",load_artifacts:"image",LongRunningFunctionTool:"data_object"};function sE(t,e){return e==="Agent Tool"?"smart_toy":e==="Built-in tool"?D0A[t]||"build":e==="Function tool"?"data_object":"build"}var tc=class t{static toolMenuTooltips=new Map([["Function tool","Build custom tools for your specific ADK agent needs."],["Built-in tool","Ready-to-use functionality such as Google Search or code executors that provide agents with common capabilities. "],["Agent tool","A sub-agent that can be invoked as a tool by another agent."]]);static toolDetailedInfo=new Map([["Function tool",{shortDescription:"Build custom tools for your specific ADK agent needs.",detailedDescription:"The ADK framework automatically inspects your Python function's signature\u2014including its name, docstring, parameters, type hints, and default values\u2014to generate a schema. This schema is what the LLM uses to understand the tool's purpose, when to use it, and what arguments it requires.",docLink:"https://google.github.io/adk-docs/tools/function-tools/"}],["Agent tool",{shortDescription:"Wraps a sub-agent as a callable tool, enabling modular and hierarchical agent architectures.",detailedDescription:"Agent tools allow you to use one agent as a tool within another agent, creating powerful multi-agent workflows.",docLink:"https://google.github.io/adk-docs/agents/multi-agents/#c-explicit-invocation-agenttool"}]]);static callbackMenuTooltips=new Map([["before_agent","Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed."],["after_agent","Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes."],["before_model","Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow."],["after_model","Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent."],["before_tool","Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it."],["after_tool","Called just after the tool's run_async method completes successfully."]]);static callbackDialogTooltips=new Map([["before_agent","Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed."],["after_agent","Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes."],["before_model","Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow."],["after_model","Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent."],["before_tool","Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it."],["after_tool","Called just after the tool's run_async method completes successfully."]]);static callbackDetailedInfo=new Map([["before_agent",{shortDescription:"Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed. It runs after the agent's InvocationContext is created but before its core logic begins.",detailedDescription:" Ideal for setting up resources or state needed only for this specific agent's run, performing validation checks on the session state (callback_context.state) before execution starts, logging the entry point of the agent's activity, or potentially modifying the invocation context before the core logic uses it.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-agent-callback"}],["after_agent",{shortDescription:"Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes.",detailedDescription:"Useful for cleanup tasks, post-execution validation, logging the completion of an agent's activity, modifying final state, or augmenting/replacing the agent's final output.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-agent-callback"}],["before_model",{shortDescription:"Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow.",detailedDescription:"Allows inspection and modification of the request going to the LLM. Use cases include adding dynamic instructions, injecting few-shot examples based on state, modifying model config, implementing guardrails (like profanity filters), or implementing request-level caching.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-model-callback"}],["after_model",{shortDescription:"Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent.",detailedDescription:"Allows inspection or modification of the raw LLM response.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-model-callback"}],["before_tool",{shortDescription:"Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it.",detailedDescription:"Allows inspection and modification of tool arguments, performing authorization checks before execution, logging tool usage attempts, or implementing tool-level caching.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-tool-callback"}],["after_tool",{shortDescription:"Called just after the tool's run_async method completes successfully.",detailedDescription:"Allows inspection and modification of the tool's result before it's sent back to the LLM (potentially after summarization). Useful for logging tool results, post-processing or formatting results, or saving specific parts of the result to the session state.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-tool-callback"}]]);static getToolMenuTooltips(e){return t.toolMenuTooltips.get(e)}static getToolDetailedInfo(e){return t.toolDetailedInfo.get(e)}static getCallbackMenuTooltips(e){return t.callbackMenuTooltips.get(e)}static getCallbackDialogTooltips(e){return t.callbackDialogTooltips.get(e)}static getCallbackDetailedInfo(e){return t.callbackDetailedInfo.get(e)}};var y0A=["callbackNameInput"];function v0A(t,e){if(t&1){let A=QA();Dl(0),B(1,"div",8)(2,"div",9),U("click",function(){T(A);let n=p();return J(n.toggleCallbackInfo())}),B(3,"mat-icon",10),y(4,"info"),Q(),B(5,"div",11)(6,"span"),y(7,"Callback Information"),Q()(),B(8,"button",12)(9,"mat-icon"),y(10),Q()()(),B(11,"div",13)(12,"div",14)(13,"div",15),y(14),Q(),B(15,"div",16),y(16),Q()(),B(17,"div",17)(18,"a",18)(19,"mat-icon"),y(20,"open_in_new"),Q(),B(21,"span"),y(22,"View Official Documentation"),Q()()()()(),yl()}if(t&2){let A,i,n,o=p();u(10),lA(o.isCallbackInfoExpanded?"expand_less":"expand_more"),u(),RA("expanded",o.isCallbackInfoExpanded),u(3),lA((A=o.getCallbackInfo())==null?null:A.shortDescription),u(2),lA((i=o.getCallbackInfo())==null?null:i.detailedDescription),u(2),H("href",(n=o.getCallbackInfo())==null?null:n.docLink,Go)}}function b0A(t,e){if(t&1&&(B(0,"mat-option",21),y(1),Q()),t&2){let A=e.$implicit;H("value",A),u(),lA(A)}}function M0A(t,e){if(t&1){let A=QA();Dl(0),B(1,"mat-form-field",3)(2,"mat-label"),y(3,"Callback Type"),Q(),B(4,"mat-select",19),Di("ngModelChange",function(n){T(A);let o=p();return Bi(o.callbackType,n)||(o.callbackType=n),J(n)}),Et(5,b0A,2,2,"mat-option",20),Q()(),yl()}if(t&2){let A=p();u(4),wi("ngModel",A.callbackType),u(),H("ngForOf",A.availableCallbackTypes)}}function S0A(t,e){t&1&&(B(0,"mat-error"),y(1,"Same callback name has been used"),Q())}function k0A(t,e){t&1&&(B(0,"mat-error"),y(1,"Cannot have callback consist of two words"),Q())}function x0A(t,e){t&1&&(B(0,"mat-error"),y(1,"Callback function names cannot have spaces"),Q())}var C9=class{isErrorState(e){return!!(e&&e.invalid)}},o4=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.callbackType=A?.callbackType??"",this.existingCallbackNames=A?.existingCallbackNames??[],this.isEditMode=!!A?.isEditMode,this.availableCallbackTypes=A?.availableCallbackTypes??[],this.isEditMode&&A?.callback&&(this.callbackName=A.callback.name,this.callbackType=A.callback.type,this.originalCallbackName=A.callback.name,this.existingCallbackNames=this.existingCallbackNames.filter(i=>i!==this.originalCallbackName))}callbackNameInput;callbackName="";callbackType="";existingCallbackNames=[];matcher=new C9;isEditMode=!1;availableCallbackTypes=[];originalCallbackName="";isCallbackInfoExpanded=!1;addCallback(){if(!this.callbackName.trim()||this.hasSpaces()||this.isDuplicateName())return;let e={name:this.callbackName.trim(),type:this.callbackType,isEditMode:this.isEditMode,originalName:this.originalCallbackName||this.callbackName.trim()};this.dialogRef.close(e)}cancel(){this.dialogRef.close()}isDuplicateName(){if(!Array.isArray(this.existingCallbackNames))return!1;let e=(this.callbackName||"").trim();return this.existingCallbackNames.includes(e)}hasSpaces(){return/\s/.test(this.callbackName||"")}createDisabled(){return!this.callbackName.trim()||this.isDuplicateName()||this.hasSpaces()}validate(){this.hasSpaces()?this.callbackNameInput.control.setErrors({hasSpaces:!0}):this.isDuplicateName()?this.callbackNameInput.control.setErrors({duplicateName:!0}):this.callbackNameInput.control.setErrors(null)}getCallbackInfo(){return tc.getCallbackDetailedInfo(this.callbackType)}toggleCallbackInfo(){this.isCallbackInfoExpanded=!this.isCallbackInfoExpanded}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-add-callback-dialog"]],viewQuery:function(A,i){if(A&1&&Jt(y0A,5),A&2){let n;ae(n=re())&&(i.callbackNameInput=n.first)}},decls:18,vars:10,consts:[["callbackNameInput","ngModel"],["mat-dialog-title",""],[4,"ngIf"],[2,"width","100%"],["matInput","",3,"ngModelChange","keydown.enter","ngModel","errorStateMatcher"],["align","end"],["mat-button","",3,"click"],["mat-raised-button","","color","secondary",3,"click","disabled"],[1,"callback-info-container"],[1,"callback-info-header",3,"click"],[1,"callback-info-icon"],[1,"callback-info-title"],["mat-icon-button","","type","button","aria-label","Toggle callback information",1,"callback-info-toggle"],[1,"callback-info-body"],[1,"callback-info-content"],[1,"callback-info-short"],[1,"callback-info-detailed"],[1,"callback-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"callback-info-link",3,"href"],[3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]],template:function(A,i){if(A&1){let n=QA();B(0,"h2",1),y(1),Q(),B(2,"mat-dialog-content"),Et(3,v0A,23,6,"ng-container",2)(4,M0A,6,2,"ng-container",2),B(5,"mat-form-field",3)(6,"mat-label"),y(7,"Callback Name"),Q(),B(8,"input",4,0),Di("ngModelChange",function(a){return T(n),Bi(i.callbackName,a)||(i.callbackName=a),J(a)}),U("ngModelChange",function(){return i.validate()})("keydown.enter",function(){return i.addCallback()}),Q(),Et(10,S0A,2,0,"mat-error",2)(11,k0A,2,0,"mat-error",2)(12,x0A,2,0,"mat-error",2),Q()(),B(13,"mat-dialog-actions",5)(14,"button",6),U("click",function(){return i.cancel()}),y(15,"Cancel"),Q(),B(16,"button",7),U("click",function(){return i.addCallback()}),y(17),Q()()}if(A&2){let n=Qi(9);u(),lA(i.isEditMode?"Edit Callback":"Add "+i.callbackType+" Callback"),u(2),H("ngIf",i.getCallbackInfo()),u(),H("ngIf",i.isEditMode),u(4),wi("ngModel",i.callbackName),H("errorStateMatcher",i.matcher),u(2),H("ngIf",n.hasError("duplicateName")),u(),H("ngIf",n.hasError("hasSpaces")),u(),H("ngIf",n.hasError("hasSpaces")),u(4),H("disabled",i.createDisabled()),u(),ue(" ",i.isEditMode?"Save":"Add"," ")}},dependencies:[li,A2,Js,ln,Dn,yn,ko,Xc,fa,pa,Na,qi,pi,ji,Ya,Ko,vs,Kb,Ps,ua,$0,Xl,Yr,Tn,Wt],styles:[".callback-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;min-width:400px;max-width:600px}.full-width[_ngcontent-%COMP%]{width:100%}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}mat-dialog-actions[_ngcontent-%COMP%]{padding:16px 24px;margin:0}mat-form-field[_ngcontent-%COMP%]{margin-top:8px!important}.callback-info-container[_ngcontent-%COMP%]{border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.callback-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.callback-info-header[_ngcontent-%COMP%]:hover .callback-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.callback-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.callback-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.callback-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.callback-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.callback-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.callback-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.callback-info-content[_ngcontent-%COMP%]{flex:1}.callback-info-short[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-dialog-content-text-color);margin-bottom:8px;line-height:1.4}.callback-info-detailed[_ngcontent-%COMP%]{color:var(--mat-dialog-content-text-color);font-size:14px;line-height:1.5;opacity:.8}.callback-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.callback-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.callback-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.callback-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};function _0A(t,e){if(t&1){let A=QA();Dl(0),B(1,"div",6)(2,"div",7),U("click",function(){T(A);let n=p();return J(n.toggleToolInfo())}),B(3,"mat-icon",8),y(4,"info"),Q(),B(5,"div",9)(6,"span"),y(7,"Tool Information"),Q()(),B(8,"button",10)(9,"mat-icon"),y(10),Q()()(),B(11,"div",11)(12,"div",12)(13,"div",13),y(14),Q(),B(15,"div",14),y(16),Q()(),B(17,"div",15)(18,"a",16)(19,"mat-icon"),y(20,"open_in_new"),Q(),B(21,"span"),y(22,"View Official Documentation"),Q()()()()(),yl()}if(t&2){let A,i,n,o=p();u(10),lA(o.isToolInfoExpanded?"expand_less":"expand_more"),u(),RA("expanded",o.isToolInfoExpanded),u(3),lA((A=o.getToolInfo())==null?null:A.shortDescription),u(2),lA((i=o.getToolInfo())==null?null:i.detailedDescription),u(2),H("href",(n=o.getToolInfo())==null?null:n.docLink,Go)}}function R0A(t,e){if(t&1){let A=QA();B(0,"mat-form-field",2)(1,"input",17),Di("ngModelChange",function(n){T(A);let o=p();return Bi(o.toolName,n)||(o.toolName=n),J(n)}),U("keydown.enter",function(){T(A);let n=p();return J(n.addTool())}),Q()()}if(t&2){let A=p();u(),wi("ngModel",A.toolName)}}function N0A(t,e){if(t&1&&(B(0,"mat-option",20),y(1),Q()),t&2){let A=e.$implicit;H("value",A),u(),ue(" ",A," ")}}function F0A(t,e){if(t&1){let A=QA();B(0,"mat-form-field",2)(1,"mat-select",18),Di("ngModelChange",function(n){T(A);let o=p();return Bi(o.selectedBuiltInTool,n)||(o.selectedBuiltInTool=n),J(n)}),Et(2,N0A,2,2,"mat-option",19),Q()()}if(t&2){let A=p();u(),wi("ngModel",A.selectedBuiltInTool),u(),H("ngForOf",A.builtInTools)}}var v2=class t{constructor(e,A){this.data=e;this.dialogRef=A}toolName="";toolType="Function tool";selectedBuiltInTool="google_search";builtInTools=["EnterpriseWebSearchTool","exit_loop","FilesRetrieval","get_user_choice","google_search","load_artifacts","load_memory","LongRunningFunctionTool","preload_memory","url_context","VertexAiRagRetrieval","VertexAiSearchTool"];isEditMode=!1;isToolInfoExpanded=!1;ngOnInit(){this.toolType=this.data.toolType,this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName&&(this.toolType==="Function tool"?this.toolName=this.data.toolName:this.toolType==="Built-in tool"&&(this.selectedBuiltInTool=this.data.toolName))}addTool(){if(this.toolType==="Function tool"&&!this.toolName.trim())return;let e={toolType:this.toolType,isEditMode:this.isEditMode};this.toolType==="Function tool"?e.name=this.toolName.trim():this.toolType==="Built-in tool"&&(e.name=this.selectedBuiltInTool),this.dialogRef.close(e)}cancel(){this.dialogRef.close()}createDisabled(){return this.toolType==="Function tool"&&!this.toolName.trim()}getToolInfo(){return tc.getToolDetailedInfo(this.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \u0275fac=function(A){return new(A||t)(ct(qo),ct(lo))};static \u0275cmp=SA({type:t,selectors:[["app-add-tool-dialog"]],decls:11,vars:6,consts:[["mat-dialog-title","",1,"dialog-title"],[4,"ngIf"],[2,"width","100%"],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click","disabled"],[1,"tool-info-container"],[1,"tool-info-header",3,"click"],[1,"tool-info-icon"],[1,"tool-info-title"],["mat-icon-button","","type","button","aria-label","Toggle tool information",1,"tool-info-toggle"],[1,"tool-info-body"],[1,"tool-info-content"],[1,"tool-info-short"],[1,"tool-info-detailed"],[1,"tool-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"tool-info-link",3,"href"],["matInput","","placeholder","Enter full function name",3,"ngModelChange","keydown.enter","ngModel"],["placeholder","Select built-in tool",3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]],template:function(A,i){A&1&&(B(0,"h2",0),y(1),Q(),B(2,"mat-dialog-content"),Et(3,_0A,23,6,"ng-container",1),O(4,R0A,2,1,"mat-form-field",2),O(5,F0A,3,2,"mat-form-field",2),Q(),B(6,"mat-dialog-actions",3)(7,"button",4),U("click",function(){return i.cancel()}),y(8,"Cancel"),Q(),B(9,"button",5),U("click",function(){return i.addTool()}),y(10),Q()()),A&2&&(u(),lA(i.isEditMode?"Editing Tool":"Add New Tool"),u(2),H("ngIf",i.getToolInfo()),u(),Y(i.toolType==="Function tool"?4:-1),u(),Y(i.toolType==="Built-in tool"?5:-1),u(4),H("disabled",i.createDisabled()),u(),ue(" ",i.isEditMode?"Save":"Create"," "))},dependencies:[li,A2,Js,ln,Dn,yn,ko,fa,Na,Ko,ua,Xl,Yr,pa,pi,ji,Wt],styles:[".dialog-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;font-family:Google Sans;font-size:24px}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}.tool-info-container[_ngcontent-%COMP%]{border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:#e3e3e3;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:#c4c7ca;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};function Vo(t){return Array.isArray(t)}function ia(t){return t!==null&&typeof t=="object"&&(t.constructor===void 0||t.constructor.name==="Object")}function I9(t){return t&&typeof t=="object"?t.op==="add":!1}function d9(t){return t&&typeof t=="object"?t.op==="remove":!1}function $6(t){return t&&typeof t=="object"?t.op==="replace":!1}function A8(t){return t&&typeof t=="object"?t.op==="copy":!1}function b2(t){return t&&typeof t=="object"?t.op==="move":!1}function iO(t,e){return JSON.stringify(t)===JSON.stringify(e)}function L0A(t,e){return t===e}function B9(t){return t.slice(0,t.length-1)}function nO(t){return t[t.length-1]}function oO(t,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:L0A;if(t.length{e[A]=t[A]}),e}if(ia(t)){let e=gA({},t);return Object.getOwnPropertySymbols(t).forEach(A=>{e[A]=t[A]}),e}return t}function Q9(t,e,A){if(t[e]===A)return t;let i=h9(t);return i[e]=A,i}function Xe(t,e){let A=t,i=0;for(;i3&&arguments[3]!==void 0?arguments[3]:!1;if(e.length===0)return A;let n=e[0],o=Hr(t?t[n]:void 0,e.slice(1),A,i);if(ia(t)||Vo(t))return Q9(t,n,o);if(i){let a=G0A.test(n)?[]:{};return a[n]=o,a}throw new Error("Path does not exist")}var G0A=/^\d+$/;function a4(t,e,A){if(e.length===0)return A(t);if(!E9(t))throw new Error("Path doesn't exist");let i=e[0],n=a4(t[i],e.slice(1),A);return Q9(t,i,n)}function x1(t,e){if(e.length===0)return t;if(!E9(t))throw new Error("Path does not exist");if(e.length===1){let n=e[0];if(!(n in t))return t;let o=h9(t);return Vo(o)&&o.splice(Number.parseInt(n),1),ia(o)&&delete o[n],o}let A=e[0],i=x1(t[A],e.slice(1));return Q9(t,A,i)}function r4(t,e,A){let i=e.slice(0,e.length-1),n=e[e.length-1];return a4(t,i,o=>{if(!Array.isArray(o))throw new TypeError(`Array expected at path ${JSON.stringify(i)}`);let a=h9(o);return a.splice(Number.parseInt(n),0,A),a})}function vr(t,e){return t===void 0?!1:e.length===0?!0:t===null?!1:vr(t[e[0]],e.slice(1))}function Es(t){let e=t.split("/");return e.shift(),e.map(A=>A.replace(/~1/g,"/").replace(/~0/g,"~"))}function vt(t){return t.map(aO).join("")}function aO(t){return`/${String(t).replace(/~/g,"~0").replace(/\//g,"~1")}`}function s4(t,e){return t+aO(e)}function tl(t,e,A){let i=t;for(let n=0;n{let r,s=il(o,a.path);if(a.op==="add")r=lO(o,s);else if(a.op==="remove")r=sO(o,s);else if(a.op==="replace")r=rO(o,s);else if(a.op==="copy")r=P0A(o,s);else if(a.op==="move")r=j0A(o,s,l4(a.from));else if(a.op==="test")r=[];else throw new Error(`Unknown JSONPatch operation ${JSON.stringify(a)}`);let l;if(A?.before){let g=A.before(o,a,r);if(g?.revertOperations&&(r=g.revertOperations),g?.document&&(l=g.document),g?.json)throw new Error('Deprecation warning: returned object property ".json" has been renamed to ".document"')}if(i=r.concat(i),l!==void 0)return{document:l}}}),i}function rO(t,e){return vr(t,e)?[{op:"replace",path:vt(e),value:Xe(t,e)}]:[]}function sO(t,e){return[{op:"add",path:vt(e),value:Xe(t,e)}]}function lO(t,e){return lE(t,e)||!vr(t,e)?[{op:"remove",path:vt(e)}]:rO(t,e)}function P0A(t,e){return lO(t,e)}function j0A(t,e,A){if(e.length="0"&&t<="9"}function IO(t){return t>=" "}function g4(t){return`,:[]/{}() -+`.includes(t)}function p9(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"||t==="_"||t==="$"}function m9(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"||t==="_"||t==="$"||t>="0"&&t<="9"}var w9=/^(http|https|ftp|mailto|file|data|irc):\/\/$/,D9=/^[A-Za-z0-9-._~:/?#@!$&'()*+;=]$/;function y9(t){return`,[]/{} -+`.includes(t)}function v9(t){return c4(t)||nCA.test(t)}var nCA=/^[[{\w-]$/;function dO(t){return t===` -`||t==="\r"||t===" "||t==="\b"||t==="\f"}function M2(t,e){let A=t.charCodeAt(e);return A===32||A===10||A===9||A===13}function BO(t,e){let A=t.charCodeAt(e);return A===32||A===9||A===13}function EO(t,e){let A=t.charCodeAt(e);return A===160||A===6158||A>=8192&&A<=8203||A===8239||A===8287||A===12288||A===65279}function c4(t){return b9(t)||n8(t)}function b9(t){return t==='"'||t==="\u201C"||t==="\u201D"}function M9(t){return t==='"'}function n8(t){return t==="'"||t==="\u2018"||t==="\u2019"||t==="`"||t==="\xB4"}function S9(t){return t==="'"}function gE(t,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=t.lastIndexOf(e);return i!==-1?t.substring(0,i)+(A?"":t.substring(i+1)):t}function og(t,e){let A=t.length;if(!M2(t,A-1))return t+e;for(;M2(t,A-1);)A--;return t.substring(0,A)+e+t.substring(A)}function hO(t,e,A){return t.substring(0,e)+t.substring(e+A)}function QO(t){return/[,\n][ \t\r]*$/.test(t)}var oCA={"\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},aCA={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:` -`,r:"\r",t:" "};function ag(t){let e=0,A="";l(["```","[```","{```"]),o()||X(),l(["```","```]","```}"]);let n=C(",");for(n&&a(),v9(t[e])&&QO(A)?(n||(A=og(A,",")),m()):n&&(A=gE(A,","));t[e]==="}"||t[e]==="]";)e++,a();if(e>=t.length)return A;BA();function o(){a();let aA=E()||f()||v()||S()||b()||F(!1)||z();return a(),aA}function a(){let aA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,rA=e,uA=r(aA);do uA=s(),uA&&(uA=r(aA));while(uA);return e>rA}function r(aA){let rA=aA?M2:BO,uA="";for(;;)if(rA(t,e))uA+=t[e],e++;else if(EO(t,e))uA+=" ",e++;else break;return uA.length>0?(A+=uA,!0):!1}function s(){if(t[e]==="/"&&t[e+1]==="*"){for(;e=t.length;UA||(v9(t[e])||$A?A=og(A,":"):AA()),o()||(UA||$A?A+="null":AA())}return t[e]==="}"?(A+="}",e++):A=og(A,"}"),!0}return!1}function f(){if(t[e]==="["){A+="[",e++,a(),I(",")&&a();let aA=!0;for(;e0&&arguments[0]!==void 0?arguments[0]:!1,rA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:-1,uA=t[e]==="\\";if(uA&&(e++,uA=!0),c4(t[e])){let UA=M9(t[e])?M9:S9(t[e])?S9:n8(t[e])?n8:b9,$A=e,zA=A.length,pA='"';for(e++;;){if(e>=t.length){let PA=P(e-1);return!aA&&g4(t.charAt(PA))?(e=$A,A=A.substring(0,zA),v(!0)):(pA=og(pA,'"'),A+=pA,!0)}if(e===rA)return pA=og(pA,'"'),A+=pA,!0;if(UA(t[e])){let PA=e,Je=pA.length;if(pA+='"',e++,A+=pA,a(!1),aA||e>=t.length||g4(t[e])||c4(t[e])||S2(t[e]))return k(),!0;let _e=P(PA-1),YA=t.charAt(_e);if(YA===",")return e=$A,A=A.substring(0,zA),v(!1,_e);if(g4(YA))return e=$A,A=A.substring(0,zA),v(!0);A=A.substring(0,zA),e=PA+1,pA=`${pA.substring(0,Je)}\\${pA.substring(Je)}`}else if(aA&&y9(t[e])){if(t[e-1]===":"&&w9.test(t.substring($A+1,e+2)))for(;e=t.length?e=t.length:IA()}else pA+=PA,e+=2}else{let PA=t.charAt(e);PA==='"'&&t[e-1]!=="\\"?(pA+=`\\${PA}`,e++):dO(PA)?(pA+=oCA[PA],e++):(IO(PA)||W(PA),pA+=PA,e++)}uA&&d()}}return!1}function k(){let aA=!1;for(a();t[e]==="+";){aA=!0,e++,a(),A=gE(A,'"',!0);let rA=A.length;v()?A=hO(A,rA,1):A=og(A,'"')}return aA}function S(){let aA=e;if(t[e]==="-"){if(e++,Z())return tA(aA),!0;if(!S2(t[e]))return e=aA,!1}for(;S2(t[e]);)e++;if(t[e]==="."){if(e++,Z())return tA(aA),!0;if(!S2(t[e]))return e=aA,!1;for(;S2(t[e]);)e++}if(t[e]==="e"||t[e]==="E"){if(e++,(t[e]==="-"||t[e]==="+")&&e++,Z())return tA(aA),!0;if(!S2(t[e]))return e=aA,!1;for(;S2(t[e]);)e++}if(!Z())return e=aA,!1;if(e>aA){let rA=t.slice(aA,e),uA=/^0\d/.test(rA);return A+=uA?`"${rA}"`:rA,!0}return!1}function b(){return x("true","true")||x("false","false")||x("null","null")||x("True","true")||x("False","false")||x("None","null")}function x(aA,rA){return t.slice(e,e+aA.length)===aA?(A+=rA,e+=aA.length,!0):!1}function F(aA){let rA=e;if(p9(t[e])){for(;erA){for(;M2(t,e-1)&&e>0;)e--;let uA=t.slice(rA,e);return A+=uA==="undefined"?"null":JSON.stringify(uA),t[e]==='"'&&e++,!0}}function z(){if(t[e]==="/"){let aA=e;for(e++;e0&&M2(t,rA);)rA--;return rA}function Z(){return e>=t.length||g4(t[e])||M2(t,e)}function tA(aA){A+=`${t.slice(aA,e)}0`}function W(aA){throw new rC(`Invalid character ${JSON.stringify(aA)}`,e)}function BA(){throw new rC(`Unexpected character ${JSON.stringify(t[e])}`,e)}function X(){throw new rC("Unexpected end of json string",t.length)}function iA(){throw new rC("Object key expected",e)}function AA(){throw new rC("Colon expected",e)}function IA(){let aA=t.slice(e,e+6);throw new rC(`Invalid unicode character "${aA}"`,e)}}function rCA(t,e){return t[e]==="*"&&t[e+1]==="/"}var sCA=typeof global=="object"&&global&&global.Object===Object&&global,o8=sCA;var lCA=typeof self=="object"&&self&&self.Object===Object&&self,gCA=o8||lCA||Function("return this")(),Ga=gCA;var cCA=Ga.Symbol,br=cCA;var uO=Object.prototype,CCA=uO.hasOwnProperty,ICA=uO.toString,C4=br?br.toStringTag:void 0;function dCA(t){var e=CCA.call(t,C4),A=t[C4];try{t[C4]=void 0;var i=!0}catch(o){}var n=ICA.call(t);return i&&(e?t[C4]=A:delete t[C4]),n}var fO=dCA;var BCA=Object.prototype,ECA=BCA.toString;function hCA(t){return ECA.call(t)}var pO=hCA;var QCA="[object Null]",uCA="[object Undefined]",mO=br?br.toStringTag:void 0;function fCA(t){return t==null?t===void 0?uCA:QCA:mO&&mO in Object(t)?fO(t):pO(t)}var ic=fCA;function pCA(t){return t!=null&&typeof t=="object"}var _s=pCA;var mCA="[object Symbol]";function wCA(t){return typeof t=="symbol"||_s(t)&&ic(t)==mCA}var kl=wCA;function DCA(t,e){for(var A=-1,i=t==null?0:t.length,n=Array(i);++A0){if(++e>=C2A)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var TO=B2A;function E2A(t){return function(){return t}}var JO=E2A;var h2A=(function(){try{var t=nl(Object,"defineProperty");return t({},"",{}),t}catch(e){}})(),CE=h2A;var Q2A=CE?function(t,e){return CE(t,"toString",{configurable:!0,enumerable:!1,value:JO(e),writable:!0})}:l0,OO=Q2A;var u2A=TO(OO),YO=u2A;function f2A(t,e){for(var A=-1,i=t==null?0:t.length;++A-1&&t%1==0&&t-1&&t%1==0&&t<=_2A}var dE=R2A;function N2A(t){return t!=null&&dE(t.length)&&!a8(t)}var rg=N2A;function F2A(t,e,A){if(!Cr(A))return!1;var i=typeof e;return(i=="number"?rg(A)&&IE(e,A.length):i=="string"&&e in A)?_2(A[e],t):!1}var d4=F2A;var L2A=Object.prototype;function G2A(t){var e=t&&t.constructor,A=typeof e=="function"&&e.prototype||L2A;return t===A}var N2=G2A;function K2A(t,e){for(var A=-1,i=Array(t);++A-1}var IY=n1A;function o1A(t,e){var A=this.__data__,i=G2(A,t);return i<0?(++this.size,A.push([t,e])):A[i][1]=e,this}var dY=o1A;function uE(t){var e=-1,A=t==null?0:t.length;for(this.clear();++e0&&A(r)?e>1?bY(r,e-1,A,i,n):mE(n,r):i||(n[n.length]=r)}return n}var MY=bY;var M1A=C8(Object.getPrototypeOf,Object),E8=M1A;function S1A(t,e,A){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),A=A>n?n:A,A<0&&(A+=n),n=e>A?0:A-e>>>0,e>>>=0;for(var o=Array(n);++ir))return!1;var l=o.get(t),g=o.get(e);if(l&&g)return l==e&&g==t;var C=-1,I=!0,d=A&MBA?new QH:void 0;for(o.set(t,e),o.set(e,t);++C=e||F<0||C&&z>=o}function m(){var x=F8();if(f(x))return v(x);r=setTimeout(m,E(x))}function v(x){return r=void 0,I&&i?d(x):(i=n=void 0,a)}function k(){r!==void 0&&clearTimeout(r),l=0,i=s=n=r=void 0}function S(){return r===void 0?a:v(F8())}function b(){var x=F8(),F=f(x);if(i=arguments,n=this,s=x,F){if(r===void 0)return h(s);if(C)return clearTimeout(r),r=setTimeout(m,e),d(s)}return r===void 0&&(r=setTimeout(m,e)),a}return b.cancel=k,b.flush=S,b}var ME=MEA;function SEA(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}var ki=SEA;function kEA(t){return typeof t=="function"?t:l0}var L8=kEA;function xEA(t,e){for(var A=t==null?0:t.length;A--&&e(t[A],A,t)!==!1;);return t}var HH=xEA;var _EA=k8(!0),zH=_EA;function REA(t,e){return t&&zH(t,e,sg)}var PH=REA;var NEA=_8(PH,!0),jH=NEA;function FEA(t,e){var A=co(t)?HH:jH;return A(t,L8(e))}var L9=FEA;function LEA(t){return t&&t.length?t[0]:void 0}var lg=LEA;function GEA(t,e){var A=-1,i=rg(t)?Array(t.length):[];return R8(t,function(n,o,a){i[++A]=e(n,o,a)}),i}var G8=GEA;function KEA(t,e){var A=co(t)?k2:G8;return A(t,g0(e,3))}var G9=KEA;var UEA=Object.prototype,TEA=UEA.hasOwnProperty,JEA=N8(function(t,e,A){TEA.call(t,A)?t[A].push(e):x2(t,A,[e])}),K9=JEA;function OEA(t){var e=t==null?0:t.length;return e?SY(t,0,-1):[]}var Yi=OEA;var YEA="[object Map]",HEA="[object Set]",zEA=Object.prototype,PEA=zEA.hasOwnProperty;function jEA(t){if(t==null)return!0;if(rg(t)&&(co(t)||typeof t=="string"||typeof t.splice=="function"||lC(t)||BE(t)||F2(t)))return!t.length;var e=nc(t);if(e==YEA||e==HEA)return!t.size;if(N2(t))return!I8(t).length;for(var A in t)if(PEA.call(t,A))return!1;return!0}var en=jEA;function qEA(t,e){return bE(t,e)}var Mi=qEA;function VEA(t,e){return te||o&&a&&s&&!r&&!l||i&&a&&s||!A&&s||!n)return 1;if(!i&&!o&&!l&&t=r)return s;var l=A[i];return s*(l=="desc"?-1:1)}}return t.index-e.index}var XH=ehA;function thA(t,e,A){e.length?e=k2(e,function(o){return co(o)?function(a){return pE(a,o.length===1?o[0]:o)}:o}):e=[l0];var i=-1;e=k2(e,L2(g0));var n=G8(t,function(o,a,r){var s=k2(e,function(l){return l(o)});return{criteria:s,index:++i,value:o}});return WH(n,function(o,a){return XH(o,a,A)})}var $H=thA;var ihA=N8(function(t,e,A){t[A?0:1].push(e)},function(){return[[],[]]}),T9=ihA;var nhA=Math.ceil,ohA=Math.max;function ahA(t,e,A,i){for(var n=-1,o=ohA(nhA((e-t)/(A||1)),0),a=Array(o);o--;)a[i?o:++n]=t,t+=A;return a}var Az=ahA;function rhA(t){return function(e,A,i){return i&&typeof i!="number"&&d4(e,A,i)&&(A=i=void 0),e=cE(e),A===void 0?(A=e,e=0):A=cE(A),i=i===void 0?e1&&d4(t,e[0],e[1])?e=[]:A>2&&d4(e[0],e[1],e[2])&&(e=[e[0]]),$H(t,MY(e,1),[])}),J9=lhA;var ghA=9007199254740991,O9=4294967295,chA=Math.min;function ChA(t,e){if(t=xO(t),t<1||t>ghA)return[];var A=O9,i=chA(t,O9);e=L8(e),t-=O9;for(var n=g8(i,e);++AArray.isArray(t),BhA=t=>t!==null&&typeof t=="object"&&!H2(t),EhA=t=>typeof t=="string",N1=(t,e)=>t===e?!0:t!==null&&e!==null&&typeof t=="object"&&typeof e=="object"&&Object.keys(t).length===Object.keys(e).length&&Object.entries(t).every(([A,i])=>N1(i,e[A])),tz=(t,e)=>{let A=t?.[e];if(A!==void 0){if(!Object.hasOwn(t,e)||Array.isArray(t)&&!/^\d+$/.test(e)||typeof t!="object")throw new TypeError(`Unsupported property "${e}"`);return A}};function za(t){return(...e)=>{let A=e.map(o=>Pa(o)),i=A[0],n=A[1];return A.length===1?o=>t(i(o)):A.length===2?o=>t(i(o),n(o)):o=>t(...A.map(a=>a(o)))}}var f4={boolean:0,number:1,string:2},iz=3,az=(t,e)=>typeof t==typeof e&&typeof t in f4?t>e:!1,hhA=(t,e)=>N1(t,e)||az(t,e),rz=(t,e)=>typeof t==typeof e&&typeof t in f4?tN1(t,e)||rz(t,e),u4={pipe:(...t)=>{let e=t.map(A=>Pa(A));return A=>e.reduce((i,n)=>n(i),A)},object:t=>{let e=Object.keys(t).map(A=>[A,Pa(t[A])]);return A=>{let i={};for(let[n,o]of e)i[n]=o(A);return i}},array:(...t)=>{let e=t.map(A=>Pa(A));return A=>e.map(i=>i(A))},get:(...t)=>{if(t.length===0)return e=>e??null;if(t.length===1){let e=t[0];return A=>tz(A,e)??null}return e=>{let A=e;for(let i of t)A=tz(A,i);return A??null}},map:t=>{let e=Pa(t);return A=>A.map(e)},mapObject:t=>{let e=Pa(t);return A=>{let i={};for(let n of Object.keys(A)){let o=e({key:n,value:A[n]});i[o.key]=o.value}return i}},mapKeys:t=>{let e=Pa(t);return A=>{let i={};for(let n of Object.keys(A)){let o=e(n);i[o]=A[n]}return i}},mapValues:t=>{let e=Pa(t);return A=>{let i={};for(let n of Object.keys(A))i[n]=e(A[n]);return i}},filter:t=>{let e=Pa(t);return A=>A.filter(i=>nz(e(i)))},sort:(t=["get"],e)=>{let A=Pa(t),i=e==="desc"?-1:1;function n(o,a){let r=A(o),s=A(a);if(typeof r!=typeof s){let l=f4[typeof r]??iz,g=f4[typeof s]??iz;return l>g?i:ls?i:ro.slice().sort(n)},reverse:()=>t=>t.toReversed(),pick:(...t)=>{let e=t.map(([i,...n])=>[n[n.length-1],u4.get(...n)]),A=(i,n)=>{let o={};for(let[a,r]of n)o[a]=r(i);return o};return i=>H2(i)?i.map(n=>A(n,e)):A(i,e)},groupBy:t=>{let e=Pa(t);return A=>{let i={};for(let n of A){let o=e(n);i[o]?i[o].push(n):i[o]=[n]}return i}},keyBy:t=>{let e=Pa(t);return A=>{let i={};for(let n of A){let o=e(n);o in i||(i[o]=n)}return i}},flatten:()=>t=>t.flat(),join:(t="")=>e=>e.join(t),split:za((t,e)=>e!==void 0?t.split(e):t.trim().split(/\s+/)),substring:za((t,e,A)=>t.slice(Math.max(e,0),A)),uniq:()=>t=>{let e=[];for(let A of t)e.findIndex(i=>N1(i,A))===-1&&e.push(A);return e},uniqBy:t=>e=>Object.values(u4.keyBy(t)(e)),limit:t=>e=>e.slice(0,Math.max(t,0)),size:()=>t=>t.length,keys:()=>Object.keys,values:()=>Object.values,prod:()=>t=>Q4(t,(e,A)=>e*A),sum:()=>t=>H2(t)?t.reduce((e,A)=>e+A,0):H9(),average:()=>t=>H2(t)?t.length>0?t.reduce((e,A)=>e+A)/t.length:null:H9(),min:()=>t=>Q4(t,(e,A)=>Math.min(e,A)),max:()=>t=>Q4(t,(e,A)=>Math.max(e,A)),and:za((...t)=>Q4(t,(e,A)=>!!(e&&A))),or:za((...t)=>Q4(t,(e,A)=>!!(e||A))),not:za(t=>!t),exists:t=>{let e=t.slice(1),A=e.pop(),i=u4.get(...e);return n=>{let o=i(n);return!!o&&Object.hasOwnProperty.call(o,A)}},if:(t,e,A)=>{let i=Pa(t),n=Pa(e),o=Pa(A);return a=>nz(i(a))?n(a):o(a)},in:(t,e)=>{let A=Pa(t),i=Pa(e);return n=>{let o=A(n);return i(n).findIndex(a=>N1(a,o))!==-1}},"not in":(t,e)=>{let A=u4.in(t,e);return i=>!A(i)},regex:(t,e,A)=>{let i=new RegExp(e,A),n=Pa(t);return o=>i.test(n(o))},match:(t,e,A)=>{let i=new RegExp(e,A),n=Pa(t);return o=>{let a=n(o).match(i);return a?oz(a):null}},matchAll:(t,e,A)=>{let i=new RegExp(e,`${A??""}g`),n=Pa(t);return o=>Array.from(n(o).matchAll(i)).map(oz)},eq:za(N1),gt:za(az),gte:za(hhA),lt:za(rz),lte:za(QhA),ne:za((t,e)=>!N1(t,e)),add:za((t,e)=>t+e),subtract:za((t,e)=>t-e),multiply:za((t,e)=>t*e),divide:za((t,e)=>t/e),mod:za((t,e)=>t%e),pow:za((t,e)=>t**e),abs:za(Math.abs),round:za((t,e=0)=>+`${Math.round(+`${t}e${e}`)}e${-e}`),number:za(t=>{let e=Number(t);return Number.isNaN(Number(t))?null:e}),string:za(String)},nz=t=>t!==null&&t!==0&&t!==!1,Q4=(t,e)=>(H2(t)||H9(),t.length===0?null:t.reduce(e)),oz=t=>{let[e,...A]=t,i=t.groups;return A.length?i?{value:e,groups:A,namedGroups:i}:{value:e,groups:A}:{value:e}},H9=()=>{z9("Array expected")},z9=t=>{throw new TypeError(t)},U8=[];function Pa(t,e){U8.unshift(gA(gA(gA({},u4),U8[0]),e?.functions));try{let A=H2(t)?uhA(t,U8[0]):BhA(t)?z9(`Function notation ["object", {...}] expected but got ${JSON.stringify(t)}`):()=>t;return i=>{try{return A(i)}catch(n){throw n.jsonquery=[{data:i,query:t},...n.jsonquery??[]],n}}}finally{U8.shift()}}function uhA(t,e){let[A,...i]=t,n=e[A];return n||z9(`Unknown function '${A}'`),n(...i)}var sz=[{pow:"^"},{multiply:"*",divide:"/",mod:"%"},{add:"+",subtract:"-"},{gt:">",gte:">=",lt:"<",lte:"<=",in:"in","not in":"not in"},{eq:"==",ne:"!="},{and:"and"},{or:"or"},{pipe:"|"}],fhA=["|","and","or"],lz=["|","and","or","*","/","%","+","-"];function gz(t,e){if(!H2(e))throw new Error("Invalid custom operators");return e.reduce(phA,t)}function phA(t,{name:e,op:A,at:i,after:n,before:o}){if(i)return t.map(s=>Object.values(s).includes(i)?Ye(gA({},s),{[e]:A}):s);let a=n??o,r=t.findIndex(s=>Object.values(s).includes(a));if(r!==-1)return t.toSpliced(r+(n?1:0),0,{[e]:A});throw new Error("Invalid custom operator")}var mhA=/^[a-zA-Z_$][a-zA-Z\d_$]*$/,whA=/^[a-zA-Z_$][a-zA-Z\d_$]*/,DhA=/^"(?:[^"\\]|\\.)*"/,yhA=/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/,vhA=/^(0|[1-9][0-9]*)/,bhA=/^(true|false|null)/,MhA=/^[ \n\t\r]+/;function P9(t,e){let A=e?.operators??[],i=gz(sz,A),n=Object.assign({},...i),o=fhA.concat(A.filter(Z=>Z.vararg).map(Z=>Z.op)),a=lz.concat(A.filter(Z=>Z.leftAssociative).map(Z=>Z.op)),r=(Z=i.length-1)=>{let tA=i[Z];if(!tA)return l();let W=t[z]==="(",BA=r(Z-1);for(;;){if(b(),t[z]==="."&&"pipe"in tA){let rA=g();BA=BA[0]==="pipe"?[...BA,rA]:["pipe",BA,rA];continue}let X=z,iA=s(tA);if(!iA)break;let AA=r(Z-1),IA=BA[0],aA=iA===IA&&!W;if(aA&&!a.includes(n[iA])){z=X;break}BA=aA&&o.includes(n[iA])?[...BA,AA]:[iA,BA,AA]}return BA},s=Z=>{let tA=Object.keys(Z).sort((W,BA)=>BA.length-W.length);for(let W of tA){let BA=Z[W];if(t.substring(z,z+BA.length)===BA)return z+=BA.length,b(),W}},l=()=>{if(b(),t[z]==="("){z++;let Z=r();return x(")"),Z}return g()},g=()=>{if(t[z]==="."){let Z=[];for(;t[z]===".";)z++,Z.push(h()??E()??m()??F("Property expected")),b();return["get",...Z]}return C()},C=()=>{let Z=z,tA=E();if(b(),!tA||t[z]!=="(")return z=Z,I();z++,b();let W=t[z]!==")"?[r()]:[];for(;z{if(t[z]==="{"){z++,b();let Z={},tA=!0;for(;z{if(t[z]==="["){z++,b();let Z=[],tA=!0;for(;zS(DhA,JSON.parse),E=()=>S(whA,Z=>Z),f=()=>S(yhA,JSON.parse),m=()=>S(vhA,JSON.parse),v=()=>{let Z=S(bhA,JSON.parse);if(Z!==void 0)return Z;F("Value expected")},k=()=>{b(),z{let W=t.substring(z).match(Z);if(W)return z+=W[0].length,tA(W[0])},b=()=>S(MhA,Z=>Z),x=Z=>{t[z]!==Z&&F(`Character '${Z}' expected`),z++},F=(Z,tA=z)=>{throw new SyntaxError(`${Z} (pos: ${tA})`)},z=0,P=r();return k(),P}var ShA=40,khA=" ",cz=(t,e)=>{let A=e?.indentation??khA,i=e?.operators??[],n=gz(sz,i),o=Object.assign({},...n),a=lz.concat(i.filter(d=>d.leftAssociative).map(d=>d.op)),r=(d,h,E=!1)=>H2(d)?s(d,h,E):JSON.stringify(d),s=(d,h,E)=>{let[f,...m]=d;if(f==="get"&&m.length>0)return g(m);if(f==="object")return l(m[0],h);if(f==="array"){let b=m.map(x=>r(x,h));return I(b,["[",", ","]"],[`[ -${h+A}`,`, -${h+A}`,` -${h}]`])}let v=o[f];if(v){let b=E?"(":"",x=E?")":"",F=m.map((z,P)=>{let Z=z?.[0],tA=n.findIndex(X=>f in X),W=n.findIndex(X=>Z in X),BA=tA0||f===Z&&!a.includes(v);return r(z,h+A,BA)});return I(F,[b,` ${v} `,x],[b,` -${h+A}${v} `,x])}let k=m.length===1?h:h+A,S=m.map(b=>r(b,k));return I(S,[`${f}(`,", ",")"],m.length===1?[`${f}(`,`, -${h}`,")"]:[`${f}( -${k}`,`, -${k}`,` -${h})`])},l=(d,h)=>{let E=h+A,f=Object.entries(d).map(([m,v])=>`${C(m)}: ${r(v,E)}`);return I(f,["{ ",", "," }"],[`{ -${E}`,`, -${E}`,` -${h}}`])},g=d=>d.map(h=>`.${C(h)}`).join(""),C=d=>mhA.test(d)?d:JSON.stringify(d),I=(d,[h,E,f],[m,v,k])=>h.length+d.reduce((S,b)=>S+b.length+E.length,0)-E.length+f.length<=(e?.maxLineLength??ShA)?h+d.join(E)+f:m+d.join(v)+k;return r(t,"")};function Cz(t,e,A){return Pa(EhA(e)?P9(e,A):e,A)(t)}var Iz={prefix:"far",iconName:"clock",icon:[512,512,[128339,"clock-four"],"f017","M464 256a208 208 0 1 1 -416 0 208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0 256 256 0 1 0 -512 0zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"]};var xhA={prefix:"far",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M384 32c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0zM64 80c-8.8 0-16 7.2-16 16l0 320c0 8.8 7.2 16 16 16l320 0c8.8 0 16-7.2 16-16l0-320c0-8.8-7.2-16-16-16L64 80zm230.7 89.9c7.8-10.7 22.8-13.1 33.5-5.3 10.7 7.8 13.1 22.8 5.3 33.5L211.4 366.1c-4.1 5.7-10.5 9.3-17.5 9.8-7 .5-13.9-2-18.8-6.9l-55.9-55.9c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l36 36 105.6-145.2z"]},j9=xhA;var dz={prefix:"far",iconName:"lightbulb",icon:[384,512,[128161],"f0eb","M296.5 291.1C321 265.2 336 230.4 336 192 336 112.5 271.5 48 192 48S48 112.5 48 192c0 38.4 15 73.2 39.5 99.1 21.3 22.4 44.9 54 53.3 92.9l102.4 0c8.4-39 32-70.5 53.3-92.9zm34.8 33C307.7 349 288 379.4 288 413.7l0 18.3c0 44.2-35.8 80-80 80l-32 0c-44.2 0-80-35.8-80-80l0-18.3C96 379.4 76.3 349 52.7 324.1 20 289.7 0 243.2 0 192 0 86 86 0 192 0S384 86 384 192c0 51.2-20 97.7-52.7 132.1zM144 184c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-48.6 39.4-88 88-88 13.3 0 24 10.7 24 24s-10.7 24-24 24c-22.1 0-40 17.9-40 40z"]};var q9={prefix:"far",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M384 80c8.8 0 16 7.2 16 16l0 320c0 8.8-7.2 16-16 16L64 432c-8.8 0-16-7.2-16-16L48 96c0-8.8 7.2-16 16-16l320 0zM64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32z"]};var Bz={prefix:"fas",iconName:"rotate",icon:[512,512,[128260,"sync-alt"],"f2f1","M480.1 192l7.9 0c13.3 0 24-10.7 24-24l0-144c0-9.7-5.8-18.5-14.8-22.2S477.9 .2 471 7L419.3 58.8C375 22.1 318 0 256 0 127 0 20.3 95.4 2.6 219.5 .1 237 12.2 253.2 29.7 255.7s33.7-9.7 36.2-27.1C79.2 135.5 159.3 64 256 64 300.4 64 341.2 79 373.7 104.3L327 151c-6.9 6.9-8.9 17.2-5.2 26.2S334.3 192 344 192l136.1 0zm29.4 100.5c2.5-17.5-9.7-33.7-27.1-36.2s-33.7 9.7-36.2 27.1c-13.3 93-93.4 164.5-190.1 164.5-44.4 0-85.2-15-117.7-40.3L185 361c6.9-6.9 8.9-17.2 5.2-26.2S177.7 320 168 320L24 320c-13.3 0-24 10.7-24 24L0 488c0 9.7 5.8 18.5 14.8 22.2S34.1 511.8 41 505l51.8-51.8C137 489.9 194 512 256 512 385 512 491.7 416.6 509.4 292.5z"]};var V9={prefix:"fas",iconName:"paste",icon:[512,512,["file-clipboard"],"f0ea","M64 0C28.7 0 0 28.7 0 64L0 384c0 35.3 28.7 64 64 64l112 0 0-224c0-61.9 50.1-112 112-112l64 0 0-48c0-35.3-28.7-64-64-64L64 0zM248 112l-144 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l144 0c13.3 0 24 10.7 24 24s-10.7 24-24 24zm40 48c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64l160 0c35.3 0 64-28.7 64-64l0-165.5c0-17-6.7-33.3-18.7-45.3l-58.5-58.5c-12-12-28.3-18.7-45.3-18.7L288 160z"]};var _hA={prefix:"fas",iconName:"crop-simple",icon:[512,512,["crop-alt"],"f565","M128 32c0-17.7-14.3-32-32-32S64 14.3 64 32l0 32-32 0C14.3 64 0 78.3 0 96s14.3 32 32 32l32 0 0 256c0 35.3 28.7 64 64 64l208 0 0-64-208 0 0-352zM384 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-32 32 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-32 0 0-256c0-35.3-28.7-64-64-64l-208 0 0 64 208 0 0 352z"]},Ez=_hA;var p4={prefix:"fas",iconName:"filter",icon:[512,512,[],"f0b0","M32 64C19.1 64 7.4 71.8 2.4 83.8S.2 109.5 9.4 118.6L192 301.3 192 416c0 8.5 3.4 16.6 9.4 22.6l64 64c9.2 9.2 22.9 11.9 34.9 6.9S320 492.9 320 480l0-178.7 182.6-182.6c9.2-9.2 11.9-22.9 6.9-34.9S492.9 64 480 64L32 64z"]};var RhA={prefix:"fas",iconName:"square-caret-down",icon:[448,512,["caret-square-down"],"f150","M384 480c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0zM224 352c-6.7 0-13-2.8-17.6-7.7l-104-112c-6.5-7-8.2-17.2-4.4-25.9S110.5 192 120 192l208 0c9.5 0 18.2 5.7 22 14.4s2.1 18.9-4.4 25.9l-104 112c-4.5 4.9-10.9 7.7-17.6 7.7z"]},hz=RhA;var kE={prefix:"fas",iconName:"caret-right",icon:[256,512,[],"f0da","M249.3 235.8c10.2 12.6 9.5 31.1-2.2 42.8l-128 128c-9.2 9.2-22.9 11.9-34.9 6.9S64.5 396.9 64.5 384l0-256c0-12.9 7.8-24.6 19.8-29.6s25.7-2.2 34.9 6.9l128 128 2.2 2.4z"]};var NhA={prefix:"fas",iconName:"magnifying-glass",icon:[512,512,[128269,"search"],"f002","M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376C296.3 401.1 253.9 416 208 416 93.1 416 0 322.9 0 208S93.1 0 208 0 416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"]},m4=NhA;var Qz={prefix:"fas",iconName:"eye",icon:[576,512,[128065],"f06e","M288 32c-80.8 0-145.5 36.8-192.6 80.6-46.8 43.5-78.1 95.4-93 131.1-3.3 7.9-3.3 16.7 0 24.6 14.9 35.7 46.2 87.7 93 131.1 47.1 43.7 111.8 80.6 192.6 80.6s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1 3.3-7.9 3.3-16.7 0-24.6-14.9-35.7-46.2-87.7-93-131.1-47.1-43.7-111.8-80.6-192.6-80.6zM144 256a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-64c0 35.3-28.7 64-64 64-11.5 0-22.3-3-31.7-8.4-1 10.9-.1 22.1 2.9 33.2 13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-12.2-45.7-55.5-74.8-101.1-70.8 5.3 9.3 8.4 20.1 8.4 31.7z"]},uz={prefix:"fas",iconName:"caret-left",icon:[256,512,[],"f0d9","M7.7 235.8c-10.3 12.6-9.5 31.1 2.2 42.8l128 128c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6l0-256c0-12.9-7.8-24.6-19.8-29.6s-25.7-2.2-34.9 6.9l-128 128-2.2 2.4z"]};var fz={prefix:"fas",iconName:"chevron-up",icon:[448,512,[],"f077","M201.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L224 173.3 54.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z"]};var pz={prefix:"fas",iconName:"circle-notch",icon:[512,512,[],"f1ce","M222.7 32.1c5 16.9-4.6 34.8-21.5 39.8-79.3 23.6-137.1 97.1-137.1 184.1 0 106 86 192 192 192s192-86 192-192c0-86.9-57.8-160.4-137.1-184.1-16.9-5-26.6-22.9-21.5-39.8s22.9-26.6 39.8-21.5C434.9 42.1 512 140 512 256 512 397.4 397.4 512 256 512S0 397.4 0 256c0-116 77.1-213.9 182.9-245.4 16.9-5 34.8 4.6 39.8 21.5z"]};var FhA={prefix:"fas",iconName:"ellipsis-vertical",icon:[128,512,["ellipsis-v"],"f142","M64 144a56 56 0 1 1 0-112 56 56 0 1 1 0 112zm0 224c30.9 0 56 25.1 56 56s-25.1 56-56 56-56-25.1-56-56 25.1-56 56-56zm56-112c0 30.9-25.1 56-56 56s-56-25.1-56-56 25.1-56 56-56 56 25.1 56 56z"]},W9=FhA;var LhA={prefix:"fas",iconName:"pen-to-square",icon:[512,512,["edit"],"f044","M471.6 21.7c-21.9-21.9-57.3-21.9-79.2 0L368 46.1 465.9 144 490.3 119.6c21.9-21.9 21.9-57.3 0-79.2L471.6 21.7zm-299.2 220c-6.1 6.1-10.8 13.6-13.5 21.9l-29.6 88.8c-2.9 8.6-.6 18.1 5.8 24.6s15.9 8.7 24.6 5.8l88.8-29.6c8.2-2.7 15.7-7.4 21.9-13.5L432 177.9 334.1 80 172.4 241.7zM96 64C43 64 0 107 0 160L0 416c0 53 43 96 96 96l256 0c53 0 96-43 96-96l0-96c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 96c0 17.7-14.3 32-32 32L96 448c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L96 64z"]},mz=LhA;var Z9={prefix:"fas",iconName:"clone",icon:[512,512,[],"f24d","M288 448l-224 0 0-224 48 0 0-64-48 0c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l224 0c35.3 0 64-28.7 64-64l0-48-64 0 0 48zm-64-96l224 0c35.3 0 64-28.7 64-64l0-224c0-35.3-28.7-64-64-64L224 0c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64z"]};var GhA={prefix:"fas",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M384 32c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0zM342 145.7c-10.7-7.8-25.7-5.4-33.5 5.3L189.1 315.2 137 263.1c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l72 72c5 5 11.9 7.5 18.8 7s13.4-4.1 17.5-9.8L347.3 179.2c7.8-10.7 5.4-25.7-5.3-33.5z"]},X9=GhA;var KhA={prefix:"fas",iconName:"square-caret-up",icon:[448,512,["caret-square-up"],"f151","M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zM224 160c6.7 0 13 2.8 17.6 7.7l104 112c6.5 7 8.2 17.2 4.4 25.9S337.5 320 328 320l-208 0c-9.5 0-18.2-5.7-22-14.4s-2.1-18.9 4.4-25.9l104-112c4.5-4.9 10.9-7.7 17.6-7.7z"]},wz=KhA;var w4={prefix:"fas",iconName:"code",icon:[576,512,[],"f121","M360.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6zm64.6 136.1c-12.5 12.5-12.5 32.8 0 45.3l73.4 73.4-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0zm-274.7 0c-12.5-12.5-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256 150.6 182.6c12.5-12.5 12.5-32.8 0-45.3z"]};var $9={prefix:"fas",iconName:"angle-right",icon:[256,512,[8250],"f105","M247.1 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L179.2 256 41.9 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"]};var UhA={prefix:"fas",iconName:"gear",icon:[512,512,[9881,"cog"],"f013","M195.1 9.5C198.1-5.3 211.2-16 226.4-16l59.8 0c15.2 0 28.3 10.7 31.3 25.5L332 79.5c14.1 6 27.3 13.7 39.3 22.8l67.8-22.5c14.4-4.8 30.2 1.2 37.8 14.4l29.9 51.8c7.6 13.2 4.9 29.8-6.5 39.9L447 233.3c.9 7.4 1.3 15 1.3 22.7s-.5 15.3-1.3 22.7l53.4 47.5c11.4 10.1 14 26.8 6.5 39.9l-29.9 51.8c-7.6 13.1-23.4 19.2-37.8 14.4l-67.8-22.5c-12.1 9.1-25.3 16.7-39.3 22.8l-14.4 69.9c-3.1 14.9-16.2 25.5-31.3 25.5l-59.8 0c-15.2 0-28.3-10.7-31.3-25.5l-14.4-69.9c-14.1-6-27.2-13.7-39.3-22.8L73.5 432.3c-14.4 4.8-30.2-1.2-37.8-14.4L5.8 366.1c-7.6-13.2-4.9-29.8 6.5-39.9l53.4-47.5c-.9-7.4-1.3-15-1.3-22.7s.5-15.3 1.3-22.7L12.3 185.8c-11.4-10.1-14-26.8-6.5-39.9L35.7 94.1c7.6-13.2 23.4-19.2 37.8-14.4l67.8 22.5c12.1-9.1 25.3-16.7 39.3-22.8L195.1 9.5zM256.3 336a80 80 0 1 0 -.6-160 80 80 0 1 0 .6 160z"]},Dz=UhA;var yz={prefix:"fas",iconName:"up-right-and-down-left-from-center",icon:[512,512,["expand-alt"],"f424","M344 0L488 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S334.3 0 344 0zM168 512L24 512c-13.3 0-24-10.7-24-24L0 344c0-9.7 5.8-18.5 14.8-22.2S34.1 320.2 41 327l39 39 87-87c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S177.7 512 168 512z"]};var CC={prefix:"fas",iconName:"wrench",icon:[576,512,[128295],"f0ad","M509.4 98.6c7.6-7.6 20.3-5.7 24.1 4.3 6.8 17.7 10.5 37 10.5 57.1 0 88.4-71.6 160-160 160-17.5 0-34.4-2.8-50.2-8L146.9 498.9c-28.1 28.1-73.7 28.1-101.8 0s-28.1-73.7 0-101.8L232 210.2c-5.2-15.8-8-32.6-8-50.2 0-88.4 71.6-160 160-160 20.1 0 39.4 3.7 57.1 10.5 10 3.8 11.8 16.5 4.3 24.1l-88.7 88.7c-3 3-4.7 7.1-4.7 11.3l0 41.4c0 8.8 7.2 16 16 16l41.4 0c4.2 0 8.3-1.7 11.3-4.7l88.7-88.7z"]},T8={prefix:"fas",iconName:"trash-can",icon:[448,512,[61460,"trash-alt"],"f2ed","M136.7 5.9C141.1-7.2 153.3-16 167.1-16l113.9 0c13.8 0 26 8.8 30.4 21.9L320 32 416 32c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 96C14.3 96 0 81.7 0 64S14.3 32 32 32l96 0 8.7-26.1zM32 144l384 0 0 304c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-304zm88 64c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24z"]};var J8={prefix:"fas",iconName:"check",icon:[448,512,[10003,10004],"f00c","M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z"]};var vz={prefix:"fas",iconName:"xmark",icon:[384,512,[128473,10005,10006,10060,215,"close","multiply","remove","times"],"f00d","M55.1 73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L147.2 256 9.9 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192.5 301.3 329.9 438.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.8 256 375.1 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192.5 210.7 55.1 73.4z"]},bz=vz;var D4=vz;var F1={prefix:"fas",iconName:"pen",icon:[512,512,[128394],"f304","M352.9 21.2L308 66.1 445.9 204 490.8 159.1C504.4 145.6 512 127.2 512 108s-7.6-37.6-21.2-51.1L455.1 21.2C441.6 7.6 423.2 0 404 0s-37.6 7.6-51.1 21.2zM274.1 100L58.9 315.1c-10.7 10.7-18.5 24.1-22.6 38.7L.9 481.6c-2.3 8.3 0 17.3 6.2 23.4s15.1 8.5 23.4 6.2l127.8-35.5c14.6-4.1 27.9-11.8 38.7-22.6L412 237.9 274.1 100z"]};var Mz={prefix:"fas",iconName:"chevron-down",icon:[448,512,[],"f078","M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"]};var Sz={prefix:"fas",iconName:"angle-down",icon:[384,512,[8964],"f107","M169.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 306.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var ThA={prefix:"fas",iconName:"arrow-down-short-wide",icon:[576,512,["sort-amount-desc","sort-amount-down-alt"],"f884","M246.6 374.6l-96 96c-12.5 12.5-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L96 370.7 96 64c0-17.7 14.3-32 32-32s32 14.3 32 32l0 306.7 41.4-41.4c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3zM320 32l32 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l96 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-96 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l224 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-224 0c-17.7 0-32-14.3-32-32s14.3-32 32-32z"]};var y4=ThA;var JhA={prefix:"fas",iconName:"triangle-exclamation",icon:[512,512,[9888,"exclamation-triangle","warning"],"f071","M256 0c14.7 0 28.2 8.1 35.2 21l216 400c6.7 12.4 6.4 27.4-.8 39.5S486.1 480 472 480L40 480c-14.1 0-27.2-7.4-34.4-19.5s-7.5-27.1-.8-39.5l216-400c7-12.9 20.5-21 35.2-21zm0 352a32 32 0 1 0 0 64 32 32 0 1 0 0-64zm0-192c-18.2 0-32.7 15.5-31.4 33.7l7.4 104c.9 12.5 11.4 22.3 23.9 22.3 12.6 0 23-9.7 23.9-22.3l7.4-104c1.3-18.2-13.1-33.7-31.4-33.7z"]},z2=JhA;var OhA={prefix:"fas",iconName:"scissors",icon:[512,512,[9984,9986,9988,"cut"],"f0c4","M192 256l-39.5 39.5c-12.6-4.9-26.2-7.5-40.5-7.5-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112c0-14.3-2.7-27.9-7.5-40.5L499.2 76.8c7.1-7.1 7.1-18.5 0-25.6-28.3-28.3-74.1-28.3-102.4 0L256 192 216.5 152.5c4.9-12.6 7.5-26.2 7.5-40.5 0-61.9-50.1-112-112-112S0 50.1 0 112 50.1 224 112 224c14.3 0 27.9-2.7 40.5-7.5L192 256zm97.9 97.9L396.8 460.8c28.3 28.3 74.1 28.3 102.4 0 7.1-7.1 7.1-18.5 0-25.6l-145.3-145.3-64 64zM64 112a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm48 240a48 48 0 1 1 0 96 48 48 0 1 1 0-96z"]},L1=OhA;var v4={prefix:"fas",iconName:"arrow-right-arrow-left",icon:[512,512,[8644,"exchange"],"f0ec","M502.6 150.6l-96 96c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L402.7 160 32 160c-17.7 0-32-14.3-32-32S14.3 96 32 96l370.7 0-41.4-41.4c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l96 96c12.5 12.5 12.5 32.8 0 45.3zm-397.3 352l-96-96c-12.5-12.5-12.5-32.8 0-45.3l96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3L109.3 352 480 352c17.7 0 32 14.3 32 32s-14.3 32-32 32l-370.7 0 41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0z"]};var AS={prefix:"fas",iconName:"caret-up",icon:[320,512,[],"f0d8","M140.3 135.2c12.6-10.3 31.1-9.5 42.8 2.2l128 128c9.2 9.2 11.9 22.9 6.9 34.9S301.4 320 288.5 320l-256 0c-12.9 0-24.6-7.8-29.6-19.8S.7 274.5 9.9 265.4l128-128 2.4-2.2z"]};var kz={prefix:"fas",iconName:"down-left-and-up-right-to-center",icon:[512,512,["compress-alt"],"f422","M439.5 7c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S450.2 240 440.5 240l-144 0c-13.3 0-24-10.7-24-24l0-144c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39 87-87zM72.5 272l144 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S62.8 272 72.5 272z"]};var G1={prefix:"fas",iconName:"plus",icon:[448,512,[10133,61543,"add"],"2b","M256 64c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 160-160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l160 0 0 160c0 17.7 14.3 32 32 32s32-14.3 32-32l0-160 160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-160 0 0-160z"]};var IC={prefix:"fas",iconName:"copy",icon:[448,512,[],"f0c5","M192 0c-35.3 0-64 28.7-64 64l0 256c0 35.3 28.7 64 64 64l192 0c35.3 0 64-28.7 64-64l0-200.6c0-17.4-7.1-34.1-19.7-46.2L370.6 17.8C358.7 6.4 342.8 0 326.3 0L192 0zM64 128c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l192 0c35.3 0 64-28.7 64-64l0-16-64 0 0 16-192 0 0-256 16 0 0-64-16 0z"]};var YhA={prefix:"fas",iconName:"arrow-rotate-right",icon:[512,512,[8635,"arrow-right-rotate","arrow-rotate-forward","redo"],"f01e","M436.7 74.7L448 85.4 448 32c0-17.7 14.3-32 32-32s32 14.3 32 32l0 128c0 17.7-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l47.9 0-7.6-7.2c-.2-.2-.4-.4-.6-.6-75-75-196.5-75-271.5 0s-75 196.5 0 271.5 196.5 75 271.5 0c8.2-8.2 15.5-16.9 21.9-26.1 10.1-14.5 30.1-18 44.6-7.9s18 30.1 7.9 44.6c-8.5 12.2-18.2 23.8-29.1 34.7-100 100-262.1 100-362 0S-25 175 75 75c99.9-99.9 261.7-100 361.7-.3z"]};var O8=YhA;var c0={prefix:"fas",iconName:"caret-down",icon:[320,512,[],"f0d7","M140.3 376.8c12.6 10.2 31.1 9.5 42.8-2.2l128-128c9.2-9.2 11.9-22.9 6.9-34.9S301.4 192 288.5 192l-256 0c-12.9 0-24.6 7.8-29.6 19.8S.7 237.5 9.9 246.6l128 128 2.4 2.2z"]};var HhA={prefix:"fas",iconName:"arrow-rotate-left",icon:[512,512,[8634,"arrow-left-rotate","arrow-rotate-back","arrow-rotate-backward","undo"],"f0e2","M256 64c-56.8 0-107.9 24.7-143.1 64l47.1 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 192c-17.7 0-32-14.3-32-32L0 32C0 14.3 14.3 0 32 0S64 14.3 64 32l0 54.7C110.9 33.6 179.5 0 256 0 397.4 0 512 114.6 512 256S397.4 512 256 512c-87 0-163.9-43.4-210.1-109.7-10.1-14.5-6.6-34.4 7.9-44.6s34.4-6.6 44.6 7.9c34.8 49.8 92.4 82.3 157.6 82.3 106 0 192-86 192-192S362 64 256 64z"]};var Y8=HhA;var eS={prefix:"fas",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M64 32l320 0c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32z"]};var tS={prefix:"fas",iconName:"arrow-down",icon:[384,512,[8595],"f063","M169.4 502.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 402.7 224 32c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 370.7-105.4-105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var YZ=K3(Rz(),1);var Nz=Number.isNaN||function(e){return typeof e=="number"&&e!==e};function zhA(t,e){return!!(t===e||Nz(t)&&Nz(e))}function PhA(t,e){if(t.length!==e.length)return!1;for(var A=0;A{if(typeof n!="object"||!n.name||!n.init)throw new Error("Invalid JSEP plugin format");this.registered[n.name]||(n.init(this.jsep),this.registered[n.name]=n)})}},ol=class t{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+t.version}static addUnaryOp(e){return t.max_unop_len=Math.max(e.length,t.max_unop_len),t.unary_ops[e]=1,t}static addBinaryOp(e,A,i){return t.max_binop_len=Math.max(e.length,t.max_binop_len),t.binary_ops[e]=A,i?t.right_associative.add(e):t.right_associative.delete(e),t}static addIdentifierChar(e){return t.additional_identifier_chars.add(e),t}static addLiteral(e,A){return t.literals[e]=A,t}static removeUnaryOp(e){return delete t.unary_ops[e],e.length===t.max_unop_len&&(t.max_unop_len=t.getMaxKeyLen(t.unary_ops)),t}static removeAllUnaryOps(){return t.unary_ops={},t.max_unop_len=0,t}static removeIdentifierChar(e){return t.additional_identifier_chars.delete(e),t}static removeBinaryOp(e){return delete t.binary_ops[e],e.length===t.max_binop_len&&(t.max_binop_len=t.getMaxKeyLen(t.binary_ops)),t.right_associative.delete(e),t}static removeAllBinaryOps(){return t.binary_ops={},t.max_binop_len=0,t}static removeLiteral(e){return delete t.literals[e],t}static removeAllLiterals(){return t.literals={},t}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(e){this.expr=e,this.index=0}static parse(e){return new t(e).parse()}static getMaxKeyLen(e){return Math.max(0,...Object.keys(e).map(A=>A.length))}static isDecimalDigit(e){return e>=48&&e<=57}static binaryPrecedence(e){return t.binary_ops[e]||0}static isIdentifierStart(e){return e>=65&&e<=90||e>=97&&e<=122||e>=128&&!t.binary_ops[String.fromCharCode(e)]||t.additional_identifier_chars.has(String.fromCharCode(e))}static isIdentifierPart(e){return t.isIdentifierStart(e)||t.isDecimalDigit(e)}throwError(e){let A=new Error(e+" at character "+this.index);throw A.index=this.index,A.description=e,A}runHook(e,A){if(t.hooks[e]){let i={context:this,node:A};return t.hooks.run(e,i),i.node}return A}searchHook(e){if(t.hooks[e]){let A={context:this};return t.hooks[e].find(function(i){return i.call(A.context,A),A.node}),A.node}}gobbleSpaces(){let e=this.code;for(;e===t.SPACE_CODE||e===t.TAB_CODE||e===t.LF_CODE||e===t.CR_CODE;)e=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");let e=this.gobbleExpressions(),A=e.length===1?e[0]:{type:t.COMPOUND,body:e};return this.runHook("after-all",A)}gobbleExpressions(e){let A=[],i,n;for(;this.index0;){if(t.binary_ops.hasOwnProperty(e)&&(!t.isIdentifierStart(this.code)||this.index+e.lengtho.right_a&&C.right_a?i>C.prec:i<=C.prec;for(;n.length>2&&g(n[n.length-2]);)r=n.pop(),A=n.pop().value,a=n.pop(),e={type:t.BINARY_EXP,operator:A,left:a,right:r},n.push(e);e=this.gobbleToken(),e||this.throwError("Expected expression after "+l),n.push(o,e)}for(s=n.length-1,e=n[s];s>1;)e={type:t.BINARY_EXP,operator:n[s-1].value,left:n[s-2],right:e},s-=2;return e}gobbleToken(){let e,A,i,n;if(this.gobbleSpaces(),n=this.searchHook("gobble-token"),n)return this.runHook("after-token",n);if(e=this.code,t.isDecimalDigit(e)||e===t.PERIOD_CODE)return this.gobbleNumericLiteral();if(e===t.SQUOTE_CODE||e===t.DQUOTE_CODE)n=this.gobbleStringLiteral();else if(e===t.OBRACK_CODE)n=this.gobbleArray();else{for(A=this.expr.substr(this.index,t.max_unop_len),i=A.length;i>0;){if(t.unary_ops.hasOwnProperty(A)&&(!t.isIdentifierStart(this.code)||this.index+A.length=A.length&&this.throwError("Unexpected token "+String.fromCharCode(e));break}else if(o===t.COMMA_CODE){if(this.index++,n++,n!==A.length){if(e===t.CPAREN_CODE)this.throwError("Unexpected token ,");else if(e===t.CBRACK_CODE)for(let a=A.length;a":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"});ol.max_unop_len=ol.getMaxKeyLen(ol.unary_ops);ol.max_binop_len=ol.getMaxKeyLen(ol.binary_ops);var C0=t=>new ol(t).parse(),qhA=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(ol).filter(t=>!qhA.includes(t)&&C0[t]===void 0).forEach(t=>{C0[t]=ol[t]});C0.Jsep=ol;var VhA="ConditionalExpression",WhA={name:"ternary",init(t){t.hooks.add("after-expression",function(A){if(A.node&&this.code===t.QUMARK_CODE){this.index++;let i=A.node,n=this.gobbleExpression();if(n||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===t.COLON_CODE){this.index++;let o=this.gobbleExpression();if(o||this.throwError("Expected expression"),A.node={type:VhA,test:i,consequent:n,alternate:o},i.operator&&t.binary_ops[i.operator]<=.9){let a=i;for(;a.right.operator&&t.binary_ops[a.right.operator]<=.9;)a=a.right;A.node.test=a.right,a.right=A.node,A.node=i}}else this.throwError("Expected :")}})}};C0.plugins.register(WhA);var Lz=47,ZhA=92,XhA={name:"regex",init(t){t.hooks.add("gobble-token",function(A){if(this.code===Lz){let i=++this.index,n=!1;for(;this.index=97&&s<=122||s>=65&&s<=90||s>=48&&s<=57)a+=this.char;else break}let r;try{r=new RegExp(o,a)}catch(s){this.throwError(s.message)}return A.node={type:t.LITERAL,value:r,raw:this.expr.slice(i-1,this.index)},A.node=this.gobbleTokenProperty(A.node),A.node}this.code===t.OBRACK_CODE?n=!0:n&&this.code===t.CBRACK_CODE&&(n=!1),this.index+=this.code===ZhA?2:1}this.throwError("Unclosed Regex")}})}},iS=43,$hA=45,_E={name:"assignment",assignmentOperators:new Set(["=","*=","**=","/=","%=","+=","-=","<<=",">>=",">>>=","&=","^=","|=","||=","&&=","??="]),updateOperators:[iS,$hA],assignmentPrecedence:.9,init(t){let e=[t.IDENTIFIER,t.MEMBER_EXP];_E.assignmentOperators.forEach(i=>t.addBinaryOp(i,_E.assignmentPrecedence,!0)),t.hooks.add("gobble-token",function(n){let o=this.code;_E.updateOperators.some(a=>a===o&&a===this.expr.charCodeAt(this.index+1))&&(this.index+=2,n.node={type:"UpdateExpression",operator:o===iS?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},(!n.node.argument||!e.includes(n.node.argument.type))&&this.throwError(`Unexpected ${n.node.operator}`))}),t.hooks.add("after-token",function(n){if(n.node){let o=this.code;_E.updateOperators.some(a=>a===o&&a===this.expr.charCodeAt(this.index+1))&&(e.includes(n.node.type)||this.throwError(`Unexpected ${n.node.operator}`),this.index+=2,n.node={type:"UpdateExpression",operator:o===iS?"++":"--",argument:n.node,prefix:!1})}}),t.hooks.add("after-expression",function(n){n.node&&A(n.node)});function A(i){_E.assignmentOperators.has(i.operator)?(i.type="AssignmentExpression",A(i.left),A(i.right)):i.operator||Object.values(i).forEach(n=>{n&&typeof n=="object"&&A(n)})}}};C0.plugins.register(XhA,_E);C0.addUnaryOp("typeof");C0.addUnaryOp("void");C0.addLiteral("null",null);C0.addLiteral("undefined",void 0);var AQA=new Set(["constructor","__proto__","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"]),xo={evalAst(t,e){switch(t.type){case"BinaryExpression":case"LogicalExpression":return xo.evalBinaryExpression(t,e);case"Compound":return xo.evalCompound(t,e);case"ConditionalExpression":return xo.evalConditionalExpression(t,e);case"Identifier":return xo.evalIdentifier(t,e);case"Literal":return xo.evalLiteral(t,e);case"MemberExpression":return xo.evalMemberExpression(t,e);case"UnaryExpression":return xo.evalUnaryExpression(t,e);case"ArrayExpression":return xo.evalArrayExpression(t,e);case"CallExpression":return xo.evalCallExpression(t,e);case"AssignmentExpression":return xo.evalAssignmentExpression(t,e);default:throw SyntaxError("Unexpected expression",t)}},evalBinaryExpression(t,e){return{"||":(i,n)=>i||n(),"&&":(i,n)=>i&&n(),"|":(i,n)=>i|n(),"^":(i,n)=>i^n(),"&":(i,n)=>i&n(),"==":(i,n)=>i==n(),"!=":(i,n)=>i!=n(),"===":(i,n)=>i===n(),"!==":(i,n)=>i!==n(),"<":(i,n)=>i":(i,n)=>i>n(),"<=":(i,n)=>i<=n(),">=":(i,n)=>i>=n(),"<<":(i,n)=>i<>":(i,n)=>i>>n(),">>>":(i,n)=>i>>>n(),"+":(i,n)=>i+n(),"-":(i,n)=>i-n(),"*":(i,n)=>i*n(),"/":(i,n)=>i/n(),"%":(i,n)=>i%n()}[t.operator](xo.evalAst(t.left,e),()=>xo.evalAst(t.right,e))},evalCompound(t,e){let A;for(let i=0;i-xo.evalAst(i,e),"!":i=>!xo.evalAst(i,e),"~":i=>~xo.evalAst(i,e),"+":i=>+xo.evalAst(i,e),typeof:i=>typeof xo.evalAst(i,e),void:i=>{xo.evalAst(i,e)}}[t.operator](t.argument)},evalArrayExpression(t,e){return t.elements.map(A=>xo.evalAst(A,e))},evalCallExpression(t,e){let A=t.arguments.map(n=>xo.evalAst(n,e)),i=xo.evalAst(t.callee,e);if(i===Function)throw new Error("Function constructor is disabled");return i(...A)},evalAssignmentExpression(t,e){if(t.left.type!=="Identifier")throw SyntaxError("Invalid left-hand side in assignment");let A=t.left.name,i=xo.evalAst(t.right,e);return e[A]=i,e[A]}},aS=class{constructor(e){this.code=e,this.ast=C0(this.code)}runInNewContext(e){let A=Object.assign(Object.create(null),e);return xo.evalAst(this.ast,A)}};function P2(t,e){return t=t.slice(),t.push(e),t}function rS(t,e){return e=e.slice(),e.unshift(t),e}var sS=class extends Error{constructor(e){super('JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)'),this.avoidNew=!0,this.value=e,this.name="NewError"}};function to(t,e,A,i,n){if(!(this instanceof to))try{return new to(t,e,A,i,n)}catch(a){if(!a.avoidNew)throw a;return a.value}typeof t=="string"&&(n=i,i=A,A=e,e=t,t=null);let o=t&&typeof t=="object";if(t=t||{},this.json=t.json||A,this.path=t.path||e,this.resultType=t.resultType||"value",this.flatten=t.flatten||!1,this.wrap=Object.hasOwn(t,"wrap")?t.wrap:!0,this.sandbox=t.sandbox||{},this.eval=t.eval===void 0?"safe":t.eval,this.ignoreEvalErrors=typeof t.ignoreEvalErrors>"u"?!1:t.ignoreEvalErrors,this.parent=t.parent||null,this.parentProperty=t.parentProperty||null,this.callback=t.callback||i||null,this.otherTypeCallback=t.otherTypeCallback||n||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},t.autostart!==!1){let a={path:o?t.path:e};o?"json"in t&&(a.json=t.json):a.json=A;let r=this.evaluate(a);if(!r||typeof r!="object")throw new sS(r);return r}}to.prototype.evaluate=function(t,e,A,i){let n=this.parent,o=this.parentProperty,{flatten:a,wrap:r}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,A=A||this.callback,this.currOtherTypeCallback=i||this.otherTypeCallback,e=e||this.json,t=t||this.path,t&&typeof t=="object"&&!Array.isArray(t)){if(!t.path&&t.path!=="")throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(t,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');({json:e}=t),a=Object.hasOwn(t,"flatten")?t.flatten:a,this.currResultType=Object.hasOwn(t,"resultType")?t.resultType:this.currResultType,this.currSandbox=Object.hasOwn(t,"sandbox")?t.sandbox:this.currSandbox,r=Object.hasOwn(t,"wrap")?t.wrap:r,this.currEval=Object.hasOwn(t,"eval")?t.eval:this.currEval,A=Object.hasOwn(t,"callback")?t.callback:A,this.currOtherTypeCallback=Object.hasOwn(t,"otherTypeCallback")?t.otherTypeCallback:this.currOtherTypeCallback,n=Object.hasOwn(t,"parent")?t.parent:n,o=Object.hasOwn(t,"parentProperty")?t.parentProperty:o,t=t.path}if(n=n||null,o=o||null,Array.isArray(t)&&(t=to.toPathString(t)),!t&&t!==""||!e)return;let s=to.toPathArray(t);s[0]==="$"&&s.length>1&&s.shift(),this._hasParentSelector=null;let l=this._trace(s,e,["$"],n,o,A).filter(function(g){return g&&!g.isParentSelector});return l.length?!r&&l.length===1&&!l[0].hasArrExpr?this._getPreferredOutput(l[0]):l.reduce((g,C)=>{let I=this._getPreferredOutput(C);return a&&Array.isArray(I)?g=g.concat(I):g.push(I),g},[]):r?[]:void 0};to.prototype._getPreferredOutput=function(t){let e=this.currResultType;switch(e){case"all":{let A=Array.isArray(t.path)?t.path:to.toPathArray(t.path);return t.pointer=to.toPointer(A),t.path=typeof t.path=="string"?t.path:to.toPathString(t.path),t}case"value":case"parent":case"parentProperty":return t[e];case"path":return to.toPathString(t[e]);case"pointer":return to.toPointer(t.path);default:throw new TypeError("Unknown result type")}};to.prototype._handleCallback=function(t,e,A){if(e){let i=this._getPreferredOutput(t);t.path=typeof t.path=="string"?t.path:to.toPathString(t.path),e(i,A,t)}};to.prototype._trace=function(t,e,A,i,n,o,a,r){let s;if(!t.length)return s={path:A,value:e,parent:i,parentProperty:n,hasArrExpr:a},this._handleCallback(s,o,"value"),s;let l=t[0],g=t.slice(1),C=[];function I(d){Array.isArray(d)?d.forEach(h=>{C.push(h)}):C.push(d)}if((typeof l!="string"||r)&&e&&Object.hasOwn(e,l))I(this._trace(g,e[l],P2(A,l),e,l,o,a));else if(l==="*")this._walk(e,d=>{I(this._trace(g,e[d],P2(A,d),e,d,o,!0,!0))});else if(l==="..")I(this._trace(g,e,A,i,n,o,a)),this._walk(e,d=>{typeof e[d]=="object"&&I(this._trace(t.slice(),e[d],P2(A,d),e,d,o,!0))});else{if(l==="^")return this._hasParentSelector=!0,{path:A.slice(0,-1),expr:g,isParentSelector:!0};if(l==="~")return s={path:P2(A,l),value:n,parent:i,parentProperty:null},this._handleCallback(s,o,"property"),s;if(l==="$")I(this._trace(g,e,A,null,null,o,a));else if(/^(-?\d*):(-?\d*):?(\d*)$/u.test(l))I(this._slice(l,g,e,A,i,n,o));else if(l.indexOf("?(")===0){if(this.currEval===!1)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");let d=l.replace(/^\?\((.*?)\)$/u,"$1"),h=/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(d);h?this._walk(e,E=>{let f=[h[2]],m=h[1]?e[E][h[1]]:e[E];this._trace(f,m,A,i,n,o,!0).length>0&&I(this._trace(g,e[E],P2(A,E),e,E,o,!0))}):this._walk(e,E=>{this._eval(d,e[E],E,A,i,n)&&I(this._trace(g,e[E],P2(A,E),e,E,o,!0))})}else if(l[0]==="("){if(this.currEval===!1)throw new Error("Eval [(expr)] prevented in JSONPath expression.");I(this._trace(rS(this._eval(l,e,A.at(-1),A.slice(0,-1),i,n),g),e,A,i,n,o,a))}else if(l[0]==="@"){let d=!1,h=l.slice(1,-2);switch(h){case"scalar":(!e||!["object","function"].includes(typeof e))&&(d=!0);break;case"boolean":case"string":case"undefined":case"function":typeof e===h&&(d=!0);break;case"integer":Number.isFinite(e)&&!(e%1)&&(d=!0);break;case"number":Number.isFinite(e)&&(d=!0);break;case"nonFinite":typeof e=="number"&&!Number.isFinite(e)&&(d=!0);break;case"object":e&&typeof e===h&&(d=!0);break;case"array":Array.isArray(e)&&(d=!0);break;case"other":d=this.currOtherTypeCallback(e,A,i,n);break;case"null":e===null&&(d=!0);break;default:throw new TypeError("Unknown value type "+h)}if(d)return s={path:A,value:e,parent:i,parentProperty:n},this._handleCallback(s,o,"value"),s}else if(l[0]==="`"&&e&&Object.hasOwn(e,l.slice(1))){let d=l.slice(1);I(this._trace(g,e[d],P2(A,d),e,d,o,a,!0))}else if(l.includes(",")){let d=l.split(",");for(let h of d)I(this._trace(rS(h,g),e,A,i,n,o,!0))}else!r&&e&&Object.hasOwn(e,l)&&I(this._trace(g,e[l],P2(A,l),e,l,o,a,!0))}if(this._hasParentSelector)for(let d=0;d{e(A)})};to.prototype._slice=function(t,e,A,i,n,o,a){if(!Array.isArray(A))return;let r=A.length,s=t.split(":"),l=s[2]&&Number.parseInt(s[2])||1,g=s[0]&&Number.parseInt(s[0])||0,C=s[1]&&Number.parseInt(s[1])||r;g=g<0?Math.max(0,g+r):Math.min(r,g),C=C<0?Math.max(0,C+r):Math.min(r,C);let I=[];for(let d=g;d{I.push(E)});return I};to.prototype._eval=function(t,e,A,i,n,o){this.currSandbox._$_parentProperty=o,this.currSandbox._$_parent=n,this.currSandbox._$_property=A,this.currSandbox._$_root=this.json,this.currSandbox._$_v=e;let a=t.includes("@path");a&&(this.currSandbox._$_path=to.toPathString(i.concat([A])));let r=this.currEval+"Script:"+t;if(!to.cache[r]){let s=t.replaceAll("@parentProperty","_$_parentProperty").replaceAll("@parent","_$_parent").replaceAll("@property","_$_property").replaceAll("@root","_$_root").replaceAll(/@([.\s)[])/gu,"_$_v$1");if(a&&(s=s.replaceAll("@path","_$_path")),this.currEval==="safe"||this.currEval===!0||this.currEval===void 0)to.cache[r]=new this.safeVm.Script(s);else if(this.currEval==="native")to.cache[r]=new this.vm.Script(s);else if(typeof this.currEval=="function"&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,"runInNewContext")){let l=this.currEval;to.cache[r]=new l(s)}else if(typeof this.currEval=="function")to.cache[r]={runInNewContext:l=>this.currEval(s,l)};else throw new TypeError(`Unknown "eval" property "${this.currEval}"`)}try{return to.cache[r].runInNewContext(this.currSandbox)}catch(s){if(this.ignoreEvalErrors)return!1;throw new Error("jsonPath: "+s.message+": "+t)}};to.cache={};to.toPathString=function(t){let e=t,A=e.length,i="$";for(let n=1;ntypeof e[l]=="function");let o=i.map(l=>e[l]);A=n.reduce((l,g)=>{let C=e[g].toString();return/function/u.test(C)||(C="function "+C),"var "+g+"="+C+";"+l},"")+A,!/(['"])use strict\1/u.test(A)&&!i.includes("arguments")&&(A="var arguments = undefined;"+A),A=A.replace(/;\s*$/u,"");let r=A.lastIndexOf(";"),s=r!==-1?A.slice(0,r+1)+" return "+A.slice(r+1):" return "+A;return new Function(...i,s)(...o)}};to.prototype.vm={Script:lS};var cS=[],Tz=[];(()=>{let t="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,A=0;e>1;if(t=Tz[i])e=i+1;else return!0;if(e==A)return!1}}function Gz(t){return t>=127462&&t<=127487}var Kz=8205;function Jz(t,e,A=!0,i=!0){return(A?Oz:iQA)(t,e,i)}function Oz(t,e,A){if(e==t.length)return e;e&&Yz(t.charCodeAt(e))&&Hz(t.charCodeAt(e-1))&&e--;let i=gS(t,e);for(e+=Uz(i);e=0&&Gz(gS(t,a));)o++,a-=2;if(o%2==0)break;e+=2}else break}return e}function iQA(t,e,A){for(;e>0;){let i=Oz(t,e-2,A);if(i=56320&&t<57344}function Hz(t){return t>=55296&&t<56320}function Uz(t){return t<65536?1:2}var bn=class t{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,A,i){[e,A]=GE(this,e,A);let n=[];return this.decompose(0,e,n,2),i.length&&i.decompose(0,i.length,n,3),this.decompose(A,this.length,n,1),NE.from(n,this.length-(A-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,A=this.length){[e,A]=GE(this,e,A);let i=[];return this.decompose(e,A,i,0),NE.from(i,A-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let A=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),n=new T1(this),o=new T1(e);for(let a=A,r=A;;){if(n.next(a),o.next(a),a=0,n.lineBreak!=o.lineBreak||n.done!=o.done||n.value!=o.value)return!1;if(r+=n.value.length,n.done||r>=i)return!0}}iter(e=1){return new T1(this,e)}iterRange(e,A=this.length){return new V8(this,e,A)}iterLines(e,A){let i;if(e==null)i=this.iter();else{A==null&&(A=this.lines+1);let n=this.line(e).from;i=this.iterRange(n,Math.max(n,A==this.lines+1?this.length:A<=1?0:this.line(A-1).to))}return new W8(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?t.empty:e.length<=32?new xl(e):NE.from(xl.split(e,[]))}},xl=class t extends bn{constructor(e,A=nQA(e)){super(),this.text=e,this.length=A}get lines(){return this.text.length}get children(){return null}lineInner(e,A,i,n){for(let o=0;;o++){let a=this.text[o],r=n+a.length;if((A?i:r)>=e)return new dS(n,r,i,a);n=r+1,i++}}decompose(e,A,i,n){let o=e<=0&&A>=this.length?this:new t(zz(this.text,e,A),Math.min(A,this.length)-Math.max(0,e));if(n&1){let a=i.pop(),r=q8(o.text,a.text.slice(),0,o.length);if(r.length<=32)i.push(new t(r,a.length+o.length));else{let s=r.length>>1;i.push(new t(r.slice(0,s)),new t(r.slice(s)))}}else i.push(o)}replace(e,A,i){if(!(i instanceof t))return super.replace(e,A,i);[e,A]=GE(this,e,A);let n=q8(this.text,q8(i.text,zz(this.text,0,e)),A),o=this.length+i.length-(A-e);return n.length<=32?new t(n,o):NE.from(t.split(n,[]),o)}sliceString(e,A=this.length,i=` -`){[e,A]=GE(this,e,A);let n="";for(let o=0,a=0;o<=A&&ae&&a&&(n+=i),eo&&(n+=r.slice(Math.max(0,e-o),A-o)),o=s+1}return n}flatten(e){for(let A of this.text)e.push(A)}scanIdentical(){return 0}static split(e,A){let i=[],n=-1;for(let o of e)i.push(o),n+=o.length+1,i.length==32&&(A.push(new t(i,n)),i=[],n=-1);return n>-1&&A.push(new t(i,n)),A}},NE=class t extends bn{constructor(e,A){super(),this.children=e,this.length=A,this.lines=0;for(let i of e)this.lines+=i.lines}lineInner(e,A,i,n){for(let o=0;;o++){let a=this.children[o],r=n+a.length,s=i+a.lines-1;if((A?s:r)>=e)return a.lineInner(e,A,i,n);n=r+1,i=s+1}}decompose(e,A,i,n){for(let o=0,a=0;a<=A&&o=a){let l=n&((a<=e?1:0)|(s>=A?2:0));a>=e&&s<=A&&!l?i.push(r):r.decompose(e-a,A-a,i,l)}a=s+1}}replace(e,A,i){if([e,A]=GE(this,e,A),i.lines=o&&A<=r){let s=a.replace(e-o,A-o,i),l=this.lines-a.lines+s.lines;if(s.lines>4&&s.lines>l>>6){let g=this.children.slice();return g[n]=s,new t(g,this.length-(A-e)+i.length)}return super.replace(o,r,s)}o=r+1}return super.replace(e,A,i)}sliceString(e,A=this.length,i=` -`){[e,A]=GE(this,e,A);let n="";for(let o=0,a=0;oe&&o&&(n+=i),ea&&(n+=r.sliceString(e-a,A-a,i)),a=s+1}return n}flatten(e){for(let A of this.children)A.flatten(e)}scanIdentical(e,A){if(!(e instanceof t))return 0;let i=0,[n,o,a,r]=A>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;n+=A,o+=A){if(n==a||o==r)return i;let s=this.children[n],l=e.children[o];if(s!=l)return i+s.scanIdentical(l,A);i+=s.length+1}}static from(e,A=e.reduce((i,n)=>i+n.length+1,-1)){let i=0;for(let d of e)i+=d.lines;if(i<32){let d=[];for(let h of e)h.flatten(d);return new xl(d,A)}let n=Math.max(32,i>>5),o=n<<1,a=n>>1,r=[],s=0,l=-1,g=[];function C(d){let h;if(d.lines>o&&d instanceof t)for(let E of d.children)C(E);else d.lines>a&&(s>a||!s)?(I(),r.push(d)):d instanceof xl&&s&&(h=g[g.length-1])instanceof xl&&d.lines+h.lines<=32?(s+=d.lines,l+=d.length+1,g[g.length-1]=new xl(h.text.concat(d.text),h.length+1+d.length)):(s+d.lines>n&&I(),s+=d.lines,l+=d.length+1,g.push(d))}function I(){s!=0&&(r.push(g.length==1?g[0]:t.from(g,l)),l=-1,s=g.length=0)}for(let d of e)C(d);return I(),r.length==1?r[0]:new t(r,A)}};bn.empty=new xl([""],0);function nQA(t){let e=-1;for(let A of t)e+=A.length+1;return e}function q8(t,e,A=0,i=1e9){for(let n=0,o=0,a=!0;o=A&&(s>i&&(r=r.slice(0,i-n)),n0?1:(e instanceof xl?e.text.length:e.children.length)<<1]}nextInner(e,A){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,n=this.nodes[i],o=this.offsets[i],a=o>>1,r=n instanceof xl?n.text.length:n.children.length;if(a==(A>0?r:0)){if(i==0)return this.done=!0,this.value="",this;A>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((o&1)==(A>0?0:1)){if(this.offsets[i]+=A,e==0)return this.lineBreak=!0,this.value=` -`,this;e--}else if(n instanceof xl){let s=n.text[a+(A<0?-1:0)];if(this.offsets[i]+=A,s.length>Math.max(0,e))return this.value=e==0?s:A>0?s.slice(e):s.slice(0,s.length-e),this;e-=s.length}else{let s=n.children[a+(A<0?-1:0)];e>s.length?(e-=s.length,this.offsets[i]+=A):(A<0&&this.offsets[i]--,this.nodes.push(s),this.offsets.push(A>0?1:(s instanceof xl?s.text.length:s.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},V8=class{constructor(e,A,i){this.value="",this.done=!1,this.cursor=new T1(e,A>i?-1:1),this.pos=A>i?e.length:0,this.from=Math.min(A,i),this.to=Math.max(A,i)}nextInner(e,A){if(A<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,A<0?this.pos-this.to:this.from-this.pos);let i=A<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:n}=this.cursor.next(e);return this.pos+=(n.length+e)*A,this.value=n.length<=i?n:A<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},W8=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:A,lineBreak:i,value:n}=this.inner.next(e);return A&&this.afterBreak?(this.value="",this.afterBreak=!1):A?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<"u"&&(bn.prototype[Symbol.iterator]=function(){return this.iter()},T1.prototype[Symbol.iterator]=V8.prototype[Symbol.iterator]=W8.prototype[Symbol.iterator]=function(){return this});var dS=class{constructor(e,A,i,n){this.from=e,this.to=A,this.number=i,this.text=n}get length(){return this.to-this.from}};function GE(t,e,A){return e=Math.max(0,Math.min(t.length,e)),[e,Math.max(e,Math.min(t.length,A))]}function ja(t,e,A=!0,i=!0){return Jz(t,e,A,i)}function oQA(t){return t>=56320&&t<57344}function aQA(t){return t>=55296&&t<56320}function qr(t,e){let A=t.charCodeAt(e);if(!aQA(A)||e+1==t.length)return A;let i=t.charCodeAt(e+1);return oQA(i)?(A-55296<<10)+(i-56320)+65536:A}function _4(t){return t<=65535?String.fromCharCode(t):(t-=65536,String.fromCharCode((t>>10)+55296,(t&1023)+56320))}function _l(t){return t<65536?1:2}var BS=/\r\n?|\n/,zr=(function(t){return t[t.Simple=0]="Simple",t[t.TrackDel=1]="TrackDel",t[t.TrackBefore=2]="TrackBefore",t[t.TrackAfter=3]="TrackAfter",t})(zr||(zr={})),q2=class t{constructor(e){this.sections=e}get length(){let e=0;for(let A=0;Ae)return o+(e-n);o+=r}else{if(i!=zr.Simple&&l>=e&&(i==zr.TrackDel&&ne||i==zr.TrackBefore&&ne))return null;if(l>e||l==e&&A<0&&!r)return e==n||A<0?o:o+s;o+=s}n=l}if(e>n)throw new RangeError(`Position ${e} is out of range for changeset of length ${n}`);return o}touchesRange(e,A=e){for(let i=0,n=0;i=0&&n<=A&&r>=e)return nA?"cover":!0;n=r}return!1}toString(){let e="";for(let A=0;A=0?":"+n:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(A=>typeof A!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new t(e)}static create(e){return new t(e)}},Pr=class t extends q2{constructor(e,A){super(e),this.inserted=A}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return ES(this,(A,i,n,o,a)=>e=e.replace(n,n+(i-A),a),!1),e}mapDesc(e,A=!1){return hS(this,e,A,!0)}invert(e){let A=this.sections.slice(),i=[];for(let n=0,o=0;n=0){A[n]=r,A[n+1]=a;let s=n>>1;for(;i.length0&&j2(i,A,o.text),o.forward(g),r+=g}let l=e[a++];for(;r>1].toJSON()))}return e}static of(e,A,i){let n=[],o=[],a=0,r=null;function s(g=!1){if(!g&&!n.length)return;aI||C<0||I>A)throw new RangeError(`Invalid change range ${C} to ${I} (in doc of length ${A})`);let h=d?typeof d=="string"?bn.of(d.split(i||BS)):d:bn.empty,E=h.length;if(C==I&&E==0)return;Ca&&hs(n,C-a,-1),hs(n,I-C,E),j2(o,n,h),a=I}}return l(e),s(!r),r}static empty(e){return new t(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let A=[],i=[];for(let n=0;nr&&typeof a!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(o.length==1)A.push(o[0],0);else{for(;i.length=0&&A<=0&&A==t[n+1]?t[n]+=e:n>=0&&e==0&&t[n]==0?t[n+1]+=A:i?(t[n]+=e,t[n+1]+=A):t.push(e,A)}function j2(t,e,A){if(A.length==0)return;let i=e.length-2>>1;if(i>1])),!(A||a==t.sections.length||t.sections[a+1]<0);)r=t.sections[a++],s=t.sections[a++];e(n,l,o,g,C),n=l,o=g}}}function hS(t,e,A,i=!1){let n=[],o=i?[]:null,a=new J1(t),r=new J1(e);for(let s=-1;;){if(a.done&&r.len||r.done&&a.len)throw new Error("Mismatched change set lengths");if(a.ins==-1&&r.ins==-1){let l=Math.min(a.len,r.len);hs(n,l,-1),a.forward(l),r.forward(l)}else if(r.ins>=0&&(a.ins<0||s==a.i||a.off==0&&(r.len=0&&s=0){let l=0,g=a.len;for(;g;)if(r.ins==-1){let C=Math.min(g,r.len);l+=C,g-=C,r.forward(C)}else if(r.ins==0&&r.lens||a.ins>=0&&a.len>s)&&(r||i.length>l),o.forward2(s),a.forward(s)}}}}var J1=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return A>=e.length?bn.empty:e[A]}textBit(e){let{inserted:A}=this.set,i=this.i-2>>1;return i>=A.length&&!e?bn.empty:A[i].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},RE=class t{constructor(e,A,i){this.from=e,this.to=A,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}get goalColumn(){let e=this.flags>>6;return e==16777215?void 0:e}map(e,A=-1){let i,n;return this.empty?i=n=e.mapPos(this.from,A):(i=e.mapPos(this.from,1),n=e.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new t(i,n,this.flags)}extend(e,A=e,i=0){if(e<=this.anchor&&A>=this.anchor)return Ie.range(e,A,void 0,void 0,i);let n=Math.abs(e-this.anchor)>Math.abs(A-this.anchor)?e:A;return Ie.range(this.anchor,n,void 0,void 0,i)}eq(e,A=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!A||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return Ie.range(e.anchor,e.head)}static create(e,A,i){return new t(e,A,i)}},Ie=class t{constructor(e,A){this.ranges=e,this.mainIndex=A}map(e,A=-1){return e.empty?this:t.create(this.ranges.map(i=>i.map(e,A)),this.mainIndex)}eq(e,A=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let i=0;ie.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new t(e.ranges.map(A=>RE.fromJSON(A)),e.main)}static single(e,A=e){return new t([t.range(e,A)],0)}static create(e,A=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;nn.from-o.from),A=e.indexOf(i);for(let n=1;no.head?t.range(s,r):t.range(r,s))}}return new t(e,A)}};function $z(t,e){for(let A of t.ranges)if(A.to>e)throw new RangeError("Selection points outside of document")}var vS=0,At=class t{constructor(e,A,i,n,o){this.combine=e,this.compareInput=A,this.compare=i,this.isStatic=n,this.id=vS++,this.default=e([]),this.extensions=typeof o=="function"?o(this):o}get reader(){return this}static define(e={}){return new t(e.combine||(A=>A),e.compareInput||((A,i)=>A===i),e.compare||(e.combine?(A,i)=>A===i:bS),!!e.static,e.enables)}of(e){return new FE([],this,0,e)}compute(e,A){if(this.isStatic)throw new Error("Can't compute a static facet");return new FE(e,this,1,A)}computeN(e,A){if(this.isStatic)throw new Error("Can't compute a static facet");return new FE(e,this,2,A)}from(e,A){return A||(A=i=>i),this.compute([e],i=>A(i.field(e)))}};function bS(t,e){return t==e||t.length==e.length&&t.every((A,i)=>A===e[i])}var FE=class{constructor(e,A,i,n){this.dependencies=e,this.facet=A,this.type=i,this.value=n,this.id=vS++}dynamicSlot(e){var A;let i=this.value,n=this.facet.compareInput,o=this.id,a=e[o]>>1,r=this.type==2,s=!1,l=!1,g=[];for(let C of this.dependencies)C=="doc"?s=!0:C=="selection"?l=!0:(((A=e[C.id])!==null&&A!==void 0?A:1)&1)==0&&g.push(e[C.id]);return{create(C){return C.values[a]=i(C),1},update(C,I){if(s&&I.docChanged||l&&(I.docChanged||I.selection)||QS(C,g)){let d=i(C);if(r?!Pz(d,C.values[a],n):!n(d,C.values[a]))return C.values[a]=d,1}return 0},reconfigure:(C,I)=>{let d,h=I.config.address[o];if(h!=null){let E=$8(I,h);if(this.dependencies.every(f=>f instanceof At?I.facet(f)===C.facet(f):f instanceof Ma?I.field(f,!1)==C.field(f,!1):!0)||(r?Pz(d=i(C),E,n):n(d=i(C),E)))return C.values[a]=E,0}else d=i(C);return C.values[a]=d,1}}}};function Pz(t,e,A){if(t.length!=e.length)return!1;for(let i=0;it[s.id]),n=A.map(s=>s.type),o=i.filter(s=>!(s&1)),a=t[e.id]>>1;function r(s){let l=[];for(let g=0;gi===n),e);return e.provide&&(A.provides=e.provide(A)),A}create(e){let A=e.facet(z8).find(i=>i.field==this);return(A?.create||this.createF)(e)}slot(e){let A=e[this.id]>>1;return{create:i=>(i.values[A]=this.create(i),1),update:(i,n)=>{let o=i.values[A],a=this.updateF(o,n);return this.compareF(o,a)?0:(i.values[A]=a,1)},reconfigure:(i,n)=>{let o=i.facet(z8),a=n.facet(z8),r;return(r=o.find(s=>s.field==this))&&r!=a.find(s=>s.field==this)?(i.values[A]=r.create(i),1):n.config.address[this.id]!=null?(i.values[A]=n.field(this),0):(i.values[A]=this.create(i),1)}}}init(e){return[this,z8.of({field:this,create:e})]}get extension(){return this}},K1={lowest:4,low:3,default:2,high:1,highest:0};function b4(t){return e=>new Z8(e,t)}var oc={highest:b4(K1.highest),high:b4(K1.high),default:b4(K1.default),low:b4(K1.low),lowest:b4(K1.lowest)},Z8=class{constructor(e,A){this.inner=e,this.prec=A}},d0=class t{of(e){return new S4(this,e)}reconfigure(e){return t.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}},S4=class{constructor(e,A){this.compartment=e,this.inner=A}},X8=class t{constructor(e,A,i,n,o,a){for(this.base=e,this.compartments=A,this.dynamicSlots=i,this.address=n,this.staticValues=o,this.facets=a,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,A,i){let n=[],o=Object.create(null),a=new Map;for(let I of sQA(e,A,a))I instanceof Ma?n.push(I):(o[I.facet.id]||(o[I.facet.id]=[])).push(I);let r=Object.create(null),s=[],l=[];for(let I of n)r[I.id]=l.length<<1,l.push(d=>I.slot(d));let g=i?.config.facets;for(let I in o){let d=o[I],h=d[0].facet,E=g&&g[I]||[];if(d.every(f=>f.type==0))if(r[h.id]=s.length<<1|1,bS(E,d))s.push(i.facet(h));else{let f=h.combine(d.map(m=>m.value));s.push(i&&h.compare(f,i.facet(h))?i.facet(h):f)}else{for(let f of d)f.type==0?(r[f.id]=s.length<<1|1,s.push(f.value)):(r[f.id]=l.length<<1,l.push(m=>f.dynamicSlot(m)));r[h.id]=l.length<<1,l.push(f=>rQA(f,h,d))}}let C=l.map(I=>I(r));return new t(e,a,C,r,s,o)}};function sQA(t,e,A){let i=[[],[],[],[],[]],n=new Map;function o(a,r){let s=n.get(a);if(s!=null){if(s<=r)return;let l=i[s].indexOf(a);l>-1&&i[s].splice(l,1),a instanceof S4&&A.delete(a.compartment)}if(n.set(a,r),Array.isArray(a))for(let l of a)o(l,r);else if(a instanceof S4){if(A.has(a.compartment))throw new RangeError("Duplicate use of compartment in extensions");let l=e.get(a.compartment)||a.inner;A.set(a.compartment,l),o(l,r)}else if(a instanceof Z8)o(a.inner,a.prec);else if(a instanceof Ma)i[r].push(a),a.provides&&o(a.provides,r);else if(a instanceof FE)i[r].push(a),a.facet.extensions&&o(a.facet.extensions,K1.default);else{let l=a.extension;if(!l)throw new Error(`Unrecognized extension value in extension set (${a}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);o(l,r)}}return o(t,K1.default),i.reduce((a,r)=>a.concat(r))}function M4(t,e){if(e&1)return 2;let A=e>>1,i=t.status[A];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;t.status[A]=4;let n=t.computeSlot(t,t.config.dynamicSlots[A]);return t.status[A]=2|n}function $8(t,e){return e&1?t.config.staticValues[e>>1]:t.values[e>>1]}var jz=At.define(),CS=At.define({combine:t=>t.some(e=>e),static:!0}),AP=At.define({combine:t=>t.length?t[0]:void 0,static:!0}),eP=At.define(),tP=At.define(),iP=At.define(),qz=At.define({combine:t=>t.length?t[0]:!1}),al=class{constructor(e,A){this.type=e,this.value=A}static define(){return new uS}},uS=class{of(e){return new al(this,e)}},fS=class{constructor(e){this.map=e}of(e){return new Wi(this,e)}},Wi=(()=>{class t{constructor(A,i){this.type=A,this.value=i}map(A){let i=this.type.map(this.value,A);return i===void 0?void 0:i==this.value?this:new t(this.type,i)}is(A){return this.type==A}static define(A={}){return new fS(A.map||(i=>i))}static mapEffects(A,i){if(!A.length)return A;let n=[];for(let o of A){let a=o.map(i);a&&n.push(a)}return n}}return t.reconfigure=t.define(),t.appendConfig=t.define(),t})(),I0=(()=>{class t{constructor(A,i,n,o,a,r){this.startState=A,this.changes=i,this.selection=n,this.effects=o,this.annotations=a,this.scrollIntoView=r,this._doc=null,this._state=null,n&&$z(n,i.newLength),a.some(s=>s.type==t.time)||(this.annotations=a.concat(t.time.of(Date.now())))}static create(A,i,n,o,a,r){return new t(A,i,n,o,a,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(A){for(let i of this.annotations)if(i.type==A)return i.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(A){let i=this.annotation(t.userEvent);return!!(i&&(i==A||i.length>A.length&&i.slice(0,A.length)==A&&i[A.length]=="."))}}return t.time=al.define(),t.userEvent=al.define(),t.addToHistory=al.define(),t.remote=al.define(),t})();function lQA(t,e){let A=[];for(let i=0,n=0;;){let o,a;if(i=t[i]))o=t[i++],a=t[i++];else if(n=0;n--){let o=i[n](t);o instanceof I0?t=o:Array.isArray(o)&&o.length==1&&o[0]instanceof I0?t=o[0]:t=oP(e,LE(o),!1)}return t}function cQA(t){let e=t.startState,A=e.facet(iP),i=t;for(let n=A.length-1;n>=0;n--){let o=A[n](t);o&&Object.keys(o).length&&(i=nP(i,pS(e,o,t.changes.newLength),!0))}return i==t?t:I0.create(e,t.changes,t.selection,i.effects,i.annotations,i.scrollIntoView)}var CQA=[];function LE(t){return t==null?CQA:Array.isArray(t)?t:[t]}var Uo=(function(t){return t[t.Word=0]="Word",t[t.Space=1]="Space",t[t.Other=2]="Other",t})(Uo||(Uo={})),IQA=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,mS;try{mS=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch(t){}function dQA(t){if(mS)return mS.test(t);for(let e=0;e"\x80"&&(A.toUpperCase()!=A.toLowerCase()||IQA.test(A)))return!0}return!1}function BQA(t){return e=>{if(!/\S/.test(e))return Uo.Space;if(dQA(e))return Uo.Word;for(let A=0;A-1)return Uo.Word;return Uo.Other}}var qa=(()=>{class t{constructor(A,i,n,o,a,r){this.config=A,this.doc=i,this.selection=n,this.values=o,this.status=A.statusTemplate.slice(),this.computeSlot=a,r&&(r._state=this);for(let s=0;so.set(g,l)),i=null),o.set(s.value.compartment,s.value.extension)):s.is(Wi.reconfigure)?(i=null,n=s.value):s.is(Wi.appendConfig)&&(i=null,n=LE(n).concat(s.value));let a;i?a=A.startState.values.slice():(i=X8.resolve(n,o,this),a=new t(i,this.doc,this.selection,i.dynamicSlots.map(()=>null),(l,g)=>g.reconfigure(l,this),null).values);let r=A.startState.facet(CS)?A.newSelection:A.newSelection.asSingle();new t(i,A.newDoc,r,a,(s,l)=>l.update(s,A),A)}replaceSelection(A){return typeof A=="string"&&(A=this.toText(A)),this.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:A},range:Ie.cursor(i.from+A.length)}))}changeByRange(A){let i=this.selection,n=A(i.ranges[0]),o=this.changes(n.changes),a=[n.range],r=LE(n.effects);for(let s=1;sr.spec.fromJSON(s,l)))}}return t.create({doc:A.doc,selection:Ie.fromJSON(A.selection),extensions:i.extensions?o.concat([i.extensions]):o})}static create(A={}){let i=X8.resolve(A.extensions||[],new Map),n=A.doc instanceof bn?A.doc:bn.of((A.doc||"").split(i.staticFacet(t.lineSeparator)||BS)),o=A.selection?A.selection instanceof Ie?A.selection:Ie.single(A.selection.anchor,A.selection.head):Ie.single(0);return $z(o,n.length),i.staticFacet(CS)||(o=o.asSingle()),new t(i,n,o,i.dynamicSlots.map(()=>null),(a,r)=>r.create(a),null)}get tabSize(){return this.facet(t.tabSize)}get lineBreak(){return this.facet(t.lineSeparator)||` -`}get readOnly(){return this.facet(qz)}phrase(A,...i){for(let n of this.facet(t.phrases))if(Object.prototype.hasOwnProperty.call(n,A)){A=n[A];break}return i.length&&(A=A.replace(/\$(\$|\d*)/g,(n,o)=>{if(o=="$")return"$";let a=+(o||1);return!a||a>i.length?n:i[a-1]})),A}languageDataAt(A,i,n=-1){let o=[];for(let a of this.facet(jz))for(let r of a(this,i,n))Object.prototype.hasOwnProperty.call(r,A)&&o.push(r[A]);return o}charCategorizer(A){let i=this.languageDataAt("wordChars",A);return BQA(i.length?i[0]:"")}wordAt(A){let{text:i,from:n,length:o}=this.doc.lineAt(A),a=this.charCategorizer(A),r=A-n,s=A-n;for(;r>0;){let l=ja(i,r,!1);if(a(i.slice(l,r))!=Uo.Word)break;r=l}for(;se.length?e[0]:4}),t.lineSeparator=AP,t.readOnly=qz,t.phrases=At.define({compare(e,A){let i=Object.keys(e),n=Object.keys(A);return i.length==n.length&&i.every(o=>e[o]==A[o])}}),t.languageData=jz,t.changeFilter=eP,t.transactionFilter=tP,t.transactionExtender=iP,t})();d0.reconfigure=Wi.define();function Mr(t,e,A={}){let i={};for(let n of t)for(let o of Object.keys(n)){let a=n[o],r=i[o];if(r===void 0)i[o]=a;else if(!(r===a||a===void 0))if(Object.hasOwnProperty.call(A,o))i[o]=A[o](r,a);else throw new Error("Config merge conflict for field "+o)}for(let n in e)i[n]===void 0&&(i[n]=e[n]);return i}var gg=class{eq(e){return this==e}range(e,A=e){return k4.create(e,A,this)}};gg.prototype.startSide=gg.prototype.endSide=0;gg.prototype.point=!1;gg.prototype.mapMode=zr.TrackDel;function MS(t,e){return t==e||t.constructor==e.constructor&&t.eq(e)}var k4=class t{constructor(e,A,i){this.from=e,this.to=A,this.value=i}static create(e,A,i){return new t(e,A,i)}};function wS(t,e){return t.from-e.from||t.value.startSide-e.value.startSide}var DS=class t{constructor(e,A,i,n){this.from=e,this.to=A,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(e,A,i,n=0){let o=i?this.to:this.from;for(let a=n,r=o.length;;){if(a==r)return a;let s=a+r>>1,l=o[s]-e||(i?this.value[s].endSide:this.value[s].startSide)-A;if(s==a)return l>=0?a:r;l>=0?r=s:a=s+1}}between(e,A,i,n){for(let o=this.findIndex(A,-1e9,!0),a=this.findIndex(i,1e9,!1,o);od||I==d&&l.startSide>0&&l.endSide<=0)continue;(d-I||l.endSide-l.startSide)<0||(a<0&&(a=I),l.point&&(r=Math.max(r,d-I)),i.push(l),n.push(I-a),o.push(d-a))}return{mapped:i.length?new t(n,o,i,r):null,pos:a}}},io=(()=>{class t{constructor(A,i,n,o){this.chunkPos=A,this.chunk=i,this.nextLayer=n,this.maxPoint=o}static create(A,i,n,o){return new t(A,i,n,o)}get length(){let A=this.chunk.length-1;return A<0?0:Math.max(this.chunkEnd(A),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let A=this.nextLayer.size;for(let i of this.chunk)A+=i.value.length;return A}chunkEnd(A){return this.chunkPos[A]+this.chunk[A].length}update(A){let{add:i=[],sort:n=!1,filterFrom:o=0,filterTo:a=this.length}=A,r=A.filter;if(i.length==0&&!r)return this;if(n&&(i=i.slice().sort(wS)),this.isEmpty)return i.length?t.of(i):this;let s=new Aw(this,null,-1).goto(0),l=0,g=[],C=new jr;for(;s.value||l=0){let I=i[l++];C.addInner(I.from,I.to,I.value)||g.push(I)}else s.rangeIndex==1&&s.chunkIndexthis.chunkEnd(s.chunkIndex)||as.to||a=a&&A<=a+r.length&&r.between(a,A-a,i-a,n)===!1)return}this.nextLayer.between(A,i,n)}}iter(A=0){return x4.from([this]).goto(A)}get isEmpty(){return this.nextLayer==this}static iter(A,i=0){return x4.from(A).goto(i)}static compare(A,i,n,o,a=-1){let r=A.filter(I=>I.maxPoint>0||!I.isEmpty&&I.maxPoint>=a),s=i.filter(I=>I.maxPoint>0||!I.isEmpty&&I.maxPoint>=a),l=Vz(r,s,n),g=new U1(r,l,a),C=new U1(s,l,a);n.iterGaps((I,d,h)=>Wz(g,I,C,d,h,o)),n.empty&&n.length==0&&Wz(g,0,C,0,0,o)}static eq(A,i,n=0,o){o==null&&(o=999999999);let a=A.filter(C=>!C.isEmpty&&i.indexOf(C)<0),r=i.filter(C=>!C.isEmpty&&A.indexOf(C)<0);if(a.length!=r.length)return!1;if(!a.length)return!0;let s=Vz(a,r),l=new U1(a,s,0).goto(n),g=new U1(r,s,0).goto(n);for(;;){if(l.to!=g.to||!yS(l.active,g.active)||l.point&&(!g.point||!MS(l.point,g.point)))return!1;if(l.to>o)return!0;l.next(),g.next()}}static spans(A,i,n,o,a=-1){let r=new U1(A,null,a).goto(i),s=i,l=r.openStart;for(;;){let g=Math.min(r.to,n);if(r.point){let C=r.activeForPoint(r.to),I=r.pointFroms&&(o.span(s,g,r.active,l),l=r.openEnd(g));if(r.to>n)return l+(r.point&&r.to>n?1:0);s=r.to,r.next()}}static of(A,i=!1){let n=new jr;for(let o of A instanceof k4?[A]:i?EQA(A):A)n.add(o.from,o.to,o.value);return n.finish()}static join(A){if(!A.length)return t.empty;let i=A[A.length-1];for(let n=A.length-2;n>=0;n--)for(let o=A[n];o!=t.empty;o=o.nextLayer)i=new t(o.chunkPos,o.chunk,i,Math.max(o.maxPoint,i.maxPoint));return i}}return t.empty=new t([],[],null,-1),t})();function EQA(t){if(t.length>1)for(let e=t[0],A=1;A0)return t.slice().sort(wS);e=i}return t}io.empty.nextLayer=io.empty;var jr=class t{finishChunk(e){this.chunks.push(new DS(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,A,i){this.addInner(e,A,i)||(this.nextLayer||(this.nextLayer=new t)).add(e,A,i)}addInner(e,A,i){let n=e-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(e-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(A-this.chunkStart),this.last=i,this.lastFrom=e,this.lastTo=A,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,A-e)),!0)}addChunk(e,A){if((e-this.lastTo||A.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,A.maxPoint),this.chunks.push(A),this.chunkPos.push(e);let i=A.value.length-1;return this.last=A.value[i],this.lastFrom=A.from[i]+e,this.lastTo=A.to[i]+e,!0}finish(){return this.finishInner(io.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let A=io.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,A}};function Vz(t,e,A){let i=new Map;for(let o of t)for(let a=0;a=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new Aw(a,A,i,o));return n.length==1?n[0]:new t(n)}get startSide(){return this.value?this.value.startSide:0}goto(e,A=-1e9){for(let i of this.heap)i.goto(e,A);for(let i=this.heap.length>>1;i>=0;i--)IS(this.heap,i);return this.next(),this}forward(e,A){for(let i of this.heap)i.forward(e,A);for(let i=this.heap.length>>1;i>=0;i--)IS(this.heap,i);(this.to-e||this.value.endSide-A)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),IS(this.heap,0)}}};function IS(t,e){for(let A=t[e];;){let i=(e<<1)+1;if(i>=t.length)break;let n=t[i];if(i+1=0&&(n=t[i+1],i++),A.compare(n)<0)break;t[i]=A,t[e]=n,e=i}}var U1=class{constructor(e,A,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=x4.from(e,A,i)}goto(e,A=-1e9){return this.cursor.goto(e,A),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=A,this.openStart=-1,this.next(),this}forward(e,A){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-A)<0;)this.removeActive(this.minActive);this.cursor.forward(e,A)}removeActive(e){P8(this.active,e),P8(this.activeTo,e),P8(this.activeRank,e),this.minActive=Zz(this.active,this.activeTo)}addActive(e){let A=0,{value:i,to:n,rank:o}=this.cursor;for(;A0;)A++;j8(this.active,A,i),j8(this.activeTo,A,n),j8(this.activeRank,A,o),e&&j8(e,A,this.cursor.from),this.minActive=Zz(this.active,this.activeTo)}next(){let e=this.to,A=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>e){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&P8(i,n)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let o=this.cursor.value;if(!o.point)this.addActive(i),this.cursor.next();else if(A&&this.cursor.to==this.to&&this.cursor.from=0&&i[n]=0&&!(this.activeRank[i]e||this.activeTo[i]==e&&this.active[i].endSide>=this.point.endSide)&&A.push(this.active[i]);return A.reverse()}openEnd(e){let A=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>e;i--)A++;return A}};function Wz(t,e,A,i,n,o){t.goto(e),A.goto(i);let a=i+n,r=i,s=i-e,l=!!o.boundChange;for(let g=!1;;){let C=t.to+s-A.to,I=C||t.endSide-A.endSide,d=I<0?t.to+s:A.to,h=Math.min(d,a);if(t.point||A.point?(t.point&&A.point&&MS(t.point,A.point)&&yS(t.activeForPoint(t.to),A.activeForPoint(A.to))||o.comparePoint(r,h,t.point,A.point),g=!1):(g&&o.boundChange(r),h>r&&!yS(t.active,A.active)&&o.compareRange(r,h,t.active,A.active),l&&ha)break;r=d,I<=0&&t.next(),I>=0&&A.next()}}function yS(t,e){if(t.length!=e.length)return!1;for(let A=0;A=e;i--)t[i+1]=t[i];t[e]=A}function Zz(t,e){let A=-1,i=1e9;for(let n=0;n=e)return n;if(n==t.length)break;o+=t.charCodeAt(n)==9?A-o%A:1,n=ja(t,n)}return i===!0?-1:t.length}var aP=typeof Symbol>"u"?"__\u037C":Symbol.for("\u037C"),SS=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),rP=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{},cg=class{constructor(e,A){this.rules=[];let{finish:i}=A||{};function n(a){return/^@/.test(a)?[a]:a.split(/,\s*/)}function o(a,r,s,l){let g=[],C=/^@(\w+)\b/.exec(a[0]),I=C&&C[1]=="keyframes";if(C&&r==null)return s.push(a[0]+";");for(let d in r){let h=r[d];if(/&/.test(d))o(d.split(/,\s*/).map(E=>a.map(f=>E.replace(/&/,f))).reduce((E,f)=>E.concat(f)),h,s);else if(h&&typeof h=="object"){if(!C)throw new RangeError("The value of a property ("+d+") should be a primitive value.");o(n(d),h,g,I)}else h!=null&&g.push(d.replace(/_.*/,"").replace(/[A-Z]/g,E=>"-"+E.toLowerCase())+": "+h+";")}(g.length||I)&&s.push((i&&!C&&!l?a.map(i):a).join(", ")+" {"+g.join(" ")+"}")}for(let a in e)o(n(a),e[a],this.rules)}getRules(){return this.rules.join(` -`)}static newName(){let e=rP[aP]||1;return rP[aP]=e+1,"\u037C"+e.toString(36)}static mount(e,A,i){let n=e[SS],o=i&&i.nonce;n?o&&n.setNonce(o):n=new kS(e,o),n.mount(Array.isArray(A)?A:[A],e)}},sP=new Map,kS=class{constructor(e,A){let i=e.ownerDocument||e,n=i.defaultView;if(!e.head&&e.adoptedStyleSheets&&n.CSSStyleSheet){let o=sP.get(i);if(o)return e[SS]=o;this.sheet=new n.CSSStyleSheet,sP.set(i,this)}else this.styleTag=i.createElement("style"),A&&this.styleTag.setAttribute("nonce",A);this.modules=[],e[SS]=this}mount(e,A){let i=this.sheet,n=0,o=0;for(let a=0;a-1&&(this.modules.splice(s,1),o--,s=-1),s==-1){if(this.modules.splice(o++,0,r),i)for(let l=0;l",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},hQA=typeof navigator<"u"&&/Mac/.test(navigator.platform),QQA=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(er=0;er<10;er++)BC[48+er]=BC[96+er]=String(er);var er;for(er=1;er<=24;er++)BC[er+111]="F"+er;var er;for(er=65;er<=90;er++)BC[er]=String.fromCharCode(er+32),KE[er]=String.fromCharCode(er);var er;for(tw in BC)KE.hasOwnProperty(tw)||(KE[tw]=BC[tw]);var tw;function lP(t){var e=hQA&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||QQA&&t.shiftKey&&t.key&&t.key.length==1||t.key=="Unidentified",A=!e&&t.key||(t.shiftKey?KE:BC)[t.keyCode]||t.key||"Unidentified";return A=="Esc"&&(A="Escape"),A=="Del"&&(A="Delete"),A=="Left"&&(A="ArrowLeft"),A=="Up"&&(A="ArrowUp"),A=="Right"&&(A="ArrowRight"),A=="Down"&&(A="ArrowDown"),A}function no(){var t=arguments[0];typeof t=="string"&&(t=document.createElement(t));var e=1,A=arguments[1];if(A&&typeof A=="object"&&A.nodeType==null&&!Array.isArray(A)){for(var i in A)if(Object.prototype.hasOwnProperty.call(A,i)){var n=A[i];typeof n=="string"?t.setAttribute(i,n):n!=null&&(t[i]=n)}e++}for(;e2),at={mac:IP||/Mac/.test(Rs.platform),windows:/Win/.test(Rs.platform),linux:/Linux|X11/.test(Rs.platform),ie:Fw,ie_version:XP?OS.documentMode||6:HS?+HS[1]:YS?+YS[1]:0,gecko:cP,gecko_version:cP?+(/Firefox\/(\d+)/.exec(Rs.userAgent)||[0,0])[1]:0,chrome:!!xS,chrome_version:xS?+xS[1]:0,ios:IP,android:/Android\b/.test(Rs.userAgent),webkit:CP,webkit_version:CP?+(/\bAppleWebKit\/(\d+)/.exec(Rs.userAgent)||[0,0])[1]:0,safari:zS,safari_version:zS?+(/\bVersion\/(\d+(\.\d+)?)/.exec(Rs.userAgent)||[0,0])[1]:0,tabSize:OS.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"};function Lk(t,e){for(let A in t)A=="class"&&e.class?e.class+=" "+t.class:A=="style"&&e.style?e.style+=";"+t.style:e[A]=t[A];return e}var hw=Object.create(null);function Gk(t,e,A){if(t==e)return!0;t||(t=hw),e||(e=hw);let i=Object.keys(t),n=Object.keys(e);if(i.length-(A&&i.indexOf(A)>-1?1:0)!=n.length-(A&&n.indexOf(A)>-1?1:0))return!1;for(let o of i)if(o!=A&&(n.indexOf(o)==-1||t[o]!==e[o]))return!1;return!0}function uQA(t,e){for(let A=t.attributes.length-1;A>=0;A--){let i=t.attributes[A].name;e[i]==null&&t.removeAttribute(i)}for(let A in e){let i=e[A];A=="style"?t.style.cssText=i:t.getAttribute(A)!=i&&t.setAttribute(A,i)}}function dP(t,e,A){let i=!1;if(e)for(let n in e)A&&n in A||(i=!0,n=="style"?t.style.cssText="":t.removeAttribute(n));if(A)for(let n in A)e&&e[n]==A[n]||(i=!0,n=="style"?t.style.cssText=A[n]:t.setAttribute(n,A[n]));return i}function fQA(t){let e=Object.create(null);for(let A=0;A0?3e8:-4e8:A>0?1e8:-1e8,new z1(e,A,A,i,e.widget||null,!1)}static replace(e){let A=!!e.block,i,n;if(e.isBlockGap)i=-5e8,n=4e8;else{let{start:o,end:a}=$P(e,A);i=(o?A?-3e8:-1:5e8)-1,n=(a?A?2e8:1:-6e8)+1}return new z1(e,i,n,A,e.widget||null,!0)}static line(e){return new P4(e)}static set(e,A=!1){return io.of(e,A)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};St.none=io.empty;var z4=class t extends St{constructor(e){let{start:A,end:i}=$P(e);super(A?-1:5e8,i?1:-6e8,null,e),this.tagName=e.tagName||"span",this.attrs=e.class&&e.attributes?Lk(e.attributes,{class:e.class}):e.class?{class:e.class}:e.attributes||hw}eq(e){return this==e||e instanceof t&&this.tagName==e.tagName&&Gk(this.attrs,e.attrs)}range(e,A=e){if(e>=A)throw new RangeError("Mark decorations may not be empty");return super.range(e,A)}};z4.prototype.point=!1;var P4=class t extends St{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof t&&this.spec.class==e.spec.class&&Gk(this.spec.attributes,e.spec.attributes)}range(e,A=e){if(A!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,A)}};P4.prototype.mapMode=zr.TrackBefore;P4.prototype.point=!0;var z1=class t extends St{constructor(e,A,i,n,o,a){super(A,i,o,e),this.block=n,this.isReplace=a,this.mapMode=n?A<=0?zr.TrackBefore:zr.TrackAfter:zr.TrackDel}get type(){return this.startSide!=this.endSide?Vr.WidgetRange:this.startSide<=0?Vr.WidgetBefore:Vr.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof t&&pQA(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,A=e){if(this.isReplace&&(e>A||e==A&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&A!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,A)}};z1.prototype.point=!0;function $P(t,e=!1){let{inclusiveStart:A,inclusiveEnd:i}=t;return A==null&&(A=t.inclusive),i==null&&(i=t.inclusive),{start:A??e,end:i??e}}function pQA(t,e){return t==e||!!(t&&e&&t.compare(e))}function HE(t,e,A,i=0){let n=A.length-1;n>=0&&A[n]+i>=t?A[n]=Math.max(A[n],e):A.push(t,e)}var Qw=class t extends gg{constructor(e,A){super(),this.tagName=e,this.attributes=A}eq(e){return e==this||e instanceof t&&this.tagName==e.tagName&&Gk(this.attributes,e.attributes)}static create(e){return new t(e.tagName,e.attributes||hw)}static set(e,A=!1){return io.of(e,A)}};Qw.prototype.startSide=Qw.prototype.endSide=-1;function j4(t){let e;return t.nodeType==11?e=t.getSelection?t:t.ownerDocument:e=t,e.getSelection()}function PS(t,e){return e?t==e||t.contains(e.nodeType!=1?e.parentNode:e):!1}function L4(t,e){if(!e.anchorNode)return!1;try{return PS(t,e.anchorNode)}catch(A){return!1}}function Cw(t){return t.nodeType==3?q4(t,0,t.nodeValue.length).getClientRects():t.nodeType==1?t.getClientRects():[]}function G4(t,e,A,i){return A?BP(t,e,A,i,-1)||BP(t,e,A,i,1):!1}function Z2(t){for(var e=0;;e++)if(t=t.previousSibling,!t)return e}function uw(t){return t.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(t.nodeName)}function BP(t,e,A,i,n){for(;;){if(t==A&&e==i)return!0;if(e==(n<0?0:QC(t))){if(t.nodeName=="DIV")return!1;let o=t.parentNode;if(!o||o.nodeType!=1)return!1;e=Z2(t)+(n<0?0:1),t=o}else if(t.nodeType==1){if(t=t.childNodes[e+(n<0?-1:0)],t.nodeType==1&&t.contentEditable=="false")return!1;e=n<0?QC(t):0}else return!1}}function QC(t){return t.nodeType==3?t.nodeValue.length:t.childNodes.length}function fw(t,e){let A=e?t.left:t.right;return{left:A,right:A,top:t.top,bottom:t.bottom}}function mQA(t){let e=t.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:t.innerWidth,top:0,bottom:t.innerHeight}}function Aj(t,e){let A=e.width/t.offsetWidth,i=e.height/t.offsetHeight;return(A>.995&&A<1.005||!isFinite(A)||Math.abs(e.width-t.offsetWidth)<1)&&(A=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(e.height-t.offsetHeight)<1)&&(i=1),{scaleX:A,scaleY:i}}function wQA(t,e,A,i,n,o,a,r){let s=t.ownerDocument,l=s.defaultView||window;for(let g=t,C=!1;g&&!C;)if(g.nodeType==1){let I,d=g==s.body,h=1,E=1;if(d)I=mQA(l);else{if(/^(fixed|sticky)$/.test(getComputedStyle(g).position)&&(C=!0),g.scrollHeight<=g.clientHeight&&g.scrollWidth<=g.clientWidth){g=g.assignedSlot||g.parentNode;continue}let v=g.getBoundingClientRect();({scaleX:h,scaleY:E}=Aj(g,v)),I={left:v.left,right:v.left+g.clientWidth*h,top:v.top,bottom:v.top+g.clientHeight*E}}let f=0,m=0;if(n=="nearest")e.top0&&e.bottom>I.bottom+m&&(m=e.bottom-I.bottom+a)):e.bottom>I.bottom&&(m=e.bottom-I.bottom+a,A<0&&e.top-m0&&e.right>I.right+f&&(f=e.right-I.right+o)):e.right>I.right&&(f=e.right-I.right+o,A<0&&e.leftI.bottom||e.leftI.right)&&(e={left:Math.max(e.left,I.left),right:Math.min(e.right,I.right),top:Math.max(e.top,I.top),bottom:Math.min(e.bottom,I.bottom)}),g=g.assignedSlot||g.parentNode}else if(g.nodeType==11)g=g.host;else break}function ej(t,e=!0){let A=t.ownerDocument,i=null,n=null;for(let o=t.parentNode;o&&!(o==A.body||(!e||i)&&n);)if(o.nodeType==1)!n&&o.scrollHeight>o.clientHeight&&(n=o),e&&!i&&o.scrollWidth>o.clientWidth&&(i=o),o=o.assignedSlot||o.parentNode;else if(o.nodeType==11)o=o.host;else break;return{x:i,y:n}}var jS=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:A,focusNode:i}=e;this.set(A,Math.min(e.anchorOffset,A?QC(A):0),i,Math.min(e.focusOffset,i?QC(i):0))}set(e,A,i,n){this.anchorNode=e,this.anchorOffset=A,this.focusNode=i,this.focusOffset=n}},O1=null;at.safari&&at.safari_version>=26&&(O1=!1);function tj(t){if(t.setActive)return t.setActive();if(O1)return t.focus(O1);let e=[];for(let A=t;A&&(e.push(A,A.scrollTop,A.scrollLeft),A!=A.ownerDocument);A=A.parentNode);if(t.focus(O1==null?{get preventScroll(){return O1={preventScroll:!0},!0}}:void 0),!O1){O1=!1;for(let A=0;AMath.max(0,t.document.documentElement.scrollHeight-t.innerHeight-4):t.scrollTop>Math.max(1,t.scrollHeight-t.clientHeight-4)}function nj(t,e){for(let A=t,i=e;;){if(A.nodeType==3&&i>0)return{node:A,offset:i};if(A.nodeType==1&&i>0){if(A.contentEditable=="false")return null;A=A.childNodes[i-1],i=QC(A)}else if(A.parentNode&&!uw(A))i=Z2(A),A=A.parentNode;else return null}}function oj(t,e){for(let A=t,i=e;;){if(A.nodeType==3&&i=A){if(r.level==i)return a;(o<0||(n!=0?n<0?r.fromA:e[o].level>r.level))&&(o=a)}}if(o<0)throw new RangeError("Index out of range");return o}};function sj(t,e){if(t.length!=e.length)return!1;for(let A=0;A=0;E-=3)if(B0[E+1]==-d){let f=B0[E+2],m=f&2?n:f&4?f&1?o:n:0;m&&(Wo[C]=Wo[B0[E]]=m),r=E;break}}else{if(B0.length==189)break;B0[r++]=C,B0[r++]=I,B0[r++]=s}else if((h=Wo[C])==2||h==1){let E=h==n;s=E?0:1;for(let f=r-3;f>=0;f-=3){let m=B0[f+2];if(m&2)break;if(E)B0[f+2]|=2;else{if(m&4)break;B0[f+2]|=4}}}}}function xQA(t,e,A,i){for(let n=0,o=i;n<=A.length;n++){let a=n?A[n-1].to:t,r=ns;)h==f&&(h=A[--E].from,f=E?A[E-1].to:t),Wo[--h]=d;s=g}else o=l,s++}}}function VS(t,e,A,i,n,o,a){let r=i%2?2:1;if(i%2==n%2)for(let s=e,l=0;ss&&a.push(new dg(s,E.from,d));let f=E.direction==P1!=!(d%2);WS(t,f?i+1:i,n,E.inner,E.from,E.to,a),s=E.to}h=E.to}else{if(h==A||(g?Wo[h]!=r:Wo[h]==r))break;h++}I?VS(t,s,h,i+1,n,I,a):se;){let g=!0,C=!1;if(!l||s>o[l-1].to){let E=Wo[s-1];E!=r&&(g=!1,C=E==16)}let I=!g&&r==1?[]:null,d=g?i:i+1,h=s;A:for(;;)if(l&&h==o[l-1].to){if(C)break A;let E=o[--l];if(!g)for(let f=E.from,m=l;;){if(f==e)break A;if(m&&o[m-1].to==f)f=o[--m].from;else{if(Wo[f-1]==r)break A;break}}if(I)I.push(E);else{E.toWo.length;)Wo[Wo.length]=256;let i=[],n=e==P1?0:1;return WS(t,n,n,A,0,t.length,i),i}function lj(t){return[new dg(0,t,0)]}var gj="";function RQA(t,e,A,i,n){var o;let a=i.head-t.from,r=dg.find(e,a,(o=i.bidiLevel)!==null&&o!==void 0?o:-1,i.assoc),s=e[r],l=s.side(n,A);if(a==l){let I=r+=n?1:-1;if(I<0||I>=e.length)return null;s=e[r=I],a=s.side(!n,A),l=s.side(n,A)}let g=ja(t.text,a,s.forward(n,A));(gs.to)&&(g=l),gj=t.text.slice(Math.min(a,g),Math.max(a,g));let C=r==(n?e.length-1:0)?null:e[r+(n?1:-1)];return C&&g==l&&C.level+(n?0:1)t.some(e=>e)}),hj=At.define({combine:t=>t.some(e=>e)}),Qj=At.define(),K4=class t{constructor(e,A="nearest",i="nearest",n=5,o=5,a=!1){this.range=e,this.y=A,this.x=i,this.yMargin=n,this.xMargin=o,this.isSnapshot=a}map(e){return e.empty?this:new t(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new t(Ie.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},iw=Wi.define({map:(t,e)=>t.map(e)}),uj=Wi.define();function Sr(t,e,A){let i=t.facet(dj);i.length?i[0](e):window.onerror&&window.onerror(String(e),A,void 0,void 0,e)||(A?console.error(A+":",e):console.error(e))}var EC=At.define({combine:t=>t.length?t[0]:!0}),FQA=0,TE=At.define({combine(t){return t.filter((e,A)=>{for(let i=0;i{let s=[];return a&&s.push(Lw.of(l=>{let g=l.plugin(r);return g?a(g):St.none})),o&&s.push(o(r)),s})}static fromClass(e,A){return t.define((i,n)=>new e(i,n),A)}},U4=class{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let A=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(A)}catch(i){if(Sr(A.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(n){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(A){Sr(e.state,A,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var A;if(!((A=this.value)===null||A===void 0)&&A.destroy)try{this.value.destroy()}catch(i){Sr(e.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},QP=At.define(),ZS=At.define(),Lw=At.define(),fj=At.define(),Jk=At.define(),V4=At.define(),pj=At.define();function uP(t,e){let A=t.state.facet(pj);if(!A.length)return A;let i=A.map(o=>o instanceof Function?o(t):o),n=[];return io.spans(i,e.from,e.to,{point(){},span(o,a,r,s){let l=o-e.from,g=a-e.from,C=n;for(let I=r.length-1;I>=0;I--,s--){let d=r[I].spec.bidiIsolate,h;if(d==null&&(d=NQA(e.text,l,g)),s>0&&C.length&&(h=C[C.length-1]).to==l&&h.direction==d)h.to=g,C=h.inner;else{let E={from:l,to:g,direction:d,inner:[]};C.push(E),C=E.inner}}}}),n}var mj=At.define();function Ok(t){let e=0,A=0,i=0,n=0;for(let o of t.state.facet(mj)){let a=o(t);a&&(a.left!=null&&(e=Math.max(e,a.left)),a.right!=null&&(A=Math.max(A,a.right)),a.top!=null&&(i=Math.max(i,a.top)),a.bottom!=null&&(n=Math.max(n,a.bottom)))}return{left:e,right:A,top:i,bottom:n}}var R4=At.define(),rc=class t{constructor(e,A,i,n){this.fromA=e,this.toA=A,this.fromB=i,this.toB=n}join(e){return new t(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let A=e.length,i=this;for(;A>0;A--){let n=e[A-1];if(!(n.fromA>i.toA)){if(n.toAn.push(new rc(o,a,r,s))),this.changedRanges=n}static create(e,A,i){return new t(e,A,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},LQA=[],wa=class{constructor(e,A,i=0){this.dom=e,this.length=A,this.flags=i,this.parent=null,e.cmTile=this}get breakAfter(){return this.flags&1}get children(){return LQA}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(e){if(this.flags|=2,this.flags&4){this.flags&=-5;let A=this.domAttrs;A&&uQA(this.dom,A)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:"")+(this.breakAfter?"#":"")}destroy(){this.parent=null}setDOM(e){this.dom=e,e.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e,A=this.posAtStart){let i=A;for(let n of this.children){if(n==e)return i;i+=n.length+n.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}covers(e){return!0}coordsIn(e,A){return null}domPosFor(e,A){let i=Z2(this.dom),n=this.length?e>0:A>0;return new E0(this.parent.dom,i+(n?1:0),e==0||e==this.length)}markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&this.parent.flags&2&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let e=this;e;e=e.parent)if(e instanceof jE)return e;return null}static get(e){return e.cmTile}},PE=class extends wa{constructor(e){super(e,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(e){this.children.push(e),e.parent=this}sync(e){if(this.flags&2)return;super.sync(e);let A=this.dom,i=null,n,o=e?.node==A?e:null,a=0;for(let r of this.children){if(r.sync(e),a+=r.length+r.breakAfter,n=i?i.nextSibling:A.firstChild,o&&n!=r.dom&&(o.written=!0),r.dom.parentNode==A)for(;n&&n!=r.dom;)n=fP(n);else A.insertBefore(r.dom,n);i=r.dom}for(n=i?i.nextSibling:A.firstChild,o&&n&&(o.written=!0);n;)n=fP(n);this.length=a}};function fP(t){let e=t.nextSibling;return t.parentNode.removeChild(t),e}var jE=class extends PE{constructor(e,A){super(A),this.view=e}owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}isBlock(){return!0}nearest(e){for(;;){if(!e)return null;let A=wa.get(e);if(A&&this.owns(A))return A;e=e.parentNode}}blockTiles(e){for(let A=[],i=this,n=0,o=0;;)if(n==i.children.length){if(!A.length)return;i=i.parent,i.breakAfter&&o++,n=A.pop()}else{let a=i.children[n++];if(a instanceof hC)A.push(n),i=a,n=0;else{let r=o+a.length,s=e(a,o);if(s!==void 0)return s;o=r+a.breakAfter}}}resolveBlock(e,A){let i,n=-1,o,a=-1;if(this.blockTiles((r,s)=>{let l=s+r.length;if(e>=s&&e<=l){if(r.isWidget()&&A>=-1&&A<=1){if(r.flags&32)return!0;r.flags&16&&(i=void 0)}(se||e==s&&(A>1?r.length:r.covers(-1)))&&(!o||!r.isWidget()&&o.isWidget())&&(o=r,a=e-s)}}),!i&&!o)throw new Error("No tile at position "+e);return i&&A<0||!o?{tile:i,offset:n}:{tile:o,offset:a}}},hC=class t extends PE{constructor(e,A){super(e),this.wrapper=A}isBlock(){return!0}covers(e){return this.children.length?e<0?this.children[0].covers(-1):this.lastChild.covers(1):!1}get domAttrs(){return this.wrapper.attributes}static of(e,A){let i=new t(A||document.createElement(e.tagName),e);return A||(i.flags|=4),i}},qE=class t extends PE{constructor(e,A){super(e),this.attrs=A}isLine(){return!0}static start(e,A,i){let n=new t(A||document.createElement("div"),e);return(!A||!i)&&(n.flags|=4),n}get domAttrs(){return this.attrs}resolveInline(e,A,i){let n=null,o=-1,a=null,r=-1;function s(g,C){for(let I=0,d=0;I=C&&(h.isComposite()?s(h,C-d):(!a||a.isHidden&&(A>0||i&&KQA(a,h)))&&(E>C||h.flags&32)?(a=h,r=C-d):(di&&(e=i);let n=e,o=e,a=0;e==0&&A<0||e==i&&A>=0?at.chrome||at.gecko||(e?(n--,a=1):o=0)?0:r.length-1];return at.safari&&!a&&s.width==0&&(s=Array.prototype.find.call(r,l=>l.width)||s),a?fw(s,a<0):s||null}static of(e,A){let i=new t(A||document.createTextNode(e),e);return A||(i.flags|=2),i}},j1=class t extends wa{constructor(e,A,i,n){super(e,A,n),this.widget=i}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(e){return this.flags&48?!1:(this.flags&(e<0?64:128))>0}coordsIn(e,A){return this.coordsInWidget(e,A,!1)}coordsInWidget(e,A,i){let n=this.widget.coordsAt(this.dom,e,A);if(n)return n;if(i)return fw(this.dom.getBoundingClientRect(),this.length?e==0:A<=0);{let o=this.dom.getClientRects(),a=null;if(!o.length)return null;let r=this.flags&16?!0:this.flags&32?!1:e>0;for(let s=r?o.length-1:0;a=o[s],!(e>0?s==0:s==o.length-1||a.top0;)if(n.isComposite())if(a){if(!e)break;i&&i.break(),e--,a=!1}else if(o==n.children.length){if(!e&&!r.length)break;i&&i.leave(n),a=!!n.breakAfter,{tile:n,index:o}=r.pop(),o++}else{let s=n.children[o],l=s.breakAfter;(A>0?s.length<=e:s.length=0;r--){let s=A.marks[r],l=n.lastChild;if(l instanceof rl&&l.mark.eq(s.mark))l.dom!=s.dom&&l.setDOM(RS(s.dom)),n=l;else{if(this.cache.reused.get(s)){let C=wa.get(s.dom);C&&C.setDOM(RS(s.dom))}let g=rl.of(s.mark,s.dom);n.append(g),n=g}this.cache.reused.set(s,2)}let o=wa.get(e.text);o&&this.cache.reused.set(o,2);let a=new Y1(e.text,e.text.nodeValue);a.flags|=8,n.append(a)}addInlineWidget(e,A,i){let n=this.afterWidget&&e.flags&48&&(this.afterWidget.flags&48)==(e.flags&48);n||this.flushBuffer();let o=this.ensureMarks(A,i);!n&&!(e.flags&16)&&o.append(this.getBuffer(1)),o.append(e),this.pos+=e.length,this.afterWidget=e}addMark(e,A,i){this.flushBuffer(),this.ensureMarks(A,i).append(e),this.pos+=e.length,this.afterWidget=null}addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}continueWidget(e){let A=this.afterWidget||this.lastBlock;A.length+=e,this.pos+=e}addLineStart(e,A){var i;e||(e=wj);let n=qE.start(e,A||((i=this.cache.find(qE))===null||i===void 0?void 0:i.dom),!!A);this.getBlockPos().append(this.lastBlock=this.curLine=n)}addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}ensureLine(e){this.curLine||this.addLineStart(e)}ensureMarks(e,A){var i;let n=this.curLine;for(let o=e.length-1;o>=0;o--){let a=e[o],r;if(A>0&&(r=n.lastChild)&&r instanceof rl&&r.mark.eq(a))n=r,A--;else{let s=rl.of(a,(i=this.cache.find(rl,l=>l.mark.eq(a)))===null||i===void 0?void 0:i.dom);n.append(s),n=s,A=0}}return n}endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChild;(!e||!pP(this.curLine,!1)||e.dom.nodeName!="BR"&&e.isWidget()&&!(at.ios&&pP(this.curLine,!0)))&&this.curLine.append(this.cache.findWidget(NS,0,32)||new j1(NS.toDOM(),0,NS,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let e=this.wrappers.length-1;e>=0;e--)this.wrappers[e].to=this.pos){let A=new $S(e.from,e.to,e.value,e.rank),i=this.wrappers.length;for(;i>0&&(this.wrappers[i-1].rank-A.rank||this.wrappers[i-1].to-A.to)<0;)i--;this.wrappers.splice(i,0,A)}this.wrapperPos=this.pos}getBlockPos(){var e;this.updateBlockWrappers();let A=this.root;for(let i of this.wrappers){let n=A.lastChild;if(i.froma.wrapper.eq(i.wrapper)))===null||e===void 0?void 0:e.dom);A.append(o),A=o}}return A}blockPosCovered(){let e=this.lastBlock;return e!=null&&!e.breakAfter&&(!e.isWidget()||(e.flags&160)>0)}getBuffer(e){let A=2|(e<0?16:32),i=this.cache.find(VE,void 0,1);return i&&(i.flags=A),i||new VE(A)}flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}},ek=class{constructor(e){this.skipCount=0,this.text="",this.textOff=0,this.cursor=e.iter()}skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount+=e-(this.text.length-this.textOff),this.text="",this.textOff=0)}next(e){if(this.textOff==this.text.length){let{value:n,lineBreak:o,done:a}=this.cursor.next(this.skipCount);if(this.skipCount=0,a)throw new Error("Ran out of text content when drawing inline views");this.text=n;let r=this.textOff=Math.min(e,n.length);return o?null:n.slice(0,r)}let A=Math.min(this.text.length,this.textOff+e),i=this.text.slice(this.textOff,A);return this.textOff=A,i}},mw=[j1,qE,Y1,rl,VE,hC,jE];for(let t=0;t[]),this.index=mw.map(()=>0),this.reused=new Map}add(e){let A=e.constructor.bucket,i=this.buckets[A];i.length<6?i.push(e):i[this.index[A]=(this.index[A]+1)%6]=e}find(e,A,i=2){let n=e.bucket,o=this.buckets[n],a=this.index[n];for(let r=o.length-1;r>=0;r--){let s=(r+a)%o.length,l=o[s];if((!A||A(l))&&!this.reused.has(l))return o.splice(s,1),s{if(this.cache.add(a),a.isComposite())return!1},enter:a=>this.cache.add(a),leave:()=>{},break:()=>{}}}run(e,A){let i=A&&this.getCompositionContext(A.text);for(let n=0,o=0,a=0;;){let r=an){let l=s-n;this.preserve(l,!a,!r),n=s,o+=l}if(!r)break;A&&r.fromA<=A.range.fromA&&r.toA>=A.range.toA?(this.forward(r.fromA,A.range.fromA,A.range.fromA{if(a.isWidget())if(this.openWidget)this.builder.continueWidget(s-r);else{let l=s>0||r{a.isLine()?this.builder.addLineStart(a.attrs,this.cache.maybeReuse(a)):(this.cache.add(a),a instanceof rl&&n.unshift(a.mark)),this.openWidget=!1},leave:a=>{a.isLine()?n.length&&(n.length=o=0):a instanceof rl&&(n.shift(),o=Math.min(o,n.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(e)}emit(e,A){let i=null,n=this.builder,o=0,a=io.spans(this.decorations,e,A,{point:(r,s,l,g,C,I)=>{if(l instanceof z1){if(this.disallowBlockEffectsFor[I]){if(l.block)throw new RangeError("Block decorations may not be specified via plugins");if(s>this.view.state.doc.lineAt(r).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}if(o=g.length,C>g.length)n.continueWidget(s-r);else{let d=l.widget||(l.block?mP.block:mP.inline),h=UQA(l),E=this.cache.findWidget(d,s-r,h)||j1.of(d,this.view,s-r,h);l.block?(l.startSide>0&&n.addLineStartIfNotCovered(i),n.addBlockWidget(E)):(n.ensureLine(i),n.addInlineWidget(E,g,C))}i=null}else i=TQA(i,l);s>r&&this.text.skip(s-r)},span:(r,s,l,g)=>{for(let C=r;Co,this.openMarks=a}forward(e,A,i=1){A-e<=10?this.old.advance(A-e,i,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(A-e-10,-1),this.old.advance(5,i,this.reuseWalker))}getCompositionContext(e){let A=[],i=null;for(let n=e.parentNode;;n=n.parentNode){let o=wa.get(n);if(n==this.view.contentDOM)break;o instanceof rl?A.push(o):o?.isLine()?i=o:o instanceof hC||(n.nodeName=="DIV"&&!i&&n!=this.view.contentDOM?i=new qE(n,wj):i||A.push(rl.of(new z4({tagName:n.nodeName.toLowerCase(),attributes:fQA(n)}),n)))}return{line:i,marks:A}}};function pP(t,e){let A=i=>{for(let n of i.children)if((e?n.isText():n.length)||A(n))return!0;return!1};return A(t)}function UQA(t){let e=t.isReplace?(t.startSide<0?64:0)|(t.endSide>0?128:0):t.startSide>0?32:16;return t.block&&(e|=256),e}var wj={class:"cm-line"};function TQA(t,e){let A=e.spec.attributes,i=e.spec.class;return!A&&!i||(t||(t={class:"cm-line"}),A&&Lk(A,t),i&&(t.class+=" "+i)),t}function JQA(t){let e=[];for(let A=t.parents.length;A>1;A--){let i=A==t.parents.length?t.tile:t.parents[A].tile;i instanceof rl&&e.push(i.mark)}return e}function RS(t){let e=wa.get(t);return e&&e.setDOM(t.cloneNode()),t}var mP=(()=>{class t extends sl{constructor(A){super(),this.tag=A}eq(A){return A.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(A){return A.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}return t.inline=new t("span"),t.block=new t("div"),t})(),NS=new class extends sl{toDOM(){return document.createElement("br")}get isHidden(){return!0}get editable(){return!0}},ww=class{constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=St.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new jE(e,e.contentDOM),this.updateInner([new rc(0,0,0,e.state.doc.length)],null)}update(e){var A;let i=e.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:g,toA:C})=>Cthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((A=this.domChanged)===null||A===void 0)&&A.newSel?n=this.domChanged.newSel.head:!VQA(e.changes,this.hasComposition)&&!e.selectionSet&&(n=e.state.selection.main.head));let o=n>-1?YQA(this.view,e.changes,n):null;if(this.domChanged=null,this.hasComposition){let{from:g,to:C}=this.hasComposition;i=new rc(g,C,e.changes.mapPos(g,-1),e.changes.mapPos(C,1)).addToSet(i.slice())}this.hasComposition=o?{from:o.range.fromB,to:o.range.toB}:null,(at.ie||at.chrome)&&!o&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let a=this.decorations,r=this.blockWrappers;this.updateDeco();let s=PQA(a,this.decorations,e.changes);s.length&&(i=rc.extendWithRanges(i,s));let l=jQA(r,this.blockWrappers,e.changes);return l.length&&(i=rc.extendWithRanges(i,l)),o&&!i.some(g=>g.fromA<=o.range.fromA&&g.toA>=o.range.toA)&&(i=o.range.addToSet(i.slice())),this.tile.flags&2&&i.length==0?!1:(this.updateInner(i,o),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,A){this.view.viewState.mustMeasureContent=!0;let{observer:i}=this.view;i.ignore(()=>{if(A||e.length){let a=this.tile,r=new ik(this.view,a,this.blockWrappers,this.decorations,this.dynamicDecorationMap);A&&wa.get(A.text)&&r.cache.reused.set(wa.get(A.text),2),this.tile=r.run(e,A),nk(a,r.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=at.chrome||at.ios?{node:i.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(o),o&&(o.written||i.selectionRange.focusNode!=o.node||!this.tile.dom.contains(o.node))&&(this.forceSelection=!0),this.tile.dom.style.height=""});let n=[];if(this.view.viewport.from||this.view.viewport.to-1)&&L4(i,this.view.observer.selectionRange)&&!(n&&i.contains(n));if(!(o||A||a))return;let r=this.forceSelection;this.forceSelection=!1;let s=this.view.state.selection.main,l,g;if(s.empty?g=l=this.inlineDOMNearPos(s.anchor,s.assoc||1):(g=this.inlineDOMNearPos(s.head,s.head==s.from?1:-1),l=this.inlineDOMNearPos(s.anchor,s.anchor==s.from?1:-1)),at.gecko&&s.empty&&!this.hasComposition&&OQA(l)){let I=document.createTextNode("");this.view.observer.ignore(()=>l.node.insertBefore(I,l.node.childNodes[l.offset]||null)),l=g=new E0(I,0),r=!0}let C=this.view.observer.selectionRange;(r||!C.focusNode||(!G4(l.node,l.offset,C.anchorNode,C.anchorOffset)||!G4(g.node,g.offset,C.focusNode,C.focusOffset))&&!this.suppressWidgetCursorChange(C,s))&&(this.view.observer.ignore(()=>{at.android&&at.chrome&&i.contains(C.focusNode)&&qQA(C.focusNode,i)&&(i.blur(),i.focus({preventScroll:!0}));let I=j4(this.view.root);if(I)if(s.empty){if(at.gecko){let d=HQA(l.node,l.offset);if(d&&d!=3){let h=(d==1?nj:oj)(l.node,l.offset);h&&(l=new E0(h.node,h.offset))}}I.collapse(l.node,l.offset),s.bidiLevel!=null&&I.caretBidiLevel!==void 0&&(I.caretBidiLevel=s.bidiLevel)}else if(I.extend){I.collapse(l.node,l.offset);try{I.extend(g.node,g.offset)}catch(d){}}else{let d=document.createRange();s.anchor>s.head&&([l,g]=[g,l]),d.setEnd(g.node,g.offset),d.setStart(l.node,l.offset),I.removeAllRanges(),I.addRange(d)}a&&this.view.root.activeElement==i&&(i.blur(),n&&n.focus())}),this.view.observer.setSelectionRange(l,g)),this.impreciseAnchor=l.precise?null:new E0(C.anchorNode,C.anchorOffset),this.impreciseHead=g.precise?null:new E0(C.focusNode,C.focusOffset)}suppressWidgetCursorChange(e,A){return this.hasComposition&&A.empty&&G4(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==A.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,A=e.state.selection.main,i=j4(e.root),{anchorNode:n,anchorOffset:o}=e.observer.selectionRange;if(!i||!A.empty||!A.assoc||!i.modify)return;let a=this.lineAt(A.head,A.assoc);if(!a)return;let r=a.posAtStart;if(A.head==r||A.head==r+a.length)return;let s=this.coordsAt(A.head,-1),l=this.coordsAt(A.head,1);if(!s||!l||s.bottom>l.top)return;let g=this.domAtPos(A.head+A.assoc,A.assoc);i.collapse(g.node,g.offset),i.modify("move",A.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let C=e.observer.selectionRange;e.docView.posFromDOM(C.anchorNode,C.anchorOffset)!=A.from&&i.collapse(n,o)}posFromDOM(e,A){let i=this.tile.nearest(e);if(!i)return this.tile.dom.compareDocumentPosition(e)&2?0:this.view.state.doc.length;let n=i.posAtStart;if(i.isComposite()){let o;if(e==i.dom)o=i.dom.childNodes[A];else{let a=QC(e)==0?0:A==0?-1:1;for(;;){let r=e.parentNode;if(r==i.dom)break;a==0&&r.firstChild!=r.lastChild&&(e==r.firstChild?a=-1:a=1),e=r}a<0?o=e:o=e.nextSibling}if(o==i.dom.firstChild)return n;for(;o&&!wa.get(o);)o=o.nextSibling;if(!o)return n+i.length;for(let a=0,r=n;;a++){let s=i.children[a];if(s.dom==o)return r;r+=s.length+s.breakAfter}}else return i.isText()?e==i.dom?n+A:n+(A?i.length:0):n}domAtPos(e,A){let{tile:i,offset:n}=this.tile.resolveBlock(e,A);return i.isWidget()?i.domPosFor(e,A):i.domIn(n,A)}inlineDOMNearPos(e,A){let i,n=-1,o=!1,a,r=-1,s=!1;return this.tile.blockTiles((l,g)=>{if(l.isWidget()){if(l.flags&32&&g>=e)return!0;l.flags&16&&(o=!0)}else{let C=g+l.length;if(g<=e&&(i=l,n=e-g,o=C=e&&!a&&(a=l,r=e-g,s=g>e),g>e&&a)return!0}}),!i&&!a?this.domAtPos(e,A):(o&&a?i=null:s&&i&&(a=null),i&&A<0||!a?i.domIn(n,A):a.domIn(r,A))}coordsAt(e,A){let{tile:i,offset:n}=this.tile.resolveBlock(e,A);return i.isWidget()?i.widget instanceof T4?null:i.coordsInWidget(n,A,!0):i.coordsIn(n,A)}lineAt(e,A){let{tile:i}=this.tile.resolveBlock(e,A);return i.isLine()?i:null}coordsForChar(e){let{tile:A,offset:i}=this.tile.resolveBlock(e,1);if(!A.isLine())return null;function n(o,a){if(o.isComposite())for(let r of o.children){if(r.length>=a){let s=n(r,a);if(s)return s}if(a-=r.length,a<0)break}else if(o.isText()&&aMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,r=-1,s=this.view.textDirection==mo.LTR,l=0,g=(C,I,d)=>{for(let h=0;hn);h++){let E=C.children[h],f=I+E.length,m=E.dom.getBoundingClientRect(),{height:v}=m;if(d&&!h&&(l+=m.top-d.top),E instanceof hC)f>i&&g(E,I,m);else if(I>=i&&(l>0&&A.push(-l),A.push(v+l),l=0,a)){let k=E.dom.lastChild,S=k?Cw(k):[];if(S.length){let b=S[S.length-1],x=s?b.right-m.left:m.right-b.left;x>r&&(r=x,this.minWidth=o,this.minWidthFrom=I,this.minWidthTo=f)}}d&&h==C.children.length-1&&(l+=d.bottom-m.bottom),I=f+E.breakAfter}};return g(this.tile,0,null),A}textDirectionAt(e){let{tile:A}=this.tile.resolveBlock(e,1);return getComputedStyle(A.dom).direction=="rtl"?mo.RTL:mo.LTR}measureTextSize(){let e=this.tile.blockTiles(a=>{if(a.isLine()&&a.children.length&&a.length<=20){let r=0,s;for(let l of a.children){if(!l.isText()||/[^ -~]/.test(l.text))return;let g=Cw(l.dom);if(g.length!=1)return;r+=g[0].width,s=g[0].height}if(r)return{lineHeight:a.dom.getBoundingClientRect().height,charWidth:r/a.length,textHeight:s}}});if(e)return e;let A=document.createElement("div"),i,n,o;return A.className="cm-line",A.style.width="99999px",A.style.position="absolute",A.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.tile.dom.appendChild(A);let a=Cw(A.firstChild)[0];i=A.getBoundingClientRect().height,n=a&&a.width?a.width/27:7,o=a&&a.height?a.height:i,A.remove()}),{lineHeight:i,charWidth:n,textHeight:o}}computeBlockGapDeco(){let e=[],A=this.view.viewState;for(let i=0,n=0;;n++){let o=n==A.viewports.length?null:A.viewports[n],a=o?o.from-1:this.view.state.doc.length;if(a>i){let r=(A.lineBlockAt(a).bottom-A.lineBlockAt(i).top)/this.view.scaleY;e.push(St.replace({widget:new T4(r),block:!0,inclusive:!0,isBlockGap:!0}).range(i,a))}if(!o)break;i=o.to+1}return St.set(e)}updateDeco(){let e=1,A=this.view.state.facet(Lw).map(o=>(this.dynamicDecorationMap[e++]=typeof o=="function")?o(this.view):o),i=!1,n=this.view.state.facet(Jk).map((o,a)=>{let r=typeof o=="function";return r&&(i=!0),r?o(this.view):o});for(n.length&&(this.dynamicDecorationMap[e++]=i,A.push(io.join(n))),this.decorations=[this.editContextFormatting,...A,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];etypeof o=="function"?o(this.view):o)}scrollIntoView(e){var A;if(e.isSnapshot){let g=this.view.viewState.lineBlockAt(e.range.head);this.view.scrollDOM.scrollTop=g.top-e.yMargin,this.view.scrollDOM.scrollLeft=e.xMargin;return}for(let g of this.view.state.facet(Qj))try{if(g(this.view,e.range,e))return!0}catch(C){Sr(this.view.state,C,"scroll handler")}let{range:i}=e,n=this.coordsAt(i.head,(A=i.assoc)!==null&&A!==void 0?A:i.empty?0:i.head>i.anchor?-1:1),o;if(!n)return;!i.empty&&(o=this.coordsAt(i.anchor,i.anchor>i.head?-1:1))&&(n={left:Math.min(n.left,o.left),top:Math.min(n.top,o.top),right:Math.max(n.right,o.right),bottom:Math.max(n.bottom,o.bottom)});let a=Ok(this.view),r={left:n.left-a.left,top:n.top-a.top,right:n.right+a.right,bottom:n.bottom+a.bottom},{offsetWidth:s,offsetHeight:l}=this.view.scrollDOM;if(wQA(this.view.scrollDOM,r,i.head1&&(n.top>window.pageYOffset+window.visualViewport.offsetTop+window.visualViewport.height||n.bottomi.isWidget()||i.children.some(A);return A(this.tile.resolveBlock(e,1).tile)}destroy(){nk(this.tile)}};function nk(t,e){let A=e?.get(t);if(A!=1){A==null&&t.destroy();for(let i of t.children)nk(i,e)}}function OQA(t){return t.node.nodeType==1&&t.node.firstChild&&(t.offset==0||t.node.childNodes[t.offset-1].contentEditable=="false")&&(t.offset==t.node.childNodes.length||t.node.childNodes[t.offset].contentEditable=="false")}function Dj(t,e){let A=t.observer.selectionRange;if(!A.focusNode)return null;let i=nj(A.focusNode,A.focusOffset),n=oj(A.focusNode,A.focusOffset),o=i||n;if(n&&i&&n.node!=i.node){let r=wa.get(n.node);if(!r||r.isText()&&r.text!=n.node.nodeValue)o=n;else if(t.docView.lastCompositionAfterCursor){let s=wa.get(i.node);!s||s.isText()&&s.text!=i.node.nodeValue||(o=n)}}if(t.docView.lastCompositionAfterCursor=o!=i,!o)return null;let a=e-o.offset;return{from:a,to:a+o.node.nodeValue.length,node:o.node}}function YQA(t,e,A){let i=Dj(t,A);if(!i)return null;let{node:n,from:o,to:a}=i,r=n.nodeValue;if(/[\n\r]/.test(r)||t.state.doc.sliceString(i.from,i.to)!=r)return null;let s=e.invertedDesc;return{range:new rc(s.mapPos(o),s.mapPos(a),o,a),text:n}}function HQA(t,e){return t.nodeType!=1?0:(e&&t.childNodes[e-1].contentEditable=="false"?1:0)|(e{ie.from&&(A=!0)}),A}var T4=class extends sl{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}};function WQA(t,e,A=1){let i=t.charCategorizer(e),n=t.doc.lineAt(e),o=e-n.from;if(n.length==0)return Ie.cursor(e);o==0?A=1:o==n.length&&(A=-1);let a=o,r=o;A<0?a=ja(n.text,o,!1):r=ja(n.text,o);let s=i(n.text.slice(a,r));for(;a>0;){let l=ja(n.text,a,!1);if(i(n.text.slice(l,a))!=s)break;a=l}for(;rt.defaultLineHeight*1.5){let r=t.viewState.heightOracle.textHeight,s=Math.floor((n-A.top-(t.defaultLineHeight-r)*.5)/r);o+=s*t.viewState.heightOracle.lineLength}let a=t.state.sliceDoc(A.from,A.to);return A.from+ew(a,o,t.state.tabSize)}function ak(t,e,A){let i=t.lineBlockAt(e);if(Array.isArray(i.type)){let n;for(let o of i.type){if(o.from>e)break;if(!(o.toe)return o;(!n||o.type==Vr.Text&&(n.type!=o.type||(A<0?o.frome)))&&(n=o)}}return n||i}return i}function XQA(t,e,A,i){let n=ak(t,e.head,e.assoc||-1),o=!i||n.type!=Vr.Text||!(t.lineWrapping||n.widgetLineBreaks)?null:t.coordsAtPos(e.assoc<0&&e.head>n.from?e.head-1:e.head);if(o){let a=t.dom.getBoundingClientRect(),r=t.textDirectionAt(n.from),s=t.posAtCoords({x:A==(r==mo.LTR)?a.right-1:a.left+1,y:(o.top+o.bottom)/2});if(s!=null)return Ie.cursor(s,A?-1:1)}return Ie.cursor(A?n.to:n.from,A?-1:1)}function wP(t,e,A,i){let n=t.state.doc.lineAt(e.head),o=t.bidiSpans(n),a=t.textDirectionAt(n.from);for(let r=e,s=null;;){let l=RQA(n,o,a,r,A),g=gj;if(!l){if(n.number==(A?t.state.doc.lines:1))return r;g=` -`,n=t.state.doc.line(n.number+(A?1:-1)),o=t.bidiSpans(n),l=t.visualLineSide(n,!A)}if(s){if(!s(g))return r}else{if(!i)return l;s=i(g)}r=l}}function $QA(t,e,A){let i=t.state.charCategorizer(e),n=i(A);return o=>{let a=i(o);return n==Uo.Space&&(n=a),n==a}}function AuA(t,e,A,i){let n=e.head,o=A?1:-1;if(n==(A?t.state.doc.length:0))return Ie.cursor(n,e.assoc);let a=e.goalColumn,r,s=t.contentDOM.getBoundingClientRect(),l=t.coordsAtPos(n,e.assoc||((e.empty?A:e.head==e.from)?1:-1)),g=t.documentTop;if(l)a==null&&(a=l.left-s.left),r=o<0?l.top:l.bottom;else{let h=t.viewState.lineBlockAt(n);a==null&&(a=Math.min(s.right-s.left,t.defaultCharacterWidth*(n-h.from))),r=(o<0?h.top:h.bottom)+g}let C=s.left+a,I=t.viewState.heightOracle.textHeight>>1,d=i??I;for(let h=0;;h+=I){let E=r+(d+h)*o,f=rk(t,{x:C,y:E},!1,o);if(A?E>s.bottom:Er:v{if(e>o&&en(t)),A.from,e.head>A.from?-1:1);return i==A.from?A:Ie.cursor(i,it.viewState.docHeight)return new Ig(t.state.doc.length,-1);if(l=t.elementAtHeight(s),i==null)break;if(l.type==Vr.Text){if(i<0?l.tot.viewport.to)break;let I=t.docView.coordsAt(i<0?l.from:l.to,i>0?-1:1);if(I&&(i<0?I.top<=s+o:I.bottom>=s+o))break}let C=t.viewState.heightOracle.textHeight/2;s=i>0?l.bottom+C:l.top-C}if(t.viewport.from>=l.to||t.viewport.to<=l.from){if(A)return null;if(l.type==Vr.Text){let C=ZQA(t,n,l,a,r);return new Ig(C,C==l.from?1:-1)}}if(l.type!=Vr.Text)return s<(l.top+l.bottom)/2?new Ig(l.from,1):new Ig(l.to,-1);let g=t.docView.lineAt(l.from,2);return(!g||g.length!=l.length)&&(g=t.docView.lineAt(l.from,-2)),new sk(t,a,r,t.textDirectionAt(l.from)).scanTile(g,l.from)}var sk=class{constructor(e,A,i,n){this.view=e,this.x=A,this.y=i,this.baseDir=n,this.line=null,this.spans=null}bidiSpansAt(e){return(!this.line||this.line.from>e||this.line.to1||i.length&&(i[0].level!=this.baseDir||i[0].to+n.from>1;e:if(o.has(h)){let f=i+Math.floor(Math.random()*d);for(let m=0;m1)){if(m.bottomthis.y)(!s||s.top>m.top)&&(s=m),v=-1;else{let k=m.left>this.x?this.x-m.left:m.right(C.left+C.right)/2==I}}scanText(e,A){let i=[];for(let o=0;o{let a=i[o]-A,r=i[o+1]-A;return q4(e.dom,a,r).getClientRects()});return n.after?new Ig(i[n.i+1],-1):new Ig(i[n.i],1)}scanTile(e,A){if(!e.length)return new Ig(A,1);if(e.children.length==1){let r=e.children[0];if(r.isText())return this.scanText(r,A);if(r.isComposite())return this.scanTile(r,A)}let i=[A];for(let r=0,s=A;r{let s=e.children[r];return s.flags&48?null:(s.dom.nodeType==1?s.dom:q4(s.dom,0,s.length)).getClientRects()}),o=e.children[n.i],a=i[n.i];return o.isText()?this.scanText(o,a):o.isComposite()?this.scanTile(o,a):n.after?new Ig(i[n.i+1],-1):new Ig(a,1)}},UE="\uFFFF",lk=class{constructor(e,A){this.points=e,this.view=A,this.text="",this.lineSeparator=A.state.facet(qa.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=UE}readRange(e,A){if(!e)return this;let i=e.parentNode;for(let n=e;;){this.findPointBefore(i,n);let o=this.text.length;this.readNode(n);let a=wa.get(n),r=n.nextSibling;if(r==A){a?.breakAfter&&!r&&i!=this.view.contentDOM&&this.lineBreak();break}let s=wa.get(r);(a&&s?a.breakAfter:(a?a.breakAfter:uw(n))||uw(r)&&(n.nodeName!="BR"||a?.isWidget())&&this.text.length>o)&&!tuA(r,A)&&this.lineBreak(),n=r}return this.findPointBefore(i,A),this}readTextNode(e){let A=e.nodeValue;for(let i of this.points)i.node==e&&(i.pos=this.text.length+Math.min(i.offset,A.length));for(let i=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let o=-1,a=1,r;if(this.lineSeparator?(o=A.indexOf(this.lineSeparator,i),a=this.lineSeparator.length):(r=n.exec(A))&&(o=r.index,a=r[0].length),this.append(A.slice(i,o<0?A.length:o)),o<0)break;if(this.lineBreak(),a>1)for(let s of this.points)s.node==e&&s.pos>this.text.length&&(s.pos-=a-1);i=o+a}}readNode(e){let A=wa.get(e),i=A&&A.overrideDOMText;if(i!=null){this.findPointInside(e,i.length);for(let n=i.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else e.nodeType==3?this.readTextNode(e):e.nodeName=="BR"?e.nextSibling&&this.lineBreak():e.nodeType==1&&this.readRange(e.firstChild,null)}findPointBefore(e,A){for(let i of this.points)i.node==e&&e.childNodes[i.offset]==A&&(i.pos=this.text.length)}findPointInside(e,A){for(let i of this.points)(e.nodeType==3?i.node==e:e.contains(i.node))&&(i.pos=this.text.length+(euA(e,i.node,i.offset)?A:0))}};function euA(t,e,A){for(;;){if(!e||A-1;let{impreciseHead:o,impreciseAnchor:a}=e.docView,r=e.state.selection;if(e.state.readOnly&&A>-1)this.newSel=null;else if(A>-1&&(this.bounds=vj(e.docView.tile,A,i,0))){let s=o||a?[]:nuA(e),l=new lk(s,e);l.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=l.text,this.newSel=ouA(s,this.bounds.from)}else{let s=e.observer.selectionRange,l=o&&o.node==s.focusNode&&o.offset==s.focusOffset||!PS(e.contentDOM,s.focusNode)?r.main.head:e.docView.posFromDOM(s.focusNode,s.focusOffset),g=a&&a.node==s.anchorNode&&a.offset==s.anchorOffset||!PS(e.contentDOM,s.anchorNode)?r.main.anchor:e.docView.posFromDOM(s.anchorNode,s.anchorOffset),C=e.viewport;if((at.ios||at.chrome)&&r.main.empty&&l!=g&&(C.from>0||C.to-1&&r.ranges.length>1)this.newSel=r.replaceRange(Ie.range(g,l));else if(e.lineWrapping&&g==l&&!(r.main.empty&&r.main.head==l)&&e.inputState.lastTouchTime>Date.now()-100){let I=e.coordsAtPos(l,-1),d=0;I&&(d=e.inputState.lastTouchY<=I.bottom?-1:1),this.newSel=Ie.create([Ie.cursor(l,d)])}else this.newSel=Ie.single(g,l)}}};function vj(t,e,A,i){if(t.isComposite()){let n=-1,o=-1,a=-1,r=-1;for(let s=0,l=i,g=i;sA)return vj(C,e,A,l);if(I>=e&&n==-1&&(n=s,o=l),l>A&&C.dom.parentNode==t.dom){a=s,r=g;break}g=I,l=I+C.breakAfter}return{from:o,to:r<0?i+t.length:r,startDOM:(n?t.children[n-1].dom.nextSibling:null)||t.dom.firstChild,endDOM:a=0?t.children[a].dom:null}}else return t.isText()?{from:i,to:i+t.length,startDOM:t.dom,endDOM:t.dom.nextSibling}:null}function bj(t,e){let A,{newSel:i}=e,{state:n}=t,o=n.selection.main,a=t.inputState.lastKeyTime>Date.now()-100?t.inputState.lastKeyCode:-1;if(e.bounds){let{from:r,to:s}=e.bounds,l=o.from,g=null;(a===8||at.android&&e.text.length=r&&o.to<=s&&(e.typeOver||C!=e.text)&&C.slice(0,o.from-r)==e.text.slice(0,o.from-r)&&C.slice(o.to-r)==e.text.slice(I=e.text.length-(C.length-(o.to-r)))?A={from:o.from,to:o.to,insert:bn.of(e.text.slice(o.from-r,I).split(UE))}:(d=Mj(C,e.text,l-r,g))&&(at.chrome&&a==13&&d.toB==d.from+2&&e.text.slice(d.from,d.toB)==UE+UE&&d.toB--,A={from:r+d.from,to:r+d.toA,insert:bn.of(e.text.slice(d.from,d.toB).split(UE))})}else i&&(!t.hasFocus&&n.facet(EC)||yw(i,o))&&(i=null);if(!A&&!i)return!1;if((at.mac||at.android)&&A&&A.from==A.to&&A.from==o.head-1&&/^\. ?$/.test(A.insert.toString())&&t.contentDOM.getAttribute("autocorrect")=="off"?(i&&A.insert.length==2&&(i=Ie.single(i.main.anchor-1,i.main.head-1)),A={from:A.from,to:A.to,insert:bn.of([A.insert.toString().replace("."," ")])}):n.doc.lineAt(o.from).toDate.now()-50?A={from:o.from,to:o.to,insert:n.toText(t.inputState.insertingText)}:at.chrome&&A&&A.from==A.to&&A.from==o.head&&A.insert.toString()==` - `&&t.lineWrapping&&(i&&(i=Ie.single(i.main.anchor-1,i.main.head-1)),A={from:o.from,to:o.to,insert:bn.of([" "])}),A)return Yk(t,A,i,a);if(i&&!yw(i,o)){let r=!1,s="select";return t.inputState.lastSelectionTime>Date.now()-50&&(t.inputState.lastSelectionOrigin=="select"&&(r=!0),s=t.inputState.lastSelectionOrigin,s=="select.pointer"&&(i=yj(n.facet(V4).map(l=>l(t)),i))),t.dispatch({selection:i,scrollIntoView:r,userEvent:s}),!0}else return!1}function Yk(t,e,A,i=-1){if(at.ios&&t.inputState.flushIOSKey(e))return!0;let n=t.state.selection.main;if(at.android&&(e.to==n.to&&(e.from==n.from||e.from==n.from-1&&t.state.sliceDoc(e.from,n.from)==" ")&&e.insert.length==1&&e.insert.lines==2&&zE(t.contentDOM,"Enter",13)||(e.from==n.from-1&&e.to==n.to&&e.insert.length==0||i==8&&e.insert.lengthn.head)&&zE(t.contentDOM,"Backspace",8)||e.from==n.from&&e.to==n.to+1&&e.insert.length==0&&zE(t.contentDOM,"Delete",46)))return!0;let o=e.insert.toString();t.inputState.composing>=0&&t.inputState.composing++;let a,r=()=>a||(a=iuA(t,e,A));return t.state.facet(Bj).some(s=>s(t,e.from,e.to,o,r))||t.dispatch(r()),!0}function iuA(t,e,A){let i,n=t.state,o=n.selection.main,a=-1;if(e.from==e.to&&e.fromo.to){let s=e.fromC(t)),l,s);e.from==g&&(a=g)}if(a>-1)i={changes:e,selection:Ie.cursor(e.from+e.insert.length,-1)};else if(e.from>=o.from&&e.to<=o.to&&e.to-e.from>=(o.to-o.from)/3&&(!A||A.main.empty&&A.main.from==e.from+e.insert.length)&&t.inputState.composing<0){let s=o.frome.to?n.sliceDoc(e.to,o.to):"";i=n.replaceSelection(t.state.toText(s+e.insert.sliceString(0,void 0,t.state.lineBreak)+l))}else{let s=n.changes(e),l=A&&A.main.to<=s.newLength?A.main:void 0;if(n.selection.ranges.length>1&&(t.inputState.composing>=0||t.inputState.compositionPendingChange)&&e.to<=o.to+10&&e.to>=o.to-10){let g=t.state.sliceDoc(e.from,e.to),C,I=A&&Dj(t,A.main.head);if(I){let h=e.insert.length-(e.to-e.from);C={from:I.from,to:I.to-h}}else C=t.state.doc.lineAt(o.head);let d=o.to-e.to;i=n.changeByRange(h=>{if(h.from==o.from&&h.to==o.to)return{changes:s,range:l||h.map(s)};let E=h.to-d,f=E-g.length;if(t.state.sliceDoc(f,E)!=g||E>=C.from&&f<=C.to)return{range:h};let m=n.changes({from:f,to:E,insert:e.insert}),v=h.to-o.to;return{changes:m,range:l?Ie.range(Math.max(0,l.anchor+v),Math.max(0,l.head+v)):h.map(m)}})}else i={changes:s,selection:l&&n.selection.replaceRange(l)}}let r="input.type";return(t.composing||t.inputState.compositionPendingChange&&t.inputState.compositionEndedAt>Date.now()-50)&&(t.inputState.compositionPendingChange=!1,r+=".compose",t.inputState.compositionFirstChange&&(r+=".start",t.inputState.compositionFirstChange=!1)),n.update(i,{userEvent:r,scrollIntoView:!0})}function Mj(t,e,A,i){let n=Math.min(t.length,e.length),o=0;for(;o0&&r>0&&t.charCodeAt(a-1)==e.charCodeAt(r-1);)a--,r--;if(i=="end"){let s=Math.max(0,o-Math.min(a,r));A-=a+s-o}if(a=a?o-A:0;o-=s,r=o+(r-a),a=o}else if(r=r?o-A:0;o-=s,a=o+(a-r),r=o}return{from:o,toA:a,toB:r}}function nuA(t){let e=[];if(t.root.activeElement!=t.contentDOM)return e;let{anchorNode:A,anchorOffset:i,focusNode:n,focusOffset:o}=t.observer.selectionRange;return A&&(e.push(new Dw(A,i)),(n!=A||o!=i)&&e.push(new Dw(n,o))),e}function ouA(t,e){if(t.length==0)return null;let A=t[0].pos,i=t.length==2?t[1].pos:A;return A>-1&&i>-1?Ie.single(A+e,i+e):null}function yw(t,e){return e.head==t.main.head&&e.anchor==t.main.anchor}var ck=class{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastTouchX=0,this.lastTouchY=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.lastWheelEvent=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText="",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,at.safari&&e.contentDOM.addEventListener("input",()=>null),at.gecko&&uuA(e.contentDOM.ownerDocument)}handleEvent(e){!CuA(this.view,e)||this.ignoreDuringComposition(e)||e.type=="keydown"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,A){let i=this.handlers[e];if(i){for(let n of i.observers)n(this.view,A);for(let n of i.handlers){if(A.defaultPrevented)break;if(n(this.view,A)){A.preventDefault();break}}}}ensureHandlers(e){let A=auA(e),i=this.handlers,n=this.view.contentDOM;for(let o in A)if(o!="scroll"){let a=!A[o].handlers.length,r=i[o];r&&a!=!r.handlers.length&&(n.removeEventListener(o,this.handleEvent),r=null),r||n.addEventListener(o,this.handleEvent,{passive:a})}for(let o in i)o!="scroll"&&!A[o]&&n.removeEventListener(o,this.handleEvent);this.handlers=A}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&kj.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),at.android&&at.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;let A;return at.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&!e.shiftKey&&((A=Sj.find(i=>i.keyCode==e.keyCode))&&!e.ctrlKey||ruA.indexOf(e.key)>-1&&e.ctrlKey)?(this.pendingIOSKey=A||e,setTimeout(()=>this.flushIOSKey(),250),!0):(e.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(e){let A=this.pendingIOSKey;return!A||A.key=="Enter"&&e&&e.from0?!0:at.safari&&!at.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function DP(t,e){return(A,i)=>{try{return e.call(t,i,A)}catch(n){Sr(A.state,n)}}}function auA(t){let e=Object.create(null);function A(i){return e[i]||(e[i]={observers:[],handlers:[]})}for(let i of t){let n=i.spec,o=n&&n.plugin.domEventHandlers,a=n&&n.plugin.domEventObservers;if(o)for(let r in o){let s=o[r];s&&A(r).handlers.push(DP(i.value,s))}if(a)for(let r in a){let s=a[r];s&&A(r).observers.push(DP(i.value,s))}}for(let i in sc)A(i).handlers.push(sc[i]);for(let i in ll)A(i).observers.push(ll[i]);return e}var Sj=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],ruA="dthko",kj=[16,17,18,20,91,92,224,225],nw=6;function ow(t){return Math.max(0,t)*.7+8}function suA(t,e){return Math.max(Math.abs(t.clientX-e.clientX),Math.abs(t.clientY-e.clientY))}var Ck=class{constructor(e,A,i,n){this.view=e,this.startEvent=A,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=A,this.scrollParents=ej(e.contentDOM),this.atoms=e.state.facet(V4).map(a=>a(e));let o=e.contentDOM.ownerDocument;o.addEventListener("mousemove",this.move=this.move.bind(this)),o.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=A.shiftKey,this.multiple=e.state.facet(qa.allowMultipleSelections)&&luA(e,A),this.dragging=cuA(e,A)&&Rj(A)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&suA(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let A=0,i=0,n=0,o=0,a=this.view.win.innerWidth,r=this.view.win.innerHeight;this.scrollParents.x&&({left:n,right:a}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:o,bottom:r}=this.scrollParents.y.getBoundingClientRect());let s=Ok(this.view);e.clientX-s.left<=n+nw?A=-ow(n-e.clientX):e.clientX+s.right>=a-nw&&(A=ow(e.clientX-a)),e.clientY-s.top<=o+nw?i=-ow(o-e.clientY):e.clientY+s.bottom>=r-nw&&(i=ow(e.clientY-r)),this.setScrollSpeed(A,i)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,A){this.scrollSpeed={x:e,y:A},e||A?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:A}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),A&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=A,A=0),(e||A)&&this.view.win.scrollBy(e,A),this.dragging===!1&&this.select(this.lastEvent)}select(e){let{view:A}=this,i=yj(this.atoms,this.style.get(e,this.extend,this.multiple));(this.mustSelect||!i.eq(A.state.selection,this.dragging===!1))&&this.view.dispatch({selection:i,userEvent:"select.pointer"}),this.mustSelect=!1}update(e){e.transactions.some(A=>A.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}};function luA(t,e){let A=t.state.facet(cj);return A.length?A[0](e):at.mac?e.metaKey:e.ctrlKey}function guA(t,e){let A=t.state.facet(Cj);return A.length?A[0](e):at.mac?!e.altKey:!e.ctrlKey}function cuA(t,e){let{main:A}=t.state.selection;if(A.empty)return!1;let i=j4(t.root);if(!i||i.rangeCount==0)return!0;let n=i.getRangeAt(0).getClientRects();for(let o=0;o=e.clientX&&a.top<=e.clientY&&a.bottom>=e.clientY)return!0}return!1}function CuA(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let A=e.target,i;A!=t.contentDOM;A=A.parentNode)if(!A||A.nodeType==11||(i=wa.get(A))&&i.isWidget()&&!i.isHidden&&i.widget.ignoreEvent(e))return!1;return!0}var sc=Object.create(null),ll=Object.create(null),xj=at.ie&&at.ie_version<15||at.ios&&at.webkit_version<604;function IuA(t){let e=t.dom.parentNode;if(!e)return;let A=e.appendChild(document.createElement("textarea"));A.style.cssText="position: fixed; left: -10000px; top: 10px",A.focus(),setTimeout(()=>{t.focus(),A.remove(),_j(t,A.value)},50)}function Gw(t,e,A){for(let i of t.facet(e))A=i(A,t);return A}function _j(t,e){e=Gw(t.state,Uk,e);let{state:A}=t,i,n=1,o=A.toText(e),a=o.lines==A.selection.ranges.length;if(Ik!=null&&A.selection.ranges.every(s=>s.empty)&&Ik==o.toString()){let s=-1;i=A.changeByRange(l=>{let g=A.doc.lineAt(l.from);if(g.from==s)return{range:l};s=g.from;let C=A.toText((a?o.line(n++).text:e)+A.lineBreak);return{changes:{from:g.from,insert:C},range:Ie.cursor(l.from+C.length)}})}else a?i=A.changeByRange(s=>{let l=o.line(n++);return{changes:{from:s.from,to:s.to,insert:l.text},range:Ie.cursor(s.from+l.length)}}):i=A.replaceSelection(o);t.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}ll.scroll=t=>{t.inputState.lastScrollTop=t.scrollDOM.scrollTop,t.inputState.lastScrollLeft=t.scrollDOM.scrollLeft};ll.wheel=ll.mousewheel=t=>{t.inputState.lastWheelEvent=Date.now()};sc.keydown=(t,e)=>(t.inputState.setSelectionOrigin("select"),e.keyCode==27&&t.inputState.tabFocusMode!=0&&(t.inputState.tabFocusMode=Date.now()+2e3),!1);ll.touchstart=(t,e)=>{let A=t.inputState,i=e.targetTouches[0];A.lastTouchTime=Date.now(),i&&(A.lastTouchX=i.clientX,A.lastTouchY=i.clientY),A.setSelectionOrigin("select.pointer")};ll.touchmove=t=>{t.inputState.setSelectionOrigin("select.pointer")};sc.mousedown=(t,e)=>{if(t.observer.flush(),t.inputState.lastTouchTime>Date.now()-2e3)return!1;let A=null;for(let i of t.state.facet(Ij))if(A=i(t,e),A)break;if(!A&&e.button==0&&(A=BuA(t,e)),A){let i=!t.hasFocus;t.inputState.startMouseSelection(new Ck(t,e,A,i)),i&&t.observer.ignore(()=>{tj(t.contentDOM);let o=t.root.activeElement;o&&!o.contains(t.contentDOM)&&o.blur()});let n=t.inputState.mouseSelection;if(n)return n.start(e),n.dragging===!1}else t.inputState.setSelectionOrigin("select.pointer");return!1};function yP(t,e,A,i){if(i==1)return Ie.cursor(e,A);if(i==2)return WQA(t.state,e,A);{let n=t.docView.lineAt(e,A),o=t.state.doc.lineAt(n?n.posAtEnd:e),a=n?n.posAtStart:o.from,r=n?n.posAtEnd:o.to;return rDate.now()-400&&Math.abs(e.clientX-t.clientX)<2&&Math.abs(e.clientY-t.clientY)<2?(bP+1)%3:1}function BuA(t,e){let A=t.posAndSideAtCoords({x:e.clientX,y:e.clientY},!1),i=Rj(e),n=t.state.selection;return{update(o){o.docChanged&&(A.pos=o.changes.mapPos(A.pos),n=n.map(o.changes))},get(o,a,r){let s=t.posAndSideAtCoords({x:o.clientX,y:o.clientY},!1),l,g=yP(t,s.pos,s.assoc,i);if(A.pos!=s.pos&&!a){let C=yP(t,A.pos,A.assoc,i),I=Math.min(C.from,g.from),d=Math.max(C.to,g.to);g=I1&&(l=EuA(n,s.pos))?l:r?n.addRange(g):Ie.create([g])}}}function EuA(t,e){for(let A=0;A=e)return Ie.create(t.ranges.slice(0,A).concat(t.ranges.slice(A+1)),t.mainIndex==A?0:t.mainIndex-(t.mainIndex>A?1:0))}return null}sc.dragstart=(t,e)=>{let{selection:{main:A}}=t.state;if(e.target.draggable){let n=t.docView.tile.nearest(e.target);if(n&&n.isWidget()){let o=n.posAtStart,a=o+n.length;(o>=A.to||a<=A.from)&&(A=Ie.range(o,a))}}let{inputState:i}=t;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=A,e.dataTransfer&&(e.dataTransfer.setData("Text",Gw(t.state,Tk,t.state.sliceDoc(A.from,A.to))),e.dataTransfer.effectAllowed="copyMove"),!1};sc.dragend=t=>(t.inputState.draggedContent=null,!1);function SP(t,e,A,i){if(A=Gw(t.state,Uk,A),!A)return;let n=t.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:o}=t.inputState,a=i&&o&&guA(t,e)?{from:o.from,to:o.to}:null,r={from:n,insert:A},s=t.state.changes(a?[a,r]:r);t.focus(),t.dispatch({changes:s,selection:{anchor:s.mapPos(n,-1),head:s.mapPos(n,1)},userEvent:a?"move.drop":"input.drop"}),t.inputState.draggedContent=null}sc.drop=(t,e)=>{if(!e.dataTransfer)return!1;if(t.state.readOnly)return!0;let A=e.dataTransfer.files;if(A&&A.length){let i=Array(A.length),n=0,o=()=>{++n==A.length&&SP(t,e,i.filter(a=>a!=null).join(t.state.lineBreak),!1)};for(let a=0;a{/[\x00-\x08\x0e-\x1f]{2}/.test(r.result)||(i[a]=r.result),o()},r.readAsText(A[a])}return!0}else{let i=e.dataTransfer.getData("Text");if(i)return SP(t,e,i,!0),!0}return!1};sc.paste=(t,e)=>{if(t.state.readOnly)return!0;t.observer.flush();let A=xj?null:e.clipboardData;return A?(_j(t,A.getData("text/plain")||A.getData("text/uri-list")),!0):(IuA(t),!1)};function huA(t,e){let A=t.dom.parentNode;if(!A)return;let i=A.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=e,i.focus(),i.selectionEnd=e.length,i.selectionStart=0,setTimeout(()=>{i.remove(),t.focus()},50)}function QuA(t){let e=[],A=[],i=!1;for(let n of t.selection.ranges)n.empty||(e.push(t.sliceDoc(n.from,n.to)),A.push(n));if(!e.length){let n=-1;for(let{from:o}of t.selection.ranges){let a=t.doc.lineAt(o);a.number>n&&(e.push(a.text),A.push({from:a.from,to:Math.min(t.doc.length,a.to+1)})),n=a.number}i=!0}return{text:Gw(t,Tk,e.join(t.lineBreak)),ranges:A,linewise:i}}var Ik=null;sc.copy=sc.cut=(t,e)=>{if(!L4(t.contentDOM,t.observer.selectionRange))return!1;let{text:A,ranges:i,linewise:n}=QuA(t.state);if(!A&&!n)return!1;Ik=n?A:null,e.type=="cut"&&!t.state.readOnly&&t.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let o=xj?null:e.clipboardData;return o?(o.clearData(),o.setData("text/plain",A),!0):(huA(t,A),!1)};var Nj=al.define();function Fj(t,e){let A=[];for(let i of t.facet(Ej)){let n=i(t,e);n&&A.push(n)}return A.length?t.update({effects:A,annotations:Nj.of(!0)}):null}function Lj(t){setTimeout(()=>{let e=t.hasFocus;if(e!=t.inputState.notifiedFocused){let A=Fj(t.state,e);A?t.dispatch(A):t.update([])}},10)}ll.focus=t=>{t.inputState.lastFocusTime=Date.now(),!t.scrollDOM.scrollTop&&(t.inputState.lastScrollTop||t.inputState.lastScrollLeft)&&(t.scrollDOM.scrollTop=t.inputState.lastScrollTop,t.scrollDOM.scrollLeft=t.inputState.lastScrollLeft),Lj(t)};ll.blur=t=>{t.observer.clearSelectionRange(),Lj(t)};ll.compositionstart=ll.compositionupdate=t=>{t.observer.editContext||(t.inputState.compositionFirstChange==null&&(t.inputState.compositionFirstChange=!0),t.inputState.composing<0&&(t.inputState.composing=0))};ll.compositionend=t=>{t.observer.editContext||(t.inputState.composing=-1,t.inputState.compositionEndedAt=Date.now(),t.inputState.compositionPendingKey=!0,t.inputState.compositionPendingChange=t.observer.pendingRecords().length>0,t.inputState.compositionFirstChange=null,at.chrome&&at.android?t.observer.flushSoon():t.inputState.compositionPendingChange?Promise.resolve().then(()=>t.observer.flush()):setTimeout(()=>{t.inputState.composing<0&&t.docView.hasComposition&&t.update([])},50))};ll.contextmenu=t=>{t.inputState.lastContextMenu=Date.now()};sc.beforeinput=(t,e)=>{var A,i;if((e.inputType=="insertText"||e.inputType=="insertCompositionText")&&(t.inputState.insertingText=e.data,t.inputState.insertingTextAt=Date.now()),e.inputType=="insertReplacementText"&&t.observer.editContext){let o=(A=e.dataTransfer)===null||A===void 0?void 0:A.getData("text/plain"),a=e.getTargetRanges();if(o&&a.length){let r=a[0],s=t.posAtDOM(r.startContainer,r.startOffset),l=t.posAtDOM(r.endContainer,r.endOffset);return Yk(t,{from:s,to:l,insert:t.state.toText(o)},null),!0}}let n;if(at.chrome&&at.android&&(n=Sj.find(o=>o.inputType==e.inputType))&&(t.observer.delayAndroidKey(n.key,n.keyCode),n.key=="Backspace"||n.key=="Delete")){let o=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var a;(((a=window.visualViewport)===null||a===void 0?void 0:a.height)||0)>o+10&&t.hasFocus&&(t.contentDOM.blur(),t.focus())},100)}return at.ios&&e.inputType=="deleteContentForward"&&t.observer.flushSoon(),at.safari&&e.inputType=="insertText"&&t.inputState.composing>=0&&setTimeout(()=>ll.compositionend(t,e),20),!1};var kP=new Set;function uuA(t){kP.has(t)||(kP.add(t),t.addEventListener("copy",()=>{}),t.addEventListener("cut",()=>{}))}var xP=["pre-wrap","normal","pre-line","break-spaces"],WE=!1;function _P(){WE=!1}var dk=class{constructor(e){this.lineWrapping=e,this.doc=bn.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,A){let i=this.doc.lineAt(A).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((A-e-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return xP.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let A=!1;for(let i=0;i-1,s=Math.abs(A-this.lineHeight)>.3||this.lineWrapping!=r||Math.abs(i-this.charWidth)>.1;if(this.lineWrapping=r,this.lineHeight=A,this.charWidth=i,this.textHeight=n,this.lineLength=o,s){this.heightSamples={};for(let l=0;l0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>Iw&&(WE=!0),this.height=e)}replace(e,A,i){return t.of(i)}decomposeLeft(e,A){A.push(this)}decomposeRight(e,A){A.push(this)}applyChanges(e,A,i,n){let o=this,a=i.doc;for(let r=n.length-1;r>=0;r--){let{fromA:s,toA:l,fromB:g,toB:C}=n[r],I=o.lineAt(s,oa.ByPosNoHeight,i.setDoc(A),0,0),d=I.to>=l?I:o.lineAt(l,oa.ByPosNoHeight,i,0,0);for(C+=d.to-l,l=d.to;r>0&&I.from<=n[r-1].toA;)s=n[r-1].fromA,g=n[r-1].fromB,r--,so*2){let r=e[A-1];r.break?e.splice(--A,1,r.left,null,r.right):e.splice(--A,1,r.left,r.right),i+=1+r.break,n-=r.size}else if(o>n*2){let r=e[i];r.break?e.splice(i,1,r.left,null,r.right):e.splice(i,1,r.left,r.right),i+=2+r.break,o-=r.size}else break;else if(n=o&&a(this.lineAt(0,oa.ByPos,i,n,o))}setMeasuredHeight(e){let A=e.heights[e.index++];A<0?(this.spaceAbove=-A,A=e.heights[e.index++]):this.spaceAbove=0,this.setHeight(A)}updateHeight(e,A=0,i=!1,n){return n&&n.from<=A&&n.more&&this.setMeasuredHeight(n),this.outdated=!1,this}toString(){return`block(${this.length})`}},Cg=class t extends bw{constructor(e,A,i){super(e,A,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=i}mainBlock(e,A){return new ac(A,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(e,A,i){let n=i[0];return i.length==1&&(n instanceof t||n instanceof W2&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof W2?n=new t(n.length,this.height,this.spaceAbove):n.height=this.height,this.outdated||(n.outdated=!1),n):Rl.of(i)}updateHeight(e,A=0,i=!1,n){return n&&n.from<=A&&n.more?this.setMeasuredHeight(n):(i||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},W2=class t extends Rl{constructor(e){super(e,0)}heightMetrics(e,A){let i=e.doc.lineAt(A).number,n=e.doc.lineAt(A+this.length).number,o=n-i+1,a,r=0;if(e.lineWrapping){let s=Math.min(this.height,e.lineHeight*o);a=s/o,this.length>o+1&&(r=(this.height-s)/(this.length-o-1))}else a=this.height/o;return{firstLine:i,lastLine:n,perLine:a,perChar:r}}blockAt(e,A,i,n){let{firstLine:o,lastLine:a,perLine:r,perChar:s}=this.heightMetrics(A,n);if(A.lineWrapping){let l=n+(e0){let o=i[i.length-1];o instanceof t?i[i.length-1]=new t(o.length+n):i.push(null,new t(n-1))}if(e>0){let o=i[0];o instanceof t?i[0]=new t(e+o.length):i.unshift(new t(e-1),null)}return Rl.of(i)}decomposeLeft(e,A){A.push(new t(e-1),null)}decomposeRight(e,A){A.push(null,new t(this.length-e-1))}updateHeight(e,A=0,i=!1,n){let o=A+this.length;if(n&&n.from<=A+this.length&&n.more){let a=[],r=Math.max(A,n.from),s=-1;for(n.from>A&&a.push(new t(n.from-A-1).updateHeight(e,A));r<=o&&n.more;){let g=e.doc.lineAt(r).length;a.length&&a.push(null);let C=n.heights[n.index++],I=0;C<0&&(I=-C,C=n.heights[n.index++]),s==-1?s=C:Math.abs(C-s)>=Iw&&(s=-2);let d=new Cg(g,C,I);d.outdated=!1,a.push(d),r+=g+1}r<=o&&a.push(null,new t(o-r).updateHeight(e,r));let l=Rl.of(a);return(s<0||Math.abs(l.height-this.height)>=Iw||Math.abs(s-this.heightMetrics(e,A).perLine)>=Iw)&&(WE=!0),vw(this,l)}else(i||this.outdated)&&(this.setHeight(e.heightForGap(A,A+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},Ek=class extends Rl{constructor(e,A,i){super(e.length+A+i.length,e.height+i.height,A|(e.outdated||i.outdated?2:0)),this.left=e,this.right=i,this.size=e.size+i.size}get break(){return this.flags&1}blockAt(e,A,i,n){let o=i+this.left.height;return er))return l;let g=A==oa.ByPosNoHeight?oa.ByPosNoHeight:oa.ByPos;return s?l.join(this.right.lineAt(r,g,i,a,r)):this.left.lineAt(r,g,i,n,o).join(l)}forEachLine(e,A,i,n,o,a){let r=n+this.left.height,s=o+this.left.length+this.break;if(this.break)e=s&&this.right.forEachLine(e,A,i,r,s,a);else{let l=this.lineAt(s,oa.ByPos,i,n,o);e=e&&l.from<=A&&a(l),A>l.to&&this.right.forEachLine(l.to+1,A,i,r,s,a)}}replace(e,A,i){let n=this.left.length+this.break;if(Athis.left.length)return this.balanced(this.left,this.right.replace(e-n,A-n,i));let o=[];e>0&&this.decomposeLeft(e,o);let a=o.length;for(let r of i)o.push(r);if(e>0&&RP(o,a-1),A=i&&A.push(null)),e>i&&this.right.decomposeLeft(e-i,A)}decomposeRight(e,A){let i=this.left.length,n=i+this.break;if(e>=n)return this.right.decomposeRight(e-n,A);e2*A.size||A.size>2*e.size?Rl.of(this.break?[e,null,A]:[e,A]):(this.left=vw(this.left,e),this.right=vw(this.right,A),this.setHeight(e.height+A.height),this.outdated=e.outdated||A.outdated,this.size=e.size+A.size,this.length=e.length+this.break+A.length,this)}updateHeight(e,A=0,i=!1,n){let{left:o,right:a}=this,r=A+o.length+this.break,s=null;return n&&n.from<=A+o.length&&n.more?s=o=o.updateHeight(e,A,i,n):o.updateHeight(e,A,i),n&&n.from<=r+a.length&&n.more?s=a=a.updateHeight(e,r,i,n):a.updateHeight(e,r,i),s?this.balanced(o,a):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function RP(t,e){let A,i;t[e]==null&&(A=t[e-1])instanceof W2&&(i=t[e+1])instanceof W2&&t.splice(e-1,3,new W2(A.length+1+i.length))}var puA=5,hk=class t{constructor(e,A){this.pos=e,this.oracle=A,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,A){if(this.lineStart>-1){let i=Math.min(A,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof Cg?n.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new Cg(i-this.pos,-1,0)),this.writtenTo=i,A>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=A}point(e,A,i){if(e=puA)&&this.addLineDeco(n,o,a)}else A>e&&this.span(e,A);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:A}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=A,this.writtenToe&&this.nodes.push(new Cg(this.pos-e,-1,0)),this.writtenTo=this.pos}blankContent(e,A){let i=new W2(A-e);return this.oracle.doc.lineAt(e).to==A&&(i.flags|=4),i}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof Cg)return e;let A=new Cg(0,-1,0);return this.nodes.push(A),A}addBlock(e){this.enterLine();let A=e.deco;A&&A.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,A&&A.endSide>0&&(this.covering=e)}addLineDeco(e,A,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,e),n.breaks+=A,this.writtenTo=this.pos=this.pos+i}finish(e){let A=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(A instanceof Cg)&&!this.isCovered?this.nodes.push(new Cg(0,-1,0)):(this.writtenTog.clientHeight||g.scrollWidth>g.clientWidth)&&C.overflow!="visible"){let I=g.getBoundingClientRect();o=Math.max(o,I.left),a=Math.min(a,I.right),r=Math.max(r,I.top),s=Math.min(l==t.parentNode?n.innerHeight:s,I.bottom)}l=C.position=="absolute"||C.position=="fixed"?g.offsetParent:g.parentNode}else if(l.nodeType==11)l=l.host;else break;return{left:o-A.left,right:Math.max(o,a)-A.left,top:r-(A.top+e),bottom:Math.max(r,s)-(A.top+e)}}function DuA(t){let e=t.getBoundingClientRect(),A=t.ownerDocument.defaultView||window;return e.left0&&e.top0}function yuA(t,e){let A=t.getBoundingClientRect();return{left:0,right:A.right-A.left,top:e,bottom:A.bottom-(A.top+e)}}var O4=class{constructor(e,A,i,n){this.from=e,this.to=A,this.size=i,this.displaySize=n}static same(e,A){if(e.length!=A.length)return!1;for(let i=0;itypeof n!="function"&&n.class=="cm-lineWrapping");this.heightOracle=new dk(i),this.stateDeco=FP(A),this.heightMap=Rl.empty().applyChanges(this.stateDeco,bn.empty,this.heightOracle.setDoc(A.doc),[new rc(0,0,0,A.doc.length)]);for(let n=0;n<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());n++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=St.set(this.lineGaps.map(n=>n.draw(this,!1))),this.scrollParent=e.scrollDOM,this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:A}=this.state.selection;for(let i=0;i<=1;i++){let n=i?A.head:A.anchor;if(!e.some(({from:o,to:a})=>n>=o&&n<=a)){let{from:o,to:a}=this.lineBlockAt(n);e.push(new JE(o,a))}}return this.viewports=e.sort((i,n)=>i.from-n.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?NP:new fk(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(N4(e,this.scaler))})}update(e,A=null){this.state=e.state;let i=this.stateDeco;this.stateDeco=FP(this.state);let n=e.changedRanges,o=rc.extendWithRanges(n,muA(i,this.stateDeco,e?e.changes:Pr.empty(this.state.doc.length))),a=this.heightMap.height,r=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollOffset);_P(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),o),(this.heightMap.height!=a||WE)&&(e.flags|=2),r?(this.scrollAnchorPos=e.changes.mapPos(r.from,-1),this.scrollAnchorHeight=r.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=a);let s=o.length?this.mapViewport(this.viewport,e.changes):this.viewport;(A&&(A.range.heads.to)||!this.viewportIsAppropriate(s))&&(s=this.getViewport(0,A));let l=s.from!=this.viewport.from||s.to!=this.viewport.to;this.viewport=s,e.flags|=this.updateForViewport(),(l||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),A&&(this.scrollTarget=A),!this.mustEnforceCursorAssoc&&(e.selectionSet||e.focusChanged)&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(hj)&&(this.mustEnforceCursorAssoc=!0)}measure(){let{view:e}=this,A=e.contentDOM,i=window.getComputedStyle(A),n=this.heightOracle,o=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?mo.RTL:mo.LTR;let a=this.heightOracle.mustRefreshForWrapping(o)||this.mustMeasureContent==="refresh",r=A.getBoundingClientRect(),s=a||this.mustMeasureContent||this.contentDOMHeight!=r.height;this.contentDOMHeight=r.height,this.mustMeasureContent=!1;let l=0,g=0;if(r.width&&r.height){let{scaleX:b,scaleY:x}=Aj(A,r);(b>.005&&Math.abs(this.scaleX-b)>.005||x>.005&&Math.abs(this.scaleY-x)>.005)&&(this.scaleX=b,this.scaleY=x,l|=16,a=s=!0)}let C=(parseInt(i.paddingTop)||0)*this.scaleY,I=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=C||this.paddingBottom!=I)&&(this.paddingTop=C,this.paddingBottom=I,l|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(n.lineWrapping&&(s=!0),this.editorWidth=e.scrollDOM.clientWidth,l|=16);let d=ej(this.view.contentDOM,!1).y;d!=this.scrollParent&&(this.scrollParent=d,this.scrollAnchorHeight=-1,this.scrollOffset=0);let h=this.getScrollOffset();this.scrollOffset!=h&&(this.scrollAnchorHeight=-1,this.scrollOffset=h),this.scrolledToBottom=ij(this.scrollParent||e.win);let E=(this.printing?yuA:wuA)(A,this.paddingTop),f=E.top-this.pixelViewport.top,m=E.bottom-this.pixelViewport.bottom;this.pixelViewport=E;let v=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(v!=this.inView&&(this.inView=v,v&&(s=!0)),!this.inView&&!this.scrollTarget&&!DuA(e.dom))return 0;let k=r.width;if((this.contentDOMWidth!=k||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=r.width,this.editorHeight=e.scrollDOM.clientHeight,l|=16),s){let b=e.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(b)&&(a=!0),a||n.lineWrapping&&Math.abs(k-this.contentDOMWidth)>n.charWidth){let{lineHeight:x,charWidth:F,textHeight:z}=e.docView.measureTextSize();a=x>0&&n.refresh(o,x,F,z,Math.max(5,k/F),b),a&&(e.docView.minWidth=0,l|=16)}f>0&&m>0?g=Math.max(f,m):f<0&&m<0&&(g=Math.min(f,m)),_P();for(let x of this.viewports){let F=x.from==this.viewport.from?b:e.docView.measureVisibleLineHeights(x);this.heightMap=(a?Rl.empty().applyChanges(this.stateDeco,bn.empty,this.heightOracle,[new rc(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(n,0,a,new Bk(x.from,F))}WE&&(l|=2)}let S=!this.viewportIsAppropriate(this.viewport,g)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return S&&(l&2&&(l|=this.updateScaler()),this.viewport=this.getViewport(g,this.scrollTarget),l|=this.updateForViewport()),(l&2||S)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(a?[]:this.lineGaps,e)),l|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),l}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,A){let i=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),n=this.heightMap,o=this.heightOracle,{visibleTop:a,visibleBottom:r}=this,s=new JE(n.lineAt(a-i*1e3,oa.ByHeight,o,0,0).from,n.lineAt(r+(1-i)*1e3,oa.ByHeight,o,0,0).to);if(A){let{head:l}=A.range;if(ls.to){let g=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),C=n.lineAt(l,oa.ByPos,o,0,0),I;A.y=="center"?I=(C.top+C.bottom)/2-g/2:A.y=="start"||A.y=="nearest"&&l=r+Math.max(10,Math.min(i,250)))&&n>a-2*1e3&&o>1,a=n<<1;if(this.defaultTextDirection!=mo.LTR&&!i)return[];let r=[],s=(g,C,I,d)=>{if(C-gg&&mm.from>=I.from&&m.to<=I.to&&Math.abs(m.from-g)m.fromv));if(!f){if(Ck.from<=C&&k.to>=C)){let k=A.moveToLineBoundary(Ie.cursor(C),!1,!0).head;k>g&&(C=k)}let m=this.gapSize(I,g,C,d),v=i||m<2e6?m:2e6;f=new O4(g,C,m,v)}r.push(f)},l=g=>{if(g.length2e6)for(let x of e)x.from>=g.from&&x.fromg.from&&s(g.from,d,g,C),hA.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let A=this.stateDeco;this.lineGaps.length&&(A=A.concat(this.lineGapDeco));let i=[];io.spans(A,this.viewport.from,this.viewport.to,{span(o,a){i.push({from:o,to:a})},point(){}},20);let n=0;if(i.length!=this.visibleRanges.length)n=12;else for(let o=0;o=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(A=>A.from<=e&&A.to>=e)||N4(this.heightMap.lineAt(e,oa.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(A=>A.top<=e&&A.bottom>=e)||N4(this.heightMap.lineAt(this.scaler.fromDOM(e),oa.ByHeight,this.heightOracle,0,0),this.scaler)}getScrollOffset(){return(this.scrollParent==this.view.scrollDOM?this.scrollParent.scrollTop:(this.scrollParent?this.scrollParent.getBoundingClientRect().top:0)-this.view.contentDOM.getBoundingClientRect().top)*this.scaleY}scrollAnchorAt(e){let A=this.lineBlockAtHeight(e+8);return A.from>=this.viewport.from||this.viewportLines[0].top-e>200?A:this.viewportLines[0]}elementAtHeight(e){return N4(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},JE=class{constructor(e,A){this.from=e,this.to=A}};function vuA(t,e,A){let i=[],n=t,o=0;return io.spans(A,t,e,{span(){},point(a,r){a>n&&(i.push({from:n,to:a}),o+=a-n),n=r}},20),n=1)return e[e.length-1].to;let i=Math.floor(t*A);for(let n=0;;n++){let{from:o,to:a}=e[n],r=a-o;if(i<=r)return o+i;i-=r}}function rw(t,e){let A=0;for(let{from:i,to:n}of t.ranges){if(e<=n){A+=e-i;break}A+=n-i}return A/t.total}function buA(t,e){for(let A of t)if(e(A))return A}var NP={toDOM(t){return t},fromDOM(t){return t},scale:1,eq(t){return t==this}};function FP(t){let e=t.facet(Lw).filter(i=>typeof i!="function"),A=t.facet(Jk).filter(i=>typeof i!="function");return A.length&&e.push(io.join(A)),e}var fk=class t{constructor(e,A,i){let n=0,o=0,a=0;this.viewports=i.map(({from:r,to:s})=>{let l=A.lineAt(r,oa.ByPos,e,0,0).top,g=A.lineAt(s,oa.ByPos,e,0,0).bottom;return n+=g-l,{from:r,to:s,top:l,bottom:g,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(A.height-n);for(let r of this.viewports)r.domTop=a+(r.top-o)*this.scale,a=r.domBottom=r.domTop+(r.bottom-r.top),o=r.bottom}toDOM(e){for(let A=0,i=0,n=0;;A++){let o=AA.from==e.viewports[i].from&&A.to==e.viewports[i].to):!1}};function N4(t,e){if(e.scale==1)return t;let A=e.toDOM(t.top),i=e.toDOM(t.bottom);return new ac(t.from,t.length,A,i-A,Array.isArray(t._content)?t._content.map(n=>N4(n,e)):t._content)}var sw=At.define({combine:t=>t.join(" ")}),LS=At.define({combine:t=>t.indexOf(!0)>-1}),pk=cg.newName(),Gj=cg.newName(),Kj=cg.newName(),Uj={"&light":"."+Gj,"&dark":"."+Kj};function mk(t,e,A){return new cg(e,{finish(i){return/&/.test(i)?i.replace(/&\w*/,n=>{if(n=="&")return t;if(!A||!A[n])throw new RangeError(`Unsupported selector: ${n}`);return A[n]}):t+" "+i}})}var MuA=mk("."+pk,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-selectionHandle":{backgroundColor:"currentColor",width:"1.5px"},".cm-selectionHandle-start::before, .cm-selectionHandle-end::before":{content:'""',backgroundColor:"inherit",borderRadius:"50%",width:"8px",height:"8px",position:"absolute",left:"-3.25px"},".cm-selectionHandle-start::before":{top:"-8px"},".cm-selectionHandle-end::before":{bottom:"-8px"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Uj),SuA={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},GS=at.ie&&at.ie_version<=11,wk=class{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new jS,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(A=>{for(let i of A)this.queue.push(i);(at.ie&&at.ie_version<=11||at.ios&&e.composing)&&A.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&at.android&&e.constructor.EDIT_CONTEXT!==!1&&!(at.chrome&&at.chrome_version<126)&&(this.editContext=new Dk(e),e.state.facet(EC)&&(e.contentDOM.editContext=this.editContext.editContext)),GS&&(this.onCharData=A=>{this.queue.push({target:A.target,type:"characterData",oldValue:A.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var A;((A=this.view.docView)===null||A===void 0?void 0:A.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),A.length>0&&A[A.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(A=>{A.length>0&&A[A.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((A,i)=>A!=e[i]))){this.gapIntersection.disconnect();for(let A of e)this.gapIntersection.observe(A);this.gaps=e}}onSelectionChange(e){let A=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(EC)?i.root.activeElement!=this.dom:!L4(this.dom,n))return;let o=n.anchorNode&&i.docView.tile.nearest(n.anchorNode);if(o&&o.isWidget()&&o.widget.ignoreEvent(e)){A||(this.selectionChanged=!1);return}(at.ie&&at.ie_version<=11||at.android&&at.chrome)&&!i.state.selection.main.empty&&n.focusNode&&G4(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,A=j4(e.root);if(!A)return!1;let i=at.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&kuA(this.view,A)||A;if(!i||this.selectionRange.eq(i))return!1;let n=L4(this.dom,i);return n&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let o=this.delayedAndroidKey;o&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=o.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&o.force&&zE(this.dom,o.key,o.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||e=="Enter")&&(this.delayedAndroidKey={key:e,keyCode:A,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let A=-1,i=-1,n=!1;for(let o of e){let a=this.readMutation(o);a&&(a.typeOver&&(n=!0),A==-1?{from:A,to:i}=a:(A=Math.min(a.from,A),i=Math.max(a.to,i)))}return{from:A,to:i,typeOver:n}}readChange(){let{from:e,to:A,typeOver:i}=this.processRecords(),n=this.selectionChanged&&L4(this.dom,this.selectionRange);if(e<0&&!n)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let o=new gk(this.view,e,A,i);return this.view.docView.domChanged={newSel:o.newSel?o.newSel.main:null},o}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let A=this.readChange();if(!A)return this.view.requestMeasure(),!1;let i=this.view.state,n=bj(this.view,A);return this.view.state==i&&(A.domChanged||A.newSel&&!yw(this.view.state.selection,A.newSel.main))&&this.view.update([]),n}readMutation(e){let A=this.view.docView.tile.nearest(e.target);if(!A||A.isWidget())return null;if(A.markDirty(e.type=="attributes"),e.type=="childList"){let i=LP(A,e.previousSibling||e.target.previousSibling,-1),n=LP(A,e.nextSibling||e.target.nextSibling,1);return{from:i?A.posAfter(i):A.posAtStart,to:n?A.posBefore(n):A.posAtEnd,typeOver:!1}}else return e.type=="characterData"?{from:A.posAtStart,to:A.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(EC)!=e.state.facet(EC)&&(e.view.contentDOM.editContext=e.state.facet(EC)?this.editContext.editContext:null))}destroy(){var e,A,i;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(A=this.gapIntersection)===null||A===void 0||A.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function LP(t,e,A){for(;e;){let i=wa.get(e);if(i&&i.parent==t)return i;let n=e.parentNode;e=n!=t.dom?n:A>0?e.nextSibling:e.previousSibling}return null}function GP(t,e){let A=e.startContainer,i=e.startOffset,n=e.endContainer,o=e.endOffset,a=t.docView.domAtPos(t.state.selection.main.anchor,1);return G4(a.node,a.offset,n,o)&&([A,i,n,o]=[n,o,A,i]),{anchorNode:A,anchorOffset:i,focusNode:n,focusOffset:o}}function kuA(t,e){if(e.getComposedRanges){let n=e.getComposedRanges(t.root)[0];if(n)return GP(t,n)}let A=null;function i(n){n.preventDefault(),n.stopImmediatePropagation(),A=n.getTargetRanges()[0]}return t.contentDOM.addEventListener("beforeinput",i,!0),t.dom.ownerDocument.execCommand("indent"),t.contentDOM.removeEventListener("beforeinput",i,!0),A?GP(t,A):null}var Dk=class{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let A=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=i=>{let n=e.state.selection.main,{anchor:o,head:a}=n,r=this.toEditorPos(i.updateRangeStart),s=this.toEditorPos(i.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:r,drifted:!1});let l=s-r>i.text.length;r==this.from&&othis.to&&(s=o);let g=Mj(e.state.sliceDoc(r,s),i.text,(l?n.from:n.to)-r,l?"end":null);if(!g){let I=Ie.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));yw(I,n)||e.dispatch({selection:I,userEvent:"select"});return}let C={from:g.from+r,to:g.toA+r,insert:bn.of(i.text.slice(g.from,g.toB).split(` -`))};if((at.mac||at.android)&&C.from==a-1&&/^\. ?$/.test(i.text)&&e.contentDOM.getAttribute("autocorrect")=="off"&&(C={from:r,to:s,insert:bn.of([i.text.replace("."," ")])}),this.pendingContextChange=C,!e.state.readOnly){let I=this.to-this.from+(C.to-C.from+C.insert.length);Yk(e,C,Ie.single(this.toEditorPos(i.selectionStart,I),this.toEditorPos(i.selectionEnd,I)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)),C.from=0&&!/[\\p{Alphabetic}\\p{Number}_]/.test(A.text.slice(Math.max(0,i.updateRangeStart-1),Math.min(A.text.length,i.updateRangeStart+1)))&&this.handlers.compositionend(i)},this.handlers.characterboundsupdate=i=>{let n=[],o=null;for(let a=this.toEditorPos(i.rangeStart),r=this.toEditorPos(i.rangeEnd);a{let n=[];for(let o of i.getTextFormats()){let a=o.underlineStyle,r=o.underlineThickness;if(!/none/i.test(a)&&!/none/i.test(r)){let s=this.toEditorPos(o.rangeStart),l=this.toEditorPos(o.rangeEnd);if(s{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(e.state)}};for(let i in this.handlers)A.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let n=j4(i.root);n&&n.rangeCount&&this.editContext.updateSelectionBounds(n.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let A=0,i=!1,n=this.pendingContextChange;return e.changes.iterChanges((o,a,r,s,l)=>{if(i)return;let g=l.length-(a-o);if(n&&a>=n.to)if(n.from==o&&n.to==a&&n.insert.eq(l)){n=this.pendingContextChange=null,A+=g,this.to+=g;return}else n=null,this.revertPending(e.state);if(o+=A,a+=A,a<=this.from)this.from+=g,this.to+=g;else if(othis.to||this.to-this.from+l.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(o),this.toContextPos(a),l.toString()),this.to+=g}A+=g}),n&&!i&&this.revertPending(e.state),!i}update(e){let A=this.pendingContextChange,i=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(i.from,i.to)&&e.transactions.some(n=>!n.isUserEvent("input.type")&&n.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||A)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:A}=e.selection.main;this.from=Math.max(0,A-1e4),this.to=Math.min(e.doc.length,A+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let A=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(A.from),this.toContextPos(A.from+A.insert.length),e.doc.sliceString(A.from,A.to))}setSelection(e){let{main:A}=e.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,A.anchor))),n=this.toContextPos(A.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=n)&&this.editContext.updateSelection(i,n)}rangeIsValid(e){let{head:A}=e.selection.main;return!(this.from>0&&A-this.from<500||this.to1e4*3)}toEditorPos(e,A=this.to-this.from){e=Math.min(e,A);let i=this.composing;return i&&i.drifted?i.editorBase+(e-i.contextBase):e+this.from}toContextPos(e){let A=this.composing;return A&&A.drifted?A.contextBase+(e-A.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}},ci=(()=>{class t{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(A={}){var i;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),A.parent&&A.parent.appendChild(this.dom);let{dispatch:n}=A;this.dispatchTransactions=A.dispatchTransactions||n&&(o=>o.forEach(a=>n(a,this)))||(o=>this.update(o)),this.dispatch=this.dispatch.bind(this),this._root=A.root||DQA(A.parent)||document,this.viewState=new Mw(this,A.state||qa.create(A)),A.scrollTo&&A.scrollTo.is(iw)&&(this.viewState.scrollTarget=A.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(TE).map(o=>new U4(o));for(let o of this.plugins)o.update(this);this.observer=new wk(this),this.inputState=new ck(this),this.inputState.ensureHandlers(this.plugins),this.docView=new ww(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((i=document.fonts)===null||i===void 0)&&i.ready&&document.fonts.ready.then(()=>{this.viewState.mustMeasureContent="refresh",this.requestMeasure()})}dispatch(...A){let i=A.length==1&&A[0]instanceof I0?A:A.length==1&&Array.isArray(A[0])?A[0]:[this.state.update(...A)];this.dispatchTransactions(i,this)}update(A){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let i=!1,n=!1,o,a=this.state;for(let d of A){if(d.startState!=a)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");a=d.state}if(this.destroyed){this.viewState.state=a;return}let r=this.hasFocus,s=0,l=null;A.some(d=>d.annotation(Nj))?(this.inputState.notifiedFocused=r,s=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,l=Fj(a,r),l||(s=1));let g=this.observer.delayedAndroidKey,C=null;if(g?(this.observer.clearDelayedAndroidKey(),C=this.observer.readChange(),(C&&!this.state.doc.eq(a.doc)||!this.state.selection.eq(a.selection))&&(C=null)):this.observer.clear(),a.facet(qa.phrases)!=this.state.facet(qa.phrases))return this.setState(a);o=pw.create(this,a,A),o.flags|=s;let I=this.viewState.scrollTarget;try{this.updateState=2;for(let d of A){if(I&&(I=I.map(d.changes)),d.scrollIntoView){let{main:h}=d.state.selection;I=new K4(h.empty?h:Ie.cursor(h.head,h.head>h.anchor?-1:1))}for(let h of d.effects)h.is(iw)&&(I=h.value.clip(this.state))}this.viewState.update(o,I),this.bidiCache=Sw.update(this.bidiCache,o.changes),o.empty||(this.updatePlugins(o),this.inputState.update(o)),i=this.docView.update(o),this.state.facet(R4)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(A),this.docView.updateSelection(i,A.some(d=>d.isUserEvent("select.pointer")))}finally{this.updateState=0}if(o.startState.facet(sw)!=o.state.facet(sw)&&(this.viewState.mustMeasureContent=!0),(i||n||I||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),i&&this.docViewUpdate(),!o.empty)for(let d of this.state.facet(_S))try{d(o)}catch(h){Sr(this.state,h,"update listener")}(l||C)&&Promise.resolve().then(()=>{l&&this.state==l.startState&&this.dispatch(l),C&&!bj(this,C)&&g.force&&zE(this.contentDOM,g.key,g.keyCode)})}setState(A){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=A;return}this.updateState=2;let i=this.hasFocus;try{for(let n of this.plugins)n.destroy(this);this.viewState=new Mw(this,A),this.plugins=A.facet(TE).map(n=>new U4(n)),this.pluginMap.clear();for(let n of this.plugins)n.update(this);this.docView.destroy(),this.docView=new ww(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}i&&this.focus(),this.requestMeasure()}updatePlugins(A){let i=A.startState.facet(TE),n=A.state.facet(TE);if(i!=n){let o=[];for(let a of n){let r=i.indexOf(a);if(r<0)o.push(new U4(a));else{let s=this.plugins[r];s.mustUpdate=A,o.push(s)}}for(let a of this.plugins)a.mustUpdate!=A&&a.destroy(this);this.plugins=o,this.pluginMap.clear()}else for(let o of this.plugins)o.mustUpdate=A;for(let o=0;o-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,A&&this.observer.forceFlush();let i=null,n=this.viewState.scrollParent,o=this.viewState.getScrollOffset(),{scrollAnchorPos:a,scrollAnchorHeight:r}=this.viewState;Math.abs(o-this.viewState.scrollOffset)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let s=0;;s++){if(r<0)if(ij(n||this.win))a=-1,r=this.viewState.heightMap.height;else{let h=this.viewState.scrollAnchorAt(o);a=h.from,r=h.top}this.updateState=1;let l=this.viewState.measure();if(!l&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(s>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let g=[];l&4||([this.measureRequests,g]=[g,this.measureRequests]);let C=g.map(h=>{try{return h.read(this)}catch(E){return Sr(this.state,E),KP}}),I=pw.create(this,this.state,[]),d=!1;I.flags|=l,i?i.flags|=l:i=I,this.updateState=2,I.empty||(this.updatePlugins(I),this.inputState.update(I),this.updateAttrs(),d=this.docView.update(I),d&&this.docViewUpdate());for(let h=0;h1||E<-1)&&(n==this.scrollDOM||this.hasFocus||Math.max(this.inputState.lastWheelEvent,this.inputState.lastTouchTime)>Date.now()-100)){o=o+E,n?n.scrollTop+=E:this.win.scrollBy(0,E),r=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(i&&!i.empty)for(let s of this.state.facet(_S))s(i)}get themeClasses(){return pk+" "+(this.state.facet(LS)?Kj:Gj)+" "+this.state.facet(sw)}updateAttrs(){let A=UP(this,QP,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),i={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(EC)?"true":"false",class:"cm-content",style:`${at.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(i["aria-readonly"]="true"),UP(this,ZS,i);let n=this.observer.ignore(()=>{let o=dP(this.contentDOM,this.contentAttrs,i),a=dP(this.dom,this.editorAttrs,A);return o||a});return this.editorAttrs=A,this.contentAttrs=i,n}showAnnouncements(A){let i=!0;for(let n of A)for(let o of n.effects)if(o.is(t.announce)){i&&(this.announceDOM.textContent=""),i=!1;let a=this.announceDOM.appendChild(document.createElement("div"));a.textContent=o.value}}mountStyles(){this.styleModules=this.state.facet(R4);let A=this.state.facet(t.cspNonce);cg.mount(this.root,this.styleModules.concat(MuA).reverse(),A?{nonce:A}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(A){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),A){if(this.measureRequests.indexOf(A)>-1)return;if(A.key!=null){for(let i=0;in.plugin==A)||null),i&&i.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(A){return this.readMeasured(),this.viewState.elementAtHeight(A)}lineBlockAtHeight(A){return this.readMeasured(),this.viewState.lineBlockAtHeight(A)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(A){return this.viewState.lineBlockAt(A)}get contentHeight(){return this.viewState.contentHeight}moveByChar(A,i,n){return FS(this,A,wP(this,A,i,n))}moveByGroup(A,i){return FS(this,A,wP(this,A,i,n=>$QA(this,A.head,n)))}visualLineSide(A,i){let n=this.bidiSpans(A),o=this.textDirectionAt(A.from),a=n[i?n.length-1:0];return Ie.cursor(a.side(i,o)+A.from,a.forward(!i,o)?1:-1)}moveToLineBoundary(A,i,n=!0){return XQA(this,A,i,n)}moveVertically(A,i,n){return FS(this,A,AuA(this,A,i,n))}domAtPos(A,i=1){return this.docView.domAtPos(A,i)}posAtDOM(A,i=0){return this.docView.posFromDOM(A,i)}posAtCoords(A,i=!0){this.readMeasured();let n=rk(this,A,i);return n&&n.pos}posAndSideAtCoords(A,i=!0){return this.readMeasured(),rk(this,A,i)}coordsAtPos(A,i=1){this.readMeasured();let n=this.docView.coordsAt(A,i);if(!n||n.left==n.right)return n;let o=this.state.doc.lineAt(A),a=this.bidiSpans(o),r=a[dg.find(a,A-o.from,-1,i)];return fw(n,r.dir==mo.LTR==i>0)}coordsForChar(A){return this.readMeasured(),this.docView.coordsForChar(A)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(A){return!this.state.facet(hP)||Athis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(A))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(A){if(A.length>xuA)return lj(A.length);let i=this.textDirectionAt(A.from),n;for(let a of this.bidiCache)if(a.from==A.from&&a.dir==i&&(a.fresh||sj(a.isolates,n=uP(this,A))))return a.order;n||(n=uP(this,A));let o=_QA(A.text,i,n);return this.bidiCache.push(new Sw(A.from,A.to,i,n,!0,o)),o}get hasFocus(){var A;return(this.dom.ownerDocument.hasFocus()||at.safari&&((A=this.inputState)===null||A===void 0?void 0:A.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{tj(this.contentDOM),this.docView.updateSelection()})}setRoot(A){this._root!=A&&(this._root=A,this.observer.setWindow((A.nodeType==9?A:A.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let A of this.plugins)A.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(A,i={}){return iw.of(new K4(typeof A=="number"?Ie.cursor(A):A,i.y,i.x,i.yMargin,i.xMargin))}scrollSnapshot(){let{scrollTop:A,scrollLeft:i}=this.scrollDOM,n=this.viewState.scrollAnchorAt(A);return iw.of(new K4(Ie.cursor(n.from),"start","start",n.top-A,i,!0))}setTabFocusMode(A){A==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof A=="boolean"?this.inputState.tabFocusMode=A?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+A)}static domEventHandlers(A){return _o.define(()=>({}),{eventHandlers:A})}static domEventObservers(A){return _o.define(()=>({}),{eventObservers:A})}static theme(A,i){let n=cg.newName(),o=[sw.of(n),R4.of(mk(`.${n}`,A))];return i&&i.dark&&o.push(LS.of(!0)),o}static baseTheme(A){return oc.lowest(R4.of(mk("."+pk,A,Uj)))}static findFromDOM(A){var i;let n=A.querySelector(".cm-content"),o=n&&wa.get(n)||wa.get(A);return((i=o?.root)===null||i===void 0?void 0:i.view)||null}}return t.styleModule=R4,t.inputHandler=Bj,t.clipboardInputFilter=Uk,t.clipboardOutputFilter=Tk,t.scrollHandler=Qj,t.focusChangeEffect=Ej,t.perLineTextDirection=hP,t.exceptionSink=dj,t.updateListener=_S,t.editable=EC,t.mouseSelectionStyle=Ij,t.dragMovesSelection=Cj,t.clickAddsSelectionRange=cj,t.decorations=Lw,t.blockWrappers=fj,t.outerDecorations=Jk,t.atomicRanges=V4,t.bidiIsolatedRanges=pj,t.scrollMargins=mj,t.darkTheme=LS,t.cspNonce=At.define({combine:e=>e.length?e[0]:""}),t.contentAttributes=ZS,t.editorAttributes=QP,t.lineWrapping=t.contentAttributes.of({class:"cm-lineWrapping"}),t.announce=Wi.define(),t})(),xuA=4096,KP={},Sw=class t{constructor(e,A,i,n,o,a){this.from=e,this.to=A,this.dir=i,this.isolates=n,this.fresh=o,this.order=a}static update(e,A){if(A.empty&&!e.some(o=>o.fresh))return e;let i=[],n=e.length?e[e.length-1].dir:mo.LTR;for(let o=Math.max(0,e.length-10);o=0;n--){let o=i[n],a=typeof o=="function"?o(t):o;a&&Lk(a,A)}return A}var _uA=at.mac?"mac":at.windows?"win":at.linux?"linux":"key";function RuA(t,e){let A=t.split(/-(?!$)/),i=A[A.length-1];i=="Space"&&(i=" ");let n,o,a,r;for(let s=0;si.concat(n),[]))),A}function Jj(t,e,A){return Oj(Tj(t.state),e,t,A)}var V2=null,FuA=4e3;function LuA(t,e=_uA){let A=Object.create(null),i=Object.create(null),n=(a,r)=>{let s=i[a];if(s==null)i[a]=r;else if(s!=r)throw new Error("Key binding "+a+" is used both as a regular binding and as a multi-stroke prefix")},o=(a,r,s,l,g)=>{var C,I;let d=A[a]||(A[a]=Object.create(null)),h=r.split(/ (?!$)/).map(m=>RuA(m,e));for(let m=1;m{let S=V2={view:k,prefix:v,scope:a};return setTimeout(()=>{V2==S&&(V2=null)},FuA),!0}]})}let E=h.join(" ");n(E,!1);let f=d[E]||(d[E]={preventDefault:!1,stopPropagation:!1,run:((I=(C=d._any)===null||C===void 0?void 0:C.run)===null||I===void 0?void 0:I.slice())||[]});s&&f.run.push(s),l&&(f.preventDefault=!0),g&&(f.stopPropagation=!0)};for(let a of t){let r=a.scope?a.scope.split(" "):["editor"];if(a.any)for(let l of r){let g=A[l]||(A[l]=Object.create(null));g._any||(g._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:C}=a;for(let I in g)g[I].run.push(d=>C(d,yk))}let s=a[e]||a.key;if(s)for(let l of r)o(l,s,a.run,a.preventDefault,a.stopPropagation),a.shift&&o(l,"Shift-"+s,a.shift,a.preventDefault,a.stopPropagation)}return A}var yk=null;function Oj(t,e,A,i){yk=e;let n=lP(e),o=qr(n,0),a=_l(o)==n.length&&n!=" ",r="",s=!1,l=!1,g=!1;V2&&V2.view==A&&V2.scope==i&&(r=V2.prefix+" ",kj.indexOf(e.keyCode)<0&&(l=!0,V2=null));let C=new Set,I=f=>{if(f){for(let m of f.run)if(!C.has(m)&&(C.add(m),m(A)))return f.stopPropagation&&(g=!0),!0;f.preventDefault&&(f.stopPropagation&&(g=!0),l=!0)}return!1},d=t[i],h,E;return d&&(I(d[r+lw(n,e,!a)])?s=!0:a&&(e.altKey||e.metaKey||e.ctrlKey)&&!(at.windows&&e.ctrlKey&&e.altKey)&&!(at.mac&&e.altKey&&!(e.ctrlKey||e.metaKey))&&(h=BC[e.keyCode])&&h!=n?(I(d[r+lw(h,e,!0)])||e.shiftKey&&(E=KE[e.keyCode])!=n&&E!=h&&I(d[r+lw(E,e,!1)]))&&(s=!0):a&&e.shiftKey&&I(d[r+lw(n,e,!0)])&&(s=!0),!s&&I(d._any)&&(s=!0)),l&&(s=!0),s&&g&&e.stopPropagation(),yk=null,s}var H1=class t{constructor(e,A,i,n,o){this.className=e,this.left=A,this.top=i,this.width=n,this.height=o}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,A){return A.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.width!=null&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,A,i){if(i.empty){let n=e.coordsAtPos(i.head,i.assoc||1);if(!n)return[];let o=Yj(e);return[new t(A,n.left-o.left,n.top-o.top,null,n.bottom-n.top)]}else return GuA(e,A,i)}};function Yj(t){let e=t.scrollDOM.getBoundingClientRect();return{left:(t.textDirection==mo.LTR?e.left:e.right-t.scrollDOM.clientWidth*t.scaleX)-t.scrollDOM.scrollLeft*t.scaleX,top:e.top-t.scrollDOM.scrollTop*t.scaleY}}function JP(t,e,A,i){let n=t.coordsAtPos(e,A*2);if(!n)return i;let o=t.dom.getBoundingClientRect(),a=(n.top+n.bottom)/2,r=t.posAtCoords({x:o.left+1,y:a}),s=t.posAtCoords({x:o.right-1,y:a});return r==null||s==null?i:{from:Math.max(i.from,Math.min(r,s)),to:Math.min(i.to,Math.max(r,s))}}function GuA(t,e,A){if(A.to<=t.viewport.from||A.from>=t.viewport.to)return[];let i=Math.max(A.from,t.viewport.from),n=Math.min(A.to,t.viewport.to),o=t.textDirection==mo.LTR,a=t.contentDOM,r=a.getBoundingClientRect(),s=Yj(t),l=a.querySelector(".cm-line"),g=l&&window.getComputedStyle(l),C=r.left+(g?parseInt(g.paddingLeft)+Math.min(0,parseInt(g.textIndent)):0),I=r.right-(g?parseInt(g.paddingRight):0),d=ak(t,i,1),h=ak(t,n,-1),E=d.type==Vr.Text?d:null,f=h.type==Vr.Text?h:null;if(E&&(t.lineWrapping||d.widgetLineBreaks)&&(E=JP(t,i,1,E)),f&&(t.lineWrapping||h.widgetLineBreaks)&&(f=JP(t,n,-1,f)),E&&f&&E.from==f.from&&E.to==f.to)return v(k(A.from,A.to,E));{let b=E?k(A.from,null,E):S(d,!1),x=f?k(null,A.to,f):S(h,!0),F=[];return(E||d).to<(f||h).from-(E&&f?1:0)||d.widgetLineBreaks>1&&b.bottom+t.defaultLineHeight/2W&&X.from=AA)break;uA>iA&&tA(Math.max(rA,iA),b==null&&rA<=W,Math.min(uA,AA),x==null&&uA>=BA,aA.dir)}if(iA=IA.to+1,iA>=AA)break}return Z.length==0&&tA(W,b==null,BA,x==null,t.textDirection),{top:z,bottom:P,horizontal:Z}}function S(b,x){let F=r.top+(x?b.top:b.bottom);return{top:F,bottom:F,horizontal:[]}}}function KuA(t,e){return t.constructor==e.constructor&&t.eq(e)}var vk=class{constructor(e,A){this.view=e,this.layer=A,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),A.above&&this.dom.classList.add("cm-layer-above"),A.class&&this.dom.classList.add(A.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),A.mount&&A.mount(this.dom,e)}update(e){e.startState.facet(dw)!=e.state.facet(dw)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let A=0,i=e.facet(dw);for(;A!KuA(A,this.drawn[i]))){let A=this.dom.firstChild,i=0;for(let n of e)n.update&&A&&n.constructor&&this.drawn[i].constructor&&n.update(A,this.drawn[i])?(A=A.nextSibling,i++):this.dom.insertBefore(n.draw(),A);for(;A;){let n=A.nextSibling;A.remove(),A=n}this.drawn=e,at.safari&&at.safari_version>=26&&(this.dom.style.display=this.dom.firstChild?"":"none")}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}},dw=At.define();function Hj(t){return[_o.define(e=>new vk(e,t)),dw.of(t)]}var ZE=At.define({combine(t){return Mr(t,{cursorBlinkRate:1200,drawRangeCursor:!0,iosSelectionHandles:!0},{cursorBlinkRate:(e,A)=>Math.min(e,A),drawRangeCursor:(e,A)=>e||A})}});function zj(t={}){return[ZE.of(t),UuA,TuA,JuA,hj.of(!0)]}function Pj(t){return t.startState.facet(ZE)!=t.state.facet(ZE)}var UuA=Hj({above:!0,markers(t){let{state:e}=t,A=e.facet(ZE),i=[];for(let n of e.selection.ranges){let o=n==e.selection.main;if(n.empty||A.drawRangeCursor&&!(o&&at.ios&&A.iosSelectionHandles)){let a=o?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",r=n.empty?n:Ie.cursor(n.head,n.assoc);for(let s of H1.forRange(t,a,r))i.push(s)}}return i},update(t,e){t.transactions.some(i=>i.selection)&&(e.style.animationName=e.style.animationName=="cm-blink"?"cm-blink2":"cm-blink");let A=Pj(t);return A&&OP(t.state,e),t.docChanged||t.selectionSet||A},mount(t,e){OP(e.state,t)},class:"cm-cursorLayer"});function OP(t,e){e.style.animationDuration=t.facet(ZE).cursorBlinkRate+"ms"}var TuA=Hj({above:!1,markers(t){let e=[],{main:A,ranges:i}=t.state.selection;for(let n of i)if(!n.empty)for(let o of H1.forRange(t,"cm-selectionBackground",n))e.push(o);if(at.ios&&!A.empty&&t.state.facet(ZE).iosSelectionHandles){for(let n of H1.forRange(t,"cm-selectionHandle cm-selectionHandle-start",Ie.cursor(A.from,1)))e.push(n);for(let n of H1.forRange(t,"cm-selectionHandle cm-selectionHandle-end",Ie.cursor(A.to,1)))e.push(n)}return e},update(t,e){return t.docChanged||t.selectionSet||t.viewportChanged||Pj(t)},class:"cm-selectionLayer"}),JuA=oc.highest(ci.theme({".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"},caretColor:"transparent !important"},".cm-content":{caretColor:"transparent !important","& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}})),jj=Wi.define({map(t,e){return t==null?null:e.mapPos(t)}}),F4=Ma.define({create(){return null},update(t,e){return t!=null&&(t=e.changes.mapPos(t)),e.effects.reduce((A,i)=>i.is(jj)?i.value:A,t)}}),OuA=_o.fromClass(class{constructor(t){this.view=t,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(t){var e;let A=t.state.field(F4);A==null?this.cursor!=null&&((e=this.cursor)===null||e===void 0||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(t.startState.field(F4)!=A||t.docChanged||t.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:t}=this,e=t.state.field(F4),A=e!=null&&t.coordsAtPos(e);if(!A)return null;let i=t.scrollDOM.getBoundingClientRect();return{left:A.left-i.left+t.scrollDOM.scrollLeft*t.scaleX,top:A.top-i.top+t.scrollDOM.scrollTop*t.scaleY,height:A.bottom-A.top}}drawCursor(t){if(this.cursor){let{scaleX:e,scaleY:A}=this.view;t?(this.cursor.style.left=t.left/e+"px",this.cursor.style.top=t.top/A+"px",this.cursor.style.height=t.height/A+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(t){this.view.state.field(F4)!=t&&this.view.dispatch({effects:jj.of(t)})}},{eventObservers:{dragover(t){this.setDropPos(this.view.posAtCoords({x:t.clientX,y:t.clientY}))},dragleave(t){(t.target==this.view.contentDOM||!this.view.contentDOM.contains(t.relatedTarget))&&this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function qj(){return[F4,OuA]}function YP(t,e,A,i,n){e.lastIndex=0;for(let o=t.iterRange(A,i),a=A,r;!o.next().done;a+=o.value.length)if(!o.lineBreak)for(;r=e.exec(o.value);)n(a+r.index,r)}function YuA(t,e){let A=t.visibleRanges;if(A.length==1&&A[0].from==t.viewport.from&&A[0].to==t.viewport.to)return A;let i=[];for(let{from:n,to:o}of A)n=Math.max(t.state.doc.lineAt(n).from,n-e),o=Math.min(t.state.doc.lineAt(o).to,o+e),i.length&&i[i.length-1].to>=n?i[i.length-1].to=o:i.push({from:n,to:o});return i}var bk=class{constructor(e){let{regexp:A,decoration:i,decorate:n,boundary:o,maxLength:a=1e3}=e;if(!A.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=A,n)this.addMatch=(r,s,l,g)=>n(g,l,l+r[0].length,r,s);else if(typeof i=="function")this.addMatch=(r,s,l,g)=>{let C=i(r,s,l);C&&g(l,l+r[0].length,C)};else if(i)this.addMatch=(r,s,l,g)=>g(l,l+r[0].length,i);else throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.boundary=o,this.maxLength=a}createDeco(e){let A=new jr,i=A.add.bind(A);for(let{from:n,to:o}of YuA(e,this.maxLength))YP(e.state.doc,this.regexp,n,o,(a,r)=>this.addMatch(r,e,a,i));return A.finish()}updateDeco(e,A){let i=1e9,n=-1;return e.docChanged&&e.changes.iterChanges((o,a,r,s)=>{s>=e.view.viewport.from&&r<=e.view.viewport.to&&(i=Math.min(r,i),n=Math.max(s,n))}),e.viewportMoved||n-i>1e3?this.createDeco(e.view):n>-1?this.updateRange(e.view,A.map(e.changes),i,n):A}updateRange(e,A,i,n){for(let o of e.visibleRanges){let a=Math.max(o.from,i),r=Math.min(o.to,n);if(r>=a){let s=e.state.doc.lineAt(a),l=s.tos.from;a--)if(this.boundary.test(s.text[a-1-s.from])){g=a;break}for(;rI.push(m.range(E,f));if(s==l)for(this.regexp.lastIndex=g-s.from;(d=this.regexp.exec(s.text))&&d.indexthis.addMatch(f,e,E,h));A=A.update({filterFrom:g,filterTo:C,filter:(E,f)=>EC,add:I})}}return A}},Mk=/x/.unicode!=null?"gu":"g",HuA=new RegExp(`[\0-\b --\x7F-\x9F\xAD\u061C\u200B\u200E\u200F\u2028\u2029\u202D\u202E\u2066\u2067\u2069\uFEFF\uFFF9-\uFFFC]`,Mk),zuA={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"},KS=null;function PuA(){var t;if(KS==null&&typeof document<"u"&&document.body){let e=document.body.style;KS=((t=e.tabSize)!==null&&t!==void 0?t:e.MozTabSize)!=null}return KS||!1}var Bw=At.define({combine(t){let e=Mr(t,{render:null,specialChars:HuA,addSpecialChars:null});return(e.replaceTabs=!PuA())&&(e.specialChars=new RegExp(" |"+e.specialChars.source,Mk)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,Mk)),e}});function Vj(t={}){return[Bw.of(t),juA()]}var HP=null;function juA(){return HP||(HP=_o.fromClass(class{constructor(t){this.view=t,this.decorations=St.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(t.state.facet(Bw)),this.decorations=this.decorator.createDeco(t)}makeDecorator(t){return new bk({regexp:t.specialChars,decoration:(e,A,i)=>{let{doc:n}=A.state,o=qr(e[0],0);if(o==9){let a=n.lineAt(i),r=A.state.tabSize,s=dC(a.text,r,i-a.from);return St.replace({widget:new kk((r-s%r)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[o]||(this.decorationCache[o]=St.replace({widget:new Sk(t,o)}))},boundary:t.replaceTabs?void 0:/[^]/})}update(t){let e=t.state.facet(Bw);t.startState.facet(Bw)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(t.view)):this.decorations=this.decorator.updateDeco(t,this.decorations)}},{decorations:t=>t.decorations}))}var quA="\u2022";function VuA(t){return t>=32?quA:t==10?"\u2424":String.fromCharCode(9216+t)}var Sk=class extends sl{constructor(e,A){super(),this.options=e,this.code=A}eq(e){return e.code==this.code}toDOM(e){let A=VuA(this.code),i=e.state.phrase("Control character")+" "+(zuA[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,i,A);if(n)return n;let o=document.createElement("span");return o.textContent=A,o.title=i,o.setAttribute("aria-label",i),o.className="cm-specialChar",o}ignoreEvent(){return!1}},kk=class extends sl{constructor(e){super(),this.width=e}eq(e){return e.width==this.width}toDOM(){let e=document.createElement("span");return e.textContent=" ",e.className="cm-tab",e.style.width=this.width+"px",e}ignoreEvent(){return!1}};function Wj(){return ZuA}var WuA=St.line({class:"cm-activeLine"}),ZuA=_o.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.docChanged||t.selectionSet)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=-1,A=[];for(let i of t.state.selection.ranges){let n=t.lineBlockAt(i.head);n.from>e&&(A.push(WuA.range(n.from)),e=n.from)}return St.set(A)}},{decorations:t=>t.decorations});var xk=2e3;function XuA(t,e,A){let i=Math.min(e.line,A.line),n=Math.max(e.line,A.line),o=[];if(e.off>xk||A.off>xk||e.col<0||A.col<0){let a=Math.min(e.off,A.off),r=Math.max(e.off,A.off);for(let s=i;s<=n;s++){let l=t.doc.line(s);l.length<=r&&o.push(Ie.range(l.from+a,l.to+r))}}else{let a=Math.min(e.col,A.col),r=Math.max(e.col,A.col);for(let s=i;s<=n;s++){let l=t.doc.line(s),g=ew(l.text,a,t.tabSize,!0);if(g<0)o.push(Ie.cursor(l.to));else{let C=ew(l.text,r,t.tabSize);o.push(Ie.range(l.from+g,l.from+C))}}}return o}function $uA(t,e){let A=t.coordsAtPos(t.viewport.from);return A?Math.round(Math.abs((A.left-e)/t.defaultCharacterWidth)):-1}function zP(t,e){let A=t.posAtCoords({x:e.clientX,y:e.clientY},!1),i=t.state.doc.lineAt(A),n=A-i.from,o=n>xk?-1:n==i.length?$uA(t,e.clientX):dC(i.text,t.state.tabSize,A-i.from);return{line:i.number,col:o,off:n}}function A4A(t,e){let A=zP(t,e),i=t.state.selection;return A?{update(n){if(n.docChanged){let o=n.changes.mapPos(n.startState.doc.line(A.line).from),a=n.state.doc.lineAt(o);A={line:a.number,col:A.col,off:Math.min(A.off,a.length)},i=i.map(n.changes)}},get(n,o,a){let r=zP(t,n);if(!r)return i;let s=XuA(t.state,A,r);return s.length?a?Ie.create(s.concat(i.ranges)):Ie.create(s):i}}:null}function Zj(t){let e=t?.eventFilter||(A=>A.altKey&&A.button==0);return ci.mouseSelectionStyle.of((A,i)=>e(i)?A4A(A,i):null)}var e4A={Alt:[18,t=>!!t.altKey],Control:[17,t=>!!t.ctrlKey],Shift:[16,t=>!!t.shiftKey],Meta:[91,t=>!!t.metaKey]},t4A={style:"cursor: crosshair"};function Xj(t={}){let[e,A]=e4A[t.key||"Alt"],i=_o.fromClass(class{constructor(n){this.view=n,this.isDown=!1}set(n){this.isDown!=n&&(this.isDown=n,this.view.update([]))}},{eventObservers:{keydown(n){this.set(n.keyCode==e||A(n))},keyup(n){(n.keyCode==e||!A(n))&&this.set(!1)},mousemove(n){this.set(A(n))}}});return[i,ci.contentAttributes.of(n=>{var o;return!((o=n.plugin(i))===null||o===void 0)&&o.isDown?t4A:null})]}var gw="-10000px",kw=class{constructor(e,A,i,n){this.facet=A,this.createTooltipView=i,this.removeTooltipView=n,this.input=e.state.facet(A),this.tooltips=this.input.filter(a=>a);let o=null;this.tooltipViews=this.tooltips.map(a=>o=i(a,o))}update(e,A){var i;let n=e.state.facet(this.facet),o=n.filter(s=>s);if(n===this.input){for(let s of this.tooltipViews)s.update&&s.update(e);return!1}let a=[],r=A?[]:null;for(let s=0;sA[l]=s),A.length=r.length),this.input=n,this.tooltips=o,this.tooltipViews=a,!0}};function i4A(t){let e=t.dom.ownerDocument.documentElement;return{top:0,left:0,bottom:e.clientHeight,right:e.clientWidth}}var US=At.define({combine:t=>{var e,A,i;return{position:at.ios?"absolute":((e=t.find(n=>n.position))===null||e===void 0?void 0:e.position)||"fixed",parent:((A=t.find(n=>n.parent))===null||A===void 0?void 0:A.parent)||null,tooltipSpace:((i=t.find(n=>n.tooltipSpace))===null||i===void 0?void 0:i.tooltipSpace)||i4A}}}),PP=new WeakMap,Hk=_o.fromClass(class{constructor(t){this.view=t,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=t.state.facet(US);this.position=e.position,this.parent=e.parent,this.classes=t.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new kw(t,$E,(A,i)=>this.createTooltip(A,i),A=>{this.resizeObserver&&this.resizeObserver.unobserve(A.dom),A.dom.remove()}),this.above=this.manager.tooltips.map(A=>!!A.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(A=>{Date.now()>this.lastTransaction-50&&A.length>0&&A[A.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),t.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let t of this.manager.tooltipViews)this.intersectionObserver.observe(t.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(t){t.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(t,this.above);e&&this.observeIntersection();let A=e||t.geometryChanged,i=t.state.facet(US);if(i.position!=this.position&&!this.madeAbsolute){this.position=i.position;for(let n of this.manager.tooltipViews)n.dom.style.position=this.position;A=!0}if(i.parent!=this.parent){this.parent&&this.container.remove(),this.parent=i.parent,this.createContainer();for(let n of this.manager.tooltipViews)this.container.appendChild(n.dom);A=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);A&&this.maybeMeasure()}createTooltip(t,e){let A=t.create(this.view),i=e?e.dom:null;if(A.dom.classList.add("cm-tooltip"),t.arrow&&!A.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let n=document.createElement("div");n.className="cm-tooltip-arrow",A.dom.appendChild(n)}return A.dom.style.position=this.position,A.dom.style.top=gw,A.dom.style.left="0px",this.container.insertBefore(A.dom,i),A.mount&&A.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(A.dom),A}destroy(){var t,e,A;this.view.win.removeEventListener("resize",this.measureSoon);for(let i of this.manager.tooltipViews)i.dom.remove(),(t=i.destroy)===null||t===void 0||t.call(i);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(A=this.intersectionObserver)===null||A===void 0||A.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let t=1,e=1,A=!1;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:o}=this.manager.tooltipViews[0];if(at.safari){let a=o.getBoundingClientRect();A=Math.abs(a.top+1e4)>1||Math.abs(a.left)>1}else A=!!o.offsetParent&&o.offsetParent!=this.container.ownerDocument.body}if(A||this.position=="absolute")if(this.parent){let o=this.parent.getBoundingClientRect();o.width&&o.height&&(t=o.width/this.parent.offsetWidth,e=o.height/this.parent.offsetHeight)}else({scaleX:t,scaleY:e}=this.view.viewState);let i=this.view.scrollDOM.getBoundingClientRect(),n=Ok(this.view);return{visible:{left:i.left+n.left,top:i.top+n.top,right:i.right-n.right,bottom:i.bottom-n.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((o,a)=>{let r=this.manager.tooltipViews[a];return r.getCoords?r.getCoords(o.pos):this.view.coordsAtPos(o.pos)}),size:this.manager.tooltipViews.map(({dom:o})=>o.getBoundingClientRect()),space:this.view.state.facet(US).tooltipSpace(this.view),scaleX:t,scaleY:e,makeAbsolute:A}}writeMeasure(t){var e;if(t.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let r of this.manager.tooltipViews)r.dom.style.position="absolute"}let{visible:A,space:i,scaleX:n,scaleY:o}=t,a=[];for(let r=0;r=Math.min(A.bottom,i.bottom)||C.rightMath.min(A.right,i.right)+.1)){g.style.top=gw;continue}let d=s.arrow?l.dom.querySelector(".cm-tooltip-arrow"):null,h=d?7:0,E=I.right-I.left,f=(e=PP.get(l))!==null&&e!==void 0?e:I.bottom-I.top,m=l.offset||o4A,v=this.view.textDirection==mo.LTR,k=I.width>i.right-i.left?v?i.left:i.right-I.width:v?Math.max(i.left,Math.min(C.left-(d?14:0)+m.x,i.right-E)):Math.min(Math.max(i.left,C.left-E+(d?14:0)-m.x),i.right-E),S=this.above[r];!s.strictSide&&(S?C.top-f-h-m.yi.bottom)&&S==i.bottom-C.bottom>C.top-i.top&&(S=this.above[r]=!S);let b=(S?C.top-i.top:i.bottom-C.bottom)-h;if(bk&&z.topx&&(x=S?z.top-f-2-h:z.bottom+h+2);if(this.position=="absolute"?(g.style.top=(x-t.parent.top)/o+"px",jP(g,(k-t.parent.left)/n)):(g.style.top=x/o+"px",jP(g,k/n)),d){let z=C.left+(v?m.x:-m.x)-(k+14-7);d.style.left=z/n+"px"}l.overlap!==!0&&a.push({left:k,top:x,right:F,bottom:x+f}),g.classList.toggle("cm-tooltip-above",S),g.classList.toggle("cm-tooltip-below",!S),l.positioned&&l.positioned(t.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let t of this.manager.tooltipViews)t.dom.style.top=gw}},{eventObservers:{scroll(){this.maybeMeasure()}}});function jP(t,e){let A=parseInt(t.style.left,10);(isNaN(A)||Math.abs(e-A)>1)&&(t.style.left=e+"px")}var n4A=ci.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),o4A={x:0,y:0},$E=At.define({enables:[Hk,n4A]}),xw=At.define({combine:t=>t.reduce((e,A)=>e.concat(A),[])}),_w=class t{static create(e){return new t(e)}constructor(e){this.view=e,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new kw(e,xw,(A,i)=>this.createHostedView(A,i),A=>A.dom.remove())}createHostedView(e,A){let i=e.create(this.view);return i.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(i.dom,A?A.dom.nextSibling:this.dom.firstChild),this.mounted&&i.mount&&i.mount(this.view),i}mount(e){for(let A of this.manager.tooltipViews)A.mount&&A.mount(e);this.mounted=!0}positioned(e){for(let A of this.manager.tooltipViews)A.positioned&&A.positioned(e)}update(e){this.manager.update(e)}destroy(){var e;for(let A of this.manager.tooltipViews)(e=A.destroy)===null||e===void 0||e.call(A)}passProp(e){let A;for(let i of this.manager.tooltipViews){let n=i[e];if(n!==void 0){if(A===void 0)A=n;else if(A!==n)return}}return A}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}},a4A=$E.compute([xw],t=>{let e=t.facet(xw);return e.length===0?null:{pos:Math.min(...e.map(A=>A.pos)),end:Math.max(...e.map(A=>{var i;return(i=A.end)!==null&&i!==void 0?i:A.pos})),create:_w.create,above:e[0].above,arrow:e.some(A=>A.arrow)}}),_k=class{constructor(e,A,i,n,o){this.view=e,this.source=A,this.field=i,this.setHover=n,this.hoverTime=o,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:e.dom,time:0},this.checkHover=this.checkHover.bind(this),e.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),e.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout(()=>this.startHover(),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let e=Date.now()-this.lastMove.time;er.bottom||A.xr.right+e.defaultCharacterWidth)return;let s=e.bidiSpans(e.state.doc.lineAt(n)).find(g=>g.from<=n&&g.to>=n),l=s&&s.dir==mo.RTL?-1:1;o=A.x{this.pending==r&&(this.pending=null,s&&!(Array.isArray(s)&&!s.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(s)?s:[s])}))},s=>Sr(e.state,s,"hover tooltip"))}else a&&!(Array.isArray(a)&&!a.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(a)?a:[a])})}get tooltip(){let e=this.view.plugin(Hk),A=e?e.manager.tooltips.findIndex(i=>i.create==_w.create):-1;return A>-1?e.manager.tooltipViews[A]:null}mousemove(e){var A,i;this.lastMove={x:e.clientX,y:e.clientY,target:e.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:n,tooltip:o}=this;if(n.length&&o&&!r4A(o.dom,e)||this.pending){let{pos:a}=n[0]||this.pending,r=(i=(A=n[0])===null||A===void 0?void 0:A.end)!==null&&i!==void 0?i:a;(a==r?this.view.posAtCoords(this.lastMove)!=a:!s4A(this.view,a,r,e.clientX,e.clientY))&&(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:A}=this;if(A.length){let{tooltip:i}=this;i&&i.dom.contains(e.relatedTarget)?this.watchTooltipLeave(i.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(e){let A=i=>{e.removeEventListener("mouseleave",A),this.active.length&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};e.addEventListener("mouseleave",A)}destroy(){clearTimeout(this.hoverTimeout),clearTimeout(this.restartTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}},cw=4;function r4A(t,e){let{left:A,right:i,top:n,bottom:o}=t.getBoundingClientRect(),a;if(a=t.querySelector(".cm-tooltip-arrow")){let r=a.getBoundingClientRect();n=Math.min(r.top,n),o=Math.max(r.bottom,o)}return e.clientX>=A-cw&&e.clientX<=i+cw&&e.clientY>=n-cw&&e.clientY<=o+cw}function s4A(t,e,A,i,n,o){let a=t.scrollDOM.getBoundingClientRect(),r=t.documentTop+t.documentPadding.top+t.contentHeight;if(a.left>i||a.rightn||Math.min(a.bottom,r)=e&&s<=A}function $j(t,e={}){let A=Wi.define(),i=Ma.define({create(){return[]},update(n,o){if(n.length&&(e.hideOnChange&&(o.docChanged||o.selection)?n=[]:e.hideOn&&(n=n.filter(a=>!e.hideOn(o,a))),o.docChanged)){let a=[];for(let r of n){let s=o.changes.mapPos(r.pos,-1,zr.TrackDel);if(s!=null){let l=Object.assign(Object.create(null),r);l.pos=s,l.end!=null&&(l.end=o.changes.mapPos(l.end)),a.push(l)}}n=a}for(let a of o.effects)a.is(A)&&(n=a.value),a.is(l4A)&&(n=[]);return n},provide:n=>xw.from(n)});return{active:i,extension:[i,_o.define(n=>new _k(n,t,i,A,e.hoverTime||300)),a4A]}}function zk(t,e){let A=t.plugin(Hk);if(!A)return null;let i=A.manager.tooltips.indexOf(e);return i<0?null:A.manager.tooltipViews[i]}var l4A=Wi.define();var qP=At.define({combine(t){let e,A;for(let i of t)e=e||i.topContainer,A=A||i.bottomContainer;return{topContainer:e,bottomContainer:A}}});function W4(t,e){let A=t.plugin(Aq),i=A?A.specs.indexOf(e):-1;return i>-1?A.panels[i]:null}var Aq=_o.fromClass(class{constructor(t){this.input=t.state.facet(q1),this.specs=this.input.filter(A=>A),this.panels=this.specs.map(A=>A(t));let e=t.state.facet(qP);this.top=new OE(t,!0,e.topContainer),this.bottom=new OE(t,!1,e.bottomContainer),this.top.sync(this.panels.filter(A=>A.top)),this.bottom.sync(this.panels.filter(A=>!A.top));for(let A of this.panels)A.dom.classList.add("cm-panel"),A.mount&&A.mount()}update(t){let e=t.state.facet(qP);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new OE(t.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new OE(t.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let A=t.state.facet(q1);if(A!=this.input){let i=A.filter(s=>s),n=[],o=[],a=[],r=[];for(let s of i){let l=this.specs.indexOf(s),g;l<0?(g=s(t.view),r.push(g)):(g=this.panels[l],g.update&&g.update(t)),n.push(g),(g.top?o:a).push(g)}this.specs=i,this.panels=n,this.top.sync(o),this.bottom.sync(a);for(let s of r)s.dom.classList.add("cm-panel"),s.mount&&s.mount()}else for(let i of this.panels)i.update&&i.update(t)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:t=>ci.scrollMargins.of(e=>{let A=e.plugin(t);return A&&{top:A.top.scrollMargin(),bottom:A.bottom.scrollMargin()}})}),OE=class{constructor(e,A,i){this.view=e,this.top=A,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(e){for(let A of this.panels)A.destroy&&e.indexOf(A)<0&&A.destroy();this.panels=e,this.syncDOM()}syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.dom=void 0);return}if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let A=this.container||this.view.dom;A.insertBefore(this.dom,this.top?A.firstChild:null)}let e=this.dom.firstChild;for(let A of this.panels)if(A.dom.parentNode==this.dom){for(;e!=A.dom;)e=VP(e);e=e.nextSibling}else this.dom.insertBefore(A.dom,e);for(;e;)e=VP(e)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses)){for(let e of this.classes.split(" "))e&&this.container.classList.remove(e);for(let e of(this.classes=this.view.themeClasses).split(" "))e&&this.container.classList.add(e)}}};function VP(t){let e=t.nextSibling;return t.remove(),e}var q1=At.define({enables:Aq});function eq(t,e){let A,i=new Promise(a=>A=a),n=a=>g4A(a,e,A);t.state.field(TS,!1)?t.dispatch({effects:tq.of(n)}):t.dispatch({effects:Wi.appendConfig.of(TS.init(()=>[n]))});let o=iq.of(n);return{close:o,result:i.then(a=>((t.win.queueMicrotask||(s=>t.win.setTimeout(s,10)))(()=>{t.state.field(TS).indexOf(n)>-1&&t.dispatch({effects:o})}),a))}}var TS=Ma.define({create(){return[]},update(t,e){for(let A of e.effects)A.is(tq)?t=[A.value].concat(t):A.is(iq)&&(t=t.filter(i=>i!=A.value));return t},provide:t=>q1.computeN([t],e=>e.field(t))}),tq=Wi.define(),iq=Wi.define();function g4A(t,e,A){let i=e.content?e.content(t,()=>a(null)):null;if(!i){if(i=no("form"),e.input){let r=no("input",e.input);/^(text|password|number|email|tel|url)$/.test(r.type)&&r.classList.add("cm-textfield"),r.name||(r.name="input"),i.appendChild(no("label",(e.label||"")+": ",r))}else i.appendChild(document.createTextNode(e.label||""));i.appendChild(document.createTextNode(" ")),i.appendChild(no("button",{class:"cm-button",type:"submit"},e.submitLabel||"OK"))}let n=i.nodeName=="FORM"?[i]:i.querySelectorAll("form");for(let r=0;r{l.keyCode==27?(l.preventDefault(),a(null)):l.keyCode==13&&(l.preventDefault(),a(s))}),s.addEventListener("submit",l=>{l.preventDefault(),a(s)})}let o=no("div",i,no("button",{onclick:()=>a(null),"aria-label":t.state.phrase("close"),class:"cm-dialog-close",type:"button"},["\xD7"]));e.class&&(o.className=e.class),o.classList.add("cm-dialog");function a(r){o.contains(o.ownerDocument.activeElement)&&t.focus(),A(r)}return{dom:o,top:e.top,mount:()=>{if(e.focus){let r;typeof e.focus=="string"?r=i.querySelector(e.focus):r=i.querySelector("input")||i.querySelector("button"),r&&"select"in r?r.select():r&&"focus"in r&&r.focus()}}}}var gl=class extends gg{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}};gl.prototype.elementClass="";gl.prototype.toDOM=void 0;gl.prototype.mapMode=zr.TrackBefore;gl.prototype.startSide=gl.prototype.endSide=-1;gl.prototype.point=!0;var Ew=At.define(),c4A=At.define(),C4A={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>io.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},Y4=At.define();function Kw(t){return[nq(),Y4.of(gA(gA({},C4A),t))]}var Rk=At.define({combine:t=>t.some(e=>e)});function nq(t){let e=[I4A];return t&&t.fixed===!1&&e.push(Rk.of(!0)),e}var I4A=_o.fromClass(class{constructor(t){this.view=t,this.domAfter=null,this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=t.state.facet(Y4).map(e=>new Rw(t,e)),this.fixed=!t.state.facet(Rk);for(let e of this.gutters)e.config.side=="after"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),t.scrollDOM.insertBefore(this.dom,t.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(t){if(this.updateGutters(t)){let e=this.prevViewport,A=t.view.viewport,i=Math.min(e.to,A.to)-Math.max(e.from,A.from);this.syncGutters(i<(A.to-A.from)*.8)}if(t.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(Rk)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let A=io.iter(this.view.state.facet(Ew),this.view.viewport.from),i=[],n=this.gutters.map(o=>new Fk(o,this.view.viewport,-this.view.documentPadding.top));for(let o of this.view.viewportLineBlocks)if(i.length&&(i=[]),Array.isArray(o.type)){let a=!0;for(let r of o.type)if(r.type==Vr.Text&&a){Nk(A,i,r.from);for(let s of n)s.line(this.view,r,i);a=!1}else if(r.widget)for(let s of n)s.widget(this.view,r)}else if(o.type==Vr.Text){Nk(A,i,o.from);for(let a of n)a.line(this.view,o,i)}else if(o.widget)for(let a of n)a.widget(this.view,o);for(let o of n)o.finish();t&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(t){let e=t.startState.facet(Y4),A=t.state.facet(Y4),i=t.docChanged||t.heightChanged||t.viewportChanged||!io.eq(t.startState.facet(Ew),t.state.facet(Ew),t.view.viewport.from,t.view.viewport.to);if(e==A)for(let n of this.gutters)n.update(t)&&(i=!0);else{i=!0;let n=[];for(let o of A){let a=e.indexOf(o);a<0?n.push(new Rw(this.view,o)):(this.gutters[a].update(t),n.push(this.gutters[a]))}for(let o of this.gutters)o.dom.remove(),n.indexOf(o)<0&&o.destroy();for(let o of n)o.config.side=="after"?this.getDOMAfter().appendChild(o.dom):this.dom.appendChild(o.dom);this.gutters=n}return i}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:t=>ci.scrollMargins.of(e=>{let A=e.plugin(t);if(!A||A.gutters.length==0||!A.fixed)return null;let i=A.dom.offsetWidth*e.scaleX,n=A.domAfter?A.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==mo.LTR?{left:i,right:n}:{right:i,left:n}})});function WP(t){return Array.isArray(t)?t:[t]}function Nk(t,e,A){for(;t.value&&t.from<=A;)t.from==A&&e.push(t.value),t.next()}var Fk=class{constructor(e,A,i){this.gutter=e,this.height=i,this.i=0,this.cursor=io.iter(e.markers,A.from)}addElement(e,A,i){let{gutter:n}=this,o=(A.top-this.height)/e.scaleY,a=A.height/e.scaleY;if(this.i==n.elements.length){let r=new Nw(e,a,o,i);n.elements.push(r),n.dom.appendChild(r.dom)}else n.elements[this.i].update(e,a,o,i);this.height=A.bottom,this.i++}line(e,A,i){let n=[];Nk(this.cursor,n,A.from),i.length&&(n=n.concat(i));let o=this.gutter.config.lineMarker(e,A,n);o&&n.unshift(o);let a=this.gutter;n.length==0&&!a.config.renderEmptyElements||this.addElement(e,A,n)}widget(e,A){let i=this.gutter.config.widgetMarker(e,A.widget,A),n=i?[i]:null;for(let o of e.state.facet(c4A)){let a=o(e,A.widget,A);a&&(n||(n=[])).push(a)}n&&this.addElement(e,A,n)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let A=e.elements.pop();e.dom.removeChild(A.dom),A.destroy()}}},Rw=class{constructor(e,A){this.view=e,this.config=A,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in A.domEventHandlers)this.dom.addEventListener(i,n=>{let o=n.target,a;if(o!=this.dom&&this.dom.contains(o)){for(;o.parentNode!=this.dom;)o=o.parentNode;let s=o.getBoundingClientRect();a=(s.top+s.bottom)/2}else a=n.clientY;let r=e.lineBlockAtHeight(a-e.documentTop);A.domEventHandlers[i](e,r,n)&&n.preventDefault()});this.markers=WP(A.markers(e)),A.initialSpacer&&(this.spacer=new Nw(e,0,0,[A.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let A=this.markers;if(this.markers=WP(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let n=this.config.updateSpacer(this.spacer.markers[0],e);n!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[n])}let i=e.view.viewport;return!io.eq(this.markers,A,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}},Nw=class{constructor(e,A,i,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,A,i,n)}update(e,A,i,n){this.height!=A&&(this.height=A,this.dom.style.height=A+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),d4A(this.markers,n)||this.setMarkers(e,n)}setMarkers(e,A){let i="cm-gutterElement",n=this.dom.firstChild;for(let o=0,a=0;;){let r=a,s=oo(r,s,l)||a(r,s,l):a}return i}})}}),H4=class extends gl{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}};function JS(t,e){return t.state.facet(YE).formatNumber(e,t.state)}var h4A=Y4.compute([YE],t=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(e){return e.state.facet(B4A)},lineMarker(e,A,i){return i.some(n=>n.toDOM)?null:new H4(JS(e,e.state.doc.lineAt(A.from).number))},widgetMarker:(e,A,i)=>{for(let n of e.state.facet(E4A)){let o=n(e,A,i);if(o)return o}return null},lineMarkerChange:e=>e.startState.facet(YE)!=e.state.facet(YE),initialSpacer(e){return new H4(JS(e,ZP(e.state.doc.lines)))},updateSpacer(e,A){let i=JS(A.view,ZP(A.view.state.doc.lines));return i==e.number?e:new H4(i)},domEventHandlers:t.facet(YE).domEventHandlers,side:"before"}));function oq(t={}){return[YE.of(t),nq(),h4A]}function ZP(t){let e=9;for(;e{let e=[],A=-1;for(let i of t.selection.ranges){let n=t.doc.lineAt(i.head).from;n>A&&(A=n,e.push(Q4A.range(n)))}return io.of(e)});function aq(){return u4A}var f4A=0,Z4=class{constructor(e,A){this.from=e,this.to=A}},Ni=class{constructor(e={}){this.id=f4A++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=Qs.match(e)),A=>{let i=e(A);return i===void 0?null:[this,i]}}};Ni.closedBy=new Ni({deserialize:t=>t.split(" ")});Ni.openedBy=new Ni({deserialize:t=>t.split(" ")});Ni.group=new Ni({deserialize:t=>t.split(" ")});Ni.isolate=new Ni({deserialize:t=>{if(t&&t!="rtl"&&t!="ltr"&&t!="auto")throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}});Ni.contextHash=new Ni({perNode:!0});Ni.lookAhead=new Ni({perNode:!0});Ni.mounted=new Ni({perNode:!0});var V1=class{constructor(e,A,i,n=!1){this.tree=e,this.overlay=A,this.parser=i,this.bracketed=n}static get(e){return e&&e.props&&e.props[Ni.mounted.id]}},p4A=Object.create(null),Qs=class t{constructor(e,A,i,n=0){this.name=e,this.props=A,this.id=i,this.flags=n}static define(e){let A=e.props&&e.props.length?Object.create(null):p4A,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new t(e.name||"",A,e.id,i);if(e.props){for(let o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let A=this.prop(Ni.group);return A?A.indexOf(e)>-1:!1}return this.id==e}static match(e){let A=Object.create(null);for(let i in e)for(let n of i.split(" "))A[n]=e[i];return i=>{for(let n=i.prop(Ni.group),o=-1;o<(n?n.length:0);o++){let a=A[o<0?i.name:n[o]];if(a)return a}}}};Qs.none=new Qs("",Object.create(null),0,8);var X4=class t{constructor(e){this.types=e;for(let A=0;A0;for(let s=this.cursor(a|Sa.IncludeAnonymous);;){let l=!1;if(s.from<=o&&s.to>=n&&(!r&&s.type.isAnonymous||A(s)!==!1)){if(s.firstChild())continue;l=!0}for(;l&&i&&(r||!s.type.isAnonymous)&&i(s),!s.nextSibling();){if(!s.parent())return;l=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let A in this.props)e.push([+A,this.props[A]]);return e}balance(e={}){return this.children.length<=8?this:Xk(Qs.none,this.children,this.positions,0,this.children.length,0,this.length,(A,i,n)=>new t(this.type,A,i,n,this.propValues),e.makeTree||((A,i,n)=>new t(Qs.none,A,i,n)))}static build(e){return w4A(e)}};Ka.empty=new Ka(Qs.none,[],[],0);var Pk=class t{constructor(e,A){this.buffer=e,this.index=A}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new t(this.buffer,this.index)}},X2=class t{constructor(e,A,i){this.buffer=e,this.length=A,this.set=i}get type(){return Qs.none}toString(){let e=[];for(let A=0;A0));s=a[s+3]);return r}slice(e,A,i){let n=this.buffer,o=new Uint16Array(A-e),a=0;for(let r=e,s=0;r=e&&Ae;case 1:return A<=e&&i>e;case 2:return i>e;case 4:return!0}}function $4(t,e,A,i){for(var n;t.from==t.to||(A<1?t.from>=e:t.from>e)||(A>-1?t.to<=e:t.to0?r.length:-1;e!=l;e+=A){let g=r[e],C=s[e]+a.from,I;if(!(!(o&Sa.EnterBracketed&&g instanceof Ka&&(I=V1.get(g))&&!I.overlay&&I.bracketed&&i>=C&&i<=C+g.length)&&!gq(n,i,C,C+g.length))){if(g instanceof X2){if(o&Sa.ExcludeBuffers)continue;let d=g.findChild(0,g.buffer.length,A,i-C,n);if(d>-1)return new Af(new qk(a,g,e,C),null,d)}else if(o&Sa.IncludeAnonymous||!g.type.isAnonymous||Zk(g)){let d;if(!(o&Sa.IgnoreMounts)&&(d=V1.get(g))&&!d.overlay)return new t(d.tree,C,e,a);let h=new t(g,C,e,a);return o&Sa.IncludeAnonymous||!h.type.isAnonymous?h:h.nextChild(A<0?g.children.length-1:0,A,i,n,o)}}}if(o&Sa.IncludeAnonymous||!a.type.isAnonymous||(a.index>=0?e=a.index+A:e=A<0?-1:a._parent._tree.children.length,a=a._parent,!a))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,A,i=0){let n;if(!(i&Sa.IgnoreOverlays)&&(n=V1.get(this._tree))&&n.overlay){let o=e-this.from,a=i&Sa.EnterBracketed&&n.bracketed;for(let{from:r,to:s}of n.overlay)if((A>0||a?r<=o:r=o:s>o))return new t(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,A,i)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function sq(t,e,A,i){let n=t.cursor(),o=[];if(!n.firstChild())return o;if(A!=null){for(let a=!1;!a;)if(a=n.type.is(A),!n.nextSibling())return o}for(;;){if(i!=null&&n.type.is(i))return o;if(n.type.is(e)&&o.push(n.node),!n.nextSibling())return i==null?o:[]}}function jk(t,e,A=e.length-1){for(let i=t;A>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(e[A]&&e[A]!=i.name)return!1;A--}}return!0}var qk=class{constructor(e,A,i,n){this.parent=e,this.buffer=A,this.index=i,this.start=n}},Af=class t extends Jw{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,A,i){super(),this.context=e,this._parent=A,this.index=i,this.type=e.buffer.set.types[e.buffer.buffer[i]]}child(e,A,i){let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.context.start,i);return o<0?null:new t(this.context,this,o)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,A,i=0){if(i&Sa.ExcludeBuffers)return null;let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],A>0?1:-1,e-this.context.start,A);return o<0?null:new t(this.context,this,o)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,A=e.buffer[this.index+3];return A<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new t(this.context,this._parent,A):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,A=this._parent?this._parent.index+4:0;return this.index==A?this.externalSibling(-1):new t(this.context,this._parent,e.findChild(A,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],A=[],{buffer:i}=this.context,n=this.index+4,o=i.buffer[this.index+3];if(o>n){let a=i.buffer[this.index+1];e.push(i.slice(n,o,a)),A.push(0)}return new Ka(this.type,e,A,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function cq(t){if(!t.length)return null;let e=0,A=t[0];for(let o=1;oA.from||a.to=e){let r=new h0(a.tree,a.overlay[0].from+o.from,-1,o);(n||(n=[i])).push($4(r,e,A,!1))}}return n?cq(n):i}var ef=class{get name(){return this.type.name}constructor(e,A=0){if(this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,this.mode=A&~Sa.EnterBracketed,e instanceof h0)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let i=e._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,A){this.index=e;let{start:i,buffer:n}=this.buffer;return this.type=A||n.set.types[n.buffer[e]],this.from=i+n.buffer[e+1],this.to=i+n.buffer[e+2],!0}yield(e){return e?e instanceof h0?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,A,i){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,A,i,this.mode));let{buffer:n}=this.buffer,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.buffer.start,i);return o<0?!1:(this.stack.push(this.index),this.yieldBuf(o))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,A,i=this.mode){return this.buffer?i&Sa.ExcludeBuffers?!1:this.enterChild(1,e,A):this.yield(this._tree.enter(e,A,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&Sa.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&Sa.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:A}=this.buffer,i=this.stack.length-1;if(e<0){let n=i<0?0:this.stack[i]+4;if(this.index!=n)return this.yieldBuf(A.findChild(n,this.index,-1,0,4))}else{let n=A.buffer[this.index+3];if(n<(i<0?A.buffer.length:A.buffer[this.stack[i]+3]))return this.yieldBuf(n)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let A,i,{buffer:n}=this;if(n){if(e>0){if(this.index-1)for(let o=A+e,a=e<0?-1:i._tree.children.length;o!=a;o+=e){let r=i._tree.children[o];if(this.mode&Sa.IncludeAnonymous||r instanceof X2||!r.type.isAnonymous||Zk(r))return!1}return!0}move(e,A){if(A&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,A=0){for(;(this.from==this.to||(A<1?this.from>=e:this.from>e)||(A>-1?this.to<=e:this.to=0;){for(let a=e;a;a=a._parent)if(a.index==n){if(n==this.index)return a;A=a,i=o+1;break A}n=this.stack[--o]}for(let n=i;n=0;o--){if(o<0)return jk(this._tree,e,n);let a=i[A.buffer[this.stack[o]]];if(!a.isAnonymous){if(e[n]&&e[n]!=a.name)return!1;n--}}return!0}};function Zk(t){return t.children.some(e=>e instanceof X2||!e.type.isAnonymous||Zk(e))}function w4A(t){var e;let{buffer:A,nodeSet:i,maxBufferLength:n=1024,reused:o=[],minRepeatType:a=i.types.length}=t,r=Array.isArray(A)?new Pk(A,A.length):A,s=i.types,l=0,g=0;function C(b,x,F,z,P,Z){let{id:tA,start:W,end:BA,size:X}=r,iA=g,AA=l;if(X<0)if(r.next(),X==-1){let UA=o[tA];F.push(UA),z.push(W-b);return}else if(X==-3){l=tA;return}else if(X==-4){g=tA;return}else throw new RangeError(`Unrecognized record size: ${X}`);let IA=s[tA],aA,rA,uA=W-b;if(BA-W<=n&&(rA=f(r.pos-x,P))){let UA=new Uint16Array(rA.size-rA.skip),$A=r.pos-rA.size,zA=UA.length;for(;r.pos>$A;)zA=m(rA.start,UA,zA);aA=new X2(UA,BA-rA.start,i),uA=rA.start-b}else{let UA=r.pos-X;r.next();let $A=[],zA=[],pA=tA>=a?tA:-1,PA=0,Je=BA;for(;r.pos>UA;)pA>=0&&r.id==pA&&r.size>=0?(r.end<=Je-n&&(h($A,zA,W,PA,r.end,Je,pA,iA,AA),PA=$A.length,Je=r.end),r.next()):Z>2500?I(W,UA,$A,zA):C(W,UA,$A,zA,pA,Z+1);if(pA>=0&&PA>0&&PA<$A.length&&h($A,zA,W,PA,W,Je,pA,iA,AA),$A.reverse(),zA.reverse(),pA>-1&&PA>0){let _e=d(IA,AA);aA=Xk(IA,$A,zA,0,$A.length,0,BA-W,_e,_e)}else aA=E(IA,$A,zA,BA-W,iA-BA,AA)}F.push(aA),z.push(uA)}function I(b,x,F,z){let P=[],Z=0,tA=-1;for(;r.pos>x;){let{id:W,start:BA,end:X,size:iA}=r;if(iA>4)r.next();else{if(tA>-1&&BA=0;X-=3)W[iA++]=P[X],W[iA++]=P[X+1]-BA,W[iA++]=P[X+2]-BA,W[iA++]=iA;F.push(new X2(W,P[2]-BA,i)),z.push(BA-b)}}function d(b,x){return(F,z,P)=>{let Z=0,tA=F.length-1,W,BA;if(tA>=0&&(W=F[tA])instanceof Ka){if(!tA&&W.type==b&&W.length==P)return W;(BA=W.prop(Ni.lookAhead))&&(Z=z[tA]+W.length+BA)}return E(b,F,z,P,Z,x)}}function h(b,x,F,z,P,Z,tA,W,BA){let X=[],iA=[];for(;b.length>z;)X.push(b.pop()),iA.push(x.pop()+F-P);b.push(E(i.types[tA],X,iA,Z-P,W-Z,BA)),x.push(P-F)}function E(b,x,F,z,P,Z,tA){if(Z){let W=[Ni.contextHash,Z];tA=tA?[W].concat(tA):[W]}if(P>25){let W=[Ni.lookAhead,P];tA=tA?[W].concat(tA):[W]}return new Ka(b,x,F,z,tA)}function f(b,x){let F=r.fork(),z=0,P=0,Z=0,tA=F.end-n,W={size:0,start:0,skip:0};A:for(let BA=F.pos-b;F.pos>BA;){let X=F.size;if(F.id==x&&X>=0){W.size=z,W.start=P,W.skip=Z,Z+=4,z+=4,F.next();continue}let iA=F.pos-X;if(X<0||iA=a?4:0,IA=F.start;for(F.next();F.pos>iA;){if(F.size<0)if(F.size==-3||F.size==-4)AA+=4;else break A;else F.id>=a&&(AA+=4);F.next()}P=IA,z+=X,Z+=AA}return(x<0||z==b)&&(W.size=z,W.start=P,W.skip=Z),W.size>4?W:void 0}function m(b,x,F){let{id:z,start:P,end:Z,size:tA}=r;if(r.next(),tA>=0&&z4){let BA=r.pos-(tA-4);for(;r.pos>BA;)F=m(b,x,F)}x[--F]=W,x[--F]=Z-b,x[--F]=P-b,x[--F]=z}else tA==-3?l=z:tA==-4&&(g=z);return F}let v=[],k=[];for(;r.pos>0;)C(t.start||0,t.bufferStart||0,v,k,-1,0);let S=(e=t.length)!==null&&e!==void 0?e:v.length?k[0]+v[0].length:0;return new Ka(s[t.topID],v.reverse(),k.reverse(),S)}var lq=new WeakMap;function Tw(t,e){if(!t.isAnonymous||e instanceof X2||e.type!=t)return 1;let A=lq.get(e);if(A==null){A=1;for(let i of e.children){if(i.type!=t||!(i instanceof Ka)){A=1;break}A+=Tw(t,i)}lq.set(e,A)}return A}function Xk(t,e,A,i,n,o,a,r,s){let l=0;for(let h=i;h=g)break;x+=F}if(k==S+1){if(x>g){let F=h[S];d(F.children,F.positions,0,F.children.length,E[S]+v);continue}C.push(h[S])}else{let F=E[k-1]+h[k-1].length-b;C.push(Xk(t,h,E,S,k,b,F,null,s))}I.push(b+v-o)}}return d(e,A,i,n,0),(r||s)(C,I,a)}var W1=class t{constructor(e,A,i,n,o=!1,a=!1){this.from=e,this.to=A,this.tree=i,this.offset=n,this.open=(o?1:0)|(a?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,A=[],i=!1){let n=[new t(0,e.length,e,0,!1,i)];for(let o of A)o.to>e.length&&n.push(o);return n}static applyChanges(e,A,i=128){if(!A.length)return e;let n=[],o=1,a=e.length?e[0]:null;for(let r=0,s=0,l=0;;r++){let g=r=i)for(;a&&a.from=I.from||C<=I.to||l){let d=Math.max(I.from,s)-l,h=Math.min(I.to,C)-l;I=d>=h?null:new t(d,h,I.tree,I.offset+l,r>0,!!g)}if(I&&n.push(I),a.to>C)break;a=onew Z4(n.from,n.to)):[new Z4(0,0)]:[new Z4(0,e.length)],this.createParse(e,A||[],i)}parse(e,A,i){let n=this.startParse(e,A,i);for(;;){let o=n.advance();if(o)return o}}},Wk=class{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,A){return this.string.slice(e,A)}};var NBe=new Ni({perNode:!0});var D4A=0,lc=class t{constructor(e,A,i,n){this.name=e,this.set=A,this.base=i,this.modified=n,this.id=D4A++}toString(){let{name:e}=this;for(let A of this.modified)A.name&&(e=`${A.name}(${e})`);return e}static define(e,A){let i=typeof e=="string"?e:"?";if(e instanceof t&&(A=e),A?.base)throw new Error("Can not derive from a modified tag");let n=new t(i,[],null,[]);if(n.set.push(n),A)for(let o of A.set)n.set.push(o);return n}static defineModifier(e){let A=new zw(e);return i=>i.modified.indexOf(A)>-1?i:zw.get(i.base||i,i.modified.concat(A).sort((n,o)=>n.id-o.id))}},y4A=0,zw=class t{constructor(e){this.name=e,this.instances=[],this.id=y4A++}static get(e,A){if(!A.length)return e;let i=A[0].instances.find(r=>r.base==e&&v4A(A,r.modified));if(i)return i;let n=[],o=new lc(e.name,n,e,A);for(let r of A)r.instances.push(o);let a=b4A(A);for(let r of e.set)if(!r.modified.length)for(let s of a)n.push(t.get(r,s));return o}};function v4A(t,e){return t.length==e.length&&t.every((A,i)=>A==e[i])}function b4A(t){let e=[[]];for(let A=0;Ai.length-A.length)}function Pw(t){let e=Object.create(null);for(let A in t){let i=t[A];Array.isArray(i)||(i=[i]);for(let n of A.split(" "))if(n){let o=[],a=2,r=n;for(let C=0;;){if(r=="..."&&C>0&&C+3==n.length){a=1;break}let I=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(r);if(!I)throw new RangeError("Invalid path: "+n);if(o.push(I[0]=="*"?"":I[0][0]=='"'?JSON.parse(I[0]):I[0]),C+=I[0].length,C==n.length)break;let d=n[C++];if(C==n.length&&d=="!"){a=0;break}if(d!="/")throw new RangeError("Invalid path: "+n);r=n.slice(C)}let s=o.length-1,l=o[s];if(!l)throw new RangeError("Invalid path: "+n);let g=new X1(i,a,s>0?o.slice(0,s):null);e[l]=g.sort(e[l])}}return dq.add(e)}var dq=new Ni({combine(t,e){let A,i,n;for(;t||e;){if(!t||e&&t.depth>=e.depth?(n=e,e=e.next):(n=t,t=t.next),A&&A.mode==n.mode&&!n.context&&!A.context)continue;let o=new X1(n.tags,n.mode,n.context);A?A.next=o:i=o,A=o}return i}}),X1=class{constructor(e,A,i,n){this.tags=e,this.mode=A,this.context=i,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let a=n;for(let r of o)for(let s of r.set){let l=A[s.id];if(l){a=a?a+" "+l:l;break}}return a},scope:i}}function M4A(t,e){let A=null;for(let i of t){let n=i.style(e);n&&(A=A?A+" "+n:n)}return A}function Bq(t,e,A,i=0,n=t.length){let o=new Ax(i,Array.isArray(e)?e:[e],A);o.highlightRange(t.cursor(),i,n,"",o.highlighters),o.flush(n)}var Ax=class{constructor(e,A,i){this.at=e,this.highlighters=A,this.span=i,this.class=""}startSpan(e,A){A!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=A)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,A,i,n,o){let{type:a,from:r,to:s}=e;if(r>=i||s<=A)return;a.isTop&&(o=this.highlighters.filter(d=>!d.scope||d.scope(a)));let l=n,g=S4A(e)||X1.empty,C=M4A(o,g.tags);if(C&&(l&&(l+=" "),l+=C,g.mode==1&&(n+=(n?" ":"")+C)),this.startSpan(Math.max(A,r),l),g.opaque)return;let I=e.tree&&e.tree.prop(Ni.mounted);if(I&&I.overlay){let d=e.node.enter(I.overlay[0].from+r,1),h=this.highlighters.filter(f=>!f.scope||f.scope(I.tree.type)),E=e.firstChild();for(let f=0,m=r;;f++){let v=f=k||!e.nextSibling())););if(!v||k>i)break;m=v.to+r,m>A&&(this.highlightRange(d.cursor(),Math.max(A,v.from+r),Math.min(i,m),"",h),this.startSpan(Math.min(i,m),l))}E&&e.parent()}else if(e.firstChild()){I&&(n="");do if(!(e.to<=A)){if(e.from>=i)break;this.highlightRange(e,A,i,n,o),this.startSpan(Math.min(i,e.to),l)}while(e.nextSibling());e.parent()}}};function S4A(t){let e=t.type.prop(dq);for(;e&&e.context&&!t.matchContext(e.context);)e=e.next;return e||null}var $e=lc.define,Ow=$e(),$2=$e(),Cq=$e($2),Iq=$e($2),AI=$e(),Yw=$e(AI),$k=$e(AI),f0=$e(),Z1=$e(f0),Q0=$e(),u0=$e(),ex=$e(),tf=$e(ex),Hw=$e(),Fe={comment:Ow,lineComment:$e(Ow),blockComment:$e(Ow),docComment:$e(Ow),name:$2,variableName:$e($2),typeName:Cq,tagName:$e(Cq),propertyName:Iq,attributeName:$e(Iq),className:$e($2),labelName:$e($2),namespace:$e($2),macroName:$e($2),literal:AI,string:Yw,docString:$e(Yw),character:$e(Yw),attributeValue:$e(Yw),number:$k,integer:$e($k),float:$e($k),bool:$e(AI),regexp:$e(AI),escape:$e(AI),color:$e(AI),url:$e(AI),keyword:Q0,self:$e(Q0),null:$e(Q0),atom:$e(Q0),unit:$e(Q0),modifier:$e(Q0),operatorKeyword:$e(Q0),controlKeyword:$e(Q0),definitionKeyword:$e(Q0),moduleKeyword:$e(Q0),operator:u0,derefOperator:$e(u0),arithmeticOperator:$e(u0),logicOperator:$e(u0),bitwiseOperator:$e(u0),compareOperator:$e(u0),updateOperator:$e(u0),definitionOperator:$e(u0),typeOperator:$e(u0),controlOperator:$e(u0),punctuation:ex,separator:$e(ex),bracket:tf,angleBracket:$e(tf),squareBracket:$e(tf),paren:$e(tf),brace:$e(tf),content:f0,heading:Z1,heading1:$e(Z1),heading2:$e(Z1),heading3:$e(Z1),heading4:$e(Z1),heading5:$e(Z1),heading6:$e(Z1),contentSeparator:$e(f0),list:$e(f0),quote:$e(f0),emphasis:$e(f0),strong:$e(f0),link:$e(f0),monospace:$e(f0),strikethrough:$e(f0),inserted:$e(),deleted:$e(),changed:$e(),invalid:$e(),meta:Hw,documentMeta:$e(Hw),annotation:$e(Hw),processingInstruction:$e(Hw),definition:lc.defineModifier("definition"),constant:lc.defineModifier("constant"),function:lc.defineModifier("function"),standard:lc.defineModifier("standard"),local:lc.defineModifier("local"),special:lc.defineModifier("special")};for(let t in Fe){let e=Fe[t];e instanceof lc&&(e.name=t)}var GBe=tx([{tag:Fe.link,class:"tok-link"},{tag:Fe.heading,class:"tok-heading"},{tag:Fe.emphasis,class:"tok-emphasis"},{tag:Fe.strong,class:"tok-strong"},{tag:Fe.keyword,class:"tok-keyword"},{tag:Fe.atom,class:"tok-atom"},{tag:Fe.bool,class:"tok-bool"},{tag:Fe.url,class:"tok-url"},{tag:Fe.labelName,class:"tok-labelName"},{tag:Fe.inserted,class:"tok-inserted"},{tag:Fe.deleted,class:"tok-deleted"},{tag:Fe.literal,class:"tok-literal"},{tag:Fe.string,class:"tok-string"},{tag:Fe.number,class:"tok-number"},{tag:[Fe.regexp,Fe.escape,Fe.special(Fe.string)],class:"tok-string2"},{tag:Fe.variableName,class:"tok-variableName"},{tag:Fe.local(Fe.variableName),class:"tok-variableName tok-local"},{tag:Fe.definition(Fe.variableName),class:"tok-variableName tok-definition"},{tag:Fe.special(Fe.variableName),class:"tok-variableName2"},{tag:Fe.definition(Fe.propertyName),class:"tok-propertyName tok-definition"},{tag:Fe.typeName,class:"tok-typeName"},{tag:Fe.namespace,class:"tok-namespace"},{tag:Fe.className,class:"tok-className"},{tag:Fe.macroName,class:"tok-macroName"},{tag:Fe.propertyName,class:"tok-propertyName"},{tag:Fe.operator,class:"tok-operator"},{tag:Fe.comment,class:"tok-comment"},{tag:Fe.meta,class:"tok-meta"},{tag:Fe.invalid,class:"tok-invalid"},{tag:Fe.punctuation,class:"tok-punctuation"}]);var ix,eh=new Ni;function k4A(t){return At.define({combine:t?e=>e.concat(t):void 0})}var x4A=new Ni,gc=(()=>{class t{constructor(A,i,n=[],o=""){this.data=A,this.name=o,qa.prototype.hasOwnProperty("tree")||Object.defineProperty(qa.prototype,"tree",{get(){return kr(this)}}),this.parser=i,this.extension=[eI.of(this),qa.languageData.of((a,r,s)=>{let l=Eq(a,r,s),g=l.type.prop(eh);if(!g)return[];let C=a.facet(g),I=l.type.prop(x4A);if(I){let d=l.resolve(r-l.from,s);for(let h of I)if(h.test(d,a)){let E=a.facet(h.facet);return h.type=="replace"?E:E.concat(C)}}return C})].concat(n)}isActiveAt(A,i,n=-1){return Eq(A,i,n).type.prop(eh)==this.data}findRegions(A){let i=A.facet(eI);if(i?.data==this.data)return[{from:0,to:A.doc.length}];if(!i||!i.allowsNesting)return[];let n=[],o=(a,r)=>{if(a.prop(eh)==this.data){n.push({from:r,to:r+a.length});return}let s=a.prop(Ni.mounted);if(s){if(s.tree.prop(eh)==this.data){if(s.overlay)for(let l of s.overlay)n.push({from:l.from+r,to:l.to+r});else n.push({from:r,to:r+a.length});return}else if(s.overlay){let l=n.length;if(o(s.tree,s.overlay[0].from+r),n.length>l)return}}for(let l=0;li.isTop?A:void 0)]}),e.name)}configure(e,A){return new t(this.data,this.parser.configure(e),A||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function kr(t){let e=t.field(gc.state,!1);return e?e.tree:Ka.empty}function Bx(t,e,A=50){var i;let n=(i=t.field(gc.state,!1))===null||i===void 0?void 0:i.context;if(!n)return null;let o=n.viewport;n.updateViewport({from:0,to:e});let a=n.isDone(e)||n.work(A,e)?n.tree:null;return n.updateViewport(o),a}var rx=class{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,A){let i=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,A):this.string.slice(e-i,A-i)}},nf=null,sx=class t{constructor(e,A,i=[],n,o,a,r,s){this.parser=e,this.state=A,this.fragments=i,this.tree=n,this.treeLen=o,this.viewport=a,this.skipped=r,this.scheduleOn=s,this.parse=null,this.tempSkipped=[]}static create(e,A,i){return new t(e,A,[],Ka.empty,0,i,[],null)}startParse(){return this.parser.startParse(new rx(this.state.doc),this.fragments)}work(e,A){return A!=null&&A>=this.state.doc.length&&(A=void 0),this.tree!=Ka.empty&&this.isDone(A??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof e=="number"){let n=Date.now()+e;e=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),A!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>A)&&A=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(A=this.parse.advance()););}),this.treeLen=e,this.tree=A,this.fragments=this.withoutTempSkipped(W1.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let A=nf;nf=this;try{return e()}finally{nf=A}}withoutTempSkipped(e){for(let A;A=this.tempSkipped.pop();)e=hq(e,A.from,A.to);return e}changes(e,A){let{fragments:i,tree:n,treeLen:o,viewport:a,skipped:r}=this;if(this.takeTree(),!e.empty){let s=[];if(e.iterChangedRanges((l,g,C,I)=>s.push({fromA:l,toA:g,fromB:C,toB:I})),i=W1.applyChanges(i,s),n=Ka.empty,o=0,a={from:e.mapPos(a.from,-1),to:e.mapPos(a.to,1)},this.skipped.length){r=[];for(let l of this.skipped){let g=e.mapPos(l.from,1),C=e.mapPos(l.to,-1);ge.from&&(this.fragments=hq(this.fragments,n,o),this.skipped.splice(i--,1))}return this.skipped.length>=A?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,A){this.skipped.push({from:e,to:A})}static getSkippingParser(e){return new class extends Ah{createParse(A,i,n){let o=n[0].from,a=n[n.length-1].to;return{parsedPos:o,advance(){let s=nf;if(s){for(let l of n)s.tempSkipped.push(l);e&&(s.scheduleOn=s.scheduleOn?Promise.all([s.scheduleOn,e]):e)}return this.parsedPos=a,new Ka(Qs.none,[],[],a-o)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let A=this.fragments;return this.treeLen>=e&&A.length&&A[0].from==0&&A[0].to>=e}static get(){return nf}};function hq(t,e,A){return W1.applyChanges(t,[{fromA:e,toA:A,fromB:e,toB:A}])}var af=class t{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let A=this.context.changes(e.changes,e.state),i=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),A.viewport.to);return A.work(20,i)||A.takeTree(),new t(A)}static init(e){let A=Math.min(3e3,e.doc.length),i=sx.create(e.facet(eI).parser,e,{from:0,to:A});return i.work(20,A)||i.takeTree(),new t(i)}};gc.state=Ma.define({create:af.init,update(t,e){for(let A of e.effects)if(A.is(gc.setState))return A.value;return e.startState.facet(eI)!=e.state.facet(eI)?af.init(e.state):t.apply(e)}});var Dq=t=>{let e=setTimeout(()=>t(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(Dq=t=>{let e=-1,A=setTimeout(()=>{e=requestIdleCallback(t,{timeout:400})},100);return()=>e<0?clearTimeout(A):cancelIdleCallback(e)});var nx=typeof navigator<"u"&&(!((ix=navigator.scheduling)===null||ix===void 0)&&ix.isInputPending)?()=>navigator.scheduling.isInputPending():null,_4A=_o.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let A=this.view.state.field(gc.state).context;(A.updateViewport(e.view.viewport)||this.view.viewport.to>A.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(A)}scheduleWork(){if(this.working)return;let{state:e}=this.view,A=e.field(gc.state);(A.tree!=A.context.tree||!A.context.isDone(e.doc.length))&&(this.working=Dq(this.work))}work(e){this.working=null;let A=Date.now();if(this.chunkEndn+1e3,s=o.context.work(()=>nx&&nx()||Date.now()>a,n+(r?0:1e5));this.chunkBudget-=Date.now()-A,(s||this.chunkBudget<=0)&&(o.context.takeTree(),this.view.dispatch({effects:gc.setState.of(new af(o.context))})),this.chunkBudget>0&&!(s&&!r)&&this.scheduleWork(),this.checkAsyncSchedule(o.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(A=>Sr(this.view.state,A)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),eI=At.define({combine(t){return t.length?t[0]:null},enables:t=>[gc.state,_4A,ci.contentAttributes.compute([t],e=>{let A=e.facet(t);return A&&A.name?{"data-language":A.name}:{}})]}),qw=class{constructor(e,A=[]){this.language=e,this.support=A,this.extension=[e,A]}};var R4A=At.define(),ed=At.define({combine:t=>{if(!t.length)return" ";let e=t[0];if(!e||/\S/.test(e)||Array.from(e).some(A=>A!=e[0]))throw new Error("Invalid indent unit: "+JSON.stringify(t[0]));return e}});function Cc(t){let e=t.facet(ed);return e.charCodeAt(0)==9?t.tabSize*e.length:e.length}function nh(t,e){let A="",i=t.tabSize,n=t.facet(ed)[0];if(n==" "){for(;e>=i;)A+=" ",e-=i;n=" "}for(let o=0;o=e?N4A(t,A,e):null}var $1=class{constructor(e,A={}){this.state=e,this.options=A,this.unit=Cc(e)}lineAt(e,A=1){let i=this.state.doc.lineAt(e),{simulateBreak:n,simulateDoubleBreak:o}=this.options;return n!=null&&n>=i.from&&n<=i.to?o&&n==e?{text:"",from:e}:(A<0?n-1&&(o+=a-this.countColumn(i,i.search(/\S|$/))),o}countColumn(e,A=e.length){return dC(e,this.state.tabSize,A)}lineIndent(e,A=1){let{text:i,from:n}=this.lineAt(e,A),o=this.options.overrideIndentation;if(o){let a=o(n);if(a>-1)return a}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}},Ex=new Ni;function N4A(t,e,A){let i=e.resolveStack(A),n=e.resolveInner(A,-1).resolve(A,0).enterUnfinishedNodesBefore(A);if(n!=i.node){let o=[];for(let a=n;a&&!(a.fromi.node.to||a.from==i.node.from&&a.type==i.node.type);a=a.parent)o.push(a);for(let a=o.length-1;a>=0;a--)i={node:o[a],next:i}}return yq(i,t,A)}function yq(t,e,A){for(let i=t;i;i=i.next){let n=L4A(i.node);if(n)return n(lx.create(e,A,i))}return 0}function F4A(t){return t.pos==t.options.simulateBreak&&t.options.simulateDoubleBreak}function L4A(t){let e=t.type.prop(Ex);if(e)return e;let A=t.firstChild,i;if(A&&(i=A.type.prop(Ni.closedBy))){let n=t.lastChild,o=n&&i.indexOf(n.name)>-1;return a=>T4A(a,!0,1,void 0,o&&!F4A(a)?n.from:void 0)}return t.parent==null?G4A:null}function G4A(){return 0}var lx=class t extends $1{constructor(e,A,i){super(e.state,e.options),this.base=e,this.pos=A,this.context=i}get node(){return this.context.node}static create(e,A,i){return new t(e,A,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let A=this.state.doc.lineAt(e.from);for(;;){let i=e.resolve(A.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(K4A(i,e))break;A=this.state.doc.lineAt(i.from)}return this.lineIndent(A.from)}continue(){return yq(this.context.next,this.base,this.pos)}};function K4A(t,e){for(let A=e;A;A=A.parent)if(t==A)return!0;return!1}function U4A(t){let e=t.node,A=e.childAfter(e.from),i=e.lastChild;if(!A)return null;let n=t.options.simulateBreak,o=t.state.doc.lineAt(A.from),a=n==null||n<=o.from?o.to:Math.min(o.to,n);for(let r=A.to;;){let s=e.childAfter(r);if(!s||s==i)return null;if(!s.type.isSkipped){if(s.from>=a)return null;let l=/^ */.exec(o.text.slice(A.to-o.from))[0].length;return{from:A.from,to:A.to+l}}r=s.to}}function T4A(t,e,A,i,n){let o=t.textAfter,a=o.match(/^\s*/)[0].length,r=i&&o.slice(a,a+i.length)==i||n==t.pos+a,s=e?U4A(t):null;return s?r?t.column(s.from):t.column(s.to):t.baseIndent+(r?0:t.unit*A)}function hx({except:t,units:e=1}={}){return A=>{let i=t&&t.test(A.textAfter);return A.baseIndent+(i?0:e*A.unit)}}var J4A=200;function vq(){return qa.transactionFilter.of(t=>{if(!t.docChanged||!t.isUserEvent("input.type")&&!t.isUserEvent("input.complete"))return t;let e=t.startState.languageDataAt("indentOnInput",t.startState.selection.main.head);if(!e.length)return t;let A=t.newDoc,{head:i}=t.newSelection.main,n=A.lineAt(i);if(i>n.from+J4A)return t;let o=A.sliceString(n.from,i);if(!e.some(l=>l.test(o)))return t;let{state:a}=t,r=-1,s=[];for(let{head:l}of a.selection.ranges){let g=a.doc.lineAt(l);if(g.from==r)continue;r=g.from;let C=Ww(a,g.from);if(C==null)continue;let I=/^\s*/.exec(g.text)[0],d=nh(a,C);I!=d&&s.push({from:g.from,to:g.from+I.length,insert:d})}return s.length?[t,{changes:s,sequential:!0}]:t})}var Qx=At.define(),rf=new Ni;function bq(t){let e=t.firstChild,A=t.lastChild;return e&&e.toA)continue;if(o&&r.from=e&&l.to>A&&(o=l)}}return o}function Y4A(t){let e=t.lastChild;return e&&e.to==t.to&&e.type.isError}function th(t,e,A){for(let i of t.facet(Qx)){let n=i(t,e,A);if(n)return n}return O4A(t,e,A)}function Mq(t,e){let A=e.mapPos(t.from,1),i=e.mapPos(t.to,-1);return A>=i?void 0:{from:A,to:i}}var oh=Wi.define({map:Mq}),sf=Wi.define({map:Mq});function Sq(t){let e=[];for(let{head:A}of t.state.selection.ranges)e.some(i=>i.from<=A&&i.to>=A)||e.push(t.lineBlockAt(A));return e}var Ad=Ma.define({create(){return St.none},update(t,e){e.isUserEvent("delete")&&e.changes.iterChangedRanges((A,i)=>t=Qq(t,A,i)),t=t.map(e.changes);for(let A of e.effects)if(A.is(oh)&&!H4A(t,A.value.from,A.value.to)){let{preparePlaceholder:i}=e.state.facet(px),n=i?St.replace({widget:new gx(i(e.state,A.value))}):uq;t=t.update({add:[n.range(A.value.from,A.value.to)]})}else A.is(sf)&&(t=t.update({filter:(i,n)=>A.value.from!=i||A.value.to!=n,filterFrom:A.value.from,filterTo:A.value.to}));return e.selection&&(t=Qq(t,e.selection.main.head)),t},provide:t=>ci.decorations.from(t),toJSON(t,e){let A=[];return t.between(0,e.doc.length,(i,n)=>{A.push(i,n)}),A},fromJSON(t){if(!Array.isArray(t)||t.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let A=0;A{ne&&(i=!0)}),i?t.update({filterFrom:e,filterTo:A,filter:(n,o)=>n>=A||o<=e}):t}function Vw(t,e,A){var i;let n=null;return(i=t.field(Ad,!1))===null||i===void 0||i.between(e,A,(o,a)=>{(!n||n.from>o)&&(n={from:o,to:a})}),n}function H4A(t,e,A){let i=!1;return t.between(e,e,(n,o)=>{n==e&&o==A&&(i=!0)}),i}function kq(t,e){return t.field(Ad,!1)?e:e.concat(Wi.appendConfig.of(Rq()))}var z4A=t=>{for(let e of Sq(t)){let A=th(t.state,e.from,e.to);if(A)return t.dispatch({effects:kq(t.state,[oh.of(A),xq(t,A)])}),!0}return!1},ux=t=>{if(!t.state.field(Ad,!1))return!1;let e=[];for(let A of Sq(t)){let i=Vw(t.state,A.from,A.to);i&&e.push(sf.of(i),xq(t,i,!1))}return e.length&&t.dispatch({effects:e}),e.length>0};function xq(t,e,A=!0){let i=t.state.doc.lineAt(e.from).number,n=t.state.doc.lineAt(e.to).number;return ci.announce.of(`${t.state.phrase(A?"Folded lines":"Unfolded lines")} ${i} ${t.state.phrase("to")} ${n}.`)}var P4A=t=>{let{state:e}=t,A=[];for(let i=0;i{let e=t.state.field(Ad,!1);if(!e||!e.size)return!1;let A=[];return e.between(0,t.state.doc.length,(i,n)=>{A.push(sf.of({from:i,to:n}))}),t.dispatch({effects:A}),!0};var _q=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:z4A},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:ux},{key:"Ctrl-Alt-[",run:P4A},{key:"Ctrl-Alt-]",run:fx}],j4A={placeholderDOM:null,preparePlaceholder:null,placeholderText:"\u2026"},px=At.define({combine(t){return Mr(t,j4A)}});function Rq(t){let e=[Ad,V4A];return t&&e.push(px.of(t)),e}function Nq(t,e){let{state:A}=t,i=A.facet(px),n=a=>{let r=t.lineBlockAt(t.posAtDOM(a.target)),s=Vw(t.state,r.from,r.to);s&&t.dispatch({effects:sf.of(s)}),a.preventDefault()};if(i.placeholderDOM)return i.placeholderDOM(t,n,e);let o=document.createElement("span");return o.textContent=i.placeholderText,o.setAttribute("aria-label",A.phrase("folded code")),o.title=A.phrase("unfold"),o.className="cm-foldPlaceholder",o.onclick=n,o}var uq=St.replace({widget:new class extends sl{toDOM(t){return Nq(t,null)}}}),gx=class extends sl{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return Nq(e,this.value)}},q4A={openText:"\u2304",closedText:"\u203A",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1},of=class extends gl{constructor(e,A){super(),this.config=e,this.open=A}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let A=document.createElement("span");return A.textContent=this.open?this.config.openText:this.config.closedText,A.title=e.state.phrase(this.open?"Fold line":"Unfold line"),A}};function Fq(t={}){let e=gA(gA({},q4A),t),A=new of(e,!0),i=new of(e,!1),n=_o.fromClass(class{constructor(a){this.from=a.viewport.from,this.markers=this.buildMarkers(a)}update(a){(a.docChanged||a.viewportChanged||a.startState.facet(eI)!=a.state.facet(eI)||a.startState.field(Ad,!1)!=a.state.field(Ad,!1)||kr(a.startState)!=kr(a.state)||e.foldingChanged(a))&&(this.markers=this.buildMarkers(a.view))}buildMarkers(a){let r=new jr;for(let s of a.viewportLineBlocks){let l=Vw(a.state,s.from,s.to)?i:th(a.state,s.from,s.to)?A:null;l&&r.add(s.from,s.from,l)}return r.finish()}}),{domEventHandlers:o}=e;return[n,Kw({class:"cm-foldGutter",markers(a){var r;return((r=a.plugin(n))===null||r===void 0?void 0:r.markers)||io.empty},initialSpacer(){return new of(e,!1)},domEventHandlers:Ye(gA({},o),{click:(a,r,s)=>{if(o.click&&o.click(a,r,s))return!0;let l=Vw(a.state,r.from,r.to);if(l)return a.dispatch({effects:sf.of(l)}),!0;let g=th(a.state,r.from,r.to);return g?(a.dispatch({effects:oh.of(g)}),!0):!1}})}),Rq()]}var V4A=ci.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}}),ih=class t{constructor(e,A){this.specs=e;let i;function n(r){let s=cg.newName();return(i||(i=Object.create(null)))["."+s]=r,s}let o=typeof A.all=="string"?A.all:A.all?n(A.all):void 0,a=A.scope;this.scope=a instanceof gc?r=>r.prop(eh)==a.data:a?r=>r==a:void 0,this.style=tx(e.map(r=>({tag:r.tag,class:r.class||n(Object.assign({},r,{tag:null}))})),{all:o}).style,this.module=i?new cg(i):null,this.themeType=A.themeType}static define(e,A){return new t(e,A||{})}},cx=At.define(),Lq=At.define({combine(t){return t.length?[t[0]]:null}});function ox(t){let e=t.facet(cx);return e.length?e:t.facet(Lq)}function mx(t,e){let A=[W4A],i;return t instanceof ih&&(t.module&&A.push(ci.styleModule.of(t.module)),i=t.themeType),e?.fallback?A.push(Lq.of(t)):i?A.push(cx.computeN([ci.darkTheme],n=>n.facet(ci.darkTheme)==(i=="dark")?[t]:[])):A.push(cx.of(t)),A}var Cx=class{constructor(e){this.markCache=Object.create(null),this.tree=kr(e.state),this.decorations=this.buildDeco(e,ox(e.state)),this.decoratedTo=e.viewport.to}update(e){let A=kr(e.state),i=ox(e.state),n=i!=ox(e.startState),{viewport:o}=e.view,a=e.changes.mapPos(this.decoratedTo,1);A.length=o.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=a):(A!=this.tree||e.viewportChanged||n)&&(this.tree=A,this.decorations=this.buildDeco(e.view,i),this.decoratedTo=o.to)}buildDeco(e,A){if(!A||!this.tree.length)return St.none;let i=new jr;for(let{from:n,to:o}of e.visibleRanges)Bq(this.tree,A,(a,r,s)=>{i.add(a,r,this.markCache[s]||(this.markCache[s]=St.mark({class:s})))},n,o);return i.finish()}},W4A=oc.high(_o.fromClass(Cx,{decorations:t=>t.decorations})),Gq=ih.define([{tag:Fe.meta,color:"#404740"},{tag:Fe.link,textDecoration:"underline"},{tag:Fe.heading,textDecoration:"underline",fontWeight:"bold"},{tag:Fe.emphasis,fontStyle:"italic"},{tag:Fe.strong,fontWeight:"bold"},{tag:Fe.strikethrough,textDecoration:"line-through"},{tag:Fe.keyword,color:"#708"},{tag:[Fe.atom,Fe.bool,Fe.url,Fe.contentSeparator,Fe.labelName],color:"#219"},{tag:[Fe.literal,Fe.inserted],color:"#164"},{tag:[Fe.string,Fe.deleted],color:"#a11"},{tag:[Fe.regexp,Fe.escape,Fe.special(Fe.string)],color:"#e40"},{tag:Fe.definition(Fe.variableName),color:"#00f"},{tag:Fe.local(Fe.variableName),color:"#30a"},{tag:[Fe.typeName,Fe.namespace],color:"#085"},{tag:Fe.className,color:"#167"},{tag:[Fe.special(Fe.variableName),Fe.macroName],color:"#256"},{tag:Fe.definition(Fe.propertyName),color:"#00c"},{tag:Fe.comment,color:"#940"},{tag:Fe.invalid,color:"#f00"}]),Z4A=ci.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),Kq=1e4,Uq="()[]{}",Tq=At.define({combine(t){return Mr(t,{afterCursor:!0,brackets:Uq,maxScanDistance:Kq,renderMatch:AfA})}}),X4A=St.mark({class:"cm-matchingBracket"}),$4A=St.mark({class:"cm-nonmatchingBracket"});function AfA(t){let e=[],A=t.matched?X4A:$4A;return e.push(A.range(t.start.from,t.start.to)),t.end&&e.push(A.range(t.end.from,t.end.to)),e}function fq(t){let e=[],A=t.facet(Tq);for(let i of t.selection.ranges){if(!i.empty)continue;let n=cc(t,i.head,-1,A)||i.head>0&&cc(t,i.head-1,1,A)||A.afterCursor&&(cc(t,i.head,1,A)||i.headt.decorations}),tfA=[efA,Z4A];function Jq(t={}){return[Tq.of(t),tfA]}var ifA=new Ni;function Ix(t,e,A){let i=t.prop(e<0?Ni.openedBy:Ni.closedBy);if(i)return i;if(t.name.length==1){let n=A.indexOf(t.name);if(n>-1&&n%2==(e<0?1:0))return[A[n+e]]}return null}function dx(t){let e=t.type.prop(ifA);return e?e(t.node):t}function cc(t,e,A,i={}){let n=i.maxScanDistance||Kq,o=i.brackets||Uq,a=kr(t),r=a.resolveInner(e,A);for(let s=r;s;s=s.parent){let l=Ix(s.type,A,o);if(l&&s.from0?e>=g.from&&eg.from&&e<=g.to))return nfA(t,e,A,s,g,l,o)}}return ofA(t,e,A,a,r.type,n,o)}function nfA(t,e,A,i,n,o,a){let r=i.parent,s={from:n.from,to:n.to},l=0,g=r?.cursor();if(g&&(A<0?g.childBefore(i.from):g.childAfter(i.to)))do if(A<0?g.to<=i.from:g.from>=i.to){if(l==0&&o.indexOf(g.type.name)>-1&&g.from0)return null;let l={from:A<0?e-1:e,to:A>0?e+1:e},g=t.doc.iterRange(e,A>0?t.doc.length:0),C=0;for(let I=0;!g.next().done&&I<=o;){let d=g.value;A<0&&(I+=d.length);let h=e+I*A;for(let E=A>0?0:d.length-1,f=A>0?d.length:-1;E!=f;E+=A){let m=a.indexOf(d[E]);if(!(m<0||i.resolveInner(h+E,1).type!=n))if(m%2==0==A>0)C++;else{if(C==1)return{start:l,end:{from:h+E,to:h+E+1},matched:m>>1==s>>1};C--}}A>0&&(I+=d.length)}return g.done?{start:l,matched:!1}:null}var afA=Object.create(null),pq=[Qs.none];var mq=[],wq=Object.create(null),rfA=Object.create(null);for(let[t,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])rfA[t]=sfA(afA,e);function ax(t,e){mq.indexOf(t)>-1||(mq.push(t),console.warn(e))}function sfA(t,e){let A=[];for(let r of e.split(" ")){let s=[];for(let l of r.split(".")){let g=t[l]||Fe[l];g?typeof g=="function"?s.length?s=s.map(g):ax(l,`Modifier ${l} used at start of tag`):s.length?ax(l,`Tag ${l} used as modifier`):s=Array.isArray(g)?g:[g]:ax(l,`Unknown highlighting tag ${l}`)}for(let l of s)A.push(l)}if(!A.length)return 0;let i=e.replace(/ /g,"_"),n=i+" "+A.map(r=>r.id),o=wq[n];if(o)return o.id;let a=wq[n]=Qs.define({id:pq.length,name:i,props:[Pw({[i]:A})]});return pq.push(a),a.id}var zBe={rtl:St.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:mo.RTL}),ltr:St.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:mo.LTR}),auto:St.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var lfA=t=>{let{state:e}=t,A=e.doc.lineAt(e.selection.main.from),i=vx(t.state,A.from);return i.line?gfA(t):i.block?CfA(t):!1};function yx(t,e){return({state:A,dispatch:i})=>{if(A.readOnly)return!1;let n=t(e,A);return n?(i(A.update(n)),!0):!1}}var gfA=yx(BfA,0);var cfA=yx(Wq,0);var CfA=yx((t,e)=>Wq(t,e,dfA(e)),0);function vx(t,e){let A=t.languageDataAt("commentTokens",e,1);return A.length?A[0]:{}}var lf=50;function IfA(t,{open:e,close:A},i,n){let o=t.sliceDoc(i-lf,i),a=t.sliceDoc(n,n+lf),r=/\s*$/.exec(o)[0].length,s=/^\s*/.exec(a)[0].length,l=o.length-r;if(o.slice(l-e.length,l)==e&&a.slice(s,s+A.length)==A)return{open:{pos:i-r,margin:r&&1},close:{pos:n+s,margin:s&&1}};let g,C;n-i<=2*lf?g=C=t.sliceDoc(i,n):(g=t.sliceDoc(i,i+lf),C=t.sliceDoc(n-lf,n));let I=/^\s*/.exec(g)[0].length,d=/\s*$/.exec(C)[0].length,h=C.length-d-A.length;return g.slice(I,I+e.length)==e&&C.slice(h,h+A.length)==A?{open:{pos:i+I+e.length,margin:/\s/.test(g.charAt(I+e.length))?1:0},close:{pos:n-d-A.length,margin:/\s/.test(C.charAt(h-1))?1:0}}:null}function dfA(t){let e=[];for(let A of t.selection.ranges){let i=t.doc.lineAt(A.from),n=A.to<=i.to?i:t.doc.lineAt(A.to);n.from>i.from&&n.from==A.to&&(n=A.to==i.to+1?i:t.doc.lineAt(A.to-1));let o=e.length-1;o>=0&&e[o].to>i.from?e[o].to=n.to:e.push({from:i.from+/^\s*/.exec(i.text)[0].length,to:n.to})}return e}function Wq(t,e,A=e.selection.ranges){let i=A.map(o=>vx(e,o.from).block);if(!i.every(o=>o))return null;let n=A.map((o,a)=>IfA(e,i[a],o.from,o.to));if(t!=2&&!n.every(o=>o))return{changes:e.changes(A.map((o,a)=>n[a]?[]:[{from:o.from,insert:i[a].open+" "},{from:o.to,insert:" "+i[a].close}]))};if(t!=1&&n.some(o=>o)){let o=[];for(let a=0,r;an&&(o==a||a>C.from)){n=C.from;let I=/^\s*/.exec(C.text)[0].length,d=I==C.length,h=C.text.slice(I,I+l.length)==l?I:-1;Io.comment<0&&(!o.empty||o.single))){let o=[];for(let{line:r,token:s,indent:l,empty:g,single:C}of i)(C||!g)&&o.push({from:r.from+l,insert:s+" "});let a=e.changes(o);return{changes:a,selection:e.selection.map(a,1)}}else if(t!=1&&i.some(o=>o.comment>=0)){let o=[];for(let{line:a,comment:r,token:s}of i)if(r>=0){let l=a.from+r,g=l+s.length;a.text[g-a.from]==" "&&g++,o.push({from:l,to:g})}return{changes:o}}return null}function ah(t,e){return Ie.create(t.ranges.map(e),t.mainIndex)}function Ic(t,e){return t.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function dc({state:t,dispatch:e},A){let i=ah(t.selection,A);return i.eq(t.selection,!0)?!1:(e(Ic(t,i)),!0)}function Xw(t,e){return Ie.cursor(e?t.to:t.from)}function Zq(t,e){return dc(t,A=>A.empty?t.moveByChar(A,e):Xw(A,e))}function us(t){return t.textDirectionAt(t.state.selection.main.head)==mo.LTR}var Xq=t=>Zq(t,!us(t)),$q=t=>Zq(t,us(t));function AV(t,e){return dc(t,A=>A.empty?t.moveByGroup(A,e):Xw(A,e))}var EfA=t=>AV(t,!us(t)),hfA=t=>AV(t,us(t));var tEe=typeof Intl<"u"&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null;function QfA(t,e,A){if(e.type.prop(A))return!0;let i=e.to-e.from;return i&&(i>2||/[^\s,.;:]/.test(t.sliceDoc(e.from,e.to)))||e.firstChild}function $w(t,e,A){let i=kr(t).resolveInner(e.head),n=A?Ni.closedBy:Ni.openedBy;for(let s=e.head;;){let l=A?i.childAfter(s):i.childBefore(s);if(!l)break;QfA(t,l,n)?i=l:s=A?l.to:l.from}let o=i.type.prop(n),a,r;return o&&(a=A?cc(t,i.from,1):cc(t,i.to,-1))&&a.matched?r=A?a.end.to:a.end.from:r=A?i.to:i.from,Ie.cursor(r,A?-1:1)}var ufA=t=>dc(t,e=>$w(t.state,e,!us(t))),ffA=t=>dc(t,e=>$w(t.state,e,us(t)));function eV(t,e){return dc(t,A=>{if(!A.empty)return Xw(A,e);let i=t.moveVertically(A,e);return i.head!=A.head?i:t.moveToLineBoundary(A,e)})}var tV=t=>eV(t,!1),iV=t=>eV(t,!0);function nV(t){let e=t.scrollDOM.clientHeighta.empty?t.moveVertically(a,e,A.height):Xw(a,e));if(n.eq(i.selection))return!1;let o;if(A.selfScroll){let a=t.coordsAtPos(i.selection.main.head),r=t.scrollDOM.getBoundingClientRect(),s=r.top+A.marginTop,l=r.bottom-A.marginBottom;a&&a.top>s&&a.bottomoV(t,!1),wx=t=>oV(t,!0);function tI(t,e,A){let i=t.lineBlockAt(e.head),n=t.moveToLineBoundary(e,A);if(n.head==e.head&&n.head!=(A?i.to:i.from)&&(n=t.moveToLineBoundary(e,A,!1)),!A&&n.head==i.from&&i.length){let o=/^\s*/.exec(t.state.sliceDoc(i.from,Math.min(i.from+100,i.to)))[0].length;o&&e.head!=i.from+o&&(n=Ie.cursor(i.from+o))}return n}var pfA=t=>dc(t,e=>tI(t,e,!0)),mfA=t=>dc(t,e=>tI(t,e,!1)),wfA=t=>dc(t,e=>tI(t,e,!us(t))),DfA=t=>dc(t,e=>tI(t,e,us(t))),yfA=t=>dc(t,e=>Ie.cursor(t.lineBlockAt(e.head).from,1)),vfA=t=>dc(t,e=>Ie.cursor(t.lineBlockAt(e.head).to,-1));function bfA(t,e,A){let i=!1,n=ah(t.selection,o=>{let a=cc(t,o.head,-1)||cc(t,o.head,1)||o.head>0&&cc(t,o.head-1,1)||o.headbfA(t,e,!1);function Bg(t,e){let A=ah(t.state.selection,i=>{let n=e(i);return Ie.range(i.anchor,n.head,n.goalColumn,n.bidiLevel||void 0,n.assoc)});return A.eq(t.state.selection)?!1:(t.dispatch(Ic(t.state,A)),!0)}function aV(t,e){return Bg(t,A=>t.moveByChar(A,e))}var rV=t=>aV(t,!us(t)),sV=t=>aV(t,us(t));function lV(t,e){return Bg(t,A=>t.moveByGroup(A,e))}var SfA=t=>lV(t,!us(t)),kfA=t=>lV(t,us(t));var xfA=t=>Bg(t,e=>$w(t.state,e,!us(t))),_fA=t=>Bg(t,e=>$w(t.state,e,us(t)));function gV(t,e){return Bg(t,A=>t.moveVertically(A,e))}var cV=t=>gV(t,!1),CV=t=>gV(t,!0);function IV(t,e){return Bg(t,A=>t.moveVertically(A,e,nV(t).height))}var Yq=t=>IV(t,!1),Hq=t=>IV(t,!0),RfA=t=>Bg(t,e=>tI(t,e,!0)),NfA=t=>Bg(t,e=>tI(t,e,!1)),FfA=t=>Bg(t,e=>tI(t,e,!us(t))),LfA=t=>Bg(t,e=>tI(t,e,us(t))),GfA=t=>Bg(t,e=>Ie.cursor(t.lineBlockAt(e.head).from)),KfA=t=>Bg(t,e=>Ie.cursor(t.lineBlockAt(e.head).to)),zq=({state:t,dispatch:e})=>(e(Ic(t,{anchor:0})),!0),Pq=({state:t,dispatch:e})=>(e(Ic(t,{anchor:t.doc.length})),!0),jq=({state:t,dispatch:e})=>(e(Ic(t,{anchor:t.selection.main.anchor,head:0})),!0),qq=({state:t,dispatch:e})=>(e(Ic(t,{anchor:t.selection.main.anchor,head:t.doc.length})),!0),UfA=({state:t,dispatch:e})=>(e(t.update({selection:{anchor:0,head:t.doc.length},userEvent:"select"})),!0),TfA=({state:t,dispatch:e})=>{let A=A5(t).map(({from:i,to:n})=>Ie.range(i,Math.min(n+1,t.doc.length)));return e(t.update({selection:Ie.create(A),userEvent:"select"})),!0},JfA=({state:t,dispatch:e})=>{let A=ah(t.selection,i=>{let n=kr(t),o=n.resolveStack(i.from,1);if(i.empty){let a=n.resolveStack(i.from,-1);a.node.from>=o.node.from&&a.node.to<=o.node.to&&(o=a)}for(let a=o;a;a=a.next){let{node:r}=a;if((r.from=i.to||r.to>i.to&&r.from<=i.from)&&a.next)return Ie.range(r.to,r.from)}return i});return A.eq(t.selection)?!1:(e(Ic(t,A)),!0)};function dV(t,e){let{state:A}=t,i=A.selection,n=A.selection.ranges.slice();for(let o of A.selection.ranges){let a=A.doc.lineAt(o.head);if(e?a.to0)for(let r=o;;){let s=t.moveVertically(r,e);if(s.heada.to){n.some(l=>l.head==s.head)||n.push(s);break}else{if(s.head==r.head)break;r=s}}}return n.length==i.ranges.length?!1:(t.dispatch(Ic(A,Ie.create(n,n.length-1))),!0)}var OfA=t=>dV(t,!1),YfA=t=>dV(t,!0),HfA=({state:t,dispatch:e})=>{let A=t.selection,i=null;return A.ranges.length>1?i=Ie.create([A.main]):A.main.empty||(i=Ie.create([Ie.cursor(A.main.head)])),i?(e(Ic(t,i)),!0):!1};function gf(t,e){if(t.state.readOnly)return!1;let A="delete.selection",{state:i}=t,n=i.changeByRange(o=>{let{from:a,to:r}=o;if(a==r){let s=e(o);sa&&(A="delete.forward",s=Zw(t,s,!0)),a=Math.min(a,s),r=Math.max(r,s)}else a=Zw(t,a,!1),r=Zw(t,r,!0);return a==r?{range:o}:{changes:{from:a,to:r},range:Ie.cursor(a,an(t)))i.between(e,e,(n,o)=>{ne&&(e=A?o:n)});return e}var BV=(t,e,A)=>gf(t,i=>{let n=i.from,{state:o}=t,a=o.doc.lineAt(n),r,s;if(A&&!e&&n>a.from&&nBV(t,!1,!0);var EV=t=>BV(t,!0,!1),hV=(t,e)=>gf(t,A=>{let i=A.head,{state:n}=t,o=n.doc.lineAt(i),a=n.charCategorizer(i);for(let r=null;;){if(i==(e?o.to:o.from)){i==A.head&&o.number!=(e?n.doc.lines:1)&&(i+=e?1:-1);break}let s=ja(o.text,i-o.from,e)+o.from,l=o.text.slice(Math.min(i,s)-o.from,Math.max(i,s)-o.from),g=a(l);if(r!=null&&g!=r)break;(l!=" "||i!=A.head)&&(r=g),i=s}return i}),QV=t=>hV(t,!1),zfA=t=>hV(t,!0);var PfA=t=>gf(t,e=>{let A=t.lineBlockAt(e.head).to;return e.headgf(t,e=>{let A=t.moveToLineBoundary(e,!1).head;return e.head>A?A:Math.max(0,e.head-1)}),qfA=t=>gf(t,e=>{let A=t.moveToLineBoundary(e,!0).head;return e.head{if(t.readOnly)return!1;let A=t.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:bn.of(["",""])},range:Ie.cursor(i.from)}));return e(t.update(A,{scrollIntoView:!0,userEvent:"input"})),!0},WfA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let A=t.changeByRange(i=>{if(!i.empty||i.from==0||i.from==t.doc.length)return{range:i};let n=i.from,o=t.doc.lineAt(n),a=n==o.from?n-1:ja(o.text,n-o.from,!1)+o.from,r=n==o.to?n+1:ja(o.text,n-o.from,!0)+o.from;return{changes:{from:a,to:r,insert:t.doc.slice(n,r).append(t.doc.slice(a,n))},range:Ie.cursor(r)}});return A.changes.empty?!1:(e(t.update(A,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function A5(t){let e=[],A=-1;for(let i of t.selection.ranges){let n=t.doc.lineAt(i.from),o=t.doc.lineAt(i.to);if(!i.empty&&i.to==o.from&&(o=t.doc.lineAt(i.to-1)),A>=n.number){let a=e[e.length-1];a.to=o.to,a.ranges.push(i)}else e.push({from:n.from,to:o.to,ranges:[i]});A=o.number+1}return e}function uV(t,e,A){if(t.readOnly)return!1;let i=[],n=[];for(let o of A5(t)){if(A?o.to==t.doc.length:o.from==0)continue;let a=t.doc.lineAt(A?o.to+1:o.from-1),r=a.length+1;if(A){i.push({from:o.to,to:a.to},{from:o.from,insert:a.text+t.lineBreak});for(let s of o.ranges)n.push(Ie.range(Math.min(t.doc.length,s.anchor+r),Math.min(t.doc.length,s.head+r)))}else{i.push({from:a.from,to:o.from},{from:o.to,insert:t.lineBreak+a.text});for(let s of o.ranges)n.push(Ie.range(s.anchor-r,s.head-r))}}return i.length?(e(t.update({changes:i,scrollIntoView:!0,selection:Ie.create(n,t.selection.mainIndex),userEvent:"move.line"})),!0):!1}var ZfA=({state:t,dispatch:e})=>uV(t,e,!1),XfA=({state:t,dispatch:e})=>uV(t,e,!0);function fV(t,e,A){if(t.readOnly)return!1;let i=[];for(let o of A5(t))A?i.push({from:o.from,insert:t.doc.slice(o.from,o.to)+t.lineBreak}):i.push({from:o.to,insert:t.lineBreak+t.doc.slice(o.from,o.to)});let n=t.changes(i);return e(t.update({changes:n,selection:t.selection.map(n,A?1:-1),scrollIntoView:!0,userEvent:"input.copyline"})),!0}var $fA=({state:t,dispatch:e})=>fV(t,e,!1),A3A=({state:t,dispatch:e})=>fV(t,e,!0),e3A=t=>{if(t.state.readOnly)return!1;let{state:e}=t,A=e.changes(A5(e).map(({from:n,to:o})=>(n>0?n--:o{let o;if(t.lineWrapping){let a=t.lineBlockAt(n.head),r=t.coordsAtPos(n.head,n.assoc||1);r&&(o=a.bottom+t.documentTop-r.bottom+t.defaultLineHeight/2)}return t.moveVertically(n,!0,o)}).map(A);return t.dispatch({changes:A,selection:i,scrollIntoView:!0,userEvent:"delete.line"}),!0};function t3A(t,e){if(/\(\)|\[\]|\{\}/.test(t.sliceDoc(e-1,e+1)))return{from:e,to:e};let A=kr(t).resolveInner(e),i=A.childBefore(e),n=A.childAfter(e),o;return i&&n&&i.to<=e&&n.from>=e&&(o=i.type.prop(Ni.closedBy))&&o.indexOf(n.name)>-1&&t.doc.lineAt(i.to).from==t.doc.lineAt(n.from).from&&!/\S/.test(t.sliceDoc(i.to,n.from))?{from:i.to,to:n.from}:null}var Vq=pV(!1),i3A=pV(!0);function pV(t){return({state:e,dispatch:A})=>{if(e.readOnly)return!1;let i=e.changeByRange(n=>{let{from:o,to:a}=n,r=e.doc.lineAt(o),s=!t&&o==a&&t3A(e,o);t&&(o=a=(a<=r.to?r:e.doc.lineAt(a)).to);let l=new $1(e,{simulateBreak:o,simulateDoubleBreak:!!s}),g=Ww(l,o);for(g==null&&(g=dC(/^\s*/.exec(e.doc.lineAt(o).text)[0],e.tabSize));ar.from&&o{let n=[];for(let a=i.from;a<=i.to;){let r=t.doc.lineAt(a);r.number>A&&(i.empty||i.to>r.from)&&(e(r,n,i),A=r.number),a=r.to+1}let o=t.changes(n);return{changes:n,range:Ie.range(o.mapPos(i.anchor,1),o.mapPos(i.head,1))}})}var n3A=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let A=Object.create(null),i=new $1(t,{overrideIndentation:o=>{let a=A[o];return a??-1}}),n=bx(t,(o,a,r)=>{let s=Ww(i,o.from);if(s==null)return;/\S/.test(o.text)||(s=0);let l=/^\s*/.exec(o.text)[0],g=nh(t,s);(l!=g||r.fromt.readOnly?!1:(e(t.update(bx(t,(A,i)=>{i.push({from:A.from,insert:t.facet(ed)})}),{userEvent:"input.indent"})),!0),wV=({state:t,dispatch:e})=>t.readOnly?!1:(e(t.update(bx(t,(A,i)=>{let n=/^\s*/.exec(A.text)[0];if(!n)return;let o=dC(n,t.tabSize),a=0,r=nh(t,Math.max(0,o-Cc(t)));for(;a(t.setTabFocusMode(),!0);var a3A=[{key:"Ctrl-b",run:Xq,shift:rV,preventDefault:!0},{key:"Ctrl-f",run:$q,shift:sV},{key:"Ctrl-p",run:tV,shift:cV},{key:"Ctrl-n",run:iV,shift:CV},{key:"Ctrl-a",run:yfA,shift:GfA},{key:"Ctrl-e",run:vfA,shift:KfA},{key:"Ctrl-d",run:EV},{key:"Ctrl-h",run:Dx},{key:"Ctrl-k",run:PfA},{key:"Ctrl-Alt-h",run:QV},{key:"Ctrl-o",run:VfA},{key:"Ctrl-t",run:WfA},{key:"Ctrl-v",run:wx}],r3A=[{key:"ArrowLeft",run:Xq,shift:rV,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:EfA,shift:SfA,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:wfA,shift:FfA,preventDefault:!0},{key:"ArrowRight",run:$q,shift:sV,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:hfA,shift:kfA,preventDefault:!0},{mac:"Cmd-ArrowRight",run:DfA,shift:LfA,preventDefault:!0},{key:"ArrowUp",run:tV,shift:cV,preventDefault:!0},{mac:"Cmd-ArrowUp",run:zq,shift:jq},{mac:"Ctrl-ArrowUp",run:Oq,shift:Yq},{key:"ArrowDown",run:iV,shift:CV,preventDefault:!0},{mac:"Cmd-ArrowDown",run:Pq,shift:qq},{mac:"Ctrl-ArrowDown",run:wx,shift:Hq},{key:"PageUp",run:Oq,shift:Yq},{key:"PageDown",run:wx,shift:Hq},{key:"Home",run:mfA,shift:NfA,preventDefault:!0},{key:"Mod-Home",run:zq,shift:jq},{key:"End",run:pfA,shift:RfA,preventDefault:!0},{key:"Mod-End",run:Pq,shift:qq},{key:"Enter",run:Vq,shift:Vq},{key:"Mod-a",run:UfA},{key:"Backspace",run:Dx,shift:Dx,preventDefault:!0},{key:"Delete",run:EV,preventDefault:!0},{key:"Mod-Backspace",mac:"Alt-Backspace",run:QV,preventDefault:!0},{key:"Mod-Delete",mac:"Alt-Delete",run:zfA,preventDefault:!0},{mac:"Mod-Backspace",run:jfA,preventDefault:!0},{mac:"Mod-Delete",run:qfA,preventDefault:!0}].concat(a3A.map(t=>({mac:t.key,run:t.run,shift:t.shift}))),DV=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:ufA,shift:xfA},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:ffA,shift:_fA},{key:"Alt-ArrowUp",run:ZfA},{key:"Shift-Alt-ArrowUp",run:$fA},{key:"Alt-ArrowDown",run:XfA},{key:"Shift-Alt-ArrowDown",run:A3A},{key:"Mod-Alt-ArrowUp",run:OfA},{key:"Mod-Alt-ArrowDown",run:YfA},{key:"Escape",run:HfA},{key:"Mod-Enter",run:i3A},{key:"Alt-l",mac:"Ctrl-l",run:TfA},{key:"Mod-i",run:JfA,preventDefault:!0},{key:"Mod-[",run:wV},{key:"Mod-]",run:mV},{key:"Mod-Alt-\\",run:n3A},{key:"Shift-Mod-k",run:e3A},{key:"Shift-Mod-\\",run:MfA},{key:"Mod-/",run:lfA},{key:"Alt-A",run:cfA},{key:"Ctrl-m",mac:"Shift-Alt-m",run:o3A}].concat(r3A),yV={key:"Tab",run:mV,shift:wV};var i5=class{constructor(e,A,i){this.from=e,this.to=A,this.diagnostic=i}},td=class t{constructor(e,A,i){this.diagnostics=e,this.panel=A,this.selected=i}static init(e,A,i){let n=i.facet(p0).markerFilter;n&&(e=n(e,i));let o=e.slice().sort((d,h)=>d.from-h.from||d.to-h.to),a=new jr,r=[],s=0,l=i.doc.iter(),g=0,C=i.doc.length;for(let d=0;;){let h=d==o.length?null:o[d];if(!h&&!r.length)break;let E,f;if(r.length)E=s,f=r.reduce((k,S)=>Math.min(k,S.to),h&&h.from>E?h.from:1e8);else{if(E=h.from,E>C)break;f=h.to,r.push(h),d++}for(;dk.from||k.to==E))r.push(k),d++,f=Math.min(k.to,f);else{f=Math.min(k.from,f);break}}f=Math.min(f,C);let m=!1;if(r.some(k=>k.from==E&&(k.to==f||f==C))&&(m=E==f,!m&&f-E<10)){let k=E-(g+l.value.length);k>0&&(l.next(k),g=E);for(let S=E;;){if(S>=f){m=!0;break}if(!l.lineBreak&&g+l.value.length>S)break;S=g+l.value.length,g+=l.value.length,l.next()}}let v=LV(r);if(m)a.add(E,E,St.widget({widget:new Mx(v),diagnostics:r.slice()}));else{let k=r.reduce((S,b)=>b.markClass?S+" "+b.markClass:S,"");a.add(E,f,St.mark({class:"cm-lintRange cm-lintRange-"+v+k,diagnostics:r.slice(),inclusiveEnd:r.some(S=>S.to>f)}))}if(s=f,s==C)break;for(let k=0;k{if(!(e&&a.diagnostics.indexOf(e)<0))if(!i)i=new i5(n,o,e||a.diagnostics[0]);else{if(a.diagnostics.indexOf(i.diagnostic)<0)return!1;i=new i5(i.from,o,i.diagnostic)}}),i}function MV(t,e){let A=e.pos,i=e.end||A,n=t.state.facet(p0).hideOn(t,A,i);if(n!=null)return n;let o=t.startState.doc.lineAt(e.pos);return!!(t.effects.some(a=>a.is(a5))||t.changes.touchesRange(o.from,Math.max(o.to,i)))}function SV(t,e){return t.field(Nl,!1)?e:e.concat(Wi.appendConfig.of(KV))}function s3A(t,e){return{effects:SV(t,[a5.of(e)])}}var a5=Wi.define(),kx=Wi.define(),kV=Wi.define(),Nl=Ma.define({create(){return new td(St.none,null,null)},update(t,e){if(e.docChanged&&t.diagnostics.size){let A=t.diagnostics.map(e.changes),i=null,n=t.panel;if(t.selected){let o=e.changes.mapPos(t.selected.from,1);i=iI(A,t.selected.diagnostic,o)||iI(A,null,o)}!A.size&&n&&e.state.facet(p0).autoPanel&&(n=null),t=new td(A,n,i)}for(let A of e.effects)if(A.is(a5)){let i=e.state.facet(p0).autoPanel?A.value.length?cf.open:null:t.panel;t=td.init(A.value,i,e.state)}else A.is(kx)?t=new td(t.diagnostics,A.value?cf.open:null,t.selected):A.is(kV)&&(t=new td(t.diagnostics,t.panel,A.value));return t},provide:t=>[q1.from(t,e=>e.panel),ci.decorations.from(t,e=>e.diagnostics)]});var l3A=St.mark({class:"cm-lintRange cm-lintRange-active"});function g3A(t,e,A){let{diagnostics:i}=t.state.field(Nl),n,o=-1,a=-1;i.between(e-(A<0?1:0),e+(A>0?1:0),(s,l,{spec:g})=>{if(e>=s&&e<=l&&(s==l||(e>s||A>0)&&(eFV(t,A,!1)))}var c3A=t=>{let e=t.state.field(Nl,!1);(!e||!e.panel)&&t.dispatch({effects:SV(t.state,[kx.of(!0)])});let A=W4(t,cf.open);return A&&A.dom.querySelector(".cm-panel-lint ul").focus(),!0},vV=t=>{let e=t.state.field(Nl,!1);return!e||!e.panel?!1:(t.dispatch({effects:kx.of(!1)}),!0)},C3A=t=>{let e=t.state.field(Nl,!1);if(!e)return!1;let A=t.state.selection.main,i=iI(e.diagnostics,null,A.to+1);return!i&&(i=iI(e.diagnostics,null,0),!i||i.from==A.from&&i.to==A.to)?!1:(t.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0}),!0)};var _V=[{key:"Mod-Shift-m",run:c3A,preventDefault:!0},{key:"F8",run:C3A}],I3A=_o.fromClass(class{constructor(t){this.view=t,this.timeout=-1,this.set=!0;let{delay:e}=t.state.facet(p0);this.lintTime=Date.now()+e,this.run=this.run.bind(this),this.timeout=setTimeout(this.run,e)}run(){clearTimeout(this.timeout);let t=Date.now();if(tPromise.resolve(i(this.view))),i=>{this.view.state.doc==e.doc&&this.view.dispatch(s3A(this.view.state,i.reduce((n,o)=>n.concat(o))))},i=>{Sr(this.view.state,i)})}}update(t){let e=t.state.facet(p0);(t.docChanged||e!=t.startState.facet(p0)||e.needsRefresh&&e.needsRefresh(t))&&(this.lintTime=Date.now()+e.delay,this.set||(this.set=!0,this.timeout=setTimeout(this.run,e.delay)))}force(){this.set&&(this.lintTime=Date.now(),this.run())}destroy(){clearTimeout(this.timeout)}});function d3A(t,e,A){let i=[],n=-1;for(let o of t)o.then(a=>{i.push(a),clearTimeout(n),i.length==t.length?e(i):n=setTimeout(()=>e(i),200)},A)}var p0=At.define({combine(t){return gA({sources:t.map(e=>e.source).filter(e=>e!=null)},Mr(t.map(e=>e.config),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{delay:Math.max,markerFilter:bV,tooltipFilter:bV,needsRefresh:(e,A)=>e?A?i=>e(i)||A(i):e:A,hideOn:(e,A)=>e?A?(i,n,o)=>e(i,n,o)||A(i,n,o):e:A,autoPanel:(e,A)=>e||A}))}});function bV(t,e){return t?e?(A,i)=>e(t(A,i),i):t:e}function RV(t,e={}){return[p0.of({source:t,config:e}),I3A,KV]}function NV(t){let e=[];if(t)A:for(let{name:A}of t){for(let i=0;io.toLowerCase()==n.toLowerCase())){e.push(n);continue A}}e.push("")}return e}function FV(t,e,A){var i;let n=A?NV(e.actions):[];return no("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},no("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage(t):e.message),(i=e.actions)===null||i===void 0?void 0:i.map((o,a)=>{let r=!1,s=d=>{if(d.preventDefault(),r)return;r=!0;let h=iI(t.state.field(Nl).diagnostics,e);h&&o.apply(t,h.from,h.to)},{name:l}=o,g=n[a]?l.indexOf(n[a]):-1,C=g<0?l:[l.slice(0,g),no("u",l.slice(g,g+1)),l.slice(g+1)],I=o.markClass?" "+o.markClass:"";return no("button",{type:"button",class:"cm-diagnosticAction"+I,onclick:s,onmousedown:s,"aria-label":` Action: ${l}${g<0?"":` (access key "${n[a]})"`}.`},C)}),e.source&&no("div",{class:"cm-diagnosticSource"},e.source))}var Mx=class extends sl{constructor(e){super(),this.sev=e}eq(e){return e.sev==this.sev}toDOM(){return no("span",{class:"cm-lintPoint cm-lintPoint-"+this.sev})}},n5=class{constructor(e,A){this.diagnostic=A,this.id="item_"+Math.floor(Math.random()*4294967295).toString(16),this.dom=FV(e,A,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}},cf=class t{constructor(e){this.view=e,this.items=[];let A=n=>{if(!(n.ctrlKey||n.altKey||n.metaKey)){if(n.keyCode==27)vV(this.view),this.view.focus();else if(n.keyCode==38||n.keyCode==33)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(n.keyCode==40||n.keyCode==34)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(n.keyCode==36)this.moveSelection(0);else if(n.keyCode==35)this.moveSelection(this.items.length-1);else if(n.keyCode==13)this.view.focus();else if(n.keyCode>=65&&n.keyCode<=90&&this.selectedIndex>=0){let{diagnostic:o}=this.items[this.selectedIndex],a=NV(o.actions);for(let r=0;r{for(let o=0;ovV(this.view)},"\xD7")),this.update()}get selectedIndex(){let e=this.view.state.field(Nl).selected;if(!e)return-1;for(let A=0;A{for(let g of l.diagnostics){if(a.has(g))continue;a.add(g);let C=-1,I;for(let d=i;di&&(this.items.splice(i,C-i),n=!0)),A&&I.diagnostic==A.diagnostic?I.dom.hasAttribute("aria-selected")||(I.dom.setAttribute("aria-selected","true"),o=I):I.dom.hasAttribute("aria-selected")&&I.dom.removeAttribute("aria-selected"),i++}});i({sel:o.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:r,panel:s})=>{let l=s.height/this.list.offsetHeight;r.tops.bottom&&(this.list.scrollTop+=(r.bottom-s.bottom)/l)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let e=this.list.firstChild;function A(){let i=e;e=i.nextSibling,i.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;e!=i.dom;)A();e=i.dom.nextSibling}else this.list.insertBefore(i.dom,e);for(;e;)A()}moveSelection(e){if(this.selectedIndex<0)return;let A=this.view.state.field(Nl),i=iI(A.diagnostics,this.items[e].diagnostic);i&&this.view.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0,effects:kV.of(i)})}static open(e){return new t(e)}};function t5(t,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(t)}')`}function e5(t){return t5(``,'width="6" height="3"')}var B3A=ci.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:e5("#d11")},".cm-lintRange-warning":{backgroundImage:e5("orange")},".cm-lintRange-info":{backgroundImage:e5("#999")},".cm-lintRange-hint":{backgroundImage:e5("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}},"&dark .cm-lintRange-active":{backgroundColor:"#86714a80"},"&dark .cm-panel.cm-panel-lint ul":{"& [aria-selected]":{backgroundColor:"#2e343e"}}});function E3A(t){return t=="error"?4:t=="warning"?3:t=="info"?2:1}function LV(t){let e="hint",A=1;for(let i of t){let n=E3A(i.severity);n>A&&(A=n,e=i.severity)}return e}var o5=class extends gl{constructor(e){super(),this.diagnostics=e,this.severity=LV(e)}toDOM(e){let A=document.createElement("div");A.className="cm-lint-marker cm-lint-marker-"+this.severity;let i=this.diagnostics,n=e.state.facet(r5).tooltipFilter;return n&&(i=n(i,e.state)),i.length&&(A.onmouseover=()=>Q3A(e,A,i)),A}};function h3A(t,e){let A=i=>{let n=e.getBoundingClientRect();if(!(i.clientX>n.left-10&&i.clientXn.top-10&&i.clientYe.getBoundingClientRect()}}})}),e.onmouseout=e.onmousemove=null,h3A(t,e)}let{hoverTime:n}=t.state.facet(r5),o=setTimeout(i,n);e.onmouseout=()=>{clearTimeout(o),e.onmouseout=e.onmousemove=null},e.onmousemove=()=>{clearTimeout(o),o=setTimeout(i,n)}}function u3A(t,e){let A=Object.create(null);for(let n of e){let o=t.lineAt(n.from);(A[o.from]||(A[o.from]=[])).push(n)}let i=[];for(let n in A)i.push(new o5(A[n]).range(+n));return io.of(i,!0)}var f3A=Kw({class:"cm-gutter-lint",markers:t=>t.state.field(Sx),widgetMarker:(t,e,A)=>{let i=[];return t.state.field(Sx).between(A.from,A.to,(n,o,a)=>{n>A.from&&ni.is(xx)?i.value:A,t)},provide:t=>$E.from(t)}),p3A=ci.baseTheme({".cm-gutter-lint":{width:"1.4em","& .cm-gutterElement":{padding:".2em"}},".cm-lint-marker":{width:"1em",height:"1em"},".cm-lint-marker-info":{content:t5('')},".cm-lint-marker-warning":{content:t5('')},".cm-lint-marker-error":{content:t5('')}}),KV=[Nl,ci.decorations.compute([Nl],t=>{let{selected:e,panel:A}=t.field(Nl);return!e||!A||e.from==e.to?St.none:St.set([l3A.range(e.from,e.to)])}),$j(g3A,{hideOn:MV}),B3A],r5=At.define({combine(t){return Mr(t,{hoverTime:300,markerFilter:null,tooltipFilter:null})}});function UV(t={}){return[r5.of(t),Sx,f3A,p3A,GV]}var Rx=class t{constructor(e,A,i,n,o,a,r,s,l,g=0,C){this.p=e,this.stack=A,this.state=i,this.reducePos=n,this.pos=o,this.score=a,this.buffer=r,this.bufferBase=s,this.curContext=l,this.lookAhead=g,this.parent=C}toString(){return`[${this.stack.filter((e,A)=>A%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,A,i=0){let n=e.parser.context;return new t(e,[],A,i,i,0,[],0,n?new s5(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,A){this.stack.push(this.state,A,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var A;let i=e>>19,n=e&65535,{parser:o}=this.p,a=this.reducePos=2e3&&!(!((A=this.p.parser.nodeSet.types[n])===null||A===void 0)&&A.isAnonymous)&&(l==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=g):this.p.lastBigReductionSizes;)this.stack.pop();this.reduceContext(n,l)}storeNode(e,A,i,n=4,o=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&a.buffer[r-4]==0&&a.buffer[r-1]>-1){if(A==i)return;if(a.buffer[r-2]>=A){a.buffer[r-2]=i;return}}}if(!o||this.pos==i)this.buffer.push(e,A,i,n);else{let a=this.buffer.length;if(a>0&&(this.buffer[a-4]!=0||this.buffer[a-1]<0)){let r=!1;for(let s=a;s>0&&this.buffer[s-2]>i;s-=4)if(this.buffer[s-1]>=0){r=!0;break}if(r)for(;a>0&&this.buffer[a-2]>i;)this.buffer[a]=this.buffer[a-4],this.buffer[a+1]=this.buffer[a-3],this.buffer[a+2]=this.buffer[a-2],this.buffer[a+3]=this.buffer[a-1],a-=4,n>4&&(n-=4)}this.buffer[a]=e,this.buffer[a+1]=A,this.buffer[a+2]=i,this.buffer[a+3]=n}}shift(e,A,i,n){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let o=e,{parser:a}=this.p;this.pos=n;let r=a.stateFlag(o,1);!r&&(n>i||A<=a.maxNode)&&(this.reducePos=n),this.pushState(o,r?i:Math.min(i,this.reducePos)),this.shiftContext(A,i),A<=a.maxNode&&this.buffer.push(A,i,n,4)}else this.pos=n,this.shiftContext(A,i),A<=this.p.parser.maxNode&&this.buffer.push(A,i,n,4)}apply(e,A,i,n){e&65536?this.reduce(e):this.shift(e,A,i,n)}useNode(e,A){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=e)&&(this.p.reused.push(e),i++);let n=this.pos;this.reducePos=this.pos=n+e.length,this.pushState(A,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,A=e.buffer.length;for(;A>0&&e.buffer[A-2]>e.reducePos;)A-=4;let i=e.buffer.slice(A),n=e.bufferBase+A;for(;e&&n==e.bufferBase;)e=e.parent;return new t(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,e)}recoverByDelete(e,A){let i=e<=this.p.parser.maxNode;i&&this.storeNode(e,this.pos,A,4),this.storeNode(0,this.pos,A,i?8:4),this.pos=this.reducePos=A,this.score-=190}canShift(e){for(let A=new Nx(this);;){let i=this.p.parser.stateSlot(A.state,4)||this.p.parser.hasAction(A.state,e);if(i==0)return!1;if((i&65536)==0)return!0;A.reduce(i)}}recoverByInsert(e){if(this.stack.length>=300)return[];let A=this.p.parser.nextStates(this.state);if(A.length>8||this.stack.length>=120){let n=[];for(let o=0,a;os&1&&r==a)||n.push(A[o],a)}A=n}let i=[];for(let n=0;n>19,n=A&65535,o=this.stack.length-i*3;if(o<0||e.getGoto(this.stack[o],n,!1)<0){let a=this.findForcedReduction();if(a==null)return!1;A=a}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(A),!0}findForcedReduction(){let{parser:e}=this.p,A=[],i=(n,o)=>{if(!A.includes(n))return A.push(n),e.allActions(n,a=>{if(!(a&393216))if(a&65536){let r=(a>>19)-o;if(r>1){let s=a&65535,l=this.stack.length-r*3;if(l>=0&&e.getGoto(this.stack[l],s,!1)>=0)return r<<19|65536|s}}else{let r=i(a,o+1);if(r!=null)return r}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let A=0;A0&&this.emitLookAhead()}},s5=class{constructor(e,A){this.tracker=e,this.context=A,this.hash=e.strict?e.hash(A):0}},Nx=class{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let A=e&65535,i=e>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let n=this.start.p.parser.getGoto(this.stack[this.base-3],A,!0);this.state=n}},Fx=class t{constructor(e,A,i){this.stack=e,this.pos=A,this.index=i,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,A=e.bufferBase+e.buffer.length){return new t(e,A,A-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new t(this.stack,this.pos,this.index)}};function Cf(t,e=Uint16Array){if(typeof t!="string")return t;let A=null;for(let i=0,n=0;i=92&&a--,a>=34&&a--;let s=a-32;if(s>=46&&(s-=46,r=!0),o+=s,r)break;o*=46}A?A[n++]=o:A=new e(o)}return A}var rh=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},TV=new rh,Lx=class{constructor(e,A){this.input=e,this.ranges=A,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=TV,this.rangeIndex=0,this.pos=this.chunkPos=A[0].from,this.range=A[0],this.end=A[A.length-1].to,this.readNext()}resolveOffset(e,A){let i=this.range,n=this.rangeIndex,o=this.pos+e;for(;oi.to:o>=i.to;){if(n==this.ranges.length-1)return null;let a=this.ranges[++n];o+=a.from-i.to,i=a}return o}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,A.from);return this.end}peek(e){let A=this.chunkOff+e,i,n;if(A>=0&&A=this.chunk2Pos&&ir.to&&(this.chunk2=this.chunk2.slice(0,r.to-i)),n=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),n}acceptToken(e,A=0){let i=A?this.resolveOffset(A,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,A){if(A?(this.token=A,A.start=e,A.lookAhead=e+1,A.value=A.extended=-1):this.token=TV,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&A<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,A-this.chunkPos);if(e>=this.chunk2Pos&&A<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,A-this.chunk2Pos);if(e>=this.range.from&&A<=this.range.to)return this.input.read(e,A);let i="";for(let n of this.ranges){if(n.from>=A)break;n.to>e&&(i+=this.input.read(Math.max(n.from,e),Math.min(n.to,A)))}return i}},nI=class{constructor(e,A){this.data=e,this.id=A}token(e,A){let{parser:i}=A.p;zV(this.data,e,A,this.id,i.data,i.tokenPrecTable)}};nI.prototype.contextual=nI.prototype.fallback=nI.prototype.extend=!1;var Gx=class{constructor(e,A,i){this.precTable=A,this.elseToken=i,this.data=typeof e=="string"?Cf(e):e}token(e,A){let i=e.pos,n=0;for(;;){let o=e.next<0,a=e.resolveOffset(1,1);if(zV(this.data,e,A,0,this.data,this.precTable),e.token.value>-1)break;if(this.elseToken==null)return;if(o||n++,a==null)break;e.reset(a,e.token)}n&&(e.reset(i,e.token),e.acceptToken(this.elseToken,n))}};Gx.prototype.contextual=nI.prototype.fallback=nI.prototype.extend=!1;function zV(t,e,A,i,n,o){let a=0,r=1<0){let h=t[d];if(s.allows(h)&&(e.token.value==-1||e.token.value==h||w3A(h,e.token.value,n,o))){e.acceptToken(h);break}}let g=e.next,C=0,I=t[a+2];if(e.next<0&&I>C&&t[l+I*3-3]==65535){a=t[l+I*3-1];continue A}for(;C>1,h=l+d+(d<<1),E=t[h],f=t[h+1]||65536;if(g=f)C=d+1;else{a=t[h+2],e.advance();continue A}}break}}function JV(t,e,A){for(let i=e,n;(n=t[i])!=65535;i++)if(n==A)return i-e;return-1}function w3A(t,e,A,i){let n=JV(A,i,e);return n<0||JV(A,i,t)e)&&!i.type.isError)return A<0?Math.max(0,Math.min(i.to-1,e-25)):Math.min(t.length,Math.max(i.from+1,e+25));if(A<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return A<0?0:t.length}}var Kx=class{constructor(e,A){this.fragments=e,this.nodeSet=A,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?OV(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?OV(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=a,null;if(o instanceof Ka){if(a==e){if(a=Math.max(this.safeFrom,e)&&(this.trees.push(o),this.start.push(a),this.index.push(0))}else this.index[A]++,this.nextStart=a+o.length}}},Ux=class{constructor(e,A){this.stream=A,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(i=>new rh)}getActions(e){let A=0,i=null,{parser:n}=e.p,{tokenizers:o}=n,a=n.stateSlot(e.state,3),r=e.curContext?e.curContext.hash:0,s=0;for(let l=0;lC.end+25&&(s=Math.max(C.lookAhead,s)),C.value!=0)){let I=A;if(C.extended>-1&&(A=this.addActions(e,C.extended,C.end,A)),A=this.addActions(e,C.value,C.end,A),!g.extend&&(i=C,A>I))break}}for(;this.actions.length>A;)this.actions.pop();return s&&e.setLookAhead(s),!i&&e.pos==this.stream.end&&(i=new rh,i.value=e.p.parser.eofTerm,i.start=i.end=e.pos,A=this.addActions(e,i.value,i.end,A)),this.mainToken=i,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let A=new rh,{pos:i,p:n}=e;return A.start=i,A.end=Math.min(i+1,n.stream.end),A.value=i==n.stream.end?n.parser.eofTerm:0,A}updateCachedToken(e,A,i){let n=this.stream.clipPos(i.pos);if(A.token(this.stream.reset(n,e),i),e.value>-1){let{parser:o}=i.p;for(let a=0;a=0&&i.p.parser.dialect.allows(r>>1)){(r&1)==0?e.value=r>>1:e.extended=r>>1;break}}}else e.value=0,e.end=this.stream.clipPos(n+1)}putAction(e,A,i,n){for(let o=0;oe.bufferLength*4?new Kx(i,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,A=this.minStackPos,i=this.stacks=[],n,o;if(this.bigReductionCount>300&&e.length==1){let[a]=e;for(;a.forceReduce()&&a.stack.length&&a.stack[a.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let a=0;aA)i.push(r);else{if(this.advanceStack(r,i,e))continue;{n||(n=[],o=[]),n.push(r);let s=this.tokens.getMainToken(r);o.push(s.value,s.end)}}break}}if(!i.length){let a=n&&D3A(n);if(a)return Fl&&console.log("Finish with "+this.stackID(a)),this.stackToTree(a);if(this.parser.strict)throw Fl&&n&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+A);this.recovering||(this.recovering=5)}if(this.recovering&&n){let a=this.stoppedAt!=null&&n[0].pos>this.stoppedAt?n[0]:this.runRecovery(n,o,i);if(a)return Fl&&console.log("Force-finish "+this.stackID(a)),this.stackToTree(a.forceAll())}if(this.recovering){let a=this.recovering==1?1:this.recovering*3;if(i.length>a)for(i.sort((r,s)=>s.score-r.score);i.length>a;)i.pop();i.some(r=>r.reducePos>A)&&this.recovering--}else if(i.length>1){A:for(let a=0;a500&&l.buffer.length>500)if((r.score-l.score||r.buffer.length-l.buffer.length)>0)i.splice(s--,1);else{i.splice(a--,1);continue A}}}i.length>12&&(i.sort((a,r)=>r.score-a.score),i.splice(12,i.length-12))}this.minStackPos=i[0].pos;for(let a=1;a ":"";if(this.stoppedAt!=null&&n>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let l=e.curContext&&e.curContext.tracker.strict,g=l?e.curContext.hash:0;for(let C=this.fragments.nodeAt(n);C;){let I=this.parser.nodeSet.types[C.type.id]==C.type?o.getGoto(e.state,C.type.id):-1;if(I>-1&&C.length&&(!l||(C.prop(Ni.contextHash)||0)==g))return e.useNode(C,I),Fl&&console.log(a+this.stackID(e)+` (via reuse of ${o.getName(C.type.id)})`),!0;if(!(C instanceof Ka)||C.children.length==0||C.positions[0]>0)break;let d=C.children[0];if(d instanceof Ka&&C.positions[0]==0)C=d;else break}}let r=o.stateSlot(e.state,4);if(r>0)return e.reduce(r),Fl&&console.log(a+this.stackID(e)+` (via always-reduce ${o.getName(r&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let s=this.tokens.getActions(e);for(let l=0;ln?A.push(h):i.push(h)}return!1}advanceFully(e,A){let i=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>i)return YV(e,A),!0}}runRecovery(e,A,i){let n=null,o=!1;for(let a=0;a ":"";if(r.deadEnd&&(o||(o=!0,r.restart(),Fl&&console.log(g+this.stackID(r)+" (restarted)"),this.advanceFully(r,i))))continue;let C=r.split(),I=g;for(let d=0;d<10&&C.forceReduce()&&(Fl&&console.log(I+this.stackID(C)+" (via force-reduce)"),!this.advanceFully(C,i));d++)Fl&&(I=this.stackID(C)+" -> ");for(let d of r.recoverByInsert(s))Fl&&console.log(g+this.stackID(d)+" (via recover-insert)"),this.advanceFully(d,i);this.stream.end>r.pos?(l==r.pos&&(l++,s=0),r.recoverByDelete(s,l),Fl&&console.log(g+this.stackID(r)+` (via recover-delete ${this.parser.getName(s)})`),YV(r,i)):(!n||n.scoree.topRules[r][1]),n=[];for(let r=0;r=0)o(g,s,r[l++]);else{let C=r[l+-g];for(let I=-g;I>0;I--)o(r[l++],s,C);l++}}}this.nodeSet=new X4(A.map((r,s)=>Qs.define({name:s>=this.minRepeatTerm?void 0:r,id:s,props:n[s],top:i.indexOf(s)>-1,error:s==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(s)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=1024;let a=Cf(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let r=0;rtypeof r=="number"?new nI(a,r):r),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,A,i){let n=new Tx(this,e,A,i);for(let o of this.wrappers)n=o(n,e,A,i);return n}getGoto(e,A,i=!1){let n=this.goto;if(A>=n[0])return-1;for(let o=n[A+1];;){let a=n[o++],r=a&1,s=n[o++];if(r&&i)return s;for(let l=o+(a>>1);o0}validAction(e,A){return!!this.allActions(e,i=>i==A?!0:null)}allActions(e,A){let i=this.stateSlot(e,4),n=i?A(i):void 0;for(let o=this.stateSlot(e,1);n==null;o+=3){if(this.data[o]==65535)if(this.data[o+1]==1)o=uC(this.data,o+2);else break;n=A(uC(this.data,o+1))}return n}nextStates(e){let A=[];for(let i=this.stateSlot(e,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=uC(this.data,i+2);else break;if((this.data[i+2]&1)==0){let n=this.data[i+1];A.some((o,a)=>a&1&&o==n)||A.push(this.data[i],n)}}return A}configure(e){let A=Object.assign(Object.create(t.prototype),this);if(e.props&&(A.nodeSet=this.nodeSet.extend(...e.props)),e.top){let i=this.topRules[e.top];if(!i)throw new RangeError(`Invalid top rule name ${e.top}`);A.top=i}return e.tokenizers&&(A.tokenizers=this.tokenizers.map(i=>{let n=e.tokenizers.find(o=>o.from==i);return n?n.to:i})),e.specializers&&(A.specializers=this.specializers.slice(),A.specializerSpecs=this.specializerSpecs.map((i,n)=>{let o=e.specializers.find(r=>r.from==i.external);if(!o)return i;let a=Object.assign(Object.assign({},i),{external:o.to});return A.specializers[n]=HV(a),a})),e.contextTracker&&(A.context=e.contextTracker),e.dialect&&(A.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(A.strict=e.strict),e.wrap&&(A.wrappers=A.wrappers.concat(e.wrap)),e.bufferLength!=null&&(A.bufferLength=e.bufferLength),A}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let A=this.dynamicPrecedences;return A==null?0:A[e]||0}parseDialect(e){let A=Object.keys(this.dialects),i=A.map(()=>!1);if(e)for(let o of e.split(" ")){let a=A.indexOf(o);a>=0&&(i[a]=!0)}let n=null;for(let o=0;oi)&&A.p.parser.stateFlag(A.state,2)&&(!e||e.scoret.external(A,i)<<1|e}return t.get}var y3A=Pw({String:Fe.string,Number:Fe.number,"True False":Fe.bool,PropertyName:Fe.propertyName,Null:Fe.null,", :":Fe.separator,"[ ]":Fe.squareBracket,"{ }":Fe.brace}),PV=l5.deserialize({version:14,states:"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l",stateData:"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O",goto:"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R",nodeNames:"\u26A0 JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array",maxTerm:25,nodeProps:[["isolate",-2,6,11,""],["openedBy",7,"{",14,"["],["closedBy",8,"}",15,"]"]],propSources:[y3A],skippedNodes:[0],repeatNodeCount:2,tokenData:"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~",tokenizers:[0],topRules:{JsonText:[0,1]},tokenPrec:0});var v3A=jw.define({name:"json",parser:PV.configure({props:[Ex.add({Object:hx({except:/^\s*\}/}),Array:hx({except:/^\s*\]/})}),rf.add({"Object Array":bq})]}),languageData:{closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/}});function jV(){return new qw(v3A)}var qV=typeof String.prototype.normalize=="function"?t=>t.normalize("NFKD"):t=>t,aI=class{constructor(e,A,i=0,n=e.length,o,a){this.test=a,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(i,n),this.bufferStart=i,this.normalize=o?r=>o(qV(r)):qV,this.query=this.normalize(A)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return qr(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let A=_4(e),i=this.bufferStart+this.bufferPos;this.bufferPos+=_l(e);let n=this.normalize(A);if(n.length)for(let o=0,a=i;;o++){let r=n.charCodeAt(o),s=this.match(r,a,this.bufferPos+this.bufferStart);if(o==n.length-1){if(s)return this.value=s,this;break}a==i&&othis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let A=this.matchPos<=this.to&&this.re.exec(this.curLine);if(A){let i=this.curLineStart+A.index,n=i+A[0].length;if(this.matchPos=B5(this.text,n+(i==n?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,n,A)))return this.value={from:i,to:n,match:A},this;e=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length=i||n.to<=A){let r=new t(A,e.sliceString(A,i));return Ox.set(e,r),r}if(n.from==A&&n.to==i)return n;let{text:o,from:a}=n;return a>A&&(o=e.sliceString(A,a)+o,a=A),n.to=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,A=this.re.exec(this.flat.text);if(A&&!A[0]&&A.index==e&&(this.re.lastIndex=e+1,A=this.re.exec(this.flat.text)),A){let i=this.flat.from+A.index,n=i+A[0].length;if((this.flat.to>=this.to||A.index+A[0].length<=this.flat.text.length-10)&&(!this.test||this.test(i,n,A)))return this.value={from:i,to:n,match:A},this.matchPos=B5(this.text,n+(i==n?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=I5.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}};typeof Symbol<"u"&&(C5.prototype[Symbol.iterator]=d5.prototype[Symbol.iterator]=function(){return this});function b3A(t){try{return new RegExp(t,qx),!0}catch(e){return!1}}function B5(t,e){if(e>=t.length)return e;let A=t.lineAt(e),i;for(;e=56320&&i<57344;)e++;return e}var M3A=t=>{let{state:e}=t,A=String(e.doc.lineAt(t.state.selection.main.head).number),{close:i,result:n}=eq(t,{label:e.phrase("Go to line"),input:{type:"text",name:"line",value:A},focus:!0,submitLabel:e.phrase("go")});return n.then(o=>{let a=o&&/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(o.elements.line.value);if(!a){t.dispatch({effects:i});return}let r=e.doc.lineAt(e.selection.main.head),[,s,l,g,C]=a,I=g?+g.slice(1):0,d=l?+l:r.number;if(l&&C){let f=d/100;s&&(f=f*(s=="-"?-1:1)+r.number/e.doc.lines),d=Math.round(e.doc.lines*f)}else l&&s&&(d=d*(s=="-"?-1:1)+r.number);let h=e.doc.line(Math.max(1,Math.min(e.doc.lines,d))),E=Ie.cursor(h.from+Math.max(0,Math.min(I,h.length)));t.dispatch({effects:[i,ci.scrollIntoView(E.from,{y:"center"})],selection:E})}),!0},S3A={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},XV=At.define({combine(t){return Mr(t,S3A,{highlightWordAroundCursor:(e,A)=>e||A,minSelectionLength:Math.min,maxMatches:Math.min})}});function $V(t){let e=[N3A,R3A];return t&&e.push(XV.of(t)),e}var k3A=St.mark({class:"cm-selectionMatch"}),x3A=St.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function VV(t,e,A,i){return(A==0||t(e.sliceDoc(A-1,A))!=Uo.Word)&&(i==e.doc.length||t(e.sliceDoc(i,i+1))!=Uo.Word)}function _3A(t,e,A,i){return t(e.sliceDoc(A,A+1))==Uo.Word&&t(e.sliceDoc(i-1,i))==Uo.Word}var R3A=_o.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.selectionSet||t.docChanged||t.viewportChanged)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=t.state.facet(XV),{state:A}=t,i=A.selection;if(i.ranges.length>1)return St.none;let n=i.main,o,a=null;if(n.empty){if(!e.highlightWordAroundCursor)return St.none;let s=A.wordAt(n.head);if(!s)return St.none;a=A.charCategorizer(n.head),o=A.sliceDoc(s.from,s.to)}else{let s=n.to-n.from;if(s200)return St.none;if(e.wholeWords){if(o=A.sliceDoc(n.from,n.to),a=A.charCategorizer(n.head),!(VV(a,A,n.from,n.to)&&_3A(a,A,n.from,n.to)))return St.none}else if(o=A.sliceDoc(n.from,n.to),!o)return St.none}let r=[];for(let s of t.visibleRanges){let l=new aI(A.doc,o,s.from,s.to);for(;!l.next().done;){let{from:g,to:C}=l.value;if((!a||VV(a,A,g,C))&&(n.empty&&g<=n.from&&C>=n.to?r.push(x3A.range(g,C)):(g>=n.to||C<=n.from)&&r.push(k3A.range(g,C)),r.length>e.maxMatches))return St.none}}return St.set(r)}},{decorations:t=>t.decorations}),N3A=ci.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),F3A=({state:t,dispatch:e})=>{let{selection:A}=t,i=Ie.create(A.ranges.map(n=>t.wordAt(n.head)||Ie.cursor(n.head)),A.mainIndex);return i.eq(A)?!1:(e(t.update({selection:i})),!0)};function L3A(t,e){let{main:A,ranges:i}=t.selection,n=t.wordAt(A.head),o=n&&n.from==A.from&&n.to==A.to;for(let a=!1,r=new aI(t.doc,e,i[i.length-1].to);;)if(r.next(),r.done){if(a)return null;r=new aI(t.doc,e,0,Math.max(0,i[i.length-1].from-1)),a=!0}else{if(a&&i.some(s=>s.from==r.value.from))continue;if(o){let s=t.wordAt(r.value.from);if(!s||s.from!=r.value.from||s.to!=r.value.to)continue}return r.value}}var G3A=({state:t,dispatch:e})=>{let{ranges:A}=t.selection;if(A.some(o=>o.from===o.to))return F3A({state:t,dispatch:e});let i=t.sliceDoc(A[0].from,A[0].to);if(t.selection.ranges.some(o=>t.sliceDoc(o.from,o.to)!=i))return!1;let n=L3A(t,i);return n?(e(t.update({selection:t.selection.addRange(Ie.range(n.from,n.to),!1),effects:ci.scrollIntoView(n.to)})),!0):!1},id=At.define({combine(t){return Mr(t,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new Px(e),scrollToMatch:e=>ci.scrollIntoView(e)})}});function AW(t){return t?[id.of(t),jx]:jx}var E5=class{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||b3A(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord,this.test=e.test}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,(A,i)=>i=="n"?` -`:i=="r"?"\r":i=="t"?" ":"\\")}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord&&this.test==e.test}create(){return this.regexp?new Hx(this):new Yx(this)}getCursor(e,A=0,i){let n=e.doc?e:qa.create({doc:e});return i==null&&(i=n.doc.length),this.regexp?lh(this,n,A,i):sh(this,n,A,i)}},h5=class{constructor(e){this.spec=e}};function K3A(t,e,A){return(i,n,o,a)=>{if(A&&!A(i,n,o,a))return!1;let r=i>=a&&n<=a+o.length?o.slice(i-a,n-a):e.doc.sliceString(i,n);return t(r,e,i,n)}}function sh(t,e,A,i){let n;return t.wholeWord&&(n=U3A(e.doc,e.charCategorizer(e.selection.main.head))),t.test&&(n=K3A(t.test,e,n)),new aI(e.doc,t.unquoted,A,i,t.caseSensitive?void 0:o=>o.toLowerCase(),n)}function U3A(t,e){return(A,i,n,o)=>((o>A||o+n.length=A)return null;n.push(i.value)}return n}highlight(e,A,i,n){let o=sh(this.spec,e,Math.max(0,A-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}};function T3A(t,e,A){return(i,n,o)=>(!A||A(i,n,o))&&t(o[0],e,i,n)}function lh(t,e,A,i){let n;return t.wholeWord&&(n=J3A(e.charCategorizer(e.selection.main.head))),t.test&&(n=T3A(t.test,e,n)),new C5(e.doc,t.search,{ignoreCase:!t.caseSensitive,test:n},A,i)}function Q5(t,e){return t.slice(ja(t,e,!1),e)}function u5(t,e){return t.slice(e,ja(t,e))}function J3A(t){return(e,A,i)=>!i[0].length||(t(Q5(i.input,i.index))!=Uo.Word||t(u5(i.input,i.index))!=Uo.Word)&&(t(u5(i.input,i.index+i[0].length))!=Uo.Word||t(Q5(i.input,i.index+i[0].length))!=Uo.Word)}var Hx=class extends h5{nextMatch(e,A,i){let n=lh(this.spec,e,i,e.doc.length).next();return n.done&&(n=lh(this.spec,e,0,A).next()),n.done?null:n.value}prevMatchInRange(e,A,i){for(let n=1;;n++){let o=Math.max(A,i-n*1e4),a=lh(this.spec,e,o,i),r=null;for(;!a.next().done;)r=a.value;if(r&&(o==A||r.from>o+10))return r;if(o==A)return null}}prevMatch(e,A,i){return this.prevMatchInRange(e,0,A)||this.prevMatchInRange(e,i,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(A,i)=>{if(i=="&")return e.match[0];if(i=="$")return"$";for(let n=i.length;n>0;n--){let o=+i.slice(0,n);if(o>0&&o=A)return null;n.push(i.value)}return n}highlight(e,A,i,n){let o=lh(this.spec,e,Math.max(0,A-250),Math.min(i+250,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}},df=Wi.define(),Vx=Wi.define(),oI=Ma.define({create(t){return new If(zx(t).create(),null)},update(t,e){for(let A of e.effects)A.is(df)?t=new If(A.value.create(),t.panel):A.is(Vx)&&(t=new If(t.query,A.value?Wx:null));return t},provide:t=>q1.from(t,e=>e.panel)});var If=class{constructor(e,A){this.query=e,this.panel=A}},O3A=St.mark({class:"cm-searchMatch"}),Y3A=St.mark({class:"cm-searchMatch cm-searchMatch-selected"}),H3A=_o.fromClass(class{constructor(t){this.view=t,this.decorations=this.highlight(t.state.field(oI))}update(t){let e=t.state.field(oI);(e!=t.startState.field(oI)||t.docChanged||t.selectionSet||t.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:t,panel:e}){if(!e||!t.spec.valid)return St.none;let{view:A}=this,i=new jr;for(let n=0,o=A.visibleRanges,a=o.length;no[n+1].from-500;)s=o[++n].to;t.highlight(A.state,r,s,(l,g)=>{let C=A.state.selection.ranges.some(I=>I.from==l&&I.to==g);i.add(l,g,C?Y3A:O3A)})}return i.finish()}},{decorations:t=>t.decorations});function Bf(t){return e=>{let A=e.state.field(oI,!1);return A&&A.query.spec.valid?t(e,A):m5(e)}}var f5=Bf((t,{query:e})=>{let{to:A}=t.state.selection.main,i=e.nextMatch(t.state,A,A);if(!i)return!1;let n=Ie.single(i.from,i.to),o=t.state.facet(id);return t.dispatch({selection:n,effects:[Zx(t,i),o.scrollToMatch(n.main,t)],userEvent:"select.search"}),tW(t),!0}),p5=Bf((t,{query:e})=>{let{state:A}=t,{from:i}=A.selection.main,n=e.prevMatch(A,i,i);if(!n)return!1;let o=Ie.single(n.from,n.to),a=t.state.facet(id);return t.dispatch({selection:o,effects:[Zx(t,n),a.scrollToMatch(o.main,t)],userEvent:"select.search"}),tW(t),!0}),z3A=Bf((t,{query:e})=>{let A=e.matchAll(t.state,1e3);return!A||!A.length?!1:(t.dispatch({selection:Ie.create(A.map(i=>Ie.range(i.from,i.to))),userEvent:"select.search.matches"}),!0)}),P3A=({state:t,dispatch:e})=>{let A=t.selection;if(A.ranges.length>1||A.main.empty)return!1;let{from:i,to:n}=A.main,o=[],a=0;for(let r=new aI(t.doc,t.sliceDoc(i,n));!r.next().done;){if(o.length>1e3)return!1;r.value.from==i&&(a=o.length),o.push(Ie.range(r.value.from,r.value.to))}return e(t.update({selection:Ie.create(o,a),userEvent:"select.search.matches"})),!0},WV=Bf((t,{query:e})=>{let{state:A}=t,{from:i,to:n}=A.selection.main;if(A.readOnly)return!1;let o=e.nextMatch(A,i,i);if(!o)return!1;let a=o,r=[],s,l,g=[];a.from==i&&a.to==n&&(l=A.toText(e.getReplacement(a)),r.push({from:a.from,to:a.to,insert:l}),a=e.nextMatch(A,a.from,a.to),g.push(ci.announce.of(A.phrase("replaced match on line $",A.doc.lineAt(i).number)+".")));let C=t.state.changes(r);return a&&(s=Ie.single(a.from,a.to).map(C),g.push(Zx(t,a)),g.push(A.facet(id).scrollToMatch(s.main,t))),t.dispatch({changes:C,selection:s,effects:g,userEvent:"input.replace"}),!0}),j3A=Bf((t,{query:e})=>{if(t.state.readOnly)return!1;let A=e.matchAll(t.state,1e9).map(n=>{let{from:o,to:a}=n;return{from:o,to:a,insert:e.getReplacement(n)}});if(!A.length)return!1;let i=t.state.phrase("replaced $ matches",A.length)+".";return t.dispatch({changes:A,effects:ci.announce.of(i),userEvent:"input.replace.all"}),!0});function Wx(t){return t.state.facet(id).createPanel(t)}function zx(t,e){var A,i,n,o,a;let r=t.selection.main,s=r.empty||r.to>r.from+100?"":t.sliceDoc(r.from,r.to);if(e&&!s)return e;let l=t.facet(id);return new E5({search:((A=e?.literal)!==null&&A!==void 0?A:l.literal)?s:s.replace(/\n/g,"\\n"),caseSensitive:(i=e?.caseSensitive)!==null&&i!==void 0?i:l.caseSensitive,literal:(n=e?.literal)!==null&&n!==void 0?n:l.literal,regexp:(o=e?.regexp)!==null&&o!==void 0?o:l.regexp,wholeWord:(a=e?.wholeWord)!==null&&a!==void 0?a:l.wholeWord})}function eW(t){let e=W4(t,Wx);return e&&e.dom.querySelector("[main-field]")}function tW(t){let e=eW(t);e&&e==t.root.activeElement&&e.select()}var m5=t=>{let e=t.state.field(oI,!1);if(e&&e.panel){let A=eW(t);if(A&&A!=t.root.activeElement){let i=zx(t.state,e.query.spec);i.valid&&t.dispatch({effects:df.of(i)}),A.focus(),A.select()}}else t.dispatch({effects:[Vx.of(!0),e?df.of(zx(t.state,e.query.spec)):Wi.appendConfig.of(jx)]});return!0},w5=t=>{let e=t.state.field(oI,!1);if(!e||!e.panel)return!1;let A=W4(t,Wx);return A&&A.dom.contains(t.root.activeElement)&&t.focus(),t.dispatch({effects:Vx.of(!1)}),!0},iW=[{key:"Mod-f",run:m5,scope:"editor search-panel"},{key:"F3",run:f5,shift:p5,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:f5,shift:p5,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:w5,scope:"editor search-panel"},{key:"Mod-Shift-l",run:P3A},{key:"Mod-Alt-g",run:M3A},{key:"Mod-d",run:G3A,preventDefault:!0}],Px=class{constructor(e){this.view=e;let A=this.query=e.state.field(oI).query.spec;this.commit=this.commit.bind(this),this.searchField=no("input",{value:A.search,placeholder:Ll(e,"Find"),"aria-label":Ll(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=no("input",{value:A.replace,placeholder:Ll(e,"Replace"),"aria-label":Ll(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=no("input",{type:"checkbox",name:"case",form:"",checked:A.caseSensitive,onchange:this.commit}),this.reField=no("input",{type:"checkbox",name:"re",form:"",checked:A.regexp,onchange:this.commit}),this.wordField=no("input",{type:"checkbox",name:"word",form:"",checked:A.wholeWord,onchange:this.commit});function i(n,o,a){return no("button",{class:"cm-button",name:n,onclick:o,type:"button"},a)}this.dom=no("div",{onkeydown:n=>this.keydown(n),class:"cm-search"},[this.searchField,i("next",()=>f5(e),[Ll(e,"next")]),i("prev",()=>p5(e),[Ll(e,"previous")]),i("select",()=>z3A(e),[Ll(e,"all")]),no("label",null,[this.caseField,Ll(e,"match case")]),no("label",null,[this.reField,Ll(e,"regexp")]),no("label",null,[this.wordField,Ll(e,"by word")]),...e.state.readOnly?[]:[no("br"),this.replaceField,i("replace",()=>WV(e),[Ll(e,"replace")]),i("replaceAll",()=>j3A(e),[Ll(e,"replace all")])],no("button",{name:"close",onclick:()=>w5(e),"aria-label":Ll(e,"close"),type:"button"},["\xD7"])])}commit(){let e=new E5({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:df.of(e)}))}keydown(e){Jj(this.view,e,"search-panel")?e.preventDefault():e.keyCode==13&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?p5:f5)(this.view)):e.keyCode==13&&e.target==this.replaceField&&(e.preventDefault(),WV(this.view))}update(e){for(let A of e.transactions)for(let i of A.effects)i.is(df)&&!i.value.eq(this.query)&&this.setQuery(i.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(id).top}};function Ll(t,e){return t.state.phrase(e)}var g5=30,c5=/[\s\.,:;?!]/;function Zx(t,{from:e,to:A}){let i=t.state.doc.lineAt(e),n=t.state.doc.lineAt(A).to,o=Math.max(i.from,e-g5),a=Math.min(n,A+g5),r=t.state.sliceDoc(o,a);if(o!=i.from){for(let s=0;sr.length-g5;s--)if(!c5.test(r[s-1])&&c5.test(r[s])){r=r.slice(0,s);break}}return ci.announce.of(`${t.state.phrase("current match")}. ${r} ${t.state.phrase("on line")} ${i.number}.`)}var q3A=ci.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),jx=[oI,oc.low(H3A),q3A];var y5=class{constructor(e,A,i,n){this.state=e,this.pos=A,this.explicit=i,this.view=n,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let A=kr(this.state).resolveInner(this.pos,-1);for(;A&&e.indexOf(A.name)<0;)A=A.parent;return A?{from:A.from,to:this.pos,text:this.state.sliceDoc(A.from,this.pos),type:A.type}:null}matchBefore(e){let A=this.state.doc.lineAt(this.pos),i=Math.max(A.from,this.pos-250),n=A.text.slice(i-A.from,this.pos-A.from),o=n.search(cW(e,!1));return o<0?null:{from:i+o,to:this.pos,text:n.slice(o)}}get aborted(){return this.abortListeners==null}addEventListener(e,A,i){e=="abort"&&this.abortListeners&&(this.abortListeners.push(A),i&&i.onDocChange&&(this.abortOnDocChange=!0))}};function nW(t){let e=Object.keys(t).join(""),A=/\w/.test(e);return A&&(e=e.replace(/\w/g,"")),`[${A?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function V3A(t){let e=Object.create(null),A=Object.create(null);for(let{label:n}of t){e[n[0]]=!0;for(let o=1;otypeof n=="string"?{label:n}:n),[A,i]=e.every(n=>/^\w+$/.test(n.label))?[/\w*$/,/\w+$/]:V3A(e);return n=>{let o=n.matchBefore(i);return o||n.explicit?{from:o?o.from:n.pos,options:e,validFor:A}:null}}var v5=class{constructor(e,A,i,n){this.completion=e,this.source=A,this.match=i,this.score=n}};function od(t){return t.selection.main.from}function cW(t,e){var A;let{source:i}=t,n=e&&i[0]!="^",o=i[i.length-1]!="$";return!n&&!o?t:new RegExp(`${n?"^":""}(?:${i})${o?"$":""}`,(A=t.flags)!==null&&A!==void 0?A:t.ignoreCase?"i":"")}var CW=al.define();function Z3A(t,e,A,i){let{main:n}=t.selection,o=A-n.from,a=i-n.from;return Ye(gA({},t.changeByRange(r=>{if(r!=n&&A!=i&&t.sliceDoc(r.from+o,r.from+a)!=t.sliceDoc(A,i))return{range:r};let s=t.toText(e);return{changes:{from:r.from+o,to:i==n.from?r.to:r.from+a,insert:s},range:Ie.cursor(r.from+o+s.length)}})),{scrollIntoView:!0,userEvent:"input.complete"})}var oW=new WeakMap;function X3A(t){if(!Array.isArray(t))return t;let e=oW.get(t);return e||oW.set(t,e=W3A(t)),e}var b5=Wi.define(),Ef=Wi.define(),e_=class{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let A=0;A=48&&b<=57||b>=97&&b<=122?2:b>=65&&b<=90?1:0:(x=_4(b))!=x.toLowerCase()?1:x!=x.toUpperCase()?2:0;(!v||F==1&&f||S==0&&F!=0)&&(A[C]==b||i[C]==b&&(I=!0)?a[C++]=v:a.length&&(m=!1)),S=F,v+=_l(b)}return C==s&&a[0]==0&&m?this.result(-100+(I?-200:0),a,e):d==s&&h==0?this.ret(-200-e.length+(E==e.length?0:-100),[0,E]):r>-1?this.ret(-700-e.length,[r,r+this.pattern.length]):d==s?this.ret(-900-e.length,[h,E]):C==s?this.result(-100+(I?-200:0)+-700+(m?0:-1100),a,e):A.length==2?null:this.result((n[0]?-700:0)+-200+-1100,n,e)}result(e,A,i){let n=[],o=0;for(let a of A){let r=a+(this.astral?_l(qr(i,a)):1);o&&n[o-1]==a?n[o-1]=r:(n[o++]=a,n[o++]=r)}return this.ret(e-i.length,n)}},t_=class{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:$3A,filterStrict:!1,compareCompletions:(e,A)=>(e.sortText||e.label).localeCompare(A.sortText||A.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,A)=>e&&A,closeOnBlur:(e,A)=>e&&A,icons:(e,A)=>e&&A,tooltipClass:(e,A)=>i=>aW(e(i),A(i)),optionClass:(e,A)=>i=>aW(e(i),A(i)),addToOptions:(e,A)=>e.concat(A),filterStrict:(e,A)=>e||A})}});function aW(t,e){return t?e?t+" "+e:t:e}function $3A(t,e,A,i,n,o){let a=t.textDirection==mo.RTL,r=a,s=!1,l="top",g,C,I=e.left-n.left,d=n.right-e.right,h=i.right-i.left,E=i.bottom-i.top;if(r&&I=E||v>e.top?g=A.bottom-e.top:(l="bottom",g=e.bottom-A.top)}let f=(e.bottom-e.top)/o.offsetHeight,m=(e.right-e.left)/o.offsetWidth;return{style:`${l}: ${g/f}px; max-width: ${C/m}px`,class:"cm-completionInfo-"+(s?a?"left-narrow":"right-narrow":r?"left":"right")}}var r_=Wi.define();function ApA(t){let e=t.addToOptions.slice();return t.icons&&e.push({render(A){let i=document.createElement("div");return i.classList.add("cm-completionIcon"),A.type&&i.classList.add(...A.type.split(/\s+/g).map(n=>"cm-completionIcon-"+n)),i.setAttribute("aria-hidden","true"),i},position:20}),e.push({render(A,i,n,o){let a=document.createElement("span");a.className="cm-completionLabel";let r=A.displayLabel||A.label,s=0;for(let l=0;ls&&a.appendChild(document.createTextNode(r.slice(s,g)));let I=a.appendChild(document.createElement("span"));I.appendChild(document.createTextNode(r.slice(g,C))),I.className="cm-completionMatchedText",s=C}return sA.position-i.position).map(A=>A.render)}function Xx(t,e,A){if(t<=A)return{from:0,to:t};if(e<0&&(e=0),e<=t>>1){let n=Math.floor(e/A);return{from:n*A,to:(n+1)*A}}let i=Math.floor((t-e)/A);return{from:t-(i+1)*A,to:t-i*A}}var i_=class{constructor(e,A,i){this.view=e,this.stateField=A,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:s=>this.placeInfo(s),key:this},this.space=null,this.currentClass="";let n=e.state.field(A),{options:o,selected:a}=n.open,r=e.state.facet(xr);this.optionContent=ApA(r),this.optionClass=r.optionClass,this.tooltipClass=r.tooltipClass,this.range=Xx(o.length,a,r.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",s=>{let{options:l}=e.state.field(A).open;for(let g=s.target,C;g&&g!=this.dom;g=g.parentNode)if(g.nodeName=="LI"&&(C=/-(\d+)$/.exec(g.id))&&+C[1]this.list.lastChild.getBoundingClientRect().bottom?this.range.to:null;g!=null&&(e.dispatch({effects:r_.of(g)}),s.preventDefault())}}),this.dom.addEventListener("focusout",s=>{let l=e.state.field(this.stateField,!1);l&&l.tooltip&&e.state.facet(xr).closeOnBlur&&s.relatedTarget!=e.contentDOM&&e.dispatch({effects:Ef.of(null)})}),this.showOptions(o,n.id)}mount(){this.updateSel()}showOptions(e,A){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,A,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var A;let i=e.state.field(this.stateField),n=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),i!=n){let{options:o,selected:a,disabled:r}=i.open;(!n.open||n.open.options!=o)&&(this.range=Xx(o.length,a,e.state.facet(xr).maxRenderedOptions),this.showOptions(o,i.id)),this.updateSel(),r!=((A=n.open)===null||A===void 0?void 0:A.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!r)}}updateTooltipClass(e){let A=this.tooltipClass(e);if(A!=this.currentClass){for(let i of this.currentClass.split(" "))i&&this.dom.classList.remove(i);for(let i of A.split(" "))i&&this.dom.classList.add(i);this.currentClass=A}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),A=e.open;(A.selected>-1&&A.selected=this.range.to)&&(this.range=Xx(A.options.length,A.selected,this.view.state.facet(xr).maxRenderedOptions),this.showOptions(A.options,e.id));let i=this.updateSelectedOption(A.selected);if(i){this.destroyInfo();let{completion:n}=A.options[A.selected],{info:o}=n;if(!o)return;let a=typeof o=="string"?document.createTextNode(o):o(n);if(!a)return;"then"in a?a.then(r=>{r&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(r,n)}).catch(r=>Sr(this.view.state,r,"completion info")):(this.addInfoPane(a,n),i.setAttribute("aria-describedby",this.info.id))}}addInfoPane(e,A){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",i.id="cm-completionInfo-"+Math.floor(Math.random()*65535).toString(16),e.nodeType!=null)i.appendChild(e),this.infoDestroy=null;else{let{dom:n,destroy:o}=e;i.appendChild(n),this.infoDestroy=o||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let A=null;for(let i=this.list.firstChild,n=this.range.from;i;i=i.nextSibling,n++)i.nodeName!="LI"||!i.id?n--:n==e?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),A=i):i.hasAttribute("aria-selected")&&(i.removeAttribute("aria-selected"),i.removeAttribute("aria-describedby"));return A&&tpA(this.list,A),A}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let A=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),n=e.getBoundingClientRect(),o=this.space;if(!o){let a=this.dom.ownerDocument.documentElement;o={left:0,top:0,right:a.clientWidth,bottom:a.clientHeight}}return n.top>Math.min(o.bottom,A.bottom)-10||n.bottom{a.target==n&&a.preventDefault()});let o=null;for(let a=i.from;ai.from||i.from==0))if(o=I,typeof l!="string"&&l.header)n.appendChild(l.header(l));else{let d=n.appendChild(document.createElement("completion-section"));d.textContent=I}}let g=n.appendChild(document.createElement("li"));g.id=A+"-"+a,g.setAttribute("role","option");let C=this.optionClass(r);C&&(g.className=C);for(let I of this.optionContent){let d=I(r,this.view.state,this.view,s);d&&g.appendChild(d)}}return i.from&&n.classList.add("cm-completionListIncompleteTop"),i.tonew i_(A,t,e)}function tpA(t,e){let A=t.getBoundingClientRect(),i=e.getBoundingClientRect(),n=A.height/t.offsetHeight;i.topA.bottom&&(t.scrollTop+=(i.bottom-A.bottom)/n)}function rW(t){return(t.boost||0)*100+(t.apply?10:0)+(t.info?5:0)+(t.type?1:0)}function ipA(t,e){let A=[],i=null,n=null,o=g=>{A.push(g);let{section:C}=g.completion;if(C){i||(i=[]);let I=typeof C=="string"?C:C.name;i.some(d=>d.name==I)||i.push(typeof C=="string"?{name:I}:C)}},a=e.facet(xr);for(let g of t)if(g.hasResult()){let C=g.result.getMatch;if(g.result.filter===!1)for(let I of g.result.options)o(new v5(I,g.source,C?C(I):[],1e9-A.length));else{let I=e.sliceDoc(g.from,g.to),d,h=a.filterStrict?new t_(I):new e_(I);for(let E of g.result.options)if(d=h.match(E.label)){let f=E.displayLabel?C?C(E,d.matched):[]:d.matched,m=d.score+(E.boost||0);if(o(new v5(E,g.source,f,m)),typeof E.section=="object"&&E.section.rank==="dynamic"){let{name:v}=E.section;n||(n=Object.create(null)),n[v]=Math.max(m,n[v]||-1e9)}}}}if(i){let g=Object.create(null),C=0,I=(d,h)=>(d.rank==="dynamic"&&h.rank==="dynamic"?n[h.name]-n[d.name]:0)||(typeof d.rank=="number"?d.rank:1e9)-(typeof h.rank=="number"?h.rank:1e9)||(d.nameI.score-C.score||l(C.completion,I.completion))){let C=g.completion;!s||s.label!=C.label||s.detail!=C.detail||s.type!=null&&C.type!=null&&s.type!=C.type||s.apply!=C.apply||s.boost!=C.boost?r.push(g):rW(g.completion)>rW(s)&&(r[r.length-1]=g),s=g.completion}return r}var n_=class t{constructor(e,A,i,n,o,a){this.options=e,this.attrs=A,this.tooltip=i,this.timestamp=n,this.selected=o,this.disabled=a}setSelected(e,A){return e==this.selected||e>=this.options.length?this:new t(this.options,sW(A,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,A,i,n,o,a){if(n&&!a&&e.some(l=>l.isPending))return n.setDisabled();let r=ipA(e,A);if(!r.length)return n&&e.some(l=>l.isPending)?n.setDisabled():null;let s=A.facet(xr).selectOnOpen?0:-1;if(n&&n.selected!=s&&n.selected!=-1){let l=n.options[n.selected].completion;for(let g=0;gg.hasResult()?Math.min(l,g.from):l,1e8),create:lpA,above:o.aboveCursor},n?n.timestamp:Date.now(),s,!1)}map(e){return new t(this.options,this.attrs,Ye(gA({},this.tooltip),{pos:e.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}setDisabled(){return new t(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}},o_=class t{constructor(e,A,i){this.active=e,this.id=A,this.open=i}static start(){return new t(rpA,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:A}=e,i=A.facet(xr),o=(i.override||A.languageDataAt("autocomplete",od(A)).map(X3A)).map(s=>(this.active.find(g=>g.source==s)||new fC(s,this.active.some(g=>g.state!=0)?1:0)).update(e,i));o.length==this.active.length&&o.every((s,l)=>s==this.active[l])&&(o=this.active);let a=this.open,r=e.effects.some(s=>s.is(s_));a&&e.docChanged&&(a=a.map(e.changes)),e.selection||o.some(s=>s.hasResult()&&e.changes.touchesRange(s.from,s.to))||!npA(o,this.active)||r?a=n_.build(o,A,this.id,a,i,r):a&&a.disabled&&!o.some(s=>s.isPending)&&(a=null),!a&&o.every(s=>!s.isPending)&&o.some(s=>s.hasResult())&&(o=o.map(s=>s.hasResult()?new fC(s.source,0):s));for(let s of e.effects)s.is(r_)&&(a=a&&a.setSelected(s.value,this.id));return o==this.active&&a==this.open?this:new t(o,this.id,a)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?opA:apA}};function npA(t,e){if(t==e)return!0;for(let A=0,i=0;;){for(;A-1&&(A["aria-activedescendant"]=t+"-"+e),A}var rpA=[];function IW(t,e){if(t.isUserEvent("input.complete")){let i=t.annotation(CW);if(i&&e.activateOnCompletion(i))return 12}let A=t.isUserEvent("input.type");return A&&e.activateOnTyping?5:A?1:t.isUserEvent("delete.backward")?2:t.selection?8:t.docChanged?16:0}var fC=class t{constructor(e,A,i=!1){this.source=e,this.state=A,this.explicit=i}hasResult(){return!1}get isPending(){return this.state==1}update(e,A){let i=IW(e,A),n=this;(i&8||i&16&&this.touches(e))&&(n=new t(n.source,0)),i&4&&n.state==0&&(n=new t(this.source,1)),n=n.updateFor(e,i);for(let o of e.effects)if(o.is(b5))n=new t(n.source,1,o.value);else if(o.is(Ef))n=new t(n.source,0);else if(o.is(s_))for(let a of o.value)a.source==n.source&&(n=a);return n}updateFor(e,A){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(od(e.state))}},M5=class t extends fC{constructor(e,A,i,n,o,a){super(e,3,A),this.limit=i,this.result=n,this.from=o,this.to=a}hasResult(){return!0}updateFor(e,A){var i;if(!(A&3))return this.map(e.changes);let n=this.result;n.map&&!e.changes.empty&&(n=n.map(n,e.changes));let o=e.changes.mapPos(this.from),a=e.changes.mapPos(this.to,1),r=od(e.state);if(r>a||!n||A&2&&(od(e.startState)==this.from||rA.map(e))}}),cl=Ma.define({create(){return o_.start()},update(t,e){return t.update(e)},provide:t=>[$E.from(t,e=>e.tooltip),ci.contentAttributes.from(t,e=>e.attrs)]});function l_(t,e){let A=e.completion.apply||e.completion.label,i=t.state.field(cl).active.find(n=>n.source==e.source);return i instanceof M5?(typeof A=="string"?t.dispatch(Ye(gA({},Z3A(t.state,A,i.from,i.to)),{annotations:CW.of(e.completion)})):A(t,e.completion,i.from,i.to),!0):!1}var lpA=epA(cl,l_);function D5(t,e="option"){return A=>{let i=A.state.field(cl,!1);if(!i||!i.open||i.open.disabled||Date.now()-i.open.timestamp-1?i.open.selected+n*(t?1:-1):t?0:a-1;return r<0?r=e=="page"?0:a-1:r>=a&&(r=e=="page"?a-1:0),A.dispatch({effects:r_.of(r)}),!0}}var gpA=t=>{let e=t.state.field(cl,!1);return t.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampt.state.field(cl,!1)?(t.dispatch({effects:b5.of(!0)}),!0):!1,cpA=t=>{let e=t.state.field(cl,!1);return!e||!e.active.some(A=>A.state!=0)?!1:(t.dispatch({effects:Ef.of(null)}),!0)},a_=class{constructor(e,A){this.active=e,this.context=A,this.time=Date.now(),this.updates=[],this.done=void 0}},CpA=50,IpA=1e3,dpA=_o.fromClass(class{constructor(t){this.view=t,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of t.state.field(cl).active)e.isPending&&this.startQuery(e)}update(t){let e=t.state.field(cl),A=t.state.facet(xr);if(!t.selectionSet&&!t.docChanged&&t.startState.field(cl)==e)return;let i=t.transactions.some(o=>{let a=IW(o,A);return a&8||(o.selection||o.docChanged)&&!(a&3)});for(let o=0;oCpA&&Date.now()-a.time>IpA){for(let r of a.context.abortListeners)try{r()}catch(s){Sr(this.view.state,s)}a.context.abortListeners=null,this.running.splice(o--,1)}else a.updates.push(...t.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),t.transactions.some(o=>o.effects.some(a=>a.is(b5)))&&(this.pendingStart=!0);let n=this.pendingStart?50:A.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(o=>o.isPending&&!this.running.some(a=>a.active.source==o.source))?setTimeout(()=>this.startUpdate(),n):-1,this.composing!=0)for(let o of t.transactions)o.isUserEvent("input.type")?this.composing=2:this.composing==2&&o.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:t}=this.view,e=t.field(cl);for(let A of e.active)A.isPending&&!this.running.some(i=>i.active.source==A.source)&&this.startQuery(A);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(xr).updateSyncTime))}startQuery(t){let{state:e}=this.view,A=od(e),i=new y5(e,A,t.explicit,this.view),n=new a_(t,i);this.running.push(n),Promise.resolve(t.source(i)).then(o=>{n.context.aborted||(n.done=o||null,this.scheduleAccept())},o=>{this.view.dispatch({effects:Ef.of(null)}),Sr(this.view.state,o)})}scheduleAccept(){this.running.every(t=>t.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(xr).updateSyncTime))}accept(){var t;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],A=this.view.state.facet(xr),i=this.view.state.field(cl);for(let n=0;nr.source==o.active.source);if(a&&a.isPending)if(o.done==null){let r=new fC(o.active.source,0);for(let s of o.updates)r=r.update(s,A);r.isPending||e.push(r)}else this.startQuery(a)}(e.length||i.open&&i.open.disabled)&&this.view.dispatch({effects:s_.of(e)})}},{eventHandlers:{blur(t){let e=this.view.state.field(cl,!1);if(e&&e.tooltip&&this.view.state.facet(xr).closeOnBlur){let A=e.open&&zk(this.view,e.open.tooltip);(!A||!A.dom.contains(t.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:Ef.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:b5.of(!1)}),20),this.composing=0}}}),BpA=typeof navigator=="object"&&/Win/.test(navigator.platform),EpA=oc.highest(ci.domEventHandlers({keydown(t,e){let A=e.state.field(cl,!1);if(!A||!A.open||A.open.disabled||A.open.selected<0||t.key.length>1||t.ctrlKey&&!(BpA&&t.altKey)||t.metaKey)return!1;let i=A.open.options[A.open.selected],n=A.active.find(a=>a.source==i.source),o=i.completion.commitCharacters||n.result.commitCharacters;return o&&o.indexOf(t.key)>-1&&l_(e,i),!1}})),hpA=ci.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"\xB7\xB7\xB7"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'\u0192'"}},".cm-completionIcon-class":{"&:after":{content:"'\u25CB'"}},".cm-completionIcon-interface":{"&:after":{content:"'\u25CC'"}},".cm-completionIcon-variable":{"&:after":{content:"'\u{1D465}'"}},".cm-completionIcon-constant":{"&:after":{content:"'\u{1D436}'"}},".cm-completionIcon-type":{"&:after":{content:"'\u{1D461}'"}},".cm-completionIcon-enum":{"&:after":{content:"'\u222A'"}},".cm-completionIcon-property":{"&:after":{content:"'\u25A1'"}},".cm-completionIcon-keyword":{"&:after":{content:"'\u{1F511}\uFE0E'"}},".cm-completionIcon-namespace":{"&:after":{content:"'\u25A2'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});var hf={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},nd=Wi.define({map(t,e){let A=e.mapPos(t,-1,zr.TrackAfter);return A??void 0}}),g_=new class extends gg{};g_.startSide=1;g_.endSide=-1;var dW=Ma.define({create(){return io.empty},update(t,e){if(t=t.map(e.changes),e.selection){let A=e.state.doc.lineAt(e.selection.main.head);t=t.update({filter:i=>i>=A.from&&i<=A.to})}for(let A of e.effects)A.is(nd)&&(t=t.update({add:[g_.range(A.value,A.value+1)]}));return t}});function BW(){return[upA,dW]}var A_="()[]{}<>\xAB\xBB\xBB\xAB\uFF3B\uFF3D\uFF5B\uFF5D";function EW(t){for(let e=0;e{if((QpA?t.composing:t.compositionStarted)||t.state.readOnly)return!1;let n=t.state.selection.main;if(i.length>2||i.length==2&&_l(qr(i,0))==1||e!=n.from||A!=n.to)return!1;let o=ppA(t.state,i);return o?(t.dispatch(o),!0):!1}),fpA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=hW(t,t.selection.main.head).brackets||hf.brackets,n=null,o=t.changeByRange(a=>{if(a.empty){let r=mpA(t.doc,a.head);for(let s of i)if(s==r&&S5(t.doc,a.head)==EW(qr(s,0)))return{changes:{from:a.head-s.length,to:a.head+s.length},range:Ie.cursor(a.head-s.length)}}return{range:n=a}});return n||e(t.update(o,{scrollIntoView:!0,userEvent:"delete.backward"})),!n},QW=[{key:"Backspace",run:fpA}];function ppA(t,e){let A=hW(t,t.selection.main.head),i=A.brackets||hf.brackets;for(let n of i){let o=EW(qr(n,0));if(e==n)return o==n?ypA(t,n,i.indexOf(n+n+n)>-1,A):wpA(t,n,o,A.before||hf.before);if(e==o&&uW(t,t.selection.main.from))return DpA(t,n,o)}return null}function uW(t,e){let A=!1;return t.field(dW).between(0,t.doc.length,i=>{i==e&&(A=!0)}),A}function S5(t,e){let A=t.sliceString(e,e+2);return A.slice(0,_l(qr(A,0)))}function mpA(t,e){let A=t.sliceString(e-2,e);return _l(qr(A,0))==A.length?A:A.slice(1)}function wpA(t,e,A,i){let n=null,o=t.changeByRange(a=>{if(!a.empty)return{changes:[{insert:e,from:a.from},{insert:A,from:a.to}],effects:nd.of(a.to+e.length),range:Ie.range(a.anchor+e.length,a.head+e.length)};let r=S5(t.doc,a.head);return!r||/\s/.test(r)||i.indexOf(r)>-1?{changes:{insert:e+A,from:a.head},effects:nd.of(a.head+e.length),range:Ie.cursor(a.head+e.length)}:{range:n=a}});return n?null:t.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function DpA(t,e,A){let i=null,n=t.changeByRange(o=>o.empty&&S5(t.doc,o.head)==A?{changes:{from:o.head,to:o.head+A.length,insert:A},range:Ie.cursor(o.head+A.length)}:i={range:o});return i?null:t.update(n,{scrollIntoView:!0,userEvent:"input.type"})}function ypA(t,e,A,i){let n=i.stringPrefixes||hf.stringPrefixes,o=null,a=t.changeByRange(r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:e,from:r.to}],effects:nd.of(r.to+e.length),range:Ie.range(r.anchor+e.length,r.head+e.length)};let s=r.head,l=S5(t.doc,s),g;if(l==e){if(lW(t,s))return{changes:{insert:e+e,from:s},effects:nd.of(s+e.length),range:Ie.cursor(s+e.length)};if(uW(t,s)){let I=A&&t.sliceDoc(s,s+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:s,to:s+I.length,insert:I},range:Ie.cursor(s+I.length)}}}else{if(A&&t.sliceDoc(s-2*e.length,s)==e+e&&(g=gW(t,s-2*e.length,n))>-1&&lW(t,g))return{changes:{insert:e+e+e+e,from:s},effects:nd.of(s+e.length),range:Ie.cursor(s+e.length)};if(t.charCategorizer(s)(l)!=Uo.Word&&gW(t,s,n)>-1&&!vpA(t,s,e,n))return{changes:{insert:e+e,from:s},effects:nd.of(s+e.length),range:Ie.cursor(s+e.length)}}return{range:o=r}});return o?null:t.update(a,{scrollIntoView:!0,userEvent:"input.type"})}function lW(t,e){let A=kr(t).resolveInner(e+1);return A.parent&&A.from==e}function vpA(t,e,A,i){let n=kr(t).resolveInner(e,-1),o=i.reduce((a,r)=>Math.max(a,r.length),0);for(let a=0;a<5;a++){let r=t.sliceDoc(n.from,Math.min(n.to,n.from+A.length+o)),s=r.indexOf(A);if(!s||s>-1&&i.indexOf(r.slice(0,s))>-1){let g=n.firstChild;for(;g&&g.from==n.from&&g.to-g.from>A.length+s;){if(t.sliceDoc(g.to-A.length,g.to)==A)return!1;g=g.firstChild}return!0}let l=n.to==e&&n.parent;if(!l)break;n=l}return!1}function gW(t,e,A){let i=t.charCategorizer(e);if(i(t.sliceDoc(e-1,e))!=Uo.Word)return e;for(let n of A){let o=e-n.length;if(t.sliceDoc(o,e)==n&&i(t.sliceDoc(o-1,o))!=Uo.Word)return o}return-1}function fW(t={}){return[EpA,cl,xr.of(t),dpA,bpA,hpA]}var c_=[{key:"Ctrl-Space",run:$x},{mac:"Alt-`",run:$x},{mac:"Alt-i",run:$x},{key:"Escape",run:cpA},{key:"ArrowDown",run:D5(!0)},{key:"ArrowUp",run:D5(!1)},{key:"PageDown",run:D5(!0,"page")},{key:"PageUp",run:D5(!1,"page")},{key:"Enter",run:gpA}],bpA=oc.highest(XE.computeN([xr],t=>t.facet(xr).defaultKeymap?[c_]:[]));function MpA(t,e=t.state){let A=new Set;for(let{from:i,to:n}of t.visibleRanges){let o=i;for(;o<=n;){let a=e.doc.lineAt(o);A.has(a)||A.add(a),o=a.to+1}}return A}function C_(t){let e=t.selection.main.head;return t.doc.lineAt(e)}function pW(t,e){let A=0;A:for(let i=0;i=o.level&&this.markerType!=="codeOnly"?this.set(e,0,n.level):n.empty&&n.level===0&&o.level!==0?this.set(e,0,0):o.level>n.level?this.set(e,0,n.level+1):this.set(e,0,o.level)}let A=pW(e.text,this.state.tabSize),i=Math.floor(A/this.unitWidth);return this.set(e,A,i)}closestNonEmpty(e,A){let i=e.number+A;for(;A===-1?i>=1:i<=this.state.doc.lines;){if(this.has(i)){let a=this.get(i);if(!a.empty)return a}let o=this.state.doc.line(i);if(o.text.trim().length){let a=pW(o.text,this.state.tabSize),r=Math.floor(a/this.unitWidth);return this.set(o,a,r)}i+=A}let n=this.state.doc.line(A===-1?1:this.state.doc.lines);return this.set(n,0,0)}findAndSetActiveLines(){let e=C_(this.state);if(!this.has(e))return;let A=this.get(e);if(this.has(A.line.number+1)){let o=this.get(A.line.number+1);o.level>A.level&&(A=o)}if(this.has(A.line.number-1)){let o=this.get(A.line.number-1);o.level>A.level&&(A=o)}if(A.level===0)return;A.active=A.level;let i,n;for(i=A.line.number;i>1;i--){if(!this.has(i-1))continue;let o=this.get(i-1);if(o.level0&&s.push(k5("--indent-marker-bg-color",i,e,r,l)),s.push(k5("--indent-marker-active-bg-color",n,e,a-1,1)),a!==o&&s.push(k5("--indent-marker-bg-color",i,e,a,o-a))}else s.push(k5("--indent-marker-bg-color",i,e,r,o-r));return s.join(",")}var d_=class{constructor(e){this.view=e,this.unitWidth=Cc(e.state),this.currentLineNumber=C_(e.state).number,this.generate(e.state)}update(e){let A=Cc(e.state),i=A!==this.unitWidth;i&&(this.unitWidth=A);let n=C_(e.state).number,o=n!==this.currentLineNumber;this.currentLineNumber=n;let a=e.state.facet(x5).highlightActiveBlock&&o;(e.docChanged||e.viewportChanged||i||a)&&this.generate(e.state)}generate(e){let A=new jr,i=MpA(this.view,e),{hideFirstIndent:n,markerType:o,thickness:a,activeThickness:r}=e.facet(x5),s=new I_(i,e,this.unitWidth,o);for(let l of i){let g=s.get(l.number);if(!g?.level)continue;let C=kpA(g,this.unitWidth,n,a,r);A.add(l.from,l.from,St.line({class:"cm-indent-markers",attributes:{style:`--indent-markers: ${C}`}}))}this.decorations=A.finish()}};function mW(t={}){return[x5.of(t),SpA(t.colors),_o.fromClass(d_,{decorations:e=>e.decorations})]}var xpA=["mainAxis","crossAxis","fallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment"],_pA=["mainAxis","crossAxis","limiter"];function TZ(t,e){if(t==null)return{};var A,i,n=(function(a,r){if(a==null)return{};var s={};for(var l in a)if({}.hasOwnProperty.call(a,l)){if(r.indexOf(l)!==-1)continue;s[l]=a[l]}return s})(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(i=0;i{};function TpA(t){return t()}function Y_(t){for(var e=0;e{t=A,e=i}),resolve:t,reject:e}}var JpA=1<<24,jh=16,vD=32,PZ=64,DR=128,pc=512,Zr=1024,mc=2048,KC=4096,b0=8192,qh=16384,yR=32768,ud=65536,OpA=1<<17,jZ=1<<18,qZ=1<<19,wC=1<<25,oD=32768,H_=1<<21,pI=1<<23,M0=Symbol("$state"),VZ=Symbol("legacy props"),YpA=Symbol(""),ph=new class extends Error{constructor(){super(...arguments),w0(this,"name","StaleReactionError"),w0(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};function Pf(t){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function WZ(t){return t===this.v}function ZZ(t,e){return t!=t?e==e:t!==e||t!==null&&typeof t=="object"||typeof t=="function"}function XZ(t){return!ZZ(t,this.v)}var Io=null;function Nh(t){Io=t}function kI(t){return $Z().get(t)}function Nt(t){Io={p:Io,i:!1,c:null,e:null,s:t,x:null,l:Ph&&!(arguments.length>1&&arguments[1]!==void 0&&arguments[1])?{s:null,u:null,$:[]}:null}}function Ft(t){var e=Io,A=e.e;if(A!==null)for(var i of(e.e=null,A))EX(i);return t!==void 0&&(e.x=t),e.i=!0,Io=e.p,t??{}}function Vh(){return!Ph||Io!==null&&Io.l===null}function $Z(t){var e,A;return Io===null&&Pf(),(A=(e=Io).c)!==null&&A!==void 0?A:e.c=new Map((function(i){for(var n=i.p;n!==null;){var o=n.c;if(o!==null)return o;n=n.p}return null})(Io)||void 0)}var Id=[];function AX(){var t=Id;Id=[],Y_(t)}function fd(t){if(Id.length===0&&!Sf){var e=Id;queueMicrotask(()=>{e===Id&&AX()})}Id.push(t)}function HpA(){for(;Id.length>0;)AX()}function eX(t){var e=qn;if(e===null)return jn.f|=pI,t;if((e.f&yR)===0){if((e.f&DR)===0)throw t;e.b.error(t)}else Fh(t,e)}function Fh(t,e){for(;e!==null;){if((e.f&DR)!==0)try{return void e.b.error(t)}catch(A){t=A}e=e.parent}throw t}var Z5=new Set,Jo=null,Mf=null,pg=null,fg=[],bD=null,z_=!1,Sf=!1,aD=new WeakMap,_5=new WeakMap,ld=new WeakMap,gd=new WeakMap,R5=new WeakMap,X5=new WeakMap,$5=new WeakMap,Kl=new WeakSet,pd=class t{constructor(){JZ(this,Kl),w0(this,"committed",!1),w0(this,"current",new Map),w0(this,"previous",new Map),wo(this,aD,new Set),wo(this,_5,new Set),wo(this,ld,0),wo(this,gd,0),wo(this,R5,null),wo(this,X5,[]),wo(this,$5,[]),w0(this,"skipped_effects",new Set),w0(this,"is_fork",!1)}is_deferred(){return this.is_fork||ve(gd,this)>0}process(e){fg=[],Mf=null,this.apply();var A,i={parent:null,effect:null,effects:[],render_effects:[],block_effects:[]};for(var n of e)Wa(Kl,this,tX).call(this,n,i);this.is_fork||Wa(Kl,this,zpA).call(this),this.is_deferred()?(Wa(Kl,this,bh).call(this,i.effects),Wa(Kl,this,bh).call(this,i.render_effects),Wa(Kl,this,bh).call(this,i.block_effects)):(Mf=this,Jo=null,MW(i.render_effects),MW(i.effects),Mf=null,(A=ve(R5,this))===null||A===void 0||A.resolve()),pg=null}capture(e,A){var i;this.previous.has(e)||this.previous.set(e,A),(e.f&pI)===0&&(this.current.set(e,e.v),(i=pg)===null||i===void 0||i.set(e,e.v))}activate(){Jo=this,this.apply()}deactivate(){Jo===this&&(Jo=null,pg=null)}flush(){if(this.activate(),fg.length>0){if(nX(),Jo!==null&&Jo!==this)return}else ve(ld,this)===0&&this.process([]);this.deactivate()}discard(){for(var e of ve(_5,this))e(this);ve(_5,this).clear()}increment(e){Bn(ld,this,ve(ld,this)+1),e&&Bn(gd,this,ve(gd,this)+1)}decrement(e){Bn(ld,this,ve(ld,this)-1),e&&Bn(gd,this,ve(gd,this)-1),this.revive()}revive(){for(var e of ve(X5,this))$r(e,mc),md(e);for(var A of ve($5,this))$r(A,KC),md(A);Bn(X5,this,[]),Bn($5,this,[]),this.flush()}oncommit(e){ve(aD,this).add(e)}ondiscard(e){ve(_5,this).add(e)}settled(){var e;return((e=ve(R5,this))!==null&&e!==void 0?e:Bn(R5,this,zZ())).promise}static ensure(){if(Jo===null){var e=Jo=new t;Z5.add(Jo),Sf||t.enqueue(()=>{Jo===e&&e.flush()})}return Jo}static enqueue(e){fd(e)}apply(){}};function tX(t,e){t.f^=Zr;for(var A=t.first;A!==null;){var i,n=A.f,o=!!(96&n),a=o&&(n&Zr)!==0||(n&b0)!==0||this.skipped_effects.has(A);if((A.f&DR)!==0&&(i=A.b)!==null&&i!==void 0&&i.is_pending()&&(e={parent:e,effect:A,effects:[],render_effects:[],block_effects:[]}),!a&&A.fn!==null){o?A.f^=Zr:4&n?e.effects.push(A):Xh(A)&&((A.f&jh)!==0&&e.block_effects.push(A),Kh(A));var r=A.first;if(r!==null){A=r;continue}}var s=A.parent;for(A=A.next;A===null&&s!==null;)s===e.effect&&(Wa(Kl,this,bh).call(this,e.effects),Wa(Kl,this,bh).call(this,e.render_effects),Wa(Kl,this,bh).call(this,e.block_effects),e=e.parent),A=s.next,s=s.parent}}function bh(t){for(var e of t)((e.f&mc)!==0?ve(X5,this):ve($5,this)).push(e),Wa(Kl,this,iX).call(this,e.deps),$r(e,Zr)}function iX(t){if(t!==null)for(var e of t)2&e.f&&(e.f&oD)!==0&&(e.f^=oD,Wa(Kl,this,iX).call(this,e.deps))}function zpA(){if(ve(gd,this)===0){for(var t of ve(aD,this))t();ve(aD,this).clear()}ve(ld,this)===0&&Wa(Kl,this,PpA).call(this)}function PpA(){if(Z5.size>1){this.previous.clear();var t=pg,e=!0,A={parent:null,effect:null,effects:[],render_effects:[],block_effects:[]};for(var i of Z5)if(i!==this){var n=[];for(var[o,a]of this.current){if(i.current.has(o)){if(!e||a===i.current.get(o))continue;i.current.set(o,a)}n.push(o)}if(n.length!==0){var r=[...i.current.keys()].filter(d=>!this.current.has(d));if(r.length>0){var s=fg;fg=[];var l=new Set,g=new Map;for(var C of n)oX(C,r,l,g);if(fg.length>0){for(var I of(Jo=i,i.apply(),fg))Wa(Kl,i,tX).call(i,I,A);i.deactivate()}fg=s}}}else e=!1;Jo=null,pg=t}this.committed=!0,Z5.delete(this)}function Ro(t){var e=Sf;Sf=!0;try{for(;;){var A;if(HpA(),fg.length===0&&((A=Jo)===null||A===void 0||A.flush(),fg.length===0))return void(bD=null);nX()}}finally{Sf=e}}function nX(){var t=Bd;z_=!0;try{var e=0;for(rD(!0);fg.length>0;){var A=pd.ensure();e++>1e3&&jpA(),A.process(fg),mI.clear()}}finally{z_=!1,rD(t),bD=null}}function jpA(){try{(function(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")})()}catch(t){Fh(t,bD)}}var yC=null;function MW(t){var e=t.length;if(e!==0){for(var A=0;A0)){for(var o of(mI.clear(),yC))if(!(24576&o.f)){for(var a=[o],r=o.parent;r!==null;)yC.has(r)&&(yC.delete(r),a.push(r)),r=r.parent;for(var s=a.length-1;s>=0;s--){var l=a[s];24576&l.f||Kh(l)}}yC.clear()}}yC=null}}function oX(t,e,A,i){if(!A.has(t)&&(A.add(t),t.reactions!==null))for(var n of t.reactions){var o=n.f;2&o?oX(n,e,A,i):4194320&o&&(o&mc)===0&&aX(n,e,i)&&($r(n,mc),md(n))}}function aX(t,e,A){var i=A.get(t);if(i!==void 0)return i;if(t.deps!==null)for(var n of t.deps){if(e.includes(n))return!0;if(2&n.f&&aX(n,e,A))return A.set(n,!0),!0}return A.set(t,!1),!1}function md(t){for(var e=bD=t;e.parent!==null;){var A=(e=e.parent).f;if(z_&&e===qn&&(A&jh)!==0&&(A&jZ)===0)return;if(96&A){if((A&Zr)===0)return;e.f^=Zr}}fg.push(e)}var CI=new WeakMap,hI=new WeakMap,qpA=new WeakMap,cd=new WeakMap,h_=new WeakMap,EI=new WeakMap,II=new WeakMap,MC=new WeakMap,rI=new WeakMap,dd=new WeakMap,Mh=new WeakMap,gh=new WeakMap,Sh=new WeakMap,uf=new WeakMap,ch=new WeakMap,SW=new WeakMap,lI=new WeakSet,P_=class{constructor(e,A,i){var n,o,a,r;JZ(this,lI),w0(this,"parent",void 0),wo(this,CI,!1),wo(this,hI,void 0),wo(this,qpA,null),wo(this,cd,void 0),wo(this,h_,void 0),wo(this,EI,void 0),wo(this,II,null),wo(this,MC,null),wo(this,rI,null),wo(this,dd,null),wo(this,Mh,null),wo(this,gh,0),wo(this,Sh,0),wo(this,uf,!1),wo(this,ch,null),wo(this,SW,(n=()=>(Bn(ch,this,UC(ve(gh,this))),()=>{Bn(ch,this,null)}),a=0,r=UC(0),()=>{xf()&&(c(r),Wh(()=>(a===0&&(o=wA(()=>n(()=>kf(r)))),a+=1,()=>{fd(()=>{var s;(a-=1)==0&&((s=o)===null||s===void 0||s(),o=void 0,kf(r))})})))})),Bn(hI,this,e),Bn(cd,this,A),Bn(h_,this,i),this.parent=qn.b,Bn(CI,this,!!ve(cd,this).pending),Bn(EI,this,Zh(()=>{qn.b=this;var s=Wa(lI,this,VpA).call(this);try{Bn(II,this,S0(()=>i(s)))}catch(l){this.error(l)}return ve(Sh,this)>0?Wa(lI,this,xW).call(this):Bn(CI,this,!1),()=>{var l;(l=ve(Mh,this))===null||l===void 0||l.remove()}},589952))}is_pending(){return ve(CI,this)||!!this.parent&&this.parent.is_pending()}has_pending_snippet(){return!!ve(cd,this).pending}update_pending_count(e){Wa(lI,this,rX).call(this,e),Bn(gh,this,ve(gh,this)+e),ve(ch,this)&&Lh(ve(ch,this),ve(gh,this))}get_effect_pending(){return ve(SW,this).call(this),c(ve(ch,this))}error(e){var A=ve(cd,this).onerror,i=ve(cd,this).failed;if(ve(uf,this)||!A&&!i)throw e;ve(II,this)&&(Xr(ve(II,this)),Bn(II,this,null)),ve(MC,this)&&(Xr(ve(MC,this)),Bn(MC,this,null)),ve(rI,this)&&(Xr(ve(rI,this)),Bn(rI,this,null));var n=!1,o=!1,a=()=>{n?console.warn("https://svelte.dev/e/svelte_boundary_reset_noop"):(n=!0,o&&(function(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")})(),pd.ensure(),Bn(gh,this,0),ve(rI,this)!==null&&Gh(ve(rI,this),()=>{Bn(rI,this,null)}),Bn(CI,this,this.has_pending_snippet()),Bn(II,this,Wa(lI,this,kW).call(this,()=>(Bn(uf,this,!1),S0(()=>ve(h_,this).call(this,ve(hI,this)))))),ve(Sh,this)>0?Wa(lI,this,xW).call(this):Bn(CI,this,!1))},r=jn;try{El(null),o=!0,A?.(e,a),o=!1}catch(s){Fh(s,ve(EI,this)&&ve(EI,this).parent)}finally{El(r)}i&&fd(()=>{Bn(rI,this,Wa(lI,this,kW).call(this,()=>{pd.ensure(),Bn(uf,this,!0);try{return S0(()=>{i(ve(hI,this),()=>e,()=>a)})}catch(s){return Fh(s,ve(EI,this).parent),null}finally{Bn(uf,this,!1)}}))})}};function VpA(){var t=ve(hI,this);return ve(CI,this)&&(Bn(Mh,this,wI()),ve(hI,this).before(ve(Mh,this)),t=ve(Mh,this)),t}function kW(t){var e=qn,A=jn,i=Io;wg(ve(EI,this)),El(ve(EI,this)),Nh(ve(EI,this).ctx);try{return t()}catch(n){return eX(n),null}finally{wg(e),El(A),Nh(i)}}function xW(){var t=ve(cd,this).pending;ve(II,this)!==null&&(Bn(dd,this,document.createDocumentFragment()),ve(dd,this).append(ve(Mh,this)),DX(ve(II,this),ve(dd,this))),ve(MC,this)===null&&Bn(MC,this,S0(()=>t(ve(hI,this))))}function rX(t){var e;this.has_pending_snippet()?(Bn(Sh,this,ve(Sh,this)+t),ve(Sh,this)===0&&(Bn(CI,this,!1),ve(MC,this)&&Gh(ve(MC,this),()=>{Bn(MC,this,null)}),ve(dd,this)&&(ve(hI,this).before(ve(dd,this)),Bn(dd,this,null)))):this.parent&&Wa(lI,e=this.parent,rX).call(e,t)}function sX(t,e,A,i){var n=Vh()?jf:it;if(A.length!==0||t.length!==0){var o=Jo,a=qn,r=(function(){var l=qn,g=jn,C=Io,I=Jo;return function(){var d=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];wg(l),El(g),Nh(C),d&&I?.activate()}})();t.length>0?Promise.all(t).then(()=>{r();try{return s()}finally{o?.deactivate(),N5()}}):s()}else i(e.map(n));function s(){Promise.all(A.map(l=>(function(g){var C=qn;C===null&&(function(){throw new Error("https://svelte.dev/e/async_derived_orphan")})();var I=C.b,d=void 0,h=UC(Wr),E=!jn,f=new Map;return(function(m){Dc(4718592,m,!0)})(()=>{var m=zZ();d=m.promise;try{Promise.resolve(g()).then(m.resolve,m.reject).then(()=>{v===Jo&&v.committed&&v.deactivate(),N5()})}catch(x){m.reject(x),N5()}var v=Jo;if(E){var k,S=!I.is_pending();I.update_pending_count(1),v.increment(S),(k=f.get(v))===null||k===void 0||k.reject(ph),f.delete(v),f.set(v,m)}var b=function(x){var F=arguments.length>1&&arguments[1]!==void 0?arguments[1]:void 0;if(v.activate(),F)F!==ph&&(h.f|=pI,Lh(h,F));else for(var[z,P]of((h.f&pI)!==0&&(h.f^=pI),Lh(h,x),f)){if(f.delete(z),z===v)break;P.reject(ph)}E&&(I.update_pending_count(-1),v.decrement(S))};m.promise.then(b,x=>b(null,x||"unknown"))}),SD(()=>{for(var m of f.values())m.reject(ph)}),new Promise(m=>{function v(k){function S(){k===d?m(h):v(d)}k.then(S,S)}v(d)})})(l))).then(l=>{r();try{i([...e.map(n),...l])}catch(g){(a.f&qh)===0&&Fh(g,a)}o?.deactivate(),N5()}).catch(l=>{Fh(l,a)})}}function N5(){wg(null),El(null),Nh(null)}function jf(t){var e=jn!==null&&2&jn.f?jn:null;return qn!==null&&(qn.f|=qZ),{ctx:Io,deps:null,effects:null,equals:WZ,f:2050,fn:t,reactions:null,rv:0,v:Wr,wv:0,parent:e??qn,ac:null}}function Il(t){var e=jf(t);return yX(e),e}function it(t){var e=jf(t);return e.equals=XZ,e}function lX(t){var e=t.effects;if(e!==null){t.effects=null;for(var A=0;A1&&arguments[1]!==void 0&&arguments[1],n=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],o=UC(t);return i||(o.equals=XZ),Ph&&n&&Io!==null&&Io.l!==null&&((A=(e=Io.l).s)!==null&&A!==void 0?A:e.s=[]).push(o),o}function Tl(t,e){return N(t,wA(()=>c(t))),e}function N(t,e){var A,i=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return jn===null||y0&&(jn.f&OpA)===0||!Vh()||!(4325394&jn.f)||(A=FC)!==null&&A!==void 0&&A.includes(t)||(function(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")})(),Lh(t,i?mh(e):e)}function Lh(t,e){if(!t.equals(e)){var A=t.v;Sd?mI.set(t,e):mI.set(t,A),t.v=e;var i=pd.ensure();i.capture(t,A),2&t.f&&((t.f&mc)!==0&&vR(t),$r(t,(t.f&pc)!==0?Zr:KC)),t.wv=bX(),dX(t,mc),!Vh()||qn===null||(qn.f&Zr)===0||96&qn.f||(Eg===null?(function(n){Eg=n})([t]):Eg.push(t)),!i.is_fork&&Q_.size>0&&!_W&&(function(){_W=!1;var n=Bd;rD(!0);var o=Array.from(Q_);try{for(var a of o)(a.f&Zr)!==0&&$r(a,KC),Xh(a)&&Kh(a)}finally{rD(n)}Q_.clear()})()}return e}function RW(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=c(t),i=e===1?A++:A--;return N(t,A),i}function kf(t){N(t,t.v+1)}function dX(t,e){var A=t.reactions;if(A!==null)for(var i=Vh(),n=A.length,o=0;o{if(Ed===o)return r();var s=jn,l=Ed;El(null),GW(o);var g=r();return El(s),GW(l),g};return i&&A.set("length",DC(t.length)),new Proxy(t,{defineProperty(r,s,l){"value"in l&&l.configurable!==!1&&l.enumerable!==!1&&l.writable!==!1||(function(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")})();var g=A.get(s);return g===void 0?g=a(()=>{var C=DC(l.value);return A.set(s,C),C}):N(g,l.value,!0),!0},deleteProperty(r,s){var l=A.get(s);if(l===void 0){if(s in r){var g=a(()=>DC(Wr));A.set(s,g),kf(n)}}else N(l,Wr),kf(n);return!0},get(r,s,l){var g;if(s===M0)return t;var C=A.get(s),I=s in r;if(C===void 0&&(!I||(g=RC(r,s))!==null&&g!==void 0&&g.writable)&&(C=a(()=>DC(mh(I?r[s]:Wr))),A.set(s,C)),C!==void 0){var d=c(C);return d===Wr?void 0:d}return Reflect.get(r,s,l)},getOwnPropertyDescriptor(r,s){var l=Reflect.getOwnPropertyDescriptor(r,s);if(l&&"value"in l){var g=A.get(s);g&&(l.value=c(g))}else if(l===void 0){var C=A.get(s),I=C?.v;if(C!==void 0&&I!==Wr)return{enumerable:!0,configurable:!0,value:I,writable:!0}}return l},has(r,s){var l;if(s===M0)return!0;var g=A.get(s),C=g!==void 0&&g.v!==Wr||Reflect.has(r,s);return(g!==void 0||qn!==null&&(!C||(l=RC(r,s))!==null&&l!==void 0&&l.writable))&&(g===void 0&&(g=a(()=>DC(C?mh(r[s]):Wr)),A.set(s,g)),c(g)===Wr)?!1:C},set(r,s,l,g){var C,I=A.get(s),d=s in r;if(i&&s==="length")for(var h=l;hDC(Wr)),A.set(h+"",E))}I===void 0?(!d||(C=RC(r,s))!==null&&C!==void 0&&C.writable)&&(N(I=a(()=>DC(void 0)),mh(l)),A.set(s,I)):(d=I.v!==Wr,N(I,a(()=>mh(l))));var f=Reflect.getOwnPropertyDescriptor(r,s);if(f!=null&&f.set&&f.set.call(g,l),!d){if(i&&typeof s=="string"){var m=A.get("length"),v=Number(s);Number.isInteger(v)&&v>=m.v&&N(m,v+1)}kf(n)}return!0},ownKeys(r){c(n);var s=Reflect.ownKeys(r).filter(C=>{var I=A.get(C);return I===void 0||I.v!==Wr});for(var[l,g]of A)g.v===Wr||l in r||s.push(l);return s},setPrototypeOf(){(function(){throw new Error("https://svelte.dev/e/state_prototype_fixed")})()}})}function NW(t){try{if(t!==null&&typeof t=="object"&&M0 in t)return t[M0]}catch(e){}return t}function WpA(t,e){return Object.is(NW(t),NW(e))}function wI(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";return document.createTextNode(t)}function Jl(t){return CX.call(t)}function qf(t){return IX.call(t)}function dA(t,e){return Jl(t)}function et(t){var e=Jl(t);return e instanceof Comment&&e.data===""?qf(e):e}function _A(t){for(var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=t;e--;)A=qf(A);return A}var FW=!1;function MD(t){var e=jn,A=qn;El(null),wg(null);try{return t()}finally{El(e),wg(A)}}function ZpA(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:A;t.addEventListener(e,()=>MD(A));var n=t.__on_r;t.__on_r=n?()=>{n(),i(!0)}:()=>i(!0),FW||(FW=!0,document.addEventListener("reset",o=>{Promise.resolve().then(()=>{if(!o.defaultPrevented)for(var a of o.target.elements){var r;(r=a.__on_r)===null||r===void 0||r.call(a)}})},{capture:!0}))}function BX(t){qn===null&&(jn===null&&(function(){throw new Error("https://svelte.dev/e/effect_orphan")})(),(function(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")})()),Sd&&(function(){throw new Error("https://svelte.dev/e/effect_in_teardown")})()}function Dc(t,e,A){var i=qn;i!==null&&(i.f&b0)!==0&&(t|=b0);var n={ctx:Io,deps:null,nodes:null,f:t|mc|pc,first:null,fn:e,last:null,next:null,parent:i,b:i&&i.b,prev:null,teardown:null,wv:0,ac:null};if(A)try{Kh(n),n.f|=yR}catch(s){throw Xr(n),s}else e!==null&&md(n);var o=n;if(A&&o.deps===null&&o.teardown===null&&o.nodes===null&&o.first===o.last&&(o.f&qZ)===0&&(o=o.first,(t&jh)!==0&&(t&ud)!==0&&o!==null&&(o.f|=ud)),o!==null&&(o.parent=i,i!==null&&(function(s,l){var g=l.last;g===null?l.last=l.first=s:(g.next=s,s.prev=g,l.last=s)})(o,i),jn!==null&&2&jn.f&&(t&PZ)===0)){var a,r=jn;((a=r.effects)!==null&&a!==void 0?a:r.effects=[]).push(o)}return n}function xf(){return jn!==null&&!y0}function SD(t){var e=Dc(8,null,!1);return $r(e,Zr),e.teardown=t,e}function j_(t){BX();var e=qn.f;if(!(!jn&&(e&vD)!==0&&(e&yR)===0))return EX(t);var A,i=Io;((A=i.e)!==null&&A!==void 0?A:i.e=[]).push(t)}function EX(t){return Dc(1048580,t,!1)}function _r(t){return Dc(4,t,!1)}function KA(t,e){var A={effect:null,ran:!1,deps:t};Io.l.$.push(A),A.effect=Wh(()=>{t(),A.ran||(A.ran=!0,wA(e))})}function Rn(){var t=Io;Wh(()=>{for(var e of t.l.$){e.deps();var A=e.effect;(A.f&Zr)!==0&&$r(A,KC),Xh(A)&&Kh(A),e.ran=!1}})}function Wh(t){return Dc(8|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function Se(t){sX(arguments.length>3&&arguments[3]!==void 0?arguments[3]:[],arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],e=>{Dc(8,()=>t(...e.map(c)),!0)})}function Zh(t){return Dc(jh|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function hX(t){return Dc(JpA|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function S0(t){return Dc(524320,t,!0)}function QX(t){var e=t.teardown;if(e!==null){var A=Sd,i=jn;LW(!0),El(null);try{e.call(null)}finally{LW(A),El(i)}}}function uX(t){var e=arguments.length>1&&arguments[1]!==void 0&&arguments[1],A=t.first;t.first=t.last=null;for(var i,n=function(){var o=A.ac;o!==null&&MD(()=>{o.abort(ph)}),i=A.next,(A.f&PZ)!==0?A.parent=null:Xr(A,e),A=i};A!==null;)n()}function Xr(t){var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=!1;!e&&(t.f&jZ)===0||t.nodes===null||t.nodes.end===null||(fX(t.nodes.start,t.nodes.end),A=!0),uX(t,e&&!A),sD(t,0),$r(t,qh);var i=t.nodes&&t.nodes.t;if(i!==null)for(var n of i)n.stop();QX(t);var o=t.parent;o!==null&&o.first!==null&&pX(t),t.next=t.prev=t.teardown=t.ctx=t.deps=t.fn=t.nodes=t.ac=null}function fX(t,e){for(;t!==null;){var A=t===e?null:qf(t);t.remove(),t=A}}function pX(t){var e=t.parent,A=t.prev,i=t.next;A!==null&&(A.next=i),i!==null&&(i.prev=A),e!==null&&(e.first===t&&(e.first=i),e.last===t&&(e.last=A))}function Gh(t,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],i=[];mX(t,i,!0);var n=()=>{A&&Xr(t),e&&e()},o=i.length;if(o>0){var a=()=>--o||n();for(var r of i)r.out(a)}else n()}function mX(t,e,A){if((t.f&b0)===0){t.f^=b0;var i=t.nodes&&t.nodes.t;if(i!==null)for(var n of i)(n.is_global||A)&&e.push(n);for(var o=t.first;o!==null;){var a=o.next;mX(o,e,((o.f&ud)!==0||(o.f&vD)!==0&&(t.f&jh)!==0)&&A),o=a}}}function q_(t){wX(t,!0)}function wX(t,e){if((t.f&b0)!==0){t.f^=b0,(t.f&Zr)===0&&($r(t,mc),md(t));for(var A=t.first;A!==null;){var i=A.next;wX(A,((A.f&ud)!==0||(A.f&vD)!==0)&&e),A=i}var n=t.nodes&&t.nodes.t;if(n!==null)for(var o of n)(o.is_global||e)&&o.in()}}function DX(t,e){if(t.nodes)for(var A=t.nodes.start,i=t.nodes.end;A!==null;){var n=A===i?null:qf(A);e.append(A),A=n}}var XpA=null;var Bd=!1;function rD(t){Bd=t}var Sd=!1;function LW(t){Sd=t}var jn=null,y0=!1;function El(t){jn=t}var qn=null;function wg(t){qn=t}var FC=null;function yX(t){jn!==null&&(FC===null?FC=[t]:FC.push(t))}var Ns=null,Gl=0,Eg=null,vX=1,_f=0,Ed=_f;function GW(t){Ed=t}function bX(){return++vX}function Xh(t){var e=t.f;if((e&mc)!==0)return!0;if(2&e&&(t.f&=-32769),(e&KC)!==0){var A=t.deps;if(A!==null)for(var i=A.length,n=0;nt.wv)return!0}(e&pc)!==0&&pg===null&&$r(t,Zr)}return!1}function MX(t,e){var A,i=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],n=t.reactions;if(n!==null&&((A=FC)===null||A===void 0||!A.includes(t)))for(var o=0;o{t.ac.abort(ph)}),t.ac=null);try{t.f|=H_;var g=(0,t.fn)(),C=t.deps;if(Ns!==null){var I;if(sD(t,Gl),C!==null&&Gl>0)for(C.length=Gl+Ns.length,I=0;I1&&arguments[1]!==void 0?arguments[1]:new Set;if(!(typeof t!="object"||t===null||t instanceof EventTarget||e.has(t))){for(var A in e.add(t),t instanceof Date&&t.getTime(),t)try{V_(t[A],e)}catch(r){}var i=wR(t);if(i!==Object.prototype&&i!==Array.prototype&&i!==Map.prototype&&i!==Set.prototype&&i!==Date.prototype){var n=HZ(i);for(var o in n){var a=n[o].get;if(a)try{a.call(t)}catch(r){}}}}}var NX=new Set,W_=new Set;function FX(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};function n(o){if(i.capture||Df.call(e,o),!o.cancelBubble)return MD(()=>A?.call(this,o))}return t.startsWith("pointer")||t.startsWith("touch")||t==="wheel"?fd(()=>{e.addEventListener(t,n,i)}):e.addEventListener(t,n,i),n}function fe(t,e,A,i,n){var o={capture:i,passive:n},a=FX(t,e,A,o);(e===document.body||e===window||e===document||e instanceof HTMLMediaElement)&&SD(()=>{e.removeEventListener(t,a,o)})}function Vf(t){for(var e=0;ea||i});var C=jn,I=qn;El(null),wg(null);try{for(var d,h=[];a!==null;){var E=a.assignedSlot||a.parentNode||a.host||null;try{var f=a["__"+n];f==null||a.disabled&&t.target!==a||f.call(a,t)}catch(k){d?h.push(k):d=k}if(t.cancelBubble||E===A||E===null)break;a=E}if(d){var m=function(k){queueMicrotask(()=>{throw k})};for(var v of h)m(v);throw d}}finally{t.__root=A,delete t.currentTarget,El(C),wg(I)}}}function bR(t){var e=document.createElement("template");return e.innerHTML=t.replaceAll("",""),e.content}function wd(t,e){var A=qn;A.nodes===null&&(A.nodes={start:t,end:e,a:null,t:null})}function JA(t,e){var A,i=!!(1&e),n=!!(2&e),o=!t.startsWith("");return()=>{A===void 0&&(A=bR(o?t:""+t),i||(A=Jl(A)));var a=n||cX?document.importNode(A,!0):A.cloneNode(!0);return i?wd(Jl(a),a.lastChild):wd(a,a),a}}function xI(t,e){return(function(A,i){var n,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"svg",a=!A.startsWith(""),r=!!(1&i),s="<".concat(o,">").concat(a?A:""+A,"");return()=>{if(!n){var l=Jl(bR(s));if(r)for(n=document.createDocumentFragment();Jl(l);)n.appendChild(Jl(l));else n=Jl(l)}var g=n.cloneNode(!0);return r?wd(Jl(g),g.lastChild):wd(g,g),g}})(t,e,"svg")}function dr(){var t=wI((arguments.length>0&&arguments[0]!==void 0?arguments[0]:"")+"");return wd(t,t),t}function Fi(){var t=document.createDocumentFragment(),e=document.createComment(""),A=wI();return t.append(e,A),wd(e,A),t}function CA(t,e){t!==null&&t.before(e)}var emA=["beforeinput","click","change","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"],tmA={formnovalidate:"formNoValidate",ismap:"isMap",nomodule:"noModule",playsinline:"playsInline",readonly:"readOnly",defaultvalue:"defaultValue",defaultchecked:"defaultChecked",srcobject:"srcObject",novalidate:"noValidate",allowfullscreen:"allowFullscreen",disablepictureinpicture:"disablePictureInPicture",disableremoteplayback:"disableRemotePlayback"},imA=["touchstart","touchmove"];function nmA(t){return imA.includes(t)}function Lt(t,e){var A,i=e==null?"":typeof e=="object"?e+"":e;i!==((A=t.__t)!==null&&A!==void 0?A:t.__t=t.nodeValue)&&(t.__t=i,t.nodeValue=i+"")}function omA(t,e){return(function(A,i){var{target:n,anchor:o,props:a={},events:r,context:s,intro:l=!0}=i;(function(){if(NC===void 0){NC=window,cX=/Firefox/.test(navigator.userAgent);var h=Element.prototype,E=Node.prototype,f=Text.prototype;CX=RC(E,"firstChild").get,IX=RC(E,"nextSibling").get,bW(h)&&(h.__click=void 0,h.__className=void 0,h.__attributes=null,h.__style=void 0,h.__e=void 0),bW(f)&&(f.__t=void 0)}})();var g=new Set,C=h=>{for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};return new Promise(m=>{f.outro?Gh(E,()=>{Xr(E),m(void 0)}):(Xr(E),m(void 0))})}})(()=>{var h=o??n.appendChild(wI());return(function(E,f,m){new P_(E,f,m)})(h,{pending:()=>{}},E=>{s&&(Nt({}),Io.c=s),r&&(a.$$events=r),I=A(E,a)||{},s&&Ft()}),()=>{for(var E of g){n.removeEventListener(E,Df);var f=Ch.get(E);--f===0?(document.removeEventListener(E,Df),Ch.delete(E)):Ch.set(E,f)}var m;W_.delete(C),h!==o&&((m=h.parentNode)===null||m===void 0||m.removeChild(h))}});return Z_.set(I,d),I})(t,e)}var Ch=new Map,Z_=new WeakMap,Ih,pC=new WeakMap,ad=new WeakMap,mC=new WeakMap,ff=new WeakMap,u_=new WeakMap,KW=new WeakMap,amA=new WeakMap,Uh=class{constructor(e){var A=this,i=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];w0(this,"anchor",void 0),wo(this,pC,new Map),wo(this,ad,new Map),wo(this,mC,new Map),wo(this,ff,new Set),wo(this,u_,!0),wo(this,KW,()=>{var n=Jo;if(ve(pC,this).has(n)){var o=ve(pC,this).get(n),a=ve(ad,this).get(o);if(a)q_(a),ve(ff,this).delete(o);else{var r=ve(mC,this).get(o);r&&(ve(ad,this).set(o,r.effect),ve(mC,this).delete(o),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),a=r.effect)}for(var[s,l]of ve(pC,this)){if(ve(pC,this).delete(s),s===n)break;var g=ve(mC,this).get(l);g&&(Xr(g.effect),ve(mC,this).delete(l))}var C=function(h,E){if(h===o||ve(ff,A).has(h))return 1;var f=()=>{if(Array.from(ve(pC,A).values()).includes(h)){var m=document.createDocumentFragment();DX(E,m),m.append(wI()),ve(mC,A).set(h,{effect:E,fragment:m})}else Xr(E);ve(ff,A).delete(h),ve(ad,A).delete(h)};ve(u_,A)||!a?(ve(ff,A).add(h),Gh(E,f,!1)):f()};for(var[I,d]of ve(ad,this))C(I,d)}}),wo(this,amA,n=>{ve(pC,this).delete(n);var o=Array.from(ve(pC,this).values());for(var[a,r]of ve(mC,this))o.includes(a)||(Xr(r.effect),ve(mC,this).delete(a))}),this.anchor=e,Bn(u_,this,i)}ensure(e,A){var i=Jo;!A||ve(ad,this).has(e)||ve(mC,this).has(e)||ve(ad,this).set(e,S0(()=>A(this.anchor))),ve(pC,this).set(i,e),ve(KW,this).call(this)}};function As(t){Io===null&&Pf(),Ph&&Io.l!==null?LX(Io).m.push(t):j_(()=>{var e=wA(t);if(typeof e=="function")return e})}function Dg(t){Io===null&&Pf(),As(()=>()=>wA(t))}function rmA(){var t=Io;return t===null&&Pf(),(e,A,i)=>{var n,o=(n=t.s.$$events)===null||n===void 0?void 0:n[e];if(o){var a=zf(o)?o.slice():[o],r=(function(l,g){var{bubbles:C=!1,cancelable:I=!1}=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return new CustomEvent(l,{detail:g,bubbles:C,cancelable:I})})(e,A,i);for(var s of a)s.call(t.x,r);return!r.defaultPrevented}return!0}}function smA(t){Io===null&&Pf(),Io.l===null&&(function(){throw new Error("https://svelte.dev/e/lifecycle_legacy_only")})(),LX(Io).b.push(t)}function LX(t){var e,A=t.l;return(e=A.u)!==null&&e!==void 0?e:A.u={a:[],b:[],m:[]}}function jA(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=new Uh(t);function n(o,a){i.ensure(o,a)}Zh(()=>{var o=!1;e(function(a){o=!0,n(!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],a)}),o||n(!1,null)},A?ud:0)}function GX(t,e,A){var i=new Uh(t),n=!Vh();Zh(()=>{var o=e();n&&o!==null&&typeof o=="object"&&(o={}),i.ensure(o,A)})}function ka(t,e){return e}function f_(t){for(var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=0;A5&&arguments[5]!==void 0?arguments[5]:null,a=t,r=new Map;!(4&e)||(a=t.appendChild(wI()));var s,l=null,g=it(()=>{var E=A();return zf(E)?E:E==null?[]:W5(E)}),C=!0;function I(){h.fallback=l,(function(E,f,m,v,k){var S,b,x,F,z,P=!!(8&v),Z=f.length,tA=E.items,W=E.effect.first,BA=null,X=[],iA=[];if(P)for(z=0;z0){var YA=4&v&&Z===0?m:null;if(P){for(z=0;z<_e;z+=1){var fA;(fA=Je[z].nodes)===null||fA===void 0||(fA=fA.a)===null||fA===void 0||fA.measure()}for(z=0;z<_e;z+=1){var XA;(XA=Je[z].nodes)===null||XA===void 0||(XA=XA.a)===null||XA===void 0||XA.fix()}}(function(DA,ee,NA){for(var ke,HA=ee.length,vA=ee.length,Gt=function(){var pt=ee[ft];Gh(pt,()=>{if(ke){if(ke.pending.delete(pt),ke.done.add(pt),ke.pending.size===0){var xe=DA.outrogroups;f_(W5(ke.done)),xe.delete(ke),xe.size===0&&(DA.outrogroups=null)}}else vA-=1},!1)},ft=0;ft{if(b!==void 0)for(F of b){var DA;(DA=F.nodes)===null||DA===void 0||(DA=DA.a)===null||DA===void 0||DA.apply()}})})(h,s,a,e,i),l!==null&&(s.length===0?(l.f&wC)===0?q_(l):(l.f^=wC,pf(l,null,a)):Gh(l,()=>{l=null}))}var d=Zh(()=>{for(var E=(s=c(g)).length,f=new Set,m=0;mo(a)):(l=S0(()=>o(Ih??(Ih=wI())))).f|=wC),C||I(),c(g)}),h={effect:d,items:r,outrogroups:null,fallback:l};C=!1}function lmA(t,e,A,i,n,o,a,r){var s=1&a?16&a?UC(A):EA(A,!1,!1):null,l=2&a?UC(n):null;return{v:s,i:l,e:S0(()=>(o(e,s??A,l??n,r),()=>{t.delete(i)}))}}function pf(t,e,A){if(t.nodes)for(var i=t.nodes.start,n=t.nodes.end,o=e&&(e.f&wC)===0?e.nodes.start:A;i!==null;){var a=qf(i);if(o.before(i),i===n)return;i=a}}function sI(t,e,A){e===null?t.effect.first=A:e.next=A,A===null?t.effect.last=e:A.prev=e}function KX(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=arguments.length>3&&arguments[3]!==void 0&&arguments[3],n=t,o="";Se(()=>{var a,r=qn;if(o!==(o=(a=e())!==null&&a!==void 0?a:"")&&(r.nodes!==null&&(fX(r.nodes.start,r.nodes.end),r.nodes=null),o!=="")){var s=o+"";A?s="".concat(s,""):i&&(s="".concat(s,""));var l=bR(s);if((A||i)&&(l=Jl(l)),wd(Jl(l),l.lastChild),A||i)for(;Jl(l);)n.before(Jl(l));else n.before(l)}})}function Ia(t,e,A,i,n){var o,a=(o=e.$$slots)===null||o===void 0?void 0:o[A],r=!1;a===!0&&(a=e[A==="default"?"children":A],r=!0),a===void 0?n!==null&&n(t):a(t,r?()=>i:i)}function UX(t,e,A){var i=new Uh(t);Zh(()=>{var n,o=(n=e())!==null&&n!==void 0?n:null;i.ensure(o,o&&(a=>A(a,o)))},ud)}function ms(t,e,A){_r(()=>{var i=wA(()=>e(t,A?.())||{});if(A&&i!=null&&i.update){var n=!1,o={};Wh(()=>{var a=A();K(a),n&&ZZ(o,a)&&(o=a,i.update(a))}),n=!0}if(i!=null&&i.destroy)return()=>i.destroy()})}function gmA(t,e){var A,i=void 0;hX(()=>{i!==(i=e())&&(A&&(Xr(A),A=null),i&&(A=S0(()=>{_r(()=>i(t))})))})}function TX(t){var e,A,i="";if(typeof t=="string"||typeof t=="number")i+=t;else if(typeof t=="object")if(Array.isArray(t)){var n=t.length;for(e=0;e1&&arguments[1]!==void 0&&arguments[1]?" !important;":";",A="";for(var i in t){var n=t[i];n!=null&&n!==""&&(A+=" "+i+": "+n+e)}return A}function p_(t){return t[0]!=="-"||t[1]!=="-"?t.toLowerCase():t}function ii(t,e,A,i,n,o){var a=t.__className;if(a!==A||a===void 0){var r=(function(g,C,I){var d=g==null?"":""+g;if(C&&(d=d?d+" "+C:C),I){for(var h in I)if(I[h])d=d?d+" "+h:h;else if(d.length)for(var E=h.length,f=0;(f=d.indexOf(h,f))>=0;){var m=f+E;f!==0&&!UW.includes(d[f-1])||m!==d.length&&!UW.includes(d[m])?f=m:d=(f===0?"":d.substring(0,f))+d.substring(m+1)}}return d===""?null:d})(A,i,o);r==null?t.removeAttribute("class"):e?t.className=r:t.setAttribute("class",r),t.__className=A}else if(o&&n!==o)for(var s in o){var l=!!o[s];n!=null&&l===!!n[s]||t.classList.toggle(s,l)}return o}function m_(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},A=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0;for(var n in A){var o=A[n];e[n]!==o&&(A[n]==null?t.style.removeProperty(n):t.style.setProperty(n,o,i))}}function mg(t,e,A,i){if(t.__style!==e){var n=(function(o,a){if(a){var r,s,l="";if(Array.isArray(a)?(r=a[0],s=a[1]):r=a,o){o=String(o).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var g=!1,C=0,I=!1,d=[];r&&d.push(...Object.keys(r).map(p_)),s&&d.push(...Object.keys(s).map(p_));for(var h=0,E=-1,f=o.length,m=0;m2&&arguments[2]!==void 0&&arguments[2];if(t.multiple){if(e==null)return;if(!zf(e))return void console.warn("https://svelte.dev/e/select_multiple_invalid_value");for(var i of t.options)i.selected=e.includes(JW(i))}else{for(i of t.options)if(WpA(JW(i),e))return void(i.selected=!0);A&&e===void 0||(t.selectedIndex=-1)}}function cmA(t){var e=new MutationObserver(()=>{X_(t,t.__value)});e.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),SD(()=>{e.disconnect()})}function JW(t){return"__value"in t?t.__value:t.value}var uh=Symbol("class"),mf=Symbol("style"),JX=Symbol("is custom element"),OX=Symbol("is html");function Dd(t,e){var A=MR(t);A.value!==(A.value=e??void 0)&&(t.value!==e||e===0&&t.nodeName==="PROGRESS")&&(t.value=e??"")}function _n(t,e,A,i){var n=MR(t);n[e]!==(n[e]=A)&&(e==="loading"&&(t[YpA]=A),A==null?t.removeAttribute(e):typeof A!="string"&&YX(t).includes(e)?t[e]=A:t.setAttribute(e,A))}function CmA(t,e,A,i){var n,o=MR(t),a=o[JX],r=!o[OX],s=e||{},l=t.tagName==="OPTION";for(var g in e)g in A||(A[g]=null);A.class?A.class=bI(A.class):(i||A[uh])&&(A.class=null),A[mf]&&((n=A.style)!==null&&n!==void 0||(A.style=null));var C,I,d,h,E,f,m=YX(t),v=function(S){var b=A[S];if(l&&S==="value"&&b==null)return t.value=t.__value="",s[S]=b,0;if(S==="class")return C=t.namespaceURI==="http://www.w3.org/1999/xhtml",ii(t,C,b,i,e?.[uh],A[uh]),s[S]=b,s[uh]=A[uh],0;if(S==="style")return mg(t,b,e?.[mf],A[mf]),s[S]=b,s[mf]=A[mf],0;if(b===(I=s[S])&&(b!==void 0||!t.hasAttribute(S))||(s[S]=b,(d=S[0]+S[1])==="$$"))return 0;if(d==="on"){var x={},F="$$"+S,z=S.slice(2);if(h=(function(X){return emA.includes(X)})(z),(function(X){return X.endsWith("capture")&&X!=="gotpointercapture"&&X!=="lostpointercapture"})(z)&&(z=z.slice(0,-7),x.capture=!0),!h&&I){if(b!=null)return 0;t.removeEventListener(z,s[F],x),s[F]=null}if(b!=null)if(h)t["__".concat(z)]=b,Vf([z]);else{let X=function(iA){s[S].call(this,iA)};var BA=X;s[F]=FX(z,t,X,x)}else h&&(t["__".concat(z)]=void 0)}else if(S==="style")_n(t,S,b);else if(S==="autofocus")(function(X,iA){if(iA){var AA=document.body;X.autofocus=!0,fd(()=>{document.activeElement===AA&&X.focus()})}})(t,!!b);else if(a||S!=="__value"&&(S!=="value"||b==null))if(S==="selected"&&l)(function(X,iA){iA?X.hasAttribute("selected")||X.setAttribute("selected",""):X.removeAttribute("selected")})(t,b);else if(E=S,r||(E=(function(X){var iA;return X=X.toLowerCase(),(iA=tmA[X])!==null&&iA!==void 0?iA:X})(E)),f=E==="defaultValue"||E==="defaultChecked",b!=null||a||f)f||m.includes(E)&&(a||typeof b!="string")?(t[E]=b,E in o&&(o[E]=Wr)):typeof b!="function"&&_n(t,E,b);else if(o[S]=null,E==="value"||E==="checked"){var P=t,Z=e===void 0;if(E==="value"){var tA=P.defaultValue;P.removeAttribute(E),P.defaultValue=tA,P.value=P.__value=Z?tA:null}else{var W=P.defaultChecked;P.removeAttribute(E),P.defaultChecked=W,P.checked=!!Z&&W}}else t.removeAttribute(S);else t.value=t.__value=b};for(var k in A)v(k);return s}function AD(t,e){var A=arguments.length>5?arguments[5]:void 0,i=arguments.length>6&&arguments[6]!==void 0&&arguments[6],n=arguments.length>7&&arguments[7]!==void 0&&arguments[7];sX(arguments.length>4&&arguments[4]!==void 0?arguments[4]:[],arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],arguments.length>3&&arguments[3]!==void 0?arguments[3]:[],o=>{var a=void 0,r={},s=t.nodeName==="SELECT",l=!1;if(hX(()=>{var C=e(...o.map(c)),I=CmA(t,a,C,A,i,n);for(var d of(l&&s&&"value"in C&&X_(t,C.value),Object.getOwnPropertySymbols(r)))C[d]||Xr(r[d]);for(var h of Object.getOwnPropertySymbols(C)){var E=C[h];h.description!=="@attach"||a&&E===a[h]||(r[h]&&Xr(r[h]),r[h]=S0(()=>gmA(t,()=>E))),I[h]=E}a=I}),s){var g=t;_r(()=>{X_(g,a.value,!0),cmA(g)})}l=!0})}function MR(t){var e;return(e=t.__attributes)!==null&&e!==void 0?e:t.__attributes={[JX]:t.nodeName.includes("-"),[OX]:t.namespaceURI==="http://www.w3.org/1999/xhtml"}}var OW=new Map;function YX(t){var e,A=t.getAttribute("is")||t.nodeName,i=OW.get(A);if(i)return i;OW.set(A,i=[]);for(var n=t,o=Element.prototype;o!==n;){for(var a in e=HZ(n))e[a].set&&i.push(a);n=wR(n)}return i}function lD(t,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e,i=new WeakSet;ZpA(t,"input",(function(){var n=zt(function*(o){var a=o?t.defaultValue:t.value;if(a=w_(t)?D_(a):a,A(a),Jo!==null&&i.add(Jo),yield kX(),a!==(a=e())){var r=t.selectionStart,s=t.selectionEnd,l=t.value.length;if(t.value=a??"",s!==null){var g=t.value.length;r===s&&s===l&&g>l?(t.selectionStart=g,t.selectionEnd=g):(t.selectionStart=r,t.selectionEnd=Math.min(s,g))}}});return function(o){return n.apply(this,arguments)}})()),wA(e)==null&&t.value&&(A(w_(t)?D_(t.value):t.value),Jo!==null&&i.add(Jo)),Wh(()=>{var n=e();if(t===document.activeElement){var o=Mf??Jo;if(i.has(o))return}w_(t)&&n===D_(t.value)||(t.type!=="date"||n||t.value)&&n!==t.value&&(t.value=n??"")})}function w_(t){var e=t.type;return e==="number"||e==="range"}function D_(t){return t===""?null:+t}function jt(t,e,A){var i=RC(t,e);i&&i.set&&(t[e]=A,SD(()=>{t[e]=null}))}function YW(t,e){return t===e||t?.[M0]===e}function Oo(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,A=arguments.length>2?arguments[2]:void 0;return _r(()=>{var i,n;return Wh(()=>{i=n,n=[],wA(()=>{t!==A(...n)&&(e(t,...n),i&&YW(A(...i),t)&&e(null,...i))})}),()=>{fd(()=>{n&&YW(A(...n),t)&&e(null,...n)})}}),t}function vC(t){return function(){for(var e=arguments.length,A=new Array(e),i=0;i0&&arguments[0]!==void 0&&arguments[0],e=Io,A=e.l.u;if(A){var i,n=()=>K(e.s);if(t){var o=0,a={},r=jf(()=>{var s=!1,l=e.s;for(var g in l)l[g]!==a[g]&&(a[g]=l[g],s=!0);return s&&o++,o});n=()=>c(r)}A.b.length&&(i=()=>{HW(e,n),Y_(A.b)},BX(),Dc(1048584,i,!0)),j_(()=>{var s=wA(()=>A.m.map(TpA));return()=>{for(var l of s)typeof l=="function"&&l()}}),A.a.length&&j_(()=>{HW(e,n),Y_(A.a)})}}function HW(t,e){if(t.l.s)for(var A of t.l.s)c(A);e()}function kD(t){var e=UC(0);return function(){return arguments.length===1?(N(e,c(e)+1),arguments[0]):(c(e),t())}}function yf(t,e){var A,i=(A=t.$$events)===null||A===void 0?void 0:A[e.type],n=zf(i)?i.slice():i==null?[]:[i];for(var o of n)o.call(this,e)}var F5=!1,ImA={get(t,e){if(!t.exclude.includes(e))return c(t.version),e in t.special?t.special[e]():t.props[e]},set(t,e,A){if(!(e in t.special)){var i=qn;try{wg(t.parent_effect),t.special[e]=L({get[e](){return t.props[e]}},e,4)}finally{wg(i)}}return t.special[e](A),RW(t.version),!0},getOwnPropertyDescriptor(t,e){if(!t.exclude.includes(e))return e in t.props?{enumerable:!0,configurable:!0,value:t.props[e]}:void 0},deleteProperty:(t,e)=>(t.exclude.includes(e)||(t.exclude.push(e),RW(t.version)),!0),has:(t,e)=>!t.exclude.includes(e)&&e in t.props,ownKeys:t=>Reflect.ownKeys(t.props).filter(e=>!t.exclude.includes(e))};function L5(t,e){return new Proxy({props:t,exclude:e,special:{},version:UC(0),parent_effect:qn},ImA)}var dmA={get(t,e){for(var A=t.props.length;A--;){var i=t.props[A];if(Qf(i)&&(i=i()),typeof i=="object"&&i!==null&&e in i)return i[e]}},set(t,e,A){for(var i=t.props.length;i--;){var n=t.props[i];Qf(n)&&(n=n());var o=RC(n,e);if(o&&o.set)return o.set(A),!0}return!1},getOwnPropertyDescriptor(t,e){for(var A=t.props.length;A--;){var i=t.props[A];if(Qf(i)&&(i=i()),typeof i=="object"&&i!==null&&e in i){var n=RC(i,e);return n&&!n.configurable&&(n.configurable=!0),n}}},has(t,e){if(e===M0||e===VZ)return!1;for(var A of t.props)if(Qf(A)&&(A=A()),A!=null&&e in A)return!0;return!1},ownKeys(t){var e=[];for(var A of t.props)if(Qf(A)&&(A=A()),A){for(var i in A)e.includes(i)||e.push(i);for(var n of Object.getOwnPropertySymbols(A))e.includes(n)||e.push(n)}return e}};function DI(){for(var t=arguments.length,e=new Array(t),A=0;A(g&&(g=!1,l=s?wA(i):i),l);if(r){var I,d,h=M0 in t||VZ in t;n=(I=(d=RC(t,e))===null||d===void 0?void 0:d.set)!==null&&I!==void 0?I:h&&e in t?b=>t[e]=b:void 0}var E,f=!1;if(r?[o,f]=(function(b){var x=F5;try{return F5=!1,[b(),F5]}finally{F5=x}})(()=>t[e]):o=t[e],o===void 0&&i!==void 0&&(o=C(),n&&(a&&(function(){throw new Error("https://svelte.dev/e/props_invalid_value")})(),n(o))),E=a?()=>{var b=t[e];return b===void 0?C():(g=!0,b)}:()=>{var b=t[e];return b!==void 0&&(l=void 0),b===void 0?l:b},a&&!(4&A))return E;if(n){var m=t.$$legacy;return function(b,x){return arguments.length>0?(a&&x&&!m&&!f||n(x?E():b),b):E()}}var v=!1,k=(1&A?jf:it)(()=>(v=!1,E()));r&&c(k);var S=qn;return function(b,x){if(arguments.length>0){var F=x?c(k):a&&r?mh(b):b;return N(k,F),v=!0,l!==void 0&&(l=F),b}return Sd&&v||(S.f&qh)!==0?k.v:c(k)}}function or(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:(function(i){var n=(function(o){try{if(typeof window<"u"&&window.localStorage!==void 0)return window.localStorage[o]}catch(a){}})("debug");return n!=null&&n.endsWith("*")?i.startsWith(n.slice(0,-1)):i===n})(t);if(!e)return BmA;var A=(function(i){for(var n=0,o=0;o9466848e5&&isFinite(t)&&Math.floor(t)===t&&!isNaN(new Date(t).valueOf());if(typeof t=="bigint")return $_(Number(t));try{var e=t&&t.valueOf();if(e!==t)return $_(e)}catch(A){return!1}return!1}function HX(t){(G5=G5||window.document.createElement("div")).style.color="",G5.style.color=t;var e=G5.style.color;return e!==""?e.replace(/\s+/g,"").toLowerCase():void 0}var G5=void 0;function umA(t){return typeof t=="string"&&t.length<99&&!!HX(t)}function kR(t,e){if(typeof t=="number"||typeof t=="string"||typeof t=="boolean"||t===void 0)return typeof t;if(typeof t=="bigint")return"number";if(t===null)return"null";if(Array.isArray(t))return"array";if(Mn(t))return"object";var A=e.stringify(t);return A&&SR(A)?"number":A==="true"||A==="false"?"boolean":A==="null"?"null":"unknown"}var fmA=/^https?:\/\/\S+$/;function xD(t){return typeof t=="string"&&fmA.test(t)}function $h(t,e){if(t==="")return"";var A=t.trim();return A==="null"?null:A==="true"||A!=="false"&&(SR(A)?e.parse(A):t)}var pmA=[];function PW(t,e){if(t.length!==e.length)return!1;for(var A=0;A1&&arguments[1]!==void 0&&arguments[1],A={};if(!Array.isArray(t))throw new TypeError("Array expected");function i(a,r){(!Array.isArray(a)&&!Mn(a)||e&&r.length>0)&&(A[vt(r)]=!0),Mn(a)&&Object.keys(a).forEach(s=>{i(a[s],r.concat(s))})}for(var n=Math.min(t.length,1e4),o=0;oe?t.slice(0,e):t}function jW(t){return Me({},t)}function qW(t){return Object.values(t)}function VW(t,e,A,i){var n=t.slice(0),o=n.splice(e,A);return n.splice.apply(n,[e+i,0,...o]),n}function mmA(t,e,A){return t.slice(0,e).concat(A).concat(t.slice(e))}function Wf(t,e){try{return e.parse(t)}catch(A){return e.parse(ag(t))}}function PX(t,e){try{return Wf(t,e)}catch(A){return}}function Zf(t,e){t=t.replace(qX,"");try{return e(t)}catch(A){}try{return e("{"+t+"}")}catch(A){}try{return e("["+t+"]")}catch(A){}throw new Error("Failed to parse partial JSON")}function jX(t){t=t.replace(qX,"");try{return ag(t)}catch(i){}try{var e=ag("["+t+"]");return e.substring(1,e.length-1)}catch(i){}try{var A=ag("{"+t+"}");return A.substring(1,A.length-1)}catch(i){}throw new Error("Failed to repair partial JSON")}var qX=/,\s*$/;function Th(t,e){var A=ZW.exec(e);if(A){var i=Rr(A[2]),n=(function(d,h){for(var E=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:d.length,m=0,v=E;v"line ".concat(n+1," column ").concat(o+1))}}var a=vmA.exec(e),r=a?Rr(a[1]):void 0,s=r!==void 0?r-1:void 0,l=bmA.exec(e),g=l?Rr(l[1]):void 0,C=g!==void 0?g-1:void 0,I=s!==void 0&&C!==void 0?(function(d,h,E){for(var f=d.indexOf(` -`),m=1;m1&&arguments[1]!==void 0?arguments[1]:void 0,A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:JSON;return Rf(t)?t:{text:A.stringify(t.json,null,e)}}function WW(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:JSON;return Nf(t)?t:{json:e.parse(t.text)}}function eR(t,e,A){return wmA(t,e,A).text}function DmA(t,e){return ymA(t,e)>e}function ymA(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1/0;if(Rf(t))return t.text.length;var A=t.json,i=0;return(function n(o){if(Array.isArray(o)){if((i+=o.length-1+2)>e)return;for(var a=0;ae)return}else if(Mn(o)){var r=Object.keys(o);i+=2+r.length+(r.length-1);for(var s=0;sWX($X(String(t))),unescapeValue:t=>A$(ZX(t))},kmA={escapeValue:t=>$X(String(t)),unescapeValue:t=>A$(t)},xmA={escapeValue:t=>WX(String(t)),unescapeValue:t=>ZX(t)},_mA={escapeValue:t=>String(t),unescapeValue:t=>t};function WX(t){return t.replace(/[^\x20-\x7F]/g,e=>{var A;return e==="\b"||e==="\f"||e===` -`||e==="\r"||e===" "?e:"\\u"+("000"+((A=e.codePointAt(0))===null||A===void 0?void 0:A.toString(16))).slice(-4)})}function ZX(t){return t.replace(/\\u[a-fA-F0-9]{4}/g,e=>{try{var A=JSON.parse('"'+e+'"');return XX[A]||A}catch(i){return e}})}var XX={'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},RmA={'\\"':'"',"\\\\":"\\","\\/":"/","\\b":"\b","\\f":"\f","\\n":` -`,"\\r":"\r","\\t":" "};function $X(t){return t.replace(/["\b\f\n\r\t\\]/g,e=>XX[e]||e)}function A$(t){return t.replace(/\\["bfnrt\\]/g,e=>RmA[e]||e)}function Jh(t){return typeof t!="string"?String(t):t.endsWith(` -`)?t+` -`:t}function e$(t,e){return AQ(t,A=>A.nodeName.toUpperCase()===e.toUpperCase())}function QI(t,e,A){return AQ(t,i=>(function(n,o,a){return typeof n.getAttribute=="function"&&n.getAttribute(o)===a})(i,e,A))}function AQ(t,e){return!!_R(t,e)}function _R(t,e){for(var A=t;A&&!e(A);)A=A.parentNode;return A}function Xf(t){var e,A;return(e=t==null||(A=t.ownerDocument)===null||A===void 0?void 0:A.defaultView)!==null&&e!==void 0?e:void 0}function RR(t){var e=Xf(t),A=e?.document.activeElement;return!!A&&AQ(A,i=>i===t)}function t$(t,e){return _R(t,A=>A.nodeName===e)}function b_(t){return QI(t,"data-type","selectable-key")?oo.key:QI(t,"data-type","selectable-value")?oo.value:QI(t,"data-type","insert-selection-area-inside")?oo.inside:QI(t,"data-type","insert-selection-area-after")?oo.after:oo.multi}function eD(t){return encodeURIComponent(vt(t))}function i$(t){var e,A=_R(t,n=>!(n==null||!n.hasAttribute)&&n.hasAttribute("data-path")),i=(e=A?.getAttribute("data-path"))!==null&&e!==void 0?e:void 0;return i?Es(decodeURIComponent(i)):void 0}function NmA(t){var{allElements:e,currentElement:A,direction:i,hasPrio:n=()=>!0,margin:o=10}=t,a=G9(e.filter(function(m){var v=m.getBoundingClientRect();return v.width>0&&v.height>0}),s),r=s(A);function s(m){var v=m.getBoundingClientRect();return{x:v.left+v.width/2,y:v.top+v.height/2,rect:v,element:m}}function l(m,v){var k=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,S=m.x-v.x,b=(m.y-v.y)*k;return Math.sqrt(S*S+b*b)}var g=m=>l(m,r);if(i==="Left"||i==="Right"){var C=i==="Left"?a.filter(m=>{return v=r,m.rect.left+o{return v=r,m.rect.right>v.rect.right+o;var v}),I=C.filter(m=>{return v=m,k=r,Math.abs(v.y-k.y)l(m,r,10));return d?.element}if(i==="Up"||i==="Down"){var h=i==="Up"?a.filter(m=>{return v=r,m.y+o{return v=r,m.y>v.y+o;var v}),E=h.filter(m=>n(m.element)),f=SE(E,g)||SE(h,g);return f?.element}}function NR(){var t,e,A,i;return typeof navigator<"u"&&(t=(e=(A=navigator)===null||A===void 0||(A=A.platform)===null||A===void 0?void 0:A.toUpperCase().includes("MAC"))!==null&&e!==void 0?e:(i=navigator)===null||i===void 0||(i=i.userAgentData)===null||i===void 0||(i=i.platform)===null||i===void 0?void 0:i.toUpperCase().includes("MAC"))!==null&&t!==void 0&&t}function TC(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"+",A=[];FR(t,arguments.length>2&&arguments[2]!==void 0?arguments[2]:NR)&&A.push("Ctrl"),t.altKey&&A.push("Alt"),t.shiftKey&&A.push("Shift");var i=t.key.length===1?t.key.toUpperCase():t.key;return i in FmA||A.push(i),A.join(e)}function FR(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:NR;return t.ctrlKey||t.metaKey&&e()}var FmA={Ctrl:!0,Command:!0,Control:!0,Alt:!0,Option:!0,Shift:!0};function Zt(t,e){e===void 0&&(e={});var A=e.insertAt;if(t&&typeof document<"u"){var i=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",A==="top"&&i.firstChild?i.insertBefore(n,i.firstChild):i.appendChild(n),n.styleSheet?n.styleSheet.cssText=t:n.appendChild(document.createTextNode(t))}}Zt(`.jse-absolute-popup.svelte-enkkpn { - position: relative; - left: 0; - top: 0; - width: 0; - height: 0; - z-index: 1001; -} -.jse-absolute-popup.svelte-enkkpn .jse-hidden-input:where(.svelte-enkkpn) { - position: fixed; - left: 0; - top: 0; - width: 0; - height: 0; - padding: 0; - margin: 0; - border: none; - outline: none; - overflow: hidden; -} -.jse-absolute-popup.svelte-enkkpn .jse-absolute-popup-content:where(.svelte-enkkpn) { - position: absolute; -}`);var LmA=JA('
          '),GmA=JA('
          ');function KmA(t,e){Nt(e,!1);var A=L(e,"popup",8),i=L(e,"closeAbsolutePopup",8),n=EA(),o=EA();function a(C){A().options&&A().options.closeOnOuterClick&&!AQ(C.target,I=>I===c(n))&&i()(A().id)}function r(C){TC(C)==="Escape"&&(C.preventDefault(),C.stopPropagation(),i()(A().id))}As(function(){c(o)&&c(o).focus()}),ni();var s=GmA();fe("mousedown",NC,function(C){a(C)},!0),fe("keydown",NC,r,!0),fe("wheel",NC,function(C){a(C)},!0);var l=dA(s),g=C=>{var I=LmA(),d=dA(I);Oo(d,h=>N(o,h),()=>c(o)),UX(_A(d,2),()=>A().component,(h,E)=>{E(h,DI(()=>A().props))}),Se(h=>mg(I,h),[()=>(c(n),K(A()),wA(()=>(function(h,E){var f=h.getBoundingClientRect(),{left:m,top:v,positionAbove:k,positionLeft:S}=(function(){if(E.anchor){var{anchor:b,width:x=0,height:F=0,offsetTop:z=0,offsetLeft:P=0,position:Z}=E,{left:tA,top:W,bottom:BA,right:X}=b.getBoundingClientRect(),iA=Z==="top"||W+F>window.innerHeight&&W>F,AA=Z==="left"||tA+x>window.innerWidth&&tA>x;return{left:AA?X-P:tA+P,top:iA?W-z:BA+z,positionAbove:iA,positionLeft:AA}}if(typeof E.left=="number"&&typeof E.top=="number"){var{left:IA,top:aA,width:rA=0,height:uA=0}=E;return{left:IA,top:aA,positionAbove:aA+uA>window.innerHeight&&aA>uA,positionLeft:IA+rA>window.innerWidth&&IA>rA}}throw new Error('Invalid config: pass either "left" and "top", or pass "anchor"')})();return(k?"bottom: ".concat(f.top-v,"px;"):"top: ".concat(v-f.top,"px;"))+(S?"right: ".concat(f.left-m,"px;"):"left: ".concat(m-f.left,"px;"))})(c(n),A().options)))]),CA(C,I)};jA(l,C=>{c(n)&&C(g)}),Oo(s,C=>N(n,C),()=>c(n)),fe("mousedown",s,function(C){C.stopPropagation()}),fe("keydown",s,r),CA(t,s),Ft()}var UmA=JA(" ",1);function tR(t,e){Nt(e,!1);var A=or("jsoneditor:AbsolutePopup"),i=EA([],!0);function n(r){var s=c(i).findIndex(g=>g.id===r);if(s!==-1){var l=c(i)[s];l.options.onClose&&l.options.onClose(),N(i,c(i).filter(g=>g.id!==r))}}(function(r,s){$Z().set(r,s)})("absolute-popup",{openAbsolutePopup:function(r,s,l){A("open...",s,l);var g={id:wh(),component:r,props:s||{},options:l||{}};return N(i,[...c(i),g]),g.id},closeAbsolutePopup:n}),KA(()=>c(i),()=>{A("popups",c(i))}),Rn(),ni(!0);var o=UmA(),a=et(o);da(a,1,()=>c(i),ka,(r,s)=>{KmA(r,{get popup(){return c(s)},closeAbsolutePopup:n})}),Ia(_A(a,2),e,"default",{},null),CA(t,o),Ft()}function $f(t,e){for(var A=new Set(e),i=t.replace(/ \(copy( \d+)?\)$/,""),n=t,o=1;A.has(n);){var a="copy"+(o>1?" "+o:"");n="".concat(i," (").concat(a,")"),o++}return n}function SC(t,e){var A=e-3;return t.length>e?t.substring(0,A)+"...":t}function TmA(t){if(t==="")return"";var e=t.toLowerCase();if(e==="null")return null;if(e==="true")return!0;if(e==="false")return!1;if(e!=="undefined"){var A=Number(t),i=parseFloat(t);return isNaN(A)||isNaN(i)?t:A}}var JmA={id:"jsonquery",name:"JSONQuery",description:` -

          - Enter a JSON Query function to filter, sort, or transform the data. - You can use functions like get, filter, - sort, pick, groupBy, uniq, etcetera. - Example query: filter(.age >= 18) -

          -`,createQuery:function(t,e){var{filter:A,sort:i,projection:n}=e,o=[];A&&A.path&&A.relation&&A.value&&o.push(["filter",[(a=A.relation,P9("1 ".concat(a," 1"))[0]),K5(A.path),TmA(A.value)]]);var a;return i&&i.path&&i.direction&&o.push(["sort",K5(i.path),i.direction==="desc"?"desc":"asc"]),n&&n.paths&&(n.paths.length>1?o.push(["pick",...n.paths.map(K5)]):o.push(["map",K5(n.paths[0])])),cz(["pipe",...o])},executeQuery:function(t,e,A){var i=VX(A,JSON)?t:(function(n){var o=A.stringify(n);return o!==void 0?JSON.parse(o):void 0})(t);return e.trim()!==""?Cz(i,e):i}};function K5(t){return["get",...t]}var OmA=xI("");function YmA(t,e){Nt(e,!1);var A=870711,i=EA(""),n=L(e,"data",8);function o(r){if(!r||!r.raw)return"";var s=r.raw,l={};return s=s.replace(/\s(?:xml:)?id=["']?([^"')\s]+)/g,(g,C)=>{var I="fa-".concat((A+=1).toString(16));return l[C]=I,' id="'.concat(I,'"')}),s=s.replace(/#(?:([^'")\s]+)|xpointer\(id\((['"]?)([^')]+)\2\)\))/g,(g,C,I,d)=>{var h=C||d;return h&&l[h]?"#".concat(l[h]):g}),s}KA(()=>K(n()),()=>{N(i,o(n()))}),Rn();var a=OmA();KX(dA(a),()=>c(i),!0),CA(t,a),Ft()}Zt(` - .fa-icon.svelte-v67cny { - display: inline-block; - fill: currentColor; - } - .fa-flip-horizontal.svelte-v67cny { - transform: scale(-1, 1); - } - .fa-flip-vertical.svelte-v67cny { - transform: scale(1, -1); - } - .fa-spin.svelte-v67cny { - animation: svelte-v67cny-fa-spin 1s 0s infinite linear; - } - .fa-inverse.svelte-v67cny { - color: #fff; - } - .fa-pulse.svelte-v67cny { - animation: svelte-v67cny-fa-spin 1s infinite steps(8); - } - @keyframes svelte-v67cny-fa-spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } - } -`);var HmA=xI(""),zmA=xI(""),PmA=xI(""),jmA=xI("",1);function tn(t,e){var A=L5(e,["children","$$slots","$$events","$$legacy"]),i=L5(A,["class","data","scale","spin","inverse","pulse","flip","label","style"]);Nt(e,!1);var n=L(e,"class",8,""),o=L(e,"data",8),a=EA(),r=L(e,"scale",8,1),s=L(e,"spin",8,!1),l=L(e,"inverse",8,!1),g=L(e,"pulse",8,!1),C=L(e,"flip",8,void 0),I=L(e,"label",8,""),d=L(e,"style",8,""),h=EA(10),E=EA(10),f=EA(),m=EA();function v(){var S=1;return r()!==void 0&&(S=Number(r())),isNaN(S)||S<=0?(console.warn('Invalid prop: prop "scale" should be a number over 0.'),1):1*S}function k(){return c(a)?Math.max(c(a).width,c(a).height)/16:1}KA(()=>(K(o()),K(d()),K(r())),()=>{N(a,(function(S){var b;if(S){if(!("definition"in S)){if("iconName"in S&&"icon"in S){S.iconName;var[x,F,,,z]=S.icon;b={width:x,height:F,paths:(Array.isArray(z)?z:[z]).map(P=>({d:P}))}}else b=S[Object.keys(S)[0]];return b}console.error("`import faIconName from '@fortawesome/package-name/faIconName` not supported - Please use `import { faIconName } from '@fortawesome/package-name/faIconName'` instead")}})(o())),d(),r(),N(h,c(a)?c(a).width/k()*v():0),N(E,c(a)?c(a).height/k()*v():0),N(f,(function(){var S="";d()!==null&&(S+=d());var b=v();return b===1?S.length===0?"":S:(S===""||S.endsWith(";")||(S+="; "),"".concat(S,"font-size: ").concat(b,"em"))})()),N(m,c(a)?"0 0 ".concat(c(a).width," ").concat(c(a).height):"0 0 ".concat(c(h)," ").concat(c(E)))}),Rn(),ni(),(function(S,b){var x=L5(b,["children","$$slots","$$events","$$legacy"]),F=L5(x,["class","width","height","box","spin","inverse","pulse","flip","style","label"]),z=L(b,"class",8,""),P=L(b,"width",8),Z=L(b,"height",8),tA=L(b,"box",8,"0 0 0 0"),W=L(b,"spin",8,!1),BA=L(b,"inverse",8,!1),X=L(b,"pulse",8,!1),iA=L(b,"flip",8,"none"),AA=L(b,"style",8,""),IA=L(b,"label",8,""),aA=HmA();AD(aA,()=>{var rA;return Me(Me({version:"1.1",class:"fa-icon ".concat((rA=z())!==null&&rA!==void 0?rA:""),width:P(),height:Z(),"aria-label":IA(),role:IA()?"img":"presentation",viewBox:tA(),style:AA()},F),{},{[uh]:{"fa-spin":W(),"fa-pulse":X(),"fa-inverse":BA(),"fa-flip-horizontal":iA()==="horizontal","fa-flip-vertical":iA()==="vertical"}})},void 0,void 0,void 0,"svelte-v67cny"),Ia(dA(aA),b,"default",{},null),CA(S,aA)})(t,DI({get label(){return I()},get width(){return c(h)},get height(){return c(E)},get box(){return c(m)},get style(){return c(f)},get spin(){return s()},get flip(){return C()},get inverse(){return l()},get pulse(){return g()},get class(){return n()}},()=>i,{children:(S,b)=>{var x=Fi();Ia(et(x),e,"default",{},F=>{var z=jmA(),P=et(z);da(P,1,()=>(c(a),wA(()=>{var BA;return((BA=c(a))===null||BA===void 0?void 0:BA.paths)||[]})),ka,(BA,X)=>{var iA=zmA();AD(iA,()=>Me({},c(X))),CA(BA,iA)});var Z=_A(P);da(Z,1,()=>(c(a),wA(()=>{var BA;return((BA=c(a))===null||BA===void 0?void 0:BA.polygons)||[]})),ka,(BA,X)=>{var iA=PmA();AD(iA,()=>Me({},c(X))),CA(BA,iA)});var tA=_A(Z),W=BA=>{YmA(BA,{get data(){return c(a)},set data(X){N(a,X)},$$legacy:!0})};jA(tA,BA=>{c(a),wA(()=>{var X;return(X=c(a))===null||X===void 0?void 0:X.raw})&&BA(W)}),CA(F,z)}),CA(S,x)},$$slots:{default:!0}})),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-boolean-toggle.svelte-eli4ob { - padding: 0; - margin: 1px 0 0; - vertical-align: top; - display: inline-flex; - color: var(--jse-value-color-boolean, #ff8c00); -} - -.jse-boolean-toggle.svelte-eli4ob:not(.jse-readonly) { - cursor: pointer; -}`);var qmA=JA('
          ');function VmA(t,e){Nt(e,!1);var A=L(e,"path",9),i=L(e,"value",9),n=L(e,"readOnly",9),o=L(e,"onPatch",9),a=L(e,"focus",9);ni(!0);var r,s=qmA(),l=dA(s),g=it(()=>i()===!0?j9:q9);tn(l,{get data(){return c(g)}}),Se(()=>{_n(s,"aria-checked",i()===!0),r=ii(s,1,"jse-boolean-toggle svelte-eli4ob",null,r,{"jse-readonly":n()}),_n(s,"title",n()?"Boolean value ".concat(i()):"Click to toggle this boolean value")}),fe("mousedown",s,function(C){C.stopPropagation(),n()||(o()([{op:"replace",path:vt(A()),value:!i()}]),a()())}),CA(t,s),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup, -.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup .picker_arrow::before, -.jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup .picker_arrow::after { - background: var(--jse-color-picker-background, var(--jse-panel-background, #ebebeb)); - line-height: normal; -} -.jse-color-picker-popup.svelte-v77py2 .picker_slider, -.jse-color-picker-popup.svelte-v77py2 .picker_sl, -.jse-color-picker-popup.svelte-v77py2 .picker_editor input, -.jse-color-picker-popup.svelte-v77py2 .picker_sample, -.jse-color-picker-popup.svelte-v77py2 .picker_done button { - box-shadow: var(--jse-color-picker-border-box-shadow, #cbcbcb 0 0 0 1px); -} -.jse-color-picker-popup.svelte-v77py2 .picker_editor input { - background: var(--jse-background-color, #fff); - color: var(--jse-text-color, #4d4d4d); -} -.jse-color-picker-popup.svelte-v77py2 .picker_done button { - background: var(--jse-button-background, #e0e0e0); - color: var(--jse-button-color, var(--jse-text-color, #4d4d4d)); -} -.jse-color-picker-popup.svelte-v77py2 .picker_done button:hover { - background: var(--jse-button-background-highlight, #e7e7e7); -}`);var WmA=JA('
          ');function ZmA(t,e){Nt(e,!1);var A=L(e,"color",8),i=L(e,"onChange",8),n=L(e,"showOnTop",8),o=EA(),a=()=>{};As(zt(function*(){var s,l=new((s=yield import("./chunk-GLGRLUIJ.js"))===null||s===void 0?void 0:s.default)({parent:c(o),color:A(),popup:n()?"top":"bottom",onDone(g){var C=g.rgba[3]===1?g.hex.substring(0,7):g.hex;i()(C)}});l.show(),a=()=>{l.destroy()}})),Dg(()=>{a()}),ni();var r=WmA();Oo(r,s=>N(o,s),()=>c(o)),CA(t,r),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-color-picker-button.svelte-13mgyo6 { - font-size: var(--jse-font-size-mono, 14px); - width: var(--jse-color-picker-button-size, 1em); - height: var(--jse-color-picker-button-size, 1em); - box-sizing: border-box; - padding: 0; - margin: 2px 0 0 calc(0.5 * var(--jse-padding, 10px)); - display: inline-flex; - vertical-align: top; - border: 1px solid var(--jse-text-color, #4d4d4d); - border-radius: 2px; - background: inherit; - outline: none; -} - -.jse-color-picker-button.svelte-13mgyo6:not(.jse-readonly) { - cursor: pointer; -}`);var XmA=JA('');function $mA(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),{openAbsolutePopup:n}=kI("absolute-popup"),o=L(e,"path",9),a=L(e,"value",9),r=L(e,"readOnly",9),s=L(e,"onPatch",9),l=L(e,"focus",9);function g(h){s()([{op:"replace",path:vt(o()),value:h}]),C()}function C(){l()()}KA(()=>K(a()),()=>{N(A,HX(a()))}),KA(()=>(K(r()),K(a())),()=>{N(i,r()?"Color ".concat(a()):"Click to open a color picker")}),Rn(),ni(!0);var I,d=XmA();Se(()=>{var h;I=ii(d,1,"jse-color-picker-button svelte-13mgyo6",null,I,{"jse-readonly":r()}),mg(d,"background: ".concat((h=c(A))!==null&&h!==void 0?h:"")),_n(d,"title",c(i)),_n(d,"aria-label",c(i))}),fe("click",d,function(h){var E,f;if(!r()){var m=h.target,v=m.getBoundingClientRect().top,k=((E=(f=Xf(m))===null||f===void 0?void 0:f.innerHeight)!==null&&E!==void 0?E:0)-v<300&&v>300,S={color:a(),onChange:g,showOnTop:k};n(ZmA,S,{anchor:m,closeOnOuterClick:!0,onClose:C,offsetTop:18,offsetLeft:-8,height:300})}}),CA(t,d),Ft()}var M_=1e3,Ff=100,U5=100,cD=2e4,kh=[{start:0,end:Ff}],A6A=1048576,e6A=1048576,S_=10485760,k_="Insert or paste contents, enter [ insert a new array, enter { to insert a new object, or start typing to insert a new value",LR="Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)",rd="hover-insert-inside",T5="hover-insert-after",$W="hover-collection",x_="valid",AZ="repairable",kC=336,xC=260,vf=100,eZ={[ug.asc]:"ascending",[ug.desc]:"descending"};function n$(t){for(var e=J9(t,r=>r.start),A=[e[0]],i=0;i0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"array",expanded:t,visibleSections:kh,items:[]}}function UR(){var{expanded:t}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"object",expanded:t,properties:{}}}var TR={createObjectDocumentState:UR,createArrayDocumentState:KR,createValueDocumentState:function(){return{type:"value"}}};function a$(t,e,A,i){var{createObjectDocumentState:n,createArrayDocumentState:o,createValueDocumentState:a}=i;return(function r(s,l,g){if(Array.isArray(s)){var C=ir(l)?l:o();if(g.length===0)return C;var I=Rr(g[0]),d=r(s[I],C.items[I],g.slice(1));return Hr(C,["items",g[0]],d)}if(Mn(s)){var h=Cl(l)?l:n();if(g.length===0)return h;var E=g[0],f=r(s[E],h.properties[E],g.slice(1));return Hr(h,["properties",E],f)}return GR(l)?l:a()})(t,e,A)}function Ul(t,e){return Lf(t,e,arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],(A,i)=>{if(A!==void 0&&i!==void 0)return Array.isArray(A)?ir(i)?i:KR({expanded:!!yd(i)&&i.expanded}):Mn(A)?Cl(i)?i:UR({expanded:!!yd(i)&&i.expanded}):GR(i)?i:void 0},()=>!0)}function Lf(t,e,A,i,n){var o=i(t,e,A);if(Array.isArray(t)&&ir(o)&&n(o)){var a=[];return JR(t,o.visibleSections,s=>{var l=A.concat(String(s)),g=Lf(t[s],o.items[s],l,i,n);g!==void 0&&(a[s]=g)}),PW(a,o.items)?o:Me(Me({},o),{},{items:a})}if(Mn(t)&&Cl(o)&&n(o)){var r={};return Object.keys(t).forEach(s=>{var l=A.concat(s),g=Lf(t[s],o.properties[s],l,i,n);g!==void 0&&(r[s]=g)}),PW(Object.values(r),Object.values(o.properties))?o:Me(Me({},o),{},{properties:r})}return o}function JR(t,e,A){e.forEach(i=>{var{start:n,end:o}=i;zX(n,Math.min(t.length,o),A)})}function Gf(t,e){for(var A=t,i=[],n=0;n{var C=yd(g)&&!g.expanded?Me(Me({},g),{},{expanded:!0}):g;return ir(C)?(function(I,d){if((function(f,m){return f.some(v=>m>=v.start&&m(function(l,g,C,I){return Lf(l,g,C,(d,h,E)=>Array.isArray(d)&&I(E)?ir(h)?h.expanded?h:Me(Me({},h),{},{expanded:!0}):KR({expanded:!0}):Mn(d)&&I(E)?Cl(h)?h.expanded?h:Me(Me({},h),{},{expanded:!0}):UR({expanded:!0}):h,d=>yd(d)&&d.expanded)})(r,s,[],i))}function sZ(t,e,A,i){return Oh(t,e,A,(n,o)=>i?(function(a,r,s){return Lf(a,r,s,(l,g)=>lZ(g),()=>!0)})(n,o,A):lZ(o))}function lZ(t){return ir(t)&&t.expanded?Me(Me({},t),{},{expanded:!1,visibleSections:kh}):Cl(t)&&t.expanded?Me(Me({},t),{},{expanded:!1}):t}function r$(t,e,A){var i={json:t,documentState:e},n=A.reduce((o,a)=>({json:tl(o.json,[a]),documentState:a6A(o.json,o.documentState,a)}),i);return{json:n.json,documentState:Ul(n.json,n.documentState)}}function a6A(t,e,A){if(I9(A))return gZ(t,e,A,void 0);if(d9(A))return cZ(t,e,A);if($6(A)){var i=il(t,A.path),n=v0(t,e,i);return n?_D(t,e,i,{type:"value",enforceString:n}):e}return A8(A)||b2(A)?(function(o,a,r){if(b2(r)&&r.from===r.path)return a;var s=a,l=il(o,r.from),g=m0(o,s,l);return b2(r)&&(s=cZ(o,s,{path:r.from})),s=gZ(o,s,{path:r.path},g),s})(t,e,A):e}function m0(t,e,A){try{return Xe(e,Gf(t,A))}catch(i){return}}function OR(t,e,A,i,n){var o=a$(t,e,A,n);return a4(o,Gf(t,A),a=>{var r=Xe(t,A);return i(r,a)})}function _D(t,e,A,i){return(function(n,o,a,r,s){var l=a$(n,o,a,s);return Hr(l,Gf(n,a),r)})(t,e,A,i,TR)}function Oh(t,e,A,i){return OR(t,e,A,i,TR)}function gZ(t,e,A,i){var n=il(t,A.path),o=e;return o=Oh(t,o,Yi(n),(a,r)=>{if(!ir(r))return r;var s=Rr(ki(n)),{items:l,visibleSections:g}=r;return Me(Me({},r),{},{items:s{if(!ir(r))return r;var s=Rr(ki(i)),{items:l,visibleSections:g}=r;return Me(Me({},r),{},{items:l.slice(0,s).concat(l.slice(s+1)),visibleSections:s$(g,s,-1)})}):(function(a,r,s){var l=Gf(a,s);return vr(r,l)?x1(r,Gf(a,s)):r})(t,e,i)}function s$(t,e,A){return(function(i){for(var n=i.slice(0),o=1;o({start:i.start>e?i.start+A:i.start,end:i.end>e?i.end+A:i.end})))}function v0(t,e,A){var i,n=Xe(t,A),o=m0(t,e,A),a=GR(o)?o.enforceString:void 0;return typeof a=="boolean"?a:typeof(i=n)=="string"&&typeof $h(i,JSON)!="string"}function A3(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=t.indexOf(e);return i!==-1?A?t.slice(i):t.slice(i+1):[]}function YR(t,e){var A=[];return(function i(n,o,a){A.push(a),Vo(n)&&ir(o)&&o.expanded&&JR(n,o.visibleSections,r=>{i(n[r],o.items[r],a.concat(String(r)))}),ia(n)&&Cl(o)&&o.expanded&&Object.keys(n).forEach(r=>{i(n[r],o.properties[r],a.concat(r))})})(t,e,[]),A}function l$(t,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],i=[];return(function n(o,a){i.push({path:a,type:Ec.value});var r=m0(t,e,a);if(o&&yd(r)&&r.expanded){if(A&&i.push({path:a,type:Ec.inside}),Vo(o)){var s=ir(r)?r.visibleSections:kh;JR(o,s,l=>{var g=a.concat(String(l));n(o[l],g),A&&i.push({path:g,type:Ec.after})})}ia(o)&&Object.keys(o).forEach(l=>{var g=a.concat(l);i.push({path:g,type:Ec.key}),n(o[l],g),A&&i.push({path:g,type:Ec.after})})}})(t,[]),i}function __(t,e,A){var i=YR(t,e),n=i.map(vt).indexOf(vt(A));if(n!==-1&&n3&&arguments[3]!==void 0?arguments[3]:10240;return Bc(t,e,A,DmA({json:Xe(t,A)},i)?bf:HR)}function R_(t,e,A){var i=m0(t,e,A);return yd(i)&&i.expanded?e:vd(t,e,A)}function bf(t){return t.length===0||t.length===1&&t[0]==="0"}function aR(t){return t.length===0}function HR(){return!0}function tD(){return!1}function dl(t){return t&&t.type===oo.after||!1}function Va(t){return t&&t.type===oo.inside||!1}function nr(t){return t&&t.type===oo.key||!1}function En(t){return t&&t.type===oo.value||!1}function Co(t){return t&&t.type===oo.multi||!1}function RD(t){return Co(t)&&Mi(t.focusPath,t.anchorPath)}function Kf(t){return Co(t)||dl(t)||Va(t)||nr(t)||En(t)}function N_(t){return t&&t.type===oo.text||!1}function MI(t,e){var A=[];return(function(i,n,o){if(n){var a=hd(n),r=It(n);if(Mi(a,r))return o(a);if(i!==void 0){var s=c$(a,r);if(a.length===s.length||r.length===s.length)return o(s);var l=fs(a,r),g=_C(i,l),C=vI(i,l),I=GC(i,l,g),d=GC(i,l,C);if(!(I===-1||d===-1)){var h=Xe(i,s);if(ia(h)){for(var E=Object.keys(h),f=I;f<=d;f++){var m=o(s.concat(E[f]));if(m!==void 0)return m}return}if(Vo(h)){for(var v=I;v<=d;v++){var k=o(s.concat(String(v)));if(k!==void 0)return k}return}throw new Error("Failed to create selection")}}}})(t,e,i=>{A.push(i)}),A}function g$(t){return Va(t)?t.path:Yi(It(t))}function _C(t,e){if(!Co(e))return e.path;var A=GC(t,e,e.anchorPath);return GC(t,e,e.focusPath)A?e.focusPath:e.anchorPath}function CZ(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(A){var n=i?It(A):_C(t,A),o=(function(s,l,g){var C=YR(s,l),I=C.map(vt),d=vt(g),h=I.indexOf(d);if(h!==-1&&h>0)return C[h-1]})(t,e,n);if(i)return Va(A)||dl(A)?o!==void 0?fs(n,n):void 0:o!==void 0?fs(hd(A),o):void 0;if(dl(A)||Va(A))return Hi(n);if(nr(A)){if(o===void 0||o.length===0)return;var a=Yi(o),r=Xe(t,a);return Array.isArray(r)||en(o)?Hi(o):JC(o)}return En(A),o!==void 0?Hi(o):void 0}}function IZ(t,e,A,i){if(!A)return{caret:void 0,previous:void 0,next:void 0};var n=l$(t,e,i),o=n.findIndex(a=>Mi(a.path,It(A))&&String(a.type)===String(A.type));return{caret:o!==-1?n[o]:void 0,previous:o!==-1&&o>0?n[o-1]:void 0,next:o!==-1&&oA[i].length;)i++;var n=A[i];return n===void 0||n.length===0||Array.isArray(Xe(t,Yi(n)))?Hi(n):JC(n)}function Yh(t,e){if(e.length===1){var A=lg(e);if(A.op==="replace")return Hi(il(t,A.path))}if(!en(e)&&e.every(a=>a.op==="move")){var i=lg(e),n=e.slice(1);if((A8(i)||b2(i))&&i.from!==i.path&&n.every(a=>(A8(a)||b2(a))&&a.from===a.path))return JC(il(t,i.path))}var o=e.filter(a=>a.op!=="test"&&a.op!=="remove"&&(a.op!=="move"||a.from!==a.path)&&typeof a.path=="string").map(a=>il(t,a.path));if(!en(o))return{type:oo.multi,anchorPath:lg(o),focusPath:ki(o)}}function c$(t,e){for(var A=0;AA.length&&e.length>A.length;return{type:oo.multi,anchorPath:i?A.concat(t[A.length]):A,focusPath:i?A.concat(e[A.length]):A}}function C$(t,e,A,i){if(nr(e))return String(ki(e.path));if(En(e)){var n=Xe(t,e.path);return typeof n=="string"?n:i.stringify(n,null,A)}if(Co(e)){if(en(e.focusPath))return i.stringify(t,null,A);var o=g$(e),a=Xe(t,o);if(Array.isArray(a)){if(RD(e)){var r=Xe(t,e.focusPath);return i.stringify(r,null,A)}return MI(t,e).map(s=>{var l=Xe(t,s);return"".concat(i.stringify(l,null,A),",")}).join(` -`)}return MI(t,e).map(s=>{var l=ki(s),g=Xe(t,s);return"".concat(i.stringify(l),": ").concat(i.stringify(g,null,A),",")}).join(` -`)}}function tr(t){return(nr(t)||En(t))&&t.edit===!0}function Dh(t){return nr(t)||En(t)||Co(t)}function J5(t){return nr(t)||En(t)||RD(t)}function rR(t){switch(t.type){case Ec.key:return JC(t.path);case Ec.value:return Hi(t.path);case Ec.after:return LC(t.path);case Ec.inside:return OC(t.path)}}function BZ(t,e){switch(t){case oo.key:return JC(e);case oo.value:return Hi(e);case oo.after:return LC(e);case oo.inside:return OC(e);case oo.multi:case oo.text:return fs(e,e)}}function O5(t,e,A){if(e)return Uf(t,e,A)||k0(Co(e)?Yi(e.focusPath):e.path,A)?e:void 0}function Uf(t,e,A){if(t===void 0||!e)return!1;if(nr(e)||Va(e)||dl(e))return Mi(e.path,A);if(En(e))return k0(A,e.path);if(Co(e)){var i=_C(t,e),n=vI(t,e),o=Yi(e.focusPath);if(!k0(A,o)||A.length<=o.length)return!1;var a=GC(t,e,i),r=GC(t,e,n),s=GC(t,e,A);return s!==-1&&s>=a&&s<=r}return!1}function GC(t,e,A){var i=Yi(e.focusPath);if(!k0(A,i)||A.length<=i.length)return-1;var n=A[i.length],o=Xe(t,i);if(ia(o))return Object.keys(o).indexOf(n);if(Vo(o)){var a=Rr(n);if(a');function d$(t,e){Nt(e,!1);var A=or("jsoneditor:EditableDiv"),i=L(e,"value",9),n=L(e,"initialValue",9),o=L(e,"shortText",9,!1),a=L(e,"label",9),r=L(e,"onChange",9),s=L(e,"onCancel",9),l=L(e,"onFind",9),g=L(e,"onPaste",9,ma),C=L(e,"onValueClass",9,()=>""),I=EA(void 0,!0),d=EA(void 0,!0),h=!1;function E(){return c(I)?(function(v){return v.replace(/\n$/,"")})(c(I).innerText):""}function f(v){c(I)&&Tl(I,c(I).innerText=Jh(v))}As(()=>{A("onMount",{value:i(),initialValue:n()}),f(n()!==void 0?n():i()),c(I)&&(function(v){if(v.firstChild!=null){var k=document.createRange(),S=window.getSelection();k.setStart(v,1),k.collapse(!0),S?.removeAllRanges(),S?.addRange(k)}else v.focus()})(c(I))}),Dg(()=>{var v=E();A("onDestroy",{closed:h,value:i(),newValue:v}),h||v===i()||r()(v,yI.no)}),KA(()=>(K(C()),K(i())),()=>{N(d,C()(i()))}),Rn(),ni(!0);var m=r6A();Oo(m,v=>N(I,v),()=>c(I)),Se(v=>{_n(m,"aria-label",a()),ii(m,1,v,"svelte-1r0oryi")},[()=>bI((K(wc),c(d),K(o()),wA(()=>wc("jse-editable-div",c(d),{"jse-short-text":o()}))))]),fe("input",m,function(){var v=E();v===""&&f(""),N(d,C()(v))}),fe("keydown",m,function(v){v.stopPropagation();var k=TC(v);if(k==="Escape"&&(v.preventDefault(),h=!0,s()()),k==="Enter"||k==="Tab"){v.preventDefault(),h=!0;var S=E();r()(S,yI.nextInside)}k==="Ctrl+F"&&(v.preventDefault(),l()(!1)),k==="Ctrl+H"&&(v.preventDefault(),l()(!0))}),fe("paste",m,function(v){if(v.stopPropagation(),g()&&v.clipboardData){var k=v.clipboardData.getData("text/plain");g()(k)}}),fe("blur",m,function(){var v=document.hasFocus(),k=E();A("handleBlur",{hasFocus:v,closed:h,value:i(),newValue:k}),document.hasFocus()&&!h&&(h=!0,k!==i()&&r()(k,yI.self))}),CA(t,m),Ft()}function s6A(t,e){Nt(e,!1);var A=L(e,"path",9),i=L(e,"value",9),n=L(e,"selection",9),o=L(e,"mode",9),a=L(e,"parser",9),r=L(e,"normalization",9),s=L(e,"enforceString",9),l=L(e,"onPatch",9),g=L(e,"onPasteJson",9),C=L(e,"onSelect",9),I=L(e,"onFind",9),d=L(e,"focus",9),h=L(e,"findNextInside",9);function E(k){return s()?k:$h(k,a())}function f(){C()(Hi(A())),d()()}ni(!0);var m=it(()=>(K(r()),K(i()),wA(()=>r().escapeValue(i())))),v=it(()=>(K(tr),K(n()),wA(()=>tr(n())?n().initialValue:void 0)));d$(t,{get value(){return c(m)},get initialValue(){return c(v)},label:"Edit value",onChange:function(k,S){l()([{op:"replace",path:vt(A()),value:E(r().unescapeValue(k))}],(b,x,F)=>{if(!F||Mi(A(),It(F)))return{state:x,selection:S===yI.nextInside?h()(A()):Hi(A())}}),d()()},onCancel:f,onPaste:function(k){try{var S=a().parse(k);aa(S)&&g()({path:A(),contents:S,onPasteAsJson:()=>{f();var b=[{op:"replace",path:vt(A()),value:S}];l()(b,(x,F)=>({state:vd(x,F,A())}))}})}catch(b){}},get onFind(){return I()},onValueClass:function(k){return I$(E(r().unescapeValue(k)),o(),a())}}),Ft()}function yh(t,e,A){var i=Yi(e),n=Xe(t,i);if(Vo(n)){var o=Rr(ki(e));return A.map((l,g)=>({op:"add",path:vt(i.concat(String(o+g))),value:l.value}))}if(ia(n)){var a=ki(e),r=Object.keys(n),s=a!==void 0?A3(r,a,!0):[];return[...A.map(l=>{var g=$f(l.key,r);return{op:"add",path:vt(i.concat(g)),value:l.value}}),...s.map(l=>SI(i,l))]}throw new Error("Cannot create insert operations: parent must be an Object or Array")}function sR(t,e,A){var i=Xe(t,e);if(Array.isArray(i)){var n=i.length;return A.map((o,a)=>({op:"add",path:vt(e.concat(String(n+a))),value:o.value}))}return A.map(o=>{var a=$f(o.key,Object.keys(i));return{op:"add",path:vt(e.concat(a)),value:o.value}})}function e3(t,e,A,i){var n=e.filter(r=>r!==A),o=$f(i,n),a=A3(e,A,!1);return[{op:"move",from:vt(t.concat(A)),path:vt(t.concat(o))},...a.map(r=>SI(t,r))]}function B$(t,e){var A=ki(e);if(en(A))throw new Error("Cannot duplicate root object");var i=Yi(A),n=ki(A),o=Xe(t,i);if(Vo(o)){var a=ki(e),r=a?Rr(ki(a))+1:0;return[...e.map((g,C)=>({op:"copy",from:vt(g),path:vt(i.concat(String(C+r)))}))]}if(ia(o)){var s=Object.keys(o),l=n!==void 0?A3(s,n,!1):[];return[...e.map(g=>{var C=$f(ki(g),s);return{op:"copy",from:vt(g),path:vt(i.concat(C))}}),...l.map(g=>SI(i,g))]}throw new Error("Cannot create duplicate operations: parent must be an Object or Array")}function E$(t,e){if(En(e))return[{op:"move",from:vt(e.path),path:""}];if(!Co(e))throw new Error("Cannot create extract operations: parent must be an Object or Array");var A=Yi(e.focusPath),i=Xe(t,A);if(Vo(i)){var n=MI(t,e).map(a=>{var r=Rr(ki(a));return i[r]});return[{op:"replace",path:"",value:n}]}if(ia(i)){var o={};return MI(t,e).forEach(a=>{var r=String(ki(a));o[r]=i[r]}),[{op:"replace",path:"",value:o}]}throw new Error("Cannot extract: unsupported type of selection "+JSON.stringify(e))}function h$(t,e,A,i){if(nr(e)){var n=PX(A,i),o=Yi(e.path),a=Xe(t,o);return e3(o,Object.keys(a),ki(e.path),typeof n=="string"?n:A)}if(En(e)||Co(e)&&en(e.focusPath))try{return[{op:"replace",path:vt(It(e)),value:Zf(A,x=>Wf(x,i))}]}catch(x){return[{op:"replace",path:vt(It(e)),value:A}]}if(Co(e)){var r=F_(A,i);return(function(x,F,z){var P=lg(F),Z=Yi(P),tA=Xe(x,Z);if(Vo(tA)){var W=lg(F),BA=W?Rr(ki(W)):0;return[...ED(F),...z.map((UA,$A)=>({op:"add",path:vt(Z.concat(String($A+BA))),value:UA.value}))]}if(ia(tA)){var X=ki(F),iA=Yi(X),AA=ki(X),IA=Object.keys(tA),aA=AA!==void 0?A3(IA,AA,!1):[],rA=new Set(F.map(UA=>ki(UA))),uA=IA.filter(UA=>!rA.has(UA));return[...ED(F),...z.map(UA=>{var $A=$f(UA.key,uA);return{op:"add",path:vt(iA.concat($A)),value:UA.value}}),...aA.map(UA=>SI(iA,UA))]}throw new Error("Cannot create replace operations: parent must be an Object or Array")})(t,MI(t,e),r)}if(dl(e)){var s=F_(A,i),l=e.path,g=Yi(l),C=Xe(t,g);if(Vo(C)){var I=Rr(ki(l));return yh(t,g.concat(String(I+1)),s)}if(ia(C)){var d=String(ki(l)),h=Object.keys(C);if(en(h)||ki(h)===d)return sR(t,g,s);var E=h.indexOf(d),f=h[E+1];return yh(t,g.concat(f),s)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}if(Va(e)){var m=F_(A,i),v=e.path,k=Xe(t,v);if(Vo(k))return yh(t,v.concat("0"),m);if(ia(k)){var S=Object.keys(k);if(en(S))return sR(t,v,m);var b=lg(S);return yh(t,v.concat(b),m)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}throw new Error("Cannot insert: unsupported type of selection "+JSON.stringify(e))}function ED(t){return t.map(e=>({op:"remove",path:vt(e)})).reverse()}function SI(t,e){return{op:"move",from:vt(t.concat(e)),path:vt(t.concat(e))}}function F_(t,e){var A=/^\s*{/.test(t),i=/^\s*\[/.test(t),n=PX(t,e),o=n!==void 0?n:Zf(t,a=>Wf(a,e));return A&&Mn(o)||i&&Array.isArray(o)?[{key:"New item",value:o}]:Array.isArray(o)?o.map((a,r)=>({key:"New item "+r,value:a})):Mn(o)?Object.keys(o).map(a=>({key:a,value:o[a]})):[{key:"New item",value:o}]}function Q$(t,e){if(nr(e)){var A=Yi(e.path),i=Xe(t,A),n=e3(A,Object.keys(i),ki(e.path),"");return{operations:n,newSelection:Yh(t,n)}}if(En(e))return{operations:[{op:"replace",path:vt(e.path),value:""}],newSelection:e};if(Co(e)){var o=MI(t,e),a=ED(o),r=ki(o);if(en(r))return{operations:[{op:"replace",path:"",value:""}],newSelection:Hi([])};var s=Yi(r),l=Xe(t,s);if(Vo(l)){var g=lg(o),C=Rr(ki(g));return{operations:a,newSelection:C===0?OC(s):LC(s.concat(String(C-1)))}}if(ia(l)){var I=Object.keys(l),d=lg(o),h=ki(d),E=I.indexOf(h),f=I[E-1];return{operations:a,newSelection:E===0?OC(s):LC(s.concat(f))}}throw new Error("Cannot create remove operations: parent must be an Object or Array")}throw new Error("Cannot remove: unsupported type of selection "+JSON.stringify(e))}function u$(t,e){var A=(function(i,n){if(en(n)||!n.every(b2))return n;var o=[];for(var a of n){var r=EZ(Es(a.from)),s=EZ(Es(a.path));if(!r||!s)return n;o.push({from:r,path:s,operation:a})}var l=o[0].path.parent,g=Xe(i,l);if(!ia(g)||!o.every(h=>(function(E,f){return Mi(E.from.parent,f)&&Mi(E.path.parent,f)})(h,l)))return n;var C=(function(h,E){var f=Object.keys(E),m=f.slice();for(var v of h){var k=m.indexOf(v.from.key);k!==-1&&(m.splice(k,1),m.push(v.path.key))}for(var S=0;Sh.operation,d=o.filter(h=>h.operation.from!==h.operation.path);return d.some(h=>h.path.key===C)?d.map(I):[SI(l,C),...d.map(I)]})(t,e);return e8(t,A,{before:(i,n,o)=>{if(d9(n)){var a=Es(n.path);return{revertOperations:[...o,...L_(i,a)]}}if(b2(n)){var r=Es(n.from);return{revertOperations:n.from===n.path?[n,...L_(i,r)]:[...o,...L_(i,r)]}}return{document:i}}})}function EZ(t){return t.length>0?{parent:Yi(t),key:ki(t)}:void 0}function L_(t,e){var A=Yi(e),i=ki(e),n=Xe(t,A);return ia(n)?A3(Object.keys(n),i,!1).map(o=>SI(A,o)):[]}function hZ(t){var e=t.activeIndex0?0:-1,A=t.items[e],i=t.items.map((n,o)=>Me(Me({},n),{},{active:o===e}));return Me(Me({},t),{},{items:i,activeItem:A,activeIndex:e})}function QZ(t,e){var A,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=t.toLowerCase(),o=(A=i?.maxResults)!==null&&A!==void 0?A:1/0,a=i?.columns,r=[],s=[];function l(f){r.length>=o||r.push(f)}function g(f,m){if(Vo(m)){var v=s.length;s.push("0");for(var k=0;k=o)return;s.pop()}else if(ia(m)){var S=Object.keys(m),b=s.length;for(var x of(s.push(""),S))if(s[b]=x,uZ(x,f,s,Qc.key,l),g(f,m[x]),r.length>=o)return;s.pop()}else uZ(String(m),f,s,Qc.value,l)}if(t==="")return[];if(a){if(!Array.isArray(e))throw new Error("json must be an Array when option columns is defined");for(var C=0;Ch.length+1;)s.pop();g(n,Xe(I,h))}if(r.length>=o)break}return r}return g(n,e),r}function uZ(t,e,A,i,n){var o=t.toLowerCase(),a=0,r=-1,s=-1;do(s=o.indexOf(e,r))!==-1&&(r=s+e.length,n({path:A.slice(0),field:i,fieldIndex:a,start:s,end:r}),a++);while(s!==-1)}function lR(t,e,A,i){return t.substring(0,A)+e+t.substring(i)}function fZ(t,e,A){var i=t;return L9(A,n=>{i=lR(i,e,n.start,n.end)}),i}function l6A(t,e,A,i,n){var{field:o,path:a,start:r,end:s}=i;if(o===Qc.key){var l=Yi(a),g=Xe(t,l),C=ki(a),I=e3(l,Object.keys(g),C,lR(C,A,r,s));return{newSelection:Yh(t,I),operations:I}}if(o===Qc.value){var d=Xe(t,a);if(d===void 0)throw new Error("Cannot replace: path not found ".concat(vt(a)));var h=typeof d=="string"?d:String(d),E=v0(t,e,a),f=lR(h,A,r,s),m=[{op:"replace",path:vt(a),value:E?f:$h(f,n)}];return{newSelection:Yh(t,m),operations:m}}throw new Error("Cannot replace: unknown type of search result field ".concat(o))}function pZ(t){return t.path.concat(t.field,String(t.fieldIndex))}function mZ(t){var e=o$(t)?t.searchResults.filter(A=>A.field===Qc.key):void 0;return e&&e.length>0?e:void 0}function wZ(t){var e=o$(t)?t.searchResults.filter(A=>A.field===Qc.value):void 0;return e&&e.length>0?e:void 0}var g6A={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function f$(t,e){return e.reduce((A,i)=>(function(n,o,a,r){return OR(n,o,a,r,g6A)})(t,A,i.path,(n,o)=>Me(Me({},o),{},{searchResults:o.searchResults?o.searchResults.concat(i):[i]})),void 0)}function hD(t){var e,A=(e=t?.searchResults)!==null&&e!==void 0?e:[],i=Cl(t)?Object.values(t.properties).flatMap(hD):ir(t)?t.items.flatMap(hD):[];return A.concat(i)}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-highlight.svelte-19qyvy6 { - background-color: var(--jse-search-match-color, #ffe665); - outline: var(--jse-search-match-outline, none); -} -.jse-highlight.jse-active.svelte-19qyvy6 { - background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); - outline: var(--jse-search-match-outline, 2px solid #e0be00); -}`);var c6A=JA(" ");function p$(t,e){Nt(e,!1);var A=EA(),i=L(e,"text",8),n=L(e,"searchResultItems",8);KA(()=>(K(i()),K(n())),()=>{N(A,(function(a,r){var s=[],l=0;for(var g of r){var C=a.slice(l,g.start);C!==""&&s.push({resultIndex:void 0,type:"normal",text:C,active:!1});var I=a.slice(g.start,g.end);s.push({resultIndex:g.resultIndex,type:"highlight",text:I,active:g.active}),l=g.end}var d=ki(r);return d&&d.endc(A),ka,(a,r)=>{var s=Fi(),l=et(s),g=I=>{var d=dr();Se(()=>Lt(d,(c(r),wA(()=>c(r).text)))),CA(I,d)},C=I=>{var d,h=c6A(),E=dA(h);Se((f,m)=>{d=ii(h,1,"jse-highlight svelte-19qyvy6",null,d,{"jse-active":c(r).active}),_n(h,"data-search-result-index",f),Lt(E,m)},[()=>(c(r),wA(()=>String(c(r).resultIndex))),()=>(K(Jh),c(r),wA(()=>Jh(c(r).text)))]),CA(I,h)};jA(l,I=>{c(r),wA(()=>c(r).type==="normal")?I(g):I(C,!1)}),CA(a,s)}),CA(t,o),Ft()}function iD(t){var e=1e3;if(t<900)return t.toFixed()+" B";var A=t/e;if(A<900)return A.toFixed(1)+" KB";var i=A/e;if(i<900)return i.toFixed(1)+" MB";var n=i/e;return n<900?n.toFixed(1)+" GB":(n/e).toFixed(1)+" TB"}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-tag.svelte-ubve9r { - border: none; - font-size: 80%; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); - background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - border-radius: 2px; - cursor: pointer; - display: inline-block; - padding: 0 4px; - line-height: normal; - margin: 1px 0; -} -.jse-tag.svelte-ubve9r:hover { - opacity: 0.8; -} -.jse-tag.disabled.svelte-ubve9r { - opacity: 0.7; - cursor: inherit; -}`);var C6A=JA('');function nD(t,e){Nt(e,!0);var A,i=Il(()=>e.onclick?o=>{o.preventDefault(),o.stopPropagation(),e.onclick()}:void 0),n=C6A();n.__click=function(){for(var o,a=arguments.length,r=new Array(a),s=0;s2?r-2:0),l=2;l{var C,I=(C=a())!==null&&C!==void 0?C:null;g.ensure(I,I&&(d=>I(d,...s)))},ud)})(dA(n),()=>{var o;return(o=e.children)!==null&&o!==void 0?o:UpA}),Se(()=>A=ii(n,1,"jse-tag svelte-ubve9r",null,A,{disabled:!e.onclick})),CA(t,n),Ft()}Vf(["click"]);Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-value.jse-string.svelte-1saqp8c { - color: var(--jse-value-color-string, #008000); -} -.jse-value.jse-object.svelte-1saqp8c, .jse-value.jse-array.svelte-1saqp8c { - min-width: 16px; - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); -} -.jse-value.jse-number.svelte-1saqp8c { - color: var(--jse-value-color-number, #ee422e); -} -.jse-value.jse-boolean.svelte-1saqp8c { - color: var(--jse-value-color-boolean, #ff8c00); -} -.jse-value.jse-null.svelte-1saqp8c { - color: var(--jse-value-color-null, #004ed0); -} -.jse-value.jse-invalid.svelte-1saqp8c { - color: var(--jse-text-color, #4d4d4d); -} -.jse-value.jse-url.svelte-1saqp8c { - color: var(--jse-value-color-url, #008000); - text-decoration: underline; -} - -.jse-value.svelte-1saqp8c { - display: inline-block; - min-width: 2em; - padding: 0 5px; - box-sizing: border-box; - outline: none; - border-radius: 1px; - vertical-align: top; - word-break: normal; - overflow-wrap: anywhere; - white-space: pre-wrap; -} -.jse-value.jse-table-cell.svelte-1saqp8c { - overflow-wrap: normal; - white-space: nowrap; -} -.jse-value.jse-empty.svelte-1saqp8c { - min-width: 4em; - outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - -moz-outline-radius: 2px; -} -.jse-value.jse-empty.svelte-1saqp8c::after { - pointer-events: none; - color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - content: "value"; -}`);var I6A=JA('
          ');function d6A(t,e){Nt(e,!0);var A=DC(!0),i=Il(()=>c(A)&&typeof e.value=="string"&&e.value.length>e.truncateTextSize&&(!e.searchResultItems||!e.searchResultItems.some(d=>d.active&&d.end>e.truncateTextSize))),n=Il(()=>c(i)&&typeof e.value=="string"?e.value.substring(0,e.truncateTextSize).trim():e.value),o=Il(()=>xD(e.value));function a(){N(A,!1)}var r=I6A();r.__click=function(d){typeof e.value=="string"&&c(o)&&FR(d)&&(d.preventDefault(),d.stopPropagation(),window.open(e.value,"_blank"))},r.__dblclick=function(d){e.readOnly||(d.preventDefault(),e.onSelect(BD(e.path)))};var s=dA(r),l=d=>{var h=Il(()=>e.normalization.escapeValue(c(n)));p$(d,{get text(){return c(h)},get searchResultItems(){return e.searchResultItems}})},g=d=>{var h=dr();Se(E=>Lt(h,E),[()=>Jh(e.normalization.escapeValue(c(n)))]),CA(d,h)};jA(s,d=>{e.searchResultItems?d(l):d(g,!1)});var C=_A(s,2),I=d=>{nD(d,{onclick:a,children:(h,E)=>{var f=dr();Se(m=>Lt(f,"Show more (".concat(m??"",")")),[()=>iD(e.value.length)]),CA(h,f)},$$slots:{default:!0}})};jA(C,d=>{c(i)&&typeof e.value=="string"&&d(I)}),Se(d=>{ii(r,1,d,"svelte-1saqp8c"),_n(r,"title",c(o)?"Ctrl+Click or Ctrl+Enter to open url in new window":void 0)},[()=>bI(I$(e.value,e.mode,e.parser))]),CA(t,r),Ft()}Vf(["click","dblclick"]);Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-tooltip.svelte-brt1mq { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - line-height: normal; - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); - border-radius: 3px; - background: var(--jse-context-menu-background, #656565); - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); - white-space: nowrap; - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); -}`);var B6A=JA('
          ');function E6A(t,e){var A=L(e,"text",8),i=B6A(),n=dA(i);Se(()=>Lt(n,A())),CA(t,i)}function Hh(t,e){var A,{text:i,openAbsolutePopup:n,closeAbsolutePopup:o}=e;function a(){A=n(E6A,{text:i},{position:"top",width:10*i.length,offsetTop:3,anchor:t,closeOnOuterClick:!0})}function r(){o(A)}return t.addEventListener("mouseenter",a),t.addEventListener("mouseleave",r),{destroy(){t.removeEventListener("mouseenter",a),t.removeEventListener("mouseleave",r)}}}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-timestamp.svelte-1jcpman { - padding: 0; - margin: 0; - vertical-align: middle; - display: inline-flex; - color: var(--jse-value-color-number, #ee422e); -}`);var h6A=JA('
          ');function Q6A(t,e){Nt(e,!1);var A=EA(void 0,!0),i=kI("absolute-popup"),n=L(e,"value",9);KA(()=>K(n()),()=>{N(A,"Time: ".concat(new Date(n()).toString()))}),Rn(),ni(!0);var o=h6A();tn(dA(o),{get data(){return Iz}}),ms(o,(a,r)=>Hh?.(a,r),()=>Me({text:c(A)},i)),CA(t,o),Ft()}function u6A(t){var e=[];return!t.isEditing&&QmA(t.value)&&e.push({component:VmA,props:t}),!t.isEditing&&umA(t.value)&&e.push({component:$mA,props:t}),t.isEditing&&e.push({component:s6A,props:t}),t.isEditing||e.push({component:d6A,props:t}),!t.isEditing&&$_(t.value)&&e.push({component:Q6A,props:t}),e}function Bl(t){return t.map((e,A)=>p6A.test(e)?"["+e+"]":/[.[\]]/.test(e)||e===""?'["'+(function(i){return i.replace(/"/g,'\\"')})(e)+'"]':(A>0?".":"")+e).join("")}function f6A(t){for(var e=[],A=0;Ao==='"',!0)),n('"')):e.push(i(o=>o==="]")),n("]")):e.push(i(o=>o==="."||o==="["));function i(o){for(var a=arguments.length>1&&arguments[1]!==void 0&&arguments[1],r="";A({x:t,y:t}),D6A={left:"right",right:"left",bottom:"top",top:"bottom"},y6A={start:"end",end:"start"};function DZ(t,e,A){return Qd(t,QD(e,A))}function ND(t,e){return typeof t=="function"?t(e):t}function bd(t){return t.split("-")[0]}function FD(t){return t.split("-")[1]}function m$(t){return t==="x"?"y":"x"}function w$(t){return t==="y"?"height":"width"}var v6A=new Set(["top","bottom"]);function uI(t){return v6A.has(bd(t))?"y":"x"}function D$(t){return m$(uI(t))}function gR(t){return t.replace(/start|end/g,e=>y6A[e])}var yZ=["left","right"],vZ=["right","left"],b6A=["top","bottom"],M6A=["bottom","top"];function S6A(t,e,A,i){var n=FD(t),o=(function(a,r,s){switch(a){case"top":case"bottom":return s?r?vZ:yZ:r?yZ:vZ;case"left":case"right":return r?b6A:M6A;default:return[]}})(bd(t),A==="start",i);return n&&(o=o.map(a=>a+"-"+n),e&&(o=o.concat(o.map(gR)))),o}function H5(t){return t.replace(/left|right|bottom|top/g,e=>D6A[e])}function k6A(t){return typeof t!="number"?(function(e){return Me({top:0,right:0,bottom:0,left:0},e)})(t):{top:t,right:t,bottom:t,left:t}}function fD(t){var{x:e,y:A,width:i,height:n}=t;return{width:i,height:n,top:A,left:e,right:e+i,bottom:A+n,x:e,y:A}}function bZ(t,e,A){var i,{reference:n,floating:o}=t,a=uI(e),r=D$(e),s=w$(r),l=bd(e),g=a==="y",C=n.x+n.width/2-o.width/2,I=n.y+n.height/2-o.height/2,d=n[s]/2-o[s]/2;switch(l){case"top":i={x:C,y:n.y-o.height};break;case"bottom":i={x:C,y:n.y+n.height};break;case"right":i={x:n.x+n.width,y:I};break;case"left":i={x:n.x-o.width,y:I};break;default:i={x:n.x,y:n.y}}switch(FD(e)){case"start":i[r]-=d*(A&&g?-1:1);break;case"end":i[r]+=d*(A&&g?-1:1)}return i}var x6A=(function(){var t=zt(function*(e,A,i){for(var{placement:n="bottom",strategy:o="absolute",middleware:a=[],platform:r}=i,s=a.filter(Boolean),l=yield r.isRTL==null?void 0:r.isRTL(A),g=yield r.getElementRects({reference:e,floating:A,strategy:o}),{x:C,y:I}=bZ(g,n,l),d=n,h={},E=0,f=0;f"u")&&(t instanceof ShadowRoot||t instanceof Ol(t).ShadowRoot)}var R6A=new Set(["inline","contents"]);function Tf(t){var{overflow:e,overflowX:A,overflowY:i,display:n}=fc(t);return/auto|scroll|overlay|hidden|clip/.test(e+i+A)&&!R6A.has(n)}var N6A=new Set(["table","td","th"]);function F6A(t){return N6A.has(zh(t))}var L6A=[":popover-open",":modal"];function pD(t){return L6A.some(e=>{try{return t.matches(e)}catch(A){return!1}})}var G6A=["transform","translate","scale","rotate","perspective"],K6A=["transform","translate","scale","rotate","perspective","filter"],U6A=["paint","layout","strict","content"];function IR(t){var e=PR(),A=uc(t)?fc(t):t;return G6A.some(i=>!!A[i]&&A[i]!=="none")||!!A.containerType&&A.containerType!=="normal"||!e&&!!A.backdropFilter&&A.backdropFilter!=="none"||!e&&!!A.filter&&A.filter!=="none"||K6A.some(i=>(A.willChange||"").includes(i))||U6A.some(i=>(A.contain||"").includes(i))}function PR(){return!(typeof CSS>"u"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}var T6A=new Set(["html","body","#document"]);function xh(t){return T6A.has(zh(t))}function fc(t){return Ol(t).getComputedStyle(t)}function GD(t){return uc(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.scrollX,scrollTop:t.scrollY}}function fI(t){if(zh(t)==="html")return t;var e=t.assignedSlot||t.parentNode||MZ(t)&&t.host||_0(t);return MZ(e)?e.host:e}function b$(t){var e=fI(t);return xh(e)?t.ownerDocument?t.ownerDocument.body:t.body:R0(e)&&Tf(e)?e:b$(e)}function Jf(t,e,A){var i;e===void 0&&(e=[]),A===void 0&&(A=!0);var n=b$(t),o=n===((i=t.ownerDocument)==null?void 0:i.body),a=Ol(n);if(o){var r=dR(a);return e.concat(a,a.visualViewport||[],Tf(n)?n:[],r&&A?Jf(r):[])}return e.concat(n,Jf(n,[],A))}function dR(t){return t.parent&&Object.getPrototypeOf(t.parent)?t.frameElement:null}function M$(t){var e=fc(t),A=parseFloat(e.width)||0,i=parseFloat(e.height)||0,n=R0(t),o=n?t.offsetWidth:A,a=n?t.offsetHeight:i,r=uD(A)!==o||uD(i)!==a;return r&&(A=o,i=a),{width:A,height:i,$:r}}function jR(t){return uc(t)?t:t.contextElement}function _h(t){var e=jR(t);if(!R0(e))return x0(1);var A=e.getBoundingClientRect(),{width:i,height:n,$:o}=M$(e),a=(o?uD(A.width):A.width)/i,r=(o?uD(A.height):A.height)/n;return a&&Number.isFinite(a)||(a=1),r&&Number.isFinite(r)||(r=1),{x:a,y:r}}var J6A=x0(0);function S$(t){var e=Ol(t);return PR()&&e.visualViewport?{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}:J6A}function Md(t,e,A,i){e===void 0&&(e=!1),A===void 0&&(A=!1);var n=t.getBoundingClientRect(),o=jR(t),a=x0(1);e&&(i?uc(i)&&(a=_h(i)):a=_h(t));var r=(function(b,x,F){return x===void 0&&(x=!1),!(!F||x&&F!==Ol(b))&&x})(o,A,i)?S$(o):x0(0),s=(n.left+r.x)/a.x,l=(n.top+r.y)/a.y,g=n.width/a.x,C=n.height/a.y;if(o)for(var I=Ol(o),d=i&&uc(i)?Ol(i):i,h=I,E=dR(h);E&&i&&d!==h;){var f=_h(E),m=E.getBoundingClientRect(),v=fc(E),k=m.left+(E.clientLeft+parseFloat(v.paddingLeft))*f.x,S=m.top+(E.clientTop+parseFloat(v.paddingTop))*f.y;s*=f.x,l*=f.y,g*=f.x,C*=f.y,s+=k,l+=S,E=dR(h=Ol(E))}return fD({width:g,height:C,x:s,y:l})}function mD(t,e){var A=GD(t).scrollLeft;return e?e.left+A:Md(_0(t)).left+A}function k$(t,e){var A=t.getBoundingClientRect();return{x:A.left+e.scrollLeft-mD(t,A),y:A.top+e.scrollTop}}var O6A=new Set(["absolute","fixed"]);function SZ(t,e,A){var i;if(e==="viewport")i=(function(o,a){var r=Ol(o),s=_0(o),l=r.visualViewport,g=s.clientWidth,C=s.clientHeight,I=0,d=0;if(l){g=l.width,C=l.height;var h=PR();(!h||h&&a==="fixed")&&(I=l.offsetLeft,d=l.offsetTop)}var E=mD(s);if(E<=0){var f=s.ownerDocument,m=f.body,v=getComputedStyle(m),k=f.compatMode==="CSS1Compat"&&parseFloat(v.marginLeft)+parseFloat(v.marginRight)||0,S=Math.abs(s.clientWidth-m.clientWidth-k);S<=25&&(g-=S)}else E<=25&&(g+=E);return{width:g,height:C,x:I,y:d}})(t,A);else if(e==="document")i=(function(o){var a=_0(o),r=GD(o),s=o.ownerDocument.body,l=Qd(a.scrollWidth,a.clientWidth,s.scrollWidth,s.clientWidth),g=Qd(a.scrollHeight,a.clientHeight,s.scrollHeight,s.clientHeight),C=-r.scrollLeft+mD(o),I=-r.scrollTop;return fc(s).direction==="rtl"&&(C+=Qd(a.clientWidth,s.clientWidth)-l),{width:l,height:g,x:C,y:I}})(_0(t));else if(uc(e))i=(function(o,a){var r=Md(o,!0,a==="fixed"),s=r.top+o.clientTop,l=r.left+o.clientLeft,g=R0(o)?_h(o):x0(1);return{width:o.clientWidth*g.x,height:o.clientHeight*g.y,x:l*g.x,y:s*g.y}})(e,A);else{var n=S$(t);i={x:e.x-n.x,y:e.y-n.y,width:e.width,height:e.height}}return fD(i)}function x$(t,e){var A=fI(t);return!(A===e||!uc(A)||xh(A))&&(fc(A).position==="fixed"||x$(A,e))}function Y6A(t,e,A){var i=R0(e),n=_0(e),o=A==="fixed",a=Md(t,!0,o,e),r={scrollLeft:0,scrollTop:0},s=x0(0);function l(){s.x=mD(n)}if(i||!i&&!o)if((zh(e)!=="body"||Tf(n))&&(r=GD(e)),i){var g=Md(e,!0,o,e);s.x=g.x+e.clientLeft,s.y=g.y+e.clientTop}else n&&l();o&&!i&&n&&l();var C=!n||i||o?x0(0):k$(n,r);return{x:a.left+r.scrollLeft-s.x-C.x,y:a.top+r.scrollTop-s.y-C.y,width:a.width,height:a.height}}function G_(t){return fc(t).position==="static"}function kZ(t,e){if(!R0(t)||fc(t).position==="fixed")return null;if(e)return e(t);var A=t.offsetParent;return _0(t)===A&&(A=A.ownerDocument.body),A}function xZ(t,e){var A=Ol(t);if(pD(t))return A;if(!R0(t)){for(var i=fI(t);i&&!xh(i);){if(uc(i)&&!G_(i))return i;i=fI(i)}return A}for(var n=kZ(t,e);n&&F6A(n)&&G_(n);)n=kZ(n,e);return n&&xh(n)&&G_(n)&&!IR(n)?A:n||(function(o){for(var a=fI(o);R0(a)&&!xh(a);){if(IR(a))return a;if(pD(a))return null;a=fI(a)}return null})(t)||A}var H6A={convertOffsetParentRelativeRectToViewportRelativeRect:function(t){var{elements:e,rect:A,offsetParent:i,strategy:n}=t,o=n==="fixed",a=_0(i),r=!!e&&pD(e.floating);if(i===a||r&&o)return A;var s={scrollLeft:0,scrollTop:0},l=x0(1),g=x0(0),C=R0(i);if((C||!C&&!o)&&((zh(i)!=="body"||Tf(a))&&(s=GD(i)),R0(i))){var I=Md(i);l=_h(i),g.x=I.x+i.clientLeft,g.y=I.y+i.clientTop}var d=!a||C||o?x0(0):k$(a,s);return{width:A.width*l.x,height:A.height*l.y,x:A.x*l.x-s.scrollLeft*l.x+g.x+d.x,y:A.y*l.y-s.scrollTop*l.y+g.y+d.y}},getDocumentElement:_0,getClippingRect:function(t){var{element:e,boundary:A,rootBoundary:i,strategy:n}=t,o=A==="clippingAncestors"?pD(e)?[]:(function(l,g){var C=g.get(l);if(C)return C;for(var I=Jf(l,[],!1).filter(v=>uc(v)&&zh(v)!=="body"),d=null,h=fc(l).position==="fixed",E=h?fI(l):l;uc(E)&&!xh(E);){var f=fc(E),m=IR(E);m||f.position!=="fixed"||(d=null),(h?!m&&!d:!m&&f.position==="static"&&d&&O6A.has(d.position)||Tf(E)&&!m&&x$(l,E))?I=I.filter(v=>v!==E):d=f,E=fI(E)}return g.set(l,I),I})(e,this._c):[].concat(A),a=[...o,i],r=a[0],s=a.reduce((l,g)=>{var C=SZ(e,g,n);return l.top=Qd(C.top,l.top),l.right=QD(C.right,l.right),l.bottom=QD(C.bottom,l.bottom),l.left=Qd(C.left,l.left),l},SZ(e,r,n));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}},getOffsetParent:xZ,getElementRects:(function(){var t=zt(function*(e){var A=this.getOffsetParent||xZ,i=this.getDimensions,n=yield i(e.floating);return{reference:Y6A(e.reference,yield A(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}});return function(e){return t.apply(this,arguments)}})(),getClientRects:function(t){return Array.from(t.getClientRects())},getDimensions:function(t){var{width:e,height:A}=M$(t);return{width:e,height:A}},getScale:_h,isElement:uc,isRTL:function(t){return fc(t).direction==="rtl"}};function _Z(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}function z6A(t,e,A,i){i===void 0&&(i={});var{ancestorScroll:n=!0,ancestorResize:o=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:r=typeof IntersectionObserver=="function",animationFrame:s=!1}=i,l=jR(t),g=n||o?[...l?Jf(l):[],...Jf(e)]:[];g.forEach(f=>{n&&f.addEventListener("scroll",A,{passive:!0}),o&&f.addEventListener("resize",A)});var C,I=l&&r?(function(f,m){var v,k=null,S=_0(f);function b(){var x;clearTimeout(v),(x=k)==null||x.disconnect(),k=null}return(function x(F,z){F===void 0&&(F=!1),z===void 0&&(z=1),b();var P=f.getBoundingClientRect(),{left:Z,top:tA,width:W,height:BA}=P;if(F||m(),W&&BA){var X={rootMargin:-Y5(tA)+"px "+-Y5(S.clientWidth-(Z+W))+"px "+-Y5(S.clientHeight-(tA+BA))+"px "+-Y5(Z)+"px",threshold:Qd(0,QD(1,z))||1},iA=!0;try{k=new IntersectionObserver(AA,Me(Me({},X),{},{root:S.ownerDocument}))}catch(IA){k=new IntersectionObserver(AA,X)}k.observe(f)}function AA(IA){var aA=IA[0].intersectionRatio;if(aA!==z){if(!iA)return x();aA?x(!1,aA):v=setTimeout(()=>{x(!1,1e-7)},1e3)}aA!==1||_Z(P,f.getBoundingClientRect())||x(),iA=!1}})(!0),b})(l,A):null,d=-1,h=null;a&&(h=new ResizeObserver(f=>{var[m]=f;m&&m.target===l&&h&&(h.unobserve(e),cancelAnimationFrame(d),d=requestAnimationFrame(()=>{var v;(v=h)==null||v.observe(e)})),A()}),l&&!s&&h.observe(l),h.observe(e));var E=s?Md(t):null;return s&&(function f(){var m=Md(t);E&&!_Z(E,m)&&A(),E=m,C=requestAnimationFrame(f)})(),A(),()=>{var f;g.forEach(m=>{n&&m.removeEventListener("scroll",A),o&&m.removeEventListener("resize",A)}),I?.(),(f=h)==null||f.disconnect(),h=null,s&&cancelAnimationFrame(C)}}var P6A=function(t){return t===void 0&&(t=0),{name:"offset",options:t,fn:e=>zt(function*(){var A,i,{x:n,y:o,placement:a,middlewareData:r}=e,s=yield(function(l,g){return CR.apply(this,arguments)})(e,t);return a===((A=r.offset)==null?void 0:A.placement)&&(i=r.arrow)!=null&&i.alignmentOffset?{}:{x:n+s.x,y:o+s.y,data:Me(Me({},s),{},{placement:a})}})()}},j6A=function(t){return t===void 0&&(t={}),{name:"shift",options:t,fn:e=>zt(function*(){var{x:A,y:i,placement:n}=e,o=ND(t,e),{mainAxis:a=!0,crossAxis:r=!1,limiter:s={fn:k=>{var{x:S,y:b}=k;return{x:S,y:b}}}}=o,l=TZ(o,_pA),g={x:A,y:i},C=yield y$(e,l),I=uI(bd(n)),d=m$(I),h=g[d],E=g[I];if(a){var f=d==="y"?"bottom":"right";h=DZ(h+C[d==="y"?"top":"left"],h,h-C[f])}if(r){var m=I==="y"?"bottom":"right";E=DZ(E+C[I==="y"?"top":"left"],E,E-C[m])}var v=s.fn(Me(Me({},e),{},{[d]:h,[I]:E}));return Me(Me({},v),{},{data:{x:v.x-A,y:v.y-i,enabled:{[d]:a,[I]:r}}})})()}},q6A=function(t){return t===void 0&&(t={}),{name:"flip",options:t,fn:e=>zt(function*(){var A,i,{placement:n,middlewareData:o,rects:a,initialPlacement:r,platform:s,elements:l}=e,g=ND(t,e),{mainAxis:C=!0,crossAxis:I=!0,fallbackPlacements:d,fallbackStrategy:h="bestFit",fallbackAxisSideDirection:E="none",flipAlignment:f=!0}=g,m=TZ(g,xpA);if((A=o.arrow)!=null&&A.alignmentOffset)return{};var v=bd(n),k=uI(r),S=bd(r)===r,b=yield s.isRTL==null?void 0:s.isRTL(l.floating),x=d||(S||!f?[H5(r)]:(function(uA){var UA=H5(uA);return[gR(uA),UA,gR(UA)]})(r)),F=E!=="none";!d&&F&&x.push(...S6A(r,f,E,b));var z=[r,...x],P=yield y$(e,m),Z=[],tA=((i=o.flip)==null?void 0:i.overflows)||[];if(C&&Z.push(P[v]),I){var W=(function(uA,UA,$A){$A===void 0&&($A=!1);var zA=FD(uA),pA=D$(uA),PA=w$(pA),Je=pA==="x"?zA===($A?"end":"start")?"right":"left":zA==="start"?"bottom":"top";return UA.reference[PA]>UA.floating[PA]&&(Je=H5(Je)),[Je,H5(Je)]})(n,a,b);Z.push(P[W[0]],P[W[1]])}if(tA=[...tA,{placement:n,overflows:Z}],!Z.every(uA=>uA<=0)){var BA,X,iA=(((BA=o.flip)==null?void 0:BA.index)||0)+1,AA=z[iA];if(AA&&(!(I==="alignment"&&k!==uI(AA))||tA.every(uA=>uI(uA.placement)!==k||uA.overflows[0]>0)))return{data:{index:iA,overflows:tA},reset:{placement:AA}};var IA=(X=tA.filter(uA=>uA.overflows[0]<=0).sort((uA,UA)=>uA.overflows[1]-UA.overflows[1])[0])==null?void 0:X.placement;if(!IA)switch(h){case"bestFit":var aA,rA=(aA=tA.filter(uA=>{if(F){var UA=uI(uA.placement);return UA===k||UA==="y"}return!0}).map(uA=>[uA.placement,uA.overflows.filter(UA=>UA>0).reduce((UA,$A)=>UA+$A,0)]).sort((uA,UA)=>uA[1]-UA[1])[0])==null?void 0:aA[0];rA&&(IA=rA);break;case"initialPlacement":IA=r}if(n!==IA)return{reset:{placement:IA}}}return{}})()}};function V6A(t){var e,A,i={autoUpdate:!0},n=t,o=s=>Me(Me(Me({},i),t||{}),s||{}),a=s=>{e&&A&&(n=o(s),((l,g,C)=>{var I=new Map,d=Me({platform:H6A},C),h=Me(Me({},d.platform),{},{_c:I});return x6A(l,g,Me(Me({},d),{},{platform:h}))})(e,A,n).then(l=>{var g;Object.assign(A.style,{position:l.strategy,left:"".concat(l.x,"px"),top:"".concat(l.y,"px")}),!((g=n)===null||g===void 0)&&g.onComputed&&n.onComputed(l)}))},r=s=>{Dg(s.subscribe(l=>{e===void 0?(e=l,a()):(Object.assign(e,l),a())}))};return[s=>{if("subscribe"in s)return r(s),{};e=s,a()},(s,l)=>{var g;A=s,n=o(l),setTimeout(()=>a(l),0),a(l);var C=()=>{g&&(g(),g=void 0)},I=function(){var{autoUpdate:d}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:n||{};C(),d!==!1&&kX().then(()=>z6A(e,A,()=>a(n),d===!0?{}:d))};return g=I(),{update(d){a(d),g=I(d)},destroy(){C()}}},a]}function W6A(t){var{loadOptions:e,filterText:A,items:i,multiple:n,value:o,itemId:a,groupBy:r,filterSelectedItems:s,itemFilter:l,convertStringItemsToObjects:g,filterGroupedItems:C,label:I}=t;if(i&&e)return i;if(!i)return[];i&&i.length>0&&typeof i[0]!="object"&&(i=g(i));var d=i.filter(h=>{var E=l(h[I],A,h);return E&&n&&o!=null&&o.length&&(E=!o.some(f=>!!s&&f[a]===h[a])),E});return r&&(d=C(d)),d}function Z6A(t){return _$.apply(this,arguments)}function _$(){return(_$=zt(function*(t){var{dispatch:e,loadOptions:A,convertStringItemsToObjects:i,filterText:n}=t,o=yield A(n).catch(a=>{console.warn("svelte-select loadOptions error :>> ",a),e("error",{type:"loadOptions",details:a})});if(o&&!o.cancelled)return o?(o&&o.length>0&&typeof o[0]!="object"&&(o=i(o)),e("loaded",{items:o})):o=[],{filteredItems:o,loading:!1,focused:!0,listOpen:!0}})).apply(this,arguments)}Zt(` - svg.svelte-1kxu7be { - width: var(--chevron-icon-width, 20px); - height: var(--chevron-icon-width, 20px); - color: var(--chevron-icon-colour, currentColor); - } -`);var X6A=xI(``);Zt(` - svg.svelte-1hraxrc { - width: var(--clear-icon-width, 20px); - height: var(--clear-icon-width, 20px); - color: var(--clear-icon-color, currentColor); - } -`);var $6A=xI(``);function K_(t){CA(t,$6A())}Zt(` - .loading.svelte-y9fi5p { - width: var(--spinner-width, 20px); - height: var(--spinner-height, 20px); - color: var(--spinner-color, var(--icons-color)); - animation: svelte-y9fi5p-rotate 0.75s linear infinite; - transform-origin: center center; - transform: none; - } - - .circle_path.svelte-y9fi5p { - stroke-dasharray: 90; - stroke-linecap: round; - } - - @keyframes svelte-y9fi5p-rotate { - 100% { - transform: rotate(360deg); - } - } -`);var A8A=xI('');Zt(` - .svelte-select.svelte-1ul7oo4 { - /* deprecating camelCase custom props in favour of kebab-case for v5 */ - --borderRadius: var(--border-radius); - --clearSelectColor: var(--clear-select-color); - --clearSelectWidth: var(--clear-select-width); - --disabledBackground: var(--disabled-background); - --disabledBorderColor: var(--disabled-border-color); - --disabledColor: var(--disabled-color); - --disabledPlaceholderColor: var(--disabled-placeholder-color); - --disabledPlaceholderOpacity: var(--disabled-placeholder-opacity); - --errorBackground: var(--error-background); - --errorBorder: var(--error-border); - --groupItemPaddingLeft: var(--group-item-padding-left); - --groupTitleColor: var(--group-title-color); - --groupTitleFontSize: var(--group-title-font-size); - --groupTitleFontWeight: var(--group-title-font-weight); - --groupTitlePadding: var(--group-title-padding); - --groupTitleTextTransform: var(--group-title-text-transform); - --groupTitleBorderColor: var(--group-title-border-color); - --groupTitleBorderWidth: var(--group-title-border-width); - --groupTitleBorderStyle: var(--group-title-border-style); - --indicatorColor: var(--chevron-color); - --indicatorHeight: var(--chevron-height); - --indicatorWidth: var(--chevron-width); - --inputColor: var(--input-color); - --inputLeft: var(--input-left); - --inputLetterSpacing: var(--input-letter-spacing); - --inputMargin: var(--input-margin); - --inputPadding: var(--input-padding); - --itemActiveBackground: var(--item-active-background); - --itemColor: var(--item-color); - --itemFirstBorderRadius: var(--item-first-border-radius); - --itemHoverBG: var(--item-hover-bg); - --itemHoverColor: var(--item-hover-color); - --itemIsActiveBG: var(--item-is-active-bg); - --itemIsActiveColor: var(--item-is-active-color); - --itemIsNotSelectableColor: var(--item-is-not-selectable-color); - --itemPadding: var(--item-padding); - --listBackground: var(--list-background); - --listBorder: var(--list-border); - --listBorderRadius: var(--list-border-radius); - --listEmptyColor: var(--list-empty-color); - --listEmptyPadding: var(--list-empty-padding); - --listEmptyTextAlign: var(--list-empty-text-align); - --listMaxHeight: var(--list-max-height); - --listPosition: var(--list-position); - --listShadow: var(--list-shadow); - --listZIndex: var(--list-z-index); - --multiItemBG: var(--multi-item-bg); - --multiItemBorderRadius: var(--multi-item-border-radius); - --multiItemDisabledHoverBg: var(--multi-item-disabled-hover-bg); - --multiItemDisabledHoverColor: var(--multi-item-disabled-hover-color); - --multiItemHeight: var(--multi-item-height); - --multiItemMargin: var(--multi-item-margin); - --multiItemPadding: var(--multi-item-padding); - --multiSelectInputMargin: var(--multi-select-input-margin); - --multiSelectInputPadding: var(--multi-select-input-padding); - --multiSelectPadding: var(--multi-select-padding); - --placeholderColor: var(--placeholder-color); - --placeholderOpacity: var(--placeholder-opacity); - --selectedItemPadding: var(--selected-item-padding); - --spinnerColor: var(--spinner-color); - --spinnerHeight: var(--spinner-height); - --spinnerWidth: var(--spinner-width); - - --internal-padding: 0 0 0 16px; - - border: var(--border, 1px solid #d8dbdf); - border-radius: var(--border-radius, 6px); - min-height: var(--height, 42px); - position: relative; - display: flex; - align-items: stretch; - padding: var(--padding, var(--internal-padding)); - background: var(--background, #fff); - margin: var(--margin, 0); - width: var(--width, 100%); - font-size: var(--font-size, 16px); - max-height: var(--max-height); - } - - .svelte-1ul7oo4 { - box-sizing: var(--box-sizing, border-box); - } - - .svelte-select.svelte-1ul7oo4:hover { - border: var(--border-hover, 1px solid #b2b8bf); - } - - .value-container.svelte-1ul7oo4 { - display: flex; - flex: 1 1 0%; - flex-wrap: wrap; - align-items: center; - gap: 5px 10px; - padding: var(--value-container-padding, 5px 0); - position: relative; - overflow: var(--value-container-overflow, hidden); - align-self: stretch; - } - - .prepend.svelte-1ul7oo4, - .indicators.svelte-1ul7oo4 { - display: flex; - flex-shrink: 0; - align-items: center; - } - - .indicators.svelte-1ul7oo4 { - position: var(--indicators-position); - top: var(--indicators-top); - right: var(--indicators-right); - bottom: var(--indicators-bottom); - } - - input.svelte-1ul7oo4 { - position: absolute; - cursor: default; - border: none; - color: var(--input-color, var(--item-color)); - padding: var(--input-padding, 0); - letter-spacing: var(--input-letter-spacing, inherit); - margin: var(--input-margin, 0); - min-width: 10px; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - font-size: var(--font-size, 16px); - } - - .svelte-1ul7oo4:not(.multi) > .value-container:where(.svelte-1ul7oo4) > input:where(.svelte-1ul7oo4) { - width: 100%; - height: 100%; - } - - input.svelte-1ul7oo4::placeholder { - color: var(--placeholder-color, #78848f); - opacity: var(--placeholder-opacity, 1); - } - - input.svelte-1ul7oo4:focus { - outline: none; - } - - .svelte-select.focused.svelte-1ul7oo4 { - border: var(--border-focused, 1px solid #006fe8); - border-radius: var(--border-radius-focused, var(--border-radius, 6px)); - } - - .disabled.svelte-1ul7oo4 { - background: var(--disabled-background, #ebedef); - border-color: var(--disabled-border-color, #ebedef); - color: var(--disabled-color, #c1c6cc); - } - - .disabled.svelte-1ul7oo4 input:where(.svelte-1ul7oo4)::placeholder { - color: var(--disabled-placeholder-color, #c1c6cc); - opacity: var(--disabled-placeholder-opacity, 1); - } - - .selected-item.svelte-1ul7oo4 { - position: relative; - overflow: var(--selected-item-overflow, hidden); - padding: var(--selected-item-padding, 0 20px 0 0); - text-overflow: ellipsis; - white-space: nowrap; - color: var(--selected-item-color, inherit); - font-size: var(--font-size, 16px); - } - - .multi.svelte-1ul7oo4 .selected-item:where(.svelte-1ul7oo4) { - position: absolute; - line-height: var(--height, 42px); - height: var(--height, 42px); - } - - .selected-item.svelte-1ul7oo4:focus { - outline: none; - } - - .hide-selected-item.svelte-1ul7oo4 { - opacity: 0; - } - - .icon.svelte-1ul7oo4 { - display: flex; - align-items: center; - justify-content: center; - } - - .clear-select.svelte-1ul7oo4 { - all: unset; - display: flex; - align-items: center; - justify-content: center; - width: var(--clear-select-width, 40px); - height: var(--clear-select-height, 100%); - color: var(--clear-select-color, var(--icons-color)); - margin: var(--clear-select-margin, 0); - pointer-events: all; - flex-shrink: 0; - } - - .clear-select.svelte-1ul7oo4:focus { - outline: var(--clear-select-focus-outline, 1px solid #006fe8); - } - - .loading.svelte-1ul7oo4 { - width: var(--loading-width, 40px); - height: var(--loading-height); - color: var(--loading-color, var(--icons-color)); - margin: var(--loading--margin, 0); - flex-shrink: 0; - } - - .chevron.svelte-1ul7oo4 { - width: var(--chevron-width, 40px); - height: var(--chevron-height, 40px); - background: var(--chevron-background, transparent); - pointer-events: var(--chevron-pointer-events, none); - color: var(--chevron-color, var(--icons-color)); - border: var(--chevron-border, 0 0 0 1px solid #d8dbdf); - flex-shrink: 0; - } - - .multi.svelte-1ul7oo4 { - padding: var(--multi-select-padding, var(--internal-padding)); - } - - .multi.svelte-1ul7oo4 input:where(.svelte-1ul7oo4) { - padding: var(--multi-select-input-padding, 0); - position: relative; - margin: var(--multi-select-input-margin, 5px 0); - flex: 1 1 40px; - } - - .svelte-select.error.svelte-1ul7oo4 { - border: var(--error-border, 1px solid #ff2d55); - background: var(--error-background, #fff); - } - - .a11y-text.svelte-1ul7oo4 { - z-index: 9999; - border: 0px; - clip: rect(1px, 1px, 1px, 1px); - height: 1px; - width: 1px; - position: absolute; - overflow: hidden; - padding: 0px; - white-space: nowrap; - } - - .multi-item.svelte-1ul7oo4 { - background: var(--multi-item-bg, #ebedef); - margin: var(--multi-item-margin, 0); - outline: var(--multi-item-outline, 1px solid #ddd); - border-radius: var(--multi-item-border-radius, 4px); - height: var(--multi-item-height, 25px); - line-height: var(--multi-item-height, 25px); - display: flex; - cursor: default; - padding: var(--multi-item-padding, 0 5px); - overflow: hidden; - gap: var(--multi-item-gap, 4px); - outline-offset: -1px; - max-width: var(--multi-max-width, none); - color: var(--multi-item-color, var(--item-color)); - } - - .multi-item.disabled.svelte-1ul7oo4:hover { - background: var(--multi-item-disabled-hover-bg, #ebedef); - color: var(--multi-item-disabled-hover-color, #c1c6cc); - } - - .multi-item-text.svelte-1ul7oo4 { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .multi-item-clear.svelte-1ul7oo4 { - display: flex; - align-items: center; - justify-content: center; - --clear-icon-color: var(--multi-item-clear-icon-color, #000); - } - - .multi-item.active.svelte-1ul7oo4 { - outline: var(--multi-item-active-outline, 1px solid #006fe8); - } - - .svelte-select-list.svelte-1ul7oo4 { - box-shadow: var(--list-shadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24)); - border-radius: var(--list-border-radius, 4px); - max-height: var(--list-max-height, 252px); - overflow-y: auto; - background: var(--list-background, #fff); - position: var(--list-position, absolute); - z-index: var(--list-z-index, 2); - border: var(--list-border); - } - - .prefloat.svelte-1ul7oo4 { - opacity: 0; - pointer-events: none; - } - - .list-group-title.svelte-1ul7oo4 { - color: var(--group-title-color, #8f8f8f); - cursor: default; - font-size: var(--group-title-font-size, 16px); - font-weight: var(--group-title-font-weight, 600); - height: var(--height, 42px); - line-height: var(--height, 42px); - padding: var(--group-title-padding, 0 20px); - text-overflow: ellipsis; - overflow-x: hidden; - white-space: nowrap; - text-transform: var(--group-title-text-transform, uppercase); - border-width: var(--group-title-border-width, medium); - border-style: var(--group-title-border-style, none); - border-color: var(--group-title-border-color, color); - } - - .empty.svelte-1ul7oo4 { - text-align: var(--list-empty-text-align, center); - padding: var(--list-empty-padding, 20px 0); - color: var(--list-empty-color, #78848f); - } - - .item.svelte-1ul7oo4 { - cursor: default; - height: var(--item-height, var(--height, 42px)); - line-height: var(--item-line-height, var(--height, 42px)); - padding: var(--item-padding, 0 20px); - color: var(--item-color, inherit); - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - transition: var(--item-transition, all 0.2s); - align-items: center; - width: 100%; - } - - .item.group-item.svelte-1ul7oo4 { - padding-left: var(--group-item-padding-left, 40px); - } - - .item.svelte-1ul7oo4:active { - background: var(--item-active-background, #b9daff); - } - - .item.active.svelte-1ul7oo4 { - background: var(--item-is-active-bg, #007aff); - color: var(--item-is-active-color, #fff); - } - - .item.first.svelte-1ul7oo4 { - border-radius: var(--item-first-border-radius, 4px 4px 0 0); - } - - .item.hover.svelte-1ul7oo4:not(.active) { - background: var(--item-hover-bg, #e7f2ff); - color: var(--item-hover-color, inherit); - } - - .item.not-selectable.svelte-1ul7oo4, - .item.hover.item.not-selectable.svelte-1ul7oo4, - .item.active.item.not-selectable.svelte-1ul7oo4, - .item.not-selectable.svelte-1ul7oo4:active { - color: var(--item-is-not-selectable-color, #999); - background: transparent; - } - - .required.svelte-1ul7oo4 { - opacity: 0; - z-index: -1; - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - } -`);var e8A=JA('
          '),t8A=JA('
          No options
          '),i8A=JA('
          '),n8A=JA(' ',1),o8A=JA('
          '),a8A=JA('
          '),r8A=JA("
          "),s8A=JA(''),l8A=JA(''),g8A=JA(''),c8A=JA(''),C8A=JA(''),I8A=JA('
          ');function Cd(t,e){var A=(function(mA){var FA={};for(var le in mA.children&&(FA.default=!0),mA.$$slots)FA[le]=!0;return FA})(e);Nt(e,!1);var i,n=EA(),o=EA(),a=EA(),r=EA(),s=EA(),l=EA(),g=EA(),C=EA(),I=EA(),d=rmA(),h=L(e,"justValue",12,null),E=L(e,"filter",8,W6A),f=L(e,"getItems",8,Z6A),m=L(e,"id",8,null),v=L(e,"name",8,null),k=L(e,"container",12,void 0),S=L(e,"input",12,void 0),b=L(e,"multiple",8,!1),x=L(e,"multiFullItemClearable",8,!1),F=L(e,"disabled",8,!1),z=L(e,"focused",12,!1),P=L(e,"value",12,null),Z=L(e,"filterText",12,""),tA=L(e,"placeholder",8,"Please select"),W=L(e,"placeholderAlwaysShow",8,!1),BA=L(e,"items",12,null),X=L(e,"label",8,"label"),iA=L(e,"itemFilter",8,(mA,FA,le)=>"".concat(mA).toLowerCase().includes(FA.toLowerCase())),AA=L(e,"groupBy",8,void 0),IA=L(e,"groupFilter",8,mA=>mA),aA=L(e,"groupHeaderSelectable",8,!1),rA=L(e,"itemId",8,"value"),uA=L(e,"loadOptions",8,void 0),UA=L(e,"containerStyles",8,""),$A=L(e,"hasError",8,!1),zA=L(e,"filterSelectedItems",8,!0),pA=L(e,"required",8,!1),PA=L(e,"closeListOnChange",8,!0),Je=L(e,"clearFilterTextOnBlur",8,!0),_e=L(e,"createGroupHeaderItem",8,(mA,FA)=>({value:mA,[X()]:mA})),YA=()=>c(g),fA=L(e,"searchable",8,!0),XA=L(e,"inputStyles",8,""),DA=L(e,"clearable",8,!0),ee=L(e,"loading",12,!1),NA=L(e,"listOpen",12,!1),ke=L(e,"debounce",8,function(mA){var FA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1;clearTimeout(i),i=setTimeout(mA,FA)}),HA=L(e,"debounceWait",8,300),vA=L(e,"hideEmptyState",8,!1),Gt=L(e,"inputAttributes",24,()=>({})),ft=L(e,"listAutoWidth",8,!0),he=L(e,"showChevron",8,!1),Ot=L(e,"listOffset",8,5),He=L(e,"hoverItemIndex",12,0),je=L(e,"floatingConfig",24,()=>({})),pt=L(e,"class",8,""),xe=EA(),oi=EA(),j=EA(),$=EA(),oA=EA();function sA(mA){return mA.map((FA,le)=>({index:le,value:FA,label:"".concat(FA)}))}function TA(mA){var FA=[],le={};mA.forEach(nt=>{var rt=AA()(nt);FA.includes(rt)||(FA.push(rt),le[rt]=[],rt&&le[rt].push(Object.assign(_e()(rt,nt),{id:rt,groupHeader:!0,selectable:aA()}))),le[rt].push(Object.assign({groupItem:!!rt},nt))});var Ne=[];return IA()(FA).forEach(nt=>{le[nt]&&Ne.push(...le[nt])}),Ne}function de(){var mA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0,FA=arguments.length>1?arguments[1]:void 0;He(mA<0?0:mA),!FA&&AA()&&c(g)[He()]&&!c(g)[He()].selectable&&Ei(1)}function Qe(){var mA=!0;if(P()){var FA=[],le=[];P().forEach(Ne=>{FA.includes(Ne[rA()])?mA=!1:(FA.push(Ne[rA()]),le.push(Ne))}),mA||P(le)}return mA}function GA(mA){var FA=mA?mA[rA()]:P()[rA()];return BA().find(le=>le[rA()]===FA)}function OA(mA){return ht.apply(this,arguments)}function ht(){return(ht=zt(function*(mA){var FA=P()[mA];P().length===1?P(void 0):P(P().filter(le=>le!==FA)),d("clear",FA)})).apply(this,arguments)}function tt(mA){if(z())switch(mA.stopPropagation(),mA.key){case"Escape":mA.preventDefault(),Ke();break;case"Enter":if(mA.preventDefault(),NA()){if(c(g).length===0)break;var FA=c(g)[He()];if(P()&&!b()&&P()[rA()]===FA[rA()]){Ke();break}G(c(g)[He()])}break;case"ArrowDown":mA.preventDefault(),NA()?Ei(1):(NA(!0),N(xe,void 0));break;case"ArrowUp":mA.preventDefault(),NA()?Ei(-1):(NA(!0),N(xe,void 0));break;case"Tab":if(NA()&&z()){if(c(g).length===0||P()&&P()[rA()]===c(g)[He()][rA()])return Ke();mA.preventDefault(),G(c(g)[He()]),Ke()}break;case"Backspace":if(!b()||Z().length>0)return;if(b()&&P()&&P().length>0){if(OA(c(xe)!==void 0?c(xe):P().length-1),c(xe)===0||c(xe)===void 0)break;N(xe,P().length>c(xe)?c(xe)-1:void 0)}break;case"ArrowLeft":if(!P()||!b()||Z().length>0)return;c(xe)===void 0?N(xe,P().length-1):P().length>c(xe)&&c(xe)!==0&&N(xe,c(xe)-1);break;case"ArrowRight":if(!P()||!b()||Z().length>0||c(xe)===void 0)return;c(xe)===P().length-1?N(xe,void 0):c(xe)0?NA(!0):void NA(!NA())}function hn(){d("clear",P()),P(void 0),Ke(),ze()}function Ke(){Je()&&Z(""),NA(!1)}smA(zt(function*(){N(oi,P()),N(j,Z()),N($,b())})),As(()=>{NA()&&z(!0),z()&&S()&&S().focus()});var nn=L(e,"ariaValues",8,mA=>"Option ".concat(mA,", selected.")),Si=L(e,"ariaListOpen",8,(mA,FA)=>"You are currently focused on option ".concat(mA,". There are ").concat(FA," results available.")),Li=L(e,"ariaFocused",8,()=>"Select is focused, type to refine list, press down to open the menu."),Zi,bt=EA(null);function on(){clearTimeout(Zi),Zi=setTimeout(()=>{Kt=!1},100)}Dg(()=>{var mA;(mA=c(bt))===null||mA===void 0||mA.remove()});var Kt=!1;function G(mA){mA&&mA.selectable!==!1&&(function(FA){if(FA){Z("");var le=Object.assign({},FA);if(le.groupHeader&&!le.selectable)return;P(b()?P()?P().concat([le]):[le]:P(le)),setTimeout(()=>{PA()&&Ke(),N(xe,void 0),d("change",P()),d("select",FA)})}})(mA)}function dt(mA){Kt||He(mA)}function Ei(mA){if(c(g).filter(le=>!Object.hasOwn(le,"selectable")||le.selectable===!0).length===0)return He(0);mA>0&&He()===c(g).length-1?He(0):mA<0&&He()===0?He(c(g).length-1):He(He()+mA);var FA=c(g)[He()];FA&&FA.selectable===!1&&(mA!==1&&mA!==-1||Ei(mA))}function Qn(mA,FA,le){if(!b())return FA&&FA[le]===mA[le]}var un=Yo,Vn=Yo;function Yo(mA){return{update(FA){FA.scroll&&(on(),mA.scrollIntoView({behavior:"auto",block:"nearest"}))}}}var Bo=EA({strategy:"absolute",placement:"bottom-start",middleware:[P6A(Ot()),q6A(),j6A()],autoUpdate:!1}),[No,Zo,Do]=V6A(c(Bo)),Ba=EA(!0);KA(()=>(K(BA()),K(P())),()=>{BA(),P()&&(function(){if(typeof P()=="string"){var mA=(BA()||[]).find(FA=>FA[rA()]===P());P(mA||{[rA()]:P(),label:P()})}else b()&&Array.isArray(P())&&P().length>0&&P(P().map(FA=>typeof FA=="string"?{value:FA,label:FA}:FA))})()}),KA(()=>(K(Gt()),K(fA())),()=>{!Gt()&&fA()||(N(oA,Object.assign({autocapitalize:"none",autocomplete:"off",autocorrect:"off",spellcheck:!1,tabindex:0,type:"text","aria-autocomplete":"list"},Gt())),m()&&Tl(oA,c(oA).id=m()),fA()||Tl(oA,c(oA).readonly=!0))}),KA(()=>K(b()),()=>{b()&&P()&&(Array.isArray(P())?P([...P()]):P([P()]))}),KA(()=>(c($),K(b())),()=>{c($)&&!b()&&P()&&P(null)}),KA(()=>(K(b()),K(P())),()=>{b()&&P()&&P().length>1&&Qe()}),KA(()=>K(P()),()=>{P()&&(b()?JSON.stringify(P())!==JSON.stringify(c(oi))&&Qe()&&d("input",P()):c(oi)&&JSON.stringify(P()[rA()])===JSON.stringify(c(oi)[rA()])||d("input",P()))}),KA(()=>(K(P()),K(b()),c(oi)),()=>{!P()&&b()&&c(oi)&&d("input",P())}),KA(()=>(K(z()),K(S())),()=>{!z()&&S()&&Ke()}),KA(()=>(K(Z()),c(j)),()=>{Z()!==c(j)&&(uA()||Z().length!==0)&&(uA()?ke()(zt(function*(){ee(!0);var mA=yield f()({dispatch:d,loadOptions:uA(),convertStringItemsToObjects:sA,filterText:Z()});mA?(ee(mA.loading),NA(NA()?mA.listOpen:Z().length>0),z(NA()&&mA.focused),BA(AA()?TA(mA.filteredItems):mA.filteredItems)):(ee(!1),z(!0),NA(!0))}),HA()):(NA(!0),b()&&N(xe,void 0)))}),KA(()=>(K(E()),K(uA()),K(Z()),K(BA()),K(b()),K(P()),K(rA()),K(AA()),K(X()),K(zA()),K(iA())),()=>{N(g,E()({loadOptions:uA(),filterText:Z(),items:BA(),multiple:b(),value:P(),itemId:rA(),groupBy:AA(),label:X(),filterSelectedItems:zA(),itemFilter:iA(),convertStringItemsToObjects:sA,filterGroupedItems:TA}))}),KA(()=>(K(b()),K(NA()),K(P()),c(g)),()=>{!b()&&NA()&&P()&&c(g)&&de(c(g).findIndex(mA=>mA[rA()]===P()[rA()]),!0)}),KA(()=>(K(NA()),K(b())),()=>{NA()&&b()&&He(0)}),KA(()=>K(Z()),()=>{Z()&&He(0)}),KA(()=>K(He()),()=>{var mA;mA=He(),d("hoverItem",mA)}),KA(()=>(K(b()),K(P())),()=>{N(n,b()?P()&&P().length>0:P())}),KA(()=>(c(n),K(Z())),()=>{N(o,c(n)&&Z().length>0)}),KA(()=>(c(n),K(DA()),K(F()),K(ee())),()=>{N(a,c(n)&&DA()&&!F()&&!ee())}),KA(()=>(K(W()),K(b()),K(tA()),K(P())),()=>{var mA;N(r,W()&&b()||b()&&((mA=P())===null||mA===void 0?void 0:mA.length)===0?tA():P()?"":tA())}),KA(()=>(K(P()),K(b())),()=>{var mA,FA;N(s,P()?(mA=b(),FA=void 0,FA=mA&&P().length>0?P().map(le=>le[X()]).join(", "):P()[X()],nn()(FA)):"")}),KA(()=>(c(g),K(He()),K(z()),K(NA())),()=>{N(l,(function(){if(!c(g)||c(g).length===0)return"";var mA=c(g)[He()];if(NA()&&mA){var FA=c(g)?c(g).length:0;return Si()(mA[X()],FA)}return Li()()})((c(g),He(),z(),NA())))}),KA(()=>K(BA()),()=>{(function(mA){mA&&mA.length!==0&&!mA.some(FA=>typeof FA!="object")&&P()&&(b()?!P().some(FA=>!FA||!FA[rA()]):P()[rA()])&&(Array.isArray(P())?P(P().map(FA=>GA(FA)||FA)):P(GA()||P()))})(BA())}),KA(()=>(K(b()),K(P()),K(rA())),()=>{h((b(),P(),rA(),b()?P()?P().map(mA=>mA[rA()]):null:P()?P()[rA()]:P()))}),KA(()=>(K(b()),c(oi),K(P())),()=>{b()||!c(oi)||P()||d("input",P())}),KA(()=>(K(NA()),c(g),K(b()),K(P())),()=>{NA()&&c(g)&&!b()&&!P()&&de()}),KA(()=>c(g),()=>{(function(mA){NA()&&d("filter",mA)})(c(g))}),KA(()=>(K(k()),K(je()),c(Bo)),()=>{k()&&je()&&Do(Object.assign(c(Bo),je()))}),KA(()=>c(bt),()=>{N(C,!!c(bt))}),KA(()=>(c(bt),K(NA())),()=>{(function(mA,FA){if(!mA||!FA)return N(Ba,!0);setTimeout(()=>{N(Ba,!1)},0)})(c(bt),NA())}),KA(()=>(K(NA()),K(k()),c(bt)),()=>{NA()&&k()&&c(bt)&&(function(){var{width:mA}=k().getBoundingClientRect();Tl(bt,c(bt).style.width=ft()?mA+"px":"auto")})()}),KA(()=>K(He()),()=>{N(I,He())}),KA(()=>(K(S()),K(NA()),K(z())),()=>{S()&&NA()&&!z()&&ze()}),KA(()=>(K(k()),K(je())),()=>{var mA;k()&&((mA=je())===null||mA===void 0?void 0:mA.autoUpdate)===void 0&&Tl(Bo,c(Bo).autoUpdate=!0)}),Rn();var Xo={getFilteredItems:YA,handleClear:hn};ni();var ra,yo=I8A();fe("click",NC,function(mA){var FA;NA()||z()||!k()||k().contains(mA.target)||(FA=c(bt))!==null&&FA!==void 0&&FA.contains(mA.target)||Oe()}),fe("keydown",NC,tt);var ge=dA(yo),mi=mA=>{var FA,le=i8A(),Ne=dA(le),nt=Xt=>{var Ji=Fi();Ia(et(Ji),e,"list-prepend",{},null),CA(Xt,Ji)};jA(Ne,Xt=>{wA(()=>A["list-prepend"])&&Xt(nt)});var rt=_A(Ne,2),xt=Xt=>{var Ji=Fi();Ia(et(Ji),e,"list",{get filteredItems(){return c(g)}},null),CA(Xt,Ji)},On=Xt=>{var Ji=Fi(),va=et(Ji),Ut=Oi=>{var Xi=Fi();da(et(Xi),1,()=>c(g),ka,(Wn,pn,_t)=>{var sa,zo=e8A(),D=dA(zo);Ia(dA(D),e,"item",{get item(){return c(pn)},index:_t},M=>{var R=dr();Se(()=>Lt(R,(c(pn),K(X()),wA(()=>{var V;return(V=c(pn))===null||V===void 0?void 0:V[X()]})))),CA(M,R)}),ms(D,(M,R)=>un?.(M),()=>({scroll:Qn(c(pn),P(),rA()),listDom:c(C)})),ms(D,(M,R)=>Vn?.(M),()=>({scroll:c(I)===_t,listDom:c(C)})),Se(M=>sa=ii(D,1,"item svelte-1ul7oo4",null,sa,M),[()=>{var M,R;return{"list-group-title":c(pn).groupHeader,active:Qn(c(pn),P(),rA()),first:(R=_t,R===0),hover:He()===_t,"group-item":c(pn).groupItem,"not-selectable":((M=c(pn))===null||M===void 0?void 0:M.selectable)===!1}}]),fe("mouseover",zo,()=>dt(_t)),fe("focus",zo,()=>dt(_t)),fe("click",zo,vC(()=>(function(M){var{item:R,i:V}=M;if(R?.selectable!==!1)return P()&&!b()&&P()[rA()]===R[rA()]?Ke():void((function(_){return _.groupHeader&&_.selectable||_.selectable||!_.hasOwnProperty("selectable")})(R)&&(He(V),G(R)))})({item:c(pn),i:_t}))),fe("keydown",zo,gI(vC(function(M){yf.call(this,e,M)}))),CA(Wn,zo)}),CA(Oi,Xi)},st=Oi=>{var Xi=Fi(),Wn=et(Xi),pn=_t=>{var sa=Fi();Ia(et(sa),e,"empty",{},zo=>{CA(zo,t8A())}),CA(_t,sa)};jA(Wn,_t=>{vA()||_t(pn)},!0),CA(Oi,Xi)};jA(va,Oi=>{c(g),wA(()=>c(g).length>0)?Oi(Ut):Oi(st,!1)},!0),CA(Xt,Ji)};jA(rt,Xt=>{wA(()=>A.list)?Xt(xt):Xt(On,!1)});var Ti=_A(rt,2),zi=Xt=>{var Ji=Fi();Ia(et(Ji),e,"list-append",{},null),CA(Xt,Ji)};jA(Ti,Xt=>{wA(()=>A["list-append"])&&Xt(zi)}),ms(le,Xt=>Zo?.(Xt)),Oo(le,Xt=>N(bt,Xt),()=>c(bt)),_r(()=>fe("scroll",le,on)),_r(()=>fe("pointerup",le,gI(vC(function(Xt){yf.call(this,e,Xt)})))),_r(()=>fe("mousedown",le,gI(vC(function(Xt){yf.call(this,e,Xt)})))),Se(()=>FA=ii(le,1,"svelte-select-list svelte-1ul7oo4",null,FA,{prefloat:c(Ba)})),CA(mA,le)};jA(ge,mA=>{NA()&&mA(mi)});var cn=_A(ge,2),fn=dA(cn),Ho=mA=>{var FA=n8A(),le=et(FA),Ne=dA(le),nt=dA(_A(le,2));Se(()=>{Lt(Ne,c(s)),Lt(nt,c(l))}),CA(mA,FA)};jA(fn,mA=>{z()&&mA(Ho)});var ya=_A(cn,2);Ia(dA(ya),e,"prepend",{},null);var _i=_A(ya,2),Eo=dA(_i),Za=mA=>{var FA=Fi(),le=et(FA),Ne=rt=>{var xt=Fi();da(et(xt),1,P,ka,(On,Ti,zi)=>{var Xt,Ji=a8A(),va=dA(Ji);Ia(dA(va),e,"selection",{get selection(){return c(Ti)},index:zi},Oi=>{var Xi=dr();Se(()=>Lt(Xi,(c(Ti),K(X()),wA(()=>c(Ti)[X()])))),CA(Oi,Xi)});var Ut=_A(va,2),st=Oi=>{var Xi=o8A();Ia(dA(Xi),e,"multi-clear-icon",{},Wn=>{K_(Wn)}),fe("pointerup",Xi,gI(vC(()=>OA(zi)))),CA(Oi,Xi)};jA(Ut,Oi=>{F()||x()||!K_||Oi(st)}),Se(()=>Xt=ii(Ji,1,"multi-item svelte-1ul7oo4",null,Xt,{active:c(xe)===zi,disabled:F()})),fe("click",Ji,gI(()=>x()?OA(zi):{})),fe("keydown",Ji,gI(vC(function(Oi){yf.call(this,e,Oi)}))),CA(On,Ji)}),CA(rt,xt)},nt=rt=>{var xt,On=r8A();Ia(dA(On),e,"selection",{get selection(){return P()}},Ti=>{var zi=dr();Se(()=>Lt(zi,(K(P()),K(X()),wA(()=>P()[X()])))),CA(Ti,zi)}),Se(()=>xt=ii(On,1,"selected-item svelte-1ul7oo4",null,xt,{"hide-selected-item":c(o)})),CA(rt,On)};jA(le,rt=>{b()?rt(Ne):rt(nt,!1)}),CA(mA,FA)};jA(Eo,mA=>{c(n)&&mA(Za)});var vo=_A(Eo,2);AD(vo,()=>Me(Me({readOnly:!fA()},c(oA)),{},{placeholder:c(r),style:XA(),disabled:F()}),void 0,void 0,void 0,"svelte-1ul7oo4",!0),Oo(vo,mA=>S(mA),()=>S());var Ta=_A(_i,2),Jn=dA(Ta),Ui=mA=>{var FA=s8A();Ia(dA(FA),e,"loading-icon",{},le=>{(function(Ne){CA(Ne,A8A())})(le)}),CA(mA,FA)};jA(Jn,mA=>{ee()&&mA(Ui)});var qt=_A(Jn,2),Nn=mA=>{var FA=l8A();Ia(dA(FA),e,"clear-icon",{},le=>{K_(le)}),fe("click",FA,hn),CA(mA,FA)};jA(qt,mA=>{c(a)&&mA(Nn)});var ho=_A(qt,2),Fo=mA=>{var FA=g8A();Ia(dA(FA),e,"chevron-icon",{get listOpen(){return NA()}},le=>{(function(Ne){CA(Ne,X6A())})(le)}),CA(mA,FA)};jA(ho,mA=>{he()&&mA(Fo)});var xA=_A(Ta,2);Ia(xA,e,"input-hidden",{get value(){return P()}},mA=>{var FA=c8A();Se(le=>{_n(FA,"name",v()),Dd(FA,le)},[()=>(K(P()),wA(()=>P()?JSON.stringify(P()):null))]),CA(mA,FA)});var Ae=_A(xA,2),De=mA=>{var FA=Fi();Ia(et(FA),e,"required",{get value(){return P()}},le=>{CA(le,C8A())}),CA(mA,FA)};return jA(Ae,mA=>{K(pA()),K(P()),wA(()=>pA()&&(!P()||P().length===0))&&mA(De)}),_r(()=>fe("pointerup",yo,gI(gn))),Oo(yo,mA=>k(mA),()=>k()),ms(yo,mA=>No?.(mA)),Se(()=>{var mA;ra=ii(yo,1,"svelte-select ".concat((mA=pt())!==null&&mA!==void 0?mA:""),"svelte-1ul7oo4",ra,{multi:b(),disabled:F(),focused:z(),"list-open":NA(),"show-chevron":he(),error:$A()}),mg(yo,UA())}),fe("keydown",vo,tt),fe("blur",vo,Oe),fe("focus",vo,ze),lD(vo,Z),CA(t,yo),jt(e,"getFilteredItems",YA),jt(e,"handleClear",hn),Ft(Xo)}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -table.jse-transform-wizard.svelte-9wqi8y { - border-collapse: collapse; - border-spacing: 0; - width: 100%; -} -table.jse-transform-wizard.svelte-9wqi8y input:where(.svelte-9wqi8y) { - font-family: inherit; - font-size: inherit; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) th:where(.svelte-9wqi8y) { - font-weight: normal; - text-align: left; - width: 60px; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) { - width: 100%; - display: flex; - flex-direction: row; - margin-bottom: calc(0.5 * var(--jse-padding, 10px)); -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select .multi-item { - align-items: center; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select .value-container { - gap: 0 !important; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-filter-path { - flex: 4; - margin-right: calc(0.5 * var(--jse-padding, 10px)); -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-filter-relation { - flex: 1.5; - margin-right: calc(0.5 * var(--jse-padding, 10px)); -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-sort-path { - flex: 3; - margin-right: calc(0.5 * var(--jse-padding, 10px)); -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-sort-direction { - flex: 1; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-projection-paths { - flex: 1; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select input { - box-sizing: border-box; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .jse-filter-value:where(.svelte-9wqi8y) { - flex: 4; - padding: 4px 8px; - border: var(--jse-input-border, 1px solid #d8dbdf); - border-radius: var(--jse-input-radius, 3px); - outline: none; - background: var(--jse-input-background, var(--jse-background-color, #fff)); - color: inherit; -} -table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .jse-filter-value:where(.svelte-9wqi8y):focus { - border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); -}`);var d8A=JA('
          Filter
          Sort
          Pick
          ');function B8A(t,e){var A,i,n,o,a;Nt(e,!1);var r=EA(void 0,!0),s=EA(void 0,!0),l=EA(void 0,!0),g=EA(void 0,!0),C=EA(void 0,!0),I=EA(void 0,!0),d=or("jsoneditor:TransformWizard"),h=L(e,"json",9),E=L(e,"queryOptions",29,()=>({})),f=L(e,"onChange",9),m=["==","!=","<","<=",">",">="].map(zA=>({value:zA,label:zA})),v=[{value:"asc",label:"ascending"},{value:"desc",label:"descending"}],k=EA((A=E())!==null&&A!==void 0&&(A=A.filter)!==null&&A!==void 0&&A.path?BI(E().filter.path):void 0,!0),S=EA((i=m.find(zA=>{var pA;return zA.value===((pA=E().filter)===null||pA===void 0?void 0:pA.relation)}))!==null&&i!==void 0?i:m[0],!0),b=EA(((n=E())===null||n===void 0||(n=n.filter)===null||n===void 0?void 0:n.value)||"",!0),x=EA((o=E())!==null&&o!==void 0&&(o=o.sort)!==null&&o!==void 0&&o.path?BI(E().sort.path):void 0,!0),F=EA((a=v.find(zA=>{var pA;return zA.value===((pA=E().sort)===null||pA===void 0?void 0:pA.direction)}))!==null&&a!==void 0?a:v[0],!0);KA(()=>K(h()),()=>{N(r,Array.isArray(h()))}),KA(()=>(c(r),K(h())),()=>{N(s,c(r)?AR(h()):[])}),KA(()=>(c(r),K(h())),()=>{N(l,c(r)?AR(h(),!0):[])}),KA(()=>(c(s),BI),()=>{N(g,c(s).map(BI))}),KA(()=>(c(l),BI),()=>{N(C,c(l)?c(l).map(BI):[])}),KA(()=>(K(E()),c(C),Mi),()=>{var zA;N(I,(zA=E())!==null&&zA!==void 0&&(zA=zA.projection)!==null&&zA!==void 0&&zA.paths&&c(C)?E().projection.paths.map(pA=>c(C).find(PA=>Mi(PA.value,pA))).filter(pA=>!!pA):void 0)}),KA(()=>c(k),()=>{var zA,pA,PA;pA=(zA=c(k))===null||zA===void 0?void 0:zA.value,Mi((PA=E())===null||PA===void 0||(PA=PA.filter)===null||PA===void 0?void 0:PA.path,pA)||(d("changeFilterPath",pA),E(Hr(E(),["filter","path"],pA,!0)),f()(E()))}),KA(()=>c(S),()=>{var zA,pA,PA;pA=(zA=c(S))===null||zA===void 0?void 0:zA.value,Mi((PA=E())===null||PA===void 0||(PA=PA.filter)===null||PA===void 0?void 0:PA.relation,pA)||(d("changeFilterRelation",pA),E(Hr(E(),["filter","relation"],pA,!0)),f()(E()))}),KA(()=>c(b),()=>{var zA,pA;zA=c(b),Mi((pA=E())===null||pA===void 0||(pA=pA.filter)===null||pA===void 0?void 0:pA.value,zA)||(d("changeFilterValue",zA),E(Hr(E(),["filter","value"],zA,!0)),f()(E()))}),KA(()=>c(x),()=>{var zA,pA,PA;pA=(zA=c(x))===null||zA===void 0?void 0:zA.value,Mi((PA=E())===null||PA===void 0||(PA=PA.sort)===null||PA===void 0?void 0:PA.path,pA)||(d("changeSortPath",pA),E(Hr(E(),["sort","path"],pA,!0)),f()(E()))}),KA(()=>c(F),()=>{var zA,pA,PA;pA=(zA=c(F))===null||zA===void 0?void 0:zA.value,Mi((PA=E())===null||PA===void 0||(PA=PA.sort)===null||PA===void 0?void 0:PA.direction,pA)||(d("changeSortDirection",pA),E(Hr(E(),["sort","direction"],pA,!0)),f()(E()))}),KA(()=>c(I),()=>{(function(zA){var pA;Mi((pA=E())===null||pA===void 0||(pA=pA.projection)===null||pA===void 0?void 0:pA.paths,zA)||(d("changeProjectionPaths",zA),E(Hr(E(),["projection","paths"],zA,!0)),f()(E()))})(c(I)?c(I).map(zA=>zA.value):void 0)}),Rn(),ni(!0);var z=d8A(),P=dA(z),Z=dA(P),tA=_A(dA(Z)),W=dA(tA),BA=dA(W);Cd(BA,{class:"jse-filter-path",showChevron:!0,get items(){return c(g)},get value(){return c(k)},set value(zA){N(k,zA)},$$legacy:!0});var X=_A(BA,2);Cd(X,{class:"jse-filter-relation",showChevron:!0,clearable:!1,get items(){return m},get value(){return c(S)},set value(zA){N(S,zA)},$$legacy:!0});var iA=_A(X,2),AA=_A(Z),IA=_A(dA(AA)),aA=dA(IA),rA=dA(aA);Cd(rA,{class:"jse-sort-path",showChevron:!0,get items(){return c(g)},get value(){return c(x)},set value(zA){N(x,zA)},$$legacy:!0}),Cd(_A(rA,2),{class:"jse-sort-direction",showChevron:!0,clearable:!1,get items(){return v},get value(){return c(F)},set value(zA){N(F,zA)},$$legacy:!0});var uA=_A(AA),UA=_A(dA(uA)),$A=dA(UA);Cd(dA($A),{class:"jse-projection-paths",multiple:!0,showChevron:!0,get items(){return c(C)},get value(){return c(I)},set value(zA){N(I,zA)},$$legacy:!0}),lD(iA,()=>c(b),zA=>N(b,zA)),CA(t,z),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-select-query-language.svelte-jrd4q2 { - position: relative; - width: 32px; -} -.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) { - position: absolute; - top: 0; - right: 0; - display: flex; - flex-direction: column; - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); -} -.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) .jse-query-language:where(.svelte-jrd4q2) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - text-align: left; - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - white-space: nowrap; - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); - background: var(--jse-context-menu-background, #656565); -} -.jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) .jse-query-language:where(.svelte-jrd4q2):hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -}`);var E8A=JA(''),h8A=JA('
          ');function Q8A(t,e){Nt(e,!1);var A=L(e,"queryLanguages",8),i=L(e,"queryLanguageId",12),n=L(e,"onChangeQueryLanguage",8);ni();var o=h8A();da(dA(o),5,A,ka,(a,r)=>{var s,l=E8A(),g=dA(l),C=h=>{tn(h,{get data(){return j9}})},I=h=>{tn(h,{get data(){return q9}})};jA(g,h=>{c(r),K(i()),wA(()=>c(r).id===i())?h(C):h(I,!1)});var d=_A(g);Se(()=>{var h;s=ii(l,1,"jse-query-language svelte-jrd4q2",null,s,{selected:c(r).id===i()}),_n(l,"title",(c(r),wA(()=>"Select ".concat(c(r).name," as query language")))),Lt(d," ".concat((c(r),(h=wA(()=>c(r).name))!==null&&h!==void 0?h:"")))}),fe("click",l,()=>{return h=c(r).id,i(h),void n()(h);var h}),CA(a,l)}),CA(t,o),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-header.svelte-1k211ye { - display: flex; - background: var(--jse-theme-color, #3883fa); - color: var(--jse-menu-color, var(--jse-text-color-inverse, #fff)); -} -.jse-header.svelte-1k211ye .jse-title:where(.svelte-1k211ye) { - flex: 1; - padding: 5px; - vertical-align: middle; -} -.jse-header.svelte-1k211ye button:where(.svelte-1k211ye) { - border: none; - background: transparent; - min-width: 32px; - color: inherit; - cursor: pointer; -} -.jse-header.svelte-1k211ye button:where(.svelte-1k211ye):hover { - background: rgba(255, 255, 255, 0.1); -}`);var u8A=JA(''),f8A=JA('
          ');function wD(t,e){Nt(e,!1);var A=L(e,"title",9,"Modal"),i=L(e,"fullScreenButton",9,!1),n=L(e,"fullscreen",13,!1),o=L(e,"onClose",9,void 0);ni(!0);var a=f8A(),r=dA(a),s=dA(r),l=_A(r,2);Ia(l,e,"actions",{},null);var g=_A(l,2),C=d=>{var h=u8A(),E=dA(h),f=it(()=>n()?kz:yz);tn(E,{get data(){return c(f)}}),fe("click",h,()=>n(!n())),CA(d,h)};jA(g,d=>{i()&&d(C)});var I=_A(g,2);tn(dA(I),{get data(){return D4}}),Se(()=>Lt(s,A())),fe("click",I,()=>{var d;return(d=o())===null||d===void 0?void 0:d()}),CA(t,a),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-config.svelte-5gkegr { - border: none; - background: transparent; - min-width: 32px; - color: inherit; - cursor: pointer; -} -.jse-config.svelte-5gkegr:hover { - background: rgba(255, 255, 255, 0.1); -} -.jse-config.hide.svelte-5gkegr { - display: none; -}`);var p8A=JA(''),U_=or("jsoneditor:AutoScrollHandler");function RZ(t){var e,A;function i(r){return r<20?200:r<50?400:1200}function n(){if(t){var r=.05*(e||0);t.scrollTop+=r}}function o(r){A&&r===e||(a(),U_("startAutoScroll",r),e=r,A=setInterval(n,50))}function a(){A&&(U_("stopAutoScroll"),clearInterval(A),A=void 0,e=void 0)}return U_("createAutoScrollHandler",t),{onDrag:function(r){if(t){var s=r.clientY,{top:l,bottom:g}=t.getBoundingClientRect();sg?o(i(s-g)):a()}},onDragEnd:function(){a()}}}var m8A=(t,e,A,i)=>(t/=i/2)<1?A/2*t*t+e:-A/2*(--t*(t-2)-1)+e,R$=()=>{var t,e,A,i,n,o,a,r,s,l,g,C,I;function d(f){return f.getBoundingClientRect().top-(t.getBoundingClientRect?t.getBoundingClientRect().top:0)+A}function h(f){t.scrollTo?t.scrollTo(t.scrollLeft,f):t.scrollTop=f}function E(f){l||(l=f),h(o(g=f-l,A,r,s)),I=!0,g1&&arguments[1]!==void 0?arguments[1]:{};switch(s=1e3,n=m.offset||0,C=m.callback,o=m.easing||m8A,a=m.a11y||!1,typeof m.container){case"object":t=m.container;break;case"string":t=document.querySelector(m.container);break;default:t=window.document.documentElement}switch(A=t.scrollTop,typeof f){case"number":e=void 0,a=!1,i=A+f;break;case"object":i=d(e=f);break;case"string":e=document.querySelector(f),i=d(e)}switch(r=i-A+n,typeof m.duration){case"number":s=m.duration;break;case"function":s=m.duration(r)}I?l=0:requestAnimationFrame(E)}};function vh(t,e){var A=Date.now(),i=t();return e(Date.now()-A),i}var fh=or("validation"),w8A={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function NZ(t,e,A,i){return OR(t,e,A,i,w8A)}function N$(t,e,A,i){if(fh("validateJSON"),!e)return[];if(A!==i){var n=A.stringify(t);return e(n!==void 0?i.parse(n):void 0)}return e(t)}function D8A(t,e,A,i){if(fh("validateText"),t.length>104857600)return{validationErrors:[{path:[],message:"Validation turned off: the document is too large",severity:hc.info}]};if(t.length!==0)try{var n=vh(()=>A.parse(t),s=>fh("validate: parsed json in ".concat(s," ms")));if(!e)return;var o=A===i?n:vh(()=>i.parse(t),s=>fh("validate: parsed json with the validationParser in ".concat(s," ms"))),a=vh(()=>e(o),s=>fh("validate: validated json in ".concat(s," ms")));return en(a)?void 0:{validationErrors:a}}catch(s){var r=vh(()=>(function(l,g){if(l.length>A6A)return!1;try{return g.parse(ag(l)),!0}catch(C){return!1}})(t,A),l=>fh("validate: checked whether repairable in ".concat(l," ms")));return{parseError:Th(t,s.message||s.toString()),isRepairable:r}}}var z5=or("jsoneditor:FocusTracker");function qR(t){var e,{onMount:A,onDestroy:i,getWindow:n,hasFocus:o,onFocus:a,onBlur:r}=t,s=!1;function l(){var C=o();C&&(clearTimeout(e),s||(z5("focus"),a(),s=C))}function g(){s&&(clearTimeout(e),e=setTimeout(()=>{o()||(z5("blur"),s=!1,r())}))}A(()=>{z5("mount FocusTracker");var C=n();C&&(C.addEventListener("focusin",l,!0),C.addEventListener("focusout",g,!0))}),i(()=>{z5("destroy FocusTracker");var C=n();C&&(C.removeEventListener("focusin",l,!0),C.removeEventListener("focusout",g,!0))})}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-message.svelte-cbvd26 { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - padding: var(--jse-padding, 10px); - display: flex; - gap: var(--jse-padding, 10px); - flex-wrap: wrap; - align-items: stretch; -} -.jse-message.jse-success.svelte-cbvd26 { - background: var(--message-success-background, #9ac45d); - color: var(--jse-message-success-color, #fff); -} -.jse-message.svelte-cbvd26 .jse-text:where(.svelte-cbvd26) { - display: flex; - flex: 1; - min-width: 60%; - align-items: center; -} -.jse-message.svelte-cbvd26 .jse-text.jse-clickable:where(.svelte-cbvd26) { - cursor: pointer; -} -.jse-message.svelte-cbvd26 .jse-text.jse-clickable:where(.svelte-cbvd26):hover { - background-color: rgba(255, 255, 255, 0.1); -} -.jse-message.jse-error.svelte-cbvd26 { - background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); - color: var(--jse-message-error-color, #fff); -} -.jse-message.jse-warning.svelte-cbvd26 { - background: var(--jse-message-warning-background, #ffde5c); - color: var(--jse-message-warning-color, #4d4d4d); -} -.jse-message.jse-info.svelte-cbvd26 { - background: var(--jse-message-info-background, #4f91ff); - color: var(--jse-message-info-color, #fff); -} -.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) { - display: flex; - gap: var(--jse-padding, 10px); -} -.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) button.jse-action:where(.svelte-cbvd26) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-message-action-background, rgba(255, 255, 255, 0.2)); - color: inherit; - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); -} -.jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) button.jse-action:where(.svelte-cbvd26):hover { - background: var(--jse-message-action-background-highlight, rgba(255, 255, 255, 0.3)); -}`);var y8A=JA(''),v8A=JA('
          ');function Yl(t,e){Nt(e,!1);var A=L(e,"type",9,"success"),i=L(e,"icon",9,void 0),n=L(e,"message",9,void 0),o=L(e,"actions",25,()=>[]),a=L(e,"onClick",9,void 0),r=L(e,"onClose",9,void 0);r()&&Dg(r()),ni(!0);var s,l=v8A(),g=dA(l),C=dA(g),I=dA(C),d=E=>{tn(E,{get data(){return i()}})};jA(I,E=>{i()&&E(d)});var h=_A(I);da(_A(g,2),5,o,ka,(E,f)=>{var m=y8A(),v=dA(m),k=b=>{tn(b,{get data(){return c(f),wA(()=>c(f).icon)}})};jA(v,b=>{c(f),wA(()=>c(f).icon)&&b(k)});var S=_A(v);Se(()=>{var b;_n(m,"title",(c(f),wA(()=>c(f).title))),m.disabled=(c(f),wA(()=>c(f).disabled)),Lt(S," ".concat((c(f),(b=wA(()=>c(f).text))!==null&&b!==void 0?b:"")))}),fe("click",m,()=>{c(f).onClick&&c(f).onClick()}),fe("mousedown",m,()=>{c(f).onMouseDown&&c(f).onMouseDown()}),CA(E,m)}),Se(()=>{var E,f;ii(l,1,"jse-message jse-".concat((E=A())!==null&&E!==void 0?E:""),"svelte-cbvd26"),s=ii(g,1,"jse-text svelte-cbvd26",null,s,{"jse-clickable":!!a()}),Lt(h," ".concat((f=n())!==null&&f!==void 0?f:""))}),fe("click",g,function(){a()&&a()()}),CA(t,l),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-validation-errors-overview.svelte-1342rh4 { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - overflow: auto; - max-height: 25%; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) { - border-collapse: collapse; - width: 100%; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) { - cursor: pointer; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-error:where(.svelte-1342rh4) { - background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); - color: var(--jse-message-error-color, #fff); -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-warning:where(.svelte-1342rh4) { - background: var(--jse-message-warning-background, #ffde5c); - color: var(--jse-message-warning-color, #4d4d4d); -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-warning:where(.svelte-1342rh4):hover { - filter: brightness(105%); -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-info:where(.svelte-1342rh4) { - background: var(--jse-message-info-background, #4f91ff); - color: var(--jse-message-info-color, #fff); -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4):hover { - filter: brightness(110%); -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td:where(.svelte-1342rh4) { - padding: 4px var(--jse-padding, 10px); - vertical-align: middle; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-icon:where(.svelte-1342rh4) { - width: 36px; - box-sizing: border-box; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) { - width: 36px; - box-sizing: border-box; - padding: 0; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) button.jse-validation-errors-collapse:where(.svelte-1342rh4) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - width: 36px; - height: 26px; - cursor: pointer; -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) button.jse-validation-errors-collapse:where(.svelte-1342rh4):hover { - background-color: rgba(255, 255, 255, 0.2); -} -.jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td:where(.svelte-1342rh4) div.jse-validation-errors-expand:where(.svelte-1342rh4) { - display: inline-block; - position: relative; - top: 3px; -}`);var b8A=JA(''),M8A=JA(' '),S8A=JA(' '),k8A=JA('
          '),x8A=JA('
          '),_8A=JA('
          ');function VR(t,e){Nt(e,!1);var A=EA(void 0,!0),i=L(e,"validationErrors",9),n=L(e,"selectError",9),o=EA(!0,!0);function a(){N(o,!1)}function r(){N(o,!0)}KA(()=>K(i()),()=>{N(A,i().length)}),Rn(),ni(!0);var s=Fi(),l=et(s),g=C=>{var I=_8A(),d=dA(I),h=f=>{var m=k8A(),v=dA(m),k=dA(v);da(k,1,()=>(K(gD),K(i()),K(U5),wA(()=>gD(i(),U5))),ka,(x,F,z)=>{var P=M8A(),Z=dA(P);tn(dA(Z),{get data(){return z2}});var tA=_A(Z),W=dA(tA),BA=_A(tA),X=dA(BA),iA=dA(_A(BA)),AA=IA=>{var aA=b8A();tn(dA(aA),{get data(){return Sz}}),fe("click",aA,vC(a)),CA(IA,aA)};jA(iA,IA=>{K(i()),wA(()=>z===0&&i().length>1)&&IA(AA)}),Se(IA=>{var aA;ii(P,1,"jse-validation-".concat((c(F),(aA=wA(()=>c(F).severity))!==null&&aA!==void 0?aA:"")),"svelte-1342rh4"),Lt(W,IA),Lt(X,(c(F),wA(()=>c(F).message)))},[()=>(K(Bl),c(F),wA(()=>Bl(c(F).path)))]),fe("click",P,()=>{setTimeout(()=>n()(c(F)))}),CA(x,P)});var S=_A(k),b=x=>{var F=S8A(),z=_A(dA(F),2),P=dA(z);Se(()=>Lt(P,"(and ".concat(c(A)-U5," more errors)"))),CA(x,F)};jA(S,x=>{c(A)>U5&&x(b)}),CA(f,m)},E=f=>{var m=x8A(),v=dA(m),k=dA(v),S=dA(k);tn(dA(S),{get data(){return z2}});var b=dA(_A(S));tn(dA(_A(b)),{get data(){return $9}}),Se(x=>{var F;ii(k,1,"jse-validation-".concat(x??""),"svelte-1342rh4"),Lt(b,"".concat((F=c(A))!==null&&F!==void 0?F:""," validation errors "))},[()=>(K(i()),wA(()=>{return x=i(),[hc.error,hc.warning,hc.info].find(F=>x.some(z=>z.severity===F));var x}))]),fe("click",k,r),CA(f,m)};jA(d,f=>{c(o)||c(A)===1?f(h):f(E,!1)}),CA(C,I)};jA(l,C=>{K(en),K(i()),wA(()=>!en(i()))&&C(g)}),CA(t,s),Ft()}function DD(t,e){if(t)return t.addEventListener("keydown",A),{destroy(){t.removeEventListener("keydown",A)}};function A(i){i.key==="Escape"&&(i.preventDefault(),i.stopPropagation(),e())}}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -dialog.jse-modal.svelte-2aoco4 { - border-radius: 3px; - font-size: var(--jse-padding, 10px); - border: none; - padding: 0; - display: flex; - min-width: 0; - margin: auto; - overflow: visible; - transition: width 0.1s ease-in-out, height 0.1s ease-in-out; -} -dialog.jse-modal.jse-sort-modal.svelte-2aoco4 { - width: 400px; -} -dialog.jse-modal.jse-repair-modal.svelte-2aoco4 { - width: 600px; - height: 500px; -} -dialog.jse-modal.jse-jsoneditor-modal.svelte-2aoco4 { - width: 800px; - height: 600px; -} -dialog.jse-modal.jse-transform-modal.svelte-2aoco4 { - width: 1200px; - height: 800px; -} -dialog.jse-modal.jse-fullscreen.svelte-2aoco4 { - width: 100%; - height: 100%; -} -dialog.jse-modal.svelte-2aoco4::backdrop { - background: var(--jse-overlay-background, rgba(0, 0, 0, 0.3)); -} -dialog.jse-modal[open].svelte-2aoco4 { - animation: svelte-2aoco4-zoom 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); -} -dialog.jse-modal[open].svelte-2aoco4::backdrop { - animation: svelte-2aoco4-fade 0.2s ease-out; -} -dialog.jse-modal.svelte-2aoco4 .jse-modal-inner:where(.svelte-2aoco4) { - flex: 1; - display: flex; - flex-direction: column; - min-width: 0; - min-height: 0; - padding: 0; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - line-height: normal; - background: var(--jse-modal-background, #f5f5f5); - color: var(--jse-text-color, #4d4d4d); -} -@keyframes svelte-2aoco4-zoom { - from { - transform: scale(0.95); - } - to { - transform: scale(1); - } -} -@keyframes svelte-2aoco4-fade { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -dialog.jse-modal.svelte-2aoco4 .svelte-select { - --border: var(--jse-svelte-select-border, 1px solid #d8dbdf); - --item-is-active-bg: var(--jse-item-is-active-bg, #3883fa); - --border-radius: var(--jse-svelte-select-border-radius, 3px); - --background: var(--jse-svelte-select-background, #fff); - --padding: var(--jse-svelte-select-padding, 0 10px); - --multi-select-padding: var(--jse-svelte-select-multi-select-padding, 0 10px); - --font-size: var(--jse-svelte-select-font-size, var(--jse-font-size, 16px)); - --height: 36px; - --multi-item-height: 28px; - --multi-item-margin: 2px; - --multi-item-padding: 2px 8px; - --multi-item-border-radius: 6px; - --indicator-top: 8px; -}`);var R8A=JA('
          ');function Of(t,e){Nt(e,!1);var A=L(e,"className",8,void 0),i=L(e,"fullscreen",8,!1),n=L(e,"onClose",8),o=EA();function a(){n()()}As(()=>c(o).showModal()),Dg(()=>c(o).close()),ni();var r,s=R8A(),l=dA(s);Ia(dA(l),e,"default",{},null),Oo(s,g=>N(o,g),()=>c(o)),_r(()=>fe("close",s,a)),_r(()=>{return fe("pointerdown",s,(g=a,function(){for(var C=arguments.length,I=new Array(C),d=0;dfe("cancel",s,gI(function(g){yf.call(this,e,g)}))),ms(s,(g,C)=>DD?.(g,C),()=>a),Se(g=>r=ii(s,1,g,"svelte-2aoco4",r,{"jse-fullscreen":i()}),[()=>bI((K(wc),K(A()),wA(()=>wc("jse-modal",A()))))]),CA(t,s),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-modal-contents.svelte-10a6ob6 { - flex: 1; - display: flex; - flex-direction: column; - padding: 20px; - overflow: auto; - min-width: 0; - min-height: 0; -} -.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-top: var(--jse-padding, 10px); -} -.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} - -.jse-shortcuts.svelte-10a6ob6 { - display: flex; - flex-wrap: wrap; - justify-content: space-around; - margin: calc(2 * var(--jse-padding, 10px)) 0; -} -.jse-shortcuts.svelte-10a6ob6 .jse-shortcut:where(.svelte-10a6ob6) .jse-key:where(.svelte-10a6ob6) { - font-size: 200%; - color: var(--jse-theme-color, #3883fa); -}`);var N8A=JA('
          Clipboard permission is disabled by your browser. You can use:
          for copy
          for cut
          for paste
          ',1);function F$(t,e){Nt(e,!1);var A=L(e,"onClose",9),i=NR()?"\u2318":"Ctrl";ni(!0),Of(t,{get onClose(){return A()},className:"jse-copy-paste",children:(n,o)=>{var a=N8A(),r=et(a);wD(r,{title:"Copying and pasting",get onClose(){return A()}});var s=_A(r,2),l=_A(dA(s),2),g=dA(l),C=dA(g),I=dA(C),d=_A(g,2),h=dA(d),E=dA(h),f=dA(_A(d,2)),m=dA(f),v=dA(_A(l,2));Se(()=>{Lt(I,"".concat(i,"+C")),Lt(E,"".concat(i,"+X")),Lt(m,"".concat(i,"+V"))}),fe("click",v,function(){for(var k,S=arguments.length,b=new Array(S),x=0;x'),L8A=JA('
          '),G8A=JA(''),K8A=JA('
          ');function KD(t,e){Nt(e,!1);var A=L(e,"items",25,()=>[]);ni(!0);var i=K8A(),n=dA(i);Ia(n,e,"left",{},null);var o=_A(n,2);da(o,1,A,ka,(a,r)=>{var s=Fi(),l=et(s),g=I=>{CA(I,F8A())},C=I=>{var d=Fi(),h=et(d),E=m=>{CA(m,L8A())},f=m=>{var v=Fi(),k=et(v),S=x=>{var F=G8A(),z=dA(F),P=W=>{tn(W,{get data(){return c(r),wA(()=>c(r).icon)}})};jA(z,W=>{c(r),wA(()=>c(r).icon)&&W(P)});var Z=_A(z,2),tA=W=>{var BA=dr();Se(()=>Lt(BA,(c(r),wA(()=>c(r).text)))),CA(W,BA)};jA(Z,W=>{c(r),wA(()=>c(r).text)&&W(tA)}),Se(()=>{var W;ii(F,1,"jse-button ".concat((c(r),(W=wA(()=>c(r).className))!==null&&W!==void 0?W:"")),"svelte-3erbu0"),_n(F,"title",(c(r),wA(()=>c(r).title))),F.disabled=(c(r),wA(()=>c(r).disabled||!1))}),fe("click",F,function(){for(var W,BA=arguments.length,X=new Array(BA),iA=0;iA{var F=dr();Se(z=>Lt(F,z),[()=>(c(r),wA(()=>(function(z){return console.error("Unknown type of menu item",z),"???"})(c(r))))]),CA(x,F)};jA(k,x=>{K(bC),c(r),wA(()=>bC(c(r)))?x(S):x(b,!1)},!0),CA(m,v)};jA(h,m=>{K(nR),c(r),wA(()=>nR(c(r)))?m(E):m(f,!1)},!0),CA(I,d)};jA(l,I=>{K(dI),c(r),wA(()=>dI(c(r)))?I(g):I(C,!1)}),CA(a,s)}),Ia(_A(o,2),e,"right",{},null),CA(t,i),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-json-repair-component.svelte-16jv58j { - flex: 1; - display: flex; - flex-direction: column; - background: var(--jse-background-color, #fff); - color: var(--jse-text-color, #4d4d4d); -} -.jse-json-repair-component.svelte-16jv58j .jse-info:where(.svelte-16jv58j) { - padding: calc(0.5 * var(--jse-padding, 10px)); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - vertical-align: center; -} -.jse-json-repair-component.svelte-16jv58j .jse-json-text:where(.svelte-16jv58j) { - flex: 1; - border: none; - padding: 2px; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - background: var(--jse-input-background, var(--jse-background-color, #fff)); - color: var(--jse-text-color, #4d4d4d); - resize: none; - outline: none; -}`);var U8A=JA('
          Repair invalid JSON, then click apply
          '),T8A=JA('
          ');function J8A(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=EA(void 0,!0),o=EA(void 0,!0),a=EA(void 0,!0),r=EA(void 0,!0),s=L(e,"text",13,""),l=L(e,"readOnly",9,!1),g=L(e,"onParse",9),C=L(e,"onRepair",9),I=L(e,"onChange",9,void 0),d=L(e,"onApply",9),h=L(e,"onCancel",9),E=or("jsoneditor:JSONRepair"),f=EA(void 0,!0);function m(){if(c(f)&&c(A)){var tA=c(A).position!==void 0?c(A).position:0;c(f).setSelectionRange(tA,tA),c(f).focus()}}function v(){d()(s())}function k(){try{s(C()(s())),I()&&I()(s())}catch(tA){}}var S=EA(void 0,!0);KA(()=>K(s()),()=>{N(A,(function(tA){try{return void g()(tA)}catch(W){return Th(tA,W.message)}})(s()))}),KA(()=>K(s()),()=>{N(i,(function(tA){try{return C()(tA),!0}catch(W){return!1}})(s()))}),KA(()=>c(A),()=>{E("error",c(A))}),KA(()=>K(h()),()=>{N(S,[{type:"space"},{type:"button",icon:D4,title:"Cancel repair",className:"jse-cancel",onClick:h()}])}),KA(()=>tS,()=>{N(n,{icon:tS,text:"Show me",title:"Scroll to the error location",onClick:m})}),KA(()=>CC,()=>{N(o,{icon:CC,text:"Auto repair",title:"Automatically repair JSON",onClick:k})}),KA(()=>(c(i),c(n),c(o)),()=>{N(a,c(i)?[c(n),c(o)]:[c(n)])}),KA(()=>K(l()),()=>{N(r,[{icon:J8,text:"Apply",title:"Apply fixed JSON",disabled:l(),onClick:v}])}),Rn(),ni(!0);var b=T8A(),x=dA(b);KD(x,{get items(){return c(S)},$$slots:{left:(tA,W)=>{CA(tA,U8A())}}});var F=_A(x,2),z=tA=>{var W=it(()=>(c(A),wA(()=>"Cannot parse JSON: ".concat(c(A).message))));Yl(tA,{type:"error",get icon(){return z2},get message(){return c(W)},get actions(){return c(a)}})},P=tA=>{Yl(tA,{type:"success",message:"JSON is valid now and can be parsed.",get actions(){return c(r)}})};jA(F,tA=>{c(A)?tA(z):tA(P,!1)});var Z=_A(F,2);Oo(Z,tA=>N(f,tA),()=>c(f)),Se(()=>{Z.readOnly=l(),Dd(Z,s())}),fe("input",Z,function(tA){E("handleChange");var W=tA.target.value;s()!==W&&(s(W),I()&&I()(s()))}),CA(t,b),Ft()}function L$(t,e){Nt(e,!1);var A=L(e,"text",13),i=L(e,"onParse",9),n=L(e,"onRepair",9),o=L(e,"onApply",9),a=L(e,"onClose",9);function r(l){o()(l),a()()}function s(){a()()}ni(!0),Of(t,{get onClose(){return a()},className:"jse-repair-modal",children:(l,g)=>{J8A(l,{get onParse(){return i()},get onRepair(){return n()},onApply:r,onCancel:s,get text(){return A()},set text(C){A(C)},$$legacy:!0})},$$slots:{default:!0}}),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -div.jse-collapsed-items.svelte-1v6dhm4 { - margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); - padding: calc(0.5 * var(--jse-padding, 10px)); - border: 8px solid transparent; - border-width: 8px 0; - background-color: var(--jse-contents-background-color, transparent); - background-image: linear-gradient(var(--jse-collapsed-items-background-color, #f5f5f5), var(--jse-collapsed-items-background-color, #f5f5f5)), linear-gradient(to bottom right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to bottom left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%); - background-repeat: repeat, repeat-x, repeat-x, repeat-x, repeat-x; - background-position: 0 0, 8px 0, 8px 0, 8px 100%, 8px 100%; - background-size: auto auto, 16px 16px, 16px 16px, 16px 16px, 16px 16px; - background-clip: padding-box, border-box, border-box, border-box, border-box; - background-origin: padding-box, border-box, border-box, border-box, border-box; - display: flex; -} -div.jse-collapsed-items.jse-selected.svelte-1v6dhm4 { - background-color: var(--jse-selection-background-color, #d3d3d3); - --jse-collapsed-items-background-color: var(--jse-collapsed-items-selected-background-color, #c2c2c2); -} -div.jse-collapsed-items.svelte-1v6dhm4 div.jse-text:where(.svelte-1v6dhm4), -div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4) { - margin: 0 calc(0.5 * var(--jse-padding, 10px)); -} -div.jse-collapsed-items.svelte-1v6dhm4 div.jse-text:where(.svelte-1v6dhm4) { - display: inline; -} -div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4) { - font-family: inherit; - font-size: inherit; - color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); - background: none; - border: none; - padding: 0; - text-decoration: underline; - cursor: pointer; -} -div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4):hover, div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4):focus { - color: var(--jse-collapsed-items-link-color-highlight, #ee5341); -}`);var O8A=JA(''),Y8A=JA('
          ');function H8A(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=EA(void 0,!0),o=EA(void 0,!0),a=EA(void 0,!0),r=L(e,"visibleSections",9),s=L(e,"sectionIndex",9),l=L(e,"total",9),g=L(e,"path",9),C=L(e,"selection",9),I=L(e,"onExpandSection",9),d=L(e,"context",9);KA(()=>(K(r()),K(s())),()=>{N(A,r()[s()])}),KA(()=>c(A),()=>{N(i,c(A).end)}),KA(()=>(K(r()),K(s()),K(l())),()=>{N(n,r()[s()+1]?r()[s()+1].start:l())}),KA(()=>(K(d()),K(C()),K(g()),c(i)),()=>{N(o,Uf(d().getJson(),C(),g().concat(String(c(i)))))}),KA(()=>(c(i),c(n)),()=>{N(a,(function(S,b){var x={start:S,end:Math.min(iR(S),b)},F=Math.max(CD((S+b)/2),S),z={start:F,end:Math.min(iR(F),b)},P=CD(b),Z=P===b?P-Ff:P,tA={start:Math.max(Z,S),end:b},W=[x],BA=z.start>=x.end&&z.end<=tA.start;return BA&&W.push(z),tA.start>=(BA?z.end:x.end)&&W.push(tA),W})(c(i),c(n)))}),Rn(),ni(!0);var h,E,f=Y8A(),m=dA(f),v=dA(m),k=dA(v);da(_A(v,2),1,()=>c(a),ka,(S,b)=>{var x=O8A(),F=dA(x);Se(()=>{var z,P;return Lt(F,"show ".concat((c(b),(z=wA(()=>c(b).start))!==null&&z!==void 0?z:""),"-").concat((c(b),(P=wA(()=>c(b).end))!==null&&P!==void 0?P:"")))}),fe("click",x,()=>I()(g(),c(b))),CA(S,x)}),Se(()=>{var S,b;h=ii(f,1,"jse-collapsed-items svelte-1v6dhm4",null,h,{"jse-selected":c(o)}),E=mg(f,"",E,{"--level":(K(g()),wA(()=>g().length+2))}),Lt(k,"Items ".concat((S=c(i))!==null&&S!==void 0?S:"","-").concat((b=c(n))!==null&&b!==void 0?b:""))}),fe("mousemove",f,function(S){S.stopPropagation()}),CA(t,f),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-context-menu-pointer.svelte-10ijtzr { - position: absolute; - top: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); - right: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); - width: var(--jse-context-menu-pointer-size, calc(1em + 4px)); - height: var(--jse-context-menu-pointer-size, calc(1em + 4px)); - padding: 0; - margin: 0; - cursor: pointer; - background: transparent; - border-radius: 2px; - background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); - color: var(--jse-context-menu-pointer-color, var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff))); - border: none; - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); -} -.jse-context-menu-pointer.jse-root.svelte-10ijtzr { - top: 0; - right: calc(-2px - var(--jse-context-menu-pointer-size, calc(1em + 4px))); -} -.jse-context-menu-pointer.jse-insert.svelte-10ijtzr { - right: -1px; -} -.jse-context-menu-pointer.svelte-10ijtzr:hover { - background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); -} -.jse-context-menu-pointer.jse-selected.svelte-10ijtzr { - background: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); -} -.jse-context-menu-pointer.jse-selected.svelte-10ijtzr:hover { - background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); -}`);var z8A=JA('');function cI(t,e){Nt(e,!1);var A=L(e,"root",9,!1),i=L(e,"insert",9,!1),n=L(e,"selected",9),o=L(e,"onContextMenu",9);ni(!0);var a,r=z8A();tn(dA(r),{get data(){return c0}}),Se(()=>{a=ii(r,1,"jse-context-menu-pointer svelte-10ijtzr",null,a,{"jse-root":A(),"jse-insert":i(),"jse-selected":n()}),_n(r,"title",LR)}),fe("click",r,function(s){for(var l=s.target;l&&l.nodeName!=="BUTTON";)l=l.parentNode;l&&o()({anchor:l,left:0,top:0,width:xC,height:kC,offsetTop:2,offsetLeft:0,showTip:!0})}),CA(t,r),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-key.svelte-1n4cez4 { - display: inline-block; - min-width: 2em; - padding: 0 5px; - box-sizing: border-box; - outline: none; - border-radius: 1px; - vertical-align: top; - color: var(--jse-key-color, #1a1a1a); - word-break: normal; - overflow-wrap: normal; - white-space: pre-wrap; -} -.jse-key.jse-empty.svelte-1n4cez4 { - min-width: 3em; - outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - -moz-outline-radius: 2px; -} -.jse-key.jse-empty.svelte-1n4cez4::after { - pointer-events: none; - color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - content: "key"; -}`);var P8A=JA('
          '),j8A=JA(" ",1),q8A=JA('
          ');function G$(t,e){Nt(e,!0);var A=Il(()=>En(e.selection)&&tr(e.selection)),i=Il(()=>e.context.onRenderValue({path:e.path,value:e.value,mode:e.context.mode,truncateTextSize:e.context.truncateTextSize,readOnly:e.context.readOnly,enforceString:e.enforceString,isEditing:c(A),parser:e.context.parser,normalization:e.context.normalization,selection:e.selection,searchResultItems:e.searchResultItems,onPatch:e.context.onPatch,onPasteJson:e.context.onPasteJson,onSelect:e.context.onSelect,onFind:e.context.onFind,findNextInside:e.context.findNextInside,focus:e.context.focus})),n=Fi();da(et(n),17,()=>c(i),ka,(o,a)=>{var r=Fi(),s=et(r),l=C=>{var I=Il(()=>c(a).action),d=q8A();ms(d,(h,E)=>{var f;return(f=c(I))===null||f===void 0?void 0:f(h,E)},()=>c(a).props),CA(C,d)},g=C=>{var I=Il(()=>c(a).component),d=Fi();UX(et(d),()=>c(I),(h,E)=>{E(h,DI(()=>c(a).props))}),CA(C,d)};jA(s,C=>{o6A(c(a))?C(l):C(g,!1)}),CA(o,r)}),CA(t,n),Ft()}var V8A={selecting:!1,selectionAnchor:void 0,selectionAnchorType:void 0,selectionFocus:void 0,dragging:!1};function T_(t){var{json:e,selection:A,deltaY:i,items:n}=t;if(!A)return{operations:void 0,updatedSelection:void 0,offset:0};var o=i<0?(function(g){for(var{json:C,items:I,selection:d,deltaY:h}=g,E=_C(C,d),f=I.findIndex(x=>Mi(x.path,E)),m=()=>{var x;return(x=I[v-1])===null||x===void 0?void 0:x.height},v=f,k=0;m()!==void 0&&Math.abs(h)>k+m()/2;)k+=m(),v-=1;var S=I[v].path,b=v-f;return v!==f&&I[v]!==void 0?{beforePath:S,offset:b}:void 0})({json:e,selection:A,deltaY:i,items:n}):(function(g){for(var C,{json:I,items:d,selection:h,deltaY:E}=g,f=vI(I,h),m=d.findIndex(Z=>Mi(Z.path,f)),v=0,k=m,S=()=>{var Z;return(Z=d[k+1])===null||Z===void 0?void 0:Z.height};S()!==void 0&&Math.abs(E)>v+S()/2;)v+=S(),k+=1;var b=Yi(f),x=Xe(I,b),F=Array.isArray(x)?k:k+1,z=(C=d[F])===null||C===void 0?void 0:C.path,P=k-m;return z?{beforePath:z,offset:P}:{append:!0,offset:P}})({json:e,selection:A,deltaY:i,items:n});if(!o||o.offset===0)return{operations:void 0,updatedSelection:void 0,offset:0};var a=(function(g,C,I){if(!C)return[];var d="beforePath"in I?I.beforePath:void 0,h="append"in I?I.append:void 0,E=Yi(It(C)),f=Xe(g,E);if(!(h||d&&k0(d,E)&&d.length>E.length))return[];var m=_C(g,C),v=vI(g,C),k=ki(m),S=ki(v),b=d?d[E.length]:void 0;if(!ia(f)){if(Vo(f)){var x=Rr(k),F=Rr(S),z=b!==void 0?Rr(b):f.length;return Y9(F-x+1,z({op:"move",from:vt(E.concat(String(x+BA))),path:vt(E.concat(String(z+BA)))}):()=>({op:"move",from:vt(E.concat(String(x))),path:vt(E.concat(String(z)))}))}throw new Error("Cannot create move operations: parent must be an Object or Array")}var P=Object.keys(f),Z=P.indexOf(k),tA=P.indexOf(S),W=h?P.length:b!==void 0?P.indexOf(b):-1;return Z!==-1&&tA!==-1&&W!==-1?W>Z?[...P.slice(Z,tA+1),...P.slice(W,P.length)].map(BA=>SI(E,BA)):[...P.slice(W,Z),...P.slice(tA+1,P.length)].map(BA=>SI(E,BA)):[]})(e,A,o),r=Yi(_C(e,A)),s=Xe(e,r);if(Array.isArray(s)){var l=(function(g){var C,I,{items:d,json:h,selection:E,offset:f}=g,m=_C(h,E),v=vI(h,E),k=d.findIndex(F=>Mi(F.path,m)),S=d.findIndex(F=>Mi(F.path,v)),b=(C=d[k+f])===null||C===void 0?void 0:C.path,x=(I=d[S+f])===null||I===void 0?void 0:I.path;return fs(b,x)})({items:n,json:e,selection:A,offset:o.offset});return{operations:a,updatedSelection:l,offset:o.offset}}return{operations:a,updatedSelection:void 0,offset:o.offset}}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -button.jse-validation-error.svelte-q6a061 { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - padding: 0; - margin: 0; - vertical-align: top; - display: inline-flex; - color: var(--jse-error-color, #ee5341); -} - -button.jse-validation-info.svelte-q6a061 { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - padding: 0; - margin: 0; - vertical-align: top; - display: inline-flex; - color: var(--jse-info-color, #4f91ff); -} - -button.jse-validation-warning.svelte-q6a061 { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - padding: 0; - margin: 0; - vertical-align: top; - display: inline-flex; - color: var(--jse-warning-color, #fdc539); -}`);var W8A=JA('');function Rh(t,e){Nt(e,!1);var A=EA(),i=kI("absolute-popup"),n=L(e,"validationError",8),o=L(e,"onExpand",8);KA(()=>K(n()),()=>{N(A,n6A(n())&&n().isChildError?"Contains invalid data":n().message)}),Rn(),ni();var a=W8A();tn(dA(a),{get data(){return z2}}),_r(()=>fe("click",a,function(){for(var r,s=arguments.length,l=new Array(s),g=0;gHh?.(r,s),()=>Me({text:c(A)},i)),Se(()=>{var r;return ii(a,1,"jse-validation-".concat((K(n()),(r=wA(()=>n().severity))!==null&&r!==void 0?r:"")),"svelte-q6a061")}),CA(t,a),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-expand.svelte-1qi6rc1 { - width: var(--jse-indent-size, calc(1em + 4px)); - padding: 0; - margin: 0; - border: none; - cursor: pointer; - background: transparent; - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); - font-size: var(--jse-font-size-mono, 14px); - height: var(--jse-line-height, calc(1em + 4px)); -} -.jse-expand.svelte-1qi6rc1:hover { - opacity: 0.8; -} - -.jse-meta.svelte-1qi6rc1, -.jse-separator.svelte-1qi6rc1, -.jse-index.svelte-1qi6rc1, -.jse-bracket.svelte-1qi6rc1 { - vertical-align: top; - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); -} - -.jse-index.svelte-1qi6rc1 { - padding: 0 calc(0.5 * var(--jse-padding, 10px)); -} - -.jse-bracket.svelte-1qi6rc1 { - padding: 0 2px; -} -.jse-bracket.jse-expanded.svelte-1qi6rc1 { - padding-right: var(--jse-padding, 10px); -} - -.jse-identifier.svelte-1qi6rc1 { - vertical-align: top; - position: relative; -} - -.jse-json-node.svelte-1qi6rc1 { - position: relative; - color: var(--jse-text-color, #4d4d4d); -} -.jse-json-node.jse-root.svelte-1qi6rc1 { - min-height: 100%; - padding-bottom: 2px; - box-sizing: border-box; -} -.jse-json-node.jse-root.svelte-1qi6rc1 > .jse-contents-outer:where(.svelte-1qi6rc1) > .jse-contents:where(.svelte-1qi6rc1) { - padding-left: 0; -} -.jse-json-node.svelte-1qi6rc1 .jse-props:where(.svelte-1qi6rc1), -.jse-json-node.svelte-1qi6rc1 .jse-items:where(.svelte-1qi6rc1) { - position: relative; -} -.jse-json-node.svelte-1qi6rc1 .jse-header-outer:where(.svelte-1qi6rc1), -.jse-json-node.svelte-1qi6rc1 .jse-footer-outer:where(.svelte-1qi6rc1) { - display: flex; - margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); -} -.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1) { - position: relative; -} -.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1) .jse-meta:where(.svelte-1qi6rc1) > .jse-meta-inner:where(.svelte-1qi6rc1) { - display: flex; - justify-content: center; -} -.jse-json-node.svelte-1qi6rc1 .jse-contents-outer:where(.svelte-1qi6rc1) { - display: flex; - margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); -} -.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), -.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) { - display: flex; - flex-direction: row; - align-items: flex-start; -} -.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) { - padding-left: var(--jse-indent-size, calc(1em + 4px)); - cursor: var(--jse-contents-cursor, pointer); -} -.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) .jse-value-outer:where(.svelte-1qi6rc1) { - display: inline-flex; -} -.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { - display: inline-flex; - padding-left: calc(var(--jse-indent-size, calc(1em + 4px)) + 5px); -} -.jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), -.jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1), -.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { - background: var(--jse-contents-background-color, transparent); -} -.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area:where(.svelte-1qi6rc1) { - padding: 0 calc(0.5 * var(--jse-padding, 10px)); - flex: 1; -} -.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area.jse-inside:where(.svelte-1qi6rc1) { - display: inline-flex; - align-items: center; -} -.jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area.jse-after:where(.svelte-1qi6rc1) { - display: flex; - align-items: flex-end; -} -.jse-json-node.svelte-1qi6rc1 .jse-context-menu-pointer-anchor:where(.svelte-1qi6rc1) { - position: relative; -} -.jse-json-node.svelte-1qi6rc1 .jse-insert-area:where(.svelte-1qi6rc1) { - display: flex; - position: relative; - z-index: 1; - margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); - max-width: 250px; - min-width: 100px; - height: 0; - margin-right: calc(0.5 * var(--jse-padding, 10px)); - outline: 1px solid; -} -.jse-json-node.svelte-1qi6rc1 .jse-insert-area.jse-hovered:where(.svelte-1qi6rc1) { - outline-color: var(--jse-context-menu-pointer-hover-background, #b2b2b2); -} -.jse-json-node.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1) { - position: relative; -} -.jse-json-node.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1):hover, -.jse-json-node.svelte-1qi6rc1 .jse-value-outer:where(.svelte-1qi6rc1):hover, -.jse-json-node.svelte-1qi6rc1 .jse-meta:where(.svelte-1qi6rc1):hover, -.jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1):hover { - background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); - cursor: var(--jse-contents-cursor, pointer); -} -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer { - background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); - cursor: var(--jse-contents-cursor, pointer); -} -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-meta, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-value-outer, -.jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-meta { - background: none; -} -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1), -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { - background: var(--jse-selection-background-color, #d3d3d3); - cursor: var(--jse-contents-selected-cursor, grab); -} -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1):hover, -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-value-outer:where(.svelte-1qi6rc1):hover, -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-meta:where(.svelte-1qi6rc1):hover, -.jse-json-node.jse-selected.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1):hover { - background: inherit; - cursor: inherit; -} -.jse-json-node.svelte-1qi6rc1 .jse-key-outer.jse-selected-key:where(.svelte-1qi6rc1) { - background: var(--jse-selection-background-color, #d3d3d3); - cursor: var(--jse-contents-selected-cursor, grab); -} -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-value-outer, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-meta, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-header, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-contents, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-header, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-contents, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-footer { - background: var(--jse-selection-background-color, #d3d3d3); - cursor: var(--jse-contents-selected-cursor, grab); -} -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-value-outer .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-meta .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-header .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-contents .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-header .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-contents .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-footer .jse-key-outer:hover { - background: inherit; - cursor: inherit; -} -.jse-json-node.jse-readonly.svelte-1qi6rc1 { - --jse-contents-selected-cursor: pointer; -} -.jse-json-node.svelte-1qi6rc1 .jse-insert-area.jse-selected:where(.svelte-1qi6rc1) { - outline-color: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); -}`);var To=kD(()=>V8A),Z8A=JA('
          :
          '),X8A=JA('
          [
           ',1),$8A=JA('
          [
          ]
          ',1),AwA=JA('
          '),ewA=JA('
          '),twA=JA('
          '),iwA=JA('
          '),nwA=JA('
          '),owA=JA(" ",1),awA=JA('
          '),rwA=JA('
          ',1),swA=JA('
          ',1),lwA=JA('
          :
          '),gwA=JA('
          {
          '),cwA=JA('
          {
          }
          ',1),CwA=JA('
          '),IwA=JA('
          '),dwA=JA('
          '),BwA=JA('
          '),EwA=JA('
          '),hwA=JA('
          '),QwA=JA('
          ',1),uwA=JA('
          ',1),fwA=JA('
          :
          '),pwA=JA('
          '),mwA=JA('
          '),wwA=JA('
          '),DwA=JA('
          '),ywA=JA('
          ');function BR(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=L(e,"pointer",9),o=L(e,"value",9),a=L(e,"state",9),r=L(e,"validationErrors",9),s=L(e,"searchResults",9),l=L(e,"selection",9),g=L(e,"context",9),C=L(e,"onDragSelectionStart",9),I=or("jsoneditor:JSONNode"),d=EA(void 0,!0),h=void 0,E=EA(void 0,!0),f=EA(void 0,!0),m=EA(void 0,!0),v=EA(void 0,!0),k=EA(void 0,!0),S=EA(void 0,!0),b=EA(void 0,!0);function x(YA){YA.stopPropagation();var fA=FR(YA);g().onExpand(c(f),!c(m),fA)}function F(){g().onExpand(c(f),!0)}function z(YA,fA){var XA=e3(c(f),Object.keys(o()),YA,fA);return g().onPatch(XA),ki(Es(XA[0].path))}function P(YA){g().onDrag(YA)}function Z(YA){To().selecting&&(To(To().selecting=!1),YA.stopPropagation()),g().onDragEnd(),document.removeEventListener("mousemove",P,!0),document.removeEventListener("mouseup",Z)}function tA(){var YA;return((YA=g().findElement([]))===null||YA===void 0||(YA=YA.getBoundingClientRect())===null||YA===void 0?void 0:YA.top)||0}function W(YA,fA){var XA=tA()-YA.initialContentTop;return fA.clientY-YA.initialClientY-XA}function BA(YA){if(!g().readOnly&&l()){var fA=Yi(It(l()));if(Mi(c(f),fA)){var XA=(function(HA,vA){var Gt=[];function ft($){var oA=c(f).concat($),sA=g().findElement(oA);sA!==void 0&&Gt.push({path:oA,height:sA.clientHeight})}if(Array.isArray(o())){var he=g().getJson();if(he===void 0)return;var Ot=_C(he,HA),He=vI(he,HA),je=parseInt(ki(Ot),10),pt=parseInt(ki(He),10),xe=vA.find($=>je>=$.start&&pt<=$.end);if(!xe)return;var{start:oi,end:j}=xe;zX(oi,Math.min(o().length,j),$=>ft(String($)))}else Object.keys(o()).forEach(ft);return Gt})(l(),c(k)||kh);if(I("dragSelectionStart",{selection:l(),items:XA}),XA){var DA=g().getJson();if(DA!==void 0){var ee=_C(DA,l()),NA=XA.findIndex(HA=>Mi(HA.path,ee)),{offset:ke}=T_({json:DA,selection:g().getSelection(),deltaY:0,items:XA});N(E,{initialTarget:YA.target,initialClientY:YA.clientY,initialContentTop:tA(),selectionStartIndex:NA,selectionItemsCount:MI(DA,l()).length,items:XA,offset:ke,didMoveItems:!1}),To(To().dragging=!0),document.addEventListener("mousemove",X,!0),document.addEventListener("mouseup",iA)}}else I("Cannot drag the current selection (probably spread over multiple sections)")}else C()(YA)}}function X(YA){if(c(E)){var fA=g().getJson();if(fA===void 0)return;var XA=W(c(E),YA),{offset:DA}=T_({json:fA,selection:g().getSelection(),deltaY:XA,items:c(E).items});DA!==c(E).offset&&(I("drag selection",DA,XA),N(E,Me(Me({},c(E)),{},{offset:DA,didMoveItems:!0})))}}function iA(YA){if(c(E)){var fA=g().getJson();if(fA===void 0)return;var XA=W(c(E),YA),{operations:DA,updatedSelection:ee}=T_({json:fA,selection:g().getSelection(),deltaY:XA,items:c(E).items});if(DA)g().onPatch(DA,(HA,vA)=>({state:vA,selection:ee??l()}));else if(YA.target===c(E).initialTarget&&!c(E).didMoveItems){var NA=b_(YA.target),ke=i$(YA.target);ke&&g().onSelect(BZ(NA,ke))}N(E,void 0),To(To().dragging=!1),document.removeEventListener("mousemove",X,!0),document.removeEventListener("mouseup",iA)}}function AA(YA){YA.shiftKey||(YA.stopPropagation(),YA.preventDefault(),g().onSelect(OC(c(f))))}function IA(YA){YA.shiftKey||(YA.stopPropagation(),YA.preventDefault(),g().onSelect(LC(c(f))))}function aA(YA){g().onSelect(OC(c(f))),Ro(),g().onContextMenu(YA)}function rA(YA){g().onSelect(LC(c(f))),Ro(),g().onContextMenu(YA)}KA(()=>K(n()),()=>{N(f,Es(n()))}),KA(()=>K(n()),()=>{N(A,encodeURIComponent(n()))}),KA(()=>K(a()),()=>{N(m,!!yd(a())&&a().expanded)}),KA(()=>(K(o()),K(a())),()=>{N(v,v0(o(),a(),[]))}),KA(()=>K(a()),()=>{N(k,ir(a())?a().visibleSections:void 0)}),KA(()=>K(r()),()=>{var YA;N(S,(YA=r())===null||YA===void 0?void 0:YA.validationError)}),KA(()=>(K(g()),K(l()),c(f)),()=>{N(b,Uf(g().getJson(),l(),c(f)))}),KA(()=>c(f),()=>{N(i,c(f).length===0)}),Rn(),ni(!0);var uA,UA,$A=ywA(),zA=dA($A),pA=YA=>{var fA=swA(),XA=et(fA),DA=dA(XA),ee=dA(DA),NA=dA(ee),ke=GA=>{tn(GA,{get data(){return c0}})},HA=GA=>{tn(GA,{get data(){return kE}})};jA(NA,GA=>{c(m)?GA(ke):GA(HA,!1)});var vA=_A(ee,2);Ia(vA,e,"identifier",{},null);var Gt=_A(vA,2),ft=GA=>{CA(GA,Z8A())};jA(Gt,GA=>{c(i)||GA(ft)});var he=_A(Gt,2),Ot=dA(he),He=dA(Ot),je=GA=>{var OA=X8A();nD(_A(et(OA),2),{children:(ht,tt)=>{var ze=dr();Se(()=>{var Oe,Ci;return Lt(ze,"".concat((K(o()),(Oe=wA(()=>o().length))!==null&&Oe!==void 0?Oe:""),` - `).concat((K(o()),(Ci=wA(()=>o().length===1?"item":"items"))!==null&&Ci!==void 0?Ci:"")))}),CA(ht,ze)},$$slots:{default:!0}}),CA(GA,OA)},pt=GA=>{var OA=$8A();nD(_A(et(OA),2),{onclick:F,children:(ht,tt)=>{var ze=dr();Se(()=>{var Oe,Ci;return Lt(ze,"".concat((K(o()),(Oe=wA(()=>o().length))!==null&&Oe!==void 0?Oe:""),` - `).concat((K(o()),(Ci=wA(()=>o().length===1?"item":"items"))!==null&&Ci!==void 0?Ci:"")))}),CA(ht,ze)},$$slots:{default:!0}}),CA(GA,OA)};jA(He,GA=>{c(m)?GA(je):GA(pt,!1)});var xe=_A(he,2),oi=GA=>{var OA=AwA();cI(dA(OA),{get root(){return c(i)},selected:!0,get onContextMenu(){return K(g()),wA(()=>g().onContextMenu)}}),CA(GA,OA)};jA(xe,GA=>{K(g()),c(b),K(l()),K(En),K(Co),K(tr),K(Mi),K(It),c(f),wA(()=>!g().readOnly&&c(b)&&l()&&(En(l())||Co(l()))&&!tr(l())&&Mi(It(l()),c(f)))&&GA(oi)});var j=_A(DA,2),$=GA=>{Rh(GA,{get validationError(){return c(S)},onExpand:F})};jA(j,GA=>{c(S),c(m),wA(()=>c(S)&&(!c(m)||!c(S).isChildError))&&GA($)});var oA=_A(j,2),sA=GA=>{var OA=ewA();fe("click",OA,AA),CA(GA,OA)},TA=GA=>{var OA=twA();fe("click",OA,IA),CA(GA,OA)};jA(oA,GA=>{c(m)?GA(sA):GA(TA,!1)});var de=_A(XA,2),Qe=GA=>{var OA=rwA(),ht=et(OA),tt=dA(ht),ze=hn=>{var Ke,nn,Si=iwA(),Li=dA(Si),Zi=it(()=>(c(b),K(Va),K(l()),wA(()=>c(b)&&Va(l()))));cI(Li,{insert:!0,get selected(){return c(Zi)},onContextMenu:aA}),Se(bt=>{Ke=ii(Si,1,"jse-insert-area jse-inside svelte-1qi6rc1",null,Ke,bt),_n(Si,"title",k_),nn=mg(Si,"",nn,{"--level":(c(f),wA(()=>c(f).length+1))})},[()=>({"jse-hovered":c(d)===rd,"jse-selected":c(b)&&Va(l())})]),CA(hn,Si)};jA(tt,hn=>{K(g()),c(d),K(rd),c(b),K(Va),K(l()),wA(()=>!g().readOnly&&(c(d)===rd||c(b)&&Va(l())))&&hn(ze)}),da(_A(tt,2),1,()=>c(k)||kh,ka,(hn,Ke,nn)=>{var Si=owA(),Li=et(Si);da(Li,1,()=>(K(o()),c(Ke),c(E),wA(()=>(function(on,Kt,G){var dt=Kt.start,Ei=Math.min(Kt.end,on.length),Qn=K8(dt,Ei);return G&&G.offset!==0?VW(Qn,G.selectionStartIndex,G.selectionItemsCount,G.offset).map((un,Vn)=>({index:un,gutterIndex:Vn})):Qn.map(un=>({index:un,gutterIndex:un}))})(o(),c(Ke),c(E)))),on=>on.index,(on,Kt)=>{var G=it(()=>(K(ir),K(r()),c(Kt),wA(()=>ir(r())?r().items[c(Kt).index]:void 0))),dt=it(()=>(K(O5),K(g()),K(l()),c(f),c(Kt),wA(()=>O5(g().getJson(),l(),c(f).concat(String(c(Kt).index)))))),Ei=Fi(),Qn=et(Ei),un=it(()=>(K(s4),K(n()),c(Kt),wA(()=>s4(n(),c(Kt).index)))),Vn=it(()=>(K(ir),K(a()),c(Kt),wA(()=>ir(a())?a().items[c(Kt).index]:void 0))),Yo=it(()=>(K(ir),K(s()),c(Kt),wA(()=>ir(s())?s().items[c(Kt).index]:void 0)));BR(Qn,{get value(){return K(o()),c(Kt),wA(()=>o()[c(Kt).index])},get pointer(){return c(un)},get state(){return c(Vn)},get validationErrors(){return c(G)},get searchResults(){return c(Yo)},get selection(){return c(dt)},get context(){return g()},onDragSelectionStart:BA,$$slots:{identifier:(Bo,No)=>{var Zo=nwA(),Do=dA(Zo),Ba=dA(Do);Se(()=>Lt(Ba,(c(Kt),wA(()=>c(Kt).gutterIndex)))),CA(Bo,Zo)}}}),CA(on,Ei)});var Zi=_A(Li,2),bt=on=>{var Kt=it(()=>c(k)||kh);H8A(on,{get visibleSections(){return c(Kt)},sectionIndex:nn,get total(){return K(o()),wA(()=>o().length)},get path(){return c(f)},get onExpandSection(){return K(g()),wA(()=>g().onExpandSection)},get selection(){return l()},get context(){return g()}})};jA(Zi,on=>{c(Ke),K(o()),wA(()=>c(Ke).end{var Ke=awA();fe("click",Ke,IA),CA(hn,Ke)};jA(Ci,hn=>{c(i)||hn(gn)}),CA(GA,OA)};jA(de,GA=>{c(m)&&GA(Qe)}),fe("click",ee,x),CA(YA,fA)},PA=YA=>{var fA=Fi(),XA=et(fA),DA=NA=>{var ke=uwA(),HA=et(ke),vA=dA(HA),Gt=dA(vA),ft=dA(Gt),he=Oe=>{tn(Oe,{get data(){return c0}})},Ot=Oe=>{tn(Oe,{get data(){return kE}})};jA(ft,Oe=>{c(m)?Oe(he):Oe(Ot,!1)});var He=_A(Gt,2);Ia(He,e,"identifier",{},null);var je=_A(He,2),pt=Oe=>{CA(Oe,lwA())};jA(je,Oe=>{c(i)||Oe(pt)});var xe=_A(je,2),oi=dA(xe),j=dA(oi),$=Oe=>{CA(Oe,gwA())},oA=Oe=>{var Ci=cwA();nD(_A(et(Ci),2),{onclick:F,children:(gn,hn)=>{var Ke=dr();Se((nn,Si)=>Lt(Ke,"".concat(nn??"",` - `).concat(Si??"")),[()=>(K(o()),wA(()=>Object.keys(o()).length)),()=>(K(o()),wA(()=>Object.keys(o()).length===1?"prop":"props"))]),CA(gn,Ke)},$$slots:{default:!0}}),CA(Oe,Ci)};jA(j,Oe=>{c(m)?Oe($):Oe(oA,!1)});var sA=_A(xe,2),TA=Oe=>{var Ci=CwA();cI(dA(Ci),{get root(){return c(i)},selected:!0,get onContextMenu(){return K(g()),wA(()=>g().onContextMenu)}}),CA(Oe,Ci)};jA(sA,Oe=>{K(g()),c(b),K(l()),K(En),K(Co),K(tr),K(Mi),K(It),c(f),wA(()=>!g().readOnly&&c(b)&&l()&&(En(l())||Co(l()))&&!tr(l())&&Mi(It(l()),c(f)))&&Oe(TA)});var de=_A(vA,2),Qe=Oe=>{Rh(Oe,{get validationError(){return c(S)},onExpand:F})};jA(de,Oe=>{c(S),c(m),wA(()=>c(S)&&(!c(m)||!c(S).isChildError))&&Oe(Qe)});var GA=_A(de,2),OA=Oe=>{var Ci=IwA();fe("click",Ci,AA),CA(Oe,Ci)},ht=Oe=>{var Ci=Fi(),gn=et(Ci),hn=Ke=>{var nn=dwA();fe("click",nn,IA),CA(Ke,nn)};jA(gn,Ke=>{c(i)||Ke(hn)},!0),CA(Oe,Ci)};jA(GA,Oe=>{c(m)?Oe(OA):Oe(ht,!1)});var tt=_A(HA,2),ze=Oe=>{var Ci=QwA(),gn=et(Ci),hn=dA(gn),Ke=Zi=>{var bt,on,Kt=BwA(),G=dA(Kt),dt=it(()=>(c(b),K(Va),K(l()),wA(()=>c(b)&&Va(l()))));cI(G,{insert:!0,get selected(){return c(dt)},onContextMenu:aA}),Se(Ei=>{bt=ii(Kt,1,"jse-insert-area jse-inside svelte-1qi6rc1",null,bt,Ei),_n(Kt,"title",k_),on=mg(Kt,"",on,{"--level":(c(f),wA(()=>c(f).length+1))})},[()=>({"jse-hovered":c(d)===rd,"jse-selected":c(b)&&Va(l())})]),CA(Zi,Kt)};jA(hn,Zi=>{K(g()),c(d),K(rd),c(b),K(Va),K(l()),wA(()=>!g().readOnly&&(c(d)===rd||c(b)&&Va(l())))&&Zi(Ke)}),da(_A(hn,2),1,()=>(K(o()),c(E),wA(()=>(function(Zi,bt){var on=Object.keys(Zi);return bt&&bt.offset!==0?VW(on,bt.selectionStartIndex,bt.selectionItemsCount,bt.offset):on})(o(),c(E)))),ka,(Zi,bt)=>{var on=it(()=>(K(s4),K(n()),c(bt),wA(()=>s4(n(),c(bt))))),Kt=it(()=>(K(Cl),K(s()),c(bt),wA(()=>Cl(s())?s().properties[c(bt)]:void 0))),G=it(()=>(K(Cl),K(r()),c(bt),wA(()=>Cl(r())?r().properties[c(bt)]:void 0))),dt=it(()=>(c(f),c(bt),wA(()=>c(f).concat(c(bt))))),Ei=it(()=>(K(O5),K(g()),K(l()),K(c(dt)),wA(()=>O5(g().getJson(),l(),c(dt))))),Qn=Fi(),un=et(Qn),Vn=it(()=>(K(Cl),K(a()),c(bt),wA(()=>Cl(a())?a().properties[c(bt)]:void 0)));BR(un,{get value(){return K(o()),c(bt),wA(()=>o()[c(bt)])},get pointer(){return c(on)},get state(){return c(Vn)},get validationErrors(){return c(G)},get searchResults(){return c(Kt)},get selection(){return c(Ei)},get context(){return g()},onDragSelectionStart:BA,$$slots:{identifier:(Yo,Bo)=>{var No,Zo=EwA(),Do=dA(Zo),Ba=it(()=>(K(mZ),K(c(Kt)),wA(()=>mZ(c(Kt)))));(function(Xo,ra){Nt(ra,!1);var yo=EA(void 0,!0),ge=EA(void 0,!0),mi=L(ra,"pointer",9),cn=L(ra,"key",9),fn=L(ra,"selection",9),Ho=L(ra,"searchResultItems",9),ya=L(ra,"onUpdateKey",9),_i=L(ra,"context",9),Eo=EA(void 0,!0);function Za(xA){c(ge)||_i().readOnly||(xA.preventDefault(),_i().onSelect(zR(c(Eo))))}function vo(xA,Ae){var De=ya()(cn(),_i().normalization.unescapeValue(xA)),mA=Yi(c(Eo)).concat(De);_i().onSelect(Ae===yI.nextInside?Hi(mA):JC(mA)),Ae!==yI.self&&_i().focus()}function Ta(){_i().onSelect(JC(c(Eo))),_i().focus()}KA(()=>K(mi()),()=>{N(Eo,Es(mi()))}),KA(()=>(K(fn()),c(Eo)),()=>{N(yo,nr(fn())&&Mi(fn().path,c(Eo)))}),KA(()=>(c(yo),K(fn())),()=>{N(ge,c(yo)&&tr(fn()))}),Rn(),ni(!0);var Jn=j8A(),Ui=et(Jn),qt=xA=>{var Ae=it(()=>(K(_i()),K(cn()),wA(()=>_i().normalization.escapeValue(cn())))),De=it(()=>(K(tr),K(fn()),wA(()=>tr(fn())?fn().initialValue:void 0)));d$(xA,{get value(){return c(Ae)},get initialValue(){return c(De)},label:"Edit key",shortText:!0,onChange:vo,onCancel:Ta,get onFind(){return K(_i()),wA(()=>_i().onFind)}})},Nn=xA=>{var Ae,De=P8A(),mA=dA(De),FA=Ne=>{var nt=it(()=>(K(_i()),K(cn()),wA(()=>_i().normalization.escapeValue(cn()))));p$(Ne,{get text(){return c(nt)},get searchResultItems(){return Ho()}})},le=Ne=>{var nt=dr();Se(rt=>Lt(nt,rt),[()=>(K(Jh),K(_i()),K(cn()),wA(()=>Jh(_i().normalization.escapeValue(cn()))))]),CA(Ne,nt)};jA(mA,Ne=>{Ho()?Ne(FA):Ne(le,!1)}),Se(()=>Ae=ii(De,1,"jse-key svelte-1n4cez4",null,Ae,{"jse-empty":cn()===""})),fe("dblclick",De,Za),CA(xA,De)};jA(Ui,xA=>{K(_i()),c(ge),wA(()=>!_i().readOnly&&c(ge))?xA(qt):xA(Nn,!1)});var ho=_A(Ui,2),Fo=xA=>{cI(xA,{selected:!0,get onContextMenu(){return K(_i()),wA(()=>_i().onContextMenu)}})};jA(ho,xA=>{K(_i()),c(yo),c(ge),wA(()=>!_i().readOnly&&c(yo)&&!c(ge))&&xA(Fo)}),CA(Xo,Jn),Ft()})(Do,{get pointer(){return c(on)},get key(){return c(bt)},get selection(){return c(Ei)},get searchResultItems(){return c(Ba)},get context(){return g()},onUpdateKey:z}),Se(Xo=>No=ii(Zo,1,"jse-key-outer svelte-1qi6rc1",null,No,Xo),[()=>({"jse-selected-key":nr(c(Ei))&&Mi(c(Ei).path,c(dt))})]),CA(Yo,Zo)}}}),CA(Zi,Qn)});var nn=_A(gn,2),Si=_A(dA(nn),2),Li=Zi=>{var bt=hwA();fe("click",bt,IA),CA(Zi,bt)};jA(Si,Zi=>{c(i)||Zi(Li)}),CA(Oe,Ci)};jA(tt,Oe=>{c(m)&&Oe(ze)}),fe("click",Gt,x),CA(NA,ke)},ee=NA=>{var ke=wwA(),HA=dA(ke),vA=dA(HA);Ia(vA,e,"identifier",{},null);var Gt=_A(vA,2),ft=sA=>{CA(sA,fwA())};jA(Gt,sA=>{c(i)||sA(ft)});var he=_A(Gt,2),Ot=dA(he),He=it(()=>c(b)?l():void 0),je=it(()=>(K(wZ),K(s()),wA(()=>wZ(s()))));G$(Ot,{get path(){return c(f)},get value(){return o()},get enforceString(){return c(v)},get selection(){return c(He)},get searchResultItems(){return c(je)},get context(){return g()}});var pt=_A(he,2),xe=sA=>{var TA=pwA();cI(dA(TA),{get root(){return c(i)},selected:!0,get onContextMenu(){return K(g()),wA(()=>g().onContextMenu)}}),CA(sA,TA)};jA(pt,sA=>{K(g()),c(b),K(l()),K(En),K(Co),K(tr),K(Mi),K(It),c(f),wA(()=>!g().readOnly&&c(b)&&l()&&(En(l())||Co(l()))&&!tr(l())&&Mi(It(l()),c(f)))&&sA(xe)});var oi=_A(HA,2),j=sA=>{Rh(sA,{get validationError(){return c(S)},onExpand:F})};jA(oi,sA=>{c(S)&&sA(j)});var $=_A(oi,2),oA=sA=>{var TA=mwA();fe("click",TA,IA),CA(sA,TA)};jA($,sA=>{c(i)||sA(oA)}),CA(NA,ke)};jA(XA,NA=>{K(Mn),K(o()),wA(()=>Mn(o()))?NA(DA):NA(ee,!1)},!0),CA(YA,fA)};jA(zA,YA=>{K(o()),wA(()=>Array.isArray(o()))?YA(pA):YA(PA,!1)});var Je=_A(zA,2),_e=YA=>{var fA,XA=DwA(),DA=dA(XA),ee=it(()=>(c(b),K(dl),K(l()),wA(()=>c(b)&&dl(l()))));cI(DA,{insert:!0,get selected(){return c(ee)},onContextMenu:rA}),Se(NA=>{fA=ii(XA,1,"jse-insert-area jse-after svelte-1qi6rc1",null,fA,NA),_n(XA,"title",k_)},[()=>({"jse-hovered":c(d)===T5,"jse-selected":c(b)&&dl(l())})]),CA(YA,XA)};jA(Je,YA=>{K(g()),c(d),K(T5),c(b),K(dl),K(l()),wA(()=>!g().readOnly&&(c(d)===T5||c(b)&&dl(l())))&&YA(_e)}),Se((YA,fA)=>{uA=ii($A,1,YA,"svelte-1qi6rc1",uA,fA),_n($A,"data-path",c(A)),_n($A,"aria-selected",c(b)),UA=mg($A,"",UA,{"--level":(c(f),wA(()=>c(f).length))})},[()=>bI((K(wc),c(m),K(g()),c(f),K(o()),wA(()=>wc("jse-json-node",{"jse-expanded":c(m)},g().onClassName(c(f),o()))))),()=>({"jse-root":c(i),"jse-selected":c(b)&&Co(l()),"jse-selected-value":c(b)&&En(l()),"jse-readonly":g().readOnly,"jse-hovered":c(d)===$W})]),fe("mousedown",$A,function(YA){if((YA.buttons===1||YA.buttons===2)&&!((fA=YA.target).nodeName==="DIV"&&fA.contentEditable==="true"||YA.buttons===1&&e$(YA.target,"BUTTON"))){var fA;YA.stopPropagation(),YA.preventDefault(),g().focus(),document.addEventListener("mousemove",P,!0),document.addEventListener("mouseup",Z);var XA=b_(YA.target),DA=g().getJson(),ee=g().getDocumentState();if(!l()||XA===oo.after||XA===oo.inside||l().type!==XA&&l().type!==oo.multi||!Uf(DA,l(),c(f)))if(To(To().selecting=!0),To(To().selectionAnchor=c(f)),To(To().selectionAnchorType=XA),To(To().selectionFocus=c(f)),YA.shiftKey){var NA=g().getSelection();NA&&g().onSelect(fs(hd(NA),c(f)))}else if(XA===oo.multi)if(c(i)&&YA.target.hasAttribute("data-path")){var ke=ki(l$(o(),ee));g().onSelect(rR(ke))}else g().onSelect(fs(c(f),c(f)));else DA!==void 0&&g().onSelect(BZ(XA,c(f)));else YA.button===0&&C()(YA)}}),fe("mousemove",$A,function(YA){if(To().selecting){YA.preventDefault(),YA.stopPropagation(),To().selectionFocus===void 0&&window.getSelection&&window.getSelection().empty();var fA=b_(YA.target);Mi(c(f),To().selectionFocus)&&fA===To().selectionAnchorType||(To(To().selectionFocus=c(f)),To(To().selectionAnchorType=fA),g().onSelect(fs(To().selectionAnchor||To().selectionFocus,To().selectionFocus)))}}),fe("mouseover",$A,function(YA){To().selecting||To().dragging||(YA.stopPropagation(),QI(YA.target,"data-type","selectable-value")?N(d,$W):QI(YA.target,"data-type","selectable-key")?N(d,void 0):QI(YA.target,"data-type","insert-selection-area-inside")?N(d,rd):QI(YA.target,"data-type","insert-selection-area-after")&&N(d,T5),clearTimeout(h))}),fe("mouseout",$A,function(YA){YA.stopPropagation(),h=window.setTimeout(()=>N(d,void 0))}),CA(t,$A),Ft()}var K$={prefix:"fas",iconName:"jsoneditor-expand",icon:[512,512,[],"","M 0,448 V 512 h 512 v -64 z M 0,0 V 64 H 512 V 0 Z M 256,96 128,224 h 256 z M 256,416 384,288 H 128 Z"]},U$={prefix:"fas",iconName:"jsoneditor-collapse",icon:[512,512,[],"","m 0,224 v 64 h 512 v -64 z M 256,192 384,64 H 128 Z M 256,320 128,448 h 256 z"]},FZ={prefix:"fas",iconName:"jsoneditor-format",icon:[512,512,[],"","M 0,32 v 64 h 416 v -64 z M 160,160 v 64 h 352 v -64 z M 160,288 v 64 h 288 v -64 z M 0,416 v 64 h 320 v -64 z"]},vwA={prefix:"fas",iconName:"jsoneditor-compact",icon:[512,512,[],"","M 0,32 v 64 h 512 v -64 z M 0,160 v 64 h 512 v -64 z M 0,288 v 64 h 352 v -64 z"]};Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-welcome.svelte-1lhnan { - flex: 1; - overflow: auto; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - display: flex; - flex-direction: column; - align-items: center; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-welcome.svelte-1lhnan:last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-welcome.svelte-1lhnan .jse-space.jse-before:where(.svelte-1lhnan) { - flex: 1; -} -.jse-welcome.svelte-1lhnan .jse-space.jse-after:where(.svelte-1lhnan) { - flex: 2; -} -.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) { - display: flex; - flex-direction: column; - max-width: 300px; - margin: 2em var(--jse-padding, 10px); - gap: var(--jse-padding, 10px); -} -.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) .jse-welcome-info:where(.svelte-1lhnan) { - color: var(--jse-panel-color-readonly, #b2b2b2); -} -.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -}`);var bwA=JA('
          You can paste clipboard data using Ctrl+V, or use the following options:
          ',1),MwA=JA('
          Empty document
          ');function ER(t,e){var A=typeof t=="string"?t.toLowerCase():t,i=typeof e=="string"?e.toLowerCase():e;return(0,YZ.default)(A,i)}function T$(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,n=Xe(t,e);if(Vo(n)){if(A===void 0)throw new Error("Cannot sort: no property selected by which to sort the array");return(function(o){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,l=(function(C,I){var d={boolean:0,number:1,string:2,undefined:4},h=3;return function(E,f){var m=Xe(E,C),v=Xe(f,C);if(typeof m!=typeof v){var k,S,b=(k=d[typeof m])!==null&&k!==void 0?k:h,x=(S=d[typeof v])!==null&&S!==void 0?S:h;return b>x?I:bv?I:m1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,s=Xe(o,a),l=Object.keys(s).slice();l.sort((C,I)=>r*ER(C,I));var g={};return l.forEach(C=>g[C]=s[C]),[{op:"replace",path:vt(a),value:g}]})(t,e,i);throw new Error("Cannot sort: no array or object")}Vf(["click"]);Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-navigation-bar-dropdown.svelte-1k47orx { - position: absolute; - top: 100%; - left: 0; - z-index: 3; - background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); - color: var(--jse-navigation-bar-dropdown-color, #656565); - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); - display: flex; - flex-direction: column; - max-height: 300px; - overflow: auto; - min-width: 80px; -} -.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx) { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - border: none; - background: transparent; - color: inherit; - cursor: pointer; - outline: none; - text-align: left; - white-space: nowrap; - box-sizing: border-box; - padding: calc(0.5 * var(--jse-padding, 10px)) 36px; -} -.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx):focus, .jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx):hover { - background: var(--jse-navigation-bar-background-highlight, #e5e5e5); -} -.jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item.jse-selected:where(.svelte-1k47orx) { - background: var(--jse-navigation-bar-dropdown-color, #656565); - color: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); -}`);var SwA=JA(''),kwA=JA(''),xwA=JA('
          ');function _wA(t,e){Nt(e,!1);var A=L(e,"items",9),i=L(e,"selectedItem",9),n=L(e,"onSelect",9);ni(!0);var o=xwA(),a=dA(o);da(a,1,()=>(K(gD),K(A()),wA(()=>gD(A(),100))),l=>l,(l,g)=>{var C,I=SwA(),d=dA(I);Se((h,E)=>{C=ii(I,1,"jse-navigation-bar-dropdown-item svelte-1k47orx",null,C,{"jse-selected":c(g)===i()}),_n(I,"title",h),Lt(d,E)},[()=>(c(g),wA(()=>c(g).toString())),()=>(K(SC),c(g),wA(()=>SC(c(g).toString(),30)))]),fe("click",I,vC(()=>n()(c(g)))),CA(l,I)});var r=_A(a,2),s=l=>{var g=kwA();_n(g,"title","Limited to 100 items"),CA(l,g)};jA(r,l=>{K(A()),wA(()=>A().length>100)&&l(s)}),CA(t,o),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-navigation-bar-item.svelte-13sijxb { - position: relative; - display: flex; -} -.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb) { - font-family: inherit; - font-size: inherit; - padding: calc(0.5 * var(--jse-padding, 10px)) 2px; - border: none; - background: transparent; - color: inherit; - cursor: pointer; - outline: none; - min-width: 2em; - white-space: nowrap; -} -.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb):focus, .jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb):hover { - background: var(--jse-panel-button-background-highlight, #e0e0e0); - color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); -} -.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button.jse-navigation-bar-arrow:where(.svelte-13sijxb) { - padding: 2px var(--jse-padding, 10px) 0; -} -.jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button.jse-navigation-bar-arrow.jse-open:where(.svelte-13sijxb) { - background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); - color: var(--jse-navigation-bar-dropdown-color, #656565); -} -.jse-navigation-bar-item.svelte-13sijxb:last-child { - padding-right: var(--jse-padding, 10px); -}`);var RwA=JA(''),NwA=JA('
          ');function LZ(t,e){Nt(e,!1);var A,i=EA(void 0,!0),n=EA(void 0,!0),{openAbsolutePopup:o,closeAbsolutePopup:a}=kI("absolute-popup"),r=L(e,"path",9),s=L(e,"index",9),l=L(e,"onSelect",9),g=L(e,"getItems",9),C=EA(void 0,!0),I=EA(!1,!0);function d(k){a(A),l()(c(i).concat(k))}KA(()=>(K(r()),K(s())),()=>{N(i,r().slice(0,s()))}),KA(()=>(K(r()),K(s())),()=>{N(n,r()[s()])}),Rn(),ni(!0);var h,E=NwA(),f=dA(E);tn(dA(f),{get data(){return $9}});var m=_A(f,2),v=k=>{var S=RwA(),b=dA(S);Se(()=>Lt(b,c(n))),fe("click",S,()=>d(c(n))),CA(k,S)};jA(m,k=>{c(n)!==void 0&&k(v)}),Oo(E,k=>N(C,k),()=>c(C)),Se(()=>h=ii(f,1,"jse-navigation-bar-button jse-navigation-bar-arrow svelte-13sijxb",null,h,{"jse-open":c(I)})),fe("click",f,function(){if(c(C)){N(I,!0);var k={items:g()(c(i)),selectedItem:c(n),onSelect:d};A=o(_wA,k,{anchor:c(C),closeOnOuterClick:!0,onClose:()=>{N(I,!1)}})}}),CA(t,E),Ft()}function WR(t){var e,A;if(navigator.clipboard)return navigator.clipboard.writeText(t);if((e=(A=document).queryCommandSupported)!==null&&e!==void 0&&e.call(A,"copy")){var i=document.createElement("textarea");i.value=t,i.style.position="fixed",i.style.opacity="0",document.body.appendChild(i),i.select();try{document.execCommand("copy")}catch(n){console.error(n)}finally{document.body.removeChild(i)}return Promise.resolve()}return console.error("Copy failed."),Promise.resolve()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-navigation-bar-path-editor.svelte-uyexy4 { - flex: 1; - display: flex; - border: var(--jse-edit-outline, 2px solid #656565); - background: var(--jse-background-color, #fff); -} -.jse-navigation-bar-path-editor.svelte-uyexy4 input.jse-navigation-bar-text:where(.svelte-uyexy4) { - flex: 1; - font-family: inherit; - font-size: inherit; - padding: 0 5px 1px; - background: var(--jse-background-color, #fff); - color: var(--jse-text-color, #4d4d4d); - border: none; - outline: none; -} -.jse-navigation-bar-path-editor.svelte-uyexy4 button:where(.svelte-uyexy4) { - border: none; - background: var(--jse-background-color, #fff); - cursor: pointer; - font-family: inherit; - font-size: 80%; - color: inherit; -} -.jse-navigation-bar-path-editor.svelte-uyexy4 button.jse-navigation-bar-copy.copied:where(.svelte-uyexy4) { - color: var(--message-success-background, #9ac45d); -} -.jse-navigation-bar-path-editor.svelte-uyexy4 button.jse-navigation-bar-validation-error:where(.svelte-uyexy4) { - color: var(--jse-error-color, #ee5341); -} -.jse-navigation-bar-path-editor.error.svelte-uyexy4 { - border-color: var(--jse-error-color, #ee5341); -} -.jse-navigation-bar-path-editor.error.svelte-uyexy4 input.jse-navigation-bar-text:where(.svelte-uyexy4) { - color: var(--jse-error-color, #ee5341); -} -.jse-navigation-bar-path-editor.svelte-uyexy4 .jse-copied-text:where(.svelte-uyexy4) { - background: var(--message-success-background, #9ac45d); - color: var(--jse-message-success-color, #fff); - position: relative; - margin: 2px; - padding: 0 5px; - border-radius: 3px; -}`);var FwA=JA(''),LwA=JA('
          Copied!
          '),GwA=JA('
          ');function KwA(t,e){Nt(e,!1);var A=EA(),i=kI("absolute-popup"),n=L(e,"path",8),o=L(e,"pathParser",8),a=L(e,"onChange",8),r=L(e,"onClose",8),s=L(e,"onError",8),l=L(e,"pathExists",8),g=EA(),C=EA(),I=EA(!1),d=void 0,h=EA(!1);function E(){c(g).focus()}function f(Z){try{var tA=o().parse(Z);return(function(W){if(!l()(W))throw new Error("Path does not exist in current document")})(tA),{path:tA,error:void 0}}catch(W){return{path:void 0,error:W}}}As(()=>{E()}),Dg(()=>{clearTimeout(d)}),KA(()=>(K(o()),K(n())),()=>{N(C,o().stringify(n()))}),KA(()=>(c(I),c(C)),()=>{N(A,c(I)?f(c(C)).error:void 0)}),Rn(),ni();var m,v=GwA(),k=dA(v);Oo(k,Z=>N(g,Z),()=>c(g));var S=_A(k,2),b=Z=>{var tA=FwA();tn(dA(tA),{get data(){return z2}}),ms(tA,(W,BA)=>Hh?.(W,BA),()=>Me({text:String(c(A)||"")},i)),CA(Z,tA)};jA(S,Z=>{c(A)&&Z(b)});var x=_A(S,2),F=Z=>{CA(Z,LwA())};jA(x,Z=>{c(h)&&Z(F)});var z,P=_A(x,2);tn(dA(P),{get data(){return IC}}),Se(()=>{m=ii(v,1,"jse-navigation-bar-path-editor svelte-uyexy4",null,m,{error:c(A)}),Dd(k,c(C)),z=ii(P,1,"jse-navigation-bar-copy svelte-uyexy4",null,z,{copied:c(h)})}),fe("keydown",k,vC(function(Z){var tA=TC(Z);if(tA==="Escape"&&(Z.preventDefault(),r()()),tA==="Enter"){Z.preventDefault(),N(I,!0);var W=f(c(C));W.path!==void 0?a()(W.path):s()(W.error)}})),fe("input",k,function(Z){N(C,Z.currentTarget.value)}),fe("click",P,function(){WR(c(C)),N(h,!0),d=window.setTimeout(()=>N(h,!1),1e3),E()}),CA(t,v),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-navigation-bar.svelte-hjhal6 { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-button-color, inherit); - padding: 0; - margin: 0; - display: flex; - overflow: auto; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6) { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); - color: var(--jse-panel-color-readonly, #b2b2b2); - background: transparent; - border: none; - display: flex; - cursor: pointer; - outline: none; - align-items: center; -} -.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit.flex:where(.svelte-hjhal6) { - flex: 1; -} -.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6):focus, .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6):hover, .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit.editing:where(.svelte-hjhal6) { - background: var(--jse-panel-button-background-highlight, #e0e0e0); - color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); - transition: color 0.2s ease-in, background 0.2s ease-in; -} -.jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6) .jse-navigation-bar-space:where(.svelte-hjhal6) { - flex: 1; - text-align: left; -}`);var UwA=JA(" ",1),TwA=JA('
          ');function JwA(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=or("jsoneditor:NavigationBar"),o=L(e,"json",9),a=L(e,"selection",9),r=L(e,"onSelect",9),s=L(e,"onError",9),l=L(e,"pathParser",9),g=EA(void 0,!0),C=EA(!1,!0);function I(tA){n("get items for path",tA);var W=Xe(o(),tA);if(Array.isArray(W))return K8(0,W.length).map(String);if(Mn(W)){var BA=Object.keys(W).slice(0);return BA.sort(ER),BA}return[]}function d(tA){return vr(o(),tA)}function h(tA){n("select path",JSON.stringify(tA)),r()(fs(tA,tA))}function E(){N(C,!1)}function f(tA){E(),h(tA)}KA(()=>(K(a()),It),()=>{N(A,a()?It(a()):[])}),KA(()=>(K(o()),c(A)),()=>{N(i,aa(Xe(o(),c(A))))}),KA(()=>c(A),()=>{c(A),setTimeout(()=>{if(c(g)&&c(g).scrollTo){var tA=c(g).scrollWidth-c(g).clientWidth;tA>0&&(n("scrollTo ",tA),c(g).scrollTo({left:tA,behavior:"smooth"}))}})}),Rn(),ni(!0);var m=TwA(),v=dA(m),k=tA=>{var W=UwA(),BA=et(W);da(BA,1,()=>c(A),ka,(AA,IA,aA)=>{LZ(AA,{getItems:I,get path(){return c(A)},index:aA,onSelect:h})});var X=_A(BA,2),iA=AA=>{LZ(AA,{getItems:I,get path(){return c(A)},get index(){return c(A),wA(()=>c(A).length)},onSelect:h})};jA(X,AA=>{c(i)&&AA(iA)}),CA(tA,W)},S=tA=>{KwA(tA,{get path(){return c(A)},onClose:E,onChange:f,get onError(){return s()},pathExists:d,get pathParser(){return l()}})};jA(v,tA=>{c(C)?tA(S,!1):tA(k)});var b,x=_A(v,2),F=dA(x),z=dA(F),P=_A(F,2),Z=it(()=>c(C)?bz:mz);tn(P,{get data(){return c(Z)}}),Oo(m,tA=>N(g,tA),()=>c(g)),Se(tA=>{b=ii(x,1,"jse-navigation-bar-edit svelte-hjhal6",null,b,{flex:!c(C),editing:c(C)}),_n(x,"title",c(C)?"Cancel editing the selected path":"Edit the selected path"),Lt(z,tA)},[()=>(K(aa),K(o()),c(C),wA(()=>aa(o())||c(C)?"\xA0":"Navigation bar"))]),fe("click",x,function(){N(C,!c(C))}),CA(t,m),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-search-box.svelte-1x1x8q0 { - border: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); - border-radius: 3px; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-color-readonly, #b2b2b2); - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); - display: inline-block; - width: 400px; - max-width: 100%; - overflow: auto; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) { - display: flex; - align-items: stretch; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0), -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) input:where(.svelte-1x1x8q0) { - font-family: inherit; - font-size: inherit; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0) { - display: block; - text-align: center; - border: none; - padding: 0 5px; - margin: 0; - cursor: pointer; - color: var(--jse-panel-button-color, inherit); - background: var(--jse-panel-button-background, transparent); -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0):hover { - color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); - background: var(--jse-panel-button-background-highlight, #e0e0e0); -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) input:where(.svelte-1x1x8q0) { - color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); - border: var(--jse-input-border, 1px solid #d8dbdf); - border-radius: 3px; - background: var(--jse-input-background, var(--jse-background-color, #fff)); - height: 28px; - padding: 0 5px; - margin: 0; - flex: 1; - width: 0; - min-width: 50px; - outline: none; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-replace-toggle:where(.svelte-1x1x8q0) { - padding: var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)); - min-width: 20px; - background: var(--jse-panel-button-background-highlight, #e0e0e0); -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) { - flex: 1; - display: flex; - flex-direction: column; - padding: calc(0.5 * var(--jse-padding, 10px)); - gap: calc(0.5 * var(--jse-padding, 10px)); -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) { - flex: 1; - display: flex; - align-items: center; - position: relative; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-icon:where(.svelte-1x1x8q0) { - color: inherit; - cursor: inherit; - background: inherit; - width: 32px; - text-align: center; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) label.jse-search-input-label:where(.svelte-1x1x8q0) { - flex: 1; - display: flex; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-count:where(.svelte-1x1x8q0) { - color: inherit; - font-size: 80%; - visibility: hidden; - padding: 0 5px; - min-width: 36px; - text-align: center; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-count.jse-visible:where(.svelte-1x1x8q0) { - visibility: visible; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-replace-section:where(.svelte-1x1x8q0) { - flex: 1; - display: flex; - padding-left: 32px; -} -.jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-replace-section:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0) { - width: auto; -}`);var OwA=JA(''),YwA=JA('
          '),HwA=JA('');function J$(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=EA(void 0,!0),o=or("jsoneditor:SearchBox"),a=L(e,"json",9),r=L(e,"documentState",9),s=L(e,"parser",9),l=L(e,"showSearch",9),g=L(e,"showReplace",13),C=L(e,"readOnly",9),I=L(e,"columns",9),d=L(e,"onSearch",9),h=L(e,"onFocus",9),E=L(e,"onPatch",9),f=L(e,"onClose",9),m=EA("",!0),v="",k=EA("",!0),S=EA(!1,!0),b=EA(void 0,!0),x=ME(function(NA){return PA.apply(this,arguments)},300),F=ME(function(NA){return Je.apply(this,arguments)},300);function z(){g(!g()&&!C())}function P(NA){NA.stopPropagation();var ke=TC(NA);ke==="Enter"&&(NA.preventDefault(),c(m)!==v?x.flush():aA()),ke==="Shift+Enter"&&(NA.preventDefault(),uA()),ke==="Ctrl+Enter"&&(NA.preventDefault(),g()?BA():aA()),ke==="Ctrl+H"&&(NA.preventDefault(),z()),ke==="Escape"&&(NA.preventDefault(),fA())}function Z(NA){TC(NA)==="Enter"&&(NA.preventDefault(),NA.stopPropagation(),BA())}function tA(){return W.apply(this,arguments)}function W(){return(W=zt(function*(){Ro(),yield x.flush()})).apply(this,arguments)}function BA(){return X.apply(this,arguments)}function X(){return(X=zt(function*(){var NA;if(!C()){var ke=(NA=c(b))===null||NA===void 0?void 0:NA.activeItem;if(o("handleReplace",{replaceText:c(k),activeItem:ke}),c(b)&&ke&&a()!==void 0){N(b,Me(Me({},hZ(c(b))),{},{activeIndex:c(i)}));var{operations:HA,newSelection:vA}=l6A(a(),r(),c(k),ke,s());E()(HA,(Gt,ft)=>({state:ft,selection:vA})),Ro(),yield F.flush(),yield $A()}}})).apply(this,arguments)}function iA(){return AA.apply(this,arguments)}function AA(){return(AA=zt(function*(){if(!C()){o("handleReplaceAll",{text:c(m),replaceText:c(k)});var{operations:NA,newSelection:ke}=(function(HA,vA,Gt,ft,he){for(var Ot=QZ(Gt,HA,{maxResults:1/0}),He=[],je=0;je$.field!==oA.field?$.field===Qc.key?1:-1:oA.path.length-$.path.length);var oi,j=[];return He.forEach($=>{var{field:oA,path:sA,items:TA}=$;if(oA===Qc.key){var de=Yi(sA),Qe=Xe(HA,de),GA=ki(sA),OA=e3(de,Object.keys(Qe),GA,fZ(GA,ft,TA));j=j.concat(OA),oi=Yh(HA,OA)}else{if(oA!==Qc.value)throw new Error("Cannot replace: unknown type of search result field ".concat(oA));var ht=Xe(HA,sA);if(ht===void 0)throw new Error("Cannot replace: path not found ".concat(vt(sA)));var tt=typeof ht=="string"?ht:String(ht),ze=v0(HA,vA,sA),Oe=fZ(tt,ft,TA),Ci=[{op:"replace",path:vt(sA),value:ze?Oe:$h(Oe,he)}];j=j.concat(Ci),oi=Yh(HA,Ci)}}),{operations:j,newSelection:oi}})(a(),r(),c(m),c(k),s());E()(NA,(HA,vA)=>({state:vA,selection:ke})),yield $A()}})).apply(this,arguments)}function IA(NA){NA.select()}function aA(){return rA.apply(this,arguments)}function rA(){return(rA=zt(function*(){N(b,c(b)?hZ(c(b)):void 0),yield $A()})).apply(this,arguments)}function uA(){return UA.apply(this,arguments)}function UA(){return UA=zt(function*(){N(b,c(b)?(function(NA){var ke=NA.activeIndex>0?NA.activeIndex-1:NA.items.length-1,HA=NA.items[ke],vA=NA.items.map((Gt,ft)=>Me(Me({},Gt),{},{active:ft===ke}));return Me(Me({},NA),{},{items:vA,activeItem:HA,activeIndex:ke})})(c(b)):void 0),yield $A()}),UA.apply(this,arguments)}function $A(){return zA.apply(this,arguments)}function zA(){return(zA=zt(function*(){var NA;o("handleFocus",c(b));var ke=(NA=c(b))===null||NA===void 0?void 0:NA.activeItem;ke&&a()!==void 0&&(yield h()(ke.path,ke.resultIndex))})).apply(this,arguments)}function pA(){return pA=zt(function*(NA){yield _e(NA,c(m),a())}),pA.apply(this,arguments)}function PA(){return PA=zt(function*(NA){yield _e(l(),NA,a()),yield $A()}),PA.apply(this,arguments)}function Je(){return Je=zt(function*(NA){yield _e(l(),c(m),NA)}),Je.apply(this,arguments)}function _e(NA,ke,HA){return YA.apply(this,arguments)}function YA(){return YA=zt(function*(NA,ke,HA){return NA?(o("applySearch",{showSearch:NA,text:ke}),ke===""?(o("clearing search result"),c(b)!==void 0&&N(b,void 0),Promise.resolve()):(v=ke,N(S,!0),new Promise(vA=>{setTimeout(()=>{var Gt=QZ(ke,HA,{maxResults:M_,columns:I()});N(b,(function(ft,he){var Ot=he!=null&&he.activeItem?pZ(he.activeItem):void 0,He=ft.findIndex(xe=>Mi(Ot,pZ(xe))),je=He!==-1?He:he?.activeIndex!==void 0&&he?.activeIndex0?0:-1,pt=ft.map((xe,oi)=>Me(Me({resultIndex:oi},xe),{},{active:oi===je}));return{items:pt,activeItem:pt[je],activeIndex:je}})(Gt,c(b))),N(S,!1),vA()})}))):(c(b)&&N(b,void 0),Promise.resolve())}),YA.apply(this,arguments)}function fA(){o("handleClose"),x.cancel(),F.cancel(),_e(!1,c(m),a()),f()()}KA(()=>c(b),()=>{var NA;N(A,((NA=c(b))===null||NA===void 0||(NA=NA.items)===null||NA===void 0?void 0:NA.length)||0)}),KA(()=>c(b),()=>{var NA;N(i,((NA=c(b))===null||NA===void 0?void 0:NA.activeIndex)||0)}),KA(()=>(c(A),M_),()=>{N(n,c(A)>=M_?"".concat(999,"+"):String(c(A)))}),KA(()=>(K(d()),c(b)),()=>{d()(c(b))}),KA(()=>K(l()),()=>{(function(NA){pA.apply(this,arguments)})(l())}),KA(()=>c(m),()=>{x(c(m))}),KA(()=>K(a()),()=>{F(a())}),Rn(),ni(!0);var XA=Fi(),DA=et(XA),ee=NA=>{var ke=HwA(),HA=dA(ke),vA=dA(HA),Gt=GA=>{var OA=OwA(),ht=dA(OA),tt=it(()=>g()?c0:kE);tn(ht,{get data(){return c(tt)}}),fe("click",OA,z),CA(GA,OA)};jA(vA,GA=>{C()||GA(Gt)});var ft=dA(_A(vA,2)),he=dA(ft),Ot=dA(he),He=GA=>{tn(GA,{get data(){return pz},spin:!0})},je=GA=>{tn(GA,{get data(){return m4}})};jA(Ot,GA=>{c(S)?GA(He):GA(je,!1)});var pt=_A(he,2),xe=dA(pt);_r(()=>lD(xe,()=>c(m),GA=>N(m,GA))),ms(xe,GA=>IA?.(GA)),_r(()=>fe("paste",xe,tA));var oi,j=_A(pt,2),$=dA(j),oA=_A(j,2);tn(dA(oA),{get data(){return Mz}});var sA=_A(oA,2);tn(dA(sA),{get data(){return fz}});var TA=_A(sA,2);tn(dA(TA),{get data(){return D4}});var de=_A(ft,2),Qe=GA=>{var OA=YwA(),ht=dA(OA),tt=_A(ht,2),ze=_A(tt,2);lD(ht,()=>c(k),Oe=>N(k,Oe)),fe("keydown",ht,Z),fe("click",tt,BA),fe("click",ze,iA),CA(GA,OA)};jA(de,GA=>{g()&&!C()&&GA(Qe)}),Se(()=>{var GA;oi=ii(j,1,"jse-search-count svelte-1x1x8q0",null,oi,{"jse-visible":c(m)!==""}),Lt($,"".concat(c(i)!==-1&&c(i){l()&&NA(ee)}),CA(t,XA),Ft()}var Yf=Symbol("path");function zwA(t,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1/0,i={};Array.isArray(t)&&(function(o,a,r){if(o.length1?(o.length-1)/(a-1):o.length,l=0;l{Mn(o)?O$(o,i,e):i[Yf]=!0});var n=[];return Yf in i&&n.push([]),Y$(i,[],n,e),n}function O$(t,e,A){for(var i in t){var n=t[i],o=e[i]||(e[i]={});Mn(n)&&A?O$(n,o,A):o[Yf]===void 0&&(o[Yf]=!0)}}function Y$(t,e,A,i){for(var n in t){var o=e.concat(n),a=t[n];a&&a[Yf]===!0&&A.push(o),ia(a)&&i&&Y$(a,o,A,i)}}function PwA(t,e,A,i,n,o){for(var a=arguments.length>6&&arguments[6]!==void 0?arguments[6]:80,r=Vo(A)?A.length:0,s=(function(v,k){var S=Object.values(v);if(en(S))return k;var b=(x,F)=>x+F;return S.reduce(b)/S.length})(i,n),l=t-a,g=e+2*a,C=v=>i[v]||n,I=0,d=o;d0&&(d-=C(--I));for(var h=I,E=0;Ek0(i,o))}}function sd(t,e){var{rowIndex:A,columnIndex:i}=t;return[String(A),...e[i]]}function jwA(t,e){var[A,i]=T9(t,a=>SR(a.path[0])),n=K9(A,qwA),o=U9(n,a=>{var r={row:[],columns:{}};return a.forEach(s=>{var l=(function(g,C){var I=hg(g.path,C);return I.columnIndex!==-1?I.columnIndex:-1})(s,e);l!==-1?(r.columns[l]===void 0&&(r.columns[l]=[]),r.columns[l].push(s)):r.row.push(s)}),r});return{root:i,rows:o}}function Eh(t,e){if(e&&e.length!==0)return e.length===1?e[0]:{path:t,message:"Multiple validation issues: "+e.map(A=>Bl(A.path)+" "+A.message).join(", "),severity:hc.warning}}function qwA(t){return parseInt(t.path[0],10)}function VwA(t,e,A){var i=e.some(n=>(function(o,a,r){if(!o)return!1;if(a.op==="replace"){var s=Es(a.path),{rowIndex:l,columnIndex:g}=hg(s,r),C=r.findIndex(I=>Mi(I,o.path));if(l!==-1&&g!==-1&&g!==C)return!1}return!0})(t,n,A));return i?void 0:t}var ps=or("jsoneditor:actions");function H$(t){return hR.apply(this,arguments)}function hR(){return hR=zt(function*(t){var{json:e,selection:A,indentation:i,readOnly:n,parser:o,onPatch:a}=t;if(!n&&e!==void 0&&A&&Dh(A)){var r=C$(e,A,i,o);if(r!==void 0){ps("cut",{selection:A,clipboard:r,indentation:i}),yield WR(r);var{operations:s,newSelection:l}=Q$(e,A);a(s,(g,C)=>({state:C,selection:l}))}}}),hR.apply(this,arguments)}function z$(t){return QR.apply(this,arguments)}function QR(){return QR=zt(function*(t){var{json:e,selection:A,indentation:i,parser:n}=t,o=C$(e,A,i,n);o!==void 0&&(ps("copy",{clipboard:o,indentation:i}),yield WR(o))}),QR.apply(this,arguments)}function P$(t){var{clipboardText:e,json:A,selection:i,readOnly:n,parser:o,onPatch:a,onChangeText:r,onPasteMultilineText:s,openRepairModal:l}=t;if(!n)try{g(e)}catch(C){l(e,I=>{ps("repaired pasted text: ",I),g(I)})}function g(C){if(A!==void 0){var I=i||Hi([]),d=h$(A,I,C,o),h=(function(E,f,m){var v=arguments.length>3&&arguments[3]!==void 0?arguments[3]:e6A;if(E.length>v)return!1;var k=/\n/.test(E);if(!k)return!1;var S=f.some(x=>x.op==="replace"&&Array.isArray(x.value)),b=f.filter(x=>x.op==="add").length>1;if(!S&&!b)return!1;try{return Zf(E,m.parse),!1}catch(x){return!0}})(e,d,o);ps("paste",{pastedText:C,operations:d,ensureSelection:I,pasteMultilineText:h}),a(d,(E,f)=>{var m=f;return d.filter(v=>(I9(v)||$6(v))&&aa(v.value)).forEach(v=>{var k=il(A,v.path);m=vd(E,m,k)}),{state:m}}),h&&s(C)}else ps("paste text",{pastedText:C}),r(e,(E,f)=>{if(E)return{state:vd(E,f,[])}})}}function j$(t){var{json:e,text:A,selection:i,keepSelection:n,readOnly:o,onChange:a,onPatch:r}=t;if(!o&&i){var s=e!==void 0&&(nr(i)||En(i))?fs(i.path,i.path):i;if(en(It(i)))ps("remove root",{selection:i}),a&&a({text:"",json:void 0},e!==void 0?{text:void 0,json:e}:{text:A||"",json:e},{contentErrors:void 0,patchResult:void 0});else if(e!==void 0){var{operations:l,newSelection:g}=Q$(e,s);ps("remove",{operations:l,selection:i,newSelection:g}),r(l,(C,I)=>({state:I,selection:n?i:g}))}}}function yD(t){var{insertType:e,selectInside:A,initialValue:i,json:n,selection:o,readOnly:a,parser:r,onPatch:s,onReplaceJson:l}=t;if(!a){var g=(function(E,f,m){if(m==="object")return{};if(m==="array")return[];if(m==="structure"&&E!==void 0){var v=f?g$(f):[],k=Xe(E,v);if(Array.isArray(k)&&!en(k)){var S=lg(k);return aa(S)?N9(S,b=>Array.isArray(b)?[]:Mn(b)?void 0:""):""}}return""})(n,o,e);if(n!==void 0){var C=r.stringify(g),I=h$(n,o,C,r);ps("onInsert",{insertType:e,operations:I,newValue:g,data:C});var d=ki(I.filter(E=>E.op==="add"||E.op==="replace"));s(I,(E,f,m)=>{if(d){var v=il(E,d.path);if(aa(g))return{state:Bc(E,f,v,HR),selection:A?OC(v):m};if(g===""){var k=en(v)?void 0:Xe(E,Yi(v));return{state:Bc(E,f,v,tD),selection:Mn(k)?zR(v,i):BD(v,i)}}}}),ps("after patch")}else{ps("onInsert",{insertType:e,newValue:g});var h=[];l(g,(E,f)=>({state:vd(E,f,h),selection:aa(g)?OC(h):BD(h)}))}}}function q$(t){return uR.apply(this,arguments)}function uR(){return uR=zt(function*(t){var{char:e,selectInside:A,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s,onSelect:l}=t;o||(nr(n)?l(Me(Me({},n),{},{edit:!0,initialValue:e})):e==="{"?yD({insertType:"object",selectInside:A,initialValue:void 0,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s}):e==="["?yD({insertType:"array",selectInside:A,initialValue:void 0,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s}):En(n)&&i!==void 0?aa(Xe(i,n.path))||l(Me(Me({},n),{},{edit:!0,initialValue:e})):(ps("onInsertValueWithCharacter",{char:e}),yield(function(g){return fR.apply(this,arguments)})({char:e,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s})))}),uR.apply(this,arguments)}function fR(){return fR=zt(function*(t){var{char:e,json:A,selection:i,readOnly:n,parser:o,onPatch:a,onReplaceJson:r}=t;n||yD({insertType:"value",selectInside:!1,initialValue:e,json:A,selection:i,readOnly:n,parser:o,onPatch:a,onReplaceJson:r})}),fR.apply(this,arguments)}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-json-preview.svelte-25xmyd { - flex: 1; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-panel-color-readonly, #b2b2b2); - overflow: auto; - white-space: pre-wrap; - padding: 2px; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -}`);var WwA=JA('
          ');function V$(t,e){Nt(e,!1);var A=EA(),i=EA(),n=L(e,"text",8),o=L(e,"json",8),a=L(e,"indentation",8),r=L(e,"parser",8);KA(()=>(K(o()),K(n())),()=>{N(A,o()!==void 0?{json:o()}:{text:n()||""})}),KA(()=>(c(A),K(a()),K(r()),cD),()=>{N(i,SC(eR(c(A),a(),r()),cD))}),Rn(),ni();var s=WwA(),l=dA(s);Se(()=>Lt(l,c(i))),CA(t,s),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -button.jse-context-menu-button.svelte-16jz6ui { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - flex: 1; - white-space: nowrap; - padding: var(--jse-padding, 10px); - color: inherit; -} -button.jse-context-menu-button.svelte-16jz6ui:hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -} -button.jse-context-menu-button.svelte-16jz6ui:focus { - background: var(--jse-context-menu-background-highlight, #7a7a7a); - z-index: 1; -} -button.jse-context-menu-button.svelte-16jz6ui:disabled { - color: var(--jse-context-menu-color-disabled, #9d9d9d); - background: unset; -} -button.jse-context-menu-button.left.svelte-16jz6ui { - text-align: left; -} -button.jse-context-menu-button.svelte-16jz6ui svg { - width: 16px; -}`);var ZwA=JA('');function J_(t,e){Nt(e,!1);var A=L(e,"item",8),i=L(e,"className",8,void 0),n=L(e,"onRequestClose",8);ni();var o=ZwA(),a=dA(o),r=g=>{tn(g,{get data(){return K(A()),wA(()=>A().icon)}})};jA(a,g=>{K(A()),wA(()=>A().icon)&&g(r)});var s=_A(a,2),l=g=>{var C=dr();Se(()=>Lt(C,(K(A()),wA(()=>A().text)))),CA(g,C)};jA(s,g=>{K(A()),wA(()=>A().text)&&g(l)}),Se(g=>{ii(o,1,g,"svelte-16jz6ui"),_n(o,"title",(K(A()),wA(()=>A().title))),o.disabled=(K(A()),wA(()=>A().disabled||!1))},[()=>bI((K(wc),K(i()),K(A()),wA(()=>wc("jse-context-menu-button",i(),A().className))))]),fe("click",o,g=>{n()(),A().onClick(g)}),CA(t,o),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-dropdown-button.svelte-bov1j6 { - flex: 1; - line-height: normal; - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - position: relative; - padding: 0; - display: flex; -} -.jse-dropdown-button.svelte-bov1j6 ul:where(.svelte-bov1j6) { - margin: 0; - padding: 0; -} -.jse-dropdown-button.svelte-bov1j6 ul:where(.svelte-bov1j6) li:where(.svelte-bov1j6) { - margin: 0; - padding: 0; - list-style-type: none; -} -.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - width: 2em; - background: var(--jse-context-menu-background, #656565); - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); - border-radius: 0; -} -.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown.jse-visible:where(.svelte-bov1j6) { - background: var(--jse-context-menu-background, #656565); -} -.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -} -.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):focus { - z-index: 1; -} -.jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):disabled { - color: var(--jse-context-menu-color-disabled, #9d9d9d); - background: unset; -} -.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) { - display: none; - position: absolute; - top: 100%; - left: 0; - z-index: 1; - background: var(--jse-context-menu-background, #656565); - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); -} -.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items.jse-visible:where(.svelte-bov1j6) { - display: block; -} -.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - width: 100%; - text-align: left; - padding: var(--jse-padding, 10px); - margin: 0; -} -.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6):hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -} -.jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6):disabled { - color: var(--jse-context-menu-color-disabled, #9d9d9d); - background: unset; -}`);var XwA=JA('
        • '),$wA=JA('
            ');Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -button.jse-context-menu-button.svelte-1y5l9l1 { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - flex: 1; - white-space: nowrap; - padding: var(--jse-padding, 10px); - color: inherit; -} -button.jse-context-menu-button.svelte-1y5l9l1:hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -} -button.jse-context-menu-button.svelte-1y5l9l1:focus { - background: var(--jse-context-menu-background-highlight, #7a7a7a); - z-index: 1; -} -button.jse-context-menu-button.svelte-1y5l9l1:disabled { - color: var(--jse-context-menu-color-disabled, #9d9d9d); - background: unset; -} -button.jse-context-menu-button.left.svelte-1y5l9l1 { - text-align: left; -} -button.jse-context-menu-button.svelte-1y5l9l1 svg { - width: 16px; -}`);var A5A=JA('');function O_(t,e){Nt(e,!1);var A=EA(),i=L(e,"item",8),n=L(e,"className",8,void 0),o=L(e,"onRequestClose",8);KA(()=>(K(i()),K(o())),()=>{N(A,i().items.map(a=>Me(Me({},a),{},{onClick:r=>{o()(),a.onClick(r)}})))}),Rn(),ni(),(function(a,r){Nt(r,!1);var s=EA(void 0,!0),l=L(r,"items",25,()=>[]),g=L(r,"title",9,void 0),C=L(r,"width",9,"120px"),I=EA(!1,!0);function d(){N(I,!1)}function h(b){TC(b)==="Escape"&&(b.preventDefault(),N(I,!1))}As(()=>{document.addEventListener("click",d),document.addEventListener("keydown",h)}),Dg(()=>{document.removeEventListener("click",d),document.removeEventListener("keydown",h)}),KA(()=>K(l()),()=>{N(s,l().every(b=>b.disabled===!0))}),Rn(),ni(!0);var E=$wA(),f=dA(E);Ia(f,r,"defaultItem",{},null);var m,v=_A(f,2);tn(dA(v),{get data(){return c0}});var k,S=_A(v,2);da(dA(S),5,l,ka,(b,x)=>{var F=XwA(),z=dA(F),P=dA(z),Z=W=>{tn(W,{get data(){return c(x),wA(()=>c(x).icon)}})};jA(P,W=>{c(x),wA(()=>c(x).icon)&&W(Z)});var tA=_A(P);Se(()=>{var W;_n(z,"title",(c(x),wA(()=>c(x).title))),z.disabled=(c(x),wA(()=>c(x).disabled)),ii(z,1,bI((c(x),wA(()=>c(x).className))),"svelte-bov1j6"),Lt(tA," ".concat((c(x),(W=wA(()=>c(x).text))!==null&&W!==void 0?W:"")))}),fe("click",z,W=>c(x).onClick(W)),CA(b,F)}),Se(()=>{var b;_n(E,"title",g()),m=ii(v,1,"jse-open-dropdown svelte-bov1j6",null,m,{"jse-visible":c(I)}),v.disabled=c(s),k=ii(S,1,"jse-dropdown-items svelte-bov1j6",null,k,{"jse-visible":c(I)}),mg(S,"width: ".concat((b=C())!==null&&b!==void 0?b:"",";"))}),fe("click",v,function(){var b=c(I);setTimeout(()=>N(I,!b))}),fe("click",E,d),CA(a,E),Ft()})(t,{get width(){return K(i()),wA(()=>i().width)},get items(){return c(A)},$$slots:{defaultItem:(a,r)=>{var s=A5A(),l=dA(s),g=I=>{tn(I,{get data(){return K(i()),wA(()=>i().main.icon)}})};jA(l,I=>{K(i()),wA(()=>i().main.icon)&&I(g)});var C=_A(l);Se(I=>{var d;ii(s,1,I,"svelte-1y5l9l1"),_n(s,"title",(K(i()),wA(()=>i().main.title))),s.disabled=(K(i()),wA(()=>i().main.disabled||!1)),Lt(C," ".concat((K(i()),(d=wA(()=>i().main.text))!==null&&d!==void 0?d:"")))},[()=>bI((K(wc),K(n()),K(i()),wA(()=>wc("jse-context-menu-button",n(),i().main.className))))]),fe("click",s,I=>{o()(),i().main.onClick(I)}),CA(a,s)}}}),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-contextmenu.svelte-1shjn02 { - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - background: var(--jse-context-menu-background, #656565); - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); -} -.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) { - display: flex; - flex-direction: row; - align-items: flex-start; - justify-content: stretch; -} -.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-label:where(.svelte-1shjn02) { - flex: 1; - white-space: nowrap; - padding: var(--jse-padding, 10px); - color: var(--jse-context-menu-color-disabled, #9d9d9d); - line-height: normal; -} -.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-tip:where(.svelte-1shjn02) { - flex: 1; - background: var(--jse-context-menu-tip-background, rgba(255, 255, 255, 0.2)); - color: var(--context-menu-tip-color, inherit); - margin: calc(0.5 * var(--jse-padding, 10px)); - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); - font-size: 80%; - line-height: 1.3em; - display: flex; - flex-direction: row; - align-items: flex-start; - gap: var(--jse-padding, 10px); - border-radius: 3px; -} -.jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-tip:where(.svelte-1shjn02) div.jse-tip-icon:where(.svelte-1shjn02) { - padding-top: calc(0.5 * var(--jse-padding, 10px)); -} -.jse-contextmenu.svelte-1shjn02 .jse-column:where(.svelte-1shjn02) { - flex: 1; - display: flex; - flex-direction: column; - align-items: stretch; -} -.jse-contextmenu.svelte-1shjn02 .jse-column:where(.svelte-1shjn02):not(:last-child) { - border-right: 1px solid var(--jse-context-menu-separator-color, #7a7a7a); -} -.jse-contextmenu.svelte-1shjn02 .jse-separator:where(.svelte-1shjn02) { - width: 100%; - height: 1px; - background: var(--jse-context-menu-separator-color, #7a7a7a); -}`);var e5A=JA('
            '),t5A=JA('
            '),i5A=JA('
            '),n5A=JA('
            '),o5A=JA('
            '),a5A=JA('
            '),r5A=JA('
            '),s5A=JA('');function W$(t,e){Nt(e,!1);var A=L(e,"items",9),i=L(e,"onRequestClose",9),n=L(e,"tip",9),o=EA(void 0,!0);As(()=>{var I=Array.from(c(o).querySelectorAll("button")).find(d=>!d.disabled);I&&I.focus()});var a={ArrowUp:"Up",ArrowDown:"Down",ArrowLeft:"Left",ArrowRight:"Right"};function r(I){return console.error("Unknown type of context menu item",I),"???"}ni(!0);var s=s5A(),l=dA(s);da(l,1,A,ka,(I,d)=>{var h=Fi(),E=et(h),f=v=>{J_(v,{get item(){return c(d)},get onRequestClose(){return i()}})},m=v=>{var k=Fi(),S=et(k),b=F=>{O_(F,{get item(){return c(d)},get onRequestClose(){return i()}})},x=F=>{var z=Fi(),P=et(z),Z=W=>{var BA=o5A();da(BA,5,()=>(c(d),wA(()=>c(d).items)),ka,(X,iA)=>{var AA=Fi(),IA=et(AA),aA=uA=>{J_(uA,{get item(){return c(iA)},get onRequestClose(){return i()}})},rA=uA=>{var UA=Fi(),$A=et(UA),zA=PA=>{O_(PA,{get item(){return c(iA)},get onRequestClose(){return i()}})},pA=PA=>{var Je=Fi(),_e=et(Je),YA=XA=>{var DA=i5A();da(DA,5,()=>(c(iA),wA(()=>c(iA).items)),ka,(ee,NA)=>{var ke=Fi(),HA=et(ke),vA=ft=>{J_(ft,{className:"left",get item(){return c(NA)},get onRequestClose(){return i()}})},Gt=ft=>{var he=Fi(),Ot=et(he),He=pt=>{O_(pt,{className:"left",get item(){return c(NA)},get onRequestClose(){return i()}})},je=pt=>{var xe=Fi(),oi=et(xe),j=oA=>{CA(oA,e5A())},$=oA=>{var sA=Fi(),TA=et(sA),de=GA=>{var OA=t5A(),ht=dA(OA);Se(()=>Lt(ht,(c(NA),wA(()=>c(NA).text)))),CA(GA,OA)},Qe=GA=>{var OA=dr();Se(ht=>Lt(OA,ht),[()=>(c(NA),wA(()=>r(c(NA))))]),CA(GA,OA)};jA(TA,GA=>{K(tZ),c(NA),wA(()=>tZ(c(NA)))?GA(de):GA(Qe,!1)},!0),CA(oA,sA)};jA(oi,oA=>{K(dI),c(NA),wA(()=>dI(c(NA)))?oA(j):oA($,!1)},!0),CA(pt,xe)};jA(Ot,pt=>{K(dh),c(NA),wA(()=>dh(c(NA)))?pt(He):pt(je,!1)},!0),CA(ft,he)};jA(HA,ft=>{K(bC),c(NA),wA(()=>bC(c(NA)))?ft(vA):ft(Gt,!1)}),CA(ee,ke)}),CA(XA,DA)},fA=XA=>{var DA=Fi(),ee=et(DA),NA=HA=>{CA(HA,n5A())},ke=HA=>{var vA=dr();Se(Gt=>Lt(vA,Gt),[()=>(c(iA),wA(()=>r(c(iA))))]),CA(HA,vA)};jA(ee,HA=>{K(dI),c(iA),wA(()=>dI(c(iA)))?HA(NA):HA(ke,!1)},!0),CA(XA,DA)};jA(_e,XA=>{K(nZ),c(iA),wA(()=>nZ(c(iA)))?XA(YA):XA(fA,!1)},!0),CA(PA,Je)};jA($A,PA=>{K(dh),c(iA),wA(()=>dh(c(iA)))?PA(zA):PA(pA,!1)},!0),CA(uA,UA)};jA(IA,uA=>{K(bC),c(iA),wA(()=>bC(c(iA)))?uA(aA):uA(rA,!1)}),CA(X,AA)}),CA(W,BA)},tA=W=>{var BA=Fi(),X=et(BA),iA=IA=>{CA(IA,a5A())},AA=IA=>{var aA=dr();Se(rA=>Lt(aA,rA),[()=>(c(d),wA(()=>r(c(d))))]),CA(IA,aA)};jA(X,IA=>{K(dI),c(d),wA(()=>dI(c(d)))?IA(iA):IA(AA,!1)},!0),CA(W,BA)};jA(P,W=>{K(iZ),c(d),wA(()=>iZ(c(d)))?W(Z):W(tA,!1)},!0),CA(F,z)};jA(S,F=>{K(dh),c(d),wA(()=>dh(c(d)))?F(b):F(x,!1)},!0),CA(v,k)};jA(E,v=>{K(bC),c(d),wA(()=>bC(c(d)))?v(f):v(m,!1)}),CA(I,h)});var g=_A(l,2),C=I=>{var d=r5A(),h=dA(d),E=dA(h);tn(dA(E),{get data(){return dz}});var f=dA(_A(E,2));Se(()=>Lt(f,n())),CA(I,d)};jA(g,I=>{n()&&I(C)}),Oo(s,I=>N(o,I),()=>c(o)),fe("keydown",s,function(I){var d=TC(I),h=a[d];if(h&&I.target){I.preventDefault();var E=NmA({allElements:Array.from(c(o).querySelectorAll("button:not([disabled])")),currentElement:I.target,direction:h,hasPrio:f=>f.getAttribute("data-type")!=="jse-open-dropdown"});E&&E.focus()}}),CA(t,s),Ft()}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-value.jse-string.svelte-1htmvf1 { - color: var(--jse-value-color-string, #008000); -} -.jse-value.jse-object.svelte-1htmvf1, .jse-value.jse-array.svelte-1htmvf1 { - min-width: 16px; - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); -} -.jse-value.jse-number.svelte-1htmvf1 { - color: var(--jse-value-color-number, #ee422e); -} -.jse-value.jse-boolean.svelte-1htmvf1 { - color: var(--jse-value-color-boolean, #ff8c00); -} -.jse-value.jse-null.svelte-1htmvf1 { - color: var(--jse-value-color-null, #004ed0); -} -.jse-value.jse-invalid.svelte-1htmvf1 { - color: var(--jse-text-color, #4d4d4d); -} -.jse-value.jse-url.svelte-1htmvf1 { - color: var(--jse-value-color-url, #008000); - text-decoration: underline; -} - -.jse-enum-value.svelte-1htmvf1 { - background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); - border: none; - padding: 0; - font-family: inherit; - font-size: inherit; - cursor: pointer; - outline: none; -} -.jse-enum-value.jse-selected.svelte-1htmvf1 { - background: var(--jse-selection-background-color, #d3d3d3); - color: inherit; -} -.jse-enum-value.jse-value.svelte-1htmvf1:focus { - color: var(--jse-text-color, #4d4d4d); -}`);var $Ee=JA(""),Ahe=JA("");var P5,j5;function q5(t,e){return P5||(j5=new WeakMap,P5=new ResizeObserver(A=>{for(var i of A){var n=j5.get(i.target);n&&n(i.target)}})),j5.set(t,e),P5.observe(t),{destroy:()=>{j5.delete(t),P5.unobserve(t)}}}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-tree-mode.svelte-10mlrw4 { - flex: 1; - display: flex; - flex-direction: column; - position: relative; - background: var(--jse-background-color, #fff); - min-width: 0; - min-height: 0; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-text-color, #4d4d4d); - line-height: var(--jse-line-height, calc(1em + 4px)); -} -.jse-tree-mode.svelte-10mlrw4 .jse-hidden-input-label:where(.svelte-10mlrw4) .jse-hidden-input:where(.svelte-10mlrw4) { - position: fixed; - top: -10px; - left: -10px; - width: 1px; - height: 1px; - padding: 0; - border: 0; - outline: none; -} -.jse-tree-mode.no-main-menu.svelte-10mlrw4 { - border-top: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-tree-mode.svelte-10mlrw4 .jse-search-box-container:where(.svelte-10mlrw4) { - position: relative; - height: 0; - top: var(--jse-padding, 10px); - margin-right: calc(var(--jse-padding, 10px) + 20px); - margin-left: var(--jse-padding, 10px); - text-align: right; - z-index: 3; -} -.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) { - flex: 1; - overflow: auto; - position: relative; - padding: 2px; - display: flex; - flex-direction: column; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4):last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-loading-space:where(.svelte-10mlrw4) { - flex: 1; -} -.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-loading:where(.svelte-10mlrw4) { - flex: 2; - text-align: center; - color: var(--jse-panel-color-readonly, #b2b2b2); - box-sizing: border-box; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -} -.jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-search-box-background:where(.svelte-10mlrw4) { - border: 50px solid var(--jse-modal-background, #f5f5f5); - margin: -2px; - margin-bottom: 2px; - display: inline-block; -}`);var l5A=JA(" ",1),g5A=JA('
            '),c5A=JA('
            ',1),C5A=JA(' ',1),I5A=JA('
            loading...
            '),d5A=JA('
            ',1);function pR(t,e){Nt(e,!1);var A=EA(void 0,!0),i=or("jsoneditor:TreeMode"),n=typeof window>"u";i("isSSR:",n);var o=Y2(),a=Y2(),{openAbsolutePopup:r,closeAbsolutePopup:s}=kI("absolute-popup"),l=EA(void 0,!0),g=EA(void 0,!0),C=EA(void 0,!0),I=!1,d=R$(),h=L(e,"readOnly",9),E=L(e,"externalContent",9),f=L(e,"externalSelection",9),m=L(e,"history",9),v=L(e,"truncateTextSize",9),k=L(e,"mainMenuBar",9),S=L(e,"navigationBar",9),b=L(e,"escapeControlCharacters",9),x=L(e,"escapeUnicodeCharacters",9),F=L(e,"parser",9),z=L(e,"parseMemoizeOne",9),P=L(e,"validator",9),Z=L(e,"validationParser",9),tA=L(e,"pathParser",9),W=L(e,"indentation",9),BA=L(e,"onError",9),X=L(e,"onChange",9),iA=L(e,"onChangeMode",9),AA=L(e,"onSelect",9),IA=L(e,"onUndo",9),aA=L(e,"onRedo",9),rA=L(e,"onRenderValue",9),uA=L(e,"onRenderMenu",9),UA=L(e,"onRenderContextMenu",9),$A=L(e,"onClassName",9),zA=L(e,"onFocus",9),pA=L(e,"onBlur",9),PA=L(e,"onSortModal",9),Je=L(e,"onTransformModal",9),_e=L(e,"onJSONEditorModal",9),YA=!1,fA=EA(!1,!0),XA=EA(void 0,!0);qR({onMount:As,onDestroy:Dg,getWindow:()=>Xf(c(C)),hasFocus:()=>YA&&document.hasFocus()||RR(c(C)),onFocus:()=>{I=!0,zA()&&zA()()},onBlur:()=>{I=!1,pA()&&pA()()}});var DA=EA(void 0,!0),ee=EA(void 0,!0),NA=void 0,ke=!1,HA=EA(oR({json:c(DA)}),!0),vA=EA(Kf(f())?f():void 0,!0);function Gt(eA){N(vA,eA)}As(()=>{if(c(vA)){var eA=It(c(vA));N(HA,Bc(c(DA),c(HA),eA,tD)),setTimeout(()=>Fo(eA))}});var ft,he=EA(void 0,!0),Ot=EA(void 0,!0),He=EA(void 0,!0),je=EA(void 0,!0),pt=EA(!1,!0),xe=EA(!1,!0);function oi(eA){N(je,(ft=eA)?f$(c(DA),ft.items):void 0)}function j(eA,yA){return $.apply(this,arguments)}function $(){return($=zt(function*(eA,yA){N(HA,Bc(c(DA),c(HA),eA,tD));var WA=ho(yA);yield Ui(eA,{element:WA})})).apply(this,arguments)}function oA(){N(pt,!1),N(xe,!1),_t()}function sA(eA){i("select validation error",eA),N(vA,Hi(eA.path)),Ui(eA.path)}function TA(eA){var yA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:aR;i("expand"),N(HA,Bc(c(DA),c(HA),eA,yA))}function de(eA,yA){N(HA,sZ(c(DA),c(HA),eA,yA)),c(vA)&&(function(WA,Ge){return k0(It(WA),Ge)&&(It(WA).length>Ge.length||Va(WA))})(c(vA),eA)&&N(vA,void 0)}var Qe=EA(!1,!0),GA=EA([],!0),OA=EA(void 0,!0),ht=xE(N$);function tt(eA,yA,WA,Ge){vh(()=>{var ye;try{ye=ht(eA,yA,WA,Ge)}catch(be){ye=[{path:[],message:"Failed to validate: "+be.message,severity:hc.warning}]}Mi(ye,c(GA))||(i("validationErrors changed:",ye),N(GA,ye),N(OA,(function(be,ot){var Vt;return ot.forEach(Gi=>{Vt=NZ(be,Vt,Gi.path,(Fn,$i)=>Me(Me({},$i),{},{validationError:Gi}))}),ot.forEach(Gi=>{for(var Fn=Gi.path;Fn.length>0;)Fn=Yi(Fn),Vt=NZ(be,Vt,Fn,($i,Qo)=>Qo.validationError?Qo:Me(Me({},Qo),{},{validationError:{isChildError:!0,path:Fn,message:"Contains invalid data",severity:hc.warning}}))}),Vt})(eA,c(GA))))},ye=>i("validationErrors updated in ".concat(ye," ms")))}function ze(){return i("validate"),NA?{parseError:NA,isRepairable:!1}:(tt(c(DA),P(),F(),Z()),en(c(GA))?void 0:{validationErrors:c(GA)})}function Oe(){return c(DA)}function Ci(){return c(HA)}function gn(){return c(vA)}function hn(eA){i("applyExternalContent",{updatedContent:eA}),Nf(eA)?(function(yA){if(yA!==void 0){var WA=!Mi(c(DA),yA);if(i("update external json",{isChanged:WA,currentlyText:c(DA)===void 0}),!!WA){var Ge={documentState:c(HA),selection:c(vA),json:c(DA),text:c(ee),textIsRepaired:c(Qe)};N(DA,yA),N(HA,Ul(yA,c(HA))),Ke(c(DA)),N(ee,void 0),N(Qe,!1),NA=void 0,nn(c(DA)),Si(Ge)}}})(eA.json):Rf(eA)&&(function(yA){if(!(yA===void 0||Nf(E()))){var WA=yA!==c(ee);if(i("update external text",{isChanged:WA}),!!WA){var Ge={documentState:c(HA),selection:c(vA),json:c(DA),text:c(ee),textIsRepaired:c(Qe)};try{N(DA,z()(yA)),N(HA,Ul(c(DA),c(HA))),Ke(c(DA)),N(ee,yA),N(Qe,!1),NA=void 0}catch(ye){try{N(DA,z()(ag(yA))),N(HA,Ul(c(DA),c(HA))),Ke(c(DA)),N(ee,yA),N(Qe,!0),NA=void 0,nn(c(DA))}catch(be){N(DA,void 0),N(HA,void 0),N(ee,E().text),N(Qe,!1),NA=c(ee)!==void 0&&c(ee)!==""?Th(c(ee),ye.message||String(ye)):void 0}}nn(c(DA)),Si(Ge)}}})(eA.text)}function Ke(eA){ke||(ke=!0,N(HA,vd(eA,c(HA),[])))}function nn(eA){c(vA)&&(vr(eA,hd(c(vA)))&&vr(eA,It(c(vA)))||(i("clearing selection: path does not exist anymore",c(vA)),N(vA,Bh(eA,c(HA)))))}function Si(eA){if(eA.json!==void 0||eA.text!==void 0){var yA=c(DA)!==void 0&&eA.json!==void 0;m().add({type:"tree",undo:{patch:yA?[{op:"replace",path:"",value:eA.json}]:void 0,json:eA.json,text:eA.text,documentState:eA.documentState,textIsRepaired:eA.textIsRepaired,selection:D0(eA.selection),sortedColumn:void 0},redo:{patch:yA?[{op:"replace",path:"",value:c(DA)}]:void 0,json:c(DA),text:c(ee),documentState:c(HA),textIsRepaired:c(Qe),selection:D0(c(vA)),sortedColumn:void 0}})}}function Li(eA,yA){var WA;if(i("patch",eA,yA),c(DA)===void 0)throw new Error("Cannot apply patch: no JSON");var Ge=c(DA),ye={json:void 0,text:c(ee),documentState:c(HA),selection:D0(c(vA)),textIsRepaired:c(Qe),sortedColumn:void 0},be=u$(c(DA),eA),ot=r$(c(DA),c(HA),eA),Vt=(WA=Yh(c(DA),eA))!==null&&WA!==void 0?WA:c(vA),Gi=typeof yA=="function"?yA(ot.json,ot.documentState,Vt):void 0;return N(DA,Gi?.json!==void 0?Gi.json:ot.json),N(HA,Gi?.state!==void 0?Gi.state:ot.documentState),N(vA,Gi?.selection!==void 0?Gi.selection:Vt),N(ee,void 0),N(Qe,!1),N(Ot,void 0),N(He,void 0),NA=void 0,nn(c(DA)),m().add({type:"tree",undo:Me({patch:be},ye),redo:{patch:eA,json:void 0,text:c(ee),documentState:c(HA),selection:D0(c(vA)),sortedColumn:void 0,textIsRepaired:c(Qe)}}),{json:c(DA),previousJson:Ge,undo:be,redo:eA}}function Zi(){!h()&&c(vA)&&N(vA,zR(It(c(vA))))}function bt(){if(!h()&&c(vA)){var eA=It(c(vA)),yA=Xe(c(DA),eA);aa(yA)?(function(WA,Ge){i("openJSONEditorModal",{path:WA,value:Ge}),YA=!0,_e()({content:{json:Ge},path:WA,onPatch:c(M).onPatch,onClose:()=>{YA=!1,setTimeout(_t)}})})(eA,yA):N(vA,BD(eA))}}function on(){if(!h()&&En(c(vA))){var eA=It(c(vA)),yA=vt(eA),WA=Xe(c(DA),eA),Ge=!v0(c(DA),c(HA),eA),ye=Ge?String(WA):$h(String(WA),F());i("handleToggleEnforceString",{enforceString:Ge,value:WA,updatedValue:ye}),Ae([{op:"replace",path:yA,value:ye}],(be,ot)=>({state:_D(c(DA),ot,eA,{type:"value",enforceString:Ge})}))}}function Kt(){return c(Qe)&&c(DA)!==void 0&&De(c(DA)),c(DA)!==void 0?{json:c(DA)}:{text:c(ee)||""}}function G(){return dt.apply(this,arguments)}function dt(){return dt=zt(function*(){var eA=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];yield H$({json:c(DA),selection:c(vA),indentation:eA?W():void 0,readOnly:h(),parser:F(),onPatch:Ae})}),dt.apply(this,arguments)}function Ei(){return Qn.apply(this,arguments)}function Qn(){return Qn=zt(function*(){var eA=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];c(DA)!==void 0&&(yield z$({json:c(DA),selection:c(vA),indentation:eA?W():void 0,parser:F()}))}),Qn.apply(this,arguments)}function un(eA){var yA;eA.preventDefault(),Bo((yA=eA.clipboardData)===null||yA===void 0?void 0:yA.getData("text/plain"))}function Vn(){return Yo.apply(this,arguments)}function Yo(){return(Yo=zt(function*(){try{Bo(yield navigator.clipboard.readText())}catch(eA){console.error(eA),N(fA,!0)}})).apply(this,arguments)}function Bo(eA){eA!==void 0&&P$({clipboardText:eA,json:c(DA),selection:c(vA),readOnly:h(),parser:F(),onPatch:Ae,onChangeText:mA,onPasteMultilineText:On,openRepairModal:No})}function No(eA,yA){N(XA,{text:eA,onParse:WA=>Zf(WA,Ge=>Wf(Ge,F())),onRepair:jX,onApply:yA,onClose:_t})}function Zo(){j$({json:c(DA),text:c(ee),selection:c(vA),keepSelection:!1,readOnly:h(),onChange:X(),onPatch:Ae})}function Do(){!h()&&c(DA)!==void 0&&c(vA)&&Dh&&!en(It(c(vA)))&&(i("duplicate",{selection:c(vA)}),Ae(B$(c(DA),MI(c(DA),c(vA)))))}function Ba(){h()||!c(vA)||!Co(c(vA))&&!En(c(vA))||en(It(c(vA)))||(i("extract",{selection:c(vA)}),Ae(E$(c(DA),c(vA)),(eA,yA)=>{if(aa(eA))return{state:R_(eA,yA,[])}}))}function Xo(eA){yD({insertType:eA,selectInside:!0,initialValue:void 0,json:c(DA),selection:c(vA),readOnly:h(),parser:F(),onPatch:Ae,onReplaceJson:De})}function ra(eA){nr(c(vA))&&N(vA,Hi(c(vA).path)),c(vA)||N(vA,Bh(c(DA),c(HA))),Xo(eA)}function yo(eA){if(!h()&&c(vA))if(J5(c(vA)))try{var yA=hd(c(vA)),WA=Xe(c(DA),yA),Ge=(function(be,ot,Vt){if(ot==="array"){if(Array.isArray(be))return be;if(Mn(be))return qW(be);if(typeof be=="string")try{var Gi=Vt.parse(be);if(Array.isArray(Gi))return Gi;if(Mn(Gi))return qW(Gi)}catch($i){return[be]}return[be]}if(ot==="object"){if(Array.isArray(be))return jW(be);if(Mn(be))return be;if(typeof be=="string")try{var Fn=Vt.parse(be);if(Mn(Fn))return Fn;if(Array.isArray(Fn))return jW(Fn)}catch($i){return{value:be}}return{value:be}}if(ot==="value")return aa(be)?Vt.stringify(be):be;throw new Error("Cannot convert ".concat(kR(be,Vt)," to ").concat(ot))})(WA,eA,F());if(Ge===WA)return;var ye=[{op:"replace",path:vt(yA),value:Ge}];i("handleConvert",{selection:c(vA),path:yA,type:eA,operations:ye}),Ae(ye,(be,ot)=>({state:c(vA)?vd(be,ot,It(c(vA))):c(HA)}))}catch(be){BA()(be)}else BA()(new Error("Cannot convert current selection to ".concat(eA)))}function ge(){if(c(vA)){var eA=CZ(c(DA),c(HA),c(vA),!1),yA=Yi(It(c(vA)));eA&&!en(It(eA))&&Mi(yA,Yi(It(eA)))?N(vA,LC(It(eA))):N(vA,OC(yA)),i("insert before",{selection:c(vA),selectionBefore:eA,parentPath:yA}),Ro(),zi()}}function mi(){if(c(vA)){var eA=vI(c(DA),c(vA));i("insert after",eA),N(vA,LC(eA)),Ro(),zi()}}function cn(eA){return fn.apply(this,arguments)}function fn(){return(fn=zt(function*(eA){yield q$({char:eA,selectInside:!0,json:c(DA),selection:c(vA),readOnly:h(),parser:F(),onPatch:Ae,onReplaceJson:De,onSelect:Gt})})).apply(this,arguments)}function Ho(){if(!h()&&m().canUndo){var eA=m().undo();if(ID(eA)){var yA={json:c(DA),text:c(ee)};N(DA,eA.undo.patch?tl(c(DA),eA.undo.patch):eA.undo.json),N(HA,eA.undo.documentState),N(vA,eA.undo.selection),N(ee,eA.undo.text),N(Qe,eA.undo.textIsRepaired),NA=void 0,i("undo",{item:eA,json:c(DA),documentState:c(HA),selection:c(vA)}),xA(yA,eA.undo.patch&&eA.redo.patch?{json:c(DA),previousJson:yA.json,redo:eA.undo.patch,undo:eA.redo.patch}:void 0),_t(),c(vA)&&Ui(It(c(vA)),{scrollToWhenVisible:!1})}else IA()(eA)}}function ya(){if(!h()&&m().canRedo){var eA=m().redo();if(ID(eA)){var yA={json:c(DA),text:c(ee)};N(DA,eA.redo.patch?tl(c(DA),eA.redo.patch):eA.redo.json),N(HA,eA.redo.documentState),N(vA,eA.redo.selection),N(ee,eA.redo.text),N(Qe,eA.redo.textIsRepaired),NA=void 0,i("redo",{item:eA,json:c(DA),documentState:c(HA),selection:c(vA)}),xA(yA,eA.undo.patch&&eA.redo.patch?{json:c(DA),previousJson:yA.json,redo:eA.redo.patch,undo:eA.undo.patch}:void 0),_t(),c(vA)&&Ui(It(c(vA)),{scrollToWhenVisible:!1})}else aA()(eA)}}function _i(eA){var yA;h()||c(DA)===void 0||(YA=!0,PA()({id:o,json:c(DA),rootPath:eA,onSort:(yA=zt(function*(WA){var{operations:Ge}=WA;i("onSort",eA,Ge),Ae(Ge,(ye,be)=>({state:R_(ye,be,eA),selection:Hi(eA)}))}),function(WA){return yA.apply(this,arguments)}),onClose:()=>{YA=!1,setTimeout(_t)}}))}function Eo(){c(vA)&&_i(dZ(c(DA),c(vA)))}function Za(){_i([])}function vo(eA){if(c(DA)!==void 0){var{id:yA,onTransform:WA,onClose:Ge}=eA,ye=eA.rootPath||[];YA=!0,Je()({id:yA||a,json:c(DA),rootPath:ye,onTransform:be=>{WA?WA({operations:be,json:c(DA),transformedJson:tl(c(DA),be)}):(i("onTransform",ye,be),Ae(be,(ot,Vt)=>({state:R_(ot,Vt,ye),selection:Hi(ye)})))},onClose:()=>{YA=!1,setTimeout(_t),Ge&&Ge()}})}}function Ta(){c(vA)&&vo({rootPath:dZ(c(DA),c(vA))})}function Jn(){vo({rootPath:[]})}function Ui(eA){return qt.apply(this,arguments)}function qt(){return qt=zt(function*(eA){var{scrollToWhenVisible:yA=!0,element:WA}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};N(HA,Bc(c(DA),c(HA),eA,tD));var Ge=WA??Nn(eA);if(i("scrollTo",{path:eA,elem:Ge,refContents:c(l)}),!Ge||!c(l))return Promise.resolve();var ye=c(l).getBoundingClientRect(),be=Ge.getBoundingClientRect();if(!yA&&be.bottom>ye.top&&be.top{d(Ge,{container:c(l),offset:ot,duration:300,callback:()=>Vt()})})}),qt.apply(this,arguments)}function Nn(eA){var yA,WA;return Ro(),(yA=(WA=c(l))===null||WA===void 0?void 0:WA.querySelector('div[data-path="'.concat(eD(eA),'"]')))!==null&&yA!==void 0?yA:void 0}function ho(eA){var yA,WA;return Ro(),(yA=(WA=c(l))===null||WA===void 0?void 0:WA.querySelector('span[data-search-result-index="'.concat(eA,'"]')))!==null&&yA!==void 0?yA:void 0}function Fo(eA){var yA=Nn(eA);if(yA&&c(l)){var WA=c(l).getBoundingClientRect(),Ge=yA.getBoundingClientRect(),ye=aa(Xe(c(DA),eA))?20:Ge.height;Ge.topWA.bottom-20&&d(yA,{container:c(l),offset:-(WA.height-ye-20),duration:0})}}function xA(eA,yA){if(eA.json!==void 0||eA?.text!==void 0){if(c(ee)!==void 0){var WA,Ge={text:c(ee),json:void 0};(WA=X())===null||WA===void 0||WA(Ge,eA,{contentErrors:ze(),patchResult:yA})}else if(c(DA)!==void 0){var ye,be={text:void 0,json:c(DA)};(ye=X())===null||ye===void 0||ye(be,eA,{contentErrors:ze(),patchResult:yA})}}}function Ae(eA,yA){i("handlePatch",eA,yA);var WA={json:c(DA),text:c(ee)},Ge=Li(eA,yA);return xA(WA,Ge),Ge}function De(eA,yA){var WA={json:c(DA),text:c(ee)},Ge={documentState:c(HA),selection:c(vA),json:c(DA),text:c(ee),textIsRepaired:c(Qe)},ye=Bc(c(DA),Ul(eA,c(HA)),[],bf),be=typeof yA=="function"?yA(eA,ye,c(vA)):void 0;N(DA,be?.json!==void 0?be.json:eA),N(HA,be?.state!==void 0?be.state:ye),N(vA,be?.selection!==void 0?be.selection:c(vA)),N(ee,void 0),N(Qe,!1),NA=void 0,nn(c(DA)),Si(Ge),xA(WA,void 0)}function mA(eA,yA){i("handleChangeText");var WA={json:c(DA),text:c(ee)},Ge={documentState:c(HA),selection:c(vA),json:c(DA),text:c(ee),textIsRepaired:c(Qe)};try{N(DA,z()(eA)),N(HA,Bc(c(DA),Ul(c(DA),c(HA)),[],bf)),N(ee,void 0),N(Qe,!1),NA=void 0}catch(be){try{N(DA,z()(ag(eA))),N(HA,Bc(c(DA),Ul(c(DA),c(HA)),[],bf)),N(ee,eA),N(Qe,!0),NA=void 0}catch(ot){N(DA,void 0),N(HA,oR({json:c(DA),expand:bf})),N(ee,eA),N(Qe,!1),NA=c(ee)!==""?Th(c(ee),be.message||String(be)):void 0}}if(typeof yA=="function"){var ye=yA(c(DA),c(HA),c(vA));N(DA,ye?.json!==void 0?ye.json:c(DA)),N(HA,ye?.state!==void 0?ye.state:c(HA)),N(vA,ye?.selection!==void 0?ye.selection:c(vA))}nn(c(DA)),Si(Ge),xA(WA,void 0)}function FA(eA,yA){var WA=arguments.length>2&&arguments[2]!==void 0&&arguments[2];i("handleExpand",{path:eA,expanded:yA,recursive:WA}),yA?TA(eA,WA?HR:aR):de(eA,WA),_t()}function le(){FA([],!0,!0)}function Ne(){FA([],!1,!0)}function nt(eA){i("openFind",{findAndReplace:eA}),N(pt,!1),N(xe,!1),Ro(),N(pt,!0),N(xe,eA)}function rt(eA,yA){i("handleExpandSection",eA,yA),N(HA,(function(WA,Ge,ye,be){return Oh(WA,Ge,ye,(ot,Vt)=>{if(!ir(Vt))return Vt;var Gi=n$(Vt.visibleSections.concat(be));return Me(Me({},Vt),{},{visibleSections:Gi})})})(c(DA),c(HA),eA,yA))}function xt(eA){i("pasted json as text",eA),N(Ot,eA)}function On(eA){i("pasted multiline text",{pastedText:eA}),N(He,eA)}function Ti(eA){var yA,{anchor:WA,left:Ge,top:ye,width:be,height:ot,offsetTop:Vt,offsetLeft:Gi,showTip:Fn}=eA,$i=(function(Zn){var{json:Aa,documentState:mn,selection:Tt,readOnly:an,onEditKey:Ai,onEditValue:yt,onToggleEnforceString:Ii,onCut:la,onCopy:Xn,onPaste:ea,onRemove:Ea,onDuplicate:Er,onExtract:L0,onInsertBefore:fl,onInsert:bg,onConvert:_c,onInsertAfter:Mg,onSort:is,onTransform:hr}=Zn,pl=Aa!==void 0,G0=!!Tt,ml=!!Tt&&en(It(Tt)),Ln=Tt?Xe(Aa,It(Tt)):void 0,xa=Array.isArray(Ln)?"Edit array":Mn(Ln)?"Edit object":"Edit value",_a=pl&&(Co(Tt)||nr(Tt)||En(Tt)),YI=Tt&&!ml?Xe(Aa,Yi(It(Tt))):void 0,Jd=!an&&pl&&dD(Tt)&&!ml&&!Array.isArray(YI),HI=!an&&pl&&Tt!==void 0&&dD(Tt),DQ=HI&&!aa(Ln),Od=!an&&_a,yQ=_a,Hv=!an&&G0,zv=!an&&pl&&_a&&!ml,Pv=!an&&pl&&Tt!==void 0&&(Co(Tt)||En(Tt))&&!ml,Rc=_a,zI=Rc?"Convert to:":"Insert:",Ra=!an&&(Va(Tt)&&Array.isArray(Ln)||dl(Tt)&&Array.isArray(YI)),Hl=!an&&(Rc?J5(Tt)&&!Mn(Ln):G0),vQ=!an&&(Rc?J5(Tt)&&!Array.isArray(Ln):G0),bQ=!an&&(Rc?J5(Tt)&&aa(Ln):G0),PI=Tt!==void 0&&v0(Aa,mn,It(Tt));function Fr(MQ){_a?MQ!=="structure"&&_c(MQ):bg(MQ)}return[{type:"row",items:[{type:"button",onClick:()=>Ai(),icon:F1,text:"Edit key",title:"Edit the key (Double-click on the key)",disabled:!Jd},{type:"dropdown-button",main:{type:"button",onClick:()=>yt(),icon:F1,text:xa,title:"Edit the value (Double-click on the value)",disabled:!HI},width:"11em",items:[{type:"button",icon:F1,text:xa,title:"Edit the value (Double-click on the value)",onClick:()=>yt(),disabled:!HI},{type:"button",icon:PI?X9:eS,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>Ii(),disabled:!DQ}]}]},{type:"separator"},{type:"row",items:[{type:"dropdown-button",main:{type:"button",onClick:()=>la(!0),icon:L1,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!Od},width:"10em",items:[{type:"button",icon:L1,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>la(!0),disabled:!Od},{type:"button",icon:L1,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>la(!1),disabled:!Od}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Xn(!0),icon:IC,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!yQ},width:"12em",items:[{type:"button",icon:IC,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>Xn(!0),disabled:!yQ},{type:"button",icon:IC,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>Xn(!1),disabled:!yQ}]},{type:"button",onClick:()=>ea(),icon:V9,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:!Hv}]},{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"button",onClick:()=>Er(),icon:Z9,text:"Duplicate",title:"Duplicate selected contents (Ctrl+D)",disabled:!zv},{type:"button",onClick:()=>L0(),icon:Ez,text:"Extract",title:"Extract selected contents",disabled:!Pv},{type:"button",onClick:()=>is(),icon:y4,text:"Sort",title:"Sort array or object contents",disabled:an||!_a},{type:"button",onClick:()=>hr(),icon:p4,text:"Transform",title:"Transform array or object contents (filter, sort, project)",disabled:an||!_a},{type:"button",onClick:()=>Ea(),icon:T8,text:"Remove",title:"Remove selected contents (Delete)",disabled:an||!_a}]},{type:"column",items:[{type:"label",text:zI},{type:"button",onClick:()=>Fr("structure"),icon:Rc?v4:G1,text:"Structure",title:zI+" structure like the first item in the array",disabled:!Ra},{type:"button",onClick:()=>Fr("object"),icon:Rc?v4:G1,text:"Object",title:zI+" object",disabled:!Hl},{type:"button",onClick:()=>Fr("array"),icon:Rc?v4:G1,text:"Array",title:zI+" array",disabled:!vQ},{type:"button",onClick:()=>Fr("value"),icon:Rc?v4:G1,text:"Value",title:zI+" value",disabled:!bQ}]}]},{type:"separator"},{type:"row",items:[{type:"button",onClick:()=>fl(),icon:wz,text:"Insert before",title:"Select area before current entry to insert or paste contents",disabled:an||!_a||ml},{type:"button",onClick:()=>Mg(),icon:hz,text:"Insert after",title:"Select area after current entry to insert or paste contents",disabled:an||!_a||ml}]}]})({json:c(DA),documentState:c(HA),selection:c(vA),readOnly:h(),onEditKey:Zi,onEditValue:bt,onToggleEnforceString:on,onCut:G,onCopy:Ei,onPaste:Vn,onRemove:Zo,onDuplicate:Do,onExtract:Ba,onInsertBefore:ge,onInsert:ra,onInsertAfter:mi,onConvert:yo,onSort:Eo,onTransform:Ta}),Qo=(yA=UA()($i))!==null&&yA!==void 0?yA:$i;if(Qo!==!1){var $t={left:Ge,top:ye,offsetTop:Vt,offsetLeft:Gi,width:be,height:ot,anchor:WA,closeOnOuterClick:!0,onClose:()=>{YA=!1,_t()}};YA=!0;var $o=r(W$,{tip:Fn?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:Qo,onRequestClose:()=>s($o)},$t)}}function zi(eA){if(!tr(c(vA)))if(eA&&(eA.stopPropagation(),eA.preventDefault()),eA&&eA.type==="contextmenu"&&eA.target!==c(g))Ti({left:eA.clientX,top:eA.clientY,width:xC,height:kC,showTip:!1});else{var yA,WA=(yA=c(l))===null||yA===void 0?void 0:yA.querySelector(".jse-context-menu-pointer.jse-selected");if(WA)Ti({anchor:WA,offsetTop:2,width:xC,height:kC,showTip:!1});else{var Ge,ye=(Ge=c(l))===null||Ge===void 0?void 0:Ge.getBoundingClientRect();ye&&Ti({top:ye.top+2,left:ye.left+2,width:xC,height:kC,showTip:!1})}}}function Xt(eA){Ti({anchor:t$(eA.target,"BUTTON"),offsetTop:0,width:xC,height:kC,showTip:!0})}function Ji(){return va.apply(this,arguments)}function va(){return(va=zt(function*(){if(i("apply pasted json",c(Ot)),c(Ot)){var{onPasteAsJson:eA}=c(Ot);N(Ot,void 0),eA(),setTimeout(_t)}})).apply(this,arguments)}function Ut(){return st.apply(this,arguments)}function st(){return(st=zt(function*(){i("apply pasted multiline text",c(He)),c(He)&&(Bo(JSON.stringify(c(He))),setTimeout(_t))})).apply(this,arguments)}function Oi(){i("clear pasted json"),N(Ot,void 0),_t()}function Xi(){i("clear pasted multiline text"),N(He,void 0),_t()}function Wn(){iA()(Da.text)}function pn(eA){N(vA,eA),_t(),Ui(It(eA))}function _t(){i("focus"),c(g)&&(c(g).focus(),c(g).select())}function sa(eA){return(function(yA,WA,Ge){var ye=Yi(Ge),be=[ki(Ge)],ot=Xe(yA,ye),Vt=ot?__(ot,WA,be):void 0;return Vt?Hi(ye.concat(Vt)):LC(Ge)})(c(DA),c(HA),eA)}function zo(eA){c(A)&&c(A).onDrag(eA)}function D(){c(A)&&c(A).onDragEnd()}var M=EA(void 0,!0);KA(()=>c(vA),()=>{var eA;eA=c(vA),Mi(eA,f())||(i("onSelect",eA),AA()(eA))}),KA(()=>(K(b()),K(x())),()=>{N(he,xR({escapeControlCharacters:b(),escapeUnicodeCharacters:x()}))}),KA(()=>c(pt),()=>{(function(eA){c(l)&&eA&&c(l).scrollTop===0&&(Tl(l,c(l).style.overflowAnchor="none"),Tl(l,c(l).scrollTop+=vf),setTimeout(()=>{c(l)&&Tl(l,c(l).style.overflowAnchor="")}))})(c(pt))}),KA(()=>K(E()),()=>{hn(E())}),KA(()=>K(f()),()=>{(function(eA){Mi(c(vA),eA)||(i("applyExternalSelection",{selection:c(vA),externalSelection:eA}),Kf(eA)&&N(vA,eA))})(f())}),KA(()=>(c(DA),K(P()),K(F()),K(Z())),()=>{tt(c(DA),P(),F(),Z())}),KA(()=>(c(l),RZ),()=>{N(A,c(l)?RZ(c(l)):void 0)}),KA(()=>(K(h()),K(v()),K(F()),c(he),K(rA()),K($A())),()=>{N(M,{mode:Da.tree,readOnly:h(),truncateTextSize:v(),parser:F(),normalization:c(he),getJson:Oe,getDocumentState:Ci,getSelection:gn,findElement:Nn,findNextInside:sa,focus:_t,onPatch:Ae,onInsert:Xo,onExpand:FA,onSelect:Gt,onFind:nt,onExpandSection:rt,onPasteJson:xt,onRenderValue:rA(),onContextMenu:Ti,onClassName:$A()||(()=>{}),onDrag:zo,onDragEnd:D})}),KA(()=>c(M),()=>{i("context changed",c(M))}),Rn();var R={expand:TA,collapse:de,validate:ze,getJson:Oe,patch:Li,acceptAutoRepair:Kt,openTransformModal:vo,scrollTo:Ui,findElement:Nn,findSearchResult:ho,focus:_t};ni(!0);var V=d5A();fe("mousedown",NC,function(eA){!AQ(eA.target,yA=>yA===c(C))&&tr(c(vA))&&(i("click outside the editor, exit edit mode"),N(vA,D0(c(vA))),I&&c(g)&&(c(g).focus(),c(g).blur()),i("blur (outside editor)"),c(g)&&c(g).blur())});var _,q=et(V),nA=dA(q),cA=eA=>{(function(yA,WA){Nt(WA,!1);var Ge=EA(void 0,!0),ye=EA(void 0,!0),be=EA(void 0,!0),ot=L(WA,"json",9),Vt=L(WA,"selection",9),Gi=L(WA,"readOnly",9),Fn=L(WA,"showSearch",13,!1),$i=L(WA,"history",9),Qo=L(WA,"onExpandAll",9),$t=L(WA,"onCollapseAll",9),$o=L(WA,"onUndo",9),Zn=L(WA,"onRedo",9),Aa=L(WA,"onSort",9),mn=L(WA,"onTransform",9),Tt=L(WA,"onContextMenu",9),an=L(WA,"onCopy",9),Ai=L(WA,"onRenderMenu",9);function yt(){Fn(!Fn())}var Ii=EA(void 0,!0),la=EA(void 0,!0),Xn=EA(void 0,!0),ea=EA(void 0,!0);KA(()=>K(ot()),()=>{N(Ge,ot()!==void 0)}),KA(()=>(c(Ge),K(Vt()),En),()=>{N(ye,c(Ge)&&(Co(Vt())||nr(Vt())||En(Vt())))}),KA(()=>(K(Qo()),K(ot())),()=>{N(Ii,{type:"button",icon:K$,title:"Expand all",className:"jse-expand-all",onClick:Qo(),disabled:!aa(ot())})}),KA(()=>(K($t()),K(ot())),()=>{N(la,{type:"button",icon:U$,title:"Collapse all",className:"jse-collapse-all",onClick:$t(),disabled:!aa(ot())})}),KA(()=>K(ot()),()=>{N(Xn,{type:"button",icon:m4,title:"Search (Ctrl+F)",className:"jse-search",onClick:yt,disabled:ot()===void 0})}),KA(()=>(K(Gi()),c(Ii),c(la),K(Aa()),K(ot()),K(mn()),c(Xn),K(Tt()),K($o()),K($i()),K(Zn()),K(an()),c(ye)),()=>{N(ea,Gi()?[c(Ii),c(la),{type:"separator"},{type:"button",icon:IC,title:"Copy (Ctrl+C)",className:"jse-copy",onClick:an(),disabled:!c(ye)},{type:"separator"},c(Xn),{type:"space"}]:[c(Ii),c(la),{type:"separator"},{type:"button",icon:y4,title:"Sort",className:"jse-sort",onClick:Aa(),disabled:Gi()||ot()===void 0},{type:"button",icon:p4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:mn(),disabled:Gi()||ot()===void 0},c(Xn),{type:"button",icon:W9,title:LR,className:"jse-contextmenu",onClick:Tt()},{type:"separator"},{type:"button",icon:Y8,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:$o(),disabled:!$i().canUndo},{type:"button",icon:O8,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Zn(),disabled:!$i().canRedo},{type:"space"}])}),KA(()=>(K(Ai()),c(ea)),()=>{N(be,Ai()(c(ea))||c(ea))}),Rn(),ni(!0),KD(yA,{get items(){return c(be)}}),Ft()})(eA,{get json(){return c(DA)},get selection(){return c(vA)},get readOnly(){return h()},get history(){return m()},onExpandAll:le,onCollapseAll:Ne,onUndo:Ho,onRedo:ya,onSort:Za,onTransform:Jn,onContextMenu:Xt,onCopy:Ei,get onRenderMenu(){return uA()},get showSearch(){return c(pt)},set showSearch(yA){N(pt,yA)},$$legacy:!0})};jA(nA,eA=>{k()&&eA(cA)});var MA=_A(nA,2),oe=eA=>{JwA(eA,{get json(){return c(DA)},get selection(){return c(vA)},onSelect:pn,get onError(){return BA()},get pathParser(){return tA()}})};jA(MA,eA=>{S()&&eA(oe)});var se=_A(MA,2),Ee=eA=>{var yA=C5A(),WA=et(yA),Ge=dA(WA);Ge.readOnly=!0,Oo(Ge,Vt=>N(g,Vt),()=>c(g));var ye=_A(WA,2),be=Vt=>{var Gi=Fi(),Fn=et(Gi),$i=$t=>{(function($o,Zn){function Aa(Ii){Ii.stopPropagation(),Zn.onCreateObject()}function mn(Ii){Ii.stopPropagation(),Zn.onCreateArray()}Nt(Zn,!0);var Tt=MwA();Tt.__click=()=>Zn.onClick();var an=_A(dA(Tt),2),Ai=_A(dA(an),2),yt=Ii=>{var la=bwA(),Xn=_A(et(la),2);_n(Xn,"title","Create an empty JSON object (press '{')"),Xn.__click=Aa;var ea=_A(Xn,2);_n(ea,"title","Create an empty JSON array (press '[')"),ea.__click=mn,CA(Ii,la)};jA(Ai,Ii=>{Zn.readOnly||Ii(yt)}),CA($o,Tt),Ft()})($t,{get readOnly(){return h()},onCreateObject:()=>{_t(),cn("{")},onCreateArray:()=>{_t(),cn("[")},onClick:()=>{_t()}})},Qo=$t=>{var $o=l5A(),Zn=et($o),Aa=it(()=>h()?[]:[{icon:w4,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:Wn}]);Yl(Zn,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return c(Aa)}}),V$(_A(Zn,2),{get text(){return c(ee)},get json(){return c(DA)},get indentation(){return W()},get parser(){return F()}}),CA($t,$o)};jA(Fn,$t=>{c(ee)===""||c(ee)===void 0?$t($i):$t(Qo,!1)}),CA(Vt,Gi)},ot=Vt=>{var Gi=c5A(),Fn=et(Gi);J$(dA(Fn),{get json(){return c(DA)},get documentState(){return c(HA)},get parser(){return F()},get showSearch(){return c(pt)},get showReplace(){return c(xe)},get readOnly(){return h()},columns:void 0,onSearch:oi,onFocus:j,onPatch:Ae,onClose:oA});var $i=_A(Fn,2);_n($i,"data-jsoneditor-scrollable-contents",!0);var Qo=dA($i),$t=Ai=>{CA(Ai,g5A())};jA(Qo,Ai=>{c(pt)&&Ai($t)}),BR(_A(Qo,2),{get value(){return c(DA)},pointer:"",get state(){return c(HA)},get validationErrors(){return c(OA)},get searchResults(){return c(je)},get selection(){return c(vA)},get context(){return c(M)},get onDragSelectionStart(){return ma}}),Oo($i,Ai=>N(l,Ai),()=>c(l));var $o=_A($i,2),Zn=Ai=>{var yt=it(()=>(c(Ot),wA(()=>"You pasted a JSON ".concat(Array.isArray(c(Ot).contents)?"array":"object"," as text")))),Ii=it(()=>[{icon:CC,text:"Paste as JSON instead",title:"Replace the value with the pasted JSON",onMouseDown:Ji},{text:"Leave as is",title:"Keep the JSON embedded in the value",onClick:Oi}]);Yl(Ai,{type:"info",get message(){return c(yt)},get actions(){return c(Ii)}})};jA($o,Ai=>{c(Ot)&&Ai(Zn)});var Aa=_A($o,2),mn=Ai=>{var yt=it(()=>[{icon:CC,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:Ut},{text:"Leave as is",title:"Keep the pasted array",onClick:Xi}]);Yl(Ai,{type:"info",message:"Multiline text was pasted as array",get actions(){return c(yt)}})};jA(Aa,Ai=>{c(He)&&Ai(mn)});var Tt=_A(Aa,2),an=Ai=>{var yt=it(()=>h()?[]:[{icon:J8,text:"Ok",title:"Accept the repaired document",onClick:Kt},{icon:w4,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:Wn}]);Yl(Ai,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return c(yt)},onClose:_t})};jA(Tt,Ai=>{c(Qe)&&Ai(an)}),VR(_A(Tt,2),{get validationErrors(){return c(GA)},selectError:sA}),CA(Vt,Gi)};jA(ye,Vt=>{c(DA)===void 0?Vt(be):Vt(ot,!1)}),fe("paste",Ge,un),CA(eA,yA)},Pe=eA=>{CA(eA,I5A())};jA(se,eA=>{n?eA(Pe,!1):eA(Ee)}),Oo(q,eA=>N(C,eA),()=>c(C));var Re=_A(q,2),Le=eA=>{F$(eA,{onClose:()=>N(fA,!1)})};jA(Re,eA=>{c(fA)&&eA(Le)});var ai=_A(Re,2),Yn=eA=>{L$(eA,DI(()=>c(XA),{onClose:()=>{var yA;(yA=c(XA))===null||yA===void 0||yA.onClose(),N(XA,void 0)}}))};return jA(ai,eA=>{c(XA)&&eA(Yn)}),Se(()=>_=ii(q,1,"jse-tree-mode svelte-10mlrw4",null,_,{"no-main-menu":!k()})),fe("keydown",q,function(eA){var yA=TC(eA),WA=eA.shiftKey;if(i("keydown",{combo:yA,key:eA.key}),yA==="Ctrl+X"&&(eA.preventDefault(),G(!0)),yA==="Ctrl+Shift+X"&&(eA.preventDefault(),G(!1)),yA==="Ctrl+C"&&(eA.preventDefault(),Ei(!0)),yA==="Ctrl+Shift+C"&&(eA.preventDefault(),Ei(!1)),yA==="Ctrl+D"&&(eA.preventDefault(),Do()),yA!=="Delete"&&yA!=="Backspace"||(eA.preventDefault(),Zo()),yA==="Insert"&&(eA.preventDefault(),Xo("structure")),yA==="Ctrl+A"&&(eA.preventDefault(),N(vA,Hi([]))),yA==="Ctrl+Q"&&zi(eA),yA==="ArrowUp"||yA==="Shift+ArrowUp"){eA.preventDefault();var Ge=c(vA)?CZ(c(DA),c(HA),c(vA),WA)||c(vA):Bh(c(DA),c(HA));N(vA,Ge),Fo(It(Ge))}if(yA==="ArrowDown"||yA==="Shift+ArrowDown"){eA.preventDefault();var ye=c(vA)?(function($i,Qo,$t){var $o=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if($t){var Zn=$o?It($t):vI($i,$t),Aa=aa(Xe($i,Zn))?sZ($i,Qo,Zn,!0):Qo,mn=__($i,Qo,Zn),Tt=__($i,Aa,Zn);if($o)return Va($t)?mn!==void 0?fs(mn,mn):void 0:dl($t)?Tt!==void 0?fs(Tt,Tt):void 0:Tt!==void 0?fs(hd($t),Tt):void 0;if(dl($t))return Tt!==void 0?Hi(Tt):void 0;if(Va($t)||En($t))return mn!==void 0?Hi(mn):void 0;if(nr($t)){if(mn===void 0||mn.length===0)return;var an=Yi(mn),Ai=Xe($i,an);return Array.isArray(Ai)?Hi(mn):JC(mn)}return Co($t)?Tt!==void 0?Hi(Tt):mn!==void 0?Hi(mn):void 0:void 0}})(c(DA),c(HA),c(vA),WA)||c(vA):Bh(c(DA),c(HA));N(vA,ye),Fo(It(ye))}if(yA==="ArrowLeft"||yA==="Shift+ArrowLeft"){eA.preventDefault();var be=c(vA)?(function($i,Qo,$t){var $o=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Zn=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if($t){var{caret:Aa,previous:mn}=IZ($i,Qo,$t,Zn);if($o)return Co($t)?void 0:fs($t.path,$t.path);if(Aa&&mn)return rR(mn);var Tt=Yi(It($t)),an=Xe($i,Tt);return En($t)&&Array.isArray(an)?fs($t.path,$t.path):Co($t)&&!Array.isArray(an)?JC($t.focusPath):void 0}})(c(DA),c(HA),c(vA),WA,!h())||c(vA):Bh(c(DA),c(HA));N(vA,be),Fo(It(be))}if(yA==="ArrowRight"||yA==="Shift+ArrowRight"){eA.preventDefault();var ot=c(vA)&&c(DA)!==void 0?(function($i,Qo,$t){var $o=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Zn=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if($t){var{caret:Aa,next:mn}=IZ($i,Qo,$t,Zn);return $o?Co($t)?void 0:fs($t.path,$t.path):Aa&&mn?rR(mn):Co($t)?Hi($t.focusPath):void 0}})(c(DA),c(HA),c(vA),WA,!h())||c(vA):Bh(c(DA),c(HA));N(vA,ot),Fo(It(ot))}if(yA==="Enter"&&c(vA)){if(RD(c(vA))){var Vt=c(vA).focusPath,Gi=Xe(c(DA),Yi(Vt));Array.isArray(Gi)&&(eA.preventDefault(),N(vA,Hi(Vt)))}nr(c(vA))&&(eA.preventDefault(),N(vA,Me(Me({},c(vA)),{},{edit:!0}))),En(c(vA))&&(eA.preventDefault(),aa(Xe(c(DA),c(vA).path))?FA(c(vA).path,!0):N(vA,Me(Me({},c(vA)),{},{edit:!0})))}if(yA.replace(/^Shift\+/,"").length===1&&c(vA))return eA.preventDefault(),void cn(eA.key);if(yA==="Enter"&&(dl(c(vA))||Va(c(vA))))return eA.preventDefault(),void cn("");if(yA==="Ctrl+Enter"&&En(c(vA))){var Fn=Xe(c(DA),c(vA).path);xD(Fn)&&window.open(String(Fn),"_blank")}yA==="Escape"&&c(vA)&&(eA.preventDefault(),N(vA,void 0)),yA==="Ctrl+F"&&(eA.preventDefault(),nt(!1)),yA==="Ctrl+H"&&(eA.preventDefault(),nt(!0)),yA==="Ctrl+Z"&&(eA.preventDefault(),Ho()),yA==="Ctrl+Shift+Z"&&(eA.preventDefault(),ya())}),fe("mousedown",q,function(eA){i("handleMouseDown",eA);var yA=eA.target;e$(yA,"BUTTON")||yA.isContentEditable||(_t(),c(vA)||c(DA)!==void 0||c(ee)!==""&&c(ee)!==void 0||(i("createDefaultSelection"),N(vA,Hi([]))))}),fe("contextmenu",q,zi),CA(t,V),jt(e,"expand",TA),jt(e,"collapse",de),jt(e,"validate",ze),jt(e,"getJson",Oe),jt(e,"patch",Li),jt(e,"acceptAutoRepair",Kt),jt(e,"openTransformModal",vo),jt(e,"scrollTo",Ui),jt(e,"findElement",Nn),jt(e,"findSearchResult",ho),jt(e,"focus",_t),Ft(R)}function Z$(t){return typeof(e=t)!="object"||e===null?t:new Proxy(t,{get:(A,i,n)=>Z$(Reflect.get(A,i,n)),set:()=>!1,deleteProperty:()=>!1});var e}var V5=or("jsoneditor:History");function X$(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=t.maxItems||1e3,A=[],i=0;function n(){return i0}function a(){return{canUndo:n(),canRedo:o(),items:()=>A.slice().reverse(),add:s,undo:g,redo:C,clear:l}}function r(){t.onChange&&t.onChange(a())}function s(I){V5("add",I),A=[I].concat(A.slice(i)).slice(0,e),i=0,r()}function l(){V5("clear"),A=[],i=0,r()}function g(){if(n()){var I=A[i];return i+=1,V5("undo",I),r(),I}}function C(){if(o())return V5("redo",A[i-=1]),r(),A[i]}return{get:a}}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-transform-modal-inner.svelte-lta8xm { - flex: 1; - display: flex; - flex-direction: column; - min-width: 0; - min-height: 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) { - color: inherit; - flex: 1; - display: flex; - flex-direction: column; - padding: 0; - overflow: auto; - min-width: 0; - min-height: 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-top: var(--jse-padding, 10px); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) { - flex: 1; - display: flex; - gap: calc(2 * var(--jse-padding, 10px)); - min-height: 0; - box-sizing: border-box; - padding: 0 calc(2 * var(--jse-padding, 10px)) var(--jse-padding, 10px); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) { - flex: 1; - display: flex; - flex-direction: column; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p { - margin: var(--jse-padding, 10px) 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p:first-child { - margin-top: 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p:last-child { - margin-bottom: 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) code { - background: var(--jse-modal-code-background, rgba(0, 0, 0, 0.05)); - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .query-error:where(.svelte-lta8xm) { - color: var(--jse-error-color, #ee5341); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) textarea.jse-query:where(.svelte-lta8xm) { - flex: 1; - outline: none; - resize: vertical; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) { - flex: 1; - display: flex; - flex-direction: column; - gap: calc(2 * var(--jse-padding, 10px)); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data:where(.svelte-lta8xm) { - flex: 1; - display: flex; - flex-direction: column; - min-height: 0; - box-sizing: border-box; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data.jse-hide:where(.svelte-lta8xm) { - flex: none; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-preview-data:where(.svelte-lta8xm) { - flex: 1; - display: flex; - flex-direction: column; - min-height: 0; - box-sizing: border-box; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents.jse-hide-original-data:where(.svelte-lta8xm) { - flex-direction: column; - gap: 0; - margin-bottom: 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) { - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)) calc(2 * var(--jse-padding, 10px)); -} -@media screen and (max-width: 1200px) { - .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) { - flex-direction: column; - overflow: auto; - } - .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) textarea.jse-query:where(.svelte-lta8xm) { - min-height: 150px; - flex: none; - } - .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-tree-mode { - height: 300px; - flex: none; - } - .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data:where(.svelte-lta8xm), - .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-preview-data:where(.svelte-lta8xm) { - flex: unset; - } -} -.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) { - font-weight: bold; - display: block; - box-sizing: border-box; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) .jse-label-inner:where(.svelte-lta8xm) { - margin-top: calc(2 * var(--jse-padding, 10px)); - margin-bottom: calc(0.5 * var(--jse-padding, 10px)); - box-sizing: border-box; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) .jse-label-inner:where(.svelte-lta8xm) button:where(.svelte-lta8xm) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - font-weight: bold; - padding: 0; -} -.jse-transform-modal-inner.svelte-lta8xm .jse-tree-mode { - flex: 1; - background: var(--jse-input-background-readonly, transparent); - box-shadow: none; - box-sizing: border-box; - --jse-main-border: var(--jse-input-border, 1px solid #d8dbdf); -} -.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm), -.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm) { - border: var(--jse-input-border, 1px solid #d8dbdf); - outline: none; - box-sizing: border-box; - padding: calc(0.5 * var(--jse-padding, 10px)); - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: inherit; - background: var(--jse-input-background, var(--jse-background-color, #fff)); -} -.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm):focus, -.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm):focus { - border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); -} -.jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm):read-only, -.jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm):read-only { - background: var(--jse-input-background-readonly, transparent); -} -.jse-transform-modal-inner.svelte-lta8xm .jse-preview.jse-error:where(.svelte-lta8xm) { - flex: 1; - background: var(--jse-input-background-readonly, transparent); - border: var(--jse-input-border, 1px solid #d8dbdf); - color: var(--jse-error-color, #ee5341); - padding: calc(0.5 * var(--jse-padding, 10px)); -} -.jse-transform-modal-inner.svelte-lta8xm a { - color: var(--jse-a-color, #156fc5); -} -.jse-transform-modal-inner.svelte-lta8xm a:hover { - color: var(--jse-a-color-highlight, #0f508d); -}`);var wf=kD(()=>m6A),hh=kD(()=>w6A),B5A=JA('
            '),E5A=JA(" ",1),h5A=JA('
            '),Q5A=JA('
            Language
            Path
            Query
            Preview
            ',1),u5A=JA('
            ');function f5A(t,e){var A,i,n;Nt(e,!1);var o=or("jsoneditor:TransformModal"),a=L(e,"id",25,()=>"transform-modal-"+wh()),r=L(e,"json",9),s=L(e,"rootPath",25,()=>[]),l=L(e,"indentation",9),g=L(e,"truncateTextSize",9),C=L(e,"escapeControlCharacters",9),I=L(e,"escapeUnicodeCharacters",9),d=L(e,"parser",9),h=L(e,"parseMemoizeOne",9),E=L(e,"validationParser",9),f=L(e,"pathParser",9),m=L(e,"queryLanguages",9),v=L(e,"queryLanguageId",13),k=L(e,"onChangeQueryLanguage",9),S=L(e,"onRenderValue",9),b=L(e,"onRenderMenu",9),x=L(e,"onRenderContextMenu",9),F=L(e,"onClassName",9),z=L(e,"onTransform",9),P=L(e,"onClose",9),Z=EA(void 0,!0),tA=EA(X$({onChange:HA=>N(tA,HA)}).get(),!0),W=EA(void 0,!0),BA=EA(void 0,!0),X=EA(!1,!0),iA="".concat(a(),":").concat(vt(s())),AA=(A=wf()[iA])!==null&&A!==void 0?A:{},IA=EA(hh().showWizard!==!1,!0),aA=EA(hh().showOriginal!==!1,!0),rA=EA((i=AA.queryOptions)!==null&&i!==void 0?i:{},!0),uA=EA(v()===AA.queryLanguageId&&AA.query?AA.query:"",!0),UA=EA((n=AA.isManual)!==null&&n!==void 0&&n,!0),$A=EA(void 0,!0),zA=EA(void 0,!0),pA=EA({text:""},!0);function PA(HA){var vA;return(vA=m().find(Gt=>Gt.id===HA))!==null&&vA!==void 0?vA:m()[0]}function Je(HA){try{N(rA,HA),N(uA,PA(v()).createQuery(c(W),HA)),N($A,void 0),N(UA,!1),o("updateQueryByWizard",{queryOptions:c(rA),query:c(uA),isManual:c(UA)})}catch(vA){N($A,String(vA))}}function _e(HA){N(uA,HA.target.value),N(UA,!0),o("handleChangeQuery",{query:c(uA),isManual:c(UA)})}c(UA)||Je(c(rA)),As(()=>{var HA;(HA=c(Z))===null||HA===void 0||HA.focus()});var YA=ME(function(HA,vA){if(HA===void 0)return N(pA,{text:""}),void N(zA,"Error: No JSON");if(vA.trim()!=="")try{o("previewTransform",{query:vA});var Gt=PA(v()).executeQuery(HA,vA,d());N(pA,{json:Gt}),N(zA,void 0)}catch(ft){N(pA,{text:""}),N(zA,String(ft))}else N(pA,{json:HA})},300);function fA(){if(c(W)===void 0)return N(pA,{text:""}),void N(zA,"Error: No JSON");try{o("handleTransform",{query:c(uA)});var HA=PA(v()).executeQuery(c(W),c(uA),d());z()([{op:"replace",path:vt(s()),value:HA}]),P()()}catch(vA){console.error(vA),N(pA,{text:""}),N(zA,String(vA))}}function XA(){N(IA,!c(IA)),hh(hh().showWizard=c(IA))}function DA(){N(aA,!c(aA)),hh(hh().showOriginal=c(aA))}function ee(HA){HA.focus()}function NA(HA){o("handleChangeQueryLanguage",HA),v(HA),k()(HA),Je(c(rA))}function ke(){c(X)?N(X,!c(X)):P()()}KA(()=>(K(r()),K(s())),()=>{N(W,Z$(Xe(r(),s())))}),KA(()=>c(W),()=>{N(BA,c(W)?{json:c(W)}:{text:""})}),KA(()=>(c(W),c(uA)),()=>{YA(c(W),c(uA))}),KA(()=>(wf(),c(rA),c(uA),K(v()),c(UA)),()=>{wf(wf()[iA]={queryOptions:c(rA),query:c(uA),queryLanguageId:v(),isManual:c(UA)}),o("store state in memory",iA,wf()[iA])}),Rn(),ni(!0),Of(t,{get onClose(){return P()},className:"jse-transform-modal",get fullscreen(){return c(X)},children:(HA,vA)=>{var Gt=u5A();tR(dA(Gt),{children:(ft,he)=>{var Ot=Q5A(),He=et(Ot);(function(G,dt){Nt(dt,!1);var Ei,Qn=L(dt,"queryLanguages",9),un=L(dt,"queryLanguageId",9),Vn=L(dt,"fullscreen",13),Yo=L(dt,"onChangeQueryLanguage",9),Bo=L(dt,"onClose",9),No=EA(void 0,!0),{openAbsolutePopup:Zo,closeAbsolutePopup:Do}=kI("absolute-popup");function Ba(){var Xo={queryLanguages:Qn(),queryLanguageId:un(),onChangeQueryLanguage:ra=>{Do(Ei),Yo()(ra)}};Ei=Zo(Q8A,Xo,{offsetTop:-2,offsetLeft:0,anchor:c(No),closeOnOuterClick:!0})}ni(!0),wD(G,{title:"Transform",fullScreenButton:!0,get onClose(){return Bo()},get fullscreen(){return Vn()},set fullscreen(Xo){Vn(Xo)},$$slots:{actions:(Xo,ra)=>{var yo,ge=p8A();tn(dA(ge),{get data(){return Dz}}),Oo(ge,mi=>N(No,mi),()=>c(No)),Se(()=>yo=ii(ge,1,"jse-config svelte-5gkegr",null,yo,{hide:Qn().length<=1})),fe("click",ge,Ba),CA(Xo,ge)}},$$legacy:!0}),Ft()})(He,{get queryLanguages(){return m()},get queryLanguageId(){return v()},onChangeQueryLanguage:NA,get onClose(){return P()},get fullscreen(){return c(X)},set fullscreen(G){N(X,G)},$$legacy:!0});var je=dA(_A(He,2)),pt=dA(je),xe=_A(dA(pt),2);KX(dA(xe),()=>(K(v()),wA(()=>PA(v()).description)));var oi=_A(xe,4),j=_A(oi,2),$=dA(j),oA=dA($),sA=dA(oA),TA=it(()=>c(IA)?c0:kE);tn(sA,{get data(){return c(TA)}});var de=_A(j,2),Qe=G=>{var dt=Fi(),Ei=et(dt),Qn=Vn=>{var Yo=E5A(),Bo=et(Yo);B8A(Bo,{get queryOptions(){return c(rA)},get json(){return c(W)},onChange:Je});var No=_A(Bo,2),Zo=Do=>{var Ba=B5A(),Xo=dA(Ba);Se(()=>Lt(Xo,c($A))),CA(Do,Ba)};jA(No,Do=>{c($A)&&Do(Zo)}),CA(Vn,Yo)},un=Vn=>{CA(Vn,dr("(Only available for arrays, not for objects)"))};jA(Ei,Vn=>{c(W),wA(()=>Array.isArray(c(W)))?Vn(Qn):Vn(un,!1)}),CA(G,dt)};jA(de,G=>{c(IA)&&G(Qe)});var GA=_A(de,4);Oo(GA,G=>N(Z,G),()=>c(Z));var OA,ht,tt=_A(pt,2),ze=dA(tt),Oe=dA(ze),Ci=dA(Oe),gn=dA(Ci),hn=dA(gn),Ke=it(()=>c(aA)?c0:kE);tn(hn,{get data(){return c(Ke)}});var nn=_A(Oe,2),Si=G=>{pR(G,{get externalContent(){return c(BA)},externalSelection:void 0,get history(){return c(tA)},readOnly:!0,get truncateTextSize(){return g()},mainMenuBar:!1,navigationBar:!1,get indentation(){return l()},get escapeControlCharacters(){return C()},get escapeUnicodeCharacters(){return I()},get parser(){return d()},get parseMemoizeOne(){return h()},get onRenderValue(){return S()},get onRenderMenu(){return b()},get onRenderContextMenu(){return x()},onError:wA(()=>console.error),get onChange(){return ma},get onChangeMode(){return ma},get onSelect(){return ma},get onUndo(){return ma},get onRedo(){return ma},get onFocus(){return ma},get onBlur(){return ma},get onSortModal(){return ma},get onTransformModal(){return ma},get onJSONEditorModal(){return ma},get onClassName(){return F()},validator:void 0,get validationParser(){return E()},get pathParser(){return f()}})};jA(nn,G=>{c(aA)&&G(Si)});var Li=_A(ze,2),Zi=_A(dA(Li),2),bt=G=>{pR(G,{get externalContent(){return c(pA)},externalSelection:void 0,get history(){return c(tA)},readOnly:!0,get truncateTextSize(){return g()},mainMenuBar:!1,navigationBar:!1,get indentation(){return l()},get escapeControlCharacters(){return C()},get escapeUnicodeCharacters(){return I()},get parser(){return d()},get parseMemoizeOne(){return h()},get onRenderValue(){return S()},get onRenderMenu(){return b()},get onRenderContextMenu(){return x()},onError:wA(()=>console.error),get onChange(){return ma},get onChangeMode(){return ma},get onSelect(){return ma},get onUndo(){return ma},get onRedo(){return ma},get onFocus(){return ma},get onBlur(){return ma},get onSortModal(){return ma},get onTransformModal(){return ma},get onJSONEditorModal(){return ma},get onClassName(){return F()},validator:void 0,get validationParser(){return E()},get pathParser(){return f()}})},on=G=>{var dt=h5A(),Ei=dA(dt);Se(()=>Lt(Ei,c(zA))),CA(G,dt)};jA(Zi,G=>{c(zA)?G(on,!1):G(bt)});var Kt=dA(_A(je,2));_r(()=>fe("click",Kt,fA)),ms(Kt,G=>ee?.(G)),Se(G=>{Dd(oi,G),Dd(GA,c(uA)),OA=ii(tt,1,"jse-data-contents svelte-lta8xm",null,OA,{"jse-hide-original-data":!c(aA)}),ht=ii(ze,1,"jse-original-data svelte-lta8xm",null,ht,{"jse-hide":!c(aA)}),Kt.disabled=!!c(zA)},[()=>(K(en),K(s()),K(Bl),wA(()=>en(s())?"(document root)":Bl(s())))]),fe("click",oA,XA),fe("input",GA,_e),fe("click",gn,DA),CA(ft,Ot)},$$slots:{default:!0}}),ms(Gt,(ft,he)=>DD?.(ft,he),()=>ke),CA(HA,Gt)},$$slots:{default:!0}}),Ft()}function Qg(){}var p5A=0,Ir=class{constructor(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.id=p5A++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=Hf.match(e)),A=>{var i=e(A);return i===void 0?null:[this,i]}}};Ir.closedBy=new Ir({deserialize:t=>t.split(" ")}),Ir.openedBy=new Ir({deserialize:t=>t.split(" ")}),Ir.group=new Ir({deserialize:t=>t.split(" ")}),Ir.isolate=new Ir({deserialize:t=>{if(t&&t!="rtl"&&t!="ltr"&&t!="auto")throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}}),Ir.contextHash=new Ir({perNode:!0}),Ir.lookAhead=new Ir({perNode:!0}),Ir.mounted=new Ir({perNode:!0});var KZ,m5A=Object.create(null),Hf=class t{constructor(e,A,i){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;this.name=e,this.props=A,this.id=i,this.flags=n}static define(e){var A=e.props&&e.props.length?Object.create(null):m5A,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new t(e.name||"",A,e.id,i);if(e.props){for(var o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;var A=this.prop(Ir.group);return!!A&&A.indexOf(e)>-1}return this.id==e}static match(e){var A=Object.create(null);for(var i in e)for(var n of i.split(" "))A[n]=e[i];return o=>{for(var a=o.prop(Ir.group),r=-1;r<(a?a.length:0);r++){var s=A[r<0?o.name:a[r]];if(s)return s}}}};Hf.none=new Hf("",Object.create(null),0,8),(function(t){t[t.ExcludeBuffers=1]="ExcludeBuffers",t[t.IncludeAnonymous=2]="IncludeAnonymous",t[t.IgnoreMounts=4]="IgnoreMounts",t[t.IgnoreOverlays=8]="IgnoreOverlays"})(KZ||(KZ={})),new Ir({perNode:!0});Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-status-bar.svelte-1pmgv9j { - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-color-readonly, #b2b2b2); - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - margin: 0; - border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); - display: flex; - gap: var(--jse-padding, 10px); -} -.jse-status-bar.svelte-1pmgv9j:last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-status-bar.svelte-1pmgv9j .jse-status-bar-info:where(.svelte-1pmgv9j) { - padding: 2px; -}`);var w5A=JA('
            '),D5A=JA('
            '),y5A=JA('
            '),v5A=JA('
            '),ZR=ih.define([{tag:Fe.propertyName,color:"var(--internal-key-color)"},{tag:Fe.number,color:"var(--internal-value-color-number)"},{tag:Fe.bool,color:"var(--internal-value-color-boolean)"},{tag:Fe.string,color:"var(--internal-value-color-string)"},{tag:Fe.keyword,color:"var(--internal-value-color-null)"}]),b5A=mx(ZR),M5A=ZR.style;ZR.style=t=>M5A(t||[]);var S5A=[_o.fromClass(class{constructor(t){this.view=t,this.indentUnit=Cc(t.state),this.initialPaddingLeft=null,this.isChrome=window?.navigator.userAgent.includes("Chrome"),this.generate(t.state)}update(t){var e=Cc(t.state);(e!==this.indentUnit||t.docChanged||t.viewportChanged)&&(this.indentUnit=e,this.generate(t.state))}generate(t){var e=new jr;this.initialPaddingLeft?this.addStyleToBuilder(e,t,this.initialPaddingLeft):this.view.requestMeasure({read:A=>{var i=A.contentDOM.querySelector(".cm-line");i&&(this.initialPaddingLeft=window.getComputedStyle(i).getPropertyValue("padding-left"),this.addStyleToBuilder(e,A.state,this.initialPaddingLeft)),this.decorations=e.finish()}}),this.decorations=e.finish()}addStyleToBuilder(t,e,A){var i=this.getVisibleLines(e);for(var n of i){var{numColumns:o,containsTab:a}=this.numColumns(n.text,e.tabSize),r="calc(".concat(o+this.indentUnit,"ch + ").concat(A,")"),s=this.isChrome?"calc(-".concat(o+this.indentUnit,"ch - ").concat(a?1:0,"px)"):"-".concat(o+this.indentUnit,"ch");t.add(n.from,n.from,St.line({attributes:{style:"padding-left: ".concat(r,"; text-indent: ").concat(s,";")}}))}}getVisibleLines(t){var e=new Set,A=null;for(var{from:i,to:n}of this.view.visibleRanges)for(var o=i;o<=n;){var a=t.doc.lineAt(o);A!==a&&(e.add(a),A=a),o=a.to+1}return e}numColumns(t,e){var A=0,i=!1;A:for(var n=0;nt.decorations})];Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-text-mode.svelte-k2b9e6 { - --internal-key-color: var(--jse-key-color, #1a1a1a); - --internal-value-color-number: var(--jse-value-color-number, #ee422e); - --internal-value-color-boolean: var(--jse-value-color-boolean, #ff8c00); - --internal-value-color-string: var(--jse-value-color-string, #008000); - --internal-value-color-null: var(--jse-value-color-null, #004ed0); - flex: 1; - box-sizing: border-box; - display: flex; - flex-direction: column; - background: var(--jse-background-color, #fff); -} -.jse-text-mode.no-main-menu.svelte-k2b9e6 { - border-top: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) { - flex: 1; - display: flex; - position: relative; - flex-direction: column; - overflow: hidden; - min-width: 0; - min-height: 0; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6):last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents.jse-hidden:where(.svelte-k2b9e6) { - visibility: hidden; - position: absolute; - top: 0; - left: 0; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor { - flex: 1; - overflow: hidden; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-scroller { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - line-height: var(--jse-line-height, calc(1em + 4px)); - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-gutters { - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-color-readonly, #b2b2b2); - border-right: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-activeLine, -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-activeLineGutter { - background: var(--jse-active-line-background-color, rgba(0, 0, 0, 0.06)); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-selectionBackground { - background: var(--jse-selection-background-color, #d3d3d3); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-searchMatch { - background-color: var(--jse-search-match-color, #ffe665); - outline: var(--jse-search-match-outline, none); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-searchMatch.cm-searchMatch-selected { - background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); - outline: var(--jse-search-match-outline, 2px solid #e0be00); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-selectionMatch { - background-color: var(--jse-search-match-background-color, rgba(153, 255, 119, 0.5019607843)); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-foldPlaceholder { - background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); - border: none; - padding: 0 var(--jse-padding, 10px); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-tooltip { - font-size: var(--jse-font-size, 16px); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - color: var(--jse-tooltip-color, var(--jse-text-color, #4d4d4d)); - background: var(--jse-tooltip-background, var(--jse-modal-background, #f5f5f5)); - border: var(--jse-tooltip-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-diagnosticAction { - background: var(--jse-tooltip-action-button-color, var(--jse-text-color-inverse, #fff)); - background: var(--jse-tooltip-action-button-background, #4d4d4d); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-panels { - border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search { - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search input { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size-text-mode-search, 80%); - color: var(--jse-input-color, var(--jse-text-color, #4d4d4d)); - border: var(--jse-input-border, 1px solid #d8dbdf); - background: var(--jse-input-background, var(--jse-background-color, #fff)); - margin-right: 2px; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size-text-mode-search, 80%); - color: var(--jse-panel-button-color, inherit); - background: var(--jse-panel-button-background, transparent); - border: none; - cursor: pointer; - text-transform: capitalize; - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); - margin: 0; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button:hover { - color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); - background: var(--jse-panel-button-background-highlight, #e0e0e0); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search label { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size-text-mode-search, 80%); - padding-left: var(--jse-padding, 10px); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search label input { - margin-right: 2px; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button[name='close'] { - width: 32px; - height: 32px; - font-size: 24px; - line-height: 24px; - padding: 0; - right: 0; - top: -4px; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-cursor-primary { - border-color: var(--jse-text-color, #4d4d4d); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .jse-loading-space:where(.svelte-k2b9e6) { - flex: 1; -} -.jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .jse-loading:where(.svelte-k2b9e6) { - flex: 2; - text-align: center; - color: var(--jse-panel-color-readonly, #b2b2b2); - box-sizing: border-box; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -} -.jse-text-mode.svelte-k2b9e6 .jse-contents.jse-preview:where(.svelte-k2b9e6) { - flex: 1; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-panel-color-readonly, #b2b2b2); - overflow: auto; - white-space: pre-wrap; - word-break: break-word; - padding: 2px; -} -.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) { - display: flex; - align-items: center; - gap: 8px; - padding: 8px 12px; - background: var(--jse-background-color, #fff); - border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); - border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-tip:where(.svelte-k2b9e6) { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-panel-color-readonly, #b2b2b2); -} -.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-progress-track:where(.svelte-k2b9e6) { - flex: 1; - height: 6px; - background: var(--jse-panel-background, #ebebeb); - border-radius: 3px; - overflow: hidden; - border: 1px solid var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-progress-fill:where(.svelte-k2b9e6) { - height: 100%; - background: linear-gradient(90deg, var(--jse-theme-color, #3883fa), var(--jse-theme-color-highlight, #5f9dff)); - border-radius: 2px; - transition: width 0.1s ease; - min-width: 2px; -} -.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-cancel-button:where(.svelte-k2b9e6) { - padding: 4px 12px; - font-size: 12px; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - background: var(--jse-theme-color, #3883fa); - color: #fff; - border-radius: 3px; - cursor: pointer; - transition: background-color 0.2s ease; - flex-shrink: 0; - border: 1px solid var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-cancel-button:where(.svelte-k2b9e6):hover { - background: var(--jse-theme-color-highlight, #5f9dff); - color: #fff; -}`);var k5A=JA('
            Collapsing
            '),x5A=JA('
            ',1),_5A=JA(" ",1),R5A=JA("
            ",1),N5A=JA('
            loading...
            '),F5A=JA("
            ");function L5A(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=L(e,"readOnly",9),o=L(e,"mainMenuBar",9),a=L(e,"statusBar",9),r=L(e,"askToFormat",9),s=L(e,"externalContent",9),l=L(e,"externalSelection",9),g=L(e,"history",9),C=L(e,"indentation",9),I=L(e,"tabSize",9),d=L(e,"escapeUnicodeCharacters",9),h=L(e,"parser",9),E=L(e,"validator",9),f=L(e,"validationParser",9),m=L(e,"onChange",9),v=L(e,"onChangeMode",9),k=L(e,"onSelect",9),S=L(e,"onUndo",9),b=L(e,"onRedo",9),x=L(e,"onError",9),F=L(e,"onFocus",9),z=L(e,"onBlur",9),P=L(e,"onRenderMenu",9),Z=L(e,"onSortModal",9),tA=L(e,"onTransformModal",9),W=or("jsoneditor:TextMode"),BA={key:"Mod-i",run:Qe,shift:GA,preventDefault:!0},X=typeof window>"u";W("isSSR:",X);var iA,AA=EA(void 0,!0),IA=EA(void 0,!0),aA=EA(void 0,!0),rA=EA(!1,!0),uA=EA(r(),!0),UA=EA([],!0),$A=EA(!1,!0),zA=EA(0,!0),pA=EA(0,!0),PA=null,Je=new d0,_e=new d0,YA=new d0,fA=new d0,XA=new d0,DA=s(),ee=EA(eR(DA,C(),h()),!0),NA=al.define(),ke=null;function HA(){if(!ke||ke.length===0)return!1;var xA=ke[0].startState,Ae=ke[ke.length-1].state,De=ke.map(FA=>FA.changes).reduce((FA,le)=>FA.compose(le)),mA={type:"text",undo:{changes:De.invert(xA.doc).toJSON(),selection:ra(xA.selection)},redo:{changes:De.toJSON(),selection:ra(Ae.selection)}};return W("add history item",mA),g().add(mA),ke=null,!0}var vA=EA(d(),!0);As(zt(function*(){if(!X)try{iA=(function(xA){var{target:Ae,initialText:De,readOnly:mA,indentation:FA}=xA;W("Create CodeMirror editor",{readOnly:mA,indentation:FA});var le=(function(nt,rt){return N_(nt)?nt.ranges.every(xt=>xt.anchor{N(aA,nt.state),nt.docChanged&&(nt.transactions.some(rt=>!!rt.annotation(NA))||(ke=[...ke??[],nt]),Zo()),nt.selectionSet&&Xo()}),jV(),AW({top:!0}),ci.lineWrapping,_e.of(qa.readOnly.of(mA)),fA.of(qa.tabSize.of(I())),YA.of(No(FA)),XA.of(ci.theme({},{dark:on()}))]});return iA=new ci({state:Ne,parent:Ae}),le&&iA.dispatch(iA.state.update({selection:le.main,scrollIntoView:!0})),iA})({target:c(AA),initialText:yo(c(ee),c(rA))?"":c(A).escapeValue(c(ee)),readOnly:n(),indentation:C()})}catch(xA){console.error(xA)}})),Dg(()=>{Do(),iA&&(W("Destroy CodeMirror editor"),iA.destroy()),oi()});var Gt=Y2(),ft=Y2();function he(){iA&&(W("focus"),iA.focus())}function Ot(xA,Ae){if(iA)try{(function(){var De=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],mA=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],FA=iA.state,le=FA.doc.length,Ne=Bx(FA,le,1/0);if(Ne){var nt=[];if(De.length===0)nt=pt(Ne,FA,void 0,mA);else{var{from:rt}=y_(c(A).escapeValue(c(ee)),De);rt!==void 0&&rt!==0&&(nt=pt(Ne,FA,rt,mA))}nt.length>0&&(function(xt){xe.apply(this,arguments)})(nt)}})(xA,Ae)}catch(De){x()(De)}}function He(){return Qx.of((xA,Ae,De)=>{var mA=Bx(xA,xA.doc.length,1/0);if(!mA||mA.lengthDe)){if(FA&&Ne.from=Ae&&rt.to>De&&(FA=rt)}}}return FA})}function je(xA){var Ae=xA.lastChild;return Ae&&Ae.to==xA.to&&Ae.type.isError}function pt(xA,Ae,De){var mA=!(arguments.length>3&&arguments[3]!==void 0)||arguments[3],FA=[],le=new Set;return xA.iterate({enter(Ne){if(De===void 0||Ne.from>=De){var nt=th(Ae,Ne.from,Ne.to);if(nt){var rt="".concat(nt.from,"-").concat(nt.to);if(!le.has(rt))if(mA)FA.push({from:nt.from,to:nt.to}),le.add(rt);else{var xt=FA.some(On=>On.from<=nt.from&&On.to>=nt.to);xt||(FA.push({from:nt.from,to:nt.to}),le.add(rt))}}}}}),FA}function xe(){return xe=zt(function*(xA){if(xA.length!==0){var Ae=xA.length>5e3;Ae&&(N($A,!0),N(zA,0),N(pA,xA.length),PA=new AbortController);var De=mA=>new Promise(FA=>{var le;Ae&&(le=PA)!==null&&le!==void 0&&le.signal.aborted?FA():requestAnimationFrame(()=>{var Ne=Math.min(mA+100,xA.length),nt=xA.slice(mA,Ne);iA.dispatch({effects:nt.map(rt=>oh.of({from:rt.from,to:rt.to}))}),Ae&&N(zA,Ne),Ne1&&arguments[1]!==void 0?arguments[1]:aR;if(iA)try{if(xA&&xA.length>0){var{from:De}=y_(c(A).escapeValue(c(ee)),xA);De!==void 0&&(iA.dispatch({selection:{anchor:De,head:De}}),ux(iA))}else fx(iA);Ae?.(xA)}catch(mA){x()(mA)}}function $(){j([],()=>!0)}function oA(){Ot([],!0)}var sA=!1;function TA(xA){return de(xA,!1)}function de(xA,Ae){W("handlePatch",xA,Ae);var De=h().parse(c(ee)),mA=tl(De,xA),FA=e8(De,xA);return Ei({text:h().stringify(mA,null,C())},Ae,!1),{json:mA,previousJson:De,undo:FA,redo:xA}}function Qe(){if(W("format"),n())return!1;try{var xA=h().parse(c(ee));return Ei({text:h().stringify(xA,null,C())},!0,!1),N(uA,r()),!0}catch(Ae){x()(Ae)}return!1}function GA(){if(W("compact"),n())return!1;try{var xA=h().parse(c(ee));return Ei({text:h().stringify(xA)},!0,!1),N(uA,!1),!0}catch(Ae){x()(Ae)}return!1}function OA(){if(W("repair"),!n())try{Ei({text:ag(c(ee))},!0,!1),N(ge,x_),N(mi,void 0)}catch(xA){x()(xA)}}function ht(){var xA;if(!n())try{var Ae=h().parse(c(ee));sA=!0,Z()({id:Gt,json:Ae,rootPath:[],onSort:(xA=zt(function*(De){var{operations:mA}=De;W("onSort",mA),de(mA,!0)}),function(De){return xA.apply(this,arguments)}),onClose:()=>{sA=!1,he()}})}catch(De){x()(De)}}function tt(xA){var{id:Ae,rootPath:De,onTransform:mA,onClose:FA}=xA;try{var le=h().parse(c(ee));sA=!0,tA()({id:Ae||ft,json:le,rootPath:De||[],onTransform:Ne=>{mA?mA({operations:Ne,json:le,transformedJson:tl(le,Ne)}):(W("onTransform",Ne),de(Ne,!0))},onClose:()=>{sA=!1,he(),FA&&FA()}})}catch(Ne){x()(Ne)}}function ze(){n()||tt({rootPath:[]})}function Oe(){iA&&(c(AA)&&c(AA).querySelector(".cm-search")?w5(iA):m5(iA))}function Ci(){if(n())return!1;Do();var xA=g().undo();return W("undo",xA),aZ(xA)?(iA.dispatch({annotations:NA.of("undo"),changes:Pr.fromJSON(xA.undo.changes),selection:Ie.fromJSON(xA.undo.selection),scrollIntoView:!0}),!0):(S()(xA),!1)}function gn(){if(n())return!1;Do();var xA=g().redo();return W("redo",xA),aZ(xA)?(iA.dispatch({annotations:NA.of("redo"),changes:Pr.fromJSON(xA.redo.changes),selection:Ie.fromJSON(xA.redo.selection),scrollIntoView:!0}),!0):(b()(xA),!1)}function hn(){N(rA,!0),Ei(s(),!0,!0)}function Ke(){v()(Da.tree)}function nn(){Yo()}function Si(xA){W("select validation error",xA);var{from:Ae,to:De}=Kt(xA);Ae!==void 0&&De!==void 0&&(Li(Ae,De),he())}function Li(xA,Ae){W("setSelection",{anchor:xA,head:Ae}),iA&&iA.dispatch(iA.state.update({selection:{anchor:xA,head:Ae},scrollIntoView:!0}))}function Zi(xA,Ae){if(Ae.state.selection.ranges.length===1){var De=Ae.state.selection.ranges[0],mA=c(ee).slice(De.from,De.to);if(mA==="{"||mA==="["){var FA=mR.default.parse(c(ee)),le=Object.keys(FA.pointers).find(nt=>{var rt;return((rt=FA.pointers[nt].value)===null||rt===void 0?void 0:rt.pos)===De.from}),Ne=FA.pointers[le];le&&Ne&&Ne.value&&Ne.valueEnd&&(W("pointer found, selecting inner contents of path:",le,Ne),Li(Ne.value.pos+1,Ne.valueEnd.pos-1))}}}function bt(){return RV(cn,{delay:300})}function on(){return!!c(AA)&&getComputedStyle(c(AA)).getPropertyValue("--jse-theme").includes("dark")}function Kt(xA){var{path:Ae,message:De,severity:mA}=xA,{line:FA,column:le,from:Ne,to:nt}=y_(c(A).escapeValue(c(ee)),Ae);return{path:Ae,line:FA,column:le,from:Ne,to:nt,message:De,severity:mA,actions:[]}}function G(xA,Ae){var{line:De,column:mA,position:FA,message:le}=xA;return{path:[],line:De,column:mA,from:FA,to:FA,severity:hc.error,message:le,actions:Ae&&!n()?[{name:"Auto repair",apply:()=>OA()}]:void 0}}function dt(xA){return{from:xA.from||0,to:xA.to||0,message:xA.message||"",actions:xA.actions,severity:xA.severity}}function Ei(xA,Ae,De){var mA=eR(xA,C(),h()),FA=!Mi(xA,DA),le=DA;W("setCodeMirrorContent",{isChanged:FA,emitChange:Ae,forceUpdate:De}),iA&&(FA||De)&&(DA=xA,N(ee,mA),yo(c(ee),c(rA))||iA.dispatch({changes:{from:0,to:iA.state.doc.length,insert:c(A).escapeValue(c(ee))}}),HA(),FA&&Ae&&Ba(DA,le))}function Qn(xA){return N_(xA)?Ie.fromJSON(xA):void 0}function un(){return Vn.apply(this,arguments)}function Vn(){return Vn=zt(function*(){W("refresh"),yield(function(){return Bo.apply(this,arguments)})()}),Vn.apply(this,arguments)}function Yo(){if(iA){var xA=iA?c(A).unescapeValue(iA.state.doc.toString()):"",Ae=xA!==c(ee);if(W("onChangeCodeMirrorValue",{isChanged:Ae}),Ae){var De=DA;N(ee,xA),DA={text:c(ee)},HA(),Ba(DA,De),Ro(),Xo()}}}function Bo(){return(Bo=zt(function*(){if(Ro(),iA){var xA=on();return W("updateTheme",{dark:xA}),iA.dispatch({effects:[XA.reconfigure(ci.theme({},{dark:xA}))]}),new Promise(Ae=>setTimeout(Ae))}return Promise.resolve()})).apply(this,arguments)}function No(xA){var Ae=ed.of(typeof xA=="number"?" ".repeat(xA):xA);return xA===" "?[Ae]:[Ae,S5A]}qR({onMount:As,onDestroy:Dg,getWindow:()=>Xf(c(IA)),hasFocus:()=>sA&&document.hasFocus()||RR(c(IA)),onFocus:F(),onBlur:()=>{Do(),z()()}});var Zo=ME(Yo,300);function Do(){Zo.flush()}function Ba(xA,Ae){m()&&m()(xA,Ae,{contentErrors:fn(),patchResult:void 0})}function Xo(){k()(ra(c(aA).selection))}function ra(xA){return Me({type:oo.text},xA.toJSON())}function yo(xA,Ae){return!!xA&&xA.length>S_&&!Ae}var ge=EA(x_,!0),mi=EA(void 0,!0);function cn(){if(yo(c(ee),c(rA)))return[];var xA=fn();if(oZ(xA)){var{parseError:Ae,isRepairable:De}=xA;return[dt(G(Ae,De))]}return t6A(xA)?xA.validationErrors.map(Kt).map(dt):[]}function fn(){W("validate:start"),Do();var xA=Ho(c(A).escapeValue(c(ee)),E(),h(),f());return oZ(xA)?(N(ge,xA.isRepairable?AZ:"invalid"),N(mi,xA.parseError),N(UA,[])):(N(ge,x_),N(mi,void 0),N(UA,xA?.validationErrors||[])),W("validate:end"),xA}var Ho=xE(D8A);function ya(){c(mi)&&(function(xA){W("select parse error",xA);var Ae=G(xA,!1);Li(Ae.from!=null?Ae.from:0,Ae.to!=null?Ae.to:0),he()})(c(mi))}var _i={icon:Qz,text:"Show me",title:"Move to the parse error location",onClick:ya};KA(()=>K(d()),()=>{N(A,xR({escapeControlCharacters:!1,escapeUnicodeCharacters:d()}))}),KA(()=>K(s()),()=>{Ei(s(),!1,!1)}),KA(()=>K(l()),()=>{(function(xA){if(N_(xA)){var Ae=Qn(xA);!iA||!Ae||c(aA)&&c(aA).selection.eq(Ae)||(W("applyExternalSelection",Ae),iA.dispatch({selection:Ae}))}})(l())}),KA(()=>K(E()),()=>{(function(xA){W("updateLinter",xA),iA&&iA.dispatch({effects:Je.reconfigure(bt())})})(E())}),KA(()=>K(C()),()=>{(function(xA){iA&&(W("updateIndentation",xA),iA.dispatch({effects:YA.reconfigure(No(xA))}))})(C())}),KA(()=>K(I()),()=>{(function(xA){iA&&(W("updateTabSize",xA),iA.dispatch({effects:fA.reconfigure(qa.tabSize.of(xA))}))})(I())}),KA(()=>K(n()),()=>{(function(xA){iA&&(W("updateReadOnly",xA),iA.dispatch({effects:[_e.reconfigure(qa.readOnly.of(xA))]}))})(n())}),KA(()=>(c(vA),K(d())),()=>{c(vA)!==d()&&(N(vA,d()),W("forceUpdateText",{escapeUnicodeCharacters:d()}),iA&&iA.dispatch({changes:{from:0,to:iA.state.doc.length,insert:c(A).escapeValue(c(ee))}}))}),KA(()=>(c(ge),K(n()),CC),()=>{N(i,c(ge)!==AZ||n()?[_i]:[{icon:CC,text:"Auto repair",title:"Automatically repair JSON",onClick:OA},_i])}),Rn();var Eo={focus:he,collapse:Ot,expand:j,patch:TA,handlePatch:de,openTransformModal:tt,refresh:un,flush:Do,validate:fn};ni(!0);var Za,vo=F5A(),Ta=dA(vo),Jn=xA=>{var Ae=it(()=>(c(ee),wA(()=>c(ee).length===0))),De=it(()=>!c(Ae)),mA=it(()=>!c(Ae)),FA=it(()=>!c(Ae)),le=it(()=>!c(Ae)),Ne=it(()=>!c(Ae)),nt=it(()=>!c(Ae));(function(rt,xt){Nt(xt,!1);var On=EA(void 0,!0),Ti=L(xt,"readOnly",9,!1),zi=L(xt,"onExpandAll",9),Xt=L(xt,"onCollapseAll",9),Ji=L(xt,"onFormat",9),va=L(xt,"onCompact",9),Ut=L(xt,"onSort",9),st=L(xt,"onTransform",9),Oi=L(xt,"onToggleSearch",9),Xi=L(xt,"onUndo",9),Wn=L(xt,"onRedo",9),pn=L(xt,"canExpandAll",9),_t=L(xt,"canCollapseAll",9),sa=L(xt,"canUndo",9),zo=L(xt,"canRedo",9),D=L(xt,"canFormat",9),M=L(xt,"canCompact",9),R=L(xt,"canSort",9),V=L(xt,"canTransform",9),_=L(xt,"onRenderMenu",9),q=EA(void 0,!0),nA=EA(void 0,!0),cA={type:"button",icon:m4,title:"Search (Ctrl+F)",className:"jse-search",onClick:Oi()},MA=EA(void 0,!0);KA(()=>(K(zi()),K(pn())),()=>{N(q,{type:"button",icon:K$,title:"Expand all",className:"jse-expand-all",onClick:zi(),disabled:!pn()})}),KA(()=>(K(Xt()),K(_t())),()=>{N(nA,{type:"button",icon:U$,title:"Collapse all",className:"jse-collapse-all",onClick:Xt(),disabled:!_t()})}),KA(()=>(K(Ti()),c(q),c(nA),K(Ji()),K(D()),K(va()),K(M()),K(Ut()),K(R()),K(st()),K(V()),K(Xi()),K(sa()),K(Wn()),K(zo())),()=>{N(MA,Ti()?[c(q),c(nA),{type:"separator"},cA,{type:"space"}]:[c(q),c(nA),{type:"separator"},{type:"button",icon:FZ,title:"Format JSON: add proper indentation and new lines (Ctrl+I)",className:"jse-format",onClick:Ji(),disabled:Ti()||!D()},{type:"button",icon:vwA,title:"Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)",className:"jse-compact",onClick:va(),disabled:Ti()||!M()},{type:"separator"},{type:"button",icon:y4,title:"Sort",className:"jse-sort",onClick:Ut(),disabled:Ti()||!R()},{type:"button",icon:p4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:st(),disabled:Ti()||!V()},cA,{type:"separator"},{type:"button",icon:Y8,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:Xi(),disabled:!sa()},{type:"button",icon:O8,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Wn(),disabled:!zo()},{type:"space"}])}),KA(()=>(K(_()),c(MA)),()=>{N(On,_()(c(MA))||c(MA))}),Rn(),ni(!0),KD(rt,{get items(){return c(On)}}),Ft()})(xA,{get readOnly(){return n()},onExpandAll:$,onCollapseAll:oA,onFormat:Qe,onCompact:GA,onSort:ht,onTransform:ze,onToggleSearch:Oe,onUndo:Ci,onRedo:gn,get canExpandAll(){return c(De)},get canCollapseAll(){return c(mA)},get canFormat(){return c(FA)},get canCompact(){return c(le)},get canSort(){return c(Ne)},get canTransform(){return c(nt)},get canUndo(){return K(g()),wA(()=>g().canUndo)},get canRedo(){return K(g()),wA(()=>g().canRedo)},get onRenderMenu(){return P()}})};jA(Ta,xA=>{o()&&xA(Jn)});var Ui=_A(Ta,2),qt=xA=>{var Ae=k5A(),De=_A(dA(Ae),2),mA=dA(De),FA=_A(De,2);Se(()=>mg(mA,"width: ".concat(c(pA)>0?c(zA)/c(pA)*100:0,"%"))),fe("click",FA,oi),CA(xA,Ae)};jA(Ui,xA=>{c($A)&&xA(qt)});var Nn=_A(Ui,2),ho=xA=>{var Ae,De=it(()=>(c(ee),c(rA),wA(()=>yo(c(ee),c(rA))))),mA=R5A(),FA=et(mA);Oo(FA,xt=>N(AA,xt),()=>c(AA));var le=_A(FA,2),Ne=xt=>{var On=x5A(),Ti=et(On),zi=it(()=>(K(iD),K(S_),c(ee),wA(()=>"The JSON document is larger than ".concat(iD(S_),", ")+"and may crash your browser when loading it in text mode. Actual size: ".concat(iD(c(ee).length),"."))));Yl(Ti,{get icon(){return z2},type:"error",get message(){return c(zi)},actions:[{text:"Open anyway",title:"Open the document in text mode. This may freeze or crash your browser.",onClick:hn},{text:"Open in tree mode",title:"Open the document in tree mode. Tree mode can handle large documents.",onClick:Ke},{text:"Cancel",title:"Cancel opening this large document.",onClick:nn}],onClose:he});var Xt=dA(_A(Ti,2));Se(Ji=>Lt(Xt,Ji),[()=>(K(SC),c(ee),K(cD),wA(()=>SC(c(ee)||"",cD)))]),CA(xt,On)};jA(le,xt=>{c(De)&&xt(Ne)});var nt=_A(le,2),rt=xt=>{var On=_5A(),Ti=et(On),zi=st=>{(function(Oi,Xi){Nt(Xi,!1);var Wn=L(Xi,"editorState",8),pn=EA(),_t=EA(),sa=EA(),zo=EA(),D=EA();KA(()=>K(Wn()),()=>{var MA;N(pn,(MA=Wn())===null||MA===void 0||(MA=MA.selection)===null||MA===void 0||(MA=MA.main)===null||MA===void 0?void 0:MA.head)}),KA(()=>(c(pn),K(Wn())),()=>{var MA;N(_t,c(pn)!==void 0?(MA=Wn())===null||MA===void 0||(MA=MA.doc)===null||MA===void 0?void 0:MA.lineAt(c(pn)):void 0)}),KA(()=>c(_t),()=>{N(sa,c(_t)!==void 0?c(_t).number:void 0)}),KA(()=>(c(_t),c(pn)),()=>{N(zo,c(_t)!==void 0&&c(pn)!==void 0?c(pn)-c(_t).from+1:void 0)}),KA(()=>K(Wn()),()=>{var MA;N(D,(MA=Wn())===null||MA===void 0||(MA=MA.selection)===null||MA===void 0||(MA=MA.ranges)===null||MA===void 0?void 0:MA.reduce((oe,se)=>oe+se.to-se.from,0))}),Rn(),ni();var M=v5A(),R=dA(M),V=MA=>{var oe=w5A(),se=dA(oe);Se(()=>{var Ee;return Lt(se,"Line: ".concat((Ee=c(sa))!==null&&Ee!==void 0?Ee:""))}),CA(MA,oe)};jA(R,MA=>{c(sa)!==void 0&&MA(V)});var _=_A(R,2),q=MA=>{var oe=D5A(),se=dA(oe);Se(()=>{var Ee;return Lt(se,"Column: ".concat((Ee=c(zo))!==null&&Ee!==void 0?Ee:""))}),CA(MA,oe)};jA(_,MA=>{c(zo)!==void 0&&MA(q)});var nA=_A(_,2),cA=MA=>{var oe=y5A(),se=dA(oe);Se(()=>{var Ee;return Lt(se,"Selection: ".concat((Ee=c(D))!==null&&Ee!==void 0?Ee:""," characters"))}),CA(MA,oe)};jA(nA,MA=>{c(D)!==void 0&&c(D)>0&&MA(cA)}),CA(Oi,M),Ft()})(st,{get editorState(){return c(aA)}})};jA(Ti,st=>{a()&&st(zi)});var Xt=_A(Ti,2),Ji=st=>{Yl(st,{type:"error",get icon(){return z2},get message(){return c(mi),wA(()=>c(mi).message)},get actions(){return c(i)},onClick:ya,onClose:he})};jA(Xt,st=>{c(mi)&&st(Ji)});var va=_A(Xt,2),Ut=st=>{var Oi=it(()=>[{icon:FZ,text:"Format",title:"Format JSON: add proper indentation and new lines (Ctrl+I)",onClick:Qe},{icon:D4,text:"No thanks",title:"Close this message",onClick:()=>N(uA,!1)}]);Yl(st,{type:"success",message:"Do you want to format the JSON?",get actions(){return c(Oi)},onClose:he})};jA(va,st=>{c(mi),c(uA),K(XW),c(ee),wA(()=>!c(mi)&&c(uA)&&XW(c(ee)))&&st(Ut)}),VR(_A(va,2),{get validationErrors(){return c(UA)},selectError:Si}),CA(xt,On)};jA(nt,xt=>{c(De)||xt(rt)}),Se(()=>Ae=ii(FA,1,"jse-contents svelte-k2b9e6",null,Ae,{"jse-hidden":c(De)})),CA(xA,mA)},Fo=xA=>{CA(xA,N5A())};return jA(Nn,xA=>{X?xA(Fo,!1):xA(ho)}),Oo(vo,xA=>N(IA,xA),()=>c(IA)),Se(()=>Za=ii(vo,1,"jse-text-mode svelte-k2b9e6",null,Za,{"no-main-menu":!o()})),CA(t,vo),jt(e,"focus",he),jt(e,"collapse",Ot),jt(e,"expand",j),jt(e,"patch",TA),jt(e,"handlePatch",de),jt(e,"openTransformModal",tt),jt(e,"refresh",un),jt(e,"flush",Do),jt(e,"validate",fn),Ft(Eo)}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-inline-value.svelte-1jv89ui { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - line-height: var(--jse-line-height, calc(1em + 4px)); - border: none; - padding: 0 calc(0.5 * var(--jse-padding, 10px)); - background: transparent; - color: inherit; - cursor: inherit; -} -.jse-inline-value.jse-highlight.svelte-1jv89ui { - background-color: var(--jse-search-match-color, #ffe665); - outline: var(--jse-search-match-outline, none); -} -.jse-inline-value.jse-highlight.jse-active.svelte-1jv89ui { - background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); - outline: var(--jse-search-match-outline, 2px solid #e0be00); -}`);var G5A=JA('');Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-column-header.svelte-5pxwfq { - background: none; - border: none; - font-family: inherit; - font-size: inherit; - color: inherit; - display: flex; - gap: var(--jse-padding, 10px); - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); - width: 100%; -} -.jse-column-header.svelte-5pxwfq:hover { - background: var(--jse-table-header-background-highlight, #e8e8e8); -} -.jse-column-header.svelte-5pxwfq:not(.jse-column-header.jse-readonly) { - cursor: pointer; -} -.jse-column-header.svelte-5pxwfq span.jse-column-sort-icon:where(.svelte-5pxwfq) { - height: 1em; -}`);var K5A=JA(''),U5A=JA('');Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-table-mode-welcome.svelte-1b9gnk8 { - flex: 1; - display: flex; - flex-direction: column; - overflow: auto; - align-items: center; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode-welcome.svelte-1b9gnk8:last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-space.jse-before:where(.svelte-1b9gnk8) { - flex: 1; -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) { - display: flex; - flex-direction: column; - gap: var(--jse-padding, 10px); - max-width: 400px; - margin: 2em var(--jse-padding, 10px); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-arrays-info:where(.svelte-1b9gnk8) { - color: var(--jse-panel-color-readonly, #b2b2b2); -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) { - display: flex; - align-items: center; - gap: var(--jse-padding, 10px); -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) .jse-nested-property-path:where(.svelte-1b9gnk8) { - flex: 1; -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) .jse-nested-property-path:where(.svelte-1b9gnk8) .jse-nested-property-count:where(.svelte-1b9gnk8) { - opacity: 0.5; - white-space: nowrap; -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8) { - text-align: left; - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} -.jse-table-mode-welcome.svelte-1b9gnk8 .jse-space.jse-after:where(.svelte-1b9gnk8) { - flex: 2; -}`);var T5A=JA(`An empty document cannot be opened in table mode. You can go to tree mode instead, or paste - a JSON Array using Ctrl+V.`,1),J5A=JA(''),O5A=JA('
            '),Y5A=JA('
            ');function H5A(t,e){Nt(e,!0);var A=Il(()=>e.json?(function(E){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:2,m=[];return(function v(k,S){ia(k)&&S.length{v(k[b],S.concat(b))}),Vo(k)&&m.push(S)})(E,[]),m})(e.json).slice(0,99).filter(E=>E.length>0):[]),i=Il(()=>!en(c(A))),n=Il(()=>e.json===void 0&&(e.text===""||e.text===void 0)),o=Il(()=>c(i)?"Object with nested arrays":c(n)?"An empty document":ia(e.json)?"An object":Vo(e.json)?"An empty array":"A ".concat(kR(e.json,e.parser))),a=Y5A();a.__click=()=>e.onClick();var r=_A(dA(a),2),s=dA(r),l=dA(s),g=_A(s,2),C=dA(g),I=E=>{CA(E,dr(`An object cannot be opened in table mode. You can open a nested array instead, or open the - document in tree mode.`))},d=E=>{var f=Fi(),m=et(f),v=S=>{CA(S,T5A())},k=S=>{var b=dr();Se(()=>{var x;return Lt(b,"".concat((x=c(o))!==null&&x!==void 0?x:""," cannot be opened in table mode. You can open the document in tree mode instead."))}),CA(S,b)};jA(m,S=>{c(n)&&!e.readOnly?S(v):S(k,!1)},!0),CA(E,f)};jA(C,E=>{c(i)?E(I):E(d,!1)});var h=_A(g,2);da(h,17,()=>c(A),ka,(E,f)=>{var m=Il(()=>(function(Z){return Xe(e.json,Z).length})(c(f))),v=O5A(),k=dA(v),S=dA(k),b=dA(_A(S)),x=_A(k,2);x.__click=()=>e.openJSONEditorModal(c(f));var F=dA(x),z=_A(x,2),P=Z=>{var tA=J5A();tA.__click=()=>e.extractPath(c(f)),CA(Z,tA)};jA(z,Z=>{e.readOnly||Z(P)}),Se(Z=>{var tA;Lt(S,'"'.concat(Z??"",'" ')),Lt(b,"(".concat((tA=c(m))!==null&&tA!==void 0?tA:""," ").concat(c(m)!==1?"items":"item",")")),Lt(F,e.readOnly?"View":"Edit")},[()=>Bl(c(f))]),CA(E,v)}),_A(h,2).__click=()=>e.onChangeMode(Da.tree),Se(()=>Lt(l,c(o))),CA(t,a),Ft()}Vf(["click"]);Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-column-header.svelte-1wgrwv3 { - background: none; - border: none; - font-family: inherit; - font-size: inherit; - color: inherit; - display: flex; - gap: var(--jse-padding, 10px); - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); - width: 100%; -} -.jse-column-header.svelte-1wgrwv3:hover { - background: var(--jse-table-header-background-highlight, #e8e8e8); -} -.jse-column-header.svelte-1wgrwv3:not(.jse-column-header.jse-readonly) { - cursor: pointer; -}`);var z5A=JA('');Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-table-mode.svelte-1p86y3c { - flex: 1; - display: flex; - flex-direction: column; - position: relative; - background: var(--jse-background-color, #fff); - min-width: 0; - min-height: 0; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-text-color, #4d4d4d); - line-height: var(--jse-line-height, calc(1em + 4px)); -} -.jse-table-mode.no-main-menu.svelte-1p86y3c { - border-top: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode.svelte-1p86y3c .jse-search-box-container:where(.svelte-1p86y3c) { - position: relative; - height: 0; - top: calc(var(--jse-line-height, calc(1em + 4px)) + 2 * var(--jse-padding, 10px)); - margin-right: calc(var(--jse-padding, 10px) + 20px); - margin-left: var(--jse-padding, 10px); - text-align: right; - z-index: 3; -} -.jse-table-mode.svelte-1p86y3c .jse-hidden-input-label:where(.svelte-1p86y3c) { - position: fixed; - right: 0; - top: 0; - width: 0; - height: 0; -} -.jse-table-mode.svelte-1p86y3c .jse-hidden-input-label:where(.svelte-1p86y3c) .jse-hidden-input:where(.svelte-1p86y3c) { - width: 0; - height: 0; - padding: 0; - border: 0; - outline: none; -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) { - flex: 1; - align-items: flex-start; - flex-direction: column; - display: flex; - overflow: auto; - overflow-anchor: none; - scrollbar-gutter: stable; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c):last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) { - border-collapse: collapse; - border-spacing: 0; -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-start-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c), -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-end-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c) { - margin: 0; - padding: 0; -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-search-box-background:where(.svelte-1p86y3c) { - background: var(--jse-table-header-background, #f5f5f5); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-end-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c) { - padding-bottom: var(--jse-padding, 10px); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c):hover { - background-color: var(--jse-table-row-odd-background, rgba(0, 0, 0, 0.05)); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) { - padding: 0 var(--jse-padding, 10px) 0 0; - vertical-align: top; - white-space: nowrap; - height: var(--jse-line-height, calc(1em + 4px)); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c), .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-gutter:where(.svelte-1p86y3c) { - font-weight: normal; - text-align: left; - color: var(--jse-text-readonly, #8d8d8d); - background: var(--jse-table-header-background, #f5f5f5); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c) { - padding: 0; - position: sticky; - top: 0; -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c) .jse-table-root-error:where(.svelte-1p86y3c) { - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-gutter:where(.svelte-1p86y3c) { - padding: 0 var(--jse-padding, 10px) 0 calc(0.5 * var(--jse-padding, 10px)); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer:where(.svelte-1p86y3c) { - display: inline-block; - cursor: var(--jse-contents-cursor, pointer); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer:where(.svelte-1p86y3c):hover { - background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer.jse-selected-value:where(.svelte-1p86y3c) { - background: var(--jse-selection-background-color, #d3d3d3); -} -.jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-context-menu-anchor:where(.svelte-1p86y3c) { - display: inline-flex; - position: relative; - vertical-align: top; -} -.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) { - align-items: unset; -} -.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) .jse-loading-space:where(.svelte-1p86y3c) { - flex: 1; -} -.jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) .jse-loading:where(.svelte-1p86y3c) { - flex: 2; - text-align: center; - color: var(--jse-panel-color-readonly, #b2b2b2); - box-sizing: border-box; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -}`);var P5A=JA('
            '),j5A=JA(''),q5A=JA(''),V5A=JA(' '),W5A=JA('
            '),Z5A=JA('
            '),X5A=JA(''),$5A=JA(''),ADA=JA('
            ',1),eDA=JA(" ",1),tDA=JA(' ',1),iDA=JA('
            loading...
            '),nDA=JA('
            ',1);function oDA(t,e){Nt(e,!1);var A=EA(void 0,!0),i=EA(void 0,!0),n=EA(void 0,!0),o=or("jsoneditor:TableMode"),{openAbsolutePopup:a,closeAbsolutePopup:r}=kI("absolute-popup"),s=R$(),l=Y2(),g=Y2(),C=typeof window>"u";o("isSSR:",C);var I=L(e,"readOnly",9),d=L(e,"externalContent",9),h=L(e,"externalSelection",9),E=L(e,"history",9),f=L(e,"truncateTextSize",9),m=L(e,"mainMenuBar",9),v=L(e,"escapeControlCharacters",9),k=L(e,"escapeUnicodeCharacters",9),S=L(e,"flattenColumns",9),b=L(e,"parser",9),x=L(e,"parseMemoizeOne",9),F=L(e,"validator",9),z=L(e,"validationParser",9),P=L(e,"indentation",9),Z=L(e,"onChange",9),tA=L(e,"onChangeMode",9),W=L(e,"onSelect",9),BA=L(e,"onUndo",9),X=L(e,"onRedo",9),iA=L(e,"onRenderValue",9),AA=L(e,"onRenderMenu",9),IA=L(e,"onRenderContextMenu",9),aA=L(e,"onFocus",9),rA=L(e,"onBlur",9),uA=L(e,"onSortModal",9),UA=L(e,"onTransformModal",9),$A=L(e,"onJSONEditorModal",9),zA=EA(void 0,!0),pA=EA(void 0,!0),PA=EA(void 0,!0),Je=EA(void 0,!0),_e=EA(void 0,!0);qR({onMount:As,onDestroy:Dg,getWindow:()=>Xf(c(pA)),hasFocus:()=>xe&&document.hasFocus()||RR(c(pA)),onFocus:()=>{oi=!0,aA()&&aA()()},onBlur:()=>{oi=!1,rA()&&rA()()}});var YA,fA=EA(void 0,!0),XA=EA(void 0,!0),DA=EA(void 0,!0),ee=EA(void 0,!0),NA=EA(void 0,!0),ke=EA(void 0,!0),HA=EA(!1,!0),vA=EA(!1,!0);function Gt(_){N(ke,(YA=_)?f$(c(fA),YA.items):void 0)}function ft(_){return he.apply(this,arguments)}function he(){return(he=zt(function*(_){N(OA,void 0),yield un(_)})).apply(this,arguments)}function Ot(){N(HA,!1),N(vA,!1),G()}var He=EA(1e4,!0),je=EA([],!0),pt=EA(void 0,!0),xe=!1,oi=!1,j=EA(!1,!0),$=EA({},!0),oA=EA(600,!0),sA=EA(0,!0),TA=18;function de(_){N(OA,_)}function Qe(_){c(OA)&&_!==void 0&&(vr(_,hd(c(OA)))&&vr(_,It(c(OA)))||(o("clearing selection: path does not exist anymore",c(OA)),N(OA,void 0)))}var GA=EA(c(fA)!==void 0?oR({json:c(fA)}):void 0,!0),OA=EA(Kf(h())?h():void 0,!0),ht=EA(void 0,!0),tt=EA(!1,!0);function ze(_){if(!I()){o("onSortByHeader",_);var q=_.sortDirection===ug.desc?-1:1;Li(T$(c(fA),[],_.path,q),(nA,cA)=>({state:cA,sortedColumn:_}))}}As(()=>{c(OA)&&Yo(It(c(OA)))});var Oe=EA(void 0,!0);function Ci(_){if(_.json!==void 0||_.text!==void 0){var q=c(fA)!==void 0&&_.json!==void 0;E().add({type:"tree",undo:{patch:q?[{op:"replace",path:"",value:_.json}]:void 0,json:_.json,text:_.text,documentState:_.documentState,textIsRepaired:_.textIsRepaired,selection:D0(_.selection),sortedColumn:_.sortedColumn},redo:{patch:q?[{op:"replace",path:"",value:c(fA)}]:void 0,json:c(fA),text:c(XA),documentState:c(GA),textIsRepaired:c(tt),selection:D0(c(OA)),sortedColumn:c(ht)}})}}var gn=EA([],!0),hn=xE(N$);function Ke(_,q,nA,cA){vh(()=>{var MA;try{MA=hn(_,q,nA,cA)}catch(oe){MA=[{path:[],message:"Failed to validate: "+oe.message,severity:hc.warning}]}Mi(MA,c(gn))||(o("validationErrors changed:",MA),N(gn,MA))},MA=>o("validationErrors updated in ".concat(MA," ms")))}function nn(){return o("validate"),c(DA)?{parseError:c(DA),isRepairable:!1}:(Ke(c(fA),F(),b(),z()),en(c(gn))?void 0:{validationErrors:c(gn)})}function Si(_,q){if(o("patch",_,q),c(fA)===void 0)throw new Error("Cannot apply patch: no JSON");var nA=c(fA),cA={json:void 0,text:c(XA),documentState:c(GA),selection:D0(c(OA)),sortedColumn:c(ht),textIsRepaired:c(tt)},MA=u$(c(fA),_),oe=r$(c(fA),c(GA),_),se=VwA(c(ht),_,c(je)),Ee=typeof q=="function"?q(oe.json,oe.documentState,c(OA)):void 0;return N(fA,Ee?.json!==void 0?Ee.json:oe.json),N(GA,Ee?.state!==void 0?Ee.state:oe.documentState),N(OA,Ee?.selection!==void 0?Ee.selection:c(OA)),N(ht,Ee?.sortedColumn!==void 0?Ee.sortedColumn:se),N(XA,void 0),N(tt,!1),N(ee,void 0),N(NA,void 0),N(DA,void 0),E().add({type:"tree",undo:Me({patch:MA},cA),redo:{patch:_,json:void 0,text:void 0,documentState:c(GA),selection:D0(c(OA)),sortedColumn:c(ht),textIsRepaired:c(tt)}}),{json:c(fA),previousJson:nA,undo:MA,redo:_}}function Li(_,q){o("handlePatch",_,q);var nA={json:c(fA),text:c(XA)},cA=Si(_,q);return Zi(nA,cA),cA}function Zi(_,q){if((_.json!==void 0||_?.text!==void 0)&&Z()){if(c(XA)!==void 0){var nA={text:c(XA),json:void 0};Z()(nA,_,{contentErrors:nn(),patchResult:q})}else if(c(fA)!==void 0){var cA={text:void 0,json:c(fA)};Z()(cA,_,{contentErrors:nn(),patchResult:q})}}}function bt(_){o("pasted json as text",_),N(ee,_)}function on(_){o("pasted multiline text",{pastedText:_}),N(NA,_)}function Kt(_){var q=parseInt(_[0],10),nA=[String(q+1),..._.slice(1)];return vr(c(fA),nA)?Hi(nA):Hi(_)}function G(){o("focus"),c(Je)&&(c(Je).focus(),c(Je).select())}function dt(_){N(sA,_.target.scrollTop)}function Ei(){c(OA)||N(OA,(function(){if(Vo(c(fA))&&!en(c(fA))&&!en(c(je)))return Hi(["0",...c(je)[0]])})())}function Qn(){if(c(tt)&&c(fA)!==void 0){var _={json:c(fA),text:c(XA)},q={json:c(fA),documentState:c(GA),selection:c(OA),sortedColumn:c(ht),text:c(XA),textIsRepaired:c(tt)};N(XA,void 0),N(tt,!1),Qe(c(fA)),Ci(q),Zi(_,void 0)}return{json:c(fA),text:c(XA)}}function un(_){var{scrollToWhenVisible:q=!0}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},nA=c(HA)?vf:0,cA=GZ(_,c(je),$,TA),MA=cA-c(sA)+nA+TA,oe=Bo(_);if(o("scrollTo",{path:_,top:cA,scrollTop:c(sA),elem:oe}),!c(PA))return Promise.resolve();var se=c(PA).getBoundingClientRect();if(oe&&!q){var Ee=oe.getBoundingClientRect();if(Ee.bottom>se.top&&Ee.top{s(oe,{container:c(PA),offset:Pe,duration:300,callback:()=>{Vn(_),Re()}})}:Re=>{s(MA,{container:c(PA),offset:Pe,duration:300,callback:()=>{Ro(),Vn(_),Re()}})})}function Vn(_){var q=Bo(_);if(q&&c(PA)){var nA=c(PA).getBoundingClientRect(),cA=q.getBoundingClientRect();if(cA.right>nA.right){var MA=cA.right-nA.right;Tl(PA,c(PA).scrollLeft+=MA)}if(cA.leftPe){var Re=MA-Pe;Tl(PA,c(PA).scrollTop+=Re)}if(cAk0(_.slice(1),oe)),MA=cA?_.slice(0,1).concat(cA):_;return(q=(nA=c(PA))===null||nA===void 0?void 0:nA.querySelector('td[data-path="'.concat(eD(MA),'"]')))!==null&&q!==void 0?q:void 0}function No(_){var q,{anchor:nA,left:cA,top:MA,width:oe,height:se,offsetTop:Ee,offsetLeft:Pe,showTip:Re}=_,Le=(function(yA){var{json:WA,documentState:Ge,selection:ye,readOnly:be,onEditValue:ot,onEditRow:Vt,onToggleEnforceString:Gi,onCut:Fn,onCopy:$i,onPaste:Qo,onRemove:$t,onDuplicateRow:$o,onInsertBeforeRow:Zn,onInsertAfterRow:Aa,onRemoveRow:mn}=yA,Tt=WA!==void 0,an=!!ye,Ai=WA!==void 0&&ye?Xe(WA,It(ye)):void 0,yt=Tt&&(Co(ye)||nr(ye)||En(ye)),Ii=!be&&Tt&&ye!==void 0&&dD(ye),la=Ii&&!aa(Ai),Xn=!be&&yt,ea=ye!==void 0&&v0(WA,Ge,It(ye));return[{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"label",text:"Table cell:"},{type:"dropdown-button",main:{type:"button",onClick:()=>ot(),icon:F1,text:"Edit",title:"Edit the value (Double-click on the value)",disabled:!Ii},width:"11em",items:[{type:"button",icon:F1,text:"Edit",title:"Edit the value (Double-click on the value)",onClick:()=>ot(),disabled:!Ii},{type:"button",icon:ea?X9:eS,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>Gi(),disabled:!la}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Fn(!0),icon:L1,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!Xn},width:"10em",items:[{type:"button",icon:L1,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>Fn(!0),disabled:be||!yt},{type:"button",icon:L1,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>Fn(!1),disabled:be||!yt}]},{type:"dropdown-button",main:{type:"button",onClick:()=>$i(!0),icon:IC,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!yt},width:"12em",items:[{type:"button",icon:IC,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>$i(!1),disabled:!yt},{type:"button",icon:IC,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>$i(!1),disabled:!yt}]},{type:"button",onClick:()=>Qo(),icon:V9,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:be||!an},{type:"button",onClick:()=>$t(),icon:T8,text:"Remove",title:"Remove selected contents (Delete)",disabled:be||!yt}]},{type:"column",items:[{type:"label",text:"Table row:"},{type:"button",onClick:()=>Vt(),icon:F1,text:"Edit row",title:"Edit the current row",disabled:be||!an||!Tt},{type:"button",onClick:()=>$o(),icon:Z9,text:"Duplicate row",title:"Duplicate the current row (Ctrl+D)",disabled:be||!an||!Tt},{type:"button",onClick:()=>Zn(),icon:G1,text:"Insert before",title:"Insert a row before the current row",disabled:be||!an||!Tt},{type:"button",onClick:()=>Aa(),icon:G1,text:"Insert after",title:"Insert a row after the current row",disabled:be||!an||!Tt},{type:"button",onClick:()=>mn(),icon:T8,text:"Remove row",title:"Remove current row",disabled:be||!an||!Tt}]}]}]})({json:c(fA),documentState:c(GA),selection:c(OA),readOnly:I(),onEditValue:Ba,onEditRow:Xo,onToggleEnforceString:ra,onCut:Za,onCopy:Ta,onPaste:mi,onRemove:Ui,onDuplicateRow:Nn,onInsertBeforeRow:ho,onInsertAfterRow:Fo,onRemoveRow:xA}),ai=(q=IA()(Le))!==null&&q!==void 0?q:Le;if(ai!==!1){var Yn={left:cA,top:MA,offsetTop:Ee,offsetLeft:Pe,width:oe,height:se,anchor:nA,closeOnOuterClick:!0,onClose:()=>{xe=!1,G()}};xe=!0;var eA=a(W$,{tip:Re?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:ai,onRequestClose(){r(eA),G()}},Yn)}}function Zo(_){if(!tr(c(OA)))if(_&&(_.stopPropagation(),_.preventDefault()),_&&_.type==="contextmenu"&&_.target!==c(Je))No({left:_.clientX,top:_.clientY,width:xC,height:kC,showTip:!1});else{var q,nA=(q=c(PA))===null||q===void 0?void 0:q.querySelector(".jse-table-cell.jse-selected-value");if(nA)No({anchor:nA,offsetTop:2,width:xC,height:kC,showTip:!1});else{var cA,MA=(cA=c(PA))===null||cA===void 0?void 0:cA.getBoundingClientRect();MA&&No({top:MA.top+2,left:MA.left+2,width:xC,height:kC,showTip:!1})}}}function Do(_){No({anchor:t$(_.target,"BUTTON"),offsetTop:0,width:xC,height:kC,showTip:!0})}function Ba(){if(!I()&&c(OA)){var _=It(c(OA));aa(Xe(c(fA),_))?rt(_):N(OA,Hi(_))}}function Xo(){!I()&&c(OA)&&rt(It(c(OA)).slice(0,1))}function ra(){if(!I()&&En(c(OA))){var _=c(OA).path,q=vt(_),nA=Xe(c(fA),_),cA=!v0(c(fA),c(GA),_),MA=cA?String(nA):$h(String(nA),b());o("handleToggleEnforceString",{enforceString:cA,value:nA,updatedValue:MA}),Li([{op:"replace",path:q,value:MA}],(oe,se)=>({state:_D(c(fA),se,_,{type:"value",enforceString:cA})}))}}function yo(){return ge.apply(this,arguments)}function ge(){return(ge=zt(function*(){if(o("apply pasted json",c(ee)),c(ee)){var{onPasteAsJson:_}=c(ee);_(),setTimeout(G)}})).apply(this,arguments)}function mi(){return cn.apply(this,arguments)}function cn(){return(cn=zt(function*(){try{mA(yield navigator.clipboard.readText())}catch(_){console.error(_),N(j,!0)}})).apply(this,arguments)}function fn(){return Ho.apply(this,arguments)}function Ho(){return(Ho=zt(function*(){o("apply pasted multiline text",c(NA)),c(NA)&&(mA(JSON.stringify(c(NA))),setTimeout(G))})).apply(this,arguments)}function ya(){o("clear pasted json"),N(ee,void 0),G()}function _i(){o("clear pasted multiline text"),N(NA,void 0),G()}function Eo(){tA()(Da.text)}function Za(_){return vo.apply(this,arguments)}function vo(){return(vo=zt(function*(_){yield H$({json:c(fA),selection:c(OA),indentation:_?P():void 0,readOnly:I(),parser:b(),onPatch:Li})})).apply(this,arguments)}function Ta(){return Jn.apply(this,arguments)}function Jn(){return Jn=zt(function*(){var _=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];c(fA)!==void 0&&(yield z$({json:c(fA),selection:c(OA),indentation:_?P():void 0,parser:b()}))}),Jn.apply(this,arguments)}function Ui(){j$({json:c(fA),text:c(XA),selection:c(OA),keepSelection:!0,readOnly:I(),onChange:Z(),onPatch:Li})}function qt(_){I()||(o("extract",{path:_}),Li(E$(c(fA),Hi(_))))}function Nn(){(function(_){var{json:q,selection:nA,columns:cA,readOnly:MA,onPatch:oe}=_;if(!MA&&q!==void 0&&nA&&Dh(nA)){var{rowIndex:se,columnIndex:Ee}=hg(It(nA),cA);ps("duplicate row",{rowIndex:se});var Pe=[String(se)];oe(B$(q,[Pe]),(Re,Le)=>({state:Le,selection:Hi(sd({rowIndex:se({state:Yn,selection:Hi(sd({rowIndex:Pe,columnIndex:Ee},cA))}))}})({json:c(fA),selection:c(OA),columns:c(je),readOnly:I(),onPatch:Li})}function xA(){(function(_){var{json:q,selection:nA,columns:cA,readOnly:MA,onPatch:oe}=_;if(!MA&&q!==void 0&&nA&&Dh(nA)){var{rowIndex:se,columnIndex:Ee}=hg(It(nA),cA);ps("remove row",{rowIndex:se}),oe(ED([[String(se)]]),(Pe,Re)=>{var Le=se0?se-1:void 0,ai=Le!==void 0?Hi(sd({rowIndex:Le,columnIndex:Ee},cA)):void 0;return ps("remove row new selection",{rowIndex:se,newRowIndex:Le,newSelection:ai}),{state:Re,selection:ai}})}})({json:c(fA),selection:c(OA),columns:c(je),readOnly:I(),onPatch:Li})}function Ae(){return(Ae=zt(function*(_){yield q$({char:_,selectInside:!1,json:c(fA),selection:c(OA),readOnly:I(),parser:b(),onPatch:Li,onReplaceJson:FA,onSelect:de})})).apply(this,arguments)}function De(_){var q;_.preventDefault(),mA((q=_.clipboardData)===null||q===void 0?void 0:q.getData("text/plain"))}function mA(_){_!==void 0&&P$({clipboardText:_,json:c(fA),selection:c(OA),readOnly:I(),parser:b(),onPatch:Li,onChangeText:le,onPasteMultilineText:on,openRepairModal:xt})}function FA(_,q){var nA={json:c(fA),text:c(XA)},cA={json:c(fA),documentState:c(GA),selection:c(OA),sortedColumn:c(ht),text:c(XA),textIsRepaired:c(tt)},MA=Ul(_,c(GA)),oe=typeof q=="function"?q(_,MA,c(OA)):void 0;N(fA,oe?.json!==void 0?oe.json:_),N(GA,oe?.state!==void 0?oe.state:MA),N(OA,oe?.selection!==void 0?oe.selection:c(OA)),N(ht,void 0),N(XA,void 0),N(tt,!1),N(DA,void 0),Qe(c(fA)),Ci(cA),Zi(nA,void 0)}function le(_,q){o("handleChangeText");var nA={json:c(fA),text:c(XA)},cA={json:c(fA),documentState:c(GA),selection:c(OA),sortedColumn:c(ht),text:c(XA),textIsRepaired:c(tt)};try{N(fA,x()(_)),N(GA,Ul(c(fA),c(GA))),N(XA,void 0),N(tt,!1),N(DA,void 0)}catch(oe){try{N(fA,x()(ag(_))),N(GA,Ul(c(fA),c(GA))),N(XA,_),N(tt,!0),N(DA,void 0)}catch(se){N(fA,void 0),N(GA,void 0),N(XA,_),N(tt,!1),N(DA,c(XA)!==""?Th(c(XA),oe.message||String(oe)):void 0)}}if(typeof q=="function"){var MA=q(c(fA),c(GA),c(OA));N(fA,MA?.json!==void 0?MA.json:c(fA)),N(GA,MA?.state!==void 0?MA.state:c(GA)),N(OA,MA?.selection!==void 0?MA.selection:c(OA))}Qe(c(fA)),Ci(cA),Zi(nA,void 0)}function Ne(_){o("select validation error",_),N(OA,Hi(_.path)),un(_.path)}function nt(_){if(c(fA)!==void 0){var{id:q,onTransform:nA,onClose:cA}=_,MA=_.rootPath||[];xe=!0,UA()({id:q||g,json:c(fA),rootPath:MA||[],onTransform:oe=>{nA?nA({operations:oe,json:c(fA),transformedJson:tl(c(fA),oe)}):(o("onTransform",MA,oe),Li(oe))},onClose:()=>{xe=!1,setTimeout(G),cA&&cA()}})}}function rt(_){o("openJSONEditorModal",{path:_}),xe=!0,$A()({content:{json:Xe(c(fA),_)},path:_,onPatch:Li,onClose:()=>{xe=!1,setTimeout(G)}})}function xt(_,q){N(_e,{text:_,onParse:nA=>Zf(nA,cA=>Wf(cA,b())),onRepair:jX,onApply:q,onClose:G})}function On(){(function(_){I()||c(fA)===void 0||(xe=!0,uA()({id:l,json:c(fA),rootPath:_,onSort:q=>{var{operations:nA,itemPath:cA,direction:MA}=q;o("onSort",nA,_,cA,MA),Li(nA,(oe,se)=>({state:se,sortedColumn:{path:cA,sortDirection:MA===-1?ug.desc:ug.asc}}))},onClose:()=>{xe=!1,setTimeout(G)}}))})([])}function Ti(){nt({rootPath:[]})}function zi(_){o("openFind",{findAndReplace:_}),N(HA,!1),N(vA,!1),Ro(),N(HA,!0),N(vA,_)}function Xt(){if(!I()&&E().canUndo){var _=E().undo();if(ID(_)){var q={json:c(fA),text:c(XA)};N(fA,_.undo.patch?tl(c(fA),_.undo.patch):_.undo.json),N(GA,_.undo.documentState),N(OA,_.undo.selection),N(ht,_.undo.sortedColumn),N(XA,_.undo.text),N(tt,_.undo.textIsRepaired),N(DA,void 0),o("undo",{item:_,json:c(fA)}),Zi(q,_.undo.patch&&_.redo.patch?{json:c(fA),previousJson:q.json,redo:_.undo.patch,undo:_.redo.patch}:void 0),G(),c(OA)&&un(It(c(OA)),{scrollToWhenVisible:!1})}else BA()(_)}}function Ji(){if(!I()&&E().canRedo){var _=E().redo();if(ID(_)){var q={json:c(fA),text:c(XA)};N(fA,_.redo.patch?tl(c(fA),_.redo.patch):_.redo.json),N(GA,_.redo.documentState),N(OA,_.redo.selection),N(ht,_.redo.sortedColumn),N(XA,_.redo.text),N(tt,_.redo.textIsRepaired),N(DA,void 0),o("redo",{item:_,json:c(fA)}),Zi(q,_.undo.patch&&_.redo.patch?{json:c(fA),previousJson:q.json,redo:_.redo.patch,undo:_.undo.patch}:void 0),G(),c(OA)&&un(It(c(OA)),{scrollToWhenVisible:!1})}else X()(_)}}function va(_){N(oA,_.getBoundingClientRect().height)}KA(()=>(K(v()),K(k())),()=>{N(zA,xR({escapeControlCharacters:v(),escapeUnicodeCharacters:k()}))}),KA(()=>c(HA),()=>{(function(_){if(c(PA)){var q=_?vf:-100;c(PA).scrollTo({top:Tl(PA,c(PA).scrollTop+=q),left:c(PA).scrollLeft})}})(c(HA))}),KA(()=>K(d()),()=>{(function(_){var q={json:c(fA)},nA=Rf(_)?_.text!==c(XA):!Mi(q.json,_.json);if(o("update external content",{isChanged:nA}),nA){var cA={json:c(fA),documentState:c(GA),selection:c(OA),sortedColumn:c(ht),text:c(XA),textIsRepaired:c(tt)};if(Rf(_))try{N(fA,x()(_.text)),N(GA,Ul(c(fA),c(GA))),N(XA,_.text),N(tt,!1),N(DA,void 0)}catch(MA){try{N(fA,x()(ag(_.text))),N(GA,Ul(c(fA),c(GA))),N(XA,_.text),N(tt,!0),N(DA,void 0)}catch(oe){N(fA,void 0),N(GA,void 0),N(XA,_.text),N(tt,!1),N(DA,c(XA)!==""?Th(c(XA),MA.message||String(MA)):void 0)}}else N(fA,_.json),N(GA,Ul(c(fA),c(GA))),N(XA,void 0),N(tt,!1),N(DA,void 0);Qe(c(fA)),N(ht,void 0),Ci(cA)}})(d())}),KA(()=>K(h()),()=>{(function(_){Mi(c(OA),_)||(o("applyExternalSelection",{selection:c(OA),externalSelection:_}),Kf(_)&&N(OA,_))})(h())}),KA(()=>(c(je),c(fA),K(S()),c(He)),()=>{N(je,Vo(c(fA))?(function(_,q){var nA=new Set(q.map(vt)),cA=new Set(_.map(vt));for(var MA of nA)cA.has(MA)||nA.delete(MA);for(var oe of cA)nA.has(oe)||nA.add(oe);return[...nA].map(Es)})(zwA(c(fA),S(),c(He)),c(je)):[])}),KA(()=>(c(fA),c(je)),()=>{N(pt,!(!c(fA)||en(c(je))))}),KA(()=>(c(fA),c(He)),()=>{N(A,Array.isArray(c(fA))&&c(fA).length>c(He))}),KA(()=>(c(sA),c(oA),c(fA),c(HA),vf),()=>{N(i,PwA(c(sA),c(oA),c(fA),$,TA,c(HA)?vf:0))}),KA(()=>c(fA),()=>{c(fA),c(PA)&&c(PA).scrollTo({top:c(PA).scrollTop,left:c(PA).scrollLeft})}),KA(()=>c(OA),()=>{var _;_=c(OA),Mi(_,h())||(o("onSelect",_),W()(_))}),KA(()=>(K(I()),K(f()),K(b()),c(zA),c(fA),c(GA),K(iA())),()=>{N(Oe,{mode:Da.table,readOnly:I(),truncateTextSize:f(),parser:b(),normalization:c(zA),getJson:()=>c(fA),getDocumentState:()=>c(GA),findElement:Bo,findNextInside:Kt,focus:G,onPatch:(_,q)=>Li((function(nA,cA){return nA.flatMap(MA=>{if($6(MA)){var oe=Es(MA.path);if(oe.length>0){for(var se=[MA],Ee=Yi(oe);Ee.length>0&&!vr(cA,Ee);)se.unshift({op:"add",path:vt(Ee),value:{}}),Ee=Yi(Ee);return se}}return MA})})(_,c(fA)),q),onSelect:de,onFind:zi,onPasteJson:bt,onRenderValue:iA()})}),KA(()=>(c(fA),K(F()),K(b()),K(z())),()=>{Ke(c(fA),F(),b(),z())}),KA(()=>(c(gn),c(je)),()=>{N(n,jwA(c(gn),c(je)))}),Rn();var Ut={validate:nn,patch:Si,focus:G,acceptAutoRepair:Qn,scrollTo:un,findElement:Bo,openTransformModal:nt};ni(!0);var st=nDA();fe("mousedown",NC,function(_){!AQ(_.target,q=>q===c(pA))&&tr(c(OA))&&(o("click outside the editor, exit edit mode"),N(OA,D0(c(OA))),oi&&c(Je)&&(c(Je).focus(),c(Je).blur()),o("blur (outside editor)"),c(Je)&&c(Je).blur())});var Oi,Xi=et(st),Wn=dA(Xi),pn=_=>{(function(q,nA){Nt(nA,!1);var cA=L(nA,"containsValidArray",9),MA=L(nA,"readOnly",9),oe=L(nA,"showSearch",13,!1),se=L(nA,"history",9),Ee=L(nA,"onSort",9),Pe=L(nA,"onTransform",9),Re=L(nA,"onContextMenu",9),Le=L(nA,"onUndo",9),ai=L(nA,"onRedo",9),Yn=L(nA,"onRenderMenu",9);function eA(){oe(!oe())}var yA=EA(void 0,!0),WA=EA(void 0,!0);KA(()=>(K(MA()),K(Ee()),K(cA()),K(Pe()),K(Re()),K(Le()),K(se()),K(ai())),()=>{N(yA,MA()?[{type:"space"}]:[{type:"button",icon:y4,title:"Sort",className:"jse-sort",onClick:Ee(),disabled:MA()||!cA()},{type:"button",icon:p4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:Pe(),disabled:MA()||!cA()},{type:"button",icon:m4,title:"Search (Ctrl+F)",className:"jse-search",onClick:eA,disabled:!cA()},{type:"button",icon:W9,title:LR,className:"jse-contextmenu",onClick:Re()},{type:"separator"},{type:"button",icon:Y8,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:Le(),disabled:!se().canUndo},{type:"button",icon:O8,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:ai(),disabled:!se().canRedo},{type:"space"}])}),KA(()=>(K(Yn()),c(yA)),()=>{N(WA,Yn()(c(yA))||c(yA))}),Rn(),ni(!0),KD(q,{get items(){return c(WA)}}),Ft()})(_,{get containsValidArray(){return c(pt)},get readOnly(){return I()},get history(){return E()},onSort:On,onTransform:Ti,onUndo:Xt,onRedo:Ji,onContextMenu:Do,get onRenderMenu(){return AA()},get showSearch(){return c(HA)},set showSearch(q){N(HA,q)},$$legacy:!0})};jA(Wn,_=>{m()&&_(pn)});var _t=_A(Wn,2),sa=_=>{var q=tDA(),nA=et(q),cA=dA(nA);cA.readOnly=!0,Oo(cA,Ee=>N(Je,Ee),()=>c(Je));var MA=_A(nA,2),oe=Ee=>{var Pe=ADA(),Re=et(Pe);J$(dA(Re),{get json(){return c(fA)},get documentState(){return c(GA)},get parser(){return b()},get showSearch(){return c(HA)},get showReplace(){return c(vA)},get readOnly(){return I()},get columns(){return c(je)},onSearch:Gt,onFocus:ft,onPatch:Li,onClose:Ot});var Le=_A(Re,2),ai=dA(Le),Yn=dA(ai),eA=dA(Yn),yA=dA(eA),WA=dA(yA),Ge=yt=>{var Ii=it(()=>(K(Eh),c(n),wA(()=>{var Ea;return Eh([],(Ea=c(n))===null||Ea===void 0?void 0:Ea.root)}))),la=Fi(),Xn=et(la),ea=Ea=>{var Er=P5A();Rh(dA(Er),{get validationError(){return c(Ii)},get onExpand(){return Qg}}),CA(Ea,Er)};jA(Xn,Ea=>{c(Ii)&&Ea(ea)}),CA(yt,la)};jA(WA,yt=>{K(en),c(n),wA(()=>{var Ii;return!en((Ii=c(n))===null||Ii===void 0?void 0:Ii.root)})&&yt(Ge)});var ye=_A(yA);da(ye,1,()=>c(je),ka,(yt,Ii)=>{var la=j5A();(function(Xn,ea){Nt(ea,!1);var Ea=EA(void 0,!0),Er=EA(void 0,!0),L0=EA(void 0,!0),fl=L(ea,"path",9),bg=L(ea,"sortedColumn",9),_c=L(ea,"readOnly",9),Mg=L(ea,"onSort",9);KA(()=>(K(fl()),Bl),()=>{N(Ea,en(fl())?"values":Bl(fl()))}),KA(()=>(K(bg()),K(fl())),()=>{var xa;N(Er,bg()&&Mi(fl(),(xa=bg())===null||xa===void 0?void 0:xa.path)?bg().sortDirection:void 0)}),KA(()=>(c(Er),eZ),()=>{N(L0,c(Er)?eZ[c(Er)]:void 0)}),Rn(),ni(!0);var is,hr=U5A(),pl=dA(hr),G0=dA(pl),ml=_A(pl,2),Ln=xa=>{var _a=K5A(),YI=dA(_a),Jd=it(()=>(c(Er),K(ug),K(c0),K(AS),wA(()=>c(Er)===ug.asc?c0:AS)));tn(YI,{get data(){return c(Jd)}}),Se(()=>_n(_a,"title","Currently sorted in ".concat(c(L0)," order"))),CA(xa,_a)};jA(ml,xa=>{c(Er)!==void 0&&xa(Ln)}),Se(xa=>{is=ii(hr,1,"jse-column-header svelte-5pxwfq",null,is,{"jse-readonly":_c()}),_n(hr,"title",_c()?c(Ea):c(Ea)+" (Click to sort the data by this column)"),Lt(G0,xa)},[()=>(K(SC),c(Ea),K(50),wA(()=>SC(c(Ea),50)))]),fe("click",hr,function(){_c()||Mg()({path:fl(),sortDirection:c(Er)===ug.asc?ug.desc:ug.asc})}),CA(Xn,hr),Ft()})(dA(la),{get path(){return c(Ii)},get sortedColumn(){return c(ht)},get readOnly(){return I()},onSort:ze}),CA(yt,la)});var be=_A(ye),ot=yt=>{var Ii=q5A(),la=dA(Ii),Xn=it(()=>(c(fA),wA(()=>Array.isArray(c(fA))?c(fA).length:0)));(function(ea,Ea){Nt(Ea,!1);var Er=L(Ea,"count",9),L0=L(Ea,"maxSampleCount",9),fl=L(Ea,"readOnly",9),bg=L(Ea,"onRefresh",9);ni(!0);var _c,Mg=z5A();tn(dA(Mg),{get data(){return Bz}}),Se(()=>{_c=ii(Mg,1,"jse-column-header svelte-1wgrwv3",null,_c,{"jse-readonly":fl()}),_n(Mg,"title","The Columns are created by sampling ".concat(L0()," items out of ").concat(Er(),". ")+"If you're missing a column, click here to sample all of the items instead of a subset. This is slower.")}),fe("click",Mg,()=>bg()()),CA(ea,Mg),Ft()})(la,{get count(){return c(Xn)},get maxSampleCount(){return c(He)},get readOnly(){return I()},onRefresh:()=>N(He,1/0)}),CA(yt,Ii)};jA(be,yt=>{c(A)&&yt(ot)});var Vt,Gi,Fn=_A(eA),$i=dA(Fn),Qo=_A(Fn);da(Qo,1,()=>(c(i),wA(()=>c(i).visibleItems)),ka,(yt,Ii,la)=>{var Xn=it(()=>(c(i),wA(()=>c(i).startIndex+la))),ea=it(()=>(c(n),K(c(Xn)),wA(()=>c(n).rows[c(Xn)]))),Ea=it(()=>(K(Eh),K(c(Xn)),K(c(ea)),wA(()=>{var is;return Eh([String(c(Xn))],(is=c(ea))===null||is===void 0?void 0:is.row)}))),Er=it(()=>(K(m0),c(fA),c(ke),K(c(Xn)),wA(()=>m0(c(fA),c(ke),[String(c(Xn))])))),L0=$5A(),fl=dA(L0);GX(fl,()=>c(Xn),is=>{var hr=V5A(),pl=dA(hr),G0=_A(pl),ml=Ln=>{Rh(Ln,{get validationError(){return c(Ea)},get onExpand(){return Qg}})};jA(G0,Ln=>{c(Ea)&&Ln(ml)}),ms(hr,(Ln,xa)=>q5?.(Ln,xa),()=>Ln=>(function(xa,_a){$[_a]=xa.getBoundingClientRect().height})(Ln,c(Xn))),Se(()=>{var Ln;return Lt(pl,"".concat((Ln=c(Xn))!==null&&Ln!==void 0?Ln:""," "))}),CA(is,hr)});var bg=_A(fl);da(bg,1,()=>c(je),ka,(is,hr,pl,G0)=>{var ml,Ln=it(()=>(K(c(Xn)),c(hr),wA(()=>[String(c(Xn))].concat(c(hr))))),xa=it(()=>(K(Xe),c(Ii),c(hr),wA(()=>Xe(c(Ii),c(hr))))),_a=it(()=>(K(En),c(OA),K(k0),K(c(Ln)),wA(()=>En(c(OA))&&k0(c(OA).path,c(Ln))))),YI=it(()=>(K(c(ea)),wA(()=>{var Ra;return(Ra=c(ea))===null||Ra===void 0?void 0:Ra.columns[pl]}))),Jd=it(()=>(K(Eh),K(c(Ln)),K(c(YI)),wA(()=>Eh(c(Ln),c(YI))))),HI=Z5A(),DQ=dA(HI),Od=dA(DQ),yQ=Ra=>{var Hl=it(()=>(K(hD),K(m0),c(Ii),K(c(Er)),c(hr),wA(()=>hD(m0(c(Ii),c(Er),c(hr)))))),vQ=it(()=>(K(c(Hl)),wA(()=>!!c(Hl)&&c(Hl).some(PI=>PI.active)))),bQ=it(()=>(K(en),K(c(Hl)),wA(()=>!en(c(Hl)))));(function(PI,Fr){Nt(Fr,!1);var MQ=L(Fr,"path",9),wF=L(Fr,"value",9),DF=L(Fr,"parser",9),xiA=L(Fr,"isSelected",9),_iA=L(Fr,"containsSearchResult",9),RiA=L(Fr,"containsActiveSearchResult",9),NiA=L(Fr,"onEdit",9);ni(!0);var yF,L3=G5A(),FiA=dA(L3);Se(SQ=>{yF=ii(L3,1,"jse-inline-value svelte-1jv89ui",null,yF,{"jse-selected":xiA(),"jse-highlight":_iA(),"jse-active":RiA()}),Lt(FiA,SQ)},[()=>(K(SC),K(DF()),K(wF()),K(50),wA(()=>{var SQ;return SC((SQ=DF().stringify(wF()))!==null&&SQ!==void 0?SQ:"",50)}))]),fe("dblclick",L3,()=>NiA()(MQ())),CA(PI,L3),Ft()})(Ra,{get path(){return c(Ln)},get value(){return c(xa)},get parser(){return b()},get isSelected(){return c(_a)},get containsSearchResult(){return c(bQ)},get containsActiveSearchResult(){return c(vQ)},onEdit:rt})},Hv=Ra=>{var Hl=it(()=>(K(m0),c(fA),c(ke),K(c(Ln)),wA(()=>{var Fr;return(Fr=m0(c(fA),c(ke),c(Ln)))===null||Fr===void 0?void 0:Fr.searchResults}))),vQ=it(()=>c(xa)!==void 0?c(xa):""),bQ=it(()=>(K(v0),c(fA),c(GA),K(c(Ln)),wA(()=>v0(c(fA),c(GA),c(Ln))))),PI=it(()=>c(_a)?c(OA):void 0);G$(Ra,{get path(){return c(Ln)},get value(){return c(vQ)},get enforceString(){return c(bQ)},get selection(){return c(PI)},get searchResultItems(){return c(Hl)},get context(){return c(Oe)}})};jA(Od,Ra=>{K(aa),K(c(xa)),wA(()=>aa(c(xa)))?Ra(yQ):Ra(Hv,!1)});var zv=_A(Od),Pv=Ra=>{var Hl=W5A();cI(dA(Hl),{selected:!0,onContextMenu:No}),CA(Ra,Hl)};jA(zv,Ra=>{K(I()),K(c(_a)),K(tr),c(OA),wA(()=>!I()&&c(_a)&&!tr(c(OA)))&&Ra(Pv)});var Rc=_A(DQ,2),zI=Ra=>{Rh(Ra,{get validationError(){return c(Jd)},get onExpand(){return Qg}})};jA(Rc,Ra=>{c(Jd)&&Ra(zI)}),Se(Ra=>{_n(HI,"data-path",Ra),ml=ii(DQ,1,"jse-value-outer svelte-1p86y3c",null,ml,{"jse-selected-value":c(_a)})},[()=>(K(eD),K(c(Ln)),wA(()=>eD(c(Ln))))]),CA(is,HI)});var _c=_A(bg),Mg=is=>{CA(is,X5A())};jA(_c,is=>{c(A)&&is(Mg)}),CA(yt,L0)});var $t,$o=dA(_A(Qo));Oo(Le,yt=>N(PA,yt),()=>c(PA)),ms(Le,(yt,Ii)=>q5?.(yt,Ii),()=>va),_r(()=>fe("scroll",Le,dt));var Zn=_A(Le,2),Aa=yt=>{var Ii=it(()=>(c(ee),wA(()=>"You pasted a JSON ".concat(Array.isArray(c(ee).contents)?"array":"object"," as text")))),la=it(()=>[{icon:CC,text:"Paste as JSON instead",title:"Paste the text as JSON instead of a single value",onMouseDown:yo},{text:"Leave as is",title:"Keep the pasted content as a single value",onClick:ya}]);Yl(yt,{type:"info",get message(){return c(Ii)},get actions(){return c(la)}})};jA(Zn,yt=>{c(ee)&&yt(Aa)});var mn=_A(Zn,2),Tt=yt=>{var Ii=it(()=>[{icon:CC,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:fn},{text:"Leave as is",title:"Keep the pasted array",onClick:_i}]);Yl(yt,{type:"info",message:"Multiline text was pasted as array",get actions(){return c(Ii)}})};jA(mn,yt=>{c(NA)&&yt(Tt)});var an=_A(mn,2),Ai=yt=>{var Ii=it(()=>I()?[]:[{icon:J8,text:"Ok",title:"Accept the repaired document",onClick:Qn},{icon:w4,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:Eo}]);Yl(yt,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return c(Ii)},onClose:G})};jA(an,yt=>{c(tt)&&yt(Ai)}),VR(_A(an,2),{get validationErrors(){return c(gn)},selectError:Ne}),Se(()=>{Vt=ii(Fn,1,"jse-table-invisible-start-section svelte-1p86y3c",null,Vt,{"jse-search-box-background":c(HA)}),_n($i,"colspan",(c(je),wA(()=>c(je).length))),Gi=mg($i,"",Gi,{height:(c(i),wA(()=>c(i).startHeight+"px"))}),_n($o,"colspan",(c(je),wA(()=>c(je).length))),$t=mg($o,"",$t,{height:(c(i),wA(()=>c(i).endHeight+"px"))})}),CA(Ee,Pe)},se=Ee=>{var Pe=Fi(),Re=et(Pe),Le=Yn=>{var eA=eDA(),yA=et(eA),WA=it(()=>I()?[]:[{icon:w4,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:Eo}]);Yl(yA,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return c(WA)}}),V$(_A(yA,2),{get text(){return c(XA)},get json(){return c(fA)},get indentation(){return P()},get parser(){return b()}}),CA(Yn,eA)},ai=Yn=>{H5A(Yn,{get text(){return c(XA)},get json(){return c(fA)},get readOnly(){return I()},get parser(){return b()},openJSONEditorModal:rt,extractPath:qt,get onChangeMode(){return tA()},onClick:()=>{G()}})};jA(Re,Yn=>{c(DA)&&c(XA)!==void 0&&c(XA)!==""?Yn(Le):Yn(ai,!1)},!0),CA(Ee,Pe)};jA(MA,Ee=>{c(pt)?Ee(oe):Ee(se,!1)}),fe("paste",cA,De),CA(_,q)},zo=_=>{CA(_,iDA())};jA(_t,_=>{C?_(zo,!1):_(sa)}),Oo(Xi,_=>N(pA,_),()=>c(pA));var D=_A(Xi,2),M=_=>{F$(_,{onClose:()=>N(j,!1)})};jA(D,_=>{c(j)&&_(M)});var R=_A(D,2),V=_=>{L$(_,DI(()=>c(_e),{onClose:()=>{var q;(q=c(_e))===null||q===void 0||q.onClose(),N(_e,void 0)}}))};return jA(R,_=>{c(_e)&&_(V)}),Se(()=>Oi=ii(Xi,1,"jse-table-mode svelte-1p86y3c",null,Oi,{"no-main-menu":!m()})),fe("mousedown",Xi,function(_){if(_.buttons===1||_.buttons===2){var q=_.target;q.isContentEditable||G();var nA=i$(q);if(nA){if(tr(c(OA))&&Uf(c(fA),c(OA),nA))return;N(OA,Hi(nA)),_.preventDefault()}}}),fe("keydown",Xi,function(_){var q=TC(_);if(o("keydown",{combo:q,key:_.key}),q==="Ctrl+X"&&(_.preventDefault(),Za(!0)),q==="Ctrl+Shift+X"&&(_.preventDefault(),Za(!1)),q==="Ctrl+C"&&(_.preventDefault(),Ta(!0)),q==="Ctrl+Shift+C"&&(_.preventDefault(),Ta(!1)),q==="Ctrl+D"&&(_.preventDefault(),Nn()),q!=="Delete"&&q!=="Backspace"||(_.preventDefault(),Ui()),q==="Insert"&&_.preventDefault(),q==="Ctrl+A"&&_.preventDefault(),q==="Ctrl+Q"&&Zo(_),q==="ArrowLeft"&&(_.preventDefault(),Ei(),c(OA))){var nA=(function(Pe,Re){var{rowIndex:Le,columnIndex:ai}=hg(It(Re),Pe);return ai>0?Hi(sd({rowIndex:Le,columnIndex:ai-1},Pe)):Re})(c(je),c(OA));N(OA,nA),Yo(It(nA))}if(q==="ArrowRight"&&(_.preventDefault(),Ei(),c(OA))){var cA=(function(Pe,Re){var{rowIndex:Le,columnIndex:ai}=hg(It(Re),Pe);return ai0?Hi(sd({rowIndex:Le-1,columnIndex:ai},Pe)):Re})(c(je),c(OA));N(OA,MA),Yo(It(MA))}if(q==="ArrowDown"&&(_.preventDefault(),Ei(),c(OA))){var oe=(function(Pe,Re,Le){var{rowIndex:ai,columnIndex:Yn}=hg(It(Le),Re);return aiN(zA,$)}).get()),pA=EA(s());function PA($){if(rZ($)){N(pA,$.undo.mode);var oA=c(zA).items(),sA=oA.findIndex(de=>de===$),TA=sA!==-1?oA[sA-1]:void 0;$A("handleUndo",{index:sA,item:$,items:oA,prevItem:TA}),TA&&i(TA.redo.selection),F()(c(pA))}}function Je($){if(rZ($)){N(pA,$.redo.mode);var oA=c(zA).items(),sA=oA.findIndex(de=>de===$),TA=sA!==-1?oA[sA+1]:void 0;$A("handleRedo",{index:sA,item:$,items:oA,nextItem:TA}),TA&&i(TA.undo.selection),F()(c(pA))}}var _e=EA(),YA={type:"separator"},fA=EA(),XA=EA();function DA($){if(c(rA))return c(rA).patch($);if(c(uA))return c(uA).patch($);if(c(UA))return c(UA).patch($);throw new Error('Method patch is not available in mode "'.concat(c(pA),'"'))}function ee($,oA){if(c(rA))return c(rA).expand($,oA);if(c(UA))return c(UA).expand($,oA);throw new Error('Method expand is not available in mode "'.concat(c(pA),'"'))}function NA($,oA){if(c(rA))return c(rA).collapse($,oA);if(c(UA))return c(UA).collapse($,oA);throw new Error('Method collapse is not available in mode "'.concat(c(pA),'"'))}function ke($){if(c(UA))c(UA).openTransformModal($);else if(c(rA))c(rA).openTransformModal($);else{if(!c(uA))throw new Error('Method transform is not available in mode "'.concat(c(pA),'"'));c(uA).openTransformModal($)}}function HA(){if(c(UA))return c(UA).validate();if(c(rA))return c(rA).validate();if(c(uA))return c(uA).validate();throw new Error('Method validate is not available in mode "'.concat(c(pA),'"'))}function vA(){return c(rA)?c(rA).acceptAutoRepair():A()}function Gt($){if(c(rA))return c(rA).scrollTo($);if(c(uA))return c(uA).scrollTo($);throw new Error('Method scrollTo is not available in mode "'.concat(c(pA),'"'))}function ft($){if(c(rA))return c(rA).findElement($);if(c(uA))return c(uA).findElement($);throw new Error('Method findElement is not available in mode "'.concat(c(pA),'"'))}function he(){c(UA)?c(UA).focus():c(rA)?c(rA).focus():c(uA)&&c(uA).focus()}function Ot(){return He.apply(this,arguments)}function He(){return(He=zt(function*(){c(UA)&&(yield c(UA).refresh())})).apply(this,arguments)}KA(()=>K(s()),()=>{(function($){if($!==c(pA)){var oA={type:"mode",undo:{mode:c(pA),selection:void 0},redo:{mode:$,selection:void 0}};c(pA)==="text"&&c(UA)&&c(UA).flush(),$A("add history item",oA),c(zA).add(oA),N(pA,$)}})(s())}),KA(()=>(c(pA),K(F())),()=>{N(_e,[{type:"button",text:"text",title:"Switch to text mode (current mode: ".concat(c(pA),")"),className:"jse-group-button jse-first"+(c(pA)===Da.text?" jse-selected":""),onClick:()=>F()(Da.text)},{type:"button",text:"tree",title:"Switch to tree mode (current mode: ".concat(c(pA),")"),className:"jse-group-button "+(c(pA)===Da.tree?" jse-selected":""),onClick:()=>F()(Da.tree)},{type:"button",text:"table",title:"Switch to table mode (current mode: ".concat(c(pA),")"),className:"jse-group-button jse-last"+(c(pA)===Da.table?" jse-selected":""),onClick:()=>F()(Da.table)}])}),KA(()=>(c(_e),K(tA()),c(pA),K(b()),K(n())),()=>{N(fA,$=>{var oA=nR($[0])?c(_e).concat($):c(_e).concat(YA,$),sA=h4(oA);return tA()(oA,{mode:c(pA),modal:b(),readOnly:n()})||sA})}),KA(()=>(K(W()),c(pA),K(b()),K(n()),K(i())),()=>{N(XA,$=>{var oA,sA=h4($);return(oA=W()($,{mode:c(pA),modal:b(),readOnly:n(),selection:i()}))!==null&&oA!==void 0?oA:!n()&&sA})}),Rn();var je={patch:DA,expand:ee,collapse:NA,transform:ke,validate:HA,acceptAutoRepair:vA,scrollTo:Gt,findElement:ft,focus:he,refresh:Ot};ni();var pt=Fi(),xe=et(pt),oi=$=>{Oo(L5A($,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return c(zA)},get readOnly(){return n()},get indentation(){return o()},get tabSize(){return a()},get mainMenuBar(){return l()},get statusBar(){return C()},get askToFormat(){return I()},get escapeUnicodeCharacters(){return h()},get parser(){return f()},get validator(){return v()},get validationParser(){return k()},get onChange(){return x()},get onChangeMode(){return F()},get onSelect(){return z()},onUndo:PA,onRedo:Je,get onError(){return BA()},get onFocus(){return X()},get onBlur(){return iA()},get onRenderMenu(){return c(fA)},get onSortModal(){return AA()},get onTransformModal(){return IA()},$$legacy:!0}),oA=>N(UA,oA),()=>c(UA))},j=$=>{var oA=Fi(),sA=et(oA),TA=Qe=>{Oo(oDA(Qe,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return c(zA)},get readOnly(){return n()},get truncateTextSize(){return r()},get mainMenuBar(){return l()},get escapeControlCharacters(){return d()},get escapeUnicodeCharacters(){return h()},get flattenColumns(){return E()},get parser(){return f()},get parseMemoizeOne(){return m()},get validator(){return v()},get validationParser(){return k()},get indentation(){return o()},get onChange(){return x()},get onChangeMode(){return F()},get onSelect(){return z()},onUndo:PA,onRedo:Je,get onRenderValue(){return P()},get onFocus(){return X()},get onBlur(){return iA()},get onRenderMenu(){return c(fA)},get onRenderContextMenu(){return c(XA)},get onSortModal(){return AA()},get onTransformModal(){return IA()},get onJSONEditorModal(){return aA()},$$legacy:!0}),GA=>N(uA,GA),()=>c(uA))},de=Qe=>{Oo(pR(Qe,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return c(zA)},get readOnly(){return n()},get indentation(){return o()},get truncateTextSize(){return r()},get mainMenuBar(){return l()},get navigationBar(){return g()},get escapeControlCharacters(){return d()},get escapeUnicodeCharacters(){return h()},get parser(){return f()},get parseMemoizeOne(){return m()},get validator(){return v()},get validationParser(){return k()},get pathParser(){return S()},get onError(){return BA()},get onChange(){return x()},get onChangeMode(){return F()},get onSelect(){return z()},onUndo:PA,onRedo:Je,get onRenderValue(){return P()},get onClassName(){return Z()},get onFocus(){return X()},get onBlur(){return iA()},get onRenderMenu(){return c(fA)},get onRenderContextMenu(){return c(XA)},get onSortModal(){return AA()},get onTransformModal(){return IA()},get onJSONEditorModal(){return aA()},$$legacy:!0}),GA=>N(rA,GA),()=>c(rA))};jA(sA,Qe=>{c(pA),K(Da),wA(()=>c(pA)===Da.table)?Qe(TA):Qe(de,!1)},!0),CA($,oA)};return jA(xe,$=>{c(pA),K(Da),wA(()=>c(pA)===Da.text||String(c(pA))==="code")?$(oi):$(j,!1)}),CA(t,pt),jt(e,"patch",DA),jt(e,"expand",ee),jt(e,"collapse",NA),jt(e,"transform",ke),jt(e,"validate",HA),jt(e,"acceptAutoRepair",vA),jt(e,"scrollTo",Gt),jt(e,"findElement",ft),jt(e,"focus",he),jt(e,"refresh",Ot),Ft(je)}Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-modal-wrapper.svelte-t4zsk3 { - flex: 1; - display: flex; - min-width: 0; - min-height: 0; - flex-direction: column; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) { - flex: 1; - display: flex; - flex-direction: column; - padding: 20px; - overflow: auto; - min-width: 0; - min-height: 0; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-top: var(--jse-padding, 10px); -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-label:where(.svelte-t4zsk3) { - font-weight: bold; - display: block; - box-sizing: border-box; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-label:where(.svelte-t4zsk3) .jse-label-inner:where(.svelte-t4zsk3) { - margin-top: calc(2 * var(--jse-padding, 10px)); - margin-bottom: calc(0.5 * var(--jse-padding, 10px)); - box-sizing: border-box; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-modal-inline-editor:where(.svelte-t4zsk3) { - flex: 1; - min-height: 150px; - min-width: 0; - max-width: 100%; - display: flex; - --jse-theme-color: var(--jse-modal-editor-theme-color, #707070); - --jse-theme-color-highlight: var(--jse-modal-editor-theme-color-highlight, #646464); -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) { - gap: var(--jse-padding, 10px); - align-items: center; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) .jse-error:where(.svelte-t4zsk3) { - flex: 1; - color: var(--jse-error-color, #ee5341); -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-secondary-background, #d3d3d3); - color: var(--jse-button-secondary-color, var(--jse-text-color, #4d4d4d)); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3):hover { - background: var(--jse-button-secondary-background-highlight, #e1e1e1); -} -.jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3):disabled { - background: var(--jse-button-secondary-background-disabled, #9d9d9d); -} -.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3) { - border: var(--jse-input-border, 1px solid #d8dbdf); - outline: none; - box-sizing: border-box; - padding: calc(0.5 * var(--jse-padding, 10px)); - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: inherit; - background: var(--jse-input-background, var(--jse-background-color, #fff)); -} -.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3):focus { - border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); -} -.jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3):read-only { - background: var(--jse-input-background-readonly, transparent); -}`);var aDA=JA('
            '),rDA=JA(''),sDA=JA(''),lDA=JA(''),gDA=JA('
            Path
            Contents
            ',1),cDA=JA('
            '),CDA={};Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-modal-contents.svelte-lwzlls { - flex: 1; - display: flex; - flex-direction: column; - padding: 20px; - overflow: auto; - min-width: 0; - min-height: 0; -} -.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-top: var(--jse-padding, 10px); -} -.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} -.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) { - width: 100%; - border-collapse: collapse; - border-spacing: 0; -} -.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) th:where(.svelte-lwzlls), -.jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) td:where(.svelte-lwzlls) { - text-align: left; - vertical-align: middle; - font-weight: normal; - padding-bottom: var(--jse-padding, 10px); -} -.jse-modal-contents.svelte-lwzlls input.jse-path:where(.svelte-lwzlls) { - width: 100%; - box-sizing: border-box; - padding: 5px 10px; - border: var(--jse-input-border, 1px solid #d8dbdf); - border-radius: var(--jse-input-radius, 3px); - font-family: inherit; - font-size: inherit; - background: inherit; - background: var(--jse-input-background-readonly, transparent); - color: inherit; - outline: none; -} -.jse-modal-contents.svelte-lwzlls .svelte-select input { - box-sizing: border-box; -} -.jse-modal-contents.svelte-lwzlls .jse-space:where(.svelte-lwzlls) { - height: 200px; -} -.jse-modal-contents.svelte-lwzlls .jse-space:where(.svelte-lwzlls) .jse-error:where(.svelte-lwzlls) { - color: var(--jse-error-color, #ee5341); -}`);var Qh=kD(()=>CDA),IDA=JA('Property'),dDA=JA('
            '),BDA=JA('
            Path
            Direction
            ',1);Zt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-main.svelte-1l55585 { - width: 100%; - height: 100%; - min-width: 0; - min-height: 150px; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - line-height: normal; - position: relative; - display: flex; - flex-direction: row; -} -.jse-main.svelte-1l55585:not(.jse-focus) { - --jse-selection-background-color: var(--jse-selection-background-inactive-color, #e8e8e8); - --jse-context-menu-pointer-background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); -}`);var EDA=JA('
            ',1);function hDA(t,e){Nt(e,!1);var A=EA(void 0,!0),i=or("jsoneditor:JSONEditor"),n={text:""},o=void 0,a=!1,r=Da.tree,s=!0,l=!0,g=!0,C=!0,I=!1,d=!1,h=!0,E=JSON,f=void 0,m=JSON,v={parse:f6A,stringify:Bl},k=[JmA],S=k[0].id,b=Qg,x=void 0,F=void 0,z=u6A,P=Qg,Z=Qg,tA=Qg,W=Qg,BA=ge=>{console.error(ge),alert(ge.toString())},X=Qg,iA=Qg,AA=L(e,"content",13,n),IA=L(e,"selection",13,o),aA=L(e,"readOnly",13,a),rA=L(e,"indentation",13,2),uA=L(e,"tabSize",13,4),UA=L(e,"truncateTextSize",13,1e3),$A=L(e,"mode",13,r),zA=L(e,"mainMenuBar",13,s),pA=L(e,"navigationBar",13,l),PA=L(e,"statusBar",13,g),Je=L(e,"askToFormat",13,C),_e=L(e,"escapeControlCharacters",13,I),YA=L(e,"escapeUnicodeCharacters",13,d),fA=L(e,"flattenColumns",13,h),XA=L(e,"parser",13,E),DA=L(e,"validator",13,f),ee=L(e,"validationParser",13,m),NA=L(e,"pathParser",13,v),ke=L(e,"queryLanguages",13,k),HA=L(e,"queryLanguageId",13,S),vA=L(e,"onChangeQueryLanguage",13,b),Gt=L(e,"onChange",13,x),ft=L(e,"onSelect",13,F),he=L(e,"onRenderValue",13,z),Ot=L(e,"onClassName",13,P),He=L(e,"onRenderMenu",13,Z),je=L(e,"onRenderContextMenu",13,tA),pt=L(e,"onChangeMode",13,W),xe=L(e,"onError",13,BA),oi=L(e,"onFocus",13,X),j=L(e,"onBlur",13,iA),$=EA(wh(),!0),oA=EA(!1,!0),sA=EA(void 0,!0),TA=EA(void 0,!0),de=EA(void 0,!0),Qe=EA(void 0,!0),GA=EA(XA(),!0);function OA(){return AA()}function ht(ge){i("set");var mi=v_(ge);if(mi)throw new Error(mi);N($,wh()),AA(ge),Ro()}function tt(ge){i("update");var mi=v_(ge);if(mi)throw new Error(mi);AA(ge),Ro()}function ze(ge){var mi=c(sA).patch(ge);return Ro(),mi}function Oe(ge){IA(ge),Ro()}function Ci(ge,mi){c(sA).expand(ge,mi),Ro()}function gn(ge){var mi=arguments.length>1&&arguments[1]!==void 0&&arguments[1];c(sA).collapse(ge,mi),Ro()}function hn(){var ge=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};c(sA).transform(ge),Ro()}function Ke(){return c(sA).validate()}function nn(){var ge=c(sA).acceptAutoRepair();return Ro(),ge}function Si(ge){return Li.apply(this,arguments)}function Li(){return(Li=zt(function*(ge){yield c(sA).scrollTo(ge)})).apply(this,arguments)}function Zi(ge){return c(sA).findElement(ge)}function bt(){c(sA).focus(),Ro()}function on(){return Kt.apply(this,arguments)}function Kt(){return(Kt=zt(function*(){yield c(sA).refresh()})).apply(this,arguments)}function G(ge){var mi,cn,fn,Ho,ya,_i,Eo,Za,vo,Ta,Jn,Ui,qt,Nn,ho,Fo,xA,Ae,De,mA,FA,le,Ne,nt,rt,xt,On,Ti,zi,Xt,Ji,va=Object.keys(ge);for(var Ut of va)switch(Ut){case"content":AA((mi=ge[Ut])!==null&&mi!==void 0?mi:n);break;case"selection":IA((cn=ge[Ut])!==null&&cn!==void 0?cn:o);break;case"readOnly":aA((fn=ge[Ut])!==null&&fn!==void 0?fn:a);break;case"indentation":rA((Ho=ge[Ut])!==null&&Ho!==void 0?Ho:2);break;case"tabSize":uA((ya=ge[Ut])!==null&&ya!==void 0?ya:4);break;case"truncateTextSize":UA((_i=ge[Ut])!==null&&_i!==void 0?_i:1e3);break;case"mode":$A((Eo=ge[Ut])!==null&&Eo!==void 0?Eo:r);break;case"mainMenuBar":zA((Za=ge[Ut])!==null&&Za!==void 0?Za:s);break;case"navigationBar":pA((vo=ge[Ut])!==null&&vo!==void 0?vo:l);break;case"statusBar":PA((Ta=ge[Ut])!==null&&Ta!==void 0?Ta:g);break;case"askToFormat":Je((Jn=ge[Ut])!==null&&Jn!==void 0?Jn:C);break;case"escapeControlCharacters":_e((Ui=ge[Ut])!==null&&Ui!==void 0?Ui:I);break;case"escapeUnicodeCharacters":YA((qt=ge[Ut])!==null&&qt!==void 0?qt:d);break;case"flattenColumns":fA((Nn=ge[Ut])!==null&&Nn!==void 0?Nn:h);break;case"parser":XA((ho=ge[Ut])!==null&&ho!==void 0?ho:E);break;case"validator":DA((Fo=ge[Ut])!==null&&Fo!==void 0?Fo:f);break;case"validationParser":ee((xA=ge[Ut])!==null&&xA!==void 0?xA:m);break;case"pathParser":NA((Ae=ge[Ut])!==null&&Ae!==void 0?Ae:v);break;case"queryLanguages":ke((De=ge[Ut])!==null&&De!==void 0?De:k);break;case"queryLanguageId":HA((mA=ge[Ut])!==null&&mA!==void 0?mA:S);break;case"onChangeQueryLanguage":vA((FA=ge[Ut])!==null&&FA!==void 0?FA:b);break;case"onChange":Gt((le=ge[Ut])!==null&&le!==void 0?le:x);break;case"onRenderValue":he((Ne=ge[Ut])!==null&&Ne!==void 0?Ne:z);break;case"onClassName":Ot((nt=ge[Ut])!==null&&nt!==void 0?nt:P);break;case"onRenderMenu":He((rt=ge[Ut])!==null&&rt!==void 0?rt:Z);break;case"onRenderContextMenu":je((xt=ge[Ut])!==null&&xt!==void 0?xt:tA);break;case"onChangeMode":pt((On=ge[Ut])!==null&&On!==void 0?On:W);break;case"onSelect":ft((Ti=ge[Ut])!==null&&Ti!==void 0?Ti:F);break;case"onError":xe((zi=ge[Ut])!==null&&zi!==void 0?zi:BA);break;case"onFocus":oi((Xt=ge[Ut])!==null&&Xt!==void 0?Xt:X);break;case"onBlur":j((Ji=ge[Ut])!==null&&Ji!==void 0?Ji:iA);break;default:st(Ut)}function st(Oi){i('Unknown property "'.concat(Oi,'"'))}ke().some(Oi=>Oi.id===HA())||HA(ke()[0].id),Ro()}function dt(){return Ei.apply(this,arguments)}function Ei(){return(Ei=zt(function*(){throw new Error("class method destroy() is deprecated. It is replaced with a method destroy() in the vanilla library.")})).apply(this,arguments)}function Qn(ge,mi,cn){AA(ge),Gt()&&Gt()(ge,mi,cn)}function un(ge){IA(ge),ft()&&ft()(h4(ge))}function Vn(){N(oA,!0),oi()&&oi()()}function Yo(){N(oA,!1),j()&&j()()}function Bo(ge){return No.apply(this,arguments)}function No(){return(No=zt(function*(ge){$A()!==ge&&($A(ge),Ro(),bt(),pt()(ge))})).apply(this,arguments)}function Zo(ge){i("handleChangeQueryLanguage",ge),HA(ge),vA()(ge)}function Do(ge){var{id:mi,json:cn,rootPath:fn,onTransform:Ho,onClose:ya}=ge;aA()||N(Qe,{id:mi,json:cn,rootPath:fn,indentation:rA(),truncateTextSize:UA(),escapeControlCharacters:_e(),escapeUnicodeCharacters:YA(),parser:XA(),parseMemoizeOne:c(A),validationParser:ee(),pathParser:NA(),queryLanguages:ke(),queryLanguageId:HA(),onChangeQueryLanguage:Zo,onRenderValue:he(),onRenderMenu:_i=>He()(_i,{mode:$A(),modal:!0,readOnly:aA()}),onRenderContextMenu:_i=>je()(_i,{mode:$A(),modal:!0,readOnly:aA(),selection:IA()}),onClassName:Ot(),onTransform:Ho,onClose:ya})}function Ba(ge){aA()||N(de,ge)}function Xo(ge){var{content:mi,path:cn,onPatch:fn,onClose:Ho}=ge;i("onJSONEditorModal",{content:mi,path:cn}),N(TA,{content:mi,path:cn,onPatch:fn,readOnly:aA(),indentation:rA(),tabSize:uA(),truncateTextSize:UA(),mainMenuBar:zA(),navigationBar:pA(),statusBar:PA(),askToFormat:Je(),escapeControlCharacters:_e(),escapeUnicodeCharacters:YA(),flattenColumns:fA(),parser:XA(),validator:void 0,validationParser:ee(),pathParser:NA(),onRenderValue:he(),onClassName:Ot(),onRenderMenu:He(),onRenderContextMenu:je(),onSortModal:Ba,onTransformModal:Do,onClose:Ho})}function ra(ge){ge.stopPropagation()}KA(()=>(K(XA()),c(GA),K(AA()),wh),()=>{if(!VX(XA(),c(GA))){if(i("parser changed, recreate editor"),Nf(AA())){var ge=c(GA).stringify(AA().json);AA({json:ge!==void 0?XA().parse(ge):void 0})}N(GA,XA()),N($,wh())}}),KA(()=>K(AA()),()=>{var ge=v_(AA());ge&&console.error("Error: "+ge)}),KA(()=>K(IA()),()=>{IA()===null&&console.warn("selection is invalid: it is null but should be undefined")}),KA(()=>K(XA()),()=>{N(A,xE(XA().parse))}),KA(()=>K($A()),()=>{i("mode changed to",$A())}),Rn();var yo={get:OA,set:ht,update:tt,patch:ze,select:Oe,expand:Ci,collapse:gn,transform:hn,validate:Ke,acceptAutoRepair:nn,scrollTo:Si,findElement:Zi,focus:bt,refresh:on,updateProps:G,destroy:dt};return ni(!0),tR(t,{children:(ge,mi)=>{var cn,fn=EDA(),Ho=et(fn);GX(dA(Ho),()=>c($),Jn=>{Oo(UZ(Jn,{get externalMode(){return $A()},get content(){return AA()},get selection(){return IA()},get readOnly(){return aA()},get indentation(){return rA()},get tabSize(){return uA()},get truncateTextSize(){return UA()},get statusBar(){return PA()},get askToFormat(){return Je()},get mainMenuBar(){return zA()},get navigationBar(){return pA()},get escapeControlCharacters(){return _e()},get escapeUnicodeCharacters(){return YA()},get flattenColumns(){return fA()},get parser(){return XA()},get parseMemoizeOne(){return c(A)},get validator(){return DA()},get validationParser(){return ee()},get pathParser(){return NA()},insideModal:!1,get onError(){return xe()},onChange:Qn,onChangeMode:Bo,onSelect:un,get onRenderValue(){return he()},get onClassName(){return Ot()},onFocus:Vn,onBlur:Yo,get onRenderMenu(){return He()},get onRenderContextMenu(){return je()},onSortModal:Ba,onTransformModal:Do,onJSONEditorModal:Xo,$$legacy:!0}),Ui=>N(sA,Ui),()=>c(sA))});var ya=_A(Ho,2),_i=Jn=>{(function(Ui,qt){var Nn,ho;Nt(qt,!1);var Fo=EA(void 0,!0),xA=EA(void 0,!0),Ae=EA(void 0,!0),De=EA(void 0,!0),mA=or("jsoneditor:SortModal"),FA=L(qt,"id",9),le=L(qt,"json",9),Ne=L(qt,"rootPath",9),nt=L(qt,"onSort",9),rt=L(qt,"onClose",9),xt={value:1,label:"ascending"},On=[xt,{value:-1,label:"descending"}],Ti="".concat(FA(),":").concat(vt(Ne())),zi=EA((Nn=Qh()[Ti])===null||Nn===void 0?void 0:Nn.selectedProperty,!0),Xt=EA(((ho=Qh()[Ti])===null||ho===void 0?void 0:ho.selectedDirection)||xt,!0),Ji=EA(void 0,!0);function va(){try{var st,Oi,Xi;N(Ji,void 0);var Wn=((st=c(zi))===null||st===void 0?void 0:st.value)||((Oi=c(De))===null||Oi===void 0||(Oi=Oi[0])===null||Oi===void 0?void 0:Oi.value)||[],pn=(Xi=c(Xt))===null||Xi===void 0?void 0:Xi.value,_t=T$(le(),Ne(),Wn,pn);nt()!==void 0&&Ne()!==void 0&&nt()({operations:_t,rootPath:Ne(),itemPath:Wn,direction:pn}),rt()()}catch(sa){N(Ji,String(sa))}}function Ut(st){st.focus()}KA(()=>(K(le()),K(Ne())),()=>{N(Fo,Xe(le(),Ne()))}),KA(()=>c(Fo),()=>{N(xA,Array.isArray(c(Fo)))}),KA(()=>(c(xA),c(Fo)),()=>{N(Ae,c(xA)?AR(c(Fo)):void 0)}),KA(()=>(c(Ae),BI),()=>{N(De,c(Ae)?c(Ae).map(BI):void 0)}),KA(()=>(Qh(),c(zi),c(Xt)),()=>{Qh(Qh()[Ti]={selectedProperty:c(zi),selectedDirection:c(Xt)}),mA("store state in memory",Ti,Qh()[Ti])}),Rn(),ni(!0),Of(Ui,{get onClose(){return rt()},className:"jse-sort-modal",children:(st,Oi)=>{var Xi=BDA(),Wn=et(Xi),pn=it(()=>c(xA)?"Sort array items":"Sort object keys");wD(Wn,{get title(){return c(pn)},get onClose(){return rt()}});var _t=dA(_A(Wn,2)),sa=_A(dA(_t)),zo=dA(sa),D=_A(dA(zo)),M=dA(D),R=_A(zo),V=se=>{var Ee=IDA(),Pe=_A(dA(Ee));Cd(dA(Pe),{showChevron:!0,get items(){return c(De)},get value(){return c(zi)},set value(Re){N(zi,Re)},$$legacy:!0}),CA(se,Ee)};jA(R,se=>{c(xA),c(De),wA(()=>{var Ee;return c(xA)&&c(De)&&((Ee=c(De))===null||Ee===void 0?void 0:Ee.length)>1})&&se(V)});var _=_A(R),q=_A(dA(_));Cd(dA(q),{showChevron:!0,clearable:!1,get items(){return On},get value(){return c(Xt)},set value(se){N(Xt,se)},$$legacy:!0});var nA=_A(_t,2),cA=dA(nA),MA=se=>{var Ee=dDA(),Pe=dA(Ee);Se(()=>Lt(Pe,c(Ji))),CA(se,Ee)};jA(cA,se=>{c(Ji)&&se(MA)});var oe=dA(_A(nA,2));_r(()=>fe("click",oe,va)),ms(oe,se=>Ut?.(se)),Se(se=>{Dd(M,se),oe.disabled=(c(xA),c(De),c(zi),wA(()=>{var Ee;return!!(c(xA)&&c(De)&&((Ee=c(De))===null||Ee===void 0?void 0:Ee.length)>1)&&!c(zi)}))},[()=>(K(Ne()),K(en),K(Bl),wA(()=>Ne()&&!en(Ne())?Bl(Ne()):"(document root)"))]),CA(st,Xi)},$$slots:{default:!0}}),Ft()})(Jn,DI(()=>c(de),{onClose:()=>{var Ui;(Ui=c(de))===null||Ui===void 0||Ui.onClose(),N(de,void 0)}}))};jA(ya,Jn=>{c(de)&&Jn(_i)});var Eo=_A(ya,2),Za=Jn=>{f5A(Jn,DI(()=>c(Qe),{onClose:()=>{var Ui;(Ui=c(Qe))===null||Ui===void 0||Ui.onClose(),N(Qe,void 0)}}))};jA(Eo,Jn=>{c(Qe)&&Jn(Za)});var vo=_A(Eo,2),Ta=Jn=>{(function(Ui,qt){Nt(qt,!1);var Nn=EA(void 0,!0),ho=EA(void 0,!0),Fo=EA(void 0,!0),xA=EA(void 0,!0),Ae=or("jsoneditor:JSONEditorModal"),De=L(qt,"content",9),mA=L(qt,"path",9),FA=L(qt,"onPatch",9),le=L(qt,"readOnly",9),Ne=L(qt,"indentation",9),nt=L(qt,"tabSize",9),rt=L(qt,"truncateTextSize",9),xt=L(qt,"mainMenuBar",9),On=L(qt,"navigationBar",9),Ti=L(qt,"statusBar",9),zi=L(qt,"askToFormat",9),Xt=L(qt,"escapeControlCharacters",9),Ji=L(qt,"escapeUnicodeCharacters",9),va=L(qt,"flattenColumns",9),Ut=L(qt,"parser",9),st=L(qt,"validator",9),Oi=L(qt,"validationParser",9),Xi=L(qt,"pathParser",9),Wn=L(qt,"onRenderValue",9),pn=L(qt,"onClassName",9),_t=L(qt,"onRenderMenu",9),sa=L(qt,"onRenderContextMenu",9),zo=L(qt,"onSortModal",9),D=L(qt,"onTransformModal",9),M=L(qt,"onClose",9),R=EA(void 0,!0),V=EA(void 0,!0),_={mode:cA(De()),content:De(),selection:void 0,relativePath:mA()},q=EA([_],!0),nA=EA(void 0,!0);function cA(yA){return Nf(yA)&&Vo(yA.json)?Da.table:Da.tree}function MA(){var yA,WA=(yA=ki(c(q)))===null||yA===void 0?void 0:yA.selection;Kf(WA)&&c(R).scrollTo(It(WA))}function oe(){if(Ae("handleApply"),!le())try{N(nA,void 0);var yA=c(Nn).relativePath,WA=c(Nn).content,Ge=[{op:"replace",path:vt(yA),value:WW(WA,Ut()).json}];if(c(q).length>1){var ye=WW(c(q)[c(q).length-2].content,Ut()).json,be={json:tl(ye,Ge)},ot=Me(Me({},c(q)[c(q).length-2]||_),{},{content:be});N(q,[...c(q).slice(0,c(q).length-2),ot]),Ro(),MA()}else FA()(Ge),M()()}catch(Vt){N(nA,String(Vt))}}function se(){if(Ae("handleClose"),c(V))N(V,!1);else if(c(q).length>1){var yA;N(q,Yi(c(q))),Ro(),(yA=c(R))===null||yA===void 0||yA.focus(),MA(),N(nA,void 0)}else M()()}function Ee(yA){Ae("handleChange",yA),Le(WA=>Me(Me({},WA),{},{content:yA}))}function Pe(yA){Ae("handleChangeSelection",yA),Le(WA=>Me(Me({},WA),{},{selection:yA}))}function Re(yA){Ae("handleChangeMode",yA),Le(WA=>Me(Me({},WA),{},{mode:yA}))}function Le(yA){var WA=yA(ki(c(q)));N(q,[...Yi(c(q)),WA])}function ai(yA){N(nA,yA.toString()),console.error(yA)}function Yn(yA){var WA,{content:Ge,path:ye}=yA;Ae("handleJSONEditorModal",{content:Ge,path:ye});var be={mode:cA(Ge),content:Ge,selection:void 0,relativePath:ye};N(q,[...c(q),be]),Ro(),(WA=c(R))===null||WA===void 0||WA.focus()}function eA(yA){yA.focus()}As(()=>{var yA;(yA=c(R))===null||yA===void 0||yA.focus()}),KA(()=>c(q),()=>{N(Nn,ki(c(q))||_)}),KA(()=>c(q),()=>{N(ho,c(q).flatMap(yA=>yA.relativePath))}),KA(()=>(c(ho),Bl),()=>{N(Fo,en(c(ho))?"(document root)":Bl(c(ho)))}),KA(()=>K(Ut()),()=>{N(xA,xE(Ut().parse))}),Rn(),ni(!0),Of(Ui,{onClose:se,className:"jse-jsoneditor-modal",get fullscreen(){return c(V)},children:(yA,WA)=>{var Ge=cDA();tR(dA(Ge),{children:(ye,be)=>{var ot=gDA(),Vt=et(ot),Gi=it(()=>(c(q),wA(()=>c(q).length>1?" (".concat(c(q).length,")"):"")));wD(Vt,{get title(){var Ai;return"Edit nested content ".concat((Ai=c(Gi))!==null&&Ai!==void 0?Ai:"")},fullScreenButton:!0,onClose:se,get fullscreen(){return c(V)},set fullscreen(Ai){N(V,Ai)},$$legacy:!0});var Fn=_A(Vt,2),$i=_A(dA(Fn),2),Qo=_A($i,4);Oo(UZ(dA(Qo),{get externalMode(){return c(Nn),wA(()=>c(Nn).mode)},get content(){return c(Nn),wA(()=>c(Nn).content)},get selection(){return c(Nn),wA(()=>c(Nn).selection)},get readOnly(){return le()},get indentation(){return Ne()},get tabSize(){return nt()},get truncateTextSize(){return rt()},get statusBar(){return Ti()},get askToFormat(){return zi()},get mainMenuBar(){return xt()},get navigationBar(){return On()},get escapeControlCharacters(){return Xt()},get escapeUnicodeCharacters(){return Ji()},get flattenColumns(){return va()},get parser(){return Ut()},get parseMemoizeOne(){return c(xA)},get validator(){return st()},get validationParser(){return Oi()},get pathParser(){return Xi()},insideModal:!0,onError:ai,onChange:Ee,onChangeMode:Re,onSelect:Pe,get onRenderValue(){return Wn()},get onClassName(){return pn()},get onFocus(){return Qg},get onBlur(){return Qg},get onRenderMenu(){return _t()},get onRenderContextMenu(){return sa()},get onSortModal(){return zo()},get onTransformModal(){return D()},onJSONEditorModal:Yn,$$legacy:!0}),Ai=>N(R,Ai),()=>c(R));var $t=dA(_A(Qo,2)),$o=Ai=>{var yt=aDA(),Ii=dA(yt);Se(()=>Lt(Ii,c(nA))),CA(Ai,yt)};jA($t,Ai=>{c(nA)&&Ai($o)});var Zn=_A($t,2),Aa=Ai=>{var yt=rDA();tn(dA(yt),{get data(){return uz}}),fe("click",yt,se),CA(Ai,yt)};jA(Zn,Ai=>{c(q),wA(()=>c(q).length>1)&&Ai(Aa)});var mn=_A(Zn,2),Tt=Ai=>{var yt=sDA();_r(()=>fe("click",yt,oe)),ms(yt,Ii=>eA?.(Ii)),CA(Ai,yt)},an=Ai=>{var yt=lDA();fe("click",yt,se),CA(Ai,yt)};jA(mn,Ai=>{le()?Ai(an,!1):Ai(Tt)}),Se(()=>Dd($i,c(Fo))),CA(ye,ot)},$$slots:{default:!0}}),CA(yA,Ge)},$$slots:{default:!0}}),Ft()})(Jn,DI(()=>c(TA),{onClose:()=>{var Ui;(Ui=c(TA))===null||Ui===void 0||Ui.onClose(),N(TA,void 0)}}))};jA(vo,Jn=>{c(TA)&&Jn(Ta)}),Se(()=>cn=ii(Ho,1,"jse-main svelte-1l55585",null,cn,{"jse-focus":c(oA)})),fe("keydown",Ho,ra),CA(ge,fn)},$$slots:{default:!0}}),jt(e,"get",OA),jt(e,"set",ht),jt(e,"update",tt),jt(e,"patch",ze),jt(e,"select",Oe),jt(e,"expand",Ci),jt(e,"collapse",gn),jt(e,"transform",hn),jt(e,"validate",Ke),jt(e,"acceptAutoRepair",nn),jt(e,"scrollTo",Si),jt(e,"findElement",Zi),jt(e,"focus",bt),jt(e,"refresh",on),jt(e,"updateProps",G),jt(e,"destroy",dt),Ft(yo)}function $$(t){var{target:e,props:A}=t,i=omA(hDA,{target:e,props:A});return i.destroy=zt(function*(){return(function(n,o){var a=Z_.get(n);return a?(Z_.delete(n),a(o)):Promise.resolve()})(i)}),Ro(),i}var yc=class t{constructor(e){this.el=e}jsonString;editor=null;ngAfterViewInit(){let e={text:this.jsonString};setTimeout(()=>{this.editor=$$({target:document.getElementById("json-editor"),props:{content:e,mode:Da.text,mainMenuBar:!1,statusBar:!1}})})}getJsonString(){return this.editor?.get().text}static \u0275fac=function(A){return new(A||t)(ct(ce))};static \u0275cmp=SA({type:t,selectors:[["app-json-editor"]],inputs:{jsonString:"jsonString"},decls:1,vars:0,consts:[["id","json-editor",1,"json-editor-container","jse-theme-dark"]],template:function(A,i){A&1&&Kn(0,"div",0)},styles:[".jse-theme-dark[_ngcontent-%COMP%]{--jse-theme: dark;--jse-theme-color: #2f6dd0;--jse-theme-color-highlight: #467cd2;--jse-background-color: #1e1e1e;--jse-text-color: #d4d4d4;--jse-text-color-inverse: #4d4d4d;--jse-main-border: 1px solid #4f4f4f;--jse-menu-color: #fff;--jse-modal-background: #2f2f2f;--jse-modal-overlay-background: rgba(0, 0, 0, .5);--jse-modal-code-background: #2f2f2f;--jse-tooltip-color: var(--jse-text-color);--jse-tooltip-background: #4b4b4b;--jse-tooltip-border: 1px solid #737373;--jse-tooltip-action-button-color: inherit;--jse-tooltip-action-button-background: #737373;--jse-panel-background: #333333;--jse-panel-background-border: 1px solid #464646;--jse-panel-color: var(--jse-text-color);--jse-panel-color-readonly: #737373;--jse-panel-border: 1px solid #3c3c3c;--jse-panel-button-color-highlight: #e5e5e5;--jse-panel-button-background-highlight: #464646;--jse-navigation-bar-background: #656565;--jse-navigation-bar-background-highlight: #7e7e7e;--jse-navigation-bar-dropdown-color: var(--jse-text-color);--jse-context-menu-background: #4b4b4b;--jse-context-menu-background-highlight: #595959;--jse-context-menu-separator-color: #595959;--jse-context-menu-color: var(--jse-text-color);--jse-context-menu-pointer-background: #737373;--jse-context-menu-pointer-background-highlight: #818181;--jse-context-menu-pointer-color: var(--jse-context-menu-color);--jse-key-color: #9cdcfe;--jse-value-color: var(--jse-text-color);--jse-value-color-number: #b5cea8;--jse-value-color-boolean: #569cd6;--jse-value-color-null: #569cd6;--jse-value-color-string: #ce9178;--jse-value-color-url: #ce9178;--jse-delimiter-color: #949494;--jse-edit-outline: 2px solid var(--jse-text-color);--jse-selection-background-color: #464646;--jse-selection-background-inactive-color: #333333;--jse-hover-background-color: #343434;--jse-active-line-background-color: rgba(255, 255, 255, .06);--jse-search-match-background-color: #343434;--jse-collapsed-items-background-color: #333333;--jse-collapsed-items-selected-background-color: #565656;--jse-collapsed-items-link-color: #b2b2b2;--jse-collapsed-items-link-color-highlight: #ec8477;--jse-search-match-color: #724c27;--jse-search-match-outline: 1px solid #966535;--jse-search-match-active-color: #9f6c39;--jse-search-match-active-outline: 1px solid #bb7f43;--jse-tag-background: #444444;--jse-tag-color: #bdbdbd;--jse-table-header-background: #333333;--jse-table-header-background-highlight: #424242;--jse-table-row-odd-background: rgba(255, 255, 255, .1);--jse-input-background: #3d3d3d;--jse-input-border: var(--jse-main-border);--jse-button-background: #808080;--jse-button-background-highlight: #7a7a7a;--jse-button-color: #e0e0e0;--jse-button-secondary-background: #494949;--jse-button-secondary-background-highlight: #5d5d5d;--jse-button-secondary-background-disabled: #9d9d9d;--jse-button-secondary-color: var(--jse-text-color);--jse-a-color: #55abff;--jse-a-color-highlight: #4387c9;--jse-svelte-select-background: #3d3d3d;--jse-svelte-select-border: 1px solid #4f4f4f;--list-background: #3d3d3d;--item-hover-bg: #505050;--multi-item-bg: #5b5b5b;--input-color: #d4d4d4;--multi-clear-bg: #8a8a8a;--multi-item-clear-icon-color: #d4d4d4;--multi-item-outline: 1px solid #696969;--list-shadow: 0 2px 8px 0 rgba(0, 0, 0, .4);--jse-color-picker-background: #656565;--jse-color-picker-border-box-shadow: #8c8c8c 0 0 0 1px}.json-editor-container[_ngcontent-%COMP%]{height:100%} .jse-message.jse-error{display:none} .cm-gutters.cm-gutters-before{display:none} .jse-text-mode{border-radius:10px} .jse-contents{border-radius:10px;border-bottom:1px solid #4f4f4f}"]})};var QDA=(t,e)=>e.name;function uDA(t,e){if(t&1&&y(0),t&2){let A=p();ue(" Configure ",A.selectedBuiltInTool," ")}}function fDA(t,e){if(t&1&&y(0),t&2){let A=p();ue(" ",A.isEditMode?"Edit Built-in Tool":"Add Built-in Tool"," ")}}function pDA(t,e){if(t&1){let A=QA();B(0,"div",8),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.onToolSelected(n))}),B(1,"mat-icon",9),y(2),Q(),B(3,"span",10),y(4),Q()()}if(t&2){let A=e.$implicit,i=p(3);RA("selected",i.selectedBuiltInTool===A),u(2),lA(i.getToolIcon(A)),u(2),lA(A)}}function mDA(t,e){if(t&1&&(B(0,"div",4)(1,"h3",5),y(2),Q(),B(3,"div",6),Ue(4,pDA,5,4,"div",7,ri),Q()()),t&2){let A=e.$implicit;u(2),lA(A.name),u(2),Te(A.tools)}}function wDA(t,e){if(t&1&&(B(0,"div",1),Ue(1,mDA,6,1,"div",4,QDA),Q()),t&2){let A=p();u(),Te(A.toolCategories)}}function DDA(t,e){if(t&1&&(B(0,"div",2)(1,"h3",11),y(2,"Configure Tool Arguments"),Q(),hA(3,"app-json-editor",12),Q()),t&2){let A=p();u(3),H("jsonString",A.toolArgsString)}}function yDA(t,e){if(t&1){let A=QA();B(0,"button",14),U("click",function(){T(A);let n=p(2);return J(n.backToToolSelection())}),y(1,"Back"),Q()}}function vDA(t,e){if(t&1){let A=QA();O(0,yDA,2,0,"button",13),B(1,"button",14),U("click",function(){T(A);let n=p();return J(n.saveArgs())}),y(2),Q()}if(t&2){let A=p();Y(A.isEditMode?-1:0),u(2),lA(A.isEditMode?"Save":"Create")}}function bDA(t,e){if(t&1){let A=QA();B(0,"button",14),U("click",function(){T(A);let n=p();return J(n.cancel())}),y(1,"Cancel"),Q(),B(2,"button",15),U("click",function(){T(A);let n=p();return J(n.addTool())}),y(3),Q()}if(t&2){let A=p();u(3),ue(" ",A.isEditMode?"Save":"Create"," ")}}var kd=class t{constructor(e,A){this.data=e;this.dialogRef=A}jsonEditorComponent;selectedBuiltInTool="google_search";toolCategories=[{name:"Search Tools",tools:["google_search","EnterpriseWebSearchTool","VertexAiSearchTool"]},{name:"Context Tools",tools:["FilesRetrieval","load_memory","preload_memory","url_context","VertexAiRagRetrieval"]},{name:"Agent Function Tools",tools:["exit_loop","get_user_choice","load_artifacts","LongRunningFunctionTool"]}];builtInToolArgs=new Map([["EnterpriseWebSearchTool",[]],["exit_loop",[]],["FilesRetrieval",["name","description","input_dir"]],["get_user_choice",[]],["google_search",[]],["load_artifacts",[]],["load_memory",[]],["LongRunningFunctionTool",["func"]],["preload_memory",[]],["url_context",[]],["VertexAiRagRetrieval",["name","description","rag_corpora","rag_resources","similarity_top_k","vector_distance_threshold"]],["VertexAiSearchTool",["data_store_id","data_store_specs","search_engine_id","filter","max_results"]]]);isEditMode=!1;showArgsEditor=!1;toolArgs={};toolArgsString="";ngOnInit(){if(this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName){this.selectedBuiltInTool=this.data.toolName;let e=this.builtInToolArgs.get(this.data.toolName);if(e&&e.length>0){if(this.data.toolArgs)this.toolArgs=gA({},this.data.toolArgs),delete this.toolArgs.skip_summarization;else{this.toolArgs={};for(let A of e)this.toolArgs[A]=""}this.toolArgsString=JSON.stringify(this.toolArgs,null,2),this.showArgsEditor=!0}}}onToolSelected(e){this.selectedBuiltInTool=e;let A=this.builtInToolArgs.get(e);A&&A.length>0&&(this.initializeToolArgs(e,A),this.showArgsEditor=!0)}initializeToolArgs(e,A){this.toolArgs={};for(let i of A)this.toolArgs[i]="";this.toolArgsString=JSON.stringify(this.toolArgs,null,2)}backToToolSelection(){this.showArgsEditor=!1,this.toolArgs={},this.toolArgsString=""}saveArgs(){if(this.jsonEditorComponent)try{this.toolArgsString=this.jsonEditorComponent.getJsonString(),this.toolArgs=JSON.parse(this.toolArgsString)}catch(e){alert("Invalid JSON: "+e);return}this.addTool()}addTool(){let e={toolType:"Built-in tool",name:this.selectedBuiltInTool,isEditMode:this.isEditMode};Object.keys(this.toolArgs).length>0&&(e.args=this.toolArgs),this.dialogRef.close(e)}cancel(){this.dialogRef.close()}getToolIcon(e){return sE(e,"Built-in tool")}static \u0275fac=function(A){return new(A||t)(ct(qo),ct(lo))};static \u0275cmp=SA({type:t,selectors:[["app-built-in-tool-dialog"]],viewQuery:function(A,i){if(A&1&&Jt(yc,5),A&2){let n;ae(n=re())&&(i.jsonEditorComponent=n.first)}},decls:9,vars:3,consts:[["mat-dialog-title","",1,"dialog-title"],[1,"tool-categories-container"],[1,"args-editor-container"],["align","end"],[1,"tool-category"],[1,"category-title"],[1,"tool-list"],[1,"tool-item",3,"selected"],[1,"tool-item",3,"click"],[1,"tool-icon"],[1,"tool-name"],[1,"args-editor-title"],[3,"jsonString"],["mat-button",""],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(B(0,"h2",0),O(1,uDA,1,1)(2,fDA,1,1),Q(),B(3,"mat-dialog-content"),O(4,wDA,3,0,"div",1)(5,DDA,4,1,"div",2),Q(),B(6,"mat-dialog-actions",3),O(7,vDA,3,2)(8,bDA,4,1),Q()),A&2&&(u(),Y(i.showArgsEditor?1:2),u(3),Y(i.showArgsEditor?5:4),u(3),Y(i.showArgsEditor?7:8))},dependencies:[li,ln,fa,Na,Wt,pa,pi,yc],styles:[".dialog-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-subhead-color)!important;font-family:Google Sans;font-size:24px}.tool-categories-container[_ngcontent-%COMP%]{padding:16px 0}.tool-category[_ngcontent-%COMP%]{margin-bottom:24px}.tool-category[_ngcontent-%COMP%]:last-child{margin-bottom:0}.category-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin:0 0 12px;padding-left:8px}.tool-list[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;padding:12px 16px;border-radius:8px;cursor:pointer;transition:all .2s ease;border:1px solid var(--builder-tool-item-border-color);min-width:0}.tool-item.selected[_ngcontent-%COMP%]{border:1px solid #8ab4f8}.tool-item[_ngcontent-%COMP%] .tool-icon[_ngcontent-%COMP%]{color:#8ab4f8;margin-right:12px;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-item[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%]{font-family:Google Sans;font-size:14px;color:var(--mdc-dialog-supporting-text-color)!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.args-editor-container[_ngcontent-%COMP%]{padding:16px 0}.args-editor-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin:0 0 16px}"]})};function MDA(t,e){if(t&1){let A=QA();Dl(0),B(1,"div",6)(2,"div",7),U("click",function(){T(A);let n=p();return J(n.toggleToolInfo())}),B(3,"mat-icon",8),y(4,"info"),Q(),B(5,"div",9)(6,"span"),y(7,"Tool Information"),Q()(),B(8,"button",10)(9,"mat-icon"),y(10),Q()()(),B(11,"div",11)(12,"div",12)(13,"div",13),y(14),Q(),B(15,"div",14),y(16),Q()(),B(17,"div",15)(18,"a",16)(19,"mat-icon"),y(20,"open_in_new"),Q(),B(21,"span"),y(22,"View Official Documentation"),Q()()()()(),yl()}if(t&2){let A,i,n,o=p();u(10),lA(o.isToolInfoExpanded?"expand_less":"expand_more"),u(),RA("expanded",o.isToolInfoExpanded),u(3),lA((A=o.getToolInfo())==null?null:A.shortDescription),u(2),lA((i=o.getToolInfo())==null?null:i.detailedDescription),u(2),H("href",(n=o.getToolInfo())==null?null:n.docLink,Go)}}function SDA(t,e){t&1&&(B(0,"mat-hint",19),y(1," Start with a letter or underscore, and contain only letters, digits, and underscores. "),Q())}function kDA(t,e){if(t&1){let A=QA();B(0,"mat-form-field",2)(1,"mat-label"),y(2),Q(),B(3,"input",17),Di("ngModelChange",function(n){T(A);let o=p();return Bi(o.inputValue,n)||(o.inputValue=n),J(n)}),U("keydown",function(n){T(A);let o=p();return J(o.onKeyDown(n))}),Q(),Et(4,SDA,2,0,"mat-hint",18),Q()}if(t&2){let A=p();u(2),lA(A.data.inputLabel||"Input"),u(),wi("ngModel",A.inputValue),H("placeholder",A.data.inputPlaceholder||"Enter value"),u(),H("ngIf",!A.isInputValid())}}var vc=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.inputValue=A.inputValue||""}inputValue="";isToolInfoExpanded=!1;isInputValid(){let e=this.inputValue.trim();return!(!e||!/^[a-zA-Z_]/.test(e)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))}onCancel(){this.dialogRef.close()}onConfirm(){if(this.data.showInput){let e=this.inputValue.trim();if(!this.isInputValid())return;this.dialogRef.close(e)}else this.dialogRef.close("confirm")}onKeyDown(e){e.key==="Enter"&&this.data.showInput&&this.onConfirm()}getToolInfo(){if(this.data.toolType)return tc.getToolDetailedInfo(this.data.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-confirmation-dialog"]],decls:12,vars:6,consts:[["mat-dialog-title",""],[4,"ngIf"],[2,"width","100%","margin-top","16px"],["align","end"],["mat-button","",3,"click"],["mat-button","","color","primary","cdkFocusInitial","",3,"click","disabled"],[1,"tool-info-container"],[1,"tool-info-header",3,"click"],[1,"tool-info-icon"],[1,"tool-info-title"],["mat-icon-button","","type","button","aria-label","Toggle tool information",1,"tool-info-toggle"],[1,"tool-info-body"],[1,"tool-info-content"],[1,"tool-info-short"],[1,"tool-info-detailed"],[1,"tool-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"tool-info-link",3,"href"],["matInput","","cdkFocusInitial","",3,"ngModelChange","keydown","ngModel","placeholder"],["style","font-size: 11px; color: #666;",4,"ngIf"],[2,"font-size","11px","color","#666"]],template:function(A,i){A&1&&(B(0,"h2",0),y(1),Q(),B(2,"mat-dialog-content"),Et(3,MDA,23,6,"ng-container",1),B(4,"p"),y(5),Q(),O(6,kDA,5,4,"mat-form-field",2),Q(),B(7,"mat-dialog-actions",3)(8,"button",4),U("click",function(){return i.onCancel()}),y(9,"Cancel"),Q(),B(10,"button",5),U("click",function(){return i.onConfirm()}),y(11),Q()()),A&2&&(u(),lA(i.data.title),u(2),H("ngIf",i.data.showToolInfo&&i.getToolInfo()),u(2),lA(i.data.message),u(),Y(i.data.showInput?6:-1),u(4),H("disabled",i.data.showInput&&!i.isInputValid()),u(),ue(" ",i.data.confirmButtonText||"Confirm"," "))},dependencies:[li,Js,qi,pi,ji,Wt,fa,Na,pa,Ya,Ko,vs,s1,Ps,ua,ln,Dn,yn,ko],styles:["mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px;color:var(--mdc-dialog-supporting-text-color)}mat-dialog-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)}.tool-info-container[_ngcontent-%COMP%]{border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:var(--mdc-dialog-supporting-text-color)!important;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};var tAA=["*",[["mat-chip-avatar"],["","matChipAvatar",""]],[["mat-chip-trailing-icon"],["","matChipRemove",""],["","matChipTrailingIcon",""]]],iAA=["*","mat-chip-avatar, [matChipAvatar]","mat-chip-trailing-icon,[matChipRemove],[matChipTrailingIcon]"];function xDA(t,e){t&1&&(B(0,"span",3),Ve(1,1),Q())}function _DA(t,e){t&1&&(B(0,"span",6),Ve(1,2),Q())}function RDA(t,e){t&1&&(B(0,"span",3),Ve(1,1),B(2,"span",7),Ct(),B(3,"svg",8),hA(4,"path",9),Q()()())}function NDA(t,e){t&1&&(B(0,"span",6),Ve(1,2),Q())}var FDA=`.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}@media(forced-colors: active){.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{forced-color-adjust:none}}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-outline-width, 1px);border-radius:var(--mat-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mat-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--secondary{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mat-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mat-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mat-chip-with-avatar-avatar-size, 24px);height:var(--mat-chip-with-avatar-avatar-size, 24px);font-size:var(--mat-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__graphic{padding-left:0}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mat-chip-container-shape-radius, 8px);height:var(--mat-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mat-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mat-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mat-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mat-chip-with-icon-icon-size, 18px);height:var(--mat-chip-with-icon-icon-size, 18px);font-size:var(--mat-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mat-chip-with-icon-icon-color: var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mat-chip-elevated-container-color: var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mat-chip-label-text-color: var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mat-chip-outline-width: var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mat-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mat-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-edit,.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-edit:focus,.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-edit:hover::after,.mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-chip-edit:focus::after,.mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:focus::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:hover::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mat-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-edit::before,.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus-visible .mat-focus-indicator::before{content:""}.mdc-evolution-chip__icon,.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{min-height:fit-content}img.mdc-evolution-chip__icon{min-height:0} -`;var nAA=["*"],LDA=`.mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-moz-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-webkit-input-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input:-ms-input-placeholder{opacity:1}.mat-mdc-chip-set+input.mat-mdc-chip-input{margin-left:0;margin-right:0} -`,eN=new kA("mat-chips-default-options",{providedIn:"root",factory:()=>({separatorKeyCodes:[13]})}),XR=new kA("MatChipAvatar"),AAA=new kA("MatChipTrailingIcon"),eAA=new kA("MatChipEdit"),$R=new kA("MatChipRemove"),tN=new kA("MatChip"),oAA=(()=>{class t{_elementRef=w(ce);_parentChip=w(tN);_isPrimary=!0;_isLeading=!1;get disabled(){return this._disabled||this._parentChip?.disabled||!1}set disabled(A){this._disabled=A}_disabled=!1;tabIndex=-1;_allowFocusWhenDisabled=!1;_getDisabledAttribute(){return this.disabled&&!this._allowFocusWhenDisabled?"":null}constructor(){w(eo).load(lr),this._elementRef.nativeElement.nodeName==="BUTTON"&&this._elementRef.nativeElement.setAttribute("type","button")}focus(){this._elementRef.nativeElement.focus()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matChipContent",""]],hostAttrs:[1,"mat-mdc-chip-action","mdc-evolution-chip__action","mdc-evolution-chip__action--presentational"],hostVars:8,hostBindings:function(i,n){i&2&&(te("disabled",n._getDisabledAttribute())("aria-disabled",n.disabled),RA("mdc-evolution-chip__action--primary",n._isPrimary)("mdc-evolution-chip__action--secondary",!n._isPrimary)("mdc-evolution-chip__action--trailing",!n._isPrimary&&!n._isLeading))},inputs:{disabled:[2,"disabled","disabled",Be],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?-1:Cn(A)],_allowFocusWhenDisabled:"_allowFocusWhenDisabled"}})}return t})(),iN=(()=>{class t extends oAA{_getTabindex(){return this.disabled&&!this._allowFocusWhenDisabled?null:this.tabIndex.toString()}_handleClick(A){!this.disabled&&this._isPrimary&&(A.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!this.disabled&&this._isPrimary&&!this._parentChip._isEditing&&(A.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matChipAction",""]],hostVars:3,hostBindings:function(i,n){i&1&&U("click",function(a){return n._handleClick(a)})("keydown",function(a){return n._handleKeydown(a)}),i&2&&(te("tabindex",n._getTabindex()),RA("mdc-evolution-chip__action--presentational",!1))},features:[mt]})}return t})(),aAA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["mat-chip-avatar"],["","matChipAvatar",""]],hostAttrs:["role","img",1,"mat-mdc-chip-avatar","mdc-evolution-chip__icon","mdc-evolution-chip__icon--primary"],features:[Bt([{provide:XR,useExisting:t}])]})}return t})();var rAA=(()=>{class t extends iN{_isPrimary=!1;_handleClick(A){this.disabled||(A.stopPropagation(),A.preventDefault(),this._parentChip.remove())}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!this.disabled&&(A.stopPropagation(),A.preventDefault(),this._parentChip.remove())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matChipRemove",""]],hostAttrs:["role","button",1,"mat-mdc-chip-remove","mat-mdc-chip-trailing-icon","mat-focus-indicator","mdc-evolution-chip__icon","mdc-evolution-chip__icon--trailing"],hostVars:1,hostBindings:function(i,n){i&2&&te("aria-hidden",null)},features:[Bt([{provide:$R,useExisting:t}]),mt]})}return t})(),t3=(()=>{class t{_changeDetectorRef=w(wt);_elementRef=w(ce);_tagName=w(ZF);_ngZone=w(qe);_focusMonitor=w($a);_globalRippleOptions=w(r2,{optional:!0});_document=w(ti);_onFocus=new ie;_onBlur=new ie;_isBasicChip=!1;role=null;_hasFocusInternal=!1;_pendingFocus=!1;_actionChanges;_animationsDisabled=An();_allLeadingIcons;_allTrailingIcons;_allEditIcons;_allRemoveIcons;_hasFocus(){return this._hasFocusInternal}id=w(In).getId("mat-mdc-chip-");ariaLabel=null;ariaDescription=null;_chipListDisabled=!1;_hadFocusOnRemove=!1;_textElement;get value(){return this._value!==void 0?this._value:this._textElement.textContent.trim()}set value(A){this._value=A}_value;color;removable=!0;highlighted=!1;disableRipple=!1;get disabled(){return this._disabled||this._chipListDisabled}set disabled(A){this._disabled=A}_disabled=!1;removed=new LA;destroyed=new LA;basicChipAttrName="mat-basic-chip";leadingIcon;editIcon;trailingIcon;removeIcon;primaryAction;_rippleLoader=w(Sp);_injector=w(Dt);constructor(){let A=w(eo);A.load(lr),A.load(o2),this._monitorFocus(),this._rippleLoader?.configureRipple(this._elementRef.nativeElement,{className:"mat-mdc-chip-ripple",disabled:this._isRippleDisabled()})}ngOnInit(){this._isBasicChip=this._elementRef.nativeElement.hasAttribute(this.basicChipAttrName)||this._tagName.toLowerCase()===this.basicChipAttrName}ngAfterViewInit(){this._textElement=this._elementRef.nativeElement.querySelector(".mat-mdc-chip-action-label"),this._pendingFocus&&(this._pendingFocus=!1,this.focus())}ngAfterContentInit(){this._actionChanges=Ki(this._allLeadingIcons.changes,this._allTrailingIcons.changes,this._allEditIcons.changes,this._allRemoveIcons.changes).subscribe(()=>this._changeDetectorRef.markForCheck())}ngDoCheck(){this._rippleLoader.setDisabled(this._elementRef.nativeElement,this._isRippleDisabled())}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement),this._actionChanges?.unsubscribe(),this.destroyed.emit({chip:this}),this.destroyed.complete()}remove(){this.removable&&(this._hadFocusOnRemove=this._hasFocus(),this.removed.emit({chip:this}))}_isRippleDisabled(){return this.disabled||this.disableRipple||this._animationsDisabled||this._isBasicChip||!this._hasInteractiveActions()||!!this._globalRippleOptions?.disabled}_hasTrailingIcon(){return!!(this.trailingIcon||this.removeIcon)}_handleKeydown(A){(A.keyCode===8&&!A.repeat||A.keyCode===46)&&(A.preventDefault(),this.remove())}focus(){this.disabled||(this.primaryAction?this.primaryAction.focus():this._pendingFocus=!0)}_getSourceAction(A){return this._getActions().find(i=>{let n=i._elementRef.nativeElement;return n===A||n.contains(A)})}_getActions(){let A=[];return this.editIcon&&A.push(this.editIcon),this.primaryAction&&A.push(this.primaryAction),this.removeIcon&&A.push(this.removeIcon),A}_handlePrimaryActionInteraction(){}_hasInteractiveActions(){return this._getActions().length>0}_edit(A){}_monitorFocus(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{let i=A!==null;i!==this._hasFocusInternal&&(this._hasFocusInternal=i,i?this._onFocus.next({chip:this}):(this._changeDetectorRef.markForCheck(),setTimeout(()=>this._ngZone.run(()=>this._onBlur.next({chip:this})))))})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-basic-chip"],["","mat-basic-chip",""],["mat-chip"],["","mat-chip",""]],contentQueries:function(i,n,o){if(i&1&&jo(o,XR,5)(o,eAA,5)(o,AAA,5)(o,$R,5)(o,XR,5)(o,AAA,5)(o,eAA,5)(o,$R,5),i&2){let a;ae(a=re())&&(n.leadingIcon=a.first),ae(a=re())&&(n.editIcon=a.first),ae(a=re())&&(n.trailingIcon=a.first),ae(a=re())&&(n.removeIcon=a.first),ae(a=re())&&(n._allLeadingIcons=a),ae(a=re())&&(n._allTrailingIcons=a),ae(a=re())&&(n._allEditIcons=a),ae(a=re())&&(n._allRemoveIcons=a)}},viewQuery:function(i,n){if(i&1&&Jt(iN,5),i&2){let o;ae(o=re())&&(n.primaryAction=o.first)}},hostAttrs:[1,"mat-mdc-chip"],hostVars:31,hostBindings:function(i,n){i&1&&U("keydown",function(a){return n._handleKeydown(a)}),i&2&&(ha("id",n.id),te("role",n.role)("aria-label",n.ariaLabel),ro("mat-"+(n.color||"primary")),RA("mdc-evolution-chip",!n._isBasicChip)("mdc-evolution-chip--disabled",n.disabled)("mdc-evolution-chip--with-trailing-action",n._hasTrailingIcon())("mdc-evolution-chip--with-primary-graphic",n.leadingIcon)("mdc-evolution-chip--with-primary-icon",n.leadingIcon)("mdc-evolution-chip--with-avatar",n.leadingIcon)("mat-mdc-chip-with-avatar",n.leadingIcon)("mat-mdc-chip-highlighted",n.highlighted)("mat-mdc-chip-disabled",n.disabled)("mat-mdc-basic-chip",n._isBasicChip)("mat-mdc-standard-chip",!n._isBasicChip)("mat-mdc-chip-with-trailing-icon",n._hasTrailingIcon())("_mat-animation-noopable",n._animationsDisabled))},inputs:{role:"role",id:"id",ariaLabel:[0,"aria-label","ariaLabel"],ariaDescription:[0,"aria-description","ariaDescription"],value:"value",color:"color",removable:[2,"removable","removable",Be],highlighted:[2,"highlighted","highlighted",Be],disableRipple:[2,"disableRipple","disableRipple",Be],disabled:[2,"disabled","disabled",Be]},outputs:{removed:"removed",destroyed:"destroyed"},exportAs:["matChip"],features:[Bt([{provide:tN,useExisting:t}])],ngContentSelectors:iAA,decls:8,vars:2,consts:[[1,"mat-mdc-chip-focus-overlay"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary"],["matChipContent",""],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],[1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"]],template:function(i,n){i&1&&(Rt(tAA),hA(0,"span",0),B(1,"span",1)(2,"span",2),O(3,xDA,2,0,"span",3),B(4,"span",4),Ve(5),hA(6,"span",5),Q()()(),O(7,_DA,2,0,"span",6)),i&2&&(u(3),Y(n.leadingIcon?3:-1),u(4),Y(n._hasTrailingIcon()?7:-1))},dependencies:[oAA],styles:[`.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}@media(forced-colors: active){.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{forced-color-adjust:none}}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-outline-width, 1px);border-radius:var(--mat-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mat-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--secondary{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mat-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mat-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mat-chip-with-avatar-avatar-size, 24px);height:var(--mat-chip-with-avatar-avatar-size, 24px);font-size:var(--mat-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__graphic{padding-left:0}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mat-chip-container-shape-radius, 8px);height:var(--mat-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mat-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mat-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mat-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mat-chip-with-icon-icon-size, 18px);height:var(--mat-chip-with-icon-icon-size, 18px);font-size:var(--mat-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mat-chip-with-icon-icon-color: var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mat-chip-elevated-container-color: var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mat-chip-label-text-color: var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mat-chip-outline-width: var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mat-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mat-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-edit,.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-edit:focus,.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-edit:hover::after,.mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-chip-edit:focus::after,.mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:focus::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:hover::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mat-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-edit::before,.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus-visible .mat-focus-indicator::before{content:""}.mdc-evolution-chip__icon,.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{min-height:fit-content}img.mdc-evolution-chip__icon{min-height:0} -`],encapsulation:2,changeDetection:0})}return t})();var nN=(()=>{class t extends t3{_defaultOptions=w(eN,{optional:!0});chipListSelectable=!0;_chipListMultiple=!1;_chipListHideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get selectable(){return this._selectable&&this.chipListSelectable}set selectable(A){this._selectable=A,this._changeDetectorRef.markForCheck()}_selectable=!0;get selected(){return this._selected}set selected(A){this._setSelectedState(A,!1,!0)}_selected=!1;get ariaSelected(){return this.selectable?this.selected.toString():null}basicChipAttrName="mat-basic-chip-option";selectionChange=new LA;ngOnInit(){super.ngOnInit(),this.role="presentation"}select(){this._setSelectedState(!0,!1,!0)}deselect(){this._setSelectedState(!1,!1,!0)}selectViaInteraction(){this._setSelectedState(!0,!0,!0)}toggleSelected(A=!1){return this._setSelectedState(!this.selected,A,!0),this.selected}_handlePrimaryActionInteraction(){this.disabled||(this.focus(),this.selectable&&this.toggleSelected(!0))}_hasLeadingGraphic(){return this.leadingIcon?!0:!this._chipListHideSingleSelectionIndicator||this._chipListMultiple}_setSelectedState(A,i,n){A!==this.selected&&(this._selected=A,n&&this.selectionChange.emit({source:this,isUserInput:i,selected:this.selected}),this._changeDetectorRef.markForCheck())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275cmp=SA({type:t,selectors:[["mat-basic-chip-option"],["","mat-basic-chip-option",""],["mat-chip-option"],["","mat-chip-option",""]],hostAttrs:[1,"mat-mdc-chip","mat-mdc-chip-option"],hostVars:37,hostBindings:function(i,n){i&2&&(ha("id",n.id),te("tabindex",null)("aria-label",null)("aria-description",null)("role",n.role),RA("mdc-evolution-chip",!n._isBasicChip)("mdc-evolution-chip--filter",!n._isBasicChip)("mdc-evolution-chip--selectable",!n._isBasicChip)("mat-mdc-chip-selected",n.selected)("mat-mdc-chip-multiple",n._chipListMultiple)("mat-mdc-chip-disabled",n.disabled)("mat-mdc-chip-with-avatar",n.leadingIcon)("mdc-evolution-chip--disabled",n.disabled)("mdc-evolution-chip--selected",n.selected)("mdc-evolution-chip--selecting",!n._animationsDisabled)("mdc-evolution-chip--with-trailing-action",n._hasTrailingIcon())("mdc-evolution-chip--with-primary-icon",n.leadingIcon)("mdc-evolution-chip--with-primary-graphic",n._hasLeadingGraphic())("mdc-evolution-chip--with-avatar",n.leadingIcon)("mat-mdc-chip-highlighted",n.highlighted)("mat-mdc-chip-with-trailing-icon",n._hasTrailingIcon()))},inputs:{selectable:[2,"selectable","selectable",Be],selected:[2,"selected","selected",Be]},outputs:{selectionChange:"selectionChange"},features:[Bt([{provide:t3,useExisting:t},{provide:tN,useExisting:t}]),mt],ngContentSelectors:iAA,decls:8,vars:6,consts:[[1,"mat-mdc-chip-focus-overlay"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary"],["matChipAction","","role","option",3,"_allowFocusWhenDisabled"],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],[1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"],[1,"mdc-evolution-chip__checkmark"],["viewBox","-2 -3 30 30","focusable","false","aria-hidden","true",1,"mdc-evolution-chip__checkmark-svg"],["fill","none","stroke","currentColor","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-evolution-chip__checkmark-path"]],template:function(i,n){i&1&&(Rt(tAA),hA(0,"span",0),B(1,"span",1)(2,"button",2),O(3,RDA,5,0,"span",3),B(4,"span",4),Ve(5),hA(6,"span",5),Q()()(),O(7,NDA,2,0,"span",6)),i&2&&(u(2),H("_allowFocusWhenDisabled",!0),te("aria-description",n.ariaDescription)("aria-label",n.ariaLabel)("aria-selected",n.ariaSelected),u(),Y(n._hasLeadingGraphic()?3:-1),u(4),Y(n._hasTrailingIcon()?7:-1))},dependencies:[iN],styles:[FDA],encapsulation:2,changeDetection:0})}return t})();var oN=(()=>{class t{_elementRef=w(ce);_changeDetectorRef=w(wt);_dir=w(fo,{optional:!0});_lastDestroyedFocusedChipIndex=null;_keyManager;_destroyed=new ie;_defaultRole="presentation";get chipFocusChanges(){return this._getChipStream(A=>A._onFocus)}get chipDestroyedChanges(){return this._getChipStream(A=>A.destroyed)}get chipRemovedChanges(){return this._getChipStream(A=>A.removed)}get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._syncChipsState()}_disabled=!1;get empty(){return!this._chips||this._chips.length===0}get role(){return this._explicitRole?this._explicitRole:this.empty?null:this._defaultRole}tabIndex=0;set role(A){this._explicitRole=A}_explicitRole=null;get focused(){return this._hasFocusedChip()}_chips;_chipActions=new xg;constructor(){}ngAfterViewInit(){this._setUpFocusManagement(),this._trackChipSetChanges(),this._trackDestroyedFocusedChip()}ngOnDestroy(){this._keyManager?.destroy(),this._chipActions.destroy(),this._destroyed.next(),this._destroyed.complete()}_hasFocusedChip(){return this._chips&&this._chips.some(A=>A._hasFocus())}_syncChipsState(){this._chips?.forEach(A=>{A._chipListDisabled=this._disabled,A._changeDetectorRef.markForCheck()})}focus(){}_handleKeydown(A){this._originatesFromChip(A)&&this._keyManager.onKeydown(A)}_isValidIndex(A){return A>=0&&Athis._elementRef.nativeElement.tabIndex=A))}_getChipStream(A){return this._chips.changes.pipe(Sn(null),hi(()=>Ki(...this._chips.map(A))))}_originatesFromChip(A){let i=A.target;for(;i&&i!==this._elementRef.nativeElement;){if(i.classList.contains("mat-mdc-chip"))return!0;i=i.parentElement}return!1}_setUpFocusManagement(){this._chips.changes.pipe(Sn(this._chips)).subscribe(A=>{let i=[];A.forEach(n=>n._getActions().forEach(o=>i.push(o))),this._chipActions.reset(i),this._chipActions.notifyOnChanges()}),this._keyManager=new H0(this._chipActions).withVerticalOrientation().withHorizontalOrientation(this._dir?this._dir.value:"ltr").withHomeAndEnd().skipPredicate(A=>this._skipPredicate(A)),this.chipFocusChanges.pipe(Qt(this._destroyed)).subscribe(({chip:A})=>{let i=A._getSourceAction(document.activeElement);i&&this._keyManager.updateActiveItem(i)}),this._dir?.change.pipe(Qt(this._destroyed)).subscribe(A=>this._keyManager.withHorizontalOrientation(A))}_skipPredicate(A){return A.disabled}_trackChipSetChanges(){this._chips.changes.pipe(Sn(null),Qt(this._destroyed)).subscribe(()=>{this.disabled&&Promise.resolve().then(()=>this._syncChipsState()),this._redirectDestroyedChipFocus()})}_trackDestroyedFocusedChip(){this.chipDestroyedChanges.pipe(Qt(this._destroyed)).subscribe(A=>{let n=this._chips.toArray().indexOf(A.chip),o=A.chip._hasFocus(),a=A.chip._hadFocusOnRemove&&this._keyManager.activeItem&&A.chip._getActions().includes(this._keyManager.activeItem),r=o||a;this._isValidIndex(n)&&r&&(this._lastDestroyedFocusedChipIndex=n)})}_redirectDestroyedChipFocus(){if(this._lastDestroyedFocusedChipIndex!=null){if(this._chips.length){let A=Math.min(this._lastDestroyedFocusedChipIndex,this._chips.length-1),i=this._chips.toArray()[A];i.disabled?this._chips.length===1?this.focus():this._keyManager.setPreviousItemActive():i.focus()}else this.focus();this._lastDestroyedFocusedChipIndex=null}}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-chip-set"]],contentQueries:function(i,n,o){if(i&1&&jo(o,t3,5),i&2){let a;ae(a=re())&&(n._chips=a)}},hostAttrs:[1,"mat-mdc-chip-set","mdc-evolution-chip-set"],hostVars:1,hostBindings:function(i,n){i&1&&U("keydown",function(a){return n._handleKeydown(a)}),i&2&&te("role",n.role)},inputs:{disabled:[2,"disabled","disabled",Be],role:"role",tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:Cn(A)]},ngContentSelectors:nAA,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(i,n){i&1&&(Rt(),wn(0,"div",0),Ve(1),Gn())},styles:[`.mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-moz-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-webkit-input-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input:-ms-input-placeholder{opacity:1}.mat-mdc-chip-set+input.mat-mdc-chip-input{margin-left:0;margin-right:0} -`],encapsulation:2,changeDetection:0})}return t})(),AN=class{source;value;constructor(e,A){this.source=e,this.value=A}},GDA={provide:as,useExisting:Ja(()=>aN),multi:!0},aN=(()=>{class t extends oN{_onTouched=()=>{};_onChange=()=>{};_defaultRole="listbox";_defaultOptions=w(eN,{optional:!0});get multiple(){return this._multiple}set multiple(A){this._multiple=A,this._syncListboxProperties()}_multiple=!1;get selected(){let A=this._chips.toArray().filter(i=>i.selected);return this.multiple?A:A[0]}ariaOrientation="horizontal";get selectable(){return this._selectable}set selectable(A){this._selectable=A,this._syncListboxProperties()}_selectable=!0;compareWith=(A,i)=>A===i;required=!1;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncListboxProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get chipSelectionChanges(){return this._getChipStream(A=>A.selectionChange)}get chipBlurChanges(){return this._getChipStream(A=>A._onBlur)}get value(){return this._value}set value(A){this._chips&&this._chips.length&&this._setSelectionByValue(A,!1),this._value=A}_value;change=new LA;_chips=void 0;ngAfterContentInit(){this._chips.changes.pipe(Sn(null),Qt(this._destroyed)).subscribe(()=>{this.value!==void 0&&Promise.resolve().then(()=>{this._setSelectionByValue(this.value,!1)}),this._syncListboxProperties()}),this.chipBlurChanges.pipe(Qt(this._destroyed)).subscribe(()=>this._blur()),this.chipSelectionChanges.pipe(Qt(this._destroyed)).subscribe(A=>{this.multiple||this._chips.forEach(i=>{i!==A.source&&i._setSelectedState(!1,!1,!1)}),A.isUserInput&&this._propagateChanges()})}focus(){if(this.disabled)return;let A=this._getFirstSelectedChip();A&&!A.disabled?A.focus():this._chips.length>0?this._keyManager.setFirstItemActive():this._elementRef.nativeElement.focus()}writeValue(A){A!=null?this.value=A:this.value=void 0}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}_setSelectionByValue(A,i=!0){this._clearSelection(),Array.isArray(A)?A.forEach(n=>this._selectValue(n,i)):this._selectValue(A,i)}_blur(){this.disabled||setTimeout(()=>{this.focused||this._markAsTouched()})}_keydown(A){A.keyCode===9&&super._allowFocusEscape()}_markAsTouched(){this._onTouched(),this._changeDetectorRef.markForCheck()}_propagateChanges(){let A=null;Array.isArray(this.selected)?A=this.selected.map(i=>i.value):A=this.selected?this.selected.value:void 0,this._value=A,this.change.emit(new AN(this,A)),this._onChange(A),this._changeDetectorRef.markForCheck()}_clearSelection(A){this._chips.forEach(i=>{i!==A&&i.deselect()})}_selectValue(A,i){let n=this._chips.find(o=>o.value!=null&&this.compareWith(o.value,A));return n&&(i?n.selectViaInteraction():n.select()),n}_syncListboxProperties(){this._chips&&Promise.resolve().then(()=>{this._chips.forEach(A=>{A._chipListMultiple=this.multiple,A.chipListSelectable=this._selectable,A._chipListHideSingleSelectionIndicator=this.hideSingleSelectionIndicator,A._changeDetectorRef.markForCheck()})})}_getFirstSelectedChip(){return Array.isArray(this.selected)?this.selected.length?this.selected[0]:void 0:this.selected}_skipPredicate(A){return!1}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275cmp=SA({type:t,selectors:[["mat-chip-listbox"]],contentQueries:function(i,n,o){if(i&1&&jo(o,nN,5),i&2){let a;ae(a=re())&&(n._chips=a)}},hostAttrs:[1,"mdc-evolution-chip-set","mat-mdc-chip-listbox"],hostVars:10,hostBindings:function(i,n){i&1&&U("focus",function(){return n.focus()})("blur",function(){return n._blur()})("keydown",function(a){return n._keydown(a)}),i&2&&(ha("tabIndex",n.disabled||n.empty?-1:n.tabIndex),te("role",n.role)("aria-required",n.role?n.required:null)("aria-disabled",n.disabled.toString())("aria-multiselectable",n.multiple)("aria-orientation",n.ariaOrientation),RA("mat-mdc-chip-list-disabled",n.disabled)("mat-mdc-chip-list-required",n.required))},inputs:{multiple:[2,"multiple","multiple",Be],ariaOrientation:[0,"aria-orientation","ariaOrientation"],selectable:[2,"selectable","selectable",Be],compareWith:"compareWith",required:[2,"required","required",Be],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",Be],value:"value"},outputs:{change:"change"},features:[Bt([GDA]),mt],ngContentSelectors:nAA,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(i,n){i&1&&(Rt(),wn(0,"div",0),Ve(1),Gn())},styles:[LDA],encapsulation:2,changeDetection:0})}return t})();var UD=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({providers:[gB,{provide:eN,useValue:{separatorKeyCodes:[13]}}],imports:[Yc,fi]})}return t})();var lAA=(()=>{class t{get vertical(){return this._vertical}set vertical(A){this._vertical=mr(A)}_vertical=!1;get inset(){return this._inset}set inset(A){this._inset=mr(A)}_inset=!1;static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-divider"]],hostAttrs:["role","separator",1,"mat-divider"],hostVars:7,hostBindings:function(i,n){i&2&&(te("aria-orientation",n.vertical?"vertical":"horizontal"),RA("mat-divider-vertical",n.vertical)("mat-divider-horizontal",!n.vertical)("mat-divider-inset",n.inset))},inputs:{vertical:"vertical",inset:"inset"},decls:0,vars:0,template:function(i,n){},styles:[`.mat-divider{display:block;margin:0;border-top-style:solid;border-top-color:var(--mat-divider-color, var(--mat-sys-outline-variant));border-top-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-vertical{border-top:0;border-right-style:solid;border-right-color:var(--mat-divider-color, var(--mat-sys-outline-variant));border-right-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-inset{margin-left:80px}[dir=rtl] .mat-divider.mat-divider-inset{margin-left:auto;margin-right:80px} -`],encapsulation:2,changeDetection:0})}return t})(),gAA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();var TD=class t{themeService=w(eg);get currentTheme(){return this.themeService.currentTheme()}get themeIcon(){return this.currentTheme==="light"?"dark_mode":"light_mode"}get themeTooltip(){return this.currentTheme==="light"?"Switch to dark mode":"Switch to light mode"}toggleTheme(){this.themeService.toggleTheme()}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-theme-toggle"]],decls:3,vars:2,consts:[["mat-icon-button","","aria-label","Toggle theme",1,"theme-toggle-button",3,"click","matTooltip"]],template:function(A,i){A&1&&(B(0,"button",0),U("click",function(){return i.toggleTheme()}),B(1,"mat-icon"),y(2),Q()()),A&2&&(H("matTooltip",i.themeTooltip),u(2),lA(i.themeIcon))},dependencies:[Tn,Wt,qi,ji,Fa,dn],styles:[".theme-toggle-button[_ngcontent-%COMP%]{color:var(--side-panel-mat-icon-color);width:24px;height:24px;padding:0}.theme-toggle-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.theme-toggle-button[_ngcontent-%COMP%]:hover{opacity:.8}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color);border-radius:50%;transition:all .2s ease;margin-right:0!important}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);opacity:1}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}"]})};var cAA=(t,e)=>e.name;function UDA(t,e){if(t&1&&y(0),t&2){let A=p().$implicit;ue(" AgentTool: ",A.name," ")}}function TDA(t,e){if(t&1&&y(0),t&2){let A=p().$implicit;ue(" ",A.name," ")}}function JDA(t,e){t&1&&(B(0,"mat-icon",28),y(1,"chevron_right"),Q())}function ODA(t,e){if(t&1){let A=QA();B(0,"div",27),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.selectAgentFromBreadcrumb(n))}),O(1,UDA,1,1)(2,TDA,1,1),Q(),O(3,JDA,2,0,"mat-icon",28)}if(t&2){let A=e.$implicit,i=e.$index,n=p(2);RA("current-agent",(n.currentSelectedAgent==null?null:n.currentSelectedAgent.name)===A.name),u(),Y(i===0&&n.isInAgentToolContext()?1:2),u(2),Y(i0?0:-1)}}function AyA(t,e){if(t&1){let A=QA();B(0,"div",15)(1,"div",16)(2,"div"),y(3," Tools "),Q(),B(4,"div")(5,"button",40,2)(7,"mat-icon"),y(8,"add"),Q()(),B(9,"mat-menu",null,3)(11,"button",23),U("click",function(){T(A);let n=p();return J(n.addTool("Function tool"))}),B(12,"span"),y(13,"Function tool"),Q()(),B(14,"button",23),U("click",function(){T(A);let n=p();return J(n.addTool("Built-in tool"))}),B(15,"span"),y(16,"Built-in tool"),Q()(),B(17,"button",23),U("click",function(){T(A);let n=p();return J(n.createAgentTool())}),B(18,"span"),y(19,"Agent tool"),Q()()()()(),O(20,$DA,1,1),Ht(21,"async"),Q()}if(t&2){let A,i=Qi(10),n=p();u(5),H("matMenuTriggerFor",i),u(6),H("matTooltip",n.toolMenuTooltips("Function tool")),u(3),H("matTooltip",n.toolMenuTooltips("Built-in tool")),u(3),H("matTooltip",n.toolMenuTooltips("Agent tool")),u(3),Y((A=si(21,5,n.toolsMap$))?20:-1,A)}}function eyA(t,e){if(t&1){let A=QA();B(0,"mat-chip",43),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.selectAgent(n))}),B(1,"mat-icon",44),y(2),Q(),B(3,"span",45),y(4),Q(),B(5,"button",48),U("click",function(n){let o=T(A).$implicit;return p(2).deleteSubAgent(o.name),J(n.stopPropagation())}),B(6,"mat-icon"),y(7,"cancel"),Q()()()}if(t&2){let A=e.$implicit,i=p(2);u(2),lA(i.getAgentIcon(A.agent_class)),u(2),lA(A.name)}}function tyA(t,e){if(t&1&&(B(0,"div",20)(1,"mat-chip-set",47),Ue(2,eyA,8,2,"mat-chip",42,cAA),Q()()),t&2){let A=p();u(2),Te(A.agentConfig.sub_agents)}}function iyA(t,e){if(t&1){let A=QA();hA(0,"mat-divider"),B(1,"div",22),y(2,"Model (LLM) Interaction"),Q(),B(3,"button",23),U("click",function(){T(A);let n=p();return J(n.addCallback("before_model"))}),B(4,"span"),y(5,"Before Model"),Q()(),B(6,"button",23),U("click",function(){T(A);let n=p();return J(n.addCallback("after_model"))}),B(7,"span"),y(8,"After Model"),Q()(),hA(9,"mat-divider"),B(10,"div",22),y(11,"Tool Execution"),Q(),B(12,"button",23),U("click",function(){T(A);let n=p();return J(n.addCallback("before_tool"))}),B(13,"span"),y(14,"Before Tool"),Q()(),B(15,"button",23),U("click",function(){T(A);let n=p();return J(n.addCallback("after_tool"))}),B(16,"span"),y(17,"After Tool"),Q()()}if(t&2){let A=p();u(3),H("matTooltip",A.callbackMenuTooltips("before_model")),u(3),H("matTooltip",A.callbackMenuTooltips("after_model")),u(6),H("matTooltip",A.callbackMenuTooltips("before_tool")),u(3),H("matTooltip",A.callbackMenuTooltips("after_tool"))}}function nyA(t,e){if(t&1){let A=QA();B(0,"div",52),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.editCallback(n))}),B(1,"mat-chip",53)(2,"span",54)(3,"span",55),y(4),Q(),B(5,"span",56),y(6),Q()()(),B(7,"button",57),U("click",function(n){let o=T(A).$implicit,a=p(3);return a.deleteCallback(a.agentConfig.name,o),J(n.stopPropagation())}),B(8,"mat-icon"),y(9,"remove"),Q()()()}if(t&2){let A=e.$implicit;u(4),lA(A.type),u(2),lA(A.name)}}function oyA(t,e){if(t&1&&(B(0,"div",49)(1,"mat-chip-set",50),Ue(2,nyA,10,2,"div",51,ri),Q()()),t&2){let A=p(),i=p();u(2),Te(A.get(i.agentConfig.name))}}function ayA(t,e){if(t&1&&O(0,oyA,4,0,"div",49),t&2){let A=e,i=p();Y(i.agentConfig&&A.get(i.agentConfig.name)&&A.get(i.agentConfig.name).length>0?0:-1)}}var JD=class t{CALLBACKS_TAB_INDEX=3;jsonEditorComponent;appNameInput="";exitBuilderMode=new LA;closePanel=new LA;featureFlagService=w(yr);isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();toolArgsString=bA("");editingToolArgs=bA(!1);editingTool=null;selectedTabIndex=0;agentConfig={isRoot:!1,name:"",agent_class:"",model:"",instruction:"",sub_agents:[],tools:[],callbacks:[]};hierarchyPath=[];currentSelectedAgent=void 0;isRootAgentEditable=!0;models=["gemini-2.5-flash","gemini-2.5-pro"];agentTypes=["LlmAgent","LoopAgent","ParallelAgent","SequentialAgent"];agentBuilderService=w(e0);dialog=w(Or);agentService=w($s);snackBar=w(h2);router=w(ls);cdr=w(wt);selectedTool=void 0;toolAgentName="";toolTypes=["Custom tool","Function tool","Built-in tool","Agent Tool"];editingCallback=null;selectedCallback=void 0;callbackTypes=["before_agent","before_model","before_tool","after_tool","after_model","after_agent"];builtInTools=["EnterpriseWebSearchTool","exit_loop","FilesRetrieval","get_user_choice","google_search","load_artifacts","load_memory","LongRunningFunctionTool","preload_memory","url_context","VertexAiRagRetrieval","VertexAiSearchTool"];builtInToolArgs=new Map([["EnterpriseWebSearchTool",[]],["exit_loop",[]],["FilesRetrieval",["name","description","input_dir"]],["get_user_choice",[]],["google_search",[]],["load_artifacts",[]],["load_memory",[]],["LongRunningFunctionTool",["func"]],["preload_memory",[]],["url_context",[]],["VertexAiRagRetrieval",["name","description","rag_corpora","rag_resources","similarity_top_k","vector_distance_threshold"]],["VertexAiSearchTool",["data_store_id","data_store_specs","search_engine_id","filter","max_results"]]]);header="Select an agent or tool to edit";toolsMap$;callbacksMap$;getJsonStringForEditor(e){if(!e)return"{}";let A=gA({},e);return delete A.skip_summarization,JSON.stringify(A,null,2)}constructor(){this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.callbacksMap$=this.agentBuilderService.getAgentCallbacksMap(),this.agentBuilderService.getSelectedNode().subscribe(e=>{this.agentConfig=e,this.currentSelectedAgent=e,e&&(this.editingTool=null,this.editingCallback=null,this.header="Agent configuration",this.updateBreadcrumb(e)),this.cdr.markForCheck()}),this.agentBuilderService.getSelectedTool().subscribe(e=>{this.selectedTool=e,!(e&&e.toolType==="Agent Tool")&&(e?(this.editingTool=e,this.editingToolArgs.set(!1),setTimeout(()=>{let A=e.toolType=="Function tool"?"Function tool":e.name;if(e.toolType=="Function tool"&&!e.name&&(e.name="Function tool"),e.toolType==="Custom tool")e.args||(e.args={}),this.toolArgsString.set(this.getJsonStringForEditor(e.args)),this.editingToolArgs.set(!0);else{let i=this.builtInToolArgs.get(A);if(i){e.args||(e.args={});for(let n of i)e.args&&(e.args[n]="")}this.toolArgsString.set(this.getJsonStringForEditor(e.args)),e.args&&this.getObjectKeys(e.args).length>0&&this.editingToolArgs.set(!0)}this.cdr.markForCheck()}),this.selectedTabIndex=2):this.editingTool=null,this.cdr.markForCheck())}),this.agentBuilderService.getSelectedCallback().subscribe(e=>{this.selectedCallback=e,e?(this.selectCallback(e),this.selectedTabIndex=this.CALLBACKS_TAB_INDEX):this.editingCallback=null,this.cdr.markForCheck()}),this.agentBuilderService.getAgentCallbacks().subscribe(e=>{this.agentConfig&&e&&this.agentConfig.name===e.agentName&&(this.agentConfig=Ye(gA({},this.agentConfig),{callbacks:e.callbacks}),this.cdr.markForCheck())}),this.agentBuilderService.getSideTabChangeRequest().subscribe(e=>{e==="tools"?this.selectedTabIndex=2:e==="config"&&(this.selectedTabIndex=0)})}getObjectKeys(e){return e?Object.keys(e).filter(A=>A!=="skip_summarization"):[]}getCallbacksByType(){let e=new Map;return this.callbackTypes.forEach(A=>{e.set(A,[])}),this.agentConfig?.callbacks&&this.agentConfig.callbacks.forEach(A=>{let i=e.get(A.type);i&&i.push(A)}),e}updateBreadcrumb(e){this.hierarchyPath=this.buildHierarchyPath(e)}buildHierarchyPath(e){let A=[],i=this.findContextualRoot(e);return i?e.name===i.name?[i]:this.findPathToAgent(i,e,[i])||[e]:[e]}isInAgentToolContext(){return!this.hierarchyPath||this.hierarchyPath.length===0?!1:this.hierarchyPath[0]?.isAgentTool===!0}findContextualRoot(e){if(e.isAgentTool)return e;let A=this.agentBuilderService.getNodes();for(let n of A)if(n.isAgentTool&&this.findPathToAgent(n,e,[n]))return n;let i=this.agentBuilderService.getRootNode();if(i&&this.findPathToAgent(i,e,[i]))return i;if(e.isRoot)return e;for(let n of A)if(n.isRoot&&this.findPathToAgent(n,e,[n]))return n;return i}findPathToAgent(e,A,i){if(e.name===A.name)return i;for(let n of e.sub_agents){let o=[...i,n],a=this.findPathToAgent(n,A,o);if(a)return a}return null}selectAgentFromBreadcrumb(e){this.agentBuilderService.setSelectedNode(e),this.selectedTabIndex=0}selectAgent(e){this.agentBuilderService.setSelectedNode(e),this.selectedTabIndex=0}selectTool(e){if(e.toolType==="Agent Tool"){let A=e.name;this.agentBuilderService.requestNewTab(A);return}if(e.toolType==="Function tool"||e.toolType==="Built-in tool"){this.editTool(e);return}this.agentBuilderService.setSelectedTool(e)}editTool(e){if(!this.agentConfig)return;let A;e.toolType==="Built-in tool"?A=this.dialog.open(kd,{width:"700px",maxWidth:"90vw",data:{toolName:e.name,isEditMode:!0,toolArgs:e.args}}):A=this.dialog.open(v2,{width:"500px",data:{toolType:e.toolType,toolName:e.name,isEditMode:!0}}),A.afterClosed().subscribe(i=>{if(i&&i.isEditMode){let n=this.agentConfig.tools?.findIndex(o=>o.name===e.name);n!==void 0&&n!==-1&&this.agentConfig.tools&&(this.agentConfig.tools[n].name=i.name,i.args&&(this.agentConfig.tools[n].args=i.args),this.agentBuilderService.setAgentTools(this.agentConfig.name,this.agentConfig.tools))}})}addTool(e){if(this.agentConfig){let A;e==="Built-in tool"?A=this.dialog.open(kd,{width:"700px",maxWidth:"90vw",data:{}}):A=this.dialog.open(v2,{width:"500px",data:{toolType:e}}),A.afterClosed().subscribe(i=>{if(i){let n={toolType:i.toolType,name:i.name};this.agentBuilderService.addTool(this.agentConfig.name,n),this.agentBuilderService.setSelectedTool(n)}})}}addCallback(e){if(this.agentConfig){let A=this.agentConfig?.callbacks?.map(n=>n.name)??[];this.dialog.open(o4,{width:"500px",data:{callbackType:e,existingCallbackNames:A}}).afterClosed().subscribe(n=>{if(n){let o={name:n.name,type:n.type};this.agentBuilderService.addCallback(this.agentConfig.name,o)}})}}editCallback(e){if(!this.agentConfig)return;let A=this.agentConfig.callbacks?.map(n=>n.name)??[];this.dialog.open(o4,{width:"500px",data:{callbackType:e.type,existingCallbackNames:A,isEditMode:!0,callback:e,availableCallbackTypes:this.callbackTypes}}).afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=this.agentBuilderService.updateCallback(this.agentConfig.name,e.name,Ye(gA({},e),{name:n.name,type:n.type}));o.success?this.cdr.markForCheck():console.error("Failed to update callback:",o.error)}})}deleteCallback(e,A){this.dialog.open(vc,{data:{title:"Delete Callback",message:`Are you sure you want to delete ${A.name}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(n=>{if(n==="confirm"){let o=this.agentBuilderService.deleteCallback(e,A);o.success?this.cdr.markForCheck():console.error("Failed to delete callback:",o.error)}})}addSubAgent(e){e&&this.agentBuilderService.setAddSubAgentSubject(e)}deleteSubAgent(e){this.agentBuilderService.setDeleteSubAgentSubject(e)}deleteTool(e,A){let i=A.toolType==="Agent Tool",n=i&&A.toolAgentName||A.name;this.dialog.open(vc,{data:{title:i?"Delete Agent Tool":"Delete Tool",message:i?`Are you sure you want to delete the agent tool "${n}"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(a=>{if(a==="confirm")if(A.toolType==="Agent Tool"){let r=A.toolAgentName||A.name;this.deleteAgentToolAndBoard(e,A,r)}else this.agentBuilderService.deleteTool(e,A)})}deleteAgentToolAndBoard(e,A,i){this.agentBuilderService.deleteTool(e,A),this.agentBuilderService.requestTabDeletion(i)}backToToolList(){this.editingTool=null,this.agentBuilderService.setSelectedTool(void 0)}editToolArgs(){this.editingToolArgs.set(!0)}cancelEditToolArgs(e){this.editingToolArgs.set(!1),this.toolArgsString.set(this.getJsonStringForEditor(e?.args))}saveToolArgs(e){if(this.jsonEditorComponent&&e)try{let A=JSON.parse(this.jsonEditorComponent.getJsonString()),i=e.args?e.args.skip_summarization:!1;e.args=A,e.args.skip_summarization=i,this.toolArgsString.set(JSON.stringify(e.args,null,2)),this.editingToolArgs.set(!1)}catch(A){console.error("Error parsing tool arguments JSON",A)}}onToolTypeSelectionChange(e){e?.toolType==="Built-in tool"?(e.name="google_search",this.onBuiltInToolSelectionChange(e)):e?.toolType==="Custom tool"?(e.args={},this.toolArgsString.set(this.getJsonStringForEditor(e.args)),this.editingToolArgs.set(!0)):e&&(e.name="",e.args={skip_summarization:!1},this.toolArgsString.set("{}"),this.editingToolArgs.set(!1))}onBuiltInToolSelectionChange(e){e&&(this.editingToolArgs.set(!1),setTimeout(()=>{e.args={skip_summarization:!1};let A=this.builtInToolArgs.get(e.name);if(A)for(let i of A)e.args&&(e.args[i]="");this.toolArgsString.set(this.getJsonStringForEditor(e.args)),e.args&&this.getObjectKeys(e.args).length>0&&this.editingToolArgs.set(!0),this.cdr.markForCheck()}))}selectCallback(e){this.editingCallback=e}backToCallbackList(){this.editingCallback=null}onCallbackTypeChange(e){}createAgentTool(){this.dialog.open(vc,{width:"750px",height:"450px",data:{title:"Create Agent Tool",message:"Please enter a name for the agent tool:",confirmButtonText:"Create",showInput:!0,inputLabel:"Agent Tool Name",inputPlaceholder:"Enter agent tool name",showToolInfo:!0,toolType:"Agent tool"}}).afterClosed().subscribe(A=>{if(A&&typeof A=="string"){let i=this.agentConfig?.name||"root_agent";this.agentBuilderService.requestNewTab(A,i)}})}saveChanges(){if(!this.agentBuilderService.getRootNode()){this.snackBar.open("Please create an agent first.","OK");return}this.appNameInput?this.saveAgent(this.appNameInput):this.agentService.getApp().subscribe(A=>{A?this.saveAgent(A):this.snackBar.open("No agent selected. Please select an agent first.","OK")})}cancelChanges(){this.agentService.agentChangeCancel(this.appNameInput).subscribe(e=>{}),this.exitBuilderMode.emit()}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A){this.snackBar.open("Please create an agent first.","OK");return}let i=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();s0.generateYamlFile(A,i,e,n),this.agentService.agentBuildTmp(i).subscribe(o=>{o&&this.agentService.agentBuild(i).subscribe(a=>{a?this.router.navigate(["/"],{queryParams:{app:e}}).then(()=>{window.location.reload()}):this.snackBar.open("Something went wrong, please try again","OK")})})}getToolIcon(e){return sE(e.name,e.toolType)}getAgentIcon(e){switch(e){case"SequentialAgent":return"more_horiz";case"LoopAgent":return"sync";case"ParallelAgent":return"density_medium";default:return"psychology"}}addSubAgentWithType(e){if(!this.agentConfig?.name)return;let A=this.agentConfig.agent_class!=="LlmAgent";this.agentBuilderService.setAddSubAgentSubject(this.agentConfig.name,e,A)}callbackMenuTooltips(e){return tc.getCallbackMenuTooltips(e)}toolMenuTooltips(e){return tc.getToolMenuTooltips(e)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-builder-tabs"]],viewQuery:function(A,i){if(A&1&&Jt(yc,5),A&2){let n;ae(n=re())&&(i.jsonEditorComponent=n.first)}},inputs:{appNameInput:"appNameInput"},outputs:{exitBuilderMode:"exitBuilderMode",closePanel:"closePanel"},decls:77,vars:12,consts:[["subAgentMenu","matMenu"],["callbacksMenu","matMenu"],["agentMenuTrigger","matMenuTrigger"],["toolsMenu","matMenu"],[2,"margin-top","20px","margin-left","20px","display","flex"],[2,"width","100%"],[1,"drawer-header"],[1,"drawer-logo"],["src","assets/ADK-512-color.svg","width","32px","height","32px"],[2,"display","flex","align-items","center","gap","8px","margin-right","15px"],["matTooltip","Collapse panel",1,"material-symbols-outlined",2,"color","#c4c7c5","cursor","pointer",3,"click"],[1,"builder-tabs-container"],[1,"builder-tab-content"],[1,"agent-breadcrumb-container"],[1,"content-wrapper"],[1,"builder-panel-wrapper"],[1,"panel-title"],[1,"config-form"],["mat-icon-button","","type","button","aria-label","Add sub agent",1,"panel-action-button",3,"matMenuTriggerFor"],["mat-menu-item","",3,"click"],[1,"tools-chips-container"],["mat-icon-button","","type","button","aria-label","Add callback",1,"panel-action-button",3,"matMenuTriggerFor"],[1,"menu-header"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[1,"action-buttons"],["mat-raised-button","","color","secondary",1,"save-button",3,"click"],["mat-button","",1,"cancel-button",3,"click"],[1,"breadcrumb-chip",3,"click"],[1,"breadcrumb-arrow"],[1,"form-row"],[1,"agent-name-field"],["matInput","",3,"ngModelChange","ngModel","disabled"],[1,"agent-type-field"],["disabled","",3,"ngModelChange","ngModel"],[3,"value"],[3,"ngModel"],[3,"ngModelChange","ngModel"],["matInput","","rows","5",3,"ngModelChange","ngModel"],["matInput","","rows","3",3,"ngModelChange","ngModel"],["matInput","","type","number","min","1",3,"ngModelChange","ngModel"],["mat-icon-button","","type","button","aria-label","Add tool",1,"panel-action-button",3,"matMenuTriggerFor"],["aria-label","Tools"],[1,"tool-chip"],[1,"tool-chip",3,"click"],["matChipAvatar","",1,"tool-icon"],[1,"tool-chip-name"],["matChipRemove","","aria-label","Remove tool",3,"click"],["aria-label","Sub Agents"],["matChipRemove","","aria-label","Remove sub agent",3,"click"],[1,"tools-chips-container","callbacks-list"],["aria-label","Callbacks"],[1,"callback-row"],[1,"callback-row",3,"click"],[1,"callback-chip"],[1,"chip-content"],[1,"chip-type"],[1,"chip-name"],["mat-icon-button","","aria-label","Remove callback",1,"callback-remove",3,"click"]],template:function(A,i){if(A&1&&(B(0,"div",4)(1,"div",5)(2,"div",6)(3,"div",7),hA(4,"img",8),y(5," Agent Development Kit "),Q(),B(6,"div",9),hA(7,"app-theme-toggle"),B(8,"span",10),U("click",function(){return i.closePanel.emit()}),y(9,"left_panel_close"),Q()()()()(),B(10,"div",11)(11,"div",12),O(12,YDA,3,0,"div",13),B(13,"div",14)(14,"div",15)(15,"div",16),y(16," Configuration "),Q(),B(17,"div"),O(18,WDA,16,7,"div",17),Q()(),O(19,AyA,22,7,"div",15),B(20,"div",15)(21,"div",16)(22,"div"),y(23," Sub Agents "),Q(),B(24,"div")(25,"button",18)(26,"mat-icon"),y(27,"add"),Q()(),B(28,"mat-menu",null,0)(30,"button",19),U("click",function(){return i.addSubAgentWithType("LlmAgent")}),B(31,"mat-icon"),y(32,"psychology"),Q(),B(33,"span"),y(34,"LLM Agent"),Q()(),B(35,"button",19),U("click",function(){return i.addSubAgentWithType("SequentialAgent")}),B(36,"mat-icon"),y(37,"more_horiz"),Q(),B(38,"span"),y(39,"Sequential Agent"),Q()(),B(40,"button",19),U("click",function(){return i.addSubAgentWithType("LoopAgent")}),B(41,"mat-icon"),y(42,"sync"),Q(),B(43,"span"),y(44,"Loop Agent"),Q()(),B(45,"button",19),U("click",function(){return i.addSubAgentWithType("ParallelAgent")}),B(46,"mat-icon"),y(47,"density_medium"),Q(),B(48,"span"),y(49,"Parallel Agent"),Q()()()()(),O(50,tyA,4,0,"div",20),Q(),B(51,"div",15)(52,"div",16)(53,"div"),y(54," Callbacks "),Q(),B(55,"div")(56,"button",21)(57,"mat-icon"),y(58,"add"),Q()(),B(59,"mat-menu",null,1)(61,"div",22),y(62,"Agent Lifecycle"),Q(),B(63,"button",23),U("click",function(){return i.addCallback("before_agent")}),B(64,"span"),y(65,"Before Agent"),Q()(),B(66,"button",23),U("click",function(){return i.addCallback("after_agent")}),B(67,"span"),y(68,"After Agent"),Q()(),O(69,iyA,18,4),Q()()(),O(70,ayA,1,1),Ht(71,"async"),Q()(),B(72,"div",24)(73,"button",25),U("click",function(){return i.saveChanges()}),y(74," Save "),Q(),B(75,"button",26),U("click",function(){return i.cancelChanges()}),y(76," Cancel "),Q()()()()),A&2){let n,o=Qi(29),a=Qi(60);u(12),Y(i.hierarchyPath.length>0?12:-1),u(6),Y(i.agentConfig?18:-1),u(),Y((i.agentConfig==null?null:i.agentConfig.agent_class)==="LlmAgent"?19:-1),u(6),H("matMenuTriggerFor",o),u(25),Y(i.agentConfig&&i.agentConfig.sub_agents&&i.agentConfig.sub_agents.length>0?50:-1),u(6),H("matMenuTriggerFor",a),u(7),H("matTooltip",i.callbackMenuTooltips("before_agent")),u(3),H("matTooltip",i.callbackMenuTooltips("after_agent")),u(3),Y((i.agentConfig==null?null:i.agentConfig.agent_class)==="LlmAgent"?69:-1),u(),Y((n=si(71,10,i.callbacksMap$))?70:-1,n)}},dependencies:[li,ln,Dn,YQ,yn,ub,ko,pi,ec,tO,Ko,Wt,ua,ji,vs,Yr,Xl,dn,Zs,$c,Ml,UD,t3,aAA,rAA,oN,gAA,lAA,TD,os],styles:[".builder-tabs-container[_ngcontent-%COMP%]{width:100%;margin-top:40px;height:calc(95vh - 20px);display:flex;flex-direction:column}.agent-breadcrumb-container[_ngcontent-%COMP%]{padding:2px 20px 8px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;border-bottom:1px solid var(--builder-border-color)}.breadcrumb-chip[_ngcontent-%COMP%]{color:var(--builder-text-muted-color);font-family:Google Sans;font-size:16px;font-weight:500;border:none;cursor:pointer;transition:all .2s ease;padding:4px 8px;border-radius:4px;display:inline-block;-webkit-user-select:none;user-select:none}.breadcrumb-chip[_ngcontent-%COMP%]:hover{color:var(--builder-text-link-color)}.breadcrumb-chip.current-agent[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-weight:500}.breadcrumb-arrow[_ngcontent-%COMP%]{color:var(--builder-breadcrumb-separator-color);font-size:16px;width:16px;height:16px}.builder-tab-content[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);display:flex;flex-direction:column;flex:1;overflow:hidden}.builder-tab-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:8px 0;font-size:14px;line-height:1.5}.components-section[_ngcontent-%COMP%]{margin-bottom:32px}.components-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:14px;font-weight:500;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.config-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;margin-top:20px}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%]{display:flex;gap:16px;align-items:flex-start}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%] .agent-name-field[_ngcontent-%COMP%]{flex:1}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%] .agent-type-field[_ngcontent-%COMP%]{width:32%}.config-form[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.config-form[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{margin-bottom:8px}.config-form[_ngcontent-%COMP%] .tool-code-section[_ngcontent-%COMP%]{margin-top:16px}.config-form[_ngcontent-%COMP%] .tool-code-section[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0 0 8px;color:var(--builder-text-secondary-color);font-size:14px;font-weight:500}.config-form[_ngcontent-%COMP%] .tool-args-header[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:14px;font-weight:500;letter-spacing:.5px;text-transform:uppercase}.json-editor-wrapper[_ngcontent-%COMP%]{height:300px;max-height:300px}.tab-content-container[_ngcontent-%COMP%]{margin-top:20px;overflow-y:auto}.agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px}.sub-agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px;margin-left:16px}.tree-view[_ngcontent-%COMP%] expand-button[_ngcontent-%COMP%]{border:0}.node-item[_ngcontent-%COMP%]{display:flex;align-items:center}.node-icon[_ngcontent-%COMP%]{margin-right:14px}.node-name[_ngcontent-%COMP%]{margin-top:2px;display:flex;align-items:center}.no-tools-message[_ngcontent-%COMP%]{display:block;color:var(--builder-text-secondary-color);font-size:16px;margin-top:16px;margin-bottom:16px;text-align:center}.tools-list[_ngcontent-%COMP%]{list-style:none;padding:0}.tool-name[_ngcontent-%COMP%]{cursor:pointer;padding:11px;border-radius:8px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;color:var(--builder-text-primary-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.tool-name[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{visibility:hidden}.tool-name[_ngcontent-%COMP%]:hover button[_ngcontent-%COMP%]{visibility:visible}.tool-list-item-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px}.tools-chips-container[_ngcontent-%COMP%]{margin-top:12px;padding:0 4px}.tools-chips-container.callbacks-list[_ngcontent-%COMP%]{padding-right:0;padding-left:0}.callback-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;width:100%;cursor:pointer}.callback-remove[_ngcontent-%COMP%]{color:var(--builder-icon-color);cursor:pointer;width:32px;height:32px;min-width:32px;min-height:32px;display:inline-flex;align-items:center;justify-content:center;padding:0}.callback-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center;transform:translateY(.5px)}.back-button[_ngcontent-%COMP%]{margin-bottom:16px}.add-tool-button[_ngcontent-%COMP%]{width:100%;border:none;border-radius:4px;margin-top:12px;cursor:pointer}.add-tool-button-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.add-tool-button-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--builder-add-button-text-color);font-family:Google Sans;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.agent-tool-section[_ngcontent-%COMP%]{margin-top:16px;padding:16px;border:1px solid var(--builder-border-color);border-radius:8px}.agent-tool-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:16px;font-weight:500;margin:0 0 8px}.agent-tool-section[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;margin:0 0 16px;line-height:1.5}.agent-tool-section[_ngcontent-%COMP%] .create-agent-tool-btn[_ngcontent-%COMP%]{color:var(--builder-button-primary-text-color);font-weight:500}.no-callbacks-message[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:16px;margin-top:16px;text-align:center}.callback-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px}.callback-section[_ngcontent-%COMP%]{margin-top:16px}.callback-section[_ngcontent-%COMP%] .callback-section-label[_ngcontent-%COMP%]{margin:0 0 8px;color:var(--builder-text-secondary-color);font-size:14px;font-weight:500;text-transform:none}.callback-groups-wrapper[_ngcontent-%COMP%]{margin-top:16px}.callback-group[_ngcontent-%COMP%]{margin-top:5px}.callback-list[_ngcontent-%COMP%]{padding:8px 0}.no-callbacks-in-type[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;font-style:italic;padding:12px;text-align:center}.callback-item[_ngcontent-%COMP%]{cursor:pointer;padding:8px 12px;border-radius:4px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;color:var(--builder-text-primary-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.callback-item[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{visibility:hidden}.callback-item[_ngcontent-%COMP%]:hover button[_ngcontent-%COMP%]{visibility:visible}.add-callback-icon[_ngcontent-%COMP%]{color:var(--builder-button-primary-background-color)}mat-tab-group[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;padding:16px 20px 0;min-height:0}mat-tab-group[_ngcontent-%COMP%]{flex:1;padding-bottom:0;display:flex;flex-direction:column;overflow:hidden}.action-buttons[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;padding:16px 20px;border-top:1px solid var(--builder-border-color);flex-shrink:0;margin-top:auto}.action-buttons[_ngcontent-%COMP%] .save-button[_ngcontent-%COMP%]{color:var(--builder-button-primary-text-color);font-weight:500}.action-buttons[_ngcontent-%COMP%] .cancel-button[_ngcontent-%COMP%]{color:var(--builder-button-secondary-text-color);border:1px solid var(--builder-button-secondary-border-color)}.action-buttons[_ngcontent-%COMP%] .cancel-button[_ngcontent-%COMP%]:hover{color:var(--builder-button-secondary-hover-text-color)}.builder-panel-wrapper[_ngcontent-%COMP%]{border-bottom:1px solid var(--builder-border-color);padding:12px 24px}.panel-title[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color);font-family:Google Sans;font-size:16px;font-style:normal;font-weight:500;line-height:24px;display:flex;justify-content:space-between}.panel-title[_ngcontent-%COMP%] .panel-action-button[_ngcontent-%COMP%]{color:var(--builder-icon-color);width:32px;height:32px;min-width:32px;min-height:32px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;padding:0}.panel-title[_ngcontent-%COMP%] .panel-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center}.content-wrapper[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:9px}.drawer-logo[_ngcontent-%COMP%]{font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center}"],changeDetection:0})};var _I=new kA("MARKDOWN_COMPONENT");var ryA=["chatMessages"],syA=(t,e)=>({"user-message":t,"bot-message":e}),lyA=t=>({text:t,thought:!1});function gyA(t,e){t&1&&(B(0,"div",7)(1,"mat-icon",12),y(2,"smart_toy"),Q(),B(3,"h3"),y(4,"Assistant Ready"),Q(),B(5,"p"),y(6,"Your builder assistant is ready to help you build agents."),Q()())}function cyA(t,e){t&1&&(B(0,"div",15)(1,"span",16),y(2,"\u30FB\u30FB\u30FB"),Q()())}function CyA(t,e){if(t&1&&(B(0,"div",19),y(1),Q()),t&2){let A=p(3).$implicit;u(),lA(A.text)}}function IyA(t,e){if(t&1&&sn(0,20),t&2){let A=p(3).$implicit,i=p(2);H("ngComponentOutlet",i.markdownComponent)("ngComponentOutletInputs",Ks(2,lyA,A.text))}}function dyA(t,e){if(t&1&&(B(0,"div",18),y(1,"Assistant"),Q(),O(2,CyA,2,1,"div",19)(3,IyA,1,4,"ng-container",20)),t&2){let A=p(2).$implicit;u(2),Y(A.isError?2:3)}}function ByA(t,e){if(t&1&&(B(0,"div",17),y(1),Q()),t&2){let A=p(2).$implicit;u(),lA(A.text)}}function EyA(t,e){if(t&1&&O(0,dyA,4,1)(1,ByA,2,1,"div",17),t&2){let A=p().$implicit;Y(A.role==="bot"?0:1)}}function hyA(t,e){if(t&1&&(B(0,"div",13)(1,"mat-card",14),O(2,cyA,3,0,"div",15)(3,EyA,2,1),Q()()),t&2){let A=e.$implicit;H("ngClass",U0(2,syA,A.role==="user",A.role==="bot")),u(2),Y(A.isLoading?2:3)}}function QyA(t,e){if(t&1&&Ue(0,hyA,4,5,"div",13,ri),t&2){let A=p();Te(A.messages)}}var OD=class t{isVisible=!0;appName="";closePanel=new LA;reloadCanvas=new LA;assistantAppName="__adk_agent_builder_assistant";userId="user";currentSession="";userMessage="";messages=[];shouldAutoScroll=!1;isGenerating=!1;chatMessages;markdownComponent=w(_I);agentService=w($s);sessionService=w(Al);agentBuilderService=w(e0);constructor(){}ngOnInit(){this.sessionService.createSession(this.userId,this.assistantAppName).subscribe(e=>{this.currentSession=e.id;let A={appName:this.assistantAppName,userId:this.userId,sessionId:e.id,newMessage:{role:"user",parts:[{text:"hello"}]},streaming:!1,stateDelta:{root_directory:`${this.appName}/tmp/${this.appName}`}};this.messages.push({role:"bot",text:"",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0,this.agentService.runSse(A).subscribe({next:i=>lt(this,null,function*(){if(i.errorCode){let n=this.messages[this.messages.length-1];n.role==="bot"&&n.isLoading&&(n.text=`Error Code: ${i.errorCode}`,n.isLoading=!1,n.isError=!0,this.shouldAutoScroll=!0),this.isGenerating=!1;return}if(i.content){let n="";for(let o of i.content.parts)o.text&&(n+=o.text);if(n){let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text=n,o.isLoading=!1,this.shouldAutoScroll=!0)}}}),error:i=>{console.error("SSE error:",i);let n=this.messages[this.messages.length-1];n.role==="bot"&&n.isLoading&&(n.text="Sorry, I encountered an error. Please try again.",n.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})})}onClosePanel(){this.closePanel.emit()}sendMessage(e){if(e.trim()){this.saveAgent(this.appName),e!="____Something went wrong, please try again"&&this.messages.push({role:"user",text:e});let A=e;this.userMessage="",this.messages.push({role:"bot",text:"",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0;let i={appName:this.assistantAppName,userId:this.userId,sessionId:this.currentSession,newMessage:{role:"user",parts:[{text:A}]},streaming:!1};this.agentService.runSse(i).subscribe({next:n=>lt(this,null,function*(){if(n.errorCode){let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text=`Error Code: ${n.errorCode}`,o.isLoading=!1,o.isError=!0,this.shouldAutoScroll=!0),this.isGenerating=!1;return}if(n.content){let o="";for(let a of n.content.parts)a.text&&(o+=a.text);if(o){let a=this.messages[this.messages.length-1];a.role==="bot"&&a.isLoading&&(a.text=o,a.isLoading=!1,this.shouldAutoScroll=!0,this.reloadCanvas.emit())}}}),error:n=>{console.error("SSE error:",n);let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text="Sorry, I encountered an error. Please try again.",o.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})}}ngAfterViewChecked(){this.shouldAutoScroll&&(this.scrollToBottom(),this.shouldAutoScroll=!1)}scrollToBottom(){try{this.chatMessages&&setTimeout(()=>{this.chatMessages.nativeElement.scrollTop=this.chatMessages.nativeElement.scrollHeight},50)}catch(e){console.error("Error scrolling to bottom:",e)}}onKeyDown(e){if(e.key==="Enter"){if(e.shiftKey)return;this.userMessage?.trim()&&this.currentSession&&(e.preventDefault(),this.sendMessage(this.userMessage))}}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A)return;let i=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();s0.generateYamlFile(A,i,e,n),this.agentService.agentBuildTmp(i).subscribe(o=>{console.log(o?"save to tmp":"something went wrong")})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-builder-assistant"]],viewQuery:function(A,i){if(A&1&&Jt(ryA,5),A&2){let n;ae(n=re())&&(i.chatMessages=n.first)}},inputs:{isVisible:"isVisible",appName:"appName"},outputs:{closePanel:"closePanel",reloadCanvas:"reloadCanvas"},decls:21,vars:6,consts:[["chatMessages",""],[1,"builder-assistant-panel"],[1,"panel-header"],[1,"panel-title"],["mat-icon-button","","matTooltip","Close assistant panel",1,"close-btn",3,"click"],[1,"panel-content"],[1,"chat-messages"],[1,"assistant-placeholder"],[1,"chat-input-container"],[1,"input-wrapper"],["cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","5","placeholder","Ask Gemini to build your agent",1,"assistant-input-box",3,"ngModelChange","keydown","ngModel","disabled"],["mat-icon-button","","matTooltip","Send message",1,"send-button",3,"click","disabled"],[1,"large-icon"],[3,"ngClass"],[1,"message-card"],[1,"loading-message"],[1,"dots"],[1,"message-text"],[1,"bot-label"],[1,"error-message"],[3,"ngComponentOutlet","ngComponentOutletInputs"]],template:function(A,i){if(A&1){let n=QA();B(0,"div",1)(1,"div",2)(2,"div",3)(3,"mat-icon"),y(4,"auto_awesome"),Q(),B(5,"span"),y(6,"Assistant"),Q()(),B(7,"button",4),U("click",function(){return i.onClosePanel()}),B(8,"mat-icon"),y(9,"close"),Q()()(),B(10,"div",5)(11,"div",6,0),O(13,gyA,7,0,"div",7)(14,QyA,2,0),Q(),B(15,"div",8)(16,"div",9)(17,"textarea",10),Di("ngModelChange",function(a){return T(n),Bi(i.userMessage,a)||(i.userMessage=a),J(a)}),U("keydown",function(a){return i.onKeyDown(a)}),Q(),B(18,"button",11),U("click",function(){return i.sendMessage(i.userMessage.trim())}),B(19,"mat-icon"),y(20,"send"),Q()()()()()()}A&2&&(RA("hidden",!i.isVisible),u(13),Y(i.messages.length===0?13:14),u(4),wi("ngModel",i.userMessage),H("disabled",i.isGenerating),u(),H("disabled",!i.userMessage.trim()||i.isGenerating))},dependencies:[li,zl,Tc,ln,Dn,yn,ko,Wt,ji,dn,Nm,lB,_p],styles:[".builder-assistant-panel[_ngcontent-%COMP%]{position:fixed;right:0;top:72px;width:400px;height:calc(100vh - 72px);background-color:var(--mat-sys-surface-container);border-left:1px solid var(--mat-sys-outline-variant);box-shadow:-2px 0 10px #0006;display:flex;flex-direction:column;transition:transform .3s ease}.builder-assistant-panel.hidden[_ngcontent-%COMP%]{transform:translate(100%)}.panel-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--mat-sys-outline-variant)}.panel-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-weight:400;font-size:16px;color:var(--mat-sys-on-surface);font-family:Google Sans,Helvetica Neue,sans-serif}.panel-title[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);font-size:20px;width:20px;height:20px}.close-btn[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)}.close-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.panel-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden}.assistant-placeholder[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;height:300px;color:var(--mat-sys-on-surface-variant)}.assistant-placeholder[_ngcontent-%COMP%] .large-icon[_ngcontent-%COMP%]{font-size:64px;width:64px;height:64px;margin-bottom:16px;color:var(--mat-sys-primary)}.assistant-placeholder[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0 0 8px;font-size:20px;font-weight:500;color:var(--mat-sys-on-surface);font-family:Google Sans,Helvetica Neue,sans-serif}.assistant-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5;color:var(--mat-sys-on-surface-variant)}.chat-messages[_ngcontent-%COMP%]{flex:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column}.chat-input-container[_ngcontent-%COMP%]{padding:16px 20px 20px;border-top:none}.input-wrapper[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:50px;padding:10px 6px 10px 18px;gap:8px}.assistant-input-box[_ngcontent-%COMP%]{flex:1;color:var(--mat-sys-on-surface);background-color:transparent;border:none;padding:0;resize:none;overflow:hidden;font-family:Google Sans,Helvetica Neue,sans-serif;font-size:14px;line-height:20px;min-height:20px;max-height:120px}.assistant-input-box[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant);font-size:14px}.assistant-input-box[_ngcontent-%COMP%]:focus{outline:none}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar{width:4px}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background-color:var(--mat-sys-outline);border-radius:4px}.send-button[_ngcontent-%COMP%]{color:var(--mat-sys-primary);width:36px;height:36px;min-width:36px;flex-shrink:0;margin:0;padding:0}.send-button[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-outline)}.send-button[_ngcontent-%COMP%]:hover:not(:disabled){color:var(--mat-sys-primary);border-radius:50%}.send-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.message-card[_ngcontent-%COMP%]{padding:10px 16px;margin:6px 0;font-size:14px;font-weight:400;position:relative;display:block;box-shadow:none;line-height:1.5;width:100%}.user-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:12px}.user-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{border:1px solid var(--mat-sys-outline-variant);border-radius:4px;color:var(--mat-sys-on-surface);padding:8px 12px}.bot-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:0}.bot-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{border:none;border-radius:0;color:var(--mat-sys-on-surface);padding:0;margin:0}.bot-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;font-family:Google Sans,Helvetica Neue,sans-serif}.error-message[_ngcontent-%COMP%]{color:var(--mat-app-warn, #d32f2f);font-family:Google Sans,Helvetica Neue,sans-serif;font-size:14px;white-space:pre-line;word-break:break-word;padding:8px 12px}.message-text[_ngcontent-%COMP%]{white-space:pre-line;word-break:break-word;overflow-wrap:break-word;font-family:Google Sans,Helvetica Neue,sans-serif}.message-text[_ngcontent-%COMP%] p{margin:0;line-height:1.4}.message-text[_ngcontent-%COMP%] p:first-child{margin-top:0}.message-text[_ngcontent-%COMP%] p:last-child{margin-bottom:0}.message-text[_ngcontent-%COMP%] ul, .message-text[_ngcontent-%COMP%] ol{margin:0;padding-left:1.5em}.message-text[_ngcontent-%COMP%] li{margin:0}.message-text[_ngcontent-%COMP%] code{padding:2px 4px;border-radius:3px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.9em}.message-text[_ngcontent-%COMP%] pre{padding:8px 12px;border-radius:6px;overflow-x:auto;margin:.5em 0}.message-text[_ngcontent-%COMP%] pre code{padding:0}.message-text[_ngcontent-%COMP%] blockquote{border-left:3px solid var(--mat-sys-primary);padding-left:12px;margin:.5em 0;font-style:italic;color:var(--mat-sys-on-surface-variant)}.message-text[_ngcontent-%COMP%] strong{font-weight:600}.message-text[_ngcontent-%COMP%] em{font-style:italic}.loading-message[_ngcontent-%COMP%]{display:flex;align-items:center;color:var(--mat-sys-on-surface-variant);font-family:Google Sans,Helvetica Neue,sans-serif;padding:0;margin:0}.loading-message[_ngcontent-%COMP%] .dots[_ngcontent-%COMP%]{font-size:24px;letter-spacing:-12px;animation:_ngcontent-%COMP%_pulse 1.4s ease-in-out infinite;display:inline-block;line-height:1}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:.3}50%{opacity:1}}"]})};var eQ=class t{constructor(e,A){this.http=e;this.zone=A}apiServerDomain=Dr.getApiServerBaseUrl();_currentApp=new ei("");currentApp=this._currentApp.asObservable();isLoading=new ei(!1);getApp(){return this.currentApp}setApp(e){this._currentApp.next(e)}getLoadingState(){return this.isLoading}runSse(e){let A=this.apiServerDomain+"/run_sse";return this.isLoading.next(!0),new vi(i=>{let n=this;fetch(A,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream"},body:JSON.stringify(e)}).then(o=>{let a=o.body?.getReader(),r=new TextDecoder("utf-8"),s="",l=()=>{a?.read().then(({done:g,value:C})=>{if(this.isLoading.next(!0),g)return this.isLoading.next(!1),i.complete();let I=r.decode(C,{stream:!0});s+=I;try{s.split(/\r?\n/).filter(h=>h.startsWith("data:")).forEach(h=>{let E=h.replace(/^data:\s*/,""),f=JSON.parse(E);n.zone.run(()=>i.next(f))}),s=""}catch(d){d instanceof SyntaxError&&l()}l()}).catch(g=>{n.zone.run(()=>i.error(g))})};l()}).catch(o=>{n.zone.run(()=>i.error(o))})})}listApps(){if(this.apiServerDomain!=null){let e=this.apiServerDomain+"/list-apps?relative_path=./";return this.http.get(e)}return new vi}getVersion(){if(this.apiServerDomain!=null){let e=this.apiServerDomain+"/version";return this.http.get(e)}return new vi}agentBuild(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+"/builder/save";return this.http.post(A,e)}return new vi}agentBuildTmp(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+"/builder/save?tmp=true";return this.http.post(A,e)}return new vi}getAgentBuilder(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/builder/app/${e}?ts=${Date.now()}`;return this.http.get(A,{responseType:"text"})}return new vi}getAgentBuilderTmp(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/builder/app/${e}?ts=${Date.now()}&tmp=true`;return this.http.get(A,{responseType:"text"})}return new vi}getSubAgentBuilder(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/builder/app/${e}?ts=${Date.now()}&file_path=${A}&tmp=true`;return this.http.get(i,{responseType:"text"})}return new vi}agentChangeCancel(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/builder/app/${e}/cancel`;return this.http.post(A,{})}return new vi}getAppInfo(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/build_graph/${e}`;return this.http.get(A)}return new vi}getAppGraphImage(e,A,i){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/dev/build_graph_image/${e}`,o={dark_mode:A};return i&&(o.node=i),this.http.get(n,{params:o})}return new vi}static \u0275fac=function(A){return new(A||t)(Lo(fr),Lo(qe))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var YD="http://www.w3.org/1999/xhtml",rN={svg:"http://www.w3.org/2000/svg",xhtml:YD,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function YC(t){var e=t+="",A=e.indexOf(":");return A>=0&&(e=t.slice(0,A))!=="xmlns"&&(t=t.slice(A+1)),rN.hasOwnProperty(e)?{space:rN[e],local:t}:t}function fyA(t){return function(){var e=this.ownerDocument,A=this.namespaceURI;return A===YD&&e.documentElement.namespaceURI===YD?e.createElement(t):e.createElementNS(A,t)}}function pyA(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function HD(t){var e=YC(t);return(e.local?pyA:fyA)(e)}function myA(){}function xd(t){return t==null?myA:function(){return this.querySelector(t)}}function CAA(t){typeof t!="function"&&(t=xd(t));for(var e=this._groups,A=e.length,i=new Array(A),n=0;n=k&&(k=v+1);!(b=f[k])&&++k=0;)(a=i[n])&&(o&&a.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(a,o),o=a);return this}function DAA(t){t||(t=FyA);function e(C,I){return C&&I?t(C.__data__,I.__data__):!C-!I}for(var A=this._groups,i=A.length,n=new Array(i),o=0;oe?1:t>=e?0:NaN}function yAA(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function vAA(){return Array.from(this)}function bAA(){for(var t=this._groups,e=0,A=t.length;e1?this.each((e==null?OyA:typeof e=="function"?HyA:YyA)(t,e,A??"")):RI(this.node(),t)}function RI(t,e){return t.style.getPropertyValue(e)||jD(t).getComputedStyle(t,null).getPropertyValue(e)}function zyA(t){return function(){delete this[t]}}function PyA(t,e){return function(){this[t]=e}}function jyA(t,e){return function(){var A=e.apply(this,arguments);A==null?delete this[t]:this[t]=A}}function RAA(t,e){return arguments.length>1?this.each((e==null?zyA:typeof e=="function"?jyA:PyA)(t,e)):this.node()[t]}function NAA(t){return t.trim().split(/^|\s+/)}function lN(t){return t.classList||new FAA(t)}function FAA(t){this._node=t,this._names=NAA(t.getAttribute("class")||"")}FAA.prototype={add:function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function LAA(t,e){for(var A=lN(t),i=-1,n=e.length;++i=0&&(A=e.slice(i+1),e=e.slice(0,i)),{type:e,name:A}})}function cvA(t){return function(){var e=this.__on;if(e){for(var A=0,i=-1,n=e.length,o;A{}};function eeA(){for(var t=0,e=arguments.length,A={},i;t=0&&(i=A.slice(n+1),A=A.slice(0,n)),A&&!e.hasOwnProperty(A))throw new Error("unknown type: "+A);return{type:A,name:i}})}qD.prototype=eeA.prototype={constructor:qD,on:function(t,e){var A=this._,i=hvA(t+"",A),n,o=-1,a=i.length;if(arguments.length<2){for(;++o0)for(var A=new Array(n),i=0,n,o;i()=>t;function l3(t,{sourceEvent:e,subject:A,target:i,identifier:n,active:o,x:a,y:r,dx:s,dy:l,dispatch:g}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:A,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},identifier:{value:n,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:r,enumerable:!0,configurable:!0},dx:{value:s,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:g}})}l3.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function uvA(t){return!t.ctrlKey&&!t.button}function fvA(){return this.parentNode}function pvA(t,e){return e??{x:t.x,y:t.y}}function mvA(){return navigator.maxTouchPoints||"ontouchstart"in this}function WD(){var t=uvA,e=fvA,A=pvA,i=mvA,n={},o=_d("start","drag","end"),a=0,r,s,l,g,C=0;function I(S){S.on("mousedown.drag",d).filter(i).on("touchstart.drag",f).on("touchmove.drag",m,teA).on("touchend.drag touchcancel.drag",v).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(S,b){if(!(g||!t.call(this,S,b))){var x=k(this,e.call(this,S,b),S,b,"mouse");x&&(Nr(S.view).on("mousemove.drag",h,Rd).on("mouseup.drag",E,Rd),a3(S.view),VD(S),l=!1,r=S.clientX,s=S.clientY,x("start",S))}}function h(S){if(NI(S),!l){var b=S.clientX-r,x=S.clientY-s;l=b*b+x*x>C}n.mouse("drag",S)}function E(S){Nr(S.view).on("mousemove.drag mouseup.drag",null),r3(S.view,l),NI(S),n.mouse("end",S)}function f(S,b){if(t.call(this,S,b)){var x=S.changedTouches,F=e.call(this,S,b),z=x.length,P,Z;for(P=0;P>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):A===8?XD(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):A===4?XD(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=DvA.exec(t))?new hl(e[1],e[2],e[3],1):(e=yvA.exec(t))?new hl(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=vvA.exec(t))?XD(e[1],e[2],e[3],e[4]):(e=bvA.exec(t))?XD(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=MvA.exec(t))?leA(e[1],e[2]/100,e[3]/100,1):(e=SvA.exec(t))?leA(e[1],e[2]/100,e[3]/100,e[4]):ieA.hasOwnProperty(t)?aeA(ieA[t]):t==="transparent"?new hl(NaN,NaN,NaN,0):null}function aeA(t){return new hl(t>>16&255,t>>8&255,t&255,1)}function XD(t,e,A,i){return i<=0&&(t=e=A=NaN),new hl(t,e,A,i)}function _vA(t){return t instanceof C3||(t=FI(t)),t?(t=t.rgb(),new hl(t.r,t.g,t.b,t.opacity)):new hl}function iQ(t,e,A,i){return arguments.length===1?_vA(t):new hl(t,e,A,i??1)}function hl(t,e,A,i){this.r=+t,this.g=+e,this.b=+A,this.opacity=+i}ZD(hl,iQ,cN(C3,{brighter(t){return t=t==null?Ay:Math.pow(Ay,t),new hl(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?g3:Math.pow(g3,t),new hl(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new hl(Fd(this.r),Fd(this.g),Fd(this.b),ey(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:reA,formatHex:reA,formatHex8:RvA,formatRgb:seA,toString:seA}));function reA(){return`#${Nd(this.r)}${Nd(this.g)}${Nd(this.b)}`}function RvA(){return`#${Nd(this.r)}${Nd(this.g)}${Nd(this.b)}${Nd((isNaN(this.opacity)?1:this.opacity)*255)}`}function seA(){let t=ey(this.opacity);return`${t===1?"rgb(":"rgba("}${Fd(this.r)}, ${Fd(this.g)}, ${Fd(this.b)}${t===1?")":`, ${t})`}`}function ey(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Fd(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Nd(t){return t=Fd(t),(t<16?"0":"")+t.toString(16)}function leA(t,e,A,i){return i<=0?t=e=A=NaN:A<=0||A>=1?t=e=NaN:e<=0&&(t=NaN),new bc(t,e,A,i)}function ceA(t){if(t instanceof bc)return new bc(t.h,t.s,t.l,t.opacity);if(t instanceof C3||(t=FI(t)),!t)return new bc;if(t instanceof bc)return t;t=t.rgb();var e=t.r/255,A=t.g/255,i=t.b/255,n=Math.min(e,A,i),o=Math.max(e,A,i),a=NaN,r=o-n,s=(o+n)/2;return r?(e===o?a=(A-i)/r+(A0&&s<1?0:a,new bc(a,r,s,t.opacity)}function CeA(t,e,A,i){return arguments.length===1?ceA(t):new bc(t,e,A,i??1)}function bc(t,e,A,i){this.h=+t,this.s=+e,this.l=+A,this.opacity=+i}ZD(bc,CeA,cN(C3,{brighter(t){return t=t==null?Ay:Math.pow(Ay,t),new bc(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?g3:Math.pow(g3,t),new bc(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,A=this.l,i=A+(A<.5?A:1-A)*e,n=2*A-i;return new hl(CN(t>=240?t-240:t+120,n,i),CN(t,n,i),CN(t<120?t+240:t-120,n,i),this.opacity)},clamp(){return new bc(geA(this.h),$D(this.s),$D(this.l),ey(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=ey(this.opacity);return`${t===1?"hsl(":"hsla("}${geA(this.h)}, ${$D(this.s)*100}%, ${$D(this.l)*100}%${t===1?")":`, ${t})`}`}}));function geA(t){return t=(t||0)%360,t<0?t+360:t}function $D(t){return Math.max(0,Math.min(1,t||0))}function CN(t,e,A){return(t<60?e+(A-e)*t/60:t<180?A:t<240?e+(A-e)*(240-t)/60:e)*255}function IN(t,e,A,i,n){var o=t*t,a=o*t;return((1-3*t+3*o-a)*e+(4-6*o+3*a)*A+(1+3*t+3*o-3*a)*i+a*n)/6}function IeA(t){var e=t.length-1;return function(A){var i=A<=0?A=0:A>=1?(A=1,e-1):Math.floor(A*e),n=t[i],o=t[i+1],a=i>0?t[i-1]:2*n-o,r=i()=>t;function NvA(t,e){return function(A){return t+A*e}}function FvA(t,e,A){return t=Math.pow(t,A),e=Math.pow(e,A)-t,A=1/A,function(i){return Math.pow(t+i*e,A)}}function BeA(t){return(t=+t)==1?ty:function(e,A){return A-e?FvA(e,A,t):dN(isNaN(e)?A:e)}}function ty(t,e){var A=e-t;return A?NvA(t,A):dN(isNaN(t)?e:t)}var iy=(function t(e){var A=BeA(e);function i(n,o){var a=A((n=iQ(n)).r,(o=iQ(o)).r),r=A(n.g,o.g),s=A(n.b,o.b),l=ty(n.opacity,o.opacity);return function(g){return n.r=a(g),n.g=r(g),n.b=s(g),n.opacity=l(g),n+""}}return i.gamma=t,i})(1);function EeA(t){return function(e){var A=e.length,i=new Array(A),n=new Array(A),o=new Array(A),a,r;for(a=0;aA&&(o=e.slice(A,o),r[a]?r[a]+=o:r[++a]=o),(i=i[0])===(n=n[0])?r[a]?r[a]+=n:r[++a]=n:(r[++a]=null,s.push({i:a,x:vg(i,n)})),A=BN.lastIndex;return A180?g+=360:g-l>180&&(l+=360),I.push({i:C.push(n(C)+"rotate(",null,i)-2,x:vg(l,g)})):g&&C.push(n(C)+"rotate("+g+i)}function r(l,g,C,I){l!==g?I.push({i:C.push(n(C)+"skewX(",null,i)-2,x:vg(l,g)}):g&&C.push(n(C)+"skewX("+g+i)}function s(l,g,C,I,d,h){if(l!==C||g!==I){var E=d.push(n(d)+"scale(",null,",",null,")");h.push({i:E-4,x:vg(l,C)},{i:E-2,x:vg(g,I)})}else(C!==1||I!==1)&&d.push(n(d)+"scale("+C+","+I+")")}return function(l,g){var C=[],I=[];return l=t(l),g=t(g),o(l.translateX,l.translateY,g.translateX,g.translateY,C,I),a(l.rotate,g.rotate,C,I),r(l.skewX,g.skewX,C,I),s(l.scaleX,l.scaleY,g.scaleX,g.scaleY,C,I),l=g=null,function(d){for(var h=-1,E=I.length,f;++h=0&&t._call.call(void 0,e),t=t._next;--nQ}function meA(){Ld=(ry=E3.now())+sy,nQ=d3=0;try{yeA()}finally{nQ=0,zvA(),Ld=0}}function HvA(){var t=E3.now(),e=t-ry;e>weA&&(sy-=e,ry=t)}function zvA(){for(var t,e=ay,A,i=1/0;e;)e._call?(i>e._time&&(i=e._time),t=e,e=e._next):(A=e._next,e._next=null,e=t?t._next=A:ay=A);B3=t,mN(i)}function mN(t){if(!nQ){d3&&(d3=clearTimeout(d3));var e=t-Ld;e>24?(t<1/0&&(d3=setTimeout(meA,t-E3.now()-sy)),I3&&(I3=clearInterval(I3))):(I3||(ry=E3.now(),I3=setInterval(HvA,weA)),nQ=1,DeA(meA))}}function gy(t,e,A){var i=new h3;return e=e==null?0:+e,i.restart(n=>{i.stop(),t(n+e)},e,A),i}var PvA=_d("start","end","cancel","interrupt"),jvA=[],MeA=0,veA=1,Cy=2,cy=3,beA=4,Iy=5,u3=6;function LI(t,e,A,i,n,o){var a=t.__transition;if(!a)t.__transition={};else if(A in a)return;qvA(t,A,{name:e,index:i,group:n,on:PvA,tween:jvA,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:MeA})}function f3(t,e){var A=Br(t,e);if(A.state>MeA)throw new Error("too late; already scheduled");return A}function es(t,e){var A=Br(t,e);if(A.state>cy)throw new Error("too late; already running");return A}function Br(t,e){var A=t.__transition;if(!A||!(A=A[e]))throw new Error("transition not found");return A}function qvA(t,e,A){var i=t.__transition,n;i[e]=A,A.timer=ly(o,0,A.time);function o(l){A.state=veA,A.timer.restart(a,A.delay,A.time),A.delay<=l&&a(l-A.delay)}function a(l){var g,C,I,d;if(A.state!==veA)return s();for(g in i)if(d=i[g],d.name===A.name){if(d.state===cy)return gy(a);d.state===beA?(d.state=u3,d.timer.stop(),d.on.call("interrupt",t,t.__data__,d.index,d.group),delete i[g]):+gCy&&i.state=0&&(e=e.slice(0,A)),!e||e==="start"})}function dbA(t,e,A){var i,n,o=IbA(e)?f3:es;return function(){var a=o(this,t),r=a.on;r!==i&&(n=(i=r).copy()).on(e,A),a.on=n}}function UeA(t,e){var A=this._id;return arguments.length<2?Br(this.node(),A).on.on(t):this.each(dbA(A,t,e))}function BbA(t){return function(){var e=this.parentNode;for(var A in this.__transition)if(+A!==t)return;e&&e.removeChild(this)}}function TeA(){return this.on("end.remove",BbA(this._id))}function JeA(t){var e=this._name,A=this._id;typeof t!="function"&&(t=xd(t));for(var i=this._groups,n=i.length,o=new Array(n),a=0;a()=>t;function wN(t,{sourceEvent:e,target:A,transform:i,dispatch:n}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:A,enumerable:!0,configurable:!0},transform:{value:i,enumerable:!0,configurable:!0},_:{value:n}})}function Mc(t,e,A){this.k=t,this.x=e,this.y=A}Mc.prototype={constructor:Mc,scale:function(t){return t===1?this:new Mc(this.k*t,this.x,this.y)},translate:function(t,e){return t===0&e===0?this:new Mc(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var GI=new Mc(1,0,0);DN.prototype=Mc.prototype;function DN(t){for(;!t.__zoom;)if(!(t=t.parentNode))return GI;return t.__zoom}function hy(t){t.stopImmediatePropagation()}function aQ(t){t.preventDefault(),t.stopImmediatePropagation()}function kbA(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function xbA(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function $eA(){return this.__zoom||GI}function _bA(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function RbA(){return navigator.maxTouchPoints||"ontouchstart"in this}function NbA(t,e,A){var i=t.invertX(e[0][0])-A[0][0],n=t.invertX(e[1][0])-A[1][0],o=t.invertY(e[0][1])-A[0][1],a=t.invertY(e[1][1])-A[1][1];return t.translate(n>i?(i+n)/2:Math.min(0,i)||Math.max(0,n),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}function yN(){var t=kbA,e=xbA,A=NbA,i=_bA,n=RbA,o=[0,1/0],a=[[-1/0,-1/0],[1/0,1/0]],r=250,s=pN,l=_d("start","zoom","end"),g,C,I,d=500,h=150,E=0,f=10;function m(X){X.property("__zoom",$eA).on("wheel.zoom",z,{passive:!1}).on("mousedown.zoom",P).on("dblclick.zoom",Z).filter(n).on("touchstart.zoom",tA).on("touchmove.zoom",W).on("touchend.zoom touchcancel.zoom",BA).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}m.transform=function(X,iA,AA,IA){var aA=X.selection?X.selection():X;aA.property("__zoom",$eA),X!==aA?b(X,iA,AA,IA):aA.interrupt().each(function(){x(this,arguments).event(IA).start().zoom(null,typeof iA=="function"?iA.apply(this,arguments):iA).end()})},m.scaleBy=function(X,iA,AA,IA){m.scaleTo(X,function(){var aA=this.__zoom.k,rA=typeof iA=="function"?iA.apply(this,arguments):iA;return aA*rA},AA,IA)},m.scaleTo=function(X,iA,AA,IA){m.transform(X,function(){var aA=e.apply(this,arguments),rA=this.__zoom,uA=AA==null?S(aA):typeof AA=="function"?AA.apply(this,arguments):AA,UA=rA.invert(uA),$A=typeof iA=="function"?iA.apply(this,arguments):iA;return A(k(v(rA,$A),uA,UA),aA,a)},AA,IA)},m.translateBy=function(X,iA,AA,IA){m.transform(X,function(){return A(this.__zoom.translate(typeof iA=="function"?iA.apply(this,arguments):iA,typeof AA=="function"?AA.apply(this,arguments):AA),e.apply(this,arguments),a)},null,IA)},m.translateTo=function(X,iA,AA,IA,aA){m.transform(X,function(){var rA=e.apply(this,arguments),uA=this.__zoom,UA=IA==null?S(rA):typeof IA=="function"?IA.apply(this,arguments):IA;return A(GI.translate(UA[0],UA[1]).scale(uA.k).translate(typeof iA=="function"?-iA.apply(this,arguments):-iA,typeof AA=="function"?-AA.apply(this,arguments):-AA),rA,a)},IA,aA)};function v(X,iA){return iA=Math.max(o[0],Math.min(o[1],iA)),iA===X.k?X:new Mc(iA,X.x,X.y)}function k(X,iA,AA){var IA=iA[0]-AA[0]*X.k,aA=iA[1]-AA[1]*X.k;return IA===X.x&&aA===X.y?X:new Mc(X.k,IA,aA)}function S(X){return[(+X[0][0]+ +X[1][0])/2,(+X[0][1]+ +X[1][1])/2]}function b(X,iA,AA,IA){X.on("start.zoom",function(){x(this,arguments).event(IA).start()}).on("interrupt.zoom end.zoom",function(){x(this,arguments).event(IA).end()}).tween("zoom",function(){var aA=this,rA=arguments,uA=x(aA,rA).event(IA),UA=e.apply(aA,rA),$A=AA==null?S(UA):typeof AA=="function"?AA.apply(aA,rA):AA,zA=Math.max(UA[1][0]-UA[0][0],UA[1][1]-UA[0][1]),pA=aA.__zoom,PA=typeof iA=="function"?iA.apply(aA,rA):iA,Je=s(pA.invert($A).concat(zA/pA.k),PA.invert($A).concat(zA/PA.k));return function(_e){if(_e===1)_e=PA;else{var YA=Je(_e),fA=zA/YA[2];_e=new Mc(fA,$A[0]-YA[0]*fA,$A[1]-YA[1]*fA)}uA.zoom(null,_e)}})}function x(X,iA,AA){return!AA&&X.__zooming||new F(X,iA)}function F(X,iA){this.that=X,this.args=iA,this.active=0,this.sourceEvent=null,this.extent=e.apply(X,iA),this.taps=0}F.prototype={event:function(X){return X&&(this.sourceEvent=X),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(X,iA){return this.mouse&&X!=="mouse"&&(this.mouse[1]=iA.invert(this.mouse[0])),this.touch0&&X!=="touch"&&(this.touch0[1]=iA.invert(this.touch0[0])),this.touch1&&X!=="touch"&&(this.touch1[1]=iA.invert(this.touch1[0])),this.that.__zoom=iA,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(X){var iA=Nr(this.that).datum();l.call(X,this.that,new wN(X,{sourceEvent:this.sourceEvent,target:m,type:X,transform:this.that.__zoom,dispatch:l}),iA)}};function z(X,...iA){if(!t.apply(this,arguments))return;var AA=x(this,iA).event(X),IA=this.__zoom,aA=Math.max(o[0],Math.min(o[1],IA.k*Math.pow(2,i.apply(this,arguments)))),rA=yg(X);if(AA.wheel)(AA.mouse[0][0]!==rA[0]||AA.mouse[0][1]!==rA[1])&&(AA.mouse[1]=IA.invert(AA.mouse[0]=rA)),clearTimeout(AA.wheel);else{if(IA.k===aA)return;AA.mouse=[rA,IA.invert(rA)],Gd(this),AA.start()}aQ(X),AA.wheel=setTimeout(uA,h),AA.zoom("mouse",A(k(v(IA,aA),AA.mouse[0],AA.mouse[1]),AA.extent,a));function uA(){AA.wheel=null,AA.end()}}function P(X,...iA){if(I||!t.apply(this,arguments))return;var AA=X.currentTarget,IA=x(this,iA,!0).event(X),aA=Nr(X.view).on("mousemove.zoom",$A,!0).on("mouseup.zoom",zA,!0),rA=yg(X,AA),uA=X.clientX,UA=X.clientY;a3(X.view),hy(X),IA.mouse=[rA,this.__zoom.invert(rA)],Gd(this),IA.start();function $A(pA){if(aQ(pA),!IA.moved){var PA=pA.clientX-uA,Je=pA.clientY-UA;IA.moved=PA*PA+Je*Je>E}IA.event(pA).zoom("mouse",A(k(IA.that.__zoom,IA.mouse[0]=yg(pA,AA),IA.mouse[1]),IA.extent,a))}function zA(pA){aA.on("mousemove.zoom mouseup.zoom",null),r3(pA.view,IA.moved),aQ(pA),IA.event(pA).end()}}function Z(X,...iA){if(t.apply(this,arguments)){var AA=this.__zoom,IA=yg(X.changedTouches?X.changedTouches[0]:X,this),aA=AA.invert(IA),rA=AA.k*(X.shiftKey?.5:2),uA=A(k(v(AA,rA),IA,aA),e.apply(this,iA),a);aQ(X),r>0?Nr(this).transition().duration(r).call(b,uA,IA,X):Nr(this).call(m.transform,uA,IA,X)}}function tA(X,...iA){if(t.apply(this,arguments)){var AA=X.touches,IA=AA.length,aA=x(this,iA,X.changedTouches.length===IA).event(X),rA,uA,UA,$A;for(hy(X),uA=0;uA{let A=Math.max(0,Math.min(t.x+t.width,e.x+e.width)-Math.max(t.x,e.x)),i=Math.max(0,Math.min(t.y+t.height,e.y+e.height)-Math.max(t.y,e.y));return Math.ceil(A*i)};function dtA(t){if(t.length===0)return{x:0,y:0,width:0,height:0};let e={x:1/0,y:1/0,x2:-1/0,y2:-1/0};return t.forEach(A=>{let i=iMA(A);e=oMA(e,i)}),nMA(e)}function tMA(t,e,A){let i=e.find(o=>o.rawNode.id===t);if(!i)return[];let n=uy(i);return e.filter(o=>{if(o.rawNode.id===t)return!1;let a=eMA(uy(o),n);return A?.partially?a>0:a>=n.width*n.height})}function iMA(t){return{x:t.point().x,y:t.point().y,x2:t.point().x+t.size().width,y2:t.point().y+t.size().height}}function uy(t){return{x:t.globalPoint().x,y:t.globalPoint().y,width:t.width(),height:t.height()}}function nMA({x:t,y:e,x2:A,y2:i}){return{x:t,y:e,width:A-t,height:i-e}}function oMA(t,e){return{x:Math.min(t.x,e.x),y:Math.min(t.y,e.y),x2:Math.max(t.x2,e.x2),y2:Math.max(t.y2,e.y2)}}var fy=class{constructor(e){this.settings=e,this.curve=e.curve??"bezier",this.type=e.type??"default",this.mode=e.mode??"strict";let A=this.getValidators(e);this.validator=i=>A.every(n=>n(i))}getValidators(e){let A=[];return A.push(aMA),this.mode==="loose"&&A.push(rMA),e.validator&&A.push(e.validator),A}},aMA=t=>t.source!==t.target,rMA=t=>t.sourceHandle!==void 0&&t.targetHandle!==void 0;function sQ(t){return t.split("").reduce((e,A)=>(e=(e<<5)-e+A.charCodeAt(0),e&e),0)}var ul=(()=>{class t{constructor(){this.nodes=bA([],{equal:(A,i)=>!A.length&&!i.length?!0:A===i}),this.rawNodes=pe(()=>this.nodes().map(A=>A.rawNode)),this.edges=bA([],{equal:(A,i)=>!A.length&&!i.length?!0:A===i}),this.rawEdges=pe(()=>this.edges().map(A=>A.edge)),this.validEdges=pe(()=>{let A=this.nodes();return this.edges().filter(i=>A.includes(i.source())&&A.includes(i.target()))}),this.connection=bA(new fy({})),this.markers=pe(()=>{let A=new Map;this.validEdges().forEach(n=>{if(n.edge.markers?.start){let o=sQ(JSON.stringify(n.edge.markers.start));A.set(o,n.edge.markers.start)}if(n.edge.markers?.end){let o=sQ(JSON.stringify(n.edge.markers.end));A.set(o,n.edge.markers.end)}});let i=this.connection().settings.marker;if(i){let n=sQ(JSON.stringify(i));A.set(n,i)}return A}),this.entities=pe(()=>[...this.nodes(),...this.edges()]),this.minimap=bA(null)}getNode(A){return this.nodes().find(({rawNode:i})=>i.id===A)}getDetachedEdges(){return this.edges().filter(A=>A.detached())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function sMA(t,e,A,i,n,o){let a=e/(t.width*(1+o)),r=A/(t.height*(1+o)),s=Math.min(a,r),l=lMA(s,i,n),g=t.x+t.width/2,C=t.y+t.height/2,I=e/2-g*l,d=A/2-C*l;return{x:I,y:d,zoom:l}}function lMA(t,e=0,A=1){return Math.min(Math.max(t,e),A)}function gMA(t,e,A){let i=t.zoom;return{x:-t.x/i,y:-t.y/i,width:e/i,height:A/i}}function cMA(t,e,A,i){let n=gMA(e,A,i);return!(t.x+t.widthn.x+n.width||t.y+t.heightn.y+n.height)}var CMA={detachedGroupsLayer:!1,virtualization:!1,virtualizationZoomThreshold:.5,lazyLoadTrigger:"immediate"},ts=(()=>{class t{constructor(){this.entitiesSelectable=bA(!0),this.elevateNodesOnSelect=bA(!0),this.elevateEdgesOnSelect=bA(!0),this.view=bA([400,400]),this.computedFlowWidth=bA(0),this.computedFlowHeight=bA(0),this.minZoom=bA(.5),this.maxZoom=bA(3),this.background=bA({type:"solid",color:"#fff"}),this.snapGrid=bA([1,1]),this.optimization=bA(CMA)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),Kd=(()=>{class t{constructor(){this.entitiesService=w(ul),this.flowSettingsService=w(ts),this.writableViewport=bA({changeType:"initial",state:t.getDefaultViewport(),duration:0}),this.readableViewport=bA(t.getDefaultViewport()),this.viewportChangeEnd$=new ie}static getDefaultViewport(){return{zoom:1,x:0,y:0}}fitView(A={padding:.1,duration:0,nodes:[]}){let i=this.getBoundsNodes(A.nodes??[]),n=sMA(dtA(i),this.flowSettingsService.computedFlowWidth(),this.flowSettingsService.computedFlowHeight(),this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom(),A.padding??.1),o=A.duration??0;this.writableViewport.set({changeType:"absolute",state:n,duration:o})}triggerViewportChangeEvent(A){A==="end"&&this.viewportChangeEnd$.next()}getBoundsNodes(A){return A?.length?A.map(i=>this.entitiesService.nodes().find(({rawNode:n})=>n.id===i)).filter(i=>!!i):this.entitiesService.nodes()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function PC(t){return t!==void 0}var My=(()=>{class t{constructor(){this.element=w(ce).nativeElement}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["svg","rootSvgRef",""]]})}}return t})();function AtA(){let t=window.navigator.userAgent.toLowerCase(),e=/(macintosh|macintel|macppc|mac68k|macos)/i,A=/(win32|win64|windows|wince)/i,i=/(iphone|ipad|ipod)/i,n=null;return e.test(t)?n="macos":i.test(t)?n="ios":A.test(t)?n="windows":/android/.test(t)?n="android":!n&&/linux/.test(t)&&(n="linux"),n}var SN=(()=>{class t{constructor(){this.actions=bA({multiSelection:[AtA()==="macos"?"MetaLeft":"ControlLeft",AtA()==="macos"?"MetaRight":"ControlRight"]}),this.actionsActive={multiSelection:!1},po(this.actions).pipe(hi(()=>Ki(Lc(document,"keydown").pipe(di(A=>{for(let i in this.actions())(this.actions()[i]??[]).includes(A.code)&&(this.actionsActive[i]=!0)})),Lc(document,"keyup").pipe(di(A=>{for(let i in this.actions())(this.actions()[i]??[]).includes(A.code)&&(this.actionsActive[i]=!1)})))),wr()).subscribe()}setShortcuts(A){this.actions.update(i=>gA(gA({},i),A))}isActiveAction(A){return this.actionsActive[A]}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),b3=(()=>{class t{constructor(){this.flowEntitiesService=w(ul),this.keyboardService=w(SN),this.viewport$=new ie,this.resetSelection=this.viewport$.pipe(di(({start:A,end:i,target:n})=>{if(A&&i&&n){let o=t.delta,a=Math.abs(i.x-A.x),r=Math.abs(i.y-A.y),s=ai.selected.set(!1)),A&&A.selected.set(!0))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),vN=(()=>{class t{constructor(){this.rootSvg=w(My).element,this.host=w(ce).nativeElement,this.selectionService=w(b3),this.viewportService=w(Kd),this.flowSettingsService=w(ts),this.zone=w(qe),this.rootSvgSelection=Nr(this.rootSvg),this.transform=bA(""),this.viewportForSelection={},this.manualViewportChangeEffect=Ao(()=>{let A=this.viewportService.writableViewport(),i=A.state;if(A.changeType!=="initial"){if(PC(i.zoom)&&!PC(i.x)&&!PC(i.y)){this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.scaleTo,i.zoom);return}if(PC(i.x)&&PC(i.y)&&!PC(i.zoom)){let n=ca(this.viewportService.readableViewport).zoom;this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.transform,GI.translate(i.x,i.y).scale(n));return}if(PC(i.x)&&PC(i.y)&&PC(i.zoom)){this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.transform,GI.translate(i.x,i.y).scale(i.zoom));return}}},{allowSignalWrites:!0}),this.handleZoom=({transform:A})=>{this.viewportService.readableViewport.set(bN(A)),this.transform.set(A.toString())},this.handleZoomStart=({transform:A})=>{this.viewportForSelection={start:bN(A)}},this.handleZoomEnd=({transform:A,sourceEvent:i})=>{this.zone.run(()=>{this.viewportForSelection=Ye(gA({},this.viewportForSelection),{end:bN(A),target:IMA(i)}),this.viewportService.triggerViewportChangeEvent("end"),this.selectionService.setViewport(this.viewportForSelection)})},this.filterCondition=A=>A.type==="mousedown"||A.type==="touchstart"?A.target.closest(".vflow-node")===null:!0}ngOnInit(){this.zone.runOutsideAngular(()=>{this.zoomBehavior=yN().scaleExtent([this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom()]).filter(this.filterCondition).on("start",this.handleZoomStart).on("zoom",this.handleZoom).on("end",this.handleZoomEnd),this.rootSvgSelection.call(this.zoomBehavior).on("dblclick.zoom",null)})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["g","mapContext",""]],hostVars:1,hostBindings:function(i,n){i&2&&te("transform",n.transform())}})}}return t})(),bN=t=>({zoom:t.k,x:t.x,y:t.y}),IMA=t=>{if(t instanceof Event&&t.target instanceof Element)return t.target},py=t=>Math.round(t*100)/100;function Ql(t,e){return Math.ceil(t/e)*e}var KI=(()=>{class t{constructor(){this.status=bA({state:"idle",payload:null})}setIdleStatus(){this.status.set({state:"idle",payload:null})}setConnectionStartStatus(A,i){this.status.set({state:"connection-start",payload:{source:A,sourceHandle:i}})}setReconnectionStartStatus(A,i,n){this.status.set({state:"reconnection-start",payload:{source:A,sourceHandle:i,oldEdge:n}})}setConnectionValidationStatus(A,i,n,o,a){this.status.set({state:"connection-validation",payload:{source:i,target:n,sourceHandle:o,targetHandle:a,valid:A}})}setReconnectionValidationStatus(A,i,n,o,a,r){this.status.set({state:"reconnection-validation",payload:{source:i,target:n,sourceHandle:o,targetHandle:a,valid:A,oldEdge:r}})}setConnectionEndStatus(A,i,n,o){this.status.set({state:"connection-end",payload:{source:A,target:i,sourceHandle:n,targetHandle:o}})}setReconnectionEndStatus(A,i,n,o,a){this.status.set({state:"reconnection-end",payload:{source:A,target:i,sourceHandle:n,targetHandle:o,oldEdge:a}})}setNodeDragStartStatus(A){this.status.set({state:"node-drag-start",payload:{node:A}})}setNodeDragEndStatus(A){this.status.set({state:"node-drag-end",payload:{node:A}})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function etA(t){return t.state==="node-drag-start"}function dMA(t){return t.state==="node-drag-end"}var BtA=(()=>{class t{constructor(){this.entitiesService=w(ul),this.settingsService=w(ts),this.flowStatusService=w(KI)}enable(A,i){Nr(A).call(this.getDragBehavior(i))}disable(A){Nr(A).call(WD().on("drag",null))}destroy(A){Nr(A).on(".drag",null)}getDragBehavior(A){let i=[],n=[],o=a=>A.dragHandlesCount()?!!a.target.closest(".vflow-drag-handle"):!0;return WD().filter(o).on("start",a=>{i=this.getDragNodes(A),this.flowStatusService.setNodeDragStartStatus(A),n=i.map(r=>({x:r.point().x-a.x,y:r.point().y-a.y}))}).on("drag",a=>{i.forEach((r,s)=>{let l={x:py(a.x+n[s].x),y:py(a.y+n[s].y)};this.moveNode(r,l)})}).on("end",()=>{this.flowStatusService.setNodeDragEndStatus(A)})}getDragNodes(A){return A.selected()?this.entitiesService.nodes().filter(i=>i.selected()&&i.draggable()):[A]}moveNode(A,i){i=this.alignToGrid(i);let n=A.parent();n&&(i.x=Math.min(n.width()-A.width(),i.x),i.x=Math.max(0,i.x),i.y=Math.min(n.height()-A.height(),i.y),i.y=Math.max(0,i.y)),A.setPoint(i)}alignToGrid(A){let[i,n]=this.settingsService.snapGrid();return i>1&&(A.x=Ql(A.x,i)),n>1&&(A.y=Ql(A.y,n)),A}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),my=(()=>{class t{constructor(){this.templateRef=w(ao)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["ng-template","edge",""]]})}}return t})(),ttA=(()=>{class t{constructor(){this.templateRef=w(ao)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["ng-template","connection",""]]})}}return t})(),itA=(()=>{class t{constructor(){this.templateRef=w(ao)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["ng-template","edgeLabelHtml",""]]})}}return t})(),lQ=(()=>{class t{constructor(){this.templateRef=w(ao)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["ng-template","nodeHtml",""]]})}}return t})(),ntA=(()=>{class t{constructor(){this.templateRef=w(ao)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["ng-template","nodeSvg",""]]})}}return t})(),wy=(()=>{class t{constructor(){this.templateRef=w(ao)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["ng-template","groupNode",""]]})}}return t})();function otA(t,e){let A=t.reduce((i,n)=>(i[n.rawNode.id]=n,i),{});e.forEach(i=>{i.source.set(A[i.edge.source]),i.target.set(A[i.edge.target])})}function D3(t){try{return new Proxy(t,{apply:()=>{}})(),!0}catch(e){return!1}}var kN=(()=>{class t{constructor(){this._event$=new ie,this.event$=this._event$.asObservable()}pushEvent(A){this._event$.next(A)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),gQ=(()=>{class t{constructor(){this.model=bA(null)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),EtA=(()=>{class t{constructor(){this.eventBus=w(kN),this.nodeService=w(gQ),this.destroyRef=w(sr),this.selected=this.nodeService.model().selected,this.data=bA(void 0)}ngOnInit(){this.trackEvents().pipe(wr(this.destroyRef)).subscribe()}trackEvents(){let A=Object.getOwnPropertyNames(this),i=new Map;for(let n of A){let o=this[n];o instanceof LA&&i.set(o,n),o instanceof qF&&i.set(BMA(o),n)}return Ki(...Array.from(i.keys()).map(n=>n.pipe(di(o=>{this.eventBus.pushEvent({nodeId:this.nodeService.model()?.rawNode.id??"",eventName:i.get(n),eventPayload:o})}))))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,standalone:!1})}}return t})();function BMA(t){return new vi(e=>{let A=t.subscribe(i=>{e.next(i)});return()=>{A.unsubscribe()}})}var EMA=(()=>{class t extends EtA{constructor(){super(...arguments),this.node=me.required()}ngOnInit(){let A=this.node().data;A&&(this.data=A),super.ngOnInit()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})()}static{this.\u0275dir=VA({type:t,inputs:{node:[1,"node"]},standalone:!1,features:[mt]})}}return t})(),hMA=(()=>{class t extends EtA{constructor(){super(...arguments),this.node=me.required()}ngOnInit(){this.node().data&&this.data.set(this.node().data),super.ngOnInit()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})()}static{this.\u0275dir=VA({type:t,inputs:{node:[1,"node"]},standalone:!1,features:[mt]})}}return t})();function htA(t){return Object.prototype.isPrototypeOf.call(hMA,t)}function QtA(t){return Object.prototype.isPrototypeOf.call(EMA,t)}function QMA(t){return typeof t.point=="function"}function uMA(t){return htA(t.type)?!0:D3(t.type)&&!D3(t.point)}function fMA(t){return QtA(t.type)?!0:D3(t.type)&&D3(t.point)}var Dy=2;function pMA(t){return QMA(t)?t:Ye(gA({},mMA(t)),{id:t.id,type:t.type})}function mMA(t){let e={};for(let A in t)Object.prototype.hasOwnProperty.call(t,A)&&(e[A]=bA(t[A]));return e}function wMA(t,e,A){!e&&KF(t);let i=e??w(Dt);return A?Xa(i,A):i}function y3(t,e){let A=wMA(y3,e?.injector),i;return pe(()=>(i||(i=ca(()=>Ar(t,Ye(gA({},e),{injector:A})))),i()))}function DMA(t){return t.rawNode.type==="default-group"||t.rawNode.type==="template-group"}var Ud=(()=>{class t{constructor(){this.flowEntitiesService=w(ul),this.flowSettingsService=w(ts),this.viewportService=w(Kd),this.nodes=pe(()=>this.flowSettingsService.optimization().virtualization?this.viewportNodesAfterInteraction().sort((A,i)=>A.renderOrder()-i.renderOrder()):[...this.flowEntitiesService.nodes()].sort((A,i)=>A.renderOrder()-i.renderOrder())),this.groups=pe(()=>this.nodes().filter(A=>!!A.children().length||DMA(A))),this.nonGroups=pe(()=>this.nodes().filter(A=>!this.groups().includes(A))),this.viewportNodes=pe(()=>{let A=this.flowEntitiesService.nodes(),i=this.viewportService.readableViewport(),n=this.flowSettingsService.computedFlowWidth(),o=this.flowSettingsService.computedFlowHeight();return A.filter(a=>{let{x:r,y:s}=a.globalPoint(),l=a.width(),g=a.height();return cMA({x:r,y:s,width:l,height:g},i,n,o)})}),this.viewportNodesAfterInteraction=y3(Ki(po(this.flowEntitiesService.nodes).pipe(Hd(U3),gt(A=>!!A.length)),this.viewportService.viewportChangeEnd$.pipe(Ls(300))).pipe(we(()=>{let A=this.viewportService.readableViewport(),i=this.flowSettingsService.optimization().virtualizationZoomThreshold;return A.zoomMath.max(...this.flowEntitiesService.nodes().map(A=>A.renderOrder())))}pullNode(A){A.renderOrder.set(this.maxOrder()+1),A.children().forEach(i=>this.pullNode(i))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function yy(t,e){e||(e={equal:Object.is});let A;return pe(()=>A=t(A),e)}var yMA=(()=>{class t{static{this.defaultWidth=100}static{this.defaultHeight=50}static{this.defaultColor="#1b262c"}constructor(A){this.rawNode=A,this.entitiesService=w(ul),this.settingsService=w(ts),this.nodeRenderingService=w(Ud),this.isVisible=bA(!1),this.point=bA({x:0,y:0}),this.width=bA(t.defaultWidth),this.height=bA(t.defaultHeight),this.size=pe(()=>({width:this.width(),height:this.height()})),this.styleWidth=pe(()=>this.controlledByResizer()?`${this.width()}px`:"100%"),this.styleHeight=pe(()=>this.controlledByResizer()?`${this.height()}px`:"100%"),this.foWidth=pe(()=>this.width()+Dy),this.foHeight=pe(()=>this.height()+Dy),this.renderOrder=bA(0),this.selected=bA(!1),this.preview=bA({style:{}}),this.globalPoint=pe(()=>{let n=this.parent(),o=this.point().x,a=this.point().y;for(;n!==null;)o+=n.point().x,a+=n.point().y,n=n.parent();return{x:o,y:a}}),this.pointTransform=pe(()=>`translate(${this.globalPoint().x}, ${this.globalPoint().y})`),this.handles=bA([]),this.draggable=bA(!0),this.dragHandlesCount=bA(0),this.magnetRadius=20,this.isComponentType=uMA(this.rawNode)||fMA(this.rawNode),this.shouldLoad=yy(n=>{if(n||this.settingsService.optimization().lazyLoadTrigger==="immediate")return!0;if(this.settingsService.optimization().lazyLoadTrigger==="viewport"){if(htA(this.rawNode.type)||QtA(this.rawNode.type))return!0;if(D3(this.rawNode.type)||this.rawNode.type==="html-template"||this.rawNode.type==="svg-template"||this.rawNode.type==="template-group")return this.nodeRenderingService.viewportNodes().includes(this)}return!0}),this.componentInstance$=po(this.shouldLoad).pipe(gt(Boolean),hi(()=>this.rawNode.type()),Po(()=>ne(this.rawNode.type)),Gs(1)),this.text=bA(""),this.componentTypeInputs={node:this.rawNode},this.parent=pe(()=>this.entitiesService.nodes().find(n=>n.rawNode.id===this.parentId())??null),this.children=pe(()=>this.entitiesService.nodes().filter(n=>n.parentId()===this.rawNode.id)),this.color=bA(t.defaultColor),this.controlledByResizer=bA(!1),this.resizable=bA(!1),this.resizing=bA(!1),this.resizerTemplate=bA(null),this.context={$implicit:{}},this.parentId=bA(null);let i=pMA(A);i.point&&(this.point=i.point),i.width&&(this.width=i.width),i.height&&(this.height=i.height),i.draggable&&(this.draggable=i.draggable),i.parentId&&(this.parentId=i.parentId),i.preview&&(this.preview=i.preview),i.type==="default-group"&&i.color&&(this.color=i.color),i.type==="default-group"&&i.resizable&&(this.resizable=i.resizable),i.type==="default"&&i.text&&(this.text=i.text),i.type==="html-template"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}}),i.type==="svg-template"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),i.type==="template-group"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),this.point$=po(this.point),this.width$=po(this.width),this.height$=po(this.height),this.size$=po(this.size),this.selected$=po(this.selected),this.handles$=po(this.handles)}setPoint(A){this.point.set(A)}}return t})(),m3=class{constructor(e){this.edgeLabel=e,this.size=bA({width:0,height:0})}};function jC(t,e,A){return{x:(1-A)*t.x+A*e.x,y:(1-A)*t.y+A*e.y}}function xN({sourcePoint:t,targetPoint:e}){return{path:`M ${t.x},${t.y}L ${e.x},${e.y}`,labelPoints:{start:jC(t,e,.15),center:jC(t,e,.5),end:jC(t,e,.85)}}}function _N({sourcePoint:t,targetPoint:e,sourcePosition:A,targetPosition:i}){let n={x:t.x-e.x,y:t.y-e.y},o=atA(t,A,n),a=atA(e,i,n),r=`M${t.x},${t.y} C${o.x},${o.y} ${a.x},${a.y} ${e.x},${e.y}`;return vMA(r,t,e,o,a)}function atA(t,e,A){let i={x:0,y:0};switch(e){case"top":i.y=1;break;case"bottom":i.y=-1;break;case"right":i.x=1;break;case"left":i.x=-1;break}let n={x:A.x*Math.abs(i.x),y:A.y*Math.abs(i.y)},a=.25*25*Math.sqrt(Math.abs(n.x+n.y));return{x:t.x+i.x*a,y:t.y-i.y*a}}function vMA(t,e,A,i,n){return{path:t,labelPoints:{start:MN(e,A,i,n,.1),center:MN(e,A,i,n,.5),end:MN(e,A,i,n,.9)}}}function MN(t,e,A,i,n){let o=jC(t,A,n),a=jC(A,i,n),r=jC(i,e,n);return jC(jC(o,a,n),jC(a,r,n),n)}var rtA={left:{x:-1,y:0},right:{x:1,y:0},top:{x:0,y:-1},bottom:{x:0,y:1}};function bMA(t,e){let A=Math.abs(e.x-t.x)/2,i=e.xe==="left"||e==="right"?t.xMath.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2));function SMA({source:t,sourcePosition:e="bottom",target:A,targetPosition:i="top",offset:n}){let o=rtA[e],a=rtA[i],r={x:t.x+o.x*n,y:t.y+o.y*n},s={x:A.x+a.x*n,y:A.y+a.y*n},l=MMA({source:r,sourcePosition:e,target:s}),g=l.x!==0?"x":"y",C=l[g],I=[],d,h,E={x:0,y:0},f={x:0,y:0},[m,v]=bMA(t,A);if(o[g]*a[g]===-1){d=m,h=v;let S=[{x:d,y:r.y},{x:d,y:s.y}],b=[{x:r.x,y:h},{x:s.x,y:h}];o[g]===C?I=g==="x"?S:b:I=g==="x"?b:S}else{let S=[{x:r.x,y:s.y}],b=[{x:s.x,y:r.y}];if(g==="x"?I=o.x===C?b:S:I=o.y===C?S:b,e===i){let Z=Math.abs(t[g]-A[g]);if(Z<=n){let tA=Math.min(n-1,n-Z);o[g]===C?E[g]=(r[g]>t[g]?-1:1)*tA:f[g]=(s[g]>A[g]?-1:1)*tA}}if(e!==i){let Z=g==="x"?"y":"x",tA=o[g]===a[Z],W=r[Z]>s[Z],BA=r[Z]=P?(d=(x.x+F.x)/2,h=I[0].y):(d=I[0].x,h=(x.y+F.y)/2)}return[[t,{x:r.x+E.x,y:r.y+E.y},...I,{x:s.x+f.x,y:s.y+f.y},A],d,h]}function kMA(t,e,A,i){let n=Math.min(stA(t,e)/2,stA(e,A)/2,i),{x:o,y:a}=e;if(t.x===o&&o===A.x||t.y===a&&a===A.y)return`L${o} ${a}`;if(t.y===a){let l=t.x{let m="";return f>0&&f{let E=I*h;if(E<=0)return o[0];if(E>=I)return o[l-1];let f=0,m=l-1;for(;f>>1;C[F](this.source()?.shouldLoad()??!1)&&(this.target()?.shouldLoad()??!1)),this.renderOrder=bA(0),this.detached=pe(()=>{let A=this.source(),i=this.target();if(!A||!i)return!0;let n=!1,o=!1;return this.edge.sourceHandle?n=!!A.handles().find(a=>a.rawHandle.id===this.edge.sourceHandle):n=!!A.handles().find(a=>a.rawHandle.type==="source"),this.edge.targetHandle?o=!!i.handles().find(a=>a.rawHandle.id===this.edge.targetHandle):o=!!i.handles().find(a=>a.rawHandle.type==="target"),!n||!o}),this.detached$=po(this.detached),this.path=pe(()=>{let A=this.sourceHandle(),i=this.targetHandle();if(!A||!i)return{path:""};let n=this.getPathFactoryParams(A,i);switch(this.curve){case"straight":return xN(n);case"bezier":return _N(n);case"smooth-step":return rQ(n);case"step":return rQ(n,0);default:return this.curve(n)}}),this.sourceHandle=yy(A=>{let i=null;return this.floating?i=this.closestHandles().sourceHandle:this.edge.sourceHandle?i=this.source()?.handles().find(n=>n.rawHandle.id===this.edge.sourceHandle)??null:i=this.source()?.handles().find(n=>n.rawHandle.type==="source")??null,i===null?A:i}),this.targetHandle=yy(A=>{let i=null;return this.floating?i=this.closestHandles().targetHandle:this.edge.targetHandle?i=this.target()?.handles().find(n=>n.rawHandle.id===this.edge.targetHandle)??null:i=this.target()?.handles().find(n=>n.rawHandle.type==="target")??null,i===null?A:i}),this.closestHandles=pe(()=>{let A=this.source(),i=this.target();if(!A||!i)return{sourceHandle:null,targetHandle:null};let n=this.flowEntitiesService.connection().mode==="strict"?A.handles().filter(l=>l.rawHandle.type==="source"):A.handles(),o=this.flowEntitiesService.connection().mode==="strict"?i.handles().filter(l=>l.rawHandle.type==="target"):i.handles();if(n.length===0||o.length===0)return{sourceHandle:null,targetHandle:null};let a=1/0,r=null,s=null;for(let l of n)for(let g of o){let C=l.pointAbsolute(),I=g.pointAbsolute(),d=Math.sqrt(Math.pow(C.x-I.x,2)+Math.pow(C.y-I.y,2));d{let A=this.edge.markers?.start;return A?`url(#${sQ(JSON.stringify(A))})`:""}),this.markerEndUrl=pe(()=>{let A=this.edge.markers?.end;return A?`url(#${sQ(JSON.stringify(A))})`:""}),this.context={$implicit:{edge:this.edge,path:pe(()=>this.path().path),markerStart:this.markerStartUrl,markerEnd:this.markerEndUrl,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}},this.edgeLabels={},this.type=e.type??"default",this.curve=e.curve??"bezier",this.reconnectable=e.reconnectable??!1,this.floating=e.floating??!1,e.edgeLabels?.start&&(this.edgeLabels.start=new m3(e.edgeLabels.start)),e.edgeLabels?.center&&(this.edgeLabels.center=new m3(e.edgeLabels.center)),e.edgeLabels?.end&&(this.edgeLabels.end=new m3(e.edgeLabels.end))}getPathFactoryParams(e,A){return{mode:"edge",edge:this.edge,sourcePoint:e.pointAbsolute(),targetPoint:A.pointAbsolute(),sourcePosition:e.rawHandle.position,targetPosition:A.rawHandle.position,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}},vy=class{static nodes(e,A){let i=new Map;return A.forEach(n=>i.set(n.rawNode,n)),e.map(n=>i.get(n)??new yMA(n))}static edges(e,A){let i=new Map;return A.forEach(n=>i.set(n.edge,n)),e.map(n=>i.has(n)?i.get(n):new RN(n))}},xMA=25,NN=(()=>{class t{constructor(){this.entitiesService=w(ul),this.nodesPositionChange$=po(this.entitiesService.nodes).pipe(hi(A=>Ki(...A.map(i=>i.point$.pipe(wl(1),we(()=>i))))),we(A=>[{type:"position",id:A.rawNode.id,point:A.point()},...this.entitiesService.nodes().filter(i=>i!==A&&i.selected()).map(i=>({type:"position",id:i.rawNode.id,point:i.point()}))])),this.nodeSizeChange$=po(this.entitiesService.nodes).pipe(hi(A=>Ki(...A.map(i=>i.size$.pipe(wl(1),we(()=>i))))),we(A=>[{type:"size",id:A.rawNode.id,size:A.size()}])),this.nodeAddChange$=po(this.entitiesService.nodes).pipe(VC(),we(([A,i])=>i.filter(n=>!A.includes(n))),gt(A=>!!A.length),we(A=>A.map(i=>({type:"add",id:i.rawNode.id})))),this.nodeRemoveChange$=po(this.entitiesService.nodes).pipe(VC(),we(([A,i])=>A.filter(n=>!i.includes(n))),gt(A=>!!A.length),we(A=>A.map(i=>({type:"remove",id:i.rawNode.id})))),this.nodeSelectedChange$=po(this.entitiesService.nodes).pipe(hi(A=>Ki(...A.map(i=>i.selected$.pipe(kg(),wl(1),we(()=>i))))),we(A=>[{type:"select",id:A.rawNode.id,selected:A.selected()}])),this.changes$=Ki(this.nodesPositionChange$,this.nodeSizeChange$,this.nodeAddChange$,this.nodeRemoveChange$,this.nodeSelectedChange$).pipe(Hd(U3,xMA))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),_MA=(t,e)=>t.length===e.length&&[...new Set([...t,...e])].every(A=>t.filter(i=>i===A).length===e.filter(i=>i===A).length),FN=(()=>{class t{constructor(){this.entitiesService=w(ul),this.edgeDetachedChange$=Ki(po(pe(()=>{let A=this.entitiesService.nodes();return ca(this.entitiesService.edges).filter(({source:n,target:o})=>!A.includes(n())||!A.includes(o()))})),po(this.entitiesService.edges).pipe(hi(A=>RF(...A.map(i=>i.detached$.pipe(we(()=>i))))),we(A=>A.filter(i=>i.detached())),wl(2))).pipe(kg(_MA),gt(A=>!!A.length),we(A=>A.map(({edge:i})=>({type:"detached",id:i.id})))),this.edgeAddChange$=po(this.entitiesService.edges).pipe(VC(),we(([A,i])=>i.filter(n=>!A.includes(n))),gt(A=>!!A.length),we(A=>A.map(({edge:i})=>({type:"add",id:i.id})))),this.edgeRemoveChange$=po(this.entitiesService.edges).pipe(VC(),we(([A,i])=>A.filter(n=>!i.includes(n))),gt(A=>!!A.length),we(A=>A.map(({edge:i})=>({type:"remove",id:i.id})))),this.edgeSelectChange$=po(this.entitiesService.edges).pipe(hi(A=>Ki(...A.map(i=>i.selected$.pipe(kg(),wl(1),we(()=>i))))),we(A=>[{type:"select",id:A.edge.id,selected:A.selected()}])),this.changes$=Ki(this.edgeDetachedChange$,this.edgeAddChange$,this.edgeRemoveChange$,this.edgeSelectChange$).pipe(Hd(U3))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),RMA=(()=>{class t{constructor(){this.nodesChangeService=w(NN),this.edgesChangeService=w(FN),this.onNodesChange=kn(this.nodesChangeService.changes$),this.onNodesChangePosition=kn(this.nodeChangesOfType("position"),{alias:"onNodesChange.position"}),this.onNodesChangePositionSignle=kn(this.singleChange(this.nodeChangesOfType("position")),{alias:"onNodesChange.position.single"}),this.onNodesChangePositionMany=kn(this.manyChanges(this.nodeChangesOfType("position")),{alias:"onNodesChange.position.many"}),this.onNodesChangeSize=kn(this.nodeChangesOfType("size"),{alias:"onNodesChange.size"}),this.onNodesChangeSizeSingle=kn(this.singleChange(this.nodeChangesOfType("size")),{alias:"onNodesChange.size.single"}),this.onNodesChangeSizeMany=kn(this.manyChanges(this.nodeChangesOfType("size")),{alias:"onNodesChange.size.many"}),this.onNodesChangeAdd=kn(this.nodeChangesOfType("add"),{alias:"onNodesChange.add"}),this.onNodesChangeAddSingle=kn(this.singleChange(this.nodeChangesOfType("add")),{alias:"onNodesChange.add.single"}),this.onNodesChangeAddMany=kn(this.manyChanges(this.nodeChangesOfType("add")),{alias:"onNodesChange.add.many"}),this.onNodesChangeRemove=kn(this.nodeChangesOfType("remove"),{alias:"onNodesChange.remove"}),this.onNodesChangeRemoveSingle=kn(this.singleChange(this.nodeChangesOfType("remove")),{alias:"onNodesChange.remove.single"}),this.onNodesChangeRemoveMany=kn(this.manyChanges(this.nodeChangesOfType("remove")),{alias:"onNodesChange.remove.many"}),this.onNodesChangeSelect=kn(this.nodeChangesOfType("select"),{alias:"onNodesChange.select"}),this.onNodesChangeSelectSingle=kn(this.singleChange(this.nodeChangesOfType("select")),{alias:"onNodesChange.select.single"}),this.onNodesChangeSelectMany=kn(this.manyChanges(this.nodeChangesOfType("select")),{alias:"onNodesChange.select.many"}),this.onEdgesChange=kn(this.edgesChangeService.changes$),this.onNodesChangeDetached=kn(this.edgeChangesOfType("detached"),{alias:"onEdgesChange.detached"}),this.onNodesChangeDetachedSingle=kn(this.singleChange(this.edgeChangesOfType("detached")),{alias:"onEdgesChange.detached.single"}),this.onNodesChangeDetachedMany=kn(this.manyChanges(this.edgeChangesOfType("detached")),{alias:"onEdgesChange.detached.many"}),this.onEdgesChangeAdd=kn(this.edgeChangesOfType("add"),{alias:"onEdgesChange.add"}),this.onEdgeChangeAddSingle=kn(this.singleChange(this.edgeChangesOfType("add")),{alias:"onEdgesChange.add.single"}),this.onEdgeChangeAddMany=kn(this.manyChanges(this.edgeChangesOfType("add")),{alias:"onEdgesChange.add.many"}),this.onEdgeChangeRemove=kn(this.edgeChangesOfType("remove"),{alias:"onEdgesChange.remove"}),this.onEdgeChangeRemoveSingle=kn(this.singleChange(this.edgeChangesOfType("remove")),{alias:"onEdgesChange.remove.single"}),this.onEdgeChangeRemoveMany=kn(this.manyChanges(this.edgeChangesOfType("remove")),{alias:"onEdgesChange.remove.many"}),this.onEdgeChangeSelect=kn(this.edgeChangesOfType("select"),{alias:"onEdgesChange.select"}),this.onEdgeChangeSelectSingle=kn(this.singleChange(this.edgeChangesOfType("select")),{alias:"onEdgesChange.select.single"}),this.onEdgeChangeSelectMany=kn(this.manyChanges(this.edgeChangesOfType("select")),{alias:"onEdgesChange.select.many"})}nodeChangesOfType(A){return this.nodesChangeService.changes$.pipe(we(i=>i.filter(n=>n.type===A)),gt(i=>!!i.length))}edgeChangesOfType(A){return this.edgesChangeService.changes$.pipe(we(i=>i.filter(n=>n.type===A)),gt(i=>!!i.length))}singleChange(A){return A.pipe(gt(i=>i.length===1),we(([i])=>i))}manyChanges(A){return A.pipe(gt(i=>i.length>1))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","changesController",""]],outputs:{onNodesChange:"onNodesChange",onNodesChangePosition:"onNodesChange.position",onNodesChangePositionSignle:"onNodesChange.position.single",onNodesChangePositionMany:"onNodesChange.position.many",onNodesChangeSize:"onNodesChange.size",onNodesChangeSizeSingle:"onNodesChange.size.single",onNodesChangeSizeMany:"onNodesChange.size.many",onNodesChangeAdd:"onNodesChange.add",onNodesChangeAddSingle:"onNodesChange.add.single",onNodesChangeAddMany:"onNodesChange.add.many",onNodesChangeRemove:"onNodesChange.remove",onNodesChangeRemoveSingle:"onNodesChange.remove.single",onNodesChangeRemoveMany:"onNodesChange.remove.many",onNodesChangeSelect:"onNodesChange.select",onNodesChangeSelectSingle:"onNodesChange.select.single",onNodesChangeSelectMany:"onNodesChange.select.many",onEdgesChange:"onEdgesChange",onNodesChangeDetached:"onEdgesChange.detached",onNodesChangeDetachedSingle:"onEdgesChange.detached.single",onNodesChangeDetachedMany:"onEdgesChange.detached.many",onEdgesChangeAdd:"onEdgesChange.add",onEdgeChangeAddSingle:"onEdgesChange.add.single",onEdgeChangeAddMany:"onEdgesChange.add.many",onEdgeChangeRemove:"onEdgesChange.remove",onEdgeChangeRemoveSingle:"onEdgesChange.remove.single",onEdgeChangeRemoveMany:"onEdgesChange.remove.many",onEdgeChangeSelect:"onEdgesChange.select",onEdgeChangeSelectSingle:"onEdgesChange.select.single",onEdgeChangeSelectMany:"onEdgesChange.select.many"}})}}return t})(),Sy=(()=>{class t{constructor(){this.host=w(ce).nativeElement,this.initialTouch$=new ie,this.prevTouchEvent=null,this.mouseMovement$=Lc(this.host,"mousemove").pipe(we(A=>({x:A.clientX,y:A.clientY,movementX:A.movementX,movementY:A.movementY,target:A.target,originalEvent:A})),Hd(Yd),WC()),this.touchMovement$=Ki(this.initialTouch$,Lc(this.host,"touchmove")).pipe(di(A=>A.preventDefault()),we(A=>{let i=A.touches[0]?.clientX??0,n=A.touches[0]?.clientY??0,o=this.prevTouchEvent?A.touches[0].pageX-this.prevTouchEvent.touches[0].pageX:0,a=this.prevTouchEvent?A.touches[0].pageY-this.prevTouchEvent.touches[0].pageY:0,r=document.elementFromPoint(i,n);return{x:i,y:n,movementX:o,movementY:a,target:r,originalEvent:A}}),di(A=>this.prevTouchEvent=A.originalEvent),Hd(Yd),WC()),this.pointerMovement$=Ki(this.mouseMovement$,this.touchMovement$),this.touchEnd$=Lc(this.host,"touchend").pipe(we(A=>{let i=A.changedTouches[0]?.clientX??0,n=A.changedTouches[0]?.clientY??0,o=document.elementFromPoint(i,n);return{x:i,y:n,target:o,originalEvent:A}}),di(()=>this.prevTouchEvent=null),WC()),this.mouseUp$=Lc(this.host,"mouseup").pipe(we(A=>{let i=A.clientX,n=A.clientY,o=A.target;return{x:i,y:n,target:o,originalEvent:A}}),WC()),this.documentPointerEnd$=Ki(Lc(document,"mouseup"),Lc(document,"touchend")).pipe(WC())}setInitialTouch(A){this.initialTouch$.next(A)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["svg","rootPointer",""]]})}}return t})(),w3=(()=>{class t{constructor(){this.pointerMovementDirective=w(Sy),this.rootSvg=w(My).element,this.host=w(ce).nativeElement,this.svgCurrentSpacePoint=pe(()=>{let A=this.pointerMovement();return A?this.documentPointToFlowPoint({x:A.x,y:A.y}):{x:0,y:0}}),this.pointerMovement=Ar(this.pointerMovementDirective.pointerMovement$)}documentPointToFlowPoint(A){let i=this.rootSvg.createSVGPoint();return i.x=A.x,i.y=A.y,i.matrixTransform(this.host.getScreenCTM().inverse())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["g","spacePointContext",""]]})}}return t})();function NMA(t){return typeof t=="string"?{type:"solid",color:t}:t}function by(t,e,A){let i=A.value;return A.value=function(...n){queueMicrotask(()=>{i?.apply(this,n)})},A}var utA=(()=>{class t{constructor(){this.toolbars=bA([]),this.nodeToolbarsMap=pe(()=>{let A=new Map;return this.toolbars().forEach(i=>{let n=A.get(i.node)??[];A.set(i.node,[...n,i])}),A})}addToolbar(A){this.toolbars.update(i=>[...i,A])}removeToolbar(A){this.toolbars.update(i=>i.filter(n=>n!==A))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return kQ([by],t.prototype,"addToolbar",null),kQ([by],t.prototype,"removeToolbar",null),t})();function ky(t,e){return new vi(A=>{let i=new ResizeObserver(n=>{e.run(()=>A.next(n))});return t.forEach(n=>i.observe(n)),()=>i.disconnect()})}var FMA=(()=>{class t{constructor(){this.zone=w(qe),this.destroyRef=w(sr),this.settingsService=w(ts),this.model=me.required(),this.edgeModel=me.required(),this.point=me({x:0,y:0}),this.htmlTemplate=me(),this.edgeLabelWrapperRef=So.required("edgeLabelWrapper"),this.edgeLabelPoint=pe(()=>{let A=this.point(),{width:i,height:n}=this.model().size();return{x:A.x-i/2,y:A.y-n/2}}),this.edgeLabelStyle=pe(()=>{let A=this.model().edgeLabel;if(A.type==="default"&&A.style){let i=this.settingsService.background(),n="transparent";return i.type==="dots"&&(n=i.backgroundColor??"#fff"),i.type==="solid"&&(n=i.color),A.style.backgroundColor=A.style.backgroundColor??n,A.style}return null})}ngAfterViewInit(){let A=this.edgeLabelWrapperRef().nativeElement;ky([A],this.zone).pipe(Sn(null),di(()=>{let i=A.clientWidth+Dy,n=A.clientHeight+Dy;this.model().size.set({width:i,height:n})}),wr(this.destroyRef)).subscribe()}getLabelContext(){return{$implicit:{edge:this.edgeModel().edge,label:this.model().edgeLabel}}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","edgeLabel",""]],viewQuery:function(i,n){i&1&&ns(n.edgeLabelWrapperRef,FbA,5),i&2&&ur()},inputs:{model:[1,"model"],edgeModel:[1,"edgeModel"],point:[1,"point"],htmlTemplate:[1,"htmlTemplate"]},attrs:LbA,decls:1,vars:1,consts:[["edgeLabelWrapper",""],[1,"edge-label-wrapper"],[4,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(i,n){if(i&1&&O(0,JbA,2,2),i&2){let o;Y((o=n.model())?0:-1,o)}},dependencies:[Jc],styles:[".edge-label-wrapper[_ngcontent-%COMP%]{width:max-content;margin-top:1px;margin-left:1px}"],changeDetection:0})}}return t})();function ftA(t){let e={};return t.sourceHandle.rawHandle.type==="source"?(e.source=t.source,e.sourceHandle=t.sourceHandle):(e.source=t.target,e.sourceHandle=t.targetHandle),t.targetHandle.rawHandle.type==="target"?(e.target=t.target,e.targetHandle=t.targetHandle):(e.target=t.source,e.targetHandle=t.sourceHandle),e}var ptA=(()=>{class t{constructor(){this.statusService=w(KI),this.flowEntitiesService=w(ul),this.onConnect=kn(po(this.statusService.status).pipe(gt(A=>A.state==="connection-end"),we(A=>Qy(A,this.isStrictMode())),di(()=>this.statusService.setIdleStatus()),gt(A=>this.flowEntitiesService.connection().validator(A)))),this.connect=kn(po(this.statusService.status).pipe(gt(A=>A.state==="connection-end"),we(A=>Qy(A,this.isStrictMode())),di(()=>this.statusService.setIdleStatus()),gt(A=>this.flowEntitiesService.connection().validator(A)))),this.onReconnect=kn(po(this.statusService.status).pipe(gt(A=>A.state==="reconnection-end"),we(A=>{let i=Qy(A,this.isStrictMode()),n=A.payload.oldEdge.edge;return{connection:i,oldEdge:n}}),di(()=>this.statusService.setIdleStatus()),gt(({connection:A})=>this.flowEntitiesService.connection().validator(A)))),this.reconnect=kn(po(this.statusService.status).pipe(gt(A=>A.state==="reconnection-end"),we(A=>{let i=Qy(A,this.isStrictMode()),n=A.payload.oldEdge.edge;return{connection:i,oldEdge:n}}),di(()=>this.statusService.setIdleStatus()),gt(({connection:A})=>this.flowEntitiesService.connection().validator(A)))),this.isStrictMode=pe(()=>this.flowEntitiesService.connection().mode==="strict")}startConnection(A){this.statusService.setConnectionStartStatus(A.parentNode,A)}startReconnection(A,i){this.statusService.setReconnectionStartStatus(A.parentNode,A,i)}validateConnection(A){let i=this.statusService.status();if(i.state==="connection-start"||i.state==="reconnection-start"){let n=i.state==="reconnection-start",o=i.payload.source,a=A.parentNode,r=i.payload.sourceHandle,s=A;if(this.isStrictMode()){let g=ftA({source:i.payload.source,sourceHandle:i.payload.sourceHandle,target:A.parentNode,targetHandle:A});o=g.source,a=g.target,r=g.sourceHandle,s=g.targetHandle}let l=this.flowEntitiesService.connection().validator({source:o.rawNode.id,target:a.rawNode.id,sourceHandle:r.rawHandle.id,targetHandle:s.rawHandle.id});A.state.set(l?"valid":"invalid"),n?this.statusService.setReconnectionValidationStatus(l,i.payload.source,A.parentNode,i.payload.sourceHandle,A,i.payload.oldEdge):this.statusService.setConnectionValidationStatus(l,i.payload.source,A.parentNode,i.payload.sourceHandle,A)}}resetValidateConnection(A){A.state.set("idle");let i=this.statusService.status();(i.state==="connection-validation"||i.state==="reconnection-validation")&&(i.state==="reconnection-validation"?this.statusService.setReconnectionStartStatus(i.payload.source,i.payload.sourceHandle,i.payload.oldEdge):this.statusService.setConnectionStartStatus(i.payload.source,i.payload.sourceHandle))}endConnection(){let A=this.statusService.status();if(A.state==="connection-validation"||A.state==="reconnection-validation"){let i=A.state==="reconnection-validation",n=A.payload.source,o=A.payload.sourceHandle,a=A.payload.target,r=A.payload.targetHandle;i?this.statusService.setReconnectionEndStatus(n,a,o,r,A.payload.oldEdge):this.statusService.setConnectionEndStatus(n,a,o,r)}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","onConnect",""],["","onReconnect",""],["","connect",""],["","reconnect",""]],outputs:{onConnect:"onConnect",connect:"connect",onReconnect:"onReconnect",reconnect:"reconnect"}})}}return t})();function Qy(t,e){let A=t.payload.source,i=t.payload.target,n=t.payload.sourceHandle,o=t.payload.targetHandle;if(e){let g=ftA({source:t.payload.source,sourceHandle:t.payload.sourceHandle,target:t.payload.target,targetHandle:t.payload.targetHandle});A=g.source,i=g.target,n=g.sourceHandle,o=g.targetHandle}let a=A.rawNode.id,r=i.rawNode.id,s=n.rawHandle.id,l=o.rawHandle.id;return{source:a,target:r,sourceHandle:s,targetHandle:l}}var v3=(()=>{class t{constructor(){this.flowEntitiesService=w(ul),this.flowSettingsService=w(ts),this.edges=pe(()=>this.flowSettingsService.optimization().virtualization?this.viewportEdges().sort((A,i)=>A.renderOrder()-i.renderOrder()):[...this.flowEntitiesService.validEdges()].sort((A,i)=>A.renderOrder()-i.renderOrder())),this.viewportEdges=pe(()=>this.flowEntitiesService.validEdges().filter(A=>{let i=A.sourceHandle(),n=A.targetHandle();return i&&n})),this.maxOrder=pe(()=>Math.max(...this.flowEntitiesService.validEdges().map(A=>A.renderOrder())))}pull(A){A.renderOrder()!==0&&this.maxOrder()===A.renderOrder()||A.renderOrder.set(this.maxOrder()+1)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function LMA(t){return window.TouchEvent&&t instanceof TouchEvent}var TN=(()=>{class t{constructor(){this.hostElement=w(ce).nativeElement,this.pointerMovementDirective=w(Sy),this.pointerOver=ui(),this.pointerOut=ui(),this.pointerStart=ui(),this.pointerEnd=ui(),this.wasPointerOver=!1,this.touchEnd=this.pointerMovementDirective.touchEnd$.pipe(gt(({target:A})=>A===this.hostElement),di(({originalEvent:A})=>this.pointerEnd.emit(A)),wr()).subscribe(),this.touchOverOut=this.pointerMovementDirective.touchMovement$.pipe(di(({target:A,originalEvent:i})=>{this.handleTouchOverAndOut(A,i)}),wr()).subscribe()}onPointerStart(A){this.pointerStart.emit(A),LMA(A)&&this.pointerMovementDirective.setInitialTouch(A)}onPointerEnd(A){this.pointerEnd.emit(A)}onMouseOver(A){this.pointerOver.emit(A)}onMouseOut(A){this.pointerOut.emit(A)}handleTouchOverAndOut(A,i){A===this.hostElement?(this.pointerOver.emit(i),this.wasPointerOver=!0):(this.wasPointerOver&&this.pointerOut.emit(i),this.wasPointerOver=!1)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","pointerStart",""],["","pointerEnd",""],["","pointerOver",""],["","pointerOut",""]],hostBindings:function(i,n){i&1&&U("mousedown",function(a){return n.onPointerStart(a)})("touchstart",function(a){return n.onPointerStart(a)})("mouseup",function(a){return n.onPointerEnd(a)})("mouseover",function(a){return n.onMouseOver(a)})("mouseout",function(a){return n.onMouseOut(a)})},outputs:{pointerOver:"pointerOver",pointerOut:"pointerOut",pointerStart:"pointerStart",pointerEnd:"pointerEnd"}})}}return t})(),JN=(()=>{class t{constructor(){this.injector=w(Dt),this.selectionService=w(b3),this.flowSettingsService=w(ts),this.flowStatusService=w(KI),this.edgeRenderingService=w(v3),this.connectionController=w(ptA,{optional:!0}),this.model=me.required(),this.edgeTemplate=me(),this.edgeLabelHtmlTemplate=me(),this.isReconnecting=pe(()=>{let A=this.flowStatusService.status();return(A.state==="reconnection-start"||A.state==="reconnection-validation")&&A.payload.oldEdge===this.model()})}select(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}pull(){this.flowSettingsService.elevateEdgesOnSelect()&&this.edgeRenderingService.pull(this.model())}startReconnection(A,i){A.stopPropagation(),this.connectionController?.startReconnection(i,this.model())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","edge",""]],hostAttrs:[1,"selectable"],hostVars:2,hostBindings:function(i,n){i&2&&ut("visibility",n.isReconnecting()?"hidden":"visible")},inputs:{model:[1,"model"],edgeTemplate:[1,"edgeTemplate"],edgeLabelHtmlTemplate:[1,"edgeLabelHtmlTemplate"]},attrs:ObA,decls:6,vars:6,consts:[[1,"edge"],[1,"interactive-edge",3,"click"],[3,"ngTemplateOutlet","ngTemplateOutletContext","ngTemplateOutletInjector"],["edgeLabel","",3,"model","point","edgeModel","htmlTemplate"],["r","10",1,"reconnect-handle"],["r","10",1,"reconnect-handle",3,"pointerStart"]],template:function(i,n){if(i&1&&(O(0,YbA,2,6),O(1,zbA,1,1),O(2,jbA,1,1),O(3,VbA,1,1),O(4,ZbA,1,1),O(5,A7A,2,2)),i&2){let o,a,r;Y(n.model().type==="default"?0:-1),u(),Y(n.model().type==="template"&&n.edgeTemplate()?1:-1),u(),Y((o=n.model().edgeLabels.start)?2:-1,o),u(),Y((a=n.model().edgeLabels.center)?3:-1,a),u(),Y((r=n.model().edgeLabels.end)?4:-1,r),u(),Y(n.model().sourceHandle()&&n.model().targetHandle()?5:-1)}},dependencies:[Jc,FMA,TN],styles:[".edge[_ngcontent-%COMP%]{fill:none;stroke-width:2;stroke:#b1b1b7}.edge_selected[_ngcontent-%COMP%]{stroke-width:2.5;stroke:#0f4c75}.interactive-edge[_ngcontent-%COMP%]{fill:none;stroke-width:20;stroke:transparent}.reconnect-handle[_ngcontent-%COMP%]{fill:transparent;cursor:move}"],changeDetection:0})}}return t})(),LN=(()=>{class t{constructor(){this.node=bA(null)}createHandle(A){let i=this.node();i&&i.handles.update(n=>[...n,A])}destroyHandle(A){let i=this.node();i&&i.handles.update(n=>n.filter(o=>o!==A))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return kQ([by],t.prototype,"createHandle",null),t})(),GMA=(()=>{class t{constructor(){this.handleModel=me.required({alias:"handleSizeController"}),this.handleWrapper=w(ce)}ngAfterViewInit(){let A=this.handleWrapper.nativeElement,i=A.getBBox(),n=KMA(A);this.handleModel().size.set({width:i.width+n,height:i.height+n})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","handleSizeController",""]],inputs:{handleModel:[1,"handleSizeController","handleModel"]}})}}return t})();function KMA(t){let e=t.firstElementChild;if(e){let A=getComputedStyle(e).strokeWidth,i=Number(A.replace("px",""));return isNaN(i)?0:i}return 0}var UMA=(()=>{class t{constructor(){this.selected=me(!1)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["default-node"]],hostVars:2,hostBindings:function(i,n){i&2&&RA("selected",n.selected())},inputs:{selected:[1,"selected"]},ngContentSelectors:UN,decls:1,vars:0,template:function(i,n){i&1&&(Rt(),Ve(0))},styles:["[_nghost-%COMP%]{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}.selected[_nghost-%COMP%]{border-width:2px}"],changeDetection:0})}}return t})(),TMA=(()=>{class t{get model(){return this.nodeAccessor.model()}constructor(){this.nodeAccessor=w(gQ),this.rootPointer=w(Sy),this.viewportService=w(Kd),this.spacePointContext=w(w3),this.settingsService=w(ts),this.hostRef=w(ce),this.resizable=me(),this.resizerColor=me("#2e414c"),this.gap=me(1.5),this.resizer=So.required("resizer"),this.lineGap=3,this.handleSize=6,this.resizeSide=null,this.zoom=pe(()=>this.viewportService.readableViewport().zoom??0),this.minWidth=0,this.minHeight=0,this.maxWidth=1/0,this.maxHeight=1/0,this.resizeOnGlobalMouseMove=this.rootPointer.pointerMovement$.pipe(gt(()=>this.resizeSide!==null),gt(A=>A.movementX!==0||A.movementY!==0),di(A=>this.resize(A)),wr()).subscribe(),this.endResizeOnGlobalMouseUp=this.rootPointer.documentPointerEnd$.pipe(di(()=>this.endResize()),wr()).subscribe(),Ao(()=>{let A=this.resizable();typeof A=="boolean"?this.model.resizable.set(A):this.model.resizable.set(!0)},{allowSignalWrites:!0})}ngOnInit(){this.model.controlledByResizer.set(!0),this.model.resizerTemplate.set(this.resizer())}ngOnDestroy(){this.model.controlledByResizer.set(!1)}ngAfterViewInit(){this.minWidth=+getComputedStyle(this.hostRef.nativeElement).minWidth.replace("px","")||0,this.minHeight=+getComputedStyle(this.hostRef.nativeElement).minHeight.replace("px","")||0,this.maxWidth=+getComputedStyle(this.hostRef.nativeElement).maxWidth.replace("px","")||1/0,this.maxHeight=+getComputedStyle(this.hostRef.nativeElement).maxHeight.replace("px","")||1/0}startResize(A,i){i.stopPropagation(),this.resizeSide=A,this.model.resizing.set(!0)}resize(A){if(!this.resizeSide)return;let i=JMA(A.movementX,A.movementY,this.zoom()),n=this.applyResize(this.resizeSide,this.model,i,this.getDistanceToEdge(A)),{x:o,y:a,width:r,height:s}=OMA(n,this.model,this.resizeSide,this.minWidth,this.minHeight,this.maxWidth,this.maxHeight);this.model.setPoint({x:o,y:a}),this.model.width.set(r),this.model.height.set(s)}endResize(){this.resizeSide=null,this.model.resizing.set(!1)}getDistanceToEdge(A){let i=this.spacePointContext.documentPointToFlowPoint({x:A.x,y:A.y}),{x:n,y:o}=this.model.globalPoint();return{left:i.x-n,right:i.x-(n+this.model.width()),top:i.y-o,bottom:i.y-(o+this.model.height())}}applyResize(A,i,n,o){let{x:a,y:r}=i.point(),s=i.width(),l=i.height(),[g,C]=this.settingsService.snapGrid();switch(A){case"left":{let I=n.x+o.left,d=Ql(a+I,g),h=d-a;return{x:d,y:r,width:s-h,height:l}}case"right":{let I=n.x+o.right,d=Ql(s+I,g);return{x:a,y:r,width:d,height:l}}case"top":{let I=n.y+o.top,d=Ql(r+I,C),h=d-r;return{x:a,y:d,width:s,height:l-h}}case"bottom":{let I=n.y+o.bottom,d=Ql(l+I,C);return{x:a,y:r,width:s,height:d}}case"top-left":{let I=n.x+o.left,d=n.y+o.top,h=Ql(a+I,g),E=Ql(r+d,C),f=h-a,m=E-r;return{x:h,y:E,width:s-f,height:l-m}}case"top-right":{let I=n.x+o.right,d=n.y+o.top,h=Ql(r+d,C),E=h-r;return{x:a,y:h,width:Ql(s+I,g),height:l-E}}case"bottom-left":{let I=n.x+o.left,d=n.y+o.bottom,h=Ql(a+I,g),E=h-a;return{x:h,y:r,width:s-E,height:Ql(l+d,C)}}case"bottom-right":{let I=n.x+o.right,d=n.y+o.bottom;return{x:a,y:r,width:Ql(s+I,g),height:Ql(l+d,C)}}}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["","resizable",""]],viewQuery:function(i,n){i&1&&ns(n.resizer,e7A,5),i&2&&ur()},inputs:{resizable:[1,"resizable"],resizerColor:[1,"resizerColor"],gap:[1,"gap"]},attrs:t7A,ngContentSelectors:UN,decls:3,vars:0,consts:[["resizer",""],["stroke-width","2",1,"top",3,"pointerStart"],["stroke-width","2",1,"left",3,"pointerStart"],["stroke-width","2",1,"bottom",3,"pointerStart"],["stroke-width","2",1,"right",3,"pointerStart"],[1,"top-left",3,"pointerStart"],[1,"top-right",3,"pointerStart"],[1,"bottom-left",3,"pointerStart"],[1,"bottom-right",3,"pointerStart"]],template:function(i,n){i&1&&(Rt(),Et(0,i7A,9,40,"ng-template",null,0,$C),Ve(2))},dependencies:[TN],styles:[".top[_ngcontent-%COMP%]{cursor:n-resize}.left[_ngcontent-%COMP%]{cursor:w-resize}.right[_ngcontent-%COMP%]{cursor:e-resize}.bottom[_ngcontent-%COMP%]{cursor:s-resize}.top-left[_ngcontent-%COMP%]{cursor:nw-resize}.top-right[_ngcontent-%COMP%]{cursor:ne-resize}.bottom-left[_ngcontent-%COMP%]{cursor:sw-resize}.bottom-right[_ngcontent-%COMP%]{cursor:se-resize}"],changeDetection:0})}}return kQ([by],t.prototype,"ngAfterViewInit",null),t})();function JMA(t,e,A){return{x:py(t/A),y:py(e/A)}}function OMA(t,e,A,i,n,o,a){let{x:r,y:s,width:l,height:g}=t;l=Math.max(l,0),g=Math.max(g,0),l=Math.max(i,l),g=Math.max(n,g),l=Math.min(o,l),g=Math.min(a,g),r=Math.min(r,e.point().x+e.width()-i),s=Math.min(s,e.point().y+e.height()-n),r=Math.max(r,e.point().x+e.width()-o),s=Math.max(s,e.point().y+e.height()-a);let C=e.parent();if(C){let d=C.width(),h=C.height(),E=e.point().x,f=e.point().y;r=Math.max(r,0),s=Math.max(s,0),A.includes("left")&&r===0&&(l=Math.min(l,E+e.width())),A.includes("top")&&s===0&&(g=Math.min(g,f+e.height())),l=Math.min(l,d-r),g=Math.min(g,h-s)}let I=dtA(e.children());return I&&(A.includes("left")&&(r=Math.min(r,e.point().x+e.width()-(I.x+I.width)),l=Math.max(l,I.x+I.width)),A.includes("right")&&(l=Math.max(l,I.x+I.width)),A.includes("bottom")&&(g=Math.max(g,I.y+I.height)),A.includes("top")&&(s=Math.min(s,e.point().y+e.height()-(I.y+I.height)),g=Math.max(g,I.y+I.height))),{x:r,y:s,width:l,height:g}}var GN=class{constructor(e,A){this.rawHandle=e,this.parentNode=A,this.strokeWidth=2,this.size=bA({width:10+2*this.strokeWidth,height:10+2*this.strokeWidth}),this.pointAbsolute=pe(()=>({x:this.parentNode.globalPoint().x+this.hostOffset().x+this.sizeOffset().x,y:this.parentNode.globalPoint().y+this.hostOffset().y+this.sizeOffset().y})),this.state=bA("idle"),this.updateHostSizeAndPosition$=new ie,this.hostSize=Ar(this.updateHostSizeAndPosition$.pipe(we(()=>this.getHostSize())),{initialValue:{width:0,height:0}}),this.hostPosition=Ar(this.updateHostSizeAndPosition$.pipe(we(()=>({x:this.hostReference instanceof HTMLElement?this.hostReference.offsetLeft:0,y:this.hostReference instanceof HTMLElement?this.hostReference.offsetTop:0}))),{initialValue:{x:0,y:0}}),this.hostOffset=pe(()=>{switch(this.rawHandle.position){case"left":return{x:-this.rawHandle.userOffsetX,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case"right":return{x:-this.rawHandle.userOffsetX+this.parentNode.size().width,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case"top":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY};case"bottom":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY+this.parentNode.size().height}}}),this.sizeOffset=pe(()=>{switch(this.rawHandle.position){case"left":return{x:-(this.size().width/2),y:0};case"right":return{x:this.size().width/2,y:0};case"top":return{x:0,y:-(this.size().height/2)};case"bottom":return{x:0,y:this.size().height/2}}}),this.hostReference=this.rawHandle.hostReference,this.template=this.rawHandle.template,this.templateContext={$implicit:{point:this.hostOffset,state:this.state,node:this.parentNode.rawNode}}}updateHost(){this.updateHostSizeAndPosition$.next()}getHostSize(){return this.hostReference instanceof HTMLElement?{width:this.hostReference.offsetWidth,height:this.hostReference.offsetHeight}:this.hostReference instanceof SVGGraphicsElement?this.hostReference.getBBox():{width:0,height:0}}},M3=(()=>{class t{constructor(){this.injector=w(Dt),this.handleService=w(LN),this.element=w(ce).nativeElement,this.destroyRef=w(sr),this.position=me.required(),this.type=me.required(),this.id=me(),this.template=me(),this.offsetX=me(0),this.offsetY=me(0)}ngOnInit(){Xa(this.injector,()=>{let A=this.handleService.node();if(A){let i=new GN({position:this.position(),type:this.type(),id:this.id(),hostReference:this.element.parentElement,template:this.template(),userOffsetX:this.offsetX(),userOffsetY:this.offsetY()},A);this.handleService.createHandle(i),requestAnimationFrame(()=>i.updateHost()),this.destroyRef.onDestroy(()=>this.handleService.destroyHandle(i))}})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["handle"]],inputs:{position:[1,"position"],type:[1,"type"],id:[1,"id"],template:[1,"template"],offsetX:[1,"offsetX"],offsetY:[1,"offsetY"]},decls:0,vars:0,template:function(i,n){},encapsulation:2,changeDetection:0})}}return t})(),YMA=(()=>{class t{constructor(){this.nodeAccessor=w(gQ),this.zone=w(qe),this.destroyRef=w(sr),this.hostElementRef=w(ce)}ngOnInit(){this.nodeAccessor.model().handles$.pipe(hi(i=>ky([...i.map(n=>n.hostReference),this.hostElementRef.nativeElement],this.zone).pipe(we(()=>i))),di(i=>{i.forEach(n=>n.updateHost())}),wr(this.destroyRef)).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","nodeHandlesController",""]]})}}return t})(),HMA=(()=>{class t{constructor(){this.nodeAccessor=w(gQ),this.zone=w(qe),this.destroyRef=w(sr),this.hostElementRef=w(ce)}ngOnInit(){let A=this.nodeAccessor.model(),i=this.hostElementRef.nativeElement;Ki(ky([i],this.zone)).pipe(Sn(null),gt(()=>!A.resizing()),di(()=>{A.width.set(i.clientWidth),A.height.set(i.clientHeight)}),wr(this.destroyRef)).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","nodeResizeController",""]]})}}return t})(),mtA=(()=>{class t{constructor(){this.injector=w(Dt),this.handleService=w(LN),this.draggableService=w(BtA),this.flowStatusService=w(KI),this.nodeRenderingService=w(Ud),this.flowSettingsService=w(ts),this.selectionService=w(b3),this.hostRef=w(ce),this.nodeAccessor=w(gQ),this.overlaysService=w(utA),this.connectionController=w(ptA,{optional:!0}),this.model=me.required(),this.nodeTemplate=me(),this.nodeSvgTemplate=me(),this.groupNodeTemplate=me(),this.showMagnet=pe(()=>this.flowStatusService.status().state==="connection-start"||this.flowStatusService.status().state==="connection-validation"||this.flowStatusService.status().state==="reconnection-start"||this.flowStatusService.status().state==="reconnection-validation"),this.toolbars=pe(()=>this.overlaysService.nodeToolbarsMap().get(this.model()))}ngOnInit(){this.model().isVisible.set(!0),this.nodeAccessor.model.set(this.model()),this.handleService.node.set(this.model()),Ao(()=>{this.model().draggable()?this.draggableService.enable(this.hostRef.nativeElement,this.model()):this.draggableService.disable(this.hostRef.nativeElement)},{injector:this.injector})}ngOnDestroy(){this.model().isVisible.set(!1),this.draggableService.destroy(this.hostRef.nativeElement)}startConnection(A,i){A.stopPropagation(),this.connectionController?.startConnection(i)}validateConnection(A){this.connectionController?.validateConnection(A)}resetValidateConnection(A){this.connectionController?.resetValidateConnection(A)}endConnection(){this.connectionController?.endConnection()}pullNode(){this.flowSettingsService.elevateNodesOnSelect()&&this.nodeRenderingService.pullNode(this.model())}selectNode(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","node",""]],hostAttrs:[1,"vflow-node"],inputs:{model:[1,"model"],nodeTemplate:[1,"nodeTemplate"],nodeSvgTemplate:[1,"nodeSvgTemplate"],groupNodeTemplate:[1,"groupNodeTemplate"]},features:[Bt([LN,gQ])],attrs:n7A,decls:11,vars:7,consts:[[1,"selectable"],["nodeHandlesController","",1,"selectable"],["rx","5","ry","5",1,"default-group-node",3,"resizable","gap","resizerColor","default-group-node_selected","stroke","fill"],[1,"selectable",3,"click"],["nodeHandlesController","",3,"selected"],[3,"outerHTML"],["type","source","position","right"],["type","target","position","left"],["nodeHandlesController","","nodeResizeController","",1,"wrapper"],[3,"ngTemplateOutlet","ngTemplateOutletContext","ngTemplateOutletInjector"],["nodeHandlesController","",1,"selectable",3,"click"],[3,"ngComponentOutlet","ngComponentOutletInputs","ngComponentOutletInjector"],["rx","5","ry","5",1,"default-group-node",3,"click","resizable","gap","resizerColor"],[3,"ngTemplateOutlet"],["r","5",1,"default-handle"],[3,"handleSizeController"],[1,"magnet"],["r","5",1,"default-handle",3,"pointerStart","pointerEnd"],[3,"pointerStart","pointerEnd","handleSizeController"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"magnet",3,"pointerEnd","pointerOver","pointerOut"]],template:function(i,n){if(i&1&&(O(0,o7A,5,12,":svg:foreignObject",0),O(1,a7A,3,9,":svg:foreignObject",0),O(2,r7A,2,3,":svg:g",1),O(3,l7A,2,3),O(4,g7A,1,11,":svg:rect",2),O(5,c7A,2,3,":svg:g",1),O(6,d7A,1,1),Ue(7,f7A,4,4,null,null,ri),Ue(9,p7A,2,4,":svg:foreignObject",null,ri)),i&2){let o;Y(n.model().rawNode.type==="default"?0:-1),u(),Y(n.model().rawNode.type==="html-template"&&n.nodeTemplate()?1:-1),u(),Y(n.model().rawNode.type==="svg-template"&&n.nodeSvgTemplate()?2:-1),u(),Y(n.model().isComponentType?3:-1),u(),Y(n.model().rawNode.type==="default-group"?4:-1),u(),Y(n.model().rawNode.type==="template-group"&&n.groupNodeTemplate()?5:-1),u(),Y((o=n.model().resizerTemplate())?6:-1,o),u(),Te(n.model().handles()),u(2),Te(n.toolbars())}},dependencies:[TN,UMA,M3,Jc,Tc,TMA,GMA,YMA,HMA,os],styles:[".magnet[_ngcontent-%COMP%]{opacity:0}.wrapper[_ngcontent-%COMP%]{display:table-cell}.default-group-node[_ngcontent-%COMP%]{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected[_ngcontent-%COMP%]{stroke-width:2px}.default-handle[_ngcontent-%COMP%]{stroke:#fff;fill:#1b262c}"],changeDetection:0})}}return t})(),zMA=(()=>{class t{constructor(){this.flowStatusService=w(KI),this.spacePointContext=w(w3),this.flowEntitiesService=w(ul),this.model=me.required(),this.template=me(),this.path=pe(()=>{let A=this.flowStatusService.status(),i=this.model().curve;if(A.state==="connection-start"||A.state==="reconnection-start"){let n=A.payload.sourceHandle,o=n.pointAbsolute(),a=n.rawHandle.position,r=this.spacePointContext.svgCurrentSpacePoint(),s=ltA(n.rawHandle.position),l=this.getPathFactoryParams(o,r,a,s);switch(i){case"straight":return xN(l).path;case"bezier":return _N(l).path;case"smooth-step":return rQ(l).path;case"step":return rQ(l,0).path;default:return i(l).path}}if(A.state==="connection-validation"||A.state==="reconnection-validation"){let n=A.payload.sourceHandle,o=n.pointAbsolute(),a=n.rawHandle.position,r=A.payload.targetHandle,s=A.payload.valid?r.pointAbsolute():this.spacePointContext.svgCurrentSpacePoint(),l=A.payload.valid?r.rawHandle.position:ltA(n.rawHandle.position),g=this.getPathFactoryParams(o,s,a,l);switch(i){case"straight":return xN(g).path;case"bezier":return _N(g).path;case"smooth-step":return rQ(g).path;case"step":return rQ(g,0).path;default:return i(g).path}}return null}),this.markerUrl=pe(()=>{let A=this.model().settings.marker;return A?`url(#${sQ(JSON.stringify(A))})`:""}),this.defaultColor="rgb(177, 177, 183)"}getContext(){return{$implicit:{path:this.path,marker:this.markerUrl}}}getPathFactoryParams(A,i,n,o){return{mode:"connection",sourcePoint:A,targetPoint:i,sourcePosition:n,targetPosition:o,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","connection",""]],inputs:{model:[1,"model"],template:[1,"template"]},attrs:m7A,decls:2,vars:2,consts:[["fill","none","stroke-width","2"],[4,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(i,n){i&1&&(O(0,D7A,1,1),O(1,b7A,1,1)),i&2&&(Y(n.model().type==="default"?0:-1),u(),Y(n.model().type==="template"?1:-1))},dependencies:[Jc],encapsulation:2,changeDetection:0})}}return t})();function ltA(t){switch(t){case"top":return"bottom";case"bottom":return"top";case"left":return"right";case"right":return"left"}}function PMA(){return String.fromCharCode(65+Math.floor(Math.random()*26))+Date.now()}var jMA="#fff",qMA=20,VMA=2,gtA="rgb(177, 177, 183)",ctA=.1,WMA=!0,ZMA=(()=>{class t{constructor(){this.viewportService=w(Kd),this.rootSvg=w(My).element,this.settingsService=w(ts),this.backgroundSignal=this.settingsService.background,this.scaledGap=pe(()=>{let A=this.backgroundSignal();return A.type==="dots"?this.viewportService.readableViewport().zoom*(A.gap??qMA):0}),this.x=pe(()=>this.viewportService.readableViewport().x%this.scaledGap()),this.y=pe(()=>this.viewportService.readableViewport().y%this.scaledGap()),this.patternColor=pe(()=>{let A=this.backgroundSignal();return A.type==="dots"?A.color??gtA:gtA}),this.patternSize=pe(()=>{let A=this.backgroundSignal();return A.type==="dots"?this.viewportService.readableViewport().zoom*(A.size??VMA)/2:0}),this.bgImageSrc=pe(()=>{let A=this.backgroundSignal();return A.type==="image"?A.src:""}),this.imageSize=y3(po(this.backgroundSignal).pipe(hi(()=>XMA(this.bgImageSrc())),we(A=>({width:A.naturalWidth,height:A.naturalHeight}))),{initialValue:{width:0,height:0}}),this.scaledImageWidth=pe(()=>{let A=this.backgroundSignal();if(A.type==="image"){let i=A.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().width*i*(A.scale??ctA)}return 0}),this.scaledImageHeight=pe(()=>{let A=this.backgroundSignal();if(A.type==="image"){let i=A.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().height*i*(A.scale??ctA)}return 0}),this.imageX=pe(()=>{let A=this.backgroundSignal();return A.type==="image"?A.repeat?A.fixed?0:this.viewportService.readableViewport().x%this.scaledImageWidth():A.fixed?0:this.viewportService.readableViewport().x:0}),this.imageY=pe(()=>{let A=this.backgroundSignal();return A.type==="image"?A.repeat?A.fixed?0:this.viewportService.readableViewport().y%this.scaledImageHeight():A.fixed?0:this.viewportService.readableViewport().y:0}),this.repeated=pe(()=>{let A=this.backgroundSignal();return A.type==="image"&&(A.repeat??WMA)}),this.patternId=PMA(),this.patternUrl=`url(#${this.patternId})`,Ao(()=>{let A=this.backgroundSignal();A.type==="dots"&&(this.rootSvg.style.backgroundColor=A.backgroundColor??jMA),A.type==="solid"&&(this.rootSvg.style.backgroundColor=A.color)})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","background",""]],attrs:M7A,decls:2,vars:2,consts:[["patternUnits","userSpaceOnUse"],["x","0","y","0","width","100%","height","100%"]],template:function(i,n){i&1&&(O(0,S7A,3,10),O(1,_7A,2,2)),i&2&&(Y(n.backgroundSignal().type==="dots"?0:-1),u(),Y(n.backgroundSignal().type==="image"?1:-1))},encapsulation:2,changeDetection:0})}}return t})();function XMA(t){let e=new Image;return e.src=t,new Promise(A=>{e.onload=()=>A(e)})}var $MA=(()=>{class t{constructor(){this.markers=me.required(),this.defaultColor="rgb(177, 177, 183)"}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["defs","flowDefs",""]],inputs:{markers:[1,"markers"]},attrs:R7A,decls:3,vars:2,consts:[["viewBox","-10 -10 20 20","refX","0","refY","0"],["points","-5,-4 1,0 -5,4 -5,-4",1,"marker__arrow_closed",3,"stroke","stroke-width","fill"],["points","-5,-4 0,0 -5,4",1,"marker__arrow_default",3,"stroke","stroke-width"],["points","-5,-4 1,0 -5,4 -5,-4",1,"marker__arrow_closed"],["points","-5,-4 0,0 -5,4",1,"marker__arrow_default"]],template:function(i,n){i&1&&(Ue(0,L7A,3,7,":svg:marker",0,ri),Ht(2,"keyvalue")),i&2&&Te(si(2,0,n.markers()))},dependencies:[oL],styles:[".marker__arrow_default[_ngcontent-%COMP%]{stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;fill:none}.marker__arrow_closed[_ngcontent-%COMP%]{stroke-linecap:round;stroke-linejoin:round}"],changeDetection:0})}}return t})(),A9A=(()=>{class t{constructor(){this.host=w(ce),this.flowSettingsService=w(ts),this.flowWidth=pe(()=>{let A=this.flowSettingsService.view();return A==="auto"?"100%":A[0]}),this.flowHeight=pe(()=>{let A=this.flowSettingsService.view();return A==="auto"?"100%":A[1]}),ky([this.host.nativeElement],w(qe)).pipe(di(([A])=>{this.flowSettingsService.computedFlowWidth.set(A.contentRect.width),this.flowSettingsService.computedFlowHeight.set(A.contentRect.height)}),wr()).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["svg","flowSizeController",""]],hostVars:2,hostBindings:function(i,n){i&2&&te("width",n.flowWidth())("height",n.flowHeight())}})}}return t})(),e9A=(()=>{class t{constructor(){this.flowStatusService=w(KI)}resetConnection(){let A=this.flowStatusService.status();(A.state==="connection-start"||A.state==="reconnection-start")&&this.flowStatusService.setIdleStatus()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["svg","rootSvgContext",""]],hostBindings:function(i,n){i&1&&U("mouseup",function(){return n.resetConnection()},Pd)("touchend",function(){return n.resetConnection()},Pd)("contextmenu",function(){return n.resetConnection()})}})}}return t})();function KN(t,e){let A=[];for(let i of e){let{x:n,y:o}=i.globalPoint();t.x>=n&&t.x<=n+i.width()&&t.y>=o&&t.y<=o+i.height()&&A.push({x:t.x-n,y:t.y-o,spaceNodeId:i.rawNode.id})}return A.reverse(),A.push({spaceNodeId:null,x:t.x,y:t.y}),A}var ON=(()=>{class t{static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})(),t9A=(()=>{class t extends ON{shouldRenderNode(A){return!A.isVisible()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})()}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function i9A(t,e){if(Object.keys(e.preview().style).length){a9A(t,e);return}if(e.rawNode.type==="default"){n9A(t,e);return}if(e.rawNode.type==="default-group"){o9A(t,e);return}r9A(t,e)}function n9A(t,e){let A=e.globalPoint(),i=e.width(),n=e.height();wtA(t,e,5),t.fillStyle="white",t.fill(),t.strokeStyle="#1b262c",t.lineWidth=1.5,t.stroke(),t.fillStyle="black",t.font="14px Arial",t.textAlign="center",t.textBaseline="middle";let o=A.x+i/2,a=A.y+n/2;t.fillText(e.text(),o,a)}function o9A(t,e){let A=e.globalPoint(),i=e.width(),n=e.height();t.globalAlpha=.05,t.fillStyle=e.color(),t.fillRect(A.x,A.y,i,n),t.globalAlpha=1,t.strokeStyle=e.color(),t.lineWidth=1.5,t.strokeRect(A.x,A.y,i,n)}function a9A(t,e){let A=e.globalPoint(),i=e.width(),n=e.height(),o=e.preview().style;if(o.borderRadius){let a=parseFloat(o.borderRadius);wtA(t,e,a)}else t.beginPath(),t.rect(A.x,A.y,i,n),t.closePath();o.backgroundColor&&(t.fillStyle=o.backgroundColor),o.borderColor&&(t.strokeStyle=o.borderColor),o.borderWidth&&(t.lineWidth=parseFloat(o.borderWidth)),t.fill(),t.stroke()}function r9A(t,e){let A=e.globalPoint(),i=e.width(),n=e.height();t.fillStyle="rgb(0 0 0 / 10%)",t.fillRect(A.x,A.y,i,n)}function wtA(t,e,A){let i=e.globalPoint(),n=e.width(),o=e.height();t.beginPath(),t.moveTo(i.x+A,i.y),t.lineTo(i.x+n-A,i.y),t.quadraticCurveTo(i.x+n,i.y,i.x+n,i.y+A),t.lineTo(i.x+n,i.y+o-A),t.quadraticCurveTo(i.x+n,i.y+o,i.x+n-A,i.y+o),t.lineTo(i.x+A,i.y+o),t.quadraticCurveTo(i.x,i.y+o,i.x,i.y+o-A),t.lineTo(i.x,i.y+A),t.quadraticCurveTo(i.x,i.y,i.x+A,i.y),t.closePath()}var s9A=(()=>{class t{constructor(){this.viewportService=w(Kd),this.renderStrategy=w(ON),this.nodeRenderingService=w(Ud),this.renderer2=w(Pi),this.element=w(ce).nativeElement,this.ctx=this.element.getContext("2d"),this.width=me(0),this.height=me(0),this.dpr=window.devicePixelRatio,Ao(()=>{this.renderer2.setProperty(this.element,"width",this.width()*this.dpr),this.renderer2.setProperty(this.element,"height",this.height()*this.dpr),this.renderer2.setStyle(this.element,"width",`${this.width()}px`),this.renderer2.setStyle(this.element,"height",`${this.height()}px`),this.ctx.scale(this.dpr,this.dpr)}),Ao(()=>{let A=this.viewportService.readableViewport();this.ctx.clearRect(0,0,this.width(),this.height()),this.ctx.save(),this.ctx.setTransform(A.zoom*this.dpr,0,0,A.zoom*this.dpr,A.x*this.dpr,A.y*this.dpr);for(let i=0;i{class t{constructor(){this.nodeRenderingService=w(Ud),this.edgeRenderingService=w(v3),this.flowEntitiesService=w(ul),this.settingsService=w(ts),this.flowInitialized=bA(!1),w(qe).runOutsideAngular(()=>lt(this,null,function*(){yield l9A(2),this.flowInitialized.set(!0)}))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=qA({token:t,factory:t.\u0275fac})}}return t})();function l9A(t){return new Promise(e=>{let A=0;function i(){A++,A{class t{constructor(){this.nodeRenderingService=w(Ud),this.flowStatus=w(KI),this.tolerance=me(10),this.lineColor=me("#1b262c"),this.isNodeDragging=pe(()=>etA(this.flowStatus.status())),this.intersections=yy(A=>{let i=this.flowStatus.status();if(etA(i)){let n=i.payload.node,o=ItA(uy(n)),a=this.nodeRenderingService.viewportNodes().filter(I=>I!==n).filter(I=>!n.children().includes(I)).map(I=>ItA(uy(I))),r=[],s=o.x,l=o.y,g=1/0,C=1/0;return a.forEach(I=>{let d=o.left+o.width/2,h=I.left+I.width/2;for(let[m,v,k,S]of[[d,h,h-o.width/2,!0],[o.left,I.left,I.left,!1],[o.left,I.right,I.right,!1],[o.right,I.left,I.left-o.width,!1],[o.right,I.right,I.right-o.width,!1]]){let b=Math.abs(m-v);if(b<=this.tolerance()){let x=Math.min(o.top,I.top),F=Math.max(o.bottom,I.bottom);if(r.push({x:v,y:x,x2:v,y2:F,isCenter:S}),bA.payload.node),we(A=>[A,this.intersections()]),di(([A,i])=>{if(i){let n={x:i.snappedX,y:i.snappedY},o=A.parent()?[A.parent()]:[];A.setPoint(KN(n,o)[0])}}),wr()).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","alignmentHelper",""]],inputs:{tolerance:[1,"tolerance"],lineColor:[1,"lineColor"]},attrs:K7A,decls:1,vars:1,template:function(i,n){i&1&&O(0,J7A,1,1),i&2&&Y(n.isNodeDragging()?0:-1)},encapsulation:2,changeDetection:0})}}return t})();var xy=(()=>{class t{constructor(){this.viewportService=w(Kd),this.flowEntitiesService=w(ul),this.nodesChangeService=w(NN),this.edgesChangeService=w(FN),this.nodeRenderingService=w(Ud),this.edgeRenderingService=w(v3),this.flowSettingsService=w(ts),this.componentEventBusService=w(kN),this.keyboardService=w(SN),this.injector=w(Dt),this.flowRenderingService=w(CtA),this.alignmentHelper=me(!1),this.nodeModels=this.nodeRenderingService.nodes,this.groups=this.nodeRenderingService.groups,this.nonGroups=this.nodeRenderingService.nonGroups,this.edgeModels=this.edgeRenderingService.edges,this.onComponentNodeEvent=kn(this.componentEventBusService.event$),this.nodeTemplateDirective=J0(lQ),this.nodeSvgTemplateDirective=J0(ntA),this.groupNodeTemplateDirective=J0(wy),this.edgeTemplateDirective=J0(my),this.edgeLabelHtmlDirective=J0(itA),this.connectionTemplateDirective=J0(ttA),this.mapContext=So(vN),this.spacePointContext=So.required(w3),this.viewport=this.viewportService.readableViewport.asReadonly(),this.nodesChange=y3(this.nodesChangeService.changes$,{initialValue:[]}),this.edgesChange=y3(this.edgesChangeService.changes$,{initialValue:[]}),this.initialized=this.flowRenderingService.flowInitialized.asReadonly(),this.viewportChange$=po(this.viewportService.readableViewport).pipe(wl(1)),this.nodesChange$=this.nodesChangeService.changes$,this.edgesChange$=this.edgesChangeService.changes$,this.initialized$=po(this.flowRenderingService.flowInitialized),this.markers=this.flowEntitiesService.markers,this.minimap=this.flowEntitiesService.minimap,this.flowOptimization=this.flowSettingsService.optimization,this.flowWidth=this.flowSettingsService.computedFlowWidth,this.flowHeight=this.flowSettingsService.computedFlowHeight}set view(A){this.flowSettingsService.view.set(A)}set minZoom(A){this.flowSettingsService.minZoom.set(A)}set maxZoom(A){this.flowSettingsService.maxZoom.set(A)}set background(A){this.flowSettingsService.background.set(NMA(A))}set optimization(A){this.flowSettingsService.optimization.update(i=>gA(gA({},i),A))}set entitiesSelectable(A){this.flowSettingsService.entitiesSelectable.set(A)}set keyboardShortcuts(A){this.keyboardService.setShortcuts(A)}set connection(A){this.flowEntitiesService.connection.set(A)}get connection(){return this.flowEntitiesService.connection()}set snapGrid(A){this.flowSettingsService.snapGrid.set(A)}set elevateNodesOnSelect(A){this.flowSettingsService.elevateNodesOnSelect.set(A)}set elevateEdgesOnSelect(A){this.flowSettingsService.elevateEdgesOnSelect.set(A)}set nodes(A){let i=Xa(this.injector,()=>vy.nodes(A,this.flowEntitiesService.nodes()));otA(i,this.flowEntitiesService.edges()),this.flowEntitiesService.nodes.set(i),i.forEach(n=>this.nodeRenderingService.pullNode(n))}set edges(A){let i=Xa(this.injector,()=>vy.edges(A,this.flowEntitiesService.edges()));otA(this.flowEntitiesService.nodes(),i),this.flowEntitiesService.edges.set(i)}viewportTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:A,duration:0})}zoomTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:{zoom:A},duration:0})}panTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:A,duration:0})}fitView(A){this.viewportService.fitView(A)}getNode(A){return this.flowEntitiesService.getNode(A)?.rawNode}getDetachedEdges(){return this.flowEntitiesService.getDetachedEdges().map(A=>A.edge)}documentPointToFlowPoint(A,i){let n=this.spacePointContext().documentPointToFlowPoint(A);return i?.spaces?KN(n,this.nodeRenderingService.groups()):n}getIntesectingNodes(A,i={partially:!0}){return tMA(A,this.nodeModels(),i).map(n=>n.rawNode)}toNodeSpace(A,i){let n=this.nodeModels().find(a=>a.rawNode.id===A);if(!n)return{x:1/0,y:1/0};if(i===null)return n.globalPoint();let o=this.nodeModels().find(a=>a.rawNode.id===i);return o?KN(n.globalPoint(),[o])[0]:{x:1/0,y:1/0}}trackNodes(A,{rawNode:i}){return i}trackEdges(A,{edge:i}){return i}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["vflow"]],contentQueries:function(i,n,o){i&1&&ep(o,n.nodeTemplateDirective,lQ,5)(o,n.nodeSvgTemplateDirective,ntA,5)(o,n.groupNodeTemplateDirective,wy,5)(o,n.edgeTemplateDirective,my,5)(o,n.edgeLabelHtmlDirective,itA,5)(o,n.connectionTemplateDirective,ttA,5),i&2&&ur(6)},viewQuery:function(i,n){i&1&&ns(n.mapContext,vN,5)(n.spacePointContext,w3,5),i&2&&ur(2)},inputs:{view:"view",minZoom:"minZoom",maxZoom:"maxZoom",background:"background",optimization:"optimization",entitiesSelectable:"entitiesSelectable",keyboardShortcuts:"keyboardShortcuts",connection:[2,"connection","connection",A=>new fy(A)],snapGrid:"snapGrid",elevateNodesOnSelect:"elevateNodesOnSelect",elevateEdgesOnSelect:"elevateEdgesOnSelect",nodes:"nodes",alignmentHelper:[1,"alignmentHelper"],edges:"edges"},outputs:{onComponentNodeEvent:"onComponentNodeEvent"},features:[Bt([BtA,Kd,KI,ul,NN,FN,Ud,v3,b3,ts,kN,SN,utA,{provide:ON,useClass:t9A},CtA]),Z3([{directive:RMA,outputs:["onNodesChange","onNodesChange","onNodesChange.position","onNodesChange.position","onNodesChange.position.single","onNodesChange.position.single","onNodesChange.position.many","onNodesChange.position.many","onNodesChange.size","onNodesChange.size","onNodesChange.size.single","onNodesChange.size.single","onNodesChange.size.many","onNodesChange.size.many","onNodesChange.add","onNodesChange.add","onNodesChange.add.single","onNodesChange.add.single","onNodesChange.add.many","onNodesChange.add.many","onNodesChange.remove","onNodesChange.remove","onNodesChange.remove.single","onNodesChange.remove.single","onNodesChange.remove.many","onNodesChange.remove.many","onNodesChange.select","onNodesChange.select","onNodesChange.select.single","onNodesChange.select.single","onNodesChange.select.many","onNodesChange.select.many","onEdgesChange","onEdgesChange","onEdgesChange.detached","onEdgesChange.detached","onEdgesChange.detached.single","onEdgesChange.detached.single","onEdgesChange.detached.many","onEdgesChange.detached.many","onEdgesChange.add","onEdgesChange.add","onEdgesChange.add.single","onEdgesChange.add.single","onEdgesChange.add.many","onEdgesChange.add.many","onEdgesChange.remove","onEdgesChange.remove","onEdgesChange.remove.single","onEdgesChange.remove.single","onEdgesChange.remove.many","onEdgesChange.remove.many","onEdgesChange.select","onEdgesChange.select","onEdgesChange.select.single","onEdgesChange.select.single","onEdgesChange.select.many","onEdgesChange.select.many"]}])],decls:11,vars:8,consts:[["flow",""],["rootSvgRef","","rootSvgContext","","rootPointer","","flowSizeController","",1,"root-svg"],["flowDefs","",3,"markers"],["background",""],["mapContext","","spacePointContext",""],["connection","",3,"model","template"],[3,"ngTemplateOutlet"],["previewFlow","",1,"preview-flow",3,"width","height"],["alignmentHelper",""],["alignmentHelper","",3,"tolerance","lineColor"],["node","",3,"model","groupNodeTemplate"],["edge","",3,"model","edgeTemplate","edgeLabelHtmlTemplate"],["node","",3,"model","nodeTemplate","nodeSvgTemplate"],["node","",3,"model","nodeTemplate","nodeSvgTemplate","groupNodeTemplate"]],template:function(i,n){if(i&1&&(Ct(),B(0,"svg",1,0),hA(2,"defs",2)(3,"g",3),B(4,"g",4),O(5,H7A,2,1),hA(6,"g",5),O(7,q7A,6,0),O(8,Z7A,4,0),Q(),O(9,X7A,1,1,":svg:ng-container",6),Q(),O(10,$7A,1,2,"canvas",7)),i&2){let o,a,r;u(2),H("markers",n.markers()),u(3),Y((o=n.alignmentHelper())?5:-1,o),u(),H("model",n.connection)("template",(a=n.connectionTemplateDirective())==null?null:a.templateRef),u(),Y(n.flowOptimization().detachedGroupsLayer?7:-1),u(),Y(n.flowOptimization().detachedGroupsLayer?-1:8),u(),Y((r=n.minimap())?9:-1,r),u(),Y(n.flowOptimization().virtualization?10:-1)}},dependencies:[My,e9A,Sy,A9A,$MA,ZMA,vN,w3,zMA,mtA,JN,Jc,s9A,g9A],styles:["[_nghost-%COMP%]{display:grid;grid-template-columns:1fr;width:100%;height:100%;-webkit-user-select:none;user-select:none}[_nghost-%COMP%] *{box-sizing:border-box}.root-svg[_ngcontent-%COMP%]{grid-row-start:1;grid-column-start:1}.preview-flow[_ngcontent-%COMP%]{pointer-events:none;grid-row-start:1;grid-column-start:1}"],changeDetection:0})}}return t})();var _y=(()=>{class t{constructor(){this.flowSettingsService=w(ts),this.selectionService=w(b3),this.parentEdge=w(JN,{optional:!0}),this.parentNode=w(mtA,{optional:!0}),this.host=w(ce),this.selectOnEvent=this.getEvent$().pipe(di(()=>this.select()),wr()).subscribe()}select(){let A=this.entity();A&&this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(A)}entity(){return this.parentNode?this.parentNode.model():this.parentEdge?this.parentEdge.model():null}getEvent$(){return Lc(this.host.nativeElement,"click")}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=VA({type:t,selectors:[["","selectable",""]]})}}return t})();var DtA=(()=>{class t{constructor(){this.edge=w(JN),this.flowSettingsService=w(ts),this.edgeRenderingService=w(v3),this.model=this.edge.model(),this.context=this.model.context.$implicit}pull(){this.flowSettingsService.elevateEdgesOnSelect()&&this.edgeRenderingService.pull(this.model)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=SA({type:t,selectors:[["g","customTemplateEdge",""]],hostBindings:function(i,n){i&1&&U("mousedown",function(){return n.pull()})("touchstart",function(){return n.pull()})},attrs:AMA,ngContentSelectors:UN,decls:3,vars:1,consts:[["interactiveEdge",""],[1,"interactive-edge"]],template:function(i,n){i&1&&(Rt(),Ve(0),Ct(),Kn(1,"path",1,0)),i&2&&(u(),te("d",n.context.path()))},styles:[".interactive-edge[_ngcontent-%COMP%]{fill:none;stroke-width:20;stroke:transparent}"],changeDetection:0})}}return t})();var c9A=["canvas"],C9A=["svgCanvas"],I9A=()=>({type:"dots",color:"#424242",size:1,gap:12}),d9A=()=>[12,12],B9A=(t,e)=>e.name;function E9A(t,e){if(t&1){let A=QA();B(0,"div",6)(1,"div",11)(2,"button",12),U("click",function(){T(A);let n=p();return J(n.backToMainCanvas())}),B(3,"mat-icon"),y(4,"arrow_back"),Q()(),B(5,"div",13)(6,"span",14),y(7,"smart_toy"),Q(),B(8,"div",15)(9,"h3",16),y(10),Q(),B(11,"p",17),y(12,"Agent Tool"),Q()()()()()}if(t&2){let A=p();u(2),H("matTooltip",A.getBackButtonTooltip()),u(8),lA(A.currentAgentTool())}}function h9A(t,e){if(t&1){let A=QA();B(0,"span",18),U("click",function(){T(A);let n=p();return J(n.toggleSidePanelRequest.emit())}),y(1,"left_panel_open"),Q()}}function Q9A(t,e){if(t&1){let A=QA();Ct(),B(0,"foreignObject"),rr(),B(1,"div",27),U("click",function(n){return n.stopPropagation()}),B(2,"button",28,0),U("click",function(n){return n.stopPropagation()}),B(4,"mat-icon"),y(5,"add"),Q()(),B(6,"span",29),y(7,"Add sub-agent"),Q(),B(8,"mat-menu",null,1)(10,"button",30),U("click",function(n){let o;T(A);let a=Qi(3),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("LlmAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),B(11,"mat-icon"),y(12,"psychology"),Q(),B(13,"span"),y(14,"LLM Agent"),Q()(),B(15,"button",30),U("click",function(n){let o;T(A);let a=Qi(3),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("SequentialAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),B(16,"mat-icon"),y(17,"more_horiz"),Q(),B(18,"span"),y(19,"Sequential Agent"),Q()(),B(20,"button",30),U("click",function(n){let o;T(A);let a=Qi(3),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("LoopAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),B(21,"mat-icon"),y(22,"sync"),Q(),B(23,"span"),y(24,"Loop Agent"),Q()(),B(25,"button",30),U("click",function(n){let o;T(A);let a=Qi(3),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("ParallelAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),B(26,"mat-icon"),y(27,"density_medium"),Q(),B(28,"span"),y(29,"Parallel Agent"),Q()()()()()}if(t&2){let A=Qi(9),i=p().$implicit;te("width",200)("height",100)("x",i.width()/2-100)("y",i.height()/2-40),u(2),H("matMenuTriggerFor",A)}}function u9A(t,e){t&1&&(Ct(),hA(0,"handle",26))}function f9A(t,e){if(t&1){let A=QA();Ct(),B(0,"g")(1,"rect",21),U("click",function(n){let o=T(A).$implicit,a=p(2);return J(a.onGroupClick(o.node,n))})("pointerdown",function(n){let o=T(A).$implicit,a=p(2);return J(a.onGroupPointerDown(o.node,n))}),Q(),B(2,"foreignObject",22),rr(),B(3,"div",23)(4,"mat-icon",24),y(5),Q(),B(6,"span",25),y(7),Q()()(),O(8,Q9A,30,5,":svg:foreignObject"),O(9,u9A,1,0,":svg:handle",26),Q()}if(t&2){let A,i,n=e.$implicit,o=p(2);u(),ut("stroke",o.isGroupSelected(n.node)?"rgba(0, 187, 234, 0.8)":"rgba(0, 187, 234, 0.3)")("fill",o.isGroupSelected(n.node)?"rgba(0, 187, 234, 0.1)":"rgba(0, 187, 234, 0.03)")("stroke-width",o.isGroupSelected(n.node)?3:2),te("width",n.width())("height",n.height()),u(),te("width",200)("height",32),u(3),lA(o.getAgentIcon(n.node.data==null||(A=n.node.data())==null?null:A.agent_class)),u(2),lA(n.node.data==null||(i=n.node.data())==null?null:i.agent_class),u(),Y(o.isGroupEmpty(n.node.id)?8:-1),u(),Y(o.shouldShowTopHandle(n.node)?9:-1)}}function p9A(t,e){t&1&&(B(0,"span",35),y(1,"Root"),Q())}function m9A(t,e){if(t&1){let A=QA();B(0,"button",43),U("click",function(n){T(A),p();let o=zn(0);return p(2).openDeleteSubAgentDialog(o),J(n.stopPropagation())}),B(1,"mat-icon"),y(2,"delete"),Q()()}}function w9A(t,e){if(t&1){let A=QA();B(0,"div",46),U("click",function(n){let o=T(A).$implicit,a=p(2).$implicit;return p(2).selectTool(o,a.node),J(n.stopPropagation())}),B(1,"mat-icon",47),y(2),Q(),B(3,"span",48),y(4),Q()()}if(t&2){let A=e.$implicit,i=p(4);u(2),lA(i.getToolIcon(A)),u(2),lA(A.name)}}function D9A(t,e){if(t&1&&(B(0,"div",38)(1,"div",44),Ue(2,w9A,5,2,"div",45,B9A),Q()()),t&2){p();let A=zn(3);u(2),Te(A)}}function y9A(t,e){if(t&1){let A=QA();B(0,"div",39)(1,"button",49,2),U("click",function(n){return n.stopPropagation()}),B(3,"span",50),y(4,"+"),Q()(),B(5,"mat-menu",null,3)(7,"button",30),U("click",function(n){let o;T(A);let a=Qi(2),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("LlmAgent",(o=r.node.data())==null?null:o.name,a,n))}),B(8,"mat-icon"),y(9,"psychology"),Q(),B(10,"span"),y(11,"LLM Agent"),Q()(),B(12,"button",30),U("click",function(n){let o;T(A);let a=Qi(2),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("SequentialAgent",(o=r.node.data())==null?null:o.name,a,n))}),B(13,"mat-icon"),y(14,"more_horiz"),Q(),B(15,"span"),y(16,"Sequential Agent"),Q()(),B(17,"button",30),U("click",function(n){let o;T(A);let a=Qi(2),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("LoopAgent",(o=r.node.data())==null?null:o.name,a,n))}),B(18,"mat-icon"),y(19,"sync"),Q(),B(20,"span"),y(21,"Loop Agent"),Q()(),B(22,"button",30),U("click",function(n){let o;T(A);let a=Qi(2),r=p().$implicit,s=p(2);return J(s.handleAgentTypeSelection("ParallelAgent",(o=r.node.data())==null?null:o.name,a,n))}),B(23,"mat-icon"),y(24,"density_medium"),Q(),B(25,"span"),y(26,"Parallel Agent"),Q()()()()}if(t&2){let A=Qi(6);u(),H("matMenuTriggerFor",A)}}function v9A(t,e){t&1&&hA(0,"handle",40)}function b9A(t,e){t&1&&hA(0,"handle",26)}function M9A(t,e){t&1&&hA(0,"handle",41)}function S9A(t,e){t&1&&hA(0,"handle",42)}function k9A(t,e){if(t&1){let A=QA();ta(0)(1),Ht(2,"async"),ta(3),B(4,"div",31),U("click",function(n){let o=T(A).$implicit,a=p(2);return J(a.onCustomTemplateNodeClick(o.node,n))})("pointerdown",function(n){let o=T(A).$implicit,a=p(2);return J(a.onNodePointerDown(o.node,n))}),B(5,"div",32)(6,"div",33)(7,"mat-icon",34),y(8),Q(),y(9),O(10,p9A,2,0,"span",35),Q(),B(11,"div",36),O(12,m9A,3,0,"button",37),Q()(),O(13,D9A,4,0,"div",38),O(14,y9A,27,1,"div",39),O(15,v9A,1,0,"handle",40),O(16,b9A,1,0,"handle",26),O(17,M9A,1,0,"handle",41),O(18,S9A,1,0,"handle",42),Q()}if(t&2){let A=e.$implicit,i=p(2),n=A.node.data==null?null:A.node.data(),o=ga((n==null?null:n.name)||"root_agent"),a=si(2,17,i.toolsMap$);u(3);let s=ga(i.getToolsForNode(o,a)).length>0;u(),RA("custom-node_selected",i.isNodeSelected(A.node))("custom-node_has-tools",s)("in-group",A.node.parentId&&A.node.parentId()),u(4),lA(i.getAgentIcon(n==null?null:n.agent_class)),u(),ue(" ",o," "),u(),Y(i.isRootAgent(o)?10:-1),u(2),Y(i.isRootAgentForCurrentTab(o)?-1:12),u(),Y(s?13:-1),u(),Y(i.shouldShowAddButton(A.node)?14:-1),u(),Y(i.shouldShowLeftHandle(A.node)?15:-1),u(),Y(i.shouldShowTopHandle(A.node)?16:-1),u(),Y(i.shouldShowRightHandle(A.node)?17:-1),u(),Y(i.shouldShowBottomHandle(A.node)?18:-1)}}function x9A(t,e){if(t&1&&(B(0,"vflow",8),Et(1,f9A,10,14,"ng-template",19)(2,k9A,19,20,"ng-template",20),Q()),t&2){let A=p();H("nodes",A.vflowNodes())("edges",A.edges())("background",Kc(4,I9A))("snapGrid",Kc(5,d9A))}}function _9A(t,e){t&1&&(B(0,"div",9)(1,"div",51)(2,"mat-icon",52),y(3,"touch_app"),Q(),B(4,"h4"),y(5,"Start Building Your ADK"),Q(),B(6,"p"),y(7,"Drag components from the left panel to create your workflow"),Q(),B(8,"div",53)(9,"div",54)(10,"mat-icon"),y(11,"drag_indicator"),Q(),B(12,"span"),y(13,"Drag to move nodes"),Q()(),B(14,"div",54)(15,"mat-icon"),y(16,"link"),Q(),B(17,"span"),y(18,"Shift + Click to connect nodes"),Q()()()()())}var cQ=class t{constructor(e,A,i){this.dialog=e;this.agentService=A;this.router=i;this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.agentBuilderService.getSelectedTool().subscribe(n=>{this.selectedTool=n})}_snackBar=w(h2);canvasRef;svgCanvasRef;agentBuilderService=w(e0);cdr=w(wt);showSidePanel=!0;showBuilderAssistant=!1;appNameInput="";toggleSidePanelRequest=new LA;builderAssistantCloseRequest=new LA;ctx;connections=bA([]);nodeId=1;edgeId=1;callbackId=1;toolId=1;appName="";nodes=bA([]);edges=bA([]);workflowShellWidth=340;workflowGroupWidth=420;workflowGroupHeight=220;workflowGroupYOffset=180;workflowGroupXOffset=-40;workflowInnerNodePoint={x:40,y:80};groupNodes=bA([]);vflowNodes=pe(()=>[...this.groupNodes(),...this.nodes()]);selectedAgents=[];selectedTool;selectedCallback;currentAgentTool=bA(null);agentToolBoards=bA(new Map);isAgentToolMode=!1;navigationStack=[];existingAgent=void 0;toolsMap$;nodePositions=new Map;ngOnInit(){this.agentService.getApp().subscribe(e=>{e&&(this.appName=e)}),this.appNameInput&&(this.appName=this.appNameInput),this.agentBuilderService.getNewTabRequest().subscribe(e=>{if(e){let{tabName:A,currentAgentName:i}=e;this.switchToAgentToolBoard(A,i)}}),this.agentBuilderService.getTabDeletionRequest().subscribe(e=>{e&&this.deleteAgentToolBoard(e)}),this.agentBuilderService.getSelectedCallback().subscribe(e=>{this.selectedCallback=e}),this.agentBuilderService.getAgentCallbacks().subscribe(e=>{if(e){let A=this.nodes().find(i=>i.data?i.data().name===e.agentName:void 0);if(A&&A.data){let i=A.data();i.callbacks=e.callbacks,A.data.set(i)}}}),this.agentBuilderService.getDeleteSubAgentSubject().subscribe(e=>{e&&this.openDeleteSubAgentDialog(e)}),this.agentBuilderService.getAddSubAgentSubject().subscribe(e=>{e.parentAgentName&&this.addSubAgent(e.parentAgentName,e.agentClass,e.isFromEmptyGroup)}),this.agentBuilderService.getSelectedNode().subscribe(e=>{this.selectedAgents=this.nodes().filter(A=>A.data&&A.data().name===e?.name)}),this.toolsMap$.subscribe(e=>{this.nodes().some(i=>i.parentId&&i.parentId())&&this.groupNodes().length>0&&this.updateGroupDimensions()})}ngOnChanges(e){e.appNameInput&&e.appNameInput.currentValue&&(this.appName=e.appNameInput.currentValue)}ngAfterViewInit(){}onCustomTemplateNodeClick(e,A){this.shouldIgnoreNodeInteraction(A.target)||this.selectAgentNode(e,{openConfig:!0})}onNodePointerDown(e,A){this.shouldIgnoreNodeInteraction(A.target)||this.selectAgentNode(e,{openConfig:!1})}onGroupClick(e,A){if(A.stopPropagation(),!e?.data)return;let i=e.data().name,n=this.nodes().find(o=>o.data&&o.data().name===i);n&&this.selectAgentNode(n,{openConfig:!0})}onGroupPointerDown(e,A){if(A.stopPropagation(),!e?.data)return;let i=e.data().name,n=this.nodes().find(o=>o.data&&o.data().name===i);n&&this.selectAgentNode(n,{openConfig:!1})}onCanvasClick(e){let A=e.target;if(!A)return;let i=[".custom-node",".action-button-bar",".add-subagent-btn",".open-panel-btn",".agent-tool-banner",".mat-mdc-menu-panel"];A.closest(i.join(","))||this.clearCanvasSelection()}shouldIgnoreNodeInteraction(e){return e?!!e.closest("mat-chip, .add-subagent-btn, .mat-mdc-menu-panel"):!1}selectAgentNode(e,A={}){if(!e?.data)return;let i=this.agentBuilderService.getNode(e.data().name);i&&(this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedNode(i),this.nodePositions.set(i.name,gA({},e.point())),A.openConfig&&this.agentBuilderService.requestSideTabChange("config"))}handleAgentTypeSelection(e,A,i,n,o=!1){n.stopPropagation(),i?.closeMenu(),this.onAgentTypeSelected(e,A,o)}clearCanvasSelection(){!this.selectedAgents.length&&!this.selectedTool&&!this.selectedCallback||(this.selectedAgents=[],this.selectedTool=void 0,this.selectedCallback=void 0,this.agentBuilderService.setSelectedNode(void 0),this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedCallback(void 0),this.cdr.markForCheck())}onAddResource(e){}onAgentTypeSelected(e,A,i=!1){A&&this.addSubAgent(A,e,i)}generateNodeId(){return this.nodeId+=1,this.nodeId.toString()}generateEdgeId(){return this.edgeId+=1,this.edgeId.toString()}createNode(e,A,i){let n=bA(e),a={id:this.generateNodeId(),point:bA(gA({},A)),type:"html-template",data:n};return i&&(a.parentId=bA(i)),this.nodePositions.set(e.name,gA({},a.point())),a}createWorkflowGroup(e,A,i,n,o,a){let r,s=null;if(n){let d=(o||this.groupNodes()).find(h=>h.id===n);if(d){let h=d.point(),E=d.height?d.height():this.workflowGroupHeight;if(a&&o){let f=a.filter(m=>m.parentId&&m.parentId()===d.id);if(f.length>0){let z=0;for(let P of f){let Z=P.data?P.data():void 0,tA=120;Z&&Z.tools&&Z.tools.length>0&&(tA+=20+Z.tools.length*36),z=Math.max(z,tA)}E=Math.max(220,80+z+40)}}r={x:h.x,y:h.y+E+60},s=null}else r={x:i.x+this.workflowGroupXOffset,y:i.y+this.workflowGroupYOffset}}else r={x:i.x+this.workflowGroupXOffset,y:i.y+this.workflowGroupYOffset};let l=this.generateNodeId(),g={id:l,point:bA(r),type:"template-group",data:bA(e),parentId:bA(s),width:bA(this.workflowGroupWidth),height:bA(this.workflowGroupHeight)},C=e.agent_class==="SequentialAgent"?{id:this.generateEdgeId(),source:A.id,sourceHandle:"source-bottom",target:l,targetHandle:"target-top"}:null;return{groupNode:g,edge:C}}calculateWorkflowChildPosition(e,A){let r=(A-20)/2;return{x:45+e*428,y:r}}createAgentNodeWithGroup(e,A,i,n,o){let a=this.createNode(e,A,i),r=null,s=null;if(this.isWorkflowAgent(e.agent_class)){let l=this.createWorkflowGroup(e,a,A,i,n,o);r=l.groupNode,s=l.edge}return{shellNode:a,groupNode:r,groupEdge:s}}createWorkflowChildEdge(e,A){return this.createWorkflowChildEdgeFromArrays(e,A,this.nodes(),this.groupNodes())}createWorkflowChildEdgeFromArrays(e,A,i,n){if(!A)return null;let o=n.find(r=>r.id===A);if(!o||!o.data)return null;let a=o.data().agent_class;if(a==="LoopAgent"||a==="ParallelAgent"){let r=i.find(s=>s.data&&s.data().name===o.data().name);if(r)return{id:this.generateEdgeId(),source:r.id,sourceHandle:"source-bottom",target:e.id,targetHandle:"target-top"}}if(a==="SequentialAgent"){let r=i.filter(g=>g.parentId&&g.parentId()===A);if(r.length===0)return null;r.sort((g,C)=>g.point().x-C.point().x);let s=r.findIndex(g=>g.id===e.id);if(s<=0)return null;let l=r[s-1];return{id:this.generateEdgeId(),source:l.id,sourceHandle:"source-right",target:e.id,targetHandle:"target-left"}}return null}isWorkflowAgent(e){return e?e==="SequentialAgent"||e==="ParallelAgent"||e==="LoopAgent":!1}addSubAgent(e,A="LlmAgent",i=!1){let n=this.nodes().find(C=>C.data&&C.data().name===e);if(!n||!n.data)return;let a={name:this.agentBuilderService.getNextSubAgentName(),agent_class:A,model:"gemini-2.5-flash",instruction:"You are a sub-agent that performs specialized tasks.",isRoot:!1,sub_agents:[],tools:[]},r=this.isWorkflowAgent(n.data().agent_class),s=n.parentId&&n.parentId()&&this.groupNodes().some(C=>C.id===n.parentId()),l,g=null;if(i&&r){let C=n.data();if(!C)return;let I=this.groupNodes().find(v=>v.data&&v.data()?.name===C.name);if(!I){console.error("Could not find group for workflow node");return}let d=this.agentBuilderService.getNode(n.data().name);if(!d){console.error("Could not find clicked agent data");return}let h=d.sub_agents.length,E=I.height?I.height():this.workflowGroupHeight,f=this.calculateWorkflowChildPosition(h,E),m=this.createAgentNodeWithGroup(a,f,I.id);l=m.shellNode,g=m.groupNode,d.sub_agents.push(a),g&&this.groupNodes.set([...this.groupNodes(),g]),m.groupEdge&&this.edges.set([...this.edges(),m.groupEdge])}else if(s){let C=n.parentId()??void 0,I=this.groupNodes().find(k=>k.id===C);if(!I||!I.data){console.error("Could not find parent group node");return}let d=I.data().name,h=this.agentBuilderService.getNode(d);if(!h){console.error("Could not find workflow parent agent");return}let E=h.sub_agents.length,f=I.height?I.height():this.workflowGroupHeight,m=this.calculateWorkflowChildPosition(E,f),v=this.createAgentNodeWithGroup(a,m,C);l=v.shellNode,g=v.groupNode,h.sub_agents.push(a),g&&this.groupNodes.set([...this.groupNodes(),g]),v.groupEdge&&this.edges.set([...this.edges(),v.groupEdge])}else{let C=n.data().sub_agents.length,I={x:n.point().x+C*400,y:n.point().y+300},d=this.createAgentNodeWithGroup(a,I);l=d.shellNode,g=d.groupNode;let h=this.agentBuilderService.getNode(n.data().name);h&&h.sub_agents.push(a),g&&this.groupNodes.set([...this.groupNodes(),g]),d.groupEdge&&this.edges.set([...this.edges(),d.groupEdge])}if(this.agentBuilderService.addNode(a),this.nodes.set([...this.nodes(),l]),this.selectedAgents=[l],(s||r)&&this.updateGroupDimensions(),r||s){let C=l.parentId?l.parentId()??void 0:void 0,I=this.createWorkflowChildEdge(l,C);I&&this.edges.set([...this.edges(),I])}else{let C={id:this.generateEdgeId(),source:n.id,sourceHandle:"source-bottom",target:l.id,targetHandle:"target-top"};this.edges.set([...this.edges(),C])}this.agentBuilderService.setSelectedNode(a),this.agentBuilderService.requestSideTabChange("config")}addTool(e){let A=this.nodes().find(o=>o.id===e);if(!A||!A.data)return;let i=A.data();if(!i)return;this.dialog.open(v2,{width:"500px"}).afterClosed().subscribe(o=>{if(o)if(o.toolType==="Agent Tool")this.createAgentTool(i.name);else{let a={toolType:o.toolType,name:o.name};this.agentBuilderService.addTool(i.name,a),this.agentBuilderService.setSelectedTool(a)}})}addCallback(e){let A=this.nodes().find(o=>o.id===e);if(!A||!A.data)return;let i={name:`callback_${this.callbackId}`,type:"before_agent",code:`def callback_function(callback_context): - # Add your callback logic here - return None`,description:"Auto-generated callback"};this.callbackId++;let n=this.agentBuilderService.addCallback(A.data().name,i);n.success||this._snackBar.open(n.error||"Failed to add callback","Close",{duration:3e3,panelClass:["error-snackbar"]})}createAgentTool(e){this.dialog.open(vc,{width:"750px",height:"310px",data:{title:"Create Agent Tool",message:"Please enter a name for the agent tool:",confirmButtonText:"Create",showInput:!0,inputLabel:"Agent Tool Name",inputPlaceholder:"Enter agent tool name"}}).afterClosed().subscribe(i=>{i&&typeof i=="string"&&this.agentBuilderService.requestNewTab(i,e)})}deleteTool(e,A){let i=A.toolType==="Agent Tool",n=i&&A.toolAgentName||A.name;this.dialog.open(vc,{data:{title:i?"Delete Agent Tool":"Delete Tool",message:i?`Are you sure you want to delete the agent tool "${n}"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(a=>{a==="confirm"&&this.deleteToolWithoutDialog(e,A)})}deleteToolWithoutDialog(e,A){if(A.toolType==="Agent Tool"){let i=A.toolAgentName||A.name;this.deleteAgentToolAndBoard(e,A,i)}else this.agentBuilderService.deleteTool(e,A)}deleteAgentToolAndBoard(e,A,i){this.agentBuilderService.deleteTool(e,A),this.agentBuilderService.requestTabDeletion(i)}deleteCallback(e,A){this.dialog.open(vc,{data:{title:"Delete Callback",message:`Are you sure you want to delete ${A.name}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(n=>{if(n==="confirm"){let o=this.agentBuilderService.deleteCallback(e,A);o.success||this._snackBar.open(o.error||"Failed to delete callback","Close",{duration:3e3,panelClass:["error-snackbar"]}),this.cdr.detectChanges()}})}openDeleteSubAgentDialog(e){this.dialog.open(vc,{data:{title:"Delete sub agent",message:`Are you sure you want to delete ${e}? This will also delete all the underlying sub agents and tools.`,confirmButtonText:"Delete"}}).afterClosed().subscribe(i=>{i==="confirm"&&this.deleteSubAgent(e)})}deleteSubAgent(e){let A=this.agentBuilderService.getNode(e);if(!A)return;let i=this.agentBuilderService.getParentNode(this.agentBuilderService.getRootNode(),A,void 0,this.agentToolBoards());i&&(this.deleteSubAgentHelper(A,i),this.agentBuilderService.getSelectedNode().pipe(uo(1),gt(n=>!!n)).subscribe(n=>{this.agentBuilderService.getNodes().includes(n)||this.agentBuilderService.setSelectedNode(i)}))}isNodeInSequentialWorkflow(e){if(!e.parentId||!e.parentId())return!1;let A=e.parentId(),i=this.groupNodes().find(n=>n.id===A);return!i||!i.data?!1:i.data().agent_class==="SequentialAgent"}getSequentialSiblings(e){if(!e.parentId||!e.parentId())return{previous:void 0,next:void 0};let A=e.parentId(),i=this.nodes().filter(o=>o.parentId&&o.parentId()===A);i.sort((o,a)=>o.point().x-a.point().x);let n=i.findIndex(o=>o.id===e.id);return n===-1?{previous:void 0,next:void 0}:{previous:n>0?i[n-1]:void 0,next:nn.data&&n.data().name===e.name);if(i){let n=this.isNodeInSequentialWorkflow(i),o,a;if(n){let s=this.getSequentialSiblings(i);o=s.previous,a=s.next}this.nodes.set(this.nodes().filter(s=>s.id!==i.id));let r=this.groupNodes().find(s=>s.data&&s.data().name===e.name);if(r){this.groupNodes.set(this.groupNodes().filter(l=>l.id!==r.id));let s=this.edges().filter(l=>l.target!==i.id&&l.source!==i.id&&l.target!==r.id&&l.source!==r.id);this.edges.set(s)}else{let s=this.edges().filter(l=>l.target!==i.id&&l.source!==i.id);this.edges.set(s)}if(n&&o&&a){let s={id:this.generateEdgeId(),source:o.id,sourceHandle:"source-right",target:a.id,targetHandle:"target-left"};this.edges.set([...this.edges(),s])}}this.nodePositions.delete(e.name),A.sub_agents=A.sub_agents.filter(n=>n.name!==e.name),this.agentBuilderService.deleteNode(e),i&&i.parentId&&i.parentId()&&this.updateGroupDimensions()}selectTool(e,A){if(e.toolType==="Agent Tool"){let i=e.name;this.switchToAgentToolBoard(i);return}if(e.toolType==="Function tool"||e.toolType==="Built-in tool"){if(A.data){let i=this.agentBuilderService.getNode(A.data().name);i&&this.editTool(e,i)}return}if(A.data){let i=this.agentBuilderService.getNode(A.data().name);i&&this.agentBuilderService.setSelectedNode(i)}this.agentBuilderService.setSelectedTool(e)}editTool(e,A){let i;e.toolType==="Built-in tool"?i=this.dialog.open(kd,{width:"700px",maxWidth:"90vw",data:{toolName:e.name,isEditMode:!0,toolArgs:e.args}}):i=this.dialog.open(v2,{width:"500px",data:{toolType:e.toolType,toolName:e.name,isEditMode:!0}}),i.afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=A.tools?.findIndex(a=>a.name===e.name);o!==void 0&&o!==-1&&A.tools&&(A.tools[o].name=n.name,n.args&&(A.tools[o].args=n.args),this.agentBuilderService.setAgentTools(A.name,A.tools))}})}selectCallback(e,A){if(A.data){let i=this.agentBuilderService.getNode(A.data().name);i&&this.agentBuilderService.setSelectedNode(i)}this.agentBuilderService.setSelectedCallback(e)}openToolsTab(e){if(e.data){let A=this.agentBuilderService.getNode(e.data().name);A&&this.agentBuilderService.setSelectedNode(A)}this.agentBuilderService.requestSideTabChange("tools")}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A){this._snackBar.open("Please create an agent first.","OK");return}let i=new FormData,n=this.agentToolBoards();s0.generateYamlFile(A,i,e,n),this.agentService.agentBuild(i).subscribe(o=>{o?this.router.navigate(["/"],{queryParams:{app:e}}).then(()=>{window.location.reload()}):this._snackBar.open("Something went wrong, please try again","OK")})}isRootAgent(e){let A=this.agentBuilderService.getRootNode();return A?A.name===e:!1}isRootAgentForCurrentTab(e){return this.isAgentToolMode&&this.currentAgentTool()?e===this.currentAgentTool():this.isRootAgent(e)}shouldShowHorizontalHandle(e,A){if(!e.parentId||!e.parentId())return!1;let i=e.parentId(),n=this.groupNodes().find(s=>s.id===i);if(!n||!n.data||n.data().agent_class!=="SequentialAgent")return!1;let a=this.nodes().filter(s=>s.parentId&&s.parentId()===i);if(a.length<=1)return!1;a.sort((s,l)=>s.point().x-l.point().x);let r=a.findIndex(s=>s.id===e.id);return A==="left"?r>0:r0):!1}shouldShowTopHandle(e){let A=e.data?e.data():void 0,i=A?.name,n=i?this.isRootAgent(i):!1;if(e.type==="template-group")return A?.agent_class==="SequentialAgent";if(n)return!1;if(e.parentId&&e.parentId()){let a=e.parentId(),r=this.groupNodes().find(s=>s.id===a);if(r&&r.data){let s=r.data().agent_class;if(s==="LoopAgent"||s==="ParallelAgent")return!0}return!1}return!0}getToolsForNode(e,A){return!e||!A?[]:A.get(e)??[]}loadFromYaml(e,A){try{let i=iE(e);this.agentBuilderService.clear(),this.nodePositions.clear(),this.agentToolBoards.set(new Map),this.agentBuilderService.setAgentToolBoards(new Map),this.currentAgentTool.set(null),this.isAgentToolMode=!1,this.navigationStack=[];let n=Ye(gA({name:i.name||"root_agent",agent_class:i.agent_class||"LlmAgent",model:i.model||"gemini-2.5-flash",instruction:i.instruction||"",description:i.description||""},i.max_iterations&&{max_iterations:i.max_iterations}),{isRoot:!0,sub_agents:i.sub_agents||[],tools:this.parseToolsFromYaml(i.tools||[]),callbacks:this.parseCallbacksFromYaml(i)});this.agentBuilderService.addNode(n),this.agentBuilderService.setSelectedNode(n),this.processAgentToolsFromYaml(n.tools||[],A),this.loadAgentBoard(n)}catch(i){console.error("Error parsing YAML:",i)}}parseToolsFromYaml(e){return e.map(A=>{let i={name:A.name,toolType:this.determineToolType(A),toolAgentName:A.name};if(A.name==="AgentTool"&&A.args&&A.args.agent&&A.args.agent.config_path){i.toolType="Agent Tool";let o=A.args.agent.config_path.replace("./","").replace(".yaml","");i.name=o,i.toolAgentName=o,i.args=A.args}else A.args&&(i.args=A.args);return i})}parseCallbacksFromYaml(e){let A=[];return Object.keys(e).forEach(i=>{if(i.endsWith("_callback")&&Array.isArray(e[i])){let n=i.replace("_callback","");e[i].forEach(o=>{o.name&&A.push({name:o.name,type:n})})}}),A}determineToolType(e){return e.name==="AgentTool"&&e.args&&e.args.agent?"Agent Tool":e.name&&e.name.includes(".")&&e.args?"Custom tool":e.name&&e.name.includes(".")&&!e.args?"Function tool":"Built-in tool"}processAgentToolsFromYaml(e,A){let i=e.filter(n=>n.toolType==="Agent Tool");for(let n of i)this.agentToolBoards().has(n.name)||this.loadAgentToolConfiguration(n,A)}loadAgentToolConfiguration(e,A){let i=e.name;this.agentService.getSubAgentBuilder(A,`${i}.yaml`).subscribe({next:n=>{if(n)try{let o=iE(n),a=Ye(gA({name:o.name||i,agent_class:o.agent_class||"LlmAgent",model:o.model||"gemini-2.5-flash",instruction:o.instruction||`You are the ${i} agent that can be used as a tool by other agents.`,description:o.description||""},o.max_iterations&&{max_iterations:o.max_iterations}),{isRoot:!1,sub_agents:o.sub_agents||[],tools:this.parseToolsFromYaml(o.tools||[]),callbacks:this.parseCallbacksFromYaml(o),isAgentTool:!0,skip_summarization:!!e.args?.skip_summarization}),r=this.agentToolBoards();if(r.set(i,a),this.agentToolBoards.set(r),this.agentBuilderService.setAgentToolBoards(r),this.agentBuilderService.addNode(a),this.processAgentToolsFromYaml(a.tools||[],A),a.sub_agents&&a.sub_agents.length>0)for(let s of a.sub_agents)s.config_path&&this.agentService.getSubAgentBuilder(A,s.config_path).subscribe(l=>{if(l){let g=iE(l);this.processAgentToolsFromYaml(this.parseToolsFromYaml(g.tools||[]),A)}})}catch(o){console.error(`Error parsing YAML for agent tool ${i}:`,o),this.createDefaultAgentToolConfiguration(e)}else this.createDefaultAgentToolConfiguration(e)},error:n=>{console.error(`Error loading agent tool configuration for ${i}:`,n),this.createDefaultAgentToolConfiguration(e)}})}createDefaultAgentToolConfiguration(e){let A=e.name,i={name:A,agent_class:"LlmAgent",model:"gemini-2.5-flash",instruction:`You are the ${A} agent that can be used as a tool by other agents.`,isRoot:!1,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!!e.args?.skip_summarization},n=this.agentToolBoards();n.set(A,i),this.agentToolBoards.set(n),this.agentBuilderService.setAgentToolBoards(n),this.agentBuilderService.addNode(i)}loadAgentTools(e){e.tools?(e.tools=e.tools.filter(A=>A.name&&A.name.trim()!==""),e.tools.forEach(A=>{A.toolType!=="Agent Tool"&&(A.name.includes(".")&&A.args?A.toolType="Custom tool":A.name.includes(".")&&!A.args?A.toolType="Function tool":A.toolType="Built-in tool")})):e.tools=[]}isNodeSelected(e){return this.selectedAgents.includes(e)}isGroupSelected(e){if(!e.data)return!1;let A=e.data().name,i=this.nodes().find(n=>n.data&&n.data().name===A);return i?this.isNodeSelected(i):!1}loadSubAgents(e,A){return lt(this,null,function*(){let i=[{node:A,depth:1,index:1,parentShellId:void 0,parentAgent:void 0,parentGroupId:void 0}],n=[],o=[],a=[];for(;i.length>0;){let{node:r,depth:s,index:l,parentShellId:g,parentAgent:C,parentGroupId:I}=i.shift(),d=r;if(r.config_path)try{let S=yield J3(this.agentService.getSubAgentBuilder(e,r.config_path));d=iE(S),d.tools&&(d.tools=this.parseToolsFromYaml(d.tools||[])),this.processAgentToolsFromYaml(d.tools||[],e)}catch(S){console.error(`Failed to load agent from ${r.config_path}`,S);continue}if(C&&C.sub_agents){let S=C.sub_agents.indexOf(r);S!==-1&&(C.sub_agents[S]=d,this.agentBuilderService.addNode(C))}this.agentBuilderService.addNode(d);let h=this.nodePositions.get(d.name),E=this.isWorkflowAgent(d.agent_class),f=C?this.isWorkflowAgent(C.agent_class):!1,m,v,k=null;if(f&&!d.isRoot){let S=C?.sub_agents.indexOf(d)??l,b=o.find(z=>z.id===I),x=b?.height?b.height():this.workflowGroupHeight;m=h??this.calculateWorkflowChildPosition(S,x);let F=this.createAgentNodeWithGroup(d,m,I??void 0,o,n);v=F.shellNode,k=F.groupNode,n.push(v),k&&o.push(k),F.groupEdge&&a.push(F.groupEdge)}else{if(h)m=h;else if(!g)m={x:100,y:150};else{let b=n.find(x=>x.id===g);b?m={x:b.point().x+(l-1)*400,y:b.point().y+300}:m={x:100,y:s*150+50}}let S=this.createAgentNodeWithGroup(d,m,void 0,o,n);v=S.shellNode,k=S.groupNode,n.push(v),E&&!d.isRoot&&(k&&o.push(k),S.groupEdge&&a.push(S.groupEdge))}if(g)if(I){let S=this.createWorkflowChildEdgeFromArrays(v,I,n,o);S&&a.push(S)}else{let S={id:this.generateEdgeId(),source:g,sourceHandle:"source-bottom",target:v.id,targetHandle:"target-top"};a.push(S)}if(d.sub_agents&&d.sub_agents.length>0){let S=1,b=E&&k?k.id:I;for(let x of d.sub_agents)i.push({node:x,parentShellId:v.id,depth:s+1,index:S,parentAgent:d,parentGroupId:b}),S++}}this.nodes.set(n),this.groupNodes.set(o),this.edges.set(a),this.updateGroupDimensions()})}switchToAgentToolBoard(e,A){let i=this.currentAgentTool()||"main";i!==e&&this.navigationStack.push(i);let n=this.agentToolBoards(),o=n.get(e);if(!o){o={isRoot:!1,name:e,agent_class:"LlmAgent",model:"gemini-2.5-flash",instruction:`You are the ${e} agent that can be used as a tool by other agents.`,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!1};let a=new Map(n);a.set(e,o),this.agentToolBoards.set(a),this.agentBuilderService.setAgentToolBoards(a),A?this.addAgentToolToAgent(e,A):this.addAgentToolToRoot(e)}this.currentAgentTool.set(e),this.isAgentToolMode=!0,this.loadAgentBoard(o),this.agentBuilderService.setSelectedNode(o),this.agentBuilderService.requestSideTabChange("config")}backToMainCanvas(){if(this.navigationStack.length>0){let e=this.navigationStack.pop();if(e==="main"){this.currentAgentTool.set(null),this.isAgentToolMode=!1;let A=this.agentBuilderService.getRootNode();A&&(this.loadAgentBoard(A),this.agentBuilderService.setSelectedNode(A),this.agentBuilderService.requestSideTabChange("config"))}else{let i=this.agentToolBoards().get(e);i&&(this.currentAgentTool.set(e),this.isAgentToolMode=!0,this.loadAgentBoard(i),this.agentBuilderService.setSelectedNode(i),this.agentBuilderService.requestSideTabChange("config"))}}else{this.currentAgentTool.set(null),this.isAgentToolMode=!1;let e=this.agentBuilderService.getRootNode();e&&(this.loadAgentBoard(e),this.agentBuilderService.setSelectedNode(e),this.agentBuilderService.requestSideTabChange("config"))}}loadAgentBoard(e){return lt(this,null,function*(){if(this.captureCurrentNodePositions(),this.nodes.set([]),this.groupNodes.set([]),this.edges.set([]),this.nodeId=0,this.edgeId=0,this.loadAgentTools(e),this.agentBuilderService.addNode(e),e.tools&&e.tools.length>0?this.agentBuilderService.setAgentTools(e.name,e.tools):this.agentBuilderService.setAgentTools(e.name,[]),e.sub_agents&&e.sub_agents.length>0)yield this.loadSubAgents(this.appName,e);else{let A=this.nodePositions.get(e.name)??{x:100,y:150},i=this.createNode(e,A);if(this.nodes.set([i]),this.isWorkflowAgent(e.agent_class)){let{groupNode:n,edge:o}=this.createWorkflowGroup(e,i,A);this.groupNodes.set([n]),o&&this.edges.set([o])}}this.agentBuilderService.setSelectedNode(e)})}addAgentToolToAgent(e,A){let i=this.agentBuilderService.getNode(A);if(i){if(i.tools&&i.tools.some(o=>o.name===e))return;let n={name:e,toolType:"Agent Tool",toolAgentName:e};i.tools||(i.tools=[]),i.tools.push(n),i.tools=i.tools.filter(o=>o.name&&o.name.trim()!==""),this.agentBuilderService.setAgentTools(A,i.tools)}}addAgentToolToRoot(e){let A=this.agentBuilderService.getRootNode();if(A){if(A.tools&&A.tools.some(n=>n.name===e))return;let i={name:e,toolType:"Agent Tool",toolAgentName:e};A.tools||(A.tools=[]),A.tools.push(i),this.agentBuilderService.setAgentTools("root_agent",A.tools)}}deleteAgentToolBoard(e){let A=this.agentToolBoards(),i=new Map(A);i.delete(e),this.agentToolBoards.set(i),this.agentBuilderService.setAgentToolBoards(i);let n=this.agentBuilderService.getNodes();for(let o of n)o.tools&&(o.tools=o.tools.filter(a=>!(a.toolType==="Agent Tool"&&(a.toolAgentName===e||a.name===e))),this.agentBuilderService.setAgentTools(o.name,o.tools));this.navigationStack=this.navigationStack.filter(o=>o!==e),this.currentAgentTool()===e&&this.backToMainCanvas()}getBackButtonTooltip(){if(this.navigationStack.length>0){let e=this.navigationStack[this.navigationStack.length-1];return e==="main"?"Back to Main Canvas":`Back to ${e}`}return"Back to Main Canvas"}onBuilderAssistantClose(){this.builderAssistantCloseRequest.emit()}reloadCanvasFromYaml(){this.appNameInput&&this.agentService.getAgentBuilderTmp(this.appNameInput).subscribe({next:e=>{e&&this.loadFromYaml(e,this.appNameInput)},error:e=>{console.error("Error reloading canvas:",e)}})}captureCurrentNodePositions(){for(let e of this.nodes()){if(!e?.data)continue;let A=e.data();A&&this.nodePositions.set(A.name,gA({},e.point()))}}updateGroupDimensions(){for(let s of this.groupNodes()){if(!s.data)continue;let l=s.data().name,g=this.nodes().filter(m=>m.parentId&&m.parentId()===s.id);if(g.length===0){s.width&&s.width.set(480),s.height&&s.height.set(220);continue}g.sort((m,v)=>m.point().x-v.point().x),g.forEach((m,v)=>{let F={x:45+v*428,y:80};if(m.point.set(F),m.data){let z=m.data();z&&this.nodePositions.set(z.name,F)}});let C=1/0,I=1/0,d=-1/0,h=-1/0;for(let m of g){let v=m.point(),k=m.data?m.data():void 0,S=120;k&&k.tools&&k.tools.length>0&&(S+=20+k.tools.length*36),C=Math.min(C,v.x),I=Math.min(I,v.y),d=Math.max(d,v.x+340+68),h=Math.max(h,v.y+S)}let E=d-C+80,f=h-I+80;s.width&&s.width.set(Math.max(480,E)),s.height&&s.height.set(Math.max(220,f))}}getToolIcon(e){return sE(e.name,e.toolType)}getAgentIcon(e){switch(e){case"SequentialAgent":return"more_horiz";case"LoopAgent":return"sync";case"ParallelAgent":return"density_medium";default:return"psychology"}}isGroupEmpty(e){return!this.nodes().some(i=>i.parentId&&i.parentId()===e)}shouldShowAddButton(e){let A=e.data?e.data():void 0;if(!A)return!1;let i=this.isWorkflowAgent(A.agent_class),n=e.parentId&&e.parentId();if(i&&!n||!this.isNodeSelected(e))return!1;if(n&&e.parentId){let o=e.parentId(),a=this.nodes().filter(s=>s.parentId&&s.parentId()===o);if(a.length===0)return!0;let r=a.reduce((s,l)=>l.point().x>s.point().x?l:s,a[0]);return e.id===r.id}return!0}static \u0275fac=function(A){return new(A||t)(ct(Or),ct(eQ),ct(ls))};static \u0275cmp=SA({type:t,selectors:[["app-canvas"]],viewQuery:function(A,i){if(A&1&&Jt(c9A,5)(C9A,5),A&2){let n;ae(n=re())&&(i.canvasRef=n.first),ae(n=re())&&(i.svgCanvasRef=n.first)}},inputs:{showSidePanel:"showSidePanel",showBuilderAssistant:"showBuilderAssistant",appNameInput:"appNameInput"},outputs:{toggleSidePanelRequest:"toggleSidePanelRequest",builderAssistantCloseRequest:"builderAssistantCloseRequest"},features:[Yt],decls:7,vars:8,consts:[["emptyGroupMenuTrigger","matMenuTrigger"],["emptyGroupMenu","matMenu"],["agentMenuTrigger","matMenuTrigger"],["agentMenu","matMenu"],[1,"canvas-container"],[1,"canvas-workspace",3,"click"],[1,"agent-tool-banner"],["matTooltip","Open panel",1,"material-symbols-outlined","open-panel-btn"],["view","auto",3,"nodes","edges","background","snapGrid"],[1,"canvas-instructions"],[3,"closePanel","reloadCanvas","isVisible","appName"],[1,"banner-content"],["mat-icon-button","",1,"back-to-main-btn",3,"click","matTooltip"],[1,"banner-info"],[1,"material-symbols-outlined","banner-icon"],[1,"banner-text"],[1,"agent-tool-name"],[1,"banner-subtitle"],["matTooltip","Open panel",1,"material-symbols-outlined","open-panel-btn",3,"click"],["groupNode",""],["nodeHtml",""],["selectable","","rx","12","ry","12",3,"click","pointerdown"],["x","12","y","12"],[1,"workflow-group-chip"],[1,"workflow-chip-icon"],[1,"workflow-chip-label"],["type","target","position","top","id","target-top"],[1,"empty-group-placeholder",3,"click"],["mat-icon-button","","matTooltip","Add sub-agent","aria-label","Add sub-agent",3,"click","matMenuTriggerFor"],[1,"empty-group-label"],["mat-menu-item","",3,"click"],["selectable","",1,"custom-node",3,"click","pointerdown"],[1,"node-title-wrapper"],[1,"node-title"],[2,"margin-right","5px"],[1,"node-badge"],[1,"action-button-bar"],["matIconButton","","matTooltip","Delete sub-agent","aria-label","Delete sub-agent",1,"action-btn","delete-subagent-btn"],[1,"tools-container"],[1,"add-subagent-container"],["type","target","position","left","id","target-left"],["type","source","position","right","id","source-right"],["type","source","position","bottom","id","source-bottom"],["matIconButton","","matTooltip","Delete sub-agent","aria-label","Delete sub-agent",1,"action-btn","delete-subagent-btn",3,"click"],[1,"tools-list"],[1,"tool-item"],[1,"tool-item",3,"click"],[1,"tool-item-icon"],[1,"tool-item-name"],["matIconButton","","matTooltip","Add sub-agent","aria-label","Add sub-agent",1,"add-subagent-btn",3,"click","matMenuTriggerFor"],[1,"add-subagent-symbol"],[1,"instruction-content"],[1,"instruction-icon"],[1,"instruction-tips"],[1,"tip"]],template:function(A,i){A&1&&(B(0,"div",4)(1,"div",5),U("click",function(o){return i.onCanvasClick(o)}),O(2,E9A,13,2,"div",6),O(3,h9A,2,0,"span",7),O(4,x9A,3,6,"vflow",8),O(5,_9A,19,0,"div",9),Q(),B(6,"app-builder-assistant",10),U("closePanel",function(){return i.onBuilderAssistantClose()})("reloadCanvas",function(){return i.reloadCanvasFromYaml()}),Q()()),A&2&&(u(),RA("has-banner",i.currentAgentTool()),u(),Y(i.currentAgentTool()?2:-1),u(),Y(i.showSidePanel?-1:3),u(),Y(i.vflowNodes().length>0?4:-1),u(),Y(i.vflowNodes().length===0?5:-1),u(),H("isVisible",i.showBuilderAssistant)("appName",i.appName))},dependencies:[xy,M3,_y,lQ,wy,Wt,dn,Zs,Ml,$c,OD,os],styles:['[_nghost-%COMP%]{width:100%;height:100%;display:flex;flex-direction:column;flex:1;min-height:0}.canvas-container[_ngcontent-%COMP%]{width:100%;height:100%;display:flex;flex-direction:column;border-radius:8px;overflow:hidden;box-shadow:var(--builder-canvas-shadow);flex:1;min-height:0;position:relative}.canvas-header[_ngcontent-%COMP%]{padding:16px 24px;border-bottom:2px solid var(--builder-border-color);display:flex;justify-content:space-between;align-items:center}.canvas-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--builder-text-primary-color);font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.canvas-controls[_ngcontent-%COMP%]{display:flex;gap:8px}.canvas-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid var(--builder-button-border-color);color:var(--builder-button-text-color);transition:all .3s ease}.canvas-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{border-color:var(--builder-button-hover-border-color);transform:translateY(-1px)}.canvas-workspace[_ngcontent-%COMP%]{flex:1;position:relative;overflow:hidden;min-height:0;width:100%;height:100%}.agent-tool-banner[_ngcontent-%COMP%]{position:absolute;top:0;left:0;right:0;border-bottom:2px solid rgba(59,130,246,.3);box-shadow:0 4px 16px #0000004d}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%]{padding:12px 20px;display:flex;align-items:center;gap:16px}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%]{color:#fff;border:1px solid rgba(255,255,255,.2);transition:all .2s ease}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05)}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;flex:1}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-icon[_ngcontent-%COMP%]{font-size:28px;width:28px;height:28px;color:#ffffffe6}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] .agent-tool-name[_ngcontent-%COMP%]{margin:0;color:#fff;font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;line-height:1.2}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] .banner-subtitle[_ngcontent-%COMP%]{margin:0;color:#fffc;font-size:12px;font-weight:400;line-height:1}.canvas-workspace[_ngcontent-%COMP%]:has(.agent-tool-banner) vflow[_ngcontent-%COMP%]{padding-top:68px}.canvas-workspace.has-banner[_ngcontent-%COMP%] vflow{padding-top:68px!important} vflow{width:100%!important;height:100%!important;display:block!important} vflow .root-svg{color:var(--builder-text-primary-color)!important;width:100%!important;height:100%!important;min-width:100%!important;min-height:100%!important}.diagram-canvas[_ngcontent-%COMP%]{display:block;width:100%;height:100%;cursor:crosshair;transition:cursor .2s ease;object-fit:contain;image-rendering:pixelated}.diagram-canvas[_ngcontent-%COMP%]:active{cursor:grabbing}.canvas-instructions[_ngcontent-%COMP%]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none}.instruction-content[_ngcontent-%COMP%]{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:2px solid var(--builder-canvas-instruction-border);border-radius:16px;padding:32px;box-shadow:var(--builder-canvas-shadow)}.instruction-content[_ngcontent-%COMP%] .instruction-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;color:var(--builder-button-text-color);margin-bottom:16px;animation:_ngcontent-%COMP%_pulse 2s infinite}.instruction-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:20px;font-weight:600;margin:0 0 12px;font-family:Google Sans,Helvetica Neue,sans-serif}.instruction-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;margin:0 0 24px;line-height:1.5}.instruction-tips[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;align-items:flex-start}.tip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;color:var(--builder-accent-color);font-size:13px}.tip[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.connection-mode-indicator[_ngcontent-%COMP%]{position:absolute;top:20px;left:50%;transform:translate(-50%);animation:_ngcontent-%COMP%_slideDown .3s ease-out}.connection-indicator-content[_ngcontent-%COMP%]{color:#fff;padding:12px 20px;border-radius:24px;display:flex;align-items:center;gap:12px;box-shadow:0 4px 16px #1b73e866;border:1px solid rgba(255,255,255,.2)}.connection-indicator-content[_ngcontent-%COMP%] .connection-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;animation:_ngcontent-%COMP%_pulse 1.5s infinite}.connection-indicator-content[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:14px;font-weight:500;white-space:nowrap}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:#fff;border:1px solid rgba(255,255,255,.3);width:32px;height:32px;min-width:32px}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{transform:scale(1.1)}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}@keyframes _ngcontent-%COMP%_slideDown{0%{opacity:0;transform:translate(-50%) translateY(-20px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.canvas-footer[_ngcontent-%COMP%]{padding:12px 24px;border-top:1px solid var(--builder-border-color);display:flex;justify-content:space-between;align-items:center}.node-count[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;color:var(--builder-text-secondary-color);font-size:13px;font-weight:500}.node-count[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:var(--builder-accent-color)}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}.canvas-workspace.drag-over[_ngcontent-%COMP%]:before{content:"";position:absolute;inset:0;border:2px dashed #00bbea;border-radius:8px;margin:16px;animation:_ngcontent-%COMP%_dashMove 1s linear infinite}@keyframes _ngcontent-%COMP%_dashMove{0%{border-color:#8ab4f84d}50%{border-color:#8ab4f8cc}to{border-color:#8ab4f84d}}@media(max-width:768px){.canvas-header[_ngcontent-%COMP%]{padding:12px 16px}.canvas-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:16px}.instruction-content[_ngcontent-%COMP%]{padding:24px;margin:16px}.instruction-content[_ngcontent-%COMP%] .instruction-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px}.instruction-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{font-size:18px}.canvas-footer[_ngcontent-%COMP%]{padding:8px 16px;flex-direction:column;gap:8px}}.custom-node[_ngcontent-%COMP%]{width:340px;border:1px solid var(--builder-canvas-node-border);border-radius:8px;align-items:center;position:relative;max-height:none;padding-bottom:0;overflow:visible}.custom-node[_ngcontent-%COMP%]:hover{border-color:var(--builder-canvas-node-hover-border)}.custom-node_selected[_ngcontent-%COMP%]{border:2px solid;border-color:var(--builder-accent-color)}.custom-node_selected[_ngcontent-%COMP%] mat-chip[_ngcontent-%COMP%]{--mdc-chip-outline-color: var(--builder-canvas-node-chip-outline)}.custom-node_selected[_ngcontent-%COMP%]:hover{border-color:var(--builder-accent-color)}[_nghost-%COMP%] .default-group-node{border:2px solid var(--builder-canvas-group-border)!important}.node-title-wrapper[_ngcontent-%COMP%]{padding-top:12px;padding-bottom:12px;border-radius:8px 8px 0 0;display:flex;justify-content:space-between;align-items:center}.node-title[_ngcontent-%COMP%]{padding-left:12px;padding-right:12px;display:flex;align-items:center;color:var(--builder-text-primary-color);font-weight:500}.node-badge[_ngcontent-%COMP%]{margin-left:8px;padding:2px 6px;border-radius:999px;color:var(--builder-accent-color);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.tools-container[_ngcontent-%COMP%]{padding:8px 12px;border-top:1px solid var(--builder-border-color)}.tools-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:4px;cursor:pointer;transition:background-color .2s ease;color:var(--builder-text-primary-color)}.tool-item[_ngcontent-%COMP%] .tool-item-icon[_ngcontent-%COMP%]{font-size:22px;width:22px;height:22px;color:var(--builder-text-primary-color);flex-shrink:0}.tool-item[_ngcontent-%COMP%] .tool-item-name[_ngcontent-%COMP%]{font-family:Google Sans,sans-serif;font-size:15px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-item.more-tools[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-style:italic}.tool-item.more-tools[_ngcontent-%COMP%] .tool-item-icon[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color)}.custom-node_selected[_ngcontent-%COMP%] .node-title-wrapper[_ngcontent-%COMP%]{border-bottom-color:var(--builder-canvas-node-chip-outline)}.custom-node_selected[_ngcontent-%COMP%] .node-title-wrapper[_ngcontent-%COMP%] .node-title[_ngcontent-%COMP%]{color:var(--builder-accent-color)}.tools-header[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callbacks-container[_ngcontent-%COMP%]{padding:12px 6px 12px 12px}.callbacks-header[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callback-type[_ngcontent-%COMP%]{font-size:11px;color:var(--builder-accent-color);padding:2px 6px;border-radius:4px;margin-left:4px;font-weight:500}.add-callback-btn[_ngcontent-%COMP%]{border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-callback-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-callback-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);transform:scale(1.1)}.instruction-title[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px}.instructions[_ngcontent-%COMP%]{font-family:Google Sans;margin-bottom:10px}.agent-resources[_ngcontent-%COMP%]{padding:8px 12px}.empty-resource[_ngcontent-%COMP%]{margin-top:8px;color:var(--builder-text-secondary-color);margin-bottom:8px;display:flex;font-size:13px}.empty-resource[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:none}.action-button-bar[_ngcontent-%COMP%]{display:flex;gap:8px;margin-right:4px}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);border:none;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;pointer-events:auto;border-radius:4px}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);transform:scale(1.1)}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.action-button-bar[_ngcontent-%COMP%] .delete-subagent-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color)}.add-tool-btn[_ngcontent-%COMP%]{border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-tool-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-tool-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);transform:scale(1.1)}.add-subagent-container[_ngcontent-%COMP%]{position:absolute;left:50%;bottom:-68px;transform:translate(-50%);display:flex;justify-content:center;pointer-events:none}.custom-node.in-group[_ngcontent-%COMP%] .add-subagent-container[_ngcontent-%COMP%]{left:auto;right:-68px;bottom:50%;transform:translateY(50%)}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]{width:48px;height:48px;border-radius:50%;border:2px solid var(--builder-accent-color);color:var(--builder-accent-color);display:flex;align-items:center;justify-content:center;padding:0;box-sizing:border-box;transition:transform .2s ease,box-shadow .2s ease,background .2s ease;pointer-events:auto}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%] .add-subagent-symbol[_ngcontent-%COMP%]{font-size:28px;line-height:1;font-weight:400}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05);box-shadow:var(--builder-canvas-add-btn-shadow)}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]:focus-visible{outline:none;box-shadow:var(--builder-canvas-add-btn-shadow)}.open-panel-btn[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;color:var(--builder-text-tertiary-color);cursor:pointer;margin-left:20px;margin-top:20px}.custom-node[_ngcontent-%COMP%]:hover .action-button-bar[_ngcontent-%COMP%], .custom-node.custom-node_selected[_ngcontent-%COMP%] .action-button-bar[_ngcontent-%COMP%]{opacity:1;pointer-events:auto}[_nghost-%COMP%] div[nodehandlescontroller][noderesizecontroller].wrapper{height:0px!important;overflow:visible!important}[_nghost-%COMP%] foreignObject.selectable, [_nghost-%COMP%] foreignObject.selectable>div{overflow:visible!important}[_nghost-%COMP%] .interactive-edge{stroke:var(--builder-accent-color)!important;stroke-width:2!important}[_nghost-%COMP%] .default-handle{stroke:var(--builder-accent-color)!important;stroke-width:1!important;fill:var(--builder-canvas-handle-fill)!important}[_nghost-%COMP%] .reconnect-handle{stroke:var(--builder-accent-color)!important;stroke-width:2!important;fill:var(--builder-canvas-reconnect-handle-fill)!important}[_nghost-%COMP%] .workflow-group-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--builder-canvas-workflow-chip-border);border-radius:16px;color:var(--builder-accent-color);font-family:Google Sans,sans-serif;font-size:12px;font-weight:500;height:32px;box-sizing:border-box;white-space:nowrap;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}[_nghost-%COMP%] .workflow-group-chip .workflow-chip-icon{font-size:16px;width:16px;height:16px;line-height:16px}[_nghost-%COMP%] .workflow-group-chip .workflow-chip-label{color:var(--builder-text-primary-color);font-weight:500;font-size:12px;line-height:1}[_nghost-%COMP%] .empty-group-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;border-radius:8px;text-align:center;border:2px dashed var(--builder-canvas-empty-group-border);transition:all .3s ease}[_nghost-%COMP%] .empty-group-placeholder:hover{border-color:var(--builder-canvas-empty-group-hover-border)}[_nghost-%COMP%] .empty-group-placeholder button{border:2px solid var(--builder-accent-color);color:var(--builder-accent-color);width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;transition:all .2s ease}[_nghost-%COMP%] .empty-group-placeholder button:hover{transform:scale(1.1);box-shadow:var(--builder-canvas-add-btn-shadow)}[_nghost-%COMP%] .empty-group-placeholder button mat-icon{font-size:24px;width:24px;height:24px}[_nghost-%COMP%] .empty-group-placeholder .empty-group-label{font-size:13px;font-weight:500;color:var(--builder-text-secondary-color);font-family:Google Sans,sans-serif}']})};function R9A(t,e){t&1&&Kn(0,"div",2)}var N9A=new kA("MAT_PROGRESS_BAR_DEFAULT_OPTIONS");var CQ=(()=>{class t{_elementRef=w(ce);_ngZone=w(qe);_changeDetectorRef=w(wt);_renderer=w(Pi);_cleanupTransitionEnd;constructor(){let A=XQ(),i=w(N9A,{optional:!0});this._isNoopAnimation=A==="di-disabled",A==="reduced-motion"&&this._elementRef.nativeElement.classList.add("mat-progress-bar-reduced-motion"),i&&(i.color&&(this.color=this._defaultColor=i.color),this.mode=i.mode||this.mode)}_isNoopAnimation;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor="primary";get value(){return this._value}set value(A){this._value=vtA(A||0),this._changeDetectorRef.markForCheck()}_value=0;get bufferValue(){return this._bufferValue||0}set bufferValue(A){this._bufferValue=vtA(A||0),this._changeDetectorRef.markForCheck()}_bufferValue=0;animationEnd=new LA;get mode(){return this._mode}set mode(A){this._mode=A,this._changeDetectorRef.markForCheck()}_mode="determinate";ngAfterViewInit(){this._ngZone.runOutsideAngular(()=>{this._cleanupTransitionEnd=this._renderer.listen(this._elementRef.nativeElement,"transitionend",this._transitionendHandler)})}ngOnDestroy(){this._cleanupTransitionEnd?.()}_getPrimaryBarTransform(){return`scaleX(${this._isIndeterminate()?1:this.value/100})`}_getBufferBarFlexBasis(){return`${this.mode==="buffer"?this.bufferValue:100}%`}_isIndeterminate(){return this.mode==="indeterminate"||this.mode==="query"}_transitionendHandler=A=>{this.animationEnd.observers.length===0||!A.target||!A.target.classList.contains("mdc-linear-progress__primary-bar")||(this.mode==="determinate"||this.mode==="buffer")&&this._ngZone.run(()=>this.animationEnd.next({value:this.value}))};static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-progress-bar"]],hostAttrs:["role","progressbar","aria-valuemin","0","aria-valuemax","100","tabindex","-1",1,"mat-mdc-progress-bar","mdc-linear-progress"],hostVars:10,hostBindings:function(i,n){i&2&&(te("aria-valuenow",n._isIndeterminate()?null:n.value)("mode",n.mode),ro("mat-"+n.color),RA("_mat-animation-noopable",n._isNoopAnimation)("mdc-linear-progress--animation-ready",!n._isNoopAnimation)("mdc-linear-progress--indeterminate",n._isIndeterminate()))},inputs:{color:"color",value:[2,"value","value",Cn],bufferValue:[2,"bufferValue","bufferValue",Cn],mode:"mode"},outputs:{animationEnd:"animationEnd"},exportAs:["matProgressBar"],decls:7,vars:5,consts:[["aria-hidden","true",1,"mdc-linear-progress__buffer"],[1,"mdc-linear-progress__buffer-bar"],[1,"mdc-linear-progress__buffer-dots"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__primary-bar"],[1,"mdc-linear-progress__bar-inner"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__secondary-bar"]],template:function(i,n){i&1&&(wn(0,"div",0),Kn(1,"div",1),O(2,R9A,1,0,"div",2),Gn(),wn(3,"div",3),Kn(4,"span",4),Gn(),wn(5,"div",5),Kn(6,"span",4),Gn()),i&2&&(u(),ut("flex-basis",n._getBufferBarFlexBasis()),u(),Y(n.mode==="buffer"?2:-1),u(),ut("transform",n._getPrimaryBarTransform()))},styles:[`.mat-mdc-progress-bar{--mat-progress-bar-animation-multiplier: 1;display:block;text-align:start}.mat-mdc-progress-bar[mode=query]{transform:scaleX(-1)}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-dots,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__secondary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__bar-inner.mdc-linear-progress__bar-inner{animation:none}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-bar{transition:transform 1ms}.mat-progress-bar-reduced-motion{--mat-progress-bar-animation-multiplier: 2}.mdc-linear-progress{position:relative;width:100%;transform:translateZ(0);outline:1px solid rgba(0,0,0,0);overflow-x:hidden;transition:opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:max(var(--mat-progress-bar-track-height, 4px),var(--mat-progress-bar-active-indicator-height, 4px))}@media(forced-colors: active){.mdc-linear-progress{outline-color:CanvasText}}.mdc-linear-progress__bar{position:absolute;top:0;bottom:0;margin:auto 0;width:100%;animation:none;transform-origin:top left;transition:transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:var(--mat-progress-bar-active-indicator-height, 4px)}.mdc-linear-progress--indeterminate .mdc-linear-progress__bar{transition:none}[dir=rtl] .mdc-linear-progress__bar{right:0;transform-origin:center right}.mdc-linear-progress__bar-inner{display:inline-block;position:absolute;width:100%;animation:none;border-top-style:solid;border-color:var(--mat-progress-bar-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-progress-bar-active-indicator-height, 4px)}.mdc-linear-progress__buffer{display:flex;position:absolute;top:0;bottom:0;margin:auto 0;width:100%;overflow:hidden;height:var(--mat-progress-bar-track-height, 4px);border-radius:var(--mat-progress-bar-track-shape, var(--mat-sys-corner-none))}.mdc-linear-progress__buffer-dots{background-image:radial-gradient(circle, var(--mat-progress-bar-track-color, var(--mat-sys-surface-variant)) calc(var(--mat-progress-bar-track-height, 4px) / 2), transparent 0);background-repeat:repeat-x;background-size:calc(calc(var(--mat-progress-bar-track-height, 4px) / 2)*5);background-position:left;flex:auto;transform:rotate(180deg);animation:mdc-linear-progress-buffering calc(250ms*var(--mat-progress-bar-animation-multiplier)) infinite linear}@media(forced-colors: active){.mdc-linear-progress__buffer-dots{background-color:ButtonBorder}}[dir=rtl] .mdc-linear-progress__buffer-dots{animation:mdc-linear-progress-buffering-reverse calc(250ms*var(--mat-progress-bar-animation-multiplier)) infinite linear;transform:rotate(0)}.mdc-linear-progress__buffer-bar{flex:0 1 100%;transition:flex-basis 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);background-color:var(--mat-progress-bar-track-color, var(--mat-sys-surface-variant))}.mdc-linear-progress__primary-bar{transform:scaleX(0)}.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{left:-145.166611%}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation:mdc-linear-progress-primary-indeterminate-translate calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-primary-indeterminate-scale calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation-name:mdc-linear-progress-primary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{right:-145.166611%;left:auto}.mdc-linear-progress__secondary-bar{display:none}.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{left:-54.888891%;display:block}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation:mdc-linear-progress-secondary-indeterminate-translate calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-secondary-indeterminate-scale calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation-name:mdc-linear-progress-secondary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{right:-54.888891%;left:auto}@keyframes mdc-linear-progress-buffering{from{transform:rotate(180deg) translateX(calc(var(--mat-progress-bar-track-height, 4px) * -2.5))}}@keyframes mdc-linear-progress-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(83.67142%)}100%{transform:translateX(200.611057%)}}@keyframes mdc-linear-progress-primary-indeterminate-scale{0%{transform:scaleX(0.08)}36.65%{animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);transform:scaleX(0.08)}69.15%{animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);transform:scaleX(0.661479)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(84.386165%)}100%{transform:translateX(160.277782%)}}@keyframes mdc-linear-progress-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);transform:scaleX(0.08)}19.15%{animation-timing-function:cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);transform:scaleX(0.457104)}44.15%{animation-timing-function:cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);transform:scaleX(0.72796)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-primary-indeterminate-translate-reverse{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(-83.67142%)}100%{transform:translateX(-200.611057%)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate-reverse{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(-37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(-84.386165%)}100%{transform:translateX(-160.277782%)}}@keyframes mdc-linear-progress-buffering-reverse{from{transform:translateX(-10px)}} -`],encapsulation:2,changeDetection:0})}return t})();function vtA(t,e=0,A=100){return Math.max(e,Math.min(A,t))}var IQ=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[fi]})}return t})();var F9A=["switch"],L9A=["*"];function G9A(t,e){t&1&&(B(0,"span",11),Ct(),B(1,"svg",13),hA(2,"path",14),Q(),B(3,"svg",15),hA(4,"path",16),Q()())}var K9A=new kA("mat-slide-toggle-default-options",{providedIn:"root",factory:()=>({disableToggleValue:!1,hideIcon:!1,disabledInteractive:!1})}),Ry=class{source;checked;constructor(e,A){this.source=e,this.checked=A}},U9A=(()=>{class t{_elementRef=w(ce);_focusMonitor=w($a);_changeDetectorRef=w(wt);defaults=w(K9A);_onChange=A=>{};_onTouched=()=>{};_validatorOnChange=()=>{};_uniqueId;_checked=!1;_createChangeEvent(A){return new Ry(this,A)}_labelId;get buttonId(){return`${this.id||this._uniqueId}-button`}_switchElement;focus(){this._switchElement.nativeElement.focus()}_noopAnimations=An();_focused=!1;name=null;id;labelPosition="after";ariaLabel=null;ariaLabelledby=null;ariaDescribedby;required=!1;color;disabled=!1;disableRipple=!1;tabIndex=0;get checked(){return this._checked}set checked(A){this._checked=A,this._changeDetectorRef.markForCheck()}hideIcon;disabledInteractive;change=new LA;toggleChange=new LA;get inputId(){return`${this.id||this._uniqueId}-input`}constructor(){w(eo).load(lr);let A=w(new Us("tabindex"),{optional:!0}),i=this.defaults;this.tabIndex=A==null?0:parseInt(A)||0,this.color=i.color||"accent",this.id=this._uniqueId=w(In).getId("mat-mdc-slide-toggle-"),this.hideIcon=i.hideIcon??!1,this.disabledInteractive=i.disabledInteractive??!1,this._labelId=this._uniqueId+"-label"}ngAfterContentInit(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{A==="keyboard"||A==="program"?(this._focused=!0,this._changeDetectorRef.markForCheck()):A||Promise.resolve().then(()=>{this._focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck()})})}ngOnChanges(A){A.required&&this._validatorOnChange()}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef)}writeValue(A){this.checked=!!A}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorOnChange=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck()}toggle(){this.checked=!this.checked,this._onChange(this.checked)}_emitChangeEvent(){this._onChange(this.checked),this.change.emit(this._createChangeEvent(this.checked))}_handleClick(){this.disabled||(this.toggleChange.emit(),this.defaults.disableToggleValue||(this.checked=!this.checked,this._onChange(this.checked),this.change.emit(new Ry(this,this.checked))))}_getAriaLabelledBy(){return this.ariaLabelledby?this.ariaLabelledby:this.ariaLabel?null:this._labelId}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-slide-toggle"]],viewQuery:function(i,n){if(i&1&&Jt(F9A,5),i&2){let o;ae(o=re())&&(n._switchElement=o.first)}},hostAttrs:[1,"mat-mdc-slide-toggle"],hostVars:13,hostBindings:function(i,n){i&2&&(ha("id",n.id),te("tabindex",null)("aria-label",null)("name",null)("aria-labelledby",null),ro(n.color?"mat-"+n.color:""),RA("mat-mdc-slide-toggle-focused",n._focused)("mat-mdc-slide-toggle-checked",n.checked)("_mat-animation-noopable",n._noopAnimations))},inputs:{name:"name",id:"id",labelPosition:"labelPosition",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],required:[2,"required","required",Be],color:"color",disabled:[2,"disabled","disabled",Be],disableRipple:[2,"disableRipple","disableRipple",Be],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:Cn(A)],checked:[2,"checked","checked",Be],hideIcon:[2,"hideIcon","hideIcon",Be],disabledInteractive:[2,"disabledInteractive","disabledInteractive",Be]},outputs:{change:"change",toggleChange:"toggleChange"},exportAs:["matSlideToggle"],features:[Bt([{provide:as,useExisting:Ja(()=>t),multi:!0},{provide:Oc,useExisting:t,multi:!0}]),Yt],ngContentSelectors:L9A,decls:14,vars:27,consts:[["switch",""],["mat-internal-form-field","",3,"labelPosition"],["role","switch","type","button",1,"mdc-switch",3,"click","tabIndex","disabled"],[1,"mat-mdc-slide-toggle-touch-target"],[1,"mdc-switch__track"],[1,"mdc-switch__handle-track"],[1,"mdc-switch__handle"],[1,"mdc-switch__shadow"],[1,"mdc-elevation-overlay"],[1,"mdc-switch__ripple"],["mat-ripple","",1,"mat-mdc-slide-toggle-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-switch__icons"],[1,"mdc-label",3,"click","for"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--on"],["d","M19.69,5.23L8.96,15.96l-4.23-4.23L2.96,13.5l6,6L21.46,7L19.69,5.23z"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--off"],["d","M20 13H4v-2h16v2z"]],template:function(i,n){if(i&1&&(Rt(),B(0,"div",1)(1,"button",2,0),U("click",function(){return n._handleClick()}),hA(3,"div",3)(4,"span",4),B(5,"span",5)(6,"span",6)(7,"span",7),hA(8,"span",8),Q(),B(9,"span",9),hA(10,"span",10),Q(),O(11,G9A,5,0,"span",11),Q()()(),B(12,"label",12),U("click",function(a){return a.stopPropagation()}),Ve(13),Q()()),i&2){let o=Qi(2);H("labelPosition",n.labelPosition),u(),RA("mdc-switch--selected",n.checked)("mdc-switch--unselected",!n.checked)("mdc-switch--checked",n.checked)("mdc-switch--disabled",n.disabled)("mat-mdc-slide-toggle-disabled-interactive",n.disabledInteractive),H("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("disabled",n.disabled&&!n.disabledInteractive),te("id",n.buttonId)("name",n.name)("aria-label",n.ariaLabel)("aria-labelledby",n._getAriaLabelledBy())("aria-describedby",n.ariaDescribedby)("aria-required",n.required||null)("aria-checked",n.checked)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),u(9),H("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),u(),Y(n.hideIcon?-1:11),u(),H("for",n.buttonId),te("id",n._labelId)}},dependencies:[rs,W6],styles:[`.mdc-switch{align-items:center;background:none;border:none;cursor:pointer;display:inline-flex;flex-shrink:0;margin:0;outline:none;overflow:visible;padding:0;position:relative;width:var(--mat-slide-toggle-track-width, 52px)}.mdc-switch.mdc-switch--disabled{cursor:default;pointer-events:none}.mdc-switch.mat-mdc-slide-toggle-disabled-interactive{pointer-events:auto}.mdc-switch__track{overflow:hidden;position:relative;width:100%;height:var(--mat-slide-toggle-track-height, 32px);border-radius:var(--mat-slide-toggle-track-shape, var(--mat-sys-corner-full))}.mdc-switch--disabled.mdc-switch .mdc-switch__track{opacity:var(--mat-slide-toggle-disabled-track-opacity, 0.12)}.mdc-switch__track::before,.mdc-switch__track::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";height:100%;left:0;position:absolute;width:100%;border-width:var(--mat-slide-toggle-track-outline-width, 2px);border-color:var(--mat-slide-toggle-track-outline-color, var(--mat-sys-outline))}.mdc-switch--selected .mdc-switch__track::before,.mdc-switch--selected .mdc-switch__track::after{border-width:var(--mat-slide-toggle-selected-track-outline-width, 2px);border-color:var(--mat-slide-toggle-selected-track-outline-color, transparent)}.mdc-switch--disabled .mdc-switch__track::before,.mdc-switch--disabled .mdc-switch__track::after{border-width:var(--mat-slide-toggle-disabled-unselected-track-outline-width, 2px);border-color:var(--mat-slide-toggle-disabled-unselected-track-outline-color, var(--mat-sys-on-surface))}@media(forced-colors: active){.mdc-switch__track{border-color:currentColor}}.mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0, 0, 0.2, 1);transform:translateX(0);background:var(--mat-slide-toggle-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch--selected .mdc-switch__track::before{transform:translateX(-100%)}.mdc-switch--selected .mdc-switch__track::before{opacity:var(--mat-slide-toggle-hidden-track-opacity, 0);transition:var(--mat-slide-toggle-hidden-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::before{opacity:var(--mat-slide-toggle-visible-track-opacity, 1);transition:var(--mat-slide-toggle-visible-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-hover-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-focus-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:active .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-pressed-track-color, var(--mat-sys-surface-variant))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::before,.mdc-switch.mdc-switch--disabled .mdc-switch__track::before{background:var(--mat-slide-toggle-disabled-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch__track::after{transform:translateX(-100%);background:var(--mat-slide-toggle-selected-track-color, var(--mat-sys-primary))}[dir=rtl] .mdc-switch__track::after{transform:translateX(100%)}.mdc-switch--selected .mdc-switch__track::after{transform:translateX(0)}.mdc-switch--selected .mdc-switch__track::after{opacity:var(--mat-slide-toggle-visible-track-opacity, 1);transition:var(--mat-slide-toggle-visible-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::after{opacity:var(--mat-slide-toggle-hidden-track-opacity, 0);transition:var(--mat-slide-toggle-hidden-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-hover-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-focus-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:active .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-pressed-track-color, var(--mat-sys-primary))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::after,.mdc-switch.mdc-switch--disabled .mdc-switch__track::after{background:var(--mat-slide-toggle-disabled-selected-track-color, var(--mat-sys-on-surface))}.mdc-switch__handle-track{height:100%;pointer-events:none;position:absolute;top:0;transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);left:0;right:auto;transform:translateX(0);width:calc(100% - var(--mat-slide-toggle-handle-width))}[dir=rtl] .mdc-switch__handle-track{left:auto;right:0}.mdc-switch--selected .mdc-switch__handle-track{transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch__handle-track{transform:translateX(-100%)}.mdc-switch__handle{display:flex;pointer-events:auto;position:absolute;top:50%;transform:translateY(-50%);left:0;right:auto;transition:width 75ms cubic-bezier(0.4, 0, 0.2, 1),height 75ms cubic-bezier(0.4, 0, 0.2, 1),margin 75ms cubic-bezier(0.4, 0, 0.2, 1);width:var(--mat-slide-toggle-handle-width);height:var(--mat-slide-toggle-handle-height);border-radius:var(--mat-slide-toggle-handle-shape, var(--mat-sys-corner-full))}[dir=rtl] .mdc-switch__handle{left:auto;right:0}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle{width:var(--mat-slide-toggle-unselected-handle-size, 16px);height:var(--mat-slide-toggle-unselected-handle-size, 16px);margin:var(--mat-slide-toggle-unselected-handle-horizontal-margin, 0 8px)}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-slide-toggle-unselected-with-icon-handle-horizontal-margin, 0 4px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle{width:var(--mat-slide-toggle-selected-handle-size, 24px);height:var(--mat-slide-toggle-selected-handle-size, 24px);margin:var(--mat-slide-toggle-selected-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-slide-toggle-selected-with-icon-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch__handle:has(.mdc-switch__icons){width:var(--mat-slide-toggle-with-icon-handle-size, 24px);height:var(--mat-slide-toggle-with-icon-handle-size, 24px)}.mat-mdc-slide-toggle .mdc-switch:active:not(.mdc-switch--disabled) .mdc-switch__handle{width:var(--mat-slide-toggle-pressed-handle-size, 28px);height:var(--mat-slide-toggle-pressed-handle-size, 28px)}.mat-mdc-slide-toggle .mdc-switch--selected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-slide-toggle-selected-pressed-handle-horizontal-margin, 0 22px)}.mat-mdc-slide-toggle .mdc-switch--unselected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-slide-toggle-unselected-pressed-handle-horizontal-margin, 0 2px)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__handle::after{opacity:var(--mat-slide-toggle-disabled-selected-handle-opacity, 1)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__handle::after{opacity:var(--mat-slide-toggle-disabled-unselected-handle-opacity, 0.38)}.mdc-switch__handle::before,.mdc-switch__handle::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";width:100%;height:100%;left:0;position:absolute;top:0;transition:background-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1),border-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);z-index:-1}@media(forced-colors: active){.mdc-switch__handle::before,.mdc-switch__handle::after{border-color:currentColor}}.mdc-switch--selected:enabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-handle-color, var(--mat-sys-on-primary))}.mdc-switch--selected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-hover-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-focus-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:active .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-pressed-handle-color, var(--mat-sys-primary-container))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:hover:not(:focus):not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:focus:not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:active .mdc-switch__handle::after,.mdc-switch--selected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-disabled-selected-handle-color, var(--mat-sys-surface))}.mdc-switch--unselected:enabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-handle-color, var(--mat-sys-outline))}.mdc-switch--unselected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-hover-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-focus-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:active .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-pressed-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-disabled-unselected-handle-color, var(--mat-sys-on-surface))}.mdc-switch__handle::before{background:var(--mat-slide-toggle-handle-surface-color)}.mdc-switch__shadow{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0}.mdc-switch:enabled .mdc-switch__shadow{box-shadow:var(--mat-slide-toggle-handle-elevation-shadow)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__shadow,.mdc-switch.mdc-switch--disabled .mdc-switch__shadow{box-shadow:var(--mat-slide-toggle-disabled-handle-elevation-shadow)}.mdc-switch__ripple{left:50%;position:absolute;top:50%;transform:translate(-50%, -50%);z-index:-1;width:var(--mat-slide-toggle-state-layer-size, 40px);height:var(--mat-slide-toggle-state-layer-size, 40px)}.mdc-switch__ripple::after{content:"";opacity:0}.mdc-switch--disabled .mdc-switch__ripple::after{display:none}.mat-mdc-slide-toggle-disabled-interactive .mdc-switch__ripple::after{display:block}.mdc-switch:hover .mdc-switch__ripple::after{transition:75ms opacity cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:focus .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:active .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:hover:not(:focus) .mdc-switch__ripple::after,.mdc-switch--unselected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-hover-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-switch--unselected:enabled:focus .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-focus-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-switch--unselected:enabled:active .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-pressed-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch--selected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-hover-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-switch--selected:enabled:focus .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-focus-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-switch--selected:enabled:active .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-pressed-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch__icons{position:relative;height:100%;width:100%;z-index:1;transform:translateZ(0)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__icons{opacity:var(--mat-slide-toggle-disabled-unselected-icon-opacity, 0.38)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__icons{opacity:var(--mat-slide-toggle-disabled-selected-icon-opacity, 0.38)}.mdc-switch__icon{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;opacity:0;transition:opacity 30ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-switch--unselected .mdc-switch__icon{width:var(--mat-slide-toggle-unselected-icon-size, 16px);height:var(--mat-slide-toggle-unselected-icon-size, 16px);fill:var(--mat-slide-toggle-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mat-slide-toggle-disabled-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__icon{width:var(--mat-slide-toggle-selected-icon-size, 16px);height:var(--mat-slide-toggle-selected-icon-size, 16px);fill:var(--mat-slide-toggle-selected-icon-color, var(--mat-sys-on-primary-container))}.mdc-switch--selected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mat-slide-toggle-disabled-selected-icon-color, var(--mat-sys-on-surface))}.mdc-switch--selected .mdc-switch__icon--on,.mdc-switch--unselected .mdc-switch__icon--off{opacity:1;transition:opacity 45ms 30ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle{-webkit-user-select:none;user-select:none;display:inline-block;-webkit-tap-highlight-color:rgba(0,0,0,0);outline:0}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple,.mat-mdc-slide-toggle .mdc-switch__ripple::after{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple:not(:empty),.mat-mdc-slide-toggle .mdc-switch__ripple::after:not(:empty){transform:translateZ(0)}.mat-mdc-slide-toggle.mat-mdc-slide-toggle-focused .mat-focus-indicator::before{content:""}.mat-mdc-slide-toggle .mat-internal-form-field{color:var(--mat-slide-toggle-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-slide-toggle-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-slide-toggle-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-slide-toggle-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-slide-toggle-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-slide-toggle-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-slide-toggle .mat-ripple-element{opacity:.12}.mat-mdc-slide-toggle .mat-focus-indicator::before{border-radius:50%}.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle-track,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__icon,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::after,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::after{transition:none}.mat-mdc-slide-toggle .mdc-switch:enabled+.mdc-label{cursor:pointer}.mat-mdc-slide-toggle .mdc-switch--disabled+label{color:var(--mat-slide-toggle-disabled-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-slide-toggle label:empty{display:none}.mat-mdc-slide-toggle-touch-target{position:absolute;top:50%;left:50%;height:var(--mat-slide-toggle-touch-target-size, 48px);width:100%;transform:translate(-50%, -50%);display:var(--mat-slide-toggle-touch-target-display, block)}[dir=rtl] .mat-mdc-slide-toggle-touch-target{left:auto;right:50%;transform:translate(50%, -50%)} -`],encapsulation:2,changeDetection:0})}return t})(),MtA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[U9A,fi]})}return t})();var T9A={cancelEditingTooltip:"Cancel editing",saveEvalMessageTooltip:"Save eval case message",thoughtChipLabel:"Thought",outcomeLabel:"Outcome",outputLabel:"Output",actualToolUsesLabel:"Actual tool uses:",expectedToolUsesLabel:"Expected tool uses:",actualResponseLabel:"Actual response:",expectedResponseLabel:"Expected response:",matchScoreLabel:"Match score",thresholdLabel:"Threshold",evalPassLabel:"PASS",evalFailLabel:"FAIL",editEvalMessageTooltip:"Edit eval case message",deleteEvalMessageTooltip:"Delete eval case message",editFunctionArgsTooltip:"Edit function arguments",typeMessagePlaceholder:"Type a message...",sendMessageTooltip:"Send message",uploadFileTooltip:"Upload local file",moreOptionsTooltip:"More options",updateStateMenuLabel:"Update state",updateStateMenuTooltip:"Update the session state",turnOffMicTooltip:"Hang up",useMicTooltip:"Call",turnOffCamTooltip:"Turn off camera",useCamTooltip:"Use camera",updatedSessionStateChipLabel:"Updated session state",proactiveAudioTooltip:"Enable the model to speak spontaneously without waiting for user input",affectiveDialogTooltip:"Enable the model to respond with emotional expression",sessionResumptionTooltip:"Allow the session to resume from a previous state",saveLiveBlobTooltip:"Save the recorded live stream data"},UI=new kA("Chat Panel Messages",{factory:()=>T9A});function J9A(t,e){if(t&1&&(B(0,"div",1),y(1),Q()),t&2){let A=p();u(),lA(A.title)}}var Ny=class t{title="";set json(e){if(typeof e=="string")try{this.parsedJson=JSON.parse(e)}catch(A){this.parsedJson=e}else this.parsedJson=e}parsedJson={};static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-json-tooltip"]],inputs:{title:"title",json:"json"},decls:4,vars:3,consts:[[1,"tooltip-shell"],[1,"tooltip-title"],[1,"tooltip-content"],[3,"json","expanded"]],template:function(A,i){A&1&&(B(0,"div",0),O(1,J9A,2,1,"div",1),B(2,"div",2),hA(3,"ngx-json-viewer",3),Q()()),A&2&&(u(),Y(i.title?1:-1),u(2),H("json",i.parsedJson)("expanded",!0))},dependencies:[cs,$l],styles:["[_nghost-%COMP%]{display:block;font-size:12px;line-height:1.4;word-break:break-word;overflow:hidden}.tooltip-shell[_ngcontent-%COMP%]{display:flex;flex-direction:column;max-width:800px;max-height:80vh;overflow:hidden}.tooltip-content[_ngcontent-%COMP%]{min-height:0;overflow:auto;overscroll-behavior:contain;scrollbar-gutter:stable}.tooltip-title[_ngcontent-%COMP%]{font-weight:600;font-size:9px;color:var(--mat-sys-primary);opacity:.5;margin-bottom:4px;text-transform:uppercase;letter-spacing:.5px;position:sticky;top:0;background:inherit;z-index:1}ngx-json-viewer[_ngcontent-%COMP%]{display:block;height:auto!important;min-width:0}"]})};var TI=class t{json="";title="";overlayRef=null;overlay=w(v1);elementRef=w(ce);show(){if(!this.json)return;let e=this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8},{originX:"center",originY:"bottom",overlayX:"center",overlayY:"top",offsetY:8},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",offsetY:-8},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",offsetY:-8}]).withViewportMargin(16).withPush(!1);this.overlayRef=this.overlay.create({positionStrategy:e,scrollStrategy:this.overlay.scrollStrategies.close(),panelClass:"json-tooltip-panel",maxWidth:"90vw"});let A=new Ss(Ny),i=this.overlayRef.attach(A);i.instance.json=this.json,i.instance.title=this.title,i.changeDetectorRef.detectChanges(),this.overlayRef.updatePosition()}hide(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}ngOnDestroy(){this.hide()}static \u0275fac=function(A){return new(A||t)};static \u0275dir=VA({type:t,selectors:[["","appJsonTooltip",""]],hostBindings:function(A,i){A&1&&U("mouseenter",function(){return i.show()})("mouseleave",function(){return i.hide()})},inputs:{json:[0,"appJsonTooltip","json"],title:[0,"appJsonTooltipTitle","title"]}})},Fy=class t{tooltipTemplate;context={};disabled=!1;overlayRef=null;overlay=w(v1);elementRef=w(ce);viewContainerRef=w(Mo);show(){if(this.disabled||!this.tooltipTemplate)return;let e=this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8},{originX:"center",originY:"bottom",overlayX:"center",overlayY:"top",offsetY:8},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",offsetY:-8},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",offsetY:-8}]).withViewportMargin(16).withPush(!1);this.overlayRef=this.overlay.create({positionStrategy:e,scrollStrategy:this.overlay.scrollStrategies.close(),panelClass:"html-tooltip-panel",maxWidth:"90vw"});let A=new Jr(this.tooltipTemplate,this.viewContainerRef,this.context);this.overlayRef.attach(A)}hide(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}ngOnDestroy(){this.hide()}static \u0275fac=function(A){return new(A||t)};static \u0275dir=VA({type:t,selectors:[["","appHtmlTooltip",""]],hostBindings:function(A,i){A&1&&U("mouseenter",function(){return i.show()})("mouseleave",function(){return i.hide()})},inputs:{tooltipTemplate:[0,"appHtmlTooltip","tooltipTemplate"],context:[0,"appHtmlTooltipContext","context"],disabled:[0,"appHtmlTooltipDisabled","disabled"]}})};function O9A(t,e){if(t&1&&(B(0,"div",3)(1,"mat-icon",4),y(2,"robot_2"),Q()()),t&2){let A=p();ut("background-color",A.color),RA("hidden",!A.author),H("appJsonTooltip",A.tooltip)}}function Y9A(t,e){if(t&1&&(B(0,"div",5),y(1),Q()),t&2){let A=p();ut("background-color",A.color),RA("hidden",!A.author),H("appJsonTooltip",A.tooltip),u(),ue(" ",A.initial," ")}}function H9A(t,e){t&1&&(B(0,"div",2)(1,"mat-icon"),y(2,"person"),Q()())}var Ly=class t{role="user";author="";nodePath="";themeService=w(eg);stringToColorService=w(Q2);get tooltip(){if(this.role==="user")return"";let e={author:this.author,nodePath:this.nodePath||""};return JSON.stringify(e,null,2)}get color(){let e=this.getNodeName(this.nodePath||""),A=this.themeService.currentTheme();return this.stringToColorService.stc(e,A)}get initial(){let A=this.getNodeName(this.nodePath||"").match(/[A-Za-z0-9]/);return A?A[0].toUpperCase():"N"}getNodeName(e){return e.split(/[/.>]/).filter(Boolean).pop()||e}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-chat-avatar"]],inputs:{role:"role",author:"author",nodePath:"nodePath"},decls:3,vars:1,consts:[[1,"bot-avatar",3,"appJsonTooltip","hidden","background-color"],[1,"node-circle-icon",3,"background-color","appJsonTooltip","hidden"],[1,"user-avatar"],[1,"bot-avatar",3,"appJsonTooltip"],["fontSet","material-symbols-outlined"],[1,"node-circle-icon",3,"appJsonTooltip"]],template:function(A,i){A&1&&O(0,O9A,3,5,"div",0)(1,Y9A,2,6,"div",1)(2,H9A,3,0,"div",2),A&2&&Y(i.role==="bot"?0:i.role==="node"?1:i.role==="user"?2:-1)},dependencies:[li,Tn,Wt,qi,TI],styles:["[_nghost-%COMP%]{display:contents}.node-circle-icon[_ngcontent-%COMP%]{width:32px;height:32px;border-radius:50%;margin-left:4px;margin-right:16px;margin-top:2px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;align-self:flex-start;color:#fff;font-size:14px;font-weight:600;line-height:1;text-transform:uppercase}.bot-avatar[_ngcontent-%COMP%], .user-avatar[_ngcontent-%COMP%]{width:40px;height:40px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.bot-avatar[_ngcontent-%COMP%]{margin-right:12px;color:#fff}.user-avatar[_ngcontent-%COMP%]{background-color:var(--mat-sys-primary);color:var(--mat-sys-on-primary)}.hidden[_ngcontent-%COMP%]{visibility:hidden}"]})};var Gy=new kA("FeedbackService");var z9A={goodResponseTooltip:"Good response",badResponseTooltip:"Bad response",feedbackAdditionalLabel:"Additional feedback (Optional)",feedbackCommentPlaceholderDown:"Share what could be improved in the response",feedbackCommentPlaceholderUp:"Share what you liked about the response",feedbackCancelButton:"Cancel",feedbackSubmitButton:"Submit",feedbackDialogTitle:"Reasons for feedback (Select all that apply)",feedbackReasonHallucination:"Hallucinated libraries / APIs etc",feedbackReasonIncomplete:"Incomplete answer",feedbackReasonFollowup:"Didn't understand followup",feedbackReasonFactual:"Factual errors",feedbackReasonLinks:"Broken/incorrect links",feedbackReasonIrrelevant:"Irrelevant information",feedbackReasonRepetitive:"Repetitive",feedbackReasonAccurate:"Accurate info",feedbackReasonHelpful:"Helpful",feedbackReasonConcise:"Concise",feedbackReasonUnderstanding:"Good understanding",feedbackReasonClear:"Clear and easy to follow"},StA=new kA("Message Feedback Messages",{factory:()=>z9A});function P9A(t,e){t&1&&(B(0,"mat-icon"),y(1,"thumb_up_filled"),Q())}function j9A(t,e){t&1&&(B(0,"mat-icon"),y(1,"thumb_up"),Q())}function q9A(t,e){t&1&&(B(0,"mat-icon"),y(1,"thumb_down_filled"),Q())}function V9A(t,e){t&1&&(B(0,"mat-icon"),y(1,"thumb_down"),Q())}function W9A(t,e){if(t&1&&(B(0,"mat-chip-option",7),y(1),Q()),t&2){let A=e.$implicit;H("value",A),u(),ue(" ",A," ")}}function Z9A(t,e){if(t&1){let A=QA();B(0,"div",4)(1,"div",5)(2,"h3"),y(3),Q(),B(4,"mat-chip-listbox",6),Ue(5,W9A,2,2,"mat-chip-option",7,ri),Q()(),B(7,"div",8)(8,"h3"),y(9),Q(),B(10,"mat-form-field",9)(11,"textarea",10),y(12," "),Q()()(),B(13,"div",11)(14,"button",12),U("click",function(){T(A);let n=p();return J(n.onDetailedFeedbackCancelled())}),y(15),Q(),B(16,"button",13),U("click",function(){T(A);let n=p();return J(n.onDetailedFeedbackSubmitted())}),y(17),Q()()()}if(t&2){let A=p();u(3),lA(A.i18n.feedbackDialogTitle),u(),H("formControl",A.selectedReasons),u(),Te(A.reasons()),u(4),lA(A.i18n.feedbackAdditionalLabel),u(2),H("formControl",A.comment)("placeholder",A.feedbackPlaceholder()),u(4),ue(" ",A.i18n.feedbackCancelButton," "),u(2),ue(" ",A.i18n.feedbackSubmitButton," ")}}var Ky=class t{sessionName=me.required();eventId=me.required();i18n=w(StA);feedbackService=w(Gy);existingFeedback=$p({params:()=>({sessionName:this.sessionName(),eventId:this.eventId()}),stream:({params:e})=>this.feedbackService.getFeedback(e.sessionName,e.eventId)});selectedFeedbackDirection=bA(void 0);feedbackDirection=pe(()=>this.selectedFeedbackDirection()??this.existingFeedback.value()?.direction);isDetailedFeedbackVisible=bA(!1);feedbackPlaceholder=pe(()=>this.feedbackDirection()==="up"?this.i18n.feedbackCommentPlaceholderUp:this.i18n.feedbackCommentPlaceholderDown);positiveReasonsResource=$p({stream:()=>this.feedbackService.getPositiveFeedbackReasons()});negativeReasonsResource=$p({stream:()=>this.feedbackService.getNegativeFeedbackReasons()});reasons=pe(()=>this.feedbackDirection()==="up"?this.positiveReasonsResource.value():this.negativeReasonsResource.value());selectedReasons=new Os([]);comment=new Os("");isLoading=bA(!1);sendFeedback(e){this.feedbackDirection()===e?(this.isLoading.set(!0),this.feedbackService.deleteFeedback(this.sessionName(),this.eventId()).subscribe(()=>{this.isLoading.set(!1),this.selectedFeedbackDirection.set(void 0),this.resetDetailedFeedback()})):(this.selectedReasons.reset(),this.isLoading.set(!0),this.feedbackService.sendFeedback(this.sessionName(),this.eventId(),{direction:e}).subscribe(()=>{this.isLoading.set(!1),this.isDetailedFeedbackVisible.set(!0),this.selectedFeedbackDirection.set(e)}))}onDetailedFeedbackSubmitted(){let e=this.feedbackDirection();e&&(this.isLoading.set(!0),this.feedbackService.sendFeedback(this.sessionName(),this.eventId(),{direction:e,reasons:this.selectedReasons.value??[],comment:this.comment.value??void 0}).subscribe(()=>{this.isLoading.set(!1),this.resetDetailedFeedback()}))}onDetailedFeedbackCancelled(){this.selectedFeedbackDirection.set(void 0),this.resetDetailedFeedback()}resetDetailedFeedback(){this.isDetailedFeedbackVisible.set(!1),this.comment.reset(),this.selectedReasons.reset([])}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-message-feedback"]],inputs:{sessionName:[1,"sessionName"],eventId:[1,"eventId"]},decls:9,vars:7,consts:[[1,"message-feedback-container"],[1,"feedback-buttons"],["mat-icon-button","",3,"click","matTooltip","disabled"],["class","feedback-details-container",4,"ngIf"],[1,"feedback-details-container"],[1,"reasons-chips"],["multiple","",3,"formControl"],[3,"value"],[1,"additional-feedback"],["appearance","outline"],["matInput","",3,"formControl","placeholder"],[1,"actions"],["mat-stroked-button","",3,"click"],["mat-flat-button","","color","primary",3,"click"]],template:function(A,i){A&1&&(B(0,"div",0)(1,"div",1)(2,"button",2),U("click",function(){return i.sendFeedback("up")}),O(3,P9A,2,0,"mat-icon")(4,j9A,2,0,"mat-icon"),Q(),B(5,"button",2),U("click",function(){return i.sendFeedback("down")}),O(6,q9A,2,0,"mat-icon")(7,V9A,2,0,"mat-icon"),Q()(),Et(8,Z9A,18,7,"div",3),Q()),A&2&&(u(2),H("matTooltip",i.i18n.goodResponseTooltip)("disabled",i.isLoading()),u(),Y(i.feedbackDirection()==="up"?3:4),u(2),H("matTooltip",i.i18n.badResponseTooltip)("disabled",i.isLoading()),u(),Y(i.feedbackDirection()==="down"?6:7),u(2),H("ngIf",i.isDetailedFeedbackVisible()))},dependencies:[li,Js,n2,Dn,yn,XI,qi,pi,ji,UD,aN,nN,Ya,Ko,Tn,Wt,Ps,ua,Fa,dn],styles:[".message-feedback-container[_ngcontent-%COMP%]{display:block}.feedback-buttons[_ngcontent-%COMP%]{--mat-icon-button-touch-target-size: 32px;--button-size: 32px;--icon-size: 12px;margin-left:96px;display:flex}.feedback-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:var(--button-size);height:var(--button-size);transition:all .2s ease}.feedback-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:var(--icon-size);height:var(--icon-size);width:var(--icon-size);transition:all .2s ease}.feedback-buttons[_ngcontent-%COMP%] button.selected[_ngcontent-%COMP%]{color:var(--side-panel-button-filled-label-text-color, white)}.feedback-buttons[_ngcontent-%COMP%] button.selected[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:inherit}.reasons-chips[_ngcontent-%COMP%]{margin-bottom:20px}.feedback-details-container[_ngcontent-%COMP%]{margin-left:54px;max-width:500px;padding:16px;border-radius:8px;margin-top:8px;border:1px solid var(--builder-border-color)}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-weight:500;margin-bottom:8px;margin-top:0;color:var(--builder-text-secondary-color)}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{min-height:60px;resize:vertical}.feedback-details-container[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}.feedback-details-container[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:18px;padding:0 16px;height:32px;line-height:32px;font-weight:500}"]})};function dQ(t){if(!t)return!1;if(t.name==="computer"){let i=t.args?.action,n=t.args?.coordinate;return["left_click","right_click","middle_click","double_click"].includes(i)&&Array.isArray(n)&&n.length===2}let e=["click_at","hover_at","type_text_at","scroll_at","drag_and_drop","mouse_move","scroll_document","wait_5_seconds","navigate","open_web_browser"].includes(t.name),A=t.args?.x!=null&&t.args?.y!=null||Array.isArray(t.args?.coordinate)&&t.args?.coordinate.length===2;return e}function F0(t){return t?!!t.response?.image?.data:!1}var YN=(a=>(a[a.INACTIVE=0]="INACTIVE",a[a.PENDING=1]="PENDING",a[a.RUNNING=2]="RUNNING",a[a.COMPLETED=3]="COMPLETED",a[a.INTERRUPTED=4]="INTERRUPTED",a[a.FAILED=5]="FAILED",a))(YN||{});var X9A=()=>({type:"dots",color:"#424242",size:1,gap:10});function $9A(t,e){t&1&&(B(0,"span",2),y(1,"(Pinned - Click X to close)"),Q())}function ASA(t,e){t&1&&(B(0,"span",2),y(1,"(Click to pin)"),Q())}function eSA(t,e){t&1&&(B(0,"mat-icon",10),y(1,"chevron_right"),Q())}function tSA(t,e){if(t&1){let A=QA();B(0,"span",9),U("click",function(){let n=T(A).$index,o=p(2);return J(o.navigateToLevel(n))}),y(1),Q(),O(2,eSA,2,0,"mat-icon",10)}if(t&2){let A=e.$implicit,i=e.$index,n=p(2);RA("active",i===n.breadcrumbs().length-1),u(),ue(" ",A," "),u(),Y(i0?17:-1)}}function rSA(t,e){if(t&1&&(Ct(),B(0,"g",24),hA(1,"path",25),Q()),t&2){let A=e.$implicit;u(),te("d",A.path())("stroke",A.edge.data!=null&&A.edge.data.isActive?"#42A5F5":"rgba(138, 180, 248, 0.8)")("stroke-width",A.edge.data!=null&&A.edge.data.isActive?"3":"2")("class",A.edge.data!=null&&A.edge.data.isActive?"active-edge":"")("marker-end",A.markerEnd())}}var Uy=class t{nodes=null;agentGraphData=null;nodePath=null;allNodes=null;isPinned=!1;onClose;graphNodes=bA([]);graphEdges=bA([]);NodeStatus=YN;connection={mode:"loose"};fullAgentData=null;navigationStack=[];breadcrumbs=bA([]);close(){this.onClose&&this.onClose()}ngOnInit(){this.buildGraph()}buildGraph(){if(this.agentGraphData?.root_agent){this.fullAgentData=this.agentGraphData.root_agent,this.navigationStack=[{name:this.agentGraphData.root_agent.name,data:this.agentGraphData.root_agent}],this.nodePath&&this.navigateToNodePath(this.nodePath),this.updateBreadcrumbs();let e=this.navigationStack[this.navigationStack.length-1].data;this.buildGraphFromStructure(e)}else this.buildGraphFromStateOnly()}buildGraphFromStructure(e){let A=[],i=[];if(e.nodes&&Array.isArray(e.nodes))this.buildMeshGraph(e.nodes,A,i);else if(e.graph&&e.graph.nodes){let n=VJ(e.graph.nodes,e.graph.edges||[],q6);e.graph.nodes.forEach((o,a)=>{let r=Ac(o,`node_${a}`),s=this.nodes?this.nodes[r]:null,l=o.type||"agent",g=n.positions.get(r)||{x:q6.startX,y:q6.startY},C=oC(o),I=this.getNodeStatusAtLevel(r,o);A.push({id:r,type:"html-template",point:bA({x:g.x,y:g.y}),width:bA(180),height:bA(80),data:bA({name:r,type:l,status:I,input:s?.input,triggeredBy:s?.triggered_by,retryCount:s?.retry_count,runId:s?.run_id,hasNestedStructure:C,nodeData:o})})}),e.graph.edges&&e.graph.edges.forEach((o,a)=>{let r=Ac(o.from_node),s=Ac(o.to_node);if(r&&s){let l=this.getNodeStatusAtLevel(r,o.from_node),g=this.getNodeStatusAtLevel(s,o.to_node),C=l===2||l===3&&(g===2||g===1);i.push({id:`${r}_to_${s}_${a}`,source:r,target:s,type:"template",floating:!0,data:{isActive:C},markers:{end:{type:"arrow-closed",width:15,height:15,color:C?"#42A5F5":"rgba(138, 180, 248, 0.8)"}}})}})}this.graphNodes.set(A),this.graphEdges.set(i)}buildMeshGraph(e,A,i){let n=e.findIndex(I=>I.name===e[0]?.name||I.type==="coordinator"),o=n>=0?e[n]:null,a=e.filter((I,d)=>d!==n),r=100,s=200,l=300,C=400-(a.length-1)*l/2;if(o){let I=oC(o),d=Ac(o),h=this.getNodeStatusAtLevel(d,o);A.push({id:d,type:"html-template",point:bA({x:400,y:r}),width:bA(180),height:bA(80),data:bA({name:d,type:"agent",status:h,hasNestedStructure:I,nodeData:o})})}a.forEach((I,d)=>{let h=C+d*l,E=r+s,f=oC(I),m=Ac(I),v=this.getNodeStatusAtLevel(m,I);if(A.push({id:m,type:"html-template",point:bA({x:h,y:E}),width:bA(180),height:bA(80),data:bA({name:m,type:"agent",status:v,hasNestedStructure:f,nodeData:I})}),o){let k=Ac(o),S=this.getNodeStatusAtLevel(k,o),b=S===2||S===3&&(v===2||v===1);i.push({id:`${k}_to_${m}`,source:k,target:m,type:"template",floating:!0,data:{isActive:b},markers:{end:{type:"arrow-closed",width:15,height:15,color:b?"#42A5F5":"rgba(138, 180, 248, 0.8)"}}})}})}buildGraphFromStateOnly(){let e=[],A=[];if(!this.nodes){this.graphNodes.set(e),this.graphEdges.set(A);return}let a=Object.keys(this.nodes);a.forEach((r,s)=>{let l=this.nodes[r];e.push({id:r,type:"html-template",point:bA({x:200,y:50+s*120}),width:bA(180),height:bA(80),data:bA({name:r,type:r==="__START__"?"start":"agent",status:l.status,input:l.input,triggeredBy:l.triggered_by,retryCount:l.retry_count,runId:l.run_id})})}),a.forEach(r=>{let s=this.nodes[r];if(s.triggered_by&&a.includes(s.triggered_by)){let g=this.nodes[s.triggered_by]?.status===2;A.push({id:`${s.triggered_by}_to_${r}`,source:s.triggered_by,target:r,type:"template",floating:!0,data:{isActive:g},markers:{end:{type:"arrow-closed",width:15,height:15,color:g?"#42A5F5":"rgba(138, 180, 248, 0.8)"}}})}}),this.graphNodes.set(e),this.graphEdges.set(A)}getStatusColor(e){switch(e){case 0:return"#757575";case 1:return"#FFA726";case 2:return"#42A5F5";case 3:return"#66BB6A";case 4:return"#FFCA28";case 5:return"#EF5350";default:return"#757575"}}getStatusLabel(e){switch(e){case 0:return"INACTIVE";case 1:return"PENDING";case 2:return"RUNNING";case 3:return"COMPLETED";case 4:return"INTERRUPTED";case 5:return"FAILED";default:return"UNKNOWN"}}getStatusIcon(e){switch(e){case 0:return"radio_button_unchecked";case 1:return"schedule";case 2:return"play_circle";case 3:return"check_circle";case 4:return"pause_circle";case 5:return"error";default:return"help"}}updateBreadcrumbs(){this.breadcrumbs.set(this.navigationStack.map(e=>e.name))}navigateIntoNode(e){let A=this.navigationStack[this.navigationStack.length-1].data,i=oE(A,e);i&&oC(i)&&(this.navigationStack.push({name:e,data:i}),this.updateBreadcrumbs(),this.buildGraphFromStructure(i))}navigateToLevel(e){if(e>=0&&e1?9:-1),u(2),H("nodes",i.graphNodes())("edges",i.graphEdges())("connection",i.connection)("background",Kc(8,X9A)))},dependencies:[li,Tn,Wt,qi,ji,xy,M3,_y,DtA,lQ,my],styles:[".workflow-graph-tooltip[_ngcontent-%COMP%]{width:500px;height:400px;border-radius:8px;padding:12px;display:flex;flex-direction:column;box-shadow:0 4px 16px #0006}.tooltip-header[_ngcontent-%COMP%]{font-size:14px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid rgba(255,255,255,.1);display:flex;align-items:center;gap:8px}.pinned-hint[_ngcontent-%COMP%]{font-size:12px;font-weight:400;opacity:.7;font-style:italic;flex:1}.close-button[_ngcontent-%COMP%]{width:24px;height:24px;line-height:24px;margin-left:auto}.close-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:18px}.breadcrumb-nav[_ngcontent-%COMP%]{display:flex;align-items:center;margin-bottom:8px;font-size:12px;color:var(--mdc-dialog-supporting-text-color)}.breadcrumb-item[_ngcontent-%COMP%]{cursor:pointer;padding:3px 6px;border-radius:3px;transition:background-color .2s}.breadcrumb-item.active[_ngcontent-%COMP%]{font-weight:500;cursor:default}.breadcrumb-separator[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;opacity:.5;margin:0 2px}.vflow-container[_ngcontent-%COMP%]{flex:1;min-height:0;border:1px solid rgba(255,255,255,.1);border-radius:4px;overflow:hidden;position:relative}.vflow-container[_ngcontent-%COMP%] vflow[_ngcontent-%COMP%]{width:100%;height:100%;display:block}.workflow-node[_ngcontent-%COMP%]{border:2px solid;border-radius:6px;padding:8px 12px;min-width:160px;box-shadow:0 2px 6px #0000004d;transition:all .2s}.workflow-node.expandable[_ngcontent-%COMP%]{cursor:pointer}.workflow-node.expandable[_ngcontent-%COMP%]:hover{box-shadow:0 4px 12px #8ab4f84d;transform:scale(1.02)}.node-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;margin-bottom:4px}.node-type-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:#8ab4f8e6}.status-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;margin-left:auto}.node-label[_ngcontent-%COMP%]{font-weight:500;font-size:13px;color:var(--mdc-dialog-supporting-text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}.node-type[_ngcontent-%COMP%]{font-size:10px;color:#8ab4f8cc;font-weight:500;text-transform:uppercase;letter-spacing:.5px;margin-top:2px}.node-status[_ngcontent-%COMP%]{font-size:11px;font-weight:600;margin-top:2px}.node-retry[_ngcontent-%COMP%]{font-size:10px;color:var(--mdc-dialog-supporting-text-color);opacity:.7;margin-top:2px}[_nghost-%COMP%] .active-edge{animation:_ngcontent-%COMP%_dash 1.5s linear infinite;stroke-dasharray:8 4}@keyframes _ngcontent-%COMP%_dash{to{stroke-dashoffset:-12}}"]})};var Ty=class t{appWorkflowGraphTooltip=null;agentGraphData=null;nodePath=null;allNodes=null;overlay=w(v1);overlayPositionBuilder=w(qm);viewContainerRef=w(Mo);overlayRef=null;isPinned=!1;onClick(e){e.stopPropagation(),!(!this.appWorkflowGraphTooltip||Object.keys(this.appWorkflowGraphTooltip).length===0)&&(this.isPinned?this.hide():this.showPinned())}show(){this.isPinned||!this.appWorkflowGraphTooltip||Object.keys(this.appWorkflowGraphTooltip).length===0||this.overlayRef||this.showTooltip(!1)}hide(){this.isPinned||this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}showPinned(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null),this.isPinned=!0,this.showTooltip(!0)}showTooltip(e){if(this.overlayRef)return;let A=this.overlayPositionBuilder.flexibleConnectedTo(this.viewContainerRef.element).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8},{originX:"center",originY:"bottom",overlayX:"center",overlayY:"top",offsetY:8}]);this.overlayRef=this.overlay.create({positionStrategy:A,scrollStrategy:this.overlay.scrollStrategies.close(),hasBackdrop:e,backdropClass:e?"cdk-overlay-transparent-backdrop":void 0}),e&&this.overlayRef&&this.overlayRef.backdropClick().subscribe(()=>{this.isPinned=!1,this.hide()});let i=new Ss(Uy),n=this.overlayRef.attach(i);n.instance.nodes=this.appWorkflowGraphTooltip,n.instance.agentGraphData=this.agentGraphData,n.instance.nodePath=this.nodePath,n.instance.allNodes=this.allNodes,n.instance.isPinned=e,n.instance.onClose=()=>{this.isPinned=!1,this.hide()}}ngOnDestroy(){this.isPinned=!1,this.hide()}static \u0275fac=function(A){return new(A||t)};static \u0275dir=VA({type:t,selectors:[["","appWorkflowGraphTooltip",""]],hostBindings:function(A,i){A&1&&U("click",function(o){return i.onClick(o)})("mouseenter",function(){return i.show()})("mouseleave",function(){return i.hide()})},inputs:{appWorkflowGraphTooltip:"appWorkflowGraphTooltip",agentGraphData:"agentGraphData",nodePath:"nodePath",allNodes:"allNodes"}})};function sSA(t,e){if(t&1){let A=QA();B(0,"div",5)(1,"img",10),U("load",function(n){T(A);let o=p(4);return J(o.onImageLoad(n))})("click",function(n){T(A),p(3);let o=zn(0);return p().openImageViewer(o),J(n.stopPropagation())}),Q(),hA(2,"div",11),Q()}if(t&2){p(3);let A=zn(0),i=p();u(),H("src",A,Go),u(),H("ngStyle",i.getClickBoxStyle())}}function lSA(t,e){t&1&&(B(0,"div",6)(1,"mat-icon",12),y(2,"image_not_supported"),Q(),B(3,"span",13),y(4,"No screenshot"),Q()())}function gSA(t,e){if(t&1){let A=QA();O(0,sSA,3,2,"div",5)(1,lSA,5,0,"div",6),B(2,"div",7)(3,"span",8),y(4),Q(),B(5,"mat-icon"),y(6,"arrow_forward"),Q()(),B(7,"div",5)(8,"img",9),U("click",function(n){T(A),p(2);let o=zn(1);return p().openImageViewer(o),J(n.stopPropagation())}),Q()()}if(t&2){p(2);let A=zn(0),i=zn(1),n=p();Y(A?0:1),u(4),lA(n.getActionName()),u(4),H("src",i,Go)}}function cSA(t,e){if(t&1){let A=QA();B(0,"div",5)(1,"img",10),U("load",function(n){T(A);let o=p(3);return J(o.onImageLoad(n))})("click",function(n){T(A),p(2);let o=zn(0);return p().openImageViewer(o),J(n.stopPropagation())}),Q(),hA(2,"div",11),Q()}if(t&2){p(2);let A=zn(0),i=p();u(),H("src",A,Go),u(),H("ngStyle",i.getClickBoxStyle())}}function CSA(t,e){if(t&1){let A=QA();B(0,"div",3),U("click",function(){T(A);let n=p(2);return J(n.clickEvent.emit(n.index))}),B(1,"div",4),O(2,gSA,9,3)(3,cSA,3,2,"div",5),Q()()}if(t&2){p();let A=zn(1);RA("dual-images",!!A),u(2),Y(A?2:3)}}function ISA(t,e){if(t&1){let A=QA();B(0,"div",14),U("click",function(){T(A);let n=p(2);return J(n.clickEvent.emit(n.index))}),B(1,"div",6)(2,"mat-icon",12),y(3,"image_not_supported"),Q(),B(4,"span",13),y(5,"No screenshot"),Q()()()}}function dSA(t,e){if(t&1&&(ta(0)(1),O(2,CSA,4,3,"div",1)(3,ISA,6,0,"div",2)),t&2){let A=p(),i=ga(A.getPreviousComputerUseScreenshot());u();let n=ga(A.getNextComputerUseScreenshot());u(),Y(i||n?2:3)}}function BSA(t,e){if(t&1){let A=QA();B(0,"div",15),U("click",function(){T(A);let n=p();return J(n.clickEvent.emit(n.index))}),B(1,"div",16)(2,"span",17),y(3),Q()(),hA(4,"img",18),B(5,"div",19)(6,"mat-icon",20),y(7,"computer"),Q(),B(8,"span",21),y(9),Q()()()}if(t&2){let A=p();u(3),lA(A.functionResponse.name),u(),H("src",A.getComputerUseScreenshot(),Go),u(5),lA(A.getComputerUseUrl())}}var Jy=class t{functionCall;functionResponse;allMessages=[];index=0;clickEvent=new LA;openImage=new LA;imageDimensions=new Map;VIRTUAL_WIDTH=1e3;VIRTUAL_HEIGHT=1e3;isComputerUseResponse(){return!!this.functionResponse&&F0(this.functionResponse)}isComputerUseClick(){return!!this.functionCall&&dQ(this.functionCall)}getComputerUseScreenshot(){return this.getScreenshotFromPayload(this.functionResponse?.response)}getComputerUseUrl(){return this.isComputerUseResponse()&&(this.functionResponse?.response).url||""}getPreviousComputerUseScreenshot(){for(let e=this.index-1;e>=0;e--){let A=this.allMessages[e];if(this.isMsgComputerUseResponse(A)&&A.functionResponses&&A.functionResponses.length>0)for(let i=A.functionResponses.length-1;i>=0;i--){let n=A.functionResponses[i];if(F0(n)){let a=n.response;return this.getScreenshotFromPayload(a)}let o=n.parts;if(Array.isArray(o))for(let a=o.length-1;a>=0;a--){let r=o[a];if(r.inlineData?.mimeType?.startsWith("image/")&&r.inlineData.data){let s=r.inlineData.mimeType,l=r.inlineData.data.replace(/-/g,"+").replace(/_/g,"/");return`data:${s};base64,${l}`}}}}return""}getNextComputerUseScreenshot(){for(let e=this.index+1;e0)for(let i=0;i0?e.functionResponses.some(A=>{if(F0(A))return!0;let i=A.parts;return Array.isArray(i)?i.some(n=>n.inlineData?.mimeType?.startsWith("image/")):!1}):!1}getScreenshotFromPayload(e){let A=e?.image;if(!A?.data)return"";let i=A.data;return i.startsWith("data:")?i:`data:${A.mimetype||"image/png"};base64,${i}`}getAllComputerUseScreenshots(){let e=[];for(let A of this.allMessages)if(this.isMsgComputerUseResponse(A)&&A.functionResponses)for(let i of A.functionResponses){if(F0(i)){let o=i.response;e.push(this.getScreenshotFromPayload(o))}let n=i.parts;if(Array.isArray(n)){for(let o of n)if(o.inlineData?.mimeType?.startsWith("image/")&&o.inlineData.data){let a=o.inlineData.mimeType,r=o.inlineData.data.replace(/-/g,"+").replace(/_/g,"/");e.push(`data:${a};base64,${r}`)}}}return e}getAllComputerUseUrls(){let e=[],A="";for(let i of this.allMessages)if(this.isMsgComputerUseResponse(i)&&i.functionResponses)for(let n of i.functionResponses){let o=n.response?.url;o&&(A=o),F0(n)&&e.push(A);let a=n.parts;if(Array.isArray(a))for(let r of a)r.inlineData?.mimeType?.startsWith("image/")&&r.inlineData.data&&e.push(A)}return e}getAllComputerUseCoordinates(){let e=[],A=null;for(let i of this.allMessages){let n=i.functionCalls;if(Array.isArray(n))for(let o of n)dQ(o)?A=o:o.name==="computer"&&(A=null);if(this.isMsgComputerUseResponse(i)&&i.functionResponses)for(let o of i.functionResponses){let a=!1;F0(o)&&(a=!0);let r=o.parts;if(Array.isArray(r))for(let s of r)s.inlineData?.mimeType?.startsWith("image/")&&s.inlineData.data&&(a=!0);a&&(A&&e.length>0&&(e[e.length-1]=this.getClickCoordinates(A)),e.push(null))}}return e}openImageViewer(e){let A=this.getAllComputerUseScreenshots(),i=this.getAllComputerUseUrls(),n=this.getAllComputerUseCoordinates(),o=A.indexOf(e);this.openImage.emit({images:A,currentIndex:o,urls:i,coordinates:n})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-computer-action"]],inputs:{functionCall:"functionCall",functionResponse:"functionResponse",allMessages:"allMessages",index:"index"},outputs:{clickEvent:"clickEvent",openImage:"openImage"},decls:2,vars:1,consts:[[1,"computer-use-container"],[1,"computer-use-container","click-visualization-container",3,"dual-images"],[1,"computer-use-container","click-visualization-container","fallback"],[1,"computer-use-container","click-visualization-container",3,"click"],[1,"images-wrapper-flex"],[1,"image-wrapper"],[1,"image-wrapper","fallback-image"],[1,"arrow-container"],[1,"action-name-above"],["alt","Next Screenshot",1,"computer-use-screenshot",3,"click","src"],["alt","Computer Use Screenshot",1,"computer-use-screenshot",3,"load","click","src"],[1,"click-overlay-box",3,"ngStyle"],[1,"missing-icon"],[1,"fallback-text"],[1,"computer-use-container","click-visualization-container","fallback",3,"click"],[1,"computer-use-container",3,"click"],[1,"computer-use-header"],[1,"computer-use-tool-name"],["alt","Computer Use Screenshot",1,"computer-use-screenshot",3,"src"],[1,"computer-use-footprint"],[1,"computer-icon"],[1,"url-text"]],template:function(A,i){A&1&&O(0,dSA,4,3)(1,BSA,10,3,"div",0),A&2&&Y(i.isComputerUseClick()?0:i.isComputerUseResponse()?1:-1)},dependencies:[li,Vd,Tn,Wt,Fa],styles:['[_nghost-%COMP%]{display:block}.computer-use-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;border-radius:12px;border:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color);overflow:hidden;cursor:pointer;margin:5px 5px 10px;transition:opacity .2s}.computer-use-container[_ngcontent-%COMP%]:hover{opacity:.9}.computer-use-tool-name[_ngcontent-%COMP%]{font-size:12px;font-family:monospace;font-weight:600;color:var(--chat-panel-input-field-textarea-color);opacity:.9;padding:12px}.computer-use-tool-name[_ngcontent-%COMP%] .actual-pixels[_ngcontent-%COMP%]{opacity:.6;margin-left:8px;font-weight:400}.computer-use-screenshot[_ngcontent-%COMP%]{width:100%;height:auto;display:block;border-bottom:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color)}.computer-use-footprint[_ngcontent-%COMP%]{display:flex;align-items:center;padding:8px 12px;gap:8px}.computer-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0}.url-text[_ngcontent-%COMP%]{font-size:11px;font-family:monospace;white-space:normal;word-break:break-all;color:var(--chat-panel-input-field-textarea-color);opacity:.8;min-width:0}.image-wrapper[_ngcontent-%COMP%]{position:relative;width:100%}.images-wrapper-flex[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:580px;gap:12px}.images-wrapper-flex[_ngcontent-%COMP%] .image-wrapper[_ngcontent-%COMP%]{flex:1;min-width:0}.images-wrapper-flex[_ngcontent-%COMP%] .image-wrapper[_ngcontent-%COMP%] .computer-use-screenshot[_ngcontent-%COMP%]{box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;border-radius:8px}.arrow-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--chat-panel-input-field-textarea-color);opacity:.8;gap:4px}.arrow-container[_ngcontent-%COMP%] .action-name-above[_ngcontent-%COMP%]{font-size:11px;font-family:monospace;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:80px}.arrow-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:32px;width:32px;height:32px}.fallback-image[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high, #e0e0e0);width:240px;height:120px;margin:0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--chat-panel-input-field-textarea-color);opacity:.7}.fallback-image[_ngcontent-%COMP%] .missing-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px}.fallback-image[_ngcontent-%COMP%] .fallback-text[_ngcontent-%COMP%]{font-size:14px;font-weight:500}.click-overlay-box[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;border:1px solid rgba(255,255,255,.8);border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 4px #00000080;pointer-events:none;display:flex;align-items:center;justify-content:center}.click-overlay-box[_ngcontent-%COMP%]:before{content:"";width:2px;height:2px;border-radius:50%;box-shadow:0 0 2px #fff}.click-overlay-box[_ngcontent-%COMP%]:after{content:"";position:absolute;width:100%;height:100%;border-radius:50%}']})};function ESA(t,e){if(t&1&&(B(0,"mat-icon"),y(1),Q()),t&2){let A=p();u(),lA(A.icon)}}var Oy=class t{icon="";text="";tooltipContent=null;tooltipTitle="";disabled=!1;buttonClick=new LA;handleClick(e){this.buttonClick.emit(e)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-hover-info-button"]],inputs:{icon:"icon",text:"text",tooltipContent:"tooltipContent",tooltipTitle:"tooltipTitle",disabled:"disabled"},outputs:{buttonClick:"buttonClick"},decls:3,vars:7,consts:[["mat-stroked-button","",1,"hover-info-button",3,"click","appJsonTooltip","appJsonTooltipTitle","disabled"]],template:function(A,i){A&1&&(B(0,"button",0),U("click",function(o){return i.handleClick(o)}),O(1,ESA,2,1,"mat-icon"),y(2),Q()),A&2&&(RA("icon-only",!i.text),H("appJsonTooltip",i.tooltipContent)("appJsonTooltipTitle",i.tooltipTitle)("disabled",i.disabled),u(),Y(i.icon?1:-1),u(),ue(" ",i.text,` -`))},dependencies:[li,qi,pi,Tn,Wt,TI],styles:[`.hover-info-button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)!important;background-color:var(--mat-sys-surface-container-high)!important;border-color:transparent!important;margin:5px 5px 5px 0;font-size:11px!important;padding:6px 12px!important;min-height:24px!important;height:24px!important;border-radius:8px!important;font-family:Roboto Mono,monospace!important;max-width:300px;text-align:left;display:inline-flex;align-items:center}.hover-info-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px!important;width:18px!important;height:18px!important;margin-right:6px!important;color:var(--mat-sys-on-surface)!important}.hover-info-button.icon-only[_ngcontent-%COMP%]{padding:0!important;min-width:24px!important;width:24px!important;justify-content:center}.hover-info-button.icon-only[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:-8px!important}.hover-info-button.icon-only[_ngcontent-%COMP%] .mdc-button__label[_ngcontent-%COMP%]{display:none!important}[_nghost-%COMP%] .hover-info-button{background-color:var(--mat-sys-surface-container-high)!important;color:var(--mat-sys-on-surface)!important}[_nghost-%COMP%] .hover-info-button .mdc-button__label{overflow:hidden!important;text-overflow:ellipsis!important;white-space:nowrap!important} - - - - - - - - - - - - - - - - -`]})};var n5e=K3(ktA());Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));Prism.languages.js=Prism.languages.javascript;(function(t){t.languages.typescript=t.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),t.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete t.languages.typescript.parameter,delete t.languages.typescript["literal-property"];var e=t.languages.extend("typescript",{});delete e["class-name"],t.languages.typescript["class-name"].inside=e,t.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e}}}}),t.languages.ts=t.languages.typescript})(Prism);(function(t){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;t.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+e.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},t.languages.css.atrule.inside.rest=t.languages.css;var A=t.languages.markup;A&&(A.tag.addInlined("style","css"),A.tag.addAttribute("style","css"))})(Prism);Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}};Prism.languages.webmanifest=Prism.languages.json;(function(t){var e="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",A={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},i={bash:A,environment:{pattern:RegExp("\\$"+e),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+e),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};t.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+e),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:i},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:A}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:i},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:i.entity}}],environment:{pattern:RegExp("\\$?"+e),alias:"constant"},variable:i.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},A.inside=t.languages.bash;for(var n=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=i.variable[1].inside,a=0;a]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/};Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python;Prism.languages.py=Prism.languages.python;(function(t){var e=/[*&][^\s[\]{},]+/,A=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,i="(?:"+A.source+"(?:[ ]+"+e.source+")?|"+e.source+"(?:[ ]+"+A.source+")?)",n=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function a(r,s){s=(s||"").replace(/m/g,"")+"m";var l=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,function(){return i}).replace(/<>/g,function(){return r});return RegExp(l,s)}t.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,function(){return i})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,function(){return i}).replace(/<>/g,function(){return"(?:"+n+"|"+o+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:a(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:a(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:a(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:a(o),lookbehind:!0,greedy:!0},number:{pattern:a(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:A,important:e,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},t.languages.yml=t.languages.yaml})(Prism);var QSA=t=>({color:t}),BQ=class t{text=me("");thought=me(!1);static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-markdown"]],inputs:{text:[1,"text"],thought:[1,"thought"]},features:[Bt([Bu()])],decls:1,vars:4,consts:[[3,"data","ngStyle"]],template:function(A,i){A&1&&hA(0,"markdown",0),A&2&&H("data",i.text())("ngStyle",Ks(2,QSA,i.thought()?"#9aa0a6":"inherit"))},dependencies:[li,Vd,sU,rU],encapsulation:2})};var xtA=(t,e)=>e.key;function uSA(t,e){if(t&1){let A=QA();B(0,"div",7)(1,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("form"))}),y(2,"Form"),Q(),B(3,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("json"))}),y(4,"JSON"),Q(),B(5,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("payload"))}),y(6,"Payload"),Q(),B(7,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("response schema"))}),y(8,"Schema"),Q()()}if(t&2){let A=p(3);u(),RA("active",A.activeTab==="form"),u(2),RA("active",A.activeTab==="json"),u(2),RA("active",A.activeTab==="payload"),u(2),RA("active",A.activeTab==="response schema")}}function fSA(t,e){if(t&1){let A=QA();B(0,"div",9)(1,"div",12),y(2),Q(),B(3,"div",13)(4,"div",14),y(5,"Payload"),Q(),hA(6,"ngx-json-viewer",15),Q(),B(7,"div",16)(8,"div",17)(9,"label",18)(10,"input",19),Di("ngModelChange",function(n){T(A);let o=p(3);return Bi(o.confirmationModel.confirmed,n)||(o.confirmationModel.confirmed=n),J(n)}),Q(),B(11,"span"),y(12,"Confirmed"),Q()()(),B(13,"button",20),U("click",function(){T(A);let n=p(3);return J(n.onSend())}),y(14," Submit "),Q()()()}if(t&2){let A=p(3);u(2),ue(" ",A.functionCall.args==null||A.functionCall.args.toolConfirmation==null?null:A.functionCall.args.toolConfirmation.hint," "),u(4),H("json",A.functionCall.args==null||A.functionCall.args.originalFunctionCall==null?null:A.functionCall.args.originalFunctionCall.args),u(4),H("id",NQ("confirmed-checkbox-",A.functionCall.id)),wi("ngModel",A.confirmationModel.confirmed)}}function pSA(t,e){t&1&&y(0," *")}function mSA(t,e){if(t&1&&(B(0,"div",28),y(1),Q()),t&2){let A=p(2).$implicit;u(),lA(A.description)}}function wSA(t,e){if(t&1){let A=QA();B(0,"input",27),Di("ngModelChange",function(n){T(A);let o=p().$implicit,a=p(5);return Bi(a.formModel[o.key],n)||(a.formModel[o.key]=n),J(n)}),Q(),O(1,mSA,2,1,"div",28)}if(t&2){let A=p().$implicit,i=p(5);H("id",A.key),wi("ngModel",i.formModel[A.key]),u(),Y(A.description?1:-1)}}function DSA(t,e){if(t&1){let A=QA();B(0,"input",31),Di("ngModelChange",function(n){T(A);let o=p(2).$implicit,a=p(5);return Bi(a.formModel[o.key],n)||(a.formModel[o.key]=n),J(n)}),Q()}if(t&2){let A=p(2).$implicit,i=p(5);H("id",A.key),wi("ngModel",i.formModel[A.key])}}function ySA(t,e){if(t&1){let A=QA();B(0,"input",32),Di("ngModelChange",function(n){T(A);let o=p(2).$implicit,a=p(5);return Bi(a.formModel[o.key],n)||(a.formModel[o.key]=n),J(n)}),Q()}if(t&2){let A=p(2).$implicit,i=p(5);H("id",A.key),wi("ngModel",i.formModel[A.key])}}function vSA(t,e){if(t&1&&(B(0,"div",28),y(1),Q()),t&2){let A=p(2).$implicit;u(),lA(A.description)}}function bSA(t,e){if(t&1&&(O(0,DSA,1,2,"input",29)(1,ySA,1,2,"input",30),O(2,vSA,2,1,"div",28)),t&2){let A=p().$implicit;Y(A.type==="number"||A.type==="integer"?0:1),u(2),Y(A.description?2:-1)}}function MSA(t,e){if(t&1&&(B(0,"div",25),y(1),O(2,pSA,1,0),Q(),B(3,"div",26),O(4,wSA,2,3)(5,bSA,3,2),Q()),t&2){let A=e.$implicit;u(),ue(" ",A.title),u(),Y(A.required?2:-1),u(2),Y(A.type==="boolean"?4:5)}}function SSA(t,e){if(t&1){let A=QA();B(0,"div",21),Ue(1,MSA,6,3,null,null,xtA),B(3,"div",23)(4,"button",24),U("click",function(){T(A);let n=p(4);return J(n.onSend())}),y(5," Submit "),Q()()()}if(t&2){let A=p(4);u(),Te(A.formFields)}}function kSA(t,e){if(t&1){let A=QA();B(0,"div",22)(1,"textarea",33),Di("ngModelChange",function(n){T(A);let o=p(4);return Bi(o.formModelJson,n)||(o.formModelJson=n),J(n)}),U("ngModelChange",function(n){T(A);let o=p(4);return J(o.onJsonInputChange(n))}),Q()(),B(2,"div",23)(3,"button",24),U("click",function(){T(A);let n=p(4);return J(n.onSend())}),y(4," Submit "),Q()()}if(t&2){let A=p(4);u(),wi("ngModel",A.formModelJson)}}function xSA(t,e){if(t&1&&(B(0,"div",22)(1,"pre"),y(2),Q()()),t&2){let A=p(4);u(2),lA(A.getPayloadJson())}}function _SA(t,e){if(t&1&&(B(0,"div",22)(1,"pre"),y(2),Q()()),t&2){let A=p(4);u(2),lA(A.getResponseSchemaJson())}}function RSA(t,e){if(t&1&&(B(0,"div",10),O(1,SSA,6,0,"div",21)(2,kSA,5,1)(3,xSA,3,1,"div",22)(4,_SA,3,1,"div",22),Q()),t&2){let A=p(3);u(),Y(A.activeTab==="form"?1:A.activeTab==="json"?2:A.activeTab==="payload"?3:A.activeTab==="response schema"?4:-1)}}function NSA(t,e){if(t&1){let A=QA();B(0,"input",34),Di("ngModelChange",function(n){T(A);let o=p(3);return Bi(o.functionCall.userResponse,n)||(o.functionCall.userResponse=n),J(n)}),U("keydown.enter",function(){T(A);let n=p(3);return J(n.onSend())}),Q(),B(1,"button",35),U("click",function(){T(A);let n=p(3);return J(n.onSend())}),B(2,"mat-icon"),y(3,"send"),Q()()}if(t&2){let A=p(3);wi("ngModel",A.functionCall.userResponse),u(),H("disabled",!A.functionCall.userResponse)}}function FSA(t,e){if(t&1&&(B(0,"div",2)(1,"div",4),hA(2,"app-markdown",5),Q(),B(3,"div",6),O(4,uSA,9,8,"div",7),B(5,"div",8),O(6,fSA,15,5,"div",9)(7,RSA,5,1,"div",10)(8,NSA,4,2),Q()()()),t&2){let A=p(2);u(2),H("text",A.getPromptText()),u(2),Y(A.formFields.length>0?4:-1),u(2),Y(A.isConfirmationRequest?6:A.formFields.length>0?7:8)}}function LSA(t,e){if(t&1){let A=QA();B(0,"div",7)(1,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("form"))}),y(2,"Form"),Q(),B(3,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("json"))}),y(4,"JSON"),Q(),B(5,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("payload"))}),y(6,"Payload"),Q(),B(7,"div",11),U("click",function(){T(A);let n=p(3);return J(n.setActiveTab("response schema"))}),y(8,"Schema"),Q()()}if(t&2){let A=p(3);u(),RA("active",A.activeTab==="form"),u(2),RA("active",A.activeTab==="json"),u(2),RA("active",A.activeTab==="payload"),u(2),RA("active",A.activeTab==="response schema")}}function GSA(t,e){if(t&1){let A=QA();B(0,"div",9)(1,"div",12),y(2),Q(),B(3,"div",13)(4,"div",14),y(5,"Payload"),Q(),hA(6,"ngx-json-viewer",15),Q(),B(7,"div",16)(8,"div",17)(9,"label",18)(10,"input",19),Di("ngModelChange",function(n){T(A);let o=p(3);return Bi(o.confirmationModel.confirmed,n)||(o.confirmationModel.confirmed=n),J(n)}),Q(),B(11,"span"),y(12,"Confirmed"),Q()()(),B(13,"button",20),U("click",function(){T(A);let n=p(3);return J(n.onSend())}),y(14," Submit "),Q()()()}if(t&2){let A=p(3);u(2),ue(" ",A.functionCall.args==null||A.functionCall.args.toolConfirmation==null?null:A.functionCall.args.toolConfirmation.hint," "),u(4),H("json",A.functionCall.args==null||A.functionCall.args.originalFunctionCall==null?null:A.functionCall.args.originalFunctionCall.args),u(4),H("id",NQ("confirmed-checkbox-standalone-",A.functionCall.id)),wi("ngModel",A.confirmationModel.confirmed)}}function KSA(t,e){t&1&&y(0," *")}function USA(t,e){if(t&1&&(B(0,"div",28),y(1),Q()),t&2){let A=p(2).$implicit;u(),lA(A.description)}}function TSA(t,e){if(t&1){let A=QA();B(0,"input",27),Di("ngModelChange",function(n){T(A);let o=p().$implicit,a=p(5);return Bi(a.formModel[o.key],n)||(a.formModel[o.key]=n),J(n)}),Q(),O(1,USA,2,1,"div",28)}if(t&2){let A=p().$implicit,i=p(5);H("id",A.key),wi("ngModel",i.formModel[A.key]),u(),Y(A.description?1:-1)}}function JSA(t,e){if(t&1){let A=QA();B(0,"input",31),Di("ngModelChange",function(n){T(A);let o=p(2).$implicit,a=p(5);return Bi(a.formModel[o.key],n)||(a.formModel[o.key]=n),J(n)}),Q()}if(t&2){let A=p(2).$implicit,i=p(5);H("id",A.key),wi("ngModel",i.formModel[A.key])}}function OSA(t,e){if(t&1){let A=QA();B(0,"input",32),Di("ngModelChange",function(n){T(A);let o=p(2).$implicit,a=p(5);return Bi(a.formModel[o.key],n)||(a.formModel[o.key]=n),J(n)}),Q()}if(t&2){let A=p(2).$implicit,i=p(5);H("id",A.key),wi("ngModel",i.formModel[A.key])}}function YSA(t,e){if(t&1&&(B(0,"div",28),y(1),Q()),t&2){let A=p(2).$implicit;u(),lA(A.description)}}function HSA(t,e){if(t&1&&(O(0,JSA,1,2,"input",29)(1,OSA,1,2,"input",30),O(2,YSA,2,1,"div",28)),t&2){let A=p().$implicit;Y(A.type==="number"||A.type==="integer"?0:1),u(2),Y(A.description?2:-1)}}function zSA(t,e){if(t&1&&(B(0,"div",25),y(1),O(2,KSA,1,0),Q(),B(3,"div",26),O(4,TSA,2,3)(5,HSA,3,2),Q()),t&2){let A=e.$implicit;u(),ue(" ",A.title),u(),Y(A.required?2:-1),u(2),Y(A.type==="boolean"?4:5)}}function PSA(t,e){if(t&1){let A=QA();B(0,"div",21),Ue(1,zSA,6,3,null,null,xtA),B(3,"div",23)(4,"button",24),U("click",function(){T(A);let n=p(4);return J(n.onSend())}),y(5," Submit "),Q()()()}if(t&2){let A=p(4);u(),Te(A.formFields)}}function jSA(t,e){if(t&1){let A=QA();B(0,"div",22)(1,"textarea",33),Di("ngModelChange",function(n){T(A);let o=p(4);return Bi(o.formModelJson,n)||(o.formModelJson=n),J(n)}),U("ngModelChange",function(n){T(A);let o=p(4);return J(o.onJsonInputChange(n))}),Q()(),B(2,"div",23)(3,"button",24),U("click",function(){T(A);let n=p(4);return J(n.onSend())}),y(4," Submit "),Q()()}if(t&2){let A=p(4);u(),wi("ngModel",A.formModelJson)}}function qSA(t,e){if(t&1&&(B(0,"div",22)(1,"pre"),y(2),Q()()),t&2){let A=p(4);u(2),lA(A.getPayloadJson())}}function VSA(t,e){if(t&1&&(B(0,"div",22)(1,"pre"),y(2),Q()()),t&2){let A=p(4);u(2),lA(A.getResponseSchemaJson())}}function WSA(t,e){if(t&1&&(B(0,"div",10),O(1,PSA,6,0,"div",21)(2,jSA,5,1)(3,qSA,3,1,"div",22)(4,VSA,3,1,"div",22),Q()),t&2){let A=p(3);u(),Y(A.activeTab==="form"?1:A.activeTab==="json"?2:A.activeTab==="payload"?3:A.activeTab==="response schema"?4:-1)}}function ZSA(t,e){if(t&1){let A=QA();B(0,"input",34),Di("ngModelChange",function(n){T(A);let o=p(3);return Bi(o.functionCall.userResponse,n)||(o.functionCall.userResponse=n),J(n)}),U("keydown.enter",function(){T(A);let n=p(3);return J(n.onSend())}),Q(),B(1,"button",35),U("click",function(){T(A);let n=p(3);return J(n.onSend())}),B(2,"mat-icon"),y(3,"send"),Q()()}if(t&2){let A=p(3);wi("ngModel",A.functionCall.userResponse),u(),H("disabled",!A.functionCall.userResponse)}}function XSA(t,e){if(t&1&&(B(0,"div",3),O(1,LSA,9,8,"div",7),B(2,"div",8),O(3,GSA,15,5,"div",9)(4,WSA,5,1,"div",10)(5,ZSA,4,2),Q()()),t&2){let A=p(2);u(),Y(A.formFields.length>0?1:-1),u(2),Y(A.isConfirmationRequest?3:A.formFields.length>0?4:5)}}function $SA(t,e){if(t&1&&(B(0,"div",1),U("click",function(i){return i.stopPropagation()}),O(1,FSA,9,3,"div",2)(2,XSA,6,2,"div",3),Q()),t&2){let A=p();u(),Y(A.hasMessage()?1:2)}}var Hy=class t{functionCall;appName;userId;sessionId;responseComplete=new LA;formModel={};formFields=[];activeTab="form";formModelJson="";confirmationModel={confirmed:!1,payload:""};get isConfirmationRequest(){return this.functionCall?.name==="adk_request_confirmation"}cdr=w(wt);ngOnChanges(e){e.functionCall&&this.initForm()}initForm(){if(this.formModel={},this.formFields=[],this.isConfirmationRequest){this.confirmationModel.confirmed=this.functionCall.args?.toolConfirmation?.confirmed||!1,this.confirmationModel.payload=JSON.stringify(this.functionCall.args?.originalFunctionCall?.args||{},null,2);return}let e=this.functionCall?.args?.response_schema;if(e&&e.type==="object"&&e.properties)for(let A of Object.keys(e.properties)){let i=e.properties[A],n=i.type;if(!n&&i.anyOf){let o=i.anyOf.find(a=>a.type!=="null");o&&(n=o.type)}this.formFields.push({key:A,type:n,title:i.title||A,description:i.description||"",required:e.required?.includes(A)||!1}),n==="boolean"?this.formModel[A]=!1:n==="number"||n==="integer"?this.formModel[A]=null:this.formModel[A]=""}}getCleanedFormModel(){let e=this.functionCall?.args?.response_schema;if(!e||e.type!=="object"||!e.properties)return this.formModel;let A=gA({},this.formModel);for(let i of Object.keys(e.properties)){let n=e.properties[i],o=A[i];if(o!=null&&o!==""){let a=n.type;if(!a&&n.anyOf){let r=n.anyOf.find(s=>s.type!=="null");r&&(a=r.type)}a==="integer"?A[i]=parseInt(o,10):a==="number"&&(A[i]=parseFloat(o))}else A[i]=null}return A}updateFormModelJson(){this.formModelJson=JSON.stringify(this.getCleanedFormModel(),null,2)}onJsonInputChange(e){try{let A=JSON.parse(e);this.formModel=A}catch(A){}}setActiveTab(e){this.activeTab=e,e==="json"&&this.updateFormModelJson()}hasMessage(){return!!(this.functionCall.args?.prompt||this.functionCall.args?.message)}getPromptText(){return this.functionCall.args?.prompt||this.functionCall.args?.message||"Please provide your response"}hasPayload(){return this.functionCall.args?.payload!==void 0&&this.functionCall.args?.payload!==null}getPayloadJson(){try{return JSON.stringify(this.functionCall.args?.payload||{},null,2)}catch(e){return""}}hasResponseSchema(){return!!this.functionCall.args?.response_schema}getResponseSchemaJson(){try{return JSON.stringify(this.functionCall.args?.response_schema||{},null,2)}catch(e){return""}}onSend(){if(this.isConfirmationRequest){let o={};try{o=JSON.parse(this.confirmationModel.payload)}catch(s){o=this.functionCall.args?.originalFunctionCall?.args||{}}let a={confirmed:this.confirmationModel.confirmed,payload:o};this.functionCall.responseStatus="sent",this.cdr.detectChanges();let r={role:"user",parts:[{functionResponse:{id:this.functionCall.id,name:this.functionCall.name,response:a}}],functionCallEventId:this.functionCall.functionCallEventId};this.responseComplete.emit(r);return}let e,A=this.functionCall?.args?.response_schema;if(A&&A.type==="object"&&A.properties&&this.formFields.length>0){let o=this.getCleanedFormModel();e=o,this.functionCall.userResponse=JSON.stringify(o),this.functionCall.sentUserResponse=this.functionCall.userResponse}else{if(!this.functionCall.userResponse||!this.functionCall.userResponse.trim())return;this.functionCall.sentUserResponse=this.functionCall.userResponse;try{let o=JSON.parse(this.functionCall.userResponse);typeof o=="object"&&o!==null?e=o:e={result:this.functionCall.userResponse}}catch(o){e={result:this.functionCall.userResponse}}}this.functionCall.responseStatus="sent",this.cdr.detectChanges();let n={role:"user",parts:[{functionResponse:{id:this.functionCall.id,name:this.functionCall.name,response:e}}],functionCallEventId:this.functionCall.functionCallEventId};this.responseComplete.emit(n)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-long-running-response"]],inputs:{functionCall:"functionCall",appName:"appName",userId:"userId",sessionId:"sessionId"},outputs:{responseComplete:"responseComplete"},features:[Yt],decls:1,vars:1,consts:[[1,"response-chip-container"],[1,"response-chip-container",3,"click"],[1,"message-box"],[1,"request-card-standalone"],[1,"message-content"],[3,"text"],[1,"request-card"],[1,"tabs-header"],[1,"input-container"],[1,"confirmation-container",2,"width","100%"],[1,"tabs-content"],[1,"tab-link",3,"click"],[1,"confirmation-hint",2,"margin-bottom","10px","font-size","13px","font-weight","600","color","var(--mat-sys-on-surface)"],[1,"confirmation-payload",2,"margin-bottom","10px"],[1,"field-label",2,"margin-bottom","5px","font-size","12px","font-weight","500","color","var(--mat-sys-on-surface-variant)"],[3,"json"],[1,"confirmation-footer",2,"display","flex","justify-content","space-between","align-items","center","margin-top","10px"],[1,"confirmation-checkbox",2,"font-size","12px"],[2,"display","flex","align-items","center","gap","6px","cursor","pointer"],["type","checkbox",2,"cursor","pointer",3,"ngModelChange","id","ngModel"],["mat-raised-button","","color","primary",1,"form-submit-button",2,"margin-top","0",3,"click"],[1,"schema-form","grid-layout"],[1,"json-view"],[1,"grid-submit"],["mat-raised-button","","color","primary",1,"form-submit-button",3,"click"],[1,"grid-label"],[1,"grid-value"],["type","checkbox",3,"ngModelChange","id","ngModel"],[1,"field-description"],["type","number",1,"form-input",3,"id","ngModel"],["type","text",1,"form-input",3,"id","ngModel"],["type","number",1,"form-input",3,"ngModelChange","id","ngModel"],["type","text",1,"form-input",3,"ngModelChange","id","ngModel"],[1,"json-textarea",3,"ngModelChange","ngModel"],["placeholder","Enter your response...",1,"response-input",3,"ngModelChange","keydown.enter","ngModel"],["mat-icon-button","",1,"send-button",3,"click","disabled"]],template:function(A,i){A&1&&O(0,$SA,3,1,"div",0),A&2&&Y(i.functionCall.responseStatus!=="sent"&&i.functionCall.responseStatus!=="sending"?0:-1)},dependencies:[ln,Dn,YQ,rb,yn,ko,ji,pi,Wt,BQ,cs,$l],styles:["[_nghost-%COMP%]{display:block}.response-chip-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;margin:5px 5px 5px 0}.message-box[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high);border:1px solid var(--mat-sys-outline-variant);border-radius:20px;padding:12px 16px;box-shadow:none;display:flex;flex-direction:column;gap:12px}.message-content[_ngcontent-%COMP%]{flex:1;font-size:12px}.request-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;width:100%}.request-card-standalone[_ngcontent-%COMP%]{background:color-mix(in srgb,var(--mat-sys-surface-container-high) 70%,transparent);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid color-mix(in srgb,var(--mat-sys-outline-variant) 30%,transparent);border-radius:12px;padding:12px;box-shadow:0 4px 16px #0003;display:flex;flex-direction:column;gap:8px;max-width:400px}.data-buttons[_ngcontent-%COMP%]{display:flex;gap:8px}.input-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;width:100%}.input-container[_ngcontent-%COMP%] .response-input[_ngcontent-%COMP%]{flex:1;border:1px solid var(--mat-sys-outline-variant);border-radius:4px;padding:4px 8px;background:var(--mat-sys-surface-container);outline:none;font-size:12px;font-family:inherit;color:var(--mat-sys-on-surface);caret-color:var(--mat-sys-primary)}.input-container[_ngcontent-%COMP%] .response-input[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant);opacity:.6}.input-container[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%]{color:var(--mat-sys-primary);width:24px;height:24px;min-width:24px;padding:0;line-height:24px;box-sizing:border-box}.input-container[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-on-surface-variant);opacity:.3}.input-container[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}.tabs-header[_ngcontent-%COMP%]{display:flex;gap:8px;border-bottom:1px solid var(--mat-sys-outline-variant);margin-bottom:8px;padding-bottom:4px}.tab-link[_ngcontent-%COMP%]{font-size:11px;font-weight:500;color:var(--mat-sys-on-surface-variant);cursor:pointer;padding:2px 6px;border-radius:4px}.tab-link[_ngcontent-%COMP%]:hover{background:var(--mat-sys-surface-container-high)}.tab-link.active[_ngcontent-%COMP%]{color:var(--mat-sys-primary);background:var(--mat-sys-primary-container)}.tabs-content[_ngcontent-%COMP%]{width:100%}.json-view[_ngcontent-%COMP%]{padding:4px 0;max-height:200px;overflow:auto}.json-view[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{margin:0;font-size:10px;font-family:monospace;color:var(--mat-sys-on-surface)}.json-view[_ngcontent-%COMP%] .json-textarea[_ngcontent-%COMP%]{width:100%;height:150px;margin:0;font-size:10px;font-family:monospace;color:var(--mat-sys-on-surface);background:transparent;border:1px solid var(--mat-sys-outline-variant);border-radius:4px;padding:4px;resize:vertical;box-sizing:border-box}.json-view[_ngcontent-%COMP%] .json-textarea[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--mat-sys-primary)}.schema-form.grid-layout[_ngcontent-%COMP%]{display:grid;grid-template-columns:max-content 1fr;gap:4px 8px;align-items:start;width:100%;padding:4px 2px}.grid-label[_ngcontent-%COMP%]{font-size:11px;font-weight:500;color:var(--mat-sys-on-surface);text-align:right;white-space:nowrap;padding-top:6px}.grid-value[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px;width:100%}.grid-value[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%]{width:100%;border:1px solid var(--mat-sys-outline-variant);border-radius:4px;padding:4px 6px;font-size:11px;background:var(--mat-sys-surface-container);color:var(--mat-sys-on-surface);box-sizing:border-box;height:28px}.grid-value[_ngcontent-%COMP%] .form-input[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--mat-sys-primary)}.grid-value[_ngcontent-%COMP%] input[type=checkbox][_ngcontent-%COMP%]{margin:4px 0;align-self:flex-start}.field-description[_ngcontent-%COMP%]{font-size:10px;color:var(--mat-sys-on-surface-variant);opacity:.8}.grid-submit[_ngcontent-%COMP%]{grid-column:1/-1;display:flex;justify-content:flex-end;margin-top:4px}.form-submit-button[_ngcontent-%COMP%]{align-self:flex-end;margin-top:2px;height:28px!important;line-height:28px!important;font-size:11px!important}"]})};function AkA(t,e){if(t&1&&hA(0,"a2ui-surface",0),t&2){let A=p();H("surfaceId",A.surfaceId())("surface",A.surface())}}var zy=class t{processor=w(CL);beginRendering=null;surfaceUpdate=null;dataModelUpdate=null;surfaceId=bA(null);activeSurface=bA(null);surface=pe(()=>this.activeSurface());constructor(){}ngOnChanges(e){let A=[],i=null;e.beginRendering&&this.beginRendering&&Object.keys(this.beginRendering).length>0&&(A.push(this.beginRendering),i=this.beginRendering?.beginRendering?.surfaceId??i),e.surfaceUpdate&&this.surfaceUpdate&&Object.keys(this.surfaceUpdate).length>0&&(A.push(this.surfaceUpdate),i=this.surfaceUpdate?.surfaceUpdate?.surfaceId??i),e.dataModelUpdate&&this.dataModelUpdate&&Object.keys(this.dataModelUpdate).length>0&&(A.push(this.dataModelUpdate),i=this.dataModelUpdate?.dataModelUpdate?.surfaceId??i),A.length>0&&this.processor.processMessages(A),i&&this.surfaceId.set(i);let n=this.surfaceId();if(n){let o=this.processor.getSurfaces();o.has(n)&&this.activeSurface.set(o.get(n))}}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-a2ui-canvas"]],inputs:{beginRendering:"beginRendering",surfaceUpdate:"surfaceUpdate",dataModelUpdate:"dataModelUpdate"},features:[Yt],decls:1,vars:1,consts:[[3,"surfaceId","surface"]],template:function(A,i){A&1&&O(0,AkA,1,2,"a2ui-surface",0),A&2&&Y(i.surface()?0:-1)},dependencies:[li,BL],styles:["[_nghost-%COMP%]{display:block;height:100%;width:100%;overflow:auto}[_nghost-%COMP%] *{box-sizing:border-box}.canvas[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;padding:16px;box-sizing:border-box;min-height:100%}"],changeDetection:0})};var _tA=(t,e)=>({text:t,thought:e});function ekA(t,e){if(t&1&&(B(0,"div",1),y(1),Q()),t&2){let A=p();u(),lA(A.type)}}function tkA(t,e){if(t&1&&hA(0,"img",8),t&2){let A=p().$implicit;H("src",A.url,Go)}}function ikA(t,e){if(t&1&&(B(0,"a",9),y(1),Q()),t&2){let A=p(2).$implicit;H("href",A.url,Go),u(),lA(A.file.name)}}function nkA(t,e){if(t&1&&y(0),t&2){let A=p(2).$implicit;ue(" ",A.file.name," ")}}function okA(t,e){if(t&1&&(B(0,"mat-icon"),y(1,"insert_drive_file"),Q(),O(2,ikA,2,2,"a",9)(3,nkA,1,1)),t&2){let A=p().$implicit;u(2),Y(A.url?2:3)}}function akA(t,e){if(t&1&&(B(0,"div",7),O(1,tkA,1,1,"img",8),O(2,okA,4,1),Q()),t&2){let A=e.$implicit;u(),Y(A.file.type.startsWith("image/")?1:-1),u(),Y(A.file.type.startsWith("image/")?-1:2)}}function rkA(t,e){if(t&1&&(B(0,"div",4),Ue(1,akA,3,2,"div",7,ri),Q()),t&2){let A=p(2);u(),Te(A.uiEvent.attachments)}}function skA(t,e){if(t&1&&(B(0,"div",5),sn(1,10),Q()),t&2){let A=p(2);H("appJsonTooltip",A.jsonOutputData),u(),H("ngComponentOutlet",A.markdownComponent)("ngComponentOutletInputs",U0(3,_tA,A.uiEvent.text||A.rawMessageText,A.uiEvent.thought))}}function lkA(t,e){if(t&1){let A=QA();B(0,"div",12)(1,"textarea",13,0),U("ngModelChange",function(n){T(A);let o=p(4);return J(o.userEditEvalCaseMessageChange.emit(n))})("keydown",function(n){T(A);let o=p(4);return J(o.handleKeydown.emit({event:n,message:o.uiEvent}))}),Q(),B(3,"div",14)(4,"span",15),U("click",function(){T(A);let n=p(4);return J(n.cancelEditMessage.emit(n.uiEvent))}),y(5," close "),Q(),B(6,"span",16),U("click",function(){T(A);let n=p(4);return J(n.saveEditMessage.emit(n.uiEvent))}),y(7," check "),Q()()()}if(t&2){let A=p(4);u(),H("ngModel",A.userEditEvalCaseMessage),u(3),H("matTooltip",A.i18n.cancelEditingTooltip),u(2),H("matTooltip",A.i18n.saveEvalMessageTooltip)}}function gkA(t,e){if(t&1&&sn(0,10),t&2){let A=p(4);H("ngComponentOutlet",A.markdownComponent)("ngComponentOutletInputs",U0(2,_tA,A.uiEvent.text,A.uiEvent.thought))}}function ckA(t,e){if(t&1&&O(0,lkA,8,3,"div",12)(1,gkA,1,5,"ng-container",10),t&2){let A=p(3);Y(A.uiEvent.isEditing?0:1)}}function CkA(t,e){if(t&1&&(B(0,"div"),hA(1,"div",17),Q()),t&2){let A=p(3);u(),H("innerHTML",A.renderGooglerSearch(A.uiEvent.renderedContent),Gc)}}function IkA(t,e){if(t&1&&hA(0,"app-a2ui-canvas",11),t&2){let A=p(3);H("beginRendering",A.uiEvent.a2uiData.beginRendering)("surfaceUpdate",A.uiEvent.a2uiData.surfaceUpdate)("dataModelUpdate",A.uiEvent.a2uiData.dataModelUpdate)}}function dkA(t,e){if(t&1&&(B(0,"div")(1,"div"),O(2,ckA,2,1),Q(),O(3,CkA,2,1,"div"),O(4,IkA,1,3,"app-a2ui-canvas",11),Q()),t&2){let A=p(2);u(2),Y(A.uiEvent.text?2:-1),u(),Y(A.uiEvent.renderedContent?3:-1),u(),Y(A.uiEvent.a2uiData?4:-1)}}function BkA(t,e){if(t&1&&(B(0,"code"),y(1),Q()),t&2){let A=p(2);u(),ue(" ",A.uiEvent.executableCode.code," ")}}function EkA(t,e){if(t&1&&(B(0,"div")(1,"div"),y(2),Q(),B(3,"div"),y(4),Q()()),t&2){let A=p(2);u(2),ba("",A.i18n.outcomeLabel,": ",A.uiEvent.codeExecutionResult.outcome),u(2),ba("",A.i18n.outputLabel,": ",A.uiEvent.codeExecutionResult.output)}}function hkA(t,e){if(t&1){let A=QA();B(0,"div",18)(1,"img",19),U("click",function(){T(A);let n=p(4);return J(n.openViewImageDialog.emit(n.uiEvent.inlineData.data))}),Q()()}if(t&2){let A=p(4);u(),H("src",A.uiEvent.inlineData.data,Go)}}function QkA(t,e){if(t&1&&(B(0,"div"),hA(1,"app-audio-player",20),Q()),t&2){let A=p(4);u(),H("base64data",A.uiEvent.inlineData.data)}}function ukA(t,e){if(t&1){let A=QA();B(0,"div")(1,"div",21)(2,"mat-icon"),y(3,"description"),Q(),B(4,"button",22),U("click",function(){T(A);let n=p(4);return J(n.openBase64InNewTab.emit({data:n.uiEvent.inlineData.data,mimeType:n.uiEvent.inlineData.mimeType}))}),y(5),Q()()()}if(t&2){let A=p(4);u(5),ue(" ",A.uiEvent.inlineData.name," ")}}function fkA(t,e){if(t&1){let A=QA();B(0,"div")(1,"button",22),U("click",function(){T(A);let n=p(4);return J(n.openBase64InNewTab.emit({data:n.uiEvent.inlineData.data,mimeType:n.uiEvent.inlineData.mimeType}))}),y(2),Q()()}if(t&2){let A=p(4);u(2),ue(" ",A.uiEvent.inlineData.name," ")}}function pkA(t,e){if(t&1&&(B(0,"div")(1,"div"),O(2,hkA,2,1,"div",18)(3,QkA,2,1,"div")(4,ukA,6,1,"div")(5,fkA,3,1,"div"),Q()()),t&2){let A,i=p(3);u(2),Y((A=i.uiEvent.inlineData.mediaType)===i.MediaType.IMAGE?2:A===i.MediaType.AUDIO?3:A===i.MediaType.TEXT?4:5)}}function mkA(t,e){if(t&1){let A=QA();B(0,"div")(1,"img",23),U("click",function(){T(A);let n=p(4);return J(n.openViewImageDialog.emit(n.uiEvent.inlineData.data))}),Q()()}if(t&2){let A=p(4);u(),H("src",A.uiEvent.inlineData.data,Go)}}function wkA(t,e){if(t&1&&(B(0,"div",7)(1,"mat-icon"),y(2,"insert_drive_file"),Q(),B(3,"a",9),y(4),Q()()),t&2){let A=p(4);u(3),H("href",A.uiEvent.inlineData.data,Go),u(),lA(A.uiEvent.inlineData.displayName)}}function DkA(t,e){if(t&1&&(B(0,"div"),O(1,mkA,2,1,"div")(2,wkA,5,2,"div",7),Q()),t&2){let A=p(3);u(),Y(A.uiEvent.inlineData.mimeType.startsWith("image/")?1:2)}}function ykA(t,e){if(t&1&&O(0,pkA,6,1,"div")(1,DkA,3,1,"div"),t&2){let A=p(2);Y(A.uiEvent.role==="bot"?0:1)}}function vkA(t,e){if(t&1&&(B(0,"div",24),hA(1,"app-audio-player",20),Q()),t&2){let A=p(4);u(),H("base64data",A.audioUrl||"")}}function bkA(t,e){if(t&1&&O(0,vkA,2,1,"div",24),t&2){let A=e.$implicit;Y(A.fileData&&A.fileData.mimeType.startsWith("audio/")?0:-1)}}function MkA(t,e){if(t&1&&Ue(0,bkA,1,1,null,null,ri),t&2){let A=p(2);Te(A.uiEvent.event==null||A.uiEvent.event.content==null?null:A.uiEvent.event.content.parts)}}function SkA(t,e){if(t&1&&(B(0,"div",27)(1,"div",28),y(2),Q(),hA(3,"ngx-json-viewer",29),Q(),B(4,"div",30)(5,"div",31),y(6),Q(),hA(7,"ngx-json-viewer",29),Q()),t&2){let A=p(3);u(2),lA(A.i18n.actualToolUsesLabel),u(),H("json",A.uiEvent.actualInvocationToolUses),u(3),lA(A.i18n.expectedToolUsesLabel),u(),H("json",A.uiEvent.expectedInvocationToolUses)}}function kkA(t,e){if(t&1&&(B(0,"div",27)(1,"div",28),y(2),Q(),B(3,"div"),y(4),Q()(),B(5,"div",30)(6,"div",31),y(7),Q(),B(8,"div"),y(9),Q()()),t&2){let A=p(3);u(2),lA(A.i18n.actualResponseLabel),u(2),lA(A.uiEvent.actualFinalResponse),u(3),lA(A.i18n.expectedResponseLabel),u(2),lA(A.uiEvent.expectedFinalResponse)}}function xkA(t,e){if(t&1&&(B(0,"div",26)(1,"span",32),y(2),Q(),B(3,"span",33),y(4),Q()()),t&2){let A=p(3);u(2),ba("",A.i18n.matchScoreLabel,": ",A.uiEvent.evalScore),u(2),ba("",A.i18n.thresholdLabel,": ",A.uiEvent.evalThreshold)}}function _kA(t,e){if(t&1&&(B(0,"div",6)(1,"div",25),O(2,SkA,8,4)(3,kkA,10,4),Q(),O(4,xkA,5,4,"div",26),Q()),t&2){let A=p(2);u(2),Y(A.uiEvent.actualInvocationToolUses?2:A.uiEvent.actualFinalResponse?3:-1),u(2),Y(A.uiEvent.evalScore!==void 0&&A.uiEvent.evalThreshold!==void 0?4:-1)}}function RkA(t,e){if(t&1&&(O(0,rkA,3,0,"div",4),O(1,skA,2,6,"div",5)(2,dkA,5,3,"div"),O(3,BkA,2,1,"code"),O(4,EkA,5,4,"div"),O(5,ykA,2,1),O(6,MkA,2,0),O(7,_kA,5,2,"div",6)),t&2){let A=p();Y(A.uiEvent.attachments?0:-1),u(),Y(A.uiEvent.event.nodeInfo!=null&&A.uiEvent.event.nodeInfo.messageAsOutput?1:A.uiEvent.thought||A.uiEvent.text||A.uiEvent.renderedContent||A.uiEvent.a2uiData||A.uiEvent.event.inputTranscription||A.uiEvent.event.outputTranscription?2:-1),u(2),Y(A.uiEvent.executableCode?3:-1),u(),Y(A.uiEvent.codeExecutionResult?4:-1),u(),Y(A.uiEvent.inlineData?5:-1),u(),Y(!(A.uiEvent.event==null||A.uiEvent.event.content==null)&&A.uiEvent.event.content.parts?6:-1),u(),Y(A.uiEvent.failedMetric&&A.uiEvent.evalStatus===2?7:-1)}}function NkA(t,e){if(t&1&&hA(0,"ngx-json-viewer",2),t&2){let A=p();H("json",A.uiEvent.event.output)("appJsonTooltip",(A.uiEvent.event.nodeInfo==null?null:A.uiEvent.event.nodeInfo.outputFor)||A.uiEvent.nodePath)}}function FkA(t,e){if(t&1&&hA(0,"ngx-json-viewer",3),t&2){let A=p();H("json",A.uiEvent.error)("appJsonTooltip",A.uiEvent.error)}}function LkA(t,e){if(t&1&&y(0),t&2){let A=p(2);ue(" ",A.uiEvent.event.inputTranscription.text," ")}}function GkA(t,e){if(t&1&&y(0),t&2){let A=p(2);ue(" ",A.uiEvent.event.outputTranscription.text," ")}}function KkA(t,e){if(t&1&&O(0,LkA,1,1)(1,GkA,1,1),t&2){let A=p();Y(A.role==="user"&&A.uiEvent.event.inputTranscription?0:A.role==="bot"&&A.uiEvent.event.outputTranscription?1:-1)}}var Py=class t{uiEvent;type="message";role="bot";evalStatus;userEditEvalCaseMessage="";userEditEvalCaseMessageChange=new LA;handleKeydown=new LA;cancelEditMessage=new LA;saveEditMessage=new LA;openViewImageDialog=new LA;openBase64InNewTab=new LA;i18n=w(UI);sanitizer=w(Cs);markdownComponent=w(_I);MediaType=aC;renderGooglerSearch(e){return this.sanitizer.bypassSecurityTrustHtml(e)}get rawMessageText(){let e=this.uiEvent.event?.content?.parts;return e?e.filter(A=>A.text).map(A=>A.text).join(""):""}get jsonOutputData(){if(this.uiEvent.event?.nodeInfo?.messageAsOutput===!0){let e=this.rawMessageText;if(e)try{return JSON.parse(e)}catch(A){return null}}return null}get hasAudio(){if(this.uiEvent.inlineData?.mediaType==="audio")return!0;let e=this.uiEvent.event?.content?.parts;return e?e.some(A=>A.fileData&&A.fileData.mimeType&&A.fileData.mimeType.startsWith("audio/")):!1}audioUrl=null;ngOnChanges(e){e.uiEvent&&this.uiEvent&&this.checkAndLoadAudio()}http=w(fr);artifactService=w(TB);changeDetectorRef=w(wt);checkAndLoadAudio(){let e=this.uiEvent.event?.content?.parts;if(e){let A=e.find(i=>i.fileData&&i.fileData.mimeType&&i.fileData.mimeType.startsWith("audio/pcm"));A&&A.fileData&&this.loadAudio(A.fileData.fileUri)}}loadAudio(e){if(!e||!e.startsWith("artifact://"))return;let A=e.substring(11).split("/"),i=A[0],n=A[1],o=A[2],a=A.slice(3).join("/"),r=a.indexOf("#"),s=r!==-1?a.substring(0,r):a,l=r!==-1?a.substring(r+1):"0",g=s.lastIndexOf("/"),C=g!==-1?s.substring(g+1):s;this.artifactService.getLatestArtifact(n,i,o,C).subscribe(I=>{let d="";if(I.inlineData&&I.inlineData.data?d=I.inlineData.data:I.data&&(d=I.data),d){let h=this.base64ToArrayBuffer(d),E=h.byteLength-h.byteLength%2,f=h.slice(0,E),v=this.pcmToWav(f,24e3,1),k=new FileReader;k.onloadend=()=>{this.audioUrl=k.result,this.changeDetectorRef.detectChanges()},k.readAsDataURL(v)}})}base64ToArrayBuffer(e){let A=e.replace(/\s/g,""),i=A.indexOf(",");for(i!==-1&&(A=A.substring(i+1)),A=A.replace(/-/g,"+").replace(/_/g,"/");A.length%4!==0;)A+="=";let n=window.atob(A),o=n.length,a=new Uint8Array(o);for(let r=0;rA.toString(16).padStart(2,"0")).join(" ")}pcmToWav(e,A,i){let n=new ArrayBuffer(44),o=new DataView(n);return this.writeString(o,0,"RIFF"),o.setUint32(4,36+e.byteLength,!0),this.writeString(o,8,"WAVE"),this.writeString(o,12,"fmt "),o.setUint32(16,16,!0),o.setUint16(20,1,!0),o.setUint16(22,i,!0),o.setUint32(24,A,!0),o.setUint32(28,A*i*2,!0),o.setUint16(32,i*2,!0),o.setUint16(34,16,!0),this.writeString(o,36,"data"),o.setUint32(40,e.byteLength,!0),new Blob([n,e],{type:"audio/wav"})}writeString(e,A,i){for(let n=0;n({"eval-pass":t,"eval-fail":e}),HN=t=>({hidden:t}),zN=(t,e)=>e.id;function TkA(t,e){if(t&1){let A=QA();B(0,"app-content-bubble",10),U("userEditEvalCaseMessageChange",function(n){T(A);let o=p();return J(o.userEditEvalCaseMessageChange.emit(n))})("handleKeydown",function(n){T(A);let o=p();return J(o.handleKeydown.emit(n))})("cancelEditMessage",function(n){T(A);let o=p();return J(o.cancelEditMessage.emit(n))})("saveEditMessage",function(n){T(A);let o=p();return J(o.saveEditMessage.emit(n))})("openViewImageDialog",function(n){T(A);let o=p();return J(o.openViewImageDialog.emit({images:[n],currentIndex:0}))})("openBase64InNewTab",function(n){T(A);let o=p();return J(o.openBase64InNewTab.emit(n))}),Q()}if(t&2){let A=p();H("type",A.uiEvent.thought?"thought":"message")("role",A.uiEvent.role)("evalStatus",A.uiEvent.evalStatus)("uiEvent",A.uiEvent)("userEditEvalCaseMessage",A.userEditEvalCaseMessage)}}function JkA(t,e){if(t&1&&hA(0,"app-content-bubble",1),t&2){let A=p();H("uiEvent",A.uiEvent)}}function OkA(t,e){if(t&1&&hA(0,"app-content-bubble",2),t&2){let A=p();H("uiEvent",A.uiEvent)}}function YkA(t,e){if(t&1&&hA(0,"app-content-bubble",3),t&2){let A=p();H("uiEvent",A.uiEvent)}}function HkA(t,e){t&1&&hA(0,"app-hover-info-button",5),t&2&&H("icon","stop_circle")("text","Turn Complete")("tooltipContent","The agent has completed this turn")("tooltipTitle","Turn Complete")}function zkA(t,e){t&1&&hA(0,"app-hover-info-button",5),t&2&&H("icon","report")("text","Interrupted")("tooltipContent","The stream was interrupted")("tooltipTitle","Interrupted")}function PkA(t,e){if(t&1&&hA(0,"app-hover-info-button",5),t&2){let A=e.$implicit;H("icon","bolt")("text",A.name)("tooltipContent",A.args||"")("tooltipTitle","Function Call")}}function jkA(t,e){if(t&1){let A=QA();B(0,"app-computer-action",14),U("clickEvent",function(n){T(A);let o=p(3);return J(o.clickEvent.emit(n))})("openImage",function(n){T(A);let o=p(3);return J(o.openViewImageDialog.emit(n))}),Q()}if(t&2){let A=p().$implicit,i=p(2);H("functionCall",A)("allMessages",i.uiEvents)("index",i.index)}}function qkA(t,e){if(t&1&&O(0,jkA,1,3,"app-computer-action",13),t&2){let A=e.$implicit,i=p(2);Y(i.isComputerUseClick(A)?0:-1)}}function VkA(t,e){if(t&1&&(B(0,"div",11),Ue(1,PkA,1,4,"app-hover-info-button",5,zN),Q(),B(3,"div",12),Ue(4,qkA,1,1,null,null,zN),Q()),t&2){let A=p();u(),Te(A.uiEvent.functionCalls),u(3),Te(A.uiEvent.functionCalls)}}function WkA(t,e){if(t&1){let A=QA();B(0,"app-computer-action",16),U("clickEvent",function(n){T(A);let o=p(3);return J(o.clickEvent.emit(n))}),Q()}if(t&2){let A=p().$implicit,i=p(2);H("functionResponse",A)("allMessages",i.uiEvents)("index",i.index)}}function ZkA(t,e){if(t&1&&hA(0,"app-hover-info-button",5),t&2){let A=p().$implicit;H("icon","check")("text",A.name)("tooltipContent",A.response||"")("tooltipTitle","Function Response")}}function XkA(t,e){if(t&1&&O(0,WkA,1,3,"app-computer-action",15)(1,ZkA,1,4,"app-hover-info-button",5),t&2){let A=e.$implicit,i=p(2);Y(i.isComputerUseResponse(A)?0:1)}}function $kA(t,e){if(t&1&&Ue(0,XkA,2,1,null,null,ri),t&2){let A=p();Te(A.uiEvent.functionResponses)}}function AxA(t,e){if(t&1&&hA(0,"app-hover-info-button",5),t&2){let A=p(),i=zn(9);H("icon","data_object")("text","State: "+i.join(", "))("tooltipContent",A.getFilteredStateDelta(A.uiEvent.stateDelta))("tooltipTitle","State Update")}}function exA(t,e){if(t&1&&hA(0,"app-hover-info-button",5),t&2){let A=p();H("icon","attachment")("text","Artifact")("tooltipContent",A.uiEvent.artifactDelta)("tooltipTitle","Artifact")}}function txA(t,e){if(t&1&&hA(0,"app-content-bubble",6),t&2){let A=p();H("uiEvent",A.uiEvent)}}function ixA(t,e){if(t&1&&hA(0,"app-hover-info-button",5),t&2){let A=p();H("icon","route")("text","route: "+A.String(A.uiEvent.route))("tooltipContent",A.uiEvent.route)("tooltipTitle","Route")}}function nxA(t,e){if(t&1){let A=QA();B(0,"button",17),U("click",function(n){T(A);let o=p();return J(o.agentStateClick.emit({event:n,index:o.index}))}),B(1,"mat-icon"),y(2,"account_tree"),Q(),y(3," Agent State "),Q()}if(t&2){let A=p();H("appWorkflowGraphTooltip",A.getWorkflowNodes())("agentGraphData",A.agentGraphData)("nodePath",A.uiEvent.nodePath)("allNodes",A.allWorkflowNodes)}}function oxA(t,e){if(t&1&&hA(0,"app-hover-info-button",8),t&2){let A=p();H("icon","check_circle")("text",A.getEndOfAgentAuthor()+" completed!")}}function axA(t,e){if(t&1){let A=QA();B(0,"app-long-running-response",19),U("responseComplete",function(n){T(A);let o=p(3);return J(o.longRunningResponseComplete.emit(n))}),Q()}if(t&2){let A=p().$implicit,i=p(2);H("functionCall",A)("appName",i.appName)("userId",i.userId)("sessionId",i.sessionId)}}function rxA(t,e){if(t&1&&O(0,axA,1,4,"app-long-running-response",18),t&2){let A=e.$implicit,i=p(2);Y(A.needsResponse&&!i.hasFunctionResponse(A.id)?0:-1)}}function sxA(t,e){if(t&1&&Ue(0,rxA,1,1,null,null,zN),t&2){let A=p();Te(A.uiEvent.functionCalls)}}function lxA(t,e){if(t&1&&(B(0,"div",9)(1,"span",20),y(2),Q()()),t&2){let A=p();H("ngClass",U0(2,UkA,A.uiEvent.evalStatus===1,A.uiEvent.evalStatus===2)),u(2),lA(A.uiEvent.evalStatus===1?A.i18n.evalPassLabel:A.uiEvent.evalStatus===2?A.i18n.evalFailLabel:"")}}function gxA(t,e){if(t&1){let A=QA();B(0,"div")(1,"span",21),U("click",function(){T(A);let n=p(2);return J(n.editEvalCaseMessage.emit(n.uiEvent))}),y(2," edit "),Q(),B(3,"span",21),U("click",function(){T(A);let n=p(2);return J(n.deleteEvalCaseMessage.emit({message:n.uiEvent,index:n.index}))}),y(4," delete "),Q()()}if(t&2){let A=p(2);u(),H("ngClass",Ks(4,HN,A.isEvalCaseEditing))("matTooltip",A.i18n.editEvalMessageTooltip),u(2),H("ngClass",Ks(6,HN,A.isEvalCaseEditing))("matTooltip",A.i18n.deleteEvalMessageTooltip)}}function cxA(t,e){if(t&1){let A=QA();B(0,"div")(1,"span",21),U("click",function(){T(A);let n=p(2);return J(n.editFunctionArgs.emit(n.uiEvent))}),y(2," edit "),Q()()}if(t&2){let A=p(2);u(),H("ngClass",Ks(2,HN,A.isEvalCaseEditing))("matTooltip",A.i18n.editFunctionArgsTooltip)}}function CxA(t,e){if(t&1&&O(0,gxA,5,8,"div")(1,cxA,3,4,"div"),t&2){let A=p();Y(A.uiEvent.text?0:A.isEditFunctionArgsEnabled&&A.uiEvent.functionCalls&&A.uiEvent.functionCalls.length>0?1:-1)}}var EQ=class t{uiEvent;index;uiEvents=[];appName="";userId="";sessionId="";sessionName="";evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;isEditFunctionArgsEnabled=!1;userEditEvalCaseMessage="";agentGraphData=null;allWorkflowNodes=null;handleKeydown=new LA;cancelEditMessage=new LA;saveEditMessage=new LA;userEditEvalCaseMessageChange=new LA;openViewImageDialog=new LA;openBase64InNewTab=new LA;editEvalCaseMessage=new LA;deleteEvalCaseMessage=new LA;editFunctionArgs=new LA;clickEvent=new LA;longRunningResponseComplete=new LA;agentStateClick=new LA;i18n=w(UI);Object=Object;String=String;shouldShowMessageCard(e){return!!(e.text||e.attachments||e.inlineData||e.executableCode||e.codeExecutionResult||e.a2uiData||e.renderedContent||e.isLoading||e.failedMetric&&e.evalStatus===2||e.event?.content?.parts?.some(A=>A.fileData))}isComputerUseClick(e){return dQ(e)}isComputerUseResponse(e){return F0(e)}getFilteredStateKeys(e){return e?Object.keys(e).filter(A=>A!=="__llm_request_key__"):[]}getFilteredStateDelta(e){if(!e)return null;let A=gA({},e);return delete A.__llm_request_key__,A}hasWorkflowNodes(){let e=this.uiEvent.event?.actions?.agentState?.nodes;return!!e&&Object.keys(e).length>0}getWorkflowNodes(){return this.uiEvent.event?.actions?.agentState?.nodes||null}hasEndOfAgent(){return this.uiEvent.event?.actions?.endOfAgent===!0}getEndOfAgentAuthor(){return this.uiEvent.event?.author||"Agent"}hasFunctionResponse(e){return e?this.uiEvents.some(A=>A.functionResponses?.some(i=>i.id===e&&i.response?.status!=="pending")):!1}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-event-content"]],inputs:{uiEvent:"uiEvent",index:"index",uiEvents:"uiEvents",appName:"appName",userId:"userId",sessionId:"sessionId",sessionName:"sessionName",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",userEditEvalCaseMessage:"userEditEvalCaseMessage",agentGraphData:"agentGraphData",allWorkflowNodes:"allWorkflowNodes"},outputs:{handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",clickEvent:"clickEvent",longRunningResponseComplete:"longRunningResponseComplete",agentStateClick:"agentStateClick"},decls:19,vars:18,consts:[[3,"type","role","evalStatus","uiEvent","userEditEvalCaseMessage"],["type","output",3,"uiEvent"],["type","transcription","role","user",3,"uiEvent"],["type","transcription","role","bot",3,"uiEvent"],[1,"event-chips-container"],[3,"icon","text","tooltipContent","tooltipTitle"],["type","error",3,"uiEvent"],["mat-stroked-button","",1,"event-action-button",3,"appWorkflowGraphTooltip","agentGraphData","nodePath","allNodes"],[3,"icon","text"],[3,"ngClass"],[3,"userEditEvalCaseMessageChange","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","type","role","evalStatus","uiEvent","userEditEvalCaseMessage"],[1,"function-calls-buttons"],[1,"function-calls-previews"],[3,"functionCall","allMessages","index"],[3,"clickEvent","openImage","functionCall","allMessages","index"],[3,"functionResponse","allMessages","index"],[3,"clickEvent","functionResponse","allMessages","index"],["mat-stroked-button","",1,"event-action-button",3,"click","appWorkflowGraphTooltip","agentGraphData","nodePath","allNodes"],[3,"functionCall","appName","userId","sessionId"],[3,"responseComplete","functionCall","appName","userId","sessionId"],[2,"font-family","monospace"],[1,"material-symbols-outlined","eval-case-edit-button",3,"click","ngClass","matTooltip"]],template:function(A,i){if(A&1&&(O(0,TkA,1,5,"app-content-bubble",0),O(1,JkA,1,1,"app-content-bubble",1),O(2,OkA,1,1,"app-content-bubble",2),O(3,YkA,1,1,"app-content-bubble",3),B(4,"div",4),O(5,HkA,1,4,"app-hover-info-button",5),O(6,zkA,1,4,"app-hover-info-button",5),O(7,VkA,6,0),O(8,$kA,2,0),ta(9),O(10,AxA,1,4,"app-hover-info-button",5),O(11,exA,1,4,"app-hover-info-button",5),O(12,txA,1,1,"app-content-bubble",6),O(13,ixA,1,4,"app-hover-info-button",5),O(14,nxA,4,4,"button",7),O(15,oxA,1,2,"app-hover-info-button",8),Q(),O(16,sxA,2,0),O(17,lxA,3,5,"div",9),O(18,CxA,2,1)),A&2){Y(i.shouldShowMessageCard(i.uiEvent)?0:-1),u(),Y(i.uiEvent.event.output?1:-1),u(),Y(i.uiEvent.event.inputTranscription?2:-1),u(),Y(i.uiEvent.event.outputTranscription?3:-1),u(2),Y(i.uiEvent.event.turnComplete?5:-1),u(),Y(i.uiEvent.event.interrupted?6:-1),u(),Y(i.uiEvent.functionCalls&&i.uiEvent.functionCalls.length>0?7:-1),u(),Y(i.uiEvent.functionResponses&&i.uiEvent.functionResponses.length>0?8:-1),u();let n=ga(i.getFilteredStateKeys(i.uiEvent.stateDelta));u(),Y(n.length>0?10:-1),u(),Y(i.uiEvent.artifactDelta?11:-1),u(),Y(i.uiEvent.error?12:-1),u(),Y(i.uiEvent.route?13:-1),u(),Y(i.hasWorkflowNodes()?14:-1),u(),Y(i.hasEndOfAgent()?15:-1),u(),Y(i.uiEvent.functionCalls&&i.uiEvent.functionCalls.length>0?16:-1),u(),Y(i.uiEvent.evalStatus===1||i.uiEvent.evalStatus===2?17:-1),u(),Y(i.evalCase&&i.isEvalEditMode?18:-1)}},dependencies:[li,zl,Tn,Wt,qi,pi,Fa,dn,Ty,Jy,Hy,Oy,Py],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;width:100%}app-content-bubble[_ngcontent-%COMP%] + app-content-bubble[_ngcontent-%COMP%]{margin-top:5px}.event-chips-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;width:100%}.user[_nghost-%COMP%] .event-chips-container[_ngcontent-%COMP%], .user [_nghost-%COMP%] .event-chips-container[_ngcontent-%COMP%]{justify-content:flex-end}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#2e7d32}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--mat-sys-error)}.hidden[_ngcontent-%COMP%]{visibility:hidden}.event-action-button[_ngcontent-%COMP%]{margin:5px}.function-calls-previews[_ngcontent-%COMP%]{width:100%}"]})};function IxA(t,e){if(t&1&&hA(0,"app-chat-avatar",1),t&2){let A=p();H("role",A.uiEvent.event.content?"bot":"node")("author",A.uiEvent.author)("nodePath",A.uiEvent.nodePath)}}function dxA(t,e){t&1&&hA(0,"div",5)}function BxA(t,e){if(t&1&&Ue(0,dxA,1,0,"div",5,ri),t&2){let A=p();Te(A.indentationArray)}}function ExA(t,e){t&1&&hA(0,"app-chat-avatar",3)}function hxA(t,e){if(t&1&&hA(0,"app-message-feedback",4),t&2){let A=p();H("sessionName",A.sessionName)("eventId",A.uiEvent.event.id||"")}}var jy=class t{uiEvent;index;uiEvents=[];isSelected=!1;isSelectable=!0;appName="";userId="";sessionId="";sessionName="";evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;isEditFunctionArgsEnabled=!1;userEditEvalCaseMessage="";agentGraphData=null;allWorkflowNodes=null;isUserFeedbackEnabled=!1;isLoadingAgentResponse=!1;rowClick=new LA;handleKeydown=new LA;cancelEditMessage=new LA;saveEditMessage=new LA;userEditEvalCaseMessageChange=new LA;openViewImageDialog=new LA;openBase64InNewTab=new LA;editEvalCaseMessage=new LA;deleteEvalCaseMessage=new LA;editFunctionArgs=new LA;clickEvent=new LA;longRunningResponseComplete=new LA;agentStateClick=new LA;onRowClick(e){this.isSelectable&&this.rowClick.emit({event:e,uiEvent:this.uiEvent,index:this.index})}get indentationDepth(){if(!this.uiEvent.nodePath)return 0;let A=this.uiEvent.nodePath.split("/").filter(Boolean).length;return A>2?A-2:0}get indentationArray(){let e=this.indentationDepth;return e>0?Array.from({length:e},(A,i)=>i):[]}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-event-row"]],hostAttrs:[1,"message-row-container"],hostVars:8,hostBindings:function(A,i){A&1&&U("click",function(o){return i.onRowClick(o)}),A&2&&RA("selected",i.isSelected)("user",i.uiEvent.role==="user")("bot",i.uiEvent.role==="bot")("selectable",i.isSelectable)},inputs:{uiEvent:"uiEvent",index:"index",uiEvents:"uiEvents",isSelected:"isSelected",isSelectable:"isSelectable",appName:"appName",userId:"userId",sessionId:"sessionId",sessionName:"sessionName",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",userEditEvalCaseMessage:"userEditEvalCaseMessage",agentGraphData:"agentGraphData",allWorkflowNodes:"allWorkflowNodes",isUserFeedbackEnabled:"isUserFeedbackEnabled",isLoadingAgentResponse:"isLoadingAgentResponse"},outputs:{rowClick:"rowClick",handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",clickEvent:"clickEvent",longRunningResponseComplete:"longRunningResponseComplete",agentStateClick:"agentStateClick"},decls:7,vars:21,consts:[[1,"event-number-container"],[3,"role","author","nodePath"],[1,"message-content",3,"userEditEvalCaseMessageChange","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","clickEvent","longRunningResponseComplete","agentStateClick","uiEvent","index","uiEvents","appName","userId","sessionId","sessionName","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userEditEvalCaseMessage","agentGraphData","allWorkflowNodes"],["role","user"],[3,"sessionName","eventId"],[1,"indentation-line"]],template:function(A,i){A&1&&(B(0,"div",0),y(1),Q(),O(2,IxA,1,3,"app-chat-avatar",1),O(3,BxA,2,0),B(4,"app-event-content",2),U("userEditEvalCaseMessageChange",function(o){return i.userEditEvalCaseMessageChange.emit(o)})("handleKeydown",function(o){return i.handleKeydown.emit(o)})("cancelEditMessage",function(o){return i.cancelEditMessage.emit(o)})("saveEditMessage",function(o){return i.saveEditMessage.emit(o)})("openViewImageDialog",function(o){return i.openViewImageDialog.emit(o)})("openBase64InNewTab",function(o){return i.openBase64InNewTab.emit(o)})("editEvalCaseMessage",function(o){return i.editEvalCaseMessage.emit(o)})("deleteEvalCaseMessage",function(o){return i.deleteEvalCaseMessage.emit(o)})("editFunctionArgs",function(o){return i.editFunctionArgs.emit(o)})("clickEvent",function(o){return i.clickEvent.emit(o)})("longRunningResponseComplete",function(o){return i.longRunningResponseComplete.emit(o)})("agentStateClick",function(o){return i.agentStateClick.emit(o)}),Q(),O(5,ExA,1,0,"app-chat-avatar",3),O(6,hxA,1,2,"app-message-feedback",4)),A&2&&(RA("hidden",!i.isSelectable),u(),ue(" #",i.index+1," "),u(),Y(i.uiEvent.role==="bot"&&!i.uiEvent.isLoading?2:-1),u(),Y(i.uiEvent.role==="bot"?3:-1),u(),H("uiEvent",i.uiEvent)("index",i.index)("uiEvents",i.uiEvents)("appName",i.appName)("userId",i.userId)("sessionId",i.sessionId)("sessionName",i.sessionName)("evalCase",i.evalCase)("isEvalEditMode",i.isEvalEditMode)("isEvalCaseEditing",i.isEvalCaseEditing)("isEditFunctionArgsEnabled",i.isEditFunctionArgsEnabled)("userEditEvalCaseMessage",i.userEditEvalCaseMessage)("agentGraphData",i.agentGraphData)("allWorkflowNodes",i.allWorkflowNodes),u(),Y(i.uiEvent.role==="user"?5:-1),u(),Y(i.isUserFeedbackEnabled&&!i.isLoadingAgentResponse&&i.uiEvent.role==="bot"?6:-1))},dependencies:[li,Ky,Ly,EQ],styles:[".generated-image-container[_ngcontent-%COMP%]{max-width:400px;margin-left:20px}.generated-image[_ngcontent-%COMP%]{max-width:100%;min-width:40px;border-radius:8px}.html-artifact-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:flex-start;align-items:center}app-content-bubble[_ngcontent-%COMP%] + app-content-bubble[_ngcontent-%COMP%]{margin-top:5px}.event-chips-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;width:100%}[_nghost-%COMP%]{display:flex;flex-direction:row;flex-wrap:nowrap;margin-left:-20px;margin-right:-20px;padding:4px 20px;border-radius:4px;transition:all .2s ease}.selectable[_nghost-%COMP%]:hover{box-shadow:inset 0 0 0 2px var(--mat-sys-outline-variant, rgba(0, 0, 0, .12))}.selected[_nghost-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))!important}app-message-feedback[_ngcontent-%COMP%]{width:100%}.user[_nghost-%COMP%]{justify-content:flex-end;align-items:flex-start;gap:15px}.bot[_nghost-%COMP%]{align-items:flex-start;padding-right:48px}.bot[_nghost-%COMP%] app-chat-avatar[_ngcontent-%COMP%]{align-self:flex-start}.message-content[_ngcontent-%COMP%]{display:contents}.bot[_nghost-%COMP%] > .message-content[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-width:0;align-items:flex-start}.user[_nghost-%COMP%] > .message-content[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-width:0;align-items:flex-end}.bot[_nghost-%COMP%]:focus-within app-content-bubble[_ngcontent-%COMP%] .content-bubble{border:1px solid var(--mat-sys-outline)}.message-textarea[_ngcontent-%COMP%]{max-width:100%;border:none;background-color:transparent;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}app-content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}app-content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--mat-sys-outline-variant);padding-right:8px;min-width:350px;max-width:350px}app-content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}app-content-bubble[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--mat-sys-outline-variant);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--mat-sys-tertiary)}.header-actual[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#2e7d32}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--mat-sys-error)}.hidden[_ngcontent-%COMP%]{visibility:hidden}.image-preview-chat[_ngcontent-%COMP%]{max-width:90%;max-height:70vh;width:auto;height:auto;border-radius:8px;cursor:pointer;transition:transform .2s ease-in-out}.attachment[_ngcontent-%COMP%]{display:flex;align-items:center}[_nghost-%COMP%] .message-text p{white-space:pre-line;word-break:break-word;overflow-wrap:break-word}.event-number-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-self:flex-start;min-width:30px;margin-top:10px;margin-right:8px;font-size:12px;font-weight:600;text-align:center;color:var(--mat-sys-on-surface-variant)}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.link-style-button[_ngcontent-%COMP%]{border:none;padding:0;font:inherit;color:var(--mat-sys-primary)!important;text-decoration:underline;cursor:pointer;outline:none;font-size:14px}.cancel-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--mat-sys-outline-variant);cursor:pointer;margin-right:16px}.save-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--mat-sys-primary);cursor:pointer;margin-right:16px}.indentation-line[_ngcontent-%COMP%]{width:20px;border-left:1px solid var(--mat-sys-outline-variant);align-self:stretch;opacity:.5;margin-top:-4px;margin-bottom:-4px}"]})};function QxA(t,e){if(t&1){let A=QA();B(0,"button",3),U("click",function(){T(A);let n=p();return J(n.toggleVideoRecording.emit())}),B(1,"mat-icon"),y(2,"videocam"),Q()(),B(3,"div",4),hA(4,"div",5)(5,"div",5)(6,"div",5)(7,"div",5),Q()}if(t&2){let A=p();RA("recording",A.isVideoRecording),H("matTooltip",A.isVideoRecording?A.i18n.turnOffCamTooltip:A.i18n.useCamTooltip)("disabled",!A.isBidiStreamingEnabled),u(4),ut("height",4+A.micVolume*16,"px"),u(),ut("height",4+A.micVolume*24,"px"),u(),ut("height",4+A.micVolume*18,"px"),u(),ut("height",4+A.micVolume*14,"px")}}function uxA(t,e){if(t&1){let A=QA();B(0,"div",2)(1,"div",6),y(2,"Live Flags"),Q(),B(3,"div",7)(4,"mat-checkbox",8),U("change",function(n){T(A);let o=p();return J(o.flags.proactiveAudio=n.checked)}),y(5,"Proactive Audio"),Q()(),B(6,"div",7)(7,"mat-checkbox",8),U("change",function(n){T(A);let o=p();return J(o.flags.enableAffectiveDialog=n.checked)}),y(8,"Affective Dialog"),Q()(),B(9,"div",7)(10,"mat-checkbox",8),U("change",function(n){T(A);let o=p();return J(o.flags.enableSessionResumption=n.checked)}),y(11,"Session Resumption"),Q()(),B(12,"div",7)(13,"mat-checkbox",8),U("change",function(n){T(A);let o=p();return J(o.flags.saveLiveBlob=n.checked)}),y(14,"Save Live Blob"),Q()()()}if(t&2){let A=p();u(4),H("checked",A.flags.proactiveAudio)("matTooltip",A.i18n.proactiveAudioTooltip),u(3),H("checked",A.flags.enableAffectiveDialog)("matTooltip",A.i18n.affectiveDialogTooltip),u(3),H("checked",A.flags.enableSessionResumption)("matTooltip",A.i18n.sessionResumptionTooltip),u(3),H("checked",A.flags.saveLiveBlob)("matTooltip",A.i18n.saveLiveBlobTooltip)}}var qy=class t{get inCall(){return this.isAudioRecording}isAudioRecording=!1;isVideoRecording=!1;micVolume=0;isBidiStreamingEnabled=!1;toggleAudioRecording=new LA;toggleVideoRecording=new LA;i18n=w(UI);showFlags=!1;flags={proactiveAudio:!1,enableAffectiveDialog:!1,enableSessionResumption:!1,saveLiveBlob:!1};onCallClick(){this.showFlags=!1,this.toggleAudioRecording.emit(this.flags)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-call-controls"]],hostVars:2,hostBindings:function(A,i){A&2&&RA("in-call",i.inCall)},inputs:{isAudioRecording:"isAudioRecording",isVideoRecording:"isVideoRecording",micVolume:"micVolume",isBidiStreamingEnabled:"isBidiStreamingEnabled"},outputs:{toggleAudioRecording:"toggleAudioRecording",toggleVideoRecording:"toggleVideoRecording"},decls:6,vars:6,consts:[[1,"call-btn-container",3,"mouseenter","mouseleave"],["mat-icon-button","",1,"audio-rec-btn",3,"click","disabled"],[1,"flags-panel"],["mat-icon-button","",1,"video-rec-btn",3,"click","matTooltip","disabled"],[1,"mic-visualizer"],[1,"bar"],[1,"flags-title"],[1,"flag-item"],["matTooltipPosition","left",3,"change","checked","matTooltip"]],template:function(A,i){A&1&&(O(0,QxA,8,12),B(1,"div",0),U("mouseenter",function(){return i.showFlags=!0})("mouseleave",function(){return i.showFlags=!1}),B(2,"button",1),U("click",function(){return i.onCallClick()}),B(3,"mat-icon"),y(4),Q()(),O(5,uxA,15,8,"div",2),Q()),A&2&&(Y(i.isAudioRecording?0:-1),u(2),RA("recording",i.isAudioRecording),H("disabled",!i.isBidiStreamingEnabled),u(2),lA(i.isAudioRecording?"call_end":"call"),u(),Y(i.showFlags&&!i.isAudioRecording?5:-1))},dependencies:[li,qi,ji,Tn,Wt,Fa,dn,AO,ec],styles:['[_nghost-%COMP%]{display:flex;align-items:center;gap:4px;border-radius:28px;transition:all .2s ease}.in-call[_nghost-%COMP%]{background-color:var(--mat-sys-surface-variant)}button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)!important}button.recording[_ngcontent-%COMP%]{background-color:var(--mat-sys-error)!important;color:var(--mat-sys-on-error, #ffffff)!important}button.audio-rec-btn[_ngcontent-%COMP%]:not(.recording){color:#34a853!important}.mic-visualizer[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;gap:3px;height:24px;margin-right:8px;width:24px}.mic-visualizer[_ngcontent-%COMP%] .bar[_ngcontent-%COMP%]{width:4px;background-color:#34a853;border-radius:2px;transition:height .1s ease-out}.call-btn-container[_ngcontent-%COMP%]{position:relative;display:inline-block}.flags-panel[_ngcontent-%COMP%]{position:absolute;bottom:100%;left:50%;transform:translate(-50%);margin-bottom:8px;background:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:12px;padding:12px;box-shadow:0 4px 20px #00000026;z-index:100;width:250px;display:flex;flex-direction:column;gap:8px;animation:_ngcontent-%COMP%_fadeIn .2s ease-out}.flags-panel[_ngcontent-%COMP%]:before{content:"";position:absolute;bottom:-8px;left:0;right:0;height:8px;background:transparent}.flags-panel[_ngcontent-%COMP%] .flags-title[_ngcontent-%COMP%]{font-weight:600;font-size:14px;color:var(--mat-sys-on-surface);margin-bottom:4px}.flags-panel[_ngcontent-%COMP%] .flag-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--mat-sys-on-surface-variant)}.flags-panel[_ngcontent-%COMP%] .flag-item[_ngcontent-%COMP%] .flag-label[_ngcontent-%COMP%]{font-weight:500}.flags-panel[_ngcontent-%COMP%] .flag-item[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{--mdc-checkbox-state-layer-size: 30px}@keyframes _ngcontent-%COMP%_fadeIn{0%{opacity:0;transform:translate(-50%) translateY(10px)}to{opacity:1;transform:translate(-50%) translateY(0)}}']})};var fxA=t=>({$implicit:t});function pxA(t,e){t&1&&hA(0,"div",9)}function mxA(t,e){if(t&1&&(B(0,"span",15),y(1),Q()),t&2){let A=p(2).$implicit,i=p();ut("right",100-i.getRelativeStart(A.span),"%"),u(),lA(i.formatDuration(A.span.end_time-A.span.start_time))}}function wxA(t,e){if(t&1){let A=QA();B(0,"div",6),U("click",function(){T(A);let n=p().$implicit,o=p();return J(o.selectRow(n))}),B(1,"div",7)(2,"div",8),Ue(3,pxA,1,0,"div",9,ws),Q(),B(5,"span",10),y(6),Q(),B(7,"div",11),y(8),Q()(),B(9,"div",12)(10,"div",13),y(11),Q(),O(12,mxA,2,3,"span",14),Q()()}if(t&2){let A=p().$implicit,i=p(),n=Qi(12);RA("selected",i.rowSelected(A)),H("id",NQ("trace-node-",A.span.span_id))("appHtmlTooltip",n)("appHtmlTooltipContext",Ks(19,fxA,i.getUiEvent(A)))("appHtmlTooltipDisabled",!i.getUiEvent(A)),u(3),Te(i.getArray(A.level)),u(2),RA("is-event-row",i.isEventRow(A)),u(),ue(" ",i.getSpanIcon(A.span.name)," "),u(),RA("is-event-row",i.isEventRow(A)),u(),ue(" ",i.formatSpanName(A.span.name)," "),u(2),ut("left",i.getRelativeStart(A.span),"%")("width",i.getRelativeWidth(A.span),"%"),u(),ue(" ",i.formatDuration(A.span.end_time-A.span.start_time)," "),u(),Y(i.getRelativeWidth(A.span)<10?12:-1)}}function DxA(t,e){if(t&1&&O(0,wxA,13,21,"div",5),t&2){let A=e.$implicit,i=p();Y(i.shouldShowNode(A)?0:-1)}}function yxA(t,e){if(t&1&&(B(0,"div",16),hA(1,"app-event-content",17),Q()),t&2){let A=p().$implicit;u(),H("uiEvent",A)("index",0)}}function vxA(t,e){if(t&1&&O(0,yxA,2,2,"div",16),t&2){let A=e.$implicit;Y(A?0:-1)}}var Vy=class t{spans=[];invocationId="";uiEvents=[];shouldShowEvent;tree=[];baseStartTimeMs=0;totalDurationMs=1;rootLatencyNanos=0;flatTree=[];shouldShowNode(e){let A=this.getUiEvent(e);return A&&this.shouldShowEvent?this.shouldShowEvent(A):!0}traceLabelIconMap=new Map([["Invocation","start"],["agent_run","robot"],["invoke_agent","robot_2"],["tool","build"],["execute_tool","build"],["call_llm","chat"]]);selectedRow=void 0;traceService=w(Ag);constructor(){}selectRootSpan(){if(this.tree&&this.tree.length>0){if(this.selectedRow&&this.selectedRow.span_id===this.tree[0].span_id)return;this.traceService.selectedRow(this.tree[0])}}isRootSpanSelected(){return!this.selectedRow||!this.tree||this.tree.length===0?!1:String(this.selectedRow.span_id)===String(this.tree[0].span_id)}ngOnInit(){this.rebuildTree(),this.traceService.selectedTraceRow$.subscribe(e=>{this.selectedRow=e,e&&setTimeout(()=>{let A=document.getElementById("trace-node-"+e.span_id);A&&A.scrollIntoView({behavior:"smooth",block:"nearest"})},50)})}ngOnChanges(e){e.spans&&!e.spans.isFirstChange()&&this.rebuildTree()}rebuildTree(){if(!this.spans||this.spans.length===0){this.tree=[],this.flatTree=[],this.rootLatencyNanos=0;return}this.tree=this.buildSpanTree(this.spans),this.flatTree=[],this.tree.forEach(A=>{A.children&&this.flatTree.push(...this.flattenTree(A.children,0))});let e=this.getGlobalTimes(this.spans);this.baseStartTimeMs=e.start,this.totalDurationMs=e.duration,this.tree&&this.tree.length>0?this.rootLatencyNanos=this.tree[0].end_time-this.tree[0].start_time:this.rootLatencyNanos=0}buildSpanTree(e){let A=e.map(o=>gA({},o)),i=new Map,n=[];return A.forEach(o=>i.set(o.span_id,o)),A.forEach(o=>{if(o.parent_span_id&&i.has(o.parent_span_id)){let a=i.get(o.parent_span_id);a.children=a.children||[],a.children.push(o)}else n.push(o)}),n}getGlobalTimes(e){let A=Math.min(...e.map(n=>this.toMs(n.start_time))),i=Math.max(...e.map(n=>this.toMs(n.end_time)));return{start:A,duration:i-A}}toMs(e){return e/1e6}formatDuration(e){if(e===0)return"0us";if(e<1e3)return`${e}ns`;if(e<1e6)return`${(e/1e3).toFixed(2)}us`;if(e<1e9)return`${(e/1e6).toFixed(2)}ms`;if(e<6e10)return`${(e/1e9).toFixed(2)}s`;let A=Math.floor(e/6e10),i=(e%6e10/1e9).toFixed(2);return`${A}m ${i}s`}getRelativeStart(e){return(this.toMs(e.start_time)-this.baseStartTimeMs)/this.totalDurationMs*100}getRelativeWidth(e){return(this.toMs(e.end_time)-this.toMs(e.start_time))/this.totalDurationMs*100}flattenTree(e,A=0){return e.flatMap(n=>[{span:n,level:A},...n.children?this.flattenTree(n.children,A+1):[]])}getSpanIcon(e){for(let[A,i]of this.traceLabelIconMap.entries())if(e.startsWith(A))return i;return"start"}formatSpanName(e){return e.startsWith("invoke_agent ")||e.startsWith("execute_tool ")?e.substring(13):e.startsWith("invoke_node ")?e.substring(12):e}getArray(e){return Array.from({length:e})}selectRow(e){this.selectedRow&&this.selectedRow.span_id==e.span.span_id||this.traceService.selectedRow(e.span)}rowSelected(e){return!this.selectedRow||!e?.span?!1:String(this.selectedRow.span_id)===String(e.span.span_id)}isEventRow(e){if(!e.span.attributes)return!1;let A=e?.span.attributes["gcp.vertex.agent.event_id"];return A&&this.uiEvents&&this.uiEvents.length>0?this.uiEvents.some(i=>i.event?.id===A):!1}getEventId(e){return e?.span?.attributes?.["gcp.vertex.agent.event_id"]??""}getUiEvent(e){let A=this.getEventId(e);return A&&this.uiEvents&&this.uiEvents.length>0&&this.uiEvents.find(i=>i.event?.id===A)||null}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-trace-tree"]],inputs:{spans:"spans",invocationId:"invocationId",uiEvents:"uiEvents",shouldShowEvent:"shouldShowEvent"},features:[Yt],decls:13,vars:6,consts:[["eventTooltip",""],[1,"invocation-id-container",3,"click"],[1,"invocation-id",3,"matTooltip"],[1,"total-latency"],[1,"trace-container"],[1,"trace-row",3,"selected","id","appHtmlTooltip","appHtmlTooltipContext","appHtmlTooltipDisabled"],[1,"trace-row",3,"click","id","appHtmlTooltip","appHtmlTooltipContext","appHtmlTooltipDisabled"],[1,"trace-row-left"],[1,"trace-indent"],[1,"indent-connector"],[1,"material-symbols-outlined",2,"margin-right","8px"],[1,"trace-label"],[1,"trace-bar-container"],[1,"trace-bar"],[1,"short-trace-bar-duration",3,"right"],[1,"short-trace-bar-duration"],[1,"event-tooltip-container"],[3,"uiEvent","index"]],template:function(A,i){A&1&&(B(0,"div")(1,"div",1),U("click",function(){return i.selectRootSpan()}),B(2,"span"),y(3,"Invocation ID: "),Q(),B(4,"div",2),y(5),Q(),B(6,"span",3),y(7),Q()(),B(8,"div",4),Ue(9,DxA,1,1,null,null,ri),Q()(),Et(11,vxA,1,1,"ng-template",null,0,$C)),A&2&&(u(),RA("selected",i.isRootSpanSelected()),te("id",i.tree&&i.tree.length>0?"trace-node-"+i.tree[0].span_id:null),u(3),H("matTooltip",i.invocationId),u(),lA(i.invocationId),u(2),ue("Total latency: ",i.formatDuration(i.rootLatencyNanos)),u(2),Te(i.flatTree))},dependencies:[qi,Tn,Fa,dn,Fy,EQ],styles:[".trace-container[_ngcontent-%COMP%]{white-space:nowrap;font-size:12px;overflow-x:auto;padding:8px}.trace-label[_ngcontent-%COMP%]{color:var(--trace-label-color, #e3e3e3);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;font-size:12px}.trace-bar-container[_ngcontent-%COMP%]{position:relative;height:18px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:var(--mat-sys-primary);border-radius:4px;padding-left:6px;box-sizing:border-box;overflow:hidden;font-size:11px;line-height:18px;color:var(--mat-sys-on-primary);font-family:Google Sans;transition:background-color .2s,color .2s}.trace-duration[_ngcontent-%COMP%]{color:var(--trace-duration-color, #888);font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;position:relative;height:32px}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:#ccc}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:#ccc}.trace-label[_ngcontent-%COMP%]{flex:1;min-width:0;font-size:13px}.trace-bar-container[_ngcontent-%COMP%]{flex:1;min-width:0}.short-trace-bar-duration[_ngcontent-%COMP%]{position:absolute;color:var(--trace-tree-short-trace-bar-duration-color);padding-right:6px}.trace-row[_ngcontent-%COMP%]{align-items:center;cursor:pointer;scroll-margin-top:40px}.trace-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant, rgba(0, 0, 0, .04))}.trace-row.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))}.trace-row-left[_ngcontent-%COMP%]{display:flex;min-width:250px;width:20%;max-width:350px}.invocation-id-container[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:11px;font-weight:600;letter-spacing:.3px;margin-bottom:6px;padding:8px 12px;border-radius:12px 12px 0 0;background-color:var(--mat-sys-surface);display:flex;width:100%;box-sizing:border-box;align-items:center;position:sticky;top:-20px;z-index:10;box-shadow:0 2px 4px #0000000d;cursor:pointer}.invocation-id-container[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant)}.invocation-id-container.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))}.invocation-id-container[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:first-child{opacity:.8;margin-right:6px;text-transform:uppercase}.invocation-id[_ngcontent-%COMP%]{font-family:Google Sans Mono,Roboto Mono,monospace;padding:2px 6px;border-radius:4px;color:var(--mat-sys-on-surface)}.total-latency[_ngcontent-%COMP%]{margin-left:auto;background:transparent;color:var(--mat-sys-on-surface);padding:2px 8px;font-size:11px;font-weight:600;letter-spacing:.2px}.trace-row-left[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .trace-row-left[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-span-div-color)}.trace-row-left[_ngcontent-%COMP%] .is-event-row[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-is-event-row-color)}.event-tooltip-container[_ngcontent-%COMP%]{max-width:800px;max-height:200px;overflow:auto;padding:8px;background:var(--mat-sys-surface-container-low, #202124);color:var(--mat-sys-on-surface, #e8eaed);border-radius:8px;box-shadow:0 4px 16px #00000080;border:1px solid var(--mat-sys-outline-variant, rgba(255, 255, 255, .1))}.event-tooltip-container[_ngcontent-%COMP%] app-content-bubble{max-height:160px;overflow-y:auto;display:block}"]})};var bxA=["videoContainer"],MxA=["autoScroll"],SxA=["messageTextarea"],kxA=t=>({text:t,thought:!1}),xxA=()=>[],_xA=(t,e)=>e.metricName;function RxA(t,e){t&1&&(B(0,"span",14),y(1,"PASS"),Q())}function NxA(t,e){t&1&&(B(0,"span",15),y(1,"FAIL"),Q())}function FxA(t,e){if(t&1&&(B(0,"span",21),y(1),Q()),t&2){let A=e.$implicit;ut("color",A.evalStatus==1?"var(--app-color-success)":"var(--app-color-error)"),u(),ba(" ",A.metricName,": ",A.score," ")}}function LxA(t,e){if(t&1&&(B(0,"div")(1,"span",17),y(2,"Metrics"),Q(),B(3,"div",19),Ue(4,FxA,2,4,"span",20,_xA),Q()()),t&2){p();let A=zn(0);u(4),Te(A.overallEvalMetricResults)}}function GxA(t,e){if(t&1&&(ta(0),B(1,"div",8)(2,"div",11)(3,"h3",12),y(4,"Evaluation Result"),Q(),B(5,"div",13),O(6,RxA,2,0,"span",14)(7,NxA,2,0,"span",15),Q()(),B(8,"div",16)(9,"div")(10,"span",17),y(11,"Case ID"),Q(),B(12,"div",18),y(13),Q()(),B(14,"div")(15,"span",17),y(16,"Set ID"),Q(),B(17,"div",18),y(18),Q()(),O(19,LxA,6,0,"div"),Q()()),t&2){let A=ga(p(2).evalCaseResult());u(6),Y(A.finalEvalStatus==1?6:7),u(7),lA(A.evalId),u(5),lA(A.setId),u(),Y(A.overallEvalMetricResults!=null&&A.overallEvalMetricResults.length?19:-1)}}function KxA(t,e){if(t&1&&(B(0,"div",9),sn(1,22),Q()),t&2){let A=p(2);u(),H("ngComponentOutlet",A.markdownComponent)("ngComponentOutletInputs",Ks(2,kxA,A.agentReadme))}}function UxA(t,e){if(t&1&&(B(0,"div",25),hA(1,"app-trace-tree",26),Q()),t&2){let A=p().$implicit,i=p(2);ut("display",i.viewMode==="traces"?"":"none"),u(),H("spans",i.spansByInvocationId.get(A.event.id)||i.spansByInvocationId.get(A.event.invocationId)||Kc(6,xxA))("invocationId",A.event.invocationId||A.event.id||"")("uiEvents",i.uiEvents)("shouldShowEvent",i.shouldShowEvent)}}function TxA(t,e){if(t&1){let A=QA();B(0,"app-event-row",23),U("rowClick",function(n){T(A);let o=p(2);return J(o.handleRowClick(n.event,n.uiEvent,n.index))})("handleKeydown",function(n){T(A);let o=p(2);return J(o.handleKeydown.emit(n))})("cancelEditMessage",function(n){T(A);let o=p(2);return J(o.cancelEditMessage.emit(n))})("saveEditMessage",function(n){T(A);let o=p(2);return J(o.saveEditMessage.emit(n))})("userEditEvalCaseMessageChange",function(n){T(A);let o=p(2);return J(o.userEditEvalCaseMessageChange.emit(n))})("openViewImageDialog",function(n){T(A);let o=p(2);return J(o.openViewImageDialog.emit(n))})("openBase64InNewTab",function(n){T(A);let o=p(2);return J(o.openBase64InNewTab.emit(n))})("editEvalCaseMessage",function(n){T(A);let o=p(2);return J(o.editEvalCaseMessage.emit(n))})("deleteEvalCaseMessage",function(n){T(A);let o=p(2);return J(o.deleteEvalCaseMessage.emit(n))})("editFunctionArgs",function(n){T(A);let o=p(2);return J(o.editFunctionArgs.emit(n))})("clickEvent",function(n){T(A);let o=p(2);return J(o.clickEvent.emit(n))})("longRunningResponseComplete",function(n){T(A);let o=p(2);return J(o.longRunningResponseComplete.emit(n))})("agentStateClick",function(n){T(A);let o=p(2);return J(o.handleAgentStateClick(n.event,n.index))}),Q(),O(1,UxA,2,7,"div",24)}if(t&2){let A=e.$implicit,i=e.$index,n=p(2),o=n.shouldShowEvent?n.shouldShowEvent(A):!0;ut("display",n.viewMode==="events"&&o||n.viewMode==="traces"&&A.role==="user"&&o?"":"none"),H("isSelectable",n.viewMode!=="traces")("uiEvent",A)("index",i)("uiEvents",n.uiEvents)("isSelected",n.isMessageEventSelected(i))("appName",n.appName)("userId",n.userId)("sessionId",n.sessionId)("sessionName",n.sessionName())("evalCase",n.evalCase)("isEvalEditMode",n.isEvalEditMode)("isEvalCaseEditing",n.isEvalCaseEditing)("isEditFunctionArgsEnabled",n.isEditFunctionArgsEnabled)("userEditEvalCaseMessage",n.userEditEvalCaseMessage)("agentGraphData",n.agentGraphData)("allWorkflowNodes",n.getAllWorkflowNodes(i))("isUserFeedbackEnabled",n.isUserFeedbackEnabled()??!1)("isLoadingAgentResponse",n.isLoadingAgentResponse()??!1),u(),Y(A.role==="bot"&&n.isFirstEventForInvocation(A,i)?1:-1)}}function JxA(t,e){t&1&&(B(0,"div",10),hA(1,"mat-progress-bar",27),Q())}function OxA(t,e){if(t&1){let A=QA();B(0,"div",7,0),U("scroll",function(n){T(A);let o=p();return J(o.onScroll.next(n))}),O(2,GxA,20,5,"div",8),O(3,KxA,2,4,"div",9),Ue(4,TxA,2,21,null,null,ri),O(6,JxA,2,0,"div",10),Q()}if(t&2){let A=p();u(2),Y(A.showEvalSummary()&&A.evalCaseResult()?2:-1),u(),Y(A.uiEvents.length===0&&A.agentReadme?3:-1),u(),Te(A.uiEvents),u(2),Y(A.isLoadingAgentResponse()?6:-1)}}function YxA(t,e){if(t&1){let A=QA();B(0,"div",45),hA(1,"img",46),B(2,"button",47),U("click",function(){T(A);let n=p().$index,o=p(4);return J(o.removeFile.emit(n))}),B(3,"mat-icon",48),y(4,"close"),Q()()()}if(t&2){let A=p().$implicit;u(),H("src",A.url,Go)}}function HxA(t,e){if(t&1){let A=QA();B(0,"div",44)(1,"button",47),U("click",function(){T(A);let n=p().$index,o=p(4);return J(o.removeFile.emit(n))}),B(2,"mat-icon",48),y(3,"close"),Q()(),B(4,"div",49)(5,"mat-icon"),y(6,"insert_drive_file"),Q(),B(7,"span"),y(8),Q()()()}if(t&2){let A=p().$implicit;u(8),lA(A.file.name)}}function zxA(t,e){if(t&1&&(B(0,"div"),O(1,YxA,5,1,"div",45)(2,HxA,9,1,"div",44),Q()),t&2){let A=e.$implicit;u(),Y(A.file.type.startsWith("image/")?1:A.file.type.startsWith("image/")?-1:2)}}function PxA(t,e){if(t&1){let A=QA();B(0,"div",44)(1,"button",47),U("click",function(){T(A);let n=p(4);return J(n.removeStateUpdate.emit())}),B(2,"mat-icon",48),y(3,"close"),Q()(),B(4,"div",49)(5,"span"),y(6),Q()()()}if(t&2){let A=p(4);u(6),lA(A.i18n.updatedSessionStateChipLabel)}}function jxA(t,e){if(t&1&&(B(0,"div",33),Ue(1,zxA,3,1,"div",null,ri),O(3,PxA,7,1,"div",44),Q()),t&2){let A=p(3);u(),Te(A.selectedFiles),u(2),Y(A.updatedSessionState?3:-1)}}function qxA(t,e){if(t&1){let A=QA();B(0,"div",29)(1,"input",30,1),U("change",function(n){T(A);let o=p(2);return J(o.fileSelect.emit(n))}),Q(),B(3,"div",31)(4,"mat-form-field",32),O(5,jxA,4,1,"div",33),B(6,"textarea",34,2),U("ngModelChange",function(n){T(A);let o=p(2);return J(o.userInputChange.emit(n))})("keydown.enter",function(n){T(A);let o=p(2);return J(o.sendMessage.emit(n))}),Q(),B(8,"button",35),U("click",function(n){T(A);let o=p(2);return J(o.sendMessage.emit(n))}),B(9,"mat-icon"),y(10,"send"),Q()()(),hA(11,"div",36,3),Q(),B(13,"div",37)(14,"div",38)(15,"button",39),Ht(16,"async"),U("click",function(){T(A);let n=Qi(2);return J(n.click())}),B(17,"mat-icon"),y(18,"attach_file"),Q()(),B(19,"button",40),Ht(20,"async"),B(21,"mat-icon"),y(22,"more_vert"),Q()(),B(23,"mat-menu",null,4)(25,"span",41),U("click",function(){T(A);let n=p(2);return J(n.updateState.emit())}),y(26),Q()()(),B(27,"div",42)(28,"app-call-controls",43),Ht(29,"async"),U("toggleAudioRecording",function(n){T(A);let o=p(2);return J(o.toggleAudioRecording.emit(n))})("toggleVideoRecording",function(){T(A);let n=p(2);return J(n.toggleVideoRecording.emit())}),Q()()()()}if(t&2){let A=Qi(24),i=p(2);RA("video-streaming",i.isVideoRecording),u(5),Y(i.selectedFiles.length&&i.appName!=""||i.updatedSessionState?5:-1),u(),H("ngModel",i.userInput)("placeholder",i.i18n.typeMessagePlaceholder),u(2),H("matTooltip",i.i18n.sendMessageTooltip),u(3),RA("visible",i.isVideoRecording),u(4),H("matTooltip",i.i18n.uploadFileTooltip)("disabled",!si(16,19,i.isMessageFileUploadEnabledObs)),u(4),H("matMenuTriggerFor",A)("matTooltip",i.i18n.moreOptionsTooltip)("disabled",!si(20,21,i.isManualStateUpdateEnabledObs)),u(6),H("matTooltip",i.i18n.updateStateMenuTooltip),u(),ue(" ",i.i18n.updateStateMenuLabel," "),u(2),H("isAudioRecording",i.isAudioRecording)("isVideoRecording",i.isVideoRecording)("micVolume",i.micVolume)("isBidiStreamingEnabled",si(29,23,i.isBidiStreamingEnabledObs)??!1)}}function VxA(t,e){if(t&1&&O(0,qxA,30,25,"div",28),t&2){let A=p();Y(A.canEditSession()?0:-1)}}function WxA(t,e){t&1&&(B(0,"div",6),hA(1,"mat-progress-spinner",50),Q())}var hQ=class t{appName="";agentReadme="";sessionName=me("");uiEvents=[];traceData=[];isChatMode=!0;evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;agentGraphData=null;isEditFunctionArgsEnabled=!1;isTokenStreamingEnabled=!1;useSse=!1;userInput="";userEditEvalCaseMessage="";selectedFiles=[];updatedSessionState=null;selectedMessageIndex=void 0;isAudioRecording=!1;micVolume=0;isVideoRecording=!1;userId="";sessionId="";viewMode="events";shouldShowEvent;spansByInvocationId=new Map;eventsScrollTop=-1;tracesScrollTop=-1;userInputChange=new LA;userEditEvalCaseMessageChange=new LA;clickEvent=new LA;handleKeydown=new LA;cancelEditMessage=new LA;saveEditMessage=new LA;openViewImageDialog=new LA;openBase64InNewTab=new LA;editEvalCaseMessage=new LA;deleteEvalCaseMessage=new LA;editFunctionArgs=new LA;fileSelect=new LA;removeFile=new LA;removeStateUpdate=new LA;sendMessage=new LA;updateState=new LA;toggleAudioRecording=new LA;toggleVideoRecording=new LA;longRunningResponseComplete=new LA;toggleHideIntermediateEvents=new LA;toggleSse=new LA;videoContainer;scrollContainer;textarea;scrollInterrupted=!1;scrollHeight=0;lastMessageRef=null;nextPageToken="";scrollTimeout=null;mutationObserver=null;i18n=w(UI);uiStateService=w(tg);themeService=w(eg);stringToColorService=w(Q2);markdownComponent=w(_I);featureFlagService=w(yr);agentService=w($s);sessionService=w(Al);destroyRef=w(sr);MediaType=aC;JSON=JSON;Object=Object;String=String;isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled();canEditSession=bA(!0);isUserFeedbackEnabled=Ar(this.featureFlagService.isFeedbackServiceEnabled());isLoadingAgentResponse=Ar(this.agentService.getLoadingState());hideMoreOptionsButton=Ar(this.featureFlagService.isMoreOptionsButtonHidden());onScroll=new ie;sanitizer=w(Cs);hideIntermediateEvents=me(!1);invocationDisplayMap=me(new Map);evalCaseResult=me(null);showEvalSummary=me(!1);constructor(){Ao(()=>{let e=this.sessionName();e&&(this.nextPageToken="",this.featureFlagService.isInfinityMessageScrollingEnabled().pipe($n(),gt(A=>A)).subscribe(()=>{this.uiStateService.lazyLoadMessages(e,{pageSize:100,pageToken:this.nextPageToken}).pipe($n()).subscribe()}))})}ngOnInit(){this.uiStateService.isSessionLoading().pipe(wr(this.destroyRef)).subscribe(e=>{e||this.focusInput()}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe($n(),gt(e=>e),hi(()=>Ki(this.uiStateService.onNewMessagesLoaded().pipe(di(e=>{this.nextPageToken=e.nextPageToken??"",e.isBackground||this.restoreScrollPosition()})),this.onScroll.pipe(hi(e=>{let A=e.target;return A.scrollTop!==0?ar:this.nextPageToken?(this.scrollHeight=A.scrollHeight,this.uiStateService.lazyLoadMessages(this.sessionName(),{pageSize:100,pageToken:this.nextPageToken}).pipe($n(),Po(()=>_F))):ar})))),wr(this.destroyRef)).subscribe()}ngAfterViewInit(){if(this.scrollContainer?.nativeElement){let e=this.scrollContainer.nativeElement;e.addEventListener("scroll",()=>{let A=Math.abs(e.scrollHeight-e.scrollTop-e.clientHeight)<50;this.scrollInterrupted=!A}),this.mutationObserver=new MutationObserver(()=>{this.scrollInterrupted||this.scrollToBottom()}),this.mutationObserver.observe(e,{childList:!0,subtree:!0,characterData:!0}),this.destroyRef.onDestroy(()=>{this.mutationObserver?.disconnect()})}}ngOnChanges(e){if(e.viewMode){let A=e.viewMode.previousValue,i=e.viewMode.currentValue;this.scrollContainer?.nativeElement&&(A==="events"?this.eventsScrollTop=this.scrollContainer.nativeElement.scrollTop:A==="traces"&&(this.tracesScrollTop=this.scrollContainer.nativeElement.scrollTop)),setTimeout(()=>{this.scrollContainer?.nativeElement&&(i==="events"&&this.eventsScrollTop!==-1?this.scrollContainer.nativeElement.scrollTop=this.eventsScrollTop:i==="traces"&&this.tracesScrollTop!==-1?this.scrollContainer.nativeElement.scrollTop=this.tracesScrollTop:this.scrollToBottom())})}if(e.appName&&this.focusInput(),(e.appName||e.uiEvents)&&this.uiEvents.length===0&&this.agentReadme&&setTimeout(()=>this.scrollToTop(),0),e.uiEvents){let A=this.uiEvents[this.uiEvents.length-1];A!==this.lastMessageRef&&((A?.role==="user"||A?.isLoading===!0)&&(this.scrollInterrupted=!1),this.scrollToBottom()),this.lastMessageRef=A}e.traceData&&this.traceData&&this.rebuildTrace()}rebuildTrace(){let e=this.traceData.reduce((A,i)=>{let n=i.trace_id,o=A.get(n);return o?(o.push(i),o.sort((a,r)=>a.start_time-r.start_time)):A.set(n,[i]),A},new Map);this.spansByInvocationId=new Map;for(let[A,i]of e){let n=i.find(o=>o.attributes!==void 0&&"gcp.vertex.agent.invocation_id"in o.attributes)?.attributes["gcp.vertex.agent.invocation_id"];if(!n){let o=i.find(a=>a.attributes!==void 0&&"gcp.vertex.agent.associated_event_ids"in a.attributes)?.attributes["gcp.vertex.agent.associated_event_ids"];o&&o.length>0&&(n=o[0])}n||(n=A),n&&this.spansByInvocationId.set(n,i)}}isFirstEventForInvocation(e,A){let i=e.event?.invocationId||e.event?.id;if(!i)return!1;for(let n=A-1;n>=0;n--){let o=this.uiEvents[n],a=o.event?.invocationId||o.event?.id;if(o.role==="bot"&&a===i)return!1}return!0}scrollToBottom(){this.sessionId&&(this.scrollInterrupted||(this.scrollTimeout&&clearTimeout(this.scrollTimeout),this.scrollTimeout=setTimeout(()=>{this.scrollContainer?.nativeElement.scrollTo({top:this.scrollContainer.nativeElement.scrollHeight,behavior:"auto"}),this.scrollTimeout=null},50)))}scrollToTop(){setTimeout(()=>{this.scrollContainer?.nativeElement.scrollTo({top:0,behavior:"smooth"})},50)}focusInput(){setTimeout(()=>{this.textarea?.nativeElement?.focus()},50)}isMessageEventSelected(e){return e===this.selectedMessageIndex}restoreScrollPosition(){if(!this.scrollHeight){this.scrollInterrupted=!1,this.scrollToBottom();return}let e=this.scrollContainer?.nativeElement;e&&(e.scrollTop=e.scrollHeight-this.scrollHeight,this.scrollHeight=0)}getAllWorkflowNodes(e){let A={};for(let i=0;i<=e;i++){let o=this.uiEvents[i].event,a=o?.actions?.agentState?.nodes,r=o?.nodeInfo?.path;a&&r&&(A[r]||(A[r]={}),Object.assign(A[r],a))}return Object.keys(A).length>0?A:null}handleAgentStateClick(e,A){e.stopPropagation(),A===this.selectedMessageIndex||this.clickEvent.emit(A)}handleRowClick(e,A,i){let n=window.getSelection();n&&n.toString().length>0||this.clickEvent.emit(i)}handleKeyboardNavigation(e){if(this.selectedMessageIndex===void 0)return;let A=document.activeElement;if(A&&(A.tagName==="INPUT"||A.tagName==="TEXTAREA"||A.isContentEditable)||e.key!=="ArrowUp"&&e.key!=="ArrowDown")return;e.preventDefault();let i;e.key==="ArrowDown"?i=this.selectedMessageIndex+1>=this.uiEvents.length?0:this.selectedMessageIndex+1:i=this.selectedMessageIndex-1<0?this.uiEvents.length-1:this.selectedMessageIndex-1,this.clickEvent.emit(i),this.scrollToSelectedMessage(i)}scrollToSelectedMessage(e){let A=e!==void 0?e:this.selectedMessageIndex;A!==void 0&&setTimeout(()=>{if(!this.scrollContainer?.nativeElement)return;let i=this.scrollContainer.nativeElement.querySelectorAll(".message-row-container");i&&i[A]&&i[A].scrollIntoView({behavior:"smooth",block:"nearest",inline:"nearest"})},50)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-chat-panel"]],viewQuery:function(A,i){if(A&1&&Jt(bxA,5,ce)(MxA,5)(SxA,5),A&2){let n;ae(n=re())&&(i.videoContainer=n.first),ae(n=re())&&(i.scrollContainer=n.first),ae(n=re())&&(i.textarea=n.first)}},hostBindings:function(A,i){A&1&&U("keydown",function(o){return i.handleKeyboardNavigation(o)},ZC)},inputs:{appName:"appName",agentReadme:"agentReadme",sessionName:[1,"sessionName"],uiEvents:"uiEvents",traceData:"traceData",isChatMode:"isChatMode",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",agentGraphData:"agentGraphData",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",isTokenStreamingEnabled:"isTokenStreamingEnabled",useSse:"useSse",userInput:"userInput",userEditEvalCaseMessage:"userEditEvalCaseMessage",selectedFiles:"selectedFiles",updatedSessionState:"updatedSessionState",selectedMessageIndex:"selectedMessageIndex",isAudioRecording:"isAudioRecording",micVolume:"micVolume",isVideoRecording:"isVideoRecording",userId:"userId",sessionId:"sessionId",viewMode:"viewMode",shouldShowEvent:"shouldShowEvent",hideIntermediateEvents:[1,"hideIntermediateEvents"],invocationDisplayMap:[1,"invocationDisplayMap"],evalCaseResult:[1,"evalCaseResult"],showEvalSummary:[1,"showEvalSummary"]},outputs:{userInputChange:"userInputChange",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",clickEvent:"clickEvent",handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",fileSelect:"fileSelect",removeFile:"removeFile",removeStateUpdate:"removeStateUpdate",sendMessage:"sendMessage",updateState:"updateState",toggleAudioRecording:"toggleAudioRecording",toggleVideoRecording:"toggleVideoRecording",longRunningResponseComplete:"longRunningResponseComplete",toggleHideIntermediateEvents:"toggleHideIntermediateEvents",toggleSse:"toggleSse"},features:[Yt],decls:5,vars:5,consts:[["autoScroll",""],["fileInput",""],["messageTextarea",""],["videoContainer",""],["moreMenu","matMenu"],[1,"chat-messages"],[1,"loading-spinner-container"],[1,"chat-messages",3,"scroll"],[1,"eval-result-summary",2,"margin","16px","padding","16px","border-radius","8px","background","var(--mat-sys-surface-container)","border","1px solid var(--mat-sys-outline-variant)"],[1,"readme-content"],[1,"agent-loading-indicator"],[2,"display","flex","justify-content","space-between","align-items","center"],[2,"margin","0","color","var(--mat-sys-primary)"],[1,"status-card__summary"],[1,"status-card__passed",2,"font-size","16px","font-weight","600","font-family","monospace"],[1,"status-card__failed",2,"font-size","16px","font-weight","600","font-family","monospace"],[2,"margin-top","12px","display","flex","gap","24px"],[2,"color","var(--mat-sys-on-surface-variant)","font-size","13px"],[2,"font-weight","500"],[2,"display","flex","gap","8px","margin-top","4px"],[2,"font-size","13px","font-weight","500",3,"color"],[2,"font-size","13px","font-weight","500"],[3,"ngComponentOutlet","ngComponentOutletInputs"],[3,"rowClick","handleKeydown","cancelEditMessage","saveEditMessage","userEditEvalCaseMessageChange","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","clickEvent","longRunningResponseComplete","agentStateClick","isSelectable","uiEvent","index","uiEvents","isSelected","appName","userId","sessionId","sessionName","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userEditEvalCaseMessage","agentGraphData","allWorkflowNodes","isUserFeedbackEnabled","isLoadingAgentResponse"],[1,"trace-tree-container",3,"display"],[1,"trace-tree-container"],[3,"spans","invocationId","uiEvents","shouldShowEvent"],["mode","indeterminate"],[1,"chat-input",3,"video-streaming"],[1,"chat-input"],["type","file","multiple","","hidden","",3,"change"],[1,"chat-input-content-row"],["appearance","outline","subscriptSizing","dynamic",1,"input-field"],[1,"file-preview"],["matInput","","cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","10",1,"chat-input-box",3,"ngModelChange","keydown.enter","ngModel","placeholder"],["mat-icon-button","","matSuffix","",1,"send-message-btn",3,"click","matTooltip"],[1,"video-container"],[1,"chat-input-actions"],[1,"chat-input-actions-left"],["mat-icon-button","",1,"chat-action-button",3,"click","matTooltip","disabled"],["mat-icon-button","",1,"chat-action-button",3,"matMenuTriggerFor","matTooltip","disabled"],["mat-menu-item","",3,"click","matTooltip"],[1,"chat-input-actions-right"],[3,"toggleAudioRecording","toggleVideoRecording","isAudioRecording","isVideoRecording","micVolume","isBidiStreamingEnabled"],[1,"file-container"],[1,"image-container"],["alt","preview",1,"image-preview",3,"src"],["mat-icon-button","",1,"delete-button",3,"click"],["color","warn"],[1,"file-info"],["mode","indeterminate","diameter","50"]],template:function(A,i){if(A&1&&(ta(0),Ht(1,"async"),O(2,OxA,7,3,"div",5),O(3,VxA,1,1),O(4,WxA,2,0,"div",6)),A&2){let n=si(1,3,i.uiStateService.isSessionLoading());u(2),Y(i.appName!=""&&!n?2:-1),u(),Y(i.appName!=""&&i.isChatMode&&!n?3:-1),u(),Y(n?4:-1)}},dependencies:[li,Tc,ln,Dn,yn,ko,Tn,Wt,CT,IQ,CQ,qi,ji,Ps,ua,Ko,Tb,_p,lB,Ya,LB,Zs,Ml,$c,E2,gs,MtA,cs,Fa,dn,BT,$0,jy,qy,Vy,os],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%}.generated-image-container[_ngcontent-%COMP%]{max-width:400px;margin-left:20px}.generated-image[_ngcontent-%COMP%]{max-width:100%;min-width:40px;border-radius:8px}.html-artifact-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:flex-start;align-items:center}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;position:relative}.chat-sub-toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 20px;background-color:var(--mat-sys-surface-container);border-bottom:1px solid var(--mat-sys-outline-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{border-radius:16px;height:28px;align-items:center}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] .mat-button-toggle-label-content{line-height:28px;padding:0 12px;font-size:13px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-bar-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;background-color:transparent;border:none;margin-left:16px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;height:28px;cursor:pointer;transition:background-color .2s ease}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-label[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;color:var(--mat-sys-on-surface-variant);padding:0;margin-left:4px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:transparent;border:1px dashed var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;font-weight:500;height:28px;cursor:pointer;transition:all .2s ease;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant);border-color:var(--mat-sys-outline);color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;margin-right:4px} .filter-panel{min-width:max-content!important;max-width:50vw} .filter-panel .mat-mdc-menu-item{min-height:32px!important;font-size:12px!important} .filter-panel .mat-mdc-menu-item .mat-mdc-menu-item-text, .filter-panel .mat-mdc-menu-item .mdc-list-item__primary-text{font-size:12px!important;line-height:normal}.trace-tree-container[_ngcontent-%COMP%]{margin:12px 48px 12px 12px;border-radius:12px;border:none;background:var(--mat-sys-surface-container-lowest, #fff);box-shadow:0 4px 20px #0000000d,0 1px 3px #0000000a}.chat-input[_ngcontent-%COMP%]{display:flex;flex-direction:column;padding:10px;width:min(960px,88%);margin:0 auto;position:relative;transition:all .3s ease}.chat-input[_ngcontent-%COMP%] .chat-input-content-row[_ngcontent-%COMP%]{display:flex;gap:16px;align-items:flex-end;width:100%}.video-container[_ngcontent-%COMP%]{display:none;border-radius:12px;overflow:hidden;background:var(--mat-sys-surface-variant);border:1px solid var(--mat-sys-outline-variant);width:200px}.video-container.visible[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;flex-shrink:0;box-shadow:0 8px 24px #00000026}.video-container[_ngcontent-%COMP%] video{width:100%!important;height:auto!important;max-height:280px;object-fit:cover;border-radius:12px;transform:scaleX(-1)}.input-field[_ngcontent-%COMP%]{flex-grow:1;position:relative}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);border:none;box-sizing:content-box;caret-color:var(--mat-sys-primary)}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]::placeholder{color:var(--mat-sys-on-surface-variant)}.input-field[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--mat-sys-primary)!important}.chat-input-actions[_ngcontent-%COMP%]{width:100%;margin-top:10px;display:flex;justify-content:space-between;align-items:center}.chat-input-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant)!important}.chat-input-actions[_ngcontent-%COMP%] button.recording[_ngcontent-%COMP%]{background-color:var(--mat-sys-error)!important;color:var(--mat-sys-on-error, #ffffff)!important}.chat-input-actions-left[_ngcontent-%COMP%], .chat-input-actions-right[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.image-container[_ngcontent-%COMP%]{position:relative;display:inline-block;border-radius:12px;overflow:hidden}.image-preview[_ngcontent-%COMP%]{display:block;width:100%;height:auto;border-radius:12px;width:80px;height:80px}.delete-button[_ngcontent-%COMP%]{position:absolute;top:1px;right:1px;border:none;border-radius:50%;padding:8px;cursor:pointer;color:var(--mat-sys-error);display:flex;align-items:center;justify-content:center;scale:.7}.delete-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}.file-container[_ngcontent-%COMP%]{position:relative;display:flex;flex-direction:column;gap:8px;height:80px;border-radius:12px}.file-info[_ngcontent-%COMP%]{margin-right:60px;padding-top:20px;padding-left:16px}.chat-input-box[_ngcontent-%COMP%]{caret-color:#fff}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}.messages-loading-container[_ngcontent-%COMP%]{margin-top:1em;margin-bottom:1em}.agent-loading-indicator[_ngcontent-%COMP%]{margin-top:16px;margin-bottom:8px;padding:0 20px;width:240px}.readme-content[_ngcontent-%COMP%]{padding:0 20px;font-size:14px;line-height:1.8;color:var(--mat-sys-on-surface)}"]})};var ZxA={cancelButton:"Cancel",saveButton:"Save",invalidJsonAlert:"Invalid JSON: "},RtA=new kA("Edit Json Dialog Messages",{factory:()=>ZxA});var S3=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.jsonString=JSON.stringify(A.jsonContent,null,2),this.functionName=A.functionName||""}jsonEditorComponent=So(yc);jsonString="";functionName="";i18n=w(RtA);ngOnInit(){}onSave(){try{this.jsonString=this.jsonEditorComponent().getJsonString();let e=JSON.parse(this.jsonString);this.dialogRef.close(e)}catch(e){alert(this.i18n.invalidJsonAlert+e)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-edit-json-dialog"]],viewQuery:function(A,i){A&1&&ns(i.jsonEditorComponent,yc,5),A&2&&ur()},decls:11,vars:5,consts:[[1,"dialog-container"],["mat-dialog-title",""],[1,"editor"],[3,"jsonString"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(B(0,"div",0)(1,"h2",1),y(2),Q(),B(3,"mat-dialog-content",2),y(4),hA(5,"app-json-editor",3),Q(),B(6,"mat-dialog-actions",4)(7,"button",5),y(8),Q(),B(9,"button",6),U("click",function(){return i.onSave()}),y(10),Q()()()),A&2&&(u(2),lA(i.data.dialogHeader),u(2),ue(" ",i.functionName," "),u(),H("jsonString",i.jsonString),u(3),lA(i.i18n.cancelButton),u(2),lA(i.i18n.saveButton))},dependencies:[fa,Na,yc,pa,pi,B2],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:18px;width:500px;box-shadow:0 8px 16px var(--edit-json-dialog-container-box-shadow-color)}.editor[_ngcontent-%COMP%]{padding-top:12px;height:300px}"]})};var XxA=[[["caption"]],[["colgroup"],["col"]],"*"],$xA=["caption","colgroup, col","*"];function A_A(t,e){t&1&&Ve(0,2)}function e_A(t,e){t&1&&(B(0,"thead",0),sn(1,1),Q(),B(2,"tbody",0),sn(3,2)(4,3),Q(),B(5,"tfoot",0),sn(6,4),Q())}function t_A(t,e){t&1&&sn(0,1)(1,2)(2,3)(3,4)}var Sc=new kA("CDK_TABLE");var Xy=(()=>{class t{template=w(ao);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkCellDef",""]]})}return t})(),$y=(()=>{class t{template=w(ao);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkHeaderCellDef",""]]})}return t})(),LtA=(()=>{class t{template=w(ao);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkFooterCellDef",""]]})}return t})(),QQ=(()=>{class t{_table=w(Sc,{optional:!0});_hasStickyChanged=!1;get name(){return this._name}set name(A){this._setNameInput(A)}_name;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;get stickyEnd(){return this._stickyEnd}set stickyEnd(A){A!==this._stickyEnd&&(this._stickyEnd=A,this._hasStickyChanged=!0)}_stickyEnd=!1;cell;headerCell;footerCell;cssClassFriendlyName;_columnCssClassName;constructor(){}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}_updateColumnCssClassName(){this._columnCssClassName=[`cdk-column-${this.cssClassFriendlyName}`]}_setNameInput(A){A&&(this._name=A,this.cssClassFriendlyName=A.replace(/[^a-z0-9_-]/gi,"-"),this._updateColumnCssClassName())}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkColumnDef",""]],contentQueries:function(i,n,o){if(i&1&&jo(o,Xy,5)(o,$y,5)(o,LtA,5),i&2){let a;ae(a=re())&&(n.cell=a.first),ae(a=re())&&(n.headerCell=a.first),ae(a=re())&&(n.footerCell=a.first)}},inputs:{name:[0,"cdkColumnDef","name"],sticky:[2,"sticky","sticky",Be],stickyEnd:[2,"stickyEnd","stickyEnd",Be]}})}return t})(),Zy=class{constructor(e,A){A.nativeElement.classList.add(...e._columnCssClassName)}},GtA=(()=>{class t extends Zy{constructor(){super(w(QQ),w(ce))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["cdk-header-cell"],["th","cdk-header-cell",""]],hostAttrs:["role","columnheader",1,"cdk-header-cell"],features:[mt]})}return t})();var KtA=(()=>{class t extends Zy{constructor(){let A=w(QQ),i=w(ce);super(A,i);let n=A._table?._getCellRole();n&&i.nativeElement.setAttribute("role",n)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["cdk-cell"],["td","cdk-cell",""]],hostAttrs:[1,"cdk-cell"],features:[mt]})}return t})();var jN=(()=>{class t{template=w(ao);_differs=w(ZI);columns;_columnsDiffer;constructor(){}ngOnChanges(A){if(!this._columnsDiffer){let i=A.columns&&A.columns.currentValue||[];this._columnsDiffer=this._differs.find(i).create(),this._columnsDiffer.diff(i)}}getColumnsDiff(){return this._columnsDiffer.diff(this.columns)}extractCellTemplate(A){return this instanceof qN?A.headerCell.template:this instanceof VN?A.footerCell.template:A.cell.template}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,features:[Yt]})}return t})(),qN=(()=>{class t extends jN{_table=w(Sc,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(w(ao),w(ZI))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkHeaderRowDef",""]],inputs:{columns:[0,"cdkHeaderRowDef","columns"],sticky:[2,"cdkHeaderRowDefSticky","sticky",Be]},features:[mt,Yt]})}return t})(),VN=(()=>{class t extends jN{_table=w(Sc,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(w(ao),w(ZI))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkFooterRowDef",""]],inputs:{columns:[0,"cdkFooterRowDef","columns"],sticky:[2,"cdkFooterRowDefSticky","sticky",Be]},features:[mt,Yt]})}return t})(),Av=(()=>{class t extends jN{_table=w(Sc,{optional:!0});when;constructor(){super(w(ao),w(ZI))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkRowDef",""]],inputs:{columns:[0,"cdkRowDefColumns","columns"],when:[0,"cdkRowDefWhen","when"]},features:[mt]})}return t})(),x3=(()=>{class t{_viewContainer=w(Mo);cells;context;static mostRecentCellOutlet=null;constructor(){t.mostRecentCellOutlet=this}ngOnDestroy(){t.mostRecentCellOutlet===this&&(t.mostRecentCellOutlet=null)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","cdkCellOutlet",""]]})}return t})();var WN=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["cdk-row"],["tr","cdk-row",""]],hostAttrs:["role","row",1,"cdk-row"],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&sn(0,0)},dependencies:[x3],encapsulation:2})}return t})(),UtA=(()=>{class t{templateRef=w(ao);_contentClassNames=["cdk-no-data-row","cdk-row"];_cellClassNames=["cdk-cell","cdk-no-data-cell"];_cellSelector="td, cdk-cell, [cdk-cell], .cdk-cell";constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["ng-template","cdkNoDataRow",""]]})}return t})(),NtA=["top","bottom","left","right"],PN=class{_isNativeHtmlTable;_stickCellCss;_isBrowser;_needsPositionStickyOnElement;direction;_positionListener;_tableInjector;_elemSizeCache=new WeakMap;_resizeObserver=globalThis?.ResizeObserver?new globalThis.ResizeObserver(e=>this._updateCachedSizes(e)):null;_updatedStickyColumnsParamsToReplay=[];_stickyColumnsReplayTimeout=null;_cachedCellWidths=[];_borderCellCss;_destroyed=!1;constructor(e,A,i=!0,n=!0,o,a,r){this._isNativeHtmlTable=e,this._stickCellCss=A,this._isBrowser=i,this._needsPositionStickyOnElement=n,this.direction=o,this._positionListener=a,this._tableInjector=r,this._borderCellCss={top:`${A}-border-elem-top`,bottom:`${A}-border-elem-bottom`,left:`${A}-border-elem-left`,right:`${A}-border-elem-right`}}clearStickyPositioning(e,A){(A.includes("left")||A.includes("right"))&&this._removeFromStickyColumnReplayQueue(e);let i=[];for(let n of e)n.nodeType===n.ELEMENT_NODE&&i.push(n,...Array.from(n.children));Hn({write:()=>{for(let n of i)this._removeStickyStyle(n,A)}},{injector:this._tableInjector})}updateStickyColumns(e,A,i,n=!0,o=!0){if(!e.length||!this._isBrowser||!(A.some(f=>f)||i.some(f=>f))){this._positionListener?.stickyColumnsUpdated({sizes:[]}),this._positionListener?.stickyEndColumnsUpdated({sizes:[]});return}let a=e[0],r=a.children.length,s=this.direction==="rtl",l=s?"right":"left",g=s?"left":"right",C=A.lastIndexOf(!0),I=i.indexOf(!0),d,h,E;o&&this._updateStickyColumnReplayQueue({rows:[...e],stickyStartStates:[...A],stickyEndStates:[...i]}),Hn({earlyRead:()=>{d=this._getCellWidths(a,n),h=this._getStickyStartColumnPositions(d,A),E=this._getStickyEndColumnPositions(d,i)},write:()=>{for(let f of e)for(let m=0;m!!f)&&(this._positionListener.stickyColumnsUpdated({sizes:C===-1?[]:d.slice(0,C+1).map((f,m)=>A[m]?f:null)}),this._positionListener.stickyEndColumnsUpdated({sizes:I===-1?[]:d.slice(I).map((f,m)=>i[m+I]?f:null).reverse()}))}},{injector:this._tableInjector})}stickRows(e,A,i){if(!this._isBrowser)return;let n=i==="bottom"?e.slice().reverse():e,o=i==="bottom"?A.slice().reverse():A,a=[],r=[],s=[];Hn({earlyRead:()=>{for(let l=0,g=0;l{let l=o.lastIndexOf(!0);for(let g=0;g{let i=e.querySelector("tfoot");i&&(A.some(n=>!n)?this._removeStickyStyle(i,["bottom"]):this._addStickyStyle(i,"bottom",0,!1))}},{injector:this._tableInjector})}destroy(){this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._resizeObserver?.disconnect(),this._destroyed=!0}_removeStickyStyle(e,A){if(!e.classList.contains(this._stickCellCss))return;for(let n of A)e.style[n]="",e.classList.remove(this._borderCellCss[n]);NtA.some(n=>A.indexOf(n)===-1&&e.style[n])?e.style.zIndex=this._getCalculatedZIndex(e):(e.style.zIndex="",this._needsPositionStickyOnElement&&(e.style.position=""),e.classList.remove(this._stickCellCss))}_addStickyStyle(e,A,i,n){e.classList.add(this._stickCellCss),n&&e.classList.add(this._borderCellCss[A]),e.style[A]=`${i}px`,e.style.zIndex=this._getCalculatedZIndex(e),this._needsPositionStickyOnElement&&(e.style.cssText+="position: -webkit-sticky; position: sticky; ")}_getCalculatedZIndex(e){let A={top:100,bottom:10,left:1,right:1},i=0;for(let n of NtA)e.style[n]&&(i+=A[n]);return i?`${i}`:""}_getCellWidths(e,A=!0){if(!A&&this._cachedCellWidths.length)return this._cachedCellWidths;let i=[],n=e.children;for(let o=0;o0;o--)A[o]&&(i[o]=n,n+=e[o]);return i}_retrieveElementSize(e){let A=this._elemSizeCache.get(e);if(A)return A;let i=e.getBoundingClientRect(),n={width:i.width,height:i.height};return this._resizeObserver&&(this._elemSizeCache.set(e,n),this._resizeObserver.observe(e,{box:"border-box"})),n}_updateStickyColumnReplayQueue(e){this._removeFromStickyColumnReplayQueue(e.rows),this._stickyColumnsReplayTimeout||this._updatedStickyColumnsParamsToReplay.push(e)}_removeFromStickyColumnReplayQueue(e){let A=new Set(e);for(let i of this._updatedStickyColumnsParamsToReplay)i.rows=i.rows.filter(n=>!A.has(n));this._updatedStickyColumnsParamsToReplay=this._updatedStickyColumnsParamsToReplay.filter(i=>!!i.rows.length)}_updateCachedSizes(e){let A=!1;for(let i of e){let n=i.borderBoxSize?.length?{width:i.borderBoxSize[0].inlineSize,height:i.borderBoxSize[0].blockSize}:{width:i.contentRect.width,height:i.contentRect.height};n.width!==this._elemSizeCache.get(i.target)?.width&&i_A(i.target)&&(A=!0),this._elemSizeCache.set(i.target,n)}A&&this._updatedStickyColumnsParamsToReplay.length&&(this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._stickyColumnsReplayTimeout=setTimeout(()=>{if(!this._destroyed){for(let i of this._updatedStickyColumnsParamsToReplay)this.updateStickyColumns(i.rows,i.stickyStartStates,i.stickyEndStates,!0,!1);this._updatedStickyColumnsParamsToReplay=[],this._stickyColumnsReplayTimeout=null}},0))}};function i_A(t){return["cdk-cell","cdk-header-cell","cdk-footer-cell"].some(e=>t.classList.contains(e))}var k3=new kA("STICKY_POSITIONING_LISTENER");var ZN=(()=>{class t{viewContainer=w(Mo);elementRef=w(ce);constructor(){let A=w(Sc);A._rowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","rowOutlet",""]]})}return t})(),XN=(()=>{class t{viewContainer=w(Mo);elementRef=w(ce);constructor(){let A=w(Sc);A._headerRowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","headerRowOutlet",""]]})}return t})(),$N=(()=>{class t{viewContainer=w(Mo);elementRef=w(ce);constructor(){let A=w(Sc);A._footerRowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","footerRowOutlet",""]]})}return t})(),AF=(()=>{class t{viewContainer=w(Mo);elementRef=w(ce);constructor(){let A=w(Sc);A._noDataRowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","noDataRowOutlet",""]]})}return t})(),eF=(()=>{class t{_differs=w(ZI);_changeDetectorRef=w(wt);_elementRef=w(ce);_dir=w(fo,{optional:!0});_platform=w(gi);_viewRepeater;_viewportRuler=w(Ms);_injector=w(Dt);_virtualScrollViewport=w(ET,{optional:!0,host:!0});_positionListener=w(k3,{optional:!0})||w(k3,{optional:!0,skipSelf:!0});_document=w(ti);_data;_renderedRange;_onDestroy=new ie;_renderRows;_renderChangeSubscription=null;_columnDefsByName=new Map;_rowDefs;_headerRowDefs;_footerRowDefs;_dataDiffer;_defaultRowDef=null;_customColumnDefs=new Set;_customRowDefs=new Set;_customHeaderRowDefs=new Set;_customFooterRowDefs=new Set;_customNoDataRow=null;_headerRowDefChanged=!0;_footerRowDefChanged=!0;_stickyColumnStylesNeedReset=!0;_forceRecalculateCellWidths=!0;_cachedRenderRowsMap=new Map;_isNativeHtmlTable;_stickyStyler;stickyCssClass="cdk-table-sticky";needsPositionStickyOnElement=!0;_isServer;_isShowingNoDataRow=!1;_hasAllOutlets=!1;_hasInitialized=!1;_headerRowStickyUpdates=new ie;_footerRowStickyUpdates=new ie;_disableVirtualScrolling=!1;_getCellRole(){if(this._cellRoleInternal===void 0){let A=this._elementRef.nativeElement.getAttribute("role");return A==="grid"||A==="treegrid"?"gridcell":"cell"}return this._cellRoleInternal}_cellRoleInternal=void 0;get trackBy(){return this._trackByFn}set trackBy(A){this._trackByFn=A}_trackByFn;get dataSource(){return this._dataSource}set dataSource(A){this._dataSource!==A&&(this._switchDataSource(A),this._changeDetectorRef.markForCheck())}_dataSource;_dataSourceChanges=new ie;_dataStream=new ie;get multiTemplateDataRows(){return this._multiTemplateDataRows}set multiTemplateDataRows(A){this._multiTemplateDataRows=A,this._rowOutlet&&this._rowOutlet.viewContainer.length&&(this._forceRenderDataRows(),this.updateStickyColumnStyles())}_multiTemplateDataRows=!1;get fixedLayout(){return this._virtualScrollEnabled()?!0:this._fixedLayout}set fixedLayout(A){this._fixedLayout=A,this._forceRecalculateCellWidths=!0,this._stickyColumnStylesNeedReset=!0}_fixedLayout=!1;recycleRows=!1;contentChanged=new LA;viewChange=new ei({start:0,end:Number.MAX_VALUE});_rowOutlet;_headerRowOutlet;_footerRowOutlet;_noDataRowOutlet;_contentColumnDefs;_contentRowDefs;_contentHeaderRowDefs;_contentFooterRowDefs;_noDataRow;constructor(){w(new Us("role"),{optional:!0})||this._elementRef.nativeElement.setAttribute("role","table"),this._isServer=!this._platform.isBrowser,this._isNativeHtmlTable=this._elementRef.nativeElement.nodeName==="TABLE",this._dataDiffer=this._differs.find([]).create((i,n)=>this.trackBy?this.trackBy(n.dataIndex,n.data):n)}ngOnInit(){this._setupStickyStyler(),this._viewportRuler.change().pipe(Qt(this._onDestroy)).subscribe(()=>{this._forceRecalculateCellWidths=!0})}ngAfterContentInit(){this._viewRepeater=this.recycleRows||this._virtualScrollEnabled()?new Fm:new Lm,this._virtualScrollEnabled()&&this._setupVirtualScrolling(this._virtualScrollViewport),this._hasInitialized=!0}ngAfterContentChecked(){this._canRender()&&this._render()}ngOnDestroy(){this._stickyStyler?.destroy(),[this._rowOutlet?.viewContainer,this._headerRowOutlet?.viewContainer,this._footerRowOutlet?.viewContainer,this._cachedRenderRowsMap,this._customColumnDefs,this._customRowDefs,this._customHeaderRowDefs,this._customFooterRowDefs,this._columnDefsByName].forEach(A=>{A?.clear()}),this._headerRowDefs=[],this._footerRowDefs=[],this._defaultRowDef=null,this._headerRowStickyUpdates.complete(),this._footerRowStickyUpdates.complete(),this._onDestroy.next(),this._onDestroy.complete(),Ru(this.dataSource)&&this.dataSource.disconnect(this)}renderRows(){this._renderRows=this._getAllRenderRows();let A=this._dataDiffer.diff(this._renderRows);if(!A){this._updateNoDataRow(),this.contentChanged.next();return}let i=this._rowOutlet.viewContainer;this._viewRepeater.applyChanges(A,i,(n,o,a)=>this._getEmbeddedViewArgs(n.item,a),n=>n.item.data,n=>{n.operation===Tg.INSERTED&&n.context&&this._renderCellTemplateForItem(n.record.item.rowDef,n.context)}),this._updateRowIndexContext(),A.forEachIdentityChange(n=>{let o=i.get(n.currentIndex);o.context.$implicit=n.item.data}),this._updateNoDataRow(),this.contentChanged.next(),this.updateStickyColumnStyles()}addColumnDef(A){this._customColumnDefs.add(A)}removeColumnDef(A){this._customColumnDefs.delete(A)}addRowDef(A){this._customRowDefs.add(A)}removeRowDef(A){this._customRowDefs.delete(A)}addHeaderRowDef(A){this._customHeaderRowDefs.add(A),this._headerRowDefChanged=!0}removeHeaderRowDef(A){this._customHeaderRowDefs.delete(A),this._headerRowDefChanged=!0}addFooterRowDef(A){this._customFooterRowDefs.add(A),this._footerRowDefChanged=!0}removeFooterRowDef(A){this._customFooterRowDefs.delete(A),this._footerRowDefChanged=!0}setNoDataRow(A){this._customNoDataRow=A}updateStickyHeaderRowStyles(){let A=this._getRenderedRows(this._headerRowOutlet);if(this._isNativeHtmlTable){let n=FtA(this._headerRowOutlet,"thead");n&&(n.style.display=A.length?"":"none")}let i=this._headerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,["top"]),this._stickyStyler.stickRows(A,i,"top"),this._headerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyFooterRowStyles(){let A=this._getRenderedRows(this._footerRowOutlet);if(this._isNativeHtmlTable){let n=FtA(this._footerRowOutlet,"tfoot");n&&(n.style.display=A.length?"":"none")}let i=this._footerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,["bottom"]),this._stickyStyler.stickRows(A,i,"bottom"),this._stickyStyler.updateStickyFooterContainer(this._elementRef.nativeElement,i),this._footerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyColumnStyles(){let A=this._getRenderedRows(this._headerRowOutlet),i=this._getRenderedRows(this._rowOutlet),n=this._getRenderedRows(this._footerRowOutlet);(this._isNativeHtmlTable&&!this.fixedLayout||this._stickyColumnStylesNeedReset)&&(this._stickyStyler.clearStickyPositioning([...A,...i,...n],["left","right"]),this._stickyColumnStylesNeedReset=!1),A.forEach((o,a)=>{this._addStickyColumnStyles([o],this._headerRowDefs[a])}),this._rowDefs.forEach(o=>{let a=[];for(let r=0;r{this._addStickyColumnStyles([o],this._footerRowDefs[a])}),Array.from(this._columnDefsByName.values()).forEach(o=>o.resetStickyChanged())}stickyColumnsUpdated(A){this._positionListener?.stickyColumnsUpdated(A)}stickyEndColumnsUpdated(A){this._positionListener?.stickyEndColumnsUpdated(A)}stickyHeaderRowsUpdated(A){this._headerRowStickyUpdates.next(A),this._positionListener?.stickyHeaderRowsUpdated(A)}stickyFooterRowsUpdated(A){this._footerRowStickyUpdates.next(A),this._positionListener?.stickyFooterRowsUpdated(A)}_outletAssigned(){!this._hasAllOutlets&&this._rowOutlet&&this._headerRowOutlet&&this._footerRowOutlet&&this._noDataRowOutlet&&(this._hasAllOutlets=!0,this._canRender()&&this._render())}_canRender(){return this._hasAllOutlets&&this._hasInitialized}_render(){this._cacheRowDefs(),this._cacheColumnDefs(),!this._headerRowDefs.length&&!this._footerRowDefs.length&&this._rowDefs.length;let i=this._renderUpdatedColumns()||this._headerRowDefChanged||this._footerRowDefChanged;this._stickyColumnStylesNeedReset=this._stickyColumnStylesNeedReset||i,this._forceRecalculateCellWidths=i,this._headerRowDefChanged&&(this._forceRenderHeaderRows(),this._headerRowDefChanged=!1),this._footerRowDefChanged&&(this._forceRenderFooterRows(),this._footerRowDefChanged=!1),this.dataSource&&this._rowDefs.length>0&&!this._renderChangeSubscription?this._observeRenderChanges():this._stickyColumnStylesNeedReset&&this.updateStickyColumnStyles(),this._checkStickyStates()}_getAllRenderRows(){if(!Array.isArray(this._data)||!this._renderedRange)return[];let A=[],i=Math.min(this._data.length,this._renderedRange.end),n=this._cachedRenderRowsMap;this._cachedRenderRowsMap=new Map;for(let o=this._renderedRange.start;o{let r=n&&n.has(a)?n.get(a):[];if(r.length){let s=r.shift();return s.dataIndex=i,s}else return{data:A,rowDef:a,dataIndex:i}})}_cacheColumnDefs(){this._columnDefsByName.clear(),Wy(this._getOwnDefs(this._contentColumnDefs),this._customColumnDefs).forEach(i=>{this._columnDefsByName.has(i.name),this._columnDefsByName.set(i.name,i)})}_cacheRowDefs(){this._headerRowDefs=Wy(this._getOwnDefs(this._contentHeaderRowDefs),this._customHeaderRowDefs),this._footerRowDefs=Wy(this._getOwnDefs(this._contentFooterRowDefs),this._customFooterRowDefs),this._rowDefs=Wy(this._getOwnDefs(this._contentRowDefs),this._customRowDefs);let A=this._rowDefs.filter(i=>!i.when);this._defaultRowDef=A[0]}_renderUpdatedColumns(){let A=(a,r)=>{let s=!!r.getColumnsDiff();return a||s},i=this._rowDefs.reduce(A,!1);i&&this._forceRenderDataRows();let n=this._headerRowDefs.reduce(A,!1);n&&this._forceRenderHeaderRows();let o=this._footerRowDefs.reduce(A,!1);return o&&this._forceRenderFooterRows(),i||n||o}_switchDataSource(A){this._data=[],Ru(this.dataSource)&&this.dataSource.disconnect(this),this._renderChangeSubscription&&(this._renderChangeSubscription.unsubscribe(),this._renderChangeSubscription=null),A||(this._dataDiffer&&this._dataDiffer.diff([]),this._rowOutlet&&this._rowOutlet.viewContainer.clear()),this._dataSource=A}_observeRenderChanges(){if(!this.dataSource)return;let A;Ru(this.dataSource)?A=this.dataSource.connect(this):zd(this.dataSource)?A=this.dataSource:Array.isArray(this.dataSource)&&(A=ne(this.dataSource)),this._renderChangeSubscription=Qr([A,this.viewChange]).pipe(Qt(this._onDestroy)).subscribe(([i,n])=>{this._data=i||[],this._renderedRange=n,this._dataStream.next(i),this.renderRows()})}_forceRenderHeaderRows(){this._headerRowOutlet.viewContainer.length>0&&this._headerRowOutlet.viewContainer.clear(),this._headerRowDefs.forEach((A,i)=>this._renderRow(this._headerRowOutlet,A,i)),this.updateStickyHeaderRowStyles()}_forceRenderFooterRows(){this._footerRowOutlet.viewContainer.length>0&&this._footerRowOutlet.viewContainer.clear(),this._footerRowDefs.forEach((A,i)=>this._renderRow(this._footerRowOutlet,A,i)),this.updateStickyFooterRowStyles()}_addStickyColumnStyles(A,i){let n=Array.from(i?.columns||[]).map(r=>{let s=this._columnDefsByName.get(r);return s}),o=n.map(r=>r.sticky),a=n.map(r=>r.stickyEnd);this._stickyStyler.updateStickyColumns(A,o,a,!this.fixedLayout||this._forceRecalculateCellWidths)}_getRenderedRows(A){let i=[];for(let n=0;n!o.when||o.when(i,A));else{let o=this._rowDefs.find(a=>a.when&&a.when(i,A))||this._defaultRowDef;o&&n.push(o)}return n.length,n}_getEmbeddedViewArgs(A,i){let n=A.rowDef,o={$implicit:A.data};return{templateRef:n.template,context:o,index:i}}_renderRow(A,i,n,o={}){let a=A.viewContainer.createEmbeddedView(i.template,o,n);return this._renderCellTemplateForItem(i,o),a}_renderCellTemplateForItem(A,i){for(let n of this._getCellTemplates(A))x3.mostRecentCellOutlet&&x3.mostRecentCellOutlet._viewContainer.createEmbeddedView(n,i);this._changeDetectorRef.markForCheck()}_updateRowIndexContext(){let A=this._rowOutlet.viewContainer;for(let i=0,n=A.length;i{let n=this._columnDefsByName.get(i);return A.extractCellTemplate(n)})}_forceRenderDataRows(){this._dataDiffer.diff([]),this._rowOutlet.viewContainer.clear(),this.renderRows()}_checkStickyStates(){let A=(i,n)=>i||n.hasStickyChanged();this._headerRowDefs.reduce(A,!1)&&this.updateStickyHeaderRowStyles(),this._footerRowDefs.reduce(A,!1)&&this.updateStickyFooterRowStyles(),Array.from(this._columnDefsByName.values()).reduce(A,!1)&&(this._stickyColumnStylesNeedReset=!0,this.updateStickyColumnStyles())}_setupStickyStyler(){let A=this._dir?this._dir.value:"ltr",i=this._injector;this._stickyStyler=new PN(this._isNativeHtmlTable,this.stickyCssClass,this._platform.isBrowser,this.needsPositionStickyOnElement,A,this,i),(this._dir?this._dir.change:ne()).pipe(Qt(this._onDestroy)).subscribe(n=>{this._stickyStyler.direction=n,this.updateStickyColumnStyles()})}_setupVirtualScrolling(A){let i=typeof requestAnimationFrame<"u"?Yd:jv;this.viewChange.next({start:0,end:0}),A.renderedRangeStream.pipe(jI(0,i),Qt(this._onDestroy)).subscribe(this.viewChange),A.attach({dataStream:this._dataStream,measureRangeSize:(n,o)=>this._measureRangeSize(n,o)}),Qr([A.renderedContentOffset,this._headerRowStickyUpdates]).pipe(Qt(this._onDestroy)).subscribe(([n,o])=>{if(!(!o.sizes||!o.offsets||!o.elements))for(let a=0;a{if(!(!o.sizes||!o.offsets||!o.elements))for(let a=0;a!i._table||i._table===this)}_updateNoDataRow(){let A=this._customNoDataRow||this._noDataRow;if(!A)return;let i=this._rowOutlet.viewContainer.length===0;if(i===this._isShowingNoDataRow)return;let n=this._noDataRowOutlet.viewContainer;if(i){let o=n.createEmbeddedView(A.templateRef),a=o.rootNodes[0];if(o.rootNodes.length===1&&a?.nodeType===this._document.ELEMENT_NODE){a.setAttribute("role","row"),a.classList.add(...A._contentClassNames);let r=a.querySelectorAll(A._cellSelector);for(let s=0;s=A.end||i!=="vertical")return 0;let n=this.viewChange.value,o=this._rowOutlet.viewContainer;A.startn.end;let a=A.start-n.start,r=A.end-A.start,s,l;for(let I=0;I-1;I--){let d=o.get(I+a);if(d&&d.rootNodes.length){l=d.rootNodes[d.rootNodes.length-1];break}}let g=s?.getBoundingClientRect?.(),C=l?.getBoundingClientRect?.();return g&&C?C.bottom-g.top:0}_virtualScrollEnabled(){return!this._disableVirtualScrolling&&this._virtualScrollViewport!=null}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["cdk-table"],["table","cdk-table",""]],contentQueries:function(i,n,o){if(i&1&&jo(o,UtA,5)(o,QQ,5)(o,Av,5)(o,qN,5)(o,VN,5),i&2){let a;ae(a=re())&&(n._noDataRow=a.first),ae(a=re())&&(n._contentColumnDefs=a),ae(a=re())&&(n._contentRowDefs=a),ae(a=re())&&(n._contentHeaderRowDefs=a),ae(a=re())&&(n._contentFooterRowDefs=a)}},hostAttrs:[1,"cdk-table"],hostVars:2,hostBindings:function(i,n){i&2&&RA("cdk-table-fixed-layout",n.fixedLayout)},inputs:{trackBy:"trackBy",dataSource:"dataSource",multiTemplateDataRows:[2,"multiTemplateDataRows","multiTemplateDataRows",Be],fixedLayout:[2,"fixedLayout","fixedLayout",Be],recycleRows:[2,"recycleRows","recycleRows",Be]},outputs:{contentChanged:"contentChanged"},exportAs:["cdkTable"],features:[Bt([{provide:Sc,useExisting:t},{provide:k3,useValue:null}])],ngContentSelectors:$xA,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(i,n){i&1&&(Rt(XxA),Ve(0),Ve(1,1),O(2,A_A,1,0),O(3,e_A,7,0)(4,t_A,4,0)),i&2&&(u(2),Y(n._isServer?2:-1),u(),Y(n._isNativeHtmlTable?3:4))},dependencies:[XN,ZN,AF,$N],styles:[`.cdk-table-fixed-layout{table-layout:fixed} -`],encapsulation:2})}return t})();function Wy(t,e){return t.concat(Array.from(e))}function FtA(t,e){let A=e.toUpperCase(),i=t.viewContainer.element.nativeElement;for(;i;){let n=i.nodeType===1?i.nodeName:null;if(n===A)return i;if(n==="TABLE")break;i=i.parentNode}return null}var n_A=[[["caption"]],[["colgroup"],["col"]],"*"],o_A=["caption","colgroup, col","*"];function a_A(t,e){t&1&&Ve(0,2)}function r_A(t,e){t&1&&(B(0,"thead",0),sn(1,1),Q(),B(2,"tbody",2),sn(3,3)(4,4),Q(),B(5,"tfoot",0),sn(6,5),Q())}function s_A(t,e){t&1&&sn(0,1)(1,3)(2,4)(3,5)}var TtA=(()=>{class t extends eF{stickyCssClass="mat-mdc-table-sticky";needsPositionStickyOnElement=!1;static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275cmp=SA({type:t,selectors:[["mat-table"],["table","mat-table",""]],hostAttrs:[1,"mat-mdc-table","mdc-data-table__table"],hostVars:2,hostBindings:function(i,n){i&2&&RA("mat-table-fixed-layout",n.fixedLayout)},exportAs:["matTable"],features:[Bt([{provide:eF,useExisting:t},{provide:Sc,useExisting:t},{provide:k3,useValue:null}]),mt],ngContentSelectors:o_A,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["role","rowgroup",1,"mdc-data-table__content"],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(i,n){i&1&&(Rt(n_A),Ve(0),Ve(1,1),O(2,a_A,1,0),O(3,r_A,7,0)(4,s_A,4,0)),i&2&&(u(2),Y(n._isServer?2:-1),u(),Y(n._isNativeHtmlTable?3:4))},dependencies:[XN,ZN,AF,$N],styles:[`.mat-mdc-table-sticky{position:sticky !important}mat-table{display:block}mat-header-row{min-height:var(--mat-table-header-container-height, 56px)}mat-row{min-height:var(--mat-table-row-item-container-height, 52px)}mat-footer-row{min-height:var(--mat-table-footer-container-height, 52px)}mat-row,mat-header-row,mat-footer-row{display:flex;border-width:0;border-bottom-width:1px;border-style:solid;align-items:center;box-sizing:border-box}mat-cell:first-of-type,mat-header-cell:first-of-type,mat-footer-cell:first-of-type{padding-left:24px}[dir=rtl] mat-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:first-of-type:not(:only-of-type){padding-left:0;padding-right:24px}mat-cell:last-of-type,mat-header-cell:last-of-type,mat-footer-cell:last-of-type{padding-right:24px}[dir=rtl] mat-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:last-of-type:not(:only-of-type){padding-right:0;padding-left:24px}mat-cell,mat-header-cell,mat-footer-cell{flex:1;display:flex;align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit}.mat-mdc-table{min-width:100%;border:0;border-spacing:0;table-layout:auto;white-space:normal;background-color:var(--mat-table-background-color, var(--mat-sys-surface))}.mat-table-fixed-layout{table-layout:fixed}.mdc-data-table__cell{box-sizing:border-box;overflow:hidden;text-align:start;text-overflow:ellipsis}.mdc-data-table__cell,.mdc-data-table__header-cell{padding:0 16px}.mat-mdc-header-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-header-container-height, 56px);color:var(--mat-table-header-headline-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-header-headline-font, var(--mat-sys-title-small-font, Roboto, sans-serif));line-height:var(--mat-table-header-headline-line-height, var(--mat-sys-title-small-line-height));font-size:var(--mat-table-header-headline-size, var(--mat-sys-title-small-size, 14px));font-weight:var(--mat-table-header-headline-weight, var(--mat-sys-title-small-weight, 500))}.mat-mdc-row{height:var(--mat-table-row-item-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)))}.mat-mdc-row,.mdc-data-table__content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-table-row-item-label-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-row-item-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-row-item-label-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-row-item-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-footer-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-footer-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-footer-supporting-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-footer-supporting-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-footer-supporting-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-footer-supporting-text-weight, var(--mat-sys-body-medium-weight));letter-spacing:var(--mat-table-footer-supporting-text-tracking, var(--mat-sys-body-medium-tracking))}.mat-mdc-header-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-header-headline-tracking, var(--mat-sys-title-small-tracking));font-weight:inherit;line-height:inherit;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;outline:none;text-align:start}.mdc-data-table__row:last-child>.mat-mdc-header-cell{border-bottom:none}.mat-mdc-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking));line-height:inherit}.mdc-data-table__row:last-child>.mat-mdc-cell{border-bottom:none}.mat-mdc-footer-cell{letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking))}mat-row.mat-mdc-row,mat-header-row.mat-mdc-header-row,mat-footer-row.mat-mdc-footer-row{border-bottom:none}.mat-mdc-table tbody,.mat-mdc-table tfoot,.mat-mdc-table thead,.mat-mdc-cell,.mat-mdc-footer-cell,.mat-mdc-header-row,.mat-mdc-row,.mat-mdc-footer-row,.mat-mdc-table .mat-mdc-header-cell{background:inherit}.mat-mdc-table mat-header-row.mat-mdc-header-row,.mat-mdc-table mat-row.mat-mdc-row,.mat-mdc-table mat-footer-row.mat-mdc-footer-cell{height:unset}mat-header-cell.mat-mdc-header-cell,mat-cell.mat-mdc-cell,mat-footer-cell.mat-mdc-footer-cell{align-self:stretch} -`],encapsulation:2})}return t})(),JtA=(()=>{class t extends Xy{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matCellDef",""]],features:[Bt([{provide:Xy,useExisting:t}]),mt]})}return t})(),OtA=(()=>{class t extends $y{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matHeaderCellDef",""]],features:[Bt([{provide:$y,useExisting:t}]),mt]})}return t})();var YtA=(()=>{class t extends QQ{get name(){return this._name}set name(A){this._setNameInput(A)}_updateColumnCssClassName(){super._updateColumnCssClassName(),this._columnCssClassName.push(`mat-column-${this.cssClassFriendlyName}`)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matColumnDef",""]],inputs:{name:[0,"matColumnDef","name"]},features:[Bt([{provide:QQ,useExisting:t}]),mt]})}return t})(),HtA=(()=>{class t extends GtA{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["mat-header-cell"],["th","mat-header-cell",""]],hostAttrs:["role","columnheader",1,"mat-mdc-header-cell","mdc-data-table__header-cell"],features:[mt]})}return t})();var ztA=(()=>{class t extends KtA{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["mat-cell"],["td","mat-cell",""]],hostAttrs:[1,"mat-mdc-cell","mdc-data-table__cell"],features:[mt]})}return t})();var PtA=(()=>{class t extends Av{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matRowDef",""]],inputs:{columns:[0,"matRowDefColumns","columns"],when:[0,"matRowDefWhen","when"]},features:[Bt([{provide:Av,useExisting:t}]),mt]})}return t})();var jtA=(()=>{class t extends WN{static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275cmp=SA({type:t,selectors:[["mat-row"],["tr","mat-row",""]],hostAttrs:["role","row",1,"mat-mdc-row","mdc-data-table__row"],exportAs:["matRow"],features:[Bt([{provide:WN,useExisting:t}]),mt],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&sn(0,0)},dependencies:[x3],encapsulation:2})}return t})();var l_A=9007199254740991,Td=class extends _u{_data;_renderData=new ei([]);_filter=new ei("");_internalPageChanges=new ie;_renderChangesSubscription=null;filteredData;get data(){return this._data.value}set data(e){e=Array.isArray(e)?e:[],this._data.next(e),this._renderChangesSubscription||this._filterData(e)}get filter(){return this._filter.value}set filter(e){this._filter.next(e),this._renderChangesSubscription||this._filterData(this.data)}get sort(){return this._sort}set sort(e){this._sort=e,this._updateChangeSubscription()}_sort;get paginator(){return this._paginator}set paginator(e){this._paginator=e,this._updateChangeSubscription()}_paginator;sortingDataAccessor=(e,A)=>{let i=e[A];if(Ep(i)){let n=Number(i);return n{let i=A.active,n=A.direction;return!i||n==""?e:e.sort((o,a)=>{let r=this.sortingDataAccessor(o,i),s=this.sortingDataAccessor(a,i),l=typeof r,g=typeof s;l!==g&&(l==="number"&&(r+=""),g==="number"&&(s+=""));let C=0;return r!=null&&s!=null?r>s?C=1:r{let i=A.trim().toLowerCase();return Object.values(e).some(n=>`${n}`.toLowerCase().includes(i))};constructor(e=[]){super(),this._data=new ei(e),this._updateChangeSubscription()}_updateChangeSubscription(){let e=this._sort?Ki(this._sort.sortChange,this._sort.initialized):ne(null),A=this._paginator?Ki(this._paginator.page,this._internalPageChanges,this._paginator.initialized):ne(null),i=this._data,n=Qr([i,this._filter]).pipe(we(([r])=>this._filterData(r))),o=Qr([n,e]).pipe(we(([r])=>this._orderData(r))),a=Qr([o,A]).pipe(we(([r])=>this._pageData(r)));this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=a.subscribe(r=>this._renderData.next(r))}_filterData(e){return this.filteredData=this.filter==null||this.filter===""?e:e.filter(A=>this.filterPredicate(A,this.filter)),this.paginator&&this._updatePaginator(this.filteredData.length),this.filteredData}_orderData(e){return this.sort?this.sortData(e.slice(),this.sort):e}_pageData(e){if(!this.paginator)return e;let A=this.paginator.pageIndex*this.paginator.pageSize;return e.slice(A,A+this.paginator.pageSize)}_updatePaginator(e){Promise.resolve().then(()=>{let A=this.paginator;if(A&&(A.length=e,A.pageIndex>0)){let i=Math.ceil(A.length/A.pageSize)-1||0,n=Math.min(A.pageIndex,i);n!==A.pageIndex&&(A.pageIndex=n,this._internalPageChanges.next())}})}connect(){return this._renderChangesSubscription||this._updateChangeSubscription(),this._renderData}disconnect(){this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=null}};var uQ=[{metricName:"tool_trajectory_avg_score",threshold:1},{metricName:"response_match_score",threshold:.7}];var ev="0123456789abcdef",tv=class t{constructor(e){this.bytes=e}static ofInner(e){if(e.length!==16)throw new TypeError("not 128-bit length");return new t(e)}static fromFieldsV7(e,A,i,n){if(!Number.isInteger(e)||!Number.isInteger(A)||!Number.isInteger(i)||!Number.isInteger(n)||e<0||A<0||i<0||n<0||e>0xffffffffffff||A>4095||i>1073741823||n>4294967295)throw new RangeError("invalid field value");let o=new Uint8Array(16);return o[0]=e/2**40,o[1]=e/2**32,o[2]=e/2**24,o[3]=e/2**16,o[4]=e/2**8,o[5]=e,o[6]=112|A>>>8,o[7]=A,o[8]=128|i>>>24,o[9]=i>>>16,o[10]=i>>>8,o[11]=i,o[12]=n>>>24,o[13]=n>>>16,o[14]=n>>>8,o[15]=n,new t(o)}static parse(e){var A,i,n,o;let a;switch(e.length){case 32:a=(A=/^[0-9a-f]{32}$/i.exec(e))===null||A===void 0?void 0:A[0];break;case 36:a=(i=/^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(e))===null||i===void 0?void 0:i.slice(1,6).join("");break;case 38:a=(n=/^\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\}$/i.exec(e))===null||n===void 0?void 0:n.slice(1,6).join("");break;case 45:a=(o=/^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(e))===null||o===void 0?void 0:o.slice(1,6).join("");break;default:break}if(a){let r=new Uint8Array(16);for(let s=0;s<16;s+=4){let l=parseInt(a.substring(2*s,2*s+8),16);r[s+0]=l>>>24,r[s+1]=l>>>16,r[s+2]=l>>>8,r[s+3]=l}return new t(r)}else throw new SyntaxError("could not parse UUID string")}toString(){let e="";for(let A=0;A>>4),e+=ev.charAt(this.bytes[A]&15),(A===3||A===5||A===7||A===9)&&(e+="-");return e}toHex(){let e="";for(let A=0;A>>4),e+=ev.charAt(this.bytes[A]&15);return e}toJSON(){return this.toString()}getVariant(){let e=this.bytes[8]>>>4;if(e<0)throw new Error("unreachable");if(e<=7)return this.bytes.every(A=>A===0)?"NIL":"VAR_0";if(e<=11)return"VAR_10";if(e<=13)return"VAR_110";if(e<=15)return this.bytes.every(A=>A===255)?"MAX":"VAR_RESERVED";throw new Error("unreachable")}getVersion(){return this.getVariant()==="VAR_10"?this.bytes[6]>>>4:void 0}clone(){return new t(this.bytes.slice(0))}equals(e){return this.compareTo(e)===0}compareTo(e){for(let A=0;A<16;A++){let i=this.bytes[A]-e.bytes[A];if(i!==0)return Math.sign(i)}return 0}},tF=class{constructor(e){this.timestamp_biased=0,this.counter=0,this.random=e??g_A()}generate(){return this.generateOrResetCore(Date.now(),1e4)}generateOrAbort(){return this.generateOrAbortCore(Date.now(),1e4)}generateOrResetCore(e,A){let i=this.generateOrAbortCore(e,A);return i===void 0&&(this.timestamp_biased=0,i=this.generateOrAbortCore(e,A)),i}generateOrAbortCore(e,A){if(!Number.isInteger(e)||e<0||e>0xffffffffffff)throw new RangeError("`unixTsMs` must be a 48-bit unsigned integer");if(A<0||A>0xffffffffffff)throw new RangeError("`rollbackAllowance` out of reasonable range");if(e++,e>this.timestamp_biased)this.timestamp_biased=e,this.resetCounter();else if(e+A>=this.timestamp_biased)this.counter++,this.counter>4398046511103&&(this.timestamp_biased++,this.resetCounter());else return;return tv.fromFieldsV7(this.timestamp_biased-1,Math.trunc(this.counter/2**30),this.counter&2**30-1,this.random.nextUint32())}resetCounter(){this.counter=this.random.nextUint32()*1024+(this.random.nextUint32()&1023)}generateV4(){let e=new Uint8Array(Uint32Array.of(this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32()).buffer);return e[6]=64|e[6]>>>4,e[8]=128|e[8]>>>2,tv.ofInner(e)}},g_A=()=>{if(typeof crypto<"u"&&typeof crypto.getRandomValues<"u")return new iF;if(typeof UUIDV7_DENY_WEAK_RNG<"u"&&UUIDV7_DENY_WEAK_RNG)throw new Error("no cryptographically strong RNG available");return{nextUint32:()=>Math.trunc(Math.random()*65536)*65536+Math.trunc(Math.random()*65536)}},iF=class{constructor(){this.buffer=new Uint32Array(8),this.cursor=65535}nextUint32(){return this.cursor>=this.buffer.length&&(crypto.getRandomValues(this.buffer),this.cursor=0),this.buffer[this.cursor++]}},qtA;var iv=()=>c_A().toString(),c_A=()=>(qtA||(qtA=new tF)).generateV4();function C_A(t,e){t&1&&(B(0,"div",1),hA(1,"mat-progress-spinner",6),Q()),t&2&&(u(),H("diameter",28)("strokeWidth",3))}function I_A(t,e){if(t&1){let A=QA();B(0,"mat-form-field",2)(1,"input",7),Di("ngModelChange",function(n){T(A);let o=p();return Bi(o.newCaseId,n)||(o.newCaseId=n),J(n)}),U("keydown.enter",function(){T(A);let n=p();return J(n.createNewEvalCase())}),Q()()}if(t&2){let A=p();u(),wi("ngModel",A.newCaseId)}}var nv=class t{evalService=w(t0);data=w(qo);dialogRef=w(lo);newCaseId=this.data.defaultName||"case_"+iv().slice(0,6);loading=!1;constructor(){}createNewEvalCase(){if(!this.newCaseId||this.newCaseId=="")alert("Cannot create eval set with empty id!");else{if(this.data.existingCases?.includes(this.newCaseId)&&!confirm(`Eval case "${this.newCaseId}" already exists. Do you want to overwrite it?`))return;this.loading=!0,this.evalService.addCurrentSession(this.data.appName,this.data.evalSetId,this.newCaseId,this.data.sessionId,this.data.userId).subscribe({next:e=>{this.dialogRef.close(!0)},error:e=>{this.loading=!1,alert("Failed to add session to eval set!")}})}}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-add-eval-session-dialog"]],decls:11,vars:3,consts:[["mat-dialog-title",""],[2,"display","flex","justify-content","center","padding","20px"],[2,"padding-left","20px","padding-right","24px"],["align","end"],["mat-button","","mat-dialog-close","",3,"disabled"],["mat-button","","cdkFocusInitial","",3,"click","disabled"],["mode","indeterminate",3,"diameter","strokeWidth"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"]],template:function(A,i){A&1&&(B(0,"h2",0),y(1,"Add Current Session To Eval Set"),Q(),B(2,"mat-dialog-content"),y(3,` Please enter the eval case name -`),Q(),O(4,C_A,2,2,"div",1)(5,I_A,2,1,"mat-form-field",2),B(6,"mat-dialog-actions",3)(7,"button",4),y(8,"Cancel"),Q(),B(9,"button",5),U("click",function(){return i.createNewEvalCase()}),y(10,"Create"),Q()()),A&2&&(u(4),Y(i.loading?4:5),u(3),H("disabled",i.loading),u(2),H("disabled",i.loading))},dependencies:[fa,Na,Ko,ua,ln,Dn,yn,ko,pa,pi,B2,gs],styles:["h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important}"]})};var d_A={allEvalSetsHeader:"Eval sets",createNewEvalSetTooltip:"Create new evaluation set",createNewEvalSetTitle:"Create New Evaluation Set",evalSetDescription:"An evaluation set is a curated collection of evaluation cases, where each case includes input-output examples for assessing agent performance.",createEvalSetButton:"Create Evaluation Set",runEvaluationButton:"Run All",runSelectedEvaluationButton:"Run Selected",viewEvalRunHistoryTooltip:"View eval run history",caseIdHeader:"Case ID",resultHeader:"Result",viewEvalRunResultTooltip:"View eval run result",passStatus:"Pass",failStatus:"Fail",passStatusCaps:"PASS",failStatusCaps:"FAIL",passedSuffix:"Passed",failedSuffix:"Failed",addSessionToSetButtonPrefix:"From Current Session",deleteEvalCaseTooltip:"Delete eval case",editEvalCaseTooltip:"Edit eval case",deleteEvalSetTooltip:"Delete eval set"},VtA=new kA("Eval Tab Messages",{factory:()=>d_A});function B_A(t,e){if(t&1){let A=QA();B(0,"mat-form-field",1)(1,"mat-label"),y(2,"Execution Mode"),Q(),B(3,"mat-select",6),U("selectionChange",function(n){T(A);let o=p();return J(o.executionMode=n.value)}),B(4,"mat-option",7),y(5,"Live"),Q(),B(6,"mat-option",8),y(7,"Replay"),Q()()()}if(t&2){let A=p();u(3),H("value",A.executionMode)}}var ov=class t{evalService=w(t0);featureFlagService=w(yr);data=w(qo);dialogRef=w(lo);newSetId=this.data.defaultName||"evalset_"+iv().slice(0,6);executionMode="live";isEvalV2Enabled=!1;constructor(){this.featureFlagService.isEvalV2Enabled().subscribe(e=>{this.isEvalV2Enabled=e})}createNewEvalSet(){if(!this.newSetId||this.newSetId=="")alert("Cannot create eval set with empty id!");else{let e=this.isEvalV2Enabled?this.executionMode:void 0;this.evalService.createNewEvalSet(this.data.appName,this.newSetId,e).subscribe(A=>{this.dialogRef.close(!0)})}}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-new-eval-set-dialog-component"]],decls:14,vars:2,consts:[["mat-dialog-title",""],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"],[3,"selectionChange","value"],["value","live"],["value","replay"]],template:function(A,i){A&1&&(B(0,"h2",0),y(1,"Create New Eval Set"),Q(),B(2,"mat-dialog-content"),y(3,` Please enter the eval set name -`),Q(),B(4,"mat-form-field",1)(5,"mat-label"),y(6,"Eval Set Name"),Q(),B(7,"input",2),Di("ngModelChange",function(o){return Bi(i.newSetId,o)||(i.newSetId=o),o}),U("keydown.enter",function(){return i.createNewEvalSet()}),Q()(),O(8,B_A,8,1,"mat-form-field",1),B(9,"mat-dialog-actions",3)(10,"button",4),y(11,"Cancel"),Q(),B(12,"button",5),U("click",function(){return i.createNewEvalSet()}),y(13,"Create"),Q()()),A&2&&(u(7),wi("ngModel",i.newSetId),u(),Y(i.isEvalV2Enabled?8:-1))},dependencies:[fa,Na,Ko,ua,ln,Dn,yn,ko,pa,pi,B2,$0,vs,Xl,Yr],styles:["h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important}"]})};var E_A=["knob"],h_A=["valueIndicatorContainer"];function Q_A(t,e){if(t&1&&(B(0,"div",2,1)(2,"div",5)(3,"span",6),y(4),Q()()()),t&2){let A=p();u(4),lA(A.valueIndicatorText)}}var u_A=["trackActive"],f_A=["*"];function p_A(t,e){if(t&1&&hA(0,"div"),t&2){let A=e.$implicit,i=e.$index,n=p(3);ro(A===0?"mdc-slider__tick-mark--active":"mdc-slider__tick-mark--inactive"),ut("transform",n._calcTickMarkTransform(i))}}function m_A(t,e){if(t&1&&Ue(0,p_A,1,4,"div",8,ws),t&2){let A=p(2);Te(A._tickMarks)}}function w_A(t,e){if(t&1&&(B(0,"div",6,1),O(2,m_A,2,0),Q()),t&2){let A=p();u(2),Y(A._cachedWidth?2:-1)}}function D_A(t,e){if(t&1&&hA(0,"mat-slider-visual-thumb",7),t&2){let A=p();H("discrete",A.discrete)("thumbPosition",1)("valueIndicatorText",A.startValueIndicatorText)}}var xi=(function(t){return t[t.START=1]="START",t[t.END=2]="END",t})(xi||{}),fQ=(function(t){return t[t.ACTIVE=0]="ACTIVE",t[t.INACTIVE=1]="INACTIVE",t})(fQ||{}),nF=new kA("_MatSlider"),WtA=new kA("_MatSliderThumb"),y_A=new kA("_MatSliderRangeThumb"),ZtA=new kA("_MatSliderVisualThumb");var v_A=(()=>{class t{_cdr=w(wt);_ngZone=w(qe);_slider=w(nF);_renderer=w(Pi);_listenerCleanups;discrete=!1;thumbPosition;valueIndicatorText;_ripple;_knob;_valueIndicatorContainer;_sliderInput;_sliderInputEl;_hoverRippleRef;_focusRippleRef;_activeRippleRef;_isHovered=!1;_isActive=!1;_isValueIndicatorVisible=!1;_hostElement=w(ce).nativeElement;_platform=w(gi);constructor(){}ngAfterViewInit(){let A=this._slider._getInput(this.thumbPosition);A&&(this._ripple.radius=24,this._sliderInput=A,this._sliderInputEl=this._sliderInput._hostElement,this._ngZone.runOutsideAngular(()=>{let i=this._sliderInputEl,n=this._renderer;this._listenerCleanups=[n.listen(i,"pointermove",this._onPointerMove),n.listen(i,"pointerdown",this._onDragStart),n.listen(i,"pointerup",this._onDragEnd),n.listen(i,"pointerleave",this._onMouseLeave),n.listen(i,"focus",this._onFocus),n.listen(i,"blur",this._onBlur)]}))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A())}_onPointerMove=A=>{if(this._sliderInput._isFocused)return;let i=this._hostElement.getBoundingClientRect(),n=this._slider._isCursorOnSliderThumb(A,i);this._isHovered=n,n?this._showHoverRipple():this._hideRipple(this._hoverRippleRef)};_onMouseLeave=()=>{this._isHovered=!1,this._hideRipple(this._hoverRippleRef)};_onFocus=()=>{this._hideRipple(this._hoverRippleRef),this._showFocusRipple(),this._hostElement.classList.add("mdc-slider__thumb--focused")};_onBlur=()=>{this._isActive||this._hideRipple(this._focusRippleRef),this._isHovered&&this._showHoverRipple(),this._hostElement.classList.remove("mdc-slider__thumb--focused")};_onDragStart=A=>{A.button===0&&(this._isActive=!0,this._showActiveRipple())};_onDragEnd=()=>{this._isActive=!1,this._hideRipple(this._activeRippleRef),this._sliderInput._isFocused||this._hideRipple(this._focusRippleRef),this._platform.SAFARI&&this._showHoverRipple()};_showHoverRipple(){this._isShowingRipple(this._hoverRippleRef)||(this._hoverRippleRef=this._showRipple({enterDuration:0,exitDuration:0}),this._hoverRippleRef?.element.classList.add("mat-mdc-slider-hover-ripple"))}_showFocusRipple(){this._isShowingRipple(this._focusRippleRef)||(this._focusRippleRef=this._showRipple({enterDuration:0,exitDuration:0},!0),this._focusRippleRef?.element.classList.add("mat-mdc-slider-focus-ripple"))}_showActiveRipple(){this._isShowingRipple(this._activeRippleRef)||(this._activeRippleRef=this._showRipple({enterDuration:225,exitDuration:400}),this._activeRippleRef?.element.classList.add("mat-mdc-slider-active-ripple"))}_isShowingRipple(A){return A?.state===ys.FADING_IN||A?.state===ys.VISIBLE}_showRipple(A,i){if(!this._slider.disabled&&(this._showValueIndicator(),this._slider._isRange&&this._slider._getThumb(this.thumbPosition===xi.START?xi.END:xi.START)._showValueIndicator(),!(this._slider._globalRippleOptions?.disabled&&!i)))return this._ripple.launch({animation:this._slider._noopAnimations?{enterDuration:0,exitDuration:0}:A,centered:!0,persistent:!0})}_hideRipple(A){if(A?.fadeOut(),this._isShowingAnyRipple())return;this._slider._isRange||this._hideValueIndicator();let i=this._getSibling();i._isShowingAnyRipple()||(this._hideValueIndicator(),i._hideValueIndicator())}_showValueIndicator(){this._hostElement.classList.add("mdc-slider__thumb--with-indicator")}_hideValueIndicator(){this._hostElement.classList.remove("mdc-slider__thumb--with-indicator")}_getSibling(){return this._slider._getThumb(this.thumbPosition===xi.START?xi.END:xi.START)}_getValueIndicatorContainer(){return this._valueIndicatorContainer?.nativeElement}_getKnob(){return this._knob.nativeElement}_isShowingAnyRipple(){return this._isShowingRipple(this._hoverRippleRef)||this._isShowingRipple(this._focusRippleRef)||this._isShowingRipple(this._activeRippleRef)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-slider-visual-thumb"]],viewQuery:function(i,n){if(i&1&&Jt(rs,5)(E_A,5)(h_A,5),i&2){let o;ae(o=re())&&(n._ripple=o.first),ae(o=re())&&(n._knob=o.first),ae(o=re())&&(n._valueIndicatorContainer=o.first)}},hostAttrs:[1,"mdc-slider__thumb","mat-mdc-slider-visual-thumb"],inputs:{discrete:"discrete",thumbPosition:"thumbPosition",valueIndicatorText:"valueIndicatorText"},features:[Bt([{provide:ZtA,useExisting:t}])],decls:4,vars:2,consts:[["knob",""],["valueIndicatorContainer",""],[1,"mdc-slider__value-indicator-container"],[1,"mdc-slider__thumb-knob"],["matRipple","",1,"mat-focus-indicator",3,"matRippleDisabled"],[1,"mdc-slider__value-indicator"],[1,"mdc-slider__value-indicator-text"]],template:function(i,n){i&1&&(O(0,Q_A,5,1,"div",2),hA(1,"div",3,0)(3,"div",4)),i&2&&(Y(n.discrete?0:-1),u(3),H("matRippleDisabled",!0))},dependencies:[rs],styles:[`.mat-mdc-slider-visual-thumb .mat-ripple{height:100%;width:100%}.mat-mdc-slider .mdc-slider__tick-marks{justify-content:start}.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--active,.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--inactive{position:absolute;left:2px} -`],encapsulation:2,changeDetection:0})}return t})(),XtA=(()=>{class t{_ngZone=w(qe);_cdr=w(wt);_elementRef=w(ce);_dir=w(fo,{optional:!0});_globalRippleOptions=w(r2,{optional:!0});_trackActive;_thumbs;_input;_inputs;get disabled(){return this._disabled}set disabled(A){this._disabled=A;let i=this._getInput(xi.END),n=this._getInput(xi.START);i&&(i.disabled=this._disabled),n&&(n.disabled=this._disabled)}_disabled=!1;get discrete(){return this._discrete}set discrete(A){this._discrete=A,this._updateValueIndicatorUIs()}_discrete=!1;get showTickMarks(){return this._showTickMarks}set showTickMarks(A){this._showTickMarks=A,this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI())}_showTickMarks=!1;get min(){return this._min}set min(A){let i=A==null||isNaN(A)?this._min:A;this._min!==i&&this._updateMin(i)}_min=0;color;disableRipple=!1;_updateMin(A){let i=this._min;this._min=A,this._isRange?this._updateMinRange({old:i,new:A}):this._updateMinNonRange(A),this._onMinMaxOrStepChange()}_updateMinRange(A){let i=this._getInput(xi.END),n=this._getInput(xi.START),o=i.value,a=n.value;n.min=A.new,i.min=Math.max(A.new,n.value),n.max=Math.min(i.max,i.value),n._updateWidthInactive(),i._updateWidthInactive(),A.newA.old?this._onTranslateXChangeBySideEffect(n,i):this._onTranslateXChangeBySideEffect(i,n),o!==i.value&&this._onValueChange(i),a!==n.value&&this._onValueChange(n)}_updateMaxNonRange(A){let i=this._getInput(xi.END);if(i){let n=i.value;i.max=A,i._updateThumbUIByValue(),this._updateTrackUI(i),n!==i.value&&this._onValueChange(i)}}get step(){return this._step}set step(A){let i=isNaN(A)?this._step:A;this._step!==i&&this._updateStep(i)}_step=1;_updateStep(A){this._step=A,this._isRange?this._updateStepRange():this._updateStepNonRange(),this._onMinMaxOrStepChange()}_updateStepRange(){let A=this._getInput(xi.END),i=this._getInput(xi.START),n=A.value,o=i.value,a=i.value;A.min=this._min,i.max=this._max,A.step=this._step,i.step=this._step,this._platform.SAFARI&&(A.value=A.value,i.value=i.value),A.min=Math.max(this._min,i.value),i.max=Math.min(this._max,A.value),i._updateWidthInactive(),A._updateWidthInactive(),A.value`${A}`;_tickMarks;_noopAnimations=An();_dirChangeSubscription;_resizeObserver=null;_cachedWidth;_cachedLeft;_rippleRadius=24;startValueIndicatorText="";endValueIndicatorText="";_endThumbTransform;_startThumbTransform;_isRange=!1;_isRtl=!1;_hasViewInitialized=!1;_tickMarkTrackWidth=0;_hasAnimation=!1;_resizeTimer=null;_platform=w(gi);constructor(){w(eo).load(lr),this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe(()=>this._onDirChange()),this._isRtl=this._dir.value==="rtl")}_knobRadius=8;_inputPadding;ngAfterViewInit(){this._platform.isBrowser&&this._updateDimensions();let A=this._getInput(xi.END),i=this._getInput(xi.START);this._isRange=!!A&&!!i,this._cdr.detectChanges();let n=this._getThumb(xi.END);this._rippleRadius=n._ripple.radius,this._inputPadding=this._rippleRadius-this._knobRadius,this._isRange?this._initUIRange(A,i):this._initUINonRange(A),this._updateTrackUI(A),this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._observeHostResize(),this._cdr.detectChanges()}_initUINonRange(A){A.initProps(),A.initUI(),this._updateValueIndicatorUI(A),this._hasViewInitialized=!0,A._updateThumbUIByValue()}_initUIRange(A,i){A.initProps(),A.initUI(),i.initProps(),i.initUI(),A._updateMinMax(),i._updateMinMax(),A._updateStaticStyles(),i._updateStaticStyles(),this._updateValueIndicatorUIs(),this._hasViewInitialized=!0,A._updateThumbUIByValue(),i._updateThumbUIByValue()}ngOnDestroy(){this._dirChangeSubscription?.unsubscribe(),this._resizeObserver?.disconnect(),this._resizeObserver=null}_onDirChange(){this._isRtl=this._dir?.value==="rtl",this._isRange?this._onDirChangeRange():this._onDirChangeNonRange(),this._updateTickMarkUI()}_onDirChangeRange(){let A=this._getInput(xi.END),i=this._getInput(xi.START);A._setIsLeftThumb(),i._setIsLeftThumb(),A.translateX=A._calcTranslateXByValue(),i.translateX=i._calcTranslateXByValue(),A._updateStaticStyles(),i._updateStaticStyles(),A._updateWidthInactive(),i._updateWidthInactive(),A._updateThumbUIByValue(),i._updateThumbUIByValue()}_onDirChangeNonRange(){this._getInput(xi.END)._updateThumbUIByValue()}_observeHostResize(){typeof ResizeObserver>"u"||!ResizeObserver||this._ngZone.runOutsideAngular(()=>{this._resizeObserver=new ResizeObserver(()=>{this._isActive()||(this._resizeTimer&&clearTimeout(this._resizeTimer),this._onResize())}),this._resizeObserver.observe(this._elementRef.nativeElement)})}_isActive(){return this._getThumb(xi.START)._isActive||this._getThumb(xi.END)._isActive}_getValue(A=xi.END){let i=this._getInput(A);return i?i.value:this.min}_skipUpdate(){return!!(this._getInput(xi.START)?._skipUIUpdate||this._getInput(xi.END)?._skipUIUpdate)}_updateDimensions(){this._cachedWidth=this._elementRef.nativeElement.offsetWidth,this._cachedLeft=this._elementRef.nativeElement.getBoundingClientRect().left}_setTrackActiveStyles(A){let i=this._trackActive.nativeElement.style;i.left=A.left,i.right=A.right,i.transformOrigin=A.transformOrigin,i.transform=A.transform}_calcTickMarkTransform(A){let i=A*(this._tickMarkTrackWidth/(this._tickMarks.length-1));return`translateX(${this._isRtl?this._cachedWidth-6-i:i}px)`}_onTranslateXChange(A){this._hasViewInitialized&&(this._updateThumbUI(A),this._updateTrackUI(A),this._updateOverlappingThumbUI(A))}_onTranslateXChangeBySideEffect(A,i){this._hasViewInitialized&&(A._updateThumbUIByValue(),i._updateThumbUIByValue())}_onValueChange(A){this._hasViewInitialized&&(this._updateValueIndicatorUI(A),this._updateTickMarkUI(),this._cdr.detectChanges())}_onMinMaxOrStepChange(){this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.markForCheck())}_onResize(){if(this._hasViewInitialized){if(this._updateDimensions(),this._isRange){let A=this._getInput(xi.END),i=this._getInput(xi.START);A._updateThumbUIByValue(),i._updateThumbUIByValue(),A._updateStaticStyles(),i._updateStaticStyles(),A._updateMinMax(),i._updateMinMax(),A._updateWidthInactive(),i._updateWidthInactive()}else{let A=this._getInput(xi.END);A&&A._updateThumbUIByValue()}this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.detectChanges()}}_thumbsOverlap=!1;_areThumbsOverlapping(){let A=this._getInput(xi.START),i=this._getInput(xi.END);return!A||!i?!1:i.translateX-A.translateX<20}_updateOverlappingThumbClassNames(A){let i=A.getSibling(),n=this._getThumb(A.thumbPosition);this._getThumb(i.thumbPosition)._hostElement.classList.remove("mdc-slider__thumb--top"),n._hostElement.classList.toggle("mdc-slider__thumb--top",this._thumbsOverlap)}_updateOverlappingThumbUI(A){!this._isRange||this._skipUpdate()||this._thumbsOverlap!==this._areThumbsOverlapping()&&(this._thumbsOverlap=!this._thumbsOverlap,this._updateOverlappingThumbClassNames(A))}_updateThumbUI(A){if(this._skipUpdate())return;let i=this._getThumb(A.thumbPosition===xi.END?xi.END:xi.START);i._hostElement.style.transform=`translateX(${A.translateX}px)`}_updateValueIndicatorUI(A){if(this._skipUpdate())return;let i=this.displayWith(A.value);if(this._hasViewInitialized?A._valuetext.set(i):A._hostElement.setAttribute("aria-valuetext",i),this.discrete){A.thumbPosition===xi.START?this.startValueIndicatorText=i:this.endValueIndicatorText=i;let n=this._getThumb(A.thumbPosition);i.length<3?n._hostElement.classList.add("mdc-slider__thumb--short-value"):n._hostElement.classList.remove("mdc-slider__thumb--short-value")}}_updateValueIndicatorUIs(){let A=this._getInput(xi.END),i=this._getInput(xi.START);A&&this._updateValueIndicatorUI(A),i&&this._updateValueIndicatorUI(i)}_updateTickMarkTrackUI(){if(!this.showTickMarks||this._skipUpdate())return;let A=this._step&&this._step>0?this._step:1,n=(Math.floor(this.max/A)*A-this.min)/(this.max-this.min);this._tickMarkTrackWidth=(this._cachedWidth-6)*n}_updateTrackUI(A){this._skipUpdate()||(this._isRange?this._updateTrackUIRange(A):this._updateTrackUINonRange(A))}_updateTrackUIRange(A){let i=A.getSibling();if(!i||!this._cachedWidth)return;let n=Math.abs(i.translateX-A.translateX)/this._cachedWidth;A._isLeftThumb&&this._cachedWidth?this._setTrackActiveStyles({left:"auto",right:`${this._cachedWidth-i.translateX}px`,transformOrigin:"right",transform:`scaleX(${n})`}):this._setTrackActiveStyles({left:`${i.translateX}px`,right:"auto",transformOrigin:"left",transform:`scaleX(${n})`})}_updateTrackUINonRange(A){this._isRtl?this._setTrackActiveStyles({left:"auto",right:"0px",transformOrigin:"right",transform:`scaleX(${1-A.fillPercentage})`}):this._setTrackActiveStyles({left:"0px",right:"auto",transformOrigin:"left",transform:`scaleX(${A.fillPercentage})`})}_updateTickMarkUI(){if(!this.showTickMarks||this.step===void 0||this.min===void 0||this.max===void 0)return;let A=this.step>0?this.step:1;this._isRange?this._updateTickMarkUIRange(A):this._updateTickMarkUINonRange(A)}_updateTickMarkUINonRange(A){let i=this._getValue(),n=Math.max(Math.round((i-this.min)/A),0)+1,o=Math.max(Math.round((this.max-i)/A),0)-1;this._isRtl?n++:o++,this._tickMarks=Array(n).fill(fQ.ACTIVE).concat(Array(o).fill(fQ.INACTIVE))}_updateTickMarkUIRange(A){let i=this._getValue(),n=this._getValue(xi.START),o=Math.max(Math.round((n-this.min)/A),0),a=Math.max(Math.round((i-n)/A)+1,0),r=Math.max(Math.round((this.max-i)/A),0);this._tickMarks=Array(o).fill(fQ.INACTIVE).concat(Array(a).fill(fQ.ACTIVE),Array(r).fill(fQ.INACTIVE))}_getInput(A){if(A===xi.END&&this._input)return this._input;if(this._inputs?.length)return A===xi.START?this._inputs.first:this._inputs.last}_getThumb(A){return A===xi.END?this._thumbs?.last:this._thumbs?.first}_setTransition(A){this._hasAnimation=!this._platform.IOS&&A&&!this._noopAnimations,this._elementRef.nativeElement.classList.toggle("mat-mdc-slider-with-animation",this._hasAnimation)}_isCursorOnSliderThumb(A,i){let n=i.width/2,o=i.x+n,a=i.y+n,r=A.clientX-o,s=A.clientY-a;return Math.pow(r,2)+Math.pow(s,2)oF),multi:!0};var oF=(()=>{class t{_ngZone=w(qe);_elementRef=w(ce);_cdr=w(wt);_slider=w(nF);_platform=w(gi);_listenerCleanups;get value(){return Cn(this._hostElement.value,0)}set value(A){A===null&&(A=this._getDefaultValue()),A=isNaN(A)?0:A;let i=A+"";if(!this._hasSetInitialValue){this._initialValue=i;return}this._isActive||this._setValue(i)}_setValue(A){this._hostElement.value=A,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges(),this._slider._cdr.markForCheck()}valueChange=new LA;dragStart=new LA;dragEnd=new LA;get translateX(){return this._slider.min>=this._slider.max?(this._translateX=this._tickMarkOffset,this._translateX):(this._translateX===void 0&&(this._translateX=this._calcTranslateXByValue()),this._translateX)}set translateX(A){this._translateX=A}_translateX;thumbPosition=xi.END;get min(){return Cn(this._hostElement.min,0)}set min(A){this._hostElement.min=A+"",this._cdr.detectChanges()}get max(){return Cn(this._hostElement.max,0)}set max(A){this._hostElement.max=A+"",this._cdr.detectChanges()}get step(){return Cn(this._hostElement.step,0)}set step(A){this._hostElement.step=A+"",this._cdr.detectChanges()}get disabled(){return Be(this._hostElement.disabled)}set disabled(A){this._hostElement.disabled=A,this._cdr.detectChanges(),this._slider.disabled!==this.disabled&&(this._slider.disabled=this.disabled)}get percentage(){return this._slider.min>=this._slider.max?this._slider._isRtl?1:0:(this.value-this._slider.min)/(this._slider.max-this._slider.min)}get fillPercentage(){return this._slider._cachedWidth?this._translateX===0?0:this.translateX/this._slider._cachedWidth:this._slider._isRtl?1:0}_hostElement=this._elementRef.nativeElement;_valuetext=bA("");_knobRadius=8;_tickMarkOffset=3;_isActive=!1;_isFocused=!1;_setIsFocused(A){this._isFocused=A}_hasSetInitialValue=!1;_initialValue;_formControl;_destroyed=new ie;_skipUIUpdate=!1;_onChangeFn;_onTouchedFn=()=>{};_isControlInitialized=!1;constructor(){let A=w(Pi);this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[A.listen(this._hostElement,"pointerdown",this._onPointerDown.bind(this)),A.listen(this._hostElement,"pointermove",this._onPointerMove.bind(this)),A.listen(this._hostElement,"pointerup",this._onPointerUp.bind(this))]})}ngOnDestroy(){this._listenerCleanups.forEach(A=>A()),this._destroyed.next(),this._destroyed.complete(),this.dragStart.complete(),this.dragEnd.complete()}initProps(){this._updateWidthInactive(),this.disabled!==this._slider.disabled&&(this._slider.disabled=!0),this.step=this._slider.step,this.min=this._slider.min,this.max=this._slider.max,this._initValue()}initUI(){this._updateThumbUIByValue()}_initValue(){this._hasSetInitialValue=!0,this._initialValue===void 0?this.value=this._getDefaultValue():(this._hostElement.value=this._initialValue,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges())}_getDefaultValue(){return this.min}_onBlur(){this._setIsFocused(!1),this._onTouchedFn()}_onFocus(){this._slider._setTransition(!1),this._slider._updateTrackUI(this),this._setIsFocused(!0)}_onChange(){this.valueChange.emit(this.value),this._isActive&&this._updateThumbUIByValue({withAnimation:!0})}_onInput(){this._onChangeFn?.(this.value),(this._slider.step||!this._isActive)&&this._updateThumbUIByValue({withAnimation:!0}),this._slider._onValueChange(this)}_onNgControlValueChange(){(!this._isActive||!this._isFocused)&&(this._slider._onValueChange(this),this._updateThumbUIByValue()),this._slider.disabled=this._formControl.disabled}_onPointerDown(A){if(!(this.disabled||A.button!==0)){if(this._platform.IOS){let i=this._slider._isCursorOnSliderThumb(A,this._slider._getThumb(this.thumbPosition)._hostElement.getBoundingClientRect());this._isActive=i,this._updateWidthActive(),this._slider._updateDimensions();return}this._isActive=!0,this._setIsFocused(!0),this._updateWidthActive(),this._slider._updateDimensions(),this._slider.step||this._updateThumbUIByPointerEvent(A,{withAnimation:!0}),this.disabled||(this._handleValueCorrection(A),this.dragStart.emit({source:this,parent:this._slider,value:this.value}))}}_handleValueCorrection(A){this._skipUIUpdate=!0,setTimeout(()=>{this._skipUIUpdate=!1,this._fixValue(A)},0)}_fixValue(A){let i=A.clientX-this._slider._cachedLeft,n=this._slider._cachedWidth,o=this._slider.step===0?1:this._slider.step,a=Math.floor((this._slider.max-this._slider.min)/o),r=this._slider._isRtl?1-i/n:i/n,l=Math.round(r*a)/a*(this._slider.max-this._slider.min)+this._slider.min,g=Math.round(l/o)*o,C=this.value;if(g===C){this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation});return}this.value=g,this.valueChange.emit(this.value),this._onChangeFn?.(this.value),this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation})}_onPointerMove(A){!this._slider.step&&this._isActive&&this._updateThumbUIByPointerEvent(A)}_onPointerUp(){this._isActive&&(this._isActive=!1,this._platform.SAFARI&&this._setIsFocused(!1),this.dragEnd.emit({source:this,parent:this._slider,value:this.value}),setTimeout(()=>this._updateWidthInactive(),this._platform.IOS?10:0))}_clamp(A){let i=this._tickMarkOffset,n=this._slider._cachedWidth-this._tickMarkOffset;return Math.max(Math.min(A,n),i)}_calcTranslateXByValue(){return this._slider._isRtl?(1-this.percentage)*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset:this.percentage*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset}_calcTranslateXByPointerEvent(A){return A.clientX-this._slider._cachedLeft}_updateWidthActive(){}_updateWidthInactive(){this._hostElement.style.padding=`0 ${this._slider._inputPadding}px`,this._hostElement.style.width=`calc(100% + ${this._slider._inputPadding-this._tickMarkOffset*2}px)`,this._hostElement.style.left=`-${this._slider._rippleRadius-this._tickMarkOffset}px`}_updateThumbUIByValue(A){this.translateX=this._clamp(this._calcTranslateXByValue()),this._updateThumbUI(A)}_updateThumbUIByPointerEvent(A,i){this.translateX=this._clamp(this._calcTranslateXByPointerEvent(A)),this._updateThumbUI(i)}_updateThumbUI(A){this._slider._setTransition(!!A?.withAnimation),this._slider._onTranslateXChange(this)}writeValue(A){(this._isControlInitialized||A!==null)&&(this.value=A)}registerOnChange(A){this._onChangeFn=A,this._isControlInitialized=!0}registerOnTouched(A){this._onTouchedFn=A}setDisabledState(A){this.disabled=A}focus(){this._hostElement.focus()}blur(){this._hostElement.blur()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["input","matSliderThumb",""]],hostAttrs:["type","range",1,"mdc-slider__input"],hostVars:1,hostBindings:function(i,n){i&1&&U("change",function(){return n._onChange()})("input",function(){return n._onInput()})("blur",function(){return n._onBlur()})("focus",function(){return n._onFocus()}),i&2&&te("aria-valuetext",n._valuetext())},inputs:{value:[2,"value","value",Cn]},outputs:{valueChange:"valueChange",dragStart:"dragStart",dragEnd:"dragEnd"},exportAs:["matSliderThumb"],features:[Bt([b_A,{provide:WtA,useExisting:t}])]})}return t})();var JI=class t{transform(e){if(!e)return"";let A=e.replace(/(_avg_score|_score|avg_score)$/,"");return A=A.replace(/_/g," "),A.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" ")}static \u0275fac=function(A){return new(A||t)};static \u0275pipe=Xv({name:"formatMetricName",type:t,pure:!0})};function M_A(t,e){if(t&1&&(B(0,"div",9)(1,"div",10)(2,"mat-checkbox",11)(3,"div",12)(4,"span",13),y(5),Ht(6,"formatMetricName"),Q(),B(7,"span",14),y(8),Q()()(),B(9,"div",15)(10,"div",16)(11,"span",17),y(12,"Threshold"),Q(),B(13,"div",18)(14,"mat-slider",19),hA(15,"input",20),Q(),B(16,"span",21),y(17),Q()()()()()()),t&2){let A,i=e.$implicit,n=p(2);u(2),H("formControlName",i.metricName+"_selected"),u(2),H("matTooltip",i.metricName),u(),lA(si(6,10,i.metricName)),u(3),lA(i.description),u(),ut("visibility",(A=n.evalForm.get(i.metricName+"_selected"))!=null&&A.value?"visible":"hidden"),u(5),H("min",i.metricValueInfo.interval.minValue)("max",i.metricValueInfo.interval.maxValue),u(),H("formControlName",i.metricName+"_threshold"),u(2),ue(" ",n.evalForm.controls[i.metricName+"_threshold"].value," ")}}function S_A(t,e){if(t&1&&(B(0,"div"),Et(1,M_A,18,12,"div",8),Q()),t&2){let A=p();u(),H("ngForOf",A.metricsInfo)}}function k_A(t,e){if(t&1&&(B(0,"div")(1,"div",9)(2,"div",10)(3,"mat-checkbox",22)(4,"span",13),y(5),Ht(6,"formatMetricName"),Q()(),B(7,"div",15)(8,"div",16)(9,"span",17),y(10,"Threshold"),Q(),B(11,"div",18)(12,"mat-slider",23),hA(13,"input",24),Q(),B(14,"span",21),y(15),Q()()()()()(),B(16,"div",9)(17,"div",10)(18,"mat-checkbox",25)(19,"span",13),y(20),Ht(21,"formatMetricName"),Q()(),B(22,"div",15)(23,"div",16)(24,"span",17),y(25,"Threshold"),Q(),B(26,"div",18)(27,"mat-slider",23),hA(28,"input",26),Q(),B(29,"span",21),y(30),Q()()()()()()()),t&2){let A,i,n=p();u(4),H("matTooltip","tool_trajectory_avg_score"),u(),lA(si(6,10,"tool_trajectory_avg_score")),u(2),ut("visibility",(A=n.evalForm.get("tool_trajectory_avg_score_selected"))!=null&&A.value?"visible":"hidden"),u(8),ue(" ",n.evalForm.controls.tool_trajectory_avg_score_threshold.value," "),u(4),H("matTooltip","response_match_score"),u(),lA(si(21,12,"response_match_score")),u(2),ut("visibility",(i=n.evalForm.get("response_match_score_selected"))!=null&&i.value?"visible":"hidden"),u(8),ue(" ",n.evalForm.controls.response_match_score_threshold.value," ")}}var av=class t{constructor(e,A,i){this.dialogRef=e;this.fb=A;this.data=i;this.evalMetrics=this.data.evalMetrics||[],this.metricsInfo=this.data.metricsInfo||[],this.evalForm=this.fb.group({}),this.metricsInfo.forEach(n=>{let o=this.evalMetrics.find(l=>l.metricName===n.metricName),a=!!o,r=o?o.threshold:this.getDefaultThreshold(n);this.evalForm.addControl(`${n.metricName}_selected`,this.fb.control(a));let s=n.metricValueInfo.interval;this.evalForm.addControl(`${n.metricName}_threshold`,this.fb.control(r,[Ys.required,Ys.min(s.minValue),Ys.max(s.maxValue)]))}),this.metricsInfo.length===0&&this.addDefaultControls()}evalForm;evalMetrics=[];metricsInfo=[];addDefaultControls(){[{name:"tool_trajectory_avg_score",min:0,max:1,default:1},{name:"response_match_score",min:0,max:1,default:.7}].forEach(A=>{let i=this.evalMetrics.find(a=>a.metricName===A.name),n=!!i,o=i?i.threshold:A.default;this.evalForm.addControl(`${A.name}_selected`,this.fb.control(n)),this.evalForm.addControl(`${A.name}_threshold`,this.fb.control(o,[Ys.required,Ys.min(A.min),Ys.max(A.max)]))})}getDefaultThreshold(e){return e.metricName==="tool_trajectory_avg_score"?1:e.metricName==="response_match_score"?.7:e.metricValueInfo.interval.maxValue}onReset(){this.metricsInfo.forEach(e=>{let A=uQ.find(o=>o.metricName===e.metricName),i=!!A,n=A?A.threshold:this.getDefaultThreshold(e);this.evalForm.get(`${e.metricName}_selected`)?.setValue(i),this.evalForm.get(`${e.metricName}_threshold`)?.setValue(n)}),this.metricsInfo.length===0&&uQ.forEach(e=>{this.evalForm.get(`${e.metricName}_selected`)?.setValue(!0),this.evalForm.get(`${e.metricName}_threshold`)?.setValue(e.threshold)})}onStart(){if(this.evalForm.valid){let e=[];this.metricsInfo.length>0?this.metricsInfo.forEach(A=>{if(this.evalForm.get(`${A.metricName}_selected`)?.value){let n=this.evalForm.get(`${A.metricName}_threshold`)?.value;e.push({metricName:A.metricName,threshold:n})}}):["tool_trajectory_avg_score","response_match_score"].forEach(i=>{if(this.evalForm.get(`${i}_selected`)?.value){let o=this.evalForm.get(`${i}_threshold`)?.value;e.push({metricName:i,threshold:o})}}),this.dialogRef.close(e)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(YL),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-run-eval-config-dialog"]],decls:14,vars:3,consts:[[1,"dialog-container"],["mat-dialog-title","",1,"dialog-title"],[1,"eval-form",3,"formGroup"],[4,"ngIf"],["align","end",1,"dialog-actions"],["mat-button","",1,"reset-button",3,"click"],["mat-button","",1,"cancel-button",3,"click"],["mat-button","",1,"save-button",3,"click"],["class","metric-container",4,"ngFor","ngForOf"],[1,"metric-container"],[1,"metric-header"],[3,"formControlName"],[2,"display","flex","flex-direction","column"],[1,"metric-title",3,"matTooltip"],[1,"metric-description"],[1,"metric-slider-container","inline-slider"],[2,"display","flex","flex-direction","column","align-items","flex-start"],[1,"slider-label",2,"margin-right","0","font-size","11px","color","var(--mat-sys-on-surface-variant)"],[2,"display","flex","align-items","center"],["step","0.1","thumbLabel","",1,"threshold-slider",3,"min","max"],["matSliderThumb","",3,"formControlName"],[1,"threshold-value"],["formControlName","tool_trajectory_avg_score_selected"],["min","0","max","1","step","0.1","thumbLabel","",1,"threshold-slider"],["matSliderThumb","","formControlName","tool_trajectory_avg_score_threshold"],["formControlName","response_match_score_selected"],["matSliderThumb","","formControlName","response_match_score_threshold"]],template:function(A,i){A&1&&(B(0,"div",0)(1,"h2",1),y(2,"EVALUATION METRICS"),Q(),B(3,"mat-dialog-content")(4,"form",2),Et(5,S_A,2,1,"div",3)(6,k_A,31,14,"div",3),Q()(),B(7,"mat-dialog-actions",4)(8,"button",5),U("click",function(){return i.onReset()}),y(9,"Reset to Default"),Q(),B(10,"button",6),U("click",function(){return i.onCancel()}),y(11,"Cancel"),Q(),B(12,"button",7),U("click",function(){return i.onStart()}),y(13,"Start"),Q()()()),A&2&&(u(4),H("formGroup",i.evalForm),u(),H("ngIf",i.metricsInfo.length>0),u(),H("ngIf",i.metricsInfo.length===0))},dependencies:[fa,Na,ln,JL,Dn,yn,NL,n2,i2,Qb,XtA,oF,pa,pi,ec,li,A2,Js,dn,JI],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:12px;width:680px;box-shadow:0 8px 16px var(--run-eval-config-dialog-container-box-shadow-color)}.metric-container[_ngcontent-%COMP%]{margin-bottom:6px;padding-bottom:4px;border-bottom:1px solid var(--run-eval-config-dialog-border-color, #e0e0e0)}.metric-container[_ngcontent-%COMP%]:last-child{border-bottom:none}.metric-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;margin-bottom:2px}.metric-title[_ngcontent-%COMP%]{font-weight:600;font-size:1em}.metric-description[_ngcontent-%COMP%]{font-size:.85em;color:var(--run-eval-config-dialog-description-color, #666);margin-top:2px;white-space:normal}.metric-slider-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-left:28px}.inline-slider[_ngcontent-%COMP%]{margin-left:20px;flex:1;display:flex;justify-content:flex-end;align-items:center}.slider-label[_ngcontent-%COMP%]{margin-right:10px;font-size:.9em}.threshold-slider[_ngcontent-%COMP%]{max-width:80px;flex:1}.threshold-value[_ngcontent-%COMP%]{margin-left:10px;min-width:30px;text-align:right}h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}"]})};var kc=class t{constructor(e,A){this.dialogRef=e;this.data=A}onConfirm(){this.dialogRef.close(!0)}onCancel(){this.dialogRef.close(!1)}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-delete-session-dialog"]],decls:11,vars:4,consts:[[1,"confirm-delete-wrapper"],["mat-dialog-title",""],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(B(0,"div",0)(1,"h2",1),y(2),Q(),B(3,"mat-dialog-content")(4,"p"),y(5),Q()(),B(6,"mat-dialog-actions",2)(7,"button",3),U("click",function(){return i.onCancel()}),y(8),Q(),B(9,"button",4),U("click",function(){return i.onConfirm()}),y(10),Q()()()),A&2&&(u(2),lA(i.data.title),u(3),lA(i.data.message),u(3),lA(i.data.cancelButtonText),u(2),lA(i.data.confirmButtonText))},dependencies:[fa,Na,pa,pi],encapsulation:2})};var x_A=["app-info-table",""],__A=["*"];function R_A(t,e){if(t&1&&(wn(0,"thead")(1,"tr")(2,"th",2),y(3),Gn()()()),t&2){let A=p();u(3),lA(A.title())}}var OI=class t{title=me();static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["table","app-info-table",""]],hostAttrs:[1,"info-table"],inputs:{title:[1,"title"]},attrs:x_A,ngContentSelectors:__A,decls:6,vars:1,consts:[[1,"label-col"],[1,"value-col"],["colspan","2"]],template:function(A,i){A&1&&(Rt(),wn(0,"colgroup"),Kn(1,"col",0)(2,"col",1),Gn(),O(3,R_A,4,1,"thead"),wn(4,"tbody"),Ve(5),Gn()),A&2&&(u(3),Y(i.title()?3:-1))},styles:["[_nghost-%COMP%]{display:table;width:100%;border-collapse:separate;border-spacing:0;font-family:inherit;font-size:13px;background-color:var(--mat-sys-surface);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;overflow:hidden;table-layout:fixed}[_nghost-%COMP%] thead[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-low)}[_nghost-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{text-align:left;padding:12px 16px;font-weight:500;color:var(--mat-sys-on-surface);border-bottom:1px solid var(--mat-sys-outline-variant)}[_nghost-%COMP%] .label-col[_ngcontent-%COMP%]{width:30%}[_nghost-%COMP%] tbody tr td{padding:10px 16px;color:var(--mat-sys-on-surface-variant);border-bottom:1px solid var(--mat-sys-outline-variant);overflow:hidden;overflow-wrap:anywhere}[_nghost-%COMP%] tbody tr td:first-child{font-weight:500;color:var(--mat-sys-on-surface);background-color:var(--mat-sys-surface-container-lowest);border-right:1px solid var(--mat-sys-outline-variant)}[_nghost-%COMP%] tbody tr:last-child td{border-bottom:none}"]})};var $tA=(t,e)=>e.timestamp,N_A=(t,e)=>e.evalId;function F_A(t,e){t&1&&(B(0,"span",3),y(1,"Eval Sets"),Q())}function L_A(t,e){if(t&1){let A=QA();B(0,"span",9),U("click",function(){T(A);let n=p(2);return J(n.goToEvalSet())}),y(1),Q()}if(t&2){let A=p(2);u(),lA(A.selectedEvalSet())}}function G_A(t,e){if(t&1&&(B(0,"span",8),y(1),Q()),t&2){let A=p(2);u(),lA(A.selectedEvalSet())}}function K_A(t,e){if(t&1&&(B(0,"span",6),y(1,">"),Q(),O(2,L_A,2,1,"span",7)(3,G_A,2,1,"span",8)),t&2){let A=p();u(2),Y(A.selectedEvalTab()==="history"||A.selectedHistoryRun()||A.selectedEvalCase()?2:3)}}function U_A(t,e){t&1&&(B(0,"span",6),y(1,">"),Q(),B(2,"span",10),y(3,"Eval Cases"),Q())}function T_A(t,e){t&1&&(B(0,"span",6),y(1,">"),Q(),B(2,"span",11),y(3,"Runs"),Q())}function J_A(t,e){if(t&1&&(B(0,"span",6),y(1,">"),Q(),B(2,"span",12),y(3),Q()),t&2){let A=p();u(3),lA(A.formatTimestamp(A.selectedHistoryRun()))}}function O_A(t,e){if(t&1&&(B(0,"span",6),y(1,">"),Q(),B(2,"span",13),y(3),Q()),t&2){let A,i=p();u(3),lA((A=i.selectedEvalCase())==null?null:A.evalId)}}function Y_A(t,e){if(t&1){let A=QA();B(0,"button",14),U("click",function(){T(A);let n=p();return J(n.openNewEvalSetDialog())}),B(1,"mat-icon"),y(2,"add"),Q(),y(3," New "),Q(),B(4,"button",15),U("click",function(){T(A);let n=p();return J(n.getEvalSet())}),B(5,"mat-icon"),y(6,"refresh"),Q()()}if(t&2){let A=p();H("matTooltip",A.i18n.createNewEvalSetTooltip)}}function H_A(t,e){}function z_A(t,e){if(t&1){let A=QA();B(0,"div")(1,"div",16)(2,"div",17),y(3),Q(),B(4,"div",18),y(5),Q(),B(6,"div",19),U("click",function(){T(A);let n=p();return J(n.openNewEvalSetDialog())}),y(7),Q()()()}if(t&2){let A=p();u(3),ue(" ",A.i18n.createNewEvalSetTitle," "),u(2),ue(" ",A.i18n.evalSetDescription," "),u(2),ue(" ",A.i18n.createEvalSetButton," ")}}function P_A(t,e){if(t&1){let A=QA();B(0,"div",21),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.selectEvalSet(n))}),B(1,"div",22)(2,"span",23),y(3,"folder"),Q(),B(4,"div",24),y(5),Q()(),B(6,"div",25)(7,"button",26),U("click",function(n){let o=T(A).$implicit,a=p(2);return J(a.confirmDeleteEvalSet(n,o))}),B(8,"mat-icon"),y(9,"delete"),Q()()()()}if(t&2){let A=e.$implicit,i=p(2);u(5),lA(A),u(2),H("matTooltip",i.i18n.deleteEvalSetTooltip)}}function j_A(t,e){if(t&1&&(B(0,"div"),Ue(1,P_A,10,2,"div",20,ri),Q()),t&2){let A=p();u(),Te(A.evalsets)}}function q_A(t,e){t&1&&(B(0,"div",33),hA(1,"mat-progress-spinner",34),Q()),t&2&&(u(),H("diameter",28)("strokeWidth",3))}function V_A(t,e){if(t&1&&(B(0,"tr")(1,"td"),y(2,"Execution Mode"),Q(),B(3,"td")(4,"span",37),y(5),Q()()()),t&2){let A,i,n=p(4);u(4),H("matTooltip",((A=n.currentEvalSet())==null?null:A.model_execution_mode)||"N/A"),u(),lA(((i=n.currentEvalSet())==null?null:i.model_execution_mode)||"N/A")}}function W_A(t,e){if(t&1&&(B(0,"div",35)(1,"table",36)(2,"tr")(3,"td"),y(4,"Name"),Q(),B(5,"td")(6,"span",37),y(7),Q()()(),O(8,V_A,6,2,"tr"),B(9,"tr")(10,"td"),y(11,"Total Cases"),Q(),B(12,"td")(13,"span",37),y(14),Q()()(),B(15,"tr")(16,"td"),y(17,"Total Runs"),Q(),B(18,"td")(19,"span",37),y(20),Q()()()()()),t&2){let A=p(3);u(6),H("matTooltip",A.selectedEvalSet()),u(),lA(A.selectedEvalSet()),u(),Y(A.isEvalV2Enabled()?8:-1),u(5),H("matTooltip",A.evalCases.length.toString()),u(),lA(A.evalCases.length),u(5),H("matTooltip",A.getEvalHistoryOfCurrentSetSorted().length.toString()),u(),lA(A.getEvalHistoryOfCurrentSetSorted().length)}}function Z_A(t,e){if(t&1){let A=QA();B(0,"div",45),U("click",function(){let n=T(A).$implicit,o=p(6);return J(o.getEvalCase(n))}),B(1,"mat-checkbox",46),U("click",function(n){return n.stopPropagation()})("change",function(n){let o=T(A).$implicit,a=p(6);return J(n?a.selection.toggle(o):null)}),Q(),B(2,"div",47),y(3),Q(),B(4,"button",48),U("click",function(n){let o=T(A).$implicit,a=p(6);return J(a.requestEditEvalCase(n,o))}),B(5,"mat-icon"),y(6,"edit"),Q()(),B(7,"button",26),U("click",function(n){let o=T(A).$implicit,a=p(6);return J(a.confirmDeleteEvalCase(n,o))}),B(8,"mat-icon"),y(9,"delete"),Q()()()}if(t&2){let A,i=e.$implicit,n=p(6);RA("selected-row",i===((A=n.selectedEvalCase())==null?null:A.evalId)),u(),H("checked",n.selection.isSelected(i)),u(2),ue(" ",i," "),u(),H("matTooltip",n.i18n.editEvalCaseTooltip),u(3),H("matTooltip",n.i18n.deleteEvalCaseTooltip)}}function X_A(t,e){if(t&1&&(B(0,"div",43),Ue(1,Z_A,10,6,"div",44,ri),Q()),t&2){let A=p(5);u(),Te(A.evalCases)}}function $_A(t,e){if(t&1){let A=QA();B(0,"div",39)(1,"mat-checkbox",40),U("change",function(n){T(A);let o=p(4);return J(n?o.toggleAllRows():null)}),Q(),B(2,"button",41),U("click",function(){T(A);let n=p(4);return J(n.openEvalConfigDialog())}),B(3,"mat-icon"),y(4,"play_arrow"),Q(),y(5),Q(),B(6,"button",42),U("click",function(){T(A);let n=p(4);return J(n.openNewEvalCaseDialog())}),B(7,"mat-icon"),y(8,"add"),Q(),y(9),Q(),hA(10,"span",4),B(11,"button",15),U("click",function(){T(A);let n=p(4);return J(n.listEvalCases())}),B(12,"mat-icon"),y(13,"refresh"),Q()()(),O(14,X_A,3,0,"div",43)}if(t&2){let A=p(4);u(),H("checked",A.selection.hasValue()&&A.isAllSelected())("indeterminate",A.selection.hasValue()&&!A.isAllSelected()),u(),H("disabled",A.evalCases.length==0),u(3),ue(" ",A.isAllSelected()||A.selection.isEmpty()?A.i18n.runEvaluationButton:A.i18n.runSelectedEvaluationButton," "),u(4),ue(" ",A.i18n.addSessionToSetButtonPrefix," "),u(5),Y(A.evalCases.length>0?14:-1)}}function ARA(t,e){if(t&1){let A=QA();B(0,"div",54),U("click",function(){let n=T(A).$implicit,o=p(5);return J(o.getHistorySession(n.result,n.timestamp))}),B(1,"div",47),y(2),Q(),hA(3,"div",4),B(4,"div",55)(5,"span",56),y(6),Q()()()}if(t&2){let A=e.$implicit,i=e.$index;p();let n=zn(7),o=p(4);RA("selected-row",A.timestamp==o.selectedHistoryRun()),u(2),ba(" #",n.length-i," ",o.formatTimestamp(A.timestamp)," "),u(3),H("ngClass",o.isMetricsSucceed(A.result)?"status-card__passed":"status-card__failed"),u(),ue(" ",o.getMetricsScore(A.result)," ")}}function eRA(t,e){t&1&&(B(0,"div",53),y(1," No runs found for this case. "),Q())}function tRA(t,e){if(t&1&&(B(0,"div",38)(1,"div",49)(2,"h3",50),y(3),Q()(),B(4,"h4",51),y(5,"Past Runs"),Q(),B(6,"div",43),ta(7),Ue(8,ARA,7,6,"div",52,$tA),O(10,eRA,2,0,"div",53),Q()()),t&2){let A=p(4),i=A.selectedEvalCase();u(3),ue("Case: ",i.evalId),u(4);let n=ga(A.caseHistory());u(),Te(n),u(2),Y(n.length===0?10:-1)}}function iRA(t,e){t&1&&(B(0,"div",16)(1,"div",17),y(2,"No Eval Cases"),Q(),B(3,"div",18),y(4,"Add a session to this set to get started."),Q()())}function nRA(t,e){if(t&1&&(B(0,"div"),O(1,$_A,15,6)(2,tRA,11,3,"div",38),O(3,iRA,5,0,"div",16),Q()),t&2){let A=p(3);u(),Y(A.selectedEvalCase()?2:1),u(2),Y(A.evalCases.length===0?3:-1)}}function oRA(t,e){t&1&&(B(0,"div",16)(1,"div",17),y(2,"No Runs"),Q(),B(3,"div",18),y(4,"Run an evaluation to see results here."),Q()())}function aRA(t,e){if(t&1){let A=QA();B(0,"div",45),U("click",function(){let n=T(A).$implicit,o=p(6);return J(o.selectedHistoryRun.set(n.timestamp))}),B(1,"div",47),y(2),Q(),hA(3,"div",4),B(4,"div",59)(5,"span",60),y(6),Q(),B(7,"span",61),y(8,"|"),Q(),B(9,"span",62),y(10),Q()()()}if(t&2){let A=e.$implicit,i=e.$index;p(3);let n=zn(0),o=p(3);u(2),ba(" #",n.length-i," ",o.formatTimestamp(A.timestamp)," "),u(4),ba("",o.getPassCountForCurrentResult(A.evaluationResults.evaluationResults)," ",o.i18n.passStatusCaps),u(3),ut("color",o.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)===0?"gray":""),u(),ba("",o.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)," ",o.i18n.failStatusCaps)}}function rRA(t,e){if(t&1&&(B(0,"div",43),Ue(1,aRA,11,8,"div",58,$tA),Q()),t&2){p(2);let A=zn(0);u(),Te(A)}}function sRA(t,e){if(t&1&&(B(0,"span",61),y(1,"|"),Q(),B(2,"span",62),y(3),Q()),t&2){p(2);let A=zn(1),i=p(5);u(3),ba("",i.getFailCountForCurrentResult(A.evaluationResults)," ",i.i18n.failStatusCaps)}}function lRA(t,e){if(t&1&&(B(0,"span",69)(1,"span",70),y(2),Ht(3,"formatMetricName"),Q(),y(4,": "),B(5,"span",71),y(6),Ht(7,"number"),Q()()),t&2){let A=e.$implicit;u(),H("matTooltip",A.metricName),u(),lA(si(3,3,A.metricName)),u(4),lA(T0(7,5,A.threshold,"1.2-2"))}}function gRA(t,e){if(t&1&&(B(0,"div",66),Ue(1,lRA,8,8,"span",69,ri),Q()),t&2){let A=p(7);u(),Te(A.currentHistoryMetrics())}}function cRA(t,e){if(t&1){let A=QA();B(0,"div",72),U("click",function(){let n=T(A).$implicit;p(2);let o=zn(0),a=p(5);return J(a.getHistorySession(n,o))}),B(1,"span"),y(2),Q(),B(3,"span",73),y(4),Q()()}if(t&2){let A=e.$implicit,i=p(7);u(2),ue(" ",A.evalId," "),u(),H("ngClass",i.isMetricsSucceed(A)?"status-card__passed":"status-card__failed"),u(),ue(" ",i.getMetricsScore(A)," ")}}function CRA(t,e){if(t&1&&(B(0,"div",63)(1,"div",64)(2,"div",65)(3,"div",59)(4,"span",60),y(5),Q(),O(6,sRA,4,2),Q(),O(7,gRA,3,0,"div",66),Q()()(),B(8,"div",67),Ue(9,cRA,5,3,"div",68,N_A),Q()),t&2){p();let A=zn(1),i=p(5);u(5),ba("",i.getPassCountForCurrentResult(A.evaluationResults)," ",i.i18n.passStatusCaps),u(),Y(i.getFailCountForCurrentResult(A.evaluationResults)>0?6:-1),u(),Y(i.currentHistoryMetrics().length>0?7:-1),u(2),Te(A.evaluationResults)}}function IRA(t,e){if(t&1&&(ta(0)(1),O(2,CRA,11,4)),t&2){let A=p(5),i=ga(A.selectedHistoryRun());u();let n=ga(A.getEvalHistoryOfCurrentSet()[i]);u(),Y(n?2:-1)}}function dRA(t,e){if(t&1&&(B(0,"div",57),O(1,rRA,3,0,"div",43)(2,IRA,3,3),Q()),t&2){let A=p(4);u(),Y(A.selectedHistoryRun()?2:1)}}function BRA(t,e){if(t&1&&(ta(0),O(1,oRA,5,0,"div",16)(2,dRA,3,1,"div",57)),t&2){let A=ga(p(3).evalHistorySorted());u(),Y(A.length===0?1:2)}}function ERA(t,e){if(t&1&&(O(0,W_A,21,7,"div",35),O(1,nRA,4,2,"div"),O(2,BRA,3,2)),t&2){let A=p(2);Y(A.selectedEvalTab()==="info"?0:-1),u(),Y(A.selectedEvalTab()==="cases"?1:-1),u(),Y(A.selectedEvalTab()==="history"?2:-1)}}function hRA(t,e){if(t&1){let A=QA();B(0,"div",5)(1,"div",27)(2,"div",28)(3,"button",29),U("click",function(){T(A);let n=p();return n.selectedEvalTab.set("info"),n.selectedEvalCase.set(null),J(n.selectedHistoryRun.set(null))}),B(4,"mat-icon"),y(5,"info"),Q()(),B(6,"button",30),U("click",function(){T(A);let n=p();return n.selectedEvalTab.set("cases"),n.selectedEvalCase.set(null),J(n.selectedHistoryRun.set(null))}),B(7,"mat-icon"),y(8,"list"),Q()(),B(9,"button",31),U("click",function(){T(A);let n=p();return n.selectedEvalTab.set("history"),n.selectedEvalCase.set(null),n.selectedHistoryRun.set(null),J(n.getEvaluationResult())}),B(10,"mat-icon"),y(11,"history"),Q()()(),B(12,"div",32),O(13,q_A,2,2,"div",33)(14,ERA,3,3),Q()()()}if(t&2){let A=p();u(3),RA("active",A.selectedEvalTab()==="info"),u(3),RA("active",A.selectedEvalTab()==="cases"),u(3),RA("active",A.selectedEvalTab()==="history"),u(4),Y(A.evalRunning()?13:14)}}var rv=new kA("EVAL_TAB_COMPONENT"),xc=class t{checkboxes=XF(ec);appName=me("");userId=me("");sessionId=me("");sessionSelected=ui();shouldShowTab=ui();evalNotInstalledMsg=ui();evalCaseSelected=ui();evalSetIdSelected=ui();shouldReturnToSession=ui();editEvalCaseRequested=ui();evalCasesSubject=new ei([]);changeDetectorRef=w(wt);flagService=w(yr);i18n=w(VtA);displayedColumns=["select","evalId"];evalsets=[];selectedEvalSet=bA("");currentEvalSet=bA(null);evalHistorySorted=pe(()=>{let e=this.appEvaluationResults[this.appName()]?.[this.selectedEvalSet()]||{};return Object.keys(e).sort((i,n)=>n.localeCompare(i)).map(i=>({timestamp:i,evaluationResults:e[i]}))});currentHistoryMetrics=pe(()=>{let e=this.selectedHistoryRun()||this.evalHistorySorted()[0]?.timestamp;if(!e)return this.evalMetrics;let A=this.evalHistorySorted().find(i=>i.timestamp===e);return A?this.getEvalMetrics(A):this.evalMetrics});caseHistory=pe(()=>{let e=this.selectedEvalCase();if(!e)return[];let A=e.evalId,i=this.evalHistorySorted();return console.log("[DEBUG] caseHistory history:",i.map(n=>n.timestamp),"selectedHistoryRun:",this.selectedHistoryRun()),i.map(n=>{let o=n.evaluationResults.evaluationResults.find(a=>a.evalId===A);return{timestamp:n.timestamp,result:o}}).filter(n=>n.result!==void 0)});evalCases=[];selectedEvalCase=bA(null);deletedEvalCaseIndex=-1;dataSource=new Td(this.evalCases);selection=new V0(!0,[]);showEvalHistory=bA(!1);selectedEvalTab=bA("cases");selectedHistoryRun=bA(null);evalRunning=bA(!1);evalMetrics=uQ;isEvalV2Enabled=bA(!1);currentEvalResultBySet=new Map;dialog=w(Or);appEvaluationResults={};evalService=w(t0);sessionService=w(Al);constructor(){this.evalCasesSubject.subscribe(e=>{!this.selectedEvalCase()&&this.deletedEvalCaseIndex>=0&&e.length>0?(this.selectNewEvalCase(e),this.deletedEvalCaseIndex=-1):e.length===0&&this.shouldReturnToSession.emit(!0)})}ngOnChanges(e){e.appName&&(this.selectedEvalSet.set(""),this.evalCases=[],this.getEvalSet(),this.getEvaluationResult())}ngOnInit(){this.flagService.isEvalV2Enabled().pipe($n()).subscribe(A=>this.isEvalV2Enabled.set(A));let e=localStorage.getItem("adk_eval_metrics_selection");if(e)try{this.evalMetrics=JSON.parse(e)}catch(A){console.error("Error parsing saved eval metrics",A),this.evalMetrics=uQ}}selectNewEvalCase(e){let A=this.deletedEvalCaseIndex;this.deletedEvalCaseIndex===e.length&&(A=0),this.getEvalCase(e[A])}getEvalSet(){this.appName()!==""&&this.evalService.getEvalSets(this.appName()).pipe(Po(e=>e.status===404&&e.statusText==="Not Found"?(this.shouldShowTab.emit(!1),ne(null)):ne([]))).subscribe(e=>{e!==null&&(this.shouldShowTab.emit(!0),this.evalsets=e,this.changeDetectorRef.detectChanges())})}getNextDefaultEvalSetName(){let e=/^eval_set_(\d+)$/,A=0;for(let i of this.evalsets)if(typeof i=="string"){let n=i.match(e);if(n){let o=parseInt(n[1],10);o>A&&(A=o)}}return`eval_set_${A+1}`}openNewEvalSetDialog(){let e=this.getNextDefaultEvalSetName();this.dialog.open(ov,{width:"600px",data:{appName:this.appName(),defaultName:e}}).afterClosed().subscribe(i=>{i&&(this.getEvalSet(),this.changeDetectorRef.detectChanges())})}openNewEvalCaseDialog(){this.sessionId()&&this.sessionService.getSession(this.userId(),this.appName(),this.sessionId()).subscribe(e=>{let i=(e.state?.__session_metadata__?.displayName||this.sessionId()).replace(/ /g,"_").replace(/[^a-zA-Z0-9_-]/g,"");this.dialog.open(nv,{width:"600px",data:{appName:this.appName(),userId:this.userId(),sessionId:this.sessionId(),evalSetId:this.selectedEvalSet(),defaultName:i,existingCases:this.evalCases}}).afterClosed().subscribe(o=>{o&&(this.listEvalCases(),this.changeDetectorRef.detectChanges())})})}listEvalCases(){this.evalCases=[],this.evalService.listEvalCases(this.appName(),this.selectedEvalSet()).subscribe(e=>{this.evalCases=e,this.dataSource=new Td(this.evalCases),this.evalCasesSubject.next(this.evalCases),this.changeDetectorRef.detectChanges()})}runEval(){this.evalRunning.set(!0),this.evalService.runEval(this.appName(),this.selectedEvalSet(),this.selection.selected.length===0?this.dataSource.data:this.selection.selected,this.evalMetrics).pipe(Po(e=>(e.error?.detail?.includes("not installed")&&this.evalNotInstalledMsg.emit(e.error.detail),ne([])))).subscribe(e=>{this.currentEvalResultBySet.set(this.selectedEvalSet(),e),this.getEvaluationResult(!0),this.changeDetectorRef.detectChanges()})}selectEvalSet(e){this.selectedEvalSet.set(e),this.listEvalCases(),this.isEvalV2Enabled()&&this.evalService.getEvalSet(this.appName(),e).pipe(Po(A=>(console.error("Error fetching eval set details",A),ne(null)))).subscribe(A=>{this.currentEvalSet.set(A),this.changeDetectorRef.detectChanges()})}clearSelectedEvalSet(){if(this.selectedEvalTab()!=="cases"){this.selectedEvalTab.set("cases");return}this.selectedEvalSet.set(""),this.currentEvalSet.set(null)}clearAllNavigation(){this.selectedEvalSet.set(""),this.selectedHistoryRun.set(null),this.selectedEvalCase.set(null),this.currentEvalSet.set(null)}goToEvalSet(){this.selectedHistoryRun.set(null),this.selectedEvalCase.set(null)}isAllSelected(){let e=this.selection.selected.length,A=this.dataSource.data.length;return e===A}toggleAllRows(){if(this.isAllSelected()){this.selection.clear();return}this.selection.select(...this.dataSource.data)}getEvalResultForCase(e){let A=this.currentEvalResultBySet.get(this.selectedEvalSet())?.filter(i=>i.evalId==e);if(!(!A||A.length==0))return A[0].finalEvalStatus}formatToolUses(e){if(!e||!Array.isArray(e))return[];let A=[];for(let i of e)A.push({name:i.name,args:i.args});return A}addEvalCaseResultToEvents(e,A){let i=A.evalMetricResultPerInvocation,n=-1;if(i)for(let o=0;on.evalId==e)[0],i=A.sessionId;this.sessionService.getSession(this.userId(),this.appName(),i).subscribe(n=>{this.addEvalCaseResultToEvents(n,A);let o=this.fromApiResultToSession(n);this.sessionSelected.emit(o)})}toggleEvalHistoryButton(){this.showEvalHistory.set(!this.showEvalHistory())}getEvalHistoryOfCurrentSet(){return this.appEvaluationResults[this.appName()]?this.appEvaluationResults[this.appName()][this.selectedEvalSet()]||{}:{}}getEvalHistoryOfCurrentSetSorted(){let e=this.getEvalHistoryOfCurrentSet();return e?Object.keys(e).sort((n,o)=>o.localeCompare(n)).map(n=>({timestamp:n,evaluationResults:e[n]})):[]}getPassCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==1).length}getFailCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==2).length}getMetricsCounts(e){if(!e)return{passed:0,total:0};let A=0,i=0;if(e.evalMetricResults&&e.evalMetricResults.length>0)A=e.evalMetricResults.filter(n=>n.evalStatus===1).length,i=e.evalMetricResults.length;else if(e.evalMetricResultPerInvocation)for(let n of e.evalMetricResultPerInvocation)n.evalMetricResults&&(A+=n.evalMetricResults.filter(o=>o.evalStatus===1).length,i+=n.evalMetricResults.length);return{passed:A,total:i}}getMetricsScore(e){let{passed:A,total:i}=this.getMetricsCounts(e);return`${A}/${i}`}isMetricsSucceed(e){let{passed:A,total:i}=this.getMetricsCounts(e);return A===i}formatTimestamp(e){let A=Number(e);if(isNaN(A))return"Invalid timestamp provided";let i=new Date(A*1e3);if(isNaN(i.getTime()))return"Invalid date created from timestamp";let n={month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0};return new Intl.DateTimeFormat("en-US",n).format(i)}getEvaluationStatusCardActionButtonIcon(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled?"keyboard_arrow_up":"keyboard_arrow_down"}toggleHistoryStatusCard(e){this.getEvalHistoryOfCurrentSet()[e].isToggled=!this.getEvalHistoryOfCurrentSet()[e].isToggled}isEvaluationStatusCardToggled(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled}generateHistoryEvaluationDatasource(e){return this.getEvalHistoryOfCurrentSet()[e].evaluationResults}getHistorySession(e,A){let i=e.sessionId,n=e.evalId;this.selectedHistoryRun.set(A),this.evalService.getEvalCase(this.appName(),this.selectedEvalSet(),n).subscribe(o=>{this.sessionService.getSession(this.userId(),this.appName(),i).subscribe(a=>{this.addEvalCaseResultToEvents(a,e);let r=this.fromApiResultToSession(a);r.evalCase=o,r.evalCaseResult=e,r.timestamp=A,this.sessionSelected.emit(r)})})}getEvalCase(e){this.evalService.getEvalCase(this.appName(),this.selectedEvalSet(),e).subscribe(A=>{this.selectedEvalCase.set(A),this.evalCaseSelected.emit(A),this.evalSetIdSelected.emit(this.selectedEvalSet())})}resetEvalCase(){this.selectedEvalCase.set(null)}resetEvalResults(){this.currentEvalResultBySet.clear()}confirmDeleteEvalCase(e,A){e.stopPropagation();let i={title:"Confirm delete",message:`Are you sure you want to delete ${A}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(kc,{width:"600px",data:i}).afterClosed().subscribe(o=>{o&&this.deleteEvalCase(A)})}requestEditEvalCase(e,A){e.stopPropagation(),this.evalService.getEvalCase(this.appName(),this.selectedEvalSet(),A).subscribe(i=>{this.selectedEvalCase.set(i),this.evalCaseSelected.emit(i),this.evalSetIdSelected.emit(this.selectedEvalSet()),this.editEvalCaseRequested.emit(i)})}deleteEvalCase(e){this.evalService.deleteEvalCase(this.appName(),this.selectedEvalSet(),e).subscribe(A=>{this.deletedEvalCaseIndex=this.evalCases.indexOf(e),this.selectedEvalCase.set(null),this.listEvalCases(),this.changeDetectorRef.detectChanges()})}confirmDeleteEvalSet(e,A){e.stopPropagation();let i={title:"Confirm delete",message:`Are you sure you want to delete eval set ${A}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(kc,{width:"600px",data:i}).afterClosed().subscribe(o=>{o&&this.deleteEvalSet(A)})}deleteEvalSet(e){this.evalService.deleteEvalSet(this.appName(),e).subscribe(A=>{this.getEvalSet(),this.changeDetectorRef.detectChanges()})}getEvaluationResult(e=!1){this.evalService.listEvalResults(this.appName()).pipe(Po(A=>A.status===404&&A.statusText==="Not Found"?(this.shouldShowTab.emit(!1),ne(null)):ne([])),hi(A=>{if(!A||A.length===0)return ne([]);let i=A.map(n=>this.evalService.getEvalResult(this.appName(),n));return qC(i)})).subscribe(A=>{if(A.length===0)return;let i="";for(let n of A){this.appEvaluationResults[this.appName()]||(this.appEvaluationResults[this.appName()]={}),this.appEvaluationResults[this.appName()][n.evalSetId]||(this.appEvaluationResults[this.appName()][n.evalSetId]={});let o=n.creationTimestamp;(!i||o>i)&&(i=o);let a={isToggled:!1,evaluationResults:n.evalCaseResults.map(r=>({setId:r.id,evalId:r.evalId,finalEvalStatus:r.finalEvalStatus,evalMetricResults:r.evalMetricResults,evalMetricResultPerInvocation:r.evalMetricResultPerInvocation,sessionId:r.sessionId,sessionDetails:r.sessionDetails,overallEvalMetricResults:r.overallEvalMetricResults??[]}))};this.appEvaluationResults[this.appName()][n.evalSetId][o]=a}this.changeDetectorRef.detectChanges(),e&&i&&(this.selectedEvalTab.set("history"),this.selectedHistoryRun.set(i)),this.evalRunning.set(!1)})}openEvalConfigDialog(){this.evalService.getMetricsInfo(this.appName()).pipe(Po(e=>(console.error("Error fetching metrics info",e),ne({metricsInfo:[]})))).subscribe(e=>{this.dialog.open(av,{maxWidth:"90vw",maxHeight:"90vh",data:{evalMetrics:this.evalMetrics,metricsInfo:e.metricsInfo||[]}}).afterClosed().subscribe(i=>{i&&(this.evalMetrics=i,localStorage.setItem("adk_eval_metrics_selection",JSON.stringify(i)),this.runEval())})})}getEvalMetrics(e){if(!e||!e.evaluationResults||!e.evaluationResults.evaluationResults)return this.evalMetrics;let A=e.evaluationResults.evaluationResults;return A.length===0?this.evalMetrics:typeof A[0].overallEvalMetricResults>"u"||!A[0].overallEvalMetricResults||A[0].overallEvalMetricResults.length===0?this.evalMetrics:A[0].overallEvalMetricResults.map(n=>({metricName:n.metricName,threshold:n.threshold}))}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-eval-tab"]],viewQuery:function(A,i){A&1&&ns(i.checkboxes,ec,5),A&2&&ur()},inputs:{appName:[1,"appName"],userId:[1,"userId"],sessionId:[1,"sessionId"]},outputs:{sessionSelected:"sessionSelected",shouldShowTab:"shouldShowTab",evalNotInstalledMsg:"evalNotInstalledMsg",evalCaseSelected:"evalCaseSelected",evalSetIdSelected:"evalSetIdSelected",shouldReturnToSession:"shouldReturnToSession",editEvalCaseRequested:"editEvalCaseRequested"},features:[Yt],decls:17,vars:11,consts:[[1,"eval-container"],[1,"eval-detail-header"],["mat-icon-button","","matTooltip","All Eval Sets",3,"click"],[1,"breadcrumb-item",2,"font-weight","500","color","var(--mat-sys-on-surface)"],[1,"spacer"],[1,"eval-details-container"],[1,"breadcrumb-separator"],["matTooltip","Eval Set",1,"breadcrumb-item","clickable"],["matTooltip","Eval Set",1,"breadcrumb-item"],["matTooltip","Eval Set",1,"breadcrumb-item","clickable",3,"click"],["matTooltip","Eval Cases",1,"breadcrumb-item"],["matTooltip","Runs",1,"breadcrumb-item"],["matTooltip","Run",1,"breadcrumb-item"],["matTooltip","Eval Case",1,"breadcrumb-item"],["mat-button","",3,"click","matTooltip"],["mat-icon-button","","matTooltip","Refresh",3,"click"],[1,"empty-eval-info"],[1,"info-title"],[1,"info-detail"],[1,"info-create",3,"click"],[1,"eval-set-row"],[1,"eval-set-row",3,"click"],[1,"eval-set-left"],[1,"material-symbols-outlined"],[1,"eval-set-name"],[1,"eval-set-right"],["mat-icon-button","",1,"delete-btn",3,"click","matTooltip"],[1,"eval-details-content"],[1,"vertical-tabs-sidebar"],["mat-icon-button","","matTooltip","Info","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Eval Cases","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Runs","matTooltipPosition","right",3,"click"],[1,"vertical-tabs-content"],[2,"display","flex","justify-content","center","align-items","center","padding","20px"],["mode","indeterminate",3,"diameter","strokeWidth"],[1,"info-tables-container"],["app-info-table",""],[3,"matTooltip"],[1,"eval-case-details",2,"padding","16px"],[1,"toolbar",2,"position","sticky","top","0","z-index","1"],[2,"margin-left","6px",3,"change","checked","indeterminate"],["mat-button","","color","primary",3,"click","disabled"],["mat-button","","color","accent",3,"click"],[1,"eval-cases-list"],[1,"eval-case-row",3,"selected-row"],[1,"eval-case-row",3,"click"],[3,"click","change","checked"],[1,"eval-case-id"],["mat-icon-button","",1,"edit-btn",3,"click","matTooltip"],[2,"margin-bottom","16px"],[2,"margin-top","0"],[2,"margin-bottom","8px"],[1,"eval-case-row","clickable",3,"selected-row"],[2,"padding","16px","text-align","center","color","var(--app-color-text-secondary)"],[1,"eval-case-row","clickable",3,"click"],[1,"status-card__summary",2,"width","50px","text-align","center"],[2,"font-family","monospace",3,"ngClass"],[2,"padding","16px"],[1,"eval-case-row"],[1,"status-card__summary"],[1,"status-card__passed",2,"font-family","monospace"],[1,"status-card__separator"],[1,"status-card__failed",2,"font-family","monospace"],[1,"status-card",2,"margin-top","0"],[1,"status-card__overview"],[1,"status-card__info"],[1,"status-card__metrics"],[1,"status-card__history-cases"],[1,"status-card__history-case",2,"display","flex","justify-content","space-between","align-items","center"],[1,"status-card__metric"],[1,"status-card__metric-name",3,"matTooltip"],[1,"status-card__metric-value"],[1,"status-card__history-case",2,"display","flex","justify-content","space-between","align-items","center",3,"click"],[2,"font-family","monospace","width","50px","text-align","center",3,"ngClass"]],template:function(A,i){A&1&&(B(0,"div",0)(1,"div",1)(2,"button",2),U("click",function(){return i.clearAllNavigation()}),B(3,"mat-icon"),y(4,"home"),Q()(),O(5,F_A,2,0,"span",3),O(6,K_A,4,1),O(7,U_A,4,0),O(8,T_A,4,0),O(9,J_A,4,1),O(10,O_A,4,1),hA(11,"span",4),O(12,Y_A,7,1),Q(),O(13,H_A,0,0),O(14,z_A,8,3,"div"),O(15,j_A,3,0,"div"),O(16,hRA,15,7,"div",5),Q()),A&2&&(u(5),Y(i.selectedEvalSet()===""?5:-1),u(),Y(i.selectedEvalSet()!==""?6:-1),u(),Y(i.selectedEvalSet()!==""&&i.selectedEvalTab()==="cases"&&!i.selectedEvalCase()?7:-1),u(),Y(i.selectedEvalSet()!==""&&i.selectedEvalTab()==="history"&&!i.selectedHistoryRun()?8:-1),u(),Y(i.selectedHistoryRun()&&!i.selectedEvalCase()?9:-1),u(),Y(i.selectedEvalCase()?10:-1),u(2),Y(i.selectedEvalSet()===""?12:-1),u(),Y(i.selectedEvalSet()==""?13:-1),u(),Y(i.evalsets.length==0?14:-1),u(),Y(i.evalsets.length>0&&i.selectedEvalSet()==""?15:-1),u(),Y(i.selectedEvalSet()!=""?16:-1))},dependencies:[Wt,pi,ji,dn,ec,zl,gs,OI,$0,Ya,ip,JI],styles:[".eval-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;box-sizing:border-box}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 10px;background-color:var(--mat-sys-surface-container, #f5f5f5);border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0);gap:8px}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%]{flex:1 1 auto}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{height:32px!important;line-height:normal!important;border-radius:16px!important;font-size:13px!important;font-weight:500!important;display:inline-flex!important;align-items:center;justify-content:center}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%]{padding:0 12px!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:4px!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%]{width:32px!important;min-width:32px!important;padding:0!important;border-radius:50%!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:0!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple{width:32px!important;height:32px!important;border-radius:50%!important}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important;vertical-align:middle}.eval-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{vertical-align:middle}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%]{width:100%;background:transparent;border-top:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{font-weight:600}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:middle;padding:6px 16px;border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr.mat-header-row[_ngcontent-%COMP%]{display:none}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]{cursor:pointer;background:transparent}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.eval-container[_ngcontent-%COMP%] .eval-table[_ngcontent-%COMP%] tr.selected-row[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high, #e0e0e0)}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%]{display:flex;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant);height:48px;flex-shrink:0;padding:0 16px;gap:8px}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%]{flex:1 1 auto}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-separator[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);margin:0 4px}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]{font-size:14px;color:var(--mat-sys-on-surface-variant)}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item.clickable[_ngcontent-%COMP%]{color:var(--mat-sys-primary);cursor:pointer}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item.clickable[_ngcontent-%COMP%]:hover{text-decoration:underline}.eval-container[_ngcontent-%COMP%] .eval-detail-header[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]:last-child{color:var(--mat-sys-on-surface);font-weight:500}.eval-container[_ngcontent-%COMP%] .eval-set-title[_ngcontent-%COMP%]{font-size:14px;font-weight:500;color:var(--mat-sys-on-surface);margin-right:16px}.eval-case-id[_ngcontent-%COMP%]{cursor:pointer}.eval-set-actions[_ngcontent-%COMP%]{display:flex;justify-content:space-between;color:var(--mat-sys-on-surface);font-style:normal;font-weight:700;font-size:14px}.empty-eval-info[_ngcontent-%COMP%]{margin-top:12px}.info-title[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface);font-size:14px;font-weight:500;padding-top:13px;padding-right:16px;padding-left:16px}.info-detail[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:14px;font-weight:400;padding-top:13px;padding-right:16px;padding-left:16px;letter-spacing:.2px}.info-create[_ngcontent-%COMP%]{color:var(--mat-sys-primary);font-size:14px;font-style:normal;font-weight:500;padding-right:16px;padding-left:16px;margin-top:19px;padding-bottom:16px;cursor:pointer}.eval-set-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;cursor:pointer;padding:6px 16px;min-height:44px;border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0);background:transparent}.eval-set-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.eval-set-row[_ngcontent-%COMP%]:hover .delete-btn[_ngcontent-%COMP%]{opacity:1}.eval-set-row[_ngcontent-%COMP%] .eval-set-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px}.eval-set-row[_ngcontent-%COMP%] .eval-set-left[_ngcontent-%COMP%] span.material-symbols-outlined[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:20px}.eval-set-row[_ngcontent-%COMP%] .eval-set-name[_ngcontent-%COMP%]{font-size:14px;color:var(--mat-sys-on-surface)}.eval-set-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out;color:var(--mat-sys-outline)}.eval-set-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-error)}.eval-set-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important}.selected-eval-case[_ngcontent-%COMP%]{font-weight:900;color:var(--mat-sys-primary)}.save-session-btn[_ngcontent-%COMP%]{width:100%;border:none;border-radius:4px;margin-top:12px;cursor:pointer}.save-session-btn-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.save-session-btn-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--mat-sys-on-primary);font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.run-eval-btn[_ngcontent-%COMP%]{border-radius:4px;border:1px solid var(--mat-sys-outline);padding:8px 24px;margin-top:16px;color:var(--mat-sys-primary);cursor:pointer}.run-eval-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-high)}.result-btn[_ngcontent-%COMP%]{display:flex;border-radius:4px;border:1px solid var(--mat-sys-outline-variant);margin-top:4px;cursor:pointer}.result-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-high)}.result-btn.pass[_ngcontent-%COMP%]{color:var(--mat-sys-tertiary)}.result-btn.fail[_ngcontent-%COMP%]{color:var(--mat-sys-error)}.evaluation-tab-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.evaluation-history-icon[_ngcontent-%COMP%]{cursor:pointer;margin-top:4px}.status-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;border-radius:8px;padding:12px 16px;margin-top:12px;background-color:var(--mat-sys-surface-container)}.status-card__overview[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.status-card__info[_ngcontent-%COMP%]{display:flex;flex-direction:column}.status-card__timestamp[_ngcontent-%COMP%]{font-size:.9em;color:var(--mat-sys-on-surface-variant);margin-bottom:5px}.status-card__summary[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:.95em;font-weight:500;color:var(--mat-sys-on-surface)}.status-card__metrics[_ngcontent-%COMP%]{display:flex;align-items:center;flex-wrap:wrap;font-size:.75em;margin-top:3px}.status-card__metric[_ngcontent-%COMP%]{width:160px;display:flex;align-items:center;color:var(--mat-sys-on-surface);margin-right:12px;margin-bottom:4px}.status-card__metric-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.status-card__metric-value[_ngcontent-%COMP%]{margin-left:4px;flex-shrink:0}.status-card__failed[_ngcontent-%COMP%]{color:var(--mat-sys-error)}.status-card__separator[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);margin:0 8px}.status-card__passed[_ngcontent-%COMP%]{color:#2e7d32}.status-card__action[_ngcontent-%COMP%]{display:flex;align-items:center}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);cursor:pointer;transition:transform .2s ease-in-out}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-size:1.2em;cursor:pointer}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__history-cases[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin-top:3px;justify-content:flex-start;width:100%}.status-card__history-case[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%;margin-top:4px;padding:8px 12px;border-radius:4px;cursor:pointer;box-sizing:border-box}.status-card__history-case[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.eval-spinner[_ngcontent-%COMP%]{margin-top:12px}.eval-details-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;overflow:hidden}.eval-details-content[_ngcontent-%COMP%]{display:flex;flex:1;overflow:hidden}.vertical-tabs-sidebar[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:48px;border-right:1px solid var(--mat-sys-outline-variant);padding-top:8px;align-items:center;gap:8px}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.vertical-tabs-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto}.eval-cases-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:100%}.eval-case-row[_ngcontent-%COMP%]{display:flex;align-items:center;cursor:pointer;padding:8px 16px;gap:12px;border-bottom:1px solid var(--mat-sys-outline-variant);background:transparent}.eval-case-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low)}.eval-case-row[_ngcontent-%COMP%]:hover .delete-btn[_ngcontent-%COMP%], .eval-case-row[_ngcontent-%COMP%]:hover .edit-btn[_ngcontent-%COMP%]{opacity:1}.eval-case-row.selected-row[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high)}.eval-case-row[_ngcontent-%COMP%] .eval-case-id[_ngcontent-%COMP%]{font-size:14px;color:var(--mat-sys-on-surface);font-family:Google Sans Mono,monospace;flex:1}.eval-case-row[_ngcontent-%COMP%] .edit-btn[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out;color:var(--mat-sys-on-surface-variant)}.eval-case-row[_ngcontent-%COMP%] .edit-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-primary)}.eval-case-row[_ngcontent-%COMP%] .edit-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important}.eval-case-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out;color:var(--mat-sys-on-surface-variant)}.eval-case-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%]:hover{color:var(--mat-sys-error)}.eval-case-row[_ngcontent-%COMP%] .delete-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important}.eval-case-row.header-row[_ngcontent-%COMP%]{cursor:default;background-color:var(--mat-sys-surface-container-lowest)}.eval-case-row.header-row[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-lowest)}.info-tables-container[_ngcontent-%COMP%]{padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:24px}"]})};var QRA={noSessionsFound:"No sessions found",readonlyChip:"Read-only",filterSessionsLabel:"Search using session ID"},AiA=new kA("Session Tab Messages",{factory:()=>QRA});function uRA(t,e){if(t&1&&(B(0,"div",1)(1,"mat-form-field",4)(2,"mat-label"),y(3),Q(),B(4,"mat-icon",5),y(5,"filter_list"),Q(),hA(6,"input",6),Q()()),t&2){let A=p();u(3),lA(A.i18n.filterSessionsLabel),u(3),H("formControl",A.filterControl)}}function fRA(t,e){t&1&&(B(0,"div",2),hA(1,"mat-progress-bar",7),Q())}function pRA(t,e){if(t&1&&(B(0,"div",3),y(1),Q()),t&2){let A=p();u(),ba("",A.i18n.noSessionsFound," for user '",A.userId,"'")}}function mRA(t,e){if(t&1&&(B(0,"div",18),y(1),Q()),t&2){let A=p().$implicit;H("title",A.id),u(),lA(A.id)}}function wRA(t,e){if(t&1&&(B(0,"div",19)(1,"mat-icon"),y(2,"visibility"),Q(),y(3),Q()),t&2){let A=p(3);u(3),ue(" ",A.i18n.readonlyChip," ")}}function DRA(t,e){if(t&1){let A=QA();B(0,"div",10),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.getSession(n.id))}),B(1,"div",11)(2,"div",12)(3,"div",13),y(4),Q(),B(5,"button",14),U("click",function(n){let o=T(A).$implicit,a=p(2);return J(a.promoteToTest(n,o))}),B(6,"mat-icon"),y(7,"fact_check"),Q()(),B(8,"button",15),U("click",function(n){let o=T(A).$implicit,a=p(2);return J(a.deleteSession(n,o))}),B(9,"mat-icon"),y(10,"delete"),Q()()(),B(11,"div",16)(12,"div",17),y(13),Q(),O(14,mRA,2,2,"div",18),Q()(),O(15,wRA,4,1,"div",19),Ht(16,"async"),Q()}if(t&2){let A=e.$implicit,i=p(2);H("ngClass",A.id===i.sessionId?"session-item current":"session-item"),u(3),RA("is-monospace",!i.hasDisplayName(A)),H("title",A.id),u(),lA(i.getSessionDisplayName(A)),u(9),lA(i.getDate(A)),u(),Y(i.hasDisplayName(A)?14:-1),u(),Y(si(16,8,i.sessionService.canEdit(i.userId,A))===!1?15:-1)}}function yRA(t,e){t&1&&(B(0,"div",2),hA(1,"mat-progress-bar",7),Q())}function vRA(t,e){if(t&1){let A=QA();O(0,yRA,2,0,"div",2),B(1,"div",20)(2,"button",21),U("click",function(){T(A);let n=p(2);return J(n.loadMoreSessions())}),y(3,"Load more"),Q()()}if(t&2){p(2);let A=zn(3);Y(A?0:-1)}}function bRA(t,e){if(t&1&&(B(0,"div",8),Ue(1,DRA,17,10,"div",9,ri),Q(),O(3,vRA,4,1),Ht(4,"async")),t&2){let A=p();u(),Te(A.sessionList),u(2),Y(si(4,1,A.isSessionFilteringEnabled)&&A.canLoadMoreSessions?3:-1)}}var sv=class t{userId="";appName="";sessionId="";sessionSelected=new LA;sessionReloaded=new LA;SESSIONS_PAGE_LIMIT=100;sessionList=[];canLoadMoreSessions=!1;pageToken="";filterControl=new Os("");editingSessionId=null;sessionNameControl=new Os("");refreshSessionsSubject=new ie;route=w(Vs);changeDetectorRef=w(wt);sessionService=w(Al);uiStateService=w(tg);i18n=w(AiA);featureFlagService=w(yr);dialog=w(Or);testsService=w(u2);isSessionFilteringEnabled=this.featureFlagService.isSessionFilteringEnabled();isLoadingMoreInProgress=bA(!1);isInitialized=bA(!1);constructor(){this.filterControl.valueChanges.pipe(Ls(300)).subscribe(()=>{this.pageToken="",this.sessionList=[],this.refreshSessionsSubject.next()}),this.refreshSessionsSubject.pipe(di(()=>{this.uiStateService.setIsSessionListLoading(!0)}),hi(()=>{let e=this.filterControl.value||void 0;return this.isSessionFilteringEnabled?this.sessionService.listSessions(this.userId,this.appName,{filter:e,pageToken:this.pageToken,pageSize:this.SESSIONS_PAGE_LIMIT}).pipe(Po(()=>ne({items:[],nextPageToken:""}))):this.sessionService.listSessions(this.userId,this.appName).pipe(Po(()=>ne({items:[],nextPageToken:""})))}),di(({items:e,nextPageToken:A})=>{this.isInitialized.set(!0),this.sessionList=Array.from(new Map([...this.sessionList,...e].map(i=>[i.id,i])).values()).sort((i,n)=>Number(n.lastUpdateTime)-Number(i.lastUpdateTime)),this.pageToken=A??"",this.canLoadMoreSessions=!!A,this.changeDetectorRef.markForCheck()})).subscribe(()=>{this.isLoadingMoreInProgress.set(!1),this.uiStateService.setIsSessionListLoading(!1)},()=>{this.isLoadingMoreInProgress.set(!1),this.uiStateService.setIsSessionListLoading(!1)})}ngOnInit(){this.featureFlagService.isSessionFilteringEnabled().subscribe(e=>{if(e){let A=this.route.snapshot.queryParams.session;A&&this.filterControl.setValue(A)}}),setTimeout(()=>{this.refreshSessionsSubject.next()},500)}getSession(e){e&&this.sessionSelected.emit(e)}loadMoreSessions(){this.isLoadingMoreInProgress.set(!0),this.refreshSessionsSubject.next()}getSessionDisplayName(e){return e.state?.__session_metadata__?.displayName||e.id}hasDisplayName(e){return!!e.state?.__session_metadata__?.displayName}startEditSessionName(e){this.editingSessionId=e.id,this.sessionNameControl.setValue(this.getSessionDisplayName(e))}cancelEditSessionName(){this.editingSessionId=null,this.sessionNameControl.setValue("")}saveSessionName(e){if(!this.editingSessionId||!e.id)return;let A=this.sessionNameControl.value,i=e.state||{},n=Ye(gA({},i),{__session_metadata__:Ye(gA({},i.__session_metadata__||{}),{displayName:A})});e.state=n,this.editingSessionId=null,this.sessionService.updateSession(this.userId,this.appName,e.id,{stateDelta:n}).subscribe({error:()=>{}})}deleteSession(e,A){e.stopPropagation();let i=A.id,n=this.getSessionDisplayName(A),o=`Are you sure you want to delete session ${i}?`;n!==i&&(o=`Are you sure you want to delete session "${n}" (${i})?`);let a={title:"Confirm delete",message:o,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(kc,{width:"600px",data:a}).afterClosed().subscribe(s=>{s&&this.sessionService.deleteSession(this.userId,this.appName,i).subscribe(()=>{this.refreshSession(i)})})}promoteToTest(e,A){e.stopPropagation();let i=window.prompt("Enter test name (e.g., test1):");i&&this.sessionService.getSession(this.userId,this.appName,A.id).subscribe(n=>{let o={events:n.events};this.testsService.createTest(this.appName,i,o).subscribe({next:()=>{alert(`Test ${i} created successfully.`)},error:a=>{alert(`Error creating test: ${a.message||a}`)}})})}getDate(e){let A=e.lastUpdateTime||0;return new Date(A*1e3).toLocaleString()}fromApiResultToSession(e){return{id:e.id??"",appName:e.appName??"",userId:e.userId??"",state:e.state??{},events:e.events??[]}}reloadSession(e){this.sessionReloaded.emit(e)}refreshSession(e){let A=null;if(this.sessionList.length>0){let i=this.sessionList.findIndex(n=>n.id===e);i===this.sessionList.length-1&&(i=-1),A=this.sessionList[i+1]}return this.isSessionFilteringEnabled?this.filterControl.setValue(""):(this.sessionList=[],this.refreshSessionsSubject.next()),A}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-session-tab"]],inputs:{userId:"userId",appName:"appName",sessionId:"sessionId"},outputs:{sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded"},decls:8,vars:7,consts:[[1,"session-wrapper"],[1,"session-filter-container"],[1,"loading-spinner-container"],[1,"empty-state"],["appearance","outline",1,"session-filter"],["matPrefix",""],["matInput","",3,"formControl"],["mode","indeterminate"],[1,"session-tab-container",2,"margin-top","16px"],[3,"ngClass"],[3,"click","ngClass"],[1,"session-info"],[1,"session-header"],[1,"session-id",3,"title"],["mat-icon-button","","title","Promote to test",1,"action-btn","promote-btn",3,"click"],["mat-icon-button","","title","Delete session",1,"action-btn","delete-btn",3,"click"],[1,"session-sub-row"],[1,"session-date"],[1,"session-real-id",3,"title"],[1,"readonly-badge"],[1,"load-more"],["mat-button","","color","primary",3,"click"]],template:function(A,i){if(A&1&&(B(0,"div",0),O(1,uRA,7,2,"div",1),Ht(2,"async"),ta(3),Ht(4,"async"),O(5,fRA,2,0,"div",2)(6,pRA,2,2,"div",3)(7,bRA,5,3),Q()),A&2){u(),Y(si(2,2,i.isSessionFilteringEnabled)?1:-1),u(2);let n=ga(si(4,4,i.uiStateService.isSessionListLoading()));u(2),Y((n||!i.isInitialized())&&!i.isLoadingMoreInProgress()?5:!n&&i.isInitialized()&&i.sessionList.length===0?6:7)}},dependencies:[zl,CQ,Wt,Ya,Ko,vs,Ub,Ps,ua,ln,Dn,yn,n2,XI,qi,pi,ji,Tn,Xc,os],styles:[".session-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;font-size:14px;font-weight:700;color:var(--session-tab-session-wrapper-color);display:flex;flex-direction:column;overflow:hidden;height:100%}.session-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{color:initial;padding-top:1em;text-align:center;font-weight:400;font-style:italic}.session-wrapper[_ngcontent-%COMP%] .session-filter-container[_ngcontent-%COMP%]{border-radius:8px;padding:16px;margin-bottom:16px;margin-top:16px}.session-wrapper[_ngcontent-%COMP%] .session-filter[_ngcontent-%COMP%]{width:100%}.session-tab-container[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.session-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;border:none;border-radius:8px;margin-bottom:4px;cursor:pointer}.session-item[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant, rgba(0, 0, 0, .04))}.session-item.current[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, rgba(0, 0, 0, .08))}.session-item[_ngcontent-%COMP%] mat-chip[_ngcontent-%COMP%]{margin-right:11px}.session-id[_ngcontent-%COMP%]{color:var(--session-tab-session-id-color);font-family:Roboto,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.session-id.is-monospace[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.session-sub-row[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:8px}.session-date[_ngcontent-%COMP%]{color:var(--session-tab-session-date-color);font-family:Roboto;font-size:12px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.3px;white-space:nowrap}.session-real-id[_ngcontent-%COMP%]{color:var(--session-tab-session-id-color);font-family:Google Sans Mono,monospace;font-size:12px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.3px;opacity:.7;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;text-align:right}.session-info[_ngcontent-%COMP%]{padding:11px;flex:1;min-width:0}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;height:24px;margin-bottom:2px}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .session-id[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .session-name-input[_ngcontent-%COMP%]{flex:1;height:20px;padding:0 4px;font-family:inherit;font-size:14px;border:1px solid var(--mat-sys-outline, #ccc);border-radius:4px;background:var(--mat-sys-surface, #fff);color:var(--mat-sys-on-surface, #000);outline:none;min-width:0;margin-right:4px}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .session-name-input[_ngcontent-%COMP%]:focus{border-color:var(--mat-sys-primary, #1976d2)}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]{width:24px;height:24px;padding:0;display:none}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] .mat-icon{font-size:16px;width:16px;height:16px;line-height:16px}.session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .save-btn[_ngcontent-%COMP%], .session-info[_ngcontent-%COMP%] .session-header[_ngcontent-%COMP%] .cancel-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;margin-left:2px}.session-item[_ngcontent-%COMP%]:hover .action-btn.edit-btn[_ngcontent-%COMP%], .session-item[_ngcontent-%COMP%]:hover .action-btn.delete-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center}.loading-spinner-container[_ngcontent-%COMP%]{margin-left:auto;margin-right:auto;margin-top:2em;width:100%}.load-more[_ngcontent-%COMP%]{display:flex;justify-content:center;margin-top:1em}.readonly-badge[_ngcontent-%COMP%]{color:var(--chat-readonly-badge-color);border-radius:4px;padding:1px 6px;display:flex;align-items:center;margin-right:8px;font-size:12px;line-height:16px;gap:4px;white-space:nowrap}.readonly-badge[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;padding-top:1px;flex-shrink:0}"]})};var gF=["*"];function MRA(t,e){t&1&&Ve(0)}var SRA=["tabListContainer"],kRA=["tabList"],xRA=["tabListInner"],_RA=["nextPaginator"],RRA=["previousPaginator"],NRA=["content"];function FRA(t,e){}var LRA=["tabBodyWrapper"],GRA=["tabHeader"];function KRA(t,e){}function URA(t,e){if(t&1&&Et(0,KRA,0,0,"ng-template",12),t&2){let A=p().$implicit;H("cdkPortalOutlet",A.templateLabel)}}function TRA(t,e){if(t&1&&y(0),t&2){let A=p().$implicit;lA(A.textLabel)}}function JRA(t,e){if(t&1){let A=QA();B(0,"div",7,2),U("click",function(){let n=T(A),o=n.$implicit,a=n.$index,r=p(),s=Qi(1);return J(r._handleClick(o,s,a))})("cdkFocusChange",function(n){let o=T(A).$index,a=p();return J(a._tabFocusChanged(n,o))}),hA(2,"span",8)(3,"div",9),B(4,"span",10)(5,"span",11),O(6,URA,1,1,null,12)(7,TRA,1,1),Q()()()}if(t&2){let A=e.$implicit,i=e.$index,n=Qi(1),o=p();ro(A.labelClass),RA("mdc-tab--active",o.selectedIndex===i),H("id",o._getTabLabelId(A,i))("disabled",A.disabled)("fitInkBarToContent",o.fitInkBarToContent),te("tabIndex",o._getTabIndex(i))("aria-posinset",i+1)("aria-setsize",o._tabs.length)("aria-controls",o._getTabContentId(i))("aria-selected",o.selectedIndex===i)("aria-label",A.ariaLabel||null)("aria-labelledby",!A.ariaLabel&&A.ariaLabelledby?A.ariaLabelledby:null),u(3),H("matRippleTrigger",n)("matRippleDisabled",A.disabled||o.disableRipple),u(3),Y(A.templateLabel?6:7)}}function ORA(t,e){t&1&&Ve(0)}function YRA(t,e){if(t&1){let A=QA();B(0,"mat-tab-body",13),U("_onCentered",function(){T(A);let n=p();return J(n._removeTabBodyWrapperHeight())})("_onCentering",function(n){T(A);let o=p();return J(o._setTabBodyWrapperHeight(n))})("_beforeCentering",function(n){T(A);let o=p();return J(o._bodyCentered(n))}),Q()}if(t&2){let A=e.$implicit,i=e.$index,n=p();ro(A.bodyClass),H("id",n._getTabContentId(i))("content",A.content)("position",A.position)("animationDuration",n.animationDuration)("preserveContent",n.preserveContent),te("tabindex",n.contentTabIndex!=null&&n.selectedIndex===i?n.contentTabIndex:null)("aria-labelledby",n._getTabLabelId(A,i))("aria-hidden",n.selectedIndex!==i)}}var HRA=new kA("MatTabContent"),zRA=(()=>{class t{template=w(ao);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matTabContent",""]],features:[Bt([{provide:HRA,useExisting:t}])]})}return t})(),PRA=new kA("MatTabLabel"),niA=new kA("MAT_TAB"),cF=(()=>{class t extends hT{_closestTab=w(niA,{optional:!0});static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","mat-tab-label",""],["","matTabLabel",""]],features:[Bt([{provide:PRA,useExisting:t}]),mt]})}return t})(),oiA=new kA("MAT_TAB_GROUP"),CF=(()=>{class t{_viewContainerRef=w(Mo);_closestTabGroup=w(oiA,{optional:!0});disabled=!1;get templateLabel(){return this._templateLabel}set templateLabel(A){this._setTemplateLabelInput(A)}_templateLabel;_explicitContent=void 0;_implicitContent;textLabel="";ariaLabel;ariaLabelledby;labelClass;bodyClass;id=null;_contentPortal=null;get content(){return this._contentPortal}_stateChanges=new ie;position=null;origin=null;isActive=!1;constructor(){w(eo).load(lr)}ngOnChanges(A){(A.hasOwnProperty("textLabel")||A.hasOwnProperty("disabled"))&&this._stateChanges.next()}ngOnDestroy(){this._stateChanges.complete()}ngOnInit(){this._contentPortal=new Jr(this._explicitContent||this._implicitContent,this._viewContainerRef)}_setTemplateLabelInput(A){A&&A._closestTab===this&&(this._templateLabel=A)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-tab"]],contentQueries:function(i,n,o){if(i&1&&jo(o,cF,5)(o,zRA,7,ao),i&2){let a;ae(a=re())&&(n.templateLabel=a.first),ae(a=re())&&(n._explicitContent=a.first)}},viewQuery:function(i,n){if(i&1&&Jt(ao,7),i&2){let o;ae(o=re())&&(n._implicitContent=o.first)}},hostAttrs:["hidden",""],hostVars:1,hostBindings:function(i,n){i&2&&te("id",null)},inputs:{disabled:[2,"disabled","disabled",Be],textLabel:[0,"label","textLabel"],ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],labelClass:"labelClass",bodyClass:"bodyClass",id:"id"},exportAs:["matTab"],features:[Bt([{provide:niA,useExisting:t}]),Yt],ngContentSelectors:gF,decls:1,vars:0,template:function(i,n){i&1&&(Rt(),X3(0,MRA,1,0,"ng-template"))},encapsulation:2})}return t})(),aF="mdc-tab-indicator--active",eiA="mdc-tab-indicator--no-transition",rF=class{_items;_currentItem;constructor(e){this._items=e}hide(){this._items.forEach(e=>e.deactivateInkBar()),this._currentItem=void 0}alignToElement(e){let A=this._items.find(n=>n.elementRef.nativeElement===e),i=this._currentItem;if(A!==i&&(i?.deactivateInkBar(),A)){let n=i?.elementRef.nativeElement.getBoundingClientRect?.();A.activateInkBar(n),this._currentItem=A}}},jRA=(()=>{class t{_elementRef=w(ce);_inkBarElement=null;_inkBarContentElement=null;_fitToContent=!1;get fitInkBarToContent(){return this._fitToContent}set fitInkBarToContent(A){this._fitToContent!==A&&(this._fitToContent=A,this._inkBarElement&&this._appendInkBarElement())}activateInkBar(A){let i=this._elementRef.nativeElement;if(!A||!i.getBoundingClientRect||!this._inkBarContentElement){i.classList.add(aF);return}let n=i.getBoundingClientRect(),o=A.width/n.width,a=A.left-n.left;i.classList.add(eiA),this._inkBarContentElement.style.setProperty("transform",`translateX(${a}px) scaleX(${o})`),i.getBoundingClientRect(),i.classList.remove(eiA),i.classList.add(aF),this._inkBarContentElement.style.setProperty("transform","")}deactivateInkBar(){this._elementRef.nativeElement.classList.remove(aF)}ngOnInit(){this._createInkBarElement()}ngOnDestroy(){this._inkBarElement?.remove(),this._inkBarElement=this._inkBarContentElement=null}_createInkBarElement(){let A=this._elementRef.nativeElement.ownerDocument||document,i=this._inkBarElement=A.createElement("span"),n=this._inkBarContentElement=A.createElement("span");i.className="mdc-tab-indicator",n.className="mdc-tab-indicator__content mdc-tab-indicator__content--underline",i.appendChild(this._inkBarContentElement),this._appendInkBarElement()}_appendInkBarElement(){this._inkBarElement;let A=this._fitToContent?this._elementRef.nativeElement.querySelector(".mdc-tab__content"):this._elementRef.nativeElement;A.appendChild(this._inkBarElement)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,inputs:{fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",Be]}})}return t})();var aiA=(()=>{class t extends jRA{elementRef=w(ce);disabled=!1;focus(){this.elementRef.nativeElement.focus()}getOffsetLeft(){return this.elementRef.nativeElement.offsetLeft}getOffsetWidth(){return this.elementRef.nativeElement.offsetWidth}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275dir=VA({type:t,selectors:[["","matTabLabelWrapper",""]],hostVars:3,hostBindings:function(i,n){i&2&&(te("aria-disabled",!!n.disabled),RA("mat-mdc-tab-disabled",n.disabled))},inputs:{disabled:[2,"disabled","disabled",Be]},features:[mt]})}return t})(),tiA={passive:!0},qRA=650,VRA=100,WRA=(()=>{class t{_elementRef=w(ce);_changeDetectorRef=w(wt);_viewportRuler=w(Ms);_dir=w(fo,{optional:!0});_ngZone=w(qe);_platform=w(gi);_sharedResizeObserver=w(kp);_injector=w(Dt);_renderer=w(Pi);_animationsDisabled=An();_eventCleanups;_scrollDistance=0;_selectedIndexChanged=!1;_destroyed=new ie;_showPaginationControls=!1;_disableScrollAfter=!0;_disableScrollBefore=!0;_tabLabelCount;_scrollDistanceChanged=!1;_keyManager;_currentTextContent;_stopScrolling=new ie;disablePagination=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){let i=isNaN(A)?0:A;this._selectedIndex!=i&&(this._selectedIndexChanged=!0,this._selectedIndex=i,this._keyManager&&this._keyManager.updateActiveItem(i))}_selectedIndex=0;selectFocusedIndex=new LA;indexFocused=new LA;constructor(){this._eventCleanups=this._ngZone.runOutsideAngular(()=>[this._renderer.listen(this._elementRef.nativeElement,"mouseleave",()=>this._stopInterval())])}ngAfterViewInit(){this._eventCleanups.push(this._renderer.listen(this._previousPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("before"),tiA),this._renderer.listen(this._nextPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("after"),tiA))}ngAfterContentInit(){let A=this._dir?this._dir.change:ne("ltr"),i=this._sharedResizeObserver.observe(this._elementRef.nativeElement).pipe(Ls(32),Qt(this._destroyed)),n=this._viewportRuler.change(150).pipe(Qt(this._destroyed)),o=()=>{this.updatePagination(),this._alignInkBarToSelectedTab()};this._keyManager=new H0(this._items).withHorizontalOrientation(this._getLayoutDirection()).withHomeAndEnd().withWrap().skipPredicate(()=>!1),this._keyManager.updateActiveItem(Math.max(this._selectedIndex,0)),Hn(o,{injector:this._injector}),Ki(A,n,i,this._items.changes,this._itemsResized()).pipe(Qt(this._destroyed)).subscribe(()=>{this._ngZone.run(()=>{Promise.resolve().then(()=>{this._scrollDistance=Math.max(0,Math.min(this._getMaxScrollDistance(),this._scrollDistance)),o()})}),this._keyManager?.withHorizontalOrientation(this._getLayoutDirection())}),this._keyManager.change.subscribe(a=>{this.indexFocused.emit(a),this._setTabFocus(a)})}_itemsResized(){return typeof ResizeObserver!="function"?ar:this._items.changes.pipe(Sn(this._items),hi(A=>new vi(i=>this._ngZone.runOutsideAngular(()=>{let n=new ResizeObserver(o=>i.next(o));return A.forEach(o=>n.observe(o.elementRef.nativeElement)),()=>{n.disconnect()}}))),wl(1),gt(A=>A.some(i=>i.contentRect.width>0&&i.contentRect.height>0)))}ngAfterContentChecked(){this._tabLabelCount!=this._items.length&&(this.updatePagination(),this._tabLabelCount=this._items.length,this._changeDetectorRef.markForCheck()),this._selectedIndexChanged&&(this._scrollToLabel(this._selectedIndex),this._checkScrollingControls(),this._alignInkBarToSelectedTab(),this._selectedIndexChanged=!1,this._changeDetectorRef.markForCheck()),this._scrollDistanceChanged&&(this._updateTabScrollPosition(),this._scrollDistanceChanged=!1,this._changeDetectorRef.markForCheck())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._keyManager?.destroy(),this._destroyed.next(),this._destroyed.complete(),this._stopScrolling.complete()}_handleKeydown(A){if(!Qa(A))switch(A.keyCode){case 13:case 32:if(this.focusIndex!==this.selectedIndex){let i=this._items.get(this.focusIndex);i&&!i.disabled&&(this.selectFocusedIndex.emit(this.focusIndex),this._itemSelected(A))}break;default:this._keyManager?.onKeydown(A)}}_onContentChanges(){let A=this._elementRef.nativeElement.textContent;A!==this._currentTextContent&&(this._currentTextContent=A||"",this._ngZone.run(()=>{this.updatePagination(),this._alignInkBarToSelectedTab(),this._changeDetectorRef.markForCheck()}))}updatePagination(){this._checkPaginationEnabled(),this._checkScrollingControls(),this._updateTabScrollPosition()}get focusIndex(){return this._keyManager?this._keyManager.activeItemIndex:0}set focusIndex(A){!this._isValidIndex(A)||this.focusIndex===A||!this._keyManager||this._keyManager.setActiveItem(A)}_isValidIndex(A){return this._items?!!this._items.toArray()[A]:!0}_setTabFocus(A){if(this._showPaginationControls&&this._scrollToLabel(A),this._items&&this._items.length){this._items.toArray()[A].focus();let i=this._tabListContainer.nativeElement;this._getLayoutDirection()=="ltr"?i.scrollLeft=0:i.scrollLeft=i.scrollWidth-i.offsetWidth}}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_updateTabScrollPosition(){if(this.disablePagination)return;let A=this.scrollDistance,i=this._getLayoutDirection()==="ltr"?-A:A;this._tabList.nativeElement.style.transform=`translateX(${Math.round(i)}px)`,(this._platform.TRIDENT||this._platform.EDGE)&&(this._tabListContainer.nativeElement.scrollLeft=0)}get scrollDistance(){return this._scrollDistance}set scrollDistance(A){this._scrollTo(A)}_scrollHeader(A){let i=this._tabListContainer.nativeElement.offsetWidth,n=(A=="before"?-1:1)*i/3;return this._scrollTo(this._scrollDistance+n)}_handlePaginatorClick(A){this._stopInterval(),this._scrollHeader(A)}_scrollToLabel(A){if(this.disablePagination)return;let i=this._items?this._items.toArray()[A]:null;if(!i)return;let n=this._tabListContainer.nativeElement.offsetWidth,{offsetLeft:o,offsetWidth:a}=i.elementRef.nativeElement,r,s;this._getLayoutDirection()=="ltr"?(r=o,s=r+a):(s=this._tabListInner.nativeElement.offsetWidth-o,r=s-a);let l=this.scrollDistance,g=this.scrollDistance+n;rg&&(this.scrollDistance+=Math.min(s-g,r-l))}_checkPaginationEnabled(){if(this.disablePagination)this._showPaginationControls=!1;else{let A=this._tabListInner.nativeElement.scrollWidth,i=this._elementRef.nativeElement.offsetWidth,n=A-i>=5;n||(this.scrollDistance=0),n!==this._showPaginationControls&&(this._showPaginationControls=n,this._changeDetectorRef.markForCheck())}}_checkScrollingControls(){this.disablePagination?this._disableScrollAfter=this._disableScrollBefore=!0:(this._disableScrollBefore=this.scrollDistance==0,this._disableScrollAfter=this.scrollDistance==this._getMaxScrollDistance(),this._changeDetectorRef.markForCheck())}_getMaxScrollDistance(){let A=this._tabListInner.nativeElement.scrollWidth,i=this._tabListContainer.nativeElement.offsetWidth;return A-i||0}_alignInkBarToSelectedTab(){let A=this._items&&this._items.length?this._items.toArray()[this.selectedIndex]:null,i=A?A.elementRef.nativeElement:null;i?this._inkBar.alignToElement(i):this._inkBar.hide()}_stopInterval(){this._stopScrolling.next()}_handlePaginatorPress(A,i){i&&i.button!=null&&i.button!==0||(this._stopInterval(),Y3(qRA,VRA).pipe(Qt(Ki(this._stopScrolling,this._destroyed))).subscribe(()=>{let{maxScrollDistance:n,distance:o}=this._scrollHeader(A);(o===0||o>=n)&&this._stopInterval()}))}_scrollTo(A){if(this.disablePagination)return{maxScrollDistance:0,distance:0};let i=this._getMaxScrollDistance();return this._scrollDistance=Math.max(0,Math.min(i,A)),this._scrollDistanceChanged=!0,this._checkScrollingControls(),{maxScrollDistance:i,distance:this._scrollDistance}}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,inputs:{disablePagination:[2,"disablePagination","disablePagination",Be],selectedIndex:[2,"selectedIndex","selectedIndex",Cn]},outputs:{selectFocusedIndex:"selectFocusedIndex",indexFocused:"indexFocused"}})}return t})(),ZRA=(()=>{class t extends WRA{_items;_tabListContainer;_tabList;_tabListInner;_nextPaginator;_previousPaginator;_inkBar;ariaLabel;ariaLabelledby;disableRipple=!1;ngAfterContentInit(){this._inkBar=new rF(this._items),super.ngAfterContentInit()}_itemSelected(A){A.preventDefault()}static \u0275fac=(()=>{let A;return function(n){return(A||(A=bi(t)))(n||t)}})();static \u0275cmp=SA({type:t,selectors:[["mat-tab-header"]],contentQueries:function(i,n,o){if(i&1&&jo(o,aiA,4),i&2){let a;ae(a=re())&&(n._items=a)}},viewQuery:function(i,n){if(i&1&&Jt(SRA,7)(kRA,7)(xRA,7)(_RA,5)(RRA,5),i&2){let o;ae(o=re())&&(n._tabListContainer=o.first),ae(o=re())&&(n._tabList=o.first),ae(o=re())&&(n._tabListInner=o.first),ae(o=re())&&(n._nextPaginator=o.first),ae(o=re())&&(n._previousPaginator=o.first)}},hostAttrs:[1,"mat-mdc-tab-header"],hostVars:4,hostBindings:function(i,n){i&2&&RA("mat-mdc-tab-header-pagination-controls-enabled",n._showPaginationControls)("mat-mdc-tab-header-rtl",n._getLayoutDirection()=="rtl")},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],disableRipple:[2,"disableRipple","disableRipple",Be]},features:[mt],ngContentSelectors:gF,decls:13,vars:10,consts:[["previousPaginator",""],["tabListContainer",""],["tabList",""],["tabListInner",""],["nextPaginator",""],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-before",3,"click","mousedown","touchend","matRippleDisabled"],[1,"mat-mdc-tab-header-pagination-chevron"],[1,"mat-mdc-tab-label-container",3,"keydown"],["role","tablist",1,"mat-mdc-tab-list",3,"cdkObserveContent"],[1,"mat-mdc-tab-labels"],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-after",3,"mousedown","click","touchend","matRippleDisabled"]],template:function(i,n){i&1&&(Rt(),B(0,"div",5,0),U("click",function(){return n._handlePaginatorClick("before")})("mousedown",function(a){return n._handlePaginatorPress("before",a)})("touchend",function(){return n._stopInterval()}),hA(2,"div",6),Q(),B(3,"div",7,1),U("keydown",function(a){return n._handleKeydown(a)}),B(5,"div",8,2),U("cdkObserveContent",function(){return n._onContentChanges()}),B(7,"div",9,3),Ve(9),Q()()(),B(10,"div",10,4),U("mousedown",function(a){return n._handlePaginatorPress("after",a)})("click",function(){return n._handlePaginatorClick("after")})("touchend",function(){return n._stopInterval()}),hA(12,"div",6),Q()),i&2&&(RA("mat-mdc-tab-header-pagination-disabled",n._disableScrollBefore),H("matRippleDisabled",n._disableScrollBefore||n.disableRipple),u(3),RA("_mat-animation-noopable",n._animationsDisabled),u(2),te("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby||null),u(5),RA("mat-mdc-tab-header-pagination-disabled",n._disableScrollAfter),H("matRippleDisabled",n._disableScrollAfter||n.disableRipple))},dependencies:[rs,tG],styles:[`.mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mdc-tab-indicator .mdc-tab-indicator__content{transition-duration:var(--mat-tab-animation-duration, 250ms)}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;outline:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-pagination-icon-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1;border-bottom-style:solid;border-bottom-width:var(--mat-tab-divider-height, 1px);border-bottom-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-group-inverted-header .mat-mdc-tab-label-container{border-bottom:none;border-top-style:solid;border-top-width:var(--mat-tab-divider-height, 1px);border-top-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.cdk-drop-list .mat-mdc-tab-labels,.mat-mdc-tab-labels.cdk-drop-list{min-height:var(--mat-tab-container-height, 48px)}.mat-mdc-tab::before{margin:5px}@media(forced-colors: active){.mat-mdc-tab[aria-disabled=true]{color:GrayText}} -`],encapsulation:2})}return t})(),XRA=new kA("MAT_TABS_CONFIG"),iiA=(()=>{class t extends Wl{_host=w(sF);_ngZone=w(qe);_centeringSub=bo.EMPTY;_leavingSub=bo.EMPTY;constructor(){super()}ngOnInit(){super.ngOnInit(),this._centeringSub=this._host._beforeCentering.pipe(Sn(this._host._isCenterPosition())).subscribe(A=>{this._host._content&&A&&!this.hasAttached()&&this._ngZone.run(()=>{Promise.resolve().then(),this.attach(this._host._content)})}),this._leavingSub=this._host._afterLeavingCenter.subscribe(()=>{this._host.preserveContent||this._ngZone.run(()=>this.detach())})}ngOnDestroy(){super.ngOnDestroy(),this._centeringSub.unsubscribe(),this._leavingSub.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=VA({type:t,selectors:[["","matTabBodyHost",""]],features:[mt]})}return t})(),sF=(()=>{class t{_elementRef=w(ce);_dir=w(fo,{optional:!0});_ngZone=w(qe);_injector=w(Dt);_renderer=w(Pi);_diAnimationsDisabled=An();_eventCleanups;_initialized=!1;_fallbackTimer;_positionIndex;_dirChangeSubscription=bo.EMPTY;_position;_previousPosition;_onCentering=new LA;_beforeCentering=new LA;_afterLeavingCenter=new LA;_onCentered=new LA(!0);_portalHost;_contentElement;_content;animationDuration="500ms";preserveContent=!1;set position(A){this._positionIndex=A,this._computePositionAnimationState()}constructor(){if(this._dir){let A=w(wt);this._dirChangeSubscription=this._dir.change.subscribe(i=>{this._computePositionAnimationState(i),A.markForCheck()})}}ngOnInit(){this._bindTransitionEvents(),this._position==="center"&&(this._setActiveClass(!0),Hn(()=>this._onCentering.emit(this._elementRef.nativeElement.clientHeight),{injector:this._injector})),this._initialized=!0}ngOnDestroy(){clearTimeout(this._fallbackTimer),this._eventCleanups?.forEach(A=>A()),this._dirChangeSubscription.unsubscribe()}_bindTransitionEvents(){this._ngZone.runOutsideAngular(()=>{let A=this._elementRef.nativeElement,i=n=>{n.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.remove("mat-tab-body-animating"),n.type==="transitionend"&&this._transitionDone())};this._eventCleanups=[this._renderer.listen(A,"transitionstart",n=>{n.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.add("mat-tab-body-animating"),this._transitionStarted())}),this._renderer.listen(A,"transitionend",i),this._renderer.listen(A,"transitioncancel",i)]})}_transitionStarted(){clearTimeout(this._fallbackTimer);let A=this._position==="center";this._beforeCentering.emit(A),A&&this._onCentering.emit(this._elementRef.nativeElement.clientHeight)}_transitionDone(){this._position==="center"?this._onCentered.emit():this._previousPosition==="center"&&this._afterLeavingCenter.emit()}_setActiveClass(A){this._elementRef.nativeElement.classList.toggle("mat-mdc-tab-body-active",A)}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_isCenterPosition(){return this._positionIndex===0}_computePositionAnimationState(A=this._getLayoutDirection()){this._previousPosition=this._position,this._positionIndex<0?this._position=A=="ltr"?"left":"right":this._positionIndex>0?this._position=A=="ltr"?"right":"left":this._position="center",this._animationsDisabled()?this._simulateTransitionEvents():this._initialized&&(this._position==="center"||this._previousPosition==="center")&&(clearTimeout(this._fallbackTimer),this._fallbackTimer=this._ngZone.runOutsideAngular(()=>setTimeout(()=>this._simulateTransitionEvents(),100)))}_simulateTransitionEvents(){this._transitionStarted(),Hn(()=>this._transitionDone(),{injector:this._injector})}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration==="0ms"||this.animationDuration==="0s"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-tab-body"]],viewQuery:function(i,n){if(i&1&&Jt(iiA,5)(NRA,5),i&2){let o;ae(o=re())&&(n._portalHost=o.first),ae(o=re())&&(n._contentElement=o.first)}},hostAttrs:[1,"mat-mdc-tab-body"],hostVars:1,hostBindings:function(i,n){i&2&&te("inert",n._position==="center"?null:"")},inputs:{_content:[0,"content","_content"],animationDuration:"animationDuration",preserveContent:"preserveContent",position:"position"},outputs:{_onCentering:"_onCentering",_beforeCentering:"_beforeCentering",_onCentered:"_onCentered"},decls:3,vars:6,consts:[["content",""],["cdkScrollable","",1,"mat-mdc-tab-body-content"],["matTabBodyHost",""]],template:function(i,n){i&1&&(B(0,"div",1,0),Et(2,FRA,0,0,"ng-template",2),Q()),i&2&&RA("mat-tab-body-content-left",n._position==="left")("mat-tab-body-content-right",n._position==="right")("mat-tab-body-content-can-animate",n._position==="center"||n._previousPosition==="center")},dependencies:[iiA,W0],styles:[`.mat-mdc-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-mdc-tab-body.mat-mdc-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-mdc-tab-group.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body.mat-mdc-tab-body-active{overflow-y:hidden}.mat-mdc-tab-body-content{height:100%;overflow:auto;transform:none;visibility:hidden}.mat-tab-body-animating>.mat-mdc-tab-body-content,.mat-mdc-tab-body-active>.mat-mdc-tab-body-content{visibility:visible}.mat-tab-body-animating>.mat-mdc-tab-body-content{min-height:1px}.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body-content{overflow:hidden}.mat-tab-body-content-can-animate{transition:transform var(--mat-tab-animation-duration) 1ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable .mat-tab-body-content-can-animate{transition:none}.mat-tab-body-content-left{transform:translate3d(-100%, 0, 0)}.mat-tab-body-content-right{transform:translate3d(100%, 0, 0)} -`],encapsulation:2})}return t})(),lv=(()=>{class t{_elementRef=w(ce);_changeDetectorRef=w(wt);_ngZone=w(qe);_tabsSubscription=bo.EMPTY;_tabLabelSubscription=bo.EMPTY;_tabBodySubscription=bo.EMPTY;_diAnimationsDisabled=An();_allTabs;_tabBodies;_tabBodyWrapper;_tabHeader;_tabs=new xg;_indexToSelect=0;_lastFocusedTabIndex=null;_tabBodyWrapperHeight=0;color;get fitInkBarToContent(){return this._fitInkBarToContent}set fitInkBarToContent(A){this._fitInkBarToContent=A,this._changeDetectorRef.markForCheck()}_fitInkBarToContent=!1;stretchTabs=!0;alignTabs=null;dynamicHeight=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){this._indexToSelect=isNaN(A)?null:A}_selectedIndex=null;headerPosition="above";get animationDuration(){return this._animationDuration}set animationDuration(A){let i=A+"";this._animationDuration=/^\d+$/.test(i)?A+"ms":i}_animationDuration;get contentTabIndex(){return this._contentTabIndex}set contentTabIndex(A){this._contentTabIndex=isNaN(A)?null:A}_contentTabIndex=null;disablePagination=!1;disableRipple=!1;preserveContent=!1;get backgroundColor(){return this._backgroundColor}set backgroundColor(A){let i=this._elementRef.nativeElement.classList;i.remove("mat-tabs-with-background",`mat-background-${this.backgroundColor}`),A&&i.add("mat-tabs-with-background",`mat-background-${A}`),this._backgroundColor=A}_backgroundColor;ariaLabel;ariaLabelledby;selectedIndexChange=new LA;focusChange=new LA;animationDone=new LA;selectedTabChange=new LA(!0);_groupId;_isServer=!w(gi).isBrowser;constructor(){let A=w(XRA,{optional:!0});this._groupId=w(In).getId("mat-tab-group-"),this.animationDuration=A&&A.animationDuration?A.animationDuration:"500ms",this.disablePagination=A&&A.disablePagination!=null?A.disablePagination:!1,this.dynamicHeight=A&&A.dynamicHeight!=null?A.dynamicHeight:!1,A?.contentTabIndex!=null&&(this.contentTabIndex=A.contentTabIndex),this.preserveContent=!!A?.preserveContent,this.fitInkBarToContent=A&&A.fitInkBarToContent!=null?A.fitInkBarToContent:!1,this.stretchTabs=A&&A.stretchTabs!=null?A.stretchTabs:!0,this.alignTabs=A&&A.alignTabs!=null?A.alignTabs:null}ngAfterContentChecked(){let A=this._indexToSelect=this._clampTabIndex(this._indexToSelect);if(this._selectedIndex!=A){let i=this._selectedIndex==null;if(!i){this.selectedTabChange.emit(this._createChangeEvent(A));let n=this._tabBodyWrapper.nativeElement;n.style.minHeight=n.clientHeight+"px"}Promise.resolve().then(()=>{this._tabs.forEach((n,o)=>n.isActive=o===A),i||(this.selectedIndexChange.emit(A),this._tabBodyWrapper.nativeElement.style.minHeight="")})}this._tabs.forEach((i,n)=>{i.position=n-A,this._selectedIndex!=null&&i.position==0&&!i.origin&&(i.origin=A-this._selectedIndex)}),this._selectedIndex!==A&&(this._selectedIndex=A,this._lastFocusedTabIndex=null,this._changeDetectorRef.markForCheck())}ngAfterContentInit(){this._subscribeToAllTabChanges(),this._subscribeToTabLabels(),this._tabsSubscription=this._tabs.changes.subscribe(()=>{let A=this._clampTabIndex(this._indexToSelect);if(A===this._selectedIndex){let i=this._tabs.toArray(),n;for(let o=0;o{i[A].isActive=!0,this.selectedTabChange.emit(this._createChangeEvent(A))})}this._changeDetectorRef.markForCheck()})}ngAfterViewInit(){this._tabBodySubscription=this._tabBodies.changes.subscribe(()=>this._bodyCentered(!0))}_subscribeToAllTabChanges(){this._allTabs.changes.pipe(Sn(this._allTabs)).subscribe(A=>{this._tabs.reset(A.filter(i=>i._closestTabGroup===this||!i._closestTabGroup)),this._tabs.notifyOnChanges()})}ngOnDestroy(){this._tabs.destroy(),this._tabsSubscription.unsubscribe(),this._tabLabelSubscription.unsubscribe(),this._tabBodySubscription.unsubscribe()}realignInkBar(){this._tabHeader&&this._tabHeader._alignInkBarToSelectedTab()}updatePagination(){this._tabHeader&&this._tabHeader.updatePagination()}focusTab(A){let i=this._tabHeader;i&&(i.focusIndex=A)}_focusChanged(A){this._lastFocusedTabIndex=A,this.focusChange.emit(this._createChangeEvent(A))}_createChangeEvent(A){let i=new lF;return i.index=A,this._tabs&&this._tabs.length&&(i.tab=this._tabs.toArray()[A]),i}_subscribeToTabLabels(){this._tabLabelSubscription&&this._tabLabelSubscription.unsubscribe(),this._tabLabelSubscription=Ki(...this._tabs.map(A=>A._stateChanges)).subscribe(()=>this._changeDetectorRef.markForCheck())}_clampTabIndex(A){return Math.min(this._tabs.length-1,Math.max(A||0,0))}_getTabLabelId(A,i){return A.id||`${this._groupId}-label-${i}`}_getTabContentId(A){return`${this._groupId}-content-${A}`}_setTabBodyWrapperHeight(A){if(!this.dynamicHeight||!this._tabBodyWrapperHeight){this._tabBodyWrapperHeight=A;return}let i=this._tabBodyWrapper.nativeElement;i.style.height=this._tabBodyWrapperHeight+"px",this._tabBodyWrapper.nativeElement.offsetHeight&&(i.style.height=A+"px")}_removeTabBodyWrapperHeight(){let A=this._tabBodyWrapper.nativeElement;this._tabBodyWrapperHeight=A.clientHeight,A.style.height="",this._ngZone.run(()=>this.animationDone.emit())}_handleClick(A,i,n){i.focusIndex=n,A.disabled||(this.selectedIndex=n)}_getTabIndex(A){let i=this._lastFocusedTabIndex??this.selectedIndex;return A===i?0:-1}_tabFocusChanged(A,i){A&&A!=="mouse"&&A!=="touch"&&(this._tabHeader.focusIndex=i)}_bodyCentered(A){A&&this._tabBodies?.forEach((i,n)=>i._setActiveClass(n===this._selectedIndex))}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration==="0"||this.animationDuration==="0ms"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=SA({type:t,selectors:[["mat-tab-group"]],contentQueries:function(i,n,o){if(i&1&&jo(o,CF,5),i&2){let a;ae(a=re())&&(n._allTabs=a)}},viewQuery:function(i,n){if(i&1&&Jt(LRA,5)(GRA,5)(sF,5),i&2){let o;ae(o=re())&&(n._tabBodyWrapper=o.first),ae(o=re())&&(n._tabHeader=o.first),ae(o=re())&&(n._tabBodies=o)}},hostAttrs:[1,"mat-mdc-tab-group"],hostVars:11,hostBindings:function(i,n){i&2&&(te("mat-align-tabs",n.alignTabs),ro("mat-"+(n.color||"primary")),ut("--mat-tab-animation-duration",n.animationDuration),RA("mat-mdc-tab-group-dynamic-height",n.dynamicHeight)("mat-mdc-tab-group-inverted-header",n.headerPosition==="below")("mat-mdc-tab-group-stretch-tabs",n.stretchTabs))},inputs:{color:"color",fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",Be],stretchTabs:[2,"mat-stretch-tabs","stretchTabs",Be],alignTabs:[0,"mat-align-tabs","alignTabs"],dynamicHeight:[2,"dynamicHeight","dynamicHeight",Be],selectedIndex:[2,"selectedIndex","selectedIndex",Cn],headerPosition:"headerPosition",animationDuration:"animationDuration",contentTabIndex:[2,"contentTabIndex","contentTabIndex",Cn],disablePagination:[2,"disablePagination","disablePagination",Be],disableRipple:[2,"disableRipple","disableRipple",Be],preserveContent:[2,"preserveContent","preserveContent",Be],backgroundColor:"backgroundColor",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"]},outputs:{selectedIndexChange:"selectedIndexChange",focusChange:"focusChange",animationDone:"animationDone",selectedTabChange:"selectedTabChange"},exportAs:["matTabGroup"],features:[Bt([{provide:oiA,useExisting:t}])],ngContentSelectors:gF,decls:9,vars:8,consts:[["tabHeader",""],["tabBodyWrapper",""],["tabNode",""],[3,"indexFocused","selectFocusedIndex","selectedIndex","disableRipple","disablePagination","aria-label","aria-labelledby"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"id","mdc-tab--active","class","disabled","fitInkBarToContent"],[1,"mat-mdc-tab-body-wrapper"],["role","tabpanel",3,"id","class","content","position","animationDuration","preserveContent"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"click","cdkFocusChange","id","disabled","fitInkBarToContent"],[1,"mdc-tab__ripple"],["mat-ripple","",1,"mat-mdc-tab-ripple",3,"matRippleTrigger","matRippleDisabled"],[1,"mdc-tab__content"],[1,"mdc-tab__text-label"],[3,"cdkPortalOutlet"],["role","tabpanel",3,"_onCentered","_onCentering","_beforeCentering","id","content","position","animationDuration","preserveContent"]],template:function(i,n){i&1&&(Rt(),B(0,"mat-tab-header",3,0),U("indexFocused",function(a){return n._focusChanged(a)})("selectFocusedIndex",function(a){return n.selectedIndex=a}),Ue(2,JRA,8,17,"div",4,ri),Q(),O(4,ORA,1,0),B(5,"div",5,1),Ue(7,YRA,1,10,"mat-tab-body",6,ri),Q()),i&2&&(H("selectedIndex",n.selectedIndex||0)("disableRipple",n.disableRipple)("disablePagination",n.disablePagination),Ap("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby),u(2),Te(n._tabs),u(2),Y(n._isServer?4:-1),u(),RA("_mat-animation-noopable",n._animationsDisabled()),u(2),Te(n._tabs))},dependencies:[ZRA,aiA,Db,rs,Wl,sF],styles:[`.mdc-tab{min-width:90px;padding:0 24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;z-index:1;touch-action:manipulation}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab--active .mdc-tab__text-label{transition-delay:100ms}._mat-animation-noopable .mdc-tab__text-label{transition:none}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transition:var(--mat-tab-animation-duration, 250ms) transform cubic-bezier(0.4, 0, 0.2, 1);transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}._mat-animation-noopable .mdc-tab-indicator__content,.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mat-mdc-tab-ripple.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;height:var(--mat-tab-container-height, 48px);font-family:var(--mat-tab-label-text-font, var(--mat-sys-title-small-font));font-size:var(--mat-tab-label-text-size, var(--mat-sys-title-small-size));letter-spacing:var(--mat-tab-label-text-tracking, var(--mat-sys-title-small-tracking));line-height:var(--mat-tab-label-text-line-height, var(--mat-sys-title-small-line-height));font-weight:var(--mat-tab-label-text-weight, var(--mat-sys-title-small-weight))}.mat-mdc-tab.mdc-tab{flex-grow:0}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-tab-active-indicator-height, 2px);border-radius:var(--mat-tab-active-indicator-shape, 0)}.mat-mdc-tab:hover .mdc-tab__text-label{color:var(--mat-tab-inactive-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab:focus .mdc-tab__text-label{color:var(--mat-tab-inactive-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-active-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-active-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-active-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-hover-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-active-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-focus-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-disabled-ripple-color, var(--mat-sys-on-surface-variant))}.mat-mdc-tab .mdc-tab__ripple::before{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-inactive-label-text-color, var(--mat-sys-on-surface));display:inline-flex;align-items:center}.mat-mdc-tab .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-group.mat-mdc-tab-group-stretch-tabs>.mat-mdc-tab-header .mat-mdc-tab{flex-grow:1}.mat-mdc-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-background-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-focus-indicator::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-focus-indicator::before{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mdc-tab__ripple::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header{flex-direction:column-reverse}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header .mdc-tab-indicator__content--underline{align-self:flex-start}.mat-mdc-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important} -`],encapsulation:2})}return t})(),lF=class{index;tab};var $RA=["consoleArea"];function ANA(t,e){t&1&&hA(0,"mat-progress-bar",3)}var _3=class t{constructor(e,A){this.dialogRef=e;this.data=A}consoleOutput=bA("");isLoading=bA(!0);subscription;consoleArea;ngOnInit(){this.subscription=this.data.output$.subscribe({next:e=>{this.consoleOutput.update(A=>A+e),this.scrollToBottom()},complete:()=>{this.isLoading.set(!1)}})}ngOnDestroy(){this.subscription?.unsubscribe()}scrollToBottom(){setTimeout(()=>{if(this.consoleArea){let e=this.consoleArea.nativeElement;e.scrollTop=e.scrollHeight}},0)}close(){this.dialogRef.close()}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-console-dialog"]],viewQuery:function(A,i){if(A&1&&Jt($RA,5),A&2){let n;ae(n=re())&&(i.consoleArea=n.first)}},decls:11,vars:3,consts:[["consoleArea",""],["mat-dialog-title",""],[1,"mat-typography"],["mode","indeterminate",2,"margin-bottom","8px"],[1,"console-box"],["align","end"],["mat-button","",3,"click"]],template:function(A,i){A&1&&(B(0,"h2",1),y(1),Q(),B(2,"mat-dialog-content",2),O(3,ANA,1,0,"mat-progress-bar",3),B(4,"div",4,0)(6,"pre"),y(7),Q()()(),B(8,"mat-dialog-actions",5)(9,"button",6),U("click",function(){return i.close()}),y(10,"Close"),Q()()),A&2&&(u(),lA(i.data.title),u(2),Y(i.isLoading()?3:-1),u(4),lA(i.consoleOutput()))},dependencies:[li,qi,pi,Xc,fa,pa,Na,IQ,CQ],styles:[".console-box[_ngcontent-%COMP%]{background-color:#1e1e1e;color:#dcdcdc;padding:16px;border-radius:4px;min-height:200px;flex:1;overflow-y:auto;font-family:Roboto Mono,monospace;font-size:12px}.console-box[_ngcontent-%COMP%] pre[_ngcontent-%COMP%]{margin:0;white-space:pre-wrap;word-wrap:break-word} .mat-mdc-dialog-content{max-height:70vh!important;overflow:hidden!important;display:flex;flex-direction:column}"]})};function eNA(t,e){t&1&&(B(0,"div",7),hA(1,"mat-spinner",8),Q())}var R3=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.inputValue=A.value}inputValue;loading=bA(!1);onCancel(){this.dialogRef.close()}onSubmitClick(){this.inputValue&&(this.loading.set(!0),this.data.onSubmit(this.inputValue).subscribe({next:()=>{this.loading.set(!1),this.dialogRef.close(!0)},error:e=>{this.loading.set(!1),window.alert(`Operation failed: ${e.message||e}`)}}))}static \u0275fac=function(A){return new(A||t)(ct(lo),ct(qo))};static \u0275cmp=SA({type:t,selectors:[["app-prompt-dialog"]],decls:13,vars:7,consts:[["mat-dialog-title",""],[1,"full-width"],["matInput","",3,"ngModelChange","ngModel","disabled"],["class","spinner-container",4,"ngIf"],["align","end"],["mat-button","",3,"click","disabled"],["mat-button","","color","primary",3,"click","disabled"],[1,"spinner-container"],["diameter","40"]],template:function(A,i){A&1&&(B(0,"h2",0),y(1),Q(),B(2,"mat-dialog-content")(3,"mat-form-field",1)(4,"mat-label"),y(5),Q(),B(6,"input",2),Di("ngModelChange",function(o){return Bi(i.inputValue,o)||(i.inputValue=o),o}),Q()(),Et(7,eNA,2,0,"div",3),Q(),B(8,"mat-dialog-actions",4)(9,"button",5),U("click",function(){return i.onCancel()}),y(10,"Cancel"),Q(),B(11,"button",6),U("click",function(){return i.onSubmitClick()}),y(12,"Submit"),Q()()),A&2&&(u(),lA(i.data.title),u(4),lA(i.data.label),u(),wi("ngModel",i.inputValue),H("disabled",i.loading()),u(),H("ngIf",i.loading()),u(2),H("disabled",i.loading()),u(2),H("disabled",i.loading()||!i.inputValue))},dependencies:[li,Js,Xc,fa,pa,Na,qi,pi,Ya,Ko,vs,Ps,ua,E2,gs,ln,Dn,yn,ko],styles:[".full-width[_ngcontent-%COMP%]{width:100%}.spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:16px}"]})};function tNA(t,e){t&1&&(B(0,"div",6)(1,"mat-icon"),y(2,"assignment_late"),Q(),B(3,"span"),y(4,"No tests found for this agent."),Q()())}function iNA(t,e){t&1&&(B(0,"th",13),y(1," Test Name "),Q())}function nNA(t,e){if(t&1&&(B(0,"td",14),y(1),Q()),t&2){let A=e.$implicit;u(),ue(" ",A.replace(".json","")," ")}}function oNA(t,e){t&1&&(B(0,"th",13),y(1," Actions "),Q())}function aNA(t,e){if(t&1){let A=QA();B(0,"td",14)(1,"button",15),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.runTest(n))}),B(2,"mat-icon"),y(3,"play_arrow"),Q()(),B(4,"button",16),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.rebuildTest(n))}),B(5,"mat-icon"),y(6,"sync"),Q()(),B(7,"button",17),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.renameTest(n))}),B(8,"mat-icon"),y(9,"edit"),Q()(),B(10,"button",18),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.deleteTest(n))}),B(11,"mat-icon"),y(12,"delete"),Q()()()}if(t&2){let A=p(2);u(),H("disabled",A.isRunning()||A.isRebuilding()),u(3),H("disabled",A.isRunning()||A.isRebuilding()),u(3),H("disabled",A.isRunning()||A.isRebuilding()),u(3),H("disabled",A.isRunning()||A.isRebuilding())}}function rNA(t,e){if(t&1){let A=QA();B(0,"tr",19),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.selectTest(n))}),Q()}if(t&2){let A=e.$implicit,i=p(2);RA("selected-row",A===i.selectedTest())}}function sNA(t,e){if(t&1&&(B(0,"table",7),Dl(1,8),Et(2,iNA,2,0,"th",9)(3,nNA,2,1,"td",10),yl(),Dl(4,11),Et(5,oNA,2,0,"th",9)(6,aNA,13,4,"td",10),yl(),Et(7,rNA,1,2,"tr",12),Q()),t&2){let A=p();H("dataSource",A.dataSource),u(7),H("matRowDefColumns",A.displayedColumns)}}var gv=class t{appName=me("");sessionId=me("");userId=me("");isViewOnlySession=me(!1);testsService=w(u2);dialog=w(Or);sessionService=w(Al);dataSource=new Td([]);consoleOutput=bA("");selectedTest=bA(null);testSelected=ui();isRunning=bA(!1);isRebuilding=bA(!1);displayedColumns=["name","actions"];ngOnInit(){this.loadTests()}ngOnChanges(e){e.appName&&!e.appName.isFirstChange()&&this.loadTests()}loadTests(){this.appName()&&this.testsService.listTests(this.appName()).subscribe(e=>{this.dataSource.data=e})}selectTest(e){this.selectedTest.set(e),this.testsService.getTest(this.appName(),e).subscribe(A=>{this.testSelected.emit({testName:e,events:A.events||[]})})}promoteCurrentSessionToTest(){this.sessionId()&&this.sessionService.getSession(this.userId(),this.appName(),this.sessionId()).subscribe(e=>{let i=(e.state?.__session_metadata__?.displayName||this.sessionId()).replace(/ /g,"_").replace(/[^a-zA-Z0-9_-]/g,""),n={events:e.events};this.dialog.open(R3,{data:{title:"Add Current Session as Test",label:"Test Name",value:i,onSubmit:o=>this.testsService.createTest(this.appName(),o,n).pipe(hi(()=>this.testsService.rebuildTests(this.appName(),o)))}}).afterClosed().subscribe(o=>{o&&this.loadTests()})})}renameTest(e){this.dialog.open(R3,{data:{title:"Rename Test",label:"New Name",value:e.replace(".json",""),onSubmit:A=>{let i=A.replace(/ /g,"_").replace(/[^a-zA-Z0-9_-]/g,"");return this.testsService.getTest(this.appName(),e).pipe(hi(n=>this.testsService.createTest(this.appName(),i,n)),hi(()=>this.testsService.deleteTest(this.appName(),e)))}}}).afterClosed().subscribe(A=>{A&&this.loadTests()})}runAllTests(){this.runTest()}runTest(e){this.isRunning.set(!0);let A=new ie;this.dialog.open(_3,{width:"90vw",maxWidth:"1200px",height:"80vh",data:{title:`Running ${e||"all tests"}`,output$:A.asObservable()}}),this.testsService.runTests(this.appName(),e).subscribe({next:i=>{A.next(i)},error:i=>{A.next(` -Error: ${i.message||i}`),this.isRunning.set(!1),A.complete()},complete:()=>{this.isRunning.set(!1),A.complete()}})}deleteTest(e){confirm(`Are you sure you want to delete test ${e}?`)&&this.testsService.deleteTest(this.appName(),e).subscribe(()=>{this.loadTests()})}rebuildAllTests(){this.rebuildTest()}rebuildTest(e){this.isRebuilding.set(!0);let A=new ie;this.dialog.open(_3,{width:"90vw",maxWidth:"1200px",height:"80vh",data:{title:`Rebuilding ${e||"all tests"}`,output$:A.asObservable()}}),A.next(`Rebuilding tests... -`),this.testsService.rebuildTests(this.appName(),e).subscribe({next:()=>{A.next(`Successfully rebuilt tests. -`),this.isRebuilding.set(!1),this.loadTests(),A.complete()},error:i=>{A.next(`Error rebuilding tests: ${i.message||i} -`),this.isRebuilding.set(!1),A.complete()}})}clearConsole(){this.consoleOutput.set("")}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-tests-tab"]],inputs:{appName:[1,"appName"],sessionId:[1,"sessionId"],userId:[1,"userId"],isViewOnlySession:[1,"isViewOnlySession"]},outputs:{testSelected:"testSelected"},features:[Yt],decls:20,vars:4,consts:[[1,"tests-container"],[1,"toolbar"],["mat-button","","color","primary",3,"click","disabled"],["mat-button","","color","accent",3,"click","disabled"],[1,"spacer"],["mat-icon-button","","matTooltip","Refresh",3,"click"],[1,"empty-state"],["mat-table","",1,"tests-table",3,"dataSource"],["matColumnDef","name"],["mat-header-cell","",4,"matHeaderCellDef"],["mat-cell","",4,"matCellDef"],["matColumnDef","actions"],["mat-row","",3,"selected-row","click",4,"matRowDef","matRowDefColumns"],["mat-header-cell",""],["mat-cell",""],["mat-icon-button","","color","primary","matTooltip","Run Test",3,"click","disabled"],["mat-icon-button","","color","accent","matTooltip","Rebuild Test",3,"click","disabled"],["mat-icon-button","","color","primary","matTooltip","Rename Test",3,"click","disabled"],["mat-icon-button","","color","warn","matTooltip","Delete Test",3,"click","disabled"],["mat-row","",3,"click"]],template:function(A,i){A&1&&(B(0,"div",0)(1,"div",1)(2,"button",2),U("click",function(){return i.promoteCurrentSessionToTest()}),B(3,"mat-icon"),y(4,"add"),Q(),y(5," From Current Session "),Q(),B(6,"button",2),U("click",function(){return i.runAllTests()}),B(7,"mat-icon"),y(8,"playlist_play"),Q(),y(9," Run All "),Q(),B(10,"button",3),U("click",function(){return i.rebuildAllTests()}),B(11,"mat-icon"),y(12,"sync"),Q(),y(13," Rebuild All "),Q(),hA(14,"span",4),B(15,"button",5),U("click",function(){return i.loadTests()}),B(16,"mat-icon"),y(17,"refresh"),Q()()(),O(18,tNA,5,0,"div",6)(19,sNA,8,2,"table",7),Q()),A&2&&(u(2),H("disabled",!i.sessionId()||i.isViewOnlySession()),u(4),H("disabled",i.isRunning()||i.isRebuilding()||i.dataSource.data.length===0),u(4),H("disabled",i.isRunning()||i.isRebuilding()||i.dataSource.data.length===0),u(8),Y(i.dataSource.data.length===0?18:19))},dependencies:[li,qi,pi,ji,Tn,Wt,TtA,YtA,OtA,HtA,JtA,ztA,PtA,jtA,Fa,dn,E2,IQ,Xc],styles:[".tests-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;box-sizing:border-box}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 10px;background-color:var(--mat-sys-surface-container);border-bottom:1px solid var(--mat-sys-outline-variant);gap:8px}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%]{flex:1 1 auto}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{height:32px!important;line-height:normal!important;border-radius:16px!important;font-size:13px!important;font-weight:500!important;display:inline-flex!important;align-items:center;justify-content:center}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%]{padding:0 12px!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:4px!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%]{width:32px!important;min-width:32px!important;padding:0!important;border-radius:50%!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:0!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button.mat-mdc-icon-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple{width:32px!important;height:32px!important;border-radius:50%!important}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px!important;width:20px!important;height:20px!important;line-height:20px!important;vertical-align:middle}.tests-container[_ngcontent-%COMP%] .toolbar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{vertical-align:middle}.tests-container[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px;color:var(--mat-sys-on-surface-variant);font-style:italic;gap:8px}.tests-container[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%]{width:100%;background:transparent;border-top:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{font-weight:600}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{vertical-align:middle;padding:6px 16px;border-bottom:1px solid var(--mat-sys-outline-variant, #e0e0e0)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr.mat-header-row[_ngcontent-%COMP%]{display:none}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]{cursor:pointer;background:transparent}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-container-low, #f5f5f5)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover td.mat-column-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{opacity:1}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr.selected-row[_ngcontent-%COMP%]{background-color:var(--mat-sys-surface-container-high, #e0e0e0)}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] td.mat-column-actions[_ngcontent-%COMP%]{text-align:right}.tests-container[_ngcontent-%COMP%] .tests-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] td.mat-column-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{opacity:0;transition:opacity .2s ease-in-out}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%]{margin-top:16px;display:flex;flex-direction:column;gap:8px;flex:1;min-height:200px}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;font-size:1.1rem;font-weight:600}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-size:.9rem;color:var(--mat-sys-on-surface-variant)}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-actions[_ngcontent-%COMP%] .running-status[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_pulse 1.5s infinite}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]{background-color:#1e1e1e;color:#d4d4d4;padding:12px;border-radius:4px;font-family:Courier New,Courier,monospace;font-size:.85rem;overflow:auto;flex:1;margin:0;white-space:pre-wrap;word-break:break-all;border:1px solid #333}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar{width:8px;height:8px}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#555;border-radius:4px}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover{background:#777}.tests-container[_ngcontent-%COMP%] .console-section[_ngcontent-%COMP%] .console-box[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:#1e1e1e}@keyframes _ngcontent-%COMP%_pulse{0%{opacity:.6}50%{opacity:1}to{opacity:.6}}"]})};var lNA={stateIsEmpty:"State is empty"},riA=new kA("State Tab Messages",{factory:()=>lNA});function gNA(t,e){if(t&1&&(B(0,"div",1),y(1),Q()),t&2){let A=p();u(),lA(A.i18n.stateIsEmpty)}}function cNA(t,e){if(t&1&&(B(0,"div"),hA(1,"ngx-json-viewer",2),Q()),t&2){let A=p();u(),H("json",A.sessionState)}}var cv=class t{sessionState;i18n=w(riA);get isEmptyState(){return!this.sessionState||Object.keys(this.sessionState).length===0}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-state-tab"]],inputs:{sessionState:"sessionState"},decls:3,vars:1,consts:[[1,"state-wrapper"],[1,"empty-state"],[3,"json"]],template:function(A,i){A&1&&(B(0,"div",0),O(1,gNA,2,1,"div",1)(2,cNA,2,1,"div"),Q()),A&2&&(u(),Y(i.isEmptyState?1:2))},dependencies:[cs,$l],styles:[".state-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;margin-top:16px}.state-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{text-align:center;font-style:italic}"]})};var CNA=(t,e)=>e.span_id;function INA(t,e){if(t&1){let A=QA();B(0,"span",20)(1,"a",24),U("click",function(){let n;T(A);let o=p(3);return J(o.selectSpanById((n=o.selectedSpan())==null?null:n.parent_span_id))}),y(2),Q(),B(3,"button",21),U("click",function(){let n;T(A);let o=p(3);return J(o.copyToClipboard((n=o.selectedSpan())==null?null:n.parent_span_id))}),B(4,"mat-icon"),y(5),Q()()()}if(t&2){let A,i,n,o=p(3);u(),H("matTooltip",((A=o.selectedSpan())==null?null:A.parent_span_id)||""),u(),lA((i=o.selectedSpan())==null?null:i.parent_span_id),u(3),lA(o.copiedId===((n=o.selectedSpan())==null?null:n.parent_span_id)?"check":"content_copy")}}function dNA(t,e){t&1&&y(0," None ")}function BNA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2),Q(),B(3,"td")(4,"span",20)(5,"a",24),U("click",function(){let n=T(A).$implicit,o=p(4);return J(o.selectSpanById(n.span_id))}),y(6),Q(),B(7,"button",21),U("click",function(){let n=T(A).$implicit,o=p(4);return J(o.copyToClipboard(n.span_id))}),B(8,"mat-icon"),y(9),Q()()()()()}if(t&2){let A=e.$implicit,i=p(4);u(2),lA(A.name),u(3),H("matTooltip",A.span_id),u(),lA(A.span_id),u(3),lA(i.copiedId===A.span_id?"check":"content_copy")}}function ENA(t,e){if(t&1&&(B(0,"table",22),Ue(1,BNA,10,4,"tr",null,CNA),Q()),t&2){let A=p(3);u(),Te(A.selectedSpanChildren)}}function hNA(t,e){if(t&1){let A=QA();B(0,"table",23)(1,"tr")(2,"td"),y(3,"Event ID"),Q(),B(4,"td")(5,"span",20)(6,"a",24),U("click",function(){T(A);let n=p(3);return J(n.switchToEvent.emit(n.selectedSpan().attributes["gcp.vertex.agent.event_id"]))}),y(7),Q(),B(8,"button",21),U("click",function(){T(A);let n=p(3);return J(n.copyToClipboard(n.selectedSpan().attributes["gcp.vertex.agent.event_id"]))}),B(9,"mat-icon"),y(10),Q()()()()()()}if(t&2){let A=p(3);u(6),H("matTooltip",A.selectedSpan().attributes["gcp.vertex.agent.event_id"]||""),u(),lA(A.selectedSpan().attributes["gcp.vertex.agent.event_id"]),u(3),lA(A.copiedId===A.selectedSpan().attributes["gcp.vertex.agent.event_id"]?"check":"content_copy")}}function QNA(t,e){if(t&1){let A=QA();B(0,"div",13)(1,"table",15)(2,"tr")(3,"td"),y(4,"Name"),Q(),B(5,"td")(6,"span",16)(7,"span",17),y(8),Q(),B(9,"button",18),U("click",function(){let n;T(A);let o=p(2);return J(o.copyToClipboard((n=o.selectedSpan())==null?null:n.name))}),B(10,"mat-icon"),y(11),Q()()()()(),B(12,"tr")(13,"td"),y(14,"Span ID"),Q(),B(15,"td",19)(16,"span",20)(17,"span",17),y(18),Q(),B(19,"button",21),U("click",function(){let n;T(A);let o=p(2);return J(o.copyToClipboard((n=o.selectedSpan())==null?null:n.span_id))}),B(20,"mat-icon"),y(21),Q()()()()(),B(22,"tr")(23,"td"),y(24,"Parent ID"),Q(),B(25,"td"),O(26,INA,6,3,"span",20)(27,dNA,1,0),Q()(),B(28,"tr")(29,"td"),y(30,"Trace ID"),Q(),B(31,"td",19)(32,"span",20)(33,"span",17),y(34),Q(),B(35,"button",21),U("click",function(){let n;T(A);let o=p(2);return J(o.copyToClipboard((n=o.selectedSpan())==null?null:n.trace_id))}),B(36,"mat-icon"),y(37),Q()()()()(),B(38,"tr")(39,"td"),y(40,"Start Time"),Q(),B(41,"td")(42,"span",16)(43,"span",17),y(44),Q(),B(45,"button",18),U("click",function(){let n;T(A);let o=p(2);return J(o.copyToClipboard(o.formatTime((n=o.selectedSpan())==null?null:n.start_time),"startTime"))}),B(46,"mat-icon"),y(47),Q()()()()(),B(48,"tr")(49,"td"),y(50,"End Time"),Q(),B(51,"td")(52,"span",16)(53,"span",17),y(54),Q(),B(55,"button",18),U("click",function(){let n;T(A);let o=p(2);return J(o.copyToClipboard(o.formatTime((n=o.selectedSpan())==null?null:n.end_time),"endTime"))}),B(56,"mat-icon"),y(57),Q()()()()()(),O(58,ENA,3,0,"table",22),O(59,hNA,11,3,"table",23),Q()}if(t&2){let A,i,n,o,a,r,s,l,g,C,I,d,h,E,f,m=p(2);u(7),H("matTooltip",((A=m.selectedSpan())==null?null:A.name)||""),u(),lA((i=m.selectedSpan())==null?null:i.name),u(3),lA(m.copiedId===((n=m.selectedSpan())==null?null:n.name)?"check":"content_copy"),u(6),H("matTooltip",((o=m.selectedSpan())==null?null:o.span_id)||""),u(),lA((a=m.selectedSpan())==null?null:a.span_id),u(3),lA(m.copiedId===((r=m.selectedSpan())==null?null:r.span_id)?"check":"content_copy"),u(5),Y((s=m.selectedSpan())!=null&&s.parent_span_id?26:27),u(7),H("matTooltip",((l=m.selectedSpan())==null?null:l.trace_id)||""),u(),lA((g=m.selectedSpan())==null?null:g.trace_id),u(3),lA(m.copiedId===((C=m.selectedSpan())==null?null:C.trace_id)?"check":"content_copy"),u(6),H("matTooltip",m.formatTime((I=m.selectedSpan())==null?null:I.start_time)),u(),lA(m.formatTime((d=m.selectedSpan())==null?null:d.start_time)),u(3),lA(m.copiedId==="startTime"?"check":"content_copy"),u(6),H("matTooltip",m.formatTime((h=m.selectedSpan())==null?null:h.end_time)),u(),lA(m.formatTime((E=m.selectedSpan())==null?null:E.end_time)),u(3),lA(m.copiedId==="endTime"?"check":"content_copy"),u(),Y(m.selectedSpanChildren.length>0?58:-1),u(),Y((f=m.selectedSpan())!=null&&f.attributes&&m.selectedSpan().attributes["gcp.vertex.agent.event_id"]?59:-1)}}function uNA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2),Q(),B(3,"td")(4,"span",16)(5,"span"),y(6),Q(),B(7,"button",18),U("click",function(){let n,o=T(A).$implicit,a=p(4);return J(a.copyToClipboard((n=a.selectedSpan().attributes[o])==null?null:n.toString()))}),B(8,"mat-icon"),y(9),Q()()()()()}if(t&2){let A,i=e.$implicit,n=p(4);u(2),lA(i),u(4),lA(n.selectedSpan().attributes[i]),u(3),lA(n.copiedId===((A=n.selectedSpan().attributes[i])==null?null:A.toString())?"check":"content_copy")}}function fNA(t,e){if(t&1&&(B(0,"table",15),Ue(1,uNA,10,3,"tr",null,ri),Q()),t&2){let A=p(3);u(),Te(A.Object.keys(A.selectedSpan().attributes))}}function pNA(t,e){t&1&&(B(0,"div",1),y(1,"No attributes available"),Q())}function mNA(t,e){if(t&1&&(B(0,"div",13),O(1,fNA,3,0,"table",15)(2,pNA,2,0,"div",1),Q()),t&2){let A,i=p(2);u(),Y((A=i.selectedSpan())!=null&&A.attributes&&i.Object.keys(i.selectedSpan().attributes).length>0?1:2)}}function wNA(t,e){if(t&1){let A=QA();B(0,"div",14),hA(1,"ngx-json-viewer",25),B(2,"button",26),U("click",function(){T(A);let n=p(2);return J(n.copyJsonToClipboard(n.selectedSpan(),"raw"))}),B(3,"mat-icon"),y(4),Q()()()}if(t&2){let A=p(2);u(),H("json",A.selectedSpan()),u(3),lA(A.copiedId==="raw"?"check":"content_copy")}}function DNA(t,e){if(t&1){let A=QA();B(0,"div",0)(1,"div",2)(2,"mat-paginator",3),U("page",function(n){T(A);let o=p();return J(o.onPage(n))}),Q(),B(3,"div",4),y(4),Q(),hA(5,"div",5),B(6,"button",6),U("click",function(){T(A);let n=p();return J(n.traceService.selectedRow(void 0))}),B(7,"mat-icon"),y(8,"remove_selection"),Q()()(),B(9,"div",7)(10,"div",8)(11,"button",9),U("click",function(){T(A);let n=p();return J(n.selectedDetailTab.set("info"))}),B(12,"mat-icon"),y(13,"info"),Q()(),B(14,"button",10),U("click",function(){T(A);let n=p();return J(n.selectedDetailTab.set("attributes"))}),B(15,"mat-icon"),y(16,"list_alt"),Q()(),B(17,"button",11),U("click",function(){T(A);let n=p();return J(n.selectedDetailTab.set("raw"))}),B(18,"mat-icon"),y(19,"data_object"),Q()()(),B(20,"div",12),O(21,QNA,60,18,"div",13),O(22,mNA,3,1,"div",13),O(23,wNA,5,2,"div",14),Q()()()}if(t&2){let A,i=p();u(2),H("length",i.orderedTraceData.length)("pageSize",1)("pageIndex",i.selectedSpanIndex),u(2),ue(" ",(A=i.selectedSpan())==null?null:A.name," "),u(7),RA("active",i.selectedDetailTab()==="info"),u(3),RA("active",i.selectedDetailTab()==="attributes"),u(3),RA("active",i.selectedDetailTab()==="raw"),u(4),Y(i.selectedDetailTab()==="info"?21:-1),u(),Y(i.selectedDetailTab()==="attributes"?22:-1),u(),Y(i.selectedDetailTab()==="raw"?23:-1)}}function yNA(t,e){t&1&&(B(0,"div",1),y(1,"Select a trace span to view its details"),Q())}var IF=class t extends b1{nextPageLabel="Next Span";previousPageLabel="Previous Span";firstPageLabel="First Span";lastPageLabel="Last Span";getRangeLabel=(e,A,i)=>i===0?"Span 0 of 0":(i=Math.max(i,0),`Span ${e*A+1} of ${i}`);static \u0275fac=(()=>{let e;return function(i){return(e||(e=bi(t)))(i||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac})},Cv=class t{_traceData=[];orderedTraceData=[];set traceData(e){this._traceData=e||[],this.orderedTraceData=this.computeOrdered(this._traceData)}get traceData(){return this._traceData}computeOrdered(e){let A=e.map(a=>gA({},a)),i=new Map,n=[];A.forEach(a=>i.set(a.span_id,a)),A.forEach(a=>{if(a.parent_span_id&&i.has(a.parent_span_id)){let r=i.get(a.parent_span_id);r.children=r.children||[],r.children.push(a)}else n.push(a)});let o=a=>a.flatMap(r=>[r,...r.children?o(r.children):[]]);return o(n)}traceService=w(Ag);selectedSpan=Ar(this.traceService.selectedTraceRow$);static getValidTraceTab(e){return e==="info"||e==="attributes"||e==="raw"?e:"info"}selectedDetailTab=bA(t.getValidTraceTab(localStorage.getItem("adk-trace-tab-selected-tab")));switchToEvent=ui();constructor(){Ao(()=>{localStorage.setItem("adk-trace-tab-selected-tab",this.selectedDetailTab())})}formatTime(e){return e?new Date(e/1e6).toLocaleString():"N/A"}get selectedSpanChildren(){let e=this.selectedSpan();return e?e.children&&e.children.length>0?e.children:this.traceData.filter(A=>A.parent_span_id===e.span_id):[]}selectSpanById(e){if(!e)return;let A=this.traceData.find(i=>String(i.span_id)===String(e));A&&this.traceService.selectedRow(A)}get selectedSpanIndex(){let e=this.selectedSpan();if(!e)return;let A=this.orderedTraceData.findIndex(i=>i.span_id===e.span_id);return A===-1?void 0:A}onPage(e){e.pageIndex>=0&&e.pageIndex=this.orderedTraceData.length?0:this.selectedSpanIndex+1:i=this.selectedSpanIndex-1<0?this.orderedTraceData.length-1:this.selectedSpanIndex-1,this.traceService.selectedRow(this.orderedTraceData[i])}Object=Object;copiedId=null;copyToClipboard(e,A){e&&navigator.clipboard.writeText(e).then(()=>{this.copiedId=A||e,setTimeout(()=>this.copiedId=null,2e3)})}copyJsonToClipboard(e,A){if(!e)return;let i=JSON.stringify(e,null,2);navigator.clipboard.writeText(i).then(()=>{this.copiedId=A,setTimeout(()=>this.copiedId=null,2e3)})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-trace-tab"]],hostBindings:function(A,i){A&1&&U("keydown",function(o){return i.handleKeyboardNavigation(o)},ZC)},inputs:{traceData:"traceData"},outputs:{switchToEvent:"switchToEvent"},features:[Bt([{provide:b1,useClass:IF}])],decls:2,vars:1,consts:[[1,"event-details-container"],[1,"empty-state"],[1,"event-details-header"],["hidePageSize","","aria-label","Select span",1,"event-paginator",3,"page","length","pageSize","pageIndex"],[1,"span-title"],[2,"flex-grow","1"],["mat-icon-button","","matTooltip","Clear selection",3,"click"],[1,"event-details-content"],[1,"vertical-tabs-sidebar"],["mat-icon-button","","matTooltip","Info","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Attributes","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Raw JSON","matTooltipPosition","right",3,"click"],[1,"vertical-tabs-content"],[1,"info-tables-container"],[1,"json-viewer-container","json-viewer-wrapper"],["app-info-table",""],[1,"value-cell"],[3,"matTooltip"],["mat-icon-button","","matTooltip","Copy",1,"copy-value-button",3,"click"],[1,"id-text"],[1,"id-cell"],["mat-icon-button","","matTooltip","Copy",1,"copy-id-button",3,"click"],["app-info-table","","title","Children"],["app-info-table","","title","Events"],["href","javascript:void(0)",1,"span-link","id-text",3,"click","matTooltip"],[3,"json"],["mat-icon-button","","matTooltip","Copy JSON",1,"floating-copy-button",3,"click"]],template:function(A,i){A&1&&O(0,DNA,24,13,"div",0)(1,yNA,2,0,"div",1),A&2&&Y(i.selectedSpan()!==void 0?0:1)},dependencies:[qi,ji,Tn,Wt,Fa,dn,cs,$l,n6,OI],styles:["[_nghost-%COMP%]{display:block;height:100%}.json-viewer-container[_ngcontent-%COMP%]{margin:10px}.event-paginator[_ngcontent-%COMP%]{display:flex;justify-content:center;background-color:transparent}.event-paginator[_ngcontent-%COMP%] .mat-mdc-paginator-range-label{order:2;margin:0 0 0 8px}.span-title[_ngcontent-%COMP%]{font-weight:500;font-family:Google Sans Mono,monospace;font-size:13px;color:var(--mat-sys-on-surface);text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:300px;margin-left:16px}.event-details-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.event-details-content[_ngcontent-%COMP%]{display:flex;flex:1;overflow:hidden}.vertical-tabs-sidebar[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:48px;border-right:1px solid var(--mat-sys-outline-variant);padding-top:8px;align-items:center;gap:8px}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.vertical-tabs-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto}.event-details-header[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant);height:48px;flex-shrink:0}.empty-state[_ngcontent-%COMP%]{padding:16px;text-align:center;color:var(--mat-sys-on-surface-variant);font-style:italic;font-size:14px}.info-tables-container[_ngcontent-%COMP%]{padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:24px}.span-link[_ngcontent-%COMP%]{color:var(--mat-sys-primary);text-decoration:none;cursor:pointer}.span-link[_ngcontent-%COMP%]:hover{text-decoration:underline}.id-text[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:11px}.id-cell[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;overflow:hidden}.id-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child, .value-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.id-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .id-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%]{opacity:1}.copy-id-button[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%]{width:28px!important;height:28px!important;padding:0!important;line-height:28px!important;flex-shrink:0;margin:-4px 0!important;opacity:0;transition:opacity .2s ease-in-out;border-radius:4px!important;overflow:hidden!important}.copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.copy-id-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.json-viewer-wrapper[_ngcontent-%COMP%]{position:relative}.json-viewer-wrapper[_ngcontent-%COMP%]:hover .floating-copy-button[_ngcontent-%COMP%]{opacity:1}.floating-copy-button[_ngcontent-%COMP%]{position:absolute;top:4px;right:4px;z-index:10;opacity:0;transition:opacity .2s ease-in-out;background-color:var(--mat-sys-surface-container-high)!important;border-radius:4px!important;overflow:hidden!important;width:28px!important;height:28px!important;line-height:28px!important;padding:0!important}.floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.floating-copy-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.floating-copy-button[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}"]})};var vNA={agentDevelopmentKitLabel:"Agent Development Kit",disclosureTooltip:"ADK Web is for development purposes. It has access to all the data and should not be used in production.",collapsePanelTooltip:"Collapse panel",eventsTabLabel:"Events",stateTabLabel:"State",artifactsTabLabel:"Artifacts",sessionsTabLabel:"Sessions",evalTabLabel:"Evals",testsTabLabel:"Tests",selectEventAriaLabel:"Select event",infoTabLabel:"Info",graphTabLabel:"Graph",requestDetailsTabLabel:"Request",responseDetailsTabLabel:"Response",responseIsNotAvailable:"Response is not available",requestIsNotAvailable:"Request is not available",clearSelectionButtonLabel:"Remove selection"},pQ=new kA("Side Panel Messages",{factory:()=>vNA});var bNA=["eventMenuTrigger"],MNA=["graphContainer"],SNA=(t,e)=>e.span_id,kNA=(t,e)=>e.modality,xNA=(t,e)=>e.id,_NA=(t,e)=>e.key;function RNA(t,e){if(t&1){let A=QA();B(0,"button",10),U("click",function(){T(A);let n=p();return J(n.selectedDetailTab="graph")}),B(1,"mat-icon"),y(2,"account_tree"),Q()()}if(t&2){let A=p();RA("active",A.selectedDetailTab==="graph"),H("matTooltip",XC(A.i18n.graphTabLabel))}}function NNA(t,e){if(t&1){let A=QA();B(0,"div",30),hA(1,"ngx-json-viewer",31),B(2,"button",32),U("click",function(){T(A);let n=p(3);return J(n.copyJsonToClipboard(n.selectedEvent().nodeInfo.outputFor,"nodeInfo.outputFor"))}),B(3,"mat-icon"),y(4),Q()()()}if(t&2){let A=p(3);u(),H("json",A.selectedEvent().nodeInfo.outputFor),u(3),lA(A.copiedId==="nodeInfo.outputFor"?"check":"content_copy")}}function FNA(t,e){t&1&&y(0," N/A ")}function LNA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2,"Message As Output"),Q(),B(3,"td")(4,"span",23)(5,"span",21),y(6),Q(),B(7,"button",24),U("click",function(){T(A);let n=p(3);return J(n.copyToClipboard(n.selectedEvent().nodeInfo.messageAsOutput))}),B(8,"mat-icon"),y(9),Q()()()()()}if(t&2){let A,i=p(3);u(5),H("matTooltip",((A=i.selectedEvent().nodeInfo.messageAsOutput)==null?null:A.toString())||""),u(),lA(i.selectedEvent().nodeInfo.messageAsOutput),u(3),lA(i.copiedId===i.selectedEvent().nodeInfo.messageAsOutput?"check":"content_copy")}}function GNA(t,e){if(t&1){let A=QA();B(0,"table",25)(1,"tr")(2,"td"),y(3,"Node Path"),Q(),B(4,"td")(5,"span",23)(6,"span",21),y(7),Q(),B(8,"button",24),U("click",function(){T(A);let n=p(2);return J(n.copyToClipboard(n.selectedEvent().nodeInfo.path))}),B(9,"mat-icon"),y(10),Q()()()()(),B(11,"tr")(12,"td"),y(13,"Output For"),Q(),B(14,"td"),O(15,NNA,5,2,"div",30)(16,FNA,1,0),Q()(),O(17,LNA,10,3,"tr"),Q()}if(t&2){let A=p(2);u(6),H("matTooltip",A.selectedEvent().nodeInfo.path||""),u(),lA(A.selectedEvent().nodeInfo.path||"N/A"),u(3),lA(A.copiedId===A.selectedEvent().nodeInfo.path?"check":"content_copy"),u(5),Y(A.selectedEvent().nodeInfo.outputFor?15:16),u(2),Y(A.selectedEvent().nodeInfo.messageAsOutput!==void 0?17:-1)}}function KNA(t,e){if(t&1){let A=QA();B(0,"div",30),hA(1,"ngx-json-viewer",31),B(2,"button",32),U("click",function(){T(A);let n=p().$implicit,o=p(3);return J(o.copyJsonToClipboard(o.selectedEvent().actions[n],"action."+n))}),B(3,"mat-icon"),y(4),Q()()()}if(t&2){let A=p().$implicit,i=p(3);u(),H("json",i.selectedEvent().actions[A]),u(3),lA(i.copiedId==="action."+A?"check":"content_copy")}}function UNA(t,e){if(t&1){let A=QA();B(0,"span",23)(1,"span",21),y(2),Q(),B(3,"button",24),U("click",function(){let n;T(A);let o=p().$implicit,a=p(3);return J(a.copyToClipboard((n=a.selectedEvent().actions[o])==null?null:n.toString()))}),B(4,"mat-icon"),y(5),Q()()()}if(t&2){let A,i,n=p().$implicit,o=p(3);u(),H("matTooltip",((A=o.selectedEvent().actions[n])==null?null:A.toString())||""),u(),lA(o.selectedEvent().actions[n]),u(3),lA(o.copiedId===((i=o.selectedEvent().actions[n])==null?null:i.toString())?"check":"content_copy")}}function TNA(t,e){if(t&1&&(B(0,"tr")(1,"td"),y(2),Q(),B(3,"td"),O(4,KNA,5,2,"div",30)(5,UNA,6,3,"span",23),Q()()),t&2){let A=e.$implicit,i=p(3);u(2),lA(A),u(2),Y(i.isObject(i.selectedEvent().actions[A])?4:5)}}function JNA(t,e){if(t&1&&(B(0,"table",26),Ue(1,TNA,6,2,"tr",null,ri),Q()),t&2){let A=p(2);u(),Te(A.Object.keys(A.selectedEvent().actions))}}function ONA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2),Q(),B(3,"td")(4,"div",30),hA(5,"ngx-json-viewer",31),B(6,"button",32),U("click",function(){let n=T(A),o=n.$implicit,a=n.$index,r=p(3);return J(r.copyJsonToClipboard(o,"fc."+a))}),B(7,"mat-icon"),y(8),Q()()()()()}if(t&2){let A=e.$implicit,i=e.$index,n=p(3);u(2),lA(A==null?null:A.name),u(3),H("json",A),u(3),lA(n.copiedId==="fc."+i?"check":"content_copy")}}function YNA(t,e){if(t&1&&(B(0,"table",27),Ue(1,ONA,9,3,"tr",null,ws),Q()),t&2){let A=p(2);u(),Te(A.functionCalls())}}function HNA(t,e){if(t&1&&(B(0,"div",34),hA(1,"img",35),Q()),t&2){let A=p().$implicit;u(),H("src","data:"+A.inlineData.mimeType+";base64,"+A.inlineData.data,Go)}}function zNA(t,e){if(t&1&&(B(0,"div"),hA(1,"audio",36),Q()),t&2){let A=p().$implicit;u(),H("src","data:"+A.inlineData.mimeType+";base64,"+A.inlineData.data)}}function PNA(t,e){if(t&1&&(B(0,"div"),hA(1,"video",36),Q()),t&2){let A=p().$implicit;u(),H("src","data:"+A.inlineData.mimeType+";base64,"+A.inlineData.data,Go)}}function jNA(t,e){if(t&1&&(B(0,"div"),y(1),Q()),t&2){let A=p().$implicit;u(),ue(" Unsupported media type: ",A.inlineData==null?null:A.inlineData.mimeType," ")}}function qNA(t,e){if(t&1&&O(0,HNA,2,1,"div",34)(1,zNA,2,1,"div")(2,PNA,2,1,"div")(3,jNA,2,1,"div"),t&2){let A=e.$implicit;Y(!(A.inlineData==null||A.inlineData.mimeType==null)&&A.inlineData.mimeType.startsWith("image/")?0:!(A.inlineData==null||A.inlineData.mimeType==null)&&A.inlineData.mimeType.startsWith("audio/")?1:!(A.inlineData==null||A.inlineData.mimeType==null)&&A.inlineData.mimeType.startsWith("video/")?2:3)}}function VNA(t,e){if(t&1&&(B(0,"div",33),Ue(1,qNA,4,1,null,null,ws),Q()),t&2){let A=p().$implicit;u(),Te(A.mediaParts)}}function WNA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2),Q(),B(3,"td"),O(4,VNA,3,0,"div",33),B(5,"div",30),hA(6,"ngx-json-viewer",31),B(7,"button",32),U("click",function(){let n=T(A),o=n.$implicit,a=n.$index,r=p(3);return J(r.copyJsonToClipboard(o.cleanedFr,"pfr."+a))}),B(8,"mat-icon"),y(9),Q()()()()()}if(t&2){let A=e.$implicit,i=e.$index,n=p(3);u(2),lA(A.name),u(2),Y(A.hasMedia?4:-1),u(2),H("json",A.cleanedFr),u(3),lA(n.copiedId==="pfr."+i?"check":"content_copy")}}function ZNA(t,e){if(t&1&&(B(0,"table",28),Ue(1,WNA,10,4,"tr",null,ws),Q()),t&2){let A=p(2);u(),Te(A.processedFunctionResponses())}}function XNA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2),Q(),B(3,"td")(4,"span",20)(5,"a",37),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.switchToSpan(n))}),y(6),Q(),B(7,"button",22),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.copyToClipboard(n.span_id))}),B(8,"mat-icon"),y(9),Q()()()()()}if(t&2){let A=e.$implicit,i=p(3);u(2),lA(A.name),u(3),H("matTooltip",A.span_id),u(),lA(A.span_id),u(3),lA(i.copiedId===A.span_id?"check":"content_copy")}}function $NA(t,e){if(t&1&&(B(0,"table",29),Ue(1,XNA,10,4,"tr",null,SNA),Q()),t&2){let A=p(2);u(),Te(A.associatedSpans())}}function AFA(t,e){if(t&1){let A=QA();B(0,"div",15)(1,"table",18)(2,"tr")(3,"td"),y(4,"Event ID"),Q(),B(5,"td",19)(6,"span",20)(7,"span",21),y(8),Q(),B(9,"button",22),U("click",function(){let n;T(A);let o=p();return J(o.copyToClipboard((n=o.selectedEvent())==null?null:n.id))}),B(10,"mat-icon"),y(11),Q()()()()(),B(12,"tr")(13,"td"),y(14,"Invocation ID"),Q(),B(15,"td",19)(16,"span",20)(17,"span",21),y(18),Q(),B(19,"button",22),U("click",function(){let n;T(A);let o=p();return J(o.copyToClipboard((n=o.selectedEvent())==null?null:n.invocationId))}),B(20,"mat-icon"),y(21),Q()()()()(),B(22,"tr")(23,"td"),y(24,"Branch"),Q(),B(25,"td")(26,"span",23)(27,"span",21),y(28),Q(),B(29,"button",24),U("click",function(){let n;T(A);let o=p();return J(o.copyToClipboard((n=o.selectedEvent())==null?null:n.branch))}),B(30,"mat-icon"),y(31),Q()()()()(),B(32,"tr")(33,"td"),y(34,"Timestamp"),Q(),B(35,"td")(36,"span",23)(37,"span",21),y(38),Q(),B(39,"button",24),U("click",function(){let n;T(A);let o=p();return J(o.copyToClipboard(o.formatTime((n=o.selectedEvent())==null?null:n.timestamp),"timestamp"))}),B(40,"mat-icon"),y(41),Q()()()()(),B(42,"tr")(43,"td"),y(44,"Author"),Q(),B(45,"td")(46,"span",23)(47,"span",21),y(48),Q(),B(49,"button",24),U("click",function(){let n;T(A);let o=p();return J(o.copyToClipboard((n=o.selectedEvent())==null?null:n.author))}),B(50,"mat-icon"),y(51),Q()()()()()(),O(52,GNA,18,5,"table",25),O(53,JNA,3,0,"table",26),O(54,YNA,3,0,"table",27),O(55,ZNA,3,0,"table",28),O(56,$NA,3,0,"table",29),Q()}if(t&2){let A,i,n,o,a,r,s,l,g,C,I,d,h,E,f,m,v=p();u(7),H("matTooltip",((A=v.selectedEvent())==null?null:A.id)||""),u(),lA((i=v.selectedEvent())==null?null:i.id),u(3),lA(v.copiedId===((n=v.selectedEvent())==null?null:n.id)?"check":"content_copy"),u(6),H("matTooltip",((o=v.selectedEvent())==null?null:o.invocationId)||""),u(),lA(((a=v.selectedEvent())==null?null:a.invocationId)||"N/A"),u(3),lA(v.copiedId===((r=v.selectedEvent())==null?null:r.invocationId)?"check":"content_copy"),u(6),H("matTooltip",((s=v.selectedEvent())==null?null:s.branch)||""),u(),lA(((l=v.selectedEvent())==null?null:l.branch)||"N/A"),u(3),lA(v.copiedId===((g=v.selectedEvent())==null?null:g.branch)?"check":"content_copy"),u(6),H("matTooltip",v.formatTime((C=v.selectedEvent())==null?null:C.timestamp)),u(),lA(v.formatTime((I=v.selectedEvent())==null?null:I.timestamp)),u(3),lA(v.copiedId==="timestamp"?"check":"content_copy"),u(6),H("matTooltip",((d=v.selectedEvent())==null?null:d.author)||""),u(),lA((h=v.selectedEvent())==null?null:h.author),u(3),lA(v.copiedId===((E=v.selectedEvent())==null?null:E.author)?"check":"content_copy"),u(),Y((f=v.selectedEvent())!=null&&f.nodeInfo?52:-1),u(),Y((m=v.selectedEvent())!=null&&m.actions&&v.Object.keys(v.selectedEvent().actions).length>0?53:-1),u(),Y(v.functionCalls().length>0?54:-1),u(),Y(v.processedFunctionResponses().length>0?55:-1),u(),Y(v.associatedSpans().length>0?56:-1)}}function eFA(t,e){if(t&1&&(B(0,"div",21),y(1),Q()),t&2){let A=e.$implicit;H("matTooltip",A.modality+": "+A.tokenCount),u(),ba("",A.modality,": ",A.tokenCount)}}function tFA(t,e){if(t&1&&Ue(0,eFA,2,3,"div",21,kNA),t&2){let A=p().$implicit,i=p(3);Te(i.selectedEvent().usageMetadata[A])}}function iFA(t,e){if(t&1&&(B(0,"span",21),y(1),Q()),t&2){let A,i=p().$implicit,n=p(3);H("matTooltip",((A=n.selectedEvent().usageMetadata[i])==null?null:A.toString())||""),u(),lA(n.selectedEvent().usageMetadata[i])}}function nFA(t,e){if(t&1){let A=QA();B(0,"tr")(1,"td"),y(2),Q(),B(3,"td")(4,"span",23)(5,"span"),O(6,tFA,2,0)(7,iFA,2,2,"span",21),Q(),B(8,"button",24),U("click",function(){let n,o=T(A).$implicit,a=p(3);return J(a.isObject(a.selectedEvent().usageMetadata[o])?a.copyJsonToClipboard(a.selectedEvent().usageMetadata[o],"usage."+o):a.copyToClipboard((n=a.selectedEvent().usageMetadata[o])==null?null:n.toString(),"usage."+o))}),B(9,"mat-icon"),y(10),Q()()()()()}if(t&2){let A=e.$implicit,i=p(3);u(2),lA(A),u(4),Y(A==="promptTokensDetails"||A==="promptTokenDetails"||A==="candidatesTokenDetails"||A==="candidatesTokensDetails"||A==="cacheTokensDetails"?6:7),u(4),lA(i.copiedId==="usage."+A?"check":"content_copy")}}function oFA(t,e){if(t&1&&(B(0,"table",38),Ue(1,nFA,11,3,"tr",null,ri),Q()),t&2){let A=p(2);u(),Te(A.Object.keys(A.selectedEvent().usageMetadata))}}function aFA(t,e){t&1&&(B(0,"div",39),y(1,"Select an LLM response to see usage metadata."),Q())}function rFA(t,e){if(t&1&&(B(0,"div",15),O(1,oFA,3,0,"table",38)(2,aFA,2,0,"div",39),Q()),t&2){let A,i=p();u(),Y((A=i.selectedEvent())!=null&&A.usageMetadata&&i.Object.keys(i.selectedEvent().usageMetadata).length>0?1:2)}}function sFA(t,e){if(t&1){let A=QA();B(0,"div",16),hA(1,"ngx-json-viewer",31),B(2,"button",32),U("click",function(){T(A);let n=p();return J(n.copyJsonToClipboard(n.filteredSelectedEvent(),"raw"))}),B(3,"mat-icon"),y(4),Q()()()}if(t&2){let A=p();u(),H("json",A.filteredSelectedEvent()),u(3),lA(A.copiedId==="raw"?"check":"content_copy")}}function lFA(t,e){t&1&&(B(0,"div",40)(1,"mat-icon",52),y(2,"warning"),Q(),B(3,"span"),y(4,"The loaded session file was for a different app. The graph may not be accurate."),Q()())}function gFA(t,e){if(t&1){let A=QA();B(0,"button",58),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.onInvocationSelected(n.key))}),B(1,"mat-icon",59),y(2,"check"),Q(),y(3),Q()}if(t&2){let A,i=e.$implicit,n=p(3);H("matTooltip",i.key),u(),ut("visibility",((A=n.selectedEvent())==null?null:A.invocationId)===i.key?"visible":"hidden"),u(2),ue(" ",i.value," ")}}function cFA(t,e){if(t&1&&(B(0,"button",53)(1,"div",54)(2,"span",55),y(3),Q(),B(4,"mat-icon",56),y(5,"arrow_drop_down"),Q()()(),B(6,"mat-menu",null,3),Ue(8,gFA,4,4,"button",57,_NA),Q()),t&2){let A,i=Qi(7),n=p(2);H("matMenuTriggerFor",i),u(2),H("matTooltip",((A=n.selectedEvent())==null?null:A.invocationId)||""),u(),ue(" ",n.invocationDisplayMap().get(n.selectedEvent().invocationId)||n.selectedEvent().invocationId," "),u(5),Te(n.invocationDisplayEntries())}}function CFA(t,e){if(t&1&&(B(0,"span",44),y(1),Q()),t&2){let A,i,n=p(2);H("matTooltip",((A=n.selectedEvent())==null?null:A.invocationId)||""),u(),lA((i=n.selectedEvent())!=null&&i.invocationId?n.invocationDisplayMap().get(n.selectedEvent().invocationId)||n.selectedEvent().invocationId:"N/A")}}function IFA(t,e){t&1&&(B(0,"mat-icon",61),y(1,"chevron_right"),Q())}function dFA(t,e){t&1&&(B(0,"mat-icon",61),y(1,"chevron_right"),Q())}function BFA(t,e){if(t&1&&(O(0,dFA,2,0,"mat-icon",61),B(1,"button",60),y(2),Q()),t&2){let A=e.$implicit,i=e.$index,n=p(3);Y(i>0?0:-1),u(),RA("active",i===n.breadcrumbs().length-1),u(),ue(" ",A," ")}}function EFA(t,e){if(t&1&&(B(0,"div",45)(1,"button",60),y(2),Q(),O(3,IFA,2,0,"mat-icon",61),Ue(4,BFA,3,4,null,null,ws),Q()),t&2){let A=p(2);u(2),lA(A.appName()),u(),Y(A.breadcrumbs().length>0?3:-1),u(),Te(A.breadcrumbs())}}function hFA(t,e){if(t&1){let A=QA();B(0,"button",62),U("click",function(){T(A);let n=p(2);return J(n.showAgentStructureGraph.emit(!0))}),B(1,"mat-icon"),y(2,"fullscreen"),Q()()}}function QFA(t,e){t&1&&(B(0,"div",39),y(1," Graph is not available for this agent. "),Q())}function uFA(t,e){t&1&&(B(0,"div",48),hA(1,"mat-progress-spinner",63),Q())}function fFA(t,e){if(t&1&&hA(0,"div",49),t&2){let A=p(2);H("innerHtml",A.renderedEventGraph(),Gc)}}function pFA(t,e){if(t&1){let A=QA();B(0,"button",64),U("click",function(){let n=T(A).$implicit,o=p(2);return J(o.handleMenuSelection(n))}),B(1,"span"),y(2),Ht(3,"date"),Q()()}if(t&2){let A=e.$implicit;u(2),ba("Run ",A.runIndex," (",T0(3,2,A.timestamp,"mediumTime"),")")}}function mFA(t,e){if(t&1&&(B(0,"div",17),O(1,lFA,5,0,"div",40),B(2,"div",41)(3,"div",42)(4,"span",43),y(5,"Invocation:"),Q(),O(6,cFA,10,3)(7,CFA,2,2,"span",44),Q()(),O(8,EFA,6,2,"div",45),B(9,"div",46,0),O(11,hFA,3,0,"button",47),O(12,QFA,2,0,"div",39)(13,uFA,2,0,"div",48)(14,fFA,1,1,"div",49),Q(),hA(15,"div",50,1),B(17,"mat-menu",null,2),Ue(19,pFA,4,5,"button",51,xNA),Q()()),t&2){let A,i=Qi(18),n=p();u(),Y(n.isViewOnlyAppNameMismatch()?1:-1),u(5),Y(n.invocationDisplayMap().size>0&&((A=n.selectedEvent())!=null&&A.invocationId)?6:7),u(2),Y(n.hasSubWorkflows()&&(n.breadcrumbs().length>0||n.appName())?8:-1),u(3),Y(n.graphsAvailable()?11:-1),u(),Y(n.graphsAvailable()?n.renderedEventGraph()?14:13:12),u(3),ut("left",n.menuPos.x+"px")("top",n.menuPos.y+"px"),H("matMenuTriggerFor",i),u(4),Te(n.menuEvents)}}function wFA(t,e){t&1&&(B(0,"div",48),hA(1,"mat-progress-spinner",63),Q())}function DFA(t,e){t&1&&(B(0,"div",39),y(1,"Select an LLM response to see request details."),Q())}function yFA(t,e){if(t&1){let A=QA();B(0,"div",16),hA(1,"ngx-json-viewer",31),B(2,"button",32),U("click",function(){T(A);let n=p(2);return J(n.copyJsonToClipboard(n.llmRequest(),"request"))}),B(3,"mat-icon"),y(4),Q()()()}if(t&2){let A=p(2);u(),H("json",A.llmRequest()),u(3),lA(A.copiedId==="request"?"check":"content_copy")}}function vFA(t,e){if(t&1&&(O(0,wFA,2,0,"div",48),Ht(1,"async"),WI(2,DFA,2,0,"div",39)(3,yFA,5,2,"div",16)),t&2){let A=p();Y(si(1,1,A.uiStateService.isEventRequestResponseLoading())===!0?0:A.llmRequest()?3:2)}}function bFA(t,e){t&1&&(B(0,"div",48),hA(1,"mat-progress-spinner",63),Q())}function MFA(t,e){t&1&&(B(0,"div",39),y(1,"Select an LLM response to see response details."),Q())}function SFA(t,e){if(t&1){let A=QA();B(0,"div",16),hA(1,"ngx-json-viewer",31),B(2,"button",32),U("click",function(){T(A);let n=p(2);return J(n.copyJsonToClipboard(n.llmResponse(),"response"))}),B(3,"mat-icon"),y(4),Q()()()}if(t&2){let A=p(2);u(),H("json",A.llmResponse()),u(3),lA(A.copiedId==="response"?"check":"content_copy")}}function kFA(t,e){if(t&1&&(O(0,bFA,2,0,"div",48),Ht(1,"async"),WI(2,MFA,2,0,"div",39)(3,SFA,5,2,"div",16)),t&2){let A=p();Y(si(1,1,A.uiStateService.isEventRequestResponseLoading())===!0?0:A.llmResponse()?3:2)}}var Iv=class t{eventDataSize=me.required();eventDataMap=me(new Map);selectedEventIndex=me();selectedEvent=me.required();filteredSelectedEvent=me();renderedEventGraph=me();rawSvgString=me(null);llmRequest=me();llmResponse=me();traceData=me([]);appName=me("");selectedEventGraphPath=me("");hasSubWorkflows=me(!1);graphsAvailable=me(!0);invocationDisplayMap=me(new Map);forceGraphTab=me(!1);isViewOnlySession=me(!1);isViewOnlyAppNameMismatch=me(!1);invocationDisplayEntries=pe(()=>Array.from(this.invocationDisplayMap().entries()).map(([e,A])=>({key:e,value:A})));breadcrumbs=pe(()=>{let e=this.selectedEventGraphPath();return e?e.split("/").filter(A=>A):[]});functionCalls=pe(()=>(this.selectedEvent()?.content?.parts||[]).filter(A=>!!A.functionCall).map(A=>A.functionCall));functionResponses=pe(()=>(this.selectedEvent()?.content?.parts||[]).filter(A=>!!A.functionResponse).map(A=>A.functionResponse));processedFunctionResponses=pe(()=>this.functionResponses().map(A=>{if(!A)return null;if(A&&Array.isArray(A.parts)){let n=A.parts.filter(a=>!!a.inlineData).map(a=>a.inlineData&&a.inlineData.data?Ye(gA({},a),{inlineData:Ye(gA({},a.inlineData),{data:a.inlineData.data.replace(/-/g,"+").replace(/_/g,"/")})}):a),o=gA({},A);return delete o.parts,{name:A.name,cleanedFr:o,mediaParts:n,hasMedia:n.length>0}}return{name:A.name,cleanedFr:A,mediaParts:[],hasMedia:!1}}).filter(A=>A!==null));page=ui();closeSelectedEvent=ui();openImageDialog=ui();switchToTraceView=ui();showAgentStructureGraph=ui();drillDownNodePath=ui();selectEventById=ui();jumpToInvocation=ui();onInvocationSelected(e){this.jumpToInvocation.emit(e)}eventMenuTrigger;graphContainer;menuEvents=[];menuPos={x:0,y:0};uiStateService=w(tg);traceService=w(Ag);i18n=w(pQ);isEventRequestResponseLoadingSignal=Ar(this.uiStateService.isEventRequestResponseLoading(),{initialValue:!1});associatedSpans=pe(()=>{let e=this.selectedEvent();if(!e||!e.id)return[];let A=this.traceData();if(!A)return[];let i=o=>{let a=[];for(let r of o)a.push(r),r.children&&(a=a.concat(i(r.children)));return a};return i(A).filter(o=>o.attributes&&o.attributes["gcp.vertex.agent.event_id"]===e.id)});_selectedDetailTab="event";get selectedDetailTab(){return this._selectedDetailTab}set selectedDetailTab(e){this._selectedDetailTab=e,localStorage.setItem("adk-event-tab-selected-tab",e),e==="graph"&&setTimeout(()=>{this.graphContainer?.nativeElement&&nE(this.graphContainer.nativeElement,(A,i)=>{this.handleNodeClick(A,i)})},50)}copiedId=null;copyToClipboard(e,A){e&&navigator.clipboard.writeText(e).then(()=>{this.copiedId=A||e,setTimeout(()=>this.copiedId=null,2e3)})}copyJsonToClipboard(e,A){if(!e)return;let i=JSON.stringify(e,null,2);navigator.clipboard.writeText(i).then(()=>{this.copiedId=A,setTimeout(()=>this.copiedId=null,2e3)})}switchToSpan(e){this.switchToTraceView.emit(),this.traceService.selectedRow(e)}constructor(){let e=localStorage.getItem("adk-event-tab-selected-tab");e&&["event","raw","request","response","graph","metadata"].includes(e)&&(this._selectedDetailTab=e),Ao(()=>{let A=this.renderedEventGraph(),i=this._selectedDetailTab;A&&i==="graph"&&setTimeout(()=>{this.graphContainer?.nativeElement&&nE(this.graphContainer.nativeElement,(n,o)=>{this.handleNodeClick(n,o)})},50)}),Ao(()=>{let A=this.selectedEvent();this.forceGraphTab()&&(this.selectedDetailTab=this.graphsAvailable()?"graph":"event")})}formatTime(e){if(!e)return"N/A";let A=e<1e10?e*1e3:e;return new Date(A).toLocaleString()}isObject(e){return e!==null&&typeof e=="object"}handleNodeClick(e,A){let i=Array.from(this.eventDataMap().values()),o=this.selectedEvent()?.invocationId;o&&(i=i.filter(l=>l.invocationId===o));let a=[],r=[],s="";i.forEach(l=>{let g=l.nodeInfo?.path;if(l.author==="user"&&(g="__START__"),!g)return;let C=g;g!=="__START__"&&(C=g.split("/").map(E=>E.split("@")[0]).join("/"));let I=C.split("/"),d=I[I.length-1],h="";if(I.length>=2&&I[I.length-1]==="call_llm"&&I[I.length-2]===l.author?(d=I[I.length-2],h=I.slice(1,-2).join("/")):h=I.slice(1,-1).join("/"),h===this.selectedEventGraphPath()){let E=g.split("/"),f=E[E.length-1],m=e.includes("@")?f:d;m!==s&&(s===e&&r.length>0&&a.push(r),s=m,r=[]),m===e&&r.push(l)}}),s===e&&r.length>0&&a.push(r),a.length!==0&&(a.length===1?this.selectEventById.emit(a[0][0].id):(this.menuEvents=a.map((l,g)=>({id:l[0].id,runIndex:g+1,timestamp:l[0].timestamp})),A&&(this.menuPos={x:A.clientX,y:A.clientY}),this.eventMenuTrigger.openMenu()))}handleMenuSelection(e){this.selectEventById.emit(e.id)}Object=Object;static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-event-tab"]],viewQuery:function(A,i){if(A&1&&Jt(bNA,5)(MNA,5),A&2){let n;ae(n=re())&&(i.eventMenuTrigger=n.first),ae(n=re())&&(i.graphContainer=n.first)}},inputs:{eventDataSize:[1,"eventDataSize"],eventDataMap:[1,"eventDataMap"],selectedEventIndex:[1,"selectedEventIndex"],selectedEvent:[1,"selectedEvent"],filteredSelectedEvent:[1,"filteredSelectedEvent"],renderedEventGraph:[1,"renderedEventGraph"],rawSvgString:[1,"rawSvgString"],llmRequest:[1,"llmRequest"],llmResponse:[1,"llmResponse"],traceData:[1,"traceData"],appName:[1,"appName"],selectedEventGraphPath:[1,"selectedEventGraphPath"],hasSubWorkflows:[1,"hasSubWorkflows"],graphsAvailable:[1,"graphsAvailable"],invocationDisplayMap:[1,"invocationDisplayMap"],forceGraphTab:[1,"forceGraphTab"],isViewOnlySession:[1,"isViewOnlySession"],isViewOnlyAppNameMismatch:[1,"isViewOnlyAppNameMismatch"]},outputs:{page:"page",closeSelectedEvent:"closeSelectedEvent",openImageDialog:"openImageDialog",switchToTraceView:"switchToTraceView",showAgentStructureGraph:"showAgentStructureGraph",drillDownNodePath:"drillDownNodePath",selectEventById:"selectEventById",jumpToInvocation:"jumpToInvocation"},decls:31,vars:29,consts:[["graphContainer",""],["eventMenuTrigger","matMenuTrigger"],["eventMenu","matMenu"],["invocationSelectorMenu","matMenu"],[1,"event-details-container"],[1,"event-details-header"],["hidePageSize","",1,"event-paginator",3,"page","length","pageSize","pageIndex"],["mat-icon-button","",3,"click","matTooltip"],[1,"event-details-content"],[1,"vertical-tabs-sidebar"],["mat-icon-button","","matTooltipPosition","right",3,"click","matTooltip"],["mat-icon-button","","matTooltipPosition","right",3,"active","matTooltip"],["mat-icon-button","","matTooltip","Usage Metadata","matTooltipPosition","right",3,"click"],["mat-icon-button","","matTooltip","Raw JSON","matTooltipPosition","right",3,"click"],[1,"vertical-tabs-content"],[1,"info-tables-container"],[1,"json-viewer-container","json-viewer-wrapper"],[1,"event-graph-wrapper"],["app-info-table",""],[1,"id-text"],[1,"id-cell"],[3,"matTooltip"],["mat-icon-button","","matTooltip","Copy",1,"copy-id-button",3,"click"],[1,"value-cell"],["mat-icon-button","","matTooltip","Copy",1,"copy-value-button",3,"click"],["app-info-table","","title","Node Info"],["app-info-table","","title","Actions"],["app-info-table","","title","Function Calls"],["app-info-table","","title","Function Responses"],["app-info-table","","title","Associated Spans"],[1,"json-viewer-wrapper"],[3,"json"],["mat-icon-button","","matTooltip","Copy JSON",1,"floating-copy-button",3,"click"],[1,"media-container"],[1,"generated-image-container"],["alt","image",3,"src"],["controls","",3,"src"],["href","javascript:void(0)",1,"span-link","id-text",3,"click","matTooltip"],["app-info-table","","title","Usage Metadata"],[1,"request-response-empty-state"],[1,"warning-banner",2,"background-color","#fff3cd","color","#856404","padding","8px","margin-bottom","8px","border-radius","4px","display","flex","align-items","center"],[1,"graph-header",2,"justify-content","space-between"],[2,"display","flex","align-items","center","min-width","0","flex","1","width","100%"],[2,"white-space","nowrap","flex-shrink","0"],[2,"margin-left","8px","font-weight","normal",3,"matTooltip"],[1,"breadcrumb-container"],[1,"event-graph-container"],["mat-icon-button","","matTooltip","Full Screen",1,"fullscreen-graph-button"],[1,"request-response-loading-spinner-container"],[1,"svg-graph-wrapper",3,"innerHtml"],[2,"visibility","hidden","position","fixed",3,"matMenuTriggerFor"],["mat-menu-item",""],[2,"margin-right","8px"],["mat-button","",1,"invocation-selector-button",2,"margin-left","8px","padding","0 8px","min-width","0","flex","1","height","24px","line-height","24px","width","100%",3,"matMenuTriggerFor"],[2,"display","flex","align-items","center","width","100%","min-width","0","justify-content","space-between"],[2,"font-weight","normal","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","flex","1","text-align","left",3,"matTooltip"],[2,"margin-left","4px","font-size","18px","width","18px","height","18px","flex-shrink","0"],["mat-menu-item","","matTooltipPosition","right",3,"matTooltip"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[2,"font-size","16px","width","16px","height","16px","margin-right","8px","color","var(--mat-sys-primary)"],["disabled","",1,"breadcrumb-item"],[1,"breadcrumb-separator"],["mat-icon-button","","matTooltip","Full Screen",1,"fullscreen-graph-button",3,"click"],["mode","indeterminate","diameter","50"],["mat-menu-item","",3,"click"]],template:function(A,i){A&1&&(B(0,"div",4)(1,"div",5)(2,"mat-paginator",6),U("page",function(o){return i.page.emit(o)}),Q(),B(3,"button",7),U("click",function(){return i.closeSelectedEvent.emit()}),B(4,"mat-icon"),y(5,"remove_selection"),Q()()(),B(6,"div",8)(7,"div",9)(8,"button",10),U("click",function(){return i.selectedDetailTab="event"}),B(9,"mat-icon"),y(10,"info"),Q()(),O(11,RNA,3,4,"button",11),B(12,"button",10),U("click",function(){return i.selectedDetailTab="request"}),B(13,"mat-icon"),y(14,"input"),Q()(),B(15,"button",10),U("click",function(){return i.selectedDetailTab="response"}),B(16,"mat-icon"),y(17,"output"),Q()(),B(18,"button",12),U("click",function(){return i.selectedDetailTab="metadata"}),B(19,"mat-icon"),y(20,"analytics"),Q()(),B(21,"button",13),U("click",function(){return i.selectedDetailTab="raw"}),B(22,"mat-icon"),y(23,"data_object"),Q()()(),B(24,"div",14),O(25,AFA,57,20,"div",15),O(26,rFA,3,1,"div",15),O(27,sFA,5,2,"div",16),O(28,mFA,21,10,"div",17),O(29,vFA,4,3),O(30,kFA,4,3),Q()()()),A&2&&(u(2),H("length",i.eventDataSize())("pageSize",1)("pageIndex",i.selectedEventIndex()),te("aria-label",i.i18n.selectEventAriaLabel),u(),H("matTooltip",XC(i.i18n.clearSelectionButtonLabel)),u(5),RA("active",i.selectedDetailTab==="event"),H("matTooltip",XC(i.i18n.infoTabLabel)),u(3),Y(i.graphsAvailable()?11:-1),u(),RA("active",i.selectedDetailTab==="request"),H("matTooltip",XC(i.i18n.requestDetailsTabLabel)),u(3),RA("active",i.selectedDetailTab==="response"),H("matTooltip",XC(i.i18n.responseDetailsTabLabel)),u(3),RA("active",i.selectedDetailTab==="metadata"),u(3),RA("active",i.selectedDetailTab==="raw"),u(4),Y(i.selectedDetailTab==="event"?25:-1),u(),Y(i.selectedDetailTab==="metadata"?26:-1),u(),Y(i.selectedDetailTab==="raw"?27:-1),u(),Y(i.selectedDetailTab==="graph"?28:-1),u(),Y(i.selectedDetailTab==="request"?29:-1),u(),Y(i.selectedDetailTab==="response"?30:-1))},dependencies:[qi,pi,ji,Wt,n6,gs,dn,LB,Zs,Ml,$c,cs,$l,OI,os,nL],styles:["[_nghost-%COMP%]{display:block;height:100%}.json-viewer-container[_ngcontent-%COMP%]{margin:10px}.event-paginator[_ngcontent-%COMP%]{margin-right:auto;display:flex;justify-content:center;background-color:transparent}.event-paginator[_ngcontent-%COMP%] .mat-mdc-paginator-range-label{order:2;margin:0 0 0 8px}.event-details-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.event-details-content[_ngcontent-%COMP%]{display:flex;flex:1;overflow:hidden}.vertical-tabs-sidebar[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:48px;border-right:1px solid var(--mat-sys-outline-variant);padding-top:8px;align-items:center;gap:8px}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .vertical-tabs-sidebar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:6px!important}.vertical-tabs-sidebar[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}.vertical-tabs-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;overflow-y:auto}.event-details-header[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center;border-bottom:1px solid var(--mat-sys-outline-variant);height:48px;flex-shrink:0}.empty-state[_ngcontent-%COMP%]{padding:16px;text-align:center;color:var(--mat-sys-on-surface-variant);font-style:italic}.details-content[_ngcontent-%COMP%]{color:var(--side-panel-details-content-color);font-size:14px}.event-graph-wrapper[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;width:100%}.breadcrumb-container[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:13px;color:var(--mat-sys-on-surface-variant);padding:8px 12px}.breadcrumb-container[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-weight:500;margin-right:8px;color:var(--mat-sys-on-surface)}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]{background:none;border:none;color:var(--mat-sys-primary);font-size:13px;padding:2px 4px}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-item.active[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface)}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-item[_ngcontent-%COMP%]:disabled{color:var(--mat-sys-on-surface);font-weight:500}.breadcrumb-container[_ngcontent-%COMP%] .breadcrumb-separator[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;display:flex;align-items:center;justify-content:center;color:var(--mat-sys-on-surface-variant);margin:0 4px}.graph-header[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:13px;color:var(--mat-sys-on-surface-variant);background-color:var(--mat-sys-surface-container-lowest);padding:8px 16px;border-bottom:1px solid var(--mat-sys-outline-variant)}.graph-header[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-weight:500;margin-right:8px;color:var(--mat-sys-on-surface)}.event-graph-container[_ngcontent-%COMP%]{flex:1;overflow:hidden;padding:16px;position:relative}.fullscreen-graph-button[_ngcontent-%COMP%]{position:absolute;top:4px;right:4px;z-index:10;width:48px!important;height:48px!important;padding:0!important;display:flex!important;justify-content:center!important;align-items:center!important}.fullscreen-graph-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:28px!important;width:28px!important;height:28px!important;line-height:28px!important;margin:0!important;padding:0!important}.event-graph-container[_ngcontent-%COMP%] .svg-graph-wrapper[_ngcontent-%COMP%]{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.event-graph-container[_ngcontent-%COMP%] svg{max-width:100%;max-height:100%;width:auto;height:auto;display:block}.event-graph-container[_ngcontent-%COMP%] svg>g.graph>polygon:first-child{fill:transparent!important}.request-response-loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em}.request-response-empty-state[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em;font-style:italic}.id-text[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:12px}.id-cell[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;overflow:hidden}.id-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child, .value-cell[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.id-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .id-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-id-button[_ngcontent-%COMP%], .value-cell[_ngcontent-%COMP%]:hover .copy-value-button[_ngcontent-%COMP%]{opacity:1}.copy-id-button[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%]{width:28px!important;height:28px!important;padding:0!important;line-height:28px!important;flex-shrink:0;margin:-4px 0!important;opacity:0;transition:opacity .2s ease-in-out;border-radius:4px!important;overflow:hidden!important}.copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-id-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .copy-value-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.copy-id-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%], .copy-value-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.info-tables-container[_ngcontent-%COMP%]{padding:16px;overflow-y:auto;display:flex;flex-direction:column;gap:24px}.invocation-selector-button[_ngcontent-%COMP%] .mdc-button__label{width:100%;flex:1;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;justify-content:space-between}.media-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;margin-top:8px;margin-bottom:12px}.generated-image-container[_ngcontent-%COMP%]{max-width:100%;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a;border:1px solid var(--mat-sys-outline-variant)}.generated-image-container[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:100%;height:auto;display:block}audio[_ngcontent-%COMP%], video[_ngcontent-%COMP%]{max-width:100%;border-radius:4px}.json-viewer-wrapper[_ngcontent-%COMP%]{position:relative}.json-viewer-wrapper[_ngcontent-%COMP%]:hover .floating-copy-button[_ngcontent-%COMP%]{opacity:1}.floating-copy-button[_ngcontent-%COMP%]{position:absolute;top:4px;right:4px;z-index:10;opacity:0;transition:opacity .2s ease-in-out;background-color:var(--mat-sys-surface-container-high)!important;border-radius:4px!important;overflow:hidden!important;width:28px!important;height:28px!important;line-height:28px!important;padding:0!important}.floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-ripple, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple:before, .floating-copy-button[_ngcontent-%COMP%] .mat-mdc-focus-indicator{border-radius:4px!important}.floating-copy-button[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}.floating-copy-button[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-secondary-container)!important;color:var(--mat-sys-on-secondary-container)!important}"],changeDetection:0})};var xFA=["evalTabContainer"];function _FA(t,e){}function RFA(t,e){t&1&&(B(0,"div",1),hA(1,"mat-progress-spinner",4),Q())}function NFA(t,e){if(t&1&&(B(0,"span",11),y(1),Q()),t&2){let A=p(2);u(),lA(A.i18n.infoTabLabel)}}function FFA(t,e){if(t&1){let A=QA();B(0,"app-trace-tab",12),U("switchToEvent",function(n){T(A);let o=p(2);return J(o.switchToEvent.emit(n))}),Q()}if(t&2){let A=p(2);H("traceData",A.traceData())}}function LFA(t,e){if(t&1){let A=QA();B(0,"app-event-tab",13),U("page",function(n){T(A);let o=p(2);return J(o.page.emit(n))})("closeSelectedEvent",function(){T(A);let n=p(2);return J(n.closeSelectedEvent.emit())})("openImageDialog",function(n){T(A);let o=p(2);return J(o.openImageDialog.emit(n))})("switchToTraceView",function(){T(A);let n=p(2);return J(n.switchToTraceView.emit())})("showAgentStructureGraph",function(n){T(A);let o=p(2);return J(o.showAgentStructureGraph.emit(n))})("drillDownNodePath",function(n){T(A);let o=p(2);return J(o.drillDownNodePath.emit(n))})("selectEventById",function(n){T(A);let o=p(2);return J(o.selectEventById.emit(n))})("jumpToInvocation",function(n){T(A);let o=p(2);return J(o.jumpToInvocation.emit(n))}),Q()}if(t&2){let A=p(2);H("eventDataSize",A.eventData().size)("eventDataMap",A.eventData())("selectedEventIndex",A.selectedEventIndex())("selectedEvent",A.selectedEvent())("traceData",A.traceData())("filteredSelectedEvent",A.filteredSelectedEvent())("renderedEventGraph",A.renderedEventGraph())("rawSvgString",A.rawSvgString())("appName",A.appName())("selectedEventGraphPath",A.selectedEventGraphPath())("llmRequest",A.llmRequest())("llmResponse",A.llmResponse())("hasSubWorkflows",A.hasSubWorkflows())("graphsAvailable",A.graphsAvailable())("invocationDisplayMap",A.invocationDisplayMap())("forceGraphTab",A.forceGraphTab())("isViewOnlySession",A.isViewOnlySession())("isViewOnlyAppNameMismatch",A.isViewOnlyAppNameMismatch())}}function GFA(t,e){t&1&&(B(0,"div",9),y(1,"Select an event or trace span to view details"),Q())}function KFA(t,e){if(t&1&&(B(0,"span",11),y(1),Q()),t&2){let A=p(2);u(),lA(A.i18n.stateTabLabel)}}function UFA(t,e){if(t&1&&(B(0,"span",11),y(1),Q()),t&2){let A=p(3);u(),lA(A.i18n.artifactsTabLabel)}}function TFA(t,e){if(t&1&&(B(0,"mat-tab"),Et(1,UFA,2,1,"ng-template",6),hA(2,"app-artifact-tab",14),Q()),t&2){let A=p(2);u(2),H("artifacts",A.artifacts())}}function JFA(t,e){if(t&1&&(B(0,"span",11),y(1),Q()),t&2){let A=p(3);u(),lA(A.i18n.testsTabLabel)}}function OFA(t,e){if(t&1){let A=QA();B(0,"mat-tab"),Et(1,JFA,2,1,"ng-template",6),B(2,"app-tests-tab",15),U("testSelected",function(n){T(A);let o=p(2);return J(o.testSelected.emit(n))}),Q()()}if(t&2){let A=p(2);u(2),H("appName",A.appName())("sessionId",A.sessionId())("userId",A.userId())("isViewOnlySession",A.isViewOnlySession())}}function YFA(t,e){if(t&1&&(B(0,"span",11),y(1),Q()),t&2){let A=p(3);u(),lA(A.i18n.evalTabLabel)}}function HFA(t,e){t&1&&(B(0,"mat-tab"),Et(1,YFA,2,1,"ng-template",6),sn(2,null,0),Q())}function zFA(t,e){if(t&1){let A=QA();B(0,"div",2)(1,"mat-tab-group",5),Di("selectedIndexChange",function(n){T(A);let o=p();return Bi(o.selectedIndex,n)||(o.selectedIndex=n),J(n)}),U("selectedTabChange",function(n){T(A);let o=p();return J(o.onTabChange(n))}),B(2,"mat-tab"),Et(3,NFA,2,1,"ng-template",6),O(4,FFA,1,1,"app-trace-tab",7)(5,LFA,1,18,"app-event-tab",8)(6,GFA,2,0,"div",9),Q(),B(7,"mat-tab"),Et(8,KFA,2,1,"ng-template",6),hA(9,"app-state-tab",10),Q(),O(10,TFA,3,1,"mat-tab"),Ht(11,"async"),O(12,OFA,3,4,"mat-tab"),Ht(13,"async"),O(14,HFA,4,0,"mat-tab"),Ht(15,"async"),Q()()}if(t&2){let A=p(),i=zn(2);H("hidden",i||!A.showSidePanel()),u(),wi("selectedIndex",A.selectedIndex),u(3),Y(A.selectedSpan()?4:A.selectedEvent()?5:6),u(5),H("sessionState",A.currentSessionState()),u(),Y(si(11,7,A.isArtifactsTabEnabledObs)?10:-1),u(2),Y(si(13,9,A.isTestsEnabledObs)?12:-1),u(2),Y(si(15,11,A.isEvalEnabledObs)?14:-1)}}var mQ=class t{Object=Object;appName=me("");userId=me("");sessionId=me("");traceData=me([]);eventData=me(new Map);currentSessionState=me();artifacts=me([]);selectedEvent=me();selectedEventIndex=me();renderedEventGraph=me();rawSvgString=me(null);selectedEventGraphPath=me("");llmRequest=me();llmResponse=me();showSidePanel=me(!1);isApplicationSelectorEnabledObs=me(ne(!1));isBuilderMode=me(!1);disableBuilderIcon=me(!1);hasSubWorkflows=me(!1);graphsAvailable=me(!0);invocationDisplayMap=me(new Map);forceGraphTab=me(!1);isViewOnlySession=me(!1);isViewOnlyAppNameMismatch=me(!1);closePanel=ui();tabChange=ui();sessionSelected=ui();sessionReloaded=ui();evalCaseSelected=ui();editEvalCaseRequested=ui();testSelected=ui();evalSetIdSelected=ui();returnToSession=ui();evalNotInstalled=ui();page=ui();switchToEvent=ui();closeSelectedEvent=ui();openImageDialog=ui();openAddItemDialog=ui();enterBuilderMode=ui();showAgentStructureGraph=ui();switchToTraceView=ui();drillDownNodePath=ui();selectEventById=ui();jumpToInvocation=ui();sessionTabComponent=void 0;evalTabComponent=So(xc);evalTabContainer=So("evalTabContainer",{read:Mo});tabGroup=So(lv);logoComponent=w(PB,{optional:!0});i18n=w(pQ);featureFlagService=w(yr);evalTabComponentClass=w(rv,{optional:!0});environmentInjector=w(Gr);uiStateService=w(tg);traceService=w(Ag);selectedSpan=Ar(this.traceService.selectedTraceRow$);selectedIndex=0;pendingEvalCaseSelection=bA(void 0);pendingEvalResultSelection=bA(void 0);constructor(){Ao(()=>{let e=this.selectedEvent(),A=this.selectedSpan(),i=this.tabGroup();(e||A)&&i&&i.selectedIndex!==0&&(this.selectedIndex=0,window.localStorage.setItem("adk-side-panel-selected-tab","0"))})}ngOnInit(){let e=window.localStorage.getItem("adk-side-panel-selected-tab");e!==null&&(this.selectedIndex=parseInt(e,10))}onTabChange(e){this.tabChange.emit(e),this.selectedIndex=e.index,window.localStorage.setItem("adk-side-panel-selected-tab",e.index.toString())}switchToEvalTab(){this.isEvalEnabledObs.pipe($n()).subscribe(e=>{e&&qC([this.isArtifactsTabEnabledObs.pipe($n()),this.isTestsEnabledObs.pipe($n())]).subscribe(([A,i])=>{let n=2;A&&n++,i&&n++,this.selectedIndex=n,window.localStorage.setItem("adk-side-panel-selected-tab",n.toString())})})}selectEvalCase(e,A){let i=this.evalTabComponent();i?(i.selectEvalSet(e),i.selectedEvalTab.set("cases"),i.selectedEvalCase.set(A)):this.pendingEvalCaseSelection.set({evalSetId:e,evalCase:A})}selectEvalResult(e,A,i){let n=this.evalTabComponent();console.log("selectEvalResult tab available:",!!n,"evalCase:",i),n?(n.selectEvalSet(e),n.selectedHistoryRun.set(A),i?(console.log("selectEvalResult setting cases tab and case"),n.selectedEvalTab.set("cases"),n.selectedEvalCase.set(i)):(console.log("selectEvalResult setting history tab and run"),n.selectedEvalTab.set("history"))):(console.log("selectEvalResult deferred to pending"),this.pendingEvalResultSelection.set({evalSetId:e,timestamp:A,evalCase:i}))}isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();isTraceEnabledObs=this.featureFlagService.isTraceEnabled();isArtifactsTabEnabledObs=this.featureFlagService.isArtifactsTabEnabled();isEvalEnabledObs=this.featureFlagService.isEvalEnabled();isTestsEnabledObs=this.featureFlagService.isTestsEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled;filteredSelectedEvent=pe(()=>this.selectedEvent());ngAfterViewInit(){setTimeout(()=>{this.initEvalTab()},500)}initEvalTab(){this.isEvalEnabledObs.pipe($n()).subscribe(e=>{if(e){let A=this.evalTabContainer()?.createComponent(this.evalTabComponentClass??xc,{environmentInjector:this.environmentInjector});if(!A)return;Xa(this.environmentInjector,()=>{Ao(()=>{A.setInput("appName",this.appName()),A.setInput("userId",this.userId()),A.setInput("sessionId",this.sessionId())}),Ao(()=>{let i=this.pendingEvalCaseSelection();i&&(console.log("initEvalTab applying pendingEvalCaseSelection:",i),A.instance.selectEvalSet(i.evalSetId),A.instance.selectedEvalTab.set("cases"),A.instance.selectedEvalCase.set(i.evalCase),this.pendingEvalCaseSelection.set(void 0))}),Ao(()=>{let i=this.pendingEvalResultSelection();i&&(console.log("initEvalTab applying pendingEvalResultSelection:",i),A.instance.selectEvalSet(i.evalSetId),A.instance.selectedHistoryRun.set(i.timestamp),i.evalCase?(console.log("initEvalTab setting cases tab and case"),A.instance.selectedEvalTab.set("cases"),A.instance.selectedEvalCase.set(i.evalCase)):(console.log("initEvalTab setting history tab and run"),A.instance.selectedEvalTab.set("history")),this.pendingEvalResultSelection.set(void 0))})}),A.instance.sessionSelected.subscribe(i=>{this.sessionSelected.emit(i)}),A.instance.evalCaseSelected.subscribe(i=>{this.evalCaseSelected.emit(i)}),A.instance.editEvalCaseRequested.subscribe(i=>{this.editEvalCaseRequested.emit(i)}),A.instance.evalSetIdSelected.subscribe(i=>{this.evalSetIdSelected.emit(i)}),A.instance.shouldReturnToSession.subscribe(i=>{this.returnToSession.emit(i)}),A.instance.evalNotInstalledMsg.subscribe(i=>{this.evalNotInstalled.emit(i)})}})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-side-panel"]],viewQuery:function(A,i){A&1&&ns(i.evalTabComponent,xc,5)(i.evalTabContainer,xFA,5,Mo)(i.tabGroup,lv,5),A&2&&ur(3)},inputs:{appName:[1,"appName"],userId:[1,"userId"],sessionId:[1,"sessionId"],traceData:[1,"traceData"],eventData:[1,"eventData"],currentSessionState:[1,"currentSessionState"],artifacts:[1,"artifacts"],selectedEvent:[1,"selectedEvent"],selectedEventIndex:[1,"selectedEventIndex"],renderedEventGraph:[1,"renderedEventGraph"],rawSvgString:[1,"rawSvgString"],selectedEventGraphPath:[1,"selectedEventGraphPath"],llmRequest:[1,"llmRequest"],llmResponse:[1,"llmResponse"],showSidePanel:[1,"showSidePanel"],isApplicationSelectorEnabledObs:[1,"isApplicationSelectorEnabledObs"],isBuilderMode:[1,"isBuilderMode"],disableBuilderIcon:[1,"disableBuilderIcon"],hasSubWorkflows:[1,"hasSubWorkflows"],graphsAvailable:[1,"graphsAvailable"],invocationDisplayMap:[1,"invocationDisplayMap"],forceGraphTab:[1,"forceGraphTab"],isViewOnlySession:[1,"isViewOnlySession"],isViewOnlyAppNameMismatch:[1,"isViewOnlyAppNameMismatch"]},outputs:{closePanel:"closePanel",tabChange:"tabChange",sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded",evalCaseSelected:"evalCaseSelected",editEvalCaseRequested:"editEvalCaseRequested",testSelected:"testSelected",evalSetIdSelected:"evalSetIdSelected",returnToSession:"returnToSession",evalNotInstalled:"evalNotInstalled",page:"page",switchToEvent:"switchToEvent",closeSelectedEvent:"closeSelectedEvent",openImageDialog:"openImageDialog",openAddItemDialog:"openAddItemDialog",enterBuilderMode:"enterBuilderMode",showAgentStructureGraph:"showAgentStructureGraph",switchToTraceView:"switchToTraceView",drillDownNodePath:"drillDownNodePath",selectEventById:"selectEventById",jumpToInvocation:"jumpToInvocation"},decls:7,vars:8,consts:[["evalTabContainer",""],[1,"loading-spinner-container"],[1,"tabs-container",3,"hidden"],[1,"resize-handler"],["mode","indeterminate","diameter","50"],["animationDuration","0ms",3,"selectedIndexChange","selectedTabChange","selectedIndex"],["mat-tab-label",""],[3,"traceData"],[3,"eventDataSize","eventDataMap","selectedEventIndex","selectedEvent","traceData","filteredSelectedEvent","renderedEventGraph","rawSvgString","appName","selectedEventGraphPath","llmRequest","llmResponse","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab","isViewOnlySession","isViewOnlyAppNameMismatch"],[1,"empty-state"],[3,"sessionState"],[1,"tab-label"],[3,"switchToEvent","traceData"],[3,"page","closeSelectedEvent","openImageDialog","switchToTraceView","showAgentStructureGraph","drillDownNodePath","selectEventById","jumpToInvocation","eventDataSize","eventDataMap","selectedEventIndex","selectedEvent","traceData","filteredSelectedEvent","renderedEventGraph","rawSvgString","appName","selectedEventGraphPath","llmRequest","llmResponse","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab","isViewOnlySession","isViewOnlyAppNameMismatch"],[3,"artifacts"],[3,"testSelected","appName","sessionId","userId","isViewOnlySession"]],template:function(A,i){if(A&1&&(O(0,_FA,0,0),Ht(1,"async"),ta(2),Ht(3,"async"),O(4,RFA,2,0,"div",1),O(5,zFA,16,13,"div",2),hA(6,"div",3)),A&2){Y(si(1,3,i.isAlwaysOnSidePanelEnabledObs)===!1?0:-1),u(2);let n=ga(si(3,5,i.uiStateService.isSessionLoading()));u(2),Y(n?4:-1),u(),Y(i.appName()!=""?5:-1)}},dependencies:[lv,CF,cF,Cv,cv,Z6,Iv,gs,gv,os],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%;position:relative}.drawer-header-wrapper[_ngcontent-%COMP%]{display:flex;height:48px;align-items:center;padding-left:20px}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center}.tabs-container[_ngcontent-%COMP%]{width:100%;flex:1;overflow:hidden;display:flex;flex-direction:column}.tab-label[_ngcontent-%COMP%]{font-size:14px}.resize-handler[_ngcontent-%COMP%]{width:6px;border-radius:4px;position:absolute;display:block;top:20px;bottom:20px;right:0;z-index:100;cursor:ew-resize}.resize-handler[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-outline-variant)}.empty-state[_ngcontent-%COMP%]{padding:16px;text-align:center;color:var(--mat-sys-on-surface-variant);font-style:italic}mat-tab-group[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;min-height:0}mat-tab-group[_ngcontent-%COMP%] .mdc-tab{padding:0 12px;min-width:48px} .mat-mdc-tab-body-wrapper{flex:1;min-height:0} .mat-mdc-tab-body-wrapper .mat-mdc-tab-body-content{overflow-x:hidden}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:6px}.drawer-logo[_ngcontent-%COMP%]{font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.1px}.drawer-header-left[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.panel-toggle-icon[_ngcontent-%COMP%]{font-size:20px;width:24px;height:24px;color:var(--side-panel-mat-icon-color, #c4c7c5);cursor:pointer;display:flex;align-items:center;justify-content:center}.powered-by-adk[_ngcontent-%COMP%]{font-size:10px;color:var(--side-panel-powered-by-adk-color);text-align:right;margin-top:-5px}.adk-info-icon[_ngcontent-%COMP%]{font-size:14px;color:var(--side-panel-mat-icon-color, #bdc1c6);cursor:pointer;margin-left:4px;vertical-align:middle}.mode-toggle-container[_ngcontent-%COMP%]{display:flex;align-items:center}.build-mode-button[_ngcontent-%COMP%]{margin:0 4px}.app-actions[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}"]})};var PFA=["editInput"];function jFA(t,e){if(t&1){let A=QA();B(0,"button",5),U("click",function(){T(A);let n=p();return J(n.startEdit())}),B(1,"mat-icon"),y(2,"edit"),Q()()}}function qFA(t,e){if(t&1){let A=QA();B(0,"button",6),U("click",function(){T(A);let n=p();return J(n.saveEdit())}),B(1,"mat-icon"),y(2,"check"),Q()(),B(3,"button",7),U("click",function(){T(A);let n=p();return J(n.cancelEdit())}),B(4,"mat-icon"),y(5,"close"),Q()()}}var dv=class t{value="";displayValue="";tooltip="";placeholder="";textClass="";save=new LA;isEditing=!1;draftValue="";editInput;startEdit(){this.draftValue=this.value,this.isEditing=!0,setTimeout(()=>{this.editInput.nativeElement.focus()})}cancelEdit(){this.isEditing=!1,this.draftValue=""}saveEdit(){this.save.emit(this.draftValue),this.isEditing=!1}handleKeydown(e){e.key==="Enter"?this.saveEdit():e.key==="Escape"&&this.cancelEdit()}get effectiveDisplayValue(){return this.displayValue||this.value}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-inline-edit"]],viewQuery:function(A,i){if(A&1&&Jt(PFA,5),A&2){let n;ae(n=re())&&(i.editInput=n.first)}},inputs:{value:"value",displayValue:"displayValue",tooltip:"tooltip",placeholder:"placeholder",textClass:"textClass"},outputs:{save:"save"},decls:6,vars:10,consts:[["editInput",""],[1,"inline-edit-container"],[1,"inline-edit-text-wrapper"],[1,"inline-edit-input",3,"ngModelChange","keydown","readonly","ngClass","matTooltip","ngModel"],["mat-icon-button","","aria-label","Edit",1,"inline-edit-action-button"],["mat-icon-button","","aria-label","Edit",1,"inline-edit-action-button",3,"click"],["mat-icon-button","","aria-label","Save",1,"inline-edit-action-button",3,"click"],["mat-icon-button","","aria-label","Cancel",1,"inline-edit-action-button",3,"click"]],template:function(A,i){A&1&&(B(0,"div",1)(1,"div",2)(2,"input",3,0),U("ngModelChange",function(o){return i.draftValue=o})("keydown",function(o){return i.handleKeydown(o)}),Q()(),O(4,jFA,3,0,"button",4)(5,qFA,6,0),Q()),A&2&&(u(2),RA("readonly",!i.isEditing),H("readonly",!i.isEditing)("ngClass",i.textClass)("matTooltip",i.isEditing?"":i.tooltip)("ngModel",i.isEditing?i.draftValue:i.effectiveDisplayValue),te("placeholder",i.isEditing?i.placeholder:"")("aria-label",i.placeholder)("size",((i.isEditing?i.draftValue:i.effectiveDisplayValue)==null?null:(i.isEditing?i.draftValue:i.effectiveDisplayValue).length)||1),u(2),Y(i.isEditing?5:4))},dependencies:[li,zl,ln,Dn,yn,ko,qi,ji,Tn,Wt,Fa,dn],styles:["[_nghost-%COMP%]{display:block;max-width:100%;min-width:0;width:100%}.inline-edit-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;max-width:100%;min-width:0;box-sizing:border-box}.inline-edit-text-wrapper[_ngcontent-%COMP%]{flex:0 1 auto;min-width:0;display:flex;align-items:center}.inline-edit-input[_ngcontent-%COMP%]{min-width:48px;max-width:100%;padding:2px 6px;margin:-3px -7px;border:1px solid var(--chat-toolbar-session-text-color, #ccc);border-radius:4px;color:var(--chat-toolbar-session-id-color, inherit);font-family:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;background:transparent;field-sizing:content;transition:all .2s ease}.inline-edit-input[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--primary-color, #1a73e8)}.inline-edit-input.readonly[_ngcontent-%COMP%]{min-width:0;border-color:transparent;cursor:inherit}.inline-edit-input.readonly[_ngcontent-%COMP%]:focus{outline:none;border-color:transparent}.inline-edit-action-button[_ngcontent-%COMP%]{flex-shrink:0;width:28px!important;height:28px!important;padding:0!important;display:flex;align-items:center;justify-content:center}.inline-edit-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px}"]})};var VFA={openPanelTooltip:"Open panel",evalCaseIdLabel:"Eval Case ID",cancelButton:"Cancel",saveButton:"Save",editEvalCaseTooltip:"Edit current eval case",deleteEvalCaseTooltip:"Delete current eval case",sessionIdLabel:"Session",copySessionIdTooltip:"Copy session ID",sessionIdCopiedMessage:"Session ID copied",copySessionIdFailedMessage:"Failed to copy session ID",userIdLabel:"User ID",editUserIdTooltip:"Edit user ID",userIdInputPlaceholder:"Enter user ID",saveUserIdTooltip:"Save user ID",cancelUserIdEditTooltip:"Cancel editing user ID",invalidUserIdMessage:"User ID cannot be empty",loadingSessionLabel:"Loading session...",tokenStreamingLabel:"Token Streaming",moreOptionsTooltip:"More options",createNewSessionTooltip:"Create a new Session",newSessionButton:"New Session",deleteSessionTooltip:"Delete session",exportSessionTooltip:"Export session",importSessionTooltip:"Import session",viewSessionTooltip:"View session",loadingAgentsLabel:"Loading agents, please wait...",welcomeMessage:"Welcome to ADK!",selectAgentMessage:"Select an agent on the left to begin with.",failedToLoadAgentsMessage:"Failed to load agents. To get started, run",errorMessageLabel:"Error message:",noAgentsFoundWarning:"Warning: No agents found in current folder.",cannotEditSessionMessage:"Chat is disabled to prevent changes to the end user's session.",viewSessionReadOnlyMessage:'This is a read-only view of a session file. Use "Import Session" if you want to continue this session.',readOnlyBadgeLabel:"Read-only"},siA=new kA("Chat Messages",{factory:()=>VFA});var WFA=["sideDrawer"],ZFA=["drawerSessionTab"],XFA=["appSearchInput"],$FA=["invChipMenuTrigger"],ALA=["nodeChipMenuTrigger"],eLA=["addMenuTrigger"],tLA=[[["","adk-web-chat-container-top",""]]],iLA=["[adk-web-chat-container-top]"],giA=()=>[],nLA=(t,e)=>e.metricName;function oLA(t,e){t&1&&sn(0)}function aLA(t,e){if(t&1&&Et(0,oLA,1,0,"ng-container",39),t&2){let A=p();H("ngComponentOutlet",A.logoComponent)}}function rLA(t,e){if(t&1&&(B(0,"span",42),y(1),Q()),t&2){let A=p(2);u(),lA(A.adkVersion())}}function sLA(t,e){if(t&1&&(B(0,"div",48)(1,"div",49)(2,"span",50),y(3,"Version:"),Q(),B(4,"span",51),y(5),Q()(),B(6,"div",49)(7,"span",50),y(8,"Language:"),Q(),B(9,"span",51),y(10),Q()(),B(11,"div",49)(12,"span",50),y(13,"Lang Version:"),Q(),B(14,"span",51),y(15),Q()()()),t&2){let A=p(2);u(5),lA(A.versionInfo().version),u(5),lA(A.versionInfo().language),u(5),lA(A.versionInfo().language_version)}}function lLA(t,e){if(t&1&&(hA(0,"img",40),B(1,"span",41),y(2,"Agent Development Kit"),O(3,rLA,2,1,"span",42),Q(),B(4,"span",43),y(5,"ADK"),Q(),B(6,"div",44)(7,"mat-icon",45),y(8,"info_outline"),Q(),B(9,"div",46)(10,"div",47),y(11),Q(),O(12,sLA,16,3,"div",48),Q()()),t&2){let A=p();u(3),Y(A.adkVersion()?3:-1),u(8),lA(A.sidePanelI18n.disclosureTooltip),u(),Y(A.versionInfo()?12:-1)}}function gLA(t,e){t&1&&(B(0,"mat-icon",19),y(1,"warning"),Q())}function cLA(t,e){if(t&1){let A=QA();B(0,"span",53)(1,"button",55),U("click",function(){T(A);let n=p(2);return J(n.openAgentStructureGraphDialog())}),B(2,"mat-icon"),y(3,"account_tree"),Q()()()}if(t&2){let A=p(2);H("matTooltip",A.graphsAvailable()?"View Agent Structure Graph":"Agent structure graph is not available for this agent"),u(),H("disabled",!A.graphsAvailable())}}function CLA(t,e){if(t&1){let A=QA();hA(0,"div",52),O(1,cLA,4,2,"span",53),B(2,"span",53)(3,"button",54),U("click",function(){T(A);let n=p();return J(n.enterBuilderMode())}),B(4,"mat-icon"),y(5,"edit"),Q()()()}if(t&2){let A=p();u(),Y(A.graphsAvailable()?1:-1),u(),H("matTooltip",A.disableBuilderSwitch?"Editing is not available for this agent because it was not built by the builder":"Edit in Builder Mode"),u(),H("disabled",A.disableBuilderSwitch)}}function ILA(t,e){if(t&1){let A=QA();B(0,"div",56)(1,"mat-icon",61),y(2,"visibility"),Q(),B(3,"span",62),y(4),Q(),B(5,"button",63),U("click",function(){T(A);let n=p(2);return J(n.closeReadonlySession())}),B(6,"mat-icon",64),y(7,"close"),Q()()()}if(t&2){let A=p(2);u(4),ba("",A.readonlySessionType(),": ",A.readonlySessionName())}}function dLA(t,e){if(t&1){let A=QA();B(0,"button",68),U("click",function(){T(A);let n=p(6);return J(n.onNewSessionClick())}),B(1,"mat-icon",17),y(2,"add_comment"),Q(),B(3,"span"),y(4),Q()()}if(t&2){let A=p(6);H("matTooltip",A.i18n.createNewSessionTooltip),u(4),lA(A.i18n.newSessionButton)}}function BLA(t,e){if(t&1){let A=QA();B(0,"button",69),U("click",function(){T(A);let n=p(6);return J(n.onNewSessionClick())}),B(1,"mat-icon",17),y(2,"add_comment"),Q()()}if(t&2){let A=p(6);H("matTooltip",A.i18n.createNewSessionTooltip)}}function ELA(t,e){if(t&1&&(hA(0,"div",52),O(1,dLA,5,2,"button",66)(2,BLA,3,1,"button",67)),t&2){let A=p(5);u(),Y(A.uiEvents().length>0?1:2)}}function hLA(t,e){if(t&1&&O(0,ELA,3,1),t&2){let A=p(4);Y(A.sessionId?0:-1)}}function QLA(t,e){if(t&1&&(ta(0),Ht(1,"async"),O(2,hLA,1,1)),t&2){let A=si(1,1,p(3).uiStateService.isSessionLoading());u(2),Y(A===!1?2:-1)}}function uLA(t,e){if(t&1){let A=QA();B(0,"div",15)(1,"button",65),U("click",function(){T(A);let n=p(2);return J(n.toggleSessionSelectorDrawer())}),B(2,"mat-icon",17),y(3,"chat"),Q(),B(4,"span",18),y(5),Q(),B(6,"mat-icon",20),y(7,"arrow_drop_down"),Q()(),O(8,QLA,3,3),Q()}if(t&2){let A=p(2);u(5),lA(A.getToolbarSessionId()),u(3),Y(A.evalCase?-1:8)}}function fLA(t,e){if(t&1&&(B(0,"div",56)(1,"span",62),y(2),Q(),B(3,"span",70),y(4),Q()()),t&2){let A=p(3);u(2),lA(A.i18n.evalCaseIdLabel),u(2),lA(A.evalCase.evalId)}}function pLA(t,e){if(t&1){let A=QA();B(0,"button",71),U("click",function(){T(A);let n=p(3);return J(n.cancelEditEvalCase())}),y(1),Q(),B(2,"button",72),U("click",function(){T(A);let n=p(3);return J(n.saveEvalCase())}),y(3),Q()}if(t&2){let A=p(3);u(),ue(" ",A.i18n.cancelButton," "),u(),H("disabled",!A.hasEvalCaseChanged()||A.isEvalCaseEditing()),u(),ue(" ",A.i18n.saveButton," ")}}function mLA(t,e){}function wLA(t,e){if(t&1&&(O(0,fLA,5,2,"div",56),B(1,"div",59),O(2,pLA,4,3)(3,mLA,0,0),Q()),t&2){let A=p(2);Y(A.isViewOnlySession()?-1:0),u(2),Y(A.isEvalEditMode()?2:3)}}function DLA(t,e){}function yLA(t,e){if(t&1&&(B(0,"div",73),y(1),Q()),t&2){let A=p(3);u(),lA(A.i18n.loadingSessionLabel)}}function vLA(t,e){if(t&1&&(B(0,"div",58),ta(1),Ht(2,"async"),O(3,DLA,0,0)(4,yLA,2,1,"div",73),Q()),t&2){let A=si(2,1,p(2).uiStateService.isSessionLoading());u(3),Y(A===!1?3:4)}}function bLA(t,e){if(t&1){let A=QA();B(0,"button",74),U("click",function(){T(A);let n=p(2);return J(n.themeService.toggleTheme())}),B(1,"mat-icon"),y(2),Q()()}if(t&2){let A=p(2);H("matTooltip",A.themeService.currentTheme()==="dark"?"Switch to Light Mode":"Switch to Dark Mode"),u(2),lA(A.themeService.currentTheme()==="dark"?"light_mode":"dark_mode")}}function MLA(t,e){if(t&1&&(B(0,"div",21),O(1,ILA,8,2,"div",56)(2,uLA,9,2,"div",15),B(3,"div",57),O(4,wLA,4,2)(5,vLA,5,3,"div",58),Q(),B(6,"div",59),ta(7),Ht(8,"async"),O(9,bLA,3,2,"button",60),Q()()),t&2){let A=p();u(),Y(A.isViewOnlySession()?1:2),u(3),Y(A.evalCase?4:5);let i=si(8,3,A.uiStateService.isSessionLoading());u(5),Y(i===!1?9:-1)}}function SLA(t,e){t&1&&(B(0,"div",84),hA(1,"mat-progress-spinner",85),Q())}function kLA(t,e){t&1&&(B(0,"mat-icon",91),y(1,"check"),Q())}function xLA(t,e){if(t&1){let A=QA();B(0,"button",88),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.selectAppFromDrawer(n))}),B(1,"mat-icon",89),y(2,"robot_2"),Q(),B(3,"span",90),y(4),Q(),O(5,kLA,2,0,"mat-icon",91),Q()}if(t&2){let A=e.$implicit,i=p(3);RA("selected",A===i.appName),u(4),lA(A),u(),Y(A===i.appName?5:-1)}}function _LA(t,e){t&1&&(B(0,"div",87),y(1,"No apps found"),Q())}function RLA(t,e){t&1&&Ue(0,xLA,6,4,"button",86,ri,!1,_LA,2,0,"div",87),t&2&&Te(e)}function NLA(t,e){if(t&1){let A=QA();B(0,"div",75)(1,"span",76),y(2,"Select an App"),Q(),B(3,"div")(4,"button",77),U("click",function(){T(A);let n=p();return J(n.openAddItemDialog())}),B(5,"mat-icon"),y(6,"add"),Q()(),B(7,"button",78),U("click",function(){T(A);let n=p();return J(n.toggleAppSelectorDrawer())}),B(8,"mat-icon"),y(9,"close"),Q()()()(),B(10,"div",79)(11,"mat-form-field",80)(12,"mat-icon",81),y(13,"search"),Q(),B(14,"input",82,3),U("keydown",function(n){T(A);let o=p();return J(o.handleAppSearchKeydown(n))}),Q()()(),B(16,"div",83),U("keydown",function(n){T(A);let o=p();return J(o.handleAppListKeydown(n))}),O(17,SLA,2,0,"div",84),Ht(18,"async"),WI(19,RLA,3,1),Q()}if(t&2){let A,i=p();u(14),H("formControl",i.appDrawerSearchControl),u(3),Y(i.isLoadingApps()?17:(A=si(18,2,i.filteredDrawerApps$))?19:-1,A)}}function FLA(t,e){if(t&1){let A=QA();B(0,"button",94),U("click",function(){T(A);let n=p(2);return J(n.importSession())}),B(1,"mat-icon"),y(2,"upload"),Q(),B(3,"span"),y(4,"Import"),Q()()}if(t&2){let A=p(2);H("matTooltip",A.i18n.importSessionTooltip)}}function LLA(t,e){if(t&1){let A=QA();B(0,"button",107),U("click",function(){T(A);let n=p(3);return J(n.exportSession())}),B(1,"mat-icon"),y(2,"download"),Q(),B(3,"span"),y(4,"Export"),Q()()}if(t&2){let A=p(3);H("matTooltip",A.i18n.exportSessionTooltip)}}function GLA(t,e){if(t&1){let A=QA();B(0,"button",108),U("click",function(){T(A);let n=p(3);return J(n.deleteSession(n.sessionId))}),B(1,"mat-icon"),y(2,"delete"),Q(),B(3,"span"),y(4,"Delete"),Q()()}if(t&2){let A=p(3);H("matTooltip",A.i18n.deleteSessionTooltip)}}function KLA(t,e){if(t&1){let A=QA();B(0,"div",96)(1,"span",99),y(2,"Current Session"),Q(),B(3,"div",100)(4,"app-inline-edit",101),U("save",function(n){T(A);let o=p(2);return J(o.saveSessionName(n))}),Q()(),B(5,"div",102)(6,"span",103),y(7),Q(),B(8,"button",104),U("click",function(){T(A);let n=p(2);return J(n.copySessionId())}),B(9,"mat-icon"),y(10,"content_copy"),Q()(),O(11,LLA,5,1,"button",105),Ht(12,"async"),O(13,GLA,5,1,"button",106),Ht(14,"async"),Q()()}if(t&2){let A=p(2);u(4),H("value",A.sessionDisplayNameDraft)("displayValue",A.getCurrentSessionDisplayName())("tooltip",A.sessionId),u(2),H("title",A.sessionId),u(),lA(A.sessionId),u(4),Y(si(12,7,A.isExportSessionEnabledObs)?11:-1),u(2),Y(si(14,9,A.isDeleteSessionEnabledObs)?13:-1)}}function ULA(t,e){if(t&1){let A=QA();B(0,"div",75)(1,"span",76),y(2,"Select a Session"),Q(),B(3,"div",92),O(4,FLA,5,1,"button",93),Ht(5,"async"),B(6,"button",94),U("click",function(){T(A);let n=p();return J(n.viewSession())}),B(7,"mat-icon"),y(8,"visibility"),Q(),B(9,"span"),y(10,"View"),Q()(),B(11,"button",95),U("click",function(){T(A);let n=p();return J(n.toggleSessionSelectorDrawer())}),B(12,"mat-icon"),y(13,"close"),Q()()()(),O(14,KLA,15,11,"div",96),B(15,"div",97)(16,"app-session-tab",98,4),U("sessionSelected",function(n){T(A);let o=p();return J(o.onSessionSelectedFromDrawer(n))})("sessionReloaded",function(n){T(A);let o=p();return J(o.onSessionReloadedFromDrawer(n))}),Q()()}if(t&2){let A=p();u(4),Y(si(5,6,A.importSessionEnabledObs)?4:-1),u(2),H("matTooltip",A.i18n.viewSessionTooltip),u(8),Y(A.sessionId?14:-1),u(2),H("userId",A.userId)("appName",A.appName)("sessionId",A.sessionId)}}function TLA(t,e){if(t&1){let A=QA();B(0,"app-side-panel",109),U("jumpToInvocation",function(n){T(A);let o=p();return J(o.handleJumpToInvocation(n))})("closePanel",function(){T(A);let n=p();return J(n.toggleSidePanel())})("tabChange",function(n){T(A);let o=p();return J(o.handleTabChange(n))})("sessionSelected",function(n){T(A);let o=p();return J(o.updateWithSelectedSession(n))})("evalCaseSelected",function(n){T(A);let o=p();return J(o.updateWithSelectedEvalCase(n))})("editEvalCaseRequested",function(n){T(A);let o=p();return J(o.handleEditEvalCaseRequested(n))})("testSelected",function(n){T(A);let o=p();return J(o.updateWithSelectedTest(n.testName,n.events))})("evalSetIdSelected",function(n){T(A);let o=p();return J(o.updateSelectedEvalSetId(n))})("returnToSession",function(n){T(A);let o=p();return J(o.handleReturnToSession(n))})("evalNotInstalled",function(n){T(A);let o=p();return J(o.handleEvalNotInstalled(n))})("page",function(n){T(A);let o=p();return J(o.handlePageEvent(n))})("closeSelectedEvent",function(){T(A);let n=p();return J(n.closeSelectedEvent())})("openImageDialog",function(n){T(A);let o=p();return J(o.openViewImageDialog(n))})("openAddItemDialog",function(){T(A);let n=p();return J(n.openAddItemDialog())})("enterBuilderMode",function(){T(A);let n=p();return J(n.enterBuilderMode())})("showAgentStructureGraph",function(){T(A);let n=p();return J(n.openAgentStructureGraphDialog("event"))})("switchToEvent",function(n){T(A);let o=p();return J(o.selectEvent(n))})("switchToTraceView",function(){T(A);let n=p();return J(n.switchToTraceView())})("drillDownNodePath",function(n){T(A);let o=p();return J(o.onEventTabDrillDown(n))})("selectEventById",function(n){T(A);let o=p();return J(o.selectEvent(n))}),Q()}if(t&2){let A=p();H("isApplicationSelectorEnabledObs",A.isApplicationSelectorEnabledObs)("showSidePanel",A.showSidePanel)("appName",A.appName)("userId",A.userId)("sessionId",A.sessionId)("isViewOnlySession",A.isViewOnlySession())("isViewOnlyAppNameMismatch",A.isViewOnlyAppNameMismatch())("traceData",A.traceData)("eventData",A.eventData)("currentSessionState",A.currentSessionState)("artifacts",A.artifacts)("selectedEvent",A.selectedEvent)("selectedEventIndex",A.selectedEventIndex)("renderedEventGraph",A.renderedEventGraph)("rawSvgString",A.rawSvgString)("selectedEventGraphPath",A.selectedEventGraphPath)("llmRequest",A.llmRequest)("llmResponse",A.llmResponse)("disableBuilderIcon",A.disableBuilderSwitch)("hasSubWorkflows",A.hasSubWorkflows)("graphsAvailable",A.graphsAvailable())("invocationDisplayMap",A.invocationDisplayMap())("forceGraphTab",A.autoSelectLatestEvent)}}function JLA(t,e){if(t&1){let A=QA();B(0,"app-builder-tabs",110),U("exitBuilderMode",function(){T(A);let n=p();return J(n.exitBuilderMode())})("closePanel",function(){T(A);let n=p();return J(n.toggleSidePanel())}),Q(),hA(1,"div",111)}if(t&2){let A=p();H("appNameInput",A.appName)}}function OLA(t,e){if(t&1){let A=QA();B(0,"div",36)(1,"div",112)(2,"button",113),U("click",function(){T(A);let n=p();return J(n.saveAgentBuilder())}),B(3,"mat-icon"),y(4,"check"),Q()(),B(5,"button",114),U("click",function(){T(A);let n=p();return J(n.exitBuilderMode())}),B(6,"mat-icon"),y(7,"close"),Q()(),B(8,"button",115),U("click",function(){T(A);let n=p();return J(n.toggleBuilderAssistant())}),B(9,"mat-icon"),y(10,"assistant"),Q()()(),B(11,"app-canvas",116),U("toggleSidePanelRequest",function(){T(A);let n=p();return J(n.toggleSidePanel())})("builderAssistantCloseRequest",function(){T(A);let n=p();return J(n.toggleBuilderAssistant())}),Q()()}if(t&2){let A=p();u(8),RA("active",A.showBuilderAssistant),u(3),H("showSidePanel",A.showSidePanel)("showBuilderAssistant",A.showBuilderAssistant)("appNameInput",A.appName)}}function YLA(t,e){if(t&1&&(B(0,"div",118)(1,"span"),y(2),Q()()),t&2){let A=p(3);u(2),lA(A.i18n.loadingAgentsLabel)}}function HLA(t,e){if(t&1&&(B(0,"span"),y(1),hA(2,"br"),y(3),Q()),t&2){let A=p(4);u(),lA(A.i18n.welcomeMessage),u(2),ue(" ",A.i18n.selectAgentMessage)}}function zLA(t,e){if(t&1&&(y(0),hA(1,"br"),B(2,"pre",120),y(3),Q()),t&2){let A=p(5);ue(" ",A.i18n.errorMessageLabel," "),u(3),lA(A.loadingError())}}function PLA(t,e){if(t&1&&(B(0,"pre",119),y(1),Q()),t&2){let A=p(5);u(),lA(A.i18n.noAgentsFoundWarning)}}function jLA(t,e){if(t&1&&(B(0,"div"),y(1),B(2,"pre"),y(3,"adk web"),Q(),y(4," in the folder that contains the agents."),hA(5,"br"),O(6,zLA,4,2)(7,PLA,2,1,"pre",119),Q()),t&2){let A=p(4);u(),ue(" ",A.i18n.failedToLoadAgentsMessage," "),u(5),Y(A.loadingError()?6:7)}}function qLA(t,e){if(t&1&&(B(0,"div",118),O(1,HLA,4,2,"span"),Ht(2,"async"),WI(3,jLA,8,2,"div"),Q()),t&2){let A=p(3);u(),Y((si(2,1,A.apps$)||Kc(3,giA)).length>0?1:3)}}function VLA(t,e){if(t&1&&(O(0,YLA,3,1,"div",118),Ht(1,"async"),WI(2,qLA,4,4,"div",118)),t&2){let A=p(2);Y(A.isLoadingApps()?0:si(1,1,A.isApplicationSelectorEnabledObs)?2:-1)}}function WLA(t,e){if(t&1){let A=QA();B(0,"div",143,8),U("click",function(n){return n.stopPropagation()}),B(2,"span",144),y(3),Q(),B(4,"button",145),U("click",function(n){T(A);let o=p(3);return J(o.removeInvocationIdFilter(n))}),B(5,"mat-icon"),y(6,"close"),Q()()()}if(t&2){p();let A=Qi(18),i=p(2);H("matMenuTriggerFor",A)("matTooltip",i.invocationIdFilter()?"Invocation: "+(i.invocationDisplayMap().get(i.invocationIdFilter())||i.invocationIdFilter()):"Filter events by a specific invocation"),u(2),H("title",i.invocationIdFilter()?i.invocationDisplayMap().get(i.invocationIdFilter())||i.invocationIdFilter():"Invocation"),u(),lA(i.invocationIdFilter()?i.invocationDisplayMap().get(i.invocationIdFilter())||i.invocationIdFilter():"Invocation")}}function ZLA(t,e){if(t&1){let A=QA();B(0,"div",143,9),U("click",function(n){return n.stopPropagation()}),B(2,"span",62),y(3,"Node"),Q(),B(4,"button",145),U("click",function(n){T(A);let o=p(3);return J(o.removeNodePathFilter(n))}),B(5,"mat-icon"),y(6,"close"),Q()()()}if(t&2){p();let A=Qi(22),i=p(2);H("matMenuTriggerFor",A)("matTooltip",i.nodePathFilter()?"Node: "+i.nodePathFilter():"Filter events generated by a specific node")}}function XLA(t,e){if(t&1){let A=QA();B(0,"div",146),U("click",function(n){return n.stopPropagation()}),B(1,"span",62),y(2,"Final"),Q(),B(3,"button",145),U("click",function(n){return T(A),p(3).toggleHideIntermediateEvents(),J(n.stopPropagation())}),B(4,"mat-icon"),y(5,"close"),Q()()()}}function $LA(t,e){if(t&1&&(B(0,"div",147,10),U("click",function(i){return i.stopPropagation()}),B(2,"mat-icon"),y(3,"add"),Q(),B(4,"span"),y(5,"Filter"),Q()()),t&2){p();let A=Qi(13);H("matMenuTriggerFor",A)}}function AGA(t,e){if(t&1){let A=QA();B(0,"div",148),U("click",function(n){T(A);let o=p(3);return J(o.clearAllFilters(n))}),B(1,"mat-icon"),y(2,"clear_all"),Q(),B(3,"span"),y(4,"Clear"),Q()()}}function eGA(t,e){if(t&1){let A=QA();B(0,"button",149),U("click",function(){T(A);let n=p(3);return J(n.addInvocationIdFilter())}),y(1,"Invocation"),Q()}}function tGA(t,e){if(t&1){let A=QA();B(0,"button",150),U("click",function(){T(A);let n=p(3);return J(n.addNodePathFilter())}),y(1,"Node"),Q()}}function iGA(t,e){if(t&1){let A=QA();B(0,"button",151),U("click",function(){T(A);let n=p(3);return J(n.toggleHideIntermediateEvents())}),y(1,"Final"),Q()}}function nGA(t,e){if(t&1){let A=QA();B(0,"button",152),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.setInvocationIdFilter(n))}),B(1,"mat-icon",153),y(2,"check"),Q(),y(3),Q()}if(t&2){let A=e.$implicit,i=p(3);H("matTooltip",A),u(),ut("visibility",i.invocationIdFilter()===A?"visible":"hidden"),u(2),ue(" ",i.invocationDisplayMap().get(A)||A," ")}}function oGA(t,e){if(t&1){let A=QA();B(0,"button",154),U("click",function(){let n=T(A).$implicit,o=p(3);return J(o.setNodePathFilter(n))}),B(1,"mat-icon",153),y(2,"check"),Q(),y(3),Q()}if(t&2){let A=e.$implicit,i=p(3);u(),ut("visibility",i.nodePathFilter()===A?"visible":"hidden"),u(2),ue(" ",A," ")}}function aGA(t,e){if(t&1){let A=QA();B(0,"button",155),U("click",function(){T(A);let n=p(3);return J(n.isSideBySide.set(!n.isSideBySide()))}),B(1,"mat-icon",156),y(2),Q(),B(3,"span",157),y(4,"Compare"),Q()()}if(t&2){let A=p(3);ut("color",A.isSideBySide()?"var(--mat-sys-primary)":"var(--mat-sys-on-surface-variant)"),u(2),lA(A.isSideBySide()?"check_circle":"radio_button_unchecked")}}function rGA(t,e){if(t&1){let A=QA();B(0,"button",158),U("click",function(){T(A);let n=p(3);return J(n.toggleSse())}),B(1,"mat-icon",156),y(2),Q(),B(3,"span",157),y(4,"Streaming"),Q()()}if(t&2){let A=p(3);ut("color",A.useSse()?"var(--mat-sys-primary)":"var(--mat-sys-on-surface-variant)"),u(2),lA(A.useSse()?"check_circle":"radio_button_unchecked")}}function sGA(t,e){if(t&1){let A=QA();B(0,"app-chat-panel",159),Ht(1,"async"),Di("userInputChange",function(n){T(A);let o=p(3);return Bi(o.userInput,n)||(o.userInput=n),J(n)}),U("toggleHideIntermediateEvents",function(){T(A);let n=p(3);return J(n.toggleHideIntermediateEvents())})("toggleSse",function(){T(A);let n=p(3);return J(n.toggleSse())})("clickEvent",function(n){T(A);let o=p(3);return J(o.clickEvent(n))})("handleKeydown",function(n){T(A);let o=p(3);return J(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){T(A);let o=p(3);return J(o.cancelEditMessage(n))})("saveEditMessage",function(n){T(A);let o=p(3);return J(o.saveEditMessage(n))})("openViewImageDialog",function(n){T(A);let o=p(3);return J(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){T(A);let o=p(3);return J(o.openBase64InNewTab(n.data,n.mimeType))})("fileSelect",function(n){T(A);let o=p(3);return J(o.onFileSelect(n))})("removeFile",function(n){T(A);let o=p(3);return J(o.removeFile(n))})("removeStateUpdate",function(){T(A);let n=p(3);return J(n.removeStateUpdate())})("sendMessage",function(n){T(A);let o=p(3);return J(o.handleChatInput(n))})("updateState",function(){T(A);let n=p(3);return J(n.updateState())})("toggleAudioRecording",function(n){T(A);let o=p(3);return J(o.toggleAudioRecording(n))})("toggleVideoRecording",function(){T(A);let n=p(3);return J(n.toggleVideoRecording())})("longRunningResponseComplete",function(n){T(A);let o=p(3);return J(o.sendMessage(n))}),Q()}if(t&2){let A=p(3);H("appName",A.appName)("agentReadme",A.agentReadme),wi("userInput",A.userInput),H("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("traceData",A.traceData)("isTokenStreamingEnabled",si(1,22,A.isTokenStreamingEnabledObs)??!1)("useSse",A.useSse())("isChatMode",!0)("selectedFiles",A.selectedFiles)("updatedSessionState",A.updatedSessionState())("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("isAudioRecording",A.isAudioRecording)("micVolume",A.micVolume())("isVideoRecording",A.isVideoRecording)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function lGA(t,e){if(t&1){let A=QA();B(0,"app-chat-panel",160),Ht(1,"async"),Di("userInputChange",function(n){T(A);let o=p(3);return Bi(o.userInput,n)||(o.userInput=n),J(n)})("userEditEvalCaseMessageChange",function(n){T(A);let o=p(3);return Bi(o.userEditEvalCaseMessage,n)||(o.userEditEvalCaseMessage=n),J(n)}),U("clickEvent",function(n){T(A);let o=p(3);return J(o.clickEvent(n))})("handleKeydown",function(n){T(A);let o=p(3);return J(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){T(A);let o=p(3);return J(o.cancelEditMessage(n))})("saveEditMessage",function(n){T(A);let o=p(3);return J(o.saveEditMessage(n))})("openViewImageDialog",function(n){T(A);let o=p(3);return J(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){T(A);let o=p(3);return J(o.openBase64InNewTab(n.data,n.mimeType))})("editEvalCaseMessage",function(n){T(A);let o=p(3);return J(o.editEvalCaseMessage(n))})("deleteEvalCaseMessage",function(n){T(A);let o=p(3);return J(o.deleteEvalCaseMessage(n.message,n.index))})("editFunctionArgs",function(n){T(A);let o=p(3);return J(o.editFunctionArgs(n))}),Q()}if(t&2){let A=p(3);H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("isChatMode",!1)("evalCase",A.evalCase)("isEvalEditMode",A.isEvalEditMode())("isEvalCaseEditing",A.isEvalCaseEditing())("isEditFunctionArgsEnabled",si(1,19,A.isEditFunctionArgsEnabledObs)??!1),wi("userInput",A.userInput)("userEditEvalCaseMessage",A.userEditEvalCaseMessage),H("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function gGA(t,e){if(t&1&&(B(0,"div",174),y(1),Q()),t&2){p();let A=zn(40);u(),ue(" ",A)}}function cGA(t,e){if(t&1&&(B(0,"div",166)(1,"span",167),y(2),Ht(3,"formatMetricName"),Q(),B(4,"div",168)(5,"span",169),y(6),Ht(7,"number"),Q(),B(8,"span",170),y(9),Ht(10,"number"),Q()(),B(11,"div",171)(12,"div",172),y(13),Ht(14,"formatMetricName"),Q(),B(15,"div",173),y(16),Q(),B(17,"div",48)(18,"div",49)(19,"span",50),y(20,"Actual:"),Q(),B(21,"span",51),y(22),Ht(23,"number"),Q()(),B(24,"div",49)(25,"span",50),y(26,"Threshold:"),Q(),B(27,"span",51),y(28),Ht(29,"number"),Q()(),B(30,"div",49)(31,"span",50),y(32,"Min:"),Q(),B(33,"span",51),y(34),Q()(),B(35,"div",49)(36,"span",50),y(37,"Max:"),Q(),B(38,"span",51),y(39),Q()()(),ta(40),O(41,gGA,2,1,"div",174),Q()()),t&2){let A=e.$implicit,i=p(6);ut("border",A.evalStatus==1?"1px solid #2e7d32":"1px solid var(--mat-sys-error)"),u(2),lA(si(3,16,A.metricName)),u(3),ut("color",A.evalStatus==1?"#2e7d32":"var(--mat-sys-error)"),u(),ue(" ",A.score!=null?T0(7,18,A.score,"1.2-2"):"?"," "),u(3),ue(" / ",T0(10,21,A.threshold,"1.2-2")," "),u(4),lA(si(14,24,A.metricName)),u(3),lA(A.metricName),u(5),ut("color",A.evalStatus==1?"#2e7d32":"var(--mat-sys-error)"),u(),lA(A.score!=null?T0(23,26,A.score,"1.2-2"):"?"),u(6),lA(T0(29,29,A.threshold,"1.2-2")),u(6),lA(i.getMetricMin(A.metricName)),u(5),lA(i.getMetricMax(A.metricName)),u();let n=ga(i.getMetricDescription(A.metricName));u(),Y(n?41:-1)}}function CGA(t,e){if(t&1&&(B(0,"div",164),Ue(1,cGA,42,33,"div",165,nLA),Q()),t&2){p();let A=zn(0);u(),Te(A.overallEvalMetricResults)}}function IGA(t,e){if(t&1&&(ta(0),B(1,"div",161),O(2,CGA,3,0,"div",164),Q()),t&2){let A=ga(p(4).evalCaseResult());u(2),Y(A.overallEvalMetricResults!=null&&A.overallEvalMetricResults.length?2:-1)}}function dGA(t,e){if(t&1){let A=QA();B(0,"div",162)(1,"div",175)(2,"div",176),y(3,"Expected"),Q(),hA(4,"app-chat-panel",177),Q(),B(5,"div",175)(6,"div",176),y(7,"Actual"),Q(),B(8,"app-chat-panel",178),Ht(9,"async"),Ht(10,"async"),U("toggleHideIntermediateEvents",function(){T(A);let n=p(4);return J(n.toggleHideIntermediateEvents())})("toggleSse",function(){T(A);let n=p(4);return J(n.toggleSse())}),Di("userInputChange",function(n){T(A);let o=p(4);return Bi(o.userInput,n)||(o.userInput=n),J(n)})("userEditEvalCaseMessageChange",function(n){T(A);let o=p(4);return Bi(o.userEditEvalCaseMessage,n)||(o.userEditEvalCaseMessage=n),J(n)}),U("clickEvent",function(n){T(A);let o=p(4);return J(o.clickEvent(n))})("handleKeydown",function(n){T(A);let o=p(4);return J(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){T(A);let o=p(4);return J(o.cancelEditMessage(n))})("saveEditMessage",function(n){T(A);let o=p(4);return J(o.saveEditMessage(n))})("openViewImageDialog",function(n){T(A);let o=p(4);return J(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){T(A);let o=p(4);return J(o.openBase64InNewTab(n.data,n.mimeType))})("editEvalCaseMessage",function(n){T(A);let o=p(4);return J(o.editEvalCaseMessage(n))})("deleteEvalCaseMessage",function(n){T(A);let o=p(4);return J(o.deleteEvalCaseMessage(n.message,n.index))})("editFunctionArgs",function(n){T(A);let o=p(4);return J(o.editFunctionArgs(n))})("fileSelect",function(n){T(A);let o=p(4);return J(o.onFileSelect(n))})("removeFile",function(n){T(A);let o=p(4);return J(o.removeFile(n))})("removeStateUpdate",function(){T(A);let n=p(4);return J(n.removeStateUpdate())})("sendMessage",function(n){T(A);let o=p(4);return J(o.handleChatInput(n))})("updateState",function(){T(A);let n=p(4);return J(n.updateState())})("toggleAudioRecording",function(n){T(A);let o=p(4);return J(o.toggleAudioRecording(n))})("toggleVideoRecording",function(){T(A);let n=p(4);return J(n.toggleVideoRecording())})("longRunningResponseComplete",function(n){T(A);let o=p(4);return J(o.sendMessage(n))}),Q()()()}if(t&2){let A=p(4);u(4),H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredExpectedUiEvents())("isChatMode",!1)("evalCase",A.evalCase)("isEvalEditMode",!1)("isEvalCaseEditing",!1)("isEditFunctionArgsEnabled",!1)("userInput","")("selectedFiles",Kc(54,giA))("updatedSessionState",null)("agentGraphData",A.agentGraphData())("selectedMessageIndex",-1)("isAudioRecording",!1)("micVolume",0)("isVideoRecording",!1)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn),u(4),H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("traceData",A.traceData)("isTokenStreamingEnabled",si(9,50,A.isTokenStreamingEnabledObs)??!1)("useSse",A.useSse())("isChatMode",!1)("evalCase",A.evalCase)("isEvalEditMode",A.isEvalEditMode())("isEvalCaseEditing",A.isEvalCaseEditing())("isEditFunctionArgsEnabled",si(10,52,A.isEditFunctionArgsEnabledObs)??!1),wi("userInput",A.userInput)("userEditEvalCaseMessage",A.userEditEvalCaseMessage),H("selectedFiles",A.selectedFiles)("updatedSessionState",A.updatedSessionState())("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("isAudioRecording",A.isAudioRecording)("micVolume",A.micVolume())("isVideoRecording",A.isVideoRecording)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function BGA(t,e){if(t&1&&hA(0,"app-chat-panel",163),t&2){let A=p(4);H("appName",A.appName)("agentReadme",A.agentReadme)("hideIntermediateEvents",A.hideIntermediateEvents())("uiEvents",A.filteredUiEvents())("traceData",A.traceData)("isChatMode",!1)("evalCase",A.evalCase)("agentGraphData",A.agentGraphData())("selectedMessageIndex",A.selectedMessageIndex)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)("invocationDisplayMap",A.invocationDisplayMap())("viewMode",A.viewMode())("shouldShowEvent",A.shouldShowEventFn)}}function EGA(t,e){if(t&1&&(O(0,IGA,3,2,"div",161),O(1,dGA,11,55,"div",162)(2,BGA,1,15,"app-chat-panel",163)),t&2){let A=p(3);Y(A.evalCaseResult()?0:-1),u(),Y(A.isSideBySide()?1:2)}}function hGA(t,e){t&1&&(B(0,"div",142)(1,"mat-icon",179),y(2,"insert_drive_file"),Q(),B(3,"h3",180),y(4,"File View"),Q(),B(5,"p",181),y(6,"File content lost on refresh. Please re-upload the file to view or use it."),Q()())}function QGA(t,e){if(t&1){let A=QA();B(0,"div",121)(1,"mat-button-toggle-group",122),U("change",function(n){T(A);let o=p(2);return J(o.onViewModeChange(n.value))}),B(2,"mat-button-toggle",123),y(3,"Events"),Q(),B(4,"mat-button-toggle",124),y(5,"Traces"),Q()(),B(6,"div",125),U("click",function(n){T(A);let o=p(2);return J(o.openAddFilterMenu(n))}),O(7,WLA,7,4,"div",126),O(8,ZLA,7,2,"div",126),O(9,XLA,6,0,"div",127),O(10,$LA,6,1,"div",128),O(11,AGA,5,0,"div",129),Q(),B(12,"mat-menu",130,5),O(14,eGA,2,0,"button",131),O(15,tGA,2,0,"button",132),O(16,iGA,2,0,"button",133),Q(),B(17,"mat-menu",134,6),U("closed",function(){T(A);let n=p(2);return J(n.onInvocationMenuClosed())}),Ue(19,nGA,4,4,"button",135,ri),Q(),B(21,"mat-menu",134,7),U("closed",function(){T(A);let n=p(2);return J(n.onNodePathMenuClosed())}),Ue(23,oGA,4,3,"button",136,ri),Q(),hA(25,"div",137),O(26,aGA,5,3,"button",138),O(27,rGA,5,3,"button",139),Ht(28,"async"),Q(),O(29,sGA,2,24,"app-chat-panel",140)(30,lGA,2,21,"app-chat-panel",141)(31,EGA,3,2)(32,hGA,7,0,"div",142)}if(t&2){let A,i=p(2);u(),H("value",i.viewMode()),u(6),Y(i.invocationIdFilterActive()?7:-1),u(),Y(i.nodePathFilterActive()?8:-1),u(),Y(i.hideIntermediateEvents()?9:-1),u(),Y(!i.invocationIdFilterActive()||!i.nodePathFilterActive()||!i.hideIntermediateEvents()?10:-1),u(),Y(i.invocationIdFilterActive()||i.nodePathFilterActive()||i.hideIntermediateEvents()?11:-1),u(3),Y(i.invocationIdFilterActive()?-1:14),u(),Y(i.nodePathFilterActive()?-1:15),u(),Y(i.hideIntermediateEvents()?-1:16),u(3),Te(i.invocationIdOptions()),u(4),Te(i.nodePathOptions()),u(3),Y(i.chatType()==="eval-result"?26:-1),u(),Y(si(28,12,i.isTokenStreamingEnabledObs)&&i.canEditSession()?27:-1),u(2),Y((A=i.chatType())==="session"?29:A==="eval-case"?30:A==="eval-result"?31:A==="file"?32:-1)}}function uGA(t,e){if(t&1&&(B(0,"div",37),Ve(1),B(2,"mat-card",117),O(3,VLA,3,3),O(4,QGA,33,14),Q()()),t&2){let A=p();u(2),RA("no-side-panel",!A.showSidePanel),u(),Y(A.selectedAppControl.value?-1:3),u(),Y(A.appName!=""?4:-1)}}function fGA(t,e){if(t&1){let A=QA();B(0,"app-agent-structure-graph-dialog",182),U("close",function(){T(A);let n=p();return J(n.showAgentStructureOverlay=!1)}),Q()}if(t&2){let A=p();H("appName",A.appName)("preloadedAppData",A.agentGraphData())("preloadedLightGraphSvg",A.agentStructureOverlayMode==="event"?A.eventGraphSvgLight:A.sessionGraphSvgLight)("preloadedDarkGraphSvg",A.agentStructureOverlayMode==="event"?A.eventGraphSvgDark:A.sessionGraphSvgDark)("startPath",A.agentStructureOverlayMode==="event"?A.selectedEventGraphPath:"")}}var pGA="root_agent",Bv="q",mGA="hideSidePanel",dF="",BF="",liA="application/json+a2ui";function EF(t){for(t=t.replace(/-/g,"+").replace(/_/g,"/");t.length%4!==0;)t+="=";return t}var hF=class t extends b1{nextPageLabel="Next Event";previousPageLabel="Previous Event";firstPageLabel="First Event";lastPageLabel="Last Event";getRangeLabel=(e,A,i)=>i===0?`Event 0 of ${i}`:(i=Math.max(i,0),`Event ${e*A+1} of ${i}`);static \u0275fac=(()=>{let e;return function(i){return(e||(e=bi(t)))(i||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac})},wGA="Restarting bidirectional streaming is not currently supported. Please refresh the page or start a new session.",Ev=class t{i18n=w(siA);sidePanelI18n=w(pQ);_snackBar=w(h2);activatedRoute=w(Vs);agentService=w($s);artifactService=w(TB);changeDetectorRef=w(wt);dialog=w(Or);document=w(ti);downloadService=w(JB);evalService=w(t0);eventService=w(o6);featureFlagService=w(yr);graphService=w(OB);localFileService=w(a6);location=w(g6);renderer=w(Pi);router=w(ls);safeValuesService=w(Cs);testsService=w(u2);sessionService=w(Al);streamChatService=w(s6);webSocketService=w(zB);audioRecordingService=w(YB);audioPlayingService=w(HB);stringToColorService=w(Q2);traceService=w(Ag);uiStateService=w(tg);agentBuilderService=w(e0);themeService=w(eg);logoComponent=w(PB,{optional:!0});chatPanel=So(hQ);canvasComponent=So.required(cQ);sideDrawer=So.required("sideDrawer");sidePanel=So.required(mQ);drawerSessionTab=So("drawerSessionTab");evalTab=So(xc);appSearchInput=So("appSearchInput");canChat=pe(()=>this.chatType()==="session");isEvalCaseEditing=bA(!1);hasEvalCaseChanged=bA(!1);isEvalEditMode=bA(!1);isBuilderMode=bA(!1);chatType=bA("session");currentEvalCaseId=null;currentEvalTimestamp=null;videoElement;currentMessage="";uiEvents=bA([]);invocationDisplayMap=pe(()=>{let e=new Map,A=1,i="";for(let n of this.uiEvents()){if(n.role==="user")if(n.text)i=n.text;else if(n.event?.content?.parts?.length){let o=n.event.content.parts.find(a=>a.text);o&&o.text&&(i=o.text)}else i="User Message";if(n.event?.invocationId){let o=n.event.invocationId;if(!e.has(o)){let a=i||"User Message";a.length>50&&(a=a.substring(0,47)+"..."),e.set(o,`#${A} (${a})`),A++}}}return e});artifacts=[];userInput="";userEditEvalCaseMessage="";userId="user";appName="";sessionId="";sessionIdOfLoadedMessages="";evalCase=null;evalCaseResult=bA(null);metricsInfo=this.evalService.metricsInfo;updatedEvalCase=null;adkVersion=bA("");versionInfo=bA(null);evalSetId="";isAudioRecording=!1;micVolume=this.audioRecordingService.volumeLevel;isVideoRecording=!1;longRunningEvents=[];functionCallEventId="";redirectUri=Dr.getBaseUrlWithoutPath();showSidePanel=window.localStorage.getItem("adk-side-panel-visible")!=="false";showBuilderAssistant=!0;showAppSelectorDrawer=!1;showSessionSelectorDrawer=!1;useSse=bA(window.localStorage.getItem("adk-use-sse")==="true");currentSessionState={};root_agent=pGA;updatedSessionState=bA(null);canEditSession=bA(!0);isViewOnlySession=bA(!1);isViewOnlyAppNameMismatch=bA(!1);isLoadedAppUnavailable=bA(!1);unavailableAppName=bA("");readonlySessionType=bA("");readonlySessionName=bA("");isSideBySide=bA(!1);expectedUiEvents=bA([]);viewMode=bA(localStorage.getItem("chat-view-mode")||"events");invocationIdFilterActive=bA(!1);nodePathFilterActive=bA(!1);invocationIdFilter=bA("");nodePathFilter=bA("");invocationIdOptions=pe(()=>{let e=new Set;for(let A of this.uiEvents())A.event?.invocationId&&e.add(A.event.invocationId);return Array.from(e)});nodePathOptions=pe(()=>{let e=new Set;for(let A of this.uiEvents()){let i=A.bareNodePath;i&&e.add(i)}return Array.from(e)});invChipMenuTrigger=So("invChipMenuTrigger");nodeChipMenuTrigger=So("nodeChipMenuTrigger");addMenuTrigger=So("addMenuTrigger");openAddFilterMenu(e){e.stopPropagation(),this.addMenuTrigger()?.openMenu()}addInvocationIdFilter(){this.invocationIdFilterActive.set(!0),setTimeout(()=>{this.invChipMenuTrigger()?.openMenu()})}addNodePathFilter(){this.nodePathFilterActive.set(!0),setTimeout(()=>{this.nodeChipMenuTrigger()?.openMenu()})}removeInvocationIdFilter(e){e.stopPropagation(),this.invocationIdFilterActive.set(!1),this.invocationIdFilter.set("")}removeNodePathFilter(e){e.stopPropagation(),this.nodePathFilterActive.set(!1),this.nodePathFilter.set("")}setInvocationIdFilter(e){this.invocationIdFilter.set(e)}setNodePathFilter(e){this.nodePathFilter.set(e)}onInvocationMenuClosed(){this.invocationIdFilter()||this.invocationIdFilterActive.set(!1)}onNodePathMenuClosed(){this.nodePathFilter()||this.nodePathFilterActive.set(!1)}clearAllFilters(e){e.stopPropagation(),this.invocationIdFilterActive()&&(this.invocationIdFilterActive.set(!1),this.invocationIdFilter.set("")),this.nodePathFilterActive()&&(this.nodePathFilterActive.set(!1),this.nodePathFilter.set("")),this.hideIntermediateEvents()&&this.toggleHideIntermediateEvents()}shouldShowEvent(e){let A=this.invocationIdFilter();if(A&&!(e.event?.invocationId||"").includes(A))return!1;let i=this.nodePathFilter();if(i&&!(e.bareNodePath||"").includes(i))return!1;if(!this.hideIntermediateEvents()||e.role==="user")return!0;if(e.event?.content!==void 0){let n=e.event.content.parts||[];if(n.length>0&&n.every(a=>a.functionCall||a.functionResponse)){if(n.some(r=>{let s=r.functionCall?.id||r.functionResponse?.id;return s&&e.event?.longRunningToolIds?.includes(s)}))return!0}else return!0}if(e.event?.output!==void 0){let n=e.event?.nodeInfo,o=!1,a=n?.outputFor;if(Array.isArray(a)?o=a.some(r=>!r.includes("/")):typeof a=="string"?o=!a.includes("/"):n?.path&&(o=!n.path.includes("/")),o)return!0}return!1}shouldShowEventFn=this.shouldShowEvent.bind(this);getMetricTooltip(e,A,i){let n=this.metricsInfo().find(g=>g.metricName===e),o=n?.description||"",a=n?.metricValueInfo?.interval?.minValue??"?",r=n?.metricValueInfo?.interval?.maxValue??"?",s=A!=null?parseFloat(A).toFixed(2):"?",l=i!=null?parseFloat(i).toFixed(2):"?";return`${o?o+" | ":""}Actual: ${s} | Threshold: ${l} | Min: ${a} | Max: ${r}`}getMetricDescription(e){return this.metricsInfo().find(i=>i.metricName===e)?.description||""}getMetricMin(e){let i=this.metricsInfo().find(n=>n.metricName===e)?.metricValueInfo?.interval?.minValue;return i!=null?i.toFixed(2):"?"}getMetricMax(e){let i=this.metricsInfo().find(n=>n.metricName===e)?.metricValueInfo?.interval?.maxValue;return i!=null?i.toFixed(2):"?"}getVersionTooltip(){let e=this.versionInfo();return e?`Version: ${e.version} | Language: ${e.language} | Language Version: ${e.language_version}`:""}getMergedTooltip(){let e=this.sidePanelI18n.disclosureTooltip||"",A=this.getVersionTooltip();return A?`${e} | ${A}`:e}filteredUiEvents=pe(()=>this.uiEvents().filter(e=>this.shouldShowEvent(e)));filteredExpectedUiEvents=pe(()=>this.expectedUiEvents().filter(e=>this.shouldShowEvent(e)));onViewModeChange(e){this.viewMode.set(e);try{localStorage.setItem("chat-view-mode",e)}catch(A){}}originalSessionId="";hideIntermediateEvents=bA(window.localStorage.getItem("adk-hide-intermediate-events")==="true");toggleHideIntermediateEvents(){let e=!this.hideIntermediateEvents();this.hideIntermediateEvents.set(e),window.localStorage.setItem("adk-hide-intermediate-events",String(e))}sessionHasUsedBidi=new Set;eventData=new Map;traceData=[];renderedEventGraph;rawSvgString=null;agentGraphData=bA(null);sessionGraphSvgLight={};sessionGraphSvgDark={};sessionGraphDot={};dynamicGraphDot={};agentReadme="";graphsAvailable=bA(!0);get hasSubWorkflows(){return Object.keys(this.sessionGraphSvgLight).length>1}selectedEvent=void 0;selectedEventIndex=void 0;selectedMessageIndex=void 0;llmRequest=void 0;llmResponse=void 0;llmRequestKey="gcp.vertex.agent.llm_request";llmResponseKey="gcp.vertex.agent.llm_response";getMediaTypeFromMimetype=X6;selectedFiles=[];MediaType=aC;selectedAppControl=new Os("",{nonNullable:!0});appDrawerSearchControl=new Os("",{nonNullable:!0});openBase64InNewTab(e,A){this.safeValuesService.openBase64InNewTab(e,A)}isLoadingApps=bA(!1);loadingError=bA("");apps$=ne([]).pipe(di(()=>{this.isLoadingApps.set(!0),this.selectedAppControl.disable()}),hi(()=>this.agentService.listApps().pipe(Po(e=>(this.loadingError.set(e.message),ne(void 0))))),uo(1),di(e=>{this.isLoadingApps.set(!1),this.selectedAppControl.enable(),e?.length==1&&this.router.navigate([],{relativeTo:this.activatedRoute,queryParams:{app:e[0]},queryParamsHandling:"merge"})}),Gs());filteredDrawerApps$=this.apps$.pipe(hi(e=>Qr([ne(e),this.appDrawerSearchControl.valueChanges.pipe(Sn(""))])),we(([e,A])=>{if(!e||!A||A.trim()==="")return e;let i=A.toLowerCase().trim();return e.filter(n=>n.toLowerCase().includes(i))}));importSessionEnabledObs=this.featureFlagService.isImportSessionEnabled();isEditFunctionArgsEnabledObs=this.featureFlagService.isEditFunctionArgsEnabled();isSessionUrlEnabledObs=this.featureFlagService.isSessionUrlEnabled();isApplicationSelectorEnabledObs=this.featureFlagService.isApplicationSelectorEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isExportSessionEnabledObs=this.featureFlagService.isExportSessionEnabled();isEventFilteringEnabled=Ar(this.featureFlagService.isEventFilteringEnabled());isApplicationSelectorEnabled=Ar(this.featureFlagService.isApplicationSelectorEnabled());isDeleteSessionEnabledObs=this.featureFlagService.isDeleteSessionEnabled();isUserIdOnToolbarEnabledObs=this.featureFlagService.isUserIdOnToolbarEnabled();isDeveloperUiDisclaimerEnabledObs=this.featureFlagService.isDeveloperUiDisclaimerEnabled();disableBuilderSwitch=!1;autoSelectLatestEvent=!1;constructor(){Ao(()=>{this.themeService.currentTheme()&&this.updateRenderedGraph()})}ngOnInit(){if(this.syncSelectedAppFromUrl(),this.updateSelectedAppUrl(),this.hideSidePanelIfNeeded(),this.agentService.getVersion().subscribe(i=>{this.adkVersion.set(i.version||""),this.versionInfo.set(i)}),Qr([this.agentService.getApp(),this.activatedRoute.queryParams]).pipe(gt(([i,n])=>!!i&&!!n[Bv]),$n(),we(([,i])=>i[Bv])).subscribe(i=>{setTimeout(()=>{this.userInput=i})}),this.streamChatService.onStreamClose().subscribe(i=>{let n=`Please check server log for full details: -`+i;this.openSnackBar(n,"OK")}),this.webSocketService.getMessages().subscribe(i=>{if(i)try{let n=JSON.parse(i);(n.interrupted||n.inputTranscription!==void 0&&n.partial)&&this.audioPlayingService.stopAudio(),this.appendEventRow(n),this.changeDetectorRef.detectChanges()}catch(n){}}),new URL(window.location.href).searchParams.has("code")){let i=window.location.href;window.opener?.postMessage({authResponseUrl:i},window.origin),window.close()}this.agentService.getApp().subscribe(i=>{this.appName=i,this.evalService.metricsInfo.set([])}),this.traceService.selectedTraceRow$.subscribe(i=>{i&&(this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0,this.showSidePanel||(this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true"),this.sideDrawer()?.open()),this.changeDetectorRef.detectChanges())}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe($n()).subscribe(i=>{i&&(this.uiStateService.onNewMessagesLoaded().subscribe(n=>{this.populateMessages(n.items,!0,!n.isBackground),this.loadTraceData()}),this.uiStateService.onNewMessagesLoadingFailed().subscribe(n=>{this.openSnackBar(n.message,"OK")}))})}get sessionTab(){return this.drawerSessionTab()}switchToTraceView(){this.onViewModeChange("traces")}ngAfterViewInit(){this.showSidePanel&&this.sideDrawer()?.open(),this.isApplicationSelectorEnabled()||this.loadSessionByUrlOrReset()}selectApp(e){if(this.isLoadedAppUnavailable.set(!1),e!=this.appName){let A=!this.appName;this.agentService.setApp(e),A?this.loadSessionByUrlOrReset():this.createSessionAndReset()}}loadSessionByUrlOrReset(){this.isSessionUrlEnabledObs.subscribe(e=>{let A=this.activatedRoute.snapshot.queryParams,i=A.session,n=A.userId,o=A.evalCase,a=A.evalResult,r=A.file;if(n&&(this.userId=n),o){this.chatType.set("eval-case");let s=o.split("/");if(s.length===2){let l=s[0],g=s[1];this.evalSetId=l,this.evalService.getEvalCase(this.appName,l,g).subscribe(C=>{C&&(this.updateWithSelectedEvalCase(C),setTimeout(()=>{let I=this.sidePanel();I.switchToEvalTab(),I.selectEvalCase(l,C)},600))})}return}if(a){this.chatType.set("eval-result");let s=a.split("/");if(console.log("loadSessionByUrlOrReset evalResultUrl parts:",s),s.length===3){let l=s[0],g=s[1],C=s[2];this.evalSetId=l;let I=`${this.appName}_${l}_${C}`;console.log("loadSessionByUrlOrReset runId:",I),this.evalService.getEvalResult(this.appName,I).subscribe(d=>{if(console.log("loadSessionByUrlOrReset runResult:",d),d){let h=d.evalCaseResults?.find(E=>E.evalId===g);if(console.log("loadSessionByUrlOrReset evalCaseResult:",h),h){let E=h.sessionId;this.evalService.getEvalCase(this.appName,l,g).subscribe(f=>{this.sessionService.getSession(this.userId,this.appName,E).subscribe(m=>{this.addEvalCaseResultToEvents(m,h);let v={id:m?.id??"",appName:m?.appName??"",userId:m?.userId??"",state:m?.state??[],events:m?.events??[],isEvalResult:!0,evalCase:f,evalCaseResult:h,timestamp:C};this.updateWithSelectedSession(v),setTimeout(()=>{let k=this.sidePanel();k.switchToEvalTab(),k.selectEvalResult(l,C,f)},600)})})}}})}return}if(r){this.chatType.set("file");return}if(!e||!i){this.chatType.set("session"),this.createSessionAndReset();return}i&&(this.chatType.set("session"),this.sessionId=i,this.loadSession(i,!0))})}loadSession(e,A=!1){this.uiStateService.setIsSessionLoading(!0),this.isViewOnlySession.set(!1),this.isViewOnlyAppNameMismatch.set(!1),Qr([this.sessionService.getSession(this.userId,this.appName,e).pipe(Po(i=>(A&&(this.openSnackBar("Cannot find specified session. Creating a new one.",void 0,3e3),this.createSessionAndReset()),ne(null)))),this.featureFlagService.isInfinityMessageScrollingEnabled()]).pipe($n()).subscribe(([i,n])=>{this.uiStateService.setIsSessionLoading(!1),i&&(n&&i.id&&this.uiStateService.lazyLoadMessages(i.id,{pageSize:100,pageToken:""}).pipe($n()).subscribe(),this.updateWithSelectedSession(i))})}hideSidePanelIfNeeded(){this.activatedRoute.queryParams.pipe(gt(e=>e[mGA]==="true"),uo(1)).subscribe(()=>{this.showSidePanel=!1,this.sideDrawer()?.close()})}createSessionAndReset(){this.resetToNewSession(),this.chatType.set("session"),this.isViewOnlySession.set(!1),this.isViewOnlyAppNameMismatch.set(!1),this.canEditSession.set(!0),this.chatPanel()?.canEditSession?.set(!0),this.eventData=new Map,this.uiEvents.set([]),this.artifacts=[],this.userInput="",this.longRunningEvents=[],this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0,this.traceService.resetTraceService()}resetToNewSession(){this.sessionId="",this.currentSessionState={},this.sessionTab?.refreshSession(),this.clearSessionUrl()}createSession(){this.uiStateService.setIsSessionListLoading(!0),this.sessionService.createSession(this.userId,this.appName).subscribe(e=>{this.currentSessionState=e.state,this.sessionId=e.id??"",this.sessionTab?.refreshSession(),this.sessionTab?.reloadSession(this.sessionId),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()})},()=>{this.uiStateService.setIsSessionListLoading(!1)})}handleChatInput(e){return lt(this,null,function*(){if(e.preventDefault(),!this.userInput.trim()&&this.selectedFiles.length<=0||e instanceof KeyboardEvent&&(e.isComposing||e.keyCode===229))return;let A={role:"user",parts:yield this.getUserMessageParts()};this.userInput="",this.selectedFiles=[];let i=this.router.parseUrl(this.location.path());i.queryParams[Bv]&&(delete i.queryParams[Bv],this.location.replaceState(i.toString())),yield this.sendMessage(A)})}ensureSessionActive(e){return lt(this,null,function*(){if(this.sessionId)return!0;try{let A="";e?.parts&&e.parts[0]?.text&&(A=e.parts[0].text,A.length>50&&(A=A.substring(0,47)+"..."));let i=A?{__session_metadata__:{displayName:A}}:void 0,n=yield J3(this.sessionService.createSession(this.userId,this.appName,i));return this.currentSessionState=n.state||i||{},this.sessionId=n.id??"",this.sessionTab?.refreshSession(),this.sessionTab?.reloadSession(this.sessionId),this.drawerSessionTab()?.refreshSession(),this.drawerSessionTab()?.reloadSession(this.sessionId),this.isSessionUrlEnabledObs.pipe($n()).subscribe(o=>{o&&this.updateSelectedSessionUrl()}),!0}catch(A){return this.openSnackBar("Failed to create session","OK"),!1}})}sendMessage(e){return lt(this,null,function*(){if(!(yield this.ensureSessionActive(e)))return;let i=e.functionCallEventId;i&&delete e.functionCallEventId;let n=`user_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,o={id:n,author:e.role||"user",content:e},a=this.buildUiEventFromEvent(o);this.uiEvents.update(s=>[...s,a]),setTimeout(()=>this.changeDetectorRef.detectChanges(),0),this.eventData.set(n,o),this.eventData=new Map(this.eventData);let r={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:e,streaming:this.useSse(),stateDelta:this.updatedSessionState()};i&&(r.functionCallEventId=i),this.submitAgentRunRequest(r),this.changeDetectorRef.detectChanges()})}submitAgentRunRequest(e){this.autoSelectLatestEvent=!0,this.agentService.runSse(e).subscribe({next:A=>lt(this,null,function*(){if(A.error){this.openSnackBar(A.error,"OK");return}this.appendEventRow(A),this.autoSelectLatestEvent&&A.id&&this.selectEvent(A.id,void 0,!1),A.actions&&(this.processActionArtifact(A),this.processActionStateDelta(A)),this.changeDetectorRef.detectChanges()}),error:A=>{console.error("Send message error:",A),this.openSnackBar(A,"OK")},complete:()=>{this.updatedSessionState()&&(this.currentSessionState=this.updatedSessionState(),this.updatedSessionState.set(null)),this.featureFlagService.isSessionReloadOnNewMessageEnabled().pipe($n()).subscribe(A=>{A&&this.sessionTab?.reloadSession(this.sessionId)}),this.loadTraceData()}})}appendEventRow(e,A=!1){if(e.inputTranscription!==void 0?e.author="user":e.outputTranscription!==void 0&&(e.author="bot"),e.errorMessage&&e.id&&!this.eventData.has(e.id)&&(this.eventData.set(e.id,e),this.eventData=new Map(this.eventData)),e.id&&!this.eventData.has(e.id)&&(this.eventData.set(e.id,e),this.eventData=new Map(this.eventData)),this.traceService.setEventData(this.eventData),e?.longRunningToolIds&&e.longRunningToolIds.length>0){let i=this.longRunningEvents.length;this.getAsyncFunctionsFromParts(e.longRunningToolIds,e.content.parts,e.invocationId),this.functionCallEventId=e.id;for(let n=i;n{this.sendOAuthResponse(o,s,this.redirectUri)}).catch(s=>{console.error("OAuth Error:",s)});break}}}if(e.partial)this.uiEvents.update(i=>{if(i.length>0){let o=i.length-1,a=i[o],r=!!(a.event?.inputTranscription||a.event?.outputTranscription),s=!!(e.inputTranscription||e.outputTranscription);if(a.event?.partial&&a.role===(e.author==="user"?"user":"bot")&&r===s){let l=this.mergePartialEvent(a,e),g=[...i];return g[o]=l,g}}let n=this.buildUiEventFromEvent(e,A);return A?[n,...i]:[...i,n]});else{let i=this.buildUiEventFromEvent(e,A);this.uiEvents.update(n=>{let o=n.findIndex(a=>a.event?.id===e.id&&e.id);if(o<0&&n.length>0){let a=e.inputTranscription!==void 0,r=e.outputTranscription!==void 0,s=e.content?.parts?.some(l=>l.thought);if(a||r||s)if(A)for(let l=0;lC.thought))){o=l;break}}}else for(let l=n.length-1;l>=0;l--){let g=n[l].event;if(g?.partial){if(a&&g.inputTranscription!==void 0){o=l;break}if(r&&g.outputTranscription!==void 0){o=l;break}if(s&&(n[l].thought||g.content?.parts?.some(C=>C.thought))){o=l;break}}}else{let l=A?0:n.length-1,g=n[l];if(g.event?.partial){let C=!!(g.event?.inputTranscription||g.event?.outputTranscription),I=!!(e.inputTranscription||e.outputTranscription);C===I&&(o=l)}}}if(o>=0){let a=[...n];return a[o]=i,a}else return A?[i,...n]:[...n,i]})}if(e.actions?.artifactDelta)for(let i in e.actions.artifactDelta)e.actions.artifactDelta.hasOwnProperty(i)&&this.renderArtifact(i,e.actions.artifactDelta[i],A)}mergePartialEvent(e,A){let i=new UB(Ye(gA({},e),{event:A})),n=A.content?.parts||[];if(this.isEventA2aResponse(A)&&(n=this.combineA2uiDataParts(n)),n=this.combineTextParts(n),n.forEach(o=>{o.text!==void 0&&o.text!==null?(i.text=(i.text||"")+o.text,o.thought&&(i.thought=!0,i.text=this.processThoughtText(i.text||""))):this.processPartIntoMessage(o,A,i)}),A.inputTranscription){let o=e.event?.inputTranscription?.text||"";i.event.inputTranscription={text:o+(A.inputTranscription.text||"")}}if(A.outputTranscription){let o=e.event?.outputTranscription?.text||"";i.event.outputTranscription={text:o+(A.outputTranscription.text||"")}}return i}getUserMessageParts(){return lt(this,null,function*(){let e=[];if(this.userInput.trim()&&e.push({text:`${this.userInput}`}),this.selectedFiles.length>0)for(let A of this.selectedFiles)e.push(yield this.localFileService.createMessagePartFromFile(A.file));return e})}processActionArtifact(e){e.actions&&e.actions.artifactDelta&&Object.keys(e.actions.artifactDelta).length>0&&(this.storeEvents(null,e),this.storeMessage(null,e,"bot"))}processActionStateDelta(e){e.actions&&e.actions.stateDelta&&Object.keys(e.actions.stateDelta).length>0&&(this.currentSessionState=gA(gA({},this.currentSessionState||{}),e.actions.stateDelta))}combineTextParts(e){let A=[],i;for(let n of e)n.text&&!n.thought?i?i.text+=n.text:(i={text:n.text},A.push(i)):(i=void 0,A.push(n));return A}isEventA2aResponse(e){return!!e?.customMetadata?.["a2a:response"]}isA2aDataPart(e){if(!e.inlineData||e.inlineData.mimeType!=="text/plain")return!1;let A=atob(EF(e.inlineData.data));return A.startsWith(dF)&&A.endsWith(BF)}isA2uiDataPart(e){let A=this.extractA2aDataPartJson(e);return A&&A.kind==="data"&&A.metadata?.mimeType===liA}extractA2aDataPartJson(e){if(!this.isA2aDataPart(e))return null;let A=atob(EF(e.inlineData.data)),i=A.substring(dF.length,A.length-BF.length),n;try{n=JSON.parse(i)}catch(o){return null}return n}combineA2uiDataParts(e){let A=[],i=[],n;for(let o of e)this.isA2uiDataPart(o)?(i.push(this.extractA2aDataPartJson(o)),n||(n={inlineData:{mimeType:"text/plain",data:o.inlineData.data}},A.push(n))):A.push(o);if(n?.inlineData){let a=dF+JSON.stringify({kind:"data",metadata:{mimeType:liA},data:i})+BF;n.inlineData.data=btoa(a)}return A}processA2uiPartIntoMessage(e){let A={};return e.a2ui.forEach(i=>{i.data.beginRendering?A.beginRendering=i.data:i.data.surfaceUpdate?A.surfaceUpdate=i.data:i.data.dataModelUpdate&&(A.dataModelUpdate=i.data)}),A}updateRedirectUri(e,A){try{let i=new URL(e);return i.searchParams.set("redirect_uri",A),i.toString()}catch(i){return console.warn("Failed to update redirect URI: ",i),e}}storeMessage(e,A,i,n,o,a=!1){if(A?.actions&&A.actions.artifactDelta)for(let s in A.actions.artifactDelta)A.actions.artifactDelta.hasOwnProperty(s)&&this.renderArtifact(s,A.actions.artifactDelta[s],a);let r={role:i,evalStatus:A?.evalStatus,failedMetric:A?.failedMetric,evalScore:A?.evalScore,evalThreshold:A?.evalThreshold,actualInvocationToolUses:A?.actualInvocationToolUses,expectedInvocationToolUses:A?.expectedInvocationToolUses,actualFinalResponse:A?.actualFinalResponse,expectedFinalResponse:A?.expectedFinalResponse,invocationIndex:n!==void 0?n:void 0,finalResponsePartIndex:o?.finalResponsePartIndex!==void 0?o.finalResponsePartIndex:void 0,toolUseIndex:o?.toolUseIndex!==void 0?o.toolUseIndex:void 0};if(e){if(e.inlineData){let s=this.formatBase64Data(e.inlineData.data,e.inlineData.mimeType);r.inlineData={displayName:e.inlineData.displayName,data:s,mimeType:e.inlineData.mimeType}}else if(e.a2ui)r.a2uiData=this.processA2uiPartIntoMessage(e);else if(e.text)r.text=e.text,r.thought=!!e.thought,A?.groundingMetadata&&A.groundingMetadata.searchEntryPoint&&A.groundingMetadata.searchEntryPoint.renderedContent&&(r.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),r.event=A;else if(e.functionCall){let s=A?.longRunningToolIds?.includes(e.functionCall.id),l=gA(gA({},e.functionCall),s&&{isLongRunning:!0,invocationId:A.invocationId,functionCallEventId:A.id,needsResponse:!0,responseStatus:"pending",userResponse:""});r.functionCalls=[l],r.event=A}else if(e.functionResponse)r.functionResponses=[e.functionResponse],r.event=A;else if(e.executableCode)r.executableCode=e.executableCode;else if(e.codeExecutionResult&&(r.codeExecutionResult=e.codeExecutionResult,A.actions&&A.actions.artifact_delta))for(let s in A.actions.artifact_delta)A.actions.artifact_delta.hasOwnProperty(s)&&this.renderArtifact(s,A.actions.artifact_delta[s],a)}e&&Object.keys(e).length>0&&(a?this.uiEvents.update(s=>[r,...s]):this.insertOrUpdateMessage(r))}insertOrUpdateMessage(e){this.uiEvents.update(A=>{if(this.useSse()&&e.text&&e.event.id&&e.role==="bot"&&A.length>0){let i=A.length-1,n=A[i];if(n.event.id===e.event.id&&n.role==="bot"){let o=[...A];return o[i]=e,o}}return[...A,e]})}formatBase64Data(e,A){let i=EF(e);return`data:${A};base64,${i}`}processPartIntoMessage(e,A,i){if(e)if(A&&(i.event=A,A.invocationIndex!==void 0&&(i.invocationIndex=A.invocationIndex),A.toolUseIndex!==void 0&&(i.toolUseIndex=A.toolUseIndex),A.finalResponsePartIndex!==void 0&&(i.finalResponsePartIndex=A.finalResponsePartIndex)),e.text)i.text=(i.text||"")+e.text,i.thought=!!e.thought,A?.groundingMetadata&&A.groundingMetadata.searchEntryPoint&&A.groundingMetadata.searchEntryPoint.renderedContent&&(i.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),A?.id&&(i.event=A);else if(e.inlineData){let n=this.formatBase64Data(e.inlineData.data,e.inlineData.mimeType),o=X6(e.inlineData.mimeType);i.inlineData={displayName:e.inlineData.displayName,data:n,mimeType:e.inlineData.mimeType,mediaType:o},i.role==="user"&&A?.id&&(i.event=A)}else if(e.functionCall){i.functionCalls||(i.functionCalls=[]);let n=A?.longRunningToolIds?.includes(e.functionCall.id),o=e.functionCall;n&&(o=Ye(gA({},e.functionCall),{isLongRunning:!0,invocationId:A.invocationId,functionCallEventId:A.id,needsResponse:!0,responseStatus:e.functionCall.responseStatus||"pending",userResponse:e.functionCall.userResponse||""}));let a=i.functionCalls.findIndex(r=>r.id===e.functionCall.id);a>=0?i.functionCalls[a]=gA(gA({},i.functionCalls[a]),o):i.functionCalls.push(o),A?.id&&(i.event=A)}else e.functionResponse?(i.functionResponses||(i.functionResponses=[]),i.functionResponses.push(e.functionResponse),A?.id&&(i.event=A)):e.executableCode?i.executableCode=e.executableCode:e.codeExecutionResult?i.codeExecutionResult=e.codeExecutionResult:e.a2ui&&(i.a2uiData=this.processA2uiPartIntoMessage(e))}handleArtifactFetchFailure(e,A,i){this.openSnackBar("Failed to fetch artifact data","OK"),e.error={errorMessage:"Failed to fetch artifact data"},this.changeDetectorRef.detectChanges(),this.artifacts=this.artifacts.filter(n=>n.id!==A||n.versionId!==i)}renderArtifact(e,A,i=!1){if(this.artifacts.some(r=>r.id===e&&r.versionId===A))return;let o=new UB({role:"bot",event:{id:"artifact-"+e},inlineData:{data:"",mimeType:"image/png"}});i?this.uiEvents.update(r=>[o,...r]):this.insertOrUpdateMessage(o);let a={id:e,versionId:A,data:"",mimeType:"image/png",mediaType:"image"};this.artifacts=[...this.artifacts,a],this.artifactService.getArtifactVersion(this.userId,this.appName,this.sessionId,e,A).subscribe({next:r=>{let{mimeType:s,data:l}=r.inlineData??{};if(!s||!l){this.handleArtifactFetchFailure(o,e,A);return}let g=this.formatBase64Data(l,s),C=X6(s),I={name:this.createDefaultArtifactName(s),data:g,mimeType:s,mediaType:C};o.inlineData=I,this.changeDetectorRef.detectChanges(),this.artifacts=this.artifacts.map(d=>d.id===e&&d.versionId===A?{id:e,versionId:A,data:g,mimeType:s,mediaType:C}:d)},error:r=>{this.handleArtifactFetchFailure(o,e,A)}})}storeEvents(e,A){let i="";e==null&&A.actions.artifactDelta?i+="eventAction: artifact":e&&(e.text?i+="text:"+e.text:e.functionCall?i+="functionCall:"+e.functionCall.name:e.functionResponse?i+="functionResponse:"+e.functionResponse.name:e.executableCode?i+="executableCode:"+e.executableCode.code.slice(0,10):e.codeExecutionResult?i+="codeExecutionResult:"+e.codeExecutionResult.outcome:e.errorMessage&&(i+="errorMessage:"+e.errorMessage)),A.title=i,this.eventData.set(A.id,A),this.eventData=new Map(this.eventData)}sendOAuthResponse(e,A,i){this.longRunningEvents.pop();var n=structuredClone(e.args.authConfig);n.exchangedAuthCredential.oauth2.authResponseUri=A,n.exchangedAuthCredential.oauth2.redirectUri=i;let o={role:"user",parts:[{functionResponse:{id:e.id,name:e.name,response:n}}],functionCallEventId:this.functionCallEventId};this.sendMessage(o)}clickEvent(e){let A=this.uiEvents()[e],i=A.event.id;if(i){if(this.selectedMessageIndex===e){this.sideDrawer()?.open(),this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true");return}if(A.role==="user"){this.selectedEvent=this.eventData.get(i),this.selectedEventIndex=this.getIndexOfKeyInMap(i),this.selectedMessageIndex=e,this.llmRequest=void 0,this.llmResponse=void 0,this.sideDrawer()?.open(),this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true"),this.updateRenderedGraph(),this.viewMode()!=="events"&&this.onViewModeChange("events");return}this.sideDrawer()?.open(),this.showSidePanel=!0,window.localStorage.setItem("adk-side-panel-visible","true"),this.selectEvent(i,e)}}handleJumpToInvocation(e){let A=this.uiEvents(),i=-1,n=-1;for(let o=0;o{this.chatPanel()?.scrollToSelectedMessage(i)},100))}ngOnDestroy(){this.streamChatService.closeStream()}onAppSelection(e){this.isAudioRecording&&(this.stopAudioRecording(),this.isAudioRecording=!1),this.isVideoRecording&&(this.stopVideoRecording(),this.isVideoRecording=!1),this.evalTab()?.resetEvalResults(),this.traceData=[]}toggleAudioRecording(e){return lt(this,null,function*(){this.isAudioRecording?this.stopAudioRecording():yield this.startAudioRecording(e)})}startAudioRecording(e){return lt(this,null,function*(){if(this.sessionId&&this.sessionHasUsedBidi.has(this.sessionId)){this.openSnackBar(wGA,"OK");return}(yield this.ensureSessionActive())&&(this.isAudioRecording=!0,this.streamChatService.startAudioChat({appName:this.appName,userId:this.userId,sessionId:this.sessionId,flags:e}),this.sessionHasUsedBidi.add(this.sessionId))})}stopAudioRecording(){this.audioPlayingService.stopAudio(),this.streamChatService.stopAudioChat(),this.isAudioRecording=!1,this.isVideoRecording&&this.stopVideoRecording()}toggleVideoRecording(){this.isVideoRecording?this.stopVideoRecording():this.startVideoRecording()}startVideoRecording(){let e=this.chatPanel()?.videoContainer;e&&(this.isVideoRecording=!0,this.streamChatService.startVideoStreaming(e))}stopVideoRecording(){let e=this.chatPanel()?.videoContainer;e&&(this.streamChatService.stopVideoStreaming(e),this.isVideoRecording=!1)}getAsyncFunctionsFromParts(e,A,i){for(let n of A)n.functionCall&&e.includes(n.functionCall.id)&&this.longRunningEvents.push({function:n.functionCall,invocationId:i})}openOAuthPopup(e){return new Promise((A,i)=>{if(!this.safeValuesService.windowOpen(window,e,"oauthPopup","width=600,height=700")){i("Popup blocked!");return}let o=a=>{if(a.origin!==window.location.origin)return;let{authResponseUrl:r}=a.data;r?(A(r),window.removeEventListener("message",o)):console.log("OAuth failed",a)};window.addEventListener("message",o)})}toggleSidePanel(){this.showSidePanel?(this.sideDrawer()?.close(),this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0):this.sideDrawer()?.open(),this.showSidePanel=!this.showSidePanel,window.localStorage.setItem("adk-side-panel-visible",this.showSidePanel.toString())}toggleAppSelectorDrawer(){this.showSessionSelectorDrawer=!1,this.showAppSelectorDrawer=!this.showAppSelectorDrawer,this.showAppSelectorDrawer&&this.appDrawerSearchControl.setValue("")}onSelectorDrawerOpened(){this.showAppSelectorDrawer&&this.appSearchInput()?.nativeElement.focus()}handleAppSearchKeydown(e){if(e.key==="ArrowDown"){e.preventDefault(),e.stopPropagation();let A=this.document.querySelector(".app-selector-list .app-selector-item");A&&A.focus()}}handleAppListKeydown(e){if(e.key!=="ArrowDown"&&e.key!=="ArrowUp")return;e.stopPropagation();let A=Array.from(this.document.querySelectorAll(".app-selector-list .app-selector-item")),i=A.indexOf(this.document.activeElement);if(i>-1){if(e.preventDefault(),e.key==="ArrowDown"){let n=i+1;n=0?A[n].focus():this.appSearchInput()?.nativeElement.focus()}}}onAppSelectorDrawerClosed(){this.showAppSelectorDrawer=!1}toggleSessionSelectorDrawer(){this.showAppSelectorDrawer=!1,this.showSessionSelectorDrawer=!this.showSessionSelectorDrawer}onSessionSelectorDrawerClosed(){this.showSessionSelectorDrawer=!1}onSelectorDrawerClosed(){this.showAppSelectorDrawer=!1,this.showSessionSelectorDrawer=!1}onSessionSelectedFromDrawer(e){this.showSessionSelectorDrawer=!1,this.loadSession(e)}onSessionReloadedFromDrawer(e){this.loadSession(e)}selectAppFromDrawer(e){this.selectedAppControl.setValue(e),this.showAppSelectorDrawer=!1}handleTabChange(e){this.canChat()||(this.resetEditEvalCaseVars(),this.handleReturnToSession(!0))}handleReturnToSession(e){this.sessionTab?.getSession(this.sessionId),this.evalTab()?.resetEvalCase(),this.chatType.set("session")}handleEvalNotInstalled(e){e&&this.openSnackBar(e,"OK")}resetEventsAndMessages({keepMessages:e}={}){e||(this.eventData.clear(),this.uiEvents.set([]),this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0),this.artifacts=[]}loadTraceData(){this.sessionId&&(this.uiStateService.setIsEventRequestResponseLoading(!0),this.eventService.getTrace(this.sessionId).pipe($n(),Po(e=>(console.error("[DEBUG] getTrace error:",e),ne([])))).subscribe(e=>{this.traceData=e,this.traceService.setEventData(this.eventData),this.traceService.setMessages(this.uiEvents()),this.selectedEvent&&this.populateLlmRequestResponse(),this.uiStateService.setIsEventRequestResponseLoading(!1),this.changeDetectorRef.detectChanges()}),this.changeDetectorRef.detectChanges())}buildUiEventFromEvent(e,A=!1){let i=this.isEventA2aResponse(e),n=i?this.combineA2uiDataParts(e.content?.parts):e.content?.parts||[],o=A?[...n].reverse():n,a=e.author==="user"?"user":"bot",r=new UB({role:a,event:e});return(e.errorCode||e.errorMessage)&&(r.error={errorCode:e.errorCode,errorMessage:e.errorMessage}),e.inputTranscription!==void 0&&typeof e.inputTranscription=="string"&&(r.event.inputTranscription={text:e.inputTranscription}),e.outputTranscription!==void 0&&typeof e.outputTranscription=="string"&&(r.event.outputTranscription={text:e.outputTranscription}),o.forEach(s=>{a==="bot"&&i&&this.isA2uiDataPart(s)&&(s={a2ui:this.extractA2aDataPartJson(s).data}),this.processPartIntoMessage(s,e,r)}),r}populateMessages(e,A=!1,i=!1){this.resetEventsAndMessages({keepMessages:i&&this.sessionIdOfLoadedMessages===this.sessionId}),e.forEach(n=>{this.appendEventRow(n,A)}),this.sessionIdOfLoadedMessages=this.sessionId}restorePendingLongRunningCalls(){let e=this.uiEvents(),A=new Set;this.uiEvents().forEach(i=>{i.functionResponses&&i.functionResponses.forEach(n=>{n.id&&A.add(n.id)})}),this.uiEvents().forEach(i=>{i.functionCalls&&i.functionCalls.forEach(n=>{let o=i.event.id?this.eventData.get(i.event.id):null;(n.isLongRunning||o?.longRunningToolIds?.includes(n.id))&&!A.has(n.id)&&(n.isLongRunning=!0,n.invocationId=o?.invocationId,n.functionCallEventId=i.event.id||"",n.needsResponse=!0,n.responseStatus="pending",n.userResponse=n.userResponse||"")})})}updateWithSelectedSession(e){if(!(!e||!e.id)){if(this.traceService.resetTraceService(),this.traceData=[],this.sessionId=e.id,this.currentSessionState=e.state||{},this.evalCase=null,this.resetEventsAndMessages(),e.isEvalResult){this.isViewOnlySession.set(!0),this.readonlySessionType.set("Eval Result");let A=e.evalCase?.evalId,i=e.timestamp;this.currentEvalCaseId=A,this.currentEvalTimestamp=i;let n=i;if(i){let o=Number(i);isNaN(o)||(n=new Date(o*1e3).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0}))}this.readonlySessionName.set(A&&n?`${n} > ${A}`:e.id),this.canEditSession.set(!1),this.chatPanel()?.canEditSession?.set(!1)}else this.isViewOnlySession.set(!1);e.evalCase?this.expectedUiEvents.set(this.buildUiEventsFromEvalCase(e.evalCase)):this.expectedUiEvents.set([]),e.evalCaseResult?this.evalCaseResult.set(e.evalCaseResult):this.evalCaseResult.set(null),e.isEvalResult?this.chatType.set("eval-result"):(this.chatType.set("session"),this.isSideBySide.set(!1)),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()}),e.events&&e.state&&(e.events.forEach(A=>{if(this.appendEventRow(A,!1),A.author!=="user"&&A.actions?.artifactDelta)for(let n in A.actions.artifactDelta)A.actions.artifactDelta.hasOwnProperty(n)&&this.renderArtifact(n,A.actions.artifactDelta[n])}),this.restorePendingLongRunningCalls()),this.changeDetectorRef.detectChanges(),this.loadTraceData(),e.isEvalResult||this.sessionService.canEdit(this.userId,e).pipe($n(),Po(()=>ne(!0))).subscribe(A=>{this.chatPanel()?.canEditSession?.set(A),this.canEditSession.set(A)}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe($n()).subscribe(A=>{A||this.populateMessages(e.events||[]),this.loadTraceData()})}}formatToolUses(e){if(!e||!Array.isArray(e))return[];let A=[];for(let i of e)A.push({name:i.name,args:i.args});return A}addEvalCaseResultToEvents(e,A){let i=A.evalMetricResultPerInvocation,n=-1;if(i)for(let o=0;o{this.appendEventRow(i,!1)}),this.canEditSession.set(!1),this.chatPanel()?.canEditSession?.set(!1),this.isViewOnlySession.set(!0),this.changeDetectorRef.detectChanges()}buildUiEventsFromEvalCase(e){let A=this.uiEvents(),i=this.eventData,n=this.chatType(),o=this.isViewOnlySession(),a=this.readonlySessionType(),r=this.readonlySessionName();this.uiEvents.set([]),this.eventData=new Map,this.updateWithSelectedEvalCase(e);let s=this.uiEvents();return this.uiEvents.set(A),this.eventData=i,this.chatType.set(n),this.isViewOnlySession.set(o),this.readonlySessionType.set(a),this.readonlySessionName.set(r),s}updateWithSelectedEvalCase(e){if(this.evalCase=e,this.chatType.set("eval-case"),this.isViewOnlySession.set(!0),this.readonlySessionType.set("Eval Case"),this.readonlySessionName.set(e.evalId),this.chatType.set("eval-case"),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()}),this.resetEventsAndMessages(),e.events&&e.events.length>0)for(let A of e.events)this.appendEventRow(A,!1);else{e.events=[];let A=0;for(let i of e.conversation){if(i.userContent?.parts&&e.events.push({author:"user",content:i.userContent,invocationIndex:A}),i.intermediateData?.invocationEvents){let n=0;for(let o of i.intermediateData.invocationEvents)o.invocationIndex=A,o.content?.parts?.[0]?.functionCall&&(o.toolUseIndex=n,n++),e.events.push(o)}else if(i.intermediateData?.toolUses){let n=0;for(let o of i.intermediateData.toolUses)e.events.push({author:"bot",content:{parts:[{functionCall:{name:o.name,args:o.args}}]},invocationIndex:A,toolUseIndex:n}),n++,e.events.push({author:"bot",content:{parts:[{functionResponse:{name:o.name}}]},invocationIndex:A})}i.finalResponse?.parts&&e.events.push({author:"bot",content:i.finalResponse,invocationIndex:A}),A++}for(let i of e.events)this.appendEventRow(i,!1)}}handleEditEvalCaseRequested(e){this.updateWithSelectedEvalCase(e),this.editEvalCase()}updateSelectedEvalSetId(e){this.evalSetId=e}editEvalCaseMessage(e){this.isEvalCaseEditing.set(!0),this.userEditEvalCaseMessage=e.text,e.isEditing=!0,setTimeout(()=>{let A=this.chatPanel()?.textarea?.nativeElement;if(!A)return;A.focus();let i=A.value.length;e.text.charAt(i-1)===` -`&&i--,A.setSelectionRange(i,i)},0)}editFunctionArgs(e){this.isEvalCaseEditing.set(!0),this.dialog.open(S3,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Edit function arguments",functionName:e.functionCall.name,jsonContent:e.functionCall.args}}).afterClosed().subscribe(i=>{this.isEvalCaseEditing.set(!1),i&&(this.hasEvalCaseChanged.set(!0),e.functionCall.args=i,this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].intermediateData.toolUses[e.toolUseIndex].args=i)})}saveEvalCase(){this.evalService.updateEvalCase(this.appName,this.evalSetId,this.updatedEvalCase.evalId,this.updatedEvalCase).subscribe(e=>{this.openSnackBar("Eval case updated","OK"),this.resetEditEvalCaseVars()})}cancelEditEvalCase(){this.resetEditEvalCaseVars(),this.updateWithSelectedEvalCase(this.evalCase)}resetEditEvalCaseVars(){this.hasEvalCaseChanged.set(!1),this.isEvalCaseEditing.set(!1),this.isEvalEditMode.set(!1),this.updatedEvalCase=null}cancelEditMessage(e){e.isEditing=!1,this.isEvalCaseEditing.set(!1)}saveEditMessage(e){this.hasEvalCaseChanged.set(!0),this.isEvalCaseEditing.set(!1),e.isEditing=!1,e.text=this.userEditEvalCaseMessage?this.userEditEvalCaseMessage:" ",this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts[e.finalResponsePartIndex]={text:this.userEditEvalCaseMessage},this.userEditEvalCaseMessage=""}handleKeydown(e,A){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),this.saveEditMessage(A)):e.key==="Escape"&&this.cancelEditMessage(A)}deleteEvalCaseMessage(e,A){this.hasEvalCaseChanged.set(!0),this.uiEvents.update(i=>i.filter((n,o)=>o!==A)),this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts.splice(e.finalResponsePartIndex,1)}editEvalCase(){this.isEvalEditMode.set(!0),this.isViewOnlySession.set(!1)}deleteEvalCase(){let e={title:"Confirm delete",message:`Are you sure you want to delete ${this.evalCase.evalId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(kc,{width:"600px",data:e}).afterClosed().subscribe(i=>{i&&(this.evalTab()?.deleteEvalCase(this.evalCase.evalId),this.openSnackBar("Eval case deleted","OK"))})}onNewSessionClick(){this.resetToNewSession(),this.eventData.clear(),this.uiEvents.set([]),this.artifacts=[],this.traceData=[],this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0,this.traceService.resetTraceService(),this.chatPanel()?.focusInput(),this.evalTab()?.showEvalHistory&&this.evalTab()?.toggleEvalHistoryButton()}getToolbarSessionId(){if(!this.sessionId)return"NEW SESSION";if(this.isViewOnlySession())return this.sessionId;let e=this.currentSessionState?.__session_metadata__;return e?.displayName?`[${this.sessionId.substring(0,4)}] ${e.displayName}`:this.sessionId}getCurrentSessionDisplayName(){return this.sessionId?this.currentSessionState?.__session_metadata__?.displayName||this.sessionId:"NEW SESSION"}copySessionId(){return lt(this,null,function*(){if(this.sessionId)try{yield navigator.clipboard.writeText(this.sessionId),this.openSnackBar(this.i18n.sessionIdCopiedMessage,"OK")}catch(e){this.openSnackBar(this.i18n.copySessionIdFailedMessage,"OK")}})}saveSessionName(e){if(!this.sessionId)return;let A={__session_metadata__:Ye(gA({},this.currentSessionState?.__session_metadata__||{}),{displayName:e})};this.currentSessionState=gA(gA({},this.currentSessionState),A),this.updatedSessionState.set(gA(gA({},this.updatedSessionState()),A)),this.sessionService.updateSession(this.userId,this.appName,this.sessionId,{stateDelta:A}).subscribe({next:()=>{this.sessionTab&&this.sessionTab.reloadSession(this.sessionId),this.drawerSessionTab()&&this.drawerSessionTab().reloadSession(this.sessionId)}})}get sessionDisplayNameDraft(){return this.currentSessionState?.__session_metadata__?.displayName||""}saveUserId(e){if(e=e.trim(),!e){this.openSnackBar(this.i18n.invalidUserIdMessage,"OK");return}this.userId=e,this.isSessionUrlEnabledObs.pipe(uo(1)).subscribe(A=>{A&&this.updateSelectedSessionUrl()})}onFileSelect(e){let A=e.target;if(A.files)for(let i=0;i{e&&this.canvasComponent()?.loadFromYaml(e,this.appName)},error:e=>{console.error("Error loading agent configuration:",e),this._snackBar.open("Error loading agent configuration","OK")}})}exitBuilderMode(){let e=this.router.createUrlTree([],{queryParams:{mode:null},queryParamsHandling:"merge"}).toString();this.location.replaceState(e),this.isBuilderMode.set(!1),this.agentBuilderService.clear()}toggleBuilderAssistant(){this.showBuilderAssistant=!this.showBuilderAssistant}openAddItemDialog(){this.apps$.pipe(uo(1)).subscribe(e=>{let A=this.dialog.open(j6,{width:"600px",data:{existingAppNames:e??[]}})})}eventGraphSvgLight={};eventGraphSvgDark={};selectedEventGraphPath="";showAgentStructureOverlay=!1;agentStructureOverlayMode="session";openAgentStructureGraphDialog(e="session"){this.agentStructureOverlayMode=e,this.showAgentStructureOverlay=!0}saveAgentBuilder(){this.canvasComponent()?.saveAgent(this.appName)}onEventTabDrillDown(e){this.updateRenderedGraph(void 0,e)}updateRenderedGraph(e,A){return lt(this,null,function*(){let i=this.sessionGraphSvgLight,n=this.sessionGraphSvgDark;if(Object.keys(i).length===0||Object.keys(n).length===0){this.renderedEventGraph=void 0;return}let o=e||this.selectedEvent?.nodeInfo?.path;!e&&this.selectedEvent?.author==="user"&&(o="__START__");let a=o;o&&o!=="__START__"&&(a=o.split("/").map(m=>m.split("@")[0]).join("/"));let r=A!==void 0?A:"",s="";if(a&&A===void 0){let m=a.split("/");if(s=m[m.length-1],m.length>=2&&m[m.length-1]==="call_llm"&&m[m.length-2]===this.selectedEvent?.author?(s=m[m.length-2],r=m.slice(1,-2).join("/")):r=m.slice(1,-1).join("/"),r&&!(r in i&&!(r in this.dynamicGraphDot))){let k=this.tryGenerateDynamicGraph(r);if(k&&this.dynamicGraphDot[r]!==k)try{let S=yield this.graphService.render(k);this.sessionGraphSvgLight[r]=S,this.sessionGraphSvgDark[r]=S,this.dynamicGraphDot[r]=k}catch(S){console.error("Failed to render dynamic graph",S)}}for(;r&&!(r in i);){let v=r.split("/");v.pop(),r=v.join("/")}}let l=this.sessionGraphDot[r]||this.sessionGraphDot[""]||"",g=l,C=!1;if(this.selectedEvent){let m=this.getV1HighlightPairs(this.selectedEvent);for(let[v,k]of m)if(v&&k&&k===this.selectedEvent.author){let S=new RegExp(`("${k}"|${k})\\s*->\\s*("${v}"|${v})`,"g");S.test(l)&&(g=l.replace(S,"$& [dir=back]"),C=!0)}}let I="",d="";if(C)try{I=yield this.graphService.render(g),d=I}catch(m){console.error("Failed to render modified graph",m),I=i[r]||i[""]||"",d=n[r]||n[""]||""}else I=i[r]||i[""]||"",d=n[r]||n[""]||"";if(this.selectedEvent){let m=this.getV1HighlightPairs(this.selectedEvent);m.length>0&&(I=this.applyV1Highlighting(I,m,!1),d=this.applyV1Highlighting(d,m,!0))}let h=[],E=[];if(this.selectedEventIndex!==void 0){let m=Array.from(this.eventData.values()),k=m[this.selectedEventIndex]?.invocationId;for(let S=0;Sz.split("@")[0]).join("/")),F){let z=F.split("/"),P=z[z.length-1],Z="";z.length>=2&&z[z.length-1]==="call_llm"&&z[z.length-2]===b.author?(P=z[z.length-2],Z=z.slice(1,-2).join("/")):Z=z.slice(1,-1).join("/");let tA=r in this.dynamicGraphDot,W=x?x.split("/"):[],BA=W.length>0?W[W.length-1]:"",X=tA?BA:P;Z===r&&(S<=this.selectedEventIndex&&(h.length===0||h[h.length-1]!==X)&&h.push(X),(E.length===0||E[E.length-1]!==X)&&E.push(X))}}}if(this.selectedEvent){let m=this.getV1HighlightPairs(this.selectedEvent);for(let[v,k]of m)k&&k!==""&&(E.includes(k)||E.push(k),h.includes(k)||h.push(k)),v&&v!==""&&(E.includes(v)||E.push(v),h.includes(v)||h.push(v))}E.length>0&&I&&d&&(I=this.highlightExecutionPathInSvg(I,h,E,"light"),d=this.highlightExecutionPathInSvg(d,h,E,"dark")),this.selectedEventGraphPath=r,this.eventGraphSvgLight=Ye(gA({},i),{[r]:I}),this.eventGraphSvgDark=Ye(gA({},n),{[r]:d});let f=this.themeService.currentTheme()==="dark"?d:I;this.rawSvgString=f,this.renderedEventGraph=this.safeValuesService.bypassSecurityTrustHtml(f),this.changeDetectorRef.detectChanges()})}tryGenerateDynamicGraph(e){let A=Array.from(this.eventData.values()),i=[];for(let l of A){let g=l.nodeInfo?.path;if(!g)continue;let C=g.split("/"),I=C.map(h=>h.split("@")[0]),d="";if(I.length>=2&&I[I.length-1]==="call_llm"&&I[I.length-2]===l.author?d=I.slice(1,-2).join("/"):d=I.slice(1,-1).join("/"),d===e){let h=C[C.length-1];i.push({run:h,branch:l.branch})}}if(i.length===0)return null;let n=new Set,o=new Map;for(let l of i)n.add(l.run),l.branch&&o.set(l.run,l.branch);if(n.size===0)return null;let a=`digraph G { -`;a+=` rankdir=TB; -`,a+=` node [shape=box, style=filled, fillcolor="#e6f4ea", color="#34a853"]; -`,a+=` "START" [shape=ellipse, style=filled, fillcolor="#fce8e6", color="#ea4335"]; -`;let r=new Map;for(let l of n){let g=l.split("@")[0];r.has(g)||r.set(g,[]),r.get(g).push(l)}for(let[l,g]of Array.from(r.entries())){a+=` subgraph cluster_${l} { -`,a+=` label="${l}"; -`,a+=` style=dashed; -`,a+=` color="#b0b0b0"; -`;for(let C of g){let I=C.split("@")[1]||"";a+=` "${C}" [label="@${I}"]; -`}a+=` } -`}let s=new Set;for(let l of n){let g=o.get(l);if(g){let C=g.split(".");if(C.length>=2){let I=C[C.length-2],d=C[C.length-1];s.add(`"${I}" -> "${d}"`)}else C.length===1&&s.add(`"START" -> "${C[0]}"`)}else s.add(`"START" -> "${l}"`)}for(let l of s)a+=` ${l}; -`;return a+="}",a}highlightExecutionPathInSvg(e,A,i,n="light"){if(!i||i.length===0)return e;let a=new DOMParser().parseFromString(e,"image/svg+xml"),r=new Map,s=new Map,l=a.querySelectorAll("g.edge");l.forEach(Z=>{let W=Z.querySelector("title")?.textContent?.trim()||"";if(W.includes("->")){let BA=W.split("->"),X=BA[0].trim().replace(/^"|"$/g,""),iA=BA[1].trim().replace(/^"|"$/g,"");r.has(iA)||r.set(iA,[]),r.get(iA).push(X),s.has(X)||s.set(X,[]),s.get(X).push(iA)}});let g=new Map,C=a.querySelectorAll("g.node");C.forEach(Z=>{let W=Array.from(Z.querySelectorAll("text")).map(AA=>AA.textContent?.trim()||"").join(""),X=Z.querySelector("title")?.textContent?.trim()||"",iA=X.replace(/^"|"$/g,"");g.set(W,iA),X&&g.set(X,iA)});let I=Z=>{let tA=Z.toLowerCase();for(let[W,BA]of g.entries()){let X=W.toLowerCase().replace(/\s+/g,"_");if(X===tA||X===`"${tA}"`)return BA}for(let[W,BA]of g.entries())if(W.toLowerCase().replace(/\s+/g,"_").includes(tA))return BA;return null},d=A.map(Z=>I(Z)).filter(Z=>Z),h=i.map(Z=>I(Z)).filter(Z=>Z),{visitedNodes:E,visitedEdges:f}=this.calculateVisitedPath(d,r),{visitedNodes:m}=this.calculateVisitedPath(h,r),v=this.calculateEdgeCounts(d,E,f,s),k=n==="dark"?"#34a853":"#a1c2a1",S=n==="dark"?"#ceead6":"#0d652d",b=n==="dark"?"#137333":"#a6d8b5",x=n==="dark"?"#34a853":"#a1c2a1",F=n==="dark"?"#0d652d":"#e6f4ea",z=null,P=d[d.length-1];if(d.length>0&&P){let Z=[...d],tA=Array.from(E).find(BA=>BA.toLowerCase()==="__start__");Z.length>0&&Z[0].toLowerCase()!=="__start__"&&tA&&Z.unshift(tA);let W=Z.lastIndexOf(P);if(W>0){let BA=Z[W-1],X=Z[W],iA=[],AA=new Set,IA=s.get(BA)||[];for(let aA of IA){let rA=`${BA}->${aA}`;f.has(rA)&&(iA.push({node:aA,path:[rA]}),AA.add(aA))}for(;iA.length>0;){let aA=iA.shift();if(aA.node===X){aA.path.length>0&&(z=aA.path[aA.path.length-1]);break}let rA=s.get(aA.node)||[];for(let uA of rA){let UA=`${aA.node}->${uA}`;f.has(UA)&&!AA.has(uA)&&(AA.add(uA),iA.push({node:uA,path:[...aA.path,UA]}))}}}}return l.forEach(Z=>{let W=Z.querySelector("title")?.textContent?.trim()||"";if(W.includes("->")){let BA=W.split("->"),X=BA[0].trim().replace(/^"|"$/g,""),iA=BA[1].trim().replace(/^"|"$/g,""),AA=`${X}->${iA}`;if(f.has(AA)){let IA=AA===z,aA=Z.querySelector("path");aA&&(aA.setAttribute("stroke",IA?S:k),aA.setAttribute("stroke-width",IA?"4":"2"));let rA=Z.querySelector("polygon");rA&&(rA.setAttribute("fill",IA?S:k),rA.setAttribute("stroke",IA?S:k));let uA=v.get(AA)||0;if(uA>1){let UA=Z.querySelector("text");if(UA)UA.textContent=`${UA.textContent} (${uA}x)`,UA.setAttribute("fill",n==="dark"?"#ffffff":"#000000"),UA.setAttribute("font-weight","bold");else if(aA){let zA=[...(aA.getAttribute("d")||"").matchAll(/[-+]?[0-9]*\.?[0-9]+/g)];if(zA.length>=4){let pA=zA.map(XA=>parseFloat(XA[0])),PA=(pA[0]+pA[pA.length-2])/2,Je=(pA[1]+pA[pA.length-1])/2,_e=a.createElementNS("http://www.w3.org/2000/svg","g"),YA=a.createElementNS("http://www.w3.org/2000/svg","rect");YA.setAttribute("x",(PA-14).toString()),YA.setAttribute("y",(Je-10).toString()),YA.setAttribute("width","28"),YA.setAttribute("height","20"),YA.setAttribute("rx","4"),YA.setAttribute("fill",n==="dark"?"#0d652d":"#e6f4ea"),YA.setAttribute("stroke",k),YA.setAttribute("stroke-width","1"),_e.appendChild(YA);let fA=a.createElementNS("http://www.w3.org/2000/svg","text");fA.setAttribute("x",PA.toString()),fA.setAttribute("y",(Je+4).toString()),fA.setAttribute("text-anchor","middle"),fA.setAttribute("fill",n==="dark"?"#ffffff":"#000000"),fA.setAttribute("font-size","12px"),fA.setAttribute("font-weight","bold"),fA.textContent=uA.toString()+"x",_e.appendChild(fA),Z.appendChild(_e)}}}}}}),C.forEach(Z=>{let tA=Z.querySelector("title"),W=tA?.textContent?.trim().replace(/^"|"$/g,"")||"";if(E.has(W)){let BA=Z.querySelector("ellipse, polygon, path, rect");if(BA){let X=W===P||W.toLowerCase()==="__end__";BA.setAttribute("stroke",X?S:x),BA.setAttribute("fill",X?b:F),BA.setAttribute("stroke-width",X?"4":"2")}}if(!m.has(W)){Z.classList.add("unvisited-node");let BA=Z.querySelector("ellipse, polygon, path, rect");if(BA){BA.setAttribute("stroke",n==="dark"?"#666666":"#b0b0b0"),BA.setAttribute("fill",n==="dark"?"#424242":"#e0e0e0");let AA=a.createElementNS("http://www.w3.org/2000/svg","title");AA.textContent="Not run in this invocation",BA.appendChild(AA)}if(Z.querySelectorAll("text").forEach(AA=>{AA.setAttribute("fill",n==="dark"?"#888888":"#757575");let IA=a.createElementNS("http://www.w3.org/2000/svg","title");IA.textContent="Not run in this invocation",AA.appendChild(IA)}),tA)tA.textContent="Not run in this invocation";else{let AA=a.createElementNS("http://www.w3.org/2000/svg","title");AA.textContent="Not run in this invocation",Z.appendChild(AA)}Z.querySelectorAll("a").forEach(AA=>{AA.setAttribute("title","Not run in this invocation"),AA.setAttributeNS("http://www.w3.org/1999/xlink","title","Not run in this invocation")})}}),new XMLSerializer().serializeToString(a)}getV1HighlightPairs(e){let A=[],i=e.content?.parts?.filter(o=>o.functionCall)||[],n=e.content?.parts?.filter(o=>o.functionResponse)||[];if(i.length>0)for(let o of i)o.functionCall?.name&&e.author&&A.push([e.author,o.functionCall.name]);else if(n.length>0)for(let o of n)o.functionResponse?.name&&e.author&&A.push([o.functionResponse.name,e.author]);else e.author&&A.push([e.author,""]);return A}applyV1Highlighting(e,A,i){let o=new DOMParser().parseFromString(e,"image/svg+xml"),a="#0F5223",r="#69CB87",s=i?"#cccccc":"#000000",l=new Set;for(let[I,d]of A)I&&l.add(I),d&&l.add(d);return o.querySelectorAll("g.node").forEach(I=>{let h=I.querySelector("title")?.textContent?.trim().replace(/^"|"$/g,"")||"",E=Array.from(I.querySelectorAll("text")),f=E.map(v=>v.textContent?.trim()||"").join("").toLowerCase().replace(/\s+/g,"_"),m=l.has(h);if(!m)for(let v of l){let k=v.toLowerCase().replace(/\s+/g,"_");if(f.includes(k)){m=!0;break}}if(m){let v=I.querySelector("ellipse, polygon, path, rect");v&&(v.setAttribute("fill",a),v.setAttribute("stroke",a)),E.forEach(k=>k.setAttribute("fill",s))}else E.forEach(v=>v.setAttribute("fill",s))}),o.querySelectorAll("g.edge").forEach(I=>{let h=I.querySelector("title")?.textContent?.trim()||"";if(h.includes("->")){let[E,f]=h.split("->"),m=E.trim().replace(/^"|"$/g,""),v=f.trim().replace(/^"|"$/g,"");for(let[k,S]of A)if(m===k&&v===S||m===S&&v===k){let b=I.querySelector("path");b&&b.setAttribute("stroke",r);let x=I.querySelector("polygon");x&&(x.setAttribute("stroke",r),x.setAttribute("fill",r));break}}}),new XMLSerializer().serializeToString(o)}calculateVisitedPath(e,A){let i=new Set(e),n=!0;for(;n;){n=!1;let a=Array.from(i);for(let r of a){let s=A.get(r)||[];if(s.length===1){let l=s[0];i.has(l)||(i.add(l),n=!0)}}}for(let[a,r]of A.entries())if(a.toLowerCase()==="__end__"){for(let s of r)if(i.has(s)){i.add(a);break}}let o=new Set;for(let a of i){if(a==="__start__")continue;let r=A.get(a)||[];if(r.length===1)o.add(`${r[0]}->${a}`);else if(r.length>1)for(let s of r)(i.has(s)||s==="__start__")&&o.add(`${s}->${a}`)}return{visitedNodes:i,visitedEdges:o}}calculateEdgeCounts(e,A,i,n){let o=new Map,a=[...e],r=Array.from(A).find(l=>l.toLowerCase()==="__start__"),s=Array.from(A).find(l=>l.toLowerCase()==="__end__");a.length>0&&a[0].toLowerCase()!=="__start__"&&r&&a.unshift(r),a.length>0&&s&&a[a.length-1].toLowerCase()!=="__end__"&&a.push(s);for(let l=0;l${f}`;i.has(m)&&(d.push({node:f,path:[m]}),h.add(f))}for(;d.length>0;){let f=d.shift();if(f.node===C){I=f.path;break}let m=n.get(f.node)||[];for(let v of m){let k=`${f.node}->${v}`;i.has(k)&&!h.has(v)&&(h.add(v),d.push({node:v,path:[...f.path,k]}))}}if(I)for(let f of I)o.set(f,(o.get(f)||0)+1)}return o}selectEvent(e,A,i=!0){i&&(this.autoSelectLatestEvent=!1),this.traceService.selectedRow(void 0),this.selectedEvent=this.eventData.get(e),this.selectedEventIndex=this.getIndexOfKeyInMap(e),this.selectedMessageIndex=A!==void 0?A:this.uiEvents().findIndex(n=>n.event.id===e),this.viewMode()!=="events"&&this.onViewModeChange("events"),this.chatPanel()?.scrollToSelectedMessage(this.selectedMessageIndex),this.populateLlmRequestResponse(),this.updateRenderedGraph()}populateLlmRequestResponse(){if(this.llmRequest=void 0,this.llmResponse=void 0,!this.selectedEvent)return;let e=this.traceData?.find(A=>A?.attributes?.["gcp.vertex.agent.event_id"]===this.selectedEvent.id&&A?.name==="call_llm");if(e){let A=e.attributes?.[this.llmRequestKey],i=e.attributes?.[this.llmResponseKey];if(A)try{this.llmRequest=typeof A=="string"?JSON.parse(A):A}catch(n){console.warn("Failed to parse LLM request",n)}if(i)try{this.llmResponse=typeof i=="string"?JSON.parse(i):i}catch(n){console.warn("Failed to parse LLM response",n)}}}deleteSession(e){let A={title:"Confirm delete",message:`Are you sure you want to delete this session ${this.sessionId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(kc,{width:"600px",data:A}).afterClosed().subscribe(n=>{n&&this.sessionService.deleteSession(this.userId,this.appName,e).subscribe(o=>{let a=this.sessionTab?.refreshSession(e);a?this.sessionTab?.getSession(a.id):window.location.reload()})})}syncSelectedAppFromUrl(){let e=this.activatedRoute.snapshot.queryParams.app;e&&(this.selectedAppControl.setValue(e,{emitEvent:!1}),this.selectApp(e)),Qr([this.activatedRoute.queryParams,this.apps$]).subscribe(([A,i])=>{let n=A.app;if(i&&i.length&&n){if(!i.includes(n)){this.openSnackBar(`Agent '${n}' not found`,"OK");return}n!==this.appName&&(this.selectedAppControl.setValue(n,{emitEvent:!1}),this.selectApp(n)),this.agentService.getAppInfo(n).subscribe(o=>{setTimeout(()=>{this.agentGraphData.set(o),this.agentReadme=o?.readme||""})}),this.sessionGraphSvgLight={},this.sessionGraphSvgDark={},this.dynamicGraphDot={},setTimeout(()=>this.graphsAvailable.set(!0)),this.agentService.getAppGraphImage(n,!1).pipe(Po(o=>(console.error("Error fetching light mode graphs:",o),this.graphsAvailable.set(!1),ne(null)))).subscribe({next:o=>lt(this,null,function*(){try{if(o){console.log("Light mode graph response:",o),this.sessionGraphSvgLight={},this.dynamicGraphDot={};for(let[a,r]of Object.entries(o))if(r?.dotSrc){let l=a.split("/").map(C=>C.split("@")[0]).join("/").split("/"),g=l.length>1?l.slice(1).join("/"):l[0]==="root_agent"||l[0]===n?"":l[0];this.sessionGraphDot[g]=r.dotSrc,this.sessionGraphSvgLight[g]=yield this.graphService.render(r.dotSrc)}console.log("sessionGraphSvgLight after rendering:",Object.keys(this.sessionGraphSvgLight)),console.log("graphsAvailable:",this.graphsAvailable()),this.selectedEvent&&this.selectedEventIndex!==void 0&&this.updateRenderedGraph()}}catch(a){console.error("Error rendering light mode graphs:",a),setTimeout(()=>this.graphsAvailable.set(!1))}}),error:o=>{console.error("Error fetching light mode graphs:",o),setTimeout(()=>this.graphsAvailable.set(!1))}}),this.agentService.getAppGraphImage(n,!0).pipe(Po(o=>(console.error("Error fetching dark mode graphs:",o),ne(null)))).subscribe({next:o=>lt(this,null,function*(){try{if(o){this.sessionGraphSvgDark={};for(let[a,r]of Object.entries(o))if(r?.dotSrc){let l=a.split("/").map(C=>C.split("@")[0]).join("/").split("/"),g=l.length>1?l.slice(1).join("/"):l[0]==="root_agent"||l[0]===n?"":l[0];this.sessionGraphSvgDark[g]=yield this.graphService.render(r.dotSrc)}this.selectedEvent&&this.selectedEventIndex!==void 0&&this.updateRenderedGraph()}}catch(a){console.error("Error rendering dark mode graphs:",a),setTimeout(()=>this.graphsAvailable.set(!1))}}),error:o=>{console.error("Error fetching dark mode graphs:",o),setTimeout(()=>this.graphsAvailable.set(!1))}}),this.agentService.getAgentBuilder(n).pipe(Po(o=>(setTimeout(()=>this.disableBuilderSwitch=!0),this.agentBuilderService.setLoadedAgentData(void 0),ne("")))).subscribe(o=>{!o||o==""?(setTimeout(()=>this.disableBuilderSwitch=!0),this.agentBuilderService.setLoadedAgentData(void 0)):(setTimeout(()=>this.disableBuilderSwitch=!1),this.agentBuilderService.setLoadedAgentData(o))}),this.isBuilderMode.set(!1)}A.mode==="builder"&&this.enterBuilderMode()})}updateSelectedAppUrl(){this.selectedAppControl.valueChanges.pipe(kg(),gt(Boolean)).subscribe(e=>{this.selectApp(e);let A=this.activatedRoute.snapshot.queryParams.app;e!==A&&this.router.navigate([],{queryParams:{app:e,mode:null},queryParamsHandling:"merge"})})}updateSelectedSessionUrl(){let e=this.chatType(),A={userId:this.userId};switch(A.session=null,A.evalCase=null,A.evalResult=null,A.file=null,e){case"session":A.session=this.sessionId;break;case"eval-case":A.evalCase=`${this.evalSetId}/${this.evalCase?.evalId}`;break;case"eval-result":A.evalResult=`${this.evalSetId}/${this.currentEvalCaseId}/${this.currentEvalTimestamp}`;break;case"file":A.file=this.readonlySessionName();break}let i=this.router.createUrlTree([],{queryParams:A,queryParamsHandling:"merge"}).toString();this.location.replaceState(i)}clearSessionUrl(){this.isSessionUrlEnabledObs.pipe($n()).subscribe(e=>{if(e){let A=this.router.createUrlTree([],{queryParams:{session:null},queryParamsHandling:"merge"}).toString();this.location.replaceState(A)}})}handlePageEvent(e){if(e.pageIndex>=0){let A=this.getKeyAtIndexInMap(e.pageIndex);A&&(this.selectEvent(A),setTimeout(()=>{let i=this.uiEvents().findIndex(n=>n.event.id===A);if(i!==-1){let n=this.chatPanel()?.scrollContainer?.nativeElement;if(!n)return;let o=n.querySelectorAll(".message-row-container");o&&o[i]&&o[i].scrollIntoView({behavior:"smooth",block:"nearest",inline:"nearest"})}},0))}}closeSelectedEvent(){this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0}handleEscapeKey(e){e.key==="Escape"&&this.selectedEvent&&(e.preventDefault(),this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.selectedMessageIndex=void 0)}getIndexOfKeyInMap(e){let A=0,i=(o,a)=>0,n=Array.from(this.eventData.keys()).sort(i);for(let o of n){if(o===e)return A;A++}}getKeyAtIndexInMap(e){let A=(n,o)=>0,i=Array.from(this.eventData.keys()).sort(A);if(e>=0&&e{console.log(e);let i=(e.state?.__session_metadata__||this.currentSessionState?.__session_metadata__)?.displayName,n=i&&i.trim()?`${i.trim().replace(/[/\\?%*:|"<>]/g,"_")}.json`:`session-${this.sessionId}.json`;this.downloadService.downloadObjectAsJson(e,n)})}updateState(){this.dialog.open(S3,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Update state",jsonContent:this.currentSessionState}}).afterClosed().subscribe(A=>{A&&this.updatedSessionState.set(A)})}removeStateUpdate(){this.updatedSessionState.set(null)}importSession(){let e=document.createElement("input");e.type="file",e.accept="application/json",e.onchange=()=>{if(!e.files||e.files.length===0)return;let A=e.files[0],i=new FileReader;i.onload=n=>{if(n.target?.result)try{let o=JSON.parse(n.target.result);if(!o.events||o.events.length===0){this.openSnackBar("Invalid session file: no events found","OK");return}if(o.appName&&o.appName!==this.appName){let a={title:"App name mismatch",message:`The session file was exported from app "${o.appName}" but the current app is "${this.appName}". Do you want to import it anyway?`,confirmButtonText:"Import",cancelButtonText:"Cancel"};this.dialog.open(kc,{width:"600px",data:a}).afterClosed().subscribe(s=>{s&&this.doImportSession(o)})}else this.doImportSession(o)}catch(o){this.openSnackBar("Error parsing session file","OK")}},i.readAsText(A)},e.click()}viewSession(){let e=document.createElement("input");e.type="file",e.accept="application/json",e.onchange=()=>{if(!e.files||e.files.length===0)return;let A=e.files[0],i=new FileReader;i.onload=n=>{if(n.target?.result)try{let o=JSON.parse(n.target.result);if(!o.events||o.events.length===0){this.openSnackBar("Invalid session file: no events found","OK");return}this.doViewSession(o,A.name)}catch(o){this.openSnackBar("Error parsing session file","OK")}},i.readAsText(A)},e.click()}doViewSession(e,A){let i=e.appName;i&&i!==this.appName?this.apps$.pipe(uo(1)).subscribe(n=>{n?.includes(i)?this.router.navigate([],{queryParams:{app:i},queryParamsHandling:"merge"}).then(()=>{this.openSnackBar(`Switched to app '${i}'`,"OK"),this.performViewSessionLoading(e,A)}):(this.isLoadedAppUnavailable.set(!0),this.unavailableAppName.set(i),this.performViewSessionLoading(e,A))}):this.performViewSessionLoading(e,A)}performViewSessionLoading(e,A){this.traceService.resetTraceService(),this.traceData=[],this.isViewOnlySession()||(this.originalSessionId=this.sessionId),this.readonlySessionType.set("File"),this.readonlySessionName.set(A),this.sessionId=`File: ${A}`,this.currentSessionState=e.state||{},this.evalCase=null,this.chatType.set("session"),this.updateSelectedSessionUrl(),this.showSessionSelectorDrawer=!1,this.resetEventsAndMessages(),this.isViewOnlySession.set(!0),this.canEditSession.set(!1),this.chatPanel()?.canEditSession?.set(!1);let i=!!(e.appName&&e.appName!==this.appName);this.isViewOnlyAppNameMismatch.set(i),e.events&&e.events.forEach(n=>{if(this.appendEventRow(n,!1),n.author!=="user"&&n.actions?.artifactDelta)for(let a in n.actions.artifactDelta)n.actions.artifactDelta.hasOwnProperty(a)&&this.renderArtifact(a,n.actions.artifactDelta[a])}),this.changeDetectorRef.detectChanges()}closeReadonlySession(){this.isViewOnlySession.set(!1),this.readonlySessionType.set(""),this.readonlySessionName.set(""),this.evalCase=null,this.router.navigate([],{queryParams:{session:null,evalCase:null,evalResult:null,file:null},queryParamsHandling:"merge"}),this.createSessionAndReset(),this.originalSessionId=""}doImportSession(e){let A=Date.now()/1e3,i=e.events.map(n=>Ye(gA({},n),{timestamp:A}));this.sessionService.importSession(this.userId,this.appName,i,e.state).subscribe(n=>{this.openSnackBar(`Session imported successfully (ID: ${n.id})`,"OK"),this.sessionTab?.refreshSession(),this.showSessionSelectorDrawer=!1,this.updateWithSelectedSession(n)})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-chat"]],viewQuery:function(A,i){A&1&&ns(i.chatPanel,hQ,5)(i.canvasComponent,cQ,5)(i.sideDrawer,WFA,5)(i.sidePanel,mQ,5)(i.drawerSessionTab,ZFA,5)(i.evalTab,xc,5)(i.appSearchInput,XFA,5)(i.invChipMenuTrigger,$FA,5)(i.nodeChipMenuTrigger,ALA,5)(i.addMenuTrigger,eLA,5),A&2&&ur(10)},hostBindings:function(A,i){A&1&&U("keydown",function(o){return i.handleEscapeKey(o)},ZC)},features:[Bt([{provide:b1,useClass:hF}])],ngContentSelectors:iLA,decls:47,vars:16,consts:[["userMenu","matMenu"],["selectorDrawer",""],["sideDrawer",""],["appSearchInput",""],["drawerSessionTab",""],["addFilterMenu","matMenu"],["invocationMenu","matMenu"],["nodePathMenu","matMenu"],["invChipMenuTrigger","matMenuTrigger"],["nodeChipMenuTrigger","matMenuTrigger"],["addMenuTrigger","matMenuTrigger"],[1,"app-toolbar"],[1,"toolbar-group","toolbar-agent-group"],["mat-icon-button","","aria-label","Toggle side panel",1,"toolbar-icon-button",3,"click"],[1,"toolbar-logo"],[1,"selector-group"],["matTooltip","Select an app",1,"selector-button",3,"click"],["fontSet","material-symbols-outlined"],[1,"selector-label"],["color","warn","matTooltip","The app for the loaded file is not available",2,"margin-left","4px"],["fontSet","material-symbols-outlined",1,"selector-caret"],[1,"toolbar-group","toolbar-session-group"],["mat-icon-button","","matTooltip","User","aria-label","User menu",1,"toolbar-icon-button","user-avatar-button",3,"matMenuTriggerFor"],["xPosition","before","panelClass","user-avatar-menu"],[1,"user-menu-panel",3,"click"],[1,"user-menu-header"],[1,"user-menu-label"],[2,"flex","1"],["mat-icon-button","","matTooltip","Reset to default user",1,"small-icon-button",3,"click"],[1,"user-menu-content"],["textClass","user-menu-id",3,"save","value","placeholder"],["autosize","",1,"drawer-container"],["mode","over","position","start",1,"selector-drawer",3,"closedStart","opened","autoFocus"],["autosize","",1,"side-panel-container"],["mode","side","appResizableDrawer","",1,"side-drawer"],[3,"isApplicationSelectorEnabledObs","showSidePanel","appName","userId","sessionId","isViewOnlySession","isViewOnlyAppNameMismatch","traceData","eventData","currentSessionState","artifacts","selectedEvent","selectedEventIndex","renderedEventGraph","rawSvgString","selectedEventGraphPath","llmRequest","llmResponse","disableBuilderIcon","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab"],[1,"builder-mode-container"],[1,"chat-container"],[3,"appName","preloadedAppData","preloadedLightGraphSvg","preloadedDarkGraphSvg","startPath"],[4,"ngComponentOutlet"],["src","assets/ADK-512-color.svg","width","20px","height","20px"],[1,"toolbar-logo-text","logo-wide"],[2,"color","var(--mat-sys-on-surface-variant)","margin-left","8px","opacity","0.6"],[1,"toolbar-logo-text","logo-narrow"],[1,"info-icon-container"],[1,"disclosure-info-icon"],[1,"custom-tooltip"],[1,"tooltip-desc"],[1,"tooltip-grid"],[1,"tooltip-item"],[1,"tooltip-label"],[1,"tooltip-value"],[1,"selector-group-divider"],["matTooltipPosition","below",3,"matTooltip"],["mat-icon-button","",1,"toolbar-icon-button",3,"click","disabled"],["mat-icon-button","","matTooltipPosition","below",1,"toolbar-icon-button",3,"click","disabled"],[1,"readonly-chip"],[1,"toolbar-content"],[2,"display","flex","align-items","center"],[1,"toolbar-actions"],["mat-icon-button","",1,"toolbar-icon-button",3,"matTooltip"],["fontSet","material-symbols-outlined",2,"font-size","18px","width","18px","height","18px","line-height","18px"],[1,"chip-label"],["mat-icon-button","","aria-label","Close readonly view",1,"chip-close-button",3,"click"],[2,"font-size","16px","width","16px","height","16px"],["matTooltip","Select a session",1,"selector-button",3,"click"],["id","toolbar-new-session-button",1,"selector-button","new-session-button",3,"matTooltip"],["id","toolbar-new-session-button",1,"selector-button","new-session-button","icon-only",3,"matTooltip"],["id","toolbar-new-session-button",1,"selector-button","new-session-button",3,"click","matTooltip"],["id","toolbar-new-session-button",1,"selector-button","new-session-button","icon-only",3,"click","matTooltip"],[1,"chip-value"],["mat-button","",2,"height","30px",3,"click"],["mat-flat-button","",2,"height","30px",3,"click","disabled"],[1,"toolbar-session-text"],["mat-icon-button","",1,"toolbar-icon-button",3,"click","matTooltip"],[1,"selector-drawer-header"],[1,"selector-drawer-title"],["mat-icon-button","","matTooltip","Create new agent","matTooltipPosition","below","aria-label","Create new agent",1,"toolbar-icon-button",3,"click"],["mat-icon-button","","aria-label","Close app selector",1,"toolbar-icon-button",3,"click"],[1,"app-selector-search"],["subscriptSizing","dynamic","appearance","outline",1,"app-selector-search-field"],["matPrefix",""],["matInput","","placeholder","Search apps...",3,"keydown","formControl"],[1,"app-selector-list",3,"keydown"],[1,"app-selector-loading"],["mode","indeterminate","diameter","32"],[1,"app-selector-item",3,"selected"],[1,"app-selector-empty"],[1,"app-selector-item",3,"click"],["fontSet","material-symbols-outlined",1,"app-selector-item-icon"],[1,"app-selector-item-name"],[1,"app-selector-check"],[2,"display","flex","gap","4px"],["mat-button","",1,"toolbar-button",3,"matTooltip"],["mat-button","",1,"toolbar-button",3,"click","matTooltip"],["mat-icon-button","","aria-label","Close session selector",1,"toolbar-icon-button",3,"click"],[1,"session-selector-current-id"],[1,"session-selector-drawer-content"],[3,"sessionSelected","sessionReloaded","userId","appName","sessionId"],[1,"session-selector-current-id-label"],[1,"session-selector-current-id-row"],["textClass","session-selector-current-id-value",3,"save","value","displayValue","tooltip"],[1,"session-selector-current-real-id-row",2,"display","flex","align-items","center","gap","4px"],[1,"session-selector-current-real-id-value",3,"title"],["mat-icon-button","","matTooltip","Copy session ID","aria-label","Copy session ID",1,"session-selector-action-button",3,"click"],["mat-button","",3,"matTooltip"],["mat-button","","color","warn",3,"matTooltip"],["mat-button","",3,"click","matTooltip"],["mat-button","","color","warn",3,"click","matTooltip"],[3,"jumpToInvocation","closePanel","tabChange","sessionSelected","evalCaseSelected","editEvalCaseRequested","testSelected","evalSetIdSelected","returnToSession","evalNotInstalled","page","closeSelectedEvent","openImageDialog","openAddItemDialog","enterBuilderMode","showAgentStructureGraph","switchToEvent","switchToTraceView","drillDownNodePath","selectEventById","isApplicationSelectorEnabledObs","showSidePanel","appName","userId","sessionId","isViewOnlySession","isViewOnlyAppNameMismatch","traceData","eventData","currentSessionState","artifacts","selectedEvent","selectedEventIndex","renderedEventGraph","rawSvgString","selectedEventGraphPath","llmRequest","llmResponse","disableBuilderIcon","hasSubWorkflows","graphsAvailable","invocationDisplayMap","forceGraphTab"],[3,"exitBuilderMode","closePanel","appNameInput"],[1,"resize-handler"],[1,"builder-exit-button"],["mat-icon-button","","matTooltip","Accept",1,"builder-mode-action-button",3,"click"],["mat-icon-button","","matTooltip","Exit Builder Mode",1,"builder-mode-action-button",3,"click"],["mat-icon-button","","matTooltip","Builder Assistant",1,"builder-mode-action-button",3,"click"],[3,"toggleSidePanelRequest","builderAssistantCloseRequest","showSidePanel","showBuilderAssistant","appNameInput"],[1,"chat-card"],[1,"empty-state-container"],[1,"warning"],[1,"error"],[1,"chat-sub-toolbar"],["hideSingleSelectionIndicator","",3,"change","value"],["value","events"],["value","traces"],[1,"filter-bar-container",3,"click"],[1,"filter-chip",3,"matMenuTriggerFor","matTooltip"],["matTooltip","Hide intermediate events to only show final results",1,"filter-chip"],["matTooltip","Add a filter",1,"add-filter-btn",3,"matMenuTriggerFor"],["matTooltip","Clear all filters",1,"add-filter-btn"],[1,"filter-panel"],["mat-menu-item","","matTooltip","Filter events by a specific invocation","matTooltipPosition","right"],["mat-menu-item","","matTooltip","Filter events generated by a specific node","matTooltipPosition","right"],["mat-menu-item","","matTooltip","Hide intermediate events to only show final results","matTooltipPosition","right"],[1,"filter-panel",3,"closed"],["mat-menu-item","","matTooltipPosition","right",3,"matTooltip"],["mat-menu-item",""],[2,"flex-grow","1"],["mat-button","","matTooltip","Compare with expected",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"color"],["mat-button","","matTooltip","Enable real-time token streaming from the server",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"color"],[3,"appName","agentReadme","userInput","hideIntermediateEvents","uiEvents","traceData","isTokenStreamingEnabled","useSse","isChatMode","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"appName","agentReadme","hideIntermediateEvents","uiEvents","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[1,"file-view-container",2,"padding","20px","display","flex","flex-direction","column","align-items","center","justify-content","center","height","100%"],[1,"filter-chip",3,"click","matMenuTriggerFor","matTooltip"],[1,"chip-label",3,"title"],[1,"chip-remove",3,"click"],["matTooltip","Hide intermediate events to only show final results",1,"filter-chip",3,"click"],["matTooltip","Add a filter",1,"add-filter-btn",3,"click","matMenuTriggerFor"],["matTooltip","Clear all filters",1,"add-filter-btn",3,"click"],["mat-menu-item","","matTooltip","Filter events by a specific invocation","matTooltipPosition","right",3,"click"],["mat-menu-item","","matTooltip","Filter events generated by a specific node","matTooltipPosition","right",3,"click"],["mat-menu-item","","matTooltip","Hide intermediate events to only show final results","matTooltipPosition","right",3,"click"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[2,"font-size","16px","width","16px","height","16px","margin-right","8px","color","var(--mat-sys-primary)"],["mat-menu-item","",3,"click"],["mat-button","","matTooltip","Compare with expected",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"click"],[2,"font-size","20px","width","20px","height","20px","line-height","20px","margin-right","4px","vertical-align","middle"],[2,"font-size","13px","font-weight","500","vertical-align","middle"],["mat-button","","matTooltip","Enable real-time token streaming from the server",2,"height","32px","line-height","32px","padding","0 12px","border-radius","16px",3,"click"],[3,"userInputChange","toggleHideIntermediateEvents","toggleSse","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","fileSelect","removeFile","removeStateUpdate","sendMessage","updateState","toggleAudioRecording","toggleVideoRecording","longRunningResponseComplete","appName","agentReadme","userInput","hideIntermediateEvents","uiEvents","traceData","isTokenStreamingEnabled","useSse","isChatMode","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"userInputChange","userEditEvalCaseMessageChange","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","appName","agentReadme","hideIntermediateEvents","uiEvents","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[1,"eval-result-summary",2,"margin","0","padding","8px 24px","background","var(--mat-sys-surface-container)","border-bottom","1px solid var(--mat-sys-outline-variant)","display","flex","align-items","center"],[1,"side-by-side-layout"],[3,"appName","agentReadme","hideIntermediateEvents","uiEvents","traceData","isChatMode","evalCase","agentGraphData","selectedMessageIndex","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[2,"display","flex","gap","12px","align-items","center","flex-wrap","wrap"],[1,"metric-block",2,"position","relative","display","flex","flex-direction","column","gap","2px","background","var(--mat-sys-surface-container-high)","padding","6px 12px","border-radius","6px","flex-shrink","0","cursor","pointer",3,"border"],[1,"metric-block",2,"position","relative","display","flex","flex-direction","column","gap","2px","background","var(--mat-sys-surface-container-high)","padding","6px 12px","border-radius","6px","flex-shrink","0","cursor","pointer"],[2,"color","var(--mat-sys-on-surface-variant)","font-size","11px","font-weight","500"],[2,"display","flex","align-items","baseline","gap","4px"],[2,"font-size","16px","font-weight","600"],[2,"color","var(--mat-sys-on-surface-variant)","font-size","14px","font-weight","500"],[1,"metric-tooltip"],[1,"tooltip-title"],[1,"tooltip-subtitle",2,"font-size","10px","color","var(--mat-sys-on-surface-variant)","margin-bottom","4px"],[1,"tooltip-desc",2,"margin-top","8px","border-top","1px solid var(--mat-sys-outline-variant)","padding-top","6px","margin-bottom","0"],[1,"side-panel-half"],[1,"panel-header"],[3,"appName","agentReadme","hideIntermediateEvents","uiEvents","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[3,"toggleHideIntermediateEvents","toggleSse","userInputChange","userEditEvalCaseMessageChange","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","fileSelect","removeFile","removeStateUpdate","sendMessage","updateState","toggleAudioRecording","toggleVideoRecording","longRunningResponseComplete","appName","agentReadme","hideIntermediateEvents","uiEvents","traceData","isTokenStreamingEnabled","useSse","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","selectedFiles","updatedSessionState","agentGraphData","selectedMessageIndex","isAudioRecording","micVolume","isVideoRecording","userId","sessionId","sessionName","invocationDisplayMap","viewMode","shouldShowEvent"],[2,"font-size","48px","width","48px","height","48px","color","var(--mat-sys-on-surface-variant)"],[2,"margin-top","16px"],[2,"color","var(--mat-sys-on-surface-variant)"],[3,"close","appName","preloadedAppData","preloadedLightGraphSvg","preloadedDarkGraphSvg","startPath"]],template:function(A,i){if(A&1&&(Rt(tLA),B(0,"mat-toolbar",11)(1,"div",12)(2,"button",13),U("click",function(){return i.toggleSidePanel()}),B(3,"mat-icon"),y(4,"menu"),Q()(),B(5,"div",14),O(6,aLA,1,1,"ng-container")(7,lLA,13,3),Q(),B(8,"div",15)(9,"button",16),U("click",function(){return i.toggleAppSelectorDrawer()}),B(10,"mat-icon",17),y(11,"robot_2"),Q(),B(12,"span",18),y(13),Q(),O(14,gLA,2,0,"mat-icon",19),B(15,"mat-icon",20),y(16,"arrow_drop_down"),Q()(),O(17,CLA,6,3),Q()(),O(18,MLA,10,5,"div",21),B(19,"button",22)(20,"mat-icon"),y(21,"account_circle"),Q()(),B(22,"mat-menu",23,0)(24,"div",24),U("click",function(o){return o.stopPropagation()}),B(25,"div",25)(26,"span",26),y(27,"User ID"),Q(),hA(28,"span",27),B(29,"button",28),U("click",function(){return i.saveUserId("user")}),B(30,"mat-icon"),y(31,"restart_alt"),Q()()(),B(32,"div",29)(33,"app-inline-edit",30),U("save",function(o){return i.saveUserId(o)}),Q()()()()(),B(34,"mat-drawer-container",31)(35,"mat-drawer",32,1),U("closedStart",function(){return i.onSelectorDrawerClosed()})("opened",function(){return i.onSelectorDrawerOpened()}),O(37,NLA,20,4)(38,ULA,18,8),Q(),B(39,"mat-drawer-container",33)(40,"mat-drawer",34,2),O(42,TLA,1,23,"app-side-panel",35)(43,JLA,2,1),Q(),O(44,OLA,12,5,"div",36)(45,uGA,5,4,"div",37),Q()(),O(46,fGA,1,5,"app-agent-structure-graph-dialog",38)),A&2){let n=Qi(23);u(6),Y(i.logoComponent?6:7),u(7),lA(i.isLoadedAppUnavailable()?i.unavailableAppName():i.appName||"Select an app"),u(),Y(i.isLoadedAppUnavailable()?14:-1),u(3),Y(i.isBuilderMode()?-1:17),u(),Y(i.appName?18:-1),u(),H("matMenuTriggerFor",n),u(14),H("value",i.userId)("placeholder",i.i18n.userIdInputPlaceholder),u(2),RA("match-side-panel-width",i.showSidePanel),H("opened",i.showAppSelectorDrawer||i.showSessionSelectorDrawer)("autoFocus",!1),u(2),Y(i.showAppSelectorDrawer?37:i.showSessionSelectorDrawer?38:-1),u(5),Y(i.isBuilderMode()?43:42),u(2),Y(i.isBuilderMode()?44:45),u(2),Y(i.showAgentStructureOverlay?46:-1)}},dependencies:[bM,lM,Um,dn,vM,c6,ln,Dn,yn,n2,XI,Wt,cs,pi,ji,LB,Zs,Ml,$c,Nm,AJ,Tc,Ko,ua,gs,hQ,V6,mQ,cQ,JD,sv,dv,os,ip,JI],styles:['.expand-side-drawer[_ngcontent-%COMP%]{position:relative;top:4%;left:1%}.chat-container[_ngcontent-%COMP%]{width:100%;height:100%;max-width:100%;margin:auto;display:flex;flex-direction:column;flex:1}.chat-container.side-by-side[_ngcontent-%COMP%]{max-width:100%}.side-by-side-layout[_ngcontent-%COMP%]{display:flex;flex-direction:row;width:100%;height:100%;flex:1;overflow:hidden;gap:16px;padding:16px;box-sizing:border-box}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;height:100%;min-width:0;background-color:var(--mat-sys-surface-container-low);border-radius:8px;overflow:hidden}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%] .panel-header[_ngcontent-%COMP%]{padding:6px 16px;font-size:14px;font-weight:600;color:var(--mat-sys-on-surface);border-bottom:1px solid var(--mat-sys-outline-variant)}.side-by-side-layout[_ngcontent-%COMP%] .side-panel-half[_ngcontent-%COMP%] app-chat-panel[_ngcontent-%COMP%]{flex:1;overflow:hidden;display:flex;flex-direction:column}.event-container[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface)}.chat-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;overflow:hidden;flex:1;min-height:12%;min-width:500px;box-shadow:none;border-radius:12px 0 0}.chat-card[_ngcontent-%COMP%] app-chat-panel[_ngcontent-%COMP%]{flex:1;min-height:0}.chat-card.no-side-panel[_ngcontent-%COMP%]{border-radius:0}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;margin-top:16px}.content-bubble[_ngcontent-%COMP%]{padding:5px 20px;margin:5px;border-radius:20px;max-width:80%;font-size:14px;font-weight:400;position:relative;display:inline-block}.function-event-button[_ngcontent-%COMP%]{margin:5px 5px 10px}.function-event-button-highlight[_ngcontent-%COMP%]{border-color:var(--mat-sys-primary)!important;color:var(--mat-sys-on-primary)!important}.role-user[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center}.role-user[_ngcontent-%COMP%] .content-bubble[_ngcontent-%COMP%]{align-self:flex-end;color:var(--mat-sys-on-primary-container);background-color:var(--mat-sys-primary-container);box-shadow:none}.role-bot[_ngcontent-%COMP%]{display:flex;align-items:center}.role-bot[_ngcontent-%COMP%] .content-bubble[_ngcontent-%COMP%]{align-self:flex-start;color:var(--mat-sys-on-surface);background-color:var(--mat-sys-surface-container-high);box-shadow:none}.role-bot[_ngcontent-%COMP%]:focus-within .content-bubble[_ngcontent-%COMP%]{border:1px solid var(--mat-sys-outline)}.message-textarea[_ngcontent-%COMP%]{max-width:100%;border:none;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}.content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--mat-sys-outline-variant);padding-right:8px;min-width:350px;max-width:350px}.content-bubble[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}.content-bubble[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--mat-sys-outline-variant);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--mat-sys-tertiary)}.header-actual[_ngcontent-%COMP%]{color:var(--mat-sys-primary)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#2e7d32}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--mat-sys-error)}.navigation-button-sidepanel[_ngcontent-%COMP%]{margin-left:auto;margin-right:20px}.fab-button[_ngcontent-%COMP%]{position:fixed;bottom:200px;right:100px}.sidepanel-toggle[_ngcontent-%COMP%]{position:relative;top:100px}.side-drawer[_ngcontent-%COMP%]{color:var(--chat-side-drawer-color);border-radius:0}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.file-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:5px;padding:5px;border-radius:4px}.empty-state-container[_ngcontent-%COMP%]{color:var(--chat-empty-state-container-color);height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Google Sans,sans-serif;font-weight:400;letter-spacing:normal;line-height:24px;font-size:18px}.empty-state-container[_ngcontent-%COMP%] pre.warning[_ngcontent-%COMP%]{color:var(--chat-warning-color)}.empty-state-container[_ngcontent-%COMP%] pre.error[_ngcontent-%COMP%]{color:var(--chat-error-color)}.new-session-button[_ngcontent-%COMP%]{margin-top:0;width:130px;height:28px;font-size:14px}.adk-checkbox[_ngcontent-%COMP%]{position:fixed;bottom:0;left:0;right:0;margin-bottom:20px;margin-left:20px}.app-toolbar[_ngcontent-%COMP%]{height:48px;min-height:48px!important;display:flex;align-items:center;font-family:Google Sans,sans-serif;font-size:13px;padding:0 8px!important;z-index:1}.toolbar-group[_ngcontent-%COMP%]{display:flex;align-items:center;flex-shrink:0}.toolbar-agent-group[_ngcontent-%COMP%]{margin-right:6px}.toolbar-session-group[_ngcontent-%COMP%]{flex-shrink:1;min-width:0;flex:1}.toolbar-logo[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;margin-right:16px;flex-shrink:0}.toolbar-logo-text[_ngcontent-%COMP%]{font-family:Google Sans,sans-serif;font-size:14px;font-weight:500;white-space:nowrap}.disclosure-info-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;opacity:.7;cursor:pointer;margin-right:16px;color:var(--chat-toolbar-icon-color)}.toolbar-content[_ngcontent-%COMP%]{display:flex;align-items:center;flex:1;min-width:0}.drawer-container[_ngcontent-%COMP%]{height:calc(100% - 48px)}.side-panel-container[_ngcontent-%COMP%]{width:100%;height:100%}.toolbar-actions[_ngcontent-%COMP%]{margin-left:auto;display:flex;align-items:center;flex-shrink:0}.toolbar-session-text[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-text-color);font-family:Google Sans,sans-serif;font-size:13px;font-style:normal;font-weight:500;text-transform:uppercase;flex-shrink:0}.toolbar-session-id[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-id-color);font-family:Google Sans Mono,monospace;font-size:13px;margin-left:5px}.readonly-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;background-color:var(--mat-sys-primary-container)!important;color:var(--mat-sys-on-primary-container)!important;padding:4px 12px;border-radius:16px;font-size:13px;font-weight:500;gap:6px}.readonly-chip[_ngcontent-%COMP%] .chip-label[_ngcontent-%COMP%]{text-transform:uppercase;font-size:11px;font-weight:700;opacity:.9}.readonly-chip[_ngcontent-%COMP%] .chip-value[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.readonly-chip[_ngcontent-%COMP%] .chip-close-button[_ngcontent-%COMP%]{width:24px!important;height:24px!important;min-width:24px!important;padding:0!important;display:flex!important;align-items:center;justify-content:center;color:inherit!important;opacity:.8;margin-left:4px}.readonly-chip[_ngcontent-%COMP%] .chip-close-button[_ngcontent-%COMP%]:hover{opacity:1;background-color:#fff3!important}.toolbar-session-id-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-left:5px}.toolbar-session-id-container[_ngcontent-%COMP%] .toolbar-session-id[_ngcontent-%COMP%]{margin-left:0}.toolbar-icon-button[_ngcontent-%COMP%]{color:var(--chat-toolbar-icon-color);background:transparent!important;border:none!important;box-shadow:none!important}.toolbar-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.small-icon-button[_ngcontent-%COMP%]{width:28px!important;height:28px!important;min-width:28px!important;min-height:28px!important;padding:0!important}.small-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px!important;width:18px!important;height:18px!important}.toolbar-user-id-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-left:5px}.toolbar-user-id-input[_ngcontent-%COMP%]{width:140px;height:24px;border:1px solid var(--chat-toolbar-session-text-color);border-radius:4px;color:var(--chat-toolbar-session-id-color);padding:0 6px;font-family:Google Sans Mono,monospace;font-size:12px}.toolbar-user-id-input[_ngcontent-%COMP%]:focus{outline:1px solid var(--chat-toolbar-icon-color)}.user-avatar-button[_ngcontent-%COMP%]{margin-left:auto;flex-shrink:0}.user-avatar-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:24px;width:24px;height:24px}.user-menu-panel[_ngcontent-%COMP%]{padding:16px;min-width:240px}.user-menu-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin-bottom:12px}.user-menu-avatar-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px;color:var(--chat-toolbar-icon-color)}.user-menu-label[_ngcontent-%COMP%]{font-size:14px;font-weight:500;color:var(--chat-toolbar-session-text-color);text-transform:uppercase}.user-menu-content[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.user-menu-id[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace;font-size:14px;color:var(--chat-toolbar-session-id-color);word-break:break-all}.user-menu-input[_ngcontent-%COMP%]{flex:1;height:28px;border:1px solid var(--chat-toolbar-session-text-color);border-radius:4px;color:var(--chat-toolbar-session-id-color);padding:0 8px;font-family:Google Sans Mono,monospace;font-size:13px;background:transparent}.user-menu-input[_ngcontent-%COMP%]:focus{outline:1px solid var(--chat-toolbar-icon-color)}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.readonly-badge[_ngcontent-%COMP%]{color:var(--mat-sys-on-primary-container)!important;background-color:var(--mat-sys-primary-container)!important;border-radius:16px;padding:4px 12px;display:flex;align-items:center;margin-left:8px;font-family:Google Sans,sans-serif;font-size:13px;line-height:18px;gap:4px;white-space:nowrap}.readonly-badge[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;flex-shrink:0}.readonly-session-message[_ngcontent-%COMP%]{display:block;color:var(--chat-toolbar-session-text-color);font-family:Google Sans,sans-serif;font-size:13px;margin-left:1em;font-weight:400;line-height:18px;letter-spacing:.3px;flex-shrink:1}.builder-mode-container[_ngcontent-%COMP%]{position:relative;width:100%;height:100vh;display:flex;flex-direction:column}.builder-exit-button[_ngcontent-%COMP%]{position:absolute;top:20px;right:20px;display:flex;gap:8px}.builder-mode-action-button[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color)!important;border-radius:50%!important;transition:all .2s ease!important;margin:0!important;padding:0!important;width:40px!important;height:40px!important;min-width:40px!important;min-height:40px!important;border:1px solid var(--builder-tool-item-border-color)!important;box-shadow:0 2px 4px #0000001a!important;display:flex!important;align-items:center!important;justify-content:center!important}.builder-mode-action-button[_ngcontent-%COMP%]:hover{box-shadow:0 4px 8px #00000026!important}.builder-mode-action-button.active[_ngcontent-%COMP%]{color:#fff!important;border-color:var(--builder-button-primary-background-color)!important}.builder-mode-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}app-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;flex:1!important;display:flex!important;flex-direction:column!important;min-height:0!important}.build-mode-container[_ngcontent-%COMP%]{display:flex;width:100%;height:100%}.build-left-panel[_ngcontent-%COMP%], .build-right-panel[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;border:1px solid var(--builder-border-color);margin:10px;border-radius:8px}.selector-group[_ngcontent-%COMP%]{display:flex;align-items:center;border-radius:6px;border:1px solid var(--mat-sys-outline-variant, #c4c7c5);margin-right:8px;flex-shrink:0;height:32px;overflow:hidden}.selector-group[_ngcontent-%COMP%] .toolbar-icon-button[_ngcontent-%COMP%]{width:32px;height:32px;padding:0;display:flex;align-items:center;justify-content:center;flex-shrink:0}.selector-group[_ngcontent-%COMP%] .toolbar-icon-button[_ngcontent-%COMP%] .mdc-icon-button__ripple{border-radius:4px;inset:1px}.selector-group[_ngcontent-%COMP%] .toolbar-icon-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.selector-group-divider[_ngcontent-%COMP%]{width:1px;height:16px;background-color:var(--mat-sys-outline-variant, #c4c7c5);flex-shrink:0}.selector-button[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;padding:4px 12px;margin-right:1px;border-radius:6px;border:none;background:transparent;cursor:pointer;color:var(--chat-toolbar-icon-color);font-family:Google Sans,sans-serif;font-size:13px;font-weight:500;height:100%;flex-shrink:0;white-space:nowrap;width:auto;max-width:220px;overflow:hidden;transition:background-color .15s ease;position:relative;z-index:0}.selector-button[_ngcontent-%COMP%]:before{content:"";position:absolute;inset:1px;border-radius:4px;background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant));opacity:0;pointer-events:none;z-index:-1;transition:opacity .15s ease}.selector-button[_ngcontent-%COMP%]:hover:before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.selector-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0}.new-session-button[_ngcontent-%COMP%]{width:auto!important}.new-session-button.icon-only[_ngcontent-%COMP%]{width:32px!important;padding:0!important;justify-content:center}.selector-label[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;flex:1;text-align:left}.selector-caret[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0;margin-left:auto;opacity:.7}.selector-drawer-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:8px 8px 8px 20px;height:48px;flex-shrink:0}.selector-drawer-title[_ngcontent-%COMP%]{font-size:16px;font-weight:500;font-family:Google Sans,sans-serif}.selector-drawer[_ngcontent-%COMP%]{width:320px;background-color:var(--mat-sys-surface, #fff)}.selector-drawer[_ngcontent-%COMP%] .mat-drawer-inner-container{display:flex;flex-direction:column;height:100%;overflow:hidden}.selector-drawer.match-side-panel-width[_ngcontent-%COMP%]{width:var(--side-drawer-width)}.app-selector-search[_ngcontent-%COMP%]{padding:0 12px 4px;flex-shrink:0}.app-selector-search-field[_ngcontent-%COMP%]{width:100%;font-size:13px}.app-selector-search-field[_ngcontent-%COMP%] .mat-mdc-form-field-infix[_ngcontent-%COMP%]{min-height:36px;padding-top:6px!important;padding-bottom:6px!important}.app-selector-search-field[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-text-color);font-size:18px;width:18px;height:18px}.app-selector-list[_ngcontent-%COMP%]{flex:1;overflow-y:auto;padding:0 8px}.app-selector-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;border:none;background:transparent;cursor:pointer;border-radius:8px;font-family:Google Sans Mono,monospace;font-size:13px;color:var(--chat-toolbar-icon-color);text-align:left;transition:background-color .15s ease}.app-selector-item[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant, rgba(0, 0, 0, .04))}.app-selector-item.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-secondary-container, #d7e3f7);font-weight:500}.app-selector-item-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;flex-shrink:0;color:var(--chat-toolbar-session-text-color)}.app-selector-check[_ngcontent-%COMP%]{margin-left:auto;font-size:18px;width:18px;height:18px}.app-selector-item-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-selector-loading[_ngcontent-%COMP%]{display:flex;justify-content:center;padding:24px}.app-selector-empty[_ngcontent-%COMP%]{text-align:center;padding:24px;color:var(--chat-toolbar-session-text-color);font-style:italic}.session-selector-current-id[_ngcontent-%COMP%]{padding:8px 20px;border-bottom:1px solid var(--mat-sys-outline-variant, #c4c7c5)}.session-selector-current-id-label[_ngcontent-%COMP%]{font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.5px;color:var(--mat-sys-on-surface-variant, #444746)}.session-selector-current-id-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.session-selector-current-id-value[_ngcontent-%COMP%]{font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px;font-family:Google Sans,sans-serif;color:var(--mat-sys-on-surface, #1a1c20);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:0 1 auto;min-width:0}.session-selector-current-real-id-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.session-selector-current-real-id-value[_ngcontent-%COMP%]{font-size:11px;font-family:Google Sans Mono,monospace;color:var(--chat-toolbar-session-id-color);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:0 1 auto;min-width:0;opacity:.7}.session-selector-action-button[_ngcontent-%COMP%]{flex-shrink:0;width:28px!important;height:28px!important;padding:0!important}.session-selector-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}.session-selector-drawer-content[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.build-panel-header[_ngcontent-%COMP%]{padding:16px 20px;border-bottom:1px solid var(--builder-border-color);border-radius:8px 8px 0 0}.build-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--builder-text-primary-color);font-size:16px;font-weight:500;font-family:Google Sans,Helvetica Neue,sans-serif}.build-panel-content[_ngcontent-%COMP%]{flex:1;padding:20px;color:var(--builder-text-secondary-color);overflow-y:auto}.build-panel-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5}.app-name-option[_ngcontent-%COMP%], .app-select[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:unset}.adk-web-developer-ui-disclaimer[_ngcontent-%COMP%]{padding-left:4px;padding-bottom:4px;font-size:10px;color:var(--adk-web-text-color-light-gray)}.menu-check-icon.inactive[_ngcontent-%COMP%]{visibility:hidden}.logo-narrow[_ngcontent-%COMP%]{display:none}@media(max-width:900px){.logo-wide[_ngcontent-%COMP%]{display:none}.logo-narrow[_ngcontent-%COMP%]{display:inline}}@media(max-width:750px){.toolbar-agent-group[_ngcontent-%COMP%] .selector-button[_ngcontent-%COMP%]{width:auto;padding:4px 8px}.toolbar-agent-group[_ngcontent-%COMP%] .selector-label[_ngcontent-%COMP%]{display:none}}@media(max-width:600px){.toolbar-session-group[_ngcontent-%COMP%] .selector-button[_ngcontent-%COMP%]{width:auto;padding:4px 8px}.toolbar-session-group[_ngcontent-%COMP%] .selector-label[_ngcontent-%COMP%]{display:none}}.chat-sub-toolbar[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;height:48px;flex-shrink:0;padding:0 20px;background-color:var(--mat-sys-surface-container);border-bottom:1px solid var(--mat-sys-outline-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{border-radius:16px;height:28px;align-items:center}.chat-sub-toolbar[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] .mat-button-toggle-label-content{line-height:28px;padding:0 12px;font-size:13px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-bar-container[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;background-color:transparent;border:none;margin-left:16px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;height:28px;cursor:pointer;transition:background-color .2s ease}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-label[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;color:var(--mat-sys-on-surface-variant);padding:0;margin-left:4px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px}.chat-sub-toolbar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%] .chip-remove[_ngcontent-%COMP%]:hover{color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:transparent;border:1px dashed var(--mat-sys-outline-variant);border-radius:14px;padding:0 10px;font-size:13px;font-weight:500;height:28px;cursor:pointer;transition:all .2s ease;color:var(--mat-sys-on-surface-variant)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%]:hover{background-color:var(--mat-sys-surface-variant);border-color:var(--mat-sys-outline);color:var(--mat-sys-on-surface)}.chat-sub-toolbar[_ngcontent-%COMP%] .add-filter-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;margin-right:4px} .filter-panel{min-width:max-content!important;max-width:50vw} .filter-panel .mat-mdc-menu-item{min-height:32px!important;font-size:12px!important} .filter-panel .mat-mdc-menu-item .mat-mdc-menu-item-text, .filter-panel .mat-mdc-menu-item .mdc-list-item__primary-text{font-size:12px!important;line-height:normal}.metric-block[_ngcontent-%COMP%]:hover .metric-tooltip[_ngcontent-%COMP%]{visibility:visible!important;opacity:1!important}.metric-tooltip[_ngcontent-%COMP%]{visibility:hidden;opacity:0;position:absolute;z-index:100;top:110%;left:0;background:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:12px;width:220px;box-shadow:0 4px 12px #00000026;transition:opacity .15s ease,visibility .15s ease;pointer-events:none}.metric-tooltip[_ngcontent-%COMP%] .tooltip-title[_ngcontent-%COMP%]{font-weight:600;font-size:13px;margin-bottom:4px;color:var(--mat-sys-on-surface)}.metric-tooltip[_ngcontent-%COMP%] .tooltip-desc[_ngcontent-%COMP%]{font-size:11px;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;white-space:normal;line-height:1.4}.metric-tooltip[_ngcontent-%COMP%] .tooltip-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:6px;font-size:11px;border-top:1px solid var(--mat-sys-outline-variant);padding-top:6px}.metric-tooltip[_ngcontent-%COMP%] .tooltip-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:4px}.metric-tooltip[_ngcontent-%COMP%] .tooltip-label[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-weight:400}.metric-tooltip[_ngcontent-%COMP%] .tooltip-value[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface)}.info-icon-container[_ngcontent-%COMP%]{position:relative;display:inline-flex;align-items:center;cursor:pointer}.info-icon-container[_ngcontent-%COMP%]:hover .custom-tooltip[_ngcontent-%COMP%]{visibility:visible;opacity:1}.custom-tooltip[_ngcontent-%COMP%]{visibility:hidden;opacity:0;position:absolute;z-index:100;top:110%;left:50%;transform:translate(-50%);background:var(--mat-sys-surface-container-highest);border:1px solid var(--mat-sys-outline-variant);border-radius:8px;padding:12px;width:250px;box-shadow:0 4px 12px #00000026;transition:opacity .15s ease,visibility .15s ease;pointer-events:none;white-space:normal}.custom-tooltip[_ngcontent-%COMP%] .tooltip-title[_ngcontent-%COMP%]{font-weight:600;font-size:13px;margin-bottom:4px;color:var(--mat-sys-on-surface)}.custom-tooltip[_ngcontent-%COMP%] .tooltip-desc[_ngcontent-%COMP%]{font-size:11px;color:var(--mat-sys-on-surface-variant);margin-bottom:8px;line-height:1.4}.custom-tooltip[_ngcontent-%COMP%] .tooltip-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr;gap:4px;font-size:11px;border-top:1px solid var(--mat-sys-outline-variant);padding-top:6px}.custom-tooltip[_ngcontent-%COMP%] .tooltip-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:4px}.custom-tooltip[_ngcontent-%COMP%] .tooltip-label[_ngcontent-%COMP%]{color:var(--mat-sys-on-surface-variant);font-weight:400}.custom-tooltip[_ngcontent-%COMP%] .tooltip-value[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-sys-on-surface)}']})};var wQ=class t{static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-root"]],decls:1,vars:0,template:function(A,i){A&1&&hA(0,"app-chat")},dependencies:[Ev],encapsulation:2})};var DGA=[{path:"",component:wQ}],hv=class t{static \u0275fac=function(A){return new(A||t)};static \u0275mod=Ze({type:t});static \u0275inj=We({imports:[Rm.forRoot(DGA),Rm]})};var Qv=class{static getRuntimeConfig(){return window.runtimeConfig}};function yGA(t,e){if(t&1&&(wn(0,"a",0),Kn(1,"img",1),y(2),Gn()),t&2){p();let A=zn(0),i=zn(1);u(),ha("src",XC(A),Go),u(),ue(" ",i," ")}}function vGA(t,e){t&1&&(wn(0,"div"),y(1," Invalid custom logo config. Make sure that your runtime config specifies both imgUrl and text in the logo field. "),Gn())}var uv=class t{logoConfig=Qv.getRuntimeConfig().logo;static \u0275fac=function(A){return new(A||t)};static \u0275cmp=SA({type:t,selectors:[["app-custom-logo"]],decls:4,vars:3,consts:[["href","/"],["width","32px","height","32px",1,"orcas-logo",3,"src"]],template:function(A,i){if(A&1&&(ta(0)(1),O(2,yGA,3,3,"a",0)(3,vGA,2,0,"div")),A&2){let n=ga(i.logoConfig==null?null:i.logoConfig.imageUrl);u();let o=ga(i.logoConfig==null?null:i.logoConfig.text);u(),Y(n&&o?2:3)}},styles:[`a[_ngcontent-%COMP%]{color:inherit;text-decoration:none;display:flex;align-items:center;gap:8px} - - - - - - - - - - - - - - - - -`]})};var bGA={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-as-n":!0,"layout-dis-iflx":!0,"layout-al-c":!0},MGA={"layout-w-100":!0},SGA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-mt-0":!0,"layout-mb-2":!0,"typography-sz-bm":!0,"color-c-n10":!0},kGA={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-pt-3":!0,"layout-pb-3":!0,"layout-pl-5":!0,"layout-pr-5":!0,"layout-mb-1":!0,"border-br-16":!0,"border-bw-0":!0,"border-c-n70":!0,"border-bs-s":!0,"color-bgc-s30":!0,"color-c-n100":!0,"behavior-ho-80":!0},QF={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mb-2":!0,"color-c-n10":!0},xGA=Ye(gA({},QF),{"typography-sz-tl":!0}),_GA=Ye(gA({},QF),{"typography-sz-tm":!0}),RGA=Ye(gA({},QF),{"typography-sz-ts":!0}),NGA={"behavior-sw-n":!0},EiA={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-pl-4":!0,"layout-pr-4":!0,"layout-pt-2":!0,"layout-pb-2":!0,"border-br-6":!0,"border-bw-1":!0,"color-bc-s70":!0,"border-bs-s":!0,"layout-as-n":!0,"color-c-n10":!0},FGA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0,"color-c-n10":!0},LGA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},GGA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},KGA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},UGA={"typography-f-c":!0,"typography-fs-n":!0,"typography-w-400":!0,"typography-sz-bm":!0,"typography-ws-p":!0,"layout-as-n":!0},TGA=Ye(gA({},EiA),{"layout-r-none":!0,"layout-fs-c":!0}),JGA={"layout-el-cv":!0},ciA=Ts.merge(bGA,{"color-c-p30":!0}),OGA=Ts.merge(EiA,{"color-c-n5":!0}),YGA=Ts.merge(TGA,{"color-c-n5":!0}),HGA=Ts.merge(kGA,{"color-c-n100":!0}),CiA=Ts.merge(xGA,{"color-c-n5":!0}),IiA=Ts.merge(_GA,{"color-c-n5":!0}),diA=Ts.merge(RGA,{"color-c-n5":!0}),zGA=Ts.merge(SGA,{"color-c-n5":!0}),BiA=Ts.merge(FGA,{"color-c-n60":!0}),PGA=Ts.merge(UGA,{"color-c-n35":!0}),jGA=Ts.merge(LGA,{"color-c-n35":!0}),qGA=Ts.merge(GGA,{"color-c-n35":!0}),VGA=Ts.merge(KGA,{"color-c-n35":!0}),hiA={additionalStyles:{Card:{},Button:{"--n-60":"var(--n-100)"},Image:{"max-width":"120px","max-height":"120px",marginLeft:"auto",marginRight:"auto"}},components:{AudioPlayer:{},Button:{"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-5":!0,"layout-pr-5":!0,"border-br-2":!0,"border-bw-0":!0,"border-bs-s":!0,"color-bgc-p30":!0,"color-c-n100":!0,"behavior-ho-70":!0},Card:{"border-br-4":!0,"color-bgc-p100":!0,"color-bc-n90":!0,"border-bw-1":!0,"border-bs-s":!0,"layout-pt-4":!0,"layout-pb-4":!0,"layout-pl-4":!0,"layout-pr-4":!0},CheckBox:{element:{"layout-m-0":!0,"layout-mr-2":!0,"layout-p-2":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0,"color-c-p30":!0},label:{"color-c-p30":!0,"typography-f-sf":!0,"typography-v-r":!0,"typography-w-400":!0,"layout-flx-1":!0,"typography-sz-ll":!0},container:{"layout-dsp-iflex":!0,"layout-al-c":!0}},Column:{},DateTimeInput:{container:{},label:{},element:{"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-3":!0,"layout-pr-3":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0}},Divider:{"color-bgc-n90":!0,"layout-mt-6":!0,"layout-mb-6":!0},Image:{all:{"border-br-50pc":!0,"layout-el-cv":!0,"layout-w-100":!0,"layout-h-100":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0,"layout-sp-c":!0,"layout-mb-3":!0},avatar:{},header:{},icon:{},largeFeature:{},mediumFeature:{},smallFeature:{}},Icon:{"border-br-1":!0,"layout-p-2":!0,"color-bgc-n98":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0,"layout-sp-c":!0},List:{"layout-g-4":!0,"layout-p-2":!0},Modal:{backdrop:{"color-bbgc-p60_20":!0},element:{"border-br-2":!0,"color-bgc-p100":!0,"layout-p-4":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bc-p80":!0}},MultipleChoice:{container:{},label:{},element:{}},Row:{"layout-g-4":!0},Slider:{container:{},label:{},element:{}},Tabs:{container:{},controls:{all:{},selected:{}},element:{}},Text:{all:{"layout-w-100":!0,"layout-g-2":!0,"color-c-p30":!0},h1:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-2":!0,"layout-p-0":!0,"typography-sz-tl":!0},h2:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-2":!0,"layout-p-0":!0,"typography-sz-tl":!0},h3:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"typography-sz-ts":!0},h4:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"typography-sz-bl":!0},h5:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"color-c-n30":!0,"typography-sz-bm":!0,"layout-mb-1":!0},body:{},caption:{}},TextField:{container:{"typography-sz-bm":!0,"layout-w-100":!0,"layout-g-2":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0},label:{"layout-flx-0":!0},element:{"typography-sz-bm":!0,"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-3":!0,"layout-pr-3":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0,"color-c-p30":!0}},Video:{"border-br-5":!0,"layout-el-cv":!0}},elements:{a:ciA,audio:MGA,body:zGA,button:HGA,h1:CiA,h2:IiA,h3:diA,h4:{},h5:{},iframe:NGA,input:OGA,p:BiA,pre:PGA,textarea:YGA,video:JGA},markdown:{p:[...Object.keys(BiA)],h1:[...Object.keys(CiA)],h2:[...Object.keys(IiA)],h3:[...Object.keys(diA)],h4:[],h5:[],ul:[...Object.keys(qGA)],ol:[...Object.keys(jGA)],li:[...Object.keys(VGA)],a:[...Object.keys(ciA)],strong:[],em:[]}};var fv=class t{nodes=[];subAgentIdCounter=1;selectedToolSubject=new ei(void 0);selectedNodeSubject=new ei(void 0);selectedCallbackSubject=new ei(void 0);loadedAgentDataSubject=new ei(void 0);agentToolsMapSubject=new ei(new Map);agentToolsSubject=new ei(void 0);newAgentToolBoardSubject=new ei(void 0);agentCallbacksMapSubject=new ei(new Map);agentCallbacksSubject=new ei(void 0);agentToolDeletionSubject=new ei(void 0);deleteSubAgentSubject=new ei("");addSubAgentSubject=new ei({parentAgentName:""});tabChangeSubject=new ei(void 0);agentToolBoardsSubject=new ei(new Map);constructor(){}getNode(e){return this.nodes.find(i=>i.name===e)}getRootNode(){return this.nodes.find(A=>!!A.isRoot)}addNode(e){let A=this.nodes.findIndex(l=>l.name===e.name);A!==-1?this.nodes[A]=e:this.nodes.push(e);let i=/^sub_agent_(\d+)$/,n=e.name.match(i);if(n){let l=parseInt(n[1],10);l>=this.subAgentIdCounter&&(this.subAgentIdCounter=l+1)}let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e.name,e.tools||[]),this.agentToolsMapSubject.next(a);let r=this.agentCallbacksMapSubject.value,s=new Map(r);s.set(e.name,e.callbacks||[]),this.agentCallbacksMapSubject.next(s),this.setSelectedNode(this.selectedNodeSubject.value)}getNodes(){return this.nodes}clear(){this.nodes=[],this.subAgentIdCounter=1,this.setSelectedNode(void 0),this.setSelectedTool(void 0),this.agentToolsMapSubject.next(new Map),this.agentCallbacksMapSubject.next(new Map),this.setSelectedCallback(void 0),this.setAgentTools(),this.setAgentCallbacks()}getSelectedNode(){return this.selectedNodeSubject.asObservable()}setSelectedNode(e){this.selectedNodeSubject.next(e)}getSelectedTool(){return this.selectedToolSubject.asObservable()}setSelectedTool(e){this.selectedToolSubject.next(e)}getSelectedCallback(){return this.selectedCallbackSubject.asObservable()}setSelectedCallback(e){this.selectedCallbackSubject.next(e)}getNextSubAgentName(){return`sub_agent_${this.subAgentIdCounter++}`}addTool(e,A){let i=this.getNode(e);if(i){let n=i.tools||[];i.tools=[A,...n];let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e,i.tools),this.agentToolsMapSubject.next(a)}}deleteTool(e,A){let i=this.getNode(e);if(i&&i.tools){let n=i.tools.length;if(i.tools=i.tools.filter(o=>o.name!==A.name),i.tools.lengthr.name===A.name))return{success:!1,error:`Callback with name '${A.name}' already exists`};i.callbacks.push(A),this.agentCallbacksSubject.next({agentName:e,callbacks:i.callbacks});let o=this.agentCallbacksMapSubject.value,a=new Map(o);return a.set(e,i.callbacks),this.agentCallbacksMapSubject.next(a),{success:!0}}catch(i){return{success:!1,error:"Failed to add callback: "+i.message}}}updateCallback(e,A,i){try{let n=this.getNode(e);if(!n)return{success:!1,error:"Agent not found"};if(!n.callbacks)return{success:!1,error:"No callbacks found for this agent"};let o=n.callbacks.findIndex(g=>g.name===A);if(o===-1)return{success:!1,error:"Callback not found"};if(n.callbacks.some((g,C)=>C!==o&&g.name===i.name))return{success:!1,error:`Callback with name '${i.name}' already exists`};let r=gA(gA({},n.callbacks[o]),i);n.callbacks[o]=r,this.agentCallbacksSubject.next({agentName:e,callbacks:n.callbacks});let s=this.agentCallbacksMapSubject.value,l=new Map(s);return l.set(e,n.callbacks),this.agentCallbacksMapSubject.next(l),this.selectedCallbackSubject.value?.name===A&&this.setSelectedCallback(r),{success:!0}}catch(n){return{success:!1,error:"Failed to update callback: "+n.message}}}deleteCallback(e,A){try{let i=this.getNode(e);if(!i)return{success:!1,error:"Agent not found"};if(!i.callbacks)return{success:!1,error:"No callbacks found for this agent"};let n=i.callbacks.findIndex(r=>r.name===A.name);if(n===-1)return{success:!1,error:"Callback not found"};i.callbacks.splice(n,1),this.agentCallbacksSubject.next({agentName:e,callbacks:i.callbacks});let o=this.agentCallbacksMapSubject.value,a=new Map(o);return a.set(e,i.callbacks),this.agentCallbacksMapSubject.next(a),this.selectedCallbackSubject.value?.name===A.name&&this.setSelectedCallback(void 0),{success:!0}}catch(i){return{success:!1,error:"Failed to delete callback: "+i.message}}}setLoadedAgentData(e){this.loadedAgentDataSubject.next(e)}getLoadedAgentData(){return this.loadedAgentDataSubject.asObservable()}getAgentToolsMap(){return this.agentToolsMapSubject.asObservable()}getAgentCallbacksMap(){return this.agentCallbacksMapSubject.asObservable()}requestSideTabChange(e){this.tabChangeSubject.next(e)}getSideTabChangeRequest(){return this.tabChangeSubject.asObservable()}requestNewTab(e,A){this.newAgentToolBoardSubject.next({toolName:e,currentAgentName:A})}getNewTabRequest(){return this.newAgentToolBoardSubject.asObservable().pipe(we(A=>A?{tabName:A.toolName,currentAgentName:A.currentAgentName}:void 0))}requestTabDeletion(e){this.agentToolDeletionSubject.next(e)}getTabDeletionRequest(){return this.agentToolDeletionSubject.asObservable()}setAgentToolBoards(e){this.agentToolBoardsSubject.next(e)}getAgentToolBoards(){return this.agentToolBoardsSubject.asObservable()}getCurrentAgentToolBoards(){return this.agentToolBoardsSubject.value}getAgentTools(){return this.agentToolsSubject.asObservable()}getDeleteSubAgentSubject(){return this.deleteSubAgentSubject.asObservable()}setDeleteSubAgentSubject(e){this.deleteSubAgentSubject.next(e)}getAddSubAgentSubject(){return this.addSubAgentSubject.asObservable()}setAddSubAgentSubject(e,A,i){this.addSubAgentSubject.next({parentAgentName:e,agentClass:A,isFromEmptyGroup:i})}setAgentTools(e,A){if(e&&A){this.agentToolsSubject.next({agentName:e,tools:A});let i=this.agentToolsMapSubject.value,n=new Map(i);n.set(e,A),this.agentToolsMapSubject.next(n)}else this.agentToolsSubject.next(void 0)}getAgentCallbacks(){return this.agentCallbacksSubject.asObservable()}setAgentCallbacks(e,A){e&&A?this.agentCallbacksSubject.next({agentName:e,callbacks:A}):this.agentCallbacksSubject.next(void 0)}getParentNode(e,A,i,n){if(e){if(e.name===A.name)return i;for(let o of e.sub_agents){let a=this.getParentNode(o,A,e,n);if(a)return a}if(e.tools){for(let o of e.tools)if(o.toolType==="Agent Tool"){let a=n.get(o.toolAgentName||o.name);if(a){let r=this.getParentNode(a,A,e,n);if(r)return r}}}}}deleteNode(e){this.nodes=this.nodes.filter(A=>A.name!==e.name),this.setSelectedNode(this.selectedNodeSubject.value)}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var pv=class t{constructor(e){this.http=e}apiServerDomain=Dr.getApiServerBaseUrl();getLatestArtifact(e,A,i,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/artifacts/${n}`;return this.http.get(o)}getArtifactVersion(e,A,i,n,o){let a=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/artifacts/${n}/versions/${o}`;return this.http.get(a)}static \u0275fac=function(A){return new(A||t)(Lo(fr))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var mv=class t{audioContext=new AudioContext({sampleRate:22e3});lastAudioTime=0;scheduledAudioSources=new Set;playAudio(e){let A=this.combineAudioBuffer(e);A&&this.playPCM(A)}stopAudio(){for(let e of this.scheduledAudioSources)e.onended=null,e.stop();this.scheduledAudioSources.clear(),this.lastAudioTime=this.audioContext.currentTime}combineAudioBuffer(e){if(e.length===0)return;let A=e.reduce((o,a)=>o+a.length,0),i=new Uint8Array(A),n=0;for(let o of e)i.set(o,n),n+=o.length;return i}playPCM(e){let A=new Float32Array(e.length/2);for(let r=0;r=32768&&(s-=65536),A[r]=s/32768}let i=this.audioContext.createBuffer(1,A.length,22e3);i.copyToChannel(A,0);let n=this.audioContext.createBufferSource();n.buffer=i,n.connect(this.audioContext.destination),n.onended=()=>{this.scheduledAudioSources.delete(n)},this.scheduledAudioSources.add(n);let o=this.audioContext.currentTime,a=Math.max(this.lastAudioTime,o);n.start(a),this.lastAudioTime=a+i.duration}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var wv=class t{audioWorkletModulePath=w(l6);stream;audioContext;source;audioBuffer=[];volumeLevel=bA(0);lastVolumeUpdate=0;startRecording(){return lt(this,null,function*(){try{this.stream=yield navigator.mediaDevices.getUserMedia({audio:!0}),this.audioContext=new AudioContext,yield this.audioContext.audioWorklet.addModule(this.audioWorkletModulePath),this.source=this.audioContext.createMediaStreamSource(this.stream);let e=new AudioWorkletNode(this.audioContext,"audio-processor");e.port.onmessage=A=>{let i=A.data,n=Date.now();if(n-this.lastVolumeUpdate>100){let a=0;for(let l=0;le.stop()),this.volumeLevel.set(0)}getCombinedAudioBuffer(){if(this.audioBuffer.length===0)return;let e=this.audioBuffer.reduce((n,o)=>n+o.length,0),A=new Uint8Array(e),i=0;for(let n of this.audioBuffer)A.set(n,i),i+=n.length;return A}cleanAudioBuffer(){this.audioBuffer=[]}float32ToPCM(e){let A=new ArrayBuffer(e.length*2),i=new DataView(A);for(let n=0;n{let n=i.metricsInfo||[];this.metricsInfoCache.set(e,n),this.metricsInfo.set(n)}))}return new vi}createNewEvalSet(e,A,i="live"){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${e}/eval-sets`;return this.http.post(n,{eval_set:{eval_set_id:A,model_execution_mode:i,tool_execution_mode:i,eval_cases:[]}})}return new vi}getEvalSet(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/eval_sets/${A}`;return this.http.get(i,{})}return new vi}listEvalCases(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals`;return this.http.get(i,{})}return new vi}addCurrentSession(e,A,i,n,o){let a=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/add_session`;return this.http.post(a,{evalId:i,sessionId:n,userId:o})}runEval(e,A,i,n){let o=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/run_eval`;return this.http.post(o,{evalIds:i,evalMetrics:n})}listEvalResults(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/apps/${e}/eval_results`;return this.http.get(A,{})}return new vi}getEvalResult(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/eval_results/${encodeURIComponent(A)}`;return this.http.get(i,{})}return new vi}getEvalCase(e,A,i){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals/${i}`;return this.http.get(n,{})}return new vi}updateEvalCase(e,A,i,n){let o=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals/${i}`;return this.http.put(o,{evalId:i,conversation:n.conversation,sessionInput:n.sessionInput,creationTimestamp:n.creationTimestamp})}deleteEvalCase(e,A,i){let n=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals/${i}`;return this.http.delete(n,{})}deleteEvalSet(e,A){let i=this.apiServerDomain+`/apps/${e}/eval_sets/${A}`;return this.http.delete(i,{})}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var uF="gcp.vertex.agent.tool_call_args",fF="gcp.vertex.agent.tool_response",vv="gcp.vertex.agent.llm_request",bv="gcp.vertex.agent.llm_response",QiA="execute_tool",uiA="generate_content",WGA="content",ZGA="parts",XGA="functionResponse",fiA=t=>{let e=Ye(gA({},t),{attributes:gA({},t.attributes)}),A=t?.attributes?.[vv]??$GA(t),i=t?.attributes?.[bv]??iKA(t);return A!==void 0&&(e.attributes[vv]=A),i!==void 0&&(e.attributes[bv]=i),e},$GA=t=>t.name.startsWith(QiA)?t.attributes?.[uF]:t.name.startsWith(uiA)?piA(t.logs):void 0,AKA=t=>{let e=eKA(t),A=piA(t);return JSON.stringify({system_message:e,user_message:pF(A)})},piA=t=>{if(!t)return;let e=t.reverse().find(tKA);if(!e)return;let A=typeof e.body=="string"?pF(e.body):e.body;return typeof A=="string"?A:(A.content.role="user",A.contents=[A.content],delete A.content,JSON.stringify(A))},eKA=t=>{if(!t)return;let e=t.reverse().find(A=>A.event_name==="gen_ai.system.message");if(e)return typeof e.body=="string"?pF(e.body):e.body},tKA=t=>{if(t.event_name!=="gen_ai.user.message")return!1;try{let A=(typeof t.body=="string"?JSON.parse(t.body):t.body)[WGA]?.[ZGA];return Array.isArray(A)?A.every(i=>!i[XGA]):!1}catch(e){return!1}},iKA=t=>t.name.startsWith(QiA)?t.attributes?.[fF]:t.name.startsWith(uiA)?miA(t.logs):void 0,miA=t=>{if(!t)return;let e=t.reverse().find(A=>A.event_name==="gen_ai.choice");if(e)return nKA(e)},pF=t=>{try{return JSON.parse(t)}catch(e){return t}},nKA=t=>typeof t.body=="string"?t.body:JSON.stringify(t.body),wiA=t=>{let e=t[vv]??oKA(t),A=t[bv]??aKA(t),i=gA({},t);return e!==void 0&&(i[vv]=e),A!==void 0&&(i[bv]=A),i},oKA=t=>{if(uF in t)return`${t[uF]}`;if(t.logs)return AKA(t.logs)},aKA=t=>{if(fF in t)return`${t[fF]}`;if(t.logs)return miA(t.logs)};var Mv=class t{constructor(e){this.http=e}apiServerDomain=Dr.getApiServerBaseUrl();getEventTrace(e){let A=this.apiServerDomain+`/debug/trace/${e.id}`;return this.http.get(A).pipe(we(n=>wiA(n)))}getTrace(e){let A=this.apiServerDomain+`/debug/trace/session/${e}`;return this.http.get(A).pipe(we(n=>Array.isArray(n)?n.map(fiA):n))}getEvent(e,A,i,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/events/${n}/graph`;return this.http.get(o)}static \u0275fac=function(A){return new(A||t)(Lo(fr))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Sv=class t{route=w(Vs);constructor(){}isImportSessionEnabled(){return ne(!0)}isEditFunctionArgsEnabled(){return this.route.queryParams.pipe(we(e=>e[eJ]==="true"))}isSessionUrlEnabled(){return ne(!0)}isA2ACardEnabled(){return this.route.queryParams.pipe(we(e=>e[tJ]==="true"))}isApplicationSelectorEnabled(){return ne(!0)}isAlwaysOnSidePanelEnabled(){return ne(!1)}isTraceEnabled(){return ne(!0)}isArtifactsTabEnabled(){return ne(!0)}isEvalEnabled(){return ne(!0)}isEvalV2Enabled(){return this.route.queryParams.pipe(we(e=>e[nJ]==="true"))}isTestsEnabled(){return this.route.queryParams.pipe(we(e=>e[iJ]==="true"))}isTokenStreamingEnabled(){return ne(!0)}isMessageFileUploadEnabled(){return ne(!0)}isManualStateUpdateEnabled(){return ne(!0)}isBidiStreamingEnabled(){return ne(!0)}isExportSessionEnabled(){return ne(!0)}isEventFilteringEnabled(){return ne(!1)}isDeleteSessionEnabled(){return ne(!0)}isLoadingAnimationsEnabled(){return ne(!0)}isSessionsTabReorderingEnabled(){return ne(!1)}isSessionFilteringEnabled(){return ne(!1)}isSessionReloadOnNewMessageEnabled(){return ne(!1)}isUserIdOnToolbarEnabled(){return ne(!0)}isDeveloperUiDisclaimerEnabled(){return ne(!0)}isFeedbackServiceEnabled(){return ne(!1)}isInfinityMessageScrollingEnabled(){return ne(!1)}isMoreOptionsButtonHidden(){return ne(!1)}isNewSessionButtonEnabled(){return ne(!0)}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var kv=class t{sendFeedback(e,A,i){return ne(void 0)}getFeedback(e,A){return ne(void 0)}deleteFeedback(e,A){return ne(void 0)}getPositiveFeedbackReasons(){return ne([])}getNegativeFeedbackReasons(){return ne([])}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var rKA=(()=>{var t=import.meta.url;return function(e={}){var A,i=e,n,o,a=new Promise((D,M)=>{n=D,o=M});i.agerrMessages=[],i.stderrMessages=[],h=D=>i.stderrMessages.push(D);var r=Object.assign({},i),s="./this.program",l=(D,M)=>{throw M},g="",C,I;typeof document<"u"&&document.currentScript&&(g=document.currentScript.src),t&&(g=t),g.startsWith("blob:")?g="":g=g.substr(0,g.replace(/[?#].*/,"").lastIndexOf("/")+1),C=D=>fetch(D,{credentials:"same-origin"}).then(M=>M.ok?M.arrayBuffer():Promise.reject(new Error(M.status+" : "+M.url)));var d=console.log.bind(console),h=console.error.bind(console);Object.assign(i,r),r=null;var E;function f(D){for(var M=atob(D),R=new Uint8Array(M.length),V=0;VD.startsWith(Je);function YA(){var D="data:application/octet-stream;base64,AGFzbQEAAAABmAd0YAJ/fwF/YAF/AGABfwF/YAN/f38Bf2ACf38AYAN/f38AYAR/f39/AX9gBH9/f38AYAV/f39/fwF/YAZ/f39/f38Bf2AFf39/f38AYAZ/f39/f38AYAh/f39/f39/fwF/YAAAYAABf2AHf39/f39/fwF/YAF8AXxgAn9/AXxgAX8BfGAHf39/f39/fwBgA39/fwF8YAd/f39/fHx/AGACf3wAYAR8fHx/AXxgAnx8AXxgA398fABgBX9+fn5+AGAEf39/fABgCn9/f39/f39/f38Bf2ADf35/AX5gBH9/fHwBf2ADfHx8AXxgCX9/f39/f39/fwBgA39/fgBgAAF8YAR/f39/AXxgAn9/AX5gBX9/f39+AX9gA39/fgF/YAp/f39/f39/f39/AGAEf35+fwBgBH9/fH8AYAJ/fgBgAnx/AXxgBH9/f3wBf2ABfwF+YAJ/fgF/YAJ/fAF/YAN8fH8BfGADf3x/AGAIf39/f39/f38AYAV/f39/fAF/YAt/f39/f39/f39/fwF/YAN/f3wAYAV/f35/fwBgBH9/fH8Bf2AAAX5gB39/f398f38Bf2AFf39/f3wAYAN/f3wBf2ADf35/AX9gAn19AX1gBH9/fX8AYAZ/fHx8fHwBfGADf39/AX5gDH9/f39/f39/f39/fwF/YAV/f3x/fwF/YAd/f398fH9/AGAGf39/fH9/AGAGf39/f35/AX9gD39/f39/f39/f39/f39/fwBgBH9/f38BfmAGf3x/f39/AX9gB39/f39/fn4Bf2AGf39/f35+AX9gB39/f39+f38Bf2AGf39/f39+AX9gAn5/AGAEf35/fwF/YAR/f3x8AXxgBX9/fH9/AGAJf39/f39/f39/AX9gBH9/fHwAYAR+fn5+AX9gAn99AX9gAn5/AX9gCH9/f398fHx/AGADf31/AGAGf39+fn5/AGABfAF/YAJ+fgF9YAJ/fQBgBH9/f34BfmAGf31/f39/AGADf3x8AX9gBX9/f3x/AGAFf398fH8AYAZ8fHx/f38AYAJ+fgF8YAJ8fwF/YAR/fHx8AGAGf39/f398AGAEf3x/fwBgBnx8f3x8fwBgB398fHx8fHwAYAV/fHx8fAF/YAF/AX1gA39/fwF9YAN+fn4Bf2AEf35+fgBgBH98f38Bf2AKf3x/f39/f39/fwBg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AgBB9ekDIAJBEGoQIBoQLwALFwBBAUF/IAAgASABEEAiABChAiAARhsLJQEBfyAAKAIsIgBBAEGAASAAKAIAEQMAIgAEfyAAKAIQBUEACws0AQF/AkAgACABEOYBIgFFDQAgACgCLCIAIAFBCCAAKAIAEQMAIgBFDQAgACgCECECCyACC28BAX8jAEEgayIDJAAgA0IANwMYIANCADcDECADIAI2AgwCQCADQRBqIAEgAhCzCiIBQQBIBEAgA0H8gAsoAgAQswU2AgBBioAEIAMQNwwBCyAAIANBEGoiABCNBSABEKECGiAAEFwLIANBIGokAAszAQF/IAIEQCAAIQMDQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQQFrIgINAAsLIAALJAEBfyMAQRBrIgMkACADIAI2AgwgACABIAIQzQsgA0EQaiQAC6QBAQN/IwBBEGsiAiQAAkAgABAtIgMgACgCAEEDcSAAKQMIEOgJIgEEfyABKAIYBUEACyIBDQAgAygCTCIBKAIAKAIMIgMEQCABKAIIIAAoAgBBA3EgACkDCCADESYAIgENAQtBACEBIAAoAgBBA3FBAkYNACACIAApAwg3AwggAkElNgIAQfDdCiEBQfDdCkEgQeAXIAIQtAEaCyACQRBqJAAgAQsPACAAIAEgAiADQQAQ8QsLQwAgACAAIAGlIAG9Qv///////////wCDQoCAgICAgID4/wBWGyABIAC9Qv///////////wCDQoCAgICAgID4/wBYGwsUACAAECgEQCAALQAPDwsgACgCBAsVACAAEKMBBEAgACgCBA8LIAAQpQMLowEBAn8CQAJAIAAEQCAAKAIIIgMgACgCDCICRgRAIAAgA0EBdEEBIAMbIAEQ/AEgACgCDCECCyACRQ0BIAAoAggiAyACTw0CIAAgACgCBCADaiACcCICIAEQ3wEaIAAgACgCCEEBajYCCCACDwtB0dMBQYm4AUE7QdbDARAAAAtBr5UDQYm4AUHDAEHWwwEQAAALQZoMQYm4AUHEAEHWwwEQAAALJgAgACABEK4HIgFFBEBBAA8LIAAQ7AEoAgwgASgCEEECdGooAgALLgAgAC0ADyIAQQFqQf8BcUERTwRAQbS7A0Gg/ABB3ABB6ZcBEAAACyAAQf8BRwtDACAAIAAgAaQgAb1C////////////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AkHYmQshASAAQdiZC0EYEM4BRQ0CQRgQTyIBRQ0BCyABIAIpAgg3AgAgASACKQIYNwIQIAEgAikCEDcCCAwBC0EAIQELIAJBIGokAEHkmwtBAToAAEHgmwsgATYCACABC60BAgF/An4CQAJAIAAEQCABBEAgAEEAEL8CIgMoAvQDDQIgAykDsAQiBCABQQhrIgEoAgBBCGqtIgVUDQMgAyAEIAV9IgQ3A7AEIAMoAsAEQQJPBEAgA0EtIAUgBCADKQO4BCACEJEECyABIAAoAhQRAQALDwtBsdQBQZ+9AUGKB0GonwEQAAALQbDSAUGfvQFBkQdBqJ8BEAAAC0HjqAFBn70BQZoHQaifARAAAAsJACAAQQAQ2AYLvwoCBX8PfiMAQeAAayIFJAAgBEL///////8/gyEMIAIgBIVCgICAgICAgICAf4MhCiACQv///////z+DIg1CIIghDiAEQjCIp0H//wFxIQcCQAJAIAJCMIinQf//AXEiCUH//wFrQYKAfk8EQCAHQf//AWtBgYB+Sw0BCyABUCACQv///////////wCDIgtCgICAgICAwP//AFQgC0KAgICAgIDA//8AURtFBEAgAkKAgICAgIAghCEKDAILIANQIARC////////////AIMiAkKAgICAgIDA//8AVCACQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQogAyEBDAILIAEgC0KAgICAgIDA//8AhYRQBEAgAiADhFAEQEKAgICAgIDg//8AIQpCACEBDAMLIApCgICAgICAwP//AIQhCkIAIQEMAgsgAyACQoCAgICAgMD//wCFhFAEQCABIAuEQgAhAVAEQEKAgICAgIDg//8AIQoMAwsgCkKAgICAgIDA//8AhCEKDAILIAEgC4RQBEBCACEBDAILIAIgA4RQBEBCACEBDAILIAtC////////P1gEQCAFQdAAaiABIA0gASANIA1QIgYbeSAGQQZ0rXynIgZBD2sQsQFBECAGayEGIAUpA1giDUIgiCEOIAUpA1AhAQsgAkL///////8/Vg0AIAVBQGsgAyAMIAMgDCAMUCIIG3kgCEEGdK18pyIIQQ9rELEBIAYgCGtBEGohBiAFKQNIIQwgBSkDQCEDCyADQg+GIgtCgID+/w+DIgIgAUIgiCIEfiIQIAtCIIgiEyABQv////8P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AQRAIAEoAgQiAkUNAQNAIAEgAigCADYCBCACIAE2AgAgAiIBKAIEIgINAAsgBCABNgIADAELCyAAKAIIIQULIAAgAzYCDCAAIAVBgCByNgIIIAMLoQEBAn8CQCAAECVFIAIgAWtBBUhyDQAgASACEJYFIAJBBGshBCAAEEYiAiAAECVqIQUCQANAAkAgAiwAACEAIAEgBE8NACAAQQBMIABB/wBOckUEQCABKAIAIAIsAABHDQMLIAFBBGohASACIAUgAmtBAUpqIQIMAQsLIABBAEwgAEH/AE5yDQEgAiwAACAEKAIAQQFrSw0BCyADQQQ2AgALC4QBAQJ/IwBBEGsiAiQAIAAQowEEQCAAKAIAIAAQ9gIaEKEFCyABECUaIAEQowEhAyAAIAEoAgg2AgggACABKQIANwIAIAFBABDTASACQQA6AA8gASACQQ9qENIBAkAgACABRiIBIANyRQ0ACyAAEKMBIAFyRQRAIAAQpQMaCyACQRBqJAALUAEBfgJAIANBwABxBEAgASADQUBqrYYhAkIAIQEMAQsgA0UNACACIAOtIgSGIAFBwAAgA2utiIQhAiABIASGIQELIAAgATcDACAAIAI3AwgLzgkCBH8EfiMAQfAAayIGJAAgBEL///////////8AgyEJAkACQCABUCIFIAJC////////////AIMiCkKAgICAgIDA//8AfUKAgICAgIDAgIB/VCAKUBtFBEAgA0IAUiAJQoCAgICAgMD//wB9IgtCgICAgICAwICAf1YgC0KAgICAgIDAgIB/URsNAQsgBSAKQoCAgICAgMD//wBUIApCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhBCABIQMMAgsgA1AgCUKAgICAgIDA//8AVCAJQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQQMAgsgASAKQoCAgICAgMD//wCFhFAEQEKAgICAgIDg//8AIAIgASADhSACIASFQoCAgICAgICAgH+FhFAiBRshBEIAIAEgBRshAwwCCyADIAlCgICAgICAwP//AIWEUA0BIAEgCoRQBEAgAyAJhEIAUg0CIAEgA4MhAyACIASDIQQMAgsgAyAJhFBFDQAgASEDIAIhBAwBCyADIAEgASADVCAJIApWIAkgClEbIggbIQogBCACIAgbIgxC////////P4Mh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9ANFBEAgAykDsAQiIkKAgICAEH1CkHtaDQEgAyAiQvAEfCIiNwOwBCADKALABEECTwRAIANBK0LwBCAiIAMpA7gEIiMgIlQEfiADICI3A7gEICIFICMLQZ8LEJEECyACQRA2ApwDIAJBADYCKCACQQA2AhAgAiABQYACQakLEJgBIgM2AqgDIANFBEAgASABQasLEGdBAAwFCyACIAFBgAhBtgsQmAEiAzYCQCADRQRAIAEgAigCqANBuAsQZyABIAFBvAsQZwwECyACIANBgAhqNgJEQQAiBkUEQCABQbwBQcw6EJgBIgZFDQMgBkIANwJQIAZCADcCaCAGIAE2AmQgBiABNgJ8IAZCADcCCCAGQQA6AAQgBkIANwIcIAZBADoAGCAGIAE2AhAgBkEANgIAIAZCADcCMCAGQQA6ACwgBiABNgIkIAZBADYCFCAGQQA2AmAgBkIANwJYIAZCADcCcCAGQQA2AnggBkIANwJEIAZBADoAQCAGIAE2AjggBkEANgIoIAZBADYCPCAGIAE2AkwgBkIANwKMASAGQQA6AIgBIAZCATcCgAEgBiABNgKUASAGQgA3ApgBIAZBADoAoAEgBkIANwKkASAGQgA3AqwBIAZCADcCtAELIAJBADYCmAMgAiAGNgKEAyACQQA2ApADIAJBADYC0AIgAkEANgLIAiACQQA2AsACIAJCADcD8AMgAkEhOgD4AyACQQA2AogCIAJBADYCkAEgAkEAOwH8ASACQgA3AsADIAJBADYC+AEgAkIANwKsAyACIAE2AtQDIAJCADcCyAMgAkEANgLQAyACQQA6ALQDIAJBADYC6AMgAkIANwLgAyACQgA3AtgDIAIgATYC7AMgAUHPATYCoAIgAUGbATYCiAIgAUEANgKcAiABQoCAgIAQNwKUAiAFBEBBACEGA0AgBSAGaiAGQQFqIQYtAAANAAsgASAGQYjCABCYASIDBEAgAyAFIAYQHxoLIAEgAzYC8AELIAFBADYCgAMgAUGgAWogAUGcAWpBABDBBhogAUIANwMAIAFBQGtBAEHAABA4GiABQgA3AowBIAFBADYChAEgAUIANwKUASABQgA3A7ADIAFBADYCNCABQQE6ADAgAUEANgIsIAFCADcCJCABQQA2AsQCIAFBADYCvAIgAUIANwKkAiABQgA3AqwCIAFBADYCtAIg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akECED0MGgUgESADQQR0IhJqIhQgASASaiISKQMANwMAIBQgEikDCDcDCCADQQFqIQMMAQsACwALIAJBAmoiA0EQEBoiAiABKQMINwMIIAIgASkDADcDACACIBApAyA3AxAgAiAQKQMoNwMYIAIgECsDICAQKwMwIgYgECsDQKFEAAAAAAAACECjIgegOQMgIBArAyghCCAQKwNIIQkgECsDOCEFIAIgBiAHoDkDMCACIAUgBSAJoUQAAAAAAAAIQKMiBaA5AzggAiAIIAWgOQMoQQQgAyADQQRNGyERIAFBIGshE0EEIQEDQCABIBFGBEAgACACIAMgBBBIIAIQGCAPIBApAzg3AyggDyAQKQMwNwMgIA8gECkDKDcDOCAPIBApAyA3AzAgACAPQSBqQQIQPQwZBSACIAFBBHQiEmoiFCASIBNqIhIpAwA3AwAgFCASKQMINwMIIAFBAWohAQwBCwALAAsgAkEDaiIDQRAQGiICIAFBCGopAwA3AwggAiABKQMANwMAIAIgASsDACIFIAUgECsDEKEiBkQAAAAAAADQv6KgOQMQIAErAwghCCAQKwNIIQkgAiAQKwM4Igc5AzggAiAFIAZEAAAAAAAAAsCioDkDMCACIAUgBiAGoKE5AyAgAiAIIAcgCaFEAAAAAAAACECjoCIFOQMoIAIgBTkDGCAQKwMwIQUgAiAHOQNIIAIgBTkDQEEEIAMgA0EETRshESABQTBrIRNBBCEBA0AgASARRgRAIAAgAiADIAQQSCACEBgMGAUgAiABQQR0IhJqIhQgEiATaiISKQMANwMAIBQgEikDCDcDCCABQQFqIQEMAQsACwALIAJBBEcNG0EGQRAQGiICIAEpAwg3AwggAiABKQMANwMAIAIgECkDKDcDGCACIBApAyA3AxAgAiAQKQNINwMoIAIgECkDQDcDICACIAEpAyg3AzggAiABKQMgNwMwIAIgECkDgAE3A0AgAiAQKQOIATcDSCACIBApA6ABNwNQIAIgECkDqAE3A1ggACACQQYgBBBIIAIQGCAPIBArAxAgECsDsAEgECsDAKGgOQMgIA8gECsDGCAQKwO4ASAQKwMIoaA5AyggDyAQKQNINwM4IA8gECkDQDcDMCAAIA9BIGoiAUECED0gDyAQKQOIATcDOCAPIBApA4ABNwMwIAAgAUECED0gDyAQ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AgsgACABNwMAIAAgAjcDCAvbAQIBfwJ+QQEhBAJAIABCAFIgAUL///////////8AgyIFQoCAgICAgMD//wBWIAVCgICAgICAwP//AFEbDQAgAkIAUiADQv///////////wCDIgZCgICAgICAwP//AFYgBkKAgICAgIDA//8AURsNACAAIAKEIAUgBoSEUARAQQAPCyABIAODQgBZBEAgACACVCABIANTIAEgA1EbBEBBfw8LIAAgAoUgASADhYRCAFIPCyAAIAJWIAEgA1UgASADURsEQEF/DwsgACAChSABIAOFhEIAUiEECyAECxYAIABFBEBBAA8LQfyACyAANgIAQX8LCwAgACABIAIRAAALZAECfyMAQRBrIgMkAAJAIABBABCxAiIARQ0AAkACQAJAAkAgAQ4EAAECAgMLIAAoAhAhAgwDCyAAKAIIIQIMAgsgACgCDCECDAELIAMgATYCAEHExQQgAxA3CyADQRBqJAAgAgukAQIDfwJ8IwBBEGsiAiQAIAAQwQIgACgCECIBKwMYRAAAAAAAAFJAoyEEIAErAxBEAAAAAAAAUkCjIQUgABAcIQEDQCABBEAgASgCECgClAEiAyADKwMAIAWhOQMAIAMgAysDCCAEoTkDCCAAIAEQHSEBDAELCyACIAAoAhAiASkDGDcDCCACIAEpAxA3AwAgACACEMAMIABBARDKBSACQRBqJAALDwAgAUEBaiAAIAAQqgGfC6gBAgR/AnwgASgCACECIABBBGoiAyEAIAMhAQNAIAAoAgAiAARAIAAoAhAiBCsDCCIGIAIrAwgiB2MEQCAAQQRqIQAMAgUgACABIAAgAiAESyIEGyAGIAdkIgUbIQEgACAAIARBAnRqIAUbIQAMAgsACwsCQAJAIAEgA0YNACACKwMIIgYgASgCECIAKwMIIgdjDQAgACACTSAGIAdkcg0BCyADIQELIAELZAEBfyMAQRBrIgQkACAAQQA7ARwgAEEANgIYIAAgAzkDCCAAIAI2AgQgACABNgIAIAQgADYCDCABQTRqIARBDGoQwAEgACgCBCAEIAA2AghBKGogBEEIahDAASAEQRBqJAAgAAs8ACAAIAEQ0gIEQCAAEMMEDwsgABD9ByIBRQRAQQAPCyAAIAEQ/AchACABEG0gACAALQAkQQNyOgAkIAALrAEBAX8CQCAAECgE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IAUgBCsDCDkDECAFQShqIAMgFiAUIAsRHgBFBEAgBUIANwNYIAUgAzYCACAFIAc2AhggB0EBaiEHIAAgAxAdIQMMAQsLQZj/CigCABAYQZj/CkEANgIAENcMDAILQQAhByACQbADakEAQdAAEDgaIAUEQEGY/wooAgAhBET////////vfyEURP///////+//IRhE////////7/8hG0T////////vfyEZA0AgBSAHRgRARJqZmZmZmak/IRYCQCAAQdLkABAnIgBFDQAgAC0AAEUNACAAEK4CIRYLQbD/CiAbIBsgGaEgFqIiE6AiFzkDAEG4/wogGSAToSIVOQMAQaj/CiAUIBggFKEgFqIiE6EiFDkDAEGg/wogGCAToCITOQMAIAIgFTkD2AMgAiAXOQPoAyACIBU5A7gDIAIgEzkD0AMgAiAXOQPIAyACIBQ5A/ADIAIgEzkDwAMgAiAUOQPgAyABKAIAIQBBABDQByELAkACQCAAQQJGBEAgC0UNAiACQbADahDWDEEAIQMDQEGY/wooAgAhAUHk/gooAgAhAEEAIQQDQCAAIARHBEAgASAEQeAAbGoiCyALKwMIRM3MzMzMzPA/ojkDCCALIAsrAxBEzczMzMzM8D+iOQMQIARBAWohBAwBCwsgA0EBaiIDENAHDQALQezaCi0AAEUNASACIAM2AhBBiPYIKAIAQezdAyACQRBqECAaDAELIAtFDQEgAkGwA2oQ1gxBACEHQQAhBANAIAJBsANqIgEhACAHBEAgABDUDAtB+P4KQv////////93NwMAQfD+CkL/////////9/8ANwMAAkBB5P4KKAIAIgUEQCAAKAIAIQZE////////738hFET////////v/yEWQQAhAANAIAAgBUYNAkHw/gogFCAGIABBAnRqKAIAIgMrAwAQKSIUOQMAQfj+CiAWIAMrAwAQIyIWOQMAIABBAWohAAwACwALQeGVA0H8twFBzwFBzJIBEAAAC0GA/wogBigCACsDCDkDACAGIAVBAnRqQQRrKAIAKwMIIRNBkP8KIBYgFKE5AwBBiP8KIBM5AwBEAAAAAAAAAAAhFUQAAAAAAAAAACEUIwBBMGsiDiQAQQFBEBAaIg9B6P4KKAIAQQJ0IgA2AgQgDyAAQSgQGjYCAEHA/wogARDNBTYCACAOQgA3AyggDkIANwMg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AmRBByAHLwGMAkECdkEBcSAHKALoASAHKAL4ASAHKAKIAiAHKALcAUEAENoEIAAgCSgCECgCaEEGIAcvAYwCQQF2QQFxIAcoAuQBIAcoAvQBIAcoAoQCIAcoAtwBQQAQ2gQCQCAAKAI8IgFFDQAgASgCRCIBRQ0AIAAgAREBAAsgABCMBCAaEOwCIBoQGBAYCyACQeAVaiQADwtBsIMEQcIAQQFBiPYIKAIAEDoaEDsAC84GAQJ/IwBBgAJrIgMkACADQdABaiIEQYi/CEEwEB8aIAFCADcCAAJAAkACQAJAIAAgBBDeBA0AIAMoAtgBQQJJDQAgAyADKQPYATcDyAEgAyADKQPQATcDwAEgAygC0AEgA0HAAWpBABAZQRhsaigCAA0BC0EAIQBBACEBA0AgASADKALYAU8NAiADIAMpA9gBNwMgIAMgAykD0AE3AxggA0EYaiABEBkhAgJAAkAgAygC4AEiBA4CAQUACyADIAMoAtABIAJBGGxqIgIpAwg3AwggAyACKQMQNwMQIAMgAikDADcDACADIAQRAQALIAFBAWohAQwACwALIAMoAtgBQQNPBEBB95gEQQAQKgsgAyADKQPYATcDuAEgAyADKQPQATcDsAEgASADKALQASADQbABakEAEBlBGGxqKAIAEGQ2AgAgAyADKQPYATcDqAEgAyADKQPQATcDoAEgAygC0AEgA0GgAWpBARAZQRhsaigCAARAIAMgAykD2AE3A5gBIAMgAykD0AE3A5ABIAEgAygC0AEgA0GQAWpBARAZQRhsaigCABBkNgIECyADIAMpA9gBNwOIASADIAMpA9ABNwOAASADKALQASEBIANBgAFqQQAQGSEEIAMoAtABIQAgAgJ8IAEgBEEYbGotABBBAUYEQCADIAMpA9gBNwNYIAMgAykD0AE3A1AgACADQdAAakEAEBlBGGxqKwMIDAELIAMgAykD2AE3A3ggAyADKQPQATcDcEQAAAAAAAAAACAAIANB8ABqQQEQGUEYbGotABBBAUcNABogAyADKQPYATcDaCADIAMpA9ABNwNgRAAAAAAAAPA/IAMoAtABIANB4ABqQQEQGUEYbGorAwihCzkDAEEAIQFBASEAA0AgASADKALYAU8NASADIAMpA9gBNwNIIAMgAykD0AE3A0AgA0FAayABEBkhAgJAAkAgAygC4AEiBA4CAQQACyADIAMoAtABIAJBGGxqIgIpAwg3AzAgAyACKQMQNwM4IAMgAikDADcDKCADQShqIAQRAQALIAFBAWohAQwACwALIANB0AFqIgFBGBAxIAEQNCADQYACaiQAIAAPC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALrwEBAX8gACgCECIBRQRAQaT1AEGEuQFBiAFB0pEBEAAACyABKALcARAYIAEoAtgBEBggASgC4AEQGCABKALkARAYIAEoAugBEBggASgC7AEQGCABKALwARAYIAEoAvQBEBggASgC+AEQGCABKAL8ARAYIAEoAoACEBggASgChAIQGCABKAKIAhAYIAEoApgCEBggASgCpAIQGCABKAKgAhAYIAAgASgCADYCECABEBgLngEBAn9BuAIQxgMiASAAKAIQIgI2AgAgACABNgIQIAIEQCABQRBqIAJBEGpBKBAfGiABQThqIAJBOGpBKBAfGiABIAIoApgBNgKYASABIAIoApwBNgKcASABIAIrA6ABOQOgASABIAIoAogBNgKIASABQeAAaiACQeAAakEoEB8aIAEPCyABQoCAgICAgID4PzcDoAEgAUIDNwOYASABC6AGAQV/IwBBMGsiAyQAA0BBgOAKKAIAIAJNBEACQEH43wpBEBAxQZDgCiAAKAIAIgQpAwA3AwBBmOAKIAQpAwg3AwBB+N8KQRAQJiECQfjfCigCACACQQR0aiICQZDgCikDADcDACACQZjgCikDADcDCEGQ4AogBCkDADcDAEGY4AogBCkDCDcDAEH43wpBEBAmIQJB+N8KKAIAIAJBBHRqIgJBkOAKKQMANwMAIAJBmOAKKQMANwMIQQIgACgCBCIAIABBAk0bQQFrIQZBASECA0AgAiAGRg0BQZDgCiAEIAJBBHRqIgApAwA3AwBBmOAKIAApAwg3AwBB+N8KQRAQJiEFQfjfCigCACAFQQR0aiIFQZDgCikDADcDACAFQZjgCikDADcDCEGQ4AogACkDADcDAEGY4AogACkDCDcDAEH43wpBEBAmIQVB+N8KKAIAIAVBBHRqIgVBkOAKKQMANwMAIAVBmOAKKQMANwMIQZDgCiAAKQMANwMAQZjgCiAAKQMINwMAQfjfCkEQECYhAEH43wooAgAgAEEEdGoiAEGQ4AopAwA3AwAgAEGY4AopAwA3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qgIgA0EAOgAHIAIgBGogA0EHahDSASADQRBqJAAMAQsQygEACyAFQRBqJAALFwAgACADNgIQIAAgAjYCDCAAIAE2AggLDQAgACABIAJBARCiBwsSACAAIAEgAkL/////DxCwBacLzAEBA38jAEEgayIDQgA3AxggA0IANwMQIANCADcDCCADQgA3AwAgAS0AACICRQRAQQAPCyABLQABRQRAIAAhAQNAIAEiA0EBaiEBIAMtAAAgAkYNAAsgAyAAaw8LA0AgAyACQQN2QRxxaiIEIAQoAgBBASACdHI2AgAgAS0AASECIAFBAWohASACDQALAkAgACIBLQAAIgJFDQADQCADIAJBA3ZBHHFqKAIAIAJ2QQFxRQ0BIAEtAAEhAiABQQFqIQEgAg0ACwsgASAAawuAAQEEfyAAIABBPRC0BSIBRgRAQQAPCwJAIAAgASAAayIEai0AAA0AQYiBCygCACIBRQ0AIAEoAgAiAkUNAANAAkAgACACIAQQ6gFFBEAgASgCACAEaiICLQAAQT1GDQELIAEoAgQhAiABQQRqIQEgAg0BDAILCyACQQFqIQMLIAMLTgEBf0EBQRwQGiIGIAU6ABQgBiAAIAEQrAE2AggCfyADBEAgACACENUCDAELIAAgAhCsAQshBSAGIAA2AhggBiAENgIQIAYgBTYCDCAGCwkAIAC9QjSIpwuZAQEDfCAAIACiIgMgAyADoqIgA0R81c9aOtnlPaJE65wriublWr6goiADIANEff6xV+Mdxz6iRNVhwRmgASq/oKJEpvgQERERgT+goCEFIAAgA6IhBCACRQRAIAQgAyAFokRJVVVVVVXFv6CiIACgDwsgACADIAFEAAAAAAAA4D+iIAQgBaKhoiABoSAERElVVVVVVcU/oqChC5IBAQN8RAAAAAAAAPA/IAAgAKIiAkQAAAAAAADgP6IiA6EiBEQAAAAAAADwPyAEoSADoSACIAIgAiACRJAVyxmgAfo+okR3UcEWbMFWv6CiRExVVVVVVaU/oKIgAiACoiIDIAOiIAIgAkTUOIi+6fqovaJExLG0vZ7uIT6gokStUpyAT36SvqCioKIgACABoqGgoAuNAQAgACAAIAAgACAAIABECff9DeE9Aj+iRIiyAXXg70k/oKJEO49otSiCpL+gokRVRIgOVcHJP6CiRH1v6wMS1tS/oKJE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EC4BmgFsrHwhEAwBCwsgAkEBaiECDAALAAtBACEAA0AgDCAAQQJ0aigCACICBEAgCCACQVBBACACKAIAQQNxQQJHG2ooAigoAhAoAvgBIgVBAnRqIgogCigCACACKAIQLgGaAWo2AgAgBSABIAEgBUgbIQEgAEEBaiEADAELCyADQQFqIQMMAQsACwALIAZBEGokACARDwsgECARfCERDAALAAuDAQECfyAAIAFBARCNASIBKAIQQQA2AsQBQQUQnwghAiABKAIQIgNBADYCzAEgAyACNgLAAUEFEJ8IIQIgASgCECIDIAI2AsgBQdz9CigCACICIAAgAhsoAhBBuAFBwAEgAhtqIAE2AgAgAyACNgK8AUHc/QogATYCACADQQA2ArgBIAELuQEBA38gACAAQTBqIgIgACgCAEEDcUEDRhsoAigoAhAiASgC4AEgASgC5AEiAUEBaiABQQJqENoBIQEgACACIAAoAgBBA3FBA0YbKAIoKAIQIAE2AuABIAAgAiAAKAIAQQNxQQNGGygCKCgCECIBIAEoAuQBIgNBAWo2AuQBIAEoAuABIANBAnRqIAA2AgAgACACIAAoAgBBA3FBA0YbKAIoKAIQIgAoAuABIAAoAuQBQQJ0akEANgIACyAAIAAgASACIABBp4cBECciAAR/IAAQkQIFQR4LEP8OC00AIAEoAhBBwAFqIQEDQCABKAIAIgEEQCABKAIQKAKYAhAYIAEoAhAoAqACEBggASgCECIBQQA2ArABIAFBuAFqIQEMAQUgABD4DgsLCz8BAn8gACgCECgCqAIhAANAIAAiASgCDCIARSAAIAFGckUEQCAAKAIMIgJFDQEgASACNgIMIAIhAAwBCwsgAQsLACAAIAFBARCFDwsLACAAIAFBABCFDwuGAQECfwJAIAAgASkDCBC/A0UNACAAEDkgAEYEQCAAIAEQbiECA0AgAgRAIAAgAiABEHIgACACEI0GIQIMAQsLIAAtABhBIHEEQCABEMcLCyAAIAEQzwcgARCzByAAQQEgASkDCBC/BgsgACABQRJBAEEAEMgDDQAgABA5IABGBEAgARAYCwsLgwEBA38jAEEgayIBJAAgACgCECICKAIMIgNBDE8EQCABQeQANgIUIAFBibwBNgIQQYj2CCgCAEHYvwQgAUEQahAgGhA7AAsgASACKAIINgII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ACAAIAEQRSIBRQ0AIAEtAABFDQAgACABIAEQdkEAR0EAIAcgAiADENsCIQEgACgCECABNgJ8IAAQLSgCECIBIAEtAHFBEHI6AHELIABBgNwKKAIAQQBBABBiIQEgACgCECICQf8BIAEgAUH/AU4bOgCgASAAIAIoAggoAgQoAgARAQALRAACQCAAECgEQCAAECRBD0YNAQsgAEEAEH8LAkAgABAoBEAgAEEAOgAPDAELIABBADYCBAsgABAoBH8gAAUgACgCAAsLlAYBBH8jAEGQAWsiASQAAkACQCAARQ0AIAAtAABFDQBB8NoKKAIAIgMEQEG+3gotAAANASABIAM2AnBB/vkEIAFB8ABqECpBvt4KQQE6AAAMAQtBwN4KKAIAIQMCQEHk2gooAgAEQCADDQEDQEHM3gooAgAgAk0EQEHE3gpBCBAxQcTeChA0QcDeCkHk2gooAgAiAjYCACABQfQAaiACEP4JQdzeCiABKAKMATYCAEHU3gogASkChAE3AgBBzN4KIAEpAnw3AgBBxN4KIAEpAnQ3AgAMAwUgAUHM3gopAgA3A0ggAUHE3gopAgA3A0AgAUFAayACEBkhAwJAAkBB1N4KKAIAIgQOAgEHAAsgAUHE3gooAgAgA0EDdGopAgA3AzggAUE4aiAEEQEACyACQQFqIQIMAQsACwALAkAgA0Ho2gooAgBGDQADQEHM3gooAgAgAk0EQEHE3gpBCBAxQcTeChA0QcDeCkHo2gooAgAiAjYCACACRQ0CIAItAABFDQIgAUH0AGogAhD+CUHc3gogASgCjAE2AgBB1N4KIAEpAoQBNwIAQczeCiABKQJ8NwIAQcTeCiABKQJ0NwIABSABQczeCikCADcDMCABQcTeCikCADcDKCABQShqIAIQGSEDAkACQEHU3gooAgAiBA4CAQcACyABQcTeCigCACADQQN0aikCADcDICABQSBqIAQRAQALIAJBAWohAgwBCwsLAkAgAC0AAEEvRg0AQczeCigCAEUNACABQdzeCigCADYCGCABQdTeCikCADcDECABQczeCikCADcDCCABQcTeCikCADcDACABIAAQ/QkhAgwCCyAAIQIMAQtBACECA0AgAkEDRwRAIAAgAkH54gFqLAAAIAAQQEEBahDkCyIDQQFqIAAgAxshACACQQFqIQIMAQsLIAFB3N4K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AUEHcXRyOgAADwtBl7IDQe/6AEHRAEHfIRAAAAtQAQF/IAEoAhAoApwBRQRAQQAPCyAAIAFBMEEAIAEoAgBBA3FBA0cbaigCKBDDDgR/IAAgAUFQQQAgASgCAEEDcUECRxtqKAIoEMMOBUEACws1AQJ/AkAgABAcIgFFBEAMAQsgARCGAiECA0AgACABEB0iAUUNASACIAEQnggaDAALAAsgAguGAwEDfyABIAFBMGoiAyABKAIAQQNxQQNGGygCKCgCECICKALQASACKALUASICQQFqIAJBAmoQ2gEhAiABIAMgASgCAEEDcUEDRhsoAigoAhAgAjYC0AEgASADIAEoAgBBA3FBA0YbKAIoKAIQIgIgAigC1AEiBEEBajYC1AEgAigC0AEgBEECdGogATYCACABIAMgASgCAEEDcUEDRhsoAigoAhAiAygC0AEgAygC1AFBAnRqQQA2AgAgASABQTBrIgMgASgCAEEDcUECRhsoAigoAhAiAigC2AEgAigC3AEiAkEBaiACQQJqENoBIQIgASADIAEoAgBBA3FBAkYbKAIoKAIQIAI2AtgBIAEgAyABKAIAQQNxQQJGGygCKCgCECICIAIoAtwBIgRBAWo2AtwBIAIoAtgBIARBAnRqIAE2AgAgASADIAEoAgBBA3FBAkYbKAIoKAIQIgEoAtgBIAEoAtwBQQJ0akEANgIAIAAoAhBBAToA8AEgABBhKAIQQQE6APABC4ABAQJ/QcABIQMgACECA0AgAigCECADaigCACICBEBBuAEhAyABIAJHDQELCyACBEAgASgCECICKAK8ASEBIAIoArgBIgIEQCACKAIQIAE2ArwBCyABIAAgARsoAhBBuAFBwAEgARtqIAI2AgAPC0GbpANBq7oBQb8BQdyfARAAAAsJAEEBIAAQ1AILYQEEfyAAKAIEIQQCQANAIAIgBEYNASACQQJ0IAJBAWohAiAAKAIAIgVqIgMoAgAgAUcNAAsgACAEQQFrIgE2AgQgAyAFIAFBAnQiAWooAgA2AgAgACgCACABakEANgIACwtDAAJAIAAQKARAIAAQJEEPRg0BCyAAEI4PCwJAIAAQKARAIABBADoADwwBCyAAQQA2AgQLIAAQKAR/IAAFIAAoAgALC3QBAn8jAEEgayICJAACQCAArSABrX5CIIhQBEAgACABEE4iA0UNASACQSBqJAAgAw8LIAIgATYCBCACIAA2AgBBiPYIKAIAQabqAyACECAaEC8ACyACIAAgAWw2AhBBiPYIKAIAQfXpAyACQRBqECAaEC8AC7cNAgh/A3wjAEHAAmsiBCQAAkAgABA5IgkgACgCAEEDcSIKQQAQ5QMiBUUNAANAIAVFDQECQCAAIAUQRSIDRQ0AIAMtAABFBEAgBSgCCEHC8AAQPkUNAQsgAUG57QQQGxogASACKAIAEEQgBSgCCCACIAEQuwIgAUGTzQMQGxoCQCACLQAFQQFHDQACQCAFKAIIIgNBwcMBED4NACADQbHDARA+DQAgA0G5wwEQPg0AIANBl8MBED4NACADQajDARA+DQAgA0GfwwEQPkUNAQsgACAFEEUiA0UNASADLQAARQ0BIANBABCQCiIIRQRAIAQgAzYCAEHK+gQgBBAqDAILIAFB7v8EEBsaIAIgAigCACIDQQFqNgIAIAEgAxBEIAFB/s0EEBsaQQAhBwNAIAgoAgAgB00EQCACIAIoAgBBAWs2AgAgAUHu/wQQGxogASACKAIAEEQgAUH+yAEQGxogCBCOCgwDCyAHBEAgAUG57QQQGxoLIAgoAgghAyACIAIoAgAiBkEBajYCACABIAYQRCABQfDYAxAbGiABIAIoAgAQRAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADIAdB0ABsaiIDKAIAIgYOEAoKAAABAQIDBAQGBwsFBQgJCyAEQdAAQfAAIAZBAkYbNgJQIAFB7+wEIARB0ABqEB4gASACKAIAEEQgASADQQhqELQIDAoLIARBwgBB4gAgBkEERhs2AmAgAUHv7AQgBEHgAGoQHiABIAIoAgAQRCABIANBCGoQtAgMCQsgAUGk7QRBABAeIAEgAigCABBEIAEgA0EIahC0CAwICyABQYztBEEAEB4gASACKAIAEEQgAysDCCELIAQgAysDEDkDmAEgBCALOQOQASABQffqBCAEQZABahAeIAEgAigCABBEIARB4wBB8gAgAygCGCIGQQFGG0HsACAGGzYCgAEgAUH87AQgBEGAAWoQHiABIAIoAgAQRCAEIAMrAyA5A3AgAUG76gQgBEHwAGoQHiABIAIoAgAQRCABQdfMAxAbGiADKAIoIAIgARC7AiABQQoQZQwHCyAEQcMAQeMAIAZBCEYbNgKgASABQe/sBCAEQaABahAeIAEgAigCABBEIAFBo+wEQQAQHiABIAIoAgAQRCABQfDMAxAbGiADKAIIIAIgARC7AiABQQoQZQwGCyAEQcMAQeMAIAZBDUYbNgKQAiABQe/sBCAEQZACahAeIAEgAigCABBEAkACQAJAIAMoAggOAgABAgsgAUGj7ARBABAeIAEgAigCABBEIAFB8MwDEBsaIAMoAhAgAiABELsCIAFBChBlDAcLIAFB/esEQQAQHiABIAIoAgAQRCABIAIoAgAQRCADKwMQIQsgBCADKwMYOQOIAiAEIAs5A4ACIAFBo+sEIARBgAJqEB4gASACKAIAEEQgAysDICELIAQgAysDKDkD+AEgBCALOQPwASABQY3rBCAEQfABahAeIAEgAigCABBEIAEgAygCMCADKAI0IAIQkA8MBgsgAUGQ7ARBABAeIAEgAigCABBEIAEgAigCABBEIAMrAxAhCyADKwMYIQwgBCADKwMgOQPgASAEIAw5A9gBIAQgCzkD0AEgAUHV6wQgBEHQAWoQHiABIAIoAgAQRCADKwMoIQsgAysDMCEMIAQgAysDODkDwAEgBCAMOQO4ASAEIAs5A7ABIAFBuesEIARBsAFqEB4gASACKAIAEEQgASADKAJAIAMoAkQgAhCQDwwFCyABQbDtBEEAEB4gASACKAIAEEQgBCADKwMIOQOgAiABQczqBCAEQaACahAeIAEgAigCABBEIAFBjc0DEBsaIAMoAhAgAiABELsCIAFBChBlDAQLIAFBmO0EQQAQHiABIAIoAgAQRCABQYPNAxAbGiADKAIIIAIgARC7AiABQQoQZQwDCyABQfHrBEEAEB4gASACKAIAEEQgBCADKAIINgKwAiABQe7HBCAEQbACahAeDAILIARBsgI2AhQgBEGFuwE2AhBBiPYIKAIAQdi/BCAEQRBqECAaEDsACyAEQeUAQcUAIAYbNgJAIAFB7+wEIARBQGsQHiABIAIoAgAQRCADKwMIIQsgAysDECEMIAMrAxghDSAEIAMrAyA5AzggBCANOQMwIAQgDDkDKCAEIAs5AyAgAUHJygQgBEEgahAeCyACIAIoAgBBAWsiAzYCACABIAMQRCABQa8IEBsaIAdBAWohBwwACwALIAAgBRBFIAIgARC7AgsgCSAKIAUQ5QMhBQwACwALIARBwAJqJAAL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IAM2AgAgAUEgakG4MiABEIQBA0AgAi0AACACQQFqIQINAAtBuqADIQMMAQUgAUEgakEpEH8LCwsgAEGsywMgAUEgahDCARDAAwwACwALIAFBIGoQXCABQTBqJAALaQECfyMAQRBrIgMkACADQgA3AwggA0IANwMAA0ACQCACLQAAIgRB3ABHBEAgBA0BIAAgASADEMIBEHEgAxBcIANBEGokAA8LIANB3AAQfyACLQAAIQQLIAMgBMAQfyACQQFqIQIMAAsAC5ICAQV/IAAQhwUhAyAAECQhAQJAAkACQANAIAEiAkUNASADIAFBAWsiAWotAABBLkcNAAsgABAkIQEDQCABQQFrIQUgASACRwRAIAMgBWotAABBMEcNAgsCQCAAECgEQCAALQAPIgRFDQQgACAEQQFrOgAPDAELIAAgACgCBEEBazYCBAsgASACRyAFIQENAAsgABAkIgFBAkkNACABIANqIgFBAmsiAi0AAEEtRw0AIAFBAWstAABBMEcNACACQTA6AAAgABAoBEAgAC0ADyIBRQ0DIAAgAUEBazoADw8LIAAgACgCBEEBazYCBAsPC0HijwNBoPwAQZIDQegqEAAAC0HijwNBoPwAQagDQegqEAAAC8cBAQN/IwBBEGsiAiQAIAFBUEEAIAEoAgBBA3FBAkcbaiIBQVBBACABKAIAQQNxIgNBAkcbaigCKCEEIAFBMEEAIANBA0cbaigCKCEDIAIgASkDCDcDCCACIAEpAwA3AwACQCAAIAMgBCACENkCRQ0AIAAQOSAARgRAIAAtABhBIHEEQCABEMcLCyAAIAEQzwcgARCzByAAQQIgASkDCBC/BgsgACABQQ9BAEEAEMgDDQAgABA5IABGBEAgARAYCwsgAkEQaiQACxoAIAAgARCsASIBIAIQwQMgACABQQAQjAEaC0UAIAAgAUG+zgMgAisDAEQAAAAAAABSQKMQjQMgACABQb7OAyADIAIrAwgiA6EgA0G42wotAAAbRAAAAAAAAFJAoxCNAwt9AQN/IwBBMGsiAiQAIAAQISEDIAAQLSEEAkACQCADBEBBfyEAIAQgASADEJIGQX9HDQEMAgsgAiAAKQMINwMAIAJBEGoiA0EeQdTPASACELQBGkF/IQAgASADIAQoAkwoAgQoAgQRAABBf0YNAQtBACEACyACQTBqJAAgAAvN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ABCPATYCuAJBAEHk2wooAgBEAAAAAAAALEBEAAAAAAAA8D8QTCEOIABBnKAKNgLIAiAAIA45A8ACIAAgARAhNgK0ASAAKAKoAhAYIABBADYCqAIgACgCrAIQGCAAQQA2AqwCIAAoArQCEBggAEEANgK0AgJAAkAgAUGqKRAnIgUEQCAAIAFB/doAECciAkG8zgMgAhs2AqACIAAgAUHw2gAQJyICQbqgAyACGyIENgKkAiAAKAKgAiICIAQQyQIgAmoiAkEAIAItAAAbIgIEQCADIAIsAAA2AtACQYLkBCADQdACahAqIABB8f8ENgKkAgsgACAFEGQ2AqgCIANCADcD0AQgA0IANwPIBCADQgA3A8AEIANBwARqQQQQJiECIAMoAsAEIAJBAnRqIAMoAtQENgIAIAAoAqgCIQIDQCACIAAoAqACELEFIgIEQCADIAI2AtQEIANBwARqQQQQJiECIAMoAsAEIAJBAnRqIAMoAtQENgIAQQAhAgwBCwsgAygCyAQiAkEBayIFQQBIDQIgAkECTwRAIANBADYC1AQgA0HABGoiBEEEECYhAiADKALABCACQQJ0aiADKALUBDYCACAEIABBrAJqQQBBBBDHAQtBACECA0AgAygCyAQgAksEQCADIAMpA8gENwO4AiADIAMpA8AENwOwAiADQbACaiACEBkhCQJAAkACQCADKALQBCIEDgICAAELIAMoAsAEIAlBAnRqKAIAEBgMAQsgAygCwAQgCUECdGooAgAgBBEBAAsgAkEBaiECDAELCyADQcAEaiICQQQQMSACEDQgACAFNgKwAiABQZEkECciBUUNASAFLQAARQ0BQQAhBiAAKAKwAkECakEEED8hB0EBIQIDQCAAKAKwAiIEIAJOBEAgACACIAQgBRDfCARAIAcgBkEBaiIGQQJ0aiACNgIACyACQQFqIQIMAQsLAkAgBgRAIAcgBjYCACAHIAZBAnRqIARBAWo2AgQMAQsgAyAFNgLAAkHA5QQgA0HAAmoQKiAHEBhBACEHCyAAIAc2ArQCDAELIABBATYCsAILQQEQ2gIgA0GoBGohDCADQcgEaiENQYC/CCgCACEIIAAgACgCmAEiAjYCnAEDQAJAAkACQCACBEACfyAAKAI8IgRFBEBBACEGQQAMAQsgBCgCDCEGIAQoAggLIQQgAiAGNgIYIAIg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/////////w+DhCICQoGAgICAgICACFoEQCAAQgF8IQAMAQsgAkKAgICAgICAgAhSDQAgAEIBgyAAfCEACyAAQoCAgICAgIAIhSAAIABC/////////wdWIgQbIQAgBK0LIQIgBUEgaiQAIAFCgICAgICAgICAf4MgAkI0hoQgAIS/C4kCAAJAIAAEfyABQf8ATQ0BAkBBxIMLKAIAKAIARQRAIAFBgH9xQYC/A0YNAwwBCyABQf8PTQRAIAAgAUE/cUGAAXI6AAEgACABQQZ2QcABcjoAAEECDwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCABGtB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LC0H8gAtBGTYCAEF/BUEBCw8LIAAgAToAAEEBC8ICAQR/IwBB0AFrIgUkACAFIAI2AswBIAVBoAFqIgJBAEEoEDgaIAUgBSgCzAE2AsgBAkBBACABIAVByAFqIAVB0ABqIAIgAyAEENELQQBIBEBBfyEEDAELIAAoAkxBAEggACAAKAIAIghBX3E2AgACfwJAAkAgACgCMEUEQCAAQdAANgIwIABBADYCHCAAQgA3AxAgACgCLCEGIAAgBTYCLAwBCyAAKAIQDQELQX8gABCmBw0BGgsgACABIAVByAFqIAVB0ABqIAVBoAFqIAMgBBDRCwshAiAGBEAgAEEAQQAgACgCJBEDABogAEEANgIwIAAgBjYCLCAAQQA2AhwgACgCFCEBIABCADcDECACQX8gARshAgsgACAAKAIAIgAgCEEgcXI2AgBBfyACIABBIHEbIQQNAAsgBUHQAWokACAECxIAIAAgAUEKQoCAgIAIELAFpwthAAJAIAANACACKAIAIgANAEEADwsgACABEKoEIABqIgAtAABFBEAgAkEANgIAQQAPCyAAIAEQyQIgAGoiAS0AAARAIAIgAUEBajYCACABQQA6AAAgAA8LIAJBADYCACAAC38CAn8CfiMAQaABayIEJAAgBCABNgI8IAQgATYCFCAEQX82AhggBEEQaiIFQgAQjwIgBCAFIANBARDYCyAE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IABCADcCBCAAIAAoAiwiATYCHCAAIAE2AhQgACABIAAoAjBqNgIQQQALlAMCA34CfwJAIAC9IgJCNIinQf8PcSIEQf8PRw0AIABEAAAAAACAVkCiIgAgAKMPCyACQgGGIgFCgICAgICAwNaAf1gEQCAARAAAAAAAAAAAoiAAIAFCgICAgICAwNaAf1EbDwsCfiAERQRAQQAhBCACQgyGIgFCAFkEQANAIARBAWshBCABQgGGIgFCAFkNAAsLIAJBASAEa62GDAELIAJC/////////weDQoCAgICAgIAIhAshASAEQYUISgRAA0ACQCABQoCAgICAgKALfSIDQgBTDQAgAyIBQgBSDQAgAEQAAAAAAAAAAKIPCyABQgGGIQEgBEEBayIEQYUISg0AC0GFCCEECwJAIAFCgICAgICAoAt9IgNCAFMNACADIgFCAFINACAARAAAAAAAAAAAog8LIAFC/////////wdYBEADQCAEQQFrIQQgAUKAgICAgICABFQgAUIBhiEBDQALCyACQoCAgICAgICAgH+DIAFCgICAgICAgAh9IAStQjSGhCABQQEgBGutiCAEQQBKG4S/C+ICAQV/AkACQAJAIAIoAkxBAE4EQCABQQJIDQEMAgtBASEGIAFBAUoNAQsgAiACKAJIIgJBAWsgAnI2AkggAUEBRw0BIABBADoAACAADwsgAUEBayEEIAAhAQJAA0ACQAJAAkAgAigCBCIDIAIoAggiBUYNAAJ/IANBCiAFIANrEPoCIgcEQCAHIAIoAgQiA2tBAWoMAQsgAigCCCACKAIEIgNrCyEFIAEgAyAFIAQgBCAFSxsiAxAfGiACIAIoAgQgA2oiBTYCBCABIANqIQEgBw0CIAQgA2siBEUNAiAFIAIoAghGDQAgAiAFQQFqNgIEIAUtAAAhAwwBCyACEL0FIgNBAE4NAEEAIQQgACABRg0DIAItAABBEHENAQwDCyABIAM6AAAgAUEBaiEBIANB/wFxQQpGDQAgBEEBayIEDQELCyAARQRAQQAhBAwBCyABQQA6AAAgACEECyAGDQALIAQLpBgDE38EfAF+IwBBMGsiCSQAAkACQAJAIAC9IhlCIIinIgNB/////wdxIgZB+tS9gARNBEAgA0H//z9xQfvDJEYNASAGQfyyi4AETQRAIBlCAFkEQCABIABEAABAVPsh+b+gIgBEMWNiGmG00L2gIhU5AwAgASAAIBWhRDFjYhphtNC9oDkDCEEBIQMMBQsgASAARAAAQFT7Ifk/oCIARDFjYhphtNA9oCIVOQMAIAEgACAVoUQxY2IaYbTQPaA5AwhBfyEDDAQLIBlCAFkEQCABIABEAABAVPshCcCgIgBEMWNiGmG04L2gIhU5AwAgASAAIBWhRDFjYhphtOC9oDkDCEECIQMMBAsgASAARAAAQFT7IQlAoCIARDFjYhphtOA9oCIVOQMAIAEgACAVoUQxY2IaYbTgPaA5AwhBfiEDDAMLIAZBu4zxgARNBEAgBkG8+9eABE0EQCAGQfyyy4AERg0CIBlCAFkEQCABIABEAAAwf3zZEsCgIgBEypSTp5EO6b2gIhU5AwAgASAAIBWhRMqUk6eRDum9oDkDCEEDIQMMBQsgASAARAAAMH982RJAoCIARMqUk6eRDuk9oCIVOQMAIAEgACAVoUTKlJOnkQ7pPaA5AwhBfSEDDAQLIAZB+8PkgARGDQEgGUIAWQRAIAEgAEQAAEBU+yEZwKAiAEQxY2IaYbTwvaAiFTkDACABIAAgFaFEMWNiGmG08L2gOQMIQQQhAwwECyABIABEAABAVPshGUCgIgBEMWNiGmG08D2gIhU5AwAgASAAIBWhRDFjYhphtPA9oDkDCEF8IQMMAwsgBkH6w+SJBEsNAQsgACAARIPIyW0wX+Q/okQAAAAAAAA4Q6BEAAAAAAAAOMOgIhZEAABAVPsh+b+ioCIVIBZEMWNiGmG00D2iIhehIhhEGC1EVPsh6b9jIQICfyAWmUQAAAAAAADgQWMEQCAWqgwBC0GAgICAeAshAwJAIAIEQCADQQFrIQMgFkQAAAAAAADwv6AiFkQxY2IaYbTQPaIhFyAAIBZEAABAVPsh+b+ioCEVDAELIBhEGC1EVPsh6T9kRQ0AIANBAWohAyAWRAAAAAAAAPA/oCIWRDFjYhphtNA9oiEXIAAgFkQAAEBU+yH5v6KgIRULIAEgFSAXoSIAOQMAAkAgBkEUdiICIAC9QjSIp0H/D3FrQRFIDQAgASAVIBZEAABgGmG00D2iIgChIhggFkRzcAMuihmjO6IgFSAYoSAAoaEiF6EiADkDACACIAC9QjSIp0H/D3FrQTJIBEAgGCEVDAELIAEgGCAWRAAAAC6KGaM7oiIAoSIVIBZEwUkgJZqDezmiIBggFaEgAKGhIhehIgA5AwALIAEgFSAAoSAXoTkDCAwBCyAGQYCAwP8HTwRAIAEgACAAoSIAOQMAIAEgADkDCEEAIQMMAQsgCUEQaiIDQQhyIQQgGUL/////////B4NCgICAgICAgLDBAIS/IQBBASECA0AgAwJ/IACZRAAAAAAAAOBBYwRAIACqDAELQYCAgIB4C7ciFTkDACAAIBWhRAAAAAAAAHBBoiEAIAJBACECIAQhAw0ACyAJIAA5AyBBAiEDA0AgAyICQQFrIQMgCUEQaiIOIAJBA3RqKwMARAAAAAAAAAAAYQ0AC0EAIQQjAEGwBGsiBSQAIAZBFHZBlghrIgNBA2tBGG0iB0EAIAdBAEobIg9BaGwgA2ohB0GkzQgoAgAiCiACQQFqIg1BAWsiCGpBAE4EQCAKIA1qIQMgDyAIayECA0AgBUHAAmogBEEDdGogAkEASAR8RAAAAAAAAAAABSACQQJ0QbDNCGooAgC3CzkDACACQQFqIQIgBEEBaiIEIANHDQALCyAHQRhrIQZBACEDIApBACAKQQBKGyEEIA1BAEwhCwNAAkAgCwRARAAAAAAAAAAAIQAMAQsgAyAIaiEMQQAhAkQAAAAAAAAAACEAA0AgDiACQQN0aisDACAFQcACaiAMIAJrQQN0aisDAKIgAKAhACACQQFqIgIgDUcNAAsLIAUgA0EDdGogADkDACADIARGIANBAWohA0UNAAtBLyAHayERQTAgB2shECAHQRlrIRIgCiEDAkADQCAFIANBA3RqKwMAIQBBACECIAMhBCADQQBKBEADQCAFQeADaiACQQJ0agJ/An8gAEQAAAAAAABwPqIiFZlEAAAAAAAA4EFjBEAgFaoMAQtBgICAgHgLtyIVRAAAAAAAAHDBoiAAoCIAmUQAAAAAAADgQWMEQCAAqgwBC0GAgICAeAs2AgAgBSAEQQFrIgRBA3RqKwMAIBWgIQAgAkEBaiICIANHDQALCwJ/IAAgBhD5AiIAIABEAAAAAAAAwD+inEQAAAAAAAAgwKKgIgCZRAAAAAAAAOBBYwRAIACqDAELQYCAgIB4CyEIIAAgCLehIQACQAJAAkACfyAGQQBMIhNFBEAgA0ECdCAFaiICIAIoAtwDIgIgAiAQdSICIBB0ayIENgLcAyACIAhqIQggBCARdQwBCyAGDQEgA0ECdCAFaigC3ANBF3ULIgtBAEwNAgwBC0ECIQsgAEQAAAAAAADgP2YNAEEAIQsMAQtBACECQQAhDEEBIQQgA0EASgRAA0AgBUHgA2ogAkECdGoiFCgCACEEAn8CQCAUIAwEf0H///8HBSAERQ0BQYCAgAgLIARrNgIAQQEhDEEADAELQQAhDEEBCyEEIAJBAWoiAiADRw0ACwsCQCATDQBB////AyECAkACQCASDgIBAAILQf///wEhAgsgA0ECdCAFaiIMIAwoAtwDIAJxNgLcAwsgCEEBaiEIIAtBAkcNAEQAAAAAAADwPyAAoSEAQQIhCyAEDQAgAEQAAAAAAADwPyAGEPkCoSEACyAARAAAAAAAAAAAYQRAQQAhBCADIQICQCADIApMDQADQCAFQeADaiACQQFrIgJBAnRqKAIAIARyIQQgAiAKSg0ACyAERQ0AIAYhBwNAIAdBGGshByAFQeADaiADQQFrIgNBAnRqKAIARQ0ACwwDC0EBIQIDQCACIgRBAWohAiAFQeADaiAKIARrQQJ0aigCAEUNAAsgAyAEaiEEA0AgBUHAAmogAyANaiIIQQN0aiADQQFqIgMgD2pBAnRBsM0IaigCALc5AwBBACECRAAAAAAAAAAAIQAgDUEASgRAA0AgDiACQQN0aisDACAFQcACaiAIIAJrQQN0aisDAKIgAKAhACACQQFqIgIgDUcNAAsLIAUgA0EDdGogADkDACADIARIDQALIAQhAwwBCwsCQCAAQRggB2sQ+QIiAEQAAAAAAABwQWYEQCAFQeADaiADQQJ0agJ/An8gAEQAAAAAAABwPqIiFZlEAAAAAAAA4EFjBEAgFaoMAQtBgICAgHgLIgK3RAAAAAAAAHDBoiAAoCIAmUQAAAAAAADgQWMEQCAAqgwBC0GAgICAeAs2AgAgA0EBaiEDDAELAn8gAJlEAAAAAAAA4EFjBEAgAKoMAQtBgICAgHgLIQIgBiEHCyAFQeADaiADQQJ0aiACNgIAC0QAAAAAAADwPyAHEPkCIQAgA0EATgRAIAMhAgNAIAUgAiIEQQN0aiAAIAVB4ANqIAJBAnRqKAIAt6I5AwAgAkEBayECIABEAAAAAAAAcD6iIQAgBA0ACyADIQQDQEQAAAAAAAAAACEAQQAhAiAKIAMgBGsiByAHIApKGyIGQQBOBEADQCACQQN0QYDjCGorAwAgBSACIARqQQN0aisDAKIgAKAhACACIAZHIAJBAWohAg0ACwsgBUGgAWogB0EDdGogADkDACAEQQBKIARBAWshBA0ACwtEAAAAAAAAAAAhACADQQBOBEAgAyECA0AgAiIEQQFrIQIgACAFQaABaiAEQQN0aisDAKAhACAEDQALCyAJIACaIAAgCxs5AwAgBSsDoAEgAKEhAEEBIQIgA0EASgRAA0AgACAFQaABaiACQQN0aisDAKAhACACIANHIAJBAWohAg0ACwsgCSAAmiAAIAsbOQMIIAVBsARqJAAgCEEHcSEDIAkrAwAhACAZQgBTBEAgASAAmjkDACABIAkrAwiaOQMIQQAgA2shAwwBCyABIAA5AwAgASAJKwMIOQMICyAJQTBqJAAgAwsUACAAEAUiAEEAIABBG0cbEKkDGgv2AQIBfAF/IAC9QiCIp0H/////B3EiAkGAgMD/B08EQCAAIACgDwsCQAJ/IAJB//8/SwRAIAAhAUGT8f3UAgwBCyAARAAAAAAAAFBDoiIBvUIgiKdB/////wdxIgJFDQFBk/H9ywILIAJBA25qrUIghr8gAaYiASABIAGiIAEgAKOiIgEgASABoqIgAUTX7eTUALDCP6JE2VHnvstE6L+goiABIAFEwtZJSmDx+T+iRCAk8JLgKP6/oKJEkuZhD+YD/j+goKK9QoCAgIB8g0KAgICACHy/IgEgACABIAGioyIAIAGhIAEgAaAgAKCjoiABoCEACyAAC1YBAn8jAEEgayICJAAgAEEAEOgCIQMgAkIANwMIIAJBADYCGCACQgA3AxAgAiABNgIIIAJCADcDACAAIAJBBCAAKAIAEQMAIAAgAxDoAhogAkEgaiQAC8cDAwV8An4CfwJAAn8CQCAAvSIGQv////////8HVwRAIABEAAAAAAAAAABhBEBEAAAAAAAA8L8gACAAoqMPCyAGQgBZDQEgACAAoUQAAAAAAAAAAKMPCyAGQv/////////3/wBWDQJBgXghCSAGQiCIIgdCgIDA/wNSBEAgB6cMAgtBgIDA/wMgBqcNARpEAAAAAAAAAAAPC0HLdyEJIABEAAAAAAAAUEOivSIGQiCIpwshCCAGQv////8PgyAIQeK+JWoiCEH//z9xQZ7Bmv8Daq1CIIaEv0QAAAAAAADwv6AiACAAIABEAAAAAAAA4D+ioiIDob1CgICAgHCDvyIERAAAIGVHFfc/oiIBIAkgCEEUdmq3IgKgIgUgASACIAWhoCAAIABEAAAAAAAAAECgoyIBIAMgASABoiICIAKiIgEgASABRJ/GeNAJmsM/okSveI4dxXHMP6CiRAT6l5mZmdk/oKIgAiABIAEgAUREUj7fEvHCP6JE3gPLlmRGxz+gokRZkyKUJEnSP6CiRJNVVVVVVeU/oKKgoKIgACAEoSADoaAiACAEoEQAou8u/AXnPaIgAEQAACBlRxX3P6KgoKAhAAsgAAtZAQF/IwBBIGsiAiQAIAAQ7AEiAAR/IAAoAgghACACQgA3AwggAkEANgIYIAJCADcDECACIAE2AgggAkIANwMAIAAgAkEEIAAoAgARAwAFQQALIAJBIGokAAuVAQIDfwV8IAMQVyIImiEJIAAoAgghBiADEEohByAGEBwhBANAIAQEQCAEKAIQKAKUASIFIAIgBSsDACIKIAiiIAcgBSsDCCILoqCgOQMIIAUgASAKIAeiIAsgCaKgoDkDACAGIAQQHSEEDAELCyAAQThqIQQDQCAEKAIAIgAEQCAAIAEgAiADEK8HIABBBGohBAwBCwsLtQIBBX8jAEEwayIDJAAgACgACCABTwRAIABBADYCFCAAQQQQJiEEIAAoAgAgBEECdGogACgCFDYCACAAQQQQjAIgACgACCABQX9zakECdCIEBEAgACgCACADIAApAgg3AyggAyAAKQIANwMgIANBIGogAUEBahAZIAAoAgAhByADIAApAgg3AxggAyAAKQIANwMQQQJ0aiAHIANBEGogARAZQQJ0aiAEELYBGgsgACACNgIUIAMgACkCCDcDCCADIAApAgA3AwAgAyABEBkhAQJAAkACQCAAKAIQIgIOAgIAAQsgACgCACABQQJ0aigCABAYDAELIAAoAgAgAUECdGooAgAgAhEBAAsgACgCACABQQJ0aiAAKAIUNgIAIANBMGokAA8LQfGhA0GFuAFBFkGhGhAAAAsdACAAKAIIIAFBARCFARogASgCECgCgAEgADYCDAtEAQF/IAAEQCAAKAIEIgEEQCABEG0LIAAoAggiAQRAIAEQbQsgACgCDBAYIAAoAhQiAQRAIAEgACgCEBEBAAsgABAYCws+AQN/IAAQLSECIAAoAhAiAQRAA0AgASgCBCACIAEoAgBBABCMARogARAYIgEgACgCEEcNAAsLIABBADYCEAsbACAAIAEgAkEIQQNBgICAgAJB/////wEQowoL5QcCB38CfCAAKAIQIQcCQAJAAkACQAJAAkACQAJAIAAoAgAiBkUEQCAAIAI5AwggAEEBNgIAIAAgB0EIEBoiBzYCICAAKAIQIgRBACAEQQBKGyEGA0AgBSAGRkUEQCAHIAVBA3QiCGogASAIaisDADkDACAFQQFqIQUMAQsLIAQgAiABIAMQmgwhASAAKAIoDQEgACABNgIoIAAPCyAAKAIsIgogBEoEQCAAIAIgACsDCKA5AwggB0EAIAdBAEobIQggBkEBarchDCAGtyENA0AgBSAIRkUEQCAFQQN0IgYgACgCIGoiCSAJKwMAIA2iIAEgBmorAwCgIAyjOQMAIAVBAWohBQwBCwtBASAHdCEIIAAoAiQiBUUEQCAAIAhBBBAaIgU2AiQLIAcgACgCFCILIAEQmQwiCSAITiAJQQBIcg0CIAUgCUECdCIGaigCACIFBH8gBQUgACgCECALIAArAxhEAAAAAAAA4D+iIAogCRCbDCEFIAAoAiQgBmogBTYCACAAKAIkIAZqKAIACyABIAIgAyAEQQFqIgUQtQchASAAKAIkIAZqIAE2AgAgACgCJCIEIAZqKAIARQ0DAkAgACgCKCIBRQ0AIAAoAgBBAUcNBSABKAIMIQYgASsDACECIAggByAAKAIUIgcgASgCCCIIEJkMIgNMIANBAEhyDQYgBCADQQJ0IgFqKAIAIgQEfyAEBSAAKAIQIAcgACsDGEQAAAAAAADgP6IgCiADEJsMIQMgACgCJCABaiADNgIAIAAoAiQgAWooAgALIAggAiAGIAUQtQchAyAAKAIkIAFqIAM2AgAgACgCJCABaigCAEUNByAAKAIoIQUDQCAFRQ0BIAUoAhQhASAFELMIIAAgATYCKCABIQUMAAsACyAAIAAoAgBBAWo2AgAgAA8LIAAoAiQNBiAAIAZBAWoiBDYCACAAIAIgACsDCKA5AwggB0EAIAdBAEobIQggBkECarchDCAEtyENA0AgBSAIRkUEQCAFQQN0IgQgACgCIGoiBiAGKwMAIA2iIAEgBGorAwCgIAyjOQMAIAVBAWohBQwBCwsgByACIAEgAxCaDCEBIAAoAigiA0UNByABIAM2AhQgACABNgIoIAAPC0HIpANBgb4BQc4DQc7xABAAAAtB9JgDQYG+AUHaA0HO8QAQAAALQc/HAUGBvgFB3gNBzvEAEAAAC0H7jANBgb4BQeIDQc7xABAAAAtB9JgDQYG+AUHmA0HO8QAQAAALQc/HAUGBvgFB6wNBzvEAEAAAC0HhogNBgb4BQfcDQc7xABAAAAtBxPIAQYG+AUH9A0HO8QAQAAAL2wMCCn8DfAJAIABBCBAaIgdFIABBCBAaIghFciAAQQgQGiIKRXINACAAQQAgAEEAShshCQNAIAUgCUYEQANAIAQgCUYEQEEBIAEgAUEBTBshC0EBIQUDQCAFIAtHBEAgAyAAIAVsQQN0aiEMQQAhBANAIAQgCUcEQCAHIARBA3QiBmoiDSANKwMAIAYgDGorAwAiDhApOQMAIAYgCGoiBiAGKwMAIA4QIzkDACAEQQFqIQQMAQsLIAVBAWohBQwBCwsgCCsDACAHKwMAoSEOQQAhBANAIAQgCUcEQCAKIARBA3QiBWogBSAHaisDACIPIAUgCGorAwAiEKBEAAAAAAAA4D+iOQMAIARBAWohBCAOIBAgD6EQIyEODAELC0EAIQQgAUEAIAFBAEobIQEgACAKIA5E8WjjiLX45D4QI0SkcD0K16PgP6IgAhCcDCEFA0AgASAERg0FIAUEQCAFIAMgACAEbEEDdGpEAAAAAAAA8D8gBEEAELUHGgsgBEEBaiEEDAALAAUgCCAEQQN0IgVqIAMgBWorAwA5AwAgBEEBaiEEDAELAAsABSAHIAVBA3QiBmogAyAGaisDADkDACAFQQFqIQUMAQsACwALIAcQGCAIEBggChAYIAULeAECfwJAAkACQCABDgQBAAAAAgsgABAcIQMgAUEBRyEEA0AgA0UNAgJAIARFBEAgAyACEOIBDAELIAAgAxAsIQEDQCABRQ0BIAEgAhDiASAAIAEQMCEBDAALAAsgACADEB0hAwwACwALIAAgAEEcIAJBARDIAxoLC0cBAX8gACABQQEQjQEiAUH8JUHAAkEBEDYaQSAQUiECIAEoAhAgAjYCgAEgACgCEC8BsAFBCBAaIQAgASgCECAANgKUASABC1IBAX8gAEEAIAJBABAiIgMEQCAAIAMQRSEAIAFBACACQQAQIiIDBEAgASADIAAQcQ8LIAAQdgRAIAFBACACIAAQ5wMaDwsgAUEAIAIgABAiGgsL/AMBBX8jAEEwayIDJAAgA0IANwMoIANCADcDICADQgA3AxgCfyABRQRAIANBGGoiBEEEECYhBSADKAIYIAVBAnRqIAMoAiw2AgAgBAwBCyABCyEFIAAQeSEEA0AgBARAAkAgBBDFAQRAIARB4iVBmAJBARA2GkE4EFIhBiAEKAIQIAY2AowBIAIQOSEGIAQoAhAiByAGKAIQLwGwATsBsAEgAigCECgCjAEoAiwhBiAHKAKMASIHIAI2AjAgByAGQQFqNgIsIAUgBDYCFCAFQQQQJiEGIAUoAgAgBkECdGogBSgCFDYCACAEQQAgBBC6BwwBCyAEIAUgAhC6BwsgBBB4IQQMAQsLAkACQCABDQAgAygCICIBQQFrIgJBAEgNASAAKAIQIAI2ArQBIAFBAU0EQEEAIQRBASEFA0AgBCAFTwRAIANBGGoiAEEEEDEgABA0DAMFIAMgAykDIDcDECADIAMpAxg3AwggA0EIaiAEEBkhAAJAAkACQCADKAIoIgEOAgIAAQsgAygCGCAAQQJ0aigCABAYDAELIAMoAhggAEECdGooAgAgAREBAAsgBEEBaiEEIAMoAiAhBQwBCwALAAsgA0EYaiIBQQQQlwUgASAAKAIQQbgBakEAQQQQxwELIANBMGokAA8LQa3MAUHktwFB3wdBsSkQAAALRAEBfCAAKAIQKwMoIQFB4IALLQAAQQFGBEAgAUQAAAAAAADgP6JB2IALKwMAoA8LIAFB2IALKwMAokQAAAAAAADgP6ILRAEBfCAAKAIQKwMgIQFB4IALLQAAQQFGBEAgAUQAAAAAAADgP6JB0IALKwMAoA8LIAFB0IALKwMAokQAAAAAAADgP6ILTAEDfyABKAIQKAKUASIDKwMAIAAoAhAoApQBIgQrAwChmSAAELwHIAEQvAegZQR/IAMrAwggBCsDCKGZIAAQuwcgARC7B6BlBUEACwsIAEEBQTgQGgsOACAAEMECIABBARDKBQuOsgEEMn8JfAZ9An4jAEHQAWsiEiQAAkAgAUGTOBAnIgYEQCAGEJECIQUMAQtByAEhBQJAAkAgAkEBaw4EAgEBAAELQR4hBQwBCyABEDxB5ABsIQULQZjbCiAFNgIAAkACQCABIAIQyw0iDEECSA0AQZjbCigCAEEASA0AAkACQAJAAkAgAg4FAAICAgECCwJAAkACQAJAIANBAWsOAwEAAwILQQAhACABIAwgEkGAAWpBAEECQQAQsgwiByIEKAIIIQIgBCAMEN0HIAQgDBDyDCELIAQgDCACENwHIAEoAhAoAqABIQYDQCAAIAxHBEAgBiAAQQJ0IgJqKAIAIQQgAiALaigCACECQQAhBQNAIAUgDEcEQCAEIAVBA3RqIAIgBUECdGooAgC3OQMAIAVBAWohBQwBCwsgAEEBaiEADAELCyALKAIAEBggCxAYIAcQvgwMBQsCfyAMIAxEAAAAAAAAAAAQhgMhCiAMIAxEAAAAAAAAAAAQhgMhDiABEBwhAgNAIAJFBEACQCAMIAogDhC7DCILRQ0AQQAhAiAMQQAgDEEAShshBwNAIAIgB0YNASAOIAJBAnQiBWohBkEAIQADQCAAIAxHBEAgAEEDdCIRIAEoAhAoAqABIAVqKAIAaiAGKAIAIgQgAkEDdGorAwAgDiAAQQJ0aigCACARaisDAKAgBCARaisDACI4IDigoTkDACAAQQFqIQAMAQsLIAJBAWohAgwACwALIAoQhQMgDhCFAyALDAILIAEgAhBuIQADQCAARQRAIAEgAhAdIQIMAgsgAEEwQQAgACgCAEEDcSIEQQNHG2ooAigoAgBBBHYiBiAAQVBBACAEQQJHG2ooAigoAgBBBHYiBEcEQCAKIARBAnRqKAIAIAZBA3RqRAAAAAAAAPC/IAAoAhArA4gBoyI4OQMAIAogBkECdGooAgAgBEEDdGogODkDAAsgASAAIAIQciEADAALAAsACw0EIBIgARAhNgJgQeGOBCASQeAAahAqQbThBEEAEIABQdqWBEEAEIABQcjfBEEAEIABCyABIAwQww0MAwsgASAMEMMNIAEQHCEKA0AgCkUNAyABIAoQLCEFA0AgBQRAIAVBMEEAIAUoAgBBA3EiAEEDRxtqKAIoKAIAQQR2IgQgBUFQQQAgAEECRxtqKAIoKAIAQQR2IgJHBEAgASgCECgCoAEiACACQQJ0aigCACAEQQN0aiAFKAIQKwOIASI4OQMAIAAgBEECdGooAgAgAkEDdGogODkDAAsgASAFEDAhBQwBCwsgASAKEB0hCgwACwALIAEhBEEAIQIjAEGwFGsiDSQAQYWQBCEAAkACQAJAIANBAWsOAwECAAILQdGQBCEAC0EAIQMgAEEAECoLIAQQPCEbQezaCi0AAARAQcLhAUE3QQFBiPYIKAIAEDoaEK0BCyAbQQAgG0EAShshFUEAIQACQANAIAAgFUYEQAJAIAJBEBAaIRggBBAcIQpBACEWAkADQAJAIApFBEBBAUEYEBoiFyAZQQFqQQQQGiIBNgIEIA1B2ABqIBkQzAcgFyANKQNYNwIIIBcgFkEEEBo2AhAgFkEEEBohACAXIBk2AgAgFyAANgIUIBZBAE4NAUGMywFBw74BQTlB9Q8QAAALIAooAhAoAogBIBlHDQIgBCAKEG4hAANAIAAEQCAWIABBMEEAIAAoAgBBA3EiAUEDRxtqKAIoIABBUEEAIAFBAkcbaigCKEdqIRYgBCAAIAoQciEADAEFIBlBAWohGSAEIAoQHSEKDAMLAAsACwsgF0EIaiEMIAEgGUECdGogFjYCACAEEBwhGUEAIQoCQAJAA0ACQCAZRQRAIBQgFygCAEYNAUHR6gBBw74BQc8AQfUPEAAACyAKQQBIDQMgFygCBCAUQQJ0aiAKNgIAIAwgFCAZKAIQLQCHAUEBSxCzBCAEIBkQbiEAA0AgAEUEQCAUQQFqIRQgBCAZEB0hGQwDCyAAQTBBACAAKAIAQQNxIgFBA0cbaigCKCIFIABBUEEAIAFBAkcbaigCKCIGRwRAIApBAnQiASAXKAIQaiAGIAUgBSAZRhsoAhAoAogBNgIAIBcoAhQgAWogACgCECsDiAG2IkA4AgAgQEMAAAAAXkUNBCAKQQFqIQoLIAQgACAZEHIhAAwACwALCyAKQQBOBEAgFygCBCITIBRBAnRqKAIAIApGBEACQCADDgMJBgAGCyANQdgAaiAUEMwHIA1BoBRqIBQQzAdBACEAA0AgACAURgRAIA1B2ABqEMsHIA1BoBRqEMsHQQAhAwwKCyATIABBAWoiAUECdGohDyATIABBAnRqIgcoAgAhFkEAIQoDQCAPKAIAIgAgFk0EQCAHKAIAIQMDQCAAIANNBEAgBygCACEWA0AgACAWTQRAIAEhAAwGBSANQdgAaiAXKAIQIBZBAnRqKAIAQQAQswQgFkEBaiEWIA8oAgAhAAwBCwALAAsgEyAXKAIQIgUgA0ECdCIGaigCAEECdGoiDigCACEAQQAhGUEAIREDQCAOKAIEIhYgAE0EQAJAIBcoAhQgBmogCiARaiAZQQF0ayIAsjgCACAAQQBKDQBB0pcDQcO+AUHzAEH1DxAAAAsFIAUgAEECdGooAgAhCyANIA0pAqAUNwNQIA1B0ABqIAsQywJFBEAgDUGgFGogC0EBELMEIA0gDSkCWDcDSCANQcgAaiALEMsCIBlqIRkgEUEBaiERCyAAQQFqIQAMAQsLIA4oAgAhAANAIAAgFk8EQCADQQFqIQMgDygCACEADAIFIA1BoBRqIAUgAEECdGooAgBBABCzBCAAQQFqIQAgDigCBCEWDAELAAsACwAFIBcoAhAgFkECdGooAgAhACANIA0pAlg3A0AgDUFAayAAEMsCRQRAIA1B2ABqIABBARCzBCAKQQFqIQoLIBZBAWohFgwBCwALAAsAC0GtxgFBw74BQdEAQfUPEAAAC0GMywFBw74BQdAAQfUPEAAAC0HolwNBw74BQcoAQfUPEAAAC0GMywFBw74BQT5B9Q8QAAALQf4wQcO+AUEqQfUPEAAACwUgFiAWQQFqIgYgBCgCECgCmAEgAEECdGooAgAoAhAtAIcBQQFLIgEbIRZBACAbIAZrIAEbIAJqIQIgAEEBaiEADAELCyANQYIBNgIEIA1Bw74BNgIAQYj2CCgCAEHYvwQgDRAgGhA7AAsgAyEAA0AgAyAVRgRAIAAgAkcEQEGkLEHDvgFBsQFBwacBEAAACwUgBCgCECgCmAEgA0ECdGooAgAoAhAtAIcBQQFNBEACfyAYIABBBHRqIQVBACEKIwBBIGsiESQAIBcoAgAQzwEhCyAXKAIAIQcDQCAHIApGBEAgCyADQQJ0IgFqQQA2AgAgFygCBCABaiIBKAIAIgogASgCBCIBIAEgCkkbIQYCQANAIAYgCkYEQCAHQQBOBEAgEUEMaiADIAsgBxD4DEEAIRQgEUEANgIIA0ACQCARQQxqIBFBCGogCxD3DEUNACALIBEoAggiBkECdCIHaioCACJAQ///f39bDQAgESAXKQAIIkY3AxggBiBGQiCIp08NDwJAIAMgBkwEQCAGQQN2IBFBGGogRqcgRkKAgICAkARUG2otAABBASAGQQdxdHFFDQELIAUgFEEEdGoiAUMAAIA/IEAgQJSVOAIMIAEgQDgCCCABIAY2AgQgASADNgIAIBRBAWohFAsgFygCBCIBIAdqKAIAIQoDQCAKIAEgB2ooAgRPDQIgCkECdCIGIBcoAhBqKAIAIgFBAEgNBiARQQxqIAEgQCAXKAIUIAZqKgIAkiALEPUMIApBAWohCiAXKAIEIQEMAAsACwsgEUEMahDhByALEBggEUEgaiQAIBQMBgsFIAsgCkECdCIBIBcoAhBqKAIAQQJ0aiAXKAIUIAFqKgIAOAIAIApBAWohCgwBCwtB7csBQda+AUG1AkG4pwEQAAALQenKAUHWvgFBywJBuKcBEAAABSALIApBAnRqQf////sHNgIAIApBAWohCgwBCwALAAsgAGohAAsgA0EBaiEDDAELCyAXKAIEEBggDBDLByAXKAIQEBggFygCFBAYIBcQGEHs2gotAAAEQCANEI4BOQMwQYj2CCgCAEGqygQgDUEwahAzC0EBIAIgAkEBTBshAUEBIQAgGCoCDCJBIUIDQCAAIAFGBEBBACEAQZjbCigCAEGQ2worAwAhOCAEIBsQyA1EAAAAAAAA8D8gQrujIj8gOCBBu6OjITdBAWshBSAbQQF0QQgQGiEOIBtBARAaIQsDQCAAIBVGBEACQEGI9ggoAgAhDEHs2gotAAACfAJAAn8CQCA3vSJHQv////////8HVwRARAAAAAAAAPC/IDcgN6KjIDdEAAAAAAAAAABhDQQaIEdCAFkNASA3IDehRAAAAAAAAAAAowwECyBHQv/////////3/wBWDQJBgXghACBHQiCIIkZCgIDA/wNSBEAgRqcMAgtBgIDA/wMgR6cNARpEAAAAAAAAAAAMAwtBy3chACA3RAAAAAAAAFBDor0iR0IgiKcLQeK+JWoiAUEUdiAAarciN0QAAOD+Qi7mP6IgR0L/////D4MgAUH//z9xQZ7Bmv8Daq1CIIaEv0QAAAAAAADwv6AiOCA4IDhEAAAAAAAAAECgoyI5IDggOEQAAAAAAADgP6KiIjggOSA5oiI5IDmiIjwgPCA8RJ/GeNAJmsM/okSveI4dxXHMP6CiRAT6l5mZmdk/oKIgOSA8IDwgPEREUj7fEvHCP6JE3gPLlmRGxz+gokRZkyKUJEnSP6CiRJNVVVVVVeU/oKKgoKIgN0R2PHk17znqPaKgIDihoKAhNwsgNwshOARAQeriAUEOQQEgDBA6GhCtAQsgDUHYAGohAUEAIQBBACEKA0AgCkHwBEcEQCABIApBAnRqIAA2AgAgCkEBaiIKIABBHnYgAHNB5ZKe4AZsaiEADAELCyABQfAENgLAEyACQQAgAkEAShshByA4miAFt6MhO0EAIRkDQCACIQBBmNsKKAIAIBlMBEBBACEAQezaCi0AAARAIA0QjgE5AyAgDEGSygQgDUEgahAzCyAYEBgDQCAAIBVGDQMgBCgCECgCmAEgAEECdGooAgAoAhAoApQBIgIgDiAAQQR0aiIBKwMAOQMAIAIgASsDCDkDCCAAQQFqIQAMAAsABQNAIABBAk4EQCAAQQFrIgAEfyANQdgAaiEFIABBAXYgAHIiAUECdiABciIBQQR2IAFyIgFBCHYgAXIiAUEQdiABciEDA0BBACEWIAUCfyAFKALAEyIBQfAERgRAA0BB4wEhCiAWQeMBRgRAA0AgCkHvBEcEQCAFIApBAnRqIgYgBkGMB2soAgBB3+GiyHlBACAFIApBAWoiCkECdGooAgAiAUEBcRtzIAFB/v///wdxIAYoAgBBgICAgHhxckEBdnM2AgAMAQsLIAUgBSgCsAxB3+GiyHlBACAFKAIAIgpBAXEbcyAKQf7///8HcSAFKAK8E0GAgICAeHFyQQF2czYCvBNBAQwDBSAFIBZBAnRqIgYgBkG0DGooAgBB3+GiyHlBACAFIBZBAWoiFkECdGooAgAiAUEBcRtzIAFB/v///wdxIAYoAgBBgICAgHhxckEBdnM2AgAMAQsACwALIAUgAUECdGooAgAhCiABQQFqCzYCwBMgAyAKQQt2IApzIgFBB3RBgK2x6XlxIAFzIgFBD3RBgICY/n5xIAFzIgFBEnYgAXNxIgEgAEsNAAsgAQVBAAshASANIBggAEEEdGoiAykCADcDoBQgDSADKQIINwOoFCADIBggAUEEdGoiASkCCDcCCCADIAEpAgA3AgAgASANKQOoFDcCCCABIA0pA6AUNwIADAELCyA/IDsgGbiiEO0LoiE9QQAhAAJAA0ACQCAAIAdGBEBBACEAQezaCi0AAEUNA0QAAAAAAAAAACE3A0AgACAHRg0CIBggAEEEdGoiBioCDLsgDiAGKAIAQQR0aiIDKwMAIA4gBigCBEEEdGoiASsDAKEgAysDCCABKwMIoRBHIAYqAgi7oSI4IDiioiA3oCE3IABBAWohAAwACwALIA4gGCAAQQR0aiIFKAIAIgNBBHRqIgYrAwAiPCAOIAUoAgQiAUEEdGoiESsDAKEiOSAGKwMIIjcgESsDCKEiOBBHIT4gBSoCCCFAIDggPSAFKgIMu6JEAAAAAAAA8D8QKSA+IEC7oaIgPiA+oKMiOKIhPiA5IDiiITggAyALai0AAEEBRgRAIAYgPCA4oTkDACAGIDcgPqE5AwgLIAEgC2otAABBAUYEQCARIDggESsDAKA5AwAgESA+IBErAwigOQMICyAAQQFqIQAMAQsLIA0gNzkDECAMQY6GASANQRBqEDMLIBlBAWohGQwBCwALAAsFIA4gAEEEdGoiBiAEKAIQKAKYASAAQQJ0aigCACgCECIDKAKUASIBKwMAOQMAIAYgASsDCDkDCCAAIAtqIAMtAIcBQQJJOgAAIABBAWohAAwBCwsgDhAYIAsQGCANQbAUaiQABSBBIBggAEEEdGoqAgwiQBC8BSFBIEIgQBDpCyFCIABBAWohAAwBCwsMAgtBnNsKLwEAIQYgASAMIAJBAkdBAXQQtQwhCyABIAFBAEHMGEEAECJBAkEAEGIiE0EAIBNBA0gbRQRAIBJBzBg2AkBByZgEIBJBQGsQKkECIRMLIAZBBBAaIhsgBiAMbEEIEBoiBzYCAEEBQZzbCi8BACIGIAZBAU0bIQZBASEFAkACQANAIAUgBkYEQAJAIBMgE0EEciALGyEFQezaCi0AAARAIBJBkNsKKwMAOQMwIBIgAzYCICASIAtFNgIkIBIgBUEDcTYCKCASQZjbCigCADYCLEGI9ggoAgAiBkHPqgQgEkEgahAzQb7MA0EPQQEgBhA6GhCtAUGCjQRBDUEBIAYQOhoLIAEgDCASQcwBaiACIAMgEkHIAWoQsgwhFUHs2gotAAAEQCASEI4BOQMYIBIgDDYCEEGI9ggoAgBB18kEIBJBEGoQMwsCQCACQQFHBEAgASABQQBB4twAQQAQIkQAAAAAAAAAAET////////v/xBMITggAkECRgRAIAwhBiASKALIASEMQZzbCi8BACEWIAUhAEGY2wooAgAhLkEAIQQjAEEwayIdJAAgHUEANgIsIB1BADYCKAJAAkAgFSgCEEUNACAGQQAgBkEAShshLwNAIBggL0cEQEEBIQdBASAVIBhBFGxqIgUoAgAiAiACQQFNGyECA0AgAiAHRgRAIBhBAWohGAwDBSAEIAUoAhAgB2otAABBAEdyIQQgB0EBaiEHDAELAAsACwsgBEEBcUUNAAJAAkAgAEEEcSIRBEACQCAWQQNJDQBBfyEoQQAhByAVIAYgG0EEaiAMIBZBAWsiAiAAIANBDxDEB0EASA0FIBsgAkECdGohBANAIAcgL0YNASAHQQN0IgIgBCgCAGogGygCBCACaisDADkDACAHQQFqIQcMAAsACyAbKAIAIQ1BfyEoIBUgBiAbKAIEIhQgBhD6DA0CIBUgBiAUIB1BLGogHUEoaiAdQSRqENsHDQIgHSgCJCIKQQBMBEAgHSgCKBAYDAQLAkAgOEQAAAAAAAAAAGRFDQAgCkEBayELQQAhBSAdKAIoIQwgHSgCLCEOA0AgBSAKRg0BIAYhBCA3RAAAAAAAAAAAIDggFCAOIAwgBUECdGoiAigCACIHQQJ0aiIAQQRrKAIAQQN0aisDACA3IBQgACgCAEEDdGorAwCgoaAiNyA3RAAAAAAAAAAAYxugITcgBSALSARAIAIoAgQhBAsgBCAHIAQgB0obIQIDQCACIAdGBEAgBUEBaiEFDAIFIBQgDiAHQQJ0aigCAEEDdGoiACA3IAArAwCgOQMAIAdBAWohBwwBCwALAAsACyAWQQJHDQECf0GQ2worAwAhP0EAIQsgBkEAIAZBAEobIRcgBkEEEBohEyAGQQgQGiEOAkAgFSgCCARAIBUgBhDyDCEZDAELIAZBACAGQQBKGyECIAYgBmwQzwEhACAGEM8BIRkDQCACIAtGBEADQCACIBpGDQMgGiAVIAYgGSAaQQJ0aigCABDxAyAaQQFqIRoMAAsABSAZIAtBAnRqIAAgBiALbEECdGo2AgAgC0EBaiELDAELAAsACwNAIBAgF0cEQCAZIBBBAnRqIQJBACEIA0AgBiAIRwRAIAIoAgAgCEECdGoiACAAKAIAQQh0NgIAIAhBAWohCAwBCwsgEEEBaiEQDAELCyAUBEBBASAGIAZBAUwbIQxBASEQA0AgDCAQRwRAIBQgEEEDdGorAwAhNyAZIBBBAnRqKAIAIQBBACEIA0AgCCAQRwRARAAAAAAAAPA/IAAgCEECdGooAgAiArejIDcgFCAIQQN0aisDAKGZIjmiIDqgITpEAAAAAAAA8D8gAiACbLijIDmiIDmiIDugITsgCEEBaiEIDAELCyAQQQFqIRAMAQsLIDogO6MiPUQAAAAAAAAAACA7mSI8RAAAAAAAAPB/YhshPkEAIQgDQCAIIBdHBEAgFCAIQQN0aiIAID4gACsDAKI5AwAgCEEBaiEIDAELC0EAIQggBiAGbCIEQQQQGiEAIAZBBBAaIQ8DQCAIIBdHBEAgDyAIQQJ0aiAAIAYgCGxBAnRqNgIAIAhBAWohCAwBCwsgBrIhQEQAAAAAAAAAACE7QQAhECAGQQQQGiELA0AgECAXRwRAIBkgEEECdCICaiEARAAAAAAAAAAAITpBACEIA0AgBiAIRwRAIAAoAgAgCEECdGooAgC3IjcgN6IiNyA6oCE6IDcgO6AhOyAIQQFqIQgMAQsLIAIgC2ogOrYgQJU4AgAgEEEBaiEQDAELCyA7tiAEs5UhQUEAIRpBASEQA0AgFyAaRwRAIA8gGkECdCIHaigCACECIAcgC2oqAgAhQiAHIBlqKAIAIQBBACEIA0AgCCAQRwRAIAIgCEECdCIFaiAFIAtqKgIAIEIgACAFaigCALIiQCBAlJOSIEGTIkA4AgAgBSAPaigCACAHaiBAOAIAIAhBAWohCAwBCwsgEEEBaiEQIBpBAWohGgwBCwsgCxAYQQAhCEEBQQgQGiEHIAZBCBAaIRhBACEQA0AgECAXRgRARAAAAAAAAAAAIToDQCAIIBdHBEAgOiAYIAhBA3RqKwMAoCE6IAhBAWohCAwBCwsgOiAGt6MhN0EAIQgDQCAIIBdHBEAgGCAIQQN0aiIAIAArAwAgN6E5AwAgCEEBaiEIDAELCyAYIAZBAWsiChCtAyI3mUQAAAAAAACwPGNFBEAgBiAYRAAAAAAAAPA/IDejIBgQ7QELQQEgBiAGQQBKGyECRAAAAAAAAPA/ID+hITlBACEaIAZBCBAaIQsgBkEIEBohBQJAA0ACQEEAIQggAiAaTA0AA0AgBiAIRwRAIA0gCEEDdGoQpgFB5ABvtzkDACAIQQFqIQgMAQsgGEUNAyANIAogBiAYIA0QqgGaIBgQuwRBACEIIA0gChCtAyI3RLu919nffNs9Yw0ACyAGIA1EAAAAAAAA8D8gN6MgDRDtAQNAIAYgDSAFEJMCQQAhEANAIBAgF0cEQCAPIBBBAnRqIQBEAAAAAAAAAAAhOkEAIQgDQCAIIBdHBEAgACgCACAIQQJ0aioCALsgDSAIQQN0aisDAKIgOqAhOiAIQQFqIQgMAQsLIAsgEEEDdGogOjkDACAQQQFqIRAMAQsLIAsgCiAGIAsgGBCqAZogGBC7BCAGIAsgDRCTAiANIAoQrQMiO0S7vdfZ33zbPWMNASAGIA1EAAAAAAAA8D8gO6MgDRDtASAGIA0gBRCqASI3mSA5Yw0ACyAHIDsgN6I5AwBBASEaDAELCwNAQQAhCAJAIAIgGkoEQANAIAYgCEYNAiANIAhBA3RqEKYBQeQAb7c5AwAgCEEBaiEIDAALAAsgCxAYIAUQGANAIAggF0cEQCANIAhBA3RqIgAgACsDACAHKwMAmZ+iOQMAIAhBAWohCAwBCwsgDygCABAYIA8QGCAHEBggGBAYQQAhECAEQQQQGiEEQQEhGgNAIBAgF0YEQEEAIQsDQCAMIBpGBEADQCALIBdGBEBBACELQQAhGgNAAkAgC0EBcUUgGkHHAU1xRQRAQQAhCyA9mUQAAAAAAACwPGNFIDxEAAAAAAAA8H9icUUNAUEAIQgDQCAIIBdGDQIgFCAIQQN0IgJqIgAgACsDACA+ozkDACACIA1qIgAgACsDACA+ozkDACAIQQFqIQgMAAsAC0EAIRBBASELIBMgDSAOIAYgPyAGQQEQ+wxBAEgNAANAIBAgF0cEQCATIBBBAnQiAGohBSAAIBlqIQQgDSAQQQN0IgJqKwMAITdEAAAAAAAAAAAhOkEAIQgDQCAGIAhHBEACQCAIIBBGDQAgCEECdCIAIAQoAgBqKAIAsiAFKAIAIABqKgIAjJS7ITkgDSAIQQN0aisDACA3ZQRAIDogOaAhOgwBCyA6IDmhIToLIAhBAWohCAwBCwsgOiACIA5qIgArAwAiN2FEAAAAAAAA8D8gOiA3o6GZRPFo44i1+OQ+ZEVyRQRAIAAgOjkDAEEAIQsLIBBBAWohEAwBCwsgGkEBaiEaDAELCyAZKAIAEBggGRAYIBMoAgAQGCATEBggDhAYIAsMDAUgDSALQQN0IgBqKwMAITkgACAOaiIFQgA3AwAgEyALQQJ0IgBqIQQgACAZaiECQQAhCEQAAAAAAAAAACE6A0AgBiAIRwRAIAggC0cEQCAFIDogCEECdCIAIAIoAgBqKAIAsiAEKAIAIABqKgIAjJS7IjegIDogN6EgOSANIAhBA3RqKwMAZhsiOjkDAAsgCEEBaiEIDAELCyALQQFqIQsMAQsACwAFIBkgGkECdCIHaigCACEFIBQgGkEDdGorAwAhOUEAIQgDQCAIIBpHBEAgBSAIQQJ0IgRqIgIoAgC3IjcgN6IgOSAUIAhBA3RqKwMAoSI3IDeioSI3RAAAAAAAAAAAZCEAIAQgGWooAgAgB2oCfyA3nyI3mUQAAAAAAADgQWMEQCA3qgwBC0GAgICAeAtBACAAGyIANgIAIAIgADYCACAIQQFqIQgMAQsLIBpBAWohGgwBCwALAAUgEyAQQQJ0IgdqIAQgBiAQbEECdGoiBTYCACAHIBlqIQJBACEIQwAAAAAhQgNAIAYgCEcEQCAIIBBHBEAgBSAIQQJ0IgBqQwAAgL8gAigCACAAaigCALIiQCBAlJUiQDgCACBCIECTIUILIAhBAWohCAwBCwsgBSAHaiBCOAIAIBBBAWohEAwBCwALAAsgBiANRAAAAAAAAPA/IA0gChCtA6MgDRDtASAHQgA3AwBBASEaDAALAAtBltUBQbe3AUHiAEHO/QAQAAAFIBggEEEDdCIAaiAAIBRqKwMAOQMAIBBBAWohEAwBCwALAAtBqNIBQbe3AUGWAkHa7AAQAAALRQ0BDAILIAYgFiAbIAwQygcaQX8hKCAVIAZBACAdQSxqIB1BKGogHUEkahDbBw0BCyAGQQFGBEAgHSgCKBAYQQAhKAwDCyAuRQRAIB0oAigQGEEAISgMAwtB7NoKLQAABEAQrQELAkACQAJ/AkACQAJAIANBAWsOAwEAAgQLQezaCi0AAARAQfLvAEEYQQFBiPYIKAIAEDoaCyAVIAYQxQcMAgsgFSAGEMkHIiUNA0GVjwRBABAqQbThBEEAEIABDAILQezaCi0AAARAQYvwAEEVQQFBiPYIKAIAEDoaCyAVIAYQxwcLIiUNAQtB7NoKLQAABEBB3S1BGkEBQYj2CCgCABA6GgsgFSAGEMkFISULQezaCi0AAARAIB0QjgE5AxBBiPYIKAIAIgBBqcoEIB1BEGoQM0GmK0EZQQEgABA6GhCtAQsgBkEBayITIAZsQQJtIQUCQCARDQBBACEDIBYhBEQAAAAAAADwPyE3A0AgAyAERwRAIBsgA0ECdGohAEEAIQcDQCAHIC9GBEAgA0EBaiEDDAMFIDcgACgCACAHQQN0aisDAJkQIyE3IAdBAWohBwwBCwALAAsLRAAAAAAAACRAIDejITdBACECA0AgAiAERg0BIBsgAkECdGohA0EAIQcDQCAHIC9GBEAgAkEBaiECDAIFIAMoAgAgB0EDdGoiACA3IAArAwCiOQMAIAdBAWohBwwBCwALAAsACyAFIAZqISJEAAAAAAAAAAAhNwJAIDhEAAAAAAAAAABkRQ0AQQAhBCATQQAgE0EAShshAkEAIQMDQCACIANGBEBBACEHICJBACAiQQBKGyECIDcgBbejtiFAA0AgAiAHRg0DICUgB0ECdGoiACAAKgIAIECUOAIAIAdBAWohBwwACwALIANBAWoiACEHA0AgBEEBaiEEIAYgB0wEQCAAIQMMAgUgNyAbIBYgAyAHEPEMICUgBEECdGoqAgC7o6AhNyAHQQFqIQcMAQsACwALAAtBACEHIBYhMQNAIAcgMUYEQCAbKAIEIgIrAwAhN0EAIQcDQCAHIC9GBEBBACECIBZBBBAaISsgBiAWbCILQQQQGiEwA0AgAiAxRgRAQQAhAEHs2gotAAAEQCAdEI4BOQMAQYj2CCgCAEG0tgEgHRAzCyAFtyE8ICIgJRC6BCAiICUQ5AcgBiAGQQgQGiI0ENQFIBNBACATQQBKGyEIIAYhBUEAIQcDQAJAIAAgCEYEQEEAIQQgBiEDQQAhBwwBCyA0IABBA3RqIRFBASEDIAdBASAFIAVBAUwbakEBayEMRAAAAAAAAAAAITcDQCAHQQFqIQIgByAMRgRAIBEgESsDACA3oTkDACAFQQFrIQUgAEEBaiEAIAIhBwwDBSARIANBA3RqIgQgBCsDACAlIAJBAnRqKgIAuyI5oTkDACADQQFqIQMgNyA5oCE3IAIhBwwBCwALAAsLA0AgByAvRwRAICUgBEECdGogNCAHQQN0aisDALY4AgAgAyAEaiEEIAdBAWohByADQQFrIQMMAQsLIBZBBBAaIh4gC0EEEBoiAjYCAEEBIBYgFkEBTRshAEEBIQcCQANAIAAgB0YEQAJAIDRBCGohFiA4tiFERP///////+9/ITggBkEEEBohHyAGQQQQGiEgICJBBBAaISYgHSgCLCEDIB0oAighAiAdKAIkIQBBAUEkEBoiHCAANgIgIBwgAjYCHCAcIAM2AhggHCAGNgIEIBwgJSAGEO4MNgIAIBwgBkEEEBo2AgggHCAGQQQQGjYCDCAcIAZBBBAaNgIQIBwgBkEEEBo2AhRBACEYQQAhKANAIBhBAXEgKCAuTnINASAGIDQQ1AUgIiAlICYQ4wdBACEEIBMhAEEAIRhBACEDA0AgAyAIRgRAIAYhGEEAIQIDQEEAIQcgAiAvRgRAQQAhAgN8IAIgMUYEfEQAAAAAAAAAAAUgJiAGICsgAkECdCIAaigCACAAIB5qKAIAEIADIAJBAWohAgwBCwshNwNAIAcgMUcEQCA3IAYgKyAHQQJ0IgBqKAIAIAAgHmooAgAQzgKgITcgB0EBaiEHDAELCyA3IDegIDygITdBACEHA0AgByAxRgRAQQAhByAoQQFLIDcgOGRxQZDbCisDACA3IDihIDhEu73X2d982z2go5lkciEYA0ACQCAHIDFHBEAgB0EBRgRAIB4oAgQhF0EAIQBBACEPQQAhMiMAQaACayIJJAAgKygCBCEjIBwoAiAhCiAcKAIcITMgHCgCACE1IBwoAgQiC0EAIAtBAEobITYgHCgCGCIhQQRrIQVDKGtuziFAQX8hAkEAIQQDQCAAIDZHBEAgACAETgRAIAshBCAKIAJBAWoiAkcEQCAzIAJBAnRqKAIAIQQLIAAEfSBEICMgBSAAQQJ0aigCAEECdGoqAgCSBUMoa27OCyFAIARBAWsiAyAASgRAICEgAEECdGogAyAAa0EBakHZAyAjEPAMCwsgQCAjICEgAEECdGooAgBBAnRqIgMqAgBeBEAgAyBAOAIACyAAQQFqIQAMAQsLIBwoAhAhLCAcKAIMIRAgHCgCCCEkIAlCADcDmAIgCUIANwOQAiAJQgA3A4gCQQAhAkF/IQQgC0EEEBohKkEAIQADQCAAIDZGBEACQCAQQQRrIhogC0ECdGohGSALQQFrIQ4gHCgCFCEnA0ACQCAyQQ9IBEBDKGtuziFFIA9BACECQQEhD0UNAQsgKhAYQQAhAANAIAkoApACIABNBEAgCUGIAmoiAEEEEDEgABA0DAQFIAkgCSkDkAI3AxAgCSAJKQOIAjcDCCAJQQhqIAAQGSEDAkACQAJAIAkoApgCIgIOAgIAAQsgCSgCiAIgA0ECdGooAgAQGAwBCyAJKAKIAiADQQJ0aigCACACEQEACyAAQQFqIQAMAQsACwALA0AgAiALSARAQwAAAAAhQCAjICEgAkECdGooAgAiAEECdGoqAgAiQyFBIAIhAwNAICcgAEECdGogQDgCACADQQFqIRECQAJ/IAMgDkYEQCAOIQMgCwwBCyAjICEgEUECdCIEaigCACIAQQJ0aioCACJAIEQgQZIgQSAEICpqKAIAICogA0ECdGooAgBKGyJBk4u7RJXWJugLLhE+ZEUNASARCyEMIAIhBQNAIAMgBUgEQEEAIQADQCAJKAKQAiAATQRAIAlBiAJqQQQQMSACIQADQCAAIANKBEBBACEEQwAAAAAhQEMAAAAAIUIDQCAJKAKQAiIAIARNBEAgC0EASCIFIAAgC0dyRQRAIBkgQzgCAAtDAAAAACFAQwAAAAAhQgNAIABFBEAgBSAJKAKQAiIUIAtHckUEQCAsIEM4AgALQQAhAEF/IQREAAAAAAAAAAAhOQJAAkACQANAIAAgFEYEQAJAIARBf0YNBCAsIARBAnQiAGoqAgAiQCFBIAQEQCAAIBpqKgIAIUELIEAgCyARSgR9ICMgISAMQQJ0aigCAEECdCIAaioCACFAICogISADQQJ0aigCAEECdGooAgAhBSAAICpqKAIAIQAgCSAJKQOQAjcD4AEgCSAJKQOIAjcD2AEgQCBEkyBAIAAgBUobICcgCSgCiAIgCUHYAWogFEEBaxAZQQJ0aigCAEECdGoqAgCTBUMoa25OCxDpCyJCIEEgRRC8BSJAXUUNAyBCIENdRQ0AIEMgQCBAIENeGyJAIUIMAwsFICwgAEECdCIFaioCACFBAkAgAARAIEEgBSAaaioCACJAXUUNASBBIENdBEAgQyBAIEAgQ14bIkAhQQwCCyBAIENeRQ0BCyBBIUALIBQgAGuzuyBBIEOTi7uiIACzuyBAIEOTi7uioCI4IDkgOCA5ZCIFGyE5IAAgBCAFGyEEIABBAWohAAwBCwsgQCBDXkUNACBCIUALQQAhAANAIAAgBEcEQCAJIAkpA5ACNwPQASAJIAkpA4gCNwPIASAnIAkoAogCIAlByAFqIAAQGUECdGooAgBBAnRqKgIAIUEgCSAJKQOQAjcDwAEgCSAJKQOIAjcDuAEgIyAJKAKIAiAJQbgBaiAAEBlBAnRqKAIAQQJ0aiBAIEGSOAIAIABBAWohAAwBCwsDQCAJKAKQAiIAIARLBEAgCSAJKQOQAjcDgAEgCSAJKQOIAjcDeCAnIAkoAogCIAlB+ABqIAQQGUECdGooAgBBAnRqKgIAIUEgCSAJKQOQAjcDcCAJIAkpA4gCNwNoICMgCSgCiAIgCUHoAGogBBAZQQJ0aigCAEECdGogQiBBkjgCACAEQQFqIQQMAQsLAn0CQCALIBFMDQAgKiAhIAxBAnRqKAIAQQJ0aigCACAqICEgA0ECdGooAgBBAnRqKAIATA0AIAkgCSkDkAI3A6ABIAkgCSkDiAI3A5gBIEQgIyAJKAKIAiAJQZgBaiAAQQFrEBlBAnRqKAIAQQJ0aioCAJIMAQsgCSAJKQOQAjcDsAEgCSAJKQOIAjcDqAEgIyAJKAKIAiAJQagBaiAAQQFrEBlBAnRqKAIAQQJ0aioCAAshRSACIQADQCAAIANKBEAgDyBAIEOTi0MK1yM8XXEgQiBDk4tDCtcjPF1xIQ8MAwUgCSAJKQOQAjcDkAEgCSAJKQOIAjcDiAEgISAAQQJ0aiAJKAKIAiAJQYgBaiAAIAJrEBlBAnRqKAIANgIAIABBAWohAAwBCwALAAsCQCALIBFKBEAgKiAhIAxBAnRqKAIAQQJ0aigCACAqICEgA0ECdGooAgBBAnRqKAIASg0BCyAJIAkpA5ACNwNgIAkgCSkDiAI3A1ggIyAJKAKIAiAJQdgAaiAUQQFrEBlBAnRqKAIAQQJ0aioCACFFDAELIAkgCSkDkAI3A1AgCSAJKQOIAjcDSCBEICMgCSgCiAIgCUHIAGogFEEBaxAZQQJ0aigCAEECdGoqAgCSIUULIAwhAgwNCyAJIAkpA5ACNwOAAiAJIAkpA4gCNwP4ASA1IAkoAogCIAlB+AFqIABBAWsiBBAZQQJ0aigCAEECdCINaigCACEUQwAAAAAhQQNAIAkoApACIABNBEAgLCAEQQJ0aiBBIEGSIkEgQ5QgQCBClCANICRqKgIAIA0gFGoiACoCACJClJOSIEEgQCBCk5KVIkI4AgAgQCBBIAAqAgCTkiFAIAQhAAwCBSAJIAkpA5ACNwPwASAJIAkpA4gCNwPoASBBIBQgCSgCiAIgCUHoAWogABAZQQJ0aigCAEECdGoqAgCTIUEgAEEBaiEADAELAAsACwALIAlBQGsgCSkDkAI3AwAgCSAJKQOIAjcDOCA1IAkoAogCIAlBOGogBBAZQQJ0aigCAEECdCIUaigCACEFQQAhAEMAAAAAIUEDQCAAIARGBEAgECAEQQJ0aiBBIEGSIkEgQ5QgQCBClCAUICRqKgIAIAUgFGoiACoCACJClJOSIEEgQCBCk5KVIkI4AgAgBEEBaiEEIEAgQSAAKgIAk5IhQAwCBSAJIAkpA5ACNwMwIAkgCSkDiAI3AyggQSAFIAkoAogCIAlBKGogABAZQQJ0aigCAEECdGoqAgCTIUEgAEEBaiEADAELAAsACwALIAwhBSAKICogISAAQQJ0aigCAEECdGooAgAiBEcEQCAFIDMgBEECdGooAgAiBCAEIAVKGyEFCyAFIAAgACAFSBshDSAAIQQDQAJAIAQgDUYEQCAAIQQDQCAEIA1GDQIgQyAkICEgBEECdGooAgAiFEECdGoqAgBbBEAgCSAUNgKcAiAJQYgCakEEECYhFCAJKAKIAiAUQQJ0aiAJKAKcAjYCAAsgBEEBaiEEDAALAAsgQyAkICEgBEECdGooAgAiFEECdGoqAgBeBEAgCSAUNgKcAiAJQYgCakEEECYhFCAJKAKIAiAUQQJ0aiAJKAKcAjYCAAsgBEEBaiEEDAELCwNAIAAgDUYEQCAFIQAMAgsgQyAkICEgAEECdGooAgAiBEECdGoqAgBdBEAgCSAENgKcAiAJQYgCakEEECYhBCAJKAKIAiAEQQJ0aiAJKAKcAjYCAAsgAEEBaiEADAALAAsABSAJIAkpA5ACNwMgIAkgCSkDiAI3AxggCUEYaiAAEBkhBQJAAkACQCAJKAKYAiIEDgICAAELIAkoAogCIAVBAnRqKAIAEBgMAQsgCSgCiAIgBUECdGooAgAgBBEBAAsgAEEBaiEADAELAAsACyA1ICEgBUECdGooAgAiFEECdCItaigCACENIBcgLWoqAgCMIUFBACEAA0AgACA2RgRAICQgLWogQSANIC1qKgIAjJUgJyAtaioCAJM4AgAgBUEBaiEFDAIFIAAgFEcEQCANIABBAnQiBGoqAgAgBCAjaioCAJQgQZIhQQsgAEEBaiEADAELAAsACwALIEAgQ5MhQCARIQMMAAsACwsgCyAjEIEDIDJBAWohMgwACwALBQJAIAAgAkgNACAEQQFqIQMgCyECIAMgCiIERg0AIDMgA0ECdGooAgAhAiADIQQLICogISAAQQJ0aigCAEECdGogBDYCACAAQQFqIQAMAQsLIAlBoAJqJAAMAgsgJSArIAdBAnQiAGooAgAgACAeaigCACAGIAYQuQRFDQFBfyEoDA0LIChBAWohKCA3ITgMCAsgB0EBaiEHDAALAAUgJSAGICsgB0ECdGoiACgCACAfEIADIAdBAWohByA3IAYgACgCACAfEM4CoSE3DAELAAsABSAmIARBAnRqIDQgAkEDdGorAwC2OAIAIAQgGGohBCACQQFqIQIgGEEBayEYDAELAAsACyAAQQAgAEEAShshCyAGQwAAAAAgIBDyAyAGIANBf3NqIQxBACECA0AgAiAxRgRAIAwgIBDiB0EAIQcDQAJAIAcgC0YEQCAWIANBA3QiDGohBUEAIQdEAAAAAAAAAAAhNwwBCyAgIAdBAnRqIgIqAgAiQEP//39/YCBAQwAAAABdcgRAIAJBADYCAAsgB0EBaiEHDAELCwNAIBhBAWohGCAHIAtHBEAgJiAYQQJ0aiICICAgB0ECdGoqAgAgAioCAJQiQDgCACAFIAdBA3RqIgIgAisDACBAuyI5oTkDACA3IDmgITcgB0EBaiEHDAELCyAMIDRqIgIgAisDACA3oTkDACAAQQFrIQAgA0EBaiEDDAIFIAwgA0ECdCIHICsgAkECdGoiBSgCAGoqAgAgHxDyAyAMIB9DAACAvyAFKAIAIAdqQQRqENUFIAwgHxC6BCAMIB8gICAgEP0MIAJBAWohAgwBCwALAAsACwALBSAeIAdBAnRqIAIgBiAHbEECdGo2AgAgB0EBaiEHDAELCwNAICkgMUcEQCAbIClBAnQiAGohAiAAICtqIQBBACEHA0AgByAvRgRAIClBAWohKQwDBSACKAIAIAdBA3RqIAAoAgAgB0ECdGoqAgC7OQMAIAdBAWohBwwBCwALAAsLIB8QGCAgEBggNBAYICUQGCAmEBgLIBwEQCAcKAIAKAIAEBggHCgCABAYIBwoAggQGCAcKAIMEBggHCgCEBAYIBwoAhQQGCAcEBgLIB4oAgAQGCAeEBgMBgsgKyACQQJ0IgBqIDAgAiAGbEECdGoiAzYCACAAIBtqIQBBACEHA0AgByAvRgRAIAJBAWohAgwCBSADIAdBAnRqIAAoAgAgB0EDdGorAwC2OAIAIAdBAWohBwwBCwALAAsABSACIAdBA3RqIgAgACsDACA3oTkDACAHQQFqIQcMAQsACwAFIAYgGyAHQQJ0aigCABDPAiAHQQFqIQcMAQsACwALIDAQGCArEBggHSgCLBAYIB0oAigQGAwBCyAVIAYgGyAMIBYgACADIC4QxAchKAsgHUEwaiQAICghBQwCCyASIAEQPCICNgJsIBJBADYCaCACQSFPBEAgEiACQQN2IAJBB3FBAEdqQQEQGjYCaAsgARA8IRMgABB5IQUDQCAFBEAgBRDFASApaiEpIAUQeCEFDAELCyApQQQQGiERIClBBBAaIQsgABB5IQAgESEHIAshBgNAIAAEQAJAIAAQxQFFDQAgBiAAEDwiAjYCACAHIAJBBBAaIgo2AgAgB0EEaiEHIAZBBGohBiACIA5qIQ4gABAcIQIDQCACRQ0BQQAhDyABEBwhBQNAAkAgBUUNACACKAIAIAUoAgBzQRBJDQAgD0EBaiEPIAEgBRAdIQUMAQsLIAogDzYCACAPIBIoAmwiBU8NBiAPQQN2IBJB6ABqIBIoAmggBUEhSRtqIgUgBS0AAEEBIA9BB3F0cjoAACATQQFrIRMgCkEEaiEKIAAgAhAdIQIMAAsACyAAEHghAAwBCwsgKUEgEBohDSATQQQQGiE1IBJBgAFqIBIpA2giRqciBiBGQoCAgICQBFQbIQIgRkIgiKchAEEAIQVBACEPA0AgARA8IAVKBEAgEiBGNwOAASAAIAVGDQsgAiAFQQN2ai0AACAFQQdxdkEBcUUEQCA1IA9BAnRqIAU2AgAgD0EBaiEPCyAFQQFqIQUMAQsLIBMgARA8IA5rRw0FIEZCgICAgJAEWgRAIAYQGAsgDEEQEBohNiASIA02AsQBIBIgNTYCwAEgEiATNgK8ASASIBE2ArgBIBIgCzYCtAEgEiApNgKwASASIA42AqwBIBIgNjYCqAEgEiA4OQOIAQJAIAFBwyYQJyIAEGgEQCASQQE2AoABQezaCi0AAEUNAUGB6ARBH0EBQYj2CCgCABA6GgwBCwJAIABFDQAgAEGqOUEEEIACDQAgEkECNgKAAUHs2gotAABFDQFBoegEQShBAUGI9ggoAgAQOhoMAQsgEkEANgKAAQsCQAJAAkACQCAEKAIAQQ5rDgIBAAILIBJBATYCkAFB7NoKLQAARQ0CQdrnBEEmQQFBiPYIKAIAEDoaDAILIBJBAjYCkAFB7NoKLQAARQ0BQcroBEEkQQFBiPYIKAIAEDoaDAELIBJBADYCkAELIBJB6ABqIAEQ/QJEHMdxHMdxvD8hN0Qcx3Ecx3G8PyE4IBItAHhBAUYEQCASKwNoRAAAAAAAAFJAoyI4IDigITcgEisDcEQAAAAAAABSQKMiOCA4oCE4CyASIDg5A6ABIBIgNzkDmAFBACEPQezaCi0AAARAIBIgODkDCCASIDc5AwBBiPYIKAIAQZ2qBCASEDMLIAEQHCEFA0AgBQRAIDYgD0EEdGoiAiAFKAIQIgArAyA5AwAgAiAAKwMoOQMIIA9BAWohDyABIAUQHSEFDAELCyASKALIASECQZzbCi8BACEAQZjbCigCACEIIBJBgAFqISBBACEEQQAhBiMAQeAAayIfJAAgDCAAIBsgAhDKBxoCQCAMQQFGDQAgDEEAIAxBAEobISwDQCAEICxHBEBBASECQQEgFSAEQRRsaiIHKAIAIgUgBUEBTRshBQNAIAIgBUYEQCAEQQFqIQQMAwUgBygCCCACQQJ0aioCACJAIEIgQCBCXhshQiACQQFqIQIMAQsACwALCyAIRQ0AQezaCi0AAARAEK0BCwJAAkACfwJAAkACQCADQQFrDgMBAAIEC0Hs2gotAAAEQEHy7wBBGEEBQYj2CCgCABA6GgsgFSAMEMUHDAILIBUgDBDJByIGDQNBlY8EQQAQKkG04QRBABCAAQwCC0Hs2gotAAAEQEGL8ABBFUEBQYj2CCgCABA6GgsgFSAMEMcHCyIGDQELQezaCi0AAARAQd0tQRpBAUGI9ggoAgAQOhoLIBUgDBDJBSEGC0EAIQVB7NoKLQAABEAgHxCOATkDUEGI9ggoAgAiAkGpygQgH0HQAGoQM0GmK0EZQQEgAhA6GhCtAQsgACEOIAxBAWsiCiAMbEECbUQAAAAAAADwPyE3A0AgBSAORwRAIBsgBUECdGohAEEAIQIDQCACICxGBEAgBUEBaiEFDAMFIDcgACgCACACQQN0aisDAJkQIyE3IAJBAWohAgwBCwALAAsLRAAAAAAAACRAIDejIThBACEEQQAhAwNAAkAgAyAORgRAA0AgBCAORg0CIAwgGyAEQQJ0aigCABDPAiAEQQFqIQQMAAsACyAbIANBAnRqIQVBACECA0AgAiAsRgRAIANBAWohAwwDBSAFKAIAIAJBA3RqIgAgOCAAKwMAojkDACACQQFqIQIMAQsACwALCyAbKAIEIgMrAwAhOEEAIQIDQCACICxHBEAgAyACQQN0aiIAIAArAwAgOKE5AwAgAkEBaiECDAELCyAMaiEtQezaCi0AAARAIB8QjgE5A0BBiPYIKAIAQbS2ASAfQUBrEDMLIC0gBhC6BCAtIAYQ5AcCQCAgKAIwIgBBAEwEQCAGIQ8gDCEADAELQwAAgD8gQiBClCJAlSBAIEBDCtcjPF4bIUAgAEEBdCAMaiIAQQAgAEEAShshGSAAQQFrIgogAGxBAm0gAGoiLUEEEBohDyAAIQdBACEEQQAhBUEAIQMDQCAEIBlHBEAgB0EAIAdBAEobIRQgBEEBcSEYIAwgBGshE0EAIQIDQCACIBRGBEAgB0EBayEHIARBAWohBAwDBQJAIAQgDE4gAiATTnJFBEAgBiAFQQJ0aioCACFCIAVBAWohBQwBC0MAAAAAIEAgAkEBRxtDAAAAACAYGyFCCyAPIANBAnRqIEI4AgAgAkEBaiECIANBAWohAwwBCwALAAsLIAYQGAsgACAAQQgQGiIkENQFQQAhAiAKQQAgCkEAShshFiAAIQRBACEHA0AgByAWRwRAICQgB0EDdGohE0EBIQUgAkEBIAQgBEEBTBtqQQFrIQZEAAAAAAAAAAAhNwNAIAJBAWohAyACIAZGBEAgEyATKwMAIDehOQMAIARBAWshBCAHQQFqIQcgAyECDAMFIBMgBUEDdGoiAiACKwMAIA8gA0ECdGoqAgC7IjihOQMAIAVBAWohBSA3IDigITcgAyECDAELAAsACwtBACEDIABBACAAQQBKGyEQIAAhBUEAIQIDQCACIBBHBEAgDyADQQJ0aiAkIAJBA3RqKwMAtjgCACADIAVqIQMgAkEBaiECIAVBAWshBQwBCwtBACEEIA5BBBAaIR4gACAObCIHQQQQGiEFA0AgBCAORwRAIB4gBEECdCICaiAFIAAgBGxBAnRqIgY2AgAgAiAbaiEDQQAhAgNAIAIgEEYEQCAEQQFqIQQMAwUgBiACQQJ0aiACIAxIBH0gAygCACACQQN0aisDALYFQwAAAAALOAIAIAJBAWohAgwBCwALAAsLIA5BBBAaIiIgB0EEEBoiBjYCAEEBIA4gDkEBTRshBCAAIApsQQJtIQNBASECA0AgAiAERwRAICIgAkECdGogBiAAIAJsQQJ0ajYCACACQQFqIQIMAQsLQX8hBiAAQQQQGiEmIABBBBAaIScCQAJAAkAgACAPIBUgIEEAENoHIjBFDQAgACAPIBUgICAgKAIAENoHIjJFDQAgCEEBayEZICRBCGohFEGI9ggoAgAhMyADsrshPET////////vfyE4IC1BBBAaIS5EAAAAAAAAAAAhN0EAIQRBACEGA0AgBEEBcSAGIAhOckUEQCAAICQQ1AUgLSAPIC4Q4wdBACEaIAohBUEAIQNBACEHA0AgByAWRgRAIAAhA0EAIQQDQEEAIQIgBCAQRgRAQQAhBANAIAQgDkYEQAJARAAAAAAAAAAAITcDQCACIA5GDQEgNyAAIB4gAkECdCIDaigCACADICJqKAIAEM4CoCE3IAJBAWohAgwACwALBSAuIAAgHiAEQQJ0IgNqKAIAIAMgImooAgAQgAMgBEEBaiEEDAELCyA3IDegIDygITdBACECA0AgAiAORwRAIA8gACAeIAJBAnRqIgMoAgAgJhCAAyACQQFqIQIgNyAAIAMoAgAgJhDOAqEhNwwBCwsCQEHs2gotAABFDQAgHyA3OQMwIDNB7ckDIB9BMGoQMyAGQQpvDQBBCiAzEKcBGgtBACEEQQAhAyAgKAIQIQIgNyA4YwRAQZDbCisDACA3IDihIDhEu73X2d982z2go5lkIQMLAkAgA0UgBiAZSHENACA9RCuHFtnO9+8/Y0UgAkEBR3JFBEAgPUSamZmZmZm5P6AhPUHs2gotAAAEfyAfIAY2AiggHyA9OQMgIDNBzMAEIB9BIGoQMyAgKAIQBUEBCyECQQAhBgwBCyADIQQLID1E/Knx0k1iUD9kRSACQQFHckUEQCAwID22IB5BACA9RAAAAAAAAOA/ZiAgENMFCwJAAkACQAJAIDAoAhRBAEoEQCAwICIoAgAgHigCABDtDBoMAQsgDyAeKAIAICIoAgAgACAAELkEQQBIDQELID1E/Knx0k1iUD9kRSAgKAIQQQFHckUEQCAyID22IB5BAUEAICAQ0wULIDIoAhRBAEwNASAyICIoAgQgHigCBBDtDEEATg0CC0F/IQYMCQsgDyAeKAIEICIoAgQgACAAELkEGgsgBkEBaiEGIDchOAwFBSAuIBpBAnRqICQgBEEDdGorAwC2OAIAIAMgGmohGiAEQQFqIQQgA0EBayEDDAELAAsABSAFQQAgBUEAShshFyAAQwAAAAAgJxDyAyAAIAdBf3NqIRhBACEEA0AgBCAORwRAIBggB0ECdCITIB4gBEECdGoiAigCAGoqAgAgJhDyAyAYICZDAACAvyACKAIAIBNqQQRqENUFIBggJhC6BCAYICYgJyAnEP0MIARBAWohBAwBCwsgGCAnEOIHQQAhAgNAAkAgAiAXRgRAIBQgB0EDdCIYaiETQQAhAkQAAAAAAAAAACE3DAELICcgAkECdGoiBCoCACJAQ///f39gIEBDAAAAAF1yBEAgBEEANgIACyACQQFqIQIMAQsLA0AgA0EBaiEDIAIgF0cEQCAuIANBAnRqIgQgJyACQQJ0aioCACAEKgIAlCJAOAIAIBMgAkEDdGoiBCAEKwMAIEC7IjmhOQMAIDcgOaAhNyACQQFqIQIMAQsLIBggJGoiAiACKwMAIDehOQMAIAVBAWshBSAHQQFqIQcMAQsACwALC0Hs2gotAAAEQCAfEI4BOQMQIB8gBjYCCCAfIDc5AwAgM0GxyQQgHxAzCyAwENkHIDIQ2QcgICgCEEECRw0AIAwgHiAgEOwMCyAeRQ0BC0EAIQcDQCAHIA5HBEAgGyAHQQJ0IgBqIQMgACAeaiEAQQAhAgNAIAIgLEYEQCAHQQFqIQcMAwUgAygCACACQQN0aiAAKAIAIAJBAnRqKgIAuzkDACACQQFqIQIMAQsACwALCyAeKAIAEBggHhAYCyAiKAIAEBggIhAYICYQGCAnEBggJBAYIA8QGCAuEBgLIB9B4ABqJAAgBiEFICkEQCARKAIAEBggERAYIAsQGCA1EBggDRAYCyA2EBgMAQsgFSAMIBsgEigCyAFBnNsKLwEAIAUgA0GY2wooAgAQxAchBQsgBUEASARAQf23BEEAEIABDAULIAEQHCEKA0AgCkUNBUEAIQVBnNsKLwEAIQMgCigCECICKAKIAUEDdCEAA0AgAyAFRgRAIAEgChAdIQoMAgUgAigClAEgBUEDdGogGyAFQQJ0aigCACAAaisDADkDACAFQQFqIQUMAQsACwALAAsFIBsgBUECdGogByAFIAxsQQN0ajYCACAFQQFqIQUMAQsLQZeyA0Hv+gBB0QBB3yEQAAALQdgpQdC4AUH1AUHW2wAQAAALIBUQvgwgGygCABAYIBsQGCASKALIARAYDAELIAEgDBDIDUEAIQIjAEHgAGsiFSQAQezaCi0AAARAQaTMA0EZQQFBiPYIKAIAEDoaEK0BCyAMQQAgDEEAShshDyABKAIQIgAoAqABIREgACgCpAEhCgNAIAIgD0cEQCAKIAJBAnQiDmohCyAOIBFqIQdBACEAA0AgACACRwRARAAAAAAAAPA/IABBA3QiBSAHKAIAaisDACI4IDiioyE3IAEgASgCECgCmAEiBCAOaigCACAEIABBAnQiBmooAgBBAEEAEF4iBARAIDcgBCgCECsDgAGiITcLIAYgCmooAgAgAkEDdGogNzkDACALKAIAIAVqIDc5AwAgAEEBaiEADAELCyACQQFqIQIMAQsLQQAhAkGc2wovAQAhBAN/QQAhACACIA9GBH8gASgCECITKAKYASEOQQAFA0AgACAERwRAIAEoAhAoAqgBIAJBAnRqKAIAIABBA3RqQgA3AwAgAEEBaiEADAELCyACQQFqIQIMAQsLIQYDQAJAAkAgDiAGQQJ0IgpqKAIAIgsEQEEAIQJBnNsKLwEAIQcDQCACIA9GDQICQCACIAZGDQBBACEAIAsoAhAoApQBIA4gAkECdCIFaigCACgCECgClAEgFUEQahDHDSE3A0AgACAHRg0BIABBA3QiESATKAKsASAKaigCACAFaigCAGogAkEDdCIEIBMoAqQBIApqKAIAaisDACAVQRBqIBFqKwMAIjggOCATKAKgASAKaigCACAEaisDAKIgN6OhoiI4OQMAIBMoAqgBIApqKAIAIBFqIgQgOCAEKwMAoDkDACAAQQFqIQAMAAsACyACQQFqIQIMAAsAC0Hs2gotAAAEQCAVEI4BOQMAQYj2CCgCAEGrygQgFRAzCyAVQeAAaiQADAELIAZBAWohBgwBCwtB7NoKLQAABEAgEiADNgJQIBJBmNsKKAIANgJUIBJBkNsKKwMAOQNYQYj2CCgCAEGIqwQgEkHQAGoQMxCtAQsgASEDIwBBwAJrIggkAEHA/gpBkNsKKwMAIjggOKI5AwAgDEEAIAxBAEobIRZBiPYIKAIAIQ0DQAJAQdT+CkHU/gooAgBBAWoiBTYCACADKAIQIgcoApwBQZjbCigCAE4NAEEAIQtBnNsKLwEAIQZEAAAAAAAAAAAhN0EAIQIDQCALIBZHBEACQCALQQJ0IgQgBygCmAFqKAIAIgAoAhAtAIcBQQFLDQBEAAAAAAAAAAAhOEEAIQEDQCABIAZHBEAgBygCqAEgBGooAgAgAUEDdGorAwAiOSA5oiA4oCE4IAFBAWohAQwBCwsgNyA4Y0UNACA4ITcgACECCyALQQFqIQsMAQsLIDdBwP4KKwMAYw0AAkBB7NoKLQAARSAFQeQAb3INACAIIDefOQNAIA1B7ckDIAhBQGsQM0HU/gooAgBB6AdvDQBBCiANEKcBGgsgAkUNAEEAIRUgCEGgAWpBAEHQABA4GiAIQdAAakEAQdAAEDgaIAIoAhAoAogBIRdBnNsKLwEAIgAgAGxBCBAaIQAgAygCECIPKAKYASIKIBdBAnQiEGooAgAhDkGc2wovAQAhBiAPKAKgASAPKAKkASEFA0AgBiAVRwRAIAAgBiAVbEEDdGohBEEAIQEDQCABIAZHBEAgBCABQQN0akIANwMAIAFBAWohAQwBCwsgFUEBaiEVDAELCyAGQQFqIREgEGohCyAFIBBqIQdBACETA38gEyAWRgR/QQEhBUEBIAYgBkEBTRsFAkAgEyAXRg0AIAogE0ECdGooAgAhBEQAAAAAAAAAACE3QQAhAQNAIAEgBkcEQCABQQN0IgUgCEHwAWpqIA4oAhAoApQBIAVqKwMAIAQoAhAoApQBIAVqKwMAoSI4OQMAIDggOKIgN6AhNyABQQFqIQEMAQsLRAAAAAAAAPA/IDdEAAAAAAAA+D8QnQGjITtBACEVA0AgBiAVRg0BIBNBA3QiASAHKAIAaisDACI8IAsoAgAgAWorAwAiOaIgFUEDdCIBIAhB8AFqaisDACI9oiE4IAAgAWohBUEAIQEDQCABIBVHBEAgBSABIAZsQQN0aiIEIDggCEHwAWogAUEDdGorAwCiIDuiIAQrAwCgOQMAIAFBAWohAQwBCwsgACARIBVsQQN0aiIBIDxEAAAAAAAA8D8gOSA3ID0gPaKhoiA7oqGiIAErAwCgOQMAIBVBAWohFQwACwALIBNBAWohEwwBCwshCwNAAkAgBSALRwRAIAAgBUEDdGohByAAIAUgBmxBA3RqIQRBACEBA0AgASAFRg0CIAQgAUEDdGogByABIAZsQQN0aisDADkDACABQQFqIQEMAAsAC0EAIQEDQCABIAZHBEAgAUEDdCIEIAhB0ABqaiAPKAKoASAQaigCACAEaisDAJo5AwAgAUEBaiEBDAELCyAAIQQgCEGgAWohGSAIQdAAaiEaQQAhAUEAIQUCQAJAAkAgBkEBSwRAIAYgBmwiFBDDASEYIAYQwwEhGwNAIAUgBkYEQANAIAEgFEYEQCAGQQFrIRVBACEAA0AgACAVRg0GIAQgAEEDdCITaiELRAAAAAAAAAAAITdBACEFIAAhAQNAIAEgBk8EQCA3RLu919nffNs9Yw0JIAQgACAGbEEDdGohDyAEIAUgBmxBA3RqIREgACEBA0AgASAGTwRAIBogBUEDdGoiASkDACFGIAEgEyAaaiIKKwMAOQMAIAogRjcDACAPIBNqIQ4gACEFA0AgBiAFQQFqIgVLBEAgGiAFQQN0aiIBIAQgBSAGbEEDdGoiESATaisDAJogDisDAKMiOCAKKwMAoiABKwMAoDkDAEEAIQEDQCABIAZGDQIgESABQQN0IgtqIgcgOCALIA9qKwMAoiAHKwMAoDkDACABQQFqIQEMAAsACwsgAEEBaiEADAQFIBEgAUEDdCILaiIHKQMAIUYgByALIA9qIgcrAwA5AwAgByBGNwMAIAFBAWohAQwBCwALAAUgNyALIAEgBmxBA3RqKwMAmSI4IDcgOGQiBxshNyAFIAEgBxshBSABQQFqIQEMAQsACwALAAUgGCABQQN0IgBqIAAgBGorAwA5AwAgAUEBaiEBDAELAAsABSAbIAVBA3QiAGogACAaaisDADkDACAFQQFqIQUMAQsACwALQczuAkH8vAFBGkG8iQEQAAALIAQgFEEDdGpBCGsrAwAiOJlEu73X2d982z1jDQAgGSAVQQN0IgBqIAAgGmorAwAgOKM5AwAgBkEBaiERQQAhAEEAIQUDQCAFIBVGBEADQCAAIAZGBEBBACEBA0AgASAURg0GIAQgAUEDdCIAaiAAIBhqKwMAOQMAIAFBAWohAQwACwAFIBogAEEDdCIBaiABIBtqKwMAOQMAIABBAWohAAwBCwALAAsgGSAGIAVrIgdBAmsiCkEDdCIBaiIOIAEgGmorAwAiNzkDACAHQQFrIQEgBCAGIApsQQN0aiELA0AgASAGTwRAIA4gNyAEIAogEWxBA3RqKwMAozkDACAFQQFqIQUMAgUgDiA3IAsgAUEDdCIHaisDACAHIBlqKwMAoqEiNzkDACABQQFqIQEMAQsACwALAAtBpNkKKAIAGgJAQbSsAUHY2AoQiwFBAEgNAAJAQajZCigCAEEKRg0AQezYCigCACIAQejYCigCAEYNAEHs2AogAEEBajYCACAAQQo6AAAMAQtB2NgKQQoQpQcaCwsgGBAYIBsQGEEAIQEDQEGc2wovAQAiESABSwRAQbDbCisDACE3ENcBITggAUEDdCIGIAhBoAFqaiIAIAArAwAgNyA4RAAAAAAAAPA/IDehIjggOKCioKIiODkDACACKAIQKAKUASAGaiIAIDggACsDAKA5AwAgAUEBaiEBDAELCyADKAIQIg8gDygCnAFBAWo2ApwBIA8oApgBIgsgEGooAgAhB0EAIQEDQCABIBFGBEBBACEVA0AgFSAWRwRAAkAgFSAXRg0AQQAhEyAHKAIQKAKUASALIBVBAnQiDmooAgAoAhAoApQBIAhB8AFqEMcNITkDQCARIBNGDQEgE0EDdCIKIA8oAqwBIgUgEGooAgAgDmooAgBqIgYgFUEDdCIAIA8oAqQBIBBqKAIAaisDACAIQfABaiAKaisDACI4IDggDygCoAEgEGooAgAgAGorAwCiIDmjoaIiODkDACAPKAKoASIBIBBqKAIAIApqIgAgOCAAKwMAoDkDACAFIA5qKAIAIBBqKAIAIApqIgArAwAhNyAAIAYrAwCaIjg5AwAgASAOaigCACAKaiIAIDggN6EgACsDAKA5AwAgE0EBaiETDAALAAsgFUEBaiEVDAELC0Hg3gooAgAEQEEAIQFBnNsKLwEAIQBEAAAAAAAAAAAhOANAIAAgAUcEQCA4IAhBoAFqIAFBA3RqKwMAmaAhOCABQQFqIQEMAQsLIAIQISEAIAggOJ85AzggCCAANgIwIA1Bx6UEIAhBMGoQMwsgBBAYDAUFIA8oAqgBIBBqKAIAIAFBA3RqQgA3AwAgAUEBaiEBDAELAAsACyAFQQFqIQUMAAsACwtBACEBQezaCi0AAARAQQEgDCAMQQFMG0EBayELQZzbCi8BACEHRAAAAAAAAAAAITcDQCABIAtHBEAgAygCECIOKAKYASIFIAFBAnQiEWooAgAhBiABQQFqIgAhCgNAIAogDEYEQCAAIQEMAwUgBSAKQQJ0aigCACEEQQAhAUQAAAAAAAAAACE4A0AgASAHRwRAIAFBA3QiAiAGKAIQKAKUAWorAwAgBCgCECgClAEgAmorAwChIjkgOaIgOKAhOCABQQFqIQEMAQsLIApBA3QiASAOKAKkASARaigCAGorAwAgDigCoAEgEWooAgAgAWorAwAiOUQAAAAAAAAAwKIgOJ+iIDkgOaIgOKCgoiA3oCE3IApBAWohCgwBCwALAAsLIAggNzkDICANQfqGASAIQSBqEDNBmNsKKAIAIQAgAygCECgCnAEhASAIEI4BOQMYIAggATYCECAIQbrHA0Hx/wQgACABRhs2AhQgDUGWyQQgCEEQahAzCyADKAIQKAKcASIAQZjbCigCAEYEQCAIIAMQITYCBCAIIAA2AgBB0/cDIAgQKgsgCEHAAmokAAsgEkHQAWokAA8LQcmyA0Hv+gBBwgBB6SIQAAALyQUBCH8jAEEgayIBJAAgAUIANwMYIAFCADcDEAJAQZzbCi8BAEEDSQ0AQbjcCigCAEUNACAAEBwhBwNAIAcEQCABIAcoAhAoApQBKwMQRAAAAAAAAFJAojkDACABQRBqIQJBACEFIwBBMGsiAyQAIAMgATYCDCADIAE2AiwgAyABNgIQAkACQAJAAkACQAJAQQBBAEHwgwEgARBgIghBAEgNACAIQQFqIQQCQCACEEsgAhAkayIGIAhLDQAgBCAGayEGIAIQKARAQQEhBSAGQQFGDQELIAIgBhCRA0EAIQULIANCADcDGCADQgA3AxAgBSAIQRBPcQ0BIANBEGohBiAIIAUEfyAGBSACEHMLIARB8IMBIAMoAiwQYCIERyAEQQBOcQ0CIARBAEwNACACECgEQCAEQYACTw0EIAUEQCACEHMgA0EQaiAEEB8aCyACIAItAA8gBGo6AA8gAhAkQRBJDQFBk7YDQaD8AEHqAUH4HhAAAAsgBQ0EIAIgAigCBCAEajYCBAsgA0EwaiQADAQLQcamA0Gg/ABB3QFB+B4QAAALQa2eA0Gg/ABB4gFB+B4QAAALQfnNAUGg/ABB5QFB+B4QAAALQaOeAUGg/ABB7AFB+B4QAAALQbjcCigCACEFAkAgAhAoBEAgAhAkQQ9GDQELIAFBEGoiAhAkIAIQS08EQCACQQEQkQMLIAFBEGoiAhAkIQMgAhAoBEAgAiADakEAOgAAIAEgAS0AH0EBajoAHyACECRBEEkNAUGTtgNBoPwAQa8CQcSyARAAAAsgASgCECADakEAOgAAIAEgASgCFEEBajYCFAsCQCABQRBqECgEQCABQQA6AB8MAQsgAUEANgIUCyABQRBqIgIQKCEDIAcgBSACIAEoAhAgAxsQcSAAIAcQHSEHDAELCyABLQAfQf8BRw0AIAEoAhAQGAsgAUEgaiQAC5kiAhJ/CnwjAEHwAGsiDCQAQYDbCisDACEbAkACQEH42gooAgAEQEGA2wpCgICAgICAgKnAADcDACAAELQMIAAQwQcjAEGQAWsiBCQAIAAiA0EAQfXZAEEAECIhASAAQQBB/L8BQQAQIiEKIABBpJIBECcQaCEQIApFBEAgAEEAQfy/AUHx/wQQIiEKCyADQQAQyw0aAkACQAJAAkADQCADKAIQKAKYASACQQJ0aigCACIFBEAgBSgCECIALQCHAQR/IAAFIAUQIUHiNxDCAkUNAyAFKAIQCygCfCIABEAgBSAAQdrZABCxBAsgAkEBaiECDAELCyADIAEgChC3DAJAIAMQtAJFBEBBAiEBDAELQQAhASADQQJBjCtBABAiIg5FDQBB+NoKKAIAQQJIDQAgAxAcIQ8DQCAPBEAgAyAPECwhCgNAIAoEQAJAIAogDhBFIgItAABFDQAgCiAEQfwAaiAEQfgAahDcBkEAIQhEAAAAAAAAAAAhF0EBIRFEAAAAAAAAAAAhFEQAAAAAAAAAACEVRAAAAAAAAAAAIRZBACESA0AgEQRAIAQgBEGMAWo2AkggBCAEQYABajYCRCAEIARB2ABqNgJAIAJBkesAIARBQGsQUUECRgRAQQEhEiAEKwOAASEVIAIgBCgCjAFqIQIgBCsDWCEWCyAEIARBjAFqNgI4IAQgBEGAAWo2AjQgBCAEQdgAajYCMEEAIQAgAkGd6wAgBEEwahBRQQJGBEBBASEIIAQrA4ABIRcgBCsDWCEUIAIgBCgCjAFqIQILIAIhBQNAAkACQAJAAkAgBS0AACIBDg4DAgICAgICAgIBAQEBAQALIAFBIEcNAQsgBUEBaiEFDAILIABBAWohAANAAkACQCABQf8BcSIBDg4DAQEBAQEBAQEEBAQEBAALIAFBIEYNAyABQTtGDQILIAUtAAEhASAFQQFqIQUMAAsACwsgAEEDcEEBRiAAQQRPcUUEQCAKEJkEQdT/Ci0AAEHU/wpBAToAAEEBcQ0DIApBMEEAIAooAgBBA3FBA0cbaigCKBAhIQAgBCAKQVBBACAKKAIAQQNxQQJHG2ooAigQITYCJCAEIAA2AiBB2uMDIARBIGoQKgwDCyAAIgFBEBAaIgYhBQNAIAEEQCAEIARBjAFqNgIYIAQgBEGAAWo2AhQgBCAEQdgAajYCECACQaDrACAEQRBqEFFBAUwEQEHU/wotAABB1P8KQQE6AABBAXFFBEAgCkEwQQAgCigCAEEDcUEDRxtqKAIoECEhACAEIApBUEEAIAooAgBBA3FBAkcbaigCKBAhNgIEIAQgADYCAEHo7QQgBBAqCyAGEBggChCZBAwFBSAEKAKMASENIAQrA1ghEyAFIAQrA4ABOQMIIAUgEzkDACABQQFrIQEgBUEQaiEFIAIgDWohAgwCCwALCwNAIAItAAAiBUEJayIBQRdLQQEgAXRBn4CABHFFckUEQCACQQFqIQIMAQsLIAogABDeBiEJIBIEQCAEKAJ8IQEgCSAVOQMYIAkgFjkDECAJIAE2AggLIAgEQCAEKAJ4IQEgCSAXOQMoIAkgFDkDICAJIAE2AgwLIAIgBUEARyIRaiECQQAhBQNAIAAgBUcEQCAFQQR0IgEgCSgCAGoiDSABIAZqIgEpAwA3AwAgDSABKQMINwMIIAVBAWohBQwBCwsgBhAYDAELCyAKKAIQIgUoAmAiAARAIAogAEH12QAQsQQgCigCECEFCyAFKAJsIgAEQCAKIABB2tkAELEEIAooAhAhBQsgBSgCZCIABH8gCiAAQfDZABCxBCAKKAIQBSAFCygCaCIABEAgCiAAQejZABCxBAsgC0EBaiELCyADIAoQMCEKDAELCyADIA8QHSEPDAELCyALRQRAQQAhAQwBC0ECQQEgAxC0AiALRhshAQtBACEAQQAhCiADKAIQKAIIIgIoAlgiCARAIAJBADYCVEEBIQoLAkAgCA0AQfjaCigCAEEBRw0AIAMQtgRFDQBBASEAIAMoAhAoAgwiAkUNACACQQA6AFELIAMQwQIgCARAIAMoAhAhD0QAAAAAAAAAACEVRAAAAAAAAAAAIRZBACERQQAhEkEAIQ4jAEFAaiILJAAgAygCECICKAKQASENIARB2ABqIgkgAikDEDcDACAJIAIpAyg3AxggCSACKQMgNwMQIAkgAikDGDcDCAJAIAIoAggoAlgiBkUNAAJAIAkrAwAgCSsDEGINACAJKwMIIAkrAxhiDQAgCUL/////////dzcDGCAJQv/////////3/wA3AwAgCUL/////////9/8ANwMIIAlC/////////3c3AxALIAYoAgghBwNAIBEgBigCAE8NASALQgA3AzggC0IANwMwIAtCADcDKCALQgA3AyACQAJAAkACQAJA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AisDAKEiGyAboiACKwMYIAIrAwihIhsgG6KgIAUrAxAgBSsDAKEgBCsDOKAgBCsDKKEiGyAbokQAAAAAAADQP6JlIQMMAQsgBSgCICEDIAUoAiQgASACKQMYNwPIAiABIAIpAxA3A8ACIAMgAUHAAmoQ5gwhBiAEKAJIIQMgBCgCTCABIAIpAwg3A7gCIAEgAikDADcDsAIgAyABQbACahDmDCEHIAQoAkgiEUEBdCEXIAUoAiAiDkEBdCEYIBFBAWshGSAOQQFrIRpBACEDQQAhCAJAA0AgASAGIAhBBHRqIgkpAwg3A6gCIAEgCSkDADcDoAIgASAGIAggGmogDm9BBHRqIhIpAwg3A5gCIAEgEikDADcDkAIgAUHABGogAUGgAmogAUGQAmoQ6wwgASAHIAxBBHRqIgspAwg3A4gCIAEgCykDADcDgAIgASAHIAwgGWogEW9BBHRqIhMpAwg3A/gBIAEgEykDADcD8AEgAUGwBGogAUGAAmogAUHwAWoQ6wwgAUIANwOYBCABQgA3A+gBIAEgASkDyAQ3A9gBIAEgASkDuAQ3A8gBIAFCADcDkAQgAUIANwPgASABIAEpA8AENwPQASABIAEpA7AENwPAASABKwPoASABKwPYASIboSABKwPAASABKwPQASIcoaIgASsDyAEgG6EgASsD4AEgHKGioSEfIAEgEikDCDcDuAEgASASKQMANwOwASABIAkpAwg3A6gBIAEgCSkDADcDoAEgASALKQMINwOYASABIAspAwA3A5ABIAFBsAFqIAFBoAFqIAFBkAFqEOoMIRUgASATKQMINwOIASABIBMpAwA3A4ABIAEgCykDCDcDeCABIAspAwA3A3AgASAJKQMINwNoIAEgCSkDADcDYCABQYABaiABQfAAaiABQeAAahDqDCEWIAEgEikDCDcDWCABIBIpAwA3A1AgASAJKQMINwNIIAEgCSkDADcDQCABIBMpAwg3AzggASATKQMANwMwIAEgCykDCDcDKCABIAspAwA3AyAgASsDMCIgIAErA1giGyABQUBrIgkrAwgiIaGiIAErAyAiJSAhIBuhIiKiIAErA1AiHiABKwMoIh0gASsDOCIcoaIiJiAJKwMAIiMgHCAdoaKgoKAiJEQAAAAAAAAAAGIEfyABICUgHCAboaIgJiAgIBsgHaGioKAgJKMi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AgAiESAKKAIASARAIBAgAkECdCIRaiAMNgIAIAMgEWogBCAFaigCADYCACACQQFqIQIMAQsgAyARQQJ0aiIMIAwoAgAgBCAFaigCAGo2AgALIABBAWohAAwBCwsgByAJaiACNgIAIAEhAAwACwALIANBACADQQBKGyEJQQAhAANAIAAgCUYNByAPIABBAWoiAUECdCIDaiEEIA8gAEECdCIFaigCACEAA0AgACAEKAIATkUEQCAGIBQgAEECdGooAgAiCEECdGogAjYCACAQIAJBAnRqIAg2AgAgAEEBaiEAIAJBAWohAgwBCwsgBSAHaiEEIAMgDmohCCAFIA5qKAIAIQADQCAAIAgoAgBORQRAIAYgEyAAQQJ0aigCACIFQQJ0aigCACAEKAIASARAIBAgAkECdGogBTYCACACQQFqIQILIABBAWohAAwBCwsgAyAHaiACNgIAIAEhAAwACwALIAVBAUYNBAsgEkHqBDYCBCASQZa3ATYCAEGI9ggoAgBB2L8EIBIQIBoQOwALQcLeAUGWtwFBlQRBr7ABEAAAC0GH0AFBlrcBQZYEQa+wARAAAAtB2pUBQZa3AUGXBEGvsAEQAAALIANBACADQQBKGyEIIA0oAhwhAyABKAIcIQUgACgCHCEVQQAhAANAIAAgCEYNASAPIABBAWoiAUECdCIJaiEKIA8gAEECdCIEaigCACEAA0AgACAKKAIATkUEQCAGIBQgAEECdGooAgAiC0ECdGogAjYCACAQIAJBAnRqIAs2AgAgAyACQQN0aiAVIABBA3RqKwMAOQMAIABBAWohACACQQFqIQIMAQsLIAQgB2ohCiAJIA5qIQsgBCAOaigCACEAA0AgACALKAIATkUEQAJAIAYgEyAAQQJ0aigCACIEQQJ0aigCACIMIAooAgBIBEAgECACQQJ0aiAENgIAIAMgAkEDdGogBSAAQQN0aisDADkDACACQQFqIQIMAQsgAyAMQQN0aiIEIAUgAEEDdGorAwAgBCsDAKA5AwALIABBAWohAAwBCwsgByAJaiACNgIAIAEhAAwACwALIA0gAjYCCCAGEBgLIBJBEGokACANC8sHAg9/AXwjAEEQayINJAACQCAARQRADAELAkACQCAAKAIgRQRAIAAoAhghDiAAKAIUIQcgACgCBCIIIAAoAgAiAiAAKAIIIgEgACgCEEEAELYCIgkgATYCCCAJKAIYIQ8gCSgCFCEDQX8gCCAIQQBIG0EBaiEKQQAhAQNAIAEgCkYEQEEAIQEgAkEAIAJBAEobIQogA0EEaiEFA0ACQCABIApGBEBBACEBIAhBACAIQQBKGyECDAELIAcgAUEBaiICQQJ0aiEEIAcgAUECdGooAgAhAQNAIAQoAgAgAUwEQCACIQEMAwUgBSAOIAFBAnRqKAIAQQJ0aiILIAsoAgBBAWo2AgAgAUEBaiEBDAELAAsACwsDQCABIAJGRQRAIAFBAnQhBSADIAFBAWoiAUECdGoiBCAEKAIAIAMgBWooAgBqNgIADAELC0EAIQICQAJAAkACQCAAKAIQIgFBBGsOBQADAwMBAgsgCSgCHCEFIAAoAhwhBEEAIQADQCAAIApGDQggByAAQQFqIgJBAnRqIQsgByAAQQJ0aigCACEBA0AgCygCACABTARAIAIhAAwCBSAPIAMgDiABQQJ0IgZqIgwoAgBBAnRqKAIAQQJ0aiAANgIAIAQgBmooAgAhBiADIAwoAgBBAnRqIgwgDCgCACIMQQFqNgIAIAUgDEECdGogBjYCACABQQFqIQEMAQsACwALAAsDQCACIApGDQcgByACQQFqIgBBAnRqIQUgByACQQJ0aigCACEBA0AgBSgCACABTARAIAAhAgwCBSADIA4gAUECdGooAgBBAnRqIgQgBCgCACIEQQFqNgIAIA8gBEECdGogAjYCACABQQFqIQEMAQsACwALAAsgAUEBRg0ECyANQfQANgIEIA1BlrcBNgIAQYj2CCgCAEHYvwQgDRAgGhA7AAUgAyABQQJ0akEANgIAIAFBAWohAQwBCwALAAtBodABQZa3AUHFAEGckwEQAAALIAkoAhwhBSAAKAIcIQQDQCACIApGDQEgByACQQFqIgBBAnRqIQsgByACQQJ0aigCACEBA0AgCygCACABTARAIAAhAgwCBSAPIAMgDiABQQJ0aiIGKAIAQQJ0aigCAEECdGogAjYCACAEIAFBA3RqKwMAIRAgAyAGKAIAQQJ0aiIGIAYoAgAiBkEBajYCACAFIAZBA3RqIBA5AwAgAUEBaiEBDAELAAsACwALA0AgCEEATEUEQCADIAhBAnRqIAMgCEEBayIIQQJ0aigCADYCAAwBCwsgA0EANgIACyANQRBqJAAgCQsLACAAIAFBAhD/Bws+AQJ8IAG3IQMDQEGc2wovAQAgAkoEQBDXASEEIAAoAhAoApQBIAJBA3RqIAQgA6I5AwAgAkEBaiECDAELCwv3AQICfwJ8IwBBMGsiAyQAIAAgARAsIQEDQCABBEACQAJAIAJFDQAgASACEEUiBC0AAEUNACADIANBKGo2AiACQCAEQfCDASADQSBqEFFBAEwNACADKwMoIgVEAAAAAAAAAABjDQAgBUQAAAAAAAAAAGINAkH42gooAgANAgsgAyAENgIQQem1AyADQRBqECogABAhIQQgA0KAgICAgICA+D83AwggAyAENgIAQbGmBCADEIABCyADQoCAgICAgID4PzcDKEQAAAAAAADwPyEFCyABKAIQIAU5A4gBIAYgBaAhBiAAIAEQMCEBDAELCyADQTBqJAAgBguQAQEFfyMAQeAAayIDJAAgAEEBQab0AEHx/wQQIiEFIABBAUHlOUHx/wQQIiEGIAAQHCECIAFBAkkhAQNAIAIEQCADQTdqIgQgAigCEDQC9AEQzA0gAiAFIAQQcSABRQRAIANBDmoiBCACKAIQNAL4ARDMDSACIAYgBBBxCyAAIAIQHSECDAELCyADQeAAaiQAC9gBAQJ/IAAQeSEBA0AgAQRAIAEQggggARB4IQEMAQsLAkAgAEHiJUEAQQEQNkUNACAAKAIQKAIIEBggACgCECIBQQA2AgggASgCuAEQGCAAKAIQKAKMAhAYIAAoAhAoAtgBEBggACgCECICKALEAQRAIAIoAugBIQEDQCABIAIoAuwBSkUEQCACKALEASABQcgAbGooAgwQGCABQQFqIQEgACgCECECDAELCyACKALEAUG4f0EAIAIoAugBQX9GG2oQGAsgABA5IABGDQAgACgCECgCDBC8AQsLzgIBA38jAEHQAGsiAiQAIAJCADcDSCACQgA3A0ACfyAAEDxFBEAgAUEANgIAQQAMAQsgAkIANwM4IAJCADcDMCACQgA3AyggAkIANwMYIAJCADcDECACQgA3AwggAkG6AzYCJCACQbsDNgIgIAAQHCEDA0AgAwRAIAMoAhBBADYCsAEgACADEB0hAwwBCwsgABAcIQMDQCADBEAgA0F/IAIoAiQRAABFBEAgAkFAayIEQQAQ6AUgAiACKAIwNgIAIAQgAhDnBSAAIAQQsQNBARCSASIEQeIl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AigCACAFIAIpAgg3A7gGIAUgAikCADcDsAYgBUGwBmogAxAZQcgAbGooAixBAWtBfUsNACACKAIAIAUgAikCCDcD+AMgBSACKQIANwPwAyAFQfADaiADEBlByABsaigCPCACKAIAIQAgBSACKQIINwPoAyAFIAIpAgA3A+ADIAVB4ANqIAMQGSEBQQFrQX1NBEAgAigCACEGAn8gACABQcgAbGooAkBBAUYEQCAFIAIpAgg3A8gBIAUgAikCADcDwAEgBiAFQcABaiADEBlByABsaigCLCEAIAIoAgAgBSACKQIINwO4ASAFIAIpAgA3A7ABIAVBsAFqIAQQGUHIAGxqIAA2AiggAigCACAFIAIpAgg3A6gBIAUgAikCADcDoAEgBUGgAWogAxAZQcgAbGpBfzYCLCACKAIAIAUgAikCCDcDmAEgBSACKQIANwOQASAFQZABaiADEBlByABsaigCPCEAIAIoAgAgBSACKQIINwOIASAFIAIpAgA3A4ABIAVBgAFqIAQQGUHIAGxqIAA2AiwgAigCACEAIAUgAikCCDcDeCAFIAIpAgA3A3AgACAFQfAAaiADEBlByABsaigCKCEBIAUgAikCCDcDaCAFIAIpAgA3A2AgACAFQeAAaiABEBlByABsaiADNgIwIAIoAgAhACAFIAIpAgg3A1ggBSACKQIANwNQIAAgBUHQAGogBBAZQcgAbGooAighASAFIAIpAgg3A0ggBSACKQIANwNAIAAgBUFAayABEBlByABsaiAENgIwIAIoAgAhACAFIAIpAgg3AzggBSACKQIANwMwIAAgBUEwaiAEEBlByABsakEsagwBCyAFIAIpAgg3A4gDIAUgAikCADcDgAMgBiAFQYADaiAEEBlByABsakF/NgIsIAIoAgAgBSACKQIINwP4AiAFIAIpAgA3A/ACIAVB8AJqIAMQGUHIAGxqKAIsIQAgAigCACAFIAIpAgg3A+gCIAUgAikCADcD4AIgBUHgAmogBBAZQcgAbGogADYCKCACKAIAIAUgAikCCDcD2AIgBSACKQIANwPQAiAFQdACaiADEBlByABsaigCKCEAIAIoAgAgBSACKQIINwPIAiAFIAIpAgA3A8ACIAVBwAJqIAMQGUHIAGxqIAA2AiwgAigCACAFIAIpAgg3A7gCIAUgAikCADcDsAIgBUGwAmogAxAZQcgAbGooAjwhACACKAIAIAUgAikCCDcDqAIgBSACKQIANwOgAiAFQaACaiADEBlByABsaiAANgIoIAIoAgAhACAFIAIpAgg3A5gCIAUgAikCADcDkAIgACAFQZACaiADEBlByABsaigCKCEBIAUgAikCCDcDiAIgBSACKQIANwOAAiAAIAVBgAJqIAEQGUHIAGxqIAM2AjAgAigCACEAIAUgAikCCDcD+AEgBSACKQIANwPwASAAIAVB8AFqIAMQGUHIAGxqKAIsIQEgBSACKQIINwPoASAFIAIpAgA3A+ABIAAgBUHgAWogARAZQcgAbGogAzYCMCACKAIAIQAgBSACKQIINwPYASAFIAIpAgA3A9ABIAAgBUHQAWogBBAZQcgAbGpBKGoLKAIAIQEgBSACKQIINwMoIAUgAikCADcDICAAIAVBIGogARAZQcgAbGogBDYCMCACKAIAIAUgAikCCDcDGCAFIAIpAgA3AxAgBUEQaiADEBlByABsakEANgI8IAIoAgAgBSACKQIINwMIIAUgAikCADcDACAFIAQQGUHIAGxqQQA2AjwMAgsgACABQcgAbGooAiwhACACKAIAIAUgAikCCDcD2AMgBSACKQIANwPQAyAFQdADaiAEEBlByABsaiAANgIoIAIoAgAgBSACKQIINwPIAyAFIAIpAgA3A8ADIAVBwANqIAMQGUHIAGxqQX82AiwgAigCACAFIAIpAgg3A7gDIAUgAikCADcDsAMgBUGwA2ogBBAZQcgAbGpBfzYCLCACKAIAIQAgBSACKQIINwOoAyAFIAIpAgA3A6ADIAAgBUGgA2ogBBAZQcgAbGooAighASAFIAIpAgg3A5gDIAUgAikCADcDkAMgACAFQZADaiABEBlByABsaiAENgIwDAELIAIoAgAgBSACKQIINwOoBiAFIAIpAgA3A6AGIAVBoAZqIAMQGUHIAGxqKAIoIQYgAigCACEHIAUgAikCCDcDmAYgBSACKQIANwOQBgJAIAcgBUGQBmogBhAZQcgAbGooAjAiB0EBa0F9Sw0AIAIoAgAgBSACKQIINwOIBiAFIAIpAgA3A4AGIAVBgAZqIAYQGUHIAGxqKAI0QQFrQX1LDQAgAigCACEGIAUgAikCCDcDuAUgBSACKQIANwOwBQJAIAYgBUGwBWogBxAZQcgAbGooAgRBAEwNACACKAIAIAUgAikCCDcDqAUgBSACKQIANwOgBSAFQaAFaiAHEBlByABsaigCBCABIABBEGoQxwQNACACKAIAIAUgAikCCDcDmAUgBSACKQIANwOQBSAFQZAFaiADEBlByABsakF/NgIoIAIoAgAgBSACKQIINwOIBSAFIAIpAgA3A4AFIAVBgAVqIAMQGUHIAGxqQX82AiwgAigCACAFIAIpAgg3A/gEIAUgAikCADcD8AQgBUHwBGogBBAZQcgAbGpBfzYCLCACKAIAIQAgBSACKQIINwPoBCAFIAIpAgA3A+AEIAAgBUHgBGogBBAZQcgAbGooAighASAFIAIpAgg3A9gEIAUgAikCADcD0AQgACAFQdAEaiABEBlByABsaiAENgI0DAILIAIoAgAgBSACKQIINwPIBCAFIAIpAgA3A8AEIAVBwARqIAQQGUHIAGxqQX82AiggAigCACAFIAIpAgg3A7gEIAUgAikCADcDsAQgBUGwBGogBBAZQcgAbGpBfzYCLCACKAIAIAUgAikCCDcDqAQgBSACKQIANwOgBCAFQaAEaiADEBlByABsakF/NgIsIAIoAgAhACAFIAIpAgg3A5gEIAUgAikCADcDkAQgACAFQZAEaiADEBlByABsaigCKCEBIAUgAikCCDcDiAQgBSACKQIANwOABCAAIAVBgARqIAEQGUHIAGxqIAM2AjAMAQsgAigCACEAIAUgAikCCDcD+AUgBSACKQIANwPwBSAAIAVB8AVqIAMQGUHIAGxqKAIoIQEgBSACKQIINwPoBSAFIAIpAgA3A+AFIAAgBUHgBWogARAZQcgAbGogAzYCMCACKAIAIQAgBSACKQIINwPYBSAFIAIpAgA3A9AFIAAgBUHQBWogAxAZQcgAbGooAighASAFIAIpAgg3A8gFIAUgAikCADcDwAUgACAFQcAFaiABEBlByABsaiAENgI0CyAFQdAGaiQAC1UCAnwBfyABQQAgAUEAShshASAAtyIDIQIDfyABIARGBH8gAyACo5siAplEAAAAAAAA4EFjBEAgAqoPC0GAgICAeAUgBEEBaiEEIAIQrQchAgwBCwsLPgECfCAAIAErAwAiAhAyOQMAIAAgASsDCCIDEDI5AwggACACIAErAxCgEDI5AxAgACADIAErAxigEDI5AxgLLAEBfyAAKAIEIgIEQCACIAE2AgwLIAAgATYCBCAAKAIARQRAIAAgATYCAAsLQwECfyMAQRBrIgAkAEEBQYgUEE4iAUUEQCAAQYgUNgIAQYj2CCgCAEH16QMgABAgGhAvAAsgARC+DiAAQRBqJAAgAQvbAgEFfwJAIAEoAhAiBSgC6AENAEHs/QooAgAhBgJAIAIEQANAIAUoAsgBIARBAnRqKAIAIgdFDQIgBxDGDkUEQCAGIANBAnRqIAc2AgAgASgCECEFIANBAWohAwsgBEEBaiEEDAALAAsDQCAFKALAASAEQQJ0aigCACIHRQ0BIAcQxg5FBEAgBiADQQJ0aiAHNgIAIAEoAhAhBSADQQFqIQMLIARBAWohBAwACwALIANBAkgNACAGIANBAnRqQQA2AgAgBiADQQRBpgMQtQFBUEEwIAIbIQFBAkEDIAIbIQJBASEEA0AgBiAEQQJ0aiIFKAIAIgNFDQEgBUEEaygCACIFIAFBACAFKAIAQQNxIAJHG2ooAigiBSADIAFBACADKAIAQQNxIAJHG2ooAigiAxD2Dg0BIAUgA0EAEKgIIgMoAhBBBDoAcCAAIAMQ+wUgBEEBaiEEDAALAAsLqwEBBH8jAEEgayIEJAAgACgCACIAKAIQIQYgACgCCCEFAkAgA0UEQCACIQAMAQsgBEIANwMYIARCADcDECAEIAI2AgAgBCADNgIEIARBEGoiB0GUMyAEEIQBIAUgBxDTAhCsASEAIAUgAkEAEIwBGiAFIANBABCMARogBxBcCyAGQQhqQYMCIAYoAgAgAUEBEI0BIAAQ9wUQkgggBSABQQAQjAEaIARBIGokAAunBAINfwR+IAAoAhAiBCgC7AEhBiAEKALoASECA0AgAiAGSgRAAkADQCAEKALoASECQgAhEQNAIAQoAuwBIQMCQANAIAIgA0oNASAEKALEASIFIAJByABsIglqIgYtADBFBEAgAkEBaiECDAELC0EAIQggBkEAOgAwIAJBAWohBkHo/QooAgAhDEIAIRIgAkEBa0HIAGwhCgNAIAUgBkHIAGwiC2ohDSAFIAlqIg4oAgBBAWshBQJAA0AgBSAITA0BIA4oAgQiAyAIQQJ0aigCACIHKAIQKAL4ASADIAhBAWoiCEECdGooAgAiAygCECgC+AFODQYgACAHIAMQ1g4NAAJ+IAJBAEwEQEIAIQ9CAAwBCyAHIAMQzQ4hDyADIAcQzQ4LIRAgDSgCAEEASgRAIA8gByADEMwOrHwhDyAQIAMgBxDMDqx8IRALIAFFIA9CAFdyIA8gEFJyIA8gEFdxDQALIAcgAxCXCCAMKAIQKALEASIDIAlqQQA6ADEgACgCECIEKALEASIFIAlqQQE6ADAgBCgC6AEgAkgEQCADIApqQQA6ADEgBSAKakEBOgAwCyAPIBB9IBJ8IRIgAiAEKALsAU4NASADIAtqQQA6ADEgBSALakEBOgAwDAELCyARIBJ8IREgBiECDAELCyARQgBVDQALDwsFIAQoAsQBIAJByABsakEBOgAwIAJBAWohAgwBCwtBk6EDQZu5AUGABUHV2gAQAAALcgEEfyAAKAIQIgIoAvgBIQMgAiABKAIQKAL4ASIENgL4ASACKAL0AUHIAGwiAkHo/QooAgAiBSgCECgCxAFqKAIEIARBAnRqIAA2AgAgASgCECADNgL4ASAFKAIQKALEASACaigCBCADQQJ0aiABNgIAC4IBAQZ/IAAoAhAiAygC7AEhBCADKALoASEBA0AgASAESkUEQEEAIQAgAygCxAEgAUHIAGxqIgUoAgAiAkEAIAJBAEobIQIDQCAAIAJGRQRAIAUoAgQgAEECdGooAgAoAhAiBiAGKAL4Abc5AxAgAEEBaiEADAELCyABQQFqIQEMAQsLC/IBAQd/QQEhAQNAIAAoAhAiAigCtAEgAUgEQAJAIAIoAowCRQ0AIAIoAugBIQEDQCABIAIoAuwBSg0BIAFBAnQiBSACKAKMAmooAgAiAwRAIAAgA0F/ENMOIQQgACADQQEQ0w4hAyAAKAIQKAKMAiAFaiAENgIAIAAQYSEFIAFByABsIgYgACgCECICKALEAWoiByAFKAIQKALEASAGaigCBCAEKAIQKAL4ASIEQQJ0ajYCBCAHIAMoAhAoAvgBIARrQQFqNgIACyABQQFqIQEMAAsACwUgAigCuAEgAUECdGooAgAQmQggAUEBaiEBDAELCwvZDgMWfwN+AnwjAEEgayIJJABC////////////ACEZIAFBAk8EQBDJBCEZIAAQmAgLQYj2CCgCACEUIBkhGAJAA0ACQCAZIRoCQAJAAkAgAUECaw4CAQMAC0GY2wooAgAhAgJAIAAQYSAARw0AIAAgARDbDkUNAEJ/IRgMBQsgAUUEQCAAENoOC0EEIAIgAkEEThshAiAAENkOEMkEIhkgGFUNASAAEJgIIBkhGAwBC0GY2wooAgAhAiAYIBpTBEAgABDXDgsgGCEZC0EAIQ0gAkEAIAJBAEobIRVBACEOA0ACQAJAIA0gFUYNAEHs2gotAAAEQCAJIBg3AxggCSAZNwMQIAkgDjYCCCAJIA02AgQgCSABNgIAIBRBubYEIAkQIBoLIBlQIA5B8P0KKAIATnINACAAKAIQIQICfyANQQFxIhZFBEAgAkHsAWohA0EBIREgAigC6AEiAiACQej9CigCACgCECgC6AFMagwBCyACQegBaiEDQX8hESACKALsASICIAJB6P0KKAIAKAIQKALsAU5rCyEQIA5BAWohDiANQQJxIRIgAygCACARaiEXA0AgECAXRg0CQQAhCEH0/QooAgAiBEEEayEHIAAoAhAoAsQBIgIgEEHIAGwiE2ooAgQhCgNAIAIgE2oiDygCACIGIAhMBEBBACEIIAZBACAGQQBKGyELQQAhBQNAAkACfwJAIAUgC0cEQCAKIAVBAnRqKAIAKAIQIgQoAswBDQMgBCgCxAENAyAEAnwgBCgC3AEEQCAEKALYASIMKAIAIgJBMEEAIAIoAgBBA3FBA0cbaigCKCECQQEhAwNAIAwgA0ECdGooAgAiBwRAIAdBMEEAIAcoAgBBA3FBA0cbaigCKCIHIAIgBygCECgC+AEgAigCECgC+AFKGyECIANBAWohAwwBCwsgAigCECsDgAIiG0QAAAAAAAAAAGZFDQMgG0QAAAAAAADwP6AMAQsgBCgC1AFFDQIgBCgC0AEiDCgCACICQVBBACACKAIAQQNxQQJHG2ooAighAkEBIQMDQCAMIANBAnRqKAIAIgcEQCAHQVBBACAHKAIAQQNxQQJHG2ooAigiByACIAcoAhAoAvgBIAIoAhAoAvgBSBshAiADQQFqIQMMAQsLIAIoAhArA4ACIhtEAAAAAAAAAABkRQ0CIBtEAAAAAAAA8L+gCzkDgAJBAAwCC0EAIQdBAEF8IAhBAXEbQQAgEhshCyAPKAIEIgUgBkECdGohAwNAAkAgBkEASgRAIAZBAWshBiAFIQIDQCACIANPDQIDQCACIANPDQMgAigCACIPKAIQKwOAAiIbRAAAAAAAAAAAYwRAIAJBBGohAgwBBUEAIQQDQCACQQRqIgIgA08NBSACKAIAIQogBCIIQQFxBEBBASEEIAooAhAoAugBDQELIAAgDyAKENYODQMgCigCECIEKwOAAiIcRAAAAAAAAAAAZkUEQCAEKALoAUEARyAIciEEDAELCyAbIBxkIBJFIBsgHGZxckUNAiAPIAoQlwggB0EBaiEHDAILAAsACwALAkAgB0UNAEHo/QooAgAoAhAoAsQBIBNqIgJBADoAMSAQQQBMDQAgAkEXa0EAOgAACyAQIBFqIRAMCAsgAyALaiEDDAALAAtBAQsgCHIhCAsgBUEBaiEFDAALAAUgCiAIQQJ0aigCACIPKAIQIQYCQCAWRQRAIAYoAsABIQtBACECQQAhBQNAIAsgBUECdGooAgAiA0UNAiADKAIQIgwuAZoBQQBKBEAgBCACQQJ0aiAMLQAwIANBMEEAIAMoAgBBA3FBA0cbaigCKCgCECgC+AFBCHRyNgIAIAJBAWohAgsgBUEBaiEFDAALAAsgBigCyAEhC0EAIQJBACEFA0AgCyAFQQJ0aigCACIDRQ0BIAMoAhAiDC4BmgFBAEoEQCAEIAJBAnRqIAwtAFggA0FQQQAgAygCAEEDcUECRxtqKAIoKAIQKAL4AUEIdHI2AgAgAkEBaiECCyAFQQFqIQUMAAsAC0QAAAAAAADwvyEbAkACQAJAAkAgAg4DAwABAgsgBCgCALchGwwCCyAEKAIEIAQoAgBqQQJttyEbDAELIAQgAkEEQaQDELUBIAJBAXYhBQJ8IAJBAXEEQCAEIAVBAnRqKAIAtwwBCyAEIAVBAnRqIgZBBGsoAgAiBSAEKAIAayIDIAcgAkECdGooAgAgBigCACICayIGRgRAIAIgBWpBAm23DAELIAW3IAa3oiACtyADt6KgIAMgBmq3owshGyAPKAIQIQYLIAYgGzkDgAIgCEEBaiEIIAAoAhAoAsQBIQIMAQsACwALAAsgAUEBaiEBQgAhGiAZQgBSDQMMAgsgACASQQBHEJYIIBgQyQQiGVkEQCAAEJgIQQAgDiAZuSAYuUTXo3A9CtfvP6JjGyEOIBkhGAsgDUEBaiENDAALAAsLIBggGlMEQCAAENcOCyAYQgBXDQAgAEEAEJYIEMkEIRgLIAlBIGokACAYC6ICAQN/IwBBIGsiAiQAAkBBvNsKKAIAIgFBjNwKKAIAckUNACAAIAFBABB6IgEEQCABQYUZEGMEQCAAQQEQyw4MAgsgAUGl5QAQYwRAIABBABDLDgwCCyABLQAARQ0BIAIgATYCEEGE4wQgAkEQahA3DAELIAAQeSEBA0AgAQRAIAEQxQFFBEAgARCbCAsgARB4IQEMAQsLQYzcCigCAEUNACAAEBwhAQNAIAFFDQECQCABQYzcCigCAEEAEHoiA0UNACADQYUZEGMEQCAAIAFBARCUCAwBCyADQaXlABBjBEAgACABQQAQlAgMAQsgAy0AAEUNACACIAEQITYCBCACIAM2AgBBzekEIAIQNwsgACABEB0hAQwACwALIAJBIGokAAsXACAAKAIAIgAgASgCACIBSiAAIAFIawu5AgEFfyABKAIQIgRBATYCCCAEKAIUKAIQKAL4ASEEIAMgAhA8QQJ0aiAENgIAIAIgAUEBEIUBGiAAIAEQLCEEA0AgBARAIAUgBEFQQQAgBCgCAEEDcSIGQQJHG2ooAigiBygCECIIKAIUKAIQKAL4ASAEQTBBACAGQQNHG2ooAigoAhAoAhQoAhAoAvgBSmohBSAIKAIIRQRAIAAgByACIAMQnQggBWohBQsgACAEEDAhBAwBCwsgACABEL0CIQQDQCAEBEAgBSAEQVBBACAEKAIAQQNxIgFBAkcbaigCKCgCECgCFCgCECgC+AEgBEEwQQAgAUEDRxtqKAIoIgEoAhAiBigCFCgCECgC+AFKaiEFIAYoAghFBEAgACABIAIgAxCdCCAFaiEFCyAAIAQQjwMhBAwBCwsgBQseACABBEAgABCGAiEAIAEQhgIoAhAgADYCqAELIAALcgECfyMAQSBrIgEkAAJAIABBgICAgARJBEAgAEEEEE4iAkUNASABQSBqJAAgAg8LIAFBBDYCBCABIAA2AgBBiPYIKAIAQabqAyABECAaEC8ACyABIABBAnQ2AhBBiPYIKAIAQfXpAyABQRBqECAaEC8AC40BAQF/AkAgASgCECIDKAKQAQ0AIAMgAjYCkAEgACABECwhAwNAIAMEQCAAIANBUEEAIAMoAgBBA3FBAkcbaigCKCACEKAIIAAgAxAwIQMMAQsLIAAgARC9AiEDA0AgA0UNASAAIANBMEEAIAMoAgBBA3FBA0cbaigCKCACEKAIIAAgAxCPAyEDDAALAAsLIQAgAEUEQEHU1gFB1PsAQQxB5TsQAAALIABBkZYFEE1FCwsAIABByyQQJxBoC6oBAQR/IAAoAhBBGGohAiABQQJHIQQCQANAIAIoAgAiAgRAIAIoAgBBiwJHDQIgAigCBCEDAkAgBEUEQCADEKEIDQELIAIgACgCECgCACABIANBABAiIgU2AgQgBUUEQCACIAAoAhAoAgAgASADQfH/BBAiNgIECyACQYoCNgIAIAAoAgggA0EAEIwBGgsgAkEMaiECDAELCw8LQaTsAEHcEUG5AkGaKRAAAAvTBgEKfyMAQdAAayICJAAgAkIANwMoIAJCADcDIEHU/QpBAUHU/QooAgBBAWoiBSAFQQFNGzYCACACQgA3AxggACgCEEEANgLcASACQSxqIQggABAcIQUgAUEATCEJAkADQCAFRQRAQQAhAQNAIAEgAigCIE9FBEAgAiACKQMgNwMIIAIgAikDGDcDACACIAEQGSEAAkACQAJAIAIoAigiBQ4CAgABCyACKAIYIABBAnRqKAIAEBgMAQsgAigCGCAAQQJ0aigCACAFEQEACyABQQFqIQEMAQsLIAJBGGoiAEEEEDEgABA0IAJB0ABqJAAPCwJAAkACQAJAIAkNACAFKAIQIgEoAugBIgRFDQAgBCgCECgCjAIgASgC9AFBAnRqKAIAIQEMAQsgBSIBEKIBIAFHDQELIAEoAhAoArABQdT9CigCAEYNACAAKAIQQQA2AsABQdj9CkEANgIAIAJBGGogARDwDgNAAkAgAigCIEUNACACQRhqIAhBBBC+ASACKAIsIgRFDQBB1P0KKAIAIgMgBCgCECIBKAKwAUYNASABIAM2ArABQQAhA0HY/QooAgAiBiAAIAYbKAIQQbgBQcABIAYbaiAENgIAIAEgBjYCvAFB2P0KIAQ2AgAgAUEANgK4ASACIAQoAhAiASkD2AE3AzAgAiABKQPQATcDOCACIAEpA8ABNwNAIAIgASkDyAE3A0gDQCADQQRGDQICQCACQTBqIANBA3RqIgEoAgAiCkUNACABKAIEIgZFDQADQCAGRQ0BIAQgCiAGQQFrIgZBAnRqKAIAIgdBUEEAIAcoAgBBA3EiC0ECRxtqKAIoIgFGBEAgB0EwQQAgC0EDRxtqKAIoIQELIAEoAhAoArABQdT9CigCAEYNACABEKIBIAFHDQAgAkEYaiABEPAODAALAAsgA0EBaiEDDAALAAsLIAAoAhAiASABKALcASIEQQFqIgM2AtwBIARB/////wNPDQEgASgC2AEgA0ECdCIDEGoiAUUNAyAAKAIQIgMgATYC2AEgASAEQQJ0aiADKALAATYCAAsgACAFEB0hBQwBCwtBjsADQdL8AEHNAEG9swEQAAALIAIgAzYCEEGI9ggoAgBB9ekDIAJBEGoQIBoQLwALbQEDfyAAEJQCIAAgAEEwayIBIAAoAgBBA3EiAkECRhsoAiggACAAQTBqIgMgAkEDRhsoAigQuQMiAgRAIAAgAhCMAw8LIAAgASAAKAIAQQNxIgFBAkYbKAIoIAAgAyABQQNGGygCKCAAEOQBGguIAQEBfyAABEACQCAAKAIQKAJ4IgFFDQAgASgCECIBKAKwASAARw0AIAFBADYCsAELIABBMEEAIAAoAgBBA3FBA0cbaigCKCgCEEHQAWogABD+BSAAQVBBACAAKAIAQQNxQQJHG2ooAigoAhBB2AFqIAAQ/gUPC0Ht1QFBq7oBQeABQaedARAAAAtWAQJ/IAEoAhAiAiAAKAIQIgMoAsABIgA2ArgBIAAEQCAAKAIQIAE2ArwBCyADIAE2AsABIAJBADYCvAEgACABRgRAQYukA0GrugFBugFB458BEAAACwvxAgEFf0HgABD9BSIEIAQoAjBBA3IiBTYCMCAEIAQoAgBBfHFBAnIiBjYCAEG4ARD9BSEDIAQgADYCWCAEIAM2AhAgBCABNgIoIANBAToAcCACBEAgBCACKAIAIgdBcHEiASAFQQ9xcjYCMCAEIAZBDnEgAXI2AgAgAyACKAIQIgEvAagBOwGoASADIAEvAZoBOwGaASADIAEoApwBNgKcASADIAEoAqwBNgKsAUEQIQUCQCADQRBqIAJBMEEAIAdBA3EiBkEDRxtqKAIoIgcgAEcEfyAAIAJBUEEAIAZBAkcbaigCKEcNAUE4BUEQCyABakEoEB8aC0E4IQACQCADQThqIAQoAigiBSACQVBBACAGQQJHG2ooAihHBH8gBSAHRw0BQRAFQTgLIAFqQSgQHxoLIAEoArABRQRAIAEgBDYCsAELIAMgAjYCeCAEDwsgA0EBNgKsASADQQE7AagBIANBATsBmgEgA0EBNgKcASAEC7gBAQR/IAAoAhAiBCAEKAL0ASACajYC9AEDQCAEKAKYAiADQQJ0aigCACIFBEAgASAFQTBBACAFKAIAQQNxQQNHG2ooAigiBUcEQCAFIAAgAhCpCCAAKAIQIQQLIANBAWohAwwBBQNAAkAgBCgCoAIgBkECdGooAgAiA0UNACABIANBUEEAIAMoAgBBA3FBAkcbaigCKCIDRwRAIAMgACACEKkIIAAoAhAhBAsgBkEBaiEGDAELCwsLC/IEAQZ/IAAQzgQhBwJAIAIEQCACQVBBACACKAIAQQNxIgNBAkcbaigCKCgCECgC9AEgAigCECgCrAEgAkEwQQAgA0EDRxtqKAIoKAIQKAL0AWpGDQELA0AgACgCECIEKALIASAFQQJ0aigCACIDBEAgAygCAEEDcSEEAkAgAygCECgCpAFBAE4EQCADQVBBACAEQQJHG2ooAigiAyABRg0BIAMgACACEKoIIQIMAQsgAyADQTBrIgggBEECRhsoAigQzgQgB0YNACACBEAgAyAIIAMoAgBBA3EiBEECRhsoAigoAhAoAvQBIANBMEEAIARBA0cbaigCKCgCECgC9AEgAygCECgCrAFqayACQVBBACACKAIAQQNxIgRBAkcbaigCKCgCECgC9AEgAkEwQQAgBEEDRxtqKAIoKAIQKAL0ASACKAIQKAKsAWprTg0BCyADIQILIAVBAWohBQwBBQNAIAQoAsABIAZBAnRqKAIAIgNFDQMgAygCAEEDcSEFAkAgAygCECgCpAFBAE4EQCADQTBBACAFQQNHG2ooAigiAyABRg0BIAMgACACEKoIIQIMAQsgAyADQTBqIgQgBUEDRhsoAigQzgQgB0YNACACBEAgA0FQQQAgAygCAEEDcSIFQQJHG2ooAigoAhAoAvQBIAMgBCAFQQNGGygCKCgCECgC9AEgAygCECgCrAFqayACQVBBACACKAIAQQNxIgVBAkcbaigCKCgCECgC9AEgAkEwQQAgBUEDRxtqKAIoKAIQKAL0ASACKAIQKAKsAWprTg0BCyADIQILIAZBAWohBiAAKAIQIQQMAAsACwALAAsgAgvRAQEFfyAAKAIEIQMgACgCACEEIAEhAgNAIAFBAXQiBUECaiEGIAMgBUEBciIFSwRAIAUgASAEIAVBAnRqKAIAKAIEIAQgAUECdGooAgAoAgRIGyECCyADIAZLBEAgBiACIAQgBkECdGooAgAoAgQgBCACQQJ0aigCACgCBEgbIQILIAEgAkcEQCAEIAFBAnRqIgMoAgAhBiADIAQgAkECdGoiBSgCADYCACAFIAY2AgAgAygCACABNgIIIAYgAjYCCCAAKAIEIgMgAiIBSw0BCwsL/QIBA38CQAJAAn9B3LIEIAEoAhAiAigCpAFBAE4NABogACgADCIDQQBIDQIgAiADNgKkASAAIAE2AhggAEEEakEEECYhAiAAKAIEIAJBAnRqIAAoAhg2AgBBACEAIAFBMEEAIAEoAgBBA3FBA0cbaigCKCIDKAIQIgJBATYCsAEgAiACKAKkAiIEQQFqNgKkAiACKAKgAiAEQQJ0aiABNgIAIAMoAhAiAigCoAIgAigCpAJBAnRqQQA2AgBBzt4DIAMoAhAiAigCyAEgAigCpAJBAnRqQQRrKAIARQ0AGiABQVBBACABKAIAQQNxQQJHG2ooAigiAygCECICQQE2ArABIAIgAigCnAIiBEEBajYCnAIgAigCmAIgBEECdGogATYCACADKAIQIgEoApgCIAEoApwCQQJ0akEANgIAIAMoAhAiASgCwAEgASgCnAJBAnRqQQRrKAIADQFB8d4DC0EAEDdBfyEACyAADwtBpc0BQce5AUE/QbidARAAAAu4AgIEfwN8IwBBgAFrIgEkACABIAAoAlA2AnBBiPYIKAIAIgNBjNkEIAFB8ABqECAaA0AgACgCUCACTQRAIAArAwAhBSAAKwMIIQYgAC0AHSECIAEgACsDEDkDYCABQdKsAUHOrAEgAhs2AmggASAGOQNYIAEgBTkDUCADQYGCBCABQdAAahAzIAArAyghBSAAKwMwIQYgAC0ARSECIAFBQGsgACsDODkDACABQdKsAUHOrAEgAhs2AkggASAGOQM4IAEgBTkDMCADQbSCBCABQTBqEDMgAUGAAWokAAUgACgCVCACQQV0aiIEKwMAIQUgBCsDCCEGIAQrAxAhByABIAQrAxg5AyAgASAHOQMYIAEgBjkDECABIAU5AwggASACNgIAIANBw/AEIAEQMyACQQFqIQIMAQsLC7EbAwp/HXwBfiMAQYACayIIJAACQAJAAkACQAJAIANBAEoEQEF/IQsgA0EoEE4iCkUNBUEBIQYDQCADIAZGBEAgCiADQShsakEoayEHQQEhBgNAIAMgBkYEQCAFKwMIIR4gBSsDACEfIAQrAwghICAEKwMAISFBACEHA0AgAyAHRgRAIAIgA0EEdGoiBkEIaysAACEYIAZBEGsrAAAhHCACKwAIIRMgAisAACEVQQAhBgNAIAMgBkZFBEAgFiAKIAZBKGxqIgcrABgiECACIAZBBHRqIgkrAAAgHCAHKwMAIhEgEaJEAAAAAAAA8D8gEaEiFkQAAAAAAAAIQKIgEaCiIheiIBUgFiAWoiARRAAAAAAAAAhAoiAWoKIiFqKgoSIZoiAHKwAgIhEgCSsACCATIBaiIBggF6KgoSIioqCgIRYgEiAHKwAIIhcgGaIgBysAECIZICKioKAhEiAUIBcgEKIgGSARoqCgIRQgGyAQIBCiIBEgEaKgoCEbIBogFyAXoiAZIBmioKAhGiAGQQFqIQYMAQsLRAAAAAAAAAAAIRFEAAAAAAAAAAAhECAaIBuiIBQgFKKhIheZIhlEje21oPfGsD5mBEAgGiAWoiAUIBKioSAXoyEQIBIgG6IgFiAUmqKgIBejIRELIBlEje21oPfGsD5jIBFEAAAAAAAAAABlciAQRAAAAAAAAAAAZXIEQCAcIBWhIBggE6EQR0QAAAAAAAAIQKMiESEQCyAeIBCiIR4gHyAQoiEfICAgEaIhICAhIBGiISFBACEGRAAAAAAAABBAIREDQCAIIBg5A3ggCCAYIB4gEaJEAAAAAAAACECjoSIXOQNoIAggHDkDcCAIIBwgHyARokQAAAAAAAAIQKOhIhk5A2AgCCATOQNIIAggEyAgIBGiRAAAAAAAAAhAo6AiFDkDWCAIIBU5A0AgCCAVICEgEaJEAAAAAAAACECjoCIWOQNQIAZBAXFFBEAgCEFAa0EEEIcPIAIgAxCHD0T8qfHSTWJQv6BjDQwLIBREAAAAAAAAGMCiIBNEAAAAAAAACECiIBdEAAAAAAAACECiIhCgoCEiIBREAAAAAAAACECiIBigIBAgE6ChISUgFkQAAAAAAAAYwKIgFUQAAAAAAAAIQKIgGUQAAAAAAAAIQKIiEKCgISYgFkQAAAAAAAAIQKIgHKAgECAVoKEhJyAUIBOhRAAAAAAAAAhAoiEoIBYgFaFEAAAAAAAACECiISlBACEMA0AgASAMRgRAQbz9CigCAEEEahCvCEEASA0MQbz9CigCACEHQcD9CigCACEAQQEhBgNAIAZBBEYNDCAAIAdBBHRqIgEgCEFAayAGQQR0aiICKwMAOQMAIAEgAisDCDkDCCAGQQFqIQYgB0EBaiEHDAALAAsgACAMQQV0aiIGKwMYIiogBisDCCIaoSESAkACQAJAAkAgBisDECIrIAYrAwAiG6EiHUQAAAAAAAAAAGEEQCAIICY5A/ABIAggJzkD+AEgCCApOQPoASAIIBUgG6E5A+ABIAhB4AFqIgcgCEHAAWoQsQghBiASRAAAAAAAAAAAYQRAIAggIjkD8AEgCCAlOQP4ASAIICg5A+gBIAggEyAaoTkD4AEgByAIQaABahCxCCEJIAZBBEYEQCAJQQRGDQVBACEHIAlBACAJQQBKGyEJQQAhBgNAIAYgCUYNBSAIQaABaiAGQQN0aisDACIQRAAAAAAAAAAAZkUgEEQAAAAAAADwP2VFckUEQCAIQYABaiAHQQN0aiAQOQMAIAdBAWohBwsgBkEBaiEGDAALAAsgCUEERg0CQQAhByAGQQAgBkEAShshDSAJQQAgCUEAShshDkEAIQkDQCAJIA1GDQQgCEHAAWogCUEDdGohD0EAIQYDQCAGIA5GRQRAIA8rAwAiECAIQaABaiAGQQN0aisDAGIgEEQAAAAAAAAAAGZFciAQRAAAAAAAAPA/ZUVyRQRAIAhBgAFqIAdBA3RqIBA5AwAgB0EBaiEHCyAGQQFqIQYMAQsLIAlBAWohCQwACwALIAZBBEYNA0EAIQcgBkEAIAZBAEobIQlBACEGA0AgBiAJRg0DAkAgCEHAAWogBkEDdGorAwAiEEQAAAAAAAAAAGZFIBBEAAAAAAAA8D9lRXINACAQIBAgECAloiAioKIgKKCiIBOgIBqhIBKjIh1EAAAAAAAAAABmRSAdRAAAAAAAAPA/ZUVyDQAgCEGAAWogB0EDdGogEDkDACAHQQFqIQcLIAZBAWohBgwACwALIAggEiAdoyIQIBuiIBqhIBMgECAVoqEiEqA5A+ABIAggFCAQIBaioSIjIBKhRAAAAAAAAAhAojkD6AEgCCAjRAAAAAAAABjAoiASRAAAAAAAAAhAoiAXIBAgGaKhRAAAAAAAAAhAoiIkoKA5A/ABIAggI0QAAAAAAAAIQKIgGCAQIByioaAgJCASoKE5A/gBIAhB4AFqIAhBwAFqELEIIgZBBEYNAkEAIQcgBkEAIAZBAEobIQlBACEGA0AgBiAJRg0CAkAgCEHAAWogBkEDdGorAwAiEEQAAAAAAAAAAGZFIBBEAAAAAAAA8D9lRXINACAQIBAgECAnoiAmoKIgKaCiIBWgIBuhIB2jIhJEAAAAAAAAAABmRSASRAAAAAAAAPA/ZUVyDQAgCEGAAWogB0EDdGogEDkDACAHQQFqIQcLIAZBAWohBgwACwALQQAhByAGQQAgBkEAShshCUEAIQYDQCAGIAlGDQEgCEHAAWogBkEDdGorAwAiEEQAAAAAAAAAAGZFIBBEAAAAAAAA8D9lRXJFBEAgCEGAAWogB0EDdGogEDkDACAHQQFqIQcLIAZBAWohBgwACwALIAdBBEYNAEEAIQYgB0EAIAdBAEobIQcDQCAGIAdGDQECQCAIQYABaiAGQQN0aisDACIQRI3ttaD3xrA+YyAQROkLIef9/+8/ZHINACAQIBAgEKKiIh0gHKJEAAAAAAAA8D8gEKEiEiAQIBBEAAAAAAAACECiIhCioiIjIBmiIBIgEiASoqIiJCAVoiAWIBIgECASoqIiEKKgoKAiEiAboSIsICyiIB0gGKIgIyAXoiAkIBOiIBQgEKKgoKAiECAaoSIdIB2ioET8qfHSTWJQP2MNACASICuhIhIgEqIgECAqoSIQIBCioET8qfHSTWJQP2NFDQMLIAZBAWohBgwACwALIAxBAWohDAwBCwsgEUR7FK5H4Xp0P2MNCCARRAAAAAAAAOA/okQAAAAAAAAAACARRHsUrkfheoQ/ZBshEUEBIQYMAAsABSAKIAdBKGxqIgZEAAAAAAAA8D8gBisDACIRoSIQIBEgEUQAAAAAAAAIQKIiEaKiIhMgHqI5AyAgBiATIB+iOQMYIAYgICAQIBEgEKKiIhGiOQMQIAYgISARojkDCCAHQQFqIQcMAQsACwAFIAogBkEobGoiCSAJKwMAIAcrAwCjOQMAIAZBAWohBgwBCwALAAUgCiAGQShsaiARIAIgBkEEdGoiB0EQaysAACAHKwAAoSAHQQhrKwAAIAcrAAihEEegIhE5AwAgBkEBaiEGDAELAAsAC0GklgNBhL0BQecAQa2XARAAAAsgA0ECRw0CQbz9CigCAEEEahCvCEEASA0BQbz9CigCACEHQcD9CigCACEAQQEhBgNAIAZBBEYNASAAIAdBBHRqIgEgCEFAayAGQQR0aiICKwMAOQMAIAEgAisDCDkDCCAGQQFqIQYgB0EBaiEHDAALAAtBACELQbz9CiAHNgIACyAKEBgMAQsgGCAeRFVVVVVVVdU/oqEhFiAcIB9EVVVVVVVV1T+ioSESIBMgIERVVVVVVVXVP6KgIRogFSAhRFVVVVVVVdU/oqAhG0F/IQdBAiADIANBAkwbQQFrIQlEAAAAAAAA8L8hFEEBIQYDQCAGIAlGBEACQCAKEBggAiAHQQR0aiIGKwAAIhMgBkEQaysAAKEiESARoiAGKwAIIhUgBkEIaysAAKEiECAQoqAiGESN7bWg98awPmQEfCAQIBifIhijIRAgESAYowUgEQsgAiAHQQFqIgpBBHRqIgkrAAAgE6EiEyAToiAJKwAIIBWhIhQgFKKgIhVEje21oPfGsD5kBHwgFCAVnyIVoyEUIBMgFaMFIBMLoCIRIBGiIBAgFKAiECAQoqAiE0SN7bWg98awPmQEQCAQIBOfIhOjIRAgESAToyERCyAIIBA5A0ggCCAROQNAIAggBCkDCDcDOCAEKQMAIS0gCCAIKQNINwMoIAggLTcDMCAIIAgpA0A3AyAgACABIAIgCiAIQTBqIAhBIGoQrghBAE4NAEF/IQsMAwsFIAIgBkEEdGoiCysAACAKIAZBKGxqKwMAIhEgESARoqIiFyAcokQAAAAAAADwPyARoSIQIBEgEUQAAAAAAAAIQKIiEaKiIhkgEqIgECAQIBCioiIeIBWiIBsgECARIBCioiIRoqCgoKEgCysACCAXIBiiIBkgFqIgHiAToiAaIBGioKCgoRBHIhEgFCARIBRkIgsbIRQgBiAHIAsbIQcgBkEBaiEGDAELCyAIIAgpA0g3AxggCCAIKQNANwMQIAggBSkDCDcDCCAIIAUpAwA3AwAgACABIAYgAyAHayAIQRBqIAgQrgghCwsgCEGAAmokACALCzwBAX9BxP0KKAIAIABJBEBBwP0KQcD9CigCACAAQQR0EGoiATYCACABRQRAQX8PC0HE/QogADYCAAtBAAvvAgIDfAN/IwBBIGsiCCQAIAIoAgQiCkEATgRAIAMrAAAiBSAFoiADKwAIIgYgBqKgIgdEje21oPfGsD5kBEAgBiAHnyIHoyEGIAUgB6MhBQsgAigCACECIAMgBjkDCCADIAU5AwAgAysAECIFIAWiIAMrABgiBiAGoqAiB0SN7bWg98awPmQEQCAGIAefIgejIQYgBSAHoyEFCyADIAY5AxggAyAFOQMQQbz9CkEANgIAAn9Bf0EEEK8IQQBIDQAaQbz9CkG8/QooAgAiCUEBajYCAEHA/QooAgAgCUEEdGoiCSACKQMINwMIIAkgAikDADcDACAIIAMpAwg3AxggCCADKQMANwMQIAggA0EQaikDCDcDCCAIIAMpAxA3AwBBfyAAIAEgAiAKIAhBEGogCBCuCEF/Rg0AGiAEQbz9CigCADYCBCAEQcD9CigCADYCAEEACyAIQSBqJAAPC0HTywFBhL0BQc0AQb+XARAAAAvjBAIFfAJ/AkACQAJAIAArAxgiAplESK+8mvLXej5jBEAgACsDECICmURIr7ya8td6PmMEQCAAKwMAIQQgACsDCCICmURIr7ya8td6PmNFDQIgBJlESK+8mvLXej5jQQJ0DwsgACsDCCACIAKgoyIEIASiIAArAwAgAqOhIgJEAAAAAAAAAABjDQMgAkQAAAAAAAAAAGQEQCABIAKfIAShIgI5AwAgASAERAAAAAAAAADAoiACoTkDCEECDwsgASAEmjkDAAwCCwJ/An8gACsDACACoyAAKwMQIAJEAAAAAAAACECioyIEIASgIAQgBKIiA6IgBCAAKwMIIAKjIgWioaAiAiACoiIGIAVEAAAAAAAACECjIAOhIgMgAyADRAAAAAAAABBAoqKioCIDRAAAAAAAAAAAYwRAIAOanyACmhCoASECIAEgBiADoZ9EAAAAAAAA4D+iEKsHIgMgA6AiAyACRAAAAAAAAAhAoxBKojkDACABIAMgAkQYLURU+yEJQKBEGC1EVPshCUCgRAAAAAAAAAhAoxBKojkDCCADIAJEGC1EVPshCcCgRBgtRFT7IQnAoEQAAAAAAAAIQKMQSqIhAkEQDAELIAEgA58gAqFEAAAAAAAA4D+iIgUQqwcgApogBaEQqwegIgI5AwBBASADRAAAAAAAAAAAZA0BGiABIAJEAAAAAAAA4L+iIgI5AxBBCAsgAWogAjkDAEEDCyEHQQAhAANAIAAgB0YNAyABIABBA3RqIgggCCsDACAEoTkDACAAQQFqIQAMAAsACyABIASaIAKjOQMAC0EBIQcLIAcLegEDfyMAQRBrIgEkAAJAIABBuP0KKAIATQ0AQbT9CigCACAAQQR0EGoiA0UEQCABQYUqNgIIIAFBuQM2AgQgAUGQuAE2AgBBiPYIKAIAQbKBBCABECAaQX8hAgwBC0G4/QogADYCAEG0/QogAzYCAAsgAUEQaiQAIAILDQAgACgCCBAYIAAQGAuJAQIEfwF8IwBBEGsiAiQAIAEoAgQhAyABKAIAIQQgAEGDyQFBABAeQQAhAQNAIAEgBEcEQCABBEAgAEG6oANBABAeCyADIAFBGGxqIgUrAwAhBiACIAUrAwg5AwggAiAGOQMAIABBpsgBIAIQHiABQQFqIQEMAQsLIABBwM0EQQAQHiACQRBqJAALsQICBH8CfCMAQfAAayIBJABBvPwKQbz8CigCACIEQQFqNgIAAnwgACgCECIDKAKIASICRQRARAAAAAAAAElAIQVEAAAAAAAASUAMAQsgArdEGC1EVPshCUCiRAAAAAAAgGZAoyIFEEpEAAAAAAAA8D8gBRBXoUQAAAAAAABJQKIQMiEFRAAAAAAAAPA/oEQAAAAAAABJQKIQMgshBiAAQY/FAxAbGiADKALcASICBEAgACACEIoBIABB3wAQZQsgASAFOQNgIAEgBjkDWCABIAQ2AlAgAEHY1QQgAUHQAGoQHiABQShqIgIgA0E4akEoEB8aIABEAAAAAAAAAAAgAhCCBiAARAAAAAAAAPA/IAEgA0HgAGpBKBAfIgEQggYgAEHR0gQQGxogAUHwAGokACAEC4wBAQJ/IwBBEGsiACQAAkAgAEEMaiAAQQhqEBMNAEGIgQsgACgCDEECdEEEahBPIgE2AgAgAUUNACAAKAIIEE8iAQRAQYiBCygCACAAKAIMQQJ0akEANgIAQYiBCygCACABEBJFDQELQYiBC0EANgIACyAAQRBqJABBxIMLQayBCzYCAEH8ggtBKjYCAAuuAQEGfwJAAkAgAARAIAAtAAxBAUYEQCABIAApAxBUDQILIAEgACkDGFYNASABpyEEIAAoAgAiBQRAQQEgACgCCHQhAwsgA0EBayEGA0BBACEAIAIgA0YNAwJAAkAgBSACIARqIAZxQQJ0aigCACIHQQFqDgIBBQALIAciACgCECkDCCABUQ0ECyACQQFqIQIMAAsAC0Gl1QFBjL4BQeQDQeSkARAAAAtBACEACyAACwsAIABB3awEEBsaCzEBAX8jAEEQayICJAAgAkEANgIIIAJBADYCDCABIAJBCGpBugIgABCeBCACQRBqJAALJQEBfyMAQRBrIgIkACACIAE2AgAgAEGdgwQgAhAeIAJBEGokAAsNACAAIAFBx4YBEOgGC4gBAgN/AXwjAEEgayIEJAADQCACIAVGBEAgAwRAIAErAwAhByAEIAErAwg5AwggBCAHOQMAIABBx4YBIAQQHgsgAEHu/wQQGxogBEEgaiQABSABIAVBBHRqIgYrAwAhByAEIAYrAwg5AxggBCAHOQMQIABBx4YBIARBEGoQHiAFQQFqIQUMAQsLC7MBAQR/IwBBQGoiAyQAAkAgAi0AAyIEQf8BRgRAIAItAAAhBCACLQABIQUgAyACLQACNgIQIAMgBTYCDCADIAQ2AgggA0EHNgIEIAMgATYCACAAQenHAyADEIQBDAELIAItAAAhBSACLQABIQYgAi0AAiECIAMgBDYCNCADIAI2AjAgAyAGNgIsIAMgBTYCKCADQQk2AiQgAyABNgIgIABBz8cDIANBIGoQhAELIANBQGskAAscACAAKAIQKAIMQQJ0QfC/CGooAgAgASACEL0IC38BAn8jAEEgayIEJAAgACgCECgCDCAEIAM2AhQgBCABNgIQQQJ0QfC/CGooAgAiAUH/xwMgBEEQahCEAUEAIQADQCAAIANGBEAgBEEgaiQABSAEIAIgAEEEdGoiBSkDCDcDCCAEIAUpAwA3AwAgASAEENcCIABBAWohAAwBCwsLigUCA38GfCMAQZABayIEJAACQAJAQeDjCigCAC8BKEENTQRAIAAQiQYMAQsgACgCECIFKAKIAbdEGC1EVPshCUCiRAAAAAAAgGZAoyEHIARCADcDSCAEQgA3A0ACQCABQQJGBEAgAiAEQfAAaiADIAdBAhDQBiAEQUBrIgJB2wAQfyAEIAQpA3g3AxggBCAEKQNwNwMQIAIgBEEQahDXAiAEIAQpA4gBNwMIIAQgBCkDgAE3AwAgAiAEENcCDAELIAIgBEHwAGogA0QAAAAAAAAAAEEDENAGIAQrA3AhCCAEKwOIASEJAnwgBSgCiAFFBEAgCUQAAAAAAADQP6IhCiAEKwN4IgshDCAIDAELIAlEAAAAAAAA0D+iIgogBxBXoiAEKwN4IgugIQwgCiAHEEqiIAigCyEHIAQgDDkDaCAEIAs5A1ggBCAHOQNgIAQgCDkDUCAEQUBrIgJBKBB/IAQgBCkDaDcDOCAEIAQpA2A3AzAgAiAEQTBqENcCIAIgChCWAiAEIAQpA1g3AyggBCAEKQNQNwMgIAIgBEEgahDXAiACIAkQlgILIARBQGsiBkGWzQMQ8gEgBUE4aiECIARBQGsiAwJ8IAUrA5ABIgdEAAAAAAAAAABkBEAgBiAHIAIQiAYgBSsDkAEMAQsgBEFAa0QAAAAAAAAAACACEIgGRAAAAAAAAPA/CyAFQeAAahCIBgJAIAMQJEUNACADECgEQCAELQBPIgJFDQMgBCACQQFrOgBPDAELIAQgBCgCREEBazYCRAsgBEFAayICQd0AQSkgAUECRhsQfyAAQb7LAyACEMIBEMADIAIQXAsgBEGQAWokAA8LQeKPA0Gg/ABBigFBqdkAEAAAC4QBAQZ/IwBBEGsiASQAA0ACQAJAIAAgAmotAAAiBARAIATAIgVBMGtBCUsNAiADQf//A3EiBiAEQX9zQfEBckH//wNxQQpuTQ0BIAEgADYCAEGH/gAgARAqCyABQRBqJAAgA0H//wNxDwsgBSAGQQpsakHQ/wNqIQMLIAJBAWohAgwACwALDAAgAEEAQQAQxQgaC5YDAgN/A3wjAEHgAGsiBiQAIAZCADcDWCAGQgA3A1AgACgCECIHKwMYIQkgBysDECELIAcrAyghCiAGQUBrIAcrAyA5AwAgBiAFIAqhIApBuNsKLQAAIgcbOQNIIAYgCzkDMCAGIAUgCaEgCSAHGzkDOCAGQdAAaiIIQd+CASAGQTBqEH4gACABIAgQuwEQcQJAIAAoAhAoAgwiB0UNACAHKAIALQAARQ0AIAcrA0AhCSAGIAcrAzg5AyAgBiAFIAmhIAlBuNsKLQAAGzkDKCAIQemCASAGQSBqEH4gACACIAgQuwEQcSAAKAIQKAIMIgcrAyAhCSAGIAcrAxhEAAAAAAAAUkCjOQMQIAhBmoYBIAZBEGoQfiAAIAMgCBC7ARBxIAYgCUQAAAAAAABSQKM5AwAgCEGahgEgBhB+IAAgBCAIELsBEHELQQEhBwNAIAcgACgCECIIKAK0AUpFBEAgCCgCuAEgB0ECdGooAgAgASACIAMgBCAFEMMIIAdBAWohBwwBCwsgBkHQAGoQXCAGQeAAaiQAC8gBAgJ/BXwjAEEgayIFJAAgASgCMEUEQCABKwMYIQggASsDECEJIAErAyghByAAKAIQIgQrAxghBiAFIAQrAxAiCiABKwMgoDkDECAFIAMgBiAHoCIHoSAHQbjbCi0AACIEGzkDGCAFIAkgCqA5AwAgBSADIAggBqAiBqEgBiAEGzkDCCACQbzJAyAFEH4LQQAhBANAIAQgASgCME5FBEAgACABKAI4IARBAnRqKAIAIAIgAxDECCAEQQFqIQQMAQsLIAVBIGokAAu0EQIPfwZ8IwBBgAJrIgQkACAAKAIQLwGyAUEBENoCQbjbCi0AAEEBRgRAIAAoAhAiAysDKCADKwMYoCITRAAAAAAAAFJAoyEWCyAEQgA3A/gBIARCADcD8AEgAEEBQYwrEIgBGiAAQQFBiCgQiAEaQdTbCiAAQQFB+PcAEIgBNgIAQdDbCiAAQQFBgyEQiAE2AgAgAEECQYwrEIgBGiAAKAIQLQBxIgNBEHEEQCAAQQFB2tkAEIgBGiAAKAIQLQBxIQMLIANBAXEEQCAAQQJB9dkAEIgBGiAAKAIQLQBxIQMLIANBIHEEQCAAQQJB2tkAEIgBGiAAKAIQLQBxIQMLIANBAnEEQCAAQQJB8NkAEIgBGiAAKAIQLQBxIQMLIANBBHEEfyAAQQJB6NkAEIgBGiAAKAIQLQBxBSADC0EIcQRAIABBAEH12QAQiAEhDCAAQQBB6vcAEIgBIQ0gAEEAQYIhEIgBIQoLIABBAEH8vwEQiAEhDiAAEBwhB0EDSSEPA0ACQAJAIAcEQCATIAcoAhAiAysDGCISoSASQbjbCi0AABshEiADKwMQIRQCQCAPRQRAIAQgAygClAErAxBEAAAAAAAAUkCiOQPQASAEIBI5A8gBIAQgFDkDwAEgBEHwAWpB5IIBIARBwAFqEH5BAyEDA0AgAyAAKAIQLwGyAU8NAiAEIAcoAhAoApQBIANBA3RqKwMARAAAAAAAAFJAojkDACAEQfABakHtggEgBBB+IANBAWohAwwACwALIAQgEjkD6AEgBCAUOQPgASAEQfABakHpggEgBEHgAWoQfgsgB0GMKyAEQfABaiIFELsBEOkBIAQgBygCECsDUEQAAAAAAABSQKM5A7ABIAVB+IIBIARBsAFqEH4gB0HQ2wooAgAgBRC7ARBxIAQgBygCECIDKwNYIAMrA2CgRAAAAAAAAFJAozkDoAEgBUH4ggEgBEGgAWoQfiAHQdTbCigCACAFELsBEHECQCAHKAIQIgMoAnwiBkUNACAGLQBRQQFHDQAgBisDQCESIAQgBisDODkDkAEgBCATIBKhIBJBuNsKLQAAGzkDmAEgBUHpggEgBEGQAWoQfiAHQdrZACAFELsBEOkBIAcoAhAhAwsgAygCCCgCAEHEogEQTUUEQCAHIAMoAgwgBEHwAWoiAyATEMQIAkAgAxAkRQ0AIAMQKARAIAQtAP8BIgNFDQQgBCADQQFrOgD/AQwBCyAEIAQoAvQBQQFrNgL0AQsgB0GIKCAEQfABahC7ARDpAQwDC0G03AooAgBFDQIgBygCECgCCCIDBH8gAygCBCgCAEE8RgVBAAtFDQICQCAHKAIQKAIMIgYoAggiBUECSw0AIAdBtiYQJyIDRQRAQQghBQwBC0EIIANBAEEAEKkEIgMgA0EDSRshBQsgBbghFEEAIQMDQCADIAVGBEAgB0G03AooAgAgBEHwAWoQuwEQcQwECyADBEAgBEHwAWpBIBDWBAsgBAJ8IAYoAghBA08EQCAGKAIsIANBBHRqIggrAwhEAAAAAAAAUkCjIRIgCCsDAEQAAAAAAABSQKMMAQsgBygCECIIKwMoIRIgA7ggFKNEGC1EVPshCUCiIhUgFaAiFRBXIBJEAAAAAAAA4D+ioiESIAgrAyAhFyAVEEogF0QAAAAAAADgP6KiCzkDgAEgBCAWIBKhIBJBuNsKLQAAGzkDiAEgBEHwAWpB84IBIARBgAFqEH4gA0EBaiEDDAALAAsgACAOIAwgDSAKIBMQwwggBEHwAWoQXCAAQfbeAEEAEGsEQCAAEPMJCyABBEAgASAQOgAACyACBEAgAiALOgAAC0EAENoCIARBgAJqJAAgEw8LQeKPA0Gg/ABBigFBqdkAEAAACwJAQaDbCigCAEEATA0AIAAgBxAsIQUDQCAFRQ0BAkAgBSgCECIDLQBwQQZGDQBBACEGIAMoAggiCEUNAANAIAgoAgQgBk0EQCAFQYwrIARB8AFqIgYQuwEQ6QEgBSgCECIDKAJgIggEQCAIKwNAIRIgBCAIKwM4OQNwIAQgEyASoSASQbjbCi0AABs5A3ggBkHpggEgBEHwAGoQfiAFQfXZACAGELsBEOkBIAUoAhAhAwsCQCADKAJsIgZFDQAgBi0AUUEBRw0AIAYrA0AhEiAEIAYrAzg5A2AgBCATIBKhIBJBuNsKLQAAGzkDaCAEQfABaiIDQemCASAEQeAAahB+IAVB2tkAIAMQuwEQ6QEgBSgCECEDCyADKAJkIgYEfyAGKwNAIRIgBCAGKwM4OQNQIAQgEyASoSASQbjbCi0AABs5A1ggBEHwAWoiA0HpggEgBEHQAGoQfiAFQfDZACADELsBEOkBIAUoAhAFIAMLKAJoIgNFDQIgAysDQCESIAQgAysDODkDQCAEIBMgEqEgEkG42wotAAAbOQNIIARB8AFqIgNB6YIBIARBQGsQfiAFQejZACADELsBEOkBDAILIAYEfyAEQfABakE7ENYEIAUoAhAoAggFIAgLKAIAIgggBkEwbCIJaiIDKAIIBH8gAysDGCESIAQgAysDEDkDMCAEIBMgEqEgEkG42wotAAAbOQM4IARB8AFqQa/JAyAEQTBqEH5BASEQIAUoAhAoAggoAgAFIAgLIAlqIgMoAgwEQCADKwMoIRIgBCADKwMgOQMgIAQgEyASoSASQbjbCi0AABs5AyggBEHwAWpB0ckDIARBIGoQfkEBIQsLQQAhAwNAIAUoAhAoAggiCCgCACIRIAlqKAIEIANNBEAgBkEBaiEGDAIFIAMEfyAEQfABakEgENYEIAUoAhAoAggoAgAFIBELIAlqKAIAIANBBHRqIggrAwghEiAEIAgrAwA5AxAgBCATIBKhIBJBuNsKLQAAGzkDGCAEQfABakHpggEgBEEQahB+IANBAWohAwwBCwALAAsACyAAIAUQMCEFDAALAAsgACAHEB0hBwwACwALpgEBAn8gAigCEC0AhgEgAhAhIQVBAUYEQCAFQToQzQFBAWohBQsgBRCEBCEEAn8gAigCEC0AhgFBAUYEQCACEC0gBSAEEI4GDAELIAUgBBDBAwshAiABQb7OAyAAEQAAGiABIAIgABEAABogBBAYAkAgA0UNACADLQAARQ0AIAMgAxCEBCICEMEDIQMgAUH74gEgABEAABogASADIAARAAAaIAIQGAsLsQoCCX8DfCMAQdAAayIHJAAgASgCECIEKwMoIQ4gASgCTCgCBCgCBCEFQbjbCi0AAEEBRgRAIA4gBCsDGKAhDQsgBCsDICEPIAUgAkGoyQMgACsD4AIQjQMgBSACQb7OAyAPRAAAAAAAAFJAoxCNAyAFIAJBvs4DIA5EAAAAAAAAUkCjEI0DIAdBCjsAQCACIAdBQGsgBREAABogARAcIQQDQCAEBEAgBCgCEC0AhgFFBEAgBBAhEIQEIQAgBBAhIAAQwQMhBiACQcDKAyAFEQAAGiACIAYgBREAABogABAYIAcgBCgCECIAKQMYNwM4IAcgACkDEDcDMCAFIAIgB0EwaiANEI8GAn8gBCgCECgCeCIALQBSQQFGBEAgBEHw2wooAgAQRQwBCyAAKAIACyIAEIQEIQYCfyAEKAIQKAJ4LQBSQQFGBEAgACAGEMEDDAELIAQQLSAAIAYQjgYLIQAgBSACQb7OAyAEKAIQKwMgEI0DIAUgAkG+zgMgBCgCECsDKBCNAyACQb7OAyAFEQAAGiACIAAgBREAABogBhAYIARB/NsKKAIAQeKmARCPASEAIAJBvs4DIAURAAAaIAIgACAFEQAAGiAEKAIQKAIIKAIAIQAgAkG+zgMgBREAABogAiAAIAURAAAaIARB3NsKKAIAQYX1ABCPASEAIAJBvs4DIAURAAAaIAIgACAFEQAAGiAEQeDbCigCAEHx/wQQjwEiAC0AAEUEQCAEQdzbCigCAEHfDhCPASEACyACQb7OAyAFEQAAGiACIAAgBREAABogB0EKOwBAIAIgB0FAayAFEQAAGgsgASAEEB0hBAwBCwsgARAcIQoDQCAKBEAgASAKECwhBgNAAkAgBgRAQfH/BCEJQfH/BCELIAMEQCAGQdMbECciAEHx/wQgABshCyAGQY8cECciAEHx/wQgABshCQsgBigCECIAKAIIIghFDQEgCCgCBCEMQQAhAEEAIQQDQCAEIAxGBEAgAkHvnQEgBREAABpBACEIIAUgAiAGQTBBACAGKAIAQQNxQQNHG2ooAiggCxDGCCAFIAIgBkFQQQAgBigCAEEDcUECRxtqKAIoIAkQxgggB0IANwNIIAdCADcDQCACQb7OAyAFEQAAGiAHIAA2AiAgB0FAayIAQcwXIAdBIGoQfiACIAAQuwEgBREAABogABBcA0AgCCAGKAIQIgAoAggiBCgCBE8NBCAEKAIAIAhBMGxqIgAoAgQhCSAAKAIAIQBBACEEA0AgBCAJRgRAIAhBAWohCAwCBSAHIAAgBEEEdGoiCykDCDcDGCAHIAspAwA3AxAgBSACIAdBEGogDRCPBiAEQQFqIQQMAQsACwALAAUgCCgCACAEQTBsaigCBCAAaiEAIARBAWohBAwBCwALAAsgASAKEB0hCgwDCyAAKAJgIgAEQCAAKAIAEIQEIQAgBkEwQQAgBigCAEEDcUEDRxtqKAIoEC0gBigCECgCYCgCACAAEI4GIQQgAkG+zgMgBREAABogAiAEIAURAAAaIAAQGCAHIAYoAhAoAmAiAEFAaykDADcDCCAHIAApAzg3AwAgBSACIAcgDRCPBgsgBkHs3AooAgBB4qYBEI8BIQAgAkG+zgMgBREAABogAiAAIAURAAAaIAZBzNwKKAIAQYX1ABCPASEAIAJBvs4DIAURAAAaIAIgACAFEQAAGiAHQQo7AEAgAiAHQUBrIAURAAAaIAEgBhAwIQYMAAsACwsgAkH4iQQgBREAABogB0HQAGokAAuCAQECfyAAECEhBSAAEC0hAAJAIAVFDQAgBS0AAEUNACACRQRAIAMgAygCDEEBajYCDAtBfyEEIAFB0OABIAAoAkwoAgQoAgQRAABBf0YNACAAIAEgBRCSBkF/Rg0AIAIEQCABQf7IASAAKAJMKAIEKAIEEQAAQX9GDQELQQEhBAsgBAvvAwEHfyMAQRBrIgckAAJAAkAgAC0AAEECcUUNAAJAIAAgAUEAIAMQyAgiBEEBag4CAgEAC0EBIQQLIAAQ7AEhCSAAEC0hBgJAIAlFDQAgAkEAQYABIAIoAgARAwAhBSAEIQgDQCAFRQRAIAghBAwCCwJAAkAgAC0AAEECcUUNAEHU4gooAgAiBARAIAUoAhAgBCgCEEYNAgtB2OIKKAIAIgRFDQAgBSgCECAEKAIQRg0BCyAJKAIMIAUoAhBBAnRqKAIAIAUoAgxGDQAgBigCTCgCBCgCBCEKAkAgCEUEQEF/IQQgAUGayQEgChEAAEF/Rg0FIAMgAygCDEEBajYCDAwBC0F/IQQgAUG57QQgChEAAEF/Rg0EIAcgAykCCDcDCCAHIAMpAgA3AwAgBiABIAcQ2AJBf0YNBAsgBiABIAUoAghBARC8AkF/Rg0DIAFB2OABIAYoAkwoAgQoAgQRAABBf0YNAyAGIAEgCSgCDCAFKAIQQQJ0aigCAEEBELwCQX9GDQMgCEEBaiEICyACIAVBCCACKAIAEQMAIQUMAAsACyAEQQBKBEBBfyEEIAFB/sgBIAYoAkwoAgQoAgQRAABBf0YNASADIAMoAgxBAWs2AgwLIAAgACgCAEEIcjYCAEEAIQQLIAdBEGokACAEC8cBAQJ/AkAgAkUNACAAEC0hBCAAIAIQRSIALQAARQ0AQX8hAyABQfviASAEKAJMKAIEKAIEEQAAQX9GDQACQCAAEHYEQCAEIAEgAEEBELwCQX9HDQEMAgsgAEE6EM0BIgIEQCACQQA6AAAgBCABIABBABC8AkF/Rg0CIAFB++IBIAQoAkwoAgQoAgQRAABBf0YNAiAEIAEgAkEBakEAELwCQX9GDQIgAkE6OgAADAELIAQgASAAQQAQvAJBf0YNAQtBACEDCyADC7oBAQN/IwBBEGsiBiQAIAEQLSEHIAYgBCkCCDcDCCAGIAQpAgA3AwACf0F/IAcgAiAGENgCQX9GDQAaQX8gASACEJAGQX9GDQAaIAEoAgAiBUEIcUUEQEF/IAEgAiADIAQQyQhBf0YNARogASgCACEFCyAEKAIEIAVBAXZB+P///wdxaiAEKAIAIAAoAgBBAXZB+P///wdxaikDADcDACACQffYBCAHKAJMKAIEKAIEEQAACyAGQRBqJAALtgEBAX8CQCACKAIEIAEoAgBBAXZB+P///wdxaikDACACKAIAIAAoAgBBAXZB+P///wdxaikDAFoNAAJAIAAgARC9Ag0AIAAgARAsDQBBASEDDAELIAEQ7AEiAEUNACAAKAIIIgFBAEGAASABKAIAEQMAIQEDQCABQQBHIQMgAUUNASAAKAIMIAEoAhBBAnRqKAIAIAEoAgxHDQEgACgCCCICIAFBCCACKAIAEQMAIQEMAAsACyADC8ICAQZ/IAAQeSEDA0ACQCADRQRAQQAhAAwBCwJAAkACQAJAIAMoAkwoAgBB4O4JRgRAIAMpAwinIgBBAXFFDQEMAgsgAxAhIgBFDQELIAAtAABBJUcNAQsCQCADEOwBIgZFDQAgAygCRBDsASIHRQ0AQQAhACADEDkQ7AEoAggQmgEiBEEAIARBAEobIQQDQCAAIARGDQECQCAAQQJ0IgUgBigCDGooAgAiCEUNACAHKAIMIAVqKAIAIgVFDQAgCCAFEE0NAwsgAEEBaiEADAALAAsgA0EAELECIgAEQCAAKAIIEJoBQQBKDQEgACgCDBCaAUEASg0BCyADIAEgAhDNCBoMAQtBfyEAIAMgAUEAIAIQ0ghBf0YNASADIAEgAhDRCEF/Rg0BIAMgASACENAIQX9GDQELIAMQeCEDDAELCyAAC3sBAn8gAUFQQQAgASgCAEEDcUEDRiIDG2oiAigCKCEEIAAgAUEAQTAgAxtqIgEoAigQ5gEhAyAAKAI0IANBIGogAhDXBCAAKAI4IANBGGogAhDXBCAAIAQQ5gEhAiAAKAI0IAJBHGogARDXBCAAKAI4IAJBFGogARDXBAutAQIEfwF+AkAgAUUNAAJAIAAQvgMoAgAiBSABIAIQlwQiAwRAIAMgAykDACIHQgF8Qv///////////wCDIAdCgICAgICAgICAf4OENwMADAELIAEQQCIGQQlqIQMCQCAABEAgA0EBEBohAwwBCyADEE8iA0UNAgsgA0KBgICAgICAgIB/QgEgAhs3AwAgA0EIaiABIAZBAWoQHxogBSADEJgPCyADQQhqIQQLIAQLaAECfyMAQRBrIgMkAEF/IQQgAiACKAIMQQFrNgIMIAMgAikCCDcDCCADIAIpAgA3AwAgACABIAMQ2AJBf0cEQEF/QQAgAUGW2AMgACgCTCgCBCgCBBEAAEF/RhshBAsgA0EQaiQAIAQLjAUBCn8jAEEQayIJJABBfyEDAkAgACABIAIQzQhBf0YNACAAQQAQsQIhByAAEBwhBQNAIAVFBEBBACEDDAILIAAgBSACEMwIBEBBfyEDIAAgBSABIAcEfyAHKAIIBUEACyACEMsIQX9GDQILIAAgBRAsIQQgBSEKA0AgBARAAkAgCiAEIARBMGsiCCAEKAIAIgNBA3FBAkYbKAIoIgZGDQAgACAGIAIQzAggBCgCACEDRQ0AIAQgCCADQQNxQQJGGygCKCEGQX8hAyAAIAYgASAHBH8gBygCCAVBAAsgAhDLCEF/Rg0EIAQgCCAEKAIAIgNBA3FBAkYbKAIoIQoLIAIoAgggA0EBdkH4////B3FqKQMAIAIoAgAgACgCAEEBdkH4////B3FqKQMAVARAIAcEfyAHKAIMBUEACyEGIARBUEEAIANBA3EiA0ECRxtqKAIoIARBMEEAIANBA0cbaigCKCILEC0hCCAJIAIpAgg3AwggCSACKQIANwMAQX8hAyAIIAEgCRDYAkF/Rg0EIAsgARCQBkF/Rg0EIAQgAUHU4gooAgAQyghBf0YNBCABQcHLA0GfzQMgCxAtEIICGyAIKAJMKAIEKAIEEQAAQX9GDQQgARCQBkF/Rg0EIAQgAUHY4gooAgAQyghBf0YNBAJAIAQtAABBCHFFBEAgBCABIAYgAhDJCEF/Rw0BDAYLIAQgAUEBIAIQyAhBf0YNBQsgAigCCCAEKAIAQQF2Qfj///8HcWogAigCACAAKAIAQQF2Qfj///8HcWopAwA3AwAgAUH32AQgCCgCTCgCBCgCBBEAAEF/Rg0ECyAAIAQQMCEEDAELCyAAIAUQHSEFDAALAAsgCUEQaiQAIAMLhAQBB38jAEEQayIFJAACfwJAIAINACAAKAJERQ0AQfH/BCEGQam/ASEHQQAMAQsgAC0AGCEEIAAQ3AUhBkHU4gogAEECQdMbQQAQIjYCAEHY4gogAEECQY8cQQAQIjYCAEGtyANB8f8EIAYbIQZBs/YAQfH/BCAEQQFxGyEHQQELIQoCfwJAIAAQISIERQ0AIAQtAABBJUYNAEG+zgMhCEEBDAELQfH/BCEEQfH/BCEIQQALIQkgBSADKQIINwMIIAUgAykCADcDAAJ/QX8gACABIAUQ2AJBf0YNABpBfyABIAYgACgCTCgCBCgCBBEAAEF/Rg0AGiAJIApyBEBBfyABIAcgACgCTCgCBCgCBBEAAEF/Rg0BGkF/IAFBqMkDIAAoAkwoAgQoAgQRAABBf0YNARoLIAkEQEF/IAAgASAEEJIGQX9GDQEaC0F/IAEgCCAAKAJMKAIEKAIEEQAAQX9GDQAaQX8gAUHw2AMgACgCTCgCBCgCBBEAAEF/Rg0AGiADIAMoAgxBAWo2AgwgAEEAELECIgQEQEF/IAAgAUGI+gAgBCgCECACIAMQkQZBf0YNARpBfyAAIAFB6J8BIAQoAgggAiADEJEGQX9GDQEaQX8gACABQe+dASAEKAIMIAIgAxCRBkF/Rg0BGgsgACAAKAIAQQhyNgIAQQALIAVBEGokAAtCACACKAIAIAAoAgBBAXZB+P///wdxaiABNwMAIAAQeSEAA0AgAARAIAAgASACENMIIQEgABB4IQAMAQsLIAFCAXwLgwEBAX8gACAAKAIAQXdxNgIAIAAQeSECA0AgAgRAIAJBABDUCCACEHghAgwBCwsCQCABRQ0AIAAQHCEBA0AgAUUNASABIAEoAgBBd3E2AgAgACABECwhAgNAIAIEQCACIAIoAgBBd3E2AgAgACACEDAhAgwBCwsgACABEB0hAQwACwALC9ACAQJ/IwBBQGoiAiQAAkAgAEGp9wAQJyIDRQ0AIAMsAABBMGtBCUsNACADQQBBChCpBCIDQQBIIANBPGtBREtyDQBBtKAKIAM2AgALIAJBADYCPCAAQQEQ1AggAiAAKAJMKAIQQQFqEMMBNgIwIAIgACgCTCgCGEEBahDDATYCNCACIAAoAkwoAiBBAWoQwwE2AjggAEIBIAJBMGoiAxDTCBoCQCAAIAFBASADENIIQX9GBEAgAiACKQI4NwMIIAIgAikCMDcDACACEJMGDAELIAAgASACQTBqENEIQX9GBEAgAiACKQI4NwMYIAIgAikCMDcDECACQRBqEJMGDAELIAAgASACQTBqENAIIAIgAikCODcDKCACIAIpAjA3AyAgAkEgahCTBkF/Rg0AQbSgCkGAATYCACABIAAoAkwoAgQoAggRAgAaCyACQUBrJAALjQUBD39BjscDIQICQCAARQ0AIAAtAABFDQAgAUEiOgAAIAAsAAAiAkEta0H/AXFBAkkgAkEwa0EKSXIhCSABQQFqIQNBtKAKKAIAIQ8gACEMA0AgCiIQQQFzIQoCQANAIAwhBQJ/AkACQAJAAkACQAJAAkAgAkH/AXEiCwRAIAVBAWohDCACwCEIIAYgC0EiR3JFBEAgA0HcADoAAEEBIQRBACEGIANBAWoMCQsgBg0CIAUtAABB3ABHDQJBASEGIAwtAAAiBUHFAGsiDkEXS0EBIA50QY2FggRxRXINAQwDCyADQSI7AAACQCAEQQFxDQAgB0EBRgRAIAAtAABBLWtB/wFxQQJJDQELQdC/CCECA0AgAigCACIDRQRAIAAPCyACQQRqIQIgAyAAEC4NAAsLIAEhAgwLCyAFQSJGIAVB7ABrIg5BBk1BAEEBIA50QcUAcRtyDQELIAlFDQQgC0Etaw4CAQIDC0EBIQQgAwwEC0EAIQYgB0EARyAEciEEIAdFIQkgAwwDC0EAIQYgDUEARyAEciEEIA1FIQkgDUEBaiENIAMMAgsgCEEwayIFQQpJIQkgBUEJSyAEciEEQQAhBiADDAELIAhBX3FB2wBrQWZJIAhBOmtBdklxIAtB3wBHcSAIQQBOcSAEciEEQQAhBkEAIQkgAwsiBSACOgAAIAdBAWohByAFQQFqIQMgDCwAACECIA9FDQACQCACRSAKckEBcQ0AIAgQ2AQgC0HcAEZyDQAgAhDYBEUNAEEAIRAMAgsgAkUgByAPSHINAAtBASEKIAgQ2AQgC0HcAEZyDQEgAhDYBEUNAQsgBUHcFDsAASAFQQNqIQNBASEEQQAhByAQIQoMAAsACyACCwgAQYADEKQKC4gQAgZ/CnwjAEGAAWsiByQAAkAgAQRAIAEtAAAEQCAAKAI8IQkgARDsCSIIRQRAIAEQxwZFIAlFcg0DIAkoAnQiBUUNAyAAIAEgAiADIAQgBREKAAwDCyAHIAApA7gDNwNIIAcgACkDsAM3A0AgB0HgAGogCCAHQUBrEOoJIAcoAmAiCkEATCAHKAJkIgtBAExxDQIgByACKQMINwN4IAcgAikDADcDcCAHIAIpAwg3A2ggByACKQMANwNgQQEgAyADQQFNGyEDIAcrA3ghESAHKwNoIRIgBysDcCEQIAcrA2AhD0EBIQEDQCABIANGBEAgByASOQNoIAcgETkDeCARIBKhIRUgC7chDSAHIA85A2AgByAQOQNwIBAgD6EhFCAKtyEOAkAgBS0AAEUNACAUIA6jIRYCQCAFQfj3ABAuRQ0AIBUgDaMhEwJAIAVBgyEQLgRAIAVBmfcAEC5FDQEgBRBoRQ0DIBMgFmQEQCAWIA2iIQ0MAwsgEyANoiENIBMgDqIhDgwDCyATIA2iIQ0MAgsgEyANoiENCyAWIA6iIQ4LQQQhAQJAIAYtAABFDQAgBkGS7QAQLkUEQEEAIQEMAQsgBkHKsgEQLkUEQEEBIQEMAQsgBkGONRAuRQRAQQIhAQwBCyAGQavuABAuRQRAQQMhAQwBCyAGQYC0ARAuRQ0AIAZBpDcQLkUEQEEFIQEMAQsgBkHV8AAQLkUEQEEGIQEMAQsgBkGGtwEQLkUEQEEHIQEMAQtBBEEIIAZBnjsQLhshAQsgDiAUYwRAIAcCfAJAIAFBCEsNAEEBIAF0IgJByQBxRQRAIAJBpAJxRQ0BIAcgFCAOoSAPoCIPOQNgCyAOIA+gDAELIAcgFCAOoUQAAAAAAADgP6IiDiAPoCIPOQNgIBAgDqELIhA5A3ALAkAgDSAVY0UNAAJAAkACQCABDgkAAAACAgIBAQECCyAHIBEgDaE5A2gMAgsgByANIBKgIg45A2ggByAOIA2hOQN4DAELIAcgESAVIA2hRAAAAAAAAOA/oiINoTkDeCAHIA0gEqA5A2gLIAAtAJkBQSBxRQRAIAcgBykDaDcDOCAHIAcpA2A3AzAgB0HQAGoiASAAIAdBMGoQnQYgByAHKQNYNwNoIAcgBykDUDcDYCAHIAcpA3g3AyggByAHKQNwNwMgIAEgACAHQSBqEJ0GIAcgBykDWDcDeCAHIAcpA1A3A3AgBysDcCEQIAcrA2AhDwsgDyAQZARAIAcgDzkDcCAHIBA5A2ALIAcrA2giDSAHKwN4Ig9kBEAgByANOQN4IAcgDzkDaAsgCUUNBCAAKAJIIQMgByAHKQN4NwMYIAcgBykDcDcDECAHIAcpA2g3AwggByAHKQNgNwMAIAghAUEAIQYjAEHQAGsiAiQAIAJCADcDSCACQgA3A0ACQAJAAkACQCAABEAgAUUNASABKAIIIgVFDQIgBS0AAEUNAyABKAIcIQUgAiADNgI0IAIgBTYCMCACQUBrIQMjAEEwayIFJAAgBSACQTBqIgg2AgwgBSAINgIsIAUgCDYCEAJAAkACQAJAAkACQEEAQQBBlDMgCBBgIglBAEgNACAJQQFqIQgCQCADEEsgAxAkayIKIAlLDQAgCCAKayEKIAMQKARAQQEhBiAKQQFGDQELIAMgChC9AUEAIQYLIAVCADcDGCAFQgA3AxAgBiAJQRBPcQ0BIAVBEGohCiAJIAYEfyAKBSADEHMLIAhBlDMgBSgCLBBgIghHIAhBAE5xDQIgCEEATA0AIAMQKARAIAhBgAJPDQQgBgRAIAMQcyAFQRBqIAgQHxoLIAMgAy0ADyAIajoADyADECRBEEkNAUGTtgNBoPwAQeoBQfgeEAAACyAGDQQgAyADKAIEIAhqNgIECyAFQTBqJAAMBAtBxqYDQaD8AEHdAUH4HhAAAAtBrZ4DQaD8AEHiAUH4HhAAAAtB+c0BQaD8AEHlAUH4HhAAAAtBo54BQaD8AEHsAUH4HhAAAAsCQCADECgEQCADECRBD0YNAQsgAkFAayIDECQgAxBLTwRAIANBARC9AQsgAkFAayIDECQhBSADECgEQCADIAVqQQA6AAAgAiACLQBPQQFqOgBPIAMQJEEQSQ0BQZO2A0Gg/ABBrwJBxLIBEAAACyACKAJAIAVqQQA6AAAgAiACKAJEQQFqNgJECwJAIAJBQGsQKARAIAJBADoATwwBCyACQQA2AkQLIAJBQGsiAxAoIQUCQCAAKAIAQQQgAyACKAJAIAUbIgNBABDSAyIFBEAgACAFKAIQIgUoAgwiAzYCXCAAIAUoAgA2AmAMAQsgAiADNgIgQeX6BCACQSBqECogACgCXCEDCwJAIANFDQAgAygCACIDRQ0AIAIgBykDGDcDGCACIAcpAxA3AxAgAiAHKQMINwMIIAIgBykDADcDACAAIAEgAiAEIAMRBwALIAItAE9B/wFGBEAgAigCQBAYCyACQdAAaiQADAQLQcS/AUHnvQFBMUG5ngEQAAALQawmQee9AUEyQbmeARAAAAtB7pgBQee9AUEzQbmeARAAAAtB5MgBQee9AUE0QbmeARAAAAsMBAUgAiABQQR0aiIMKwAAIQ0gESAMKwAIIg4QIyERIBAgDRAjIRAgEiAOECkhEiAPIA0QKSEPIAFBAWohAQwBCwALAAtB6MgBQca6AUGqBUGIlgEQAAALQcKZAUHGugFBqQVBiJYBEAAACyAHQYABaiQAC8UaAwd/CXwBfiMAQTBrIgYkACACQQQ2AiAgAiABNgIAAkAgACgCECIEBEAgASAEIAAoAhRBBEGeAhDsAw0BCyABIQQgACgCGCEHIwBB0AFrIgMkACACIAc2AiADQCAEIgBBAWohBCAALQAAQSBGDQALIANB/wE2AnggAyADQYQBaiIFNgJgIAMgA0GAAWoiCDYCZCADIANB/ABqIgk2AmggAyADQfgAajYCbAJAAkACQAJAAkAgAEGrEyADQeAAahBRQQJMBEAgABBAQQRHDQEgAyAJNgJYIAMgCDYCVCADIAU2AlAgAEG5EyADQdAAahBRQQNHDQEgAyADKAKEASIAQQR0IAByNgKEASADIAMoAoABIgBBBHQgAHI2AoABIAMgAygCfCIAQQR0IAByNgJ8C0EAIQACQAJAAkACQCAHDgYABQECCAgDCyADKAKEAbhEAAAAAADgb0CjIgwgAygCgAG4RAAAAAAA4G9AoyINIAMoAny4RAAAAAAA4G9AoyIOECMQIyEKIAMoAni4RAAAAAAA4G9AoyERAkAgCkQAAAAAAAAAAGRFDQAgCiAMIA0gDhApECmhIg8gCqMiEEQAAAAAAAAAAGRFDQACfCAKIA6hIA+jIgsgCiANoSAPoyISoSAKvSITIAy9UQ0AGiAKIAyhIA+jIgxEAAAAAAAAAECgIAuhIBMgDb1RDQAaRAAAAAAAAAAAIA69IBNSDQAaIBJEAAAAAAAAEECgIAyhC0QAAAAAAABOQKIiC0QAAAAAAAAAAGNFDQAgC0QAAAAAAIB2QKAhCwsgAiAROQMYIAIgCjkDECACIBA5AwggAiALRAAAAAAAgHZAozkDAAwHCyACIAMoAoQBQf//A2xB/wFuNgIAIAIgAygCgAFB//8DbEH/AW42AgQgAiADKAJ8Qf//A2xB/wFuNgIIIAIgAygCeEH//wNsQf8BbjYCDAwGCyACIAMoAoQBuEQAAAAAAOBvQKM5AwAgAiADKAKAAbhEAAAAAADgb0CjOQMIIAIgAygCfLhEAAAAAADgb0CjOQMQIAIgAygCeLhEAAAAAADgb0CjOQMYDAULIANBiAI2AgQgA0GUvQE2AgBBiPYIKAIAQdi/BCADECAaEDsACyAALAAAIghB/wFxQS5HIAhBMGtBCUtxRQRAIANCADcDyAEgA0IANwPAASAAIQUDQCAIQf8BcSIJBEAgA0HAAWpBICAIIAlBLEYbwBDKAyAFLQABIQggBUEBaiEFDAELCyADQoCAgICAgID4PzcDoAEgA0HAAWoQ4gIgAyADQaABajYCTCADIANBqAFqNgJIIAMgA0GwAWo2AkQgAyADQbgBajYCQEHDgwEgA0FAaxBRQQNOBEAgAyADKwO4AUQAAAAAAADwPxApRAAAAAAAAAAAECMiCjkDuAEgAyADKwOwAUQAAAAAAADwPxApRAAAAAAAAAAAECMiCzkDsAEgAyADKwOoAUQAAAAAAADwPxApRAAAAAAAAAAAECMiDDkDqAEgAyADKwOgAUQAAAAAAADwPxApRAAAAAAAAAAAECMiDTkDoAECQAJAAkACQAJAAkAgBw4GBAABAgUFAwsgCiALIAwgA0GYAWogA0GQAWogA0GIAWoQ4gYgAgJ/IAMrA5gBRAAAAAAA4G9AoiIKRAAAAAAAAPBBYyAKRAAAAAAAAAAAZnEEQCAKqwwBC0EACzoAACACAn8gAysDkAFEAAAAAADgb0CiIgpEAAAAAAAA8EFjIApEAAAAAAAAAABmcQRAIAqrDAELQQALOgABIAICfyADKwOIAUQAAAAAAOBvQKIiCkQAAAAAAADwQWMgCkQAAAAAAAAAAGZxBEAgCqsMAQtBAAs6AAIgAgJ/IAMrA6ABRAAAAAAA4G9AoiIKRAAAAAAAAPBBYyAKRAAAAAAAAAAAZnEEQCAKqwwBC0EACzoAAwwECyAKIAsgDCADQZgBaiADQZABaiADQYgBahDiBiACAn8gAysDmAFEAAAAAOD/70CiIgqZRAAAAAAAAOBBYwRAIAqqDAELQYCAgIB4CzYCACACAn8gAysDkAFEAAAAAOD/70CiIgqZRAAAAAAAAOBBYwRAIAqqDAELQYCAgIB4CzYCBCACAn8gAysDiAFEAAAAAOD/70CiIgqZRAAAAAAAAOBBYwRAIAqqDAELQYCAgIB4CzYCCCACAn8gAysDoAFEAAAAAOD/70CiIgqZRAAAAAAAAOBBYwRAIAqqDAELQYCAgIB4CzYCDAwDCyAKIAsgDCADQZgBaiADQZABaiADQYgBahDiBiACIAMrA5gBOQMAIAIgAysDkAE5AwggAiADKwOIATkDECACIAMrA6ABOQMYDAILIANBvAI2AjQgA0GUvQE2AjBBiPYIKAIAQdi/BCADQTBqECAaEDsACyACIA05AxggAiAMOQMQIAIgCzkDCCACIAo5AwALIANBwAFqEFxBACEADAULIANBwAFqEFwLIABBhfUAEE1FDQEgAEHGkQEQTUUNASAAQd8OEE1FDQEgA0IANwPIASADQgA3A8ABAkAgAC0AAEEvRgRAIARBLxDNASIFRQRAIAQhAAwCCyAELQAAQS9GBEACQEG43gooAgAiBEUNACAELQAARQ0AQfmeAyAEQQMQgAJFDQAgA0HAAWogBCAAQQJqEJUKIQAMAwsgAEECaiEADAILIAAgBUEBakH5ngMgBEEEEIACGyEADAELQbjeCigCACIERQ0AIAQtAABFDQBB+Z4DIARBAxCAAkUNACADQcABaiAEIAAQlQohAAsgABClASEAIANBwAFqEFwMAgsgAiADKAKEAToAACACIAMoAoABOgABIAIgAygCfDoAAiACIAMoAng6AAMMAgsgABClASEACyAARQRAQX8hAAwBCyAAQdCWBUHTE0EMQSEQ7AMhBCAAEBggBARAQQAhAAJAAkACQAJAAkAgBw4GAAECAwYGBAsgAiAELQAEuEQAAAAAAOBvQKM5AwAgAiAELQAFuEQAAAAAAOBvQKM5AwggAiAELQAGuEQAAAAAAOBvQKM5AxAgAiAELQAKuEQAAAAAAOBvQKM5AxgMBQsgAiAELQAHOgAAIAIgBC0ACDoAASACIAQtAAk6AAIgAiAELQAKOgADDAQLIAIgBC0AB0GBAmw2AgAgAiAELQAIQYECbDYCBCACIAQtAAlBgQJsNgIIIAIgBC0ACkGBAmw2AgwMAwsgAiAELQAHuEQAAAAAAOBvQKM5AwAgAiAELQAIuEQAAAAAAOBvQKM5AwggAiAELQAJuEQAAAAAAOBvQKM5AxAgAiAELQAKuEQAAAAAAOBvQKM5AxgMAgsgA0HrAjYCJCADQZS9ATYCIEGI9ggoAgBB2L8EIANBIGoQIBoQOwALQQEhAAJAAkACQAJAAkAgBw4GAAECAwUFBAsgAkIANwMAIAJCgICAgICAgPg/NwMYIAJCADcDECACQgA3AwgMBAsgAkGAgIB4NgIADAMLIAJCgICAgPD/PzcDCCACQgA3AwAMAgsgAkIANwMAIAJCgICAgICAgPg/NwMYIAJCADcDECACQgA3AwgMAQsgA0GIAzYCFCADQZS9ATYCEEGI9ggoAgBB2L8EIANBEGoQIBoQOwALIANB0AFqJAACQAJAIAAOAgIAAQsgBkIANwMoIAZCADcDICAGIAE2AhAgBkEgaiEAQQAhBCMAQTBrIgIkACACIAZBEGoiBTYCDCACIAU2AiwgAiAFNgIQAkACQAJAAkACQAJAQQBBAEGHNCAFEGAiA0EASA0AIANBAWohBQJAIAAQSyAAECRrIgcgA0sNACAFIAdrIQcgABAoBEBBASEEIAdBAUYNAQsgACAHELcCQQAhBAsgAkIANwMYIAJCADcDECAEIANBEE9xDQEgAkEQaiEHIAMgBAR/IAcFIAAQcwsgBUGHNCACKAIsEGAiBUcgBUEATnENAiAFQQBMDQAgABAoBEAgBUGAAk8NBCAEBEAgABBzIAJBEGogBRAfGgsgACAALQAPIAVqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABB6gFB+B4QAAALIAQNBCAAIAAoAgQgBWo2AgQLIAJBMGokAAwEC0HGpgNBoPwAQd0BQfgeEAAAC0GtngNBoPwAQeIBQfgeEAAAC0H5zQFBoPwAQeUBQfgeEAAAC0GjngFBoPwAQewBQfgeEAAACwJAIAAQKARAIAAQJEEPRg0BCyAGQSBqIgAQJCAAEEtPBEAgAEEBELcCCyAGQSBqIgAQJCECIAAQKARAIAAgAmpBADoAACAGIAYtAC9BAWo6AC8gABAkQRBJDQFBk7YDQaD8AEGvAkHEsgEQAAALIAYoAiAgAmpBADoAACAGIAYoAiRBAWo2AiQLAkAgBkEgahAoBEAgBkEAOgAvDAELIAZBADYCJAsgBkEgaiIAECghAiAAIAYoAiAgAhsQoQYEQCAGIAE2AgBB4eAEIAYQKgsgBi0AL0H/AUcNASAGKAIgEBgMAQtB9/YEQQAQNwsgBkEwaiQACyIBAX8CQCAAKAI8IgFFDQAgASgCVCIBRQ0AIAAgAREBAAsLJAEBfwJAIAAoAjwiAkUNACACKAJQIgJFDQAgACABIAIRBAALCyIBAX8CQCAAKAI8IgFFDQAgASgCNCIBRQ0AIAAgAREBAAsL0QECA38EfAJAIAAoApgBIgNBgICEAnFFDQAgACgCECICQQJBBCADQYCACHEiBBs2ApQCIAIgBEEQdkECczYCkAIgAigCmAIQGCACIAIoApQCQRAQPyICNgKYAiACIAErAzgiBSABKwMYRAAAAAAAAOA/oiIHoTkDACABKwNAIQYgASsDICEIIAIgBSAHoDkDECACIAYgCEQAAAAAAADgP6IiBaA5AxggAiAGIAWhOQMIIANBgMAAcUUEQCAAIAIgAkECEJgCGgsgBA0AIAIQgwULC2sAIABCADcCAAJAAkACQAJAAkAgAkHCAGtBH3cOCgEEBAQEAgQEAwAECyABIAEoAqgBQQFrNgKwASAAQX82AgQPCyAAQQE2AgQPCyAAQQE2AgAPCyABIAEoAqQBQQFrNgKsASAAQX82AgALC9oBAQV/IwBBEGsiByQAIAdBADYCDCAHQQA2AgggAxBkIgghAwNAAkAgBQ0AIAMgACgCpAIgB0EMahCbByIERQ0AQQAhA0EAIQUgBCAAKAKgAiAHQQhqIgYQmwciBEUNAUEAIAAoAqACIAYQmwciBQRAIAAgBEEAEJ4GIQQgACAFIAIQngYhBiAEQQBIBEBBACEFIAZBAEgNAwsgBCAGIAQgBkgbIAFMIAEgBCAGIAQgBkobTHEhBQwCBSAAIAQgARCeBiABRiEFDAILAAsLIAgQGCAHQRBqJAAgBQu5AgIDfwl8AkACQCABKAIEIgQEQEEBIQIgBEEDcEEBRw0BIAAgASgCACIDKQMANwMQIAAgAykDCDcDGCAAIAMpAwg3AwggACADKQMANwMAIAArAxghBSAAKwMIIQYgACsDECEHIAArAwAhCANAIAIgBE8NAyADIAJBBHRqIgErAwAhCSABKwMQIQwgAkEDaiECIAErAyAhCiABKwMoIQsgBSABKwMIIAErAxigRAAAAAAAAOA/oiINECMgCxAjIQUgByAJIAygRAAAAAAAAOA/oiIJECMgChAjIQcgBiANECkgCxApIQYgCCAJECkgChApIQgMAAsAC0GvlwNBhLkBQewfQfW/ARAAAAtB3o0DQYS5AUHtH0H1vwEQAAALIAAgBTkDGCAAIAY5AwggACAHOQMQIAAgCDkDAAvwAQIBfwJ8IAAoAhAhBQJAIAIEfyADBSAFKALYAQsgBHJFBEAgBS8BjAJBAXFFDQELIAAoApgBIgJBgICEAnFFDQAgASsDACEGIAErAwghByAFQQJBBCACQYCACHEiAxs2ApQCIAUgA0EQdkECczYCkAIgBSgCmAIQGCAFIAUoApQCQRAQPyIBNgKYAiABIAdEAAAAAAAACECgOQMYIAEgBkQAAAAAAAAIQKA5AxAgASAHRAAAAAAAAAjAoDkDCCABIAZEAAAAAAAACMCgOQMAIAJBgMAAcUUEQCAAIAEgAUECEJgCGgsgAw0AIAEQgwULC+UEAgh/BHwjAEEQayIJJAAgACgCBCIGQQFrQQNuIQUCQCAGQQRrQQJNBEAgAkEENgIEIAJBBEEQED82AgAgA0EENgIEIANBBEEQED8iAzYCACAJIAAoAgAgASACKAIAIAMQoQEMAQsgBUEIED8hCCAAKAIAIQQDQCAFIAdGBEACQCABIA2iIQFEAAAAAAAAAAAhDUEAIQYDQCAFIAZGBEAgBSEGDAILIA0gCCAGQQN0aisDAKAiDSABZg0BIAZBAWohBgwACwALBSAIIAdBA3RqIAQrAwAgBCsDECIMoSIOIA6iIAQrAwggBCsDGCIOoSIPIA+ioJ8gDCAEKwMgIgyhIg8gD6IgDiAEKwMoIg6hIg8gD6Kgn6AgDCAEKwMwoSIMIAyiIA4gBCsDOKEiDCAMoqCfoCIMOQMAIA0gDKAhDSAHQQFqIQcgBEEwaiEEDAELCyACIAZBA2wiCkEEaiIENgIEIAIgBEEQED82AgAgAyAFIAZrQQNsQQFqIgU2AgQgAyAFQRAQPzYCAEEAIQQDQCAEIAIoAgRPRQRAIARBBHQiBSACKAIAaiIHIAAoAgAgBWoiBSkDADcDACAHIAUpAwg3AwggBEEBaiEEDAELCyAEQQRrIQdBACEEA0AgBCADKAIET0UEQCADKAIAIARBBHRqIgUgACgCACAHQQR0aiILKQMANwMAIAUgCykDCDcDCCAEQQFqIQQgB0EBaiEHDAELCyAJIApBBHQiBSAAKAIAaiABIA0gCCAGQQN0aisDACIBoaEgAaMgAigCACAFaiADKAIAEKEBIAgQGAsgCUEQaiQAC5EBAQN/AkACQCAAKAKcAUECSA0AIAAgAkGo3AooAgBB8f8EEHoiAxCJBA0AIANB8f8EED5FDQFBASEEIAEgAhBuRQ0BIAEgAhBuIQMDQCADQQBHIQQgA0UNAiADQYDdCigCAEHx/wQQeiIFQfH/BBA+DQIgACAFEIkEDQIgASADIAIQciEDDAALAAtBASEECyAEC4QCAQN/An8CQCAAQceZARAnIgBFDQAgAC0AAEUNACAAEMMDGkGw4AohAwNAQbDgCiADKAIAIgBFDQIaIABBrq0BEE1FBEAgA0EEaiEDIAJBAXIhAgwBCyAAQf7xABBNRQRAIAMhAANAIAAgACgCBCIENgIAIABBBGohACAEDQALIAJBA3IhAgwBCyAAQaysARBNRQRAIAMhAANAIAAgACgCBCIENgIAIABBBGohACAEDQALIAJBwAByIQIMAQsgAEHZrgEQTQRAIANBBGohAwUgAyEAA0AgACAAKAIEIgQ2AgAgAEEEaiEAIAQNAAsgAkEEciECCwwACwALQQALIAEgAjYCAAs5AQJ/AkAgACgCxAEiAkEASA0AIAIgACgCpAFODQAgACgCyAEiAkEASA0AIAIgACgCqAFIIQELIAELzQEBA39BASEEA0AgBCABKAIQIgMoArQBSkUEQCAAIAMoArgBIARBAnRqKAIAIgMQ5ggCQCADQfU2ECciAkUNACACLQAARQ0AIAAgAhBJCwJAIANB4DYQJyICRQ0AIAItAABFDQAgACACEEkLAkAgA0HzNhAnIgJFDQAgAi0AAEUNACAAIAIQSQsCQCADQek2ECciAkUNACACLQAARQ0AIAAgAhBdCwJAIANB1jYQJyIDRQ0AIAMtAABFDQAgACADEEkLIARBAWohBAwBCwsLjSYDEX8GfAV+IwBB4AFrIgQkACAAIAArA7gDIhNEAAAAAAAAUkCjIhQ5A5AEIAAgACsDsAMiFUQAAAAAAABSQKM5A4gEIAAgFSAAKwPgAiIVokQAAAAAAABSQKMiFjkD6AMgACAVIBOiRAAAAAAAAFJAoyITOQPwAwJAIAAoApgBIgNBgCBxRQRAQbjbCi0AAEEBRw0BCyAAIBSaOQOQBAsgAEHEA0HAAyAAKALoAiICG2ooAgAhBSAAIABBwANBxAMgAhtqKAIAuCATozkD+AIgACAFuCAWozkD8AIgACABIAFBAEHiH0EAECJB8f8EEHoQhQQgAEEANgKgASAAEI0EIgJBADYCDCACIAE2AgggAkEANgIEIAAgASgCECgCDCABEKMGAkAgACgCPCICRQ0AIAIoAggiAkUNACAAIAIRAQALAkAgA0ECcUUNACAAQd8OEF0CQCABQfM2ECciAkUNACACLQAARQ0AIAAgAhBdCwJAIAFB1jYQJyICRQ0AIAItAABFDQAgACACEEkLIAAgARDmCCABEBwhBgNAIAZFDQECQCAGQfU2ECciAkUNACACLQAARQ0AIAAgAhBJCwJAIAZB4DYQJyICRQ0AIAItAABFDQAgACACEF0LAkAgBkHpNhAnIgJFDQAgAi0AAEUNACACQToQzQEEQCACEGQiBSEDA0AgA0H74gEQsQUiAgRAQQAhAyACLQAARQ0BIAAgAhBJDAELCyAFEBgMAQsgACACEEkLAkAgBkHWNhAnIgJFDQAgAi0AAEUNACAAIAIQSQsgASAGECwhBQNAIAUEQAJAIAVB9TYQJyICRQ0AIAItAABFDQAgAkE6EM0BBEAgAhBkIgchAwNAIANB++IBELEFIgIEQEEAIQMgAi0AAEUNASAAIAIQSQwBCwsgBxAYDAELIAAgAhBJCwJAIAVB1jYQJyICRQ0AIAItAABFDQAgACACEEkLIAEgBRAwIQUMAQsLIAEgBhAdIQYMAAsACyABEBwhAgNAIAIEQCACKAIQQQA6AIQBIAEgAhAdIQIMAQsLIAAgACgCACICKAKwAiIDNgKcAQJAIAIoArQCIgIEQAJAIAIoAgBBAkgNACAALQCYAUHAAHENACAEIAAoAjQ2ApABQaveAyAEQZABahAqIAIgACgCnAFBAWo2AggLIAJBCGohCiACKAIEIQIMAQtBASECIANBAkgNACAALQCYAUHAAHENACAEIAAoAjQ2AoABQaveAyAEQYABahAqIABBATYCnAELIABBnAFqIQ4DQAJAIAAgAjYCoAEgAiAAKAKcAUoNACAAKAIAKAK0AiICIA4gAhsoAgBBAk4EQAJAIAAoAjwiAkUNACACKAIQIgJFDQAgACAAKAIAKAKsAiAAKAKgASIDQQJ0aigCACADIAAoApwBIAIRBwALCyAAIAApAqwBIhk3AsQBIBmnIQIDQAJAAkAgABDlCARAIAAoApgBIQkgACgCECEHIARCADcDqAEgBEIANwOgAUEAIQsgACgCoAFBAUogAkEASnIiEgRAIAcoAtwBIQsgACAEQaABaiICEOsIIAIgC0G3NyALGxDFAyAHIAIQxAM2AtwBCyABQaKYARAnEOwCIQ8gACkCpAEiGUIgiCEaIAApAsQBIhtCIIghHAJAIAAoAugCIgNFBEAgGSEdIBohGSAbIRogHCEbDAELIBohHSAcIRoLIAAgGqe3IhcgACsDwAIiFKIgACsD8AGhIhU5A6ACIAAgG6e3IhggACsDyAIiE6IgACsD+AGhIhY5A6gCIAAgEyAWoDkDuAIgACAUIBWgOQOwAgJAIAAoAgwoAhxFBEAgACAAKQPIAzcD2AMgACAAKQPQAzcD4AMMAQsgACAAKALYAyICIAAoAMgDIgUgAiAFSBs2AtgDIAAgACgC3AMiAiAAKADMAyIFIAIgBUgbNgLcAyAAIAAoAuADIgIgACgA0AMiBSACIAVKGzYC4AMgACAAKALkAyICIAAoANQDIgUgAiAFShs2AuQDCyAAKwPYAiEVIAArA9ACIRYCQCAAKAKYASICQYABcQRAIBUgACsD+AJEAAAAAAAA4D+iIhSgIRMgFiAAKwPwAkQAAAAAAADgP6IiGKAhFyAVIBShIRUgFiAYoSEUDAELIBMgEyAYIBmnt0QAAAAAAADgP6KhoiAVoCIVoCETIBQgFCAXIB2nt0QAAAAAAADgP6KhoiAWoCIUoCEXCyAAIBM5A5gCIAAgFzkDkAIgACAVOQOIAiAAIBQ5A4ACAkAgAwRAIAAgE5ogACsDiAMgACsD4AIiE6OhOQOABAJAIAJBgCBxRQRAQbjbCi0AAEEBRw0BCyAAIBeaIAArA4ADIBOjoTkD+AMMAgsgACAAKwOAAyAToyAUoTkD+AMMAQsgACAAKwOAAyAAKwPgAiIWoyAUoTkD+AMCQCACQYAgcUUEQEG42wotAABBAUcNAQsgACATmiAAKwOIAyAWo6E5A4AEDAELIAAgACsDiAMgFqMgFaE5A4AECwJAIAAoAjwiAkUNACACKAIYIgJFDQAgACACEQEACyAAQYX1ABBJIABB3w4QXQJAIAlBgICEAnFFDQAgBygC2AFFBEAgBy0AjAJBAXFFDQELAn8gCUGAgChxRQRAQQAhAkEADAELIAcgCUGAgAhxIgNBEHZBAnM2ApACQQJBBCADG0EQED8iAiAAKQOoAjcDCCACIAApA6ACNwMAIAIgACkDsAI3AxAgAiAAKQO4AjcDGEECIAMNABogAhCDBUEECyEDIAlBgMAAcUUEQCAAIAIgAiADEJgCGgsgByADNgKUAiAHIAI2ApgCCwJAIAlBgIACcUUNACABKAIQKAIMIgJFDQAgByACKAIANgLIAQsCQCAJQQRxIhANACAHKALYAUUEQCAHLQCMAkEBcUUNAQsgBCAAKQOYAjcDeCAEIAApA5ACNwNwIAQgACkDiAI3A2ggBCAAKQOAAjcDYCAAIARB4ABqEN0EIAAgBygC2AEgBygC7AEgBygC/AEgBygC3AEQxAELAn8gAUHzNhAnIgJFBEBBxpEBIQJBAQwBCyACQcaRASACLQAAIgMbIQIgA0ULIQMCQAJAIAAtAJkBQQFxRQRAQQEgAyACQbsfED4iBRshA0HGkQEgAiAFGyECIAAoApgBIgVBgAJxRQ0BCyACQbsfED4NASAAKAKYASEFCyADQQAgBUGAgIAQcRsNACAEQgA3A8ABIAIgBEHAAWogBEG4AWoQiwQEQCAEQQA2ArQBIAAgBCgCwAEiAxBdIABBux8QSSABIARBtAFqEOQIGiAAIAQoAsQBIgJBhfUAIAIbIAFByNsKKAIAQQBBABBiIAQrA7gBEI4DIAQgACkDiAI3AyggBCAAKQOQAjcDMCAEIAApA5gCNwM4IAQgACkDgAI3AyAgACAEQSBqQQNBAiAEKAK0AUECcRsQiAIgAxAYIAIQGAwBCyAAIAIQXSAAQbsfEEkgBCAAKQOYAjcDWCAEIAApA5ACNwNQIAQgACkDiAI3A0ggBCAAKQOAAjcDQCAAIARBQGtBARCIAgsgASgCECgCCCgCWCIMRQ0CIAwoAgghAkEAIQNBASEGQQAhEUEBIQUDQCAMKAIAIANNBEAgEUUNBCAAIAAoAgAoAsgCEOUBDAQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACKAIAIggOEAAAAQECAgMECwUNCAkGBw0KCyACKwBgIAArAIACZkUNDCAAKwCQAiACKwBQZkUNDCACKwBoIAArAIgCZkUNDCAAKwCYAiACKwBYZkUNDCAEIAIrAwgiFSACKwMYIhahOQPAASACKwMgIRMgAisDECEUIAQgFSAWoDkD0AEgBCAUIBOgOQPYASAEIBQgE6E5A8gBIAAgBEHAAWpBACAGIAgbEIYEDAwLIAIrAGAgACsAgAJmRQ0LIAArAJACIAIrAFBmRQ0LIAIrAGggACsAiAJmRQ0LIAArAJgCIAIrAFhmRQ0LIAIoAgwgAigCCBCiBiEIIAIoAggiDUEASA0OIAAgCCANIAZBACACKAIAQQJGGxBIIAgQGAwLCyACKwBgIAArAIACZkUNCiAAKwCQAiACKwBQZkUNCiACKwBoIAArAIgCZkUNCiAAKwCYAiACKwBYZkUNCiAAIAIoAgwgAigCCBCiBiIIIAIoAgggBkEAIAIoAgBBBEYbEPABIAgQGAwKCyACKwBgIAArAIACZkUNCSAAKwCQAiACKwBQZkUNCSACKwBoIAArAIgCZkUNCSAAKwCYAiACKwBYZkUNCSAAIAIoAgwgAigCCBCiBiIIIAIoAggQPSAIEBgMCQsgAisAYCAAKwCAAmZFDQggACsAkAIgAisAUGZFDQggAisAaCAAKwCIAmZFDQggACsAmAIgAisAWGZFDQggBCACKwMIOQPAASAEIAIrAxA5A8gBIAIoAnAhCCAEIAQpA8gBNwMYIAQgBCkDwAE3AxAgACAEQRBqIAgQmQYMCAsgACACKAIIEEkMBgsgAisDKCETIAIoAghBAkYEQCACKAJEIgYrAxAhFCAGKAIYIQggBigCCCEGAn8gAisDECIVIBNhBEBBACACKwMwIAIrAxhhDQEaCyAVIBOhIAIrAyCjEK8CRAAAAAAAgGZAokQYLURU+yEJQKMiE5lEAAAAAAAA4EFjBEAgE6oMAQtBgICAgHgLIQ0gACAGEF0gACAIIA0gFBCOA0EDIQYMBwsgAigCNCIGKwMQIRQgBigCGCEIIBMgAisDGKEgAisDICACKwMQoRCoASETIAAgBigCCBBdIAAgCAJ/IBNEAAAAAACAZkCiRBgtRFT7IQlAoyITmUQAAAAAAADgQWMEQCATqgwBC0GAgICAeAsgFBCOA0ECIQYMBgtBo+MEQQAQKgwFCyAAIAIoAggQwwMQ5QFBsOAKIREMBAsgBUUEQEEAIQUMBAtBACEFQa2tBEEAECoMAwsgBEG7CzYCBCAEQYS5ATYCAEGI9ggoAgBB2L8EIAQQIBoQOwALIAAgAigCCBBdC0EBIQYLIANBAWohAyACQfgAaiECDAALAAsgACgCACgCtAIiAiAOIAIbKAIAQQJOBEACQCAAKAI8IgJFDQAgAigCFCICRQ0AIAAgAhEBAAsLIAoEQCAKKAIAIQIgCkEEaiEKDAULIAAoAqABQQFqIQJBACEKDAQLQcevA0GEuQFB6gpB/hwQAAALIAEoAhAoAgwiAgRAIABBBCACEJADCwJAIBBFBEACQCAHKALYAUUEQCAHLQCMAkEBcUUNAQsgABCXAgsgACgCACICIAIoAhxBAWo2AhwgACABIAkQ2wQMAQsgACgCACICIAIoAhxBAWo2AhwLAkACQAJAAkAgCUEBcQRAIAAQnAYgARAcIQIDQCACBEAgACACEMIDIAEgAhAdIQIMAQsLIAAQmwYgABCaBiABEBwhAwNAIANFDQIgASADECwhAgNAIAIEQCAAIAIQigQgASACEDAhAgwBCwsgASADEB0hAwwACwALIAlBEHEEQCAAEJoGIAEQHCEDA0AgAwRAIAEgAxAsIQIDQCACBEAgACACEIoEIAEgAhAwIQIMAQsLIAEgAxAdIQMMAQsLIAAQ3AggABCcBiABEBwhAgNAIAJFDQQgACACEMIDIAEgAhAdIQIMAAsACyAJQQhxRQ0BIAAQnAYgARAcIQUDQEEBIQIgBQRAAkADQCABKAIQIgMoArQBIAJOBEAgAkECdCACQQFqIQIgAygCuAFqKAIAIAUQqQFFDQEMAgsLIAAgBRDCAwsgASAFEB0hBQwBCwsgABCbBiAAEJoGIAEQHCEGA0AgBkUNASABIAYQLCEFA0BBASECIAUEQAJAA0AgASgCECIDKAK0ASACTgRAIAJBAnQgAkEBaiECIAMoArgBaigCACAFEKkBRQ0BDAILCyAAIAUQigQLIAEgBRAwIQUMAQsLIAEgBhAdIQYMAAsACyAAENwIDAILIAEQHCEDA0AgA0UNAiAAIAMQwgMgASADECwhAgNAIAIEQCAAIAJBUEEAIAIoAgBBA3FBAkcbaigCKBDCAyAAIAIQigQgASACEDAhAgwBCwsgASADEB0hAwwACwALIAAQmwYLIBAEQCAAIAEgCRDbBAsCQCAAKAI8IgJFDQAgAigCHCICRQ0AIAAgAhEBAAsgEgRAIAcgCzYC3AELIARBoAFqEFwgDxDsAhAYIA8QGCAAIAAoAMQBIAAoALwBaiICrSAAKADIASAAKADAAWoiA61CIIaENwLEASAAEOUIDQACQCAAKAK4ASIFBEAgACgCrAEhAgwBCyAAKAKwASEDCyAAIAAoALQBIAJqIgKtIAMgBWqtQiCGhDcCxAEMAAsACwsCQCAAKAI8IgFFDQAgASgCDCIBRQ0AIAAgAREBAAsCQCAAKAJMIgFFDQAgASgCBCIBRQ0AIAAgAREBAAsgABDrBhogABCMBCAEQeABaiQAC8sBAgF/AnwjAEHgAGsiASQAIAEgACkDCDcDWCABIAApAwA3A1AgASAAKQM4NwNIIAEgACkDMDcDQCABIAApAxg3AzggASAAKQMQNwMwIAFB0ABqIAFBQGsgAUEwahCLCiABIAApAwg3AyggASAAKQMANwMgIAEgACkDODcDGCABIAApAzA3AxAgASAAKQMoNwMIIAEgACkDIDcDACABQSBqIAFBEGogARCLCiEDIAFB4ABqJABEAAAAAAAAEEBjIANEAAAAAAAAEEBjcQvABAIDfwV8IwBBkAFrIgMkACAAKAIQKwOgASEIIAIgA0HgAGoQ3gQiBEEBa0ECTwRAIAErAAAhByABKwAQIQYgAyABKwAYIgkgASsACKBEAAAAAAAA4D+iIgo5A1ggAyAGIAegRAAAAAAAAOA/oiIHOQNQIAhEAAAAAAAA4D9kBEAgAEQAAAAAAADgPxCHAgsgCSAKoSEJIAYgB6EhB0EAIQFEAAAAAAAAAAAhBgNAAkAgASADKAJoTw0AIAMgAykDaDcDSCADIAMpA2A3A0AgAygCYCADQUBrIAEQGUEYbGoiAigCACIFRQ0AIAIrAwgiCkQAAAAAAAAAAGUEQCABQQFqIQEFIAAgBRBdIAMgAykDWDcDOCADIAMpA1A3AzAgACADQTBqIAcgCSAGRBgtRFT7IRlAIApEGC1EVPshGUCiIAagIAFBAWoiASADKAJoRhsiBhD0CCICKAIAIAIoAgRBARDwASACKAIAEBggAhAYCwwBCwsgCEQAAAAAAADgP2QEQCAAIAgQhwILQQAhAQNAIAMoAmggAU0EQCADQeAAaiIAQRgQMSAAEDQFIAMgAykDaDcDKCADIAMpA2A3AyAgA0EgaiABEBkhAAJAAkACQCADKAJwIgIOAgIAAQtBsIMEQcIAQQFBiPYIKAIAEDoaEDsACyADIAMoAmAgAEEYbGoiACkDCDcDECADIAApAxA3AxggAyAAKQMANwMIIANBCGogAhEBAAsgAUEBaiEBDAELCwsgA0GQAWokACAEC50BAQF/AkACQCACRQ0AIAAQSyAAECRrIAJJBEAgACACEN8ECyAAECQhAyAAECgEQCAAIANqIAEgAhAfGiACQYACTw0CIAAgAC0ADyACajoADyAAECRBEEkNAUGTtgNBoPwAQZcCQcTqABAAAAsgACgCACADaiABIAIQHxogACAAKAIEIAJqNgIECw8LQZLOAUGg/ABBlQJBxOoAEAAAC3sBAn8jAEEgayICJAAgACgCoAEiA0ECTgRAIAIgACgCACgCrAIgA0ECdGooAgA2AhAgAUHNxAEgAkEQahB+CyAAKALIASEDIAAoAsQBIgBBAEwgA0EATHFFBEAgAiADNgIEIAIgADYCACABQcXFASACEH4LIAJBIGokAAvsAQEBfyAAKAIQIQcgAUUgACgCmAEiAEGAgAJxRXJFBEAgByABNgLIAQsCQCAAQYCABHEiAUUNACAHIAUgBhCBATYC3AEgAkUNACACLQAARQ0AIAcgAiAGEIEBNgLYAQsgAUEQdiEBAkAgAEGAgIACcUUNAAJAIANFDQAgAy0AAEUNACAHIAMgBhCBATYC7AFBASEBIAcgBy8BjAJBAXI7AYwCDAELIAcoAsgBIgJFDQAgByACEGQ2AuwBQQEhAQsCQCAERSAAQYCAgARxRXINACAELQAARQ0AIAcgBCAGEIEBNgL8AUEBIQELIAELzgEBBX8jAEEgayIDJAAgACgCECIEKAK0ASICQQAgAkEAShtBAWohBkEBIQUCQANAIAUgBkcEQCAEKAK4ASAFQQJ0aigCACADIAEpAxg3AxggAyABKQMQNwMQIAMgASkDCDcDCCADIAEpAwA3AwAgBUEBaiEFIAMQ7QgiAkUNAQwCCwsCQCABKwMQIAQrAxBmRQ0AIAQrAyAgASsDAGZFDQAgASsDGCAEKwMYZkUNACAAIQIgBCsDKCABKwMIZg0BC0EAIQILIANBIGokACACCxUAIAAgASACEJcEIgBBCGpBACAAGws7AQF/AkAgAUEAQa6FAUEAECIiAkUEQCABQQBBn9IBQQAQIiICRQ0BCyAAIAEgAhBFIAEQgQE2AswECwtHAQF8AkAgAEQAAAAAAAAAAGEgAUQAAAAAAAAAAGFxDQAgACABEKgBIgJEAAAAAAAAAABmDQAgAkQYLURU+yEZQKAhAgsgAgsmACAEIAMgAhsiAxBXIQQgBSABIAMQSqIgAKAgASAEoiAAoBDhBAujAQEBfyAAIAE5AxggACACOQMgIABBEBAmIQcgACgCACAHQQR0aiIHIAApAxg3AwAgByAAKQMgNwMIIAAgBDkDICAAIAM5AxggAEEQECYhByAAKAIAIAdBBHRqIgcgACkDGDcDACAHIAApAyA3AwggACAGOQMgIAAgBTkDGCAAQRAQJiEHIAAoAgAgB0EEdGoiByAAKQMYNwMAIAcgACkDIDcDCAtcAQN/IwBBEGsiAyQAIAAoAAghBCAAKAIAIQUgAyAAKQIINwMIIAMgACkCADcDACAAIAUgAyAEQQFrEBlBBHRqIgArAwAgACsDCCABIAIgASACEPIIIANBEGokAAuRDQIRfAV/IwBBQGoiFiQAIAMQSiEFIAMQVyAAKwMIIQsgACsDACEMIAKjIAUgAaMQqAEhB0EBQQgQTiIZBEAgBBBKIQUgBBBXIAKjIAUgAaMQqAEiBSAHoUQYLURU+yEZQKOcRBgtRFT7IRnAoiAFoCIFRBgtRFT7IRlAoCAFIAUgB6FEGC1EVPshCUBjGyAFIAQgA6FEGC1EVPshCUBkGyAHoSEKIAIgAaMiAyADRObHBKFh1qC/RH6w58ZPPpi/IANEAAAAAAAA0D9jIgAbokTHaWccE/eCv0QHI5tQLcekPyAAG6CiRCp/a+UtcFy/RD4YwntYuZG/IAAboCADRORXYlQImnU/RC18fa1LjcY/IAAboKMhDSADIANE5alYRjTLsb9EoHiEifX8jz8gABuiRI8Ayc+hZ6a/RGk1JO6x9JG/IAAboKJEXLXG+8y0iD9EuM0zel6/aj8gABugIANETaSPVDqzkD9Ekj6toj80zb8gABugoyEOIAMgA0T6RJ4kXTPQv0S7tIb3wZ6TPyAAG6JEAfCZNi3CXj9EF6h7U0d9oL8gABugokQNnH0vz5SXP0QhK67gbZSLPyAAG6AgA0SJtfgUAOOJP0Qzc9yE1h61vyAAG6CjIQ8gAyADRByWBn5Uw8S/RB+tILws3JA/IAAbokSlSSno9uIjQEQoLPGAsskjQCAAG6CiRKnZA63AkME/RCNa4UwCirc/IAAboCADRAjEkEGTaYk/REijZVGWKX8/IAAboKMhECADIANEgczOoncq5L9EtoE7UKc8rj8gABuiRNGt1/SgoMg/RFFM3gAz37m/IAAboKJEat83GbA/hD9E9XaV/9oLpj8gABugIANEvsqQGV7/hD9E1KU1vA/2lD8gABugoyERIAMgA0Sw479AECDtv0RNLsbAOo7NPyAAG6JEraHUXkTb2D9EWWsotRfR3L8gABugokQ7oXzmUZZ2P0QDP6phvyfMPyAAG6AgA0TTbnD5eoR7P0SmR1M9mX/aPyAAG6CjIRIgAyADRJ/leXB31vm/RNr/AGvVrsE/IAAbokR+/RAbLJzmP0ROKETAIVT3vyAAG6CiRJbs2AjE68w/RKpIhbGFIPU/IAAboCADRM3Ooncq4NA/RJ1oVyHlJ/Y/IAAboKMhEyADIANEUaBP5EnSDkBE0fGHVXIEtz8gABuiRLTIdr6fOjXARJXUCWgiPDPAIAAboKJEOiLfpdQl1b9EZCMQr+t3EMAgABugIANE84I+R5ouij9EpyGq8Gd4xz8gABugoyEUIAEgAyADRPyp8dJNYlA/okTsUbgehesTQKCiROXQItv5fso/oCADRFOWIY51cXs/oKOiIRVBASEYA0AgCiAYuKMhCAJAIBdBAXEgGEH/B0tyRQRAQQEhAEEAIRogByEDQQAhFyAIRBgtRFT7Ifk/ZUUNAQNAIABBAXFFBEAgACEXDAMLIAAhFyAYIBpNDQIgAyAIIAOgIgSgRAAAAAAAAOA/oiIFRAAAAAAAABBAohBKIQYgBSAFoBBKIQkgFSAFRAAAAAAAABhAohBKIgUgDaIgBiAOoiAJIA+iIBCgoKAgBCADoaIgBSARoiAGIBKiIAkgE6IgFKCgoKAQ7QuiRPFo44i1+OQ+ZSEAIBpBAWohGiAEIQMMAAsACyAWQgA3AyggFkIANwMgIBYgCzkDOCAWQgA3AxggFiAMOQMwIBZBGGoiF0EQECYhACAWKAIYIABBBHRqIgAgFikDMDcDACAAIBYpAzg3AwggBxBXIQYgFyAMIAEgBxBKIg2ioCIDIAsgAiAGoqAiBBDzCCAIRAAAAAAAAOA/ohDUCyEFIAgQVyAFIAVEAAAAAAAACECiokQAAAAAAAAQQKCfRAAAAAAAAPC/oKJEAAAAAAAACECjIgmaIQogAiANoiEFIAEgBpqiIQZBACEAA0AgACAYRkUEQCAWQRhqIAkgBqIgA6AgCSAFoiAEoCAKIAEgCCAHoCIHEFciBJqiIgaiIAwgASAHEEoiBaKgIgOgIAogAiAFoiIFoiALIAIgBKKgIgSgIAMgBBDyCCAAQQFqIQAMAQsLIBYgFikDIDcDECAWIBYpAxg3AwggFkEYaiIXIBYoAhggFkEIakEAEBlBBHRqIgArAwAgACsDCBDzCCAXIBkgGUEEakEQEMcBIBZBQGskACAZDwsgGEEBdCEYDAALAAsgFkEINgIAQYj2CCgCAEH16QMgFhAgGhAvAAtSAQR/IAAEQCAAIQIDQCABIANGBEAgABAYBSACKAIAEBgCQCACKAIIIgRFDQAgAigCDCIFRQ0AIAQgBREBAAsgA0EBaiEDIAJBOGohAgwBCwsLC84FAQ9/IwBB0ABrIgMkAEH/0QEhBEHMzgEhCkHc2AEhC0Ho2gEhDkG90QEhD0GP2QEhCEHx/wQhDEHx/wQhCUEBIQUCQAJAAkACQAJAIAEQkgIOAwABAgQLIAEQISEIIAEoAhAoAgwiAUUNAiABKAIAIQQMAgsgARAtECEhCCABECEhDyABKAIQKAJ4IgFFDQEgASgCACEEDAELIAEgAUEwaiIFIAEoAgBBA3FBA0YbKAIoEC0QORAhIQggASAFIAEoAgBBA3FBA0YbKAIoECEhCiABKAIQKAI0IgwEQCAMLQAAQQBHIQYLIAFBUEEAIAEoAgBBA3FBAkcbaigCKBAhIQsgASgCECIEKAJcIgkEQCAJLQAAQQBHIQcLIAQoAmAiBAR/IAQoAgAFQf/RAQshBEHK4AFBtqADIAEgBSABKAIAQQNxQQNGGygCKBAtEDkQggIbIQ5BACEFDAELCyADQgA3A0ggA0IANwNAA0AgAEEBaiEBAkACQCAALQAAIhBB3ABHBEAgEEUNAQwCCyABLAAAIhFB/wFxIg1FDQEgAEECaiEAAkACQAJAAkACQAJAAkACQCANQcUAaw4KAwcBBQcHBwYHAgALIA1B1ABGDQMgAkUgDUHcAEdyDQYgA0FAa0HcABCSAwwJCyADQUBrIAgQxwMMCAsgA0FAayAPEMcDDAcLIAUNBiADQUBrIgEgChDHAyAGBEAgAyAMNgIwIAFBnjMgA0EwahDiBAsgAyALNgIkIAMgDjYCICADQUBrIgFBuDIgA0EgahDiBCAHRQ0GIAMgCTYCECABQZ4zIANBEGoQ4gQMBgsgA0FAayAKEMcDDAULIANBQGsgCxDHAwwECyADQUBrIAQQxwMMAwsgAyARNgIAIANBQGtBnr8BIAMQ4gQMAgsgA0FAaxDjBCADQdAAaiQADwsgA0FAayAQwBCSAyABIQAMAAsAC9gCAQV/IwBBEGsiAiQAIAFCADcDGCABQgA3AyAgASgCACIELQAAIgMEQCACQgA3AwggAkIANwMAA0ACQCADRQ0AAn8CQCADQd8AakH/AXFB3QBNBEAgASgCDEECRg0BCyAEQQFqIQUCQCADQQpGBEAgACABIAIQ4wRB7gAQqQYMAQsgA0HcAEYEQAJAIAUtAAAiBkHsAGsiA0EGS0EBIAN0QcUAcUVyRQRAIAAgASACEOMEIAUsAAAQqQYMAQsgAiAGwBCSAwsgBEECaiAFIAQtAAEbDAMLIAIgA8AQkgMLIAUMAQsgAiADwBCSAyACIAQsAAEiAxCSAyADRQ0BIARBAmoLIgQtAAAhAwwBCwsgAhAkBEAgACABIAIQ4wRB7gAQqQYLIAItAA9B/wFGBEAgAigCABAYCyABIAFBGGoiACkDADcDKCABIAApAwg3AzALIAJBEGokAAuPCAIJfwp8IwBB8ABrIgMkACADQgA3AzAgA0IANwMoIANCADcDICADQgA3AxggASgCBCEERAAAAAAAAPC/IQ0DQAJAIAQgB0YNACABKAIAIAdBBXRqIgYoAgRBAUsNAAJAAkAgBigCACgCBCIGBEAgBi0AGEH/AHENAyAGKwMQIgxEAAAAAAAAAABkRQRAIAIrAyAhDAsgAyAMOQMoIAYoAgAiBkUNAQwCCyADIAIrAyAiDDkDKAsgAigCECEGCyADIAY2AhgCQCAHRQRAIAwhDQwBCyAMIA1iDQELAkAgBUUEQCAGIQUMAQsgBiAFEE0NAQsgB0EBaiEHDAELCyABIAQgB00iCjoACEEAIQZEAAAAAAAAAAAhDQNAIAQgBk1FBEAgASgCACEFQQAhB0QAAAAAAAAAACEMIAZBBXQhCEQAAAAAAAAAACEQRAAAAAAAAAAAIQ9EAAAAAAAAAAAhE0QAAAAAAAAAACENAkACQANAIAUgCGoiBCgCBCAHTQRAAkAgBCAQOQMQIApFDQMgBg0AIAUgDyAToDkDGCANIQwMBAsFIAMgB0E4bCIJIAQoAgBqKAIAIAIoAjAQgQE2AjgCQCABKAIAIAhqIgQoAgAgCWooAgQiBQRAIAMgBSgCGEH/AHEiBQR/IAUFIAIoAihB/wBxCyADKAIwQYB/cXI2AjAgAyAEKAIAIAlqKAIEIgQrAxAiDkQAAAAAAAAAAGQEfCAOBSACKwMgCzkDKCADIAQoAgAiBQR/IAUFIAIoAhALNgIYIAQoAgQiBQRAIAMgBTYCHAwCCyADIAIoAhQ2AhwMAQsgAyACKwMgOQMoIAMgAigCEDYCGCADIAIoAhQ2AhwgAyADKAIwQYB/cSACKAIoQf8AcXI2AjALIAMgACgCiAEiBSADQRhqQQEgBSgCABEDADYCPCADQQhqIAAgA0E4ahDgBiADKwMQIQ4gAysDCCEVIAEoAgAgCGooAgAgCWooAgAQGCADKAI4IQsgASgCACIFIAhqKAIAIAlqIgQgFTkDICAEIAs2AgAgBCADKwNIOQMQIAQgAysDUDkDGCAEIAMoAjw2AgQgBCADKAJANgIIIAQgAygCRDYCDCAOIA0gDSAOYxshDSADKwNIIg4gEyAOIBNkGyETIAMrA1AiDiAPIA4gD2QbIQ8gAysDKCIOIAwgDCAOYxshDCAHQQFqIQcgECAVoCEQDAELCyAEIA05AxggDSEMDAELIAZFBEAgBSAMIA+hOQMYDAELIAQgESAMoCAUoSAPoTkDGAsgECASIBAgEmQbIRIgBkEBaiEGIBEgDKAhESAUIAQrAxigIRQgASgCBCEEDAELCyABIBI5AyAgASANIBEgBEEBRhs5AyggA0HwAGokAAvqDwIIfwd8IwBBQGoiBCQAIAAoAlQhCQJAIAAoAlAiA0UNACADKAIYIgNFDQAgACgCGA0AIAAgAxBkNgIYCyAALwEkIQMgASsDACEOIAErAxAhDSAAKwNAIQsgASsDGCIPIAErAwgiEKEgACsDSCIRoUQAAAAAAAAAABAjIQwgDSAOoSALoUQAAAAAAAAAABAjIQsCQCADQQFxRQ0AIAtEAAAAAAAAAABkBEACQAJAAkACQCADQQZxQQJrDgMBAgACCyABIA4gEaA5AxAMAgsgASAOIAugIg45AwAgASANIAugOQMQDAELIAEgDSALRAAAAAAAAOA/oiILoTkDECABIA4gC6AiDjkDAAtEAAAAAAAAAAAhCwsgDEQAAAAAAAAAAGRFDQAgAQJ8AkAgA0EYcSIDQQhHBEAgA0EQRw0BIBEgEKAMAgsgASAQIAygIgw5AwggESAMoAwBCyABIBAgDEQAAAAAAADgP6IiDKA5AwggDyAMoQsiDzkDGEQAAAAAAAAAACEMCwJ/IAsgCyAAKAJ8IgO4IgujIg0gC6KhIgtEAAAAAAAA4D9EAAAAAAAA4L8gC0QAAAAAAAAAAGYboCILmUQAAAAAAADgQWMEQCALqgwBC0GAgICAeAshBSADQQFqIQYgDiAALQAhuCIQoCAALAAgtyIOoCELIAAoAnQhB0EAIQMDQCADIAZGBEACfyAMIAwgACgCeCIDuCIMoyINIAyioSIMRAAAAAAAAOA/RAAAAAAAAOC/IAxEAAAAAAAAAABmG6AiDJlEAAAAAAAA4EFjBEAgDKoMAQtBgICAgHgLIQUgA0EBaiEGIA8gEKEgDqEhCyAAKAJwIQdBACEDA0AgAyAGRgRAA0AgCSgCACIDBEAgAy8BViEGIAMvAVQhBwJ/IAJFBEAgAy8BUiEFIAMvAVAhCEEADAELIAAoAnggAy8BUiIFIAZqRiAHRUEDdCIIIAhBBHIgBhsiCEECciAIIAAoAnwgAy8BUCIIIAdqRhtyCyEKIAAoAnAgBkEDdGoiBiAFQQN0aisDACAALAAgtyEPIAAoAnQgB0EDdGoiBSAIQQN0aisDACENIAYrAwAhDiAFKwMAIQwCQCADKAIYDQAgAygCYCgCGCIFRQ0AIAMgBRBkNgIYCyAPoCELIA0gD6EhDyACIApxIQcCQCADLwEkIgZBAXFFDQACQCAPIAyhIAMrA0AiEKEiDUQAAAAAAAAAAGRFDQACQAJAAkAgBkEGcUECaw4DAQIAAgsgDCAQoCEPDAILIAwgDaAhDCAPIA2gIQ8MAQsgDyANRAAAAAAAAOA/oiINoSEPIAwgDaAhDAsgDiALoSADKwNIIhChIg1EAAAAAAAAAABkRQ0AAkAgBkEYcSIFQQhHBEAgBUEQRw0BIAsgEKAhDgwCCyALIA2gIQsgDiANoCEODAELIA4gDUQAAAAAAADgP6IiDaEhDiALIA2gIQsLIAlBBGohCSADIA45A0ggAyAPOQNAIAMgCzkDOCADIAw5AzAgAyAHOgAjIAQgDiADLQAhuCINoSADLQAiuCIQoSIOOQM4IAQgDyANoSAQoSIPOQMwIAQgCyANoCAQoCILOQMoIAQgDCANoCAQoCIMOQMgIAMoAlghBQJAAkACQCADKAJcQQFrDgMAAgECCyAEIAQpAzg3AxggBCAEKQMwNwMQIAQgBCkDKDcDCCAEIAQpAyA3AwAgBSAEIAcQ+QgMAwsCQCAPIAyhIAUrAxChIg1EAAAAAAAAAABkRQ0AAkACQCAGQQZxQQJrDgMBAgACCyAEIA8gDaE5AzAMAQsgBCAMIA2gOQMgCwJAIA4gC6EgBSsDGKEiDEQAAAAAAAAAAGRFDQAgBkEYcSIDQQhHBEAgA0EQRw0BIAQgDiAMoTkDOAwBCyAEIAsgDKA5AygLIAUgBCkDIDcDACAFIAQpAzg3AxggBSAEKQMwNwMQIAUgBCkDKDcDCAwCCyAFKwMoIRACQCAPIAyhIAUrAyChIg1EAAAAAAAAAABkRQ0AAkACQAJAAkAgBkEGcUEBaw4GAgECAAIEAwsgBCAPIA2hOQMwDAMLIAQgDCANoDkDIAwCCwALIAQgDyANRAAAAAAAAOA/oiIPoTkDMCAEIAwgD6A5AyALAkAgDiALoSAQoSIMRAAAAAAAAAAAZEUNAAJAIAZBGHEiBkEIRwRAIAZBEEcNASAEIA4gDKE5AzgMAgsgBCALIAygOQMoDAELIAQgDiAMRAAAAAAAAOA/oiIOoTkDOCAEIAsgDqA5AygLIAUgBCkDIDcDECAFIAQpAzg3AyggBSAEKQMwNwMgIAUgBCkDKDcDGEHsAEHyAEHuACADLwEkQYAGcSIFQYACRhsgBUGABEYbIQUgAygCWCIGKAIEIQdBACEDA0AgAyAHRg0CIAYoAgAgA0EFdGoiCC0ACEUEQCAIIAU6AAgLIANBAWohAwwACwALCyAAIAI6ACMgACABKQMANwMwIAAgASkDCDcDOCAAQUBrIAEpAxA3AwAgACABKQMYNwNIIARBQGskAAUgByADQQN0aiIIKwMAIQwgCCALOQMAIAsgDSAMoCADIAVIIANBAE5xuKAgDqChIQsgA0EBaiEDDAELCwUgByADQQN0aiIIKwMAIREgCCALOQMAIAsgDSARoCADIAVIIANBAE5xuKAgDqCgIQsgA0EBaiEDDAELCwu6FwMPfwR8AX4jAEHwAGsiBiQAIAEoAoABIgQEQCADIARB2N8KEIIJCyABIAI2AlAgBiABKQJkNwNgIAYgASkCXDcDWCAGIAEpAlQ3A1AQyQMhECAGQYCABDYCTCAGQYDAAEEBEBo2AkhBACEEA0AgBigCWCICIAVB//8DcSIITQRAIAEgBEEBakEEEBoiETYCVANAIApB//8DcSIIIAJPBEAgASALNgJ8IAEgDDYCeEEAIQUDQCACIAVNRQRAIAZBQGsgBikDWDcDACAGIAYpA1A3AzggBkE4aiAFEBkhAAJAAkACQCAGKAJgIgIOAgIAAQsgBigCUCAAQQJ0aigCABAYDAELIAYoAlAgAEECdGooAgAgAhEBAAsgBUEBaiEFIAYoAlghAgwBCwsgBkHQAGoiAEEEEDEgABA0IAYoAkxBIU8EQCAGKAJIEBgLIBAQ3QIgAS8BJCIAQYABcUUEQCABQQI6ACALIABBIHFFBEAgAUEBOgAhCyABKAJ0RQRAIAEgASgCfEEBakEIEBoiCDYCdCABKAJUIgQhAgNAIAIoAgAiAEUEQCAEIQUDQCAFKAIAIgIEQAJAIAIvAVAiAEEBRg0AIAEoAnwgAi8BVCIHIABqTwRAIAIrA0AhEyAIIAdBA3RqIQdEAAAAAAAAAAAhFEEAIQIDQCAAIAJGBEAgFCABLAAgIABBAWtstyIVoCATY0UNAyATIBWhIBShIAC4oyETQQAhAgNAIAAgAkYNBCAHIAJBA3RqIgkgEyAJKwMAoDkDACACQQFqIQIMAAsABSAUIAcgAkEDdGorAwCgIRQgAkEBaiECDAELAAsAC0GzvwNB1L0BQYkKQc0tEAAACyAFQQRqIQUMAQUCQANAIAQoAgAiAARAIAEoAnwgAC8BUCIFIAAvAVQiAmpJDQIgCCACQQN0aiEHQQAhAkQAAAAAAAAAACEUA0AgAiAFRgRAIAAgACsDQCAUIAEsACAgBUEBa2y3oBAjOQNAIARBBGohBAwDBSAUIAcgAkEDdGorAwCgIRQgAkEBaiECDAELAAsACwsgASgCcEUEQCABIAEoAnhBAWpBCBAaIgg2AnAgASgCVCIEIQIDQCACKAIAIgBFBEAgBCEFA0AgBSgCACICBEACQCACLwFSIgBBAUYNACABKAJ4IAIvAVYiByAAak8EQCACKwNIIRMgCCAHQQN0aiEHRAAAAAAAAAAAIRRBACECA0AgACACRgRAIBQgASwAICAAQQFrbLciFaAgE2NFDQMgEyAVoSAUoSAAuKMhE0EAIQIDQCAAIAJGDQQgByACQQN0aiIJIBMgCSsDAKA5AwAgAkEBaiECDAALAAUgFCAHIAJBA3RqKwMAoCEUIAJBAWohAgwBCwALAAtB/b0DQdS9AUHHCkH3JxAAAAsgBUEEaiEFDAEFAkADQCAEKAIAIgAEQCABKAJ4IAAvAVIiBSAALwFWIgJqSQ0CIAggAkEDdGohB0EAIQJEAAAAAAAAAAAhFANAIAIgBUYEQCAAIAArA0ggFCABLAAgIAVBAWtst6AQIzkDSCAEQQRqIQQMAwUgFCAHIAJBA3RqKwMAoCEUIAJBAWohAgwBCwALAAsLIAEoAnwiALhEAAAAAAAA8D+gIAEsACC3IhOiIAEtACFBAXS4IhWgIRQgASgCeCIEuEQAAAAAAADwP6AhFkEAIQIDQCAAIAJGBEAgFiAToiAVoCETQQAhAgNAIAIgBEYEQAJAIAEtACRBAXFFDQBBp+MDIQICQCABLwEmIgBFDQAgAS8BKCIERQ0AIBQgALhkRAAAAAAAAAAAIRRB/+EDIQIEQEQAAAAAAAAAACETDAELIBMgBLhkRAAAAAAAAAAAIRNFDQELIAJBABAqQQEhDQsgASAUIAEvASa4ECM5A0AgASATIAEvASi4ECM5A0ggASgCgAEEQCADQdjfChD/CAsgBkHwAGokACANDwUgEyAIIAJBA3RqKwMAoCETIAJBAWohAgwBCwALAAUgFCABKAJ0IAJBA3RqKwMAoCEUIAJBAWohAgwBCwALAAtBor0DQdS9AUHbCkH3JxAAAAsACwALAkAgAC8BUkEBTQRAIAAvAVYiBSABKAJ4Tw0BIAggBUEDdGoiBSAFKwMAIAArA0gQIzkDAAsgAkEEaiECDAELC0HLtgNB1L0BQboKQfcnEAAAC0GIwQNB1L0BQbIKQfcnEAAAC0HWvgNB1L0BQaAKQc0tEAAACwALAAsCQCAALwFQQQFNBEAgAC8BVCIFIAEoAnxPDQEgCCAFQQN0aiIFIAUrAwAgACsDQBAjOQMACyACQQRqIQIMAQsLQf62A0HUvQFB+AlBzS0QAAALQcHBA0HUvQFB6wlBzS0QAAALIAYgBikDWDcDMCAGIAYpA1A3AyggCLghFSAGKAJQIAZBKGogCBAZQQJ0aigCACEOQQAhAkEAIQ8DQCAOKAAIIA9NBEAgCkEBaiEKIAYoAlghAgwCCyAOKAIAIQQgBiAOKQIINwMgIAYgDikCADcDGCARIAQgBkEYaiAPEBlBAnRqKAIAIgc2AgAgByABNgJgIAcvASQiBEHAAHFFBEBBAiEFIAcgAS0AJEHAAHEEfyABLQAiBUECCzoAIgsgBEEgcUUEQAJAIAEsAGwiBEEATg0AQQEhBCABLQAkQSBxRQ0AIAEtACEhBAsgByAEOgAhCwJ/AkACQAJAIAcoAlxBAWsOAwACAQILQcAAIQUgACAHKAJYIAcgAxD6CCEJQcgADAILIAZB6ABqIAMoAjQgBygCWCIEKAIgEMwGAnwgBigCaCIFIAYoAmwiCXFBf0YEQCAGIAQoAiA2AhBB3vkEIAZBEGoQN0EBIQlEAAAAAAAAAAAhE0QAAAAAAAAAAAwBCyADKAI0KAIQQQE6AHIgCbchE0EAIQkgBbcLIRQgBEIANwMAIAQgEzkDGCAEIBQ5AxAgBEIANwMIQRAhBUEYDAELIAAoAhAoApABIAcoAlggAxD4CEEAIQlBICEFQSgLIAcoAlgiBGorAwAgBy0AISAHLQAiakEBdLgiE6AhFCAEIAVqKwMAIBOgIRMCQCAHLQAkQQFxBEBB9eIDIQQCQCAHLwEmIgVFDQAgBy8BKCISRQ0AAkAgEyAFuGQNAEQAAAAAAAAAACETIBQgErhkDQBEAAAAAAAAAAAhFAwDC0He4QMhBEQAAAAAAAAAACEURAAAAAAAAAAAIRMgBygCXEEDRg0CCyAEQQAQKkEBIQkLCyARQQRqIREgByATIAcvASa4IhYgEyAWZBs5A0AgByAUIAcvASi4IhMgEyAUYxs5A0ggAkH//wNxIQUgBy8BUEEBayEEA0AgBCAFaiECAkADQCACIAVIBEAgBSEEDAILIBAgArcgFRCrBkUEQCACQQFrIQIMAQsLIAJBAWohBQwBCwsDQAJAIAUgBy8BUGoiAiAESgRAIAS3IRMgCCECA0AgAiAHLwFSIAhqTw0CIBAgEyACuBC+AiACQQFqIQIMAAsACwJAIAVBgIAESQRAIAcgBTsBVCAHIAo7AVYgBy8BUiAGIAYpA0giFzcDaCAIaiIEIBdCIIinTw0BIAJB//8DcSIFIAtLIRIgBEEDdiAGQegAaiAXpyAXQoCAgICQBFQbai0AACAEQQdxdkEBcQRAIAcgBy0AZEECcjoAZAsgCSANciENIAUgCyASGyELIAQgDCAEIAxLGyEMIA9BAWohDwwEC0GjzgFB1L0BQZwJQaLtABAAAAtBybIDQe/6AEHCAEHpIhAAAAsgBEEBaiEEDAALAAsACwALIAYgBikDWDcDCCAGIAYpA1A3AwAgBigCUCAGIAgQGUECdGooAgAiAigACCEHAkAgAi0AGEEBRgRAIAhBAWoiAiAGKAJMIghPDQEgAkEDdiAGQcgAaiAGKAJIIAhBIUkbaiIIIAgtAABBASACQQdxdHI6AAALIAQgB2ohBCAFQQFqIQUMAQsLQZeyA0Hv+gBB0QBB3yEQAAALMwEBfwJAIABB4DYQJyIBBEAgAS0AAA0BCyAAQfU2ECciAQRAIAEtAAANAQtBACEBCyABC1gBAn8gBQRAIAAgASADIAIRBQALIAAQeSEGA0AgBgRAIAYgASAEEQAAIgcEQCAGIAcgAiADIAQgBRD8CAsgBhB4IQYMAQsLIAVFBEAgACABIAMgAhEFAAsLcwECfwJAIAAoAgQiAgRAIAIgARAuRQ0BCyAAKAJUIQMDQCADKAIAIgJFBEBBAA8LAkAgAigCBCIARQ0AIAAgARAuDQAgAg8LQQAhACADQQRqIQMgAigCXEEBRgRAIAIoAlggARD9CCEACyAARQ0ACwsgAAuTAQEHfwJAIABFDQAgACgCACEEA0AgACgCBCABTQRAIAQQGCAAEBgMAgsgBCABQQV0aiIGKAIAIQVBACECA0AgBigCBCACTQRAIAUQGCABQQFqIQEMAgUgBSACQThsaiIDKAIAEBgCQCADKAIIIgdFDQAgAygCDCIDRQ0AIAcgAxEBAAsgAkEBaiECDAELAAsACwALC0MCAX8BfCABKAIAIgIEQCAAIAI2AhALIAEoAgQiAgRAIAAgAjYCFAsgASsDECIDRAAAAAAAAAAAZgRAIAAgAzkDIAsL4AgCBH8EfCMAQaABayIDJAAgACABKAIYIgRBhfUAIAQbEEkCQCABLQAqIgRBGHEiBQRAIANBADYCLCADQfitAUHapwEgBEEQcRtBACAFGzYCKCAAIANBKGoQ5QEMAQsgACAAKAIAKALIAhDlAQsgACABLQAhuBCHAgJAIAEtACpBAnEEQCABLQAhIQEgAyACKQMANwMwIAMgAikDCDcDOCADIAIpAxg3A1ggAyACKQMQNwNQIAMrAzAhCCADKwNQIQkCQCABQQFNBEAgAysDWCEHIAMrAzghCgwBCyADIAG4RAAAAAAAAOA/oiIHIAigIgg5AzAgAyAHIAMrAzigIgo5AzggAyAJIAehIgk5A1AgAyADKwNYIAehIgc5A1gLIAMgBzkDaCADIAg5A2AgAyAKOQNIIAMgCTkDQCADQQQ2AiQgA0EENgIgIAAgA0EwakEEIANBIGpBABCWAwwBCyABLwEkQYD4AHEiBgRAIAEtACEhASADIAIpAwg3A0ggAyACKQMANwNAIAMgAikDGDcDaCADIAIpAxA3A2AgAysDQCEIIAMrA2AhCQJAIAFBAU0EQCADKwNoIQcgAysDSCEKDAELIAMgAbhEAAAAAAAA4D+iIgcgCKAiCDkDQCADIAcgAysDSKAiCjkDSCADIAkgB6EiCTkDYCADIAMrA2ggB6EiBzkDaAsgA0HgAGohBSADQUBrIQEgAyAHOQN4IAMgCDkDcCADIAo5A1ggAyAJOQNQIANB8ABqIQIgA0HQAGohBAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBkGACGtBCnYODgMCBgENBQkABwwKBAsIDwsgACABQQIQPQwOCyAAIARBAhA9DA0LIAAgBUECED0MDAsgAyACKQMANwMwIAMgAikDCDcDOCAAIANBMGpBAhA9DAsLIAAgAUEDED0MCgsgACAEQQMQPQwJCyADIAEpAwg3A4gBIAMgASkDADcDgAEgACAFQQMQPQwICyADIAIpAwA3AzAgAyACKQMINwM4IAAgA0EwakEDED0MBwsgACABQQQQPQwGCyADIAEpAwg3A4gBIAMgASkDADcDgAEgACAEQQQQPQwFCyADIAEpAwg3A4gBIAMgASkDADcDgAEgAyAEKQMINwOYASADIAQpAwA3A5ABIAAgBUEEED0MBAsgAyACKQMANwMwIAMgAikDCDcDOCAAIANBMGpBBBA9DAMLIAAgAUECED0gACAFQQIQPQwCCyADIAIpAwA3AzAgAyACKQMINwM4IAAgA0EwakECED0gACAEQQIQPQwBCyABLQAhIgFBAk8EQCACIAG4RAAAAAAAAOA/oiIIIAIrAwCgOQMAIAIgCCACKwMIoDkDCCACIAIrAxAgCKE5AxAgAiACKwMYIAihOQMYCyADIAIpAxg3AxggAyACKQMQNwMQIAMgAikDCDcDCCADIAIpAwA3AwAgACADQQAQiAILIANBoAFqJAALZwEBfyMAQRBrIgUkAAJ/IAEgBCAFQQhqEIsEBEAgACAEKAIAEF0gACAEKAIEIgFBhfUAIAEbIAIgBSsDCBCOA0EDQQIgAy0AAEEBcRsMAQsgACABEF1BAQsgAEG7HxBJIAVBEGokAAusAQIBfwF8AkAgACgCECIDRQ0AIAEoAgAEQCACIAM2AgAgACABKAIANgIQDAELIAJBADYCAAsCQCAAKAIUIgNFDQAgASgCBARAIAIgAzYCBCAAIAEoAgQ2AhQMAQsgAkEANgIECyAAKwMgIgREAAAAAAAAAABmBEAgASsDEEQAAAAAAAAAAGYEQCACIAQ5AxAgACABKwMQOQMgDwsgAkKAgICAgICA+L9/NwMQCwuwBQIMfwd8IwBBgAFrIgMkACABKAIEIgwEQCACKwAgIRQgAigAFCEHIAIoABAhCiABLQAIIQ0gASgCACEOIAIrAwAhECABKwMQIRUgASsDICERIAIrAwghEiABKwMYIRMgASsDKCEPIANCADcDGCADIBIgDyAToEQAAAAAAADgP6KgIA8gE6FEAAAAAAAA4D+ioDkDICAAQQEQ2wggESAVoUQAAAAAAADgP6IiEiAQIBEgFaBEAAAAAAAA4D+ioCIRoCETIBEgEqEhEgNAIAUgDEcEQAJ8IBIgDiAFQQV0aiIELQAIIgFB7ABGDQAaIAFB8gBGBEAgEyAEKwMQoQwBCyARIAQrAxBEAAAAAAAA4L+ioAshECADIAMrAyAgBCsDGKE5AyAgBCgCACEBQQAhCANAIAQoAgQgCE0EQCAFQQFqIQUMAwUgAwJ/AkAgASgCBCIGRQRAIAMgBzYCLCADIAo2AiggAyAUOQM4IAMoAkAhCSAHIQsMAQsgAyAGKwMQIg8gFCAPRAAAAAAAAAAAZBs5AzggAyAGKAIAIgIgCiACGzYCKCADIAYoAgQiAiAHIAIbIgs2AiwgAygCQCEJIAYoAhhB/wBxIgJFDQAgCUGAf3EgAnIMAQsgCUGAf3ELNgJAIAAgCxBJIAMgASgCADYCSCADIANBKGo2AkwgAyABKwMQOQNYIAMgDQR8IAErAxgFRAAAAAAAAPA/CzkDYCADIAEoAgQoAgg2AjAgAyABKAIINgJQIAMgASsDIDkDaCAEKwMYIQ8gAyADKQMgNwMQIANB7AA6AHggAyAPOQNwIAMgEDkDGCADIAMpAxg3AwggACADQQhqIANByABqEJkGIAhBAWohCCAQIAErAyCgIRAgAUE4aiEBDAELAAsACwsgABDaCAsgA0GAAWokAAubFgIKfwh8IwBBwAVrIgMkACADIAEpA0g3A+ADIAMgAUFAaykDADcD2AMgAyABKQM4NwPQAyADIAEpAzA3A8gDQQEhCgJAIAEoAgANACABKAIIDQAgASgCDEEARyEKCyACKwMAIQ0gAisDCCEOIAEoAlQhBiABKAKAASIEBEAgAiAEQbDfChCCCQsgAyANIAMrA8gDoDkDyAMgAyANIAMrA9gDoDkD2AMgAyAOIAMrA9ADoDkD0AMgAyAOIAMrA+ADoDkD4ANBASELAkAgCkUNACAALQCYAUEEcQ0AIAMgAykD4AM3A9ACIAMgAykD2AM3A8gCIAMgAykD0AM3A8ACIAMgAykDyAM3A7gCIAAgAiABIANBuAJqIANBpANqEOYERSELCwJAAkACQCABLQAqQQRxDQAgASgCFCIEBEAgA0IANwOABSABKAIcIQggAyABLQAqOgC3AiAAIAQgCCADQbcCaiADQYAFahCBCSEEAkAgAS0AKkECcQRAIAEtACEhCCADIAMpA+ADNwOIAyADIAMpA8gDNwPgAiADIAMpA9gDNwOAAyADIAMpA9ADNwPoAiADKwPgAiEOIAMrA4ADIQ0CQCAIQQFNBEAgAysDiAMhDyADKwPoAiEQDAELIAMgCLhEAAAAAAAA4D+iIg8gDqAiDjkD4AIgAyAPIAMrA+gCoCIQOQPoAiADIA0gD6EiDTkDgAMgAyADKwOIAyAPoSIPOQOIAwsgAyAPOQOYAyADIA45A5ADIAMgEDkD+AIgAyANOQPwAiADQQQ2AtwCIANBBDYCsAIgACADQeACakEEIANBsAJqIAQQlgMMAQsgAyADKQPgAzcDqAIgAyADKQPYAzcDoAIgAyADKQPQAzcDmAIgAyADKQPIAzcDkAIgACADQZACaiAEEIgCCyADKAKABRAYIAMoAoQFEBgLA0AgBigCACIEBEAgAyAEKQNINwPQBCADIARBQGspAwA3A8gEIAMgBCkDODcDwAQgAyAEKQMwNwO4BEEBIQkCf0EBIAQoAgANABpBASAEKAIIDQAaIAQoAgxBAEcLIQggAisDCCENIAMgAisDACIOIAMrA7gEoDkDuAQgAyAOIAMrA8gEoDkDyAQgAyANIAMrA8AEoDkDwAQgAyANIAMrA9AEoDkD0AQCQCAIRQ0AIAAtAJgBQQRxDQAgAyADKQPQBDcDiAIgAyADKQPIBDcDgAIgAyADKQPABDcD+AEgAyADKQO4BDcD8AEgACACIAQgA0HwAWogA0HcBGoQ5gRFIQkLAkAgBC0AKkEEcQ0AIAQoAhQiBQRAIAQoAhwhByADIAQtACo6AO8BIAAgBSAHIANB7wFqIANBgAVqEIEJIQUCQCAELQAqQQJxBEAgBC0AISEHIAMgAykDuAQ3A/ADIAMgAykDwAQ3A/gDIAMgAykD0AQ3A5gEIAMgAykDyAQ3A5AEIAMrA/ADIQ4gAysDkAQhDQJAIAdBAU0EQCADKwOYBCEPIAMrA/gDIRAMAQsgAyAHuEQAAAAAAADgP6IiDyAOoCIOOQPwAyADIA8gAysD+AOgIhA5A/gDIAMgDSAPoSINOQOQBCADIAMrA5gEIA+hIg85A5gECyADIA85A6gEIAMgDjkDoAQgAyAQOQOIBCADIA05A4AEIANBBDYC7AMgA0EENgLoASAAIANB8ANqQQQgA0HoAWogBRCWAwwBCyADIAMpA9AENwPgASADIAMpA8gENwPYASADIAMpA8AENwPQASADIAMpA7gENwPIASAAIANByAFqIAUQiAILIAMoAoAFEBgLIAQtACEEQCADIAMpA9AENwPAASADIAMpA8gENwO4ASADIAMpA8AENwOwASADIAMpA7gENwOoASAAIAQgA0GoAWoQgAkLIAQoAlghBQJAAkACQCAEKAJcQQFrDgMAAgECCyAAIAUgAhCECQwCCyAFKwMQIQ4gBSsDGCEPIAIrAwAhDSAFKwMAIRAgAyAFKwMIIAIrAwgiEqAiETkDqAUgAyAQIA2gIhA5A6AFIAMgDyASoCIPOQOIBSADIA4gDaAiDTkDgAUgAyAROQO4BSADIA05A7AFIAMgDzkDmAUgAyAQOQOQBSAFKAIkIgdFBEAgAigCOCEHCyAFKAIgIgVFDQUgBS0AAEUNBiAAIAUgA0GABWpBBEEBIAdBgLQBENgIDAELIAAgBSACEIMJCyAJRQRAIAAgA0HcBGoQ5QQLAkAgCEUNACAALQCYAUEEcUUNACADIAMpA9AENwOgASADIAMpA8gENwOYASADIAMpA8AENwOQASADIAMpA7gENwOIASAAIAIgBCADQYgBaiADQdwEaiIHEOYERQ0AIAAgBxDlBAsgBkEEaiEGDAELCyABKAJUIQggAEQAAAAAAADwPxCHAgNAIAgoAgAiBARAIAhBBGohCCAELQBkIgZBAnEgBkEBcXJFDQEgCCgCACEJIAIrAwAhECACKwMIIQ0gACABKAIYIgZBhfUAIAYbIgYQXSAAIAYQSSANIAQrAzigIQ8gECAEKwNAoCESIAQrAzAhEwJAIAQtAGQiBkEBcUUNACAEKAJgIgUoAnwgBC8BUCAELwFUak0NACANIAQrA0igIRQCQCAELwFWIgZFBEAgDyAFLAAgIgZBAm3AIge3Ig6hIQ0gByAFLQAharchEQwBCyAFKAJ4IAQvAVIgBmpGBEAgDyAFLAAgIgZBAm3AIge3Ig6hIAcgBS0AIWq3IhGhIQ0MAQsgDyAFLAAgIgZBAm3AtyIOoSENRAAAAAAAAAAAIRELIAMgDTkDiAUgAyASIA6gIg45A5AFIAMgDSAUIBGgIA+hIAa3oKA5A5gFIAMgAykDiAU3A3AgAyADKQOQBTcDeCADIAMpA5gFNwOAASADIA45A4AFIAMgAykDgAU3A2ggACADQegAakEBEIgCIAQtAGQhBgsgBkECcUUNASAEKAJgIgYoAnggBC8BViIHIAQvAVJqTQ0BIBAgE6AhEQJAIAQvAVQiBUUEQCARIAYsACAiBUECbcAiDCAGLQAharciDaEgDLciDqEhEyAGKAJ8IAQvAVBGBEAgDSANoCENDAILIAlFDQEgCS8BViAHRg0BIBAgBisDQKAgEiAOoKEgDaAhDQwBCyAGKAJ8IAQvAVAgBWpGBEAgESAGLAAgIgVBAm3AIgS3Ig6hIRMgBCAGLQAharchDQwBCyARIAYsACAiBUECbcC3Ig6hIRNEAAAAAAAAAAAhDSAJRQ0AIAkvAVYgB0YNACAQIAYrA0CgIBIgDqChRAAAAAAAAAAAoCENCyADIA8gDqEiDjkDiAUgAyAORAAAAAAAAAAAoDkDmAUgAyATOQOABSADIBMgEiANoCARoSAFt6CgOQOQBSADIAMpA4gFNwNQIAMgAykDmAU3A2AgAyADKQOQBTcDWCADIAMpA4AFNwNIIAAgA0HIAGpBARCIAgwBCwsgAS0AIUUNACADQUBrIAMpA+ADNwMAIAMgAykD2AM3AzggAyADKQPQAzcDMCADIAMpA8gDNwMoIAAgASADQShqEIAJCyALRQRAIAAgA0GkA2oQ5QQLAkAgCkUNACAALQCYAUEEcUUNACADIAMpA+ADNwMgIAMgAykD2AM3AxggAyADKQPQAzcDECADIAMpA8gDNwMIIAAgAiABIANBCGogA0GkA2oiBxDmBEUNACAAIAcQ5QQLIAEoAoABBEAgAkGw3woQ/wgLIANBwAVqJAAPC0HSsgFB1L0BQesEQYOBARAAAAtB8MgBQdS9AUHsBEGDgQEQAAALeQICfwJ8IwBBEGsiASQAIAAoAgRBAWsiAkEDTwRAIAFB5AU2AgQgAUHUvQE2AgBBiPYIKAIAQdi/BCABECAaEDsACyAAKAIAIgAgAkECdCICQfS+CGooAgBqKwMAIQMgACACQei+CGooAgBqKwMAIAFBEGokACADoQtIAQJ/IAAQmgFBEBAaIQIgABCuASEAIAIhAQNAIAAEQCABIAApAwg3AwAgASAAKQMQNwMIIAFBEGohASAAKAIAIQAMAQsLIAILNAEBf0EYEFIiAiABKQMINwMQIAIgASkDADcDCCAAIAJBASAAKAIAEQMAIAJHBEAgAhAYCwsJACAAKAIAEBgL5wIBBn8jAEEwayICJAAgAEHUAGohAwNAIAAoAFwiASAETQRAQQAhBANAIAEgBE1FBEAgAiADKQIINwMoIAIgAykCADcDICACQSBqIAQQGSEBAkACQAJAIAAoAmQiBQ4CAgABCyADKAIAIAFBAnRqKAIAEBgMAQsgAygCACABQQJ0aigCACAFEQEACyAEQQFqIQQgACgAXCEBDAELCyADQQQQMSADEDQgABDkBCAAEBggAkEwaiQADwsgAygCACACIAMpAgg3AxggAiADKQIANwMQIAJBEGogBBAZQQJ0aigCACEFQQAhAQNAIAUoAAggAU0EQCAEQQFqIQQMAgUgBSgCACEGIAIgBSkCCDcDCCACIAUpAgA3AwACQAJAAkAgBiACIAEQGUECdGooAgAiBigCXEEBaw4CAAECCyAGKAJYEIkJDAELIAYoAlgQ/ggLIAYQ5AQgBhAYIAFBAWohAQwBCwALAAsACyEBAX8DQCAALQAAIQEgAEEBaiEAIAFBIEYNAAsgAUEARwtDAAJAIAAQKARAIAAQJEEPRg0BCyAAEI0JCwJAIAAQKARAIABBADoADwwBCyAAQQA2AgQLIAAQKAR/IAAFIAAoAgALC4AEAQh/IwBB8ABrIgMkACAAQQhqIQQCQAJAAkAgACgAECIFBEAgBUE4EBohBgNAIAIgACgAEE8NAiAEKAIAIQcgAyAEKQIINwNoIAMgBCkCADcDYCAGIAJBOGxqIAcgA0HgAGogAhAZQThsaiIHQTgQHxogB0EAQTgQOBogAkEBaiECDAALAAtBOBBSIQZB8f8EEKUBIgJFDQEgBiACNgIAIAAoAJwBIQIgACgClAEhBSADIAApApwBNwNYIAMgACkClAE3A1AgBiAFIANB0ABqIAJBAWsQGUECdGooAgA2AgRBASEFC0EAIQIDQCACIAAoABBPDQIgAyAEKQIINwNIIAMgBCkCADcDQCADQUBrIAIQGSEHAkACQAJAIAAoAhgiCA4CAgABC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALIANBCGoiCSAEKAIAIAdBOGxqQTgQHxogCSAIEQEACyACQQFqIQIMAAsACyADQQE2AgBBiPYIKAIAQfXpAyADECAaEC8ACyAEQTgQMSAAQgA3AHkgACABOgB4IAAgBTYCdCAAIAY2AnAgAEIANwCBASAAQgA3AIgBIABB2ABqQSAQJiEBIAAoAlggAUEFdGoiASAAKQNwNwMAIAEgACkDiAE3AxggASAAKQOAATcDECABIAApA3g3AwggA0HwAGokAAvRAgEFfyMAQRBrIgQkAAJAAkAgABAkIAAQS08EQCAAEEsiA0EBaiIBIANBAXRBgAggAxsiAiABIAJLGyEBIAAQJCEFAkAgAC0AD0H/AUYEQCADQX9GDQMgACgCACECIAFFBEAgAhAYQQAhAgwCCyACIAEQaiICRQ0EIAEgA00NASACIANqQQAgASADaxA4GgwBCyABQQEQGiICIAAgBRAfGiAAIAU2AgQLIABB/wE6AA8gACABNgIIIAAgAjYCAAsgABAkIQECQCAAECgEQCAAIAFqQQA6AAAgACAALQAPQQFqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABBrwJBxLIBEAAACyAAKAIAIAFqQQA6AAAgACAAKAIEQQFqNgIECyAEQRBqJAAPC0GOwANB0vwAQc0AQb2zARAAAAsgBCABNgIAQYj2CCgCAEH16QMgBBAgGhAvAAuMAwEHfyMAQUBqIgIkAEEwEFIhBiAAKAAQBEAgAEEAEIwJCyAGIAAoAGAiAzYCBCAGIANBIBAaIgc2AgAgAEHYAGohBEEAIQMDQCAAKABgIgEgA00EQAJAQQAhAwNAIAEgA00NASACIAQpAgg3AzggAiAEKQIANwMwIAJBMGogAxAZIQECQAJAAkAgACgCaCIFDgICAAELQbCDBEHCAEEBQYj2CCgCABA6GhA7AAsgAiAEKAIAIAFBBXRqIgEpAxg3AyggAiABKQMQNwMgIAIgASkDCDcDGCACIAEpAwA3AxAgAkEQaiAFEQEACyADQQFqIQMgACgAYCEBDAALAAsFIAQoAgAhASACIAQpAgg3AwggAiAEKQIANwMAIAcgA0EFdGoiBSABIAIgAxAZQQV0aiIBKQMANwMAIAUgASkDGDcDGCAFIAEpAxA3AxAgBSABKQMINwMIIAFCADcDACABQgA3AwggAUIANwMQIAFCADcDGCADQQFqIQMMAQsLIARBIBAxIAJBQGskACAGCxgBAX9BCBBSIgIgADYCACACIAE2AgQgAgsfAQF/IAIpAwBCAFkgAUcEfyAAIAJBCGoQTQVBAQtFC0kBAn8jAEEQayICJAAgARClASIDRQRAIAIgARBAQQFqNgIAQYj2CCgCAEH16QMgAhAgGhAvAAsgACADEPIBIAMQGCACQRBqJAALPAEBfyMAQRBrIgIkACAAQQE2AiQgAEGMAjYCCCACIAAQrAY2AgQgAiABNgIAQd/+BCACEDcgAkEQaiQAC5ABAQR/IwBBEGsiASQAA0AgAiAAKAAIT0UEQCABIAApAgg3AwggASAAKQIANwMAIAEgAhAZIQMCQAJAAkAgACgCECIEDgICAAELIAAoAgAgA0ECdGooAgAQGAwBCyAAKAIAIANBAnRqKAIAIAQRAQALIAJBAWohAgwBCwsgAEEEEDEgABA0IAAQGCABQRBqJAALPQIBfwF+IwBBEGsiASQAIAApAjQhAiABIAApAixCIIk3AwggASACQiCJNwMAQe/oBCABEIABIAFBEGokAAs7AQF/QQEhBAJAIABBASAAKAKcASABIAIgAyAALQD8A0VBARCwBiIBRQRAIAAQoQlFDQELIAEhBAsgBAu9BQEGfyMAQRBrIgckACAHIAIoAgAiCDYCDAJ/IAAoApwBIAFGBEAgACAINgKoAiAAQagCaiEJIABBrAJqDAELIAAoArQCIglBBGoLIQwgCSAINgIAIAJBADYCAAJ/A0AgByAHKAIMIgg2AgggACABIAggAyAHQQhqIAEoAggRBgAiCiAHKAIMIAcoAghBiyQgBhCbAkUEQCAAEOACQSsMAgsgDCAHKAIIIgg2AgACQAJAAkACQAJAAkACQAJAAkACQAJAIApBBGoODAQFAwQKBQUFBQUCAQALIApBKEcNBAJAIAAoAlgiAwRAIAAoAgQgAxEBAAwBCyAAKAJcRQ0AIAAgASAHKAIMIAgQhwELIAIgBygCCCIBNgIAIAQgATYCAEEjQQAgACgC+ANBAkYbDAsLIAAoAkgiCgRAIAdBCjoAByAAKAIEIAdBB2pBASAKEQUADAYLIAAoAlxFDQUgACABIAcoAgwgCBCHAQwFCyAAKAJIIgoEQCABLQBEDQQDQCAHIAAoAjg2AgAgASAHQQxqIAggByAAKAI8IAEoAjgRCAAgDCAHKAIINgIAIAAoAgQgACgCOCILIAcoAgAgC2sgChEFAEEBTQ0GIAkgBygCDDYCACAHKAIIIQgMAAsACyAAKAJcRQ0EIAAgASAHKAIMIAgQhwEMBAtBBiAFRQ0IGiAEIAcoAgw2AgBBAAwIC0EUIAVFDQcaIAQgBygCDDYCAEEADAcLIAkgCDYCAAwCCyAAKAIEIAcoAgwiCyAIIAtrIAoRBQALAkACQAJAIAAoAvgDQQFrDgMCAQAECyAJIAcoAggiADYCACAEIAA2AgBBAAwGCyAJIAcoAgg2AgBBIwwFCyAALQDgBEUNAQtBFwwDCyAHIAcoAggiCDYCDCAJIAg2AgAMAQsLIAkgCDYCAEEECyAHQRBqJAALUQEBfwNAIAEEQCAAKAJ0IgIEQCAAKAIEIAEoAgAoAgAgAhEEAAsgASgCBCABIAAoApADNgIEIAAgATYCkAMgASgCACABKAIINgIEIQEMAQsLC6YVAhd/An4jAEHQAGsiDCQAAkACQCAAIAAoAvwCIhRBFGoiBiADKAIAQQAQlwEiDQ0AQQEhCCAUQdAAaiADKAIAELMJIgdFDQEgACAGIAdBGBCXASINRQ0BIAAtAPQBRQ0AIAAgDRCgCUUNAQsgDSgCDCEGQQEhCCABIAIgACgClAMgACgCoAMgASgCJBEGACIHIAZB/////wdzSg0AAkACQCAGIAdqIgogACgClAMiCUwNACAHQe////8HIAZrSiAGQe////8HSnINAiAAIApBEGoiCjYClAMgCkGAgICAAU8NASAAIAAoAqADIApBBHRBth4QmgIiCkUNASAAIAo2AqADIAcgCUwNACABIAIgByAKIAEoAiQRBgAaC0EAIQogB0EAIAdBAEobIRMgBkEAIAZBAEobIREgAEG4A2ohEiAAKAKgAyEPQQAhCUEAIQcDQCAJIBNHBEBBASEIIAAgASAJQQR0IgYgACgCoANqKAIAIgIgASACIAEoAhwRAAAgAmoQqwkiAkUNAyACKAIAQQFrIg4tAAAEQEEIIQggASAAKAKcAUcNBCAAIAYgACgCoANqKAIANgKoAgwECyAOQQE6AAAgDyAHQQJ0aiACKAIANgIAIAdBAWohCwJAIAAoAqADIAZqIg4tAAxFBEBBACEGAkAgAi0ACEUNAANAIAYgEUYNASAGQQxsIRAgBkEBaiEGIAIgECANKAIUaiIQKAIARw0ACyAQLQAEIQgLIAAgASAIIA4oAgQgDigCCCASIAUQqAkiCA0FIA8gC0ECdGogACgCyAM2AgAMAQsgDyALQQJ0aiASIAEgDigCBCAOKAIIEIYBIgY2AgAgBkUNBAsgACAAKALEAzYCyAMCQAJAIAIoAgQiBgRAIAItAAkNASACKAIAQQFrQQI6AAAgCkEBaiEKCyAHQQJqIQcMAQsgACAGIAIgDyALQQJ0aigCACAEELsGIggNBAsgCUEBaiEJDAELCyAAIAc2ApgDAkACQCANKAIIIgFFBEBBfyEGDAELQX8hBiABKAIAIgFBAWstAABFDQBBACEGA0AgBiAHTg0CIA8gBkECdGooAgAgAUYNASAGQQJqIQYMAAsACyAAIAY2ApwDC0EAIQYDQCAGIBFHBEACQCANKAIUIAZBDGxqIgEoAgAiAigCAEEBayIFLQAADQAgASgCCCIIRQ0AAkAgAigCBCIJBEAgAi0ACUUEQCAFQQI6AAAgCkEBaiEKDAILIAAgCSACIAggBBC7BiIIRQ0CDAYLIAVBAToAAAsgDyAHQQJ0aiICIAEoAgAoAgA2AgAgAiABKAIINgIEIAdBAmohBwsgBkEBaiEGDAELCyAPIAdBAnRqQQA2AgBBACEJAkACQAJAAkAgCkUNACAALQCsAyIBQR9LDQMCQAJAAkAgCkEBdCABdQRAIAEhBgNAIAZB/wFxIQUgBkEBaiICIQYgCiAFdQ0ACyAAIAI6AKwDAn8gAkH/AXEiBUECTQRAQQMhBiAAQQM6AKwDQQgMAQsgBUEgTw0HQQEhCCACQf8BcSIGQR1PDQRBASAGdAshBSAAIAAoAqQDQQwgBnRB+R8QmgIiAkUNBiAAIAI2AqQDDAELQQEgAXQhBSAAKAKoAyIIDQELIAAoAqQDIQFBfyEIIAUhBgNAIAZFDQEgASAGQQFrIgZBDGxqQX82AgAMAAsACyAAIAhBAWsiEzYCqANBACAFayEVIBRBKGohFiAFQQFrIhdBAnYhGCAMQThqIRkDQCAHIAlMDQICQCAPIAlBAnRqIhooAgAiAUEBayICLQAAQQJGBEAgACAMQQhqEJsJIAxCADcDSCAMIBk2AkAgDCAMKQMIIh1C9crNg9es27fzAIU3AxggDCAMKQMQIh5C88rRy6eM2bL0AIU3AzAgDCAdQuHklfPW7Nm87ACFNwMoIAwgHkLt3pHzlszct+QAhTcDICACQQA6AABBASEIIAAgFiABQQAQlwEiAkUNCSACKAIEIgJFDQkgAigCBCIORQ0FQQAhBgNAAkAgDigCECECIAYgDigCFCILTw0AIAIgBmotAAAhCyAAKALEAyICIAAoAsADRgRAIBIQX0UNDCAAKALEAyECCyAAIAJBAWo2AsQDIAIgCzoAACAGQQFqIQYMAQsLIAxBGGogAiALEK8GA0AgAS0AACABQQFqIgYhAUE6Rw0ACyAGIAYQmgkQrwYDQCAAKALEAyICIAAoAsADRgRAIBIQX0UNCyAAKALEAyECCyAGLQAAIQsgACACQQFqNgLEAyACIAs6AAAgBi0AACAGQQFqIQYNAAsQmQmnIgsgFXEhGyALIBdxIQEgACgCpAMhHEEAIREDQCATIBwgAUEMbCIQaiICKAIARgRAAkAgAigCBCALRw0AIAIoAgghAiAAKALIAyEGA0ACQCAGLQAAIhBFDQAgECACLQAARw0AIAJBAWohAiAGQQFqIQYMAQsLIBANAEEIIQgMDAsgEUH/AXFFBEAgGyAALQCsA0EBa3YgGHFBAXIhEQsgASARQf8BcSICayAFQQAgASACSRtqIQEMAQsLIAAtAPUBBEAgACgCxANBAWsgAC0A8AM6AAAgDigCACgCACEGA0AgACgCxAMiAiAAKALAA0YEQCASEF9FDQwgACgCxAMhAgsgBi0AACEBIAAgAkEBajYCxAMgAiABOgAAIAYtAAAgBkEBaiEGDQALCyAAKALIAyEBIAAgACgCxAM2AsgDIBogATYCACAAKAKkAyAQaiICIAE2AgggAiALNgIEIAIgEzYCACAKQQFrIgoNASAJQQJqIQkMBAsgAkEAOgAACyAJQQJqIQkMAAsACyAAIAE6AKwDDAULA0AgByAJTARAA0ACQCAEKAIAIgFFDQAgASgCDCgCAEEBa0EAOgAAIAFBBGohBAwBCwsFIA8gCUECdGooAgBBAWtBADoAACAJQQJqIQkMAQsLQQAhCCAALQD0AUUNBAJAIA0oAgQiAQRAIAEoAgQiB0UNAiADKAIAIQYDQCAGLQAAIAZBAWoiDSEGQTpHDQALDAELIBQoApwBIgdFDQUgAygCACENCyAHKAIAKAIAIQRBACEGQQAhAQJAIAAtAPUBRQ0AIARFDQBBACECA0AgAiAEaiACQQFqIgEhAi0AAA0ACwsgAyANNgIEIAcoAhQhCSADIAE2AhQgAyAENgIIIAMgCTYCEANAIAYiAkEBaiEGIAIgDWotAAANAAtBASEIIAkgAUH/////B3NKDQQgAiABIAlqIgRB/////wdzTw0EAkAgBCAGaiIEIAcoAhhMBEAgBygCECEEDAELIARB5////wdKDQUgACAEQRhqIgVBriEQmAEiBEUNBSAHIAU2AhggBCAHKAIQIAcoAhQQHyEFIABBhANqIQgDQCAIKAIAIggEQCAIKAIMIAcoAhBHDQEgCCAFNgIMDAELCyAAIAcoAhBBtiEQZyAHIAU2AhAgBygCFCEJCyAEIAlqIA0gBhAfIQQgAQRAIAIgBGoiAiAALQDwAzoAACACQQFqIAcoAgAoAgAgARAfGgsgAyAHKAIQNgIAQQAhCAwEC0EbIQgMAwsgACABOgCsAwtBASEIDAELIAAgCTYClAMLIAxB0ABqJAAgCAvsAQIBfgF/IAApAzAgACgCKCAAQSBqayICrXxCOIYhAQJAAkACQAJAAkACQAJAAkAgAsBBAWsOBwYFBAMCAQAHCyAAMQAmQjCGIAGEIQELIAAxACVCKIYgAYQhAQsgADEAJEIghiABhCEBCyAAMQAjQhiGIAGEIQELIAAxACJCEIYgAYQhAQsgADEAIUIIhiABhCEBCyABIAAxACCEIQELIAAgACkDGCABhTcDGCAAQQIQrgYgACAAKQMAIAGFNwMAIAAgACkDEEL/AYU3AxAgAEEEEK4GIAApAxggACkDECAAKQMIIAApAwCFhYULIQEBfwNAIAAtAAAEQCABQQFqIQEgAEEBaiEADAELCyABCzQAIAFCADcDACAAQQAQvwIiACgC9AMEQEGtOEGfvQFB4wlBnSAQAAALIAEgADUCiAQ3AwgLeQECfwNAAkAgAC0AACICBEAgAkENRw0BIAAhAQNAAn8gAkENRgRAIAFBCjoAACAAQQJqIABBAWogAC0AAUEKRhsMAQsgASACOgAAIABBAWoLIQAgAUEBaiEBIAAtAAAiAg0ACyABQQA6AAALDwsgAEEBaiEADAALAAuhAwEDfyMAQaABayICJAAgAkIANwOYASACQgA3A5ABIAIgACgCACIDKAIcIgQEfyACIAQ2AoABIAJBkAFqQY/MAyACQYABahB0IAAoAgAFIAMLKAIUNgJ0IAIgATYCcCACQZABaiIDQe6xASACQfAAahB0AkAgACgCUCIBLQAABEAgAiABNgJgIANB1awDIAJB4ABqEHQMAQsCQAJAAkAgACgCLEEBa0ECbUEBaw4DAgABAwsgAkGAgAE2AiAgAkGQAWoiAUGyqAMgAkEgahB0IAAoAgBBNGoQJEUNAiACIAAoAgBBNGoQ4gI2AhAgAUGaMiACQRBqEHQMAgsgAkGAgAE2AkAgAkGQAWoiAUHupwMgAkFAaxB0IAAoAgBBNGoQJEUNASACIAAoAgBBNGoQ4gI2AjAgAUGCMiACQTBqEHQMAQsgAkGAgAE2AlAgAkGQAWpB8KgDIAJB0ABqEHQLIAJBkAFqIgFBChDKAyACIAEQ4gI2AgBBrzQgAhA3IAItAJ8BQf8BRgRAIAIoApABEBgLIABBATYCLCACQaABaiQAC9QBAQZ/IwBBMGsiBCQAIAAoAvQDRQRAIAAoAtwEBEAgACgC0AQhBiAAKALYBCEHIAAoAtQEIQUgAS0AIiEIIAEoAgAhCSABKAIIIQEgBCADNgIoIAQgATYCJCAEIAI2AiAgBCAJNgIcIARB8f8ENgIUIARBuK0DQbatAyAIGzYCGCAEIAVBAXRBAms2AhAgBCAHNgIMIAQgBTYCCCAEIAY2AgQgBCAANgIAQYj2CCgCAEHD9QQgBBAgGgsgBEEwaiQADwtBrThBn70BQanDAEGkKBAAAAvBBwEIfyMAQRBrIgkkACAAQdADaiELIAlBCGohDCAFIAAoAvwCIgpB0ABqRyENAkACQANAIAkgAzYCDCAAIAEgAyAEIAlBDGogASgCEBEGACIIIAMgCSgCDEG/MyAGEJsCRQRAIAAQ4AJBKyEFDAMLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAIQQRqDg8KBAcBAAcHBwcHAwsHBQIGC0EEIQUgASAAKAKcAUcNDyAAIAkoAgw2AqgCDA8LQQQhBSABIAAoApwBRw0ODA0LIAEgAyABKAIoEQAAIghBAEgEQEEOIQUgASAAKAKcAUYNDQwOCyACIAhBIEdyRQRAIAUoAgwiAyAFKAIQRg0KIANBAWstAABBIEYNCgtBACEDIAggCUEIahCTBCIIQQAgCEEAShshDgNAIAMgDkYNCiAFKAIMIgggBSgCCEYEQCAFEF9FDQwgBSgCDCEICyAJQQhqIANqLQAAIQ8gBSAIQQFqNgIMIAggDzoAACADQQFqIQMMAAsACyAFIAEgAyAJKAIMEOoERQ0JDAgLIAkgAyABKAJAajYCDAwGCyAJIAEgAyABKAJAIghqIAkoAgwgCGsgASgCLBEDACIIOgAHIAhB/wFxBEAgAEEJIAlBB2ogDEGHNEEBEJsCGiAFKAIMIgMgBSgCCEYEQCAFEF9FDQkgBSgCDCEDCyAJLQAHIQggBSADQQFqNgIMIAMgCDoAAAwHCyALIAEgAyABKAJAIghqIAkoAgwgCGsQhgEiCEUNByAAIAogCEEAEJcBIQggACAAKALgAzYC3AMCQAJAIA1FBEAgACgCmAJFDQIgCi0AggFFDQEgACgCtAJFDQUMAgsgCi0AgQFFDQQgCi0AggFFDQEMBAsgCi0AgQFFDQMLIAhFDQYMAwsgCEEnRg0EC0EXIQUgASAAKAKcAUYNBwwICyAIRQRAQQshBQwICyAILQAjDQBBGCEFDAcLIAgtACAEQEEMIQUgASAAKAKcAUYNBgwHCyAIKAIcBEBBDyEFIAEgACgCnAFGDQYMBwsgCCgCBEUEQEEQIQUgASAAKAKcAUYNBgwHC0EBIQUgACAIQQBBARDpBA0GCyAHIAkoAgw2AgBBACEFDAULIAUoAgwhAyACRQRAIAMgBSgCEEYNASADQQFrLQAAQSBGDQELIAUoAgggA0YEQCAFEF9FDQIgBSgCDCEDCyAFIANBAWo2AgwgA0EgOgAACyAJKAIMIQMMAQsLQQEhBQwBCyAAIAM2AqgCCyAJQRBqJAAgBQuQAgEGfyAAKAL8AiECQQEhBCABKAIAIgUhBgNAAkACQAJAIAYtAAAiA0UNACADQTpHDQEgAkHQAGohBANAAkAgAigCWCEHIAIoAlwhAyAFIAZGDQAgAyAHRgRAIAQQX0UNBSACKAJcIQMLIAUtAAAhByACIANBAWo2AlwgAyAHOgAAIAVBAWohBQwBCwsgAyAHRgRAIAQQX0UNAyACKAJcIQMLIAIgA0EBajYCXEEAIQQgA0EAOgAAIAAgAkE8aiACKAJgQQgQlwEiAEUNAAJAIAIoAmAiAyAAKAIARgRAIAIgAigCXDYCYAwBCyACIAM2AlwLIAEgADYCBEEBIQQLIAQPCyAGQQFqIQYMAQsLQQAL5wEBCH8gAEGEA2ohAQNAAkAgASgCACIBRQRAQQEhAwwBC0EBIQMgASgCBCIEIAEoAiQiBiABKAIYIgVBAWoiB2oiCEYNAEEAIQMgASgCCCICQf7///8HIAVrSw0AIAIgB2oiBSABKAIoIAZrSwRAIAAgBiAFQc8YEJoCIgJFDQEgASgCJCIDIAEoAgxGBEAgASACNgIMCyABKAIQIgQEQCABIAIgBCADa2o2AhALIAEgAjYCJCABIAIgBWo2AiggAiAHaiEIIAEoAgQhBCABKAIIIQILIAEgCCAEIAIQHzYCBAwBCwsgAwuNAQMBfwF9An4jAEEwayICJAAgAEEAEL8CIgAoAvQDRQRAIAAoAqAEBEAgABCjCSEDIAApA5AEIQQgACkDmAQhBSACIAE2AiAgAiADuzkDGCACIAU3AxAgAiAENwMIIAIgADYCAEGI9ggoAgBBvTIgAhAzCyACQTBqJAAPC0GtOEGfvQFBp8IAQY4oEAAAC1ECAn4BfSAAKQOYBCEBAn0gACkDkAQiAlBFBEAgASACfLUgArWVDAELIAFCFny1QwAAsEGVCyAAKAL0AwRAQa04QZ+9AUGgwgBBnOMAEAAACwtFAQF/IAAEQAJAIAEoAhQiAkUNACAAIAIgASgCDEECdGoiASgCAEcNACABQQA2AgALIAAoAhQEQCAAKAIEEBgLIAAQGAsL1wIBBX8CQCAAKAL8AiICKAK4AUUEQEF/IQQgACgC7AMiAUH/////A0sNASACIAAgAUECdEGowAAQmAEiATYCuAEgAUUNASABQQA2AgALQX8hBCACKAKwASIBQQBIDQAgAigCpAEhAyACIAIoAqwBIgUgAUsEfyABBQJAIAMEQCAFQaSSySRLDQMgACADIAVBOGxBxcAAEJoCIgNFDQMgAigCrAFBAXQhAQwBC0EgIQEgAEGAB0HKwAAQmAEiA0UNAgsgAiADNgKkASACIAE2AqwBIAIoArABCyIEQQFqNgKwASACKAK0ASIABEAgAyACKAK4ASAAQQJ0akEEaygCAEEcbGoiACgCECIBBEAgAyABQRxsaiAENgIYCyAAKAIUIgFFBEAgACAENgIMCyAAIAQ2AhAgACABQQFqNgIUCyADIARBHGxqIgBCADcCDCAAQgA3AhQLIAQLwQIBBX8jAEEQayIHJAAgByACKAIAIgg2AgwCfyAAKAKcASABRgRAIAAgCDYCqAIgAEGoAmohCSAAQawCagwBCyAAKAK0AiIJQQRqCyEGIAkgCDYCACACQQA2AgACQCAAIAEgCCADIAdBDGogASgCDBEGACIKIAggBygCDEGqJUEAEJsCRQRAIAAQ4AJBKyEDDAELIAYgBygCDCIGNgIAQQQhAwJAAkACQAJAAkACQCAKQQRqDgUDBQIDAQALIApBKkcNBCAAKAJcBEAgACABIAggBhCHASAHKAIMIQYLIAIgBjYCACAEIAY2AgBBI0EAIAAoAvgDQQJGGyEDDAULIAkgBjYCAAwECyAFDQFBBiEDDAMLIAUNAEECIQMMAgsgBCAINgIAQQAhAwwBCyAJIAY2AgBBFyEDCyAHQRBqJAAgAwvyBgEJfyMAQRBrIgkkACAAKAKcAiELIABBATYCnAIgACgC/AIiB0HoAGohCgJAAkAgBygCaA0AIAoQXw0AQQEhCAwBCyAHQYQBaiEMIABBuANqIQ0CQAJAAkADQCAJIAI2AgwgACABIAIgAyAJQQxqIAEoAhQRBgAiBiACIAkoAgxBjjUgBBCbAkUEQCAAEOACQSshCAwEC0EAIQgCQAJAAkACQAJAAkACQAJAAkACQAJAIAZBBGoODw4CBwUGBwcHBwcBAwcBBAALIAZBHEcNBgJAIAAtAIAERQRAIAEgACgCnAFGDQELIA0gASACIAEoAkAiBmogCSgCDCAGaxCGASIGRQ0NIAAgDCAGQQAQlwEhBiAAIAAoAsgDNgLEAyAGRQRAIAcgBy0AggE6AIABDA8LAkAgBi0AIEUEQCAGIAAoAtQCRw0BC0EMIQggASAAKAKcAUcNDwwNCyAGKAIQRQ0KIAAoAnxFDQggB0EAOgCDASAGQQE6ACAgACAGQbg1ELIGIAAoAoABQQAgBigCFCAGKAIQIAYoAhggACgCfBEIAEUEQCAAIAZBvDUQlAMgBkEAOgAgQRUhCAwPCyAAIAZBwTUQlAMgBkEAOgAgIActAIMBDQkgByAHLQCCAToAgAEMCQsgACACNgKoAkEKIQgMDQsgCiABIAIgCSgCDBDqBEUNCwwHCyAJIAIgASgCQGo2AgwLIAcoAnQiAiAHKAJwRgRAIAoQX0UNCiAHKAJ0IQILIAcgAkEBajYCdCACQQo6AAAMBQsgASACIAEoAigRAAAiBkEASARAQQ4hCCABIAAoApwBRg0IDAoLQQAhAiAGIAlBCGoQkwQiBkEAIAZBAEobIQgDQCACIAhGDQUgBygCdCIGIAcoAnBGBEAgChBfRQ0KIAcoAnQhBgsgCUEIaiACai0AACEOIAcgBkEBajYCdCAGIA46AAAgAkEBaiECDAALAAtBBCEIIAEgACgCnAFGDQYMCAtBBCEIIAEgACgCnAFHDQcgACAJKAIMNgKoAgwHC0EXIQggASAAKAKcAUYNBAwGCyAHIActAIIBOgCAAQsgCSgCDCECDAELCyAAIAZBAEECEOkEIQgMAgsgACACNgKoAgwBC0EBIQgLIAAgCzYCnAIgBUUNACAFIAkoAgw2AgALIAlBEGokACAIC5ADAQZ/IwBBEGsiCSQAIAkgAzYCDAJAAkADQAJAIAAoArwCIggEQCAIKAIMIgcoAgghCiAJIAcoAgQiCyAHKAIMaiIMNgIIIActACEEQCAAIAAoAuwBIAIgDCAKIAtqIgogBUEBIAlBCGoQnwkiCA0EIAkoAggiCCAKRwRAIAcgCCAHKAIEazYCDAwECyAHQQA6ACEMAwsgACAHQZMzEJQDIAAoArwCIgogCEcNBCAHQQA6ACAgACAKKAIIIgc2ArwCIAggACgCwAI2AgggACAINgLAAgwBCyAAIAEgAiADIAQgBSAGIAlBDGoQnwkiCA0CIAAoArwCIQcgCSgCDCEDCyAHIAMgBEdyDQALIAUoAgwhBwJAIAINACAHIAUoAhBGDQAgB0EBayIALQAAQSBHDQAgBSAANgIMIAAhBwsgBSgCCCAHRgRAIAUQX0UEQEEBIQgMAgsgBSgCDCEHCyAFIAdBAWo2AgxBACEIIAdBADoAAAsgCUEQaiQAIAgPC0HjC0GfvQFBmTNBio8BEAAAC2EBAX8CQCAARQ0AIABBADYCECAAKAIEQQA6AAAgACgCBEEAOgABIABBADYCLCAAQQE2AhwgACAAKAIENgIIIAEoAhQiAkUNACAAIAIgASgCDEECdGooAgBHDQAgARDtBAsLtQIBBX8gACgCDCEHAkACQCADIARyRQ0AIAdBACAHQQBKGyEJA0AgBiAJRwRAQQEhCCAGQQxsIQogBkEBaiEGIAEgCiAAKAIUaigCAEcNAQwDCwsgA0UNACAAKAIIDQAgAS0ACQ0AIAAgATYCCAsCQCAAKAIQIAdHBEAgACgCFCEGDAELIAdFBEAgAEEINgIQIAAgBUHgAEGOOBCYASIGNgIUIAYNASAAQQA2AhBBAA8LQQAhCCAHQf////8DSg0BIAdBAXQiA0HVqtWqAUsNASAFIAAoAhQgB0EYbEGoOBCaAiIGRQ0BIAAgBjYCFCAAIAM2AhALIAYgACgCDCIFQQxsaiIDIAQ2AgggAyABNgIAIAMgAjoABCACRQRAIAFBAToACAtBASEIIAAgBUEBajYCDAsgCAuFBAEFfyAAKAL8AiIEQdAAaiEHAkAgBCgCXCIFIAQoAlhGBEAgBxBfRQ0BIAQoAlwhBQsgBCAFQQFqNgJcIAVBADoAACAHIAEgAiADEIYBIgFFDQAgACAEQShqIAFBAWoiCEEMEJcBIgZFDQACQCAIIAYoAgBHBEAgBCAEKAJgNgJcDAELIAQgBCgCXDYCYCAALQD0AUUNAAJAIAgtAAAiBUH4AEcNACABLQACQe0ARw0AIAEtAANB7ABHDQAgAS0ABEHuAEcNACABLQAFQfMARw0AAn8gAS0ABiICQTpHBEAgAg0CIARBmAFqDAELIAAgBEE8aiABQQdqQQgQlwELIQAgBkEBOgAJIAYgADYCBAwBC0EAIQNBACECA0AgBUH/AXEiAUUNASABQTpGBEADQAJAIAQoAlghASAEKAJcIQUgAiADRg0AIAEgBUYEQCAHEF9FDQYgBCgCXCEFCyADIAhqLQAAIQEgBCAFQQFqNgJcIAUgAToAACADQQFqIQMMAQsLIAEgBUYEQCAHEF9FDQQgBCgCXCEFCyAEIAVBAWo2AlwgBUEAOgAAIAYgACAEQTxqIAQoAmBBCBCXASIANgIEIABFDQMgBCgCYCIBIAAoAgBGBEAgBCAEKAJcNgJgDAMLIAQgATYCXAUgCCACQQFqIgJqLQAAIQUMAQsLCyAGDwtBAAugBQENfyMAQSBrIgQkACAEQQA2AhwgBEEANgIYIARBADYCFCAEQQA2AhAgBEF/NgIMAkAgAEEMIAIgA0GGJkEAEJsCRQRAIAAQ4AJBKyEDDAELIAEhByAAKAKcASEIIAIhCSADIQogAEGoAmohCyAEQRRqIQwgBEEQaiENIARBHGohDiAEQRhqIQ8gBEEMaiEQIAAtAPQBBH8gByAIIAkgCiALIAwgDSAOIA8gEBDMCQUgByAIIAkgCiALIAwgDSAOIA8gEBDPCQtFBEBBH0EeIAEbIQMMAQsCQCABDQAgBCgCDEEBRw0AIAAoAvwCQQE6AIIBIAAoAoQEQQFHDQAgAEEANgKEBAsCQAJ/IAAoApgBBEBBACEBQQAhAiAEKAIcIgMEQCAAQdADaiAAKAKcASICIAMgAiADIAIoAhwRAAAgA2oQhgEiAkUNAyAAIAAoAtwDNgLgAwsgBCgCFCIDBEAgAEHQA2ogACgCnAEiASADIAQoAhAgASgCQGsQhgEiAUUNAwsgACgCBCABIAIgBCgCDCAAKAKYAREHACABQQBHDAELIAAoAlwEQCAAIAAoApwBIAIgAxCHAQtBACECQQALIQECQCAAKALwAQ0AAkAgBCgCGCIDBEAgAygCQCIFIAAoApwBIgYoAkBGIAMgBkYgBUECR3JxDQEgACAEKAIcNgKoAkETIQMMBAsgBCgCHCIDRQ0BIAJFBEAgAEHQA2ogACgCnAEiASADIAEgAyABKAIcEQAAIANqEIYBIgJFDQMLIAAgAhCuCSEDIABB0ANqEJwCIANBEkcNAyAAIAQoAhw2AqgCQRIhAwwDCyAAIAM2ApwBC0EAIQMgAkUgAUEBc3ENASAAQdADahCcAgwBC0EBIQMLIARBIGokACADC80yARF/IwBBEGsiDCQAIAwgBTYCBCAAKAL8AiEKAn8gACgCnAEgAUYEQCAAQagCaiEVIABBrAJqDAELIAAoArQCIhVBBGoLIREgAEG4A2ohDyAKQYQBaiEWIApB0ABqIRMgAEGIAmohFwJAAkADQAJAIBUgAjYCACARIAwoAgQiDTYCAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIARBAEoNACAHQQAgBBsNSyAEQXFGBEBBDyEEDAELQQYhBQJAAkACQCAEQQRqDgUBAk80AAILIBUgDTYCAAwDCyAAKAKcASABRwRAIAAoArQCLQAURQ1NDEsLIAAtAIAEDUpBAyEFDE0LIAwgAzYCBEEAIARrIQQgAyENCwJAIBcgBCACIA0gASAXKAIAEQgAIgtBAWtBAkkgC0E5RnINACAAIAQgAiAMKAIEQbUpIAkQmwINACAAEOACQSshBQxMC0EBIQ5BACEFAkACQAJAAkACQAJAAkACQCALQQFqDj4kPwAKPgEaBAIHHh89GRsFHB08ICIjIQwNDg8QERITFBYWOwsXFxgYOiorKywmNTMyNCgnMC0vLkFAAyUpKUkLIABBACACIAwoAgQQrAkiBQ1SDE0LIAAoAmAEfyAAIA8gASACIAwoAgQQhgEiBDYC2AIgBEUNTCAAQQA2AuACIAAgACgCxAM2AsgDQQAFQQELIQ4gAEEANgLcAgxGCyAAKAJgIgRFDUYgACgCBCAAKALYAiAAKALcAiAAKALgAkEBIAQRCgAgAEEANgLYAiAPEJwCDEwLIABBASACIAwoAgQQrAkiBUUNSgxPCyAAQQA6AIEEIAAgACAWQZioCEEkEJcBIgQ2AtQCIARFDUggCkEBOgCBASAAKAJgRQ0AIAEgAiAMKAIEIBUgASgCNBEGAEUNRyAPIAEgAiABKAJAIgRqIAwoAgQgBGsQhgEiBEUNSCAEELcGIAAgBDYC4AIgACAAKALEAzYCyANBACEODAELIAEgAiAMKAIEIBUgASgCNBEGAEUNRgsgCi0AgAFFDUEgACgC1AJFDUEgEyABIAIgASgCQCIEaiAMKAIEIARrEIYBIgRFDUYgBBC3BiAAKALUAiAENgIYIAogCigCXDYCYCALQQ5HDUEgACgClAFFDUEMSAsgCA0BC0EEIQUMSgsgACgC2AIiBAR/IAAoAgQgBCAAKALcAiAAKALgAkEAIAAoAmARCgAgDxCcAkEABUEBCyEOAkAgACgC3AJFBEAgAC0AgQRFDQELIAotAIEBIQUgCkEBOgCBAQJAIAAoAoQERQ0AIAAoAnxFDQAgACAWQZioCEEkEJcBIgRFDUUCQCAALQCBBEUEQCAEKAIUIQ0MAQsgBCAAKAKAAyINNgIUCyAKQQA6AIMBIAAoAoABQQAgDSAEKAIQIAQoAhggACgCfBEIAEUNQyAKLQCDAQRAIAotAIIBDQEgACgCeCIERQ0BIAAoAgQgBBECAA0BDEMLIAAoAtwCDQAgCiAFOgCBAQsgAEEAOgCBBAsgACgCZCIERQ0+IAAoAgQgBBEBAAxFCwJAIAAtAIEERQ0AIAotAIEBIQQgCkEBOgCBASAAKAKEBEUNACAAKAJ8RQ0AIAAgFkGYqAhBJBCXASIBRQ1DIAEgACgCgAMiBTYCFCAKQQA6AIMBIAAoAoABQQAgBSABKAIQIAEoAhggACgCfBEIAEUNQSAKLQCDAQRAIAotAIIBDQEgACgCeCIBRQ0BIAAoAgQgARECAEUNQQwBCyAKIAQ6AIEBCyAAQdYBNgKgAiAAIAIgAyAGELYGIQUMSAsgACAAIAEgAiAMKAIEELUGIgQ2AvACIARFDUEMCQsgACAAIAEgAiAMKAIEEKsJIgQ2AvQCIARFDUAgAEEANgLkAiAAQQA7AfgCDAgLIABBmqgINgLkAiAAQQE6APgCDAcLIABBoKgINgLkAiAAQQE6APkCDAYLIABBo6gINgLkAgwFCyAAQamoCDYC5AIMBAsgAEGwqAg2AuQCDAMLIABBt6gINgLkAgwCCyAAQcCoCDYC5AIMAQsgAEHIqAg2AuQCCyAKLQCAAUUNMyAAKAKQAUUNMww5CyAKLQCAAUUNMiAAKAKQAUUNMkG7CEHIrANB06wDIAtBIEYbIAAoAuQCGyEFA0AgBS0AACILBEAgACgCxAMiBCAAKALAA0YEQCAPEF9FDTkgACgCxAMhBAsgACAEQQFqNgLEAyAEIAs6AAAgBUEBaiEFDAELC0EBIQUgACgCyANFDTwgDyABIAIgDCgCBBDqBEUNPCAAIAAoAsgDNgLkAgw4CyAKLQCAAUUEQAwwCyAAKALwAiAAKAL0AiAALQD4AiAALQD5AkEAIAAQqglFDTUgACgCkAFFDS8gACgC5AIiBEUNLwJAIAQtAAAiBUEoRwRAIAVBzgBHDQEgBC0AAUHPAEcNAQsgACgCxAMiBCAAKALAA0YEQCAPEF9FDTcgACgCxAMhBAtBASEFIAAgBEEBajYCxAMgBEEpOgAAIAAoAsQDIgQgACgCwANGBEAgDxBfRQ09IAAoAsQDIQQLIAAgBEEBajYCxAMgBEEAOgAAIAAgACgCyAM2AuQCIAAgACgCxAM2AsgDCyARIAI2AgBBACEOIAAoAgQgACgC8AIoAgAgACgC9AIoAgAgACgC5AJBACALQSRGIAAoApABEQsADC8LIAotAIABRQ0wIAAgASAALQD4AiACIAEoAkAiBGogDCgCBCAEayATQQIQqAkiBQ06IAooAmAhBCAKIAooAlw2AmBBASEFIAAoAvACIAAoAvQCIAAtAPgCQQAgBCAAEKoJRQ06IAAoApABRQ0wIAAoAuQCIg1FDTACQCANLQAAIhJBKEcEQCASQc4ARw0BIA0tAAFBzwBHDQELIAAoAsQDIhAgACgCwANGBEAgDxBfRQ08IAAoAsQDIRALIAAgEEEBajYCxAMgEEEpOgAAIAAoAsQDIhAgACgCwANGBEAgDxBfRQ08IAAoAsQDIRALIAAgEEEBajYCxAMgEEEAOgAAIAAgACgCyAM2AuQCIAAgACgCxAM2AsgDCyARIAI2AgAgACgCBCAAKALwAigCACAAKAL0AigCACAAKALkAiAEIAtBJkYgACgCkAERCwAgDxCcAgw2CyAKLQCAAUUNLyAMKAIEIAwgAiABKAJAIgVqNgIMIAVrIQsCQANAAkAgACgCxAIiBQRAIAUoAgwiBCgCCCENIAwgBCgCBCISIAQoAgxqIg42AgggBC0AIQRAIAAgACgC7AEgDiANIBJqIg1BASAMQQhqEKcJIgUNBCAMKAIIIgUgDUcEQCAEIAUgBCgCBGs2AgwMBAsgBEEAOgAhDAMLIAAgBEHWNhCUAyAAKALEAiINIAVHDSEgBEEAOgAgIAAgDSgCCCIENgLEAiAFIAAoAsgCNgIIIAAgBTYCyAIMAQsgACABIAwoAgwgC0ECIAxBDGoQpwkiBQ0CIAAoAsQCIQQLIAQNACALIAwoAgxHDQALQQAhBQsgCigCeCEEAn8CQCAAKALUAiILBEAgCyAENgIEIAsgCigCdCILIARrNgIIIAogCzYCeCAAKAKUAUUNASARIAI2AgAgACgCBCAAKALUAiIEKAIAIAQtACIgBCgCBCAEKAIIIAAoAoADQQBBAEEAIAAoApQBESAAQQAMAgsgCiAENgJ0C0EBCyEOIAVFDS4MOQsgAEEAOgCBBEEBIQUgCkEBOgCBAQJ/IAAoAmAEQCAAIA8gASACIAEoAkAiBGogDCgCBCAEaxCGASIENgLcAiAERQ06IAAgACgCxAM2AsgDQQAMAQsgAEGYqAg2AtwCQQELIQ4CQCAKLQCCAQ0AIAAoAoQEDQAgACgCeCIERQ0AIAAoAgQgBBECAEUNMAsgACgC1AINACAAIAAgFkGYqAhBJBCXASIENgLUAiAERQ04IARBADYCGAsgCi0AgAFFDSwgACgC1AJFDSwgEyABIAIgASgCQCIEaiAMKAIEIARrEIYBIQQgACgC1AIiBSAENgIQIARFDTEgBSAAKAKAAzYCFCAKIAooAlw2AmAgC0ENRw0sIAAoApQBRQ0sDDMLIAotAIABRQ0sIAAoAtQCRQ0sIAAoApQBRQ0sIBEgAjYCACAAKAIEIAAoAtQCIgIoAgAgAi0AIkEAQQAgAigCFCACKAIQIAIoAhhBACAAKAKUAREgAAwyCyAKLQCAAUUNKyAAKALUAkUNKyATIAEgAiAMKAIEEIYBIQQgACgC1AIgBDYCHCAERQ0vIAogCigCXDYCYCAAKAJoBEAgESACNgIAIAAoAgQgACgC1AIiAigCACACKAIUIAIoAhAgAigCGCACKAIcIAAoAmgRCwAMMgsgACgClAFFDSsgESACNgIAIAAoAgQgACgC1AIiAigCAEEAQQBBACACKAIUIAIoAhAgAigCGCACKAIcIAAoApQBESAADDELIAEgAiAMKAIEIAEoAiwRAwAEQCAAQQA2AtQCDCsLIAotAIABRQ0aQQEhBSATIAEgAiAMKAIEEIYBIgtFDTQgACAAIAogC0EkEJcBIgQ2AtQCIARFDTQgCyAEKAIARwRAIAogCigCYDYCXCAAQQA2AtQCDCsLIAogCigCXDYCYEEAIQUgBEEAOgAiIARBADYCGCAEIAAoAvQDBH9BAQUgACgCtAILRToAIyAAKAKUAUUNKgwwCyAKLQCAAQRAQQEhBSATIAEgAiAMKAIEEIYBIgtFDTQgACAAIBYgC0EkEJcBIgQ2AtQCIARFDTQgCyAEKAIARwRAIAogCigCYDYCXCAAQQA2AtQCDCsLIAogCigCXDYCYCAEQQE6ACJBACEFIARBADYCGCAEIAAoAvQDBH9BAQUgACgCtAILRToAIyAAKAKUAUUNKgwwCyAKIAooAmA2AlwgAEEANgLUAgwpCyAAQgA3A+gCIAAoAmxFDSggACAPIAEgAiAMKAIEEIYBIgI2AugCIAJFDSwgACAAKALEAzYCyAMMLgsgASACIAwoAgQgFSABKAI0EQYARQ0qIAAoAugCRQ0nIA8gASACIAEoAkAiBGogDCgCBCAEaxCGASICRQ0rIAIQtwYgACACNgLsAiAAIAAoAsQDNgLIAwwtCyAAKALoAkUNJCAAKAJsRQ0kIA8gASACIAEoAkAiBGogDCgCBCAEaxCGASIERQ0qIBEgAjYCACAAKAIEIAAoAugCIAAoAoADIAQgACgC7AIgACgCbBEKAEEAIQ4MJAsgACgC7AJFDSMgACgCbEUNIyARIAI2AgBBACEOIAAoAgQgACgC6AIgACgCgANBACAAKALsAiAAKAJsEQoADCMLQQpBEUECIARBDEYbIARBHEYbIQUMLgsgACgCXARAIAAgASACIAwoAgQQhwELIAAgASAMQQRqIAMgBiAHEKYJIgUNLSAMKAIEDSkgAEHXATYCoAJBACEFDC0LAkAgACgC7AMiBCAAKAKMAksNAAJAIAQEQCAEQQBIDSlBASEFIAAgBEEBdCIENgLsAyAAIAAoAugDIARBmy4QmgIiBEUEQCAAIAAoAuwDQQF2NgLsAwwwCyAAIAQ2AugDIAooArgBIgVFDQIgACgC7AMiBEGAgICABE8EQEEBIQUgACAEQQF2NgLsAwwwCyAAIAUgBEECdEGwLhCaAiIEDQFBASEFIAAgACgC7ANBAXY2AuwDDC8LIABBIDYC7AMgACAAQSBBuC4QmAEiBDYC6AMgBA0BIABBADYC7AMMKAsgCiAENgK4AQsgACgC6AMgACgCjAJqQQA6AAAgCi0AoAFFDSIgABClCSIEQQBIDSYgCigCuAEiBUUNDyAFIAooArQBQQJ0aiAENgIAIAogCigCtAFBAWo2ArQBIAooAqQBIARBHGxqQQY2AgAgACgCjAFFDSIMKAsgACgC6AMgACgCjAJqIgQtAABB/ABGDR4gBEEsOgAAIAotAKABRQ0hIAAoAowBRQ0hDCcLIAAoAugDIAAoAowCaiIELQAAIgVBLEYNHQJAIAUNACAKLQCgAUUNACAKKAKkASAKKAK4ASAKKAK0AUECdGpBBGsoAgBBHGxqIgUoAgBBA0YNACAFQQU2AgAgACgCjAFFIQ4LIARB/AA6AAAMHwtBASEFIApBAToAgQEgACgChARFBEAgCiAKLQCCASIEOgCAAQwcCyATIAEgAiABKAJAIgRqIAwoAgQgBGsQhgEiDUUNKSAAIBYgDUEAEJcBIQQgCiAKKAJgNgJcIAAoApgCRQ0ZAkAgCi0AggEEQCAAKAK0AkUNAQwbCyAKLQCBAQ0aCyAERQRAQQshBQwqCyAELQAjDRpBGCEFDCkLIAAoAowBRQ0eIAAgACABIAIgDCgCBBC1BiICNgLwAiACRQ0iIApCADcCsAEgCkEBOgCgAQwkCyAKLQCgAUUNHSAAKAKMAQR/QRQgACgCDBECACIERQ0iIARCADcCBCAEQgA3AgwgBEECQQEgC0EpRhs2AgAgESACNgIAIAAoAgQgACgC8AIoAgAgBCAAKAKMAREFAEEABUEBCyEOIApBADoAoAEMHAsgCi0AoAFFDRwgCigCpAEgCigCuAEgCigCtAFBAnRqQQRrKAIAQRxsakEDNgIAIAAoAowBRQ0cDCILQQIhDgwBC0EDIQ4LIAotAKABRQ0ZIAwoAgQgASgCQGsMAQsgCi0AoAFFDRhBACEOIAwoAgQLIQRBASEFIAAQpQkiC0EASA0hIAtBHGwiCyAKKAKkAWoiDSAONgIEIA1BBDYCACAAIAEgAiAEELUGIgRFDSEgCigCpAEgC2ogBCgCACILNgIIQQAhBANAIAQgC2ogBEEBaiEELQAADQALIAQgCigCqAEiC0F/c0sNISAKIAQgC2o2AqgBIAAoAowBRQ0XDB0LQQEhBQwCC0ECIQUMAQtBAyEFCyAKLQCgAUUNEyAAKAKMASEEIAogCigCtAFBAWsiCzYCtAEgCigCpAEgCigCuAEgC0ECdGooAgBBHGxqIAU2AgQgBEUhDiALDRIgBEUNDEEBIQUgACgC/AIiGCgCsAEiBEHMmbPmAEsNHSAEQRRsIgQgGCgCqAEiC0F/c0sNHSAEIAtqIAAoAgwRAgAiEkUNHSAYKAKwASEEIBJBADYCDCASQRRqIQ0gEiILIARBFGxqIhkhBANAAkAgCyAZSQRAIAsgGCgCpAEiGiALKAIMQRxsaiIUKAIAIgU2AgAgCyAUKAIENgIEIAVBBEYEQCALIAQ2AgggFCgCCCEFA0AgBCAFLQAAIhA6AAAgBUEBaiEFIARBAWohBCAQDQALIAtCADcCDAwCC0EAIQUgC0EANgIIIBQoAhQhECALIA02AhAgCyAQNgIMIBRBDGohFANAIAUgEE8NAiANIBQoAgAiEDYCDCAFQQFqIQUgDUEUaiENIBogEEEcbGpBGGohFCALKAIMIRAMAAsACyARIAI2AgAgACgCBCAAKALwAigCACASIAAoAowBEQUADA4LIAtBFGohCwwACwALQZHTAUGfvQFBxC5Bxf0AEAAAC0G5C0GfvQFB3DZB9Y4BEAAAC0EFIQUMGgsgCiAKKAJgNgJcIABBADYC1AIMDwsgACgCjAFFDQ4MFAsgCi0AgAFFDQ0gACgCkAFFDQ0MEwsgACgCbEUNDAwSCyAKLQCAAUUNCyAAKAKUAUUNCwwRCyAAKAJgRQ0KDBALIARBDkcNCQwPCyAAIAEgAiAMKAIEELQGRQ0MDA4LIAAgASACIAwoAgQQswZFDQsMDQsgCkEANgKoASAKQQA6AKABDAULIAQNACAKIAotAIIBOgCAASALQTxHDQUgACgChAEiBEUNBSAAKAIEIA1BASAEEQUADAsLIAQtACAEQEEMIQUMDwsgBCgCBARAIAAgBCALQTxGQQAQ6QRFDQsMDwsgACgCfARAQQAhDiAKQQA6AIMBIARBAToAICAAIARBqS8QsgYgACgCgAFBACAEKAIUIAQoAhAgBCgCGCAAKAJ8EQgARQRAIAAgBEGtLxCUAyAEQQA6ACAMCAsgACAEQbEvEJQDIARBADoAICAKLQCCASEEIAotAIMBDQEgCiAEOgCAAQwLCyAKIAotAIIBOgCAAQwECyAEQf8BcQ0CIAAoAngiBEUNAiAAKAIEIAQRAgBFDQQMAgtBAiEFDAwLIA8QnAILIA5FDQYLIAAoAlxFDQUgACABIAIgDCgCBBCHAQwFC0EWIQUMCAtBFSEFDAcLQSAhBQwGC0EBIQUMBQsgACgCnAEhAQtBIyEFAkACQAJAAkAgACgC+ANBAWsOAwEHAAILIAYgDCgCBDYCAEEAIQUMBgsgDCgCBCECIAAtAOAEDQQMAQsgDCgCBCECCyABIAIgAyAMQQRqIAEoAgARBgAhBAwBCwsgF0F8IAMgAyABIBcoAgARCABBf0cNAEEdIQUMAQsgBiACNgIAQQAhBQsgDEEQaiQAIAULswIBB38jAEGQCGsiAiQAAkAgACgCiAEiBEUEQEESIQMMAQsDQCADQYACRwRAIAJBBGogA0ECdGpBfzYCACADQQFqIQMMAQsLIAJBADYCjAggAkIANwKECAJAIAAoAoACIAEgAkEEaiAEEQMARQ0AIAAgAEH0DkHjJhCYASIBNgL4ASABRQRAQQEhAyACKAKMCCIARQ0CIAIoAoQIIAARAQAMAgsgASEFIAJBBGohBiACKAKICCEHIAIoAoQIIQggAC0A9AEEfyAFIAYgByAIEMsJBSAFIAYgByAIEMIGCyIBRQ0AIAAgAigChAg2AvwBIAIoAowIIQMgACABNgKcASAAIAM2AoQCQQAhAwwBC0ESIQMgAigCjAgiAEUNACACKAKECCAAEQEACyACQZAIaiQAIAMLTAEBfyMAQRBrIgIkAEGl2QEQ7AQEQCACQQQ2AgwgAiABNgIIIAJBCDYCBCACIAA2AgBBiPYIKAIAQbztBCACECAaCyACQRBqJAAgAQvQBwMLfwJ8AX4jAEEgayIGJAAgACgCiARFBEAgAAJ/AkBBuOwAQQBBABDiCyIBQQBOBEADQCMAQRBrIgIkACACQQQgBGs2AgwgAiAGQQxqIARqNgIIIAEgAkEIakEBIAJBBGoQBBCpAyEFIAIoAgQhAyACQRBqJABBfyADIAUbIgUgBGohAiAFQQBMIgVFIAJBA0txDQIgBCACIAUbIQRB/IALKAIAQRtGDQALIAEQqgcLIAYCfhACIgxEAAAAAABAj0CjIg2ZRAAAAAAAAOBDYwRAIA2wDAELQoCAgICAgICAgH8LIg43AxAgBgJ/IAwgDkLoB365oUQAAAAAAECPQKIiDJlEAAAAAAAA4EFjBEAgDKoMAQtBgICAgHgLNgIYQaupAyAGKAIYQSpzQf////8HbBCvCQwBCyABEKoHQbjsACAGKAIMEK8JCzYCiAQLIAAtAPQBBH8Cf0GwqQghBCAAIgFBjANqIQkgAUG4A2ohByABKAL8AiIIQZgBaiEFIAhB0ABqIQogCEE8aiELA0ACQCAEIQADQEEBIAQtAABFDQMaAkACQCAALQAAIgMEQCADQT1GDQEgA0EMRw0CCyABKALEAyIDIAEoAsADRgRAIAcQX0UNBCABKALEAyEDCyABIANBAWo2AsQDIANBADoAACABIAggASgCyANBABCXASIEBEAgBEEBOgAgCyAALQAAIQQgASABKALIAzYCxAMgACAEQQBHaiEEDAQLIAUhBCABKALEAyICIAEoAsgDRwRAIAEoAsADIAJGBEAgBxBfRQ0EIAEoAsQDIQILIAEgAkEBajYCxAMgAkEAOgAAIAEgCyABKALIA0EIEJcBIgRFDQMgASAEKAIAIgIgASgCyAMiA0YEfyAEIAogAhCzCSICNgIAIAJFDQQgASgCyAMFIAMLNgLEAwsDQAJAIABBAWohAiAALQABIgNFIANBDEZyDQAgASgCxAMiACABKALAA0YEQCAHEF9FDQUgAi0AACEDIAEoAsQDIQALIAEgAEEBajYCxAMgACADOgAAIAIhAAwBCwsgASgCxAMiAyABKALAA0YEQCAHEF9FDQMgASgCxAMhAwsgASADQQFqNgLEAyADQQA6AAAgASAEQQAgASgCyAMgCRC7Bg0CIAEgASgCyAM2AsQDIABBAmogAiAALQABGyEEDAMLIAEoAsQDIgIgASgCwANGBEAgBxBfRQ0CIAAtAAAhAyABKALEAyECCyABIAJBAWo2AsQDIAIgAzoAACAAQQFqIQAMAAsACwtBAAsFQQELIAZBIGokAAvhCgEHfwJAAkACQCAARSACQQBIckUEQCABIAJFcg0BDAILIAANAQwCCwJAAkACQAJAIAAoAvgDDgQCAwEAAwsgAEEhNgKkAgwECyAAQSQ2AqQCDAMLIAAoAvQDDQAgABCwCQ0AIABBATYCpAIMAgsgAEEBNgL4AwJ/AkAgAARAIAJBAEgNAQJAAkACQCAAKAL4A0ECaw4CAQACCyAAQSE2AqQCQQAMBAsgAEEkNgKkAkEADAMLIAAgAjYCNAJAIAAoAiAiCEUNACAAKAIcIgRFDQAgCCAEayEFCwJAIAIgBUoNACAAKAIIRQ0AIAAoAhwMAwtBACEEAkAgACgCHCIFRQ0AIAAoAhgiBkUNACAFIAZrIQQLIAIgBGoiBkEASA0BQYAIAn9BACAAKAIYIgRFDQAaQQAgACgCCCIHRQ0AGiAEIAdrCyIHIAdBgAhOGyIHIAZB/////wdzSg0BIAYgB2ohCgJAAkACQAJAIAAoAggiCUUNACAERSAKIAggCWsiBkEAIAgbSnJFBEAgByAEIAlrTg0EIAkgBCAHayAFIARrIAdqELYBIQUgACAAKAIcIAQgBSAHamsiBGsiBTYCHCAAKAIYIARrIQQMAwsgCEUNACAGDQELQYAIIQYLA0AgCiAGQQF0IgZKIAZBAEpxDQALIAZBAEwNAyAGIAAoAgwRAgAiBEUNAyAAIAQgBmo2AiAgACgCGCIFBEBBACEGIAQgBSAHayAAKAIcIgQgBWtBACAEGyAHahAfIQQgACgCCCAAKAIUEQEAIAAgBDYCCAJAIAAoAhwiBUUNACAAKAIYIghFDQAgBSAIayEGCyAAIAQgB2oiBCAGaiIFNgIcDAELIAAgBDYCCCAAIAQ2AhwgBCEFCyAAIAQ2AhgLIABBADYCsAIgAEIANwOoAgsgBQwBCyAAQQE2AqQCQQALIgRFDQECQCACBEAgAUUNASAEIAEgAhAfGgsCf0EAIQECQCAABEAgAkEASARAIABBKTYCpAIMAgsCQAJAAkACQCAAKAL4Aw4EAgMBAAMLIABBITYCpAIMBAsgAEEkNgKkAgwDCyAAKAIYRQRAIABBKjYCpAIMAwsgACgC9AMNACAAELAJDQAgAEEBNgKkAgwCC0EBIQEgAEEBNgL4AyAAIAM6APwDIAAgACgCGCIFNgKwAiAAIAAoAhwgAmoiBDYCHCAAIAQ2AiggACAAKAIkIAJqNgIkIAACfyAAQRhqIQYgBCAFIgJrQQAgBBtBACACGyEHAkAgAC0AMEUNACAALQD8Aw0AAn9BACAAKAIYIgVFDQAaQQAgACgCCCIIRQ0AGiAFIAhrCyEFIAAoAiwhCAJ/QQAgACgCICIJRQ0AGkEAIAAoAhwiCkUNABogCSAKawshCSAHIAhBAXRPDQAgACgCNCAJIAVBgAhrIghBACAFIAhPG2pLDQAgBiACNgIAQQAMAQsgBiACNgIAAkADQAJAIAAgBigCACAEIAYgACgCoAIRBgAhBSAAKAL4A0EBRwRAIABBADoA4AQMAQsgAC0A4ARFDQAgAEEAOgDgBCAFRQ0BDAILCyAFDQAgAiAGKAIARgRAIAAgBzYCLEEADAILQQAhBSAAQQA2AiwLIAULIgI2AqQCIAIEQCAAQdMBNgKgAiAAIAAoAqgCNgKsAgwCCwJAAkACQCAAKAL4Aw4EAAACAQILIANFDQEgAEECNgL4A0EBDAQLQQIhAQsgACgCnAEiAiAAKAKwAiAAKAIYIABBsANqIAIoAjARBwAgACAAKAIYNgKwAgsgAQwBC0EACw8LQYjUAUGfvQFBjRNB8JIBEAAACyAAQSk2AqQCC0EAC2cBAn9B/IALKAIAIQMgACACEKkJIABBATYCKCAAIAE2AgACQCACKAIUIgQEQCAAIAQgAigCDEECdGooAgBGDQELIABCATcCIAsgACABQQBHQZDeCigCAEEASnE2AhhB/IALIAM2AgALXgECfwNAIAAoAgwiAiAAKAIIRgRAIAAQX0UEQEEADwsgACgCDCECCyABLQAAIQMgACACQQFqNgIMIAIgAzoAACABLQAAIAFBAWohAQ0ACyAAKAIQIAAgACgCDDYCEAv5BAEFfyMAQRBrIgMkACAABEAgACgChAMhAQNAAkAgAUUEQCAAKAKIAyIBRQ0BIABBADYCiAMLIAEoAgAgACABKAIkQZYPEGcgASgCLCAAELoGIAAgAUGYDxBnIQEMAQsLIAAoArQCIQEDQAJAIAFFBEAgACgCuAIiAUUNASAAQQA2ArgCCyABKAIIIAAgAUGmDxBnIQEMAQsLIAAoArwCIQEDQAJAIAFFBEAgACgCwAIiAUUNASAAQQA2AsACCyABKAIIIAAgAUG0DxBnIQEMAQsLIAAoAsQCIQEDQAJAIAFFBEAgACgCyAIiAUUNASAAQQA2AsgCCyABKAIIIAAgAUHCDxBnIQEMAQsLIAAoApADIAAQugYgACgCjAMgABC6BiAAQbgDahDrBCAAQdADahDrBCAAIAAoAvABQcgPEGcCQCAALQCABA0AIAAoAvwCIgJFDQAgACgC9AMgAyACKAIUIgE2AgggAkEUaiADIAEEfyABIAIoAhxBAnRqBUEACzYCDANAIANBCGoQvAYiAQRAIAEoAhBFDQEgACABKAIUQZw7EGcMAQsLIAIQkAQgAkGEAWoQkAQQkAQgAkEoahCQBCACQTxqEJAEIAJB0ABqEOsEIAJB6ABqEOsERQRAIAAgAigCuAFBqDsQZyAAIAIoAqQBQak7EGcLIAAgAkGrOxBnCyAAIAAoAqADQdIPEGcgACAAKALoA0HWDxBnIAAoAgggACgCFBEBACAAIAAoAjhB2w8QZyAAIAAoAqQDQdwPEGcgACAAKAL4AUHdDxBnIAAoAoQCIgEEQCAAKAL8ASABEQEACyAAIABB4A8QZwsgA0EQaiQAC60BAgJ+AX8CQAJAIAAEQCABUA0BAkAgACkDsAQiBEJ/hSABWgRAQQEhBSABIAR8IgMgACkDyARUDQEgA1ANBCAAKgLEBCADtSAAKQOQBLWVXUUNAQtBACEFIAAoAsAERQ0AIABBKyABIAMgAyACEJEECyAFDwtBwNQBQZ+9AUGvBkH6mwEQAAALQbuXA0GfvQFBsAZB+psBEAAAC0HdlgNBn70BQbwGQfqbARAAAAsgACAAKAIAQTRqECQEQEGdxgNByfIAQdoBQc40EAAACwuZAgEBfwJAAkACQAJAAkACQAJAAkACQCABQQtrDgYCBwMHCAEACyABQRprDgMEBgMFCyAEIAIgBCgCQEEBdGogA0HmpgggBCgCGBEGAARAIABBpQE2AgBBCw8LIAQgAiAEKAJAQQF0aiADQe2mCCAEKAIYEQYABEAgAEGmATYCAEEhDwsgBCACIAQoAkBBAXRqIANB9aYIIAQoAhgRBgAEQCAAQacBNgIAQScPCyAEIAIgBCgCQEEBdGogA0H9pgggBCgCGBEGAEUNBSAAQagBNgIAQREPC0E3DwtBOA8LQTwPCyAAQakBNgIAQQMPCyABQXxGDQELIAFBHEYEQEE7IQUgACgCEEUNAQsgAEGeATYCAEF/IQULIAULnQEBAX8CQAJAIAJFDQAgABBLIAAQJGsgAkkEQCAAIAIQvQELIAAQJCEDIAAQKARAIAAgA2ogASACEB8aIAJBgAJPDQIgACAALQAPIAJqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABBlwJBxOoAEAAACyAAKAIAIANqIAEgAhAfGiAAIAAoAgQgAmo2AgQLDwtBks4BQaD8AEGVAkHE6gAQAAALlgEBAn8gAkELNgIAQQEhAwJAIAEgAGtBBkcNACAALQAADQAgAC0AASIBQfgARgR/QQAFIAFB2ABHDQFBAQshASAALQACDQAgAC0AAyIEQe0ARwRAIARBzQBHDQFBASEBCyAALQAEDQAgAC0ABSIAQewARwRAIABBzABHDQFBAA8LQQAhAyABDQAgAkEMNgIAQQEhAwsgAwtOAQJ/AkBBMBBPIgIEQCACQYCAATYCDCACQYKAARBPIgM2AgQgA0UNASACQQE2AhQgAiAAIAEQsgkgAg8LQcCqAxCdAgALQcCqAxCdAgALgAMBBn8CQCACIAFrIgVBAkgNAAJAAkACQAJAAkACQAJAAkACfyABLQAAIgZFBEAgACABLQABIgRqLQBIDAELIAbAIAEsAAEiBBArC0H/AXEiCEEVaw4KAwIHAgcHBwcBAwALIAhBBmsOBQQDBgICBgsgBEEDdkEccSAGQaCACGotAABBBXRyQbDzB2ooAgAgBHZBAXFFDQULIABByABqIQkCQAJAA0AgAiABIgBBAmoiAWsiBUECSA0IIAAtAAMhBAJAAkACQAJ/IAAtAAIiBkUEQCAEIAlqLQAADAELIAbAIATAECsLQf8BcSIIQRJrDgwFCgoKAwoDAwMDCgEACyAIQQZrDgIBAwkLIARBA3ZBHHEgBkGggghqLQAAQQV0ckGw8wdqKAIAIAR2QQFxDQEMCAsLIAVBAkYNBQwGCyAFQQRJDQQMBQsgAEEEaiEBQRwhBwwEC0EWIQcMAwsgBUEESQ0BDAILIAVBAkcNAQtBfg8LIAMgATYCACAHDwtBfwutBQEHfyMAQRBrIggkAEF/IQkCQCACIAFrIgZBAkgNAAJAAkACQAJAAkACQAJAAn8gAS0AACIHRQRAIAAgAS0AASIFai0ASAwBCyAHwCABLAABIgUQKwtB/wFxIgRBBWsOAwUBAgALAkAgBEEWaw4DAwUDAAsgBEEdRw0EIAVBA3ZBHHEgB0GggAhqLQAAQQV0ckGw8wdqKAIAIAV2QQFxDQIMBAsgBkECRw0DDAILIAZBBE8NAgwBCyAAQcgAaiEGIAEhBAJAAkACQAJAAkADQCACIAQiAEECaiIEayIHQQJIDQkgAC0AAyEFAkACQAJ/IAAtAAIiCkUEQCAFIAZqLQAADAELIArAIAXAECsLQf8BcUEGaw4YAQMHBAQHBwcHBQcHBwcHBAIHAgICAgcABwsgBUEDdkEccSAKQaCCCGotAABBBXRyQbDzB2ooAgAgBXZBAXENAQwGCwsgB0ECRg0FDAQLIAdBBEkNBAwDCyABIAQgCEEMahC5CUUNAiAAQQRqIQADQCACIAAiAWsiBEECSA0HIAEtAAEhAAJAAkACQAJAAkACfyABLAAAIgVFBEAgACAGai0AAAwBCyAFIADAECsLQf8BcQ4QAgIEBAQEAAECBAQEBAQEAwQLIARBAkYNCCABQQNqIQAMBAsgBEEESQ0HIAFBBGohAAwDCyADIAE2AgAMCAsgAiABQQJqIgBrQQJIDQggAC0AAA0BIAEtAANBPkcNASADIAFBBGo2AgAMAwsgAUECaiEADAALAAsgASAEIAhBDGoQuQlFDQEgAiAAQQRqIgRrQQJIDQUgAC0ABA0BIAAtAAVBPkcNASADIABBBmo2AgALIAgoAgwhCQwECyADIAQ2AgAMAgtBfiEJDAILIAMgATYCAAtBACEJCyAIQRBqJAAgCQutAgEFf0F/IQQCQAJAIAIgAWtBAkgNAAJAIAEtAAANACABLQABQS1HDQAgAEHIAGohByABQQJqIQADQCACIAAiAWsiBkECSA0CIAEtAAEhAAJAAkACQAJAAkACfyABLAAAIghFBEAgACAHai0AAAwBCyAIIADAECsLQf8BcSIADgkGBgMDAwMAAQYCCyAGQQJGDQcgAUEDaiEADAQLIAZBBEkNBiABQQRqIQAMAwsgAEEbRg0BCyABQQJqIQAMAQsgAiABQQJqIgBrQQJIDQIgAC0AAA0AIAEtAANBLUcNAAsgAiABQQRqIgBrQQJIDQEgAC0AAARAIAAhAQwBCyABQQZqIAAgAS0ABUE+RiIAGyEBQQ1BACAAGyEFCyADIAE2AgAgBSEECyAEDwtBfguNAgEDfyABQcgAaiEGA0AgAyACIgFrIgJBAkgEQEF/DwsgAS0AASEFAkACQAJAAkACQAJAAkACfyABLAAAIgdFBEAgBSAGai0AAAwBCyAHIAXAECsLIgVB/wFxDg4DAwUFBQUAAQMFBQUCAgULIAJBAkYNBSABQQNqIQIMBgsgAkEESQ0EIAFBBGohAgwFCyABQQJqIQIgACAFRw0EIAMgAmtBAkgEQEFlDwsgBCACNgIAIAEtAAMhAAJ/IAEsAAIiAUUEQCAAIAZqLQAADAELIAEgAMAQKwtB/wFxIgBBHktBASAAdEGAnMCBBHFFcg0BQRsPCyAEIAE2AgALQQAPCyABQQJqIQIMAQsLQX4LlgEBAn8gAkELNgIAQQEhAwJAIAEgAGtBBkcNACAALQABDQAgAC0AACIBQfgARgR/QQAFIAFB2ABHDQFBAQshASAALQADDQAgAC0AAiIEQe0ARwRAIARBzQBHDQFBASEBCyAALQAFDQAgAC0ABCIAQewARwRAIABBzABHDQFBAA8LQQAhAyABDQAgAkEMNgIAQQEhAwsgAwukAQECfwJAAkAgACgCFCIBRQRAIABBBBBPIgE2AhQgAUUNASABQQA2AgAgAEKAgICAEDcCDA8LIAAoAgwgACgCECICQQFrTwRAIAAgASACQQhqIgJBAnQQaiIBNgIUIAFFDQIgASAAKAIQQQJ0aiIBQgA3AgAgAUIANwIYIAFCADcCECABQgA3AgggACACNgIQCw8LQeyqAxCdAgALQeyqAxCdAgALgAMBBn8CQCACIAFrIgVBAkgNAAJAAkACQAJAAkACQAJAAkACfyABLQABIgZFBEAgACABLQAAIgRqLQBIDAELIAbAIAEsAAAiBBArC0H/AXEiCEEVaw4KAwIHAgcHBwcBAwALIAhBBmsOBQQDBgICBgsgBEEDdkEccSAGQaCACGotAABBBXRyQbDzB2ooAgAgBHZBAXFFDQULIABByABqIQkCQAJAA0AgAiABIgBBAmoiAWsiBUECSA0IIAAtAAIhBAJAAkACQAJ/IAAtAAMiBkUEQCAEIAlqLQAADAELIAbAIATAECsLQf8BcSIIQRJrDgwFCgoKAwoDAwMDCgEACyAIQQZrDgIBAwkLIARBA3ZBHHEgBkGggghqLQAAQQV0ckGw8wdqKAIAIAR2QQFxDQEMCAsLIAVBAkYNBQwGCyAFQQRJDQQMBQsgAEEEaiEBQRwhBwwEC0EWIQcMAwsgBUEESQ0BDAILIAVBAkcNAQtBfg8LIAMgATYCACAHDwtBfwutBQEHfyMAQRBrIggkAEF/IQkCQCACIAFrIgZBAkgNAAJAAkACQAJAAkACQAJAAn8gAS0AASIHRQRAIAAgAS0AACIFai0ASAwBCyAHwCABLAAAIgUQKwtB/wFxIgRBBWsOAwUBAgALAkAgBEEWaw4DAwUDAAsgBEEdRw0EIAVBA3ZBHHEgB0GggAhqLQAAQQV0ckGw8wdqKAIAIAV2QQFxDQIMBAsgBkECRw0DDAILIAZBBE8NAgwBCyAAQcgAaiEGIAEhBAJAAkACQAJAAkADQCACIAQiAEECaiIEayIHQQJIDQkgAC0AAiEFAkACQAJ/IAAtAAMiCkUEQCAFIAZqLQAADAELIArAIAXAECsLQf8BcUEGaw4YAQMHBAQHBwcHBQcHBwcHBAIHAgICAgcABwsgBUEDdkEccSAKQaCCCGotAABBBXRyQbDzB2ooAgAgBXZBAXENAQwGCwsgB0ECRg0FDAQLIAdBBEkNBAwDCyABIAQgCEEMahC/CUUNAiAAQQRqIQADQCACIAAiAWsiBEECSA0HIAEtAAAhAAJAAkACQAJAAkACfyABLAABIgVFBEAgACAGai0AAAwBCyAFIADAECsLQf8BcQ4QAgIEBAQEAAECBAQEBAQEAwQLIARBAkYNCCABQQNqIQAMBAsgBEEESQ0HIAFBBGohAAwDCyADIAE2AgAMCAsgAiABQQJqIgBrQQJIDQggAS0AAw0BIAAtAABBPkcNASADIAFBBGo2AgAMAwsgAUECaiEADAALAAsgASAEIAhBDGoQvwlFDQEgAiAAQQRqIgRrQQJIDQUgAC0ABQ0BIAAtAARBPkcNASADIABBBmo2AgALIAgoAgwhCQwECyADIAQ2AgAMAgtBfiEJDAILIAMgATYCAAtBACEJCyAIQRBqJAAgCQutAgEFf0F/IQQCQAJAIAIgAWtBAkgNAAJAIAEtAAENACABLQAAQS1HDQAgAEHIAGohCCABQQJqIQADQCACIAAiAWsiBkECSA0CIAEtAAAhBwJAAkACQAJAAkACfyABLAABIgBFBEAgByAIai0AAAwBCyAAIAfAECsLQf8BcSIADgkGBgMDAwMAAQYCCyAGQQJGDQcgAUEDaiEADAQLIAZBBEkNBiABQQRqIQAMAwsgAEEbRg0BCyABQQJqIQAMAQsgAiABQQJqIgBrQQJIDQIgAS0AAw0AIAAtAABBLUcNAAsgAiABQQRqIgBrQQJIDQEgAS0ABQRAIAAhAQwBCyABQQZqIAAgAS0ABEE+RiIAGyEBQQ1BACAAGyEFCyADIAE2AgAgBSEECyAEDwtBfguNAgEDfyABQcgAaiEGA0AgAyACIgFrIgJBAkgEQEF/DwsgAS0AACEFAkACQAJAAkACQAJAAkACfyABLAABIgdFBEAgBSAGai0AAAwBCyAHIAXAECsLIgVB/wFxDg4DAwUFBQUAAQMFBQUCAgULIAJBAkYNBSABQQNqIQIMBgsgAkEESQ0EIAFBBGohAgwFCyABQQJqIQIgACAFRw0EIAMgAmtBAkgEQEFlDwsgBCACNgIAIAEtAAIhAAJ/IAEsAAMiAUUEQCAAIAZqLQAADAELIAEgAMAQKwtB/wFxIgBBHktBASAAdEGAnMCBBHFFcg0BQRsPCyAEIAE2AgALQQAPCyABQQJqIQIMAQsLQX4LBABBAAuBAQECfyACQQs2AgBBASEDAkAgASAAa0EDRw0AIAAtAAAiAUH4AEYEf0EABSABQdgARw0BQQELIQEgAC0AASIEQe0ARwRAIARBzQBHDQFBASEBCyAALQACIgBB7ABHBEAgAEHMAEcNAUEADwtBACEDIAENACACQQw2AgBBASEDCyADC+QDAQV/QQEhBAJAIAIgAWsiBUEATA0AAkACQAJAAkACQAJAAkACQCAAQcgAaiIIIAEtAABqLQAAIgdBBWsOFAIDBAYBAQYGBgYGBgYGBgYBBQYFAAsgB0EeRw0FC0EWIQYMBAsgBUEBRg0EIAAgASAAKALgAhEAAA0DIAAgASAAKALUAhEAAEUNA0ECIQQMAgsgBUEDSQ0DIAAgASAAKALkAhEAAA0CIAAgASAAKALYAhEAAEUNAkEDIQQMAQsgBUEESQ0CIAAgASAAKALoAhEAAA0BIAAgASAAKALcAhEAAEUNAUEEIQQLIAEgBGohAQNAIAIgAWsiBUEATA0DQQEhBAJAAkACQCAIIAEtAABqLQAAIgdBEmsOCgIEBAQBBAEBAQEACwJAAkACQCAHQQVrDgMAAQIGCyAFQQFGDQYgACABIAAoAuACEQAADQUgACABIAAoAsgCEQAARQ0FQQIhBAwCCyAFQQNJDQUgACABIAAoAuQCEQAADQQgACABIAAoAswCEQAARQ0EQQMhBAwBCyAFQQRJDQQgACABIAAoAugCEQAADQMgACABIAAoAtACEQAARQ0DQQQhBAsgASAEaiEBDAELCyABQQFqIQFBHCEGCyADIAE2AgAgBg8LQX4PC0F/C7QGAQd/IwBBEGsiByQAQQEhBUF/IQgCQCACIAFrIgRBAEwNAAJAAkACQAJAAkACQAJAAkAgAEHIAGoiCiABLQAAai0AACIGQQVrDgMBAgMACwJAIAZBFmsOAwQGBAALDAULIARBAUYNAyAAIAEgACgC4AIRAAANBCAAIAEgACgC1AIRAABFDQRBAiEFDAILIARBA0kNAiAAIAEgACgC5AIRAAANAyAAIAEgACgC2AIRAABFDQNBAyEFDAELIARBBEkNASAAIAEgACgC6AIRAAANAiAAIAEgACgC3AIRAABFDQJBBCEFCyABIAVqIQQDQCACIARrIglBAEwNBEEBIQUgBCEGAkACQAJAAkACQAJAAkACQAJAAkAgCiAELQAAai0AAEEFaw4ZAAECBwMDBwcHBwQHBwcHBwMJBwkJCQkHBQcLIAlBAUYNCiAAIAQgACgC4AIRAAANBCAAIAQgACgCyAIRAABFDQRBAiEFDAgLIAlBA0kNCSAAIAQgACgC5AIRAAANAyAAIAQgACgCzAIRAABFDQNBAyEFDAcLIAlBBEkNCCAAIAQgACgC6AIRAAANAiAAIAQgACgC0AIRAABFDQJBBCEFDAYLIAEgBCAHQQxqEMYJRQ0BIARBAWohBQNAIAIgBSIBayIGQQBMDQsCQAJAAkACQAJAIAogAS0AAGotAAAOEAoKBAQEAAECCgQEBAQEBAMECyAGQQFGDQwgACABIAAoAuACEQAADQkgAUECaiEFDAQLIAZBA0kNCyAAIAEgACgC5AIRAAANCCABQQNqIQUMAwsgBkEESQ0KIAAgASAAKALoAhEAAA0HIAFBBGohBQwCCyACIAFBAWoiBWtBAEwNDCAFLQAAQT5HDQEgAyABQQJqNgIAIAcoAgwhCAwMCyABQQFqIQUMAAsACyABIAQgB0EMahDGCQ0BCyADIAQ2AgAMBwsgAiAEQQFqIgZrQQBMDQcgBC0AAUE+Rw0AIAMgBEECajYCACAHKAIMIQgMBwsgAyAGNgIADAULIAMgATYCAAwECyAEIAVqIQQMAAsAC0F+IQgMAgsgAyABNgIAC0EAIQgLIAdBEGokACAIC7QCAQR/AkAgAiABa0EATA0AAkACQAJAIAEtAABBLUcNACAAQcgAaiEGIAFBAWohBANAIAIgBCIBayIEQQBMDQQCQAJAAkACQAJAAkAgBiABLQAAai0AACIHDgkHBwQEBAABAgcDCyAEQQFGDQggACABIAAoAuACEQAADQYgAUECaiEEDAULIARBA0kNByAAIAEgACgC5AIRAAANBSABQQNqIQQMBAsgBEEESQ0GIAAgASAAKALoAhEAAA0EIAFBBGohBAwDCyAHQRtGDQELIAFBAWohBAwBCyACIAFBAWoiBGtBAEwNBCAELQAAQS1HDQALQX8hBSACIAFBAmoiAGtBAEwNASABQQNqIAAgAS0AAkE+RiIAGyEBQQ1BACAAGyEFCyADIAE2AgALIAUPC0F+DwtBfwuNAgEDfyABQcgAaiEGAkACQANAIAMgAmsiBUEATARAQX8PCwJAAkACQAJAAkACQCAGIAItAABqLQAAIgcODgUFBAQEAAECBQQEBAMDBAsgBUEBRg0HIAEgAiABKALgAhEAAA0EIAJBAmohAgwFCyAFQQNJDQYgASACIAEoAuQCEQAADQMgAkEDaiECDAQLIAVBBEkNBSABIAIgASgC6AIRAAANAiACQQRqIQIMAwsgAkEBaiECIAAgB0cNAiADIAJrQQBMBEBBZQ8LIAQgAjYCACAGIAItAABqLQAAIgBBHktBASAAdEGAnMCBBHFFcg0DQRsPCyACQQFqIQIMAQsLIAQgAjYCAAtBAA8LQX4LHAAgACABIAIgAxDCBiIABEAgAEEXOgCCAQsgAAscAEHfACAAIAEgAiADIAQgBSAGIAcgCCAJEM4JCxEAIAAgASACQd4AQd0AEKsKC8QEAQJ/IwBBEGsiCyQAIAtBADYCCCALQQA2AgQgC0EANgIAIAsgAyACKAJAIgxBBWxqIgM2AgwCfwJAAkAgAiADIAQgDEEBdGsiDCALQQRqIAsgC0EIaiALQQxqEMAGRQ0AIAsoAgQiBEUNAAJAAkAgCgJ/AkACQAJAIAIgBCALKAIAIgNBtJMIIAIoAhgRBgBFBEAgAQ0BDAgLIAYEQCAGIAsoAgg2AgALIAsoAgwhAyAHBEAgByADNgIACyACIAMgDCALQQRqIAsgC0EIaiALQQxqEMAGRQ0GIAsoAgQiBEUNASALKAIAIQMLIAIgBCADQbyTCCACKAIYEQYABEAgAiALKAIIIgQgDBDjAkFfcUHBAGtBGUsNByAIBEAgCCAENgIACyALKAIMIQMgCQRAIAkgAiAEIAMgAigCQGsgABEDADYCAAsgAiADIAwgC0EEaiALIAtBCGogC0EMahDABkUNBiALKAIEIgRFDQUgCygCACEDCyABIAIgBCADQcWTCCACKAIYEQYARXINBiACIAsoAggiBCALKAIMIgMgAigCQGtB0JMIIAIoAhgRBgBFDQEgCkUNA0EBDAILIAENBAwDCyACIAQgAyACKAJAa0HUkwggAigCGBEGAEUNBCAKRQ0BQQALNgIACwNAIAIgAyAMEOMCQQlrIgBBF0tBASAAdEGTgIAEcUVyRQRAIAMgAigCQGohAwwBCwsgDCADIgRHDQILQQEMAgsgCygCDCEECyAFIAQ2AgBBAAsgC0EQaiQACxwAQdwAIAAgASACIAMgBCAFIAYgByAIIAkQzgkL/QEBAX8gAEHIAGohBANAIAIgAWtBAEoEQAJAAkACQAJAAkACQCAEIAEtAABqLQAAQQVrDgYAAQIFBAMFCyADIAMoAgRBAWo2AgQgAUECaiEBDAYLIAMgAygCBEEBajYCBCABQQNqIQEMBQsgAyADKAIEQQFqNgIEIAFBBGohAQwECyADQQA2AgQgAyADKAIAQQFqNgIAIAFBAWohAQwDCyADIAMoAgBBAWo2AgACfyACIAFBAWoiAGtBAEwEQCAADAELIAFBAmogACAEIAEtAAFqLQAAQQpGGwshASADQQA2AgQMAgsgAyADKAIEQQFqNgIEIAFBAWohAQwBCwsLeQEDfwJAA0ACQCABLQAAIQMgAC0AACECQQEhBCABQQFqIQEgAEEBaiEAQQEgAkEgayACIAJB4QBrQf8BcUEaSRtB/wFxIgJFQQF0IAIgA0EgayADIANB4QBrQf8BcUEaSRtB/wFxRxtBAWsOAgACAQsLQQAhBAsgBAtBAQF/AkAgAEUEQEEGIQEMAQsDQCABQQZGBEBBfw8LIAAgAUECdEGQhwhqKAIAENEJDQEgAUEBaiEBDAALAAsgAQtlAQJ/An9BACAAKAIQKAIIIgFFDQAaIAEoAlgiAgRAIAIQjgpBACAAKAIQKAIIIgFFDQEaCyABKAJcEBggACgCECgCCAsQGCAAKAIQIgJBADYCCCACKAIMELwBIABBAEHiJRC3Bwv3AQEEfyABIAAQSyIDaiICIANBAXRBgAggAxsiASABIAJJGyECIAAQJCEEAkAgAC0AD0H/AUYEQAJ/IAAoAgAhBCMAQSBrIgUkAAJAIAMiAUF/RwRAAkAgAkUEQCAEEBhBACEDDAELIAQgAhBqIgNFDQIgASACTw0AIAEgA2pBACACIAFrEDgaCyAFQSBqJAAgAwwCC0GOwANB0vwAQc0AQb2zARAAAAsgBSACNgIQQYj2CCgCAEH16QMgBUEQahAgGhAvAAshAQwBCyACQQEQGiIBIAAgBBAfGiAAIAQ2AgQLIABB/wE6AA8gACACNgIIIAAgATYCAAvRAwICfwJ8IwBBMGsiAyQAIANBADoAHwJAIAAgARAnIgBFDQAgAyADQR9qNgIYIAMgA0EgajYCFCADIANBKGo2AhACQAJAIABBgL8BIANBEGoQUUECSA0AIAMrAygiBUQAAAAAAAAAAGRFDQAgAysDICIGRAAAAAAAAAAAZEUNACACAn8gBUQAAAAAAABSQKIiBUQAAAAAAADgP0QAAAAAAADgvyAFRAAAAAAAAAAAZhugIgWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4C7c5AwACfyAGRAAAAAAAAFJAoiIFRAAAAAAAAOA/RAAAAAAAAOC/IAVEAAAAAAAAAABmG6AiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLtyEFDAELIANBADoAHyADIANBKGo2AgAgAyADQR9qNgIEIABBhL8BIAMQUUEATA0BIAMrAygiBUQAAAAAAAAAAGRFDQEgAgJ/IAVEAAAAAAAAUkCiIgVEAAAAAAAA4D9EAAAAAAAA4L8gBUQAAAAAAAAAAGYboCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAu3IgU5AwALIAIgBTkDCCADLQAfQSFGIQQLIANBMGokACAEC0sAIABBASABQQAQ0gMiAUUEQEHnBw8LIAAgASgCECIBKAIENgKwASAAIAEoAgw2AqQBIAAgASgCADYCqAEgACABKAIQNgKsAUGsAgvzAgIEfwZ8IwBBIGsiAyQAIAIoAjQiBARAIAEoAhAiBSsAECEHIAIrABAhCCACKwAgIQkgBCACKwAoIAIrABigRAAAAAAAAOA/oiAFKwAYoDkDQCAEIAcgCSAIoEQAAAAAAADgP6KgOQM4IABBCiAEEJADIAAgARD0BBoLIAEoAhAiBCsDGCEHIAQrAxAhCEEAIQQDQCACKAIwIARKBEAgBARAIAIoAjggBEECdGoiBigCACEFAnwgAi0AQARAIAMgBSkDEDcDACADIAUpAxg3AwggBigCACsDKCEJIAMrAwAiCiELIAMrAwgMAQsgAyAFKQMgNwMQIAMgBSkDKDcDGCAGKAIAKwMQIQsgAysDECEKIAMrAxgiCQshDCADIAcgCaA5AxggAyAIIAqgOQMQIAMgByAMoDkDCCADIAggC6A5AwAgACADQQIQPQsgACABIAIoAjggBEECdGooAgAQ1wkgBEEBaiEEDAELCyADQSBqJAALUwECfwJAIAAoAjwiAkUNACACIAEQPkUNACAADwtBACECA0AgACgCMCACTARAQQAPCyACQQJ0IAJBAWohAiAAKAI4aigCACABENgJIgNFDQALIAMLOQEBfyAAQeDbCigCAEHx/wQQjwEiAi0AAAR/IAIFIABB3NsKKAIAQfH/BBCPASIAIAEgAC0AABsLC+sEAQZ/AkAgAEH82wooAgBB8f8EEI8BIgItAABFBEAMAQsgAhDDAyIHIQIDQCACKAIAIgZFDQEgBkGurQEQPgRAIAJBBGohAiAEQQFyIQQMAQsgAiEDIAZB2a4BED4EQANAIAMgAygCBCIFNgIAIANBBGohAyAFDQALIARBBHIhBAwBCyAGQZEtED4EQANAIAMgAygCBCIFNgIAIANBBGohAyAFDQALIARBCHIhBAwBCyAGQbMtED4EQCACQQRqIQIgBEEgciEEDAELIAZB/vEAED4EQANAIAMgAygCBCIFNgIAIANBBGohAyAFDQALIARBA3IhBAwBCwJAIAZBrKwBED5FDQAgACgCECgCCCgCCCIFRQ0AIAUoAghBBEcNACAFKwMQEKcHmUQAAAAAAADgP2NFDQAgBSkDGEIAUg0AIAUpAyBCAFINAANAIAMgAygCBCIFNgIAIANBBGohAyAFDQALIARBwAByIQQMAQsCQCAGQcSuARA+RQ0AIAAoAhAoAggoAggiBUUNACAFKAIIQQJLDQADQCADIAMoAgQiBTYCACADQQRqIQMgBQ0ACyAEQYAEciEEDAELIAJBBGohAgwACwALIAEgACgCECgCCCgCCCIABH8gBEGA4B9xRSAAKAAoIgBBgOAfcUVyRQRAQeKbA0HeuQFBvgNBmzcQAAALIAAgBHIiAkGA4B9xIABBAXEgBEEBcXJyIAJBAnFyIAJBBHFyIAJBCHFyIAJBEHFyIAJBIHFyIAJBwABxciACQYABcXIgAkGAAnFyIAJBgARxciACQYAIcXIgAkGAEHFyBSAECzYCACAHC6YBAgF/BHwjAEEgayICJAAgASgCECIBKwAQIQMgASsDYCEFIAIgASsDUEQAAAAAAADoP6JEAAAAAAAA4D+iIgQgASsAGKAiBjkDGCACIAY5AwggAiADIAVEfGEyVTAq5T+iIgOgIgU5AwAgAiAFIAMgA6ChOQMQIAAgAkECED0gAiACKwMIIAQgBKChIgQ5AxggAiAEOQMIIAAgAkECED0gAkEgaiQACwwAIABBOhDNAUEARwtgACAAQQA2AgAgAiAAENoJIgAEQCABIAAQ5QELAkBBvNwKKAIAIgBFDQAgAiAAEEUiAEUNACAALQAARQ0AIAEgAkG83AooAgBEAAAAAAAA8D9EAAAAAAAAAAAQTBCHAgsLBABBAAswAQF/IwBBEGsiAiQAIAAQISEAIAIgATYCBCACIAA2AgBB/bYEIAIQKiACQRBqJAALNwEDfwNAIAFBA0cEQCAAIAFBAnRqIgIoAgAiAwRAIAMQmQEaIAJBADYCAAsgAUEBaiEBDAELCwt8ACAAQgA3AwAgAEIANwMIAkACQAJAAkAgAkEBaw4DAgEDAAsgACABKQMANwMAIAAgASkDCDcDCA8LIAAgASsDADkDACAAIAErAwiaOQMIDwsgACABKwMAOQMIIAAgASsDCJo5AwAPCyAAIAErAwA5AwggACABKwMIOQMAC7ECAgl/AnwjAEEQayIFJAAgACACOgBBIAErAwghDCAAIAErAwAiDTkDECAAIAw5AyggACAMIAArAwihOQMYIAAgDSAAKwMAoDkDICAAKAIwIgRBACAEQQBKGyEHQQ5BDyAEQQFrIgYbIQhBDUEPIAYbIQkDQCADIAdGRQRAAn9BACACRQ0AGiAALQBABEAgCSADRQ0BGkEHQQUgAyAGRhsMAQsgCCADRQ0AGkELQQogAyAGRhsLIQQgA0ECdCIKIAAoAjhqKAIAIAUgASkDCDcDCCAFIAEpAwA3AwAgBSACIARxEOIJIAAoAjggCmooAgAhBAJAIAAtAEAEQCABIAErAwAgBCsDAKA5AwAMAQsgASABKwMIIAQrAwihOQMICyADQQFqIQMMAQsLIAVBEGokAAvzAgIFfAN/IwBBIGsiCCQAIAFBCGorAwAhBSAAKwMAIQQgASsDACEGIAAgASkDADcDACAAKwMIIQMgACABKQMINwMIIAUgA6EhAyAGIAShIQQCQCACDQAgACgCNCIBRQ0AIAEgBCABKwMooDkDKCABIAMgASsDMKA5AzALAkAgACgCMCIJRQ0AIAQgAyAALQBAGyAJt6MhB0EAIQEDQCABIAlODQECfyAHIAG4oiIDmUQAAAAAAADgQWMEQCADqgwBC0GAgICAeAshCQJ/IAcgAUEBaiIKuKIiA5lEAAAAAAAA4EFjBEAgA6oMAQtBgICAgHgLIAlrIQkgACgCOCABQQJ0aigCACEBAnwgAC0AQARAIAUhBCABKwMAIAm3oAwBCyABKwMIIAm3oCEEIAYLIQMgCCAEOQMYIAggCCkDGDcDCCAIIAM5AxAgCCAIKQMQNwMAIAEgCCACEOMJIAAoAjAhCSAKIQEMAAsACyAIQSBqJAALjAMCBHwCfyMAQSBrIgckAAJAIAIoAjQiCARAIAgrAxgiBEQAAAAAAAAAAGQgCCsDICIDRAAAAAAAAAAAZHJFDQEgAUHX5AAQJyIBBEAgByAHQRhqNgIEIAcgB0EIajYCACABQdyDASAHEFEiAUEASgRAIAcrAwhEAAAAAAAAUkCiIgUgBaAiBSAEoCEEIAFBAUcEQCAHKwMYRAAAAAAAAFJAoiIFIAWgIAOgIQMMBAsgBSADoCEDDAMLIANEAAAAAAAAIECgIQMgBEQAAAAAAAAwQKAhBAwCCyADRAAAAAAAACBAoCEDIAREAAAAAAAAMECgIQQMAQtBACEIA0AgCCACKAIwTkUEQCAHQQhqIAEgAigCOCAIQQJ0aigCABDkCSAHKwMQIQUgBysDCCEGAnwgAi0AQARAIAYgBKAhBCADIAUQIwwBCyAEIAYQIyEEIAUgA6ALIQMgCEEBaiEIDAELCwsgACADOQMIIAAgBDkDACACIAApAwA3AwAgAiAAKQMINwMIIAdBIGokAAtoAQJ/IABBAiABIAFBA0YbIgMgAhDoCSIBRQRADwsgA0ECdCIDIAAoAkxqKAIsIgQgAUECIAQoAgARAwAaIAAoAkwgA2ooAjgiAyABQQIgAygCABEDABogACABKAIYQQAQjAEaIAEQGAtAAQF/AkADQAJAAkAgACgCABCtAiIBQQFqDg8DAQEBAQEBAQEBAgICAgIACyABQSBGDQELCyABIAAoAgAQ0wsLC8ABAQF8IAFBpeUAED4EQCAARAAAAAAAAFJAohAyDwsgAUGXEhA+BEAgAEQAAAAAAABSQKJEAAAAAAAAWECjEDIPCyABQZazARA+BEAgAEQAAAAAAABSQKJEAAAAAAAAGECjEDIPCwJAIAFB3xwQPkUEQCABQY/HAxA+RQ0BCyAAEDIPCyABQe7sABA+BEAgAER8XElisVg8QKIQMg8LIAFBz+wAED4EfCAARC99B7VarQZAohAyBUQAAAAAAAAAAAsLRwEBfyMAQSBrIgMkACAAKAJMQQIgASABQQNGG0ECdGooAjgiAAR/IAMgAjcDECAAIANBBCAAKAIAEQMABUEACyADQSBqJAALRQACQCAAECgEQCAAECRBD0YNAQsgAEEAEJcDCwJAIAAQKARAIABBADoADwwBCyAAQQA2AgQLIAAQKAR/IAAFIAAoAgALC54BAgJ8An8gAUUEQCAAQn83AgAPCwJ/IAErAzBEAAAAAAAAUkCiIAEoAkAiBbciAyACKwMAIAUboyIEmUQAAAAAAADgQWMEQCAEqgwBC0GAgICAeAshBiACKwMIIQQgACAGNgIAIAACfyABKwM4RAAAAAAAAFJAoiADIAQgBRujIgOZRAAAAAAAAOBBYwRAIAOqDAELQYCAgIB4CzYCBAucAgEDfyMAQSBrIgIkAAJAAkAgAARAIAAoAggiAUUNASABLQAARQ0CAn8CQCAAKAIUIgNFBEAgARD7BCIBRQRAIAIgACgCCDYCAEHoswQgAhAqQQAMAwsgACABQbS/ARCfBCIDNgIUIANFBEBB/IALKAIAELMFIQAgAiABNgIUIAIgADYCEEH4+AMgAkEQahAqQQAMAwtBkN8KKAIAIgFBMkgNASAAQQE6ABFBAQwCCyADEOYDQQEgACgCFA0BGkHQhQFBvb0BQcQFQd8oEAAAC0GQ3wogAUEBajYCAEEBCyACQSBqJAAPC0GsJkG9vQFBrwVB3ygQAAALQe6YAUG9vQFBsAVB3ygQAAALQeTIAUG9vQFBsQVB3ygQAAALVwECfwJAIAAEQCAALQAARQ0BQYzfCigCACIBBH8gASAAQYAEIAEoAgARAwAFQQALDwtBwpkBQb29AUGhBUH/pAEQAAALQejIAUG9vQFBogVB/6QBEAAAC5kCAQJ/IAEoAkQhAQNAIAEtAAAiAgRAAkACQCABQZPaAUEFEIACRQ0AIAFBzdEBQQcQgAJFDQAgAUH73AFBBRCAAkUNACABQcrQAUEJEIACDQELAn8CQANAAkACQAJAIAJB/wFxIgJBCmsOBAQBAQIACyACRQ0DCyABLQABIQIgAUEBaiEBDAELC0EBIAEtAAFBCkcNARogAUECaiEBDAQLIAJBAEcLIQIgASACaiEBDAILAn8CQANAAkACQAJAIAJB/wFxIgNBCmsOBAQBAQIACyADRQ0DCyAAIALAEGUgAS0AASECIAFBAWohAQwBCwtBAkEBIAEtAAFBCkYbDAELIANBAEcLIQIgAEEKEGUgASACaiEBDAELCwvIAgICfwF8IwBBgAJrIgMkACACKwMQIQUgAyAAKQMINwN4IAMgACkDADcDcCADIAEpAwg3A2ggAyABKQMANwNgIANB4AFqIANB8ABqIANB4ABqEMwDAkAgBSADKwPgAWZFDQAgAyAAKQMINwNYIAMgACkDADcDUCADIAEpAwg3A0ggAyABKQMANwNAIANBwAFqIANB0ABqIANBQGsQzAMgAysD0AEgAisDAGZFDQAgAisDGCADIAApAwg3AzggAyAAKQMANwMwIAMgASkDCDcDKCADIAEpAwA3AyAgA0GgAWogA0EwaiADQSBqEMwDIAMrA6gBZkUNACADIAApAwg3AxggAyAAKQMANwMQIAMgASkDCDcDCCADIAEpAwA3AwAgA0GAAWogA0EQaiADEMwDIAMrA5gBIAIrAwhmIQQLIANBgAJqJAAgBAtqAgJ8AX8CQCABKwMQIAArADgiAiAAKwMYRAAAAAAAAOA/oiIDoWZFDQAgASsDACADIAKgZUUNACABKwMYIAArAEAiAiAAKwMgRAAAAAAAAOA/oiIDoWZFDQAgASsDCCADIAKgZSEECyAEC/oCAQZ/IwBBEGsiBiQAAkACQAJAIAAoAgAiAy0AAEEjRgRAIAMtAAEiAkHfAXFB2ABGBEBBAiEBA0AgAUEIRg0DAkAgASADai0AACICQcEAa0H/AXFBBkkEQEFJIQUMAQsgAkHhAGtB/wFxQQZJBEBBqX8hBQwBC0FQIQUgAkEwa0H/AXFBCUsNBQsgAiAFaiICIARBBHRqIQQgAUEBaiEBDAALAAtBASEBA0AgAUEIRg0CIAEgA2otAAAiAkEwa0H/AXFBCUsNAyABQQFqIQEgBEEKbCACakEwayEEDAALAAsgBiADNgIIA0AgBiABNgIMIAFBCEYNAyABIANqIgUtAAAiAkUEQCACIQQMBAsgAkE7RgRAIAZBCGpBwOEHQfwBQQhBNxDsAyICRQ0EIAVBAWohAyACKAIEIQQMBAUgAUEBaiEBDAELAAsAC0EIIQELIAJBO0cEQEEAIQQMAQsgASADakEBaiEDCyAAIAM2AgAgBkEQaiQAIAQLYgEDfyMAQRBrIgIkACACQQA6AA8gAiAAOgAOIAJBDmoQmgQiBBBAIQAgBCEDA0AgAEECSUUEQCABIAMsAAAQfyADQQFqIQMgAEEBayEADAELCyADLQAAIAQQGCACQRBqJAALrgEBAn8gABAtIQICQAJAIAAoAhAtAIYBQQFHDQAgASAAQQEQhQEaIAAQIUE6EM0BIgBFDQFBACEBIAIgAEEBaiIDQQAQjQEiAA0AIAIgA0EBEI0BIgBB/CVBwAJBARA2GiAAKAIQQQE6AIYBA0AgAkEBIAEQ5QMiAUUNASAAIAEQRSABKAIMIgNGDQAgACABIAMQcQwACwALIAAPC0HCmQFBzLkBQdgHQbjRARAAAAulAwEHfwJAAkAgAEH23gBBABBrIgJFDQAgAigCCCIDRQ0AIABB5jBBARCSASIFQeIlQZgCQQEQNhogA0EEEBohByAAEBwhAgNAIAIEQCAAIAIQLCEBA0AgAQRAIAEoAhAtAHEEQCAHIARBAnRqIAE2AgAgBEEBaiEECyAAIAEQMCEBDAELCyAAIAIQHSECDAELCyADIARHDQEgA0EAIANBAEobIQRBACEDA0AgAyAERkUEQCAHIANBAnRqKAIAIgZBUEEAIAYoAgBBA3EiAUECRxtqKAIoIQIgBiAGQTBBACABQQNHG2ooAiggBRDyCSACIAUQ8gkQmwQoAhAiAiAGKAIQIgEoAgg2AgggAUEANgIIIAIgASgCYDYCYCABQQA2AmAgAiABKAJsNgJsIAFBADYCbCACIAEoAmQ2AmQgAUEANgJkIAIgASgCaDYCaCABQQA2AmggBhDAAiADQQFqIQMMAQsLIAcQGCAFEBwhAQNAIAEEQCAFIAEQHSABEOcCIAAgARC3ASEBDAELCyAFELkBCw8LQYsgQcy5AUGZCEG7MBAAAAuXAQEFfyMAQRBrIgQkAEEBIQIDQCACIAAoAhAiAygCtAFKRQRAAkAgASADKAK4ASACQQJ0aigCACIDECEiBUGABCABKAIAEQMABEAgBCAFNgIAQaG4BCAEECoMAQtBEBBSIgYgAzYCDCAGIAU2AgggASAGQQEgASgCABEDABoLIAMgARD0CSACQQFqIQIMAQsLIARBEGokAAsoAQF/A38gAAR/IAAoAgQQ9QkgAWpBAWohASAAKAIAIQAMAQUgAQsLC00BAn8gARAhIgMEQAJAIANB4jdBBxDqAQ0AIAAgARAhQYAEIAAoAgARAwAiAEUNACAAKAIMIQILIAIPC0GI1AFB6/sAQQxBnvcAEAAACxkAIABB5PwJQZTuCSgCABCTASIAEPQJIAAL8gECA38GfCAAIAEoAiwgASgCCCIDIAEoAgQiAUEBayICQQAgASACTxtsQQR0aiICKQMANwMQIAAgAikDCDcDGCAAIAIpAwg3AwggACACKQMANwMAQQEgAyADQQFNGyEDIAArAxghBSAAKwMIIQYgACsDECEHIAArAwAhCEEBIQEDQCABIANGBEAgACAFOQMYIAAgBjkDCCAAIAc5AxAgACAIOQMABSAFIAIgAUEEdGoiBCsDCCIJIAUgCWQbIQUgByAEKwMAIgogByAKZBshByAGIAkgBiAJYxshBiAIIAogCCAKYxshCCABQQFqIQEMAQsLCyoBAX8CQCABRQ0AIAAgARBFIgBFDQAgAC0AAEUNACAAEGhBAXMhAgsgAgtRAQF/AkACQCADRQ0AIANBOhDNASIERQ0AIARBADoAACAAIAIgAyAEQQFqIgMgAREHACAEQTo6AAAMAQsgACACIANBACABEQcACyAAIAM2AiQLXAAgASgCCEUEQCAAIAEQ1QYLIAIgAEGc3QooAgAgASsDAEQAAAAAAADwPxBMOQMAIAIgAEGg3QooAgAgASgCCBCPATYCCCACIABBpN0KKAIAIAEoAgwQjwE2AgwLlwQCCHwIfyMAQUBqIgwkACABKAIAIQ8gAisDCCEGIAIrAwAhByABKAIEIRBE////////738hA0F/IQ1BfyECA0ACQCALIBBGBEAgDyANQTBsaiIBKAIAIAIgAiABKAIEQQFrRmsiASABQQNwa0EEdGohAkEAIQEMAQsgDyALQTBsaiIBKAIEIREgASgCACESQQAhAQNAIAEgEUYEQCALQQFqIQsMAwUgEiABQQR0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dSAGQRBqJAAgBUHomws2AghBhJ0LIAUoAggQogIaQYidC0EBOgAACyAFQRBqJABBjJ0LQYSdCxDcCkGQnQtBAToAAAsgAEGMnQsoAgAiADYCACAAENsKCxEAIABB6JsLRwRAIAAQ3goLCxMAIAAgASgCACIANgIAIAAQ2woLnQEBBH8gAEG4swk2AgAgAEEIaiEBA0AgARDEAiACSwRAIAEgAhCdAygCAARAIAEgAhCdAygCABCRBQsgAkEBaiECDAELCyAAQZABahA1GiMAQRBrIgIkACACQQxqIAEQogIiASgCACIDKAIABEAgAxDfCiABKAIAGiABKAIAEJwDIAEoAgAiASgCACABEL8KGhC+CgsgAkEQaiQAIAALDwAgACAAKAIEQQFqNgIECwwAIAAgACgCABDACgt7AQN/IwBBEGsiBCQAIARBBGoiAiAANgIAIAIgACgCBCIDNgIEIAIgAyABQQJ0ajYCCCACIgMoAgQhASACKAIIIQIDQCABIAJGBEAgAygCACADKAIENgIEIARBEGokAAUgABCcAxogARDBCiADIAFBBGoiATYCBAwBCwsLIAAgAEGIvAk2AgAgACgCCBBmRwRAIAAoAggQmwsLIAALBABBfwumAQEDfyMAQRBrIgQkACMAQSBrIgMkACADQRhqIAAgARDGCiADQRBqIAMoAhggAygCHCACEKsLIAMoAhAhBSMAQRBrIgEkACABIAA2AgwgAUEMaiIAIAUgABD1BmtBAnUQ+wYhACABQRBqJAAgAyAANgIMIAMgAiADKAIUEKQDNgIIIARBCGogA0EMaiADQQhqEPsBIANBIGokACAEKAIMIARBEGokAAuBBgEKfyMAQRBrIhMkACACIAA2AgBBBEEAIAcbIRUgA0GABHEhFgNAIBRBBEYEQCANECVBAUsEQCATIA0Q3gE2AgwgAiATQQxqQQEQ+wYgDRDyAiACKAIAEOMKNgIACyADQbABcSIDQRBHBEAgASADQSBGBH8gAigCAAUgAAs2AgALIBNBEGokAAUCQAJAAkACQAJAAkAgCCAUai0AAA4FAAEDAgQFCyABIAIoAgA2AgAMBAsgASACKAIANgIAIAZBIBDRASEHIAIgAigCACIPQQRqNgIAIA8gBzYCAAwDCyANEPYBDQIgDUEAEJoFKAIAIQcgAiACKAIAIg9BBGo2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QQFqIQUgAUEBaiEBDAELCyADQQA6AAcgBSADQQdqENIBIANBEGokAAwBCxDKAQALCw8AIAAgACgCGCABajYCGAsXACAAIAI2AhwgACABNgIUIAAgATYCGAtXAQJ/AkAgACgCACICRQ0AAn8gAigCGCIDIAIoAhxGBEAgAiABIAIoAgAoAjQRAAAMAQsgAiADQQRqNgIYIAMgATYCACABC0F/EMgCRQ0AIABBADYCAAsLMQEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBBGo2AgwgASgCAAsnAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEoAgALJwEBfwJAIAAoAgAiAkUNACACIAEQvQtBfxDIAkUNACAAQQA2AgALC1MBA38CQEF/IAAoAkwQyAJFBEAgACgCTCEADAELIAAjAEEQayIBJAAgAUEMaiICIAAQUyACEMwBQSAQmwEhACACEFAgAUEQaiQAIAA2AkwLIADACxoAIAAgASABKAIAQQxrKAIAaigCGDYCACAACwsAIABB4JoLEKkCCw0AIAAgASACQQAQogcLCQAgABCSBxAYCz0BAX8gACgCGCICIAAoAhxGBEAgACABEKYDIAAoAgAoAjQRAAAPCyAAIAJBAWo2AhggAiABOgAAIAEQpgMLNAEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBAWo2AgwgASwAABCmAwsqAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEsAAAQpgMLDwAgACAAKAIAKAIYEQIACwgAIAAoAhBFCwQAQX8LLAAgACABEK4HIgFFBEAPCwJAIAMEQCAAIAEgAhCoBAwBCyAAIAEgAhC7CwsLCAAgABCLBxoLvg8CBX8PfiMAQdACayIFJAAgBEL///////8/gyEKIAJC////////P4MhCyACIASFQoCAgICAgICAgH+DIQwgBEIwiKdB//8BcSEIAkACQCACQjCIp0H//wFxIglB//8Ba0GCgH5PBEAgCEH//wFrQYGAfksNAQsgAVAgAkL///////////8AgyINQoCAgICAgMD//wBUIA1CgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhDAwCCyADUCAEQv///////////wCDIgJCgICAgICAwP//AFQgAkKAgICAgIDA//8AURtFBEAgBEKAgICAgIAghCEMIAMhAQwCCyABIA1CgICAgICAwP//AIWEUARAIAMgAkKAgICAgIDA//8AhYRQBEBCACEBQoCAgICAgOD//wAhDAwDCyAMQoCAgICAgMD//wCEIQxCACEBDAILIAMgAkKAgICAgIDA//8AhYRQBEBCACEBDAILIAEgDYRQBEBCgICAgICA4P//ACAMIAIgA4RQGyEMQgAhAQwCCyACIAOEUARAIAxCgICAgICAwP//AIQhDEIAIQEMAgsgDUL///////8/WARAIAVBwAJqIAEgCyABIAsgC1AiBht5IAZBBnStfKciBkEPaxCxAUEQIAZrIQYgBSkDyAIhCyAFKQPAAiEBCyACQv///////z9WDQAgBUGwAmogAyAKIAMgCiAKUCIHG3kgB0EGdK18pyIHQQ9rELEBIAYgB2pBEGshBiAFKQO4AiEKIAUpA7ACIQMLIAVBoAJqIApCgICAgICAwACEIhJCD4YgA0IxiIQiAkIAQoCAgICw5ryC9QAgAn0iBEIAEJwBIAVBkAJqQgAgBSkDqAJ9QgAgBEIAEJwBIAVBgAJqIAUpA5gCQgGGIAUpA5ACQj+IhCIEQgAgAkIAEJwBIAVB8AFqIARCAEIAIAUpA4gCfUIAEJwBIAVB4AFqIAUpA/gBQgGGIAUpA/ABQj+IhCIEQgAgAkIAEJwBIAVB0AFqIARCAEIAIAUpA+gBfUIAEJwBIAVBwAFqIAUpA9gBQgGGIAUpA9ABQj+IhCIEQgAgAkIAEJwBIAVBsAFqIARCAEIAIAUpA8gBfUIAEJwBIAVBoAFqIAJCACAFKQO4AUIBhiAFKQOwAUI/iIRCAX0iAkIAEJwBIAVBkAFqIANCD4ZCACACQgAQnAEgBUHwAGogAkIAQgAgBSkDqAEgBSkDoAEiDSAFKQOYAXwiBCANVK18IARCAVatfH1CABCcASAFQYABakIBIAR9QgAgAkIAEJwBIAYgCSAIa2ohBgJ/IAUpA3AiE0IBhiIOIAUpA4gBIg9CAYYgBSkDgAFCP4iEfCIQQufsAH0iFEIgiCICIAtCgICAgICAwACEIhVCAYYiFkIgiCIEfiIRIAFCAYYiDUIgiCIKIBAgFFatIA4gEFatIAUpA3hCAYYgE0I/iIQgD0I/iHx8fEIBfSITQiCIIhB+fCIOIBFUrSAOIA4gE0L/////D4MiEyABQj+IIhcgC0IBhoRC/////w+DIgt+fCIOVq18IAQgEH58IAQgE34iESALIBB+fCIPIBFUrUIghiAPQiCIhHwgDiAOIA9CIIZ8Ig5WrXwgDiAOIBRC/////w+DIhQgC34iESACIAp+fCIPIBFUrSAPIA8gEyANQv7///8PgyIRfnwiD1atfHwiDlatfCAOIAQgFH4iGCAQIBF+fCIEIAIgC358IgsgCiATfnwiEEIgiCALIBBWrSAEIBhUrSAEIAtWrXx8QiCGhHwiBCAOVK18IAQgDyACIBF+IgIgCiAUfnwiCkIgiCACIApWrUIghoR8IgIgD1StIAIgEEIghnwgAlStfHwiAiAEVK18IgRC/////////wBYBEAgFiAXhCEVIAVB0ABqIAIgBCADIBIQnAEgAUIxhiAFKQNYfSAFKQNQIgFCAFKtfSEKQgAgAX0hCyAGQf7/AGoMAQsgBUHgAGogBEI/hiACQgGIhCICIARCAYgiBCADIBIQnAEgAUIwhiAFKQNofSAFKQNgIg1CAFKtfSEKQgAgDX0hCyABIQ0gBkH//wBqCyIGQf//AU4EQCAMQoCAgICAgMD//wCEIQxCACEBDAELAn4gBkEASgRAIApCAYYgC0I/iIQhASAEQv///////z+DIAatQjCGhCEKIAtCAYYMAQsgBkGPf0wEQEIAIQEMAgsgBUFAayACIARBASAGaxCnAyAFQTBqIA0gFSAGQfAAahCxASAFQSBqIAMgEiAFKQNAIgIgBSkDSCIKEJwBIAUpAzggBSkDKEIBhiAFKQMgIgFCP4iEfSAFKQMwIgQgAUIBhiINVK19IQEgBCANfQshBCAFQRBqIAMgEkIDQgAQnAEgBSADIBJCBUIAEJwBIAogAiACIAMgBCACQgGDIgR8IgNUIAEgAyAEVK18IgEgElYgASASURutfCICVq18IgQgAiACIARCgICAgICAwP//AFQgAyAFKQMQViABIAUpAxgiBFYgASAEURtxrXwiAlatfCIEIAIgBEKAgICAgIDA//8AVCADIAUpAwBWIAEgBSkDCCIDViABIANRG3GtfCIBIAJUrXwgDIQhDAsgACABNwMAIAAgDDcDCCAFQdACaiQAC8ABAgF/An5BfyEDAkAgAEIAUiABQv///////////wCDIgRCgICAgICAwP//AFYgBEKAgICAgIDA//8AURsNACACQv///////////wCDIgVCgICAgICAwP//AFYgBUKAgICAgIDA//8AUnENACAAIAQgBYSEUARAQQAPCyABIAKDQgBZBEAgASACUiABIAJTcQ0BIAAgASAChYRCAFIPCyAAQgBSIAEgAlUgASACURsNACAAIAEgAoWEQgBSIQMLIAMLHgEBfyAAEOwBIgEEQCAAIAEQygsgAEGVlgUQ4gELC58DAQV/QRAhAgJAQRAgACAAQRBNGyIDIANBAWtxRQRAIAMhAAwBCwNAIAIiAEEBdCECIAAgA0kNAAsLQUAgAGsgAU0EQEH8gAtBMDYCAEEADwtBECABQQtqQXhxIAFBC0kbIgMgAGpBDGoQTyICRQRAQQAPCyACQQhrIQECQCAAQQFrIAJxRQRAIAEhAAwBCyACQQRrIgUoAgAiBkF4cSAAIAJqQQFrQQAgAGtxQQhrIgIgAEEAIAIgAWtBD00baiIAIAFrIgJrIQQgBkEDcUUEQCABKAIAIQEgACAENgIEIAAgASACajYCAAwBCyAAIAQgACgCBEEBcXJBAnI2AgQgACAEaiIEIAQoAgRBAXI2AgQgBSACIAUoAgBBAXFyQQJyNgIAIAEgAmoiBCAEKAIEQQFyNgIEIAEgAhCtBQsCQCAAKAIEIgFBA3FFDQAgAUF4cSICIANBEGpNDQAgACADIAFBAXFyQQJyNgIEIAAgA2oiASACIANrIgNBA3I2AgQgACACaiICIAIoAgRBAXI2AgQgASADEK0FCyAAQQhqCxIAIABFBEBBAA8LIAAgARCYBwtZAQN/IAAQLSEDIAAQrwUiAEEAIABBAEobIQRBACEAA0AgASgCDCECIAAgBEYEQCACEBgFIAMgAiAAQQJ0aigCACICIAIQdkEARxCMARogAEEBaiEADAELCwvlHgIPfwV+IwBBkAFrIgUkACAFQQBBkAEQOCIFQX82AkwgBSAANgIsIAVBjAQ2AiAgBSAANgJUIAEhBCACIRBBACEAIwBBsAJrIgYkACAFIgMoAkwaAkACQCADKAIERQRAIAMQvgUaIAMoAgRFDQELIAQtAAAiAUUNAQJAAkACQAJAAkADQAJAAkAgAUH/AXEiARDKAgRAA0AgBCIBQQFqIQQgAS0AARDKAg0ACyADQgAQjwIDQAJ/IAMoAgQiAiADKAJoRwRAIAMgAkEBajYCBCACLQAADAELIAMQVgsQygINAAsgAygCBCEEIAMpA3BCAFkEQCADIARBAWsiBDYCBAsgBCADKAIsa6wgAykDeCAVfHwhFQwBCwJ/AkACQCABQSVGBEAgBC0AASIBQSpGDQEgAUElRw0CCyADQgAQjwICQCAELQAAQSVGBEADQAJ/IAMoAgQiASADKAJoRwRAIAMgAUEBajYCBCABLQAADAELIAMQVgsiARDKAg0ACyAEQQFqIQQMAQsgAygCBCIBIAMoAmhHBEAgAyABQQFqNgIEIAEtAAAhAQwBCyADEFYhAQsgBC0AACABRwRAIAMpA3BCAFkEQCADIAMoAgRBAWs2AgQLIAFBAE4gDnINDQwMCyADKAIEIAMoAixrrCADKQN4IBV8fCEVIAQhAQwDC0EAIQggBEECagwBCwJAIAFBMGsiAkEJSw0AIAQtAAJBJEcNACMAQRBrIgEgEDYCDCABIBAgAkECdGpBBGsgECACQQFLGyIBQQRqNgIIIAEoAgAhCCAEQQNqDAELIBAoAgAhCCAQQQRqIRAgBEEBagshAUEAIQ9BACEHIAEtAAAiBEEwa0EJTQRAA0AgB0EKbCAEakEwayEHIAEtAAEhBCABQQFqIQEgBEEwa0EKSQ0ACwsgBEHtAEcEfyABBUEAIQwgCEEARyEPIAEtAAEhBEEAIQAgAUEBagsiCUEBaiEBQQMhAiAPIQUCQAJAAkACQAJAAkAgBEH/AXFBwQBrDjoEDAQMBAQEDAwMDAMMDAwMDAwEDAwMDAQMDAQMDAwMDAQMBAQEBAQABAUMAQwEBAQMDAQCBAwMBAwCDAsgCUECaiABIAktAAFB6ABGIgIbIQFBfkF/IAIbIQIMBAsgCUECaiABIAktAAFB7ABGIgIbIQFBA0EBIAIbIQIMAwtBASECDAILQQIhAgwBC0EAIQIgCSEBC0EBIAIgAS0AACIFQS9xQQNGIgIbIRECQCAFQSByIAUgAhsiDUHbAEYNAAJAIA1B7gBHBEAgDUHjAEcNAUEBIAcgB0EBTBshBwwCCyAIIBEgFRDMCwwCCyADQgAQjwIDQAJ/IAMoAgQiAiADKAJoRwRAIAMgAkEBajYCBCACLQAADAELIAMQVgsQygINAAsgAygCBCEEIAMpA3BCAFkEQCADIARBAWsiBDYCBAsgBCADKAIsa6wgAykDeCAVfHwhFQsgAyAHrCIUEI8CAkAgAygCBCICIAMoAmhHBEAgAyACQQFqNgIEDAELIAMQVkEASA0GCyADKQNwQgBZBEAgAyADKAIEQQFrNgIEC0EQIQQCQAJAAkACQAJAAkACQAJAAkACQCANQdgAaw4hBgkJAgkJCQkJAQkCBAEBAQkFCQkJCQkDBgkJAgkECQkGAAsgDUHBAGsiAkEGS0EBIAJ0QfEAcUVyDQgLIAZBCGogAyARQQAQ2AsgAykDeEIAIAMoAgQgAygCLGusfVINBQwMCyANQRByQfMARgRAIAZBIGpBf0GBAhA4GiAGQQA6ACAgDUHzAEcNBiAGQQA6AEEgBkEAOgAuIAZBADYBKgwGCyAGQSBqIAEtAAEiBEHeAEYiBUGBAhA4GiAGQQA6ACAgAUECaiABQQFqIAUbIQICfwJAAkAgAUECQQEgBRtqLQAAIgFBLUcEQCABQd0ARg0BIARB3gBHIQogAgwDCyAGIARB3gBHIgo6AE4MAQsgBiAEQd4ARyIKOgB+CyACQQFqCyEBA0ACQCABLQAAIgJBLUcEQCACRQ0PIAJB3QBGDQgMAQtBLSECIAEtAAEiCUUgCUHdAEZyDQAgAUEBaiEFAkAgCSABQQFrLQAAIgRNBEAgCSECDAELA0AgBEEBaiIEIAZBIGpqIAo6AAAgBCAFLQAAIgJJDQALCyAFIQELIAIgBmogCjoAISABQQFqIQEMAAsAC0EIIQQMAgtBCiEEDAELQQAhBAtCACESQQAhC0EAIQpBACEJIwBBEGsiByQAAkAgBEEBRyAEQSRNcUUEQEH8gAtBHDYCAAwBCwNAAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICEMoCDQALAkACQCACQStrDgMAAQABC0F/QQAgAkEtRhshCSADKAIEIgIgAygCaEcEQCADIAJBAWo2AgQgAi0AACECDAELIAMQViECCwJAAkACQAJAIARBAEcgBEEQR3EgAkEwR3JFBEACfyADKAIEIgIgAygCaEcEQCADIAJBAWo2AgQgAi0AAAwBCyADEFYLIgJBX3FB2ABGBEBBECEEAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICQZGNCWotAABBEEkNAyADKQNwQgBZBEAgAyADKAIEQQFrNgIECyADQgAQjwIMBgsgBA0BQQghBAwCCyAEQQogBBsiBCACQZGNCWotAABLDQAgAykDcEIAWQRAIAMgAygCBEEBazYCBAsgA0IAEI8CQfyAC0EcNgIADAQLIARBCkcNACACQTBrIgtBCU0EQEEAIQIDQCACQQpsIAtqIgJBmbPmzAFJAn8gAygCBCIFIAMoAmhHBEAgAyAFQQFqNgIEIAUtAAAMAQsgAxBWC0EwayILQQlNcQ0ACyACrSESCyALQQlLDQIgEkIKfiEUIAutIRMDQAJAAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICQTBrIgVBCU0gEyAUfCISQpqz5syZs+bMGVRxRQRAIAVBCU0NAQwFCyASQgp+IhQgBa0iE0J/hVgNAQsLQQohBAwBCyAEIARBAWtxBEAgAkGRjQlqLQAAIgogBEkEQANAIAogBCALbGoiC0HH4/E4SQJ/IAMoAgQiAiADKAJoRwRAIAMgAkEBajYCBCACLQAADAELIAMQVgsiAkGRjQlqLQAAIgogBElxDQALIAutIRILIAQgCk0NASAErSEWA0AgEiAWfiIUIAqtQv8BgyITQn+FVg0CIBMgFHwhEiAEAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICQZGNCWotAAAiCk0NAiAHIBZCACASQgAQnAEgBykDCFANAAsMAQsgBEEXbEEFdkEHcUGRjwlqLAAAIQUgAkGRjQlqLQAAIgsgBEkEQANAIAsgCiAFdCICciEKIAJBgICAwABJAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWCyICQZGNCWotAAAiCyAESXENAAsgCq0hEgsgBCALTQ0AQn8gBa0iFIgiEyASVA0AA0AgC61C/wGDIBIgFIaEIRIgBAJ/IAMoAgQiAiADKAJoRwRAIAMgAkEBajYCBCACLQAADAELIAMQVgsiAkGRjQlqLQAAIgtNDQEgEiATWA0ACwsgBCACQZGNCWotAABNDQADQCAEAn8gAygCBCICIAMoAmhHBEAgAyACQQFqNgIEIAItAAAMAQsgAxBWC0GRjQlqLQAASw0AC0H8gAtBxAA2AgBBACEJQn8hEgsgAykDcEIAWQRAIAMgAygCBEEBazYCBAsgCUEBckUgEkJ/UXEEQEH8gAtBxAA2AgBCfiESDAELIBIgCawiE4UgE30hEgsgB0EQaiQAIAMpA3hCACADKAIEIAMoAixrrH1RDQcgCEUgDUHwAEdyRQRAIAggEj4CAAwDCyAIIBEgEhDMCwwCCyAIRQ0BIAYpAxAhFCAGKQMIIRMCQAJAAkAgEQ4DAAECBAsgCCATIBQQqwU4AgAMAwsgCCATIBQQlwc5AwAMAgsgCCATNwMAIAggFDcDCAwBC0EfIAdBAWogDUHjAEciCRshAgJAIBFBAUYEQCAIIQcgDwRAIAJBAnQQTyIHRQ0HCyAGQgA3AqgCQQAhBANAIAchAAJAA0ACfyADKAIEIgUgAygCaEcEQCADIAVBAWo2AgQgBS0AAAwBCyADEFYLIgUgBmotACFFDQEgBiAFOgAbIAZBHGogBkEbakEBIAZBqAJqEK4FIgVBfkYNACAFQX9GBEBBACEMDAwLIAAEQCAAIARBAnRqIAYoAhw2AgAgBEEBaiEECyAPRSACIARHcg0AC0EBIQVBACEMIAAgAkEBdEEBciICQQJ0EGoiBw0BDAsLC0EAIQwgACECIAZBqAJqBH8gBigCqAIFQQALDQgMAQsgDwRAQQAhBCACEE8iB0UNBgNAIAchAANAAn8gAygCBCIFIAMoAmhHBEAgAyAFQQFqNgIEIAUtAAAMAQsgAxBWCyIFIAZqLQAhRQRAQQAhAiAAIQwMBAsgACAEaiAFOgAAIARBAWoiBCACRw0AC0EBIQUgACACQQF0QQFyIgIQaiIHDQALIAAhDEEAIQAMCQtBACEEIAgEQANAAn8gAygCBCIAIAMoAmhHBEAgAyAAQQFqNgIEIAAtAAAMAQsgAxBWCyIAIAZqLQAhBEAgBCAIaiAAOgAAIARBAWohBAwBBUEAIQIgCCIAIQwMAwsACwALA0ACfyADKAIEIgAgAygCaEcEQCADIABBAWo2AgQgAC0AAAwBCyADEFYLIAZqLQAhDQALQQAhAEEAIQxBACECCyADKAIEIQcgAykDcEIAWQRAIAMgB0EBayIHNgIECyADKQN4IAcgAygCLGusfCITUCAJIBMgFFFyRXINAiAPBEAgCCAANgIACwJAIA1B4wBGDQAgAgRAIAIgBEECdGpBADYCAAsgDEUEQEEAIQwMAQsgBCAMakEAOgAACyACIQALIAMoAgQgAygCLGusIAMpA3ggFXx8IRUgDiAIQQBHaiEOCyABQQFqIQQgAS0AASIBDQEMCAsLIAIhAAwBC0EBIQVBACEMQQAhAAwCCyAPIQUMAgsgDyEFCyAOQX8gDhshDgsgBUUNASAMEBggABAYDAELQX8hDgsgBkGwAmokACADQZABaiQAIA4LQwACQCAARQ0AAkACQAJAAkAgAUECag4GAAECAgQDBAsgACACPAAADwsgACACPQEADwsgACACPgIADwsgACACNwMACwsPACAAIAEgAkEAQQAQmQcLFQEBfxDtAyEAQQ9B0N0KKAIAIAAbC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRBAALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC28BBX8gACgCACIDLAAAQTBrIgFBCUsEQEEADwsDQEF/IQQgAkHMmbPmAE0EQEF/IAEgAkEKbCIFaiABIAVB/////wdzSxshBAsgACADQQFqIgU2AgAgAywAASAEIQIgBSEDQTBrIgFBCkkNAAsgAgv1EgISfwJ+IwBBQGoiCCQAIAggATYCPCAIQSdqIRYgCEEoaiERAkACQAJAAkADQEEAIQcDQCABIQ0gByAOQf////8Hc0oNAiAHIA5qIQ4CQAJAAkACQCABIgctAAAiCwRAA0ACQAJAIAtB/wFxIgFFBEAgByEBDAELIAFBJUcNASAHIQsDQCALLQABQSVHBEAgCyEBDAILIAdBAWohByALLQACIAtBAmoiASELQSVGDQALCyAHIA1rIgcgDkH/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KQOIAyAWIAJBAE4iARshFiAEKQOAAyAXIAEbIRcgCSAGIAhHIAJBAEhycSAVIBhCAEIAEKgDQQBHcUUgFCABIA1qIg1B7gBqTnENAEH8gAtBxAA2AgALIARB8AJqIBcgFiANENoLIAQpA/gCIRUgBCkD8AILIRYgDiAVNwMoIA4gFjcDICAEQZDGAGokACAOKQMoIRUgDikDICEWDAELQgAhFQsgACAWNwMAIAAgFTcDCCAOQTBqJAALwwYCBH8DfiMAQYABayIFJAACQAJAAkAgAyAEQgBCABCoA0UNAAJ/IARC////////P4MhCgJ/IARCMIinQf//AXEiB0H//wFHBEBBBCAHDQEaQQJBAyADIAqEUBsMAgsgAyAKhFALC0UNACACQjCIpyIIQf//AXEiBkH//wFHDQELIAVBEGogASACIAMgBBBpIAUgBSkDECICIAUpAxgiASACIAEQxQsgBSkDCCECIAUpAwAhBAwBCyABIAJC////////////AIMiCiADIARC////////////AIMiCRCoA0EATARAIAEgCiADIAkQqAMEQCABIQQMAgsgBUHwAGogASACQgBCABBpIAUpA3ghAiAFKQNwIQQMAQsgBEIwiKdB//8BcSEHIAYEfiABBSAFQeAAaiABIApCAEKAgICAgIDAu8AAEGkgBSkDaCIKQjCIp0H4AGshBiAFKQNgCyEEIAdFBEAgBUHQAGogAyAJQgBCgICAgICAwLvAABBpIAUpA1giCUIwiKdB+ABrIQcgBSkDUCEDCyAJQv///////z+DQoCAgICAgMAAhCELIApC////////P4NCgICAgICAwACEIQogBiAHSgRAA0ACfiAKIAt9IAMgBFatfSIJQgBZBEAgCSAEIAN9IgSEUARAIAVBIGogASACQgBCABBpIAUpAyghAiAFKQMgIQQMBQsgCUIBhiAEQj+IhAwBCyAKQgGGIARCP4iECyEKIARCAYYhBCAGQQFrIgYgB0oNAAsgByEGCwJAIAogC30gAyAEVq19IglCAFMEQCAKIQkMAQsgCSAEIAN9IgSEQgBSDQAgBUEwaiABIAJCAEIAEGkgBSkDOCECIAUpAzAhBAwBCyAJQv///////z9YBEADQCAEQj+IIAZBAWshBiAEQgGGIQQgCUIBhoQiCUKAgICAgIDAAFQNAAsLIAhB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QfWrBCADQTBqEDMLIAAgAhAdIQIMAAsACyABQQFqIQdBASEEA0AgACgCECICKAK0ASAETgRAIAIoArgBIARBAnRqKAIAIQUgAQRAIAkgBSgCECICKwMooCEIIAogAisDIKAhCyAJIAIrAxigIQwgCiACKwMQoCENQezaCi0AAEECTwRAIAEQsAIgBRAhIQIgAyAIOQMgIAMgCzkDGCADIAw5AxAgAyANOQMIIAMgAjYCACAGQeOrBCADEDMgBSgCECECCyACIAg5AyggAiALOQMgIAIgDDkDGCACIA05AxALIAUgBxDzCyAEQQFqIQQMAQsLIANB4ABqJAALyhoDD38LfAF+IwBBwARrIgIkACAAKAJIIQpB7NoKLQAAQQJPBEAgARCwAiACIAAQITYCsANBiPYIKAIAQfDwAyACQbADahAgGgsgAUEBaiEJQQEhBANAIAAoAhAiAygCtAEgBEgEQAJAAkAgABA8IAdrIhBBACAAKAIQIgMoArQBayILRw0AIAMoAgwNACADQgA3AxAgA0KAgICAgICAmcAANwMoIANCgICAgICAgJnAADcDICADQgA3AxgMAQsCQAJ/AkAgAEEEQQQgAkGgBGoQ+QNBAk0EQCACQQM2ArAEDAELQQAgAigCsARBBEcNARpBACEJIAItALwEQQJxRQ0CIApBAEHwFkEAECIiCSAKQQFB8BZBABAiIgZyDQIgAiAAECE2AqADQcifAyACQaADahAqC0EACyEGQQAhCQsgAkHoA2pBAEE4EDgaIAJCADcD4AMgAkIANwPYAyACQgA3A9ADIAJCADcDyAMgAkIANwPAAyACQgA3A7gDQQEhBwNAAkAgACgCECIDKAK0ASAHSARAIBBBAEwNASAAEBwhBwNAIAdFDQIgBygCECIDKAKAAUUEQCADIAA2AoABIAJCADcDiAQgAkIANwOABCADKwNgIRIgAysDWCERIAIgAysDUDkDmAQgAiARIBKgOQOQBCACQegDakEgECYhAyACKALoAyADQQV0aiIDIAIpA4AENwMAIAMgAikDmAQ3AxggAyACKQOQBDcDECADIAIpA4gENwMIIAYEQCACIAcgBkEAQQAQYjYCzAMgAkG4A2pBBBAmIQMgAigCuAMgA0ECdGogAigCzAM2AgALIAIgBzYC5AMgAkHQA2pBBBAmIQMgAigC0AMg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EBwhAwNAIAMEQCADKAIQQQA2ArgBIAAgAxAdIQMMAQsLQezaCi0AAEECTwRAIAEoAhAhAyAFIAAQITYC5AEgBSADNgLgAUGI9ggoAgBBjfkDIAVB4AFqECAaCyABIAEoAhBBAWo2AhAgBUG88AkoAgA2AtwBQdKnASAFQdwBakEAEOMBIgpB4iVBmAJBARA2GkE4EFIhAyAKKAIQIAM2AowBIAAQOSEDIAooAhAgAygCEC8BsAE7AbABIAAgCkHa3AAQuQcgACAKQZjbABC5ByAAIApBsNgBELkHIAVBqAJqIQggBUGgAmohDCAFQZgCaiELQQEhDwNAIAAoAhAiAygCtAEgD04EQCADKAK4ASAPQQJ0aigCACIEEJQEIAogBBAhELgHIgYoAhAiAyAJNgKIASADIAQ2AugBAkACQCABKAIEIgdFBEBE////////738hG0T////////v/yEaDAELRP///////+9/IRtE////////7/8hGiAEIAcQRSIDLQAARQ0AIAEoAgAgBEcEQCADIAQoAkQgBxBFEE1FDQELIAVBADoA+AEgBSALNgLEASAFIAw2AsgBIAUgCDYCzAEgBSAFQfgBajYC0AEgBSAFQZACajYCwAEgA0H4vgEgBUHAAWoQUUEETgRAIAUrA6gCIRogBSsDoAIhHSAFKwOYAiEbIAUrA5ACIRxBgNsKKwMAIh5EAAAAAAAAAABkBEAgGyAeoyEbIBwgHqMhHCAdIB6jIR0gGiAeoyEaCyAGKAIQQQNBAkEBIAUtAPgBIgNBP0YbIANBIUYbOgCHAQwCCyAEECEhByAFIAM2ArQBIAUgBzYCsAFBh+sDIAVBsAFqECoLRP///////+//IR1E////////738hHAsgCUEBaiEJIAQQHCEDA0AgAwRAIAMoAhAgBjYCuAEgBCADEB0hAwwBCwsgBigCECIDLQCHAQRAIAMoApQBIgMgGiAboEQAAAAAAADgP6I5AwggAyAdIBygRAAAAAAAAOA/ojkDAAsgD0EBaiEPDAELCyAAEBwhAwJ/AkADQCADBEACQCADKAIQIgQoArgBDQACQCAEKALoASIGRQ0AIAYgACgCECgCjAEoAjBGDQAgAxAhIQEgABAhIQAgBSADKAIQKALoARAhNgKoASAFIAA2AqQBIAUgATYCoAFBiv0EIAVBoAFqEDcM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QRhqCyILKwMIIQggCysDACEHAn8gASgCECIAKAIEIAFGBEAgACgCAAwBCyABQRhqCyIAKwMIIQkgACsDACEKIAJBfyAHIAShIgcgBSADoaIgCCADoSIFIAYgBKGioSIGRAAAAAAAAAAAZCAGRAAAAAAAAAAAYxsiADYCACACQX8gByAJIAOhoiAFIAogBKGioSIDRAAAAAAAAAAAZCADRAAAAAAAAAAAYxsiATYCBCACIAAgAWw2AggLTQECfAJ/QQEgACgCACIAKwMAIgIgASgCACIBKwMAIgNkDQAaQX8gAiADYw0AGkEBIAArAwgiAiABKwMIIgNkDQAaQX9BACACIANjGwsLzg8DEH8KfAF+IwBBsAFrIgIkACABQQAgAUEAShshDyABQSgQGiENA0AgAyAPRkUEQCAAIANBAnRqKAIAKAIEIApqIQogA0EBaiEDDAELCyAKQRgQGiIOQRhrIQYDQCAIIA9HBEAgDSAIQShsaiIEIA4gB0EYbGo2AgAgACAIQQJ0aigCACILKAIEIQxBACEDRP///////+9/IRJE////////7/8hE0T////////v/yEVRP///////+9/IRQDQCADIAxGBEAgBCATOQMgIAQgFTkDGCAEIBI5AxAgBCAUOQMIIAQgBiAHQRhsajYCBCAIQQFqIQgMAwUgCygCACADQQR0aiIFKwMAIRYgBSsDCCEXIA4gB0EYbGoiBUEANgIUIAUgBDYCECAFIBc5AwggBSAWOQMAIANBAWohAyAHQQFqIQcgEyAXECMhEyAVIBYQIyEVIBIgFxApIRIgFCAWECkhFAwBCwALAAsLIAJCADcDiAEgAkIANwOAASACQgA3A3hBACEDIApBBBAaIQwCQANAIAMgCkYEQAJAIAwgCkEEQeADELUBIAJBjAFqIRBBACELA0AgCiALRg0BIAIgDCALQQJ0aiIRKAIAIgM2AnQgAgJ/IAMoAhAiBCgCACADRgRAIAQoAgQMAQsgA0EYawsiBTYCcEEAIQgDQAJAAkAgCEECRwRAAkAgAkH0AGogAkHwAGoQzQxBAWoOAwADAgMLIAVBGGohB0EAIQMDQAJAIAIoAoABIANLBEAgAiACKQOAATcDWCACIAIpA3g3A1AgAigCeCACQdAAaiADEBlBAnRqKAIAIgYgBSACQZQBaiIJEMwMIAIoApwB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dGohBAJAIAZBAkgNACAGQQJrQQF2IgkgBCAFayIAQQJ1SA0AIAUgAEEBdSIBQQFyIgJBAnRqIQAgBiABQQJqIgFKBEAgASACIAAoAgAgACgCBCADKAIMEQAAIgEbIQIgAEEEaiAAIAEbIQALIAAoAgAgBCgCACADKAIMEQAADQAgBCgCACEBA0ACQCAEIAAiBCgCADYCACACIAlKDQAgBSACQQF0IgdBAXIiAkECdGohACAGIAdBAmoiB0oEQCAHIAIgACgCACAAKAIEIAMoAgwRAAAiBxshAiAAQQRqIAAgBxshAAsgACgCACABIAMoAgwRAABFDQELCyAEIAE2AgALIAhBAWshCAwACwALIANBEGokAAtGAgF8An8gACgCBCEDIAAoAgAhAAN8IAAgA0YEfCABBSAAKAIAIgIrAwggAisDGKEgAisDEKIgAaAhASAAQQRqIQAMAQsLC2wCAX8CfCMAQRBrIgIkACACIAE2AgwgASAANgIgIAAgAkEMahDAASAAIAIoAgwiASsDECIDIAArAxigIgQ5AxggACADIAErAwggASsDGKGiIAArAyCgIgM5AyAgACADIASjOQMQIAJBEGokAAsnACAAIAAoAhhFIAAoAhAgAXJyIgE2AhAgACgCFCABcQRAEJEBAAsLMQEDfyAAKAIEIgQgAUEEaiICayEDIAIgBEcEQCABIAIgAxC2ARoLIAAgASADajYCBAt+AQN/IAAoAgAiAUE0aiABKAI4IQMgASgCNCEBA0ACQCABIANGDQAgASgCACAARg0AIAFBBGohAQwBCwsgARC0DSAAKAIEIgFBKGogASgCLCEDIAEoAighAQNAAkAgASADRg0AIAEoAgAgAEYNACABQQRqIQEMAQsLIAEQtA0L6gEBCH8gAEHTrAMQ0QIhAiABKAIAIQYjAEEQayIDJAAgA0EIaiIEIAIQqQUaAkAgBC0AAEUNACACIAIoAgBBDGsoAgBqIgUoAgQaIANBBGoiBCAFEFMgBBC6CyEFIAQQUCADIAIQuQshByACIAIoAgBBDGsoAgBqIggQuAshCSADIAUgBygCACAIIAkgBiAFKAIAKAIQEQgANgIEIAQQpwVFDQAgAiACKAIAQQxrKAIAakEFEKoFCyADQQhqEKgFIANBEGokACACQdjgARDRAiABKAIgKwMQIAErAxigEJEH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EiACQQJ0akF/NgIAIAJBAWohAgwBCwtBhscBQZa3AUGLBkGBDhAAAAtBhscBQZa3AUGkBkGBDhAAAAtBhscBQZa3AUG4BkGBDhAAAAtBh9ABQZa3AUHQBUGBDhAAAAsgFEEQaiQAIA8L2AYCCn8BfCMAQRBrIgokACAAKAIgRQRAAkACQCAAKAIQQQFrIgQOBAEAAAEAC0HU0AFBlrcBQZAFQcg1EAAACyACKAIAIQUgACgCACEDIAAoAhghBiAAKAIUIQcCQAJAAkACQCAEDgQAAgIBAgsgACgCHCEJIAEEQCAFRQRAIANBCBA/IQULQQAhBCADQQAgA0EAShshAwNAIAMgBEYNBCAFIARBA3RqIgtCADcDACAHIARBAnRqKAIAIgAgByAEQQFqIgRBAnRqKAIAIgggACAIShshCEQAAAAAAAAAACENA0AgACAIRgRADAIFIAsgCSAAQQN0aisDACABIAYgAEECdGooAgBBA3RqKwMAoiANoCINOQMAIABBAWohAAwBCwALAAsACyAFRQRAIANBCBA/IQULQQAhASADQQAgA0EAShshBANAIAEgBEYNAyAFIAFBA3RqIgNCADcDACAHIAFBAnRqKAIAIgAgByABQQFqIgFBAnRqKAIAIgYgACAGShshBkQAAAAAAAAAACENA0AgACAGRgRADAIFIAMgCSAAQQN0aisDACANoCINOQMAIABBAWohAAwBCwALAAsACyAAKAIcIQkgAQRAIAVFBEAgA0EIED8hBQtBACEEIANBACADQQBKGyEDA0AgAyAERg0DIAUgBEEDdGoiC0IANwMAIAcgBEECdGooAgAiACAHIARBAWoiBEECdGooAgAiCCAAIAhKGyEIRAAAAAAAAAAAIQ0DQCAAIAhGBEAMAgUgCyAJIABBAnQiDGooAgC3IAEgBiAMaigCAEEDdGorAwCiIA2gIg05AwAgAEEBaiEADAELAAsACwALIAVFBEAgA0EIED8hBQtBACEBIANBACADQQBKGyEEA0AgASAERg0CIAUgAUEDdGoiA0IANwMAIAcgAUECdGooAgAiACAHIAFBAWoiAUECdGooAgAiBiAAIAZKGyEGRAAAAAAAAAAAIQ0DQCAAIAZGBEAMAgUgAyANIAkgAEECdGooAgC3oCINOQMAIABBAWohAAwBCwALAAsACyAKQcMFNgIE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AxggBiAAKALsAUHIAGxqIgEgASsDECAAKwN4ECM5AxALC4kDAgZ/BHwgABBhKAIQKALEASEFIAAQYSAARgR8RAAAAAAAACBABSAAQczbCigCAEEIQQAQYrcLIQkgACgCECIBKwOAASEHIAErA3ghCEEBIQIDQCACIAEoArQBSkUEQCABKAK4ASACQQJ0aigCACIBEO0NIQYgASgCECIEKALsASAAKAIQIgEoAuwBRgRAIAggCSAEKwN4oCIKIAggCmQbIQgLIAQoAugBIAEoAugBRgRAIAcgCSAEKwOAAaAiCiAHIApkGyEHCyADIAZyIQMgAkEBaiECDAELCyAAEGEhAiAAKAIQIQECQCAAIAJGDQAgASgCDEUNACAAEDlBASEDIAAoAhAhASgCEC0AdEEBcQ0AIAcgASsDWKAhByAIIAErAzigIQgLIAEgBzkDgAEgASAIOQN4IAAQYSAARwRAIAUgACgCECIAKALoAUHIAGxqIgEgASsDGCIJIAcgByAJYxs5AxggBSAAKALsAUHIAGxqIgAgACsDECIHIAggByAIZBs5AxALIAMLcAECf0EBIQQDQCAEIAAoAhAiAygCtAFKRQRAIAMoArgBIARBAnRqKAIAIAEgAhDuDSAEQQFqIQQMAQsLIAMgASADKwMQojkDECADIAIgAysDGKI5AxggAyABIAMrAyCiOQMgIAMgAiADKwMoojkDKAvlBAIIfwR8QQEhAgNAIAIgACgCECIDKAK0AUpFBEAgAygCuAEgAkECdGooAgAgARDvDSACQQFqIQIMAQsLIAAQYSECIAAoAhAhAwJAIAAgAkYEQCADKALsASEFRAAAwP///9/BIQpEAADA////30EhCyADKALoASIIIQQDQCAEIAVKBEAgAygCtAEiAEEAIABBAEobQQFqIQBBASECA0AgACACRg0EIAogAygCuAEgAkECdGooAgAoAhAiBCsDIEQAAAAAAAAgQKAiDCAKIAxkGyEKIAsgBCsDEEQAAAAAAAAgwKAiDCALIAxjGyELIAJBAWohAgwACwAFAkAgAygCxAEgBEHIAGxqIgAoAgAiBkUNAEEBIQIgACgCBCIHKAIAIgBFDQADQCAAKAIQIgAtAKwBIglFIAIgBk5yRQRAIAcgAkECdGooAgAhACACQQFqIQIMAQsLIAkNACAGQQJrIQIgACsDECAAKwNYoSEMIAcgBkECdGpBBGshAANAIAAoAgAoAhAiAC0ArAEEQCAHIAJBAnRqIQAgAkEBayECDAELCyAKIAArAxAgACsDYKAiDSAKIA1kGyEKIAsgDCALIAxjGyELCyAEQQFqIQQMAQsACwALIAMoAugBIQggAygC7AEhBSADKAKEAigCECgC9AG3IQogAygCgAIoAhAoAvQBtyELCyABKAIQKALEASIAIAVByABsaigCBCgCACgCECsDGCEMIAAgCEHIAGxqKAIEKAIAKAIQKwMYIQ0gAyAKOQMgIAMgCzkDECADIA0gAysDgAGgOQMoIAMgDCADKwN4oTkDGAuiAQICfAF/AkACf0H/////ByAAQdQgECciA0UNABogABA8IQAgAxCuAiEBIABBAEgNAUEAIAFEAAAAAAAAAABjDQAaIAC4IQIgAUQAAAAAAADwP2QEQEH/////B0QAAMD////fQSABoyACYw0BGgsgASACoiIBmUQAAAAAAADgQWMEQCABqg8LQYCAgIB4Cw8LQc+YA0GH/ABBzQBBztkAEAAAC4gCAgd/AXwjAEEQayIEJAAgAEHM2wooAgBBCEEAEGIgABDtBbchCCAAKAIQIgEoAugBIQMgASgChAIhBSABKAKAAiEGA0AgAyABKALsAUpFBEACQCADQcgAbCIHIAEoAsQBaiICKAIARQ0AIAIoAgQoAgAiAkUEQCAAECEhASAEIAM2AgQgBCABNgIAQdu0BCAEEDcMAQsgBiACIAIoAhArA1ggCKAgASsDYKBBABCfARogACgCECIBKALEASAHaiICKAIEIAIoAgBBAnRqQQRrKAIAIgIgBSACKAIQKwNgIAigIAErA0CgQQAQnwEaCyADQQFqIQMgACgCECEBDAELCyAEQRBqJAAL2wICCn8BfCAAQczbCigCAEEIQQAQYiEHQQEhAQNAIAAoAhAiBSgCtAEiBCABSARAIAe3IQtBASEBA0AgASAESkUEQCABQQJ0IQkgAUEBaiIHIQEDQCAFKAK4ASICIAlqKAIAIQMgASAESkUEQCACIAFBAnRqKAIAIgYgAyADKAIQKALoASAGKAIQKALoAUoiAhsiCCgCECIKKALsASADIAYgAhsiAygCECIGKALoASICTgRAIAggAyACQcgAbCICIAooAsQBaigCBCgCACgCECgC+AEg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P2UNACAAEPENIAAoAhAiASgCgAIgASgChAIgEiARIAEoAnRBAXEbIhFEAAAAAOD/70AgEUQAAAAA4P/vQGMbQegHEJ8BGgsCQCAAQQIgABDwDRDMBEUNACAAKAIQIgIoAugBIQUDQAJAAkAgAigC7AEiCiAFTgRAQQAhCCACKALEASAFQcgAbGoiBygCACIJQQAgCUEAShshA0EAIQEDQCABIANGDQNBACEEAkAgBygCBCABQQJ0aigCACIIKAIQIgsoApACIg1FDQADQCANIARBAnRqKAIAIgZFDQEgBkFQQQAgBigCAEEDcSIMQQJHG2ooAigoAhAoAvQBIAVKDQQgBEEBaiEEIAZBMEEAIAxBA0cbaigCKCgCECgC9AEgBUwNAAsMAwtBACEEAkAgCygCiAIiC0UNAANAIAsgBEECdGooAgAiBkUNASAGQTBBACAGKAIAQQNxIg1BA0cbaigCKCgCECgC9AEgBUoNBCAEQQFqIQQgBSAGQVBBACANQQJHG2ooAigoAhAoAvQBTg0ACwwDCyABQQFqIQEMAAsACyAAQQIgABDwDRDMBEUNA0GImwNBprsBQY0BQbHiABAAAAsgASEDCwJAIAhFIAMgCUhyRQRAIAdBzABBvH8gBSAKSBtqKAIAKAIAIgJFDQEgBygCBCgCACEDIAAQugIiASgCEEECOgCsASABIANEAAAAAAAAAABBABCfARogASACRAAAAAAAAAAAQQAQnwEaIAEoAhAgAygCECgC9AEiASACKAIQKAL0ASICIAEgAkgbNgL0ASAAKAIQIQILIAVBAWohBQwBCwtB0toAQaa7AUH2AEGO+gAQAAALIAAoAhAiASgC7AEhBSABKALoASECIAEoAsQBIQQDQCACIAVMBEBBACEBIAQgAkHIAGxqIgcoAgAiA0EAIANBAEobIQYDQCABIAZHBEAgBygCBCABQQJ0aigCACgCECIDKAL0ASEIIAMgAjYC9AEgAyAItzkDECABQQFqIQEMAQsLIAJBAWohAgwBCwsgACAAEO8NAkAgACgCECIBKALsAUEATA0AIAEoAggiAigCVCIFRQ0AIAErACgiESABKwAYoSIUIAErACAiEiABKwAQoSIVIAEoAnRBAXEiAxshEyAVIBQgAxshFAJAAnwCQAJAAkACQAJAIAVBAWsOBQQABwEDBwsgAisD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IAJB7BxqENAEIQcgAigC7BwhAwwBCyACQegMaiACQewcahDPBCEHIBogAigC7BwiA0EFSXINACAHIAcpAwA3AxAgByAHKQMINwMYIAcgByADQQR0akEQayIDKQMANwMgIAcgAykDCDcDKCADKQMAIWUgByADKQMINwM4IAcgZTcDMCACQQQ2AuwcQQQMAQsgA0UNASADCyEGQQAhAwwBCyAHEBhBACEDA0AgAigCmB0gA00EQCACQZAdaiIDQSAQMSADEDRBACEDA0AgAigC+B0gA00EQCACQfAdaiIDQRAQMSADEDRBACEDA0AgAigC0B0gA00EQCACQcgdaiIDQRAQMSADEDQMCwUgAkHwCWogAkHQHWopAwA3AwAgAiACKQPIHTcD6AkgAkHoCWogAxAZIQUCQAJAIAIoAtgdIgQOAgETAAsgAkHgCWogAigCyB0gBUEEdGoiBSkDCDcDACACIAUpAwA3A9gJIAJB2AlqIAQRAQALIANBAWohAwwBCwALAAUgAkHQCWogAkH4HWopAwA3AwAgAiACKQPwHTcDyAkgAkHICWogAxAZIQUCQAJAIAIoAoAeIgQOAgERAAsgAkHACWogAigC8B0gBUEEdGoiBSkDCDcDACACIAUpAwA3A7gJIAJBuAlqIAQRAQALIANBAWohAwwBCwALAAUgAkGwCWogAkGYHWopAwA3AwAgAiACKQOQHTcDqAkgAkGoCWogAxAZIQUCQAJAIAIoAqAdIgQOAgEPAAsgAkGQCWogAigCkB0gBUEFdGoiBSkDCDcDACACQZgJaiAFKQMQNwMAIAJBoAlqIAUpAxg3AwAgAiAFKQMANwOICSACQYgJaiAEEQEACyADQQFqIQMMAQsACwALA0AgAyAGSQRAIAwgByADQQR0aiIGKQMANwMAIAwgBikDCDcDCCACQfAdakEQECYhBiACKALwHSAGQQR0aiIGIAwpAwA3AwAgBiAMKQMINwMIIANBAWohAyACKALsHCEGDAELCyAHEBggCiEDA0AgCCgCACgCyAEoAgAhBiADBEAgA0EBayEDIAZBUEEAIAYoAgBBA3FBAkcbaigCKEEQaiEIDAELCyACKAL4HSIHBEAgAkHoCmogAkH4HWoiAykDADcDACACIAIpA/AdNwPgCiAMIAIoAvAdIAJB4ApqIAdBAWsQGUEEdGoiBykD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Dg0FIAIoAqwEIQggAigCqAQhCwJAAkACQCAJQQFqDgMAAQIDCyADKAIAIAIgAykCCDcDYCACIAMpAgA3A1ggAkHYAGogABAZQQJ0aigCACADKAIAIAIgAykCCDcDUCACIAMpAgA3A0ggAkHIAGogBRAZQQJ0aigCACAEQQAgBiABELgCIAMoAgAgAkFAayADKQIINwMAIAIgAykCADcDOCACQThqIAAQGUECdGooAgAgAygCACACIAMpAgg3AzAgAiADKQIANwMoIAJBKGogBRAZQQJ0aigCACAHQQEgCyABELgCIAhBAUcNAiADKAIAIAIgAykCCDcDICACIAMpAgA3AxggAkEYaiAFEBlBAnRqKAIAIAMoAgAgAiADKQIINwMQIAIgAykCADcDCCACQQhqIAAQGUECdGooAgAgByABEJcODAILAkACQAJAIAhBAWoOAwABAgQLIAMoAgAgAiADKQIINwOgASACIAMpAgA3A5gBIAJBmAFqIAAQGUECdGooAgAgAygCACACIAMpAgg3A5ABIAIgAykCADcDiAEgAkGIAWogBRAZQQJ0aigCACAEQQAgBiABELgCIAMoAgAgAiADKQIINwOAASACIAMpAgA3A3ggAkH4AGogABAZQQJ0aigCACADKAIAIAIgAykCCDcDcCACIAMpAgA3A2ggAkHoAGogBRAZQQJ0aigCACAHQQEgCyABELgCDAMLIAMoAgAgAiADKQIINwPgASACIAMpAgA3A9gBIAJB2AFqIAUQGUECdGooAgAgAygCACACIAMpAgg3A9ABIAIgAykCADcDyAEgAkHIAWogABAZQQJ0aigCAEEAIAQgBiABELgCIAMoAgAgAiADKQIINwPAASACIAMpAgA3A7gBIAJBuAFqIAUQGUECdGooAgAgAygCACACIAMpAgg3A7ABIAIgAykCADcDqAEgAkGoAWogABAZQQJ0aigCAEEBIAcgCyABELgCDAILIAMoAgAgAiADKQIINwOgAiACIAMpAgA3A5gCIAJBmAJqIAUQGUECdGooAgAgAygCACACIAMpAgg3A5ACIAIgAykCADcDiAIgAkGIAmogABAZQQJ0aigCAEEAIAQgBiABELgCIAMoAgAgAiADKQIINwOAAiACIAMpAgA3A/gBIAJB+AFqIAUQGUECdGooAgAgAygCACACIAMpAgg3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QbgCakEEECYhCiAEKAK4AiAKQQJ0aiAEKALMAjYCACACKAIAIAE2AhggCSACQQggCSgCABEDACECDAELCyAIIARB0AJqQYAEIAgoAgARAwAhAgNAAkAgASsDQCEbIAJFDQAgAisDECAbY0UNACAEIAIoAgA2AswCIARBuAJqQQQQJiEKIAQoArgCIApBAnRqIAQoAswCNgIAIAIoAgAgATYCGCAIIAJBCCAIKAIAEQMAIQIMAQsLIAQgGzkD2AIgCSAEQdACakGABCAJKAIAEQMAIQIDQAJAIAErAzghGyACRQ0AIAIrAwggG2NFDQAgBCACKAIANgLMAiAEQbgCakEEECYhCiAEKAK4AiAKQQJ0aiAEKALMAjYCACACKAIAIAE2AhQgCSACQQggCSgCABEDACECDAELCyAEIBs5A9ACIAQgASsDMDkD2AIgCCAEQdACakGABCAIKAIAEQMAIQIDQAJAIAJFDQAgAisDECABKwNAY0UNACAEIAIoAgA2AswCIARBuAJqQQQQJiEKIAQoArgCIApBAnRqIAQoAswCNgIAIAIoAgAgATYCFCAIIAJBCCAIKAIAEQMAIQIMAQsLIARBuAJqIAFBJGogAUEgakEEEMcBIAEoAiAiASAMIAEgDEsbIQwgBkEBaiEGDAELCwNAIBAgEUYEQCAAKAIQIAAoAgAiAUEobGoiAyABNgIgIAMgAUEBajYCSEEAIQMgACgCAEEGbCAMQQF0akEEEBohAiAAIAAoAgBBA2wgDGpBGBAaNgIUIAAoAgAiBkEAIAZBAEobIQEDQCABIANGBEAgBkECaiEDA0AgASADSARAIAAoAhAgAUEobGogAjYCHCABQQFqIQEgAiAMQQJ0aiECDAELCwUgACgCECADQShsaiACNgIcIANBAWohAyACQRhqIQIMAQsLQQAhBgJAAkADQCAGIA9GBEACQCAIEJkBGiAJEJkBGiALEBhBACEBQYj2CCgCACECA0AgASAAKAIATg0BIAAoAhAgAUEobGoiAygCFEUEQCAEIAE2AhAgAkH4zAQgBEEQahAgGiADKAIURQ0FCyADKAIYRQRAIAQgATYCACACQeLMBCAEECAaIAMoAhhFDQYLIAFBAWohAQwACwALBSASIAZByABsaiIBKwM4IAErAyihIhsgASsDQCABKwMwoSIfoEQAAAAAAADg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EmogBhAZQcgAbGogBTYCKAsgAigCACEGIARBkBJqIAIpAgg3AwAgBCACKQIANwOIEgJAIAYgBEGIEmogBRAZQcgAbGooAjQiBkEBa0F9Sw0AIAIoAgAgBEGAEmogAikCCDcDACAEIAIpAgA3A/gRIARB+BFqIAYQGUHIAGxqKAIsIAlHDQAgAigCACAEQfARaiACKQIINwMAIAQgAikCADcD6BEgBEHoEWogBhAZQcgAbGogBTYCLAsgAxDvASEHIAMQ7wEhCiACKAIAIARB4BFqIAIpAgg3AwAgBCACKQIANwPYESAEQdgRaiAJEBlByABsaigCOCEGIAMoAgAgBEHQEWogAykCCDcDACAEIAMpAgA3A8gRIARByBFqIAYQGUEobGpBAjYCACADKAIAIARBwBFqIAMpAgg3AwAgBCADKQIANwO4ESAEQbgRaiAGEBlBKGxqIg4gCCkDADcDCCAOIAgpAwg3AxAgAygCACAEQbARaiADKQIINwMAIAQgAykCADcDqBEgBEGoEWogBhAZQShsaiAANgIEIAMoAgAgBEGgEWogAykCCDcDACAEIAMpAgA3A5gRIARBmBFqIAYQGUEobGogCjYCICADKAIAIARBkBFqIAMpAgg3AwAgBCADKQIANwOIESAEQYgRaiAGEBlBKGxqIAc2AiQgAygCACAEQYARaiADKQIINwMAIAQgAykCADcD+BAgBEH4EGogBxAZQShsakEDNgIAIAMoAgAgBEHwEGogAykCCDcDACAEIAMpAgA3A+gQIARB6BBqIAcQGUEobGogCTYCGCADKAIAIARB4BBqIAMpAgg3AwAgBCADKQIANwPYECAEQdgQaiAHEBlBKGxqIAY2AhwgAygCACAEQdAQaiADKQIINwMAIAQgAykCADcDyBAgBEHIEGogChAZQShsakEDNgIAIAMoAgAgBEHAEGogAykCCDcDACAEIAMpAgA3A7gQIARBuBBqIAoQGUEobGogBTYCGCADKAIAIARBsBBqIAMpAgg3AwAgBCADKQIANwOoECAEQagQaiAKEBlBKGxqIAY2AhwgAigCACAEQaAQaiACKQIINwMAIAQgAikCADcDmBAgBEGYEGogCRAZQcgAbGogBzYCOCACKAIAIARBkBBqIAIpAgg3AwAgBCACKQIANwOIECAEQYgQaiAFEBlByABsaiAK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IAIoAgAgBEGIDGogAikCCDcDACAEIAIpAgA3A4AMIARBgAxqIAkQGUHIAGxqKwMYoZlESK+8mvLXej5lRSALRXINAAJAIBMoAgAiBUEATA0AIAUgASAHEMcERQ0AIAIoAgAhBSAEQbgLaiACKQIINwMAIAQgAikCADcDsAsgBSAEQbALaiAIEBlByABsaigCMCEHIARBqAtqIAIpAgg3AwAgBCACKQIANwOgCyAFIARBoAtqIAcQGUHIAGxqIAg2AiggAigCACAEQZgLaiACKQIINwMAIAQgAikCADcDkAsgBEGQC2ogBhAZQcgAbGpBfzYCMCACKAIAIARBiAtqIAIpAgg3AwAgBCACKQIANwOACyAEQYALaiAGEBlByABsakF/NgI0DAILIAIoAgAhBSAEQfgLaiACKQIINwMAIAQgAikCADcD8AsgBSAEQfALaiAGEBlByABsaigCMCEHIARB6AtqIAIpAgg3AwAgBCACKQIANwPgCyAFIARB4AtqIAcQGUHIAGxqIAY2AiwgAigCACAEQdgLaiACKQIINwMAIAQgAikCADcD0AsgBEHQC2ogCBAZQcgAbGpBfzYCMCACKAIAIARByAtqIAIpAgg3AwAgBCACKQIANwPACyAEQcALaiAIEBlByABsakF/NgI0DAELIAIoAgAhBSAEQfgKaiACKQIINwMAIAQgAikCADcD8AogBSAEQfAKaiAIEBlByABsaigCMCEHIARB6ApqIAIpAgg3AwAgBCACKQIANwPgCgJAIAUgBEHgCmogBxAZQcgAbGooAihBAWtBfUsNACACKAIAIQUgBEHYCmogAikCCDcDACAEIAIpAgA3A9AKIAUgBEHQCmogCBAZQcgAbGooAjAhByAEQcgKaiACKQIINwMAIAQgAikCADcDwAogBSAEQcAKaiAHEBlByABsaigCLEEBa0F9Sw0AIAIoAgAhBSAEQbgKaiACKQIINwMAIAQgAikCADcDsAogBSAEQbAKaiAIEBlByABsaigCMCEHIARBqApqIAIpAgg3AwAgBCACKQIANwOgCiAFIARBoApqIAcQGUHIAGxqKAIoIQcgAigCACEFIARBmApqIAIpAgg3AwAgBCACKQIANwOQCiAFIARBkApqIAgQGUHIAGxqKAIwIQogBEGICmogAikCCDcDACAEIAIpAgA3A4AKIAUg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aCAEIAIpAgA3A2AgBSAEQeAAaiAHEBlByABsaiAGNgIoIAIoAgAhBSAEIAIpAgg3A1ggBCACKQIANwNQIAUgBEHQAGogCBAZQcgAbGooAjQhByAEIAIpAgg3A0ggBCACKQIANwNAIAUgBEFAayAHEBlByABsakF/NgIsIAIoAgAgBCACKQIINwM4IAQgAikCADcDMCAEQTBqIAgQGUHIAGxqQX82AjQgAigCACAEIAIpAgg3AyggBCACKQIANwMgIARBIGogCBAZQcgAbGpBMGoMAQsgB0F/NgIsIAIoAgAhBSAEIAIpAgg3A/gBIAQgAikCADcD8AEgBSAEQfABaiAIEBlByABsaigCNCEHIAQgAikCCDcD6AEgBCACKQIANwPgASAFIARB4AFqIAcQGUHIAGxqIAg2AiggAigCACEFIAQgAikCCDcD2AEgBCACKQIANwPQASAFIARB0AFqIAgQGUHIAGxqKAI0IQcgBCACKQIINwPIASAEIAIpAgA3A8ABIAUgBEHAAWogBxAZQcgAbGogBjYCLCACKAIAIAQgAikCCDcDuAEgBCACKQIANwOwASAEQbABaiAIEBlByABsaigCNCEFIAIoAgAgBCACKQIINwOoASAEIAIpAgA3A6ABIARBoAFqIAYQGUHIAGxqIAU2AjAgAigCACAEIAIpAgg3A5gBIAQgAikCADcDkAEgBEGQAWogBhAZQcgAbGpBfzYCNCACKAIAIAQgAikCCDcDiAEgBCACKQIANwOAASAEQYABaiAIEBlByABsakE0agsoAgAhBSACKAIAIAQgAikCCDcDGCAEIAIpAgA3AxAgBEEQaiAIEBlByABsaiAANgIEIAIoAgAgBCACKQIINwMIIAQgAikCADcDACAEIAYQGUHIAGxqIAA2AgAMAAsAC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALySADEH8CfAJ+IwBBkAlrIgQkACAEQaAIaiIJQQBBwAAQOBogAEEAQeAAEDgiBUHIABAmIQAgBSgCACAAQcgAbGogBUEYakHIABAfGiADKAIAIRMgCRDvASEJIARBmAhqIARBqAhqIgApAwA3AwAgBCAEKQOgCDcDkAggBCgCoAggBEGQCGogCRAZQShsakECNgIAIARBiAhqIAApAwA3AwAgBCAEKQOgCDcDgAggBCgCoAggBEGACGog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AiACKAIAQQNxIQMLIAIgBiADQQNGGygCKCAFRw0CQZDdCigCACIDRQ0CIAIgAxBFIgMtAABFDQIgAUGwAmogAiADEMAODAILA0ACQCADIARPBEAgAUHgAmpBHBAxQQAhA0EAIQIDQCACIAEoArgCIgRPDQIgASABKQK4AjcD+AEgASABKQKwAjcD8AEgASgCsAIgAUHwAWogAhAZQRxsaigADEECTwRAIAEgASkCuAI3A+gBIAEgASkCsAI3A+ABIAEgASgCsAIgAUHgAWogAhAZQRxsaiIEKQIUNwPYASABIAQpAgw3A9ABIAEgBCkCBDcDyAEgBSABQcgBahDBDgsgAkEBaiECDAALAAsgASABKQLoAjcDwAEgASABKQLgAjcDuAEgAUG4AWogAxAZIQICQAJAIAEoAvACIgQOAgEJAAsgASABKALgAiACQRxsaiICKQIINwOgASABIAIpAhA3A6gBIAEgAigCGDYCsAEgASACKQIANwOYASABQZgBaiAEEQEACyADQQFqIQMgASgC6AIhBAwBCwsDQCADIARPBEAgAUGwAmpBHBAxIAAgBRAdIQUMBQUgASABKQK4AjcDqAIgASABKQKwAjcDoAIgAUGgAmogAxAZIQICQAJAIAEoAsACIgQOAgEJAAsgASABKAKwAiACQRxsaiICKQIINwOIAiABIAIpAhA3A5ACIAEgAigCGDYCmAIgASACKQIANwOAAiABQYACaiAEEQEACyADQQFqIQMgASgCuAIhBAwBCwALAAsgAUHgAmogAiADEMAOCyAAIAIgBRByIQIMAAsACwALIAFBkANqJAAPC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALHAEBf0EBIQIgACABENIOBH9BAQUgACABENEOCwtAAQJ/AkAgASAAKAIATw0AIAIgACgCBCIETw0AIAAoAgggASAEbCACaiIAQQN2ai0AACAAQQdxdkEBcSEDCyADC84CAQp/AkACQCAABEAgACgCACIFIAFLIAAoAgQiBCACS3FFBEAgBCACQQFqIgMgAyAESRsiBCAFIAFBAWoiAyADIAVJGyIFbCIDQQN2IANBB3FBAEdqEMYDIQcgACgCACEIA0AgBiAIRwRAIAQgBmwhCSAAKAIEIQpBACEDA0AgAyAKRgRAIAZBAWohBgwDCyAAIAYgAxDEDgRAIAcgAyAJaiILQQN2aiIMIAwtAABBASALQQdxdHI6AAALIANBAWohAwwACwALCyAAKAIIEBggACAHNgIIIAAgBDYCBCAAIAU2AgALIAEgBU8NASACIARPDQIgACgCCCABIARsIAJqIgBBA3ZqIgEgAS0AAEEBIABBB3F0cjoAAA8LQcbVAUGbuQFByQBB7CEQAAALQYwmQZu5AUHmAEHsIRAAAAtBwyxBm7kBQecAQewhEAAAC0wBAX8DQCAAIgEoAhAoAngiAA0ACyABQTBBACABKAIAQQNxIgBBA0cbaigCKCgCECgC6AEgAUFQQQAgAEECRxtqKAIoKAIQKALoAUcLqgIBB38jAEEQayIEJAAgACgCACIDKAIQIQUgAygCCCEGIAIEQBCiDgsgBUEYaiICIQADQCAAKAIAIgAEQCAAKAIIRQRAEKIOCyAAQQxqIQAMAQsLIAFBggJrIgFBA0kEQCADIAEQowggAiEAA0AgACgCACIABEACQCAAKAIAQYsCRg0AAkAgACgCBCIDLQAVBEAgBSgCACAGRg0BCyAAKAIIEHYgACgCCCEDIAUoAgAhByAAKAIEKAIIIQgEQCAHIAEgCCADEOcDIQMMAQsgByABIAggAxAiIQMLIAUoAgAgBkcNACADQQE6ABYLIABBDGohAAwBCwsgBiACELkCIARBEGokAA8LIARB9gI2AgQgBEHcETYCAEGI9ggoAgBB2L8EIAQQIBoQOwALzwQBB38jAEEgayIEJAACQAJAAkACQAJAIAFBUEEAIAEoAgBBA3EiBUECRxtqKAIoIgYoAhAoAtABIgdFDQAgAUEwQQAgBUEDRxtqIQgDQCAHIANBAnRqKAIAIgJFDQEgA0EBaiEDIAJBUEEAIAIoAgBBA3FBAkcbaigCKCAIKAIoRw0ACyABIAIQjAMCQCACKAIQIgAtAHBBBEcNACAAKAJ4DQAgACABNgJ4CyABIAFBMGoiACABKAIAQQNxQQNGGygCKCgCECIDKALkASICQQFqIgVB/////wNPDQIgAkECaiICQYCAgIAETw0DIAMoAuABIQMCQCACRQRAIAMQGEEAIQIMAQsgAyACQQJ0IgMQaiICRQ0FIAMgBUECdCIFTQ0AIAIgBWpBADYAAAsgASAAIAEoAgBBA3FBA0YbKAIoKAIQIAI2AuABIAEgACABKAIAQQNxQQNGGygCKCgCECICIAIoAuQBIgNBAWo2AuQBIAIoAuABIANBAnRqIAE2AgAgASAAIAEoAgBBA3FBA0YbKAIoKAIQIgAoAuABIAAoAuQBQQJ0akEANgIADAELIAYgAUEwQQAgBUEDRxtqKAIoIAEQqAgiAigCECIDQQRBAyABKAIQIgEtAHBBBEYbOgBwIAMgASgCYDYCYCAAIAIQ+wULIARBIGokAA8LQY7AA0HS/ABBzQBBvbMBEAAACyAEQQQ2AgQgBCACNgIAQYj2CCgCAEGm6gMgBBAgGhAvAAsgBCADNgIQQYj2CCgCAEH16QMgBEEQahAgGhAvAAu8AQEDfyABKAIQIgRBATYCsAECQCAEKALUAUUNAANAIAQoAtABIAVBAnRqKAIAIgZFDQECQCAAIAYQ+QVFDQAgBkFQQQAgBigCAEEDcUECRxtqKAIoIgQoAhAoArABDQAgACAEIAIgAxDJDgsgBUEBaiEFIAEoAhAhBAwACwALIAMgBCgC9AFHBEBB1TtBm7kBQbYKQck5EAAACyACIAE2AhQgAkEEECYhACACKAIAIABBAnRqIAIoAhQ2AgALjQMBB38gACgCECgCxAEgASgCECICKAL0AUHIAGxqKAJAIQYgAkEBOgC0ASACQQE2ArABIAAQYSEFAkAgASgCECIDKALQASICRQ0AIAUoAhAoArQBQQBMIQcDQCACIARBAnRqKAIAIgJFDQECQCAHRQRAIAAgAkEwQQAgAigCAEEDcUEDRxtqKAIoEKkBRQ0BIAAgAkFQQQAgAigCAEEDcUECRxtqKAIoEKkBRQ0BCyACKAIQKAKcAUUNACACIAJBMGsiCCACKAIAQQNxIgNBAkYbKAIoKAIQIgUtALQBBEAgBiAFKAKsAiACQTBBACADQQNHG2ooAigoAhAoAqwCEMUOIAIQpgggBEEBayEEIAIoAhAtAHBBBEYNASAAIAIQyA4MAQsgBiACQTBBACADQQNHG2ooAigoAhAoAqwCIAUoAqwCEMUOIAIgCCACKAIAQQNxQQJGGygCKCICKAIQKAKwAQ0AIAAgAhDKDgsgBEEBaiEEIAEoAhAiAygC0AEhAgwACwALIANBADoAtAELJQEBfyAAEBwhAgNAIAIEQCAAIAIgARCUCCAAIAIQHSECDAELCwvQAQEHfyABKAIQKALIASECA0AgAigCACIBBEAgAUFQQQAgASgCAEEDcUECRxtqKAIoKAIQKAL4ASEFIAAoAhAoAsgBIQQgASgCECIGLgGaASEHA0AgBCgCACIBBEACQAJAIAUgAUFQQQAgASgCAEEDcUECRxtqKAIoKAIQKAL4ASIISARAIAEoAhAhAQwBCyAFIAhHDQEgASgCECIBKwM4IAYrAzhkRQ0BCyABLgGaASAHbCADaiEDCyAEQQRqIQQMAQsLIAJBBGohAgwBCwsgAwvSAQIFfwJ+IAEoAhAoAsABIQIDQCACKAIAIgEEQCABQTBBACABKAIAQQNxQQNHG2ooAigoAhAoAvgBIQQgACgCECgCwAEhAyABKAIQIgUyAZoBIQgDQCADKAIAIgEEQAJAAkAgBCABQTBBACABKAIAQQNxQQNHG2ooAigoAhAoAvgBIgZIBEAgASgCECEBDAELIAQgBkcNASABKAIQIgErAxAgBSsDEGRFDQELIAEyAZoBIAh+IAd8IQcLIANBBGohAwwBCwsgAkEEaiECDAELCyAHC+ACAQh/IAAoAgAhBSABQQBMIQlBACEBA0AgBSABQQJ0aigCACIEBEAgBEEoaiEIIAEhAAJAIAlFBEADQCAFIABBAWoiAEECdGooAgAiAkUNAiACKAIQIgYrAxAgBCgCECIHKwMQoSACQVBBACACKAIAQQNxQQJHG2ooAigoAhAoAvgBIAhBUEEAIAQoAgBBA3FBAkcbaigCACgCECgC+AFrt6JEAAAAAAAAAABjRQ0AIAYuAZoBIAcuAZoBbCADaiEDDAALAAsDQCAFIABBAWoiAEECdGooAgAiAkUNASACKAIQIgYrAzggBCgCECIHKwM4oSACQTBBACACKAIAQQNxQQNHG2ooAigoAhAoAvgBIAhBMEEAIAQoAgBBA3FBA0cbaigCACgCECgC+AFrt6JEAAAAAAAAAABjRQ0AIAYuAZoBIAcuAZoBbCADaiEDDAALAAsgAUEBaiEBDAELCyADC6UCAQN/AkAgAkUEQANAIAMgASgCECICKALMAU8NAiACKALIASADQQJ0aigCACICIAJBMGsiBCACKAIAQQNxQQJGGygCKCgCECIFKAKwAUUEQCAFQQE2ArABIAAgAiAEIAIoAgBBA3FBAkYbKAIoNgIUIABBBBAmIQIgACgCACACQQJ0aiAAKAIUNgIACyADQQFqIQMMAAsACwNAIAMgASgCECICKALEAU8NASACKALAASADQQJ0aigCACICIAJBMGoiBCACKAIAQQNxQQNGGygCKCgCECIFKAKwAUUEQCAFQQE2ArABIAAgAiAEIAIoAgBBA3FBA0YbKAIoNgIUIABBBBAmIQIgACgCACACQQJ0aiAAKAIUNgIACyADQQFqIQMMAAsACwufBAEGfyMAQfAAayICJAAgASgCECgC9AEiA0HIAGwiBSAAKAIQKALEAWoiBCgCACEGAkACfwJAIAQoAghBAEwEQCAAECEhACABECEhASACIAY2AhAgAiADNgIMIAIgATYCCCACIAA2AgQgAkGSCTYCAEGd3gQgAhA3DAELIAQoAgQgBkECdGogATYCACABKAIQIAY2AvgBIAAoAhAiBCgCxAEgBWoiACAAKAIAIgVBAWo2AgAgBSAAKAIITg0CIANByABsIgVB6P0KKAIAKAIQKALEAWooAggiByAGSARAIAEQISEAIAEoAhAoAvgBIQEgAkHo/QooAgAoAhAoAsQBIAVqKAIINgIwIAJBpgk2AiAgAiAANgIkIAIgATYCKCACIAM2AixB7MoEIAJBIGoQNwwBCyAEKALsASEFIAQoAugBIgQgA0wgAyAFTHFFBEAgAiAFNgJMIAIgBDYCSCACIAM2AkQgAkGrCTYCQEGlzAQgAkFAaxA3DAELQQAgACgCBCAGQQJ0aiAAKAIMIAdBAnRqTQ0BGiABECEhAEHo/QooAgAoAhAoAsQBIANByABsaigCCCEGIAEoAhAoAvgBIQEgAiADNgJgIAIgAzYCZCACIAY2AmggAkGxCTYCUCACIAM2AlQgAiAANgJYIAIgATYCXEG1ywQgAkHQAGoQNwtBfwsgAkHwAGokAA8LQaDqAEGbuQFBmQlBivQAEAAAC2IBAn8CfwJAIAEoAhAiAS0ArAFBAUcNACABKALEAUEBRw0AIAEoAswBQQFHDQAgASgCyAEhAQNAIAEoAgAiAigCECIDQfgAaiEBIAMtAHANAAtBASAAIAIQqQENARoLQQALCx0BAX8gASgCEC0ArAEEf0EABSAAIAEQqQFBAEcLC9wBAQN/IAJBAE4hBSABIQMDQCABIQQCQAJAAn8gBUUEQCADKAIQIgMoAvgBIgFBAEwNAkHo/QooAgAoAhAoAsQBIAMoAvQBQcgAbGooAgQgAUECdGpBBGsMAQtB6P0KKAIAKAIQKALEASADKAIQIgEoAvQBQcgAbGooAgQgASgC+AEiAUECdGpBBGoLKAIAIgNFDQAgAygCECgC+AEgAWsgAmxBAEoNAUH2lQNBm7kBQfIGQZI3EAAACyAEDwsgAyEBIAAgAxDSDg0AIAMgBCAAIAMQ0Q4bIQEMAAsACz0BAn8gABDVDkEBIQEDQCABIAAoAhAiAigCtAFKRQRAIAIoArgBIAFBAnRqKAIAENQOIAFBAWohAQwBCwsLXgECfwJAIAAoAhAiASgCjAJFDQAgASgC6AEhAgNAIAIgASgC7AFKDQEgASgCjAIgAkECdGogASgCxAEgAkHIAGxqKAIEKAIANgIAIAJBAWohAiAAKAIQIQEMAAsACwvEAQEEfyACKAIQIgYoAugBIQMgASgCECIEKALoASEFAkACQAJAQeT9Ci0AAEUEQCAFRSADRXIgAyAFRnINASAELQC1AUEHRgRAIAQtAKwBQQFGDQQLIAYtALUBQQdHDQIgBi0ArAFBAUYNAwwCCyADIAVHDQELIAAoAhAiACgCxAEgBCgC9AFByABsaigCQCIDRQ0BIAMgAiABIAAoAnRBAXEiABsoAhAoAqwCIAEgAiAAGygCECgCrAIQxA4PC0EBDwtBAAuBAgIJfwF8IAAoAhAiASgC7AEhBSABKALoASIDIQIDQCACIAVKBEADQAJAIAMgBUoNACADQcgAbCICQej9CigCACgCECgCxAFqQQA6ADEgASgCxAEgAmoiASgCBCABKAIAQQRBpQMQtQEgA0EBaiEDIAAoAhAiASgC7AEhBQwBCwsFQQAhBCABKALEASACQcgAbGoiBygCACIGQQAgBkEAShshCANAIAQgCEZFBEACfyAHKAIEIARBAnRqKAIAKAIQIgkrAxAiCplEAAAAAAAA4EFjBEAgCqoMAQtBgICAgHgLIQYgCSAGNgL4ASAEQQFqIQQMAQsLIAJBAWohAgwBCwsLvwEBA38gACgCEEEYaiEAAkACQANAIAAoAgAiAARAAkACQCAAKAIAIgJBigJGBEAgACgCBEUNAiAAKAIIEHYgACgCCCECIAAoAgQhA0UNASABIAMgAhCoBAwCCyABLQAAQQJxRQ0EIAJBiwJHDQUgACgCBBChCA0BQcCgA0HcEUHVAkGDKRAAAAsgASADIAIQcQsgAEEMaiEADAELCw8LQdrbAUHcEUHTAkGDKRAAAAtBpOwAQdwRQdQCQYMpEAAAC7gJAQ1/IwBB0ABrIgIkACACQgA3A0ggAkFAayINQgA3AwAgAkIANwM4IAAoAhAiBC0A8AFBAUYEQCAEKALoASEJA0AgBCgC7AEgCUgEQANAIAIoAkAgCk0EQCACQThqIgBBBBAxIAAQNAUgAiACQUBrKQMANwMQIAIgAikDODcDCCACQQhqIAoQGSEAAkACQAJAIAIoAkgiAQ4CAgABCyACKAI4IABBAnRqKAIAEBgMAQsgAigCOCAAQQJ0aigCACABEQEACyAKQQFqIQoMAQsLBQJAIAlByABsIgggBCgCxAFqIgUoAgAiAUUNAEEAIQMgAUEAIAFBAEobIQQgBSgCBCIFKAIAKAIQKAL4ASEMQQAhAQNAIAEgBEZFBEAgBSABQQJ0aigCACgCEEEANgKwASABQQFqIQEMAQsLA0AgAigCQCADTQRAIAJBOGpBBBAxQQAhBQNAIAAoAhAiBCgCxAEgCGoiASgCACIDIAVKBEAgASgCBCIBIAVBAnRqIAEgA0ECdGogBUF/c0ECdGogBC0AdEEBcRsoAgAhBEEAIQZBACEBQQAhBwNAIAQoAhAiAygC3AEgAU0EQEEAIQEDQCADKALUASABTQRAAkAgBiAHckUEQCACIAQ2AkwgAkE4akEEECYhASACKAI4IAFBAnRqIAIoAkw2AgAMAQsgAygCsAEgB3INACAAIAQgAkE4aiAJEMkOCyAFQQFqIQUMBQUgACADKALQASABQQJ0aigCABD5BSAGaiEGIAQoAhAhAyABQQFqIQEMAQsACwAFIAAgAygC2AEgAUECdGooAgAQ+QUgB2ohByABQQFqIQEMAQsACwALCwJAAkAgAigCQEUNACAELQB0QQFxRQRAIAJBOGoQiAsLQQAhC0EAIQMDQCADIAAoAhAiBCgCxAEiBiAIaigCACIHTkUEQCACIA0pAwA3AzAgAiACKQM4NwMoIAIoAjghASACQShqIAMQGSEEIAAoAhAoAsQBIAhqKAIEIANBAnRqIAEgBEECdGooAgAiATYCACABKAIQIAMgDGo2AvgBIANBAWohAwwBCwsDQCAHIAtMDQFBACEBIAYgCGooAgQgC0ECdGooAgAiDCgCECgC0AEiBQRAA0ACQCAAKAIQIQQgBSABQQJ0aigCACIDRQ0AIANBMEEAIAMoAgBBA3EiBkEDRxtqKAIoKAIQKAL4ASEHIANBUEEAIAZBAkcbaigCKCgCECgC+AEhBgJAAkAgBC0AdEEBcUUEQCAGIAdIDQEMAgsgBiAHTA0BCyAAIAMQ+QUNBiADEKYIIAAgAxDIDiABQQFrIQEgDCgCECgC0AEhBQsgAUEBaiEBDAELCyAEKALEASIGIAhqKAIAIQcLIAtBAWohCwwACwALQej9CigCACgCECgCxAEgCGpBADoAMQwDC0GFpwNBm7kBQfEKQdM5EAAABSACIA0pAwA3AyAgAiACKQM4NwMYIAJBGGogAxAZIQECQAJAAkAgAigCSCIEDgICAAELIAIoAjggAUECdGooAgAQGAwBCyACKAI4IAFBAnRqKAIAIAQRAQALIANBAWohAwwBCwALAAsgCUEBaiEJDAELCwsgAkHQAGokAAvAAgEHfyAAKAIQIgMoAugBIQUDQEEAIQJBACEBIAUgAygC7AFKRQRAA0AgAiAFQcgAbCIHIAMoAsQBaiIEKAIAIgZORQRAIAQoAgQgAkECdGooAgAoAhAiBCACNgKsAiAEQQA6ALQBIARBADYCsAECfyAEKALUASIERSABckEBcQRAIARBAEcgAXIMAQtBDBDGAyIBIAYgBmwiA0EDdiADQQVxQQBHahDGAzYCCCABIAY2AgQgASAGNgIAIAAoAhAiAygCxAEgB2ogATYCQEEBCyEBIAJBAWohAgwBCwtBACECAkAgAUEBcUUNAANAIAIgAygCxAEgB2oiASgCAE4NASABKAIEIAJBAnRqKAIAIgEoAhAoArABRQRAIAAgARDKDiAAKAIQIQMLIAJBAWohAgwACwALIAVBAWohBQwBCwsLpQkBC38jAEHQAGsiAyQAIANCADcDSCADQUBrQgA3AwAgA0IANwM4IAAoAhAiBEHAAWohAgNAIAIoAgAiAgRAIAIoAhAiAkEANgKwASACQbgBaiECDAELCyAEKALsASEFIAQoAugBIQIDQCACIAVMBEAgBCgCxAEgAkHIAGxqQQA2AgAgAkEBaiECDAELCyAAEDkhAiAAKAIQKALAASEEAkAgACACRiIFBEAgBCECDAELA0AgBCICKAIQKAK4ASIEDQALC0HIAUHAASABGyEIQbgBQbwBIAUbIQkgA0HMAGohCgJAA0AgAgRAAkAgAigCECIEIAhqKAIAKAIADQAgBCgCsAENACAEQQE2ArABIAMgAjYCTCADQThqQQQQJiEEIAMoAjggBEECdGogAygCTDYCAANAIAMoAkBFDQEgA0E4aiAKEKEEIAMoAkwiBSgCEC0AtQFBB0cEQCAAIAUQ0A4EQEEAIQIDQCADKAJAIAJNBEBBfyEEDAgFIAMgA0FAaykDADcDMCADIAMpAzg3AyggA0EoaiACEBkhAAJAAkACQCADKAJIIgEOAgIAAQsgAygCOCAAQQJ0aigCABAYDAELIAMoAjggAEECdGooAgAgAREBAAsgAkEBaiECDAELAAsACyADQThqIAUgARDPDgwBCyADQThqIQtBACEEAkAgAUEBaiIMIAUoAhAoAugBIgYoAhAiBSwAkQJGDQAgBSgC6AEhBQNAIAYoAhAiBCgC7AEiByAFTgRAIAVBAnQhByAFQQFqIQUgACAHIAQoAowCaigCABDQDiIERQ0BDAILCyAEKALoASEFA0AgBSAHTARAIAsgBCgCjAIgBUECdGooAgAgARDPDiAFQQFqIQUgBigCECIEKALsASEHDAELCyAEIAw6AJECQQAhBAsgBEUNAAtBACECA0AgAiADKAJATw0EIAMgA0FAaykDADcDICADIAMpAzg3AxggA0EYaiACEBkhAAJAAkACQCADKAJIIgEOAgIAAQsgAygCOCAAQQJ0aigCABAYDAELIAMoAjggAEECdGooAgAgAREBAAsgAkEBaiECDAALAAsgAigCECAJaigCACECDAELC0Ho/QooAgAhBSAAKAIQIgIoAugBIQQDQCACKALsASAETgRAIARByABsIgEgBSgCECgCxAFqQQA6ADECQCACLQB0QQFxRQ0AIAIoAsQBIAFqIgEoAgAiBkEATA0AIAZBAWsiBkEBdkEBaiEHIAEoAgQhAUEAIQIDQCACIAdHBEAgASACQQJ0aigCACABIAYgAmtBAnRqKAIAEJcIIAJBAWohAgwBCwsgACgCECECCyAEQQFqIQQMAQsLAkAgABBhIABHDQAQyQRCAFcNACAAQQAQlggLQQAhBEEAIQIDQCACIAMoAkBPDQEgAyADQUBrKQMANwMQIAMgAykDODcDCCADQQhqIAIQGSEAAkACQAJAIAMoAkgiAQ4CAgABCyADKAI4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IQILIAMgASACIAYQ6w4gASECCyAAIAYQMCEGDAALAAsACyAAEOoODAELIAAgA0EAQQAQ6Q4gAxAcIQEDQCABBEAgASgCECICQQA6ALQBIAJBADYCsAEgAyABEB0hAQwBCwsgAxAcIQEDQCABBEAgAyABEOgOIAMgARAdIQEMAQsLIAMQHCEBA0AgAQRAIAEoAhBBADYCkAEgAyABEB0hAQwBCwtBACEJIAMQHCEBA0AgAQRAIAEoAhAoApABRQRAIAMgASAJQQFqIgkQoAgLIAMgARAdIQEMAQsLAkAgCUECSA0AIANB5xwQygQhAiADEBwhAUEBIQgDQCABRQ0BIAggASgCECgCkAFGBEAgAyACIAFBAEEBEF4aIAhBAWohCAsgAyABEB0hAQwACwALIAMQHCEHA0AgBwRAIAMgBxAsIQEDQCABBEAgBygCECICKALIASACKALMASICQQFqIAJBAmoQ2gEhBCAHKAIQIgIgBDYCyAEgAiACKALMASICQQFqNgLMASAEIAJBAnRqIAE2AgAgBygCECICKALIASACKALMAUECdGpBADYCACABIAFBMGsiBSABKAIAQQNxQQJGGygCKCgCECICKALAASACKALEASICQQFqIAJBAmoQ2gEhAiABIAUgASgCAEEDcUECRhsoAigoAhAgAjYCwAEgASAFIAEoAgBBA3FBAkYbKAIoKAIQIgQgBCgCxAEiAkEBajYCxAEgBCgCwAEgAkECdGogATYCACABIAUgASgCAEEDcUECRhsoAigoAhAiAigCwAEgAigCxAFBAnRqQQA2AgAgAyABEDAhAQwBCwsgAyAHEB0hBwwBCwsgA0EBIBAgAEGnhwEQJyICBH8gAhCRAgVBfwsQ/w4aIAAoAhBC/////3c3A+gBQQAhBwJAIAlBAkgNACAJQQFqIgIQnwghB0EBIQEDQCABIAJGDQEgByABQQJ0akH/////BzYCACABQQFqIQEMAAsACyAAEBwhCANAIAgEQCAIEIYCIQIgCCgCECIBIAIoAhAoAqQBKAIQIgIoAvQBIgU2AvQBIAUgACgCECIEKALsAUoEQCAEIAU2AuwBCyAFIAQoAugBSARAIAQgBTYC6AELIAcEQCABIAIoApABIgI2ApABIAcgAkECdGoiAiACKAIAIgIgBSACIAVIGzYCAAsgACAIEB0hCAwB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IAFCADcDECABQgA3AwggASAANgIcIAFBCGpBBBAmIQAgASgCCCAAQQJ0aiABKAIcNgIAIAFBHGohCkH/////ByEEA0AgASgCEARAIAFBCGogCkEEEL4BQQAhACABKAIcIQcDQCAHKAIQIgIoAsgBIABBAnRqKAIAIgMEQCADQVBBACADKAIAQQNxIgtBAkcbaigCKCIMKAIQIg0oArACIQYCQCADKAIQIg4oAqQBQQBIBEAgBiAITCAGIAlOcQ0BIA0oAvQBIANBMEEAIAtBA0cbaigCKCgCECgC9AEgDigCrAFqayICIAQgBUUgAiAESHIiAhshBCADIAUgAhshBQwBCyAGIAIoArACTg0AIAEgDDYCHCABQQhqQQQQJiECIAEoAgggAkECdGogASgCHDYCAAsgAEEBaiEADAEFQQAhACAEQQBMDQMDQCACKAKYAiAAQQJ0aigCACIDRQ0EIANBMEEAIAMoAgBBA3FBA0cbaigCKCIDKAIQKAKwAiACKAKwAkgEQCABIAM2AhwgAUEIakEEECYhAiABKAIIIAJBAnRqIAEoAhw2AgAgBygCECECCyAAQQFqIQAMAAsACwALAAsLDAELIAQoAhAiACgCsAIhCCAAKAKsAiEJIAFBADYCGCABQgA3AxAgAUIANwMIIAEgBDYCHCABQQhqQQQQJiEAIAEoAgggAEECdGogASgCHDYCACABQRxqIQpB/////wchBANAIAEoAhAEQCABQQhqIApBBBC+AUEAIQAgASgCHCEHA0AgBygCECICKALAASAAQQJ0aigCACIDBEAgA0EwQQAgAygCAEEDcSILQQNHG2ooAigiDCgCECINKAKwAiEGAkAgAygCECIOKAKkAUEASARAIAYgCEwgBiAJTnENASADQVBBACALQQJHG2ooAigoAhAoAvQBIA0oAvQBIA4oAqwBamsiAiAEIAVFIAIgBEhyIgIbIQQgAyAFIAIbIQUMAQsgBiACKAKwAk4NACABIAw2AhwgAUEIakEEECYhAiABKAIIIAJBAnRqIAEoAhw2AgALIABBAWohAAwBBUEAIQAgBEEATA0DA0AgAigCoAIgAEECdGooAgAiA0UNBCADQVBBACADKAIAQQNxQQJHG2ooAigiAygCECgCsAIgAigCsAJIBEAgASADNgIcIAFBCGpBBBAmIQIgASgCCCAC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4woQwgEQcQtBkOMKECQEQCAAQeDjCigCACgCFEGQ4woQwgEQcQtBsOMKECQEQCAAQeDjCigCACgCHEGw4woQwgEQiwYLQcDjChAkBEAgAEHg4wooAgAoAiRBwOMKEMIBEHELQdDjChAkBEAgAEHg4wooAgAoAiBB0OMKEMIBEHELQYilCkKAgICAgICA+D83AwBB+KQKQoCAgICAgID4PzcDAEHopApCgICAgICAgPg/NwMAQeCkCkKAgICAgICA+D83AwBByKQKQoCAgICAgID4PzcDAEHApApCgICAgICAgPg/NwMAQYjkCkIANwMAQfjjCkIANwMAQZzkCkEANgIAQZTkCkEANgIAC30AIAAoAhAoAgghAEHw4goQJARAIABB4OMKKAIAKAIIQfDiChDCARBxC0Gw4woQJARAIABB4OMKKAIAKAIMQbDjChDCARCLBgtBgKUKQoCAgICAgID4PzcDAEHwpApCgICAgICAgPg/NwMAQZjkCkEANgIAQZDkCkEANgIAC3MAIAAoAhAoAggiAEHg4wooAgAoAgBB8OIKEMIBEHEgACgCECgCDARAIABB4OMKKAIAKAIEQbDjChDCARBxC0HYpApCgICAgICAgPg/NwMAQbikCkKAgICAgICA+D83AwBBhOQKQQA2AgBB9OMKQQA2AgALxAMBBH8jAEEQayIDJAAgACgCECgCCCEBQeTjCigCAEUEQEHs4wpBoAI2AgBB6OMKQaECNgIAQeTjCkHw7wkoAgA2AgALIAEoAkwiAigCBCEEIAJB5OMKNgIEAkACQAJAAkACQAJAIAAoAkAOBwEBBAACAgIDCyAAIAEgAEEBEMcIDAQLIAAtAJsBQQhxDQMgASAAENUIDAMLQeDiChAkBEBB4OMKKAIAKAIAIgJFBEAgAUEAQcHDARCIASECQeDjCigCACACNgIACyABIAJB4OIKEMIBEHELIAEoAhAoAgwEQCABQeDjCigCACgCBEGg4woQwgEQiwYLQQAhAiABQb7jAEHg4wooAgAoAiwQkAcDQCACQQhGRQRAIAJBBHRB4OIKahBcIAJBAWohAgwBCwtB4OMKKAIAEBhB0KQKQoCAgICAgID4PzcDAEGwpApCgICAgICAgPg/NwMAQYDkCkEANgIAQfDjCkEANgIAIAAtAJsBQQhxDQIgASAAENUIDAILIANB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IAUoAggoAghB4IYKRwRAIAQgATYCGCAGIQMLIAFBACAEQegAaiACIAQtAGcgAxCWBEUNASABIAIQ3wkMAQsgASAGIARB6ABqIANB6cUBIAMbIgMgBC0AZ0EAEJYERQ0AIAEQISEBIAQgAzYCCCAEIAI2AgQgBCABNgIAQd+9BCAEECoLIARBADYCjAEgACAEQegAakEoEB8aCyAEQZABaiQACxoAIAAoAhAoAgwiAARAIAAoAiwQGCAAEBgLC6kFAgR8CH9BMBBSIQYgACgCECgCCCgCCCgCBCEKAnwgAEHU2wooAgBE////////739EexSuR+F6hD8QTCAAQdDbCigCAET////////vf0R7FK5H4XqUPxBMIgEQKSICvUL/////////9/8AUiABvUL/////////9/8AUnJFBEAgACgCECIFQpqz5syZs+bUPzcDICAFQpqz5syZs+bUPzcDKETNzMzMzMwMQAwBCyACRGEyVTAqqTM/ECMhASAAKAIQIgUgASACIAJEAAAAAAAAAABkGyIBOQMgIAUgATkDKCABRAAAAAAAAFJAogshA0EBIQtBASAAQYjcCigCACAKQQAQYiIHIAdBAU0bIAdBAEcgAEG83AooAgBEAAAAAAAA8D9EAAAAAAAAAAAQTCIERAAAAAAAAAAAZHEiCmoiBUEBdEEQEBoiCCADRAAAAAAAAOA/oiICOQMYIAggAjkDECAIIAKaIgE5AwggCCABOQMAQQIhCQJAIAdBAkkEQCACIQEMAQsgAiEBA0AgByALRkUEQCAIIAlBBHRqIgwgAUQAAAAAAAAQQKAiAZo5AwggDCACRAAAAAAAABBAoCICmjkDACAMIAI5AxAgDCABOQMYIAtBAWohCyAJQQJqIQkMAQsLIAIgAqAhAwsgCkUgBSAHTXJFBEAgCCAJQQR0aiIFIAREAAAAAAAA4D+iIgQgAaAiATkDGCAFIAQgAqAiAjkDECAFIAGaOQMIIAUgApo5AwALIAZCADcDECAGQQI2AgggBiAHNgIEIAZBATYCACAGIAg2AiwgBkIANwMYIAZCADcDICAAKAIQIgAgAiACoEQAAAAAAABSQKMiATkDcCAAIAE5A2ggACADRAAAAAAAAFJAoyIBOQMoIAAgATkDICAAIAY2AgwLwQMCBH8CfCMAQdAAayIBJAAgABAtKAIQKAJ0IQJBoN8KIAAoAhAoAngoAgAiAzYCACAAIAJBBHFFIgRBAUECIAMQQCICIAJBAk0bQQFqQQEQGiIDEMgGIgJFBEAgASAAKAIQKAJ4KAIANgIgQYPxAyABQSBqEDdBoN8KQb3RATYCACAAIARBASADEMgGIQILIAMQGCABQUBrIAAgAhDkCSABIAAoAhAiAysDIEQAAAAAAABSQKIiBTkDQCABIAMrAyhEAAAAAAAAUkCiIgY5A0ggAEGc3AooAgBB+pMBEHoQaEUEQCABIAIrAwAgBRAjIgU5A0AgASACKwMIIAYQIyIGOQNICyAAQfjbCigCAEH6kwEQehBoIQMgASABKQNINwMYIAEgASkDQDcDECACIAFBEGogAxDjCSABIAZEAAAAAAAA4D+iOQM4IAEgASkDODcDCCABIAVEAAAAAAAA4L+iOQMwIAEgASkDMDcDACACIAFBDxDiCSAAKAIQIgAgAisDAEQAAAAAAABSQKM5AyAgAisDCCEFIAAgAjYCDCAAIAVEAAAAAAAA8D+gRAAAAAAAAFJAozkDKCABQdAAaiQAC6IeAw9/GnwDfiMAQYABayIBJABBMBBSIQggACgCECgCCCgCCCIGKwMYIRogBisDICEcIAYrAxAgBigCCCEEIAYoAgQhByAGKAIAQQBHIABBrzsQJxBociENAkAgBkGw/QlGDQAgDQRAIABB1NsKKAIARAAAAAAAAAAARHsUrkfheoQ/EEwgAEHQ2wooAgBEAAAAAAAAAABEexSuR+F6lD8QTBAjRAAAAAAAAFJAoiITIRUgE0QAAAAAAAAAAGQNASAAKAIQIgIrAyAgAisDKBApRAAAAAAAAFJAoiITIRUMAQsgACgCECICKwMoRAAAAAAAAFJAoiETIAIrAyBEAAAAAAAAUkCiIRULIABBiNwKKAIAIAdBABBiIQkgAEGQ3AooAgBEAAAAAAAAAABEAAAAAACAdsAQTCAERQRAIABBlNwKKAIARAAAAAAAAAAARAAAAAAAAFnAEEwhHCAAQYTcCigCAEEEQQAQYiEEIABBmNwKKAIARAAAAAAAAAAARAAAAAAAAFnAEEwhGgsgACgCECgCeCICKwMYIRECQCACKwMgIhZEAAAAAAAAAABkRSARRAAAAAAAAAAAZEF/c3EgBkGw/QlGcg0AIABB1+QAECciAgRAIAFCADcDeCABQgA3A3AgASABQfgAajYCQCABIAFB8ABqNgJEIAJB3IMBIAFBQGsQUSECIAEgASsDeEQAAAAAAAAAABAjIhA5A3ggASABKwNwRAAAAAAAAAAAECMiFzkDcCACQQBKBEAgEEQAAAAAAABSQKIiECAQoCIQIBGgIREgAkEBRwRAIBdEAAAAAAAAUkCiIhAgEKAgFqAhFgwDCyAQIBagIRYMAgsgFkQAAAAAAAAgQKAhFiARRAAAAAAAADBAoCERDAELIBZEAAAAAAAAIECgIRYgEUQAAAAAAAAwQKAhEQsgACgCECgCeCsDGCEUIAAQLSgCECgCCCsDACIQRAAAAAAAAAAAZAR8IBBEAAAAAAAAUkCiIhAgFiAQo5uiIRYgECARIBCjm6IFIBELIR8gASAWAn8CQCAAKAIQKAIIIgItAAxBAUYEQCACKAIAQZ3sABA+RQ0BIABByJoBECchBiABQeAAaiAAEC0gBhDMBiABKAJgIgcgASgCZCICcUF/RgRAIAEgABAhNgIkIAEgBkH/3gEgBhs2AiBBtPwEIAFBIGoQKgwCCyAAEC0oAhBBAToAciAHQQJqIQMgAkECagwCCyAAQb+eARAnIgZFDQAgBi0AAEUNACABQeAAaiAAEC0gBhDMBiABKAJgIgcgASgCZCICcUF/RgRAIAEgABAhNgI0IAEgBjYCMEHh/AQgAUEwahAqDAELIAAQLSgCEEEBOgByIAdBAmohAyACQQJqDAELQQALtyIgECM5A2ggASAfIAO3ECM5A2AgBEH4ACAavSAcvYRQIARBAktyGyEEAn8CQCAAQZmzARAnIgJFDQAgAi0AACICQfQARyACQeIAR3ENACAAKAIQIgMoAnggAjoAUCACQeMARwwBCyAAKAIQIgMoAnhB4wA6AFBBAAshCqAhIgJAAkAgBEEERw0AICIQpweZRAAAAAAAAOA/Y0UgGr1CAFJyDQBBASELIBy9UA0BCyADKAIIKAIIKAIsIgIEQCACKAIAIQIgASABKQNoNwMYIAEgASkDYDcDECABQdAAaiABQRBqIAIRBAAgASABKQNYNwNoIAEgASkDUDcDYEEAIQsMAQsCQCATIAErA2giEETNO39mnqD2P6IiF2RFIApyRQRAIAFEAAAAAAAA8D9EAAAAAAAA8D8gECAToyIXIBeioaOfIAErA2CiIhg5A2AMAQsgASAXOQNoIAEgASsDYETNO39mnqD2P6IiGDkDYCAXIRALQQAhCyAEQQNJDQAgASAQRBgtRFT7IQlAIAS4oxBKIhCjOQNoIAEgGCAQozkDYAsgASsDaCEXAkACQCAAQZzcCigCAEH6kwEQeiICLQAAQfMARw0AIAJBoZYBED5FDQAgASATOQNoIAEgFTkDYCAIIAgoAihBgBByNgIoDAELIAIQaARAAkAgFSAAKAIQKAJ4IgIrAxhjRQRAIBMgAisDIGNFDQELIAAQISECIAEgABAtECE2AgQgASACNgIAQZmRBCABECoLIAEgEzkDaCABIBU5A2AMAQsgASAVIAErA2AQIyIVOQNgIAEgEyABKwNoECMiEzkDaAsgDQRAIAEgFSATECMiEzkDYCABIBM5A2ggEyEVCyARIBShIRACfCAfIhEgAEH42wooAgBB+pMBEHoQaA0AGiALBEAgESABKwNgECMMAQsgHyAWIAErA2giFGNFDQAaIBFEAAAAAAAA8D8gFiAWoiAUIBSio6GfIAErA2CiECMLIREgACgCECgCeCICIBEgEKE5AyggCCgCKEGAEHEiD0UEQCACIBYgICAWoSABKwNoIBehIhGgIBEgFiAgYxugOQMwC0EBIQpBASAJIAlBAU0bIgYgCUEARyAAQbzcCigCAEQAAAAAAADwP0QAAAAAAAAAABBMIiNEAAAAAAAAAABkcWohDEECIQcCQAJAAkAgBEECTQRAIAxBAXRBEBAaIQUgASsDYCEUIAUgASsDaCITRAAAAAAAAOA/oiIROQMYIAUgFEQAAAAAAADgP6IiEDkDECAFIBGaOQMIIAUgEJo5AwAgCUECSQ0BA0AgCSAKRgRAIBEgEaAhEyAQIBCgIRQMAwUgBSAHQQR0aiICIBFEAAAAAAAAEECgIhGaOQMIIAIgEEQAAAAAAAAQQKAiEJo5AwAgAiAQOQMQIAIgETkDGCAKQQFqIQogB0ECaiEHDAELAAsACyAEIAxsQRAQGiEFAkAgACgCECgCCCgCCCgCLCICBEAgBSABQeAAaiACKAIEEQQAIAErA2hEAAAAAAAA4D+iIRkgASsDYEQAAAAAAADgP6IhGAwBC0QYLURU+yEZQCAEuKMiJEQYLURU+yEJwKBEAAAAAAAA4D+iIhREGC1EVPshCUAgJKFEAAAAAAAA4D+ioCEQIBpEzTt/Zp6g9j+iICREAAAAAAAA4D+iIhcQSqMhKCAcRAAAAAAAAOA/oiEpIBQQVyIdRAAAAAAAAOA/oiERIBQQSiIeRAAAAAAAAOA/oiEmQQAhA0QAAAAAAAAAACEYIByZIBqZoEQAAAAAAADwPxBHISAgASsDaCEhIAErA2AhGyAXEFchJyAiRAAAAAAAgGZAo0QYLURU+yEJQKIhFANAIAMgBEYNASAkIBCgIhAQSiESIAUgA0EEdGoiAiAUICcgEBBXoiARoCIRICcgEqIgJqAiJiARICiiICCgoiApIBGioCISEKgBoCIXEFciHSASIBEQRyISoiAhoiIlOQMIIAIgGyASIBcQSiIeoqIiEjkDACADQQFqIQMgJZkgGRAjIRkgEpkgGBAjIRggC0UNAAsgBSASOQMwIAUgJTkDGCAFICWaIhE5AzggBSAROQMoIAUgEpoiETkDICAFIBE5AxALIAEgEyAZIBmgIhEQIyITOQNoIAEgFSAYIBigIhAQIyIUOQNgIBMgEaMhESAUIBCjIRBBACEDA0AgAyAERkUEQCAFIANBBHRqIgIgESACKwMIojkDCCACIBAgAisDAKI5AwAgA0EBaiEDDAELCyAMQQJJDQFBASAEIARBAU0bIQogBSsDCCIZvSEqIAUrAwAiGL0hK0EBIQMDQAJAIAMgCkYEQCASvSEsDAELIAUgBCADayAEcEEEdGoiAisDCCEQIAIrAwAiEr0iLCArUg0AIANBAWohAyAQvSAqUQ0BCwsgKyAsUSAqIBC9UXFFBEBBACELIBkgEKEgGCASoRCoASERIAQgCWxBBHQhBwJAA0AgBCALRgRAQQAhAyAEIAlBAWtsQQR0IQogDEEBayAEbEEEdCEGIBQhECATIREDQCADIARGDQcgBSADQQR0aiIHIApqIgIrAwAgAisDCCAGIAdqIgIrAwAgA0EBaiEDIAIrAwiZIhIgEqAgERAjIRGZIhIgEqAgEBAjIRCZIhIgEqAgExAjIROZIhIgEqAgFBAjIRQMAAsACyAFIAtBBHRqIg4rAwgiFb0hKkEBIQMCQCAOKwMAIhe9IisgEr1SICogEL1SckUEQCARIRIMAQsDQAJAIAMgCkYEQCAYvSEsDAELIAUgAyALaiAEcEEEdGoiAisDCCEZIAIrAwAiGL0iLCArUg0AIANBAWohAyAqIBm9UQ0BCwsgKyAsUSAqIBm9UXENAiARRBgtRFT7IQlAoCAZIBWhIBggF6EQqAEiEqFEAAAAAAAA4D+iIhAQVyEbIBEgEKEiEBBKRAAAAAAAABBAIBujIhGiIR4gEBBXIBGiIR0LQQEhAwJAAkAgHkQAAAAAAAAAAGIEQCAVIREgFyEQDAELIBUhESAXIRAgHUQAAAAAAAAAAGENAQsDQCADIAZGBEAgCSAMSQRAIAcgDmoiAiAjIB2iRAAAAAAAAOA/okQAAAAAAADQP6IgEaA5AwggAiAjIB6iRAAAAAAAAOA/okQAAAAAAADQP6IgEKA5AwALIAtBAWohCyASIREgFSEQIBchEgwDBSAOIAMgBGxBBHRqIgIgHSARoCIROQMIIAIgHiAQoCIQOQMAIANBAWohAwwBCwALAAsLQcCdA0HeuQFBnxJBuiAQAAALQdigA0HeuQFBkhJBuiAQAAALQdigA0HeuQFB/BFBuiAQAAALQQIhBCAJIAxPDQAgBSAJQQV0aiICICNEAAAAAAAA4D+iIhIgEKAiEDkDECACIBIgEaAiEZo5AwggAiAQmjkDACACIBE5AxggESARoCERIBAgEKAhEAwBCyAUIRAgEyERCyAIIBw5AyAgCCAiOQMQIAggBDYCCCAIIAk2AgQgCCANNgIAIAggBTYCLCAIIBo5AxgCQCAPBEAgHyAQECMhECAAKAIQIgMgEEQAAAAAAABSQKM5A2ggAyAWIBMQI0QAAAAAAABSQKM5AyggAyAfIBQQI0QAAAAAAABSQKM5AyAgFiARECMhEQwBCyAAKAIQIgMgEEQAAAAAAABSQKM5A2ggAyATRAAAAAAAAFJAozkDKCADIBREAAAAAAAAUkCjOQMgCyADIAg2AgwgAyARRAAAAAAAAFJAozkDcCABQYABaiQACzMBAX8gACgCFCIBBEAgARDqAwsCQCAAKAJERQ0AIAAoAkwiAUUNACAAIAERAQALIAAQGAsJACAAKAJEEBgLDAAgACgCECgCDBAYC7gFAgh/AnwjAEHACWsiASQAAkACQCAAQciaARAnEPsEIgUEQEGA3wooAgAiAkUEQEGA3wpB/PwJQZTuCSgCABCTASICNgIACyACIAVBgAQgAigCABEDACICRQRAIAVB4zsQnwQiBkUNAkEAIQICQAJAAkACQANAIAFBwAFqIgRBgAggBhCoBwRAIAEgAUHQAGo2AkwgASABQdQAajYCSCABIAFB2ABqNgJEIAEgAUHcAGo2AkBBASEHIARB/LEBIAFBQGsQUUEERiACciICIAEtAMABQSVHBEAgBEGKsQEQsgVBAEcgA3IhAwsgA3FBAXFFDQEMAgsLIAMhByACQQFxRQ0BC0HQABBSIgIgASgCXCIDtzkDICACIAEoAlgiBLc5AyggAiABKAJUIANrtzkDMCABKAJQIQMgAiAFNgIIIAIgAyAEa7c5AzhBiN8KQYjfCigCACIDQQFqNgIAIAIgAzYCDCAGEOoLIAFB4ABqEOgLIAIgASgCeCIEQQFqQQEQGiIDNgJEIAYQ5gMgAyAEQQEgBhC7BUEBRgRAIAMgBGpBADoAAEGA3wooAgAiAyACQQEgAygCABEDABogAiAHQQFxOgAQDAMLIAEgBTYCIEHd+wMgAUEgahAqIAMQGCACEBgMAQsgASAFNgIwQZr7AyABQTBqECoLQQAhAgsgBhDqAyACRQ0DCyACKwMwIQkgACgCECIDIAIrAzgiCkQAAAAAAABSQKM5AyggAyAJRAAAAAAAAFJAozkDIEEYEFIhAyAAKAIQIAM2AgwgAyACKAIMNgIAIAMgAisDIJogCUQAAAAAAADgP6KhOQMIIAMgAisDKJogCkQAAAAAAADgP6KhOQMQDAILIAEgABAhNgIAQYr8AyABECoMAQsgASAFNgIQQcH7AyABQRBqECoLIAFBwAlqJAALPgECfwJ/QX8gACgCACICIAEoAgAiA0kNABpBASACIANLDQAaQX8gACgCBCIAIAEoAgQiAUkNABogACABSwsLMABBGBBSIgEgACgCCDYCCCABIAAoAgw2AgwgASAAKAIQNgIQIAEgACgCFDYCFCABC2MBA38jAEEQayICJAAgAkEIaiABKAIAQQAQ0AECQCAAKAAAIAIoAgggACgABCIBIAIoAgwiAyABIANJIgQbEOoBIgANAEEBIQAgASADSw0AQX9BACAEGyEACyACQRBqJAAgAAv/BAEKfyACQeMAcQRAIAAgASACIAAoAiAoAgARAwAPCwJAAkAgAkGEBHFFBEAgACgCICgCBEEMcSIDIAJBgANxRXINAQsgACEDA0AgA0UEQEEAIQQMAwsgAyABIAIgAygCICgCABEDACIEDQIgAygCKCEDDAALAAsCQAJAAkAgAwRAIAJBmANxRQ0DIAJBkAJxQQBHIQsgAkGIAXFBAEchDCAAIQMDQCADRQ0CAkAgAyABIAIgAygCICgCABEDACIERQ0AIAQgAygCBCIHKAIAaiEGIAcoAgQiCkEASARAIAYoAgAhBgsCQCAFRQ0AIAwCfyAHKAIUIgcEQCAGIAkgBxEAAAwBCyAKQQBMBEAgBiAJEE0MAQsgBiAJIAoQzgELIgdBAEhxDQAgCyAHQQBKcUUNAQsgBCEFIAYhCSADIQgLIAMoAighAwwACwALIAJBGHFFDQICQAJAIAAoAiwiBEUNACAEKAIMIQgCfyAEKAIEKAIIIgNBAEgEQCAIKAIIDAELIAggA2sLIAFHDQAgASEDDAELIAAhBANAIARFBEAgAEEANgIsQQAPCyAEIAFBBCAEKAIgKAIAEQMAIgNFBEAgBCgCKCEEDAELCyAAIAQ2AiwLQYABQYACIAJBCHEbIQEgBCADIAIgBCgCICgCABEDACEFA0AgACEDIAUEQANAIAMgBEYNBCADIAVBBCADKAIgKAIAEQMARQRAIAMoAighAwwBCwsgBCAFIAIgBCgCICgCABEDACEFDAELIAAgBCgCKCIENgIsIARFDQMgBEEAIAEgBCgCICgCABEDACEFDAALAAsgACAINgIsCyAFDwtBAA8LIAAgAzYCLCAECxEAIAAgAaJEAAAAAAAAJECiC2IAIwBBIGsiBiQAIAAgAisDACADKwMAoDkDACAAIAIrAwggAysDCKA5AwggBiACKQMINwMIIAYgAikDADcDACAGIAApAwg3AxggBiAAKQMANwMQIAEgBkECED0gBkEgaiQAC9IEAgJ/BXwjAEHwAGsiByQAIAcgAikDCDcDGCAHIAIpAwA3AxAgBUQAAAAAAADgP6IiCkQAAAAAAADQP6JEAAAAAAAA4D8gBUQAAAAAAAAQQGQbIQsgAysDCCEJIAACfCAGQSBxIggEQCADKwMAIQUgAisDAAwBCyACKwMAIgQgAysDACIFRAAAAAAAAAAAYSAJRAAAAAAAAAAAYXENABogAiACKwMIIAogCSAFmiAJmhBHIgyjoqA5AwggBCAKIAUgDKOioAsiBCAFoDkDACAAIAIrAwgiCiAJoDkDCCAHIAApAwg3AyggByAAKQMANwMgIAcgCiALIAWiIgWhIAsgCZqiIgmhIgs5A2ggByAFIAQgCaGgOQNgIAcgBSAKoCAJoSIKOQM4IAcgBSAEIAmgoDkDMCAFIAlEZmZmZmZm7r+iIASgoCEMIAUgCURmZmZmZmbuP6IgBKCgIQ0gBUQAAAAAAAAQQKJEAAAAAAAACECjIQQgCUQAAAAAAAAQwKJEAAAAAAAACECjIQUCfCAIBEAgCyAFoCEJIAQgDKAhCyAKIAWgIQogBCANoAwBCyALIAWhIQkgDCAEoSELIAogBaEhCiANIAShCyEFIAcgCTkDWCAHIAs5A1AgByAKOQNIIAcgBTkDQCABIAdBEGpBAhA9AkAgBkHAAHEEQCAHIAdBMGoiAEQAAAAAAADgP0EAIAAQoQEMAQsgBkGAAXFFDQAgByAHQTBqIgBEAAAAAAAA4D8gAEEAEKEBCyABIAdBMGpBBEEAEPABIAdB8ABqJAALFAAgACABokQAAAAAAAAkQKIgAqALiwICAX8HfCMAQSBrIgckACACKwMAIQQCQCADKwMAIglEAAAAAAAAAABiIAMrAwgiCkQAAAAAAAAAAGJyRQRAIAIrAwghBQwBCyACKwMIIAVEAAAAAAAA4D+iIgggCpoiBSAJmiILIAUQRyIMo6IiDaEhBSAEIAggCyAMo6IiC6EhBAsgByAJIAoQR0QAAAAAAADgP6IiCCAKRAAAAAAAAOA/oiAFoCIMoDkDGCAHIAggCUQAAAAAAADgP6IgBKAiDqA5AxAgByAMIAihOQMIIAcgDiAIoTkDACABIAcgBkF/c0EEdkEBcRCGBCAAIAogBaAgDaE5AwggACAJIASgIAuhOQMAIAdBIGokAAudAgEBfyMAQaABayIEJAAgBEIANwNIIARCADcDQCAEQgA3AzggBEIANwMYIARCADcDCCAEIAAgAaJEAAAAAAAAJECiOQMwIARCADcDECAEIAQpAzA3AwAgBEEgaiAEQRBqIAQgAiADIARB0ABqEIIKAkACQCAEKwMgRAAAAAAAAOA/oiIARAAAAAAAAAAAZARAIAQrA2ggBCsDiAGhIgFEAAAAAAAAAABkRQ0BIAAgAaIgBCsDgAEgBCsDcKGZoyIBRAAAAAAAAAAAZEUNAiAEQaABaiQAIAAgAKAgACACoiABo6EPC0GDuANBkrkBQYQKQcakARAAAAtB57gDQZK5AUGHCkHGpAEQAAALQbG4A0GSuQFBiwpBxqQBEAAAC6kBAQF/IwBB8ABrIgckACAHIAIpAwg3AxggByACKQMANwMQIAcgAykDCDcDCCAHIAMpAwA3AwAgACAHQRBqIAcgBSAGIAdBIGoQggoCQCAGQcAAcQRAIAEgB0FAa0EDIAZBf3NBBHZBAXEQSAwBCyAGQX9zQQR2QQFxIQAgBkGAAXEEQCABIAdBIGpBAyAAEEgMAQsgASAHQSBqQQQgABBICyAHQfAAaiQAC/EDAgF/CnwjAEFAaiIHJAAgAysDCCIEIAIrAwgiCaAhDiADKwMAIgggAisDACINoCEPIAhEmpmZmZmZ2T+iIQogBESamZmZmZnZv6IhCyAERJqZmZmZmek/oiAJoCEQIAhEmpmZmZmZ6T+iIA2gIRECfCAIRAAAAAAAAAAAYQRARAAAAAAAAAAAIAREAAAAAAAAAABhDQEaCyAFRAAAAAAAAOA/oiIFIASaIgQgCJoiCCAEEEciBKOiIQwgBSAIIASjogshBSACIAkgDKEiCDkDCCACIA0gBaEiCTkDACAAIA4gDKE5AwggACAPIAWhOQMAIAcgCiAQIAyhIgSgOQM4IAcgCyARIAWhIgWgOQMwIAcgBCAKoTkDKCAHIAUgC6E5AyAgByAIIAqhOQMYIAcgCSALoTkDECAHIAogCKA5AwggByALIAmgOQMAIAdBEGohAwJAIAZBwABxBEAgByACKQMANwMAIAcgAikDCDcDCCAHIAQ5AzggByAFOQMwDAELIAZBgAFxRQ0AIAMgAikDADcDACADIAIpAwg3AwggByAEOQMoIAcgBTkDIAsgASAHQQQgBkF/c0EEdkEBcRBIIAcgBDkDCCAHIAU5AwAgAyAAKQMINwMIIAMgACkDADcDACABIAdBAhA9IAdBQGskAAtQACAAIAGiRAAAAAAAACRAoiIARJqZmZmZmcm/oiACRAAAAAAAAOA/oiIBoCAAIABEmpmZmZmZ2b+iIAGgIgGgoCAAIAFEAAAAAAAAAABkGwuIBAIBfwt8IwBBQGoiByQAIAMrAwghBCAAIAMrAwAiCCACKwMAIgmgIhA5AwAgACAEIAIrAwgiDqAiETkDCCAJIAhEMzMzMzMz4z+ioCEKIAkgCESamZmZmZnJP6KgIQsgDiAERDMzMzMzM+M/oqAhDCAOIAREmpmZmZmZyT+ioCENAkAgCCAEEEciD0QAAAAAAAAAAGRFDQAgD0SamZmZmZnJv6IgBUQAAAAAAADgP6KgIg9EAAAAAAAAAABkRQ0AIAIgDiAPIASaIgUgCJoiDiAFEEciEqOiIgWhOQMIIAIgCSAPIA4gEqOiIgmhOQMAIAAgESAFoTkDCCAAIBAgCaE5AwAgDCAFoSEMIAogCaEhCiANIAWhIQ0gCyAJoSELCyAHIAggDKA5AzggByAKIAShOQMwIAcgDCAIoTkDKCAHIAQgCqA5AyAgByANIAihOQMYIAcgBCALoDkDECAHIAggDaA5AwggByALIAShOQMAIAdBEGohAwJAIAZBwABxBEAgByAMOQM4IAcgCjkDMCAHIA05AwggByALOQMADAELIAZBgAFxRQ0AIAcgDDkDKCAHIAo5AyAgByANOQMYIAcgCzkDEAsgASAHQQRBARBIIAcgAikDCDcDCCAHIAIpAwA3AwAgAyAAKQMINwMIIAMgACkDADcDACABIAdBAhA9IAdBQGskAAvTAgIBfwJ8IwBB4AFrIgQkACAEQgA3A0ggBEIANwNAIARCADcDOCAEQgA3AxggBEIANwMIIAQgACABokQAAAAAAAAkQKI5AzAgBEIANwMQIAQgBCkDMDcDACAEQSBqIARBEGogBCABIAIgAyAEQdAAahCECgJAAkACQCAEKwMgIgBEAAAAAAAAAABkBEAgACAEKwOAASAEKwNgIgWhoCIBRAAAAAAAAAAAZEUNASAEKwPIASAEKwNooSIGRAAAAAAAAAAAZEUNAiAGIAGiIAUgBCsDUKGZoyIFRAAAAAAAAAAAZEUNAyAEQeABaiQAIAAgAkQAAAAAAADgP6IgAiABoiAFoyADQSBxG6EPC0GDuANBkrkBQboKQYAUEAAAC0H+sANBkrkBQbwKQYAUEAAAC0HnuANBkrkBQb8KQYAUEAAAC0GxuANBkrkBQcMKQYAUEAAAC5UBAQF/IwBBsAFrIgckACAHIAIpAwg3AxggByACKQMANwMQIAcgAykDCDcDCCAHIAMpAwA3AwAgACAHQRBqIAcgBCAFIAYgB0EgaiIAEIQKAkAgBkHAAHEEQCABIABBBUEBEEgMAQsgBkGAAXEEQCABIAdB4ABqQQVBARBIDAELIAEgB0EgakEIQQEQSAsgB0GwAWokAAuhAgEBfyMAQaABayIEJAAgBEIANwNIIARCADcDQCAEQgA3AzggBEIANwMYIARCADcDCCAEIAAgAaJEAAAAAAAAJECiOQMwIARCADcDECAEIAQpAzA3AwAgBEEgaiAEQRBqIAQgAiADIARB0ABqEIUKAkACQCAEKwMgIgBEAAAAAAAAAABkBEAgBCsDiAEgBCsDaKEiAUQAAAAAAAAAAGRFDQEgACABoiAEKwNgIAQrA3ChmaMiAUQAAAAAAAAAAGRFDQIgBEGgAWokACAAIAIgAKIgAaMgAkQAAAAAAADgP6IgA0EgcRuhDwtBg7gDQZK5AUG1CUHk8QAQAAALQee4A0GSuQFBuAlB5PEAEAAAC0GxuANBkrkBQbwJQeTxABAAAAuoAQEBfyMAQfAAayIHJAAgByACKQMINwMYIAcgAikDADcDECAHIAMpAwg3AwggByADKQMANwMAIAAgB0EQaiAHIAUgBiAHQSBqIgAQhQoCQCAGQcAAcQRAIAEgAEEDIAZBf3NBBHZBAXEQSAwBCyAGQX9zQQR2QQFxIQAgBkGAAXEEQCABIAdBQGtBAyAAEEgMAQsgASAHQTBqQQMgABBICyAHQfAAaiQACzQBAXwgACgCBCsDACABKwMAIAAoAgAiACsDAKEiAiACoiABKwMIIAArAwihIgIgAqKgn2YL9BIBEX8jAEEQayIHJAAgAC0ACUEQcQRAIABBABDnAQsgACgCDCEDIAAoAgQiDCgCCCEJAn8CQAJAIAFFBEBBACACQcADcUUgA0VyDQMaIAJBwABxBEAgDCgCEEUgCUEATnFFBEBBACAJayEEA0AgAygCBCIBBEAgAyABKAIANgIEIAEgAzYCACABIQMMAQsgAygCACAMKAIQIgYEQAJ/IAlBAEgEQCADKAIIDAELIAMgBGoLIAYRAQALIAwoAghBAEgEQCADEBgLIgMNAAsLIABBADYCDCAAQQA2AhhBAAwECwJAIAJBgAJxBEADQCADKAIAIgFFDQIgAyABKAIENgIAIAEgAzYCBCABIQMMAAsACwNAIAMoAgQiAUUNASADIAEoAgA2AgQgASADNgIAIAEhAwwACwALIAAgAzYCDCAJQQBODQEMAgsgDCgCFCEOIAwoAgQhCiAMKAIAIQ8CQAJAAkACQAJAAkAgAkGCIHEiE0UNACAAKAIgKAIEQQhHDQAgASAPaiEIIApBAE4iBkUEQCAIKAIAIQgLIAAgAUEEIAAoAgARAwAhBCAKQQBKIQsDQCAERQ0BIAQgD2ohBSAGRQRAIAUoAgAhBQsCfyAOBEAgCCAFIA4RAAAMAQsgC0UEQCAIIAUQTQwBCyAIIAUgChDOAQsNASABIARGBEAgByAAKAIMIgMoAgQ2AgggByADKAIANgIMIAdBCGohBAwDBSAAIARBCCAAKAIAEQMAIQQMAQsACwALAkACQAJAAkACQAJAAkACQCACQYUEcQRAAn8gASACQYAEcQ0AGiABIA9qIgggCkEATg0AGiAIKAIACyEIIAMNASAHQQhqIgYhBAwDCyACQSBxBEAgDwJ/IAlBAEgEQCABKAIIDAELIAEgCWsLIgVqIQggCkEASARAIAgoAgAhCAsgA0UNAiABIQ0gBSEBDAELIANFBEAgB0EIaiIGIQQMAwsCfyAJQQBIBEAgAygCCAwBCyADIAlrCyABRgRAIAdBCGoiBiEEDAQLIAEgD2ohCCAKQQBODQAgCCgCACEIC0EAIAlrIRAgCUEATiERIAdBCGoiBiELAkADQCADIQQCQAJ/AkACQAJAA0ACfyARRQRAIAQoAggMAQsgBCAQagsgD2ohBSAKQQBOIhJFBEAgBSgCACEFCyAEAn8gDgRAIAggBSAOEQAADAELIApBAEwEQCAIIAUQTQwBCyAIIAUgChDOAQsiBUUNBBogBUEATg0DIAQoAgQiBUUNAgJ/IBFFBEAgBSgCCAwBCyAFIBBqCyAPaiEDIBJFBEAgAygCACEDCwJ/IA4EQCAIIAMgDhEAAAwBCyAKQQBMBEAgCCADEE0MAQsgCCADIAoQzgELIgNBAE4NASAEIAUoAgA2AgQgBSAENgIAIAsgBTYCBCAFIgsoAgQiBA0ACyAFIQQMCAsgA0UEQCALIAQ2AgQgBSEDDAkLIAYgBTYCACALIAQ2AgQgBCELIAUiBigCACIDDQQMBwsgCyAENgIEDAYLIAQoAgAiBUUNAwJ/IBFFBEAgBSgCCAwBCyAFIBBqCyAPaiEDIBJFBEAgAygCACEDCwJ/IA4EQCAIIAMgDhEAAAwBCyAKQQBMBEAgCCADEE0MAQsgCCADIAoQzgELIgNBAEoEQCAEIAUoAgQ2AgAgBSAENgIEIAYgBTYCACAFIgYoAgAiAw0DIAshBAwGCyADDQEgBiAENgIAIAQhBiAFCyEDIAshBAwFCyALIAU2AgQgBiAENgIAIAQhBiAFIgsoAgQiAw0ACyAFIQQMAgsgBiAENgIAIAQhBiALIQQMAQsgB0EIaiIGIQQgASENIAUhAQsgBEEANgIEIAZBADYCACACQQhxDQEgAkEQcQ0DIAJBhARxDQhBACEDIAJBAXENB0EAIQEgAkEgcUUNCCAAIAAoAhhBAWo2AhggDSEDDAkLIAYgAygCBDYCACAEIAMoAgA2AgQgAkGEBHENCCACQQhxRQ0BIAcoAgghBiADQQA2AgAgAyAGNgIEIAcgAzYCCAsgBygCDCIDRQ0GA0AgAygCBCIBBEAgAyABKAIANgIEIAEgAzYCACABIQMMAQsLIAcgAygCADYCDAwHCyACQRBxRQ0BIAcoAgwhBiADQQA2AgQgAyAGNgIAIAcgAzYCDAsgBygCCCIDRQ0EA0AgAygCACIBBEAgAyABKAIENgIAIAEgAzYCBCABIQMMAQsLIAcgAygCBDYCCAwFCyATRQ0BCwJ/IAlBAEgEQCADKAIIDAELIAMgCWsLIQECQCACQQJxRQ0AIAwoAhAiBkUNACABIAYRAQALIAwoAghBAEgEQCADEBgLIAAgACgCGCIDQQFrNgIYIANBAEoNAiAAIANBAms2AhgMAgsgAkEBcQRAIAAoAiAtAARBBHENAyADQQA2AgQgAyAHKAIMNgIAIAcgAzYCDAwBC0EAIAJBIHFFDQUaIAAoAiAtAARBBHEEQCAMKAIQIgQEQCABIAQRAQALIAwoAghBAE4NAyANEBgMAwsgDUEANgIEIA0gBygCDDYCACAHIA02AgwgACAAKAIYQQFqNgIYDAILIAwoAgwiBgRAIAEgDCAGEQAAIQELAkACQAJAIAEEQCAJQQBIDQEgASAJaiEDCyADRQ0DDAELQQwQTyIDRQ0BIAMgATYCCAsgACgCGCIBQQBIDQIgACABQQFqNgIYDAILIAwoAgxFDQAgDCgCECIDRQ0AIAEgAxEBAAsDQCAEIgMoAgQiBA0ACyADIAcoAgg2AgQgACAHKAIMNgIMIAJBHnRBH3UgAXEMAwsgAyAHKAIIIgU2AgQgAyAHKAIMNgIAAkAgAkGEBHFFDQAgACgCICgCBEEIcUUNAAJ/IAlBAEgEQCADKAIIDAELIAMgCWsLIA9qIQEgCkEATiIGRQRAIAEoAgAhAQtBACAJayELIAlBAE4hDQNAIAUiBEUNAQNAIAQoAgAiAgRAIAQgAigCBDYCACACIAQ2AgQgAiEEDAELCyADIAQ2AgQCfyANRQRAIAQoAggMAQsgBCALagsgD2ohBSAGRQRAIAUoAgAhBQsCfyAOBEAgASAFIA4RAAAMAQsgCkEATARAIAEgBRBNDAELIAEgBSAKEM4BCw0BIAMgBCgCADYCBCAEIAM2AgAgBCgCBCEFIAQhAwwACwALIAAgAzYCDCAJQQBIDQELIAMgCWsMAQsgAygCCAsgB0EQaiQAC4QBAQJ/IwBBEGsiAiQAQQFBIBBOIgEEQCAAKAIAIgMEQCABIAMQZDYCAAsgACgCBCIDBEAgASADEGQ2AgQLIAEgACgCGEH/AHE2AhggASAAKwMQOQMQIAEgACgCCDYCCCACQRBqJAAgAQ8LIAJBIDYCAEGI9ggoAgBB9ekDIAIQIBoQLwALFAAgACgCABAYIAAoAgQQGCAAEBgLqAECA38CfCABKAIAIQICQAJAAkACQCAAKAIAIgNFBEAgAkUNAQwECyACRQ0CIAMgAhBNIgINAQsgASgCBCECAkAgACgCBCIDRQRAIAINBAwBCyACRQ0CIAMgAhBNIgINAQtBfyECIAAoAhhB/wBxIgMgASgCGEH/AHEiBEkNACADIARLDQEgACsDECIFIAErAxAiBmMNACAFIAZkIQILIAIPC0EBDwtBfwsEACMACxAAIwAgAGtBcHEiACQAIAALBgAgACQACwwAIAAQrQoaIAAQGAsGAEG09wALBgBBybMBCwYAQZjiAAscACAAIAEoAgggBRDbAQRAIAEgAiADIAQQ7QYLCzkAIAAgASgCCCAFENsBBEAgASACIAMgBBDtBg8LIAAoAggiACABIAIgAyAEIAUgACgCACgCFBELAAuTAgEGfyAAIAEoAgggBRDbAQRAIAEgAiADIAQQ7QYPCyABLQA1IAAoAgwhBiABQQA6ADUgAS0ANCABQQA6ADQgAEEQaiIJIAEgAiADIAQgBRDqBiABLQA0IgpyIQggAS0ANSILciEHAkAgBkECSQ0AIAkgBkEDdGohCSAAQRhqIQYDQCABLQA2DQECQCAKQQFxBEAgASgCGEEBRg0DIAAtAAhBAnENAQwDCyALQQFxRQ0AIAAtAAhBAXFFDQILIAFBADsBNCAGIAEgAiADIAQgBRDqBiABLQA1IgsgB3JBAXEhByABLQA0IgogCHJBAXEhCCAGQQhqIgYgCUkNAAsLIAEgB0EBcToANSABIAhBAXE6ADQLlAEAIAAgASgCCCAEENsBBEAgASACIAMQ7AYPCwJAIAAgASgCACAEENsBRQ0AAkAgASgCECACRwRAIAIgASgCFEcNAQsgA0EBRw0BIAFBATYCIA8LIAEgAjYCFCABIAM2AiAgASABKAIoQQFqNgIoAkAgASgCJEEBRw0AIAEoAhhBAkcNACABQQE6ADYLIAFBBDYCLAsL+AEAIAAgASgCCCAEENsBBEAgASACIAMQ7AYPCwJAIAAgASgCACAEENsBBEACQCABKAIQIAJHBEAgAiABKAIURw0BCyADQQFHDQIgAUEBNgIgDwsgASADNgIgAkAgASgCLEEERg0AIAFBADsBNCAAKAIIIgAgASACIAJBASAEIAAoAgAoAhQRCwAgAS0ANUEBRgRAIAFBAzYCLCABLQA0RQ0BDAMLIAFBBDYCLAsgASACNgIUIAEgASgCKEEBajYCKCABKAIkQQFHDQEgASgCGEECRw0BIAFBAToANg8LIAAoAggiACABIAIgAyAEIAAoAgAoAhgRCgALC7EEAQN/IAAgASgCCCAEENsBBEAgASACIAMQ7AYPCwJAAkAgACABKAIAIAQQ2wEEQAJAIAEoAhAgAkcEQCACIAEoAhRHDQELIANBAUcNAyABQQE2AiAPCyABIAM2AiAgASgCLEEERg0BIABBEGoiBSAAKAIMQQN0aiEHQQAhAwNAAkACQCABAn8CQCAFIAdPDQAgAUEAOwE0IAUgASACIAJBASAEEOoGIAEtADYNACABLQA1QQFHDQMgAS0ANEEBRgRAIAEoAhhBAUYNA0EBIQNBASEGIAAtAAhBAnFFDQMMBAtBASEDIAAtAAhBAXENA0EDDAELQQNBBCADGws2AiwgBg0FDAQLIAFBAzYCLAwECyAFQQhqIQUMAAsACyAAKAIMIQUgAEEQaiIGIAEgAiADIAQQiAUgBUECSQ0BIAYgBUEDdGohBiAAQRhqIQUCQCAAKAIIIgBBAnFFBEAgASgCJEEBRw0BCwNAIAEtADYNAyAFIAEgAiADIAQQiAUgBUEIaiIFIAZJDQALDAILIABBAXFFBEADQCABLQA2DQMgASgCJEEBRg0DIAUgASACIAMgBBCIBSAFQQhqIgUgBkkNAAwDCwALA0AgAS0ANg0CIAEoAiRBAUYEQCABKAIYQQFGDQMLIAUgASACIAMgBBCIBSAFQQhqIgUgBkkNAAsMAQsgASACNgIUIAEgASgCKEEBajYCKCABKAIkQQFHDQAgASgCGEECRw0AIAFBAToANgsLcAECfyAAIAEoAghBABDbAQRAIAEgAiADEO8GDwsgACgCDCEEIABBEGoiBSABIAIgAxCyCgJAIARBAkkNACAFIARBA3RqIQQgAEEYaiEAA0AgACABIAIgAxCyCiABLQA2DQEgAEEIaiIAIARJDQALCwszACAAIAEoAghBABDbAQRAIAEgAiADEO8GDwsgACgCCCIAIAEgAiADIAAoAgAoAhwRBwALGgAgACABKAIIQQAQ2wEEQCABIAIgAxDvBgsLgwUBBn8jAEFAaiIEJAACf0EBIAAgAUEAENsBDQAaQQAgAUUNABojAEEQayIGJAAgBiABKAIAIgNBCGsoAgAiBTYCDCAGIAEgBWo2AgQgBiADQQRrKAIANgIIIAYoAggiA0Ho6AlBABDbASEFIAYoAgQhBwJAIAUEQCAGKAIMIQEjAEFAaiIDJAAgA0FAayQAQQAgByABGyEDDAELIAMhBSMAQUBqIgMkACABIAdOBEAgA0IANwIcIANCADcCJCADQgA3AiwgA0IANwIUIANBADYCECADQejoCTYCDCADIAU2AgQgA0EANgI8IANCgYCAgICAgIABNwI0IAMgATYCCCAFIANBBGogByAHQQFBACAFKAIAKAIUEQsAIAFBACADKAIcGyEICyADQUBrJAAgCCIDDQAjAEFAaiIDJAAgA0EANgIQIANBuOgJNgIMIAMgATYCCCADQejoCTYCBEEAIQEgA0EUakEAQScQOBogA0EANgI8IANBAToAOyAFIANBBGogB0EBQQAgBSgCACgCGBEKAAJAAkACQCADKAIoDgIAAQILIAMoAhhBACADKAIkQQFGG0EAIAMoAiBBAUYbQQAgAygCLEEBRhshAQwBCyADKAIcQQFHBEAgAygCLA0BIAMoAiBBAUcNASADKAIkQQFHDQELIAMoAhQhAQsgA0FAayQAIAEhAwsgBkEQaiQAQQAgA0UNABogBEEIakEAQTgQOBogBEEBOgA7IARBfzYCECAEIAA2AgwgBCADNgIE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KAIIEPgGIghBf0YNBCAGIAcoAgBrIAhJDQYDQCAIBEAgAi0AACEFIAcgBygCACIJQQFqNgIAIAkgBToAACAIQQFrIQggAkEBaiECDAELCyAEIAQoAgBBBGoiAjYCACACIQgDQCADIAhGBEAgAyEIDAULIAgoAgBFDQQgCEEEaiEIDAALAAsgBCACNgIADAMLIAQoAgALIANHIRAMAwsgBygCACEFDAELC0ECIRALIA9BEGokACAQCwkAIAAQ4QoQGAszACMAQRBrIgAkACAAIAQ2AgwgACADIAJrNgIIIABBDGogAEEIahCvCygCACAAQRBqJAALNAADQCABIAJGRQRAIAQgAyABLAAAIgAgAEEASBs6AAAgBEEBaiEEIAFBAWohAQwBCwsgAQsMACACIAEgAUEASBsLKgADQCABIAJGRQRAIAMgAS0AADoAACADQQFqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQbClCRCgCgseACABQQBOBH9BsKUJKAIAIAFBAnRqKAIABSABC8ALDwAgACABIAJBpJkJEKAKCx4AIAFBAE4Ef0GkmQkoAgAgAUECdGooAgAFIAELwAsJACAAENcKEBgLNQADQCABIAJGRQRAIAQgASgCACIAIAMgAEGAAUkbOgAAIARBAWohBCABQQRqIQEMAQsLIAELDgAgASACIAFBgAFJG8ALKgADQCABIAJGRQRAIAMgASwAADYCACADQQRqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQbClCRCfCgseACABQf8ATQR/QbClCSgCACABQQJ0aigCAAUgAQsLDwAgACABIAJBpJkJEJ8KCx4AIAFB/wBNBH9BpJkJKAIAIAFBAnRqKAIABSABCws6AANAAkAgAiADRg0AIAIoAgAiAEH/AEsNACAAQQJ0QYC0CWooAgAgAXFFDQAgAkEEaiECDAELCyACCzoAA0ACQCACIANGDQAgAigCACIAQf8ATQRAIABBAnRBgLQJaigCACABcQ0BCyACQQRqIQIMAQsLIAILSQEBfwNAIAEgAkZFBEBBACEAIAMgASgCACIEQf8ATQR/IARBAnRBgLQJaigCAAVBAAs2AgAgA0EEaiEDIAFBBGohAQwBCwsgAQslAEEAIQAgAkH/AE0EfyACQQJ0QYC0CWooAgAgAXFBAEcFQQALCwkAIAAQ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AkAgAEH8AWogAEH4AWoQWw0AIAAoArABIAEQJSACakYEQCABECUhAyABIAEQJUEBdBBBIAEgARBVEEEgACADIAFBABBDIgJqNgKwAQsgAEH8AWoiAxCDASAAQQdqIABBBmogAiAAQbABaiAALADPASAALADOASAAQcABaiAAQRBqIABBDGogAEEIaiAAQdABahCIBw0AIAMQlgEaDAELCwJAIABBwAFqECVFDQAgAC0AB0EBRw0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCsAEgBBCPCzgCACAAQcABaiAAQRBqIAAoAgwgBBCvASAAQfwBaiAAQfgBahBbBEAgBCAEKAIAQQJyNgIACyAAKAL8ASABEDUaIABBwAFqEDUaIABBgAJqJAALjwMBAX8jAEGAAmsiACQAIAAgAjYC+AEgACABNgL8ASADEKgCIQYgAEHEAWogAyAAQfcBahClBCAAQbgBahBUIgEgARBVEEEgACABQQAQQyICNgK0ASAAIABBEGo2AgwgAEEANgIIA0ACQCAAQfwBaiAAQfgBahBbDQAgACgCtAEgARAlIAJqRgRAIAEQJSEDIAEgARAlQQF0EEEgASABEFUQQSAAIAMgAUEAEEMiAmo2ArQBCyAAQfwBaiIDEIMBIAYgAiAAQbQBaiAAQQhqIAAsAPcBIABBxAFqIABBEGogAEEMakHAsQkQ2QMNACADEJYBGgwBCwsCQCAAQcQBahAlRQ0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCtAEgBCAGEJALNwMAIABBxAFqIABBEGogACgCDCAEEK8BIABB/AFqIABB+AFqEFsEQCAEIAQoAgBBAnI2AgALIAAoAvwBIAEQNRogAEHEAWoQNRogAEGAAmokAAuPAwEBfyMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIAMQqAIhBiAAQcQBaiADIABB9wFqEKUEIABBuAFqEFQiASABEFUQQSAAIAFBABBDIgI2ArQBIAAgAEEQajYCDCAAQQA2AggDQAJAIABB/AFqIABB+AFqEFsNACAAKAK0ASABECUgAmpGBEAgARAlIQMgASABECVBAXQQQSABIAEQVRBBIAAgAyABQQAQQyICajYC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AjgCQCABQeIlQQBBARA2BEAgASgCECgCCA0BCyACLQCbAUEEcQ0AQZqwBEEAEDdBfyEBDAELAkAgBQRAIAVBgCAQTyIGNgIAIAYNAQtBwf4AQQAQN0F/IQEMAQsgAkKAIDcCLCACIAY2AiggACABEJ8GIQEgAhCHBCABRQRAIAUgAigCKDYCACADIAIoAjA2AggLIAAQlQQLIARBEGokACADKAIMIQACQCABRQRAIAAhBwwBCyAAEBgLIANBEGokACAHCwsAEPYMELwMEJMKCzUAIAFB4iVBAEEBEDYEQCABKAIQKAKUASIABEAgASAAEQEAIAEoAhBBADYClAELIAEQ0wkLCwsAIAAgASACEJQGCwwAIAAQlwYgABCWBgsFABCVBgsHACAAELkBCwsAIAAgASACEJAHCw0AIAAgASACQQIQ4wYLDQAgACABIAJBARDjBgsNACAAIAEgAkEAEOMGCwsAIAAgAUEBEJIBCxwAIAAgACABQQEQjQEgACACQQEQjQFBAEEBEF4LCwAgACABQQEQjQELCwAgACABQQEQjAELCwAgACABQQAQjAELCQAgACABENUCCwkAIAAgARCsAQs2AQF/QQBBAUHC8ABBvdEBELUFGhD2DBC8DBCTCiAAENwNA0BBABDcDSIBBEAgARC5AQwBCwsLRwEBfyMAQRBrIgMkACADQQA7AA0gA0EAOgAPIANBAkEAIAIbIAFyOgAMIAMgAygCDDYCCCAAIANBCGpBABDjASADQRBqJAALsAMCBX8BfiMAQRBrIgMkACADQQA2AgwCfxCVBiEEIwBB4ABrIgEkACABQgA3A1ggAUIANwNQIAFCADcDSAJAAkACf0EAIABFDQAaAkADQCACQQVHBEAgACACQQJ0QbCWBWooAgAQLkUNAiACQQFqIQIMAQsLIAEgADYCAEHu+wQgARA3QQAMAQsgBCACQQJ0aigCQCECIAFCADcDQEEAIQADQCACBEAgAUE4aiACKAIEQToQ0AECQCAABEAgASABKQNANwMoIAEgASkDODcDICABQShqIAFBIGoQ+gYNAQsgASgCOCIARQ0EIAAgASgCPCIAEJACIgVFDQUgASAFNgJcIAFByABqQQQQJiEAIAEoAkggAEECdGogASgCXDYCAAsgASABKQM4IgY3A0AgBqchACACKAIAIQIMAQsLIAFB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iAFqQQAQGUECdGogAygCuAEQzgwEQCADIAMpA7gBNwOAASADIAMpA7ABNwN4IAchAiADKAKwASADQfgAakEAEBlBAnRqIAMoArgBENAMIgsNAUEAIQtBouwDQQAQKkEAIQIDQCACIAMoArgBTw0FIAMgAykDuAE3A1AgAyADKQOwATcDSCADQcgAaiACEBkhBAJAAkACQCADKALAASIFDgICAAELIAMoArABIARBAnRqKAIAEBgMAQsgAygCsAEgBEECdGooAgAgBREBAAsgAkEBaiECDAALAAsCQCAMDQAgA0GYAWogABD9AiAAQQhBCBDqBSECQcTtA0EAECogASsDACINIAK3Ig5mIA4gASsDCCIPZXIEQCADQUBrIA85AwAgAyANOQM4IAMgAjYCMEHj8AQgA0EwahCAAQwBCyADKwOYASIOIA1lIAMrA6ABIhAgD2VyRQ0AIAMgDzkDKCADIA05AyAgAyAQOQMYIAMgDjkDEEGV8QQgA0EQahCAAQtBACECA0AgAiADKAK4AU8NBCADIAMpA7gBNwMIIAMgAykDsAE3AwAgAyACEBkhBAJAAkACQCADKALAASIFDgICAAELIAMoArABIARBAnRqKAIAEBgMAQsgAygCsAEgBEECdGooAgAgBREBAAsgAkEBaiECDAALAAsDQCACRQRAQQAhAgNAIAIgAygCuAFPDQYgAyADKQO4ATcDYCADIAMpA7ABNwNYIANB2ABqIAIQGSEEAkACQAJAIAMoAsABIgUOAgIAAQsgAygCsAEgBEECdGooAgAQGAwBCyADKAKwASAEQQJ0aigCACAFEQEACyACQQFqIQIMAAsACyACKAIQIANBmAFqIAIgC0EAEMUMIAMpA5gBNwOQASADKAK4AUEATgRAIANBsAFqQQQQjAIgAyADKQO4ATcDcCADIAMpA7ABNwNoIAIgAygCsAEgA0HoAGpBABAZQQJ0aiADKAK4AUEAEMQMIAIoAhAoArABIQIMAQsLQYnNAUGDugFBggJBzDAQAAALQYnNAUGDugFB4QFBzDAQAAALIAAgChAdIQoMBQtBASEMCyADQbABaiICQQQQMSACEDQLIAAgBxAwIQcMAAsACwsgCwRAIAsQzwwLIANB0AFqJAAgDAtbAQJ/IAAQHCEBA0AgAQRAIAAgARAsIQIDQCACBEAgAhDAAiAA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AAAAUkCjoDkDMCAEIAUrAzhEAAAAAAAAUkCjIAOhOQM4CyAAIAQ2AiQgACAGKAIMIgE2AiAgBCABIAAgAEEQahDnDEEACyAGQRBqJAALEQAgACABQeD+CkHc/goQ5QYLLQECfUF/IAIgACgCAEECdGoqAgAiAyACIAEoAgBBAnRqKgIAIgReIAMgBF0bCxIAIABBNGoQ9QMgAEEoahD1AwsJACAAEJINEBgLGQECfiAAKQMIIgIgASkDCCIDViACIANUawsdACAAKAIAQQR2IgAgASgCAEEEdiIBSyAAIAFJawtEAgF/AnwgACgCBCgCBCABKAIEKAIERgRAIAAoAgBFIAEoAgBBAEdxDwsgACsDECIDIAErAxAiBGQEf0EABSADIARjCwsJACAAEKENEBgLCQAgABDsBxAYC4kIAgl/AnwjAEGgAWsiAyQAIAAQog0gA0EANgKcASAAQQRqIQcgAEEkaiEEAkACQAJAA0AgBCgCACECRP///////+9/IQogBCgCBCIFIQEDfCACIAVGBHwgCkRIr7ya8td6vmNFIAEgBUZyRQRAIAEgBCgCBEEEaygCADYCACAEIAQoAgRBBGs2AgQLIAoFIAogAigCACIGELUCIgtkBEAgAyAGNgKcASALIQogAiEBCyACQQRqIQIMAQsLREivvJry13q+YwRAIAMoApwBIgItABxBAUYNAiADIAIoAgAoAiAiATYCBCADIAIoAgQiBigCICIFNgKYASABIAVHBEAgASAFIAIQrw0MAgsgCEGRzgBODQMgAigCACEJIwBBEGsiBSQAIAEgASgCACgCAEEAEOAFIAUgASAGIAlBAEEAQQAQ8AcgBSgCCCEGIAVBEGokACABIANBBGoiBSADQZgBaiAGEO8HIAFBAToAKCADIAY2AhAgBCADQRBqIgEQwAEgAygCBCADKAKYASACEK8NIAEgByAFEPYDIAhBAWohCAwBCwsgBxDeBUEAIQEDQCABIAAoAhxPDQMgAUECdCABQQFqIQEgACgCGGooAgAiBBC1AkRIr7ya8td6vmNFDQALIANBEGoiAUHIlAk2AjggAUG0lAk2AgAgAUHUlAkoAgAiADYCACABIABBDGsoAgBqQdiUCSgCADYCACABIAEoAgBBDGsoAgBqIgJBADYCFCACIAFBBGoiADYCGCACQQA2AgwgAkKC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ACxBAXEEQCACQQFxRQ0CIAErABAiESADKwAQIhJjDQIgESASZA0BIAErABgiESADKwAYIhJjDQIgESASZCECCyACDQIgAS0AVCECIAMtAFRBAXEEQCACQQFxRQ0CIAErADgiESADKwA4IhJjDQIgESASZA0BIAErAEAiESADKwBAIhJjDQIgESASZCECCyACDQIgBygCECgCpAFBwAFxIgEgACgCECgCpAFBwAFxIgJJDQEgASACSw0AQX8hAiAHKAIAQQR2IgEgACgCAEEEdiIASQ0CIAAgAUkhAgwCC0EBIQIMAQtBfyECCyAFQbAEaiQAIAILQAICfAF/IAArAwAiAiABKwMAIgNkBEAgACsDCCABKwMIZUUPCyACIANjBH9BAEF/IAArAwggASsDCGYbBUEACwv0AgEJfyMAQRBrIgYkACAAKAIwIQEjAEEQayIDJAADQAJAQQAhByACIAEoAgBPDQADQCACQQV0IgUgASgCBGoiCEEIaiEEIAgoABAgB00EQCAEQQQQMSABKAIEIAVqQQhqEDQgAkEBaiECDAMFIAMgBCkCCDcDCCADIAQpAgA3AwAgAyAHEBkhBAJAAkACQCABKAIEIAVqIgUoAhgiCA4CAgABCyAFKAIIIARBAnRqKAIAEBgMAQsgBSgCCCAEQQJ0aigCACAIEQEACyAHQQFqIQcMAQsACwALCyABKAIEEBggARAYIANBEGokACAAQRhqIQEDQCAAKAAgIAlLBEAgBiABKQIINwMIIAYgASkCADcDACAGIAkQGSECAkACQAJAIAAoAigiAw4CAgABCyABKAIAIAJBAnRqKAIAEBgMAQsgASgCACACQQJ0aigCACADEQEACyAJQQFqIQkMAQsLIAFBBBAxIAEQNCAAEBggBkEQaiQACxsBAnxBfyAAKwMAIgIgASsDACIDZCACIANjGwsPACAAKAIQEJkBGiAAEBgLIAECfEEBQX9BACAAKwMAIgIgASsDACIDYxsgAiADZBsLWgIBfAF/QX8gACsDCCABKwMIoSICREivvJry13o+ZCACREivvJry13q+YxsiAwR/IAMFQX8gACsDACABKwMAoSICREivvJry13o+ZCACREivvJry13q+YxsLC1oCAXwBf0F/IAArAwAgASsDAKEiAkRIr7ya8td6PmQgAkRIr7ya8td6vmMbIgMEfyADBUF/IAArAwggASsDCKEiAkRIr7ya8td6PmQgAkRIr7ya8td6vmMbCwuTAQEFfyMAQRBrIgIkACAAQQRqIQEDQCADIAAoAgxPRQRAIAIgASkCCDcDCCACIAEpAgA3AwAgAiADEBkhBAJAAkACQCAAKAIUIgUOAgIAAQsgASgCACAEQQJ0aigCABAYDAELIAEoAgAgBEECdGooAgAgBREBAAsgA0EBaiEDDAELCyABQQQQMSABEDQgAkEQaiQACyUAIAAoAgAoAhAoAvgBIgAgASgCACgCECgC+AEiAUogACABSGsLEgAgAUHatgEgAigCCEEBEDYaCxIAIAFB6bYBIAIoAgRBARA2GgsSACABQcq2ASACKAIAQQEQNhoLGQBBfyAAKAIAIgAgASgCACIBSyAAIAFJGwslACAAKAIAKAIQKAL0ASIAIAEoAgAoAhAoAvQBIgFKIAAgAUhrCyUAIAEoAgAoAhAoAvQBIgEgACgCACgCECgC9AEiAEogACABSmsLIwAgACgCECgCAEEEdiIAIAEoAhAoAgBBBHYiAUsgACABSWsLlQEBBH8jAEEQayIBJAAgAARAA0AgACgACCACTQRAIABBBBAxIAAQNAUgASAAKQIINwMIIAEgACkCADcDACABIAIQGSEDAkACQAJAIAAoAhAiBA4CAgABCyAAKAIAIANBAnRqKAIAEBgMAQsgACgCACADQQJ0aigCACAEEQEACyACQQFqIQIMAQsLCyAAEBggAUEQaiQACxQAIAAoAhBBHGogAEcEQCAAEBgLC44BAgF/BHwjAEEwayIDJAAgAyABKAIIIgQ2AiQgAyAENgIgIABBivwEIANBIGoQHiACKwMAIQUgAisDECEGIAIrAwghByACKwMYIQggAyABKAIINgIQIAMgCCAHoEQAAAAAAADgP6I5AwggAyAGIAWgRAAAAAAAAOA/ojkDACAAQbH5BCADEB4gA0EwaiQACwIAC90DAgF/AnwjAEGgAWsiBCQAAkACQCAABEAgAUUNASABKAIIRQ0CIAEoAkQEQCAEIAIpAwA3A2AgBCACKQMINwNoIAQgAikDGDcDiAEgBCACKQMQNwOAASAEIAQrA2giBTkDmAEgBCAEKwNgIgY5A3AgBCAEKwOAATkDkAEgBCAEKwOIATkDeCADBEBBACECIABBpssDQQAQHgNA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AzggBEIANwMwIABBh9MEIARBMGoQHiAEQfT8CigCAEECazYCICAEQgA3AxAgBEIANwMYIABBptQEIARBEGoQHiAEIAM2AgAgAEHAzgMgBBAeIAMQGAUgASAFQQR0aiIGKwMAIQggBisDCCEJIAArA/gDIQogACsDgAQhCyAEQgA3A4ABIAQgCSALoDkDeCAEIAggCqA5A3AgAEGZ3wEgBEHwAGoQHiAFQQFqIQUMAQsLCwUgASAFQQR0aiIHKwMAIQggBysDCCEJIAArA/gDIQogACsDgAQhCyAEIAAoAhArA6ABOQPoAiAEQgA3A+ACIAQgCSALoDkD2AIgBCAIIAqgOQPQAiAAQZCmBCAEQdACahAeIAVBAWohBQwBCwsgBEGgA2okAAupBQICfwl8IwBB8AJrIgMkACAAQe2uBBAbGkH0/ApB8PwKKAIAQQZrNgIAIAArA4AEIQwgACsD+AMhDSAAKAIQIgQrA6ABIQUgACsD6AMhBiABKwMAIQcgASsDECEIIAArA/ADIQogASsDCCELIAErAxghCSADQbgCaiIBIARBEGpBKBAfGiABQwAAAAAQvAMhASADQgA3A+gCIANCgICAgICAgPg/NwOgAiADQgA3A+ACIAMgBSAGIAggB6GiIgUgCiAJIAuhoiIIoCIJo0QAAAAAAADgP6JEAAAAAAAAFECiOQOoAiADQeACaiIEQfylBCADQaACahB0IAMgCDkDkAIgAyAJRAAAAAAAANA/ojkDiAIgAyAFOQOAAiAEQavTBCADQYACahB0IAMgACgC6AKyuzkD8AEgA0IANwPoASADQoCAgICAgKCrwAA3A+ABIARBh9MEIANB4AFqEHQgA0H0/AooAgA2AtABIAMgBiAHIA2goiIGOQPAASADIAogCyAMoKIiBzkDyAEgBEGm1AQgA0HAAWoQdCADIAE2ArABIARBwM4DIANBsAFqEHQgACAEEP8FEBsaIAEQGCACBEAgA0GIAWoiASAAKAIQQThqQSgQHxogAUMAAAAAELwDIQEgA0IANwOAASADQgA3A3ggA0IANwNwIABBs90EIANB8ABqEB4gA0KAgICAgICA+D83A2AgAyAIOQNYIAMgBTkDUCAAQavTBCADQdAAahAeIANBQGsgACgC6AKyuzkDACADQgA3AzggA0IANwMwIABBh9MEIANBMGoQHiADQfT8CigCADYCICADIAY5AxAgAyAHOQMYIABBptQEIANBEGoQHiADIAE2AgAgAEHAzgMgAxAeIAEQGAsgA0HgAmoQXCADQfACaiQAC+gDAgN/BnwjAEHQAWsiAyQAIAIoAgAhBCACKAIEIgUrAxAhBiADIAUoAgA2ArABIAMgBjkDqAEgAyAENgKgASAAQY/+AyADQaABahAeQfT8CkHw/AooAgBBCWs2AgACfCABKwMAIgYgAi0AMCIEQewARg0AGiAEQfIARgRAIAYgAisDIKEMAQsgBiACKwMgRAAAAAAAAOC/oqALIQYgACsD8AMhByAAKwOABCEIIAErAwghCSAAKwPoAyEKIAArA/gDIQsgA0H4AGoiASAAKAIQQRBqQSgQHxogAUMAAAAAELwDIQEgA0IANwPIASADQgA3A8ABIAIoAgQoAgAhBCACKAIAIQUgA0IANwNwIANCgICAgICAgOg/NwNoIAMgBTYCZCADIAQ2AmAgA0HAAWoiBEGX3AMgA0HgAGoQdCADIAIoAgQrAxAgACsD6AOiOQNQIARB7KUEIANB0ABqEHQgA0FAayAAKALoArK7OQMAIANCADcDOCADQgA3AzAgBEGH0wQgA0EwahB0IANB9PwKKAIANgIgIAMgCiAGIAugojkDECADIAcgCSAIoKI5AxggBEGm1AQgA0EQahB0IAMgATYCACAEQcDOAyADEHQgACAEEP8FEBsaIAQQXCABEBggA0HQAWokAAscACAAQYmyBBAbGkHw/ApB8PwKKAIAQQVqNgIACxwAIABB97EEEBsaQfD8CkHw/AooAgBBBWs2AgALCwAgAEGitAQQGxoLLQEBfyMAQRBrIgEkACABIAAoAhAoAggQITYCACAAQZyBBCABEB4gAUEQaiQACwsAIABB84cEEBsaCxwAIABB3ocEEBsaQfD8CkHw/AooAgBBAms2AgALCwAgAEHYswQQGxoLCwAgAEHGswQQGxoLpgICB38BfiMAQTBrIgQkACAEQQxqQQBBJBA4GiAEIAE2AhwgACABEG4hAgNAIAIEQCAAIAIgARByIAAgAkEAEM4IIQIMAQsLIAEpAwghCkEAIQFBACEDAkAgACgCMCICBEAgCqchBSACKAIAIgYEQEEBIAIoAgh0IQMLIANBAWshBwNAIAEgA0YNAgJAAkAgBiABIAVq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b3BlbkF0dHJpYnV0ZUVudGl0aWVzID09IG9wZW5FbnRpdHkAaW5maW5pdHkAbGlzdC0+c2l6ZSA8IGxpc3QtPmNhcGFjaXR5AHJldC5zaXplIDwgcmV0LmNhcGFjaXR5AGZhbnRhc3kAL3N2Zy9pdm9yeQBvdXQgb2YgbWVtb3J5AEZlYnJ1YXJ5AEphbnVhcnkAZ3ZwbHVnaW5fZG90X2xheW91dF9MVFhfbGlicmFyeQBndnBsdWdpbl9uZWF0b19sYXlvdXRfTFRYX2xpYnJhcnkAZ3ZwbHVnaW5fY29yZV9MVFhfbGlicmFyeQBnYXRoZXJfdGltZV9lbnRyb3B5AGNvcHkAYWxiYW55AEp1bHkAU3BhcnNlTWF0cml4X211bHRpcGx5AGVxdWFsbHkAYXNzZW1ibHkAc3VtbWVyc2t5AHNoeQBzYXRpc2Z5AGJlYXV0aWZ5AG5vanVzdGlmeQBDbGFzc2lmeQAvc3ZnL2xpZ2h0Z3JleQAvc3ZnL2RpbWdyZXkAL3N2Zy9kYXJrZ3JleQAvc3ZnL2xpZ2h0c2xhdGVncmV5AC9zdmcvZGFya3NsYXRlZ3JleQAvc3ZnL3NsYXRlZ3JleQB3ZWJncmV5AHgxMWdyZXkAL3N2Zy9ncmV5AG1vdmUgdG8gZnJvbnQgbG9jayBpbmNvbnNpc3RlbmN5AGV4dHJhY3RfYWRqYWNlbmN5AG1lcmdlX29uZXdheQBhcnJheQBhbGxvY0FycmF5AC9zdmcvbGlnaHRncmF5AC9zdmcvZGltZ3JheQAvc3ZnL2RhcmtncmF5AC9zdmcvbGlnaHRzbGF0ZWdyYXkAL3N2Zy9kYXJrc2xhdGVncmF5AC9zdmcvc2xhdGVncmF5AHdlYmdyYXkAeDExZ3JheQAvc3ZnL2dyYXkAVGh1cnNkYXkAVHVlc2RheQBXZWRuZXNkYXkAU2F0dXJkYXkAU3VuZGF5AE1vbmRheQBGcmlkYXkATWF5AC4uLy4uL2xpYi9jZ3JhcGgvZ3JhbW1hci55ACVtLyVkLyV5AHBvcnRob3l4AHBvcnRob195eAB4eHgAcHgAYm94AHZpZXdCb3gAY2hrQm91bmRCb3gAL01lZGlhQm94AGdldF9lZGdlX2xhYmVsX21hdHJpeABpZGVhbF9kaXN0YW5jZV9tYXRyaXgAbXVzdCBub3QgdW5kZWNsYXJlIHByZWZpeAB1bmJvdW5kIHByZWZpeABodG1sbGV4AG1heAAjJTAyeCUwMnglMDJ4ACMlMnglMnglMnglMngAIyUxeCUxeCUxeAAtKyAgIDBYMHgALTBYKzBYIDBYLTB4KzB4IDB4AHJhcnJvdwBsYXJyb3cASGVsdmV0aWNhLU5hcnJvdwBhcnJvd19sZW5ndGhfY3JvdwAvc3ZnL3Nub3cAc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nX3Nsb3cAL3N2Zy9saWdodHllbGxvdwAvc3ZnL2dyZWVueWVsbG93AC9zdmcvbGlnaHRnb2xkZW5yb2R5ZWxsb3cAL3N2Zy95ZWxsb3cAZmF0YWwgZXJyb3IgLSBzY2FubmVyIGlucHV0IGJ1ZmZlciBvdmVyZmxvdwBmbGV4IHNjYW5uZXIgcHVzaC1iYWNrIG92ZXJmbG93AGNvdXJpZXJuZXcAU3ByaW5nU21vb3RoZXJfbmV3AFRyaWFuZ2xlU21vb3RoZXJfbmV3AGRpYWdfcHJlY29uX25ldwBRdWFkVHJlZV9uZXcAU3RyZXNzTWFqb3JpemF0aW9uU21vb3RoZXIyX25ldwBuICYmIG5ldwBza2V3AHN0cnZpZXcAL3N2Zy9ob25leWRldwAgLWFuY2hvciB3AHNvcnR2AHBvdjpwb3YATm92AGludgBlcXVpdgBwaXYAbm9uYW1lLmd2AEdEX3JhbmsoZylbcl0uYXYgPT0gR0RfcmFuayhnKVtyXS52AGNjJXNfJXp1AGNjJXMrJXp1AC9zdmcvcGVydQBudQBtdQAlYyVsbHUAVGh1AHRhdQBUYXUATnUATXUAX3BvcnRfJXNfKCVkKV8oJWQpXyV1AE51bWJlciBvZiBpdGVyYXRpb25zID0gJXUATnVtYmVyIG9mIGluY3JlYXNlcyA9ICV1AHBsYWludGV4dABzdHJlc3N3dABpbnB1dAB0ZXh0bGF5b3V0AGRvdF9sYXlvdXQAbmVhdG9fbGF5b3V0AGluaXRMYXlvdXQAY2x1c3QAbWFwQ2x1c3QAbGFiZWxqdXN0AHNjQWRqdXN0AEF1Z3VzdABlZGdlc2ZpcnN0AG5vZGVzZmlyc3QAbWF4aW1hbF9pbmRlcGVuZGVudF9lZGdlX3NldF9oZWF2ZXN0X2VkZ2VfcGVybm9kZV9zdXBlcm5vZGVzX2ZpcnN0AGV4aXN0AHJlYWxpZ25Ob2RlbGlzdABhcHBlbmROb2RlbGlzdABzbG90X2Zyb21fY29uc3RfbGlzdABzbG90X2Zyb21fbGlzdABkZWZhdWx0ZGlzdABtaW5kaXN0AHBvd2VyX2Rpc3QAZ3JhcGhfZGlzdABhdmdfZGlzdABnZXRFZGdlTGlzdABpcXVlc3QAbG93YXN0AHNwcmluZ19lbGVjdHJpY2FsX2VtYmVkZGluZ19mYXN0AGd2X3NvcnQAdmlld3BvcnQAdGFpbHBvcnQAdW5leHBlY3RlZCBwYXJzZXIgc3RhdGUgLSBwbGVhc2Ugc2VuZCBhIGJ1ZyByZXBvcnQAaGVhZHBvcnQAaHRtbF9wb3J0AGluc2VydABSVHJlZUluc2VydABmaW5kU1ZlcnQAc3RhcnQAcGFydABlc3RpbWF0ZV90ZXh0X3dpZHRoXzFwdABxdW90AH9yb290AG5vdABtYWtlX3ZuX3Nsb3QAZW1pdF94ZG90AHhkb3Q6eGRvdABlcHM6eGRvdABzdmc6eGRvdABqcGc6eGRvdABwbmc6eGRvdABqcGVnOnhkb3QAZ2lmOnhkb3QAanBlOnhkb3QAeGRvdDEuNDp4ZG90AHhkb3QxLjI6eGRvdABzZG90AG1pZGRvdABndjpkb3QAcGxhaW4tZXh0OmRvdABkb3Q6ZG90AGVwczpkb3QAY2Fub246ZG90AHBsYWluOmRvdABzdmc6ZG90AGpwZzpkb3QAcG5nOmRvdABqcGVnOmRvdABnaWY6ZG90AGpwZTpkb3QAf2JvdABkb0RvdABzcGFuLT5mb250AHZhZ3hicHJpbnQAZW5kcG9pbnQAeGRvdF9wb2ludABkZWNpZGVfcG9pbnQAVW5zYXRpc2ZpZWQgY29uc3RyYWludAB0cmFuc3BhcmVudABjb21wb25lbnQAaW52YWxpZCBhcmd1bWVudABjb21tZW50AGp1bmsgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudABjZW50AGkgPT0gZWNudABhcmlhbG10AGdldF9oYXNoX3NlY3JldF9zYWx0AGNpcmN1aXQAcG9seV9pbml0AE11bHRpbGV2ZWxfaW5pdABuc2xpbWl0AG1jbGltaXQAUG9ydHJhaXQAbGlnaHQAdmlydHVhbF93ZWlnaHQAbGhlaWdodABLUF9SaWdodABCb29rbWFuLUxpZ2h0AGd0AEtQX0xlZnQAY2hhcnNldABpbnNldABiaXRhcnJheV9yZXNldABndl9hcmVuYV9yZXNldABzdWJzZXQAYml0YXJyYXlfc2V0AG1hdHJpeF9zZXQAc2NhcmxldAAvc3ZnL2Rhcmt2aW9sZXQAL3N2Zy9ibHVldmlvbGV0AC9zdmcvdmlvbGV0AFRyZWJ1Y2hldABhZ3hnZXQAdGFpbHRhcmdldABsYWJlbHRhcmdldABlZGdldGFyZ2V0AGhlYWR0YXJnZXQAYml0YXJyYXlfZ2V0AHN0eWxlc2hlZXQAc3RyaWN0AGFnY29weWRpY3QAYWdtYWtlZGF0YWRpY3QAcmVjLT5kaWN0ID09IGRhdGFkaWN0AHdyaXRlX2RpY3QAaGludGVyc2VjdABndmJpc2VjdABlbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIGRlY2xhcmF0aW9uIGlzIGluY29ycmVjdABhc3BlY3QAbGF5ZXJzZWxlY3QAS1BfU3VidHJhY3QAUXVhZFRyZWVfcmVwdWxzaXZlX2ZvcmNlX2ludGVyYWN0AGNvbXBhY3QAT2N0AHJlcXVlc3RlZCBmZWF0dXJlIHJlcXVpcmVzIFhNTF9EVEQgc3VwcG9ydCBpbiBFeHBhdABsYWJlbGZsb2F0AGxhYmVsX2Zsb2F0AFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfZm9ybWF0AC9zdmcvd2hlYXQAbW9uY2hhaW5zX2F0AFNhdABBZ3JhcGhpbmZvX3QAQWdlZGdlaW5mb190AEFnbm9kZWluZm9fdABcdAByb3cgPCBtZS0+bnJvd3MAbWludXMAb3BsdXMAcmFkaXVzAGhlYXJ0cwBzYW1wbGVwb2ludHMAZGlyZWRnZWNvbnN0cmFpbnRzAGxldmVsIGFzc2lnbm1lbnQgY29uc3RyYWludHMAeHkgcHNldWRvLW9ydGhvZ29uYWwgY29uc3RyYWludHMAeXggcHNldWRvLW9ydGhvZ29uYWwgY29uc3RyYWludHMAeHkgb3J0aG9nb25hbCBjb25zdHJhaW50cwB5eCBvcnRob2dvbmFsIGNvbnN0cmFpbnRzAGxpbmUgc2VnbWVudHMAc2V0X2NlbGxfaGVpZ2h0cwByZWN0cwBhY2NvdW50aW5nUmVwb3J0U3RhdHMAZW50aXR5VHJhY2tpbmdSZXBvcnRTdGF0cwBaYXBmRGluZ2JhdHMAcmVtaW5jcm9zcwBjb21wcmVzcwBndnVzZXJzaGFwZV9maWxlX2FjY2VzcwBicmFzcwBjbGFzcwBhcHBseWF0dHJzAGFnbWFrZWF0dHJzAGJpbmRhdHRycwBwYXJzZV9sYXllcnMAbWtDbHVzdGVycwByb3VuZF9jb3JuZXJzAG1ha2VfYmFycmllcnMAY2RhdGEubnRvcGxldmVsID09IGFnbm5vZGVzKGcpIC0gY2RhdGEubnZhcnMAY2Fubm90IHJlYWxsb2Mgb3BzAGNhbm5vdCByZWFsbG9jIHBubHBzAGVwcwBjb3JlX2xvYWRpbWFnZV9wcwBlcHM6cHMAcHMyOnBzAChsaWIpOnBzAGd2X3RyaW1femVyb3MAYWd4YnVmX3RyaW1femVyb3MAdGV4Z3lyZWhlcm9zAGltYWdlcG9zAHRpbm9zAHNldEVkZ2VMYWJlbFBvcwBTZXR0aW5nIGluaXRpYWwgcG9zaXRpb25zAHhsaW50ZXJzZWN0aW9ucwBjb2x1bW5zAGRlamF2dXNhbnMAbmltYnVzc2FucwBsaWJlcmF0aW9uc2FucwBmcmVlc2FucwBzZXRDaGlsZFN1YnRyZWVTcGFucwBPcGVuU2FucwBvZmZzZXQgPT0gbl90ZXJtcwBkaXRlbXMAZGlhbXMAY29sIDwgbWUtPm5jb2xzAGNhbm5vdCByZWFsbG9jIGRxLnBubHMAY2Fubm90IHJlYWxsb2MgcG5scwBsZXZlbHMAZm9yY2VsYWJlbHMAZGlhZ29uYWxzAG1lcmdlX3JhbmtzAHNwbGl0QmxvY2tzAGludmlzAGNhbm5vdCByZWFsbG9jIHRyaXMAc2V0X2NlbGxfd2lkdGhzAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzAHllcwBzaG93Ym94ZXMAYmVhdXRpZnlfbGVhdmVzAGF0dGFjaF9lZGdlX2xhYmVsX2Nvb3JkaW5hdGVzAHBvbHlsaW5lcwBzcGxpbmVzAG9ydGhvZ29uYWwgbGluZXMAdGV4Z3lyZXRlcm1lcwBvdGltZXMAVGltZXMAZm9udG5hbWVzAHByZWZpeCBtdXN0IG5vdCBiZSBib3VuZCB0byBvbmUgb2YgdGhlIHJlc2VydmVkIG5hbWVzcGFjZSBuYW1lcwBTcGFyc2VNYXRyaXhfc3VtX3JlcGVhdF9lbnRyaWVzAHBlcmlwaGVyaWVzAEdldEJyYW5jaGVzAGYgPCBncmFwaFtqXS5uZWRnZXMAbWlubWF4X2VkZ2VzAGV4Y2hhbmdlX3RyZWVfZWRnZXMAbWFrZVN0cmFpZ2h0RWRnZXMAdW5kb0NsdXN0ZXJFZGdlcwBjb21wb3VuZEVkZ2VzAG1lcmdlX3RyZWVzAF9fY2x1c3Rlcm5vZGVzAGFnbm5vZGVzAE5EX2lkKG5wKSA9PSBuX25vZGVzAExvYWROb2RlcwBzaWRlcwBzcGFkZXMAdmVydGljZXMAY29vcmRzAHNldGJvdW5kcwBtZHMAY2RzAG1ha2VTZWxmQXJjcwBlbWl0X2VkZ2VfZ3JhcGhpY3MAY2x1YnMAY29uc29sYXMAJWxmJTJzAApTdHJpbmcgc3RhcnRpbmc6PCUuODBzAApTdHJpbmcgc3RhcnRpbmc6IiUuODBzACAlLipzACVzJXMAZXhwYXQ6IEFjY291bnRpbmcoJXApOiBEaXJlY3QgJTEwbGx1LCBpbmRpcmVjdCAlMTBsbHUsIGFtcGxpZmljYXRpb24gJTguMmYlcwAlLipzJWMlcwAgJXM6JXMAX18lZDolcwAvJXMvJXMAJXMtJXMALCVzACBmb250LWZhbWlseT0iJXMAIiBzdHJva2UtZGFzaGFycmF5PSIlcwAiIGNsYXNzPSIlcwBwb2x5ICVzACgoJWYsJWYpLCglZiwlZikpICVzICVzAGNvbG9yICVzAHJvb3QgPSAlcwAgVGl0bGU6ICVzACJzdHJpY3QiOiAlcwBjb3VyAHV0cgBhcHBlbmRhdHRyAGFkZGF0dHIAYmVnaW5zdHIAZnN0cgBzdHJ2aWV3X3N0cgBwb3ZfY29sb3JfYXNfc3RyAHZwc2MhPW51bGxwdHIAYmVuZFRvU3RyAHVhcnIAY3JhcnIAbGFycgBoYXJyAGRhcnIAdUFycgByQXJyAGxBcnIAaEFycgBkQXJyAEFwcgBTcGFyc2VNYXRyaXhfbXVsdGlwbHlfdmVjdG9yAHRlcm1pbmF0b3IAaW5zdWxhdG9yAGludGVybmFsRW50aXR5UHJvY2Vzc29yAHRleGd5cmVjdXJzb3IAc3ludGF4IGVycm9yAG1vbmV5X2dldCBlcnJvcgBFcnJvcgByZmxvb3IAbGZsb29yAGxhYmVsZm9udGNvbG9yAHBlbmNvbG9yAGZpbGxjb2xvcgBiZ2NvbG9yAHJvdyBtYWpvcgBjb2x1bW4gbWFqb3IAbmVpZ2hib3IAc3R5bGVfb3IAbXIAcmFua2RpcgBwYWdlZGlyAGxheWVyAHVwcGVyID49IGxvd2VyAE5vZGVDb3ZlcgAvc3ZnL3NpbHZlcgBjbHVzdGVyAGV4cGFuZENsdXN0ZXIAcnByb21vdGVyAGxwcm9tb3RlcgBjZW50ZXIAbWF4aXRlcgBwYXJ0aWFsIGNoYXJhY3RlcgAhIHJvb3RQYXJzZXItPm1fcGFyZW50UGFyc2VyAGRrZ3JlZW5jb3BwZXIAY29vbGNvcHBlcgBndl9zb3J0X2NvbXBhcl93cmFwcGVyAHRhcGVyAG92ZXJsYXBfYmV6aWVyAGZpZ19iZXppZXIAY291cmllcgBDb3VyaWVyAGhpZXIAZGFnZ2VyAERhZ2dlcgBvdXRwdXRvcmRlcgBwb3N0b3JkZXIAZmxhdF9yZW9yZGVyAGNlbGxib3JkZXIAZml4TGFiZWxPcmRlcgBjeWxpbmRlcgAvc3ZnL2xhdmVuZGVyAHJlbmRlcgBmb2xkZXIAY2x1c3Rlcl9sZWFkZXIATkRfVUZfc2l6ZShuKSA8PSAxIHx8IG4gPT0gbGVhZGVyAE9jdG9iZXIAcmVmZXJlbmNlIHRvIGludmFsaWQgY2hhcmFjdGVyIG51bWJlcgBOb3ZlbWJlcgBTZXB0ZW1iZXIARGVjZW1iZXIAbWFjcgBicgBzdGFyAGZlbGRzcGFyAHJlZ3VsYXIAaW9zX2Jhc2U6OmNsZWFyAGJydmJhcgBNYXIAXHIATkRfcmFuayh2KSA9PSByAHN0cmVxAHN0cnZpZXdfZXEAc3Rydmlld19zdHJfZXEAc3Rydmlld19jYXNlX3N0cl9lcQBzdHJ2aWV3X2Nhc2VfZXEAdnAAJSVCZWdpblByb2xvZwovRG90RGljdCAyMDAgZGljdCBkZWYKRG90RGljdCBiZWdpbgoKL3NldHVwTGF0aW4xIHsKbWFyawovRW5jb2RpbmdWZWN0b3IgMjU2IGFycmF5IGRlZgogRW5jb2RpbmdWZWN0b3IgMAoKSVNPTGF0aW4xRW5jb2RpbmcgMCAyNTUgZ2V0aW50ZXJ2YWwgcHV0aW50ZXJ2YWwKRW5jb2RpbmdWZWN0b3IgNDUgL2h5cGhlbiBwdXQKCiUgU2V0IHVwIElTTyBMYXRpbiAxIGNoYXJhY3RlciBlbmNvZGluZwovc3Rhcm5ldElTTyB7CiAgICAgICAgZHVwIGR1cCBmaW5kZm9udCBkdXAgbGVuZ3RoIGRpY3QgYmVnaW4KICAgICAgICB7IDEgaW5kZXggL0ZJRCBuZSB7IGRlZiB9eyBwb3AgcG9wIH0gaWZlbHNlCiAgICAgICAgfSBmb3JhbGwKICAgICAgICAvRW5jb2RpbmcgRW5jb2RpbmdWZWN0b3IgZGVmCiAgICAgICAgY3VycmVudGRpY3QgZW5kIGRlZmluZWZvbnQKfSBkZWYKL1RpbWVzLVJvbWFuIHN0YXJuZXRJU08gZGVmCi9UaW1lcy1JdGFsaWMgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGQgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGRJdGFsaWMgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYSBzdGFybmV0SVNPIGRlZgovSGVsdmV0aWNhLU9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYS1Cb2xkIHN0YXJuZXRJU08gZGVmCi9IZWx2ZXRpY2EtQm9sZE9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXIgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXItT2JsaXF1ZSBzdGFybmV0SVNPIGRlZgovQ291cmllci1Cb2xkIHN0YXJuZXRJU08gZGVmCi9Db3VyaWVyLUJvbGRPYmxpcXVlIHN0YXJuZXRJU08gZGVmCmNsZWFydG9tYXJrCn0gYmluZCBkZWYKCiUlQmVnaW5SZXNvdXJjZTogcHJvY3NldCBncmFwaHZpeiAwIDAKL2Nvb3JkLWZvbnQtZmFtaWx5IC9UaW1lcy1Sb21hbiBkZWYKL2RlZmF1bHQtZm9udC1mYW1pbHkgL1RpbWVzLVJvbWFuIGRlZgovY29vcmRmb250IGNvb3JkLWZvbnQtZmFtaWx5IGZpbmRmb250IDggc2NhbGVmb250IGRlZgoKL0ludlNjYWxlRmFjdG9yIDEuMCBkZWYKL3NldF9zY2FsZSB7CiAgICAgICBkdXAgMSBleGNoIGRpdiAvSW52U2NhbGVGYWN0b3IgZXhjaCBkZWYKICAgICAgIHNjYWxlCn0gYmluZCBkZWYKCiUgc3R5bGVzCi9zb2xpZCB7IFtdIDAgc2V0ZGFzaCB9IGJpbmQgZGVmCi9kYXNoZWQgeyBbOSBJbnZTY2FsZUZhY3RvciBtdWwgZHVwIF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2RvdHRlZCB7IFsxIEludlNjYWxlRmFjdG9yIG11bCA2IEludlNjYWxlRmFjdG9yIG11bF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2ludmlzIHsvZmlsbCB7bmV3cGF0aH0gZGVmIC9zdHJva2Uge25ld3BhdGh9IGRlZiAvc2hvdyB7cG9wIG5ld3BhdGh9IGRlZn0gYmluZCBkZWYKL2JvbGQgeyAyIHNldGxpbmV3aWR0aCB9IGJpbmQgZGVmCi9maWxsZWQgeyB9IGJpbmQgZGVmCi91bmZpbGxlZCB7IH0gYmluZCBkZWYKL3JvdW5kZWQgeyB9IGJpbmQgZGVmCi9kaWFnb25hbHMgeyB9IGJpbmQgZGVmCi90YXBlcmVkIHsgfSBiaW5kIGRlZgoKJSBob29rcyBmb3Igc2V0dGluZyBjb2xvciAKL25vZGVjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2VkZ2Vjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2dyYXBoY29sb3IgeyBzZXRoc2Jjb2xvciB9IGJpbmQgZGVmCi9ub3Bjb2xvciB7cG9wIHBvcCBwb3B9IGJpbmQgZGVmCgovYmVnaW5wYWdlIHsJJSBpIGogbnBhZ2VzCgkvbnBhZ2VzIGV4Y2ggZGVmCgkvaiBleGNoIGRlZgoJL2kgZXhjaCBkZWYKCS9zdHIgMTAgc3RyaW5nIGRlZgoJbnBhZ2VzIDEgZ3QgewoJCWdzYXZlCgkJCWNvb3JkZm9udCBzZXRmb250CgkJCTAgMCBtb3ZldG8KCQkJKFwoKSBzaG93IGkgc3RyIGN2cyBzaG93ICgsKSBzaG93IGogc3RyIGN2cyBzaG93IChcKSkgc2hvdwoJCWdyZXN0b3JlCgl9IGlmCn0gYmluZCBkZWYKCi9zZXRfZm9udCB7CglmaW5kZm9udCBleGNoCglzY2FsZWZvbnQgc2V0Zm9udAp9IGRlZgoKJSBkcmF3IHRleHQgZml0dGVkIHRvIGl0cyBleHBlY3RlZCB3aWR0aAovYWxpZ25lZHRleHQgewkJCSUgd2lkdGggdGV4dAoJL3RleHQgZXhjaCBkZWYKCS93aWR0aCBleGNoIGRlZgoJZ3NhdmUKCQl3aWR0aCAwIGd0IHsKCQkJW10gMCBzZXRkYXNoCgkJCXRleHQgc3RyaW5nd2lkdGggcG9wIHdpZHRoIGV4Y2ggc3ViIHRleHQgbGVuZ3RoIGRpdiAwIHRleHQgYXNob3cKCQl9IGlmCglncmVzdG9yZQp9IGRlZgoKL2JveHByaW0gewkJCQklIHhjb3JuZXIgeWNvcm5lciB4c2l6ZSB5c2l6ZQoJCTQgMiByb2xsCgkJbW92ZXRvCgkJMiBjb3B5CgkJZXhjaCAwIHJsaW5ldG8KCQkwIGV4Y2ggcmxpbmV0bwoJCXBvcCBuZWcgMCBybGluZXRvCgkJY2xvc2VwYXRoCn0gYmluZCBkZWYKCi9lbGxpcHNlX3BhdGggewoJL3J5IGV4Y2ggZGVmCgkvcnggZXhjaCBkZWYKCS95IGV4Y2ggZGVmCgkveCBleGNoIGRlZgoJbWF0cml4IGN1cnJlbnRtYXRyaXgKCW5ld3BhdGgKCXggeSB0cmFuc2xhdGUKCXJ4IHJ5IHNjYWxlCgkwIDAgMSAwIDM2MCBhcmMKCXNldG1hdHJpeAp9IGJpbmQgZGVmCgovZW5kcGFnZSB7IHNob3dwYWdlIH0gYmluZCBkZWYKL3Nob3dwYWdlIHsgfSBkZWYKCi9sYXllcmNvbG9yc2VxCglbCSUgbGF5ZXIgY29sb3Igc2VxdWVuY2UgLSBkYXJrZXN0IHRvIGxpZ2h0ZXN0CgkJWzAgMCAwXQoJCVsuMiAuOCAuOF0KCQlbLjQgLjggLjhdCgkJWy42IC44IC44XQoJCVsuOCAuOCAuOF0KCV0KZGVmCgovbGF5ZXJsZW4gbGF5ZXJjb2xvcnNlcSBsZW5ndGggZGVmCgovc2V0bGF5ZXIgey9tYXhsYXllciBleGNoIGRlZiAvY3VybGF5ZXIgZXhjaCBkZWYKCWxheWVyY29sb3JzZXEgY3VybGF5ZXIgMSBzdWIgbGF5ZXJsZW4gbW9kIGdldAoJYWxvYWQgcG9wIHNldGhzYmNvbG9yCgkvbm9kZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZWRnZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZ3JhcGhjb2xvciB7bm9wY29sb3J9IGRlZgp9IGJpbmQgZGVmCgovb25sYXllciB7IGN1cmxheWVyIG5lIHtpbnZpc30gaWYgfSBkZWYKCi9vbmxheWVycyB7CgkvbXl1cHBlciBleGNoIGRlZgoJL215bG93ZXIgZXhjaCBkZWYKCWN1cmxheWVyIG15bG93ZXIgbHQKCWN1cmxheWVyIG15dXBwZXIgZ3QKCW9yCgl7aW52aXN9IGlmCn0gZGVmCgovY3VybGF5ZXIgMCBkZWYKCiUlRW5kUmVzb3VyY2UKJSVFbmRQcm9sb2cKJSVCZWdpblNldHVwCjE0IGRlZmF1bHQtZm9udC1mYW1pbHkgc2V0X2ZvbnQKJSAvYXJyb3dsZW5ndGggMTAgZGVmCiUgL2Fycm93d2lkdGggNSBkZWYKCiUgbWFrZSBzdXJlIHBkZm1hcmsgaXMgaGFybWxlc3MgZm9yIFBTLWludGVycHJldGVycyBvdGhlciB0aGFuIERpc3RpbGxlcgovcGRmbWFyayB3aGVyZSB7cG9wfSB7dXNlcmRpY3QgL3BkZm1hcmsgL2NsZWFydG9tYXJrIGxvYWQgcHV0fSBpZmVsc2UKJSBtYWtlICc8PCcgYW5kICc+Picgc2FmZSBvbiBQUyBMZXZlbCAxIGRldmljZXMKL2xhbmd1YWdlbGV2ZWwgd2hlcmUge3BvcCBsYW5ndWFnZWxldmVsfXsxfSBpZmVsc2UKMiBsdCB7CiAgICB1c2VyZGljdCAoPDwpIGN2biAoWykgY3ZuIGxvYWQgcHV0CiAgICB1c2VyZGljdCAoPj4pIGN2biAoWykgY3ZuIGxvYWQgcHV0Cn0gaWYKCiUlRW5kU2V0dXAAc3VwAGdyb3VwAGN1cAB0aGluc3AAZW5zcABlbXNwAG5ic3AAcGVycAB3ZWllcnAAZ2VuZXJhdGUtY29uc3RyYWludHMuY3BwAGJsb2NrLmNwcABjc29sdmVfVlBTQy5jcHAAf3RvcABwcm9wAGFneGJwb3AAbm9wAGFzeW1wAGNvbXAAZmluZENDb21wAGJtcABzY2FsZV9jbGFtcAB4bHAAbHAgIT0gY2xwAHRhaWxfbHAAaGVhZF9scAB0YWlsdG9vbHRpcABsYWJlbHRvb2x0aXAAZWRnZXRvb2x0aXAAaGVhZHRvb2x0aXAAaGVsbGlwAHRhaWxjbGlwAGhlYWRjbGlwAC9zdmcvcGFwYXlhd2hpcABocAB0cmFuc3Bvc2Vfc3RlcABjb21wdXRlU3RlcABsYXllcmxpc3RzZXAAbGF5ZXJzZXAAaXBzZXAAcmFua3NlcABub2Rlc2VwAHN1YmdyYXBocyBuZXN0ZWQgbW9yZSB0aGFuICVkIGRlZXAAU2VwAHNmZHAAY3AAd2VicABpZG1hcABjbHVzdGVyX21hcABjbWFweDptYXAAZXBzOm1hcABjbWFweF9ucDptYXAAaW1hcF9ucDptYXAAaXNtYXA6bWFwAGltYXA6bWFwAGNtYXA6bWFwAHN2ZzptYXAAanBnOm1hcABwbmc6bWFwAGpwZWc6bWFwAGdpZjptYXAAanBlOm1hcABvdmVybGFwAGxldmVsc2dhcABjYXAAS1BfVXAAJUk6JU06JVMgJXAAc3RhcnQgPD0gcAByc3F1bwBsc3F1bwByZHF1bwBsZHF1bwBiZHF1bwBzYnF1bwByc2FxdW8AbHNhcXVvAHJhcXVvAGxhcXVvAGF1dG8ATnVuaXRvAC9zdmcvdG9tYXRvAG5lYXRvAGV1cm8AL3N2Zy9nYWluc2Jvcm8ATWV0aG9kWmVybwBtaWNybwBuaW1idXNtb25vAGxpYmVyYXRpb25tb25vAGZyZWVtb25vAGFyaW1vAHJhdGlvAHBvcnRobwByaG8AUmhvAC9zdmcvaW5kaWdvAHBpbmZvAGNjZ3JhcGhpbmZvAGNjZ25vZGVpbmZvAGNsX2VkZ2VfaW5mbwBnZXRQYWNrSW5mbwBtYWtlSW5mbwBwYXJzZVBhY2tNb2RlSW5mbwBjaXJjbwBpY28AXCUwM28AL3N2Zy9yb3N5YnJvd24AL3N2Zy9zYW5keWJyb3duAHZlcnlkYXJrYnJvd24AL3N2Zy9zYWRkbGVicm93bgAvc3ZnL2Jyb3duAEtQX0Rvd24AY2Fubm90IGNoYW5nZSBzZXR0aW5nIG9uY2UgcGFyc2luZyBoYXMgYmVndW4AU3VuAEp1bgB0aG9ybgAvc3ZnL2NyaW1zb24AeGRvdF9qc29uAHhkb3RfanNvbjpqc29uAGpzb24wOmpzb24Ab21pY3JvbgBPbWljcm9uAHNjYXJvbgBTY2Fyb24Ad2VibWFyb29uAHgxMW1hcm9vbgAvc3ZnL21hcm9vbgAvc3ZnL2xpZ2h0c2FsbW9uAC9zdmcvZGFya3NhbG1vbgAvc3ZnL3NhbG1vbgB1cHNpbG9uAGVwc2lsb24AVXBzaWxvbgBFcHNpbG9uAHJlc29sdXRpb24AZGlzdG9ydGlvbgBzdGQ6OmV4Y2VwdGlvbgBwYXJ0aXRpb24AZG90X3Bvc2l0aW9uAFNldHRpbmcgdXAgc3RyZXNzIGZ1bmN0aW9uAHVuY2xvc2VkIENEQVRBIHNlY3Rpb24AcG9zdGFjdGlvbgByb3RhdGlvbgBvcmllbnRhdGlvbgBhYm9taW5hdGlvbgBhY2NvdW50aW5nR2V0Q3VycmVudEFtcGxpZmljYXRpb24AeGRvdHZlcnNpb24AU1RzZXRVbmlvbgA8cG9seWdvbgBoZXhhZ29uAHNlcHRhZ29uAHBlbnRhZ29uAHRyaXBsZW9jdGFnb24AZG91Ymxlb2N0YWdvbgAvc3ZnL2xlbW9uY2hpZmZvbgBNb24AcGx1c21uAG5vdGluAGlzaW4AL3N2Zy9tb2NjYXNpbgBwaW4AbWluAHZvcm9fbWFyZ2luAGluZmluAG9uZWRfb3B0aW1pemVyX3RyYWluAHBsYWluAG1ha2VfY2hhaW4AbWVyZ2VfY2hhaW4AZGVsZXRlTWluAGZpbmRNaW4AdmFsaWduAGJhbGlnbgB5ZW4ATXVsdGlsZXZlbF9jb2Fyc2VuAGN1cnJlbgBQb2Jzb3BlbgBndl9mb3BlbgBndnVzZXJzaGFwZV9vcGVuAGVudGl0eVRyYWNraW5nT25PcGVuAC9zdmcvbGluZW4AZGltZW4AbWlubGVuAHN0eWxlX3Rva2VuAHVuY2xvc2VkIHRva2VuAC9zdmcveWVsbG93Z3JlZW4AbWVkaXVtZm9yZXN0Z3JlZW4AL3N2Zy9mb3Jlc3RncmVlbgAvc3ZnL2xpZ2h0Z3JlZW4AaHVudGVyc2dyZWVuAC9zdmcvbGF3bmdyZWVuAC9zdmcvZGFya2dyZWVuAC9zdmcvbWVkaXVtc3ByaW5nZ3JlZW4AL3N2Zy9zcHJpbmdncmVlbgAvc3ZnL2RhcmtvbGl2ZWdyZWVuAC9zdmcvbGltZWdyZWVuAC9zdmcvcGFsZWdyZWVuAHdlYmdyZWVuAC9zdmcvbGlnaHRzZWFncmVlbgAvc3ZnL21lZGl1bXNlYWdyZWVuAC9zdmcvZGFya3NlYWdyZWVuAC9zdmcvc2VhZ3JlZW4AeDExZ3JlZW4AL3N2Zy9ncmVlbgBHcmVlbgAvc3ZnL2xpZ2h0Y3lhbgAvc3ZnL2RhcmtjeWFuAC9zdmcvY3lhbgBuZXd0YW4AZGFya3RhbgAvc3ZnL3RhbgByb3dzcGFuAGNvbHNwYW4AbmFuAHRpbWVzbmV3cm9tYW4AbmltYnVzcm9tYW4AdGltZXNyb21hbgBUaW1lcy1Sb21hbgBQYWxhdGluby1Sb21hbgBOZXdDZW50dXJ5U2NobGJrLVJvbWFuAEphbgBHRF9yYW5rKGcpW3JdLm4gPD0gR0RfcmFuayhnKVtyXS5hbgBhZ3hicHV0X24AXG4Abl9ub2RlcyA9PSBncmFwaC0+bgBBLT5tID09IEEtPm4Aam9iLT5vYmotPnUubgBuemMgPT0gKHNpemVfdCluAHMsJWxmLCVsZiVuACBlLCVsZiwlbGYlbgAlZCAlMVsiXSVuAHYgPT0gbgBiID09IG4AbmNsdXN0ZXIgPD0gbgBwc3ltAGFsZWZzeW0AdGhldGFzeW0AcXVhbnR1bQBzdW0AL3N2Zy9wbHVtAGludnRyYXBleml1bQBtZWRpdW0AOTpwcmlzbQBscm0AY3VzdG9tAGFwdHItPnRhZyA9PSBUX2F0b20AL2Rldi91cmFuZG9tAGd2X3JhbmRvbQBtbQBybG0Ac2ltAElNRFNfZ2l2ZW5fZGltAG9yZG0AY20AcGFyYWxsZWxvZ3JhbQAvc3ZnL21pbnRjcmVhbQBKdWwAdGwAZnJhc2wAU3ltYm9sAGZpbmRDb2wAPD94bWwAeXVtbAB1dW1sAG91bWwAaXVtbABldW1sAGF1bWwAWXVtbABVdW1sAE91bWwASXVtbABFdW1sAEF1bWwAY29yZV9sb2FkaW1hZ2VfdnJtbABqcGc6dnJtbABwbmc6dnJtbABqcGVnOnZybWwAZ2lmOnZybWwAanBlOnZybWwAYnVsbABmaWxsAC9zdmcvc2Vhc2hlbGwAZm9yYWxsAEFwcmlsAHBlcm1pbAByY2VpbABsY2VpbABjY2VkaWwAQ2NlZGlsAGFycm93dGFpbABsdGFpbABzYW1ldGFpbABsZXZlbCA+PSAwICYmIGxldmVsIDw9IG4tPmxldmVsAHN0cmVzc19tYWpvcml6YXRpb25fa0RfbWtlcm5lbABpc19wYXJhbGxlbABDYWxjdWxhdGluZyBjaXJjdWl0IG1vZGVsAENhbGN1bGF0aW5nIHN1YnNldCBtb2RlbABDYWxjdWxhdGluZyBNRFMgbW9kZWwAeGxhYmVsAHRhaWxsYWJlbABoZWFkbGFiZWwAZ3JhcGggbGFiZWwAaWV4Y2wAb2JqcC0+bGJsAG92YWwAbWVyZ2V2aXJ0dWFsAC9zdmcvbGlnaHRjb3JhbAAvc3ZnL2NvcmFsAFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfYXJyYXlzX2ludGVybmFsAE11bHRpbGV2ZWxfY29hcnNlbl9pbnRlcm5hbABRdWFkVHJlZV9hZGRfaW50ZXJuYWwAYXJyb3dfbGVuZ3RoX25vcm1hbABhcmlhbAByYWRpYWwAL3N2Zy90ZWFsAHJlYWwAbG9jYWwAZXN0aW1hdGVfY2hhcmFjdGVyX3dpZHRoX2Nhbm9uaWNhbABnbG9iYWwAcS0+bAAuLi8uLi9saWIvY2dyYXBoL3NjYW4ubAB0azp0awBnaWY6dGsAcGF0Y2h3b3JrAHRvawBib29rAEF2YW50R2FyZGUtQm9vawBzaW5rAG92ZXJsYXBfc2hyaW5rAHNwaWN5cGluawAvc3ZnL2hvdHBpbmsAL3N2Zy9saWdodHBpbmsAL3N2Zy9kZWVwcGluawBuZW9ucGluawAvc3ZnL3BpbmsAbmV3cmFuawBjbHVzdGVycmFuawBfbmV3X3JhbmsAaW5zdGFsbF9pbl9yYW5rAHJlbW92ZV9mcm9tX3JhbmsAL3N2Zy9jb3Juc2lsawBvbmVibG9jawB2LT5sZWZ0LT5ibG9jayA9PSB2LT5yaWdodC0+YmxvY2sAL3N2Zy9maXJlYnJpY2sAUFFjaGVjawBwYWNrAC9zdmcvYmxhY2sAQmxhY2sAYmFjawB6d2oAenduagBqb2ItPm9iagBnZXRpbnRyc3hpAHBzaQBQc2kAQ2FsaWJyaQBGcmkAdHdvcGkAZHBpAHZvcm9ub2kAVm9yb25vaQBjaGFuaQBkZW1pAEJvb2ttYW4tRGVtaQBBdmFudEdhcmRlLURlbWkAL3N2Zy9kYXJra2hha2kAL3N2Zy9raGFraQBwaGkAY2hpAFBoaQBDaGkAZGkAWGkAUGkATkRfaWQobnApID09IGkATl9JRFgocHEtPnBxW2ldKSA9PSBpAFN0cmVzc01ham9yaXphdGlvblNtb290aGVyX3Ntb290aABTcHJpbmdTbW9vdGhlcl9zbW9vdGgAYm90aABzdGFydHN3aXRoAGxpbmVsZW5ndGgAYmFkX2FycmF5X25ld19sZW5ndGgAYXZlcmFnZV9lZGdlX2xlbmd0aABldGgAcGVud2lkdGgAbHdpZHRoAHNldGxpbmV3aWR0aABzaG9ydHBhdGgAZm9udHBhdGgAUG9ic3BhdGgAYmVnaW5wYXRoAGltYWdlcGF0aABlbmRwYXRoAHN0cmFpZ2h0X3BhdGgAbWFwX3BhdGgAPHBhdGgAY2Fubm90IGZpbmQgdHJpYW5nbGUgcGF0aAAvc3ZnL2xhdmVuZGVyYmx1c2gAZmxlc2gAb3NsYXNoAE9zbGFzaABkdHN0cmhhc2gAc3RyZGljdF9oYXNoAG5kYXNoAG1kYXNoAGRpZ3JhcGgAc3ViZ3JhcGgAY29uc3RydWN0X2dyYXBoAGNoa1NncmFwaABjbG9zZXN0X3BhaXJzMmdyYXBoAGFnZGVsZXRlIG9uIHdyb25nIGdyYXBoAGNvbm5lY3RHcmFwaAB1cHNpaAAlc2xpbmUtdGhyb3VnaABjaGFuU2VhcmNoAFJUcmVlU2VhcmNoAE1hcmNoAERpc2NvbkJyYW5jaABQaWNrQnJhbmNoAEFkZEJyYW5jaAAuLi8uLi9saWIvdXRpbC9iaXRhcnJheS5oAC4uLy4uL2xpYi91dGlsL3N0cnZpZXcuaAAuLi8uLi9saWIvdXRpbC9zb3J0LmgALi4vLi4vbGliL2NncmFwaC9ub2RlX3NldC5oAC4uLy4uL2xpYi91dGlsL3N0cmVxLmgALi4vLi4vbGliL3V0aWwvc3RhcnRzd2l0aC5oAC4uLy4uL2xpYi91dGlsL2d2X21hdGguaAAuLi8uLi9saWIvdXRpbC9hZ3hidWYuaAAuLi8uLi9saWIvdXRpbC90b2tlbml6ZS5oAC4uLy4uL2xpYi91dGlsL2FsbG9jLmgAYXV4ZwBjb3JlX2xvYWRpbWFnZV9zdmcAc3ZnOnN2ZwBqcGc6c3ZnAHBuZzpzdmcAanBlZzpzdmcAZ2lmOnN2ZwBqcGU6c3ZnAHN2Z19pbmxpbmU6c3ZnAEF1ZwBkb1Byb2xvZwBwb3dlcl9pdGVyYXRpb25fb3J0aG9nAHBuZwBpZGVhbF9kaXN0X3NjaGVtZSB2YWx1ZSB3cm9uZwB4ZG90IHZlcnNpb24gIiVzIiB0b28gbG9uZwBjb25nAGxibGVuY2xvc2luZwBiYXNpY19zdHJpbmcAZmFpbHVyZSBtYWxsb2MnaW5nIGZvciByZXN1bHQgc3RyaW5nAHNwcmluZwBvcmRlcmluZwBnZW5lcmF0ZVJhbmRvbU9yZGVyaW5nAGFyaW5nAEFyaW5nAERhbXBpbmcAV2FybmluZwBvdmVybGFwX3NjYWxpbmcAeCBhbmQgeSBzY2FsaW5nAG9sZCBzY2FsaW5nAHNtb290aGluZwB1bmtub3duIGVuY29kaW5nAG11bHRpbGV2ZWxfc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nAHNwcmluZ19lbGVjdHJpY2FsX3NwcmluZ19lbWJlZGRpbmcAY2VsbHBhZGRpbmcAY2VsbHNwYWNpbmcAcmFuZwBsYW5nAGZpdmVwb3ZlcmhhbmcAdGhyZWVwb3ZlcmhhbmcAbm92ZXJoYW5nAGVtaXRfaHRtbF9pbWcAbGcAb3JpZwBzemxpZwBvZWxpZwBhZWxpZwBPRWxpZwBBRWxpZwBjb3JlX2xvYWRpbWFnZV9maWcAanBnOmZpZwBwbmc6ZmlnAGZpZzpmaWcAanBlZzpmaWcAZ2lmOmZpZwBqcGU6ZmlnAGVnZwBuZXh0X3NlZwByZWcAanBlZwBpID09IGRlZwBkZwBjZwBjbG9zZXN1YmcAbWlzbWF0Y2hlZCB0YWcAYmV6LT5zZmxhZwBiZXotPmVmbGFnACEqZmxhZwAhZmxhZwA8ZwAlLjVnLCUuNWcsJS41ZywlLjVnACUuNWcgJS41ZwAlZyAlZwBib3hJbnRlcnNlY3RmAGVwc2YAYWdlZGdlc2VxY21wZgBjY3dyb3RhdGVwZgBmbm9mAGluZgBzZWxmAGhhbGYAJWxmJWxmJWxmJWxmACVsZiwlbGYsJWxmLCVsZiwlbGYAJSpmICUqZiAlbGYgJWxmAGxpYmVyYXRpb25zZXJpZgBmcmVlc2VyaWYAc2Fucy1TZXJpZgBnaWYAL3N2Zy9wZWFjaHB1ZmYAcmlmZgBhY2NvdW50aW5nUmVwb3J0RGlmZgAoWG1sQmlnQ291bnQpLTEgLSByb290UGFyc2VyLT5tX2FsbG9jX3RyYWNrZXIuYnl0ZXNBbGxvY2F0ZWQgPj0gYWJzRGlmZgB0YWlsaHJlZgBsYWJlbGhyZWYAZWRnZWhyZWYAaGVhZGhyZWYAb3JkZgBwZGYAc2lnbWFmAFxmACUuMExmACVMZgB1cy0+ZgAlLjAzZgAlcyB0cmFuc21pdCAlLjNmAHJnYjwlOS4zZiwgJTkuM2YsICU5LjNmPiB0cmFuc21pdCAlLjNmACUuMDJmACUuMmYAJS4wZiwlLjBmLCUuMGYsJS4wZgAgJS4wZiwlLjBmACUuMGYgJS4wZiAlLjBmICUuMGYAIiBmaWxsLW9wYWNpdHk9IiVmACIgc3Ryb2tlLW9wYWNpdHk9IiVmAApmaW5hbCBlID0gJWYAYnJvbnplAGFycm93c2l6ZQBsYWJlbGZvbnRzaXplAHNlYXJjaHNpemUAZml4ZWRzaXplAG5vZGVfc2V0X3NpemUAdGV4dHNwYW5fc2l6ZQBzdmdfc2l6ZQBpbmRleCA8IGxpc3QtPnNpemUAY2FwYWNpdHkgPiBkaWN0LT5zaXplAGNhcGFjaXR5ID4gc2VsZi0+c2l6ZQBiei5zaXplAHBvaW50LXNpemUAU0laRV9NQVggLSBzaXplb2Yoc2l6ZV90KSAtIEVYUEFUX01BTExPQ19QQURESU5HID49IHNpemUAbm9ybWFsaXplAEVMaW5pdGlhbGl6ZQBta01hemUAaWN1cnZlAHRyeV9yZXNlcnZlAG5vZGVfc2V0X3JlbW92ZQBzdHJkaWN0X3JlbW92ZQBzb2x2ZQAhdi0+YWN0aXZlAC1hY3RpdmUAZm9udF9pbl9saXN0X3Blcm1pc3NpdmUAL3N2Zy9vbGl2ZQB1Z3JhdmUAb2dyYXZlAGlncmF2ZQBlZ3JhdmUAYWdyYXZlAFVncmF2ZQBPZ3JhdmUASWdyYXZlAEVncmF2ZQBBZ3JhdmUAdHJ1ZQAvc3ZnL2Jpc3F1ZQBvYmxpcXVlAEF2YW50R2FyZGUtQm9va09ibGlxdWUAQXZhbnRHYXJkZS1EZW1pT2JsaXF1ZQBIZWx2ZXRpY2EtTmFycm93LUJvbGRPYmxpcXVlAENvdXJpZXItQm9sZE9ibGlxdWUASGVsdmV0aWNhLUJvbGRPYmxpcXVlAEhlbHZldGljYS1OYXJyb3ctT2JsaXF1ZQBDb3VyaWVyLU9ibGlxdWUASGVsdmV0aWNhLU9ibGlxdWUAbmF2eWJsdWUAL3N2Zy9saWdodHNreWJsdWUAL3N2Zy9kZWVwc2t5Ymx1ZQAvc3ZnL3NreWJsdWUAbmV3bWlkbmlnaHRibHVlAC9zdmcvbWlkbmlnaHRibHVlAC9zdmcvbGlnaHRibHVlAC9zdmcvY2FkZXRibHVlAC9zdmcvY29ybmZsb3dlcmJsdWUAL3N2Zy9kb2RnZXJibHVlAC9zdmcvcG93ZGVyYmx1ZQBuZW9uYmx1ZQAvc3ZnL21lZGl1bWJsdWUAL3N2Zy9saWdodHN0ZWVsYmx1ZQAvc3ZnL3N0ZWVsYmx1ZQAvc3ZnL3JveWFsYmx1ZQAvc3ZnL2RhcmtibHVlAHJpY2hibHVlAGxpZ2h0c2xhdGVibHVlAC9zdmcvbWVkaXVtc2xhdGVibHVlAC9zdmcvZGFya3NsYXRlYmx1ZQAvc3ZnL3NsYXRlYmx1ZQAvc3ZnL2FsaWNlYmx1ZQAvc3ZnL2JsdWUAY2FsbFN0b3JlRW50aXR5VmFsdWUAc3RvcmVBdHRyaWJ1dGVWYWx1ZQBCbHVlAG5lYXRvX2VucXVldWUAVHVlAHlhY3V0ZQB1YWN1dGUAb2FjdXRlAGlhY3V0ZQBlYWN1dGUAYWFjdXRlAFlhY3V0ZQBVYWN1dGUAT2FjdXRlAElhY3V0ZQBFYWN1dGUAQWFjdXRlAHJlZmVyZW5jZSB0byBleHRlcm5hbCBlbnRpdHkgaW4gYXR0cmlidXRlAGR1cGxpY2F0ZSBhdHRyaWJ1dGUAbm90ZQBwcmltZXJzaXRlAHJpYm9zaXRlAHJlc3RyaWN0aW9uc2l0ZQBwcm90ZWFzZXNpdGUAL3N2Zy9naG9zdHdoaXRlAC9zdmcvbmF2YWpvd2hpdGUAL3N2Zy9mbG9yYWx3aGl0ZQAvc3ZnL2FudGlxdWV3aGl0ZQAvc3ZnL3doaXRlAFdoaXRlAHBvcF9vYmpfc3RhdGUAcGNwX3JvdGF0ZQBjb25jZW50cmF0ZQBkZWNvcmF0ZQBRdWFkVHJlZV9yZXB1bHNpdmVfZm9yY2VfYWNjdW11bGF0ZQBub3RyYW5zbGF0ZQAvc3ZnL2Nob2NvbGF0ZQBwYXJzZXJDcmVhdGUAZ2VvbVVwZGF0ZQBpbnZob3VzZQAvc3ZnL2NoYXJ0cmV1c2UAWE1MX1BhcnNlADxlbGxpcHNlAGR1c3R5cm9zZQAvc3ZnL21pc3R5cm9zZQBTcGFyc2VNYXRyaXhfdHJhbnNwb3NlAGx1X2RlY29tcG9zZQBhZ2Nsb3NlAGVudGl0eVRyYWNraW5nT25DbG9zZQBTcGFyc2VNYXRyaXhfbXVsdGlwbHlfZGVuc2UAZmFsc2UAL3N2Zy9tZWRpdW10dXJxdW9pc2UAL3N2Zy9kYXJrdHVycXVvaXNlAC9zdmcvcGFsZXR1cnF1b2lzZQAvc3ZnL3R1cnF1b2lzZQBwaGFzZQBTSVpFX01BWCAtIHJvb3RQYXJzZXItPm1fYWxsb2NfdHJhY2tlci5ieXRlc0FsbG9jYXRlZCA+PSBpbmNyZWFzZQBzbG90X2Zyb21fYmFzZQAvc3ZnL2F6dXJlAHNpZ25hdHVyZQBtb3JlX2NvcmUATXNxdWFyZQBQYWxhdGlubyBMaW5vdHlwZQBBLT50eXBlID09IEItPnR5cGUAc3VwZQBlbGxpcHNlX3RhbmdlbnRfc2xvcGUAZ3ZyZW5kZXJfdXNlcnNoYXBlAG1pdGVyX3NoYXBlAGxhbmRzY2FwZQBMYW5kc2NhcGUASnVuZQBub25lAGRvY3VtZW50IGlzIG5vdCBzdGFuZGFsb25lAGNvdXNpbmUAL3N2Zy9tZWRpdW1hcXVhbWFyaW5lAC9zdmcvYXF1YW1hcmluZQA8cG9seWxpbmUAJXNvdmVybGluZQB1bmRlcmxpbmUAcmVhbGx5cm91dGVzcGxpbmUAUHJvdXRlc3BsaW5lAGxpbmVhcl9zcGxpbmUAYl9zcGxpbmUAb2xpbmUAYWd4YnVmX2lzX2lubGluZQBzdmdfaW5saW5lAHJlZmluZQBwcmltZQBQcmltZQAvc3ZnL2xpbWUAY29sb3JzY2hlbWUAbGFiZWxfc2NoZW1lAHNhbWUAbGFiZWxmb250bmFtZQBVRl9zZXRuYW1lAGZvbnRfbmFtZQBmb250LT5uYW1lAHVzLT5uYW1lAHJlc2VydmVkIHByZWZpeCAoeG1sKSBtdXN0IG5vdCBiZSB1bmRlY2xhcmVkIG9yIGJvdW5kIHRvIGFub3RoZXIgbmFtZXNwYWNlIG5hbWUAc3R5bGUAL3N2Zy90aGlzdGxlAHRpdGxlAC9zdmcvbWVkaXVtcHVycGxlAGRhcmtwdXJwbGUAd2VicHVycGxlAHJlYmVjY2FwdXJwbGUAdmVyeV9saWdodF9wdXJwbGUAbWVkX3B1cnBsZQB4MTFwdXJwbGUAL3N2Zy9wdXJwbGUAc2hhcGVmaWxlAGdyYWRpZW50YW5nbGUAcmVjdGFuZ2xlAFJlY3RhbmdsZQBsYWJlbGFuZ2xlAGludnRyaWFuZ2xlAGRlc3RpbmF0aW9uIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAc291cmNlIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAZGZzQ3ljbGUAZG91YmxlY2lyY2xlAE1jaXJjbGUAaW52aXNpYmxlAGV4cGF0X2hlYXBfaW5jcmVhc2VfdG9sZXJhYmxlAHRob3JuZGFsZQBpbnB1dHNjYWxlAG9zY2FsZQBpbWFnZXNjYWxlAC9zdmcvd2hpdGVzbW9rZQBtYW5kYXJpbm9yYW5nZQAvc3ZnL2RhcmtvcmFuZ2UAL3N2Zy9vcmFuZ2UAZXhjaGFuZ2UAL3N2Zy9iZWlnZQBuZXdlZGdlAGRlbGV0ZV9mYXN0X2VkZ2UAZGVsZXRlX2ZsYXRfZWRnZQBhZGRfdHJlZV9lZGdlAHBhdGNod29ya19pbml0X25vZGVfZWRnZQB0d29waV9pbml0X25vZGVfZWRnZQBtYWtlU3RyYWlnaHRFZGdlAG1ha2VTZWxmRWRnZQBtYWtlQ29tcG91bmRFZGdlACF1c2Vfc3RhZ2UAb3NhZ2UAcGFnZQBndmxvYWRpbWFnZQB2ZWUAdGVlAFFVQURfVFJFRV9IWUJSSUQsIHNpemUgbGFyZ2VyIHRoYW4gJWQsIHN3aXRjaCB0byBmYXN0IHF1YWR0cmVlAGZlYXNpYmxlX3RyZWUAbm9kZV9zZXRfZnJlZQBleHBhdF9mcmVlAGd2X2FyZW5hX2ZyZWUAbmV3bm9kZQBpbnN0YWxsbm9kZQBhZ25vZGUAZGVsZXRlX2Zhc3Rfbm9kZQBwYWNrbW9kZQBTcGxpdE5vZGUAb3RpbGRlAG50aWxkZQBhdGlsZGUAT3RpbGRlAE50aWxkZQBBdGlsZGUAZGl2aWRlAHRyYWRlAGdyYXBodml6X25vZGVfaW5kdWNlAHNvdXJjZQByZXB1bHNpdmVmb3JjZQBpbGxlZ2FsIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlAGVycm9yIGluIHByb2Nlc3NpbmcgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZQByZWN1cnNpdmUgZW50aXR5IHJlZmVyZW5jZQBsYWJlbGRpc3RhbmNlAFRCX2JhbGFuY2UAVEJiYWxhbmNlAGRldmljZQBtb25vc3BhY2UAL3N2Zy9vbGRsYWNlAGZhY2UAc3ViZQAgLWFuY2hvciBlAHMxLT5jb21tX2Nvb3JkPT1zMi0+Y29tbV9jb29yZABNcmVjb3JkAGZvcndhcmQAcHJvZABsaWdodGdvbGRlbnJvZABtZWRpdW1nb2xkZW5yb2QAL3N2Zy9kYXJrZ29sZGVucm9kAC9zdmcvcGFsZWdvbGRlbnJvZAAvc3ZnL2dvbGRlbnJvZAAvc3ZnL2J1cmx5d29vZABsaWdodHdvb2QAbWVkaXVtd29vZABkYXJrd29vZABfYmFja2dyb3VuZABjb21wb3VuZABubyBlbGVtZW50IGZvdW5kAGZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tbm8gYWN0aW9uIGZvdW5kAC9zdmcvYmxhbmNoZWRhbG1vbmQAYXJyb3dfbGVuZ3RoX2RpYW1vbmQATWRpYW1vbmQAbm9kZV9zZXRfZmluZABzdHJkaWN0X2ZpbmQAZ3Z1c2Vyc2hhcGVfZmluZABFTGxlZnRibmQAZXhwYW5kAGN1bWJlcmxhbmQAYnJpZ2h0Z29sZABvbGRnb2xkAC9zdmcvZ29sZABib2xkAEhlbHZldGljYS1OYXJyb3ctQm9sZABUaW1lcy1Cb2xkAENvdXJpZXItQm9sZABQYWxhdGluby1Cb2xkAE5ld0NlbnR1cnlTY2hsYmstQm9sZABIZWx2ZXRpY2EtQm9sZAAlMCpsbGQAJSpsbGQAKyVsbGQAbi0+YnJhbmNoW2ldLmNoaWxkACUrLjRsZAAlcyVsZABzb2xpZAAvc3ZnL21lZGl1bW9yY2hpZAAvc3ZnL2RhcmtvcmNoaWQAL3N2Zy9vcmNoaWQAaWxsZWdhbCBjaGFyYWN0ZXIocykgaW4gcHVibGljIGlkAGRpamtzdHJhX3NnZABmaXhlZABjdXJ2ZWQAZGVyaXZlZABkb3R0ZWQAbWVtb3J5IGV4aGF1c3RlZABsb2NhbGUgbm90IHN1cHBvcnRlZABwYXJzaW5nIGFib3J0ZWQAcGFyc2VyIG5vdCBzdGFydGVkAGF0dHJpYnV0ZSBtYWNyb3Mgbm90IGltcGxlbWVudGVkAGFjY291bnRpbmdEaWZmVG9sZXJhdGVkAHJvb3RQYXJzZXItPm1fYWxsb2NfdHJhY2tlci5ieXRlc0FsbG9jYXRlZCA+PSBieXRlc0FsbG9jYXRlZABmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkAGNvbmRlbnNlZAAvc3ZnL21lZGl1bXZpb2xldHJlZAAvc3ZnL3BhbGV2aW9sZXRyZWQASW1wcm9wZXIgJXMgdmFsdWUgJXMgLSBpZ25vcmVkACVzIHZhbHVlICVzIDwgJWQgLSB0b28gc21hbGwgLSBpZ25vcmVkACVzIHZhbHVlICVzID4gJWQgLSB0b28gbGFyZ2UgLSBpZ25vcmVkAC9zdmcvaW5kaWFucmVkAC9zdmcvZGFya3JlZABhIHN1Y2Nlc3NmdWwgcHJpb3IgY2FsbCB0byBmdW5jdGlvbiBYTUxfR2V0QnVmZmVyIGlzIHJlcXVpcmVkAHRhcGVyZWQAL3N2Zy9vcmFuZ2VyZWQAcmVzZXJ2ZWQgcHJlZml4ICh4bWxucykgbXVzdCBub3QgYmUgZGVjbGFyZWQgb3IgdW5kZWNsYXJlZAAvc3ZnL3JlZABzdHJpcGVkAGlsbC1jb25kaXRpb25lZAB1bmRlZmluZWQAbm90IGNvbnN0cmFpbmVkAGxhYmVsYWxpZ25lZAB0ZXh0IGRlY2xhcmF0aW9uIG5vdCB3ZWxsLWZvcm1lZABYTUwgZGVjbGFyYXRpb24gbm90IHdlbGwtZm9ybWVkAHVuZmlsbGVkAGlucHV0IGluIGZsZXggc2Nhbm5lciBmYWlsZWQAdHJpYW5ndWxhdGlvbiBmYWlsZWQAcGFyc2luZyBmaW5pc2hlZABkYXNoZWQAbGltaXQgb24gaW5wdXQgYW1wbGlmaWNhdGlvbiBmYWN0b3IgKGZyb20gRFREIGFuZCBlbnRpdGllcykgYnJlYWNoZWQAd2VkZ2VkAHNpemUgPT0gZnJlZWQAcm91bmRlZABzcGxpbmUgWyUuMDNmLCAlLjAzZl0gLS0gWyUuMDNmLCAlLjAzZl0gaXMgaG9yaXpvbnRhbDsgd2lsbCBiZSB0cml2aWFsbHkgYm91bmRlZABzcGxpbmUgWyUuMDNmLCAlLjAzZl0gLS0gWyUuMDNmLCAlLjAzZl0gaXMgdmVydGljYWw7IHdpbGwgYmUgdHJpdmlhbGx5IGJvdW5kZWQAcGFyc2VyIG5vdCBzdXNwZW5kZWQAcGFyc2VyIHN1c3BlbmRlZABXZWQAUmVkAFNwYXJzZU1hdHJpeF9hZGQAbm9kZV9zZXRfYWRkAHN0cmRpY3RfYWRkAGRkICE9IHBhcmVudF9kZABLUF9BZGQAcGFkAHhsaGR4bG9hZAB4bGhkeHVubG9hZAByZWFkAGFycm93aGVhZABsaGVhZABzYW1laGVhZABib3gzZAAlc18lZABfc3Bhbl8lZABfYmxvY2tfJWQAX3dlYWtfJWQAX2Nsb25lXyVkAC4lZAAlWS0lbS0lZAAlbGYsJWQAJXMgaW4gbGluZSAlZAAlJSUlQm91bmRpbmdCb3g6ICVkICVkICVkICVkACJfc3ViZ3JhcGhfY250IjogJWQAIl9ndmlkIjogJWQAImhlYWQiOiAlZABhZ3hicHV0YwB2cHNjAGNwLT5zcmMAdWNpcmMAb2NpcmMAaWNpcmMAZWNpcmMAYWNpcmMAVWNpcmMAT2NpcmMASWNpcmMARWNpcmMAQWNpcmMAcGMAbGFiZWxsb2MAZXhwYXRfbWFsbG9jAGV4cGF0X3JlYWxsb2MAZ3ZfcmVjYWxsb2MAc3RkOjpiYWRfYWxsb2MAZ3ZfYXJlbmFfYWxsb2MAYmFrZXJzY2hvYwBzZW1pU3dlZXRDaG9jAG1jAFNwYXJzZU1hdHJpeF9pc19zeW1tZXRyaWMAQS0+aXNfcGF0dGVybl9zeW1tZXRyaWMAcGljOnBpYwBpdGFsaWMAQm9va21hbi1MaWdodEl0YWxpYwBaYXBmQ2hhbmNlcnktTWVkaXVtSXRhbGljAEJvb2ttYW4tRGVtaUl0YWxpYwBUaW1lcy1Cb2xkSXRhbGljAFBhbGF0aW5vLUJvbGRJdGFsaWMATmV3Q2VudHVyeVNjaGxiay1Cb2xkSXRhbGljAFRpbWVzLUl0YWxpYwBQYWxhdGluby1JdGFsaWMATmV3Q2VudHVyeVNjaGxiay1JdGFsaWMAcmFkaWMAI2ZjZmNmYwByb3V0ZXNwbGluZXM6ICVkIGVkZ2VzLCAlenUgYm94ZXMgJS4yZiBzZWMAOiAlLjJmIHNlYwBsaXN0ZGVscmVjAGxldmVsIGdyYXBoIHJlYwBsZXZlbCBlZGdlIHJlYwBsZXZlbCBub2RlIHJlYwBEZWMAX25lYXRvX2NjAGJjAHZpc2liaWxpdHkuYwBTcGFyc2VNYXRyaXguYwBodG1sbGV4LmMAaW5kZXguYwBzbWFydF9pbmlfeC5jAGd2cmVuZGVyX2NvcmVfcG92LmMAbHUuYwBjdnQuYwBsYXlvdXQuYwB0ZXh0c3Bhbl9sdXQuYwBhZGp1c3QuYwBub2RlbGlzdC5jAHNob3J0ZXN0LmMAY2xvc2VzdC5jAGd2cmVuZGVyX2NvcmVfZG90LmMAY29uc3RyYWludC5jAGRvdGluaXQuYwBuZWF0b2luaXQuYwBwYXRjaHdvcmtpbml0LmMAdHdvcGlpbml0LmMAb3NhZ2Vpbml0LmMAZW1pdC5jAGZsYXQuYwBhcnJvd3MuYwBtaW5jcm9zcy5jAHN0cmVzcy5jAHBvc3RfcHJvY2Vzcy5jAGNjb21wcy5jAG5zLmMAdXRpbHMuYwB4bGFiZWxzLmMAc2hhcGVzLmMAZG90c3BsaW5lcy5jAG5lYXRvc3BsaW5lcy5jAGNsdXN0ZXJlZGdlcy5jAGhlZGdlcy5jAGF0dHIuYwByZWZzdHIuYwBmYXN0Z3IuYwBjbHVzdGVyLmMAdGFwZXIuYwBndnJlbmRlci5jAHNwbGl0LnEuYwBjb21wLmMAZ3ZyZW5kZXJfY29yZV9tYXAuYwBoZWFwLmMAb3J0aG8uYwBndnJlbmRlcl9jb3JlX2pzb24uYwBwYXJ0aXRpb24uYwBwb3NpdGlvbi5jAGd2X2ZvcGVuLmMAdGV4dHNwYW4uYwBnZW9tLmMAcmFuZG9tLmMAcm91dGVzcGwuYwB4bWwuYwBNdWx0aWxldmVsLmMAc3ByaW5nX2VsZWN0cmljYWwuYwBndnJlbmRlcl9jb3JlX3RrLmMAcmFuay5jAHBhY2suYwBkdHN0cmhhc2guYwBncmFwaC5jAGd2cmVuZGVyX2NvcmVfc3ZnLmMAZ3ZyZW5kZXJfY29yZV9maWcuYwBzdHVmZi5jAG1hemUuYwBzcGFyc2Vfc29sdmUuYwByb3V0ZS5jAHdyaXRlLmMAY29seGxhdGUuYwB4bWxwYXJzZS5jAGd2bG9hZGltYWdlX2NvcmUuYwBndnVzZXJzaGFwZS5jAGNpcmNsZS5jAGh0bWx0YWJsZS5jAGVkZ2UuYwBndmxvYWRpbWFnZS5jAGJsb2NrdHJlZS5jAFF1YWRUcmVlLmMAbm9kZS5jAG5vZGVfaW5kdWNlLmMAZ3ZkZXZpY2UuYwBjb21wb3VuZC5jAHRyYXBlem9pZC5jAHNnZC5jAGNvbmMuYwByZWMuYwBkaWprc3RyYS5jAGFyZW5hLmMAZlBRLmMAY2xhc3MyLmMAJWxmLCVsZiwlbGYsJWxmJWMAJWxmLCVsZiwlbGYsJVteLF0lYwBcJWMAJGMAd2IAbnN1YgBzZXRoc2IAcmIAcHJvdGVjdF9yc3FiAGpvYgBjb3JlX2xvYWRpbWFnZV9wc2xpYgBGZWIAb2RiAGluaXRfc3BsaW5lc19iYgBiZXppZXJfYmIAcHJvdGVpbnN0YWIAcm5hc3RhYgAvc3ZnL29saXZlZHJhYgBcYgByd2EAL3N2Zy9hcXVhAGlvdGEASW90YQAvc3ZnL2RhcmttYWdlbnRhAC9zdmcvbWFnZW50YQBkZWx0YQBEZWx0YQB6ZXRhAHRoZXRhAFRoZXRhAGJldGEAWmV0YQBCZXRhAHByZXYgIT0gb2JqLT5kYXRhAG1ha2VHcmFwaERhdGEARXRhAG5pbWJ1c3NhbnNhAHBhcmEAa2FwcGEAS2FwcGEAL3N2Zy9zaWVubmEAVmVyZGFuYQBnYW1tYQBHYW1tYQBzaWdtYQBTaWdtYQBjb25zb2xhAG5hYmxhAC9zdmcvZnVjaHNpYQBHZW9yZ2lhAGFscGhhAEFscGhhAG9tZWdhAE9tZWdhAGFyZWEAbGFtYmRhAExhbWJkYQBoZWx2ZXRpY2EASGVsdmV0aWNhAG1pY2EAPjxhAGAAU3BhcnNlTWF0cml4X2Nvb3JkaW5hdGVfZm9ybV9hZGRfZW50cnlfAGd2X2xpc3RfY29weV8AX3RkcmF3XwBfdGxkcmF3XwBfaGxkcmF3XwBfbGRyYXdfAF9oZHJhd18AX2RyYXdfAGd2X2xpc3Rfc29ydF8AZ3ZfbGlzdF9hcHBlbmRfc2xvdF8AZ3ZfbGlzdF9wcmVwZW5kX3Nsb3RfAGd2X2xpc3RfcG9wX2Zyb250XwBndl9saXN0X3Nocmlua190b19maXRfAGFneHNldF8AZ3ZfbGlzdF9nZXRfAGRvdF9zcGxpbmVzXwAlc18AZ3ZfbGlzdF9jbGVhcl8AZ3ZfbGlzdF9wb3BfYmFja18AZ3ZfbGlzdF9kZXRhY2hfAGd2X2xpc3RfcmVtb3ZlXwBndl9saXN0X3JldmVyc2VfAGd2X2xpc3RfZnJlZV8AZ3ZfbGlzdF90cnlfYXBwZW5kXwBwYWdlJWQsJWRfAGd2X2xpc3Rfc3luY18AX2NjXwAgaWQ9ImFfAF4AU3RhcnRpbmcgcGhhc2UgMiBbZG90X21pbmNyb3NzXQBTdGFydGluZyBwaGFzZSAzIFtkb3RfcG9zaXRpb25dAG5fZWRnZXMgPT0gZ3JhcGgtPnNvdXJjZXNbZ3JhcGgtPm5dAFN0YXJ0aW5nIHBoYXNlIDEgW2RvdF9yYW5rXQBqZFttYXNrW2pjW2tdXV0gPT0gamNba10AamNbbWFza1tqYltrXV1dID09IGpiW2tdAG5lZWRsZVtpXSAhPSBuZWVkbGVbal0AamFbbWFza1tqYVtqXV1dID09IGphW2pdAHEtPnF0c1tpaV0AIXJ0cC0+c3BsaXQuUGFydGl0aW9uc1swXS50YWtlbltpXQByLmJvdW5kYXJ5W2ldIDw9IHIuYm91bmRhcnlbTlVNRElNUyArIGldAFslLjAzZiwlLjAzZl0AW2ludGVybmFsIGhhcmQtY29kZWRdAG5wLT5jZWxsc1sxXQBucC0+Y2VsbHNbMF0AdXMtPm5hbWVbMF0AY3AtPnNyY1swXQBbLi5dAFxcACJwb2ludHMiOiBbACJzdG9wcyI6IFsACVsAWgBjb21wdXRlU2NhbGVYWQB5PD1ZACVhICViICVkICVIOiVNOiVTICVZAFBPU0lYAG56IDw9IElOVF9NQVgAeSA+PSBJTlRfTUlOICYmIHkgPD0gSU5UX01BWAB4ID49IElOVF9NSU4gJiYgeCA8PSBJTlRfTUFYAHcgPj0gMCAmJiB3IDw9IElOVF9NQVgAZV9jbnQgPD0gSU5UX01BWABwYWlyLnJpZ2h0IDw9IElOVF9NQVgAcGFpci5sZWZ0IDw9IElOVF9NQVgAdGFyZ2V0IDw9IElOVF9NQVgAbnNlZ3MgPD0gSU5UX01BWABuX2VkZ2VzIDw9IElOVF9NQVgAc3RwLm52ZXJ0aWNlcyA8PSBJTlRfTUFYAG9ic1twb2x5X2ldLT5wbiA8PSBJTlRfTUFYAGlucHV0X3JvdXRlLnBuIDw9IElOVF9NQVgAZ3JhcGgtPm4gPD0gSU5UX01BWABoID49IDAgJiYgaCA8PSBJTlRfTUFYAGVfY250IC0gMSA8PSBJTlRfTUFYAExJU1RfU0laRSgmbGlzdCkgLSAxIDw9IElOVF9NQVgATElTVF9TSVpFKCZsYXllcklEcykgLSAxIDw9IElOVF9NQVgAc3RybGVuKGFyZ3MpIDw9IElOVF9NQVgATElTVF9TSVpFKCZvYmpsKSA8PSBJTlRfTUFYAExJU1RfU0laRSgmY3R4LT5UcmVlX2VkZ2UpIDw9IElOVF9NQVgAbm9kZV9zZXRfc2l6ZShnLT5uX2lkKSA8PSBJTlRfTUFYAGkgPCBJTlRfTUFYAHJlc3VsdCA8PSAoaW50KVVDSEFSX01BWABzc3ogPD0gVUNIQVJfTUFYAGNvbCA+PSAwICYmIGNvbCA8PSBVSU5UMTZfTUFYAHg8PVgAVwBWAFUAXFQAVEVYVABTVFJFU1NfTUFKT1JJWkFUSU9OX1BPV0VSX0RJU1QAU1RSRVNTX01BSk9SSVpBVElPTl9HUkFQSF9ESVNUAFNUUkVTU19NQUpPUklaQVRJT05fQVZHX0RJU1QARkFTVABGT05UAGIgPT0gQl9SSUdIVABIRUlHSFQAQl9MRUZUAF8lbGx1X1NVU1BFQ1QAQlQAVHJlYnVjaGV0IE1TAElOVklTACVIOiVNOiVTAFZSAFRSAEEtPmZvcm1hdCA9PSBCLT5mb3JtYXQgJiYgQS0+Zm9ybWF0ID09IEZPUk1BVF9DU1IATFIARElSAEhSAENFTlRFUgAlJVRSQUlMRVIAQS0+dHlwZSA9PSBNQVRSSVhfVFlQRV9SRUFMIHx8IEEtPnR5cGUgPT0gTUFUUklYX1RZUEVfSU5URUdFUgBDRUxMQk9SREVSAEJSACpSAFEARVhQAEJfVVAAU1VQAFRPUABPAG1hcE4AXE4AQl9ET1dOAFRIT1JOACUlQkVHSU4AUk9XU1BBTgBDT0xTUEFOAE5BTgBQTQBCT1RUT00AQk0AQU0AJUg6JU0AXEwAdGFpbFVSTABsYWJlbFVSTABlZGdlVVJMAGhlYWRVUkwASFRNTAB4IT1OVUxMAHJvb3RQYXJzZXItPm1fcGFyZW50UGFyc2VyID09IE5VTEwARURfdG9fdmlydChvcmlnKSA9PSBOVUxMAEVEX3RvX3ZpcnQoZSkgPT0gTlVMTABwcmVmaXggIT0gTlVMTABkdGQtPnNjYWZmSW5kZXggIT0gTlVMTABzbS0+THcgIT0gTlVMTABsdSAhPSBOVUxMAGlucHV0ICE9IE5VTEwAbGlzdCAhPSBOVUxMAHJlZmVyZW50ICE9IE5VTEwAZGljdCAhPSBOVUxMAGRpY3QtPmJ1Y2tldHMgIT0gTlVMTABhdHRyICE9IE5VTEwAYWxsb2NhdG9yICE9IE5VTEwAcGFyc2VyICE9IE5VTEwAcm9vdFBhcnNlciAhPSBOVUxMAGxlYWRlciAhPSBOVUxMAGNtcCAhPSBOVUxMAGRhdGFwICE9IE5VTEwAaW50byAhPSBOVUxMAGl0ZW0gIT0gTlVMTABvcnRob2cgIT0gTlVMTABzZWxmICE9IE5VTEwAdmFsdWUgIT0gTlVMTABmaWxlbmFtZSAhPSBOVUxMAGpvYi0+b3V0cHV0X2ZpbGUgIT0gTlVMTABtb2RlICE9IE5VTEwAeGQgIT0gTlVMTABzbS0+THdkICE9IE5VTEwAam9iICE9IE5VTEwAc291cmNlLmRhdGEgIT0gTlVMTABiLmRhdGEgIT0gTlVMTABhLmRhdGEgIT0gTlVMTABhcmVuYSAhPSBOVUxMAGxpc3QgJiYgbGlzdFswXSAhPSBOVUxMAEFGICE9IE5VTEwAc20tPkQgIT0gTlVMTABFRF90b192aXJ0KG9yaWcpICE9IE5VTEwATENfQUxMAEJMAGJlc3Rjb3N0IDwgSFVHRV9WQUwATk9STUFMAFJBRElBTABBLT50eXBlID09IE1BVFJJWF9UWVBFX1JFQUwAVVJXIENoYW5jZXJ5IEwAVVJXIEJvb2ttYW4gTABDZW50dXJ5IFNjaG9vbGJvb2sgTABVUlcgR290aGljIEwAS0sASgBpIDwgTUFYX0kAUC0+ZW5kLnRoZXRhIDwgMiAqIE1fUEkAQVNDSUkAXEgARVRIAFdJRFRIAERPVEZPTlRQQVRIAEdERk9OVFBBVEgAbWtOQ29uc3RyYWludEcAXEcARVhQQVRfRU5USVRZX0RFQlVHAEVYUEFUX0VOVFJPUFlfREVCVUcARVhQQVRfQUNDT1VOVElOR19ERUJVRwBFWFBBVF9NQUxMT0NfREVCVUcAUk5HAFNQUklORwBDRUxMUEFERElORwBDRUxMU1BBQ0lORwBMQU5HAElNRwBceEYAJSVFT0YASU5GAFx4RkYAUklGRgBkZWx0YSA8PSAweEZGRkYAXHhFRgBceERGAFx4Q0YAXHhCRgBceEFGAFx4OUYAXHg4RgBceDdGAFx4MUYAXHhFAFxFAFBPSU5ULVNJWkUAVFJVRQBDTE9TRQBGQUxTRQBrZXkgIT0gVE9NQlNUT05FAHIgIT0gVE9NQlNUT05FAE5PTkUAR1JBRElFTlRBTkdMRQBUUklBTkdMRQBNSURETEUASU5WSVNJQkxFAFRBQkxFAEFHVFlQRShvYmopID09IEFHSU5FREdFIHx8IEFHVFlQRShvYmopID09IEFHT1VURURHRQBceEZFAFx4RUUAXHhERQBCX05PREUAXHhDRQBceEJFAFx4QUUAXHg5RQBceDhFAFx4MUUAVEQAQS0+Zm9ybWF0ID09IEZPUk1BVF9DT09SRABuICYmIGkgPj0gMCAmJiBpIDwgTk9ERUNBUkQAJSVFTkQASFlCUklEAFNPTElEAFx4RkQAXHhFRABET1RURUQAREFTSEVEAFJPVU5ERUQAXHhERABceENEAFx4QkQAXHhBRABceDlEAFx4OEQAXHgxRABceEMAZGVsZXRlVlBTQwBceEZDAFx4RUMAXHhEQwBceENDAFx4QkMAXHhBQwBceDlDAFx4OEMAXHgxQwBceEIAU1VCAFx4RkIAXHhFQgBceERCAFx4Q0IAXHhCQgBceEFCAFx4OUIAXHg4QgBceDFCAEEgJiYgQgBceEZBAFx4RUEAXHhEQQBceENBAFx4QkEAXHhBQQBceDlBAFx4OEEAXHgxQQBAAD8APCVzPgA8bmlsPgA8L3RzcGFuPjwvdGV4dFBhdGg+AAogICAgPCU5LjNmLCAlOS4zZiwgJTkuM2Y+AD4KPHRpdGxlPgA8Rk9OVD4APEJSPgA8SFRNTD4APC9IVE1MPgA8SU1HPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBiZWZvcmUgPFRBQkxFPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBhZnRlciA8L1RBQkxFPgA8VEQ+AC0+ACI+AAlba2V5PQA8PQA8ACYjeCV4OwAmcXVvdDsAJmx0OwAmZ3Q7ACZhbXA7ACMlZDsAJiMzOTsAJiM0NTsAJiM5MzsAJiMxMzsAJiMxNjA7ACYjMTA7ADtzdG9wLW9wYWNpdHk6ACUlQm91bmRpbmdCb3g6AGNhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzIGFuZCBzZXR0aW5nIHVwIHN0cmVzcyB0ZXJtczoAPHN0b3Agb2Zmc2V0PSIlLjAzZiIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6AHNvbHZpbmcgbW9kZWw6AC9cOgBncmV5OQBncmF5OQBceEY5AFx4RTkAXHhEOQBceEM5AFx4QjkAXHhBOQBncmV5OTkAZ3JheTk5AFx4OTkAZ3JleTg5AGdyYXk4OQBceDg5ADAxMjM0NTY3ODkAZ3JleTc5AGdyYXk3OQBncmV5NjkAZ3JheTY5AGdyZXk1OQBncmF5NTkAZ3JleTQ5AGdyYXk0OQBncmV5MzkAZ3JheTM5AGdyZXkyOQBncmF5MjkAZ3JleTE5AGdyYXkxOQBceDE5AC9yZGd5OS85AC9idXB1OS85AC9yZHB1OS85AC9wdWJ1OS85AC95bGduYnU5LzkAL2duYnU5LzkAL3JkeWxidTkvOQAvcmRidTkvOQAvZ3JleXM5LzkAL2dyZWVuczkvOQAvYmx1ZXM5LzkAL3B1cnBsZXM5LzkAL29yYW5nZXM5LzkAL3JlZHM5LzkAL3B1b3I5LzkAL3lsb3JicjkvOQAvcHVidWduOS85AC9idWduOS85AC9wcmduOS85AC9yZHlsZ245LzkAL3lsZ245LzkAL3NwZWN0cmFsOS85AC9waXlnOS85AC9icmJnOS85AC9wdXJkOS85AC95bG9ycmQ5LzkAL29ycmQ5LzkAL3BhaXJlZDkvOQAvc2V0MzkvOQAvc2V0MTkvOQAvcGFzdGVsMTkvOQAvcGFpcmVkMTIvOQAvc2V0MzEyLzkAL3JkZ3kxMS85AC9yZHlsYnUxMS85AC9yZGJ1MTEvOQAvcHVvcjExLzkAL3ByZ24xMS85AC9yZHlsZ24xMS85AC9zcGVjdHJhbDExLzkAL3BpeWcxMS85AC9icmJnMTEvOQAvcGFpcmVkMTEvOQAvc2V0MzExLzkAL3JkZ3kxMC85AC9yZHlsYnUxMC85AC9yZGJ1MTAvOQAvcHVvcjEwLzkAL3ByZ24xMC85AC9yZHlsZ24xMC85AC9zcGVjdHJhbDEwLzkAL3BpeWcxMC85AC9icmJnMTAvOQAvcGFpcmVkMTAvOQAvc2V0MzEwLzkAZ3JleTgAZ3JheTgAXHg4AHV0ZjgAI2Y4ZjhmOAAjZThlOGU4AFx4RjgAR0lGOABceEU4AFx4RDgAXHhDOABceEI4AFx4QTgAZ3JleTk4AGdyYXk5OABceDk4AGdyZXk4OABncmF5ODgAXHg4OABncmV5NzgAZ3JheTc4AGdyZXk2OABncmF5NjgAZ3JleTU4AGdyYXk1OABncmV5NDgAZ3JheTQ4AGdyZXkzOABncmF5MzgAZ3JleTI4AGdyYXkyOABncmV5MTgAZ3JheTE4AFx4MTgAL3JkZ3k5LzgAL2J1cHU5LzgAL3JkcHU5LzgAL3B1YnU5LzgAL3lsZ25idTkvOAAvZ25idTkvOAAvcmR5bGJ1OS84AC9yZGJ1OS84AC9ncmV5czkvOAAvZ3JlZW5zOS84AC9ibHVlczkvOAAvcHVycGxlczkvOAAvb3JhbmdlczkvOAAvcmVkczkvOAAvcHVvcjkvOAAveWxvcmJyOS84AC9wdWJ1Z245LzgAL2J1Z245LzgAL3ByZ245LzgAL3JkeWxnbjkvOAAveWxnbjkvOAAvc3BlY3RyYWw5LzgAL3BpeWc5LzgAL2JyYmc5LzgAL3B1cmQ5LzgAL3lsb3JyZDkvOAAvb3JyZDkvOAAvcGFpcmVkOS84AC9zZXQzOS84AC9zZXQxOS84AC9wYXN0ZWwxOS84AC9yZGd5OC84AC9idXB1OC84AC9yZHB1OC84AC9wdWJ1OC84AC95bGduYnU4LzgAL2duYnU4LzgAL3JkeWxidTgvOAAvcmRidTgvOAAvYWNjZW50OC84AC9ncmV5czgvOAAvZ3JlZW5zOC84AC9ibHVlczgvOAAvcHVycGxlczgvOAAvb3JhbmdlczgvOAAvcmVkczgvOAAvcHVvcjgvOAAveWxvcmJyOC84AC9wdWJ1Z244LzgAL2J1Z244LzgAL3ByZ244LzgAL3JkeWxnbjgvOAAveWxnbjgvOAAvc3BlY3RyYWw4LzgAL3BpeWc4LzgAL2JyYmc4LzgAL3B1cmQ4LzgAL3lsb3JyZDgvOAAvb3JyZDgvOAAvcGFpcmVkOC84AC9zZXQzOC84AC9zZXQyOC84AC9wYXN0ZWwyOC84AC9kYXJrMjgvOAAvc2V0MTgvOAAvcGFzdGVsMTgvOAAvcGFpcmVkMTIvOAAvc2V0MzEyLzgAL3JkZ3kxMS84AC9yZHlsYnUxMS84AC9yZGJ1MTEvOAAvcHVvcjExLzgAL3ByZ24xMS84AC9yZHlsZ24xMS84AC9zcGVjdHJhbDExLzgAL3BpeWcxMS84AC9icmJnMTEvOAAvcGFpcmVkMTEvOAAvc2V0MzExLzgAL3JkZ3kxMC84AC9yZHlsYnUxMC84AC9yZGJ1MTAvOAAvcHVvcjEwLzgAL3ByZ24xMC84AC9yZHlsZ24xMC84AC9zcGVjdHJhbDEwLzgAL3BpeWcxMC84AC9icmJnMTAvOAAvcGFpcmVkMTAvOAAvc2V0MzEwLzgAdXRmLTgAQy5VVEYtOABncmV5NwBncmF5NwBceDcAXHhGNwBceEU3AFx4RDcAXHhDNwBceEI3AFx4QTcAZ3JleTk3AGdyYXk5NwBceDk3AGdyZXk4NwBncmF5ODcAXHg4NwBncmV5NzcAZ3JheTc3AGdyZXk2NwBncmF5NjcAZ3JleTU3AGdyYXk1NwBncmV5NDcAZ3JheTQ3AGdyZXkzNwBncmF5MzcAZ3JleTI3AGdyYXkyNwBncmV5MTcAZ3JheTE3AFx4MTcAL3JkZ3k5LzcAL2J1cHU5LzcAL3JkcHU5LzcAL3B1YnU5LzcAL3lsZ25idTkvNwAvZ25idTkvNwAvcmR5bGJ1OS83AC9yZGJ1OS83AC9ncmV5czkvNwAvZ3JlZW5zOS83AC9ibHVlczkvNwAvcHVycGxlczkvNwAvb3JhbmdlczkvNwAvcmVkczkvNwAvcHVvcjkvNwAveWxvcmJyOS83AC9wdWJ1Z245LzcAL2J1Z245LzcAL3ByZ245LzcAL3JkeWxnbjkvNwAveWxnbjkvNwAvc3BlY3RyYWw5LzcAL3BpeWc5LzcAL2JyYmc5LzcAL3B1cmQ5LzcAL3lsb3JyZDkvNwAvb3JyZDkvNwAvcGFpcmVkOS83AC9zZXQzOS83AC9zZXQxOS83AC9wYXN0ZWwxOS83AC9yZGd5OC83AC9idXB1OC83AC9yZHB1OC83AC9wdWJ1OC83AC95bGduYnU4LzcAL2duYnU4LzcAL3JkeWxidTgvNwAvcmRidTgvNwAvYWNjZW50OC83AC9ncmV5czgvNwAvZ3JlZW5zOC83AC9ibHVlczgvNwAvcHVycGxlczgvNwAvb3JhbmdlczgvNwAvcmVkczgvNwAvcHVvcjgvNwAveWxvcmJyOC83AC9wdWJ1Z244LzcAL2J1Z244LzcAL3ByZ244LzcAL3JkeWxnbjgvNwAveWxnbjgvNwAvc3BlY3RyYWw4LzcAL3BpeWc4LzcAL2JyYmc4LzcAL3B1cmQ4LzcAL3lsb3JyZDgvNwAvb3JyZDgvNwAvcGFpcmVkOC83AC9zZXQzOC83AC9zZXQyOC83AC9wYXN0ZWwyOC83AC9kYXJrMjgvNwAvc2V0MTgvNwAvcGFzdGVsMTgvNwAvcmRneTcvNwAvYnVwdTcvNwAvcmRwdTcvNwAvcHVidTcvNwAveWxnbmJ1Ny83AC9nbmJ1Ny83AC9yZHlsYnU3LzcAL3JkYnU3LzcAL2FjY2VudDcvNwAvZ3JleXM3LzcAL2dyZWVuczcvNwAvYmx1ZXM3LzcAL3B1cnBsZXM3LzcAL29yYW5nZXM3LzcAL3JlZHM3LzcAL3B1b3I3LzcAL3lsb3JicjcvNwAvcHVidWduNy83AC9idWduNy83AC9wcmduNy83AC9yZHlsZ243LzcAL3lsZ243LzcAL3NwZWN0cmFsNy83AC9waXlnNy83AC9icmJnNy83AC9wdXJkNy83AC95bG9ycmQ3LzcAL29ycmQ3LzcAL3BhaXJlZDcvNwAvc2V0MzcvNwAvc2V0MjcvNwAvcGFzdGVsMjcvNwAvZGFyazI3LzcAL3NldDE3LzcAL3Bhc3RlbDE3LzcAL3BhaXJlZDEyLzcAL3NldDMxMi83AC9yZGd5MTEvNwAvcmR5bGJ1MTEvNwAvcmRidTExLzcAL3B1b3IxMS83AC9wcmduMTEvNwAvcmR5bGduMTEvNwAvc3BlY3RyYWwxMS83AC9waXlnMTEvNwAvYnJiZzExLzcAL3BhaXJlZDExLzcAL3NldDMxMS83AC9yZGd5MTAvNwAvcmR5bGJ1MTAvNwAvcmRidTEwLzcAL3B1b3IxMC83AC9wcmduMTAvNwAvcmR5bGduMTAvNwAvc3BlY3RyYWwxMC83AC9waXlnMTAvNwAvYnJiZzEwLzcAL3BhaXJlZDEwLzcAL3NldDMxMC83ADEuNwBncmV5NgBncmF5NgBceDYAXHhGNgBceEU2AFx4RDYAXHhDNgBceEI2AFx4QTYAZ3JleTk2AGdyYXk5NgBceDk2AGdyZXk4NgBncmF5ODYAXHg4NgBncmV5NzYAZ3JheTc2AGdyZXk2NgBncmF5NjYAZ3JleTU2AGdyYXk1NgBncmV5NDYAZ3JheTQ2AGdyZXkzNgBncmF5MzYAZ3JleTI2AGdyYXkyNgBncmV5MTYAZ3JheTE2AFx4MTYAL3JkZ3k5LzYAL2J1cHU5LzYAL3JkcHU5LzYAL3B1YnU5LzYAL3lsZ25idTkvNgAvZ25idTkvNgAvcmR5bGJ1OS82AC9yZGJ1OS82AC9ncmV5czkvNgAvZ3JlZW5zOS82AC9ibHVlczkvNgAvcHVycGxlczkvNgAvb3JhbmdlczkvNgAvcmVkczkvNgAvcHVvcjkvNgAveWxvcmJyOS82AC9wdWJ1Z245LzYAL2J1Z245LzYAL3ByZ245LzYAL3JkeWxnbjkvNgAveWxnbjkvNgAvc3BlY3RyYWw5LzYAL3BpeWc5LzYAL2JyYmc5LzYAL3B1cmQ5LzYAL3lsb3JyZDkvNgAvb3JyZDkvNgAvcGFpcmVkOS82AC9zZXQzOS82AC9zZXQxOS82AC9wYXN0ZWwxOS82AC9yZGd5OC82AC9idXB1OC82AC9yZHB1OC82AC9wdWJ1OC82AC95bGduYnU4LzYAL2duYnU4LzYAL3JkeWxidTgvNgAvcmRidTgvNgAvYWNjZW50OC82AC9ncmV5czgvNgAvZ3JlZW5zOC82AC9ibHVlczgvNgAvcHVycGxlczgvNgAvb3JhbmdlczgvNgAvcmVkczgvNgAvcHVvcjgvNgAveWxvcmJyOC82AC9wdWJ1Z244LzYAL2J1Z244LzYAL3ByZ244LzYAL3JkeWxnbjgvNgAveWxnbjgvNgAvc3BlY3RyYWw4LzYAL3BpeWc4LzYAL2JyYmc4LzYAL3B1cmQ4LzYAL3lsb3JyZDgvNgAvb3JyZDgvNgAvcGFpcmVkOC82AC9zZXQzOC82AC9zZXQyOC82AC9wYXN0ZWwyOC82AC9kYXJrMjgvNgAvc2V0MTgvNgAvcGFzdGVsMTgvNgAvcmRneTcvNgAvYnVwdTcvNgAvcmRwdTcvNgAvcHVidTcvNgAveWxnbmJ1Ny82AC9nbmJ1Ny82AC9yZHlsYnU3LzYAL3JkYnU3LzYAL2FjY2VudDcvNgAvZ3JleXM3LzYAL2dyZWVuczcvNgAvYmx1ZXM3LzYAL3B1cnBsZXM3LzYAL29yYW5nZXM3LzYAL3JlZHM3LzYAL3B1b3I3LzYAL3lsb3JicjcvNgAvcHVidWduNy82AC9idWduNy82AC9wcmduNy82AC9yZHlsZ243LzYAL3lsZ243LzYAL3NwZWN0cmFsNy82AC9waXlnNy82AC9icmJnNy82AC9wdXJkNy82AC95bG9ycmQ3LzYAL29ycmQ3LzYAL3BhaXJlZDcvNgAvc2V0MzcvNgAvc2V0MjcvNgAvcGFzdGVsMjcvNgAvZGFyazI3LzYAL3NldDE3LzYAL3Bhc3RlbDE3LzYAL3JkZ3k2LzYAL2J1cHU2LzYAL3JkcHU2LzYAL3B1YnU2LzYAL3lsZ25idTYvNgAvZ25idTYvNgAvcmR5bGJ1Ni82AC9yZGJ1Ni82AC9hY2NlbnQ2LzYAL2dyZXlzNi82AC9ncmVlbnM2LzYAL2JsdWVzNi82AC9wdXJwbGVzNi82AC9vcmFuZ2VzNi82AC9yZWRzNi82AC9wdW9yNi82AC95bG9yYnI2LzYAL3B1YnVnbjYvNgAvYnVnbjYvNgAvcHJnbjYvNgAvcmR5bGduNi82AC95bGduNi82AC9zcGVjdHJhbDYvNgAvcGl5ZzYvNgAvYnJiZzYvNgAvcHVyZDYvNgAveWxvcnJkNi82AC9vcnJkNi82AC9wYWlyZWQ2LzYAL3NldDM2LzYAL3NldDI2LzYAL3Bhc3RlbDI2LzYAL2RhcmsyNi82AC9zZXQxNi82AC9wYXN0ZWwxNi82AC9wYWlyZWQxMi82AC9zZXQzMTIvNgAvcmRneTExLzYAL3JkeWxidTExLzYAL3JkYnUxMS82AC9wdW9yMTEvNgAvcHJnbjExLzYAL3JkeWxnbjExLzYAL3NwZWN0cmFsMTEvNgAvcGl5ZzExLzYAL2JyYmcxMS82AC9wYWlyZWQxMS82AC9zZXQzMTEvNgAvcmRneTEwLzYAL3JkeWxidTEwLzYAL3JkYnUxMC82AC9wdW9yMTAvNgAvcHJnbjEwLzYAL3JkeWxnbjEwLzYAL3NwZWN0cmFsMTAvNgAvcGl5ZzEwLzYAL2JyYmcxMC82AC9wYWlyZWQxMC82AC9zZXQzMTAvNgBncmV5NQBncmF5NQBceDUAYmlnNQBceEY1AFx4RTUAXHhENQBceEM1AFx4QjUAXHhBNQBncmV5OTUAZ3JheTk1AFx4OTUAZ3JleTg1AGdyYXk4NQBceDg1AGdyZXk3NQBncmF5NzUAZ3JleTY1AGdyYXk2NQBncmV5NTUAZ3JheTU1AGdyZXk0NQBncmF5NDUAZ3JleTM1AGdyYXkzNQBncmV5MjUAZ3JheTI1AGdyZXkxNQBncmF5MTUAXHgxNQBncmF5MDUAL3JkZ3k5LzUAL2J1cHU5LzUAL3JkcHU5LzUAL3B1YnU5LzUAL3lsZ25idTkvNQAvZ25idTkvNQAvcmR5bGJ1OS81AC9yZGJ1OS81AC9ncmV5czkvNQAvZ3JlZW5zOS81AC9ibHVlczkvNQAvcHVycGxlczkvNQAvb3JhbmdlczkvNQAvcmVkczkvNQAvcHVvcjkvNQAveWxvcmJyOS81AC9wdWJ1Z245LzUAL2J1Z245LzUAL3ByZ245LzUAL3JkeWxnbjkvNQAveWxnbjkvNQAvc3BlY3RyYWw5LzUAL3BpeWc5LzUAL2JyYmc5LzUAL3B1cmQ5LzUAL3lsb3JyZDkvNQAvb3JyZDkvNQAvcGFpcmVkOS81AC9zZXQzOS81AC9zZXQxOS81AC9wYXN0ZWwxOS81AC9yZGd5OC81AC9idXB1OC81AC9yZHB1OC81AC9wdWJ1OC81AC95bGduYnU4LzUAL2duYnU4LzUAL3JkeWxidTgvNQAvcmRidTgvNQAvYWNjZW50OC81AC9ncmV5czgvNQAvZ3JlZW5zOC81AC9ibHVlczgvNQAvcHVycGxlczgvNQAvb3JhbmdlczgvNQAvcmVkczgvNQAvcHVvcjgvNQAveWxvcmJyOC81AC9wdWJ1Z244LzUAL2J1Z244LzUAL3ByZ244LzUAL3JkeWxnbjgvNQAveWxnbjgvNQAvc3BlY3RyYWw4LzUAL3BpeWc4LzUAL2JyYmc4LzUAL3B1cmQ4LzUAL3lsb3JyZDgvNQAvb3JyZDgvNQAvcGFpcmVkOC81AC9zZXQzOC81AC9zZXQyOC81AC9wYXN0ZWwyOC81AC9kYXJrMjgvNQAvc2V0MTgvNQAvcGFzdGVsMTgvNQAvcmRneTcvNQAvYnVwdTcvNQAvcmRwdTcvNQAvcHVidTcvNQAveWxnbmJ1Ny81AC9nbmJ1Ny81AC9yZHlsYnU3LzUAL3JkYnU3LzUAL2FjY2VudDcvNQAvZ3JleXM3LzUAL2dyZWVuczcvNQAvYmx1ZXM3LzUAL3B1cnBsZXM3LzUAL29yYW5nZXM3LzUAL3JlZHM3LzUAL3B1b3I3LzUAL3lsb3JicjcvNQAvcHVidWduNy81AC9idWduNy81AC9wcmduNy81AC9yZHlsZ243LzUAL3lsZ243LzUAL3NwZWN0cmFsNy81AC9waXlnNy81AC9icmJnNy81AC9wdXJkNy81AC95bG9ycmQ3LzUAL29ycmQ3LzUAL3BhaXJlZDcvNQAvc2V0MzcvNQAvc2V0MjcvNQAvcGFzdGVsMjcvNQAvZGFyazI3LzUAL3NldDE3LzUAL3Bhc3RlbDE3LzUAL3JkZ3k2LzUAL2J1cHU2LzUAL3JkcHU2LzUAL3B1YnU2LzUAL3lsZ25idTYvNQAvZ25idTYvNQAvcmR5bGJ1Ni81AC9yZGJ1Ni81AC9hY2NlbnQ2LzUAL2dyZXlzNi81AC9ncmVlbnM2LzUAL2JsdWVzNi81AC9wdXJwbGVzNi81AC9vcmFuZ2VzNi81AC9yZWRzNi81AC9wdW9yNi81AC95bG9yYnI2LzUAL3B1YnVnbjYvNQAvYnVnbjYvNQAvcHJnbjYvNQAvcmR5bGduNi81AC95bGduNi81AC9zcGVjdHJhbDYvNQAvcGl5ZzYvNQAvYnJiZzYvNQAvcHVyZDYvNQAveWxvcnJkNi81AC9vcnJkNi81AC9wYWlyZWQ2LzUAL3NldDM2LzUAL3NldDI2LzUAL3Bhc3RlbDI2LzUAL2RhcmsyNi81AC9zZXQxNi81AC9wYXN0ZWwxNi81AC9yZGd5NS81AC9idXB1NS81AC9yZHB1NS81AC9wdWJ1NS81AC95bGduYnU1LzUAL2duYnU1LzUAL3JkeWxidTUvNQAvcmRidTUvNQAvYWNjZW50NS81AC9ncmV5czUvNQAvZ3JlZW5zNS81AC9ibHVlczUvNQAvcHVycGxlczUvNQAvb3JhbmdlczUvNQAvcmVkczUvNQAvcHVvcjUvNQAveWxvcmJyNS81AC9wdWJ1Z241LzUAL2J1Z241LzUAL3ByZ241LzUAL3JkeWxnbjUvNQAveWxnbjUvNQAvc3BlY3RyYWw1LzUAL3BpeWc1LzUAL2JyYmc1LzUAL3B1cmQ1LzUAL3lsb3JyZDUvNQAvb3JyZDUvNQAvcGFpcmVkNS81AC9zZXQzNS81AC9zZXQyNS81AC9wYXN0ZWwyNS81AC9kYXJrMjUvNQAvc2V0MTUvNQAvcGFzdGVsMTUvNQAvcGFpcmVkMTIvNQAvc2V0MzEyLzUAL3JkZ3kxMS81AC9yZHlsYnUxMS81AC9yZGJ1MTEvNQAvcHVvcjExLzUAL3ByZ24xMS81AC9yZHlsZ24xMS81AC9zcGVjdHJhbDExLzUAL3BpeWcxMS81AC9icmJnMTEvNQAvcGFpcmVkMTEvNQAvc2V0MzExLzUAL3JkZ3kxMC81AC9yZHlsYnUxMC81AC9yZGJ1MTAvNQAvcHVvcjEwLzUAL3ByZ24xMC81AC9yZHlsZ24xMC81AC9zcGVjdHJhbDEwLzUAL3BpeWcxMC81AC9icmJnMTAvNQAvcGFpcmVkMTAvNQAvc2V0MzEwLzUAYmlnLTUAQklHLTUAIC1kYXNoIDUAaXZvcnk0AGdyZXk0AGRhcmtzbGF0ZWdyYXk0AFx4NABzbm93NABsaWdodHllbGxvdzQAaG9uZXlkZXc0AHdoZWF0NAB0b21hdG80AHJvc3licm93bjQAbWFyb29uNABsaWdodHNhbG1vbjQAbGVtb25jaGlmZm9uNABzcHJpbmdncmVlbjQAZGFya29saXZlZ3JlZW40AHBhbGVncmVlbjQAZGFya3NlYWdyZWVuNABsaWdodGN5YW40AHRhbjQAcGx1bTQAc2Vhc2hlbGw0AGNvcmFsNABob3RwaW5rNABsaWdodHBpbms0AGRlZXBwaW5rNABjb3Juc2lsazQAZmlyZWJyaWNrNABraGFraTQAbGF2ZW5kZXJibHVzaDQAcGVhY2hwdWZmNABiaXNxdWU0AGxpZ2h0c2t5Ymx1ZTQAZGVlcHNreWJsdWU0AGxpZ2h0Ymx1ZTQAY2FkZXRibHVlNABkb2RnZXJibHVlNABsaWdodHN0ZWVsYmx1ZTQAcm95YWxibHVlNABzbGF0ZWJsdWU0AG5hdmFqb3doaXRlNABhbnRpcXVld2hpdGU0AGNob2NvbGF0ZTQAY2hhcnRyZXVzZTQAbWlzdHlyb3NlNABwYWxldHVycXVvaXNlNABhenVyZTQAdGhlcmU0AGFxdWFtYXJpbmU0AHRoaXN0bGU0AG1lZGl1bXB1cnBsZTQAZGFya29yYW5nZTQAbGlnaHRnb2xkZW5yb2Q0AGRhcmtnb2xkZW5yb2Q0AGJ1cmx5d29vZDQAZ29sZDQAbWVkaXVtb3JjaGlkNABkYXJrb3JjaGlkNABwYWxldmlvbGV0cmVkNABpbmRpYW5yZWQ0AG9yYW5nZXJlZDQAb2xpdmVkcmFiNABtYWdlbnRhNABzaWVubmE0AFx4RjQAXHhFNABceEQ0AFx4QzQAXHhCNABceEE0AGdyZXk5NABncmF5OTQAXHg5NABncmV5ODQAZ3JheTg0AFx4ODQAZ3JleTc0AGdyYXk3NABncmV5NjQAZ3JheTY0AGdyZXk1NABncmF5NTQAMjAyNjAzMDMuMDQ1NABncmV5NDQAZ3JheTQ0AGdyZXkzNABncmF5MzQAZnJhYzM0AGdyZXkyNABncmF5MjQAZ3JleTE0AGdyYXkxNABceDE0AGZyYWMxNAAvcmRneTkvNAAvYnVwdTkvNAAvcmRwdTkvNAAvcHVidTkvNAAveWxnbmJ1OS80AC9nbmJ1OS80AC9yZHlsYnU5LzQAL3JkYnU5LzQAL2dyZXlzOS80AC9ncmVlbnM5LzQAL2JsdWVzOS80AC9wdXJwbGVzOS80AC9vcmFuZ2VzOS80AC9yZWRzOS80AC9wdW9yOS80AC95bG9yYnI5LzQAL3B1YnVnbjkvNAAvYnVnbjkvNAAvcHJnbjkvNAAvcmR5bGduOS80AC95bGduOS80AC9zcGVjdHJhbDkvNAAvcGl5ZzkvNAAvYnJiZzkvNAAvcHVyZDkvNAAveWxvcnJkOS80AC9vcnJkOS80AC9wYWlyZWQ5LzQAL3NldDM5LzQAL3NldDE5LzQAL3Bhc3RlbDE5LzQAL3JkZ3k4LzQAL2J1cHU4LzQAL3JkcHU4LzQAL3B1YnU4LzQAL3lsZ25idTgvNAAvZ25idTgvNAAvcmR5bGJ1OC80AC9yZGJ1OC80AC9hY2NlbnQ4LzQAL2dyZXlzOC80AC9ncmVlbnM4LzQAL2JsdWVzOC80AC9wdXJwbGVzOC80AC9vcmFuZ2VzOC80AC9yZWRzOC80AC9wdW9yOC80AC95bG9yYnI4LzQAL3B1YnVnbjgvNAAvYnVnbjgvNAAvcHJnbjgvNAAvcmR5bGduOC80AC95bGduOC80AC9zcGVjdHJhbDgvNAAvcGl5ZzgvNAAvYnJiZzgvNAAvcHVyZDgvNAAveWxvcnJkOC80AC9vcnJkOC80AC9wYWlyZWQ4LzQAL3NldDM4LzQAL3NldDI4LzQAL3Bhc3RlbDI4LzQAL2RhcmsyOC80AC9zZXQxOC80AC9wYXN0ZWwxOC80AC9yZGd5Ny80AC9idXB1Ny80AC9yZHB1Ny80AC9wdWJ1Ny80AC95bGduYnU3LzQAL2duYnU3LzQAL3JkeWxidTcvNAAvcmRidTcvNAAvYWNjZW50Ny80AC9ncmV5czcvNAAvZ3JlZW5zNy80AC9ibHVlczcvNAAvcHVycGxlczcvNAAvb3JhbmdlczcvNAAvcmVkczcvNAAvcHVvcjcvNAAveWxvcmJyNy80AC9wdWJ1Z243LzQAL2J1Z243LzQAL3ByZ243LzQAL3JkeWxnbjcvNAAveWxnbjcvNAAvc3BlY3RyYWw3LzQAL3BpeWc3LzQAL2JyYmc3LzQAL3B1cmQ3LzQAL3lsb3JyZDcvNAAvb3JyZDcvNAAvcGFpcmVkNy80AC9zZXQzNy80AC9zZXQyNy80AC9wYXN0ZWwyNy80AC9kYXJrMjcvNAAvc2V0MTcvNAAvcGFzdGVsMTcvNAAvcmRneTYvNAAvYnVwdTYvNAAvcmRwdTYvNAAvcHVidTYvNAAveWxnbmJ1Ni80AC9nbmJ1Ni80AC9yZHlsYnU2LzQAL3JkYnU2LzQAL2FjY2VudDYvNAAvZ3JleXM2LzQAL2dyZWVuczYvNAAvYmx1ZXM2LzQAL3B1cnBsZXM2LzQAL29yYW5nZXM2LzQAL3JlZHM2LzQAL3B1b3I2LzQAL3lsb3JicjYvNAAvcHVidWduNi80AC9idWduNi80AC9wcmduNi80AC9yZHlsZ242LzQAL3lsZ242LzQAL3NwZWN0cmFsNi80AC9waXlnNi80AC9icmJnNi80AC9wdXJkNi80AC95bG9ycmQ2LzQAL29ycmQ2LzQAL3BhaXJlZDYvNAAvc2V0MzYvNAAvc2V0MjYvNAAvcGFzdGVsMjYvNAAvZGFyazI2LzQAL3NldDE2LzQAL3Bhc3RlbDE2LzQAL3JkZ3k1LzQAL2J1cHU1LzQAL3JkcHU1LzQAL3B1YnU1LzQAL3lsZ25idTUvNAAvZ25idTUvNAAvcmR5bGJ1NS80AC9yZGJ1NS80AC9hY2NlbnQ1LzQAL2dyZXlzNS80AC9ncmVlbnM1LzQAL2JsdWVzNS80AC9wdXJwbGVzNS80AC9vcmFuZ2VzNS80AC9yZWRzNS80AC9wdW9yNS80AC95bG9yYnI1LzQAL3B1YnVnbjUvNAAvYnVnbjUvNAAvcHJnbjUvNAAvcmR5bGduNS80AC95bGduNS80AC9zcGVjdHJhbDUvNAAvcGl5ZzUvNAAvYnJiZzUvNAAvcHVyZDUvNAAveWxvcnJkNS80AC9vcnJkNS80AC9wYWlyZWQ1LzQAL3NldDM1LzQAL3NldDI1LzQAL3Bhc3RlbDI1LzQAL2RhcmsyNS80AC9zZXQxNS80AC9wYXN0ZWwxNS80AC9yZGd5NC80AC9idXB1NC80AC9yZHB1NC80AC9wdWJ1NC80AC95bGduYnU0LzQAL2duYnU0LzQAL3JkeWxidTQvNAAvcmRidTQvNAAvYWNjZW50NC80AC9ncmV5czQvNAAvZ3JlZW5zNC80AC9ibHVlczQvNAAvcHVycGxlczQvNAAvb3JhbmdlczQvNAAvcmVkczQvNAAvcHVvcjQvNAAveWxvcmJyNC80AC9wdWJ1Z240LzQAL2J1Z240LzQAL3ByZ240LzQAL3JkeWxnbjQvNAAveWxnbjQvNAAvc3BlY3RyYWw0LzQAL3BpeWc0LzQAL2JyYmc0LzQAL3B1cmQ0LzQAL3lsb3JyZDQvNAAvb3JyZDQvNAAvcGFpcmVkNC80AC9zZXQzNC80AC9zZXQyNC80AC9wYXN0ZWwyNC80AC9kYXJrMjQvNAAvc2V0MTQvNAAvcGFzdGVsMTQvNAAvcGFpcmVkMTIvNAAvc2V0MzEyLzQAL3JkZ3kxMS80AC9yZHlsYnUxMS80AC9yZGJ1MTEvNAAvcHVvcjExLzQAL3ByZ24xMS80AC9yZHlsZ24xMS80AC9zcGVjdHJhbDExLzQAL3BpeWcxMS80AC9icmJnMTEvNAAvcGFpcmVkMTEvNAAvc2V0MzExLzQAL3JkZ3kxMC80AC9yZHlsYnUxMC80AC9yZGJ1MTAvNAAvcHVvcjEwLzQAL3ByZ24xMC80AC9yZHlsZ24xMC80AC9zcGVjdHJhbDEwLzQAL3BpeWcxMC80AC9icmJnMTAvNAAvcGFpcmVkMTAvNAAvc2V0MzEwLzQAMS40AG4gPj0gNABzaWRlcyA9PSA0AGl2b3J5MwBTcGFyc2VNYXRyaXhfbXVsdGlwbHkzAGdyZXkzAGRhcmtzbGF0ZWdyYXkzAFx4MwBzbm93MwBsaWdodHllbGxvdzMAaG9uZXlkZXczAHdoZWF0MwBzdXAzAHRvbWF0bzMAcm9zeWJyb3duMwBtYXJvb24zAGxpZ2h0c2FsbW9uMwBsZW1vbmNoaWZmb24zAHNwcmluZ2dyZWVuMwBkYXJrb2xpdmVncmVlbjMAcGFsZWdyZWVuMwBkYXJrc2VhZ3JlZW4zAGxpZ2h0Y3lhbjMAdGFuMwBwbHVtMwBzZWFzaGVsbDMAY29yYWwzAGhvdHBpbmszAGxpZ2h0cGluazMAZGVlcHBpbmszAGNvcm5zaWxrMwBmaXJlYnJpY2szAGtoYWtpMwBsYXZlbmRlcmJsdXNoMwBwZWFjaHB1ZmYzAGJpc3F1ZTMAbGlnaHRza3libHVlMwBkZWVwc2t5Ymx1ZTMAbGlnaHRibHVlMwBjYWRldGJsdWUzAGRvZGdlcmJsdWUzAGxpZ2h0c3RlZWxibHVlMwByb3lhbGJsdWUzAHNsYXRlYmx1ZTMAbmF2YWpvd2hpdGUzAGFudGlxdWV3aGl0ZTMAY2hvY29sYXRlMwBjaGFydHJldXNlMwBtaXN0eXJvc2UzAHBhbGV0dXJxdW9pc2UzAGF6dXJlMwBhcXVhbWFyaW5lMwB0aGlzdGxlMwBtZWRpdW1wdXJwbGUzAGRhcmtvcmFuZ2UzAGxpZ2h0Z29sZGVucm9kMwBkYXJrZ29sZGVucm9kMwBidXJseXdvb2QzAGdvbGQzAG1lZGl1bW9yY2hpZDMAZGFya29yY2hpZDMAcGFsZXZpb2xldHJlZDMAaW5kaWFucmVkMwBvcmFuZ2VyZWQzAG9saXZlZHJhYjMAbWFnZW50YTMAc2llbm5hMwBceEYzAFx4RTMAXHhEMwBceEMzAFx4QjMAXHhBMwBncmV5OTMAZ3JheTkzAFx4OTMAZ3JleTgzAGdyYXk4MwBceDgzAGdyZXk3MwBncmF5NzMAZ3JleTYzAGdyYXk2MwBncmV5NTMAZ3JheTUzAFNUU0laRShuZXh0KSA8PSBVSU5UNjRfQygxKSA8PCA1MwBTVFNJWkUobikgPD0gVUlOVDY0X0MoMSkgPDwgNTMAZ3JleTQzAGdyYXk0MwBncmV5MzMAZ3JheTMzAGdyZXkyMwBncmF5MjMAZ3JleTEzAGdyYXkxMwBceDEzAC9yZGd5OS8zAC9idXB1OS8zAC9yZHB1OS8zAC9wdWJ1OS8zAC95bGduYnU5LzMAL2duYnU5LzMAL3JkeWxidTkvMwAvcmRidTkvMwAvZ3JleXM5LzMAL2dyZWVuczkvMwAvYmx1ZXM5LzMAL3B1cnBsZXM5LzMAL29yYW5nZXM5LzMAL3JlZHM5LzMAL3B1b3I5LzMAL3lsb3JicjkvMwAvcHVidWduOS8zAC9idWduOS8zAC9wcmduOS8zAC9yZHlsZ245LzMAL3lsZ245LzMAL3NwZWN0cmFsOS8zAC9waXlnOS8zAC9icmJnOS8zAC9wdXJkOS8zAC95bG9ycmQ5LzMAL29ycmQ5LzMAL3BhaXJlZDkvMwAvc2V0MzkvMwAvc2V0MTkvMwAvcGFzdGVsMTkvMwAvcmRneTgvMwAvYnVwdTgvMwAvcmRwdTgvMwAvcHVidTgvMwAveWxnbmJ1OC8zAC9nbmJ1OC8zAC9yZHlsYnU4LzMAL3JkYnU4LzMAL2FjY2VudDgvMwAvZ3JleXM4LzMAL2dyZWVuczgvMwAvYmx1ZXM4LzMAL3B1cnBsZXM4LzMAL29yYW5nZXM4LzMAL3JlZHM4LzMAL3B1b3I4LzMAL3lsb3JicjgvMwAvcHVidWduOC8zAC9idWduOC8zAC9wcmduOC8zAC9yZHlsZ244LzMAL3lsZ244LzMAL3NwZWN0cmFsOC8zAC9waXlnOC8zAC9icmJnOC8zAC9wdXJkOC8zAC95bG9ycmQ4LzMAL29ycmQ4LzMAL3BhaXJlZDgvMwAvc2V0MzgvMwAvc2V0MjgvMwAvcGFzdGVsMjgvMwAvZGFyazI4LzMAL3NldDE4LzMAL3Bhc3RlbDE4LzMAL3JkZ3k3LzMAL2J1cHU3LzMAL3JkcHU3LzMAL3B1YnU3LzMAL3lsZ25idTcvMwAvZ25idTcvMwAvcmR5bGJ1Ny8zAC9yZGJ1Ny8zAC9hY2NlbnQ3LzMAL2dyZXlzNy8zAC9ncmVlbnM3LzMAL2JsdWVzNy8zAC9wdXJwbGVzNy8zAC9vcmFuZ2VzNy8zAC9yZWRzNy8zAC9wdW9yNy8zAC95bG9yYnI3LzMAL3B1YnVnbjcvMwAvYnVnbjcvMwAvcHJnbjcvMwAvcmR5bGduNy8zAC95bGduNy8zAC9zcGVjdHJhbDcvMwAvcGl5ZzcvMwAvYnJiZzcvMwAvcHVyZDcvMwAveWxvcnJkNy8zAC9vcnJkNy8zAC9wYWlyZWQ3LzMAL3NldDM3LzMAL3NldDI3LzMAL3Bhc3RlbDI3LzMAL2RhcmsyNy8zAC9zZXQxNy8zAC9wYXN0ZWwxNy8zAC9yZGd5Ni8zAC9idXB1Ni8zAC9yZHB1Ni8zAC9wdWJ1Ni8zAC95bGduYnU2LzMAL2duYnU2LzMAL3JkeWxidTYvMwAvcmRidTYvMwAvYWNjZW50Ni8zAC9ncmV5czYvMwAvZ3JlZW5zNi8zAC9ibHVlczYvMwAvcHVycGxlczYvMwAvb3JhbmdlczYvMwAvcmVkczYvMwAvcHVvcjYvMwAveWxvcmJyNi8zAC9wdWJ1Z242LzMAL2J1Z242LzMAL3ByZ242LzMAL3JkeWxnbjYvMwAveWxnbjYvMwAvc3BlY3RyYWw2LzMAL3BpeWc2LzMAL2JyYmc2LzMAL3B1cmQ2LzMAL3lsb3JyZDYvMwAvb3JyZDYvMwAvcGFpcmVkNi8zAC9zZXQzNi8zAC9zZXQyNi8zAC9wYXN0ZWwyNi8zAC9kYXJrMjYvMwAvc2V0MTYvMwAvcGFzdGVsMTYvMwAvcmRneTUvMwAvYnVwdTUvMwAvcmRwdTUvMwAvcHVidTUvMwAveWxnbmJ1NS8zAC9nbmJ1NS8zAC9yZHlsYnU1LzMAL3JkYnU1LzMAL2FjY2VudDUvMwAvZ3JleXM1LzMAL2dyZWVuczUvMwAvYmx1ZXM1LzMAL3B1cnBsZXM1LzMAL29yYW5nZXM1LzMAL3JlZHM1LzMAL3B1b3I1LzMAL3lsb3JicjUvMwAvcHVidWduNS8zAC9idWduNS8zAC9wcmduNS8zAC9yZHlsZ241LzMAL3lsZ241LzMAL3NwZWN0cmFsNS8zAC9waXlnNS8zAC9icmJnNS8zAC9wdXJkNS8zAC95bG9ycmQ1LzMAL29ycmQ1LzMAL3BhaXJlZDUvMwAvc2V0MzUvMwAvc2V0MjUvMwAvcGFzdGVsMjUvMwAvZGFyazI1LzMAL3NldDE1LzMAL3Bhc3RlbDE1LzMAL3JkZ3k0LzMAL2J1cHU0LzMAL3JkcHU0LzMAL3B1YnU0LzMAL3lsZ25idTQvMwAvZ25idTQvMwAvcmR5bGJ1NC8zAC9yZGJ1NC8zAC9hY2NlbnQ0LzMAL2dyZXlzNC8zAC9ncmVlbnM0LzMAL2JsdWVzNC8zAC9wdXJwbGVzNC8zAC9vcmFuZ2VzNC8zAC9yZWRzNC8zAC9wdW9yNC8zAC95bG9yYnI0LzMAL3B1YnVnbjQvMwAvYnVnbjQvMwAvcHJnbjQvMwAvcmR5bGduNC8zAC95bGduNC8zAC9zcGVjdHJhbDQvMwAvcGl5ZzQvMwAvYnJiZzQvMwAvcHVyZDQvMwAveWxvcnJkNC8zAC9vcnJkNC8zAC9wYWlyZWQ0LzMAL3NldDM0LzMAL3NldDI0LzMAL3Bhc3RlbDI0LzMAL2RhcmsyNC8zAC9zZXQxNC8zAC9wYXN0ZWwxNC8zAC9yZGd5My8zAC9idXB1My8zAC9yZHB1My8zAC9wdWJ1My8zAC95bGduYnUzLzMAL2duYnUzLzMAL3JkeWxidTMvMwAvcmRidTMvMwAvYWNjZW50My8zAC9ncmV5czMvMwAvZ3JlZW5zMy8zAC9ibHVlczMvMwAvcHVycGxlczMvMwAvb3JhbmdlczMvMwAvcmVkczMvMwAvcHVvcjMvMwAveWxvcmJyMy8zAC9wdWJ1Z24zLzMAL2J1Z24zLzMAL3ByZ24zLzMAL3JkeWxnbjMvMwAveWxnbjMvMwAvc3BlY3RyYWwzLzMAL3BpeWczLzMAL2JyYmczLzMAL3B1cmQzLzMAL3lsb3JyZDMvMwAvb3JyZDMvMwAvcGFpcmVkMy8zAC9zZXQzMy8zAC9zZXQyMy8zAC9wYXN0ZWwyMy8zAC9kYXJrMjMvMwAvc2V0MTMvMwAvcGFzdGVsMTMvMwAvcGFpcmVkMTIvMwAvc2V0MzEyLzMAL3JkZ3kxMS8zAC9yZHlsYnUxMS8zAC9yZGJ1MTEvMwAvcHVvcjExLzMAL3ByZ24xMS8zAC9yZHlsZ24xMS8zAC9zcGVjdHJhbDExLzMAL3BpeWcxMS8zAC9icmJnMTEvMwAvcGFpcmVkMTEvMwAvc2V0MzExLzMAL3JkZ3kxMC8zAC9yZHlsYnUxMC8zAC9yZGJ1MTAvMwAvcHVvcjEwLzMAL3ByZ24xMC8zAC9yZHlsZ24xMC8zAC9zcGVjdHJhbDEwLzMAL3BpeWcxMC8zAC9icmJnMTAvMwAvcGFpcmVkMTAvMwAvc2V0MzEwLzMAMTQuMS4zAGl2b3J5MgBncmV5MgBkYXJrc2xhdGVncmF5MgBceDIAc25vdzIAbGlnaHR5ZWxsb3cyAGhvbmV5ZGV3MgBSVHJlZUluc2VydDIAd2hlYXQyAHN1cDIAbm9wMgB0b21hdG8yAHJvc3licm93bjIAbWFyb29uMgBsaWdodHNhbG1vbjIAbGVtb25jaGlmZm9uMgBzcHJpbmdncmVlbjIAZGFya29saXZlZ3JlZW4yAHBhbGVncmVlbjIAZGFya3NlYWdyZWVuMgBsaWdodGN5YW4yAHRhbjIAcGx1bTIAc2Vhc2hlbGwyAGNvcmFsMgBob3RwaW5rMgBsaWdodHBpbmsyAGRlZXBwaW5rMgBjb3Juc2lsazIAZmlyZWJyaWNrMgBraGFraTIAbGF2ZW5kZXJibHVzaDIAcGVhY2hwdWZmMgBicm9uemUyAGJpc3F1ZTIAbGlnaHRza3libHVlMgBkZWVwc2t5Ymx1ZTIAbGlnaHRibHVlMgBjYWRldGJsdWUyAGRvZGdlcmJsdWUyAGxpZ2h0c3RlZWxibHVlMgByb3lhbGJsdWUyAHNsYXRlYmx1ZTIAbmF2YWpvd2hpdGUyAGFudGlxdWV3aGl0ZTIAY2hvY29sYXRlMgBjaGFydHJldXNlMgBtaXN0eXJvc2UyAHBhbGV0dXJxdW9pc2UyAGF6dXJlMgBhcXVhbWFyaW5lMgB0aGlzdGxlMgBtZWRpdW1wdXJwbGUyAGRhcmtvcmFuZ2UyAGxpZ2h0Z29sZGVucm9kMgBkYXJrZ29sZGVucm9kMgBidXJseXdvb2QyAGdvbGQyAG1lZGl1bW9yY2hpZDIAZGFya29yY2hpZDIAcGFsZXZpb2xldHJlZDIAaW5kaWFucmVkMgBvcmFuZ2VyZWQyAG9saXZlZHJhYjIAbWFnZW50YTIAc2llbm5hMgBceEYyAFx4RTIAXHhEMgBceEMyAFx4QjIAXHhBMgBncmV5OTIAZ3JheTkyAFx4OTIAZ3JleTgyAGdyYXk4MgBceDgyAGdyZXk3MgBncmF5NzIAZ3JleTYyAGdyYXk2MgBncmV5NTIAZ3JheTUyAGdyZXk0MgBncmF5NDIAZ3JleTMyAGdyYXkzMgBncmV5MjIAZ3JheTIyAGdyZXkxMgBncmF5MTIAXHgxMgBmcmFjMTIAL3BhaXJlZDEyLzEyAC9zZXQzMTIvMTIAL3JkZ3k5LzIAL2J1cHU5LzIAL3JkcHU5LzIAL3B1YnU5LzIAL3lsZ25idTkvMgAvZ25idTkvMgAvcmR5bGJ1OS8yAC9yZGJ1OS8yAC9ncmV5czkvMgAvZ3JlZW5zOS8yAC9ibHVlczkvMgAvcHVycGxlczkvMgAvb3JhbmdlczkvMgAvcmVkczkvMgAvcHVvcjkvMgAveWxvcmJyOS8yAC9wdWJ1Z245LzIAL2J1Z245LzIAL3ByZ245LzIAL3JkeWxnbjkvMgAveWxnbjkvMgAvc3BlY3RyYWw5LzIAL3BpeWc5LzIAL2JyYmc5LzIAL3B1cmQ5LzIAL3lsb3JyZDkvMgAvb3JyZDkvMgAvcGFpcmVkOS8yAC9zZXQzOS8yAC9zZXQxOS8yAC9wYXN0ZWwxOS8yAC9yZGd5OC8yAC9idXB1OC8yAC9yZHB1OC8yAC9wdWJ1OC8yAC95bGduYnU4LzIAL2duYnU4LzIAL3JkeWxidTgvMgAvcmRidTgvMgAvYWNjZW50OC8yAC9ncmV5czgvMgAvZ3JlZW5zOC8yAC9ibHVlczgvMgAvcHVycGxlczgvMgAvb3JhbmdlczgvMgAvcmVkczgvMgAvcHVvcjgvMgAveWxvcmJyOC8yAC9wdWJ1Z244LzIAL2J1Z244LzIAL3ByZ244LzIAL3JkeWxnbjgvMgAveWxnbjgvMgAvc3BlY3RyYWw4LzIAL3BpeWc4LzIAL2JyYmc4LzIAL3B1cmQ4LzIAL3lsb3JyZDgvMgAvb3JyZDgvMgAvcGFpcmVkOC8yAC9zZXQzOC8yAC9zZXQyOC8yAC9wYXN0ZWwyOC8yAC9kYXJrMjgvMgAvc2V0MTgvMgAvcGFzdGVsMTgvMgAvcmRneTcvMgAvYnVwdTcvMgAvcmRwdTcvMgAvcHVidTcvMgAveWxnbmJ1Ny8yAC9nbmJ1Ny8yAC9yZHlsYnU3LzIAL3JkYnU3LzIAL2FjY2VudDcvMgAvZ3JleXM3LzIAL2dyZWVuczcvMgAvYmx1ZXM3LzIAL3B1cnBsZXM3LzIAL29yYW5nZXM3LzIAL3JlZHM3LzIAL3B1b3I3LzIAL3lsb3JicjcvMgAvcHVidWduNy8yAC9idWduNy8yAC9wcmduNy8yAC9yZHlsZ243LzIAL3lsZ243LzIAL3NwZWN0cmFsNy8yAC9waXlnNy8yAC9icmJnNy8yAC9wdXJkNy8yAC95bG9ycmQ3LzIAL29ycmQ3LzIAL3BhaXJlZDcvMgAvc2V0MzcvMgAvc2V0MjcvMgAvcGFzdGVsMjcvMgAvZGFyazI3LzIAL3NldDE3LzIAL3Bhc3RlbDE3LzIAL3JkZ3k2LzIAL2J1cHU2LzIAL3JkcHU2LzIAL3B1YnU2LzIAL3lsZ25idTYvMgAvZ25idTYvMgAvcmR5bGJ1Ni8yAC9yZGJ1Ni8yAC9hY2NlbnQ2LzIAL2dyZXlzNi8yAC9ncmVlbnM2LzIAL2JsdWVzNi8yAC9wdXJwbGVzNi8yAC9vcmFuZ2VzNi8yAC9yZWRzNi8yAC9wdW9yNi8yAC95bG9yYnI2LzIAL3B1YnVnbjYvMgAvYnVnbjYvMgAvcHJnbjYvMgAvcmR5bGduNi8yAC95bGduNi8yAC9zcGVjdHJhbDYvMgAvcGl5ZzYvMgAvYnJiZzYvMgAvcHVyZDYvMgAveWxvcnJkNi8yAC9vcnJkNi8yAC9wYWlyZWQ2LzIAL3NldDM2LzIAL3NldDI2LzIAL3Bhc3RlbDI2LzIAL2RhcmsyNi8yAC9zZXQxNi8yAC9wYXN0ZWwxNi8yAC9yZGd5NS8yAC9idXB1NS8yAC9yZHB1NS8yAC9wdWJ1NS8yAC95bGduYnU1LzIAL2duYnU1LzIAL3JkeWxidTUvMgAvcmRidTUvMgAvYWNjZW50NS8yAC9ncmV5czUvMgAvZ3JlZW5zNS8yAC9ibHVlczUvMgAvcHVycGxlczUvMgAvb3JhbmdlczUvMgAvcmVkczUvMgAvcHVvcjUvMgAveWxvcmJyNS8yAC9wdWJ1Z241LzIAL2J1Z241LzIAL3ByZ241LzIAL3JkeWxnbjUvMgAveWxnbjUvMgAvc3BlY3RyYWw1LzIAL3BpeWc1LzIAL2JyYmc1LzIAL3B1cmQ1LzIAL3lsb3JyZDUvMgAvb3JyZDUvMgAvcGFpcmVkNS8yAC9zZXQzNS8yAC9zZXQyNS8yAC9wYXN0ZWwyNS8yAC9kYXJrMjUvMgAvc2V0MTUvMgAvcGFzdGVsMTUvMgAvcmRneTQvMgAvYnVwdTQvMgAvcmRwdTQvMgAvcHVidTQvMgAveWxnbmJ1NC8yAC9nbmJ1NC8yAC9yZHlsYnU0LzIAL3JkYnU0LzIAL2FjY2VudDQvMgAvZ3JleXM0LzIAL2dyZWVuczQvMgAvYmx1ZXM0LzIAL3B1cnBsZXM0LzIAL29yYW5nZXM0LzIAL3JlZHM0LzIAL3B1b3I0LzIAL3lsb3JicjQvMgAvcHVidWduNC8yAC9idWduNC8yAC9wcmduNC8yAC9yZHlsZ240LzIAL3lsZ240LzIAL3NwZWN0cmFsNC8yAC9waXlnNC8yAC9icmJnNC8yAC9wdXJkNC8yAC95bG9ycmQ0LzIAL29ycmQ0LzIAL3BhaXJlZDQvMgAvc2V0MzQvMgAvc2V0MjQvMgAvcGFzdGVsMjQvMgAvZGFyazI0LzIAL3NldDE0LzIAL3Bhc3RlbDE0LzIAL3JkZ3kzLzIAL2J1cHUzLzIAL3JkcHUzLzIAL3B1YnUzLzIAL3lsZ25idTMvMgAvZ25idTMvMgAvcmR5bGJ1My8yAC9yZGJ1My8yAC9hY2NlbnQzLzIAL2dyZXlzMy8yAC9ncmVlbnMzLzIAL2JsdWVzMy8yAC9wdXJwbGVzMy8yAC9vcmFuZ2VzMy8yAC9yZWRzMy8yAC9wdW9yMy8yAC95bG9yYnIzLzIAL3B1YnVnbjMvMgAvYnVnbjMvMgAvcHJnbjMvMgAvcmR5bGduMy8yAC95bGduMy8yAC9zcGVjdHJhbDMvMgAvcGl5ZzMvMgAvYnJiZzMvMgAvcHVyZDMvMgAveWxvcnJkMy8yAC9vcnJkMy8yAC9wYWlyZWQzLzIAL3NldDMzLzIAL3NldDIzLzIAL3Bhc3RlbDIzLzIAL2RhcmsyMy8yAC9zZXQxMy8yAC9wYXN0ZWwxMy8yAC9wYWlyZWQxMi8yAC9zZXQzMTIvMgAvcmRneTExLzIAL3JkeWxidTExLzIAL3JkYnUxMS8yAC9wdW9yMTEvMgAvcHJnbjExLzIAL3JkeWxnbjExLzIAL3NwZWN0cmFsMTEvMgAvcGl5ZzExLzIAL2JyYmcxMS8yAC9wYWlyZWQxMS8yAC9zZXQzMTEvMgAvcmRneTEwLzIAL3JkeWxidTEwLzIAL3JkYnUxMC8yAC9wdW9yMTAvMgAvcHJnbjEwLzIAL3JkeWxnbjEwLzIAL3NwZWN0cmFsMTAvMgAvcGl5ZzEwLzIAL2JyYmcxMC8yAC9wYWlyZWQxMC8yAC9zZXQzMTAvMgAxLjIAIC1kYXNoIDIAbGVuID49IDIAZXhwID09IDEgfHwgZXhwID09IDIAZGltID09IDIATkRfb3V0KHYpLnNpemUgPT0gMgBpdm9yeTEAZ3JleTEAZGFya3NsYXRlZ3JheTEAXHgxAHNub3cxAGxpZ2h0eWVsbG93MQBob25leWRldzEAbnNsaW1pdDEAd2hlYXQxAHN1cDEAbm9wMQB0b21hdG8xAHJvc3licm93bjEAbWFyb29uMQBsaWdodHNhbG1vbjEAbGVtb25jaGlmZm9uMQBsYXRpbjEAYWdvcGVuMQBzcHJpbmdncmVlbjEAZGFya29saXZlZ3JlZW4xAHBhbGVncmVlbjEAZGFya3NlYWdyZWVuMQBsaWdodGN5YW4xAHRhbjEAcGx1bTEAc2Vhc2hlbGwxAGNvcmFsMQBob3RwaW5rMQBsaWdodHBpbmsxAGRlZXBwaW5rMQBjb3Juc2lsazEAZmlyZWJyaWNrMQBqMCA8PSBpMSAmJiBpMSA8PSBqMQBraGFraTEAbGF2ZW5kZXJibHVzaDEAcGVhY2hwdWZmMQBiaXNxdWUxAGxpZ2h0c2t5Ymx1ZTEAZGVlcHNreWJsdWUxAGxpZ2h0Ymx1ZTEAY2FkZXRibHVlMQBkb2RnZXJibHVlMQBsaWdodHN0ZWVsYmx1ZTEAcm95YWxibHVlMQBzbGF0ZWJsdWUxAG5hdmFqb3doaXRlMQBhbnRpcXVld2hpdGUxAGNob2NvbGF0ZTEAY2hhcnRyZXVzZTEAbWlzdHlyb3NlMQBwYWxldHVycXVvaXNlMQBhenVyZTEAYXF1YW1hcmluZTEAdGhpc3RsZTEAbWVkaXVtcHVycGxlMQBkYXJrb3JhbmdlMQBhcmdfZTAgJiYgYXJnX2UxAGxpZ2h0Z29sZGVucm9kMQBkYXJrZ29sZGVucm9kMQBidXJseXdvb2QxAGdvbGQxAG1lZGl1bW9yY2hpZDEAZGFya29yY2hpZDEAcGFsZXZpb2xldHJlZDEAaW5kaWFucmVkMQBvcmFuZ2VyZWQxAG9saXZlZHJhYjEAbWFnZW50YTEAc2llbm5hMQBceEYxAFx4RTEAXHhEMQBceEMxAFx4QjEAXHhBMQBncmV5OTEAZ3JheTkxAFx4OTEAZ3JleTgxAGdyYXk4MQBceDgxAGdyZXk3MQBncmF5NzEAZ3JleTYxAGdyYXk2MQBncmV5NTEAZ3JheTUxAGdyZXk0MQBncmF5NDEAZ3JleTMxAGdyYXkzMQBncmV5MjEAZ3JheTIxAGdyZXkxMQBncmF5MTEAXHgxMQAvcGFpcmVkMTIvMTEAL3NldDMxMi8xMQAvcmRneTExLzExAC9yZHlsYnUxMS8xMQAvcmRidTExLzExAC9wdW9yMTEvMTEAL3ByZ24xMS8xMQAvcmR5bGduMTEvMTEAL3NwZWN0cmFsMTEvMTEAL3BpeWcxMS8xMQAvYnJiZzExLzExAC9wYWlyZWQxMS8xMQAvc2V0MzExLzExAGNzW2ldLT5zbGFjaygpPi0wLjAwMDAwMDEAL3JkZ3k5LzEAL2J1cHU5LzEAL3JkcHU5LzEAL3B1YnU5LzEAL3lsZ25idTkvMQAvZ25idTkvMQAvcmR5bGJ1OS8xAC9yZGJ1OS8xAC9ncmV5czkvMQAvZ3JlZW5zOS8xAC9ibHVlczkvMQAvcHVycGxlczkvMQAvb3JhbmdlczkvMQAvcmVkczkvMQAvcHVvcjkvMQAveWxvcmJyOS8xAC9wdWJ1Z245LzEAL2J1Z245LzEAL3ByZ245LzEAL3JkeWxnbjkvMQAveWxnbjkvMQAvc3BlY3RyYWw5LzEAL3BpeWc5LzEAL2JyYmc5LzEAL3B1cmQ5LzEAL3lsb3JyZDkvMQAvb3JyZDkvMQAvcGFpcmVkOS8xAC9zZXQzOS8xAC9zZXQxOS8xAC9wYXN0ZWwxOS8xAC9yZGd5OC8xAC9idXB1OC8xAC9yZHB1OC8xAC9wdWJ1OC8xAC95bGduYnU4LzEAL2duYnU4LzEAL3JkeWxidTgvMQAvcmRidTgvMQAvYWNjZW50OC8xAC9ncmV5czgvMQAvZ3JlZW5zOC8xAC9ibHVlczgvMQAvcHVycGxlczgvMQAvb3JhbmdlczgvMQAvcmVkczgvMQAvcHVvcjgvMQAveWxvcmJyOC8xAC9wdWJ1Z244LzEAL2J1Z244LzEAL3ByZ244LzEAL3JkeWxnbjgvMQAveWxnbjgvMQAvc3BlY3RyYWw4LzEAL3BpeWc4LzEAL2JyYmc4LzEAL3B1cmQ4LzEAL3lsb3JyZDgvMQAvb3JyZDgvMQAvcGFpcmVkOC8xAC9zZXQzOC8xAC9zZXQyOC8xAC9wYXN0ZWwyOC8xAC9kYXJrMjgvMQAvc2V0MTgvMQAvcGFzdGVsMTgvMQAvcmRneTcvMQAvYnVwdTcvMQAvcmRwdTcvMQAvcHVidTcvMQAveWxnbmJ1Ny8xAC9nbmJ1Ny8xAC9yZHlsYnU3LzEAL3JkYnU3LzEAL2FjY2VudDcvMQAvZ3JleXM3LzEAL2dyZWVuczcvMQAvYmx1ZXM3LzEAL3B1cnBsZXM3LzEAL29yYW5nZXM3LzEAL3JlZHM3LzEAL3B1b3I3LzEAL3lsb3JicjcvMQAvcHVidWduNy8xAC9idWduNy8xAC9wcmduNy8xAC9yZHlsZ243LzEAL3lsZ243LzEAL3NwZWN0cmFsNy8xAC9waXlnNy8xAC9icmJnNy8xAC9wdXJkNy8xAC95bG9ycmQ3LzEAL29ycmQ3LzEAL3BhaXJlZDcvMQAvc2V0MzcvMQAvc2V0MjcvMQAvcGFzdGVsMjcvMQAvZGFyazI3LzEAL3NldDE3LzEAL3Bhc3RlbDE3LzEAL3JkZ3k2LzEAL2J1cHU2LzEAL3JkcHU2LzEAL3B1YnU2LzEAL3lsZ25idTYvMQAvZ25idTYvMQAvcmR5bGJ1Ni8xAC9yZGJ1Ni8xAC9hY2NlbnQ2LzEAL2dyZXlzNi8xAC9ncmVlbnM2LzEAL2JsdWVzNi8xAC9wdXJwbGVzNi8xAC9vcmFuZ2VzNi8xAC9yZWRzNi8xAC9wdW9yNi8xAC95bG9yYnI2LzEAL3B1YnVnbjYvMQAvYnVnbjYvMQAvcHJnbjYvMQAvcmR5bGduNi8xAC95bGduNi8xAC9zcGVjdHJhbDYvMQAvcGl5ZzYvMQAvYnJiZzYvMQAvcHVyZDYvMQAveWxvcnJkNi8xAC9vcnJkNi8xAC9wYWlyZWQ2LzEAL3NldDM2LzEAL3NldDI2LzEAL3Bhc3RlbDI2LzEAL2RhcmsyNi8xAC9zZXQxNi8xAC9wYXN0ZWwxNi8xAC9yZGd5NS8xAC9idXB1NS8xAC9yZHB1NS8xAC9wdWJ1NS8xAC95bGduYnU1LzEAL2duYnU1LzEAL3JkeWxidTUvMQAvcmRidTUvMQAvYWNjZW50NS8xAC9ncmV5czUvMQAvZ3JlZW5zNS8xAC9ibHVlczUvMQAvcHVycGxlczUvMQAvb3JhbmdlczUvMQAvcmVkczUvMQAvcHVvcjUvMQAveWxvcmJyNS8xAC9wdWJ1Z241LzEAL2J1Z241LzEAL3ByZ241LzEAL3JkeWxnbjUvMQAveWxnbjUvMQAvc3BlY3RyYWw1LzEAL3BpeWc1LzEAL2JyYmc1LzEAL3B1cmQ1LzEAL3lsb3JyZDUvMQAvb3JyZDUvMQAvcGFpcmVkNS8xAC9zZXQzNS8xAC9zZXQyNS8xAC9wYXN0ZWwyNS8xAC9kYXJrMjUvMQAvc2V0MTUvMQAvcGFzdGVsMTUvMQAvcmRneTQvMQAvYnVwdTQvMQAvcmRwdTQvMQAvcHVidTQvMQAveWxnbmJ1NC8xAC9nbmJ1NC8xAC9yZHlsYnU0LzEAL3JkYnU0LzEAL2FjY2VudDQvMQAvZ3JleXM0LzEAL2dyZWVuczQvMQAvYmx1ZXM0LzEAL3B1cnBsZXM0LzEAL29yYW5nZXM0LzEAL3JlZHM0LzEAL3B1b3I0LzEAL3lsb3JicjQvMQAvcHVidWduNC8xAC9idWduNC8xAC9wcmduNC8xAC9yZHlsZ240LzEAL3lsZ240LzEAL3NwZWN0cmFsNC8xAC9waXlnNC8xAC9icmJnNC8xAC9wdXJkNC8xAC95bG9ycmQ0LzEAL29ycmQ0LzEAL3BhaXJlZDQvMQAvc2V0MzQvMQAvc2V0MjQvMQAvcGFzdGVsMjQvMQAvZGFyazI0LzEAL3NldDE0LzEAL3Bhc3RlbDE0LzEAL3JkZ3kzLzEAL2J1cHUzLzEAL3JkcHUzLzEAL3B1YnUzLzEAL3lsZ25idTMvMQAvZ25idTMvMQAvcmR5bGJ1My8xAC9yZGJ1My8xAC9hY2NlbnQzLzEAL2dyZXlzMy8xAC9ncmVlbnMzLzEAL2JsdWVzMy8xAC9wdXJwbGVzMy8xAC9vcmFuZ2VzMy8xAC9yZWRzMy8xAC9wdW9yMy8xAC95bG9yYnIzLzEAL3B1YnVnbjMvMQAvYnVnbjMvMQAvcHJnbjMvMQAvcmR5bGduMy8xAC95bGduMy8xAC9zcGVjdHJhbDMvMQAvcGl5ZzMvMQAvYnJiZzMvMQAvcHVyZDMvMQAveWxvcnJkMy8xAC9vcnJkMy8xAC9wYWlyZWQzLzEAL3NldDMzLzEAL3NldDIzLzEAL3Bhc3RlbDIzLzEAL2RhcmsyMy8xAC9zZXQxMy8xAC9wYXN0ZWwxMy8xAC9wYWlyZWQxMi8xAC9zZXQzMTIvMQAvcmRneTExLzEAL3JkeWxidTExLzEAL3JkYnUxMS8xAC9wdW9yMTEvMQAvcHJnbjExLzEAL3JkeWxnbjExLzEAL3NwZWN0cmFsMTEvMQAvcGl5ZzExLzEAL2JyYmcxMS8xAC9wYWlyZWQxMS8xAC9zZXQzMTEvMQAvcmRneTEwLzEAL3JkeWxidTEwLzEAL3JkYnUxMC8xAC9wdW9yMTAvMQAvcHJnbjEwLzEAL3JkeWxnbjEwLzEAL3NwZWN0cmFsMTAvMQAvcGl5ZzEwLzEAL2JyYmcxMC8xAC9wYWlyZWQxMC8xAC9zZXQzMTAvMQBsYXRpbi0xAElTT184ODU5LTEASVNPODg1OS0xAElTTy04ODU5LTEAaSA+PSAxAHEtPm4gPT0gMQBydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0ucGFydGl0aW9uW2ldID09IDAgfHwgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLnBhcnRpdGlvbltpXSA9PSAxAGJ6LnNpemUgJSAzID09IDEATElTVF9TSVpFKCZjdHgtPlRyZWVfZWRnZSkgPT0gY3R4LT5OX25vZGVzIC0gMQBub2RlX3NldF9zaXplKGctPm5faWQpID09IG9zaXplICsgMQBuLT5jb3VudCArICgqbm4pLT5jb3VudCA9PSBOT0RFQ0FSRCArIDEAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdICsgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID09IE5PREVDQVJEICsgMQBncmV5MABncmF5MABqc29uMAAjZjBmMGYwACNlMGUwZTAAeGItPmxvY2F0ZWQgPiBBR1hCVUZfSU5MSU5FX1NJWkVfMABcMABUMABceEYwAFx4RTAAXHhEMABceEMwAFx4QjAAXHhBMABncmV5OTAAZ3JheTkwAFx4OTAAZ3JleTgwAGdyYXk4MABceDgwACM4MDgwODAAZ3JleTcwAGdyYXk3MABjY3dyb3QgPT0gMCB8fCBjY3dyb3QgPT0gOTAgfHwgY2N3cm90ID09IDE4MCB8fCBjY3dyb3QgPT0gMjcwAGN3cm90ID09IDAgfHwgY3dyb3QgPT0gOTAgfHwgY3dyb3QgPT0gMTgwIHx8IGN3cm90ID09IDI3MABncmV5NjAAZ3JheTYwAGdyZXk1MABncmF5NTAAZ3JleTQwAGdyYXk0MAByLndpZHRoKCk8MWU0MABncmV5MzAAZ3JheTMwACMzMDMwMzAAZ3JleTIwAGdyYXkyMABncmV5MTAAZ3JheTEwAFx4MTAAIzEwMTAxMAAvcGFpcmVkMTIvMTAAL3NldDMxMi8xMAAvcmRneTExLzEwAC9yZHlsYnUxMS8xMAAvcmRidTExLzEwAC9wdW9yMTEvMTAAL3ByZ24xMS8xMAAvcmR5bGduMTEvMTAAL3NwZWN0cmFsMTEvMTAAL3BpeWcxMS8xMAAvYnJiZzExLzEwAC9wYWlyZWQxMS8xMAAvc2V0MzExLzEwAC9yZGd5MTAvMTAAL3JkeWxidTEwLzEwAC9yZGJ1MTAvMTAAL3B1b3IxMC8xMAAvcHJnbjEwLzEwAC9yZHlsZ24xMC8xMAAvc3BlY3RyYWwxMC8xMAAvcGl5ZzEwLzEwAC9icmJnMTAvMTAAL3BhaXJlZDEwLzEwAC9zZXQzMTAvMTAAMTIwMABncmV5MTAwAGdyYXkxMDAASVNPLUlSLTEwMAAxMDAwMAAlIVBTLUFkb2JlLTMuMABueiA+IDAAbGlzdC0+Y2FwYWNpdHkgPiAwAGRpc3QgPiAwAHBhdGhjb3VudCA+IDAAd2d0ID4gMABuc2l0ZXMgPiAwAHNpZGVzID4gMABydiA9PSAwIHx8IChORF9vcmRlcihydiktTkRfb3JkZXIodikpKmRpciA+IDAAaW5wbiA+IDAAbGVuID4gMABxdDEtPm4gPiAwICYmIHF0Mi0+biA+IDAAbSA+IDAgJiYgbiA+IDAAbmV3VG90YWwgPiAwAHdpZHRoID4gMABsaXN0LT5zaXplID4gMABkaWN0LT5zaXplID4gMABzcGwtPnNpemUgPiAwAHNlbGYtPnNpemUgPiAwAGJ6LnNpemUgPiAwAGluY3JlYXNlID4gMABib3VuZCA+IDAAZ3JhcGgtPndlaWdodHNbeF0gPiAwAGdyYXBoLT53ZWlnaHRzW25fZWRnZXNdID4gMABpbmRleCA+PSAwAHQgPj0gMABubm9kZXMgPj0gMABuX25vZGVzID49IDAAbl9vYnMgPj0gMABuID49IDAAbi0+bGV2ZWwgPj0gMABvcmlnaW5hbCA+PSAwAE1heHJhbmsgPj0gMABQYWNrID49IDAAaWkgPCAxPDxkaW0gJiYgaWkgPj0gMAB3aWR0aCA+PSAwAGpkaWFnID49IDAAaWRpYWcgPj0gMABkID49IDAAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdID49IDAgJiYgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID49IDAAViA+PSAwAGFnbm5vZGVzKGdyYXBoKSA+PSAwAGFnbm5vZGVzKGcpID49IDAARURfdHJlZV9pbmRleChlKSA+PSAwAEVEX2NvdW50KGUpID49IDAAb2JqcDEtPnN6LnggPT0gMCAmJiBvYmpwMS0+c3oueSA9PSAwAGNfY250ID09IDAAcmFua19yZXN1bHQgPT0gMABnZXR0aW1lb2ZkYXlfcmVzID09IDAAaiA9PSAwAE5EX2luKHJpZ2h0KS5zaXplICsgTkRfb3V0KHJpZ2h0KS5zaXplID09IDAAYS5zaGFwZSA9PSAwIHx8IGIuc2hhcGUgPT0gMABsaXN0LT5iYXNlICE9IE5VTEwgfHwgaW5kZXggPT0gMCB8fCBzdHJpZGUgPT0gMABkdHNpemUoZGVzdCkgPT0gMABkdHNpemUoZy0+bl9zZXEpID09IDAAZHRzaXplKGctPmdfc2VxKSA9PSAwAGR0c2l6ZShnLT5lX3NlcSkgPT0gMABHRF9taW5yYW5rKGcpID09IDAAZHRzaXplKGctPmdfaWQpID09IDAAZHRzaXplKGctPmVfaWQpID09IDAAY29zeCAhPSAwIHx8IHNpbnggIT0gMAByZXFfYWxpZ25tZW50ICE9IDAAbWVtY21wKCZzdHlsZSwgJihncmFwaHZpel9wb2x5Z29uX3N0eWxlX3QpezB9LCBzaXplb2Yoc3R5bGUpKSAhPSAwAHJlc3VsdCA9PSAoaW50KShzaXplIC0gMSkgfHwgcmVzdWx0IDwgMABtYXNrW2lpXSA8IDAATkRfaGVhcGluZGV4KHYpIDwgMABcLwBYMTEvAGd2UmVuZGVySm9icyAlczogJS4yZiBzZWNzLgAlLipzLgBzcGVjaWZpZWQgcm9vdCBub2RlICIlcyIgd2FzIG5vdCBmb3VuZC4AR3JhcGggJXMgaGFzIGFycmF5IHBhY2tpbmcgd2l0aCB1c2VyIHZhbHVlcyBidXQgbm8gInNvcnR2IiBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkLgAxLgAtMC4AJSFQUy1BZG9iZS0AJVBERi0APCEtLQAgLAArACoAc3RyZXEoYXB0ci0+dS5uYW1lLEtleSkAIWlzX2V4YWN0bHlfZXF1YWwoUi54LCBRLngpIHx8ICFpc19leGFjdGx5X2VxdWFsKFIueSwgUS55KQBORF9vcmRlcih2KSA8IE5EX29yZGVyKHcpAHUgPT0gVUZfZmluZCh1KQAhTElTVF9JU19FTVBUWShwbGlzdCkAZ3ZfbGlzdF9pc19jb250aWd1b3VzXygqbGlzdCkAb25lIDw9IExJU1RfU0laRShsaXN0KQBucCA8IExJU1RfU0laRShsaXN0KQBpc19wb3dlcl9vZl8yKGFsaWdubWVudCkAc3RkOjppc19oZWFwKGhlYXAuYmVnaW4oKSwgaGVhcC5lbmQoKSwgZ3QpACEocS0+cXRzKQAhTElTVF9JU19FTVBUWSgmbGVhdmVzKQBvbl9oZWFwKHIpAG5vZGVfc2V0X3NpemUoZy0+bl9pZCkgPT0gKHNpemVfdClkdHNpemUoZy0+bl9zZXEpAE5EX3JhbmsoZnJvbSkgPCBORF9yYW5rKHRvKQBub3Qgd2VsbC1mb3JtZWQgKGludmFsaWQgdG9rZW4pAGFnc3VicmVwKGcsbikAbiAhPSBORF9uZXh0KG4pAGZpbmRfZmFzdF9ub2RlKGcsIG4pAChudWxsKQAoIWpjbikgJiYgKCF2YWwpACEocS0+bCkAc3ltLT5pZCA+PSAwICYmIHN5bS0+aWQgPCB0b3BkaWN0c2l6ZShvYmopAExJU1RfU0laRSgmYXJyKSA9PSAoc2l6ZV90KWFnbm5vZGVzKHNnKQBtb3ZlIHRvICglLjBmLCAlLjBmKQA7IHNwbGluZSB0byAoJS4wZiwgJS4wZikAOyBsaW5lIHRvICglLjBmLCAlLjBmKQBTcGFyc2VNYXRyaXhfaXNfc3ltbWV0cmljKEEsIHRydWUpAHZhbHVlICYmIHN0cmxlbih2YWx1ZSkAU3BhcnNlTWF0cml4X2lzX3N5bW1ldHJpYyhBLCBmYWxzZSkAIXVzZV9zdGFnZSB8fCBzaXplIDw9IHNpemVvZihzdGFnZSkARURfbGFiZWwoZmUpACFUUkVFX0VER0UoZSkAIWNvbnN0cmFpbmluZ19mbGF0X2VkZ2UoZywgZSkAbm9kZV9zZXRfaXNfZW1wdHkoZy0+bl9pZCkAcl8lZCkAbF8lZCkAKGxpYikAIVNwYXJzZU1hdHJpeF9oYXNfZGlhZ29uYWwoQSkAIHNjYW5uaW5nIGEgSFRNTCBzdHJpbmcgKG1pc3NpbmcgJz4nPyBiYWQgbmVzdGluZz8gbG9uZ2VyIHRoYW4gJWQ/KQAgc2Nhbm5pbmcgYSBxdW90ZWQgc3RyaW5nIChtaXNzaW5nIGVuZHF1b3RlPyBsb25nZXIgdGhhbiAlZD8pACBzY2FubmluZyBhIC8qLi4uKi8gY29tbWVudCAobWlzc2luZyAnKi8/IGxvbmdlciB0aGFuICVkPykAZmFsbGJhY2soNCkAb25faGVhcChyMCkgfHwgb25faGVhcChyMSkAYWd0YWlsKGUpID09IFVGX2ZpbmQoYWd0YWlsKGUpKQBhZ2hlYWQoZSkgPT0gVUZfZmluZChhZ2hlYWQoZSkpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9nZXRfbmV4dF9idWZmZXIoKQBvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eWVuc3VyZV9idWZmZXJfc3RhY2soKQBzdHJlcShtb2RlLCAiciIpIHx8IHN0cmVxKG1vZGUsICJyYiIpIHx8IHN0cmVxKG1vZGUsICJ3IikgfHwgc3RyZXEobW9kZSwgIndiIikAcG5hbWUgIT0gTlVMTCAmJiAhc3RyZXEocG5hbWUsICIiKQBzZXRsaW5ld2lkdGgoACkgcm90YXRlKCVkKSB0cmFuc2xhdGUoACB0cmFuc2Zvcm09InNjYWxlKABOT1RBVElPTigAICgAIG5lYXIgJyVzJwAlbGYsJWxmLCVsZiwnJVteJ10nAGlzZGlnaXQoKGludClkb3RwWzFdKSAmJiBpc2RpZ2l0KChpbnQpZG90cFsyXSkgJiYgZG90cFszXSA9PSAnXDAnACYAJQAkAHVybCgjADx0ZXh0UGF0aCB4bGluazpocmVmPSIjADxhcmVhIHNoYXBlPSJwb2x5IgAgZmlsbD0iIyUwMnglMDJ4JTAyeCIAKHNlcSAmIFNFUV9NQVNLKSA9PSBzZXEgJiYgInNlcXVlbmNlIElEIG92ZXJmbG93IgBndl9zb3J0X2NvbXBhciA9PSBOVUxMICYmIGd2X3NvcnRfYXJnID09IE5VTEwgJiYgInVuc3VwcG9ydGVkIHJlY3Vyc2l2ZSBjYWxsIHRvIGd2X3NvcnQiAGd2X3NvcnRfY29tcGFyICE9IE5VTEwgJiYgIm5vIGNvbXBhcmF0b3Igc2V0IGluIGd2X3NvcnQiAG9wLT5vcC51LnBvbHlnb24uY250IDw9IElOVF9NQVggJiYgInBvbHlnb24gY291bnQgZXhjZWVkcyBndnJlbmRlcl9wb2x5Z29uIHN1cHBvcnQiACB0ZXh0LWFuY2hvcj0ic3RhcnQiAHAueCAhPSBhICYmICJjYW5ub3QgaGFuZGxlIGVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpbiBob3Jpem9udGFsIGV4dHJlbWUgcG9pbnQiAGZ1bGxfbGVuZ3RoX3dpdGhvdXRfc2hhZnQgPiAwICYmICJub24tcG9zaXRpdmUgZnVsbCBsZW5ndGggd2l0aG91dCBzaGFmdCIAPGFyZWEgc2hhcGU9InJlY3QiAHNpemUgPiAwICYmICJhdHRlbXB0IHRvIGFsbG9jYXRlIGFycmF5IG9mIDAtc2l6ZWQgZWxlbWVudHMiAGluZGV4IDwgc2VsZi0+c2l6ZV9iaXRzICYmICJvdXQgb2YgYm91bmRzIGFjY2VzcyIAaW5kZXggPCBzZWxmLnNpemVfYml0cyAmJiAib3V0IG9mIGJvdW5kcyBhY2Nlc3MiACpzMSAhPSAqczIgJiYgImR1cGxpY2F0ZSBzZXBhcmF0b3IgY2hhcmFjdGVycyIAR0RfbWlucmFuayhzdWJnKSA8PSBHRF9tYXhyYW5rKHN1YmcpICYmICJjb3JydXB0ZWQgcmFuayBib3VuZHMiAGluZGV4IDwgbGlzdC5zaXplICYmICJpbmRleCBvdXQgb2YgYm91bmRzIgAodWludHB0cl90KXMgJSAyID09IDAgJiYgImhlYXAgcG9pbnRlciB3aXRoIGxvdyBiaXQgc2V0IHdpbGwgY29sbGlkZSB3aXRoIGFub255bW91cyBJRHMiACAoKyU2bGQgYnl0ZXMgJXN8JXUsIHhtbHBhcnNlLmM6JWQpICUqcyIAIGZvbnQtZmFtaWx5PSIlcyIAIGZvbnQtd2VpZ2h0PSIlcyIAIGZpbGw9IiVzIgAgZm9udC1zdHJldGNoPSIlcyIAIGZvbnQtc3R5bGU9IiVzIgBiYWQgZWRnZSBsZW4gIiVzIgAgYmFzZWxpbmUtc2hpZnQ9InN1cGVyIgBhZ3hibGVuKHhiKSA8PSBzaXplb2YoeGItPnN0b3JlKSAmJiAiYWd4YnVmIGNvcnJ1cHRpb24iAGNlbGwucm93IDwgdGFibGUtPnJvd19jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiAGNlbGwuY29sIDwgdGFibGUtPmNvbHVtbl9jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiACB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgBmdWxsX2xlbmd0aCA+IDAgJiYgIm5vbi1wb3NpdGl2ZSBmdWxsIGxlbmd0aCIAZnVsbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIGZ1bGwgYmFzZSB3aWR0aCIAbm9taW5hbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIG5vbWluYWwgYmFzZSB3aWR0aCIAIiB3aWR0aD0iJWdweCIgaGVpZ2h0PSIlZ3B4IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0IiB4PSIlZyIgeT0iJWciACIgd2lkdGg9IiVncHgiIGhlaWdodD0iJWdweCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgeD0iJWciIHk9IiVnIgAgZm9udC1zaXplPSIlLjJmIgAgZmlsbC1vcGFjaXR5PSIlZiIAPHRleHQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIAaXNmaW5pdGUobSkgJiYgImVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpcyBpbmZpbml0ZSIAKHhiLT5sb2NhdGVkID09IEFHWEJVRl9PTl9IRUFQIHx8IHhiLT5sb2NhdGVkIDw9IHNpemVvZih4Yi0+c3RvcmUpKSAmJiAiY29ycnVwdGVkIGFneGJ1ZiB0eXBlIgBBLT50eXBlID09IHR5cGUgJiYgImNhbGwgdG8gU3BhcnNlTWF0cml4X2Nvb3JkaW5hdGVfZm9ybV9hZGRfZW50cnkgIiAid2l0aCBpbmNvbXBhdGlibGUgdmFsdWUgdHlwZSIAIHRleHQtYW5jaG9yPSJtaWRkbGUiADxhcmVhIHNoYXBlPSJjaXJjbGUiAGNlbGwtPnJvdyArIGNlbGwtPnJvd3NwYW4gPD0gdGFibGUtPnJvd19jb3VudCAmJiAiY2VsbCBzcGFucyBoaWdoZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBjZWxsLnJvdyArIGNlbGwucm93c3BhbiA8PSB0YWJsZS0+cm93X2NvdW50ICYmICJjZWxsIHNwYW5zIGhpZ2hlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwtPmNvbCArIGNlbGwtPmNvbHNwYW4gPD0gdGFibGUtPmNvbHVtbl9jb3VudCAmJiAiY2VsbCBzcGFucyB3aWRlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwuY29sICsgY2VsbC5jb2xzcGFuIDw9IHRhYmxlLT5jb2x1bW5fY291bnQgJiYgImNlbGwgc3BhbnMgd2lkZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBvbGRfbm1lbWIgPCBTSVpFX01BWCAvIHNpemUgJiYgImNsYWltZWQgcHJldmlvdXMgZXh0ZW50IGlzIHRvbyBsYXJnZSIAdGhldGEgPj0gMCAmJiB0aGV0YSA8PSBNX1BJICYmICJ0aGV0YSBvdXQgb2YgcmFuZ2UiAHRhYmxlLT5oZWlnaHRzID09IE5VTEwgJiYgInRhYmxlIGhlaWdodHMgY29tcHV0ZWQgdHdpY2UiAHRhYmxlLT53aWR0aHMgPT0gTlVMTCAmJiAidGFibGUgd2lkdGhzIGNvbXB1dGVkIHR3aWNlIgAgdGV4dC1hbmNob3I9ImVuZCIAIGZvbnQtd2VpZ2h0PSJib2xkIgAgZm9udC1zdHlsZT0iaXRhbGljIgAgYmFzZWxpbmUtc2hpZnQ9InN1YiIAXCIAbGxlbiA8PSBJTlRfTUFYICYmICJYTUwgdG9rZW4gdG9vIGxvbmcgZm9yIGV4cGF0IEFQSSIAIiByeT0iAF9wIiBzdGFydE9mZnNldD0iNTAlIj48dHNwYW4geD0iMCIgZHk9IgAiIGN5PSIAIiB5PSIAIiByeD0iACBjeD0iACB4PSIAIHRhcmdldD0iACBwb2ludHM9IgAgY29vcmRzPSIAIHRleHQtZGVjb3JhdGlvbj0iACBmaWxsPSIAIiBzdHJva2Utd2lkdGg9IgA8aW1hZ2UgeGxpbms6aHJlZj0iADw/eG1sLXN0eWxlc2hlZXQgaHJlZj0iACIgbmFtZT0iACB4bGluazp0aXRsZT0iACB0aXRsZT0iACIgc3Ryb2tlPSIAPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0iADxkZWZzPgo8cmFkaWFsR3JhZGllbnQgaWQ9IgA8bWFwIGlkPSIAPGcgaWQ9IgAgZD0iACIgeTI9IgAiIHgyPSIAIiB5MT0iAHgxPSIAIHZpZXdCb3g9IiVkLjAwICVkLjAwICVkLjAwICVkLjAwIgAgdHJhbnNmb3JtPSJyb3RhdGUoJWQgJWcgJWcpIgBhZ3hibGVuKCZjdHgtPlNidWYpID09IDAgJiYgInBlbmRpbmcgc3RyaW5nIGRhdGEgdGhhdCB3YXMgbm90IGNvbnN1bWVkIChtaXNzaW5nICIgImVuZHN0cigpL2VuZGh0bWxzdHIoKT8pIgAgYWx0PSIiAEN5Y2xlIEVycm9yIQBQdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbGVkIQA8IS0tIEdlbmVyYXRlZCBieSAAJXMlenUgLSMlMDJ4JTAyeCUwMnglMDJ4IAAlcyV6dSAtIyUwMnglMDJ4JTAyeCAAJWMgJXp1IAB0ICV1IAAgY3JlYXRlIHRleHQgAHhMYXlvdXQgAGRlZmF1bHQgAHN0cmljdCAAJXMlenUgLSVzIAAgLXNtb290aCBiZXppZXIgACBtb3ZldG8gACB2ZXJzaW9uIAAgY3JlYXRlIHBvbHlnb24gACAtdGV4dCB7JXN9IC1maWxsIAAgY3JlYXRlIG92YWwgACAtd2lkdGggAG5ld3BhdGggAGdyYXBoIABzLCUuNWcsJS41ZyAAJS41ZywlLjVnLCUuNWcsJS41ZyAAZSwlLjVnLCUuNWcgACVnICVnIAAlLjAzbGYgACUuM2YgACVkICVkICVkICVkICVkICVkICUuMWYgJS40ZiAlZCAlLjFmICUuMWYgJS4wZiAlLjBmIAAgLW91dGxpbmUgACBjcmVhdGUgbGluZSAAbm9kZSAAW0dyYXBodml6XSAlczolZDogJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgACVkIABUb3RhbCBzaXplID4gMSBpbiAiJXMiIGNvbG9yIHNwZWMgAFsgL1JlY3QgWyAAVCAAUyAAT1BFTiAASSAARiAARSAAQyAAIC0+IABSYW5rIHNlcGFyYXRpb24gPSAAVW5zYXRpc2ZpZWQgY29uc3RyYWludDogAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzOiAAJXM6IABTb2x2aW5nIG1vZGVsOiAAU2V0dGluZyB1cCBzcHJpbmcgbW9kZWw6IABjb252ZXJ0IGdyYXBoOiAAIFRpdGxlOiAAInRleHQiOiAAeyJmcmFjIjogJS4wM2YsICJjb2xvciI6IAAibmFtZSI6IAAic3R5bGUiOiAAImZhY2UiOiAAMiAAPCEtLSAAIC0tIAAlIABfcCIgAGxfJWQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAADSAgICAgICAgICAgICAgICBpdGVyID0gJWQsIHN0ZXAgPSAlZiBGbm9ybSA9ICVmIG56ID0gJXp1ICBLID0gJWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgAAogICAgADoJIAAgICAgJXN9CgB0cnlpbmcgdG8gYWRkIHRvIHJlY3QgeyVmICsvLSAlZiwgJWYgKy8tICVmfQoAI2RlZmF1bHQgeyBmaW5pc2ggeyBhbWJpZW50IDAuMSBkaWZmdXNlIDAuOSB9IH0KAHBpZ21lbnQgeyBjb2xvciAlcyB9CgBsaWdodF9zb3VyY2UgeyA8MTUwMCwzMDAwLC0yNTAwPiBjb2xvciBXaGl0ZSB9CgBnbG9iYWxfc2V0dGluZ3MgeyBhc3N1bWVkX2dhbW1hIDEuMCB9CgAgICAgdGV4dHVyZSBJbWFnZVRleHR1cmUgeyB1cmwgIiVzIiB9CgAgICAgfQoALy9za3kKcGxhbmUgeyA8MCwgMSwgMD4sIDEgaG9sbG93CiAgICB0ZXh0dXJlIHsKICAgICAgICBwaWdtZW50IHsgYm96byB0dXJidWxlbmNlIDAuOTUKICAgICAgICAgICAgY29sb3JfbWFwIHsKICAgICAgICAgICAgICAgIFswLjAwIHJnYiA8MC4wNSwgMC4yMCwgMC41MD5dCiAgICAgICAgICAgICAgICBbMC41MCByZ2IgPDAuMDUsIDAuMjAsIDAuNTA+XQogICAgICAgICAgICAgICAgWzAuNzUgcmdiIDwxLjAwLCAxLjAwLCAxLjAwPl0KICAgICAgICAgICAgICAgIFswLjc1IHJnYiA8MC4yNSwgMC4yNSwgMC4yNT5dCiAgICAgICAgICAgICAgICBbMS4wMCByZ2IgPDAuNTAsIDAuNTAsIDAuNTA+XQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNjYWxlIDwxLjAwLCAxLjAwLCAxLjUwPiAqIDIuNTAKICAgICAgICAgICAgdHJhbnNsYXRlIDwwLjAwLCAwLjAwLCAwLjAwPgogICAgICAgIH0KICAgICAgICBmaW5pc2ggeyBhbWJpZW50IDEgZGlmZnVzZSAwIH0KICAgIH0KICAgIHNjYWxlIDEwMDAwCn0KLy9taXN0CmZvZyB7IGZvZ190eXBlIDIKICAgIGRpc3RhbmNlIDUwCiAgICBjb2xvciByZ2IgPDEuMDAsIDEuMDAsIDEuMDA+ICogMC43NQogICAgZm9nX29mZnNldCAwLjEwCiAgICBmb2dfYWx0IDEuNTAKICAgIHR1cmJ1bGVuY2UgMS43NQp9Ci8vZ25kCnBsYW5lIHsgPDAuMDAsIDEuMDAsIDAuMDA+LCAwCiAgICB0ZXh0dXJlIHsKICAgICAgICBwaWdtZW50eyBjb2xvciByZ2IgPDAuMjUsIDAuNDUsIDAuMDA+IH0KICAgICAgICBub3JtYWwgeyBidW1wcyAwLjc1IHNjYWxlIDAuMDEgfQogICAgICAgIGZpbmlzaCB7IHBob25nIDAuMTAgfQogICAgfQp9CgBjYW1lcmEgeyBsb2NhdGlvbiA8JS4zZiAsICUuM2YgLCAtNTAwLjAwMD4KICAgICAgICAgbG9va19hdCAgPCUuM2YgLCAlLjNmICwgMC4wMDA+CiAgICAgICAgIHJpZ2h0IHggKiBpbWFnZV93aWR0aCAvIGltYWdlX2hlaWdodAogICAgICAgICBhbmdsZSAlLjNmCn0KACAgICBtYXRlcmlhbCBNYXRlcmlhbCB7CgBTaGFwZSB7CgAgIGFwcGVhcmFuY2UgQXBwZWFyYW5jZSB7CgAvdXNlcl9zaGFwZV8lZCB7CgBncmFwaCBHIHsKAGFycm93aGVhZCA9IDcgJXMgbm90IHVzZWQgYnkgZ3JhcGh2aXoKAGJveHJhZCA9IDAgJXMgbm8gcm91bmRlZCBjb3JuZXJzIGluIGdyYXBodml6CgBvdXQgb2YgbWVtb3J5CgAlczogY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeQoAR3JhcGh2aXogYnVpbHQgd2l0aG91dCBhbnkgdHJpYW5ndWxhdGlvbiBsaWJyYXJ5CgByZW1vdmVfb3ZlcmxhcDogR3JhcGh2aXogbm90IGJ1aWx0IHdpdGggdHJpYW5ndWxhdGlvbiBsaWJyYXJ5CgAlcyBmaWxsIGhhcyBubyBtZWFuaW5nIGluIERXQiAyLCBncGljIGNhbiB1c2UgZmlsbCBvciBmaWxsZWQsIDEwdGggRWRpdGlvbiB1c2VzIGZpbGwgb25seQoAYm94cmFkPTIuMCAlcyB3aWxsIGJlIHJlc2V0IHRvIDAuMCBieSBncGljIG9ubHkKACVkICVkICMlMDJ4JTAyeCUwMngKAEhlYXAgb3ZlcmZsb3cKAHRleHQgewogICAgdHRmICIlcyIsCiAgICAiJXMiLCAlLjNmLCAlLjNmCiAgICAgICAgbm9fc2hhZG93CgAlZCAlZCAlZCAlLjBmICVkICVkICVkICVkICVkICUuMWYgJWQgJWQgJWQgJWQgJWQgJXp1CgB0b3RhbCBhZGRlZCBzbyBmYXIgPSAlenUKAHJvb3QgPSAlcyBtYXggc3RlcHMgdG8gcm9vdCA9ICVsbHUKAC5wcyAlLjBmKlxuKFNGdS8lLjBmdQoAICBtYXJnaW4gJXUKAE51bWJlciBvZiBpdGVyYXRpb25zID0gJXUKAG92ZXJsYXAgWyV1XSA6ICV1CgAgJXMgYWxpZ25lZHRleHQKAGxheWVycyBub3Qgc3VwcG9ydGVkIGluICVzIG91dHB1dAoAYWRkX3RyZWVfZWRnZTogZW1wdHkgb3V0ZWRnZSBsaXN0CgBhZGRfdHJlZV9lZGdlOiBlbXB0eSBpbmVkZ2UgbGlzdAoATm8gbGlieiBzdXBwb3J0CgAlcyAuUFMgdy9vIGFyZ3MgY2F1c2VzIEdOVSBwaWMgdG8gc2NhbGUgZHJhd2luZyB0byBmaXQgOC41eDExIHBhcGVyOyBEV0IgZG9lcyBub3QKACVzIEdOVSBwaWMgc3VwcG9ydHMgYSBsaW5ldGhpY2sgdmFyaWFibGUgdG8gc2V0IGxpbmUgdGhpY2tuZXNzOyBEV0IgYW5kIDEwdGggRWQuIGRvIG5vdAoAJXMgR05VIHBpYyBzdXBwb3J0cyBhIGJveHJhZCB2YXJpYWJsZSB0byBkcmF3IGJveGVzIHdpdGggcm91bmRlZCBjb3JuZXJzOyBEV0IgYW5kIDEwdGggRWQuIGRvIG5vdAoAIC8lcyBzZXRfZm9udAoAJXMlLipzIGlzIG5vdCBhIHRyb2ZmIGZvbnQKAGNlbGwgc2l6ZSB0b28gc21hbGwgZm9yIGNvbnRlbnQKAHRhYmxlIHNpemUgdG9vIHNtYWxsIGZvciBjb250ZW50CgAlJUVuZERvY3VtZW50CgBVbmNsb3NlZCBjb21tZW50CgBMYWJlbCBjbG9zZWQgYmVmb3JlIGVuZCBvZiBIVE1MIGVsZW1lbnQKAFBvcnRyYWl0CgBmaXhlZCBjZWxsIHNpemUgd2l0aCB1bnNwZWNpZmllZCB3aWR0aCBvciBoZWlnaHQKAGZpeGVkIHRhYmxlIHNpemUgd2l0aCB1bnNwZWNpZmllZCB3aWR0aCBvciBoZWlnaHQKAHBvcyBhdHRyaWJ1dGUgZm9yIGVkZ2UgKCVzLCVzKSBkb2Vzbid0IGhhdmUgM24rMSBwb2ludHMKACAgZ2VuZXJhdGVkICVkIGNvbnN0cmFpbnRzCgBzcGxpbmVzIGFuZCBjbHVzdGVyIGVkZ2VzIG5vdCBzdXBwb3J0ZWQgLSB1c2luZyBsaW5lIHNlZ21lbnRzCgBvYmplY3RzCgBXYXJuaW5nOiBub2RlICVzLCBwb3NpdGlvbiAlcywgZXhwZWN0ZWQgdHdvIGZsb2F0cwoAZm9udCBuYW1lICVzIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBtYXkgbm90IGJlIGFjY2VwdGVkIGJ5IHNvbWUgUFMgdmlld2VycwoAZm9udCBuYW1lICVzIGlzIGxvbmdlciB0aGFuIDI5IGNoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHJlamVjdGVkIGJ5IHNvbWUgUFMgdmlld2VycwoAY2Fubm90IGFsbG9jYXRlIHBzCgBzY2FsZT0xLjAgJXMgcmVxdWlyZWQgZm9yIGNvbXBhcmlzb25zCgBTZXR0aW5nIGluaXRpYWwgcG9zaXRpb25zCgAlcyBEV0IgMiBjb21wYXRpYmlsaXR5IGRlZmluaXRpb25zCgBhcnJheSBwYWNraW5nOiAlcyAlenUgcm93cyAlenUgY29sdW1ucwoAc3ludGF4IGFtYmlndWl0eSAtIGJhZGx5IGRlbGltaXRlZCBudW1iZXIgJyVzJyBpbiBsaW5lICVkIG9mICVzIHNwbGl0cyBpbnRvIHR3byB0b2tlbnMKAGVkZ2UgbGFiZWxzIHdpdGggc3BsaW5lcz1jdXJ2ZWQgbm90IHN1cHBvcnRlZCBpbiBkb3QgLSB1c2UgeGxhYmVscwoAZmxhdCBlZGdlIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgb25lIG9mIHdoaWNoIGhhcyBhIHJlY29yZCBzaGFwZSAtIHJlcGxhY2UgcmVjb3JkcyB3aXRoIEhUTUwtbGlrZSBsYWJlbHMKAG91dCBvZiBtZW1vcnkgd2hlbiB0cnlpbmcgdG8gYWxsb2NhdGUgJXp1IGJ5dGVzCgBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gdHJ5aW5nIHRvIGFsbG9jYXRlICV6dSAqICV6dSBieXRlcwoAdXBkYXRlOiBtaXNtYXRjaGVkIGxjYSBpbiB0cmVldXBkYXRlcwoAZ3JhcGggJXMsIGNvb3JkICVzLCBleHBlY3RlZCBmb3VyIGRvdWJsZXMKAG5vZGUgJXMsIHBvc2l0aW9uICVzLCBleHBlY3RlZCB0d28gZG91YmxlcwoARm91bmQgJWQgRGlHLUNvTGEgYm91bmRhcmllcwoASW5jaGVzCgAoJTR6dSkgJTd6dSBub2RlcyAlN3p1IGVkZ2VzCgBjb21wb3VuZEVkZ2VzOiBjb3VsZCBub3QgY29uc3RydWN0IG9ic3RhY2xlcyAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgB0aGUgYm91bmRpbmcgYm94ZXMgb2Ygc29tZSBub2RlcyB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBjb21wb3VuZEVkZ2VzOiBub2RlcyB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBzb21lIG5vZGVzIHdpdGggbWFyZ2luICglLjAyZiwlLjAyZikgdG91Y2ggLSBmYWxsaW5nIGJhY2sgdG8gc3RyYWlnaHQgbGluZSBlZGdlcwoAbWVyZ2UyOiBncmFwaCAlcywgcmFuayAlZCBoYXMgb25seSAlZCA8ICVkIG5vZGVzCgBTY2FubmluZyBncmFwaCAlcywgJWQgbm9kZXMKAFdhcm5pbmc6IG5vIGhhcmQtY29kZWQgbWV0cmljcyBmb3IgJyVzJy4gIEZhbGxpbmcgYmFjayB0byAnVGltZXMnIG1ldHJpY3MKAGluIGVkZ2UgJXMlcyVzCgBVc2luZyAlczogJXM6JXMKAEZvcm1hdDogIiVzIiBub3QgcmVjb2duaXplZC4gVXNlIG9uZSBvZjolcwoATGF5b3V0IHR5cGU6ICIlcyIgbm90IHJlY29nbml6ZWQuIFVzZSBvbmUgb2Y6JXMKAGxheW91dCAlcwoALmZ0ICVzCgBiYWQgbGFiZWwgZm9ybWF0ICVzCgBpbiByb3V0ZXNwbGluZXMsIGVkZ2UgaXMgYSBsb29wIGF0ICVzCgAgICAgICAgJTdkIG5vZGVzICU3ZCBlZGdlcyAlN3p1IGNvbXBvbmVudHMgJXMKAGluIGxhYmVsIG9mIGVkZ2UgJXMgJXMgJXMKACAgRWRnZSAlcyAlcyAlcwoAb3J0aG8gJXMgJXMKAHBvbHlsaW5lICVzICVzCgBzcGxpbmUgJXMgJXMKAHJlY3RhbmdsZSAoJS4wZiwlLjBmKSAoJS4wZiwlLjBmKSAlcyAlcwoAaW4gY2x1c3RlciAlcwoAJXMgd2FzIGFscmVhZHkgaW4gYSByYW5rc2V0LCBkZWxldGVkIGZyb20gY2x1c3RlciAlcwoAJXMgLT4gJXM6IHRhaWwgbm90IGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiBoZWFkIGlzIGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKAGhlYWQgY2x1c3RlciAlcyBpbnNpZGUgdGFpbCBjbHVzdGVyICVzCgBoZWFkIG5vZGUgJXMgaW5zaWRlIHRhaWwgY2x1c3RlciAlcwoAJXMgLT4gJXM6IGhlYWQgbm90IGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiB0YWlsIGlzIGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKAHRhaWwgY2x1c3RlciAlcyBpbnNpZGUgaGVhZCBjbHVzdGVyICVzCgB0YWlsIG5vZGUgJXMgaW5zaWRlIGhlYWQgY2x1c3RlciAlcwoAVW5oYW5kbGVkIGFkanVzdCBvcHRpb24gJXMKAHJlcG9zaXRpb24gJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggeGxhYmVsICVzCgBubyBwb3NpdGlvbiBmb3IgZWRnZSB3aXRoIHRhaWwgbGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggbGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggaGVhZCBsYWJlbCAlcwoALy8qKiogYmVnaW5fZ3JhcGggJXMKAE1heC4gaXRlcmF0aW9ucyAoJWQpIHJlYWNoZWQgb24gZ3JhcGggJXMKAENvdWxkIG5vdCBwYXJzZSAiX2JhY2tncm91bmQiIGF0dHJpYnV0ZSBpbiBncmFwaCAlcwoAaW4gbGFiZWwgb2YgZ3JhcGggJXMKAENyZWF0aW5nIGVkZ2VzIHVzaW5nICVzCgBBZGp1c3RpbmcgJXMgdXNpbmcgJXMKACVzIHdoaWxlIG9wZW5pbmcgJXMKAGRlcml2ZSBncmFwaCBfZGdfJWQgb2YgJXMKACBdICAlenUgdHJ1ZSAlcwoAXSAgJWQgdHJ1ZSAlcwoAIF0gICV6dSBmYWxzZSAlcwoAXSAgJWQgZmFsc2UgJXMKAG1ha2VQb2x5OiB1bmtub3duIHNoYXBlIHR5cGUgJXMKAG1ha2VBZGRQb2x5OiB1bmtub3duIHNoYXBlIHR5cGUgJXMKAHVzaW5nICVzIGZvciB1bmtub3duIHNoYXBlICVzCgAgIG9jdHJlZSBzY2hlbWUgJXMKAGNhbid0IG9wZW4gbGlicmFyeSBmaWxlICVzCgBjYW4ndCBmaW5kIGxpYnJhcnkgZmlsZSAlcwoAQm91bmRpbmdCb3ggbm90IGZvdW5kIGluIGVwc2YgZmlsZSAlcwoAY291bGRuJ3Qgb3BlbiBlcHNmIGZpbGUgJXMKAGNvdWxkbid0IHJlYWQgZnJvbSBlcHNmIGZpbGUgJXMKAGluIG5vZGUgJXMKAHNoYXBlZmlsZSBub3Qgc2V0IG9yIG5vdCBmb3VuZCBmb3IgZXBzZiBub2RlICVzCgBpbiBsYWJlbCBvZiBub2RlICVzCgBlbmQgJXMKAHJhbmtpbmc6IGZhaWx1cmUgdG8gY3JlYXRlIHN0cm9uZyBjb25zdHJhaW50IGVkZ2UgYmV0d2VlbiBub2RlcyAlcyBhbmQgJXMKAG9vcHMsIGludGVybmFsIGVycm9yOiB1bmhhbmRsZWQgY29sb3IgdHlwZT0lZCAlcwoAJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJS4xZiAlZCAlZCAlZCAlZCAlZCAlZAogJWQgJXMKAC8vKioqIHRleHRzcGFuOiAlcywgZm9udHNpemUgPSAlLjNmLCBmb250bmFtZSA9ICVzCgB0cmllcyA9ICVkLCBtb2RlID0gJXMKAC8vKioqIGNvbW1lbnQ6ICVzCgBmYWlsZWQgdG8gcmVzZXJ2ZSAlenUgZWxlbWVudHMgb2Ygc2l6ZSAlenUgYnl0ZXM6ICVzCgBmb250bmFtZTogIiVzIiByZXNvbHZlZCB0bzogJXMKACUlJSVQYWdlT3JpZW50YXRpb246ICVzCgBkZWxhdW5heV90cmlhbmd1bGF0aW9uOiAlcwoAZGVsYXVuYXlfdHJpOiAlcwoAZ3ZwcmludGY6ICVzCgBuZXN0aW5nIG5vdCBhbGxvd2VkIGluIHN0eWxlOiAlcwoAdW5tYXRjaGVkICcpJyBpbiBzdHlsZTogJXMKAHVubWF0Y2hlZCAnKCcgaW4gc3R5bGU6ICVzCgAlJSUlVGl0bGU6ICVzCgAlcyBUaXRsZTogJXMKACMgVGl0bGU6ICVzCgAvLyoqKiBiZWdpbl9ub2RlOiAlcwoAbGliL3BhdGhwbGFuLyVzOiVkOiAlcwoAZ3JpZCglZCwlZCk6ICVzCgBDb3VsZCBub3Qgb3BlbiAiJXMiIGZvciB3cml0aW5nIDogJXMKAHN0YXJ0IHBvcnQ6ICglLjVnLCAlLjVnKSwgdGFuZ2VudCBhbmdsZTogJS41ZywgJXMKAGVuZCBwb3J0OiAoJS41ZywgJS41ZyksIHRhbmdlbnQgYW5nbGU6ICUuNWcsICVzCgAgWyV6dV0gJXAgc2V0ICVkICglLjAyZiwlLjAyZikgKCUuMDJmLCUuMDJmKSAlcwoAJSUgJXMKACMgJXMKACAgbW9kZSAgICVzCgBsaXN0IGVsZW1lbnQgdHlwZSBpcyBub3QgYSBwb2ludGVyLCBidXQgYGZyZWVgIHVzZWQgYXMgZGVzdHJ1Y3RvcgoAY29uanVnYXRlX2dyYWRpZW50OiB1bmV4cGVjdGVkIGxlbmd0aCAwIHZlY3RvcgoAJXMgdG8gY2hhbmdlIGRyYXdpbmcgc2l6ZSwgbXVsdGlwbHkgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb24gdGhlIC5QUyBsaW5lIGFib3ZlIGFuZCB0aGUgbnVtYmVyIG9uIHRoZSB0d28gbGluZXMgYmVsb3cgKHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlcikgYnkgYSBzY2FsZSBmYWN0b3IKAGFkZF9zZWdtZW50OiBlcnJvcgoAJS41ZyAlLjVnICUuNWcgJXNjb2xvcgoAMCAwIDAgZWRnZWNvbG9yCgAwLjggMC44IDAuOCBzZXRyZ2Jjb2xvcgoAMCAwIDEgc2V0cmdiY29sb3IKADEgMCAwIHNldHJnYmNvbG9yCgAwIDAgMCBzZXRyZ2Jjb2xvcgoAJWQgJWQgc2V0bGF5ZXIKAC8vKioqIGVuZF9sYXllcgoAVVRGLTggaW5wdXQgdXNlcyBub24tTGF0aW4xIGNoYXJhY3RlcnMgd2hpY2ggY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhpcyBQb3N0U2NyaXB0IGRyaXZlcgoATGV0dGVyCgAvLyoqKiBiZWdpbl9jbHVzdGVyCgAvLyoqKiBlbmRfY2x1c3RlcgoAcmVtb3ZpbmcgZW1wdHkgY2x1c3RlcgoAQ2VudGVyCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlciAldS4gRmFsbGluZyBiYWNrIHRvIHdpZHRoIG9mIHNwYWNlIGNoYXJhY3RlcgoAYmFzZSByZWZlcmVyCgAlJVBhZ2VUcmFpbGVyCgAlJVRyYWlsZXIKAC8vKioqIGJlemllcgoAIiVzIiB3YXMgbm90IGZvdW5kIGFzIGEgZmlsZSBvciBhcyBhIHNoYXBlIGxpYnJhcnkgbWVtYmVyCgBzdG9wCgAgY3VydmV0bwoAbmV3cGF0aCAlLjBmICUuMGYgbW92ZXRvCgAlLjBmICUuMGYgbGluZXRvCgAgbGF5b3V0PW5lYXRvCgBub2RlICVzIGluIGdyYXBoICVzIGhhcyBubyBwb3NpdGlvbgoAJXMgbWF4cHNodCBhbmQgbWF4cHN3aWQgaGF2ZSBubyBtZWFuaW5nIGluIERXQiAyLjAsIHNldCBwYWdlIGJvdW5kYXJpZXMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaGFzIG5vIG1lYW5pbmcgaW4gRFdCIDIsIGFycm93aGVhZCA9IDcgbWFrZXMgZmlsbGVkIGFycm93aGVhZHMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaXMgdW5kZWZpbmVkIGluIERXQiAyLCBpbml0aWFsbHkgMSBpbiBncGljLCAyIGluIDEwdGggRWRpdGlvbgoAbWFqb3JpemF0aW9uCgAvLyoqKiBwb2x5Z29uCgBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyBlZGdlIHdlaWdodCBzdW0KAHNmZHAgb25seSBzdXBwb3J0cyBzdGFydD1yYW5kb20KAG5vZGUgcG9zaXRpb25zIGFyZSBpZ25vcmVkIHVubGVzcyBzdGFydD1yYW5kb20KAGNsb3NlcGF0aCBmaWxsCgAgZWxsaXBzZV9wYXRoIGZpbGwKACAgJS4wZiAlLjBmIGNlbGwKACVmICVmICVmICVmIGNlbGwKAGdyYXBoICVzIGlzIGRpc2Nvbm5lY3RlZC4gSGVuY2UsIHRoZSBjaXJjdWl0IG1vZGVsCgBncmFwaCBpcyBkaXNjb25uZWN0ZWQuIEhlbmNlLCB0aGUgY2lyY3VpdCBtb2RlbAoAZWRnZXMgaW4gZ3JhcGggJXMgaGF2ZSBubyBsZW4gYXR0cmlidXRlLiBIZW5jZSwgdGhlIG1kcyBtb2RlbAoAY2lyY3VpdCBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG1kcyBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG5vZGUgJyVzJywgZ3JhcGggJyVzJyBzaXplIHRvbyBzbWFsbCBmb3IgbGFiZWwKACVzIERXQiAyIGRvZXNuJ3QgdXNlIGZpbGwgYW5kIGRvZXNuJ3QgZGVmaW5lIGZpbGx2YWwKAFsge0NhdGFsb2d9IDw8IC9VUkkgPDwgL0Jhc2UgJXMgPj4gPj4KL1BVVCBwZGZtYXJrCgBbIC9Dcm9wQm94IFslZCAlZCAlZCAlZF0gL1BBR0VTIHBkZm1hcmsKACAgL0JvcmRlciBbIDAgMCAwIF0KICAvQWN0aW9uIDw8IC9TdWJ0eXBlIC9VUkkgL1VSSSAlcyA+PgogIC9TdWJ0eXBlIC9MaW5rCi9BTk4gcGRmbWFyawoAdHJvdWJsZSBpbiBpbml0X3JhbmsKAGxpbmV0aGljayA9IDA7IG9sZGxpbmV0aGljayA9IGxpbmV0aGljawoAIHNldGxpbmV3aWR0aAoAZ3NhdmUKJWQgJWQgJWQgJWQgYm94cHJpbSBjbGlwIG5ld3BhdGgKAGdzYXZlICVnICVnIHRyYW5zbGF0ZSBuZXdwYXRoCgAvLyoqKiBlbmRfZ3JhcGgKAGxheW91dCBhdHRyaWJ1dGUgaXMgaW52YWxpZCBleGNlcHQgb24gdGhlIHJvb3QgZ3JhcGgKAGluIGNoZWNrcGF0aCwgYm94ZXMgJXp1IGFuZCAlenUgZG9uJ3QgdG91Y2gKAG1lcmdlX29uZXdheSBnbGl0Y2gKACVzIGRvbid0IGNoYW5nZSBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaW4gdGhpcyBkcmF3aW5nCgBOb2RlIG5vdCBhZGphY2VudCB0byBjZWxsIC0tIEFib3J0aW5nCgBpbmNvbXBhcmFibGUgc2VnbWVudHMgISEgLS0gQWJvcnRpbmcKAEFsdGVybmF0aXZlbHksIGNvbnNpZGVyIHJ1bm5pbmcgbmVhdG8gdXNpbmcgLUdwYWNrPXRydWUgb3IgZGVjb21wb3NpbmcKAGxhYmVsX3NjaGVtZSA9ICVkID4gNCA6IGlnbm9yaW5nCgBndnJlbmRlcl9zZXRfc3R5bGU6IHVuc3VwcG9ydGVkIHN0eWxlICVzIC0gaWdub3JpbmcKAEFycm93IHR5cGUgIiVzIiB1bmtub3duIC0gaWdub3JpbmcKAGZkcCBkb2VzIG5vdCBzdXBwb3J0IHN0YXJ0PXNlbGYgLSBpZ25vcmluZwoAJXMgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgMSBvciAyIC0gaWdub3JpbmcKAE1vcmUgdGhhbiAyIGNvbG9ycyBzcGVjaWZpZWQgZm9yIGEgZ3JhZGllbnQgLSBpZ25vcmluZyByZW1haW5pbmcKAGFzIHJlcXVpcmVkIGJ5IHRoZSAtbiBmbGFnCgBiYlslc10gJS41ZyAlLjVnICUuNWcgJS41ZwoAL3BhdGhib3ggewogICAgL1kgZXhjaCAlLjVnIHN1YiBkZWYKICAgIC9YIGV4Y2ggJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCAlLjVnIHN1YiBkZWYKICAgIG5ld3BhdGggeCB5IG1vdmV0bwogICAgWCB5IGxpbmV0bwogICAgWCBZIGxpbmV0bwogICAgeCBZIGxpbmV0bwogICAgY2xvc2VwYXRoIHN0cm9rZQogfSBkZWYKL2RiZ3N0YXJ0IHsgZ3NhdmUgJS41ZyAlLjVnIHRyYW5zbGF0ZSB9IGRlZgovYXJyb3dsZW5ndGggMTAgZGVmCi9hcnJvd3dpZHRoIGFycm93bGVuZ3RoIDIgZGl2IGRlZgovYXJyb3doZWFkIHsKICAgIGdzYXZlCiAgICByb3RhdGUKICAgIGN1cnJlbnRwb2ludAogICAgbmV3cGF0aAogICAgbW92ZXRvCiAgICBhcnJvd2xlbmd0aCBhcnJvd3dpZHRoIDIgZGl2IHJsaW5ldG8KICAgIDAgYXJyb3d3aWR0aCBuZWcgcmxpbmV0bwogICAgY2xvc2VwYXRoIGZpbGwKICAgIGdyZXN0b3JlCn0gYmluZCBkZWYKL21ha2VhcnJvdyB7CiAgICBjdXJyZW50cG9pbnQgZXhjaCBwb3Agc3ViIGV4Y2ggY3VycmVudHBvaW50IHBvcCBzdWIgYXRhbgogICAgYXJyb3doZWFkCn0gYmluZCBkZWYKL3BvaW50IHsgICAgbmV3cGF0aCAgICAyIDAgMzYwIGFyYyBmaWxsfSBkZWYvbWFrZXZlYyB7CiAgICAvWSBleGNoIGRlZgogICAgL1ggZXhjaCBkZWYKICAgIC95IGV4Y2ggZGVmCiAgICAveCBleGNoIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIFkgbGluZXRvIHN0cm9rZQogICAgWCBZIG1vdmV0bwogICAgeCB5IG1ha2VhcnJvdwp9IGRlZgoAL3BhdGhib3ggewogICAgL1ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAvWSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIHkgbGluZXRvCiAgICBYIFkgbGluZXRvCiAgICB4IFkgbGluZXRvCiAgICBjbG9zZXBhdGggc3Ryb2tlCn0gZGVmCgAlIVBTLUFkb2JlLTIuMAovbm9kZSB7CiAgL1kgZXhjaCBkZWYKICAvWCBleGNoIGRlZgogIC95IGV4Y2ggZGVmCiAgL3ggZXhjaCBkZWYKICBuZXdwYXRoCiAgeCB5IG1vdmV0bwogIHggWSBsaW5ldG8KICBYIFkgbGluZXRvCiAgWCB5IGxpbmV0bwogIGNsb3NlcGF0aCBmaWxsCn0gZGVmCi9jZWxsIHsKICAvWSBleGNoIGRlZgogIC9YIGV4Y2ggZGVmCiAgL3kgZXhjaCBkZWYKICAveCBleGNoIGRlZgogIG5ld3BhdGgKICB4IHkgbW92ZXRvCiAgeCBZIGxpbmV0bwogIFggWSBsaW5ldG8KICBYIHkgbGluZXRvCiAgY2xvc2VwYXRoIHN0cm9rZQp9IGRlZgoAfSBiaW5kIGRlZgoALlBTICUuNWYgJS41ZgoAb3ZlcmxhcDogJXMgdmFsdWUgJWQgc2NhbGluZyAlLjA0ZgoAICBiZWF1dGlmeV9sZWF2ZXMgJWQgbm9kZSB3ZWlnaHRzICVkIHJvdGF0aW9uICUuMDNmCgAgIHJlcHVsc2l2ZSBleHBvbmVudDogJS4wM2YKACAgSyA6ICUuMDNmIEMgOiAlLjAzZgoAJXMgJS4zZgoACmludGVyc2VjdGlvbiBhdCAlLjNmICUuM2YKACAgICBzY2FsZSAlLjNmCgB0b3J1cyB7ICUuM2YsICUuM2YKACAgICA8JTkuM2YsICU5LjNmLCAlOS4zZj4sICUuM2YKACBpbiAlcyAtIHNldHRpbmcgdG8gJS4wMmYKAGNpcmNsZSAlcyAlLjBmLCUuMGYsJS4wZgoAcmVjdCAlcyAlLjBmLCUuMGYgJS4wZiwlLjBmCgAlZCAlZCAlZCAlLjBmICVkICVkICVkICVkICVkICUuM2YgJWQgJS40ZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYKACAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmCgAlJSUlUGFnZTogMSAxCiUlJSVQYWdlQm91bmRpbmdCb3g6ICUuMGYgJS4wZiAlLjBmICUuMGYKAHBvc1slenVdICUuMGYgJS4wZgoALm5yIFNGICUuMGYKc2NhbGV0aGlja25lc3MgPSAlLjBmCgAlcyBzYXZlIHBvaW50IHNpemUgYW5kIGZvbnQKLm5yIC5TIFxuKC5zCi5uciBERiBcbiguZgoAc2hvd3BhZ2UKJSUlJVRyYWlsZXIKJSUlJUJvdW5kaW5nQm94OiAlLmYgJS5mICUuZiAlLmYKAGFkZGluZyAlenUgaXRlbXMsIHRvdGFsIGFyZWEgPSAlZiwgdyA9ICVmLCBhcmVhL3c9JWYKAGdhcD0lZiwlZgoAICBhc3BlY3QgJWYKAGEgJWYgYiAlZiBjICVmIGQgJWYgciAlZgoAbW9kZWwgJWQgc21hcnRfaW5pdCAlZCBzdHJlc3N3dCAlZCBpdGVyYXRpb25zICVkIHRvbCAlZgoAU29sdmluZyBtb2RlbCAlZCBpdGVyYXRpb25zICVkIHRvbCAlZgoAJXMgY29vcmQgJS41ZyAlLjVnIGh0ICVmIHdpZHRoICVmCgByZWMgJWYgJWYgJWYgJWYKACVzIDogJWYgJWYgJWYgJWYKACVzIDogJWYgJWYKAG1heHBzaHQgPSAlZgptYXhwc3dpZCA9ICVmCgBtZHNNb2RlbDogZGVsdGEgPSAlZgoAIHIxICVmIHIyICVmCgBQYWNraW5nOiBjb21wdXRlIGdyaWQgc2l6ZQoAZ3NhdmUKACUlRW5kQ29tbWVudHMKc2F2ZQoAVW5yZWNvZ25pemVkIGNoYXJhY3RlciAnJWMnICglZCkgaW4gc2lkZXMgYXR0cmlidXRlCgBJbWFnZXMgdW5zdXBwb3J0ZWQgaW4gImJhY2tncm91bmQiIGF0dHJpYnV0ZQoAJXMgR05VIHBpYyB2cy4gMTB0aCBFZGl0aW9uIGRcKGUndGVudGUKAHJlc2V0ICVzIHNldCB0byBrbm93biBzdGF0ZQoAJWcgJWcgc2V0X3NjYWxlICVkIHJvdGF0ZSAlZyAlZyB0cmFuc2xhdGUKACVmICVmIHRyYW5zbGF0ZQoAJWQgJWQgdHJhbnNsYXRlCgAvLyoqKiBlbGxpcHNlCgBVbnJlY29nbml6ZWQgb3ZlcmxhcCB2YWx1ZSAiJXMiIC0gdXNpbmcgZmFsc2UKAG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKACVzOiB2c25wcmludGYgZmFpbHVyZQoAZW5kcGFnZQpzaG93cGFnZQpncmVzdG9yZQoAZW5kCnJlc3RvcmUKAGxheW91dCB3YXMgbm90IGRvbmUKAExheW91dCB3YXMgbm90IGRvbmUKAC8vKioqIHBvbHlsaW5lCgB0cnlpbmcgdG8gZGVsZXRlIGEgbm9uLWxpbmUKACMgZW5kIG9mIEZJRyBmaWxlCgBTaW5nbGUKAHJlbmRlcmVyIGZvciAlcyBpcyB1bmF2YWlsYWJsZQoAZHluYW1pYyBsb2FkaW5nIG5vdCBhdmFpbGFibGUKACUuMGYgJS4wZiBsaW5ldG8gc3Ryb2tlCgBjbG9zZXBhdGggc3Ryb2tlCgAgZWxsaXBzZV9wYXRoIHN0cm9rZQoALy8qKiogYmVnaW5fZWRnZQoALy8qKiogZW5kX2VkZ2UKAGxvc3QgJXMgJXMgZWRnZQoAb3ZlcmZsb3cgd2hlbiBjYWxjdWxhdGluZyB2aXJ0dWFsIHdlaWdodCBvZiBlZGdlCgBhZGRfdHJlZV9lZGdlOiBtaXNzaW5nIHRyZWUgZWRnZQoAaW4gcm91dGVzcGxpbmVzLCBjYW5ub3QgZmluZCBOT1JNQUwgZWRnZQoAc2hvd3BhZ2UKACVkICVkICVkIGJlZ2lucGFnZQoALy8qKiogYmVnaW5fcGFnZQoALy8qKiogZW5kX3BhZ2UKAEZpbGVuYW1lICIlcyIgaXMgdW5zYWZlCgBsYWJlbDogYXJlYSB0b28gbGFyZ2UgZm9yIHJ0cmVlCgAvLyoqKiBlbmRfbm9kZQoAVXNpbmcgZGVmYXVsdCBjYWxjdWxhdGlvbiBmb3Igcm9vdCBub2RlCgBjb250YWluX25vZGVzIGNsdXN0ICVzIHJhbmsgJWQgbWlzc2luZyBub2RlCgAlZiAlZiAlZiAlZiBub2RlCgA8PCAvUGFnZVNpemUgWyVkICVkXSA+PiBzZXRwYWdlZGV2aWNlCgBpbiBjaGVja3BhdGgsIGJveCAlenUgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGluIGNoZWNrcGF0aCwgYm94IDAgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGNsdXN0ZXIgbmFtZWQgJXMgbm90IGZvdW5kCgBtaW5jcm9zczogcGFzcyAlZCBpdGVyICVkIHRyeWluZyAlZCBjdXJfY3Jvc3MgJWxsZCBiZXN0X2Nyb3NzICVsbGQKAG5vZGUgJXMsIHBvcnQgJXMgdW5yZWNvZ25pemVkCgAlcyVzIHVuc3VwcG9ydGVkCgBjbHVzdGVyIGN5Y2xlICVzIC0tICVzIG5vdCBzdXBwb3J0ZWQKACVzIC0+ICVzOiBzcGxpbmUgc2l6ZSA+IDEgbm90IHN1cHBvcnRlZAoAbGF5b3V0IGFib3J0ZWQKAHBhZ2VkaXI9JXMgaWdub3JlZAoAVHdvIGNsdXN0ZXJzIG5hbWVkICVzIC0gdGhlIHNlY29uZCB3aWxsIGJlIGlnbm9yZWQKAElsbGVnYWwgYXR0cmlidXRlICVzIGluICVzIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgYXR0cmlidXRlICJtb2RlbCIgaW4gZ3JhcGggJXMgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBhdHRyaWJ1dGUgIm1vZGUiIGluIGdyYXBoICVzIC0gaWdub3JlZAoAc3RhcnQ9MCBub3Qgc3VwcG9ydGVkIHdpdGggbW9kZT1zZWxmIC0gaWdub3JlZAoAT3ZlcmxhcCB2YWx1ZSAiJXMiIHVuc3VwcG9ydGVkIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgUk9XUyAtIGlnbm9yZWQKAFVua25vd24gdmFsdWUgJXMgZm9yIENPTFVNTlMgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBWQUxJR04gLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBBTElHTiAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJXMgZm9yIEZJWEVEU0laRSAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJS4qcyBmb3IgU1RZTEUgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBCQUxJR04gaW4gVEQgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBBTElHTiBpbiBURCAtIGlnbm9yZWQKAFJPV1NQQU4gdmFsdWUgY2Fubm90IGJlIDAgLSBpZ25vcmVkCgBDT0xTUEFOIHZhbHVlIGNhbm5vdCBiZSAwIC0gaWdub3JlZAoAbm9kZSAlcywgcG9ydCAlcywgdW5yZWNvZ25pemVkIGNvbXBhc3MgcG9pbnQgJyVzJyAtIGlnbm9yZWQKAFVua25vd24gInNwbGluZXMiIHZhbHVlOiAiJXMiIC0gaWdub3JlZAoAaW4gcm91dGVzcGxpbmVzLCBQc2hvcnRlc3RwYXRoIGZhaWxlZAoAaW4gcm91dGVzcGxpbmVzLCBQcm91dGVzcGxpbmUgZmFpbGVkCgAjIHBsdWdpbiBsb2FkaW5nIG9mIGRlcGVuZGVuY3kgIiUuKnMiIGZhaWxlZAoAUGFyc2luZyBvZiAiJXMiIGZhaWxlZAoAJXM6JWQ6IGNsYWltZWQgdW5yZWFjaGFibGUgY29kZSB3YXMgcmVhY2hlZAoAIyB1bnN1Y2Nlc3NmdWwgcGx1Z2luIGxvYWQKACUuNWcgJS41ZyB0cmFuc2xhdGUgbmV3cGF0aCB1c2VyX3NoYXBlXyVkCgBuc2l6ZXNjYWxlPSVmLGl0ZXJhdGlvbnM9JWQKAGN0cmwtPm92ZXJsYXA9JWQKACVzICV6dSBub2RlcyAlenUgZWRnZXMgbWF4aXRlcj0lZCBiYWxhbmNlPSVkCgAvLyoqKiBiZWdpbl9sYXllcjogJXMsICVkLyVkCgBkZWdlbmVyYXRlIGNvbmNlbnRyYXRlZCByYW5rICVzLCVkCgAgIG1heCBsZXZlbHMgJWQKAAklcyAlZAoAICBCYXJuZXMtSHV0dCBjb25zdGFudCAlLjAzZiB0b2xlcmFuY2UgICUuMDNmIG1heGl0ZXIgJWQKAGd2d3JpdGVfbm9feiBwcm9ibGVtICVkCgAgIHF1YWR0cmVlIHNpemUgJWQgbWF4X2xldmVsICVkCgByZWJ1aWxkX3ZsaXN0czogbGVhZCBpcyBudWxsIGZvciByYW5rICVkCgByZWJ1aWxkX3ZsaXN0czogcmFuayBsZWFkICVzIG5vdCBpbiBvcmRlciAlZCBvZiByYW5rICVkCgAgIHNtb290aGluZyAlcyBvdmVybGFwICVkIGluaXRpYWxfc2NhbGluZyAlLjAzZiBkb19zaHJpbmtpbmcgJWQKACAgY29vbGluZyAlLjAzZiBzdGVwIHNpemUgICUuMDNmIGFkYXB0aXZlICVkCgBVbnN1cHBvcnRlZCBjaGFyc2V0IHZhbHVlICVkCgBpbiByb3V0ZXNwbGluZXMsIGlsbGVnYWwgdmFsdWVzIG9mIHByZXYgJWQgYW5kIG5leHQgJWQsIGxpbmUgJWQKACAgZWRnZV9s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bWluYXRpb24sIHZlcnNpb24gMgoAJXMgZmlsbHZhbCBpcyAwLjMgaW4gMTB0aCBFZGl0aW9uIChmaWxsIDAgbWVhbnMgYmxhY2spLCAwLjUgaW4gZ3BpYyAoZmlsbCAwIG1lYW5zIHdoaXRlKSwgdW5kZWZpbmVkIGluIERXQiAyCgAlcyByZXNldCB3b3JrcyBpbiBncGljIGFuZCAxMHRoIGVkaXRpb24sIGJ1dCBpc24ndCBkZWZpbmVkIGluIERXQiAyCgBzZXR1cExhdGluMQoAXDAwMQoAJXMgICAgICAgIHRvbGVyYW5jZSAwLjAxCgAgICAgdG9sZXJhbmNlIDAuMQoAJSVQYWdlczogMQoAICAgICAgICBkaWZmdXNlQ29sb3IgMSAxIDEKADEwMC4wMAoAIEVQU0YtMy4wCgAlcyBib3hyYWQgaXMgbm93IDAuMCBpbiBncGljLCBlbHNlIGl0IHJlbWFpbnMgMi4wCgBzcGhlcmUgezwlOS4zZiwgJTkuM2YsICU5LjNmPiwgMS4wCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2YgQVNDSUkgY2hhcmFjdGVyICV1LiBGYWxsaW5nIGJhY2sgdG8gMAoAaW5zdGFsbF9pbl9yYW5rLCBsaW5lICVkOiAlcyAlcyByYW5rICVkIGkgPSAlZCBhbiA9IDAKAGNvbmNlbnRyYXRlPXRydWUgbWF5IG5vdCB3b3JrIGNvcnJlY3RseS4KAE5vIGxpYnogc3VwcG9ydC4KAHR3b3BpOiB1c2Ugb2Ygd2VpZ2h0PTAgY3JlYXRlcyBkaXNjb25uZWN0ZWQgY29tcG9uZW50LgoAdGhlIGdyYXBoIGludG8gY29ubmVjdGVkIGNvbXBvbmVudHMuCgBPcnRob2dvbmFsIGVkZ2VzIGRvIG5vdCBjdXJyZW50bHkgaGFuZGxlIGVkZ2UgbGFiZWxzLiBUcnkgdXNpbmcgeGxhYmVscy4KAG1pbmNyb3NzICVzOiAlbGxkIGNyb3NzaW5ncywgJS4yZiBzZWNzLgoAJXMgaXMgbm90IGEga25vd24gY29sb3IuCgBpcyBpbmFwcHJvcHJpYXRlLiBSZXZlcnRpbmcgdG8gdGhlIHNob3J0ZXN0IHBhdGggbW9kZWwuCgBpcyB1bmRlZmluZWQuIFJldmVydGluZyB0byB0aGUgc2hvcnRlc3QgcGF0aCBtb2RlbC4KAFVuYWJsZSB0byByZWNsYWltIGJveCBzcGFjZSBpbiBzcGxpbmUgcm91dGluZyBmb3IgZWRnZSAiJXMiIC0+ICIlcyIuIFNvbWV0aGluZyBpcyBwcm9iYWJseSBzZXJpb3VzbHkgd3JvbmcuCgBFcnJvciBkdXJpbmcgY29udmVyc2lvbiB0byAiVVRGLTgiLiBRdWl0aW5nLgoAb3JkZXJpbmcgJyVzJyBub3QgcmVjb2duaXplZC4KAGdyYWRpZW50IHBlbiBjb2xvcnMgbm90IHlldCBzdXBwb3J0ZWQuCgAgIGluaXRDTWFqVlBTQyBkb25lOiAlZCBnbG9iYWwgY29uc3RyYWludHMgZ2VuZXJhdGVkLgoAVGhlIGNoYXJhY3RlciAnJWMnIGFwcGVhcnMgaW4gYm90aCB0aGUgbGF5ZXJzZXAgYW5kIGxheWVybGlzdHNlcCBhdHRyaWJ1dGVzIC0gbGF5ZXJsaXN0c2VwIGlnbm9yZWQuCgB0aGUgYXNwZWN0IGF0dHJpYnV0ZSBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gaW1wbGVtZW50YXRpb24gZmxhd3MgLSBhdHRyaWJ1dGUgaWdub3JlZC4KAFRoZSBsYXllcnNlbGVjdCBhdHRyaWJ1dGUgIiVzIiBkb2VzIG5vdCBtYXRjaCBhbnkgbGF5ZXIgc3BlY2lmZWQgYnkgdGhlIGxheWVycyBhdHRyaWJ1dGUgLSBpZ25vcmVkLgoAZWRnZSAlcyAtPiAlcyA6IHNldCBtb3JlIHRoYW4gb25lIHNwbGluZS4gRmlyc3QgdXNlZCwgb3RoZXIgZHJvcHBlZC4KACV6dSBvdXQgb2YgJXp1IGxhYmVscyBwb3NpdGlvbmVkLgoAJXp1IG91dCBvZiAlenUgZXh0ZXJpb3IgbGFiZWxzIHBvc2l0aW9uZWQuCgAgIGdlbmVyYXRlIGVkZ2UgY29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgTm9uLW92ZXJsYXAgQ29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgRWRnZSBDb25zdHJhaW50cy4uLgoAR2VuZXJhdGluZyBEaUctQ29MYSBFZGdlIENvbnN0cmFpbnRz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c2V0dGluZyBhIGJvdW5kaW5nIGJveCBzaXplLCBzZWUgZG90KDEpKQoAZXJyb3IgaW4gY29sb3J4bGF0ZSgpCgB0cnVuY2F0aW5nIHN0eWxlICclcycKAElsbGVnYWwgdmFsdWUgaW4gIiVzIiBjb2xvciBhdHRyaWJ1dGU7IGZsb2F0IGV4cGVjdGVkIGFmdGVyICc7JwoAZGVmaW5lIGF0dHJzMCAlJSAlJTsgZGVmaW5lIHVuZmlsbGVkICUlICUlOyBkZWZpbmUgcm91bmRlZCAlJSAlJTsgZGVmaW5lIGRpYWdvbmFscyAlJSAlJQoAPHN2ZyB3aWR0aD0iJWRwdCIgaGVpZ2h0PSIlZHB0IgoAIyBkZXBlbmRlbmNpZXMgIiUuKnMiIGRpZCBub3QgbWF0Y2ggIiUuKnMiCgAjIHR5cGUgIiUuKnMiIGRpZCBub3QgbWF0Y2ggIiUuKnMiCgAkYyBjcmVhdGUgaW1hZ2UgJS4yZiAlLjJmIC1pbWFnZSAicGhvdG9fJXMiCgBObyBvciBpbXByb3BlciBpbWFnZSBmaWxlPSIlcyIKAGZpbGUgbG9hZGluZyBpcyBkaXNhYmxlZCBiZWNhdXNlIHRoZSBlbnZpcm9ubWVudCBjb250YWlucyBTRVJWRVJfTkFNRT0iJXMiCgBDb3VsZCBub3QgcGFyc2UgeGRvdCAiJXMiCgBObyBsb2FkaW1hZ2UgcGx1Z2luIGZvciAiJXMiCgAgWyV6dV0gKCUuMDJmLCUuMDJmKSAoJS4wMmYsJS4wMmYpICVwICIlcyIKAGZvbnRuYW1lOiB1bmFibGUgdG8gcmVzb2x2ZSAiJXMiCgBEdXBsaWNhdGUgY2x1c3RlciBuYW1lICIlcyIKAHVucmVjb2duaXplZCBhcGkgbmFtZSAiJXMiCgBpbWFnZSBjcmVhdGUgcGhvdG8gInBob3RvXyVzIiAtZmlsZSAiJXMiCgBObyBvciBpbXByb3BlciBzaGFwZWZpbGU9IiVzIiBmb3Igbm9kZSAiJXMiCgBObyBvciBpbXByb3BlciBpbWFnZT0iJXMiIGZvciBub2RlICIlcyIKAG5vZGUgIiVzIiBpcyBjb250YWluZWQgaW4gdHdvIG5vbi1jb21wYXJhYmxlIGNsdXN0ZXJzICIlcyIgYW5kICIlcyIKAEVycm9yOiBub2RlICIlcyIgYmVsb25ncyB0byB0d28gbm9uLW5lc3RlZCBjbHVzdGVycyAiJXMiIGFuZCAiJXMiCgAgICIlcyIKACNpbmNsdWRlICJjb2xvcnMuaW5jIgojaW5jbHVkZSAidGV4dHVyZXMuaW5jIgojaW5jbHVkZSAic2hhcGVzLmluYyIKAFVua25vd24gSFRNTCBlbGVtZW50IDwlcz4gb24gbGluZSAlbHUgCgAlcyBpbiBsaW5lICVsdSAKAHNjYWxlIGJ5ICVnLCVnIAoAY29tcHJlc3MgJWcgCgBMYXlvdXQgd2FzIG5vdCBkb25lLiAgTWlzc2luZyBsYXlvdXQgcGx1Z2lucz8gCgCJUE5HDQoaCgAJAEGBgAULtgMBAQEBAQEBAQIDAQECAQEBAQEBAQEBAQEBAQEBAQEBAgEEBQEBAQEBAQYBAQcICQoKCgoKCgoKCgoBAQsBDAENDg8QERITFBUWExMTExcYGRMaGxwdExMTExMBHgEBEwEfICEiIxMkJSYTExMTJygpEyorLC0TExMTEwEBAQEBExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMuExMTLxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTMBMTExMTExMTExMTExMTExMAAAAAAAAEAAQAHAAcACEAIQAkACIACgACABYACQAiACIAIgAVAB0AAQAUABQAFAAUABQAFAAUAAgABAAFABwAGwAXABwAIQAgAB8AHgAJABMAAAAVABIAFQADAAcAFQAVABQAFAAUABQAFAAUABQAFAAIAAQABQAFAAYAHAAaABgAGQAhAAcAFQAUABQAFAAUABQAFAALABQADQAUAAwAFAAUABQADgAUABQAFAAQABQADwAUABEAQcKDBQuVBAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMABAAHAAMABAAFAAUABgAGAAgABwAHABEAFgASABEAEgAIAAgADwAPABcADwAYAA8AGQAaABoAHgAWADQAHgAFADIABgAiACIAMwAXABgANQAZABoAGgAqADYAKgA0ADcAMgBFADsAPAAzADsAPABGADUARwBIAEwANgAiAEkASgA3AEUATgBQAGIAUQBSAFQARgBHAFUASABMAFYASQBKAFgAWgBOAEQAUABRAFIAVAA4AC8ALABVACkAVgAbABAAWABaAF0AXQBdAF0AXQBdAF0AXgBeAF4AXgBeAF4AXgBfAF8AXwBfAF8AXwBfAGAACQBgAGAAYABgAGAAYQBhAGMAAgBjAGMAYwBjAGMAZAAAAGQAAABkAGQAZABlAAAAZQBlAGUAZQBlAGYAAAAAAGYAZgBmAGYAZwAAAGcAZwBnAGcAaAAAAGgAaABoAGgAaABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAEHkhwULzQGuAC4ALwAzADUAMAA3AKoA2wDbANsA2wAAAD0AhwA3ADcA2wDbAAAAKAA1AC4AMgAvAGIAAAAAAEcAAADbANsAUQAAANsA2wDbAAAA2wCEAFUA2wCCANsAAACBANsAAAA+AEIAQQBIAEQAUgBbAAAAAABeAF8A2wAAANsA2wDbAAAAAAB7AEkAVwBSAFoAWgBdAAAAXwAAAF8AAABlAF0AXwAAAF0AbgBqAAAAaQAAAG4AAADbAJMAmgChAKgAqwBwALEAuAC/AMYAzQDTAEHCiQULzwFcAAEAXQBdAF4AXgBfAF8AXABcAFwAXABcAGAAXABcAFwAYQBcAFwAYgBiAGIAYgBiAGIAYgBjAGQAZQBmAFwAXABcAGcAXABcAFwAYABcAFwAYQBcAGEAXABoAGEAXABiAGIAYgBiAGIAYgBiAGIAYwBkAGUAZQBcAGYAXABcAFwAZwBoAGEAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAAAAXABcAFwAXABcAFwAXABcAFwAXABcAFwAQaGLBQswAQECAwEEAQUBBgcHAQYGBgYGBgYGBgYGBgYGBgYDBgYGBgYGBgYGBgYGBgYGBgYGAEHiiwULowQKAAsADAANAA4ACgAPABAAEQASABMACgAUABUAFQAVABYAFwAVABgAFQAVABkAFQAVABUAGgAVABUACgAVABUAFQAWABcAGAAVABUAGQAVABUAFQAaABUAFQAVABUAGwAMAAwAJAAeAB4AIAAhACAAIQAkACUAJgAtADIALwAuACoAJQAmACgAKQAzACoANAArADUANgA3ADwAMgBHAD0AIgBFACIAPwBAAEYAMwA0AEgANQA2ADcALwBJACoARwBKAEUATABcADwARgBcAD0ATQBIAE4ATwBSAEkAQQBQAFEASgBMAFMAVAAxAFUAVgBXAE0ATgBYAE8AUgBZAFAAUQBaAFsAUwBEAFQAVQBWAFcASwBEACwAWAAsAFkAOAAsAFoAWwAdAB0AHQAdAB0AHQAdAB8AHwAfAB8AHwAfAB8AIwAjACMAIwAjACMAIwAnAFwAJwAnACcAJwAnADAAMAA5ABwAOQA5ADkAOQA5ADoAXAA6AFwAOgA6ADoAOwBcADsAOwA7ADsAOwA+AFwAXAA+AD4APgA+AEIAXABCAEIAQgBCAEMAXABDAEMAQwBDAEMACQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAMAAAADQAAAA4AAAAOAEGQkAUL0QUR7u4TCAPu/u7u7gHu7u4B7u4J/u4SFRfuEgHu7u7uCg3u7u7u7u7u7u4B7u4WCAEBGQ4Y7u4bGBru7h3u7u7uARX77u7u7hAe7u7uAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWEQICAgICAgICAgICAgISEAITAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUAhUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4CDwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBAgMEBQYHCAkKCwwNAAAACwMEBQ8HAwwNBgwNDgwNGhUAAQADBw4GDwgM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ADekAAB7Zcx7zMT/AFqXAACMqspDosr/ABiMAACR86wIaKz/APW/AABBEfnw+ej/AOawAABNKevM68X/ANeiAABfPd2o3bX/APqVAAB7Zcx7zMT/ALiKAACMqspDosr/AJWDAACR86wIaKz/AJW+AABBEfnw+ej/AIavAABNKevM68X/AHehAABfPd2o3bX/AJqUAAB7Zcx7zMT/AFiJAACJoNNOs9P/ADWCAACNxb4rjL7/AHp8AACT8p4IWJ7/ADW9AAA8DPz3/PD/ACauAABMGfPg89v/ABegAABNKevM68X/ADqTAABfPd2o3bX/APiHAAB7Zcx7zMT/ANWAAACJoNNOs9P/ABp7AACNxb4rjL7/ALV2AACT8p4IWJ7/AP+7AAA8DPz3/PD/APCsAABMGfPg89v/AOGeAABNKevM68X/AASSAABfPd2o3bX/AMKGAAB7Zcx7zMT/AJ9/AACJoNNOs9P/AOR5AACNxb4rjL7/AH91AACR86wIaKz/AG5yAACW74EIQIH/AEfEAABKFfXl9eD/ADi1AABQSNmh2Zv/ACmnAABisqMxo1T/AOfCAABJD/jt+On/ANizAABONuS65LP/AMmlAABWaMR0xHb/AOyYAABivosji0X/AIfBAABJD/jt+On/AHiyAABONuS65LP/AGmkAABWaMR0xHb/AIyXAABisqMxo1T/AEqMAABm/20AbSz/ACfAAABJD/jt+On/ABixAABNLOnH6cD/AAmjAABQSNmh2Zv/ACyWAABWaMR0xHb/AOqKAABisqMxo1T/AMeDAABm/20AbSz/AMe+AABJD/jt+On/ALivAABNLOnH6cD/AKmhAABQSNmh2Zv/AMyUAABWaMR0xHb/AIqJAABgnqtBq13/AGeCAABivosji0X/AKx8AABs/1oAWjL/AGe9AABIB/z3/PX/AFiuAABKFfXl9eD/AEmgAABNLOnH6cD/AGyTAABQSNmh2Zv/ACqIAABWaMR0xHb/AAeBAABgnqtBq13/AEx7AABivosji0X/AOd2AABs/1oAWjL/ACa8AABIB/z3/PX/ABetAABKFfXl9eD/AAifAABNLOnH6cD/ACuSAABQSNmh2Zv/AOmGAABWaMR0xHb/AMZ/AABgnqtBq13/AAt6AABivosji0X/AKZ1AABm/20AbSz/AJVyAABl/0QARBv/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AG/DAADk3NDQHIv/AGC0AADlPvHxttr/AFGmAAA9Z+G44Yb/AHSZAABIxqxNrCb/AA/CAADk3NDQHIv/AACzAADlPvHxttr/APGkAAAAAPf39/f/ABSYAAA9Z+G44Yb/ANKMAABIxqxNrCb/AK/AAADm3MXFG33/AKCxAADnTOnpo8n/AJGjAADpHf394O//ALSWAAA7JvXm9dD/AHKLAAA/gdeh12r/AE+EAABExZJNkiH/AE+/AADm3MXFG33/AECwAADnTOnpo8n/ADGiAADpHf394O//AFSVAAAAAPf39/f/ABKKAAA7JvXm9dD/AO+CAAA/gdeh12r/ADR9AABExZJNkiH/AO+9AADm3MXFG33/AOCuAADodt7ed67/ANGgAADlPvHxttr/APSTAADpHf394O//ALKIAAA7JvXm9dD/AI+BAAA9Z+G44Yb/ANR7AAA/prx/vEH/AG93AABExZJNkiH/AK68AADm3MXFG33/AJ+tAADodt7ed67/AJCfAADlPvHxttr/ALOSAADpHf394O//AHGHAAAAAPf39/f/AE6AAAA7JvXm9dD/AJN6AAA9Z+G44Yb/AC52AAA/prx/vEH/AB1zAABExZJNkiH/AP7FAADO/0tAAEv/AB7KAABl/0QARBv/AO+2AADOrYN2KoP/AOCoAADHV6uZcKv/AKOaAADHM8/Cpc//AAGOAADSFejn1Oj/AH6FAABMHvDZ8NP/AGN+AABQRNum26D/AJ54AABYe65armH/AC10AABhxXgbeDf/AIbFAADO/0tAAEv/AJvJAABhxXgbeDf/AGG7AABl/0QARBv/AHe2AADOrYN2KoP/AGioAADHV6uZcKv/ACuaAADHM8/Cpc//AImNAADSFejn1Oj/AAaFAAAAAPf39/f/AOt9AABMHvDZ8NP/ACZ4AABQRNum26D/ALVzAABYe65armH/AKXEAADERsOvjcP/AJa1AAAAAPf39/f/AIenAABSWr9/v3v/AEXDAADJqJR7MpT/ADa0AADHM8/Cpc//ACemAABQRNum26D/AEqZAABm/4gAiDf/AOXBAADJqJR7MpT/ANayAADHM8/Cpc//AMekAAAAAPf39/f/AOqXAABQRNum26D/AKiMAABm/4gAiDf/AIXAAADOrYN2KoP/AHaxAADERsOvjcP/AGejAADSFejn1Oj/AIqWAABMHvDZ8NP/AEiLAABSWr9/v3v/ACWEAABhxXgbeDf/ACW/AADOrYN2KoP/ABawAADERsOvjcP/AAeiAADSFejn1Oj/ACqVAAAAAPf39/f/AOiJAABMHvDZ8NP/AMWCAABSWr9/v3v/AAp9AABhxXgbeDf/AMW9AADOrYN2KoP/ALauAADHV6uZcKv/AKegAADHM8/Cpc//AMqTAADSFejn1Oj/AIiIAABMHvDZ8NP/AGWBAABQRNum26D/AKp7AABYe65armH/AEV3AABhxXgbeDf/AIS8AADOrYN2KoP/AHWtAADHV6uZcKv/AGafAADHM8/Cpc//AImSAADSFejn1Oj/AEeHAAAAAPf39/f/ACSAAABMHvDZ8NP/AGl6AABQRNum26D/AAR2AABYe65armH/APNyAABhxXgbeDf/AAHEAAC9C/Ls5/L/APK0AACXPdumvdv/AOOmAACNxb4rjL7/AKHCAAC5CPbx7vb/AJKzAACbKOG9yeH/AIOlAACRcM90qc//AKaYAACP97AFcLD/AEHBAAC5CPbx7vb/ADKyAACbKOG9yeH/ACOkAACRcM90qc//AEaXAACNxb4rjL7/AASMAACP940EWo3/AOG/AAC5CPbx7vb/ANKwAACoGObQ0eb/AMOiAACXPdumvdv/AOaVAACRcM90qc//AKSKAACNxb4rjL7/AIGDAACP940EWo3/AIG+AAC5CPbx7vb/AHKvAACoGObQ0eb/AGOhAACXPdumvdv/AIaUAACRcM90qc//AESJAACOt8A2kMD/ACGCAACP97AFcLD/AGZ8AACP+HsDTnv/ACG9AADpCP//9/v/ABKuAAC9C/Ls5/L/AAOgAACoGObQ0eb/ACaTAACXPdumvdv/AOSHAACRcM90qc//AMGAAACOt8A2kMD/AAZ7AACP97AFcLD/AKF2AACP+HsDTnv/AOu7AADpCP//9/v/ANysAAC9C/Ls5/L/AM2eAACoGObQ0eb/APCRAACXPdumvdv/AK6GAACRcM90qc//AIt/AACOt8A2kMD/ANB5AACP97AFcLD/AGt1AACP940EWo3/AFpyAACP+VgCOFj/AJHEAADIDvDs4vD/AIK1AACXPdumvdv/AHOnAACC0JkckJn/ADHDAADPCPf27/f/ACK0AACbKOG9yeH/ABOmAACPgM9nqc//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ANaZAADPhKOYTqP/AHHCAAD+4eTkGhz/AGKzAACSsrg3frj/AFOlAABTk69Nr0r/AHaYAADPhKOYTqP/ADSNAAAV////fwD/ABHBAAD+4eTkGhz/AAKyAACSsrg3frj/APOjAABTk69Nr0r/ABaXAADPhKOYTqP/ANSLAAAV////fwD/ALGEAAAqzP///zP/ALG/AAD+4eTkGhz/AKKwAACSsrg3frj/AJOiAABTk69Nr0r/ALaVAADPhKOYTqP/AHSKAAAV////fwD/AFGDAAAqzP///zP/AJZ9AAAPwaamVij/AFG+AAD+4eTkGhz/AEKvAACSsrg3frj/ADOhAABTk69Nr0r/AFaUAADPhKOYTqP/ABSJAAAV////fwD/APGBAAAqzP///zP/ADZ8AAAPwaamVij/ANF3AADoeff3gb//APG8AAD+4eTkGhz/AOKtAACSsrg3frj/ANOfAABTk69Nr0r/APaSAADPhKOYTqP/ALSHAAAV////fwD/AJGAAAAqzP///zP/ANZ6AAAPwaamVij/AHF2AADoeff3gb//AGBzAAAAAJmZmZn/ABLFAAByeMJmwqX/AAO2AAALm/z8jWL/APSnAACcTcuNoMv/ALLDAAByeMJmwqX/AKO0AAALm/z8jWL/AJSmAACcTcuNoMv/ALeZAADkZufnisP/AFLCAAByeMJmwqX/AEOzAAALm/z8jWL/ADSlAACcTcuNoMv/AFeYAADkZufnisP/ABWNAAA6m9im2FT/APLAAAByeMJmwqX/AOOxAAALm/z8jWL/ANSjAACcTcuNoMv/APeWAADkZufnisP/ALWLAAA6m9im2FT/AJKEAAAi0P//2S//AJK/AAByeMJmwqX/AIOwAAALm/z8jWL/AHSiAACcTcuNoMv/AJeVAADkZufnisP/AFWKAAA6m9im2FT/ADKDAAAi0P//2S//AHd9AAAZWuXlxJT/ADK+AAByeMJmwqX/ACOvAAALm/z8jWL/ABShAACcTcuNoMv/ADeUAADkZufnisP/APWIAAA6m9im2FT/ANKBAAAi0P//2S//ABd8AAAZWuXlxJT/ALJ3AAAAALOzs7P/AELGAAB4VNON08f/AGjKAADTUr28gL3/ADO3AAAqTP///7P/ACSpAACvJdq+utr/AOeaAAAEi/v7gHL/AEWOAACQZNOAsdP/AMKFAAAWnP39tGL/AKd+AAA6ht6z3mn/AOJ4AADpL/z8zeX/AHF0AAAAANnZ2dn/AMrFAAB4VNON08f/AOXJAADTUr28gL3/AKu7AABNKevM68X/ALu2AAAqTP///7P/AKyoAACvJdq+utr/AG+aAAAEi/v7gHL/AM2NAACQZNOAsdP/AEqFAAAWnP39tGL/AC9+AAA6ht6z3mn/AGp4AADpL/z8zeX/APlzAAAAANnZ2dn/AFLFAAB4VNON08f/AGLJAADTUr28gL3/ACi7AABNKevM68X/ALasAAAlkP//7W//AEO2AAAqTP///7P/ADSoAACvJdq+utr/APeZAAAEi/v7gHL/AFWNAACQZNOAsdP/ANKEAAAWnP39tGL/ALd9AAA6ht6z3mn/APJ3AADpL/z8zeX/AIFzAAAAANnZ2dn/AAnFAAB4VNON08f/APq1AAAqTP///7P/AOunAACvJdq+utr/AKnDAAB4VNON08f/AJq0AAAqTP///7P/AIumAACvJdq+utr/AK6ZAAAEi/v7gHL/AEnCAAB4VNON08f/ADqzAAAqTP///7P/ACulAACvJdq+utr/AE6YAAAEi/v7gHL/AAyNAACQZNOAsdP/AOnAAAB4VNON08f/ANqxAAAqTP///7P/AMujAACvJdq+utr/AO6WAAAEi/v7gHL/AKyLAACQZNOAsdP/AImEAAAWnP39tGL/AIm/AAB4VNON08f/AHqwAAAqTP///7P/AGuiAACvJdq+utr/AI6VAAAEi/v7gHL/AEyKAACQZNOAsdP/ACmDAAAWnP39tGL/AG59AAA6ht6z3mn/ACm+AAB4VNON08f/ABqvAAAqTP///7P/AAuhAACvJdq+utr/AC6UAAAEi/v7gHL/AOyIAACQZNOAsdP/AMmBAAAWnP39tGL/AA58AAA6ht6z3mn/AKl3AADpL/z8zeX/AOi8AAB4VNON08f/ANmtAAAqTP///7P/AMqfAACvJdq+utr/AO2SAAAEi/v7gHL/AKuHAACQZNOAsdP/AIiAAAAWnP39tGL/AM16AAA6ht6z3mn/AGh2AADpL/z8zeX/AFdzAAAAANnZ2dn/ABTGAADt/Z6eAUL/ADbKAACxgqJeT6L/AAW3AAD6tNXVPk//APaoAAAKuPT0bUP/ALmaAAAUnf39rmH/ABeOAAAfc/7+4Iv/AJSFAAAxYPXm9Zj/AHl+AABPQd2r3aT/ALR4AAByeMJmwqX/AEN0AACPu70yiL3/AJzFAADt/Z6eAUL/ALPJAACPu70yiL3/AHm7AACxgqJeT6L/AI22AAD6tNXVPk//AH6oAAAKuPT0bUP/AEGaAAAUnf39rmH/AJ+NAAAfc/7+4Iv/AByFAAAqQP///7//AAF+AAAxYPXm9Zj/ADx4AABPQd2r3aT/AMtzAAByeMJmwqX/AMLEAAANpPz8jVn/ALO1AAAqQP///7//AKSnAABRTdWZ1ZT/AGLDAAD+4dfXGRz/AFO0AAAUnf39rmH/AESmAABPQd2r3aT/AGeZAACPxLorg7r/AALCAAD+4dfXGRz/APOyAAAUnf39rmH/AOSkAAAqQP///7//AAeYAABPQd2r3aT/AMWMAACPxLorg7r/AKLAAAD6tNXVPk//AJOxAAANpPz8jVn/AISjAAAfc/7+4Iv/AKeWAAAxYPXm9Zj/AGWLAABRTdWZ1ZT/AEKEAACPu70yiL3/AEK/AAD6tNXVPk//ADOwAAANpPz8jVn/ACSiAAAfc/7+4Iv/AEeVAAAqQP///7//AAWKAAAxYPXm9Zj/AOKCAABRTdWZ1ZT/ACd9AACPu70yiL3/AOK9AAD6tNXVPk//ANOuAAAKuPT0bUP/AMSgAAAUnf39rmH/AOeTAAAfc/7+4Iv/AKWIAAAxYPXm9Zj/AIKBAABPQd2r3aT/AMd7AAByeMJmwqX/AGJ3AACPu70yiL3/AKG8AAD6tNXVPk//AJKtAAAKuPT0bUP/AIOfAAAUnf39rmH/AKaSAAAfc/7+4Iv/AGSHAAAqQP///7//AEGAAAAxYPXm9Zj/AIZ6AABPQd2r3aT/ACF2AAByeMJmwqX/ABBzAACPu70yiL3/AFxHAACTD//w+P//AK9IAAAYI/r669f/AClgAAB///8A////AH5LAABxgP9//9T/AKFKAAB/D//w////AINOAAAqGvX19dz/AENFAAAXOv//5MT/AIA6AAAAAAAAAAD/ADJSAAAZMf//683/AGtHAACq//8AAP//AA8RAADAzuKKK+L/APgvAAAAvqWlKir/AKxRAAAXY97euIf/AHFGAACAZ6BfnqD/AGBJAAA///9//wD/ADBJAAAR2tLSaR7/AHo4AAALr///f1D/AIBGAACak+1kle3/ACs6AAAhIv//+Nz/AEYwAAD259zcFDz/AI80AAB///8A////AP9GAACq/4sAAIv/AIE0AAB//4sAi4v/AHdRAAAe77i4hgv/AEEIAAAAAKmpqan/AJ8zAABV/2QAZAD/AHYHAAAAAKmpqan/AAk7AAAnbr29t2v/AD1gAADU/4uLAIv/ANYzAAA6jmtVay//AF5OAAAX////jAD/AHpTAADGwMyZMsz/AIZVAAAA/4uLAAD/AMYwAAAKeenplnr/ADg0AABVPbyPvI//ADpHAACvj4tIPYv/AGMIAAB/Z08vT0//AJgHAAB/Z08vT0//ABVKAACA/9EAztH/AP8QAADH/9OUANP/AMs5AADo6///FJP/ACJGAACK//8Av///ADQIAAAAAGlpaWn/AGkHAAAAAGlpaWn/AJRGAACU4f8ekP//AGQ6AAAAzrKyIiL/AJ5IAAAcD///+vD/AGIzAABVwIsiiyL/AAJhAADU////AP//AO4uAAAAANzc3Nz/AH1IAACqB//4+P//AL9SAAAj////1wD/AJ1RAAAe2drapSD/AJUIAAAAAICAgID/AGE0AABV/4AAgAD/AE4KAAA70P+t/y//AMoHAAAAAICAgID/AFcLAABVD//w//D/AK85AADplv//abT/AHdVAAAAjM3NXFz/AEwvAADC/4JLAIL/AFYGAAAqD/////D/ABg7AAAmavDw5oz/AAIdAACqFPrm5vr/AG08AADwD///8PX/AJAzAABA//x8/AD/ABQyAAAmMf//+s3/AGJGAACJP+at2Ob/AGo4AAAAd/DwgID/AHI0AAB/H//g////AF8KAAAqKPr6+tL/ACUIAAAAANPT09P/AHMzAABVZO6Q7pD/AFoHAAAAANPT09P/ALw5AAD4Sf//tsH/ALUwAAAMhP//oHr/ABE0AAB90bIgsqr/ABBGAACPdfqHzvr/AE8IAACUOJl3iJn/AIQHAACUOJl3iJn/AM1GAACXNN6wxN7/AD0KAAAqH////+D/ABhMAABV//8A/wD/AOozAABVwM0yzTL/AAwzAAAVFPr68Ob/AE5gAADU////AP//AKkwAAAA/4CAAAD/AGhLAABxgM1mzar/AL1GAACq/80AAM3/AGhTAADMmNO6VdP/AOBMAAC3fNuTcNv/ACQ0AABnqbM8s3H/ACVHAACwj+57aO7/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APeqAAAXJO7u38z/AMacAAAXJM3NwLD/AAeQAAAYIouLg3j/AC5gAAB///8A////AINLAABxgP9//9T/AKW5AABxgP9//9T/AD2rAABxgO527sb/AAydAABxgM1mzar/AFSQAABxgItFi3T/AKZKAAB/D//w////AJ65AAB/D//w////ADarAAB/D+7g7u7/AAWdAAB/Ds3Bzc3/AEaQAAB/DouDi4v/AIhOAAAqGvX19dz/AEhFAAAXOv//5MT/AOe4AAAXOv//5MT/AH+qAAAXOu7u1bf/AE6cAAAWOs3Nt57/AI+PAAAXOouLfWv/AIU6AAAAAAAAAAD/ADdSAAAZMf//683/AHBHAACq//8AAP//AEy5AACq//8AAP//AOSqAACq/+4AAO7/ALOcAACq/80AAM3/APSPAACq/4sAAIv/ABQRAADAzuKKK+L/AP0vAAAAvqWlKir/AOi3AAAAv///QED/AJypAAAAv+7uOzv/AHObAAAAv83NMzP/ALSOAAAAvouLIyP/ALFRAAAXY97euIf/AAS6AAAXZP//05v/AIurAAAXY+7uxZH/AFqdAAAXY83Nqn3/AKKQAAAXY4uLc1X/AHZGAACAZ6BfnqD/ABW5AACDZ/+Y9f//AK2qAACDZu6O5e7/AHycAACDZ816xc3/AL2PAACDZotThov/AGVJAAA///9//wD/AHi5AAA///9//wD/ABCrAAA//+527gD/AN+cAAA//81mzQD/ACCQAAA//4tFiwD/ADVJAAAR2tLSaR7/AG25AAAR2///fyT/AAWrAAAR2+7udiH/ANScAAAR2s3NZh3/ABWQAAAR3IuLRRP/AH84AAALr///f1D/AHe4AAAHqf//clb/AByqAAAGqe7ualD/APObAAAGqc3NW0X/ADSPAAAGqIuLPi//AIVGAACak+1kle3/ADA6AAAhIv//+Nz/AJy4AAAhIv//+Nz/AEGqAAAiI+7u6M3/ABicAAAiIs3NyLH/AFmPAAAjIouLiHj/AEswAAD259zcFDz/AJQ0AAB///8A////AFy4AAB///8A////AAGqAAB//+4A7u7/ANibAAB//80Azc3/ABmPAAB//4sAi4v/AARHAACq/4sAAIv/AIY0AAB//4sAi4v/AHxRAAAe77i4hgv/APW5AAAe8P//uQ//AHyrAAAe8O7urQ7/AEudAAAe8M3NlQz/AJOQAAAe8IuLZQj/AEYIAAAAAKmpqan/AKQzAABV/2QAZAD/AHsHAAAAAKmpqan/AA47AAAnbr29t2v/AEJgAADU/4uLAIv/ANszAAA6jmtVay//AC64AAA6j//K/3D/ANOpAAA6j+687mj/AKqbAAA6j82izVr/AOuOAAA6j4tuiz3/AGNOAAAX////jAD/AMi5AAAV////fwD/AGCrAAAV/+7udgD/AC+dAAAV/83NZgD/AHeQAAAV/4uLRQD/AH9TAADGwMyZMsz/ACO6AADGwf+/Pv//AKqrAADGwO6yOu7/AHmdAADGwM2aMs3/AMGQAADGwItoIov/AItVAAAA/4uLAAD/AMswAAAKeenplnr/AD00AABVPbyPvI//AEm4AABVPv/B/8H/AO6pAABVPu607rT/AMWbAABVPs2bzZv/AAaPAABVPotpi2n/AD9HAACvj4tIPYv/AGgIAAB/Z08vT0//AJK3AAB/aP+X////AEKpAAB/Z+6N7u7/ACubAAB/aM15zc3/AHGOAAB/aItSi4v/AJ0HAAB/Z08vT0//ABpKAACA/9EAztH/AAQRAADH/9OUANP/ANA5AADo6///FJP/AJK4AADo6///FJP/ADeqAADo6+7uEon/AA6cAADo683NEHb/AE+PAADn7IuLClD/ACdGAACK//8Av///AP24AACK//8Av///AJWqAACK/+4Asu7/AGScAACK/80Ams3/AKWPAACK/4sAaIv/ADkIAAAAAGlpaWn/AG4HAAAAAGlpaWn/AJlGAACU4f8ekP//ACC5AACU4f8ekP//ALiqAACU4e4chu7/AIecAACU4c0YdM3/AMiPAACU4YsQTov/AGk6AAAAzrKyIiL/AKa4AAAAz///MDD/AEuqAAAAz+7uLCz/ACKcAAAAz83NJib/AGOPAAAAz4uLGhr/AKNIAAAcD///+vD/AGczAABVwIsiiyL/AAdhAADU////AP//APMuAAAAANzc3Nz/AIJIAACqB//4+P//AMRSAAAj////1wD/AA+6AAAj////1wD/AJarAAAj/+7uyQD/AGWdAAAj/83NrQD/AK2QAAAj/4uLdQD/AKJRAAAe2drapSD/APm5AAAe2v//wSX/AICrAAAe2u7utCL/AE+dAAAe2s3Nmx3/AJeQAAAe2ouLaRT/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AFEvAADC/4JLAIL/ALMWAAAqAP////4AAFsGAAAqD/////D/AIW3AAAqD/////D/ADWpAAAqD+7u7uD/AAebAAAqDs3NzcH/AGSOAAAqDouLi4P/AB07AAAmavDw5oz/AMa4AAAncP//9o//AFaqAAAncO7u5oX/AC2cAAAnb83NxnP/AG6PAAAnb4uLhk7/AAcdAACqFPrm5vr/AHI8AADwD///8PX/AM24AADwD///8PX/AF2qAADvD+7u4OX/ADScAADwDs3NwcX/AHWPAADvDouLg4b/AJUzAABA//x8/AD/ABkyAAAmMf//+s3/AAS4AAAmMf//+s3/ALipAAAlMu7u6b//AI+bAAAmMc3NyaX/ANCOAAAnMYuLiXD/AGdGAACJP+at2Ob/AAq5AACKQP+/7///AKKqAACKQO6y3+7/AHGcAACKP82awM3/ALKPAACJQItog4v/AG84AAAAd/DwgID/AHc0AAB/H//g////AFe4AAB/H//g////APypAAB/H+7R7u7/ANObAAB/H820zc3/ABSPAAB/H4t6i4v/AFhRAAAjc+7u3YL/AOW5AAAjdP//7Iv/AGyrAAAjc+7u3IL/ADudAAAjc83NvnD/AIOQAAAjc4uLgUz/AGQKAAAqKPr6+tL/ACoIAAAAANPT09P/AHgzAABVZO6Q7pD/AF8HAAAAANPT09P/AME5AAD4Sf//tsH/AIe4AAD5Uf//rrn/ACyqAAD4Ue7uoq3/AAOcAAD5UM3NjJX/AESPAAD5UIuLX2X/ALowAAAMhP//oHr/APe3AAAMhP//oHr/AKupAAALhO7ulXL/AIKbAAAMhc3NgWL/AMOOAAAMhYuLV0L/ABY0AAB90bIgsqr/ABVGAACPdfqHzvr/AO+4AACPT/+w4v//AIeqAACPT+6k0+7/AFacAACOT82Nts3/AJePAACPTotge4v/ABZHAACvj/+EcP//AFQIAACUOJl3iJn/AIkHAACUOJl3iJn/ANJGAACXNN6wxN7/ACy5AACXNf/K4f//AMSqAACXNe680u7/AJOcAACXNc2itc3/ANSPAACWNYtue4v/AEIKAAAqH////+D/AKu3AAAqH////+D/AFupAAAqH+7u7tH/AESbAAAqH83NzbT/AIqOAAAqH4uLi3r/AB1MAABV//8A/wD/AO8zAABVwM0yzTL/ABEzAAAVFPr68Ob/AFNgAADU////AP//AF+6AADU////AP//AOarAADU/+7uAO7/ALWdAADU/83NAM3/AP2QAADU/4uLAIv/AK4wAADvubCwMGD/AO+3AADky///NLP/AKOpAADky+7uMKf/AHqbAADkzM3NKZD/ALuOAADky4uLHGL/AG1LAABxgM1mzar/AMJGAACq/80AAM3/AG1TAADMmNO6VdP/ABW6AADLmf/gZv//AJyrAADLme7RX+7/AGudAADLmc20Us3/ALOQAADLmot6N4v/AOVMAAC3fNuTcNv/ALq5AAC3ff+rgv//AFKrAAC3fe6fee7/ACGdAAC3fc2JaM3/AGmQAAC3fItdR4v/ACk0AABnqbM8s3H/ACpHAACwj+57aO7/ALMzAABv//oA+pr/AAVKAAB9p9FI0cz/AOdUAADk5MfHFYX/AFVGAACqxnAZGXD/AIQ2AABqCf/1//r/AJJJAAAEHv//5OH/AIS5AAAEHv//5OH/AByrAAAEHu7u1dL/AOucAAADHc3Nt7X/ACyQAAAFHYuLfXv/AEEyAAAaSf//5LX/AJJIAAAZUf//3q3/AFK5AAAZUf//3q3/AOqqAAAZUu7uz6H/ALmcAAAZUs3Ns4v/APqPAAAZUouLeV7/AIcEAACq/4AAAID/AAdGAACq/4AAAID/AEBLAAAqAP////4AAAdRAAAbF/399eb/APJEAAAq/4CAgAD/ABhgAAA4wI5rjiP/AFS6AAA4wf/A/z7/ANurAAA4wO6z7jr/AKqdAAA4wM2azTL/APKQAAA4wItpiyL/AHNOAAAb////pQD/AMy5AAAb////pQD/AGSrAAAb/+7umgD/ADOdAAAb/83NhQD/AHuQAAAb/4uLWgD/AN5VAAAL////RQD/AEm6AAAL////RQD/ANCrAAAL/+7uQAD/AJ+dAAAL/83NNwD/AOeQAAAL/4uLJQD/AI9TAADWe9racNb/ACe6AADWfP//g/r/AK6rAADWfO7ueun/AH2dAADWfM3Nacn/AMWQAADVfIuLR4n/AI9RAAAmSO7u6Kr/AP4zAABVZPuY+5j/AD64AABVZf+a/5r/AOOpAABVZO6Q7pD/ALqbAABVZM18zXz/APuOAABVZItUi1T/AC1KAAB/Q+6v7u7/AI+5AAB/RP+7////ACerAAB/RO6u7u7/APacAAB/RM2Wzc3/ADeQAAB/Q4tmi4v/APxUAADxfNvbcJP/AC+6AADxff//gqv/ALarAADxfe7ueZ//AIWdAADxfc3NaIn/AM2QAADxfIuLR13/AEctAAAaKf//79X/ACJCAAAURv//2rn/ANy4AAAURv//2rn/AGyqAAATRe7uy63/AEOcAAATRc3Nr5X/AISPAAAURYuLd2X/ANULAAAUsM3NhT//AOc5AAD3P///wMv/AJa4AAD1Sf//tcX/ADuqAAD1Se7uqbj/ABKcAAD1Ss3NkZ7/AFOPAAD1SYuLY2z/APg1AADURt3doN3/AGe4AADURP//u///AAyqAADURO7uru7/AOObAADURM3Nls3/ACSPAADUQ4uLZov/AKlGAACEO+aw4Ob/AEFNAADE3fCgIPD/AMC5AAC/z/+bMP//AFirAADAz+6RLO7/ACedAADAz819Js3/AG+QAADAz4tVGov/AAdNAAC/qplmM5n/AChWAAAA////AAD/AE+6AAAA////AAD/ANarAAAA/+7uAAD/AKWdAAAA/83NAAD/AO2QAAAA/4uLAAD/AL8vAAAAPby8j4//AOS3AAAAPv//wcH/AJipAAAAPu7utLT/AG+bAAAAPs3Nm5v/ALCOAAAAPouLaWn/APVGAACfteFBaeH/ADy5AACft/9Idv//ANSqAACft+5Dbu7/AKOcAACfts06X83/AOSPAACft4snQIv/AOwvAAAR3IuLRRP/ANswAAAEivr6gHL/APy3AAAJlv//jGn/ALCpAAAJlu7ugmL/AIebAAAJls3NcFT/AMiOAAAJlouLTDn/AM4vAAATmvT0pGD/AE80AABnqosui1f/AE24AABnq/9U/5//APKpAABnq+5O7pT/AMmbAABnq81DzYD/AAqPAABnqosui1f/AD03AAAREP//9e7/AG24AAAREP//9e7/ABKqAAASEe7u5d7/AOmbAAASEc3Nxb//ACqPAAASEIuLhoL/AM1gAAANt6CgUi3/AGi6AAANuP//gkf/AO+rAAANuO7ueUL/AL6dAAANuM3NaDn/AAaRAAANuYuLRyb/ANsbAAAAAMDAwMD/ADhGAACLbOuHzuv/AAG5AACQeP+Hzv//AJmqAACQeO5+wO7/AGicAACQeM1sps3/AKmPAACRd4tKcIv/AFJHAACvj81qWs3/AEe5AACvkP+Db///AN+qAACvkO56Z+7/AK6cAACvkM1pWc3/AO+PAACvkItHPIv/AHsIAACUOJBwgJD/AJa3AACVOP/G4v//AEapAACVOO650+7/AC+bAACUOc2fts3/AHWOAACVOItse4v/ALAHAACUOJBwgJD/ABcKAAAABf//+vr/AKW3AAAABf//+vr/AFWpAAAABe7u6en/AD6bAAAABM3Nycn/AISOAAAAA4uLiYn/AMozAABq//8A/3//ACG4AABq//8A/3//AMapAABq/+4A7nb/AJ2bAABq/80AzWb/AN6OAABq/4sAi0X/AOZGAACSm7RGgrT/ADG5AACSnP9juP//AMmqAACSnO5crO7/AJicAACSnM1PlM3/ANmPAACTm4s2ZIv/AK00AAAYVNLStIz/AGK4AAAUsP//pU//AAeqAAAUsO7umkn/AN6bAAAUsM3NhT//AB+PAAAUsIuLWiv/AAo5AAB//4AAgID/ANJMAADUHdjYv9j/ALG5AADUHv//4f//AEmrAADUHu7u0u7/ABidAADUHc3Ntc3/AGCQAADUHYuLe4v/ANwuAAAGuP//Y0f/ANy3AAAGuP//Y0f/AJCpAAAGuO7uXEL/AGebAAAGuM3NTzn/AKiOAAAGuYuLNib/ALsPAAAqAP////4AAEBKAAB7tuBA4ND/AJO5AACB//8A9f//ACurAACB/+4A5e7/APqcAACB/80Axc3/ADuQAACB/4sAhov/ACQRAADUc+7ugu7/AABVAADj19DQIJD/ADO6AADrwf//Ppb/ALqrAADrwO7uOoz/AImdAADrwM3NMnj/ANGQAADrwIuLIlL/AIUIAAAAAICAgID/AAg0AABV/4AAgAD/ALoHAAAAAICAgID/AJUwAAAA/4CAAAD/AP1MAADU/4CAAID/AMsSAAAbRPX13rP/AMu3AAAbRf//57r/AH+pAAAbRO7u2K7/AFubAAAbRM3Nupb/AKGOAAAbQ4uLfmb/AMZIAAAAAP//////AEROAAAAAPX19fX/AI0IAAAAAL6+vr7/AFg0AABV//8A/wD/AMIHAAAAAL6+vr7/AJ8wAADvubCwMGD/ADJNAADE3fCgIPD/AH4KAAAq/////wD/ALC3AAAq/////wD/AGCpAAAq/+7u7gD/AEmbAAAq/83NzQD/AI+OAAAq/4uLiwD/AEQzAAA4wM2azTL/AEHAggcLA5R4AgBBzoIHC4UIoED/////////////////////////////////////////////////////////////////////////////////////AAKqAkQDAAQABKoGOQZxAaoCqgIABIMEAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABDkCOQKDBIMEgwSNA14HxwVWBVYFxwXjBHMExwXHBaoCHQPHBeMEHQfHBccFcwTHBVYFcwTjBMcFxwWNB8cFxwXjBKoCOQKqAsEDAASqAo0DAASNAwAEjQOqAgAEAAQ5AjkCAAQ5AjkGAAQABAAEAASqAh0DOQIABAAExwUABAAEjQPXA5oB1wNUBP///////////////////////////////////////////////////////////////////////////////////////wACqgJxBAAEAAQACKoGOQKqAqoCAASPBAACqgIAAjkCAAQABAAEAAQABAAEAAQABAAEAASqAqoCjwSPBI8EAARxB8cFVgXHBccFVgXjBDkGOQYdAwAEOQZWBY0HxwU5BuMEOQbHBXMEVgXHBccFAAjHBccFVgWqAjkCqgKmBAAEqgIABHMEjQNzBI0DqgIABHMEOQKqAnMEOQKqBnMEAARzBHMEjQMdA6oCcwQABMcFAAQABI0DJwPDAScDKQT///////////////////////////////////////////////////////////////////////////////////////8AAqoCXAMABAAEqgY5BrYBqgKqAgAEZgUAAqoCAAI5AgAEAAQABAAEAAQABAAEAAQABAAEqgKqAmYFZgVmBQAEXAfjBOMEVgXHBeME4wTHBccFqgKNA1YFcwSqBlYFxwXjBMcF4wQABHMExwXjBKoG4wRzBHMEHQM5Ah0DYAMABKoCAAQABI0DAASNAzkCAAQABDkCOQKNAzkCxwUABAAEAAQABB0DHQM5AgAEjQNWBY0DjQMdAzMDMwIzA1QE////////////////////////////////////////////////////////////////////////////////////////AAIdA3EEAAQABKoGOQY5AqoCqgIABI8EAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABKoCqgKPBI8EjwQABKgGVgVWBVYFxwVWBVYFxwU5Bh0DAARWBeMEHQfHBccF4wTHBVYFcwTjBMcFVgUdB1YF4wTjBKoCOQKqAo8EAASqAgAEAASNAwAEjQOqAgAEcwQ5AjkCAAQ5AjkGcwQABAAEAAQdAx0DOQJzBI0DVgUABI0DHQPJAsMByQKPBP//vHgCAEHeigcLhQigQP////////////////////////////////////////////////////////////////////////////////////85AjkC1wJzBHMEHQdWBYcBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEOQI5AqwErASsBHMEHwhWBVYFxwXHBVYF4wQ5BscFOQIABFYFcwSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEOQI5AjkCwQNzBKoCcwRzBAAEcwRzBDkCcwRzBMcBxwEABMcBqgZzBHMEcwRzBKoCAAQ5AnMEAATHBQAEAAQABKwCFAKsAqwE////////////////////////////////////////////////////////////////////////////////////////OQKqAssDcwRzBB0HxwXnAaoCqgIdA6wEOQKqAjkCOQJzBHMEcwRzBHMEcwRzBHMEcwRzBKoCqgKsBKwErATjBM0HxwXHBccFxwVWBeMEOQbHBTkCcwTHBeMEqgbHBTkGVgU5BscFVgXjBMcFVgWNB1YFVgXjBKoCOQKqAqwEcwSqAnME4wRzBOMEcwSqAuME4wQ5AjkCcwQ5Ah0H4wTjBOME4wQdA3MEqgLjBHMEOQZzBHMEAAQdAz0CHQOsBP///////////////////////////////////////////////////////////////////////////////////////zkCOQLXAnMEcwQdB1YFhwGqAqoCHQOsBDkCqgI5AjkCcwRzBHMEcwRzBHMEcwRzBHMEcwQ5AjkCrASsBKwEcwQfCFYFVgXHBccFVgXjBDkGxwU5AgAEVgVzBKoGxwU5BlYFOQbHBVYF4wTHBVYFjQdWBVYF4wQ5AjkCOQLBA3MEqgJzBHMEAARzBHMEOQJzBHMExwHHAQAExwGqBnMEcwRzBHMEqgIABDkCcwQABMcFAAQABAAErAIUAqwCrAT///////////////////////////////////////////////////////////////////////////////////////85AqoCywNzBHMEHQfHBecBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEqgKqAqwErASsBOMEzQfHBccFxwXHBVYF4wQ5BscFOQJzBMcF4wSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEqgI5AqoCrARzBKoCcwTjBHME4wRzBKoC4wTjBDkCOQJzBDkCHQfjBOME4wTjBB0DcwSqAuMEcwQ5BnMEcwQABB0DPQIdA6wE///weAIAQe6SBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT////////////////////////////////////////////////////////////////////////////////////////NBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0E////////////////////////////////////////////////////////////////////////////////////////zQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBP///////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT//xh5AgBB/ZoHC4YIQI9AAAD///////////////////////////////8CAf///////////////////////////////////////////////wIB5ACIAVgCWAKiA7UC3QA9AT0BwgFYAuQAqAHkABsBWAJYAlgCWAJYAlgCWAJYAlgCWALkAOQAWAJYAlgCuwGyA9kCpAKhAuYCRwIkAtYC+QIBAUQBcQIfAlcD5AL/AnkC/wKdAmcCWgLYArECTQSKAlQCTQI7ARsBOwFYAvQB9AESAkcCzwFHAhQCTQFKAjgC6ADsAPQBKAFYAzgCLAJHAkcCZgHhAV4BMQIDAkkDDQICAs8BYAEJAWABWAL//wAA////////////////////////////////DwH///////////////////////////////////////////////8PAfgAwAFYAlgCsQPWAvMAZgFmAcUBWAL4ALIB+AA5AVgCWAJYAlgCWAJYAlgCWAJYAlgC+AD4AFgCWAJYAssBtgPoArACqAL6AlUCMgLgAgUDGgFiAZkCMgJkA+wCEQOMAhEDrgJ3Am0C4gLJAlkEoAJqAl0CYgE5AWIBWAL0AfQBIwJYAtgBWAIeAmwBXAJJAv8AAwEYAj8BbQNJAkACWAJYAogB6AGAAUMCDwJVAyICDgLaAYcBIAGHAVgC//8AAP///////////////////////////////wIB////////////////////////////////////////////////AgHkAIgBWAJYAqIDtQLdAD0BPQHCAVgC5ACoAeQAGwFYAlgCWAJYAlgCWAJYAlgCWAJYAuQA5ABYAlgCWAK7AbID2QKkAqEC5gJHAiQC1gL5AgEBRAFxAh8CWAPjAv8CeQL/Ap0CZwJaAtgCsAJNBIoCVAJNAjsBGwE7AVgC9AH0ARICRwLPAUcCFAJNAUoCOALoAOwA9AEoAVgDOAIsAkcCRwJmAeEBXgExAgMCSQMNAgICzwFgAQkBYAFYAv//AAD///////////////////////////////8PAf///////////////////////////////////////////////w8B+ADAAVgCWAKxA9YC8wBmAWYBxQFYAvgAsgH4ADkBWAJYAlgCWAJYAlgCWAJYAlgCWAL4APgAWAJYAlgCywG2A+gCsAKoAvoCVQIyAuACBQMaAWIBmAIyAmUD6wIRA4wCEQOuAncCbQLiAskCWQSgAmoCXQJiATkBYgFYAvQB9AEjAlgC2AFYAh4CbAFcAkkC/wADARgCPwFtA0kCQAJYAlgCiAHoAYABQwIPAlUDIgIOAtoBhwEgAYcBWAL//yB5AgBBjqMHC4UIoED/////////////////////////////////////////////////////////////////////////////////////iwI1A64DtAYXBZoHPQYzAh8DHwMABLQGiwLjAosCsgIXBRcFFwUXBRcFFwUXBRcFFwUXBbICsgK0BrQGtAY/BAAIeQV9BZYFKQYOBZoEMwYEBlwCXAI/BXUE5wb8BUwG0wRMBo8FFAXjBNsFeQXpB3sF4wR7BR8DsgIfA7QGAAQABOcEFAVmBBQF7ATRAhQFEgU5AjkCogQ5AssHEgXlBBQFFAVKAysEIwMSBbwEiwa8BLwEMwQXBbICFwW0Bv///////////////////////////////////////////////////////////////////////////////////////8kCpgMrBLQGkQUECPoGcwKoA6gDLwS0BgoDUgMKA+wCkQWRBZEFkQWRBZEFkQWRBZEFkQUzAzMDtAa0BrQGpAQACDEGGQbfBaQGdwV3BZEGsgb6AvoCMwYZBfYHsgbNBt0FzQYpBsMFdQV/BjEG0wgrBssFzQWoA+wCqAO0BgAEAARmBboFvgS6BW0FewO6BbIFvgK+AlIFvgJWCLIFfwW6BboF8gPDBNMDsgU3BWQHKQU3BagEsgXsArIFtAb///////////////////////////////////////////////////////////////////////////////////////+LAjUDrgO0BhcFmgc9BjMCHwMfAwAEtAaLAuMCiwKyAhcFFwUXBRcFFwUXBRcFFwUXBRcFsgKyArQGtAa0Bj8EAAh5BX0FlgUpBg4FmgQzBgQGXAJcAj8FdQTnBvwFTAbTBEwGjwUUBeME2wV5BekHewXjBHsFHwOyAh8DtAYABAAE5wQUBWYEFAXsBNECFAUSBTkCOQKiBDkCywcSBeUEFAUUBUoDKwQjAxIFvASLBrwEvAQzBBcFsgIXBbQG////////////////////////////////////////////////////////////////////////////////////////yQKmAysEkQWRBQQI+gZzAqgDqAMvBLQGCgNSAwoD7AKRBZEFkQWRBZEFkQWRBZEFkQWRBTMDMwO0BrQGtAakBAAIMQYZBt8FpAZ3BXcFkQayBvoC+gIzBhkF9geyBs0G3QXNBikGwwV1BX8GMQbTCCsGywXNBagD7AKoA7QGAAQABGYFugW+BLoFbQV7A7oFsgW+Ar4CUgW+AlYIsgV/BboFugXyA8ME0wOyBTcFZAcpBTcFqASyBewCsgW0Bv//KHkCAEGeqwcLhQigQGYE////////////////////////////////AAD///////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//9mBP///////////////////////////////wAA////////////////////////////////////////////////ZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBP//ZgT///////////////////////////////8AAP///////////////////////////////////////////////2YEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgT///////////////////////////////////////////////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//80eQIAQa6zBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////2kC8AKZAjIEMgTNBKYFRwHwAvAC8AIyBPAC8ALwAjIEMgQyBDIEMgQyBDIEMgQyBDIEMgTwAvACMgQyBDIE8AIqBrgEhwTJBOgESQQzBGkFPAU6AtADmwQNBK0FGwVkBXYEaAWoBNkDpQQwBbME0QZ0BJAEZwTwAtgC8AIyBDIEMgQ0BHUE9gN1BF0E9QIEBF8ESALvAgkEXAKkBl8ESwR1BHUEHAM9AywDXwTrA/QFAgTyA8wD8AIyBPACMgT///////////////////////////////////////////////////////////////////////////////////////9pAvAC7wKwBLAEeQWmBdYB8ALwAnUDsATwAvAC8AIfA7AEsASwBLAEsASwBLAEsASwBLAE8ALwArAEsASwBIEDKgYRBcME5QQkBY0EqwRfBXgFOgJDBPAEbAT2BVcFoAWyBKwF4wQXBOUEbAX5BBIHzgToBHsENwPYAjcDsASwBLAEQwSnBBgEpQSZBPUCBAS+BGMC7wJiBFwC4Aa5BIcEqQSsBGsDcgMsA7oEOARFBmsERQQ6BHgDsAR4A7AE////////////////////////////////////////////////////////////////////////////////////////aQLwApkCMgTZA80EpgVHAfAC8ALwAjIE8ALwAvACMgQyBDIEMgQyBDIEMgQyBDIEMgQyBPAC8AIyBDIEMgTwAioG4wSHBMkE6ARJBDMEaQU8BToC0AObBA0EFwYbBWQFWQRkBagE2QOlBDAFswTRBnQEkARnBPAC2ALwAjIEMgQyBDQEdQSuA3UETAQ2AwQEdQR0Au8CCQSQAqQGXwRLBHUEdQRVAz0DXAN0BOsD9AUCBPIDzAPwAjIE8AIyBP///////////////////////////////////////////////////////////////////////////////////////2kC8AIgA7AEsATcBaYFaQLwAvACdQOwBPAC8ALwAi0DsASwBLAEsASwBLAEsASwBLAEsATwAvACsASwBLAELQMqBukEuATnBA8FvwSvBGkFbQU6Av0DMwU6BEoGSAWeBasEKAb9BAMEewVLBXcFaQdBBXgF5ATiA9ID4gOwBLAEsAS+BL8E8QO/BGoESANIBH8EnQIaA1EEjwKkBn8EjwTKBMoEkwOsA4EDdQRrBDAGmwSDBEME4gOwBOIDsAT//0B5AgBBvrsHC4UIoED/////////////////////////////////////////////////////////////////////////////////////0AImA6wDjAYWBZwI0AUmAqIDogMWBYwG6QKiA+kCogMWBRYFFgUWBRYFFgUWBRYFFgUWBaIDogOMBowGjAZdBAAIeAV8BZYFKgYPBZkENAYDBl4DowOLBXQEvgb8BUwG0wRMBpAFeAXuBNsFeAXpB3sF7AR7BaIDogOiA4wGFgUWBc4E/AQrBPwExATQAvwEEAUyAsECvAQyAsgHEAXbBPwE/ARqAysEJwMQBbwEjAa8BLwENAQUBaIDFAWMBv///////////////////////////////////////////////////////////////////////////////////////7wCOAOzBPAGsAUtCuYGqAJZBFkEsAXwBuQC1wPkAoQFsAWwBbAFsAWwBbAFsAWwBbAFsAU4AzgD8AbwBvAG7wS2BzYGGAbKBaQGdwU0BX0GswZeBHEEKwYZBZUHxgbNBt0FzQZCBq8FdAV/BhwGBwkcBuUFiQVZBIQFWQTwBrAFsAVYBZgFtQSYBVAFYQOYBbMFvAI5A14FvAJ3CLMFfgWYBZgF+gO/BKUDswUzBdYHWgU1BcYEsAVZBLAF8Ab////////////////////////////////////////////////////////////////////////////////////////QAiYDrAOMBhYFnAjQBSYCogOiAxYFjAbpAqID6QKiAxYFFgUWBRYFFgUWBRYFFgUWBRYFogOiA4wGjAaMBl0EAAh2BXwFlgUgBg8FmQQ0BgMGXgOjA4sFdAS+BvwFTAbTBEwGkAV4Be4E2wV2BewHewXsBHsFogOiA6IDjAYWBRYFzgT8BCsE/ATEBNAC+QQQBTICwQKyBDICyQcQBdsE/AT8BGoDKwQnAxAFugSMBrwEugQ0BBQFogMUBYwG////////////////////////////////////////////////////////////////////////////////////////vAI4A7ME8AawBS0K5gaoAlkEWQSwBfAG5ALXA+QChAWwBbAFsAWwBbAFsAWwBbAFsAWwBTgDOAPwBvAG8AbvBLYHNgYYBsoFpAZ3BTQFfQazBl4EcQQrBhkFlQfGBs0G3QXNBkIGrwV0BX8GHAYHCRwG5QWJBVkEhAVZBPAGsAWwBVgFmAW1BJgFUAVhA5gFswW8AjkDXgW8AncIswV8BZgFmAX6A78EpQOzBTEF1gdaBTUFxgSwBVkEsAXwBv//SHkCAEHOwwcLhQigQP////////////////////////////////////////////////////////////////////////////////////8UAiMCNQMrBZMElgbXBcUBXgJeAmoEkwT2AZMCIQLwApMEkwSTBJMEkwSTBJMEkwSTBJMEIQIhApMEkwSTBG8DMQcQBS8FDAXVBXMEIQTTBecFOwIjAukEJwQ5BwgGOwbRBDsG8gRkBG0E0wXDBGgHngR7BJEEogLwAqICVgSWA54EcwTnBM8D5wR9BLYCYgTpBAYCBgIzBAYCcQfpBNUE5wTnBEQD0QPTAukEAgQ5BjEECAS+AwgDaAQIA5ME////////////////////////////////////////////////////////////////////////////////////////FAJKAscDKwWRBDUHAAYhArYCtgJcBJEEUgKTAkgCTgORBJEEkQSRBJEEkQSRBJEEkQSRBEgCUgKRBJEEkQTRAy0HhQVgBRkF7AV7BGQEywUfBqYCpgJQBYUEiweBBl4GBgVeBkgFaASiBAwGMwW8B1YF/gSiBKYCTgOmAkIESgPbBNUEEAUdBBAFugQZA4UEQgVxAnEC9gRxAtsHQgX0BBAFEAWiA/oDeQNCBY0E2QagBI0E5wMnA2gEJwORBP///////////////////////////////////////////////////////////////////////////////////////xQCEgIXAysFaARYBlwFvAFIAkgCagRoBOwBfwIGAs0CaARoBGgEaARoBGgEaARoBGgEaAQGAgYCaARoBGgEagPHBnEEyQSuBFQFFwTHA2oFbQUvAiMCdQTLA7IGngXDBYcEwwWNBAQE/ANoBWIE0QYnBAYEPwRKAs0CSgIjBCcDbwSFBJ4EmgOeBPIDgQICBJ4ECAIIAucDCAL6Bp4EfQSeBJ4EKwNtA5gCngSyA7wF0wOyA40DywJoBMsCaAT///////////////////////////////////////////////////////////////////////////////////////8UAkoCoAMrBWgE2QaqBQoCtgK2AlwEaAQ5ApMCSAJeA2gEaARoBGgEaARoBGgEaARoBGgESAJIAmgEaARoBKwD2QYGBfYE5QRqBVYEPwSFBZoFkwKmAucEJQQKBwoG1wWkBNcF3wQ9BD8EhwW4BCcH2QSDBEoEpgJeA6YCOQQzA28EwQTDBN0DwQR1BPwCVATVBGACYAKLBGACPQfVBK4EwwTBBF4DyQNIA9UEGQROBj8EJwSkA9cCaATXAmgE//9QeQIAQd7LBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////+4BpgJLAyUF4QSKBq8FuQEAAwADxwMlBSgC/gIoAsAD6QRwA3gEagSFBDoEhwQFBMUEhwSAAoACJQUlBSUF1ANuB14FOwUjBf4FOgXLBM0FhQYeAyQEjgXUBGsHIwb0BeEE9AWdBX0E8wQNBlUFzgevBewE0AQAA8ADAAMlBSUFAAQIBHsEogOYBN4DmgITBKgEWAJWAkkESgIMB7oEUASSBHoERwN1A8MCmgT5A+YFCgTwA40DcQMAA3EDJQX///////////////////////////////////////////////////////////////////////////////////////8IAgMDFASgBSAFCQdlBicCkwOTA9sDoAWgAggDoALGA5wF6wMDBf8EMgXLBC8FbwRpBS8F8ALwAqAFoAWgBWMEvAcRBg8GuQWsBsUFXwV1Bk4HkQPDBIkGfAUwCLcGjwacBY8GYQYxBXkFqwYZBgMJeAbbBYQFkwPGA5MDoAWgBQAExAQqBUAETgWTBCUDnQRwBdQCxQIOBcECIAiFBRYFQwUwBSkEGgQuA2oFiQToBrQEfwQ0BAAEGgMABKAF////////////////////////////////////////////////////////////////////////////////////////7gGmAksDJQXhBIoGrwW5AQADAAPHAyUFKAL+AigCwAPpBHADeARqBIUEOgSHBPkDxQSHBBIDEgMlBSUFJQXUA24HXgU7BSMF/gU6BcsEzQWFBh4DJASOBdQEawcjBtgF4QTYBZ0FfQTzBA0GVQXOB68F7ATQBAADwAMAAyUFJQUABJUEbgShA5oExgOhApUEgARhAlQCOQRIAgkHuARMBKAEcQSxA3MDxwKaBE4ElAYCBHoEjQNxAwADcQMlBf///////////////////////////////////////////////////////////////////////////////////////wgCAwMUBKAFIAUJB2UGJwKTA5MD2wOgBaACCAOgAsYDnAXrAwMF/wQyBcsELwWIBGkFLwXwAvACoAWgBaAFYwS8BxEGEwa5BawGxQVfBXUGTgebA8MEiQZ8BUQIowaPBqYFjwZhBjkFeQWrBhkGAwlrBtsFhAWTA8YDkwOgBaAFAARIBTEFSQRNBXUEDAMyBWcF7QLrAiEF1gIECIUFFgVNBTMFRQQjBFYDewXmBHgHqwRbBSMEAAQaAwAEoAX//1h5AgBB7tMHC8gKoED/////////////////////////////////////////////////////////////////////////////////////zwGbAjUD/AMOBLgFdQXEAW0CbQL8A/wD/wFzAgUCFwMOBA4EDgQOBA4EDgQOBA4EDgQOBCQCJAL8A/wD/AO1AycHoQRaBEQE7AToA60DDAX8BAQCjQIoBF0D1wYqBUwFIgRiBVgErQPmAyIFigQeBycE5gO/A3QCFwN0AvwD/ANUAtUDNARiAzQE+wNxAsQDNATWAeoBowPWAWQGNAQ4BDQENATKAiEDrgI0BJ0DuAV3A58DKQOEAq8DhAL8A///AAD///////////////////////////////8AAP///////////////////////////////////////////////88BmwKCA/wDDgTVBaMF3gF+An4C/AP8AxACcwIjAnADDgQOBA4EDgQOBA4EDgQOBA4EDgQ1AjUC/AP8A/wDtQMwB9kEfAQ8BAsF5wOsAxkFDAUiAqYCYARiA/4GRQVpBUIEfQWBBMgD9gM5BbsEQAdoBCgE0wOZAnADmQL8A/wDZwLzA0sEWQNLBAcEiALLA0sE9wELAtcD9wGCBksETQRLBEsE2AIxA8YCSwTJA/YFrQPKAy4DwALNA8AC/AP////////////////////////////////////////////////////////////////////////////////////////PAZsCNQP8Aw4EuAV1BcQBbQJtAvwD/AP/AXMCBQIaAw4EDgQOBA4EDgQOBA4EDgQOBA4EJAIkAvwD/AP8A7UDJwehBFoELgTsBOgDrQMMBfwEBAKNAigEXQPXBigFPAUiBFAFWASeA+YDIgWKBB8HJwTmA78DdAITA3QC/AP8A1QCHQQdBFQDHQTSA3ECHQQdBNYB6gGjA9YBVAYdBBsEHQQdBL4CHQOuAh0EkQO4BXcDlAMpA4QCrwOEAvwD////////////////////////////////////////////////////////////////////////////////////////zwGbAoID/AMOBNUFowXeAX4CfgL8A/wDEAJzAiMCeQMOBA4EDgQOBA4EDgQOBA4EDgQOBDUCNQL8A/wD/AO1AzAH2QR8BCYECwXnA6wDGQUMBSICpgJgBGID/gZABVkFQgRrBYEEuQP2AzkFuwRBB2gEKATTA5kCZgOZAvwD/ANnAjkEOQRLAzkE7gOIAjkEOAT3AQsC1wP3AW4GOAQ4BDkEOQTRAicDxgI4BMED9gWtA8MDLgPAAs0DwAL8A///DAAAAAQAAAAGAAAAAgAAAAMAAAABAAAACQAAAAgAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAFEAAABSAAAAUwAAAFQAAABV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APUAAABlFwAAlyIAALo2AAD2AAAAt2AAALYAAABFDgAAAiIAAFM3AAAwIAAAYCwAAKUiAAAjOwAAxgMAAM46AADAAwAAjAsAANYDAAAqMgAAsQAAAOhRAACjAAAADEwAADIgAABTUQAADyIAAKQsAAAdIgAAszoAAMgDAABiDgAAIgAAALAaAADSIQAA+1oAABoiAABSQAAAKiMAAL8uAAC7AAAAlxoAAJIhAABaNwAACSMAAJkuAAAdIAAADzkAABwhAAAIQQAArgAAAEMbAAALIwAARC8AAMEDAABSNgAADyAAALEuAAA6IAAAjS4AABkgAACrLgAAGiAAAIcwAABhAQAA7A4AAMUiAADSEQAApwAAADIHAACtAAAA6GAAAMMDAAC8QgAAwgMAAFY2AAA8IgAAoxgAAGAmAACpXwAAgiIAABRRAACGIgAA7zUAABEiAAA8LAAAgyIAANK3AAC5AAAAhqkAALIAAABimwAAswAAAO1KAACHIgAAmUAAAN8AAADrCwAAxAMAAE2QAAA0IgAAbGAAALgDAADeNQAA0QMAAEosAAAJIAAAQDAAAP4AAAAkUAAA3AIAAGYXAADXAAAAMVAAACIhAACrGgAA0SEAALxHAAD6AAAAkRoAAJEhAABaWQAA+wAAAPhEAAD5AAAA6DYAAKgAAAAbPQAA0gMAAOIwAADFAwAAtTYAAPwAAABlLAAAGCEAALA6AAC+AwAAtUcAAP0AAAC2MgAApQAAALA2AAD/AAAAZ2AAALYDAACWOgAADSAAAJo6AAAMIAAA5z8BAAgAAAADAAAA5T4AACLQAAALAAAABgAAAFcVAADzaAAAAgAAAAEAAADKLAAApXQAAAQAAAACAAAAGUIAAAAEAAADAAAABAAAAAxBAAAu0AAABQAAAAUAAAC4QgAABAQAAAQAAAAHAAAALRUAAKo2AAAFAAAACQAAAKw2AAAibQAABAAAAAoAAAAsQgAAQPkBAAQAAAAMAAAAsC8AAAAAAQAAAdDR0tPU1dbX2NkAQebyBwsJ8L8AAAAAAAABAEH48gcLDWludmlzAABmaWxsZWQAQZDzBwsaMBoAACJRAADPNQAAbgsAAPR4AABpxgAAVY4AQdDzBwt5//////////////////////////////////////////8AAAAAAAAABP7//4f+//8HAAAAAAAAAAD//3////9///////////N//v3//////3///////////w/g/////zH8////AAAAAAAAAP//////////////AQD4AwBB4PQHC0FA1///+/////9/f1T9/w8A/t////////////7f/////wMA////////nxn////PPwMAAAAAAAD+////fwL+////fwBBqvUHC7MB////BwcAAAAAAP7//wf+BwAAAAD+//////////98/38vAGAAAADg////////IwAAAP8DAAAA4J/5///9xQMAAACwAwADAOCH+f///W0DAAAAXgAAHADgr/v///3tIwAAAAABAAAA4J/5///9zSMAAACwAwAAAODHPdYYx78DAAAAAAAAAADg3/3///3vAwAAAAADAAAA4N/9///97wMAAABAAwAAAODf/f///f8DAAAAAAMAQfD2BwsZ/v////9/DQA/AAAAAAAAAJYl8P6ubA0gHwBBmPcHCwb//v///wMAQcT3Bwty/////z8A/////38A7doHAAAAAFABUDGCq2IsAAAAAEAAyYD1BwAAAAAIAQL/////////////////////////D///////////////A///Pz//////Pz//qv///z/////////fX9wfzw//H9wfAAAAAEBMAEHA+AcLAQcAQdD4BwsmgAAAAP4DAAD+////////////HwD+/////////////wfg/////x8AQZD5BwsV//////////////////////////8/AEGw+QcLFf//////////////////////////DwBB1fkHC8kCYP8H/v//h/7//wcAAAAAAACAAP//f////3//////AAAAAAAAAP//////////////AQD4AwADAAAAAAD//////////z8AAAADAAAAwNf///v/////f39U/f8PAP7f///////////+3/////97AP///////58Z////zz8DAAAAAAAA/v///38C/v///38A/v/7//+7FgD///8HBwAAAAAA/v//B///BwD/A////////////3z/f+///z3/A+7////////z/z8e/8//AADun/n///3F0585gLDP/wMA5If5///9bdOHOQBewP8fAO6v+////e3zvzsAAMH/AADun/n///3N8485wLDD/wAA7Mc91hjHv8PHPYAAgP8AAO7f/f//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rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/xcArv93AK7/BwAuAK7/JgCu/xcAEQAjAK7/DQCu/67/rv+u/zoArv+u/zUArv+u/67/KACu/wcArv87AEUArv9IAK7/rv+u/67/rv8AQYG1CAvBBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygAAAAAAAAAAAICAgICAhAMWQEAH1AIAwcSExRXFhcIC2kMHwoFDA4pESsPLRAvMCAyBjQ1GxwdHgsMISIjJCUmJygMGBkXBAobHBogKgohIiMkJSYnKAwKDlMKLFgxWFhYWFhYDBscDy5YMyEiIyQlJicoGxz/U///ISIjJCUmJygM//8F////CRT//////wwbHP8QFRYhIiMkJSYnKBsc/////yEiIyQlJicoDP8SExQRFhf///////8MGxz///8SISIjJCUmJygbHP////8hIiMkJSYnKAz///////8T////////DBsc/////yEiIyQlJicoGxz/////ISIjJCUmJygSExQVFhcYGf///////////yMkJSYnGxITFBYXIjZoAR84ViEgAhsbG14bGzc5cDbSwk8EPCJHIj8iRCIiWCJlIiIFBl9gOQQHCAkKCwwNDgRmZ11qbQUGb1g7cQcICQoLDA0OBHI8W3M+YUYbEhMUFhcEBQY/QWJJBwgJCgsMDQ4FBgBcAAAHCAkKCwwNDgQAAE8AAABTQgAAAAAABAUGAERUVQcICQoLDA0OBQYAAAAABwgJCgsMDQ4EACosLkcxMwAAAAAAAAQFBgAAAEoHCAkKCwwNDgUGAAAAAAcICQoLDA0OBAAAAAAA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X0NUWVBFAAAAAExDX05VTUVSSUMAAExDX1RJTUUAAAAAAExDX0NPTExBVEUAAExDX01PTkVUQVJZAExDX01FU1NBR0VTAEHw9QgLB0MuVVRGLTgAQYj2CAugEDCrAgDIqwIAWKwCAE5vIGVycm9yIGluZm9ybWF0aW9uAElsbGVnYWwgYnl0ZSBzZXF1ZW5jZQBEb21haW4gZXJyb3IAUmVzdWx0IG5vdCByZXByZXNlbnRhYmxlAE5vdCBhIHR0eQBQZXJtaXNzaW9uIGRlbmllZABPcGVyYXRpb24gbm90IHBlcm1pdHRlZABObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5AE5vIHN1Y2ggcHJvY2VzcwBGaWxlIGV4aXN0cwBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRhdGEgdHlwZQBObyBzcGFjZSBsZWZ0IG9uIGRldmljZQBPdXQgb2YgbWVtb3J5AFJlc291cmNlIGJ1c3kASW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwAUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUASW52YWxpZCBzZWVrAENyb3NzLWRldmljZSBsaW5rAFJlYWQtb25seSBmaWxlIHN5c3RlbQBEaXJlY3Rvcnkgbm90IGVtcHR5AENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgBPcGVyYXRpb24gdGltZWQgb3V0AENvbm5lY3Rpb24gcmVmdXNlZABIb3N0IGlzIGRvd24ASG9zdCBpcyB1bnJlYWNoYWJsZQBBZGRyZXNzIGluIHVzZQBCcm9rZW4gcGlwZQBJL08gZXJyb3IATm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwBCbG9jayBkZXZpY2UgcmVxdWlyZWQATm8gc3VjaCBkZXZpY2UATm90IGEgZGlyZWN0b3J5AElzIGEgZGlyZWN0b3J5AFRleHQgZmlsZSBidXN5AEV4ZWMgZm9ybWF0IGVycm9yAEludmFsaWQgYXJndW1lbnQAQXJndW1lbnQgbGlzdCB0b28gbG9uZwBTeW1ib2xpYyBsaW5rIGxvb3AARmlsZW5hbWUgdG9vIGxvbmcAVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0ATm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUAQmFkIGZpbGUgZGVzY3JpcHRvcgBObyBjaGlsZCBwcm9jZXNzAEJhZCBhZGRyZXNzAEZpbGUgdG9vIGxhcmdlAFRvbyBtYW55IGxpbmtzAE5vIGxvY2tzIGF2YWlsYWJsZQBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1cgBTdGF0ZSBub3QgcmVjb3ZlcmFibGUAUHJldmlvdXMgb3duZXIgZGllZABPcGVyYXRpb24gY2FuY2VsZWQARnVuY3Rpb24gbm90IGltcGxlbWVudGVkAE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlAElkZW50aWZpZXIgcmVtb3ZlZABEZXZpY2Ugbm90IGEgc3RyZWFtAE5vIGRhdGEgYXZhaWxhYmxlAERldmljZSB0aW1lb3V0AE91dCBvZiBzdHJlYW1zIHJlc291cmNlcwBMaW5rIGhhcyBiZWVuIHNldmVyZWQAUHJvdG9jb2wgZXJyb3IAQmFkIG1lc3NhZ2UARmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZQBOb3QgYSBzb2NrZXQARGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZABNZXNzYWdlIHRvbyBsYXJnZQBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQAUHJvdG9jb2wgbm90IGF2YWlsYWJsZQBQcm90b2NvbCBub3Qgc3VwcG9ydGVkAFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQATm90IHN1cHBvcnRlZABQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZABBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sAEFkZHJlc3Mgbm90IGF2YWlsYWJsZQBOZXR3b3JrIGlzIGRvd24ATmV0d29yayB1bnJlYWNoYWJsZQBDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsAQ29ubmVjdGlvbiBhYm9ydGVkAE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUAU29ja2V0IGlzIGNvbm5lY3RlZABTb2NrZXQgbm90IGNvbm5lY3RlZABDYW5ub3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24AT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MAT3BlcmF0aW9uIGluIHByb2dyZXNzAFN0YWxlIGZpbGUgaGFuZGxlAFJlbW90ZSBJL08gZXJyb3IAUXVvdGEgZXhjZWVkZWQATm8gbWVkaXVtIGZvdW5kAFdyb25nIG1lZGl1bSB0eXBlAE11bHRpaG9wIGF0dGVtcHRlZABSZXF1aXJlZCBrZXkgbm90IGF2YWlsYWJsZQBLZXkgaGFzIGV4cGlyZWQAS2V5IGhhcyBiZWVuIHJldm9rZWQAS2V5IHdhcyByZWplY3RlZCBieSBzZXJ2aWNlAAAAAAClAlsA8AG1BYwFJQGDBh0DlAT/AMcDMQMLBrwBjwF/A8oEKwDaBq8AQgNOA9wBDgQVAKEGDQGUAgsCOAZkArwC/wJdA+cECwfPAssF7wXbBeECHgZFAoUAggJsA28E8QDzAxgF2QDaA0wGVAJ7AZ0DvQQAAFEAFQK7ALMDbQD/AYUELwX5BDgAZQFGAZ8AtwaoAXMCUwEAQdiGCQsMIQQAAAAAAAAAAC8CAEH4hgkLBjUERwRWBABBjocJCwKgBABBoocJCyJGBWAFbgVhBgAAzwEAAAAAAAAAAMkG6Qb5Bh4HOQdJB14HAEHQhwkLkQHRdJ4AV529KoBwUg///z4nCgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QUYAAAANQAAAHEAAABr////zvv//5K///8AAAAAAAAAABkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEHxiAkLIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBBq4kJCwEMAEG3iQkLFRMAAAAAEwAAAAAJDAAAAAAADAAADABB5YkJCwEQAEHxiQkLFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABBn4oJCwESAEGrigkLHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBB4ooJCw4aAAAAGhoaAAAAAAAACQBBk4sJCwEUAEGfiwkLFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABBzYsJCwEWAEHZiwkLJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBBpIwJCwILAgBBzIwJCwj//////////wBBkI0JC/UI/////////////////////////////////////////////////////////////////wABAgMEBQYHCAn/////////CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiP///////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAQIEBwMGBQAAAAAAAAACAADAAwAAwAQAAMAFAADABgAAwAcAAMAIAADACQAAwAoAAMALAADADAAAwA0AAMAOAADADwAAwBAAAMARAADAEgAAwBMAAMAUAADAFQAAwBYAAMAXAADAGAAAwBkAAMAaAADAGwAAwBwAAMAdAADAHgAAwB8AAMAAAACzAQAAwwIAAMMDAADDBAAAwwUAAMMGAADDBwAAwwgAAMMJAADDCgAAwwsAAMMMAADDDQAA0w4AAMMPAADDAAAMuwEADMMCAAzDAwAMwwQADNsAAAAAVEkCAA0CAAAOAgAADwIAABACAAARAgAAEgIAABMCAAAUAgAAFQIAABYCAAAXAgAAGAIAABkCAAAaAgAABAAAAAAAAACQSQIAGwIAABwCAAD8/////P///5BJAgAdAgAAHgIAALhIAgDMSAIAAAAAANhJAgAfAgAAIAIAAA8CAAAQAgAAIQIAACICAAATAgAAFAIAABUCAAAjAgAAFwIAACQCAAAZAgAAJQIAAMh0AgAoSQIA7EoCAE5TdDNfXzI5YmFzaWNfaW9zSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFAAAAoHQCAFxJAgBOU3QzX18yMTViYXNpY19zdHJlYW1idWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUUAAAAAJHUCAKhJAgAAAAAAAQAAABxJAgAD9P//TlN0M19fMjEzYmFzaWNfb3N0cmVhbUljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQAAyHQCAORJAgBUSQIATlN0M19fMjE1YmFzaWNfc3RyaW5nYnVmSWNOU18xMWNoYXJfdHJhaXRz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";return D}var fA;function XA(D){if(D==fA&&E)return new Uint8Array(E);var M=m(D);if(M)return M;throw"both async and sync fetching of the wasm failed"}function DA(D){return Promise.resolve().then(()=>XA(D))}function ee(D,M,R){return DA(D).then(V=>WebAssembly.instantiate(V,M)).then(R,V=>{h(`failed to asynchronously prepare wasm: ${V}`),PA(V)})}function NA(D,M,R,V){return ee(M,R,V)}function ke(){return{a:Ut}}function HA(){var D=ke();function M(V,_){return st=V.exports,v=st.y,W(),rA(st.z),pA(),st}zA();function R(V){M(V.instance)}return fA??=YA(),NA(E,fA,D,R).catch(o),{}}function vA(D){return i.agerrMessages.push(xe(D)),0}function Gt(D){this.name="ExitStatus",this.message=`Program terminated with exit(${D})`,this.status=D}var ft=D=>{D.forEach(M=>M(i))};function he(D,M="i8"){switch(M.endsWith("*")&&(M="*"),M){case"i1":return S[D];case"i8":return S[D];case"i16":return x[D>>1];case"i32":return F[D>>2];case"i64":return Z[D>>3];case"float":return P[D>>2];case"double":return tA[D>>3];case"*":return z[D>>2];default:PA(`invalid type for getValue: ${M}`)}}var Ot=D=>Xi(D),He=()=>pn(),je=typeof TextDecoder<"u"?new TextDecoder:void 0,pt=(D,M=0,R=NaN)=>{for(var V=M+R,_=M;D[_]&&!(_>=V);)++_;if(_-M>16&&D.buffer&&je)return je.decode(D.subarray(M,_));for(var q="";M<_;){var nA=D[M++];if(!(nA&128)){q+=String.fromCharCode(nA);continue}var cA=D[M++]&63;if((nA&224)==192){q+=String.fromCharCode((nA&31)<<6|cA);continue}var MA=D[M++]&63;if((nA&240)==224?nA=(nA&15)<<12|cA<<6|MA:nA=(nA&7)<<18|cA<<12|MA<<6|D[M++]&63,nA<65536)q+=String.fromCharCode(nA);else{var oe=nA-65536;q+=String.fromCharCode(55296|oe>>10,56320|oe&1023)}}return q},xe=(D,M)=>D?pt(b,D,M):"",oi=(D,M,R,V)=>{PA(`Assertion failed: ${xe(D)}, at: `+[M?xe(M):"unknown filename",R,V?xe(V):"unknown function"])};class j{constructor(M){this.excPtr=M,this.ptr=M-24}set_type(M){z[this.ptr+4>>2]=M}get_type(){return z[this.ptr+4>>2]}set_destructor(M){z[this.ptr+8>>2]=M}get_destructor(){return z[this.ptr+8>>2]}set_caught(M){M=M?1:0,S[this.ptr+12]=M}get_caught(){return S[this.ptr+12]!=0}set_rethrown(M){M=M?1:0,S[this.ptr+13]=M}get_rethrown(){return S[this.ptr+13]!=0}init(M,R){this.set_adjusted_ptr(0),this.set_type(M),this.set_destructor(R)}set_adjusted_ptr(M){z[this.ptr+16>>2]=M}get_adjusted_ptr(){return z[this.ptr+16>>2]}}var $=0,oA=(D,M,R)=>{var V=new j(D);throw V.init(M,R),$=D,$},sA={isAbs:D=>D.charAt(0)==="/",splitPath:D=>{var M=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return M.exec(D).slice(1)},normalizeArray:(D,M)=>{for(var R=0,V=D.length-1;V>=0;V--){var _=D[V];_==="."?D.splice(V,1):_===".."?(D.splice(V,1),R++):R&&(D.splice(V,1),R--)}if(M)for(;R;R--)D.unshift("..");return D},normalize:D=>{var M=sA.isAbs(D),R=D.substr(-1)==="/";return D=sA.normalizeArray(D.split("/").filter(V=>!!V),!M).join("/"),!D&&!M&&(D="."),D&&R&&(D+="/"),(M?"/":"")+D},dirname:D=>{var M=sA.splitPath(D),R=M[0],V=M[1];return!R&&!V?".":(V&&(V=V.substr(0,V.length-1)),R+V)},basename:D=>{if(D==="/")return"/";D=sA.normalize(D),D=D.replace(/\/$/,"");var M=D.lastIndexOf("/");return M===-1?D:D.substr(M+1)},join:(...D)=>sA.normalize(D.join("/")),join2:(D,M)=>sA.normalize(D+"/"+M)},TA=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return D=>crypto.getRandomValues(D);PA("initRandomDevice")},de=D=>(de=TA())(D),Qe={resolve:(...D)=>{for(var M="",R=!1,V=D.length-1;V>=-1&&!R;V--){var _=V>=0?D[V]:G.cwd();if(typeof _!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!_)return"";M=_+"/"+M,R=sA.isAbs(_)}return M=sA.normalizeArray(M.split("/").filter(q=>!!q),!R).join("/"),(R?"/":"")+M||"."},relative:(D,M)=>{D=Qe.resolve(D).substr(1),M=Qe.resolve(M).substr(1);function R(oe){for(var se=0;se=0&&oe[Ee]==="";Ee--);return se>Ee?[]:oe.slice(se,Ee-se+1)}for(var V=R(D.split("/")),_=R(M.split("/")),q=Math.min(V.length,_.length),nA=q,cA=0;cA{for(var M=0,R=0;R=55296&&V<=57343?(M+=4,++R):M+=3}return M},ht=(D,M,R,V)=>{if(!(V>0))return 0;for(var _=R,q=R+V-1,nA=0;nA=55296&&cA<=57343){var MA=D.charCodeAt(++nA);cA=65536+((cA&1023)<<10)|MA&1023}if(cA<=127){if(R>=q)break;M[R++]=cA}else if(cA<=2047){if(R+1>=q)break;M[R++]=192|cA>>6,M[R++]=128|cA&63}else if(cA<=65535){if(R+2>=q)break;M[R++]=224|cA>>12,M[R++]=128|cA>>6&63,M[R++]=128|cA&63}else{if(R+3>=q)break;M[R++]=240|cA>>18,M[R++]=128|cA>>12&63,M[R++]=128|cA>>6&63,M[R++]=128|cA&63}}return M[R]=0,R-_};function tt(D,M,R){var V=R>0?R:OA(D)+1,_=new Array(V),q=ht(D,_,0,_.length);return M&&(_.length=q),_}var ze=()=>{if(!GA.length){var D=null;if(typeof window<"u"&&typeof window.prompt=="function"&&(D=window.prompt("Input: "),D!==null&&(D+=` -`)),!D)return null;GA=tt(D,!0)}return GA.shift()},Oe={ttys:[],init(){},shutdown(){},register(D,M){Oe.ttys[D]={input:[],output:[],ops:M},G.registerDevice(D,Oe.stream_ops)},stream_ops:{open(D){var M=Oe.ttys[D.node.rdev];if(!M)throw new G.ErrnoError(43);D.tty=M,D.seekable=!1},close(D){D.tty.ops.fsync(D.tty)},fsync(D){D.tty.ops.fsync(D.tty)},read(D,M,R,V,_){if(!D.tty||!D.tty.ops.get_char)throw new G.ErrnoError(60);for(var q=0,nA=0;nA0&&(d(pt(D.output)),D.output=[])},ioctl_tcgets(D){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(D,M,R){return 0},ioctl_tiocgwinsz(D){return[24,80]}},default_tty1_ops:{put_char(D,M){M===null||M===10?(h(pt(D.output)),D.output=[]):M!=0&&D.output.push(M)},fsync(D){D.output&&D.output.length>0&&(h(pt(D.output)),D.output=[])}}},Ci=(D,M)=>{b.fill(0,D,D+M)},gn=(D,M)=>Math.ceil(D/M)*M,hn=D=>{D=gn(D,65536);var M=Oi(65536,D);return M&&Ci(M,D),M},Ke={ops_table:null,mount(D){return Ke.createNode(null,"/",16895,0)},createNode(D,M,R,V){if(G.isBlkdev(R)||G.isFIFO(R))throw new G.ErrnoError(63);Ke.ops_table||={dir:{node:{getattr:Ke.node_ops.getattr,setattr:Ke.node_ops.setattr,lookup:Ke.node_ops.lookup,mknod:Ke.node_ops.mknod,rename:Ke.node_ops.rename,unlink:Ke.node_ops.unlink,rmdir:Ke.node_ops.rmdir,readdir:Ke.node_ops.readdir,symlink:Ke.node_ops.symlink},stream:{llseek:Ke.stream_ops.llseek}},file:{node:{getattr:Ke.node_ops.getattr,setattr:Ke.node_ops.setattr},stream:{llseek:Ke.stream_ops.llseek,read:Ke.stream_ops.read,write:Ke.stream_ops.write,allocate:Ke.stream_ops.allocate,mmap:Ke.stream_ops.mmap,msync:Ke.stream_ops.msync}},link:{node:{getattr:Ke.node_ops.getattr,setattr:Ke.node_ops.setattr,readlink:Ke.node_ops.readlink},stream:{}},chrdev:{node:{getattr:Ke.node_ops.getattr,setattr:Ke.node_ops.setattr},stream:G.chrdev_stream_ops}};var _=G.createNode(D,M,R,V);return G.isDir(_.mode)?(_.node_ops=Ke.ops_table.dir.node,_.stream_ops=Ke.ops_table.dir.stream,_.contents={}):G.isFile(_.mode)?(_.node_ops=Ke.ops_table.file.node,_.stream_ops=Ke.ops_table.file.stream,_.usedBytes=0,_.contents=null):G.isLink(_.mode)?(_.node_ops=Ke.ops_table.link.node,_.stream_ops=Ke.ops_table.link.stream):G.isChrdev(_.mode)&&(_.node_ops=Ke.ops_table.chrdev.node,_.stream_ops=Ke.ops_table.chrdev.stream),_.timestamp=Date.now(),D&&(D.contents[M]=_,D.timestamp=_.timestamp),_},getFileDataAsTypedArray(D){return D.contents?D.contents.subarray?D.contents.subarray(0,D.usedBytes):new Uint8Array(D.contents):new Uint8Array(0)},expandFileStorage(D,M){var R=D.contents?D.contents.length:0;if(!(R>=M)){var V=1024*1024;M=Math.max(M,R*(R>>0),R!=0&&(M=Math.max(M,256));var _=D.contents;D.contents=new Uint8Array(M),D.usedBytes>0&&D.contents.set(_.subarray(0,D.usedBytes),0)}},resizeFileStorage(D,M){if(D.usedBytes!=M)if(M==0)D.contents=null,D.usedBytes=0;else{var R=D.contents;D.contents=new Uint8Array(M),R&&D.contents.set(R.subarray(0,Math.min(M,D.usedBytes))),D.usedBytes=M}},node_ops:{getattr(D){var M={};return M.dev=G.isChrdev(D.mode)?D.id:1,M.ino=D.id,M.mode=D.mode,M.nlink=1,M.uid=0,M.gid=0,M.rdev=D.rdev,G.isDir(D.mode)?M.size=4096:G.isFile(D.mode)?M.size=D.usedBytes:G.isLink(D.mode)?M.size=D.link.length:M.size=0,M.atime=new Date(D.timestamp),M.mtime=new Date(D.timestamp),M.ctime=new Date(D.timestamp),M.blksize=4096,M.blocks=Math.ceil(M.size/M.blksize),M},setattr(D,M){M.mode!==void 0&&(D.mode=M.mode),M.timestamp!==void 0&&(D.timestamp=M.timestamp),M.size!==void 0&&Ke.resizeFileStorage(D,M.size)},lookup(D,M){throw G.genericErrors[44]},mknod(D,M,R,V){return Ke.createNode(D,M,R,V)},rename(D,M,R){if(G.isDir(D.mode)){var V;try{V=G.lookupNode(M,R)}catch(q){}if(V)for(var _ in V.contents)throw new G.ErrnoError(55)}delete D.parent.contents[D.name],D.parent.timestamp=Date.now(),D.name=R,M.contents[R]=D,M.timestamp=D.parent.timestamp},unlink(D,M){delete D.contents[M],D.timestamp=Date.now()},rmdir(D,M){var R=G.lookupNode(D,M);for(var V in R.contents)throw new G.ErrnoError(55);delete D.contents[M],D.timestamp=Date.now()},readdir(D){var M=[".",".."];for(var R of Object.keys(D.contents))M.push(R);return M},symlink(D,M,R){var V=Ke.createNode(D,M,41471,0);return V.link=R,V},readlink(D){if(!G.isLink(D.mode))throw new G.ErrnoError(28);return D.link}},stream_ops:{read(D,M,R,V,_){var q=D.node.contents;if(_>=D.node.usedBytes)return 0;var nA=Math.min(D.node.usedBytes-_,V);if(nA>8&&q.subarray)M.set(q.subarray(_,_+nA),R);else for(var cA=0;cA0||R+M{var _=V?"":`al ${D}`;C(D).then(q=>{M(new Uint8Array(q)),_&&pA()},q=>{if(R)R();else throw`Loading data file "${D}" failed.`}),_&&zA()},Si=(D,M,R,V,_,q)=>{G.createDataFile(D,M,R,V,_,q)},Li=[],Zi=(D,M,R,V)=>{typeof Browser<"u"&&Browser.init();var _=!1;return Li.forEach(q=>{_||q.canHandle(M)&&(q.handle(D,M,R,V),_=!0)}),_},bt=(D,M,R,V,_,q,nA,cA,MA,oe)=>{var se=M?Qe.resolve(sA.join2(D,M)):D;function Ee(Pe){function Re(Le){oe?.(),cA||Si(D,M,Le,V,_,MA),q?.(),pA()}Zi(Pe,se,Re,()=>{nA?.(),pA()})||Re(Pe)}zA(),typeof R=="string"?nn(R,Ee,nA):Ee(R)},on=D=>{var M={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},R=M[D];if(typeof R>"u")throw new Error(`Unknown file open mode: ${D}`);return R},Kt=(D,M)=>{var R=0;return D&&(R|=365),M&&(R|=146),R},G={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(D){this.name="ErrnoError",this.errno=D}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(D){this.node=D}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(D){this.shared.flags=D}get position(){return this.shared.position}set position(D){this.shared.position=D}},FSNode:class{constructor(D,M,R,V){D||(D=this),this.parent=D,this.mount=D.mount,this.mounted=null,this.id=G.nextInode++,this.name=M,this.mode=R,this.node_ops={},this.stream_ops={},this.rdev=V,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(D){D?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(D){D?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return G.isDir(this.mode)}get isDevice(){return G.isChrdev(this.mode)}},lookupPath(D,M={}){if(D=Qe.resolve(D),!D)return{path:"",node:null};var R={follow_mount:!0,recurse_count:0};if(M=Object.assign(R,M),M.recurse_count>8)throw new G.ErrnoError(32);for(var V=D.split("/").filter(Ee=>!!Ee),_=G.root,q="/",nA=0;nA40)throw new G.ErrnoError(32)}}return{path:q,node:_}},getPath(D){for(var M;;){if(G.isRoot(D)){var R=D.mount.mountpoint;return M?R[R.length-1]!=="/"?`${R}/${M}`:R+M:R}M=M?`${D.name}/${M}`:D.name,D=D.parent}},hashName(D,M){for(var R=0,V=0;V>>0)%G.nameTable.length},hashAddNode(D){var M=G.hashName(D.parent.id,D.name);D.name_next=G.nameTable[M],G.nameTable[M]=D},hashRemoveNode(D){var M=G.hashName(D.parent.id,D.name);if(G.nameTable[M]===D)G.nameTable[M]=D.name_next;else for(var R=G.nameTable[M];R;){if(R.name_next===D){R.name_next=D.name_next;break}R=R.name_next}},lookupNode(D,M){var R=G.mayLookup(D);if(R)throw new G.ErrnoError(R);for(var V=G.hashName(D.id,M),_=G.nameTable[V];_;_=_.name_next){var q=_.name;if(_.parent.id===D.id&&q===M)return _}return G.lookup(D,M)},createNode(D,M,R,V){var _=new G.FSNode(D,M,R,V);return G.hashAddNode(_),_},destroyNode(D){G.hashRemoveNode(D)},isRoot(D){return D===D.parent},isMountpoint(D){return!!D.mounted},isFile(D){return(D&61440)===32768},isDir(D){return(D&61440)===16384},isLink(D){return(D&61440)===40960},isChrdev(D){return(D&61440)===8192},isBlkdev(D){return(D&61440)===24576},isFIFO(D){return(D&61440)===4096},isSocket(D){return(D&49152)===49152},flagsToPermissionString(D){var M=["r","w","rw"][D&3];return D&512&&(M+="w"),M},nodePermissions(D,M){return G.ignorePermissions?0:M.includes("r")&&!(D.mode&292)||M.includes("w")&&!(D.mode&146)||M.includes("x")&&!(D.mode&73)?2:0},mayLookup(D){if(!G.isDir(D.mode))return 54;var M=G.nodePermissions(D,"x");return M||(D.node_ops.lookup?0:2)},mayCreate(D,M){try{var R=G.lookupNode(D,M);return 20}catch(V){}return G.nodePermissions(D,"wx")},mayDelete(D,M,R){var V;try{V=G.lookupNode(D,M)}catch(q){return q.errno}var _=G.nodePermissions(D,"wx");if(_)return _;if(R){if(!G.isDir(V.mode))return 54;if(G.isRoot(V)||G.getPath(V)===G.cwd())return 10}else if(G.isDir(V.mode))return 31;return 0},mayOpen(D,M){return D?G.isLink(D.mode)?32:G.isDir(D.mode)&&(G.flagsToPermissionString(M)!=="r"||M&512)?31:G.nodePermissions(D,G.flagsToPermissionString(M)):44},MAX_OPEN_FDS:4096,nextfd(){for(var D=0;D<=G.MAX_OPEN_FDS;D++)if(!G.streams[D])return D;throw new G.ErrnoError(33)},getStreamChecked(D){var M=G.getStream(D);if(!M)throw new G.ErrnoError(8);return M},getStream:D=>G.streams[D],createStream(D,M=-1){return D=Object.assign(new G.FSStream,D),M==-1&&(M=G.nextfd()),D.fd=M,G.streams[M]=D,D},closeStream(D){G.streams[D]=null},dupStream(D,M=-1){var R=G.createStream(D,M);return R.stream_ops?.dup?.(R),R},chrdev_stream_ops:{open(D){var M=G.getDevice(D.node.rdev);D.stream_ops=M.stream_ops,D.stream_ops.open?.(D)},llseek(){throw new G.ErrnoError(70)}},major:D=>D>>8,minor:D=>D&255,makedev:(D,M)=>D<<8|M,registerDevice(D,M){G.devices[D]={stream_ops:M}},getDevice:D=>G.devices[D],getMounts(D){for(var M=[],R=[D];R.length;){var V=R.pop();M.push(V),R.push(...V.mounts)}return M},syncfs(D,M){typeof D=="function"&&(M=D,D=!1),G.syncFSRequests++,G.syncFSRequests>1&&h(`warning: ${G.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var R=G.getMounts(G.root.mount),V=0;function _(nA){return G.syncFSRequests--,M(nA)}function q(nA){if(nA)return q.errored?void 0:(q.errored=!0,_(nA));++V>=R.length&&_(null)}R.forEach(nA=>{if(!nA.type.syncfs)return q(null);nA.type.syncfs(nA,D,q)})},mount(D,M,R){var V=R==="/",_=!R,q;if(V&&G.root)throw new G.ErrnoError(10);if(!V&&!_){var nA=G.lookupPath(R,{follow_mount:!1});if(R=nA.path,q=nA.node,G.isMountpoint(q))throw new G.ErrnoError(10);if(!G.isDir(q.mode))throw new G.ErrnoError(54)}var cA={type:D,opts:M,mountpoint:R,mounts:[]},MA=D.mount(cA);return MA.mount=cA,cA.root=MA,V?G.root=MA:q&&(q.mounted=cA,q.mount&&q.mount.mounts.push(cA)),MA},unmount(D){var M=G.lookupPath(D,{follow_mount:!1});if(!G.isMountpoint(M.node))throw new G.ErrnoError(28);var R=M.node,V=R.mounted,_=G.getMounts(V);Object.keys(G.nameTable).forEach(nA=>{for(var cA=G.nameTable[nA];cA;){var MA=cA.name_next;_.includes(cA.mount)&&G.destroyNode(cA),cA=MA}}),R.mounted=null;var q=R.mount.mounts.indexOf(V);R.mount.mounts.splice(q,1)},lookup(D,M){return D.node_ops.lookup(D,M)},mknod(D,M,R){var V=G.lookupPath(D,{parent:!0}),_=V.node,q=sA.basename(D);if(!q||q==="."||q==="..")throw new G.ErrnoError(28);var nA=G.mayCreate(_,q);if(nA)throw new G.ErrnoError(nA);if(!_.node_ops.mknod)throw new G.ErrnoError(63);return _.node_ops.mknod(_,q,M,R)},create(D,M){return M=M!==void 0?M:438,M&=4095,M|=32768,G.mknod(D,M,0)},mkdir(D,M){return M=M!==void 0?M:511,M&=1023,M|=16384,G.mknod(D,M,0)},mkdirTree(D,M){for(var R=D.split("/"),V="",_=0;_"u"&&(R=M,M=438),M|=8192,G.mknod(D,M,R)},symlink(D,M){if(!Qe.resolve(D))throw new G.ErrnoError(44);var R=G.lookupPath(M,{parent:!0}),V=R.node;if(!V)throw new G.ErrnoError(44);var _=sA.basename(M),q=G.mayCreate(V,_);if(q)throw new G.ErrnoError(q);if(!V.node_ops.symlink)throw new G.ErrnoError(63);return V.node_ops.symlink(V,_,D)},rename(D,M){var R=sA.dirname(D),V=sA.dirname(M),_=sA.basename(D),q=sA.basename(M),nA,cA,MA;if(nA=G.lookupPath(D,{parent:!0}),cA=nA.node,nA=G.lookupPath(M,{parent:!0}),MA=nA.node,!cA||!MA)throw new G.ErrnoError(44);if(cA.mount!==MA.mount)throw new G.ErrnoError(75);var oe=G.lookupNode(cA,_),se=Qe.relative(D,V);if(se.charAt(0)!==".")throw new G.ErrnoError(28);if(se=Qe.relative(M,R),se.charAt(0)!==".")throw new G.ErrnoError(55);var Ee;try{Ee=G.lookupNode(MA,q)}catch(Le){}if(oe!==Ee){var Pe=G.isDir(oe.mode),Re=G.mayDelete(cA,_,Pe);if(Re)throw new G.ErrnoError(Re);if(Re=Ee?G.mayDelete(MA,q,Pe):G.mayCreate(MA,q),Re)throw new G.ErrnoError(Re);if(!cA.node_ops.rename)throw new G.ErrnoError(63);if(G.isMountpoint(oe)||Ee&&G.isMountpoint(Ee))throw new G.ErrnoError(10);if(MA!==cA&&(Re=G.nodePermissions(cA,"w"),Re))throw new G.ErrnoError(Re);G.hashRemoveNode(oe);try{cA.node_ops.rename(oe,MA,q),oe.parent=MA}catch(Le){throw Le}finally{G.hashAddNode(oe)}}},rmdir(D){var M=G.lookupPath(D,{parent:!0}),R=M.node,V=sA.basename(D),_=G.lookupNode(R,V),q=G.mayDelete(R,V,!0);if(q)throw new G.ErrnoError(q);if(!R.node_ops.rmdir)throw new G.ErrnoError(63);if(G.isMountpoint(_))throw new G.ErrnoError(10);R.node_ops.rmdir(R,V),G.destroyNode(_)},readdir(D){var M=G.lookupPath(D,{follow:!0}),R=M.node;if(!R.node_ops.readdir)throw new G.ErrnoError(54);return R.node_ops.readdir(R)},unlink(D){var M=G.lookupPath(D,{parent:!0}),R=M.node;if(!R)throw new G.ErrnoError(44);var V=sA.basename(D),_=G.lookupNode(R,V),q=G.mayDelete(R,V,!1);if(q)throw new G.ErrnoError(q);if(!R.node_ops.unlink)throw new G.ErrnoError(63);if(G.isMountpoint(_))throw new G.ErrnoError(10);R.node_ops.unlink(R,V),G.destroyNode(_)},readlink(D){var M=G.lookupPath(D),R=M.node;if(!R)throw new G.ErrnoError(44);if(!R.node_ops.readlink)throw new G.ErrnoError(28);return Qe.resolve(G.getPath(R.parent),R.node_ops.readlink(R))},stat(D,M){var R=G.lookupPath(D,{follow:!M}),V=R.node;if(!V)throw new G.ErrnoError(44);if(!V.node_ops.getattr)throw new G.ErrnoError(63);return V.node_ops.getattr(V)},lstat(D){return G.stat(D,!0)},chmod(D,M,R){var V;if(typeof D=="string"){var _=G.lookupPath(D,{follow:!R});V=_.node}else V=D;if(!V.node_ops.setattr)throw new G.ErrnoError(63);V.node_ops.setattr(V,{mode:M&4095|V.mode&-4096,timestamp:Date.now()})},lchmod(D,M){G.chmod(D,M,!0)},fchmod(D,M){var R=G.getStreamChecked(D);G.chmod(R.node,M)},chown(D,M,R,V){var _;if(typeof D=="string"){var q=G.lookupPath(D,{follow:!V});_=q.node}else _=D;if(!_.node_ops.setattr)throw new G.ErrnoError(63);_.node_ops.setattr(_,{timestamp:Date.now()})},lchown(D,M,R){G.chown(D,M,R,!0)},fchown(D,M,R){var V=G.getStreamChecked(D);G.chown(V.node,M,R)},truncate(D,M){if(M<0)throw new G.ErrnoError(28);var R;if(typeof D=="string"){var V=G.lookupPath(D,{follow:!0});R=V.node}else R=D;if(!R.node_ops.setattr)throw new G.ErrnoError(63);if(G.isDir(R.mode))throw new G.ErrnoError(31);if(!G.isFile(R.mode))throw new G.ErrnoError(28);var _=G.nodePermissions(R,"w");if(_)throw new G.ErrnoError(_);R.node_ops.setattr(R,{size:M,timestamp:Date.now()})},ftruncate(D,M){var R=G.getStreamChecked(D);if((R.flags&2097155)===0)throw new G.ErrnoError(28);G.truncate(R.node,M)},utime(D,M,R){var V=G.lookupPath(D,{follow:!0}),_=V.node;_.node_ops.setattr(_,{timestamp:Math.max(M,R)})},open(D,M,R){if(D==="")throw new G.ErrnoError(44);M=typeof M=="string"?on(M):M,M&64?(R=typeof R>"u"?438:R,R=R&4095|32768):R=0;var V;if(typeof D=="object")V=D;else{D=sA.normalize(D);try{var _=G.lookupPath(D,{follow:!(M&131072)});V=_.node}catch(MA){}}var q=!1;if(M&64)if(V){if(M&128)throw new G.ErrnoError(20)}else V=G.mknod(D,R,0),q=!0;if(!V)throw new G.ErrnoError(44);if(G.isChrdev(V.mode)&&(M&=-513),M&65536&&!G.isDir(V.mode))throw new G.ErrnoError(54);if(!q){var nA=G.mayOpen(V,M);if(nA)throw new G.ErrnoError(nA)}M&512&&!q&&G.truncate(V,0),M&=-131713;var cA=G.createStream({node:V,path:G.getPath(V),flags:M,seekable:!0,position:0,stream_ops:V.stream_ops,ungotten:[],error:!1});return cA.stream_ops.open&&cA.stream_ops.open(cA),cA},close(D){if(G.isClosed(D))throw new G.ErrnoError(8);D.getdents&&(D.getdents=null);try{D.stream_ops.close&&D.stream_ops.close(D)}catch(M){throw M}finally{G.closeStream(D.fd)}D.fd=null},isClosed(D){return D.fd===null},llseek(D,M,R){if(G.isClosed(D))throw new G.ErrnoError(8);if(!D.seekable||!D.stream_ops.llseek)throw new G.ErrnoError(70);if(R!=0&&R!=1&&R!=2)throw new G.ErrnoError(28);return D.position=D.stream_ops.llseek(D,M,R),D.ungotten=[],D.position},read(D,M,R,V,_){if(V<0||_<0)throw new G.ErrnoError(28);if(G.isClosed(D))throw new G.ErrnoError(8);if((D.flags&2097155)===1)throw new G.ErrnoError(8);if(G.isDir(D.node.mode))throw new G.ErrnoError(31);if(!D.stream_ops.read)throw new G.ErrnoError(28);var q=typeof _<"u";if(!q)_=D.position;else if(!D.seekable)throw new G.ErrnoError(70);var nA=D.stream_ops.read(D,M,R,V,_);return q||(D.position+=nA),nA},write(D,M,R,V,_,q){if(V<0||_<0)throw new G.ErrnoError(28);if(G.isClosed(D))throw new G.ErrnoError(8);if((D.flags&2097155)===0)throw new G.ErrnoError(8);if(G.isDir(D.node.mode))throw new G.ErrnoError(31);if(!D.stream_ops.write)throw new G.ErrnoError(28);D.seekable&&D.flags&1024&&G.llseek(D,0,2);var nA=typeof _<"u";if(!nA)_=D.position;else if(!D.seekable)throw new G.ErrnoError(70);var cA=D.stream_ops.write(D,M,R,V,_,q);return nA||(D.position+=cA),cA},allocate(D,M,R){if(G.isClosed(D))throw new G.ErrnoError(8);if(M<0||R<=0)throw new G.ErrnoError(28);if((D.flags&2097155)===0)throw new G.ErrnoError(8);if(!G.isFile(D.node.mode)&&!G.isDir(D.node.mode))throw new G.ErrnoError(43);if(!D.stream_ops.allocate)throw new G.ErrnoError(138);D.stream_ops.allocate(D,M,R)},mmap(D,M,R,V,_){if((V&2)!==0&&(_&2)===0&&(D.flags&2097155)!==2)throw new G.ErrnoError(2);if((D.flags&2097155)===1)throw new G.ErrnoError(2);if(!D.stream_ops.mmap)throw new G.ErrnoError(43);if(!M)throw new G.ErrnoError(28);return D.stream_ops.mmap(D,M,R,V,_)},msync(D,M,R,V,_){return D.stream_ops.msync?D.stream_ops.msync(D,M,R,V,_):0},ioctl(D,M,R){if(!D.stream_ops.ioctl)throw new G.ErrnoError(59);return D.stream_ops.ioctl(D,M,R)},readFile(D,M={}){if(M.flags=M.flags||0,M.encoding=M.encoding||"binary",M.encoding!=="utf8"&&M.encoding!=="binary")throw new Error(`Invalid encoding type "${M.encoding}"`);var R,V=G.open(D,M.flags),_=G.stat(D),q=_.size,nA=new Uint8Array(q);return G.read(V,nA,0,q,0),M.encoding==="utf8"?R=pt(nA):M.encoding==="binary"&&(R=nA),G.close(V),R},writeFile(D,M,R={}){R.flags=R.flags||577;var V=G.open(D,R.flags,R.mode);if(typeof M=="string"){var _=new Uint8Array(OA(M)+1),q=ht(M,_,0,_.length);G.write(V,_,0,q,void 0,R.canOwn)}else if(ArrayBuffer.isView(M))G.write(V,M,0,M.byteLength,void 0,R.canOwn);else throw new Error("Unsupported data type");G.close(V)},cwd:()=>G.currentPath,chdir(D){var M=G.lookupPath(D,{follow:!0});if(M.node===null)throw new G.ErrnoError(44);if(!G.isDir(M.node.mode))throw new G.ErrnoError(54);var R=G.nodePermissions(M.node,"x");if(R)throw new G.ErrnoError(R);G.currentPath=M.path},createDefaultDirectories(){G.mkdir("/tmp"),G.mkdir("/home"),G.mkdir("/home/web_user")},createDefaultDevices(){G.mkdir("/dev"),G.registerDevice(G.makedev(1,3),{read:()=>0,write:(V,_,q,nA,cA)=>nA}),G.mkdev("/dev/null",G.makedev(1,3)),Oe.register(G.makedev(5,0),Oe.default_tty_ops),Oe.register(G.makedev(6,0),Oe.default_tty1_ops),G.mkdev("/dev/tty",G.makedev(5,0)),G.mkdev("/dev/tty1",G.makedev(6,0));var D=new Uint8Array(1024),M=0,R=()=>(M===0&&(M=de(D).byteLength),D[--M]);G.createDevice("/dev","random",R),G.createDevice("/dev","urandom",R),G.mkdir("/dev/shm"),G.mkdir("/dev/shm/tmp")},createSpecialDirectories(){G.mkdir("/proc");var D=G.mkdir("/proc/self");G.mkdir("/proc/self/fd"),G.mount({mount(){var M=G.createNode(D,"fd",16895,73);return M.node_ops={lookup(R,V){var _=+V,q=G.getStreamChecked(_),nA={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>q.path}};return nA.parent=nA,nA}},M}},{},"/proc/self/fd")},createStandardStreams(D,M,R){D?G.createDevice("/dev","stdin",D):G.symlink("/dev/tty","/dev/stdin"),M?G.createDevice("/dev","stdout",null,M):G.symlink("/dev/tty","/dev/stdout"),R?G.createDevice("/dev","stderr",null,R):G.symlink("/dev/tty1","/dev/stderr"),G.open("/dev/stdin",0),G.open("/dev/stdout",1),G.open("/dev/stderr",1)},staticInit(){[44].forEach(D=>{G.genericErrors[D]=new G.ErrnoError(D),G.genericErrors[D].stack=""}),G.nameTable=new Array(4096),G.mount(Ke,{},"/"),G.createDefaultDirectories(),G.createDefaultDevices(),G.createSpecialDirectories(),G.filesystems={MEMFS:Ke}},init(D,M,R){G.initialized=!0,G.createStandardStreams(D,M,R)},quit(){G.initialized=!1;for(var D=0;Dthis.length-1||Re<0)){var Le=Re%this.chunkSize,ai=Re/this.chunkSize|0;return this.getter(ai)[Le]}}setDataGetter(Re){this.getter=Re}cacheLength(){var Re=new XMLHttpRequest;if(Re.open("HEAD",R,!1),Re.send(null),!(Re.status>=200&&Re.status<300||Re.status===304))throw new Error("Couldn't load "+R+". Status: "+Re.status);var Le=Number(Re.getResponseHeader("Content-length")),ai,Yn=(ai=Re.getResponseHeader("Accept-Ranges"))&&ai==="bytes",eA=(ai=Re.getResponseHeader("Content-Encoding"))&&ai==="gzip",yA=1024*1024;Yn||(yA=Le);var WA=(ye,be)=>{if(ye>be)throw new Error("invalid range ("+ye+", "+be+") or no bytes requested!");if(be>Le-1)throw new Error("only "+Le+" bytes available! programmer error!");var ot=new XMLHttpRequest;if(ot.open("GET",R,!1),Le!==yA&&ot.setRequestHeader("Range","bytes="+ye+"-"+be),ot.responseType="arraybuffer",ot.overrideMimeType&&ot.overrideMimeType("text/plain; charset=x-user-defined"),ot.send(null),!(ot.status>=200&&ot.status<300||ot.status===304))throw new Error("Couldn't load "+R+". Status: "+ot.status);return ot.response!==void 0?new Uint8Array(ot.response||[]):tt(ot.responseText||"",!0)},Ge=this;Ge.setDataGetter(ye=>{var be=ye*yA,ot=(ye+1)*yA-1;if(ot=Math.min(ot,Le-1),typeof Ge.chunks[ye]>"u"&&(Ge.chunks[ye]=WA(be,ot)),typeof Ge.chunks[ye]>"u")throw new Error("doXHR failed!");return Ge.chunks[ye]}),(eA||!Le)&&(yA=Le=1,Le=this.getter(0).length,yA=Le,d("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=Le,this._chunkSize=yA,this.lengthKnown=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if(typeof XMLHttpRequest<"u"){throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var nA,cA}else var cA={isDevice:!1,url:R};var MA=G.createFile(D,M,cA,V,_);cA.contents?MA.contents=cA.contents:cA.url&&(MA.contents=null,MA.url=cA.url),Object.defineProperties(MA,{usedBytes:{get:function(){return this.contents.length}}});var oe={},se=Object.keys(MA.stream_ops);se.forEach(Pe=>{var Re=MA.stream_ops[Pe];oe[Pe]=(...Le)=>(G.forceLoadFile(MA),Re(...Le))});function Ee(Pe,Re,Le,ai,Yn){var eA=Pe.node.contents;if(Yn>=eA.length)return 0;var yA=Math.min(eA.length-Yn,ai);if(eA.slice)for(var WA=0;WA(G.forceLoadFile(MA),Ee(Pe,Re,Le,ai,Yn)),oe.mmap=(Pe,Re,Le,ai,Yn)=>{G.forceLoadFile(MA);var eA=hn(Re);if(!eA)throw new G.ErrnoError(48);return Ee(Pe,S,eA,Re,Le),{ptr:eA,allocated:!0}},MA.stream_ops=oe,MA}},dt={DEFAULT_POLLMASK:5,calculateAt(D,M,R){if(sA.isAbs(M))return M;var V;if(D===-100)V=G.cwd();else{var _=dt.getStreamFromFD(D);V=_.path}if(M.length==0){if(!R)throw new G.ErrnoError(44);return V}return sA.join2(V,M)},doStat(D,M,R){var V=D(M);F[R>>2]=V.dev,F[R+4>>2]=V.mode,z[R+8>>2]=V.nlink,F[R+12>>2]=V.uid,F[R+16>>2]=V.gid,F[R+20>>2]=V.rdev,Z[R+24>>3]=BigInt(V.size),F[R+32>>2]=4096,F[R+36>>2]=V.blocks;var _=V.atime.getTime(),q=V.mtime.getTime(),nA=V.ctime.getTime();return Z[R+40>>3]=BigInt(Math.floor(_/1e3)),z[R+48>>2]=_%1e3*1e3*1e3,Z[R+56>>3]=BigInt(Math.floor(q/1e3)),z[R+64>>2]=q%1e3*1e3*1e3,Z[R+72>>3]=BigInt(Math.floor(nA/1e3)),z[R+80>>2]=nA%1e3*1e3*1e3,Z[R+88>>3]=BigInt(V.ino),0},doMsync(D,M,R,V,_){if(!G.isFile(M.node.mode))throw new G.ErrnoError(43);if(V&2)return 0;var q=b.slice(D,D+R);G.msync(M,q,_,R,V)},getStreamFromFD(D){var M=G.getStreamChecked(D);return M},varargs:void 0,getStr(D){var M=xe(D);return M}};function Ei(D,M,R,V){try{if(M=dt.getStr(M),M=dt.calculateAt(D,M),R&-8)return-28;var _=G.lookupPath(M,{follow:!0}),q=_.node;if(!q)return-44;var nA="";return R&4&&(nA+="r"),R&2&&(nA+="w"),R&1&&(nA+="x"),nA&&G.nodePermissions(q,nA)?-2:0}catch(cA){if(typeof G>"u"||cA.name!=="ErrnoError")throw cA;return-cA.errno}}function Qn(){var D=F[+dt.varargs>>2];return dt.varargs+=4,D}var un=Qn;function Vn(D,M,R){dt.varargs=R;try{var V=dt.getStreamFromFD(D);switch(M){case 0:{var _=Qn();if(_<0)return-28;for(;G.streams[_];)_++;var q;return q=G.dupStream(V,_),q.fd}case 1:case 2:return 0;case 3:return V.flags;case 4:{var _=Qn();return V.flags|=_,0}case 12:{var _=un(),nA=0;return x[_+nA>>1]=2,0}case 13:case 14:return 0}return-28}catch(cA){if(typeof G>"u"||cA.name!=="ErrnoError")throw cA;return-cA.errno}}function Yo(D,M){try{var R=dt.getStreamFromFD(D);return dt.doStat(G.stat,R.path,M)}catch(V){if(typeof G>"u"||V.name!=="ErrnoError")throw V;return-V.errno}}function Bo(D,M,R){dt.varargs=R;try{var V=dt.getStreamFromFD(D);switch(M){case 21509:return V.tty?0:-59;case 21505:{if(!V.tty)return-59;if(V.tty.ops.ioctl_tcgets){var _=V.tty.ops.ioctl_tcgets(V),q=un();F[q>>2]=_.c_iflag||0,F[q+4>>2]=_.c_oflag||0,F[q+8>>2]=_.c_cflag||0,F[q+12>>2]=_.c_lflag||0;for(var nA=0;nA<32;nA++)S[q+nA+17]=_.c_cc[nA]||0;return 0}return 0}case 21510:case 21511:case 21512:return V.tty?0:-59;case 21506:case 21507:case 21508:{if(!V.tty)return-59;if(V.tty.ops.ioctl_tcsets){for(var q=un(),cA=F[q>>2],MA=F[q+4>>2],oe=F[q+8>>2],se=F[q+12>>2],Ee=[],nA=0;nA<32;nA++)Ee.push(S[q+nA+17]);return V.tty.ops.ioctl_tcsets(V.tty,M,{c_iflag:cA,c_oflag:MA,c_cflag:oe,c_lflag:se,c_cc:Ee})}return 0}case 21519:{if(!V.tty)return-59;var q=un();return F[q>>2]=0,0}case 21520:return V.tty?-28:-59;case 21531:{var q=un();return G.ioctl(V,M,q)}case 21523:{if(!V.tty)return-59;if(V.tty.ops.ioctl_tiocgwinsz){var Pe=V.tty.ops.ioctl_tiocgwinsz(V.tty),q=un();x[q>>1]=Pe[0],x[q+2>>1]=Pe[1]}return 0}case 21524:return V.tty?0:-59;case 21515:return V.tty?0:-59;default:return-28}}catch(Re){if(typeof G>"u"||Re.name!=="ErrnoError")throw Re;return-Re.errno}}function No(D,M,R,V){try{M=dt.getStr(M);var _=V&256,q=V&4096;return V=V&-6401,M=dt.calculateAt(D,M,q),dt.doStat(_?G.lstat:G.stat,M,R)}catch(nA){if(typeof G>"u"||nA.name!=="ErrnoError")throw nA;return-nA.errno}}function Zo(D,M,R,V){dt.varargs=V;try{M=dt.getStr(M),M=dt.calculateAt(D,M);var _=V?Qn():0;return G.open(M,R,_).fd}catch(q){if(typeof G>"u"||q.name!=="ErrnoError")throw q;return-q.errno}}function Do(D,M){try{return D=dt.getStr(D),dt.doStat(G.stat,D,M)}catch(R){if(typeof G>"u"||R.name!=="ErrnoError")throw R;return-R.errno}}var Ba=()=>{PA("")},Xo=D=>D%4===0&&(D%100!==0||D%400===0),ra=[0,31,60,91,121,152,182,213,244,274,305,335],yo=[0,31,59,90,120,151,181,212,243,273,304,334],ge=D=>{var M=Xo(D.getFullYear()),R=M?ra:yo,V=R[D.getMonth()]+D.getDate()-1;return V},mi=9007199254740992,cn=-9007199254740992,fn=D=>Dmi?NaN:Number(D);function Ho(D,M){D=fn(D);var R=new Date(D*1e3);F[M>>2]=R.getSeconds(),F[M+4>>2]=R.getMinutes(),F[M+8>>2]=R.getHours(),F[M+12>>2]=R.getDate(),F[M+16>>2]=R.getMonth(),F[M+20>>2]=R.getFullYear()-1900,F[M+24>>2]=R.getDay();var V=ge(R)|0;F[M+28>>2]=V,F[M+36>>2]=-(R.getTimezoneOffset()*60);var _=new Date(R.getFullYear(),0,1),q=new Date(R.getFullYear(),6,1).getTimezoneOffset(),nA=_.getTimezoneOffset(),cA=(q!=nA&&R.getTimezoneOffset()==Math.min(nA,q))|0;F[M+32>>2]=cA}function ya(D,M,R,V,_,q,nA){_=fn(_);try{if(isNaN(_))return 61;var cA=dt.getStreamFromFD(V),MA=G.mmap(cA,D,_,M,R),oe=MA.ptr;return F[q>>2]=MA.allocated,z[nA>>2]=oe,0}catch(se){if(typeof G>"u"||se.name!=="ErrnoError")throw se;return-se.errno}}function _i(D,M,R,V,_,q){q=fn(q);try{var nA=dt.getStreamFromFD(_);R&2&&dt.doMsync(D,nA,M,V,q)}catch(cA){if(typeof G>"u"||cA.name!=="ErrnoError")throw cA;return-cA.errno}}var Eo=(D,M,R)=>ht(D,b,M,R),Za=(D,M,R,V)=>{var _=new Date().getFullYear(),q=new Date(_,0,1),nA=new Date(_,6,1),cA=q.getTimezoneOffset(),MA=nA.getTimezoneOffset(),oe=Math.max(cA,MA);z[D>>2]=oe*60,F[M>>2]=+(cA!=MA);var se=Re=>{var Le=Re>=0?"-":"+",ai=Math.abs(Re),Yn=String(Math.floor(ai/60)).padStart(2,"0"),eA=String(ai%60).padStart(2,"0");return`UTC${Le}${Yn}${eA}`},Ee=se(cA),Pe=se(MA);MADate.now(),Ta=()=>2147483648,Jn=D=>{var M=v.buffer,R=(D-M.byteLength+65535)/65536|0;try{return v.grow(R),W(),1}catch(V){}},Ui=D=>{var M=b.length;D>>>=0;var R=Ta();if(D>R)return!1;for(var V=1;V<=4;V*=2){var _=M*(1+.2/V);_=Math.min(_,D+100663296);var q=Math.min(R,gn(Math.max(D,_),65536)),nA=Jn(q);if(nA)return!0}return!1},qt={},Nn=()=>s,ho=()=>{if(!ho.strings){var D=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",M={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:D,_:Nn()};for(var R in qt)qt[R]===void 0?delete M[R]:M[R]=qt[R];var V=[];for(var R in M)V.push(`${R}=${M[R]}`);ho.strings=V}return ho.strings},Fo=(D,M)=>{for(var R=0;R{var R=0;return ho().forEach((V,_)=>{var q=M+R;z[D+_*4>>2]=q,Fo(V,q),R+=V.length+1}),0},Ae=(D,M)=>{var R=ho();z[D>>2]=R.length;var V=0;return R.forEach(_=>V+=_.length+1),z[M>>2]=V,0},De=D=>{l(D,new Gt(D))},mA=(D,M)=>{De(D)},FA=mA;function le(D){try{var M=dt.getStreamFromFD(D);return G.close(M),0}catch(R){if(typeof G>"u"||R.name!=="ErrnoError")throw R;return R.errno}}var Ne=(D,M,R,V)=>{for(var _=0,q=0;q>2],cA=z[M+4>>2];M+=8;var MA=G.read(D,S,nA,cA,V);if(MA<0)return-1;if(_+=MA,MA>2]=q,0}catch(nA){if(typeof G>"u"||nA.name!=="ErrnoError")throw nA;return nA.errno}}function rt(D,M,R,V){M=fn(M);try{if(isNaN(M))return 61;var _=dt.getStreamFromFD(D);return G.llseek(_,M,R),Z[V>>3]=BigInt(_.position),_.getdents&&M===0&&R===0&&(_.getdents=null),0}catch(q){if(typeof G>"u"||q.name!=="ErrnoError")throw q;return q.errno}}var xt=(D,M,R,V)=>{for(var _=0,q=0;q>2],cA=z[M+4>>2];M+=8;var MA=G.write(D,S,nA,cA,V);if(MA<0)return-1;if(_+=MA,MA>2]=q,0}catch(nA){if(typeof G>"u"||nA.name!=="ErrnoError")throw nA;return nA.errno}}var Ti=D=>{var M=i["_"+D];return M},zi=(D,M)=>{S.set(D,M)},Xt=D=>Wn(D),Ji=D=>{var M=OA(D)+1,R=Xt(M);return Eo(D,R,M),R},va=(D,M,R,V,_)=>{var q={string:Le=>{var ai=0;return Le!=null&&Le!==0&&(ai=Ji(Le)),ai},array:Le=>{var ai=Xt(Le.length);return zi(Le,ai),ai}};function nA(Le){return M==="string"?xe(Le):M==="boolean"?!!Le:Le}var cA=Ti(D),MA=[],oe=0;if(V)for(var se=0;se(i._viz_set_y_invert=st.A)(D),i._viz_set_reduce=D=>(i._viz_set_reduce=st.B)(D),i._viz_get_graphviz_version=()=>(i._viz_get_graphviz_version=st.C)(),i._free=D=>(i._free=st.D)(D),i._malloc=D=>(i._malloc=st.E)(D),i._viz_get_plugin_list=D=>(i._viz_get_plugin_list=st.G)(D),i._viz_create_graph=(D,M,R)=>(i._viz_create_graph=st.H)(D,M,R),i._viz_read_one_graph=D=>(i._viz_read_one_graph=st.I)(D),i._viz_string_dup=(D,M)=>(i._viz_string_dup=st.J)(D,M),i._viz_string_dup_html=(D,M)=>(i._viz_string_dup_html=st.K)(D,M),i._viz_string_free=(D,M)=>(i._viz_string_free=st.L)(D,M),i._viz_string_free_html=(D,M)=>(i._viz_string_free_html=st.M)(D,M),i._viz_add_node=(D,M)=>(i._viz_add_node=st.N)(D,M),i._viz_add_edge=(D,M,R)=>(i._viz_add_edge=st.O)(D,M,R),i._viz_add_subgraph=(D,M)=>(i._viz_add_subgraph=st.P)(D,M),i._viz_set_default_graph_attribute=(D,M,R)=>(i._viz_set_default_graph_attribute=st.Q)(D,M,R),i._viz_set_default_node_attribute=(D,M,R)=>(i._viz_set_default_node_attribute=st.R)(D,M,R),i._viz_set_default_edge_attribute=(D,M,R)=>(i._viz_set_default_edge_attribute=st.S)(D,M,R),i._viz_set_attribute=(D,M,R)=>(i._viz_set_attribute=st.T)(D,M,R),i._viz_free_graph=D=>(i._viz_free_graph=st.U)(D),i._viz_create_context=()=>(i._viz_create_context=st.V)(),i._viz_free_context=D=>(i._viz_free_context=st.W)(D),i._viz_layout=(D,M,R)=>(i._viz_layout=st.X)(D,M,R),i._viz_free_layout=(D,M)=>(i._viz_free_layout=st.Y)(D,M),i._viz_reset_errors=()=>(i._viz_reset_errors=st.Z)(),i._viz_render=(D,M,R)=>(i._viz_render=st._)(D,M,R);var Oi=(D,M)=>(Oi=st.$)(D,M),Xi=D=>(Xi=st.aa)(D),Wn=D=>(Wn=st.ba)(D),pn=()=>(pn=st.ca)();i.ccall=va,i.getValue=he,i.PATH=sA,i.UTF8ToString=xe,i.stringToUTF8=Eo,i.lengthBytesUTF8=OA,i.FS=G;var _t,sa;UA=function D(){_t||zo(),_t||(UA=D)};function zo(){if(uA>0||!sa&&(sa=1,AA(),uA>0))return;function D(){_t||(_t=1,i.calledRun=1,!k&&(IA(),n(i),aA()))}D()}return zo(),A=a,A}})(),DiA=[[/^Error: (.*)/,"error"],[/^Warning: (.*)/,"warning"]];function sKA(t){return t.map(e=>{for(let A=0;A{if(typeof A.name!="string")throw new Error("image name must be a string");if(typeof A.width!="number"&&typeof A.width!="string")throw new Error("image width must be a number or string");if(typeof A.height!="number"&&typeof A.height!="string")throw new Error("image height must be a number or string");let i=t.PATH.join("/",A.name),n=` - -`;return t.FS.createPath("/",t.PATH.dirname(i)),t.FS.writeFile(i,n),i}):[]}function CKA(t,e){for(let A of e)t.FS.analyzePath(A).exists&&t.FS.unlink(A)}function IKA(t,e,A){let i;try{let n=t.lengthBytesUTF8(e);return i=t.ccall("malloc","number",["number"],[n+1]),t.stringToUTF8(e,i,n+1),t.ccall("viz_read_one_graph","number",["number"],[i])}finally{i&&t.ccall("free","number",["number"],[i])}}function dKA(t,e,A){let i=t.ccall("viz_create_graph","number",["string","number","number"],[e.name,typeof e.directed<"u"?e.directed:!0,typeof e.strict<"u"?e.strict:!1]);return MiA(t,i,e),i}function MiA(t,e,A){SiA(t,e,A),A.nodes&&A.nodes.forEach(i=>{if(typeof i.name>"u")throw new Error("nodes must have a name");let n=t.ccall("viz_add_node","number",["number","string"],[e,String(i.name)]);i.attributes&&biA(t,e,n,i.attributes)}),A.edges&&A.edges.forEach(i=>{if(typeof i.tail>"u")throw new Error("edges must have a tail");if(typeof i.head>"u")throw new Error("edges must have a head");let n=t.ccall("viz_add_edge","number",["number","string","string"],[e,String(i.tail),String(i.head)]);i.attributes&&biA(t,e,n,i.attributes)}),A.subgraphs&&A.subgraphs.forEach(i=>{let n=t.ccall("viz_add_subgraph","number",["number","string"],[e,typeof i.name<"u"?String(i.name):0]);MiA(t,n,i)})}function SiA(t,e,A){if(A.graphAttributes)for(let[i,n]of Object.entries(A.graphAttributes))xv(t,e,n,o=>{t.ccall("viz_set_default_graph_attribute","number",["number","string","number"],[e,i,o])});if(A.nodeAttributes)for(let[i,n]of Object.entries(A.nodeAttributes))xv(t,e,n,o=>{t.ccall("viz_set_default_node_attribute","number",["number","string","number"],[e,i,o])});if(A.edgeAttributes)for(let[i,n]of Object.entries(A.edgeAttributes))xv(t,e,n,o=>{t.ccall("viz_set_default_edge_attribute","number",["number","string","number"],[e,i,o])})}function biA(t,e,A,i){for(let[n,o]of Object.entries(i))xv(t,e,o,a=>{t.ccall("viz_set_attribute","number",["number","string","number"],[A,n,a])})}function xv(t,e,A,i){let n;if(typeof A=="object"&&"html"in A?n=t.ccall("viz_string_dup_html","number",["number","string"],[e,String(A.html)]):n=t.ccall("viz_string_dup","number",["number","string"],[e,String(A)]),n==0)throw new Error("couldn't dup string");i(n),typeof A=="object"&&"html"in A?t.ccall("viz_string_free_html","number",["number","number"],[e,n]):t.ccall("viz_string_free","number",["number","number"],[e,n])}var mF=class{constructor(e){this.module=e}get graphvizVersion(){return gKA(this.module)}get formats(){return yiA(this.module,"device")}get engines(){return yiA(this.module,"layout")}renderFormats(e,A,i={}){return viA(this.module,e,A,gA({engine:"dot"},i))}render(e,A={}){let i;A.format===void 0?i="dot":i=A.format;let n=viA(this.module,e,[i],gA({engine:"dot"},A));return n.status==="success"&&(n.output=n.output[i]),n}renderString(e,A={}){let i=this.render(e,A);if(i.status!=="success")throw new Error(i.errors.find(n=>n.level=="error")?.message||"render failed");return i.output}renderSVGElement(e,A={}){let i=this.renderString(e,Ye(gA({},A),{format:"svg"})),n;return typeof A.trustedTypePolicy<"u"?n=A.trustedTypePolicy.createHTML(i):n=i,new DOMParser().parseFromString(n,"image/svg+xml").documentElement}renderJSON(e,A={}){let i=this.renderString(e,Ye(gA({},A),{format:"json"}));return JSON.parse(i)}};function kiA(){return rKA().then(t=>new mF(t))}var _v=class t{render(e){return lt(this,null,function*(){let A={format:"svg",engine:"dot"};return(yield kiA()).renderString(e,A)})}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Rv=new kA("VideoService");var Nv=class t{createMessagePartFromFile(e){return lt(this,null,function*(){return{inlineData:{displayName:e.name,data:yield this.readFileAsBytes(e),mimeType:e.type}}})}readFileAsBytes(e){return new Promise((A,i)=>{let n=new FileReader;n.onload=o=>{let a=o.target.result.split(",")[1];A(a)},n.onerror=i,n.readAsDataURL(e)})}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Fv=class t extends r6{sanitizer=w(e2);windowOpen(e,A,i,n){return e.open(A,i,n)}createObjectUrl(e){return URL.createObjectURL(e)}openBlobUrl(e){let A=this.createObjectUrl(e);return this.windowOpen(window,A,"_blank")}setAnchorHref(e,A){e.href=A}bypassSecurityTrustHtml(e){return this.sanitizer.bypassSecurityTrustHtml(e)}bypassSecurityTrustUrl(e){return this.sanitizer.bypassSecurityTrustUrl(e)}static \u0275fac=(()=>{let e;return function(i){return(e||(e=bi(t)))(i||t)}})();static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Lv=class t{constructor(e){this.http=e}apiServerDomain=Dr.getApiServerBaseUrl();createSession(e,A,i){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`,o={};return i?o.state=i:o.state={},this.http.post(n,i?o:null)}return new vi}updateSession(e,A,i,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}`;return this.http.patch(o,n)}listSessions(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.get(i).pipe(we(n=>({items:n,nextPageToken:""})))}return ne({items:[],nextPageToken:""})}deleteSession(e,A,i){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}`;return this.http.delete(n)}getSession(e,A,i){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}`;return this.http.get(n)}importSession(e,A,i,n){if(this.apiServerDomain!=null){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`,a={events:i};return n&&(a.state=n),this.http.post(o,a)}return new vi}canEdit(e,A){return ne(!0)}static \u0275fac=function(A){return new(A||t)(Lo(fr))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Gv=class t{audioRecordingService=w(YB);videoService=w(Rv);webSocketService=w(zB);audioIntervalId=void 0;videoIntervalId=void 0;constructor(){}getWsUrl(e,A,i,n){let a=`${window.location.protocol==="https:"?"wss":"ws"}://${Dr.getWSServerUrl()}/run_live?app_name=${e}&user_id=${A}&session_id=${i}`;return n&&(n.proactiveAudio&&(a+="&proactive_audio=true"),n.enableAffectiveDialog&&(a+="&enable_affective_dialog=true"),n.enableSessionResumption&&(a+="&enable_session_resumption=true"),n.saveLiveBlob&&(a+="&save_live_blob=true")),a}startAudioChat(o){return lt(this,arguments,function*({appName:e,userId:A,sessionId:i,flags:n}){this.webSocketService.connect(this.getWsUrl(e,A,i,n)),yield this.startAudioStreaming()})}stopAudioChat(){this.stopAudioStreaming(),this.webSocketService.closeConnection()}startAudioStreaming(){return lt(this,null,function*(){try{yield this.audioRecordingService.startRecording(),this.audioIntervalId=window.setInterval(()=>this.sendBufferedAudio(),250)}catch(e){console.error("Error accessing microphone:",e)}})}stopAudioStreaming(){clearInterval(this.audioIntervalId),this.audioIntervalId=void 0,this.audioRecordingService.stopRecording()}sendBufferedAudio(){let e=this.audioRecordingService.getCombinedAudioBuffer();if(!e)return;let A={blob:{mime_type:"audio/pcm",data:e}};this.webSocketService.sendMessage(A),this.audioRecordingService.cleanAudioBuffer()}startVideoChat(a){return lt(this,arguments,function*({appName:e,userId:A,sessionId:i,videoContainer:n,flags:o}){this.webSocketService.connect(this.getWsUrl(e,A,i,o)),yield this.startAudioStreaming(),yield this.startVideoStreaming(n)})}stopVideoChat(e){this.stopAudioStreaming(),this.stopVideoStreaming(e),this.webSocketService.closeConnection()}startVideoStreaming(e){return lt(this,null,function*(){try{yield this.videoService.startRecording(e),this.videoIntervalId=window.setInterval(()=>lt(this,null,function*(){return yield this.sendCapturedFrame()}),1e3)}catch(A){console.error("Error accessing camera:",A)}})}sendCapturedFrame(){return lt(this,null,function*(){let e=yield this.videoService.getCapturedFrame();if(!e)return;let A={blob:{mime_type:"image/jpeg",data:e}};this.webSocketService.sendMessage(A)})}stopVideoStreaming(e){clearInterval(this.videoIntervalId),this.videoIntervalId=void 0,this.videoService.stopRecording(e)}onStreamClose(){return this.webSocketService.onCloseReason()}closeStream(){this.webSocketService.closeConnection()}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Kv=class t{stc(e,A){let i=this.hashCode(e),n=Math.abs(i%360),o=60+Math.abs((i>>8)%40),a;return A==="dark"?a=15+Math.abs((i>>16)%30):a=40+Math.abs((i>>16)%30),this.hslToHex(n,o,a)}hashCode(e){let A=0;for(let i=0,n=e.length;i{let r=(a+e/30)%12,s=i-n*Math.max(Math.min(r-3,9-r,1),-1);return Math.round(255*s).toString(16).padStart(2,"0")};return`#${o(0)}${o(8)}${o(4)}ff`}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Uv=class t{THEME_STORAGE_KEY="adk-theme-preference";currentTheme=bA(this.getInitialTheme());constructor(){Ao(()=>{this.applyTheme(this.currentTheme())})}getInitialTheme(){let e=window.localStorage.getItem(this.THEME_STORAGE_KEY);return e==="light"||e==="dark"?e:"dark"}applyTheme(e){let A=document.documentElement;A.classList.remove("light-theme","dark-theme"),A.classList.add(`${e}-theme`),A.style.colorScheme=e,window.localStorage.setItem(this.THEME_STORAGE_KEY,e),this.updatePrismTheme(e)}updatePrismTheme(e){let A="prism-theme-style",i=document.getElementById(A);i||(i=document.createElement("link"),i.id=A,i.rel="stylesheet",document.head.appendChild(i)),i.href=e==="light"?"prism-light.css":"prism-dark.css"}toggleTheme(){this.currentTheme.update(e=>e==="light"?"dark":"light")}setTheme(e){this.currentTheme.set(e)}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Tv=class t{selectedTraceRowSource=new ei(void 0);selectedTraceRow$=this.selectedTraceRowSource.asObservable();eventDataSource=new ei(void 0);eventData$=this.eventDataSource.asObservable();messagesSource=new ei([]);messages$=this.messagesSource.asObservable();selectedRow(e){this.selectedTraceRowSource.next(e)}setEventData(e){this.eventDataSource.next(e)}setMessages(e){this.messagesSource.next(e)}resetTraceService(){this.selectedTraceRowSource.next(void 0),this.eventDataSource.next(void 0),this.messagesSource.next([])}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Jv=class t{_isSessionLoading=new ei(!1);_isSessionListLoading=new ei(!1);_isEventRequestResponseLoading=new ei(!1);_isMessagesLoading=new ei(!1);_newMessagesLoadedResponse=new ie;_newMessagesLoadingFailedResponse=new ie;featureFlagService=w(yr);isSessionLoading(){return this._isSessionLoading.pipe(RQ(this.featureFlagService.isLoadingAnimationsEnabled()),we(([e,A])=>e&&A),Gs({bufferSize:1,refCount:!0}))}setIsSessionLoading(e){this._isSessionLoading.next(e)}isSessionListLoading(){return this._isSessionListLoading.pipe(RQ(this.featureFlagService.isLoadingAnimationsEnabled()),we(([e,A])=>e&&A),Gs({bufferSize:1,refCount:!0}))}setIsSessionListLoading(e){this._isSessionListLoading.next(e)}isEventRequestResponseLoading(){return this._isEventRequestResponseLoading.pipe(RQ(this.featureFlagService.isLoadingAnimationsEnabled()),we(([e,A])=>e&&A),Gs({bufferSize:1,refCount:!0}))}setIsEventRequestResponseLoading(e){this._isEventRequestResponseLoading.next(e)}setIsMessagesLoading(e){this._isMessagesLoading.next(e)}isMessagesLoading(){return this._isMessagesLoading.pipe(RQ(this.featureFlagService.isLoadingAnimationsEnabled()),we(([e,A])=>e&&A),Gs({bufferSize:1,refCount:!0}))}lazyLoadMessages(e,A,i){throw new Error("Not implemented")}onNewMessagesLoaded(){return this._newMessagesLoadedResponse}onNewMessagesLoadingFailed(){return this._newMessagesLoadingFailedResponse}static \u0275fac=function(A){return new(A||t)};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Ov=class t{mediaRecorder;stream;renderer;videoElement;videoBuffer=[];constructor(e){this.renderer=e.createRenderer(null,null)}createVideoElement(e){e?.nativeElement&&(this.clearVideoElement(e),this.videoElement=this.renderer.createElement("video"),this.renderer.setAttribute(this.videoElement,"width","400"),this.renderer.setAttribute(this.videoElement,"height","300"),this.renderer.setAttribute(this.videoElement,"autoplay","true"),this.renderer.setAttribute(this.videoElement,"muted","true"),this.renderer.appendChild(e.nativeElement,this.videoElement))}startRecording(e){return lt(this,null,function*(){this.createVideoElement(e);try{this.stream=yield navigator.mediaDevices.getUserMedia({video:!0}),this.videoElement&&(this.videoElement.srcObject=this.stream),this.mediaRecorder=new MediaRecorder(this.stream,{mimeType:"video/webm"}),this.mediaRecorder.start(1e3)}catch(A){console.error("Error accessing camera/microphone:",A)}})}getCapturedFrame(){return lt(this,null,function*(){try{let e=yield this.captureFrame();return this.blobToUint8Array(e)}catch(e){console.error("Error capturing frame:",e);return}})}blobToUint8Array(e){return lt(this,null,function*(){let A=yield e.arrayBuffer();return new Uint8Array(A)})}captureFrame(){return lt(this,null,function*(){return new Promise((e,A)=>{try{if(!this.videoElement){A(new Error("Video element not available"));return}let i=document.createElement("canvas");i.width=this.videoElement.videoWidth,i.height=this.videoElement.videoHeight;let n=i.getContext("2d");if(!n){A(new Error("Canvas context not supported"));return}n.drawImage(this.videoElement,0,0,i.width,i.height),i.toBlob(o=>{o?e(o):A(new Error("Failed to create image blob"))},"image/png")}catch(i){A(i)}})})}stopRecording(e){this.mediaRecorder&&this.mediaRecorder.stop(),this.stream&&this.stream.getTracks().forEach(A=>A.stop()),this.clearVideoElement(e)}clearVideoElement(e){let A=e.nativeElement.querySelector("video");A&&this.renderer.removeChild(e.nativeElement,A)}static \u0275fac=function(A){return new(A||t)(Lo(Kr))};static \u0275prov=qA({token:t,factory:t.\u0275fac,providedIn:"root"})};var BKA={url:"",deserializer:t=>JSON.parse(t.data),serializer:t=>JSON.stringify(t)},EKA="WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }",F3=class t extends kF{constructor(e,A){if(super(),this._socket=null,e instanceof vi)this.destination=A,this.source=e;else{let i=this._config=Object.assign({},BKA);if(this._output=new ie,typeof e=="string")i.url=e;else for(let n in e)e.hasOwnProperty(n)&&(i[n]=e[n]);if(!i.WebSocketCtor&&WebSocket)i.WebSocketCtor=WebSocket;else if(!i.WebSocketCtor)throw new Error("no WebSocket constructor can be found");this.destination=new Sg}}lift(e){let A=new t(this._config,this.destination);return A.operator=e,A.source=this,A}_resetState(){this._socket=null,this.source||(this.destination=new Sg),this._output=new ie}multiplex(e,A,i){let n=this;return new vi(o=>{try{n.next(e())}catch(r){o.error(r)}let a=n.subscribe({next:r=>{try{i(r)&&o.next(r)}catch(s){o.error(s)}},error:r=>o.error(r),complete:()=>o.complete()});return()=>{try{n.next(A())}catch(r){o.error(r)}a.unsubscribe()}})}_connectSocket(){let{WebSocketCtor:e,protocol:A,url:i,binaryType:n}=this._config,o=this._output,a=null;try{a=A?new e(i,A):new e(i),this._socket=a,n&&(this._socket.binaryType=n)}catch(s){o.error(s);return}let r=new bo(()=>{this._socket=null,a&&a.readyState===1&&a.close()});a.onopen=s=>{let{_socket:l}=this;if(!l){a.close(),this._resetState();return}let{openObserver:g}=this._config;g&&g.next(s);let C=this.destination;this.destination=bF.create(I=>{if(a.readyState===1)try{let{serializer:d}=this._config;a.send(d(I))}catch(d){this.destination.error(d)}},I=>{let{closingObserver:d}=this._config;d&&d.next(void 0),I&&I.code?a.close(I.code,I.reason):o.error(new TypeError(EKA)),this._resetState()},()=>{let{closingObserver:I}=this._config;I&&I.next(void 0),a.close(),this._resetState()}),C&&C instanceof Sg&&r.add(C.subscribe(this.destination))},a.onerror=s=>{this._resetState(),o.error(s)},a.onclose=s=>{a===this._socket&&this._resetState();let{closeObserver:l}=this._config;l&&l.next(s),s.wasClean?o.complete():o.error(s)},a.onmessage=s=>{try{let{deserializer:l}=this._config;o.next(l(s))}catch(l){o.error(l)}}}_subscribe(e){let{source:A}=this;return A?A.subscribe(e):(this._socket||this._connectSocket(),this._output.subscribe(e),e.add(()=>{let{_socket:i}=this;this._output.observers.length===0&&(i&&(i.readyState===1||i.readyState===0)&&i.close(),this._resetState())}),e)}unsubscribe(){let{_socket:e}=this;e&&(e.readyState===1||e.readyState===0)&&e.close(),this._resetState(),super.unsubscribe()}};var Yv=class t{audioPlayingService=w(HB);socket$;messages$=new ei("");audioBuffer=[];audioIntervalId=null;closeReasonSubject=new ie;connect(e){this.socket$=new F3({url:e,serializer:A=>JSON.stringify(A),deserializer:A=>A.data,closeObserver:{next:A=>{this.emitWsCloseReason(A.reason)}}}),this.socket$.subscribe(A=>{this.handleIncomingEvent(A)},A=>{console.error("WebSocket error:",A)}),this.audioIntervalId=setInterval(()=>this.playIncomingAudio(),250)}playIncomingAudio(){this.audioPlayingService.playAudio(this.audioBuffer),this.audioBuffer=[]}sendMessage(e){if(e.blob.data=this.arrayBufferToBase64(e.blob.data.buffer),!this.socket$||this.socket$.closed){console.error("WebSocket is not open.");return}this.socket$.next(e)}closeConnection(){clearInterval(this.audioIntervalId),this.audioIntervalId=null,this.socket$&&this.socket$.complete()}getMessages(){return this.messages$.asObservable()}arrayBufferToBase64(e){let A="",i=new Uint8Array(e),n=i.byteLength;for(let o=0;ot.json()).then(t=>{window.runtimeConfig=t,rL(wQ,{providers:[GF(sL,ln,lL,hv,Ps,Ya,qi),{provide:Al,useClass:Lv},{provide:$s,useClass:eQ},{provide:Gy,useClass:kv},{provide:zB,useClass:Yv},{provide:l6,useValue:"./assets/audio-processor.js"},{provide:YB,useClass:wv},{provide:HB,useClass:mv},{provide:Rv,useClass:Ov},{provide:s6,useClass:Gv},{provide:o6,useClass:Mv},{provide:t0,useClass:yv},{provide:TB,useClass:pv},{provide:JB,useClass:Dv},{provide:Ag,useClass:Tv},{provide:yr,useClass:Sv},{provide:OB,useClass:_v},{provide:Q2,useClass:Kv},{provide:Cs,useClass:Fv},{provide:a6,useClass:Nv},{provide:cL,useValue:dL},{provide:IL,useValue:hiA},{provide:_I,useValue:BQ},...t.logo?[{provide:PB,useValue:uv}]:[],{provide:e0,useClass:fv},{provide:rv,useValue:xc},JK(),Bu(),{provide:g6,useClass:Uc},{provide:tg,useClass:Jv},{provide:eg,useClass:Uv}]}).catch(e=>console.error(e))}); diff --git a/src/google/adk/cli/browser/styles-2ORK6PRA.css b/src/google/adk/cli/browser/styles-2ORK6PRA.css deleted file mode 100644 index 09d3d4823f..0000000000 --- a/src/google/adk/cli/browser/styles-2ORK6PRA.css +++ /dev/null @@ -1 +0,0 @@ -html{--mat-sys-background: #151316;--mat-sys-error: #ffb4ab;--mat-sys-error-container: #93000a;--mat-sys-inverse-on-surface: #323033;--mat-sys-inverse-primary: #7d00fa;--mat-sys-inverse-surface: #e6e1e6;--mat-sys-on-background: #e6e1e6;--mat-sys-on-error: #690005;--mat-sys-on-error-container: #ffdad6;--mat-sys-on-primary: #42008a;--mat-sys-on-primary-container: #ecdcff;--mat-sys-on-primary-fixed: #270057;--mat-sys-on-primary-fixed-variant: #5f00c0;--mat-sys-on-secondary: #352d40;--mat-sys-on-secondary-container: #eadef7;--mat-sys-on-secondary-fixed: #1f182a;--mat-sys-on-secondary-fixed-variant: #4b4357;--mat-sys-on-surface: #e6e1e6;--mat-sys-on-surface-variant: #e8e0eb;--mat-sys-on-tertiary: #42008a;--mat-sys-on-tertiary-container: #ecdcff;--mat-sys-on-tertiary-fixed: #270057;--mat-sys-on-tertiary-fixed-variant: #5f00c0;--mat-sys-outline: #958e99;--mat-sys-outline-variant: #49454e;--mat-sys-primary: #d5baff;--mat-sys-primary-container: #5f00c0;--mat-sys-primary-fixed: #ecdcff;--mat-sys-primary-fixed-dim: #d5baff;--mat-sys-scrim: #000000;--mat-sys-secondary: #cec2db;--mat-sys-secondary-container: #4b4357;--mat-sys-secondary-fixed: #eadef7;--mat-sys-secondary-fixed-dim: #cec2db;--mat-sys-shadow: #000000;--mat-sys-surface: #151316;--mat-sys-surface-bright: #3b383c;--mat-sys-surface-container: #211f22;--mat-sys-surface-container-high: #2b292d;--mat-sys-surface-container-highest: #363437;--mat-sys-surface-container-low: #1d1b1e;--mat-sys-surface-container-lowest: #0f0d11;--mat-sys-surface-dim: #151316;--mat-sys-surface-tint: #d5baff;--mat-sys-surface-variant: #49454e;--mat-sys-tertiary: #d5baff;--mat-sys-tertiary-container: #5f00c0;--mat-sys-tertiary-fixed: #ecdcff;--mat-sys-tertiary-fixed-dim: #d5baff;--mat-sys-neutral-variant20: #332f37;--mat-sys-neutral10: #1d1b1e;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 400 1rem / 1.5rem Google Sans;--mat-sys-body-large-font: Google Sans;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 400;--mat-sys-body-medium: 400 .875rem / 1.25rem Google Sans;--mat-sys-body-medium-font: Google Sans;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 400;--mat-sys-body-small: 400 .75rem / 1rem Google Sans;--mat-sys-body-small-font: Google Sans;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 400;--mat-sys-display-large: 400 3.562rem / 4rem Google Sans;--mat-sys-display-large-font: Google Sans;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 400;--mat-sys-display-medium: 400 2.812rem / 3.25rem Google Sans;--mat-sys-display-medium-font: Google Sans;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 400;--mat-sys-display-small: 400 2.25rem / 2.75rem Google Sans;--mat-sys-display-small-font: Google Sans;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 400;--mat-sys-headline-large: 400 2rem / 2.5rem Google Sans;--mat-sys-headline-large-font: Google Sans;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 400;--mat-sys-headline-medium: 400 1.75rem / 2.25rem Google Sans;--mat-sys-headline-medium-font: Google Sans;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 400;--mat-sys-headline-small: 400 1.5rem / 2rem Google Sans;--mat-sys-headline-small-font: Google Sans;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 400;--mat-sys-label-large: 500 .875rem / 1.25rem Google Sans;--mat-sys-label-large-font: Google Sans;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 500;--mat-sys-label-large-weight-prominent: 700;--mat-sys-label-medium: 500 .75rem / 1rem Google Sans;--mat-sys-label-medium-font: Google Sans;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 500;--mat-sys-label-medium-weight-prominent: 700;--mat-sys-label-small: 500 .688rem / 1rem Google Sans;--mat-sys-label-small-font: Google Sans;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 500;--mat-sys-title-large: 400 1.375rem / 1.75rem Google Sans;--mat-sys-title-large-font: Google Sans;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 400;--mat-sys-title-medium: 500 1rem / 1.5rem Google Sans;--mat-sys-title-medium-font: Google Sans;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 500;--mat-sys-title-small: 500 .875rem / 1.25rem Google Sans;--mat-sys-title-small-font: Google Sans;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 500;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;color-scheme:dark;--mat-sys-primary: #7cc4ff;--mat-sys-on-primary: #003366;--mat-sys-primary-container: #004b8d;--mat-sys-on-primary-container: #d1e4ff;--mat-sys-secondary: #b5c9e2;--mat-sys-on-secondary: #203246;--mat-sys-secondary-container: #3a485a;--mat-sys-on-secondary-container: #d7e3f7}html.light-theme{--mat-sys-background: #fef8fc;--mat-sys-error: #ba1a1a;--mat-sys-error-container: #ffdad6;--mat-sys-inverse-on-surface: #f5eff4;--mat-sys-inverse-primary: #d5baff;--mat-sys-inverse-surface: #323033;--mat-sys-on-background: #1d1b1e;--mat-sys-on-error: #ffffff;--mat-sys-on-error-container: #93000a;--mat-sys-on-primary-container: #5f00c0;--mat-sys-on-primary-fixed: #270057;--mat-sys-on-primary-fixed-variant: #5f00c0;--mat-sys-on-secondary-container: #4b4357;--mat-sys-on-secondary-fixed: #1f182a;--mat-sys-on-secondary-fixed-variant: #4b4357;--mat-sys-on-surface: #1d1b1e;--mat-sys-on-surface-variant: #49454e;--mat-sys-on-tertiary: #ffffff;--mat-sys-on-tertiary-container: #5f00c0;--mat-sys-on-tertiary-fixed: #270057;--mat-sys-on-tertiary-fixed-variant: #5f00c0;--mat-sys-outline: #7b757f;--mat-sys-outline-variant: #cbc4cf;--mat-sys-primary: #7d00fa;--mat-sys-primary-container: #ecdcff;--mat-sys-primary-fixed: #ecdcff;--mat-sys-primary-fixed-dim: #d5baff;--mat-sys-scrim: #000000;--mat-sys-secondary: #645b70;--mat-sys-secondary-container: #eadef7;--mat-sys-secondary-fixed: #eadef7;--mat-sys-secondary-fixed-dim: #cec2db;--mat-sys-shadow: #000000;--mat-sys-surface: #fef8fc;--mat-sys-surface-bright: #fef8fc;--mat-sys-surface-container: #f2ecf1;--mat-sys-surface-container-high: #ede6eb;--mat-sys-surface-container-highest: #e6e1e6;--mat-sys-surface-container-low: #f8f2f6;--mat-sys-surface-container-lowest: #ffffff;--mat-sys-surface-dim: #ded8dd;--mat-sys-surface-tint: #7d00fa;--mat-sys-surface-variant: #e8e0eb;--mat-sys-tertiary: #7d00fa;--mat-sys-tertiary-container: #ecdcff;--mat-sys-tertiary-fixed: #ecdcff;--mat-sys-tertiary-fixed-dim: #d5baff;--mat-sys-neutral-variant20: #332f37;--mat-sys-neutral10: #1d1b1e;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 400 1rem / 1.5rem Google Sans;--mat-sys-body-large-font: Google Sans;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 400;--mat-sys-body-medium: 400 .875rem / 1.25rem Google Sans;--mat-sys-body-medium-font: Google Sans;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 400;--mat-sys-body-small: 400 .75rem / 1rem Google Sans;--mat-sys-body-small-font: Google Sans;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 400;--mat-sys-display-large: 400 3.562rem / 4rem Google Sans;--mat-sys-display-large-font: Google Sans;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 400;--mat-sys-display-medium: 400 2.812rem / 3.25rem Google Sans;--mat-sys-display-medium-font: Google Sans;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 400;--mat-sys-display-small: 400 2.25rem / 2.75rem Google Sans;--mat-sys-display-small-font: Google Sans;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 400;--mat-sys-headline-large: 400 2rem / 2.5rem Google Sans;--mat-sys-headline-large-font: Google Sans;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 400;--mat-sys-headline-medium: 400 1.75rem / 2.25rem Google Sans;--mat-sys-headline-medium-font: Google Sans;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 400;--mat-sys-headline-small: 400 1.5rem / 2rem Google Sans;--mat-sys-headline-small-font: Google Sans;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 400;--mat-sys-label-large: 500 .875rem / 1.25rem Google Sans;--mat-sys-label-large-font: Google Sans;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 500;--mat-sys-label-large-weight-prominent: 700;--mat-sys-label-medium: 500 .75rem / 1rem Google Sans;--mat-sys-label-medium-font: Google Sans;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 500;--mat-sys-label-medium-weight-prominent: 700;--mat-sys-label-small: 500 .688rem / 1rem Google Sans;--mat-sys-label-small-font: Google Sans;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 500;--mat-sys-title-large: 400 1.375rem / 1.75rem Google Sans;--mat-sys-title-large-font: Google Sans;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 400;--mat-sys-title-medium: 500 1rem / 1.5rem Google Sans;--mat-sys-title-medium-font: Google Sans;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 500;--mat-sys-title-small: 500 .875rem / 1.25rem Google Sans;--mat-sys-title-small-font: Google Sans;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 500;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;color-scheme:light;--mat-sys-primary: #005fb7;--mat-sys-on-primary: #ffffff;--mat-sys-primary-container: #d1e4ff;--mat-sys-on-primary-container: #001c37;--mat-sys-secondary: #535f70;--mat-sys-on-secondary: #ffffff;--mat-sys-secondary-container: #d7e3f7;--mat-sys-on-secondary-container: #101c2b}html.dark-theme{--mat-sys-background: #151316;--mat-sys-error: #ffb4ab;--mat-sys-error-container: #93000a;--mat-sys-inverse-on-surface: #323033;--mat-sys-inverse-primary: #7d00fa;--mat-sys-inverse-surface: #e6e1e6;--mat-sys-on-background: #e6e1e6;--mat-sys-on-error: #690005;--mat-sys-on-error-container: #ffdad6;--mat-sys-on-primary: #42008a;--mat-sys-on-primary-container: #ecdcff;--mat-sys-on-primary-fixed: #270057;--mat-sys-on-primary-fixed-variant: #5f00c0;--mat-sys-on-secondary: #352d40;--mat-sys-on-secondary-container: #eadef7;--mat-sys-on-secondary-fixed: #1f182a;--mat-sys-on-secondary-fixed-variant: #4b4357;--mat-sys-on-surface: #e6e1e6;--mat-sys-on-surface-variant: #e8e0eb;--mat-sys-on-tertiary: #42008a;--mat-sys-on-tertiary-container: #ecdcff;--mat-sys-on-tertiary-fixed: #270057;--mat-sys-on-tertiary-fixed-variant: #5f00c0;--mat-sys-outline: #958e99;--mat-sys-outline-variant: #49454e;--mat-sys-primary: #d5baff;--mat-sys-primary-container: #5f00c0;--mat-sys-primary-fixed: #ecdcff;--mat-sys-primary-fixed-dim: #d5baff;--mat-sys-scrim: #000000;--mat-sys-secondary: #cec2db;--mat-sys-secondary-container: #4b4357;--mat-sys-secondary-fixed: #eadef7;--mat-sys-secondary-fixed-dim: #cec2db;--mat-sys-shadow: #000000;--mat-sys-surface: #151316;--mat-sys-surface-bright: #3b383c;--mat-sys-surface-container: #211f22;--mat-sys-surface-container-high: #2b292d;--mat-sys-surface-container-highest: #363437;--mat-sys-surface-container-low: #1d1b1e;--mat-sys-surface-container-lowest: #0f0d11;--mat-sys-surface-dim: #151316;--mat-sys-surface-tint: #d5baff;--mat-sys-surface-variant: #49454e;--mat-sys-tertiary: #d5baff;--mat-sys-tertiary-container: #5f00c0;--mat-sys-tertiary-fixed: #ecdcff;--mat-sys-tertiary-fixed-dim: #d5baff;--mat-sys-neutral-variant20: #332f37;--mat-sys-neutral10: #1d1b1e;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 400 1rem / 1.5rem Google Sans;--mat-sys-body-large-font: Google Sans;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 400;--mat-sys-body-medium: 400 .875rem / 1.25rem Google Sans;--mat-sys-body-medium-font: Google Sans;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 400;--mat-sys-body-small: 400 .75rem / 1rem Google Sans;--mat-sys-body-small-font: Google Sans;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 400;--mat-sys-display-large: 400 3.562rem / 4rem Google Sans;--mat-sys-display-large-font: Google Sans;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 400;--mat-sys-display-medium: 400 2.812rem / 3.25rem Google Sans;--mat-sys-display-medium-font: Google Sans;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 400;--mat-sys-display-small: 400 2.25rem / 2.75rem Google Sans;--mat-sys-display-small-font: Google Sans;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 400;--mat-sys-headline-large: 400 2rem / 2.5rem Google Sans;--mat-sys-headline-large-font: Google Sans;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 400;--mat-sys-headline-medium: 400 1.75rem / 2.25rem Google Sans;--mat-sys-headline-medium-font: Google Sans;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 400;--mat-sys-headline-small: 400 1.5rem / 2rem Google Sans;--mat-sys-headline-small-font: Google Sans;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 400;--mat-sys-label-large: 500 .875rem / 1.25rem Google Sans;--mat-sys-label-large-font: Google Sans;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 500;--mat-sys-label-large-weight-prominent: 700;--mat-sys-label-medium: 500 .75rem / 1rem Google Sans;--mat-sys-label-medium-font: Google Sans;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 500;--mat-sys-label-medium-weight-prominent: 700;--mat-sys-label-small: 500 .688rem / 1rem Google Sans;--mat-sys-label-small-font: Google Sans;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 500;--mat-sys-title-large: 400 1.375rem / 1.75rem Google Sans;--mat-sys-title-large-font: Google Sans;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 400;--mat-sys-title-medium: 500 1rem / 1.5rem Google Sans;--mat-sys-title-medium-font: Google Sans;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 500;--mat-sys-title-small: 500 .875rem / 1.25rem Google Sans;--mat-sys-title-small-font: Google Sans;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 500;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;color-scheme:dark;--mat-sys-primary: #7cc4ff;--mat-sys-on-primary: #003366;--mat-sys-primary-container: #004b8d;--mat-sys-on-primary-container: #d1e4ff;--mat-sys-secondary: #b5c9e2;--mat-sys-on-secondary: #203246;--mat-sys-secondary-container: #3a485a;--mat-sys-on-secondary-container: #d7e3f7}body{height:100vh;margin:0;font-family:Roboto,Helvetica Neue,sans-serif}markdown p{margin-block-start:.5em;margin-block-end:.5em}markdown pre{border-radius:8px!important}markdown code{border-radius:4px!important}.json-tooltip-panel{color:var(--mat-sys-on-surface)!important;border:1px solid var(--mat-sys-outline-variant)!important;border-radius:8px!important;padding:12px 16px!important;box-shadow:0 4px 12px #00000026!important;max-width:800px!important;overflow:hidden!important;background-color:var(--mat-sys-surface-container-high)!important}ngx-json-viewer .segment-key{color:var(--mat-sys-primary)!important}ngx-json-viewer .segment-value{color:inherit}ngx-json-viewer .segment-type-string{color:var(--mat-sys-tertiary)!important}ngx-json-viewer .segment-type-number{color:var(--mat-sys-error)!important}ngx-json-viewer .segment-type-boolean{color:var(--mat-sys-secondary)!important}ngx-json-viewer .segment-type-null{color:var(--mat-sys-outline)!important}.user-avatar-menu .mat-mdc-menu-content{padding:0}.html-tooltip-panel .content-bubble{max-width:100%!important}.html-tooltip-panel .message-text p{white-space:pre-line;word-break:break-word;overflow-wrap:break-word} diff --git a/src/google/adk/cli/browser/styles-LBC36Z6S.css b/src/google/adk/cli/browser/styles-LBC36Z6S.css new file mode 100644 index 0000000000..addebd5671 --- /dev/null +++ b/src/google/adk/cli/browser/styles-LBC36Z6S.css @@ -0,0 +1 @@ +html{--mat-sys-background: #151316;--mat-sys-error: #ffb4ab;--mat-sys-error-container: #93000a;--mat-sys-inverse-on-surface: #323033;--mat-sys-inverse-primary: #7d00fa;--mat-sys-inverse-surface: #e6e1e6;--mat-sys-on-background: #e6e1e6;--mat-sys-on-error: #690005;--mat-sys-on-error-container: #ffdad6;--mat-sys-on-primary: #42008a;--mat-sys-on-primary-container: #ecdcff;--mat-sys-on-primary-fixed: #270057;--mat-sys-on-primary-fixed-variant: #5f00c0;--mat-sys-on-secondary: #352d40;--mat-sys-on-secondary-container: #eadef7;--mat-sys-on-secondary-fixed: #1f182a;--mat-sys-on-secondary-fixed-variant: #4b4357;--mat-sys-on-surface: #e6e1e6;--mat-sys-on-surface-variant: #e8e0eb;--mat-sys-on-tertiary: #42008a;--mat-sys-on-tertiary-container: #ecdcff;--mat-sys-on-tertiary-fixed: #270057;--mat-sys-on-tertiary-fixed-variant: #5f00c0;--mat-sys-outline: #958e99;--mat-sys-outline-variant: #49454e;--mat-sys-primary: #d5baff;--mat-sys-primary-container: #5f00c0;--mat-sys-primary-fixed: #ecdcff;--mat-sys-primary-fixed-dim: #d5baff;--mat-sys-scrim: #000000;--mat-sys-secondary: #cec2db;--mat-sys-secondary-container: #4b4357;--mat-sys-secondary-fixed: #eadef7;--mat-sys-secondary-fixed-dim: #cec2db;--mat-sys-shadow: #000000;--mat-sys-surface: #151316;--mat-sys-surface-bright: #3b383c;--mat-sys-surface-container: #211f22;--mat-sys-surface-container-high: #2b292d;--mat-sys-surface-container-highest: #363437;--mat-sys-surface-container-low: #1d1b1e;--mat-sys-surface-container-lowest: #0f0d11;--mat-sys-surface-dim: #151316;--mat-sys-surface-tint: #d5baff;--mat-sys-surface-variant: #49454e;--mat-sys-tertiary: #d5baff;--mat-sys-tertiary-container: #5f00c0;--mat-sys-tertiary-fixed: #ecdcff;--mat-sys-tertiary-fixed-dim: #d5baff;--mat-sys-neutral-variant20: #332f37;--mat-sys-neutral10: #1d1b1e;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 400 1rem / 1.5rem Google Sans;--mat-sys-body-large-font: Google Sans;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 400;--mat-sys-body-medium: 400 .875rem / 1.25rem Google Sans;--mat-sys-body-medium-font: Google Sans;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 400;--mat-sys-body-small: 400 .75rem / 1rem Google Sans;--mat-sys-body-small-font: Google Sans;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 400;--mat-sys-display-large: 400 3.562rem / 4rem Google Sans;--mat-sys-display-large-font: Google Sans;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 400;--mat-sys-display-medium: 400 2.812rem / 3.25rem Google Sans;--mat-sys-display-medium-font: Google Sans;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 400;--mat-sys-display-small: 400 2.25rem / 2.75rem Google Sans;--mat-sys-display-small-font: Google Sans;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 400;--mat-sys-headline-large: 400 2rem / 2.5rem Google Sans;--mat-sys-headline-large-font: Google Sans;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 400;--mat-sys-headline-medium: 400 1.75rem / 2.25rem Google Sans;--mat-sys-headline-medium-font: Google Sans;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 400;--mat-sys-headline-small: 400 1.5rem / 2rem Google Sans;--mat-sys-headline-small-font: Google Sans;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 400;--mat-sys-label-large: 500 .875rem / 1.25rem Google Sans;--mat-sys-label-large-font: Google Sans;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 500;--mat-sys-label-large-weight-prominent: 700;--mat-sys-label-medium: 500 .75rem / 1rem Google Sans;--mat-sys-label-medium-font: Google Sans;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 500;--mat-sys-label-medium-weight-prominent: 700;--mat-sys-label-small: 500 .688rem / 1rem Google Sans;--mat-sys-label-small-font: Google Sans;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 500;--mat-sys-title-large: 400 1.375rem / 1.75rem Google Sans;--mat-sys-title-large-font: Google Sans;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 400;--mat-sys-title-medium: 500 1rem / 1.5rem Google Sans;--mat-sys-title-medium-font: Google Sans;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 500;--mat-sys-title-small: 500 .875rem / 1.25rem Google Sans;--mat-sys-title-small-font: Google Sans;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 500;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;color-scheme:dark;--mat-sys-primary: #7cc4ff;--mat-sys-on-primary: #003366;--mat-sys-primary-container: #004b8d;--mat-sys-on-primary-container: #d1e4ff;--mat-sys-secondary: #b5c9e2;--mat-sys-on-secondary: #203246;--mat-sys-secondary-container: #3a485a;--mat-sys-on-secondary-container: #d7e3f7;--mat-sys-background: #121212;--mat-sys-surface: #121212;--mat-sys-surface-container: #1e1e1e;--mat-sys-surface-container-low: #1a1a1a;--mat-sys-surface-container-high: #2a2a2a;--mat-sys-surface-container-highest: #3a3a3a}html.light-theme{--mat-sys-background: #fef8fc;--mat-sys-error: #ba1a1a;--mat-sys-error-container: #ffdad6;--mat-sys-inverse-on-surface: #f5eff4;--mat-sys-inverse-primary: #d5baff;--mat-sys-inverse-surface: #323033;--mat-sys-on-background: #1d1b1e;--mat-sys-on-error: #ffffff;--mat-sys-on-error-container: #93000a;--mat-sys-on-primary-container: #5f00c0;--mat-sys-on-primary-fixed: #270057;--mat-sys-on-primary-fixed-variant: #5f00c0;--mat-sys-on-secondary-container: #4b4357;--mat-sys-on-secondary-fixed: #1f182a;--mat-sys-on-secondary-fixed-variant: #4b4357;--mat-sys-on-surface: #1d1b1e;--mat-sys-on-surface-variant: #49454e;--mat-sys-on-tertiary: #ffffff;--mat-sys-on-tertiary-container: #5f00c0;--mat-sys-on-tertiary-fixed: #270057;--mat-sys-on-tertiary-fixed-variant: #5f00c0;--mat-sys-outline: #7b757f;--mat-sys-outline-variant: #cbc4cf;--mat-sys-primary: #7d00fa;--mat-sys-primary-container: #ecdcff;--mat-sys-primary-fixed: #ecdcff;--mat-sys-primary-fixed-dim: #d5baff;--mat-sys-scrim: #000000;--mat-sys-secondary: #645b70;--mat-sys-secondary-container: #eadef7;--mat-sys-secondary-fixed: #eadef7;--mat-sys-secondary-fixed-dim: #cec2db;--mat-sys-shadow: #000000;--mat-sys-surface: #fef8fc;--mat-sys-surface-bright: #fef8fc;--mat-sys-surface-container: #f2ecf1;--mat-sys-surface-container-high: #ede6eb;--mat-sys-surface-container-highest: #e6e1e6;--mat-sys-surface-container-low: #f8f2f6;--mat-sys-surface-container-lowest: #ffffff;--mat-sys-surface-dim: #ded8dd;--mat-sys-surface-tint: #7d00fa;--mat-sys-surface-variant: #e8e0eb;--mat-sys-tertiary: #7d00fa;--mat-sys-tertiary-container: #ecdcff;--mat-sys-tertiary-fixed: #ecdcff;--mat-sys-tertiary-fixed-dim: #d5baff;--mat-sys-neutral-variant20: #332f37;--mat-sys-neutral10: #1d1b1e;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 400 1rem / 1.5rem Google Sans;--mat-sys-body-large-font: Google Sans;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 400;--mat-sys-body-medium: 400 .875rem / 1.25rem Google Sans;--mat-sys-body-medium-font: Google Sans;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 400;--mat-sys-body-small: 400 .75rem / 1rem Google Sans;--mat-sys-body-small-font: Google Sans;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 400;--mat-sys-display-large: 400 3.562rem / 4rem Google Sans;--mat-sys-display-large-font: Google Sans;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 400;--mat-sys-display-medium: 400 2.812rem / 3.25rem Google Sans;--mat-sys-display-medium-font: Google Sans;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 400;--mat-sys-display-small: 400 2.25rem / 2.75rem Google Sans;--mat-sys-display-small-font: Google Sans;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 400;--mat-sys-headline-large: 400 2rem / 2.5rem Google Sans;--mat-sys-headline-large-font: Google Sans;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 400;--mat-sys-headline-medium: 400 1.75rem / 2.25rem Google Sans;--mat-sys-headline-medium-font: Google Sans;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 400;--mat-sys-headline-small: 400 1.5rem / 2rem Google Sans;--mat-sys-headline-small-font: Google Sans;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 400;--mat-sys-label-large: 500 .875rem / 1.25rem Google Sans;--mat-sys-label-large-font: Google Sans;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 500;--mat-sys-label-large-weight-prominent: 700;--mat-sys-label-medium: 500 .75rem / 1rem Google Sans;--mat-sys-label-medium-font: Google Sans;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 500;--mat-sys-label-medium-weight-prominent: 700;--mat-sys-label-small: 500 .688rem / 1rem Google Sans;--mat-sys-label-small-font: Google Sans;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 500;--mat-sys-title-large: 400 1.375rem / 1.75rem Google Sans;--mat-sys-title-large-font: Google Sans;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 400;--mat-sys-title-medium: 500 1rem / 1.5rem Google Sans;--mat-sys-title-medium-font: Google Sans;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 500;--mat-sys-title-small: 500 .875rem / 1.25rem Google Sans;--mat-sys-title-small-font: Google Sans;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 500;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;color-scheme:light;--mat-sys-primary: #005fb7;--mat-sys-on-primary: #ffffff;--mat-sys-primary-container: #d1e4ff;--mat-sys-on-primary-container: #001c37;--mat-sys-secondary: #535f70;--mat-sys-on-secondary: #ffffff;--mat-sys-secondary-container: #d7e3f7;--mat-sys-on-secondary-container: #101c2b;--mat-sys-background: #ffffff;--mat-sys-surface: #ffffff;--mat-sys-surface-container: #f5f5f5;--mat-sys-surface-container-low: #fafafa;--mat-sys-surface-container-high: #eeeeee;--mat-sys-surface-container-highest: #e0e0e0}html.dark-theme{--mat-sys-background: #151316;--mat-sys-error: #ffb4ab;--mat-sys-error-container: #93000a;--mat-sys-inverse-on-surface: #323033;--mat-sys-inverse-primary: #7d00fa;--mat-sys-inverse-surface: #e6e1e6;--mat-sys-on-background: #e6e1e6;--mat-sys-on-error: #690005;--mat-sys-on-error-container: #ffdad6;--mat-sys-on-primary: #42008a;--mat-sys-on-primary-container: #ecdcff;--mat-sys-on-primary-fixed: #270057;--mat-sys-on-primary-fixed-variant: #5f00c0;--mat-sys-on-secondary: #352d40;--mat-sys-on-secondary-container: #eadef7;--mat-sys-on-secondary-fixed: #1f182a;--mat-sys-on-secondary-fixed-variant: #4b4357;--mat-sys-on-surface: #e6e1e6;--mat-sys-on-surface-variant: #e8e0eb;--mat-sys-on-tertiary: #42008a;--mat-sys-on-tertiary-container: #ecdcff;--mat-sys-on-tertiary-fixed: #270057;--mat-sys-on-tertiary-fixed-variant: #5f00c0;--mat-sys-outline: #958e99;--mat-sys-outline-variant: #49454e;--mat-sys-primary: #d5baff;--mat-sys-primary-container: #5f00c0;--mat-sys-primary-fixed: #ecdcff;--mat-sys-primary-fixed-dim: #d5baff;--mat-sys-scrim: #000000;--mat-sys-secondary: #cec2db;--mat-sys-secondary-container: #4b4357;--mat-sys-secondary-fixed: #eadef7;--mat-sys-secondary-fixed-dim: #cec2db;--mat-sys-shadow: #000000;--mat-sys-surface: #151316;--mat-sys-surface-bright: #3b383c;--mat-sys-surface-container: #211f22;--mat-sys-surface-container-high: #2b292d;--mat-sys-surface-container-highest: #363437;--mat-sys-surface-container-low: #1d1b1e;--mat-sys-surface-container-lowest: #0f0d11;--mat-sys-surface-dim: #151316;--mat-sys-surface-tint: #d5baff;--mat-sys-surface-variant: #49454e;--mat-sys-tertiary: #d5baff;--mat-sys-tertiary-container: #5f00c0;--mat-sys-tertiary-fixed: #ecdcff;--mat-sys-tertiary-fixed-dim: #d5baff;--mat-sys-neutral-variant20: #332f37;--mat-sys-neutral10: #1d1b1e;--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12);--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12);--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12);--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12);--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12);--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12);--mat-sys-body-large: 400 1rem / 1.5rem Google Sans;--mat-sys-body-large-font: Google Sans;--mat-sys-body-large-line-height: 1.5rem;--mat-sys-body-large-size: 1rem;--mat-sys-body-large-tracking: .031rem;--mat-sys-body-large-weight: 400;--mat-sys-body-medium: 400 .875rem / 1.25rem Google Sans;--mat-sys-body-medium-font: Google Sans;--mat-sys-body-medium-line-height: 1.25rem;--mat-sys-body-medium-size: .875rem;--mat-sys-body-medium-tracking: .016rem;--mat-sys-body-medium-weight: 400;--mat-sys-body-small: 400 .75rem / 1rem Google Sans;--mat-sys-body-small-font: Google Sans;--mat-sys-body-small-line-height: 1rem;--mat-sys-body-small-size: .75rem;--mat-sys-body-small-tracking: .025rem;--mat-sys-body-small-weight: 400;--mat-sys-display-large: 400 3.562rem / 4rem Google Sans;--mat-sys-display-large-font: Google Sans;--mat-sys-display-large-line-height: 4rem;--mat-sys-display-large-size: 3.562rem;--mat-sys-display-large-tracking: -.016rem;--mat-sys-display-large-weight: 400;--mat-sys-display-medium: 400 2.812rem / 3.25rem Google Sans;--mat-sys-display-medium-font: Google Sans;--mat-sys-display-medium-line-height: 3.25rem;--mat-sys-display-medium-size: 2.812rem;--mat-sys-display-medium-tracking: 0;--mat-sys-display-medium-weight: 400;--mat-sys-display-small: 400 2.25rem / 2.75rem Google Sans;--mat-sys-display-small-font: Google Sans;--mat-sys-display-small-line-height: 2.75rem;--mat-sys-display-small-size: 2.25rem;--mat-sys-display-small-tracking: 0;--mat-sys-display-small-weight: 400;--mat-sys-headline-large: 400 2rem / 2.5rem Google Sans;--mat-sys-headline-large-font: Google Sans;--mat-sys-headline-large-line-height: 2.5rem;--mat-sys-headline-large-size: 2rem;--mat-sys-headline-large-tracking: 0;--mat-sys-headline-large-weight: 400;--mat-sys-headline-medium: 400 1.75rem / 2.25rem Google Sans;--mat-sys-headline-medium-font: Google Sans;--mat-sys-headline-medium-line-height: 2.25rem;--mat-sys-headline-medium-size: 1.75rem;--mat-sys-headline-medium-tracking: 0;--mat-sys-headline-medium-weight: 400;--mat-sys-headline-small: 400 1.5rem / 2rem Google Sans;--mat-sys-headline-small-font: Google Sans;--mat-sys-headline-small-line-height: 2rem;--mat-sys-headline-small-size: 1.5rem;--mat-sys-headline-small-tracking: 0;--mat-sys-headline-small-weight: 400;--mat-sys-label-large: 500 .875rem / 1.25rem Google Sans;--mat-sys-label-large-font: Google Sans;--mat-sys-label-large-line-height: 1.25rem;--mat-sys-label-large-size: .875rem;--mat-sys-label-large-tracking: .006rem;--mat-sys-label-large-weight: 500;--mat-sys-label-large-weight-prominent: 700;--mat-sys-label-medium: 500 .75rem / 1rem Google Sans;--mat-sys-label-medium-font: Google Sans;--mat-sys-label-medium-line-height: 1rem;--mat-sys-label-medium-size: .75rem;--mat-sys-label-medium-tracking: .031rem;--mat-sys-label-medium-weight: 500;--mat-sys-label-medium-weight-prominent: 700;--mat-sys-label-small: 500 .688rem / 1rem Google Sans;--mat-sys-label-small-font: Google Sans;--mat-sys-label-small-line-height: 1rem;--mat-sys-label-small-size: .688rem;--mat-sys-label-small-tracking: .031rem;--mat-sys-label-small-weight: 500;--mat-sys-title-large: 400 1.375rem / 1.75rem Google Sans;--mat-sys-title-large-font: Google Sans;--mat-sys-title-large-line-height: 1.75rem;--mat-sys-title-large-size: 1.375rem;--mat-sys-title-large-tracking: 0;--mat-sys-title-large-weight: 400;--mat-sys-title-medium: 500 1rem / 1.5rem Google Sans;--mat-sys-title-medium-font: Google Sans;--mat-sys-title-medium-line-height: 1.5rem;--mat-sys-title-medium-size: 1rem;--mat-sys-title-medium-tracking: .009rem;--mat-sys-title-medium-weight: 500;--mat-sys-title-small: 500 .875rem / 1.25rem Google Sans;--mat-sys-title-small-font: Google Sans;--mat-sys-title-small-line-height: 1.25rem;--mat-sys-title-small-size: .875rem;--mat-sys-title-small-tracking: .006rem;--mat-sys-title-small-weight: 500;--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12;color-scheme:dark;--mat-sys-primary: #7cc4ff;--mat-sys-on-primary: #003366;--mat-sys-primary-container: #004b8d;--mat-sys-on-primary-container: #d1e4ff;--mat-sys-secondary: #b5c9e2;--mat-sys-on-secondary: #203246;--mat-sys-secondary-container: #3a485a;--mat-sys-on-secondary-container: #d7e3f7;--mat-sys-background: #121212;--mat-sys-surface: #121212;--mat-sys-surface-container: #1e1e1e;--mat-sys-surface-container-low: #1a1a1a;--mat-sys-surface-container-high: #2a2a2a;--mat-sys-surface-container-highest: #3a3a3a}body{height:100vh;margin:0;font-family:Roboto,Helvetica Neue,sans-serif;overflow:hidden}markdown p{margin-block-start:.5em;margin-block-end:.5em}markdown pre{border-radius:8px!important}markdown code{border-radius:4px!important}.json-tooltip-panel{color:var(--mat-sys-on-surface)!important;border:1px solid var(--mat-sys-outline-variant)!important;border-radius:8px!important;padding:12px 16px!important;box-shadow:0 4px 12px #00000026!important;max-width:800px!important;overflow:hidden!important;background-color:var(--mat-sys-surface-container-high)!important}.user-avatar-menu .mat-mdc-menu-content{padding:0}.html-tooltip-panel .content-bubble{max-width:100%!important}.html-tooltip-panel .message-text p{white-space:pre-line;word-break:break-word;overflow-wrap:break-word}.custom-image-dialog .mdc-dialog__surface{background-color:transparent!important;box-shadow:none!important;border-radius:0!important} diff --git a/src/google/adk/cli/built_in_agents/adk_agent_builder_assistant.py b/src/google/adk/cli/built_in_agents/adk_agent_builder_assistant.py index 8d7ddadbb3..3ccc45337f 100644 --- a/src/google/adk/cli/built_in_agents/adk_agent_builder_assistant.py +++ b/src/google/adk/cli/built_in_agents/adk_agent_builder_assistant.py @@ -55,7 +55,6 @@ class AgentBuilderAssistant: "BaseAgentConfig", "AgentRefConfig", "CodeConfig", - "ArgumentConfig", "ToolArgsConfig", "google__adk__tools__tool_configs__ToolConfig", ) @@ -256,26 +255,18 @@ def add(text: str = "", indent: int = 0) -> None: indent=2, ) add( - "args: optional object of additional keyword arguments. Use simple " - "key-value pairs (ToolArgsConfig) or structured ArgumentConfig entries " - "when a list is required by callbacks.", - indent=2, - ) - - add() - add("ArgumentConfig") - add( - "Represents a single argument. value is required and may be any JSON " - "type. name is optional (null allowed). Often used in callback args.", + "args: optional ToolArgsConfig of free key-value pairs forwarded to" + " the tool's from_config().", indent=2, ) add() add("CodeConfig") add( - "References Python code for callbacks or dynamic tool creation." - " Requires name (dotted path). args is an optional list of" - " ArgumentConfig items executed when invoking the function.", + "References Python code by fully qualified name (e.g." + " my_library.my_module.my_function). The referenced object must" + " already be constructed in Python; YAML cannot pass constructor" + " arguments.", indent=2, ) diff --git a/src/google/adk/cli/cli.py b/src/google/adk/cli/cli.py index 1d49f50d79..d23b4b2a13 100644 --- a/src/google/adk/cli/cli.py +++ b/src/google/adk/cli/cli.py @@ -14,8 +14,14 @@ from __future__ import annotations +import asyncio from datetime import datetime +import json +import logging from pathlib import Path +import re +import sys +from typing import Any from typing import Optional from typing import Union @@ -23,11 +29,13 @@ from google.genai import types from pydantic import BaseModel +from ..agents.base_agent import BaseAgent from ..agents.llm_agent import LlmAgent from ..apps.app import App from ..artifacts.base_artifact_service import BaseArtifactService from ..auth.credential_service.base_credential_service import BaseCredentialService from ..auth.credential_service.in_memory_credential_service import InMemoryCredentialService +from ..events.event import Event from ..memory.base_memory_service import BaseMemoryService from ..runners import Runner from ..sessions.base_session_service import BaseSessionService @@ -41,12 +49,21 @@ from .utils.service_factory import create_memory_service_from_options from .utils.service_factory import create_session_service_from_options +logger = logging.getLogger('google_adk.' + __name__) + class InputFile(BaseModel): state: dict[str, object] queries: list[str] +def _to_app(agent_or_app: Union[BaseAgent, App, Any], app_name: str) -> App: + """Wraps a BaseAgent or BaseNode in an App if not already one.""" + if isinstance(agent_or_app, App): + return agent_or_app + return App(name=app_name, root_agent=agent_or_app) + + async def run_input_file( app_name: str, user_id: str, @@ -57,11 +74,7 @@ async def run_input_file( input_path: str, memory_service: Optional[BaseMemoryService] = None, ) -> Session: - app = ( - agent_or_app - if isinstance(agent_or_app, App) - else App(name=app_name, root_agent=agent_or_app) - ) + app = _to_app(agent_or_app, app_name) runner = Runner( app=app, artifact_service=artifact_service, @@ -91,6 +104,86 @@ async def run_input_file( return session +_REQUEST_INPUT = 'adk_request_input' +_REQUEST_CONFIRMATION = 'adk_request_confirmation' + + +def _collect_pending_function_calls( + events: list[Event], +) -> list[tuple[str, str, dict[str, Any]]]: + """Collects pending HITL function calls from events. + + Returns a list of (function_call_id, function_name, args) tuples + for function calls that need user input. + """ + pending = [] + for event in events: + lr_ids = getattr(event, 'long_running_tool_ids', None) + if not lr_ids: + continue + content = getattr(event, 'content', None) + if not content or not content.parts: + continue + for part in content.parts: + fc = part.function_call + if fc and fc.id in lr_ids: + pending.append((fc.id, fc.name, fc.args or {})) + return pending + + +def _is_positive_response(s: str) -> bool: + """Returns True if the string is a positive response.""" + return s.strip().lower() in ('y', 'yes', 'true', 'confirm') + + +def _prompt_for_function_call( + fc_id: str, fc_name: str, args: dict[str, Any] +) -> types.Content: + """Prompts the user for a HITL function call and returns the response.""" + if fc_name == _REQUEST_INPUT: + message = args.get('message') or 'Input requested' + schema = args.get('response_schema') + click.echo(f'[HITL input] {message}') + if schema: + click.echo(f' Schema: {json.dumps(schema)}') + elif fc_name == _REQUEST_CONFIRMATION: + tool_confirmation = args.get('toolConfirmation', {}) + hint = tool_confirmation.get('hint', '') + original_fc = args.get('originalFunctionCall', {}) + original_name = original_fc.get('name', 'unknown') + click.echo(f'[HITL confirm] {hint or f"Confirm {original_name}?"}') + click.echo(' Type "yes" to confirm, anything else to reject.') + else: + click.echo(f'[HITL] Waiting for input for {fc_name}({args})') + + user_input = input('[user]: ') + + # Build the FunctionResponse. + if fc_name == _REQUEST_CONFIRMATION: + confirmed = _is_positive_response(user_input) + response = {'confirmed': confirmed} + else: + # Try to parse as JSON, fall back to wrapping as {"result": value}. + try: + parsed = json.loads(user_input) + response = parsed if isinstance(parsed, dict) else {'result': parsed} + except (json.JSONDecodeError, ValueError): + response = {'result': user_input} + + return types.Content( + role='user', + parts=[ + types.Part( + function_response=types.FunctionResponse( + id=fc_id, + name=fc_name, + response=response, + ) + ) + ], + ) + + async def run_interactively( root_agent_or_app: Union[LlmAgent, App], artifact_service: BaseArtifactService, @@ -98,12 +191,10 @@ async def run_interactively( session_service: BaseSessionService, credential_service: BaseCredentialService, memory_service: Optional[BaseMemoryService] = None, + timeout: Optional[str] = None, + jsonl: bool = False, ) -> None: - app = ( - root_agent_or_app - if isinstance(root_agent_or_app, App) - else App(name=session.app_name, root_agent=root_agent_or_app) - ) + app = _to_app(root_agent_or_app, session.app_name) runner = Runner( app=app, artifact_service=artifact_service, @@ -111,58 +202,90 @@ async def run_interactively( memory_service=memory_service, credential_service=credential_service, ) + + next_message = None + resume_invocation_id = None while True: - query = input('[user]: ') - if not query or not query.strip(): + if next_message is None: + query = input('[user]: ') + if not query or not query.strip(): + continue + if query == 'exit': + break + next_message = types.Content(role='user', parts=[types.Part(text=query)]) + + collected_events = [] + invocation_id = None + + async def run_and_print(): + nonlocal invocation_id + async with Aclosing( + runner.run_async( + user_id=session.user_id, + session_id=session.id, + new_message=next_message, + invocation_id=resume_invocation_id, + ) + ) as agen: + async for event in agen: + collected_events.append(event) + if getattr(event, 'invocation_id', None): + invocation_id = event.invocation_id + _print_event(event, jsonl=jsonl, session_id=session.id) + + try: + if timeout: + seconds = _parse_timeout(timeout) + await asyncio.wait_for(run_and_print(), timeout=seconds) + else: + await run_and_print() + except asyncio.TimeoutError: + click.secho( + f'Error: Command timed out after {timeout}', fg='red', err=True + ) + next_message = None + resume_invocation_id = None continue - if query == 'exit': - break - async with Aclosing( - runner.run_async( - user_id=session.user_id, - session_id=session.id, - new_message=types.Content( - role='user', parts=[types.Part(text=query)] - ), - ) - ) as agen: - async for event in agen: - if event.content and event.content.parts: - if text := ''.join(part.text or '' for part in event.content.parts): - click.echo(f'[{event.author}]: {text}') + + next_message = None + resume_invocation_id = None + + # Check for pending HITL function calls that need user input. + pending = _collect_pending_function_calls(collected_events) + if pending: + # Handle each pending function call. If there are multiple, + # collect all responses into a single Content with multiple parts. + parts = [] + for fc_id, fc_name, args in pending: + response_content = _prompt_for_function_call(fc_id, fc_name, args) + parts.extend(response_content.parts) + next_message = types.Content(role='user', parts=parts) + resume_invocation_id = invocation_id + await runner.close() -async def run_cli( +def _override_default_llm_model(default_llm_model: str): + """Overrides the default LLM model for LlmAgent.""" + logger.info('Overriding default model to %s', default_llm_model) + LlmAgent.set_default_model(default_llm_model) + + +def _setup_runner_context( *, agent_parent_dir: str, agent_folder_name: str, - input_file: Optional[str] = None, - saved_session_file: Optional[str] = None, - save_session: bool, - session_id: Optional[str] = None, + in_memory: bool = False, session_service_uri: Optional[str] = None, artifact_service_uri: Optional[str] = None, memory_service_uri: Optional[str] = None, use_local_storage: bool = True, -) -> None: - """Runs an interactive CLI for a certain agent. + default_llm_model: Optional[str] = None, +): + """Sets up the agent, services, and environment for running. - Args: - agent_parent_dir: str, the absolute path of the parent folder of the agent - folder. - agent_folder_name: str, the name of the agent folder. - input_file: Optional[str], the absolute path to the json file that contains - the initial session state and user queries, exclusive with - saved_session_file. - saved_session_file: Optional[str], the absolute path to the json file that - contains a previously saved session, exclusive with input_file. - save_session: bool, whether to save the session on exit. - session_id: Optional[str], the session ID to save the session to on exit. - session_service_uri: Optional[str], custom session service URI. - artifact_service_uri: Optional[str], custom artifact service URI. - memory_service_uri: Optional[str], custom memory service URI. - use_local_storage: bool, whether to use local .adk storage by default. + Returns a tuple containing the loaded agent/app, services, and other + contextual information needed for execution. """ agent_parent_path = Path(agent_parent_dir).resolve() agent_root = agent_parent_path / agent_folder_name @@ -172,6 +295,9 @@ async def run_cli( agents_dir = str(agent_parent_path) agent_loader = AgentLoader(agents_dir=agents_dir) agent_or_app = agent_loader.load_agent(agent_folder_name) + + if default_llm_model: + _override_default_llm_model(default_llm_model) session_app_name = ( agent_or_app.name if isinstance(agent_or_app, App) else agent_folder_name ) @@ -182,8 +308,11 @@ async def run_cli( if not is_env_enabled('ADK_DISABLE_LOAD_DOTENV'): envs.load_dotenv_for_agent(agent_folder_name, agents_dir) - # Create session and artifact services using factory functions. - # Sessions persist under //.adk/session.db when enabled. + if in_memory: + session_service_uri = 'memory://' + artifact_service_uri = 'memory://' + use_local_storage = False + session_service = create_session_service_from_options( base_dir=agent_parent_path, session_service_uri=session_service_uri, @@ -203,17 +332,124 @@ async def run_cli( credential_service = InMemoryCredentialService() - # Helper function for printing events - def _print_event(event) -> None: - content = event.content - if not content or not content.parts: - return - text_parts = [part.text for part in content.parts if part.text] - if not text_parts: - return - author = event.author or 'system' - click.echo(f'[{author}]: {"".join(text_parts)}') + return ( + agent_or_app, + session_service, + artifact_service, + memory_service, + credential_service, + user_id, + session_app_name, + agent_root, + ) + + +def _print_event( + event: Event, jsonl: bool = False, session_id: Optional[str] = None +): + """Prints an event to the console. + + Args: + event: The Event object to print. + jsonl: If True, outputs structured JSONL to stdout. Otherwise, outputs + human-readable text. + session_id: Optional session ID to inject into the JSONL output. + """ + if jsonl: + event_dict = event.model_dump(mode='json', by_alias=True, exclude_none=True) + if session_id: + event_dict['session_id'] = session_id + if event.node_info and event.node_info.path: + event_dict['node_path'] = event.node_info.path + + # Filter out empty dictionaries in 'actions' (e.g., empty state delta) to + # reduce noise + if 'actions' in event_dict and isinstance(event_dict['actions'], dict): + event_dict['actions'] = { + k: v for k, v in event_dict['actions'].items() if v != {} + } + if not event_dict['actions']: + del event_dict['actions'] + + # Optimize key order for human readability in JSONL viewers + ordered_dict = {} + for k in ['author', 'session_id', 'node_path', 'id']: + if k in event_dict: + ordered_dict[k] = event_dict[k] + for k, v in event_dict.items(): + if k not in ordered_dict: + ordered_dict[k] = v + click.echo(json.dumps(ordered_dict)) + else: + # Human readable mode + author = event.author or 'unknown' + text_parts = ( + [p.text for p in event.content.parts if p.text] if event.content else [] + ) + if text_parts: + text = ''.join(text_parts) + click.echo(f'[{author}]: {text}') + elif event.long_running_tool_ids: + click.secho(f'[{author}]: (Paused for input...)', fg='yellow') + +async def run_cli( + *, + agent_parent_dir: str, + agent_folder_name: str, + input_file: Optional[str] = None, + saved_session_file: Optional[str] = None, + save_session: bool, + session_id: Optional[str] = None, + state_str: Optional[str] = None, + timeout: Optional[str] = None, + in_memory: bool = False, + jsonl: bool = False, + session_service_uri: Optional[str] = None, + artifact_service_uri: Optional[str] = None, + memory_service_uri: Optional[str] = None, + use_local_storage: bool = True, + default_llm_model: Optional[str] = None, +) -> None: + """Runs an interactive CLI for a certain agent. + + Args: + agent_parent_dir: str, the absolute path of the parent folder of the agent + folder. + agent_folder_name: str, the name of the agent folder. + input_file: Optional[str], the absolute path to the json file that contains + the initial session state and user queries, exclusive with + saved_session_file. + saved_session_file: Optional[str], the absolute path to the json file that + contains a previously saved session, exclusive with input_file. + save_session: bool, whether to save the session on exit. + session_id: Optional[str], the session ID to save the session to on exit. + session_service_uri: Optional[str], custom session service URI. + artifact_service_uri: Optional[str], custom artifact service URI. + memory_service_uri: Optional[str], custom memory service URI. + use_local_storage: bool, whether to use local .adk storage by default. + """ + ( + agent_or_app, + session_service, + artifact_service, + memory_service, + credential_service, + user_id, + session_app_name, + agent_root, + ) = _setup_runner_context( + agent_parent_dir=agent_parent_dir, + agent_folder_name=agent_folder_name, + in_memory=in_memory, + session_service_uri=session_service_uri, + artifact_service_uri=artifact_service_uri, + memory_service_uri=memory_service_uri, + use_local_storage=use_local_storage, + default_llm_model=default_llm_model, + ) + + # Helper function for printing events if input_file: session = await run_input_file( app_name=session_app_name, @@ -241,7 +477,7 @@ def _print_event(event) -> None: if loaded_session: for event in loaded_session.events: await session_service.append_event(session, event) - _print_event(event) + _print_event(event, jsonl=jsonl, session_id=session.id) await run_interactively( agent_or_app, @@ -250,10 +486,19 @@ def _print_event(event) -> None: session_service, credential_service, memory_service=memory_service, + timeout=timeout, + jsonl=jsonl, ) else: + initial_state = None + if state_str: + try: + initial_state = json.loads(state_str) + except json.JSONDecodeError as e: + click.secho(f'Error: Invalid JSON for --state: {e}', fg='red', err=True) + return session = await session_service.create_session( - app_name=session_app_name, user_id=user_id + app_name=session_app_name, user_id=user_id, state=initial_state ) click.echo(f'Running agent {agent_or_app.name}, type exit to exit.') await run_interactively( @@ -263,6 +508,8 @@ def _print_event(event) -> None: session_service, credential_service, memory_service=memory_service, + timeout=timeout, + jsonl=jsonl, ) if save_session: @@ -281,3 +528,248 @@ def _print_event(event) -> None: ) print('Session saved to', session_path) + + +def _parse_timeout(timeout_str: str) -> float: + """Parses a timeout string like '30s', '5m' into seconds.""" + match = re.match(r'^(\d+)([sm])?$', timeout_str) + if not match: + raise ValueError(f'Invalid timeout format: {timeout_str}') + val, unit = match.groups() + seconds = float(val) + if unit == 'm': + seconds *= 60 + return seconds + + +async def run_once_cli( + *, + agent_parent_dir: str, + agent_folder_name: str, + query: Optional[str] = None, + state_str: Optional[str] = None, + session_id: Optional[str] = None, + replay: Optional[str] = None, + timeout: Optional[str] = None, + in_memory: bool = False, + jsonl: bool = False, + session_service_uri: Optional[str] = None, + artifact_service_uri: Optional[str] = None, + memory_service_uri: Optional[str] = None, + use_local_storage: bool = True, + default_llm_model: Optional[str] = None, +) -> int: + """Runs an agent in query/automated mode.""" + ( + agent_or_app, + session_service, + artifact_service, + memory_service, + credential_service, + user_id, + session_app_name, + agent_root, + ) = _setup_runner_context( + agent_parent_dir=agent_parent_dir, + agent_folder_name=agent_folder_name, + in_memory=in_memory, + session_service_uri=session_service_uri, + artifact_service_uri=artifact_service_uri, + memory_service_uri=memory_service_uri, + use_local_storage=use_local_storage, + default_llm_model=default_llm_model, + ) + + parsed_state = None + if state_str: + try: + parsed_state = json.loads(state_str) + except json.JSONDecodeError as e: + click.secho(f'Error: Invalid JSON for --state: {e}', fg='red', err=True) + return 1 + + if query and replay: + click.secho( + 'Error: Cannot provide both query and --replay.', fg='red', err=True + ) + return 1 + + if not query and not replay: + if not sys.stdin.isatty(): + query = sys.stdin.read().strip() + else: + click.secho( + 'Error: Missing query argument or stdin input.', fg='red', err=True + ) + return 1 + + app = _to_app(agent_or_app, session_app_name) + runner = Runner( + app=app, + artifact_service=artifact_service, + session_service=session_service, + memory_service=memory_service, + credential_service=credential_service, + ) + + if replay: + with open(replay, 'r', encoding='utf-8') as f: + input_file = InputFile.model_validate_json(f.read()) + session = await session_service.create_session( + app_name=session_app_name, + user_id=user_id, + state=input_file.state, + session_id=session_id, + ) + queries = input_file.queries + else: + if session_id: + session = await session_service.get_session( + app_name=session_app_name, user_id=user_id, session_id=session_id + ) + if not session: + session = await session_service.create_session( + app_name=session_app_name, + user_id=user_id, + state=parsed_state, + session_id=session_id, + ) + else: + session = await session_service.create_session( + app_name=session_app_name, user_id=user_id, state=parsed_state + ) + queries = [query] if query else [] + + # Output session ID once per run to stderr for humans + if not jsonl: + click.secho(f'Session ID: {session.id}', fg='yellow', err=True) + + exit_code = 0 + + async def execute_query(query: str): + nonlocal exit_code + + # Auto-resume magic: Check if the last event in the session indicates an + # active interrupt (Human-In-The-Loop suspension). If so, we automatically + # map the user's text query to the required function response instead of + # treating it as a new user message. + # Find the last event with active interrupts + interrupt_event = None + for e in reversed(session.events): + if e.long_running_tool_ids: + interrupt_event = e + break + + if interrupt_event: + # Assume the first active interrupt is the one we want to answer + interrupt_id = list(interrupt_event.long_running_tool_ids)[0] + if not jsonl: + click.secho( + f'Auto-resuming interrupt {interrupt_id} with input: {query}', + fg='cyan', + err=True, + ) + + # Construct a FunctionResponse pointing back to the interrupt ID. + # We check the synthetic function name to handle different interrupt types. + # TODO: We still need to handle 'adk_request_credential' (auth). + # TODO: Support batch HITL or interactive selection when multiple + # interrupts are active. + fc = next( + ( + c + for c in interrupt_event.get_function_calls() + if c.id == interrupt_id + ), + None, + ) + + if fc and fc.name == 'adk_request_confirmation': + # Try to parse as JSON to support passing custom payload or explicit confirmed flag. + try: + parsed = json.loads(query) + if isinstance(parsed, dict): + response = parsed + else: + response = {'confirmed': _is_positive_response(query)} + except (json.JSONDecodeError, ValueError): + response = {'confirmed': _is_positive_response(query)} + + content = types.Content( + role='user', + parts=[ + types.Part( + function_response=types.FunctionResponse( + id=interrupt_id, + name='adk_request_confirmation', + response=response, + ) + ) + ], + ) + else: + # Fallback to adk_request_input or default behavior + content = types.Content( + role='user', + parts=[ + types.Part( + function_response=types.FunctionResponse( + id=interrupt_id, + name='adk_request_input', + response={'result': query}, + ) + ) + ], + ) + else: + # Standard flow: Treat the query as a new text message from the user + content = types.Content(role='user', parts=[types.Part(text=query)]) + + async with Aclosing( + runner.run_async( + user_id=session.user_id, + session_id=session.id, + invocation_id=interrupt_event.invocation_id + if interrupt_event + else None, + new_message=content, + ) + ) as agen: + async for event in agen: + _print_event(event, jsonl=jsonl, session_id=session.id) + if event.long_running_tool_ids: + exit_code = 2 + + if exit_code == 2 and not jsonl: + click.secho( + '\n' + + '=' * 60 + + '\n' + '🚨 [PAUSED] Workflow is waiting for human input! 🚨\n\n' + 'To resume, run the command again with:\n' + f' --session_id {session.id}\n' + 'And provide your input as the query.\n' + + '=' * 60 + + '\n', + fg='yellow', + bold=True, + err=True, + ) + + try: + for q in queries: + if timeout: + seconds = _parse_timeout(timeout) + await asyncio.wait_for(execute_query(q), timeout=seconds) + else: + await execute_query(q) + except asyncio.TimeoutError: + click.secho(f'Error: Command timed out after {timeout}', fg='red', err=True) + return 1 + except Exception as e: + click.secho(f'Error: {e}', fg='red', err=True) + return 1 + finally: + await runner.close() + + return exit_code diff --git a/src/google/adk/cli/cli_deploy.py b/src/google/adk/cli/cli_deploy.py index 4350ae17ce..1e8ce5dfd1 100644 --- a/src/google/adk/cli/cli_deploy.py +++ b/src/google/adk/cli/cli_deploy.py @@ -29,6 +29,7 @@ import click from packaging.version import parse +from ..version import __version__ from .utils import _onboarding _IS_WINDOWS = os.name == 'nt' @@ -62,7 +63,8 @@ def _ensure_agent_engine_dependency(requirements_txt_path: str) -> None: with open(requirements_txt_path, 'a', encoding='utf-8') as f: if requirements and not requirements.endswith('\n'): f.write('\n') - f.write(_AGENT_ENGINE_REQUIREMENT + '\n') + f.write('google-cloud-aiplatform[agent_engines]\n') + f.write(f'google-adk=={__version__}\n') _DOCKERFILE_TEMPLATE: Final[str] = """ @@ -108,6 +110,7 @@ def _ensure_agent_engine_dependency(requirements_txt_path: str) -> None: import os import vertexai from vertexai.agent_engines import AdkApp +{extra_imports} if {is_config_agent}: from google.adk.agents import config_agent_utils @@ -125,7 +128,7 @@ def _ensure_agent_engine_dependency(requirements_txt_path: str) -> None: ) adk_app = AdkApp( - {adk_app_type}={adk_app_object}, + {app_instantiation}, enable_tracing={trace_to_cloud_option}, ) """ @@ -720,7 +723,7 @@ def to_cloud_run( gcp_region=region, app_name=app_name, port=port, - command='web' if with_ui else 'api_server', + command='api_server --with_ui' if with_ui else 'api_server', install_agent_deps=install_agent_deps, service_option=_get_service_option_by_adk_version( adk_version, @@ -1017,7 +1020,9 @@ def to_agent_engine( if not os.path.exists(requirements_txt_path): click.echo(f'Creating {requirements_txt_path}...') with open(requirements_txt_path, 'w', encoding='utf-8') as f: - f.write(_AGENT_ENGINE_REQUIREMENT + '\n') + f.write('google-cloud-aiplatform[agent_engines]\n') + f.write(f'google-adk=={__version__}\n') + click.echo(f'Using google-adk=={__version__} in requirements') click.echo(f'Created {requirements_txt_path}') _ensure_agent_engine_dependency(requirements_txt_path) agent_config['requirements_file'] = f'{temp_folder}/requirements.txt' @@ -1126,18 +1131,26 @@ def to_agent_engine( ' or "app".' ) return - with open(adk_app_file, 'w', encoding='utf-8') as f: - f.write( - _AGENT_ENGINE_APP_TEMPLATE.format( - app_name=app_name, - trace_to_cloud_option=trace_to_cloud, - is_config_agent=is_config_agent, - agent_folder=f'./{temp_folder}', - adk_app_object=adk_app_object, - adk_app_type=adk_app_type, - express_mode=api_key is not None, - ) + extra_imports = '' + app_instantiation = f'{adk_app_type}={adk_app_object}' + if adk_app_type == 'agent': + extra_imports = 'from google.adk.apps import App' + app_instantiation = ( + f"app=App(name='{app_name}', root_agent={adk_app_object})" ) + + template_content = _AGENT_ENGINE_APP_TEMPLATE.format( + app_name=app_name, + trace_to_cloud_option=trace_to_cloud, + is_config_agent=is_config_agent, + agent_folder=f'./{temp_folder}', + adk_app_object=adk_app_object, + app_instantiation=app_instantiation, + extra_imports=extra_imports, + express_mode=api_key is not None, + ) + with open(adk_app_file, 'w', encoding='utf-8') as f: + f.write(template_content) click.echo(f'Created {adk_app_file}') click.echo('Files and dependencies resolved') if absolutize_imports: @@ -1276,7 +1289,7 @@ def to_gke( gcp_region=region, app_name=app_name, port=port, - command='web' if with_ui else 'api_server', + command='api_server --with_ui' if with_ui else 'api_server', install_agent_deps=install_agent_deps, service_option=_get_service_option_by_adk_version( adk_version, diff --git a/src/google/adk/cli/cli_tools_click.py b/src/google/adk/cli/cli_tools_click.py index fda251da10..c6a71175a1 100644 --- a/src/google/adk/cli/cli_tools_click.py +++ b/src/google/adk/cli/cli_tools_click.py @@ -23,6 +23,7 @@ import logging import os from pathlib import Path +import sys import tempfile import textwrap from typing import Optional @@ -32,17 +33,13 @@ from fastapi import FastAPI import uvicorn -from . import cli_create -from . import cli_deploy from .. import version from ..agents.run_config import StreamingMode from ..evaluation.constants import MISSING_EVAL_DEPENDENCIES_MESSAGE from ..features import FeatureName from ..features import override_feature_enabled from .cli import run_cli -from .fast_api import get_fast_api_app from .utils import envs -from .utils import evals from .utils import logs LOG_LEVELS = click.Choice( @@ -489,6 +486,8 @@ def cli_create_cmd( adk create path/to/my_app """ + from . import cli_create + cli_create.run_cmd( app_name, model=model, @@ -647,50 +646,207 @@ def wrapper(*args, **kwargs): ), callback=validate_exclusive, ) +@click.option( + "--state", + type=str, + help="Optional. Initial state for the run as a JSON string.", +) +@click.option( + "--timeout", + type=str, + help="Optional. Timeout for a single turn or query (e.g., 30s, 5m).", +) +@click.option( + "--in_memory", + is_flag=True, + help="Optional. Do not persist session data (use in-memory storage).", +) +@click.option( + "--jsonl", + is_flag=True, + help="Optional. Output structured JSONL instead of human-readable text.", +) +@click.option( + "--default_llm_model", + type=str, + help=( + "Optional. Sets the default LLM model used when the agent does not set" + " a model explicitly." + ), + default=None, +) @click.argument( "agent", type=click.Path( exists=True, dir_okay=True, file_okay=False, resolve_path=True ), ) +@click.argument("query", type=str, required=False) def cli_run( agent: str, + query: Optional[str], save_session: bool, session_id: Optional[str], replay: Optional[str], resume: Optional[str], + state: Optional[str] = None, + timeout: Optional[str] = None, + in_memory: bool = False, + jsonl: bool = False, session_service_uri: Optional[str] = None, artifact_service_uri: Optional[str] = None, memory_service_uri: Optional[str] = None, use_local_storage: bool = True, + default_llm_model: Optional[str] = None, ): - """Runs an interactive CLI for a certain agent. + """Runs an agent. If no query is provided, enters interactive mode. AGENT: The path to the agent source code folder. + QUERY: Optional. The user message to send to the agent for a single-step run. Example: adk run path/to/my_agent + adk run path/to/my_agent "hello" """ logs.log_to_tmp_folder() agent_parent_folder = os.path.dirname(agent) agent_folder_name = os.path.basename(agent) - asyncio.run( - run_cli( - agent_parent_dir=agent_parent_folder, - agent_folder_name=agent_folder_name, - input_file=replay, - saved_session_file=resume, - save_session=save_session, - session_id=session_id, - session_service_uri=session_service_uri, - artifact_service_uri=artifact_service_uri, - memory_service_uri=memory_service_uri, - use_local_storage=use_local_storage, + # If query is provided, we run in single-step mode (JSONL output) + if query is not None: + from .cli import run_once_cli + + exit_code = asyncio.run( + run_once_cli( + agent_parent_dir=agent_parent_folder, + agent_folder_name=agent_folder_name, + query=query, + state_str=state, + session_id=session_id, + replay=replay, + timeout=timeout, + in_memory=in_memory, + jsonl=jsonl, + session_service_uri=session_service_uri, + artifact_service_uri=artifact_service_uri, + memory_service_uri=memory_service_uri, + use_local_storage=use_local_storage, + default_llm_model=default_llm_model, + ) + ) + sys.exit(exit_code) + else: + # Legacy interactive mode + asyncio.run( + run_cli( + agent_parent_dir=agent_parent_folder, + agent_folder_name=agent_folder_name, + input_file=replay, + saved_session_file=resume, + save_session=save_session, + session_id=session_id, + state_str=state, + timeout=timeout, + in_memory=in_memory, + jsonl=jsonl, + session_service_uri=session_service_uri, + artifact_service_uri=artifact_service_uri, + memory_service_uri=memory_service_uri, + use_local_storage=use_local_storage, + default_llm_model=default_llm_model, + ) + ) + + +@main.command( + "test", + cls=HelpfulCommand, + context_settings={ + "allow_extra_args": True, + "allow_interspersed_args": True, + "ignore_unknown_options": True, + }, +) +@click.argument( + "folder", + type=click.Path( + exists=True, dir_okay=True, file_okay=False, resolve_path=True + ), + default=".", +) +@click.option( + "--rebuild", + is_flag=True, + help="Rebuild test files by running the real agent with user messages.", +) +@click.pass_context +def cli_test(ctx, folder: str, rebuild: bool): + """Runs pytest on agent test JSON files under the specified folder. + + FOLDER: The path to the folder containing agents and tests. + Defaults to the current directory if not specified. + + Example: + adk test path/to/agents + """ + import sys + + if rebuild: + from .agent_test_runner import rebuild_tests + + click.echo(f"Rebuilding tests in {folder}...") + rebuild_tests(folder) + sys.exit(0) + + # Parse arguments to separate pytest args (after --) from regular args + pytest_args = [] + if "--" in ctx.args: + separator_index = ctx.args.index("--") + pytest_args = ctx.args[separator_index + 1 :] + regular_args = ctx.args[:separator_index] + + if regular_args: + click.secho( + "Error: Unexpected arguments after folder and before '--':" + f" {' '.join(regular_args)}. \nOnly arguments after '--' are passed" + " to pytest.", + fg="red", + err=True, ) - ) + ctx.exit(2) + else: + # If no '--', all remaining arguments are passed to pytest + pytest_args = ctx.args + + import subprocess + + os.environ["ADK_TEST_FOLDER"] = folder + + current_dir = Path(__file__).parent + test_runner_path = current_dir / "agent_test_runner.py" + + if not test_runner_path.exists(): + click.secho( + f"Error: Test runner not found at {test_runner_path}", + fg="red", + err=True, + ) + sys.exit(1) + + click.echo(f"Running tests in {folder} using runner {test_runner_path}...") + + result = subprocess.run([ + sys.executable, + "-m", + "pytest", + str(test_runner_path), + "-v", + "-s", + *pytest_args, + ]) + sys.exit(result.returncode) def eval_options(): @@ -841,6 +997,8 @@ def cli_eval( eval_set_results_manager = None if eval_storage_uri: + from .utils import evals + gcs_eval_managers = evals.create_gcs_eval_managers_from_uri( eval_storage_uri ) @@ -1556,11 +1714,34 @@ def wrapper(ctx, *args, **kwargs): return decorator +def _check_windows_reload(reload: bool) -> bool: + """Checks if reload is enabled on Windows and forces it to False if so.""" + if sys.platform == "win32" and reload: + click.secho( + "WARNING: The --reload flag is not supported on Windows because it" + " forces Uvicorn to use SelectorEventLoop, which does not support" + " subprocesses (needed for executing tools). Forcing --no-reload.", + fg="yellow", + err=True, + ) + return False + return reload + + @main.command("web") @feature_options() @fast_api_common_options() @web_options() @adk_services_options(default_use_local_storage=True) +@click.option( + "--default_llm_model", + type=str, + help=( + "Optional. Sets the default LLM model used when the agent does not set" + " a model explicitly." + ), + default=None, +) @click.argument( "agents_dir", type=click.Path( @@ -1570,6 +1751,7 @@ def wrapper(ctx, *args, **kwargs): ) def cli_web( agents_dir: str, + default_llm_model: Optional[str] = None, eval_storage_uri: Optional[str] = None, log_level: str = "INFO", allow_origins: Optional[list[str]] = None, @@ -1592,13 +1774,15 @@ def cli_web( ): """Starts a FastAPI server with Web UI for agents. - AGENTS_DIR: The directory of agents, where each subdirectory is a single - agent, containing at least `__init__.py` and `agent.py` files. + AGENTS_DIR: The directory of agents (where each subdirectory is a single + agent containing `agent.py` or `root_agent.yaml` files) or a path pointing + directly to a single agent folder. Example: adk web --session_service_uri=[uri] --port=[port] path/to/agents_dir """ + reload = _check_windows_reload(reload) logs.setup_adk_logger(getattr(logging, log_level.upper())) @asynccontextmanager @@ -1623,6 +1807,8 @@ async def _lifespan(app: FastAPI): fg="green", ) + from .fast_api import get_fast_api_app + app = get_fast_api_app( agents_dir=agents_dir, session_service_uri=session_service_uri, @@ -1644,6 +1830,7 @@ async def _lifespan(app: FastAPI): logo_text=logo_text, logo_image_url=logo_image_url, trigger_sources=trigger_sources, + default_llm_model=default_llm_model, ) config = uvicorn.Config( app, @@ -1677,6 +1864,12 @@ async def _lifespan(app: FastAPI): "Automatically create a session if it doesn't exist when calling /run." ), ) +@click.option( + "--with_ui", + is_flag=True, + default=False, + help="Serve ADK Web UI if set.", +) def cli_api_server( agents_dir: str, eval_storage_uri: Optional[str] = None, @@ -1697,18 +1890,23 @@ def cli_api_server( extra_plugins: Optional[list[str]] = None, auto_create_session: bool = False, trigger_sources: Optional[list[str]] = None, + with_ui: bool = False, ): """Starts a FastAPI server for agents. - AGENTS_DIR: The directory of agents, where each subdirectory is a single - agent, containing at least `__init__.py` and `agent.py` files. + AGENTS_DIR: The directory of agents (where each subdirectory is a single + agent containing `agent.py` or `root_agent.yaml` files) or a path pointing + directly to a single agent folder. Example: adk api_server --session_service_uri=[uri] --port=[port] path/to/agents_dir """ + reload = _check_windows_reload(reload) logs.setup_adk_logger(getattr(logging, log_level.upper())) + from .fast_api import get_fast_api_app + config = uvicorn.Config( get_fast_api_app( agents_dir=agents_dir, @@ -1718,7 +1916,7 @@ def cli_api_server( use_local_storage=use_local_storage, eval_storage_uri=eval_storage_uri, allow_origins=allow_origins, - web=False, + web=with_ui, trace_to_cloud=trace_to_cloud, otel_to_cloud=otel_to_cloud, a2a=a2a, @@ -1949,6 +2147,8 @@ def cli_deploy_cloud_run( ctx.exit(2) try: + from . import cli_deploy + cli_deploy.to_cloud_run( agent_folder=agent, project=project, @@ -2233,6 +2433,8 @@ def cli_deploy_agent_engine( "Do not pass both --validate-agent-import and" " --skip-agent-import-validation." ) + from . import cli_deploy + cli_deploy.to_agent_engine( agent_folder=agent, project=project, @@ -2417,6 +2619,8 @@ def cli_deploy_gke( """ try: _warn_if_with_ui(with_ui) + from . import cli_deploy + cli_deploy.to_gke( agent_folder=agent, project=project, diff --git a/src/google/adk/cli/dev_server.py b/src/google/adk/cli/dev_server.py new file mode 100644 index 0000000000..13e4cdf234 --- /dev/null +++ b/src/google/adk/cli/dev_server.py @@ -0,0 +1,1295 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Development server with all ADK endpoints. + +This module provides the DevServer class which extends ApiServer with development-only endpoints. +All production endpoints are inherited from ApiServer. +All dev-only endpoints (eval, debug, graph, test management) are added by DevServer. + +Use this for local development with `adk web`. +For production deployments, use api_server.py instead. +""" + +from __future__ import annotations + +import asyncio +import json +import logging +import os +from pathlib import Path +import shutil +import time +from typing import Any +from typing import Optional + +from fastapi import FastAPI +from fastapi import HTTPException +from fastapi import Response +from fastapi import UploadFile +from fastapi.responses import FileResponse +from fastapi.responses import PlainTextResponse +from fastapi.responses import StreamingResponse +from fastapi.staticfiles import StaticFiles +import graphviz +from pydantic import Field +from pydantic import ValidationError +from typing_extensions import deprecated +import yaml + +from . import agent_graph +from ..agents.base_agent import BaseAgent +from ..errors.not_found_error import NotFoundError +from ..evaluation.base_eval_service import InferenceConfig +from ..evaluation.base_eval_service import InferenceRequest +from ..evaluation.eval_case import EvalCase +from ..evaluation.eval_case import SessionInput +from ..evaluation.eval_metrics import EvalMetric +from ..evaluation.eval_metrics import EvalMetricResult +from ..evaluation.eval_metrics import EvalMetricResultPerInvocation +from ..evaluation.eval_metrics import EvalStatus +from ..evaluation.eval_metrics import MetricInfo +from ..evaluation.eval_result import EvalSetResult +from ..evaluation.eval_set import EvalSet +from ..events.event import Event +from .api_server import ApiServer +from .cli_eval import EVAL_SESSION_ID_PREFIX +from .utils import common +from .utils import evals +from .utils.graph_serialization import serialize_app_info +from .utils.graph_visualization import plot_workflow_graph +from .utils.state import create_empty_state + +logger = logging.getLogger("google_adk." + __name__) + +_EVAL_SET_FILE_EXTENSION = ".evalset.json" + +TAG_DEBUG = "Debug" +TAG_EVALUATION = "Evaluation" + + +class CreateTestRequest(common.BaseModel): + session_data: dict + + +class AddSessionToEvalSetRequest(common.BaseModel): + eval_id: str + session_id: str + user_id: str + + +class RunEvalRequest(common.BaseModel): + eval_ids: list[str] = Field( + deprecated=True, + default_factory=list, + description="This field is deprecated, use eval_case_ids instead.", + ) + eval_case_ids: list[str] = Field( + default_factory=list, + description=( + "List of eval case ids to evaluate. if empty, then all eval cases in" + " the eval set are run." + ), + ) + eval_metrics: list[EvalMetric] + + +class RunEvalResult(common.BaseModel): + eval_set_file: str + eval_set_id: str + eval_id: str + final_eval_status: EvalStatus + eval_metric_results: list[tuple[EvalMetric, EvalMetricResult]] = Field( + deprecated=True, + default=[], + description=( + "This field is deprecated, use overall_eval_metric_results instead." + ), + ) + overall_eval_metric_results: list[EvalMetricResult] + eval_metric_result_per_invocation: list[EvalMetricResultPerInvocation] + user_id: str + session_id: str + + +class RunEvalResponse(common.BaseModel): + run_eval_results: list[RunEvalResult] + + +class GetEventGraphResult(common.BaseModel): + dot_src: str + + +class CreateEvalSetRequest(common.BaseModel): + eval_set: EvalSet + + +class ListEvalSetsResponse(common.BaseModel): + eval_set_ids: list[str] + + +class EvalResult(EvalSetResult): + """This class has no field intentionally. + + The goal here is to just give a new name to the class to align with the API + endpoint. + """ + + +class ListEvalResultsResponse(common.BaseModel): + eval_result_ids: list[str] + + +class ListMetricsInfoResponse(common.BaseModel): + metrics_info: list[MetricInfo] + + +class DevServer(ApiServer): + """Development server that extends ApiServer with dev-only endpoints. + + Inherits all production endpoints from ApiServer and adds development-specific + endpoints for evaluation, debugging, and developer UI features. + """ + + def _register_dev_endpoints( + self, + app: FastAPI, + trace_dict: dict, + memory_exporter: Any, + web_assets_dir: Optional[str] = None, + ): + """Register all development-only endpoints. + + This includes debug, evaluation, and graph visualization endpoints. + These endpoints should NOT be exposed in production deployments. + """ + + # Import needed for eval endpoints + from ..evaluation.constants import MISSING_EVAL_DEPENDENCIES_MESSAGE + + # ========== BUILDER / YAML EDITOR ENDPOINTS ========== + agents_base_path = (Path.cwd() / self.agents_dir).resolve() + + def _get_app_root(app_name: str) -> Path: + if app_name in ("", ".", ".."): + raise ValueError(f"Invalid app name: {app_name!r}") + if Path(app_name).name != app_name or "\\" in app_name: + raise ValueError(f"Invalid app name: {app_name!r}") + app_root = (agents_base_path / app_name).resolve() + if not app_root.is_relative_to(agents_base_path): + raise ValueError(f"Invalid app name: {app_name!r}") + return app_root + + def _normalize_relative_path(path: str) -> str: + return path.replace("\\", "/").lstrip("/") + + def _has_parent_reference(path: str) -> bool: + return any(part == ".." for part in path.split("/")) + + _ALLOWED_EXTENSIONS = frozenset({".yaml", ".yml"}) + + # --- YAML content security --- + _BLOCKED_YAML_KEYS = frozenset({"args"}) + + def _check_yaml_for_blocked_keys(content: bytes, filename: str) -> None: + """Raise if the YAML document contains any blocked keys.""" + try: + docs = list(yaml.safe_load_all(content)) + except yaml.YAMLError as exc: + raise ValueError(f"Invalid YAML in {filename!r}: {exc}") from exc + + def _walk(node: Any) -> None: + if isinstance(node, dict): + for key, value in node.items(): + if key in _BLOCKED_YAML_KEYS: + raise ValueError( + f"Blocked key {key!r} found in {filename!r}. " + f"The '{key}' field is not allowed in builder uploads " + "because it can execute arbitrary code." + ) + _walk(value) + elif isinstance(node, list): + for item in node: + _walk(item) + + for doc in docs: + _walk(doc) + + def _parse_upload_filename(app_name: str, filename: Optional[str]) -> str: + if not filename: + raise ValueError("Upload filename is missing.") + filename = _normalize_relative_path(filename) + prefix = f"{app_name}/" + if filename.startswith(prefix): + rel_path = filename[len(prefix) :] + else: + rel_path = filename + if not rel_path: + raise ValueError(f"Invalid upload filename: {filename!r}") + if rel_path.startswith("/"): + raise ValueError(f"Absolute upload path rejected: {filename!r}") + if _has_parent_reference(rel_path): + raise ValueError(f"Path traversal rejected: {filename!r}") + ext = os.path.splitext(rel_path)[1].lower() + if ext not in _ALLOWED_EXTENSIONS: + raise ValueError( + f"File type not allowed: {rel_path!r}" + f" (allowed: {', '.join(sorted(_ALLOWED_EXTENSIONS))})" + ) + return rel_path + + def _parse_file_path(file_path: str) -> str: + file_path = _normalize_relative_path(file_path) + if not file_path: + raise ValueError("file_path is missing.") + if file_path.startswith("/"): + raise ValueError(f"Absolute file_path rejected: {file_path!r}") + if _has_parent_reference(file_path): + raise ValueError(f"Path traversal rejected: {file_path!r}") + ext = os.path.splitext(file_path)[1].lower() + if ext not in _ALLOWED_EXTENSIONS: + raise ValueError( + f"File type not allowed: {file_path!r}" + f" (allowed: {', '.join(sorted(_ALLOWED_EXTENSIONS))})" + ) + return file_path + + def _resolve_under_dir(root_dir: Path, rel_path: str) -> Path: + file_path = root_dir / rel_path + resolved_root_dir = root_dir.resolve() + resolved_file_path = file_path.resolve() + if not resolved_file_path.is_relative_to(resolved_root_dir): + raise ValueError(f"Path escapes root_dir: {rel_path!r}") + return file_path + + def _get_tmp_agent_root(app_root: Path, app_name: str) -> Path: + tmp_agent_root = app_root / "tmp" / app_name + resolved_tmp_agent_root = tmp_agent_root.resolve() + if not resolved_tmp_agent_root.is_relative_to(app_root): + raise ValueError(f"Invalid tmp path for app: {app_name!r}") + return tmp_agent_root + + def copy_dir_contents(source_dir: Path, dest_dir: Path) -> None: + dest_dir.mkdir(parents=True, exist_ok=True) + for source_path in source_dir.iterdir(): + if source_path.name == "tmp": + continue + + dest_path = dest_dir / source_path.name + if source_path.is_dir(): + if dest_path.exists() and dest_path.is_file(): + dest_path.unlink() + shutil.copytree(source_path, dest_path, dirs_exist_ok=True) + elif source_path.is_file(): + if dest_path.exists() and dest_path.is_dir(): + shutil.rmtree(dest_path) + shutil.copy2(source_path, dest_path) + + def cleanup_tmp(app_name: str) -> bool: + try: + app_root = _get_app_root(app_name) + except ValueError as exc: + logger.exception("Error in cleanup_tmp: %s", exc) + return False + + try: + tmp_agent_root = _get_tmp_agent_root(app_root, app_name) + except ValueError as exc: + logger.exception("Error in cleanup_tmp: %s", exc) + return False + + try: + shutil.rmtree(tmp_agent_root) + except FileNotFoundError: + pass + except OSError as exc: + logger.exception("Error deleting tmp agent root: %s", exc) + return False + + tmp_dir = app_root / "tmp" + resolved_tmp_dir = tmp_dir.resolve() + if not resolved_tmp_dir.is_relative_to(app_root): + logger.error( + "Refusing to delete tmp outside app_root: %s", resolved_tmp_dir + ) + return False + + try: + tmp_dir.rmdir() + except OSError: + pass + + return True + + def ensure_tmp_exists(app_name: str) -> bool: + try: + app_root = _get_app_root(app_name) + except ValueError as exc: + logger.exception("Error in ensure_tmp_exists: %s", exc) + return False + + if not app_root.is_dir(): + return False + + try: + tmp_agent_root = _get_tmp_agent_root(app_root, app_name) + except ValueError as exc: + logger.exception("Error in ensure_tmp_exists: %s", exc) + return False + + if tmp_agent_root.exists(): + return True + + try: + tmp_agent_root.mkdir(parents=True, exist_ok=True) + copy_dir_contents(app_root, tmp_agent_root) + except OSError as exc: + logger.exception("Error in ensure_tmp_exists: %s", exc) + return False + + return True + + @app.post( + "/dev/apps/{app_name}/builder/save", response_model_exclude_none=True + ) + async def builder_build( + app_name: str, files: list[UploadFile], tmp: Optional[bool] = False + ) -> bool: + try: + uploads: list[tuple[str, bytes]] = [] + for file in files: + rel_path = _parse_upload_filename(app_name, file.filename) + content = await file.read() + uploads.append((rel_path, content)) + + for rel_path, content in uploads: + _check_yaml_for_blocked_keys(content, f"{app_name}/{rel_path}") + + if tmp: + app_root = _get_app_root(app_name) + tmp_agent_root = _get_tmp_agent_root(app_root, app_name) + tmp_agent_root.mkdir(parents=True, exist_ok=True) + + for rel_path, content in uploads: + destination_path = _resolve_under_dir(tmp_agent_root, rel_path) + destination_path.parent.mkdir(parents=True, exist_ok=True) + destination_path.write_bytes(content) + + return True + + app_root = _get_app_root(app_name) + app_root.mkdir(parents=True, exist_ok=True) + + tmp_agent_root = _get_tmp_agent_root(app_root, app_name) + if tmp_agent_root.is_dir(): + copy_dir_contents(tmp_agent_root, app_root) + + for rel_path, content in uploads: + destination_path = _resolve_under_dir(app_root, rel_path) + destination_path.parent.mkdir(parents=True, exist_ok=True) + destination_path.write_bytes(content) + + return cleanup_tmp(app_name) + except ValueError as exc: + logger.exception("Error in builder_build: %s", exc) + raise HTTPException(status_code=400, detail=str(exc)) + except OSError as exc: + logger.exception("Error in builder_build: %s", exc) + return False + + @app.post( + "/dev/apps/{app_name}/builder/cancel", response_model_exclude_none=True + ) + async def builder_cancel(app_name: str) -> bool: + return cleanup_tmp(app_name) + + @app.get( + "/dev/apps/{app_name}/builder", + response_model_exclude_none=True, + response_class=PlainTextResponse, + ) + async def get_agent_builder( + app_name: str, + file_path: Optional[str] = None, + tmp: Optional[bool] = False, + ): + try: + app_root = _get_app_root(app_name) + except ValueError as exc: + logger.exception("Error in get_agent_builder: %s", exc) + return "" + + agent_dir = app_root + if tmp: + if not ensure_tmp_exists(app_name): + return "" + agent_dir = app_root / "tmp" / app_name + + if not file_path: + rel_path = "root_agent.yaml" + else: + try: + rel_path = _parse_file_path(file_path) + except ValueError as exc: + logger.exception("Error in get_agent_builder: %s", exc) + return "" + + try: + agent_file_path = _resolve_under_dir(agent_dir, rel_path) + except ValueError as exc: + logger.exception("Error in get_agent_builder: %s", exc) + return "" + + if not agent_file_path.is_file(): + return "" + + return FileResponse( + path=agent_file_path, + media_type="application/x-yaml", + filename=file_path or f"{app_name}.yaml", + headers={"Cache-Control": "no-store"}, + ) + + # ========== DEBUG & GRAPH ENDPOINTS ========== + + @app.get("/dev/apps/{app_name}/debug/trace/{event_id}", tags=[TAG_DEBUG]) + async def get_trace_dict(app_name: str, event_id: str) -> Any: + event_dict = trace_dict.get(event_id, None) + if event_dict is None: + raise HTTPException(status_code=404, detail="Trace not found") + return event_dict + + @app.get( + "/dev/apps/{app_name}/debug/trace/session/{session_id}", + tags=[TAG_DEBUG], + ) + async def get_session_trace(app_name: str, session_id: str) -> Any: + spans = memory_exporter.get_finished_spans(session_id) + if not spans: + return [] + return [ + { + "name": s.name, + "span_id": s.context.span_id, + "trace_id": s.context.trace_id, + "start_time": s.start_time, + "end_time": s.end_time, + "attributes": dict(s.attributes), + "parent_span_id": s.parent.span_id if s.parent else None, + } + for s in spans + ] + + if web_assets_dir: + # TODO: remove this endpoint once build_graph_image is completed + @app.get("/dev/apps/{app_name}/build_graph") + async def get_app_info(app_name: str) -> Any: + runner = await self.get_runner_async(app_name) + + if not runner.app: + raise HTTPException( + status_code=404, detail=f"App not found: {app_name}" + ) + + # Read README.md if it exists + readme_content = None + if self.agents_dir: + import os + + readme_path = os.path.join(self.agents_dir, app_name, "README.md") + if os.path.exists(readme_path): + try: + with open(readme_path, "r", encoding="utf-8") as f: + readme_content = f.read() + except Exception as e: + print(f"Error reading README.md: {e}") + + return serialize_app_info(runner.app, readme_content) + + @app.get("/dev/apps/{app_name}/build_graph_image") + async def get_app_info_image( + app_name: str, dark_mode: bool = False, node: Optional[str] = None + ) -> dict[str, GetEventGraphResult]: + runner = await self.get_runner_async(app_name) + + if not runner.app: + raise HTTPException( + status_code=404, detail=f"App not found: {app_name}" + ) + + app_info = serialize_app_info(runner.app) + + # Navigate to specific level if node is provided + if node: + target_agent = self._navigate_to_node(app_info, node) + if not target_agent: + raise HTTPException(status_code=404, detail=f"Node not found: {node}") + # Create a temporary app_info structure for the target level + app_info = {"root_agent": target_agent} + + workflows = self._get_all_sub_workflows(app_info, node if node else "") + + # This allows plotting non-workflow agents as a tree. + target_path = node if node else "" + if target_path not in workflows: + target_agent = app_info.get("root_agent") + if target_agent: + workflows[target_path] = target_agent + + results = {} + for path, info in workflows.items(): + dot_string = plot_workflow_graph( + {"root_agent": info}, format="dot", dark_mode=dark_mode + ) + if dot_string: + results[path] = GetEventGraphResult(dot_src=dot_string) + + return results + + # ========== AGENT TESTING ENDPOINTS ========== + + @app.get("/dev/apps/{app_name}/tests") + async def list_tests(app_name: str) -> list[str]: + """Lists all test JSON files for the given app.""" + agent_dir = os.path.join(self.agents_dir, app_name) + tests_dir = os.path.join(agent_dir, "tests") + if not os.path.exists(tests_dir): + return [] + + import glob + + pattern = os.path.join(tests_dir, "*.json") + test_files = glob.glob(pattern) + return sorted([os.path.basename(f) for f in test_files]) + + @app.post("/dev/apps/{app_name}/tests/rebuild") + async def rebuild_app_tests( + app_name: str, test_name: Optional[str] = None + ) -> dict[str, str]: + """Rebuilds tests for the app.""" + agent_dir = os.path.join(self.agents_dir, app_name) + + if test_name: + if not test_name.endswith(".json"): + test_name += ".json" + path = os.path.join(agent_dir, "tests", test_name) + else: + path = agent_dir + + from .agent_test_runner import rebuild_tests + + await asyncio.to_thread(rebuild_tests, path) + return {"status": "success"} + + @app.post("/dev/apps/{app_name}/tests/run") + async def run_app_tests( + app_name: str, test_name: Optional[str] = None + ) -> StreamingResponse: + """Runs tests and streams pytest output.""" + agent_dir = os.path.join(self.agents_dir, app_name) + + import subprocess + import sys + + queue = asyncio.Queue() + + async def run_pytest_subprocess(): + cmd_args = [ + sys.executable, + "-m", + "pytest", + os.path.join(os.path.dirname(__file__), "agent_test_runner.py"), + "-s", + "-vv", + ] + if test_name: + name_to_use = ( + test_name[:-5] if test_name.endswith(".json") else test_name + ) + cmd_args.extend(["-k", name_to_use]) + + # Ensure environment variable is set + env = os.environ.copy() + env["ADK_TEST_FOLDER"] = agent_dir + + try: + process = await asyncio.create_subprocess_exec( + *cmd_args, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + env=env, + ) + + while True: + line = await process.stdout.readline() + if not line: + break + await queue.put(line.decode("utf-8")) + + await process.wait() + finally: + # Signal completion to generator + await queue.put(None) + + # Start pytest in a background task + asyncio.create_task(run_pytest_subprocess()) + + async def generate(): + while True: + item = await queue.get() + if item is None: + break + yield item.encode("utf-8") + + return StreamingResponse(generate(), media_type="text/plain") + + @app.put("/dev/apps/{app_name}/tests/{test_name}") + async def create_test( + app_name: str, test_name: str, req: CreateTestRequest + ) -> dict[str, str]: + """Creates or updates a test file from session data.""" + # Sanitize test_name to prevent directory traversal + test_name = os.path.basename(test_name) + agent_dir = os.path.join(self.agents_dir, app_name) + tests_dir = os.path.join(agent_dir, "tests") + os.makedirs(tests_dir, exist_ok=True) + + if not test_name.endswith(".json"): + test_name += ".json" + + test_file_path = os.path.join(tests_dir, test_name) + + with open(test_file_path, "w") as f: + json.dump(req.session_data, f, indent=2, sort_keys=True) + + return {"status": "success", "file": test_name} + + @app.delete("/dev/apps/{app_name}/tests/{test_name}") + async def delete_test(app_name: str, test_name: str) -> dict[str, str]: + """Deletes a specific test file.""" + agent_dir = os.path.join(self.agents_dir, app_name) + tests_dir = os.path.join(agent_dir, "tests") + + if not test_name.endswith(".json"): + test_name += ".json" + + test_file_path = os.path.join(tests_dir, test_name) + + if not os.path.exists(test_file_path): + raise HTTPException(status_code=404, detail="Test file not found") + + os.remove(test_file_path) + return {"status": "success"} + + @app.get("/dev/apps/{app_name}/tests/{test_name}") + async def get_test_content(app_name: str, test_name: str) -> dict[str, Any]: + """Fetches the content of a specific test file.""" + agent_dir = os.path.join(self.agents_dir, app_name) + tests_dir = os.path.join(agent_dir, "tests") + + if not test_name.endswith(".json"): + test_name += ".json" + + test_file_path = os.path.join(tests_dir, test_name) + + if not os.path.exists(test_file_path): + raise HTTPException(status_code=404, detail="Test file not found") + + with open(test_file_path, "r") as f: + return json.load(f) + + # ========== EVALUATION ENDPOINTS ========== + + @app.post( + "/dev/apps/{app_name}/eval-sets", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def create_eval_set( + app_name: str, create_eval_set_request: CreateEvalSetRequest + ) -> EvalSet: + try: + return self.eval_sets_manager.create_eval_set( + app_name=app_name, + eval_set_id=create_eval_set_request.eval_set.eval_set_id, + ) + except ValueError as ve: + raise HTTPException( + status_code=400, + detail=str(ve), + ) from ve + + # TODO - remove after migration + @deprecated( + "Please use create_eval_set instead. This will be removed in future" + " releases." + ) + @app.post( + "/dev/apps/{app_name}/eval_sets/{eval_set_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def create_eval_set_legacy( + app_name: str, + eval_set_id: str, + ): + """Creates an eval set, given the id.""" + await create_eval_set( + app_name=app_name, + create_eval_set_request=CreateEvalSetRequest( + eval_set=UserEvalSet(eval_set_id=eval_set_id, eval_cases=[]), + ), + ) + + # TODO - remove after migration + @deprecated( + "Please use list_eval_sets instead. This will be removed in future" + " releases." + ) + @app.get( + "/dev/apps/{app_name}/eval_sets", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_eval_sets_legacy(app_name: str) -> list[str]: + list_eval_sets_response = await list_eval_sets(app_name) + return list_eval_sets_response.eval_set_ids + + # TODO - remove after migration + @deprecated( + "Please use run_eval instead. This will be removed in future releases." + ) + @app.post( + "/dev/apps/{app_name}/eval_sets/{eval_set_id}/run_eval", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def run_eval_legacy( + app_name: str, eval_set_id: str, req: RunEvalRequest + ) -> list[RunEvalResult]: + run_eval_response = await run_eval( + app_name=app_name, eval_set_id=eval_set_id, req=req + ) + return run_eval_response.run_eval_results + + # TODO - remove after migration + @deprecated( + "Please use get_eval_result instead. This will be removed in future" + " releases." + ) + @app.get( + "/dev/apps/{app_name}/eval_results/{eval_result_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def get_eval_result_legacy( + app_name: str, + eval_result_id: str, + ) -> EvalSetResult: + try: + return self.eval_set_results_manager.get_eval_set_result( + app_name, eval_result_id + ) + except ValueError as ve: + raise HTTPException(status_code=404, detail=str(ve)) from ve + except ValidationError as ve: + raise HTTPException(status_code=500, detail=str(ve)) from ve + + # TODO - remove after migration + @deprecated( + "Please use list_eval_results instead. This will be removed in future" + " releases." + ) + @app.get( + "/dev/apps/{app_name}/eval_results", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_eval_results_legacy(app_name: str) -> list[str]: + list_eval_results_response = await list_eval_results(app_name) + return list_eval_results_response.eval_result_ids + + @app.get( + "/dev/apps/{app_name}/eval-sets", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_eval_sets(app_name: str) -> ListEvalSetsResponse: + """Lists all eval sets for the given app.""" + eval_sets = [] + try: + eval_sets = self.eval_sets_manager.list_eval_sets(app_name) + except NotFoundError as e: + logger.warning(e) + + return ListEvalSetsResponse(eval_set_ids=eval_sets) + + @app.post( + "/dev/apps/{app_name}/eval-sets/{eval_set_id}/add-session", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + @app.post( + "/dev/apps/{app_name}/eval_sets/{eval_set_id}/add_session", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def add_session_to_eval_set( + app_name: str, eval_set_id: str, req: AddSessionToEvalSetRequest + ): + # Get the session + session = await self.session_service.get_session( + app_name=app_name, user_id=req.user_id, session_id=req.session_id + ) + assert session, "Session not found." + + # Convert the session data to eval invocations + invocations = evals.convert_session_to_eval_invocations(session) + + # Populate the session with initial session state. + agent_or_app = self.agent_loader.load_agent(app_name) + root_agent = self._get_root_agent(agent_or_app) + initial_session_state = create_empty_state(root_agent) + + new_eval_case = EvalCase( + eval_id=req.eval_id, + conversation=invocations, + session_input=SessionInput( + app_name=app_name, + user_id=req.user_id, + state=initial_session_state, + ), + creation_timestamp=time.time(), + ) + + try: + self.eval_sets_manager.add_eval_case( + app_name, eval_set_id, new_eval_case + ) + except ValueError as ve: + raise HTTPException(status_code=400, detail=str(ve)) from ve + + @app.get( + "/dev/apps/{app_name}/eval_sets/{eval_set_id}/evals", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_evals_in_eval_set( + app_name: str, + eval_set_id: str, + ) -> list[str]: + """Lists all evals in an eval set.""" + eval_set_data = self.eval_sets_manager.get_eval_set(app_name, eval_set_id) + + if not eval_set_data: + raise HTTPException( + status_code=400, detail=f"Eval set `{eval_set_id}` not found." + ) + + return sorted([x.eval_id for x in eval_set_data.eval_cases]) + + @app.get( + "/dev/apps/{app_name}/eval-sets/{eval_set_id}/eval-cases/{eval_case_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + @app.get( + "/dev/apps/{app_name}/eval_sets/{eval_set_id}/evals/{eval_case_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def get_eval( + app_name: str, eval_set_id: str, eval_case_id: str + ) -> EvalCase: + """Gets an eval case in an eval set.""" + eval_case_to_find = self.eval_sets_manager.get_eval_case( + app_name, eval_set_id, eval_case_id + ) + + if eval_case_to_find: + return eval_case_to_find + + raise HTTPException( + status_code=404, + detail=( + f"Eval set `{eval_set_id}` or Eval `{eval_case_id}` not found." + ), + ) + + @app.put( + "/dev/apps/{app_name}/eval-sets/{eval_set_id}/eval-cases/{eval_case_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + @app.put( + "/dev/apps/{app_name}/eval_sets/{eval_set_id}/evals/{eval_case_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def update_eval( + app_name: str, + eval_set_id: str, + eval_case_id: str, + updated_eval_case: EvalCase, + ): + if ( + updated_eval_case.eval_id + and updated_eval_case.eval_id != eval_case_id + ): + raise HTTPException( + status_code=400, + detail=( + "Eval id in EvalCase should match the eval id in the API route." + ), + ) + + # Overwrite the value. We are either overwriting the same value or an empty + # field. + updated_eval_case.eval_id = eval_case_id + try: + self.eval_sets_manager.update_eval_case( + app_name, eval_set_id, updated_eval_case + ) + except NotFoundError as nfe: + raise HTTPException(status_code=404, detail=str(nfe)) from nfe + + @app.delete( + "/dev/apps/{app_name}/eval-sets/{eval_set_id}/eval-cases/{eval_case_id}", + tags=[TAG_EVALUATION], + ) + @app.delete( + "/dev/apps/{app_name}/eval_sets/{eval_set_id}/evals/{eval_case_id}", + tags=[TAG_EVALUATION], + ) + async def delete_eval( + app_name: str, eval_set_id: str, eval_case_id: str + ) -> None: + try: + self.eval_sets_manager.delete_eval_case( + app_name, eval_set_id, eval_case_id + ) + except NotFoundError as nfe: + raise HTTPException(status_code=404, detail=str(nfe)) from nfe + + @app.post( + "/dev/apps/{app_name}/eval-sets/{eval_set_id}/run", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def run_eval( + app_name: str, eval_set_id: str, req: RunEvalRequest + ) -> RunEvalResponse: + """Runs an eval given the details in the eval request.""" + # Create a mapping from eval set file to all the evals that needed to be + # run. + try: + from ..evaluation.local_eval_service import LocalEvalService + from .cli_eval import _collect_eval_results + from .cli_eval import _collect_inferences + + eval_set = self.eval_sets_manager.get_eval_set(app_name, eval_set_id) + + if not eval_set: + raise HTTPException( + status_code=400, detail=f"Eval set `{eval_set_id}` not found." + ) + + agent_or_app = self.agent_loader.load_agent(app_name) + root_agent = self._get_root_agent(agent_or_app) + + eval_case_results = [] + + eval_service = LocalEvalService( + root_agent=root_agent, + eval_sets_manager=self.eval_sets_manager, + eval_set_results_manager=self.eval_set_results_manager, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + inference_request = InferenceRequest( + app_name=app_name, + eval_set_id=eval_set.eval_set_id, + eval_case_ids=req.eval_case_ids or req.eval_ids, + inference_config=InferenceConfig(), + ) + inference_results = await _collect_inferences( + inference_requests=[inference_request], eval_service=eval_service + ) + + eval_case_results = await _collect_eval_results( + inference_results=inference_results, + eval_service=eval_service, + eval_metrics=req.eval_metrics, + ) + except ModuleNotFoundError as e: + logger.exception("%s", e) + raise HTTPException( + status_code=400, detail=MISSING_EVAL_DEPENDENCIES_MESSAGE + ) from e + + run_eval_results = [] + for eval_case_result in eval_case_results: + run_eval_results.append( + RunEvalResult( + eval_set_file=eval_case_result.eval_set_file, + eval_set_id=eval_set_id, + eval_id=eval_case_result.eval_id, + final_eval_status=eval_case_result.final_eval_status, + overall_eval_metric_results=eval_case_result.overall_eval_metric_results, + eval_metric_result_per_invocation=eval_case_result.eval_metric_result_per_invocation, + user_id=eval_case_result.user_id, + session_id=eval_case_result.session_id, + ) + ) + + return RunEvalResponse(run_eval_results=run_eval_results) + + @app.get( + "/dev/apps/{app_name}/eval-results/{eval_result_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def get_eval_result( + app_name: str, + eval_result_id: str, + ) -> EvalResult: + """Gets the eval result for the given eval id.""" + try: + eval_set_result = self.eval_set_results_manager.get_eval_set_result( + app_name, eval_result_id + ) + return EvalResult(**eval_set_result.model_dump()) + except ValueError as ve: + raise HTTPException(status_code=404, detail=str(ve)) from ve + except ValidationError as ve: + raise HTTPException(status_code=500, detail=str(ve)) from ve + + @app.get( + "/dev/apps/{app_name}/eval-results", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_eval_results(app_name: str) -> ListEvalResultsResponse: + """Lists all eval results for the given app.""" + eval_result_ids = self.eval_set_results_manager.list_eval_set_results( + app_name + ) + return ListEvalResultsResponse(eval_result_ids=eval_result_ids) + + @app.get( + "/dev/apps/{app_name}/metrics-info", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_metrics_info(app_name: str) -> ListMetricsInfoResponse: + """Lists all eval metrics for the given app.""" + try: + from ..evaluation.metric_evaluator_registry import DEFAULT_METRIC_EVALUATOR_REGISTRY + + # Right now we ignore the app_name as eval metrics are not tied to the + # app_name, but they could be moving forward. + metrics_info = ( + DEFAULT_METRIC_EVALUATOR_REGISTRY.get_registered_metrics() + ) + return ListMetricsInfoResponse(metrics_info=metrics_info) + except ModuleNotFoundError as e: + logger.exception("%s\n%s", MISSING_EVAL_DEPENDENCIES_MESSAGE, e) + raise HTTPException( + status_code=400, detail=MISSING_EVAL_DEPENDENCIES_MESSAGE + ) from e + + # ========== GRAPH VISUALIZATION ENDPOINTS ========== + + @app.get( + "/dev/apps/{app_name}/graph", + response_model_exclude_none=True, + tags=[TAG_DEBUG], + ) + async def get_app_graph_dot( + app_name: str, dark_mode: bool = False + ) -> GetEventGraphResult | dict: + """Returns the base agent graph in DOT format without any highlights. + + This endpoint allows the frontend to fetch the graph structure once + and compute highlights client-side for better performance. + + Args: + app_name: The name of the agent/app + dark_mode: Whether to use dark theme background color + """ + agent_or_app = self.agent_loader.load_agent(app_name) + root_agent = self._get_root_agent(agent_or_app) + + # Get graph with NO highlights (empty list) and specified theme + dot_graph = await agent_graph.get_agent_graph( + root_agent, [], dark_mode=dark_mode + ) + + if dot_graph and isinstance(dot_graph, graphviz.Digraph): + return GetEventGraphResult(dot_src=dot_graph.source) + else: + return {} + + # TODO: This endpoint can be removed once we update adk web to stop consuming it + @app.get( + "/dev/apps/{app_name}/users/{user_id}/sessions/{session_id}/events/{event_id}/graph", + response_model_exclude_none=True, + tags=[TAG_DEBUG], + ) + async def get_event_graph( + app_name: str, user_id: str, session_id: str, event_id: str + ): + session = await self.session_service.get_session( + app_name=app_name, user_id=user_id, session_id=session_id + ) + session_events = session.events if session else [] + event = next((x for x in session_events if x.id == event_id), None) + if not event: + return {} + + function_calls = event.get_function_calls() + function_responses = event.get_function_responses() + agent_or_app = self.agent_loader.load_agent(app_name) + root_agent = self._get_root_agent(agent_or_app) + dot_graph = None + if function_calls: + function_call_highlights = [] + for function_call in function_calls: + from_name = event.author + to_name = function_call.name + function_call_highlights.append((from_name, to_name)) + dot_graph = await agent_graph.get_agent_graph( + root_agent, function_call_highlights + ) + elif function_responses: + function_responses_highlights = [] + for function_response in function_responses: + from_name = function_response.name + to_name = event.author + function_responses_highlights.append((from_name, to_name)) + dot_graph = await agent_graph.get_agent_graph( + root_agent, function_responses_highlights + ) + else: + from_name = event.author + to_name = "" + dot_graph = await agent_graph.get_agent_graph( + root_agent, [(from_name, to_name)] + ) + if dot_graph and isinstance(dot_graph, graphviz.Digraph): + return GetEventGraphResult(dot_src=dot_graph.source) + else: + return {} + + def _navigate_to_node(self, app_info: dict, node_path: str) -> dict | None: + """Navigate to a specific node in the agent hierarchy. + + Args: + app_info: The full app info structure + node_path: Path like "agent1/agent2/agent3" + + Returns: + The agent data at that path, or None if not found + """ + if not node_path: + return app_info.get("root_agent") + + # Strip leading/trailing slashes and split, filter out empty strings + path_parts = [p for p in node_path.strip("/").split("/") if p] + current = app_info.get("root_agent") + + if not current: + return None + + # Navigate through each level (skip first if it's the root name) + start_idx = 0 + if path_parts[0] == current.get("name"): + start_idx = 1 + + for part in path_parts[start_idx:]: + found = None + # Check potential containers in order of preference + containers = [] + if current.get("graph") and current["graph"].get("nodes"): + containers.append(current["graph"]["nodes"]) + if current.get("nodes"): + containers.append(current["nodes"]) + if current.get("sub_agents"): + containers.append(current["sub_agents"]) + + for container in containers: + for item in container: + if item.get("name") == part: + found = item + break + if found: + break + + if not found: + return None + current = found + + return current + + def _get_all_sub_workflows( + self, app_info: dict, current_path: str = "" + ) -> dict[str, dict]: + """Recursively discover all sub-workflows within the given app info. + + Args: + app_info: Current app_info snippet or agent dict + current_path: The accumulated string path (e.g., 'agent_a/workflow_b') + + Returns: + A dictionary mapping the node path to the corresponding agent info dict. + """ + workflows = {} + + agent_info = app_info.get("root_agent", app_info) + if agent_info.get("graph"): + workflows[current_path] = agent_info + + children = list(agent_info.get("sub_agents", [])) + children.extend(agent_info.get("nodes", [])) + graph = agent_info.get("graph") + if graph: + children.extend(graph.get("nodes", [])) + + for child in children: + child_name = child.get("name") + if not child_name: + continue + child_path = ( + f"{current_path}/{child_name}" if current_path else child_name + ) + workflows.update( + self._get_all_sub_workflows({"root_agent": child}, child_path) + ) + + return workflows + + def get_fast_api_app(self, **kwargs): + """Override to add dev endpoints after production endpoints. + + Calls parent's get_fast_api_app() to get the base app with production + endpoints, then registers dev-only endpoints. + """ + app = super().get_fast_api_app(**kwargs) + + web_assets_dir = kwargs.get("web_assets_dir", None) + self._register_dev_endpoints( + app, self._trace_dict, self._memory_exporter, web_assets_dir + ) + + return app diff --git a/src/google/adk/cli/fast_api.py b/src/google/adk/cli/fast_api.py index 89b40fe88e..ad01065f5f 100644 --- a/src/google/adk/cli/fast_api.py +++ b/src/google/adk/cli/fast_api.py @@ -20,14 +20,15 @@ import logging import os from pathlib import Path -import shutil import sys from typing import Any from typing import Literal from typing import Mapping +from typing import Optional import click from fastapi import FastAPI +from fastapi import File from fastapi import HTTPException from fastapi import UploadFile from fastapi.responses import FileResponse @@ -38,15 +39,13 @@ from watchdog.observers import Observer from ..auth.credential_service.in_memory_credential_service import InMemoryCredentialService -from ..evaluation.local_eval_set_results_manager import LocalEvalSetResultsManager -from ..evaluation.local_eval_sets_manager import LocalEvalSetsManager from ..runners import Runner -from .adk_web_server import AdkWebServer +from .api_server import ApiServer +from .dev_server import DevServer from .service_registry import load_services_module from .utils import envs -from .utils import evals from .utils.agent_change_handler import AgentChangeEventHandler -from .utils.agent_loader import AgentLoader +from .utils.agent_loader import is_single_agent_directory from .utils.base_agent_loader import BaseAgentLoader from .utils.service_factory import _create_task_store_from_options from .utils.service_factory import create_artifact_service_from_options @@ -73,6 +72,309 @@ def __getattr__(name: str): return attr +def _register_builder_endpoints(app: FastAPI, web: bool, agents_dir: str): + """Registers builder endpoints if web is enabled and multipart is installed.""" + if not web: + return + try: + import multipart + except ImportError: + logger.warning( + "python-multipart not installed. Builder UI endpoints will not be" + " available." + ) + return + + import shutil + + import yaml + + agents_base_path = (Path.cwd() / agents_dir).resolve() + + def _get_app_root(app_name: str) -> Path: + if app_name in ("", ".", ".."): + raise ValueError(f"Invalid app name: {app_name!r}") + if Path(app_name).name != app_name or "\\" in app_name: + raise ValueError(f"Invalid app name: {app_name!r}") + app_root = (agents_base_path / app_name).resolve() + if not app_root.is_relative_to(agents_base_path): + raise ValueError(f"Invalid app name: {app_name!r}") + return app_root + + def _normalize_relative_path(path: str) -> str: + return path.replace("\\", "/").lstrip("/") + + def _has_parent_reference(path: str) -> bool: + return any(part == ".." for part in path.split("/")) + + _ALLOWED_EXTENSIONS = frozenset({".yaml", ".yml"}) + + _BLOCKED_YAML_KEYS = frozenset({"args"}) + + def _check_yaml_for_blocked_keys(content: bytes, filename: str) -> None: + try: + docs = list(yaml.safe_load_all(content)) + except yaml.YAMLError as exc: + raise ValueError(f"Invalid YAML in {filename!r}: {exc}") from exc + + def _walk(node: Any) -> None: + if isinstance(node, dict): + for key, value in node.items(): + if key in _BLOCKED_YAML_KEYS: + raise ValueError( + f"Blocked key {key!r} found in {filename!r}. " + f"The '{key}' field is not allowed in builder uploads " + "because it can execute arbitrary code." + ) + _walk(value) + elif isinstance(node, list): + for item in node: + _walk(item) + + for doc in docs: + _walk(doc) + + def _parse_upload_filename(filename: Optional[str]) -> tuple[str, str]: + if not filename: + raise ValueError("Upload filename is missing.") + filename = _normalize_relative_path(filename) + if "/" not in filename: + raise ValueError(f"Invalid upload filename: {filename!r}") + app_name, rel_path = filename.split("/", 1) + if not app_name or not rel_path: + raise ValueError(f"Invalid upload filename: {filename!r}") + if rel_path.startswith("/"): + raise ValueError(f"Absolute upload path rejected: {filename!r}") + if _has_parent_reference(rel_path): + raise ValueError(f"Path traversal rejected: {filename!r}") + ext = os.path.splitext(rel_path)[1].lower() + if ext not in _ALLOWED_EXTENSIONS: + raise ValueError( + f"File type not allowed: {rel_path!r}" + f" (allowed: {', '.join(sorted(_ALLOWED_EXTENSIONS))})" + ) + return app_name, rel_path + + def _parse_file_path(file_path: str) -> str: + file_path = _normalize_relative_path(file_path) + if not file_path: + raise ValueError("file_path is missing.") + if file_path.startswith("/"): + raise ValueError(f"Absolute file_path rejected: {file_path!r}") + if _has_parent_reference(file_path): + raise ValueError(f"Path traversal rejected: {file_path!r}") + ext = os.path.splitext(file_path)[1].lower() + if ext not in _ALLOWED_EXTENSIONS: + raise ValueError( + f"File type not allowed: {file_path!r}" + f" (allowed: {', '.join(sorted(_ALLOWED_EXTENSIONS))})" + ) + return file_path + + def _resolve_under_dir(root_dir: Path, rel_path: str) -> Path: + file_path = root_dir / rel_path + resolved_root_dir = root_dir.resolve() + resolved_file_path = file_path.resolve() + if not resolved_file_path.is_relative_to(resolved_root_dir): + raise ValueError(f"Path escapes root_dir: {rel_path!r}") + return file_path + + def _get_tmp_agent_root(app_root: Path, app_name: str) -> Path: + tmp_agent_root = app_root / "tmp" / app_name + resolved_tmp_agent_root = tmp_agent_root.resolve() + if not resolved_tmp_agent_root.is_relative_to(app_root): + raise ValueError(f"Invalid tmp path for app: {app_name!r}") + return tmp_agent_root + + def copy_dir_contents(source_dir: Path, dest_dir: Path) -> None: + dest_dir.mkdir(parents=True, exist_ok=True) + for source_path in source_dir.iterdir(): + if source_path.name == "tmp": + continue + + dest_path = dest_dir / source_path.name + if source_path.is_dir(): + if dest_path.exists() and dest_path.is_file(): + dest_path.unlink() + shutil.copytree(source_path, dest_path, dirs_exist_ok=True) + elif source_path.is_file(): + if dest_path.exists() and dest_path.is_dir(): + shutil.rmtree(dest_path) + shutil.copy2(source_path, dest_path) + + def cleanup_tmp(app_name: str) -> bool: + try: + app_root = _get_app_root(app_name) + except ValueError as exc: + logger.exception("Error in cleanup_tmp: %s", exc) + return False + + try: + tmp_agent_root = _get_tmp_agent_root(app_root, app_name) + except ValueError as exc: + logger.exception("Error in cleanup_tmp: %s", exc) + return False + + try: + shutil.rmtree(tmp_agent_root) + except FileNotFoundError: + pass + except OSError as exc: + logger.exception("Error deleting tmp agent root: %s", exc) + return False + + tmp_dir = app_root / "tmp" + resolved_tmp_dir = tmp_dir.resolve() + if not resolved_tmp_dir.is_relative_to(app_root): + logger.error( + "Refusing to delete tmp outside app_root: %s", resolved_tmp_dir + ) + return False + + try: + tmp_dir.rmdir() + except OSError: + pass + + return True + + def ensure_tmp_exists(app_name: str) -> bool: + try: + app_root = _get_app_root(app_name) + except ValueError as exc: + logger.exception("Error in ensure_tmp_exists: %s", exc) + return False + + if not app_root.is_dir(): + return False + + try: + tmp_agent_root = _get_tmp_agent_root(app_root, app_name) + except ValueError as exc: + logger.exception("Error in ensure_tmp_exists: %s", exc) + return False + + if tmp_agent_root.exists(): + return True + + try: + tmp_agent_root.mkdir(parents=True, exist_ok=True) + copy_dir_contents(app_root, tmp_agent_root) + except OSError as exc: + logger.exception("Error in ensure_tmp_exists: %s", exc) + return False + + return True + + @app.post("/builder/save", response_model_exclude_none=True) + async def builder_build( + files: list[UploadFile] = File(...), tmp: Optional[bool] = False + ) -> bool: + try: + app_names: set[str] = set() + uploads: list[tuple[str, bytes]] = [] + for file in files: + app_name, rel_path = _parse_upload_filename(file.filename) + app_names.add(app_name) + content = await file.read() + uploads.append((rel_path, content)) + + if len(app_names) != 1: + logger.error( + "Exactly one app name is required, found: %s", + sorted(app_names), + ) + return False + + app_name = next(iter(app_names)) + + for rel_path, content in uploads: + _check_yaml_for_blocked_keys(content, f"{app_name}/{rel_path}") + + if tmp: + app_root = _get_app_root(app_name) + tmp_agent_root = _get_tmp_agent_root(app_root, app_name) + tmp_agent_root.mkdir(parents=True, exist_ok=True) + + for rel_path, content in uploads: + destination_path = _resolve_under_dir(tmp_agent_root, rel_path) + destination_path.parent.mkdir(parents=True, exist_ok=True) + destination_path.write_bytes(content) + + return True + + app_root = _get_app_root(app_name) + app_root.mkdir(parents=True, exist_ok=True) + + tmp_agent_root = _get_tmp_agent_root(app_root, app_name) + if tmp_agent_root.is_dir(): + copy_dir_contents(tmp_agent_root, app_root) + + for rel_path, content in uploads: + destination_path = _resolve_under_dir(app_root, rel_path) + destination_path.parent.mkdir(parents=True, exist_ok=True) + destination_path.write_bytes(content) + + return cleanup_tmp(app_name) + except ValueError as exc: + logger.exception("Error in builder_build: %s", exc) + raise HTTPException(status_code=400, detail=str(exc)) + except OSError as exc: + logger.exception("Error in builder_build: %s", exc) + return False + + @app.post("/builder/app/{app_name}/cancel", response_model_exclude_none=True) + async def builder_cancel(app_name: str) -> bool: + return cleanup_tmp(app_name) + + @app.get( + "/builder/app/{app_name}", + response_model_exclude_none=True, + response_class=PlainTextResponse, + ) + async def get_agent_builder( + app_name: str, + file_path: Optional[str] = None, + tmp: Optional[bool] = False, + ): + try: + app_root = _get_app_root(app_name) + except ValueError as exc: + logger.exception("Error in get_agent_builder: %s", exc) + return "" + + agent_dir = app_root + if tmp: + if not ensure_tmp_exists(app_name): + return "" + agent_dir = app_root / "tmp" / app_name + + if not file_path: + rel_path = "root_agent.yaml" + else: + try: + rel_path = _parse_file_path(file_path) + except ValueError as exc: + logger.exception("Error in get_agent_builder: %s", exc) + return "" + + try: + agent_file_path = _resolve_under_dir(agent_dir, rel_path) + except ValueError as exc: + logger.exception("Error in get_agent_builder: %s", exc) + return "" + + if not agent_file_path.is_file(): + return "" + + return FileResponse( + path=agent_file_path, + media_type="application/x-yaml", + filename=file_path or f"{app_name}.yaml", + headers={"Cache-Control": "no-store"}, + ) + + def get_fast_api_app( *, agents_dir: str, @@ -99,6 +401,7 @@ def get_fast_api_app( logo_image_url: str | None = None, auto_create_session: bool = False, trigger_sources: list[Literal["pubsub", "eventarc"]] | None = None, + default_llm_model: str | None = None, ) -> FastAPI: """Constructs and returns a FastAPI application for serving ADK agents. @@ -152,26 +455,38 @@ def get_fast_api_app( The configured FastAPI application instance. """ - # Enable denylist enforcement for config loads if web UI is enabled. - if web: - from ..agents import config_agent_utils + # Detect single agent mode + agents_path = Path(agents_dir).resolve() + is_single_agent = is_single_agent_directory(agents_path) - config_agent_utils._set_enforce_denylist(True) + original_agents_dir = agents_dir + single_agent_name = None + if is_single_agent: + single_agent_name = agents_path.name + agents_dir = str(agents_path.parent) # Set up eval managers. if eval_storage_uri: + from .utils import evals + gcs_eval_managers = evals.create_gcs_eval_managers_from_uri( eval_storage_uri ) eval_sets_manager = gcs_eval_managers.eval_sets_manager eval_set_results_manager = gcs_eval_managers.eval_set_results_manager else: - eval_sets_manager = LocalEvalSetsManager(agents_dir=agents_dir) - eval_set_results_manager = LocalEvalSetResultsManager(agents_dir=agents_dir) + this_module = sys.modules[__name__] + eval_sets_manager = this_module.LocalEvalSetsManager(agents_dir=agents_dir) + eval_set_results_manager = this_module.LocalEvalSetResultsManager( + agents_dir=agents_dir + ) # initialize Agent Loader if not passed as argument + this_module = sys.modules[__name__] if agent_loader is None: - agent_loader = AgentLoader(agents_dir) + agent_loader = this_module.AgentLoader(original_agents_dir) + elif is_single_agent and isinstance(agent_loader, this_module.AgentLoader): + agent_loader._set_single_agent_mode(single_agent_name, agents_dir) # Load services.py from agents_dir for custom service registration. load_services_module(agents_dir) @@ -207,7 +522,12 @@ def get_fast_api_app( # Build the Credential service credential_service = InMemoryCredentialService() - adk_web_server = AdkWebServer( + # Instantiate the appropriate server class based on web option + # If web=True, use DevServer (includes all endpoints: production + dev) + # If web=False, use ApiServer (production-safe endpoints only) + ServerClass = DevServer if web else ApiServer + + adk_web_server = ServerClass( agent_loader=agent_loader, session_service=session_service, artifact_service=artifact_service, @@ -222,8 +542,13 @@ def get_fast_api_app( url_prefix=url_prefix, auto_create_session=auto_create_session, trigger_sources=trigger_sources, + default_llm_model=default_llm_model, ) + # In single agent mode, use that agent as the default app. + if is_single_agent: + adk_web_server.default_app_name = single_agent_name + # Callbacks & other optional args for when constructing the FastAPI instance extra_fast_api_args = {} @@ -251,7 +576,7 @@ def register_processors(provider: TracerProvider) -> None: if reload_agents: - def setup_observer(observer: Observer, adk_web_server: AdkWebServer): + def setup_observer(observer: Observer, adk_web_server: ApiServer): agent_change_handler = AgentChangeEventHandler( agent_loader=agent_loader, runners_to_clean=adk_web_server.runners_to_clean, @@ -260,7 +585,7 @@ def setup_observer(observer: Observer, adk_web_server: AdkWebServer): observer.schedule(agent_change_handler, agents_dir, recursive=True) observer.start() - def tear_down_observer(observer: Observer, _: AdkWebServer): + def tear_down_observer(observer: Observer, _: ApiServer): observer.stop() observer.join() @@ -311,309 +636,7 @@ async def _a2a_lifespan(app_instance: FastAPI): ) # --- Builder endpoints (agent editor UI) --- - # Only register when the web UI is enabled. In headless / production - # deployments (e.g. `adk deploy cloud_run`) these endpoints are unnecessary - # and expose an attack surface that allows arbitrary file writes under the - # agents directory. - # See https://github.com/google/adk-python/issues/4947 - if web: - agents_base_path = (Path.cwd() / agents_dir).resolve() - - def _get_app_root(app_name: str) -> Path: - if app_name in ("", ".", ".."): - raise ValueError(f"Invalid app name: {app_name!r}") - if Path(app_name).name != app_name or "\\" in app_name: - raise ValueError(f"Invalid app name: {app_name!r}") - app_root = (agents_base_path / app_name).resolve() - if not app_root.is_relative_to(agents_base_path): - raise ValueError(f"Invalid app name: {app_name!r}") - return app_root - - def _normalize_relative_path(path: str) -> str: - return path.replace("\\", "/").lstrip("/") - - def _has_parent_reference(path: str) -> bool: - return any(part == ".." for part in path.split("/")) - - _ALLOWED_EXTENSIONS = frozenset({".yaml", ".yml"}) - - # --- YAML content security --- - # The `args` key in agent YAML configs (CodeConfig.args, ToolConfig.args) - # allows callers to pass arbitrary arguments to Python constructors and - # functions, which is an RCE vector when exposed through the builder UI. - # Block any upload that contains an `args` key anywhere in the document. - _BLOCKED_YAML_KEYS = frozenset({"args"}) - - def _check_yaml_for_blocked_keys(content: bytes, filename: str) -> None: - """Raise if the YAML document contains any blocked keys.""" - import yaml - - try: - docs = list(yaml.safe_load_all(content)) - except yaml.YAMLError as exc: - raise ValueError(f"Invalid YAML in {filename!r}: {exc}") from exc - - def _walk(node: Any) -> None: - if isinstance(node, dict): - for key, value in node.items(): - if key in _BLOCKED_YAML_KEYS: - raise ValueError( - f"Blocked key {key!r} found in {filename!r}. " - f"The '{key}' field is not allowed in builder uploads " - "because it can execute arbitrary code." - ) - _walk(value) - elif isinstance(node, list): - for item in node: - _walk(item) - - for doc in docs: - _walk(doc) - - def _parse_upload_filename(filename: str | None) -> tuple[str, str]: - if not filename: - raise ValueError("Upload filename is missing.") - filename = _normalize_relative_path(filename) - if "/" not in filename: - raise ValueError(f"Invalid upload filename: {filename!r}") - app_name, rel_path = filename.split("/", 1) - if not app_name or not rel_path: - raise ValueError(f"Invalid upload filename: {filename!r}") - if rel_path.startswith("/"): - raise ValueError(f"Absolute upload path rejected: {filename!r}") - if _has_parent_reference(rel_path): - raise ValueError(f"Path traversal rejected: {filename!r}") - ext = os.path.splitext(rel_path)[1].lower() - if ext not in _ALLOWED_EXTENSIONS: - raise ValueError( - f"File type not allowed: {rel_path!r}" - f" (allowed: {', '.join(sorted(_ALLOWED_EXTENSIONS))})" - ) - return app_name, rel_path - - def _parse_file_path(file_path: str) -> str: - file_path = _normalize_relative_path(file_path) - if not file_path: - raise ValueError("file_path is missing.") - if file_path.startswith("/"): - raise ValueError(f"Absolute file_path rejected: {file_path!r}") - if _has_parent_reference(file_path): - raise ValueError(f"Path traversal rejected: {file_path!r}") - ext = os.path.splitext(file_path)[1].lower() - if ext not in _ALLOWED_EXTENSIONS: - raise ValueError( - f"File type not allowed: {file_path!r}" - f" (allowed: {', '.join(sorted(_ALLOWED_EXTENSIONS))})" - ) - return file_path - - def _resolve_under_dir(root_dir: Path, rel_path: str) -> Path: - file_path = root_dir / rel_path - resolved_root_dir = root_dir.resolve() - resolved_file_path = file_path.resolve() - if not resolved_file_path.is_relative_to(resolved_root_dir): - raise ValueError(f"Path escapes root_dir: {rel_path!r}") - return file_path - - def _get_tmp_agent_root(app_root: Path, app_name: str) -> Path: - tmp_agent_root = app_root / "tmp" / app_name - resolved_tmp_agent_root = tmp_agent_root.resolve() - if not resolved_tmp_agent_root.is_relative_to(app_root): - raise ValueError(f"Invalid tmp path for app: {app_name!r}") - return tmp_agent_root - - def copy_dir_contents(source_dir: Path, dest_dir: Path) -> None: - dest_dir.mkdir(parents=True, exist_ok=True) - for source_path in source_dir.iterdir(): - if source_path.name == "tmp": - continue - - dest_path = dest_dir / source_path.name - if source_path.is_dir(): - if dest_path.exists() and dest_path.is_file(): - dest_path.unlink() - shutil.copytree(source_path, dest_path, dirs_exist_ok=True) - elif source_path.is_file(): - if dest_path.exists() and dest_path.is_dir(): - shutil.rmtree(dest_path) - shutil.copy2(source_path, dest_path) - - def cleanup_tmp(app_name: str) -> bool: - try: - app_root = _get_app_root(app_name) - except ValueError as exc: - logger.exception("Error in cleanup_tmp: %s", exc) - return False - - try: - tmp_agent_root = _get_tmp_agent_root(app_root, app_name) - except ValueError as exc: - logger.exception("Error in cleanup_tmp: %s", exc) - return False - - try: - shutil.rmtree(tmp_agent_root) - except FileNotFoundError: - pass - except OSError as exc: - logger.exception("Error deleting tmp agent root: %s", exc) - return False - - tmp_dir = app_root / "tmp" - resolved_tmp_dir = tmp_dir.resolve() - if not resolved_tmp_dir.is_relative_to(app_root): - logger.error( - "Refusing to delete tmp outside app_root: %s", resolved_tmp_dir - ) - return False - - try: - tmp_dir.rmdir() - except OSError: - pass - - return True - - def ensure_tmp_exists(app_name: str) -> bool: - try: - app_root = _get_app_root(app_name) - except ValueError as exc: - logger.exception("Error in ensure_tmp_exists: %s", exc) - return False - - if not app_root.is_dir(): - return False - - try: - tmp_agent_root = _get_tmp_agent_root(app_root, app_name) - except ValueError as exc: - logger.exception("Error in ensure_tmp_exists: %s", exc) - return False - - if tmp_agent_root.exists(): - return True - - try: - tmp_agent_root.mkdir(parents=True, exist_ok=True) - copy_dir_contents(app_root, tmp_agent_root) - except OSError as exc: - logger.exception("Error in ensure_tmp_exists: %s", exc) - return False - - return True - - @app.post("/builder/save", response_model_exclude_none=True) - async def builder_build( - files: list[UploadFile], tmp: bool | None = False - ) -> bool: - try: - # Phase 1: parse filenames and read content into memory. - app_names: set[str] = set() - uploads: list[tuple[str, bytes]] = [] - for file in files: - app_name, rel_path = _parse_upload_filename(file.filename) - app_names.add(app_name) - content = await file.read() - uploads.append((rel_path, content)) - - if len(app_names) != 1: - logger.error( - "Exactly one app name is required, found: %s", - sorted(app_names), - ) - return False - - app_name = next(iter(app_names)) - - # Phase 2: validate every file *before* writing anything to disk. - for rel_path, content in uploads: - _check_yaml_for_blocked_keys(content, f"{app_name}/{rel_path}") - - # Phase 3: write validated files to disk. - if tmp: - app_root = _get_app_root(app_name) - tmp_agent_root = _get_tmp_agent_root(app_root, app_name) - tmp_agent_root.mkdir(parents=True, exist_ok=True) - - for rel_path, content in uploads: - destination_path = _resolve_under_dir(tmp_agent_root, rel_path) - destination_path.parent.mkdir(parents=True, exist_ok=True) - destination_path.write_bytes(content) - - return True - - app_root = _get_app_root(app_name) - app_root.mkdir(parents=True, exist_ok=True) - - tmp_agent_root = _get_tmp_agent_root(app_root, app_name) - if tmp_agent_root.is_dir(): - copy_dir_contents(tmp_agent_root, app_root) - - for rel_path, content in uploads: - destination_path = _resolve_under_dir(app_root, rel_path) - destination_path.parent.mkdir(parents=True, exist_ok=True) - destination_path.write_bytes(content) - - return cleanup_tmp(app_name) - except ValueError as exc: - logger.exception("Error in builder_build: %s", exc) - raise HTTPException(status_code=400, detail=str(exc)) - except OSError as exc: - logger.exception("Error in builder_build: %s", exc) - return False - - @app.post( - "/builder/app/{app_name}/cancel", response_model_exclude_none=True - ) - async def builder_cancel(app_name: str) -> bool: - return cleanup_tmp(app_name) - - @app.get( - "/builder/app/{app_name}", - response_model_exclude_none=True, - response_class=PlainTextResponse, - ) - async def get_agent_builder( - app_name: str, - file_path: str | None = None, - tmp: bool | None = False, - ): - try: - app_root = _get_app_root(app_name) - except ValueError as exc: - logger.exception("Error in get_agent_builder: %s", exc) - return "" - - agent_dir = app_root - if tmp: - if not ensure_tmp_exists(app_name): - return "" - agent_dir = app_root / "tmp" / app_name - - if not file_path: - rel_path = "root_agent.yaml" - else: - try: - rel_path = _parse_file_path(file_path) - except ValueError as exc: - logger.exception("Error in get_agent_builder: %s", exc) - return "" - - try: - agent_file_path = _resolve_under_dir(agent_dir, rel_path) - except ValueError as exc: - logger.exception("Error in get_agent_builder: %s", exc) - return "" - - if not agent_file_path.is_file(): - return "" - - return FileResponse( - path=agent_file_path, - media_type="application/x-yaml", - filename=file_path or f"{app_name}.yaml", - headers={"Cache-Control": "no-store"}, - ) + _register_builder_endpoints(app, web, agents_dir) if a2a and a2a_task_store is not None: from a2a.server.apps import A2AStarletteApplication diff --git a/src/google/adk/cli/utils/_onboarding.py b/src/google/adk/cli/utils/_onboarding.py index 5447ec6aad..428828a27f 100644 --- a/src/google/adk/cli/utils/_onboarding.py +++ b/src/google/adk/cli/utils/_onboarding.py @@ -182,7 +182,12 @@ def handle_login_with_google() -> VertexAIAuth | ExpressModeAuth: ) # Check for existing full GCP projects - projects = gcp_utils.list_gcp_projects(limit=20) + try: + projects = gcp_utils.list_gcp_projects(limit=20) + except RuntimeError as e: + click.secho(str(e), fg="yellow") + projects = [] + if projects: click.secho("Recently created Google Cloud projects found:", fg="green") click.echo("0. Enter project ID manually") diff --git a/src/google/adk/cli/utils/agent_loader.py b/src/google/adk/cli/utils/agent_loader.py index a7bbcbc2a6..5a8c6d4c2c 100644 --- a/src/google/adk/cli/utils/agent_loader.py +++ b/src/google/adk/cli/utils/agent_loader.py @@ -39,6 +39,16 @@ logger = logging.getLogger("google_adk." + __name__) + +def is_single_agent_directory(path: Path | str) -> bool: + """Returns True if the directory contains a single agent configuration or file.""" + p = Path(path).resolve() + return ( + p.joinpath("agent.py").is_file() + or p.joinpath("root_agent.yaml").is_file() + ) + + # Special agents directory for agents with names starting with double underscore SPECIAL_AGENTS_DIR = os.path.join( os.path.dirname(__file__), "..", "built_in_agents" @@ -60,10 +70,36 @@ class AgentLoader(BaseAgentLoader): """ def __init__(self, agents_dir: str): - self.agents_dir = str(Path(agents_dir)) + agents_path = Path(agents_dir).resolve() + is_single_agent = is_single_agent_directory(agents_path) + if is_single_agent: + self._is_single_agent = True + self._single_agent_name = agents_path.name + self.agents_dir = str(agents_path.parent) + else: + self._is_single_agent = False + self._single_agent_name = None + self.agents_dir = str(agents_path) + self._original_sys_path = None self._agent_cache: dict[str, Union[BaseAgent, App]] = {} + @property + def is_single_agent(self) -> bool: + """Returns True if the loader is in single agent mode.""" + return self._is_single_agent + + @property + def single_agent_name(self) -> Optional[str]: + """Returns the name of the agent in single agent mode.""" + return self._single_agent_name + + def _set_single_agent_mode(self, name: str, agents_dir: str) -> None: + """Internal method to force single agent mode. Use with care.""" + self._is_single_agent = True + self._single_agent_name = name + self.agents_dir = agents_dir + def _load_from_module_or_package( self, agent_name: str ) -> Optional[Union[BaseAgent, App]]: @@ -82,7 +118,9 @@ def _load_from_module_or_package( # Check for "root_agent" directly in "{agent_name}" module/package elif hasattr(module_candidate, "root_agent"): logger.debug("Found root_agent directly in %s", agent_name) - if isinstance(module_candidate.root_agent, BaseAgent): + from ...workflow._base_node import BaseNode + + if isinstance(module_candidate.root_agent, (BaseAgent, BaseNode)): return module_candidate.root_agent else: logger.warning( @@ -129,7 +167,9 @@ def _load_from_submodule( return module_candidate.app elif hasattr(module_candidate, "root_agent"): logger.info("Found root_agent in %s.agent", agent_name) - if isinstance(module_candidate.root_agent, BaseAgent): + from ...workflow._base_node import BaseNode + + if isinstance(module_candidate.root_agent, (BaseAgent, BaseNode)): return module_candidate.root_agent else: logger.warning( @@ -200,6 +240,13 @@ def _validate_agent_name(self, agent_name: str) -> None: name_to_check = agent_name check_dir = self.agents_dir + if self._is_single_agent and not agent_name.startswith("__"): + if agent_name != self._single_agent_name: + raise ValueError( + f"Agent not found: {agent_name!r}. In single agent mode, only " + f"'{self._single_agent_name}' is accessible." + ) + if not self._VALID_AGENT_NAME_RE.match(name_to_check): raise ValueError( f"Invalid agent name: {agent_name!r}. Agent names must be valid" @@ -344,7 +391,8 @@ def _attach_metadata(target: Union[BaseAgent, App]) -> None: if isinstance(loaded, App): _attach_metadata(loaded) - _attach_metadata(loaded.root_agent) + if loaded.root_agent is not None: + _attach_metadata(loaded.root_agent) else: _attach_metadata(loaded) @@ -363,6 +411,8 @@ def load_agent(self, agent_name: str) -> Union[BaseAgent, App]: @override def list_agents(self) -> list[str]: """Lists all agents available in the agent loader (sorted alphabetically).""" + if self._is_single_agent: + return [self._single_agent_name] base_path = Path.cwd() / self.agents_dir agent_names = [ x diff --git a/src/google/adk/cli/utils/evals.py b/src/google/adk/cli/utils/evals.py index ff3c148637..16cf82ee77 100644 --- a/src/google/adk/cli/utils/evals.py +++ b/src/google/adk/cli/utils/evals.py @@ -15,6 +15,8 @@ from __future__ import annotations import os +from typing import Any +from typing import TYPE_CHECKING from pydantic import alias_generators from pydantic import BaseModel @@ -22,10 +24,12 @@ from ...evaluation.eval_case import Invocation from ...evaluation.evaluation_generator import EvaluationGenerator -from ...evaluation.gcs_eval_set_results_manager import GcsEvalSetResultsManager -from ...evaluation.gcs_eval_sets_manager import GcsEvalSetsManager from ...sessions.session import Session +if TYPE_CHECKING: + from ...evaluation.gcs_eval_set_results_manager import GcsEvalSetResultsManager + from ...evaluation.gcs_eval_sets_manager import GcsEvalSetsManager + class GcsEvalManagers(BaseModel): model_config = ConfigDict( @@ -34,9 +38,9 @@ class GcsEvalManagers(BaseModel): arbitrary_types_allowed=True, ) - eval_sets_manager: GcsEvalSetsManager + eval_sets_manager: 'GcsEvalSetsManager' - eval_set_results_manager: GcsEvalSetResultsManager + eval_set_results_manager: 'GcsEvalSetResultsManager' def convert_session_to_eval_invocations(session: Session) -> list[Invocation]: @@ -66,8 +70,19 @@ def create_gcs_eval_managers_from_uri( Raises: ValueError: If the eval_storage_uri is not supported. + RuntimeError: If GCP optional dependencies are missing. """ if eval_storage_uri.startswith('gs://'): + try: + from ...evaluation.gcs_eval_set_results_manager import GcsEvalSetResultsManager + from ...evaluation.gcs_eval_sets_manager import GcsEvalSetsManager + except ImportError as e: + raise RuntimeError( + 'GCS evaluation managers require Google Cloud optional' + ' dependencies.\nPlease install them using: pip install' + ' google-adk[gcp]\nOr: pip install google-cloud-storage>=2.18' + ) from e + gcs_bucket = eval_storage_uri.split('://')[1] eval_sets_manager = GcsEvalSetsManager( bucket_name=gcs_bucket, project=os.environ['GOOGLE_CLOUD_PROJECT'] diff --git a/src/google/adk/cli/utils/gcp_utils.py b/src/google/adk/cli/utils/gcp_utils.py index a5a8ebb6de..59aaaedfba 100644 --- a/src/google/adk/cli/utils/gcp_utils.py +++ b/src/google/adk/cli/utils/gcp_utils.py @@ -27,7 +27,6 @@ import google.auth.exceptions from google.auth.transport.requests import AuthorizedSession from google.auth.transport.requests import Request -from google.cloud import resourcemanager_v3 import requests _VERTEX_AI_ENDPOINT = "https://{location}-aiplatform.googleapis.com/v1beta1" @@ -161,6 +160,14 @@ def list_gcp_projects(limit: int = 20) -> List[Tuple[str, str]]: Returns: A list of (project_id, name) tuples. """ + try: + from google.cloud import resourcemanager_v3 + except ImportError as e: + raise RuntimeError( + "Listing GCP projects requires the 'gcp' optional dependency. " + "Please install 'google-adk[gcp]' or 'google-cloud-resource-manager'." + ) from e + try: client = resourcemanager_v3.ProjectsClient() search_results = client.search_projects() diff --git a/src/google/adk/cli/utils/graph_serialization.py b/src/google/adk/cli/utils/graph_serialization.py new file mode 100644 index 0000000000..d400c395dd --- /dev/null +++ b/src/google/adk/cli/utils/graph_serialization.py @@ -0,0 +1,291 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +"""Utility functions for serializing agent graphs for the web UI.""" + +import logging +from typing import Any + +logger = logging.getLogger("google_adk." + __name__) + +from ...agents.base_agent import BaseAgent +from ...tools.base_toolset import BaseToolset + +# Node type mapping for cleaner lookup +NODE_TYPE_MAP = { + "FunctionNode": "function", + "ToolNode": "tool", + "JoinNode": "join", +} + +# Fields to skip during agent serialization +SKIP_FIELDS = { + "parent_agent", + "before_agent_callback", + "after_agent_callback", + "before_model_callback", + "after_model_callback", + "on_model_error_callback", + "before_tool_callback", + "after_tool_callback", + "on_tool_error_callback", +} + + +def _get_node_field(node: Any, field_name: str) -> Any: + """Safely get a node field using object.__getattribute__.""" + return object.__getattribute__(node, field_name) + + +def serialize_node_like(item: Any) -> Any: + """Serialize a NodeLike object (str, BaseAgent, BaseTool, Callable, BaseNode).""" + if item == "START": + return "START" + # Handle primitives + if isinstance(item, (str, int, float, bool)): + return item + # Handle BaseAgent + class_name = type(item).__name__ + if "Agent" in class_name and hasattr(item, "model_fields"): + return serialize_agent(item) + # Handle BaseNode + if "Node" in class_name and hasattr(item, "get_name"): + return serialize_node(item) + # Handle callable + if callable(item): + return {"name": getattr(item, "__name__", str(item)), "type": "function"} + return str(item) + + +def serialize_node(node: Any) -> dict[str, Any]: + """Serialize a node (BaseNode subclasses like FunctionNode, AgentNode, etc.).""" + class_name = type(node).__name__ + node_name = _get_node_field(node, "name") + + # Handle START node + if node_name == "__START__": + return { + "name": "__START__", + "type": "start", + "rerun_on_resume": _get_node_field(node, "rerun_on_resume"), + } + + if hasattr(node, "model_fields"): + result = serialize_agent(node) + if "type" not in result: + if getattr(node, "graph", None) is not None: + result["type"] = "workflow" + else: + result["type"] = NODE_TYPE_MAP.get( + class_name, "agent" if "Agent" in class_name else "node" + ) + return result + + # Get node type from mapping or default to 'node' + node_type = NODE_TYPE_MAP.get(class_name, "node") + + return { + "name": node_name, + "type": node_type, + "rerun_on_resume": _get_node_field(node, "rerun_on_resume"), + } + + +def serialize_agent(agent: BaseAgent) -> dict[str, Any]: + """Recursively serialize an agent, excluding non-serializable fields.""" + agent_dict = {} + + for field_name, field_info in agent.__class__.model_fields.items(): + if field_name in SKIP_FIELDS: + continue + + value = getattr(agent, field_name, None) + + if value is None: + continue + + # Handle sub_agents recursively + if field_name == "sub_agents": + agent_dict[field_name] = [ + serialize_agent(sub_agent) for sub_agent in value + ] + # Handle nodes field (for _Mesh/LlmAgent) + elif field_name == "nodes": + try: + serialized_nodes = [] + for node in value: + if hasattr(node, "model_fields"): + serialized_nodes.append(serialize_agent(node)) + else: + serialized_nodes.append(serialize_node(node)) + agent_dict[field_name] = serialized_nodes + except Exception as e: + logger.warning("Error serializing nodes field: %s", e) + # Handle graph field (Graph with nodes and edges) + elif field_name == "graph": + try: + graph_dict = {} + # Serialize nodes + if hasattr(value, "nodes") and value.nodes: + graph_dict["nodes"] = [serialize_node(node) for node in value.nodes] + # Serialize edges + if hasattr(value, "edges") and value.edges: + serialized_edges = [] + for edge in value.edges: + edge_dict = {} + if hasattr(edge, "from_node"): + edge_dict["from_node"] = serialize_node(edge.from_node) + if hasattr(edge, "to_node"): + edge_dict["to_node"] = serialize_node(edge.to_node) + if hasattr(edge, "route") and edge.route is not None: + edge_dict["route"] = edge.route + serialized_edges.append(edge_dict) + graph_dict["edges"] = serialized_edges + agent_dict[field_name] = graph_dict + except Exception: + pass + # Handle edges field (list of EdgeItems) + elif field_name == "edges": + try: + serialized_edges = [] + for edge_item in value: + if isinstance(edge_item, tuple): + serialized = [] + for elem in edge_item: + if isinstance(elem, dict): + serialized.append( + {str(k): serialize_node_like(v) for k, v in elem.items()} + ) + else: + serialized.append(serialize_node_like(elem)) + serialized_edges.append(serialized) + elif hasattr(edge_item, "from_node") and hasattr( + edge_item, "to_node" + ): + edge_dict = { + "from_node": serialize_node(edge_item.from_node), + "to_node": serialize_node(edge_item.to_node), + } + if hasattr(edge_item, "route") and edge_item.route is not None: + edge_dict["route"] = edge_item.route + serialized_edges.append(edge_dict) + else: + serialized_edges.append(str(edge_item)) + agent_dict[field_name] = serialized_edges + except Exception: + pass + # Handle tools field + elif field_name == "tools": + try: + sub_agents = getattr(agent, "sub_agents", []) or [] + sub_agent_names = { + getattr(sa, "name", None) + for sa in sub_agents + if getattr(sa, "name", None) + } + + serialized_tools = [] + for tool in value: + tool_name = None + if callable(tool): + tool_name = getattr(tool, "__name__", str(tool)) + elif hasattr(tool, "name"): + tool_name = tool.name + elif isinstance(tool, BaseToolset): + tool_name = type(tool).__name__ + + if tool_name and tool_name in sub_agent_names: + continue + + if tool_name is not None: + serialized_tools.append({ + "name": tool_name, + "type": "tool", + }) + else: + serialized_tools.append(str(tool)) + agent_dict[field_name] = serialized_tools + except Exception: + pass + else: + try: + if callable(value): + continue + # Handle nested agents + if isinstance(value, BaseAgent): + agent_dict[field_name] = serialize_agent(value) + # Handle simple types and collections + elif isinstance(value, (str, int, float, bool, list, dict)): + agent_dict[field_name] = value + elif hasattr(value, "model_dump"): + agent_dict[field_name] = value.model_dump( + mode="python", exclude_none=True + ) + else: + agent_dict[field_name] = str(value) + except Exception as e: + logger.warning( + "Error serializing field '%s' of agent %s: %s", + field_name, + type(agent).__name__, + e, + ) + + return agent_dict + + +def serialize_app_info(app: Any, readme: str | None = None) -> dict[str, Any]: + """Serialize app information for the build_graph endpoint.""" + root = app.root_agent + try: + root_agent_data = serialize_agent(root) + except Exception as e: + logger.error("Error serializing root agent/node: %s", e, exc_info=True) + raise + + app_info = { + "name": app.name, + "root_agent": root_agent_data, + } + + # Add optional fields if present + if app.plugins: + app_info["plugins"] = [ + {"name": getattr(plugin, "name", type(plugin).__name__)} + for plugin in app.plugins + ] + + if app.context_cache_config: + try: + app_info["context_cache_config"] = app.context_cache_config.model_dump( + mode="python", exclude_none=True + ) + except Exception: + pass + + if app.resumability_config: + try: + app_info["resumability_config"] = app.resumability_config.model_dump( + mode="python", exclude_none=True + ) + except Exception: + pass + + # Include README content if provided + if readme: + app_info["readme"] = readme + + return app_info diff --git a/src/google/adk/cli/utils/graph_visualization.py b/src/google/adk/cli/utils/graph_visualization.py new file mode 100644 index 0000000000..e3317e97ce --- /dev/null +++ b/src/google/adk/cli/utils/graph_visualization.py @@ -0,0 +1,346 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utility functions for visualizing agent graphs.""" + +from __future__ import annotations + +import html +from typing import Any + +import graphviz + +from ...workflow._node_status import NodeStatus + + +def plot_workflow_graph( + app_info: dict[str, Any], + agent_state: dict[str, Any] | None = None, + format: str = "svg", + dark_mode: bool = True, +) -> str | bytes: + """Plots the workflow graph with node statuses.""" + agent_state = agent_state or {} + root_agent = app_info.get("root_agent", {}) + graph = root_agent.get("graph", {}) + is_workflow = bool(graph) + + if not graph: + root_name = root_agent.get("name", "root_agent") + sub_agents = root_agent.get("sub_agents", []) + tools = root_agent.get("tools", []) + + nodes = [{"name": root_name, "type": "agent", "tools": tools}] + edges = [] + + def _traverse_sub_agents(agent_dict, parent_name): + for sub in agent_dict.get("sub_agents", []): + sub_name = sub.get("name") + if sub_name: + nodes.append( + {"name": sub_name, "type": "agent", "tools": sub.get("tools", [])} + ) + edges.append({ + "from_node": {"name": parent_name}, + "to_node": {"name": sub_name}, + }) + _traverse_sub_agents(sub, sub_name) + + _traverse_sub_agents(root_agent, root_name) + graph = {"nodes": nodes, "edges": edges} + + nodes_state = agent_state.get("nodes", {}) + dot = graphviz.Digraph(comment="Workflow Visualization") + + if dark_mode: + graph_bgcolor = "#0F172A" + node_fillcolor = "#1E293B" + node_color = "#475569" + node_fontcolor = "#F8FAFC" + edge_color = "#94A3B8" + edge_fontcolor = "#CBD5E1" + start_fillcolor = "#059669" + start_color = "#047857" + end_fillcolor = "#DC2626" + end_color = "#B91C1C" + status_colors = { + NodeStatus.COMPLETED: "#16A34A", + NodeStatus.RUNNING: "#D97706", + NodeStatus.FAILED: "#EF4444", + NodeStatus.INACTIVE: "#1E293B", + NodeStatus.WAITING: "#9333EA", + NodeStatus.CANCELLED: "#475569", + } + else: + graph_bgcolor = "#F8FAFC" + node_fillcolor = "#FFFFFF" + node_color = "#94A3B8" + node_fontcolor = "#0F172A" + edge_color = "#64748B" + edge_fontcolor = "#475569" + start_fillcolor = "#10B981" + start_color = "#059669" + end_fillcolor = "#EF4444" + end_color = "#DC2626" + status_colors = { + NodeStatus.COMPLETED: "#69CB87", + NodeStatus.RUNNING: "#e8b589", + NodeStatus.FAILED: "salmon", + NodeStatus.INACTIVE: "#FFFFFF", + NodeStatus.WAITING: "#d2a6e0", + NodeStatus.CANCELLED: "lightgray", + } + + dot.attr( + "graph", + bgcolor=graph_bgcolor, + pad="0.5", + nodesep="0.5", + ranksep="0.8", + fontname="Helvetica", + splines="spline", + ) + + dot.attr( + "node", + shape="rect", + style="rounded,filled", + fillcolor=node_fillcolor, + color=node_color, + penwidth="1.5", + fontname="Helvetica", + fontcolor=node_fontcolor, + fontsize="12", + margin="0.25,0.15", + ) + + dot.attr( + "edge", + color=edge_color, + penwidth="1.2", + fontname="Helvetica", + fontcolor=edge_fontcolor, + fontsize="10", + arrowhead="vee", + arrowsize="0.7", + ) + + # Get nodes and edges + nodes = list(graph.get("nodes", [])) + edges = list(graph.get("edges", [])) + + # Inject tools as nodes + tool_nodes = {} + tool_edges = [] + for node in nodes: + node_name = node.get("name") + if not node_name or node_name == "__START__": + continue + + tools = node.get("tools", []) + for tool in tools: + tool_name = tool.get("name") if isinstance(tool, dict) else str(tool) + if tool_name: + if tool_name not in tool_nodes: + tool_type = ( + tool.get("type", "tool") if isinstance(tool, dict) else "tool" + ) + tool_nodes[tool_name] = {"name": tool_name, "type": tool_type} + tool_edges.append({ + "from_node": {"name": node_name}, + "to_node": {"name": tool_name}, + "is_tool_edge": True, + }) + + for n in tool_nodes.values(): + if not any(on.get("name") == n["name"] for on in nodes): + nodes.append(n) + edges.extend(tool_edges) + + for node in nodes: + node_name = node.get("name") + if not node_name or node_name == "__START__": + continue + + outgoing_edges = [ + e for e in edges if e.get("from_node", {}).get("name") == node_name + ] + is_conditional = any(e.get("route") for e in outgoing_edges) + + node_data = nodes_state.get(node_name, {}) + status_val = node_data.get("status", NodeStatus.INACTIVE.value) + if isinstance(status_val, NodeStatus): + status = status_val + else: + try: + status = NodeStatus(status_val) + except (ValueError, KeyError): + status = NodeStatus.INACTIVE + + fillcolor = status_colors.get(status, node_fillcolor) + + node_type = node.get("type", "node") + icons = { + "agent": ("✦", "#42A5F5"), + "workflow": ("⊷", "#9333EA"), + "function": ("ƒ", "#10B981"), + "join": ("⌵", "#F59E0B"), + "tool": ("🔧", "#6B7280"), + } + icon_data = icons.get(node_type) + type_display = node_type.title() + + if icon_data: + icon, color = icon_data + escaped_name = html.escape(node_name) + node_label = ( + f'<{icon}' + f" {escaped_name}>" + ) + else: + node_label = node_name + + if is_conditional: + has_default = any( + not e.get("route") or e.get("route") == "__DEFAULT__" + for e in outgoing_edges + if not e.get("is_tool_edge") + ) + if not has_default: + if icon_data: + icon, color = icon_data + escaped_name = html.escape(node_name) + node_label = ( + f'<{icon}' + f' {escaped_name}

            ⚠️ [NO' + " DEFAULT]>" + ) + else: + escaped_label = html.escape(node_label) + node_label = ( + f"<{escaped_label}

            ⚠️ [NO" + " DEFAULT]>" + ) + + dot.node( + node_name, + node_label, + tooltip=type_display, + shape="diamond", + style="filled", + fillcolor=fillcolor, + height="1.2", + width="0.8", + margin="0.0,0.0", + ) + elif node_type == "join": + dot.node( + node_name, + node_label, + tooltip=type_display, + shape="oval", + style="filled", + fillcolor=fillcolor, + margin="0.05,0.05", + ) + elif node_type == "tool": + dot.node( + node_name, + node_label, + tooltip=type_display, + style="rounded,filled,dashed", + fillcolor=fillcolor, + ) + else: + dot.node( + node_name, + node_label, + tooltip=type_display, + style="rounded,filled", + fillcolor=fillcolor, + ) + + # Add edges + for edge in edges: + from_node_obj = edge.get("from_node", {}) + to_node_obj = edge.get("to_node", {}) + + from_node = from_node_obj.get("name") + to_node = to_node_obj.get("name") + + if from_node == "__START__": + dot.node( + "__START__", + "START", + shape="oval", + style="filled", + fillcolor=start_fillcolor, + color=start_color, + fontcolor=node_fontcolor, + fontname="Helvetica-Bold", + width="0.9", + fixedsize="true", + ) + + if from_node and to_node: + if edge.get("is_tool_edge"): + dot.edge(from_node, to_node, style="dashed", color=edge_color) + else: + label = f" {edge.get('route')}" if edge.get("route") else "" + dot.edge(from_node, to_node, label=label) + + terminal_nodes = [] + for node in nodes: + node_name = node.get("name") + if not node_name or node_name in ("__START__", "__END__"): + continue + + if node.get("type") == "tool": + continue + + outgoing_edges = [ + e + for e in edges + if e.get("from_node", {}).get("name") == node_name + and not e.get("is_tool_edge") + ] + + is_terminal = False + if not outgoing_edges: + is_terminal = True + + if is_terminal: + terminal_nodes.append(node_name) + + if is_workflow and terminal_nodes: + dot.node( + "__END__", + "END", + shape="oval", + style="filled", + fillcolor=end_fillcolor, + color=end_color, + fontcolor=node_fontcolor, + fontname="Helvetica-Bold", + width="0.9", + fixedsize="true", + ) + for t_node in terminal_nodes: + dot.edge(t_node, "__END__") + + if format == "dot": + return dot.source + if format == "svg": + return dot.pipe(format="svg").decode("utf-8") + return dot.pipe(format=format) diff --git a/src/google/adk/cli/utils/local_storage.py b/src/google/adk/cli/utils/local_storage.py index faa3eaec02..06b565fd5b 100644 --- a/src/google/adk/cli/utils/local_storage.py +++ b/src/google/adk/cli/utils/local_storage.py @@ -128,26 +128,24 @@ def __init__( async def _get_service(self, app_name: str) -> BaseSessionService: async with self._service_lock: if app_name.startswith("__"): - service = self._services.get(_BUILT_IN_SESSION_SERVICE_KEY) - if service is not None: - return service - service = create_local_database_session_service( - base_dir=self._agents_root, + storage_key = _BUILT_IN_SESSION_SERVICE_KEY + base_dir = self._agents_root + else: + storage_key = self._app_name_to_dir.get(app_name, app_name) + folder = dot_adk_folder_for_agent( + agents_root=self._agents_root, app_name=storage_key ) - self._services[_BUILT_IN_SESSION_SERVICE_KEY] = service - return service + base_dir = folder.agent_dir - storage_name = self._app_name_to_dir.get(app_name, app_name) - service = self._services.get(storage_name) + service = self._services.get(storage_key) if service is not None: return service - folder = dot_adk_folder_for_agent( - agents_root=self._agents_root, app_name=storage_name - ) + service = create_local_database_session_service( - base_dir=folder.agent_dir, + base_dir=base_dir, ) - self._services[storage_name] = service + + self._services[storage_key] = service return service @override diff --git a/src/google/adk/evaluation/custom_metric_evaluator.py b/src/google/adk/evaluation/custom_metric_evaluator.py index ccc346a674..08ede3520d 100644 --- a/src/google/adk/evaluation/custom_metric_evaluator.py +++ b/src/google/adk/evaluation/custom_metric_evaluator.py @@ -1,4 +1,4 @@ -# Copyright 2025 Google LLC +# Copyright 2026 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/google/adk/evaluation/eval_config.py b/src/google/adk/evaluation/eval_config.py index ead2303ceb..3bfa3f6391 100644 --- a/src/google/adk/evaluation/eval_config.py +++ b/src/google/adk/evaluation/eval_config.py @@ -23,7 +23,6 @@ from pydantic import BaseModel from pydantic import ConfigDict from pydantic import Field -from pydantic import model_validator from ..agents.common_configs import CodeConfig from ..evaluation.eval_metrics import EvalMetric @@ -58,15 +57,6 @@ class CustomMetricConfig(BaseModel): description="Description for the custom metric info.", ) - @model_validator(mode="after") - def check_code_config_args(self) -> "CustomMetricConfig": - """Checks that the code config does not have args.""" - if self.code_config.args: - raise ValueError( - "args field in CodeConfig for custom metric is not supported." - ) - return self - class EvalConfig(BaseModel): """Configurations needed to run an Eval. diff --git a/src/google/adk/evaluation/eval_metrics.py b/src/google/adk/evaluation/eval_metrics.py index ad55e3515f..e3c71bffca 100644 --- a/src/google/adk/evaluation/eval_metrics.py +++ b/src/google/adk/evaluation/eval_metrics.py @@ -119,6 +119,19 @@ class BaseCriterion(BaseModel): description="The threshold to be used by the metric.", ) + include_intermediate_responses_in_final: bool = Field( + default=False, + description=( + "Whether to evaluate the full agent response including intermediate" + " natural language text (e.g. text emitted before tool calls) in" + " addition to the final response. By default, only the final" + " response text is sent to the judge. When True, text from all" + " intermediate invocation events is concatenated with the final" + " response before evaluation. This is useful for agents that emit" + " text both before and after tool calls within a single invocation." + ), + ) + class LlmAsAJudgeCriterion(BaseCriterion): """Criterion when using LLM-As-A-Judge metric.""" diff --git a/src/google/adk/evaluation/final_response_match_v2.py b/src/google/adk/evaluation/final_response_match_v2.py index 713b421e3d..445d65c13d 100644 --- a/src/google/adk/evaluation/final_response_match_v2.py +++ b/src/google/adk/evaluation/final_response_match_v2.py @@ -159,13 +159,22 @@ def format_auto_rater_prompt( if expected_invocation is None: raise ValueError("expected_invocation is required for this metric.") - reference = get_text_from_content(expected_invocation.final_response) - response = get_text_from_content(actual_invocation.final_response) + include_intermediate = ( + self._criterion.include_intermediate_responses_in_final + ) + reference = get_text_from_content( + expected_invocation, + include_intermediate_responses_in_final=include_intermediate, + ) + response = get_text_from_content( + actual_invocation, + include_intermediate_responses_in_final=include_intermediate, + ) user_prompt = get_text_from_content(expected_invocation.user_content) return self._auto_rater_prompt_template.format( prompt=user_prompt, - response=response, - golden_response=reference, + response=response or "", + golden_response=reference or "", ) @override diff --git a/src/google/adk/evaluation/llm_as_judge_utils.py b/src/google/adk/evaluation/llm_as_judge_utils.py index cf1309ca38..edc057be7c 100644 --- a/src/google/adk/evaluation/llm_as_judge_utils.py +++ b/src/google/adk/evaluation/llm_as_judge_utils.py @@ -25,7 +25,10 @@ from .app_details import AppDetails from .common import EvalBaseModel from .eval_case import get_all_tool_calls_with_responses +from .eval_case import IntermediateData from .eval_case import IntermediateDataType +from .eval_case import Invocation +from .eval_case import InvocationEvents from .eval_metrics import RubricScore from .evaluator import EvalStatus @@ -44,8 +47,44 @@ class Label(enum.Enum): def get_text_from_content( - content: Optional[genai_types.Content], + content: Optional[Union[genai_types.Content, Invocation]], + *, + include_intermediate_responses_in_final: bool = False, ) -> Optional[str]: + """Extracts text from a `Content` or an `Invocation`. + + When `content` is a `Content`, returns the concatenated text of its parts. + + When `content` is an `Invocation`, returns the text of the invocation's final + response. If `include_intermediate_responses_in_final` is True, text from + intermediate invocation events (e.g. natural language emitted before tool + calls) is concatenated with the final response text. + """ + if isinstance(content, Invocation): + if not include_intermediate_responses_in_final: + # Flag off: revert to basic plain-Content behavior. + return get_text_from_content(content.final_response) + + parts: list[str] = [] + if isinstance(content.intermediate_data, InvocationEvents): + # Walk intermediate events in order; collect text parts. + for event in content.intermediate_data.invocation_events: + text = get_text_from_content(event.content) + if text: + parts.append(text) + elif isinstance(content.intermediate_data, IntermediateData): + for _, response_parts in content.intermediate_data.intermediate_responses: + text = get_text_from_content(genai_types.Content(parts=response_parts)) + if text: + parts.append(text) + + # Then fetch the final response text and append it to the end. + final_text = get_text_from_content(content.final_response) + if final_text: + parts.append(final_text) + + return "\n".join(parts) if parts else None + if content and content.parts: return "\n".join([p.text for p in content.parts if p.text]) diff --git a/src/google/adk/evaluation/local_eval_service.py b/src/google/adk/evaluation/local_eval_service.py index b749b7e8f1..1a032bad64 100644 --- a/src/google/adk/evaluation/local_eval_service.py +++ b/src/google/adk/evaluation/local_eval_service.py @@ -217,18 +217,25 @@ async def run_evaluation(inference_result): for inference_result in evaluate_request.inference_results ] + results_by_set = {} + for evaluation_task in asyncio.as_completed(evaluation_tasks): inference_result, eval_case_result = await evaluation_task + results_by_set.setdefault(inference_result.eval_set_id, []).append( + (inference_result.app_name, eval_case_result) + ) + yield eval_case_result - if self._eval_set_results_manager: + if self._eval_set_results_manager: + for eval_set_id, results in results_by_set.items(): + app_name = results[0][0] + cases = [r[1] for r in results] self._eval_set_results_manager.save_eval_set_result( - app_name=inference_result.app_name, - eval_set_id=inference_result.eval_set_id, - eval_case_results=[eval_case_result], + app_name=app_name, + eval_set_id=eval_set_id, + eval_case_results=cases, ) - yield eval_case_result - async def _evaluate_single_inference_result( self, inference_result: InferenceResult, evaluate_config: EvaluateConfig ) -> tuple[InferenceResult, EvalCaseResult]: diff --git a/src/google/adk/evaluation/rubric_based_final_response_quality_v1.py b/src/google/adk/evaluation/rubric_based_final_response_quality_v1.py index df01aba4ff..135b2b9593 100644 --- a/src/google/adk/evaluation/rubric_based_final_response_quality_v1.py +++ b/src/google/adk/evaluation/rubric_based_final_response_quality_v1.py @@ -274,7 +274,18 @@ def format_auto_rater_prompt( """Returns the autorater prompt.""" self.create_effective_rubrics_list(actual_invocation.rubrics) user_input = get_text_from_content(actual_invocation.user_content) - final_response = get_text_from_content(actual_invocation.final_response) + + criterion = self._eval_metric.criterion + include_intermediate = getattr( + criterion, "include_intermediate_responses_in_final", False + ) + final_response = ( + get_text_from_content( + actual_invocation, + include_intermediate_responses_in_final=include_intermediate, + ) + or "" + ) rubrics_text = "\n".join([ f"* {r.rubric_content.text_property}" diff --git a/src/google/adk/events/__init__.py b/src/google/adk/events/__init__.py index 4b3ccc5d56..d027ffbe42 100644 --- a/src/google/adk/events/__init__.py +++ b/src/google/adk/events/__init__.py @@ -14,8 +14,10 @@ from .event import Event from .event_actions import EventActions +from .request_input import RequestInput __all__ = [ 'Event', 'EventActions', + 'RequestInput', ] diff --git a/src/google/adk/events/_node_path_builder.py b/src/google/adk/events/_node_path_builder.py new file mode 100644 index 0000000000..a07125229c --- /dev/null +++ b/src/google/adk/events/_node_path_builder.py @@ -0,0 +1,107 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Path builder for hierarchical node paths.""" + +from __future__ import annotations + + +class _NodePathBuilder: + """Represents a path to a node in a hierarchical workflow. + + A node path is a sequence of segments, each identifying a node instance, + typically in the form 'node_name@run_id' or just 'node_name'. + """ + + def __init__(self, segments: list[str]): + """Initializes a _NodePathBuilder with a list of segments.""" + self._segments = segments + + @classmethod + def from_string(cls, path_str: str) -> _NodePathBuilder: + """Parses a _NodePathBuilder from a string representation. + + Example: 'wf@1/node@2'. + """ + if not path_str: + return cls([]) + return cls(path_str.split('/')) + + def __str__(self) -> str: + """Returns the string representation of the path.""" + return '/'.join(self._segments) + + def __eq__(self, other: object) -> bool: + """Returns True if segments are equal.""" + if not isinstance(other, _NodePathBuilder): + return NotImplemented + return self._segments == other._segments + + @property + def node_name(self) -> str: + """Returns the node name of the leaf segment.""" + if not self._segments: + return '' + return self._segments[-1].rsplit('@', 1)[0] + + @property + def leaf_segment(self) -> str: + """Returns the full leaf segment.""" + if not self._segments: + return '' + return self._segments[-1] + + @property + def run_id(self) -> str | None: + """Returns the run ID of the leaf segment, if any.""" + if not self._segments: + return None + parts = self._segments[-1].rsplit('@', 1) + return parts[1] if len(parts) > 1 else None + + @property + def parent(self) -> _NodePathBuilder | None: + """Returns the parent _NodePathBuilder, or None if this is a root path.""" + if len(self._segments) <= 1: + return None + return _NodePathBuilder(self._segments[:-1]) + + def append( + self, node_name: str, run_id: str | None = None + ) -> _NodePathBuilder: + """Returns a new _NodePathBuilder with the child segment appended.""" + segment = node_name + if run_id: + segment = f'{node_name}@{run_id}' + return _NodePathBuilder(self._segments + [segment]) + + def is_descendant_of(self, ancestor: _NodePathBuilder) -> bool: # pylint: disable=protected-access + """Checks if this path is a descendant of the ancestor path.""" + if len(self._segments) <= len(ancestor._segments): + return False + return self._segments[: len(ancestor._segments)] == ancestor._segments + + def is_direct_child_of(self, parent: _NodePathBuilder) -> bool: # pylint: disable=protected-access + """Checks if this path is a direct child of the parent path.""" + if len(self._segments) != len(parent._segments) + 1: + return False + return self._segments[:-1] == parent._segments + + def get_direct_child(self, descendant: _NodePathBuilder) -> _NodePathBuilder: # pylint: disable=protected-access + """Returns a new _NodePathBuilder for the direct child towards the descendant.""" + if len(descendant._segments) <= len(self._segments): + raise ValueError('Descendant path is not longer than self path') + if descendant._segments[: len(self._segments)] != self._segments: + raise ValueError('Descendant path does not start with self path') + return _NodePathBuilder(descendant._segments[: len(self._segments) + 1]) diff --git a/src/google/adk/events/event.py b/src/google/adk/events/event.py index 51e30d91b0..daa7a0bff8 100644 --- a/src/google/adk/events/event.py +++ b/src/google/adk/events/event.py @@ -14,6 +14,7 @@ from __future__ import annotations +from typing import Any from typing import cast from typing import Optional @@ -21,13 +22,74 @@ from google.adk.platform import uuid as platform_uuid from google.genai import types from pydantic import alias_generators +from pydantic import BaseModel from pydantic import ConfigDict from pydantic import Field +from pydantic import model_validator +from pydantic import PrivateAttr from ..models.llm_response import LlmResponse from .event_actions import EventActions +class NodeInfo(BaseModel): + """Workflow node metadata attached to an Event.""" + + model_config = ConfigDict( + ser_json_bytes='base64', + val_json_bytes='base64', + alias_generator=alias_generators.to_camel, + populate_by_name=True, + ) + + path: str = '' + """The path of the node in the workflow. + In a workflow A, if node B is directly under A, and B emits an event, the + path will be "A/B". Agent state event will have path as "A". + """ + + output_for: list[str] | None = None + """Node paths whose output this event represents. + + Set on events that carry an output value. When set, the output field + of this event is also considered the output for each listed node path + in the same invocation. For example, ``["wf/A@1/B@1", "wf/A@1"]`` means + this event's output counts as the output for both. + """ + + message_as_output: bool | None = None + """When True, this event's content is the node's output. + + No separate output event is needed — the content event already + carries the output value. + """ + + @property + def run_id(self) -> str: + """The run ID of the node that generated the event.""" + from ._node_path_builder import _NodePathBuilder + + return _NodePathBuilder.from_string(self.path).run_id or '' + + @property + def parent_run_id(self) -> str | None: + """The run ID of the parent node that dynamically scheduled + this node. Used to reconstruct dynamic node state from session events.""" + from ._node_path_builder import _NodePathBuilder + + builder = _NodePathBuilder.from_string(self.path) + if builder.parent: + return builder.parent.run_id + return None + + @property + def name(self) -> str: + """The clean name of the node (without @run_id).""" + from ._node_path_builder import _NodePathBuilder + + return _NodePathBuilder.from_string(self.path).node_name + + class Event(LlmResponse): """Represents an event in a conversation between agents and users. @@ -52,12 +114,18 @@ class Event(LlmResponse): actions: EventActions = Field(default_factory=EventActions) """The actions taken by the agent.""" - long_running_tool_ids: Optional[set[str]] = None + output: Any | None = None + """Generic data output from a workflow node.""" + + node_info: NodeInfo = Field(default_factory=NodeInfo) + """Workflow node metadata (path, run_id, etc.).""" + + long_running_tool_ids: set[str] | None = None """Set of ids of the long running function calls. Agent client will know from this field about which function call is long running. only valid for function call event """ - branch: Optional[str] = None + branch: str | None = None """The branch of the event. The format is like agent_1.agent_2.agent_3, where agent_1 is the parent of @@ -66,6 +134,20 @@ class Event(LlmResponse): Branch is used when multiple sub-agent shouldn't see their peer agents' conversation history. """ + isolation_scope: str | None = None + """Scope tag indicating which logical context this event belongs to. + + When set, the LLM content-builder restricts session events visible to + an agent to those whose ``isolation_scope`` matches the agent's own + scope. One usage today is the Task API: a delegated task agent is + scoped under the originating function-call id (````) so it + sees only its own task's events, isolated from the chat + coordinator's broader conversation. + + ⚠️ DO NOT USE THIS FIELD DIRECTLY. It is an internal mechanism that + may change without notice. External code should not read, write, or + rely on its semantics. + """ # The following are computed fields. # Do not assign the ID. It will be assigned by the session. @@ -74,6 +156,118 @@ class Event(LlmResponse): timestamp: float = Field(default_factory=lambda: platform_time.get_time()) """The timestamp of the event.""" + @model_validator(mode='before') + @classmethod + def _accept_convenience_kwargs(cls, data: Any) -> Any: + """Routes convenience kwargs to nested fields. + + Routed kwargs: + message: ContentUnion -> content (converted via t_content) + state: dict -> actions.state_delta + route: value -> actions.route + node_path: str -> node_info.path + + Subclasses that declare any of these as real fields (or aliases of + real fields) keep normal field validation behavior. + """ + if not isinstance(data, dict): + return data + + field_names: set[str] = set(cls.model_fields.keys()) + for f in cls.model_fields.values(): + if f.alias: + field_names.add(f.alias) + message = None if 'message' in field_names else data.pop('message', None) + state = None if 'state' in field_names else data.pop('state', None) + route = None if 'route' in field_names else data.pop('route', None) + node_path = ( + None if 'node_path' in field_names else data.pop('node_path', None) + ) + + if message is not None: + if data.get('content') is not None: + raise ValueError( + "'message' and 'content' are mutually exclusive." + ' Use one or the other.' + ) + from google.genai import _transformers + + data['content'] = _transformers.t_content(message) + + if state is not None or route is not None: + actions = data.get('actions') + actions_dict: Optional[dict[str, Any]] = None + if actions is None: + actions_dict = {} + elif isinstance(actions, EventActions): + actions_dict = actions.model_dump() + elif isinstance(actions, dict): + actions_dict = dict(actions) + # If actions is an unexpected type, skip the transformation and let + # Pydantic's normal field validation report the error. + if actions_dict is not None: + if state is not None: + actions_dict['state_delta'] = state + if route is not None: + actions_dict['route'] = route + data['actions'] = actions_dict + + if node_path is not None: + node_info = data.get('node_info') + node_info_dict: Optional[dict[str, Any]] = None + if node_info is None: + node_info_dict = {} + elif isinstance(node_info, NodeInfo): + node_info_dict = node_info.model_dump() + elif isinstance(node_info, dict): + node_info_dict = dict(node_info) + # If node_info is an unexpected type, skip the transformation and let + # Pydantic's normal field validation report the error. + if node_info_dict is not None: + node_info_dict['path'] = node_path + data['node_info'] = node_info_dict + + return data + + @property + def message(self) -> Any: + """Alias for content. Returns the user-facing message of the event. + + Subclasses may declare ``message`` as a real field (see + ``_accept_convenience_kwargs``, which already routes construction kwargs to + such fields). When they do, return that field's value so reads stay + consistent with construction and serialization instead of returning the + ``content`` alias. The return type is ``Any`` because such a subclass field + may be typed differently (e.g. ``str``); for a plain ``Event`` this returns + ``Optional[types.Content]``. + """ + if 'message' in type(self).model_fields: + return self.__dict__.get('message') + return self.content + + @message.setter + def message(self, value: Any) -> None: + """Sets the content of the event (or a subclass ``message`` field).""" + if 'message' in type(self).model_fields: + # Route through Pydantic so a subclass field's validators/type are + # enforced. A direct __dict__ write would skip validation, and + # object.__setattr__/self.message would recurse through this property. + self.__pydantic_validator__.validate_assignment(self, 'message', value) + return + if value is not None: + from google.genai import _transformers + + self.content = _transformers.t_content(value) + else: + self.content = None + + @property + def node_name(self) -> str: + """The name of the node that generated the event.""" + if self.actions.agent_state or self.actions.end_of_agent: + return '' + return self.node_info.name + def model_post_init(self, __context): """Post initialization logic for the event.""" # Generates a random ID for the event. @@ -97,24 +291,6 @@ def is_final_response(self) -> bool: and not self.has_trailing_code_execution_result() ) - def get_function_calls(self) -> list[types.FunctionCall]: - """Returns the function calls in the event.""" - func_calls = [] - if self.content and self.content.parts: - for part in self.content.parts: - if part.function_call: - func_calls.append(part.function_call) - return func_calls - - def get_function_responses(self) -> list[types.FunctionResponse]: - """Returns the function responses in the event.""" - func_response = [] - if self.content and self.content.parts: - for part in self.content.parts: - if part.function_response: - func_response.append(part.function_response) - return func_response - def has_trailing_code_execution_result( self, ) -> bool: diff --git a/src/google/adk/events/event_actions.py b/src/google/adk/events/event_actions.py index 9557664dee..3f52cc5f81 100644 --- a/src/google/adk/events/event_actions.py +++ b/src/google/adk/events/event_actions.py @@ -16,6 +16,7 @@ from typing import Any from typing import Optional +from typing import Union from google.genai.types import Content from pydantic import alias_generators @@ -110,5 +111,11 @@ class EventActions(BaseModel): rewind_before_invocation_id: Optional[str] = None """The invocation id to rewind to. This is only set for rewind event.""" + route: Optional[Union[bool, int, str, list[Union[bool, int, str]]]] = None + """Route or list of routes for workflow graph edge matching.""" + render_ui_widgets: Optional[list[UiWidget]] = None """List of UI widgets to be rendered by the UI.""" + + set_model_response: Optional[Any] = None + """The model response structured output.""" diff --git a/src/google/adk/events/request_input.py b/src/google/adk/events/request_input.py new file mode 100644 index 0000000000..8596d6f7e4 --- /dev/null +++ b/src/google/adk/events/request_input.py @@ -0,0 +1,67 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import annotations + +from typing import Any +from typing import Optional +import uuid + +from pydantic import alias_generators +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import Field + +from ..utils._schema_utils import SchemaType + + +class RequestInput(BaseModel): + """Represents a request for input from the user.""" + + model_config = ConfigDict( + arbitrary_types_allowed=True, + alias_generator=alias_generators.to_camel, + populate_by_name=True, + ) + + interrupt_id: str = Field( + description=( + "The ID of the interrupt, usually a function call ID. This is used" + " to identify the interrupt that the input is for." + ), + default_factory=lambda: str(uuid.uuid4()), + ) + """The ID of the interrupt, usually a function call ID. + + Reusing the same interrupt_id across loop iterations (e.g. a + rejection/retry cycle) is supported — the framework matches + function calls and responses by count. Using unique IDs per + iteration is still recommended for clarity in event logs. + """ + payload: Optional[Any] = None + """ Custom payload to be provided for resuming.""" + message: Optional[str] = Field( + None, + description="A message to display to the user when requesting input.", + ) + """A message to display to the user when requesting input.""" + response_schema: Optional[SchemaType] = Field( + None, + description=( + "The expected schema of the response. Accepts a Python type" + " (e.g. a Pydantic BaseModel class), a generic alias" + " (e.g. list[str]), or a raw JSON Schema dict." + " If None, it defaults to Any." + ), + ) + """The expected schema of the response.""" diff --git a/src/google/adk/features/_feature_registry.py b/src/google/adk/features/_feature_registry.py index a99a51b430..d155e3b7ac 100644 --- a/src/google/adk/features/_feature_registry.py +++ b/src/google/adk/features/_feature_registry.py @@ -135,10 +135,10 @@ class FeatureConfig: FeatureStage.EXPERIMENTAL, default_on=True ), FeatureName.JSON_SCHEMA_FOR_FUNC_DECL: FeatureConfig( - FeatureStage.WIP, default_on=False + FeatureStage.EXPERIMENTAL, default_on=True ), FeatureName._MCP_GRACEFUL_ERROR_HANDLING: FeatureConfig( - FeatureStage.EXPERIMENTAL, default_on=False + FeatureStage.EXPERIMENTAL, default_on=True ), FeatureName.PROGRESSIVE_SSE_STREAMING: FeatureConfig( FeatureStage.EXPERIMENTAL, default_on=True diff --git a/src/google/adk/flows/llm_flows/_output_schema_processor.py b/src/google/adk/flows/llm_flows/_output_schema_processor.py index 284cc21383..572236007f 100644 --- a/src/google/adk/flows/llm_flows/_output_schema_processor.py +++ b/src/google/adk/flows/llm_flows/_output_schema_processor.py @@ -46,6 +46,7 @@ async def run_async( not agent.output_schema or not agent.tools or can_use_output_schema_with_tools(agent.canonical_model) + or getattr(agent, 'mode', None) == 'task' ): return diff --git a/src/google/adk/flows/llm_flows/agent_transfer.py b/src/google/adk/flows/llm_flows/agent_transfer.py index 8c734a1993..f4c68671db 100644 --- a/src/google/adk/flows/llm_flows/agent_transfer.py +++ b/src/google/adk/flows/llm_flows/agent_transfer.py @@ -144,6 +144,9 @@ def _build_transfer_instructions( Returns: Instruction text for the LLM about agent transfers. """ + if agent.mode in ('task', 'single_turn'): + return '' + si = _build_transfer_instruction_body(tool_name, target_agents) if agent.parent_agent and not agent.disallow_transfer_to_parent: @@ -154,8 +157,28 @@ def _build_transfer_instructions( def _get_transfer_targets(agent: LlmAgent) -> list[BaseAgent]: + """Gets the list of agents that the current agent can transfer to. + + The transfer targets include: + 1. Sub-agents of the current agent, excluding those in 'single_turn' mode. + 2. The parent agent, if it exists and the current agent does not disallow + transfer to the parent. + 3. Peer agents (other sub-agents of the parent), if the current agent does + not disallow transfer to peers. + + Args: + agent: The LlmAgent for which to find transfer targets. + + Returns: + A list of BaseAgent instances that are valid transfer targets. + """ result = [] - result.extend(agent.sub_agents) + result.extend([ + sub_agent + for sub_agent in agent.sub_agents + if not hasattr(sub_agent, 'mode') + or sub_agent.mode not in ('single_turn', 'task') + ]) if not agent.parent_agent or not hasattr( agent.parent_agent, 'disallow_transfer_to_parent' @@ -170,6 +193,7 @@ def _get_transfer_targets(agent: LlmAgent) -> list[BaseAgent]: peer_agent for peer_agent in agent.parent_agent.sub_agents if peer_agent.name != agent.name + and peer_agent.mode not in ('single_turn', 'task') ]) return result diff --git a/src/google/adk/flows/llm_flows/base_llm_flow.py b/src/google/adk/flows/llm_flows/base_llm_flow.py index af70bf8d41..74f7c6a8db 100644 --- a/src/google/adk/flows/llm_flows/base_llm_flow.py +++ b/src/google/adk/flows/llm_flows/base_llm_flow.py @@ -22,14 +22,14 @@ from typing import Optional from typing import TYPE_CHECKING -from google.adk.flows.llm_flows import _output_schema_processor -from google.adk.flows.llm_flows import functions from google.adk.platform import time as platform_time from google.genai import types from opentelemetry import trace from websockets.exceptions import ConnectionClosed from websockets.exceptions import ConnectionClosedOK +from . import _output_schema_processor +from . import functions from ...agents.base_agent import BaseAgent from ...agents.callback_context import CallbackContext from ...agents.invocation_context import InvocationContext @@ -44,6 +44,7 @@ from ...models.llm_request import LlmRequest from ...models.llm_response import LlmResponse from ...telemetry import _instrumentation +from ...telemetry import tracing from ...telemetry.tracing import trace_call_llm from ...telemetry.tracing import trace_send_data from ...telemetry.tracing import tracer @@ -288,7 +289,7 @@ async def _maybe_add_grounding_metadata( # First run callbacks from the plugins. callback_response = ( await invocation_context.plugin_manager.run_after_model_callback( - callback_context=CallbackContext(invocation_context), + callback_context=callback_context, llm_response=llm_response, ) ) @@ -420,17 +421,20 @@ async def _process_agent_tools( tool declarations in the request. Tool-union resolution is dispatched concurrently via ``asyncio.gather`` - to overlap I/O-bound listings. The subsequent ``process_llm_request`` - calls are kept serial in the original ``agent.tools`` order, as some - tools read/write ``llm_request`` state and rely on observing the + to overlap I/O-bound listings (e.g. MCP ``list_tools`` over the + network). The subsequent ``process_llm_request`` calls are kept + serial in the original ``agent.tools`` order: some tools read/write + ``llm_request`` state (e.g. ``GoogleSearchTool`` writes + ``llm_request.model``; ``ComputerUseToolset`` performs an idempotency + check on ``llm_request.config.tools``) and rely on observing the post-state of earlier tools. After this function returns, ``llm_request.tools_dict`` maps tool names to ``BaseTool`` instances ready for function call dispatch. Args: - invocation_context: The invocation context (``agent`` is read from - ``invocation_context.agent``). + invocation_context: The invocation context (``agent`` is read + from ``invocation_context.agent``). llm_request: The LLM request to populate with tool declarations. """ agent = invocation_context.agent @@ -442,8 +446,12 @@ async def _process_agent_tools( from ...agents.llm_agent import _convert_tool_union_to_tools - # Resolve tool_unions in parallel. `asyncio.gather` preserves input order - # for the serial commit phase below and propagates exceptions immediately. + # Resolve tool_unions in parallel. ``asyncio.gather`` preserves + # input order in the returned list, so the serial commit phase below + # still observes ``agent.tools`` order. If any resolution raises, + # gather cancels the siblings and propagates -- same observable + # behavior as the previous serial loop, which would propagate the + # first exception and abandon the rest. resolved_tools_per_union = await asyncio.gather(*( _convert_tool_union_to_tools( tool_union, @@ -454,8 +462,8 @@ async def _process_agent_tools( for tool_union in agent.tools )) - # Serial commit phase, in original agent.tools order. Mutations to - # ``llm_request`` and reads of its state (model, config.tools, + # Serial commit phase, in original ``agent.tools`` order. Mutations + # to ``llm_request`` and reads of its state (model, config.tools, # tools_dict) preserve today's ordering semantics exactly. for tool_union, tools in zip(agent.tools, resolved_tools_per_union): tool_context = ToolContext(invocation_context) @@ -505,6 +513,9 @@ async def run_live( if invocation_context.end_invocation: return + agent = invocation_context.agent + llm_request.model = agent.canonical_live_model.model + llm = self.__get_llm(invocation_context) logger.debug( 'Establishing live connection for agent: %s with llm request: %s', @@ -878,20 +889,22 @@ async def _run_one_step_async( # Long running tool calls should have been handled before this point. # If there are still long running tool calls, it means the agent is paused # before, and its branch hasn't been resumed yet. - if ( - invocation_context.is_resumable - and events - and len(events) > 1 - # TODO: here we are using the last 2 events to decide whether to pause - # the invocation. But this is just being optimistic, we should find a - # way to pause when the long running tool call is followed by more than - # one text responses. - and ( - invocation_context.should_pause_invocation(events[-1]) - or invocation_context.should_pause_invocation(events[-2]) - ) - ): - return + if invocation_context.is_resumable and events and len(events) > 1: + pause = False + if invocation_context.should_pause_invocation(events[-1]): + pause = True + elif invocation_context.should_pause_invocation(events[-2]): + # NOTE: This only checks the last 2 events. If an LRO is followed by + # multiple text responses, this check may not trigger correctly. + # This is a known limitation of the current 2-event window. + # Check if the function call in events[-2] is resolved by events[-1] + fc_ids = {fc.id for fc in events[-2].get_function_calls()} + fr_ids = {fr.id for fr in events[-1].get_function_responses()} + if fc_ids and not fc_ids.issubset(fr_ids): + pause = True + + if pause: + return if ( invocation_context.is_resumable @@ -1001,6 +1014,7 @@ async def _postprocess_async( not llm_response.content and not llm_response.error_code and not llm_response.interrupted + and not llm_response.grounding_metadata ): return @@ -1065,6 +1079,7 @@ async def _postprocess_live( and not llm_response.output_transcription and not llm_response.usage_metadata and not llm_response.live_session_resumption_update + and not llm_response.grounding_metadata ): return @@ -1180,6 +1195,15 @@ async def _postprocess_handle_function_calls_async( ) ) yield final_event + + # NOTE: This recursive nested execution block is preserved as a backward-compatible + # fallback for deprecated execution paths (such as legacy `SequentialAgent`) that + # do not run under the modern ADK 2.0 `DynamicNodeScheduler`. + # + # In modern resumable workflow environments, this block is safely bypassed + # because the scheduler wrapper (e.g., `_llm_agent_wrapper.py`) intercepts the + # `transfer_to_agent` action at the outer execution frame and exits, returning + # control to the top-level coordinator. transfer_to_agent = function_response_event.actions.transfer_to_agent if transfer_to_agent: agent_to_run = self._get_agent_to_run( @@ -1430,6 +1454,9 @@ def __get_llm(self, invocation_context: InvocationContext) -> BaseLlm: config['_adk_replay_indexes'] = replay_indexes return model + if invocation_context.live_request_queue is not None: + return agent.canonical_live_model + if not hasattr(agent, 'canonical_model'): raise TypeError( 'Expected agent to have canonical_model attribute,' diff --git a/src/google/adk/flows/llm_flows/basic.py b/src/google/adk/flows/llm_flows/basic.py index 8e9bfa514c..efe22a9f17 100644 --- a/src/google/adk/flows/llm_flows/basic.py +++ b/src/google/adk/flows/llm_flows/basic.py @@ -54,7 +54,11 @@ def _build_basic_request( # support output_schema and tools together. we have a workaround to support # both output_schema and tools at the same time. see # _output_schema_processor.py for details - if agent.output_schema: + # + # task-mode agents skip output_schema configuration in + # the basic flow. Structured output for tasks is collected via the + # finish_task tool schema instead. + if getattr(agent, 'mode', None) != 'task' and agent.output_schema: if not agent.tools or can_use_output_schema_with_tools(model): llm_request.set_output_schema(agent.output_schema) diff --git a/src/google/adk/flows/llm_flows/contents.py b/src/google/adk/flows/llm_flows/contents.py index f5d706b94c..fab5afd2cd 100644 --- a/src/google/adk/flows/llm_flows/contents.py +++ b/src/google/adk/flows/llm_flows/contents.py @@ -29,7 +29,6 @@ from .functions import remove_client_function_call_id from .functions import REQUEST_CONFIRMATION_FUNCTION_CALL_NAME from .functions import REQUEST_EUC_FUNCTION_CALL_NAME -from .functions import REQUEST_INPUT_FUNCTION_CALL_NAME logger = logging.getLogger('google_adk.' + __name__) @@ -68,6 +67,7 @@ async def run_async( # (since llm_request.contents will be completely reassigned below) instruction_related_contents = llm_request.contents + is_single_turn = getattr(agent, 'mode', None) == 'single_turn' if agent.include_contents == 'default': # Include full conversation history llm_request.contents = _get_contents( @@ -75,6 +75,9 @@ async def run_async( invocation_context.session.events, agent.name, preserve_function_call_ids=preserve_function_call_ids, + isolation_scope=invocation_context.isolation_scope, + is_single_turn=is_single_turn, + user_content=invocation_context.user_content, ) else: # Include current turn context only (no conversation history) @@ -83,6 +86,9 @@ async def run_async( invocation_context.session.events, agent.name, preserve_function_call_ids=preserve_function_call_ids, + isolation_scope=invocation_context.isolation_scope, + is_single_turn=is_single_turn, + user_content=invocation_context.user_content, ) # Add instruction-related contents to proper position in conversation @@ -296,8 +302,70 @@ def _contains_empty_content(event: Event) -> bool: ) and (not event.output_transcription and not event.input_transcription) +_SINGLE_TURN_NUDGE = ( + 'Important: You will not receive any user replies or clarifications.' + ' Complete the task using only the information provided above.' +) + + +def _build_task_input_user_content( + all_events: list[Event], + isolation_scope: str, + is_single_turn: bool = False, + user_content: Optional[types.Content] = None, +) -> Optional[types.Content]: + """Find the originating task-delegation FC and convert its args to user content. + + A task agent runs under ``isolation_scope=``, where ``fc_id`` + matches the function_call.id that delegated to it. The FC itself + lives on a parent event (typically the chat coordinator's), so it + is filtered out of the task agent's content by the isolation_scope + filter. This helper rebuilds it as a user-role text content so the + task agent's LLM sees its task as the first turn. + + When no matching FC is found (workflow-node task case — task agent + dispatched directly by a Workflow, not via FC delegation), falls + back to ``user_content`` (set on the InvocationContext by the + wrapper to ``_node_input_to_content(node_input)``). + + When ``is_single_turn`` is True, appends a second text part nudging + the LLM that no further user replies will arrive — single-turn + agents must complete the task from the input alone. + + Returns None if neither source yields content. + """ + for event in all_events: + if not event.content or not event.content.parts: + continue + for part in event.content.parts: + fc = part.function_call + if fc and fc.id == isolation_scope and fc.args: + # Render args as JSON string — same shape an LLM would emit. + try: + import json as _json + + text = _json.dumps(dict(fc.args)) + except (TypeError, ValueError): + text = str(fc.args) + parts = [types.Part(text=text)] + if is_single_turn: + parts.append(types.Part(text=_SINGLE_TURN_NUDGE)) + return types.Content(role='user', parts=parts) + + # Fallback: workflow-node task with no originating FC. Use the + # node_input that the wrapper stamped onto ``ic.user_content``. + if user_content and user_content.parts: + parts = list(user_content.parts) + if is_single_turn: + parts.append(types.Part(text=_SINGLE_TURN_NUDGE)) + return types.Content(role='user', parts=parts) + return None + + def _should_include_event_in_context( - current_branch: Optional[str], event: Event + current_branch: Optional[str], + event: Event, + isolation_scope: Optional[str] = None, ) -> bool: """Determines if an event should be included in the LLM context. @@ -305,20 +373,29 @@ def _should_include_event_in_context( calls, or transcriptions), do not belong to the current agent's branch, or are internal events like authentication or confirmation requests. + Events are scoped via ``isolation_scope``: an event is visible to an + agent only when their ``isolation_scope`` values match exactly. A chat + coordinator (unscoped, ``isolation_scope=None``) sees only unscoped + events; a task or single_turn agent (scoped under the originating + function-call id) sees only its own scoped events. + Args: current_branch: The current branch of the agent. event: The event to filter. + isolation_scope: The agent's isolation_scope. None means unscoped. Returns: True if the event should be included in the context, False otherwise. """ + ev_iso = getattr(event, 'isolation_scope', None) + if ev_iso != isolation_scope: + return False return not ( _contains_empty_content(event) or not _is_event_belongs_to_branch(current_branch, event) or _is_adk_framework_event(event) or _is_auth_event(event) or _is_request_confirmation_event(event) - or _is_request_input_event(event) ) @@ -424,6 +501,9 @@ def _get_contents( agent_name: str = '', *, preserve_function_call_ids: bool = False, + isolation_scope: Optional[str] = None, + is_single_turn: bool = False, + user_content: Optional[types.Content] = None, ) -> list[types.Content]: """Get the contents for the LLM request. @@ -434,6 +514,11 @@ def _get_contents( events: Events to process. agent_name: The name of the agent. preserve_function_call_ids: Whether to preserve function call ids. + isolation_scope: scope tag — when set, restricts events + to those with matching ``event.isolation_scope`` (or unscoped). + user_content: Fallback first user turn for task agents whose + originating delegation FC is not in session (workflow-node + task case). Returns: A list of processed contents. @@ -465,7 +550,9 @@ def _get_contents( raw_filtered_events = [ e for e in rewind_filtered_events - if _should_include_event_in_context(current_branch, e) + if _should_include_event_in_context( + current_branch, e, isolation_scope=isolation_scope + ) ] has_compaction_events = any( @@ -477,6 +564,14 @@ def _get_contents( else: events_to_process = raw_filtered_events + # Build mapping of function call IDs to their authors + fc_author_by_id = {} + for e in events_to_process: + if e.content and e.content.parts: + for part in e.content.parts: + if part.function_call: + fc_author_by_id[part.function_call.id] = e.author + filtered_events = [] # aggregate transcription events for i in range(len(events_to_process)): @@ -514,7 +609,23 @@ def _get_contents( ) accumulated_output_transcription = '' - if _is_other_agent_reply(agent_name, event): + is_other_reply = _is_other_agent_reply(agent_name, event) + + # Check if it's a FunctionResponse for another agent + if not is_other_reply and event.content: + for part in event.content.parts or []: + if part.function_response: + resp_id = part.function_response.id + call_author = fc_author_by_id.get(resp_id) + if ( + call_author + and call_author != agent_name + and call_author != 'user' + ): + is_other_reply = True + break + + if is_other_reply: if converted_event := _present_other_agent_message(event): filtered_events.append(converted_event) else: @@ -536,6 +647,24 @@ def _get_contents( if not preserve_function_call_ids: remove_client_function_call_id(content) contents.append(content) + + # for scoped agents (task / single_turn), prepend a + # synthetic user-role content built from the originating FC's args. + # The FC lives in an UNSCOPED parent event (e.g., the coordinator's + # task-delegation FC), which the strict isolation filter just + # excluded — so we re-derive it directly from the full session + # events here. This becomes the agent's first turn: "your task is + # X" instead of starting cold from system instruction only. + if isolation_scope is not None: + leading = _build_task_input_user_content( + events, + isolation_scope, + is_single_turn=is_single_turn, + user_content=user_content, + ) + if leading is not None: + contents.insert(0, leading) + return contents @@ -545,6 +674,9 @@ def _get_current_turn_contents( agent_name: str = '', *, preserve_function_call_ids: bool = False, + is_single_turn: bool = False, + isolation_scope: Optional[str] = None, + user_content: Optional[types.Content] = None, ) -> list[types.Content]: """Get contents for the current turn only (no conversation history). @@ -569,14 +701,17 @@ def _get_current_turn_contents( # Find the latest event that starts the current turn and process from there for i in range(len(events) - 1, -1, -1): event = events[i] - if _should_include_event_in_context(current_branch, event) and ( - event.author == 'user' or _is_other_agent_reply(agent_name, event) - ): + if _should_include_event_in_context( + current_branch, event, isolation_scope=isolation_scope + ) and (event.author == 'user' or _is_other_agent_reply(agent_name, event)): return _get_contents( current_branch, events[i:], agent_name, preserve_function_call_ids=preserve_function_call_ids, + isolation_scope=isolation_scope, + is_single_turn=is_single_turn, + user_content=user_content, ) return [] @@ -790,11 +925,6 @@ def _is_adk_framework_event(event: Event) -> bool: return _is_function_call_event(event, 'adk_framework') -def _is_request_input_event(event: Event) -> bool: - """Checks if the event is a request input event.""" - return _is_function_call_event(event, REQUEST_INPUT_FUNCTION_CALL_NAME) - - def _is_live_model_media_event_with_inline_data(event: Event) -> bool: """Check if the event is a live/bidi media event (audio, video, image) with inline data. @@ -821,7 +951,7 @@ def _is_live_model_media_event_with_inline_data(event: Event) -> bool: ], role='model' ) grounding_metadata=None partial=None turn_complete=None finish_reason=None - error_code=None error_message=None ... + error_code=None error_message=None... """ if not event.content or not event.content.parts: return False diff --git a/src/google/adk/flows/llm_flows/functions.py b/src/google/adk/flows/llm_flows/functions.py index 588126698c..259d40b6b6 100644 --- a/src/google/adk/flows/llm_flows/functions.py +++ b/src/google/adk/flows/llm_flows/functions.py @@ -68,6 +68,48 @@ _TOOL_THREAD_POOL_LOCK = threading.Lock() +def _detect_error_type_for_telemetry( + tool: BaseTool, + tool_context: ToolContext, + function_response: Any, +) -> Optional[str]: + """Detects an error type from a tool response for telemetry purposes. + + This does not modify the response. `_detect_error_in_response` is an optional + per-tool hook accessed via `getattr` to avoid adding a public API on + `BaseTool`. Any exception raised by the detector is logged and swallowed so + that telemetry logic never breaks tool execution. + + Args: + tool: The tool whose response is being inspected. + tool_context: The tool context for the current invocation. Detection is + skipped when the tool is requesting auth or confirmation. + function_response: The raw response returned by the tool. + + Returns: + The error type string reported by the tool's `_detect_error_in_response` + hook, or `None` if no error was detected, no hook is defined, or the hook + raised an exception. + """ + try: + if ( + tool_context.actions.requested_auth_configs + or tool_context.actions.requested_tool_confirmations + ): + return None + detector = getattr(tool, '_detect_error_in_response', None) + if detector is None: + return None + return detector(function_response) + except Exception: # pylint: disable=broad-exception-caught + # Never let telemetry logic break tool execution. + logger.exception( + 'Error while detecting error type for telemetry from tool %r.', + getattr(tool, 'name', tool), + ) + return None + + def _is_live_request_queue_annotation(param: inspect.Parameter) -> bool: """Check whether a parameter is annotated as LiveRequestQueue. @@ -482,6 +524,7 @@ async def _run_on_tool_error_callbacks( function_args = ( copy.deepcopy(function_call.args) if function_call.args else {} ) + detected_error_type: Optional[str] = None tool_context = _create_tool_context( invocation_context, function_call, tool_confirmation @@ -505,7 +548,7 @@ async def _run_on_tool_error_callbacks( raise tool_error async def _run_with_trace(): - nonlocal function_args + nonlocal function_args, detected_error_type # Step 1: Check if plugin before_tool_callback overrides the function # response. @@ -576,11 +619,19 @@ async def _run_with_trace(): if altered_function_response is not None: function_response = altered_function_response - if tool.is_long_running: - # Allow long-running function to return None to not provide function - # response. - if not function_response: - return None + if ( + tool.is_long_running or tool._defers_response + ) and not function_response: + # The tool either runs long (FR will arrive later via session + # injection) or defers its response by design (e.g., the LlmAgent + # wrapper for task delegation synthesizes the FR after the + # sub-agent completes). Either way, skip the auto-FR build when + # the tool returned nothing. + return None + + detected_error_type = _detect_error_type_for_telemetry( + tool, tool_context, function_response + ) # Note: State deltas are not applied here - they are collected in # tool_context.actions.state_delta and applied later when the session @@ -596,6 +647,7 @@ async def _run_with_trace(): tool, agent, function_args ) as tel_ctx: tel_ctx.function_response_event = await _run_with_trace() + tel_ctx.error_type = detected_error_type return tel_ctx.function_response_event @@ -714,6 +766,7 @@ async def _run_on_tool_error_callbacks( function_args = ( copy.deepcopy(function_call.args) if function_call.args else {} ) + detected_error_type: Optional[str] = None tool_context = _create_tool_context(invocation_context, function_call) @@ -734,7 +787,7 @@ async def _run_on_tool_error_callbacks( raise tool_error async def _run_with_trace(): - nonlocal function_args + nonlocal function_args, detected_error_type # Do not use "args" as the variable name, because it is a reserved keyword # in python debugger. @@ -815,10 +868,17 @@ async def _run_with_trace(): if altered_function_response is not None: function_response = altered_function_response - if tool.is_long_running: - # Allow async function to return None to not provide function response. - if not function_response: - return None + if ( + tool.is_long_running or tool._defers_response + ) and not function_response: + # The tool either runs long (FR will arrive later via session + # injection) or defers its response by design. Skip the auto-FR + # build when the tool returned nothing. + return None + + detected_error_type = _detect_error_type_for_telemetry( + tool, tool_context, function_response + ) # Note: State deltas are not applied here - they are collected in # tool_context.actions.state_delta and applied later when the session @@ -834,6 +894,7 @@ async def _run_with_trace(): tool, agent, function_args ) as tel_ctx: tel_ctx.function_response_event = await _run_with_trace() + tel_ctx.error_type = detected_error_type return tel_ctx.function_response_event diff --git a/src/google/adk/flows/llm_flows/identity.py b/src/google/adk/flows/llm_flows/identity.py index 76d62d8de4..7ee95932c2 100644 --- a/src/google/adk/flows/llm_flows/identity.py +++ b/src/google/adk/flows/llm_flows/identity.py @@ -34,10 +34,11 @@ async def run_async( self, invocation_context: InvocationContext, llm_request: LlmRequest ) -> AsyncGenerator[Event, None]: agent = invocation_context.agent - si = f'You are an agent. Your internal name is "{agent.name}".' - if agent.description: - si += f' The description about you is "{agent.description}".' - llm_request.append_instructions([si]) + if getattr(agent, 'mode', None) != 'single_turn': + si = f'You are an agent. Your internal name is "{agent.name}".' + if agent.description: + si += f' The description about you is "{agent.description}".' + llm_request.append_instructions([si]) # Maintain async generator behavior if False: # Ensures it behaves as a generator diff --git a/src/google/adk/integrations/bigquery/metadata_tool.py b/src/google/adk/integrations/bigquery/metadata_tool.py index 1f67a98908..d9046da5fc 100644 --- a/src/google/adk/integrations/bigquery/metadata_tool.py +++ b/src/google/adk/integrations/bigquery/metadata_tool.py @@ -87,8 +87,7 @@ def get_dataset_info( "kind": "bigquery#dataset", "etag": "fz9BaiXKgbGi53EpI2rJug==", "id": "bigquery-public-data:cdc_places", - "selfLink": - "https://content-bigquery.googleapis.com/bigquery/v2/projects/bigquery-public-data/datasets/cdc_places", + "selfLink": "https://content-bigquery.googleapis.com/bigquery/v2/projects/bigquery-public-data/datasets/cdc_places", "datasetReference": { "datasetId": "cdc_places", "projectId": "bigquery-public-data" @@ -105,8 +104,7 @@ def get_dataset_info( }, { "role": "OWNER", - "userByEmail": - "some-redacted-email@bigquery-public-data.iam.gserviceaccount.com" + "userByEmail": "some-redacted-email@bigquery-public-data.iam.gserviceaccount.com" }, { "role": "READER", @@ -199,15 +197,12 @@ def get_table_info( dict: Dictionary representing the properties of the table. Examples: - >>> get_table_info("bigquery-public-data", "cdc_places", - "local_data_for_better_health_county_data") + >>> get_table_info("bigquery-public-data", "cdc_places", "local_data_for_better_health_county_data") { "kind": "bigquery#table", "etag": "wx23aDqmgc39oUSiNuYTAA==", - "id": - "bigquery-public-data:cdc_places.local_data_for_better_health_county_data", - "selfLink": - "https://content-bigquery.googleapis.com/bigquery/v2/projects/bigquery-public-data/datasets/cdc_places/tables/local_data_for_better_health_county_data", + "id": "bigquery-public-data:cdc_places.local_data_for_better_health_county_data", + "selfLink": "https://content-bigquery.googleapis.com/bigquery/v2/projects/bigquery-public-data/datasets/cdc_places/tables/local_data_for_better_health_county_data", "tableReference": { "projectId": "bigquery-public-data", "datasetId": "cdc_places", @@ -310,10 +305,7 @@ def get_job_info( credentials: Credentials, settings: BigQueryToolConfig, ) -> dict: - """Get metadata information about a BigQuery job. - - Including slot usage, - + """Get metadata information about a BigQuery job. Including slot usage, job configuration, job statistics, job status, original query etc. Args: @@ -340,9 +332,7 @@ def get_job_info( "tableId": "anonfbbe65d6_9782_469b_9f56_1392560314b2" }, "priority": "INTERACTIVE", - "query": "SELECT * FROM `projectid.dataset_id.table_id` WHERE - TIMESTAMP_TRUNC(_PARTITIONTIME, DAY) = TIMESTAMP(\"2025-10-29\") - LIMIT 1000", + "query": "SELECT * FROM `projectid.dataset_id.table_id` WHERE TIMESTAMP_TRUNC(_PARTITIONTIME, DAY) = TIMESTAMP(\"2025-10-29\") LIMIT 1000", "useLegacySql": false, "writeDisposition": "WRITE_TRUNCATE" } @@ -359,8 +349,7 @@ def get_job_info( }, "kind": "bigquery#job", "principal_subject": "user:abc@google.com", - "selfLink": - "https://bigquery.googleapis.com/bigquery/v2/projects/projectid/jobs/job-id?location=US", + "selfLink": "https://bigquery.googleapis.com/bigquery/v2/projects/projectid/jobs/job-id?location=US", "statistics": { "creationTime": 1761760370152, "endTime": 1761760371250, @@ -409,19 +398,9 @@ def get_job_info( { "kind": "READ", "substeps": [ - "$2:extendedFields.$is_not_null, - $3:extendedFields.traceId, $4:span.$is_not_null, - $5:span.spanKind, $6:span.endTime, $7:span.startTime, - $8:span.parentSpanId, $9:span.spanId, $10:span.name, - $11:span.childSpanCount.$is_not_null, - $12:span.childSpanCount.value, - $13:span.sameProcessAsParentSpan.$is_not_null, - $14:span.sameProcessAsParentSpan.value, - $15:span.status.$is_not_null, $16:span.status.message, - $17:span.status.code", + "$2:extendedFields.$is_not_null, $3:extendedFields.traceId, $4:span.$is_not_null, $5:span.spanKind, $6:span.endTime, $7:span.startTime, $8:span.parentSpanId, $9:span.spanId, $10:span.name, $11:span.childSpanCount.$is_not_null, $12:span.childSpanCount.value, $13:span.sameProcessAsParentSpan.$is_not_null, $14:span.sameProcessAsParentSpan.value, $15:span.status.$is_not_null, $16:span.status.message, $17:span.status.code", "FROM projectid.dataset_id.table_id", - "WHERE equal(timestamp_trunc($1, 3), - 1761696000.000000000)" + "WHERE equal(timestamp_trunc($1, 3), 1761696000.000000000)" ] }, { @@ -433,8 +412,7 @@ def get_job_info( { "kind": "WRITE", "substeps": [ - "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, - $14, $15, $16, $17", + "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17", "TO __stage00_output" ] } @@ -477,8 +455,7 @@ def get_job_info( { "kind": "READ", "substeps": [ - "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, - $14, $15, $16, $17", + "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17", "FROM __stage00_output" ] }, @@ -486,9 +463,7 @@ def get_job_info( "kind": "COMPUTE", "substeps": [ "$130 := MAKE_STRUCT($3, $2)", - "$131 := MAKE_STRUCT($10, $9, $8, MAKE_STRUCT($29, $28, - $27), $7, $6, MAKE_STRUCT(...), MAKE_STRUCT(...), - MAKE_STRUCT(...), ...)" + "$131 := MAKE_STRUCT($10, $9, $8, MAKE_STRUCT($29, $28, $27), $7, $6, MAKE_STRUCT(...), MAKE_STRUCT(...), MAKE_STRUCT(...), ...)" ] }, { diff --git a/src/google/adk/integrations/bigquery/query_tool.py b/src/google/adk/integrations/bigquery/query_tool.py index 698f428363..1721db6781 100644 --- a/src/google/adk/integrations/bigquery/query_tool.py +++ b/src/google/adk/integrations/bigquery/query_tool.py @@ -229,8 +229,7 @@ def execute_sql( >>> execute_sql("my_project", ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY - island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") { "status": "SUCCESS", "rows": [ @@ -270,8 +269,7 @@ def execute_sql( "tableId": "anon..." }, "priority": "INTERACTIVE", - "query": "SELECT island FROM - `bigquery-public-data`.`ml_datasets`.`penguins`", + "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", "useLegacySql": False, "writeDisposition": "WRITE_TRUNCATE" } @@ -321,8 +319,7 @@ def _execute_sql_write_mode(*args, **kwargs) -> dict: >>> execute_sql("my_project", ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY - island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") { "status": "SUCCESS", "rows": [ @@ -362,8 +359,7 @@ def _execute_sql_write_mode(*args, **kwargs) -> dict: "tableId": "anon..." }, "priority": "INTERACTIVE", - "query": "SELECT island FROM - `bigquery-public-data`.`ml_datasets`.`penguins`", + "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", "useLegacySql": False, "writeDisposition": "WRITE_TRUNCATE" } @@ -388,8 +384,7 @@ def _execute_sql_write_mode(*args, **kwargs) -> dict: Insert data into an existing table: >>> execute_sql("my_project", - ... "INSERT INTO `my_project`.`my_dataset`.`my_table` (island, - population) " + ... "INSERT INTO `my_project`.`my_dataset`.`my_table` (island, population) " ... "VALUES ('Dream', 124), ('Biscoe', 168)") { "status": "SUCCESS", @@ -401,8 +396,7 @@ def _execute_sql_write_mode(*args, **kwargs) -> dict: >>> execute_sql("my_project", ... "CREATE TABLE `my_project`.`my_dataset`.`my_table` AS " ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY - island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") { "status": "SUCCESS", "rows": [] @@ -431,8 +425,7 @@ def _execute_sql_write_mode(*args, **kwargs) -> dict: table: >>> execute_sql("my_project", - ... "CREATE SNAPSHOT TABLE - `my_project`.`my_dataset`.`my_table_snapshot` " + ... "CREATE SNAPSHOT TABLE `my_project`.`my_dataset`.`my_table_snapshot` " ... "CLONE `my_project`.`my_dataset`.`my_table`") { "status": "SUCCESS", @@ -443,8 +436,7 @@ def _execute_sql_write_mode(*args, **kwargs) -> dict: >>> execute_sql("my_project", ... "CREATE MODEL `my_dataset`.`my_model` " - ... "OPTIONS (model_type='linear_reg', - input_label_cols=['body_mass_g']) AS " + ... "OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS " ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " ... "WHERE body_mass_g IS NOT NULL") { @@ -547,8 +539,7 @@ def _execute_sql_protected_write_mode(*args, **kwargs) -> dict: >>> execute_sql("my_project", ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY - island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") { "status": "SUCCESS", "rows": [ @@ -588,8 +579,7 @@ def _execute_sql_protected_write_mode(*args, **kwargs) -> dict: "tableId": "anon..." }, "priority": "INTERACTIVE", - "query": "SELECT island FROM - `bigquery-public-data`.`ml_datasets`.`penguins`", + "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", "useLegacySql": False, "writeDisposition": "WRITE_TRUNCATE" } @@ -625,8 +615,7 @@ def _execute_sql_protected_write_mode(*args, **kwargs) -> dict: >>> execute_sql("my_project", ... "CREATE TEMP TABLE `my_table` AS " ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY - island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") { "status": "SUCCESS", "rows": [] @@ -653,8 +642,7 @@ def _execute_sql_protected_write_mode(*args, **kwargs) -> dict: >>> execute_sql("my_project", ... "CREATE TEMP MODEL `my_model` " - ... "OPTIONS (model_type='linear_reg', - input_label_cols=['body_mass_g']) AS" + ... "OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS" ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " ... "WHERE body_mass_g IS NOT NULL") { @@ -664,8 +652,7 @@ def _execute_sql_protected_write_mode(*args, **kwargs) -> dict: Evaluate BigQuery ML model: - >>> execute_sql("my_project", "SELECT * FROM ML.EVALUATE(MODEL - `my_model`)") + >>> execute_sql("my_project", "SELECT * FROM ML.EVALUATE(MODEL `my_model`)") { "status": "SUCCESS", "rows": [{'mean_absolute_error': 227.01223667447218, diff --git a/src/google/adk/integrations/bigquery/search_tool.py b/src/google/adk/integrations/bigquery/search_tool.py index 9458d93930..346947762e 100644 --- a/src/google/adk/integrations/bigquery/search_tool.py +++ b/src/google/adk/integrations/bigquery/search_tool.py @@ -51,8 +51,7 @@ def search_catalog( """Finds BigQuery datasets and tables using natural language semantic search via Dataplex. Use this tool to discover BigQuery assets when you don't know the exact names. - It's ideal for searching based on topics, descriptions, or questions about the - data. + It's ideal for searching based on topics, descriptions, or questions about the data. Args: prompt: The base search query (natural language or keywords). diff --git a/src/google/adk/integrations/firestore/firestore_session_service.py b/src/google/adk/integrations/firestore/firestore_session_service.py index 83b97c33c2..e90753be5c 100644 --- a/src/google/adk/integrations/firestore/firestore_session_service.py +++ b/src/google/adk/integrations/firestore/firestore_session_service.py @@ -551,6 +551,7 @@ async def _append_txn(transaction: firestore.AsyncTransaction) -> int: for k, v in session.state.items() if not k.startswith(State.APP_PREFIX) and not k.startswith(State.USER_PREFIX) + and not k.startswith(State.TEMP_PREFIX) } transaction.update( session_ref, diff --git a/src/google/adk/integrations/vmaas/sandbox_computer.py b/src/google/adk/integrations/vmaas/sandbox_computer.py index ade360ed02..9c1c9d68d7 100644 --- a/src/google/adk/integrations/vmaas/sandbox_computer.py +++ b/src/google/adk/integrations/vmaas/sandbox_computer.py @@ -90,6 +90,8 @@ def __init__( location: str = "us-central1", service_account_email: str | None = None, sandbox_name: str | None = None, + sandbox_template_name: str | None = None, + sandbox_snapshot_name: str | None = None, sandbox_ttl_seconds: int = 3600, search_engine_url: str = "https://www.google.com", vertexai_client: "vertexai.Client | None" = None, @@ -108,6 +110,14 @@ def __init__( engine and sandbox on demand. Format: projects/{project}/locations/{location}/reasoningEngines/{id}/sandboxEnvironments/{id} + sandbox_template_name: Sandbox template resource name to use for creating + new sandboxes. Templates allow faster creation and custom environments. + Format: + projects/{project}/locations/{location}/sandboxEnvironmentTemplates/{id} + sandbox_snapshot_name: Sandbox snapshot resource name to use for restoring + sandbox state, enabling faster startup. + Format: + projects/{project}/locations/{location}/reasoningEngines/{id}/sandboxEnvironmentSnapshots/{id} sandbox_ttl_seconds: TTL for auto-created sandboxes (default: 1 hour). search_engine_url: URL to navigate to for search() method. vertexai_client: Optional Vertex AI client instance. If None, creates one @@ -117,6 +127,8 @@ def __init__( self._location = location self._service_account_email = service_account_email self._sandbox_name = sandbox_name + self._sandbox_template_name = sandbox_template_name + self._sandbox_snapshot_name = sandbox_snapshot_name self._sandbox_ttl_seconds = sandbox_ttl_seconds self._search_engine_url = search_engine_url self._screen_size = (1280, 720) @@ -211,13 +223,29 @@ async def _get_sandbox(self) -> tuple[str, Any]: from vertexai import types + config = { + "display_name": "adk_computer_use_sandbox", + } + spec = None + if self._sandbox_template_name: + config["sandbox_environment_template"] = self._sandbox_template_name + logger.info( + "Creating sandbox from template: %s", self._sandbox_template_name + ) + elif self._sandbox_snapshot_name: + config["sandbox_environment_snapshot"] = self._sandbox_snapshot_name + logger.info( + "Creating sandbox from snapshot: %s", self._sandbox_snapshot_name + ) + else: + spec = {"computer_use_environment": {}} + logger.info("Creating sandbox with computer use environment spec") + operation = await asyncio.to_thread( client.agent_engines.sandboxes.create, - spec={"computer_use_environment": {}}, + spec=spec, name=agent_engine_name, - config=types.CreateAgentEngineSandboxConfig( - display_name="adk_computer_use_sandbox" - ), + config=config, ) sandbox_name = operation.response.name @@ -250,7 +278,6 @@ async def _get_access_token(self, sandbox_name: str) -> str: token = await asyncio.to_thread( client.agent_engines.sandboxes.generate_access_token, service_account_email=self._service_account_email, - sandbox_id=sandbox_name, timeout=_DEFAULT_TOKEN_TIMEOUT, ) diff --git a/src/google/adk/labs/README.md b/src/google/adk/labs/README.md new file mode 100644 index 0000000000..4058a38eb9 --- /dev/null +++ b/src/google/adk/labs/README.md @@ -0,0 +1,6 @@ +# ADK Labs + +This folder contains experimental features and integrations for the Agent Development Kit (ADK). + +> [!WARNING] +> All code in this folder is **experimental** and subject to change or deletion at any time without notice. Do not rely on these features for production use. diff --git a/src/google/adk/labs/__init__.py b/src/google/adk/labs/__init__.py new file mode 100644 index 0000000000..11ac63609b --- /dev/null +++ b/src/google/adk/labs/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""ADK Labs.""" diff --git a/src/google/adk/labs/openai/README.md b/src/google/adk/labs/openai/README.md new file mode 100644 index 0000000000..c40bedb830 --- /dev/null +++ b/src/google/adk/labs/openai/README.md @@ -0,0 +1,24 @@ +# OpenAI Integration (Experimental) + +This folder contains an experimental integration for OpenAI models in ADK. + +## Usage in Code + +To use the OpenAI integration in your Python code, instantiate `OpenAILlm` and assign it to your agent's `model` field: + +```python +from google.adk.agents.llm_agent import LlmAgent +from google.adk.labs.openai import OpenAILlm + +# Create the OpenAI model instance +openai_model = OpenAILlm(model="gpt-4o") + +# Create an agent and assign the model +agent = LlmAgent( + name="my_openai_agent", + model=openai_model, + instruction="You are a helpful assistant.", +) +``` + +Requires the `openai` Python package and `OPENAI_API_KEY` environment variable. diff --git a/src/google/adk/labs/openai/__init__.py b/src/google/adk/labs/openai/__init__.py new file mode 100644 index 0000000000..c98481ebfb --- /dev/null +++ b/src/google/adk/labs/openai/__init__.py @@ -0,0 +1,19 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ._openai_llm import OpenAILlm + +__all__ = [ + 'OpenAILlm', +] diff --git a/src/google/adk/labs/openai/_openai_llm.py b/src/google/adk/labs/openai/_openai_llm.py new file mode 100644 index 0000000000..3eaec74011 --- /dev/null +++ b/src/google/adk/labs/openai/_openai_llm.py @@ -0,0 +1,511 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""OpenAI integration for GPT models.""" + +from __future__ import annotations + +import copy +from functools import cached_property +import json +import logging +import os +from typing import Any +from typing import AsyncGenerator +from typing import Iterable +from typing import Literal +from typing import Union + +from google.genai import types + +try: + from openai import AsyncOpenAI + from openai.types.chat import ChatCompletion + from openai.types.chat import ChatCompletionChunk + from openai.types.chat import ChatCompletionContentPartImageParam + from openai.types.chat import ChatCompletionMessage + from openai.types.chat import ChatCompletionMessageParam + from openai.types.chat import ChatCompletionToolParam +except ImportError as e: + raise ImportError( + "The 'openai' package is not installed. Please install it with " + "`pip install openai` to use the OpenAILlm." + ) from e + +from pydantic import BaseModel +from typing_extensions import override + +from ...models.base_llm import BaseLlm +from ...models.llm_request import LlmRequest +from ...models.llm_response import LlmResponse + +logger = logging.getLogger("google_adk." + __name__) + +__all__ = ["OpenAILlm"] + + +def _to_openai_role( + role: str | None, +) -> Literal["system", "user", "assistant", "tool"]: + if role in ["model", "assistant"]: + return "assistant" + if role == "system": + return "system" + if role == "tool": + return "tool" + return "user" + + +def _part_to_openai_content( + part: types.Part, +) -> str | ChatCompletionContentPartImageParam: + """Converts a genai Part to OpenAI content.""" + if part.thought and part.text: + return f"Thought: {part.text}" + if part.text: + return part.text + + if part.inline_data: + import base64 + + mime_type = part.inline_data.mime_type + data = part.inline_data.data + if isinstance(data, bytes): + encoded = base64.b64encode(data).decode("utf-8") + else: + encoded = str(data) + return { + "type": "image_url", + "image_url": {"url": f"data:{mime_type};base64,{encoded}"}, + } + + if part.file_data: + if part.file_data.file_uri and part.file_data.file_uri.startswith("http"): + return { + "type": "image_url", + "image_url": {"url": part.file_data.file_uri}, + } + + return "" + + +def _content_to_openai_messages( + content: types.Content, +) -> list[ChatCompletionMessageParam]: + """Converts a types.Content to a list of OpenAI messages.""" + messages = [] + role = _to_openai_role(content.role) + + tool_calls = [] + content_parts = [] + + for part in content.parts or []: + if part.function_call: + tool_calls.append({ + "id": part.function_call.id or "", + "type": "function", + "function": { + "name": part.function_call.name, + "arguments": ( + json.dumps(part.function_call.args) + if part.function_call.args + else "{}" + ), + }, + }) + elif part.function_response: + messages.append({ + "role": "tool", + "tool_call_id": part.function_response.id or "", + "content": ( + json.dumps(part.function_response.response) + if part.function_response.response is not None + else "" + ), + }) + else: + content_parts.append(_part_to_openai_content(part)) + + processed_parts = [] + for c in content_parts: + if isinstance(c, str) and c: + processed_parts.append({"type": "text", "text": c}) + elif isinstance(c, dict): + processed_parts.append(c) + + has_images = any(p.get("type") == "image_url" for p in processed_parts) + + if not has_images: + content_val = "\n".join( + [p["text"] for p in processed_parts if p["type"] == "text"] + ) + else: + content_val = processed_parts + + if role == "assistant" and (content_val or tool_calls): + msg = {"role": "assistant"} + if content_val: + msg["content"] = content_val + if tool_calls: + msg["tool_calls"] = tool_calls + messages.append(msg) + elif role == "user" and content_val: + messages.append({ + "role": "user", + "content": content_val, + }) + elif role == "system" and content_val: + if isinstance(content_val, list): + text_only = "\n".join( + [p["text"] for p in content_val if p["type"] == "text"] + ) + messages.append({ + "role": "system", + "content": text_only, + }) + else: + messages.append({ + "role": "system", + "content": content_val, + }) + + return messages + + +def _enforce_strict_openai_schema(schema: dict[str, Any]) -> None: + """Recursively transforms a JSON schema for OpenAI strict structured outputs.""" + if not isinstance(schema, dict): + return + if "$ref" in schema: + for key in list(schema.keys()): + if key != "$ref": + del schema[key] + return + if schema.get("type") == "object" and "properties" in schema: + schema["additionalProperties"] = False + schema["required"] = sorted(schema["properties"].keys()) + for defn in schema.get("$defs", {}).values(): + _enforce_strict_openai_schema(defn) + for prop in schema.get("properties", {}).values(): + _enforce_strict_openai_schema(prop) + for key in ("anyOf", "oneOf", "allOf"): + for item in schema.get(key, []): + _enforce_strict_openai_schema(item) + if "items" in schema and isinstance(schema["items"], dict): + _enforce_strict_openai_schema(schema["items"]) + + +def _update_type_string(value: Any): + """Lowercases nested JSON schema type strings for OpenAI compatibility.""" + if isinstance(value, list): + for item in value: + _update_type_string(item) + return + + if not isinstance(value, dict): + return + + schema_type = value.get("type") + if isinstance(schema_type, str): + value["type"] = schema_type.lower() + + for dict_key in ( + "$defs", + "defs", + "dependentSchemas", + "patternProperties", + "properties", + ): + child_dict = value.get(dict_key) + if isinstance(child_dict, dict): + for child_value in child_dict.values(): + _update_type_string(child_value) + + for single_key in ( + "additionalProperties", + "additional_properties", + "contains", + "else", + "if", + "items", + "not", + "propertyNames", + "then", + "unevaluatedProperties", + ): + child_value = value.get(single_key) + if isinstance(child_value, (dict, list)): + _update_type_string(child_value) + + for list_key in ( + "allOf", + "all_of", + "anyOf", + "any_of", + "oneOf", + "one_of", + "prefixItems", + ): + child_list = value.get(list_key) + if isinstance(child_list, list): + _update_type_string(child_list) + + +def _function_declaration_to_openai_tool( + function_declaration: types.FunctionDeclaration, +) -> ChatCompletionToolParam: + """Converts a function declaration to an OpenAI tool param.""" + if not function_declaration.name: + raise ValueError("FunctionDeclaration must have a name.") + + # Use parameters_json_schema if available, otherwise convert from parameters + if function_declaration.parameters_json_schema: + parameters = copy.deepcopy(function_declaration.parameters_json_schema) + _update_type_string(parameters) + else: + properties = {} + required_params = [] + if function_declaration.parameters: + if function_declaration.parameters.properties: + for key, value in function_declaration.parameters.properties.items(): + properties[key] = value.model_dump(by_alias=True, exclude_none=True) + if function_declaration.parameters.required: + required_params = function_declaration.parameters.required + + parameters = { + "type": "object", + "properties": properties, + } + if required_params: + parameters["required"] = required_params + _update_type_string(parameters) + + return { + "type": "function", + "function": { + "name": function_declaration.name, + "description": function_declaration.description or "", + "parameters": parameters, + }, + } + + +def _response_to_llm_response(response: ChatCompletion) -> LlmResponse: + """Parses an OpenAI response into an LlmResponse.""" + choice = response.choices[0] + message = choice.message + + parts = [] + if message.content: + parts.append(types.Part.from_text(text=message.content)) + + if message.tool_calls: + for tool_call in message.tool_calls: + args = {} + if tool_call.function.arguments: + try: + args = json.loads(tool_call.function.arguments) + except json.JSONDecodeError: + logger.warning("Failed to parse tool call arguments as JSON.") + + part = types.Part.from_function_call( + name=tool_call.function.name, args=args + ) + part.function_call.id = tool_call.id + parts.append(part) + + return LlmResponse( + content=types.Content( + role="model", + parts=parts, + ), + usage_metadata=types.GenerateContentResponseUsageMetadata( + prompt_token_count=response.usage.prompt_tokens, + candidates_token_count=response.usage.completion_tokens, + total_token_count=response.usage.total_tokens, + ), + ) + + +class OpenAILlm(BaseLlm): + """Integration with OpenAI models. + + Attributes: + model: The name of the OpenAI model. + max_tokens: The maximum number of tokens to generate. + """ + + model: str = "gpt-4o" + max_tokens: int = 4096 + + @classmethod + @override + def supported_models(cls) -> list[str]: + return [r"gpt-.*", r"o1-.*", r"o3-.*"] + + @override + async def generate_content_async( + self, llm_request: LlmRequest, stream: bool = False + ) -> AsyncGenerator[LlmResponse, None]: + messages = [] + if llm_request.config and llm_request.config.system_instruction: + messages.append({ + "role": "system", + "content": llm_request.config.system_instruction, + }) + + for content in llm_request.contents or []: + messages.extend(_content_to_openai_messages(content)) + + tools = [] + if ( + llm_request.config + and llm_request.config.tools + and llm_request.config.tools[0].function_declarations + ): + tools = [ + _function_declaration_to_openai_tool(tool) + for tool in llm_request.config.tools[0].function_declarations + ] + + tool_choice = "auto" if tools else None + + response_format = None + if llm_request.config and llm_request.config.response_schema: + schema = llm_request.config.response_schema + schema_name = "response" + schema_dict = {} + + if isinstance(schema, type) and issubclass(schema, BaseModel): + schema_dict = schema.model_json_schema() + schema_name = schema.__name__ + elif isinstance(schema, BaseModel): + schema_dict = schema.__class__.model_json_schema() + schema_name = schema.__class__.__name__ + elif isinstance(schema, dict): + schema_dict = copy.deepcopy(schema) + if "title" in schema_dict: + schema_name = str(schema_dict["title"]) + + if schema_dict: + _enforce_strict_openai_schema(schema_dict) + response_format = { + "type": "json_schema", + "json_schema": { + "name": schema_name, + "strict": True, + "schema": schema_dict, + }, + } + elif ( + llm_request.config + and llm_request.config.response_mime_type == "application/json" + ): + response_format = {"type": "json_object"} + + kwargs = { + "model": self.model, + "messages": messages, + "tools": tools if tools else None, + "tool_choice": tool_choice, + "max_tokens": self.max_tokens, + "response_format": response_format, + } + + if llm_request.config: + if getattr(llm_request.config, "temperature", None) is not None: + kwargs["temperature"] = llm_request.config.temperature + if getattr(llm_request.config, "top_p", None) is not None: + kwargs["top_p"] = llm_request.config.top_p + if getattr(llm_request.config, "stop_sequences", None): + kwargs["stop"] = llm_request.config.stop_sequences + if getattr(llm_request.config, "max_output_tokens", None) is not None: + kwargs["max_tokens"] = llm_request.config.max_output_tokens + + if not stream: + response = await self._openai_client.chat.completions.create(**kwargs) + yield _response_to_llm_response(response) + else: + async for response in self._generate_content_streaming(kwargs): + yield response + + async def _generate_content_streaming( + self, + kwargs: dict[str, Any], + ) -> AsyncGenerator[LlmResponse, None]: + """Handles streaming responses from OpenAI models.""" + kwargs["stream"] = True + raw_stream = await self._openai_client.chat.completions.create(**kwargs) + + text_accumulated = "" + tool_calls_accumulated: dict[int, dict[str, Any]] = {} + + async for chunk in raw_stream: + if not chunk.choices: + continue + choice = chunk.choices[0] + delta = choice.delta + + if delta.content: + text_accumulated += delta.content + yield LlmResponse( + content=types.Content( + role="model", + parts=[types.Part.from_text(text=delta.content)], + ), + partial=True, + ) + + if delta.tool_calls: + for tc_delta in delta.tool_calls: + index = tc_delta.index + if index not in tool_calls_accumulated: + tool_calls_accumulated[index] = { + "id": tc_delta.id, + "name": tc_delta.function.name, + "arguments": "", + } + if tc_delta.function.arguments: + tool_calls_accumulated[index][ + "arguments" + ] += tc_delta.function.arguments + + # Yield final response with all accumulated content + parts = [] + if text_accumulated: + parts.append(types.Part.from_text(text=text_accumulated)) + + for index in sorted(tool_calls_accumulated.keys()): + acc = tool_calls_accumulated[index] + args = {} + if acc["arguments"]: + try: + args = json.loads(acc["arguments"]) + except json.JSONDecodeError: + logger.warning( + "Failed to parse accumulated tool call arguments as JSON." + ) + + part = types.Part.from_function_call(name=acc["name"], args=args) + part.function_call.id = acc["id"] + parts.append(part) + + yield LlmResponse( + content=types.Content(role="model", parts=parts), + partial=False, + ) + + @cached_property + def _openai_client(self) -> AsyncOpenAI: + return AsyncOpenAI() diff --git a/src/google/adk/memory/__init__.py b/src/google/adk/memory/__init__.py index d40f3bf7d9..1361b34e36 100644 --- a/src/google/adk/memory/__init__.py +++ b/src/google/adk/memory/__init__.py @@ -17,6 +17,7 @@ import importlib from typing import TYPE_CHECKING +from ..utils._dependency import missing_extra from .base_memory_service import BaseMemoryService if TYPE_CHECKING: diff --git a/src/google/adk/memory/vertex_ai_memory_bank_service.py b/src/google/adk/memory/vertex_ai_memory_bank_service.py index 0906e9a6ba..c5ef2936b8 100644 --- a/src/google/adk/memory/vertex_ai_memory_bank_service.py +++ b/src/google/adk/memory/vertex_ai_memory_bank_service.py @@ -203,6 +203,13 @@ def __init__( 'agent_engine_id is required for VertexAiMemoryBankService.' ) + try: + import vertexai + except ImportError as e: + from ..utils._dependency import missing_extra + + raise missing_extra('google-cloud-aiplatform', 'gcp') from e + self._project = project self._location = location self._agent_engine_id = agent_engine_id diff --git a/src/google/adk/memory/vertex_ai_rag_memory_service.py b/src/google/adk/memory/vertex_ai_rag_memory_service.py index fb81508ddd..697c7f07ed 100644 --- a/src/google/adk/memory/vertex_ai_rag_memory_service.py +++ b/src/google/adk/memory/vertex_ai_rag_memory_service.py @@ -108,6 +108,13 @@ def __init__( vector_distance_threshold: Only returns contexts with vector distance smaller than the threshold. """ + try: + import vertexai + except ImportError as e: + from ..utils._dependency import missing_extra + + raise missing_extra("google-cloud-aiplatform", "gcp") from e + self._vertex_rag_store = types.VertexRagStore( rag_resources=[ types.VertexRagStoreRagResource(rag_corpus=rag_corpus), diff --git a/src/google/adk/models/__init__.py b/src/google/adk/models/__init__.py index 1f42993c88..0178cefb2d 100644 --- a/src/google/adk/models/__init__.py +++ b/src/google/adk/models/__init__.py @@ -25,6 +25,8 @@ from .registry import LLMRegistry if TYPE_CHECKING: + from google.adk.labs.openai import OpenAILlm + from .anthropic_llm import Claude from .apigee_llm import ApigeeLlm from .gemma_llm import Gemma @@ -57,6 +59,10 @@ 'ApigeeLlm': ([r'.*-apigee$'], 'apigee_llm'), 'Claude': ([r'claude-3-.*', r'claude-.*-4.*'], 'anthropic_llm'), 'Gemma3Ollama': ([r'ollama/gemma3.*'], 'gemma_llm'), + 'OpenAILlm': ( + [r'gpt-.*', r'o1-.*', r'o3-.*'], + 'google.adk.labs.openai', + ), 'LiteLlm': ( [ r'openai/.*', @@ -81,14 +87,20 @@ } for _name, (_patterns, _module) in _LAZY_PROVIDERS.items(): - LLMRegistry._register_lazy(_patterns, f'{__name__}.{_module}', _name) + _target_module = ( + _module if _module.startswith('google.adk.') else f'{__name__}.{_module}' + ) + LLMRegistry._register_lazy(_patterns, _target_module, _name) def __getattr__(name: str): if name in _LAZY_PROVIDERS: module_name = _LAZY_PROVIDERS[name][1] try: - module = importlib.import_module(f'{__name__}.{module_name}') + if module_name.startswith('google.adk.'): + module = importlib.import_module(module_name) + else: + module = importlib.import_module(f'{__name__}.{module_name}') except ImportError as e: raise ImportError( f'`{name}` requires an optional dependency that is not installed.' diff --git a/src/google/adk/models/gemini_llm_connection.py b/src/google/adk/models/gemini_llm_connection.py index 11ed8386e1..4c10885f27 100644 --- a/src/google/adk/models/gemini_llm_connection.py +++ b/src/google/adk/models/gemini_llm_connection.py @@ -159,7 +159,12 @@ async def send_realtime(self, input: RealtimeInput): else: raise ValueError('Unsupported input type: %s' % type(input)) - def __build_full_text_response(self, text: str): + def __build_full_text_response( + self, + text: str, + is_thought: bool = False, + grounding_metadata: types.GroundingMetadata | None = None, + ): """Builds a full text response. The text should not be partial and the returned LlmResponse is not @@ -167,15 +172,22 @@ def __build_full_text_response(self, text: str): Args: text: The text to be included in the response. + is_thought: Whether the text is a thought. + grounding_metadata: The grounding metadata to include. Returns: An LlmResponse containing the full text. """ + part = types.Part.from_text(text=text) + if is_thought: + part.thought = True return LlmResponse( content=types.Content( role='model', - parts=[types.Part.from_text(text=text)], + parts=[part], ), + grounding_metadata=grounding_metadata, + partial=False, live_session_id=self._gemini_session.session_id, ) @@ -187,7 +199,9 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: """ text = '' + is_thought = False tool_call_parts = [] + pending_grounding_metadata = None async with Aclosing(self._gemini_session.receive()) as agen: # TODO(b/440101573): Reuse StreamingResponseAggregator to accumulate # partial content and emit responses as needed. @@ -203,6 +217,10 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: ) if message.server_content: content = message.server_content.model_turn + if message.server_content.grounding_metadata: + pending_grounding_metadata = ( + message.server_content.grounding_metadata + ) # Standalone grounding_metadata event (when content is empty) if ( @@ -215,6 +233,9 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: interrupted=message.server_content.interrupted, model_version=self._model_version, live_session_id=live_session_id, + turn_complete_reason=getattr( + message.server_content, 'turn_complete_reason', None + ), ) if content and content.parts: @@ -223,6 +244,9 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: interrupted=message.server_content.interrupted, model_version=self._model_version, live_session_id=live_session_id, + turn_complete_reason=getattr( + message.server_content, 'turn_complete_reason', None + ), ) # grounding_metadata is yielded again at turn_complete, # so avoid duplicating it here if turn_complete is true. @@ -231,12 +255,20 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: message.server_content.grounding_metadata ) if content.parts[0].text: + current_is_thought = getattr(content.parts[0], 'thought', False) + if text and current_is_thought != is_thought: + yield self.__build_full_text_response(text, is_thought) + text = '' + is_thought = False + text += content.parts[0].text + is_thought = current_is_thought llm_response.partial = True # don't yield the merged text event when receiving audio data elif text and not content.parts[0].inline_data: - yield self.__build_full_text_response(text) + yield self.__build_full_text_response(text, is_thought) text = '' + is_thought = False yield llm_response # Note: in some cases, tool_call may arrive before # generation_complete, causing transcription to appear after @@ -293,10 +325,10 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: live_session_id=live_session_id, ) self._output_transcription_text = '' - # The Gemini API might not send a transcription finished signal. + # The Gemini API or Vertex AI might not send a transcription finished signal. # Instead, we rely on generation_complete, turn_complete or # interrupted signals to flush any pending transcriptions. - if self._api_backend == GoogleLLMVariant.GEMINI_API and ( + if ( message.server_content.interrupted or message.server_content.turn_complete or message.server_content.generation_complete @@ -324,9 +356,14 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: ) self._output_transcription_text = '' if message.server_content.turn_complete: + g_metadata_to_yield = pending_grounding_metadata if text: - yield self.__build_full_text_response(text) + yield self.__build_full_text_response( + text, is_thought, g_metadata_to_yield + ) text = '' + is_thought = False + g_metadata_to_yield = None if tool_call_parts: logger.debug('Returning aggregated tool_call_parts') yield LlmResponse( @@ -338,9 +375,13 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: yield LlmResponse( turn_complete=True, interrupted=message.server_content.interrupted, - grounding_metadata=message.server_content.grounding_metadata, + grounding_metadata=message.server_content.grounding_metadata + or g_metadata_to_yield, model_version=self._model_version, live_session_id=live_session_id, + turn_complete_reason=getattr( + message.server_content, 'turn_complete_reason', None + ), ) break # in case of empty content or parts, we still surface it @@ -349,8 +390,9 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: # safety threshold is triggered if message.server_content.interrupted: if text: - yield self.__build_full_text_response(text) + yield self.__build_full_text_response(text, is_thought) text = '' + is_thought = False else: yield LlmResponse( interrupted=message.server_content.interrupted, @@ -360,8 +402,9 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: if message.tool_call: logger.debug('Received tool call: %s', message.tool_call) if text: - yield self.__build_full_text_response(text) + yield self.__build_full_text_response(text, is_thought) text = '' + is_thought = False tool_call_parts.extend([ types.Part(function_call=function_call) for function_call in message.tool_call.function_calls diff --git a/src/google/adk/models/interactions_utils.py b/src/google/adk/models/interactions_utils.py index 89ffe6be71..bc782aeb93 100644 --- a/src/google/adk/models/interactions_utils.py +++ b/src/google/adk/models/interactions_utils.py @@ -31,25 +31,54 @@ from __future__ import annotations import base64 +import binascii import json import logging -from typing import Any from typing import AsyncGenerator -from typing import Optional from typing import TYPE_CHECKING from google.genai import types +from google.genai.interactions import AudioContentParam +from google.genai.interactions import CodeExecutionCallStep +from google.genai.interactions import CodeExecutionCallStepParam +from google.genai.interactions import CodeExecutionResultStep +from google.genai.interactions import CodeExecutionResultStepParam +from google.genai.interactions import ContentParam +from google.genai.interactions import DocumentContentParam +from google.genai.interactions import ErrorEvent +from google.genai.interactions import FunctionCallStep +from google.genai.interactions import FunctionCallStepParam +from google.genai.interactions import FunctionParam +from google.genai.interactions import FunctionResultStep +from google.genai.interactions import FunctionResultStepParam +from google.genai.interactions import GenerationConfigParam +from google.genai.interactions import GoogleSearchResultStep +from google.genai.interactions import ImageContentParam +from google.genai.interactions import Interaction +from google.genai.interactions import InteractionCompletedEvent +from google.genai.interactions import InteractionCreatedEvent +from google.genai.interactions import InteractionSSEEvent +from google.genai.interactions import InteractionStatusUpdate +from google.genai.interactions import ModelOutputStep +from google.genai.interactions import ModelOutputStepParam +from google.genai.interactions import Step +from google.genai.interactions import StepDelta +from google.genai.interactions import StepParam +from google.genai.interactions import StepStart +from google.genai.interactions import StepStop +from google.genai.interactions import TextContentParam +from google.genai.interactions import ThoughtStep +from google.genai.interactions import ThoughtStepParam +from google.genai.interactions import ToolParam +from google.genai.interactions import UserInputStepParam +from google.genai.interactions import VideoContentParam +from typing_extensions import deprecated if TYPE_CHECKING: from google.genai import Client - from google.genai._interactions.types.interaction import Output - from google.genai._interactions.types.tool_param import ToolParam - from google.genai._interactions.types.turn_param import TurnParam - from google.genai.interactions_types import Interaction - from google.genai.interactions_types import InteractionSSEEvent - from .llm_request import LlmRequest - from .llm_response import LlmResponse +from .llm_request import LlmRequest +from .llm_response import LlmResponse logger = logging.getLogger('google_adk.' + __name__) @@ -57,8 +86,8 @@ def _extract_stream_interaction_id( - event: 'InteractionSSEEvent', -) -> Optional[str]: + event: InteractionSSEEvent, +) -> str | None: """Extract the interaction ID from an Interactions SSE event. Different SSE lifecycle events expose the interaction ID on different @@ -67,26 +96,49 @@ def _extract_stream_interaction_id( google-genai builds may also yield a legacy ``interaction`` event with a top-level ``id``. """ - from google.genai._interactions.types.interaction_complete_event import InteractionCompleteEvent - from google.genai._interactions.types.interaction_start_event import InteractionStartEvent - from google.genai._interactions.types.interaction_status_update import InteractionStatusUpdate - if isinstance(event, InteractionStatusUpdate): return event.interaction_id - if isinstance(event, (InteractionStartEvent, InteractionCompleteEvent)): + if isinstance(event, (InteractionCreatedEvent, InteractionCompletedEvent)): return event.interaction.id - try: - if event.event_type == 'interaction': - return event.id - except AttributeError: - pass + if isinstance(event, Interaction): + return event.id return None -def convert_part_to_interaction_content(part: types.Part) -> Optional[dict]: +def _decode_base64_string(signature: str | None) -> bytes | None: + """Decode a base64 encoded string.""" + if not signature or not isinstance(signature, str): + return None + + try: + return base64.b64decode(signature) + except binascii.Error as e: + logger.error('Failed to decode base64 string: %s', e) + return None + + +def _encode_base64_string(data: bytes) -> str: + """Encode bytes to a base64 string.""" + return base64.b64encode(data).decode('utf-8') + + +def _wrap_content_param_in_step( + content_param: ContentParam, role: str +) -> StepParam: + """Wraps a ContentParam into a UserInputStepParam or ModelOutputStepParam.""" + if role == 'model': + return ModelOutputStepParam(type='model_output', content=[content_param]) + return UserInputStepParam(type='user_input', content=[content_param]) + + +@deprecated( + 'convert_part_to_interaction_content is deprecated and will be removed in' + ' future versions' +) +def convert_part_to_interaction_content(part: types.Part) -> dict | None: """Convert a types.Part to an interaction content dict. Args: @@ -213,45 +265,185 @@ def convert_part_to_interaction_content(part: types.Part) -> Optional[dict]: return None -def convert_content_to_turn(content: types.Content) -> TurnParam: - """Convert a types.Content to a TurnParam dict for interactions API. +def _convert_part_to_interaction_content( + part: types.Part, + role: str = 'user', +) -> StepParam | None: + """Convert a types.Part to an interaction content dict. + + Args: + part: The Part object to convert. + role: The role to wrap the content in ('user' or 'model'). + + Returns: + A StepParam dict representing the interaction content, or None if + the part type is not supported. + """ + if part.text is not None: + return _wrap_content_param_in_step( + TextContentParam(type='text', text=part.text), role + ) + elif part.function_call is not None: + func_call_step = FunctionCallStepParam( + type='function_call', + id=part.function_call.id or '', + name=part.function_call.name or '', + arguments=part.function_call.args or {}, + ) + if part.thought_signature is not None: + func_call_step['signature'] = _encode_base64_string( + part.thought_signature + ) + return func_call_step + elif part.function_response is not None: + + # genai.types.FunctionResponse specifies that + # an error response should be inside an error key + func_resp = part.function_response.response + is_error = False + if isinstance(func_resp, dict) and 'error' in func_resp: + is_error = True + + # Pass the function response through to the interactions API. + # Dict and list values are passed directly — the Interactions API handles + # JSON serialization internally. Pre-serializing with json.dumps() would + # cause double-escaping. + if not isinstance(func_resp, (dict, str, list)): + func_resp = str(func_resp) + logger.debug( + 'Converting function_response: name=%s, call_id=%s', + part.function_response.name, + part.function_response.id, + ) + return FunctionResultStepParam( + type='function_result', + name=part.function_response.name or '', + call_id=part.function_response.id or '', + result=func_resp, + is_error=is_error, + ) + elif part.inline_data is not None: + mime_type = part.inline_data.mime_type or '' + # The interactions API requires inline data to be a base64 encoded string + # when serialized to JSON, otherwise openapi_dumps will raise a TypeError. + data = part.inline_data.data + if isinstance(data, bytes): + data = _encode_base64_string(data) + + if mime_type.startswith('image/'): + return _wrap_content_param_in_step( + ImageContentParam(type='image', data=data, mime_type=mime_type), role + ) + elif mime_type.startswith('audio/'): + return _wrap_content_param_in_step( + AudioContentParam(type='audio', data=data, mime_type=mime_type), role + ) + elif mime_type.startswith('video/'): + return _wrap_content_param_in_step( + VideoContentParam(type='video', data=data, mime_type=mime_type), role + ) + else: + return _wrap_content_param_in_step( + DocumentContentParam(type='document', data=data, mime_type=mime_type), + role, + ) + elif part.file_data is not None: + mime_type = part.file_data.mime_type or '' + if mime_type.startswith('image/'): + return _wrap_content_param_in_step( + ImageContentParam( + type='image', uri=part.file_data.file_uri, mime_type=mime_type + ), + role, + ) + elif mime_type.startswith('audio/'): + return _wrap_content_param_in_step( + AudioContentParam( + type='audio', uri=part.file_data.file_uri, mime_type=mime_type + ), + role, + ) + elif mime_type.startswith('video/'): + return _wrap_content_param_in_step( + VideoContentParam( + type='video', uri=part.file_data.file_uri, mime_type=mime_type + ), + role, + ) + else: + return _wrap_content_param_in_step( + DocumentContentParam( + type='document', uri=part.file_data.file_uri, mime_type=mime_type + ), + role, + ) + elif part.thought: + # part.thought is a boolean indicating this is a thought part + # ThoughtContentParam expects 'signature' (base64 encoded bytes) + thought_result = ThoughtStepParam(type='thought') + if part.thought_signature is not None: + thought_result['signature'] = _encode_base64_string( + part.thought_signature + ) + return thought_result + elif part.code_execution_result is not None: + is_error = part.code_execution_result.outcome in ( + types.Outcome.OUTCOME_FAILED, + types.Outcome.OUTCOME_DEADLINE_EXCEEDED, + ) + return CodeExecutionResultStepParam( + type='code_execution_result', + call_id='', + result=part.code_execution_result.output or '', + is_error=is_error, + ) + elif part.executable_code is not None: + return CodeExecutionCallStepParam( + type='code_execution_call', + id='', + arguments={ + 'code': part.executable_code.code, + 'language': part.executable_code.language, + }, + ) + return None + + +def _convert_content_to_step(content: types.Content) -> list[StepParam]: + """Convert a types.Content to a list of StepParam dicts for interactions API. Args: content: The Content object to convert. Returns: - A TurnParam dictionary for the interactions API. + A list of StepParam dictionaries for the interactions API. """ - contents = [] + steps: list[StepParam] = [] + + role = content.role or 'user' if content.parts: for part in content.parts: - interaction_content = convert_part_to_interaction_content(part) + interaction_content = _convert_part_to_interaction_content(part, role) if interaction_content: - contents.append(interaction_content) + steps.append(interaction_content) - return { - 'role': content.role or 'user', - 'content': contents, - } + return steps -def convert_contents_to_turns( +def _convert_contents_to_steps( contents: list[types.Content], -) -> list[TurnParam]: +) -> list[StepParam]: """Convert a list of Content objects to interactions API input format. Args: contents: The list of Content objects to convert. Returns: - A list of TurnParam dictionaries for the interactions API. + A list of StepParam dictionaries for the interactions API. """ - turns = [] - for content in contents: - turn = convert_content_to_turn(content) - if turn['content']: # Only add turns with content - turns.append(turn) - return turns + return [ + step for content in contents for step in _convert_content_to_step(content) + ] def convert_tools_config_to_interactions_format( @@ -276,7 +468,7 @@ def convert_tools_config_to_interactions_format( # Handle function declarations if tool.function_declarations: for func_decl in tool.function_declarations: - func_tool: dict[str, Any] = { + func_tool: FunctionParam = { 'type': 'function', 'name': func_decl.name, } @@ -288,14 +480,14 @@ def convert_tools_config_to_interactions_format( props = {} for k, v in func_decl.parameters.properties.items(): props[k] = v.model_dump(exclude_none=True) - func_tool['parameters'] = { + + params_dict: dict[str, object] = { 'type': 'object', 'properties': props, } if func_decl.parameters.required: - func_tool['parameters']['required'] = list( - func_decl.parameters.required - ) + params_dict['required'] = list(func_decl.parameters.required) + func_tool['parameters'] = params_dict elif func_decl.parameters_json_schema: func_tool['parameters'] = func_decl.parameters_json_schema interaction_tools.append(func_tool) @@ -319,115 +511,104 @@ def convert_tools_config_to_interactions_format( return interaction_tools -def convert_interaction_output_to_part(output: Output) -> Optional[types.Part]: - """Convert an interaction output content to a types.Part. +def _convert_interaction_step_to_parts(step: Step) -> list[types.Part]: + """Convert an interaction output content to a list of types.Part. Args: output: The interaction output object to convert. Returns: - A types.Part object, or None if the output type is not supported. + A list of types.Part objects. """ - if not hasattr(output, 'type'): - return None - - output_type = output.type - - if output_type == 'text': - return types.Part.from_text(text=output.text or '') - elif output_type == 'function_call': + if isinstance(step, ModelOutputStep): + if not step.content: + return [] + + parts = [] + for content in step.content: + if content.type == 'text': + parts.append(types.Part.from_text(text=content.text)) + elif content.type in ['image', 'audio', 'document', 'video']: + if content.data: + parts.append( + types.Part( + inline_data=types.Blob( + data=content.data, + mime_type=content.mime_type, + ) + ) + ) + elif content.uri: + parts.append( + types.Part( + file_data=types.FileData( + file_uri=content.uri, + mime_type=content.mime_type, + ) + ) + ) + return parts + elif isinstance(step, FunctionCallStep): logger.debug( 'Converting function_call output: name=%s, id=%s', - output.name, - output.id, - ) - thought_signature = None - thought_sig_value = getattr(output, 'thought_signature', None) - if thought_sig_value and isinstance(thought_sig_value, str): - # Decode base64 string back to bytes - thought_signature = base64.b64decode(thought_sig_value) - return types.Part( - function_call=types.FunctionCall( - id=output.id, - name=output.name, - args=output.arguments or {}, - ), - thought_signature=thought_signature, + step.name, + step.id, ) - elif output_type == 'function_result': - result = output.result - # Handle different result formats - if isinstance(result, str): - result_value = result - elif hasattr(result, 'items'): - result_value = result.items - else: - result_value = result - return types.Part( - function_response=types.FunctionResponse( - id=output.call_id, - response=result_value, + thought_signature = _decode_base64_string(step.signature) + return [ + types.Part( + function_call=types.FunctionCall( + id=step.id, + name=step.name, + args=step.arguments or {}, + ), + thought_signature=thought_signature, ) - ) - elif output_type == 'image': - if output.data: - return types.Part( - inline_data=types.Blob( - data=output.data, - mime_type=output.mime_type, - ) - ) - elif output.uri: - return types.Part( - file_data=types.FileData( - file_uri=output.uri, - mime_type=output.mime_type, - ) - ) - elif output_type == 'audio': - if output.data: - return types.Part( - inline_data=types.Blob( - data=output.data, - mime_type=output.mime_type, - ) - ) - elif output.uri: - return types.Part( - file_data=types.FileData( - file_uri=output.uri, - mime_type=output.mime_type, - ) - ) - elif output_type == 'thought': + ] + elif isinstance(step, FunctionResultStep): + return [ + types.Part( + function_response=types.FunctionResponse( + id=step.call_id or '', + response=step.result, + ) + ) + ] + elif isinstance(step, ThoughtStep): # ThoughtContent has a 'signature' attribute, not 'thought' # These are internal model reasoning and typically not exposed as Parts # Skip thought outputs for now - return None - elif output_type == 'code_execution_result': - return types.Part( - code_execution_result=types.CodeExecutionResult( - output=output.result or '', - outcome=types.Outcome.OUTCOME_FAILED - if output.is_error - else types.Outcome.OUTCOME_OK, + return [] + elif isinstance(step, CodeExecutionResultStep): + return [ + types.Part( + code_execution_result=types.CodeExecutionResult( + output=step.result or '', + outcome=types.Outcome.OUTCOME_FAILED + if step.is_error + else types.Outcome.OUTCOME_OK, + ) ) - ) - elif output_type == 'code_execution_call': - args = output.arguments or {} - return types.Part( - executable_code=types.ExecutableCode( - code=args.get('code', ''), - language=args.get('language', 'PYTHON'), + ] + elif isinstance(step, CodeExecutionCallStep): + args = step.arguments + return [ + types.Part( + executable_code=types.ExecutableCode( + code=args.code, + language=types.Language.PYTHON + if args.language and args.language.lower() == 'python' + else types.Language.LANGUAGE_UNSPECIFIED, + ) ) - ) - elif output_type == 'google_search_result': + ] + elif isinstance(step, GoogleSearchResultStep): # For google search results, we create a text part with the results - if output.result: - results_text = '\n'.join(str(r) for r in output.result if r) - return types.Part.from_text(text=results_text) + if step.result: + results_text = '\n'.join(str(r) for r in step.result if r) + return [types.Part.from_text(text=results_text)] - return None + return [] def convert_interaction_to_llm_response( @@ -458,11 +639,11 @@ def convert_interaction_to_llm_response( # Convert outputs to Content parts parts = [] - if interaction.outputs: - for output in interaction.outputs: - part = convert_interaction_output_to_part(output) - if part: - parts.append(part) + if interaction.steps: + for step in interaction.steps: + step_parts = _convert_interaction_step_to_parts(step) + if step_parts: + parts.extend(step_parts) content = None if parts: @@ -502,8 +683,8 @@ def convert_interaction_to_llm_response( def convert_interaction_event_to_llm_response( event: InteractionSSEEvent, aggregated_parts: list[types.Part], - interaction_id: Optional[str] = None, -) -> Optional[LlmResponse]: + interaction_id: str | None = None, +) -> LlmResponse | None: """Convert an InteractionSSEEvent to an LlmResponse for streaming. Args: @@ -514,19 +695,36 @@ def convert_interaction_event_to_llm_response( Returns: LlmResponse if this event produces one, None otherwise. """ - from .llm_response import LlmResponse - event_type = getattr(event, 'event_type', None) + if isinstance(event, StepStart): - if event_type == 'content.delta': - delta = event.delta - if delta is None: - return None + # Streaming function calls follow a sequence of events (https://ai.google.dev/gemini-api/docs/interactions-breaking-changes-may-2026#streaming): + # 1. StepStart: Delivers the function id and name. + # 2. StepDelta (multiple): Streams arguments as raw JSON strings via arguments. + # 3. StepStop: Signals the end of the step, where arguments are finalized and parsed. + if isinstance(event.step, FunctionCallStep): + thought_signature = _decode_base64_string(event.step.signature) - delta_type = getattr(delta, 'type', None) + fc = types.FunctionCall( + id=event.step.id, + name=event.step.name, + partial_args=[], + ) + part = types.Part(function_call=fc, thought_signature=thought_signature) + aggregated_parts.append(part) - if delta_type == 'text': - text = delta.text or '' + return LlmResponse( + content=types.Content(role='model', parts=[part]), + partial=True, + turn_complete=False, + interaction_id=interaction_id, + ) + + elif isinstance(event, StepDelta): + delta = event.delta + + if delta.type == 'text': + text = delta.text if text: part = types.Part.from_text(text=text) aggregated_parts.append(part) @@ -537,93 +735,121 @@ def convert_interaction_event_to_llm_response( interaction_id=interaction_id, ) - elif delta_type == 'function_call': - # Function calls are typically sent as complete units - # DON'T yield immediately - add to aggregated_parts only. - # The function_call will be yielded in the final response which has - # the correct interaction_id. If we yield here, interaction_id may be - # None because SSE streams the id later in the 'interaction' event. - if delta.name: - thought_signature = None - thought_sig_value = getattr(delta, 'thought_signature', None) - if thought_sig_value and isinstance(thought_sig_value, str): - # Decode base64 string back to bytes - thought_signature = base64.b64decode(thought_sig_value) - part = types.Part( - function_call=types.FunctionCall( - id=delta.id or '', - name=delta.name, - args=delta.arguments or {}, - ), - thought_signature=thought_signature, - ) - aggregated_parts.append(part) - # Return None - function_call will be in the final aggregated response - return None - - elif delta_type == 'image': - if delta.data or delta.uri: - if delta.data: + elif delta.type == 'image': + data = delta.data + uri = delta.uri + mime_type = delta.mime_type + if data or uri: + if data: part = types.Part( inline_data=types.Blob( - data=delta.data, - mime_type=delta.mime_type, + data=data, + mime_type=mime_type, ) ) else: part = types.Part( file_data=types.FileData( - file_uri=delta.uri, - mime_type=delta.mime_type, + file_uri=uri, + mime_type=mime_type, ) ) aggregated_parts.append(part) return LlmResponse( content=types.Content(role='model', parts=[part]), - partial=False, + partial=True, turn_complete=False, interaction_id=interaction_id, ) - elif event_type == 'content.stop': - # Content streaming finished, return aggregated content - if aggregated_parts: - return LlmResponse( - content=types.Content(role='model', parts=list(aggregated_parts)), - partial=False, - turn_complete=False, - interaction_id=interaction_id, - ) + elif delta.type == 'arguments_delta': + if aggregated_parts: + last_part = aggregated_parts[-1] + if last_part.function_call: + delta_args = delta.arguments + if ( + delta_args is not None + and last_part.function_call.partial_args is not None + ): + last_part.function_call.partial_args.append( + types.PartialArg(string_value=delta_args) + ) + + chunk_part = types.Part( + function_call=types.FunctionCall( + name=last_part.function_call.name, + partial_args=[types.PartialArg(string_value=delta_args)], + ) + ) + return LlmResponse( + content=types.Content(role='model', parts=[chunk_part]), + partial=True, + turn_complete=False, + interaction_id=interaction_id, + ) + + elif isinstance(event, StepStop): + if aggregated_parts and aggregated_parts[-1].function_call: + fc = aggregated_parts[-1].function_call + if fc.partial_args is not None: + arg_str = ''.join(pa.string_value or '' for pa in fc.partial_args) + + args = {} + if arg_str: + try: + args = json.loads(arg_str) + except json.JSONDecodeError as e: + logger.error( + 'Failed to parse function call args: %s. arg_str: %s', + e, + arg_str, + ) + fc.args = args + fc.partial_args = None + return LlmResponse( + error_code='JSON_PARSE_ERROR', + error_message='Failed to parse function call arguments', + turn_complete=True, + finish_reason=types.FinishReason.STOP, + interaction_id=interaction_id, + ) + + fc.args = args + fc.partial_args = None - elif event_type == 'interaction': - # Final interaction event with complete data - return convert_interaction_to_llm_response(event) + return None - elif event_type == 'interaction.status_update': - status = getattr(event, 'status', None) - if status in ('completed', 'requires_action'): + elif isinstance(event, InteractionCompletedEvent): + # Final aggregated response + if aggregated_parts: return LlmResponse( - content=types.Content(role='model', parts=list(aggregated_parts)) - if aggregated_parts - else None, + content=types.Content(role='model', parts=aggregated_parts), partial=False, turn_complete=True, finish_reason=types.FinishReason.STOP, interaction_id=interaction_id, ) - elif status == 'failed': - error = getattr(event, 'error', None) + # If no streaming parts were collected, convert the final interaction directly + return convert_interaction_to_llm_response(event.interaction) + + elif isinstance(event, Interaction): + # Fallback for legacy interaction events without lifecycle + return convert_interaction_to_llm_response(event) + + elif isinstance(event, InteractionStatusUpdate): + if event.status == 'failed': return LlmResponse( - error_code=error.code if error else 'UNKNOWN_ERROR', - error_message=error.message if error else 'Unknown error', + error_code='UNKNOWN_ERROR', + error_message='Unknown error', turn_complete=True, interaction_id=interaction_id, ) - elif event_type == 'error': + elif isinstance(event, ErrorEvent): + error = event.error return LlmResponse( - error_code=getattr(event, 'code', 'UNKNOWN_ERROR'), - error_message=getattr(event, 'message', 'Unknown error'), + error_code=error.code if error else 'UNKNOWN_ERROR', + error_message=error.message if error else 'Unknown error', turn_complete=True, interaction_id=interaction_id, ) @@ -633,7 +859,7 @@ def convert_interaction_event_to_llm_response( def build_generation_config( config: types.GenerateContentConfig, -) -> dict[str, Any]: +) -> GenerationConfigParam: """Build generation config dict for interactions API. Args: @@ -642,7 +868,7 @@ def build_generation_config( Returns: A dictionary containing generation configuration parameters. """ - generation_config: dict[str, Any] = {} + generation_config: GenerationConfigParam = {} if config.temperature is not None: generation_config['temperature'] = config.temperature if config.top_p is not None: @@ -662,7 +888,7 @@ def build_generation_config( def extract_system_instruction( config: types.GenerateContentConfig, -) -> Optional[str]: +) -> str | None: """Extract system instruction as a string from config. Args: @@ -679,9 +905,10 @@ def extract_system_instruction( elif isinstance(config.system_instruction, types.Content): # Extract text from Content texts = [] - for part in config.system_instruction.parts: - if part.text: - texts.append(part.text) + if config.system_instruction.parts: + for part in config.system_instruction.parts: + if part.text: + texts.append(part.text) return '\n'.join(texts) if texts else None return None @@ -707,18 +934,18 @@ def _build_tool_log(tool: ToolParam) -> str: def build_interactions_request_log( model: str, - input_turns: list[TurnParam], - system_instruction: Optional[str], - tools: Optional[list[ToolParam]], - generation_config: Optional[dict[str, Any]], - previous_interaction_id: Optional[str], + input_steps: list[StepParam], + system_instruction: str | None, + tools: list[ToolParam] | None, + generation_config: dict[str, object] | None, + previous_interaction_id: str | None, stream: bool, ) -> str: """Build a log string for an interactions API request. Args: model: The model name. - input_turns: The input turns to send. + input_steps: The input steps to send. system_instruction: The system instruction. tools: The tools configuration. generation_config: The generation config. @@ -728,11 +955,11 @@ def build_interactions_request_log( Returns: A formatted log string describing the request. """ - # Format input turns for logging - turns_logs = [] - for turn in input_turns: - role = turn.get('role', 'unknown') - contents = turn.get('content', []) + # Format input steps for logging + steps_logs = [] + for step in input_steps: + role = step.get('role', 'unknown') + contents = step.get('content', []) content_strs = [] for content in contents: content_type = content.get('type', 'unknown') @@ -755,7 +982,7 @@ def build_interactions_request_log( content_strs.append(f'function_result[{call_id}]: {result}') else: content_strs.append(f'{content_type}: ...') - turns_logs.append(f' [{role}]: {", ".join(content_strs)}') + steps_logs.append(f' [{role}]: {", ".join(content_strs)}') # Format tools for logging tools_logs = [] @@ -781,8 +1008,8 @@ def build_interactions_request_log( Generation Config: {config_str} ----------------------------------------------------------- -Input Turns: -{_NEW_LINE.join(turns_logs) if turns_logs else '(none)'} +Input Steps: +{_NEW_LINE.join(steps_logs) if steps_logs else '(none)'} ----------------------------------------------------------- Tools: {_NEW_LINE.join(tools_logs) if tools_logs else '(none)'} @@ -805,17 +1032,17 @@ def build_interactions_response_log(interaction: Interaction) -> str: # Extract outputs outputs_logs = [] - if hasattr(interaction, 'outputs') and interaction.outputs: - for output in interaction.outputs: - output_type = getattr(output, 'type', 'unknown') + if hasattr(interaction, 'steps') and interaction.steps: + for step in interaction.steps: + output_type = getattr(step, 'type', 'unknown') if output_type == 'text': - text = getattr(output, 'text', '') + text = getattr(step, 'text', '') if len(text) > 300: text = text[:300] + '...' outputs_logs.append(f' text: "{text}"') elif output_type == 'function_call': - name = getattr(output, 'name', '') - args = getattr(output, 'arguments', {}) + name = getattr(step, 'name', '') + args = getattr(step, 'arguments', {}) outputs_logs.append(f' function_call: {name}({json.dumps(args)})') else: outputs_logs.append(f' {output_type}: ...') @@ -868,7 +1095,7 @@ def build_interactions_event_log(event: InteractionSSEEvent) -> str: details = [] - if event_type == 'content.delta': + if event_type == 'step.delta': delta = getattr(event, 'delta', None) if delta: delta_type = getattr(delta, 'type', 'unknown') @@ -884,11 +1111,11 @@ def build_interactions_event_log(event: InteractionSSEEvent) -> str: else: details.append(f'{delta_type}: ...') - elif event_type == 'interaction.status_update': + elif event_type in ('interaction.completed', 'interaction.requires_action'): status = getattr(event, 'status', 'unknown') details.append(f'status: {status}') - elif event_type == 'error': + elif event_type == 'interaction.error': code = getattr(event, 'code', 'unknown') message = getattr(event, 'message', 'unknown') details.append(f'error: {code} - {message}') @@ -906,12 +1133,8 @@ def _get_latest_user_contents( For interactions API with previous_interaction_id, we only need to send the current turn's messages since prior history is maintained by - the interaction chain. - - Special handling for function_result: When the user content contains a - function_result (response to a model's function_call), we must also include - the preceding model content with the function_call. The Interactions API - needs both the function_call and function_result to properly match call_ids. + the interaction chain. The preceding model turn with the function_call + is already encapsulated in the previous_interaction_id state. Args: contents: The full list of content messages. @@ -923,41 +1146,16 @@ def _get_latest_user_contents( return [] # Find the latest continuous user messages from the end - latest_user_contents = [] - for content in reversed(contents): + latest_user_contents: list[types.Content] = [] + for i in range(len(contents) - 1, -1, -1): + content = contents[i] if content.role == 'user': - latest_user_contents.insert(0, content) + latest_user_contents.append(content) else: # Stop when we hit a non-user message break - # Check if the user contents contain a function_result - has_function_result = False - for content in latest_user_contents: - if content.parts: - for part in content.parts: - if part.function_response is not None: - has_function_result = True - break - if has_function_result: - break - - # If we have a function_result, we also need the preceding model content - # with the function_call so the API can match the call_id - if has_function_result and len(contents) > len(latest_user_contents): - # Get the index where user contents start - user_start_idx = len(contents) - len(latest_user_contents) - if user_start_idx > 0: - # Check if the content before user contents is a model turn with - # function_call - preceding_content = contents[user_start_idx - 1] - if preceding_content.role == 'model' and preceding_content.parts: - for part in preceding_content.parts: - if part.function_call is not None: - # Include the model's function_call turn before user's - # function_result - return [preceding_content] + latest_user_contents - + latest_user_contents.reverse() return latest_user_contents @@ -983,7 +1181,6 @@ async def generate_content_via_interactions( Yields: LlmResponse objects converted from interaction responses. """ - from .llm_response import LlmResponse # When previous_interaction_id is set, only send the latest continuous # user messages (the current turn) instead of full conversation history @@ -992,7 +1189,7 @@ async def generate_content_via_interactions( contents = _get_latest_user_contents(contents) # Convert contents to interactions API format - input_turns = convert_contents_to_turns(contents) + input_steps = _convert_contents_to_steps(contents) interaction_tools = convert_tools_config_to_interactions_format( llm_request.config ) @@ -1013,8 +1210,8 @@ async def generate_content_via_interactions( logger.debug( build_interactions_request_log( - model=llm_request.model, - input_turns=input_turns, + model=llm_request.model or '', + input_steps=input_steps, system_instruction=system_instruction, tools=interaction_tools if interaction_tools else None, generation_config=generation_config if generation_config else None, @@ -1024,13 +1221,13 @@ async def generate_content_via_interactions( ) # Track the current interaction ID from responses - current_interaction_id: Optional[str] = None + current_interaction_id: str | None = None if stream: # Streaming mode responses = await api_client.aio.interactions.create( model=llm_request.model, - input=input_turns, + input=input_steps, stream=True, system_instruction=system_instruction, tools=interaction_tools if interaction_tools else None, @@ -1052,21 +1249,11 @@ async def generate_content_via_interactions( if llm_response: yield llm_response - # Final aggregated response - if aggregated_parts: - yield LlmResponse( - content=types.Content(role='model', parts=aggregated_parts), - partial=False, - turn_complete=True, - finish_reason=types.FinishReason.STOP, - interaction_id=current_interaction_id, - ) - else: # Non-streaming mode interaction = await api_client.aio.interactions.create( model=llm_request.model, - input=input_turns, + input=input_steps, stream=False, system_instruction=system_instruction, tools=interaction_tools if interaction_tools else None, diff --git a/src/google/adk/models/llm_response.py b/src/google/adk/models/llm_response.py index c921f197c3..333034565f 100644 --- a/src/google/adk/models/llm_response.py +++ b/src/google/adk/models/llm_response.py @@ -81,6 +81,12 @@ class LlmResponse(BaseModel): Only used for streaming mode. """ + turn_complete_reason: Optional[types.TurnCompleteReason] = None + """The reason why the turn is complete. + + Only used for streaming mode. + """ + finish_reason: Optional[types.FinishReason] = None """The finish reason of the response.""" diff --git a/src/google/adk/models/registry.py b/src/google/adk/models/registry.py index a0c06271e9..fcf35d78a1 100644 --- a/src/google/adk/models/registry.py +++ b/src/google/adk/models/registry.py @@ -47,7 +47,34 @@ def new_llm(model: str) -> BaseLlm: The LLM instance. """ - return LLMRegistry.resolve(model)(model=model) + prefix, actual_model = LLMRegistry._parse_model(model) + cls = LLMRegistry.resolve(model) + + if prefix and LLMRegistry._match_prefix(prefix, cls.__name__): + return cls(model=actual_model) + + return cls(model=model) + + @staticmethod + def _parse_model(model: str) -> tuple[str | None, str]: + """Parses a model name into prefix and actual model. + + Example: "openai:gpt-4" -> ("openai", "gpt-4") + "gpt-4" -> (None, "gpt-4") + """ + if ':' in model: + prefix, actual_model = model.split(':', 1) + return prefix, actual_model + return None, model + + @staticmethod + def _match_prefix(prefix: str, class_name: str) -> bool: + """Checks if a prefix matches a class name.""" + prefix_lower = prefix.lower() + norm_class_name = class_name.lower() + if norm_class_name.endswith('llm'): + norm_class_name = norm_class_name[:-3] + return prefix_lower == norm_class_name or prefix_lower == class_name.lower() @staticmethod def _register(model_name_regex: str, llm_cls: type[BaseLlm]): @@ -101,6 +128,20 @@ def resolve(model: str) -> type[BaseLlm]: ValueError: If the model is not found. """ + # Support [model_class]:model_name format to override resolution + prefix, _ = LLMRegistry._parse_model(model) + if prefix: + for regex, entry in list(_llm_registry_dict.items()): + class_name = entry[1] if isinstance(entry, tuple) else entry.__name__ + if LLMRegistry._match_prefix(prefix, class_name): + if isinstance(entry, tuple): + module_path, c_name = entry + # We let ImportError bubble up because the user explicitly + # requested this provider via prefix. + module = importlib.import_module(module_path) + return getattr(module, c_name) + return entry + for regex, entry in list(_llm_registry_dict.items()): if not re.compile(regex).fullmatch(model): continue diff --git a/src/google/adk/plugins/bigquery_agent_analytics_plugin.py b/src/google/adk/plugins/bigquery_agent_analytics_plugin.py index 3a09fc942f..90bd50628c 100644 --- a/src/google/adk/plugins/bigquery_agent_analytics_plugin.py +++ b/src/google/adk/plugins/bigquery_agent_analytics_plugin.py @@ -2017,7 +2017,6 @@ def __init__( self._startup_error: Optional[Exception] = None self._is_shutting_down = False self._setup_lock = None - self._user_credentials = credentials self._credentials = credentials self.client = None self._loop_state_by_loop: dict[asyncio.AbstractEventLoop, _LoopState] = {} @@ -2136,10 +2135,6 @@ def get_credentials(): ) return creds - # Note: this read-then-write is not locked. If two event loops - # race here both will resolve ADC and write back the same creds. - # This is benign — the result is idempotent — so we accept the - # race rather than adding a lock for a one-time init path. if self._credentials is None: self._credentials = await loop.run_in_executor( self._executor, get_credentials @@ -2229,18 +2224,13 @@ async def _lazy_setup(self, **kwargs) -> None: self.offloader = None if self.config.gcs_bucket_name: - # GCSOffloader always creates a storage.Client eagerly - # (line 1329: storage_client or storage.Client(...)). - # Pass credentials so it uses the same auth as the other - # clients; omit when None to let it use ADC. - gcs_kwargs = {"project": self.project_id} - if self._credentials is not None: - gcs_kwargs["credentials"] = self._credentials self.offloader = GCSOffloader( self.project_id, self.config.gcs_bucket_name, self._executor, - storage_client=storage.Client(**gcs_kwargs), + storage_client=storage.Client( + project=self.project_id, credentials=self._credentials + ), ) self.parser = HybridContentParser( @@ -2574,18 +2564,6 @@ def __getstate__(self): state["_startup_error"] = None state["_is_shutting_down"] = False state["_init_pid"] = 0 - # _credentials is always runtime-resolved; clear unconditionally. - state["_credentials"] = None - # Preserve _user_credentials if they are picklable (e.g., - # service-account, AnonymousCredentials). Drop only when - # pickle would fail (e.g., compute_engine.Credentials holding - # a requests.Session). - import pickle as _pickle - - try: - _pickle.dumps(state.get("_user_credentials")) - except Exception: - state["_user_credentials"] = None return state def __setstate__(self, state): @@ -2593,13 +2571,6 @@ def __setstate__(self, state): # Backfill keys that may be absent in pickled state from older # code versions so _ensure_started does not raise AttributeError. state.setdefault("_init_pid", 0) - state.setdefault("_user_credentials", None) - state.setdefault("_credentials", None) - # Restore _credentials from _user_credentials if available so - # _create_loop_state uses the user's identity. When both are - # None (non-picklable credentials were dropped), ADC is used. - if state["_credentials"] is None and state["_user_credentials"] is not None: - state["_credentials"] = state["_user_credentials"] self.__dict__.update(state) def _reset_runtime_state(self) -> None: @@ -2654,11 +2625,6 @@ def _reset_runtime_state(self) -> None: self._startup_error = None self._is_shutting_down = False self._init_pid = os.getpid() - # For ADC-resolved credentials, clear so they are re-resolved - # in the child process. For user-provided credentials, keep - # the original object — we cannot re-create it. The user is - # responsible for providing fork-safe credentials if needed. - self._credentials = self._user_credentials async def __aenter__(self) -> BigQueryAgentAnalyticsPlugin: await self._ensure_started() @@ -3022,7 +2988,7 @@ async def on_event_callback( callback_ctx = CallbackContext(invocation_context) # --- State delta logging --- - if event.actions and event.actions.state_delta: + if event.actions.state_delta: await self._log_event( "STATE_DELTA", callback_ctx, diff --git a/src/google/adk/plugins/debug_logging_plugin.py b/src/google/adk/plugins/debug_logging_plugin.py index 61f9b07967..99ab7fffe5 100644 --- a/src/google/adk/plugins/debug_logging_plugin.py +++ b/src/google/adk/plugins/debug_logging_plugin.py @@ -1,4 +1,4 @@ -# Copyright 2025 Google LLC +# Copyright 2026 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index 850c26bbba..d0fe96c87b 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -15,6 +15,7 @@ from __future__ import annotations import asyncio +from contextlib import aclosing import inspect import logging from pathlib import Path @@ -37,7 +38,10 @@ from .agents.invocation_context import InvocationContext from .agents.invocation_context import new_invocation_context_id from .agents.live_request_queue import LiveRequestQueue +from .agents.llm.task._finish_task_tool import FINISH_TASK_SUCCESS_RESULT +from .agents.llm.task._finish_task_tool import FINISH_TASK_TOOL_NAME from .agents.run_config import RunConfig +from .apps.app import App from .artifacts.base_artifact_service import BaseArtifactService from .auth.credential_service.base_credential_service import BaseCredentialService from .code_executors.built_in_code_executor import BuiltInCodeExecutor @@ -57,15 +61,52 @@ from .telemetry.tracing import tracer from .tools.base_toolset import BaseToolset from .utils._debug_output import print_event -from .utils.context_utils import Aclosing if TYPE_CHECKING: - from .apps.app import App from .apps.app import ResumabilityConfig logger = logging.getLogger('google_adk.' + __name__) +def _find_active_task_isolation_scope(session) -> Optional[str]: + """Walk session backwards; find the active paused task agent's scope. + + Two flavors of task scope: + * FC delegation (chat coordinator → task agent via function call): + scope = ``fc.id``, opened by an unresolved task FC. + * Workflow node (task-mode LlmAgent dispatched as a graph node): + scope = ``@``, stamped on every event the + task agent emits. + + Both close on a SUCCESSFUL ``finish_task`` FunctionResponse — + i.e., one whose response is ``FINISH_TASK_SUCCESS_RESULT``. An + error FR (validation failure) does NOT close the scope: the task + agent is still active, will see the error, and retry. Walking + backward, the first non-empty scope we encounter that hasn't been + closed by a later successful ``finish_task`` is the paused task + awaiting the user's next reply. + + Used by ``Runner._append_user_event`` to scope the new user message + to that task agent's view. + """ + finished_scopes: set[str] = set() + for event in reversed(session.events): + scope = event.isolation_scope + if not scope: + continue + if event.content and event.content.parts: + for part in event.content.parts: + fr = part.function_response + if fr and fr.name == FINISH_TASK_TOOL_NAME: + response = fr.response or {} + if response.get('result') == FINISH_TASK_SUCCESS_RESULT: + finished_scopes.add(scope) + break + if scope not in finished_scopes: + return scope + return None + + def _is_tool_call_or_response(event: Event) -> bool: return bool(event.get_function_calls() or event.get_function_responses()) @@ -129,8 +170,8 @@ class Runner: app_name: str """The app name of the runner.""" - agent: BaseAgent - """The root agent to run.""" + agent: Optional[BaseAgent | 'BaseNode'] = None + """The root agent or node to run.""" artifact_service: Optional[BaseArtifactService] = None """The artifact service for the runner.""" plugin_manager: PluginManager @@ -152,6 +193,7 @@ def __init__( app: Optional[App] = None, app_name: Optional[str] = None, agent: Optional[BaseAgent] = None, + node: Any = None, plugins: Optional[List[BasePlugin]] = None, artifact_service: Optional[BaseArtifactService] = None, session_service: BaseSessionService, @@ -162,22 +204,18 @@ def __init__( ): """Initializes the Runner. - Developers should provide either an `app` instance or both `app_name` and - `agent`. When `app` is provided, `app_name` can optionally override the - app's name (useful for deployment scenarios like Agent Engine where the - resource name differs from the app's identifier). However, `agent` should - not be provided when `app` is provided. Providing `app` is the recommended - way to create a runner. + Exactly one of `app`, `agent`, or `node` must be provided. When `agent` + or `node` is provided, the Runner wraps it into an `App` internally. + Providing `app` is the recommended way to create a runner. When `app` is + provided, `app_name` can optionally override the app's name. Args: - app: An optional `App` instance. If provided, `agent` should not be - specified. `app_name` can optionally override `app.name`. - app_name: The application name of the runner. Required if `app` is not - provided. If `app` is provided, this can optionally override `app.name` - (e.g., for deployment scenarios where a resource name differs from the - app identifier). - agent: The root agent to run. Required if `app` is not provided. Should - not be provided when `app` is provided. + app: An `App` instance. Mutually exclusive with `agent` and `node`. + app_name: The application name. Required when `agent` is provided. + Optional override for `app.name` when `app` is provided. Defaults + to `node.name` when only `node` is provided. + agent: The root agent to run. Mutually exclusive with `app` and `node`. + node: The root node to run. Mutually exclusive with `app` and `agent`. plugins: Deprecated. A list of plugins for the runner. Please use the `app` argument to provide plugins instead. artifact_service: The artifact service for the runner. @@ -190,92 +228,117 @@ def __init__( ValueError with a helpful message. Raises: - ValueError: If `app` is provided along with `agent` or `plugins`, or if - `app` is not provided but either `app_name` or `agent` is missing. + ValueError: If more than one of `app`, `agent`, or `node` is provided, + or if none is provided, or if `agent` is provided without `app_name`. """ + app = self._resolve_app(app, app_name, agent, node, plugins) + + # Extract from App — single code path. self.app = app - ( - self.app_name, - self.agent, - self.context_cache_config, - self.resumability_config, - plugins, - ) = self._validate_runner_params(app, app_name, agent, plugins) + self.app_name = app_name or app.name + self.agent = app.root_agent + self.context_cache_config = app.context_cache_config + self.resumability_config = app.resumability_config self.artifact_service = artifact_service self.session_service = session_service self.memory_service = memory_service self.credential_service = credential_service self.plugin_manager = PluginManager( - plugins=plugins, close_timeout=plugin_close_timeout + plugins=app.plugins, close_timeout=plugin_close_timeout ) self.auto_create_session = auto_create_session - ( - self._agent_origin_app_name, - self._agent_origin_dir, - ) = self._infer_agent_origin(self.agent) + if self.agent is not None: + ( + self._agent_origin_app_name, + self._agent_origin_dir, + ) = self._infer_agent_origin(self.agent) + else: + self._agent_origin_app_name = None + self._agent_origin_dir = None self._app_name_alignment_hint: Optional[str] = None self._enforce_app_name_alignment() - def _validate_runner_params( - self, + @staticmethod + def _resolve_app( app: Optional[App], app_name: Optional[str], agent: Optional[BaseAgent], + node: Any, plugins: Optional[List[BasePlugin]], - ) -> tuple[ - str, - BaseAgent, - Optional[ContextCacheConfig], - Optional[ResumabilityConfig], - Optional[List[BasePlugin]], - ]: - """Validates and extracts runner parameters. + ) -> App: + """Validates inputs and normalizes to an App instance. - Args: - app: An optional `App` instance. - app_name: The application name of the runner. Can override app.name when - app is provided. - agent: The root agent to run. - plugins: A list of plugins for the runner. + Exactly one of ``app``, ``agent``, or ``node`` must be provided. + When ``agent`` or ``node`` is given, it is wrapped in a new ``App``. Returns: - A tuple containing (app_name, agent, context_cache_config, - resumability_config, plugins). + The resolved ``App`` instance. Raises: - ValueError: If parameters are invalid. + ValueError: If the combination of arguments is invalid. """ + # Validate mutual exclusivity. + provided = sum(x is not None for x in (app, agent, node)) + if provided > 1: + raise ValueError('Only one of app, agent, or node may be provided.') + if provided == 0: + raise ValueError('One of app, agent, or node must be provided.') + + # Handle deprecated plugins argument. if plugins is not None: + if app is not None: + raise ValueError( + 'When app is provided, plugins should not be provided and should' + ' be provided in the app instead.' + ) warnings.warn( 'The `plugins` argument is deprecated. Please use the `app` argument' ' to provide plugins instead.', DeprecationWarning, ) - if app: - if agent: - raise ValueError('When app is provided, agent should not be provided.') - if plugins: + # Normalize to App — wrap bare agent or node. Uses model_construct to + # bypass App._validate for the legacy (app_name, agent) API, which v1 + # accepted with arbitrary names and root_agent types. Direct App(name=...) + # construction still validates strictly. + if agent is not None: + if not app_name: raise ValueError( - 'When app is provided, plugins should not be provided and should be' - ' provided in the app instead.' + 'app_name is required when agent is provided without app.' ) - # Allow app_name to override app.name (useful for deployment scenarios - # like Agent Engine where resource names differ from app identifiers) - app_name = app_name or app.name - agent = app.root_agent - plugins = app.plugins - context_cache_config = app.context_cache_config - resumability_config = app.resumability_config - elif not app_name or not agent: - raise ValueError( - 'Either app or both app_name and agent must be provided.' + return App.model_construct( + name=app_name, root_agent=agent, plugins=plugins or [] ) - else: - context_cache_config = None - resumability_config = None + if node is not None: + return App.model_construct( + name=app_name or getattr(node, 'name', 'default'), + root_agent=node, + plugins=plugins or [], + ) + return app - return app_name, agent, context_cache_config, resumability_config, plugins + @staticmethod + def _validate_runner_params( + app: Optional[App], + app_name: Optional[str], + agent: Optional[BaseAgent], + plugins: Optional[List[BasePlugin]], + ) -> tuple[ + str, + BaseAgent, + Optional[ContextCacheConfig], + Optional[ResumabilityConfig], + Optional[List[BasePlugin]], + ]: + """Deprecated: use _resolve_app instead.""" + resolved = Runner._resolve_app(app, app_name, agent, None, plugins) + return ( + app_name or resolved.name, + resolved.root_agent, + resolved.context_cache_config, + resolved.resumability_config, + plugins if app is None else resolved.plugins, + ) def _infer_agent_origin( self, agent: BaseAgent @@ -391,6 +454,387 @@ def _format_session_not_found_message(self, session_id: str) -> str: 'auto_create_session=True when constructing the runner.' ) + async def _run_node_async( + self, + *, + user_id: str, + session_id: str, + new_message: Optional[types.Content] = None, + state_delta: Optional[dict[str, Any]] = None, + run_config: Optional[RunConfig] = None, + yield_user_message: bool = False, + node: Optional['BaseNode'] = None, + ) -> AsyncGenerator[Event, None]: + """Run a BaseNode through NodeRunner. + + Events flow through ic._event_queue via NodeRunner. + """ + from .workflow._node_runner import NodeRunner + + with tracer.start_as_current_span('invocation'): + # 1. Setup + session = await self._get_or_create_session( + user_id=user_id, session_id=session_id + ) + + # Validate and resolve resume inputs + resume_inputs = self._extract_resume_inputs(new_message) + self._validate_new_message(new_message, resume_inputs) + + invocation_id = ( + self._resolve_invocation_id_from_fr(session, new_message) + if new_message + else None + ) + + ic = self._new_invocation_context( + session, + new_message=new_message, + run_config=run_config or RunConfig(), + invocation_id=invocation_id, + ) + ic._event_queue = asyncio.Queue() + + # 2. Append user message to session and resolve node_input + if resume_inputs: + # Resume: find original user message, use as node_input + node_input = self._find_original_user_content( + ic.session, ic.invocation_id + ) + else: + # Fresh: use user message as node_input + node_input = new_message + + # Run callbacks on user message + if new_message: + modified_user_message = ( + await ic.plugin_manager.run_on_user_message_callback( + invocation_context=ic, user_message=new_message + ) + ) + if modified_user_message is not None: + new_message = modified_user_message + ic.user_content = new_message + + # Append user message to session for history + if new_message: + user_event = await self._append_user_event( + ic, new_message, state_delta=state_delta + ) + if yield_user_message and user_event: + yield user_event + + # Run before_run callbacks + await ic.plugin_manager.run_before_run_callback(invocation_context=ic) + + # 3. Start root node in background + from .agents.base_agent import BaseAgent + from .agents.context import Context + from .workflow._dynamic_node_scheduler import DynamicNodeScheduler + from .workflow._workflow import _LoopState + + root_ctx = Context(ic) + root_agent = node or self.agent + is_agent = isinstance(self.agent, BaseAgent) + has_sub_agents = is_agent and bool( + getattr(self.agent, 'sub_agents', None) + ) + use_scheduler = is_agent and has_sub_agents + + # The root chat coordinator's isolation_scope stays None: its own + # events (FCs, text, synthesized FRs from completed task + # delegations) are also unscoped, so the content-builder's + # isolation_scope filter lets the coordinator see all of them + # across user turns. Task sub-agents are scoped under their + # originating function-call id and so remain invisible to the + # coordinator's view. + + if not use_scheduler: + root_node_runner = NodeRunner(node=root_agent, parent_ctx=root_ctx) + + done_sentinel = object() + + async def _drive_root_node(): + try: + if use_scheduler: + # Rehydration warning: DynamicNodeScheduler relies on session.events scanning. + # Stateful live EUC/LRO streams may rehydrate freshly if not yet persisted. + scheduler = DynamicNodeScheduler(state=_LoopState()) + root_ctx._workflow_scheduler = scheduler + ctx = await scheduler( + root_ctx, + root_agent, + node_input, + run_id='1', + ) + else: + ctx = await root_node_runner.run( + node_input=node_input, + resume_inputs=resume_inputs, + ) + if ctx.error: + raise ctx.error + finally: + await ic._event_queue.put((done_sentinel, None)) + + task = asyncio.create_task(_drive_root_node()) + + # 4. Main loop: consume events, persist, yield + try: + async with aclosing( + self._consume_event_queue(ic, done_sentinel) + ) as agen: + async for event in agen: + yield event + finally: + await self._cleanup_root_task(task, self.agent.name) + await ic.plugin_manager.run_after_run_callback(invocation_context=ic) + if self.app and self.app.events_compaction_config: + logger.debug('Running event compactor.') + from google.adk.apps.compaction import _run_compaction_for_sliding_window + + await _run_compaction_for_sliding_window( + self.app, + session, + self.session_service, + skip_token_compaction=ic.token_compaction_checked, + ) + + async def _run_node_live( + self, + *, + session: Session, + live_request_queue: LiveRequestQueue, + run_config: Optional[RunConfig] = None, + ) -> AsyncGenerator[Event, None]: + """Run a non-agent BaseNode in live mode.""" + from .agents.context import Context + from .workflow._dynamic_node_scheduler import DynamicNodeScheduler + from .workflow._node_runner import NodeRunner + from .workflow._workflow import _LoopState + from .workflow._workflow import Workflow + + ic = self._new_invocation_context_for_live( + session, + live_request_queue=live_request_queue, + run_config=run_config or RunConfig(), + ) + ic._event_queue = asyncio.Queue() + + root_ctx = Context(ic) + root_agent = self.agent + is_workflow = isinstance(root_agent, Workflow) + + if not is_workflow: + root_node_runner = NodeRunner(node=root_agent, parent_ctx=root_ctx) + + done_sentinel = object() + + async def _drive_root_node(): + try: + if is_workflow: + scheduler = DynamicNodeScheduler(state=_LoopState()) + root_ctx._workflow_scheduler = scheduler + ctx = await scheduler( + root_ctx, + root_agent, + None, + run_id='1', + ) + else: + ctx = await root_node_runner.run( + node_input=None, + ) + if ctx.error: + raise ctx.error + finally: + await ic._event_queue.put((done_sentinel, None)) + + task = asyncio.create_task(_drive_root_node()) + + try: + async with aclosing(self._consume_event_queue(ic, done_sentinel)) as agen: + async for event in agen: + yield event + finally: + await self._cleanup_root_task(task, self.agent.name) + + def _extract_resume_inputs( + self, message: Optional[types.Content] + ) -> dict[str, Any] | None: + """Extract function response payloads from a message as resume_inputs.""" + if not message or not message.parts: + return None + inputs = {} + for part in message.parts: + if part.function_response and part.function_response.id: + inputs[part.function_response.id] = part.function_response.response + return inputs or None + + def _validate_new_message( + self, + message: Optional[types.Content], + resume_inputs: dict[str, Any] | None, + ) -> None: + """Validate that new_message doesn't mix FR and text parts.""" + if not resume_inputs or not message or not message.parts: + return + if any(p.text for p in message.parts): + raise ValueError( + 'Message cannot contain both function responses and text.' + ' Function responses resume an existing invocation while' + ' text starts a new one.' + ) + + def _resolve_invocation_id_from_fr( + self, + session: Session, + new_message: types.Content, + ) -> Optional[str]: + """Infer invocation_id by matching function responses to FC events. + + Raises ValueError if responses resolve to different invocations. + """ + fr_ids = { + p.function_response.id + for p in new_message.parts or [] + if p.function_response and p.function_response.id + } + if not fr_ids: + return None + + # Find invocation_id for each FR by matching its FC in session + invocation_ids = set() + for event in reversed(session.events): + for fc in event.get_function_calls(): + if fc.id in fr_ids: + invocation_ids.add(event.invocation_id) + fr_ids.discard(fc.id) + if not fr_ids: + break + + if fr_ids: + raise ValueError( + f'Function call not found for function response ids: {fr_ids}.' + ) + if len(invocation_ids) > 1: + raise ValueError( + 'Function responses resolve to multiple' + f' invocations: {invocation_ids}.' + ) + return invocation_ids.pop() + + async def _append_user_event( + self, + ic: InvocationContext, + content: types.Content, + *, + state_delta: Optional[dict[str, Any]] = None, + ) -> Event: + """Append a user message event to the session and return it.""" + if state_delta: + event = Event( + invocation_id=ic.invocation_id, + author='user', + actions=EventActions(state_delta=state_delta), + content=content, + ) + else: + event = Event( + invocation_id=ic.invocation_id, + author='user', + content=content, + ) + # when a paused task delegation is in flight, stamp + # the new user message with that task's isolation_scope so the + # task agent's content-build (scoped to ) sees it. + if event.isolation_scope is None: + iso = _find_active_task_isolation_scope(ic.session) + if iso is not None: + event.isolation_scope = iso + return await self.session_service.append_event( + session=ic.session, event=event + ) + + def _find_original_user_content( + self, session: Session, invocation_id: str + ) -> types.Content | None: + """Find the original user text message for a given invocation_id.""" + for event in session.events: + if ( + event.invocation_id == invocation_id + and event.author == 'user' + and event.content + and event.content.parts + and any(p.text for p in event.content.parts) + ): + return event.content + return None + + async def _consume_event_queue( + self, ic: InvocationContext, done_sentinel: object + ) -> AsyncGenerator[Event, None]: + """Consume events from ic._event_queue until done_sentinel.""" + while True: + event_or_done, processed_signal = await ic._event_queue.get() + if event_or_done is done_sentinel: + break + event: Event = event_or_done + # When an LlmAgent node uses ``message_as_output`` (no + # ``output_schema``), the wrapper sets both ``event.content`` + # (the model's text) AND ``event.output`` (the same text) to + # signal that the message IS the node's output. Clear + # ``event.output`` on a copy here so downstream renderers don't + # surface the same text twice. Task-mode agents set + # ``event.output`` from the ``finish_task`` FC args without + # ``message_as_output``, so this clearing doesn't affect them. + if not event.partial: + if event.node_info.message_as_output and event.content is not None: + event = event.model_copy() + event.output = None + + _apply_run_config_custom_metadata(event, ic.run_config) + modified_event = await ic.plugin_manager.run_on_event_callback( + invocation_context=ic, event=event + ) + output_event = self._get_output_event( + original_event=event, + modified_event=modified_event, + run_config=ic.run_config, + ) + + if not event.partial: + await self.session_service.append_event( + session=ic.session, event=output_event + ) + yield output_event + + if isinstance(processed_signal, asyncio.Event): + processed_signal.set() + + async def _cleanup_root_task( + self, task: asyncio.Task, node_name: str + ) -> None: + """Cancel the root task if still running, then await it. + + The task may still be running if the caller stopped iterating + early (e.g., break in async for). In that case we must cancel + to avoid a leaked task. + """ + if not task.done(): + logger.debug( + 'Cancelling root node %s (caller stopped early).', + node_name, + ) + task.cancel() + try: + await task + except asyncio.CancelledError: + logger.warning('Root node %s was cancelled.', node_name) + except Exception: + logger.error('Root node %s failed.', node_name, exc_info=True) + raise + async def _get_or_create_session( self, *, @@ -466,7 +910,7 @@ def run( async def _invoke_run_async(): try: - async with Aclosing( + async with aclosing( self.run_async( user_id=user_id, session_id=session_id, @@ -507,6 +951,7 @@ async def run_async( new_message: Optional[types.Content] = None, state_delta: Optional[dict[str, Any]] = None, run_config: Optional[RunConfig] = None, + yield_user_message: bool = False, ) -> AsyncGenerator[Event, None]: """Main entry method to run the agent in this runner. @@ -524,6 +969,8 @@ async def run_async( new_message: A new message to append to the session. state_delta: Optional state changes to apply to the session. run_config: The run config for the agent. + yield_user_message: If True, yield the user message event before + agent/node events. Yields: The events generated by the agent. @@ -537,6 +984,71 @@ async def run_async( if new_message and not new_message.role: new_message.role = 'user' + from .agents.llm_agent import LlmAgent + from .workflow._base_node import BaseNode + + if isinstance(self.agent, LlmAgent): + if self.agent.mode is None: + # LlmAgent as root agent must have chat mode. + self.agent.mode = 'chat' + + if self.agent.mode == 'chat': + session = await self._get_or_create_session( + user_id=user_id, session_id=session_id + ) + # when the chat coordinator has task-mode sub-agents, + # the wrapper handles delegation via ctx.run_node. Don't let + # the legacy sub-agent picker bypass the coordinator on resume. + has_task_subagent = any( + isinstance(sa, LlmAgent) and getattr(sa, 'mode', None) == 'task' + for sa in self.agent.sub_agents or [] + ) + if has_task_subagent: + agent_to_run = self.agent + else: + agent_to_run = self._find_agent_to_run(session, self.agent) + from .workflow.utils._workflow_graph_utils import build_node # pylint: disable=g-import-not-at-top + + agent_to_run = build_node(agent_to_run) + else: + raise ValueError( + "LlmAgent as root agent must have mode='chat', but got" + f" mode='{self.agent.mode}'." + ) + async with aclosing( + self._run_node_async( + user_id=user_id, + session_id=session_id, + new_message=new_message, + state_delta=state_delta, + run_config=run_config, + yield_user_message=yield_user_message, + node=agent_to_run, + ) + ) as agen: + async for event in agen: + yield event + return + + # TODO: remove `not isinstance(self.agent, BaseAgent)` after all agents are + # refactored to use the node runtime path (requires adding tracing and plugins to it). + if isinstance(self.agent, BaseNode) and not isinstance( + self.agent, BaseAgent + ): + async with aclosing( + self._run_node_async( + user_id=user_id, + session_id=session_id, + new_message=new_message, + state_delta=state_delta, + run_config=run_config, + yield_user_message=yield_user_message, + ) + ) as agen: + async for event in agen: + yield event + return + async def _run_with_trace( new_message: Optional[types.Content] = None, invocation_id: Optional[str] = None, @@ -600,11 +1112,11 @@ async def _run_with_trace( return async def execute(ctx: InvocationContext) -> AsyncGenerator[Event]: - async with Aclosing(ctx.agent.run_async(ctx)) as agen: + async with aclosing(ctx.agent.run_async(ctx)) as agen: async for event in agen: yield event - async with Aclosing( + async with aclosing( self._exec_with_plugin( invocation_context=invocation_context, session=invocation_context.session, @@ -628,7 +1140,7 @@ async def execute(ctx: InvocationContext) -> AsyncGenerator[Event]: skip_token_compaction=invocation_context.token_compaction_checked, ) - async with Aclosing(_run_with_trace(new_message, invocation_id)) as agen: + async with aclosing(_run_with_trace(new_message, invocation_id)) as agen: async for event in agen: yield event @@ -889,7 +1401,7 @@ async def _exec_with_plugin( buffered_events: list[Event] = [] is_transcribing: bool = False - async with Aclosing(execute_fn(invocation_context)) as agen: + async with aclosing(execute_fn(invocation_context)) as agen: async for event in agen: _apply_run_config_custom_metadata( event, invocation_context.run_config @@ -1123,6 +1635,23 @@ async def run_live( session_id=session_id, get_session_config=run_config.get_session_config, ) + + from .agents.base_agent import BaseAgent + from .workflow._base_node import BaseNode + + if isinstance(self.agent, BaseNode) and not isinstance( + self.agent, BaseAgent + ): + async with aclosing( + self._run_node_live( + session=session, + live_request_queue=live_request_queue, + run_config=run_config, + ) + ) as agen: + async for event in agen: + yield event + return invocation_context = self._new_invocation_context_for_live( session, live_request_queue=live_request_queue, @@ -1135,11 +1664,11 @@ async def run_live( ) async def execute(ctx: InvocationContext) -> AsyncGenerator[Event]: - async with Aclosing(ctx.agent.run_live(ctx)) as agen: + async with aclosing(ctx.agent.run_live(ctx)) as agen: async for event in agen: yield event - async with Aclosing( + async with aclosing( self._exec_with_plugin( invocation_context=invocation_context, session=invocation_context.session, @@ -1163,6 +1692,8 @@ def _find_agent_to_run( - An LlmAgent who replied last and is capable to transfer to any other agent in the agent hierarchy. + TODO: use wait_for_output to decide the agent to run + Args: session: The session to find the agent for. root_agent: The root agent of the runner. @@ -1171,12 +1702,26 @@ def _find_agent_to_run( The agent to run. (the active agent that should reply to the latest user message) """ + # Mesh and Workflow Agents handle their own internal routing. + # Workflow will figure which node is interrupted and should be resumed. + from .workflow._workflow import Workflow + + if isinstance(root_agent, Workflow): + return root_agent + # If the last event is a function response, should send this response to # the agent that returned the corresponding function call regardless the # type of the agent. e.g. a remote a2a agent may surface a credential # request as a special long-running function tool call. event = find_matching_function_call(session.events) - if event and event.author: + is_resumable = ( + self.resumability_config and self.resumability_config.is_resumable + ) + # Only route based on a past function response if resumability is enabled. + # In non-resumable scenarios, a turn ending with function call response + # shouldn't trap the next turn on that same agent if it's not transferable. + # Falling through allows it to return to root. + if event and event.author and is_resumable: return root_agent.find_agent(event.author) def _event_filter(event: Event) -> bool: @@ -1199,7 +1744,8 @@ def _event_filter(event: Event) -> bool: event.id, ) continue - if self._is_transferable_across_agent_tree(agent): + transferable = self._is_transferable_across_agent_tree(agent) + if transferable: return agent # Falls back to root agent if no suitable agents are found in the session. return root_agent @@ -1306,9 +1852,9 @@ async def run_debug( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not quiet: - print(f'\n ### Created new session: {session_id}') + logger.info('Created new session: %s', session_id) elif not quiet: - print(f'\n ### Continue session: {session_id}') + logger.info('Continue session: %s', session_id) collected_events: list[Event] = [] @@ -1317,18 +1863,21 @@ async def run_debug( for message in user_messages: if not quiet: - print(f'\nUser > {message}') + logger.info('User > %s', message) - async for event in self.run_async( - user_id=user_id, - session_id=session.id, - new_message=types.UserContent(parts=[types.Part(text=message)]), - run_config=run_config, - ): - if not quiet: - print_event(event, verbose=verbose) + async with aclosing( + self.run_async( + user_id=user_id, + session_id=session.id, + new_message=types.UserContent(parts=[types.Part(text=message)]), + run_config=run_config, + ) + ) as agen: + async for event in agen: + if not quiet: + print_event(event, verbose=verbose) - collected_events.append(event) + collected_events.append(event) return collected_events @@ -1501,7 +2050,7 @@ def _new_invocation_context( self.app.events_compaction_config if self.app else None ), invocation_id=invocation_id, - agent=self.agent, + agent=self.agent if isinstance(self.agent, BaseAgent) else None, session=session, user_content=new_message, live_request_queue=live_request_queue, @@ -1521,7 +2070,7 @@ def _new_invocation_context_for_live( # For live multi-agents system, we need model's text transcription as # context for the transferred agent. - if self.agent.sub_agents: + if hasattr(self.agent, 'sub_agents') and self.agent.sub_agents: if 'AUDIO' in run_config.response_modalities: if not run_config.output_audio_transcription: run_config.output_audio_transcription = ( @@ -1581,8 +2130,9 @@ def _collect_toolset(self, agent: BaseAgent) -> set[BaseToolset]: for tool_union in agent.tools: if isinstance(tool_union, BaseToolset): toolsets.add(tool_union) - for sub_agent in agent.sub_agents: - toolsets.update(self._collect_toolset(sub_agent)) + if hasattr(agent, 'sub_agents'): + for sub_agent in agent.sub_agents: + toolsets.update(self._collect_toolset(sub_agent)) return toolsets async def _cleanup_toolsets(self, toolsets_to_close: set[BaseToolset]): @@ -1619,7 +2169,8 @@ async def close(self): """Closes the runner.""" logger.info('Closing runner...') # Close Toolsets - await self._cleanup_toolsets(self._collect_toolset(self.agent)) + if self.agent is not None: + await self._cleanup_toolsets(self._collect_toolset(self.agent)) # Close Plugins if self.plugin_manager: @@ -1663,6 +2214,7 @@ def __init__( self, agent: Optional[BaseAgent] = None, *, + node: Any = None, app_name: Optional[str] = None, plugins: Optional[list[BasePlugin]] = None, app: Optional[App] = None, @@ -1672,6 +2224,7 @@ def __init__( Args: agent: The root agent to run. + node: The root node to run. app_name: The application name of the runner. Defaults to 'InMemoryRunner'. plugins: Optional list of plugins for the runner. @@ -1687,6 +2240,7 @@ def __init__( super().__init__( app_name=app_name, agent=agent, + node=node, artifact_service=InMemoryArtifactService(), plugins=plugins, app=app, diff --git a/src/google/adk/sessions/__init__.py b/src/google/adk/sessions/__init__.py index db983f96f1..3f3c9db651 100644 --- a/src/google/adk/sessions/__init__.py +++ b/src/google/adk/sessions/__init__.py @@ -17,9 +17,11 @@ import importlib from typing import TYPE_CHECKING +from ..utils._dependency import missing_extra from .base_session_service import BaseSessionService from .session import Session from .state import State +from .state import StateSchemaError if TYPE_CHECKING: from .database_session_service import DatabaseSessionService @@ -32,6 +34,7 @@ 'InMemorySessionService', 'Session', 'State', + 'StateSchemaError', 'VertexAiSessionService', ] @@ -49,9 +52,6 @@ def __getattr__(name: str): try: module = importlib.import_module(f'{__name__}.database_session_service') except ImportError as e: - raise ImportError( - 'DatabaseSessionService requires sqlalchemy>=2.0, please ensure it' - ' is installed correctly.' - ) from e + raise missing_extra('sqlalchemy', 'db') from e return vars(module)['DatabaseSessionService'] raise AttributeError(f'module {__name__!r} has no attribute {name!r}') diff --git a/src/google/adk/sessions/database_session_service.py b/src/google/adk/sessions/database_session_service.py index d033f1f234..331683af92 100644 --- a/src/google/adk/sessions/database_session_service.py +++ b/src/google/adk/sessions/database_session_service.py @@ -26,19 +26,23 @@ from typing import TypeVar from google.adk.platform import time as platform_time -from sqlalchemy import delete -from sqlalchemy import event -from sqlalchemy import MetaData -from sqlalchemy import select -from sqlalchemy.engine import Connection -from sqlalchemy.engine import make_url -from sqlalchemy.exc import ArgumentError -from sqlalchemy.exc import IntegrityError -from sqlalchemy.ext.asyncio import async_sessionmaker -from sqlalchemy.ext.asyncio import AsyncEngine -from sqlalchemy.ext.asyncio import AsyncSession as DatabaseSessionFactory -from sqlalchemy.ext.asyncio import create_async_engine -from sqlalchemy.pool import StaticPool + +try: + from sqlalchemy import delete + from sqlalchemy import event + from sqlalchemy import MetaData + from sqlalchemy import select + from sqlalchemy.engine import Connection + from sqlalchemy.engine import make_url + from sqlalchemy.exc import ArgumentError + from sqlalchemy.exc import IntegrityError + from sqlalchemy.ext.asyncio import async_sessionmaker + from sqlalchemy.ext.asyncio import AsyncEngine + from sqlalchemy.ext.asyncio import AsyncSession as DatabaseSessionFactory + from sqlalchemy.ext.asyncio import create_async_engine + from sqlalchemy.pool import StaticPool +except ImportError: + pass from typing_extensions import override from . import _session_util @@ -193,6 +197,13 @@ def __init__(self, db_url: str, **kwargs: Any): # 1. Create DB engine for db connection # 2. Create all tables based on schema # 3. Initialize all properties + try: + import sqlalchemy + except ImportError as e: + from ..utils._dependency import missing_extra + + raise missing_extra("sqlalchemy", "db") from e + try: engine_kwargs = dict(kwargs) url = make_url(db_url) @@ -635,11 +646,7 @@ async def append_event(self, session: Session, event: Event) -> Event: is_sqlite = self.db_engine.dialect.name == _SQLITE_DIALECT use_row_level_locking = self._supports_row_level_locking() - state_delta = ( - event.actions.state_delta - if event.actions and event.actions.state_delta - else {} - ) + state_delta = event.actions.state_delta if event.actions.state_delta else {} state_deltas = _session_util.extract_state_delta(state_delta) has_app_delta = bool(state_deltas["app"]) has_user_delta = bool(state_deltas["user"]) diff --git a/src/google/adk/sessions/migration/_schema_check_utils.py b/src/google/adk/sessions/migration/_schema_check_utils.py index a6bc8a546a..8a72c0fd2c 100644 --- a/src/google/adk/sessions/migration/_schema_check_utils.py +++ b/src/google/adk/sessions/migration/_schema_check_utils.py @@ -17,9 +17,12 @@ import logging -from sqlalchemy import create_engine as create_sync_engine -from sqlalchemy import inspect -from sqlalchemy import text +try: + from sqlalchemy import create_engine as create_sync_engine + from sqlalchemy import inspect + from sqlalchemy import text +except ImportError: + pass logger = logging.getLogger("google_adk." + __name__) diff --git a/src/google/adk/sessions/sqlite_session_service.py b/src/google/adk/sessions/sqlite_session_service.py index 427bc3e73e..798befcedc 100644 --- a/src/google/adk/sessions/sqlite_session_service.py +++ b/src/google/adk/sessions/sqlite_session_service.py @@ -391,7 +391,7 @@ async def append_event(self, session: Session, event: Event) -> Event: # Apply state delta if present has_session_state_delta = False - if event.actions and event.actions.state_delta: + if event.actions.state_delta: state_deltas = _session_util.extract_state_delta( event.actions.state_delta ) diff --git a/src/google/adk/sessions/state.py b/src/google/adk/sessions/state.py index a6a3bdbbe9..1089bc0b3f 100644 --- a/src/google/adk/sessions/state.py +++ b/src/google/adk/sessions/state.py @@ -15,6 +15,47 @@ from __future__ import annotations from typing import Any +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from pydantic import BaseModel + + +class StateSchemaError(TypeError): + """Raised when a state mutation violates the declared state_schema.""" + + +def _validate_state_entry( + schema: type[BaseModel], + key: str, + value: Any, +) -> None: + """Validates a single state key-value pair against a Pydantic schema. + + Raises StateSchemaError if the key is not in the schema or the value + does not match the field's type annotation. Prefixed keys (any key + containing ``:``) bypass validation. + """ + if ":" in key: + return + + fields = schema.model_fields + if key not in fields: + raise StateSchemaError( + f"Key '{key}' is not declared in state schema " + f"'{schema.__name__}'. Declared fields: {sorted(fields.keys())}" + ) + + from pydantic import TypeAdapter + from pydantic import ValidationError as PydanticValidationError + + try: + TypeAdapter(fields[key].annotation).validate_python(value) + except PydanticValidationError as e: + raise StateSchemaError( + f"Value for '{key}' does not match type " + f"'{fields[key].annotation}' in '{schema.__name__}': {e}" + ) from e class State: @@ -24,14 +65,22 @@ class State: USER_PREFIX = "user:" TEMP_PREFIX = "temp:" - def __init__(self, value: dict[str, Any], delta: dict[str, Any]): + def __init__( + self, + value: dict[str, Any], + delta: dict[str, Any], + schema: type[BaseModel] | None = None, + ): """ Args: value: The current value of the state dict. delta: The delta change to the current value that hasn't been committed. + schema: Optional Pydantic model declaring the expected state keys and + types. When set, mutations are validated against this schema. """ self._value = value self._delta = delta + self._schema = schema def __getitem__(self, key: str) -> Any: """Returns the value of the state dict for the given key.""" @@ -39,8 +88,10 @@ def __getitem__(self, key: str) -> Any: return self._delta[key] return self._value[key] - def __setitem__(self, key: str, value: Any): + def __setitem__(self, key: str, value: Any) -> None: """Sets the value of the state dict for the given key.""" + if self._schema is not None and isinstance(self._schema, type): + _validate_state_entry(self._schema, key, value) # TODO: make new change only store in delta, so that self._value is only # updated at the storage commit time. self._value[key] = value @@ -68,8 +119,11 @@ def get(self, key: str, default: Any = None) -> Any: return default return self[key] - def update(self, delta: dict[str, Any]): + def update(self, delta: dict[str, Any]) -> None: """Updates the state dict with the given delta.""" + if self._schema is not None and isinstance(self._schema, type): + for key, value in delta.items(): + _validate_state_entry(self._schema, key, value) self._value.update(delta) self._delta.update(delta) diff --git a/src/google/adk/sessions/vertex_ai_session_service.py b/src/google/adk/sessions/vertex_ai_session_service.py index 8c1fdc134e..e7e1dc052a 100644 --- a/src/google/adk/sessions/vertex_ai_session_service.py +++ b/src/google/adk/sessions/vertex_ai_session_service.py @@ -92,6 +92,13 @@ def __init__( visit https://cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview """ + try: + import vertexai + except ImportError as e: + from ..utils._dependency import missing_extra + + raise missing_extra('google-cloud-aiplatform', 'gcp') from e + self._project = project self._location = location self._agent_engine_id = agent_engine_id diff --git a/src/google/adk/skills/_utils.py b/src/google/adk/skills/_utils.py index 3270025e01..a42e531029 100644 --- a/src/google/adk/skills/_utils.py +++ b/src/google/adk/skills/_utils.py @@ -24,7 +24,6 @@ import zipfile from google.auth import credentials as auth -from google.cloud import storage from pydantic import ValidationError import yaml @@ -407,6 +406,15 @@ def _list_skills_in_gcs_dir( Returns: Dictionary mapping skill IDs to their frontmatter. """ + try: + from google.cloud import storage + except ImportError as e: + raise ImportError( + "google-cloud-storage is required to list skills in GCS. Install it" + " with `pip install google-cloud-storage` or `pip install" + " google-adk[gcp]`." + ) from e + client = storage.Client(project=project_id, credentials=credentials) bucket = client.bucket(bucket_name) @@ -466,6 +474,14 @@ def _load_skill_from_gcs_dir( ValueError: If SKILL.md is invalid or the skill name does not match the directory name. """ + try: + from google.cloud import storage + except ImportError as e: + raise ImportError( + "google-cloud-storage is required to load skills from GCS. Install it" + " with `pip install google-cloud-storage` or `pip install" + " google-adk[gcp]`." + ) from e client = storage.Client(project=project_id, credentials=credentials) bucket = client.bucket(bucket_name) diff --git a/src/google/adk/telemetry/_experimental_semconv.py b/src/google/adk/telemetry/_experimental_semconv.py index a415d72de8..8d81339cc0 100644 --- a/src/google/adk/telemetry/_experimental_semconv.py +++ b/src/google/adk/telemetry/_experimental_semconv.py @@ -434,8 +434,14 @@ def _to_system_instructions( def set_operation_details_common_attributes( operation_details_common_attributes: MutableMapping[str, AttributeValue], attributes: Mapping[str, AttributeValue], -): + log_only_attributes: Mapping[str, AttributeValue] | None = None, +) -> None: operation_details_common_attributes.update(attributes) + if log_only_attributes and get_content_capturing_mode() in ( + 'EVENT_ONLY', + 'SPAN_AND_EVENT', + ): + operation_details_common_attributes.update(log_only_attributes) async def set_operation_details_attributes_from_request( diff --git a/src/google/adk/telemetry/_instrumentation.py b/src/google/adk/telemetry/_instrumentation.py index 3f5fdb5f3c..3f51a31745 100644 --- a/src/google/adk/telemetry/_instrumentation.py +++ b/src/google/adk/telemetry/_instrumentation.py @@ -23,9 +23,8 @@ from typing import AsyncIterator from typing import TYPE_CHECKING -logger = logging.getLogger("google_adk." + __name__) - from opentelemetry import trace +import opentelemetry.context as context_api from . import _metrics from . import tracing @@ -38,6 +37,8 @@ from ..models.llm_response import LlmResponse from ..tools.base_tool import BaseTool +logger = logging.getLogger("google_adk." + __name__) + def _get_elapsed_ms( span: trace.Span | tracing.GenerateContentSpan | None, @@ -73,7 +74,9 @@ def _get_elapsed_ms( class TelemetryContext: """Stores all telemetry related state.""" + otel_context: context_api.Context | None = None function_response_event: event_lib.Event | None = None + error_type: str | None = None span: tracing.GenerateContentSpan | trace.Span | None = None _llm_responses: list[LlmResponse] = dataclasses.field(default_factory=list) @@ -86,39 +89,53 @@ def record_llm_response(self, response: LlmResponse) -> None: tracing.trace_inference_result(self.span, response) +def _record_agent_metrics( + agent_name: str, + elapsed_ms: float, + user_content: Any, + events: Any, + caught_error: Exception | None, +) -> None: + try: + _metrics.record_agent_invocation_duration( + agent_name, + elapsed_ms, + caught_error, + ) + _metrics.record_agent_request_size(agent_name, user_content) + _metrics.record_agent_response_size(agent_name, events) + _metrics.record_agent_workflow_steps(agent_name, events) + except Exception: # pylint: disable=broad-exception-caught + logger.exception("Failed to record agent metrics for agent %s", agent_name) + + @contextlib.asynccontextmanager async def record_agent_invocation( ctx: InvocationContext, agent: BaseAgent ) -> AsyncIterator[TelemetryContext]: - """Unified context manager for consolidated metrics and tracing.""" + """Unified context manager for consolidated agent invocation telemetry.""" start_time = time.monotonic() caught_error: Exception | None = None - tel_ctx: TelemetryContext = TelemetryContext() span: trace.Span | None = None span_name = f"invoke_agent {agent.name}" try: with tracing.tracer.start_as_current_span(span_name) as s: span = s tracing.trace_agent_invocation(span, agent, ctx) + tel_ctx = TelemetryContext(otel_context=context_api.get_current()) yield tel_ctx except Exception as e: caught_error = e raise finally: elapsed_ms = _get_elapsed_ms(span, start_time) - try: - _metrics.record_agent_invocation_duration( - agent.name, - elapsed_ms, - caught_error, - ) - _metrics.record_agent_request_size(agent.name, ctx.user_content) - _metrics.record_agent_response_size(agent.name, ctx.session.events) - _metrics.record_agent_workflow_steps(agent.name, ctx.session.events) - except Exception: # pylint: disable=broad-exception-caught - logger.exception( - "Failed to record agent metrics for agent %s", agent.name - ) + _record_agent_metrics( + agent.name, + elapsed_ms, + getattr(ctx, "user_content", None), + getattr(getattr(ctx, "session", None), "events", []), + caught_error, + ) @contextlib.asynccontextmanager @@ -130,12 +147,12 @@ async def record_tool_execution( """Unified context manager for consolidated tool execution telemetry.""" start_time = time.monotonic() caught_error: Exception | None = None - tel_ctx: TelemetryContext = TelemetryContext() span: trace.Span | None = None span_name = f"execute_tool {tool.name}" try: with tracing.tracer.start_as_current_span(span_name) as s: span = s + tel_ctx = TelemetryContext(otel_context=context_api.get_current()) try: yield tel_ctx except Exception as e: @@ -150,6 +167,7 @@ async def record_tool_execution( args=function_args, function_response_event=response_event, error=caught_error, + error_type=tel_ctx.error_type, ) finally: try: @@ -185,23 +203,27 @@ async def record_inference_telemetry( finally: inference_error = sys.exc_info()[1] elapsed_ms = _get_elapsed_ms(tel_ctx.span, start_time) + agent = invocation_context.agent try: - agent_name = invocation_context.agent.name - if tracing._should_emit_native_telemetry(invocation_context.agent): + if agent is not None and tracing._should_emit_native_telemetry(agent): _metrics.record_client_operation_duration( - agent_name=agent_name, + agent_name=agent.name, elapsed_ms=elapsed_ms, llm_request=llm_request, responses=tel_ctx.llm_responses, - error=inference_error, + error=( + inference_error + if isinstance(inference_error, Exception) + else None + ), ) _metrics.record_client_token_usage( - agent_name=agent_name, + agent_name=agent.name, llm_request=llm_request, responses=tel_ctx.llm_responses, ) except Exception: # pylint: disable=broad-exception-caught logger.exception( "Failed to record inference metrics for agent %s", - invocation_context.agent.name, + agent.name if agent is not None else "", ) diff --git a/src/google/adk/telemetry/node_tracing.py b/src/google/adk/telemetry/node_tracing.py new file mode 100644 index 0000000000..500cb89459 --- /dev/null +++ b/src/google/adk/telemetry/node_tracing.py @@ -0,0 +1,146 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from collections.abc import AsyncIterator +from contextlib import asynccontextmanager +from dataclasses import dataclass +from dataclasses import field +from typing import TYPE_CHECKING + +from opentelemetry import context as context_api +from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_CONVERSATION_ID +from opentelemetry.semconv._incubating.attributes.gen_ai_attributes import GEN_AI_OPERATION_NAME +from opentelemetry.util.types import Attributes + +from ..agents.context import Context +from ..workflow._base_node import BaseNode +from .tracing import tracer + +if TYPE_CHECKING: + from ..events.event import Event + from ..workflow._workflow import Workflow + + +@dataclass(frozen=True) +class TelemetryContext: + """Telemetry specific context tied to the lifetime of the span.""" + + otel_context: context_api.Context + """OTel context holding the current trace span.""" + + _associated_event_ids: list[str] = field(default_factory=list) + """Event IDs added to the event queue within a given node.""" + + def add_event(self, event: Event) -> None: + """Adds an event ID to the associated events list.""" + self._associated_event_ids.append(event.id) + + +@dataclass +class _SpanMetadata: + name: str + attributes: Attributes + + +@asynccontextmanager +async def start_as_current_node_span( + context: Context, node: BaseNode +) -> AsyncIterator[TelemetryContext]: + """Creates a scope-based OpenTelemetry span, representing a node invocation. + + Implements emitting of the following spans: + - `invoke_agent {agent.name}` + - `invoke_workflow {workflow.name}` + - `invoke_node {node.name}` + + invoke_agent spans align with OpenTelemetry Semantic Conventions (semconv) version 1.36 spans for backwards compatibility. + https://github.com/open-telemetry/semantic-conventions/blob/v1.36.0/docs/gen-ai/README.md + + invoke_workflow spans align with semconv version 1.41, because these were not included in any prior releases. + https://github.com/open-telemetry/semantic-conventions/blob/main/docs/gen-ai/README.md + + invoke_node spans are not present in any semconv release. + We will create a proposal to standardize them. + + Args: + context: Context in which the span is created. + node: The node to be invoked inside the created span. + + Yields: + Context with the started span. + """ + + span_metadata = _span_metadata(context, node) + if span_metadata is None: + token = context_api.attach(context.telemetry_context.otel_context) + try: + yield TelemetryContext( + otel_context=context.telemetry_context.otel_context + ) + finally: + context_api.detach(token) + return + + with tracer.start_as_current_span( + span_metadata.name, + attributes=span_metadata.attributes, + context=context.telemetry_context.otel_context, + ) as span: + telemetry_context = TelemetryContext(otel_context=context_api.get_current()) + yield telemetry_context + + if span.is_recording() and len(telemetry_context._associated_event_ids) > 0: + span.set_attribute( + "gcp.vertex.agent.associated_event_ids", + telemetry_context._associated_event_ids, + ) + + +def _span_metadata(context: Context, node: BaseNode) -> _SpanMetadata | None: + from ..agents.base_agent import BaseAgent + from ..workflow._workflow import Workflow + + if isinstance(node, BaseAgent): + return None + elif isinstance(node, Workflow): + return _workflow_span_metadata(context, node) + else: + return _default_node_span_metadata(context, node) + + +def _workflow_span_metadata( + context: Context, workflow: Workflow +) -> _SpanMetadata: + return _SpanMetadata( + name=f"invoke_workflow {workflow.name}", + attributes={ + GEN_AI_OPERATION_NAME: "invoke_workflow", + "gen_ai.workflow.name": workflow.name, + GEN_AI_CONVERSATION_ID: context.session.id, + }, + ) + + +def _default_node_span_metadata( + context: Context, node: BaseNode +) -> _SpanMetadata: + return _SpanMetadata( + name=f"invoke_node {node.name}", + attributes={ + GEN_AI_OPERATION_NAME: "invoke_node", + GEN_AI_CONVERSATION_ID: context.session.id, + }, + ) diff --git a/src/google/adk/telemetry/tracing.py b/src/google/adk/telemetry/tracing.py index 29beeebe21..8c7afc0ced 100644 --- a/src/google/adk/telemetry/tracing.py +++ b/src/google/adk/telemetry/tracing.py @@ -66,6 +66,7 @@ from .. import version from ..utils.model_name_utils import is_gemini_model +from ._experimental_semconv import get_content_capturing_mode from ._experimental_semconv import is_experimental_semconv from ._experimental_semconv import maybe_log_completion_details from ._experimental_semconv import set_operation_details_attributes_from_request @@ -171,6 +172,7 @@ def trace_tool_call( function_response_event: Event | None, error: Exception | None = None, span: Span | None = None, + error_type: str | None = None, ): """Traces tool call. @@ -180,6 +182,10 @@ def trace_tool_call( function_response_event: The event with the function response details. error: The exception raised during tool execution, if any. span: The span to record attributes on. If None, uses current span. + error_type: An error type string detected from the tool's response dict + (e.g., "HTTP_ERROR", "MCP_TOOL_ERROR"). Used when the tool returned an + error as a dict rather than raising an exception. Ignored if `error` is + also set (exception takes precedence). """ span = span or trace.get_current_span() @@ -196,6 +202,8 @@ def trace_tool_call( span.set_attribute(ERROR_TYPE, str(error.error_type)) else: span.set_attribute(ERROR_TYPE, type(error).__name__) + elif error_type is not None: + span.set_attribute(ERROR_TYPE, error_type) # Special case for client side association with a remote tool call if ( @@ -556,18 +564,24 @@ def use_generate_content_span( common_attributes = { GEN_AI_AGENT_NAME: invocation_context.agent.name, GEN_AI_CONVERSATION_ID: invocation_context.session.id, - USER_ID: invocation_context.session.user_id, 'gcp.vertex.agent.event_id': model_response_event.id, 'gcp.vertex.agent.invocation_id': invocation_context.invocation_id, } + log_only_common_attributes = {} + if invocation_context.session.user_id is not None: + log_only_common_attributes[USER_ID] = invocation_context.session.user_id if _should_emit_native_telemetry(invocation_context.agent): with _use_native_generate_content_span_stable_semconv( llm_request=llm_request, common_attributes=common_attributes, + log_only_common_attributes=log_only_common_attributes, ) as span: yield span.span else: - with _use_extra_generate_content_attributes(common_attributes): + with _use_extra_generate_content_attributes( + common_attributes, + log_only_extra_attributes=log_only_common_attributes, + ): yield @@ -587,18 +601,23 @@ async def use_inference_span( common_attributes = { GEN_AI_AGENT_NAME: invocation_context.agent.name, GEN_AI_CONVERSATION_ID: invocation_context.session.id, - USER_ID: invocation_context.session.user_id, 'gcp.vertex.agent.event_id': model_response_event.id, 'gcp.vertex.agent.invocation_id': invocation_context.invocation_id, } + log_only_common_attributes = {} + if invocation_context.session.user_id is not None: + log_only_common_attributes[USER_ID] = invocation_context.session.user_id if _should_emit_native_telemetry(invocation_context.agent): async with _use_native_generate_content_span( llm_request=llm_request, common_attributes=common_attributes, + log_only_common_attributes=log_only_common_attributes, ) as gc_span: if is_experimental_semconv(): set_operation_details_common_attributes( - gc_span.operation_details_common_attributes, common_attributes + gc_span.operation_details_common_attributes, + common_attributes, + log_only_attributes=log_only_common_attributes, ) try: yield gc_span @@ -610,7 +629,10 @@ async def use_inference_span( gc_span.operation_details_common_attributes, ) else: - with _use_extra_generate_content_attributes(common_attributes): + with _use_extra_generate_content_attributes( + common_attributes, + log_only_extra_attributes=log_only_common_attributes, + ): yield @@ -669,6 +691,7 @@ def _should_emit_native_telemetry(agent: BaseAgent) -> bool: @contextmanager def _use_extra_generate_content_attributes( extra_attributes: Mapping[str, AttributeValue], + log_only_extra_attributes: Mapping[str, AttributeValue] | None = None, ): try: from opentelemetry.instrumentation.google_genai import GENERATE_CONTENT_EXTRA_ATTRIBUTES_CONTEXT_KEY @@ -680,13 +703,25 @@ def _use_extra_generate_content_attributes( + ' Please upgrade to version to 0.6b0 or above.' ) yield + return - tok = otel_context.attach( - otel_context.set_value( - GENERATE_CONTENT_EXTRA_ATTRIBUTES_CONTEXT_KEY, extra_attributes - ) + ctx = otel_context.set_value( + GENERATE_CONTENT_EXTRA_ATTRIBUTES_CONTEXT_KEY, extra_attributes ) + if log_only_extra_attributes: + try: + from opentelemetry.instrumentation.google_genai import GENERATE_CONTENT_EVENT_ONLY_EXTRA_ATTRIBUTES_CONTEXT_KEY + + ctx = otel_context.set_value( + GENERATE_CONTENT_EVENT_ONLY_EXTRA_ATTRIBUTES_CONTEXT_KEY, + log_only_extra_attributes, + context=ctx, + ) + except (ImportError, AttributeError): + pass + + tok = otel_context.attach(ctx) try: yield finally: @@ -699,12 +734,9 @@ def _is_gemini_agent(agent: BaseAgent) -> bool: if not isinstance(agent, LlmAgent): return False - if isinstance(agent.model, str): - return is_gemini_model(agent.model) - - from ..models.google_llm import Gemini - - return isinstance(agent.model, Gemini) + model = agent.model if agent.model != '' else agent._default_model + model_name = model if isinstance(model, str) else model.model + return is_gemini_model(model_name) def _set_common_generate_content_attributes( @@ -721,6 +753,7 @@ def _set_common_generate_content_attributes( def _use_native_generate_content_span_stable_semconv( llm_request: LlmRequest, common_attributes: Mapping[str, AttributeValue], + log_only_common_attributes: Mapping[str, AttributeValue] | None = None, ) -> Iterator[GenerateContentSpan]: with tracer.start_as_current_span( f"generate_content {llm_request.model or ''}" @@ -742,12 +775,18 @@ def _use_native_generate_content_span_stable_semconv( attributes={GEN_AI_SYSTEM: _guess_gemini_system_name()}, ) ) + user_message_attributes = {GEN_AI_SYSTEM: _guess_gemini_system_name()} + if _should_log_prompt_response_content() and log_only_common_attributes: + user_id = log_only_common_attributes.get(USER_ID) + if user_id is not None: + user_message_attributes[USER_ID] = user_id + for content in llm_request.contents: otel_logger.emit( LogRecord( event_name='gen_ai.user.message', body={'content': _serialize_content_with_elision(content)}, - attributes={GEN_AI_SYSTEM: _guess_gemini_system_name()}, + attributes=user_message_attributes, ) ) @@ -758,10 +797,13 @@ def _use_native_generate_content_span_stable_semconv( async def _use_native_generate_content_span( llm_request: LlmRequest, common_attributes: Mapping[str, AttributeValue], + log_only_common_attributes: Mapping[str, AttributeValue] | None = None, ) -> AsyncIterator[GenerateContentSpan]: if not is_experimental_semconv(): with _use_native_generate_content_span_stable_semconv( - llm_request, common_attributes + llm_request, + common_attributes, + log_only_common_attributes=log_only_common_attributes, ) as gc_span: yield gc_span return diff --git a/src/google/adk/tools/__init__.py b/src/google/adk/tools/__init__.py index b444e3a744..770a2cb373 100644 --- a/src/google/adk/tools/__init__.py +++ b/src/google/adk/tools/__init__.py @@ -20,6 +20,7 @@ # The TYPE_CHECKING block is needed for autocomplete to work. if TYPE_CHECKING: from ..auth.auth_tool import AuthToolArguments + from ._request_input_tool import request_input from .agent_tool import AgentTool from .api_registry import ApiRegistry from .apihub_tool.apihub_toolset import APIHubToolset @@ -80,6 +81,7 @@ 'LongRunningFunctionTool', ), 'preload_memory': ('.preload_memory_tool', 'preload_memory_tool'), + 'request_input': ('._request_input_tool', 'request_input'), 'ToolContext': ('.tool_context', 'ToolContext'), 'transfer_to_agent': ('.transfer_to_agent_tool', 'transfer_to_agent'), 'TransferToAgentTool': ( diff --git a/src/google/adk/tools/_request_input_tool.py b/src/google/adk/tools/_request_input_tool.py new file mode 100644 index 0000000000..9a124f7e40 --- /dev/null +++ b/src/google/adk/tools/_request_input_tool.py @@ -0,0 +1,57 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import logging +from typing import Any +from typing import Optional + +from google.adk.flows.llm_flows.functions import REQUEST_INPUT_FUNCTION_CALL_NAME + +from .long_running_tool import LongRunningFunctionTool + +logger = logging.getLogger('google_adk.' + __name__) + + +def _request_input_func( + message: str, + response_schema: Optional[dict[str, Any]] = None, +) -> None: + """Ask the user a question and wait for their response. + + Use this when you need clarification or additional information before + proceeding. + + Args: + message: The question or prompt to display to the user. + response_schema: JSON Schema describing the expected response format. Use + {"type": "string"} for free-text, {"type": "boolean"} for + yes/no, or a structured object schema for complex input. + + Returns: + None. Long-running tools return None to signal that the execution should + pause and wait for user input. + """ + logger.info('request_input called with message: %s', message) + # Returning None triggers the long-running tool interruption mechanism. + return None + + +# Dynamically rename the function to match the workflow interrupt naming space. +# This allows direct instantiation of LongRunningFunctionTool without subclassing, +# keeping RequestInputTool out of the public API. +_request_input_func.__name__ = REQUEST_INPUT_FUNCTION_CALL_NAME + +request_input = LongRunningFunctionTool(_request_input_func) diff --git a/src/google/adk/tools/agent_tool.py b/src/google/adk/tools/agent_tool.py index 50816f5361..1768861dba 100644 --- a/src/google/adk/tools/agent_tool.py +++ b/src/google/adk/tools/agent_tool.py @@ -14,12 +14,14 @@ from __future__ import annotations +import asyncio from typing import Any from typing import Optional from typing import TYPE_CHECKING from google.genai import types from pydantic import BaseModel +from pydantic import Field from pydantic import model_validator from typing_extensions import override @@ -331,3 +333,103 @@ class AgentToolConfig(BaseToolConfig): include_plugins: bool = True """Whether to include plugins from parent runner context.""" + + +class _SingleTurnAgentTool(AgentTool): + """A tool that wraps a single-turn agent and runs it via ctx.run_node. + + This is only used in mode='chat' LlmAgent. + """ + + @override + async def run_async( + self, + *, + args: dict[str, Any], + tool_context: ToolContext, + ) -> Any: + input_schema = _get_input_schema(self.agent) + if input_schema: + try: + node_input = input_schema.model_validate(args) + except Exception as e: + return f'Error validating input: {e}' + else: + node_input = args.get('request') + + try: + return await tool_context.run_node( + self.agent, node_input=node_input, use_sub_branch=True + ) + except Exception as e: + return f'Error running sub-agent: {e}' + + +class _DefaultTaskInput(BaseModel): + request: str = Field( + description='Detailed instructions or context for the task sub-agent.' + ) + + +class _TaskAgentTool(AgentTool): + """A tool that wraps a task-mode agent and acts as a framework delegation marker. + + This is only used in mode='chat' LlmAgent. The wrapper intercepts calls + to this tool to drive task sub-agent execution via ctx.run_node. + """ + + def __init__( + self, + agent: BaseAgent, + skip_summarization: bool = False, + *, + include_plugins: bool = True, + propagate_grounding_metadata: bool = False, + ): + super().__init__( + agent, + skip_summarization, + include_plugins=include_plugins, + propagate_grounding_metadata=propagate_grounding_metadata, + ) + self._defers_response = True + + @override + def _get_declaration(self) -> types.FunctionDeclaration: + from ..utils.variant_utils import GoogleLLMVariant + + input_schema = _get_input_schema(self.agent) or _DefaultTaskInput + + from . import _function_tool_declarations + + result = ( + _function_tool_declarations.build_function_declaration_with_json_schema( + func=input_schema + ) + ) + base_desc = self.agent.description or '' + suffix = ( + '\nIMPORTANT: This tool delegates execution to a specialized agent.' + ' Do NOT call this tool in parallel with any other tools.' + ) + result.description = f'{base_desc}{suffix}'.strip() + result.name = self.name + + if self._api_variant != GoogleLLMVariant.GEMINI_API: + output_schema = _get_output_schema(self.agent) + if output_schema: + result.response_json_schema = {'type': 'object'} + else: + result.response_json_schema = {'type': 'string'} + + return result + + @override + async def run_async( + self, + *, + args: dict[str, Any], + tool_context: ToolContext, + ) -> Any: + # Framework handles task delegation dispatch directly via the wrapper. + return None diff --git a/src/google/adk/tools/base_tool.py b/src/google/adk/tools/base_tool.py index 8dd112a6c8..9139c23d57 100644 --- a/src/google/adk/tools/base_tool.py +++ b/src/google/adk/tools/base_tool.py @@ -33,7 +33,6 @@ from ..utils.variant_utils import get_google_llm_variant from ..utils.variant_utils import GoogleLLMVariant -from .tool_context import ToolContext logger = logging.getLogger("google_adk." + __name__) @@ -41,6 +40,11 @@ from ..models.llm_request import LlmRequest from .tool_configs import ToolArgsConfig +# Re-exported for backward compatibility: existing code imports ToolContext +# from this module and annotates tool methods with base_tool.ToolContext, which +# ADK resolves at runtime via get_type_hints(), so it must be importable here. +from .tool_context import ToolContext # pylint: disable=unused-import + SelfTool = TypeVar("SelfTool", bound="BaseTool") @@ -56,6 +60,27 @@ class BaseTool(ABC): """Whether the tool is a long running operation, which typically returns a resource id first and finishes the operation later.""" + _defers_response: bool = False + """⚠️ Internal — do not set this from external code. + + When True, the auto FunctionResponse build is skipped whenever + ``run_async`` returns a falsy value (typically ``None``). In that + case, some other orchestrator (e.g., the LlmAgent wrapper for task + delegation, or an external system for webhook-style callbacks) + produces the matching FR later in the conversation. + + When ``run_async`` returns a non-falsy value, the FR is built + normally — same as for any regular tool. + + Compare with ``is_long_running``, which has the same skip-on-empty + semantics but additionally marks the call as long-running on the + emitted event (``event.long_running_tool_ids``), affecting A2A + conversion, plugin logging, and interrupt tracking. + + Currently set only by ADK-internal tools (e.g. ``_TaskAgentTool``). + Not part of the public API and may change without notice. + """ + custom_metadata: Optional[dict[str, Any]] = None """The custom metadata of the BaseTool. @@ -76,6 +101,7 @@ def __init__( self.name = name self.description = description self.is_long_running = is_long_running + self._defers_response = False self.custom_metadata = custom_metadata def _get_declaration(self) -> Optional[types.FunctionDeclaration]: diff --git a/src/google/adk/tools/bash_tool.py b/src/google/adk/tools/bash_tool.py index 85575656af..b9aba1554e 100644 --- a/src/google/adk/tools/bash_tool.py +++ b/src/google/adk/tools/bash_tool.py @@ -245,3 +245,9 @@ async def run_async( "stdout": stdout_res, "stderr": stderr_res, } + + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get("error"): + return "TOOL_ERROR" + return None diff --git a/src/google/adk/tools/computer_use/computer_use_tool.py b/src/google/adk/tools/computer_use/computer_use_tool.py index da75c5410e..9830072155 100644 --- a/src/google/adk/tools/computer_use/computer_use_tool.py +++ b/src/google/adk/tools/computer_use/computer_use_tool.py @@ -108,6 +108,29 @@ async def run_async( ) -> Any: """Run the computer control function with normalized coordinates.""" + # Check for safety confirmation if required by the model + if not tool_context.tool_confirmation: + safety_decision = args.get("safety_decision") + if safety_decision: + decision = safety_decision.get("decision") + explanation = safety_decision.get("explanation") + + if decision == "require_confirmation": + hint = ( + explanation + or "This computer use action requires safety confirmation." + ) + tool_context.request_confirmation(hint=hint) + tool_context.actions.skip_summarization = True + return { + "error": ( + "This tool call requires confirmation, please approve or" + " reject." + ) + } + elif not tool_context.tool_confirmation.confirmed: + return {"error": "This tool call is rejected."} + try: # Normalize coordinates if present if "x" in args: @@ -143,8 +166,9 @@ async def run_async( result = await super().run_async(args=args, tool_context=tool_context) # Process the result if it's an EnvironmentState + response = result if isinstance(result, ComputerState): - return { + response = { "image": { "mimetype": "image/png", "data": base64.b64encode(result.screenshot).decode("utf-8"), @@ -152,7 +176,15 @@ async def run_async( "url": result.url, } - return result + if ( + tool_context.tool_confirmation + and tool_context.tool_confirmation.confirmed + ): + if not isinstance(response, dict): + response = {"result": response} + response["safety_acknowledgement"] = "true" + + return response except Exception as e: logger.error("Error in ComputerUseTool.run_async: %s", e) diff --git a/src/google/adk/tools/discovery_engine_search_tool.py b/src/google/adk/tools/discovery_engine_search_tool.py index 54603e6a83..eea843c35f 100644 --- a/src/google/adk/tools/discovery_engine_search_tool.py +++ b/src/google/adk/tools/discovery_engine_search_tool.py @@ -220,6 +220,12 @@ def discovery_engine_search( except GoogleAPICallError as e: return {'status': 'error', 'error_message': str(e)} + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get('status') == 'error': + return 'TOOL_ERROR' + return None + def _do_search( self, query: str, diff --git a/src/google/adk/tools/environment/_edit_file_tool.py b/src/google/adk/tools/environment/_edit_file_tool.py new file mode 100644 index 0000000000..fa9f3143f9 --- /dev/null +++ b/src/google/adk/tools/environment/_edit_file_tool.py @@ -0,0 +1,140 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""EditFileTool for performing surgical text replacements in existing files.""" + +from __future__ import annotations + +import logging +import re +from typing import Any +from typing import Optional +from typing import TYPE_CHECKING + +from google.genai import types +from typing_extensions import override + +from ...environment._base_environment import BaseEnvironment +from ...utils.feature_decorator import experimental +from ..base_tool import BaseTool + +if TYPE_CHECKING: + from ..tool_context import ToolContext + + +logger = logging.getLogger('google_adk.' + __name__) + + +@experimental +class EditFileTool(BaseTool): + """Perform a surgical text replacement in an existing file.""" + + def __init__(self, environment: BaseEnvironment): + super().__init__( + name='EditFile', + description=( + 'Replace an exact substring in an existing file ' + 'with new text. The old_string must appear exactly ' + 'once in the file. To create new files, use the WriteFile tool.' + ), + ) + self._environment = environment + + @override + def _get_declaration(self) -> Optional[types.FunctionDeclaration]: + return types.FunctionDeclaration( + name=self.name, + description=self.description, + parameters_json_schema={ + 'type': 'object', + 'properties': { + 'path': { + 'type': 'string', + 'description': ( + 'Path of the file to edit within the environment.' + ), + }, + 'old_string': { + 'type': 'string', + 'description': ( + 'The exact text to find and replace. Must not be empty.' + ), + }, + 'new_string': { + 'type': 'string', + 'description': 'The replacement text.', + }, + }, + 'required': ['path', 'old_string', 'new_string'], + }, + ) + + @override + async def run_async( + self, *, args: dict[str, Any], tool_context: ToolContext + ) -> Any: + path = args.get('path', '') + old_string = args.get('old_string', '') + new_string = args.get('new_string', '') + if not path: + return {'status': 'error', 'error': '`path` is required.'} + + if not old_string: + return { + 'status': 'error', + 'error': ( + '`old_string` cannot be empty. To create a new ' + 'file, use the WriteFile tool.' + ), + } + + try: + data_bytes = await self._environment.read_file(path) + content = data_bytes.decode('utf-8', errors='replace') + except FileNotFoundError: + return {'status': 'error', 'error': f'File not found: {path}'} + + # Normalize line breaks in old_string to \n and use regex for flexible matching + normalized_old = old_string.replace('\r\n', '\n') + pattern = re.escape(normalized_old).replace('\n', '\r?\n') + + matches = re.findall(pattern, content) + count = len(matches) + + if count == 0: + return { + 'status': 'error', + 'error': ( + '`old_string` not found in file. Read the file first ' + 'to verify contents.' + ), + } + if count > 1: + return { + 'status': 'error', + 'error': ( + f'`old_string` appears {count} times. Provide more ' + 'surrounding context to make it unique.' + ), + } + + new_content = re.sub(pattern, lambda m: new_string, content, count=1) + await self._environment.write_file(path, new_content) + return {'status': 'ok', 'message': f'Edited {path}'} + + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get('status') == 'error': + return 'TOOL_ERROR' + return None diff --git a/src/google/adk/tools/environment/_environment_toolset.py b/src/google/adk/tools/environment/_environment_toolset.py index 2d894c3325..1dfaff7a39 100644 --- a/src/google/adk/tools/environment/_environment_toolset.py +++ b/src/google/adk/tools/environment/_environment_toolset.py @@ -26,10 +26,10 @@ from ...utils.feature_decorator import experimental from ..base_toolset import BaseToolset from ._constants import ENVIRONMENT_INSTRUCTION -from ._tools import EditFileTool -from ._tools import ExecuteTool -from ._tools import ReadFileTool -from ._tools import WriteFileTool +from ._edit_file_tool import EditFileTool +from ._execute_tool import ExecuteTool +from ._read_file_tool import ReadFileTool +from ._write_file_tool import WriteFileTool if TYPE_CHECKING: from ...agents.readonly_context import ReadonlyContext diff --git a/src/google/adk/tools/environment/_execute_tool.py b/src/google/adk/tools/environment/_execute_tool.py new file mode 100644 index 0000000000..73b245a089 --- /dev/null +++ b/src/google/adk/tools/environment/_execute_tool.py @@ -0,0 +1,137 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""ExecuteTool for running shell commands in the environment.""" + +from __future__ import annotations + +import logging +from typing import Any +from typing import Optional +from typing import TYPE_CHECKING + +from google.genai import types +from typing_extensions import override + +from ...environment._base_environment import BaseEnvironment +from ...environment._base_environment import ExecutionResult +from ...utils.feature_decorator import experimental +from ..base_tool import BaseTool +from ._constants import DEFAULT_TIMEOUT +from ._constants import MAX_OUTPUT_CHARS +from ._utils import truncate as _truncate + +if TYPE_CHECKING: + from ..tool_context import ToolContext + + +logger = logging.getLogger('google_adk.' + __name__) + + +_EXECUTE_TOOL_DESCRIPTION = """ +Run a shell command in the environment. For running programs, tests, and build +commands ONLY. WARNING: Do NOT use for file reading -- use the ReadFile tool +instead. Shell commands like 'cat, head, tail will produce inferior results. +Good: Execute("python3 script.py"), Execute("pytest"), Execute("find ..."). +Bad: Execute("head ..."), Execute("cat ..."). +""" + + +@experimental +class ExecuteTool(BaseTool): + """Run a shell command in the environment's working directory.""" + + def __init__( + self, + environment: BaseEnvironment, + *, + max_output_chars: Optional[int] = None, + ): + super().__init__( + name='Execute', + description=_EXECUTE_TOOL_DESCRIPTION, + ) + self._environment = environment + self._max_output_chars = ( + max_output_chars if max_output_chars is not None else MAX_OUTPUT_CHARS + ) + + @override + def _get_declaration(self) -> Optional[types.FunctionDeclaration]: + return types.FunctionDeclaration( + name=self.name, + description=self.description, + parameters_json_schema={ + 'type': 'object', + 'properties': { + 'command': { + 'type': 'string', + 'description': ( + 'The shell command to execute. Chain dependent commands' + ' with &&.' + ), + }, + }, + 'required': ['command'], + }, + ) + + @override + async def run_async( + self, *, args: dict[str, Any], tool_context: ToolContext + ) -> Any: + command = args.get('command', '') + if not command: + return {'status': 'error', 'error': '`command` is required.'} + + logger.debug('Execute command: %s', command) + try: + execution_result: ExecutionResult = await self._environment.execute( + command, timeout=DEFAULT_TIMEOUT + ) + logger.debug( + 'Execute result: exit_code=%d, stdout=%r, stderr=%r, timed_out=%r', + execution_result.exit_code, + execution_result.stdout[:200] if execution_result.stdout else '', + execution_result.stderr[:200] if execution_result.stderr else '', + execution_result.timed_out, + ) + except Exception as e: + logger.exception('Execute failed: %s', e) + return {'status': 'error', 'error': str(e)} + + result: dict[str, Any] = {'status': 'ok'} + if execution_result.stdout: + result['stdout'] = _truncate( + execution_result.stdout, + limit=self._max_output_chars, + ) + if execution_result.stderr: + result['stderr'] = _truncate( + execution_result.stderr, + limit=self._max_output_chars, + ) + if execution_result.exit_code != 0: + result['status'] = 'error' + result['exit_code'] = execution_result.exit_code + if execution_result.timed_out: + result['status'] = 'error' + result['error'] = f'Command timed out after {DEFAULT_TIMEOUT}s.' + return result + + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get('status') == 'error': + return 'TOOL_ERROR' + return None diff --git a/src/google/adk/tools/environment/_read_file_tool.py b/src/google/adk/tools/environment/_read_file_tool.py new file mode 100644 index 0000000000..1ff6febf53 --- /dev/null +++ b/src/google/adk/tools/environment/_read_file_tool.py @@ -0,0 +1,170 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""ReadFileTool for reading file contents in the environment.""" + +from __future__ import annotations + +import logging +import shlex +from typing import Any +from typing import Optional +from typing import TYPE_CHECKING + +from google.genai import types +from typing_extensions import override + +from ...environment._base_environment import BaseEnvironment +from ...utils.feature_decorator import experimental +from ..base_tool import BaseTool +from ._constants import MAX_OUTPUT_CHARS +from ._utils import truncate as _truncate + +if TYPE_CHECKING: + from ..tool_context import ToolContext + + +logger = logging.getLogger('google_adk.' + __name__) + + +@experimental +class ReadFileTool(BaseTool): + """Read a file from the environment.""" + + def __init__( + self, + environment: BaseEnvironment, + *, + max_output_chars: Optional[int] = None, + ): + super().__init__( + name='ReadFile', + description=( + 'Read the contents of a file in the environment. ' + 'Returns the file content with line numbers.' + ), + ) + self._environment = environment + self._max_output_chars = ( + max_output_chars if max_output_chars is not None else MAX_OUTPUT_CHARS + ) + + @override + def _get_declaration(self) -> Optional[types.FunctionDeclaration]: + return types.FunctionDeclaration( + name=self.name, + description=self.description, + parameters_json_schema={ + 'type': 'object', + 'properties': { + 'path': { + 'type': 'string', + 'description': ( + 'Path of the file to read within the environment.' + ), + }, + 'start_line': { + 'type': 'integer', + 'description': ( + 'First line to return (1-based, ' + 'inclusive). Defaults to 1.' + ), + }, + 'end_line': { + 'type': 'integer', + 'description': ( + 'Last line to return (1-based, ' + 'inclusive). Defaults to end of file.' + ), + }, + }, + 'required': ['path'], + }, + ) + + @override + async def run_async( + self, *, args: dict[str, Any], tool_context: ToolContext + ) -> Any: + path = args.get('path', '') + if not path: + return {'status': 'error', 'error': '`path` is required.'} + start_line = args.get('start_line') + end_line = args.get('end_line') + + # Use `sed` to read the file if start_line or end_line are specified. + if (start_line and start_line > 1) or end_line: + start = start_line or 1 + if end_line: + sed_range = f'{start},{end_line}' + else: + sed_range = f'{start},$' + path_arg = shlex.quote(path) + sed_arg = shlex.quote(f'{sed_range}p') + cmd = f'cat -n {path_arg} | sed -n {sed_arg}' + res = await self._environment.execute(cmd) + if res.exit_code == 0: + return { + 'status': 'ok', + 'content': _truncate( + res.stdout, + limit=self._max_output_chars, + ), + } + + try: + data_bytes = await self._environment.read_file(path) + text = data_bytes.decode('utf-8', errors='replace') + lines = text.splitlines(True) + total = len(lines) + start = max(1, start_line or 1) + end = min(total, end_line or total) + if start > total: + return { + 'status': 'error', + 'error': ( + f'`start_line` {start} exceeds file length ({total} lines).' + ), + 'total_lines': total, + } + if start > end: + return { + 'status': 'error', + 'error': f'`start_line` ({start}) is after `end_line` ({end}).', + 'total_lines': total, + } + selected = lines[start - 1 : end] + numbered = ''.join( + f'{start + i:6d}\t{line}' for i, line in enumerate(selected) + ) + result = { + 'status': 'ok', + 'content': _truncate( + numbered, + limit=self._max_output_chars, + ), + } + if start > 1 or end < total: + result['total_lines'] = total + return result + except FileNotFoundError: + return {'status': 'error', 'error': f'File not found: {path}'} + except Exception as e: + return {'status': 'error', 'error': str(e)} + + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get('status') == 'error': + return 'TOOL_ERROR' + return None diff --git a/src/google/adk/tools/environment/_tools.py b/src/google/adk/tools/environment/_tools.py index 67baa8f40d..2bf6cf5b50 100644 --- a/src/google/adk/tools/environment/_tools.py +++ b/src/google/adk/tools/environment/_tools.py @@ -12,393 +12,16 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Tools available in the environment toolset.""" +"""Backward-compatibility re-exports for the environment tools. -from __future__ import annotations - -import logging -from typing import Any -from typing import Optional -from typing import TYPE_CHECKING - -from google.genai import types -from typing_extensions import override - -from ...environment._base_environment import BaseEnvironment -from ...environment._base_environment import ExecutionResult -from ...utils.feature_decorator import experimental -from ..base_tool import BaseTool -from ._constants import DEFAULT_TIMEOUT -from ._constants import MAX_OUTPUT_CHARS - -if TYPE_CHECKING: - from ..tool_context import ToolContext - - -logger = logging.getLogger('google_adk.' + __name__) - - -def _truncate(text: str, limit: int = MAX_OUTPUT_CHARS) -> str: - """Truncate text to *limit* characters with a notice.""" - if len(text) <= limit: - return text - return text[:limit] + f'\n... (truncated, {len(text)} total chars)' - - -_EXECUTE_TOOL_DESCRIPTION = """ -Run a shell command in the environment. For running programs, tests, and build -commands ONLY. WARNING: Do NOT use for file reading -- use the ReadFile tool -instead. Shell commands like 'cat, head, tail will produce inferior results. -Good: Execute("python3 script.py"), Execute("pytest"), Execute("find ..."). -Bad: Execute("head ..."), Execute("cat ..."). +The environment tools were split into one module per tool. This module +keeps the previous import path (``environment._tools``) working by +re-exporting them. """ +from __future__ import annotations -@experimental -class ExecuteTool(BaseTool): - """Run a shell command in the environment's working directory.""" - - def __init__( - self, - environment: BaseEnvironment, - *, - max_output_chars: Optional[int] = None, - ): - super().__init__( - name='Execute', - description=_EXECUTE_TOOL_DESCRIPTION, - ) - self._environment = environment - self._max_output_chars = ( - max_output_chars if max_output_chars is not None else MAX_OUTPUT_CHARS - ) - - @override - def _get_declaration(self) -> Optional[types.FunctionDeclaration]: - return types.FunctionDeclaration( - name=self.name, - description=self.description, - parameters_json_schema={ - 'type': 'object', - 'properties': { - 'command': { - 'type': 'string', - 'description': ( - 'The shell command to execute. Chain dependent commands' - ' with &&.' - ), - }, - }, - 'required': ['command'], - }, - ) - - @override - async def run_async( - self, *, args: dict[str, Any], tool_context: ToolContext - ) -> Any: - command = args.get('command', '') - if not command: - return {'status': 'error', 'error': '`command` is required.'} - - logger.debug('Execute command: %s', command) - try: - execution_result: ExecutionResult = await self._environment.execute( - command, timeout=DEFAULT_TIMEOUT - ) - logger.debug( - 'Execute result: exit_code=%d, stdout=%r, stderr=%r, timed_out=%r', - execution_result.exit_code, - execution_result.stdout[:200] if execution_result.stdout else '', - execution_result.stderr[:200] if execution_result.stderr else '', - execution_result.timed_out, - ) - except Exception as e: - logger.exception('Execute failed: %s', e) - return {'status': 'error', 'error': str(e)} - - result: dict[str, Any] = {'status': 'ok'} - if execution_result.stdout: - result['stdout'] = _truncate( - execution_result.stdout, - limit=self._max_output_chars, - ) - if execution_result.stderr: - result['stderr'] = _truncate( - execution_result.stderr, - limit=self._max_output_chars, - ) - if execution_result.exit_code != 0: - result['status'] = 'error' - result['exit_code'] = execution_result.exit_code - if execution_result.timed_out: - result['status'] = 'error' - result['error'] = f'Command timed out after {DEFAULT_TIMEOUT}s.' - return result - - -@experimental -class ReadFileTool(BaseTool): - """Read a file from the environment.""" - - def __init__( - self, - environment: BaseEnvironment, - *, - max_output_chars: Optional[int] = None, - ): - super().__init__( - name='ReadFile', - description=( - 'Read the contents of a file in the environment. ' - 'Returns the file content with line numbers.' - ), - ) - self._environment = environment - self._max_output_chars = ( - max_output_chars if max_output_chars is not None else MAX_OUTPUT_CHARS - ) - - @override - def _get_declaration(self) -> Optional[types.FunctionDeclaration]: - return types.FunctionDeclaration( - name=self.name, - description=self.description, - parameters_json_schema={ - 'type': 'object', - 'properties': { - 'path': { - 'type': 'string', - 'description': ( - 'Path of the file to read within the environment.' - ), - }, - 'start_line': { - 'type': 'integer', - 'description': ( - 'First line to return (1-based, ' - 'inclusive). Defaults to 1.' - ), - }, - 'end_line': { - 'type': 'integer', - 'description': ( - 'Last line to return (1-based, ' - 'inclusive). Defaults to end of file.' - ), - }, - }, - 'required': ['path'], - }, - ) - - @override - async def run_async( - self, *, args: dict[str, Any], tool_context: ToolContext - ) -> Any: - path = args.get('path', '') - if not path: - return {'status': 'error', 'error': '`path` is required.'} - start_line = args.get('start_line') - end_line = args.get('end_line') - - # Use `sed` to read the file if start_line or end_line are specified. - if (start_line and start_line > 1) or end_line: - start = start_line or 1 - if end_line: - sed_range = f'{start},{end_line}' - else: - sed_range = f'{start},$' - cmd = f"cat -n '{path}' | sed -n '{sed_range}p'" - res = await self._environment.execute(cmd) - if res.exit_code == 0: - return { - 'status': 'ok', - 'content': _truncate( - res.stdout, - limit=self._max_output_chars, - ), - } - - try: - data_bytes = await self._environment.read_file(path) - text = data_bytes.decode('utf-8', errors='replace') - lines = text.splitlines(True) - total = len(lines) - start = max(1, start_line or 1) - end = min(total, end_line or total) - if start > total: - return { - 'status': 'error', - 'error': ( - f'`start_line` {start} exceeds file length ({total} lines).' - ), - 'total_lines': total, - } - if start > end: - return { - 'status': 'error', - 'error': f'`start_line` ({start}) is after `end_line` ({end}).', - 'total_lines': total, - } - selected = lines[start - 1 : end] - numbered = ''.join( - f'{start + i:6d}\t{line}' for i, line in enumerate(selected) - ) - result = { - 'status': 'ok', - 'content': _truncate( - numbered, - limit=self._max_output_chars, - ), - } - if start > 1 or end < total: - result['total_lines'] = total - return result - except FileNotFoundError: - return {'status': 'error', 'error': f'File not found: {path}'} - except Exception as e: - return {'status': 'error', 'error': str(e)} - - -@experimental -class WriteFileTool(BaseTool): - """Create or overwrite a file in the environment.""" - - def __init__(self, environment: BaseEnvironment): - super().__init__( - name='WriteFile', - description=( - 'Create or overwrite a file in the environment. ' - 'Use for new files or full rewrites. For small ' - 'changes to existing files, prefer EditFile.' - ), - ) - self._environment = environment - - @override - def _get_declaration(self) -> Optional[types.FunctionDeclaration]: - return types.FunctionDeclaration( - name=self.name, - description=self.description, - parameters_json_schema={ - 'type': 'object', - 'properties': { - 'path': { - 'type': 'string', - 'description': 'Path to the file within the environment.', - }, - 'content': { - 'type': 'string', - 'description': 'The full file content to write.', - }, - }, - 'required': ['path', 'content'], - }, - ) - - @override - async def run_async( - self, *, args: dict[str, Any], tool_context: ToolContext - ) -> Any: - path = args.get('path', '') - content = args.get('content', '') - if not path: - return {'status': 'error', 'error': '`path` is required.'} - try: - await self._environment.write_file(path, content) - except Exception as e: - return {'status': 'error', 'error': str(e)} - return {'status': 'ok', 'message': f'Wrote {path}'} - - -@experimental -class EditFileTool(BaseTool): - """Perform a surgical text replacement in an existing file.""" - - def __init__(self, environment: BaseEnvironment): - super().__init__( - name='EditFile', - description=( - 'Replace an exact substring in an existing file ' - 'with new text. The old_string must appear exactly ' - 'once in the file. To create new files, use the WriteFile tool.' - ), - ) - self._environment = environment - - @override - def _get_declaration(self) -> Optional[types.FunctionDeclaration]: - return types.FunctionDeclaration( - name=self.name, - description=self.description, - parameters_json_schema={ - 'type': 'object', - 'properties': { - 'path': { - 'type': 'string', - 'description': ( - 'Path of the file to edit within the environment.' - ), - }, - 'old_string': { - 'type': 'string', - 'description': ( - 'The exact text to find and replace. Must not be empty.' - ), - }, - 'new_string': { - 'type': 'string', - 'description': 'The replacement text.', - }, - }, - 'required': ['path', 'old_string', 'new_string'], - }, - ) - - @override - async def run_async( - self, *, args: dict[str, Any], tool_context: ToolContext - ) -> Any: - path = args.get('path', '') - old_string = args.get('old_string', '') - new_string = args.get('new_string', '') - if not path: - return {'status': 'error', 'error': '`path` is required.'} - - if not old_string: - return { - 'status': 'error', - 'error': ( - '`old_string` cannot be empty. To create a new ' - 'file, use the WriteFile tool.' - ), - } - - try: - data_bytes = await self._environment.read_file(path) - content = data_bytes.decode('utf-8', errors='replace') - except FileNotFoundError: - return {'status': 'error', 'error': f'File not found: {path}'} - - count = content.count(old_string) - if count == 0: - return { - 'status': 'error', - 'error': ( - '`old_string` not found in file. Read the file first ' - 'to verify contents.' - ), - } - if count > 1: - return { - 'status': 'error', - 'error': ( - f'`old_string` appears {count} times. Provide more ' - 'surrounding context to make it unique.' - ), - } - - new_content = content.replace(old_string, new_string, 1) - await self._environment.write_file(path, new_content) - return {'status': 'ok', 'message': f'Edited {path}'} +from ._edit_file_tool import EditFileTool as EditFileTool +from ._execute_tool import ExecuteTool as ExecuteTool +from ._read_file_tool import ReadFileTool as ReadFileTool +from ._write_file_tool import WriteFileTool as WriteFileTool diff --git a/src/google/adk/tools/environment/_utils.py b/src/google/adk/tools/environment/_utils.py new file mode 100644 index 0000000000..6e6cc85a16 --- /dev/null +++ b/src/google/adk/tools/environment/_utils.py @@ -0,0 +1,26 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Shared utilities for environment tools.""" + +from __future__ import annotations + +from ._constants import MAX_OUTPUT_CHARS + + +def truncate(text: str, limit: int = MAX_OUTPUT_CHARS) -> str: + """Truncate text to *limit* characters with a notice.""" + if len(text) <= limit: + return text + return text[:limit] + f'\n... (truncated, {len(text)} total chars)' diff --git a/src/google/adk/tools/environment/_write_file_tool.py b/src/google/adk/tools/environment/_write_file_tool.py new file mode 100644 index 0000000000..6bbb47648f --- /dev/null +++ b/src/google/adk/tools/environment/_write_file_tool.py @@ -0,0 +1,92 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""WriteFileTool for creating or overwriting files in the environment.""" + +from __future__ import annotations + +import logging +from typing import Any +from typing import Optional +from typing import TYPE_CHECKING + +from google.genai import types +from typing_extensions import override + +from ...environment._base_environment import BaseEnvironment +from ...utils.feature_decorator import experimental +from ..base_tool import BaseTool + +if TYPE_CHECKING: + from ..tool_context import ToolContext + + +logger = logging.getLogger('google_adk.' + __name__) + + +@experimental +class WriteFileTool(BaseTool): + """Create or overwrite a file in the environment.""" + + def __init__(self, environment: BaseEnvironment): + super().__init__( + name='WriteFile', + description=( + 'Create or overwrite a file in the environment. ' + 'Use for new files or full rewrites. For small ' + 'changes to existing files, prefer EditFile.' + ), + ) + self._environment = environment + + @override + def _get_declaration(self) -> Optional[types.FunctionDeclaration]: + return types.FunctionDeclaration( + name=self.name, + description=self.description, + parameters_json_schema={ + 'type': 'object', + 'properties': { + 'path': { + 'type': 'string', + 'description': 'Path to the file within the environment.', + }, + 'content': { + 'type': 'string', + 'description': 'The full file content to write.', + }, + }, + 'required': ['path', 'content'], + }, + ) + + @override + async def run_async( + self, *, args: dict[str, Any], tool_context: ToolContext + ) -> Any: + path = args.get('path', '') + content = args.get('content', '') + if not path: + return {'status': 'error', 'error': '`path` is required.'} + try: + await self._environment.write_file(path, content) + except Exception as e: + return {'status': 'error', 'error': str(e)} + return {'status': 'ok', 'message': f'Wrote {path}'} + + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get('status') == 'error': + return 'TOOL_ERROR' + return None diff --git a/src/google/adk/tools/environment_simulation/environment_simulation_config.py b/src/google/adk/tools/environment_simulation/environment_simulation_config.py index a1ade063d3..e3fef1e257 100644 --- a/src/google/adk/tools/environment_simulation/environment_simulation_config.py +++ b/src/google/adk/tools/environment_simulation/environment_simulation_config.py @@ -25,7 +25,7 @@ from pydantic import Field from pydantic import field_validator from pydantic import model_validator -from pydantic_core import ValidationError +from pydantic import ValidationError from ...features import experimental from ...features import FeatureName diff --git a/src/google/adk/tools/environment_simulation/environment_simulation_plugin.py b/src/google/adk/tools/environment_simulation/environment_simulation_plugin.py index dad82bda3d..f3470e2798 100644 --- a/src/google/adk/tools/environment_simulation/environment_simulation_plugin.py +++ b/src/google/adk/tools/environment_simulation/environment_simulation_plugin.py @@ -1,4 +1,4 @@ -# Copyright 2024 Google LLC +# Copyright 2026 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/google/adk/tools/function_tool.py b/src/google/adk/tools/function_tool.py index 10e32a5473..21aa6bfd36 100644 --- a/src/google/adk/tools/function_tool.py +++ b/src/google/adk/tools/function_tool.py @@ -20,6 +20,7 @@ from typing import Callable from typing import get_args from typing import get_origin +from typing import get_type_hints from typing import Optional from typing import Union @@ -27,6 +28,8 @@ import pydantic from typing_extensions import override +from ..utils._schema_utils import get_list_inner_type +from ..utils._schema_utils import is_list_of_basemodel from ..utils.context_utils import Aclosing from ..utils.context_utils import find_context_parameter from ._automatic_function_calling_util import build_function_declaration @@ -119,39 +122,90 @@ def _preprocess_args(self, args: dict[str, Any]) -> dict[str, Any]: """ signature = inspect.signature(self.func) converted_args = args.copy() + try: + type_hints = get_type_hints(self.func) + except (TypeError, NameError): + # NameError: unresolved forward refs (e.g. recursive type aliases). + # TypeError: non-function callables. + if hasattr(self.func, '__call__'): + try: + type_hints = get_type_hints(self.func.__call__) + except (TypeError, NameError): + type_hints = {} + else: + type_hints = {} for param_name, param in signature.parameters.items(): - if param_name in args and param.annotation != inspect.Parameter.empty: - target_type = param.annotation - - # Handle Optional[PydanticModel] types - if get_origin(param.annotation) is Union: - union_args = get_args(param.annotation) - # Find the non-None type in Optional[T] (which is Union[T, None]) - non_none_types = [arg for arg in union_args if arg is not type(None)] - if len(non_none_types) == 1: - target_type = non_none_types[0] - - # Check if the target type is a Pydantic model - if inspect.isclass(target_type) and issubclass( - target_type, pydantic.BaseModel - ): - # Skip conversion if the value is None and the parameter is Optional - if args[param_name] is None: - continue - - # Convert to Pydantic model if it's not already the correct type - if not isinstance(args[param_name], target_type): + if param_name in args: + target_type = type_hints.get(param_name, param.annotation) + if target_type != inspect.Parameter.empty: + + # Handle Optional[PydanticModel] types + if get_origin(param.annotation) is Union: + union_args = get_args(param.annotation) + # Find the non-None type in Optional[T] (which is Union[T, None]) + non_none_types = [ + arg for arg in union_args if arg is not type(None) + ] + if len(non_none_types) == 1: + target_type = non_none_types[0] + elif len(non_none_types) > 1 and all( + inspect.isclass(t) and issubclass(t, pydantic.BaseModel) + for t in non_none_types + ): + if args[param_name] is None or isinstance( + args[param_name], tuple(non_none_types) + ): + continue + try: + converted_args[param_name] = pydantic.TypeAdapter( + param.annotation + ).validate_python(args[param_name]) + except Exception as e: + logger.warning( + f"Failed to convert argument '{param_name}' to" + f' {param.annotation}: {e}' + ) + continue + + # Check if the target type is a Pydantic model + if inspect.isclass(target_type) and issubclass( + target_type, pydantic.BaseModel + ): + # Skip conversion if the value is None and the parameter is Optional + if args[param_name] is None: + continue + + # Convert to Pydantic model if it's not already the correct type + if not isinstance(args[param_name], target_type): + try: + converted_args[param_name] = target_type.model_validate( + args[param_name] + ) + except Exception as e: + logger.warning( + f"Failed to convert argument '{param_name}' to Pydantic" + f' model {target_type.__name__}: {e}' + ) + # Keep the original value if conversion fails + pass + # Handle list[BaseModel] types + elif is_list_of_basemodel(target_type) and isinstance( + args[param_name], list + ): + item_type = get_list_inner_type(target_type) try: - converted_args[param_name] = target_type.model_validate( - args[param_name] - ) + converted_args[param_name] = [ + item_type.model_validate(item) + if isinstance(item, dict) + else item + for item in args[param_name] + ] except Exception as e: logger.warning( - f"Failed to convert argument '{param_name}' to Pydantic model" - f' {target_type.__name__}: {e}' + f"Failed to convert argument '{param_name}' to" + f' list[{item_type.__name__}]: {e}' ) - # Keep the original value if conversion fails pass return converted_args @@ -220,6 +274,12 @@ async def run_async( return await self._invoke_callable(self.func, args_to_call) + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get('error'): + return 'TOOL_ERROR' + return None + async def _invoke_callable( self, target: Callable[..., Any], args_to_call: dict[str, Any] ) -> Any: diff --git a/src/google/adk/tools/google_tool.py b/src/google/adk/tools/google_tool.py index c6ab67bb9c..f4294b76cf 100644 --- a/src/google/adk/tools/google_tool.py +++ b/src/google/adk/tools/google_tool.py @@ -106,6 +106,12 @@ async def run_async( "error_details": str(ex), } + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get("status") == "ERROR": + return "TOOL_ERROR" + return None + async def _run_async_with_credential( self, credentials: Credentials, diff --git a/src/google/adk/tools/mcp_tool/mcp_tool.py b/src/google/adk/tools/mcp_tool/mcp_tool.py index 6a24651f92..4acc4ff847 100644 --- a/src/google/adk/tools/mcp_tool/mcp_tool.py +++ b/src/google/adk/tools/mcp_tool/mcp_tool.py @@ -461,6 +461,12 @@ async def _run_async_impl( ) return result + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get("isError"): + return "MCP_TOOL_ERROR" + return None + def _resolve_progress_callback( self, tool_context: ToolContext ) -> Optional[ProgressFnT]: diff --git a/src/google/adk/tools/mcp_tool/mcp_toolset.py b/src/google/adk/tools/mcp_tool/mcp_toolset.py index 71f7cd1645..6d3ccf7c65 100644 --- a/src/google/adk/tools/mcp_tool/mcp_toolset.py +++ b/src/google/adk/tools/mcp_tool/mcp_toolset.py @@ -83,7 +83,6 @@ class McpToolset(BaseToolset): # Use in an agent agent = LlmAgent( - model='gemini-2.5-flash', name='enterprise_assistant', instruction='Help user accessing their file systems', tools=[toolset], @@ -436,7 +435,7 @@ async def close(self) -> None: await self._mcp_session_manager.close() except Exception as e: # Log the error but don't re-raise to avoid blocking shutdown - print(f"Warning: Error during McpToolset cleanup: {e}", file=self._errlog) + logger.warning("Error during McpToolset cleanup: %s", e) @override def get_auth_config(self) -> Optional[AuthConfig]: diff --git a/src/google/adk/tools/mcp_tool/session_context.py b/src/google/adk/tools/mcp_tool/session_context.py index 0ad63044d4..2080588c33 100644 --- a/src/google/adk/tools/mcp_tool/session_context.py +++ b/src/google/adk/tools/mcp_tool/session_context.py @@ -1,4 +1,4 @@ -# Copyright 2025 Google LLC +# Copyright 2026 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -130,6 +130,12 @@ async def start(self) -> ClientSession: if not self._task: self._task = asyncio.create_task(self._run()) + def _retrieve_exception(t: asyncio.Task): + if not t.cancelled(): + t.exception() + + self._task.add_done_callback(_retrieve_exception) + await self._ready_event.wait() if self._task.cancelled(): @@ -292,7 +298,17 @@ async def _run(self): sampling_capabilities=self._sampling_capabilities, ) ) - await asyncio.wait_for(session.initialize(), timeout=self._timeout) + # pylint: disable-next=protected-access + if is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING): + # Use anyio.fail_after to keep session.initialize within the AnyIO + # cancel scope instead of asyncio.wait_for which runs in a nested + # task. + import anyio + + with anyio.fail_after(self._timeout): + await session.initialize() + else: + await asyncio.wait_for(session.initialize(), timeout=self._timeout) logger.debug('Session has been successfully initialized') self._session = session diff --git a/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py b/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py index fa32ce932a..9516536a94 100644 --- a/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +++ b/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py @@ -554,6 +554,12 @@ async def call( self._logger.debug("API Response (non-JSON): %s", response.text) return {"text": response.text} # Return text if not JSON + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get("error"): + return "HTTP_ERROR" + return None + def __str__(self): return ( f'RestApiTool(name="{self.name}", description="{self.description}",' diff --git a/src/google/adk/tools/set_model_response_tool.py b/src/google/adk/tools/set_model_response_tool.py index d1dc6ed55d..592ec19582 100644 --- a/src/google/adk/tools/set_model_response_tool.py +++ b/src/google/adk/tools/set_model_response_tool.py @@ -140,14 +140,19 @@ async def run_async( if self._is_basemodel: # For regular BaseModel, validate directly validated_response = self.output_schema.model_validate(args) - return validated_response.model_dump(exclude_none=True) + result = validated_response.model_dump(exclude_none=True) elif self._is_list_of_basemodel: # For list[BaseModel], extract and validate the 'items' field items = args.get('items', []) type_adapter = TypeAdapter(self.output_schema) validated_response = type_adapter.validate_python(items) - return [item.model_dump(exclude_none=True) for item in validated_response] + result = [ + item.model_dump(exclude_none=True) for item in validated_response + ] else: # For other schema types (list[str], dict, etc.), # return the value directly without pydantic validation - return args.get('response') + result = args.get('response') + + tool_context.actions.set_model_response = result + return result diff --git a/src/google/adk/tools/skill_toolset.py b/src/google/adk/tools/skill_toolset.py index 18a894cdc2..9b82b1a4b6 100644 --- a/src/google/adk/tools/skill_toolset.py +++ b/src/google/adk/tools/skill_toolset.py @@ -24,6 +24,7 @@ import logging import mimetypes from typing import Any +from typing import Optional from typing import TYPE_CHECKING from google.genai import types @@ -37,6 +38,7 @@ from ..skills import SkillRegistry from .base_tool import BaseTool from .base_toolset import BaseToolset +from .base_toolset import ToolPredicate from .function_tool import FunctionTool from .tool_context import ToolContext @@ -55,34 +57,43 @@ " conversation history for you to analyze." ) -DEFAULT_SKILL_SYSTEM_INSTRUCTION = ( - "You can use specialized 'skills' to help you with complex tasks. " - "You MUST use the skill tools to interact with these skills.\n\n" - "Skills are folders of instructions and resources that extend your " - "capabilities for specialized tasks. Each skill folder contains:\n" - "- **SKILL.md** (required): The main instruction file with skill " - "metadata and detailed markdown instructions.\n" - "- **references/** (Optional): Additional documentation or examples for " - "skill usage.\n" - "- **assets/** (Optional): Templates, scripts or other resources used by " - "the skill.\n" - "- **scripts/** (Optional): Executable scripts that can be run via " - "bash.\n\n" - "This is very important:\n\n" - "1. If a skill seems relevant to the current user query, you MUST use " - 'the `load_skill` tool with `skill_name=""` to read ' - "its full instructions before proceeding.\n" - "2. Once you have read the instructions, follow them exactly as " - "documented before replying to the user. For example, If the " - "instruction lists multiple steps, please make sure you complete all " - "of them in order.\n" - "3. The `load_skill_resource` tool is for viewing files within a " - "skill's directory (e.g., `references/*`, `assets/*`, `scripts/*`). " - "Do NOT use other tools to access these files.\n" - "4. Use `run_skill_script` to run scripts from a skill's `scripts/` " - "directory. Use `load_skill_resource` to view script content first if " - "needed.\n" -) + +def _build_skill_system_instruction(prefix: str | None = None) -> str: + p = f"{prefix}_" if prefix else "" + + return ( + "You can use specialized 'skills' to help you with complex tasks. " + "You MUST use the skill tools to interact with these skills.\n\n" + "Skills are folders of instructions and resources that extend your " + "capabilities for specialized tasks. Each skill folder contains:\n" + "- **SKILL.md** (required): The main instruction file with skill " + "metadata and detailed markdown instructions.\n" + "- **references/** (Optional): Additional documentation or examples for " + "skill usage.\n" + "- **assets/** (Optional): Templates, scripts or other resources used by " + "the skill.\n" + "- **scripts/** (Optional): Executable scripts that can be run via " + "bash.\n\n" + "This is very important:\n\n" + f"1. If a skill seems relevant to the current user query, you MUST use " + f'the `{p}load_skill` tool with `skill_name=""` to read ' + "its full instructions before proceeding.\n" + "2. Once you have read the instructions, follow them exactly as " + "documented before replying to the user. For example, If the " + "instruction lists multiple steps, please make sure you complete all " + "of them in order.\n" + f"3. The `{p}load_skill_resource` tool is for viewing files within a " + "skill's directory (e.g., `references/*`, `assets/*`, `scripts/*`). " + "It is ONLY for skill-bundled files — do NOT use it to access " + "documents or files provided by the user at runtime. Do NOT use " + "other tools to access skill files.\n" + f"4. Use `{p}run_skill_script` to run scripts from a skill's `scripts/` " + f"directory. Use `{p}load_skill_resource` to view script content" + " first if " + "needed.\n" + f"5. If `{p}load_skill_resource` returns any error, do not retry any " + "path. Report the error to the user and stop.\n" + ) class ListSkillsTool(BaseTool): @@ -243,6 +254,13 @@ async def run_async( "frontmatter": skill.frontmatter.model_dump(), } + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get("error"): + error_code = response.get("error_code") + return error_code if error_code else "TOOL_ERROR" + return None + class LoadSkillResourceTool(BaseTool): """Tool to load resources (references, assets, or scripts) from a skill.""" @@ -336,6 +354,23 @@ async def run_async( } if content is None: + # Invocation-scoped failure counter. Counts RESOURCE_NOT_FOUND across ALL + # paths so the guard fires even when the LLM hallucinates a different path + # on each retry. The `temp:` prefix prevents persistence to durable + # session storage; invocation_id isolates in-memory backends. + counter_key = f"temp:_adk_skill_resource_not_found_count_{tool_context.invocation_id}" + fail_count = int(tool_context.state.get(counter_key) or 0) + 1 + tool_context.state[counter_key] = fail_count + if fail_count > 1: + return { + "error": ( + f"Resource '{file_path}' not found in skill '{skill_name}'." + f" This is resource lookup failure #{fail_count} this" + " invocation. Do not retry any path — report the error to" + " the user and stop." + ), + "error_code": "RESOURCE_NOT_FOUND_FATAL", + } return { "error": f"Resource '{file_path}' not found in skill '{skill_name}'.", "error_code": "RESOURCE_NOT_FOUND", @@ -354,6 +389,13 @@ async def run_async( "content": content, } + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get("error"): + error_code = response.get("error_code") + return error_code if error_code else "TOOL_ERROR" + return None + @override async def process_llm_request( self, *, tool_context: ToolContext, llm_request: Any @@ -647,6 +689,10 @@ def _build_wrapper_code( code_lines.extend([ f" sys.argv = {argv_list!r}", + ( + " sys.path.insert(0," + f" os.path.dirname(os.path.abspath({file_path!r})))" + ), " try:", f" runpy.run_path({file_path!r}, run_name='__main__')", " except SystemExit as e:", @@ -865,6 +911,13 @@ async def run_async( positional_args, # pylint: disable=protected-access ) + def _detect_error_in_response(self, response: Any) -> Optional[str]: + """Telemetry hook: returns an error type if the response indicates an error.""" + if isinstance(response, dict) and response.get("error"): + error_code = response.get("error_code") + return error_code if error_code else "TOOL_ERROR" + return None + class SkillToolset(BaseToolset): """A toolset for managing and interacting with agent skills.""" @@ -877,6 +930,8 @@ def __init__( code_executor: BaseCodeExecutor | None = None, script_timeout: int = _DEFAULT_SCRIPT_TIMEOUT, additional_tools: list[ToolUnion] | None = None, + tool_name_prefix: str | None = None, + tool_filter: ToolPredicate | list[str] | None = None, ): """Initializes the SkillToolset. @@ -889,8 +944,10 @@ def __init__( scripts executed via exec(). additional_tools: Optional list of `BaseTool` or `BaseToolset` instances to be made available to the agent when certain skills are activated. + tool_name_prefix: Optional prefix to prepend to tool names. + tool_filter: Optional filter to select specific tools. """ - super().__init__() + super().__init__(tool_filter=tool_filter, tool_name_prefix=tool_name_prefix) skills = skills or [] @@ -942,7 +999,8 @@ async def get_tools( dynamic_tools = await self._resolve_additional_tools_from_state( readonly_context ) - return self._tools + dynamic_tools + all_tools = self._tools + dynamic_tools + return [t for t in all_tools if self._is_tool_selected(t, readonly_context)] async def _resolve_additional_tools_from_state( self, readonly_context: ReadonlyContext | None @@ -1054,7 +1112,9 @@ async def process_llm_request( self, *, tool_context: ToolContext, llm_request: LlmRequest ) -> None: """Processes the outgoing LLM request to include available skills.""" - instructions = [DEFAULT_SKILL_SYSTEM_INSTRUCTION] + instructions = [ + _build_skill_system_instruction(prefix=self.tool_name_prefix) + ] has_list_skills = any(isinstance(t, ListSkillsTool) for t in self._tools) @@ -1064,9 +1124,10 @@ async def process_llm_request( instructions.append(skills_xml) if self._registry: + p = f"{self.tool_name_prefix}_" if self.tool_name_prefix else "" instructions.append( "\nIf the locally available skills are not sufficient to complete " - "your task, you can use the `search_skills` tool to discover " + f"your task, you can use the `{p}search_skills` tool to discover " "additional skills from the registry." ) @@ -1081,3 +1142,6 @@ async def close(self) -> None: cached.cancel() self._fetched_skill_cache.clear() await super().close() + + +DEFAULT_SKILL_SYSTEM_INSTRUCTION = _build_skill_system_instruction() diff --git a/src/google/adk/utils/_dependency.py b/src/google/adk/utils/_dependency.py new file mode 100644 index 0000000000..d043a2d7e0 --- /dev/null +++ b/src/google/adk/utils/_dependency.py @@ -0,0 +1,30 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Helper for optional dependencies and packaging extras.""" + +from __future__ import annotations + + +def missing_extra(package: str, extra: str) -> ImportError: + """Returns an ImportError with a standard message for a missing extra. + + Args: + package: The name of the package that failed to import (e.g., 'vertexai'). + extra: The name of the extra group required to install it (e.g., 'gcp'). + """ + return ImportError( + f"The '{package}' package is required to use this feature. " + f"Please install it by running: pip install google-adk[{extra}]" + ) diff --git a/src/google/adk/utils/_google_client_headers.py b/src/google/adk/utils/_google_client_headers.py index 14408178e4..f0bc179864 100644 --- a/src/google/adk/utils/_google_client_headers.py +++ b/src/google/adk/utils/_google_client_headers.py @@ -1,4 +1,4 @@ -# Copyright 2025 Google LLC +# Copyright 2026 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/google/adk/utils/_schema_utils.py b/src/google/adk/utils/_schema_utils.py index 3bb74df932..e83431bd61 100644 --- a/src/google/adk/utils/_schema_utils.py +++ b/src/google/adk/utils/_schema_utils.py @@ -92,6 +92,20 @@ def get_list_inner_type(schema: SchemaType) -> Optional[type[BaseModel]]: return args[0] +def schema_to_json_schema(schema: SchemaType) -> dict[str, Any]: + """Converts a SchemaType to a JSON Schema dict. + + Args: + schema: The schema to convert. + + Returns: + A JSON Schema dict representation of the schema. + """ + if isinstance(schema, dict): + return schema + return TypeAdapter(schema).json_schema() + + def validate_schema(schema: SchemaType, json_text: str) -> Any: """Validate JSON text against a schema and return the result. diff --git a/src/google/adk/utils/_serialized_base_model.py b/src/google/adk/utils/_serialized_base_model.py new file mode 100644 index 0000000000..e834cee8e5 --- /dev/null +++ b/src/google/adk/utils/_serialized_base_model.py @@ -0,0 +1,43 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Base model for serialized Pydantic models.""" + +from __future__ import annotations + +import pydantic +from pydantic import alias_generators + + +class SerializedBaseModel(pydantic.BaseModel): + """Base model for all Pydantic models that are serialized for Web Server or Storage. + + This model enforces camelCase serialization by default to align with JSON + conventions used in the web UI and external APIs, while allowing Python code + to use snake_case. + + Note: `model_dump_json()` is overridden to use `by_alias=True` by default to + ensure camelCase output in JSON serialization. + """ + + model_config = pydantic.ConfigDict( + alias_generator=alias_generators.to_camel, + populate_by_name=True, + use_attribute_docstrings=True, + ) + + def model_dump_json(self, **kwargs) -> str: + """Override model_dump_json to use by_alias=True by default.""" + kwargs.setdefault('by_alias', True) + return super().model_dump_json(**kwargs) diff --git a/src/google/adk/utils/agent_info.py b/src/google/adk/utils/agent_info.py index 957b5808bf..f9997bdc32 100644 --- a/src/google/adk/utils/agent_info.py +++ b/src/google/adk/utils/agent_info.py @@ -34,14 +34,16 @@ class AgentInfo(pydantic.BaseModel): sub_agents: list[str] -def get_tools_info(tools: list[ToolUnion]) -> list[Any]: +async def get_tools_info(tools: list[ToolUnion]) -> list[Any]: """Returns the info for a given list of tools.""" final_tools = [] for tool in tools: if isinstance(tool, BaseTool): final_tools.append(tool) elif isinstance(tool, BaseToolset): - final_tools.extend(tool.get_tools()) + # Await the async coroutine call natively! + tools_res = await tool.get_tools() + final_tools.extend(tools_res) else: final_tools.append(FunctionTool(tool)) return [ @@ -51,27 +53,27 @@ def get_tools_info(tools: list[ToolUnion]) -> list[Any]: ] -def get_agents_dict(agent: LlmAgent) -> dict[str, AgentInfo]: +async def get_agents_dict(agent: LlmAgent) -> dict[str, AgentInfo]: """Returns a dict with info for the agent and its sub-agents.""" agents_dict = {} - def _traverse(current_agent: LlmAgent): + async def _traverse(current_agent: LlmAgent): if current_agent.name in agents_dict: return sub_agent_names = [] for sub_agent in current_agent.sub_agents: if isinstance(sub_agent, LlmAgent): - _traverse(sub_agent) + await _traverse(sub_agent) sub_agent_names.append(sub_agent.name) agents_dict[current_agent.name] = AgentInfo( name=current_agent.name, description=current_agent.description, instruction=current_agent.instruction, - tools=get_tools_info(current_agent.tools), + tools=await get_tools_info(current_agent.tools), sub_agents=sub_agent_names, ) - _traverse(agent) + await _traverse(agent) return agents_dict diff --git a/src/google/adk/utils/content_utils.py b/src/google/adk/utils/content_utils.py index 011269aea1..6755662481 100644 --- a/src/google/adk/utils/content_utils.py +++ b/src/google/adk/utils/content_utils.py @@ -1,4 +1,4 @@ -# Copyright 2025 Google LLC +# Copyright 2026 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/google/adk/utils/output_schema_utils.py b/src/google/adk/utils/output_schema_utils.py index ab9bee1ae8..61a477526d 100644 --- a/src/google/adk/utils/output_schema_utils.py +++ b/src/google/adk/utils/output_schema_utils.py @@ -41,7 +41,6 @@ def can_use_output_schema_with_tools(model: Union[str, BaseLlm]) -> bool: from ..models.lite_llm import LiteLlm except ImportError: LiteLlm = None - if LiteLlm is not None and isinstance(model, LiteLlm): return True diff --git a/src/google/adk/version.py b/src/google/adk/version.py index cf2713c03f..69d9a22b21 100644 --- a/src/google/adk/version.py +++ b/src/google/adk/version.py @@ -13,4 +13,4 @@ # limitations under the License. # version: major.minor.patch -__version__ = "1.34.0" +__version__ = "2.0.0" diff --git a/src/google/adk/workflow/__init__.py b/src/google/adk/workflow/__init__.py new file mode 100644 index 0000000000..c1062dc043 --- /dev/null +++ b/src/google/adk/workflow/__init__.py @@ -0,0 +1,41 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from ._base_node import BaseNode +from ._base_node import START +from ._errors import NodeTimeoutError +from ._function_node import FunctionNode +from ._graph import DEFAULT_ROUTE +from ._graph import Edge +from ._join_node import JoinNode +from ._node import Node +from ._node import node +from ._retry_config import RetryConfig +from ._workflow import Workflow + +__all__ = [ + 'BaseNode', + 'DEFAULT_ROUTE', + 'Edge', + 'FunctionNode', + 'JoinNode', + 'Node', + 'NodeTimeoutError', + 'RetryConfig', + 'START', + 'Workflow', + 'node', +] diff --git a/src/google/adk/workflow/_base_node.py b/src/google/adk/workflow/_base_node.py new file mode 100644 index 0000000000..9aba09be5b --- /dev/null +++ b/src/google/adk/workflow/_base_node.py @@ -0,0 +1,259 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from collections.abc import AsyncGenerator +from typing import Any +from typing import final +from typing import TYPE_CHECKING + +from google.genai import types +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import Field +from pydantic import field_validator +from pydantic import TypeAdapter +from pydantic import ValidationError + +from ..utils._schema_utils import SchemaType +from ._retry_config import RetryConfig + +if TYPE_CHECKING: + from ..agents.context import Context + from ..events.event import Event + + +class BaseNode(BaseModel): + """A base class for all nodes in the workflow graph.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + name: str = Field(...) + """The unique name of the node within the workflow graph.""" + + @field_validator('name') + @classmethod + def _validate_name(cls, v: str) -> str: + if not v.isidentifier(): + raise ValueError(f"Node name '{v}' must be a valid Python identifier.") + return v + + description: str = '' + """A human-readable description of what this node does.""" + + rerun_on_resume: bool = False + """Controls behavior when resuming after an interrupt. + + If True, the node reruns from scratch. If False, it completes immediately + using the user's resuming input as the node's output. + """ + + wait_for_output: bool = False + """If True, node only transitions to COMPLETED upon yielding output or route. + + Without output/route, the node enters WAITING state and downstream nodes are + not triggered, allowing predecessors to re-trigger it. This is useful for nodes + like ``JoinNode`` that run multiple times before producing a final output. + + WARNING: Completing execution without ever yielding output/route causes an + indefinite WAITING state (deadlock). This is considered a user configuration error. + """ + + retry_config: RetryConfig | None = None + """Configuration for retrying the node on failure. + + If set, exceptions raised by the node will trigger retries according + to the specified policy. + """ + + timeout: float | None = None + """Maximum time in seconds for this node to complete. + + If the node does not finish within this duration, it is cancelled and + treated as a failure (raising ``NodeTimeoutError``). This integrates + with ``retry_config`` — a timed-out node can be retried if retries + are configured. + + ``None`` means no timeout (the node runs until completion). + """ + + input_schema: SchemaType | None = None + """Schema to validate and coerce node input data. + + Supports all ``SchemaType`` variants. Validation uses ``TypeAdapter`` + and runs centrally in the node runner before ``node.run()`` is called. + + ``None`` means no input validation (the default). + """ + + output_schema: SchemaType | None = None + """Schema to validate and coerce node output data. + + Supports all ``SchemaType`` variants (Pydantic ``BaseModel`` subclass, + generic aliases like ``list[str]``, raw ``dict`` schemas, etc.). + + When set to a ``BaseModel`` subclass, the node's output data is validated: + - dict → ``output_schema.model_validate(data).model_dump()`` + - BaseModel instance → ``data.model_dump()`` (already converted) + + ``None`` means no output validation (the default). + """ + + state_schema: type[BaseModel] | None = None + """Optional Pydantic model declaring the expected state keys and types. + + When set, ``ctx.state`` mutations are validated at runtime against + this schema. Child nodes inherit the schema from their parent + (via InvocationContext) unless they declare their own. + + Prefixed keys (``app:``, ``user:``, ``temp:``) bypass validation. + """ + + def _validate_schema(self, data: Any, schema: Any) -> Any: + """Validates data against a schema using ``TypeAdapter``. + + Handles BaseModel, list[BaseModel], primitive types, unions, and + generic aliases. Descriptive schemas (``types.Schema``, raw + ``dict``) are skipped. Any BaseModel instances in the validated + result are converted to dicts via ``model_dump()`` to keep + ``Event.output`` JSON-serializable. + """ + if data is None or schema is None: + return data + + if isinstance(schema, (dict, types.Schema)): + return data + + validated = TypeAdapter(schema).validate_python(data) + return self._to_serializable(validated) + + def _validate_input_data(self, data: Any) -> Any: + """Validates data against input_schema if set.""" + if self.input_schema and isinstance(data, types.Content): + # Extract text from Content (e.g. user input from START node). + text = ''.join(part.text for part in data.parts if part.text) + if self.input_schema is str: + return text + # If schema is defined, try to parse the text as JSON. + try: + return TypeAdapter(self.input_schema).validate_json(text) + except ValidationError: + # Fallback to validate_python if it's a raw string matching the schema. + try: + return TypeAdapter(self.input_schema).validate_python(text) + except ValidationError: + pass + return self._validate_schema(data, self.input_schema) + + def _validate_output_data(self, data: Any) -> Any: + """Validates data against output_schema if set.""" + if not self.output_schema: + return data + + # 1. Try standard validation first + try: + return self._validate_schema(data, self.output_schema) + except ValidationError as e: + # 2. If failed, try to parse JSON ONLY if it's Content + if isinstance(data, types.Content): + text = ''.join(part.text for part in data.parts if part.text) + if self.output_schema is str: + return text + if text.strip(): + try: + validated = TypeAdapter(self.output_schema).validate_json(text) + return self._to_serializable(validated) + except ValidationError: + pass + + # 3. If not Content or parsing failed, re-raise original error + raise e + + @staticmethod + def _to_serializable(data: Any) -> Any: + """Converts BaseModel instances to dicts recursively.""" + if isinstance(data, BaseModel): + return data.model_dump() + if isinstance(data, list): + return [BaseNode._to_serializable(item) for item in data] + if isinstance(data, dict): + return {k: BaseNode._to_serializable(v) for k, v in data.items()} + return data + + @final + async def run( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Event, None]: + """Public entry point. Calls _run_impl, normalizes yields to Event. + + Normalization rules: + - None -> skipped + - Event -> pass through + - RequestInput -> convert to interrupt Event + - Any other value -> Event(output=value) + """ + from ..events.event import Event + from ..events.request_input import RequestInput + from ..utils.context_utils import Aclosing + + node_input = self._validate_input_data(node_input) + async with Aclosing(self._run_impl(ctx=ctx, node_input=node_input)) as agen: + async for item in agen: + if item is None: + continue + if isinstance(item, Event): + if item.output is not None: + item.output = self._validate_output_data(item.output) + yield item + elif isinstance(item, RequestInput): + from .utils._workflow_hitl_utils import create_request_input_event + + yield create_request_input_event(item) + else: + validated = self._validate_output_data(item) + yield Event(output=validated) + + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + """Override point for node execution logic. + + Yields any of: Event, RequestInput, raw data, or None. + BaseNode.run() normalizes all yields to Event before the caller + sees them. + """ + raise NotImplementedError( + f'_run_impl for {type(self).__name__} is not implemented.' + ) + yield # AsyncGenerator requires at least one yield statement + + @property + def _requires_all_predecessors(self) -> bool: + """If True, the node waits for all predecessors to complete before running.""" + return False + + +START = BaseNode(name='__START__') +"""Sentinel node marking the entry point of a workflow graph. + +START is never executed — ``Workflow._seed_start_triggers`` bypasses it +and seeds triggers for its successors directly. +""" diff --git a/src/google/adk/workflow/_dynamic_node_scheduler.py b/src/google/adk/workflow/_dynamic_node_scheduler.py new file mode 100644 index 0000000000..f25beea7ad --- /dev/null +++ b/src/google/adk/workflow/_dynamic_node_scheduler.py @@ -0,0 +1,519 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Dynamic node scheduler for Workflow. + +Handles ctx.run_node() calls by tracking dynamic nodes in the +Workflow's _LoopState or a local DynamicNodeState. Supports dedup +(cached output), resume (lazy event scan + re-run), and fresh execution. +""" + +from __future__ import annotations + +import asyncio +from dataclasses import dataclass +from dataclasses import field +import logging +from typing import Any +from typing import TYPE_CHECKING + +from pydantic import ValidationError + +from ..events._node_path_builder import _NodePathBuilder +from ._node_state import NodeState +from ._node_status import NodeStatus +from ._schedule_dynamic_node import ScheduleDynamicNode +from .utils._rehydration_utils import _ChildScanState +from .utils._rehydration_utils import _reconstruct_node_states +from .utils._rehydration_utils import _unwrap_response +from .utils._rehydration_utils import is_terminal_event +from .utils._replay_interceptor import check_interception +from .utils._replay_interceptor import create_mock_context +from .utils._replay_sequence_barrier import ReplaySequenceBarrier + +if TYPE_CHECKING: + from ..agents.context import Context + from ._base_node import BaseNode + + +logger = logging.getLogger('google_adk.' + __name__) + + +@dataclass(kw_only=True) +class DynamicNodeRun: + """Combines state, output, and running task for a single node execution.""" + + state: NodeState + """The tracking state (status, interrupts, run_id).""" + + output: Any = None + """The final output of the node once it completes.""" + + task: asyncio.Task[Context] | None = None + """The running asyncio Task for this node execution.""" + + transfer_to_agent: str | None = None + """The target agent name if this node execution transferred.""" + + recovered_state: _ChildScanState | None = None + """The raw scan state from events, used for replay interception.""" + + +@dataclass(kw_only=True) +class DynamicNodeState: + """State for tracking dynamic nodes scheduled via ctx.run_node(). + + Base class for both Workflow's ``_LoopState`` and standalone + ``DefaultNodeScheduler``. DynamicNodeScheduler reads/writes + these fields for dedup, resume, and interrupt propagation. + """ + + runs: dict[str, DynamicNodeRun] = field(default_factory=dict) + """Dynamic node runs keyed by unique node_path (e.g. /wf@1/node_a@1).""" + + # --- Shared (static + dynamic) --- + + interrupt_ids: set[str] = field(default_factory=set) + """Union of all unresolved interrupt IDs across static and + dynamic child nodes. + + Populated by: + - _restore_static_nodes_from_events: from WAITING static nodes + - _handle_completion: when a static node interrupts at runtime + - schedule callback: when a dynamic node interrupts + + Read by _finalize to propagate to the Workflow's own ctx, + which the parent orchestrator checks after this Workflow + completes. + """ + + def get_dynamic_tasks(self) -> list[asyncio.Task[Context]]: + """Get all active dynamic node tasks.""" + return [run.task for run in self.runs.values() if run.task] + + +class DynamicNodeScheduler(ScheduleDynamicNode): + """Handles ctx.run_node() calls for a Workflow. + + Implements ScheduleDynamicNode protocol via __call__. Tracks + dynamic nodes in loop_state, handles dedup via lazy event + scanning, and manages resume/interrupt propagation. + + Three cases: + 1. Fresh: no prior events → execute normally. + 2. Completed: prior events show output → return cached. + 3. Waiting: prior events show interrupt → resolve or propagate. + """ + + def __init__(self, *, state: DynamicNodeState) -> None: + self._state = state + self._parent_sequence_barriers: dict[str, ReplaySequenceBarrier] = {} + + async def __call__( + self, + ctx: Context, + node: BaseNode, + node_input: Any, + *, + node_name: str | None = None, + use_as_output: bool = False, + run_id: str, + use_sub_branch: bool = False, + override_branch: str | None = None, + override_isolation_scope: str | None = None, + ) -> Context: + """Schedule a dynamic node: dedup, resume, or fresh run. + + Args: + ctx: The calling node's Context. + node: The BaseNode to execute (original, before renaming). + node_input: Input data for the node. + node_name: Deterministic tracking name from ctx.run_node(). + Always provided (user-specified or auto-generated). + use_as_output: If True, the child's output replaces the + calling node's output. + run_id: Custom run ID for the child node execution. + use_sub_branch: Whether the node should use a sub-branch. + override_branch: Optional branch to use instead of parent's branch. + + Returns: + Child Context with output, route, and interrupt_ids set. + """ + curr_node = node + curr_name = node_name or node.name + curr_run_id = run_id + curr_input = node_input + curr_parent_ctx: Context | None = ctx + + while True: + curr_parent_path = curr_parent_ctx.node_path if curr_parent_ctx else None + base_path_builder = ( + _NodePathBuilder.from_string(curr_parent_path) + if curr_parent_path + else _NodePathBuilder([]) + ) + node_path = str(base_path_builder.append(curr_name, curr_run_id)) + + # Rehydration chronological sequence barrier setup for the parent path + parent_path = curr_parent_ctx.node_path if curr_parent_ctx else '' + if parent_path and parent_path not in self._parent_sequence_barriers: + seq = self._scan_parent_child_sequence(curr_parent_ctx, parent_path) + self._parent_sequence_barriers[parent_path] = ReplaySequenceBarrier(seq) + + # Runtime schema validation. + if curr_input is not None: + try: + curr_input = curr_node._validate_input_data(curr_input) + except ValidationError as e: + raise ValueError( + 'Runtime schema validation failed for dynamic node' + f" '{curr_name}'. Input does not match input_schema: {e}" + ) from e + + logger.debug('node %s schedule start.', node_path) + + # Phase 1: Lazy rehydration from session events. + if node_path not in self._state.runs: + self._rehydrate_from_events(curr_parent_ctx, node_path) + + # Check existing run and determine if fresh execution is needed. + child_ctx, run_completed = await self._check_existing_run( + curr_parent_ctx, + curr_node, + curr_name, + node_path, + curr_run_id, + curr_input, + use_as_output, + use_sub_branch, + override_branch, + override_isolation_scope=override_isolation_scope, + ) + + if not run_completed: + # Phase 3: Fresh execution. + logger.debug('node %s schedule: Fresh execution.', node_path) + child_ctx = await self._run_node_internal( + curr_parent_ctx, + curr_node, + curr_name, + node_path, + curr_run_id, + curr_input, + use_as_output, + is_fresh=True, + use_sub_branch=use_sub_branch, + override_branch=override_branch, + override_isolation_scope=override_isolation_scope, + ) + + logger.debug('node %s schedule end.', node_path) + + # Advance chronological sequence for this parent path and key + parent_path = curr_parent_ctx.node_path if curr_parent_ctx else '' + key = f'{curr_name}@{curr_run_id}' + if parent_path in self._parent_sequence_barriers: + self._parent_sequence_barriers[parent_path].check_and_advance(key) + + # Check for transfer_to_agent signal. + transfer_to_agent = ( + child_ctx.actions.transfer_to_agent if child_ctx else None + ) + if isinstance(transfer_to_agent, str): + target_name = transfer_to_agent + root_agent = getattr(curr_node, 'root_agent', None) + if not root_agent: + raise ValueError(f'Cannot find root_agent on node {curr_node.name}') + + # Local import to avoid runtime circular dependencies with Context + from .utils._transfer_utils import resolve_and_derive_transfer_context + + target_agent, next_parent_ctx = resolve_and_derive_transfer_context( + target_name=target_name, + current_agent=curr_node, + root_agent=root_agent, + curr_ctx=child_ctx, + curr_parent_ctx=curr_parent_ctx, + ) + if not target_agent: + raise ValueError(f"Transfer target agent '{target_name}' not found.") + if not next_parent_ctx: + available = [] + if hasattr(curr_node, '_get_available_agent_names'): + available = curr_node._get_available_agent_names() + available_str = ( + f"\nAvailable agents: {', '.join(available)}" if available else '' + ) + raise ValueError( + f"Cannot transfer from '{curr_name}' to unrelated agent" + f" '{target_name}'.{available_str}" + ) + curr_parent_ctx = next_parent_ctx + + # Set up parameters for next iteration. + curr_node = target_agent + curr_name = target_agent.name + + if not curr_parent_ctx: + raise AssertionError( + 'curr_parent_ctx cannot be None during active workflow execution' + ) + + curr_parent_ctx._child_run_counters[target_agent.name] = ( + curr_parent_ctx._child_run_counters.get(target_agent.name, 0) + 1 + ) + curr_run_id = str( + curr_parent_ctx._child_run_counters[target_agent.name] + ) + curr_input = None # Input for transfer target is usually empty. + + # Loop continues to execute the next agent + continue + + return child_ctx + + async def _check_existing_run( + self, + curr_parent_ctx: Context | None, + curr_node: BaseNode, + curr_name: str, + node_path: str, + curr_run_id: str, + curr_input: Any, + use_as_output: bool, + use_sub_branch: bool, + override_branch: str | None, + override_isolation_scope: str | None = None, + ) -> tuple[Context | None, bool]: + """Scan and process cached status for waiting or completed runs. + + Returns a tuple of (child_ctx, run_completed_flag). + """ + if node_path not in self._state.runs: + return None, False + + run = self._state.runs[node_path] + + # Deduplication of concurrent calls! + if run.task and not run.task.done(): + logger.debug('node %s schedule: Awaiting existing task.', node_path) + return await run.task, True + + if run.recovered_state: + recovered = run.recovered_state + unresolved = recovered.interrupt_ids - recovered.resolved_ids + if recovered.interrupt_ids and not unresolved: + if curr_node.wait_for_output and not curr_node.rerun_on_resume: + raise ValueError( + f'Node {node_path} is waiting for output but was called again' + ' with rerun_on_resume=False. This would cause it to' + ' auto-complete with empty output, which is likely a' + ' configuration error. Consider setting rerun_on_resume=True.' + ) + + # Delegate replay and same-turn interception check to ReplayInterceptor. + result = check_interception( + node_path=node_path, + node=curr_node, + recovered=run.recovered_state, + current_run=run, + curr_parent_ctx=curr_parent_ctx, + ) + + if not result.should_run: + if result.interrupts: + self._state.interrupt_ids.update(result.interrupts) + logger.debug( + 'node %s schedule: Unresolved interrupts remain.', node_path + ) + else: + logger.debug( + 'node %s schedule: Fast-forwarding completed execution.', node_path + ) + # Sync output and transfer decisions with the current run state. + run.output = result.output + run.transfer_to_agent = result.transfer_to_agent + + # Create a high-fidelity mock context with cached results. + mock_ctx = create_mock_context( + parent_ctx=curr_parent_ctx, + node=curr_node, + run_id=curr_run_id, + result=result, + ancestors=[], + node_path=node_path, + branch=(run.recovered_state.branch if run.recovered_state else None), + ) + + # Chronological sequence barrier wait for replayed dynamic nodes + parent_path = curr_parent_ctx.node_path if curr_parent_ctx else '' + key = f'{curr_name}@{curr_run_id}' + if parent_path in self._parent_sequence_barriers: + await self._parent_sequence_barriers[parent_path].wait(key) + + return mock_ctx, True + + else: + # Rerun! + run.state.resume_inputs = result.resume_inputs + logger.debug('node %s schedule: Rerunning execution.', node_path) + return ( + await self._run_node_internal( + curr_parent_ctx, + curr_node, + curr_name, + node_path, + curr_run_id, + curr_input, + use_as_output, + is_fresh=False, + use_sub_branch=use_sub_branch, + override_branch=override_branch, + override_isolation_scope=override_isolation_scope, + ), + True, + ) + + # --- Lazy scan --- + + def _rehydrate_from_events(self, ctx: Context, node_path: str) -> None: + """Scan session events for a dynamic node's prior state.""" + logger.debug('node %s rehydrate start.', node_path) + ic = ctx._invocation_context # pylint: disable=protected-access + + results = _reconstruct_node_states( + events=ic.session.events, + base_path=node_path, + group_by_direct_child=False, + invocation_id=ic.invocation_id, + ) + + target_state = results.get(node_path) + + if target_state: + self._state.runs[node_path] = DynamicNodeRun( + state=NodeState(run_id=target_state.run_id), + recovered_state=target_state, + ) + + logger.debug('node %s rehydrate end.', node_path) + + def _scan_parent_child_sequence( + self, ctx: Context, parent_path: str + ) -> list[str]: + """Scan historical events and extract direct dynamic child completion sequence.""" + ic = ctx._invocation_context + base_path_builder = _NodePathBuilder.from_string(parent_path) + sequence: list[str] = [] + + for event in ic.session.events: + if event.invocation_id != ic.invocation_id: + continue + event_node_path = event.node_info.path or '' + event_path_builder = _NodePathBuilder.from_string(event_node_path) + + if not event_path_builder.is_descendant_of(base_path_builder): + continue + + child_path = base_path_builder.get_direct_child(event_path_builder) + if event_path_builder != child_path: + continue + + segment = child_path.leaf_segment + + if is_terminal_event(event): + if segment in sequence: + sequence.remove(segment) + sequence.append(segment) + + return sequence + + # --- Execution --- + + async def _run_node_internal( + self, + ctx: Context, + node: BaseNode, + name: str, + node_path: str, + run_id: str, + node_input: Any, + use_as_output: bool, + is_fresh: bool, + use_sub_branch: bool = False, + override_branch: str | None = None, + override_isolation_scope: str | None = None, + ) -> Context: + """Unified runner for both fresh and resume executions.""" + if is_fresh: + state = NodeState( + status=NodeStatus.RUNNING, + input=node_input, + run_id=run_id, + parent_run_id=ctx.run_id, + ) + run = DynamicNodeRun(state=state) + self._state.runs[node_path] = run + resume_inputs = None + else: + run = self._state.runs[node_path] + run.state.status = NodeStatus.RUNNING + resume_inputs = ( + dict(run.state.resume_inputs) if run.state.resume_inputs else None + ) + + target_node = node.model_copy(update={'name': name}) + run.task = asyncio.create_task( + ctx._run_node_standalone( + target_node, + node_input=node_input, + use_as_output=use_as_output, + run_id=run_id, + use_sub_branch=use_sub_branch, + override_branch=override_branch, + override_isolation_scope=override_isolation_scope, + resume_inputs=resume_inputs, + ) + ) + try: + child_ctx = await run.task + except asyncio.CancelledError: + if node_path in self._state.runs: + del self._state.runs[node_path] + raise + self._record_result(run, child_ctx, node) + return child_ctx + + def _record_result( + self, + run: DynamicNodeRun, + child_ctx: Context, + node: BaseNode, + ) -> None: + """Update dynamic node state after execution.""" + state = run.state + if child_ctx.error: + state.status = NodeStatus.FAILED + elif child_ctx.interrupt_ids: + state.status = NodeStatus.WAITING + state.interrupts = list(child_ctx.interrupt_ids) + self._state.interrupt_ids.update(child_ctx.interrupt_ids) + elif child_ctx.actions.transfer_to_agent: + state.status = NodeStatus.COMPLETED + run.transfer_to_agent = child_ctx.actions.transfer_to_agent + elif node.wait_for_output and child_ctx.output is None: + state.status = NodeStatus.WAITING + else: + state.status = NodeStatus.COMPLETED + run.output = child_ctx.output diff --git a/src/google/adk/workflow/_errors.py b/src/google/adk/workflow/_errors.py new file mode 100644 index 0000000000..de2deaacb1 --- /dev/null +++ b/src/google/adk/workflow/_errors.py @@ -0,0 +1,59 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +"""Errors raised by the workflow framework.""" + + +class NodeInterruptedError(BaseException): + """Internal: raised when a dynamic node interrupts (HITL). + + Used exclusively by ``ctx.run_node()`` to signal that the dynamic + child has unresolved interrupt IDs. The parent's NodeRunner catches + this and reads the interrupt IDs from the parent's ctx (set by + ``ctx.run_node()`` before raising). + + This is a ``BaseException`` so user code cannot accidentally catch + it with ``except Exception``. + + Internal to the framework — not part of the public API. + """ + + +class NodeTimeoutError(Exception): + """Raised when a node exceeds its configured timeout. + + This is a regular ``Exception`` (not ``BaseException``) so it is + compatible with ``retry_config`` — a timed-out node can be retried. + """ + + def __init__(self, *, node_name: str, timeout: float) -> None: + self.node_name = node_name + self.timeout = timeout + super().__init__(f"Node '{node_name}' timed out after {timeout} seconds.") + + +class DynamicNodeFailError(Exception): + """Raised when a dynamic node fails. + + Caught by the parent node's NodeRunner to propagate the error. + """ + + def __init__( + self, *, message: str, error: Exception, error_node_path: str + ) -> None: + self.error = error + self.error_node_path = error_node_path + super().__init__(message) diff --git a/src/google/adk/workflow/_function_node.py b/src/google/adk/workflow/_function_node.py new file mode 100644 index 0000000000..ceef483fdb --- /dev/null +++ b/src/google/adk/workflow/_function_node.py @@ -0,0 +1,520 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import collections.abc +from collections.abc import AsyncGenerator +from collections.abc import Callable +import functools +import inspect +import logging +import typing +from typing import Any +from typing import cast +from typing import Literal +from typing import TYPE_CHECKING + +from google.genai import types +from pydantic import BaseModel +from pydantic import PrivateAttr +from pydantic import PydanticSchemaGenerationError +from pydantic import TypeAdapter +from typing_extensions import override + +from ..auth.auth_tool import AuthConfig +from ..events.event import Event +from ..events.request_input import RequestInput +from ._base_node import BaseNode +from ._retry_config import RetryConfig +from .utils._workflow_hitl_utils import create_auth_request_event +from .utils._workflow_hitl_utils import has_auth_credential +from .utils._workflow_hitl_utils import process_auth_resume + +logger = logging.getLogger('google_adk.' + __name__) + + +async def _sync_to_async_gen( + sync_gen: collections.abc.Generator[Any, None, None], +) -> AsyncGenerator[Any, None]: + """Wraps a synchronous generator as an async generator.""" + for item in sync_gen: + yield item + + +if TYPE_CHECKING: + from ..agents.context import Context + +# Output types that are framework control-flow items, not data schemas. +_PASSTHROUGH_OUTPUT_TYPES = (types.Content, Event, RequestInput) + +# Generator origins used for unwrapping yield types. +_GENERATOR_ORIGINS = ( + collections.abc.Generator, + collections.abc.AsyncGenerator, +) + + +def _unwrap_callable(func: Callable[..., Any]) -> Callable[..., Any]: + """Unwraps partials, bound methods and callable objects to find the stable underlying function.""" + while True: + if isinstance(func, functools.partial): + func = func.func + elif hasattr(func, '__func__'): # bound method + func = func.__func__ + elif ( + hasattr(func, '__call__') + and not inspect.isfunction(func) + and not inspect.ismethod(func) + ): + # callable object, unwrap to its __call__ method + func = func.__call__ + else: + break + return func + + +@functools.lru_cache(maxsize=1024) +def _get_type_hints_for_unwrapped(func: Callable[..., Any]) -> dict[str, Any]: + """Cached version of typing.get_type_hints.""" + try: + return typing.get_type_hints(func) + except (TypeError, NameError, AttributeError): + return {} + + +def _get_type_hints_cached(func: Callable[..., Any]) -> dict[str, Any]: + """Cached version of typing.get_type_hints with robust unwrapping.""" + unwrapped = _unwrap_callable(func) + return _get_type_hints_for_unwrapped(unwrapped) + + +def _content_to_str( + content: types.Content, func_name: str, param_name: str +) -> str: + """Extracts text from a Content object, warning on non-text parts.""" + texts = [] + for part in content.parts or []: + if part.text is not None: + texts.append(part.text) + elif part.inline_data or part.file_data or part.executable_code: + logger.warning( + 'Parameter "%s" of function "%s" expects str but received' + ' Content with non-text parts (e.g. inline_data, file_data).' + ' Non-text parts are dropped during auto-conversion.', + param_name, + func_name, + ) + return ''.join(texts) + + +def _expects_str(annotated_type: Any) -> bool: + """Returns True if the annotation is or contains ``str``.""" + if annotated_type is str: + return True + if typing.get_origin(annotated_type) is typing.Union: + return any(_expects_str(a) for a in typing.get_args(annotated_type)) + return False + + +class FunctionNode(BaseNode): + """A node that wraps a Python sync/async function or generator. + + Type coercions applied to function parameters (via ``TypeAdapter``): + - ``dict`` → ``BaseModel`` when the annotation is a Pydantic model. + - ``list[dict]`` → ``list[BaseModel]``, ``dict[K, dict]`` → + ``dict[K, BaseModel]``, etc. + - ``types.Content`` → ``str`` when the annotation expects ``str`` + (including ``Optional[str]`` / ``Union[str, ...]``). + - All other values are validated/coerced by Pydantic's ``TypeAdapter``. + """ + + auth_config: AuthConfig | None = None + """If set, the framework requests user authentication before running. + + When the node runs for the first time and no credential is found in + session state, it yields an ``adk_request_credential`` event and + interrupts. On resume, the credential is stored and the node + re-runs with the credential available via + ``AuthHandler(auth_config).get_auth_response(ctx.state)``. + """ + + parameter_binding: Literal['state', 'node_input'] = 'state' + """How function parameters are bound. + + ``'state'`` (default) binds parameters from ``ctx.state``. + ``'node_input'`` binds parameters from ``node_input`` dict and infers + ``input_schema`` / ``output_schema`` from the function signature + (used when the node acts as an agent's tool). + """ + + # Private attributes (won't be serialized) + _func: Callable[..., Any] = PrivateAttr() + _sig: inspect.Signature = PrivateAttr() + _type_hints: dict[str, Any] = PrivateAttr() + _type_adapters: dict[str, TypeAdapter] = PrivateAttr() + _context_param_name: str | None = PrivateAttr(default=None) + + def __init__( + self, + *, + func: Callable[..., Any], + name: str | None = None, + rerun_on_resume: bool = False, + retry_config: RetryConfig | None = None, + timeout: float | None = None, + auth_config: AuthConfig | None = None, + parameter_binding: Literal['state', 'node_input'] = 'state', + state_schema: type[BaseModel] | None = None, + ): + """Initializes FunctionNode. + + Args: + func: A sync/async function or sync/async generator function that forms + the node's logic. It can accept 'ctx: Context' and 'node_input: Any' as + arguments, depending on its signature. If the function is not a + generator, its return value will be wrapped in an Event, unless the + return value is None. + name: The name of the node. If None, it defaults to func.__name__. + rerun_on_resume: If True, the node will be rerun after being interrupted + and resumed. If False, the node will be marked as completed and the + resuming input will be treated as the node's output. + retry_config: If provided, the node will be retried on failure based on + this configuration. + timeout: Maximum time in seconds for this node to complete. + auth_config: If provided, the framework requests user authentication + before running the node. Requires rerun_on_resume=True (the node + must rerun after credentials are provided). + parameter_binding: How function parameters are bound. ``'state'`` + (default) binds parameters from ``ctx.state``. ``'node_input'`` + binds parameters from ``node_input`` dict and infers + ``input_schema`` / ``output_schema`` from the function signature + (used when the node acts as an agent's tool). + """ + + if not callable(func): + raise TypeError('Function must be callable.') + + if auth_config and not rerun_on_resume: + raise ValueError( + 'FunctionNode with auth_config requires rerun_on_resume=True.' + ' The node must rerun after credentials are provided.' + ) + + inferred_name = name or getattr(func, '__name__', None) + if not inferred_name: + raise ValueError( + 'FunctionNode must have a name. If the wrapped callable does not' + " have a '__name__' attribute, please provide a name explicitly." + ) + + super().__init__( + name=inferred_name, + description=inspect.getdoc(func) or '', + rerun_on_resume=rerun_on_resume, + retry_config=retry_config, + timeout=timeout, + auth_config=auth_config, + parameter_binding=parameter_binding, + state_schema=state_schema, + ) + + sig = inspect.signature(func) + type_hints = _get_type_hints_cached(func) + + # Detect the context parameter name (e.g. 'ctx', 'tool_context'). + from ..utils.context_utils import find_context_parameter + + self._context_param_name = find_context_parameter(func) or 'ctx' + + # Set private attributes + self._func = func + self._sig = sig + self._type_hints = type_hints + self._type_adapters = {} + for name, hint in type_hints.items(): + if name == 'return' or name == self._context_param_name: + continue + try: + self._type_adapters[name] = TypeAdapter(hint) + except (TypeError, PydanticSchemaGenerationError): + pass + + # Infer schemas based on the parameter binding mode. + if parameter_binding == 'node_input': + self._infer_schemas_from_func_signature(func) + else: + self._infer_schemas_for_state_mode(type_hints) + + def _infer_schemas_for_state_mode(self, type_hints: dict[str, Any]) -> None: + """Infers schemas from type hints in state binding mode. + + ``output_schema`` is inferred from the return type hint (unwrapping + generator types). ``input_schema`` is inferred from the ``node_input`` + parameter type hint. + """ + # Infer output_schema from the return type hint. + # For generators (Generator[T, ...] / AsyncGenerator[T, ...]), + # extract the yield type T as the schema. + return_hint = type_hints.get('return') + schema_hint = return_hint + + # Unwrap Generator[T, ...] / AsyncGenerator[T, ...] to T. + if return_hint is not None: + origin = typing.get_origin(return_hint) + if origin in _GENERATOR_ORIGINS: + args = typing.get_args(return_hint) + schema_hint = args[0] if args else None + + if ( + schema_hint is not None + and inspect.isclass(schema_hint) + and issubclass(schema_hint, BaseModel) + and not issubclass(schema_hint, _PASSTHROUGH_OUTPUT_TYPES) + ): + self.output_schema = schema_hint + + # Infer input_schema from node_input type hint. + input_hint = type_hints.get('node_input') + if ( + input_hint is not None + and inspect.isclass(input_hint) + and issubclass(input_hint, BaseModel) + ): + self.input_schema = input_hint + + def _infer_schemas_from_func_signature( + self, func: Callable[..., Any] + ) -> None: + """Infers input/output schema from the function signature. + + Used when ``parameter_binding='node_input'``. ``input_schema`` is + built from function parameters (excluding the context parameter), + ``output_schema`` from the return type hint. + """ + from ..tools._function_tool_declarations import _build_parameters_json_schema + from ..tools._function_tool_declarations import _build_response_json_schema + + ignore_params: list[str] = ( + [self._context_param_name] if self._context_param_name else [] + ) + self.input_schema = _build_parameters_json_schema( + func, ignore_params=ignore_params + ) + response_schema = _build_response_json_schema(func) + if response_schema is not None: + self.output_schema = response_schema + + def _bind_parameters(self, ctx: Context, node_input: Any) -> dict[str, Any]: + """Binds function parameters from the appropriate data source. + + In ``'node_input'`` mode, non-context parameters are looked up in the + ``node_input`` dict. In ``'state'`` mode, the ``node_input`` parameter + is passed through directly and all other non-context parameters are + looked up in ``ctx.state``. + """ + input_bound = self.parameter_binding == 'node_input' + if input_bound: + source = node_input if isinstance(node_input, dict) else {} + else: + source = ctx.state + source_name = 'node_input' if input_bound else 'state' + + kwargs: dict[str, Any] = {} + for param_name, param in self._sig.parameters.items(): + if param_name == self._context_param_name: + kwargs[param_name] = ctx + continue + + # In state mode, 'node_input' param is passed through directly. + if not input_bound and param_name == 'node_input': + value = node_input + if param_name in self._type_hints: + value = self._coerce_param( + param_name, + node_input, + self._type_hints[param_name], + ) + kwargs[param_name] = value + continue + + if param_name in source: + value = source[param_name] + if param_name in self._type_hints: + value = self._coerce_param( + param_name, + value, + self._type_hints[param_name], + ) + kwargs[param_name] = value + elif param.default is not inspect.Parameter.empty: + kwargs[param_name] = param.default + else: + raise ValueError( + f'Missing value for parameter "{param_name}" of function' + f' "{self.name}". It was not found in {source_name} and has no' + ' default value.' + ) + return kwargs + + def _to_event(self, ctx: Context, data: Any) -> Event | None: + """Converts a function return value to an Event. + + Pass-through types (returned as-is): Event, RequestInput. + None is returned as None (caller skips it) unless there are pending + state changes. + All other values are wrapped in an Event(output=...). + + State changes made via ``ctx.state`` during function execution are + captured in ``ctx.actions.state_delta`` and attached to the emitted + event so that they are persisted by the session service. + """ + state_delta = ( + dict(ctx.actions.state_delta) if ctx.actions.state_delta else None + ) + + if data is None: + if state_delta: + return Event(state=state_delta) + return None + + if isinstance(data, Event): + if data.output is not None: + data.output = self._validate_output_data(data.output) + if state_delta: + data.actions.state_delta.update(state_delta) + return data + if isinstance(data, RequestInput): + return data + if isinstance(data, types.Content): + return Event( + content=data, + state=state_delta, + ) + + if isinstance(data, BaseModel): + data = data.model_dump() + + data = self._validate_output_data(data) + + return Event( + output=data, + state=state_delta, + ) + + def _coerce_param( + self, + param_name: str, + value: Any, + annotated_type: Any, + ) -> Any: + """Coerces a parameter value to match its type annotation. + + Uses Pydantic's ``TypeAdapter`` for validation and coercion (handles + ``dict`` → ``BaseModel``, ``list[dict]`` → ``list[BaseModel]``, unions, + primitives, etc.). A special case converts ``types.Content`` → ``str`` + when the annotation expects ``str``. + + Args: + param_name: The name of the parameter (for error messages). + value: The value to coerce. + annotated_type: The type annotation of the parameter. + + Returns: + The coerced value. + """ + # Content → str auto-conversion (e.g. user content from START node). + if isinstance(value, types.Content) and _expects_str(annotated_type): + return _content_to_str(value, self.name, param_name) + adapter = self._type_adapters.get(param_name) + if adapter is None: + adapter = TypeAdapter(annotated_type) + return adapter.validate_python(value) + + @override + def model_copy( + self, *, update: dict[str, Any] | None = None, deep: bool = False + ) -> FunctionNode: + copied = cast(FunctionNode, super().model_copy(update=update, deep=deep)) + if not update or 'name' not in update: + return copied + + # If the wrapped function is a bound method of a Node, we need to clone + # the Node and re-bind the function to the new instance. + # This is needed if the function is referring to params like 'name' from the "self" reference. + # Like Workflow or LLM use that name for event node_paths or retreving session events. + func = self._func + if inspect.ismethod(func) and isinstance( + getattr(func, '__self__', None), BaseNode + ): + method_self = getattr(func, '__self__') + method_name = getattr(func, '__name__') + + # Pass the name update to the cloned agent instance if it's being passed + # to the FunctionNode (case for parallel workers). + agent_update = { + 'name': update['name'], + } + + new_obj = method_self.model_copy(update=agent_update) + copied._func = getattr(new_obj, method_name) + else: + copied._func = func + + copied._sig = self._sig + copied._type_hints = self._type_hints + copied._type_adapters = self._type_adapters + copied._context_param_name = self._context_param_name + return copied + + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + # --- Auth gate --- + if self.auth_config: + interrupt_id = f'wf_auth:{ctx.node_path}' + auth_response = ctx.resume_inputs.get(interrupt_id) + if auth_response is not None: + await process_auth_resume(auth_response, self.auth_config, ctx.state) + elif not has_auth_credential(self.auth_config, ctx.state): + yield create_auth_request_event(self.auth_config, interrupt_id) + return + + kwargs = self._bind_parameters(ctx, node_input) + + if inspect.isasyncgenfunction(self._func): + items = self._func(**kwargs) + elif inspect.isgeneratorfunction(self._func): + items = _sync_to_async_gen(self._func(**kwargs)) + else: + items = None + + if items is not None: + async for item in items: + event = self._to_event(ctx, item) + if event is not None: + yield event + else: + if inspect.iscoroutinefunction(self._func): + result = await self._func(**kwargs) + else: # Sync function + result = self._func(**kwargs) + + event = self._to_event(ctx, result) + if event is not None: + yield event diff --git a/src/google/adk/workflow/_graph.py b/src/google/adk/workflow/_graph.py new file mode 100644 index 0000000000..c7406152ef --- /dev/null +++ b/src/google/adk/workflow/_graph.py @@ -0,0 +1,559 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Defines the graph and edges in the Workflow.""" + +from __future__ import annotations + +from collections import Counter +from collections.abc import Callable +from collections.abc import Set +from typing import Annotated +from typing import Any +from typing import get_args +from typing import Literal +from typing import TypeAlias + +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import Field +from pydantic import PrivateAttr +from pydantic import SerializeAsAny + +from ..tools.base_tool import BaseTool +from ._base_node import BaseNode +from ._base_node import START + +RouteValue: TypeAlias = bool | int | str +"""Type alias for valid routing values used in conditional graph edges.""" + +NodeLike: TypeAlias = ( + BaseNode | BaseTool | Callable[..., Any] | Literal["START"] +) +"""Type alias for objects that can be converted to a workflow node.""" + +RoutingMap: TypeAlias = dict[RouteValue, NodeLike | tuple[NodeLike, ...]] +"""A mapping from route values to destination nodes. + +Syntactic sugar for declaring multiple routed edges from a single source. +Values can be a single node or a tuple of nodes (fan-out). + +Examples:: + + {"route_a": node_a, "route_b": node_b} + {"route_x": (node_a, node_b)} # fan-out: both triggered +""" + + +class Edge(BaseModel): + """An edge in the workflow graph.""" + + model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid") + + from_node: Annotated[BaseNode, SerializeAsAny()] + """The from node.""" + + to_node: Annotated[BaseNode, SerializeAsAny()] + """The to node.""" + + route: RouteValue | list[RouteValue] | None = Field( + description=( + "The route(s) that this edge is associated with." + " A single value or a list of values. The edge is followed when the" + " emitted route matches any value in the list." + ), + default=None, + ) + + +ChainElement: TypeAlias = NodeLike | tuple[NodeLike, ...] | RoutingMap +"""Type alias for an element in a workflow chain. + +Can be a single NodeLike, a tuple of NodeLike (fan-out), or a RoutingMap. +""" + +EdgeItem: TypeAlias = Edge | tuple[ChainElement, ...] +"""Type alias for an item that can be parsed into workflow edges. + +Can be an explicit Edge object, or a tuple representing a chain of elements. +""" +from .utils._workflow_graph_utils import build_node +from .utils._workflow_graph_utils import is_node_like + +DEFAULT_ROUTE = "__DEFAULT__" + + +def _expand_routing_map( + from_element: ChainElement, + routing_map: RoutingMap, +) -> list[tuple[ChainElement, NodeLike | tuple[NodeLike, ...], RouteValue]]: + """Expands a routing map into individual (from, to, route) triples. + + Args: + from_element: The source node(s). Can be a single NodeLike or a + tuple of NodeLike for fan-in. + routing_map: A dict mapping route values to destination nodes. + Values can be a single NodeLike or a tuple of NodeLike for + fan-out. + + Returns: + A list of (from_element, target, route) triples where target can + be a single NodeLike or a tuple for fan-out. + + Raises: + ValueError: If the routing map is empty, has non-RouteValue keys, + or has non-NodeLike values. + """ + if not routing_map: + raise ValueError( + "Routing map must not be empty. Provide at least one route -> node" + " mapping." + ) + + route_value_types = get_args(RouteValue) + expanded: list[ + tuple[ChainElement, NodeLike | tuple[NodeLike, ...], RouteValue] + ] = [] + + for route_key, target in routing_map.items(): + if not isinstance(route_key, route_value_types): + raise ValueError( + f"Invalid routing map key: {route_key!r} (type" + f" {type(route_key).__name__}). Keys must be RouteValue" + " (str, int, or bool)." + ) + if isinstance(target, tuple): + for node in target: + if not is_node_like(node): + raise ValueError( + f"Invalid node in fan-out tuple for route {route_key!r}:" + f" {node!r} (type {type(node).__name__})." + " Values must be NodeLike (BaseNode, BaseAgent, BaseTool," + " callable, or 'START')." + ) + elif not is_node_like(target): + raise ValueError( + f"Invalid routing map value for route {route_key!r}:" + f" {target!r} (type {type(target).__name__})." + " Values must be NodeLike (BaseNode, BaseAgent, BaseTool," + " callable, or 'START')." + ) + expanded.append((from_element, target, route_key)) + + return expanded + + +def _nodes_from_routing_map( + routing_map: RoutingMap, +) -> list[NodeLike]: + """Extracts all target nodes from a routing map, flattening fan-out tuples. + + Args: + routing_map: A dict mapping route values to destination nodes. + + Returns: + A flat list of all NodeLike targets referenced in the map. + """ + nodes: list[NodeLike] = [] + for target in routing_map.values(): + if isinstance(target, tuple): + nodes.extend(target) + else: + nodes.append(target) + return nodes + + +def _flatten_element( + element: NodeLike | tuple[NodeLike, ...] | RoutingMap, +) -> list[NodeLike]: + """Flattens a chain element into a list of individual nodes. + + - A single NodeLike is wrapped in a list. + - A tuple of NodeLike is converted to a list. + - A RoutingMap (dict) has its target nodes extracted and flattened. + """ + if isinstance(element, dict): + return _nodes_from_routing_map(element) + if isinstance(element, tuple): + return list(element) + return [element] + + +def _get_or_build_node( + node_like: NodeLike, node_map: dict[int, BaseNode] +) -> BaseNode: + """Gets a node from the map or builds it if not present.""" + if node_like == "START": + return START + + node_id = id(node_like) + if node_id in node_map: + return node_map[node_id] + + if isinstance(node_like, BaseNode): + wrapped = build_node(node_like) + if wrapped is not node_like: + node_map[node_id] = wrapped + return wrapped + return node_like + + node = build_node(node_like) + node_map[node_id] = node + return node + + +def _process_explicit_edge( + edge: Edge, node_map: dict[int, BaseNode], graph_edges: list[Edge] +) -> None: + """Processes an explicit Edge object.""" + graph_edges.append( + Edge( + from_node=_get_or_build_node(edge.from_node, node_map), + to_node=_get_or_build_node(edge.to_node, node_map), + route=edge.route, + ) + ) + + +def _process_chain( + chain: tuple[Any, ...], + node_map: dict[int, BaseNode], + graph_edges: list[Edge], +) -> None: + """Processes a chain of elements (tuple).""" + for i in range(len(chain) - 1): + from_el = chain[i] + to_el = chain[i + 1] + + if isinstance(to_el, dict): + _process_routing_map_edge(from_el, to_el, node_map, graph_edges) + else: + _process_unconditional_edge(from_el, to_el, node_map, graph_edges) + + +def _process_routing_map_edge( + from_el: Any, + to_el: RoutingMap, + node_map: dict[int, BaseNode], + graph_edges: list[Edge], +) -> None: + """Processes edges where the destination is a routing map.""" + if isinstance(from_el, dict): + raise ValueError( + "Consecutive routing maps are not allowed in a chain." + " Split them into separate edge items." + ) + + # A routing map (dict) in a chain behaves like a fan-out tuple + # but with conditioned incoming edges. + for exp_from, exp_to, route in _expand_routing_map(from_el, to_el): + for from_node in _flatten_element(exp_from): + for to_node in _flatten_element(exp_to): + graph_edges.append( + Edge( + from_node=_get_or_build_node(from_node, node_map), + to_node=_get_or_build_node(to_node, node_map), + route=route, + ) + ) + + +def _process_unconditional_edge( + from_el: Any, + to_el: Any, + node_map: dict[int, BaseNode], + graph_edges: list[Edge], +) -> None: + """Processes unconditional edges between elements.""" + # _flatten_element handles dicts (fan-in from routing map values) + # and tuples (fan-in/out). + for from_node in _flatten_element(from_el): + for to_node in _flatten_element(to_el): + graph_edges.append( + Edge( + from_node=_get_or_build_node(from_node, node_map), + to_node=_get_or_build_node(to_node, node_map), + route=None, + ) + ) + + +class Graph(BaseModel): + """A workflow graph.""" + + model_config = ConfigDict(arbitrary_types_allowed=True, extra="forbid") + + nodes: list[Annotated[BaseNode, SerializeAsAny()]] = Field( + default_factory=list + ) + """The nodes in the workflow graph.""" + + edges: list[Edge] = Field(default_factory=list) + """The edges in the workflow graph.""" + + _terminal_node_names: set[str] = PrivateAttr(default_factory=set) + """Nodes with no outgoing edges. Computed by validate_graph.""" + + @classmethod + def from_edge_items(cls, edge_items: list[EdgeItem]) -> Graph: + """Creates a Graph from a list of edge items.""" + node_map: dict[int, BaseNode] = {} + graph_edges: list[Edge] = [] + + for item in edge_items: + if isinstance(item, Edge): + _process_explicit_edge(item, node_map, graph_edges) + elif isinstance(item, tuple): + _process_chain(item, node_map, graph_edges) + else: + raise ValueError(f"Invalid edge type: {type(item)}") + + return Graph(edges=graph_edges) + + def model_post_init(self, context: Any) -> None: + """Populates nodes from edges.""" + if "nodes" in self.model_fields_set and self.nodes: + raise ValueError( + "Nodes are inferred from edges, do not set nodes explicitly." + ) + if self.edges: + # Use a dictionary to preserve order and deduplicate nodes by object id. + nodes = { + id(node): node + for edge in self.edges + for node in [edge.from_node, edge.to_node] + } + self.nodes = list(nodes.values()) + + def get_next_pending_nodes( + self, + node_name: str, + routes_to_match: RouteValue | list[RouteValue] | None, + ) -> list[str]: + """Determines the next nodes to transition to PENDING state based on routes.""" + next_pending_nodes: list[str] = [] + matched_specific_route = False + default_route_node: str | None = None + + for edge in self.edges: + if edge.from_node.name == node_name: + if edge.route is None: + # Edges with no route tag are always triggered. + next_pending_nodes.append(edge.to_node.name) + continue + + if edge.route == DEFAULT_ROUTE: + default_route_node = edge.to_node.name + continue + + # Normalize edge routes to a set for matching. + edge_routes = ( + set(edge.route) if isinstance(edge.route, list) else {edge.route} + ) + + edge_matched = False + if isinstance(routes_to_match, list): + if edge_routes & set(routes_to_match): + edge_matched = True + elif routes_to_match in edge_routes: + edge_matched = True + + if edge_matched: + next_pending_nodes.append(edge.to_node.name) + matched_specific_route = True + + if not matched_specific_route and default_route_node: + next_pending_nodes.append(default_route_node) + + return next_pending_nodes + + def _detect_unconditional_cycles(self, node_names: Set[str]) -> None: + """Detects unconditional cycles in the graph. + + Edges with route=None are always followed, so a cycle consisting + entirely of such edges would loop forever. Conditional edges + (with a route) are allowed to form cycles (loop patterns). + """ + unconditional_adj: dict[str, list[str]] = {name: [] for name in node_names} + for edge in self.edges: + if edge.route is None: + unconditional_adj[edge.from_node.name].append(edge.to_node.name) + + in_stack: set[str] = set() + done: set[str] = set() + + def _dfs(node: str, path: list[str]) -> None: + in_stack.add(node) + path.append(node) + for neighbor in unconditional_adj[node]: + if neighbor in in_stack: + cycle_start = path.index(neighbor) + cycle = path[cycle_start:] + [neighbor] + raise ValueError( + "Graph validation failed. Unconditional cycle detected:" + f" {' -> '.join(cycle)}. Cycles must include at" + " least one conditional (routed) edge to avoid" + " infinite loops." + ) + if neighbor not in done: + _dfs(neighbor, path) + path.pop() + in_stack.remove(node) + done.add(node) + + for name in node_names: + if name not in done: + _dfs(name, []) + + def _validate_duplicate_node_names(self) -> set[str]: + """Checks for duplicate node names.""" + names = [node.name for node in self.nodes] + duplicates = sorted( + name for name, count in Counter(names).items() if count > 1 + ) + + if duplicates: + raise ValueError( + "Graph validation failed. Duplicate node names found:" + f" {duplicates}. This means multiple distinct node objects" + " have the same name. If you intended to reuse the same node, ensure" + " you pass the exact same object instance. If you intended to have" + " distinct nodes, ensure they have unique names." + ) + return set(names) + + def _validate_start_node(self, node_names: set[str]) -> None: + """Checks for existence of START node.""" + if START.name not in node_names: + raise ValueError( + "Graph validation failed. START node (name: " + f"'{START.name}') not found in graph nodes." + ) + + def _validate_connectivity(self, node_names: set[str]) -> None: + """Checks connectivity and reachability from START.""" + to_nodes: set[str] = set() + adj: dict[str, set[str]] = {name: set() for name in node_names} + for edge in self.edges: + adj[edge.from_node.name].add(edge.to_node.name) + to_nodes.add(edge.to_node.name) + + reachable: set[str] = set() + stack = [START.name] + while stack: + node = stack.pop() + if node in reachable: + continue + reachable.add(node) + stack.extend(adj[node] - reachable) + + unreachable_nodes = node_names - reachable + if unreachable_nodes: + raise ValueError( + "Graph validation failed. The following nodes are unreachable" + f" from START: {sorted(unreachable_nodes)}" + ) + if START.name in to_nodes: + raise ValueError( + "Graph validation failed. START node must not have incoming edges." + ) + + def _validate_duplicate_edges(self) -> None: + """Checks for duplicate edges.""" + seen_edges = set() + for edge in self.edges: + edge_tuple = (edge.from_node.name, edge.to_node.name) + if edge_tuple in seen_edges: + raise ValueError( + "Graph validation failed. Duplicate edge found: from=" + f"{edge.from_node.name}, to={edge.to_node.name}" + ) + seen_edges.add(edge_tuple) + + def _validate_default_routes(self) -> None: + """Checks constraints on DEFAULT_ROUTE.""" + default_route_edges: dict[str, str] = {} + for edge in self.edges: + if isinstance(edge.route, list) and DEFAULT_ROUTE in edge.route: + raise ValueError( + "Graph validation failed. DEFAULT_ROUTE cannot be combined" + " with other routes in a list (edge from=" + f"{edge.from_node.name}, to={edge.to_node.name})." + " Use a separate edge for DEFAULT_ROUTE." + ) + if edge.route == DEFAULT_ROUTE: + from_node_name = edge.from_node.name + if from_node_name in default_route_edges: + raise ValueError( + "Graph validation failed. Multiple DEFAULT_ROUTE edges found" + f" from node {from_node_name} to" + f" {default_route_edges[from_node_name]} and" + f" {edge.to_node.name}" + ) + default_route_edges[from_node_name] = edge.to_node.name + + def _validate_static_schemas(self) -> None: + """Validates static schemas on edges.""" + for edge in self.edges: + from_node = edge.from_node + to_node = edge.to_node + if from_node.output_schema and to_node.input_schema: + if from_node.output_schema != to_node.input_schema: + raise ValueError( + "Graph validation failed. Schema mismatch on edge" + f" {from_node.name} -> {to_node.name}." + f" Output schema {from_node.output_schema} does not match" + f" input schema {to_node.input_schema}." + ) + + def _validate_chat_agent_wiring(self) -> None: + """Validates that chat-mode agents do not have incoming edges from non-START nodes.""" + from ..agents.llm_agent import LlmAgent + + for edge in self.edges: + to_node = edge.to_node + if ( + isinstance(to_node, LlmAgent) + and getattr(to_node, "mode", None) == "chat" + ): + if edge.from_node.name != START.name: + raise ValueError( + f"The agent '{to_node.name}' has been added to the workflow with" + f" mode='chat' following node '{edge.from_node.name}'. This is" + " not supported because chat-mode agents rely on conversational" + " history (session events) and cannot consume direct node inputs" + " from preceding nodes. Please change the agent's mode to" + " 'single_turn'" + ) + + def _compute_terminal_nodes(self) -> None: + """Computes terminal nodes (no outgoing edges).""" + from_names = {edge.from_node.name for edge in self.edges} + self._terminal_node_names = { + n.name + for n in self.nodes + if n.name != START.name and n.name not in from_names + } + + def validate_graph(self) -> None: + """Validates the workflow graph.""" + node_names = self._validate_duplicate_node_names() + self._validate_start_node(node_names) + self._validate_connectivity(node_names) + self._validate_duplicate_edges() + self._validate_default_routes() + self._detect_unconditional_cycles(node_names) + self._validate_static_schemas() + self._validate_chat_agent_wiring() + self._compute_terminal_nodes() diff --git a/src/google/adk/workflow/_join_node.py b/src/google/adk/workflow/_join_node.py new file mode 100644 index 0000000000..a8f203e95c --- /dev/null +++ b/src/google/adk/workflow/_join_node.py @@ -0,0 +1,77 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""JoinNode implementation for workflow orchestration.""" + +from __future__ import annotations + +from collections.abc import AsyncGenerator +import logging +from typing import Any + +from typing_extensions import override + +from ..agents.context import Context +from ..events.event import Event +from ._base_node import BaseNode + +logger = logging.getLogger('google_adk.' + __name__) + + +def _get_common_branch_prefix(branches: list[str]) -> str: + """Find the common prefix of dot-separated branch strings.""" + if not branches: + return '' + split_branches = [b.split('.') if b else [] for b in branches] + + common = [] + for segments in zip(*split_branches): + if len(set(segments)) == 1: + common.append(segments[0]) + else: + break + return '.'.join(common) + + +class JoinNode(BaseNode): + """A node that waits for all specified predecessors to trigger it before + outputting.""" + + @property + @override + def _requires_all_predecessors(self) -> bool: + return True + + @override + def _validate_input_data(self, data: Any) -> Any: + """Validates individual trigger inputs against input_schema.""" + if self.input_schema and isinstance(data, dict): + return { + k: self._validate_schema(v, self.input_schema) + for k, v in data.items() + } + return super()._validate_input_data(data) + + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + """JoinNode simply passes through the aggregated inputs provided by the orchestrator.""" + yield Event( + output=node_input, + branch=ctx._invocation_context.branch, + ) diff --git a/src/google/adk/workflow/_llm_agent_wrapper.py b/src/google/adk/workflow/_llm_agent_wrapper.py new file mode 100644 index 0000000000..36a487b0e0 --- /dev/null +++ b/src/google/adk/workflow/_llm_agent_wrapper.py @@ -0,0 +1,445 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utility functions for running LlmAgent as a workflow node.""" + +from __future__ import annotations + +from collections.abc import AsyncGenerator +from contextlib import aclosing +import json +from typing import Any +from typing import Optional + +from google.genai import types +from pydantic import BaseModel + +from ..agents.context import Context +from ..agents.llm.task._finish_task_tool import FINISH_TASK_SUCCESS_RESULT +from ..agents.llm.task._finish_task_tool import FINISH_TASK_TOOL_NAME as _FINISH_TASK_FC_NAME +from ..events.event import Event +from ..utils._schema_utils import validate_schema + + +def _extract_finish_task_fc(event: Event) -> Optional[types.FunctionCall]: + """Returns the finish_task FC in this event, or None.""" + for fc in event.get_function_calls(): + if fc.name == _FINISH_TASK_FC_NAME: + return fc + return None + + +def _is_finish_task_success_fr(event: Event) -> bool: + """True iff this event is the success FR from FinishTaskTool. + + A non-success FR (e.g., validation error) returns False so the + caller keeps iterating and the LLM gets a chance to retry. + """ + for fr in event.get_function_responses(): + if fr.name == _FINISH_TASK_FC_NAME: + response = fr.response or {} + return response.get('result') == FINISH_TASK_SUCCESS_RESULT + return False + + +def _extract_task_delegation_fcs( + event: Event, tools_dict: dict +) -> list[types.FunctionCall]: + """Return task-delegation FCs from this event. + + A task-delegation FC is one whose tool is a ``_TaskAgentTool`` instance. + """ + from ..tools.agent_tool import _TaskAgentTool + + return [ + fc + for fc in event.get_function_calls() + if fc.id + and fc.name in tools_dict + and isinstance(tools_dict[fc.name], _TaskAgentTool) + ] + + +def _find_unresolved_task_delegations( + session, owner: str, tools_dict: dict +) -> list[types.FunctionCall]: + """Walk session events; find task FCs from ``owner`` without matching FRs. + + Sequential dispatch means at most one + unresolved task delegation at a time, but we return a list so the + caller can iterate uniformly. + + We deliberately do NOT filter by isolation_scope. A chat + coordinator's conversation persists across user turns; each turn + produces a fresh ``wf:`` scope, so filtering by the + current turn's scope would hide the coordinator's own FC from a + prior turn. Author + tool-name filtering is sufficient. + """ + from ..tools.agent_tool import _TaskAgentTool + + fc_by_id: dict[str, types.FunctionCall] = {} + fr_ids: set[str] = set() + for event in session.events: + if event.author != owner and event.author != 'user': + continue + if not event.content or not event.content.parts: + continue + for part in event.content.parts: + fc = part.function_call + if ( + fc + and fc.id + and fc.name in tools_dict + and isinstance(tools_dict[fc.name], _TaskAgentTool) + ): + fc_by_id[fc.id] = fc + fr = part.function_response + if fr and fr.id: + fr_ids.add(fr.id) + return [fc for fc_id, fc in fc_by_id.items() if fc_id not in fr_ids] + + +def _find_finish_task_tool(agent: Any) -> Any: + """Return the FinishTaskTool instance attached to a task-mode agent.""" + for tool in getattr(agent, 'tools', []) or []: + if getattr(tool, 'name', None) == _FINISH_TASK_FC_NAME: + return tool + return None + + +def _safe_canonical_tools_dict(agent: Any) -> dict: + """Build a name→tool map from ``agent.tools``. + + Used by the chat wrapper to identify task-delegation FCs by tool + name without resolving the agent's full canonical-tools pipeline. + """ + out: dict = {} + for tool in getattr(agent, 'tools', []) or []: + name = getattr(tool, 'name', None) + if name: + out[name] = tool + return out + + +async def _dispatch_task_fc( + parent_agent: Any, fc: types.FunctionCall, ctx: Context +) -> Any: + """Dispatch a task-delegation FC via ``ctx.run_node`` and return the output. + + ``run_id=fc.id`` makes the child run idempotent across resumes (same + FC always maps to the same scheduler-tracked child run). Scope is + carried by ``isolation_scope`` (``override_isolation_scope=fc.id``); we + intentionally do NOT set a branch — task-mode and single_turn-mode + agents share the parent's branch and rely on isolation_scope for + scoping instead. + """ + target_agent = parent_agent.root_agent.find_agent(fc.name) + if target_agent is None: + raise ValueError(f'Task target agent {fc.name!r} not found.') + from .utils._workflow_graph_utils import build_node + + wrapped_target = build_node(target_agent) + wrapped_target.parent_agent = target_agent.parent_agent + return await ctx.run_node( + wrapped_target, + node_input=fc.args, + run_id=fc.id, + override_isolation_scope=fc.id, + raise_on_wait=True, + ) + + +def _synthesize_task_fr_event(fc: types.FunctionCall, output: Any) -> Event: + """Build the synthesized FR event for a completed task delegation. + + No isolation_scope is set on the event itself — ``NodeRunner._enrich_event`` + stamps it from the parent's ``ctx.isolation_scope`` (which is the + coordinator's scope or None for a root chat coordinator). This keeps + the FR visible to the parent and invisible to other task scopes. + """ + if isinstance(output, dict): + response = output + else: + response = {'output': output} + fr_part = types.Part( + function_response=types.FunctionResponse( + id=fc.id, + name=fc.name, + response=response, + ) + ) + return Event( + author='user', + content=types.Content(role='user', parts=[fr_part]), + ) + + +def _node_input_to_content(node_input: Any) -> types.Content: + """Converts node_input to a user Content for the LLM agent.""" + if isinstance(node_input, types.Content): + return types.Content(role='user', parts=node_input.parts) + if isinstance(node_input, str): + text = node_input + elif isinstance(node_input, BaseModel): + text = node_input.model_dump_json() + elif isinstance(node_input, (dict, list)): + text = json.dumps(node_input) + else: + text = str(node_input) + return types.Content(role='user', parts=[types.Part(text=text)]) + + +def prepare_llm_agent_context(agent: Any, ctx: Context) -> Context: + """Prepares the context for running LlmAgent as a node.""" + if agent.mode != 'single_turn': + return ctx + + ic = ctx._invocation_context.model_copy() + ic._event_queue = ctx._invocation_context._event_queue + agent_ctx = Context( + invocation_context=ic, + node_path=ctx.node_path, + run_id=ctx.run_id, + resume_inputs=ctx.resume_inputs, + ) + + ic.session = ic.session.model_copy(deep=False) + return agent_ctx + + +def prepare_llm_agent_input(agent: Any, ctx: Context, node_input: Any) -> None: + """Prepares the input for running LlmAgent as a node. + + For ``single_turn`` mode, append a user-role event with the input + directly to session.events (legacy behavior). + + For ``task`` mode, the input is the parent's task-delegation FC + args. Those are NOT appended here — the content-builder + transforms the originating FC event into a leading user-role + content at LLM-request time, so it appears as the first turn in + the task agent's view. When no originating FC exists (task agent + dispatched directly as a Workflow node), the wrapper instead + overrides ``ic.user_content`` so the content-builder can fall back + to that as the first user turn. + + No branch is set — task and single_turn agents scope via + ``isolation_scope`` rather than branch. + """ + if node_input is None or agent.mode != 'single_turn': + return + agent_input = _node_input_to_content(node_input) + user_event = Event(author='user', message=agent_input) + if user_event.content is not None: + user_event.content.role = 'user' + iso = getattr(ctx, 'isolation_scope', None) + if iso: + user_event.isolation_scope = iso + ctx.session.events.append(user_event) + + +def process_llm_agent_output(agent: Any, ctx: Context, event: Event) -> None: + """Processes the output of LlmAgent run as a node.""" + if ( + event.get_function_calls() + or event.partial + or not event.content + or event.content.role != 'model' + ): + return + + output = None + text = ( + ''.join(p.text for p in event.content.parts if p.text and not p.thought) + if event.content.parts + else '' + ) + if agent.output_schema: + if text.strip(): + output = validate_schema(agent.output_schema, text) + else: + output = None + else: + output = text + + if agent.output_key and output is not None: + ctx.actions.state_delta[agent.output_key] = output + + event.output = output + event.node_info.message_as_output = True + + +async def run_llm_agent_as_node( + agent: Any, + *, + ctx: Context, + node_input: Any, +) -> AsyncGenerator[Any, None]: + """Runs an LlmAgent as a workflow node.""" + # As a node in a workflow, agent is by default single_turn. + if agent.mode is None: + agent.mode = 'single_turn' + + if agent.mode not in ('task', 'single_turn', 'chat'): + raise ValueError( + f'LlmAgent as node only supports task, single_turn, and chat mode,' + f" but agent '{agent.name}' has mode='{agent.mode}'." + ) + + if agent.mode == 'single_turn': + agent.include_contents = 'none' + + agent_ctx = prepare_llm_agent_context(agent, ctx) + prepare_llm_agent_input(agent, agent_ctx, node_input) + + ic = agent_ctx.get_invocation_context() + update = {'agent': agent} + # thread the agent's isolation_scope into the + # InvocationContext so the content processor can filter session + # events to this agent's scope only. Only mode=task and + # mode=single_turn agents need scope-based filtering — chat agents + # see the full conversation. + _agent_iso = getattr(agent_ctx, 'isolation_scope', None) + if agent.mode in ('task', 'single_turn') and _agent_iso: + update['isolation_scope'] = _agent_iso + # Override ``user_content`` for task mode with this node's input. + # The content-builder uses it as the fallback first user turn when + # there is no originating delegation FC (the workflow-node task + # case). For delegated tasks, the FC takes precedence and this + # override is unused. + if agent.mode == 'task' and node_input is not None: + update['user_content'] = _node_input_to_content(node_input) + ic = ic.model_copy(update=update) + + from ..agents.live_request_queue import LiveRequestQueue + + # A single_turn LlmAgent in a live session runs in non-live mode + # and only consumes the node_input (ignoring the live request queue). + is_live = ( + isinstance(getattr(ic, 'live_request_queue', None), LiveRequestQueue) + and agent.mode != 'single_turn' + ) + + if agent.mode == 'single_turn': + # is_live is always False here (single_turn forces non-live). + async with aclosing(agent.run_async(ic)) as run_iter: + async for event in run_iter: + process_llm_agent_output(agent, ctx, event) + yield event + return + + if agent.mode == 'chat': + # outer dispatch loop. + # + # One coordinator invocation may contain multiple LLM rounds chained + # by task delegations. Example for sequential delegation: + # + # 1. (Optional) Pre-LLM scan: replay any unresolved task FCs from + # prior turns. Their dispatched sub-agents may complete or + # raise NodeInterruptedError (still WAITING). + # 2. Run parent.run_async: LLM emits a fresh task FC -> dispatch + # and synthesize FR. + # 3. Re-enter parent.run_async with the FR now in session: LLM + # may emit another task FC, a normal tool, or natural text. + # + # The previous implementation broke after the first dispatch in + # step 2, which prevented chained delegations from continuing + # within the same invocation. The outer ``while True`` loop fixes + # that by re-entering ``agent.run_async`` after every task FC + # dispatch, until the LLM returns without one. + tools_dict = _safe_canonical_tools_dict(agent) + + # Step 1 (only on the very first iteration of this invocation): + # pre-LLM scan for unresolved task FCs from prior runs. + pending = _find_unresolved_task_delegations( + ctx.session, + owner=agent.name, + tools_dict=tools_dict, + ) + for fc in pending: + output = await _dispatch_task_fc(agent, fc, ctx) + yield _synthesize_task_fr_event(fc, output) + + # Step 2: run parent.run_async; on every fresh task FC, dispatch + # and re-enter parent.run_async with the FR in session. + while True: + had_task_fc = False + transferred = False + run_method = agent.run_live(ic) if is_live else agent.run_async(ic) + async with aclosing(run_method) as run_iter: + async for event in run_iter: + yield event + task_fcs = _extract_task_delegation_fcs(event, tools_dict) + for fc in task_fcs: + output = await _dispatch_task_fc(agent, fc, ctx) + yield _synthesize_task_fr_event(fc, output) + if task_fcs: + had_task_fc = True + break # close this run_iter; outer loop re-enters + if event.actions.transfer_to_agent: + target_name = event.actions.transfer_to_agent + if target_name != agent.name: + from ..agents.llm_agent import LlmAgent + + if ( + isinstance(agent, LlmAgent) + and ctx._invocation_context.is_resumable + ): + ctx._invocation_context.set_agent_state( + agent.name, end_of_agent=True + ) + yield agent._create_agent_state_event(ctx._invocation_context) + transferred = True + break + if not had_task_fc or transferred: + # LLM finished without delegating (or transferred away); + # nothing more for this wrapper to do. + return + # Otherwise: loop back to re-enter agent.run_async so the LLM + # sees the synthesized FR(s) and can emit follow-up actions. + + # Task mode: sniff the finish_task FC, but wait for FinishTaskTool's + # FR before terminating. If validation fails (FR carries an + # ``error`` key), let the LLM see the error and retry on the next + # round. Only on a successful FR do we promote the FC's args as the + # task output and exit. + # + # The finish_task tool's declaration mirrors the agent's + # output_schema. For wrapped primitives (`int`, `str`, etc.) the + # value lives at the wrapper key; for object schemas it's at the + # top level of args. We extract via the FinishTaskTool's + # `_wrapper_key` when accessible, falling back to the full args. + finish_tool = _find_finish_task_tool(agent) + pending_fc_args: Optional[dict] = None + run_method = agent.run_live(ic) if is_live else agent.run_async(ic) + async with aclosing(run_method) as run_iter: + async for event in run_iter: + finish_fc = _extract_finish_task_fc(event) + if finish_fc is not None: + # Remember the latest FC's args; wait for FinishTaskTool's FR + # before terminating. If validation fails, the FR will NOT be + # the success message — the LLM sees the error and retries. + pending_fc_args = dict(finish_fc.args or {}) + yield event + continue + + if pending_fc_args is not None and _is_finish_task_success_fr(event): + wrapper_key = getattr(finish_tool, '_wrapper_key', None) + if wrapper_key and wrapper_key in pending_fc_args: + event.output = pending_fc_args[wrapper_key] + else: + event.output = pending_fc_args + yield event + return + + yield event diff --git a/src/google/adk/workflow/_node.py b/src/google/adk/workflow/_node.py new file mode 100644 index 0000000000..d5c99cd9b4 --- /dev/null +++ b/src/google/adk/workflow/_node.py @@ -0,0 +1,213 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A wrapper class and @node decorator for creating workflow nodes.""" + +from __future__ import annotations + +from collections.abc import AsyncGenerator +from collections.abc import Callable +from typing import Any +from typing import overload +from typing import TYPE_CHECKING +from typing import TypeVar + +from pydantic import Field +from pydantic import PrivateAttr +from typing_extensions import override + +from . import _base_node as base_node +from . import _function_node as function_node +from . import _graph as definitions +from . import _parallel_worker as parallel_worker_lib +from ._retry_config import RetryConfig +from .utils import _workflow_graph_utils as workflow_graph_utils + +if TYPE_CHECKING: + from ..agents.context import Context + from ..auth.auth_tool import AuthConfig + +T = TypeVar("T", bound=Callable[..., Any]) + + +@overload +def node( + *, + name: str | None = None, + rerun_on_resume: bool | None = None, + retry_config: RetryConfig | None = None, + timeout: float | None = None, + parallel_worker: bool = False, + auth_config: AuthConfig | None = None, +) -> Callable[ + [T], function_node.FunctionNode | parallel_worker_lib._ParallelWorker +]: + ... + + +@overload +def node( + node_like: definitions.NodeLike, + *, + name: str | None = None, + rerun_on_resume: bool | None = None, + retry_config: RetryConfig | None = None, + timeout: float | None = None, + parallel_worker: bool = False, + auth_config: AuthConfig | None = None, +) -> base_node.BaseNode: + ... + + +def node( + node_like: definitions.NodeLike | None = None, + *, + name: str | None = None, + rerun_on_resume: bool | None = None, + retry_config: RetryConfig | None = None, + timeout: float | None = None, + parallel_worker: bool = False, + auth_config: AuthConfig | None = None, +) -> Any: + """Decorator or function to wrap a NodeLike in a node or override its properties. + + This can be used as a decorator on a function: + @node + async def my_func(): ... + + @node() + async def my_func2(): ... + + @node(name='my_node', rerun_on_resume=True) + async def my_func3(): ... + + Or as a function on a NodeLike: + my_node = node(my_func, name='other_name') + + Args: + node_like: The item to be wrapped as a node. Can be a BaseNode, BaseAgent, + BaseTool, or callable. + name: If provided, overrides the name of the wrapped node. + rerun_on_resume: If provided, overrides the rerun_on_resume property of the + wrapped node. + retry_config: If provided, overrides the retry_config property of the + wrapped node. + timeout: If provided, overrides the timeout property of the wrapped node. + parallel_worker: If True, wraps the node in a _ParallelWorker. + auth_config: If provided, the framework requests user authentication + before running the node. Requires rerun_on_resume=True. + + Returns: + If used as a decorator factory (@node() or @node(...)), returns a decorator. + If used as a decorator (@node) or function (node(node_like, ...)), returns + a BaseNode instance. + """ + + def wrapper( + func: T, + ) -> function_node.FunctionNode | parallel_worker_lib._ParallelWorker: + built_node = function_node.FunctionNode( + func=func, + name=name, + rerun_on_resume=rerun_on_resume + if rerun_on_resume is not None + else False, + retry_config=retry_config, + timeout=timeout, + auth_config=auth_config, + ) + if parallel_worker: + return parallel_worker_lib._ParallelWorker(node=built_node) + return built_node + + if node_like is None: + # If no node_like is provided, return a decorator factory. + return wrapper # type: ignore + else: + built_node = workflow_graph_utils.build_node( + node_like, + name=name, + rerun_on_resume=rerun_on_resume, + retry_config=retry_config, + timeout=timeout, + auth_config=auth_config, + ) + if parallel_worker: + return parallel_worker_lib._ParallelWorker(node=built_node) + return built_node + + +class Node(base_node.BaseNode): + """A node class designed for subclassing. + + Subclasses can directly benefit from advanced flags like parallel_worker + by implementing the run_node_impl() method. + """ + + parallel_worker: bool = Field(default=False, frozen=True) + _inner_node: base_node.BaseNode | None = PrivateAttr(default=None) + + def model_post_init(self, __context: Any) -> None: + super().model_post_init(__context) + if self.parallel_worker: + # If parallel_worker is True, we wrap a clone of the current node + # in a _ParallelWorker. We disable parallel_worker on the clone + # to avoid infinite recursion when its run() method is called. + # The cloned node preserves the class identity and behavior of the + # original (essential for LlmAgent and Workflow subclasses). + worker_node = self.model_copy(update={"parallel_worker": False}) + + inner = parallel_worker_lib._ParallelWorker(node=worker_node) + self._inner_node = inner + # Synchronize rerun_on_resume with the inner node. + self.rerun_on_resume = inner.rerun_on_resume + + @override + def model_copy( + self, *, update: dict[str, Any] | None = None, deep: bool = False + ) -> Any: + """Clones the node with updated fields.""" + copied = super().model_copy(update=update, deep=deep) + + if copied.parallel_worker: + worker_node = copied.model_copy(update={"parallel_worker": False}) + copied._inner_node = parallel_worker_lib._ParallelWorker(node=worker_node) + copied.rerun_on_resume = copied._inner_node.rerun_on_resume + + return copied + + async def run_node_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + """Implement this method when designing a child class that inherits from Node. + + Subclasses can directly benefit from advanced flags like parallel_worker + by providing their custom execution logic here. + """ + raise NotImplementedError("run_node_impl must be implemented.") + yield + + @override + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + """Dispatches to run_node_impl() or parallel_worker inner node.""" + if self.parallel_worker: + if self._inner_node is None: + raise ValueError("inner_node is not initialized for parallel worker.") + async for output in self._inner_node.run(ctx=ctx, node_input=node_input): + yield output + else: + async for output in self.run_node_impl(ctx=ctx, node_input=node_input): + yield output diff --git a/src/google/adk/workflow/_node_runner.py b/src/google/adk/workflow/_node_runner.py new file mode 100644 index 0000000000..daab91afc5 --- /dev/null +++ b/src/google/adk/workflow/_node_runner.py @@ -0,0 +1,411 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""NodeRunner — per-node executor class. + +Converts BaseNode.run() (async generator) into an awaitable that returns +the child Context with output, route, and interrupt_ids set. Used +internally by orchestrators (Workflow, SingleLlmAgentReactNode, etc.). + +User-facing ctx.run_node() wraps this and returns just ctx.output. +""" + +from __future__ import annotations + +import asyncio +import logging +from typing import Any +from typing import TYPE_CHECKING + +from ..events._node_path_builder import _NodePathBuilder +from ..telemetry import node_tracing + +if TYPE_CHECKING: + from ..agents.context import Context + from ..events.event import Event + from ._base_node import BaseNode + + +logger = logging.getLogger("google_adk." + __name__) + + +class NodeRunner: + """Per-node executor. Drives BaseNode.run(), enriches events. + + Creates child Context, iterates node.run(), enqueues events to + ic.event_queue, writes output/route/interrupt_ids to ctx, and + returns the child Context. + """ + + def __init__( + self, + *, + node: BaseNode, + parent_ctx: Context, + run_id: str | None = None, + # Output delegation (use_as_output) + use_as_output: bool = False, + # Resume state from a previous run + prior_output: Any = None, + prior_interrupt_ids: set[str] | None = None, + use_sub_branch: bool = False, + override_branch: str | None = None, + override_isolation_scope: str | None = None, + ) -> None: + """Initialize a NodeRunner. + + Args: + node: The BaseNode to execute. + parent_ctx: The parent node's Context. + run_id: Unique ID for this run. Should be a sequential + counter string ("1", "2", …) unique per node path. + Falls back to "1" if not provided. + + use_as_output: If True, this node's output also represents the parent + node's output. + prior_output: Output from a previous run, carried + forward on resume when the node had both output and + interrupts. + prior_interrupt_ids: Unresolved interrupt IDs (set) from a + previous run, carried forward on resume. + use_sub_branch: Whether the node should use a sub-branch. + override_branch: Optional branch to use instead of parent's branch. + """ + # Core + self._node = node + self._parent_ctx = parent_ctx + + self._run_id = str(run_id) if run_id else "1" + self._use_sub_branch = use_sub_branch + self._override_branch = override_branch + self._override_isolation_scope = override_isolation_scope + + # Output delegation + self._use_as_output = use_as_output + + # Resume state + self._prior_output = prior_output + self._prior_interrupt_ids = prior_interrupt_ids + + @property + def run_id(self) -> str: + """The run ID assigned to this node run.""" + return self._run_id + + async def run( + self, + node_input: Any = None, + *, + resume_inputs: dict[str, Any] | None = None, + ) -> Context: + """Drive node.run(), enqueue events, return child Context. + + The caller reads ctx.output, ctx.route, and ctx.interrupt_ids + for the node's results. + """ + attempt_count = 1 + while True: + ctx = self._create_child_context( + resume_inputs, attempt_count=attempt_count + ) + logger.debug("node %s started.", ctx.node_path) + try: + # Start the span within try-except block to record exceptions on the span + async with node_tracing.start_as_current_node_span( + self._parent_ctx, self._node + ) as telemetry_context: + ctx._telemetry_context = telemetry_context + await self._execute_node(ctx, node_input) + await self._flush_output_and_deltas(ctx) + logger.debug("node %s end.", ctx.node_path) + return ctx + except Exception as e: + from ._errors import DynamicNodeFailError + + if isinstance(e, DynamicNodeFailError): + # TODO: consider to retry upon dynamic node failures later. This may + # require thorough design to consider a workflow dynamic node and a + # normal node. + ctx._error = e.error + ctx._error_node_path = e.error_node_path + logger.debug("node %s end.", ctx.node_path) + return ctx + + from ..events.event import Event + + logger.exception("Node execution failed with exception") + error_event = Event( + error_code=type(e).__name__, + error_message=str(e), + ) + await self._enqueue_event(error_event, ctx) + + if not await self._attempt_retry(e, ctx, attempt_count): + ctx._error = e + ctx._error_node_path = ctx.node_path + logger.debug("node %s end.", ctx.node_path) + return ctx + logger.warning( + "Node %s failed and is being retried locally. Note: retry count is" + " not persisted across resuming.", + self._node.name, + ) + attempt_count += 1 + + async def _attempt_retry( + self, e: Exception, ctx: Context, attempt_count: int + ) -> bool: + """Checks if node should retry and sleeps if so.""" + from ._node_state import NodeState + from .utils._retry_utils import _get_retry_delay + from .utils._retry_utils import _should_retry_node + + node_state = NodeState(attempt_count=attempt_count) + + if not _should_retry_node(e, self._node.retry_config, node_state): + return False + + delay = _get_retry_delay(self._node.retry_config, node_state) + + await asyncio.sleep(delay) + return True + + def _create_child_context( + self, + resume_inputs: dict[str, Any] | None, + attempt_count: int = 1, + ) -> Context: + """Create a child Context for the node, inheriting from parent. + + If prior_output or prior_interrupt_ids were provided at + construction (resume scenario), pre-populates ctx with state + from the previous run. + """ + from ..agents.context import Context + + ic = self._parent_ctx._invocation_context + base_branch = ( + self._override_branch + if self._override_branch is not None + else ic.branch + ) + + if self._use_sub_branch: + segment = f"{self._node.name}@{self._run_id}" + branch = f"{base_branch}.{segment}" if base_branch else segment + ic = ic.model_copy(update={"branch": branch}) + elif self._override_branch is not None: + ic = ic.model_copy(update={"branch": self._override_branch}) + + ctx = Context( + ic, + parent_ctx=self._parent_ctx, + node=self._node, + run_id=self._run_id, + resume_inputs=resume_inputs, + use_as_output=self._use_as_output, + attempt_count=attempt_count, + ) + + # override the inherited isolation_scope when explicitly set. + if self._override_isolation_scope is not None: + ctx.isolation_scope = self._override_isolation_scope + + # Carry forward state from a previous run (resume scenario). + if self._prior_output is not None: + ctx._output_value = self._prior_output + ctx._output_emitted = True + if self._prior_interrupt_ids: + ctx._interrupt_ids.update(self._prior_interrupt_ids) + + return ctx + + async def _execute_node( + self, + ctx: Context, + node_input: Any, + ) -> None: + """Iterate node.run(), enqueue events, write results to ctx.""" + from ._errors import NodeInterruptedError + from ._errors import NodeTimeoutError + + try: + timeout = self._node.timeout + if timeout is not None: + await self._run_node_loop_with_timeout(ctx, node_input, timeout) + else: + await self._run_node_loop(ctx, node_input) + except NodeInterruptedError: + # A dynamic child interrupted via ctx.run_node(). + # The child's interrupt_ids are already on ctx + # (set by the schedule callback). Nothing more to do — + # the caller reads ctx.interrupt_ids. + pass + + async def _run_node_loop(self, ctx: Context, node_input: Any) -> None: + """Iterate node.run(), track events in context, and enqueue them.""" + from ..utils.context_utils import Aclosing + + logger.debug("node %s execute loop start.", ctx.node_path) + async with Aclosing(self._node.run(ctx=ctx, node_input=node_input)) as agen: + async for event in agen: + self._track_event_in_context(event, ctx) + await self._enqueue_event(event, ctx) + + logger.debug("node %s execute loop end.", ctx.node_path) + + async def _run_node_loop_with_timeout( + self, ctx: Context, node_input: Any, timeout: float + ) -> None: + try: + await asyncio.wait_for( + self._run_node_loop(ctx, node_input), timeout=timeout + ) + except asyncio.TimeoutError as e: + from ._errors import NodeTimeoutError + + raise NodeTimeoutError(node_name=self._node.name, timeout=timeout) from e + + def _track_event_in_context(self, event: Event, ctx: Context) -> None: + """Write yielded event results to ctx (source of truth).""" + if event.output is not None: + ctx.output = event.output + elif event.node_info and event.node_info.message_as_output: + ctx.output = event.content + if event.long_running_tool_ids is not None: + ctx._interrupt_ids.update(event.long_running_tool_ids) + # Only propagate decisions from native events (authored by this node or unspecified). + # This prevents structured parent nodes (e.g. SequentialAgent) from intercepting + # and bubbling up actions already handled internally by their nested sub-agents. + is_native_node_event = not event.author or event.author == self._node.name + if event.actions and is_native_node_event: + if event.actions.route is not None: + ctx.route = event.actions.route + ctx._route_emitted = True + if event.actions.transfer_to_agent is not None: + ctx.actions.transfer_to_agent = event.actions.transfer_to_agent + + ctx.telemetry_context.add_event(event) + + # Validate state_delta if schema is present + if ( + event.actions + and event.actions.state_delta + and ctx.state._schema is not None + ): + from ..sessions.state import _validate_state_entry + + for key, value in event.actions.state_delta.items(): + _validate_state_entry(ctx.state._schema, key, value) + + async def _enqueue_event(self, event: Event, ctx: Context) -> None: + """Enrich and enqueue event to the session. + + Skips enqueueing if output is delegated via use_as_output — + the child already emitted it. Pending deltas stay in ctx for + _flush_output_and_deltas. + """ + if event.output is not None and ctx._output_delegated: + return + + self._enrich_event(event, ctx) + if not event.partial: + self._flush_deltas(event, ctx) + await ctx._invocation_context._enqueue_event(event) + + if event.output is not None: + ctx._output_emitted = True + if event.node_info.message_as_output: + ctx._output_delegated = True + + async def _flush_output_and_deltas(self, ctx: Context) -> None: + """Emit deferred output and/or unflushed state/artifact deltas.""" + from ..events.event import Event + from ..events.event_actions import EventActions + + state_delta = ctx.actions.state_delta + artifact_delta = ctx.actions.artifact_delta + has_deferred_output = ( + ctx._output_value is not None + and not ctx._output_emitted + and not ctx._output_delegated + ) + has_unflushed_route = ( + ctx._route_value is not None and not ctx._route_emitted + ) + has_deltas = bool(state_delta or artifact_delta) + + if not has_deferred_output and not has_deltas and not has_unflushed_route: + return + + # Build the event — output + route + deltas, or a subset. + event = Event( + output=ctx._output_value if has_deferred_output else None, + route=ctx._route_value if has_unflushed_route else None, + ) + if has_deltas: + event.actions = EventActions( + state_delta=dict(state_delta), + artifact_delta=dict(artifact_delta), + ) + state_delta.clear() + artifact_delta.clear() + + self._enrich_event(event, ctx) + await ctx._invocation_context._enqueue_event(event) + if has_deferred_output: + ctx._output_emitted = True + if has_unflushed_route: + ctx._route_emitted = True + + def _flush_deltas(self, event: Event, ctx: Context) -> None: + """Move pending state/artifact deltas from ctx onto the event. + + TODO: Handle non-persisted states (e.g. `temp:` prefixed keys) + that should flow through ctx but not be written to session events. + """ + from ..events.event_actions import EventActions + + state_delta = ctx.actions.state_delta + artifact_delta = ctx.actions.artifact_delta + if not state_delta and not artifact_delta: + return + + if not event.actions: + event.actions = EventActions() + if state_delta: + event.actions.state_delta.update(state_delta) + state_delta.clear() + if artifact_delta: + event.actions.artifact_delta.update(artifact_delta) + artifact_delta.clear() + + def _enrich_event(self, event: Event, ctx: Context) -> None: + """Set author, node_info, invocation_id on the event.""" + # TODO: revisit after we settle Event.author logic for content/message. + event.author = ctx.event_author or self._node.name + event.invocation_id = ctx._invocation_context.invocation_id + event.node_info.path = ctx.node_path + if event.branch is None: + event.branch = ctx._invocation_context.branch + elif event.branch == "": + event.branch = None + ctx._invocation_context.branch = None + else: + ctx._invocation_context.branch = event.branch + if event.output is not None: + event.node_info.output_for = [ctx.node_path] + ctx._output_for_ancestors + # stamp the scope tag. + if event.isolation_scope is None and ctx.isolation_scope is not None: + event.isolation_scope = ctx.isolation_scope diff --git a/src/google/adk/workflow/_node_state.py b/src/google/adk/workflow/_node_state.py new file mode 100644 index 0000000000..86b36e948a --- /dev/null +++ b/src/google/adk/workflow/_node_state.py @@ -0,0 +1,60 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Per-node execution state.""" + +from __future__ import annotations + +from typing import Any + +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import Field + +from ._node_status import NodeStatus + + +class NodeState(BaseModel): + """State of a node in the workflow.""" + + model_config = ConfigDict(extra='ignore', ser_json_bytes='base64') + + status: NodeStatus = NodeStatus.INACTIVE + """The run status of the node.""" + + input: Any = None + """The input provided to the node.""" + + attempt_count: int = Field(default=1, exclude_if=lambda v: v == 1) + """The attempt count for this node run (1-based).""" + + interrupts: list[str] = Field(default_factory=list) + """The interrupt ids that are pending to be resolved.""" + + resume_inputs: dict[str, Any] = Field(default_factory=dict) + """The responses for resuming the node, keyed by interrupt id.""" + + run_counter: int = Field(default=0, exclude_if=lambda v: v == 0) + """Sequential counter incremented each time the node gets a fresh run. + + Preserving this count independently of run_id prevents path collisions + if a node switches between custom string IDs and auto-generated numeric IDs. + """ + + run_id: str | None = None + """The run ID of this node run.""" + + parent_run_id: str | None = None + """The run ID of the parent node which dynamically + scheduled this node run.""" diff --git a/src/google/adk/workflow/_node_status.py b/src/google/adk/workflow/_node_status.py new file mode 100644 index 0000000000..4d85d3123e --- /dev/null +++ b/src/google/adk/workflow/_node_status.py @@ -0,0 +1,44 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Node execution status enum.""" + +from __future__ import annotations + +from enum import Enum + + +class NodeStatus(Enum): + """The status of a node in the workflow graph.""" + + INACTIVE = 0 + """The node is not ready to be executed.""" + + PENDING = 1 + """The node is ready to be executed.""" + + RUNNING = 2 + """The node is being executed.""" + + COMPLETED = 3 + """The node has been executed successfully.""" + + WAITING = 4 + """The node is waiting (e.g. for a user response or re-trigger).""" + + FAILED = 5 + """The node has failed.""" + + CANCELLED = 6 + """The node has been cancelled.""" diff --git a/src/google/adk/workflow/_parallel_worker.py b/src/google/adk/workflow/_parallel_worker.py new file mode 100644 index 0000000000..a277b85ec4 --- /dev/null +++ b/src/google/adk/workflow/_parallel_worker.py @@ -0,0 +1,131 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Parallel worker node for workflows.""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncGenerator +from typing import Any + +from pydantic import ConfigDict +from pydantic import Field +from pydantic import PrivateAttr +from typing_extensions import override + +from ..agents.context import Context +from ._base_node import BaseNode +from ._graph import NodeLike +from ._retry_config import RetryConfig +from .utils._workflow_graph_utils import build_node + + +class _ParallelWorker(BaseNode): + """A node that runs a wrapped node in parallel for each item in the input list. + + Attributes: + max_concurrency: The maximum number of parallel tasks to run. If None, there + is no limit on concurrency. + """ + + model_config = ConfigDict(arbitrary_types_allowed=True) + + max_concurrency: int | None = Field(default=None) + + _node: BaseNode = PrivateAttr() + + def __init__( + self, + *, + node: NodeLike, + max_concurrency: int | None = None, + retry_config: RetryConfig | None = None, + timeout: float | None = None, + ): + if node == 'START': + raise ValueError('ParallelWorker cannot wrap a START node.') + built_node = build_node(node) + super().__init__( + name=built_node.name, + rerun_on_resume=True, + retry_config=retry_config, + timeout=timeout, + ) + self._node = built_node + self.max_concurrency = max_concurrency + + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + if not isinstance(node_input, list): + # Wrap the single input in a list to allow processing. + # This handles cases where the input is a single item. + node_input = [node_input] + + if not node_input: + yield [] + return + + results = [None] * len(node_input) + pending_tasks: set[asyncio.Task[Any]] = set() + input_index = 0 + + while input_index < len(node_input) or pending_tasks: + # Check for any inputs waiting to be processed. + while input_index < len(node_input) and ( + self.max_concurrency is None + or len(pending_tasks) < self.max_concurrency + ): + item = node_input[input_index] + task = asyncio.create_task( + ctx.run_node( + self._node, + node_input=item, + use_sub_branch=True, + ) + ) + # Store index on task so we can place result correctly when done + setattr(task, '_worker_index', input_index) + pending_tasks.add(task) + input_index += 1 + + # If there are pending tasks, wait for first one to complete. + # We only wait for the first one, because after it completes, we want + # to check if any new items are waiting to be processed. + if pending_tasks: + done, pending = await asyncio.wait( + pending_tasks, return_when=asyncio.FIRST_COMPLETED + ) + for task in done: + exc = task.exception() + if exc is not None: + # If a task failed, cancel all other pending tasks. + for p_task in pending: + p_task.cancel() + # Wait for all pending tasks to be cancelled + if pending: + await asyncio.wait(pending) + # Raise the exception from the failed task + raise exc + + index = getattr(task, '_worker_index') + results[index] = task.result() + pending_tasks = pending + + yield results diff --git a/src/google/adk/workflow/_retry_config.py b/src/google/adk/workflow/_retry_config.py new file mode 100644 index 0000000000..d19c87524d --- /dev/null +++ b/src/google/adk/workflow/_retry_config.py @@ -0,0 +1,75 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Configuration for retrying a workflow node.""" + +from __future__ import annotations + +from typing import Any + +from pydantic import BaseModel +from pydantic import Field +from pydantic import field_validator + + +class RetryConfig(BaseModel): + """Configuration for retrying a node.""" + + max_attempts: int | None = Field( + default=None, + description="""Maximum number of attempts, including the original request. + If 0 or 1, it means no retries. If not specified, default to 5.""", + ) + initial_delay: float | None = Field( + default=None, + description="""Initial delay before the first retry, in fractions of a second. If not specified, default to 1.0 second.""", + ) + max_delay: float | None = Field( + default=None, + description="""Maximum delay between retries, in fractions of a second. If not specified, default to 60.0 seconds.""", + ) + backoff_factor: float | None = Field( + default=None, + description="""Multiplier by which the delay increases after each attempt. If not specified, default to 2.0.""", + ) + jitter: float | None = Field( + default=None, + description="""Randomness factor for the delay. If not specified, default to 1.0. Otherwise use 0.0 to remove randomness.""", + ) + + exceptions: list[str | type[BaseException]] | None = Field( + default=None, + description="""Exceptions to retry on. Accepts exception class names as + strings (e.g. ``['ValueError']``) or exception classes directly (e.g. + ``[ValueError]``). ``None`` means retry on all exceptions.""", + ) + + @field_validator('exceptions', mode='before') + @classmethod + def _normalize_exceptions(cls, v: list[Any] | None) -> list[str] | None: + """Converts exception classes to their class names for uniform handling.""" + if v is None: + return None + normalized = [] + for item in v: + if isinstance(item, str): + normalized.append(item) + elif isinstance(item, type) and issubclass(item, BaseException): + normalized.append(item.__name__) + else: + raise ValueError( + 'exceptions must contain exception class names (str) or' + f' exception classes, got {type(item).__name__}: {item!r}' + ) + return normalized diff --git a/src/google/adk/workflow/_schedule_dynamic_node.py b/src/google/adk/workflow/_schedule_dynamic_node.py new file mode 100644 index 0000000000..8ce3a4ea5d --- /dev/null +++ b/src/google/adk/workflow/_schedule_dynamic_node.py @@ -0,0 +1,79 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Internal protocol for scheduling dynamic nodes with full result.""" + +from __future__ import annotations + +from collections.abc import Awaitable +from typing import Any +from typing import Protocol +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ..agents.context import Context + + +class ScheduleDynamicNode(Protocol): + """Protocol for scheduling a dynamic node. + + Implementations handle the lifecycle of dynamically scheduled nodes (e.g., + via `ctx.run_node()`). This includes: + 1. Fresh Execution: Running a node for the first time. + 2. Deduplication: Returning cached output if the node already completed in a + prior turn (based on event history). + 3. Resumption: Rehydrating state from session events when execution is + resumed after an interrupt, and resolving or propagating remaining + interrupts. + + Args: + ctx: The calling node's Context. + node: The node to execute. Usually a subclass of `BaseNode`. + node_input: Input data for the node. Must match the node's input schema if + defined. + node_name: Deterministic tracking name. If None, uses `node.name`. This is + critical for matching events on resume. + use_as_output: If True, the child node's output will replace the calling + node's output. + run_id: A unique ID for this specific execution of the node. + use_sub_branch: Whether the node should execute in an isolated sub-branch + to prevent message history pollution. + override_branch: Optional specific branch name to use, overriding defaults. + + Returns: + Awaitable[Context]: A future that resolves to the child node's Context, + which will contain the output, routing information, and any active + interrupt IDs. + + Raises: + ValueError: If input validation fails or if the node configuration is + invalid on resume (e.g., waiting for output but called with + `rerun_on_resume=False`). + RuntimeError: If the execution reaches an inconsistent state. + """ + + def __call__( + self, + ctx: Context, + node: Any, + node_input: Any, + *, + node_name: str | None = None, + use_as_output: bool = False, + run_id: str, + use_sub_branch: bool = False, + override_branch: str | None = None, + override_isolation_scope: str | None = None, + ) -> Awaitable[Context]: + ... diff --git a/src/google/adk/workflow/_tool_node.py b/src/google/adk/workflow/_tool_node.py new file mode 100644 index 0000000000..fad28bb714 --- /dev/null +++ b/src/google/adk/workflow/_tool_node.py @@ -0,0 +1,90 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +"""A node that wraps an ADK Tool.""" + +from collections.abc import AsyncGenerator +from typing import Any +import uuid + +from pydantic import ConfigDict +from pydantic import Field +from typing_extensions import override + +from ..agents.context import Context +from ..events.event import Event +from ..tools.base_tool import BaseTool +from ..tools.tool_context import ToolContext +from ._base_node import BaseNode +from ._retry_config import RetryConfig + + +class _ToolNode(BaseNode): + """A node that wraps an ADK Tool.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + tool: BaseTool = Field(...) + + def __init__( + self, + *, + tool: BaseTool, + name: str | None = None, + retry_config: RetryConfig | None = None, + timeout: float | None = None, + ): + super().__init__( + tool=tool, + name=name or tool.name, + rerun_on_resume=False, + retry_config=retry_config, + timeout=timeout, + ) + + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + tool_context = ToolContext( + invocation_context=ctx.get_invocation_context(), + function_call_id=str(uuid.uuid4()), + ) + + args = node_input + if args is None: + args = {} + elif not isinstance(args, dict): + raise TypeError( + 'The input to ToolNode must be a dictionary of tool arguments or' + f' None, but got {type(args)}.' + ) + + response = await self.tool.run_async(args=args, tool_context=tool_context) + state_delta = ( + dict(tool_context.actions.state_delta) + if tool_context.actions.state_delta + else None + ) + if response is not None: + yield Event( + output=response, + state=state_delta, + ) + elif state_delta: + yield Event(state=state_delta) diff --git a/src/google/adk/workflow/_trigger.py b/src/google/adk/workflow/_trigger.py new file mode 100644 index 0000000000..3239ebf331 --- /dev/null +++ b/src/google/adk/workflow/_trigger.py @@ -0,0 +1,40 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Trigger data model.""" + +from __future__ import annotations + +from typing import Any + +from pydantic import BaseModel +from pydantic import ConfigDict + + +class Trigger(BaseModel): + """Represents a trigger for a downstream node.""" + + model_config = ConfigDict(ser_json_bytes='base64') + + input: Any = None + """The input to pass to the triggered node.""" + + use_sub_branch: bool = False + """Whether this trigger should use a sub-branch.""" + + branch: str | None = None + """The branch inherited from the predecessor node.""" + + isolation_scope: str | None = None + """Scope tag explicitly propagated to this trigger.""" diff --git a/src/google/adk/workflow/_workflow.py b/src/google/adk/workflow/_workflow.py new file mode 100644 index 0000000000..83aa43204d --- /dev/null +++ b/src/google/adk/workflow/_workflow.py @@ -0,0 +1,875 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""New Workflow implementation — BaseNode with graph orchestration. + +Combines user-facing graph definition with the execution engine. +Workflow(BaseNode) with _run_impl() as the orchestration loop. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import AsyncGenerator +from dataclasses import dataclass +from dataclasses import field +import logging +from typing import Any +from typing import TYPE_CHECKING + +from pydantic import Field + +from ._base_node import BaseNode +from ._base_node import START +from ._dynamic_node_scheduler import DynamicNodeScheduler +from ._dynamic_node_scheduler import DynamicNodeState +from ._graph import EdgeItem +from ._graph import Graph +from ._graph import RouteValue +from ._node_runner import NodeRunner +from ._node_state import NodeState +from ._node_status import NodeStatus +from ._trigger import Trigger +from .utils._rehydration_utils import _ChildScanState +from .utils._rehydration_utils import _reconstruct_node_states +from .utils._rehydration_utils import _unwrap_response +from .utils._rehydration_utils import is_terminal_event +from .utils._replay_interceptor import check_interception +from .utils._replay_interceptor import create_mock_context +from .utils._replay_sequence_barrier import ReplaySequenceBarrier + +if TYPE_CHECKING: + from ..agents.context import Context + from ._schedule_dynamic_node import ScheduleDynamicNode + +logger = logging.getLogger('google_adk.' + __name__) + + +def get_common_branch_prefix(branches: list[str]) -> str: + """Find the common prefix of dot-separated branch strings.""" + if not branches: + return '' + split_branches = [b.split('.') if b else [] for b in branches] + + common = [] + for segments in zip(*split_branches): + if len(set(segments)) == 1: + common.append(segments[0]) + else: + break + return '.'.join(common) + + +# --------------------------------------------------------------------------- +# Loop state (mutable, not persisted) +# --------------------------------------------------------------------------- + + +@dataclass(kw_only=True) +class _LoopState(DynamicNodeState): + """Mutable, in-memory state for one Workflow execution. + + Extends ``DynamicNodeState`` (which provides dynamic_nodes, + dynamic_outputs, dynamic_pending_tasks, interrupt_ids) with + graph-specific fields for static nodes and triggers. + + Scoped to a single _run_impl invocation. Not persisted — + static node state is reconstructed from session events on + resume; dynamic node state is lazily scanned on demand. + Discarded when _run_impl returns. + """ + + # --- Static graph nodes (keyed by node name) --- + + nodes: dict[str, NodeState] = field(default_factory=dict) + """Static node states.""" + + recovered_executions: dict[str, _ChildScanState] = field(default_factory=dict) + """Raw node states reconstructed from session events, keyed by node_name@run_id.""" + + sequence_barrier: ReplaySequenceBarrier | None = None + """Chronological sequence barrier to ensure deterministic replay ordering.""" + + error_shut_down: bool = False + """Flag indicating that the workflow is shutting down due to an error.""" + + node_outputs: dict[str, Any] = field(default_factory=dict) + """Cached static node outputs.""" + + node_branches: dict[str, str] = field(default_factory=dict) + """Cached static node branches.""" + + pending_tasks: dict[str, asyncio.Task[Context]] = field(default_factory=dict) + """Running static node tasks.""" + + trigger_buffer: dict[str, list[Trigger]] = field(default_factory=dict) + """Queued triggers waiting to be dispatched, keyed by target node name. + + Producers: + - _seed_start_triggers: initial triggers for START successors + - _buffer_downstream_triggers: when a node completes, triggers + its downstream successors + - _process_resume: seeds triggers for PENDING nodes on resume + + Consumer: + - _schedule_ready_nodes: pops triggers, creates NodeRunners, + moves nodes to RUNNING + """ + + schedule_dynamic_node: ScheduleDynamicNode | None = None + """Closure that handles ctx.run_node() calls from child nodes. + + Tracks dynamic nodes in this Workflow's loop state + (dynamic_nodes, dynamic_outputs, dynamic_pending_tasks). + Handles dedup (cached output), resume (lazy scan + re-run), + and fresh execution. + + Set on ctx at Workflow setup, propagated down to descendants + via NodeRunner until a nested orchestration node overrides it. + """ + + +# --------------------------------------------------------------------------- +# Workflow +# --------------------------------------------------------------------------- + + +class Workflow(BaseNode): + """A graph-based workflow node. + + _run_impl() IS the graph orchestration loop: + - SETUP: build graph, seed triggers + - LOOP: schedule ready nodes via NodeRunner, handle completions + - FINALIZE: collect terminal outputs + """ + + rerun_on_resume: bool = Field(default=True) + + edges: list[EdgeItem] = Field( + description='Edges to build the workflow graph.', + default_factory=list, + ) + + max_concurrency: int | None = None + """Maximum parallel graph-scheduled nodes. None means unlimited. + + Only applies to nodes triggered by graph edges. Dynamic nodes + (via ctx.run_node()) are excluded — they are awaited inline by + their parent and throttling them would cause deadlock. + """ + + graph: Graph | None = Field( + description='The compiled workflow graph.', + default=None, + ) + + # --- Construction --- + + def model_post_init(self, context: Any) -> None: + super().model_post_init(context) + if self.edges and self.graph is None: + self.graph = self._build_graph() + self._validate_state_schema() + self._validate_no_task_mode_graph_nodes() + + def _build_graph(self) -> Graph: + """Convert edge definitions to a validated Graph.""" + graph = Graph.from_edge_items(self.edges) + graph.validate_graph() + return graph + + def _validate_no_task_mode_graph_nodes(self) -> None: + """Reject ``mode='task'`` LlmAgents that appear as static graph nodes. + + Task-mode agents are multi-turn — they pause for user replies and + expect the original ``node_input`` (the task brief) to remain visible + across re-dispatches. The workflow scheduler currently overwrites + ``node_input`` with the latest user message on every re-entry, so the + task brief is lost and the agent loses context. Until the scheduler + preserves the originating ``node_input`` on resume, task agents may + only be used: + + * as chat sub-agents of an LlmAgent coordinator (FC delegation + via ``_TaskAgentTool`` / ``_dispatch_task_fc``), or + * dispatched dynamically via ``ctx.run_node`` from a custom + function node — never as static workflow graph nodes. + """ + if not self.graph: + return + from ..agents.llm_agent import LlmAgent + + for graph_node in self.graph.nodes: + if isinstance(graph_node, LlmAgent) and graph_node.mode == 'task': + raise ValueError( + f"Agent {graph_node.name!r} has mode='task' and cannot be " + 'used as a workflow graph node. Use a chat coordinator with ' + 'task sub-agents, or dispatch dynamically via ctx.run_node ' + 'from a function node.' + ) + + def _validate_state_schema(self) -> None: + """Raises when FunctionNode params don't match state_schema fields.""" + if not self.state_schema or not self.graph: + return + + from ..sessions.state import StateSchemaError + from ._function_node import FunctionNode + + schema_fields = set(self.state_schema.model_fields.keys()) + + for graph_node in self.graph.nodes: + if not isinstance(graph_node, FunctionNode): + continue + + for param_name in graph_node._sig.parameters: + if param_name in ('ctx', 'node_input', 'self'): + continue + + if param_name not in schema_fields: + raise StateSchemaError( + f'FunctionNode {graph_node.name!r} parameter ' + f'{param_name!r} is not declared in state_schema ' + f'{self.state_schema.__name__!r}. Declared fields: ' + f'{sorted(schema_fields)}' + ) + + # --- _run_impl: the orchestration loop --- + + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + """Orchestration loop: SETUP -> LOOP -> FINALIZE.""" + if self.graph is None: + return + + # Set event_author so child events are attributed to this workflow. + ctx.event_author = self.name + + # --- SETUP: resume from events or start fresh --- + # TODO: resume from checkpoint event. + loop_state = _LoopState() + loop_state.recovered_executions, recovered_sequence = ( + self._scan_child_events(ctx) + ) + loop_state.sequence_barrier = ReplaySequenceBarrier(recovered_sequence) + + if ctx.resume_inputs and not loop_state.recovered_executions: + logger.warning( + 'Workflow %s: resume_inputs provided but no recovered executions' + ' found.', + self.name, + ) + + self._seed_start_triggers(loop_state, node_input) + + # Create closure for dynamic node scheduling + loop_state.schedule_dynamic_node = self._make_schedule_dynamic_node( + loop_state + ) + ctx._workflow_scheduler = loop_state.schedule_dynamic_node + + # --- LOOP --- + try: + await self._run_loop(loop_state, ctx) + finally: + await self._cleanup_all_tasks(loop_state) + + if loop_state.error_shut_down: + return + + # Collect remaining interrupts from WAITING nodes + self._collect_remaining_interrupts(loop_state) + + # --- FINALIZE --- + # Terminal node output already has output_for including this + # workflow's path. Mark output as delegated so the workflow's + # NodeRunner skips creating a duplicate output event. + if self._has_terminal_output(loop_state): + ctx._output_delegated = True + self._finalize(loop_state, ctx) + return + yield # required to keep _run_impl as async generator + + # --- LOOP --- + + async def _run_loop(self, loop_state: _LoopState, ctx: Context) -> None: + """Schedule and execute nodes until no more work.""" + logger.debug('node %s execute loop start.', ctx.node_path) + + recovered_sequence_indices = { + node_path: i + for i, node_path in enumerate( + loop_state.sequence_barrier.sequence + if loop_state.sequence_barrier + else [] + ) + } + + while True: + self._schedule_ready_nodes(loop_state, ctx) + + if not loop_state.pending_tasks: + break + + done, _ = await asyncio.wait( + loop_state.pending_tasks.values(), + return_when=asyncio.FIRST_COMPLETED, + ) + + # To ensure deterministic processing order even for fresh executions, + # first order the done tasks by their insertion order in pending_tasks. + # Since pending_tasks is a dict, its values() preserve the exact order + # in which the tasks were originally scheduled. + ordered_done = [ + task for task in loop_state.pending_tasks.values() if task in done + ] + + task_to_name = { + task: name for name, task in loop_state.pending_tasks.items() + } + + # Sort done tasks by their order in recovered_sequence to ensure + # processing order matches history. + # This is needed because python asyncio.wait returns a set of completed + # tasks (done) when multiple tasks finish at the same time, which loses + # the order in which the original pending tasks were enqueued. + # Tasks not found in the sequence (e.g., new executions) will be placed + # at the end, preserving their original insertion order due to Python's + # stable sort. + def get_recovered_sequence_index(t): + name = task_to_name.get(t) + if not name: + return float('inf') + node_state = loop_state.nodes.get(name) + if not node_state: + return float('inf') + node_path = f'{name}@{node_state.run_id}' + return recovered_sequence_indices.get(node_path, float('inf')) + + sorted_done = sorted(ordered_done, key=get_recovered_sequence_index) + + for task in sorted_done: + name = self._pop_completed_task(loop_state, task) + + node = self._get_static_node_by_name(name) + child_ctx: Context = task.result() + if loop_state.sequence_barrier: + loop_state.sequence_barrier.check_and_advance( + f'{name}@{child_ctx.run_id}' + ) + + if child_ctx.error: + node_state = loop_state.nodes[name] + node_state.status = NodeStatus.FAILED + + ctx._error = child_ctx.error + ctx._error_node_path = child_ctx.error_node_path + + loop_state.error_shut_down = True + logger.debug('node %s execute loop end.', ctx.node_path) + return + + self._handle_completion(loop_state, name, node, child_ctx) + + # Await fire-and-forget dynamic tasks. + # TODO: Handle dynamic task failures and interrupts here. + # Currently, dynamic node completion is handled inline in the + # _schedule_dynamic_node_callback closure. But failures are not caught. + dynamic_tasks = loop_state.get_dynamic_tasks() + if dynamic_tasks: + await asyncio.wait(dynamic_tasks) + logger.debug('node %s execute loop end.', ctx.node_path) + + # --- Scheduling --- + + def _seed_start_triggers( + self, + loop_state: _LoopState, + node_input: Any, + ) -> None: + """Seed triggers for START's direct successors.""" + assert self.graph is not None + + start_edges = [ + e for e in self.graph.edges if e.from_node.name == START.name + ] + use_sub_branch = len(start_edges) > 1 + for edge in start_edges: + loop_state.trigger_buffer.setdefault(edge.to_node.name, []).append( + Trigger( + input=node_input, + use_sub_branch=use_sub_branch, + ) + ) + + def _schedule_ready_nodes(self, loop_state: _LoopState, ctx: Context) -> None: + """Pop triggers from buffer and schedule ready nodes.""" + # loop_state.trigger_buffer is a dict, and Python 3.7+ dicts preserve insertion order. + # Therefore, nodes are processed strictly in the order their triggers arrived, + # ensuring deterministic scheduling order for parallel branches. + for node_name in list(loop_state.trigger_buffer.keys()): + if node_name in loop_state.pending_tasks: + continue + node_state = loop_state.nodes.get(node_name) + if node_state: + # Serialize executions of the same node to prevent race conditions. + # If a node is already RUNNING, or WAITING for user input (interrupts), + # we skip dequeuing new triggers for it until it completes its current turn. + if node_state.status == NodeStatus.RUNNING: + continue + # We only skip WAITING nodes if they have unresolved interrupts (waiting for user). + # If they are WAITING because of wait_for_output=True but produced no output yet, + # they should still process new triggers to accumulate state. + if node_state.status == NodeStatus.WAITING and node_state.interrupts: + continue + + if self._at_concurrency_limit(loop_state): + break + + trigger = self._pop_trigger(loop_state, node_name) + if trigger is None: + continue + + self._prepare_node_state_for_starting(loop_state, node_name, trigger) + self._start_node_task(loop_state, ctx, node_name, trigger) + + def _at_concurrency_limit(self, loop_state: _LoopState) -> bool: + """Check if max_concurrency has been reached.""" + return ( + bool(self.max_concurrency) + and len(loop_state.pending_tasks) >= self.max_concurrency + ) + + def _pop_trigger( + self, loop_state: _LoopState, node_name: str + ) -> Trigger | None: + """Pop the next trigger for a node, or None if empty.""" + buffer = loop_state.trigger_buffer.get(node_name, []) + if not buffer: + return None + trigger = buffer.pop(0) + if not buffer: + del loop_state.trigger_buffer[node_name] + return trigger + + @staticmethod + def _next_run_id(node_state: NodeState) -> str: + """Increment and return the next sequential run_id for a node.""" + node_state.run_counter += 1 + return str(node_state.run_counter) + + @staticmethod + def _compute_isolation_scope_for_node( + node: BaseNode, + trigger: Trigger, + parent_ctx: Context | None, + run_id: str, + ) -> str | None: + """Decide the isolation_scope for a node about to run. + + Order of precedence: + 1. Explicit ``trigger.isolation_scope`` — set by the resume path + (``loop_state.recovered_executions[key].isolation_scope``) so a + resumed run continues in its original scope. + 2. Task-mode LlmAgent node — gets the task agent's full node_path + (``/@``) as its scope so its + multi-turn conversation is isolated from peer workflow nodes. + The full path (not just ``@``) is required so + scopes stay unique across nested workflows or re-used node + names in different graph positions. + 3. Otherwise unscoped — workflow nodes share the workflow's + conversation view by default. + + Note: FC-driven task delegations (chat coordinator → task agent + via ``ctx.run_node``) take a different path and set + ``override_isolation_scope=fc.id`` directly on the NodeRunner. + """ + if trigger.isolation_scope is not None: + return trigger.isolation_scope + if getattr(node, 'mode', None) == 'task': + parent_path = parent_ctx.node_path if parent_ctx else '' + segment = f'{node.name}@{run_id}' + return f'{parent_path}/{segment}' if parent_path else segment + return None + + @classmethod + def _create_node_state_for_new_run(cls, old_state: NodeState) -> NodeState: + """Create a fresh NodeState for a new run, preserving the run counter.""" + return NodeState(run_counter=old_state.run_counter) + + def _prepare_node_state_for_starting( + self, loop_state: _LoopState, node_name: str, trigger: Trigger + ) -> None: + """Prepare NodeState for starting a node. + + This method determines whether to reuse or recreate the node's state: + * Creates a brand new `NodeState` if none exists. + * Creates a fresh `NodeState` (preserving `run_counter`) if this is a new execution + (not resuming and not waiting) to avoid state carryover. + * Reuses the existing `NodeState` if resuming from interrupt or waiting for inputs. + + Outcome: The node's state is updated with the trigger's input and source, + and its status is set to `RUNNING`. + """ + if node_name not in loop_state.nodes: + node_state = NodeState() + loop_state.nodes[node_name] = node_state + else: + node_state = loop_state.nodes[node_name] + # Create a new NodeState for a fresh execution to avoid carryover bugs. + node_state = self._create_node_state_for_new_run(node_state) + loop_state.nodes[node_name] = node_state + + node_state.input = trigger.input + node_state.status = NodeStatus.RUNNING + + def _start_node_task( + self, + loop_state: _LoopState, + ctx: Context, + node_name: str, + trigger: Trigger, + ) -> None: + """Create NodeRunner and start asyncio task for a node.""" + from ..agents.context import Context + + assert self.graph is not None + + node = self._get_static_node_by_name(node_name) + is_terminal = node_name in self.graph._terminal_node_names + + node_state = loop_state.nodes[node_name] + # Reuse run_id on resume; assign a new sequential id for fresh runs. + run_id = node_state.run_id + if not run_id: + run_id = self._next_run_id(node_state) + node_state.run_id = run_id + + # Intercept execution based on historical session events. + key = f'{node_name}@{run_id}' + if key in loop_state.recovered_executions: + recovered = loop_state.recovered_executions[key] + + result = check_interception( + node_path=f'{ctx.node_path}/{node_name}@{run_id}', + node=node, + recovered=recovered, + curr_parent_ctx=ctx, + ) + + if not result.should_run: + is_terminal = node_name in self.graph._terminal_node_names + ancestor_path = ctx.node_path if is_terminal else None + + if ancestor_path: + ancestors = [ancestor_path] + list(ctx._output_for_ancestors or []) + else: + ancestors = list(ctx._output_for_ancestors or []) + + mock_ctx = create_mock_context( + parent_ctx=ctx, + node=node, + run_id=run_id, + result=result, + ancestors=ancestors, + branch=recovered.branch, + ) + + async def return_ctx(): + if loop_state.sequence_barrier: + await loop_state.sequence_barrier.wait(key) + return mock_ctx + + loop_state.pending_tasks[node_name] = asyncio.create_task(return_ctx()) + return + + node_state.resume_inputs = result.resume_inputs or {} + + # when re-running a node from replay, prefer the + # recovered isolation_scope so the resumed run continues in its + # original scope (rather than computing a fresh wf:). + if ( + key in loop_state.recovered_executions + and loop_state.recovered_executions[key].isolation_scope + and trigger.isolation_scope is None + ): + trigger.isolation_scope = loop_state.recovered_executions[ + key + ].isolation_scope + + runner = NodeRunner( + node=node, + parent_ctx=ctx, + run_id=run_id, + use_as_output=is_terminal, + use_sub_branch=trigger.use_sub_branch, + override_branch=trigger.branch, + override_isolation_scope=self._compute_isolation_scope_for_node( + node, trigger, ctx, run_id + ), + ) + resume_inputs = ( + dict(node_state.resume_inputs) if node_state.resume_inputs else None + ) + loop_state.pending_tasks[node_name] = asyncio.create_task( + runner.run(node_input=trigger.input, resume_inputs=resume_inputs) + ) + + def _make_schedule_dynamic_node( + self, loop_state: _LoopState + ) -> ScheduleDynamicNode: + """Create a DynamicNodeScheduler for this Workflow's loop state.""" + return DynamicNodeScheduler(state=loop_state) + + # --- Completion handling --- + + def _handle_completion( + self, + loop_state: _LoopState, + node_name: str, + node: BaseNode, + child_ctx: Context, + ) -> None: + """Update state and trigger downstream after node completes.""" + node_state = loop_state.nodes[node_name] + + if child_ctx.interrupt_ids: + node_state.status = NodeStatus.WAITING + node_state.interrupts = list(child_ctx.interrupt_ids) + loop_state.interrupt_ids.update(child_ctx.interrupt_ids) + return + + if node.wait_for_output and child_ctx.output is None: + node_state.status = NodeStatus.WAITING + return + + node_state.status = NodeStatus.COMPLETED + if node_state.resume_inputs: + node_state.resume_inputs.clear() + if child_ctx.output is not None: + loop_state.node_outputs[node_name] = child_ctx.output + loop_state.node_branches[node_name] = ( + child_ctx._invocation_context.branch or '' + ) + + # Buffer downstream triggers. + self._buffer_downstream_triggers( + loop_state, + node_name, + child_ctx.output, + child_ctx.route, + child_ctx._invocation_context.branch, + ) + + def _buffer_downstream_triggers( + self, + loop_state: _LoopState, + node_name: str, + output: Any, + route: Any, + branch: str | None = None, + ) -> None: + """Find downstream edges and add triggers to the buffer.""" + assert self.graph is not None + next_nodes = self.graph.get_next_pending_nodes( + node_name=node_name, + routes_to_match=route, + ) + use_sub_branch = len(next_nodes) > 1 + for target_name in next_nodes: + target_node = self._get_static_node_by_name(target_name) + target_state = loop_state.nodes.get(target_name) + + if target_node._requires_all_predecessors: + # Wait for all predecessors + predecessors = { + e.from_node.name + for e in self.graph.edges + if e.to_node.name == target_name + } + if all( + loop_state.nodes.get(p) + and loop_state.nodes[p].status == NodeStatus.COMPLETED + for p in predecessors + ): + # All predecessors have completed! + outputs = {p: loop_state.node_outputs.get(p) for p in predecessors} + branches = [loop_state.node_branches.get(p, '') for p in predecessors] + common_branch = get_common_branch_prefix(branches) + + loop_state.trigger_buffer.setdefault(target_name, []).append( + Trigger( + input=outputs, + use_sub_branch=False, + branch=common_branch, + ) + ) + else: + # Normal node logic + loop_state.trigger_buffer.setdefault(target_name, []).append( + Trigger( + input=output, + use_sub_branch=use_sub_branch, + branch=branch, + ) + ) + + def _collect_remaining_interrupts(self, loop_state: _LoopState) -> None: + """Gather interrupt_ids from nodes still WAITING after the loop.""" + for node_state in loop_state.nodes.values(): + if node_state.status == NodeStatus.WAITING and node_state.interrupts: + loop_state.interrupt_ids.update(node_state.interrupts) + + # --- Resume --- + + def _scan_child_events( + self, ctx: Context + ) -> tuple[dict[str, _ChildScanState], list[str]]: + """Scan session events and collect per-child state and completion sequence. + + Forward pass through events for this invocation. For each direct + child, tracks the latest run_id and accumulates output, + interrupt IDs, and resolved interrupt IDs. + + Returns: + Tuple of: + - dict of child_name → _ChildScanState. + - list of child_name@run_id in chronological order of completion. + """ + ic = ctx._invocation_context + raw_results = _reconstruct_node_states( + events=ic.session.events, + base_path=ctx.node_path, + group_by_direct_child=True, + invocation_id=ic.invocation_id, + ) + + from ..events._node_path_builder import _NodePathBuilder + + # Build chronological sequence of completions + sequence: list[str] = [] + base_path_builder = _NodePathBuilder.from_string(ctx.node_path) + + for event in ic.session.events: + if event.invocation_id != ic.invocation_id: + continue + + event_node_path = event.node_info.path or '' + event_path_builder = _NodePathBuilder.from_string(event_node_path) + + if not event_path_builder.is_descendant_of(base_path_builder): + continue + + child_path = base_path_builder.get_direct_child(event_path_builder) + segment: str = child_path.leaf_segment + + if is_terminal_event(event): + # Maintain unique segments ordered by their LAST terminal event. + # If a node interrupts in turn 1 and completes in turn 2, moving it + # to the end ensures we record the order of its final completion. + if segment in sequence: + sequence.remove(segment) + sequence.append(segment) + + return raw_results, sequence + + # --- FINALIZE --- + + def _finalize(self, loop_state: _LoopState, ctx: Context) -> None: + """Set interrupt_ids or terminal output on ctx. + + If any child interrupted, propagate their interrupt IDs to ctx + so the parent orchestrator sees them. Otherwise, set the terminal + node's output on ctx so the parent can read it. + """ + if loop_state.interrupt_ids: + ctx._interrupt_ids = set(loop_state.interrupt_ids) + return + + # Set terminal output on ctx so parent reads ctx.output. + # Terminal nodes = no outgoing edges. + assert self.graph is not None + terminal_outputs = [ + loop_state.node_outputs[name] + for name in self.graph._terminal_node_names + if name in loop_state.node_outputs + ] + if len(terminal_outputs) == 1: + ctx.output = self._validate_output_data(terminal_outputs[0]) + elif terminal_outputs: + raise ValueError( + f'Workflow {self.name}: multiple terminal nodes produced' + f' output ({len(terminal_outputs)}). A workflow must have' + ' at most one terminal output.' + ) + + # --- Utilities --- + + def _has_terminal_output(self, loop_state: _LoopState) -> bool: + """Check if any terminal node produced output.""" + assert self.graph is not None + return any( + name in loop_state.node_outputs + for name in self.graph._terminal_node_names + ) + + def _get_static_node_by_name(self, name: str) -> BaseNode: + """Find a node in the graph by name.""" + assert self.graph is not None + for node in self.graph.nodes: + if node.name == name: + return node + raise ValueError(f'Node {name} not found in graph.') + + def _pop_completed_task( + self, loop_state: _LoopState, task: asyncio.Task[Context] + ) -> str: + """Remove a completed task and return its node name.""" + for name, t in loop_state.pending_tasks.items(): + if t is task: + del loop_state.pending_tasks[name] + return name + raise ValueError('Task not found in pending_tasks.') + + async def _cleanup_all_tasks(self, loop_state: _LoopState) -> None: + """Cancel remaining tasks to prevent leaks.""" + dynamic_tasks = loop_state.get_dynamic_tasks() + + all_tasks = list(loop_state.pending_tasks.values()) + dynamic_tasks + if all_tasks: + logger.warning( + 'Workflow %s: cancelling %d leftover tasks.', + self.name, + len(all_tasks), + ) + for task in all_tasks: + if not task.done(): + task.cancel() + if all_tasks: + await asyncio.gather(*all_tasks, return_exceptions=True) + for task in all_tasks: + if task.cancelled(): + # Mark static nodes as CANCELLED + for name, t in loop_state.pending_tasks.items(): + if t is task: + loop_state.nodes[name].status = NodeStatus.CANCELLED + break + # Mark dynamic nodes as CANCELLED + for _, run in loop_state.runs.items(): + if run.task is task: + run.state.status = NodeStatus.CANCELLED + break diff --git a/src/google/adk/workflow/utils/__init__.py b/src/google/adk/workflow/utils/__init__.py new file mode 100644 index 0000000000..58d482ea38 --- /dev/null +++ b/src/google/adk/workflow/utils/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/google/adk/workflow/utils/_rehydration_utils.py b/src/google/adk/workflow/utils/_rehydration_utils.py new file mode 100644 index 0000000000..0e84e98e01 --- /dev/null +++ b/src/google/adk/workflow/utils/_rehydration_utils.py @@ -0,0 +1,331 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utilities for ADK workflow rehydration.""" + +from __future__ import annotations + +import asyncio +from dataclasses import dataclass +from dataclasses import field +import json +from typing import Any + +from pydantic import TypeAdapter +from pydantic import ValidationError + +from ...events._node_path_builder import _NodePathBuilder +from ...events.event import Event +from ._workflow_hitl_utils import REQUEST_INPUT_FUNCTION_CALL_NAME + +_RESULT_KEY = 'result' + + +@dataclass +class _ChildScanState: + """State accumulated for a child node during event scanning.""" + + run_id: str | None = None + output: Any = None + route: str | None = None + branch: str | None = None + isolation_scope: str | None = None + transfer_to_agent: str | None = None + interrupt_ids: set[str] = field(default_factory=set) + resolved_ids: set[str] = field(default_factory=set) + resolved_responses: dict[str, Any] = field(default_factory=dict) + + +def _wrap_response(value: Any) -> dict[str, Any]: + """Wraps a value into a dict suitable for FunctionResponse.response. + + If the value is already a dict, returns it as-is. + Otherwise wraps as ``{"result": value}``. + """ + if isinstance(value, dict): + return value + return {_RESULT_KEY: value} + + +def _unwrap_response(data: Any) -> Any: + """Unwraps a FunctionResponse dict to the original value. + + If ``data`` is a dict with exactly one key ``"result"``, extracts the + value. String values are JSON-parsed when possible (the web frontend + wraps user text as ``{"result": text}`` without parsing). + + Otherwise returns ``data`` unchanged. + """ + if isinstance(data, dict) and len(data) == 1 and _RESULT_KEY in data: + value = data[_RESULT_KEY] + if isinstance(value, str): + try: + value = json.loads(value) + except (json.JSONDecodeError, ValueError): + pass + return value + return value + return data + + +def _extract_schema_from_event(event: Event, interrupt_id: str) -> Any | None: + """Extracts the response schema from an event if it's a RequestInput call.""" + if not event.content or not event.content.parts: + return None + + for part in event.content.parts: + fc = part.function_call + if ( + fc + and fc.name == REQUEST_INPUT_FUNCTION_CALL_NAME + and fc.id == interrupt_id + ): + return fc.args.get('response_schema') + + return None + + +def _validate_resume_response(response_data: Any, schema: Any) -> Any: + """Validates and coerces resume response data against a schema. + + Args: + response_data: The data to validate. + schema: The schema to validate against (Python type, GenericAlias, or raw + JSON Schema dict). + + Returns: + The validated and coerced data. + """ + if schema is None: + return response_data + + # If it's a JSON Schema dict, map type to Python type for TypeAdapter + if isinstance(schema, dict): + type_str = schema.get('type') + + type_mapping = { + 'integer': int, + 'number': float, + 'string': str, + 'boolean': bool, + 'array': list, + 'object': dict, + } + + # Special handling for object schemas with properties + if type_str == 'object' and 'properties' in schema: + from pydantic import create_model + + properties = schema['properties'] + required = schema.get('required', []) + + fields = {} + for prop_name, prop_schema in properties.items(): + prop_type_str = prop_schema.get('type') + prop_type = ( + type_mapping.get(prop_type_str, Any) if prop_type_str else Any + ) + + if prop_name in required: + fields[prop_name] = (prop_type, ...) + else: + fields[prop_name] = ( + prop_type | None, + None, + ) # type: ignore[assignment] + + try: + DynamicModel = create_model('DynamicModel', **fields) # pylint: disable=invalid-name + # Validate and return as dict + model_instance = TypeAdapter(DynamicModel).validate_python( + response_data + ) + return model_instance.model_dump() + except ValidationError as e: + raise ValueError(f'Validation failed for object schema: {e}') from e + + mapped_type = type_mapping.get(type_str) if type_str else None + if mapped_type: + try: + return TypeAdapter(mapped_type).validate_python(response_data) + except ValidationError as e: + raise ValueError(f'Failed to coerce data to {type_str}: {e}') from e + + # Fallback: skip validation for complex schemas (similar to base node) + return response_data + + # For Python types and Pydantic models, use TypeAdapter directly + try: + return TypeAdapter(schema).validate_python(response_data) + except ValidationError as e: + raise ValueError(f'Validation failed against schema: {e}') from e + + +def _reconstruct_node_states( + events: list[Event], + base_path: str, + invocation_id: str, + group_by_direct_child: bool = False, +) -> dict[str, _ChildScanState]: + """Scans session events to reconstruct node states for resume.""" + scan_states: dict[str, _ChildScanState] = {} + interrupt_owner: dict[str, str] = {} + schemas_by_id: dict[str, Any] = {} + + base_path_builder = _NodePathBuilder.from_string(base_path) + + def get_owner_key(event_path_builder: _NodePathBuilder) -> str | None: + if group_by_direct_child: + if not event_path_builder.is_descendant_of(base_path_builder): + return None + child_path = base_path_builder.get_direct_child(event_path_builder) + return child_path.leaf_segment + else: + if ( + event_path_builder == base_path_builder + or event_path_builder.is_descendant_of(base_path_builder) + ): + return base_path + return None + + for event in events: + if invocation_id and event.invocation_id != invocation_id: + continue + + # 1. Handle FunctionResponse (User responses to interrupts) + if event.author == 'user' and event.content and event.content.parts: + for part in event.content.parts: + fr = part.function_response + if fr and fr.id and fr.id in interrupt_owner: + owner = interrupt_owner[fr.id] + if owner not in scan_states: + scan_states[owner] = _ChildScanState() + scan_states[owner].resolved_ids.add(fr.id) + response_data = _unwrap_response(fr.response) + + schema = schemas_by_id.get(fr.id) + if schema: + try: + response_data = _validate_resume_response(response_data, schema) + except ValueError as e: + raise ValueError( + f'Validation failed for interrupt {fr.id}: {e}' + ) from e + + scan_states[owner].resolved_responses[fr.id] = response_data + continue + + # 2. Match events under base_path + event_node_path = event.node_info.path or '' + event_path_builder = _NodePathBuilder.from_string(event_node_path) + owner_key = get_owner_key(event_path_builder) + + if not owner_key: + continue + + # 3. Initialize state for the owner if needed + if owner_key not in scan_states: + owner_path_builder = _NodePathBuilder.from_string(owner_key) + scan_states[owner_key] = _ChildScanState(run_id=owner_path_builder.run_id) + + child = scan_states[owner_key] + if event.isolation_scope: + child.isolation_scope = event.isolation_scope + + # 4. Determine if event is direct child or delegated output + is_direct = False + if group_by_direct_child: + is_direct = event_path_builder.is_direct_child_of(base_path_builder) + else: + is_direct = event_path_builder == base_path_builder + + has_output = event.output is not None + use_message_as_output = False + if ( + not has_output + and event.node_info + and event.node_info.message_as_output + and event.content is not None + ): + has_output = True + use_message_as_output = True + + is_delegated = False + if has_output and event.node_info.output_for: + if not group_by_direct_child: + is_delegated = base_path in event.node_info.output_for + else: + owner_full_path = str(base_path_builder.append(owner_key)) + is_delegated = owner_full_path in event.node_info.output_for + + # 5. Extract output and route + if is_direct or is_delegated: + if event.output is not None: + child.output = event.output + child.branch = event.branch + elif use_message_as_output: + child.output = event.content + if event.actions and event.actions.route is not None: + child.route = event.actions.route + if event.actions and event.actions.transfer_to_agent is not None: + child.transfer_to_agent = event.actions.transfer_to_agent + + # 6. Extract interrupts and their schemas + # Modern events explicitly set long_running_tool_ids. + interrupt_ids_to_process = set(event.long_running_tool_ids or []) + + # Fallback for older session JSONs where RequestInput/Auth events were exported + # without populating long_running_tool_ids. We extract the IDs directly from the function calls. + from ._workflow_hitl_utils import get_request_input_interrupt_ids + + interrupt_ids_to_process.update(get_request_input_interrupt_ids(event)) + + if interrupt_ids_to_process: + for interrupt_id in interrupt_ids_to_process: + child.interrupt_ids.add(interrupt_id) + interrupt_owner[interrupt_id] = owner_key + + schema_json = _extract_schema_from_event(event, interrupt_id) + if schema_json: + schemas_by_id[interrupt_id] = schema_json + + return scan_states + + +def is_terminal_event(event: Event) -> bool: + """Determines if an event represents a terminal execution outcome (output, route, error, or interrupt).""" + if event.output is not None: + return True + if ( + event.node_info + and event.node_info.message_as_output + and event.content is not None + ): + return True + if event.actions and event.actions.route is not None: + return True + if event.long_running_tool_ids: + return True + if event.error_code is not None: + return True + + from ._workflow_hitl_utils import has_auth_request_function_call + from ._workflow_hitl_utils import has_request_input_function_call + + if has_request_input_function_call(event) or has_auth_request_function_call( + event + ): + return True + + return False diff --git a/src/google/adk/workflow/utils/_replay_interceptor.py b/src/google/adk/workflow/utils/_replay_interceptor.py new file mode 100644 index 0000000000..5c424ac17a --- /dev/null +++ b/src/google/adk/workflow/utils/_replay_interceptor.py @@ -0,0 +1,194 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Replay interceptor for workflow rehydration.""" + +from __future__ import annotations + +import asyncio +from dataclasses import dataclass +from dataclasses import field +from typing import Any +from typing import TYPE_CHECKING + +from ...agents.context import Context +from .._base_node import BaseNode +from .._node_state import NodeState +from .._node_status import NodeStatus +from ._rehydration_utils import _ChildScanState + +if TYPE_CHECKING: + from .._dynamic_node_scheduler import DynamicNodeRun + + +@dataclass(kw_only=True) +class InterceptionResult: + """Result of replay interception check.""" + + should_run: bool + """Whether the node should be executed natively.""" + + output: Any = None + """The cached output to fast-forward or auto-complete with.""" + + route: Any = None + """The cached route to fast-forward with.""" + + interrupts: set[str] = field(default_factory=set) + """Unresolved interrupts if the node should stay WAITING.""" + + resume_inputs: dict[str, Any] | None = None + """Resolved responses to feed into the node if it is rerun.""" + + transfer_to_agent: str | None = None + """Target agent name if fast-forwarding same-turn transfer.""" + + +def check_interception( + *, + node_path: str, + node: BaseNode, + recovered: _ChildScanState | None = None, + current_run: DynamicNodeRun | None = None, + curr_parent_ctx: Context, +) -> InterceptionResult: + """Determine if a node execution should be intercepted based on history.""" + from .._workflow import Workflow # pylint: disable=g-import-not-at-top + + # Case 1: Same-turn completed or waiting interception (dynamic nodes only). + # If a node already successfully executed or is currently blocked in the + # current turn, bypass execution and return its current turn results. + if current_run: + if current_run.state.status == NodeStatus.COMPLETED: + return InterceptionResult( + should_run=False, + output=current_run.output, + transfer_to_agent=current_run.transfer_to_agent, + ) + if current_run.state.status == NodeStatus.WAITING: + if current_run.state.interrupts: + return InterceptionResult( + should_run=False, + interrupts=set(current_run.state.interrupts), + ) + + # Intercept executions based on historical session events (cross-turn replay). + if not recovered: + return InterceptionResult(should_run=True) + + unresolved = recovered.interrupt_ids - recovered.resolved_ids + + should_run = False + output = None + route = None + interrupts = set() + resume_inputs = None + + if unresolved: + # Case 2: Cross-turn unresolved interrupts remain. + # Rerun natively with resolved inputs if the node supports rerun and some + # progress was made; otherwise remain waiting and bubble unresolved interrupts. + if node.rerun_on_resume and recovered.resolved_ids: + should_run = True + resume_inputs = recovered.resolved_responses + else: + interrupts = unresolved + + elif ( + recovered.route is not None + or recovered.output is not None + or recovered.transfer_to_agent is not None + ): + # Case 3: Cross-turn successfully completed in a prior turn (fast-forward). + # Bypass execution completely and return the cached output and route. + output = recovered.output + route = recovered.route + + elif recovered.interrupt_ids: + # Case 4: Cross-turn all prior interrupts are resolved, but no output yet. + # Extract responses directly if the node does not support rerun; otherwise + # rerun natively with resolved responses to produce output. + if not node.rerun_on_resume: + child_resume_inputs = recovered.resolved_responses + if len(child_resume_inputs) == 1: + output = list(child_resume_inputs.values())[0] + else: + output = dict(child_resume_inputs) + else: + should_run = True + resume_inputs = recovered.resolved_responses + + else: + # Case 5: Cross-turn no events, or events contain no output, route, or interrupts. + # Rerun Workflow nodes to guide nested children; otherwise fall through. + if ( + isinstance(node, Workflow) + and node.wait_for_output + and recovered.output is None + ): + should_run = True + resume_inputs = recovered.resolved_responses + else: + # Allow fresh execution for crashed/timeout dynamic nodes; + # static nodes with no outcome (e.g. return None) should be fast-forwarded. + if current_run is not None: + should_run = True + else: + should_run = False + + return InterceptionResult( + should_run=should_run, + output=output, + route=route, + interrupts=interrupts, + resume_inputs=resume_inputs, + transfer_to_agent=recovered.transfer_to_agent if recovered else None, + ) + + +def create_mock_context( + *, + parent_ctx: Context, + node: BaseNode, + run_id: str, + result: InterceptionResult, + ancestors: list[str], + node_path: str | None = None, + branch: str | None = None, +) -> Context: + """Build a Context with cached results (no execution).""" + ic = parent_ctx._invocation_context # pylint: disable=protected-access + if branch: + ic = ic.model_copy(update={"branch": branch}) + + mock_ctx = Context( + ic, + parent_ctx=parent_ctx, + node=node, + run_id=run_id, + node_path=node_path, + ) + mock_ctx._output_for_ancestors = ancestors # pylint: disable=protected-access + + if result.output is not None: + mock_ctx._output_value = result.output # pylint: disable=protected-access + mock_ctx._output_emitted = True # pylint: disable=protected-access + + if result.transfer_to_agent is not None: + mock_ctx.actions.transfer_to_agent = result.transfer_to_agent + + mock_ctx.route = result.route + mock_ctx._interrupt_ids = result.interrupts # pylint: disable=protected-access + + return mock_ctx diff --git a/src/google/adk/workflow/utils/_replay_sequence_barrier.py b/src/google/adk/workflow/utils/_replay_sequence_barrier.py new file mode 100644 index 0000000000..530d126d44 --- /dev/null +++ b/src/google/adk/workflow/utils/_replay_sequence_barrier.py @@ -0,0 +1,50 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Chronological sequence barrier for deterministic replay ordering.""" + +from __future__ import annotations + +import asyncio + + +class ReplaySequenceBarrier: + """Unified chronological sequence barrier to ensure deterministic replay ordering.""" + + def __init__(self, sequence: list[str]) -> None: + self.sequence = sequence + self.current_index = 0 + self.events = {key: asyncio.Event() for key in sequence} + if sequence: + self.events[sequence[0]].set() + + async def wait(self, key: str) -> None: + """Wait for the barrier if the key is part of the expected chronological sequence. + + Only wait if the node had a terminal event (output, route, or interrupt). + "Silent" nodes that only yielded state updates but didn't produce + output are not in the sequence barrier, so they fast-forward immediately. + """ + if key in self.events: + await self.events[key].wait() + + def check_and_advance(self, key: str) -> None: + """Advance the sequence if the key matches the current expected execution.""" + if self.current_index < len(self.sequence): + expected_key = self.sequence[self.current_index] + if key == expected_key: + self.current_index += 1 + if self.current_index < len(self.sequence): + next_key = self.sequence[self.current_index] + self.events[next_key].set() diff --git a/src/google/adk/workflow/utils/_retry_utils.py b/src/google/adk/workflow/utils/_retry_utils.py new file mode 100644 index 0000000000..5a220dd261 --- /dev/null +++ b/src/google/adk/workflow/utils/_retry_utils.py @@ -0,0 +1,86 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +"""Utility functions for retrying nodes in a workflow.""" + +import random + +from .._node_state import NodeState +from .._retry_config import RetryConfig + + +def _should_retry_node( + exception: BaseException, + retry_config: RetryConfig | None, + node_state: NodeState, +) -> bool: + """Checks if a failed node should be retried based on its retry_config.""" + if not retry_config: + return False + + attempt_count = node_state.attempt_count + max_attempts = retry_config.max_attempts or 5 + + # attempt_count starts at 1 for the original request. + # So if attempt_count >= max_attempts, we have reached the limit. + if attempt_count >= max_attempts: + return False + + if retry_config.exceptions is not None: + ex_name = type(exception).__name__ + if ex_name not in retry_config.exceptions: + return False + + return True + + +def _get_retry_delay( + retry_config: RetryConfig | None, + node_state: NodeState, +) -> float: + """Calculates the delay before retrying a node.""" + # Default delay is 1.0 second. + if not retry_config: + return 1.0 + + initial_delay = ( + retry_config.initial_delay + if retry_config.initial_delay is not None + else 1.0 + ) + max_delay = ( + retry_config.max_delay if retry_config.max_delay is not None else 60.0 + ) + backoff_factor = ( + retry_config.backoff_factor + if retry_config.backoff_factor is not None + else 2.0 + ) + jitter = retry_config.jitter if retry_config.jitter is not None else 1.0 + + attempt_count = node_state.attempt_count or 1 + # attempt_count is the attempt number that just failed (1-based). + # For the first failure (attempt 1), the exponent should be 0. + attempt_for_calc = max(0, attempt_count - 1) + + delay = initial_delay * (backoff_factor**attempt_for_calc) + delay = min(delay, max_delay) + + if jitter > 0.0: + random_offset = random.uniform(-jitter * delay, jitter * delay) + delay = max(0.0, delay + random_offset) + + return delay diff --git a/src/google/adk/workflow/utils/_transfer_utils.py b/src/google/adk/workflow/utils/_transfer_utils.py new file mode 100644 index 0000000000..178492b16d --- /dev/null +++ b/src/google/adk/workflow/utils/_transfer_utils.py @@ -0,0 +1,92 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utilities for agent transfer in ADK workflow.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ...agents.base_agent import BaseAgent + from ...agents.context import Context + + +def resolve_and_derive_transfer_context( + target_name: str, + current_agent: BaseAgent, + root_agent: BaseAgent, + curr_ctx: Context, + curr_parent_ctx: Context | None, +) -> tuple[BaseAgent, Context | None] | tuple[None, None]: + """Resolves the target agent and derives its parent context in a single pass. + + Args: + target_name: The name of the target agent to transfer to. + current_agent: The agent initiating the transfer. + root_agent: The root agent of the application. + curr_ctx: The current execution context of the current_agent. + curr_parent_ctx: The parent context of the current_agent. + + Returns: + A tuple of (target_agent, next_parent_context) or (None, None) if target not + found. If target is found but cannot be logically routed (unrelated transfer), + returns (target_agent, None). + + Raises: + ValueError: If target_agent is the same as current_agent. + """ + target_agent = root_agent.find_agent(target_name) + if not target_agent: + return None, None + + # Case 1: SELF (invalid transfer target) + if target_agent.name == current_agent.name: + raise ValueError(f"Agent '{target_name}' cannot transfer to itself.") + + # Case 2: Direct CHILD (nests deeper under the current context) + if ( + target_agent.parent_agent + and target_agent.parent_agent.name == current_agent.name + ): + return target_agent, curr_ctx + + # Case 3: SIBLING (runs under the same parent context) + if ( + target_agent.parent_agent + and current_agent.parent_agent + and target_agent.parent_agent.name == current_agent.parent_agent.name + ): + return target_agent, curr_parent_ctx + + # Case 4: Direct PARENT (climbs up the context chain to find the parent's parent) + if ( + current_agent.parent_agent + and current_agent.parent_agent.name == target_agent.name + ): + # Walk up the context chain to find the target parent agent's context + curr = curr_ctx + while curr is not None and curr.node is not None: + if curr.node.name == target_name: + return target_agent, curr.parent_ctx + curr = curr.parent_ctx + + # Root Coordinator / Bypassed parent fallback: returns the outermost root context of this turn + root_ctx = curr_ctx + while root_ctx.parent_ctx is not None and root_ctx.node is not None: + root_ctx = root_ctx.parent_ctx + return target_agent, root_ctx + + # Fallback: target found but has no direct routing relationship (unrelated) + return target_agent, None diff --git a/src/google/adk/workflow/utils/_workflow_graph_utils.py b/src/google/adk/workflow/utils/_workflow_graph_utils.py new file mode 100644 index 0000000000..8cf42fc82b --- /dev/null +++ b/src/google/adk/workflow/utils/_workflow_graph_utils.py @@ -0,0 +1,130 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utility functions for building workflow graphs.""" + +from __future__ import annotations + +from typing import Any +from typing import cast + +from ...tools.base_tool import BaseTool +from .._base_node import BaseNode +from .._base_node import START +from .._function_node import FunctionNode +from .._graph import NodeLike +from .._retry_config import RetryConfig +from .._tool_node import _ToolNode + + +def is_node_like(item: Any) -> bool: + """Checks if an object is NodeLike.""" + return ( + isinstance(item, (BaseNode, BaseTool)) + or callable(item) + or item == 'START' + ) + + +def build_node( + node_like: NodeLike, + *, + name: str | None = None, + rerun_on_resume: bool | None = None, + retry_config: RetryConfig | None = None, + timeout: float | None = None, + auth_config: Any = None, +) -> BaseNode: + """Converts a NodeLike to a BaseNode, wrapping async funcs in FunctionNode. + + Args: + node_like: The item to convert to a BaseNode. + name: If provided, overrides the name of the wrapped node. + rerun_on_resume: If provided, overrides the rerun_on_resume property of the + wrapped node. + retry_config: If provided, overrides the retry_config property of the + wrapped node. + timeout: If provided, overrides the timeout property of the wrapped node. + auth_config: If provided, passed to FunctionNode for authentication. + + Returns: + A BaseNode instance. + + Raises: + ValueError: If node_like is not a valid type (BaseNode, BaseAgent, + BaseTool, callable, or 'START'). + """ + + if node_like == 'START': + return START + + # Lazy import to avoid circular dependency: + # workflow_graph_utils -> agents.llm_agent -> ... -> workflow_graph_utils + from ...agents.llm_agent import LlmAgent + + if isinstance(node_like, BaseNode): + kwargs: dict[str, Any] = {} + if name is not None: + kwargs['name'] = name + if rerun_on_resume is not None: + kwargs['rerun_on_resume'] = rerun_on_resume + if retry_config is not None: + kwargs['retry_config'] = retry_config + if timeout is not None: + kwargs['timeout'] = timeout + + if isinstance(node_like, LlmAgent): + if rerun_on_resume is None: + kwargs['rerun_on_resume'] = True + agent = node_like.clone(update=kwargs) + # Preserve parent agent reference that was lost during clone + agent.parent_agent = node_like.parent_agent + + if agent.mode is None: + agent.mode = 'single_turn' + + if agent.mode in ('task', 'chat'): + agent.wait_for_output = True + + if agent.parallel_worker: + from .._parallel_worker import _ParallelWorker + + agent.parallel_worker = False + return _ParallelWorker(node=agent) + return cast(BaseNode, agent) + else: + if kwargs: + return cast(BaseNode, node_like.model_copy(update=kwargs)) + return node_like + elif isinstance(node_like, BaseTool): + return _ToolNode( + tool=node_like, + name=name, + retry_config=retry_config, + timeout=timeout, + ) + elif callable(node_like): + return FunctionNode( + func=node_like, + name=name, + rerun_on_resume=rerun_on_resume or False, + retry_config=retry_config, + timeout=timeout, + auth_config=auth_config, + ) + else: + raise ValueError( + f'Invalid node type: {type(node_like)}. Node must be a BaseNode, a' + ' BaseAgent, a BaseTool, or a callable.' + ) diff --git a/src/google/adk/workflow/utils/_workflow_hitl_utils.py b/src/google/adk/workflow/utils/_workflow_hitl_utils.py new file mode 100644 index 0000000000..be718b5e89 --- /dev/null +++ b/src/google/adk/workflow/utils/_workflow_hitl_utils.py @@ -0,0 +1,261 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utility functions for Human-in-the-Loop (HITL) workflows.""" + +from __future__ import annotations + +"""Utilities for ADK workflows.""" + +from collections.abc import Mapping +from typing import Any +from typing import TYPE_CHECKING + +from google.genai import types +from pydantic import ValidationError + +from ...auth.auth_credential import AuthCredentialTypes as _AuthCredentialTypes +from ...auth.auth_handler import AuthHandler +from ...auth.auth_tool import AuthConfig +from ...auth.auth_tool import AuthToolArguments +from ...events._node_path_builder import _NodePathBuilder +from ...events.event import Event +from ...events.request_input import RequestInput +from ...utils._schema_utils import schema_to_json_schema + +if TYPE_CHECKING: + from ...auth.auth_credential import AuthCredential + from ...sessions.state import State + +REQUEST_INPUT_FUNCTION_CALL_NAME = 'adk_request_input' +REQUEST_CREDENTIAL_FUNCTION_CALL_NAME = 'adk_request_credential' + +_RESULT_KEY = 'result' +"""Key used to wrap non-dict values in a FunctionResponse dict.""" + + +def create_request_input_event(request_input: RequestInput) -> Event: + """Creates a RequestInput event from a RequestInput object.""" + args = request_input.model_dump(exclude={'response_schema'}, by_alias=True) + args['response_schema'] = ( + schema_to_json_schema(request_input.response_schema) + if request_input.response_schema is not None + else None + ) + return Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name=REQUEST_INPUT_FUNCTION_CALL_NAME, + args=args, + id=request_input.interrupt_id, + ) + ) + ] + ), + long_running_tool_ids=[request_input.interrupt_id], + ) + + +def has_request_input_function_call(event: Event) -> bool: + """Checks if an event contains a `request_input` function call.""" + if not (event.content and event.content.parts): + return False + return any( + p.function_call + and p.function_call.name == REQUEST_INPUT_FUNCTION_CALL_NAME + for p in event.content.parts + ) + + +def has_auth_request_function_call(event: Event) -> bool: + """Checks if an event contains an `adk_request_credential` function call.""" + if not (event.content and event.content.parts): + return False + return any( + p.function_call + and p.function_call.name == REQUEST_CREDENTIAL_FUNCTION_CALL_NAME + for p in event.content.parts + ) + + +def create_request_input_response( + interrupt_id: str, + response: Mapping[str, Any], +) -> types.Part: + """Creates a FunctionResponse part in response to a `request_input` function call. + + Args: + interrupt_id: The interrupt_id from an event containing a `request_input` + function call. + response: The response data to send back. + + Returns: + A types.Part containing the FunctionResponse. + """ + return types.Part( + function_response=types.FunctionResponse( + id=interrupt_id, + name=REQUEST_INPUT_FUNCTION_CALL_NAME, + response=response, + ) + ) + + +def get_request_input_interrupt_ids(event: Event) -> list[str]: + """Extracts interrupt_ids from an event containing `request_input` function + calls. + """ + interrupt_ids: list[str] = [] + if not event.content or not event.content.parts: + return interrupt_ids + for part in event.content.parts: + if ( + part.function_call + and part.function_call.name == REQUEST_INPUT_FUNCTION_CALL_NAME + ): + interrupt_ids.append(part.function_call.id) + return interrupt_ids + + +# --------------------------------------------------------------------------- +# Auth credential utilities +# --------------------------------------------------------------------------- + + +def _build_auth_message(auth_config: AuthConfig) -> str: + """Builds a human-readable message describing what credential is needed.""" + raw_cred = auth_config.raw_auth_credential + if not raw_cred: + return 'Please provide your authentication credentials.' + + auth_type = raw_cred.auth_type + if auth_type == _AuthCredentialTypes.API_KEY: + name = getattr(auth_config.auth_scheme, 'name', 'API key') + return f'Please provide your API key for {name}.' + elif auth_type in ( + _AuthCredentialTypes.OAUTH2, + _AuthCredentialTypes.OPEN_ID_CONNECT, + ): + return 'Please complete the authentication flow.' + + return 'Please provide your authentication credentials.' + + +def create_auth_request_event( + auth_config: AuthConfig, + interrupt_id: str, +) -> Event: + """Creates an event requesting user authentication credentials. + + Args: + auth_config: The auth configuration for the node. + interrupt_id: The interrupt ID for this auth request. + + Returns: + An Event containing an ``adk_request_credential`` function call. + """ + auth_handler = AuthHandler(auth_config) + auth_request = auth_handler.generate_auth_request() + args = AuthToolArguments( + function_call_id=interrupt_id, + auth_config=auth_request, + ).model_dump(exclude_none=True, by_alias=True) + + # Add message so the UI / CLI knows what to display. + args['message'] = _build_auth_message(auth_config) + + return Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name=REQUEST_CREDENTIAL_FUNCTION_CALL_NAME, + id=interrupt_id, + args=args, + ) + ) + ] + ), + long_running_tool_ids=[interrupt_id], + ) + + +def _build_credential_from_value( + auth_config: AuthConfig, + value: Any, +) -> 'AuthCredential': + """Builds an AuthCredential from a raw user-provided value. + + For API_KEY, the value is used as the key string directly. + For all other types, the value is parsed as an AuthCredential dict. + """ + from ...auth.auth_credential import AuthCredential + + raw_cred = auth_config.raw_auth_credential + if raw_cred is None: + return AuthCredential.model_validate(value) + + if raw_cred.auth_type == _AuthCredentialTypes.API_KEY: + return AuthCredential( + auth_type=_AuthCredentialTypes.API_KEY, + api_key=str(value), + ) + + return AuthCredential.model_validate(value) + + +async def process_auth_resume( + response_data: Any, + auth_config: AuthConfig, + state: State, +) -> None: + """Stores credentials from an auth resume response into session state. + + Accepts multiple response formats (tried in order): + 1. A full AuthConfig dict (from web UI OAuth flow). + 2. An AuthCredential dict. + 3. A plain value (string for API key). The node's + auth_config.raw_auth_credential.auth_type determines how the + value is interpreted. + + The caller is responsible for unwrapping {"result": ...} wrappers + before calling this function. + + Args: + response_data: The unwrapped response from the client. + auth_config: The original auth configuration for the node. + state: The session state to store credentials in. + """ + try: + response_config = AuthConfig.model_validate(response_data) + except (ValidationError, TypeError): + response_config = auth_config.model_copy(deep=True) + response_config.exchanged_auth_credential = _build_credential_from_value( + auth_config, response_data + ) + + response_config.credential_key = auth_config.credential_key + await AuthHandler(auth_config=response_config).parse_and_store_auth_response( + state=state + ) + + +def has_auth_credential( + auth_config: AuthConfig, + state: State, +) -> bool: + """Returns True if a credential for the given auth config exists in state.""" + return AuthHandler(auth_config).get_auth_response(state) is not None diff --git a/tests/integration/fixture/bigquery_agent/README.md b/tests/integration/fixture/bigquery_agent/README.md index 57b580a25e..34456fb68e 100644 --- a/tests/integration/fixture/bigquery_agent/README.md +++ b/tests/integration/fixture/bigquery_agent/README.md @@ -12,7 +12,7 @@ 1. Change to the current directory: ```shell - cd third_party/py/google/adk/tests/integration/fixture/bigquery_agent/ + cd tests/integration/fixture/bigquery_agent/ ``` 1. Customize the evaluation dataset to the environment `GOOGLE_CLOUD_PROJECT` by replacing the placeholder to the real project set in your environment: @@ -47,7 +47,7 @@ 1. Change to the directory containing agent folder: ```shell - cd third_party/py/google/adk/tests/integration/fixture/ + cd tests/integration/fixture/ ``` 1. Run the following command to start the ADK web app: diff --git a/tests/integration/test_cli_run.py b/tests/integration/test_cli_run.py new file mode 100644 index 0000000000..d46cf950a1 --- /dev/null +++ b/tests/integration/test_cli_run.py @@ -0,0 +1,78 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +import os +from pathlib import Path + +from click.testing import CliRunner +from google.adk.cli import cli_tools_click +import pytest + + +def test_cli_run_integration(tmp_path: Path) -> None: + """Integration test for `adk run` with query using CliRunner (No mocks).""" + # Arrange + agent_dir = tmp_path / "dummy_agent" + agent_dir.mkdir() + + # Create __init__.py + with open(agent_dir / "__init__.py", "w") as f: + f.write("from . import agent\n") + + # Create agent.py + agent_code = """ +from google.adk.agents import Agent +from google.adk.events.event import Event +from typing import AsyncGenerator + +class DummyAgent(Agent): + async def run_async(self, ctx) -> AsyncGenerator[Event, None]: + # Yield a text response + from google.adk.events.event import Event + text = ctx.user_content.parts[0].text if ctx.user_content and ctx.user_content.parts else "No input" + yield Event(author="dummy", output=f"Echo: {text}") + +root_agent = DummyAgent(name="dummy", model="gemini-2.5-flash") +""" + with open(agent_dir / "agent.py", "w") as f: + f.write(agent_code) + + runner = CliRunner() + + # Act + result = runner.invoke( + cli_tools_click.main, + ["run", "--jsonl", str(agent_dir), "hello world"], + ) + + # Assert + assert result.exit_code == 0 + + # Check stdout + stdout = result.stdout + assert stdout, "Stdout should not be empty" + + # Parse JSONL lines + lines = stdout.strip().split("\n") + assert len(lines) > 0 + + # The last line should be the final output or event + last_line = lines[-1] + try: + data = json.loads(last_line) + assert "output" in data + assert "Echo: hello world" in data["output"] + except json.JSONDecodeError: + pytest.fail(f"Stdout contained non-JSON line: {last_line}") diff --git a/tests/unittests/agents/llm/__init__.py b/tests/unittests/agents/llm/__init__.py new file mode 100644 index 0000000000..58d482ea38 --- /dev/null +++ b/tests/unittests/agents/llm/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/unittests/agents/llm/event_utils.py b/tests/unittests/agents/llm/event_utils.py new file mode 100644 index 0000000000..ebe2743ebd --- /dev/null +++ b/tests/unittests/agents/llm/event_utils.py @@ -0,0 +1,81 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Shared test helpers for extracting data from Event lists.""" + +from __future__ import annotations + +from typing import Any + +from google.adk.events.event import Event + + +async def collect_events(node, ctx, node_input=None) -> list[Event]: + """Collect all events yielded by node.run().""" + events = [] + async for event in node.run(ctx=ctx, node_input=node_input): + events.append(event) + return events + + +def output_events(events: list[Event]) -> list[Event]: + """Filter to events that carry output.""" + return [e for e in events if e.output is not None] + + +def content_events(events: list[Event]) -> list[Event]: + """Filter to events that have content.""" + return [e for e in events if e.content and e.content.parts] + + +def text_parts(events: list[Event]) -> list[str]: + """Extract text strings from content events.""" + return [ + p.text.strip() + for e in content_events(events) + for p in e.content.parts + if p.text + ] + + +def function_call_names(events: list[Event]) -> list[str]: + """Extract function call names from content events.""" + return [ + p.function_call.name + for e in content_events(events) + for p in e.content.parts + if p.function_call + ] + + +def function_response_dicts(events: list[Event]) -> list[dict[str, Any]]: + """Extract function response dicts from events.""" + return [ + dict(p.function_response.response or {}) + for e in content_events(events) + for p in e.content.parts + if p.function_response + ] + + +def function_responses_by_name( + events: list[Event], +) -> dict[str, dict[str, Any]]: + """Extract {tool_name: response_dict} from function response events.""" + return { + p.function_response.name: dict(p.function_response.response or {}) + for e in content_events(events) + for p in e.content.parts + if p.function_response + } diff --git a/tests/unittests/agents/llm/task/__init__.py b/tests/unittests/agents/llm/task/__init__.py new file mode 100644 index 0000000000..58d482ea38 --- /dev/null +++ b/tests/unittests/agents/llm/task/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/unittests/agents/llm/task/test_finish_task_tool.py b/tests/unittests/agents/llm/task/test_finish_task_tool.py new file mode 100644 index 0000000000..9ce4025cbe --- /dev/null +++ b/tests/unittests/agents/llm/task/test_finish_task_tool.py @@ -0,0 +1,363 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for the finish_task_tool module.""" + +from __future__ import annotations + +from typing import Any +from unittest import mock + +from google.adk.agents.llm.task._finish_task_tool import FINISH_TASK_TOOL_NAME +from google.adk.agents.llm.task._finish_task_tool import FinishTaskTool +from pydantic import BaseModel +import pytest + + +class SampleOutputSchema(BaseModel): + """Sample Pydantic model for testing output schema.""" + + result: str + count: int + + +class NestedOutputSchema(BaseModel): + """Nested Pydantic model for testing complex schemas.""" + + name: str + details: dict + + +def _make_task_agent( + name='test_agent', + mode='task', + output_schema=None, +): + """Create a mock task agent for FinishTaskTool construction.""" + agent = mock.MagicMock() + agent.name = name + agent.mode = mode + agent.output_schema = output_schema + return agent + + +class TestFinishTaskTool: + """Tests for the FinishTaskTool class.""" + + def test_init_without_output_schema(self): + """Test FinishTaskTool initialization without output schema.""" + agent = _make_task_agent() + tool = FinishTaskTool(task_agent=agent) + assert tool.name == FINISH_TASK_TOOL_NAME + assert 'Signal that this agent has completed' in tool.description + assert 'output data' not in tool.description + + def test_init_with_output_schema(self): + """Test FinishTaskTool initialization with output schema.""" + agent = _make_task_agent(output_schema=SampleOutputSchema) + tool = FinishTaskTool(task_agent=agent) + assert tool.name == FINISH_TASK_TOOL_NAME + assert tool.output_schema is SampleOutputSchema + assert 'Signal that this agent has completed' in tool.description + assert 'output data' in tool.description + + def test_get_declaration_without_output_schema(self): + """Test function declaration generation without output schema.""" + agent = _make_task_agent() + tool = FinishTaskTool(task_agent=agent) + declaration = tool._get_declaration() + + assert declaration is not None + assert declaration.name == FINISH_TASK_TOOL_NAME + assert declaration.parameters_json_schema is not None + schema = declaration.parameters_json_schema + assert 'result' in schema.get('properties', {}) + + def test_get_declaration_with_output_schema(self): + """Test function declaration generation with output schema.""" + agent = _make_task_agent(output_schema=SampleOutputSchema) + tool = FinishTaskTool(task_agent=agent) + declaration = tool._get_declaration() + + assert declaration is not None + assert declaration.name == FINISH_TASK_TOOL_NAME + assert declaration.parameters_json_schema is not None + schema = declaration.parameters_json_schema + assert 'result' in schema.get('properties', {}) + assert 'count' in schema.get('properties', {}) + + @pytest.mark.asyncio + async def test_run_async_returns_confirmation(self): + """Test that run_async returns a confirmation message.""" + agent = _make_task_agent() + tool = FinishTaskTool(task_agent=agent) + mock_tool_context = mock.MagicMock() + + result = await tool.run_async( + args={'result': 'done'}, tool_context=mock_tool_context + ) + + assert result == 'Task completed.' + + @pytest.mark.asyncio + async def test_run_async_with_args(self): + """Test that run_async validates args and returns confirmation.""" + agent = _make_task_agent(output_schema=SampleOutputSchema) + tool = FinishTaskTool(task_agent=agent) + mock_tool_context = mock.MagicMock() + + result = await tool.run_async( + args={'result': 'success', 'count': 42}, + tool_context=mock_tool_context, + ) + + assert result == 'Task completed.' + + +class TestBuildInstruction: + """Tests for the _build_instruction method.""" + + def test_instruction_content(self): + """Test instruction generation contains expected content.""" + agent = _make_task_agent() + tool = FinishTaskTool(task_agent=agent) + instruction = tool._build_instruction() + + assert 'finish_task' in instruction + assert 'Do NOT call `finish_task` prematurely' in instruction + assert 'call `finish_task` by itself with' in instruction + + +class TestProcessLlmRequest: + """Tests for the process_llm_request method.""" + + @pytest.mark.asyncio + async def test_process_llm_request_adds_tool_and_instruction(self): + """Test that process_llm_request adds tool and instruction.""" + agent = _make_task_agent() + tool = FinishTaskTool(task_agent=agent) + mock_tool_context = mock.MagicMock() + mock_tool_context._invocation_context.branch = None + mock_tool_context.session.events = [] + mock_llm_request = mock.MagicMock() + mock_llm_request.append_tools = mock.MagicMock() + mock_llm_request.append_instructions = mock.MagicMock() + + await tool.process_llm_request( + tool_context=mock_tool_context, llm_request=mock_llm_request + ) + + # Should add tool via parent's process_llm_request + mock_llm_request.append_tools.assert_called_once_with([tool]) + # Should append instruction (at least the base instruction) + mock_llm_request.append_instructions.assert_called() + instruction_arg = mock_llm_request.append_instructions.call_args_list[0][0][ + 0 + ] + assert len(instruction_arg) == 1 + assert 'finish_task' in instruction_arg[0] + + +class TestFinishTaskToolName: + """Tests for the FINISH_TASK_TOOL_NAME constant.""" + + def test_constant_value(self): + """Test that the constant has the expected value.""" + assert FINISH_TASK_TOOL_NAME == 'finish_task' + + +class TestFinishTaskToolValidation: + """Tests for the FinishTaskTool argument validation.""" + + @pytest.mark.asyncio + async def test_run_async_validation_error_missing_required_field(self): + """Test that validation error is returned when required fields are missing.""" + agent = _make_task_agent(output_schema=SampleOutputSchema) + tool = FinishTaskTool(task_agent=agent) + mock_tool_context = mock.MagicMock() + + # Missing 'count' field which is required + result = await tool.run_async( + args={'result': 'success'}, + tool_context=mock_tool_context, + ) + + assert isinstance(result, dict) + assert 'error' in result + assert 'finish_task' in result['error'] + assert 'validation errors' in result['error'] + assert 'count' in result['error'] + + @pytest.mark.asyncio + async def test_run_async_validation_error_wrong_type(self): + """Test that validation error is returned when types are wrong.""" + agent = _make_task_agent(output_schema=SampleOutputSchema) + tool = FinishTaskTool(task_agent=agent) + mock_tool_context = mock.MagicMock() + + # 'count' should be int, not string + result = await tool.run_async( + args={'result': 'success', 'count': 'not_an_int'}, + tool_context=mock_tool_context, + ) + + assert isinstance(result, dict) + assert 'error' in result + assert 'validation errors' in result['error'] + + @pytest.mark.asyncio + async def test_run_async_validation_passes_with_valid_args(self): + """Test that validation passes with valid args.""" + agent = _make_task_agent(output_schema=SampleOutputSchema) + tool = FinishTaskTool(task_agent=agent) + mock_tool_context = mock.MagicMock() + + result = await tool.run_async( + args={'result': 'success', 'count': 42}, + tool_context=mock_tool_context, + ) + + assert result == 'Task completed.' + + +class TestFinishTaskToolAllSchemaTypes: + """Tests for FinishTaskTool across all supported SchemaType variants. + + Object schemas (BaseModel, dict) use parameters directly. + Non-object schemas (str, int, bool, float, list) are wrapped in a + JSON object with a 'result' key so they can be used as function + parameters. + """ + + @pytest.mark.parametrize( + 'output_schema, expected_wrapper_key', + [ + (SampleOutputSchema, None), + (dict[str, Any], None), + (str, 'result'), + (int, 'result'), + (bool, 'result'), + (float, 'result'), + (list[str], 'result'), + (list[int], 'result'), + (list[SampleOutputSchema], 'result'), + ], + ids=[ + 'BaseModel', + 'dict', + 'str', + 'int', + 'bool', + 'float', + 'list_str', + 'list_int', + 'list_BaseModel', + ], + ) + def test_wrapper_key(self, output_schema, expected_wrapper_key): + """Verify wrapper key is set correctly for each schema type.""" + agent = _make_task_agent(output_schema=output_schema) + tool = FinishTaskTool(task_agent=agent) + assert tool._wrapper_key == expected_wrapper_key + + @pytest.mark.parametrize( + 'output_schema', + [str, int, bool, float, list[str], list[int], list[SampleOutputSchema]], + ids=[ + 'str', + 'int', + 'bool', + 'float', + 'list_str', + 'list_int', + 'list_BaseModel', + ], + ) + def test_get_declaration_wrapped_schema(self, output_schema): + """Non-object schemas produce a declaration with 'result' property.""" + agent = _make_task_agent(output_schema=output_schema) + tool = FinishTaskTool(task_agent=agent) + declaration = tool._get_declaration() + + assert declaration is not None + assert declaration.name == FINISH_TASK_TOOL_NAME + schema = declaration.parameters_json_schema + assert schema is not None + assert 'result' in schema.get('properties', {}) + + @pytest.mark.parametrize( + 'output_schema, args, expected_output', + [ + ( + SampleOutputSchema, + {'result': 'done', 'count': 5}, + {'result': 'done', 'count': 5}, + ), + (dict[str, Any], {'key': 'value'}, {'key': 'value'}), + (str, {'result': 'hello'}, 'hello'), + (int, {'result': 42}, 42), + (bool, {'result': True}, True), + (float, {'result': 3.14}, 3.14), + (list[str], {'result': ['a', 'b', 'c']}, ['a', 'b', 'c']), + (list[int], {'result': [1, 2, 3]}, [1, 2, 3]), + ( + list[SampleOutputSchema], + {'result': [{'result': 'ok', 'count': 1}]}, + [{'result': 'ok', 'count': 1}], + ), + (list[str], {'result': []}, []), + ], + ids=[ + 'BaseModel', + 'dict', + 'str', + 'int', + 'bool', + 'float', + 'list_str', + 'list_int', + 'list_BaseModel', + 'list_str_empty', + ], + ) + @pytest.mark.asyncio + async def test_run_async(self, output_schema, args, expected_output): + """Verify run_async validates and extracts output for each schema type.""" + agent = _make_task_agent(output_schema=output_schema) + tool = FinishTaskTool(task_agent=agent) + mock_tool_context = mock.MagicMock() + + result = await tool.run_async( + args=args, + tool_context=mock_tool_context, + ) + + # Task Delegation API: tool no longer writes actions.finish_task. The + # LlmAgent task wrapper sniffs the FC's `output` arg directly to + # set event.output. The tool just performs schema validation. + assert result == 'Task completed.' + del expected_output # validated_output is no longer surfaced via actions + + def test_get_declaration_list_basemodel_defs_at_root(self): + """Non-object schemas with $defs should hoist $defs to root level.""" + agent = _make_task_agent(output_schema=list[SampleOutputSchema]) + tool = FinishTaskTool(task_agent=agent) + declaration = tool._get_declaration() + + schema = declaration.parameters_json_schema + # $defs must be at the root, not nested inside properties.result + assert '$defs' in schema + assert 'SampleOutputSchema' in schema['$defs'] + # The nested result schema should not contain $defs + assert '$defs' not in schema['properties']['result'] diff --git a/tests/unittests/agents/test_agent_clone.py b/tests/unittests/agents/test_agent_clone.py index 541a463669..284708045b 100644 --- a/tests/unittests/agents/test_agent_clone.py +++ b/tests/unittests/agents/test_agent_clone.py @@ -296,24 +296,31 @@ def test_clone_preserves_agent_type(): assert isinstance(llm_cloned, LlmAgent) # Test SequentialAgent - seq_original = SequentialAgent(name="seq_test") + seq_original = SequentialAgent( + name="seq_test", sub_agents=[LlmAgent(name="dummy_seq")] + ) seq_cloned = seq_original.clone() assert isinstance(seq_cloned, SequentialAgent) # Test ParallelAgent - par_original = ParallelAgent(name="par_test") + par_original = ParallelAgent( + name="par_test", sub_agents=[LlmAgent(name="dummy_par")] + ) par_cloned = par_original.clone() assert isinstance(par_cloned, ParallelAgent) # Test LoopAgent - loop_original = LoopAgent(name="loop_test") + loop_original = LoopAgent( + name="loop_test", sub_agents=[LlmAgent(name="dummy_loop")] + ) loop_cloned = loop_original.clone() assert isinstance(loop_cloned, LoopAgent) def test_clone_with_agent_specific_fields(): # Test LoopAgent - loop_original = LoopAgent(name="loop_test") + dummy = LlmAgent(name="dummy") + loop_original = LoopAgent(name="loop_test", sub_agents=[dummy]) loop_cloned = loop_original.clone({"max_iterations": 10}) assert isinstance(loop_cloned, LoopAgent) assert loop_cloned.max_iterations == 10 diff --git a/tests/unittests/agents/test_agent_config.py b/tests/unittests/agents/test_agent_config.py index 380078ec50..99ee1d8401 100644 --- a/tests/unittests/agents/test_agent_config.py +++ b/tests/unittests/agents/test_agent_config.py @@ -260,51 +260,35 @@ def test_agent_config_discriminator_llm_agent_with_sub_agents( assert config.root.agent_class == agent_class_value -def test_agent_config_litellm_model_with_custom_args(tmp_path: Path): - yaml_content = """\ -name: managed_api_agent -description: Agent using LiteLLM managed endpoint -instruction: Respond concisely. -model_code: - name: google.adk.models.lite_llm.LiteLlm - args: - - name: model - value: kimi/k2 - - name: api_base - value: https://proxy.litellm.ai/v1 -""" - config_file = tmp_path / "litellm_agent.yaml" - config_file.write_text(yaml_content) - - agent = config_agent_utils.from_config(str(config_file)) - - assert isinstance(agent, LlmAgent) - assert isinstance(agent.model, LiteLlm) - assert agent.model.model == "kimi/k2" - assert agent.model._additional_args.get("api_base") == ( - "https://proxy.litellm.ai/v1" +def test_agent_config_model_code_resolves_preconfigured_client(tmp_path: Path): + """model_code references a pre-built model instance by fully qualified name. + + Configured clients (custom api_base, etc.) must be constructed in Python + and referenced from YAML; YAML cannot pass constructor arguments. + """ + preconfigured = LiteLlm( + model="kimi/k2", api_base="https://proxy.litellm.ai/v1" ) - -def test_agent_config_legacy_model_mapping_still_supported(tmp_path: Path): yaml_content = """\ name: managed_api_agent description: Agent using LiteLLM managed endpoint instruction: Respond concisely. -model: - name: google.adk.models.lite_llm.LiteLlm - args: - - name: model - value: kimi/k2 +model_code: + name: my_library.clients.my_litellm """ - config_file = tmp_path / "legacy_litellm_agent.yaml" + config_file = tmp_path / "litellm_agent.yaml" config_file.write_text(yaml_content) - agent = config_agent_utils.from_config(str(config_file)) + with mock.patch.object( + config_agent_utils, + "resolve_code_reference", + return_value=preconfigured, + ): + agent = config_agent_utils.from_config(str(config_file)) assert isinstance(agent, LlmAgent) - assert isinstance(agent.model, LiteLlm) - assert agent.model.model == "kimi/k2" + assert agent.model is preconfigured def test_agent_config_discriminator_custom_agent(): @@ -335,6 +319,66 @@ class MyCustomAgentConfig(BaseAgentConfig): assert my_custom_config.other_field == "other value" +def test_from_config_passes_extra_yaml_fields_to_custom_agent_constructor( + tmp_path: Path, +): + """Custom agent fields in YAML reach the constructor without a custom config_type. + + Mirrors the 1.x AgentConfigMapper behavior: a custom agent subclass with + extra Pydantic fields declared on the agent (not on a config_type) can + populate those fields directly from YAML. + """ + + class MyCustomAgent(BaseAgent): + custom_field: str = "" + + yaml_content = """\ +agent_class: mylib.agents.MyCustomAgent +name: custom_agent +description: a custom agent +custom_field: hello from yaml +""" + config_file = tmp_path / "custom_agent.yaml" + config_file.write_text(yaml_content) + + with mock.patch.object( + config_agent_utils, + "resolve_fully_qualified_name", + return_value=MyCustomAgent, + ): + agent = config_agent_utils.from_config(str(config_file)) + + assert isinstance(agent, MyCustomAgent) + assert agent.custom_field == "hello from yaml" + + +def test_from_config_ignores_extra_yaml_fields_not_on_agent(tmp_path: Path): + """Extra YAML keys that don't map to constructor params are silently dropped.""" + + class MyCustomAgent(BaseAgent): + custom_field: str = "" + + yaml_content = """\ +agent_class: mylib.agents.MyCustomAgent +name: custom_agent +description: a custom agent +custom_field: kept +unknown_field: dropped +""" + config_file = tmp_path / "custom_agent.yaml" + config_file.write_text(yaml_content) + + with mock.patch.object( + config_agent_utils, + "resolve_fully_qualified_name", + return_value=MyCustomAgent, + ): + agent = config_agent_utils.from_config(str(config_file)) + + assert agent.custom_field == "kept" + assert not hasattr(agent, "unknown_field") + + @pytest.mark.parametrize( ("config_rel_path", "child_rel_path", "child_name", "instruction"), [ @@ -421,23 +465,3 @@ def fake_from_config(path: str): ) assert result == "sentinel" assert recorded["path"] == expected_path - - -def test_load_config_from_path_blocks_args_when_enforced(tmp_path): - """Verify _load_config_from_path blocks 'args' when enforcement is enabled.""" - config_file = tmp_path / "malicious.yaml" - config_file.write_text(""" - name: malicious_agent - tools: - - name: some_tool - args: - cmd: "rm -rf /" - """) - - config_agent_utils._set_enforce_denylist(True) - try: - with pytest.raises(ValueError) as exc_info: - config_agent_utils._load_config_from_path(str(config_file)) - assert "Blocked key 'args' found" in str(exc_info.value) - finally: - config_agent_utils._set_enforce_denylist(False) diff --git a/tests/unittests/agents/test_context.py b/tests/unittests/agents/test_context.py index 0ef15b075b..b1c1303964 100644 --- a/tests/unittests/agents/test_context.py +++ b/tests/unittests/agents/test_context.py @@ -619,3 +619,31 @@ def test_render_ui_widget_duplicate(self, mock_invocation_context): assert len(context.actions.render_ui_widgets) == 1 assert context.actions.render_ui_widgets[0] is w1 + + +class TestDeriveScheduler: + """Tests for _derive_scheduler helper.""" + + def test_derive_scheduler_no_parent(self): + from google.adk.agents.context import _derive_scheduler + + assert _derive_scheduler(None) is None + + def test_derive_scheduler_with_parent_having_scheduler(self): + from google.adk.agents.context import _derive_scheduler + + mock_parent = MagicMock() + mock_scheduler = MagicMock() + mock_parent._workflow_scheduler = mock_scheduler + + assert _derive_scheduler(mock_parent) is mock_scheduler + + def test_derive_scheduler_with_parent_no_scheduler(self): + from google.adk.agents.context import _derive_scheduler + from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler + + mock_parent = MagicMock() + mock_parent._workflow_scheduler = None + + scheduler = _derive_scheduler(mock_parent) + assert isinstance(scheduler, DynamicNodeScheduler) diff --git a/tests/unittests/agents/test_invocation_context.py b/tests/unittests/agents/test_invocation_context.py index 87f78b2869..4283692f4a 100644 --- a/tests/unittests/agents/test_invocation_context.py +++ b/tests/unittests/agents/test_invocation_context.py @@ -172,15 +172,13 @@ def test_should_pause_invocation_with_resumable_app(self, event_to_pause): assert mock_invocation_context.should_pause_invocation(event_to_pause) - def test_should_not_pause_invocation_with_non_resumable_app( - self, event_to_pause - ): - """Tests should_pause_invocation with a non-resumable app.""" + def test_should_pause_invocation_with_non_resumable_app(self, event_to_pause): + """Tests should_pause_invocation pauses even without resumability.""" invocation_context = self._create_test_invocation_context( ResumabilityConfig(is_resumable=False) ) - assert not invocation_context.should_pause_invocation(event_to_pause) + assert invocation_context.should_pause_invocation(event_to_pause) def test_should_not_pause_invocation_with_no_long_running_tool_ids( self, event_to_pause @@ -312,7 +310,9 @@ def test_populate_invocation_agent_states_with_content_no_state(self): ) invocation_context.session.events = [event] invocation_context.populate_invocation_agent_states() - assert invocation_context.agent_states == {'agent1': BaseAgentState()} + assert invocation_context.agent_states == { + 'agent1': BaseAgentState().model_dump(mode='json') + } assert invocation_context.end_of_agents == {'agent1': False} def test_populate_invocation_agent_states_user_message_event(self): diff --git a/tests/unittests/agents/test_invocation_context_process_queue.py b/tests/unittests/agents/test_invocation_context_process_queue.py new file mode 100644 index 0000000000..2f99f0dc35 --- /dev/null +++ b/tests/unittests/agents/test_invocation_context_process_queue.py @@ -0,0 +1,159 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for _event_queue and _enqueue_event on InvocationContext.""" + +from __future__ import annotations + +import asyncio + +from google.adk.agents.invocation_context import InvocationContext +from google.adk.agents.llm_agent import LlmAgent +from google.adk.events.event import Event +from google.adk.sessions.in_memory_session_service import InMemorySessionService +import pytest + + +async def _create_ic_with_queue() -> InvocationContext: + """Create a minimal InvocationContext with _event_queue set.""" + agent = LlmAgent( + name='test_agent', + model='gemini-2.5-flash', + instruction='test', + ) + session_service = InMemorySessionService() + session = await session_service.create_session( + app_name='test_app', user_id='test_user' + ) + ic = InvocationContext( + invocation_id='test_invocation', + agent=agent, + session=session, + session_service=session_service, + ) + ic._event_queue = asyncio.Queue() + return ic + + +async def _create_ic_without_queue() -> InvocationContext: + """Create a minimal InvocationContext without _event_queue.""" + agent = LlmAgent( + name='test_agent', + model='gemini-2.5-flash', + instruction='test', + ) + session_service = InMemorySessionService() + session = await session_service.create_session( + app_name='test_app', user_id='test_user' + ) + return InvocationContext( + invocation_id='test_invocation', + agent=agent, + session=session, + session_service=session_service, + ) + + +@pytest.mark.asyncio +async def test_non_partial_event_blocks_until_processed() -> None: + """A non-partial event should block _enqueue_event until the consumer + signals processed.""" + ic: InvocationContext = await _create_ic_with_queue() + event: Event = Event(id=Event.new_id(), author='test') + + completed: bool = False + + async def consumer() -> None: + nonlocal completed + ev, processed = await ic._event_queue.get() + assert ev is event + assert processed is not None + processed.set() + completed = True + + consumer_task: asyncio.Task = asyncio.create_task(consumer()) + await ic._enqueue_event(event) + await consumer_task + + assert completed, 'Consumer should have processed the event.' + + +@pytest.mark.asyncio +async def test_partial_event_does_not_block() -> None: + """A partial event should not block — it returns immediately + without waiting for a processed signal.""" + ic: InvocationContext = await _create_ic_with_queue() + event: Event = Event(id=Event.new_id(), author='test', partial=True) + + await ic._enqueue_event(event) + + assert not ic._event_queue.empty() + ev, processed = await ic._event_queue.get() + assert ev is event + assert processed is None, 'Partial events should have no processed signal.' + + +@pytest.mark.asyncio +async def test_events_arrive_in_order() -> None: + """Multiple partial events should arrive on the queue in order.""" + ic: InvocationContext = await _create_ic_with_queue() + events: list[Event] = [ + Event(id=Event.new_id(), author=f'test_{i}', partial=True) + for i in range(5) + ] + + for event in events: + await ic._enqueue_event(event) + + for i in range(5): + ev, _ = await ic._event_queue.get() + assert ev.author == f'test_{i}' + + +@pytest.mark.asyncio +async def test_enqueue_event_raises_when_queue_not_set() -> None: + """_enqueue_event should raise RuntimeError if _event_queue is None.""" + ic: InvocationContext = await _create_ic_without_queue() + event: Event = Event(id=Event.new_id(), author='test') + + with pytest.raises(RuntimeError, match='_event_queue is not set'): + await ic._enqueue_event(event) + + +@pytest.mark.asyncio +async def test_non_partial_event_waits_for_signal() -> None: + """Verify that _enqueue_event for a non-partial event actually waits — + it should not complete before the consumer signals.""" + ic: InvocationContext = await _create_ic_with_queue() + event: Event = Event(id=Event.new_id(), author='test') + + emit_done: bool = False + + async def emitter() -> None: + nonlocal emit_done + await ic._enqueue_event(event) + emit_done = True + + emit_task: asyncio.Task = asyncio.create_task(emitter()) + + # Give the emitter a chance to run. + await asyncio.sleep(0.01) + assert not emit_done, '_enqueue_event should still be waiting.' + + # Now consume and signal. + _, processed = await ic._event_queue.get() + processed.set() + + await emit_task + assert emit_done, '_enqueue_event should complete after signal.' diff --git a/tests/unittests/agents/test_langgraph_agent.py b/tests/unittests/agents/test_langgraph_agent.py index 19ba55a687..a399722209 100644 --- a/tests/unittests/agents/test_langgraph_agent.py +++ b/tests/unittests/agents/test_langgraph_agent.py @@ -230,6 +230,7 @@ async def test_langgraph_agent( } mock_parent_context = MagicMock(spec=InvocationContext) + mock_parent_context._state_schema = None mock_session = MagicMock() mock_parent_context.session = mock_session mock_parent_context.user_content = types.Content( diff --git a/tests/unittests/agents/test_live_request_queue.py b/tests/unittests/agents/test_live_request_queue.py index ab98894daf..1bcf92574b 100644 --- a/tests/unittests/agents/test_live_request_queue.py +++ b/tests/unittests/agents/test_live_request_queue.py @@ -1,3 +1,17 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + from unittest.mock import AsyncMock from unittest.mock import MagicMock from unittest.mock import patch diff --git a/tests/unittests/agents/test_llm_agent_error_messages.py b/tests/unittests/agents/test_llm_agent_error_messages.py index 3f1ca47abb..9bd155f284 100644 --- a/tests/unittests/agents/test_llm_agent_error_messages.py +++ b/tests/unittests/agents/test_llm_agent_error_messages.py @@ -14,7 +14,7 @@ """Tests for enhanced error messages in agent handling.""" -from google.adk.agents import LlmAgent +from google.adk.agents.llm_agent import LlmAgent import pytest diff --git a/tests/unittests/agents/test_llm_agent_fields.py b/tests/unittests/agents/test_llm_agent_fields.py index 1158138fbc..92f3c34e49 100644 --- a/tests/unittests/agents/test_llm_agent_fields.py +++ b/tests/unittests/agents/test_llm_agent_fields.py @@ -96,6 +96,35 @@ def test_canonical_model_inherit(): assert sub_agent.canonical_model == parent_agent.canonical_model +def test_canonical_live_model_default_fallback(): + original_default = LlmAgent._default_live_model + LlmAgent.set_default_live_model('gemini-2.0-flash') + try: + agent = LlmAgent(name='test_agent') + assert agent.canonical_live_model.model == 'gemini-2.0-flash' + finally: + LlmAgent.set_default_live_model(original_default) + + +def test_canonical_live_model_str(): + agent = LlmAgent(name='test_agent', model='gemini-pro') + assert agent.canonical_live_model.model == 'gemini-pro' + + +def test_canonical_live_model_llm(): + llm = LLMRegistry.new_llm('gemini-pro') + agent = LlmAgent(name='test_agent', model=llm) + assert agent.canonical_live_model == llm + + +def test_canonical_live_model_inherit(): + sub_agent = LlmAgent(name='sub_agent') + parent_agent = LlmAgent( + name='parent_agent', model='gemini-pro', sub_agents=[sub_agent] + ) + assert sub_agent.canonical_live_model == parent_agent.canonical_live_model + + async def test_canonical_instruction_str(): agent = LlmAgent(name='test_agent', instruction='instruction') ctx = await _create_readonly_context(agent) diff --git a/tests/unittests/agents/test_llm_agent_include_contents.py b/tests/unittests/agents/test_llm_agent_include_contents.py index a196f93553..c24aab4ef0 100644 --- a/tests/unittests/agents/test_llm_agent_include_contents.py +++ b/tests/unittests/agents/test_llm_agent_include_contents.py @@ -221,8 +221,8 @@ async def test_include_contents_none_sequential_agents(): simplified_events = [event for event in events if event.content] assert len(simplified_events) == 2 - assert simplified_events[0].author == "agent1" - assert simplified_events[1].author == "agent2" + assert "Agent1 response" in str(simplified_events[0].content) + assert "Agent2 final response" in str(simplified_events[1].content) # Agent1 sees original user request agent1_contents = testing_utils.simplify_contents( diff --git a/tests/unittests/agents/test_llm_agent_interruptions.py b/tests/unittests/agents/test_llm_agent_interruptions.py new file mode 100644 index 0000000000..db9fb7c382 --- /dev/null +++ b/tests/unittests/agents/test_llm_agent_interruptions.py @@ -0,0 +1,481 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.agents import LlmAgent +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.tools.function_tool import FunctionTool +from google.adk.tools.long_running_tool import LongRunningFunctionTool +from google.adk.tools.tool_context import ToolContext +from google.genai import types +import pytest + +from tests.unittests import testing_utils +from tests.unittests.agents.llm.event_utils import text_parts + +_USER_ID = 'test_user' +_SESSION_ID = 'test_session' + + +async def _setup_runner(mock_model, tools=None, **agent_kwargs): + """Setup runner with LlmAgent directly.""" + llm_agent = LlmAgent( + name='test_agent', + model=mock_model, + tools=tools or [], + **agent_kwargs, + ) + session_service = InMemorySessionService() + await session_service.create_session( + app_name='test', user_id=_USER_ID, session_id=_SESSION_ID + ) + runner = Runner( + app_name='test', + agent=llm_agent, + session_service=session_service, + ) + return runner + + +async def _run_turn(runner, user_message): + """Run a single turn.""" + return [ + e + async for e in runner.run_async( + user_id=_USER_ID, + session_id=_SESSION_ID, + new_message=types.Content( + role='user', parts=[types.Part(text=user_message)] + ), + ) + ] + + +async def _resume_turn( + runner, prev_events, tool_name, tool_response_value='done' +): + """Resume after an interrupt.""" + fc_ids = [] + for e in prev_events: + if e.content and e.content.parts: + for p in e.content.parts: + if ( + p.function_call + and p.function_call.name == tool_name + and p.function_call.id + ): + fc_ids.append(p.function_call.id) + if getattr(e.output, 'function_calls', None): + for fc in e.output.function_calls: + if fc.name == tool_name and fc.id: + fc_ids.append(fc.id) + + if not fc_ids: + for e in prev_events: + if e.long_running_tool_ids: + fc_ids = list(e.long_running_tool_ids) + break + + invocation_id = prev_events[0].invocation_id + + fr_parts = [ + types.Part( + function_response=types.FunctionResponse( + name=tool_name, + id=fc_id, + response={'result': tool_response_value}, + ) + ) + for fc_id in fc_ids + ] + resume_msg = types.Content(role='user', parts=fr_parts) + + return [ + e + async for e in runner.run_async( + user_id=_USER_ID, + session_id=_SESSION_ID, + invocation_id=invocation_id, + new_message=resume_msg, + ) + ] + + +def create_lro_tool(name: str = 'long_running_op') -> LongRunningFunctionTool: + """Creates a minimal LRO tool for testing.""" + + def _impl() -> None: + return None + + _impl.__name__ = name + return LongRunningFunctionTool(_impl) + + +# --------------------------------------------------------------------------- +# Tests: Single Agent +# --------------------------------------------------------------------------- + + +class TestSingleAgentInterruptions: + """Tests for single agent triggering interruptions.""" + + async def test_single_agent_yields_on_long_running_tool(self): + """Single agent yields on Long Running Tool. + + Arrange: Set up a single agent with a long running tool. + Act: Run the agent with a prompt that triggers the tool. + Assert: Verify that the execution yields a long running tool interrupt. + """ + + fc = types.Part.from_function_call(name='long_running_op', args={}) + mock_model = testing_utils.MockModel.create(responses=[fc, 'Final answer']) + + lro_tool = create_lro_tool() + runner = await _setup_runner(mock_model, tools=[lro_tool]) + + # Act: Run first turn + events = await _run_turn(runner, 'Go') + + # Assert: Should have triggered function call + assert any( + any( + p.function_call and p.function_call.name == 'long_running_op' + for p in e.content.parts or [] + ) + for e in events + ) + assert len(mock_model.requests) == 1 + + # Act: Resume + resume_events = await _resume_turn(runner, events, 'long_running_op') + + # Assert: Should have completed + assert any('Final answer' in t for t in text_parts(resume_events)) + assert len(mock_model.requests) == 2 + + async def test_single_agent_request_input_tool_interrupt_and_resume(self): + """Test that using RequestInputTool successfully triggers an interrupt and resumes with user input.""" + from google.adk.tools import request_input + + fc = types.Part.from_function_call( + name='adk_request_input', + args={'message': 'Which file?', 'response_schema': {'type': 'string'}}, + ) + mock_model = testing_utils.MockModel.create( + responses=[fc, 'Continuing with file: file_a.txt'] + ) + + runner = await _setup_runner(mock_model, tools=[request_input]) + + # Act: Run first turn + events = await _run_turn(runner, 'Start') + + # Assert: Verify the interrupt event is produced + assert any(e.long_running_tool_ids for e in events) + assert any( + any( + p.function_call and p.function_call.name == 'adk_request_input' + for p in e.content.parts or [] + ) + for e in events + ) + + # Act: Resume with the response + resume_events = await _resume_turn( + runner, events, 'adk_request_input', tool_response_value='file_a.txt' + ) + + # Assert: Execution should continue with user response in the prompt history + assert len(mock_model.requests) == 2 + + # Assert: Verify the second request contains the FunctionCall & FunctionResponse pair + second_req_contents = mock_model.requests[1].contents + assert any( + any( + p.function_call and p.function_call.name == 'adk_request_input' + for p in c.parts or [] + ) + for c in second_req_contents + ) + assert any( + any( + p.function_response + and p.function_response.name == 'adk_request_input' + for p in c.parts or [] + ) + for c in second_req_contents + ) + + async def test_single_agent_request_input_tool_structured_schema(self): + """Test that using RequestInputTool with a structured object schema successfully interrupts and resumes with a dictionary response.""" + from google.adk.tools import request_input + + schema = { + 'type': 'object', + 'properties': { + 'host': {'type': 'string'}, + 'port': {'type': 'integer'}, + }, + 'required': ['host'], + } + fc = types.Part.from_function_call( + name='adk_request_input', + args={ + 'message': 'Provide DB connection details:', + 'response_schema': schema, + }, + ) + mock_model = testing_utils.MockModel.create( + responses=[fc, 'Connected to localhost:3306'] + ) + + runner = await _setup_runner(mock_model, tools=[request_input]) + + # Act: Run first turn + events = await _run_turn(runner, 'Start') + + # Assert: Verify the interrupt event is produced with the schema args + assert any(e.long_running_tool_ids for e in events) + fc_event = next( + e + for e in events + if e.content + and any( + p.function_call and p.function_call.name == 'adk_request_input' + for p in e.content.parts or [] + ) + ) + fc_part = next(p for p in fc_event.content.parts if p.function_call) + assert fc_part.function_call.args['response_schema'] == schema + + # Act: Resume with a structured dict response + db_details = {'host': 'localhost', 'port': 3306} + resume_events = await _resume_turn( + runner, events, 'adk_request_input', tool_response_value=db_details + ) + + # Assert: Execution should continue with the structured user response + assert len(mock_model.requests) == 2 + + # Assert: Verify the second request contains the FunctionCall & FunctionResponse pair + second_req_contents = mock_model.requests[1].contents + assert any( + any( + p.function_call and p.function_call.name == 'adk_request_input' + for p in c.parts or [] + ) + for c in second_req_contents + ) + assert any( + any( + p.function_response + and p.function_response.name == 'adk_request_input' + for p in c.parts or [] + ) + for c in second_req_contents + ) + + +class TestNestedAgentInterruptions: + """Tests for multi-agent setups with interruptions.""" + + async def test_child_agent_interrupt_and_resume(self): + """Child agent yields on LRO and resumes successfully. + + Arrange: Parent agent with Child agent. Parent transfers to Child. + Child calls LRO tool. + Act: Run, expect LRO interrupt. Then resume. + Assert: Should complete successfully. + """ + + def transfer_to_child(tool_context: ToolContext) -> str: + tool_context.actions.transfer_to_agent = 'child_agent' + return 'transferring' + + # Child agent + fc_child = types.Part.from_function_call(name='child_lro', args={}) + child_mock_model = testing_utils.MockModel.create( + responses=[fc_child, 'Child final answer'] + ) + + lro_tool = create_lro_tool('child_lro') + + child_agent = LlmAgent( + name='child_agent', + model=child_mock_model, + tools=[lro_tool], + ) + + # Parent agent + fc_parent = types.Part.from_function_call(name='transfer_to_child', args={}) + parent_mock_model = testing_utils.MockModel.create( + responses=[fc_parent, fc_parent, 'Parent final answer'] + ) + + parent_agent = LlmAgent( + name='parent_agent', + model=parent_mock_model, + tools=[transfer_to_child], + sub_agents=[child_agent], + ) + + # Setup runner + session_service = InMemorySessionService() + await session_service.create_session( + app_name='test', user_id=_USER_ID, session_id=_SESSION_ID + ) + runner = Runner( + app_name='test', agent=parent_agent, session_service=session_service + ) + + # When Parent runs the first turn + events = await _run_turn(runner, 'Go') + + # Then it should trigger child LRO interrupt + assert any(e.long_running_tool_ids for e in events) + + # When Parent resumes the turn + resume_events = await _resume_turn(runner, events, 'child_lro') + + # Then it should complete successfully + assert any('Child final answer' in t for t in text_parts(resume_events)) + + @pytest.mark.xfail(reason='Task agent as subagent not supported yet.') + async def test_task_child_agent_interrupt_and_resume(self): + """Task child agent yields on LRO and resumes successfully. + + Arrange: Parent agent with Task Child agent. Parent transfers to Child. + Child calls LRO tool. + Act: Run, expect LRO interrupt. Then resume. + Assert: Should complete successfully. + """ + + def transfer_to_child(tool_context: ToolContext) -> str: + tool_context.actions.transfer_to_agent = 'child_agent' + return 'transferring' + + # Child agent (Task mode) + fc_child = types.Part.from_function_call(name='child_lro', args={}) + fc_finish = types.Part.from_function_call( + name='finish_task', args={'result': 'Task done'} + ) + child_mock_model = testing_utils.MockModel.create( + responses=[fc_child, fc_finish, 'Child final answer'] + ) + + lro_tool = create_lro_tool('child_lro') + + child_agent = LlmAgent( + name='child_agent', + model=child_mock_model, + tools=[lro_tool], + mode='task', + ) + + # Parent agent + fc_parent = types.Part.from_function_call(name='transfer_to_child', args={}) + parent_mock_model = testing_utils.MockModel.create( + responses=[fc_parent, 'Parent final answer'] + ) + + parent_agent = LlmAgent( + name='parent_agent', + model=parent_mock_model, + tools=[transfer_to_child], + sub_agents=[child_agent], + ) + + # Setup runner + session_service = InMemorySessionService() + await session_service.create_session( + app_name='test', user_id=_USER_ID, session_id=_SESSION_ID + ) + runner = Runner( + app_name='test', agent=parent_agent, session_service=session_service + ) + + # When Parent runs the first turn + events = await _run_turn(runner, 'Go') + + # Then it should trigger child LRO interrupt + assert any(e.long_running_tool_ids for e in events) + + # When Parent resumes the turn + resume_events = await _resume_turn(runner, events, 'child_lro') + + # Then it should complete successfully + assert any('Parent final answer' in t for t in text_parts(resume_events)) + + @pytest.mark.xfail(reason='Single-turn agent as subagent not supported yet.') + async def test_single_turn_child_agent_interrupt_and_resume(self): + """Single-turn child agent yields on LRO and resumes successfully. + + Arrange: Parent agent with Single-turn Child agent. + Parent calls Child via tool. + Child calls LRO tool. + Act: Run, expect LRO interrupt. Then resume. + Assert: Should complete successfully. + """ + + # Child agent (Single-turn) + fc_child = types.Part.from_function_call(name='child_lro', args={}) + child_mock_model = testing_utils.MockModel.create( + responses=[fc_child, 'Child final answer'] + ) + + lro_tool = create_lro_tool('child_lro') + + child_agent = LlmAgent( + name='child_agent', + model=child_mock_model, + tools=[lro_tool], + mode='single_turn', + ) + + # Parent agent + fc_call_child = types.Part.from_function_call( + name='child_agent', args={'request': 'Go to child'} + ) + parent_mock_model = testing_utils.MockModel.create( + responses=[fc_call_child, 'Parent final answer'] + ) + + parent_agent = LlmAgent( + name='parent_agent', + model=parent_mock_model, + sub_agents=[child_agent], + ) + + # Setup runner + session_service = InMemorySessionService() + await session_service.create_session( + app_name='test', user_id=_USER_ID, session_id=_SESSION_ID + ) + runner = Runner( + app_name='test', agent=parent_agent, session_service=session_service + ) + + # When Parent runs the first turn + events = await _run_turn(runner, 'Go') + + # Then it should trigger child LRO interrupt + assert any(e.long_running_tool_ids for e in events) + + # When Parent resumes the turn + resume_events = await _resume_turn(runner, events, 'child_lro') + + # Then it should complete successfully + assert any('Parent final answer' in t for t in text_parts(resume_events)) diff --git a/tests/unittests/agents/test_resumable_llm_agent.py b/tests/unittests/agents/test_resumable_llm_agent.py index c8c3052d65..35b02cd389 100644 --- a/tests/unittests/agents/test_resumable_llm_agent.py +++ b/tests/unittests/agents/test_resumable_llm_agent.py @@ -12,18 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Union +"""Tests for resumable LlmAgent scenarios. + +Verifies that the Mesh-based LlmAgent correctly resumes from various +states: after transfers, tool calls, tool responses, and with +sub-agent tool calls. +""" + +import copy -from google.adk.agents.base_agent import BaseAgent -from google.adk.agents.base_agent import BaseAgentState -from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import LlmAgent -from google.adk.agents.run_config import RunConfig +from google.adk.apps.app import App from google.adk.apps.app import ResumabilityConfig -from google.adk.events.event import Event -from google.adk.events.event_actions import EventActions -from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.genai.types import Content from google.genai.types import Part import pytest @@ -40,24 +40,6 @@ def transfer_call_part(agent_name: str) -> Part: name="transfer_to_agent", response={"result": None} ) - -def tool_call_part(tool_name: str) -> Part: - part = Part.from_function_call(name=tool_name, args={}) - part.function_call.id = f"{tool_name}_id" - return part - - -def tool_response_part(tool_name: str) -> Part: - part = Part.from_function_response(name=tool_name, response={"result": "ok"}) - part.function_response.id = f"{tool_name}_id" - return part - - -def tool_response_part_no_id(tool_name: str) -> Part: - part = Part.from_function_response(name=tool_name, response={"result": "ok"}) - return part - - END_OF_AGENT = testing_utils.END_OF_AGENT @@ -65,351 +47,218 @@ def some_tool(): return {"result": "ok"} -async def _create_resumable_invocation_context( - invocation_id: str, agent: BaseAgent, events: list[Event] -) -> InvocationContext: - session_service = InMemorySessionService() - session = await session_service.create_session( - app_name="test_app", user_id="test_user" +def _behavioral_events(events): + """Extract behavioral events (non-state) from resumable app events.""" + return [ + e + for e in testing_utils.simplify_resumable_app_events( + copy.deepcopy(events) + ) + if not isinstance(e[1], dict) + ] + + +@pytest.mark.asyncio +async def test_resume_from_transfer(): + """Tests that the agent resumes from the correct sub-agent after a transfer. + + invocation1: root_agent transfers to sub_agent_1 + invocation2: sub_agent_1 responds (resuming from the transfer) + """ + sub_agent_1 = LlmAgent( + name="sub_agent_1", + model=testing_utils.MockModel.create( + responses=[ + "response from sub_agent_1", + "second response from sub_agent_1", + ] + ), ) - for event in events: - await session_service.append_event(session, event) - return InvocationContext( - invocation_id=invocation_id, - agent=agent, - session=session, - session_service=session_service, - resumability_config=ResumabilityConfig(is_resumable=True), - run_config=RunConfig(), + root_agent = LlmAgent( + name="root_agent", + model=testing_utils.MockModel.create( + responses=[transfer_call_part("sub_agent_1")] + ), + sub_agents=[sub_agent_1], + ) + runner = testing_utils.InMemoryRunner( + app=App( + name="test_app", + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) ) + # Invocation 1: root transfers to sub_agent_1. + inv1_events = await runner.run_async("test query") + inv1_behavioral = _behavioral_events(inv1_events) + assert inv1_behavioral == [ + ("root_agent", transfer_call_part("sub_agent_1")), + ("root_agent", TRANSFER_RESPONSE_PART), + ("root_agent", END_OF_AGENT), + ("sub_agent_1", "response from sub_agent_1"), + ("sub_agent_1", END_OF_AGENT), + ] + + # Invocation 2: sub_agent_1 is now active, should respond directly. + inv2_events = await runner.run_async("follow up query") + inv2_behavioral = _behavioral_events(inv2_events) + assert inv2_behavioral == [ + ("sub_agent_1", "second response from sub_agent_1"), + ("sub_agent_1", END_OF_AGENT), + ] + + +@pytest.mark.asyncio +async def test_resume_from_model_response(): + """Tests that the root agent resumes when there has been no transfer.""" + root_agent = LlmAgent( + name="root_agent", + model=testing_utils.MockModel.create( + responses=[ + "first response from root", + "second response from root", + ] + ), + ) + runner = testing_utils.InMemoryRunner( + app=App( + name="test_app", + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + ) -async def _resume_and_get_events( - agent: BaseAgent, invocation_context: InvocationContext -) -> list[(str, Union[Part, str])]: - events = [] - async for event in agent.run_async(invocation_context): - await invocation_context.session_service.append_event( - invocation_context.session, event - ) - events.append(event) - return testing_utils.simplify_resumable_app_events(events) - - -class TestResumableLlmAgent: - """Test suite for resumable LlmAgent.""" - - @pytest.fixture - async def resumable_invocation_context(self): - """Creates an invocation context for the specified agent.""" + # Invocation 1: root responds normally. + inv1_events = await runner.run_async("test query") + inv1_behavioral = _behavioral_events(inv1_events) + assert inv1_behavioral == [ + ("root_agent", "first response from root"), + ("root_agent", END_OF_AGENT), + ] + + # Invocation 2: root should respond again (no transfer happened). + inv2_events = await runner.run_async("follow up") + inv2_behavioral = _behavioral_events(inv2_events) + assert inv2_behavioral == [ + ("root_agent", "second response from root"), + ("root_agent", END_OF_AGENT), + ] + + +@pytest.mark.asyncio +async def test_resume_from_tool_call(): + """Tests that the agent resumes from a tool call. + + invocation1: root_agent calls some_tool, gets response, then responds + invocation2: root_agent responds again (tool was non-long-running) + """ + root_agent = LlmAgent( + name="root_agent", + model=testing_utils.MockModel.create( + responses=[ + Part.from_function_call(name="some_tool", args={}), + "response after tool call", + "second response", + ] + ), + tools=[some_tool], + ) + runner = testing_utils.InMemoryRunner( + app=App( + name="test_app", + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + ) - async def factory(agent: BaseAgent, events: list[Event]): - return await _create_resumable_invocation_context( - invocation_id="test_invocation", agent=agent, events=events + # Invocation 1: root calls tool, gets response, responds. + inv1_events = await runner.run_async("test query") + inv1_behavioral = _behavioral_events(inv1_events) + assert inv1_behavioral == [ + ("root_agent", Part.from_function_call(name="some_tool", args={})), + ( + "root_agent", + Part.from_function_response( + name="some_tool", response={"result": "ok"} + ), + ), + ("root_agent", "response after tool call"), + ("root_agent", END_OF_AGENT), + ] + + # Invocation 2: root resumes normally. + inv2_events = await runner.run_async("follow up") + inv2_behavioral = _behavioral_events(inv2_events) + assert inv2_behavioral == [ + ("root_agent", "second response"), + ("root_agent", END_OF_AGENT), + ] + + +@pytest.mark.asyncio +async def test_resume_subagent_after_transfer_and_tool_call(): + """Tests resuming a sub-agent that called a tool after being transferred to. + + invocation1: root_agent transfers to sub_agent_1, sub_agent_1 calls tool + and responds + invocation2: sub_agent_1 is still active, responds directly + """ + + def sub_agent_tool(): + return {"result": "ok"} + + sub_agent_1 = LlmAgent( + name="sub_agent_1", + model=testing_utils.MockModel.create( + responses=[ + Part.from_function_call(name="sub_agent_tool", args={}), + "response from sub_agent_1 after tool", + "second response from sub_agent_1", + ] + ), + tools=[sub_agent_tool], + ) + root_agent = LlmAgent( + name="root_agent", + model=testing_utils.MockModel.create( + responses=[transfer_call_part("sub_agent_1")] + ), + sub_agents=[sub_agent_1], + ) + runner = testing_utils.InMemoryRunner( + app=App( + name="test_app", + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=True), ) + ) - return factory - - @pytest.fixture - def mock_model(self): - """Provides a mock model for the test.""" - - def factory(responses: list[Part]): - return testing_utils.MockModel.create(responses=responses) - - return factory - - @pytest.mark.asyncio - async def test_resume_from_transfer_call( - self, resumable_invocation_context, mock_model - ): - """Tests that the agent resumes from the correct sub-agent after a transfer.""" - sub_agent_1 = LlmAgent( - name="sub_agent_1", - model=mock_model([ - "response from sub_agent_1", - ]), - ) - root_agent = LlmAgent( - name="root_agent", - model=mock_model(["response from root"]), - sub_agents=[sub_agent_1], - ) - past_events = [ - Event( - author="root_agent", - invocation_id="test_invocation", - content=Content( - parts=[ - transfer_call_part("sub_agent_1"), - ] - ), - ) - ] - ctx = await resumable_invocation_context(root_agent, past_events) - # Initialize the agent state for the root agent. - ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") - - assert await _resume_and_get_events(root_agent, ctx) == [ - ("root_agent", TRANSFER_RESPONSE_PART), - ("sub_agent_1", "response from sub_agent_1"), - ("sub_agent_1", END_OF_AGENT), - ("root_agent", END_OF_AGENT), - ] - - @pytest.mark.asyncio - async def test_resume_from_transfer_response( - self, resumable_invocation_context, mock_model - ): - """Tests that the agent resumes from the correct sub-agent after a transfer.""" - sub_agent_1 = LlmAgent( - name="sub_agent_1", - model=mock_model([ - "response from sub_agent_1", - ]), - ) - root_agent = LlmAgent( - name="root_agent", - model=mock_model(["response from root"]), - sub_agents=[sub_agent_1], - ) - past_events = [ - Event( - author="root_agent", - invocation_id="test_invocation", - content=Content( - parts=[ - TRANSFER_RESPONSE_PART, - ] - ), - actions=EventActions(transfer_to_agent="sub_agent_1"), - ) - ] - ctx: InvocationContext = await resumable_invocation_context( - root_agent, past_events - ) - # Initialize the agent state for the root agent. - ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") - - assert await _resume_and_get_events(root_agent, ctx) == [ - ("sub_agent_1", "response from sub_agent_1"), - ("sub_agent_1", END_OF_AGENT), - ("root_agent", END_OF_AGENT), - ] - - @pytest.mark.asyncio - async def test_resume_from_model_response( - self, resumable_invocation_context, mock_model - ): - """Tests that no sub-agent is resumed when there has been no transfer.""" - root_agent = LlmAgent( - name="root_agent", - model=mock_model([ - "second response from root", - ]), - ) - past_events = [ - Event( - author="root_agent", - invocation_id="test_invocation", - content=Content(parts=[Part(text="initial response from root")]), - ) - ] - ctx = await resumable_invocation_context(root_agent, past_events) - # Initialize the agent state for the root agent. - ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") - - assert await _resume_and_get_events(root_agent, ctx) == [ - ("root_agent", "second response from root"), - ("root_agent", END_OF_AGENT), - ] - - @pytest.mark.asyncio - async def test_resume_from_tool_call( - self, resumable_invocation_context, mock_model - ): - """Tests that the agent resumes from a tool call successfully.""" - root_agent = LlmAgent( - name="root_agent", - model=mock_model(["response after tool call"]), - tools=[some_tool], - ) - past_events = [ - Event( - author="root_agent", - invocation_id="test_invocation", - content=Content(parts=[tool_call_part("some_tool")]), - ), - ] - ctx = await resumable_invocation_context(root_agent, past_events) - # Initialize the agent state for the root agent. - ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") - - assert await _resume_and_get_events(root_agent, ctx) == [ - ("root_agent", tool_response_part_no_id("some_tool")), - ("root_agent", "response after tool call"), - ("root_agent", END_OF_AGENT), - ] - - @pytest.mark.asyncio - async def test_resume_after_tool_response( - self, resumable_invocation_context, mock_model - ): - """Tests that the agent does not resume a sub-agent when the user responds to the current agent.""" - root_agent = LlmAgent( - name="root_agent", - model=mock_model([ - "response after tool call", - ]), - tools=[some_tool], - ) - - past_events = [ - Event( - author="root_agent", - invocation_id="test_invocation", - content=Content(parts=[tool_call_part("some_tool")]), - ), - Event( - author="root_agent", - invocation_id="test_invocation", - content=Content(parts=[tool_response_part("some_tool")]), - ), - ] - ctx = await resumable_invocation_context(root_agent, past_events) - # Initialize the agent state for the root agent. - ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") - - assert await _resume_and_get_events(root_agent, ctx) == [ - ("root_agent", "response after tool call"), - ("root_agent", END_OF_AGENT), - ] - - @pytest.mark.asyncio - async def test_resume_root_agent_on_user_provided_function_response( - self, resumable_invocation_context, mock_model - ): - """Tests that the agent resumes the correct sub-agent after a user responds to its tool call.""" - - def sub_agent_tool(): - return {"result": "ok"} - - sub_agent_1 = LlmAgent( - name="sub_agent_1", - model=mock_model([ - "response from sub_agent_1 after tool call", - ]), - tools=[sub_agent_tool], - ) - root_agent = LlmAgent( - name="root_agent", - model=mock_model(["response from root after tool call"]), - sub_agents=[sub_agent_1], - tools=[some_tool], - ) - past_events = [ - Event( - author="root_agent", - invocation_id="test_invocation", - actions=EventActions(transfer_to_agent="sub_agent_1"), - ), - Event( - author="root_agent", - invocation_id="test_invocation", - content=Content(parts=[transfer_call_part("sub_agent_1")]), - ), - Event( - author="root_agent", - invocation_id="test_invocation", - content=Content(parts=[TRANSFER_RESPONSE_PART]), - actions=EventActions(transfer_to_agent="sub_agent_1"), - ), - Event( - author="root_agent", - invocation_id="test_invocation", - content=Content(parts=[tool_call_part("some_tool")]), - ), - Event( - author="sub_agent_1", - invocation_id="test_invocation", - content=Content(parts=[tool_call_part("sub_agent_tool")]), - ), - Event( - author="user", - invocation_id="test_invocation", - content=Content(parts=[tool_response_part("some_tool")]), - ), - ] - ctx = await resumable_invocation_context(root_agent, past_events) - # Initialize the agent state for the root agent and sub_agent_1. - ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") - ctx.agent_states[sub_agent_1.name] = BaseAgentState().model_dump( - mode="json" - ) - - assert await _resume_and_get_events(root_agent, ctx) == [ - ("root_agent", "response from root after tool call"), - ("root_agent", END_OF_AGENT), - ] - - @pytest.mark.asyncio - async def test_resume_subagent_on_user_provided_function_response( - self, resumable_invocation_context, mock_model - ): - """Tests that the agent resumes the correct sub-agent after a user responds to its tool call.""" - - def sub_agent_tool(): - return {"result": "ok"} - - sub_agent_1 = LlmAgent( - name="sub_agent_1", - model=mock_model([ - "response from sub_agent_1 after tool call", - ]), - tools=[sub_agent_tool], - ) - root_agent = LlmAgent( - name="root_agent", - model=mock_model(["response from root after tool call"]), - sub_agents=[sub_agent_1], - ) - past_events = [ - Event( - author="root_agent", - invocation_id="test_invocation", - actions=EventActions(transfer_to_agent="sub_agent_1"), - ), - Event( - author="root_agent", - invocation_id="test_invocation", - content=Content(parts=[transfer_call_part("sub_agent_1")]), - ), - Event( - author="root_agent", - invocation_id="test_invocation", - content=Content(parts=[TRANSFER_RESPONSE_PART]), - actions=EventActions(transfer_to_agent="sub_agent_1"), - ), - Event( - author="sub_agent_1", - invocation_id="test_invocation", - content=Content(parts=[tool_call_part("sub_agent_tool")]), - ), - Event( - author="user", - invocation_id="test_invocation", - content=Content(parts=[tool_response_part("sub_agent_tool")]), - ), - ] - ctx = await resumable_invocation_context(root_agent, past_events) - # Initialize the agent state for the root agent and sub_agent_1. - ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") - ctx.agent_states[sub_agent_1.name] = BaseAgentState().model_dump( - mode="json" - ) - - assert await _resume_and_get_events(root_agent, ctx) == [ - ("sub_agent_1", "response from sub_agent_1 after tool call"), - ("sub_agent_1", END_OF_AGENT), - ("root_agent", END_OF_AGENT), - ] + # Invocation 1: root transfers, sub_agent calls tool and responds. + inv1_events = await runner.run_async("test query") + inv1_behavioral = _behavioral_events(inv1_events) + assert inv1_behavioral == [ + ("root_agent", transfer_call_part("sub_agent_1")), + ("root_agent", TRANSFER_RESPONSE_PART), + ("root_agent", END_OF_AGENT), + ( + "sub_agent_1", + Part.from_function_call(name="sub_agent_tool", args={}), + ), + ( + "sub_agent_1", + Part.from_function_response( + name="sub_agent_tool", response={"result": "ok"} + ), + ), + ("sub_agent_1", "response from sub_agent_1 after tool"), + ("sub_agent_1", END_OF_AGENT), + ] + + # Invocation 2: sub_agent_1 is still active, responds directly. + inv2_events = await runner.run_async("follow up") + inv2_behavioral = _behavioral_events(inv2_events) + assert inv2_behavioral == [ + ("sub_agent_1", "second response from sub_agent_1"), + ("sub_agent_1", END_OF_AGENT), + ] diff --git a/tests/unittests/apps/test_apps.py b/tests/unittests/apps/test_apps.py index dd8e90d764..0d7f230e68 100644 --- a/tests/unittests/apps/test_apps.py +++ b/tests/unittests/apps/test_apps.py @@ -19,6 +19,7 @@ from google.adk.apps.app import App from google.adk.apps.app import ResumabilityConfig from google.adk.plugins.base_plugin import BasePlugin +from google.adk.workflow._base_node import BaseNode import pytest @@ -183,14 +184,42 @@ def test_app_rejects_invalid_name(self): with pytest.raises(ValueError): App(name="windows\\path", root_agent=mock_agent) - def test_app_name_must_be_identifier(self): + def test_app_name_must_be_valid(self): mock_agent = Mock(spec=BaseAgent) + # Hyphens are allowed + App(name="valid-name", root_agent=mock_agent) + + with pytest.raises(ValueError): + App(name="invalid name", root_agent=mock_agent) + with pytest.raises(ValueError): - App(name="invalid-name", root_agent=mock_agent) + App(name="invalid@name", root_agent=mock_agent) def test_app_name_cannot_be_user(self): mock_agent = Mock(spec=BaseAgent) with pytest.raises(ValueError): App(name="user", root_agent=mock_agent) + + +class TestAppRootNode: + """Tests for App.root_agent accepting BaseNode.""" + + def test_app_with_root_node(self): + """Test App creation with a BaseNode as root_agent.""" + node = BaseNode(name="test_node") + app = App(name="test_app", root_agent=node) + assert app.root_agent is node + + def test_app_rejects_none_root_agent(self): + """Test that not providing root_agent raises.""" + with pytest.raises(ValueError, match="root_agent must be provided"): + App(name="test_app") + + def test_app_rejects_invalid_root_agent(self): + """Test that root_agent must be a BaseAgent or BaseNode instance.""" + with pytest.raises( + TypeError, match="root_agent must be a BaseAgent or BaseNode" + ): + App(name="test_app", root_agent="not_a_node") diff --git a/tests/unittests/apps/test_compaction.py b/tests/unittests/apps/test_compaction.py index dde8a51b4b..5db1443e99 100644 --- a/tests/unittests/apps/test_compaction.py +++ b/tests/unittests/apps/test_compaction.py @@ -28,7 +28,7 @@ from google.adk.events.event import Event from google.adk.events.event_actions import EventActions from google.adk.events.event_actions import EventCompaction -from google.adk.flows.llm_flows import contents +from google.adk.flows.llm_flows import contents as _contents from google.adk.sessions.base_session_service import BaseSessionService from google.adk.sessions.session import Session from google.adk.tools.tool_confirmation import ToolConfirmation @@ -868,7 +868,7 @@ def test_get_contents_with_multiple_compactions(self): self._create_event(10.0, 'inv10', 'Event 10'), ] - result_contents = contents._get_contents(None, events) + result_contents = _contents._get_contents(None, events) # Expected contents: # Summary 1-4 (at timestamp 4.0) @@ -898,7 +898,7 @@ def test_get_contents_subsumed_compaction_is_hidden(self): self._create_event(9.0, 'inv9', 'Event 9'), ] - result_contents = contents._get_contents(None, events) + result_contents = _contents._get_contents(None, events) expected_texts = [ 'Summary 1-3', 'Event 4', @@ -919,7 +919,7 @@ def test_get_contents_compaction_appended_late_keeps_newer_events(self): self._create_compacted_event(1.0, 3.0, 'Summary 1-3', appended_ts=6.0), ] - result_contents = contents._get_contents(None, events) + result_contents = _contents._get_contents(None, events) expected_texts = ['Summary 1-3', 'Event 4', 'Event 5'] actual_texts = [c.parts[0].text for c in result_contents] self.assertEqual(actual_texts, expected_texts) @@ -932,7 +932,7 @@ def test_get_contents_no_compaction(self): self._create_event(3.0, 'inv3', 'Event 3'), ] - result_contents = contents._get_contents(None, events) + result_contents = _contents._get_contents(None, events) expected_texts = ['Event 1', 'Event 2', 'Event 3'] actual_texts = [c.parts[0].text for c in result_contents] self.assertEqual(actual_texts, expected_texts) @@ -946,7 +946,7 @@ def test_get_contents_single_compaction_at_start(self): self._create_event(3.0, 'inv3', 'Event 3'), ] - result_contents = contents._get_contents(None, events) + result_contents = _contents._get_contents(None, events) expected_texts = ['Summary 1-2', 'Event 3'] actual_texts = [c.parts[0].text for c in result_contents] self.assertEqual(actual_texts, expected_texts) @@ -963,7 +963,7 @@ def test_get_contents_single_compaction_in_middle(self): self._create_event(5.0, 'inv5', 'Event 5'), ] - result_contents = contents._get_contents(None, events) + result_contents = _contents._get_contents(None, events) expected_texts = ['Summary 1-2', 'Summary 3-4', 'Event 5'] actual_texts = [c.parts[0].text for c in result_contents] self.assertEqual(actual_texts, expected_texts) @@ -977,7 +977,7 @@ def test_get_contents_compaction_at_end(self): self._create_compacted_event(2.0, 3.0, 'Summary 2-3'), ] - result_contents = contents._get_contents(None, events) + result_contents = _contents._get_contents(None, events) expected_texts = ['Event 1', 'Summary 2-3'] actual_texts = [c.parts[0].text for c in result_contents] self.assertEqual(actual_texts, expected_texts) @@ -990,7 +990,7 @@ def test_get_contents_compaction_at_beginning(self): self._create_event(4.0, 'inv4', 'Event 4'), ] - result_contents = contents._get_contents(None, events) + result_contents = _contents._get_contents(None, events) expected_texts = ['Summary 1-2', 'Event 3', 'Event 4'] actual_texts = [c.parts[0].text for c in result_contents] self.assertEqual(actual_texts, expected_texts) @@ -1190,7 +1190,7 @@ async def test_sliding_window_pending_function_call_remains_in_contents( self.assertEqual(appended_event.actions.compaction.start_timestamp, 1.0) self.assertEqual(appended_event.actions.compaction.end_timestamp, 1.0) - result_contents = contents._get_contents(None, events + [appended_event]) + result_contents = _contents._get_contents(None, events + [appended_event]) self.assertEqual(result_contents[0].parts[0].text, 'Summary safe prefix') self.assertEqual( result_contents[1].parts[0].function_call.name, @@ -1275,7 +1275,7 @@ async def test_token_threshold_pending_function_call_remains_in_contents( self.assertEqual(appended_event.actions.compaction.start_timestamp, 1.0) self.assertEqual(appended_event.actions.compaction.end_timestamp, 1.0) - result_contents = contents._get_contents(None, events + [appended_event]) + result_contents = _contents._get_contents(None, events + [appended_event]) self.assertEqual(result_contents[0].parts[0].text, 'Summary safe prefix') self.assertEqual( result_contents[1].parts[0].function_call.name, diff --git a/tests/unittests/auth/test_auth_preprocessor.py b/tests/unittests/auth/test_auth_preprocessor.py index fb45cc34ac..f1b026cde4 100644 --- a/tests/unittests/auth/test_auth_preprocessor.py +++ b/tests/unittests/auth/test_auth_preprocessor.py @@ -319,7 +319,7 @@ async def test_processes_auth_response_successfully( @pytest.mark.asyncio @patch('google.adk.auth.auth_preprocessor.AuthHandler') @patch('google.adk.auth.auth_tool.AuthConfig.model_validate') - @patch('google.adk.flows.llm_flows.functions.handle_function_calls_async') + @patch('google.adk.auth.auth_preprocessor.handle_function_calls_async') async def test_processes_multiple_auth_responses_and_resumes_tools( self, mock_handle_function_calls, diff --git a/tests/unittests/auth/test_oauth2_credential_util.py b/tests/unittests/auth/test_oauth2_credential_util.py index b9d4da6711..17a5200255 100644 --- a/tests/unittests/auth/test_oauth2_credential_util.py +++ b/tests/unittests/auth/test_oauth2_credential_util.py @@ -207,6 +207,82 @@ def test_create_oauth2_session_oauth2_scheme_with_token_endpoint_auth_method( assert token_endpoint == "https://example.com/token" assert client.token_endpoint_auth_method == "client_secret_jwt" + def _oauth2_scheme_with_scopes(self): + """Build an OAuth2 scheme that declares scopes.""" + return OAuth2( + type_="oauth2", + flows=OAuthFlows( + authorizationCode=OAuthFlowAuthorizationCode( + authorizationUrl="https://example.com/auth", + tokenUrl="https://example.com/token", + scopes={"read": "Read access", "write": "Write access"}, + ) + ), + ) + + def _capturing_post(self, captured): + """Stub for OAuth2Session.post that records the token-request body.""" + + def _post(*args, **kwargs): + captured["data"] = kwargs.get("data") + response = Mock() + response.status_code = 200 + response.json.return_value = { + "access_token": "new_access_token", + "token_type": "Bearer", + "expires_in": 3600, + "refresh_token": "new_refresh_token", + } + return response + + return _post + + def test_refresh_request_omits_scope(self): + """Refresh requests must not carry scope (some providers reject it).""" + credential = AuthCredential( + auth_type=AuthCredentialTypes.OAUTH2, + oauth2=OAuth2Auth( + client_id="test_client_id", + client_secret="test_client_secret", + redirect_uri="https://example.com/callback", + ), + ) + + client, token_endpoint = create_oauth2_session( + self._oauth2_scheme_with_scopes(), credential + ) + assert client is not None + + captured = {} + client.post = self._capturing_post(captured) + client.refresh_token(token_endpoint, refresh_token="old_refresh_token") + + assert "scope" not in captured["data"] + + def test_token_exchange_omits_scope(self): + """Authorization-code exchange must not carry scope (it is redundant).""" + credential = AuthCredential( + auth_type=AuthCredentialTypes.OAUTH2, + oauth2=OAuth2Auth( + client_id="test_client_id", + client_secret="test_client_secret", + redirect_uri="https://example.com/callback", + ), + ) + + client, token_endpoint = create_oauth2_session( + self._oauth2_scheme_with_scopes(), credential + ) + assert client is not None + + captured = {} + client.post = self._capturing_post(captured) + client.fetch_token( + token_endpoint, grant_type="authorization_code", code="test_code" + ) + + assert "scope" not in captured["data"] + def test_update_credential_with_tokens(self): """Test update_credential_with_tokens function.""" credential = AuthCredential( diff --git a/tests/unittests/auth/test_toolset_auth.py b/tests/unittests/auth/test_toolset_auth.py index 941055af4f..7c231aba43 100644 --- a/tests/unittests/auth/test_toolset_auth.py +++ b/tests/unittests/auth/test_toolset_auth.py @@ -32,7 +32,6 @@ from google.adk.auth.auth_tool import AuthConfig from google.adk.auth.auth_tool import AuthToolArguments from google.adk.flows.llm_flows.base_llm_flow import _resolve_toolset_auth -from google.adk.flows.llm_flows.base_llm_flow import BaseLlmFlow from google.adk.flows.llm_flows.base_llm_flow import TOOLSET_AUTH_CREDENTIAL_ID_PREFIX as FLOW_PREFIX from google.adk.flows.llm_flows.functions import build_auth_request_event from google.adk.flows.llm_flows.functions import REQUEST_EUC_FUNCTION_CALL_NAME @@ -89,18 +88,19 @@ class TestToolsetAuthPrefixConstant: """Test that prefix constants are consistent.""" def test_prefix_constants_match(self): - """Ensure auth_preprocessor and base_llm_flow use the same prefix.""" + """Ensure auth_preprocessor and _reasoning use the same prefix.""" assert TOOLSET_AUTH_CREDENTIAL_ID_PREFIX == FLOW_PREFIX assert TOOLSET_AUTH_CREDENTIAL_ID_PREFIX == "_adk_toolset_auth_" class TestResolveToolsetAuth: - """Tests for _resolve_toolset_auth method in BaseLlmFlow.""" + """Tests for _resolve_toolset_auth.""" @pytest.fixture def mock_invocation_context(self): """Create a mock invocation context.""" ctx = Mock(spec=InvocationContext) + ctx._state_schema = None ctx.invocation_id = "test-invocation-id" ctx.end_invocation = False ctx.branch = None @@ -335,6 +335,7 @@ class TestCallbackContextGetAuthResponse: def mock_invocation_context(self): """Create a mock invocation context.""" ctx = Mock(spec=InvocationContext) + ctx._state_schema = None ctx.session = Mock() ctx.session.state = {} return ctx @@ -377,6 +378,7 @@ class TestBuildAuthRequestEvent: def mock_invocation_context(self): """Create a mock invocation context.""" ctx = Mock(spec=InvocationContext) + ctx._state_schema = None ctx.invocation_id = "test-invocation-id" ctx.branch = None ctx.agent = Mock() diff --git a/tests/unittests/cli/test_adk_web_server_tests.py b/tests/unittests/cli/test_adk_web_server_tests.py new file mode 100644 index 0000000000..3d5f7ef30c --- /dev/null +++ b/tests/unittests/cli/test_adk_web_server_tests.py @@ -0,0 +1,156 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import asyncio +import json +import os +from unittest.mock import AsyncMock +from unittest.mock import MagicMock +from unittest.mock import patch + +from fastapi.testclient import TestClient +from google.adk.cli.fast_api import get_fast_api_app +import pytest + + +@pytest.fixture +def test_client(tmp_path): + """Client with a temporary agents directory.""" + app = get_fast_api_app( + agents_dir=str(tmp_path), + web=True, + session_service_uri="", + artifact_service_uri="", + memory_service_uri="", + allow_origins=["*"], + a2a=False, + host="127.0.0.1", + port=8000, + ) + return TestClient(app) + + +def test_list_tests_empty(test_client): + response = test_client.get("/dev/apps/test_app/tests") + assert response.status_code == 200 + assert response.json() == [] + + +def test_create_test(test_client, tmp_path): + # Create agent dir so it exists + agent_dir = tmp_path / "test_app" + agent_dir.mkdir() + + payload = {"session_data": {"events": []}} + + response = test_client.put( + "/dev/apps/test_app/tests/my_test.json", json=payload + ) + assert response.status_code == 200 + assert response.json() == {"status": "success", "file": "my_test.json"} + + # Verify file exists + assert (agent_dir / "tests" / "my_test.json").exists() + + +def test_list_tests_not_empty(test_client, tmp_path): + agent_dir = tmp_path / "test_app" + tests_dir = agent_dir / "tests" + tests_dir.mkdir(parents=True) + (tests_dir / "test1.json").write_text("{}") + (tests_dir / "test2.json").write_text("{}") + + response = test_client.get("/dev/apps/test_app/tests") + assert response.status_code == 200 + assert response.json() == ["test1.json", "test2.json"] + + +def test_delete_test(test_client, tmp_path): + agent_dir = tmp_path / "test_app" + tests_dir = agent_dir / "tests" + tests_dir.mkdir(parents=True) + test_file = tests_dir / "test1.json" + test_file.write_text("{}") + + response = test_client.delete("/dev/apps/test_app/tests/test1.json") + assert response.status_code == 200 + assert response.json() == {"status": "success"} + assert not test_file.exists() + + +def test_get_test_content(test_client, tmp_path): + agent_dir = tmp_path / "test_app" + tests_dir = agent_dir / "tests" + tests_dir.mkdir(parents=True) + test_file = tests_dir / "test_get.json" + test_file.write_text('{"foo": "bar"}') + + response = test_client.get("/dev/apps/test_app/tests/test_get.json") + assert response.status_code == 200 + assert response.json() == {"foo": "bar"} + + +def test_get_test_content_not_found(test_client): + response = test_client.get("/dev/apps/test_app/tests/non_existent.json") + assert response.status_code == 404 + + +def test_rebuild_tests(test_client): + with patch("google.adk.cli.dev_server.asyncio.to_thread") as mock_to_thread: + mock_to_thread.return_value = None + response = test_client.post("/dev/apps/test_app/tests/rebuild", json={}) + assert response.status_code == 200 + assert response.json() == {"status": "success"} + mock_to_thread.assert_called_once() + + +def test_rebuild_single_test(test_client): + with patch("google.adk.cli.dev_server.asyncio.to_thread") as mock_to_thread: + mock_to_thread.return_value = None + response = test_client.post( + "/dev/apps/test_app/tests/rebuild?test_name=my_test.json", json={} + ) + assert response.status_code == 200 + assert response.json() == {"status": "success"} + mock_to_thread.assert_called_once() + args, kwargs = mock_to_thread.call_args + assert args[1].endswith("tests/my_test.json") + + +def test_run_tests(test_client): + from unittest.mock import AsyncMock + from unittest.mock import MagicMock + from unittest.mock import patch + + mock_process = MagicMock() + mock_process.stdout.readline = AsyncMock( + side_effect=[b"line1\n", b"line2\n", b""] + ) + mock_process.wait = AsyncMock(return_value=0) + + with patch( + "google.adk.cli.dev_server.asyncio.create_subprocess_exec", + new_callable=AsyncMock, + ) as mock_create_subprocess: + mock_create_subprocess.return_value = mock_process + + response = test_client.post("/dev/apps/test_app/tests/run", json={}) + assert response.status_code == 200 + assert response.headers["content-type"] == "text/plain; charset=utf-8" + # Read stream + content = response.content + assert b"line1\n" in content + assert b"line2\n" in content diff --git a/tests/unittests/cli/test_fast_api.py b/tests/unittests/cli/test_fast_api.py index 63392d1fd1..b00dd118d2 100755 --- a/tests/unittests/cli/test_fast_api.py +++ b/tests/unittests/cli/test_fast_api.py @@ -112,7 +112,7 @@ def _event_state_delta(state_delta: dict[str, Any]): # Define mocked async generator functions for the Runner -async def dummy_run_live(self, session, live_request_queue): +async def dummy_run_live(self, session, live_request_queue, **kwargs): yield _event_1() await asyncio.sleep(0) @@ -1381,6 +1381,45 @@ async def run_async_capture( assert captured_invocation_id["invocation_id"] == payload["invocation_id"] +def test_agent_run_passes_custom_metadata( + test_app, create_test_session, monkeypatch +): + """Test /run forwards custom_metadata via the run config.""" + info = create_test_session + captured: dict[str, Optional[RunConfig]] = {"run_config": None} + + async def run_async_capture( + self, + *, + user_id: str, + session_id: str, + invocation_id: Optional[str] = None, + new_message: Optional[types.Content] = None, + state_delta: Optional[dict[str, Any]] = None, + run_config: Optional[RunConfig] = None, + ): + del self, user_id, session_id, invocation_id, new_message, state_delta + captured["run_config"] = run_config + yield _event_1() + + monkeypatch.setattr(Runner, "run_async", run_async_capture) + + payload = { + "app_name": info["app_name"], + "user_id": info["user_id"], + "session_id": info["session_id"], + "new_message": {"role": "user", "parts": [{"text": "Hello"}]}, + "streaming": False, + "custom_metadata": {"tenant": "acme", "trace": "abc123"}, + } + + response = test_app.post("/run", json=payload) + + assert response.status_code == 200 + assert captured["run_config"] is not None + assert captured["run_config"].custom_metadata == payload["custom_metadata"] + + def test_agent_run_sse_splits_artifact_delta( test_app, create_test_session, monkeypatch ): @@ -1683,10 +1722,10 @@ def test_get_eval_set_result_not_found(test_app): assert response.status_code == 404 -def test_list_metrics_info(test_app): +def test_list_metrics_info(builder_test_client): """Test listing metrics info.""" - url = "/apps/test_app/metrics-info" - response = test_app.get(url) + url = "/dev/apps/test_app/metrics-info" + response = builder_test_client.get(url) # Verify the response assert response.status_code == 200 @@ -1706,7 +1745,7 @@ def test_debug_trace(test_app): """Test the debug trace endpoint.""" # This test will likely return 404 since we haven't set up trace data, # but it tests that the endpoint exists and handles missing traces correctly. - url = "/debug/trace/nonexistent-event" + url = "/dev/apps/test_app/debug/trace/nonexistent-event" response = test_app.get(url) # Verify we get a 404 for a nonexistent trace @@ -1721,56 +1760,6 @@ def test_openapi_json_schema_accessible(test_app): logger.info("OpenAPI /openapi.json endpoint is accessible") -def test_get_event_graph_returns_dot_src_for_app_agent(): - """Ensure graph endpoint unwraps App instances before building the graph.""" - from google.adk.cli.adk_web_server import AdkWebServer - - root_agent = DummyAgent(name="dummy_agent") - app_agent = App(name="test_app", root_agent=root_agent) - - class Loader: - - def load_agent(self, app_name): - return app_agent - - def list_agents(self): - return [app_agent.name] - - session_service = AsyncMock() - session = Session( - id="session_id", - app_name="test_app", - user_id="user", - state={}, - events=[Event(author="dummy_agent")], - ) - event_id = session.events[0].id - session_service.get_session.return_value = session - - adk_web_server = AdkWebServer( - agent_loader=Loader(), - session_service=session_service, - memory_service=MagicMock(), - artifact_service=MagicMock(), - credential_service=MagicMock(), - eval_sets_manager=MagicMock(), - eval_set_results_manager=MagicMock(), - agents_dir=".", - ) - - fast_api_app = adk_web_server.get_fast_api_app( - setup_observer=lambda _observer, _server: None, - tear_down_observer=lambda _observer, _server: None, - ) - - client = TestClient(fast_api_app) - response = client.get( - f"/apps/test_app/users/user/sessions/session_id/events/{event_id}/graph" - ) - assert response.status_code == 200 - assert "dotSrc" in response.json() - - def test_a2a_agent_discovery(test_app_with_a2a): """Test that A2A agents are properly discovered and configured.""" # This test mainly verifies that the A2A setup doesn't break the app @@ -2132,12 +2121,14 @@ def test_builder_final_save_preserves_files_and_cleans_tmp( ("app/sub_agent.yaml", b"name: sub\n", "application/x-yaml"), ), ] - response = builder_test_client.post("/builder/save?tmp=true", files=files) + response = builder_test_client.post( + "/dev/apps/app/builder/save?tmp=true", files=files + ) assert response.status_code == 200 assert response.json() is True response = builder_test_client.post( - "/builder/save", + "/dev/apps/app/builder/save", files=[( "files", ( @@ -2158,7 +2149,7 @@ def test_builder_final_save_preserves_files_and_cleans_tmp( def test_builder_save_rejects_cross_origin_post(builder_test_client, tmp_path): response = builder_test_client.post( - "/builder/save?tmp=true", + "/dev/apps/app/builder/save?tmp=true", headers={"origin": "https://evil.com"}, files=[( "files", @@ -2173,7 +2164,7 @@ def test_builder_save_rejects_cross_origin_post(builder_test_client, tmp_path): def test_builder_save_allows_same_origin_post(builder_test_client, tmp_path): response = builder_test_client.post( - "/builder/save?tmp=true", + "/dev/apps/app/builder/save?tmp=true", headers={"origin": "http://testserver"}, files=[( "files", @@ -2188,7 +2179,7 @@ def test_builder_save_allows_same_origin_post(builder_test_client, tmp_path): def test_builder_get_allows_cross_origin_get(builder_test_client): response = builder_test_client.get( - "/builder/app/missing?tmp=true", + "/dev/apps/missing/builder?tmp=true", headers={"origin": "https://evil.com"}, ) @@ -2201,12 +2192,12 @@ def test_builder_cancel_deletes_tmp_idempotent(builder_test_client, tmp_path): tmp_agent_root.mkdir(parents=True, exist_ok=True) (tmp_agent_root / "root_agent.yaml").write_text("name: app\n") - response = builder_test_client.post("/builder/app/app/cancel") + response = builder_test_client.post("/dev/apps/app/builder/cancel") assert response.status_code == 200 assert response.json() is True assert not (tmp_path / "app" / "tmp").exists() - response = builder_test_client.post("/builder/app/app/cancel") + response = builder_test_client.post("/dev/apps/app/builder/cancel") assert response.status_code == 200 assert response.json() is True assert not (tmp_path / "app" / "tmp").exists() @@ -2221,7 +2212,7 @@ def test_builder_get_tmp_true_recreates_tmp(builder_test_client, tmp_path): (nested_dir / "nested.yaml").write_text("nested: true\n") assert not (app_root / "tmp").exists() - response = builder_test_client.get("/builder/app/app?tmp=true") + response = builder_test_client.get("/dev/apps/app/builder?tmp=true") assert response.status_code == 200 assert response.text == "name: app\n" @@ -2230,7 +2221,7 @@ def test_builder_get_tmp_true_recreates_tmp(builder_test_client, tmp_path): assert (tmp_agent_root / "nested" / "nested.yaml").is_file() response = builder_test_client.get( - "/builder/app/app?tmp=true&file_path=nested/nested.yaml" + "/dev/apps/app/builder?tmp=true&file_path=nested/nested.yaml" ) assert response.status_code == 200 assert response.text == "nested: true\n" @@ -2239,7 +2230,7 @@ def test_builder_get_tmp_true_recreates_tmp(builder_test_client, tmp_path): def test_builder_get_tmp_true_missing_app_returns_empty( builder_test_client, tmp_path ): - response = builder_test_client.get("/builder/app/missing?tmp=true") + response = builder_test_client.get("/dev/apps/missing/builder?tmp=true") assert response.status_code == 200 assert response.text == "" assert not (tmp_path / "missing").exists() @@ -2247,7 +2238,7 @@ def test_builder_get_tmp_true_missing_app_returns_empty( def test_builder_save_rejects_traversal(builder_test_client, tmp_path): response = builder_test_client.post( - "/builder/save?tmp=true", + "/dev/apps/app/builder/save?tmp=true", files=[( "files", ("app/../escape.yaml", b"nope\n", "application/x-yaml"), @@ -2261,7 +2252,7 @@ def test_builder_save_rejects_traversal(builder_test_client, tmp_path): def test_builder_save_rejects_py_files(builder_test_client, tmp_path): """Uploading .py files via /builder/save is rejected.""" response = builder_test_client.post( - "/builder/save?tmp=true", + "/dev/apps/app/builder/save?tmp=true", files=[( "files", ("app/agent.py", b"import os\nos.system('id')\n", "text/plain"), @@ -2283,7 +2274,7 @@ def test_builder_save_rejects_non_yaml_extensions( (".pth", b"import os"), ]: response = builder_test_client.post( - "/builder/save?tmp=true", + "/dev/apps/app/builder/save?tmp=true", files=[( "files", (f"app/file{ext}", content, "application/octet-stream"), @@ -2295,7 +2286,7 @@ def test_builder_save_rejects_non_yaml_extensions( def test_builder_save_allows_yaml_files(builder_test_client, tmp_path): """Uploading .yaml and .yml files is allowed.""" response = builder_test_client.post( - "/builder/save?tmp=true", + "/dev/apps/app/builder/save?tmp=true", files=[( "files", ("app/root_agent.yaml", b"name: app\n", "application/x-yaml"), @@ -2305,7 +2296,7 @@ def test_builder_save_allows_yaml_files(builder_test_client, tmp_path): assert response.json() is True response = builder_test_client.post( - "/builder/save?tmp=true", + "/dev/apps/app/builder/save?tmp=true", files=[( "files", ("app/sub_agent.yml", b"name: sub\n", "application/x-yaml"), @@ -2323,7 +2314,7 @@ def test_builder_save_rejects_args_key(builder_test_client, tmp_path): key: value """ response = builder_test_client.post( - "/builder/save?tmp=true", + "/dev/apps/app/builder/save?tmp=true", files=[( "files", ("app/root_agent.yaml", yaml_with_args, "application/x-yaml"), @@ -2343,7 +2334,7 @@ def test_builder_save_rejects_nested_args_key(builder_test_client, tmp_path): param: value """ response = builder_test_client.post( - "/builder/save?tmp=true", + "/dev/apps/app/builder/save?tmp=true", files=[( "files", ("app/root_agent.yaml", yaml_with_nested_args, "application/x-yaml"), @@ -2354,7 +2345,7 @@ def test_builder_save_rejects_nested_args_key(builder_test_client, tmp_path): def test_builder_get_rejects_non_yaml_file_paths(builder_test_client, tmp_path): - """GET /builder/app/{app_name}?file_path=... rejects non-YAML extensions.""" + """GET /dev/apps/{app_name}/builder?file_path=... rejects non-YAML extensions.""" app_root = tmp_path / "app" app_root.mkdir(parents=True, exist_ok=True) (app_root / ".env").write_text("SECRET=supersecret\n") @@ -2363,26 +2354,26 @@ def test_builder_get_rejects_non_yaml_file_paths(builder_test_client, tmp_path): for file_path in [".env", "agent.py", "config.json"]: response = builder_test_client.get( - f"/builder/app/app?file_path={file_path}" + f"/dev/apps/app/builder?file_path={file_path}" ) assert response.status_code == 200, f"Expected 200 for {file_path}" assert response.text == "", f"Expected empty response for {file_path}" def test_builder_get_allows_yaml_file_paths(builder_test_client, tmp_path): - """GET /builder/app/{app_name}?file_path=... allows YAML extensions.""" + """GET /dev/apps/{app_name}/builder?file_path=... allows YAML extensions.""" app_root = tmp_path / "app" app_root.mkdir(parents=True, exist_ok=True) (app_root / "sub_agent.yaml").write_text("name: sub\n") (app_root / "tool.yml").write_text("name: tool\n") response = builder_test_client.get( - "/builder/app/app?file_path=sub_agent.yaml" + "/dev/apps/app/builder?file_path=sub_agent.yaml" ) assert response.status_code == 200 assert response.text == "name: sub\n" - response = builder_test_client.get("/builder/app/app?file_path=tool.yml") + response = builder_test_client.get("/dev/apps/app/builder?file_path=tool.yml") assert response.status_code == 200 assert response.text == "name: tool\n" @@ -2405,28 +2396,28 @@ def test_builder_endpoints_not_registered_without_web( mock_eval_set_results_manager, web=False, ) - # /builder/save should return 404/405, not 200 + # /dev/apps/app/builder/save should return 404/405, not 200 response = client.post( - "/builder/save", + "/dev/apps/app/builder/save", files=[ ("files", ("app/agent.yaml", b"name: test\n", "application/x-yaml")) ], ) assert response.status_code in (404, 405) - # /builder/app/{name}/cancel should also be absent - response = client.post("/builder/app/app/cancel") + # /dev/apps/{name}/builder/cancel should also be absent + response = client.post("/dev/apps/app/builder/cancel") assert response.status_code in (404, 405) - # /builder/app/{name} GET should also be absent - response = client.get("/builder/app/app") + # /dev/apps/{name}/builder GET should also be absent + response = client.get("/dev/apps/app/builder") assert response.status_code in (404, 405) def test_builder_endpoints_registered_with_web(builder_test_client): """Builder endpoints are available when web=True.""" response = builder_test_client.post( - "/builder/save?tmp=true", + "/dev/apps/app/builder/save?tmp=true", files=[ ("files", ("app/agent.yaml", b"name: test\n", "application/x-yaml")) ], @@ -2678,5 +2669,400 @@ async def run_async_capture( assert captured_visual_builder_values.get("yaml_app_after_sleep") == True +def test_default_app_name_middleware_and_resolution( + mock_session_service, + mock_artifact_service, + mock_memory_service, + mock_agent_loader, + mock_eval_sets_manager, + mock_eval_set_results_manager, + monkeypatch, +): + """Test that when ADK_DEFAULT_APP_NAME is set, path rewriting works for get_session and run.""" + # Set environment variable + monkeypatch.setenv("ADK_DEFAULT_APP_NAME", "test_app") + + test_app = _create_test_client( + mock_session_service, + mock_artifact_service, + mock_memory_service, + mock_agent_loader, + mock_eval_sets_manager, + mock_eval_set_results_manager, + ) + + # Create session for test_app + async def setup_session(): + await mock_session_service.create_session( + app_name="test_app", + user_id="test_user", + session_id="test_session", + state={}, + ) + + asyncio.run(setup_session()) + + # 1. Test path rewriting for GET /users/{user_id}/sessions/{session_id} + response = test_app.get("/users/test_user/sessions/test_session") + assert response.status_code == 200 + assert response.json()["id"] == "test_session" + + # 2. Test app_name omission in /run request payload + payload = { + "user_id": "test_user", + "session_id": "test_session", + "new_message": {"role": "user", "parts": [{"text": "Hello"}]}, + } + response = test_app.post("/run", json=payload) + assert response.status_code == 200 + assert isinstance(response.json(), list) + + +def test_default_app_name_not_set_raises_error(test_app, monkeypatch): + """Test that omitting app_name when ADK_DEFAULT_APP_NAME is not set raises 400/404.""" + # Make sure environment variable is NOT set + monkeypatch.delenv("ADK_DEFAULT_APP_NAME", raising=False) + + # 1. Accessing /users/{user_id}/sessions/{session_id} should return 404 because no rewrite happened + response = test_app.get("/users/test_user/sessions/test_session") + assert response.status_code == 404 + + # 2. Accessing /run with omitted app_name should return 400 + payload = { + "user_id": "test_user", + "session_id": "test_session", + "new_message": {"role": "user", "parts": [{"text": "Hello"}]}, + } + response = test_app.post("/run", json=payload) + assert response.status_code == 400 + assert "app_name is required" in response.json()["detail"] + + +def test_run_live_websocket_default_app_name( + mock_session_service, + mock_artifact_service, + mock_memory_service, + mock_agent_loader, + mock_eval_sets_manager, + mock_eval_set_results_manager, + monkeypatch, +): + """Test that /run_live websocket endpoint resolves app_name using ADK_DEFAULT_APP_NAME.""" + monkeypatch.setenv("ADK_DEFAULT_APP_NAME", "test_app") + + test_app = _create_test_client( + mock_session_service, + mock_artifact_service, + mock_memory_service, + mock_agent_loader, + mock_eval_sets_manager, + mock_eval_set_results_manager, + ) + + async def setup_session(): + await mock_session_service.create_session( + app_name="test_app", + user_id="user", + session_id="session", + state={}, + ) + + asyncio.run(setup_session()) + + url = "/run_live?user_id=user&session_id=session&modalities=AUDIO" + + with test_app.websocket_connect(url) as ws: + data = ws.receive_json() + assert data["author"] == "dummy agent" + + +def test_run_live_websocket_missing_app_name_raises_error( + test_app, monkeypatch +): + """Test that /run_live websocket connection fails when app_name and ADK_DEFAULT_APP_NAME are both missing.""" + from fastapi.websockets import WebSocketDisconnect + + monkeypatch.delenv("ADK_DEFAULT_APP_NAME", raising=False) + + url = "/run_live?user_id=user&session_id=session&modalities=AUDIO" + + with pytest.raises(WebSocketDisconnect) as exc_info: + with test_app.websocket_connect(url) as ws: + ws.receive_json() + assert exc_info.value.code == 1008 + + +def test_is_single_agent_directory(tmp_path): + """Verify that is_single_agent_directory only identifies directories with agent.py or root_agent.yaml.""" + from google.adk.cli.utils.agent_loader import is_single_agent_directory + + # Directory with agent.py (should be identified as agent) + agent_py_dir = tmp_path / "agent_py_dir" + agent_py_dir.mkdir() + (agent_py_dir / "agent.py").write_text("root_agent = 'dummy'") + assert is_single_agent_directory(str(agent_py_dir)) is True + + # Directory with root_agent.yaml (should be identified as agent) + yaml_dir = tmp_path / "yaml_dir" + yaml_dir.mkdir() + (yaml_dir / "root_agent.yaml").write_text("root_agent: dummy") + assert is_single_agent_directory(str(yaml_dir)) is True + + # Normal directory or standard package with __init__.py only (should NOT be identified as agent) + normal_pkg = tmp_path / "normal_pkg" + normal_pkg.mkdir() + (normal_pkg / "__init__.py").write_text( + "from .app import App\nimport something" + ) + assert is_single_agent_directory(str(normal_pkg)) is False + + +def test_agent_loader_single_agent_mode(tmp_path): + """Verify that AgentLoader automatically detects and configures single agent mode.""" + agent_folder = tmp_path / "my_test_agent" + agent_folder.mkdir() + (agent_folder / "agent.py").write_text("root_agent = 'dummy'") + + loader = fast_api_module.AgentLoader(str(agent_folder)) + + assert loader._is_single_agent is True + assert loader._single_agent_name == "my_test_agent" + assert loader.agents_dir == str(tmp_path) + assert loader.list_agents() == ["my_test_agent"] + + +def test_single_agent_mode_detection( + tmp_path, + mock_session_service, + mock_artifact_service, + mock_memory_service, + mock_eval_sets_manager, + mock_eval_set_results_manager, +): + """Verify that pointing agents_dir to a single agent folder enables single agent mode.""" + agent_folder = tmp_path / "my_only_agent" + agent_folder.mkdir() + (agent_folder / "agent.py").write_text("root_agent = None") + + with ( + patch.object(signal, "signal", autospec=True, return_value=None), + patch.object( + fast_api_module, + "create_session_service_from_options", + autospec=True, + return_value=mock_session_service, + ), + patch.object( + fast_api_module, + "create_artifact_service_from_options", + autospec=True, + return_value=mock_artifact_service, + ), + patch.object( + fast_api_module, + "create_memory_service_from_options", + autospec=True, + return_value=mock_memory_service, + ), + patch.object( + fast_api_module, + "LocalEvalSetsManager", + autospec=True, + return_value=mock_eval_sets_manager, + ), + patch.object( + fast_api_module, + "LocalEvalSetResultsManager", + autospec=True, + return_value=mock_eval_set_results_manager, + ), + ): + app = get_fast_api_app( + agents_dir=str(agent_folder), + web=True, + session_service_uri="", + artifact_service_uri="", + memory_service_uri="", + allow_origins=None, + a2a=False, + host="127.0.0.1", + port=8000, + ) + client = TestClient(app) + + response = client.get("/list-apps") + assert response.status_code == 200 + assert response.json() == ["my_only_agent"] + + +def test_single_agent_mode_sets_default_app( + tmp_path, + mock_session_service, + mock_artifact_service, + mock_memory_service, + mock_eval_sets_manager, + mock_eval_set_results_manager, + monkeypatch, +): + """Verify that in single agent mode, the agent is used as default app.""" + # Set environment variable to something else, but single mode should take precedence. + monkeypatch.setenv("ADK_DEFAULT_APP_NAME", "some_other_app") + + agent_folder = tmp_path / "my_only_agent" + agent_folder.mkdir() + (agent_folder / "agent.py").write_text("root_agent = None") + + # Setup session data in the in-memory service + async def setup_session(): + await mock_session_service.create_session( + app_name="my_only_agent", + user_id="test_user", + session_id="test_session", + state={}, + ) + + asyncio.run(setup_session()) + + with ( + patch.object(signal, "signal", autospec=True, return_value=None), + patch.object( + fast_api_module, + "create_session_service_from_options", + autospec=True, + return_value=mock_session_service, + ), + patch.object( + fast_api_module, + "create_artifact_service_from_options", + autospec=True, + return_value=mock_artifact_service, + ), + patch.object( + fast_api_module, + "create_memory_service_from_options", + autospec=True, + return_value=mock_memory_service, + ), + patch.object( + fast_api_module, + "LocalEvalSetsManager", + autospec=True, + return_value=mock_eval_sets_manager, + ), + patch.object( + fast_api_module, + "LocalEvalSetResultsManager", + autospec=True, + return_value=mock_eval_set_results_manager, + ), + ): + app = get_fast_api_app( + agents_dir=str(agent_folder), + web=True, + session_service_uri="", + artifact_service_uri="", + memory_service_uri="", + allow_origins=None, + a2a=False, + host="127.0.0.1", + port=8000, + ) + client = TestClient(app) + + # Accessing /users/{user_id}/sessions/{session_id} should work because of rewrite + response = client.get("/users/test_user/sessions/test_session") + assert response.status_code == 200 + assert response.json()["id"] == "test_session" + + +def test_agent_run_disconnect_aborts_run( + test_app, create_test_session, monkeypatch +): + """Test that /run endpoint aborts agent execution on client disconnect. + + Verifies that when the client connection is dropped during an active agent + run: + 1. The background agent execution generator task is cancelled. + 2. The endpoint returns a clean 499 (Client Closed Request) status code. + """ + import starlette.requests + + info = create_test_session + trigger_disconnect: dict[str, bool] = {"value": False} + was_cancelled: dict[str, bool] = {"value": False} + + async def run_async_mock( + self, + *, + user_id: str, + session_id: str, + invocation_id: Optional[str] = None, + new_message: Optional[types.Content] = None, + state_delta: Optional[dict[str, Any]] = None, + run_config: Optional[RunConfig] = None, + ): + del ( + self, + user_id, + session_id, + invocation_id, + new_message, + state_delta, + run_config, + ) + try: + # Yield first pulse event + yield _event_1() + # Simulate connection drop mid-run + trigger_disconnect["value"] = True + # Run a long async operation to allow the monitor to trigger cancellation + await asyncio.sleep(1.0) + yield _event_2() + except asyncio.CancelledError: + was_cancelled["value"] = True + raise + + monkeypatch.setattr(Runner, "run_async", run_async_mock) + + # Monkeypatch starlette.requests.Request.__init__ to inject simulated disconnect + original_init = starlette.requests.Request.__init__ + + def custom_init(self, *args, **kwargs): + original_init(self, *args, **kwargs) + original_receive = self._receive + call_count = 0 + + async def mock_receive(): + nonlocal call_count + call_count += 1 + if call_count == 1: + return await original_receive() + + # Subsequent calls block until simulated connection drop is triggered + while not trigger_disconnect["value"]: + await asyncio.sleep(0.01) + return {"type": "http.disconnect"} + + self._receive = mock_receive + self.__dict__["receive"] = mock_receive + + monkeypatch.setattr(starlette.requests.Request, "__init__", custom_init) + + payload = { + "app_name": info["app_name"], + "user_id": info["user_id"], + "session_id": info["session_id"], + "new_message": {"role": "user", "parts": [{"text": "Hello agent"}]}, + "streaming": False, + } + + # When standard /run POST request is initiated and mid-run connection drop occurs + response = test_app.post("/run", json=payload) + + # Then the response status should be 499 and the running generator was cancelled + assert response.status_code == 499 + assert was_cancelled["value"] is True + + if __name__ == "__main__": pytest.main(["-xvs", __file__]) diff --git a/tests/unittests/cli/utils/test_agent_loader.py b/tests/unittests/cli/utils/test_agent_loader.py index 8454323189..4da5f063ff 100644 --- a/tests/unittests/cli/utils/test_agent_loader.py +++ b/tests/unittests/cli/utils/test_agent_loader.py @@ -308,11 +308,21 @@ def test_agent_loader_with_mocked_windows_path(self, monkeypatch): del self windows_path = "C:\\Users\\dev\\agents\\" + class MockWindowsPath(PureWindowsPath): + + def resolve(self): + return self + with monkeypatch.context() as m: m.setattr( agent_loader_module, "Path", - lambda path_str: PureWindowsPath(path_str), + MockWindowsPath, + ) + m.setattr( + agent_loader_module, + "is_single_agent_directory", + lambda path: False, ) loader = AgentLoader(windows_path) @@ -458,7 +468,7 @@ def __init__(self): def test_sys_path_modification(self): """Test that agents_dir is added to sys.path correctly.""" with tempfile.TemporaryDirectory() as temp_dir: - temp_path = Path(temp_dir) + temp_path = Path(temp_dir).resolve() # Create agent self.create_agent_structure(temp_path, "path_agent", "module") diff --git a/tests/unittests/cli/utils/test_cli.py b/tests/unittests/cli/utils/test_cli.py index f7df1bf17f..86800df512 100644 --- a/tests/unittests/cli/utils/test_cli.py +++ b/tests/unittests/cli/utils/test_cli.py @@ -24,6 +24,7 @@ from typing import Dict from typing import List from typing import Tuple +from unittest import mock import click from google.adk.agents.base_agent import BaseAgent @@ -85,7 +86,13 @@ async def run_async(self, *a: Any, **k: Any): message = a[2] if len(a) >= 3 else k["new_message"] text = message.parts[0].text if message.parts else "" response = _Content("assistant", [_Part(f"echo:{text}")]) - yield types.SimpleNamespace(author="assistant", content=response) + ev = types.SimpleNamespace( + author="assistant", + content=response, + node_info=None, + long_running_tool_ids=[], + ) + yield ev async def close(self, *a: Any, **k: Any) -> None: ... diff --git a/tests/unittests/cli/utils/test_cli_create.py b/tests/unittests/cli/utils/test_cli_create.py index a8544579c5..1f4495ecd3 100644 --- a/tests/unittests/cli/utils/test_cli_create.py +++ b/tests/unittests/cli/utils/test_cli_create.py @@ -182,7 +182,7 @@ def test_run_cmd_invalid_app_name( with pytest.raises(click.BadParameter, match="Invalid app name"): cli_create.run_cmd( - "my-agent", + "invalid name", model="gemini-2.5-flash", google_api_key=None, google_cloud_project=None, diff --git a/tests/unittests/cli/utils/test_cli_deploy.py b/tests/unittests/cli/utils/test_cli_deploy.py index 506e274845..f2b32773f4 100644 --- a/tests/unittests/cli/utils/test_cli_deploy.py +++ b/tests/unittests/cli/utils/test_cli_deploy.py @@ -30,9 +30,10 @@ from unittest import mock import click -from google.adk.cli import cli_deploy import pytest +import src.google.adk.cli.cli_deploy as cli_deploy + # Helpers class _Recorder: @@ -241,6 +242,8 @@ def test_agent_engine_app_template_compiles_with_windows_paths() -> None: adk_app_type="agent", trace_to_cloud_option=False, express_mode=False, + extra_imports="", + app_instantiation="agent=root_agent", ) compile(rendered, "", "exec") @@ -320,7 +323,9 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: assert "enable_tracing=True" in content reqs_path = tmp_dir / "requirements.txt" assert reqs_path.is_file() - assert "google-cloud-aiplatform[adk,agent_engines]" in reqs_path.read_text() + reqs_content = reqs_path.read_text() + assert "google-cloud-aiplatform[agent_engines]" in reqs_content + assert f"google-adk=={cli_deploy.__version__}" in reqs_content assert len(create_recorder.calls) == 1 assert str(rmtree_recorder.get_last_call_args()[0]) == str(tmp_dir) @@ -504,7 +509,7 @@ def mock_subprocess_run(*args, **kwargs): dockerfile_path = tmp_path / "Dockerfile" assert dockerfile_path.is_file() dockerfile_content = dockerfile_path.read_text() - assert "CMD adk web --port=9090" in dockerfile_content + assert "CMD adk api_server --with_ui --port=9090" in dockerfile_content assert "RUN pip install google-adk==1.2.0" in dockerfile_content assert len(run_recorder.calls) == 3, "Expected 3 subprocess calls" diff --git a/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py b/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py index d94fd1a066..0a5b8f398d 100644 --- a/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py +++ b/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py @@ -28,9 +28,10 @@ from unittest import mock import click -from google.adk.cli import cli_deploy import pytest +import src.google.adk.cli.cli_deploy as cli_deploy + class AgentDirFixture(Protocol): """Protocol for the agent_dir pytest fixture factory.""" @@ -142,7 +143,7 @@ def test_to_cloud_run_happy_path( assert dockerfile_path.is_file() dockerfile_content = dockerfile_path.read_text() - expected_command = "web" if with_ui else "api_server" + expected_command = "api_server --with_ui" if with_ui else "api_server" assert f"CMD adk {expected_command} --port=8080" in dockerfile_content assert "FROM python:3.11-slim" in dockerfile_content assert ( diff --git a/tests/unittests/cli/utils/test_cli_tools_click.py b/tests/unittests/cli/utils/test_cli_tools_click.py index ad47c9ecbe..4f77a71f16 100644 --- a/tests/unittests/cli/utils/test_cli_tools_click.py +++ b/tests/unittests/cli/utils/test_cli_tools_click.py @@ -35,6 +35,7 @@ from google.adk.evaluation.eval_set import EvalSet from google.adk.evaluation.local_eval_set_results_manager import LocalEvalSetResultsManager from google.adk.evaluation.local_eval_sets_manager import LocalEvalSetsManager +from google.adk.events.event import Event from pydantic import BaseModel import pytest @@ -116,7 +117,7 @@ def test_cli_create_cmd_invokes_run_cmd( ) -> None: """`adk create` should forward arguments to cli_create.run_cmd.""" rec = _Recorder() - monkeypatch.setattr(cli_tools_click.cli_create, "run_cmd", rec) + monkeypatch.setattr("google.adk.cli.cli_create.run_cmd", rec) app_dir = tmp_path / "my_app" runner = CliRunner() @@ -196,13 +197,609 @@ def capture_asyncio_run(coro): assert coro_locals["agent_folder_name"] == "agent" +def test_cli_run_basic_with_query( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """`adk run` with query should invoke run_once_cli.""" + # Arrange + agent_dir = tmp_path / "agent" + agent_dir.mkdir() + (agent_dir / "__init__.py").touch() + (agent_dir / "agent.py").touch() + + mock_run_once = mock.AsyncMock(return_value=0) + monkeypatch.setattr("google.adk.cli.cli.run_once_cli", mock_run_once) + + runner = CliRunner() + + # Act + result = runner.invoke( + cli_tools_click.main, + ["run", str(agent_dir), "hello"], + ) + + # Assert + assert result.exit_code == 0 + assert mock_run_once.called + called_kwargs = mock_run_once.call_args.kwargs + assert called_kwargs.get("query") == "hello" + assert called_kwargs.get("agent_folder_name") == "agent" + + +def test_cli_run_interactive_with_state( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """`adk run` in interactive mode should pass state to run_cli.""" + # Arrange + agent_dir = tmp_path / "agent_interactive" + agent_dir.mkdir() + (agent_dir / "__init__.py").touch() + (agent_dir / "agent.py").touch() + + mock_run_cli = mock.AsyncMock() + monkeypatch.setattr("google.adk.cli.cli_tools_click.run_cli", mock_run_cli) + + runner = CliRunner() + + # Act + result = runner.invoke( + cli_tools_click.main, + ["run", str(agent_dir), "--state", '{"x": 1}'], + ) + + # Assert + assert result.exit_code == 0 + assert mock_run_cli.called + called_kwargs = mock_run_cli.call_args.kwargs + assert called_kwargs.get("state_str") == '{"x": 1}' + + +def test_cli_run_options_with_query( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """`adk run` with query and options should forward options correctly.""" + # Arrange + agent_dir = tmp_path / "agent_opts" + agent_dir.mkdir() + (agent_dir / "__init__.py").touch() + + mock_run_once = mock.AsyncMock(return_value=0) + monkeypatch.setattr("google.adk.cli.cli.run_once_cli", mock_run_once) + + runner = CliRunner() + + # Act + result = runner.invoke( + cli_tools_click.main, + [ + "run", + str(agent_dir), + "hello", + "--state", + '{"x": 1}', + "--in_memory", + "--jsonl", + ], + ) + + # Assert + assert result.exit_code == 0 + assert mock_run_once.called + called_kwargs = mock_run_once.call_args.kwargs + assert called_kwargs.get("query") == "hello" + assert called_kwargs.get("state_str") == '{"x": 1}' + assert called_kwargs.get("in_memory") is True + assert called_kwargs.get("jsonl") is True + + +def test_cli_run_auto_resume_with_query( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """`adk run` with query should auto-resume if session has active interrupts.""" + # Arrange + agent_dir = tmp_path / "agent_resume" + agent_dir.mkdir() + (agent_dir / "__init__.py").touch() + (agent_dir / "agent.py").touch() + + # Mock session service + mock_session = mock.Mock() + mock_session.id = "s123" + mock_session.user_id = "u123" + mock_session.app_name = "agent_resume" + + # Create a mock event with long_running_tool_ids + mock_event = Event( + invocation_id="invocation_123", + long_running_tool_ids={"interrupt_123"}, + author="agent", + ) + mock_session.events = [mock_event] + + mock_session_service = mock.AsyncMock() + mock_session_service.get_session.return_value = mock_session + + monkeypatch.setattr( + "google.adk.cli.cli.create_session_service_from_options", + mock.Mock(return_value=mock_session_service), + ) + + # Mock AgentLoader to avoid loading real files + mock_agent_loader = mock.Mock() + mock_agent_loader.load_agent.return_value = mock.Mock(name="agent_resume") + monkeypatch.setattr( + "google.adk.cli.cli.AgentLoader", + mock.Mock(return_value=mock_agent_loader), + ) + + # Mock Runner + mock_runner_instance = mock.Mock() + + # Create an async generator for run_async + async def mock_run_async(*args, **kwargs): + # Yield a mock event to simulate engine output + ev = mock.Mock() + ev.author = "agent" + ev.node_info = mock.Mock(path="node") + ev.content = None + ev.long_running_tool_ids = [] + # Add model_dump method as it's called in _print_event + ev.model_dump.return_value = {"author": "agent", "node_path": "node"} + yield ev + + mock_runner_instance.run_async.side_effect = mock_run_async + mock_runner_instance.close = mock.AsyncMock() + + monkeypatch.setattr( + "google.adk.cli.cli.Runner", + mock.Mock(return_value=mock_runner_instance), + ) + + # Mock _to_app to return a mock app + monkeypatch.setattr( + "google.adk.cli.cli._to_app", + mock.Mock(return_value=mock.Mock(name="agent_resume")), + ) + + runner = CliRunner() + + # Act + result = runner.invoke( + cli_tools_click.main, + [ + "run", + str(agent_dir), + "approve", + "--session_id", + "s123", + ], + ) + + # Assert + assert result.exit_code == 0 + + # Verify run_async was called with FunctionResponse + called_args = mock_runner_instance.run_async.call_args + assert called_args is not None + kwargs = called_args.kwargs + new_message = kwargs.get("new_message") + assert new_message is not None + assert len(new_message.parts) == 1 + part = new_message.parts[0] + assert part.function_response is not None + assert part.function_response.id == "interrupt_123" + assert part.function_response.response == {"result": "approve"} + + +def test_cli_run_auto_resume_with_query_confirmation_yes( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """`adk run` with query should auto-resume with confirmation=True if query is positive.""" + # Arrange + agent_dir = tmp_path / "agent_resume_confirm_yes" + agent_dir.mkdir() + (agent_dir / "__init__.py").touch() + (agent_dir / "agent.py").touch() + + # Mock session service + mock_session = mock.Mock() + mock_session.id = "s123" + mock_session.user_id = "u123" + mock_session.app_name = "agent_resume_confirm_yes" + + # Create a mock event with long_running_tool_ids + mock_event = mock.Mock() + mock_event.long_running_tool_ids = ["interrupt_123"] + mock_event.invocation_id = "invocation_123" + + # Mock get_function_calls to return adk_request_confirmation + fc = mock.Mock() + fc.id = "interrupt_123" + fc.name = "adk_request_confirmation" + mock_event.get_function_calls.return_value = [fc] + + mock_session.events = [mock_event] + + mock_session_service = mock.AsyncMock() + mock_session_service.get_session.return_value = mock_session + + monkeypatch.setattr( + "google.adk.cli.cli.create_session_service_from_options", + mock.Mock(return_value=mock_session_service), + ) + + # Mock AgentLoader to avoid loading real files + mock_agent_loader = mock.Mock() + mock_agent_loader.load_agent.return_value = mock.Mock( + name="agent_resume_confirm_yes" + ) + monkeypatch.setattr( + "google.adk.cli.cli.AgentLoader", + mock.Mock(return_value=mock_agent_loader), + ) + + # Mock Runner + mock_runner_instance = mock.Mock() + + # Create an async generator for run_async + async def mock_run_async(*args, **kwargs): + ev = mock.Mock() + ev.author = "agent" + ev.node_info = mock.Mock(path="node") + ev.content = None + ev.long_running_tool_ids = [] + ev.model_dump.return_value = {"author": "agent", "node_path": "node"} + yield ev + + mock_runner_instance.run_async.side_effect = mock_run_async + mock_runner_instance.close = mock.AsyncMock() + + monkeypatch.setattr( + "google.adk.cli.cli.Runner", + mock.Mock(return_value=mock_runner_instance), + ) + + # Mock _to_app to return a mock app + monkeypatch.setattr( + "google.adk.cli.cli._to_app", + mock.Mock(return_value=mock.Mock(name="agent_resume_confirm_yes")), + ) + + runner = CliRunner() + + # Act: Query is "yes" -> confirmed=True + result = runner.invoke( + cli_tools_click.main, + [ + "run", + str(agent_dir), + "yes", + "--session_id", + "s123", + ], + ) + + # Assert + assert result.exit_code == 0 + called_args = mock_runner_instance.run_async.call_args + assert called_args is not None + kwargs = called_args.kwargs + assert kwargs.get("invocation_id") == "invocation_123" + new_message = kwargs.get("new_message") + assert new_message is not None + assert len(new_message.parts) == 1 + part = new_message.parts[0] + assert part.function_response is not None + assert part.function_response.id == "interrupt_123" + assert part.function_response.name == "adk_request_confirmation" + assert part.function_response.response == {"confirmed": True} + + +def test_cli_run_auto_resume_with_query_confirmation_no( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """`adk run` with query should auto-resume with confirmation=False if query is negative.""" + # Arrange + agent_dir = tmp_path / "agent_resume_confirm_no" + agent_dir.mkdir() + (agent_dir / "__init__.py").touch() + (agent_dir / "agent.py").touch() + + # Mock session service + mock_session = mock.Mock() + mock_session.id = "s123" + mock_session.user_id = "u123" + mock_session.app_name = "agent_resume_confirm_no" + + # Create a mock event with long_running_tool_ids + mock_event = mock.Mock() + mock_event.long_running_tool_ids = ["interrupt_123"] + + # Mock get_function_calls to return adk_request_confirmation + fc = mock.Mock() + fc.id = "interrupt_123" + fc.name = "adk_request_confirmation" + mock_event.get_function_calls.return_value = [fc] + + mock_session.events = [mock_event] + + mock_session_service = mock.AsyncMock() + mock_session_service.get_session.return_value = mock_session + + monkeypatch.setattr( + "google.adk.cli.cli.create_session_service_from_options", + mock.Mock(return_value=mock_session_service), + ) + + # Mock AgentLoader to avoid loading real files + mock_agent_loader = mock.Mock() + mock_agent_loader.load_agent.return_value = mock.Mock( + name="agent_resume_confirm_no" + ) + monkeypatch.setattr( + "google.adk.cli.cli.AgentLoader", + mock.Mock(return_value=mock_agent_loader), + ) + + # Mock Runner + mock_runner_instance = mock.Mock() + + # Create an async generator for run_async + async def mock_run_async(*args, **kwargs): + ev = mock.Mock() + ev.author = "agent" + ev.node_info = mock.Mock(path="node") + ev.content = None + ev.long_running_tool_ids = [] + ev.model_dump.return_value = {"author": "agent", "node_path": "node"} + yield ev + + mock_runner_instance.run_async.side_effect = mock_run_async + mock_runner_instance.close = mock.AsyncMock() + + monkeypatch.setattr( + "google.adk.cli.cli.Runner", + mock.Mock(return_value=mock_runner_instance), + ) + + # Mock _to_app to return a mock app + monkeypatch.setattr( + "google.adk.cli.cli._to_app", + mock.Mock(return_value=mock.Mock(name="agent_resume_confirm_no")), + ) + + runner = CliRunner() + + # Act: Query is "no" -> confirmed=False + result = runner.invoke( + cli_tools_click.main, + [ + "run", + str(agent_dir), + "no", + "--session_id", + "s123", + ], + ) + + # Assert + assert result.exit_code == 0 + called_args = mock_runner_instance.run_async.call_args + assert called_args is not None + kwargs = called_args.kwargs + new_message = kwargs.get("new_message") + assert new_message is not None + assert len(new_message.parts) == 1 + part = new_message.parts[0] + assert part.function_response is not None + assert part.function_response.id == "interrupt_123" + assert part.function_response.name == "adk_request_confirmation" + assert part.function_response.response == {"confirmed": False} + + +def test_cli_run_auto_resume_with_query_confirmation_json( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """`adk run` with query should auto-resume with JSON response if query is valid JSON.""" + # Arrange + agent_dir = tmp_path / "agent_resume_confirm_json" + agent_dir.mkdir() + (agent_dir / "__init__.py").touch() + (agent_dir / "agent.py").touch() + + # Mock session service + mock_session = mock.Mock() + mock_session.id = "s123" + mock_session.user_id = "u123" + mock_session.app_name = "agent_resume_confirm_json" + + # Create a mock event with long_running_tool_ids + mock_event = mock.Mock() + mock_event.long_running_tool_ids = ["interrupt_123"] + + # Mock get_function_calls to return adk_request_confirmation + fc = mock.Mock() + fc.id = "interrupt_123" + fc.name = "adk_request_confirmation" + mock_event.get_function_calls.return_value = [fc] + + mock_session.events = [mock_event] + + mock_session_service = mock.AsyncMock() + mock_session_service.get_session.return_value = mock_session + + monkeypatch.setattr( + "google.adk.cli.cli.create_session_service_from_options", + mock.Mock(return_value=mock_session_service), + ) + + # Mock AgentLoader to avoid loading real files + mock_agent_loader = mock.Mock() + mock_agent_loader.load_agent.return_value = mock.Mock( + name="agent_resume_confirm_json" + ) + monkeypatch.setattr( + "google.adk.cli.cli.AgentLoader", + mock.Mock(return_value=mock_agent_loader), + ) + + # Mock Runner + mock_runner_instance = mock.Mock() + + # Create an async generator for run_async + async def mock_run_async(*args, **kwargs): + ev = mock.Mock() + ev.author = "agent" + ev.node_info = mock.Mock(path="node") + ev.content = None + ev.long_running_tool_ids = [] + ev.model_dump.return_value = {"author": "agent", "node_path": "node"} + yield ev + + mock_runner_instance.run_async.side_effect = mock_run_async + mock_runner_instance.close = mock.AsyncMock() + + monkeypatch.setattr( + "google.adk.cli.cli.Runner", + mock.Mock(return_value=mock_runner_instance), + ) + + # Mock _to_app to return a mock app + monkeypatch.setattr( + "google.adk.cli.cli._to_app", + mock.Mock(return_value=mock.Mock(name="agent_resume_confirm_json")), + ) + + runner = CliRunner() + + # Act: Query is a JSON string + json_query = '{"confirmed": true, "payload": {"amount": 100}}' + result = runner.invoke( + cli_tools_click.main, + [ + "run", + str(agent_dir), + json_query, + "--session_id", + "s123", + ], + ) + + # Assert + assert result.exit_code == 0 + called_args = mock_runner_instance.run_async.call_args + assert called_args is not None + kwargs = called_args.kwargs + new_message = kwargs.get("new_message") + assert new_message is not None + assert len(new_message.parts) == 1 + part = new_message.parts[0] + assert part.function_response is not None + assert part.function_response.id == "interrupt_123" + assert part.function_response.name == "adk_request_confirmation" + assert part.function_response.response == { + "confirmed": True, + "payload": {"amount": 100}, + } + + +def test_cli_run_all_options_with_query( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """`adk run` with query should forward all options correctly.""" + # Arrange + agent_dir = tmp_path / "agent_all_opts" + agent_dir.mkdir() + (agent_dir / "__init__.py").touch() + + mock_run_once = mock.AsyncMock(return_value=0) + monkeypatch.setattr("google.adk.cli.cli.run_once_cli", mock_run_once) + + replay_file = tmp_path / "replay.json" + replay_file.write_text('{"queries": ["hello"], "state": {}}') + + runner = CliRunner() + + # Act + result = runner.invoke( + cli_tools_click.main, + [ + "run", + str(agent_dir), + "hello", + "--state", + '{"x": 1}', + "--session_id", + "s123", + "--replay", + str(replay_file), + "--timeout", + "30s", + "--in_memory", + "--session_service_uri", + "memory://", + "--artifact_service_uri", + "memory://", + "--memory_service_uri", + "memory://", + ], + ) + + # Assert + assert result.exit_code == 0, f"Output: {result.output}" + assert mock_run_once.called + called_kwargs = mock_run_once.call_args.kwargs + assert called_kwargs.get("query") == "hello" + assert called_kwargs.get("state_str") == '{"x": 1}' + assert called_kwargs.get("session_id") == "s123" + assert called_kwargs.get("replay") == str(replay_file) + assert called_kwargs.get("timeout") == "30s" + assert called_kwargs.get("in_memory") is True + assert called_kwargs.get("session_service_uri") == "memory://" + assert called_kwargs.get("artifact_service_uri") == "memory://" + assert called_kwargs.get("memory_service_uri") == "memory://" + assert called_kwargs.get("use_local_storage") is True + + +def test_cli_run_no_use_local_storage_with_query( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + """`adk run` with query should forward --no_use_local_storage correctly.""" + # Arrange + agent_dir = tmp_path / "agent_no_local" + agent_dir.mkdir() + (agent_dir / "__init__.py").touch() + + mock_run_once = mock.AsyncMock(return_value=0) + monkeypatch.setattr("google.adk.cli.cli.run_once_cli", mock_run_once) + + runner = CliRunner() + + # Act + result = runner.invoke( + cli_tools_click.main, + [ + "run", + str(agent_dir), + "hello", + "--no_use_local_storage", + ], + ) + + # Assert + assert result.exit_code == 0 + assert mock_run_once.called + called_kwargs = mock_run_once.call_args.kwargs + assert called_kwargs.get("use_local_storage") is False + + # cli deploy cloud_run def test_cli_deploy_cloud_run_success( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: """Successful path should call cli_deploy.to_cloud_run once.""" rec = _Recorder() - monkeypatch.setattr(cli_tools_click.cli_deploy, "to_cloud_run", rec) + monkeypatch.setattr("google.adk.cli.cli_deploy.to_cloud_run", rec) agent_dir = tmp_path / "agent2" agent_dir.mkdir() @@ -231,7 +828,7 @@ def test_cli_deploy_cloud_run_failure( def _boom(*_a: Any, **_k: Any) -> None: # noqa: D401 raise RuntimeError("boom") - monkeypatch.setattr(cli_tools_click.cli_deploy, "to_cloud_run", _boom) + monkeypatch.setattr("google.adk.cli.cli_deploy.to_cloud_run", _boom) agent_dir = tmp_path / "agent3" agent_dir.mkdir() @@ -249,7 +846,7 @@ def test_cli_deploy_cloud_run_passthrough_args( ) -> None: """Extra args after '--' should be passed through to the gcloud command.""" rec = _Recorder() - monkeypatch.setattr(cli_tools_click.cli_deploy, "to_cloud_run", rec) + monkeypatch.setattr("google.adk.cli.cli_deploy.to_cloud_run", rec) agent_dir = tmp_path / "agent_passthrough" agent_dir.mkdir() @@ -293,7 +890,7 @@ def test_cli_deploy_cloud_run_rejects_args_without_separator( ) -> None: """Args without '--' separator should be rejected with helpful error message.""" rec = _Recorder() - monkeypatch.setattr(cli_tools_click.cli_deploy, "to_cloud_run", rec) + monkeypatch.setattr("google.adk.cli.cli_deploy.to_cloud_run", rec) agent_dir = tmp_path / "agent_no_sep" agent_dir.mkdir() @@ -323,7 +920,7 @@ def test_cli_deploy_cloud_run_rejects_args_before_separator( ) -> None: """Args before '--' separator should be rejected.""" rec = _Recorder() - monkeypatch.setattr(cli_tools_click.cli_deploy, "to_cloud_run", rec) + monkeypatch.setattr("google.adk.cli.cli_deploy.to_cloud_run", rec) agent_dir = tmp_path / "agent_before_sep" agent_dir.mkdir() @@ -357,7 +954,7 @@ def test_cli_deploy_cloud_run_allows_empty_gcloud_args( ) -> None: """No gcloud args after '--' should be allowed.""" rec = _Recorder() - monkeypatch.setattr(cli_tools_click.cli_deploy, "to_cloud_run", rec) + monkeypatch.setattr("google.adk.cli.cli_deploy.to_cloud_run", rec) agent_dir = tmp_path / "agent_empty_gcloud" agent_dir.mkdir() @@ -392,7 +989,7 @@ def test_cli_deploy_agent_engine_success( ) -> None: """Successful path should call cli_deploy.to_agent_engine.""" rec = _Recorder() - monkeypatch.setattr(cli_tools_click.cli_deploy, "to_agent_engine", rec) + monkeypatch.setattr("google.adk.cli.cli_deploy.to_agent_engine", rec) agent_dir = tmp_path / "agent_ae" agent_dir.mkdir() @@ -422,7 +1019,7 @@ def test_cli_deploy_agent_engine_otel_to_cloud_success( ) -> None: """Successful path should call cli_deploy.to_agent_engine with --otel_to_cloud.""" rec = _Recorder() - monkeypatch.setattr(cli_tools_click.cli_deploy, "to_agent_engine", rec) + monkeypatch.setattr("google.adk.cli.cli_deploy.to_agent_engine", rec) agent_dir = tmp_path / "agent_ae" agent_dir.mkdir() @@ -454,7 +1051,7 @@ def test_cli_deploy_gke_success( ) -> None: """Successful path should call cli_deploy.to_gke.""" rec = _Recorder() - monkeypatch.setattr(cli_tools_click.cli_deploy, "to_gke", rec) + monkeypatch.setattr("google.adk.cli.cli_deploy.to_gke", rec) agent_dir = tmp_path / "agent_gke" agent_dir.mkdir() @@ -541,7 +1138,7 @@ def test_cli_web_invokes_uvicorn( agents_dir = tmp_path / "agents" agents_dir.mkdir() monkeypatch.setattr( - cli_tools_click, "get_fast_api_app", lambda **_k: object() + "google.adk.cli.fast_api.get_fast_api_app", lambda **_k: object() ) runner = CliRunner() result = runner.invoke(cli_tools_click.main, ["web", str(agents_dir)]) @@ -556,7 +1153,7 @@ def test_cli_api_server_invokes_uvicorn( agents_dir = tmp_path / "agents_api" agents_dir.mkdir() monkeypatch.setattr( - cli_tools_click, "get_fast_api_app", lambda **_k: object() + "google.adk.cli.fast_api.get_fast_api_app", lambda **_k: object() ) runner = CliRunner() result = runner.invoke(cli_tools_click.main, ["api_server", str(agents_dir)]) @@ -572,7 +1169,7 @@ def test_cli_web_passes_service_uris( agents_dir.mkdir() mock_get_app = _Recorder() - monkeypatch.setattr(cli_tools_click, "get_fast_api_app", mock_get_app) + monkeypatch.setattr("google.adk.cli.fast_api.get_fast_api_app", mock_get_app) runner = CliRunner() result = runner.invoke( @@ -665,7 +1262,7 @@ def test_cli_eval_with_eval_set_id( eval_set_results = eval_set_results_manager.list_eval_set_results( app_name=app_name ) - assert len(eval_set_results) == 2 + assert len(eval_set_results) == 1 def test_cli_create_eval_set(tmp_path: Path): @@ -821,7 +1418,7 @@ def _mock_to_cloud_run(*_a, **kwargs): ) monkeypatch.setattr( - cli_tools_click.cli_deploy, "to_cloud_run", _mock_to_cloud_run + "google.adk.cli.cli_deploy.to_cloud_run", _mock_to_cloud_run ) agent_dir = tmp_path / "agent_conflict" diff --git a/tests/unittests/cli/utils/test_evals.py b/tests/unittests/cli/utils/test_evals.py index 84214859c5..071feb1e2d 100644 --- a/tests/unittests/cli/utils/test_evals.py +++ b/tests/unittests/cli/utils/test_evals.py @@ -25,11 +25,11 @@ @mock.patch.dict(os.environ, {'GOOGLE_CLOUD_PROJECT': 'test-project'}) @mock.patch( - 'google.adk.cli.utils.evals.GcsEvalSetResultsManager', + 'google.adk.evaluation.gcs_eval_set_results_manager.GcsEvalSetResultsManager', autospec=True, ) @mock.patch( - 'google.adk.cli.utils.evals.GcsEvalSetsManager', + 'google.adk.evaluation.gcs_eval_sets_manager.GcsEvalSetsManager', autospec=True, ) def test_create_gcs_eval_managers_from_uri_success( diff --git a/tests/unittests/cli/utils/test_gcp_utils.py b/tests/unittests/cli/utils/test_gcp_utils.py index 824bc81b2f..18ac37b5c2 100644 --- a/tests/unittests/cli/utils/test_gcp_utils.py +++ b/tests/unittests/cli/utils/test_gcp_utils.py @@ -140,9 +140,7 @@ def test_sign_up_express(self, mock_auth_default, mock_session_cls): }, ) - @mock.patch( - "google.adk.cli.utils.gcp_utils.resourcemanager_v3.ProjectsClient" - ) + @mock.patch("google.cloud.resourcemanager_v3.ProjectsClient") def test_list_gcp_projects(self, mock_client_cls): mock_client = mock.Mock() mock_client_cls.return_value = mock_client @@ -162,6 +160,14 @@ def test_list_gcp_projects(self, mock_client_cls): self.assertEqual(projects[0], ("p1", "Project 1")) self.assertEqual(projects[1], ("p2", "p2")) + @mock.patch.dict("sys.modules", {"google.cloud": None}) + def test_list_gcp_projects_import_error(self): + with self.assertRaisesRegex( + RuntimeError, + "Listing GCP projects requires the 'gcp' optional dependency", + ): + gcp_utils.list_gcp_projects() + if __name__ == "__main__": unittest.main() diff --git a/tests/unittests/cli/utils/test_graph_serialization.py b/tests/unittests/cli/utils/test_graph_serialization.py new file mode 100644 index 0000000000..ba8e828841 --- /dev/null +++ b/tests/unittests/cli/utils/test_graph_serialization.py @@ -0,0 +1,128 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for graph_serialization edge handling with routing maps.""" + +from google.adk.cli.utils.graph_serialization import serialize_agent +from google.adk.tools.base_toolset import BaseToolset +from google.adk.workflow import START +from google.adk.workflow import Workflow + +from tests.unittests.workflow.workflow_testing_utils import TestingNode + + +def test_serialize_edges_with_routing_map() -> None: + """Tests that routing map dicts in edges are serialized without error.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + + agent = Workflow( + name='test_workflow', + edges=[ + (START, node_a), + (node_a, {'route_b': node_b, 'route_c': node_c}), + ], + ) + + result = serialize_agent(agent) + + serialized_edges = result['edges'] + assert len(serialized_edges) == 2 + + # First edge: (START, node_a) — serialized as a 2-element list. + assert len(serialized_edges[0]) == 2 + + # Second edge: (node_a, {route: node}) — serialized as a 2-element list + # where the second element is a dict with string keys. + routing_map_edge = serialized_edges[1] + assert len(routing_map_edge) == 2 + assert isinstance(routing_map_edge[1], dict) + assert 'route_b' in routing_map_edge[1] + assert 'route_c' in routing_map_edge[1] + + +def test_serialize_edges_with_routing_map_int_keys() -> None: + """Tests that integer routing map keys are serialized as strings.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + + agent = Workflow( + name='test_workflow', + edges=[ + (START, node_a), + (node_a, {1: node_b}), + ], + ) + + result = serialize_agent(agent) + + routing_map_edge = result['edges'][1] + # Integer keys become string keys in the serialized output. + assert '1' in routing_map_edge[1] + + +def test_serialize_edges_mixed_formats() -> None: + """Tests serialization of edges mixing tuples, Edge objects, and routing maps.""" + from google.adk.workflow import Edge + + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + node_d = TestingNode(name='NodeD') + + agent = Workflow( + name='test_workflow', + edges=[ + (START, node_a), + (node_a, {'route_b': node_b, 'route_c': node_c}), + (node_b, node_d), + Edge(from_node=node_c, to_node=node_d), + ], + ) + + result = serialize_agent(agent) + + serialized_edges = result['edges'] + assert len(serialized_edges) == 4 + + # Tuple edges are lists, Edge objects are dicts with from_node/to_node. + assert isinstance(serialized_edges[0], list) # (START, node_a) + assert isinstance(serialized_edges[1], list) # routing map + assert isinstance(serialized_edges[2], list) # (node_b, node_d) + assert isinstance(serialized_edges[3], dict) # Edge object + assert 'from_node' in serialized_edges[3] + + +def test_serialize_agent_with_toolset() -> None: + """Tests that toolsets are serialized using their class name.""" + + class MockToolset(BaseToolset): + + async def get_tools(self, readonly_context=None): + return [] + + class FakeAgent: + model_fields = {'tools': None} + + def __init__(self): + self.tools = [MockToolset()] + + agent = FakeAgent() + result = serialize_agent(agent) # type: ignore + + assert 'tools' in result + assert len(result['tools']) == 1 + assert result['tools'][0]['name'] == 'MockToolset' + assert result['tools'][0]['type'] == 'tool' diff --git a/tests/unittests/conftest.py b/tests/unittests/conftest.py index 4a7216089b..0b78d3863f 100644 --- a/tests/unittests/conftest.py +++ b/tests/unittests/conftest.py @@ -14,6 +14,10 @@ import os +import pytest + +pytest.register_assert_rewrite('google.adk.cli.agent_test_runner') + from pytest import fixture from pytest import FixtureRequest from pytest import hookimpl diff --git a/tests/unittests/evaluation/mock_gcs_utils.py b/tests/unittests/evaluation/mock_gcs_utils.py index d9ea008c34..24aee17e62 100644 --- a/tests/unittests/evaluation/mock_gcs_utils.py +++ b/tests/unittests/evaluation/mock_gcs_utils.py @@ -1,3 +1,17 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + from typing import Optional from typing import Union diff --git a/tests/unittests/evaluation/test_eval_config.py b/tests/unittests/evaluation/test_eval_config.py index ce033359ba..082727a1f3 100644 --- a/tests/unittests/evaluation/test_eval_config.py +++ b/tests/unittests/evaluation/test_eval_config.py @@ -130,18 +130,6 @@ def test_get_eval_metrics_from_config_with_custom_metrics(): assert eval_metrics[1].custom_function_path == "path/to/custom/metric_2" -def test_custom_metric_code_config_with_args_raises_error(): - with pytest.raises(ValueError): - _ = EvalConfig( - criteria={"custom_metric": 1.0}, - custom_metrics={ - "custom_metric": { - "code_config": {"name": "name", "args": [{"value": 1}]}, - } - }, - ) - - def test_get_eval_metrics_from_config_empty_criteria(): eval_config = EvalConfig(criteria={}) eval_metrics = get_eval_metrics_from_config(eval_config) diff --git a/tests/unittests/evaluation/test_final_response_match_v2.py b/tests/unittests/evaluation/test_final_response_match_v2.py index ce44901ab5..4a609420b2 100644 --- a/tests/unittests/evaluation/test_final_response_match_v2.py +++ b/tests/unittests/evaluation/test_final_response_match_v2.py @@ -15,6 +15,8 @@ from __future__ import annotations from google.adk.evaluation.eval_case import Invocation +from google.adk.evaluation.eval_case import InvocationEvent +from google.adk.evaluation.eval_case import InvocationEvents from google.adk.evaluation.eval_metrics import BaseCriterion from google.adk.evaluation.eval_metrics import EvalMetric from google.adk.evaluation.eval_metrics import EvalStatus @@ -127,6 +129,8 @@ def create_test_template() -> str: def _create_test_evaluator_gemini( threshold: float, + *, + include_intermediate_responses_in_final: bool = False, ) -> FinalResponseMatchV2Evaluator: evaluator = FinalResponseMatchV2Evaluator( EvalMetric( @@ -134,6 +138,9 @@ def _create_test_evaluator_gemini( threshold=threshold, criterion=BaseCriterion( threshold=0.5, + include_intermediate_responses_in_final=( + include_intermediate_responses_in_final + ), ), ), ) @@ -168,6 +175,21 @@ def _create_test_invocations( return actual_invocation, expected_invocation +def _add_intermediate_text(invocation: Invocation, text: str) -> Invocation: + invocation.intermediate_data = InvocationEvents( + invocation_events=[ + InvocationEvent( + author="agent", + content=genai_types.Content( + parts=[genai_types.Part(text=text)], + role="model", + ), + ), + ] + ) + return invocation + + def test_format_auto_rater_prompt(): evaluator = _create_test_evaluator_gemini(threshold=0.8) actual_invocation, expected_invocation = _create_test_invocations( @@ -193,6 +215,59 @@ def test_format_auto_rater_prompt(): """ +def test_format_auto_rater_prompt_uses_empty_text_for_missing_final_response(): + evaluator = _create_test_evaluator_gemini(threshold=0.8) + actual_invocation, expected_invocation = _create_test_invocations( + "candidate text", "reference text" + ) + actual_invocation.final_response = None + expected_invocation.final_response = None + + prompt = evaluator.format_auto_rater_prompt( + actual_invocation, expected_invocation + ) + + assert "None" not in prompt + assert '"Agent response": ,' in prompt + assert '"Reference response": ,' in prompt + + +def test_format_auto_rater_prompt_ignores_intermediate_by_default(): + evaluator = _create_test_evaluator_gemini(threshold=0.8) + actual_invocation, expected_invocation = _create_test_invocations( + "candidate final", "reference final" + ) + _add_intermediate_text(actual_invocation, "candidate intro") + _add_intermediate_text(expected_invocation, "reference intro") + + prompt = evaluator.format_auto_rater_prompt( + actual_invocation, expected_invocation + ) + + assert "candidate final" in prompt + assert "reference final" in prompt + assert "candidate intro" not in prompt + assert "reference intro" not in prompt + + +def test_format_auto_rater_prompt_includes_intermediate_when_enabled(): + evaluator = _create_test_evaluator_gemini( + threshold=0.8, include_intermediate_responses_in_final=True + ) + actual_invocation, expected_invocation = _create_test_invocations( + "candidate final", "reference final" + ) + _add_intermediate_text(actual_invocation, "candidate intro") + _add_intermediate_text(expected_invocation, "reference intro") + + prompt = evaluator.format_auto_rater_prompt( + actual_invocation, expected_invocation + ) + + assert "candidate intro\ncandidate final" in prompt + assert "reference intro\nreference final" in prompt + + def test_convert_auto_rater_response_to_score_valid(): evaluator = _create_test_evaluator_gemini(threshold=0.8) auto_rater_response = """```json diff --git a/tests/unittests/evaluation/test_llm_as_judge_utils.py b/tests/unittests/evaluation/test_llm_as_judge_utils.py index e5327cf454..c7cd5ff569 100644 --- a/tests/unittests/evaluation/test_llm_as_judge_utils.py +++ b/tests/unittests/evaluation/test_llm_as_judge_utils.py @@ -19,6 +19,7 @@ from google.adk.evaluation.app_details import AgentDetails from google.adk.evaluation.app_details import AppDetails from google.adk.evaluation.eval_case import IntermediateData +from google.adk.evaluation.eval_case import Invocation from google.adk.evaluation.eval_case import InvocationEvent from google.adk.evaluation.eval_case import InvocationEvents from google.adk.evaluation.eval_rubrics import RubricScore @@ -88,6 +89,79 @@ def test_get_text_from_content_with_mixed_parts(): assert get_text_from_content(content) == "Hello\nWorld" +def test_get_text_from_content_with_invocation_include_intermediate_responses_in_final(): + """Tests get_text_from_content on an Invocation with and without the flag.""" + intermediate_text = "Let me check." + final_response_text = "Done." + invocation = Invocation( + user_content=genai_types.Content(parts=[genai_types.Part(text="user")]), + intermediate_data=InvocationEvents( + invocation_events=[ + InvocationEvent( + author="agent", + content=genai_types.Content( + parts=[genai_types.Part(text=intermediate_text)] + ), + ), + InvocationEvent( + author="tool", + content=genai_types.Content( + parts=[ + genai_types.Part( + function_call=genai_types.FunctionCall(name="t") + ) + ] + ), + ), + ] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text=final_response_text)] + ), + ) + + # Flag off (default): only the final response text is returned. + assert get_text_from_content(invocation) == final_response_text + + # Flag on: intermediate text is concatenated before the final response. + assert ( + get_text_from_content( + invocation, include_intermediate_responses_in_final=True + ) + == f"{intermediate_text}\n{final_response_text}" + ) + + +def test_get_text_from_content_with_intermediate_data_full_response(): + invocation = Invocation( + user_content=genai_types.Content(parts=[genai_types.Part(text="user")]), + intermediate_data=IntermediateData( + intermediate_responses=[ + ("agent", [genai_types.Part(text="legacy intro")]), + ( + "tool", + [ + genai_types.Part( + function_call=genai_types.FunctionCall(name="lookup") + ) + ], + ), + ] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text="final answer")] + ), + ) + + assert get_text_from_content(invocation) == "final answer" + assert ( + get_text_from_content( + invocation, include_intermediate_responses_in_final=True + ) + == "legacy intro\nfinal answer" + ) + + def test_get_eval_status_with_none_score(): """Tests get_eval_status returns NOT_EVALUATED for a None score.""" assert get_eval_status(score=None, threshold=0.5) == EvalStatus.NOT_EVALUATED diff --git a/tests/unittests/evaluation/test_local_eval_service.py b/tests/unittests/evaluation/test_local_eval_service.py index 894fc27c07..3bbfafc5be 100644 --- a/tests/unittests/evaluation/test_local_eval_service.py +++ b/tests/unittests/evaluation/test_local_eval_service.py @@ -369,7 +369,7 @@ async def test_evaluate_success( assert isinstance(results[0], EvalCaseResult) assert isinstance(results[1], EvalCaseResult) assert mock_eval_sets_manager.get_eval_case.call_count == 2 - assert mock_eval_set_results_manager.save_eval_set_result.call_count == 2 + assert mock_eval_set_results_manager.save_eval_set_result.call_count == 1 @pytest.mark.asyncio diff --git a/tests/unittests/evaluation/test_request_intercepter_plugin.py b/tests/unittests/evaluation/test_request_intercepter_plugin.py index 0caf3328ae..48f053294a 100644 --- a/tests/unittests/evaluation/test_request_intercepter_plugin.py +++ b/tests/unittests/evaluation/test_request_intercepter_plugin.py @@ -37,6 +37,7 @@ async def test_intercept_request_and_response(self, mocker): ) mock_invocation_context = mocker.MagicMock() mock_invocation_context.session.state = {} + mock_invocation_context._state_schema = None callback_context = CallbackContext(mock_invocation_context) llm_response = LlmResponse() diff --git a/tests/unittests/events/__init__.py b/tests/unittests/events/__init__.py new file mode 100644 index 0000000000..58d482ea38 --- /dev/null +++ b/tests/unittests/events/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/unittests/events/test_event_message.py b/tests/unittests/events/test_event_message.py new file mode 100644 index 0000000000..b6a6d125c8 --- /dev/null +++ b/tests/unittests/events/test_event_message.py @@ -0,0 +1,139 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for Event.message as an alias for Event.content.""" + +from google.adk.events.event import Event +from google.genai import types +import pytest + + +class TestMessageConstructor: + """Tests for Event(message=...) constructor parameter.""" + + def test_message_str_sets_content(self): + event = Event(message='Hello!') + assert event.content is not None + assert event.content.parts[0].text == 'Hello!' + + def test_message_content_passes_through(self): + content = types.Content( + parts=[types.Part(text='from Content')], role='model' + ) + event = Event(message=content) + assert event.content is content + + def test_message_part_converts_to_content(self): + part = types.Part(text='from Part') + event = Event(message=part) + assert event.content is not None + assert event.content.parts[0].text == 'from Part' + + def test_message_list_of_parts(self): + parts = [types.Part(text='part1'), types.Part(text='part2')] + event = Event(message=parts) + assert event.content is not None + assert len(event.content.parts) == 2 + assert event.content.parts[0].text == 'part1' + assert event.content.parts[1].text == 'part2' + + def test_message_and_content_raises(self): + with pytest.raises(ValueError, match='mutually exclusive'): + Event( + message='hello', + content=types.Content(parts=[types.Part(text='world')]), + ) + + def test_content_still_works(self): + content = types.Content( + parts=[types.Part(text='via content')], role='model' + ) + event = Event(content=content) + assert event.content is content + assert event.content.parts[0].text == 'via content' + + def test_neither_message_nor_content(self): + event = Event() + assert event.content is None + + +class TestMessageProperty: + """Tests for Event.message property getter and setter.""" + + def test_message_getter_aliases_content(self): + content = types.Content(parts=[types.Part(text='hello')], role='model') + event = Event(content=content) + assert event.message is event.content + + def test_message_getter_none_when_no_content(self): + event = Event() + assert event.message is None + + def test_message_setter_updates_content(self): + event = Event() + new_content = types.Content( + parts=[types.Part(text='updated')], role='model' + ) + event.message = new_content + assert event.content is new_content + + def test_message_setter_accepts_str(self): + event = Event() + event.message = 'updated via setter' + assert event.content is not None + assert event.content.parts[0].text == 'updated via setter' + + def test_message_setter_none_clears_content(self): + event = Event(message='hello') + event.message = None + assert event.content is None + + def test_message_from_constructor_readable_via_property(self): + event = Event(message='Hello!') + assert event.message is not None + assert event.message.parts[0].text == 'Hello!' + + +class TestMessageSerialization: + """Tests that serialization uses 'content', not 'message'.""" + + def test_serialized_uses_content_field(self): + event = Event(message='Hello!') + data = event.model_dump(exclude_none=True) + assert 'content' in data + assert 'message' not in data + + def test_round_trip_via_content(self): + event = Event(message='Hello!') + data = event.model_dump() + restored = Event.model_validate(data) + assert restored.content is not None + assert restored.content.parts[0].text == 'Hello!' + assert restored.message is not None + assert restored.message.parts[0].text == 'Hello!' + + +class TestMessageWithOtherKwargs: + """Tests message combined with other convenience kwargs.""" + + def test_message_with_state(self): + event = Event(message='hello', state={'key': 'val'}) + assert event.content is not None + assert event.content.parts[0].text == 'hello' + assert event.actions.state_delta == {'key': 'val'} + + def test_message_with_route(self): + event = Event(message='hello', route='next') + assert event.content is not None + assert event.actions.route == 'next' diff --git a/tests/unittests/events/test_node_path_builder.py b/tests/unittests/events/test_node_path_builder.py new file mode 100644 index 0000000000..7232b67254 --- /dev/null +++ b/tests/unittests/events/test_node_path_builder.py @@ -0,0 +1,159 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.events._node_path_builder import _NodePathBuilder +import pytest + + +def test_from_string_returns_empty_path_when_string_is_empty(): + """Parsing an empty string returns a path with no segments.""" + path = _NodePathBuilder.from_string('') + assert str(path) == '' + + +def test_from_string_parses_single_segment(): + """Parsing a single segment string returns a path with that segment.""" + path = _NodePathBuilder.from_string('wf@1') + assert str(path) == 'wf@1' + + +def test_from_string_parses_multiple_segments(): + """Parsing a slash-separated string returns a path with all segments.""" + path = _NodePathBuilder.from_string('wf@1/node@2') + assert str(path) == 'wf@1/node@2' + + +def test_str_joins_segments_with_slash(): + """String representation joins segments with slashes.""" + path = _NodePathBuilder(['wf@1', 'node@2']) + assert str(path) == 'wf@1/node@2' + + +def test_eq_returns_true_for_same_segments(): + """Equality returns True if both paths have identical segments.""" + path1 = _NodePathBuilder(['wf@1', 'node@2']) + path2 = _NodePathBuilder(['wf@1', 'node@2']) + assert path1 == path2 + + +def test_eq_returns_false_for_different_segments(): + """Equality returns False if segments differ.""" + path1 = _NodePathBuilder(['wf@1', 'node@1']) + path2 = _NodePathBuilder(['wf@1', 'node@2']) + assert path1 != path2 + + +def test_eq_returns_not_implemented_for_other_types(): + """Equality returns False when comparing with non-_NodePathBuilder objects.""" + path = _NodePathBuilder(['wf@1']) + assert path != 'wf@1' + + +def test_node_name_returns_name_without_run_id(): + """node_name returns the name part of the leaf segment, removing @id.""" + path = _NodePathBuilder.from_string('wf@1/node@2') + assert path.node_name == 'node' + + +def test_node_name_returns_full_segment_when_no_id_present(): + """node_name returns the full segment if no @id is present.""" + path = _NodePathBuilder.from_string('wf@1/node') + assert path.node_name == 'node' + + +def test_run_id_returns_id_when_present(): + """run_id returns the ID part after @ in the leaf segment.""" + path = _NodePathBuilder.from_string('wf@1/node@2') + assert path.run_id == '2' + + +def test_run_id_returns_none_when_no_id_present(): + """run_id returns None if no @ is present in the leaf segment.""" + path = _NodePathBuilder.from_string('wf@1/node') + assert path.run_id is None + + +def test_parent_returns_prefix_path(): + """parent returns a new path with the last segment removed.""" + path = _NodePathBuilder.from_string('wf@1/node@2') + parent = path.parent + assert parent is not None + assert str(parent) == 'wf@1' + + +def test_parent_returns_none_for_root_path(): + """parent returns None for a path with a single segment.""" + path = _NodePathBuilder.from_string('wf@1') + assert path.parent is None + + +def test_append_adds_segment_with_id(): + """append adds a new segment with the specified name and run ID.""" + path = _NodePathBuilder.from_string('wf@1') + child = path.append('node', '2') + assert str(child) == 'wf@1/node@2' + + +def test_append_adds_segment_without_id(): + """append adds a new segment without run ID if not provided.""" + path = _NodePathBuilder.from_string('wf@1') + child = path.append('node') + assert str(child) == 'wf@1/node' + + +def test_is_descendant_of_returns_true_for_deep_child(): + """is_descendant_of returns True if the path starts with the ancestor segments.""" + ancestor = _NodePathBuilder.from_string('wf@1') + descendant = _NodePathBuilder.from_string('wf@1/node@2') + assert descendant.is_descendant_of(ancestor) + + +def test_is_descendant_of_returns_false_for_unrelated_path(): + """is_descendant_of returns False if the path does not start with ancestor segments.""" + ancestor = _NodePathBuilder.from_string('wf@1') + other = _NodePathBuilder.from_string('other@1/node@2') + assert not other.is_descendant_of(ancestor) + + +def test_is_direct_child_of_returns_true_for_direct_child(): + """is_direct_child_of returns True if the path is exactly one segment longer than parent.""" + parent = _NodePathBuilder.from_string('wf@1') + child = _NodePathBuilder.from_string('wf@1/node@2') + assert child.is_direct_child_of(parent) + + +def test_is_direct_child_of_returns_false_for_grandchild(): + """is_direct_child_of returns False if the path is more than one segment longer.""" + parent = _NodePathBuilder.from_string('wf@1') + descendant = _NodePathBuilder.from_string('wf@1/inner@1/node@2') + assert not descendant.is_direct_child_of(parent) + + +def test_get_direct_child_returns_path_object(): + """get_direct_child returns a new path object for the direct child.""" + parent = _NodePathBuilder.from_string('wf@1') + descendant = _NodePathBuilder.from_string('wf@1/inner@1/node@2') + child = parent.get_direct_child(descendant) + assert isinstance(child, _NodePathBuilder) + assert str(child) == 'wf@1/inner@1' + + +def test_get_direct_child_raises_value_error_for_unrelated_path(): + """get_direct_child raises ValueError if descendant does not start with self.""" + parent = _NodePathBuilder.from_string('wf@1') + other = _NodePathBuilder.from_string('other@1/node@2') + with pytest.raises(ValueError): + parent.get_direct_child(other) diff --git a/tests/unittests/events/test_workflow_events.py b/tests/unittests/events/test_workflow_events.py new file mode 100644 index 0000000000..505c7212b9 --- /dev/null +++ b/tests/unittests/events/test_workflow_events.py @@ -0,0 +1,80 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk.events.event import Event +from google.adk.events.event import NodeInfo +from google.adk.events.request_input import RequestInput + + +def test_event_constructor_with_state(): + """Tests that the event constructor handles the state argument.""" + my_event = Event(state={"key": "value"}) + assert my_event.actions is not None + assert my_event.actions.state_delta == {"key": "value"} + + +def test_event_constructor_without_state(): + """Tests that the event constructor works without the state argument.""" + my_event = Event() + assert my_event.actions is not None + assert my_event.actions.state_delta == {} + + +def test_event_serialization_always_camel_case(): + """Tests that Event serialization produces camelCase keys.""" + request_input = RequestInput(interrupt_id="fc-1", message="test") + + # Create an event with fields that would produce snake_case if not dumped by alias + event = Event( + invocation_id="i-1", + node_info=NodeInfo( + path="a/b", + output_for=["c"], + message_as_output=True, + ), + output=request_input, + ) + + dumped = event.model_dump(by_alias=True) + + def check_no_snake_case_keys(data): + if isinstance(data, dict): + for key, value in data.items(): + assert "_" not in key, f"Found snake_case key: {key} in {data}" + check_no_snake_case_keys(value) + elif isinstance(data, list): + for item in data: + check_no_snake_case_keys(item) + + check_no_snake_case_keys(dumped) + + # Also verify that expected keys are indeed camelCased + assert "invocationId" in dumped + assert "nodeInfo" in dumped + assert "outputFor" in dumped["nodeInfo"] + assert "messageAsOutput" in dumped["nodeInfo"] + + # Verify RequestInput fields are camelCased + assert "output" in dumped + assert "interruptId" in dumped["output"] + + +def test_event_isolation_scope(): + """Tests Event.isolation_scope default value and serialization.""" + ev = Event() + assert ev.isolation_scope is None + + ev2 = Event(isolation_scope="task:fc-123") + dumped = ev2.model_dump(mode="json", by_alias=True, exclude_none=True) + assert dumped["isolationScope"] == "task:fc-123" diff --git a/tests/unittests/flows/llm_flows/test_base_llm_flow.py b/tests/unittests/flows/llm_flows/test_base_llm_flow.py index 4b6d198c6f..abfb6e4c68 100644 --- a/tests/unittests/flows/llm_flows/test_base_llm_flow.py +++ b/tests/unittests/flows/llm_flows/test_base_llm_flow.py @@ -248,10 +248,11 @@ def _my_tool(sides: int) -> int: async def test_process_agent_tools_resolves_unions_in_parallel(): """``_convert_tool_union_to_tools`` is dispatched for every tool_union concurrently. - Each mocked resolution blocks until ``all_started`` is set; the event is - only set once every call has been entered. If ``_process_agent_tools`` - were still serial, the first call would block forever waiting for the - event the second call hasn't yet entered to set. + Each mocked resolution blocks until ``all_started`` is set; the event + is only set once every call has been entered. If + ``_process_agent_tools`` were still serial, the first call would + block forever waiting for the event the second call hasn't yet + entered to set. """ num_tools = 5 started_count = 0 @@ -269,6 +270,7 @@ async def blocking_convert(tool_union, *args, **kwargs): def _make_func(i): def _f(): + """Test function.""" return i _f.__name__ = f'fn_{i}' @@ -279,8 +281,6 @@ def _f(): with mock.patch( 'google.adk.agents.llm_agent._convert_tool_union_to_tools', side_effect=blocking_convert, - autospec=True, - spec_set=True, ): agent = Agent(name='test_agent', tools=funcs) invocation_context = await testing_utils.create_invocation_context( @@ -307,11 +307,7 @@ async def drive(): @pytest.mark.asyncio async def test_process_agent_tools_preserves_order_when_later_unions_resolve_first(): - """Test that process_agent_tools preserves order when later unions resolve first. - - Even if a tool later in the agent.tools list resolves faster than an earlier - tool, process_llm_request must be invoked in the original agent.tools order. - """ + """``process_llm_request`` is called in original ``agent.tools`` order even when later unions resolve first.""" resolution_started_evt = [asyncio.Event(), asyncio.Event()] process_call_order: list[str] = [] @@ -332,16 +328,16 @@ async def staggered_convert(tool_union, *args, **kwargs): ] def fn_slow(): + """Slow-resolving function.""" return 0 def fn_fast(): + """Fast-resolving function.""" return 0 with mock.patch( 'google.adk.agents.llm_agent._convert_tool_union_to_tools', side_effect=staggered_convert, - autospec=True, - spec_set=True, ): # agent.tools order is [slow, fast]; resolution completes [fast, slow]. agent = Agent(name='test_agent', tools=[fn_slow, fn_fast]) @@ -1190,6 +1186,66 @@ async def mock_run_live_sub_agent(child_ctx, *args, **kwargs): ) +@pytest.mark.asyncio +async def test_postprocess_live_yields_grounding_metadata_only(): + """Test that _postprocess_live yields LlmResponse with only grounding_metadata.""" + agent = Agent(name='test_agent') + invocation_context = await testing_utils.create_invocation_context( + agent=agent + ) + flow = BaseLlmFlowForTesting() + + llm_request = LlmRequest() + grounding_metadata = types.GroundingMetadata( + web_search_queries=['test query'], + ) + llm_response = LlmResponse(grounding_metadata=grounding_metadata) + model_response_event = Event( + id=Event.new_id(), + invocation_id=invocation_context.invocation_id, + author=agent.name, + ) + + events = [] + async for event in flow._postprocess_live( + invocation_context, llm_request, llm_response, model_response_event + ): + events.append(event) + + assert len(events) == 1 + assert events[0].grounding_metadata == grounding_metadata + + +@pytest.mark.asyncio +async def test_postprocess_async_yields_grounding_metadata_only(): + """Test that _postprocess_async yields LlmResponse with only grounding_metadata.""" + agent = Agent(name='test_agent') + invocation_context = await testing_utils.create_invocation_context( + agent=agent + ) + flow = BaseLlmFlowForTesting() + + llm_request = LlmRequest() + grounding_metadata = types.GroundingMetadata( + web_search_queries=['test query'], + ) + llm_response = LlmResponse(grounding_metadata=grounding_metadata) + model_response_event = Event( + id=Event.new_id(), + invocation_id=invocation_context.invocation_id, + author=agent.name, + ) + + events = [] + async for event in flow._postprocess_async( + invocation_context, llm_request, llm_response, model_response_event + ): + events.append(event) + + assert len(events) == 1 + assert events[0].grounding_metadata == grounding_metadata + + @pytest.mark.asyncio async def test_run_live_reconnect_does_not_set_transparent(): """Test that run_live reconnect does not set transparent=True.""" diff --git a/tests/unittests/flows/llm_flows/test_basic_processor.py b/tests/unittests/flows/llm_flows/test_basic_processor.py index 5f3cd4ef44..c1712189e0 100644 --- a/tests/unittests/flows/llm_flows/test_basic_processor.py +++ b/tests/unittests/flows/llm_flows/test_basic_processor.py @@ -188,3 +188,22 @@ async def test_sets_model_name(self): # Should have set the model name assert llm_request.model == 'gemini-2.5-flash' + + @pytest.mark.asyncio + async def test_skips_output_schema_for_task_mode(self): + """Test that processor skips output_schema when agent is in task mode.""" + agent = LlmAgent( + name='test_agent', + model='gemini-2.5-flash', + mode='task', + output_schema=OutputSchema, + ) + + invocation_context = await _create_invocation_context(agent) + llm_request = LlmRequest() + processor = _BasicLlmRequestProcessor() + + async for _ in processor.run_async(invocation_context, llm_request): + pass + + assert llm_request.config.response_schema is None diff --git a/tests/unittests/flows/llm_flows/test_functions_simple.py b/tests/unittests/flows/llm_flows/test_functions_simple.py index be638de44c..71834d2c01 100644 --- a/tests/unittests/flows/llm_flows/test_functions_simple.py +++ b/tests/unittests/flows/llm_flows/test_functions_simple.py @@ -15,8 +15,11 @@ import asyncio from typing import Any from typing import Callable +from unittest import mock +from fastapi.openapi.models import HTTPBearer from google.adk.agents.llm_agent import Agent +from google.adk.auth.auth_tool import AuthConfig from google.adk.events.event import Event from google.adk.events.event_actions import EventActions from google.adk.events.ui_widget import UiWidget @@ -24,8 +27,10 @@ from google.adk.flows.llm_flows.functions import handle_function_calls_async from google.adk.flows.llm_flows.functions import handle_function_calls_live from google.adk.flows.llm_flows.functions import merge_parallel_function_response_events +from google.adk.tools.base_tool import BaseTool from google.adk.tools.computer_use.computer_use_tool import ComputerUseTool from google.adk.tools.function_tool import FunctionTool +from google.adk.tools.tool_confirmation import ToolConfirmation from google.adk.tools.tool_context import ToolContext from google.genai import types import pytest @@ -1319,3 +1324,263 @@ def simple_fn() -> dict[str, str]: assert result_parallel is not None assert result_parallel.live_session_id == 'test-live-session-id-parallel' + + +class _MockControlSignalTool(BaseTool): + """A tool that simulates requesting confirmation or OAuth authentication.""" + + def __init__(self, name: str, behavior: str): + super().__init__(name=name, description='Simulated control tool') + self.behavior = behavior + + async def run_async(self, *, args, tool_context): + if self.behavior == 'confirm': + tool_context.actions.requested_tool_confirmations = { + 'fc_test_confirm': ToolConfirmation(hint='Authorize execution?') + } + return {'error': 'This tool requires user approval.'} + elif self.behavior == 'auth': + tool_context.actions.requested_auth_configs = { + 'fc_test_auth': AuthConfig(auth_scheme=HTTPBearer()) + } + return {'error': 'Please complete OAuth setup.'} + + def _detect_error_in_response(self, response: Any) -> str | None: + if isinstance(response, dict) and 'error' in response: + return 'TOOL_ERROR' + return None + + +class _ErrorDetectingTool(BaseTool): + """A test tool whose _detect_error_in_response raises an exception.""" + + async def run_async(self, *, args, tool_context): + return {'result': 'result'} + + def _detect_error_in_response(self, response: Any) -> str | None: + raise RuntimeError('detection exploded') + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'handle_function_calls', + [ + (handle_function_calls_async), + (handle_function_calls_live), + ], +) +@pytest.mark.parametrize( + 'mock_response,expected_error_type', + [ + ({'error': 'Internal component timeout'}, 'TOOL_ERROR'), + ({'result': 'Execution succeeded'}, None), + ], + ids=['dict_error_recorded', 'success_dict_ignored'], +) +async def test_e2e_telemetry_error_classification( + monkeypatch, handle_function_calls, mock_response, expected_error_type +): + """E2E: asserts that tool outputs successfully translate to targeted OTel span error attributes.""" + recorded_calls = [] + + # Intercept trace_tool_call to capture final telemetry state + monkeypatch.setattr( + 'google.adk.telemetry._instrumentation.tracing.trace_tool_call', + lambda **kw: recorded_calls.append(kw), + ) + + tool = FunctionTool(func=lambda: mock_response) + model = testing_utils.MockModel.create(responses=[]) + agent = Agent(name='test_agent', model=model, tools=[tool]) + + invocation_context = await testing_utils.create_invocation_context( + agent=agent, user_content='' + ) + + function_call = types.FunctionCall(name=tool.name, args={}, id='fc_test') + event = Event( + invocation_id=invocation_context.invocation_id, + author=agent.name, + content=types.Content(parts=[types.Part(function_call=function_call)]), + ) + + await handle_function_calls(invocation_context, event, {tool.name: tool}) + + assert len(recorded_calls) == 1 + assert recorded_calls[0]['error_type'] == expected_error_type + assert recorded_calls[0]['error'] is None + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'handle_function_calls', + [ + (handle_function_calls_async), + (handle_function_calls_live), + ], +) +async def test_exception_takes_precedence_over_dict_error( + monkeypatch, handle_function_calls +): + """End-to-end integration: exception takes strict precedence over manual dict error_type.""" + recorded_calls = [] + monkeypatch.setattr( + 'google.adk.telemetry._instrumentation.tracing.trace_tool_call', + lambda **kw: recorded_calls.append(kw), + ) + + def mock_crashing_func(): + raise ValueError('Fatal arithmetic error') + + tool = FunctionTool(func=mock_crashing_func) + model = testing_utils.MockModel.create(responses=[]) + agent = Agent(name='test_agent', model=model, tools=[tool]) + invocation_context = await testing_utils.create_invocation_context( + agent=agent, user_content='' + ) + + function_call = types.FunctionCall( + name=tool.name, args={}, id='fc_test_exception' + ) + event = Event( + invocation_id=invocation_context.invocation_id, + author=agent.name, + content=types.Content(parts=[types.Part(function_call=function_call)]), + ) + + with pytest.raises(ValueError, match='Fatal arithmetic error'): + await handle_function_calls(invocation_context, event, {tool.name: tool}) + + assert len(recorded_calls) == 1 + assert isinstance(recorded_calls[0]['error'], ValueError) + assert recorded_calls[0]['error_type'] is None + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'handle_function_calls', + [ + (handle_function_calls_async), + (handle_function_calls_live), + ], +) +async def test_detection_skipped_when_confirmation_requested( + monkeypatch, handle_function_calls +): + """E2E confirmation verification: control prompt avoids polluting telemetry with TOOL_ERROR.""" + recorded_calls = [] + monkeypatch.setattr( + 'google.adk.telemetry._instrumentation.tracing.trace_tool_call', + lambda **kw: recorded_calls.append(kw), + ) + + tool = _MockControlSignalTool(name='confirm_tool', behavior='confirm') + model = testing_utils.MockModel.create(responses=[]) + agent = Agent(name='test_agent', model=model, tools=[tool]) + invocation_context = await testing_utils.create_invocation_context( + agent=agent, user_content='' + ) + + function_call = types.FunctionCall( + name=tool.name, args={}, id='fc_test_confirm' + ) + event = Event( + invocation_id=invocation_context.invocation_id, + author=agent.name, + content=types.Content(parts=[types.Part(function_call=function_call)]), + ) + + await handle_function_calls(invocation_context, event, {tool.name: tool}) + + assert len(recorded_calls) == 1 + assert recorded_calls[0]['error_type'] is None + assert recorded_calls[0]['error'] is None + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'handle_function_calls', + [ + (handle_function_calls_async), + (handle_function_calls_live), + ], +) +async def test_detection_skipped_when_auth_requested( + monkeypatch, handle_function_calls +): + """E2E OAuth verification: authenticate control prompt avoids polluting telemetry with TOOL_ERROR.""" + recorded_calls = [] + monkeypatch.setattr( + 'google.adk.telemetry._instrumentation.tracing.trace_tool_call', + lambda **kw: recorded_calls.append(kw), + ) + + tool = _MockControlSignalTool(name='auth_tool', behavior='auth') + model = testing_utils.MockModel.create(responses=[]) + agent = Agent(name='test_agent', model=model, tools=[tool]) + invocation_context = await testing_utils.create_invocation_context( + agent=agent, user_content='' + ) + + function_call = types.FunctionCall(name=tool.name, args={}, id='fc_test_auth') + event = Event( + invocation_id=invocation_context.invocation_id, + author=agent.name, + content=types.Content(parts=[types.Part(function_call=function_call)]), + ) + + await handle_function_calls(invocation_context, event, {tool.name: tool}) + + assert len(recorded_calls) == 1 + assert recorded_calls[0]['error_type'] is None + assert recorded_calls[0]['error'] is None + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'handle_function_calls', + [ + (handle_function_calls_async), + (handle_function_calls_live), + ], +) +async def test_detection_exception_does_not_break_tool_call( + monkeypatch, handle_function_calls +): + """Safety Verification: telemetry errors during error parsing are caught cleanly, not crashing tool calls.""" + recorded_calls = [] + monkeypatch.setattr( + 'google.adk.telemetry._instrumentation.tracing.trace_tool_call', + lambda **kw: recorded_calls.append(kw), + ) + + tool = _ErrorDetectingTool( + name='buggy_telemetry_tool', description='raises on tel' + ) + model = testing_utils.MockModel.create(responses=[]) + agent = Agent(name='test_agent', model=model, tools=[tool]) + invocation_context = await testing_utils.create_invocation_context( + agent=agent, user_content='' + ) + + function_call = types.FunctionCall( + name=tool.name, args={}, id='fc_test_buggy' + ) + event = Event( + invocation_id=invocation_context.invocation_id, + author=agent.name, + content=types.Content(parts=[types.Part(function_call=function_call)]), + ) + + result_event = await handle_function_calls( + invocation_context, event, {tool.name: tool} + ) + + assert result_event is not None + assert result_event.content.parts[0].function_response.response == { + 'result': 'result' + } + + assert len(recorded_calls) == 1 + assert recorded_calls[0]['error_type'] is None + assert recorded_calls[0]['error'] is None diff --git a/tests/unittests/flows/llm_flows/test_identity.py b/tests/unittests/flows/llm_flows/test_identity.py index c955ed362a..88826fb684 100644 --- a/tests/unittests/flows/llm_flows/test_identity.py +++ b/tests/unittests/flows/llm_flows/test_identity.py @@ -69,3 +69,26 @@ async def test_with_description(): == """\ You are an agent. Your internal name is "agent". The description about you is "test description".""" ) + + +@pytest.mark.asyncio +async def test_single_turn_agent(): + request = LlmRequest( + model="gemini-1.5-flash", + config=types.GenerateContentConfig(system_instruction=""), + ) + agent = Agent( + name="agent", + mode="single_turn", + ) + invocation_context = await testing_utils.create_invocation_context( + agent=agent + ) + + async for _ in identity.request_processor.run_async( + invocation_context, + request, + ): + pass + + assert request.config.system_instruction == "" diff --git a/tests/unittests/flows/llm_flows/test_request_confirmation.py b/tests/unittests/flows/llm_flows/test_request_confirmation.py index 39b35454b7..a4c9297f42 100644 --- a/tests/unittests/flows/llm_flows/test_request_confirmation.py +++ b/tests/unittests/flows/llm_flows/test_request_confirmation.py @@ -300,3 +300,110 @@ async def test_request_confirmation_processor_tool_not_confirmed(): assert ( args[4][MOCK_FUNCTION_CALL_ID] == user_confirmation ) # tool_confirmation_dict + + +@pytest.mark.asyncio +async def test_request_confirmation_processor_finds_user_confirmation_in_default_branch(): + """Processor finds user confirmation in default branch when agent is in child branch. + + Setup: + - Agent in 'child_branch'. + - RequestConfirmation event in 'child_branch'. + - User response event in default branch (None). + Act: Run request_processor. + Assert: Processor finds the response and triggers tool execution. + """ + # Arrange + agent = LlmAgent(name="test_agent", tools=[mock_tool]) + invocation_context = await testing_utils.create_invocation_context( + agent=agent + ) + # Set branch for the agent context + invocation_context.branch = "child_branch" + llm_request = LlmRequest() + + original_function_call = types.FunctionCall( + name=MOCK_TOOL_NAME, args={"param1": "test"}, id=MOCK_FUNCTION_CALL_ID + ) + + tool_confirmation = ToolConfirmation(confirmed=False, hint="test hint") + tool_confirmation_args = { + "originalFunctionCall": original_function_call.model_dump( + exclude_none=True, by_alias=True + ), + "toolConfirmation": tool_confirmation.model_dump( + by_alias=True, exclude_none=True + ), + } + + # Event with the request for confirmation (in child branch) + invocation_context.session.events.append( + Event( + author="agent", + branch="child_branch", + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name=functions.REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + args=tool_confirmation_args, + id=MOCK_CONFIRMATION_FUNCTION_CALL_ID, + ) + ) + ] + ), + ) + ) + + # Event with the user's confirmation (in default branch, branch=None) + user_confirmation = ToolConfirmation(confirmed=True) + invocation_context.session.events.append( + Event( + author="user", + branch=None, + content=types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name=functions.REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + id=MOCK_CONFIRMATION_FUNCTION_CALL_ID, + response={ + "response": user_confirmation.model_dump_json() + }, + ) + ) + ] + ), + ) + ) + + expected_event = Event( + author="agent", + branch="child_branch", + content=types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name=MOCK_TOOL_NAME, + id=MOCK_FUNCTION_CALL_ID, + response={"result": "Mock tool result with test"}, + ) + ) + ] + ), + ) + + # Act & Assert + with patch( + "google.adk.flows.llm_flows.functions.handle_function_call_list_async" + ) as mock_handle_function_call_list_async: + mock_handle_function_call_list_async.return_value = expected_event + + events = [] + async for event in request_processor.run_async( + invocation_context, llm_request + ): + events.append(event) + + assert len(events) == 1 + assert events[0] == expected_event diff --git a/tests/unittests/integrations/bigquery/test_bigquery_credentials.py b/tests/unittests/integrations/bigquery/test_bigquery_credentials.py index da4acbd463..b7072b0ba1 100644 --- a/tests/unittests/integrations/bigquery/test_bigquery_credentials.py +++ b/tests/unittests/integrations/bigquery/test_bigquery_credentials.py @@ -30,7 +30,6 @@ class TestBigQueryCredentials: def test_valid_credentials_object_auth_credentials(self): """Test that providing valid Credentials object works correctly with - google.auth.credentials.Credentials. When a user already has valid OAuth credentials, they should be able @@ -53,7 +52,6 @@ def test_valid_credentials_object_auth_credentials(self): def test_valid_credentials_object_oauth2_credentials(self): """Test that providing valid Credentials object works correctly with - google.oauth2.credentials.Credentials. When a user already has valid OAuth credentials, they should be able diff --git a/tests/unittests/integrations/bigquery/test_bigquery_query_tool.py b/tests/unittests/integrations/bigquery/test_bigquery_query_tool.py index fd0083e64d..3a851014a8 100644 --- a/tests/unittests/integrations/bigquery/test_bigquery_query_tool.py +++ b/tests/unittests/integrations/bigquery/test_bigquery_query_tool.py @@ -114,8 +114,7 @@ async def test_execute_sql_declaration_read_only(tool_settings): >>> execute_sql("my_project", ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY - island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") { "status": "SUCCESS", "rows": [ @@ -155,8 +154,7 @@ async def test_execute_sql_declaration_read_only(tool_settings): "tableId": "anon..." }, "priority": "INTERACTIVE", - "query": "SELECT island FROM - `bigquery-public-data`.`ml_datasets`.`penguins`", + "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", "useLegacySql": False, "writeDisposition": "WRITE_TRUNCATE" } @@ -215,8 +213,7 @@ async def test_execute_sql_declaration_write(tool_settings): >>> execute_sql("my_project", ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY - island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") { "status": "SUCCESS", "rows": [ @@ -256,8 +253,7 @@ async def test_execute_sql_declaration_write(tool_settings): "tableId": "anon..." }, "priority": "INTERACTIVE", - "query": "SELECT island FROM - `bigquery-public-data`.`ml_datasets`.`penguins`", + "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", "useLegacySql": False, "writeDisposition": "WRITE_TRUNCATE" } @@ -282,8 +278,7 @@ async def test_execute_sql_declaration_write(tool_settings): Insert data into an existing table: >>> execute_sql("my_project", - ... "INSERT INTO `my_project`.`my_dataset`.`my_table` (island, - population) " + ... "INSERT INTO `my_project`.`my_dataset`.`my_table` (island, population) " ... "VALUES ('Dream', 124), ('Biscoe', 168)") { "status": "SUCCESS", @@ -295,8 +290,7 @@ async def test_execute_sql_declaration_write(tool_settings): >>> execute_sql("my_project", ... "CREATE TABLE `my_project`.`my_dataset`.`my_table` AS " ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY - island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") { "status": "SUCCESS", "rows": [] @@ -325,8 +319,7 @@ async def test_execute_sql_declaration_write(tool_settings): table: >>> execute_sql("my_project", - ... "CREATE SNAPSHOT TABLE - `my_project`.`my_dataset`.`my_table_snapshot` " + ... "CREATE SNAPSHOT TABLE `my_project`.`my_dataset`.`my_table_snapshot` " ... "CLONE `my_project`.`my_dataset`.`my_table`") { "status": "SUCCESS", @@ -337,8 +330,7 @@ async def test_execute_sql_declaration_write(tool_settings): >>> execute_sql("my_project", ... "CREATE MODEL `my_dataset`.`my_model` " - ... "OPTIONS (model_type='linear_reg', - input_label_cols=['body_mass_g']) AS " + ... "OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS " ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " ... "WHERE body_mass_g IS NOT NULL") { @@ -458,8 +450,7 @@ async def test_execute_sql_declaration_protected_write(tool_settings): >>> execute_sql("my_project", ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY - island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") { "status": "SUCCESS", "rows": [ @@ -499,8 +490,7 @@ async def test_execute_sql_declaration_protected_write(tool_settings): "tableId": "anon..." }, "priority": "INTERACTIVE", - "query": "SELECT island FROM - `bigquery-public-data`.`ml_datasets`.`penguins`", + "query": "SELECT island FROM `bigquery-public-data`.`ml_datasets`.`penguins`", "useLegacySql": False, "writeDisposition": "WRITE_TRUNCATE" } @@ -536,8 +526,7 @@ async def test_execute_sql_declaration_protected_write(tool_settings): >>> execute_sql("my_project", ... "CREATE TEMP TABLE `my_table` AS " ... "SELECT island, COUNT(*) AS population " - ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY - island") + ... "FROM `bigquery-public-data`.`ml_datasets`.`penguins` GROUP BY island") { "status": "SUCCESS", "rows": [] @@ -564,8 +553,7 @@ async def test_execute_sql_declaration_protected_write(tool_settings): >>> execute_sql("my_project", ... "CREATE TEMP MODEL `my_model` " - ... "OPTIONS (model_type='linear_reg', - input_label_cols=['body_mass_g']) AS" + ... "OPTIONS (model_type='linear_reg', input_label_cols=['body_mass_g']) AS" ... "SELECT * FROM `bigquery-public-data`.`ml_datasets`.`penguins` " ... "WHERE body_mass_g IS NOT NULL") { @@ -575,8 +563,7 @@ async def test_execute_sql_declaration_protected_write(tool_settings): Evaluate BigQuery ML model: - >>> execute_sql("my_project", "SELECT * FROM ML.EVALUATE(MODEL - `my_model`)") + >>> execute_sql("my_project", "SELECT * FROM ML.EVALUATE(MODEL `my_model`)") { "status": "SUCCESS", "rows": [{'mean_absolute_error': 227.01223667447218, diff --git a/tests/unittests/integrations/firestore/test_firestore_session_service.py b/tests/unittests/integrations/firestore/test_firestore_session_service.py index 1445bfe0ef..4d202e1500 100644 --- a/tests/unittests/integrations/firestore/test_firestore_session_service.py +++ b/tests/unittests/integrations/firestore/test_firestore_session_service.py @@ -386,6 +386,15 @@ async def test_append_event_with_temp_state(mock_firestore_client): assert "temp:k1" not in event_data["actions"]["state_delta"] assert event_data["actions"]["state_delta"]["session_key"] == "session_val" + # 3. Verify temp keys are NOT written to session state in Firestore + transaction.update.assert_called_once() + update_args, _ = transaction.update.call_args + persisted_state = update_args[1]["state"] + assert ( + "temp:k1" not in persisted_state + ), "temp: keys must not be persisted to Firestore session state" + assert "session_key" in persisted_state + @pytest.mark.asyncio async def test_list_sessions_with_user_id(mock_firestore_client): diff --git a/tests/unittests/labs/__init__.py b/tests/unittests/labs/__init__.py new file mode 100644 index 0000000000..58d482ea38 --- /dev/null +++ b/tests/unittests/labs/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/unittests/labs/openai/__init__.py b/tests/unittests/labs/openai/__init__.py new file mode 100644 index 0000000000..58d482ea38 --- /dev/null +++ b/tests/unittests/labs/openai/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/unittests/labs/openai/test_openai_llm.py b/tests/unittests/labs/openai/test_openai_llm.py new file mode 100644 index 0000000000..59c1033f01 --- /dev/null +++ b/tests/unittests/labs/openai/test_openai_llm.py @@ -0,0 +1,351 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +import os +from unittest import mock + +from google.adk.labs.openai._openai_llm import _function_declaration_to_openai_tool +from google.adk.labs.openai._openai_llm import _part_to_openai_content +from google.adk.labs.openai._openai_llm import _update_type_string +from google.adk.labs.openai._openai_llm import OpenAILlm +from google.adk.models.llm_request import LlmRequest +from google.adk.models.llm_response import LlmResponse +from google.genai import types +from google.genai.types import Content +from google.genai.types import Part +import pytest + + +def test_supported_models(): + models = OpenAILlm.supported_models() + assert len(models) == 3 + assert models[0] == r"gpt-.*" + assert models[1] == r"o1-.*" + assert models[2] == r"o3-.*" + + +def test_update_type_string(): + schema = { + "type": "OBJECT", + "properties": { + "name": {"type": "STRING"}, + "age": {"type": "INTEGER"}, + "tags": {"type": "ARRAY", "items": {"type": "STRING"}}, + }, + } + _update_type_string(schema) + assert schema["type"] == "object" + assert schema["properties"]["name"]["type"] == "string" + assert schema["properties"]["age"]["type"] == "integer" + assert schema["properties"]["tags"]["type"] == "array" + assert schema["properties"]["tags"]["items"]["type"] == "string" + + +def test_function_declaration_to_openai_tool(): + fd = types.FunctionDeclaration( + name="get_weather", + description="Get weather", + parameters=types.Schema( + type=types.Type.OBJECT, + properties={"location": types.Schema(type=types.Type.STRING)}, + required=["location"], + ), + ) + tool = _function_declaration_to_openai_tool(fd) + assert tool["type"] == "function" + assert tool["function"]["name"] == "get_weather" + assert tool["function"]["parameters"]["type"] == "object" + assert ( + tool["function"]["parameters"]["properties"]["location"]["type"] + == "string" + ) + assert tool["function"]["parameters"]["required"] == ["location"] + + +def test_part_to_openai_content(): + # Test text part + part = types.Part.from_text(text="Hello") + content = _part_to_openai_content(part) + assert content == "Hello" + + # Test thought part + part = types.Part.from_text(text="I am thinking") + part.thought = True + content = _part_to_openai_content(part) + assert content == "Thought: I am thinking" + + # Test image part (inline data) + part = types.Part( + inline_data=types.Blob(data=b"fake_data", mime_type="image/png") + ) + content = _part_to_openai_content(part) + assert isinstance(content, dict) + assert content["type"] == "image_url" + assert content["image_url"]["url"].startswith("data:image/png;base64,") + + +def test_content_to_openai_messages_with_empty_response(): + from google.adk.labs.openai._openai_llm import _content_to_openai_messages + + # Test with empty dict response + content = types.Content( + role="tool", + parts=[ + types.Part( + function_response=types.FunctionResponse( + id="call_123", + name="get_weather", + response={}, + ) + ) + ], + ) + messages = _content_to_openai_messages(content) + assert len(messages) == 1 + assert messages[0]["role"] == "tool" + assert messages[0]["tool_call_id"] == "call_123" + assert messages[0]["content"] == "{}" + + # Test with None response + content = types.Content( + role="tool", + parts=[ + types.Part( + function_response=types.FunctionResponse( + id="call_123", + name="get_weather", + response=None, + ) + ) + ], + ) + messages = _content_to_openai_messages(content) + assert len(messages) == 1 + assert messages[0]["content"] == "" + + +@pytest.mark.asyncio +async def test_generate_content_async(): + with mock.patch.dict(os.environ, {"OPENAI_API_KEY": "test_key"}): + openai_llm = OpenAILlm(model="gpt-4o") + llm_request = LlmRequest( + model="gpt-4o", + contents=[Content(role="user", parts=[Part.from_text(text="Hello")])], + ) + + mock_response = mock.MagicMock() + mock_choice = mock.MagicMock() + mock_message = mock.MagicMock() + mock_message.content = "Hello there!" + mock_message.tool_calls = None + mock_choice.message = mock_message + mock_response.choices = [mock_choice] + mock_response.usage.prompt_tokens = 10 + mock_response.usage.completion_tokens = 5 + mock_response.usage.total_tokens = 15 + + async def mock_create(*args, **kwargs): + return mock_response + + with mock.patch( + "google.adk.labs.openai._openai_llm.AsyncOpenAI" + ) as mock_client_class: + mock_client = mock.MagicMock() + mock_client_class.return_value = mock_client + mock_client.chat.completions.create = mock_create + + responses = [ + resp + async for resp in openai_llm.generate_content_async( + llm_request, stream=False + ) + ] + + assert len(responses) == 1 + assert isinstance(responses[0], LlmResponse) + assert responses[0].content.parts[0].text == "Hello there!" + assert responses[0].usage_metadata.total_token_count == 15 + + +@pytest.mark.asyncio +async def test_generate_content_async_with_config(): + with mock.patch.dict(os.environ, {"OPENAI_API_KEY": "test_key"}): + openai_llm = OpenAILlm(model="gpt-4o") + llm_request = LlmRequest( + model="gpt-4o", + contents=[Content(role="user", parts=[Part.from_text(text="Hello")])], + config=types.GenerateContentConfig( + temperature=0.7, + top_p=0.9, + stop_sequences=["STOP"], + max_output_tokens=100, + ), + ) + + mock_response = mock.MagicMock() + mock_choice = mock.MagicMock() + mock_message = mock.MagicMock() + mock_message.content = "Hello there!" + mock_message.tool_calls = None + mock_choice.message = mock_message + mock_response.choices = [mock_choice] + mock_call = mock.MagicMock(return_value=mock_response) + mock_response.usage.prompt_tokens = 10 + mock_response.usage.completion_tokens = 5 + mock_response.usage.total_tokens = 15 + + create_kwargs = {} + + async def mock_create(*args, **kwargs): + nonlocal create_kwargs + create_kwargs = kwargs + return mock_response + + with mock.patch( + "google.adk.labs.openai._openai_llm.AsyncOpenAI" + ) as mock_client_class: + mock_client = mock.MagicMock() + mock_client_class.return_value = mock_client + mock_client.chat.completions.create = mock_create + + responses = [ + resp + async for resp in openai_llm.generate_content_async( + llm_request, stream=False + ) + ] + + assert len(responses) == 1 + assert create_kwargs["temperature"] == 0.7 + assert create_kwargs["top_p"] == 0.9 + assert create_kwargs["stop"] == ["STOP"] + assert create_kwargs["max_tokens"] == 100 + + +@pytest.mark.asyncio +async def test_generate_content_async_with_system_instruction(): + with mock.patch.dict(os.environ, {"OPENAI_API_KEY": "test_key"}): + openai_llm = OpenAILlm(model="gpt-4o") + llm_request = LlmRequest( + model="gpt-4o", + contents=[Content(role="user", parts=[Part.from_text(text="Hello")])], + config=types.GenerateContentConfig( + system_instruction="You are a helpful assistant.", + ), + ) + + mock_response = mock.MagicMock() + mock_choice = mock.MagicMock() + mock_message = mock.MagicMock() + mock_message.content = "Hello there!" + mock_message.tool_calls = None + mock_choice.message = mock_message + mock_response.choices = [mock_choice] + mock_response.usage.prompt_tokens = 10 + mock_response.usage.completion_tokens = 5 + mock_response.usage.total_tokens = 15 + + create_kwargs = {} + + async def mock_create(*args, **kwargs): + nonlocal create_kwargs + create_kwargs = kwargs + return mock_response + + with mock.patch( + "google.adk.labs.openai._openai_llm.AsyncOpenAI" + ) as mock_client_class: + mock_client = mock.MagicMock() + mock_client_class.return_value = mock_client + mock_client.chat.completions.create = mock_create + + responses = [ + resp + async for resp in openai_llm.generate_content_async( + llm_request, stream=False + ) + ] + + assert len(responses) == 1 + messages = create_kwargs["messages"] + assert len(messages) == 2 + assert messages[0]["role"] == "system" + assert messages[0]["content"] == "You are a helpful assistant." + assert messages[1]["role"] == "user" + assert messages[1]["content"] == "Hello" + + +@pytest.mark.asyncio +async def test_generate_content_async_with_image(): + with mock.patch.dict(os.environ, {"OPENAI_API_KEY": "test_key"}): + openai_llm = OpenAILlm(model="gpt-4o") + + image_part = Part( + inline_data=types.Blob(data=b"fake_image_data", mime_type="image/png") + ) + + llm_request = LlmRequest( + model="gpt-4o", + contents=[ + Content( + role="user", + parts=[Part.from_text(text="Analyze this"), image_part], + ) + ], + ) + + mock_response = mock.MagicMock() + mock_choice = mock.MagicMock() + mock_message = mock.MagicMock() + mock_message.content = "It's an image." + mock_message.tool_calls = None + mock_choice.message = mock_message + mock_response.choices = [mock_choice] + mock_response.usage.prompt_tokens = 10 + mock_response.usage.completion_tokens = 5 + mock_response.usage.total_tokens = 15 + + create_kwargs = {} + + async def mock_create(*args, **kwargs): + nonlocal create_kwargs + create_kwargs = kwargs + return mock_response + + with mock.patch( + "google.adk.labs.openai._openai_llm.AsyncOpenAI" + ) as mock_client_class: + mock_client = mock.MagicMock() + mock_client_class.return_value = mock_client + mock_client.chat.completions.create = mock_create + + responses = [ + resp + async for resp in openai_llm.generate_content_async( + llm_request, stream=False + ) + ] + + assert len(responses) == 1 + messages = create_kwargs["messages"] + assert len(messages) == 1 + assert messages[0]["role"] == "user" + content = messages[0]["content"] + assert isinstance(content, list) + assert len(content) == 2 + assert content[0]["type"] == "text" + assert content[0]["text"] == "Analyze this" + assert content[1]["type"] == "image_url" + assert content[1]["image_url"]["url"].startswith("data:image/png;base64,") diff --git a/tests/unittests/models/test_gemini_llm_connection.py b/tests/unittests/models/test_gemini_llm_connection.py index 133a455738..f164e2ebd1 100644 --- a/tests/unittests/models/test_gemini_llm_connection.py +++ b/tests/unittests/models/test_gemini_llm_connection.py @@ -285,11 +285,17 @@ async def mock_receive_generator(): @pytest.mark.asyncio +@pytest.mark.parametrize( + 'conn_fixture', + ['gemini_api_connection', 'gemini_connection'], +) async def test_receive_transcript_finished_on_interrupt( - gemini_api_connection, + conn_fixture, mock_gemini_session, + request, ): """Test receive finishes transcription on interrupt signal.""" + connection = request.getfixturevalue(conn_fixture) message1 = mock.Mock() message1.usage_metadata = None @@ -345,7 +351,7 @@ async def mock_receive_generator(): receive_mock = mock.Mock(return_value=mock_receive_generator()) mock_gemini_session.receive = receive_mock - responses = [resp async for resp in gemini_api_connection.receive()] + responses = [resp async for resp in connection.receive()] assert len(responses) == 5 assert responses[4].interrupted is True @@ -365,11 +371,17 @@ async def mock_receive_generator(): @pytest.mark.asyncio +@pytest.mark.parametrize( + 'conn_fixture', + ['gemini_api_connection', 'gemini_connection'], +) async def test_receive_transcript_finished_on_generation_complete( - gemini_api_connection, + conn_fixture, mock_gemini_session, + request, ): """Test receive finishes transcription on generation_complete signal.""" + connection = request.getfixturevalue(conn_fixture) message1 = mock.Mock() message1.usage_metadata = None @@ -425,7 +437,7 @@ async def mock_receive_generator(): receive_mock = mock.Mock(return_value=mock_receive_generator()) mock_gemini_session.receive = receive_mock - responses = [resp async for resp in gemini_api_connection.receive()] + responses = [resp async for resp in connection.receive()] assert len(responses) == 4 @@ -444,11 +456,17 @@ async def mock_receive_generator(): @pytest.mark.asyncio +@pytest.mark.parametrize( + 'conn_fixture', + ['gemini_api_connection', 'gemini_connection'], +) async def test_receive_transcript_finished_on_turn_complete( - gemini_api_connection, + conn_fixture, mock_gemini_session, + request, ): """Test receive finishes transcription on interrupt or complete signals.""" + connection = request.getfixturevalue(conn_fixture) message1 = mock.Mock() message1.usage_metadata = None @@ -504,7 +522,7 @@ async def mock_receive_generator(): receive_mock = mock.Mock(return_value=mock_receive_generator()) mock_gemini_session.receive = receive_mock - responses = [resp async for resp in gemini_api_connection.receive()] + responses = [resp async for resp in connection.receive()] assert len(responses) == 5 assert responses[4].turn_complete is True @@ -867,6 +885,7 @@ async def test_receive_grounding_metadata_standalone( mock_server_content.interrupted = False mock_server_content.input_transcription = None mock_server_content.output_transcription = None + mock_server_content.generation_complete = False mock_message = mock.create_autospec(types.LiveServerMessage, instance=True) mock_message.usage_metadata = None @@ -911,6 +930,7 @@ async def test_receive_grounding_metadata_with_content( mock_server_content.interrupted = False mock_server_content.input_transcription = None mock_server_content.output_transcription = None + mock_server_content.generation_complete = False mock_message = mock.create_autospec(types.LiveServerMessage, instance=True) mock_message.usage_metadata = None @@ -981,6 +1001,7 @@ async def test_receive_tool_call_and_grounding_metadata_with_native_audio( mock_server_content.interrupted = False mock_server_content.input_transcription = None mock_server_content.output_transcription = None + mock_server_content.generation_complete = False mock_metadata_msg = mock.create_autospec( types.LiveServerMessage, instance=True @@ -1001,6 +1022,7 @@ async def test_receive_tool_call_and_grounding_metadata_with_native_audio( mock_turn_complete_content.interrupted = False mock_turn_complete_content.input_transcription = None mock_turn_complete_content.output_transcription = None + mock_turn_complete_content.generation_complete = False mock_turn_complete_msg = mock.create_autospec( types.LiveServerMessage, instance=True @@ -1202,6 +1224,87 @@ async def mock_receive_generator(): assert responses[0].go_away == mock_go_away +@pytest.mark.asyncio +async def test_receive_aggregates_thoughts_separately( + gemini_connection, mock_gemini_session +): + """Test receive aggregates thoughts and regular text separately.""" + + part1 = types.Part.from_text(text='thought 1') + part1.thought = True + message1 = types.LiveServerMessage( + server_content=types.LiveServerContent( + model_turn=types.Content(role='model', parts=[part1]), + ) + ) + + part2 = types.Part.from_text(text=' thought 2') + part2.thought = True + message2 = types.LiveServerMessage( + server_content=types.LiveServerContent( + model_turn=types.Content(role='model', parts=[part2]), + ) + ) + + part3 = types.Part.from_text(text='answer') + part3.thought = False + message3 = types.LiveServerMessage( + server_content=types.LiveServerContent( + model_turn=types.Content(role='model', parts=[part3]), + ) + ) + + message4 = types.LiveServerMessage( + server_content=types.LiveServerContent( + turn_complete=True, + ) + ) + + async def mock_receive_generator(): + yield message1 + yield message2 + yield message3 + yield message4 + + receive_mock = mock.Mock(return_value=mock_receive_generator()) + mock_gemini_session.receive = receive_mock + + responses = [resp async for resp in gemini_connection.receive()] + + # Expected responses: + # 1. Message 1 (partial thought) + # 2. Message 2 (partial thought) + # 3. Aggregated thought (full) + # 4. Message 3 (partial answer) + # 5. Aggregated answer (full) + # 6. Turn complete message + + assert len(responses) == 6 + + # Check partials + assert responses[0].content.parts[0].text == 'thought 1' + assert responses[0].partial is True + assert responses[1].content.parts[0].text == ' thought 2' + assert responses[1].partial is True + + # Check aggregated thought + assert responses[2].content.parts[0].text == 'thought 1 thought 2' + assert responses[2].content.parts[0].thought is True + assert responses[2].partial is False + + # Check partial answer + assert responses[3].content.parts[0].text == 'answer' + assert responses[3].partial is True + + # Check aggregated answer + assert responses[4].content.parts[0].text == 'answer' + assert not getattr(responses[4].content.parts[0], 'thought', False) + assert responses[4].partial is False + + # Check turn complete + assert responses[5].turn_complete is True + + @pytest.mark.asyncio async def test_receive_video_content(gemini_connection, mock_gemini_session): """Test receive with video content.""" @@ -1240,3 +1343,200 @@ async def mock_receive_generator(): content_response = next((r for r in responses if r.content), None) assert content_response is not None assert content_response.content == mock_content + + +@pytest.mark.asyncio +async def test_receive_grounding_metadata_pending( + gemini_connection, mock_gemini_session +): + """Test that grounding metadata in partial chunks is pending and yielded on full text.""" + grounding_metadata = types.GroundingMetadata( + web_search_queries=['stock price of google'], + ) + + def make_msg(text=None, g_meta=None, tc=False): + msg = mock.Mock( + usage_metadata=None, + tool_call=None, + session_resumption_update=None, + go_away=None, + ) + msg.server_content = mock.Mock( + interrupted=False, + input_transcription=None, + output_transcription=None, + generation_complete=False, + turn_complete=tc, + grounding_metadata=g_meta, + model_turn=types.Content( + role='model', parts=[types.Part.from_text(text=text)] + ) + if text + else None, + ) + return msg + + msg1 = make_msg(text='hello', g_meta=grounding_metadata) + msg2 = make_msg(text=' world') + msg3 = make_msg(tc=True) + + async def gen(): + yield msg1 + yield msg2 + yield msg3 + + mock_gemini_session.receive = mock.Mock(return_value=gen()) + + responses = [resp async for resp in gemini_connection.receive()] + + # Expected responses: + # 1. Msg 1 partial (hello) with grounding_metadata + # 2. Msg 2 partial ( world) without grounding_metadata + # 3. Full text response (hello world) with PENDING grounding_metadata + # 4. Turn complete response without grounding_metadata (already cleared) + assert len(responses) == 4 + + assert responses[0].content.parts[0].text == 'hello' + assert responses[0].partial is True + assert responses[0].grounding_metadata == grounding_metadata + + assert responses[1].content.parts[0].text == ' world' + assert responses[1].partial is True + assert responses[1].grounding_metadata is None + + assert responses[2].content.parts[0].text == 'hello world' + assert responses[2].partial is False + assert responses[2].grounding_metadata == grounding_metadata + + assert responses[3].turn_complete is True + assert responses[3].grounding_metadata is None + + +@pytest.mark.asyncio +async def test_receive_populates_turn_complete_reason( + gemini_connection, mock_gemini_session +): + """Test that receive populates turn_complete_reason in LlmResponse.""" + mock_server_content = mock.create_autospec( + types.LiveServerContent, instance=True + ) + mock_server_content.model_turn = None + mock_server_content.grounding_metadata = None + mock_server_content.turn_complete = True + mock_server_content.interrupted = False + mock_server_content.input_transcription = None + mock_server_content.output_transcription = None + mock_server_content.generation_complete = False + mock_server_content.turn_complete_reason = ( + types.TurnCompleteReason.RESPONSE_REJECTED + ) + + mock_message = mock.create_autospec(types.LiveServerMessage, instance=True) + mock_message.usage_metadata = None + mock_message.server_content = mock_server_content + mock_message.tool_call = None + mock_message.session_resumption_update = None + mock_message.go_away = None + + async def mock_receive_generator(): + yield mock_message + + mock_gemini_session.receive = mock.Mock(return_value=mock_receive_generator()) + + responses = [resp async for resp in gemini_connection.receive()] + + assert len(responses) == 1 + assert responses[0].turn_complete is True + assert ( + responses[0].turn_complete_reason + == types.TurnCompleteReason.RESPONSE_REJECTED + ) + + +@pytest.mark.asyncio +async def test_receive_populates_turn_complete_reason_standalone_grounding( + gemini_connection, mock_gemini_session +): + """Test that receive populates turn_complete_reason in LlmResponse for standalone grounding metadata.""" + mock_server_content = mock.create_autospec( + types.LiveServerContent, instance=True + ) + mock_server_content.model_turn = None + mock_server_content.grounding_metadata = mock.create_autospec( + types.GroundingMetadata, instance=True + ) + mock_server_content.turn_complete = False + mock_server_content.interrupted = False + mock_server_content.input_transcription = None + mock_server_content.output_transcription = None + mock_server_content.generation_complete = False + mock_server_content.turn_complete_reason = ( + types.TurnCompleteReason.RESPONSE_REJECTED + ) + + mock_message = mock.create_autospec(types.LiveServerMessage, instance=True) + mock_message.usage_metadata = None + mock_message.server_content = mock_server_content + mock_message.tool_call = None + mock_message.session_resumption_update = None + mock_message.go_away = None + + async def mock_receive_generator(): + yield mock_message + + mock_gemini_session.receive = mock.Mock(return_value=mock_receive_generator()) + + responses = [resp async for resp in gemini_connection.receive()] + + assert len(responses) == 1 + assert responses[0].grounding_metadata is not None + assert responses[0].turn_complete is None + assert ( + responses[0].turn_complete_reason + == types.TurnCompleteReason.RESPONSE_REJECTED + ) + + +@pytest.mark.asyncio +async def test_receive_populates_turn_complete_reason_with_content( + gemini_connection, mock_gemini_session +): + """Test that receive populates turn_complete_reason in LlmResponse when model turn has content parts.""" + mock_content = types.Content( + role='model', + parts=[types.Part.from_text(text='hello')], + ) + mock_server_content = mock.create_autospec( + types.LiveServerContent, instance=True + ) + mock_server_content.model_turn = mock_content + mock_server_content.grounding_metadata = None + mock_server_content.turn_complete = False + mock_server_content.interrupted = False + mock_server_content.input_transcription = None + mock_server_content.output_transcription = None + mock_server_content.generation_complete = False + mock_server_content.turn_complete_reason = ( + types.TurnCompleteReason.RESPONSE_REJECTED + ) + + mock_message = mock.create_autospec(types.LiveServerMessage, instance=True) + mock_message.usage_metadata = None + mock_message.server_content = mock_server_content + mock_message.tool_call = None + mock_message.session_resumption_update = None + mock_message.go_away = None + + async def mock_receive_generator(): + yield mock_message + + mock_gemini_session.receive = mock.Mock(return_value=mock_receive_generator()) + + responses = [resp async for resp in gemini_connection.receive()] + + assert len(responses) == 1 + assert responses[0].content == mock_content + assert ( + responses[0].turn_complete_reason + == types.TurnCompleteReason.RESPONSE_REJECTED + ) diff --git a/tests/unittests/models/test_interactions_utils.py b/tests/unittests/models/test_interactions_utils.py index 118a925ab6..3d35ef383b 100644 --- a/tests/unittests/models/test_interactions_utils.py +++ b/tests/unittests/models/test_interactions_utils.py @@ -20,16 +20,26 @@ from datetime import datetime from datetime import timezone import json -from types import SimpleNamespace from unittest.mock import MagicMock from google.adk.models import interactions_utils from google.adk.models.llm_request import LlmRequest +from google.genai import interactions from google.genai import types -from google.genai._interactions.types.interaction import Interaction -from google.genai._interactions.types.interaction_complete_event import InteractionCompleteEvent -from google.genai._interactions.types.interaction_start_event import InteractionStartEvent -from google.genai._interactions.types.interaction_status_update import InteractionStatusUpdate +from google.genai.interactions import CodeExecutionResultStep +from google.genai.interactions import FunctionCallStep +from google.genai.interactions import FunctionResultStep +from google.genai.interactions import ImageContent +from google.genai.interactions import Interaction +from google.genai.interactions import InteractionCompletedEvent +from google.genai.interactions import InteractionCreatedEvent +from google.genai.interactions import ModelOutputStep +from google.genai.interactions import StepDelta +from google.genai.interactions import StepStart +from google.genai.interactions import StepStop +from google.genai.interactions import TextContent +from google.genai.interactions import ThoughtStep +from google.genai.interactions import Usage import pytest @@ -73,21 +83,6 @@ def __init__(self, events: list[object]): self.aio = _FakeAio(events) -def _build_function_call_delta_event( - *, function_id: str, name: str, arguments: dict[str, object] -) -> SimpleNamespace: - """Build a version-agnostic content.delta event for a function call.""" - return SimpleNamespace( - event_type='content.delta', - delta=SimpleNamespace( - type='function_call', - id=function_id, - name=name, - arguments=arguments, - ), - ) - - def _build_llm_request() -> LlmRequest: """Build a minimal request for interactions streaming tests.""" return LlmRequest( @@ -102,69 +97,75 @@ def _build_llm_request() -> LlmRequest: ) -def _build_lifecycle_streamed_events() -> list[object]: +@pytest.fixture +def fc_step() -> FunctionCallStep: + """Fixture providing a basic FunctionCallStep.""" + return FunctionCallStep( + type='function_call', + id='call_1', + name='get_weather', + arguments={'city': 'Tokyo'}, + ) + + +def _build_lifecycle_streamed_events(fc_step: FunctionCallStep) -> list[object]: """Build streamed events with lifecycle updates carrying the ID.""" now = datetime.now(timezone.utc) + + interaction = Interaction( + id='interaction_123', + created=now, + updated=now, + status='requires_action', + steps=[fc_step], + ) + return [ - InteractionStartEvent( - event_type='interaction.start', - interaction=Interaction( - id='interaction_123', - created=now, - updated=now, - status='in_progress', - ), + InteractionCreatedEvent( + event_type='interaction.created', + interaction=interaction, ), - _build_function_call_delta_event( - function_id='call_1', - name='get_weather', - arguments={'city': 'Tokyo'}, - ), - InteractionStatusUpdate( - event_type='interaction.status_update', - interaction_id='interaction_123', - status='requires_action', + InteractionCompletedEvent( + event_type='interaction.completed', + interaction=interaction, ), ] -def _build_complete_streamed_events() -> list[object]: +def _build_complete_streamed_events(fc_step: FunctionCallStep) -> list[object]: """Build streamed events with the ID on an interaction.complete event.""" now = datetime.now(timezone.utc) + + interaction = Interaction( + id='interaction_complete_123', + created=now, + updated=now, + status='requires_action', + steps=[fc_step], + ) + return [ - _build_function_call_delta_event( - function_id='call_1', - name='get_weather', - arguments={'city': 'Tokyo'}, - ), - InteractionCompleteEvent( - event_type='interaction.complete', - interaction=Interaction( - id='interaction_complete_123', - created=now, - updated=now, - status='requires_action', - ), + InteractionCompletedEvent( + event_type='interaction.completed', + interaction=interaction, ), ] -def _build_legacy_streamed_events() -> list[object]: +def _build_legacy_streamed_events(fc_step: FunctionCallStep) -> list[object]: """Build streamed events with the ID on the legacy interaction event.""" + now = datetime.now(timezone.utc) + + interaction = Interaction( + id='interaction_legacy_123', + created=now, + updated=now, + status='requires_action', + steps=[fc_step], + ) + return [ - _build_function_call_delta_event( - function_id='call_1', - name='get_weather', - arguments={'city': 'Tokyo'}, - ), - SimpleNamespace( - event_type='interaction', - id='interaction_legacy_123', - status='requires_action', - error=None, - outputs=None, - usage=None, - ), + interaction, ] @@ -194,13 +195,27 @@ async def _collect_function_call_interaction_ids( class TestConvertPartToInteractionContent: - """Tests for convert_part_to_interaction_content.""" + """Tests for _convert_part_to_interaction_content.""" def test_text_part(self): """Test converting a text Part.""" part = types.Part(text='Hello, world!') - result = interactions_utils.convert_part_to_interaction_content(part) - assert result == {'type': 'text', 'text': 'Hello, world!'} + result = interactions_utils._convert_part_to_interaction_content(part) + assert result == { + 'type': 'user_input', + 'content': [{'type': 'text', 'text': 'Hello, world!'}], + } + + def test_text_part_model_role(self): + """Test converting a text Part for model role.""" + part = types.Part(text='Hello, user!') + result = interactions_utils._convert_part_to_interaction_content( + part, role='model' + ) + assert result == { + 'type': 'model_output', + 'content': [{'type': 'text', 'text': 'Hello, user!'}], + } def test_function_call_part(self): """Test converting a function call Part.""" @@ -211,7 +226,7 @@ def test_function_call_part(self): args={'city': 'London'}, ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result == { 'type': 'function_call', 'id': 'call_123', @@ -227,7 +242,7 @@ def test_function_call_part_no_id(self): args={'city': 'London'}, ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result['id'] == '' assert result['name'] == 'get_weather' @@ -241,17 +256,15 @@ def test_function_call_part_with_thought_signature(self): ), thought_signature=b'test_signature_bytes', ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result['type'] == 'function_call' assert result['id'] == 'call_456' assert result['name'] == 'my_tool' assert result['arguments'] == {'doc': 'content'} - # thought_signature should be base64 encoded - assert 'thought_signature' in result + # signature should be base64 encoded + assert 'signature' in result - assert ( - base64.b64decode(result['thought_signature']) == b'test_signature_bytes' - ) + assert base64.b64decode(result['signature']) == b'test_signature_bytes' def test_function_call_part_without_thought_signature(self): """Test converting a function call Part without thought_signature.""" @@ -262,10 +275,10 @@ def test_function_call_part_without_thought_signature(self): args={}, ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result['type'] == 'function_call' - # thought_signature should not be present - assert 'thought_signature' not in result + # signature should not be present + assert 'signature' not in result def test_function_response_dict(self): """Test converting a function response Part with dict response.""" @@ -276,13 +289,15 @@ def test_function_response_dict(self): response={'temperature': 20, 'condition': 'sunny'}, ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result['type'] == 'function_result' assert result['call_id'] == 'call_123' assert result['name'] == 'get_weather' - # Dict should be passed through directly (not JSON-serialized). - assert result['result'] == {'temperature': 20, 'condition': 'sunny'} - assert isinstance(result['result'], dict) + # Dict should be passed through directly (not JSON-serialized) + assert result['result'] == { + 'temperature': 20, + 'condition': 'sunny', + } def test_function_response_simple(self): """Test converting a function response Part with simple response.""" @@ -293,13 +308,30 @@ def test_function_response_simple(self): response={'message': 'Weather is sunny'}, ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result['type'] == 'function_result' assert result['call_id'] == 'call_123' assert result['name'] == 'check_weather' - # Dict should be passed through directly (not JSON-serialized). + # Dict should be JSON serialized assert result['result'] == {'message': 'Weather is sunny'} + def test_convert_part_to_interaction_content_function_response_error(self): + part = types.Part( + function_response=types.FunctionResponse( + name='my_function', + id='call_123', + response={'error': 'something went wrong'}, + ) + ) + result = interactions_utils._convert_part_to_interaction_content(part) + assert result == interactions.FunctionResultStepParam( + type='function_result', + name='my_function', + call_id='call_123', + result={'error': 'something went wrong'}, + is_error=True, + ) + def test_function_response_dict_not_double_serialized(self): """Regression test: avoid double-serializing bash tool outputs. @@ -320,7 +352,7 @@ def test_function_response_dict_not_double_serialized(self): response=bash_response, ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) # The result value must be the dict itself, NOT a JSON string. assert isinstance(result['result'], dict) assert result['result'] == bash_response @@ -337,11 +369,16 @@ def test_inline_data_image(self): mime_type='image/png', ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result == { - 'type': 'image', - 'data': b'image_data', - 'mime_type': 'image/png', + 'type': 'user_input', + 'content': [{ + 'type': 'image', + 'data': ( + 'aW1hZ2VfZGF0YQ==' + ), # base64.b64encode(b'image_data').decode('utf-8') + 'mime_type': 'image/png', + }], } def test_inline_data_audio(self): @@ -352,11 +389,16 @@ def test_inline_data_audio(self): mime_type='audio/mp3', ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result == { - 'type': 'audio', - 'data': b'audio_data', - 'mime_type': 'audio/mp3', + 'type': 'user_input', + 'content': [{ + 'type': 'audio', + 'data': ( + 'YXVkaW9fZGF0YQ==' + ), # base64.b64encode(b'audio_data').decode('utf-8') + 'mime_type': 'audio/mp3', + }], } def test_inline_data_video(self): @@ -367,11 +409,16 @@ def test_inline_data_video(self): mime_type='video/mp4', ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result == { - 'type': 'video', - 'data': b'video_data', - 'mime_type': 'video/mp4', + 'type': 'user_input', + 'content': [{ + 'type': 'video', + 'data': ( + 'dmlkZW9fZGF0YQ==' + ), # base64.b64encode(b'video_data').decode('utf-8') + 'mime_type': 'video/mp4', + }], } def test_inline_data_document(self): @@ -382,11 +429,16 @@ def test_inline_data_document(self): mime_type='application/pdf', ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result == { - 'type': 'document', - 'data': b'doc_data', - 'mime_type': 'application/pdf', + 'type': 'user_input', + 'content': [{ + 'type': 'document', + 'data': ( + 'ZG9jX2RhdGE=' + ), # base64.b64encode(b'doc_data').decode('utf-8') + 'mime_type': 'application/pdf', + }], } def test_file_data_image(self): @@ -397,11 +449,14 @@ def test_file_data_image(self): mime_type='image/png', ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result == { - 'type': 'image', - 'uri': 'gs://bucket/image.png', - 'mime_type': 'image/png', + 'type': 'user_input', + 'content': [{ + 'type': 'image', + 'uri': 'gs://bucket/image.png', + 'mime_type': 'image/png', + }], } def test_text_with_thought_flag(self): @@ -410,22 +465,25 @@ def test_text_with_thought_flag(self): # When text is present, the convert function returns text type (not thought) # because text check comes before thought check in the implementation part = types.Part(text='Let me think about this...', thought=True) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) # Text content is returned as-is (thought flag not represented in output) - assert result == {'type': 'text', 'text': 'Let me think about this...'} + assert result == { + 'type': 'user_input', + 'content': [{'type': 'text', 'text': 'Let me think about this...'}], + } def test_thought_only_part(self): """Test converting a thought-only Part with signature.""" signature_bytes = b'test-thought-signature' part = types.Part(thought=True, thought_signature=signature_bytes) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) expected_signature = base64.b64encode(signature_bytes).decode('utf-8') assert result == {'type': 'thought', 'signature': expected_signature} def test_thought_only_part_without_signature(self): """Test converting a thought-only Part without signature.""" part = types.Part(thought=True) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result == {'type': 'thought'} def test_code_execution_result(self): @@ -436,7 +494,7 @@ def test_code_execution_result(self): outcome=types.Outcome.OUTCOME_OK, ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result == { 'type': 'code_execution_result', 'call_id': '', @@ -452,7 +510,7 @@ def test_code_execution_result_with_error(self): outcome=types.Outcome.OUTCOME_FAILED, ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result == { 'type': 'code_execution_result', 'call_id': '', @@ -468,7 +526,7 @@ def test_code_execution_result_deadline_exceeded(self): outcome=types.Outcome.OUTCOME_DEADLINE_EXCEEDED, ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result == { 'type': 'code_execution_result', 'call_id': '', @@ -484,7 +542,7 @@ def test_executable_code(self): language='PYTHON', ) ) - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result == { 'type': 'code_execution_call', 'id': '', @@ -497,12 +555,12 @@ def test_executable_code(self): def test_empty_part(self): """Test converting an empty Part returns None.""" part = types.Part() - result = interactions_utils.convert_part_to_interaction_content(part) + result = interactions_utils._convert_part_to_interaction_content(part) assert result is None -class TestConvertContentToTurn: - """Tests for convert_content_to_turn.""" +class TestConvertContentToStep: + """Tests for _convert_content_to_step.""" def test_user_content(self): """Test converting user content.""" @@ -510,11 +568,11 @@ def test_user_content(self): role='user', parts=[types.Part(text='Hello!')], ) - result = interactions_utils.convert_content_to_turn(content) - assert result == { - 'role': 'user', + result = interactions_utils._convert_content_to_step(content) + assert result == [{ + 'type': 'user_input', 'content': [{'type': 'text', 'text': 'Hello!'}], - } + }] def test_model_content(self): """Test converting model content.""" @@ -522,11 +580,11 @@ def test_model_content(self): role='model', parts=[types.Part(text='Hi there!')], ) - result = interactions_utils.convert_content_to_turn(content) - assert result == { - 'role': 'model', + result = interactions_utils._convert_content_to_step(content) + assert result == [{ + 'type': 'model_output', 'content': [{'type': 'text', 'text': 'Hi there!'}], - } + }] def test_multiple_parts(self): """Test converting content with multiple parts.""" @@ -539,30 +597,60 @@ def test_multiple_parts(self): ), ], ) - result = interactions_utils.convert_content_to_turn(content) - assert result['role'] == 'user' - assert len(result['content']) == 2 - assert result['content'][0] == {'type': 'text', 'text': 'Look at this:'} - assert result['content'][1]['type'] == 'image' + result = interactions_utils._convert_content_to_step(content) + assert len(result) == 2 + assert result[0]['type'] == 'user_input' + assert result[0]['content'][0] == {'type': 'text', 'text': 'Look at this:'} + assert result[1]['type'] == 'user_input' + assert result[1]['content'][0]['type'] == 'image' + + def test_interleaved_parts(self): + """Test converting content with interleaved text and media parts.""" + content = types.Content( + role='user', + parts=[ + types.Part(text='First:'), + types.Part( + inline_data=types.Blob(data=b'img1', mime_type='image/png') + ), + types.Part(text='Second:'), + types.Part( + inline_data=types.Blob(data=b'img2', mime_type='image/jpeg') + ), + types.Part(text='End'), + ], + ) + result = interactions_utils._convert_content_to_step(content) + assert len(result) == 5 + assert result[0]['type'] == 'user_input' + assert result[0]['content'][0] == {'type': 'text', 'text': 'First:'} + assert result[1]['type'] == 'user_input' + assert result[1]['content'][0]['type'] == 'image' + assert result[2]['type'] == 'user_input' + assert result[2]['content'][0] == {'type': 'text', 'text': 'Second:'} + assert result[3]['type'] == 'user_input' + assert result[3]['content'][0]['type'] == 'image' + assert result[4]['type'] == 'user_input' + assert result[4]['content'][0] == {'type': 'text', 'text': 'End'} def test_default_role(self): """Test that default role is 'user' when not specified.""" content = types.Content(parts=[types.Part(text='Hi')]) - result = interactions_utils.convert_content_to_turn(content) - assert result['role'] == 'user' + result = interactions_utils._convert_content_to_step(content) + assert result[0]['type'] == 'user_input' -class TestConvertContentsToTurns: - """Tests for convert_contents_to_turns.""" +class TestConvertContentsToSteps: + """Tests for convert_contents_to_steps.""" def test_single_content(self): """Test converting a list with single content.""" contents = [ types.Content(role='user', parts=[types.Part(text='What is 2+2?')]), ] - result = interactions_utils.convert_contents_to_turns(contents) + result = interactions_utils._convert_contents_to_steps(contents) assert len(result) == 1 - assert result[0]['role'] == 'user' + assert result[0]['type'] == 'user_input' assert result[0]['content'][0]['text'] == 'What is 2+2?' def test_multi_turn_conversation(self): @@ -572,11 +660,11 @@ def test_multi_turn_conversation(self): types.Content(role='model', parts=[types.Part(text='Hello!')]), types.Content(role='user', parts=[types.Part(text='How are you?')]), ] - result = interactions_utils.convert_contents_to_turns(contents) + result = interactions_utils._convert_contents_to_steps(contents) assert len(result) == 3 - assert result[0]['role'] == 'user' - assert result[1]['role'] == 'model' - assert result[2]['role'] == 'user' + assert result[0]['type'] == 'user_input' + assert result[1]['type'] == 'model_output' + assert result[2]['type'] == 'user_input' def test_empty_content_skipped(self): """Test that empty contents are skipped.""" @@ -584,13 +672,13 @@ def test_empty_content_skipped(self): types.Content(role='user', parts=[types.Part(text='Hi')]), types.Content(role='model', parts=[]), # Empty parts ] - result = interactions_utils.convert_contents_to_turns(contents) + result = interactions_utils._convert_contents_to_steps(contents) # Only the first content should be included assert len(result) == 1 class TestConvertToolsConfig: - """Tests for convert_tools_config_to_interactions_format.""" + """Tests for _convert_tools_config_to_interactions_format.""" def test_function_declaration(self): """Test converting function declarations.""" @@ -651,43 +739,43 @@ def test_no_tools(self): assert result == [] -class TestConvertInteractionOutputToPart: - """Tests for convert_interaction_output_to_part.""" +class TestConvertInteractionOutputToParts: + """Tests for convert_interaction_output_to_parts.""" def test_text_output(self): """Test converting text output.""" - output = MagicMock() - output.type = 'text' - output.text = 'Hello!' - result = interactions_utils.convert_interaction_output_to_part(output) + output = ModelOutputStep( + type='model_output', content=[TextContent(type='text', text='Hello!')] + ) + result_list = interactions_utils._convert_interaction_step_to_parts(output) + result = result_list[0] if result_list else None assert result.text == 'Hello!' def test_function_call_output(self): """Test converting function call output.""" - output = MagicMock() - output.type = 'function_call' - output.id = 'call_123' - output.name = 'get_weather' - output.arguments = {'city': 'London'} - result = interactions_utils.convert_interaction_output_to_part(output) + output = FunctionCallStep( + type='function_call', + id='call_123', + name='get_weather', + arguments={'city': 'London'}, + ) + result_list = interactions_utils._convert_interaction_step_to_parts(output) + result = result_list[0] if result_list else None assert result.function_call.id == 'call_123' assert result.function_call.name == 'get_weather' assert result.function_call.args == {'city': 'London'} def test_function_call_output_with_thought_signature(self): """Test converting function call output with thought_signature.""" - output = MagicMock( - spec=['type', 'id', 'name', 'arguments', 'thought_signature'] - ) - output.type = 'function_call' - output.id = 'call_sig_123' - output.name = 'gemini3_tool' - output.arguments = {'content': 'hello'} - # thought_signature is base64 encoded in the output - output.thought_signature = base64.b64encode(b'gemini3_signature').decode( - 'utf-8' - ) - result = interactions_utils.convert_interaction_output_to_part(output) + output = FunctionCallStep( + type='function_call', + id='call_sig_123', + name='gemini3_tool', + arguments={'content': 'hello'}, + signature=base64.b64encode(b'gemini3_signature').decode('utf-8'), + ) + result_list = interactions_utils._convert_interaction_step_to_parts(output) + result = result_list[0] if result_list else None assert result.function_call.id == 'call_sig_123' assert result.function_call.name == 'gemini3_tool' assert result.function_call.args == {'content': 'hello'} @@ -696,88 +784,121 @@ def test_function_call_output_with_thought_signature(self): def test_function_call_output_without_thought_signature(self): """Test converting function call output without thought_signature.""" - output = MagicMock(spec=['type', 'id', 'name', 'arguments']) - output.type = 'function_call' - output.id = 'call_no_sig' - output.name = 'regular_tool' - output.arguments = {} - result = interactions_utils.convert_interaction_output_to_part(output) + output = FunctionCallStep( + type='function_call', + id='call_no_sig', + name='regular_tool', + arguments={}, + ) + result_list = interactions_utils._convert_interaction_step_to_parts(output) + result = result_list[0] if result_list else None assert result.function_call.id == 'call_no_sig' assert result.function_call.name == 'regular_tool' # thought_signature should be None assert result.thought_signature is None - def test_function_result_output_with_items_list(self): - """Test converting function result output with items list. - - The implementation handles the case where result has an 'items' attribute - that returns a list-like structure. This test validates that path. - """ - output = MagicMock() - output.type = 'function_result' - output.call_id = 'call_123' - # Create a mock that has .items returning a dict (for FunctionResponse) - output.result = MagicMock() - output.result.items = {'weather': 'Sunny'} # items attribute returns dict - result = interactions_utils.convert_interaction_output_to_part(output) + def test_function_result_output(self): + """Test converting function result output.""" + output = FunctionResultStep( + type='function_result', + call_id='call_123', + result={'weather': 'Sunny'}, + ) + result_list = interactions_utils._convert_interaction_step_to_parts(output) + result = result_list[0] if result_list else None assert result.function_response.id == 'call_123' assert result.function_response.response == {'weather': 'Sunny'} def test_image_output_with_data(self): """Test converting image output with inline data.""" - output = MagicMock() - output.type = 'image' - output.data = b'image_bytes' - output.uri = None - output.mime_type = 'image/png' - result = interactions_utils.convert_interaction_output_to_part(output) + output = ModelOutputStep( + type='model_output', + content=[ + ImageContent( + type='image', + data=base64.b64encode(b'image_bytes').decode('utf-8'), + mime_type='image/png', + ) + ], + ) + result_list = interactions_utils._convert_interaction_step_to_parts(output) + result = result_list[0] if result_list else None assert result.inline_data.data == b'image_bytes' assert result.inline_data.mime_type == 'image/png' def test_image_output_with_uri(self): """Test converting image output with URI.""" - output = MagicMock() - output.type = 'image' - output.data = None - output.uri = 'gs://bucket/image.png' - output.mime_type = 'image/png' - result = interactions_utils.convert_interaction_output_to_part(output) + output = ModelOutputStep( + type='model_output', + content=[ + ImageContent( + type='image', + uri='gs://bucket/image.png', + mime_type='image/png', + ) + ], + ) + result_list = interactions_utils._convert_interaction_step_to_parts(output) + result = result_list[0] if result_list else None assert result.file_data.file_uri == 'gs://bucket/image.png' assert result.file_data.mime_type == 'image/png' def test_code_execution_result_output(self): """Test converting code execution result output.""" - output = MagicMock() - output.type = 'code_execution_result' - output.result = 'Output from code' - output.is_error = False # Indicate successful execution - result = interactions_utils.convert_interaction_output_to_part(output) + output = CodeExecutionResultStep( + type='code_execution_result', + call_id='', + result='Output from code', + is_error=False, + ) + result_list = interactions_utils._convert_interaction_step_to_parts(output) + result = result_list[0] if result_list else None assert result.code_execution_result.output == 'Output from code' assert result.code_execution_result.outcome == types.Outcome.OUTCOME_OK def test_code_execution_result_error_output(self): """Test converting code execution result output with error.""" - output = MagicMock() - output.type = 'code_execution_result' - output.result = 'Error: division by zero' - output.is_error = True # Indicate failed execution - result = interactions_utils.convert_interaction_output_to_part(output) + output = CodeExecutionResultStep( + type='code_execution_result', + call_id='', + result='Error: division by zero', + is_error=True, + ) + result_list = interactions_utils._convert_interaction_step_to_parts(output) + result = result_list[0] if result_list else None assert result.code_execution_result.output == 'Error: division by zero' assert result.code_execution_result.outcome == types.Outcome.OUTCOME_FAILED - def test_thought_output_returns_none(self): - """Test that thought output returns None (not exposed as Part).""" - output = MagicMock() - output.type = 'thought' - output.signature = 'thinking...' - result = interactions_utils.convert_interaction_output_to_part(output) - assert result is None + def test_thought_output_returns_empty(self): + """Test that thought output returns empty list (not exposed as Part).""" + output = ThoughtStep(type='thought', signature='thinking...') + result = interactions_utils._convert_interaction_step_to_parts(output) + assert result == [] def test_no_type_attribute(self): """Test handling output without type attribute.""" output = MagicMock(spec=[]) # No 'type' attribute - result = interactions_utils.convert_interaction_output_to_part(output) - assert result is None + result = interactions_utils._convert_interaction_step_to_parts(output) + assert result == [] + + def test_code_execution_call_output_uppercase_python(self): + """Test converting code execution call output with uppercase PYTHON.""" + from google.genai.interactions import CodeExecutionCallStep + + mock_args = MagicMock() + mock_args.code = 'print("hello")' + mock_args.language = 'PYTHON' + + output = CodeExecutionCallStep.model_construct( + type='code_execution_call', + id='', + arguments=mock_args, + ) + result_list = interactions_utils._convert_interaction_step_to_parts(output) + result = result_list[0] if result_list else None + assert result is not None + assert result.executable_code.code == 'print("hello")' + assert result.executable_code.language == types.Language.PYTHON class TestConvertInteractionToLlmResponse: @@ -785,18 +906,19 @@ class TestConvertInteractionToLlmResponse: def test_successful_text_response(self): """Test converting a successful text response.""" - interaction = MagicMock() - interaction.id = 'interaction_123' - interaction.status = 'completed' - text_output = MagicMock() - text_output.type = 'text' - text_output.text = 'The answer is 4.' - interaction.outputs = [text_output] - interaction.usage = MagicMock() - interaction.usage.total_input_tokens = 10 - interaction.usage.total_output_tokens = 5 - interaction.error = None - + interaction = Interaction( + id='interaction_123', + status='completed', + created=datetime.now(timezone.utc), + updated=datetime.now(timezone.utc), + steps=[ + ModelOutputStep( + type='model_output', + content=[TextContent(type='text', text='The answer is 4.')], + ) + ], + usage=Usage(total_input_tokens=10, total_output_tokens=5), + ) result = interactions_utils.convert_interaction_to_llm_response(interaction) assert result.interaction_id == 'interaction_123' @@ -808,13 +930,14 @@ def test_successful_text_response(self): def test_failed_response(self): """Test converting a failed response.""" - interaction = MagicMock() - interaction.id = 'interaction_123' - interaction.status = 'failed' - interaction.outputs = [] - interaction.error = MagicMock() - interaction.error.code = 'INVALID_REQUEST' - interaction.error.message = 'Bad request' + interaction = Interaction( + id='interaction_123', + status='failed', + created=datetime.now(timezone.utc), + updated=datetime.now(timezone.utc), + steps=[], + ) + interaction.error = MagicMock(code='INVALID_REQUEST', message='Bad request') result = interactions_utils.convert_interaction_to_llm_response(interaction) @@ -824,18 +947,20 @@ def test_failed_response(self): def test_requires_action_response(self): """Test converting a requires_action response (function call).""" - interaction = MagicMock() - interaction.id = 'interaction_123' - interaction.status = 'requires_action' - fc_output = MagicMock() - fc_output.type = 'function_call' - fc_output.id = 'call_1' - fc_output.name = 'get_weather' - fc_output.arguments = {'city': 'Paris'} - interaction.outputs = [fc_output] - interaction.usage = None - interaction.error = None - + interaction = Interaction( + id='interaction_123', + status='requires_action', + created=datetime.now(timezone.utc), + updated=datetime.now(timezone.utc), + steps=[ + FunctionCallStep( + type='function_call', + id='call_1', + name='get_weather', + arguments={'city': 'Paris'}, + ) + ], + ) result = interactions_utils.convert_interaction_to_llm_response(interaction) assert result.interaction_id == 'interaction_123' @@ -1030,12 +1155,11 @@ class TestConvertInteractionEventToLlmResponse: def test_text_delta_event(self): """Test converting a text delta event.""" - event = MagicMock() - event.event_type = 'content.delta' - event.delta = MagicMock() - event.delta.type = 'text' - event.delta.text = 'Hello world' - + event = StepDelta( + event_type='step.delta', + index=0, + delta={'type': 'text', 'text': 'Hello world'}, + ) aggregated_parts = [] result = interactions_utils.convert_interaction_event_to_llm_response( event, aggregated_parts, interaction_id='int_123' @@ -1047,111 +1171,155 @@ def test_text_delta_event(self): assert result.interaction_id == 'int_123' assert len(aggregated_parts) == 1 - def test_function_call_delta_with_thought_signature(self): - """Test converting a function call delta with thought_signature.""" - event = MagicMock() - event.event_type = 'content.delta' - event.delta = MagicMock( - spec=['type', 'id', 'name', 'arguments', 'thought_signature'] - ) - event.delta.type = 'function_call' - event.delta.id = 'fc_delta_123' - event.delta.name = 'streaming_tool' - event.delta.arguments = {'param': 'value'} - # thought_signature is base64 encoded in the delta - event.delta.thought_signature = base64.b64encode(b'delta_signature').decode( - 'utf-8' + def test_image_delta_with_data(self): + """Test converting an image delta with inline data.""" + event = StepDelta( + event_type='step.delta', + index=0, + delta={ + 'type': 'image', + 'data': base64.b64encode(b'image_bytes').decode('utf-8'), + 'mime_type': 'image/png', + }, ) - aggregated_parts = [] result = interactions_utils.convert_interaction_event_to_llm_response( - event, aggregated_parts, interaction_id='int_456' + event, aggregated_parts, interaction_id='int_img' ) - # Function calls return None (added to aggregated_parts only) - assert result is None + assert result is not None + assert result.partial + assert result.content.parts[0].inline_data.data == b'image_bytes' assert len(aggregated_parts) == 1 - fc_part = aggregated_parts[0] - assert fc_part.function_call.id == 'fc_delta_123' - assert fc_part.function_call.name == 'streaming_tool' - assert fc_part.function_call.args == {'param': 'value'} - # thought_signature should be decoded back to bytes - assert fc_part.thought_signature == b'delta_signature' - def test_function_call_delta_without_thought_signature(self): - """Test converting a function call delta without thought_signature.""" + def test_unknown_event_type_returns_none(self): + """Test that unknown event types return None.""" event = MagicMock() - event.event_type = 'content.delta' - event.delta = MagicMock(spec=['type', 'id', 'name', 'arguments']) - event.delta.type = 'function_call' - event.delta.id = 'fc_no_sig' - event.delta.name = 'regular_tool' - event.delta.arguments = {} + event.event_type = 'some_unknown_event' # Unknown event type aggregated_parts = [] result = interactions_utils.convert_interaction_event_to_llm_response( - event, aggregated_parts, interaction_id='int_789' + event, aggregated_parts, interaction_id='int_other' ) - # Function calls return None assert result is None + assert not aggregated_parts + + def test_function_call_streaming_flow(self): + """Test the complete streaming flow for function calls (Start, Delta, Stop).""" + # 1. StepStart + start_event = StepStart( + event_type='step.start', + index=0, + step=FunctionCallStep( + type='function_call', + id='call_1', + name='get_weather', + arguments={}, + ), + ) + aggregated_parts: list[types.Part] = [] + result1 = interactions_utils.convert_interaction_event_to_llm_response( + start_event, aggregated_parts, interaction_id='int_123' + ) + + assert result1 is not None + assert result1.partial is True assert len(aggregated_parts) == 1 - fc_part = aggregated_parts[0] - assert fc_part.function_call.name == 'regular_tool' - # thought_signature should be None - assert fc_part.thought_signature is None + fc = aggregated_parts[-1].function_call + assert fc + assert fc.name == 'get_weather' + assert fc.id == 'call_1' + assert fc.partial_args == [] + + # 2. StepDelta + delta_event1 = StepDelta( + event_type='step.delta', + index=0, + delta={'type': 'arguments_delta', 'arguments': '{"city": '}, + ) + result2 = interactions_utils.convert_interaction_event_to_llm_response( + delta_event1, aggregated_parts, interaction_id='int_123' + ) - def test_function_call_delta_without_name_skipped(self): - """Test that function call delta without name is skipped.""" - event = MagicMock() - event.event_type = 'content.delta' - event.delta = MagicMock(spec=['type', 'id', 'name', 'arguments']) - event.delta.type = 'function_call' - event.delta.id = 'fc_no_name' - event.delta.name = None # No name - event.delta.arguments = {} + assert result2 is not None + assert result2.partial is True + assert ( + result2.content.parts[0].function_call.partial_args[0].string_value + == '{"city": ' + ) - aggregated_parts = [] - result = interactions_utils.convert_interaction_event_to_llm_response( - event, aggregated_parts, interaction_id='int_000' + delta_event2 = StepDelta( + event_type='step.delta', + index=0, + delta={'type': 'arguments_delta', 'arguments': '"Paris"}'}, + ) + result3 = interactions_utils.convert_interaction_event_to_llm_response( + delta_event2, aggregated_parts, interaction_id='int_123' ) - # Should be skipped (no name) - assert result is None - assert not aggregated_parts + assert result3 is not None + assert len(aggregated_parts[0].function_call.partial_args) == 2 - def test_image_delta_with_data(self): - """Test converting an image delta with inline data.""" - event = MagicMock() - event.event_type = 'content.delta' - event.delta = MagicMock() - event.delta.type = 'image' - event.delta.data = b'image_bytes' - event.delta.uri = None - event.delta.mime_type = 'image/png' + # 3. StepStop + stop_event = StepStop( + event_type='step.stop', + index=0, + ) + result4 = interactions_utils.convert_interaction_event_to_llm_response( + stop_event, aggregated_parts, interaction_id='int_123' + ) + assert result4 is None + assert aggregated_parts[0].function_call.args == {'city': 'Paris'} + assert aggregated_parts[0].function_call.partial_args is None + + def test_function_call_streaming_json_parse_error(self, caplog): + """Test function call streaming returns an error response on JSON parse error.""" + # 1. StepStart + start_event = StepStart( + event_type='step.start', + index=0, + step=FunctionCallStep( + type='function_call', + id='call_err', + name='bad_json_tool', + arguments={}, + ), + ) aggregated_parts = [] - result = interactions_utils.convert_interaction_event_to_llm_response( - event, aggregated_parts, interaction_id='int_img' + interactions_utils.convert_interaction_event_to_llm_response( + start_event, aggregated_parts, interaction_id='int_err' ) - assert result is not None - assert not result.partial - assert result.content.parts[0].inline_data.data == b'image_bytes' - assert len(aggregated_parts) == 1 - - def test_unknown_event_type_returns_none(self): - """Test that unknown event types return None.""" - event = MagicMock() - event.event_type = 'some_unknown_event' # Unknown event type + # 2. StepDelta (invalid JSON) + delta_event = StepDelta( + event_type='step.delta', + index=0, + delta={'type': 'arguments_delta', 'arguments': '{"broken": "json'}, + ) + interactions_utils.convert_interaction_event_to_llm_response( + delta_event, aggregated_parts, interaction_id='int_err' + ) - aggregated_parts = [] + # 3. StepStop + stop_event = StepStop( + event_type='step.stop', + index=0, + ) result = interactions_utils.convert_interaction_event_to_llm_response( - event, aggregated_parts, interaction_id='int_other' + stop_event, aggregated_parts, interaction_id='int_err' ) - assert result is None - assert not aggregated_parts + # Assert an error LlmResponse is returned + assert result is not None + assert result.error_code == 'JSON_PARSE_ERROR' + assert result.error_message == 'Failed to parse function call arguments' + assert result.turn_complete is True + assert result.interaction_id == 'int_err' + + # The logging check can remain to ensure the raw exception is still logged. + assert 'Failed to parse function call args' in caplog.text @pytest.mark.parametrize( @@ -1159,7 +1327,7 @@ def test_unknown_event_type_returns_none(self): [ pytest.param( _build_lifecycle_streamed_events, - ['interaction_123', 'interaction_123'], + ['interaction_123'], id='lifecycle-events', ), pytest.param( @@ -1175,11 +1343,12 @@ def test_unknown_event_type_returns_none(self): ], ) def test_generate_content_via_interactions_stream_extracts_interaction_id( - streamed_events_factory: Callable[[], list[object]], + streamed_events_factory: Callable[[FunctionCallStep], list[object]], expected_ids: list[str], + fc_step: FunctionCallStep, ): """Streamed interaction IDs should be preserved across event variants.""" - streamed_events = streamed_events_factory() + streamed_events = streamed_events_factory(fc_step) assert ( asyncio.run(_collect_function_call_interaction_ids(streamed_events)) diff --git a/tests/unittests/models/test_litellm.py b/tests/unittests/models/test_litellm.py index b1a9957034..216866602f 100644 --- a/tests/unittests/models/test_litellm.py +++ b/tests/unittests/models/test_litellm.py @@ -4447,6 +4447,7 @@ async def test_finish_reason_propagation( mock_acompletion.assert_called_once() +@pytest.mark.skip(reason="LiteLLM finish_reason mapping behaviour changed") @pytest.mark.asyncio async def test_finish_reason_unknown_maps_to_other( mock_acompletion, lite_llm_instance diff --git a/tests/unittests/models/test_models.py b/tests/unittests/models/test_models.py index d2c6673664..e91ffe8b23 100644 --- a/tests/unittests/models/test_models.py +++ b/tests/unittests/models/test_models.py @@ -109,3 +109,35 @@ def test_helpful_error_for_litellm_without_extensions(): assert 'litellm package' in error_msg assert 'pip install' in error_msg assert 'Provider-style models' in error_msg + + +def test_resolve_with_prefix(): + """Test that model resolution can be overridden with a prefix.""" + assert models.LLMRegistry.resolve('gemini:gemini-1.5-flash') is Gemini + assert models.LLMRegistry.resolve('Claude:claude-3-opus@20240229') is Claude + assert models.LLMRegistry.resolve('lite:openai/gpt-4o') is LiteLlm + assert models.LLMRegistry.resolve('LiteLlm:openai/gpt-4o') is LiteLlm + + +def test_new_llm_with_prefix(mocker): + """Test that new_llm strips prefix when creating instance if it matches class.""" + mock_class = mocker.MagicMock() + mock_class.__name__ = 'MockLlm' + mocker.patch.object(models.LLMRegistry, 'resolve', return_value=mock_class) + + models.LLMRegistry.new_llm('mock:gpt-4') + mock_class.assert_called_once_with(model='gpt-4') + + mock_class.reset_mock() + models.LLMRegistry.new_llm('MockLlm:gpt-4') + mock_class.assert_called_once_with(model='gpt-4') + + +def test_new_llm_with_non_matching_prefix(mocker): + """Test that new_llm keeps prefix if it does not match class.""" + mock_class = mocker.MagicMock() + mock_class.__name__ = 'MockLlm' + mocker.patch.object(models.LLMRegistry, 'resolve', return_value=mock_class) + + models.LLMRegistry.new_llm('custom:gpt-4') + mock_class.assert_called_once_with(model='custom:gpt-4') diff --git a/tests/unittests/optimization/gepa_root_agent_prompt_optimizer_test.py b/tests/unittests/optimization/gepa_root_agent_prompt_optimizer_test.py index bd5da524eb..c3db6e9934 100644 --- a/tests/unittests/optimization/gepa_root_agent_prompt_optimizer_test.py +++ b/tests/unittests/optimization/gepa_root_agent_prompt_optimizer_test.py @@ -77,6 +77,7 @@ def mock_agent(mocker): agent = mocker.MagicMock(spec=Agent) agent.instruction = "Initial instruction" agent.sub_agents = {} + agent.mode = None agent.clone.return_value = agent return agent diff --git a/tests/unittests/plugins/test_bigquery_agent_analytics_plugin.py b/tests/unittests/plugins/test_bigquery_agent_analytics_plugin.py index 5719adf2b4..c6d47539d1 100644 --- a/tests/unittests/plugins/test_bigquery_agent_analytics_plugin.py +++ b/tests/unittests/plugins/test_bigquery_agent_analytics_plugin.py @@ -2093,56 +2093,6 @@ async def test_pickle_safety(self, mock_auth_default, mock_bq_client): finally: await plugin.shutdown() - @pytest.mark.asyncio - async def test_pickle_preserves_picklable_credentials( - self, mock_auth_default, mock_bq_client - ): - """Picklable user credentials survive pickle/unpickle.""" - import pickle - - picklable_creds = FakeCredentials() - plugin = bigquery_agent_analytics_plugin.BigQueryAgentAnalyticsPlugin( - PROJECT_ID, - DATASET_ID, - table_id=TABLE_ID, - credentials=picklable_creds, - ) - pickled = pickle.dumps(plugin) - unpickled = pickle.loads(pickled) - # User-provided picklable credentials are preserved. - assert unpickled._user_credentials is not None - assert unpickled._credentials is not None - await plugin.shutdown() - - @pytest.mark.asyncio - async def test_pickle_drops_non_picklable_credentials( - self, mock_auth_default, mock_bq_client - ): - """Non-picklable user credentials are dropped gracefully.""" - import pickle - - class NonPicklableCreds(google.auth.credentials.Credentials): - - def refresh(self, request): - pass - - def __getstate__(self): - raise TypeError("cannot pickle") - - plugin = bigquery_agent_analytics_plugin.BigQueryAgentAnalyticsPlugin( - PROJECT_ID, - DATASET_ID, - table_id=TABLE_ID, - credentials=NonPicklableCreds(), - ) - # Should not raise — non-picklable credentials are dropped. - pickled = pickle.dumps(plugin) - unpickled = pickle.loads(pickled) - # Credentials fall back to None (ADC on next use). - assert unpickled._user_credentials is None - assert unpickled._credentials is None - await plugin.shutdown() - @pytest.mark.asyncio async def test_span_hierarchy_llm_call( self, @@ -5252,72 +5202,75 @@ async def test_confirmation_flow_emits_hitl_events( agent = LlmAgent(name="hitl_agent", model=mock_model, tools=[tool]) runner = testing_utils.InMemoryRunner(root_agent=agent, plugins=[bq_plugin]) - # -- Turn 1: user query → LLM calls tool → HITL pause -- - events_turn1 = await runner.run_async( - testing_utils.UserContent("run my_action") - ) - - # Find the adk_request_confirmation function call - confirmation_fc_id = None - for ev in events_turn1: - if ev.content and ev.content.parts: - for part in ev.content.parts: - if ( - hasattr(part, "function_call") - and part.function_call - and part.function_call.name - == REQUEST_CONFIRMATION_FUNCTION_CALL_NAME - ): - confirmation_fc_id = part.function_call.id - break - if confirmation_fc_id: - break - - assert ( - confirmation_fc_id is not None - ), "Expected adk_request_confirmation function call in turn 1" - - # -- Turn 2: user sends confirmation → tool re-executes -- - user_confirmation = testing_utils.UserContent( - Part( - function_response=FunctionResponse( - id=confirmation_fc_id, - name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, - response={"confirmed": True}, - ) - ) - ) - events_turn2 = await runner.run_async(user_confirmation) - - # -- Give the async BQ writer a moment to flush -- - await asyncio.sleep(0.2) - - # -- Collect all BQ rows -- - rows = await _get_captured_rows_async(mock_write_client, dummy_arrow_schema) - event_types = [r["event_type"] for r in rows] + try: + # -- Turn 1: user query → LLM calls tool → HITL pause -- + events_turn1 = await runner.run_async( + testing_utils.UserContent("run my_action") + ) + + # Find the adk_request_confirmation function call + confirmation_fc_id = None + for ev in events_turn1: + if ev.content and ev.content.parts: + for part in ev.content.parts: + if ( + hasattr(part, "function_call") + and part.function_call + and part.function_call.name + == REQUEST_CONFIRMATION_FUNCTION_CALL_NAME + ): + confirmation_fc_id = part.function_call.id + break + if confirmation_fc_id: + break - # -- Verify standard events are present -- - assert "TOOL_STARTING" in event_types - assert "TOOL_COMPLETED" in event_types + assert ( + confirmation_fc_id is not None + ), "Expected adk_request_confirmation function call in turn 1" + + # -- Turn 2: user sends confirmation → tool re-executes -- + user_confirmation = testing_utils.UserContent( + Part( + function_response=FunctionResponse( + id=confirmation_fc_id, + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + response={"confirmed": True}, + ) + ) + ) + events_turn2 = await runner.run_async(user_confirmation) - # -- Verify HITL-specific events are present -- - assert ( - "HITL_CONFIRMATION_REQUEST" in event_types - ), f"Expected HITL_CONFIRMATION_REQUEST in {event_types}" - assert ( - "HITL_CONFIRMATION_REQUEST_COMPLETED" in event_types - ), f"Expected HITL_CONFIRMATION_REQUEST_COMPLETED in {event_types}" + # -- Deterministically wait for the async BQ writer to drain -- + await bq_plugin.flush() - # -- Verify HITL events have correct tool name in content -- - hitl_rows = [r for r in rows if r["event_type"].startswith("HITL_")] - for row in hitl_rows: - content = json.loads(row["content"]) if row["content"] else {} - assert content.get("tool") == "adk_request_confirmation", ( - "HITL event should reference 'adk_request_confirmation'," - f" got {content.get('tool')}" + # -- Collect all BQ rows -- + rows = await _get_captured_rows_async( + mock_write_client, dummy_arrow_schema ) + event_types = [r["event_type"] for r in rows] + + # -- Verify standard events are present -- + assert "TOOL_STARTING" in event_types + assert "TOOL_COMPLETED" in event_types - await bq_plugin.shutdown() + # -- Verify HITL-specific events are present -- + assert ( + "HITL_CONFIRMATION_REQUEST" in event_types + ), f"Expected HITL_CONFIRMATION_REQUEST in {event_types}" + assert ( + "HITL_CONFIRMATION_REQUEST_COMPLETED" in event_types + ), f"Expected HITL_CONFIRMATION_REQUEST_COMPLETED in {event_types}" + + # -- Verify HITL events have correct tool name in content -- + hitl_rows = [r for r in rows if r["event_type"].startswith("HITL_")] + for row in hitl_rows: + content = json.loads(row["content"]) if row["content"] else {} + assert content.get("tool") == "adk_request_confirmation", ( + "HITL event should reference 'adk_request_confirmation'," + f" got {content.get('tool')}" + ) + finally: + await bq_plugin.shutdown() @pytest.mark.asyncio async def test_regular_tool_does_not_emit_hitl_events( @@ -5366,23 +5319,26 @@ def regular_tool() -> str: agent = LlmAgent(name="regular_agent", model=mock_model, tools=[tool]) runner = testing_utils.InMemoryRunner(root_agent=agent, plugins=[bq_plugin]) - await runner.run_async(testing_utils.UserContent("run regular_tool")) - await asyncio.sleep(0.2) - - rows = await _get_captured_rows_async(mock_write_client, dummy_arrow_schema) - event_types = [r["event_type"] for r in rows] + try: + await runner.run_async(testing_utils.UserContent("run regular_tool")) + await bq_plugin.flush() - # Standard tool events should be present - assert "TOOL_STARTING" in event_types - assert "TOOL_COMPLETED" in event_types + rows = await _get_captured_rows_async( + mock_write_client, dummy_arrow_schema + ) + event_types = [r["event_type"] for r in rows] - # No HITL events - hitl_events = [et for et in event_types if et.startswith("HITL_")] - assert ( - hitl_events == [] - ), f"Expected no HITL events for regular tool, got {hitl_events}" + # Standard tool events should be present + assert "TOOL_STARTING" in event_types + assert "TOOL_COMPLETED" in event_types - await bq_plugin.shutdown() + # No HITL events + hitl_events = [et for et in event_types if et.startswith("HITL_")] + assert ( + hitl_events == [] + ), f"Expected no HITL events for regular tool, got {hitl_events}" + finally: + await bq_plugin.shutdown() # ============================================================================== diff --git a/tests/unittests/plugins/test_reflect_retry_tool_plugin.py b/tests/unittests/plugins/test_reflect_retry_tool_plugin.py index afe0e0e010..2625926470 100644 --- a/tests/unittests/plugins/test_reflect_retry_tool_plugin.py +++ b/tests/unittests/plugins/test_reflect_retry_tool_plugin.py @@ -640,6 +640,8 @@ def increase(x: int) -> int: ) events = await runner.run_async_with_new_session("test") + # Filter out agent_state events (no content). + events = [e for e in events if e.content is not None] # Assert that the first event is a function call with the wrong name assert events[0].content.parts[0].function_call.name == "increase_by_one" diff --git a/tests/unittests/runners/test_pause_invocation.py b/tests/unittests/runners/test_pause_invocation.py index 07edd6c063..3493674aa8 100644 --- a/tests/unittests/runners/test_pause_invocation.py +++ b/tests/unittests/runners/test_pause_invocation.py @@ -21,10 +21,8 @@ from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import LlmAgent from google.adk.agents.loop_agent import LoopAgent -from google.adk.agents.loop_agent import LoopAgentState from google.adk.agents.parallel_agent import ParallelAgent from google.adk.agents.sequential_agent import SequentialAgent -from google.adk.agents.sequential_agent import SequentialAgentState from google.adk.apps.app import App from google.adk.apps.app import ResumabilityConfig from google.adk.events.event import Event @@ -43,8 +41,9 @@ def _transfer_call_part(agent_name: str) -> Part: ) -def test_tool() -> str: - return "result" +def test_tool(): + """A test tool; returns None to simulate a pending long-running operation.""" + return None class _TestingAgent(BaseAgent): @@ -124,14 +123,11 @@ def test_pause_on_long_running_function_call( runner: testing_utils.InMemoryRunner, ): """Tests that a single LlmAgent pauses on long running function call.""" - assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ + actual = testing_utils.simplify_resumable_app_events(runner.run("test")) + behavioral = [e for e in actual if not isinstance(e[1], dict)] + assert behavioral == [ + # execute_tools yields the interrupt event with long_running_tool_ids. ("root_agent", Part.from_function_call(name="test_tool", args={})), - ( - "root_agent", - Part.from_function_response( - name="test_tool", response={"result": "result"} - ), - ), ] @@ -166,65 +162,66 @@ def test_pause_first_agent_on_long_running_function_call( runner: testing_utils.InMemoryRunner, ): """Tests that a SequentialAgent pauses on the first sub-agent.""" - assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ - ( - "root_agent", - SequentialAgentState(current_sub_agent="sub_agent_1").model_dump( - mode="json" - ), - ), + actual = testing_utils.simplify_resumable_app_events(runner.run("test")) + behavioral = [e for e in actual if not isinstance(e[1], dict)] + assert behavioral == [ ("sub_agent_1", Part.from_function_call(name="test_tool", args={})), - ( - "sub_agent_1", - Part.from_function_response( - name="test_tool", response={"result": "result"} - ), - ), ] + @pytest.mark.xfail( + reason=( + "Tests implementation details that are different in V2 and will be" + " deprecated." + ) + ) @pytest.mark.asyncio def test_pause_second_agent_on_long_running_function_call( self, - runner: testing_utils.InMemoryRunner, ): """Tests that a single LlmAgent pauses on long running function call.""" - # Change the base sequential agent, so that the first agent does not pause. - runner.root_agent.sub_agents[0].tools = [FunctionTool(func=test_tool)] - runner.root_agent.sub_agents[0].model = self.mock_model( - responses=[ - Part.from_function_call(name="test_tool", args={}), - Part.from_text(text="model response after tool call"), - ] - ) - assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ - ( - "root_agent", - SequentialAgentState(current_sub_agent="sub_agent_1").model_dump( - mode="json" - ), + # Construct sub_agent_1 with regular FunctionTool (not long-running). + sub_agent_1 = LlmAgent( + name="sub_agent_1", + model=self.mock_model( + responses=[ + Part.from_function_call(name="test_tool", args={}), + Part.from_text(text="model response after tool call"), + ] ), + tools=[FunctionTool(func=test_tool)], + ) + sub_agent_2 = LlmAgent( + name="sub_agent_2", + model=self.mock_model( + responses=[Part.from_function_call(name="test_tool", args={})] + ), + tools=[LongRunningFunctionTool(func=test_tool)], + ) + agent = SequentialAgent( + name="root_agent", + sub_agents=[sub_agent_1, sub_agent_2], + ) + app = App( + name="test_app", + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + actual = testing_utils.simplify_resumable_app_events(runner.run("test")) + behavioral = [e for e in actual if not isinstance(e[1], dict)] + assert behavioral == [ ("sub_agent_1", Part.from_function_call(name="test_tool", args={})), ( "sub_agent_1", Part.from_function_response( - name="test_tool", response={"result": "result"} + name="test_tool", response={"result": None} ), ), ("sub_agent_1", "model response after tool call"), + # Wrapper emits output before END_OF_AGENT. + ("root_agent", "model response after tool call"), ("sub_agent_1", END_OF_AGENT), - ( - "root_agent", - SequentialAgentState(current_sub_agent="sub_agent_2").model_dump( - mode="json" - ), - ), ("sub_agent_2", Part.from_function_call(name="test_tool", args={})), - ( - "sub_agent_2", - Part.from_function_response( - name="test_tool", response={"result": "result"} - ), - ), ] @@ -315,10 +312,24 @@ def test_pause_on_long_running_function_call( @pytest.mark.asyncio def test_pause_on_multiple_long_running_function_calls( self, - runner: testing_utils.InMemoryRunner, ): """Tests that a ParallelAgent pauses on long running function calls.""" - runner.root_agent.sub_agents[0] = LlmAgent( + nested_sub_agent_1 = LlmAgent( + name="nested_sub_agent_1", + model=self.mock_model( + responses=[Part.from_function_call(name="test_tool", args={})] + ), + tools=[LongRunningFunctionTool(func=test_tool)], + ) + nested_sub_agent_2 = _TestingAgent( + name="nested_sub_agent_2", + delay=0.5, + ) + nested_parallel_agent = ParallelAgent( + name="nested_parallel_agent", + sub_agents=[nested_sub_agent_1, nested_sub_agent_2], + ) + sub_agent_1 = LlmAgent( name="sub_agent_1", model=self.mock_model( responses=[ @@ -327,6 +338,16 @@ def test_pause_on_multiple_long_running_function_calls( ), tools=[LongRunningFunctionTool(func=test_tool)], ) + agent = ParallelAgent( + name="root_agent", + sub_agents=[sub_agent_1, nested_parallel_agent], + ) + app = App( + name="test_app", + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) simplified_events = testing_utils.simplify_resumable_app_events( runner.run("test") ) @@ -380,34 +401,26 @@ def agent(self) -> BaseAgent: max_iterations=2, ) + @pytest.mark.xfail( + reason=( + "Tests implementation details that are different in V2 and will be" + " deprecated." + ) + ) @pytest.mark.asyncio def test_pause_on_long_running_function_call( self, runner: testing_utils.InMemoryRunner, ): """Tests that a LoopAgent pauses on long running function call.""" - assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ - ( - "root_agent", - LoopAgentState(current_sub_agent="sub_agent_1").model_dump( - mode="json" - ), - ), + actual = testing_utils.simplify_resumable_app_events(runner.run("test")) + behavioral = [e for e in actual if not isinstance(e[1], dict)] + assert behavioral == [ ("sub_agent_1", "sub agent 1 response"), + # Wrapper emits output before END_OF_AGENT. + ("root_agent", "sub agent 1 response"), ("sub_agent_1", END_OF_AGENT), - ( - "root_agent", - LoopAgentState(current_sub_agent="sub_agent_2").model_dump( - mode="json" - ), - ), ("sub_agent_2", Part.from_function_call(name="test_tool", args={})), - ( - "sub_agent_2", - Part.from_function_response( - name="test_tool", response={"result": "result"} - ), - ), ] @@ -453,18 +466,16 @@ def test_pause_on_long_running_function_call( runner: testing_utils.InMemoryRunner, ): """Tests that a tree of resumable LlmAgents yields checkpoint events.""" - assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ + actual = testing_utils.simplify_resumable_app_events(runner.run("test")) + behavioral = [e for e in actual if not isinstance(e[1], dict)] + assert behavioral == [ ("root_agent", _transfer_call_part("sub_llm_agent_1")), ("root_agent", _TRANSFER_RESPONSE_PART), + ("root_agent", END_OF_AGENT), ("sub_llm_agent_1", _transfer_call_part("sub_llm_agent_2")), ("sub_llm_agent_1", _TRANSFER_RESPONSE_PART), + ("sub_llm_agent_1", END_OF_AGENT), ("sub_llm_agent_2", Part.from_function_call(name="test_tool", args={})), - ( - "sub_llm_agent_2", - Part.from_function_response( - name="test_tool", response={"result": "result"} - ), - ), ] @@ -511,18 +522,17 @@ def test_pause_on_long_running_function_call( runner: testing_utils.InMemoryRunner, ): """Tests that a tree of resumable LlmAgents yields checkpoint events.""" - assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ + actual = testing_utils.simplify_resumable_app_events(runner.run("test")) + behavioral = [e for e in actual if not isinstance(e[1], dict)] + assert behavioral == [ ("root_agent", _transfer_call_part("sub_llm_agent_1")), ("root_agent", _TRANSFER_RESPONSE_PART), + ("root_agent", END_OF_AGENT), ("sub_llm_agent_1", _transfer_call_part("sub_llm_agent_2")), ("sub_llm_agent_1", _TRANSFER_RESPONSE_PART), + ("sub_llm_agent_1", END_OF_AGENT), ("sub_llm_agent_2", _transfer_call_part("root_agent")), ("sub_llm_agent_2", _TRANSFER_RESPONSE_PART), + ("sub_llm_agent_2", END_OF_AGENT), ("root_agent", Part.from_function_call(name="test_tool", args={})), - ( - "root_agent", - Part.from_function_response( - name="test_tool", response={"result": "result"} - ), - ), ] diff --git a/tests/unittests/runners/test_resume_invocation.py b/tests/unittests/runners/test_resume_invocation.py index 0db3f23bec..c2d517232b 100644 --- a/tests/unittests/runners/test_resume_invocation.py +++ b/tests/unittests/runners/test_resume_invocation.py @@ -37,29 +37,38 @@ def transfer_call_part(agent_name: str) -> Part: ) -def test_tool() -> dict[str, str]: - return {"result": "test tool result"} +def test_tool(): + """A test tool; returns None to simulate a pending long-running operation.""" + return None +@pytest.mark.xfail( + reason=( + "Tests implementation details that are different in V2 and will be" + " deprecated." + ) +) @pytest.mark.asyncio async def test_resume_invocation_from_sub_agent(): """A test case for an edge case, where an invocation-to-resume starts from a sub-agent. For example: - invocation1: root_agent -> sub_agent - invocation2: sub_agent [paused][resume] + invocation1: root_agent -> sub_agent (sub_agent completes normally) + invocation2: sub_agent calls long_running_tool -> pauses + resume invocation2: sub_agent gets function response -> responds """ # Step 1: Setup - # root_agent -> sub_agent + long_running_test_tool = LongRunningFunctionTool(func=test_tool) sub_agent = LlmAgent( name="sub_agent", model=testing_utils.MockModel.create( responses=[ "first response from sub_agent", - "second response from sub_agent", - "third response from sub_agent", + Part.from_function_call(name="test_tool", args={}), + "response from sub_agent after resume", ] ), + tools=[long_running_test_tool], ) root_agent = LlmAgent( name="root_agent", @@ -77,11 +86,16 @@ async def test_resume_invocation_from_sub_agent(): ) # Step 2: Run the first invocation - # Expect the invocation to start from root_agent and transferred to sub_agent. + # root_agent transfers to sub_agent, sub_agent responds normally. invocation_1_events = await runner.run_async("test user query") - assert testing_utils.simplify_resumable_app_events( - copy.deepcopy(invocation_1_events) - ) == [ + inv1_behavioral = [ + e + for e in testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_1_events) + ) + if not isinstance(e[1], dict) + ] + assert inv1_behavioral == [ ( root_agent.name, transfer_call_part(sub_agent.name), @@ -91,67 +105,95 @@ async def test_resume_invocation_from_sub_agent(): TRANSFER_RESPONSE_PART, ), ( - sub_agent.name, - "first response from sub_agent", + root_agent.name, + testing_utils.END_OF_AGENT, ), ( sub_agent.name, - testing_utils.END_OF_AGENT, + "first response from sub_agent", ), ( - root_agent.name, + sub_agent.name, testing_utils.END_OF_AGENT, ), ] # Step 3: Run the second invocation - # Expect the invocation to directly start from sub_agent. - invocation_2_events = await runner.run_async( - "test user query 2", - ) - assert testing_utils.simplify_resumable_app_events( - copy.deepcopy(invocation_2_events) - ) == [ + # sub_agent is now active. It calls long_running_tool, which pauses. + invocation_2_events = await runner.run_async("test user query 2") + inv2_behavioral = [ + e + for e in testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_2_events) + ) + if not isinstance(e[1], dict) + ] + assert inv2_behavioral == [ + # execute_tools yields the interrupt event with long_running_tool_ids. ( sub_agent.name, - "second response from sub_agent", + Part.from_function_call(name="test_tool", args={}), ), - (sub_agent.name, testing_utils.END_OF_AGENT), ] - # Asserts the invocation will be a no-op if the current agent in context is - # already final. - assert not await runner.run_async( - invocation_id=invocation_2_events[0].invocation_id - ) - # Step 4: Copy all session.events[:-1] to a new session - # This is to simulate the case where we pause on the second invocation. - session_id = runner.session_id - session = await runner.runner.session_service.get_session( - app_name="test_app", user_id="test_user", session_id=session_id - ) - new_session = await runner.runner.session_service.create_session( - app_name=session.app_name, user_id=session.user_id - ) - for event in session.events[:-1]: - await runner.runner.session_service.append_event(new_session, event) - runner.session_id = new_session.id + # Find the function_call_id for resume. + invocation_2_function_call_id = None + for ev in invocation_2_events: + if ( + ev.content + and ev.content.parts + and ev.content.parts[0].function_call + and ev.content.parts[0].function_call.name == "test_tool" + ): + invocation_2_function_call_id = ev.content.parts[0].function_call.id + break + assert invocation_2_function_call_id is not None - # Step 5: Resume the second invocation + # Step 4: Resume the second invocation with function response. resumed_invocation_2_events = await runner.run_async( - invocation_id=invocation_2_events[0].invocation_id + invocation_id=invocation_2_events[0].invocation_id, + new_message=testing_utils.UserContent( + Part( + function_response=FunctionResponse( + id=invocation_2_function_call_id, + name="test_tool", + response={"result": "test tool update"}, + ) + ), + ), ) - assert testing_utils.simplify_resumable_app_events( - copy.deepcopy(resumed_invocation_2_events) - ) == [ + resumed_inv2_behavioral = [ + e + for e in testing_utils.simplify_resumable_app_events( + copy.deepcopy(resumed_invocation_2_events) + ) + if not isinstance(e[1], dict) + ] + assert resumed_inv2_behavioral == [ + # execute_tools yields the function response from resume. ( sub_agent.name, - "third response from sub_agent", + Part.from_function_response( + name="test_tool", + response={"result": "test tool update"}, + ), + ), + ( + sub_agent.name, + "response from sub_agent after resume", ), (sub_agent.name, testing_utils.END_OF_AGENT), ] +@pytest.mark.skip( + reason=( + "Cross-invocation resume (resuming a non-latest invocation) is not" + " supported by the Mesh-based LlmAgent. The Mesh's output aggregation" + " in node_output_utils.py collects events from multiple invocations," + " causing CallLlmResult to be wrapped in a list." + ) +) @pytest.mark.asyncio async def test_resume_any_invocation(): """A test case for resuming a previous invocation instead of the last one.""" @@ -181,28 +223,45 @@ async def test_resume_any_invocation(): # Step 2: Run the first invocation, which pauses on the long running function. invocation_1_events = await runner.run_async("test user query") - assert testing_utils.simplify_resumable_app_events( - copy.deepcopy(invocation_1_events) - ) == [ + inv1_behavioral = [ + e + for e in testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_1_events) + ) + if not isinstance(e[1], dict) + ] + assert inv1_behavioral == [ ( root_agent.name, Part.from_function_call(name="test_tool", args={}), ), - ( - root_agent.name, - Part.from_function_response( - name="test_tool", response={"result": "test tool result"} - ), - ), ] + # Find the function_call_id for resume. + invocation_1_function_call_id = None + for ev in invocation_1_events: + if ( + ev.content + and ev.content.parts + and ev.content.parts[0].function_call + and ev.content.parts[0].function_call.name == "test_tool" + ): + invocation_1_function_call_id = ev.content.parts[0].function_call.id + break + assert invocation_1_function_call_id is not None + # Step 3: Run the second invocation, expect it to finish normally. invocation_2_events = await runner.run_async( "test user query 2", ) - assert testing_utils.simplify_resumable_app_events( - copy.deepcopy(invocation_2_events) - ) == [ + inv2_behavioral = [ + e + for e in testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_2_events) + ) + if not isinstance(e[1], dict) + ] + assert inv2_behavioral == [ ( root_agent.name, "llm response in invocation 2", @@ -215,19 +274,18 @@ async def test_resume_any_invocation(): invocation_3_events = await runner.run_async( "test user query 3", ) - assert testing_utils.simplify_resumable_app_events( - copy.deepcopy(invocation_3_events) - ) == [ + inv3_behavioral = [ + e + for e in testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_3_events) + ) + if not isinstance(e[1], dict) + ] + assert inv3_behavioral == [ ( root_agent.name, Part.from_function_call(name="test_tool", args={}), ), - ( - root_agent.name, - Part.from_function_response( - name="test_tool", response={"result": "test tool result"} - ), - ), ] # Step 5: Resume the first invocation with long running function response. @@ -236,16 +294,21 @@ async def test_resume_any_invocation(): new_message=testing_utils.UserContent( Part( function_response=FunctionResponse( - id=invocation_1_events[0].content.parts[0].function_call.id, + id=invocation_1_function_call_id, name="test_tool", response={"result": "test tool update"}, ) ), ), ) - assert testing_utils.simplify_resumable_app_events( - copy.deepcopy(resumed_invocation_1_events) - ) == [ + resumed_inv1_behavioral = [ + e + for e in testing_utils.simplify_resumable_app_events( + copy.deepcopy(resumed_invocation_1_events) + ) + if not isinstance(e[1], dict) + ] + assert resumed_inv1_behavioral == [ ( root_agent.name, "llm response after resuming invocation 1", diff --git a/tests/unittests/runners/test_run_tool_confirmation.py b/tests/unittests/runners/test_run_tool_confirmation.py index 6b12790de6..005fb98b5a 100644 --- a/tests/unittests/runners/test_run_tool_confirmation.py +++ b/tests/unittests/runners/test_run_tool_confirmation.py @@ -218,7 +218,7 @@ async def test_confirmation_flow( (agent.name, "test llm response after tool call"), ] for event in events: - assert event.invocation_id != invocation_id + assert event.invocation_id == invocation_id assert ( testing_utils.simplify_events(copy.deepcopy(events)) == expected_parts_final @@ -369,7 +369,7 @@ async def test_confirmation_flow( (agent.name, "test llm response after final tool call"), ] for event in events: - assert event.invocation_id != invocation_id + assert event.invocation_id == invocation_id assert ( testing_utils.simplify_events(copy.deepcopy(events)) == expected_parts_final diff --git a/tests/unittests/runners/test_runner_debug.py b/tests/unittests/runners/test_runner_debug.py index b747c4fa61..3ad06d6d85 100644 --- a/tests/unittests/runners/test_runner_debug.py +++ b/tests/unittests/runners/test_runner_debug.py @@ -142,11 +142,9 @@ async def mock_run_async(*args, **kwargs): # Execute with quiet=True await runner.run_debug("Test query", quiet=True) - # Check that nothing was printed + # Check that nothing was printed to stdout or logged captured = capsys.readouterr() assert "This should not be printed" not in captured.out - assert "User >" not in captured.out - assert "Session:" not in captured.out @pytest.mark.asyncio async def test_run_debug_custom_session_id(self): @@ -862,7 +860,7 @@ async def mock_run_async(*args, **kwargs): assert len(events) == 3 @pytest.mark.asyncio - async def test_run_debug_with_empty_parts_list(self, capsys): + async def test_run_debug_with_empty_parts_list(self, capsys, caplog): """Test that run_debug handles events with empty parts list gracefully.""" agent = Agent( name="test_agent", @@ -879,18 +877,19 @@ async def mock_run_async(*_args, **_kwargs): mock_event.content.parts = [] # Empty parts list yield mock_event - with mock.patch.object(runner, "run_async", side_effect=mock_run_async): - events = await runner.run_debug("Test query") + with caplog.at_level("INFO"): + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug("Test query") - captured = capsys.readouterr() - # Should handle gracefully without crashing - assert "User > Test query" in captured.out + # Should handle gracefully without crashing + assert "User > Test query" in caplog.text assert len(events) == 1 # Should not print any agent response since parts is empty + captured = capsys.readouterr() assert "test_agent >" not in captured.out @pytest.mark.asyncio - async def test_run_debug_with_none_event_content(self, capsys): + async def test_run_debug_with_none_event_content(self, capsys, caplog): """Test that run_debug handles events with None content gracefully.""" agent = Agent( name="test_agent", @@ -906,12 +905,13 @@ async def mock_run_async(*_args, **_kwargs): mock_event.content = None # None content yield mock_event - with mock.patch.object(runner, "run_async", side_effect=mock_run_async): - events = await runner.run_debug("Test query") + with caplog.at_level("INFO"): + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug("Test query") - captured = capsys.readouterr() - # Should handle gracefully without crashing - assert "User > Test query" in captured.out - assert len(events) == 1 - # Should not print any agent response since content is None - assert "test_agent >" not in captured.out + # Should handle gracefully without crashing + assert "User > Test query" in caplog.text + assert len(events) == 1 + # Should not print any agent response since content is None + captured = capsys.readouterr() + assert "test_agent >" not in captured.out diff --git a/tests/unittests/runners/test_runner_node.py b/tests/unittests/runners/test_runner_node.py new file mode 100644 index 0000000000..5abdfee529 --- /dev/null +++ b/tests/unittests/runners/test_runner_node.py @@ -0,0 +1,1246 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for Runner(node=...). + +Verifies that Runner can execute standalone BaseNode instances, +persist events to session, handle resume (HITL), and yield events correctly. +""" + +from __future__ import annotations + +import asyncio +from typing import Any +from typing import AsyncGenerator + +from google.adk.agents.callback_context import CallbackContext +from google.adk.agents.context import Context +from google.adk.agents.llm_agent import LlmAgent +from google.adk.events.event import Event +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.workflow import node +from google.adk.workflow._base_node import BaseNode +from google.adk.workflow._base_node import START +from google.adk.workflow._workflow import Workflow +from google.genai import types +import pytest + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +class _EchoNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + text = node_input.parts[0].text if node_input else 'empty' + yield f'Echo: {text}' + + +def _user_message(text: str = 'hello') -> types.Content: + return types.Content(parts=[types.Part(text=text)], role='user') + + +async def _run_node(node, message='hello'): + """Run a BaseNode via Runner(node=...) and return (events, ss, session).""" + ss = InMemorySessionService() + runner = Runner(app_name='test', node=node, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + msg = types.Content(parts=[types.Part(text=message)], role='user') + events = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + return events, ss, session + + +def _make_interrupt_event(fc_name='get_input', fc_id='fc-1'): + """Create an interrupt Event with a long-running function call.""" + return Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name=fc_name, args={}, id=fc_id + ) + ) + ] + ), + long_running_tool_ids={fc_id}, + ) + + +def _make_resume_message(fc_name='get_input', fc_id='fc-1', response=None): + """Create a user message with a function response for resuming.""" + return types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name=fc_name, + id=fc_id, + response=response or {}, + ) + ) + ], + role='user', + ) + + +async def _run_two_turns(node, msg1_text, resume_msg): + """Run a node for two turns: initial message then resume.""" + ss = InMemorySessionService() + runner = Runner(app_name='test', node=node, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg1 = types.Content(parts=[types.Part(text=msg1_text)], role='user') + events1 = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + events2 = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=resume_msg + ): + events2.append(event) + + return events1, events2, runner, ss, session + + +# --------------------------------------------------------------------------- +# Basic execution +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_simple_node_output(): + """Runner yields output from a simple BaseNode.""" + events, _, _ = await _run_node(_EchoNode(name='echo'), message='hi') + + output_events = [e for e in events if e.output is not None] + assert [e.output for e in output_events] == ['Echo: hi'] + assert output_events[0].node_info.path == 'echo@1' + + +@pytest.mark.asyncio +async def test_intermediate_events_yielded(): + """Runner yields intermediate events (e.g. state), not just output.""" + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(state={'step': 'processing'}) + yield 'final_result' + + events, _, _ = await _run_node(_Node(name='steps')) + + state_events = [e for e in events if e.actions.state_delta] + assert len(state_events) >= 1 + assert [e.output for e in events if e.output is not None] == ['final_result'] + + +@pytest.mark.asyncio +async def test_event_author_defaults_to_node_name(): + """Events are attributed to the node's name by default.""" + events, _, _ = await _run_node(_EchoNode(name='my_node'), message='hi') + + output_events = [e for e in events if e.output is not None] + assert output_events[0].author == 'my_node' + + +@pytest.mark.asyncio +async def test_node_error_propagates(): + """A node that raises propagates the exception to the caller.""" + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + raise RuntimeError('node failure') + yield # pylint: disable=unreachable + + with pytest.raises(RuntimeError, match='node failure'): + await _run_node(_Node(name='error')) + + +@pytest.mark.asyncio +async def test_node_yielding_none_produces_no_output(): + """A node that yields None produces no output event.""" + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield None + + events, _, _ = await _run_node(_Node(name='nil')) + + assert [e.output for e in events if e.output is not None] == [] + + +@pytest.mark.asyncio +async def test_workflow_node_output(): + """Runner drives a Workflow and yields its terminal output.""" + + def upper(node_input: str) -> str: + return node_input.upper() + + wf = Workflow(name='wf', edges=[(START, upper)]) + events, _, _ = await _run_node(wf, message='hi') + + output_events = [e for e in events if e.output == 'HI'] + assert len(output_events) == 1 + assert output_events[0].node_info.path == 'wf@1/upper@1' + + +# --------------------------------------------------------------------------- +# Session persistence +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_events_persisted_to_session(): + """Non-partial events are persisted to the session.""" + _, ss, session = await _run_node(_EchoNode(name='echo'), message='hi') + + updated = await ss.get_session( + app_name='test', user_id='u', session_id=session.id + ) + session_outputs = [e.output for e in updated.events if e.output is not None] + assert 'Echo: hi' in session_outputs + + +@pytest.mark.asyncio +async def test_multiple_invocations_accumulate_events(): + """Each invocation appends events; session accumulates across runs.""" + node = _EchoNode(name='echo') + ss = InMemorySessionService() + runner = Runner(app_name='test', node=node, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + for msg_text in ['first', 'second', 'third']: + async for _ in runner.run_async( + user_id='u', + session_id=session.id, + new_message=types.Content( + parts=[types.Part(text=msg_text)], role='user' + ), + ): + pass + + updated = await ss.get_session( + app_name='test', user_id='u', session_id=session.id + ) + outputs = [e.output for e in updated.events if e.output is not None] + assert outputs == ['Echo: first', 'Echo: second', 'Echo: third'] + + +# --------------------------------------------------------------------------- +# yield_user_message +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_yield_user_message_true(): + """When yield_user_message=True, user event is yielded before node events.""" + ss = InMemorySessionService() + runner = Runner( + app_name='test', node=_EchoNode(name='echo'), session_service=ss + ) + session = await ss.create_session(app_name='test', user_id='u') + msg = types.Content(parts=[types.Part(text='hi')], role='user') + + events: list[Event] = [] + async for event in runner.run_async( + user_id='u', + session_id=session.id, + new_message=msg, + yield_user_message=True, + ): + events.append(event) + + user_events = [e for e in events if e.author == 'user'] + assert len(user_events) == 1 + assert user_events[0].content.parts[0].text == 'hi' + assert events[0].author == 'user' + + +@pytest.mark.asyncio +async def test_yield_user_message_false_by_default(): + """By default, user event is not yielded to the caller.""" + events, _, _ = await _run_node(_EchoNode(name='echo'), message='hi') + + user_events = [e for e in events if e.author == 'user'] + assert user_events == [] + + +@pytest.mark.asyncio +async def test_node_runner_applies_state_delta_before_base_node_runs(): + """A BaseNode sees run_async state_delta as session state.""" + + class _StateReaderNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield f'state:{ctx.state["test_state"]}' + + session_service = InMemorySessionService() + runner = Runner( + app_name='test', + node=_StateReaderNode(name='reader'), + session_service=session_service, + ) + session = await session_service.create_session(app_name='test', user_id='u') + + events: list[Event] = [] + async for event in runner.run_async( + user_id='u', + session_id=session.id, + new_message=_user_message(), + state_delta={'test_state': 'must_change'}, + ): + events.append(event) + + updated = await session_service.get_session( + app_name='test', user_id='u', session_id=session.id + ) + user_events = [event for event in updated.events if event.author == 'user'] + + assert [event.output for event in events if event.output is not None] == [ + 'state:must_change' + ] + assert updated.state['test_state'] == 'must_change' + assert user_events[0].actions.state_delta == {'test_state': 'must_change'} + + +@pytest.mark.asyncio +async def test_node_runner_yields_user_event_with_state_delta(): + """yield_user_message=True yields the user event with state_delta.""" + + class _NoopNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield 'done' + + session_service = InMemorySessionService() + runner = Runner( + app_name='test', + node=_NoopNode(name='noop'), + session_service=session_service, + ) + session = await session_service.create_session(app_name='test', user_id='u') + + events: list[Event] = [] + async for event in runner.run_async( + user_id='u', + session_id=session.id, + new_message=_user_message(), + state_delta={'test_state': 'must_change'}, + yield_user_message=True, + ): + events.append(event) + + assert events[0].author == 'user' + assert events[0].actions.state_delta == {'test_state': 'must_change'} + + +@pytest.mark.asyncio +async def test_node_runner_applies_state_delta_before_llm_agent_runs(): + """An LlmAgent callback sees run_async state_delta before model execution.""" + + captured_state_value = None + + def _before_agent_callback( + callback_context: CallbackContext, + ) -> types.Content: + nonlocal captured_state_value + captured_state_value = callback_context.state['test_state'] + return types.Content( + role='model', + parts=[types.Part(text=f'state:{captured_state_value}')], + ) + + session_service = InMemorySessionService() + agent = LlmAgent( + name='state_agent', + before_agent_callback=_before_agent_callback, + ) + runner = Runner(app_name='test', agent=agent, session_service=session_service) + session = await session_service.create_session(app_name='test', user_id='u') + + events: list[Event] = [] + async for event in runner.run_async( + user_id='u', + session_id=session.id, + new_message=_user_message(), + state_delta={'test_state': 'must_change'}, + ): + events.append(event) + + updated = await session_service.get_session( + app_name='test', user_id='u', session_id=session.id + ) + user_events = [event for event in updated.events if event.author == 'user'] + response_texts = [ + part.text + for event in events + if event.content + for part in event.content.parts + if part.text + ] + + assert captured_state_value == 'must_change' + assert 'state:must_change' in response_texts + assert user_events[0].actions.state_delta == {'test_state': 'must_change'} + + +# --------------------------------------------------------------------------- +# Resume (HITL) +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_standalone_node_resume(): + """A standalone node resumes with resume_inputs from function response.""" + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield f'result: {ctx.resume_inputs["fc-1"]["value"]}' + return + yield _make_interrupt_event() + + events1, events2, _, _, _ = await _run_two_turns( + _Node(name='standalone'), + 'go', + _make_resume_message(response={'value': 42}), + ) + + assert any(e.long_running_tool_ids for e in events1) + outputs = [e.output for e in events2 if e.output is not None] + assert 'result: 42' in outputs + + +@pytest.mark.asyncio +async def test_resume_preserves_original_user_content(): + """On resume, Runner passes the original text as node_input, not the FR.""" + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + text = ( + node_input.parts[0].text + if node_input and hasattr(node_input, 'parts') + else str(node_input) + ) + yield f'original:{text}' + return + yield _make_interrupt_event(fc_name='tool') + + events1, events2, _, _, _ = await _run_two_turns( + _Node(name='node'), + 'my original input', + _make_resume_message(fc_name='tool', response={'v': 1}), + ) + + outputs = [e.output for e in events2 if e.output is not None] + assert 'original:my original input' in outputs + + +@pytest.mark.asyncio +async def test_plain_text_does_not_trigger_resume(): + """Sending plain text (no FR) starts fresh, does not enter resume path.""" + node = _EchoNode(name='echo') + ss = InMemorySessionService() + runner = Runner(app_name='test', node=node, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1 + async for _ in runner.run_async( + user_id='u', + session_id=session.id, + new_message=types.Content(parts=[types.Part(text='first')], role='user'), + ): + pass + + # Run 2: plain text — should start fresh + events2: list[Event] = [] + async for event in runner.run_async( + user_id='u', + session_id=session.id, + new_message=types.Content(parts=[types.Part(text='second')], role='user'), + ): + events2.append(event) + + outputs = [e.output for e in events2 if e.output is not None] + assert outputs == ['Echo: second'] + + +# --------------------------------------------------------------------------- +# Resume validation +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_resume_raises_on_unmatched_fr(): + """Runner raises when function response has no matching FC in session.""" + ss = InMemorySessionService() + runner = Runner( + app_name='test', node=_EchoNode(name='echo'), session_service=ss + ) + session = await ss.create_session(app_name='test', user_id='u') + + msg = _make_resume_message(fc_name='unknown', fc_id='no-such-fc') + + with pytest.raises(ValueError, match='Function call not found'): + async for _ in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + pass + + +@pytest.mark.asyncio +async def test_resume_raises_on_multi_invocation_fr(): + """Runner raises when FRs resolve to different invocations.""" + call_count = [0] + + class _InterruptNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + call_count[0] += 1 + fc_id = f'fc-{call_count[0]}' + yield _make_interrupt_event(fc_name='tool', fc_id=fc_id) + + wf = Workflow( + name='wf', + edges=[(START, _InterruptNode(name='ask'))], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: interrupts with fc-1 + async for _ in runner.run_async( + user_id='u', + session_id=session.id, + new_message=types.Content(parts=[types.Part(text='go')], role='user'), + ): + pass + + # Run 2: interrupts with fc-2 (different invocation) + async for _ in runner.run_async( + user_id='u', + session_id=session.id, + new_message=types.Content( + parts=[types.Part(text='go again')], role='user' + ), + ): + pass + + # Run 3: send FRs for both fc-1 and fc-2 (different invocations) + msg3 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='tool', id='fc-1', response={'r': 1} + ) + ), + types.Part( + function_response=types.FunctionResponse( + name='tool', id='fc-2', response={'r': 2} + ) + ), + ], + role='user', + ) + + with pytest.raises(ValueError, match='resolve to multiple invocations'): + async for _ in runner.run_async( + user_id='u', session_id=session.id, new_message=msg3 + ): + pass + + +@pytest.mark.asyncio +async def test_mixed_fr_and_text_raises(): + """Message with both function responses and text is rejected.""" + ss = InMemorySessionService() + runner = Runner( + app_name='test', node=_EchoNode(name='echo'), session_service=ss + ) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content( + parts=[ + types.Part(text='some text'), + types.Part( + function_response=types.FunctionResponse( + name='tool', id='fc-1', response={'v': 1} + ) + ), + ], + role='user', + ) + + with pytest.raises(ValueError, match='cannot contain both'): + async for _ in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + pass + + +# --------------------------------------------------------------------------- +# Default scheduler & ctx.create_task cleanup +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_run_node_works_without_workflow(): + """ctx.run_node() works in a standalone BaseNode (default scheduler).""" + + class _ChildNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield f'child got: {node_input}' + + class _ParentNode(BaseNode): + + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + result = await ctx.run_node(_ChildNode(name='child'), 'hello') + yield f'parent got: {result}' + + events, _, _ = await _run_node(_ParentNode(name='parent'), message='go') + + outputs = [e.output for e in events if e.output is not None] + assert 'parent got: child got: hello' in outputs + + +@pytest.mark.asyncio +async def test_run_node_use_as_output_attributes_child_output_to_parent(): + """Child output with use_as_output=True is attributed to the parent node.""" + + class _ChildNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield 'child result' + + class _ParentNode(BaseNode): + + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + result = await ctx.run_node( + _ChildNode(name='child'), 'hello', use_as_output=True + ) + yield f'parent got: {result}' + + events, _, _ = await _run_node(_ParentNode(name='parent'), message='go') + + # The child's output event should list the parent's path in output_for. + # With use_as_output=True, the parent's own yield is suppressed — + # only the child's output (attributed to the parent) is emitted. + child_output = next(e for e in events if e.output == 'child result') + assert 'parent@1/child@1' in child_output.node_info.path + assert any( + 'parent' in p and 'child' not in p + for p in child_output.node_info.output_for + ) + + +@pytest.mark.asyncio +async def test_run_node_wait_for_output(): + """Dynamic node with wait_for_output=True re-runs on resume if no output. + + Setup: ParentNode calls MockNode (wait_for_output=True). + MockNode yields no output on first call, output on second call. + Act: + - Turn 1: Run parent. Child yields no output and waits. Parent interrupts. + - Turn 2: Resume parent. Child runs again and produces output. + Assert: + - Parent receives child's output in Turn 2. + """ + + # Arrange + calls = [0] + + class _MockNode(BaseNode): + wait_for_output: bool = True + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + calls[0] += 1 + if calls[0] == 2: + yield 'success' + + class _ParentNode(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + res = await ctx.run_node(_MockNode(name='child')) + if res == 'success': + yield 'completed' + return + yield _make_interrupt_event(fc_name='ask', fc_id='fc-1') + + # Act + events1, events2, _, _, _ = await _run_two_turns( + _ParentNode(name='parent'), + 'go', + _make_resume_message(fc_name='ask', fc_id='fc-1', response={}), + ) + + # Assert + outputs = [e.output for e in events2 if e.output is not None] + assert 'completed' in outputs + + +# --------------------------------------------------------------------------- +# DefaultNodeScheduler — dynamic child resume via ctx.run_node() +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_run_node_child_resume_via_default_scheduler(): + """Completed children are cached on resume; interrupted child re-runs. + + Setup: ParentNode calls ChildA and ChildB in sequence. + ChildA completes on first run. ChildB yields an interrupt on first run. + Act: + - Turn 1: Run parent. ChildA completes, ChildB interrupts. + - Turn 2: Resume with response for ChildB's interrupt. + Assert: + - Turn 1: ChildB's interrupt is propagated. + - Turn 2: Parent completes with combined output using cached ChildA result. + """ + + class _ChildA(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield 'child_a_output' + + class _ChildB(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield f'resumed: {ctx.resume_inputs["fc-1"]["answer"]}' + return + yield _make_interrupt_event(fc_name='ask', fc_id='fc-1') + + class _ParentNode(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + a = await ctx.run_node(_ChildA(name='a'), 'input_a') + b = await ctx.run_node(_ChildB(name='b'), 'input_b') + yield f'{a} + {b}' + + events1, events2, _, _, _ = await _run_two_turns( + _ParentNode(name='parent'), + 'go', + _make_resume_message( + fc_name='ask', fc_id='fc-1', response={'answer': 42} + ), + ) + + assert any(e.long_running_tool_ids for e in events1) + outputs = [e.output for e in events2 if e.output is not None] + assert 'child_a_output + resumed: 42' in outputs + + +@pytest.mark.asyncio +async def test_run_node_default_scheduler_caches_by_call_count(): + """Only interrupted children re-run; completed children are skipped. + + Setup: Parent calls ChildA, ChildB, and ChildC in sequence. + A and B complete on first run. C yields an interrupt on first run. + Act: + - Turn 1: Run parent. A & B complete, C interrupts. + - Turn 2: Resume with response for C's interrupt. + Assert: + - Turn 1: C's interrupt is propagated. + - Turn 2: Parent completes. Call counts verify A and B were not re-run on resume. + """ + + call_counts = {'a': 0, 'b': 0, 'c': 0} + + class _CountingChild(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + call_counts[self.name] += 1 + if self.name == 'c': + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield 'c_resumed' + return + yield _make_interrupt_event(fc_name='tool', fc_id='fc-1') + return + yield f'{self.name}_out' + + class _Parent(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + a = await ctx.run_node(_CountingChild(name='a'), 'x') + b = await ctx.run_node(_CountingChild(name='b'), 'y') + c = await ctx.run_node(_CountingChild(name='c'), 'z') + yield f'{a},{b},{c}' + + events1, events2, _, _, _ = await _run_two_turns( + _Parent(name='p'), + 'go', + _make_resume_message(fc_name='tool', fc_id='fc-1', response={}), + ) + + assert any(e.long_running_tool_ids for e in events1) + outputs = [e.output for e in events2 if e.output is not None] + assert 'a_out,b_out,c_resumed' in outputs + assert call_counts == {'a': 1, 'b': 1, 'c': 2} + + +@pytest.mark.asyncio +async def test_run_node_use_as_output_with_resume(): + """use_as_output child resumes correctly; child output is attributed to parent.""" + + class _Child(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield f'approved: {ctx.resume_inputs["fc-1"]["ok"]}' + return + yield _make_interrupt_event(fc_name='approve', fc_id='fc-1') + + class _Parent(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + result = await ctx.run_node( + _Child(name='child'), 'data', use_as_output=True + ) + yield f'parent saw: {result}' + + events1, events2, _, _, _ = await _run_two_turns( + _Parent(name='parent'), + 'go', + _make_resume_message( + fc_name='approve', fc_id='fc-1', response={'ok': True} + ), + ) + + assert any(e.long_running_tool_ids for e in events1) + outputs = [e.output for e in events2 if e.output is not None] + assert any('approved: True' in o for o in outputs) + + +@pytest.mark.asyncio +async def test_run_node_nested_ctx_run_node_resume(): + """Nested ctx.run_node(): outer → middle → inner; inner interrupts and resumes.""" + + call_counts = {'outer': 0, 'middle': 0, 'inner': 0} + + class _Inner(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + call_counts['inner'] += 1 + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield f'inner_resumed:{ctx.resume_inputs["fc-1"]["v"]}' + return + yield _make_interrupt_event(fc_name='ask', fc_id='fc-1') + + class _Middle(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + call_counts['middle'] += 1 + inner_out = await ctx.run_node(_Inner(name='inner'), 'go') + yield f'middle({inner_out})' + + class _Outer(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + call_counts['outer'] += 1 + mid_out = await ctx.run_node(_Middle(name='middle'), 'start') + yield f'outer({mid_out})' + + events1, events2, _, _, _ = await _run_two_turns( + _Outer(name='top'), + 'go', + _make_resume_message(fc_name='ask', fc_id='fc-1', response={'v': 99}), + ) + + # Turn 1: inner interrupts, propagated through middle and outer. + assert any(e.long_running_tool_ids for e in events1) + + # Turn 2: inner resumes, middle and outer produce final output. + outputs = [e.output for e in events2 if e.output is not None] + assert 'outer(middle(inner_resumed:99))' in outputs + + # Outer and middle re-run on resume; inner runs twice (interrupt + resume). + assert call_counts == {'outer': 2, 'middle': 2, 'inner': 2} + + +@pytest.mark.asyncio +async def test_run_node_use_as_output_nested_delegation(): + """Nested use_as_output delegates all the way up with run_ids.""" + + class _Inner(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield 'inner_val' + + class _Middle(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + await ctx.run_node(_Inner(name='inner'), 'go', use_as_output=True) + if False: + yield + + class _Outer(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + await ctx.run_node(_Middle(name='middle'), 'start', use_as_output=True) + if False: + yield + + # When + events, _, _ = await _run_node(_Outer(name='outer'), message='go') + + # Then + inner_output = next(e for e in events if e.output == 'inner_val') + output_for = inner_output.node_info.output_for + paths = output_for + + assert len(output_for) == 3 + assert any('middle' in p for p in paths) + assert any('outer' in p for p in paths) + assert any('inner' in p for p in paths) + for p in output_for: + assert '@' in p + + +@pytest.mark.asyncio +async def test_run_node_auto_increments_run_id(): + """ctx.run_node() auto-increments run_id for the same node name.""" + + class _ChildNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield f'run:{ctx.run_id}' + + class _ParentNode(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + r1 = await ctx.run_node(_ChildNode(name='child')) + r2 = await ctx.run_node(_ChildNode(name='child')) + yield f'{r1},{r2}' + + events, _, _ = await _run_node(_ParentNode(name='parent'), message='go') + + outputs = [e.output for e in events if e.output is not None] + assert 'run:1,run:2' in outputs + + +@pytest.mark.asyncio +async def test_run_node_parallel_interrupts(): + """Parallel ctx.run_node() calls that both interrupt and then resume. + + Setup: ParentNode calls two instances of InterruptChild in parallel. + Both children yield interrupts on the first turn with unique IDs. + Act: + - Turn 1: Run parent. Both children interrupt. + - Turn 2: Resume with responses for both children in a single message. + Assert: + - Turn 1: Two unique interrupts are yielded. + - Turn 2: Both children resume, find their inputs, and complete. Parent + produces combined output. + """ + + class _InterruptChild(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + target_id = f'fc-{ctx.run_id}' + if ctx.resume_inputs and target_id in ctx.resume_inputs: + yield f"resumed:{ctx.resume_inputs[target_id]['v']}" + return + yield _make_interrupt_event(fc_name='ask', fc_id=target_id) + + class _ParentNode(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + t1 = ctx.run_node(_InterruptChild(name='child')) + t2 = ctx.run_node(_InterruptChild(name='child')) + r1, r2 = await asyncio.gather(t1, t2) + yield f'{r1},{r2}' + + events1, ss, session = await _run_node( + _ParentNode(name='parent'), message='go' + ) + + interrupts = [e for e in events1 if e.long_running_tool_ids] + assert len(interrupts) == 2 + + fc_ids = [] + for e in interrupts: + fc_ids.extend(e.long_running_tool_ids) + assert len(set(fc_ids)) == 2 # Should be unique + + resume_msg = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='ask', id=fc_ids[0], response={'v': 10} + ) + ), + types.Part( + function_response=types.FunctionResponse( + name='ask', id=fc_ids[1], response={'v': 20} + ) + ), + ], + role='user', + ) + + events2 = [] + runner = Runner( + app_name='test', node=_ParentNode(name='parent'), session_service=ss + ) + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=resume_msg + ): + events2.append(event) + + outputs = [e.output for e in events2 if e.output is not None] + assert ( + 'resumed:10,resumed:20' in outputs or 'resumed:20,resumed:10' in outputs + ) + + +@pytest.mark.asyncio +async def test_run_node_parallel_deterministic_ids(): + """Parallel ctx.run_node() calls within the same process receive deterministic IDs. + + Setup: ParentNode calls two instances of ChildNode in parallel. + Act: Run parent. + Assert: Outputs confirm both children received distinct, auto-incremented run_ids (1 and 2). + """ + + class _ChildNode(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield f'run:{ctx.run_id}' + + class _ParentNode(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + t1 = ctx.run_node(_ChildNode(name='child')) + t2 = ctx.run_node(_ChildNode(name='child')) + r1, r2 = await asyncio.gather(t1, t2) + yield f'{r1},{r2}' + + events, _, _ = await _run_node(_ParentNode(name='parent'), message='go') + outputs = [e.output for e in events if e.output is not None] + assert 'run:1,run:2' in outputs or 'run:2,run:1' in outputs + + +@pytest.mark.asyncio +async def test_run_node_custom_numeric_id_raises_value_error(): + """Passing a completely numeric explicit run_id is immediately rejected. + + Setup: ParentNode calls ChildNode with a custom numeric run_id="5". + Act: Run parent. + Assert: ValueError is raised with a message about collision prevention. + """ + + class _ChildNode(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield f'run:{ctx.run_id}' + + class _ParentNode(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + await ctx.run_node(_ChildNode(name='child'), run_id='5') + yield 'should not reach' + + with pytest.raises(ValueError, match='must contain non-numeric characters'): + await _run_node(_ParentNode(name='parent'), message='go') + + +@pytest.mark.asyncio +async def test_run_node_custom_non_numeric_id_accepted(): + """Passing an explicit run_id containing non-numeric characters is safely accepted. + + Setup: ParentNode calls ChildNode with a custom run_id="user-123". + Act: Run parent. + Assert: Output reflects the custom run_id without errors. + """ + + class _ChildNode(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield f'run:{ctx.run_id}' + + class _ParentNode(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + r1 = await ctx.run_node(_ChildNode(name='child'), run_id='user-123') + yield r1 + + events, _, _ = await _run_node(_ParentNode(name='parent'), message='go') + outputs = [e.output for e in events if e.output is not None] + assert 'run:user-123' in outputs + + +@pytest.mark.asyncio +async def test_run_node_isolation_across_invocations(): + """Verify that a new invocation ignores events from a previous invocation for dynamic nodes.""" + + call_counts = {'child': 0} + + @node(name='child') + async def counting_child(ctx: Context, node_input: Any): + call_counts['child'] += 1 + yield f"child_out_{call_counts['child']}" + + class _Parent(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + res = await ctx.run_node(counting_child, 'x') + yield res + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=_Parent(name='p'), session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Invocation 1 + msg1 = types.Content(parts=[types.Part(text='go 1')], role='user') + events1 = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + assert call_counts['child'] == 1 + outputs1 = [e.output for e in events1 if e.output is not None] + assert 'child_out_1' in outputs1 + + # Invocation 2 (New invocation in SAME session) + msg2 = types.Content(parts=[types.Part(text='go 2')], role='user') + events2 = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events2.append(event) + + # If isolation works, CounterNode should run AGAIN! + assert call_counts['child'] == 2 + outputs2 = [e.output for e in events2 if e.output is not None] + assert 'child_out_2' in outputs2 diff --git a/tests/unittests/skills/test__utils.py b/tests/unittests/skills/test__utils.py index 1975c0a494..abae9cd8b8 100644 --- a/tests/unittests/skills/test__utils.py +++ b/tests/unittests/skills/test__utils.py @@ -14,7 +14,9 @@ """Unit tests for skill utilities.""" +import builtins import io +import sys from unittest import mock import zipfile @@ -363,3 +365,31 @@ def test__load_skill_from_zip_bytes(): assert skill.instructions == "Body instructions" assert skill.resources.get_reference("ref1.md") == "ref1 content" assert skill.resources.get_script("script1.sh").src == "echo hello" + + +def test__list_skills_in_gcs_dir_import_error(): + """Tests list_skills_in_gcs_dir raises ImportError when storage missing.""" + real_import = builtins.__import__ + + def mock_import(name, globals=None, locals=None, fromlist=(), level=0): + if name == "google.cloud" and "storage" in (fromlist or ()): + raise ImportError("No module named 'google.cloud.storage'") + return real_import(name, globals, locals, fromlist, level) + + with mock.patch("builtins.__import__", mock_import): + with pytest.raises(ImportError, match="google-cloud-storage is required"): + _list_skills_in_gcs_dir("my-bucket", "skills/") + + +def test__load_skill_from_gcs_dir_import_error(): + """Tests load_skill_from_gcs_dir raises ImportError when storage missing.""" + real_import = builtins.__import__ + + def mock_import(name, globals=None, locals=None, fromlist=(), level=0): + if name == "google.cloud" and "storage" in (fromlist or ()): + raise ImportError("No module named 'google.cloud.storage'") + return real_import(name, globals, locals, fromlist, level) + + with mock.patch("builtins.__import__", mock_import): + with pytest.raises(ImportError, match="google-cloud-storage is required"): + _load_skill_from_gcs_dir("my-bucket", "skills/my-skill/") diff --git a/tests/unittests/streaming/test_live_streaming_configs.py b/tests/unittests/streaming/test_live_streaming_configs.py index 679d3964b9..709dba2f08 100644 --- a/tests/unittests/streaming/test_live_streaming_configs.py +++ b/tests/unittests/streaming/test_live_streaming_configs.py @@ -729,3 +729,74 @@ def test_streaming_with_avatar_config(): assert video_part.inline_data is not None assert video_part.inline_data.data == b'video_data' assert video_part.inline_data.mime_type == 'video/mp4' + + +def test_streaming_default_model_when_not_specified(mocker): + """Test streaming uses default model when not specified in live mode.""" + from google.adk.agents import LlmAgent + from google.adk.models.registry import LLMRegistry + + response1 = LlmResponse(turn_complete=True) + mock_model = testing_utils.MockModel.create([response1]) + + mock_new_llm = mocker.patch.object( + LLMRegistry, 'new_llm', return_value=mock_model + ) + + # Save original default + original_default = LlmAgent._default_live_model + + try: + LlmAgent.set_default_live_model('my-custom-live-model') + + root_agent = Agent( + name='root_agent', + tools=[], + ) + + import asyncio + from contextlib import aclosing + + from google.adk.agents.run_config import RunConfig + from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService + from google.adk.memory.in_memory_memory_service import InMemoryMemoryService + from google.adk.runners import Runner + from google.adk.sessions.in_memory_session_service import InMemorySessionService + + runner = Runner( + app_name='test_app', + agent=root_agent, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + ) + + live_request_queue = LiveRequestQueue() + live_request_queue.send_realtime( + blob=types.Blob(data=b'\x00\xFF', mime_type='audio/pcm') + ) + + async def run_test(): + session = await runner.session_service.create_session( + app_name='test_app', user_id='test_user' + ) + run_config = RunConfig(response_modalities=['AUDIO']) + async with aclosing( + runner.run_live( + user_id=session.user_id, + session_id=session.id, + live_request_queue=live_request_queue, + run_config=run_config, + ) + ) as agen: + async for event in agen: + # We just need to trigger the resolution + break + + asyncio.run(run_test()) + + mock_new_llm.assert_any_call('my-custom-live-model') + + finally: + # Restore original default + LlmAgent.set_default_live_model(original_default) diff --git a/tests/unittests/streaming/test_streaming_audio_storage.py b/tests/unittests/streaming/test_streaming_audio_storage.py index 70cac8e01e..ac0972136f 100644 --- a/tests/unittests/streaming/test_streaming_audio_storage.py +++ b/tests/unittests/streaming/test_streaming_audio_storage.py @@ -63,7 +63,7 @@ # # Import our caching classes # from google.adk.agents.invocation_context import RealtimeCacheEntry -# from google.adk.flows.llm_flows.base_llm_flow import BaseLlmFlow +# from google.adk.agents.llm.base_llm_flow import BaseLlmFlow # # Create a mock flow to test our methods # flow = BaseLlmFlow() @@ -160,7 +160,7 @@ # ) # from google.adk.events.event import Event -# from google.adk.flows.llm_flows.base_llm_flow import BaseLlmFlow +# from google.adk.agents.llm.base_llm_flow import BaseLlmFlow # flow = BaseLlmFlow() diff --git a/tests/unittests/telemetry/test_functional.py b/tests/unittests/telemetry/test_functional.py index 5430a97205..f42242f787 100644 --- a/tests/unittests/telemetry/test_functional.py +++ b/tests/unittests/telemetry/test_functional.py @@ -11,35 +11,20 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import annotations import dataclasses -from dataclasses import dataclass -from dataclasses import field -from enum import Enum -import gc -import json -import sys from typing import Any from typing import Sequence -from typing import TYPE_CHECKING from google.adk.agents.llm_agent import Agent from google.adk.models.base_llm import BaseLlm -from google.adk.models.llm_response import LlmResponse -from google.adk.telemetry import _instrumentation from google.adk.telemetry import _metrics from google.adk.telemetry import tracing from google.adk.tools import FunctionTool from google.adk.utils.context_utils import Aclosing from google.genai import types -from google.genai.types import Content -from google.genai.types import FinishReason from google.genai.types import Part from opentelemetry.instrumentation.google_genai import GoogleGenAiSdkInstrumentor -from opentelemetry.sdk._logs import LoggerProvider -from opentelemetry.sdk._logs.export import InMemoryLogRecordExporter -from opentelemetry.sdk._logs.export import SimpleLogRecordProcessor from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader from opentelemetry.sdk.metrics.export import Metric @@ -51,11 +36,7 @@ from ..testing_utils import InMemoryRunner from ..testing_utils import MockModel from ..testing_utils import TestInMemoryRunner - -if TYPE_CHECKING: - from opentelemetry.sdk._logs import ReadableLogRecord - from opentelemetry.sdk.trace import ReadableSpan - from opentelemetry.util.types import AttributeValue +from .utils import set_aclosing_wrapping_assertions @pytest.fixture @@ -118,31 +99,7 @@ async def test_tracer_start_as_current_span( This is necessary because instrumentation utilizes contextvars, which ran into "ContextVar was created in a different Context" errors, when a given coroutine gets indeterminately suspended. """ - firstiter, finalizer = sys.get_asyncgen_hooks() - - def wrapped_firstiter(coro): - nonlocal firstiter - # Skip check for specific async context managers in tracing.py, - # as their internal generators are not expected to be Aclosing-wrapped. - if ( - coro.__name__ == "use_inference_span" - or coro.__name__ == "_use_native_generate_content_span" - or coro.__name__ == "record_agent_invocation" - or coro.__name__ == "record_tool_execution" - or coro.__name__ == "record_inference_telemetry" - ): - firstiter(coro) - return - assert any( - isinstance(referrer, Aclosing) - or isinstance(indirect_referrer, Aclosing) - for referrer in gc.get_referrers(coro) - # Some coroutines have a layer of indirection in Python 3.10 - for indirect_referrer in gc.get_referrers(referrer) - ), f"Coro `{coro.__name__}` is not wrapped with Aclosing" - firstiter(coro) - - sys.set_asyncgen_hooks(wrapped_firstiter, finalizer) + set_aclosing_wrapping_assertions() # Act async with Aclosing(test_runner.run_async_with_new_session_agen("")) as agen: @@ -192,6 +149,7 @@ async def some_tool(): # Assert spans = span_exporter.get_finished_spans() + assert len(spans) > 1 assert all( span.attributes is not None and len(span.attributes) > 0 @@ -503,1346 +461,3 @@ async def failing_tool(): got.sort(key=lambda p: p.attributes.get("gen_ai.tool.name", "")) want.sort(key=lambda p: p.attributes.get("gen_ai.tool.name", "")) assert got == want - - -# ============================================================================== -# TELEMETRY SHAPES TEST HELPERS & EXPECTATIONS -# ============================================================================== - -OTEL_OPT_IN = "OTEL_SEMCONV_STABILITY_OPT_IN" -CAPTURE_CONTENT = "OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT" -EXPERIMENTAL_OPT_IN = "gen_ai_latest_experimental" -GEN_AI_SYSTEM_MESSAGE_EVENT = "gen_ai.system.message" -GEN_AI_USER_MESSAGE_EVENT = "gen_ai.user.message" -GEN_AI_CHOICE_EVENT = "gen_ai.choice" -GEN_AI_COMPLETION_DETAILS_EVENT = "gen_ai.client.inference.operation.details" - -NON_DETERMINISTIC_ATTRIBUTE_KEYS: frozenset[str] = frozenset({ - "gcp.vertex.agent.event_id", - "gen_ai.tool.call.id", - "gcp.vertex.agent.associated_event_ids", - "gen_ai.conversation.id", - "gcp.vertex.agent.invocation_id", - "gcp.vertex.agent.session_id", -}) -JSON_ATTRIBUTE_KEYS: frozenset[str] = frozenset({ - "gen_ai.input.messages", - "gen_ai.output.messages", - "gen_ai.system_instructions", - "gen_ai.tool.definitions", -}) -PRESENT = "PRESENT" - - -@dataclass -class LogDigest: - event_name: str - body: object = None - attributes: dict[str, object] = field(default_factory=dict) - - @classmethod - def from_log(cls, log: ReadableLogRecord) -> LogDigest: - attrs: dict[str, object] = {} - for k, v in (log.log_record.attributes or {}).items(): - if k in NON_DETERMINISTIC_ATTRIBUTE_KEYS: - attrs[k] = PRESENT - else: - attrs[k] = _normalize(v) - return cls( - event_name=log.log_record.event_name or "", - body=_normalize(log.log_record.body), - attributes=attrs, - ) - - -@dataclass -class SpanDigest: - name: str - attributes: dict[str, AttributeValue] - children: list[SpanDigest] = field(default_factory=list) - logs: list[LogDigest] = field(default_factory=list) - - @classmethod - def from_span(cls, span: ReadableSpan) -> SpanDigest: - determinized_attributes: dict[str, AttributeValue] = {} - for attr_key, attr_val in (span.attributes or {}).items(): - if attr_key in NON_DETERMINISTIC_ATTRIBUTE_KEYS: - determinized_attributes[attr_key] = PRESENT - elif attr_key in JSON_ATTRIBUTE_KEYS and isinstance(attr_val, str): - determinized_attributes[attr_key] = _normalize(json.loads(attr_val)) - else: - determinized_attributes[attr_key] = _normalize(attr_val) - return cls(name=span.name, attributes=determinized_attributes) - - @classmethod - def build( - cls, - spans: tuple[ReadableSpan, ...], - logs: tuple[ReadableLogRecord, ...] = (), - ) -> SpanDigest: - digest_by_id: dict[int, SpanDigest] = {} - for span in spans: - if span.context is None: - continue - digest_by_id[span.context.span_id] = cls.from_span(span) - for log in logs: - span_id = log.log_record.span_id - if span_id is None or span_id == 0: - continue - digest = digest_by_id.get(span_id) - if digest is None: - continue - digest.logs.append(LogDigest.from_log(log)) - root: SpanDigest | None = None - for span in spans: - if span.context is None: - continue - digest = digest_by_id[span.context.span_id] - if span.parent and span.parent.span_id in digest_by_id: - parent_digest = digest_by_id[span.parent.span_id] - parent_digest.children.append(digest) - else: - if root is not None: - raise ValueError("Multiple root spans found.") - root = digest - for digest in digest_by_id.values(): - digest.children.sort(key=lambda s: s.name) - digest.logs[:] = sorted_log_digests(digest.logs) - if root is None: - raise ValueError("No root span found in the provided spans.") - return root - - def all_logs(self) -> list[LogDigest]: - collected: list[LogDigest] = [] - - def _walk(node: SpanDigest) -> None: - collected.extend(node.logs) - for child in node.children: - _walk(child) - - _walk(self) - return sorted_log_digests(collected) - - -def sorted_log_digests(logs: list[LogDigest]) -> list[LogDigest]: - return sorted( - logs, - key=lambda log: ( - log.event_name, - json.dumps(log.body, sort_keys=True, default=str), - json.dumps(log.attributes, sort_keys=True, default=str), - ), - ) - - -def _normalize(value: object) -> object: - if isinstance(value, Enum): - return value.value - if isinstance(value, tuple): - return [_normalize(v) for v in value] - if isinstance(value, list): - return [_normalize(v) for v in value] - if isinstance(value, dict): - return {k: _normalize(v) for k, v in value.items() if v is not None} - return value - - -def install_telemetry( - monkeypatch: pytest.MonkeyPatch, - span_exporter: InMemorySpanExporter, - log_exporter: InMemoryLogRecordExporter, -) -> None: - tracer_provider = TracerProvider() - tracer_provider.add_span_processor(SimpleSpanProcessor(span_exporter)) - real_tracer = tracer_provider.get_tracer(__name__) - monkeypatch.setattr( - tracing.tracer, - "start_as_current_span", - real_tracer.start_as_current_span, - ) - logger_provider = LoggerProvider() - logger_provider.add_log_record_processor( - SimpleLogRecordProcessor(log_exporter) - ) - real_logger = logger_provider.get_logger(__name__) - monkeypatch.setattr(tracing.otel_logger, "emit", real_logger.emit) - - -USER_PROMPT = "hello" -AGENT_NAME = "some_root_agent" -AGENT_DESCRIPTION = "A sample root agent." -BASE_INSTRUCTION = "you are helpful" -FULL_SYSTEM_INSTRUCTION = ( - f"{BASE_INSTRUCTION}\n\n" - f'You are an agent. Your internal name is "{AGENT_NAME}".' - f' The description about you is "{AGENT_DESCRIPTION}".' -) -FINAL_TEXT = "text response" -TOOL_NAME = "some_tool" -TOOL_DESCRIPTION = "A sample tool." -TOOL_ARGS = {"arg1": "val1"} -TOOL_RESULT_PREFIX = "processed " -TOOL_RESULT = f"{TOOL_RESULT_PREFIX}{TOOL_ARGS['arg1']}" - - -def _make_llm_response(part: Part) -> LlmResponse: - return LlmResponse( - content=Content(role="model", parts=[part]), - finish_reason=FinishReason.STOP, - ) - - -def build_test_agent() -> Agent: - mock_model = MockModel.create( - responses=[ - _make_llm_response( - Part.from_function_call(name=TOOL_NAME, args=TOOL_ARGS) - ), - _make_llm_response(Part.from_text(text=FINAL_TEXT)), - ] - ) - - def some_tool(arg1: str) -> str: - """A sample tool.""" - return f"{TOOL_RESULT_PREFIX}{arg1}" - - return Agent( - name=AGENT_NAME, - description=AGENT_DESCRIPTION, - instruction=BASE_INSTRUCTION, - model=mock_model, - tools=[FunctionTool(some_tool)], - ) - - -def build_test_runner() -> TestInMemoryRunner: - return TestInMemoryRunner(agent=build_test_agent()) - - -async def run_agent_scenario(runner: TestInMemoryRunner) -> None: - async with Aclosing( - runner.run_async_with_new_session_agen( - Content(parts=[Part.from_text(text=USER_PROMPT)], role="user") - ) - ) as agen: - async for _ in agen: - pass - - -@dataclass(frozen=True) -class FunctionalTestCase: - test_id: str - semconv_opt_in: str | None - capture_content: str | None - expected_root: SpanDigest - - def apply_env(self, monkeypatch: pytest.MonkeyPatch) -> None: - if self.semconv_opt_in is None: - monkeypatch.delenv(OTEL_OPT_IN, raising=False) - else: - monkeypatch.setenv(OTEL_OPT_IN, self.semconv_opt_in) - if self.capture_content is None: - monkeypatch.delenv(CAPTURE_CONTENT, raising=False) - else: - monkeypatch.setenv(CAPTURE_CONTENT, self.capture_content) - monkeypatch.setenv("ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS", "false") - - -EXPECTED_STABLE_NO_CAPTURE = SpanDigest( - name="invocation", - attributes={}, - children=[ - SpanDigest( - name="invoke_agent some_root_agent", - attributes={ - "gen_ai.operation.name": "invoke_agent", - "gen_ai.agent.description": AGENT_DESCRIPTION, - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - }, - children=[ - SpanDigest( - name="call_llm", - attributes={ - "gen_ai.system": "gcp.vertex.agent", - "gen_ai.request.model": "mock", - "gcp.vertex.agent.invocation_id": PRESENT, - "gcp.vertex.agent.session_id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="generate_content mock", - attributes={ - "gen_ai.system": "gemini", - "gen_ai.operation.name": "generate_content", - "gen_ai.request.model": "mock", - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": PRESENT, - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="execute_tool some_tool", - attributes={ - "gen_ai.operation.name": "execute_tool", - "gen_ai.tool.description": ( - TOOL_DESCRIPTION - ), - "gen_ai.tool.name": TOOL_NAME, - "gen_ai.tool.type": "FunctionTool", - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gcp.vertex.agent.tool_call_args": "{}", - "gen_ai.tool.call.id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.tool_response": "{}", - }, - ), - ], - logs=[ - LogDigest( - event_name=GEN_AI_CHOICE_EVENT, - body={ - "content": "", - "index": 0, - "finish_reason": "STOP", - }, - attributes={"gen_ai.system": "gemini"}, - ), - LogDigest( - event_name=GEN_AI_SYSTEM_MESSAGE_EVENT, - body={"content": ""}, - attributes={"gen_ai.system": "gemini"}, - ), - LogDigest( - event_name=GEN_AI_USER_MESSAGE_EVENT, - body={"content": ""}, - attributes={"gen_ai.system": "gemini"}, - ), - ], - ), - ], - ), - SpanDigest( - name="call_llm", - attributes={ - "gen_ai.system": "gcp.vertex.agent", - "gen_ai.request.model": "mock", - "gcp.vertex.agent.invocation_id": PRESENT, - "gcp.vertex.agent.session_id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="generate_content mock", - attributes={ - "gen_ai.system": "gemini", - "gen_ai.operation.name": "generate_content", - "gen_ai.request.model": "mock", - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": PRESENT, - "gen_ai.response.finish_reasons": ["stop"], - }, - logs=[ - LogDigest( - event_name=GEN_AI_CHOICE_EVENT, - body={ - "content": "", - "index": 0, - "finish_reason": "STOP", - }, - attributes={"gen_ai.system": "gemini"}, - ), - LogDigest( - event_name=GEN_AI_SYSTEM_MESSAGE_EVENT, - body={"content": ""}, - attributes={"gen_ai.system": "gemini"}, - ), - LogDigest( - event_name=GEN_AI_USER_MESSAGE_EVENT, - body={"content": ""}, - attributes={"gen_ai.system": "gemini"}, - ), - LogDigest( - event_name=GEN_AI_USER_MESSAGE_EVENT, - body={"content": ""}, - attributes={"gen_ai.system": "gemini"}, - ), - LogDigest( - event_name=GEN_AI_USER_MESSAGE_EVENT, - body={"content": ""}, - attributes={"gen_ai.system": "gemini"}, - ), - ], - ), - ], - ), - ], - ), - ], -) - -EXPECTED_STABLE_CAPTURE = SpanDigest( - name="invocation", - attributes={}, - children=[ - SpanDigest( - name="invoke_agent some_root_agent", - attributes={ - "gen_ai.operation.name": "invoke_agent", - "gen_ai.agent.description": AGENT_DESCRIPTION, - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - }, - children=[ - SpanDigest( - name="call_llm", - attributes={ - "gen_ai.system": "gcp.vertex.agent", - "gen_ai.request.model": "mock", - "gcp.vertex.agent.invocation_id": PRESENT, - "gcp.vertex.agent.session_id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="generate_content mock", - attributes={ - "gen_ai.system": "gemini", - "gen_ai.operation.name": "generate_content", - "gen_ai.request.model": "mock", - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": PRESENT, - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="execute_tool some_tool", - attributes={ - "gen_ai.operation.name": "execute_tool", - "gen_ai.tool.description": ( - TOOL_DESCRIPTION - ), - "gen_ai.tool.name": TOOL_NAME, - "gen_ai.tool.type": "FunctionTool", - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gcp.vertex.agent.tool_call_args": "{}", - "gen_ai.tool.call.id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.tool_response": "{}", - }, - ), - ], - logs=[ - LogDigest( - event_name=GEN_AI_CHOICE_EVENT, - body={ - "content": { - "parts": [{ - "function_call": { - "args": TOOL_ARGS, - "name": TOOL_NAME, - } - }], - "role": "model", - }, - "index": 0, - "finish_reason": "STOP", - }, - attributes={"gen_ai.system": "gemini"}, - ), - LogDigest( - event_name=GEN_AI_SYSTEM_MESSAGE_EVENT, - body={"content": FULL_SYSTEM_INSTRUCTION}, - attributes={"gen_ai.system": "gemini"}, - ), - LogDigest( - event_name=GEN_AI_USER_MESSAGE_EVENT, - body={ - "content": { - "parts": [{"text": USER_PROMPT}], - "role": "user", - } - }, - attributes={"gen_ai.system": "gemini"}, - ), - ], - ), - ], - ), - SpanDigest( - name="call_llm", - attributes={ - "gen_ai.system": "gcp.vertex.agent", - "gen_ai.request.model": "mock", - "gcp.vertex.agent.invocation_id": PRESENT, - "gcp.vertex.agent.session_id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="generate_content mock", - attributes={ - "gen_ai.system": "gemini", - "gen_ai.operation.name": "generate_content", - "gen_ai.request.model": "mock", - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": PRESENT, - "gen_ai.response.finish_reasons": ["stop"], - }, - logs=[ - LogDigest( - event_name=GEN_AI_CHOICE_EVENT, - body={ - "content": { - "parts": [{"text": FINAL_TEXT}], - "role": "model", - }, - "index": 0, - "finish_reason": "STOP", - }, - attributes={"gen_ai.system": "gemini"}, - ), - LogDigest( - event_name=GEN_AI_SYSTEM_MESSAGE_EVENT, - body={"content": FULL_SYSTEM_INSTRUCTION}, - attributes={"gen_ai.system": "gemini"}, - ), - LogDigest( - event_name=GEN_AI_USER_MESSAGE_EVENT, - body={ - "content": { - "parts": [{ - "function_call": { - "args": TOOL_ARGS, - "name": TOOL_NAME, - } - }], - "role": "model", - } - }, - attributes={"gen_ai.system": "gemini"}, - ), - LogDigest( - event_name=GEN_AI_USER_MESSAGE_EVENT, - body={ - "content": { - "parts": [{ - "function_response": { - "name": TOOL_NAME, - "response": { - "result": TOOL_RESULT - }, - } - }], - "role": "user", - } - }, - attributes={"gen_ai.system": "gemini"}, - ), - LogDigest( - event_name=GEN_AI_USER_MESSAGE_EVENT, - body={ - "content": { - "parts": [{"text": USER_PROMPT}], - "role": "user", - } - }, - attributes={"gen_ai.system": "gemini"}, - ), - ], - ), - ], - ), - ], - ), - ], -) - -EXPECTED_EXPERIMENTAL_NO_CONTENT = SpanDigest( - name="invocation", - attributes={}, - children=[ - SpanDigest( - name="invoke_agent some_root_agent", - attributes={ - "gen_ai.operation.name": "invoke_agent", - "gen_ai.agent.description": AGENT_DESCRIPTION, - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - }, - children=[ - SpanDigest( - name="call_llm", - attributes={ - "gen_ai.system": "gcp.vertex.agent", - "gen_ai.request.model": "mock", - "gcp.vertex.agent.invocation_id": PRESENT, - "gcp.vertex.agent.session_id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="generate_content mock", - attributes={ - "gen_ai.operation.name": "generate_content", - "gen_ai.request.model": "mock", - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": PRESENT, - "gen_ai.response.finish_reasons": ["stop"], - "gen_ai.tool.definitions": [{ - "name": TOOL_NAME, - "description": TOOL_DESCRIPTION, - "type": "function", - }], - }, - children=[ - SpanDigest( - name="execute_tool some_tool", - attributes={ - "gen_ai.operation.name": "execute_tool", - "gen_ai.tool.description": ( - TOOL_DESCRIPTION - ), - "gen_ai.tool.name": TOOL_NAME, - "gen_ai.tool.type": "FunctionTool", - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gcp.vertex.agent.tool_call_args": "{}", - "gen_ai.tool.call.id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.tool_response": "{}", - }, - ), - ], - logs=[ - LogDigest( - event_name=GEN_AI_COMPLETION_DETAILS_EVENT, - body=None, - attributes={ - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": ( - PRESENT - ), - "gen_ai.response.finish_reasons": [ - "stop" - ], - "gen_ai.tool.definitions": [{ - "name": TOOL_NAME, - "description": TOOL_DESCRIPTION, - "type": "function", - }], - }, - ), - ], - ), - ], - ), - SpanDigest( - name="call_llm", - attributes={ - "gen_ai.system": "gcp.vertex.agent", - "gen_ai.request.model": "mock", - "gcp.vertex.agent.invocation_id": PRESENT, - "gcp.vertex.agent.session_id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="generate_content mock", - attributes={ - "gen_ai.operation.name": "generate_content", - "gen_ai.request.model": "mock", - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": PRESENT, - "gen_ai.response.finish_reasons": ["stop"], - "gen_ai.tool.definitions": [{ - "name": TOOL_NAME, - "description": TOOL_DESCRIPTION, - "type": "function", - }], - }, - logs=[ - LogDigest( - event_name=GEN_AI_COMPLETION_DETAILS_EVENT, - body=None, - attributes={ - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": ( - PRESENT - ), - "gen_ai.response.finish_reasons": [ - "stop" - ], - "gen_ai.tool.definitions": [{ - "name": TOOL_NAME, - "description": TOOL_DESCRIPTION, - "type": "function", - }], - }, - ), - ], - ), - ], - ), - ], - ), - ], -) - -_TOOL_DEFINITION_FULL = { - "name": TOOL_NAME, - "description": TOOL_DESCRIPTION, - "parameters": { - "properties": {"arg1": {"type": "STRING"}}, - "required": ["arg1"], - "type": "OBJECT", - }, - "type": "function", -} -_TOOL_DEFINITION_NO_CONTENT = { - "name": TOOL_NAME, - "description": TOOL_DESCRIPTION, - "type": "function", -} -_SYSTEM_INSTRUCTIONS = [{"content": FULL_SYSTEM_INSTRUCTION, "type": "text"}] -_TURN_1_INPUT_MESSAGES = [{ - "role": "user", - "parts": [{"content": USER_PROMPT, "type": "text"}], -}] -_TURN_1_OUTPUT_MESSAGES = [{ - "role": "assistant", - "parts": [{ - "id": f"{TOOL_NAME}_0", - "name": TOOL_NAME, - "arguments": TOOL_ARGS, - "type": "tool_call", - }], - "finish_reason": "stop", -}] -_TURN_2_INPUT_MESSAGES = [ - { - "role": "user", - "parts": [{"content": USER_PROMPT, "type": "text"}], - }, - { - "role": "assistant", - "parts": [{ - "id": f"{TOOL_NAME}_0", - "name": TOOL_NAME, - "arguments": TOOL_ARGS, - "type": "tool_call", - }], - }, - { - "role": "user", - "parts": [{ - "id": f"{TOOL_NAME}_0", - "response": {"result": TOOL_RESULT}, - "type": "tool_call_response", - }], - }, -] -_TURN_2_OUTPUT_MESSAGES = [{ - "role": "assistant", - "parts": [{"content": FINAL_TEXT, "type": "text"}], - "finish_reason": "stop", -}] - -EXPECTED_EXPERIMENTAL_SPAN_ONLY = SpanDigest( - name="invocation", - attributes={}, - children=[ - SpanDigest( - name="invoke_agent some_root_agent", - attributes={ - "gen_ai.operation.name": "invoke_agent", - "gen_ai.agent.description": AGENT_DESCRIPTION, - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - }, - children=[ - SpanDigest( - name="call_llm", - attributes={ - "gen_ai.system": "gcp.vertex.agent", - "gen_ai.request.model": "mock", - "gcp.vertex.agent.invocation_id": PRESENT, - "gcp.vertex.agent.session_id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="generate_content mock", - attributes={ - "gen_ai.operation.name": "generate_content", - "gen_ai.request.model": "mock", - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": PRESENT, - "gen_ai.response.finish_reasons": ["stop"], - "gen_ai.input.messages": _TURN_1_INPUT_MESSAGES, - "gen_ai.system_instructions": ( - _SYSTEM_INSTRUCTIONS - ), - "gen_ai.tool.definitions": [ - _TOOL_DEFINITION_FULL - ], - "gen_ai.output.messages": ( - _TURN_1_OUTPUT_MESSAGES - ), - }, - children=[ - SpanDigest( - name="execute_tool some_tool", - attributes={ - "gen_ai.operation.name": "execute_tool", - "gen_ai.tool.description": ( - TOOL_DESCRIPTION - ), - "gen_ai.tool.name": TOOL_NAME, - "gen_ai.tool.type": "FunctionTool", - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gcp.vertex.agent.tool_call_args": "{}", - "gen_ai.tool.call.id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.tool_response": "{}", - }, - ), - ], - logs=[ - LogDigest( - event_name=GEN_AI_COMPLETION_DETAILS_EVENT, - body=None, - attributes={ - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": ( - PRESENT - ), - "gen_ai.response.finish_reasons": [ - "stop" - ], - "gen_ai.tool.definitions": [ - _TOOL_DEFINITION_NO_CONTENT - ], - }, - ), - ], - ), - ], - ), - SpanDigest( - name="call_llm", - attributes={ - "gen_ai.system": "gcp.vertex.agent", - "gen_ai.request.model": "mock", - "gcp.vertex.agent.invocation_id": PRESENT, - "gcp.vertex.agent.session_id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="generate_content mock", - attributes={ - "gen_ai.operation.name": "generate_content", - "gen_ai.request.model": "mock", - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": PRESENT, - "gen_ai.response.finish_reasons": ["stop"], - "gen_ai.input.messages": _TURN_2_INPUT_MESSAGES, - "gen_ai.system_instructions": ( - _SYSTEM_INSTRUCTIONS - ), - "gen_ai.tool.definitions": [ - _TOOL_DEFINITION_FULL - ], - "gen_ai.output.messages": ( - _TURN_2_OUTPUT_MESSAGES - ), - }, - logs=[ - LogDigest( - event_name=GEN_AI_COMPLETION_DETAILS_EVENT, - body=None, - attributes={ - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": ( - PRESENT - ), - "gen_ai.response.finish_reasons": [ - "stop" - ], - "gen_ai.tool.definitions": [ - _TOOL_DEFINITION_NO_CONTENT - ], - }, - ), - ], - ), - ], - ), - ], - ), - ], -) - -EXPECTED_EXPERIMENTAL_EVENT_ONLY = SpanDigest( - name="invocation", - attributes={}, - children=[ - SpanDigest( - name="invoke_agent some_root_agent", - attributes={ - "gen_ai.operation.name": "invoke_agent", - "gen_ai.agent.description": AGENT_DESCRIPTION, - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - }, - children=[ - SpanDigest( - name="call_llm", - attributes={ - "gen_ai.system": "gcp.vertex.agent", - "gen_ai.request.model": "mock", - "gcp.vertex.agent.invocation_id": PRESENT, - "gcp.vertex.agent.session_id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="generate_content mock", - attributes={ - "gen_ai.operation.name": "generate_content", - "gen_ai.request.model": "mock", - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": PRESENT, - "gen_ai.response.finish_reasons": ["stop"], - "gen_ai.tool.definitions": [ - _TOOL_DEFINITION_NO_CONTENT - ], - }, - children=[ - SpanDigest( - name="execute_tool some_tool", - attributes={ - "gen_ai.operation.name": "execute_tool", - "gen_ai.tool.description": ( - TOOL_DESCRIPTION - ), - "gen_ai.tool.name": TOOL_NAME, - "gen_ai.tool.type": "FunctionTool", - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gcp.vertex.agent.tool_call_args": "{}", - "gen_ai.tool.call.id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.tool_response": "{}", - }, - ), - ], - logs=[ - LogDigest( - event_name=GEN_AI_COMPLETION_DETAILS_EVENT, - body=None, - attributes={ - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": ( - PRESENT - ), - "gen_ai.response.finish_reasons": [ - "stop" - ], - "gen_ai.input.messages": ( - _TURN_1_INPUT_MESSAGES - ), - "gen_ai.system_instructions": ( - _SYSTEM_INSTRUCTIONS - ), - "gen_ai.tool.definitions": [ - _TOOL_DEFINITION_FULL - ], - "gen_ai.output.messages": ( - _TURN_1_OUTPUT_MESSAGES - ), - }, - ), - ], - ), - ], - ), - SpanDigest( - name="call_llm", - attributes={ - "gen_ai.system": "gcp.vertex.agent", - "gen_ai.request.model": "mock", - "gcp.vertex.agent.invocation_id": PRESENT, - "gcp.vertex.agent.session_id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="generate_content mock", - attributes={ - "gen_ai.operation.name": "generate_content", - "gen_ai.request.model": "mock", - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": PRESENT, - "gen_ai.response.finish_reasons": ["stop"], - "gen_ai.tool.definitions": [ - _TOOL_DEFINITION_NO_CONTENT - ], - }, - logs=[ - LogDigest( - event_name=GEN_AI_COMPLETION_DETAILS_EVENT, - body=None, - attributes={ - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": ( - PRESENT - ), - "gen_ai.response.finish_reasons": [ - "stop" - ], - "gen_ai.input.messages": ( - _TURN_2_INPUT_MESSAGES - ), - "gen_ai.system_instructions": ( - _SYSTEM_INSTRUCTIONS - ), - "gen_ai.tool.definitions": [ - _TOOL_DEFINITION_FULL - ], - "gen_ai.output.messages": ( - _TURN_2_OUTPUT_MESSAGES - ), - }, - ), - ], - ), - ], - ), - ], - ), - ], -) - -EXPECTED_EXPERIMENTAL_SPAN_AND_EVENT = SpanDigest( - name="invocation", - attributes={}, - children=[ - SpanDigest( - name="invoke_agent some_root_agent", - attributes={ - "gen_ai.operation.name": "invoke_agent", - "gen_ai.agent.description": AGENT_DESCRIPTION, - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - }, - children=[ - SpanDigest( - name="call_llm", - attributes={ - "gen_ai.system": "gcp.vertex.agent", - "gen_ai.request.model": "mock", - "gcp.vertex.agent.invocation_id": PRESENT, - "gcp.vertex.agent.session_id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="generate_content mock", - attributes={ - "gen_ai.operation.name": "generate_content", - "gen_ai.request.model": "mock", - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": PRESENT, - "gen_ai.response.finish_reasons": ["stop"], - "gen_ai.input.messages": _TURN_1_INPUT_MESSAGES, - "gen_ai.system_instructions": ( - _SYSTEM_INSTRUCTIONS - ), - "gen_ai.tool.definitions": [ - _TOOL_DEFINITION_FULL - ], - "gen_ai.output.messages": ( - _TURN_1_OUTPUT_MESSAGES - ), - }, - children=[ - SpanDigest( - name="execute_tool some_tool", - attributes={ - "gen_ai.operation.name": "execute_tool", - "gen_ai.tool.description": ( - TOOL_DESCRIPTION - ), - "gen_ai.tool.name": TOOL_NAME, - "gen_ai.tool.type": "FunctionTool", - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gcp.vertex.agent.tool_call_args": "{}", - "gen_ai.tool.call.id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.tool_response": "{}", - }, - ), - ], - logs=[ - LogDigest( - event_name=GEN_AI_COMPLETION_DETAILS_EVENT, - body=None, - attributes={ - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": ( - PRESENT - ), - "gen_ai.response.finish_reasons": [ - "stop" - ], - "gen_ai.input.messages": ( - _TURN_1_INPUT_MESSAGES - ), - "gen_ai.system_instructions": ( - _SYSTEM_INSTRUCTIONS - ), - "gen_ai.tool.definitions": [ - _TOOL_DEFINITION_FULL - ], - "gen_ai.output.messages": ( - _TURN_1_OUTPUT_MESSAGES - ), - }, - ), - ], - ), - ], - ), - SpanDigest( - name="call_llm", - attributes={ - "gen_ai.system": "gcp.vertex.agent", - "gen_ai.request.model": "mock", - "gcp.vertex.agent.invocation_id": PRESENT, - "gcp.vertex.agent.session_id": PRESENT, - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.llm_request": "{}", - "gcp.vertex.agent.llm_response": "{}", - "gen_ai.response.finish_reasons": ["stop"], - }, - children=[ - SpanDigest( - name="generate_content mock", - attributes={ - "gen_ai.operation.name": "generate_content", - "gen_ai.request.model": "mock", - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": PRESENT, - "gen_ai.response.finish_reasons": ["stop"], - "gen_ai.input.messages": _TURN_2_INPUT_MESSAGES, - "gen_ai.system_instructions": ( - _SYSTEM_INSTRUCTIONS - ), - "gen_ai.tool.definitions": [ - _TOOL_DEFINITION_FULL - ], - "gen_ai.output.messages": ( - _TURN_2_OUTPUT_MESSAGES - ), - }, - logs=[ - LogDigest( - event_name=GEN_AI_COMPLETION_DETAILS_EVENT, - body=None, - attributes={ - "gen_ai.agent.name": AGENT_NAME, - "gen_ai.conversation.id": PRESENT, - "user.id": "test_user", - "gcp.vertex.agent.event_id": PRESENT, - "gcp.vertex.agent.invocation_id": ( - PRESENT - ), - "gen_ai.response.finish_reasons": [ - "stop" - ], - "gen_ai.input.messages": ( - _TURN_2_INPUT_MESSAGES - ), - "gen_ai.system_instructions": ( - _SYSTEM_INSTRUCTIONS - ), - "gen_ai.tool.definitions": [ - _TOOL_DEFINITION_FULL - ], - "gen_ai.output.messages": ( - _TURN_2_OUTPUT_MESSAGES - ), - }, - ), - ], - ), - ], - ), - ], - ), - ], -) - -ALL_CASES: list[FunctionalTestCase] = [ - FunctionalTestCase( - test_id="stable-no-capture", - semconv_opt_in=None, - capture_content="false", - expected_root=EXPECTED_STABLE_NO_CAPTURE, - ), - FunctionalTestCase( - test_id="stable-capture", - semconv_opt_in=None, - capture_content="true", - expected_root=EXPECTED_STABLE_CAPTURE, - ), - FunctionalTestCase( - test_id="experimental-no-content", - semconv_opt_in=EXPERIMENTAL_OPT_IN, - capture_content="no_content", - expected_root=EXPECTED_EXPERIMENTAL_NO_CONTENT, - ), - FunctionalTestCase( - test_id="experimental-span-only", - semconv_opt_in=EXPERIMENTAL_OPT_IN, - capture_content="span_only", - expected_root=EXPECTED_EXPERIMENTAL_SPAN_ONLY, - ), - FunctionalTestCase( - test_id="experimental-event-only", - semconv_opt_in=EXPERIMENTAL_OPT_IN, - capture_content="event_only", - expected_root=EXPECTED_EXPERIMENTAL_EVENT_ONLY, - ), - FunctionalTestCase( - test_id="experimental-span-and-event", - semconv_opt_in=EXPERIMENTAL_OPT_IN, - capture_content="span_and_event", - expected_root=EXPECTED_EXPERIMENTAL_SPAN_AND_EVENT, - ), -] - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - "case", - ALL_CASES, - ids=[c.test_id for c in ALL_CASES], -) -async def test_telemetry_shapes( - case: FunctionalTestCase, - monkeypatch: pytest.MonkeyPatch, -): - # Arrange - case.apply_env(monkeypatch) - span_exporter = InMemorySpanExporter() - log_exporter = InMemoryLogRecordExporter() - install_telemetry(monkeypatch, span_exporter, log_exporter) - runner = build_test_runner() - - # Act - await run_agent_scenario(runner) - - # Assert - spans = span_exporter.get_finished_spans() - logs = log_exporter.get_finished_logs() - root_digest = SpanDigest.build(tuple(spans), tuple(logs)) - - assert root_digest == case.expected_root diff --git a/tests/unittests/telemetry/test_google_cloud.py b/tests/unittests/telemetry/test_google_cloud.py index 284a51539e..496f093d26 100644 --- a/tests/unittests/telemetry/test_google_cloud.py +++ b/tests/unittests/telemetry/test_google_cloud.py @@ -52,6 +52,18 @@ def test_get_gcp_exporters( "google.auth.default", auth_mock, ) + monkeypatch.setattr( + "google.adk.telemetry.google_cloud._get_gcp_span_exporter", + lambda credentials: mock.MagicMock(), + ) + monkeypatch.setattr( + "google.adk.telemetry.google_cloud._get_gcp_metrics_exporter", + lambda project_id: mock.MagicMock(), + ) + monkeypatch.setattr( + "google.adk.telemetry.google_cloud._get_gcp_logs_exporter", + lambda project_id: mock.MagicMock(), + ) # Act. otel_hooks = get_gcp_exporters( diff --git a/tests/unittests/telemetry/test_instrumentation.py b/tests/unittests/telemetry/test_instrumentation.py index cdbb8f3af1..8e46995827 100644 --- a/tests/unittests/telemetry/test_instrumentation.py +++ b/tests/unittests/telemetry/test_instrumentation.py @@ -19,6 +19,7 @@ from google.adk.telemetry import _instrumentation from opentelemetry import trace +import pytest def test_get_elapsed_ms_span_none(): @@ -80,3 +81,37 @@ def test_get_elapsed_ms_span_non_int_end(): with mock.patch("time.monotonic", return_value=12.0): elapsed = _instrumentation._get_elapsed_ms(mock_span, start_time) assert elapsed == 2000.0 + + +@pytest.mark.asyncio +async def test_record_agent_invocation_tolerates_minimal_context(): + """Tolerates context-likes that lack user_content or session. + + Test doubles, partial migrations, and external embedders can pass an + InvocationContext-like object without `user_content` or with a `session` + that has no `events` attribute. The telemetry path must not raise + AttributeError on the metrics call in those cases. + """ + agent = mock.MagicMock() + agent.name = "test_agent" + # Bare object without `user_content` and without `session`. + bare_ctx = object() + + with ( + mock.patch.object( + _instrumentation, "_record_agent_metrics" + ) as mock_record, + mock.patch.object(_instrumentation, "tracing") as mock_tracing, + ): + mock_tracing.tracer.start_as_current_span.return_value.__enter__.return_value = mock.MagicMock( + spec=trace.Span + ) + async with _instrumentation.record_agent_invocation(bare_ctx, agent): + pass + + mock_record.assert_called_once() + call_args = mock_record.call_args + # positional: (agent_name, elapsed_ms, user_content, events, caught_error) + assert call_args.args[0] == "test_agent" + assert call_args.args[2] is None # user_content default + assert call_args.args[3] == [] # events default diff --git a/tests/unittests/telemetry/test_node_functional.py b/tests/unittests/telemetry/test_node_functional.py new file mode 100644 index 0000000000..661cbb3d45 --- /dev/null +++ b/tests/unittests/telemetry/test_node_functional.py @@ -0,0 +1,476 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from contextlib import aclosing +from dataclasses import dataclass +from dataclasses import field +import sys + +if sys.version_info >= (3, 11): + from typing import Self +else: + from typing_extensions import Self + +from google.adk import Event +from google.adk import Workflow +from google.adk.agents.llm_agent import Agent +from google.adk.runners import InMemoryRunner +from google.adk.telemetry import node_tracing +from google.adk.telemetry import tracing +from google.adk.tools.function_tool import FunctionTool +from google.adk.workflow._base_node import START +from google.adk.workflow._workflow import Workflow +from google.genai.types import Content +from google.genai.types import Part +from opentelemetry.sdk.trace import ReadableSpan +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import SimpleSpanProcessor +from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter +from opentelemetry.util.types import AttributeValue +import pytest + +from ..testing_utils import MockModel +from ..testing_utils import TestInMemoryRunner +from .utils import set_aclosing_wrapping_assertions + +# Difficult to extract, non deterministic attribute keys. +# We check only for their presence, instead of their values. +NON_DETERMINISTIC_ATTRIBUTE_KEYS = { + 'gcp.vertex.agent.event_id', + 'gen_ai.tool.call.id', + 'gcp.vertex.agent.associated_event_ids', +} + +# We replace the non deterministic fields that are difficult to extract +# with a "PRESENT" literal to still test their presence. +PRESENT = 'PRESENT' + + +@dataclass(frozen=True) +class SpanDigest: + name: str + attributes: dict[str, AttributeValue] + children: list[SpanDigest] = field(default_factory=list) + + @staticmethod + def build(spans: tuple[ReadableSpan, ...]) -> SpanDigest: + """Builds the in-memory span tree. + + Used for clear diff with pytest assertions. + """ + digest_by_id = { + span.context.span_id: SpanDigest.from_span(span) + for span in spans + if span.context is not None + } + root = None + for span in spans: + if span.context is None: + continue + digest = digest_by_id[span.context.span_id] + if span.parent and span.parent.span_id in digest_by_id: + parent_digest = digest_by_id[span.parent.span_id] + parent_digest.children.append(digest) + else: + if root is not None: + raise ValueError('Multiple root spans found.') + root = digest + + # Sort children for deterministic comparisons. + for digest in digest_by_id.values(): + digest.children.sort(key=lambda span: span.name) + + if root is None: + raise ValueError('No root span found in the provided spans.') + return root + + @classmethod + def from_span(cls, span: ReadableSpan) -> Self: + determinized_attributes = { + attr_key: ( + attr_val + if attr_key not in NON_DETERMINISTIC_ATTRIBUTE_KEYS + else PRESENT + ) + for attr_key, attr_val in (span.attributes or {}).items() + } + + return cls( + name=span.name, + attributes=determinized_attributes, + ) + + +@pytest.fixture +def span_exporter(monkeypatch: pytest.MonkeyPatch) -> InMemorySpanExporter: + # Disable capturing message content to make attributes deterministic + monkeypatch.setenv('ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS', 'false') + + tracer_provider = TracerProvider() + span_exporter = InMemorySpanExporter() + tracer_provider.add_span_processor(SimpleSpanProcessor(span_exporter)) + real_tracer = tracer_provider.get_tracer(__name__) + + def do_replace(tracer): + monkeypatch.setattr( + tracer, 'start_as_current_span', real_tracer.start_as_current_span + ) + + do_replace(tracing.tracer) + do_replace(node_tracing.tracer) + + return span_exporter + + +@pytest.mark.asyncio +async def test_tracer_start_as_current_span( + span_exporter: InMemorySpanExporter, +): + """Test creation of multiple spans and their attributes in an E2E runner invocation with a workflow.""" + + # Arrange + set_aclosing_wrapping_assertions() + + mock_model = MockModel.create( + responses=[ + Part.from_function_call(name='some_tool', args={'arg1': 'val1'}), + Part.from_text(text='text response'), + ] + ) + + def some_tool(arg1: str): + """A sample tool.""" + + return f'processed {arg1}' + + test_agent = Agent( + name='some_root_agent', + description='A sample root agent.', + model=mock_model, + tools=[ + FunctionTool(some_tool), + ], + ) + + async def some_node(ctx, node_input): + return 'some result' + + workflow = Workflow( + name='my_workflow', + edges=[ + (START, some_node, test_agent), + ], + ) + + user_id = 'some_user' + app_name = 'some_app' + + runner = InMemoryRunner(app_name=app_name, node=workflow) + session = await runner.session_service.create_session( + app_name=app_name, user_id=user_id + ) + content = Content(parts=[Part.from_text(text='hello')], role='user') + + # Act + captured_events: list[Event] = [] + async with aclosing( + runner.run_async( + user_id=user_id, session_id=session.id, new_message=content + ) + ) as agen: + async for event in agen: + captured_events.append(event) + + invocation_id = captured_events[0].invocation_id + + # Assert + finished_spans = span_exporter.get_finished_spans() + _verify_associated_events(finished_spans, captured_events) + + span_tree = SpanDigest.build(finished_spans) + assert span_tree == SpanDigest( + name='invocation', + attributes={}, + children=[ + SpanDigest( + name='invoke_workflow my_workflow', + attributes={ + 'gen_ai.conversation.id': session.id, + 'gen_ai.operation.name': 'invoke_workflow', + 'gen_ai.workflow.name': 'my_workflow', + # Workflow in this test doesn't emit any events directly. + # Commented exists to to document this behavior. + # 'gcp.vertex.agent.associated_event_ids': PRESENT, + }, + children=[ + SpanDigest( + name='invoke_agent some_root_agent', + attributes={ + 'gen_ai.agent.description': 'A sample root agent.', + 'gen_ai.agent.name': 'some_root_agent', + 'gen_ai.conversation.id': session.id, + 'gen_ai.operation.name': 'invoke_agent', + }, + children=[ + SpanDigest( + name='call_llm', + attributes={ + 'gcp.vertex.agent.event_id': PRESENT, + 'gcp.vertex.agent.invocation_id': ( + invocation_id + ), + 'gcp.vertex.agent.llm_request': '{}', + 'gcp.vertex.agent.llm_response': '{}', + 'gen_ai.request.model': 'mock', + 'gen_ai.system': 'gcp.vertex.agent', + 'gcp.vertex.agent.session_id': session.id, + }, + children=[ + SpanDigest( + name='generate_content mock', + attributes={ + 'gcp.vertex.agent.event_id': PRESENT, + 'gcp.vertex.agent.invocation_id': ( + invocation_id + ), + 'gen_ai.agent.name': ( + 'some_root_agent' + ), + 'gen_ai.conversation.id': session.id, + 'gen_ai.operation.name': ( + 'generate_content' + ), + 'gen_ai.request.model': 'mock', + 'gen_ai.system': 'gemini', + }, + children=[ + SpanDigest( + name='execute_tool some_tool', + attributes={ + 'gcp.vertex.agent.event_id': ( + PRESENT + ), + 'gcp.vertex.agent.llm_request': ( + '{}' + ), + 'gcp.vertex.agent.llm_response': ( + '{}' + ), + 'gcp.vertex.agent.tool_call_args': ( + '{}' + ), + 'gcp.vertex.agent.tool_response': ( + '{}' + ), + 'gen_ai.operation.name': ( + 'execute_tool' + ), + 'gen_ai.tool.call.id': ( + PRESENT + ), + 'gen_ai.tool.description': ( + 'A sample tool.' + ), + 'gen_ai.tool.name': ( + 'some_tool' + ), + 'gen_ai.tool.type': ( + 'FunctionTool' + ), + }, + ), + ], + ), + ], + ), + SpanDigest( + name='call_llm', + attributes={ + 'gcp.vertex.agent.invocation_id': ( + invocation_id + ), + 'gcp.vertex.agent.llm_request': '{}', + 'gcp.vertex.agent.llm_response': '{}', + 'gcp.vertex.agent.event_id': PRESENT, + 'gcp.vertex.agent.session_id': session.id, + 'gen_ai.request.model': 'mock', + 'gen_ai.system': 'gcp.vertex.agent', + }, + children=[ + SpanDigest( + name='generate_content mock', + attributes={ + 'gcp.vertex.agent.event_id': PRESENT, + 'gcp.vertex.agent.invocation_id': ( + invocation_id + ), + 'gen_ai.agent.name': ( + 'some_root_agent' + ), + 'gen_ai.conversation.id': session.id, + 'gen_ai.operation.name': ( + 'generate_content' + ), + 'gen_ai.request.model': 'mock', + 'gen_ai.system': 'gemini', + }, + ), + ], + ), + ], + ), + SpanDigest( + name='invoke_node some_node', + attributes={ + 'gen_ai.conversation.id': session.id, + 'gen_ai.operation.name': 'invoke_node', + 'gcp.vertex.agent.associated_event_ids': 'PRESENT', + }, + ), + ], + ), + ], + ) + + +def _verify_associated_events( + spans: tuple[ReadableSpan, ...], events: list[Event] +): + def _nodelike_name(span: ReadableSpan) -> str: + for prefix in ['invoke_node ', 'invoke_workflow ', 'invoke_agent ']: + if span.name.startswith(prefix): + return span.name.replace(prefix, '') + return '' + + def _emitting_node_name(event: Event) -> str: + # Strip out + # 1. Path except for the last node (everything before "/") + # 2. Retry count (everything after "@") + return event.node_info.path.split('/')[-1].split('@')[0] + + events_by_id = {event.id: event for event in events} + for span in spans: + if not span.attributes: + continue + + associated_ids = span.attributes.get( + 'gcp.vertex.agent.associated_event_ids', None + ) + if associated_ids is None: + continue + + assert isinstance(associated_ids, tuple) + assert len(associated_ids) > 0, f'Span name {span.name} emitted no events' + + for event_id in associated_ids: + event = events_by_id[str(event_id)] + assert _nodelike_name(span) == _emitting_node_name(event) + + +@pytest.mark.asyncio +async def test_exception_preserves_attributes( + span_exporter: InMemorySpanExporter, +): + """Test when an exception occurs during tool execution, span attributes are still present on spans where they are expected.""" + + # Arrange + mock_model = MockModel.create( + responses=[ + Part.from_function_call(name='some_tool', args={}), + ] + ) + + async def some_tool(): + """Tool that fails.""" + raise ValueError('This tool always fails') + + test_agent = Agent( + name='some_root_agent', + description='Failing agent.', + model=mock_model, + tools=[ + FunctionTool(some_tool), + ], + ) + test_runner = TestInMemoryRunner(node=test_agent) + + # Act + captured_events = [] + with pytest.raises(ValueError, match='This tool always fails'): + async with aclosing( + test_runner.run_async_with_new_session_agen('hello') + ) as agen: + async for event in agen: + captured_events.append(event) + + # Assert + spans = span_exporter.get_finished_spans() + _verify_associated_events(spans, captured_events) + spans_by_name = {span.name: span for span in spans} + + assert 'execute_tool some_tool' in spans_by_name + tool_span = spans_by_name['execute_tool some_tool'] + + attrs = dict(tool_span.attributes) + # Dynamic ID + tool_call_id = attrs.get('gen_ai.tool.call.id') + + assert dict(tool_span.attributes) == { + 'gen_ai.operation.name': 'execute_tool', + 'gen_ai.tool.name': 'some_tool', + 'gen_ai.tool.description': 'Tool that fails.', + 'gen_ai.tool.type': 'FunctionTool', + 'error.type': 'ValueError', + 'gcp.vertex.agent.llm_request': '{}', + 'gcp.vertex.agent.llm_response': '{}', + 'gcp.vertex.agent.tool_call_args': '{}', + 'gen_ai.tool.call.id': tool_call_id, + 'gcp.vertex.agent.tool_response': '{}', + } + + +@pytest.mark.asyncio +async def test_no_generate_content_for_gemini_model_when_already_instrumented( + span_exporter: InMemorySpanExporter, + monkeypatch: pytest.MonkeyPatch, +): + """Tests that generate_content span is not created if already instrumented.""" + # Arrange + mock_model = MockModel.create(responses=['hello']) + test_agent = Agent(name='test', model=mock_model) + test_runner = TestInMemoryRunner(node=test_agent) + + monkeypatch.setattr( + tracing, + '_instrumented_with_opentelemetry_instrumentation_google_genai', + lambda: True, + ) + monkeypatch.setattr( + tracing, + '_is_gemini_agent', + lambda _: True, + ) + + # Act + async with aclosing( + test_runner.run_async_with_new_session_agen('hello') + ) as agen: + async for _ in agen: + pass + + # Assert + spans = span_exporter.get_finished_spans() + assert not any(span.name.startswith('generate_content') for span in spans) diff --git a/tests/unittests/telemetry/test_setup.py b/tests/unittests/telemetry/test_setup.py index 0bd1ec7b56..bca64dd2dd 100644 --- a/tests/unittests/telemetry/test_setup.py +++ b/tests/unittests/telemetry/test_setup.py @@ -79,7 +79,7 @@ def test_maybe_set_otel_providers( """ # Arrange. for k, v in env_vars.items(): - os.environ[k] = v + monkeypatch.setenv(k, v) trace_provider_mock = mock.MagicMock() monkeypatch.setattr( "opentelemetry.trace.set_tracer_provider", @@ -95,6 +95,18 @@ def test_maybe_set_otel_providers( "opentelemetry._logs.set_logger_provider", logs_provider_mock, ) + monkeypatch.setattr( + "google.adk.telemetry.setup._get_otel_span_exporter", + lambda: mock.MagicMock(), + ) + monkeypatch.setattr( + "google.adk.telemetry.setup._get_otel_metrics_exporter", + lambda: mock.MagicMock(), + ) + monkeypatch.setattr( + "google.adk.telemetry.setup._get_otel_logs_exporter", + lambda: mock.MagicMock(), + ) # Act. maybe_set_otel_providers() diff --git a/tests/unittests/telemetry/test_spans.py b/tests/unittests/telemetry/test_spans.py index c0e4cc20b9..50fc192417 100644 --- a/tests/unittests/telemetry/test_spans.py +++ b/tests/unittests/telemetry/test_spans.py @@ -27,6 +27,7 @@ from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.telemetry._experimental_semconv import _safe_json_serialize_no_whitespaces from google.adk.telemetry.tracing import _safe_json_serialize +from google.adk.telemetry.tracing import _use_extra_generate_content_attributes from google.adk.telemetry.tracing import ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS from google.adk.telemetry.tracing import GCP_MCP_SERVER_DESTINATION_ID from google.adk.telemetry.tracing import trace_agent_invocation @@ -810,12 +811,14 @@ async def test_trace_send_data_disabling_request_response_content( return_value='test_system', ) @pytest.mark.parametrize('capture_content', [True, False]) +@pytest.mark.parametrize('user_id', ['some-user-id', None]) async def test_generate_content_span( mock_guess_system_name, mock_tracer, mock_otel_logger, monkeypatch, capture_content, + user_id, ): """Test native generate_content span creation with attributes and logs.""" # Arrange @@ -830,7 +833,7 @@ async def test_generate_content_span( agent = LlmAgent(name='test_agent', model='not-a-gemini-model') invocation_context = await _create_invocation_context(agent) - + invocation_context.session.user_id = user_id system_instruction = types.Content( parts=[types.Part.from_text(text='You are a helpful assistant.')], ) @@ -889,11 +892,15 @@ async def test_generate_content_span( mock_span.set_attributes.assert_called_once_with({ GEN_AI_AGENT_NAME: invocation_context.agent.name, GEN_AI_CONVERSATION_ID: invocation_context.session.id, - USER_ID: invocation_context.session.user_id, 'gcp.vertex.agent.event_id': 'event-123', 'gcp.vertex.agent.invocation_id': invocation_context.invocation_id, }) + all_set_attribute_keys = [ + call.args[0] for call in mock_span.set_attribute.call_args_list + ] + assert USER_ID not in all_set_attribute_keys + # Assert Logs assert mock_otel_logger.emit.call_count == 4 @@ -932,8 +939,11 @@ async def test_generate_content_span( assert len(user_logs) == 2 assert expected_user1_body == user_logs[0].body assert expected_user2_body == user_logs[1].body + expected_user_log_attributes = {GEN_AI_SYSTEM: 'test_system'} + if capture_content and user_id is not None: + expected_user_log_attributes[USER_ID] = user_id for log in user_logs: - assert log.attributes == {GEN_AI_SYSTEM: 'test_system'} + assert log.attributes == expected_user_log_attributes choice_log = next( (lr for lr in log_records if lr.event_name == 'gen_ai.choice'), @@ -944,6 +954,52 @@ async def test_generate_content_span( assert choice_log.attributes == {GEN_AI_SYSTEM: 'test_system'} +@pytest.mark.asyncio +@mock.patch( + 'google.adk.telemetry.tracing._use_extra_generate_content_attributes' +) +async def test_generate_content_span_with_genai_instrumentation( + mock_use_extra, + monkeypatch, +): + """Test that genai-instrumentation delegation branch does not forward USER_ID in attributes.""" + monkeypatch.setattr( + 'google.adk.telemetry.tracing._instrumented_with_opentelemetry_instrumentation_google_genai', + lambda: True, + ) + # _is_gemini_agent returns true for gemini models. + agent = LlmAgent(name='test_agent', model='gemini-1.5-pro') + invocation_context = await _create_invocation_context(agent) + + llm_request = LlmRequest( + model='gemini-1.5-pro', + contents=[types.Content(role='user', parts=[types.Part(text='Hello')])], + ) + + model_response_event = mock.MagicMock() + model_response_event.id = 'event-123' + + mock_cm = mock.MagicMock() + mock_use_extra.return_value = mock_cm + + async with use_inference_span( + llm_request, invocation_context, model_response_event + ): + pass + + mock_use_extra.assert_called_once() + args, _ = mock_use_extra.call_args + common_attributes = args[0] + + assert GEN_AI_AGENT_NAME in common_attributes + assert GEN_AI_CONVERSATION_ID in common_attributes + assert 'gcp.vertex.agent.event_id' in common_attributes + assert 'gcp.vertex.agent.invocation_id' in common_attributes + + # USER_ID should NOT be in common_attributes passed to the genai instrumentor + assert USER_ID not in common_attributes + + def _mock_callable_tool(): """Description of some tool.""" return 'result' @@ -1001,12 +1057,14 @@ def _mock_tool_dict() -> types.ToolDict: 'capture_content', ['SPAN_AND_EVENT', 'EVENT_ONLY', 'SPAN_ONLY', 'NO_CONTENT'], ) +@pytest.mark.parametrize('user_id', ['some-user-id', None]) async def test_generate_content_span_with_experimental_semconv( mock_guess_system_name, mock_tracer, mock_otel_logger, monkeypatch, capture_content, + user_id, ): """Test native generate_content span creation with attributes and logs with experimental semconv enabled.""" # Arrange @@ -1025,6 +1083,7 @@ async def test_generate_content_span_with_experimental_semconv( agent = LlmAgent(name='test_agent', model='not-a-gemini-model') invocation_context = await _create_invocation_context(agent) + invocation_context.session.user_id = user_id system_instruction = types.Content( parts=[types.Part.from_text(text='You are a helpful assistant.')], @@ -1209,11 +1268,15 @@ async def test_generate_content_span_with_experimental_semconv( mock_span.set_attributes.assert_called_once_with({ GEN_AI_AGENT_NAME: invocation_context.agent.name, GEN_AI_CONVERSATION_ID: invocation_context.session.id, - USER_ID: invocation_context.session.user_id, 'gcp.vertex.agent.event_id': 'event-123', 'gcp.vertex.agent.invocation_id': invocation_context.invocation_id, }) + all_set_attribute_keys = [ + call.args[0] for call in mock_span.set_attribute.call_args_list + ] + assert USER_ID not in all_set_attribute_keys + if capture_content in ['SPAN_AND_EVENT', 'SPAN_ONLY']: mock_span.set_attribute.assert_any_call( GEN_AI_SYSTEM_INSTRUCTIONS, @@ -1260,6 +1323,15 @@ async def test_generate_content_span_with_experimental_semconv( attributes = operation_details_log.attributes + if ( + capture_content in ['EVENT_ONLY', 'SPAN_AND_EVENT'] + and user_id is not None + ): + assert USER_ID in attributes + assert attributes[USER_ID] == user_id + else: + assert USER_ID not in attributes + if capture_content in ['SPAN_AND_EVENT', 'EVENT_ONLY']: assert GEN_AI_SYSTEM_INSTRUCTIONS in attributes assert ( @@ -1397,3 +1469,295 @@ def test_safe_json_serialize_no_whitespaces_circular_dict_returns_not_serializab obj = {} obj['self'] = obj assert _safe_json_serialize_no_whitespaces(obj) == '' + + +def test_use_extra_generate_content_attributes_upgraded_version(monkeypatch): + # Arrange: Mock the presence of the new event-only context key in the contrib module + from opentelemetry.instrumentation import google_genai + + mock_event_only_key = 'MOCKED_EVENT_ONLY_EXTRA_ATTRIBUTES_CONTEXT_KEY' + monkeypatch.setattr( + google_genai, + 'GENERATE_CONTENT_EVENT_ONLY_EXTRA_ATTRIBUTES_CONTEXT_KEY', + mock_event_only_key, + raising=False, + ) + + # Act: Run the helper with mock.patch on the otel context + with mock.patch('opentelemetry.context.set_value') as mock_set_value: + with _use_extra_generate_content_attributes( + extra_attributes={'span.attr': 'value'}, + log_only_extra_attributes={USER_ID: 'user_123'}, + ): + pass + + # Assert: Verify set_value was called with the mocked event-only key + mock_set_value.assert_any_call( + mock_event_only_key, + {USER_ID: 'user_123'}, + context=mock.ANY, + ) + + +def test_use_extra_generate_content_attributes_older_version(monkeypatch): + # Arrange: Simulate an older version by deleting the key if present + from opentelemetry.instrumentation import google_genai + + if hasattr( + google_genai, 'GENERATE_CONTENT_EVENT_ONLY_EXTRA_ATTRIBUTES_CONTEXT_KEY' + ): + monkeypatch.delattr( + google_genai, 'GENERATE_CONTENT_EVENT_ONLY_EXTRA_ATTRIBUTES_CONTEXT_KEY' + ) + + # Act & Assert: Ensure execution does not throw any ImportError/AttributeError + try: + with _use_extra_generate_content_attributes( + extra_attributes={'span.attr': 'value'}, + log_only_extra_attributes={USER_ID: 'user_123'}, + ): + pass + except Exception as e: # pylint: disable=broad-exception-caught + pytest.fail(f'Graceful degradation failed: {e}') + + +# --------------------------------------------------------------------------- +# Tests for _detect_error_in_response +# --------------------------------------------------------------------------- + + +class _ErrorDetectingTool(BaseTool): + """A test tool whose _detect_error_in_response raises.""" + + async def run_async(self, *, args, tool_context): + return 'result' + + def _detect_error_in_response(self, response: Any) -> Optional[str]: + raise RuntimeError('detection exploded') + + +def test_base_tool_does_not_define_detect_error_in_response(): + """BaseTool intentionally does not expose _detect_error_in_response as a public hook.""" + tool = SimpleTestTool(name='t', description='d') + # The hook is opt-in per subclass; BaseTool itself must not declare it so + # that telemetry callers can use getattr(...) to skip detection. + assert not hasattr(tool, '_detect_error_in_response') + + +def test_detect_error_function_tool_error(): + from google.adk.tools.function_tool import FunctionTool + + tool = FunctionTool(func=lambda: None) + assert ( + tool._detect_error_in_response({'error': 'missing arg'}) == 'TOOL_ERROR' + ) + + +def test_detect_error_function_tool_no_error(): + from google.adk.tools.function_tool import FunctionTool + + tool = FunctionTool(func=lambda: None) + assert tool._detect_error_in_response({'result': 'ok'}) is None + assert tool._detect_error_in_response('plain string') is None + assert tool._detect_error_in_response(None) is None + + +def test_detect_error_rest_api_tool(): + from google.adk.tools.openapi_tool.openapi_spec_parser.rest_api_tool import RestApiTool + + tool = RestApiTool.__new__(RestApiTool) + assert ( + tool._detect_error_in_response({'error': 'Status Code: 404'}) + == 'HTTP_ERROR' + ) + assert tool._detect_error_in_response({'result': 'ok'}) is None + assert tool._detect_error_in_response({'text': 'html response'}) is None + + +def test_detect_error_mcp_tool(): + from google.adk.tools.mcp_tool.mcp_tool import McpTool as AdkMcpTool + + tool = AdkMcpTool.__new__(AdkMcpTool) + assert ( + tool._detect_error_in_response({'isError': True, 'content': []}) + == 'MCP_TOOL_ERROR' + ) + assert ( + tool._detect_error_in_response({'isError': False, 'content': []}) is None + ) + assert tool._detect_error_in_response({'content': [{'text': 'ok'}]}) is None + + +def test_detect_error_google_tool(): + from google.adk.tools.google_tool import GoogleTool + + tool = GoogleTool.__new__(GoogleTool) + assert ( + tool._detect_error_in_response( + {'status': 'ERROR', 'error_details': 'fail'} + ) + == 'TOOL_ERROR' + ) + assert tool._detect_error_in_response({'status': 'OK', 'data': []}) is None + assert ( + tool._detect_error_in_response({'error': 'something'}) is None + ) # GoogleTool checks status, not error key + + +def test_detect_error_bash_tool(): + from google.adk.tools.bash_tool import ExecuteBashTool + + tool = ExecuteBashTool.__new__(ExecuteBashTool) + assert ( + tool._detect_error_in_response({'error': 'Execution failed'}) + == 'TOOL_ERROR' + ) + assert ( + tool._detect_error_in_response( + {'error': 'timeout', 'stdout': '', 'stderr': ''} + ) + == 'TOOL_ERROR' + ) + assert ( + tool._detect_error_in_response({'stdout': 'ok', 'returncode': 0}) is None + ) + + +def _environment_tool_classes(): + from google.adk.tools.environment._edit_file_tool import EditFileTool + from google.adk.tools.environment._execute_tool import ExecuteTool + from google.adk.tools.environment._read_file_tool import ReadFileTool + from google.adk.tools.environment._write_file_tool import WriteFileTool + + return [ExecuteTool, ReadFileTool, WriteFileTool, EditFileTool] + + +@pytest.mark.parametrize( + 'cls', + _environment_tool_classes(), + ids=lambda c: c.__name__, +) +@pytest.mark.parametrize( + 'response,expected', + [ + ({'status': 'error', 'error': 'fail'}, 'TOOL_ERROR'), + ({'status': 'ok', 'message': 'done'}, None), + # Environment tools check status, not the error key. + ({'error': 'something'}, None), + ], + ids=['status_error', 'status_ok', 'error_key_only'], +) +def test_detect_error_environment_tools(cls, response, expected): + tool = cls.__new__(cls) + assert tool._detect_error_in_response(response) == expected + + +@pytest.mark.parametrize( + 'cls_name', + ['LoadSkillTool', 'LoadSkillResourceTool', 'RunSkillScriptTool'], +) +@pytest.mark.parametrize( + 'response,expected', + [ + ( + {'error': 'missing', 'error_code': 'INVALID_ARGUMENTS'}, + 'INVALID_ARGUMENTS', + ), + ({'error': 'generic'}, 'TOOL_ERROR'), + ({'skill_name': 'x', 'instructions': 'y'}, None), + ], + ids=['with_error_code', 'error_no_code', 'no_error'], +) +def test_detect_error_skill_tools(cls_name, response, expected): + skill_toolset = pytest.importorskip('google.adk.tools.skill_toolset') + cls = getattr(skill_toolset, cls_name) + tool = cls.__new__(cls) + assert tool._detect_error_in_response(response) == expected + + +def test_detect_error_discovery_engine_search_tool(): + mod = pytest.importorskip('google.adk.tools.discovery_engine_search_tool') + DiscoveryEngineSearchTool = mod.DiscoveryEngineSearchTool + + tool = DiscoveryEngineSearchTool.__new__(DiscoveryEngineSearchTool) + assert ( + tool._detect_error_in_response( + {'status': 'error', 'error_message': 'fail'} + ) + == 'TOOL_ERROR' + ) + assert tool._detect_error_in_response({'status': 'ok', 'results': []}) is None + + +# --------------------------------------------------------------------------- +# Tests for trace_tool_call with error_type parameter +# --------------------------------------------------------------------------- + + +def test_trace_tool_call_with_error_type( + monkeypatch, mock_span_fixture, mock_tool_fixture +): + """error_type sets the span error.type attribute when no exception.""" + monkeypatch.setattr( + 'opentelemetry.trace.get_current_span', lambda: mock_span_fixture + ) + + trace_tool_call( + tool=mock_tool_fixture, + args={'x': 1}, + function_response_event=None, + error=None, + error_type='HTTP_ERROR', + ) + + mock_span_fixture.set_attribute.assert_any_call('error.type', 'HTTP_ERROR') + + +def test_trace_tool_call_error_takes_precedence_over_error_type( + monkeypatch, mock_span_fixture, mock_tool_fixture +): + """When both error and error_type are provided, error takes precedence.""" + monkeypatch.setattr( + 'opentelemetry.trace.get_current_span', lambda: mock_span_fixture + ) + + trace_tool_call( + tool=mock_tool_fixture, + args={'x': 1}, + function_response_event=None, + error=ValueError('boom'), + error_type='HTTP_ERROR', + ) + + # ValueError should be set, not HTTP_ERROR. + mock_span_fixture.set_attribute.assert_any_call('error.type', 'ValueError') + error_type_calls = [ + c + for c in mock_span_fixture.set_attribute.call_args_list + if c == mock.call('error.type', mock.ANY) + ] + assert len(error_type_calls) == 1 + + +def test_trace_tool_call_no_error_no_error_type( + monkeypatch, mock_span_fixture, mock_tool_fixture +): + """When neither error nor error_type is set, no error.type attribute.""" + monkeypatch.setattr( + 'opentelemetry.trace.get_current_span', lambda: mock_span_fixture + ) + + trace_tool_call( + tool=mock_tool_fixture, + args={'x': 1}, + function_response_event=None, + error=None, + error_type=None, + ) + + error_type_calls = [ + c + for c in mock_span_fixture.set_attribute.call_args_list + if c == mock.call('error.type', mock.ANY) + ] + assert len(error_type_calls) == 0 diff --git a/tests/unittests/telemetry/utils.py b/tests/unittests/telemetry/utils.py new file mode 100644 index 0000000000..758483ce91 --- /dev/null +++ b/tests/unittests/telemetry/utils.py @@ -0,0 +1,111 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from collections.abc import AsyncGenerator +from contextlib import aclosing +import gc +import inspect +import sys +from types import CodeType +from typing import Any + + +def set_aclosing_wrapping_assertions(): + firstiter, finalizer = sys.get_asyncgen_hooks() + + def wrapped_firstiter(coro: AsyncGenerator[Any, Any]): + nonlocal firstiter + + if _is_async_context_manager(): + if firstiter: + firstiter(coro) + return + + assert any( + isinstance(referrer, aclosing) + or isinstance(indirect_referrer, aclosing) + for referrer in gc.get_referrers(coro) + # Some coroutines have a layer of indirection in Python 3.10 + for indirect_referrer in gc.get_referrers(referrer) + ), _no_aclosing_assertion_error(coro) + + if firstiter: + firstiter(coro) + + sys.set_asyncgen_hooks(wrapped_firstiter, finalizer) + + +def _no_aclosing_assertion_error(coro: AsyncGenerator[Any, Any]): + first_iter_loc = "" + definition_loc = "" + + # Get frame where the async generator was first called. + # 1. currentframe returns `_no_aclosing_assertion_error` (current function) frame. + # 2. First f.back returns `wrapped_firstiter` frame. + # 3. Second f.back returns code location where the generator is first iterated, + # where wrapping in aclosing should happen. + if (f := inspect.currentframe()) and (f := f.f_back) and (f := f.f_back): + first_iter_loc = f'file "{f.f_code.co_filename}" line "{f.f_lineno}"' + # In case the code location of first iteration is missing or incorrect, + # the place where async generator is defined is useful, because + # it's possible to iterate through references of the async generator. + if (ag_code := getattr(coro, "ag_code", None)) and isinstance( + ag_code, CodeType + ): + definition_loc = ( + f'file "{ag_code.co_filename}" line "{ag_code.co_firstlineno}"' + ) + + header_str = f'Async generator "{coro.__name__}" is not wrapped in aclosing' + first_iter_str = ( + f"first iterated in {first_iter_loc}" if first_iter_loc else "" + ) + definition_str = f"defined in {definition_loc}" if definition_loc else "" + instruction_str = """ +Wrap the iteration in the following code snippet before iterating: + +async with contextlib.aclosing(...) as agen: + async for ... as agen: + ... +""" + + return "\n".join( + part + for part in [ + header_str, + first_iter_str, + definition_str, + instruction_str, + ] + if part + ) + + +def _is_async_context_manager(): + """Checks if this function was invoked by contextlib.asynccontextmanager. + + contextlib.asynccontextmanager is implemented on top of async generators. + We don't need to however check if these are wrapped in aclosing, because + they cannot be interrupted midway through their execution if + all async generators in the application flow are wrapped in aclosing. + """ + frame = inspect.currentframe() + while frame: + if ( + frame.f_code.co_name == "__aenter__" + and "contextlib" in frame.f_code.co_filename + ): + return True + frame = frame.f_back + return False diff --git a/tests/unittests/test_optional_dependencies.py b/tests/unittests/test_optional_dependencies.py new file mode 100644 index 0000000000..f75516d21d --- /dev/null +++ b/tests/unittests/test_optional_dependencies.py @@ -0,0 +1,287 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for optional dependencies and lazy loading. + +Includes both fast hermetic unit tests (run by default) and high-fidelity +integration tests using a clean venv (skipped by default, run via env var). +""" + +from __future__ import annotations + +import os +from pathlib import Path +import subprocess +import sys +from unittest import mock + +import pytest + +_REPO_ROOT = Path(__file__).resolve().parents[2] + +# Check if we should run integration tests that require network/install +RUN_INTEGRATION = os.environ.get("ADK_TEST_NETWORK") == "1" + + +@pytest.fixture(scope="session") +def clean_core_venv(tmp_path_factory): + """Creates a clean venv with only core ADK installed (requires network).""" + if not RUN_INTEGRATION: + pytest.skip("Integration tests requiring network are disabled by default.") + + venv_path = tmp_path_factory.mktemp("adk_core_venv") + python_exe = venv_path / "bin" / "python" + + # Create venv using uv for speed + subprocess.run( + ["uv", "venv", str(venv_path), "--python", "3.11"], + check=True, + capture_output=True, + ) + + # Install core ADK from local repo (uses current pyproject.toml) + subprocess.run( + ["uv", "pip", "install", "--python", str(python_exe), str(_REPO_ROOT)], + check=True, + capture_output=True, + ) + + return python_exe + + +# ============================================================================= +# Approach 1: Hermetic Unit Tests (Fast, No Network, Safe for CI/TAP) +# ============================================================================= + + +def test_pydantic_version(): + """Print the installed Pydantic version.""" + import pydantic + + print(f"Pydantic version: {pydantic.__version__}") + assert True + + +def test_no_eager_imports(): + """Verify that importing google.adk does not eagerly load heavy optional deps. + + Runs in the current environment but in a fresh subprocess, ensuring it + only checks the import side-effects without modifying the environment. + """ + code = """ +import sys +import google.adk +heavy_modules = ['google.cloud.aiplatform', 'sqlalchemy', 'a2a'] +loaded = [mod for mod in heavy_modules if mod in sys.modules] +print(','.join(loaded)) +""" + result = subprocess.run( + [sys.executable, "-c", code], capture_output=True, text=True, check=True + ) + loaded_modules = result.stdout.strip() + assert loaded_modules == "", f"Heavy modules loaded eagerly: {loaded_modules}" + + +def test_a2a_remote_agent_config_raises_importerror(): + """Verify that accessing A2aRemoteAgentConfig without extra raises ImportError using mocks.""" + with mock.patch.dict("sys.modules", {"a2a": None}): + for mod in list(sys.modules): + if mod.startswith("a2a.") or mod.startswith("google.adk.a2a."): + sys.modules.pop(mod, None) + with pytest.raises(ImportError) as exc_info: + from google.adk.a2a.agent import A2aRemoteAgentConfig + assert "a2a-sdk" in str(exc_info.value) + + +def test_vertex_ai_memory_bank_service_fails_on_creation(): + """Verify that creating VertexAiMemoryBankService without extra fails using mocks.""" + try: + from google.adk.memory import VertexAiMemoryBankService + except KeyError as e: + if "pydantic.root_model" in str(e): + pytest.skip( + "Skipping mock test due to Pydantic/MCP environment conflict" + " (KeyError: 'pydantic.root_model')." + ) + raise + + with mock.patch.dict("sys.modules", {"vertexai": None}): + sys.modules.pop("google.adk.memory.vertex_ai_memory_bank_service", None) + from google.adk.memory import VertexAiMemoryBankService + + with pytest.raises(ImportError) as exc_info: + VertexAiMemoryBankService(agent_engine_id="123") + assert "google-cloud-aiplatform" in str(exc_info.value) + + +def test_database_session_service_fails_on_creation(): + """Verify that creating DatabaseSessionService without extra fails using mocks.""" + try: + from google.adk.sessions import DatabaseSessionService + except KeyError as e: + if "pydantic.root_model" in str(e): + pytest.skip( + "Skipping mock test due to Pydantic/MCP environment conflict" + " (KeyError: 'pydantic.root_model')." + ) + raise + + with mock.patch.dict("sys.modules", {"sqlalchemy": None}): + sys.modules.pop("google.adk.sessions.database_session_service", None) + with pytest.raises(ImportError) as exc_info: + from google.adk.sessions import DatabaseSessionService + + DatabaseSessionService(db_url="sqlite+aiosqlite:///:memory:") + assert "sqlalchemy" in str(exc_info.value) + + +def test_vertex_ai_session_service_fails_on_creation(): + """Verify that creating VertexAiSessionService without extra fails using mocks.""" + try: + from google.adk.sessions import VertexAiSessionService + except KeyError as e: + if "pydantic.root_model" in str(e): + pytest.skip( + "Skipping mock test due to Pydantic/MCP environment conflict" + " (KeyError: 'pydantic.root_model')." + ) + raise + + with mock.patch.dict("sys.modules", {"vertexai": None}): + sys.modules.pop("google.adk.sessions.vertex_ai_session_service", None) + from google.adk.sessions import VertexAiSessionService + + with pytest.raises(ImportError) as exc_info: + VertexAiSessionService(agent_engine_id="123") + assert "google-cloud-aiplatform" in str(exc_info.value) + + +# ============================================================================= +# Approach 2: High-Fidelity Integration Tests (Clean Venv, Skipped by Default) +# ============================================================================= + + +@pytest.mark.skipif(not RUN_INTEGRATION, reason="Requires ADK_TEST_NETWORK=1") +def test_critical_imports_subprocess(clean_core_venv): + """Verify that all critical import paths in core work in a true core-only environment.""" + imports = [ + "import google.adk", + "from google.adk import Agent", + "from google.adk import Context", + "from google.adk import Event", + "from google.adk import Runner", + "from google.adk import Workflow", + ] + for imp in imports: + result = subprocess.run( + [str(clean_core_venv), "-c", imp], + capture_output=True, + text=True, + ) + assert ( + result.returncode == 0 + ), f"Failed to import: {imp}\nStderr: {result.stderr}" + + +@pytest.mark.skipif(not RUN_INTEGRATION, reason="Requires ADK_TEST_NETWORK=1") +def test_a2a_remote_agent_config_raises_importerror_subprocess(clean_core_venv): + """Verify that accessing A2aRemoteAgentConfig without extra raises ImportError in clean environment.""" + code = """ +try: + from google.adk.a2a.agent import A2aRemoteAgentConfig + print("SUCCESS") +except ImportError as e: + print(f"CAUGHT_IMPORT_ERROR: {e}") +""" + result = subprocess.run( + [str(clean_core_venv), "-c", code], + capture_output=True, + text=True, + check=True, + ) + output = result.stdout.strip() + assert "CAUGHT_IMPORT_ERROR" in output + assert "a2a-sdk" in output + + +@pytest.mark.skipif(not RUN_INTEGRATION, reason="Requires ADK_TEST_NETWORK=1") +def test_vertex_ai_memory_bank_service_fails_on_creation_subprocess( + clean_core_venv, +): + """Verify that creating VertexAiMemoryBankService without extra fails in clean environment.""" + code = """ +from google.adk.memory import VertexAiMemoryBankService +try: + service = VertexAiMemoryBankService(agent_engine_id="123") + print("SUCCESS") +except ImportError as e: + print(f"CAUGHT_IMPORT_ERROR: {e}") +""" + result = subprocess.run( + [str(clean_core_venv), "-c", code], + capture_output=True, + text=True, + check=True, + ) + output = result.stdout.strip() + assert "CAUGHT_IMPORT_ERROR" in output + assert "google-cloud-aiplatform" in output + + +@pytest.mark.skipif(not RUN_INTEGRATION, reason="Requires ADK_TEST_NETWORK=1") +def test_database_session_service_fails_on_creation_subprocess( + clean_core_venv, +): + """Verify that creating DatabaseSessionService without extra fails in clean environment.""" + code = """ +try: + from google.adk.sessions import DatabaseSessionService + service = DatabaseSessionService(db_url="sqlite+aiosqlite:///:memory:") + print("SUCCESS") +except ImportError as e: + print(f"CAUGHT_IMPORT_ERROR: {e}") +""" + result = subprocess.run( + [str(clean_core_venv), "-c", code], + capture_output=True, + text=True, + check=True, + ) + output = result.stdout.strip() + assert "CAUGHT_IMPORT_ERROR" in output + assert "sqlalchemy" in output + + +@pytest.mark.skipif(not RUN_INTEGRATION, reason="Requires ADK_TEST_NETWORK=1") +def test_vertex_ai_session_service_fails_on_creation_subprocess( + clean_core_venv, +): + """Verify that creating VertexAiSessionService without extra fails in clean environment.""" + code = """ +from google.adk.sessions import VertexAiSessionService +try: + service = VertexAiSessionService(agent_engine_id="123") + print("SUCCESS") +except ImportError as e: + print(f"CAUGHT_IMPORT_ERROR: {e}") +""" + result = subprocess.run( + [str(clean_core_venv), "-c", code], + capture_output=True, + text=True, + check=True, + ) + output = result.stdout.strip() + assert "CAUGHT_IMPORT_ERROR" in output + assert "google-cloud-aiplatform" in output diff --git a/tests/unittests/test_release_dependencies.py b/tests/unittests/test_release_dependencies.py new file mode 100644 index 0000000000..bcb4f0439b --- /dev/null +++ b/tests/unittests/test_release_dependencies.py @@ -0,0 +1,138 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Guard tests for the release-cut dependency contract. + +These tests pin the public dependency surface so that release-blocking +regressions documented in the bare-install audit cannot silently re-emerge: + +* ``packaging`` MUST be declared in main deps (used at import-time by + ``utils/model_name_utils.py`` and ``cli/cli_deploy.py``; reachable from + ``from google.adk import Runner`` and from ``adk --help``). +* ``ValidationError`` in ``environment_simulation_config`` MUST come from + ``pydantic`` (which always installs alongside the package), NOT from the + undeclared ``pydantic_core``. +""" + +from __future__ import annotations + +import importlib.util +from pathlib import Path + +try: + import tomllib +except ImportError: + import tomli as tomllib + +import pytest + + +def _find_pyproject() -> Path: + """Locates pyproject.toml by walking up from this file's directory. + + Works in both layouts: + * Open-source: pyproject.toml lives at the repo root. + * google3: pyproject.toml lives under open_source_workspace/ and tests/ is + a symlink into the package root, so .resolve() lands in the wrong place. + """ + start = Path(__file__).parent + for candidate in [start, *start.parents]: + direct = candidate / 'pyproject.toml' + if direct.is_file(): + return direct + sibling = candidate / 'open_source_workspace' / 'pyproject.toml' + if sibling.is_file(): + return sibling + raise FileNotFoundError( + f'Could not find pyproject.toml walking up from {start}.' + ) + + +_PYPROJECT_PATH = _find_pyproject() + + +@pytest.fixture(scope='module') +def pyproject() -> dict: + """Parses the project's pyproject.toml exactly once for the module.""" + with _PYPROJECT_PATH.open('rb') as fh: + return tomllib.load(fh) + + +def _requirement_names(requirements: list[str]) -> set[str]: + """Returns the lowercased PEP 508 distribution names from ``requirements``. + + Strips extras specifiers, version specifiers, and environment markers so the + caller can do exact-name membership checks. + """ + names: set[str] = set() + for req in requirements: + # Drop everything after a marker, version specifier, or extras block. + head = req.split(';', 1)[0].strip() + for sep in ('[', '>', '<', '=', '!', '~', ' '): + head = head.split(sep, 1)[0] + names.add(head.strip().lower()) + return names + + +def test_main_deps_include_packaging(pyproject: dict) -> None: + """``packaging`` is imported unguarded by core ADK; it must be a main dep.""" + main_deps = _requirement_names(pyproject['project']['dependencies']) + assert 'packaging' in main_deps, ( + 'packaging must be declared in [project] dependencies because ' + 'src/google/adk/utils/model_name_utils.py and ' + 'src/google/adk/cli/cli_deploy.py import it unguarded at module top ' + 'level. Without this declaration, `pip install google-adk` is one ' + 'transitive resolver change away from breaking on `import google.adk`.' + ) + + +def test_environment_simulation_config_imports_validation_error_from_pydantic() -> ( + None +): + """The ValidationError used by the config module must come from pydantic. + + pydantic-core is undeclared; importing from it directly is fragile. pydantic + re-exports ValidationError, so use that. + """ + # Use importlib to locate the source file so the test works in both the + # open-source layout (src/google/adk/...) and inside google3 (flat layout). + spec = importlib.util.find_spec( + 'google.adk.tools.environment_simulation.environment_simulation_config' + ) + assert ( + spec is not None and spec.origin is not None + ), 'environment_simulation_config module is not importable.' + source_path = Path(spec.origin) + source = source_path.read_text(encoding='utf-8') + assert 'from pydantic import ValidationError' in source, ( + 'environment_simulation_config.py must import ValidationError from ' + 'pydantic, not pydantic_core. pydantic_core is undeclared as a main ' + 'dep and pydantic re-exports the same class.' + ) + assert 'from pydantic_core import ValidationError' not in source, ( + 'environment_simulation_config.py must not import ValidationError ' + 'from pydantic_core (undeclared dep).' + ) + + +def test_injection_config_validation_raises_pydantic_validation_error() -> None: + """Behavioral check: invalid config raises the pydantic ValidationError.""" + # Local import keeps this test focused on the post-fix code path and + # surfaces ImportError clearly if the module's import block regresses. + from google.adk.tools.environment_simulation.environment_simulation_config import InjectedError + from pydantic import ValidationError + + with pytest.raises(ValidationError): + # Both required fields missing — pydantic must reject the construction. + InjectedError() # type: ignore[call-arg] diff --git a/tests/unittests/test_runners.py b/tests/unittests/test_runners.py index aa3fc030f3..5636bc294a 100644 --- a/tests/unittests/test_runners.py +++ b/tests/unittests/test_runners.py @@ -418,7 +418,7 @@ async def test_run_live_persists_event_callback_modifications(): @pytest.mark.asyncio async def test_runner_allows_nested_agent_directories(tmp_path, monkeypatch): project_root = tmp_path / "workspace" - agent_dir = project_root / "agents" / "examples" / "001_hello_world" + agent_dir = project_root / "agents" / "examples" / "hello_world" agent_dir.mkdir(parents=True) # Make package structure importable. for pkg_dir in [ @@ -458,13 +458,13 @@ async def _run_async_impl(self, invocation_context): monkeypatch.chdir(project_root) loader = AgentLoader(agents_dir="agents/examples") - loaded_agent = loader.load_agent("001_hello_world") + loaded_agent = loader.load_agent("hello_world") assert isinstance(loaded_agent, BaseAgent) session_service = InMemorySessionService() artifact_service = InMemoryArtifactService() runner = Runner( - app_name="001_hello_world", + app_name="hello_world", agent=loaded_agent, session_service=session_service, artifact_service=artifact_service, @@ -472,7 +472,7 @@ async def _run_async_impl(self, invocation_context): assert runner._app_name_alignment_hint is None session = await session_service.create_session( - app_name="001_hello_world", + app_name="hello_world", user_id="user", ) agen = runner.run_async( @@ -678,6 +678,76 @@ def test_find_agent_to_run_function_response_takes_precedence(self): result = self.runner._find_agent_to_run(session, self.root_agent) assert result == self.sub_agent2 + def test_find_agent_to_run_skips_function_response_when_not_resumable(self): + """Test that function response scenario is skipped when not resumable.""" + function_call = types.FunctionCall(id="func_456", name="test_func", args={}) + function_response = types.FunctionResponse( + id="func_456", name="test_func", response={} + ) + + call_event = Event( + invocation_id="inv1", + author="non_transferable", + content=types.Content( + role="model", parts=[types.Part(function_call=function_call)] + ), + ) + + response_event = Event( + invocation_id="inv2", + author="user", + content=types.Content( + role="user", parts=[types.Part(function_response=function_response)] + ), + ) + + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[call_event, response_event], + ) + + self.runner.resumability_config = ResumabilityConfig(is_resumable=False) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.root_agent + + def test_find_agent_to_run_uses_function_response_when_resumable(self): + """Test that function response scenario is used when resumable.""" + function_call = types.FunctionCall(id="func_456", name="test_func", args={}) + function_response = types.FunctionResponse( + id="func_456", name="test_func", response={} + ) + + call_event = Event( + invocation_id="inv1", + author="non_transferable", + content=types.Content( + role="model", parts=[types.Part(function_call=function_call)] + ), + ) + + response_event = Event( + invocation_id="inv2", + author="user", + content=types.Content( + role="user", parts=[types.Part(function_response=function_response)] + ), + ) + + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[call_event, response_event], + ) + + self.runner.resumability_config = ResumabilityConfig(is_resumable=True) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.non_transferable_agent + def test_is_transferable_across_agent_tree_with_llm_agent(self): """Test _is_transferable_across_agent_tree with LLM agent.""" result = self.runner._is_transferable_across_agent_tree(self.sub_agent1) @@ -866,7 +936,7 @@ def test_runner_init_raises_error_with_app_and_agent(self): """Test that ValueError is raised when app and agent are provided.""" with pytest.raises( ValueError, - match="When app is provided, agent should not be provided.", + match="Only one of app, agent, or node may be provided.", ): Runner( app=App(name="test_app", root_agent=self.root_agent), @@ -895,7 +965,10 @@ def test_runner_init_raises_error_without_app_and_app_name(self): """Test ValueError is raised when app is not provided and app_name is missing.""" with pytest.raises( ValueError, - match="Either app or both app_name and agent must be provided.", + match=( + "app_name is required when agent is provided|One of app, agent, or" + " node must be provided" + ), ): Runner( agent=self.root_agent, @@ -907,7 +980,10 @@ def test_runner_init_raises_error_without_app_and_agent(self): """Test ValueError is raised when app is not provided and agent is missing.""" with pytest.raises( ValueError, - match="Either app or both app_name and agent must be provided.", + match=( + "app_name is required when agent is provided|One of app, agent, or" + " node must be provided" + ), ): Runner( app_name="test_app", @@ -1105,6 +1181,118 @@ def test_runner_realistic_cache_config_scenario(self): assert str(runner.context_cache_config) == expected_str +class TestRunnerResolveApp: + """Tests for Runner._resolve_app and node support.""" + + def setup_method(self): + self.session_service = InMemorySessionService() + self.artifact_service = InMemoryArtifactService() + self.root_agent = MockLlmAgent("root_agent") + + def test_resolve_app_with_agent_wraps_in_app(self): + """Test that a bare agent is wrapped into an App.""" + runner = Runner( + app_name="test_app", + agent=self.root_agent, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + assert runner.app is not None + assert runner.app.root_agent is self.root_agent + assert runner.app_name == "test_app" + assert runner.agent is self.root_agent + + def test_resolve_app_with_node_wraps_in_app(self): + """Test that a bare node is wrapped into an App.""" + from google.adk.workflow._base_node import BaseNode + + node = BaseNode(name="test_node") + runner = Runner( + node=node, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + assert runner.app is not None + assert runner.app.root_agent is node + assert runner.app_name == "test_node" + assert runner.agent is node + + def test_resolve_app_with_node_and_app_name(self): + """Test that app_name overrides node.name.""" + from google.adk.workflow._base_node import BaseNode + + node = BaseNode(name="node_name") + runner = Runner( + app_name="custom_name", + node=node, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + assert runner.app_name == "custom_name" + + def test_resolve_app_rejects_app_and_agent(self): + """Test that providing both app and agent raises.""" + app = App(name="test_app", root_agent=self.root_agent) + with pytest.raises(ValueError, match="Only one of app, agent, or node"): + Runner( + app=app, + agent=self.root_agent, + session_service=self.session_service, + ) + + def test_resolve_app_rejects_app_and_node(self): + """Test that providing both app and node raises.""" + from google.adk.workflow._base_node import BaseNode + + app = App(name="test_app", root_agent=self.root_agent) + node = BaseNode(name="test_node") + with pytest.raises(ValueError, match="Only one of app, agent, or node"): + Runner( + app=app, + node=node, + session_service=self.session_service, + ) + + def test_resolve_app_rejects_agent_and_node(self): + """Test that providing both agent and node raises.""" + from google.adk.workflow._base_node import BaseNode + + node = BaseNode(name="test_node") + with pytest.raises(ValueError, match="Only one of app, agent, or node"): + Runner( + app_name="test_app", + agent=self.root_agent, + node=node, + session_service=self.session_service, + ) + + def test_resolve_app_rejects_none(self): + """Test that providing no app, agent, or node raises.""" + with pytest.raises( + ValueError, match="One of app, agent, or node must be provided" + ): + Runner( + app_name="test_app", + session_service=self.session_service, + ) + + def test_resolve_app_extracts_node_from_app(self): + """Test that Runner extracts node from App into agent field.""" + from google.adk.workflow._base_node import BaseNode + + node = BaseNode(name="test_node") + app = App(name="test_app", root_agent=node) + runner = Runner( + app=app, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + assert runner.agent is node + assert runner.app_name == "test_app" + assert runner.context_cache_config is None + assert runner.resumability_config is None + + class TestRunnerShouldAppendEvent: """Tests for Runner._should_append_event method.""" @@ -1404,6 +1592,70 @@ async def test_run_async_passes_get_session_config(): assert events[0].author == "test_agent" +@pytest.mark.asyncio +async def test_run_async_teardown_on_aclose(): + """Closing run_async generator using aclose() should abort and cancel the running agent task.""" + import asyncio + + session_service = InMemorySessionService() + artifact_service = InMemoryArtifactService() + + was_cancelled = {"value": False} + + class CancellingAgent(BaseAgent): + + def __init__(self, name: str): + super().__init__(name=name, sub_agents=[]) + + async def _run_async_impl( + self, invocation_context: InvocationContext + ) -> AsyncGenerator[Event, None]: + try: + yield Event( + invocation_id=invocation_context.invocation_id, + author=self.name, + content=types.Content( + role="model", parts=[types.Part(text="First response")] + ), + ) + # Block simulating slow ongoing task + await asyncio.sleep(5.0) + yield Event( + invocation_id=invocation_context.invocation_id, + author=self.name, + content=types.Content( + role="model", parts=[types.Part(text="Second response")] + ), + ) + except (asyncio.CancelledError, GeneratorExit): + was_cancelled["value"] = True + raise + + runner = Runner( + app_name=TEST_APP_ID, + agent=CancellingAgent("cancel_agent"), + session_service=session_service, + artifact_service=artifact_service, + auto_create_session=True, + ) + + # Given a run session + agen = runner.run_async( + user_id=TEST_USER_ID, + session_id=TEST_SESSION_ID, + new_message=types.Content(role="user", parts=[types.Part(text="hello")]), + ) + + # When the client reads the first event and then calls aclose() + event = await agen.__anext__() + assert event.content.parts[0].text == "First response" + + await agen.aclose() + + # Then the running agent was immediately aborted and cancelled + assert was_cancelled["value"] is True + + @pytest.mark.asyncio async def test_run_live_passes_get_session_config(): """run_live should forward RunConfig.get_session_config to get_session.""" diff --git a/tests/unittests/test_samples.py b/tests/unittests/test_samples.py new file mode 100644 index 0000000000..efb0df9a64 --- /dev/null +++ b/tests/unittests/test_samples.py @@ -0,0 +1,59 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import json +from pathlib import Path + +from google.adk.apps.app import App +from google.adk.cli.agent_test_runner import test_agent_replay as _test_agent_replay +from google.genai import types +import pytest + +CONTRIBUTING_DIR = Path(__file__).parent.parent.parent / "contributing" + + +def get_test_files(): + """Yields (sample_dir, test_file_path).""" + if not CONTRIBUTING_DIR.exists(): + return + for test_file in CONTRIBUTING_DIR.rglob("tests/*.json"): + sample_dir = test_file.parent.parent + if ( + (sample_dir / "agent.py").exists() + or (sample_dir / "__init__.py").exists() + or (sample_dir / "root_agent.yaml").exists() + ): + try: + rel_dir = sample_dir.relative_to(CONTRIBUTING_DIR) + test_id = f"{rel_dir}/{test_file.name}" + except ValueError: + test_id = f"{sample_dir.name}/{test_file.name}" + + if test_file.stem.endswith("_xfail"): + yield pytest.param( + sample_dir, test_file, id=test_id, marks=pytest.mark.xfail + ) + else: + yield pytest.param(sample_dir, test_file, id=test_id) + + +@pytest.mark.parametrize( + "sample_dir, test_file", + list(get_test_files()), +) +def test_sample(sample_dir: Path, test_file: Path, monkeypatch): + """Tests a sample by replaying exported session events.""" + _test_agent_replay(sample_dir, test_file, monkeypatch) diff --git a/tests/unittests/testing_utils.py b/tests/unittests/testing_utils.py index 4f8d4517fe..c7d6cb6293 100644 --- a/tests/unittests/testing_utils.py +++ b/tests/unittests/testing_utils.py @@ -14,6 +14,7 @@ import asyncio import contextlib +from typing import Any from typing import AsyncGenerator from typing import Generator from typing import Optional @@ -142,6 +143,9 @@ def simplify_resumable_app_events( for event in events: if event.content: results.append((event.author, simplify_content(event.content))) + elif event.output and isinstance(event.output, (str, dict)): + # Single_turn agents strip event.content and set event.output instead. + results.append((event.author, event.output)) elif event.actions.end_of_agent: results.append((event.author, END_OF_AGENT)) elif event.actions.agent_state is not None: @@ -220,6 +224,7 @@ def __init__( response_modalities: list[str] = None, plugins: list[BasePlugin] = [], app: Optional[App] = None, + node: Any = None, ): """Initializes the InMemoryRunner. @@ -229,8 +234,19 @@ def __init__( plugins: The plugins to use in the runner, won't be used if app is provided. app: The app to use in the runner. + node: The root node to run. """ - if not app: + if node: + self.app_name = node.name + self.root_agent = None + self.runner = Runner( + node=node, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + plugins=plugins, + ) + elif not app: self.app_name = 'test_app' self.root_agent = root_agent self.runner = Runner( diff --git a/tests/unittests/tools/computer_use/test_computer_use_tool.py b/tests/unittests/tools/computer_use/test_computer_use_tool.py index 935ad39a6c..eb0b33a9bd 100644 --- a/tests/unittests/tools/computer_use/test_computer_use_tool.py +++ b/tests/unittests/tools/computer_use/test_computer_use_tool.py @@ -420,6 +420,124 @@ async def test_process_llm_request( # Verify llm_request is unchanged (process_llm_request is now a no-op) assert llm_request.tools_dict == {} + @pytest.mark.asyncio + async def test_run_async_with_safety_confirmation( + self, mock_computer_function, tool_context + ): + """Test run_async with safety confirmation.""" + from google.adk.tools.tool_confirmation import ToolConfirmation + + # Set up a proper signature for the mock function + def dummy_func(): + pass + + # Create a specific mock function for this test + calls = [] + mock_state = ComputerState( + screenshot=b"test_screenshot", url="https://example.com" + ) + + async def specific_mock_func(): + calls.append(()) + return mock_state + + specific_mock_func.__name__ = "dummy_func" + specific_mock_func.__signature__ = inspect.signature(dummy_func) + specific_mock_func.calls = calls + + tool = ComputerUseTool(func=specific_mock_func, screen_size=(1920, 1080)) + tool_context.function_call_id = "test_fc_id" + + # Test case 1: require confirmation, not yet confirmed + args = {"safety_decision": {"decision": "require_confirmation"}} + result = await tool.run_async(args=args, tool_context=tool_context) + + # Check that confirmation was requested + assert "test_fc_id" in tool_context.actions.requested_tool_confirmations + assert ( + tool_context.actions.requested_tool_confirmations["test_fc_id"].hint + == "This computer use action requires safety confirmation." + ) + assert result == { + "error": ( + "This tool call requires confirmation, please approve or reject." + ) + } + assert len(calls) == 0 + + # Test case 2: confirmed + tool_context.tool_confirmation = ToolConfirmation(confirmed=True) + result = await tool.run_async(args=args, tool_context=tool_context) + + # Should execute normally + assert len(calls) == 1 + assert result == { + "image": { + "mimetype": "image/png", + "data": base64.b64encode(b"test_screenshot").decode("utf-8"), + }, + "url": "https://example.com", + "safety_acknowledgement": "true", + } + + # Test case 3: rejected + tool_context.tool_confirmation = ToolConfirmation(confirmed=False) + result = await tool.run_async(args=args, tool_context=tool_context) + assert result == {"error": "This tool call is rejected."} + + @pytest.mark.asyncio + async def test_run_async_with_safety_decision_dict( + self, mock_computer_function, tool_context + ): + """Test run_async with safety decision as a dictionary.""" + from google.adk.tools.tool_confirmation import ToolConfirmation + + # Set up a proper signature for the mock function + def dummy_func(): + pass + + calls = [] + mock_state = ComputerState(screenshot=b"test", url="https://example.com") + + async def specific_mock_func(): + calls.append(()) + return mock_state + + specific_mock_func.__name__ = "dummy_func" + specific_mock_func.__signature__ = inspect.signature(dummy_func) + specific_mock_func.calls = calls + + tool = ComputerUseTool(func=specific_mock_func, screen_size=(1920, 1080)) + tool_context.function_call_id = "test_fc_id_dict" + + args = { + "safety_decision": { + "explanation": ( + "I need you to complete the challenge by clicking the 'I'm not" + " a robot' checkbox." + ), + "decision": "require_confirmation", + } + } + result = await tool.run_async(args=args, tool_context=tool_context) + + assert ( + "test_fc_id_dict" in tool_context.actions.requested_tool_confirmations + ) + assert ( + tool_context.actions.requested_tool_confirmations[ + "test_fc_id_dict" + ].hint + == "I need you to complete the challenge by clicking the 'I'm not a" + " robot' checkbox." + ) + assert result == { + "error": ( + "This tool call requires confirmation, please approve or reject." + ) + } + assert len(calls) == 0 + def test_inheritance(self, mock_computer_function): """Test that ComputerUseTool inherits from FunctionTool.""" from google.adk.tools.function_tool import FunctionTool diff --git a/tests/unittests/tools/environment/test_edit_file_tool.py b/tests/unittests/tools/environment/test_edit_file_tool.py new file mode 100644 index 0000000000..42204096eb --- /dev/null +++ b/tests/unittests/tools/environment/test_edit_file_tool.py @@ -0,0 +1,150 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for EditFileTool. + +Verifies that EditFileTool correctly handles line break differences. +""" + +from pathlib import Path + +from google.adk.environment._local_environment import LocalEnvironment +from google.adk.tools.environment._edit_file_tool import EditFileTool +import pytest +import pytest_asyncio + + +@pytest_asyncio.fixture(name="env") +async def _env(tmp_path: Path): + """Create and initialize a LocalEnvironment backed by a temp directory.""" + environment = LocalEnvironment(working_dir=tmp_path) + await environment.initialize() + yield environment + await environment.close() + + +class TestEditFileTool: + """Tests for EditFileTool behavior.""" + + @pytest.mark.asyncio + async def test_edit_file_handles_line_breaks_linux_file_windows_search( + self, env: LocalEnvironment + ): + """File has \\n, search string has \\r\\n.""" + # Arrange + tool = EditFileTool(env) + await env.write_file("test.txt", "line1\nline2\nline3") + + args = { + "path": "test.txt", + "old_string": "line1\r\nline2", + "new_string": "line1_replaced\nline2_replaced", + } + + # Act + result = await tool.run_async(args=args, tool_context=None) + + # Assert + assert result["status"] == "ok" + data = await env.read_file("test.txt") + assert data == b"line1_replaced\nline2_replaced\nline3" + + @pytest.mark.asyncio + async def test_edit_file_handles_line_breaks_windows_file_linux_search( + self, env: LocalEnvironment + ): + """File has \\r\\n, search string has \\n.""" + # Arrange + tool = EditFileTool(env) + await env.write_file("test.txt", "line1\r\nline2\r\nline3") + + args = { + "path": "test.txt", + "old_string": "line1\nline2", + "new_string": "line1_replaced\r\nline2_replaced", + } + + # Act + result = await tool.run_async(args=args, tool_context=None) + + # Assert + assert result["status"] == "ok" + data = await env.read_file("test.txt") + assert data == b"line1_replaced\r\nline2_replaced\r\nline3" + + @pytest.mark.asyncio + async def test_edit_file_fails_on_multiple_matches( + self, env: LocalEnvironment + ): + """Tool fails if old_string appears multiple times.""" + # Arrange + tool = EditFileTool(env) + await env.write_file("test.txt", "line1\nline2\nline1\nline2") + + args = { + "path": "test.txt", + "old_string": "line1\nline2", + "new_string": "replaced", + } + + # Act + result = await tool.run_async(args=args, tool_context=None) + + # Assert + assert result["status"] == "error" + assert "appears 2 times" in result["error"] + + @pytest.mark.asyncio + async def test_edit_file_exact_match_works(self, env: LocalEnvironment): + """Exact match works as before.""" + # Arrange + tool = EditFileTool(env) + await env.write_file("test.txt", "line1\nline2\nline3") + + args = { + "path": "test.txt", + "old_string": "line1\nline2", + "new_string": "replaced", + } + + # Act + result = await tool.run_async(args=args, tool_context=None) + + # Assert + assert result["status"] == "ok" + data = await env.read_file("test.txt") + assert data == b"replaced\nline3" + + @pytest.mark.asyncio + async def test_edit_file_handles_special_regex_chars( + self, env: LocalEnvironment + ): + """Special regex characters in old_string are escaped.""" + # Arrange + tool = EditFileTool(env) + await env.write_file("test.txt", "line1.content\nline2") + + args = { + "path": "test.txt", + "old_string": "line1.content", + "new_string": "replaced", + } + + # Act + result = await tool.run_async(args=args, tool_context=None) + + # Assert + assert result["status"] == "ok" + data = await env.read_file("test.txt") + assert data == b"replaced\nline2" diff --git a/tests/unittests/tools/mcp_tool/test_mcp_session_manager.py b/tests/unittests/tools/mcp_tool/test_mcp_session_manager.py index a94b2eb885..f7e16014ff 100644 --- a/tests/unittests/tools/mcp_tool/test_mcp_session_manager.py +++ b/tests/unittests/tools/mcp_tool/test_mcp_session_manager.py @@ -588,6 +588,9 @@ async def test_create_session_cleans_up_without_aclose_if_loop_is_different( self, ): """Verify that sessions from different loops are cleaned up without calling aclose().""" + from google.adk.features import FeatureName + from google.adk.features._feature_registry import temporary_feature_override + manager = MCPSessionManager(self.mock_stdio_connection_params) # 1. Simulate a session created in a "different" loop @@ -617,8 +620,11 @@ async def test_create_session_cleans_up_without_aclose_if_loop_is_different( mock_wait_for.return_value = new_session mock_session_context_class.return_value = AsyncMock() - # 3. Call create_session - session = await manager.create_session() + # 3. Call create_session with flag off to hit wait_for branch + with temporary_feature_override( + FeatureName._MCP_GRACEFUL_ERROR_HANDLING, False + ): + session = await manager.create_session() # 4. Verify results assert session == new_session @@ -969,8 +975,8 @@ class TestMCPGracefulErrorHandlingFlagContract: loudly so we don't silently break GE's rollout. """ - def test_default_state_is_off_so_cl_is_a_noop(self): - """The CL must be a no-op until GE explicitly enables it.""" + def test_default_state_is_on(self): + """The fix must be enabled by default.""" import os from google.adk.features import FeatureName @@ -981,34 +987,34 @@ def test_default_state_is_off_so_cl_is_a_noop(self): saved = {k: os.environ.pop(k) for k in (enable, disable) if k in os.environ} try: assert ( - is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING) is False + is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING) is True ) finally: os.environ.update(saved) - def test_env_var_enable_flips_flag_on_at_runtime(self): - """The env var GE will set must turn the fix on without a rebuild.""" + def test_env_var_disable_flips_flag_off_at_runtime(self): + """The env var must turn the fix off without a rebuild.""" import os from google.adk.features import FeatureName from google.adk.features import is_feature_enabled - enable = "ADK_ENABLE_MCP_GRACEFUL_ERROR_HANDLING" - saved = os.environ.pop(enable, None) + disable = "ADK_DISABLE_MCP_GRACEFUL_ERROR_HANDLING" + saved = os.environ.pop(disable, None) try: - os.environ[enable] = "1" + os.environ[disable] = "1" assert ( - is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING) is True + is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING) is False ) # And once it's removed, we revert. Confirms the value is read # live from os.environ on every call (no caching, no binary push). - del os.environ[enable] + del os.environ[disable] assert ( - is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING) is False + is_feature_enabled(FeatureName._MCP_GRACEFUL_ERROR_HANDLING) is True ) finally: if saved is not None: - os.environ[enable] = saved + os.environ[disable] = saved def test_env_var_disable_acts_as_kill_switch(self): """The disable env var lets consumers turn off without a rebuild.""" diff --git a/tests/unittests/tools/mcp_tool/test_mcp_toolset.py b/tests/unittests/tools/mcp_tool/test_mcp_toolset.py index 7edd1b2957..20ec612e8c 100644 --- a/tests/unittests/tools/mcp_tool/test_mcp_toolset.py +++ b/tests/unittests/tools/mcp_tool/test_mcp_toolset.py @@ -324,17 +324,9 @@ async def test_close_with_exception(self): side_effect=Exception("Cleanup error") ) - custom_errlog = StringIO() - toolset._errlog = custom_errlog - - # Should not raise exception + # Should not raise exception, should log the warning await toolset.close() - # Should log the error - error_output = custom_errlog.getvalue() - assert "Warning: Error during McpToolset cleanup" in error_output - assert "Cleanup error" in error_output - @pytest.mark.asyncio async def test_get_tools_with_timeout(self): """Test get_tools with timeout.""" diff --git a/tests/unittests/tools/mcp_tool/test_session_context.py b/tests/unittests/tools/mcp_tool/test_session_context.py index 50025dc245..4200ab5fd5 100644 --- a/tests/unittests/tools/mcp_tool/test_session_context.py +++ b/tests/unittests/tools/mcp_tool/test_session_context.py @@ -296,6 +296,108 @@ async def slow_initialize(): assert 'Failed to create MCP session' in str(exc_info.value) + @pytest.mark.asyncio + async def test_timeout_during_initialization_with_flag_on(self): + """Test timeout during session initialization with flag ON. + + Verifies that session initialization uses `anyio.fail_after` under the + graceful error handling feature flag. + """ + mock_client = MockClient() + session_context = SessionContext( + mock_client, timeout=0.1, sse_read_timeout=None + ) + + # Mock ClientSession with slow initialize + mock_session = MockClientSession() + + async def slow_initialize(): + await asyncio.sleep(1.0) + return mock_session + + mock_session.initialize = slow_initialize + + with patch( + 'google.adk.tools.mcp_tool.session_context.ClientSession' + ) as mock_session_class: + mock_session_class.return_value = mock_session + + with temporary_feature_override( + FeatureName._MCP_GRACEFUL_ERROR_HANDLING, True + ): + with pytest.raises(ConnectionError) as exc_info: + await session_context.start() + + assert 'Failed to create MCP session' in str(exc_info.value) + + @pytest.mark.asyncio + async def test_timeout_during_initialization_with_flag_off(self): + """Test timeout during session initialization with flag OFF. + + Verifies that session initialization falls back to `asyncio.wait_for` + when graceful error handling is disabled. + """ + mock_client = MockClient() + session_context = SessionContext( + mock_client, timeout=0.1, sse_read_timeout=None + ) + + # Mock ClientSession with slow initialize + mock_session = MockClientSession() + + async def slow_initialize(): + await asyncio.sleep(1.0) + return mock_session + + mock_session.initialize = slow_initialize + + with patch( + 'google.adk.tools.mcp_tool.session_context.ClientSession' + ) as mock_session_class: + mock_session_class.return_value = mock_session + + with temporary_feature_override( + FeatureName._MCP_GRACEFUL_ERROR_HANDLING, False + ): + with pytest.raises(ConnectionError) as exc_info: + await session_context.start() + + assert 'Failed to create MCP session' in str(exc_info.value) + + @pytest.mark.asyncio + async def test_uses_anyio_fail_after_when_flag_on(self): + """Test that session initialization structurally uses anyio.fail_after. + + Asserts that the session runner enters `anyio.fail_after` context + with the timeout limit when graceful error handling is enabled. + """ + mock_client = MockClient() + session_context = SessionContext( + mock_client, timeout=2.5, sse_read_timeout=None + ) + mock_session = MockClientSession() + + with ( + patch( + 'google.adk.tools.mcp_tool.session_context.ClientSession' + ) as mock_session_class, + patch('anyio.fail_after') as mock_fail_after, + ): + mock_session_class.return_value = mock_session + # Configure mock_fail_after synchronous context manager to do nothing + mock_fail_after.return_value.__enter__ = Mock() + mock_fail_after.return_value.__exit__ = Mock(return_value=False) + + with temporary_feature_override( + FeatureName._MCP_GRACEFUL_ERROR_HANDLING, True + ): + await session_context.start() + + # Verify anyio.fail_after was called with the correct timeout + mock_fail_after.assert_called_once_with(2.5) + + await session_context.close() + @pytest.mark.asyncio async def test_stdio_client_with_read_timeout(self): """Test stdio client includes read_timeout_seconds parameter.""" diff --git a/tests/unittests/tools/test_agent_tool.py b/tests/unittests/tools/test_agent_tool.py index d3768ea210..4c664ae822 100644 --- a/tests/unittests/tools/test_agent_tool.py +++ b/tests/unittests/tools/test_agent_tool.py @@ -653,7 +653,7 @@ async def before_agent_callback(self, **kwargs): runner = testing_utils.InMemoryRunner(root_agent, plugins=[tracking_plugin]) runner.run('test1') - # Plugin should be called for both root_agent and tool_agent + # Plugin should be called for both root_agent and tool_agent. assert tracking_plugin.before_agent_calls == 2 @@ -689,7 +689,7 @@ async def before_agent_callback(self, **kwargs): runner = testing_utils.InMemoryRunner(root_agent, plugins=[tracking_plugin]) runner.run('test1') - # Plugin should be called for both root_agent and tool_agent + # Plugin should be called for both root_agent and tool_agent. assert tracking_plugin.before_agent_calls == 2 @@ -725,7 +725,7 @@ async def before_agent_callback(self, **kwargs): runner = testing_utils.InMemoryRunner(root_agent, plugins=[tracking_plugin]) runner.run('test1') - # Plugin should only be called for root_agent, not tool_agent + # Plugin should only be called for root_agent, not tool_agent. assert tracking_plugin.before_agent_calls == 1 diff --git a/tests/unittests/tools/test_base_google_credentials_manager.py b/tests/unittests/tools/test_base_google_credentials_manager.py index 0d680ec484..2cb6a460cb 100644 --- a/tests/unittests/tools/test_base_google_credentials_manager.py +++ b/tests/unittests/tools/test_base_google_credentials_manager.py @@ -19,11 +19,11 @@ from unittest.mock import patch from google.adk.auth.auth_tool import AuthConfig +from google.adk.integrations.bigquery.bigquery_credentials import BIGQUERY_TOKEN_CACHE_KEY +from google.adk.integrations.bigquery.bigquery_credentials import BigQueryCredentialsConfig from google.adk.tools import _google_credentials from google.adk.tools._google_credentials import BaseGoogleCredentialsConfig from google.adk.tools._google_credentials import GoogleCredentialsManager -from google.adk.tools.bigquery.bigquery_credentials import BIGQUERY_TOKEN_CACHE_KEY -from google.adk.tools.bigquery.bigquery_credentials import BigQueryCredentialsConfig from google.adk.tools.tool_context import ToolContext from google.auth.credentials import Credentials as AuthCredentials from google.auth.exceptions import RefreshError diff --git a/tests/unittests/tools/test_base_tool.py b/tests/unittests/tools/test_base_tool.py index b36928ee1e..34e9269296 100644 --- a/tests/unittests/tools/test_base_tool.py +++ b/tests/unittests/tools/test_base_tool.py @@ -139,3 +139,19 @@ async def test_process_llm_request_with_builtin_tool_and_another_declaration(): # function_declaration is added to existing types.Tool with function_declaration. assert llm_request.config.tools[1].function_declarations[1] == declaration + + +def test_defers_response_flag(): + """Tests that _defers_response defaults to False and can be set by subclasses.""" + + class SimpleTool(BaseTool): + + async def run_async(self, **kwargs): + pass + + t = SimpleTool(name='test', description='desc') + assert t._defers_response is False + + t2 = SimpleTool(name='test2', description='desc') + t2._defers_response = True + assert t2._defers_response is True diff --git a/tests/unittests/tools/test_function_tool.py b/tests/unittests/tools/test_function_tool.py index 9c76529fb5..2acb254833 100644 --- a/tests/unittests/tools/test_function_tool.py +++ b/tests/unittests/tools/test_function_tool.py @@ -27,6 +27,7 @@ def mock_tool_context() -> ToolContext: """Fixture that provides a mock ToolContext for testing.""" mock_invocation_context = MagicMock(spec=InvocationContext) + mock_invocation_context._state_schema = None mock_invocation_context.session = MagicMock(spec=Session) mock_invocation_context.session.state = MagicMock() return ToolContext(invocation_context=mock_invocation_context) @@ -331,6 +332,7 @@ def sample_func(expected_arg: str): tool = FunctionTool(sample_func) mock_invocation_context = MagicMock(spec=InvocationContext) + mock_invocation_context._state_schema = None mock_invocation_context.session = MagicMock(spec=Session) # Add the missing state attribute to the session mock mock_invocation_context.session.state = MagicMock() @@ -352,6 +354,7 @@ def sample_func_with_context(expected_arg: str, tool_context: ToolContext): tool = FunctionTool(sample_func_with_context) mock_invocation_context = MagicMock(spec=InvocationContext) + mock_invocation_context._state_schema = None mock_invocation_context.session = MagicMock(spec=Session) # Add the missing state attribute to the session mock mock_invocation_context.session.state = MagicMock() @@ -379,6 +382,7 @@ def sample_func(arg1: str): tool = FunctionTool(sample_func, require_confirmation=True) mock_invocation_context = MagicMock(spec=InvocationContext) + mock_invocation_context._state_schema = None mock_invocation_context.session = MagicMock(spec=Session) mock_invocation_context.session.state = MagicMock() mock_invocation_context.agent = MagicMock() diff --git a/tests/unittests/tools/test_function_tool_pydantic.py b/tests/unittests/tools/test_function_tool_pydantic.py index 82f5631a35..02328e0452 100644 --- a/tests/unittests/tools/test_function_tool_pydantic.py +++ b/tests/unittests/tools/test_function_tool_pydantic.py @@ -15,6 +15,7 @@ # Pydantic model conversion tests from typing import Optional +from typing import Union from unittest.mock import MagicMock from google.adk.agents.invocation_context import InvocationContext @@ -40,6 +41,14 @@ class PreferencesModel(pydantic.BaseModel): notifications: bool = True +class CompanyModel(pydantic.BaseModel): + """Test Pydantic model for company data.""" + + company_name: str + industry: str + employee_count: int + + def sync_function_with_pydantic_model(user: UserModel) -> dict: """Sync function that takes a Pydantic model.""" return { @@ -280,5 +289,235 @@ async def test_run_async_with_optional_pydantic_models(): assert result["theme"] == "dark" assert result["notifications"] is True assert result["preferences_type"] == "PreferencesModel" - assert result["preferences_type"] == "PreferencesModel" - assert result["preferences_type"] == "PreferencesModel" + + +def test_preprocess_args_with_list_of_pydantic_models(): + """Test _preprocess_args converts list of dicts to list of Pydantic models.""" + + def function_with_list(users: list[UserModel]) -> int: + return sum(u.age for u in users) + + tool = FunctionTool(function_with_list) + + input_args = { + "users": [ + {"name": "Alice", "age": 30}, + {"name": "Bob", "age": 25}, + ] + } + + processed_args = tool._preprocess_args(input_args) + + assert isinstance(processed_args["users"], list) + assert len(processed_args["users"]) == 2 + assert all(isinstance(u, UserModel) for u in processed_args["users"]) + assert processed_args["users"][0].name == "Alice" + assert processed_args["users"][1].age == 25 + + +def test_preprocess_args_with_list_of_pydantic_models_already_converted(): + """Test _preprocess_args leaves existing Pydantic model instances in list.""" + + def function_with_list(users: list[UserModel]) -> int: + return sum(u.age for u in users) + + tool = FunctionTool(function_with_list) + + existing = [UserModel(name="Alice", age=30)] + input_args = {"users": existing} + + processed_args = tool._preprocess_args(input_args) + + assert processed_args["users"][0] is existing[0] + + +def test_preprocess_args_with_list_of_primitives_unchanged(): + """Test _preprocess_args leaves list of primitives unchanged.""" + + def function_with_list(names: list[str], counts: list[int]) -> int: + return len(names) + sum(counts) + + tool = FunctionTool(function_with_list) + + input_args = {"names": ["Alice", "Bob"], "counts": [1, 2, 3]} + processed_args = tool._preprocess_args(input_args) + + assert processed_args["names"] == ["Alice", "Bob"] + assert processed_args["counts"] == [1, 2, 3] + + +def test_preprocess_args_with_list_of_pydantic_models_empty(): + """Test _preprocess_args handles empty list for list[BaseModel].""" + + def function_with_list(users: list[UserModel]) -> int: + return 0 + + tool = FunctionTool(function_with_list) + + processed_args = tool._preprocess_args({"users": []}) + + assert processed_args["users"] == [] + + +@pytest.mark.asyncio +async def test_run_async_with_list_of_pydantic_models(): + """Test run_async end-to-end with list[BaseModel] conversion.""" + + def place_order(orders: list[UserModel]) -> int: + return sum(u.age for u in orders) + + tool = FunctionTool(place_order) + + tool_context_mock = MagicMock(spec=ToolContext) + invocation_context_mock = MagicMock(spec=InvocationContext) + session_mock = MagicMock(spec=Session) + invocation_context_mock.session = session_mock + tool_context_mock.invocation_context = invocation_context_mock + + args = {"orders": [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 20}]} + + result = await tool.run_async(args=args, tool_context=tool_context_mock) + + assert result == 50 + + +def _function_with_union_of_basemodels( + entity: Union[UserModel, CompanyModel], +) -> str: + return type(entity).__name__ + + +def test_preprocess_args_with_union_of_basemodels_picks_user(): + """Dict matching UserModel is converted to UserModel.""" + tool = FunctionTool(_function_with_union_of_basemodels) + + processed_args = tool._preprocess_args( + {"entity": {"name": "Diana", "age": 32, "email": "d@example.com"}} + ) + + assert isinstance(processed_args["entity"], UserModel) + assert processed_args["entity"].name == "Diana" + + +def test_preprocess_args_with_union_of_basemodels_picks_company(): + """Dict matching CompanyModel is converted to CompanyModel.""" + tool = FunctionTool(_function_with_union_of_basemodels) + + processed_args = tool._preprocess_args({ + "entity": { + "company_name": "Acme Corp", + "industry": "tech", + "employee_count": 50, + } + }) + + assert isinstance(processed_args["entity"], CompanyModel) + assert processed_args["entity"].company_name == "Acme Corp" + + +def test_preprocess_args_with_union_of_basemodels_existing_instance_unchanged(): + """Existing instance of any union member is left unchanged.""" + tool = FunctionTool(_function_with_union_of_basemodels) + + user = UserModel(name="Bob", age=25) + assert tool._preprocess_args({"entity": user})["entity"] is user + + company = CompanyModel( + company_name="Acme", industry="tech", employee_count=10 + ) + assert tool._preprocess_args({"entity": company})["entity"] is company + + +def test_preprocess_args_with_union_of_basemodels_unrelated_instance_passthrough(): + """A BaseModel instance not in the union is not silently accepted.""" + tool = FunctionTool(_function_with_union_of_basemodels) + + class UnrelatedModel(pydantic.BaseModel): + name: str + age: int + + unrelated = UnrelatedModel(name="Carol", age=20) + processed_args = tool._preprocess_args({"entity": unrelated}) + + # Conversion fails (UnrelatedModel is not in the union); value is left + # alone so the function receives it and raises a clear error itself. + assert processed_args["entity"] is unrelated + + +def test_preprocess_args_with_optional_union_of_basemodels_none(): + """Optional[Union[A, B]] passes None through unchanged.""" + + def fn(entity: Optional[Union[UserModel, CompanyModel]] = None) -> str: + return type(entity).__name__ + + tool = FunctionTool(fn) + + processed_args = tool._preprocess_args({"entity": None}) + + assert processed_args["entity"] is None + + +def test_preprocess_args_with_optional_union_of_basemodels_dict(): + """Optional[Union[A, B]] converts a dict to the matching model.""" + + def fn(entity: Optional[Union[UserModel, CompanyModel]] = None) -> str: + return type(entity).__name__ + + tool = FunctionTool(fn) + + processed_args = tool._preprocess_args({"entity": {"name": "Eve", "age": 40}}) + + assert isinstance(processed_args["entity"], UserModel) + assert processed_args["entity"].name == "Eve" + + +def test_preprocess_args_with_union_of_basemodels_invalid_data(): + """Invalid data for Union[BaseModel, BaseModel] is kept unchanged.""" + tool = FunctionTool(_function_with_union_of_basemodels) + + # Dict matches neither model. + processed_args = tool._preprocess_args( + {"entity": {"unrelated_field": "value"}} + ) + + assert processed_args["entity"] == {"unrelated_field": "value"} + + +@pytest.mark.asyncio +async def test_run_async_with_union_of_basemodels(): + """run_async end-to-end converts dict to the matching union member.""" + + def create_entity_profile( + entity: Union[UserModel, CompanyModel], + ) -> dict: + if isinstance(entity, UserModel): + return {"entity_type": "user", "name": entity.name} + if isinstance(entity, CompanyModel): + return {"entity_type": "company", "name": entity.company_name} + return {"entity_type": "unknown"} + + tool = FunctionTool(create_entity_profile) + + tool_context_mock = MagicMock(spec=ToolContext) + invocation_context_mock = MagicMock(spec=InvocationContext) + session_mock = MagicMock(spec=Session) + invocation_context_mock.session = session_mock + tool_context_mock.invocation_context = invocation_context_mock + + user_result = await tool.run_async( + args={"entity": {"name": "Diana", "age": 32}}, + tool_context=tool_context_mock, + ) + assert user_result == {"entity_type": "user", "name": "Diana"} + + company_result = await tool.run_async( + args={ + "entity": { + "company_name": "Acme Corp", + "industry": "tech", + "employee_count": 50, + } + }, + tool_context=tool_context_mock, + ) + assert company_result == {"entity_type": "company", "name": "Acme Corp"} diff --git a/tests/unittests/tools/test_function_tool_with_import_annotations.py b/tests/unittests/tools/test_function_tool_with_import_annotations.py index 65e1468bab..ebd21bce95 100644 --- a/tests/unittests/tools/test_function_tool_with_import_annotations.py +++ b/tests/unittests/tools/test_function_tool_with_import_annotations.py @@ -18,8 +18,10 @@ from typing import Dict from google.adk.tools import _automatic_function_calling_util +from google.adk.tools.function_tool import FunctionTool from google.adk.utils.variant_utils import GoogleLLMVariant from google.genai import types +import pydantic def test_string_annotation_none_return_vertex(): @@ -177,3 +179,33 @@ def test_function() -> str: # VERTEX_AI should have response schema for string return (stored as string) assert declaration.response is not None assert declaration.response.type == types.Type.STRING + + +class ItemModel(pydantic.BaseModel): + name: str + quantity: int + + +def test_preprocess_args_with_list_of_pydantic_models_and_annotations(): + """Test _preprocess_args converts dict to Pydantic model with string annotations.""" + + def function_with_list(items: list[ItemModel]) -> int: + return sum(item.quantity for item in items) + + tool = FunctionTool(function_with_list) + + input_args = { + 'items': [ + {'name': 'Burger', 'quantity': 10}, + {'name': 'Pizza', 'quantity': 5}, + ] + } + + processed_args = tool._preprocess_args(input_args) + + assert isinstance(processed_args['items'], list) + assert len(processed_args['items']) == 2 + assert all(isinstance(item, ItemModel) for item in processed_args['items']) + assert processed_args['items'][0].name == 'Burger' + assert processed_args['items'][0].quantity == 10 + assert processed_args['items'][1].quantity == 5 diff --git a/tests/unittests/tools/test_google_tool.py b/tests/unittests/tools/test_google_tool.py index 738edbae5b..a7717d5578 100644 --- a/tests/unittests/tools/test_google_tool.py +++ b/tests/unittests/tools/test_google_tool.py @@ -16,9 +16,9 @@ from unittest.mock import Mock from unittest.mock import patch +from google.adk.integrations.bigquery.bigquery_credentials import BigQueryCredentialsConfig +from google.adk.integrations.bigquery.config import BigQueryToolConfig from google.adk.tools._google_credentials import GoogleCredentialsManager -from google.adk.tools.bigquery.bigquery_credentials import BigQueryCredentialsConfig -from google.adk.tools.bigquery.config import BigQueryToolConfig from google.adk.tools.google_tool import GoogleTool from google.adk.tools.spanner.settings import SpannerToolSettings from google.adk.tools.tool_context import ToolContext diff --git a/tests/unittests/tools/test_load_web_page.py b/tests/unittests/tools/test_load_web_page.py index 5dbc70805b..d0463bd36e 100644 --- a/tests/unittests/tools/test_load_web_page.py +++ b/tests/unittests/tools/test_load_web_page.py @@ -14,6 +14,7 @@ from __future__ import annotations +import os import socket from unittest import mock @@ -31,17 +32,9 @@ def _create_response(html: str) -> requests.Response: def _clear_proxy_env(monkeypatch): - for proxy_variable in ( - 'HTTP_PROXY', - 'HTTPS_PROXY', - 'http_proxy', - 'https_proxy', - 'ALL_PROXY', - 'all_proxy', - 'NO_PROXY', - 'no_proxy', - ): - monkeypatch.delenv(proxy_variable, raising=False) + for env_var in list(os.environ): + if env_var.lower().endswith('_proxy'): + monkeypatch.delenv(env_var, raising=False) def test_load_web_page_blocks_file_scheme_urls(monkeypatch): diff --git a/tests/unittests/tools/test_request_input_tool.py b/tests/unittests/tools/test_request_input_tool.py new file mode 100644 index 0000000000..3895dbd77d --- /dev/null +++ b/tests/unittests/tools/test_request_input_tool.py @@ -0,0 +1,116 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from unittest.mock import MagicMock + +from google.adk.tools._request_input_tool import request_input +from google.adk.tools.long_running_tool import LongRunningFunctionTool +from google.adk.tools.tool_context import ToolContext +import pytest + + +class TestRequestInputTool: + """Test cases for RequestInputTool integration and properties.""" + + def test_init(self): + """request_input initializes with correct name and properties.""" + # Given & When & Then + assert request_input.name == 'adk_request_input' + assert request_input.is_long_running is True + assert isinstance(request_input, LongRunningFunctionTool) + assert ( + 'Ask the user a question and wait for their response' + in request_input.description + ) + + def test_get_declaration(self): + """request_input returns a function declaration with correct parameters.""" + # Given & When + declaration = request_input._get_declaration() + + # Then + assert declaration is not None + assert declaration.name == 'adk_request_input' + assert 'Ask the user a question' in declaration.description + + # Verify the parameter schema matches the declaration + parameters = declaration.parameters + parameters_schema = declaration.parameters_json_schema + assert (parameters is not None) or (parameters_schema is not None) + + if parameters_schema is not None: + # Verify camelCase / snake_case properties in JSON schema format + assert 'message' in parameters_schema['properties'] + assert ( + 'response_schema' in parameters_schema['properties'] + or 'responseSchema' in parameters_schema['properties'] + ) + assert 'message' in parameters_schema['required'] + + # Check parameter type specifications + assert parameters_schema['properties']['message']['type'] == 'string' + else: + # Verify types.Schema format + assert 'message' in parameters.properties + assert 'response_schema' in parameters.properties + assert 'message' in parameters.required + + # Check parameter type specifications + from google.genai import types + + assert parameters.properties['message'].type == types.Type.STRING + + @pytest.mark.asyncio + async def test_run_async_returns_none(self): + """request_input execution returns None to trigger LRO suspension.""" + # Given + args = {'message': 'What is your name?'} + tool_context = MagicMock(spec=ToolContext) + + # When + result = await request_input.run_async(args=args, tool_context=tool_context) + + # Then + assert result is None + + @pytest.mark.asyncio + async def test_run_async_with_schema_argument_returns_none(self): + """request_input handles both simple text and structured schema arguments correctly.""" + # Given + args = { + 'message': 'Enter your username:', + 'response_schema': {'type': 'string'}, + } + tool_context = MagicMock(spec=ToolContext) + + # When + result = await request_input.run_async(args=args, tool_context=tool_context) + + # Then + assert result is None + + @pytest.mark.asyncio + async def test_run_async_missing_mandatory_message_returns_error(self): + """request_input returns an error dict if the mandatory 'message' argument is missing.""" + # Given + args = {'response_schema': {'type': 'string'}} + tool_context = MagicMock(spec=ToolContext) + + # When + result = await request_input.run_async(args=args, tool_context=tool_context) + + # Then + assert isinstance(result, dict) + assert 'error' in result + assert 'mandatory input parameters are not present' in result['error'] diff --git a/tests/unittests/tools/test_set_model_response_tool.py b/tests/unittests/tools/test_set_model_response_tool.py index 0f634b4911..c437449573 100644 --- a/tests/unittests/tools/test_set_model_response_tool.py +++ b/tests/unittests/tools/test_set_model_response_tool.py @@ -20,6 +20,8 @@ from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import LlmAgent from google.adk.agents.run_config import RunConfig +from google.adk.features._feature_registry import FeatureName +from google.adk.features._feature_registry import temporary_feature_override from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.tools.set_model_response_tool import SetModelResponseTool from google.adk.tools.tool_context import ToolContext @@ -490,9 +492,10 @@ class ConsolidatedOptionalSchema(BaseModel): def test_get_declaration_optional_fields(): """Test that tool declaration preserves properties for various optional fields.""" - tool = SetModelResponseTool(ConsolidatedOptionalSchema) + with temporary_feature_override(FeatureName.JSON_SCHEMA_FOR_FUNC_DECL, False): + tool = SetModelResponseTool(ConsolidatedOptionalSchema) - declaration = tool._get_declaration() + declaration = tool._get_declaration() assert declaration is not None assert declaration.name == 'set_model_response' diff --git a/tests/unittests/tools/test_skill_toolset.py b/tests/unittests/tools/test_skill_toolset.py index aca34c2523..218050e7e0 100644 --- a/tests/unittests/tools/test_skill_toolset.py +++ b/tests/unittests/tools/test_skill_toolset.py @@ -11,6 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations import asyncio import collections @@ -332,16 +333,10 @@ async def test_load_skill_run_async_state_none( "error_code": "SKILL_NOT_FOUND", }, ), - ( - {"skill_name": "skill1", "file_path": "references/other.md"}, - { - "error": ( - "Resource 'references/other.md' not found in skill" - " 'skill1'." - ), - "error_code": "RESOURCE_NOT_FOUND", - }, - ), + # RESOURCE_NOT_FOUND is tested separately in + # test_load_resource_first_missing_returns_soft_error because the + # counter guard requires a real state dict (mock state.get() returns a + # truthy MagicMock that int() coerces to 1, skipping the soft path). ( {"skill_name": "skill1", "file_path": "invalid/path.txt"}, { @@ -479,20 +474,141 @@ def test_duplicate_skill_name_raises(mock_skill1): @pytest.mark.asyncio -async def test_scripts_resource_not_found(mock_skill1, tool_context_instance): +async def test_scripts_resource_not_found(mock_skill1): toolset = skill_toolset.SkillToolset([mock_skill1]) tool = skill_toolset.LoadSkillResourceTool(toolset) + ctx = _make_tool_context_with_agent() result = await tool.run_async( args={"skill_name": "skill1", "file_path": "scripts/nonexistent.sh"}, - tool_context=tool_context_instance, + tool_context=ctx, + ) + assert result["error_code"] == "RESOURCE_NOT_FOUND" + + +@pytest.mark.asyncio +async def test_load_resource_first_missing_returns_soft_error(mock_skill1): + """First RESOURCE_NOT_FOUND in an invocation returns the soft error code.""" + toolset = skill_toolset.SkillToolset([mock_skill1]) + tool = skill_toolset.LoadSkillResourceTool(toolset) + ctx = _make_tool_context_with_agent() + result = await tool.run_async( + args={"skill_name": "skill1", "file_path": "references/other.md"}, + tool_context=ctx, ) assert result["error_code"] == "RESOURCE_NOT_FOUND" + assert result["error"] == ( + "Resource 'references/other.md' not found in skill 'skill1'." + ) + + +@pytest.mark.asyncio +async def test_load_resource_repeated_failure_escalates_to_fatal(mock_skill1): + """Any second RESOURCE_NOT_FOUND within an invocation returns RESOURCE_NOT_FOUND_FATAL.""" + toolset = skill_toolset.SkillToolset([mock_skill1]) + tool = skill_toolset.LoadSkillResourceTool(toolset) + ctx = _make_tool_context_with_agent() + + args = {"skill_name": "skill1", "file_path": "references/nonexistent.md"} + + result1 = await tool.run_async(args=args, tool_context=ctx) + assert result1["error_code"] == "RESOURCE_NOT_FOUND" + + result2 = await tool.run_async(args=args, tool_context=ctx) + assert result2["error_code"] == "RESOURCE_NOT_FOUND_FATAL" + assert "Do not retry" in result2["error"] + assert "stop" in result2["error"].lower() + assert "failure #2" in result2["error"] + + +@pytest.mark.asyncio +async def test_load_resource_different_path_also_escalates_to_fatal( + mock_skill1, +): + """A different missing path on the second call still escalates to RESOURCE_NOT_FOUND_FATAL. + + The counter is path-agnostic: any second not-found within the same invocation + is fatal, even when the LLM hallucinates a different path on each retry. + """ + toolset = skill_toolset.SkillToolset([mock_skill1]) + tool = skill_toolset.LoadSkillResourceTool(toolset) + ctx = _make_tool_context_with_agent() + + result1 = await tool.run_async( + args={"skill_name": "skill1", "file_path": "references/missing_a.md"}, + tool_context=ctx, + ) + assert result1["error_code"] == "RESOURCE_NOT_FOUND" + + result2 = await tool.run_async( + args={"skill_name": "skill1", "file_path": "references/missing_b.md"}, + tool_context=ctx, + ) + assert result2["error_code"] == "RESOURCE_NOT_FOUND_FATAL" + assert "Do not retry" in result2["error"] + + +@pytest.mark.asyncio +async def test_load_resource_failures_isolated_per_invocation(mock_skill1): + """Failure counter does not leak across invocations. + + A RESOURCE_NOT_FOUND in invocation A must not increment invocation B's + counter; invocation B's first missing-resource call must still return the + soft error, even when both invocations share the same session state dict. + """ + toolset = skill_toolset.SkillToolset([mock_skill1]) + tool = skill_toolset.LoadSkillResourceTool(toolset) + + shared_state = {} + ctx_a = _make_tool_context_with_agent(invocation_id="inv_a") + ctx_a.state = shared_state + ctx_b = _make_tool_context_with_agent(invocation_id="inv_b") + ctx_b.state = shared_state + + # invocation A: one failure — counter for inv_a reaches 1 (soft). + result_a = await tool.run_async( + args={"skill_name": "skill1", "file_path": "references/typo.md"}, + tool_context=ctx_a, + ) + assert result_a["error_code"] == "RESOURCE_NOT_FOUND" + + # invocation B, first attempt (different path) — counter for inv_b = 1 (soft). + result_b1 = await tool.run_async( + args={"skill_name": "skill1", "file_path": "references/typo.md"}, + tool_context=ctx_b, + ) + assert result_b1["error_code"] == "RESOURCE_NOT_FOUND" + + # invocation B, second attempt (different path) — counter for inv_b = 2 (fatal). + result_b2 = await tool.run_async( + args={"skill_name": "skill1", "file_path": "references/other.md"}, + tool_context=ctx_b, + ) + assert result_b2["error_code"] == "RESOURCE_NOT_FOUND_FATAL" + + +@pytest.mark.asyncio +async def test_load_resource_counter_uses_temp_prefix(mock_skill1): + """Failure-counter key uses the `temp:` prefix so it is not persisted.""" + toolset = skill_toolset.SkillToolset([mock_skill1]) + tool = skill_toolset.LoadSkillResourceTool(toolset) + ctx = _make_tool_context_with_agent() + + await tool.run_async( + args={"skill_name": "skill1", "file_path": "references/missing.md"}, + tool_context=ctx, + ) + + # The counter key must start with `temp:` so it is trimmed from the event + # delta and never reaches durable storage. + guard_keys = [k for k in ctx.state if "skill_resource_not_found_count" in k] + assert guard_keys, "Failure counter did not write a tracking key." + assert all(k.startswith("temp:") for k in guard_keys) # RunSkillScriptTool tests -def _make_tool_context_with_agent(agent=None): +def _make_tool_context_with_agent(agent=None, invocation_id="test_invocation"): """Creates a mock ToolContext with _invocation_context.agent.""" ctx = mock.MagicMock(spec=tool_context.ToolContext) ctx._invocation_context = mock.MagicMock() @@ -500,6 +616,7 @@ def _make_tool_context_with_agent(agent=None): ctx._invocation_context.agent.name = "test_agent" ctx._invocation_context.agent_states = {} ctx.agent_name = "test_agent" + ctx.invocation_id = invocation_id ctx.state = {} return ctx @@ -636,6 +753,10 @@ async def test_execute_script_python_success(mock_skill1): assert "_materialize_and_run()" in code_input.code assert "import runpy" in code_input.code assert "sys.argv = ['scripts/run.py']" in code_input.code + assert ( + "sys.path.insert(0, os.path.dirname(os.path.abspath('scripts/run.py')))" + in code_input.code + ) assert ( "runpy.run_path('scripts/run.py', run_name='__main__')" in code_input.code ) @@ -1023,8 +1144,17 @@ def get_script_extended(name): # ── Integration tests using real UnsafeLocalCodeExecutor ── -def _make_skill_with_script(skill_name, script_name, script): +def _make_skill_with_script( + skill_name: str, script_name: str, script: models.Script +) -> models.Skill: """Creates a minimal mock Skill with a single script.""" + return _make_skill_with_scripts(skill_name, {script_name: script}) + + +def _make_skill_with_scripts( + skill_name: str, scripts: dict[str, models.Script] +) -> models.Skill: + """Creates a minimal mock Skill with scripts.""" skill = mock.create_autospec(models.Skill, instance=True) skill.name = skill_name skill.description = f"Test skill {skill_name}" @@ -1045,16 +1175,14 @@ def _make_skill_with_script(skill_name, script_name, script): ) def get_script(name): - if name == script_name: - return script - return None + return scripts.get(name) skill.resources.get_script.side_effect = get_script skill.resources.get_reference.return_value = None skill.resources.get_asset.return_value = None skill.resources.list_references.return_value = [] skill.resources.list_assets.return_value = [] - skill.resources.list_scripts.return_value = [script_name] + skill.resources.list_scripts.return_value = list(scripts) return skill @@ -1089,6 +1217,36 @@ async def test_integration_python_stdout(): assert result["stderr"] == "" +@pytest.mark.asyncio +async def test_integration_python_imports_sibling_script_module(): + """Real executor: Python scripts can import helpers from scripts/.""" + skill = _make_skill_with_scripts( + "test_skill", + { + "run.py": models.Script( + src="from helper import message\nprint(message())" + ), + "helper.py": models.Script( + src="def message():\n return 'hello from helper'" + ), + }, + ) + toolset = _make_real_executor_toolset([skill]) + tool = skill_toolset.RunSkillScriptTool(toolset) + ctx = _make_tool_context_with_agent() + result = await tool.run_async( + args={ + "skill_name": "test_skill", + "file_path": "run.py", + }, + tool_context=ctx, + ) + assert "status" in result, f"Result missing status: {result}" + assert result["status"] == "success" + assert result["stdout"] == "hello from helper\n" + assert result["stderr"] == "" + + @pytest.mark.asyncio async def test_integration_python_sys_exit_zero(): """Real executor: sys.exit(0) is treated as success.""" @@ -1917,3 +2075,90 @@ async def test_close_cancels_futures_and_clears_cache(): assert fut1.cancelled() assert not fut2.cancelled() # Done futures shouldn't/can't be cancelled assert not toolset._fetched_skill_cache + + +@pytest.mark.asyncio +async def test_process_llm_request_with_tool_name_prefix( + mock_skill1, mock_skill2, tool_context_instance, mock_registry +): + toolset = skill_toolset.SkillToolset( + [mock_skill1, mock_skill2], + registry=mock_registry, + tool_name_prefix="my_prefix", + ) + + # Manually remove ListSkillsTool from self._tools to simulate it not being available + # so that instructions[1] is generated with available_skills + toolset._tools = [ + t + for t in toolset._tools + if not isinstance(t, skill_toolset.ListSkillsTool) + ] + + llm_req = mock.create_autospec(llm_request_model.LlmRequest, instance=True) + + await toolset.process_llm_request( + tool_context=tool_context_instance, llm_request=llm_req + ) + + llm_req.append_instructions.assert_called_once() + args, _ = llm_req.append_instructions.call_args + instructions = args[0] + assert len(instructions) == 3 + assert "`my_prefix_load_skill`" in instructions[0] + assert "`my_prefix_load_skill_resource`" in instructions[0] + assert "`my_prefix_run_skill_script`" in instructions[0] + assert "my_prefix_search_skills" in instructions[2] + + +@pytest.mark.asyncio +async def test_skill_toolset_with_list_tool_filter(): + toolset = skill_toolset.SkillToolset( + tool_filter=["list_skills", "load_skill"] + ) + tools = await toolset.get_tools() + tool_names = [t.name for t in tools] + assert "list_skills" in tool_names + assert "load_skill" in tool_names + assert "load_skill_resource" not in tool_names + assert "run_skill_script" not in tool_names + + +@pytest.mark.asyncio +async def test_skill_toolset_with_predicate_tool_filter(): + # Filter to only tools containing 'resource' in their name + toolset = skill_toolset.SkillToolset( + tool_filter=lambda tool, ctx=None: "resource" in tool.name + ) + tools = await toolset.get_tools() + tool_names = [t.name for t in tools] + assert tool_names == ["load_skill_resource"] + + +@pytest.mark.asyncio +async def test_skill_toolset_with_dynamic_tools_filter( + mock_skill1, tool_context_instance +): + mock_skill1.frontmatter.metadata = { + "adk_additional_tools": ["my_custom_tool"] + } + + custom_tool = mock.create_autospec(skill_toolset.BaseTool, instance=True) + custom_tool.name = "my_custom_tool" + + toolset = skill_toolset.SkillToolset( + skills=[mock_skill1], + additional_tools=[custom_tool], + tool_filter=["list_skills", "my_custom_tool"], + ) + + state_key = "_adk_activated_skill_test_agent" + tool_context_instance.state.get.side_effect = lambda key, default=None: ( + ["skill1"] if key == state_key else default + ) + + tools = await toolset.get_tools(readonly_context=tool_context_instance) + tool_names = [t.name for t in tools] + assert "list_skills" in tool_names + assert "my_custom_tool" in tool_names + assert "load_skill" not in tool_names diff --git a/tests/unittests/utils/test_feature_decorator.py b/tests/unittests/utils/test_feature_decorator.py index 7b29d6db4e..68c1e5ae0b 100644 --- a/tests/unittests/utils/test_feature_decorator.py +++ b/tests/unittests/utils/test_feature_decorator.py @@ -1,3 +1,17 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import os import tempfile import warnings diff --git a/tests/unittests/utils/test_output_schema_utils.py b/tests/unittests/utils/test_output_schema_utils.py index e0077966f5..963204894f 100644 --- a/tests/unittests/utils/test_output_schema_utils.py +++ b/tests/unittests/utils/test_output_schema_utils.py @@ -14,17 +14,35 @@ from __future__ import annotations -import builtins import importlib.util -import sys -from typing import Any -from google.adk.models.anthropic_llm import Claude from google.adk.models.base_llm import BaseLlm from google.adk.models.google_llm import Gemini from google.adk.utils.output_schema_utils import can_use_output_schema_with_tools import pytest +_has_anthropic = importlib.util.find_spec("anthropic") is not None +_has_litellm = importlib.util.find_spec("litellm") is not None + +_skip_anthropic = pytest.mark.skipif( + not _has_anthropic, reason="anthropic not installed" +) +_skip_litellm = pytest.mark.skipif( + not _has_litellm, reason="litellm not installed" +) + + +def _make_claude(model: str): + from google.adk.models.anthropic_llm import Claude + + return Claude(model=model) + + +def _make_litellm(model: str): + from google.adk.models.lite_llm import LiteLlm + + return LiteLlm(model=model) + @pytest.mark.parametrize( "model, env_value, expected", @@ -41,9 +59,6 @@ ("gemini-1.5-pro", "1", False), ("gemini-1.5-pro", "0", False), ("gemini-1.5-pro", None, False), - (Claude(model="claude-3.7-sonnet"), "1", False), - (Claude(model="claude-3.7-sonnet"), "0", False), - (Claude(model="claude-3.7-sonnet"), None, False), ], ) def test_can_use_output_schema_with_tools( @@ -60,35 +75,45 @@ def test_can_use_output_schema_with_tools( assert can_use_output_schema_with_tools(model) == expected -def test_can_use_output_schema_with_tools_with_litellm_model() -> None: - """Test LiteLlm detection when the optional module is available.""" - if importlib.util.find_spec("litellm") is None: - pytest.skip("litellm is not installed") - - from google.adk.models.lite_llm import LiteLlm - - assert can_use_output_schema_with_tools(LiteLlm(model="openai/gpt-4o")) +@_skip_anthropic +@pytest.mark.parametrize( + "model, env_value, expected", + [ + ("claude-3.7-sonnet", "1", False), + ("claude-3.7-sonnet", "0", False), + ("claude-3.7-sonnet", None, False), + ], +) +def test_can_use_output_schema_with_tools_claude( + monkeypatch, model, env_value, expected +): + """Test can_use_output_schema_with_tools with Claude models.""" + claude_model = _make_claude(model) + if env_value is not None: + monkeypatch.setenv("GOOGLE_GENAI_USE_VERTEXAI", env_value) + else: + monkeypatch.delenv("GOOGLE_GENAI_USE_VERTEXAI", raising=False) + assert can_use_output_schema_with_tools(claude_model) == expected -def test_can_use_output_schema_with_tools_without_litellm_module( - monkeypatch: pytest.MonkeyPatch, -) -> None: - """Test optional LiteLlm import failures do not affect other models.""" - original_import = builtins.__import__ - - def _failing_import( - name: str, - globals_dict: dict[str, Any] | None = None, - locals_dict: dict[str, Any] | None = None, - fromlist: tuple[str, ...] = (), - level: int = 0, - ) -> Any: - if name.endswith("lite_llm"): - raise ImportError("litellm not installed") - return original_import(name, globals_dict, locals_dict, fromlist, level) - - monkeypatch.delenv("GOOGLE_GENAI_USE_VERTEXAI", raising=False) - monkeypatch.delitem(sys.modules, "google.adk.models.lite_llm", raising=False) - monkeypatch.setattr(builtins, "__import__", _failing_import) - - assert not can_use_output_schema_with_tools(Claude(model="claude-3.7-sonnet")) +@_skip_litellm +@pytest.mark.parametrize( + "model, env_value, expected", + [ + ("openai/gpt-4o", "1", True), + ("openai/gpt-4o", "0", True), + ("openai/gpt-4o", None, True), + ("anthropic/claude-3.7-sonnet", None, True), + ("fireworks_ai/llama-v3p1-70b", None, True), + ], +) +def test_can_use_output_schema_with_tools_litellm( + monkeypatch, model, env_value, expected +): + """Test can_use_output_schema_with_tools with LiteLLM models.""" + litellm_model = _make_litellm(model) + if env_value is not None: + monkeypatch.setenv("GOOGLE_GENAI_USE_VERTEXAI", env_value) + else: + monkeypatch.delenv("GOOGLE_GENAI_USE_VERTEXAI", raising=False) + assert can_use_output_schema_with_tools(litellm_model) == expected diff --git a/tests/unittests/utils/test_serialized_base_model.py b/tests/unittests/utils/test_serialized_base_model.py new file mode 100644 index 0000000000..fa4f48c3eb --- /dev/null +++ b/tests/unittests/utils/test_serialized_base_model.py @@ -0,0 +1,35 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for SerializedBaseModel.""" + +from google.adk.utils._serialized_base_model import SerializedBaseModel + + +class MyModel(SerializedBaseModel): + test_field: str + + +def test_model_dump_json_by_alias_default(): + model = MyModel(test_field="value") + json_str = model.model_dump_json() + assert "testField" in json_str + assert "test_field" not in json_str + + +def test_model_dump_json_by_alias_false(): + model = MyModel(test_field="value") + json_str = model.model_dump_json(by_alias=False) + assert "test_field" in json_str + assert "testField" not in json_str diff --git a/tests/unittests/workflow/__init__.py b/tests/unittests/workflow/__init__.py new file mode 100644 index 0000000000..58d482ea38 --- /dev/null +++ b/tests/unittests/workflow/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/unittests/workflow/test_agent_node.py b/tests/unittests/workflow/test_agent_node.py new file mode 100644 index 0000000000..85c91f9ff5 --- /dev/null +++ b/tests/unittests/workflow/test_agent_node.py @@ -0,0 +1,71 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unit tests for BaseAgent acting as a workflow node.""" + +from __future__ import annotations + +from typing import AsyncGenerator + +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.context import Context +from google.adk.agents.invocation_context import InvocationContext +from google.adk.events.event import Event +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.sessions.session import Session +import pytest + + +class MockAgent(BaseAgent): + """A mock agent that yields predefined events.""" + + async def _run_async_impl( + self, ctx: InvocationContext + ) -> AsyncGenerator[Event, None]: + yield Event(author=self.name) + yield Event(author="sub_agent") + + +@pytest.mark.asyncio +async def test_base_agent_as_node_run(): + """Tests that BaseAgent runs as a node and preserves event authors.""" + agent = MockAgent(name="mock_agent") + + # Setup minimal context + session = Session(app_name="test", user_id="user", id="session") + session_service = InMemorySessionService() + ic = InvocationContext( + invocation_id="inv", + session=session, + session_service=session_service, + ) + ctx = Context(ic, node_path="wf") + + events = [] + async for event in agent.run(ctx=ctx, node_input=None): + events.append(event) + + assert len(events) == 2 + + # First event from mock_agent + assert events[0].author == "mock_agent" + assert events[0].node_info.path == "wf" + + # Second event from sub_agent + assert events[1].author == "sub_agent" + # Path should not be set by BaseAgent for sub_agent if author doesn't match agent name + assert not events[1].node_info.path + + # Also check if ctx.event_author was updated to preserve author for NodeRunner + assert ctx.event_author == "sub_agent" diff --git a/tests/unittests/flows/llm_flows/test_agent_transfer.py b/tests/unittests/workflow/test_agent_transfer.py similarity index 52% rename from tests/unittests/flows/llm_flows/test_agent_transfer.py rename to tests/unittests/workflow/test_agent_transfer.py index 0ca6f6546a..6832168b68 100644 --- a/tests/unittests/flows/llm_flows/test_agent_transfer.py +++ b/tests/unittests/workflow/test_agent_transfer.py @@ -12,6 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +"""Integration tests for multi-agent dynamic transfers in ADK 2.0.""" + +from __future__ import annotations + from google.adk.agents.llm_agent import Agent from google.adk.agents.loop_agent import LoopAgent from google.adk.agents.loop_agent import LoopAgentState @@ -19,11 +23,13 @@ from google.adk.agents.sequential_agent import SequentialAgentState from google.adk.apps.app import App from google.adk.apps.app import ResumabilityConfig +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.tools.exit_loop_tool import exit_loop from google.genai.types import Part import pytest -from ... import testing_utils +from tests.unittests import testing_utils def transfer_call_part(agent_name: str) -> Part: @@ -40,14 +46,16 @@ def transfer_call_part(agent_name: str) -> Part: @pytest.mark.parametrize('is_resumable', [True, False]) -def test_auto_to_auto(is_resumable: bool): +def test_transfer_parent_to_child(is_resumable: bool): + """Verify direct Parent -> Child dynamic transfer and conversational resumption.""" + # Arrange response = [ transfer_call_part('sub_agent_1'), 'response1', 'response2', ] mock_model = testing_utils.MockModel.create(responses=response) - # root (auto) - sub_agent_1 (auto) + sub_agent_1 = Agent(name='sub_agent_1', model=mock_model) root_agent = Agent( name='root_agent', @@ -61,15 +69,15 @@ def test_auto_to_auto(is_resumable: bool): ) runner = testing_utils.InMemoryRunner(app=app) + # Act & Assert: Turn 1 if not is_resumable: - # Asserts the transfer. assert testing_utils.simplify_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), ('sub_agent_1', 'response1'), ] - # sub_agent_1 should still be the current agent. + # Turn 2: Conversation continues at sub_agent_1 assert testing_utils.simplify_events(runner.run('test2')) == [ ('sub_agent_1', 'response2'), ] @@ -77,11 +85,12 @@ def test_auto_to_auto(is_resumable: bool): assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), + ('root_agent', END_OF_AGENT), ('sub_agent_1', 'response1'), ('sub_agent_1', END_OF_AGENT), - ('root_agent', END_OF_AGENT), ] - # Same session, different invocation. + + # Turn 2: Resumed session continues at sub_agent_1 assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ ('sub_agent_1', 'response2'), ('sub_agent_1', END_OF_AGENT), @@ -130,9 +139,9 @@ def test_auto_to_single(is_resumable: bool): assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), + ('root_agent', END_OF_AGENT), ('sub_agent_1', 'response1'), ('sub_agent_1', END_OF_AGENT), - ('root_agent', END_OF_AGENT), ] # Same session, different invocation. assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ @@ -191,12 +200,12 @@ def test_auto_to_auto_to_single(is_resumable: bool): assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), + ('root_agent', END_OF_AGENT), ('sub_agent_1', transfer_call_part('sub_agent_1_1')), ('sub_agent_1', TRANSFER_RESPONSE_PART), + ('sub_agent_1', END_OF_AGENT), ('sub_agent_1_1', 'response1'), ('sub_agent_1_1', END_OF_AGENT), - ('sub_agent_1', END_OF_AGENT), - ('root_agent', END_OF_AGENT), ] # Same session, different invocation. assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ @@ -263,6 +272,7 @@ def test_auto_to_sequential(is_resumable: bool): assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), + ('root_agent', END_OF_AGENT), ( 'sub_agent_1', SequentialAgentState(current_sub_agent='sub_agent_1_1').model_dump( @@ -280,7 +290,6 @@ def test_auto_to_sequential(is_resumable: bool): ('sub_agent_1_2', 'response2'), ('sub_agent_1_2', END_OF_AGENT), ('sub_agent_1', END_OF_AGENT), - ('root_agent', END_OF_AGENT), ] # Same session, different invocation. assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ @@ -359,6 +368,7 @@ def test_auto_to_sequential_to_auto(is_resumable: bool): assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), + ('root_agent', END_OF_AGENT), ( 'sub_agent_1', SequentialAgentState(current_sub_agent='sub_agent_1_1').model_dump( @@ -387,7 +397,6 @@ def test_auto_to_sequential_to_auto(is_resumable: bool): ('sub_agent_1_3', 'response3'), ('sub_agent_1_3', END_OF_AGENT), ('sub_agent_1', END_OF_AGENT), - ('root_agent', END_OF_AGENT), ] # Same session, different invocation. assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ @@ -469,6 +478,7 @@ def test_auto_to_loop(is_resumable: bool): # Transfers to sub_agent_1. ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), + ('root_agent', END_OF_AGENT), # Loops. ( 'sub_agent_1', @@ -510,7 +520,6 @@ def test_auto_to_loop(is_resumable: bool): ), ('sub_agent_1_2', END_OF_AGENT), ('sub_agent_1', END_OF_AGENT), - ('root_agent', END_OF_AGENT), ] # Same session, different invocation. assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ @@ -520,16 +529,293 @@ def test_auto_to_loop(is_resumable: bool): @pytest.mark.parametrize('is_resumable', [True, False]) -def test_auto_to_auto_to_auto_forms_transfer_loop(is_resumable: bool): +def test_transfer_child_to_sibling(is_resumable: bool): + """Verify Child A -> Sibling B peer dynamic transfer and conversational resumption.""" + # Arrange response = [ transfer_call_part('sub_agent_1'), transfer_call_part('sub_agent_2'), + 'response1', + 'response2', + ] + mock_model = testing_utils.MockModel.create(responses=response) + + sub_agent_1 = Agent(name='sub_agent_1', model=mock_model) + sub_agent_2 = Agent(name='sub_agent_2', model=mock_model) + root_agent = Agent( + name='root_agent', + model=mock_model, + sub_agents=[sub_agent_1, sub_agent_2], + ) + app = App( + name='test_app', + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=is_resumable), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Act & Assert: Turn 1 + if not is_resumable: + assert testing_utils.simplify_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1', transfer_call_part('sub_agent_2')), + ('sub_agent_1', TRANSFER_RESPONSE_PART), + ('sub_agent_2', 'response1'), + ] + + # Turn 2: Conversation continues at sibling sub_agent_2 + assert testing_utils.simplify_events(runner.run('test2')) == [ + ('sub_agent_2', 'response2'), + ] + else: + assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('root_agent', END_OF_AGENT), + ('sub_agent_1', transfer_call_part('sub_agent_2')), + ('sub_agent_1', TRANSFER_RESPONSE_PART), + ('sub_agent_1', END_OF_AGENT), + ('sub_agent_2', 'response1'), + ('sub_agent_2', END_OF_AGENT), + ] + + # Turn 2: Resumed session continues at sub_agent_2 + assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ + ('sub_agent_2', 'response2'), + ('sub_agent_2', END_OF_AGENT), + ] + + +@pytest.mark.parametrize('is_resumable', [True, False]) +def test_transfer_child_to_parent(is_resumable: bool): + """Verify Child -> Parent dynamic climbing transfer and conversational resumption.""" + # Arrange + response = [ + transfer_call_part('sub_agent_1'), transfer_call_part('root_agent'), - 'response from root', - 'response 2 from root', + 'response_root', + 'response_root_2', ] mock_model = testing_utils.MockModel.create(responses=response) - # root (auto) - sub_agent_1 (auto) - sub_agent_2 (auto) - root (auto) + + sub_agent_1 = Agent(name='sub_agent_1', model=mock_model) + root_agent = Agent( + name='root_agent', + model=mock_model, + sub_agents=[sub_agent_1], + ) + app = App( + name='test_app', + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=is_resumable), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Act & Assert: Turn 1 + if not is_resumable: + assert testing_utils.simplify_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1', transfer_call_part('root_agent')), + ('sub_agent_1', TRANSFER_RESPONSE_PART), + ('root_agent', 'response_root'), + ] + + # Turn 2: Conversation continues back at root_agent coordinator + assert testing_utils.simplify_events(runner.run('test2')) == [ + ('root_agent', 'response_root_2'), + ] + else: + assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('root_agent', END_OF_AGENT), + ('sub_agent_1', transfer_call_part('root_agent')), + ('sub_agent_1', TRANSFER_RESPONSE_PART), + ('sub_agent_1', END_OF_AGENT), + ('root_agent', 'response_root'), + ('root_agent', END_OF_AGENT), + ] + + # Turn 2: Resumed session continues at root_agent + assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ + ('root_agent', 'response_root_2'), + ('root_agent', END_OF_AGENT), + ] + + +@pytest.mark.parametrize('is_resumable', [True, False]) +def test_transfer_child_to_grandchild(is_resumable: bool): + """Verify deep 3-layer Child -> Grandchild nested dynamic transfers.""" + # Arrange + response = [ + transfer_call_part('sub_agent_1'), + transfer_call_part('sub_agent_1_1'), + 'response_grandchild', + 'response_grandchild_2', + ] + mock_model = testing_utils.MockModel.create(responses=response) + + sub_agent_1_1 = Agent(name='sub_agent_1_1', model=mock_model) + sub_agent_1 = Agent( + name='sub_agent_1', model=mock_model, sub_agents=[sub_agent_1_1] + ) + root_agent = Agent( + name='root_agent', model=mock_model, sub_agents=[sub_agent_1] + ) + app = App( + name='test_app', + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=is_resumable), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Act & Assert: Turn 1 + if not is_resumable: + assert testing_utils.simplify_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1', transfer_call_part('sub_agent_1_1')), + ('sub_agent_1', TRANSFER_RESPONSE_PART), + ('sub_agent_1_1', 'response_grandchild'), + ] + + # Turn 2: Conversation continues at grandchild + assert testing_utils.simplify_events(runner.run('test2')) == [ + ('sub_agent_1_1', 'response_grandchild_2'), + ] + else: + assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('root_agent', END_OF_AGENT), + ('sub_agent_1', transfer_call_part('sub_agent_1_1')), + ('sub_agent_1', TRANSFER_RESPONSE_PART), + ('sub_agent_1', END_OF_AGENT), + ('sub_agent_1_1', 'response_grandchild'), + ('sub_agent_1_1', END_OF_AGENT), + ] + + # Turn 2: Resumed session continues at sub_agent_1_1 + assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ + ('sub_agent_1_1', 'response_grandchild_2'), + ('sub_agent_1_1', END_OF_AGENT), + ] + + +@pytest.mark.asyncio +async def test_transfer_to_self_raises_error(): + """Verify that an agent trying to transfer to itself raises a ValueError.""" + # Arrange + + response = [ + transfer_call_part('sub_agent_1'), + transfer_call_part('sub_agent_1'), # Transfer to self + ] + mock_model = testing_utils.MockModel.create(responses=response) + + sub_agent_1 = Agent(name='sub_agent_1', model=mock_model) + root_agent = Agent( + name='root_agent', + model=mock_model, + sub_agents=[sub_agent_1], + ) + + session_service = InMemorySessionService() + await session_service.create_session( + app_name='test_app', user_id='test_user', session_id='test_session' + ) + runner = Runner( + app_name='test_app', + agent=root_agent, + session_service=session_service, + ) + + msg = testing_utils.types.Content( + role='user', parts=[testing_utils.types.Part(text='start')] + ) + + # Act & Assert + with pytest.raises(ValueError, match='cannot transfer to itself'): + async for _ in runner.run_async( + user_id='test_user', + session_id='test_session', + new_message=msg, + ): + pass + + +@pytest.mark.asyncio +async def test_transfer_to_unrelated_agent_raises_error(): + """Verify that an agent transferring to an unrelated agent raises a ValueError.""" + # Arrange + + response = [ + transfer_call_part('sub_agent_1'), + transfer_call_part('sub_agent_1_1'), + transfer_call_part( + 'sub_agent_2' + ), # Structurally unrelated to sub_agent_1_1! + ] + mock_model = testing_utils.MockModel.create(responses=response) + + sub_agent_1_1 = Agent(name='sub_agent_1_1', model=mock_model) + sub_agent_1 = Agent( + name='sub_agent_1', + model=mock_model, + sub_agents=[sub_agent_1_1], + ) + sub_agent_2 = Agent(name='sub_agent_2', model=mock_model) + root_agent = Agent( + name='root_agent', + model=mock_model, + sub_agents=[sub_agent_1, sub_agent_2], + ) + + session_service = InMemorySessionService() + await session_service.create_session( + app_name='test_app', user_id='test_user', session_id='test_session' + ) + runner = Runner( + app_name='test_app', + agent=root_agent, + session_service=session_service, + ) + + msg = testing_utils.types.Content( + role='user', parts=[testing_utils.types.Part(text='start')] + ) + + # Act & Assert + with pytest.raises( + ValueError, + match=( + "Cannot transfer from 'sub_agent_1_1' to unrelated agent" + " 'sub_agent_2'" + ), + ): + async for _ in runner.run_async( + user_id='test_user', + session_id='test_session', + new_message=msg, + ): + pass + + +@pytest.mark.parametrize('is_resumable', [True, False]) +def test_transfer_cyclic_loop(is_resumable: bool): + """Verify multi-stage cyclic loop transfer (Root -> SubA -> SubB -> Root) and resumption.""" + # Arrange + response = [ + transfer_call_part('sub_agent_1'), + transfer_call_part('sub_agent_2'), + transfer_call_part('root_agent'), + 'response_from_root', + 'response_from_root_2', + ] + mock_model = testing_utils.MockModel.create(responses=response) + sub_agent_1 = Agent(name='sub_agent_1', model=mock_model) sub_agent_2 = Agent(name='sub_agent_2', model=mock_model) root_agent = Agent( @@ -544,8 +830,8 @@ def test_auto_to_auto_to_auto_forms_transfer_loop(is_resumable: bool): ) runner = testing_utils.InMemoryRunner(app=app) + # Act & Assert: Turn 1 if not is_resumable: - # Asserts the transfer. assert testing_utils.simplify_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), @@ -553,35 +839,261 @@ def test_auto_to_auto_to_auto_forms_transfer_loop(is_resumable: bool): ('sub_agent_1', TRANSFER_RESPONSE_PART), ('sub_agent_2', transfer_call_part('root_agent')), ('sub_agent_2', TRANSFER_RESPONSE_PART), - ('root_agent', 'response from root'), + ('root_agent', 'response_from_root'), ] - # root_agent should be the current agent. + # Turn 2: Conversation continues at root coordinator assert testing_utils.simplify_events(runner.run('test2')) == [ - ('root_agent', 'response 2 from root'), + ('root_agent', 'response_from_root_2'), ] else: assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ ('root_agent', transfer_call_part('sub_agent_1')), ('root_agent', TRANSFER_RESPONSE_PART), + ('root_agent', END_OF_AGENT), ('sub_agent_1', transfer_call_part('sub_agent_2')), ('sub_agent_1', TRANSFER_RESPONSE_PART), + ('sub_agent_1', END_OF_AGENT), ('sub_agent_2', transfer_call_part('root_agent')), ('sub_agent_2', TRANSFER_RESPONSE_PART), - ('root_agent', 'response from root'), - ( - 'root_agent', - END_OF_AGENT, - ), # First time root_agent marked as ended. ('sub_agent_2', END_OF_AGENT), - ('sub_agent_1', END_OF_AGENT), - ( - 'root_agent', - END_OF_AGENT, - ), # Second time root_agent marked as ended. + ('root_agent', 'response_from_root'), + ('root_agent', END_OF_AGENT), ] - # Same session, different invocation. + + # Turn 2: Resumed session continues at root_agent assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ - ('root_agent', 'response 2 from root'), + ('root_agent', 'response_from_root_2'), ('root_agent', END_OF_AGENT), ] + + +@pytest.mark.asyncio +async def test_three_level_nested_dynamic_node_transfer(): + """Verify parent relationship climbing in 3-level deep nested dynamic nodes. + + Setup: + - root_agent with sub_agents=[mid_agent]. + - mid_agent with sub_agents=[leaf_agent, target_agent]. + Act: + - Run root_agent. Model responses trigger transfers: + Root -> Mid -> Leaf -> Target. + Assert: + - Events verify the full transfer chain and target response. + """ + # Arrange + target_agent = Agent(name='target_agent') + leaf_agent = Agent(name='leaf_agent') + mid_agent = Agent(name='mid_agent', sub_agents=[leaf_agent, target_agent]) + root_agent = Agent(name='root_agent', sub_agents=[mid_agent]) + + root_agent.model = testing_utils.MockModel.create( + responses=[transfer_call_part('mid_agent')] + ) + mid_agent.model = testing_utils.MockModel.create( + responses=[transfer_call_part('leaf_agent')] + ) + leaf_agent.model = testing_utils.MockModel.create( + responses=[transfer_call_part('target_agent')] + ) + target_agent.model = testing_utils.MockModel.create( + responses=['hello from target'] + ) + + app = App(name='test_app', root_agent=root_agent) + runner = testing_utils.InMemoryRunner(app=app) + + # Act + events = runner.run('go') + simple_events = testing_utils.simplify_events(events) + + # Assert + assert ('root_agent', transfer_call_part('mid_agent')) in simple_events + assert ('mid_agent', transfer_call_part('leaf_agent')) in simple_events + assert ('leaf_agent', transfer_call_part('target_agent')) in simple_events + assert ('target_agent', 'hello from target') in simple_events + + +@pytest.mark.asyncio +async def test_agent_transfer_hitl_resume_rehydration(): + """Verify B's rehydration after transfer A -> B -> LRO confirmation on turn 2. + + Setup: + - agent_a with sub_agents=[agent_b]. + - agent_b with a LongRunningFunctionTool. + Act: + - Turn 1: Run agent_a. Model transfers to agent_b, which calls LRO. + - Turn 2: Resume with LRO function response. + Assert: + - Turn 1: Yields LRO interrupt. + - Turn 2: agent_b successfully rehydrates and completes. + """ + from google.adk.tools.long_running_tool import LongRunningFunctionTool + + # Arrange + def confirm_tool() -> None: + return None + + lro_tool = LongRunningFunctionTool(confirm_tool) + agent_b = Agent(name='agent_b', tools=[lro_tool]) + agent_a = Agent(name='agent_a', sub_agents=[agent_b], tools=[lro_tool]) + + agent_a.model = testing_utils.MockModel.create( + responses=[transfer_call_part('agent_b')] + ) + + LRO_ID = 'adk-test-lro-123' + agent_b.model = testing_utils.MockModel.create( + responses=[ + testing_utils.types.Part( + function_call=testing_utils.types.FunctionCall( + name='confirm_tool', args={}, id=LRO_ID + ) + ), + 'B task finished', + ] + ) + + session_service = InMemorySessionService() + await session_service.create_session( + app_name='test_app', user_id='test_user', session_id='test_session' + ) + runner = Runner( + app_name='test_app', + agent=agent_a, + session_service=session_service, + ) + + # Act: Turn 1 + events1 = [ + e + async for e in runner.run_async( + user_id='test_user', + session_id='test_session', + new_message=testing_utils.types.Content( + role='user', parts=[testing_utils.types.Part(text='start task')] + ), + ) + ] + + # Assert: Turn 1 + assert any(e.long_running_tool_ids for e in events1) + + # Arrange: Turn 2 + lro_id = None + for e in events1: + if e.content and e.content.parts: + for p in e.content.parts: + if ( + p.function_call + and p.function_call.name == 'confirm_tool' + and p.function_call.id + ): + lro_id = p.function_call.id + break + if lro_id: + break + + if not lro_id: + for e in events1: + if e.long_running_tool_ids: + lro_id = list(e.long_running_tool_ids)[0] + break + + assert lro_id is not None + invocation_id = events1[0].invocation_id + + confirm_response = testing_utils.types.Content( + role='user', + parts=[ + testing_utils.types.Part( + function_response=testing_utils.types.FunctionResponse( + id=lro_id, + name='confirm_tool', + response={'result': 'done'}, + ) + ) + ], + ) + + # Act: Turn 2 + events2 = [ + e + async for e in runner.run_async( + user_id='test_user', + session_id='test_session', + invocation_id=invocation_id, + new_message=confirm_response, + ) + ] + + # Assert: Turn 2 + simplified2 = testing_utils.simplify_resumable_app_events(events2) + assert ('agent_b', 'B task finished') in simplified2 + + +@pytest.mark.asyncio +async def test_llm_agent_transfer_inside_custom_node(): + """Verify transfer from an LlmAgent called inside a custom dynamic node. + + Setup: + - root_agent with sub_agents=[inner_agent, target_agent] to establish static sibling relation. + - A custom @node that calls inner_agent via ctx.run_node. + - A Workflow that executes the custom node. + Act: + - Run the workflow. inner_agent is executed and triggers transfer to target_agent. + Assert: + - The transfer is correctly resolved as SIBLING and target_agent executes. + """ + from google.adk.workflow import node + from google.adk.workflow import START + from google.adk.workflow import Workflow + + # Arrange + target_agent = Agent(name='target_agent') + inner_agent = Agent(name='inner_agent') + # Establish static hierarchy for transfer resolution + root_agent = Agent(name='root_agent', sub_agents=[inner_agent, target_agent]) + + inner_agent.model = testing_utils.MockModel.create( + responses=[transfer_call_part('target_agent')] + ) + target_agent.model = testing_utils.MockModel.create( + responses=['hello from target'] + ) + + @node(rerun_on_resume=True) + async def custom_node(*, ctx, node_input): + # Call llm agent inside custom node + result = await ctx.run_node(inner_agent, node_input='go') + yield f'custom: {result}' + + wf = Workflow(name='wf', edges=[(START, custom_node)]) + + session_service = InMemorySessionService() + await session_service.create_session( + app_name='test_app', user_id='test_user', session_id='test_session' + ) + runner = Runner( + app_name='test_app', + node=wf, + session_service=session_service, + ) + + # Act + events = [ + e + async for e in runner.run_async( + user_id='test_user', + session_id='test_session', + new_message=testing_utils.types.Content( + role='user', parts=[testing_utils.types.Part(text='start')] + ), + ) + ] + + simplified = testing_utils.simplify_events(events) + + # Assert + assert ('inner_agent', transfer_call_part('target_agent')) in simplified + assert ('target_agent', 'hello from target') in simplified diff --git a/tests/unittests/workflow/test_dynamic_node_scheduler.py b/tests/unittests/workflow/test_dynamic_node_scheduler.py new file mode 100644 index 0000000000..0e7e37f2b3 --- /dev/null +++ b/tests/unittests/workflow/test_dynamic_node_scheduler.py @@ -0,0 +1,1212 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for DynamicNodeScheduler. + +Verifies the three scheduling cases (fresh, dedup, resume) and the +lazy event scan that reconstructs dynamic node state. +""" + +from unittest.mock import AsyncMock +from unittest.mock import MagicMock + +from google.adk.agents.context import Context +from google.adk.events.event import Event +from google.adk.events.event import NodeInfo +from google.adk.workflow._base_node import BaseNode +from google.adk.workflow._dynamic_node_scheduler import DynamicNodeRun +from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler +from google.adk.workflow._dynamic_node_scheduler import DynamicNodeState +from google.adk.workflow._node_state import NodeState +from google.adk.workflow._node_status import NodeStatus +from google.adk.workflow._workflow import _LoopState +from pydantic import BaseModel +import pytest + +# --- Fixtures --- + + +def _make_parent_ctx(events=None): + """Create a minimal parent Context with mock IC.""" + ic = MagicMock() + ic.invocation_id = 'inv-1' + ic.session = MagicMock() + ic.session.state = {} + ic.session.events = events or [] + ic.run_config = None + + collected = [] + + async def _enqueue(event): + collected.append(event) + + ic._enqueue_event = AsyncMock(side_effect=_enqueue) + + ctx = MagicMock(spec=Context) + ctx._invocation_context = ic + ctx.node_path = 'wf/parent' + ctx.run_id = 'run-parent' + ctx.event_author = 'wf' + ctx._workflow_scheduler = None + ctx._output_for_ancestors = [] + ctx._output_delegated = False + ctx._child_run_counters = {} + + return ctx, collected + + +def _make_event( + path='', + output=None, + interrupt_ids=None, + run_id=None, + author='node', + invocation_id='inv-1', + output_for=None, +): + """Create a minimal Event for session event lists.""" + event = MagicMock(spec=Event) + event.invocation_id = invocation_id + event.author = author + event.output = output + event.partial = False + event.node_info = MagicMock(spec=NodeInfo) + event.node_info.path = path + event.node_info.output_for = output_for + event.node_info.message_as_output = None + event.branch = None + event.isolation_scope = None + event.long_running_tool_ids = set(interrupt_ids) if interrupt_ids else None + event.content = None + event.actions = None + return event + + +def _make_fr_event(fc_id, response, invocation_id='inv-1'): + """Create a user FR event.""" + event = MagicMock(spec=Event) + event.invocation_id = invocation_id + event.author = 'user' + event.output = None + event.node_info = MagicMock(spec=NodeInfo) + event.node_info.path = '' + event.node_info.message_as_output = None + event.branch = None + event.isolation_scope = None + event.long_running_tool_ids = None + + fr = MagicMock() + fr.id = fc_id + fr.response = response + + part = MagicMock() + part.function_response = fr + + content = MagicMock() + content.parts = [part] + event.content = content + return event + + +# ========================================================================= +# _rehydrate_from_events — lazy scan +# ========================================================================= + + +@pytest.mark.asyncio +async def test_rehydrate_finds_completed_node(): + """Scan finds output event → node marked COMPLETED.""" + events = [ + _make_event( + path='wf/parent/child@r-1', + output='result', + ), + ] + ctx, _ = _make_parent_ctx(events=events) + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') + + assert 'wf/parent/child@r-1' in ls.runs + run = ls.runs['wf/parent/child@r-1'] + assert run.recovered_state is not None + assert run.recovered_state.output == 'result' + + +@pytest.mark.asyncio +async def test_rehydrate_ignores_events_from_different_invocation(): + """Scan ignores events with a different invocation_id.""" + events = [ + _make_event( + path='wf/parent/child@r-1', + output='result', + invocation_id='inv-different', + ), + ] + ctx, _ = _make_parent_ctx(events=events) + ctx._invocation_context.invocation_id = 'inv-current' + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') + + assert 'wf/parent/child@r-1' not in ls.runs + + +@pytest.mark.asyncio +async def test_rehydrate_finds_interrupted_node(): + """Scan finds interrupt event → node marked WAITING.""" + events = [ + _make_event( + path='wf/parent/child@r-1', + interrupt_ids=['fc-1'], + ), + ] + ctx, _ = _make_parent_ctx(events=events) + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') + + assert 'wf/parent/child@r-1' in ls.runs + run = ls.runs['wf/parent/child@r-1'] + assert run.recovered_state is not None + assert 'fc-1' in run.recovered_state.interrupt_ids + + +@pytest.mark.asyncio +async def test_rehydrate_with_target_run_id_skips_others(): + """Scan with unique path only rehydrates that specific run.""" + events = [ + _make_event( + path='wf/parent/child@r-1', + output='result-1', + ), + _make_event( + path='wf/parent/child@r-2', + output='result-2', + ), + ] + ctx, _ = _make_parent_ctx(events=events) + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + # When targeting r-2 + scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-2') + + # Then only r-2 is in state + assert 'wf/parent/child@r-2' in ls.runs + assert 'wf/parent/child@r-1' not in ls.runs + run = ls.runs['wf/parent/child@r-2'] + assert run.recovered_state is not None + assert run.recovered_state.output == 'result-2' + + +@pytest.mark.asyncio +async def test_rehydrate_includes_delegated(): + """Scan includes events delegated to that run.""" + events = [ + _make_event( + path='wf/parent/child@r-target/inner@r-inner', + output='delegated-val', + output_for=['wf/parent/child@r-target'], + ), + ] + ctx, _ = _make_parent_ctx(events=events) + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-target') + + assert 'wf/parent/child@r-target' in ls.runs + run = ls.runs['wf/parent/child@r-target'] + assert run.recovered_state is not None + assert run.recovered_state.output == 'delegated-val' + + +@pytest.mark.asyncio +async def test_rehydrate_resolves_interrupt_with_fr(): + """Scan finds interrupt + FR → all resolved, ready to re-run.""" + events = [ + _make_event( + path='wf/parent/child@r-1', + interrupt_ids=['fc-1'], + ), + _make_fr_event('fc-1', {'approved': True}), + ] + ctx, _ = _make_parent_ctx(events=events) + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') + + run = ls.runs['wf/parent/child@r-1'] + assert run.recovered_state is not None + assert 'fc-1' in run.recovered_state.resolved_ids + + +@pytest.mark.asyncio +async def test_rehydrate_no_events_does_nothing(): + """Scan with no matching events does not populate dynamic_nodes.""" + events = [ + _make_event(path='wf/other/node', output='x'), + ] + ctx, _ = _make_parent_ctx(events=events) + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') + + assert 'wf/parent/child@r-1' not in ls.runs + + +@pytest.mark.asyncio +async def test_rehydrate_subtree_interrupt(): + """Interrupts from nested descendants are collected.""" + events = [ + _make_event( + path='wf/parent/child@r-1/inner@r-inner', + interrupt_ids=['fc-deep'], + ), + ] + ctx, _ = _make_parent_ctx(events=events) + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') + + assert 'wf/parent/child@r-1' in ls.runs + run = ls.runs['wf/parent/child@r-1'] + assert run.recovered_state is not None + assert 'fc-deep' in run.recovered_state.interrupt_ids + + +@pytest.mark.asyncio +async def test_rehydrate_parallel_worker_interrupts(): + """Interrupts from parallel child nodes sharing the parent's path.""" + events = [ + _make_event( + # Child has exact same path as parent + path='wf/parent/parallel', + interrupt_ids=['fc-1'], + run_id='r-child-1', + ), + _make_event( + path='wf/parent/parallel', + interrupt_ids=['fc-2'], + run_id='r-child-2', + ), + ] + ctx, _ = _make_parent_ctx(events=events) + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + # Rehydrate the parent which has run_id 'r-parent' + scheduler._rehydrate_from_events(ctx, 'wf/parent/parallel') + + assert 'wf/parent/parallel' in ls.runs + run = ls.runs['wf/parent/parallel'] + assert run.recovered_state is not None + assert 'fc-1' in run.recovered_state.interrupt_ids + assert 'fc-2' in run.recovered_state.interrupt_ids + + +@pytest.mark.asyncio +async def test_rehydrate_output_for_delegation(): + """Output via output_for delegation is recognized.""" + events = [ + _make_event( + path='wf/parent/child@r-1/inner@r-inner', + output='delegated', + output_for=['wf/parent/child@r-1'], + ), + ] + ctx, _ = _make_parent_ctx(events=events) + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + scheduler._rehydrate_from_events(ctx, 'wf/parent/child@r-1') + + run = ls.runs['wf/parent/child@r-1'] + assert run.recovered_state is not None + assert run.recovered_state.output == 'delegated' + + +# ========================================================================= +# __call__ — dispatch logic +# ========================================================================= + + +# ========================================================================= +# DefaultNodeScheduler — standalone scheduler +# ========================================================================= + + +@pytest.mark.asyncio +async def test_fresh_execution_runs_node(): + """DefaultNodeScheduler runs a fresh node just like DynamicNodeScheduler.""" + + class _Child(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield f'ct: {node_input}' + + ctx, _ = _make_parent_ctx() + tracker = DynamicNodeScheduler(state=DynamicNodeState()) + + mock_child_ctx = MagicMock(spec=Context) + mock_child_ctx.error = None + mock_child_ctx.interrupt_ids = set() + mock_child_ctx.output = 'ct: data' + mock_child_ctx.actions = MagicMock() + mock_child_ctx.actions.transfer_to_agent = None + ctx._run_node_standalone = AsyncMock(return_value=mock_child_ctx) + + child_ctx = await tracker( + ctx, + _Child(name='child'), + 'data', + node_name='child', + run_id='1', + ) + + assert child_ctx.output == 'ct: data' + + +@pytest.mark.asyncio +async def test_completed_dedup_returns_cached(): + """DefaultNodeScheduler returns cached output for completed nodes.""" + ctx, _ = _make_parent_ctx() + tracker = DynamicNodeScheduler(state=DynamicNodeState()) + + # Pre-populate state as if node already completed. + from google.adk.workflow.utils._rehydration_utils import _ChildScanState + + tracker._state.runs['wf/parent/child@r-1'] = DynamicNodeRun( + state=NodeState(run_id='r-1'), + recovered_state=_ChildScanState( + run_id='r-1', + output='cached', + ), + ) + + child_ctx = await tracker( + ctx, + BaseNode(name='child'), + 'input', + node_name='child', + run_id='r-1', + ) + + assert child_ctx.output == 'cached' + + +@pytest.mark.asyncio +async def test_concurrent_dedup_returns_running_task(): + """Scheduler deduplicates concurrent executions of the same running task.""" + import asyncio + + ctx, _ = _make_parent_ctx() + tracker = DynamicNodeScheduler(state=DynamicNodeState()) + + # Mock an active running task (not done yet!) + running_task = asyncio.Future() + + tracker._state.runs['wf/parent/child@r-1'] = DynamicNodeRun( + state=NodeState(run_id='r-1'), + task=running_task, + ) + + # Dispatch the scheduler in the background + scheduler_task = asyncio.create_task( + tracker( + ctx, + BaseNode(name='child'), + 'input', + node_name='child', + run_id='r-1', + ) + ) + + # Let the event loop run one tick to execute the scheduler interception + await asyncio.sleep(0) + + # Resolve the running task dynamically + mock_context = MagicMock(spec=Context) + running_task.set_result(mock_context) + + res_ctx = await scheduler_task + assert res_ctx is mock_context + + +@pytest.mark.asyncio +async def test_waiting_resolved_resumes_node(): + """DefaultNodeScheduler re-runs nodes with resolved interrupts.""" + + class _Resumable(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl(self, *, ctx, node_input): + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield f'resumed: {ctx.resume_inputs["fc-1"]}' + return + yield 'should not reach here' + + ctx, _ = _make_parent_ctx() + tracker = DynamicNodeScheduler(state=DynamicNodeState()) + + # Pre-populate state as if node interrupted and was resolved. + from google.adk.workflow.utils._rehydration_utils import _ChildScanState + + tracker._state.runs['wf/parent/child@r-1'] = DynamicNodeRun( + state=NodeState(run_id='r-1'), + recovered_state=_ChildScanState( + run_id='r-1', + interrupt_ids={'fc-1'}, + resolved_ids={'fc-1'}, + resolved_responses={'fc-1': 'approved'}, + ), + ) + + mock_child_ctx = MagicMock(spec=Context) + mock_child_ctx.error = None + mock_child_ctx.interrupt_ids = set() + mock_child_ctx.output = 'resumed: approved' + mock_child_ctx.actions = MagicMock() + mock_child_ctx.actions.transfer_to_agent = None + ctx._run_node_standalone = AsyncMock(return_value=mock_child_ctx) + + child_ctx = await tracker( + ctx, + _Resumable(name='child'), + 'input', + node_name='child', + run_id='r-1', + ) + + assert child_ctx.output == 'resumed: approved' + + +@pytest.mark.asyncio +async def test_waiting_unresolved_propagates_interrupts(): + """DefaultNodeScheduler propagates unresolved interrupts.""" + ctx, _ = _make_parent_ctx() + tracker = DynamicNodeScheduler(state=DynamicNodeState()) + + from google.adk.workflow.utils._rehydration_utils import _ChildScanState + + tracker._state.runs['wf/parent/child@r-1'] = DynamicNodeRun( + state=NodeState(run_id='r-1'), + recovered_state=_ChildScanState( + run_id='r-1', + interrupt_ids={'fc-1'}, + ), + ) + + child_ctx = await tracker( + ctx, + BaseNode(name='child'), + 'input', + node_name='child', + run_id='r-1', + ) + + assert child_ctx.interrupt_ids == {'fc-1'} + assert 'fc-1' in tracker._state.interrupt_ids + + +@pytest.mark.asyncio +async def test_calling_waiting_node_without_rerun_raises_value_error(): + """Calling a dynamic node that is waiting for output with rerun_on_resume=False raises ValueError.""" + + # Given a dynamic node waiting for output with rerun_on_resume=False + class _WaitingNode(BaseNode): + wait_for_output: bool = True + + async def _run_impl(self, *, ctx, node_input): + yield 'should not reach here' + + ctx, _ = _make_parent_ctx() + ls = _LoopState() + from google.adk.workflow.utils._rehydration_utils import _ChildScanState + + ls.runs['wf/parent/child@r-1'] = DynamicNodeRun( + state=NodeState(run_id='r-1'), + recovered_state=_ChildScanState( + run_id='r-1', + interrupt_ids={'pause_req'}, + resolved_ids={'pause_req'}, + ), + ) + scheduler = DynamicNodeScheduler(state=ls) + + # When it is called again + # Then it raises ValueError + with pytest.raises( + ValueError, match='is waiting for output but was called again' + ): + await scheduler( + ctx, + _WaitingNode(name='child'), + 'input', + node_name='child', + run_id='r-1', + ) + + +class _ModelA(BaseModel): + x: int + + +@pytest.mark.asyncio +async def test_runtime_schema_validation_passes(): + """Tests that runtime schema validation passes when input matches schema.""" + ctx, _ = _make_parent_ctx() + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + node = BaseNode(name='child', input_schema=_ModelA) + + # We mock _run_node_internal to avoid full execution, we only care about validation in __call__ + scheduler._run_node_internal = AsyncMock(return_value=MagicMock(spec=Context)) + + await scheduler( + ctx, + node, + {'x': 1}, + node_name='child', + run_id='1', + ) + # Should not raise + + +@pytest.mark.asyncio +async def test_runtime_schema_validation_raises(): + """Tests that runtime schema validation raises when input mismatches schema.""" + ctx, _ = _make_parent_ctx() + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + node = BaseNode(name='child', input_schema=_ModelA) + + with pytest.raises( + ValueError, + match=r"Runtime schema validation failed for dynamic node 'child'", + ): + await scheduler( + ctx, + node, + {'x': 'string'}, # Invalid type for x + node_name='child', + run_id='1', + ) + + +@pytest.mark.asyncio +async def test_runtime_schema_validation_missing_schema_passes(): + """Tests that runtime schema validation passes when no schema is defined.""" + ctx, _ = _make_parent_ctx() + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + node = BaseNode(name='child') # No input schema + + scheduler._run_node_internal = AsyncMock(return_value=MagicMock(spec=Context)) + + await scheduler( + ctx, + node, + {'x': 1}, + node_name='child', + run_id='1', + ) + # Should not raise + + +@pytest.mark.asyncio +async def test_runtime_schema_validation_content_fallback(): + """Tests that runtime schema validation handles Content objects by extraction.""" + ctx, _ = _make_parent_ctx() + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + node = BaseNode(name='child', input_schema=_ModelA) + + scheduler._run_node_internal = AsyncMock(return_value=MagicMock(spec=Context)) + + from google.genai import types + + msg = types.Content(parts=[types.Part(text='{"x": 1}')], role='user') + + await scheduler( + ctx, + node, + msg, + node_name='child', + run_id='1', + ) + # Should not raise + + +# ========================================================================= +# __call__ — Agent Transfer logic +# ========================================================================= + + +@pytest.mark.asyncio +async def test_scheduler_handles_child_transfer(): + """Scheduler processes CHILD relationship by nesting next context.""" + # Arrange + from google.adk.agents.llm_agent import LlmAgent + from google.adk.events.event_actions import EventActions + from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler + from google.adk.workflow._workflow import _LoopState + + target = LlmAgent(name='target') + current = LlmAgent(name='current', sub_agents=[target]) + root = LlmAgent(name='root', sub_agents=[current]) + + ctx, _ = _make_parent_ctx() + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + child_ctx1 = MagicMock() + child_ctx1.node_path = 'wf/parent/current@1' + child_ctx1.parent_ctx = ctx + child_ctx1.actions = EventActions(transfer_to_agent='target') + child_ctx1.error = None + child_ctx1.interrupt_ids = set() + child_ctx1._invocation_context = ctx._invocation_context + child_ctx1._child_run_counters = {} + + child_ctx2 = MagicMock() + child_ctx2.node_path = 'wf/parent/current@1/target@1' + child_ctx2.parent_ctx = child_ctx1 + child_ctx2.actions = EventActions() + child_ctx2.error = None + child_ctx2.interrupt_ids = set() + child_ctx2._invocation_context = ctx._invocation_context + child_ctx2._child_run_counters = {} + + scheduler._run_node_internal = AsyncMock(side_effect=[child_ctx1, child_ctx2]) + + # Act + final_ctx = await scheduler( + ctx, + current, + 'input', + node_name='current', + run_id='1', + ) + + # Assert + assert final_ctx is child_ctx2 + calls = scheduler._run_node_internal.call_args_list + assert len(calls) == 2 + + # First call: current node + args1, kwargs1 = calls[0] + assert args1[0] is ctx + assert args1[1] is current + assert args1[2] == 'current' + assert args1[4] == '1' + + # Second call: target node (transferred CHILD) + args2, kwargs2 = calls[1] + assert args2[0] is child_ctx1 + assert args2[1] is target + assert args2[2] == 'target' + assert args2[4] == '1' + + +@pytest.mark.asyncio +async def test_scheduler_handles_sibling_transfer(): + """Scheduler processes SIBLING relationship by sharing parent context.""" + # Arrange + from google.adk.agents.llm_agent import LlmAgent + from google.adk.events.event_actions import EventActions + from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler + from google.adk.workflow._workflow import _LoopState + + current = LlmAgent(name='current') + target = LlmAgent(name='target') + root = LlmAgent(name='root', sub_agents=[current, target]) + + ctx, _ = _make_parent_ctx() + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + child_ctx1 = MagicMock() + child_ctx1.node_path = 'wf/parent/current@1' + child_ctx1.parent_ctx = ctx + child_ctx1.actions = EventActions(transfer_to_agent='target') + child_ctx1.error = None + child_ctx1.interrupt_ids = set() + child_ctx1._invocation_context = ctx._invocation_context + child_ctx1._child_run_counters = {} + + child_ctx2 = MagicMock() + child_ctx2.node_path = 'wf/parent/target@1' + child_ctx2.parent_ctx = ctx + child_ctx2.actions = EventActions() + child_ctx2.error = None + child_ctx2.interrupt_ids = set() + child_ctx2._invocation_context = ctx._invocation_context + child_ctx2._child_run_counters = {} + + scheduler._run_node_internal = AsyncMock(side_effect=[child_ctx1, child_ctx2]) + + # Act + final_ctx = await scheduler( + ctx, + current, + 'input', + node_name='current', + run_id='1', + ) + + # Assert + assert final_ctx is child_ctx2 + calls = scheduler._run_node_internal.call_args_list + assert len(calls) == 2 + + # Second call: target node (transferred SIBLING) + args2, kwargs2 = calls[1] + assert args2[0] is ctx + assert args2[1] is target + assert args2[2] == 'target' + assert args2[4] == '1' + + +@pytest.mark.asyncio +async def test_scheduler_handles_parent_transfer(): + """Scheduler processes PARENT relationship by truncating parent context.""" + # Arrange + from google.adk.agents.llm_agent import LlmAgent + from google.adk.events.event_actions import EventActions + from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler + from google.adk.workflow._workflow import _LoopState + + current = LlmAgent(name='current') + target = LlmAgent(name='target', sub_agents=[current]) + root = LlmAgent(name='root', sub_agents=[target]) + + ctx, _ = _make_parent_ctx() + ctx._child_run_counters = {'target': 1} + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + target_ctx = MagicMock() + target_ctx.node_path = 'wf/parent/target@1' + target_ctx.node = target + target_ctx.parent_ctx = ctx + target_ctx._invocation_context = ctx._invocation_context + target_ctx._child_run_counters = {} + + child_ctx1 = MagicMock() + child_ctx1.node_path = 'wf/parent/target@1/current@1' + child_ctx1.node = current + child_ctx1.parent_ctx = target_ctx + child_ctx1.actions = EventActions(transfer_to_agent='target') + child_ctx1.error = None + child_ctx1.interrupt_ids = set() + child_ctx1._invocation_context = ctx._invocation_context + child_ctx1._child_run_counters = {} + + child_ctx2 = MagicMock() + child_ctx2.node_path = 'wf/parent/target@2' + child_ctx2.parent_ctx = ctx + child_ctx2.actions = EventActions() + child_ctx2.error = None + child_ctx2.interrupt_ids = set() + child_ctx2._invocation_context = ctx._invocation_context + child_ctx2._child_run_counters = {} + + scheduler._run_node_internal = AsyncMock(side_effect=[child_ctx1, child_ctx2]) + + # Act + final_ctx = await scheduler( + target_ctx, + current, + 'input', + node_name='current', + run_id='1', + ) + + # Assert + assert final_ctx is child_ctx2 + calls = scheduler._run_node_internal.call_args_list + assert len(calls) == 2 + + # Second call: target node (transferred ANCESTOR) + args2, kwargs2 = calls[1] + assert args2[0] is ctx + assert args2[1] is target + assert args2[2] == 'target' + assert args2[4] == '2' + + +@pytest.mark.asyncio +async def test_scheduler_raises_value_error_on_self_transfer(): + """Scheduler raises ValueError when agent attempts to transfer to itself.""" + # Arrange + from google.adk.agents.llm_agent import LlmAgent + from google.adk.events.event_actions import EventActions + from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler + from google.adk.workflow._workflow import _LoopState + + current = LlmAgent(name='current') + root = LlmAgent(name='root', sub_agents=[current]) + + ctx, _ = _make_parent_ctx() + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + child_ctx = MagicMock() + child_ctx.node_path = 'wf/parent/current@1' + child_ctx.parent_ctx = ctx + child_ctx.actions = EventActions(transfer_to_agent='current') + child_ctx.error = None + child_ctx.interrupt_ids = set() + child_ctx._invocation_context = ctx._invocation_context + child_ctx._child_run_counters = {} + + scheduler._run_node_internal = AsyncMock(return_value=child_ctx) + + # Act & Assert + with pytest.raises(ValueError, match='cannot transfer to itself'): + await scheduler( + ctx, + current, + 'input', + node_name='current', + run_id='1', + ) + + +@pytest.mark.asyncio +async def test_scheduler_handles_parent_transfer_bypassed_on_resume(): + """Scheduler processes PARENT relationship when parent was bypassed on resume.""" + # Arrange + from google.adk.agents.llm_agent import LlmAgent + from google.adk.events.event_actions import EventActions + from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler + from google.adk.workflow._workflow import _LoopState + + current = LlmAgent(name='current') + target = LlmAgent(name='target', sub_agents=[current]) + root = LlmAgent(name='root', sub_agents=[target]) + + current.parent_agent = target + target.parent_agent = root + + ctx, _ = _make_parent_ctx() + ctx.node = None + ctx._child_run_counters = {'target': 1} + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + target_ctx = MagicMock() + target_ctx.node_path = 'current@1' + target_ctx.node = current + target_ctx.parent_ctx = ctx + target_ctx._invocation_context = ctx._invocation_context + target_ctx._child_run_counters = {} + + child_ctx1 = MagicMock() + child_ctx1.node_path = 'current@1' + child_ctx1.node = current + child_ctx1.parent_ctx = ctx + child_ctx1.actions = EventActions(transfer_to_agent='target') + child_ctx1.error = None + child_ctx1.interrupt_ids = set() + child_ctx1._invocation_context = ctx._invocation_context + child_ctx1._child_run_counters = {} + + child_ctx2 = MagicMock() + child_ctx2.node_path = 'target@2' + child_ctx2.parent_ctx = ctx + child_ctx2.actions = EventActions() + child_ctx2.error = None + child_ctx2.interrupt_ids = set() + child_ctx2._invocation_context = ctx._invocation_context + child_ctx2._child_run_counters = {} + + scheduler._run_node_internal = AsyncMock(side_effect=[child_ctx1, child_ctx2]) + + # Act + final_ctx = await scheduler( + ctx, + current, + 'input', + node_name='current', + run_id='1', + ) + + # Assert + assert final_ctx is child_ctx2 + calls = scheduler._run_node_internal.call_args_list + assert len(calls) == 2 + + # First call: current node + args1, kwargs1 = calls[0] + assert args1[0] is ctx + assert args1[1] is current + assert args1[2] == 'current' + assert args1[4] == '1' + + # Second call: target node (transferred PARENT) + args2, kwargs2 = calls[1] + assert args2[0] is ctx + assert args2[1] is target + assert args2[2] == 'target' + assert args2[4] == '2' + + +@pytest.mark.asyncio +async def test_scheduler_handles_three_layer_agent_transfers_round_trip(): + """Verify 3-layer agent transfers (Root -> Child -> Grandchild -> Child -> Root).""" + # Arrange + from google.adk.agents.llm_agent import LlmAgent + from google.adk.events.event_actions import EventActions + from google.adk.workflow._dynamic_node_scheduler import DynamicNodeScheduler + from google.adk.workflow._workflow import _LoopState + + grandchild = LlmAgent(name='grandchild') + child = LlmAgent(name='child', sub_agents=[grandchild]) + root = LlmAgent(name='root', sub_agents=[child]) + + grandchild.parent_agent = child + child.parent_agent = root + + # ctx is the root context (node = None, parent_ctx = None) + ctx = MagicMock() + ctx.node = None + ctx.parent_ctx = None + ctx.node_path = '' + ctx._child_run_counters = {'child': 1} + ctx._output_for_ancestors = [] + + ic = MagicMock() + ic.invocation_id = 'inv-1' + ic.session = MagicMock() + ic.session.state = {} + ic.session.events = [] + ic.run_config = None + ctx._invocation_context = ic + + # root_ctx is the parent context of child (node = root, parent_ctx = ctx) + root_ctx = MagicMock() + root_ctx.node = root + root_ctx.parent_ctx = ctx + root_ctx.node_path = 'root@1' + root_ctx._child_run_counters = {'child': 1} + root_ctx._invocation_context = ic + + ls = _LoopState() + scheduler = DynamicNodeScheduler(state=ls) + + # Step 1: root delegates to child + child_ctx1 = MagicMock() + child_ctx1.node_path = 'root@1/child@1' + child_ctx1.node = child + child_ctx1.parent_ctx = root_ctx + child_ctx1.actions = EventActions(transfer_to_agent='grandchild') + child_ctx1.error = None + child_ctx1.interrupt_ids = set() + child_ctx1._invocation_context = ic + child_ctx1._child_run_counters = {} + + # Step 2: child delegates to grandchild + grandchild_ctx1 = MagicMock() + grandchild_ctx1.node_path = 'root@1/child@1/grandchild@1' + grandchild_ctx1.node = grandchild + grandchild_ctx1.parent_ctx = child_ctx1 + grandchild_ctx1.actions = EventActions(transfer_to_agent='child') + grandchild_ctx1.error = None + grandchild_ctx1.interrupt_ids = set() + grandchild_ctx1._invocation_context = ic + grandchild_ctx1._child_run_counters = {} + + # Step 3: grandchild transfers back to child + child_ctx2 = MagicMock() + child_ctx2.node_path = 'root@1/child@2' + child_ctx2.node = child + child_ctx2.parent_ctx = root_ctx + child_ctx2.actions = EventActions(transfer_to_agent='root') + child_ctx2.error = None + child_ctx2.interrupt_ids = set() + child_ctx2._invocation_context = ic + child_ctx2._child_run_counters = {} + + # Step 4: child transfers back to root + ctx._child_run_counters = {'root': 1} + root_ctx2 = MagicMock() + root_ctx2.node_path = 'root@2' + root_ctx2.node = root + root_ctx2.parent_ctx = ctx + root_ctx2.actions = EventActions() + root_ctx2.error = None + root_ctx2.interrupt_ids = set() + root_ctx2._invocation_context = ic + root_ctx2._child_run_counters = {} + + scheduler._run_node_internal = AsyncMock( + side_effect=[child_ctx1, grandchild_ctx1, child_ctx2, root_ctx2] + ) + + # Act + final_ctx = await scheduler( + root_ctx, + child, + 'input', + node_name='child', + run_id='1', + ) + + # Assert + assert final_ctx is root_ctx2 + calls = scheduler._run_node_internal.call_args_list + assert len(calls) == 4 + + # 1st call: child (scheduled by root) + args1, kwargs1 = calls[0] + assert args1[0] is root_ctx + assert args1[1] is child + assert args1[2] == 'child' + assert args1[4] == '1' + + # 2nd call: grandchild (transferred CHILD from child) + args2, kwargs2 = calls[1] + assert args2[0] is child_ctx1 + assert args2[1] is grandchild + assert args2[2] == 'grandchild' + assert args2[4] == '1' + + # 3rd call: child (transferred PARENT from grandchild) + args3, kwargs3 = calls[2] + assert args3[0] is root_ctx + assert args3[1] is child + assert args3[2] == 'child' + assert args3[4] == '2' + + # 4th call: root (transferred PARENT from child) + args4, kwargs4 = calls[3] + assert args4[0] is ctx + assert args4[1] is root + assert args4[2] == 'root' + assert args4[4] == '2' + + +# ========================================================================= +# Replay Sequence Ordering preservation for Dynamic Nodes +# ========================================================================= + + +@pytest.mark.asyncio +async def test_dynamic_node_replay_ordering_preserved( + request: pytest.FixtureRequest, +): + """Test that parallel dynamic nodes maintain their chronological completion order during replay.""" + import asyncio + + from google.adk.events.request_input import RequestInput + from google.adk.workflow import node + from google.adk.workflow import START + from google.adk.workflow._workflow import Workflow + from google.genai import types + + from .. import testing_utils + + execution_order = [] + recorded_winner_vals = [] + + @node + async def source_a(*, ctx, node_input): + await asyncio.sleep(0.1) + execution_order.append('source_a_executed') + yield 'result_a' + + @node + async def source_b(*, ctx, node_input): + # No sleep, completes immediately in Run 1 + execution_order.append('source_b_executed') + yield 'result_b' + + @node(rerun_on_resume=True) + async def hitl_node(*, ctx, node_input): + if 'req_h' not in ctx.resume_inputs: + yield RequestInput(interrupt_id='req_h', message='input h') + return + execution_order.append(f'hitl_resumed_with_{node_input}') + yield f'h_{node_input}' + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + completed_order = [] + + async def run_and_record(node_func, run_id): + res = await ctx.run_node(node_func, run_id=run_id) + completed_order.append(res) + return res + + task_a = asyncio.create_task(run_and_record(source_a, 'a')) + task_b = asyncio.create_task(run_and_record(source_b, 'b')) + + await asyncio.wait([task_a, task_b], return_when=asyncio.ALL_COMPLETED) + + winner_val = completed_order[0] + recorded_winner_vals.append(winner_val) + + await ctx.run_node(hitl_node, node_input=winner_val, run_id='h') + + wf_name = request.node.name.replace('[', '_').replace(']', '') + agent = Workflow(name=wf_name, edges=[(START, parent)]) + runner = testing_utils.InMemoryRunner(node=agent) + + # Run 1: source_b finishes first, source_a finishes second. hitl_node interrupts. + events1 = await runner.run_async(testing_utils.get_user_content('start')) + + req_events = [e for e in events1 if e.long_running_tool_ids] + assert len(req_events) == 1 + assert execution_order == ['source_b_executed', 'source_a_executed'] + + invocation_id = events1[0].invocation_id + + # Clear execution order to track replay/resume behavior accurately + execution_order.clear() + recorded_winner_vals.clear() + + # Run 2: Resume with response + resume_payload = types.Content( + role='user', + parts=[ + types.Part( + function_response=types.FunctionResponse( # type: ignore[call-arg] # Third-party SDK signature + id='req_h', + name='user_input', + response={'text': 'response_h'}, + ) + ), + ], + ) + + await runner.run_async( + new_message=resume_payload, invocation_id=invocation_id + ) + + # Assert source_a and source_b were replayed from cache in exact historical order, + # ensuring winner_val correctly resolves to 'result_b' without re-execution. + assert recorded_winner_vals == ['result_b'] diff --git a/tests/unittests/workflow/test_dynamic_use_as_output.py b/tests/unittests/workflow/test_dynamic_use_as_output.py new file mode 100644 index 0000000000..a609030ba6 --- /dev/null +++ b/tests/unittests/workflow/test_dynamic_use_as_output.py @@ -0,0 +1,588 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for ctx.run_node(use_as_output=True) dynamic terminal paths.""" + +from __future__ import annotations + +import asyncio +from typing import Any +from typing import AsyncGenerator + +from google.adk.agents.context import Context +from google.adk.apps.app import App +from google.adk.apps.app import ResumabilityConfig +from google.adk.events.event import Event +from google.adk.events.request_input import RequestInput +from google.adk.workflow import BaseNode +from google.adk.workflow import FunctionNode +from google.adk.workflow import node +from google.adk.workflow import START +from google.adk.workflow._workflow import Workflow +from google.genai import types +from pydantic import ConfigDict +import pytest +from typing_extensions import override + +from .. import testing_utils +from .workflow_testing_utils import get_outputs as _get_outputs + + +def _make_app(name: str, agent: Workflow, resumable: bool) -> App: + return App( + name=name, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + + +# --------------------------------------------------------------------------- + +# FunctionNode delegates to FunctionNode +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize('resumable', [True, False]) +@pytest.mark.asyncio +async def test_use_as_output_function_to_function( + request: pytest.FixtureRequest, resumable: bool +): + """Node A delegates output to dynamic child B via use_as_output=True. + + Only B's output event should appear; A should not emit a duplicate. + """ + + def func_b() -> str: + return 'from_b' + + node_b = FunctionNode(func=func_b) + + async def func_a(ctx: Context) -> str: + return await ctx.run_node(node_b, use_as_output=True) + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + wf_name = request.node.name.replace('[', '_').replace(']', '') + agent = Workflow(name=wf_name, edges=[(START, node_a)]) + app = _make_app(wf_name, agent, resumable) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + # Only one output event (from B). A's output is suppressed. + outputs = _get_outputs(events) + assert outputs == ['from_b'] + + +# --------------------------------------------------------------------------- +# FunctionNode delegates to Workflow +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize('resumable', [True, False]) +@pytest.mark.asyncio +async def test_use_as_output_function_to_workflow( + request: pytest.FixtureRequest, resumable: bool +): + """Node A delegates output to a Workflow B via use_as_output=True. + + The Workflow's terminal node output should be used as A's output. + """ + + def step_1() -> str: + return 'step_1_done' + + def step_2(node_input: str) -> str: + return f'final:{node_input}' + + inner_wf = Workflow( + name='inner_wf', + edges=[ + (START, step_1), + (step_1, step_2), + ], + ) + + async def func_a(ctx: Context): + return await ctx.run_node(inner_wf, use_as_output=True) + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + wf_name = request.node.name.replace('[', '_').replace(']', '') + agent = Workflow(name=wf_name, edges=[(START, node_a)]) + app = _make_app(wf_name, agent, resumable) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + # step_2 is the terminal node; its output is func_a's output. + # step_1's output is intermediate (not terminal), so only step_2 appears. + outputs = _get_outputs(events) + assert 'final:step_1_done' in outputs + # func_a should NOT have a duplicate output event. + assert outputs.count('final:step_1_done') == 1 + + +# --------------------------------------------------------------------------- +# Custom BaseNode delegates to FunctionNode +# --------------------------------------------------------------------------- + + +class _DelegatingNode(BaseNode): + """A custom BaseNode that delegates output via use_as_output.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + delegate: BaseNode + + @override + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + await ctx.run_node(self.delegate, use_as_output=True) + # Intentionally yield nothing — output comes from delegate. + return + yield # Make this an async generator + + +@pytest.mark.parametrize('resumable', [True, False]) +@pytest.mark.asyncio +async def test_use_as_output_custom_node_to_function( + request: pytest.FixtureRequest, resumable: bool +): + """Custom BaseNode delegates output to dynamic child via use_as_output.""" + + def func_b() -> str: + return 'delegated_output' + + node_b = FunctionNode(func=func_b) + node_a = _DelegatingNode( + name='delegator', delegate=node_b, rerun_on_resume=True + ) + + wf_name = request.node.name.replace('[', '_').replace(']', '') + agent = Workflow(name=wf_name, edges=[(START, node_a)]) + app = _make_app(wf_name, agent, resumable) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + outputs = _get_outputs(events) + assert outputs == ['delegated_output'] + + +# --------------------------------------------------------------------------- +# Multiple use_as_output=True calls (fan-out delegation) +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize('resumable', [True, False]) +@pytest.mark.asyncio +async def test_use_as_output_multiple_disallowed( + request: pytest.FixtureRequest, resumable: bool +): + """V2 engine forbids calling use_as_output=True multiple times from the same node.""" + + def func_b() -> str: + return 'from_b' + + def func_c() -> str: + return 'from_c' + + node_b = FunctionNode(func=func_b) + node_c = FunctionNode(func=func_c) + + async def func_a(ctx: Context): + await ctx.run_node(node_b, use_as_output=True) + # V2 engine should throw ValueError on second call + with pytest.raises( + ValueError, match='already has a use_as_output delegate' + ): + await ctx.run_node(node_c, use_as_output=True) + return 'failure_as_expected' + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + wf_name = request.node.name.replace('[', '_').replace(']', '') + agent = Workflow(name=wf_name, edges=[(START, node_a)]) + app = _make_app(wf_name, agent, resumable) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + outputs = _get_outputs(events) + # func_a's output is suppressed because it successfully delegated to func_b + # before failing on func_c. So only func_b's output appears. + assert outputs == ['from_b'] + + +# --------------------------------------------------------------------------- +# Nested dynamic delegation (A → B → C, all use_as_output=True) +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize('resumable', [True, False]) +@pytest.mark.asyncio +async def test_use_as_output_nested_delegation( + request: pytest.FixtureRequest, resumable: bool +): + """Chained delegation: A delegates to B, B delegates to C. + + Only C's output should appear; both A's and B's outputs are suppressed. + """ + + def func_c() -> str: + return 'from_c' + + node_c = FunctionNode(func=func_c) + + async def func_b(ctx: Context) -> str: + return await ctx.run_node(node_c, use_as_output=True) + + node_b = FunctionNode(func=func_b, rerun_on_resume=True) + + async def func_a(ctx: Context) -> str: + return await ctx.run_node(node_b, use_as_output=True) + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + wf_name = request.node.name.replace('[', '_').replace(']', '') + agent = Workflow(name=wf_name, edges=[(START, node_a)]) + app = _make_app(wf_name, agent, resumable) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + outputs = _get_outputs(events) + assert outputs == ['from_c'] + + +@pytest.mark.parametrize('resumable', [True, False]) +@pytest.mark.asyncio +async def test_use_as_output_nested_delegation_with_downstream( + request: pytest.FixtureRequest, resumable: bool +): + """Chained delegation with a downstream node that consumes the output. + + A delegates to B, B delegates to C. D is downstream of A and should + receive C's output as its node_input. + """ + + def func_c() -> str: + return 'from_c' + + node_c = FunctionNode(func=func_c) + + async def func_b(ctx: Context) -> str: + return await ctx.run_node(node_c, use_as_output=True) + + node_b = FunctionNode(func=func_b, rerun_on_resume=True) + + async def func_a(ctx: Context) -> str: + return await ctx.run_node(node_b, use_as_output=True) + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + def func_d(node_input: str) -> str: + return f'received:{node_input}' + + wf_name = request.node.name.replace('[', '_').replace(']', '') + agent = Workflow( + name=wf_name, + edges=[(START, node_a), (node_a, func_d)], + ) + app = _make_app(wf_name, agent, resumable) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + outputs = _get_outputs(events) + assert 'received:from_c' in outputs + + +# --------------------------------------------------------------------------- +# use_as_output=False (default) still emits both events +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize('resumable', [True, False]) +@pytest.mark.asyncio +async def test_without_use_as_output_emits_both( + request: pytest.FixtureRequest, resumable: bool +): + """Without use_as_output, both parent and child emit output events.""" + + def func_b() -> str: + return 'from_b' + + node_b = FunctionNode(func=func_b) + + async def func_a(ctx: Context) -> str: + return await ctx.run_node(node_b) + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + wf_name = request.node.name.replace('[', '_').replace(']', '') + agent = Workflow(name=wf_name, edges=[(START, node_a)]) + app = _make_app(wf_name, agent, resumable) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + # Both B and A emit output events (no dedup). + outputs = _get_outputs(events) + assert outputs == ['from_b', 'from_b'] + + +# --------------------------------------------------------------------------- +# use_as_output with Workflow containing HITL +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_use_as_output_workflow_with_hitl( + request: pytest.FixtureRequest, +): + """Dynamic Workflow child with HITL node pauses and resumes correctly. + + Requires resumable=True because the inner Workflow's internal node state + (hitl_step in WAITING) must be persisted across invocations. Without + resumability, re-spawning the dynamic Workflow starts its graph fresh. + + Flow: + 1. func_a calls ctx.run_node(inner_wf, use_as_output=True) + 2. inner_wf's hitl_step yields RequestInput → workflow pauses + 3. User responds → workflow resumes + 4. inner_wf completes, func_a re-runs with cached result + 5. Only inner_wf's terminal node output appears + """ + resumable = True + + async def hitl_step(): + yield RequestInput( + interrupt_id='wf_req1', + message='enter value', + ) + + def final_step(node_input: Any) -> str: + text = node_input['text'] if isinstance(node_input, dict) else node_input + return f'final:{text}' + + inner_wf = Workflow( + name='inner_wf', + edges=[ + (START, hitl_step), + (hitl_step, final_step), + ], + ) + + async def func_a(ctx: Context): + return await ctx.run_node(inner_wf, use_as_output=True) + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + wf_name = request.node.name.replace('[', '_').replace(']', '') + agent = Workflow(name=wf_name, edges=[(START, node_a)]) + app = _make_app(wf_name, agent, resumable) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: Should pause at hitl_step. + events1 = await runner.run_async(testing_utils.get_user_content('start')) + outputs1 = _get_outputs(events1) + assert outputs1 == [] + + # Resume with user response. + invocation_id = events1[0].invocation_id + resume_payload = testing_utils.UserContent( + types.Part( + function_response=types.FunctionResponse( + id='wf_req1', + name='user_input', + response={'text': 'hello'}, + ) + ) + ) + events2 = await runner.run_async( + new_message=resume_payload, invocation_id=invocation_id + ) + + outputs2 = _get_outputs(events2) + assert 'final:hello' in outputs2 + assert outputs2.count('final:hello') == 1 + + +@pytest.mark.asyncio +async def test_use_as_output_static_node_not_rerun_on_resume( + request: pytest.FixtureRequest, +): + """Static node delegating output to dynamic child is not re-run on resume. + + Setup: + - wf with node_a (FunctionNode) and hitl_step. + - node_a calls ctx.run_node(node_b, use_as_output=True). + - hitl_step yields RequestInput to pause. + Act: + - Run 1: Run workflow, node_a executes, hitl_step pauses. + - Run 2: Resume with user response for hitl_step. + Assert: + - Run 1: node_b output is emitted as node_a's output. + - Run 2: node_a is NOT re-run (run_count remains 1). + """ + + run_count = 0 + + @node + def node_b() -> str: + return 'from_b' + + @node(rerun_on_resume=True) + async def node_a(ctx: Context): + nonlocal run_count + run_count += 1 + return await ctx.run_node(node_b, use_as_output=True) + + node_a.wait_for_output = True + + @node + async def hitl_step(): + yield RequestInput( + interrupt_id='pause_req', + message='pause', + ) + + @node + def final_step(node_input: Any) -> None: + return None + + wf_name = request.node.name.replace('[', '_').replace(']', '') + agent = Workflow( + name=wf_name, + edges=[ + (START, node_a), + (START, hitl_step), + (hitl_step, final_step), + ], + ) + + runner = testing_utils.InMemoryRunner(root_agent=agent) + + events1 = await runner.run_async(testing_utils.get_user_content('start')) + + assert run_count == 1 + outputs1 = [e.output for e in events1 if e.output] + assert 'from_b' in outputs1 + + invocation_id = events1[0].invocation_id + resume_payload = testing_utils.UserContent( + types.Part( + function_response=types.FunctionResponse( + id='pause_req', + name='user_input', + response={'text': 'continue'}, + ) + ) + ) + + events2 = await runner.run_async( + new_message=resume_payload, invocation_id=invocation_id + ) + + assert run_count == 1 + + +@pytest.mark.asyncio +async def test_use_as_output_instance_isolation(request: pytest.FixtureRequest): + """Output delegation is isolated to specific dynamic instances. + + Setup: + - wf with node_a calling node_b twice in parallel with different run_ids ('b1', 'b2'). + - node_b yields RequestInput to pause. + Act: + - Run 1: Run workflow, both node_b instances pause. + - Run 2: Resume only the 'b1' instance. + Assert: + - Run 1: Both instances run (run_count_b is 2). + - Run 2: Only instance 'b1' completes and delegates output. + Instance 'b2' remains paused and does not emit output. + """ + run_count_b = 0 + + @node + def node_c() -> str: + return 'from_c' + + @node(rerun_on_resume=True) + async def node_b(ctx: Context): + nonlocal run_count_b + + interrupt_id = f'pause_{ctx.node_path}' + if ctx.resume_inputs and interrupt_id in ctx.resume_inputs: + response = ctx.resume_inputs[interrupt_id] + if ( + response + and isinstance(response, dict) + and response.get('text') == 'continue' + ): + await ctx.run_node(node_c, use_as_output=True) + return + + run_count_b += 1 + yield RequestInput( + interrupt_id=interrupt_id, + message='pause', + ) + + @node(rerun_on_resume=True) + async def node_a(ctx: Context): + task1 = ctx.run_node(node_b, run_id='b1') + task2 = ctx.run_node(node_b, run_id='b2') + await asyncio.gather(task1, task2) + + wf_name = request.node.name.replace('[', '_').replace(']', '') + agent = Workflow(name=wf_name, edges=[(START, node_a)]) + + runner = testing_utils.InMemoryRunner(root_agent=agent) + + # Given the workflow is started with parallel instances of node_b + events1 = await runner.run_async(testing_utils.get_user_content('start')) + + # Then both instances execute and pause + assert run_count_b == 2 + + # Find the interrupt ID for instance b1 + interrupt_id_b1 = None + for event in events1: + if event.long_running_tool_ids: + for interrupt_id in event.long_running_tool_ids: + if 'b1' in interrupt_id: + interrupt_id_b1 = interrupt_id + break + + assert interrupt_id_b1 is not None + + # When resuming only instance b1 + invocation_id = events1[0].invocation_id + resume_payload = testing_utils.UserContent( + types.Part( + function_response=types.FunctionResponse( + id=interrupt_id_b1, + name='user_input', + response={'text': 'continue'}, + ) + ) + ) + + events2 = await runner.run_async( + new_message=resume_payload, invocation_id=invocation_id + ) + + # Then node_b is not re-run, and only one output is emitted from node_c + assert run_count_b == 2 + + outputs2 = [e.output for e in events2 if e.output] + assert outputs2.count('from_c') == 1 diff --git a/tests/unittests/workflow/test_function_node.py b/tests/unittests/workflow/test_function_node.py new file mode 100644 index 0000000000..60d4407e61 --- /dev/null +++ b/tests/unittests/workflow/test_function_node.py @@ -0,0 +1,1738 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Testings for the FunctionNode.""" + +import copy +from typing import Any +from typing import AsyncGenerator +from typing import Generator +from typing import Optional +from typing import Union +from unittest import mock + +from google.adk.agents.context import Context +from google.adk.apps.app import App +from google.adk.apps.app import ResumabilityConfig +from google.adk.events._node_path_builder import _NodePathBuilder +from google.adk.events.event import Event +from google.adk.events.event import Event as AdkEvent +from google.adk.events.request_input import RequestInput +from google.adk.runners import Runner +from google.adk.sessions import InMemorySessionService +from google.adk.workflow import FunctionNode +from google.adk.workflow import START +from google.adk.workflow._node_status import NodeStatus +from google.adk.workflow._workflow import Workflow +from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_response +from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids +from google.genai import types +from pydantic import BaseModel +import pytest + +from .. import testing_utils +from .workflow_testing_utils import create_parent_invocation_context +from .workflow_testing_utils import get_output_events +from .workflow_testing_utils import get_request_input_events +from .workflow_testing_utils import simplify_events_with_node +from .workflow_testing_utils import simplify_events_with_node_and_agent_state + +ANY = mock.ANY + +from .workflow_testing_utils import run_workflow + + +@pytest.mark.asyncio +async def test_various_function_nodes(request: pytest.FixtureRequest): + """Tests that Workflow can run with various function nodes.""" + + async def async_gen_func(ctx: Context) -> AsyncGenerator[Any, None]: + yield Event( + output='Hello from AsyncGen', + ) + + def sync_func_out(ctx: Context) -> str: + return 'Hello from SyncFunc' + + async def async_func_out(ctx: Context) -> str: + return 'Hello from AsyncFunc' + + def sync_func_no_out(ctx: Context) -> None: + return None + + async def async_func_no_out(ctx: Context) -> None: + return None + + def sync_gen_func( + ctx: Context, + ) -> Generator[Any, None, None]: + yield Event( + output='Hello from SyncGen', + ) + + async def async_gen_func_raw_output( + ctx: Context, + ) -> AsyncGenerator[Any, None]: + yield 'Hello from AsyncGenRawOutput' + + def sync_gen_func_raw_output( + ctx: Context, + ) -> Generator[Any, None, None]: + yield 'Hello from SyncGenRawOutput' + + agent = Workflow( + name='test_workflow_agent_various_function_nodes', + edges=[ + (START, async_gen_func), + (async_gen_func, sync_func_out), + (sync_func_out, async_func_out), + (async_func_out, sync_func_no_out), + (sync_func_no_out, async_func_no_out), + (async_func_no_out, sync_gen_func), + (sync_gen_func, async_gen_func_raw_output), + (async_gen_func_raw_output, sync_gen_func_raw_output), + ], + ) + app_instance = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app_instance) + events = await runner.run_async(testing_utils.get_user_content('start')) + + # Functions with no output (sync_func_no_out, async_func_no_out) + # will not produce events. + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_various_function_nodes@1/async_gen_func@1', + {'output': 'Hello from AsyncGen'}, + ), + ( + 'test_workflow_agent_various_function_nodes@1/sync_func_out@1', + {'output': 'Hello from SyncFunc'}, + ), + ( + 'test_workflow_agent_various_function_nodes@1/async_func_out@1', + {'output': 'Hello from AsyncFunc'}, + ), + ( + 'test_workflow_agent_various_function_nodes@1/sync_gen_func@1', + {'output': 'Hello from SyncGen'}, + ), + ( + 'test_workflow_agent_various_function_nodes@1/async_gen_func_raw_output@1', + { + 'output': 'Hello from AsyncGenRawOutput', + }, + ), + ( + 'test_workflow_agent_various_function_nodes@1/sync_gen_func_raw_output@1', + { + 'output': 'Hello from SyncGenRawOutput', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_function_node_state_injection(request: pytest.FixtureRequest): + """Tests that FunctionNode can inject parameters from workflow state.""" + + async def set_state_node_fn( + ctx: Context, + ) -> AsyncGenerator[Any, None]: + yield Event( + state={'param1': 'value1'}, + ) + + def check_state_node_fn(param1: str, param2: str = 'default2') -> str: + return f'param1={param1}, param2={param2}' + + agent = Workflow( + name='test_workflow_agent_state_injection', + edges=[ + (START, set_state_node_fn), + (set_state_node_fn, check_state_node_fn), + ], + ) + events, _, _ = await run_workflow(agent) + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_state_injection@1/check_state_node_fn@1', + { + 'output': 'param1=value1, param2=default2', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_function_node_state_injection_missing_param( + request: pytest.FixtureRequest, +): + """Tests that FunctionNode raises error for missing param.""" + + def check_state_node_fn(param1: str) -> str: + return f'param1={param1}' + + agent = Workflow( + name='test_workflow_agent_state_injection_missing', + edges=[ + (START, check_state_node_fn), + ], + ) + with pytest.raises(ValueError, match='Missing value for parameter "param1"'): + await run_workflow(agent) + + +@pytest.mark.asyncio +async def test_function_node_type_checking( + request: pytest.FixtureRequest, +): + """Tests that FunctionNode performs type checking.""" + + async def set_state_node_fn( + ctx: Context, + ) -> AsyncGenerator[Any, None]: + yield Event( + state={'p1': 'a string'}, + ) + + def check_type_node_fn(p1: int) -> str: + return f'p1={p1}' + + agent = Workflow( + name='test_type_checking', + edges=[ + (START, set_state_node_fn), + (set_state_node_fn, check_type_node_fn), + ], + ) + with pytest.raises(ValueError): + await run_workflow(agent) + + +@pytest.mark.asyncio +async def test_function_node_input_injection(request: pytest.FixtureRequest): + """Tests that FunctionNode can inject parameters from node_input.""" + + def node1_fn() -> dict[str, Any]: + return {'p1': 'value1_from_node_input', 'p2': 100} + + def node2_fn(node_input: dict[str, Any]) -> str: + return f"p1={node_input['p1']}, p2={node_input['p2']}" + + agent = Workflow( + name='test_workflow_agent_input_injection_dict', + edges=[ + (START, node1_fn), + (node1_fn, node2_fn), + ], + ) + events, _, _ = await run_workflow(agent) + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_input_injection_dict@1/node1_fn@1', + { + 'output': {'p1': 'value1_from_node_input', 'p2': 100}, + }, + ), + ( + 'test_workflow_agent_input_injection_dict@1/node2_fn@1', + { + 'output': 'p1=value1_from_node_input, p2=100', + }, + ), + ] + + +class MyModel(BaseModel): + p1: str + p2: int + + +@pytest.mark.asyncio +async def test_function_node_input_injection_pydantic( + request: pytest.FixtureRequest, +): + """Tests that FunctionNode can inject dict as pydantic model into node_input.""" + + def node1_fn() -> dict[str, Any]: + return {'p1': 'value1_from_node_input', 'p2': 100} + + def node2_fn(node_input: MyModel) -> str: + return f'p1={node_input.p1}, p2={node_input.p2}' + + agent = Workflow( + name='test_workflow_agent_input_injection_pydantic', + edges=[ + (START, node1_fn), + (node1_fn, node2_fn), + ], + ) + events, _, _ = await run_workflow(agent) + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_input_injection_pydantic@1/node1_fn@1', + { + 'output': {'p1': 'value1_from_node_input', 'p2': 100}, + }, + ), + ( + 'test_workflow_agent_input_injection_pydantic@1/node2_fn@1', + { + 'output': 'p1=value1_from_node_input, p2=100', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_function_node_input_list_wrong_type( + request: pytest.FixtureRequest, +): + """Tests that FunctionNode raises TypeError for list[T] with non-list input.""" + + def node1_fn() -> int: + return 123 + + def node2_fn(node_input: list[MyModel]) -> str: + return f'p1={node_input[0].p1}' + + agent = Workflow( + name='test_workflow_agent_input_list_wrong_type', + edges=[ + (START, node1_fn), + (node1_fn, node2_fn), + ], + ) + with pytest.raises(ValueError): + await run_workflow(agent) + + +@pytest.mark.asyncio +async def test_function_node_input_list_no_item_type( + request: pytest.FixtureRequest, +): + """Tests that FunctionNode handles list without item type.""" + + def node1_fn() -> list[int]: + return [1, 2] + + def node2_fn(node_input: list) -> str: + return f'list={node_input}' + + agent = Workflow( + name='test_workflow_agent_input_list_no_item_type', + edges=[ + (START, node1_fn), + (node1_fn, node2_fn), + ], + ) + events, _, _ = await run_workflow(agent) + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_input_list_no_item_type@1/node1_fn@1', + { + 'output': [1, 2], + }, + ), + ( + 'test_workflow_agent_input_list_no_item_type@1/node2_fn@1', + { + 'output': 'list=[1, 2]', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_function_node_input_and_state_injection( + request: pytest.FixtureRequest, +): + """Tests parameter injection from node_input and state.""" + + async def nodea_fn(ctx: Context) -> AsyncGenerator[Any, None]: + yield Event( + state={'p_state': 'value_from_state'}, + ) + yield 'value_A' + + def nodeb_fn( + node_input: str, p_state: str, p_default: str = 'default2' + ) -> str: + return f'node_input={node_input}, p_state={p_state}, p_default={p_default}' + + agent = Workflow( + name='test_node_param_injection_single_and_state', + edges=[ + (START, nodea_fn), + (nodea_fn, nodeb_fn), + ], + ) + events, _, _ = await run_workflow(agent) + assert simplify_events_with_node(events) == [ + ( + 'test_node_param_injection_single_and_state@1/nodea_fn@1', + {'output': 'value_A'}, + ), + ( + 'test_node_param_injection_single_and_state@1/nodeb_fn@1', + { + 'output': ( + 'node_input=value_A, p_state=value_from_state,' + ' p_default=default2' + ), + }, + ), + ] + + +@pytest.mark.asyncio +async def test_function_node_state_injection_pydantic( + request: pytest.FixtureRequest, +): + """Tests that FunctionNode can inject dict from state as pydantic model.""" + + async def node1_fn(ctx: Context) -> AsyncGenerator[Any, None]: + yield Event( + state={'my_model': {'p1': 'value1_from_state', 'p2': 200}}, + ) + + def node2_fn(my_model: MyModel) -> str: + return f'p1={my_model.p1}, p2={my_model.p2}' + + agent = Workflow( + name='test_workflow_agent_state_injection_pydantic', + edges=[ + (START, node1_fn), + (node1_fn, node2_fn), + ], + ) + events, _, _ = await run_workflow(agent) + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_state_injection_pydantic@1/node2_fn@1', + { + 'output': 'p1=value1_from_state, p2=200', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_function_node_hitl(request: pytest.FixtureRequest): + """Tests that FunctionNode can trigger HITL. + + Setup: Workflow with request_input_fn -> process_input_fn. + request_input_fn yields RequestInput. + Act: + - Run 1: start workflow, request_input_fn yields RequestInput. + - Run 2: resume with user response. + Assert: + - Run 1: returns RequestInput event with valid ID. + - Run 2: process_input_fn receives input and completes. + """ + + # Given: A workflow where the first node requests input + def request_input_fn() -> Generator[Any, None, None]: + yield RequestInput(message='Provide input') + + def process_input_fn(node_input: dict[str, Any]) -> str: + return f"received: {node_input['text']}" + + agent = Workflow( + name='test_workflow_agent_hitl', + edges=[ + (START, request_input_fn), + (request_input_fn, process_input_fn), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When: Starting the workflow + user_event = testing_utils.get_user_content('start workflow') + events1 = await runner.run_async(user_event) + + # Then: It should yield a RequestInput event with a valid ID + req_events = get_request_input_events(events1) + assert len(req_events) == 1 + interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] + invocation_id = events1[0].invocation_id + + # Verify that the FunctionCall object actually has the id set + assert req_events[0].content.parts[0].function_call.id == interrupt_id + + # When: Resuming with user response + user_input = create_request_input_response( + interrupt_id, {'text': 'Hello from user'} + ) + events2 = await runner.run_async( + new_message=testing_utils.UserContent(user_input), + invocation_id=invocation_id, + ) + + # Then: It should complete and pass output to the next node + data_events = get_output_events(events2, output='received: Hello from user') + assert len(data_events) == 1 + + +@pytest.mark.asyncio +async def test_function_node_adk_events(request: pytest.FixtureRequest): + """Tests that FunctionNode can emit ADK events.""" + + def adk_events_fn() -> Generator[Any, None, None]: + yield AdkEvent( + author='some_agent', content=types.Content(parts=[{'text': 'event 1'}]) + ) + yield AdkEvent( + author='some_agent', content=types.Content(parts=[{'text': 'event 2'}]) + ) + + agent = Workflow( + name='test_workflow_agent_adk_events', + edges=[ + (START, adk_events_fn), + ], + ) + events, _, _ = await run_workflow(agent) + + assert len(events) == 2 + assert isinstance(events[0], AdkEvent) + assert events[0].content.parts[0].text == 'event 1' + assert isinstance(events[1], AdkEvent) + assert events[1].content.parts[0].text == 'event 2' + + +@pytest.mark.asyncio +async def test_function_node_list_conversion_pydantic( + request: pytest.FixtureRequest, +): + """Tests that FunctionNode correctly converts list[dict] to list[BaseModel].""" + + class Section(BaseModel): + section_name: str + content: str + + async def upstream_func(ctx: Context) -> list[dict[str, str]]: + return [ + {'section_name': 's1', 'content': 'c1'}, + {'section_name': 's2', 'content': 'c2'}, + ] + + received_input = None + + async def aggregate(node_input: list[Section]) -> str: + nonlocal received_input + received_input = node_input + return 'Done' + + agent = Workflow( + name='test_function_node_list_conversion_pydantic', + edges=[ + (START, upstream_func), + (upstream_func, aggregate), + ], + ) + unused_events, _, _ = await run_workflow(agent) + + # Check if received_input contains Section objects + assert isinstance(received_input, list) + assert len(received_input) == 2 + assert isinstance(received_input[0], Section) + assert received_input[0].section_name == 's1' + + +@pytest.mark.asyncio +async def test_function_node_dict_conversion_pydantic( + request: pytest.FixtureRequest, +): + """Tests that FunctionNode correctly converts dict[str, dict] to dict[str, BaseModel].""" + + class Section(BaseModel): + section_name: str + content: str + + async def upstream_func(ctx: Context) -> dict[str, dict[str, str]]: + return { + 'one': {'section_name': 's1', 'content': 'c1'}, + 'two': {'section_name': 's2', 'content': 'c2'}, + } + + received_input = None + + async def aggregate(node_input: dict[str, Section]) -> str: + nonlocal received_input + received_input = node_input + return 'Done' + + agent = Workflow( + name='test_function_node_dict_conversion_pydantic', + edges=[ + (START, upstream_func), + (upstream_func, aggregate), + ], + ) + unused_events, _, _ = await run_workflow(agent) + + # Check if received_input contains Section objects + assert isinstance(received_input, dict) + assert len(received_input) == 2 + assert isinstance(received_input['one'], Section) + assert received_input['one'].section_name == 's1' + assert isinstance(received_input['two'], Section) + assert received_input['two'].content == 'c2' + + +@pytest.mark.asyncio +async def test_function_node_no_data_returns_none( + request: pytest.FixtureRequest, +): + """Tests that FunctionNode returns Event with output=None if function returns only control event.""" + + def func_no_data() -> Event: + return Event(route='some_route') + + agent = Workflow( + name='test_function_node_no_data_returns_none', + edges=[ + (START, func_no_data), + ], + ) + events, _, _ = await run_workflow(agent) + + assert len(events) == 1 + assert events[0].output is None + assert events[0].actions.route == 'some_route' + + +@pytest.mark.asyncio +async def test_function_node_yield_content( + request: pytest.FixtureRequest, +): + """Tests that yielding types.Content sets output=None and content=Content.""" + + def func_yield_content() -> Generator[Any, None, None]: + yield types.Content(parts=[types.Part(text='some content')]) + + agent = Workflow( + name='test_function_node_yield_content', + edges=[ + (START, func_yield_content), + ], + ) + events, _, _ = await run_workflow(agent) + + assert len(events) == 1 + assert events[0].output is None + assert events[0].content is not None + assert events[0].content.parts[0].text == 'some content' + + +@pytest.mark.asyncio +async def test_function_node_yield_event_with_content( + request: pytest.FixtureRequest, +): + """Tests that yielding Event(content=...) retains output=None and content=... .""" + + def func_yield_event_with_content() -> Generator[Any, None, None]: + yield Event(content=types.Content(parts=[types.Part(text='some content')])) + + agent = Workflow( + name='test_function_node_yield_event_with_content', + edges=[ + (START, func_yield_event_with_content), + ], + ) + events, _, _ = await run_workflow(agent) + + assert len(events) == 1 + assert events[0].output is None + assert events[0].content is not None + assert events[0].content.parts[0].text == 'some content' + + +@pytest.mark.asyncio +async def test_content_to_str_auto_conversion( + request: pytest.FixtureRequest, +): + """Tests that Content is auto-converted to str when function expects str.""" + received_inputs = [] + + def record_input(node_input: str) -> str: + received_inputs.append(node_input) + return f'Hello, {node_input}!' + + agent = Workflow( + name='test_content_to_str', + edges=[ + (START, record_input), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + user_event = testing_utils.get_user_content('start workflow') + await runner.run_async(user_event) + + assert len(received_inputs) == 1 + assert isinstance(received_inputs[0], str) + assert received_inputs[0] == 'start workflow' + + +@pytest.mark.asyncio +async def test_content_to_str_multi_part( + request: pytest.FixtureRequest, +): + """Tests Content with multiple text parts is concatenated.""" + received_inputs = [] + + def record_input(node_input: str) -> str: + received_inputs.append(node_input) + return node_input + + agent = Workflow( + name='test_content_to_str_multi_part', + edges=[ + (START, record_input), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + user_event = testing_utils.get_user_content( + types.Content( + parts=[ + types.Part(text='Hello '), + types.Part(text='World'), + ], + role='user', + ) + ) + await runner.run_async(user_event) + + assert len(received_inputs) == 1 + assert received_inputs[0] == 'Hello World' + + +@pytest.mark.asyncio +async def test_content_to_str_warns_on_non_text( + request: pytest.FixtureRequest, + caplog, +): + """Tests that non-text parts produce a warning during conversion.""" + import logging + + received_inputs = [] + + def record_input(node_input: str) -> str: + received_inputs.append(node_input) + return node_input + + agent = Workflow( + name='test_content_to_str_warns', + edges=[ + (START, record_input), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + user_event = testing_utils.get_user_content( + types.Content( + parts=[ + types.Part(text='Hello'), + types.Part( + inline_data=types.Blob(data=b'img', mime_type='image/png') + ), + ], + role='user', + ) + ) + with caplog.at_level(logging.WARNING): + await runner.run_async(user_event) + + assert len(received_inputs) == 1 + assert received_inputs[0] == 'Hello' + assert 'non-text parts' in caplog.text + + +def _produce_list(): + return [1, 2, 3] + + +def _produce_dict(): + return {'key': 'value'} + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'produce_value, expected', + [ + (_produce_list, [1, 2, 3]), + (_produce_dict, {'key': 'value'}), + ], + ids=['list', 'dict'], +) +async def test_union_type_accepts_matching_member( + request: pytest.FixtureRequest, + produce_value, + expected, +): + """Tests that Union type annotation accepts values matching any member.""" + received_inputs = [] + + def record_input(node_input: Union[list, dict]) -> str: + received_inputs.append(node_input) + return 'ok' + + agent = Workflow( + name='test_union_accept', + edges=[ + (START, produce_value), + (produce_value, record_input), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + await runner.run_async(testing_utils.get_user_content('go')) + + assert len(received_inputs) == 1 + assert received_inputs[0] == expected + + +@pytest.mark.asyncio +async def test_optional_str_with_content_auto_conversion( + request: pytest.FixtureRequest, +): + """Tests that Optional[str] auto-converts Content from START node.""" + received_inputs = [] + + def record_input(node_input: Optional[str]) -> str: + received_inputs.append(node_input) + return 'ok' + + agent = Workflow( + name='test_optional_content', + edges=[ + (START, record_input), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + await runner.run_async(testing_utils.get_user_content('hello')) + + assert len(received_inputs) == 1 + assert received_inputs[0] == 'hello' + + +@pytest.mark.asyncio +async def test_union_type_rejects_non_matching( + request: pytest.FixtureRequest, +): + """Tests that Union type annotation rejects values not matching any member.""" + + def bad_input(node_input: Union[str, int]) -> str: + return 'should not reach' + + def produce_list() -> list: + return [1, 2, 3] + + agent = Workflow( + name='test_union_reject', + edges=[ + (START, produce_list), + (produce_list, bad_input), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(ValueError): + await runner.run_async(testing_utils.get_user_content('go')) + + +@pytest.mark.asyncio +async def test_function_node_ctx_state_delta_sync( + request: pytest.FixtureRequest, +): + """Tests that state set via ctx.state in a sync function is persisted.""" + + def set_state_via_ctx(ctx: Context) -> str: + ctx.state['user_request'] = 'build a tracker app' + return 'done' + + def read_state(user_request: str) -> str: + return f'request={user_request}' + + agent = Workflow( + name='test_ctx_state_delta_sync', + edges=[ + (START, set_state_via_ctx), + (set_state_via_ctx, read_state), + ], + ) + events, _, _ = await run_workflow(agent) + simplified = simplify_events_with_node(events, include_state_delta=True) + assert simplified == [ + ( + 'test_ctx_state_delta_sync@1/set_state_via_ctx@1', + { + 'output': 'done', + 'state_delta': {'user_request': 'build a tracker app'}, + }, + ), + ( + 'test_ctx_state_delta_sync@1/read_state@1', + { + 'output': 'request=build a tracker app', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_function_node_ctx_state_delta_async( + request: pytest.FixtureRequest, +): + """Tests that state set via ctx.state in an async function is persisted.""" + + async def set_state_via_ctx(ctx: Context) -> str: + ctx.state['counter'] = 42 + ctx.state['name'] = 'test' + return 'set' + + def read_state(counter: int, name: str) -> str: + return f'counter={counter}, name={name}' + + agent = Workflow( + name='test_ctx_state_delta_async', + edges=[ + (START, set_state_via_ctx), + (set_state_via_ctx, read_state), + ], + ) + events, _, _ = await run_workflow(agent) + simplified = simplify_events_with_node(events, include_state_delta=True) + assert simplified == [ + ( + 'test_ctx_state_delta_async@1/set_state_via_ctx@1', + { + 'output': 'set', + 'state_delta': {'counter': 42, 'name': 'test'}, + }, + ), + ( + 'test_ctx_state_delta_async@1/read_state@1', + { + 'output': 'counter=42, name=test', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_function_node_ctx_state_delta_none_return( + request: pytest.FixtureRequest, +): + """Tests that state is persisted even when function returns None.""" + + def set_state_return_none(ctx: Context) -> None: + ctx.state['my_key'] = 'my_value' + + def read_state(my_key: str) -> str: + return f'my_key={my_key}' + + agent = Workflow( + name='test_ctx_state_delta_none_return', + edges=[ + (START, set_state_return_none), + (set_state_return_none, read_state), + ], + ) + events, _, _ = await run_workflow(agent) + simplified = simplify_events_with_node(events, include_state_delta=True) + assert simplified == [ + ( + 'test_ctx_state_delta_none_return@1/set_state_return_none@1', + { + 'state_delta': {'my_key': 'my_value'}, + 'output': None, + }, + ), + ( + 'test_ctx_state_delta_none_return@1/read_state@1', + { + 'output': 'my_key=my_value', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_function_node_ctx_state_delta_with_event_return( + request: pytest.FixtureRequest, +): + """Tests that ctx.state changes merge into a returned Event's state_delta.""" + + def set_state_return_event(ctx: Context) -> Event: + ctx.state['from_ctx'] = 'ctx_value' + return Event( + output='result', + state={'from_event': 'event_value'}, + ) + + def read_state(from_ctx: str, from_event: str) -> str: + return f'from_ctx={from_ctx}, from_event={from_event}' + + agent = Workflow( + name='test_ctx_state_delta_event_return', + edges=[ + (START, set_state_return_event), + (set_state_return_event, read_state), + ], + ) + events, _, _ = await run_workflow(agent) + simplified = simplify_events_with_node(events, include_state_delta=True) + assert simplified == [ + ( + 'test_ctx_state_delta_event_return@1/set_state_return_event@1', + { + 'output': 'result', + 'state_delta': { + 'from_event': 'event_value', + 'from_ctx': 'ctx_value', + }, + }, + ), + ( + 'test_ctx_state_delta_event_return@1/read_state@1', + { + 'output': 'from_ctx=ctx_value, from_event=event_value', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_function_node_ctx_state_delta_generator( + request: pytest.FixtureRequest, +): + """Tests that ctx.state changes are captured in generator yields.""" + + def gen_with_state(ctx: Context) -> Generator[Any, None, None]: + ctx.state['key1'] = 'value1' + yield Event(state={'key1': 'value1'}) + ctx.state['key2'] = 'value2' + yield 'done' + + def read_state(key1: str, key2: str) -> str: + return f'key1={key1}, key2={key2}' + + agent = Workflow( + name='test_ctx_state_delta_generator', + edges=[ + (START, gen_with_state), + (gen_with_state, read_state), + ], + ) + events, _, _ = await run_workflow(agent) + simplified = simplify_events_with_node(events, include_state_delta=True) + + # First yield is a state-only Event, second is the data output with + # accumulated state from both ctx.state assignments. + assert simplified == [ + ( + 'test_ctx_state_delta_generator@1/gen_with_state@1', + { + 'output': None, + 'state_delta': {'key1': 'value1'}, + }, + ), + ( + 'test_ctx_state_delta_generator@1/gen_with_state@1', + { + 'output': 'done', + 'state_delta': {'key2': 'value2'}, + }, + ), + ( + 'test_ctx_state_delta_generator@1/read_state@1', + { + 'output': 'key1=value1, key2=value2', + }, + ), + ] + + +# ── FunctionNode output_schema ────────────────────────────────────── + + +class _OutputModel(BaseModel): + name: str + value: int + + +class _OtherModel(BaseModel): + name: str + value: int + extra: str = 'default' + + +@pytest.mark.asyncio +async def test_output_schema_inferred_validates_dict( + request: pytest.FixtureRequest, +): + """Inferred output_schema validates dict return from BaseModel function.""" + + def produce() -> _OutputModel: + return {'name': 'test', 'value': 42} + + node = FunctionNode(func=produce) + assert node.output_schema is _OutputModel + + agent = Workflow(name='wf', edges=[(START, node)]) + events, _, _ = await run_workflow(agent) + + data_events = [ + e + for e in events + if isinstance(e, Event) + and e.output is not None + and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( + _NodePathBuilder.from_string('wf@1') + ) + ] + assert len(data_events) == 1 + assert data_events[0].output == {'name': 'test', 'value': 42} + + +@pytest.mark.asyncio +async def test_output_schema_inferred_rejects_invalid( + request: pytest.FixtureRequest, +): + """Inferred output_schema rejects invalid dict.""" + + def produce() -> _OutputModel: + return {'name': 'test'} # missing 'value' + + node = FunctionNode(func=produce) + agent = Workflow(name='wf', edges=[(START, node)]) + with pytest.raises(ValueError): + await run_workflow(agent) + + +@pytest.mark.asyncio +async def test_output_schema_inferred_rejects_wrong_type( + request: pytest.FixtureRequest, +): + """Inferred output_schema rejects non-dict, non-BaseModel return.""" + + def produce() -> _OutputModel: + return 'not a dict' + + node = FunctionNode(func=produce) + agent = Workflow(name='wf', edges=[(START, node)]) + with pytest.raises(ValueError): + await run_workflow(agent) + + +@pytest.mark.asyncio +async def test_output_schema_generator_rejects_invalid_item( + request: pytest.FixtureRequest, +): + """A generator that yields an invalid item mid-stream raises.""" + + def produce_items() -> Generator[_OutputModel, None, None]: + yield {'name': 'a', 'value': 1} + yield {'name': 'bad'} # missing 'value' + + node = FunctionNode(func=produce_items) + agent = Workflow(name='wf', edges=[(START, node)]) + with pytest.raises(ValueError): + await run_workflow(agent) + + +@pytest.mark.asyncio +async def test_output_schema_inferred_coerces_defaults( + request: pytest.FixtureRequest, +): + """Inferred output_schema fills in default fields.""" + + def produce() -> _OtherModel: + return {'name': 'test', 'value': 5} + + node = FunctionNode(func=produce) + assert node.output_schema is _OtherModel + + agent = Workflow(name='wf', edges=[(START, node)]) + events, _, _ = await run_workflow(agent) + + data_events = [ + e + for e in events + if isinstance(e, Event) + and e.output is not None + and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( + _NodePathBuilder.from_string('wf@1') + ) + ] + assert len(data_events) == 1 + assert data_events[0].output == { + 'name': 'test', + 'value': 5, + 'extra': 'default', + } + + +@pytest.mark.asyncio +async def test_output_schema_inferred_from_return_hint( + request: pytest.FixtureRequest, +): + """output_schema is auto-inferred from -> BaseModel return hint.""" + + def produce() -> _OutputModel: + return _OutputModel(name='inferred', value=1) + + node = FunctionNode(func=produce) + assert node.output_schema is _OutputModel + + agent = Workflow(name='wf', edges=[(START, node)]) + events, _, _ = await run_workflow(agent) + + data_events = [ + e + for e in events + if isinstance(e, Event) + and e.output is not None + and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( + _NodePathBuilder.from_string('wf@1') + ) + ] + assert len(data_events) == 1 + assert data_events[0].output == {'name': 'inferred', 'value': 1} + + +def test_output_schema_no_inference_for_non_basemodel(): + """Non-BaseModel return hints (str, dict, etc.) don't trigger inference.""" + + def produce() -> dict: + return {'any': 'thing'} + + node = FunctionNode(func=produce) + assert node.output_schema is None + + +@pytest.mark.asyncio +async def test_output_schema_inferred_type_coercion( + request: pytest.FixtureRequest, +): + """Pydantic coerces compatible types (str '123' -> int 123).""" + + def produce() -> _OutputModel: + return {'name': 'coerce', 'value': '42'} + + node = FunctionNode(func=produce) + agent = Workflow(name='wf', edges=[(START, node)]) + events, _, _ = await run_workflow(agent) + + data_events = [ + e + for e in events + if isinstance(e, Event) + and e.output is not None + and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( + _NodePathBuilder.from_string('wf@1') + ) + ] + assert len(data_events) == 1 + assert data_events[0].output == {'name': 'coerce', 'value': 42} + + +@pytest.mark.asyncio +async def test_output_schema_none_return(request: pytest.FixtureRequest): + """Returning None with inferred output_schema skips validation.""" + + def produce_none() -> _OutputModel: + return None + + node = FunctionNode(func=produce_none) + assert node.output_schema is _OutputModel + + def downstream(node_input: Any) -> str: + return f'got: {node_input}' + + agent = Workflow(name='wf', edges=[(START, node), (node, downstream)]) + events, _, _ = await run_workflow(agent) + + data_events = [ + e + for e in events + if isinstance(e, Event) + and e.output is not None + and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( + _NodePathBuilder.from_string('wf@1') + ) + ] + assert len(data_events) == 1 + assert data_events[0].output == 'got: None' + + +@pytest.mark.asyncio +async def test_output_schema_validates_returned_event_data( + request: pytest.FixtureRequest, +): + """When a function returns an Event with data, output_schema validates it.""" + + def produce() -> _OutputModel: + return Event(output={'name': 'evt', 'value': 7}) + + node = FunctionNode(func=produce) + assert node.output_schema is _OutputModel + + agent = Workflow(name='wf', edges=[(START, node)]) + events, _, _ = await run_workflow(agent) + + data_events = [ + e + for e in events + if isinstance(e, Event) + and e.output is not None + and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( + _NodePathBuilder.from_string('wf@1') + ) + ] + assert len(data_events) == 1 + assert data_events[0].output == {'name': 'evt', 'value': 7} + + +@pytest.mark.asyncio +async def test_output_schema_rejects_invalid_returned_event_data( + request: pytest.FixtureRequest, +): + """When a function returns an Event with invalid data, validation raises.""" + + def produce() -> _OutputModel: + return Event(output={'wrong_field': 'oops'}) + + node = FunctionNode(func=produce) + agent = Workflow(name='wf', edges=[(START, node)]) + with pytest.raises(ValueError): + await run_workflow(agent) + + +# ── FunctionNode input_schema ────────────────────────────────────── + + +@pytest.mark.asyncio +async def test_input_schema_validates_dict(request: pytest.FixtureRequest): + """Dict input is validated and coerced through inferred input_schema.""" + received = [] + + def process(node_input: _OutputModel) -> str: + received.append(node_input) + return 'ok' + + def produce() -> dict: + return {'name': 'test', 'value': 42} + + node = FunctionNode(func=process) + assert node.input_schema is _OutputModel + + agent = Workflow(name='wf', edges=[(START, produce), (produce, node)]) + await run_workflow(agent) + + # input_schema validates before FunctionNode converts dict -> BaseModel + assert received == [_OutputModel(name='test', value=42)] + + +@pytest.mark.asyncio +async def test_input_schema_rejects_invalid_dict( + request: pytest.FixtureRequest, +): + """Dict missing required fields raises validation error.""" + + def process(node_input: _OutputModel) -> str: + return 'should not reach' + + def produce() -> dict: + return {'name': 'test'} # missing 'value' + + node = FunctionNode(func=process) + agent = Workflow(name='wf', edges=[(START, produce), (produce, node)]) + with pytest.raises(ValueError): + await run_workflow(agent) + + +@pytest.mark.asyncio +async def test_input_schema_coerces_types(request: pytest.FixtureRequest): + """Pydantic coerces compatible types in input (str '5' -> int 5).""" + received = [] + + def process(node_input: _OutputModel) -> str: + received.append(node_input) + return 'ok' + + def produce() -> dict: + return {'name': 'test', 'value': '5'} + + node = FunctionNode(func=process) + agent = Workflow(name='wf', edges=[(START, produce), (produce, node)]) + await run_workflow(agent) + + assert received == [_OutputModel(name='test', value=5)] + + +@pytest.mark.asyncio +async def test_input_schema_fills_defaults(request: pytest.FixtureRequest): + """Inferred input_schema fills default fields.""" + received = [] + + def process(node_input: _OtherModel) -> str: + received.append(node_input) + return 'ok' + + def produce() -> dict: + return {'name': 'test', 'value': 1} + + node = FunctionNode(func=process) + assert node.input_schema is _OtherModel + + agent = Workflow(name='wf', edges=[(START, produce), (produce, node)]) + await run_workflow(agent) + + assert received == [_OtherModel(name='test', value=1, extra='default')] + + +def test_input_schema_no_inference_for_non_basemodel(): + """Non-BaseModel node_input hints don't trigger inference.""" + + def process(node_input: dict) -> str: + return 'ok' + + node = FunctionNode(func=process) + assert node.input_schema is None + + +@pytest.mark.asyncio +async def test_input_schema_none_passthrough(request: pytest.FixtureRequest): + """None input with input_schema skips validation.""" + + def produce_none() -> None: + return None + + def process(node_input: _OutputModel | None = None) -> str: + return f'got: {node_input}' + + node = FunctionNode(func=process) + agent = Workflow( + name='wf', edges=[(START, produce_none), (produce_none, node)] + ) + events, _, _ = await run_workflow(agent) + + data_events = [ + e + for e in events + if isinstance(e, Event) + and e.output is not None + and _NodePathBuilder.from_string(e.node_info.path).is_direct_child_of( + _NodePathBuilder.from_string('wf@1') + ) + ] + assert any(e.output == 'got: None' for e in data_events) + + +# --------------------------------------------------------------------------- +# auth_config tests +# --------------------------------------------------------------------------- + + +class TestAuthConfig: + """Tests for FunctionNode auth_config behavior.""" + + def test_raises_without_rerun_on_resume(self): + """auth_config raises ValueError when rerun_on_resume is not True.""" + from fastapi.openapi.models import APIKey + from fastapi.openapi.models import APIKeyIn + from google.adk.auth.auth_credential import AuthCredential + from google.adk.auth.auth_credential import AuthCredentialTypes + from google.adk.auth.auth_tool import AuthConfig + + auth_config = AuthConfig( + auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), + raw_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.API_KEY, + api_key='placeholder', + ), + credential_key='test_key', + ) + with pytest.raises(ValueError, match='rerun_on_resume=True'): + FunctionNode(func=lambda: None, name='n', auth_config=auth_config) + + def test_no_auth_config_default(self): + """auth_config defaults to None.""" + node = FunctionNode(func=lambda: None, name='n') + assert node.auth_config is None + + def test_rerun_on_resume_explicit_true_with_auth(self): + """Explicit rerun_on_resume=True with auth_config is fine.""" + from fastapi.openapi.models import APIKey + from fastapi.openapi.models import APIKeyIn + from google.adk.auth.auth_credential import AuthCredential + from google.adk.auth.auth_credential import AuthCredentialTypes + from google.adk.auth.auth_tool import AuthConfig + + auth_config = AuthConfig( + auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), + raw_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.API_KEY, + api_key='placeholder', + ), + credential_key='test_key', + ) + node = FunctionNode( + func=lambda: None, + name='n', + auth_config=auth_config, + rerun_on_resume=True, + ) + assert node.rerun_on_resume is True + + +# --------------------------------------------------------------------------- +# parameter_binding='node_input' tests +# --------------------------------------------------------------------------- + + +class TestParameterBindingNodeInput: + """Tests for FunctionNode with parameter_binding='node_input'.""" + + def test_schemas_inferred_from_signature(self): + """input_schema and output_schema are inferred from func signature.""" + + def add(x: int, y: int) -> int: + """Add two numbers.""" + return x + y + + node = FunctionNode(func=add, name='add', parameter_binding='node_input') + + assert node.parameter_binding == 'node_input' + assert node.input_schema is not None + assert 'properties' in node.input_schema + assert 'x' in node.input_schema['properties'] + assert 'y' in node.input_schema['properties'] + assert node.output_schema == {'type': 'integer'} + + def test_ctx_param_excluded_from_schema(self): + """Context parameter is excluded from input_schema.""" + + def greet(name: str, ctx: Context) -> str: + return f'Hello, {name}!' + + node = FunctionNode( + func=greet, name='greet', parameter_binding='node_input' + ) + + assert node.input_schema is not None + assert 'name' in node.input_schema['properties'] + assert 'ctx' not in node.input_schema.get('properties', {}) + + @pytest.mark.asyncio + @pytest.mark.parametrize( + 'producer_output, add_func, expected_output', + [ + pytest.param( + {'x': 3, 'y': 4}, + staticmethod(lambda x, y: x + y), + 7, + id='all_params_provided', + ), + pytest.param( + {'x': 5}, + None, # uses default func defined below + 15, + id='missing_param_uses_default', + ), + ], + ) + async def test_bind_from_node_input( + self, + request: pytest.FixtureRequest, + producer_output: dict, + add_func, + expected_output: int, + ): + """Parameters are bound from node_input dict.""" + + if add_func is None: + + def add_func(x: int, y: int = 10): + return x + y + + def produce(): + return producer_output + + node = FunctionNode( + func=add_func, name='add', parameter_binding='node_input' + ) + + agent = Workflow( + name='test_bind_from_node_input', + edges=[ + (START, produce), + (produce, node), + ], + ) + events, _, _ = await run_workflow(agent) + assert simplify_events_with_node(events) == [ + ( + 'test_bind_from_node_input@1/produce@1', + {'output': producer_output}, + ), + ( + 'test_bind_from_node_input@1/add@1', + {'output': expected_output}, + ), + ] + + @pytest.mark.asyncio + async def test_bind_from_node_input_missing_required( + self, request: pytest.FixtureRequest + ): + """Missing required param in node_input mode raises ValueError.""" + + def produce(): + return {'x': 5} + + def add(x: int, y: int): + return x + y + + node = FunctionNode(func=add, name='add', parameter_binding='node_input') + + agent = Workflow( + name='test_bind_node_input_missing', + edges=[ + (START, produce), + (produce, node), + ], + ) + with pytest.raises(ValueError, match='Missing value for parameter "y"'): + await run_workflow(agent) + + @pytest.mark.asyncio + async def test_bind_from_node_input_with_ctx( + self, request: pytest.FixtureRequest + ): + """Context parameter is injected alongside node_input params.""" + received_ctx = [] + + def produce(): + return {'name': 'Alice'} + + def greet(name: str, ctx: Context): + received_ctx.append(ctx) + return f'Hello, {name}!' + + node = FunctionNode( + func=greet, name='greet', parameter_binding='node_input' + ) + + agent = Workflow( + name='test_bind_node_input_ctx', + edges=[ + (START, produce), + (produce, node), + ], + ) + events, _, _ = await run_workflow(agent) + + assert len(received_ctx) == 1 + assert isinstance(received_ctx[0], Context) + assert simplify_events_with_node(events) == [ + ( + 'test_bind_node_input_ctx@1/produce@1', + {'output': {'name': 'Alice'}}, + ), + ( + 'test_bind_node_input_ctx@1/greet@1', + {'output': 'Hello, Alice!'}, + ), + ] + + def test_model_copy_preserves_parameter_binding(self): + """model_copy preserves parameter_binding and input_schema.""" + + def add(x: int, y: int) -> int: + return x + y + + node = FunctionNode(func=add, name='add', parameter_binding='node_input') + copied = node.model_copy(update={'name': 'add_copy'}) + + assert copied.parameter_binding == 'node_input' + assert copied.input_schema is not None + assert 'x' in copied.input_schema['properties'] + + def test_type_hints_cache(self): + """Verifies that type hints are cached and robustly unwrapped.""" + from google.adk.workflow._function_node import _get_type_hints_cached + from google.adk.workflow._function_node import _get_type_hints_for_unwrapped + + def my_func(x: int, y: str) -> bool: + return True + + # Clear cache first to have predictable results + _get_type_hints_for_unwrapped.cache_clear() + + hints1 = _get_type_hints_cached(my_func) + assert hints1 == {'x': int, 'y': str, 'return': bool} + + # Call again, should hit cache + hints2 = _get_type_hints_cached(my_func) + assert hints2 == {'x': int, 'y': str, 'return': bool} + assert _get_type_hints_for_unwrapped.cache_info().hits == 1 + + # Test partial + import functools + + partial_func = functools.partial(my_func, x=1) + hints3 = _get_type_hints_cached(partial_func) + # Partial should unwrap to my_func and hit cache! + assert hints3 == {'x': int, 'y': str, 'return': bool} + assert _get_type_hints_for_unwrapped.cache_info().hits == 2 + + # Test callable object + class MyCallable: + + def __call__(self, z: float) -> None: + pass + + obj = MyCallable() + hints4 = _get_type_hints_cached(obj) + assert hints4 == {'z': float, 'return': type(None)} diff --git a/tests/unittests/workflow/test_graph.py b/tests/unittests/workflow/test_graph.py new file mode 100644 index 0000000000..2d57e5650c --- /dev/null +++ b/tests/unittests/workflow/test_graph.py @@ -0,0 +1,793 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for Graph validation.""" + +from google.adk.workflow import Edge +from google.adk.workflow import FunctionNode +from google.adk.workflow import START +from google.adk.workflow._graph import DEFAULT_ROUTE +from google.adk.workflow._graph import Graph +from pydantic import BaseModel +import pytest + +from .workflow_testing_utils import TestingNode + + +def test_valid_graph() -> None: + """Tests that a valid graph passes validation.""" + node_a = TestingNode(name='NodeA') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + ], + ) + graph.validate_graph() # Should not raise + + +def test_missing_start_node() -> None: + """Tests that a graph missing the START node fails validation.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + graph = Graph( + edges=[Edge(from_node=node_a, to_node=node_b)], + ) + with pytest.raises( + ValueError, + match=( + r"Graph validation failed\. START node \(name: '__START__'\) not" + r' found in graph nodes\.' + ), + ): + graph.validate_graph() + + +def test_unreachable_node() -> None: + """Tests that a graph with an unreachable node fails validation.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') # Unreachable + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_b, to_node=node_a), + ], + ) + with pytest.raises( + ValueError, + match=( + r'Graph validation failed\. The following nodes are unreachable' + r" from START: \['NodeB'\]" + ), + ): + graph.validate_graph() + + +def test_disconnected_routed_subgraph_is_unreachable() -> None: + """Tests that a disconnected subgraph with routed edges fails validation. + + Even though B and C each appear as a to_node in some edge, neither is + reachable from START. The old "has incoming edge" heuristic would let + this pass; true reachability from START catches it. + """ + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_b, to_node=node_c, route='x'), + Edge(from_node=node_c, to_node=node_b, route='y'), + ], + ) + with pytest.raises( + ValueError, + match=( + r'Graph validation failed\. The following nodes are unreachable' + r" from START: \['NodeB', 'NodeC'\]" + ), + ): + graph.validate_graph() + + +@pytest.mark.parametrize( + 'routes', + [ + (None, None), + ('route1', 'route1'), + ('route1', 'route2'), + ('route1', None), + ], +) +def test_duplicate_edges_fail_validation( + routes: tuple[str | None, str | None], +) -> None: + """Tests that duplicate edges fail validation, regardless of routes.""" + node_a = TestingNode(name='NodeA') + graph = Graph( + edges=[ + Edge( + from_node=START, + to_node=node_a, + route=routes[0], + ), + Edge( + from_node=START, + to_node=node_a, + route=routes[1], + ), + ], + ) + with pytest.raises( + ValueError, + match=( + r'Graph validation failed\. Duplicate edge found: from=__START__,' + r' to=NodeA' + ), + ): + graph.validate_graph() + + +def test_start_node_with_incoming_edge() -> None: + """Tests graph with incoming edge to START node fails validation.""" + node_a = TestingNode(name='NodeA') + graph = Graph( + edges=[ + Edge(from_node=node_a, to_node=START), + Edge(from_node=START, to_node=node_a), + ], + ) + with pytest.raises( + ValueError, + match=( + r'Graph validation failed\. START node must not have incoming edges\.' + ), + ): + graph.validate_graph() + + +def test_multiple_default_routes_fail_validation() -> None: + """Tests that multiple DEFAULT_ROUTE edges from a node fail validation.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_b, route=DEFAULT_ROUTE), + Edge(from_node=node_a, to_node=node_c, route=DEFAULT_ROUTE), + ], + ) + with pytest.raises( + ValueError, + match=( + r'Graph validation failed\. Multiple DEFAULT_ROUTE edges found from' + r' node NodeA to NodeB and NodeC' + ), + ): + graph.validate_graph() + + +def test_single_default_route_passes_validation() -> None: + """Tests that a single DEFAULT_ROUTE edge from a node passes validation.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_b, route=DEFAULT_ROUTE), + Edge(from_node=node_a, to_node=node_c, route='another_route'), + ], + ) + graph.validate_graph() # Should not raise + + +def test_duplicate_node_names_fail_validation() -> None: + """Tests that duplicate nodes raise error.""" + + node_a1 = TestingNode(name='NodeA') + node_a2 = TestingNode(name='NodeA') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a1), + Edge(from_node=node_a1, to_node=node_a2), + ], + ) + with pytest.raises( + ValueError, + match=( + r"Graph validation failed\. Duplicate node names found: \['NodeA'\]\." + r' This means multiple distinct node objects have the same name\. If' + r' you intended to reuse the same node, ensure you pass the exact' + r' same object instance\. If you intended to have distinct nodes,' + r' ensure they have unique names\.' + ), + ): + graph.validate_graph() + + +def test_from_edge_items_with_node_reuse_passes_validation() -> None: + """Tests that node reuse with from_edge_items passes validation. + + The same my_node_func instance is used in the graph multiple times, and + the workflow graph should recognize it as the same instance and not throw + an error during validation. + """ + + def my_node_func() -> None: + pass + + node_b = TestingNode(name='NodeB') + graph = Graph.from_edge_items([ + (START, my_node_func), + (my_node_func, node_b), + ]) + graph.validate_graph() # Should not raise duplicate name error + + node_names = {n.name for n in graph.nodes} + assert node_names == {'__START__', 'my_node_func', 'NodeB'} + assert len(graph.nodes) == 3 + # Check that my_node_func was wrapped and deduplicated. + func_node = next(n for n in graph.nodes if n.name == 'my_node_func') + assert isinstance(func_node, FunctionNode) + + +def test_unconditional_cycle_fails_validation() -> None: + """Tests that a cycle of unconditional edges (route=None) fails.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_b), + Edge(from_node=node_b, to_node=node_a), + ], + ) + with pytest.raises( + ValueError, + match=r'Graph validation failed\. Unconditional cycle detected:', + ): + graph.validate_graph() + + +def test_unconditional_self_loop_fails_validation() -> None: + """Tests that an unconditional self-loop (A -> A) fails.""" + node_a = TestingNode(name='NodeA') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_a), + ], + ) + with pytest.raises( + ValueError, + match=r'Graph validation failed\. Unconditional cycle detected:', + ): + graph.validate_graph() + + +def test_longer_unconditional_cycle_fails_validation() -> None: + """Tests that a longer unconditional cycle (A -> B -> C -> A) fails.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_b), + Edge(from_node=node_b, to_node=node_c), + Edge(from_node=node_c, to_node=node_a), + ], + ) + with pytest.raises( + ValueError, + match=r'Graph validation failed\. Unconditional cycle detected:', + ): + graph.validate_graph() + + +def test_conditional_cycle_passes_validation() -> None: + """Tests that a cycle with a routed edge (loop pattern) passes.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_b), + Edge(from_node=node_b, to_node=node_a, route='retry'), + ], + ) + graph.validate_graph() # Should not raise — routed back-edge + + +def test_conditional_self_loop_passes_validation() -> None: + """Tests that a self-loop with a route passes validation.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_a, route='continue'), + Edge(from_node=node_a, to_node=node_b, route='done'), + ], + ) + graph.validate_graph() # Should not raise — routed self-loop + + +def test_dag_with_diamond_passes_validation() -> None: + """Tests that a DAG with a diamond shape passes validation.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=START, to_node=node_b), + Edge(from_node=node_a, to_node=node_c), + Edge(from_node=node_b, to_node=node_c), + ], + ) + graph.validate_graph() # Should not raise + + +# --- Routing map tests --- + + +def test_routing_map_basic() -> None: + """Tests that a string-keyed routing map expands to correct edges.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + graph = Graph.from_edge_items([ + (START, node_a), + (node_a, {'route_b': node_b, 'route_c': node_c}), + ]) + graph.validate_graph() + + assert len(graph.edges) == 3 # START->A, A->B(route_b), A->C(route_c) + + routed_edges = [e for e in graph.edges if e.route is not None] + assert len(routed_edges) == 2 + + routes_and_targets = {(e.route, e.to_node.name) for e in routed_edges} + assert routes_and_targets == {('route_b', 'NodeB'), ('route_c', 'NodeC')} + + for e in routed_edges: + assert e.from_node.name == 'NodeA' + + +def test_routing_map_int_keys() -> None: + """Tests that integer route keys work in routing maps.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + graph = Graph.from_edge_items([ + (START, node_a), + (node_a, {1: node_b, 2: node_c}), + ]) + graph.validate_graph() + + routed_edges = [e for e in graph.edges if e.route is not None] + assert len(routed_edges) == 2 + routes = [e.route for e in routed_edges] + assert 1 in routes + assert 2 in routes + + +def test_routing_map_bool_keys() -> None: + """Tests that boolean route keys work in routing maps.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + graph = Graph.from_edge_items([ + (START, node_a), + (node_a, {True: node_b, False: node_c}), + ]) + graph.validate_graph() + + routed_edges = [e for e in graph.edges if e.route is not None] + assert len(routed_edges) == 2 + routes = [e.route for e in routed_edges] + assert True in routes + assert False in routes + + +def test_routing_map_with_fan_in_source() -> None: + """Tests that fan-in on the source side works with routing maps.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + node_d = TestingNode(name='NodeD') + graph = Graph.from_edge_items([ + (START, node_a), + (START, node_b), + ((node_a, node_b), {'route_x': node_c, 'route_y': node_d}), + ]) + graph.validate_graph() + + # 2 from START + 4 from fan-in (A->C, A->D, B->C, B->D) + assert len(graph.edges) == 6 + + fan_in_edges = [ + e for e in graph.edges if e.from_node.name in ('NodeA', 'NodeB') + ] + assert len(fan_in_edges) == 4 + + combos = {(e.from_node.name, e.to_node.name, e.route) for e in fan_in_edges} + assert combos == { + ('NodeA', 'NodeC', 'route_x'), + ('NodeA', 'NodeD', 'route_y'), + ('NodeB', 'NodeC', 'route_x'), + ('NodeB', 'NodeD', 'route_y'), + } + + +def test_routing_map_with_callable_target() -> None: + """Tests that callable values in routing maps get wrapped via build_node.""" + node_a = TestingNode(name='NodeA') + + def my_target_func() -> None: + pass + + graph = Graph.from_edge_items([ + (START, node_a), + (node_a, {'route_x': my_target_func}), + ]) + graph.validate_graph() + + target_edge = next(e for e in graph.edges if e.route == 'route_x') + assert isinstance(target_edge.to_node, FunctionNode) + assert target_edge.to_node.name == 'my_target_func' + + +def test_routing_map_node_reuse() -> None: + """Tests that the same callable used in a map and elsewhere is deduplicated.""" + + def my_func() -> None: + pass + + node_b = TestingNode(name='NodeB') + graph = Graph.from_edge_items([ + (START, my_func), + (my_func, {'route_x': node_b}), + ]) + graph.validate_graph() + + # my_func should be wrapped once and reused. + func_nodes = [n for n in graph.nodes if n.name == 'my_func'] + assert len(func_nodes) == 1 + assert isinstance(func_nodes[0], FunctionNode) + + +def test_routing_map_empty_dict_raises() -> None: + """Tests that an empty routing map raises ValueError.""" + node_a = TestingNode(name='NodeA') + with pytest.raises( + ValueError, + match=r'Routing map must not be empty', + ): + Graph.from_edge_items([ + (START, node_a), + (node_a, {}), + ]) + + +def test_routing_map_invalid_key_raises() -> None: + """Tests that a non-RouteValue key raises ValueError.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + with pytest.raises( + ValueError, + match=r'Invalid routing map key', + ): + Graph.from_edge_items([ + (START, node_a), + (node_a, {1.5: node_b}), + ]) + + +def test_routing_map_invalid_value_raises() -> None: + """Tests that a non-NodeLike value raises ValueError.""" + node_a = TestingNode(name='NodeA') + with pytest.raises( + ValueError, + match=r'Invalid routing map value', + ): + Graph.from_edge_items([ + (START, node_a), + (node_a, {'route_x': 42}), + ]) + + +def test_routing_map_fan_out_target() -> None: + """Tests that a tuple value in a routing map creates fan-out edges.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + graph = Graph.from_edge_items([ + (START, node_a), + (node_a, {'route_x': (node_b, node_c)}), + ]) + graph.validate_graph() + + # START->A, A->B(route_x), A->C(route_x) + assert len(graph.edges) == 3 + + routed_edges = [e for e in graph.edges if e.route is not None] + assert len(routed_edges) == 2 + + # Both fan-out edges share the same route and source. + for e in routed_edges: + assert e.from_node.name == 'NodeA' + assert e.route == 'route_x' + + targets = {e.to_node.name for e in routed_edges} + assert targets == {'NodeB', 'NodeC'} + + +def test_routing_map_fan_out_invalid_element_raises() -> None: + """Tests that a non-NodeLike element inside a fan-out tuple raises.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + with pytest.raises( + ValueError, + match=r'Invalid node in fan-out tuple', + ): + Graph.from_edge_items([ + (START, node_a), + (node_a, {'route_x': (node_b, 42)}), + ]) + + +# --- Routing map as chain element tests --- + + +def test_routing_map_chain_ending_with_dict() -> None: + """Tests a chain ending with a routing map creates correct edges.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + graph = Graph.from_edge_items([ + (START, node_a, {'r1': node_b, 'r2': node_c}), + ]) + graph.validate_graph() + + # START->A (None), A->B (r1), A->C (r2) + assert len(graph.edges) == 3 + + start_edge = next(e for e in graph.edges if e.from_node.name == '__START__') + assert start_edge.to_node.name == 'NodeA' + assert start_edge.route is None + + routed_edges = [e for e in graph.edges if e.route is not None] + assert len(routed_edges) == 2 + routes_and_targets = {(e.route, e.to_node.name) for e in routed_edges} + assert routes_and_targets == {('r1', 'NodeB'), ('r2', 'NodeC')} + for e in routed_edges: + assert e.from_node.name == 'NodeA' + + +def test_routing_map_mid_chain_with_fan_in() -> None: + """Tests routing map mid-chain with fan-in to the next element.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + node_d = TestingNode(name='NodeD') + graph = Graph.from_edge_items([ + (START, node_a, {'r1': node_b, 'r2': node_c}, node_d), + ]) + graph.validate_graph() + + # START->A (None), A->B (r1), A->C (r2), B->D (None), C->D (None) + assert len(graph.edges) == 5 + + routed_edges = sorted( + [e for e in graph.edges if e.route is not None], + key=lambda e: e.to_node.name, + ) + assert len(routed_edges) == 2 + assert routed_edges[0].from_node.name == 'NodeA' + assert routed_edges[0].to_node.name == 'NodeB' + assert routed_edges[0].route == 'r1' + assert routed_edges[1].from_node.name == 'NodeA' + assert routed_edges[1].to_node.name == 'NodeC' + assert routed_edges[1].route == 'r2' + + fan_in_edges = sorted( + [e for e in graph.edges if e.to_node.name == 'NodeD'], + key=lambda e: e.from_node.name, + ) + assert len(fan_in_edges) == 2 + assert fan_in_edges[0].from_node.name == 'NodeB' + assert fan_in_edges[0].route is None + assert fan_in_edges[1].from_node.name == 'NodeC' + assert fan_in_edges[1].route is None + + +def test_routing_map_mid_chain_fan_out_values() -> None: + """Tests routing map with fan-out tuple values, followed by fan-in.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + node_d = TestingNode(name='NodeD') + graph = Graph.from_edge_items([ + (START, node_a, {'r1': (node_b, node_c)}, node_d), + ]) + graph.validate_graph() + + # START->A (None), A->B (r1), A->C (r1), B->D (None), C->D (None) + assert len(graph.edges) == 5 + + routed_edges = [e for e in graph.edges if e.route is not None] + assert len(routed_edges) == 2 + for e in routed_edges: + assert e.from_node.name == 'NodeA' + assert e.route == 'r1' + + fan_in_edges = [e for e in graph.edges if e.to_node.name == 'NodeD'] + assert len(fan_in_edges) == 2 + fan_in_sources = {e.from_node.name for e in fan_in_edges} + assert fan_in_sources == {'NodeB', 'NodeC'} + + +def test_routing_map_consecutive_dicts_raises() -> None: + """Tests that consecutive routing maps in a chain are rejected.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + node_d = TestingNode(name='NodeD') + with pytest.raises( + ValueError, match=r'Consecutive routing maps are not allowed' + ): + Graph.from_edge_items([ + (START, node_a, {'r1': node_b, 'r2': node_c}, {'r3': node_d}), + ]) + + +def test_routing_map_empty_dict_in_chain_raises() -> None: + """Tests that an empty routing map in a chain raises ValueError.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + with pytest.raises(ValueError, match=r'Routing map must not be empty'): + Graph.from_edge_items([ + (START, node_a, {}, node_b), + ]) + + +def test_routing_map_invalid_key_in_chain_raises() -> None: + """Tests that invalid routing map keys in a chain raise ValueError.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + with pytest.raises(ValueError, match=r'Invalid routing map key'): + Graph.from_edge_items([ + (START, node_a, {1.5: node_b}), + ]) + + +def test_routing_map_2_tuple_backward_compat() -> None: + """Ensures existing 2-tuple routing map syntax still works.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + graph = Graph.from_edge_items([ + (START, node_a), + (node_a, {'r1': node_b, 'r2': node_c}), + ]) + graph.validate_graph() + assert len(graph.edges) == 3 + + +class ModelA(BaseModel): + x: int + + +class ModelB(BaseModel): + x: int + + +def test_schema_match_passes() -> None: + """Tests that edges with matching schemas pass validation.""" + node_a = TestingNode(name='NodeA', output_schema=ModelA) + node_b = TestingNode(name='NodeB', input_schema=ModelA) + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_b), + ], + ) + graph.validate_graph() # Should not raise + + +def test_schema_mismatch_raises() -> None: + """Tests that edges with mismatching schemas fail validation.""" + node_a = TestingNode(name='NodeA', output_schema=ModelA) + node_b = TestingNode(name='NodeB', input_schema=ModelB) + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_b), + ], + ) + with pytest.raises( + ValueError, + match=r'Graph validation failed\. Schema mismatch on edge', + ): + graph.validate_graph() + + +def test_schema_missing_passes() -> None: + """Tests that edges with missing schemas pass validation.""" + node_a = TestingNode(name='NodeA', output_schema=ModelA) + node_b = TestingNode(name='NodeB') # No input schema + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_b), + ], + ) + graph.validate_graph() # Should not raise + + +def test_get_next_pending_nodes() -> None: + """Tests that get_next_pending_nodes returns correct nodes based on routes.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + node_c = TestingNode(name='NodeC') + node_d = TestingNode(name='NodeD') + + graph = Graph( + edges=[ + Edge(from_node=node_a, to_node=node_b), # Unconditional + Edge(from_node=node_a, to_node=node_c, route='route1'), # Conditional + Edge( + from_node=node_a, to_node=node_d, route=DEFAULT_ROUTE + ), # Default + ], + ) + + # Test unconditional edge triggered + next_nodes = graph.get_next_pending_nodes('NodeA', routes_to_match=None) + assert set(next_nodes) == {'NodeB', 'NodeD'} + + # Test specific route matched + next_nodes = graph.get_next_pending_nodes('NodeA', routes_to_match='route1') + assert set(next_nodes) == {'NodeB', 'NodeC'} + + # Test unmatched route falls back to default + next_nodes = graph.get_next_pending_nodes( + 'NodeA', routes_to_match='unknown_route' + ) + assert set(next_nodes) == {'NodeB', 'NodeD'} + + # Test list of routes to match + next_nodes = graph.get_next_pending_nodes( + 'NodeA', routes_to_match=['route1', 'unknown_route'] + ) + assert set(next_nodes) == {'NodeB', 'NodeC'} + + +def test_chat_agent_wiring_validation_only_runs_on_llm_agent() -> None: + """Tests that _validate_chat_agent_wiring checks non-LlmAgent nodes safely.""" + node_a = TestingNode(name='NodeA') + node_b = TestingNode(name='NodeB') + # Set mode='chat' on a non-LlmAgent node + object.__setattr__(node_b, 'mode', 'chat') + + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_b), + ], + ) + graph.validate_graph() # Should not raise because node_b is a TestingNode, not LlmAgent diff --git a/tests/unittests/workflow/test_join_node.py b/tests/unittests/workflow/test_join_node.py new file mode 100644 index 0000000000..d46fe3f42c --- /dev/null +++ b/tests/unittests/workflow/test_join_node.py @@ -0,0 +1,277 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Testings for the JoinNode.""" + +from google.adk import workflow +from google.adk.apps import app +from google.adk.workflow import _base_node as base_node +from google.adk.workflow import _graph as workflow_graph +from google.adk.workflow import _join_node as join_node +from google.adk.workflow import START +from google.adk.workflow._workflow import Workflow +from pydantic import BaseModel +import pytest + +from . import workflow_testing_utils +from .. import testing_utils + + +def _build_join_node_workflow( + request: pytest.FixtureRequest, +) -> tuple[ + workflow_testing_utils.InputCapturingNode, testing_utils.InMemoryRunner +]: + """Builds a workflow with a JoinNode.""" + node_a = workflow_testing_utils.TestingNode( + name='NodeA', output={'a': 1, 'b': 1} + ) + node_b = workflow_testing_utils.TestingNode(name='NodeB', output={'b': 2}) + node_join = join_node.JoinNode(name='NodeJoin') + node_capture = workflow_testing_utils.InputCapturingNode(name='NodeCapture') + agent = workflow.Workflow( + name='test_join_node', + edges=[ + workflow_graph.Edge(from_node=base_node.START, to_node=node_a), + workflow_graph.Edge(from_node=base_node.START, to_node=node_b), + workflow_graph.Edge(from_node=node_a, to_node=node_join), + workflow_graph.Edge(from_node=node_b, to_node=node_join), + workflow_graph.Edge(from_node=node_join, to_node=node_capture), + ], + ) + app_instance = app.App( + name=request.function.__name__, + root_agent=agent, + ) + return node_capture, testing_utils.InMemoryRunner(app=app_instance) + + +def test_get_common_branch_prefix(): + """Tests _get_common_branch_prefix.""" + assert join_node._get_common_branch_prefix(['A@1', 'A@2']) == '' + assert join_node._get_common_branch_prefix(['A@1.B@1', 'A@1.B@2']) == 'A@1' + assert join_node._get_common_branch_prefix(['A@1', 'A@1']) == 'A@1' + assert join_node._get_common_branch_prefix(['A@1', '']) == '' + assert join_node._get_common_branch_prefix(['', '']) == '' + assert join_node._get_common_branch_prefix([]) == '' + + +@pytest.mark.asyncio +async def test_join_node_waits_for_all_inputs(request: pytest.FixtureRequest): + """Tests JoinNode with fan-in.""" + node_capture, runner = _build_join_node_workflow(request) + events = await runner.run_async(testing_utils.get_user_content('start')) + + assert node_capture.received_inputs == [{ + 'NodeA': {'a': 1, 'b': 1}, + 'NodeB': {'b': 2}, + }] + + +@pytest.mark.asyncio +async def test_join_node_with_none_state(request: pytest.FixtureRequest): + """Tests JoinNode with fan-in when node state is None.""" + node_capture, runner = _build_join_node_workflow(request) + # Run once to set state to None + await runner.run_async(testing_utils.get_user_content('start')) + # Run again to trigger join_node with state=None + await runner.run_async(testing_utils.get_user_content('start')) + + assert node_capture.received_inputs == [ + {'NodeA': {'a': 1, 'b': 1}, 'NodeB': {'b': 2}}, + {'NodeA': {'a': 1, 'b': 1}, 'NodeB': {'b': 2}}, + ] + + +@pytest.mark.asyncio +async def test_join_node_with_none_inputs(request: pytest.FixtureRequest): + """Tests JoinNode with fan-in when incoming edges have None output.""" + node_a = workflow_testing_utils.TestingNode( + name='NodeA', output=None, route='NodeJoin' + ) + node_b = workflow_testing_utils.TestingNode( + name='NodeB', output=None, route='NodeJoin' + ) + node_join = join_node.JoinNode(name='NodeJoin') + node_capture = workflow_testing_utils.InputCapturingNode(name='NodeCapture') + agent = workflow.Workflow( + name='test_join_node_none_inputs', + edges=[ + workflow_graph.Edge(from_node=base_node.START, to_node=node_a), + workflow_graph.Edge(from_node=base_node.START, to_node=node_b), + workflow_graph.Edge(from_node=node_a, to_node=node_join), + workflow_graph.Edge(from_node=node_b, to_node=node_join), + workflow_graph.Edge(from_node=node_join, to_node=node_capture), + ], + ) + app_instance = app.App( + name=request.function.__name__, + root_agent=agent, + ) + runner = testing_utils.InMemoryRunner(app=app_instance) + + await runner.run_async(testing_utils.get_user_content('start')) + + assert node_capture.received_inputs == [ + {'NodeA': None, 'NodeB': None}, + ] + + +# ── JoinNode input_schema ────────────────────────────────────── +# input_schema on JoinNode validates each trigger input individually +# (each predecessor's output), not the joined dict. + + +class _TriggerInput(BaseModel): + key: str + value: int + + +@pytest.mark.asyncio +async def test_join_node_input_schema_validates_per_trigger( + request: pytest.FixtureRequest, +): + """JoinNode input_schema validates each trigger input individually.""" + + def node_a() -> dict: + return {'key': 'a', 'value': 1} + + def node_b() -> dict: + return {'key': 'b', 'value': 2} + + join = join_node.JoinNode(name='join', input_schema=_TriggerInput) + capture = workflow_testing_utils.InputCapturingNode(name='capture') + + agent = Workflow( + name='wf', + edges=[ + (START, node_a), + (START, node_b), + (node_a, join), + (node_b, join), + (join, capture), + ], + ) + app_instance = app.App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app_instance) + await runner.run_async(testing_utils.get_user_content('start')) + + assert capture.received_inputs == [{ + 'node_a': {'key': 'a', 'value': 1}, + 'node_b': {'key': 'b', 'value': 2}, + }] + + +@pytest.mark.asyncio +async def test_join_node_input_schema_rejects_invalid_trigger( + request: pytest.FixtureRequest, +): + """JoinNode input_schema rejects invalid trigger input early.""" + + def node_a() -> dict: + return {'key': 'a', 'value': 1} + + def node_b() -> dict: + return {'wrong': 'shape'} # missing required fields + + join = join_node.JoinNode(name='join', input_schema=_TriggerInput) + capture = workflow_testing_utils.InputCapturingNode(name='capture') + + agent = Workflow( + name='wf', + edges=[ + (START, node_a), + (START, node_b), + (node_a, join), + (node_b, join), + (join, capture), + ], + ) + app_instance = app.App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app_instance) + with pytest.raises(Exception): + await runner.run_async(testing_utils.get_user_content('start')) + + +@pytest.mark.asyncio +async def test_join_node_input_schema_none_trigger_passes( + request: pytest.FixtureRequest, +): + """JoinNode input_schema skips validation for None trigger input.""" + # Given + node_a_fn = workflow_testing_utils.TestingNode( + name='NodeA', output=None, route='join' + ) + node_b_fn = workflow_testing_utils.TestingNode( + name='NodeB', output={'key': 'b', 'value': 2} + ) + join = join_node.JoinNode(name='join', input_schema=_TriggerInput) + capture = workflow_testing_utils.InputCapturingNode(name='capture') + + agent = Workflow( + name='wf', + edges=[ + (START, node_a_fn), + (START, node_b_fn), + (node_a_fn, join), + (node_b_fn, join), + (join, capture), + ], + ) + app_instance = app.App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app_instance) + + # When + await runner.run_async(testing_utils.get_user_content('start')) + + # Then + assert capture.received_inputs == [{ + 'NodeA': None, + 'NodeB': {'key': 'b', 'value': 2}, + }] + + +@pytest.mark.asyncio +async def test_join_node_computes_common_branch_prefix( + request: pytest.FixtureRequest, +): + """Tests JoinNode computes common branch prefix for final output.""" + node_capture, runner = _build_join_node_workflow(request) + events = await runner.run_async(testing_utils.get_user_content('start')) + + # Find the final output event from JoinNode + join_events = [ + e + for e in events + if 'NodeJoin' in e.node_info.path and e.output is not None + ] + assert len(join_events) == 1 + join_event = join_events[0] + + # NodeA and NodeB run in parallel, so they should have branches like 'NodeA@1' and 'NodeB@1'. + a_events = [e for e in events if 'NodeA' in e.node_info.path] + b_events = [e for e in events if 'NodeB' in e.node_info.path] + + assert any('NodeA@' in e.branch for e in a_events if e.branch) + assert any('NodeB@' in e.branch for e in b_events if e.branch) + + # The common prefix of 'NodeA@1' and 'NodeB@1' is empty string. + # So JoinNode should set branch to empty string (which is converted to None). + assert join_event.branch is None + + # The node after JoinNode (NodeCapture) should also have branch=None + capture_events = [e for e in events if 'NodeCapture' in e.node_info.path] + assert len(capture_events) > 0 + for e in capture_events: + assert e.branch is None diff --git a/tests/unittests/workflow/test_llm_agent_as_node.py b/tests/unittests/workflow/test_llm_agent_as_node.py new file mode 100644 index 0000000000..8e4fcf116d --- /dev/null +++ b/tests/unittests/workflow/test_llm_agent_as_node.py @@ -0,0 +1,1238 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for _LlmAgentWrapper. + +Verifies that _LlmAgentWrapper correctly adapts V1 LlmAgent for use as a +workflow graph node, covering mode validation, input conversion, +content isolation, output extraction, and both old/new workflow paths. +""" + +from __future__ import annotations + +from typing import Any + +from google.adk.agents.context import Context +from google.adk.agents.llm.task._task_models import TaskResult +from google.adk.agents.llm_agent import LlmAgent +from google.adk.events.event import Event +from google.adk.events.event_actions import EventActions +from google.adk.features import FeatureName +from google.adk.features import override_feature_enabled +from google.adk.workflow import START +from google.adk.workflow._workflow import Workflow +from google.adk.workflow.utils._workflow_graph_utils import build_node +from google.genai import types +from pydantic import BaseModel +from pydantic import ValidationError +import pytest + +from .workflow_testing_utils import create_parent_invocation_context +from .workflow_testing_utils import InputCapturingNode +from .workflow_testing_utils import TestingNode + +# --- Fixtures --- + + +class StoryOutput(BaseModel): + title: str + content: str + + +class StoryInput(BaseModel): + topic: str + style: str = 'narrative' + + +def _make_agent( + name: str = 'test_agent', + mode: str = 'task', + **kwargs, +) -> LlmAgent: + return LlmAgent( + name=name, + model='gemini-2.5-flash', + instruction='Test agent.', + mode=mode, + **kwargs, + ) + + +def _mock_agent_run(agent, finish_output=None, content_text=None): + """Mocks agent.run_async to yield events. Returns a context manager.""" + + async def fake_run_async(*args, **kwargs): + if content_text: + yield Event( + invocation_id='inv', + author=agent.name, + content=types.Content(parts=[types.Part(text=content_text)]), + ) + if finish_output is not None: + # Task Delegation API: emit a finish_task FC followed by its FR. + # The wrapper waits for the FR (so validation errors can drive a + # retry) before extracting the FC's args as event.output. + yield Event( + invocation_id='inv', + author=agent.name, + content=types.Content( + role='model', + parts=[ + types.Part( + function_call=types.FunctionCall( + name='finish_task', + id='ft-1', + args=( + finish_output + if isinstance(finish_output, dict) + else {'result': finish_output} + ), + ) + ) + ], + ), + ) + yield Event( + invocation_id='inv', + author=agent.name, + content=types.Content( + role='user', + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='finish_task', + id='ft-1', + response={'result': 'Task completed.'}, + ) + ) + ], + ), + ) + + original = agent.run_async + object.__setattr__(agent, 'run_async', fake_run_async) + + class _Ctx: + + def __enter__(self): + return self + + def __exit__(self, *args): + object.__setattr__(agent, 'run_async', original) + + return _Ctx() + + +def _mock_leaf_run(agent, content_text=None): + """Mocks the agent.run_async. Returns a context manager.""" + target = agent + + async def fake_run_async(*args, **kwargs): + if content_text: + yield Event(output=content_text) + + original = target.run_async + object.__setattr__(target, 'run_async', fake_run_async) + + class _Ctx: + + def __enter__(self): + return self + + def __exit__(self, *args): + object.__setattr__(target, 'run_async', original) + + return _Ctx() + + +def _new_workflow_runner(wf, test_name): + """Creates an InMemoryRunner for the new Workflow (root_agent path).""" + from google.adk.apps.app import App + + from . import testing_utils + + app = App(name=test_name, root_agent=wf) + return testing_utils.InMemoryRunner(app=app) + + +# --- Validation --- + + +class TestValidation: + + def test_task_mode_accepted(self): + """Wrapping a task-mode agent succeeds.""" + wrapper = build_node(_make_agent(mode='task')) + assert wrapper.name == 'test_agent' + + def test_single_turn_mode_accepted(self): + """Wrapping a single_turn-mode agent succeeds.""" + wrapper = build_node(_make_agent(mode='single_turn')) + assert wrapper.name == 'test_agent' + + def test_chat_mode_accepted(self): + """Wrapping a chat-mode agent succeeds.""" + wrapper = build_node(_make_agent(mode='chat')) + assert wrapper.name == 'test_agent' + + def test_name_defaults_to_agent_name(self): + """Wrapper name defaults to the inner agent's name.""" + wrapper = build_node(_make_agent(name='my_agent')) + assert wrapper.name == 'my_agent' + + def test_name_can_be_overridden(self): + """Explicit name overrides the agent's name.""" + wrapper = build_node(_make_agent(name='my_agent'), name='custom') + assert wrapper.name == 'custom' + + def test_task_mode_waits_for_output(self): + """Task mode sets wait_for_output=True.""" + wrapper = build_node(_make_agent(mode='task')) + assert wrapper.wait_for_output is True + + def test_single_turn_does_not_wait_for_output(self): + """Single_turn mode does not set wait_for_output.""" + wrapper = build_node(_make_agent(mode='single_turn')) + assert wrapper.wait_for_output is False + + def test_rerun_on_resume_defaults_true(self): + """Wrapper defaults to rerun_on_resume=True.""" + wrapper = build_node(_make_agent()) + assert wrapper.rerun_on_resume is True + + +# --- build_node auto-wrapping --- + + +class TestBuildNode: + + def test_task_mode_wrapped(self): + """build_node returns a cloned task-mode LlmAgent.""" + agent = _make_agent(mode='task') + node = build_node(agent) + assert isinstance(node, LlmAgent) + assert node is not agent + assert node.name == agent.name + + def test_single_turn_mode_wrapped(self): + """build_node returns a cloned single_turn-mode LlmAgent.""" + node = build_node(_make_agent(mode='single_turn')) + assert isinstance(node, LlmAgent) + + @pytest.mark.skip( + reason=( + 'V2 LlmAgent does not allow mode=None and defaults to chat, so' + ' fallback in wrapper is not triggered here.' + ) + ) + def test_default_mode_auto_set_to_single_turn(self): + """LlmAgent with explicit mode=None is auto-converted to single_turn.""" + agent = LlmAgent( + name='agent', model='gemini-2.5-flash', instruction='Test.', mode=None + ) + + node = build_node(agent) + + assert node.mode == 'single_turn' + + def test_name_override(self): + """build_node respects explicit name override.""" + node = build_node(_make_agent(mode='task'), name='override') + assert node.name == 'override' + + +# --- Old workflow path --- + + +@pytest.mark.xfail( + strict=True, + reason=( + "mode='task' workflow graph nodes temporarily disabled; re-enable " + 'when scheduler preserves originating node_input on resume.' + ), +) +@pytest.mark.asyncio +async def test_task_finish_output_reaches_downstream( + request: pytest.FixtureRequest, +): + """Task mode extracts finish_task output for downstream nodes.""" + agent = _make_agent(mode='task') + from . import testing_utils + + wrapper = build_node(agent) + capture = InputCapturingNode(name='capture') + wf = Workflow( + name='wf', + edges=[('START', wrapper), (wrapper, capture)], + ) + runner = _new_workflow_runner(wf, request.function.__name__) + + agent_clone = next(n for n in wf.graph.nodes if n.name == wrapper.name) + with _mock_agent_run( + agent_clone, + finish_output={'title': 'Story', 'content': 'Once upon a time'}, + content_text='Writing...', + ): + await runner.run_async(testing_utils.get_user_content('start')) + + assert capture.received_inputs == [ + {'title': 'Story', 'content': 'Once upon a time'} + ] + + +@pytest.mark.asyncio +async def test_single_turn_output_reaches_downstream( + request: pytest.FixtureRequest, +): + """Single_turn output flows to downstream nodes.""" + from . import testing_utils + + agent = _make_agent(mode='single_turn') + wrapper = build_node(agent) + capture = InputCapturingNode(name='capture') + wf = Workflow( + name='wf', + edges=[('START', wrapper), (wrapper, capture)], + ) + runner = _new_workflow_runner(wf, request.function.__name__) + + agent_clone = next(n for n in wf.graph.nodes if n.name == wrapper.name) + with _mock_leaf_run(agent_clone, content_text='Done.'): + await runner.run_async(testing_utils.get_user_content('start')) + + assert capture.received_inputs == ['Done.'] + + +@pytest.mark.xfail( + strict=True, + reason=( + "mode='task' workflow graph nodes temporarily disabled; re-enable " + 'when scheduler preserves originating node_input on resume.' + ), +) +@pytest.mark.asyncio +async def test_valid_input_schema_accepted( + request: pytest.FixtureRequest, +): + """Valid dict matching input_schema passes through without error.""" + from . import testing_utils + + agent = _make_agent(mode='task', input_schema=StoryInput) + wrapper = build_node(agent) + capture = InputCapturingNode(name='capture') + wf = Workflow( + name='wf', + edges=[('START', wrapper), (wrapper, capture)], + ) + from unittest.mock import AsyncMock + from unittest.mock import MagicMock + + ctx = MagicMock(spec=Context) + ic = MagicMock() + ctx.get_invocation_context.return_value = ic + ctx._invocation_context = ic + ctx.resume_inputs = {} + ctx._output_for_ancestors = [] + ic.branch = None + ic.model_copy.return_value = ic + ic._enqueue_event = AsyncMock(return_value=None) + ic.plugin_manager.run_before_agent_callback = AsyncMock(return_value=None) + ic.plugin_manager.run_after_agent_callback = AsyncMock(return_value=None) + ctx.node_path = 'wf' + + agent_clone = next(n for n in wf.graph.nodes if n.name == wrapper.name) + with _mock_agent_run(agent_clone, finish_output={'result': 'ok'}): + async for _ in wf.run(ctx=ctx, node_input={'topic': 'Gemini'}): + pass + + assert capture.received_inputs == [{'result': 'ok'}] + + +# Skipping this test as _LlmAgentWrapper does not seem to validate input schema +# @pytest.mark.asyncio +# async def test_invalid_input_schema_raises( +# request: pytest.FixtureRequest, +# ): +# """Invalid input not matching input_schema raises ValidationError.""" +# agent = _make_agent(mode='task', input_schema=StoryInput) +# wrapper = build_node(agent) +# wf = Workflow(name='wf', edges=[(START, wrapper)]) +# ctx = await create_parent_invocation_context(request.function.__name__, wf) +# ic = ctx.model_copy(update={'branch': None}) +# agent_ctx = Context(invocation_context=ic, node_path='wf', run_id='exec') +# +# with _mock_agent_run(agent, finish_output={'result': 'ok'}): +# with pytest.raises(ValidationError): +# async for _ in wrapper.run(ctx=agent_ctx, node_input={'style': 'comedy'}): +# pass + + +@pytest.mark.xfail( + strict=True, + reason=( + "mode='task' workflow graph nodes temporarily disabled; re-enable " + 'when scheduler preserves originating node_input on resume.' + ), +) +@pytest.mark.asyncio +async def test_auto_wrap_in_workflow_edges(request: pytest.FixtureRequest): + """LlmAgent placed directly in edges is auto-wrapped and works.""" + from . import testing_utils + + agent = _make_agent(mode='task') + capture = InputCapturingNode(name='capture') + wf = Workflow( + name='wf', + edges=[('START', agent), (agent, capture)], + ) + runner = _new_workflow_runner(wf, request.function.__name__) + + agent_clone = next(n for n in wf.graph.nodes if n.name == agent.name) + with _mock_agent_run(agent_clone, finish_output={'result': 'auto'}): + await runner.run_async(testing_utils.get_user_content('start')) + + assert capture.received_inputs == [{'result': 'auto'}] + + +@pytest.mark.asyncio +async def test_single_turn_isolates_content_via_branch( + request: pytest.FixtureRequest, +): + """Single_turn wrapper sets a branch for content isolation.""" + agent = _make_agent(mode='single_turn') + wrapper = build_node(agent) + captured_branches = [] + + async def fake_run(invocation_context): + captured_branches.append(invocation_context.branch) + yield Event(output='response') + + from . import testing_utils + + wf = Workflow(name='wf', edges=[('START', wrapper)]) + runner = _new_workflow_runner(wf, request.function.__name__) + + agent_clone = next(n for n in wf.graph.nodes if n.name == wrapper.name) + original = agent_clone.run_async + object.__setattr__(agent_clone, 'run_async', fake_run) + try: + await runner.run_async(testing_utils.get_user_content('start')) + finally: + object.__setattr__(agent_clone, 'run_async', original) + + assert len(captured_branches) == 1 + assert captured_branches[0] is None + + +@pytest.mark.xfail( + strict=True, + reason=( + "mode='task' workflow graph nodes temporarily disabled; re-enable " + 'when scheduler preserves originating node_input on resume.' + ), +) +@pytest.mark.asyncio +async def test_task_mode_does_not_set_branch( + request: pytest.FixtureRequest, +): + """Task mode preserves None branch for HITL visibility.""" + agent = _make_agent(mode='task') + wrapper = build_node(agent) + captured_branches = [] + + async def fake_run(invocation_context): + captured_branches.append(invocation_context.branch) + yield Event( + invocation_id='inv', + author=agent.name, + content=types.Content( + role='model', + parts=[ + types.Part( + function_call=types.FunctionCall( + name='finish_task', + id='ft-2', + args={'output': {'result': 'done'}}, + ) + ) + ], + ), + ) + + from . import testing_utils + + wf = Workflow(name='wf', edges=[('START', wrapper)]) + runner = _new_workflow_runner(wf, request.function.__name__) + + agent_clone = next(n for n in wf.graph.nodes if n.name == wrapper.name) + original = agent_clone.run_async + object.__setattr__(agent_clone, 'run_async', fake_run) + try: + await runner.run_async(testing_utils.get_user_content('start')) + finally: + object.__setattr__(agent_clone, 'run_async', original) + + assert captured_branches == [None] + + +@pytest.mark.asyncio +async def test_single_turn_converts_input_to_content( + request: pytest.FixtureRequest, +): + """Single_turn wrapper converts string node_input to types.Content.""" + agent = _make_agent(mode='single_turn') + wrapper = build_node(agent) + captured_inputs = [] + + async def fake_run(*args, **kwargs): + ctx = args[0] + captured_inputs.append(ctx.session.events[-1].message) + yield Event(output='response') + + from . import testing_utils + + predecessor = TestingNode(name='pred', output='hello world') + wf = Workflow( + name='wf', + edges=[('START', predecessor), (predecessor, wrapper)], + ) + runner = _new_workflow_runner(wf, request.function.__name__) + + agent_clone = next(n for n in wf.graph.nodes if n.name == wrapper.name) + original = agent_clone.run_async + object.__setattr__(agent_clone, 'run_async', fake_run) + try: + await runner.run_async(testing_utils.get_user_content('start')) + finally: + object.__setattr__(agent_clone, 'run_async', original) + + assert len(captured_inputs) == 1 + assert isinstance(captured_inputs[0], types.Content) + assert captured_inputs[0].parts[0].text == 'hello world' + + +# --- New workflow path --- + + +def _get_user_content(): + from . import testing_utils + + return testing_utils.get_user_content + + +@pytest.mark.asyncio +async def test_react_path_user_content_visible_to_llm( + request: pytest.FixtureRequest, +): + """First-node LLM agent sees the user message in the new Workflow.""" + from google.adk.workflow._workflow import Workflow as NewWorkflow + + from . import testing_utils + + mock_model = testing_utils.MockModel.create(responses=['extracted output']) + agent = LlmAgent( + name='process_request', + model=mock_model, + instruction='Extract info from the user message.', + ) + wf = NewWorkflow(name='wf', edges=[('START', agent)]) + + runner = _new_workflow_runner(wf, request.function.__name__) + await runner.run_async( + testing_utils.get_user_content('I want 3 days off for vacation') + ) + + assert len(mock_model.requests) == 1 + user_texts = [ + p.text + for c in mock_model.requests[0].contents + if c.role == 'user' + for p in c.parts or [] + if p.text + ] + assert any('3 days' in t for t in user_texts) + + +@pytest.mark.skip( + reason=( + '_LlmAgentWrapper does not fully support new workflow path in this test' + ) +) +@pytest.mark.asyncio +async def test_react_path_output_reaches_downstream( + request: pytest.FixtureRequest, +): + """LLM output flows to the next node in the new Workflow.""" + from google.adk.workflow._workflow import Workflow as NewWorkflow + + from . import testing_utils + + mock_model = testing_utils.MockModel.create(responses=['hello world']) + agent = LlmAgent( + name='greeter', + model=mock_model, + instruction='Greet.', + ) + captured = [] + + def capture(node_input: str): + captured.append(node_input) + + wf = NewWorkflow(name='wf', edges=[('START', agent, capture)]) + + runner = _new_workflow_runner(wf, request.function.__name__) + await runner.run_async(testing_utils.get_user_content('hi')) + + assert captured == ['hello world'] + + +@pytest.mark.skip( + reason=( + '_LlmAgentWrapper does not fully support new workflow path in this test' + ) +) +@pytest.mark.asyncio +async def test_react_path_output_key_stored_in_state( + request: pytest.FixtureRequest, +): + """output_key stores LLM output in state in the new Workflow.""" + from google.adk.workflow._workflow import Workflow as NewWorkflow + + from . import testing_utils + + mock_model = testing_utils.MockModel.create(responses=['summary text']) + agent = LlmAgent( + name='summarizer', + model=mock_model, + instruction='Summarize.', + output_key='summary', + ) + captured_state = [] + + def check_state(ctx: Context): + captured_state.append(ctx.state.get('summary')) + + wf = NewWorkflow(name='wf', edges=[('START', agent, check_state)]) + + runner = _new_workflow_runner(wf, request.function.__name__) + await runner.run_async(testing_utils.get_user_content('some text')) + + assert captured_state == ['summary text'] + + +@pytest.mark.skip( + reason=( + '_LlmAgentWrapper does not fully support new workflow path in this test' + ) +) +@pytest.mark.asyncio +async def test_react_path_output_schema_validated( + request: pytest.FixtureRequest, +): + """output_schema is validated and parsed in the new Workflow.""" + from google.adk.workflow._workflow import Workflow as NewWorkflow + + from . import testing_utils + + mock_model = testing_utils.MockModel.create( + responses=['{"title": "My Story", "content": "Once upon a time"}'] + ) + agent = LlmAgent( + name='writer', + model=mock_model, + instruction='Write a story.', + output_schema=StoryOutput, + output_key='story', + ) + captured = [] + + def check_output(node_input: dict): + captured.append(node_input) + + wf = NewWorkflow(name='wf', edges=[('START', agent, check_output)]) + + runner = _new_workflow_runner(wf, request.function.__name__) + await runner.run_async(testing_utils.get_user_content('write')) + + assert len(captured) == 1 + assert captured[0]['title'] == 'My Story' + assert captured[0]['content'] == 'Once upon a time' + + +@pytest.mark.skip( + reason=( + '_LlmAgentWrapper does not fully support new workflow path in this test' + ) +) +@pytest.mark.asyncio +async def test_react_path_predecessor_input_visible_to_llm( + request: pytest.FixtureRequest, +): + """Predecessor output is injected as user content for the LLM.""" + from google.adk.workflow._workflow import Workflow as NewWorkflow + + from . import testing_utils + + mock_model = testing_utils.MockModel.create(responses=['processed']) + agent = LlmAgent( + name='processor', + model=mock_model, + instruction='Process.', + ) + + def step_one(node_input: str) -> str: + return 'transformed data' + + wf = NewWorkflow(name='wf', edges=[('START', step_one, agent)]) + + runner = _new_workflow_runner(wf, request.function.__name__) + await runner.run_async(testing_utils.get_user_content('raw input')) + + assert len(mock_model.requests) == 1 + user_texts = [ + p.text + for c in mock_model.requests[0].contents + if c.role == 'user' + for p in c.parts or [] + if p.text + ] + assert any('transformed data' in t for t in user_texts) + + +# --- React path: interrupt and resume --- + + +@pytest.mark.skip( + reason=( + '_LlmAgentWrapper does not fully support new workflow path in this test' + ) +) +@pytest.mark.asyncio +async def test_long_running_tool_interrupts_workflow( + request: pytest.FixtureRequest, +): + """Long-running tool stops the workflow after one LLM call.""" + from google.adk.tools.long_running_tool import LongRunningFunctionTool + from google.adk.workflow._workflow import Workflow as NewWorkflow + + from . import testing_utils + + def approve(request: str) -> None: + """Approve a request (long-running).""" + return None + + fc = types.Part.from_function_call(name='approve', args={'request': 'deploy'}) + mock_model = testing_utils.MockModel.create(responses=[fc]) + agent = LlmAgent( + name='approver', + model=mock_model, + instruction='Get approval.', + tools=[LongRunningFunctionTool(approve)], + ) + wf = NewWorkflow(name='wf', edges=[('START', agent)]) + + runner = _new_workflow_runner(wf, request.function.__name__) + events = await runner.run_async(testing_utils.get_user_content('deploy')) + + assert len(mock_model.requests) == 1 + assert any(e.long_running_tool_ids for e in events) + + +@pytest.mark.skip( + reason=( + '_LlmAgentWrapper does not fully support new workflow path in this test' + ) +) +@pytest.mark.asyncio +async def test_resume_after_interrupt_completes_workflow( + request: pytest.FixtureRequest, +): + """Resuming after interrupt calls the LLM once more to complete.""" + from google.adk.apps.app import App + from google.adk.apps.app import ResumabilityConfig + from google.adk.tools.long_running_tool import LongRunningFunctionTool + from google.adk.workflow._workflow import Workflow as NewWorkflow + + from . import testing_utils + + def approve(request: str) -> None: + """Approve a request (long-running).""" + return None + + fc = types.Part.from_function_call(name='approve', args={'request': 'deploy'}) + mock_model = testing_utils.MockModel.create( + responses=[fc, 'Approved and deployed.'] + ) + agent = LlmAgent( + name='approver', + model=mock_model, + instruction='Get approval.', + tools=[LongRunningFunctionTool(approve)], + ) + wf = NewWorkflow(name='wf', edges=[('START', agent)]) + + app = App( + name=request.function.__name__, + root_agent=wf, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: LLM → FC → interrupt + events1 = await runner.run_async( + testing_utils.get_user_content('deploy please') + ) + invocation_id = events1[0].invocation_id + assert any(e.long_running_tool_ids for e in events1) + + # Find the interrupt FC id + interrupt_event = next(e for e in events1 if e.long_running_tool_ids) + fc_id = list(interrupt_event.long_running_tool_ids)[0] + + # Run 2: Resume with FR + resume_msg = types.Content( + role='user', + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='approve', + id=fc_id, + response={'result': 'yes'}, + ) + ) + ], + ) + events2 = await runner.run_async( + new_message=resume_msg, + invocation_id=invocation_id, + ) + + # Total LLM calls: 1 (first run) + 1 (resume) = 2. + assert len(mock_model.requests) == 2 + # Verify resumed output reached completion. + content_texts = [ + p.text + for e in events2 + if e.content and e.content.parts + for p in e.content.parts + if p.text + ] + assert any('Approved and deployed.' in t for t in content_texts) + + +@pytest.mark.skip( + reason=( + '_LlmAgentWrapper does not fully support new workflow path in this test' + ) +) +@pytest.mark.asyncio +async def test_multiple_sequential_interrupts_in_workflow( + request: pytest.FixtureRequest, +): + """Two interrupts in sequence each resume and complete in a workflow.""" + from google.adk.apps.app import App + from google.adk.apps.app import ResumabilityConfig + from google.adk.tools.long_running_tool import LongRunningFunctionTool + from google.adk.workflow._workflow import Workflow as NewWorkflow + + from . import testing_utils + + def step_one() -> None: + """First long-running step.""" + return None + + def step_two() -> None: + """Second long-running step.""" + return None + + fc1 = types.Part.from_function_call(name='step_one', args={}) + fc2 = types.Part.from_function_call(name='step_two', args={}) + mock_model = testing_utils.MockModel.create(responses=[fc1, fc2, 'All done.']) + agent = LlmAgent( + name='worker', + model=mock_model, + instruction='Do two steps.', + tools=[ + LongRunningFunctionTool(step_one), + LongRunningFunctionTool(step_two), + ], + ) + wf = NewWorkflow(name='wf', edges=[('START', agent)]) + + app = App( + name=request.function.__name__, + root_agent=wf, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: LLM → FC1 → interrupt + events1 = await runner.run_async(testing_utils.get_user_content('Start')) + assert any(e.long_running_tool_ids for e in events1) + invocation_id = events1[0].invocation_id + interrupt1 = next(e for e in events1 if e.long_running_tool_ids) + fc1_id = list(interrupt1.long_running_tool_ids)[0] + + # Run 2: Resume FC1 → LLM → FC2 → interrupt again + events2 = await runner.run_async( + new_message=types.Content( + role='user', + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='step_one', + id=fc1_id, + response={'result': 'step1 done'}, + ) + ) + ], + ), + invocation_id=invocation_id, + ) + assert any(e.long_running_tool_ids for e in events2) + assert len(mock_model.requests) == 2 + interrupt2 = next(e for e in events2 if e.long_running_tool_ids) + fc2_id = list(interrupt2.long_running_tool_ids)[0] + + # Run 3: Resume FC2 → LLM → text → done + invocation_id2 = events2[0].invocation_id + events3 = await runner.run_async( + new_message=types.Content( + role='user', + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='step_two', + id=fc2_id, + response={'result': 'step2 done'}, + ) + ) + ], + ), + invocation_id=invocation_id2, + ) + + # Total: 3 LLM calls (one per run). + assert len(mock_model.requests) == 3 + content_texts = [ + p.text + for e in events3 + if e.content and e.content.parts + for p in e.content.parts + if p.text + ] + assert any('All done.' in t for t in content_texts) + + +# --- Original tests from test_v1_llm_agent_wrapper.py --- + + +def _make_v1_agent(mode='task'): + return LlmAgent( + name='test_v1_agent', + model='gemini-2.5-flash', + instruction='Test instruction', + mode=mode, + ) + + +def test_task_mode_sets_wait_for_output(): + agent = _make_v1_agent(mode='task') + wrapper = build_node(agent) + assert wrapper.wait_for_output is True + + +def test_single_turn_does_not_set_wait_for_output(): + agent = _make_v1_agent(mode='single_turn') + wrapper = build_node(agent) + assert wrapper.wait_for_output is False + + +def test_chat_mode_sets_wait_for_output(): + agent = _make_v1_agent(mode='chat') + wrapper = build_node(agent) + assert wrapper.wait_for_output is True + + +@pytest.mark.asyncio +async def test_task_mode_proceeds_on_finish_task(): + agent = _make_v1_agent(mode='task') + wrapper = build_node(agent) + + async def mock_run_async(*args, **kwargs): + yield Event( + invocation_id='inv', + author='test_v1_agent', + content=types.Content( + role='model', + parts=[ + types.Part( + function_call=types.FunctionCall( + name='finish_task', + id='ft-3', + args={'output': 'done_output'}, + ) + ) + ], + ), + ) + yield Event( + invocation_id='inv', + author='test_v1_agent', + content=types.Content( + role='user', + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='finish_task', + id='ft-3', + response={'result': 'Task completed.'}, + ) + ) + ], + ), + ) + + object.__setattr__(wrapper, 'run_async', mock_run_async) + + from unittest.mock import AsyncMock + from unittest.mock import MagicMock + + ctx = MagicMock(spec=Context) + ic = MagicMock() + ctx.get_invocation_context.return_value = ic + ic.model_copy.return_value = ic + ic.plugin_manager.run_before_agent_callback = AsyncMock(return_value=None) + ic.plugin_manager.run_after_agent_callback = AsyncMock(return_value=None) + ctx.node_path = 'wf' + + events = [] + async for e in wrapper._run_impl(ctx=ctx, node_input='hello'): + events.append(e) + + # Wrapper yields both the FC and the success FR; output is set on the FR. + assert len(events) == 2 + assert events[1].output == {'output': 'done_output'} + + +@pytest.mark.asyncio +async def test_task_mode_does_not_proceed_without_finish_task(): + agent = _make_v1_agent(mode='task') + wrapper = build_node(agent) + + async def mock_run_async(*args, **kwargs): + yield Event( + invocation_id='inv', + author='test_v1_agent', + content=types.Content(parts=[types.Part(text='Working...')]), + ) + + object.__setattr__(wrapper, 'run_async', mock_run_async) + + from unittest.mock import AsyncMock + from unittest.mock import MagicMock + + ctx = MagicMock(spec=Context) + ic = MagicMock() + ctx.get_invocation_context.return_value = ic + ic.model_copy.return_value = ic + ic.plugin_manager.run_before_agent_callback = AsyncMock(return_value=None) + ic.plugin_manager.run_after_agent_callback = AsyncMock(return_value=None) + ctx.node_path = 'wf' + + events = [] + async for e in wrapper._run_impl(ctx=ctx, node_input='hello'): + events.append(e) + + assert len(events) == 1 + assert events[0].output is None + + +@pytest.mark.asyncio +async def test_chat_mode_yields_events_directly(): + agent = _make_v1_agent(mode='chat') + wrapper = build_node(agent) + + async def mock_run_async(*args, **kwargs): + yield Event( + invocation_id='inv', + author='test_v1_agent', + content=types.Content(parts=[types.Part(text='Hello from chat')]), + ) + + object.__setattr__(wrapper, 'run_async', mock_run_async) + + from unittest.mock import AsyncMock + from unittest.mock import MagicMock + + ctx = MagicMock(spec=Context) + ic = MagicMock() + ctx.get_invocation_context.return_value = ic + ic.model_copy.return_value = ic + ic.plugin_manager.run_before_agent_callback = AsyncMock(return_value=None) + ic.plugin_manager.run_after_agent_callback = AsyncMock(return_value=None) + ctx.node_path = 'wf' + + events = [] + async for e in wrapper._run_impl(ctx=ctx, node_input='hello'): + events.append(e) + + assert len(events) == 1 + assert events[0].content.parts[0].text == 'Hello from chat' + assert events[0].output is None + + +def test_chat_mode_agent_following_non_start_raises_validation_error(): + """Wiring a chat-mode agent following a non-START node raises ValueError.""" + agent = _make_v1_agent(mode='chat') + predecessor = TestingNode(name='pred', output='some output') + + with pytest.raises(ValueError) as exc_info: + Workflow( + name='wf', + edges=[('START', predecessor), (predecessor, agent)], + ) + + assert ( + "The agent 'test_v1_agent' has been added to the workflow with" + " mode='chat' following node 'pred'." + in str(exc_info.value) + ) + + +def test_chat_mode_agent_from_start_allowed(): + """Wiring a chat-mode agent directly from START is allowed and validated without error.""" + agent = _make_v1_agent(mode='chat') + + wf = Workflow( + name='wf', + edges=[('START', agent)], + ) + assert wf.graph is not None + + +@pytest.mark.asyncio +async def test_three_layer_llm_agent_transfer_round_trip( + request: pytest.FixtureRequest, +): + """Verify 3-layer LlmAgent transfers end-to-end (Root -> Child -> Grandchild -> Child -> Root).""" + from google.adk.apps.app import App + from google.adk.apps.app import ResumabilityConfig + + from . import testing_utils + + # Prepare the transfer function call parts + fc_transfer_to_child = types.Part.from_function_call( + name='transfer_to_agent', + args={'agent_name': 'child_agent'}, + ) + fc_transfer_to_grandchild = types.Part.from_function_call( + name='transfer_to_agent', + args={'agent_name': 'grandchild_agent'}, + ) + fc_transfer_to_child_parent = types.Part.from_function_call( + name='transfer_to_agent', + args={'agent_name': 'child_agent'}, + ) + fc_transfer_to_root = types.Part.from_function_call( + name='transfer_to_agent', + args={'agent_name': 'root_agent'}, + ) + + # Mock models for 3 layers + root_model = testing_utils.MockModel.create( + responses=[fc_transfer_to_child, 'Welcome back to root!'] + ) + child_model = testing_utils.MockModel.create( + responses=[ + fc_transfer_to_grandchild, + 'Welcome back to child!', + fc_transfer_to_root, + ] + ) + grandchild_model = testing_utils.MockModel.create( + responses=['Hello, I am grandchild!', fc_transfer_to_child_parent] + ) + + # Instantiate agents + grandchild_agent = LlmAgent( + name='grandchild_agent', + model=grandchild_model, + instruction='Grandchild agent.', + ) + child_agent = LlmAgent( + name='child_agent', + model=child_model, + instruction='Child agent.', + sub_agents=[grandchild_agent], + ) + root_agent = LlmAgent( + name='root_agent', + model=root_model, + instruction='Root agent.', + sub_agents=[child_agent], + ) + + app = App( + name=request.function.__name__, + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Turn 1: Start (Root -> Child -> Grandchild -> Grandchild speaks) + events1 = await runner.run_async(testing_utils.get_user_content('Start')) + invocation_id = events1[0].invocation_id + + # Verify Turn 1 completed at Grandchild + content_texts1 = [ + p.text + for e in events1 + if e.content and e.content.parts + for p in e.content.parts + if p.text + ] + assert any('Hello, I am grandchild!' in t for t in content_texts1) + + # Turn 2: Go back to parent (Grandchild -> Child -> Child speaks) + events2 = await runner.run_async( + new_message=testing_utils.get_user_content('Go back to parent'), + invocation_id=invocation_id, + ) + + # Verify Turn 2 completed at Child + content_texts2 = [ + p.text + for e in events2 + if e.content and e.content.parts + for p in e.content.parts + if p.text + ] + assert any('Welcome back to child!' in t for t in content_texts2) + + # Turn 3: Go back to root (Child -> Root -> Root speaks) + events3 = await runner.run_async( + new_message=testing_utils.get_user_content('Go back to root'), + invocation_id=invocation_id, + ) + + # Verify Turn 3 completed at Root + content_texts3 = [ + p.text + for e in events3 + if e.content and e.content.parts + for p in e.content.parts + if p.text + ] + assert any('Welcome back to root!' in t for t in content_texts3) diff --git a/tests/unittests/workflow/test_node_runner_ctx.py b/tests/unittests/workflow/test_node_runner_ctx.py new file mode 100644 index 0000000000..fb2367122c --- /dev/null +++ b/tests/unittests/workflow/test_node_runner_ctx.py @@ -0,0 +1,608 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for NodeRunner → Context as result channel. + +Verifies that NodeRunner correctly populates ctx.output, ctx.route, +and ctx.interrupt_ids from yielded events and direct assignment, +and that resume state (prior_output, prior_interrupt_ids) is carried +forward correctly. +""" + +from unittest.mock import AsyncMock +from unittest.mock import MagicMock + +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.context import Context +from google.adk.agents.invocation_context import InvocationContext +from google.adk.events.event import Event +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.sessions.session import Session +from google.adk.workflow._base_node import BaseNode +from google.adk.workflow._node_runner import NodeRunner +from google.genai import types +import pytest + +# --- Helpers --- + + +def _make_ctx(invocation_id='inv-test', enqueue_events=None, node_path=''): + """Create a minimal Context mock with IC.""" + mock_agent = MagicMock(spec=BaseAgent) + real_session = Session( + id='test_session', app_name='test_app', user_id='test_user' + ) + real_session_service = InMemorySessionService() + + ic = InvocationContext( + invocation_id=invocation_id, + agent=mock_agent, + session=real_session, + session_service=real_session_service, + ) + + collected = enqueue_events if enqueue_events is not None else [] + + async def _enqueue(event): + collected.append(event) + + object.__setattr__(ic, '_enqueue_event', AsyncMock(side_effect=_enqueue)) + + ctx = Context( + invocation_context=ic, + node_path=node_path, + ) + return ctx, collected + + +# ========================================================================= +# Context as RESULT — fields populated by NodeRunner after execution +# ========================================================================= + + +# --- ctx.output from yielded events --- + + +@pytest.mark.asyncio +async def test_yield_value_sets_ctx_output(): + """Yielding a value sets ctx.output on the returned context.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield 'hello' + + parent_ctx, _ = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.output == 'hello' + + +@pytest.mark.asyncio +async def test_yield_event_output_sets_ctx_output(): + """Yielding Event(output=X) sets ctx.output.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield Event(output='from_event') + + parent_ctx, _ = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.output == 'from_event' + + +@pytest.mark.asyncio +async def test_no_yield_leaves_ctx_output_none(): + """A node that yields nothing leaves ctx.output as None.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + return + yield # noqa: unreachable + + parent_ctx, _ = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.output is None + + +# --- ctx.output set directly --- + + +@pytest.mark.asyncio +async def test_ctx_output_set_directly(): + """Setting ctx.output directly produces a deferred output event.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + ctx.output = 'direct' + yield # noqa: unreachable + + parent_ctx, events = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.output == 'direct' + output_events = [e for e in events if e.output is not None] + assert len(output_events) == 1 + assert output_events[0].output == 'direct' + + +@pytest.mark.asyncio +async def test_ctx_output_direct_with_state_delta(): + """Deferred output bundles pending state deltas onto the same event.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + ctx.state['key'] = 'val' + ctx.output = 'result' + yield # noqa: unreachable + + parent_ctx, events = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.output == 'result' + output_events = [e for e in events if e.output is not None] + assert len(output_events) == 1 + assert output_events[0].actions.state_delta['key'] == 'val' + + +@pytest.mark.asyncio +async def test_deferred_output_emitted_after_intermediate(): + """ctx.output set directly emits after intermediate content events.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + ctx.output = 'deferred' + yield Event(content=types.Content(parts=[types.Part(text='working')])) + + parent_ctx, events = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.output == 'deferred' + assert len(events) == 2 + assert events[0].content.parts[0].text == 'working' + assert events[1].output == 'deferred' + + +# --- ctx.output validation --- + + +@pytest.mark.asyncio +async def test_double_output_raises(): + """Setting ctx.output twice raises ValueError.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + ctx.output = 'first' + ctx.output = 'second' + yield # noqa: unreachable + + parent_ctx, events = _make_ctx() + await NodeRunner(node=_Node(name='n'), parent_ctx=parent_ctx).run() + error_events = [e for e in events if e.error_code] + assert len(error_events) == 1 + assert error_events[0].error_code == 'ValueError' + assert 'already set' in error_events[0].error_message + + +@pytest.mark.asyncio +async def test_yield_then_ctx_output_raises(): + """Yielding output then setting ctx.output raises ValueError.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield 'first' + ctx.output = 'second' + + parent_ctx, events = _make_ctx() + await NodeRunner(node=_Node(name='n'), parent_ctx=parent_ctx).run() + error_events = [e for e in events if e.error_code] + assert len(error_events) == 1 + assert error_events[0].error_code == 'ValueError' + assert 'already set' in error_events[0].error_message + + +# --- ctx.route --- + + +@pytest.mark.asyncio +async def test_yield_route_sets_ctx_route(): + """Yielding Event(route=R) sets ctx.route.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield Event(output='out', route='next') + + parent_ctx, _ = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.output == 'out' + assert child_ctx.route == 'next' + + +@pytest.mark.asyncio +async def test_ctx_route_set_directly(): + """Setting ctx.route directly is readable after run.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + ctx.route = 'branch_a' + yield 'out' + + parent_ctx, _ = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.route == 'branch_a' + + +# --- ctx.interrupt_ids --- + + +@pytest.mark.asyncio +async def test_interrupt_sets_ctx_interrupt_ids(): + """Yielding an interrupt event populates ctx.interrupt_ids.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + parent_ctx, _ = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.interrupt_ids == {'fc-1'} + assert child_ctx.output is None + + +@pytest.mark.asyncio +async def test_output_and_interrupt_coexist(): + """Output and interrupt can coexist across separate events.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield 'result' + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + parent_ctx, _ = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.output == 'result' + assert child_ctx.interrupt_ids == {'fc-1'} + + +@pytest.mark.asyncio +async def test_duplicate_interrupt_ids_deduplicated(): + """Duplicate interrupt IDs are deduplicated (set semantics).""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield Event(long_running_tool_ids={'fc-1', 'fc-2'}) + yield Event(long_running_tool_ids={'fc-2', 'fc-3'}) + + parent_ctx, _ = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.interrupt_ids == {'fc-1', 'fc-2', 'fc-3'} + + +# --- Output delegation (use_as_output) --- + + +@pytest.mark.asyncio +async def test_delegated_output_not_enqueued(): + """When output is delegated, the output event is not enqueued.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + ctx._output_delegated = True + yield 'delegated_value' + + parent_ctx, events = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.output == 'delegated_value' + output_events = [e for e in events if e.output is not None] + assert len(output_events) == 0 + + +@pytest.mark.asyncio +async def test_delegated_ctx_output_not_emitted(): + """When output is delegated and set via ctx.output, no event emitted.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + ctx._output_delegated = True + ctx.output = 'delegated_direct' + yield # noqa: unreachable + + parent_ctx, events = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), parent_ctx=parent_ctx + ).run() + + assert child_ctx.output == 'delegated_direct' + output_events = [e for e in events if e.output is not None] + assert len(output_events) == 0 + + +# ========================================================================= +# Context as INPUT — resume state provided to NodeRunner at construction +# ========================================================================= + + +@pytest.mark.asyncio +async def test_prior_output_carried_forward(): + """Prior output from a previous run is available on ctx.output.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + return + yield # noqa: unreachable + + parent_ctx, _ = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), + parent_ctx=parent_ctx, + prior_output='cached_result', + ).run() + + assert child_ctx.output == 'cached_result' + + +@pytest.mark.asyncio +async def test_prior_interrupt_ids_carried_forward(): + """Prior interrupt IDs from a previous run are on ctx.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + return + yield # noqa: unreachable + + parent_ctx, _ = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), + parent_ctx=parent_ctx, + prior_interrupt_ids={'fc-old'}, + ).run() + + assert 'fc-old' in child_ctx.interrupt_ids + + +@pytest.mark.asyncio +async def test_prior_and_new_interrupt_ids_merged(): + """New interrupt IDs are merged with prior ones.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-new' + ) + ) + ] + ), + long_running_tool_ids={'fc-new'}, + ) + + parent_ctx, _ = _make_ctx() + child_ctx = await NodeRunner( + node=_Node(name='n'), + parent_ctx=parent_ctx, + prior_interrupt_ids={'fc-old'}, + ).run() + + assert child_ctx.interrupt_ids == {'fc-old', 'fc-new'} + + +# ========================================================================= +# event_author — parent orchestrator overrides event author +# ========================================================================= + + +@pytest.mark.asyncio +async def test_event_author_defaults_to_node_name(): + """Without event_author, events use the node's own name.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield 'result' + + parent_ctx, events = _make_ctx() + await NodeRunner(node=_Node(name='my_node'), parent_ctx=parent_ctx).run() + + assert events[0].author == 'my_node' + + +@pytest.mark.asyncio +async def test_event_author_overrides_node_name(): + """When parent sets event_author, events use that instead.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield 'result' + + parent_ctx, events = _make_ctx() + parent_ctx.event_author = 'my_workflow' + await NodeRunner(node=_Node(name='my_node'), parent_ctx=parent_ctx).run() + + assert events[0].author == 'my_workflow' + + +@pytest.mark.asyncio +async def test_event_author_overrides_preset_author(): + """event_author always wins, even over a pre-set event author.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield Event(author='custom_author', output='result') + + parent_ctx, events = _make_ctx() + parent_ctx.event_author = 'my_workflow' + await NodeRunner(node=_Node(name='my_node'), parent_ctx=parent_ctx).run() + + assert events[0].author == 'my_workflow' + + +# ========================================================================= +# Branch propagation tests +# ========================================================================= + + +@pytest.mark.asyncio +async def test_override_branch_used_in_node_runner(): + """NodeRunner uses override_branch if provided.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield Event(output='result') + + parent_ctx, events = _make_ctx() + await NodeRunner( + node=_Node(name='n'), + parent_ctx=parent_ctx, + override_branch='custom_branch', + ).run() + + assert events[0].branch == 'custom_branch' + + +@pytest.mark.asyncio +async def test_use_sub_branch_appends_segment_to_branch(): + """NodeRunner appends node_name@run_id to branch when use_sub_branch is True.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield Event(output='result') + + parent_ctx, events = _make_ctx() + parent_ctx._invocation_context.branch = 'parent_branch' + await NodeRunner( + node=_Node(name='n'), + parent_ctx=parent_ctx, + use_sub_branch=True, + run_id='1', + ).run() + + assert events[0].branch == 'parent_branch.n@1' + + +@pytest.mark.asyncio +async def test_sequential_branch_propagation(): + """NodeRunner inherits parent branch when use_sub_branch is False.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield Event(output='result') + + parent_ctx, events = _make_ctx() + parent_ctx._invocation_context.branch = 'parent_branch' + await NodeRunner( + node=_Node(name='n'), + parent_ctx=parent_ctx, + use_sub_branch=False, + ).run() + + assert events[0].branch == 'parent_branch' + + +@pytest.mark.asyncio +async def test_override_isolation_scope_used_in_node_runner(): + """NodeRunner sets isolation_scope on child context and enriches emitted events.""" + + class _Node(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + assert ctx.isolation_scope == 'task:fc-999' + yield Event(output='result') + + parent_ctx, events = _make_ctx() + await NodeRunner( + node=_Node(name='n'), + parent_ctx=parent_ctx, + override_isolation_scope='task:fc-999', + ).run() + + assert events[0].isolation_scope == 'task:fc-999' diff --git a/tests/unittests/workflow/test_node_runner_failure.py b/tests/unittests/workflow/test_node_runner_failure.py new file mode 100644 index 0000000000..39ec0acb7f --- /dev/null +++ b/tests/unittests/workflow/test_node_runner_failure.py @@ -0,0 +1,1121 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for NodeRunner retry logic on failures.""" + +import asyncio +import sys +from typing import Any +from typing import AsyncGenerator +from unittest import mock + +from google.adk.agents.context import Context +from google.adk.events.event import Event +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.workflow import BaseNode +from google.adk.workflow import Edge +from google.adk.workflow import START +from google.adk.workflow._errors import NodeTimeoutError +from google.adk.workflow._graph import Graph +from google.adk.workflow._node import node +from google.adk.workflow._node import Node +from google.adk.workflow._node_status import NodeStatus +from google.adk.workflow._retry_config import RetryConfig +from google.adk.workflow._workflow import Workflow +from google.genai import types +from pydantic import ConfigDict +from pydantic import Field +import pytest +from typing_extensions import override + +from .workflow_testing_utils import _FlakyNode +from .workflow_testing_utils import create_parent_invocation_context +from .workflow_testing_utils import CustomNonRetryableError +from .workflow_testing_utils import CustomRetryableError +from .workflow_testing_utils import simplify_events_with_node +from .workflow_testing_utils import TestingNode + + +async def _run_workflow(wf, message='start'): + """Run a Workflow through Runner, return collected events.""" + ss = InMemorySessionService() + runner = Runner(app_name=wf.name, node=wf, session_service=ss) + session = await ss.create_session(app_name=wf.name, user_id='u') + msg = types.Content(parts=[types.Part(text=message)], role='user') + events = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + return events, ss, session + + +@pytest.mark.asyncio +async def test_node_retries_on_matched_exception_string( + request: pytest.FixtureRequest, +): + """A node retries when raised exception matches a string name in RetryConfig.exceptions. + + Setup: Workflow with NodeA -> FlakyNode -> NodeC. FlakyNode fails twice with CustomRetryableError. + Act: Run the workflow. + Assert: FlakyNode succeeds on 3rd attempt, full workflow completes. + """ + + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + # Node will fail 2 times, then succeed on 3rd attempt + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=3, + tracker=tracker, + exception_to_raise=CustomRetryableError('Simulated failure'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=['CustomRetryableError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + agent = Workflow( + name='test_workflow_agent_retry', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + + events, _, _ = await _run_workflow(agent) + + results = simplify_events_with_node(events) + filtered_results = [ + r + for r in results + if not (isinstance(r[1], str) and 'Retrying in' in r[1]) + ] + assert filtered_results == [ + ( + 'test_workflow_agent_retry@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_workflow_agent_retry@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_workflow_agent_retry@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 3 + + +@pytest.mark.asyncio +async def test_node_fails_immediately_on_unmatched_exception_string( + request: pytest.FixtureRequest, +): + """A node fails immediately when raised exception does not match configured string names. + + Setup: Workflow with NodeA -> FlakyNode -> NodeC. FlakyNode fails with CustomNonRetryableError. + Act: Run the workflow. + Assert: Execution completes normally and emits CustomNonRetryableError event immediately without retry. + """ + + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + # Node will fail 1 time + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=CustomNonRetryableError('Unexpected failure'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=['CustomRetryableError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + agent = Workflow( + name='test_workflow_agent_no_retry', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + + ss = InMemorySessionService() + runner = Runner(app_name=agent.name, node=agent, session_service=ss) + session = await ss.create_session(app_name=agent.name, user_id='u') + msg = types.Content(parts=[types.Part(text='start')], role='user') + events = [] + + # When the workflow is executed + with pytest.raises(CustomNonRetryableError): + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + # Assert that the node error is persisted in session as an event + error_events = [ + e + for e in events + if isinstance(e, Event) and e.error_code == 'CustomNonRetryableError' + ] + assert len(error_events) == 1 + assert error_events[0].error_message == 'Unexpected failure' + + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_no_retry@1/NodeA@1', + {'output': 'Executing A'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 1 + + +@pytest.mark.asyncio +async def test_retry_occurs_for_any_exception_when_exceptions_not_specified( + request: pytest.FixtureRequest, +): + """A node retries on any exception when RetryConfig.exceptions is not specified. + + Setup: Workflow with NodeA -> FlakyNode. FlakyNode fails once with ValueError. + Act: Run the workflow with exceptions=None in RetryConfig. + Assert: FlakyNode succeeds on 2nd attempt, workflow completes. + """ + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + # Node will fail 1 time, then succeed + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=ValueError('Any failure'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=None, + ), + ) + agent = Workflow( + name='test_workflow_agent_retry_all', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + ], + ) + + events, _, _ = await _run_workflow(agent) + + results = simplify_events_with_node(events) + filtered_results = [ + r + for r in results + if not (isinstance(r[1], str) and 'Retrying in' in r[1]) + ] + assert filtered_results == [ + ( + 'test_workflow_agent_retry_all@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_workflow_agent_retry_all@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 2 + + +@pytest.mark.asyncio +async def test_node_receives_incrementing_attempt_counts( + request: pytest.FixtureRequest, +): + """A node receives the current attempt count in its context for each attempt. + + Setup: Workflow with NodeA -> FlakyNode -> NodeC. FlakyNode fails twice before success. + Act: Run the workflow. + Assert: FlakyNode observes attempt_counts [1, 2, 3] in context across attempts. + """ + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + # Node will fail 2 times, then succeed on 3rd attempt + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=3, + tracker=tracker, + exception_to_raise=CustomRetryableError('Simulated failure'), + retry_config=RetryConfig( + initial_delay=0.0, exceptions=['CustomRetryableError'] + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + agent = Workflow( + name='test_retry_count_populated_correctly', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + + events, _, _ = await _run_workflow(agent) + + results = simplify_events_with_node(events) + filtered_results = [ + r + for r in results + if not (isinstance(r[1], str) and 'Retrying in' in r[1]) + ] + assert filtered_results == [ + ( + 'test_retry_count_populated_correctly@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_retry_count_populated_correctly@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_retry_count_populated_correctly@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 3 + assert flaky_node_in_agent.tracker['attempt_counts'] == [1, 2, 3] + + +@pytest.mark.asyncio +async def test_node_stops_retrying_after_max_attempts( + request: pytest.FixtureRequest, +): + """A node fails with the original exception after exceeding max_attempts. + + Setup: Workflow with NodeA -> FlakyNode -> NodeC. FlakyNode fails persistently, max_attempts=3. + Act: Run the workflow. + Assert: Execution completes normally and emits CustomRetryableError event after 3 total attempts. + """ + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + # Node will fail 4 times, but max_attempts is 3. + # Total attempts = 3 (1 initial + 2 retries). + # Attempt 1: retry_count = 0, fails. + # Attempt 2: retry_count = 1, fails. + # Attempt 3: retry_count = 2, fails. Now _should_retry_node returns False. + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=5, + tracker=tracker, + exception_to_raise=CustomRetryableError('Persisted failure'), + retry_config=RetryConfig( + initial_delay=0.0, + max_attempts=3, + exceptions=['CustomRetryableError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + agent = Workflow( + name='test_workflow_agent_max_attempts', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + + ss = InMemorySessionService() + runner = Runner(app_name=agent.name, node=agent, session_service=ss) + session = await ss.create_session(app_name=agent.name, user_id='u') + msg = types.Content(parts=[types.Part(text='start')], role='user') + events = [] + + # When the workflow is executed + with pytest.raises(CustomRetryableError): + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + # Assert that the node error is persisted in session as an event after max attempts + error_events = [ + e + for e in events + if isinstance(e, Event) and e.error_code == 'CustomRetryableError' + ] + assert len(error_events) == 3 + for err in error_events: + assert err.error_message == 'Persisted failure' + + results = simplify_events_with_node(events) + filtered_results = [ + r + for r in results + if not (isinstance(r[1], str) and 'Retrying in' in r[1]) + ] + assert filtered_results == [ + ( + 'test_workflow_agent_max_attempts@1/NodeA@1', + {'output': 'Executing A'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 3 + + +@pytest.mark.asyncio +async def test_node_fails_immediately_without_retry_config( + request: pytest.FixtureRequest, +): + """A node fails immediately on exception when it has no retry configuration. + + Setup: Workflow with NodeA -> FlakyNode. FlakyNode has retry_config=None. + Act: Run the workflow. + Assert: Execution completes normally and emits ValueError event immediately on first failure. + """ + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + # Node will fail 1 time + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=ValueError('Any failure'), + retry_config=None, + ) + agent = Workflow( + name='test_workflow_agent_fails_without_retry_config', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + ], + ) + + ss = InMemorySessionService() + runner = Runner(app_name=agent.name, node=agent, session_service=ss) + session = await ss.create_session(app_name=agent.name, user_id='u') + msg = types.Content(parts=[types.Part(text='start')], role='user') + events = [] + + # When the workflow is executed + with pytest.raises(ValueError): + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + # Assert that the node error is persisted in session as an event + error_events = [ + e for e in events if isinstance(e, Event) and e.error_code == 'ValueError' + ] + assert len(error_events) == 1 + assert error_events[0].error_message == 'Any failure' + + results = simplify_events_with_node(events) + filtered_results = [ + r + for r in results + if not (isinstance(r[1], str) and 'Retrying in' in r[1]) + ] + assert filtered_results == [ + ( + 'test_workflow_agent_fails_without_retry_config@1/NodeA@1', + {'output': 'Executing A'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 1 + + +@pytest.mark.asyncio +async def test_node_retries_with_default_config_when_empty( + request: pytest.FixtureRequest, +): + """A node uses default retry settings when provided with an empty RetryConfig. + + Setup: Workflow with NodeA -> FlakyNode. FlakyNode has empty RetryConfig(). + Act: Run the workflow. + Assert: FlakyNode succeeds on 2nd attempt using default retry behavior. + """ + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + # Node will fail 1 time, then succeed + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=ValueError('Another failure'), + retry_config=RetryConfig(), + ) + agent = Workflow( + name='test_workflow_agent_retries_with_empty_retry_config', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + ], + ) + + events, _, _ = await _run_workflow(agent) + + results = simplify_events_with_node(events) + filtered_results = [ + r + for r in results + if not (isinstance(r[1], str) and 'Retrying in' in r[1]) + ] + assert filtered_results == [ + ( + 'test_workflow_agent_retries_with_empty_retry_config@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_workflow_agent_retries_with_empty_retry_config@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 2 + + +@pytest.mark.asyncio +async def test_node_waits_for_initial_delay_before_retry( + request: pytest.FixtureRequest, +): + """A node sleeps for the specified initial delay before attempting a retry. + + Setup: Workflow with NodeA -> FlakyNode -> NodeC. FlakyNode has initial_delay=5.0. + Act: Run the workflow, mocking asyncio.sleep. + Assert: FlakyNode succeeds on 2nd attempt, sleep called with 5.0. + """ + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=CustomRetryableError('Sleep test failure'), + retry_config=RetryConfig( + initial_delay=5.0, + max_attempts=3, + jitter=0.0, + exceptions=['CustomRetryableError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + agent = Workflow( + name='test_workflow_agent_retry_delay', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + + ss = InMemorySessionService() + runner = Runner(app_name=agent.name, node=agent, session_service=ss) + session = await ss.create_session(app_name=agent.name, user_id='u') + msg = types.Content(parts=[types.Part(text='start')], role='user') + + with mock.patch.object( + asyncio, 'sleep', new_callable=mock.AsyncMock + ) as mock_sleep: + events = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + mock_sleep.assert_any_await(5.0) + + results = simplify_events_with_node(events) + filtered_results = [ + r + for r in results + if not (isinstance(r[1], str) and 'Retrying in' in r[1]) + ] + assert filtered_results == [ + ( + 'test_workflow_agent_retry_delay@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_workflow_agent_retry_delay@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_workflow_agent_retry_delay@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 2 + + +@pytest.mark.asyncio +async def test_retry_applies_backoff_strategy(request: pytest.FixtureRequest): + """A node increases sleep delay on subsequent retries according to the backoff factor. + + Setup: Workflow with NodeA -> FlakyNode -> NodeC. initial_delay=2.0, backoff_factor=3.0. + Act: Run the workflow, mocking asyncio.sleep. + Assert: Sleep called with delays [2.0, 2.0, 6.0] matching backoff math. + """ + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=4, # Fails 3 times + tracker=tracker, + exception_to_raise=CustomRetryableError('Backoff test failure'), + retry_config=RetryConfig( + initial_delay=2.0, + max_attempts=5, + backoff_factor=3.0, + jitter=0.0, + exceptions=['CustomRetryableError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + agent = Workflow( + name='test_workflow_agent_retry_backoff', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + + ss = InMemorySessionService() + runner = Runner(app_name=agent.name, node=agent, session_service=ss) + session = await ss.create_session(app_name=agent.name, user_id='u') + msg = types.Content(parts=[types.Part(text='start')], role='user') + + with mock.patch('asyncio.sleep', new_callable=mock.AsyncMock) as mock_sleep: + events = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + # Attempt 1 (First Retry): fails, delay = 2.0 * (3.0 ** 0) = 2.0 + # Attempt 2 (Second Retry): fails, delay = 2.0 * (3.0 ** 1) = 6.0 + # Attempt 3 (Third Retry): fails, delay = 2.0 * (3.0 ** 2) = 18.0 + mock_sleep.assert_has_awaits( + [mock.call(2.0), mock.call(6.0), mock.call(18.0)] + ) + + results = simplify_events_with_node(events) + filtered_results = [ + r + for r in results + if not (isinstance(r[1], str) and 'Retrying in' in r[1]) + ] + assert filtered_results == [ + ( + 'test_workflow_agent_retry_backoff@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_workflow_agent_retry_backoff@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_workflow_agent_retry_backoff@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 4 + + +@pytest.mark.asyncio +async def test_retry_applies_random_jitter(request: pytest.FixtureRequest): + """A node adjusts retry delay with random jitter when configured. + + Setup: Workflow with NodeA -> FlakyNode -> NodeC. jitter=0.5, initial_delay=4.0. + Act: Run the workflow, mocking random.uniform to return -1.0. + Assert: Sleep called with 3.0 (4.0 + -1.0). + """ + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=CustomRetryableError('Jitter test failure'), + retry_config=RetryConfig( + initial_delay=4.0, + max_attempts=3, + backoff_factor=1.0, + jitter=0.5, + exceptions=['CustomRetryableError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + agent = Workflow( + name='test_workflow_agent_retry_jitter', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + + ss = InMemorySessionService() + runner = Runner(app_name=agent.name, node=agent, session_service=ss) + session = await ss.create_session(app_name=agent.name, user_id='u') + msg = types.Content(parts=[types.Part(text='start')], role='user') + + with ( + mock.patch('asyncio.sleep', new_callable=mock.AsyncMock) as mock_sleep, + mock.patch('random.uniform', return_value=-1.0) as mock_random, + ): + events = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + # 4.0 + (-1.0) = 3.0 + mock_sleep.assert_any_await(3.0) + # Called with -0.5 * 4.0, 0.5 * 4.0 + mock_random.assert_called_once_with(-2.0, 2.0) + + results = simplify_events_with_node(events) + filtered_results = [ + r + for r in results + if not (isinstance(r[1], str) and 'Retrying in' in r[1]) + ] + assert filtered_results == [ + ( + 'test_workflow_agent_retry_jitter@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_workflow_agent_retry_jitter@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_workflow_agent_retry_jitter@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 2 + + +@pytest.mark.asyncio +async def test_node_retries_on_exception_class_match( + request: pytest.FixtureRequest, +): + """A node retries when raised exception matches a class type in RetryConfig.exceptions. + + Setup: Workflow with NodeA -> FlakyNode -> NodeC. exceptions=[CustomRetryableError] (class). + Act: Run the workflow. + Assert: FlakyNode succeeds on 3rd attempt after matching exception class. + """ + + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=3, + tracker=tracker, + exception_to_raise=CustomRetryableError('Simulated failure'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=[CustomRetryableError], # class, not string + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + agent = Workflow( + name='test_retry_exception_classes', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + + events, _, _ = await _run_workflow(agent) + + results = simplify_events_with_node(events) + filtered_results = [ + r + for r in results + if not (isinstance(r[1], str) and 'Retrying in' in r[1]) + ] + assert filtered_results == [ + ( + 'test_retry_exception_classes@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_retry_exception_classes@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_retry_exception_classes@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 3 + + +@pytest.mark.asyncio +async def test_node_retries_on_mixed_exception_types( + request: pytest.FixtureRequest, +): + """A node retries when exception matches either string name or class type in config. + + Setup: Workflow with NodeA -> FlakyNode -> NodeC. exceptions=[CustomRetryableError, 'ValueError']. + Act: Run the workflow. + Assert: FlakyNode succeeds on 2nd attempt after matching mixed types. + """ + + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=CustomRetryableError('Simulated failure'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=[CustomRetryableError, 'ValueError'], # mixed + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + agent = Workflow( + name='test_retry_mixed_exceptions', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + + events, _, _ = await _run_workflow(agent) + + results = simplify_events_with_node(events) + filtered_results = [ + r + for r in results + if not (isinstance(r[1], str) and 'Retrying in' in r[1]) + ] + assert filtered_results == [ + ( + 'test_retry_mixed_exceptions@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_retry_mixed_exceptions@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_retry_mixed_exceptions@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 2 + + +@pytest.mark.asyncio +async def test_node_fails_immediately_on_unmatched_exception_class( + request: pytest.FixtureRequest, +): + """A node fails immediately when raised exception does not match configured class types. + + Setup: Workflow with NodeA -> FlakyNode. exceptions=[CustomRetryableError] (class). + Act: Run the workflow. FlakyNode raises CustomNonRetryableError. + Assert: Execution completes normally and emits CustomNonRetryableError event immediately. + """ + + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=3, + tracker=tracker, + exception_to_raise=CustomNonRetryableError('Unexpected failure'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=[CustomRetryableError], # class, won't match + ), + ) + agent = Workflow( + name='test_retry_exception_class_no_match', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + ], + ) + + ss = InMemorySessionService() + runner = Runner(app_name=agent.name, node=agent, session_service=ss) + session = await ss.create_session(app_name=agent.name, user_id='u') + msg = types.Content(parts=[types.Part(text='start')], role='user') + events = [] + + # When the workflow is executed + with pytest.raises(CustomNonRetryableError): + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + # Assert that the node error is persisted in session as an event + error_events = [ + e + for e in events + if isinstance(e, Event) and e.error_code == 'CustomNonRetryableError' + ] + assert len(error_events) == 1 + assert error_events[0].error_message == 'Unexpected failure' + + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 1 + + +def test_retry_config_rejects_invalid_exception_types(): + """Tests that RetryConfig rejects non-string, non-class exception entries.""" + with pytest.raises(ValueError, match='exception class names'): + RetryConfig(exceptions=[42]) + + +def test_retry_config_normalizes_classes_to_strings(): + """Tests that exception classes are normalized to their names.""" + config = RetryConfig(exceptions=[ValueError, 'KeyError']) + assert config.exceptions == ['ValueError', 'KeyError'] + + +@pytest.mark.asyncio +async def test_error_event_emitted_on_failure( + request: pytest.FixtureRequest, +): + """Tests that an error event is emitted when a node raises an exception. + + Setup: Workflow with NodeA -> FlakyNode. FlakyNode fails with ValueError. + Act: Run the workflow. + Assert: Execution completes normally and emits ValueError event. + """ + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=999, + tracker=tracker, + exception_to_raise=ValueError('Something went wrong'), + retry_config=None, + ) + agent = Workflow( + name='test_error_event', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + ], + ) + + ss = InMemorySessionService() + runner = Runner(app_name=agent.name, node=agent, session_service=ss) + session = await ss.create_session(app_name=agent.name, user_id='u') + msg = types.Content(parts=[types.Part(text='start')], role='user') + events = [] + + # When the workflow is executed + with pytest.raises(ValueError): + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + # Find the error event emitted by the failed node. + error_events = [ + e + for e in events + if isinstance(e, Event) + and e.error_code is not None + and e.node_name == 'FlakyNode' + ] + assert len(error_events) == 1 + assert error_events[0].error_code == 'ValueError' + assert error_events[0].error_message == 'Something went wrong' + + +@pytest.mark.asyncio +async def test_error_event_emitted_on_each_retry( + request: pytest.FixtureRequest, +): + """Tests that an error event is emitted for each failed retry attempt.""" + tracker = {'iteration_count': 0} + + # Node will fail 2 times, then succeed on 3rd attempt + flaky_node = _FlakyNode( + name='FlakyNode', + message='Success', + succeed_on_iteration=3, + tracker=tracker, + exception_to_raise=CustomRetryableError('Transient error'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=['CustomRetryableError'], + ), + ) + agent = Workflow( + name='test_error_event_retry', + edges=[ + Edge(from_node=START, to_node=flaky_node), + ], + ) + + ss = InMemorySessionService() + runner = Runner(app_name=agent.name, node=agent, session_service=ss) + session = await ss.create_session(app_name=agent.name, user_id='u') + msg = types.Content(parts=[types.Part(text='start')], role='user') + events = [] + + # When the workflow is executed + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + # Two failures before success → two error events. + error_events = [ + e + for e in events + if isinstance(e, Event) + and e.error_code is not None + and e.node_name == 'FlakyNode' + ] + assert len(error_events) == 2 + for err in error_events: + assert err.error_code == 'CustomRetryableError' + assert err.error_message == 'Transient error' + + # The node should still produce its output after retries. + results = simplify_events_with_node(events) + filtered_results = [ + r + for r in results + if not (isinstance(r[1], str) and 'Retrying in' in r[1]) + ] + assert filtered_results == [ + ( + 'test_error_event_retry@1/FlakyNode@1', + {'output': 'Success'}, + ), + ] + + +@pytest.mark.skipif( + sys.version_info < (3, 11), reason='asyncio.timeout requires Python 3.11+' +) +async def test_node_runner_timeout(): + async def slow_route(ctx, node_input): + await asyncio.sleep(2) + return 'done' + + node = TestingNode(name='SlowNode', route=slow_route, timeout=0.1) + + agent = Workflow( + name='test_timeout', + edges=[(START, node)], + ) + + # Workflow should yield a timeout error event + with pytest.raises(NodeTimeoutError) as exc_info: + await _run_workflow(agent) + assert 'SlowNode' in str(exc_info.value) + assert 'timed out' in str(exc_info.value) + + +@pytest.mark.skip( + reason='Timeout is now supported in Python 3.10 via asyncio.wait_for', +) +async def test_node_runner_timeout_warning(caplog): + async def slow_route(ctx, node_input): + await asyncio.sleep(0.5) + return 'done' + + node = TestingNode(name='SlowNode', route=slow_route, timeout=0.1) + + agent = Workflow( + name='test_timeout_warning', + edges=[(START, node)], + ) + + await _run_workflow(agent) + + assert ( + 'timeout 0.10 seconds is ignored because Python version is < 3.11' + in caplog.text + ) diff --git a/tests/unittests/workflow/test_node_runner_integration.py b/tests/unittests/workflow/test_node_runner_integration.py new file mode 100644 index 0000000000..ebf724e92e --- /dev/null +++ b/tests/unittests/workflow/test_node_runner_integration.py @@ -0,0 +1,539 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for NodeRunner ↔ node integration. + +Verifies that NodeRunner correctly drives BaseNode.run(), enriches +events, flushes state/artifact deltas, and delivers events to the +session. +""" + +from typing import Any +from typing import AsyncGenerator +from unittest.mock import AsyncMock +from unittest.mock import MagicMock + +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.context import Context +from google.adk.agents.invocation_context import InvocationContext +from google.adk.events.event import Event +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.sessions.session import Session +from google.adk.workflow._base_node import BaseNode +from google.adk.workflow._node_runner import NodeRunner +from google.genai import types +import pytest + +# --- Test helper nodes --- + + +class _EchoNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield node_input + + +class _EmptyNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + return + yield + + +class _MultiEventNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(author='step1') + yield Event(author='step2') + yield Event(author='step3') + + +class _InterruptNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='long_tool', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + +class _InterruptThenMoreNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='long_tool', args={}, id='fc-2' + ) + ) + ] + ), + long_running_tool_ids={'fc-2'}, + ) + yield Event(author='after_interrupt_1') + yield Event(author='after_interrupt_2') + + +class _ErrorNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + raise RuntimeError('node failure') + yield # pylint: disable=unreachable + + +class _OutputWithRouteNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(output='routed_output', route='next') + + +class _StateMutatingNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + ctx.state['key1'] = 'value1' + ctx.state['key2'] = 42 + yield 'done' + + +class _ResumeInputReadingNode(BaseNode): + captured: list[Any] = [] + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + self.captured.append(ctx.resume_inputs) + yield 'resumed' + + +class _ArtifactSavingNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + ctx.actions.artifact_delta['doc.txt'] = 1 + yield 'saved' + + +# --- Helpers --- + + +def _make_ctx(invocation_id='inv-test', enqueue_events=None, node_path=''): + """Create a minimal Context mock with IC.""" + + mock_agent = MagicMock(spec=BaseAgent) + real_session = Session( + id='test_session', app_name='test_app', user_id='test_user' + ) + real_session_service = InMemorySessionService() + + ic = InvocationContext( + invocation_id=invocation_id, + agent=mock_agent, + session=real_session, + session_service=real_session_service, + ) + + collected = enqueue_events if enqueue_events is not None else [] + + async def _enqueue(event): + collected.append(event) + + object.__setattr__(ic, '_enqueue_event', AsyncMock(side_effect=_enqueue)) + + ctx = Context( + invocation_context=ic, + node_path=node_path, + ) + return ctx, collected + + +# --- Tests --- + + +@pytest.mark.asyncio +async def test_node_output_returned_in_result(): + """Running a node that produces output returns it in the result.""" + node = _EchoNode(name='echo') + ctx, _ = _make_ctx() + result = await NodeRunner(node=node, parent_ctx=ctx).run(node_input='hello') + assert result.output == 'hello' + assert result.interrupt_ids == set() + + +@pytest.mark.asyncio +async def test_no_output_returns_none(): + """Running a node that produces no output returns None.""" + node = _EmptyNode(name='empty') + ctx, _ = _make_ctx() + result = await NodeRunner(node=node, parent_ctx=ctx).run() + assert result.output is None + assert result.interrupt_ids == set() + + +@pytest.mark.asyncio +async def test_event_author_is_node_name(): + """Events are authored by the node's name.""" + node = _EchoNode(name='my_node') + ctx, events = _make_ctx() + await NodeRunner(node=node, parent_ctx=ctx).run(node_input='data') + + output_events = [e for e in events if e.output is not None] + assert output_events[0].author == 'my_node' + + +@pytest.mark.asyncio +async def test_event_path_contains_node_name(): + """Event node_info.path includes the node name and execution context.""" + node = _EchoNode(name='path_test') + ctx, events = _make_ctx(invocation_id='inv-123') + runner = NodeRunner(node=node, parent_ctx=ctx, run_id='exec-456') + await runner.run(node_input='data') + + output_events = [e for e in events if e.output is not None] + event = output_events[0] + assert event.node_info.path == 'path_test@exec-456' + assert event.invocation_id == 'inv-123' + + +@pytest.mark.asyncio +async def test_interrupt_captured_in_result(): + """A node that signals an interrupt reports it in the result.""" + node = _InterruptNode(name='interrupt_node') + ctx, _ = _make_ctx() + result = await NodeRunner(node=node, parent_ctx=ctx).run() + assert 'fc-1' in result.interrupt_ids + + +@pytest.mark.asyncio +async def test_node_continues_after_interrupt(): + """A node that interrupts can still produce more events before finishing.""" + node = _InterruptThenMoreNode(name='flag_finish') + ctx, events = _make_ctx() + result = await NodeRunner(node=node, parent_ctx=ctx).run() + assert 'fc-2' in result.interrupt_ids + assert len(events) >= 3 + + +@pytest.mark.asyncio +async def test_state_mutations_emitted_as_delta(): + """State changes made by a node are delivered as a separate event.""" + node = _StateMutatingNode(name='state_node') + ctx, events = _make_ctx() + await NodeRunner(node=node, parent_ctx=ctx).run() + + all_deltas = {} + for e in events: + if e.actions.state_delta: + all_deltas.update(e.actions.state_delta) + assert all_deltas.get('key1') == 'value1' + assert all_deltas.get('key2') == 42 + + +@pytest.mark.asyncio +async def test_artifact_delta_emitted(): + """Artifact saves made by a node are delivered as a delta event.""" + node = _ArtifactSavingNode(name='artifact_node') + ctx, events = _make_ctx() + await NodeRunner(node=node, parent_ctx=ctx).run() + + artifact_deltas = {} + for e in events: + if e.actions.artifact_delta: + artifact_deltas.update(e.actions.artifact_delta) + assert 'doc.txt' in artifact_deltas + + +@pytest.mark.asyncio +async def test_events_enqueued_in_yield_order(): + """Multiple events from a node arrive in the order they were produced.""" + node = _MultiEventNode(name='multi') + ctx, events = _make_ctx() + await NodeRunner(node=node, parent_ctx=ctx).run() + + # All 3 events enqueued, authored by node name (framework overrides). + assert len(events) == 3 + assert all(e.author == 'multi' for e in events) + + +@pytest.mark.asyncio +async def test_node_exception_propagates(): + """A node that raises an error surfaces it to the caller.""" + node = _ErrorNode(name='error_node') + ctx, events = _make_ctx() + child_ctx = await NodeRunner(node=node, parent_ctx=ctx).run() + + # Verify error is recorded on returned context + assert child_ctx.error is not None + assert isinstance(child_ctx.error, RuntimeError) + assert str(child_ctx.error) == 'node failure' + + # Verify error event was enqueued + error_events = [e for e in events if e.error_code] + assert len(error_events) == 1 + assert error_events[0].error_code == 'RuntimeError' + assert 'node failure' in error_events[0].error_message + + +@pytest.mark.asyncio +async def test_resume_inputs_available_on_context(): + """Resume inputs are accessible to the node during execution.""" + node = _ResumeInputReadingNode(name='resume_node') + node.captured = [] + ctx, _ = _make_ctx() + resume = {'int-1': 'user_response'} + await NodeRunner(node=node, parent_ctx=ctx).run(resume_inputs=resume) + assert node.captured[0] == resume + + +@pytest.mark.asyncio +async def test_node_path_includes_parent(): + """A child node's node_path is parent_node_path/child_name.""" + node = _EchoNode(name='child') + ctx, events = _make_ctx(node_path='parent_path') + runner = NodeRunner(node=node, parent_ctx=ctx) + await runner.run(node_input='x') + + output_events = [e for e in events if e.output is not None] + assert output_events[0].node_info.path == 'parent_path/child@1' + + +@pytest.mark.asyncio +async def test_run_id_generated_when_omitted(): + """Each node run gets a unique execution ID by default.""" + node = _EchoNode(name='auto_id') + ctx, _ = _make_ctx() + + runner = NodeRunner(node=node, parent_ctx=ctx) + + assert runner.run_id + assert isinstance(runner.run_id, str) + + +@pytest.mark.asyncio +async def test_explicit_run_id_used(): + """A caller-specified execution ID is used on the runner and events.""" + node = _EchoNode(name='explicit_id') + ctx, events = _make_ctx() + + runner = NodeRunner(node=node, parent_ctx=ctx, run_id='my-exec-id') + + assert runner.run_id == 'my-exec-id' + await runner.run(node_input='data') + assert events[0].node_info.path == 'explicit_id@my-exec-id' + + +@pytest.mark.asyncio +async def test_route_captured_in_result(): + """A node's routing decision is available in the result.""" + node = _OutputWithRouteNode(name='route_node') + ctx, _ = _make_ctx() + result = await NodeRunner(node=node, parent_ctx=ctx).run() + assert result.output == 'routed_output' + assert result.route == 'next' + + +@pytest.mark.asyncio +async def test_preset_author_overridden_by_framework(): + """Framework always sets author — preset author is overridden.""" + node = _MultiEventNode(name='multi') + ctx, events = _make_ctx() + await NodeRunner(node=node, parent_ctx=ctx).run() + + # All events get node name, not the preset 'step1'/'step2'/'step3'. + assert all(e.author == 'multi' for e in events) + + +class _MultiOutputNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(output='first') + yield Event(output='second') + + +@pytest.mark.asyncio +async def test_multiple_outputs_raises(): + """A node that produces more than one output is rejected.""" + node = _MultiOutputNode(name='multi_out') + ctx, events = _make_ctx() + await NodeRunner(node=node, parent_ctx=ctx).run() + error_events = [e for e in events if e.error_code] + assert len(error_events) == 1 + assert error_events[0].error_code == 'ValueError' + assert 'at most one output' in error_events[0].error_message + + +@pytest.mark.asyncio +async def test_all_events_delivered(): + """All events from a node are delivered to the session.""" + node = _EchoNode(name='enqueue_test') + ctx, events = _make_ctx() + await NodeRunner(node=node, parent_ctx=ctx).run(node_input='data') + assert len(events) >= 1 + + +# --- Delta flushing tests --- + + +@pytest.mark.asyncio +async def test_state_delta_bundled_with_output_event(): + """State deltas set before yield are flushed onto the output event.""" + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + ctx.state['color'] = 'blue' + ctx.state['count'] = 7 + yield 'result' + + ctx, events = _make_ctx() + + await NodeRunner(node=_Node(name='bundled'), parent_ctx=ctx).run() + + assert len(events) == 1 + assert events[0].output == 'result' + assert events[0].actions.state_delta.get('color') == 'blue' + assert events[0].actions.state_delta.get('count') == 7 + + +@pytest.mark.asyncio +async def test_state_after_last_yield_emitted_separately(): + """State set after the last yield is emitted as a separate event.""" + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield 'early' + ctx.state['late_key'] = 'late_value' + + ctx, events = _make_ctx() + + await NodeRunner(node=_Node(name='late_state'), parent_ctx=ctx).run() + + assert events[0].output == 'early' + assert events[1].actions.state_delta.get('late_key') == 'late_value' + + +@pytest.mark.asyncio +async def test_deltas_skip_partial_events(): + """Partial events carry no deltas — deltas flush to next non-partial.""" + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + ctx.state['before_partial'] = True + yield Event( + content=types.Content(parts=[types.Part(text='streaming...')]), + partial=True, + ) + ctx.state['after_partial'] = True + yield 'final' + + ctx, events = _make_ctx() + + await NodeRunner(node=_Node(name='partial_skip'), parent_ctx=ctx).run() + + assert events[0].partial is True + assert not events[0].actions or not events[0].actions.state_delta + assert events[1].output == 'final' + assert events[1].actions.state_delta.get('before_partial') is True + assert events[1].actions.state_delta.get('after_partial') is True + + +@pytest.mark.asyncio +async def test_artifact_and_state_bundled_together(): + """Both state and artifact deltas are flushed onto the same event.""" + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + ctx.state['s1'] = 'v1' + ctx.actions.artifact_delta['file.txt'] = 1 + yield 'done' + + ctx, events = _make_ctx() + + await NodeRunner(node=_Node(name='both_deltas'), parent_ctx=ctx).run() + + assert len(events) == 1 + assert events[0].output == 'done' + assert events[0].actions.state_delta.get('s1') == 'v1' + assert events[0].actions.artifact_delta.get('file.txt') == 1 + + +@pytest.mark.asyncio +async def test_node_input_schema_validation(): + """NodeRunner fails if node input does not match input_schema.""" + from pydantic import BaseModel + from pydantic import ValidationError + + class _MyInput(BaseModel): + name: str + age: int + + node = _EchoNode(name='schema_node', input_schema=_MyInput) + ctx, _ = _make_ctx() + + # Valid input (dict that matches schema) + result = await NodeRunner(node=node, parent_ctx=ctx).run( + node_input={'name': 'Alice', 'age': 30} + ) + + # _validate_schema converts model instances to dicts! + assert isinstance(result.output, dict) + assert result.output['name'] == 'Alice' + assert result.output['age'] == 30 + + # Invalid input (missing field) + result = await NodeRunner(node=node, parent_ctx=ctx).run( + node_input={'name': 'Alice'} + ) + + assert result.error is not None + assert isinstance(result.error, ValidationError) diff --git a/tests/unittests/workflow/test_state_schema.py b/tests/unittests/workflow/test_state_schema.py new file mode 100644 index 0000000000..0ba83cdd9d --- /dev/null +++ b/tests/unittests/workflow/test_state_schema.py @@ -0,0 +1,424 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for Workflow state_schema runtime enforcement.""" + +from __future__ import annotations + +from typing import Optional + +from google.adk.agents.context import Context +from google.adk.apps.app import App +from google.adk.events.event import Event +from google.adk.sessions.state import State +from google.adk.sessions.state import StateSchemaError +from google.adk.workflow import FunctionNode +from google.adk.workflow import START +from google.adk.workflow._workflow import Workflow +from pydantic import BaseModel +import pytest + +from .. import testing_utils +from .workflow_testing_utils import create_parent_invocation_context + +# ── Schema models for testing ──────────────────────────────────────── + + +class _PipelineSchema(BaseModel): + counter: int + name: str + optional_field: Optional[str] = None + + +class _NodeSchema(BaseModel): + x: int + y: int + + +# ── Unit tests: State validation ───────────────────────────────────── + + +def test_state_rejects_unknown_key() -> None: + """State with schema raises on unknown key.""" + state = State(value={}, delta={}, schema=_PipelineSchema) + with pytest.raises(StateSchemaError, match='bad_key'): + state['bad_key'] = 'value' + + +def test_state_accepts_declared_key() -> None: + """State with schema accepts keys that exist in the schema.""" + state = State(value={}, delta={}, schema=_PipelineSchema) + state['counter'] = 5 + state['name'] = 'hello' + assert state['counter'] == 5 + assert state['name'] == 'hello' + + +def test_state_rejects_wrong_type() -> None: + """State with schema raises when value type doesn't match annotation.""" + state = State(value={}, delta={}, schema=_PipelineSchema) + with pytest.raises(StateSchemaError, match='counter'): + state['counter'] = 'not_an_int' + + +def test_state_accepts_optional_none() -> None: + """Optional fields accept None.""" + state = State(value={}, delta={}, schema=_PipelineSchema) + state['optional_field'] = None + assert state['optional_field'] is None + + +def test_state_allows_prefixed_keys() -> None: + """Prefixed keys (app:, user:, temp:) bypass schema validation.""" + state = State(value={}, delta={}, schema=_PipelineSchema) + state['app:anything'] = 'value' + state['user:pref'] = 42 + state['temp:cache'] = [1, 2, 3] + assert state['app:anything'] == 'value' + + +def test_state_update_validates_all_keys() -> None: + """State.update validates each key-value pair.""" + state = State(value={}, delta={}, schema=_PipelineSchema) + with pytest.raises(StateSchemaError, match='unknown'): + state.update({'counter': 1, 'unknown': 'x'}) + + +def test_state_no_schema_allows_all() -> None: + """Without schema, any key/value is accepted (backward compat).""" + state = State(value={}, delta={}) + state['anything'] = 'goes' + state['whatever'] = 42 + assert state['anything'] == 'goes' + + +# ── Startup validation tests ───────────────────────────────────────── + + +def test_startup_rejects_mismatched_param() -> None: + """FunctionNode param not in state_schema raises at construction.""" + + def node_with_bad_param(ctx: Context, unknown_param: str) -> str: + return 'done' + + with pytest.raises(StateSchemaError, match='unknown_param'): + Workflow( + name='wf', + edges=[(START, node_with_bad_param)], + state_schema=_PipelineSchema, + ) + + +def test_startup_accepts_matching_params() -> None: + """FunctionNode params matching schema fields pass construction.""" + + def node_with_good_params(ctx: Context, counter: int, name: str) -> str: + return 'done' + + wf = Workflow( + name='wf', + edges=[(START, node_with_good_params)], + state_schema=_PipelineSchema, + ) + assert wf.state_schema is _PipelineSchema + + +def test_startup_skips_ctx_and_node_input() -> None: + """Framework params (ctx, node_input) are not checked against schema.""" + + def node_with_framework_params(ctx: Context, node_input: str) -> str: + return 'done' + + Workflow( + name='wf', + edges=[(START, node_with_framework_params)], + state_schema=_PipelineSchema, + ) + + +def test_startup_no_validation_when_schema_none() -> None: + """No startup validation when state_schema is not set.""" + + def node_with_any_param(ctx: Context, anything: str) -> str: + return 'done' + + Workflow( + name='wf', + edges=[(START, node_with_any_param)], + ) + + +def test_workflow_state_schema_field_exists() -> None: + """Workflow accepts a state_schema parameter.""" + + def produce_done(): + return Event(output='done') + + wf = Workflow( + name='wf', + edges=[(START, produce_done)], + state_schema=_PipelineSchema, + ) + assert wf.state_schema is _PipelineSchema + + +def test_workflow_state_schema_defaults_to_none() -> None: + """state_schema defaults to None when not provided.""" + + def produce_done(): + return Event(output='done') + + wf = Workflow( + name='wf', + edges=[(START, produce_done)], + ) + assert wf.state_schema is None + + +# ── Runtime enforcement tests (workflow execution) ─────────────────── + + +@pytest.mark.asyncio +async def test_workflow_valid_state_writes_succeed( + request: pytest.FixtureRequest, +) -> None: + """A workflow with valid state writes runs without errors.""" + + def write_state(ctx: Context) -> str: + ctx.state['counter'] = 5 + ctx.state['name'] = 'hello' + return 'done' + + wf = Workflow( + name='wf', + edges=[(START, write_state)], + state_schema=_PipelineSchema, + ) + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'done' for e in data_events) + + +@pytest.mark.asyncio +async def test_workflow_rejects_unknown_key_via_ctx_state( + request: pytest.FixtureRequest, +) -> None: + """ctx.state write with unknown key raises StateSchemaError.""" + + def write_bad_key(ctx: Context) -> str: + ctx.state['unknown_key'] = 'value' + return 'done' + + wf = Workflow( + name='wf', + edges=[(START, write_bad_key)], + state_schema=_PipelineSchema, + ) + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(StateSchemaError, match='unknown_key'): + await runner.run_async(testing_utils.get_user_content('start')) + + +@pytest.mark.asyncio +async def test_workflow_rejects_unknown_key_via_event_state( + request: pytest.FixtureRequest, +) -> None: + """Event(state={...}) with unknown key raises StateSchemaError.""" + + def emit_bad_state() -> Event: + return Event(state={'arbitrary_key': 'value'}, output='done') + + wf = Workflow( + name='wf', + edges=[(START, emit_bad_state)], + state_schema=_PipelineSchema, + ) + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(StateSchemaError, match='arbitrary_key'): + await runner.run_async(testing_utils.get_user_content('start')) + + +@pytest.mark.asyncio +async def test_workflow_accepts_valid_event_state( + request: pytest.FixtureRequest, +) -> None: + """Event(state={...}) with valid keys succeeds.""" + + def emit_valid_state() -> Event: + return Event(state={'counter': 10, 'name': 'ok'}, output='done') + + wf = Workflow( + name='wf', + edges=[(START, emit_valid_state)], + state_schema=_PipelineSchema, + ) + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'done' for e in data_events) + + +@pytest.mark.asyncio +async def test_workflow_allows_prefixed_keys_at_runtime( + request: pytest.FixtureRequest, +) -> None: + """Prefixed keys bypass schema validation during workflow execution.""" + + def write_prefixed(ctx: Context) -> str: + ctx.state['temp:debug'] = True + ctx.state['app:config'] = 'val' + return 'done' + + wf = Workflow( + name='wf', + edges=[(START, write_prefixed)], + state_schema=_PipelineSchema, + ) + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'done' for e in data_events) + + +@pytest.mark.asyncio +async def test_workflow_without_schema_allows_anything( + request: pytest.FixtureRequest, +) -> None: + """When state_schema=None, any key/value is accepted (backward compat).""" + + def write_anything(ctx: Context) -> str: + ctx.state['any_key'] = 'any_value' + ctx.state['another'] = 42 + return 'done' + + wf = Workflow( + name='wf', + edges=[(START, write_anything)], + ) + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'done' for e in data_events) + + +# ── Per-node state_schema tests ──────────────────────────────────── + + +@pytest.mark.asyncio +async def test_node_level_schema_validates_writes( + request: pytest.FixtureRequest, +) -> None: + """A FunctionNode with its own state_schema validates state writes.""" + + def write_bad_key(ctx: Context) -> str: + ctx.state['bad_key'] = 'value' + return 'done' + + node = FunctionNode( + name='guarded', + func=write_bad_key, + state_schema=_NodeSchema, + ) + wf = Workflow( + name='wf', + edges=[(START, node)], + ) + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(StateSchemaError, match='bad_key'): + await runner.run_async(testing_utils.get_user_content('start')) + + +@pytest.mark.asyncio +async def test_node_level_schema_accepts_valid_writes( + request: pytest.FixtureRequest, +) -> None: + """A FunctionNode with its own state_schema accepts declared keys.""" + + def write_good_keys(ctx: Context) -> str: + ctx.state['x'] = 1 + ctx.state['y'] = 2 + return 'done' + + node = FunctionNode( + name='guarded', + func=write_good_keys, + state_schema=_NodeSchema, + ) + wf = Workflow( + name='wf', + edges=[(START, node)], + ) + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'done' for e in data_events) + + +@pytest.mark.asyncio +async def test_node_schema_overrides_workflow_schema( + request: pytest.FixtureRequest, +) -> None: + """Node-level state_schema takes precedence over workflow-level schema.""" + + def write_node_key(ctx: Context) -> str: + ctx.state['x'] = 10 + return 'done' + + node = FunctionNode( + name='guarded', + func=write_node_key, + state_schema=_NodeSchema, + ) + wf = Workflow( + name='wf', + edges=[(START, node)], + state_schema=_PipelineSchema, + ) + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + # 'x' is in _NodeSchema but NOT in _PipelineSchema — should succeed + # because node schema overrides workflow schema + events = await runner.run_async(testing_utils.get_user_content('start')) + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'done' for e in data_events) + + +@pytest.mark.asyncio +async def test_node_without_schema_inherits_workflow_schema( + request: pytest.FixtureRequest, +) -> None: + """Node without state_schema inherits validation from parent workflow.""" + + def write_bad_key(ctx: Context) -> str: + ctx.state['unknown'] = 'value' + return 'done' + + wf = Workflow( + name='wf', + edges=[(START, write_bad_key)], + state_schema=_PipelineSchema, + ) + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(StateSchemaError, match='unknown'): + await runner.run_async(testing_utils.get_user_content('start')) diff --git a/tests/unittests/workflow/test_task_api_e2e.py b/tests/unittests/workflow/test_task_api_e2e.py new file mode 100644 index 0000000000..29bfb86d0c --- /dev/null +++ b/tests/unittests/workflow/test_task_api_e2e.py @@ -0,0 +1,525 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""End-to-end tests for the Task Delegation API matrix. + +Covers the complete cross-product of dispatch-shape × hierarchy-depth so +the chat-coordinator wrapper, the workflow-node task path, and the +nested-delegation path are all exercised: + +* LlmAgent root → single task sub-agent (basic FC delegation). +* LlmAgent root → multiple task sub-agents (sequential delegation). +* LlmAgent root → task sub-agent → nested task sub-agent (chained). +* Workflow with a task-mode node (no FC delegation). +* Workflow with a task-mode node that itself has a task sub-agent. +* Dynamic node case (task agent dispatched via ``ctx.run_node``). +""" + +from __future__ import annotations + +from typing import Any +from typing import AsyncGenerator + +from google.adk.agents.context import Context +from google.adk.agents.llm_agent import LlmAgent +from google.adk.apps.app import App +from google.adk.events.event import Event +from google.adk.workflow import node +from google.adk.workflow import START +from google.adk.workflow._base_node import BaseNode +from google.adk.workflow._workflow import Workflow +from google.genai import types +from pydantic import BaseModel +import pytest + +from tests.unittests import testing_utils + +# --------------------------------------------------------------------------- +# Fixture helpers +# --------------------------------------------------------------------------- + + +def _delegate_part(target_name: str, request_text: str) -> types.Part: + """LLM response calling a task sub-agent (the _TaskAgentTool FC).""" + return types.Part.from_function_call( + name=target_name, args={'request': request_text} + ) + + +def _finish_part(args: dict[str, Any]) -> types.Part: + """LLM response calling finish_task with the given args.""" + return types.Part.from_function_call(name='finish_task', args=args) + + +def _text_part(text: str) -> types.Part: + return types.Part.from_text(text=text) + + +def _make_task_agent( + name: str, + responses: list, + *, + sub_agents: list[LlmAgent] | None = None, +) -> LlmAgent: + return LlmAgent( + name=name, + model=testing_utils.MockModel.create(responses=responses), + mode='task', + sub_agents=sub_agents or [], + ) + + +def _collect_finish_outputs(events: list[Event]) -> list[Any]: + """Pull out finish_task FC arg dicts in chronological order.""" + out = [] + for e in events: + for fc in e.get_function_calls(): + if fc.name == 'finish_task': + out.append(dict(fc.args or {})) + return out + + +def _get_text_responses(events: list[Event]) -> list[str]: + """Concatenate text responses from all model events.""" + texts = [] + for e in events: + if not e.content or not e.content.parts: + continue + for p in e.content.parts: + if p.text and not p.thought: + texts.append(p.text) + return texts + + +# --------------------------------------------------------------------------- +# 1. LlmAgent root → single task sub-agent +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_chat_root_with_single_task_sub_agent( + request: pytest.FixtureRequest, +): + """Chat coordinator delegates to one task sub-agent and reports its output.""" + child = _make_task_agent( + name='child', + responses=[_finish_part({'result': 'child output'})], + ) + + root = LlmAgent( + name='root', + model=testing_utils.MockModel.create( + responses=[ + _delegate_part('child', 'do the thing'), + 'All done: child output.', + ] + ), + sub_agents=[child], + ) + + app = App(name=request.function.__name__, root_agent=root) + runner = testing_utils.InMemoryRunner(app=app) + + events = await runner.run_async(testing_utils.get_user_content('hi')) + + finish_args = _collect_finish_outputs(events) + assert finish_args == [{'result': 'child output'}] + assert any( + 'All done: child output.' in t for t in _get_text_responses(events) + ) + + +# --------------------------------------------------------------------------- +# 2. LlmAgent root → multiple task sub-agents (sequential) +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_chat_root_with_two_task_sub_agents_sequential( + request: pytest.FixtureRequest, +): + """Chat coordinator delegates to two task sub-agents in one turn.""" + collector = _make_task_agent( + name='collector', + responses=[_finish_part({'result': 'collected'})], + ) + payer = _make_task_agent( + name='payer', + responses=[_finish_part({'result': 'paid'})], + ) + + root = LlmAgent( + name='root', + model=testing_utils.MockModel.create( + responses=[ + _delegate_part('collector', 'collect'), + _delegate_part('payer', 'pay'), + 'Order placed.', + ] + ), + sub_agents=[collector, payer], + ) + + app = App(name=request.function.__name__, root_agent=root) + runner = testing_utils.InMemoryRunner(app=app) + + events = await runner.run_async(testing_utils.get_user_content('place order')) + + finish_args = _collect_finish_outputs(events) + assert finish_args == [{'result': 'collected'}, {'result': 'paid'}] + assert any('Order placed.' in t for t in _get_text_responses(events)) + + +# --------------------------------------------------------------------------- +# 3. LlmAgent root → task sub-agent → nested task sub-agent +# --------------------------------------------------------------------------- + + +@pytest.mark.xfail( + reason=( + 'Task-mode wrapper does not dispatch task-delegation FCs (only the ' + 'chat-mode wrapper does), so a task-mode middle agent cannot delegate ' + 'to its task sub-agent. Documented limitation.' + ), + strict=True, +) +@pytest.mark.asyncio +async def test_chat_root_with_nested_task_delegation( + request: pytest.FixtureRequest, +): + """Task agent itself has a task sub-agent and delegates further.""" + grandchild = _make_task_agent( + name='grandchild', + responses=[_finish_part({'result': 'leaf'})], + ) + + child = LlmAgent( + name='child', + model=testing_utils.MockModel.create( + responses=[ + _delegate_part('grandchild', 'leaf work'), + _finish_part({'result': 'middle wraps leaf'}), + ] + ), + mode='task', + sub_agents=[grandchild], + ) + + root = LlmAgent( + name='root', + model=testing_utils.MockModel.create( + responses=[ + _delegate_part('child', 'do the thing'), + 'Top-level done.', + ] + ), + sub_agents=[child], + ) + + app = App(name=request.function.__name__, root_agent=root) + runner = testing_utils.InMemoryRunner(app=app) + + events = await runner.run_async(testing_utils.get_user_content('hi')) + + finish_args = _collect_finish_outputs(events) + # grandchild fires first (deepest), then child. + assert finish_args == [ + {'result': 'leaf'}, + {'result': 'middle wraps leaf'}, + ] + assert any('Top-level done.' in t for t in _get_text_responses(events)) + + +# --------------------------------------------------------------------------- +# 4. Workflow with a single task-mode node (no FC delegation) +# --------------------------------------------------------------------------- + + +class _CaptureNode(BaseNode): + """Records its node_input for assertion.""" + + received: list[Any] = [] + + async def _run_impl(self, *, ctx, node_input): + type(self).received.append(node_input) + yield Event(output=node_input) + + +@pytest.mark.asyncio +async def test_workflow_rejects_task_mode_graph_node(): + """A mode='task' LlmAgent cannot be used as a static workflow graph node. + + Task agents are multi-turn and need their originating ``node_input`` + preserved across re-dispatches — which the workflow scheduler doesn't + do yet. Until that lands, ``Workflow`` rejects them at construction + time. Task agents are still supported as chat sub-agents (FC + delegation) and via dynamic ``ctx.run_node`` dispatch (see + test_dynamic_dispatch_of_task_agent). + """ + intake = _make_task_agent(name='intake', responses=[]) + capture = _CaptureNode(name='capture') + + with pytest.raises(ValueError, match="mode='task'"): + Workflow(name='wf', edges=[(START, intake), (intake, capture)]) + + +# --------------------------------------------------------------------------- +# 6. Dynamic node: function node that dispatches a task agent via ctx.run_node +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_dynamic_dispatch_of_task_agent( + request: pytest.FixtureRequest, +): + """A custom function node can dispatch a task agent and consume its output.""" + task_agent = _make_task_agent( + name='task_agent', + responses=[_finish_part({'result': 'dynamic output'})], + ) + + @node(rerun_on_resume=True) + async def driver(*, ctx: Context, node_input: Any): + output = await ctx.run_node(task_agent, node_input='go') + yield Event(output=f'wrapped: {output}') + + wf = Workflow(name='wf', edges=[(START, driver)]) + + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + + events = await runner.run_async(testing_utils.get_user_content('start')) + + outputs = [e.output for e in events if e.output] + assert any( + isinstance(o, str) and 'dynamic output' in o for o in outputs + ), f'expected wrapped dynamic output, got: {outputs}' + + +# --------------------------------------------------------------------------- +# 7. Validation error -> retry: wrapper yields the error FR and lets the LLM +# emit a corrected finish_task on the next round. +# --------------------------------------------------------------------------- + + +class _StrictOutput(BaseModel): + name: str + age: int + + +@pytest.mark.asyncio +async def test_task_validation_error_drives_retry( + request: pytest.FixtureRequest, +): + """Bad finish_task args produce an error FR; the LLM gets a retry.""" + # First finish_task call has wrong types (age as string), second is correct. + child_model = testing_utils.MockModel.create( + responses=[ + _finish_part({'name': 'Jane', 'age': 'thirty'}), + _finish_part({'name': 'Jane', 'age': 30}), + ] + ) + child = LlmAgent( + name='child', + model=child_model, + mode='task', + output_schema=_StrictOutput, + ) + + root = LlmAgent( + name='root', + model=testing_utils.MockModel.create( + responses=[ + _delegate_part('child', 'gather identity'), + 'All set.', + ] + ), + sub_agents=[child], + ) + + app = App(name=request.function.__name__, root_agent=root) + runner = testing_utils.InMemoryRunner(app=app) + + events = await runner.run_async(testing_utils.get_user_content('hi')) + + # The mock LLM was called twice for the child (the bad attempt + the + # corrected one), proving the wrapper looped instead of terminating + # on the first finish_task. + assert child_model.response_index == 1 + finish_args = _collect_finish_outputs(events) + assert finish_args == [ + {'name': 'Jane', 'age': 'thirty'}, + {'name': 'Jane', 'age': 30}, + ] + # The validation-error FR should be present in session for the LLM + # to see on its retry round. + error_frs = [ + fr.response + for e in events + for fr in e.get_function_responses() + if fr.name == 'finish_task' + and isinstance(fr.response, dict) + and 'error' in fr.response + ] + assert len(error_frs) == 1, f'expected one error FR, got {error_frs}' + + +# --------------------------------------------------------------------------- +# 8. Cross-turn resumption: an unresolved task FC from a prior turn is +# re-dispatched by the chat coordinator on the next user turn, before +# the LLM is called. +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_chat_coordinator_resumes_unresolved_task_fc( + request: pytest.FixtureRequest, +): + """Pending task FC from a prior turn is dispatched before the new LLM call.""" + child_model = testing_utils.MockModel.create( + responses=[_finish_part({'result': 'finished after resume'})] + ) + child = LlmAgent(name='child', model=child_model, mode='task') + + root_model = testing_utils.MockModel.create( + responses=[ + # Only response needed: post-resume continuation after the + # pre-LLM scan dispatches the pending task and synthesizes its FR. + 'Resumed and done.', + ] + ) + root = LlmAgent( + name='root', + model=root_model, + sub_agents=[child], + ) + + # Seed the session with an unresolved task delegation FC authored by + # root from a "prior turn". No matching FR exists. + from google.adk.sessions.in_memory_session_service import InMemorySessionService + + session_service = InMemorySessionService() + session = await session_service.create_session( + app_name=request.function.__name__, + user_id='u', + ) + await session_service.append_event( + session=session, + event=Event( + invocation_id='prior-inv', + author='root', + content=types.Content( + role='model', + parts=[ + types.Part( + function_call=types.FunctionCall( + id='fc-pending', + name='child', + args={'request': 'leftover work'}, + ) + ) + ], + ), + ), + ) + + from google.adk.runners import Runner + + app = App(name=request.function.__name__, root_agent=root) + runner = Runner(app=app, session_service=session_service) + + events = [] + async for ev in runner.run_async( + user_id='u', + session_id=session.id, + new_message=testing_utils.get_user_content('continue'), + ): + events.append(ev) + + # The child must have been dispatched once (resuming the pending FC). + assert ( + child_model.response_index == 0 + ), 'child LLM should have been called exactly once for the resumed task' + finish_args = _collect_finish_outputs(events) + assert { + 'result': 'finished after resume' + } in finish_args, f'expected resumed task to finish; got {finish_args}' + + +# --------------------------------------------------------------------------- +# 9. Strict isolation filtering: a stranger event with a foreign +# isolation_scope must NOT appear in the task agent's LLM context. +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_strict_isolation_filter_excludes_foreign_scope( + request: pytest.FixtureRequest, +): + """Garbage-scoped events are excluded from the task agent's view.""" + child_model = testing_utils.MockModel.create( + responses=[_finish_part({'result': 'ok'})] + ) + child = LlmAgent(name='child', model=child_model, mode='task') + + root = LlmAgent( + name='root', + model=testing_utils.MockModel.create( + responses=[ + _delegate_part('child', 'do the thing'), + 'Done.', + ] + ), + sub_agents=[child], + ) + + from google.adk.sessions.in_memory_session_service import InMemorySessionService + + session_service = InMemorySessionService() + session = await session_service.create_session( + app_name=request.function.__name__, + user_id='u', + ) + # Seed a stranger event with a different scope. + stranger = Event( + invocation_id='stranger-inv', + author='someone_else', + content=types.Content( + role='user', + parts=[types.Part(text='SECRET-SHOULD-NOT-LEAK')], + ), + ) + stranger.isolation_scope = 'garbage-scope' + session.events.append(stranger) + + from google.adk.runners import Runner + + app = App(name=request.function.__name__, root_agent=root) + runner = Runner(app=app, session_service=session_service) + + async for _ in runner.run_async( + user_id='u', + session_id=session.id, + new_message=testing_utils.get_user_content('go'), + ): + pass + + # Inspect the child's LLM request: SECRET text must not appear. + child_request = child_model.requests[0] + rendered = '\n'.join( + p.text or '' for c in child_request.contents or [] for p in c.parts or [] + ) + assert ( + 'SECRET-SHOULD-NOT-LEAK' not in rendered + ), 'stranger event leaked across isolation_scope filter' diff --git a/tests/unittests/workflow/test_workflow.py b/tests/unittests/workflow/test_workflow.py new file mode 100644 index 0000000000..d2d1eb3061 --- /dev/null +++ b/tests/unittests/workflow/test_workflow.py @@ -0,0 +1,2181 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for the new Workflow(BaseNode) implementation. + +Migrated from test_workflow_agent.py — each test validates the same +workflow behavior through Runner(node=...) instead of agent.run_async(). +""" + +from collections import Counter +from typing import Any +from typing import AsyncGenerator +import uuid + +from google.adk.agents.context import Context +from google.adk.events.event import Event +from google.adk.events.request_input import RequestInput +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.workflow._base_node import BaseNode +from google.adk.workflow._base_node import START +from google.adk.workflow._join_node import JoinNode +from google.adk.workflow._workflow import Workflow +from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_response +from google.genai import types +from pydantic import ConfigDict +from pydantic import Field +import pytest + +# --------------------------------------------------------------------------- +# Shared helper nodes (used by multiple tests) +# --------------------------------------------------------------------------- + + +def _make_function_call_interrupt(fc_id: str, name: str = 'approve') -> Event: + """Helper to create a raw function call interruption event.""" + return Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall(name=name, args={}, id=fc_id) + ) + ] + ), + long_running_tool_ids={fc_id}, + ) + + +class _OutputNode(BaseNode): + """Yields a fixed output value.""" + + value: Any = None + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield self.value + + +class _PassthroughNode(BaseNode): + """Passes node_input through as output.""" + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield node_input + + +class _RouteNode(BaseNode): + """Yields output and sets a route.""" + + value: Any = None + route_value: Any = None + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(output=self.value, route=self.route_value) + + +class _InputCapturingNode(BaseNode): + """Captures node_input for later assertion.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + received_inputs: list[Any] = Field(default_factory=list) + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + self.received_inputs.append(node_input) + yield {'received': node_input} + + +class _IntermediateContentNode(BaseNode): + """Yields intermediate content events before output.""" + + contents: list[types.Content] = Field(default_factory=list) + value: Any = None + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + for content in self.contents: + yield Event(content=content) + if self.value is not None: + yield self.value + + +class _BytesOutputNode(BaseNode): + """Yields bytes content or raw bytes.""" + + raw_bytes: bool = False + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + data = b'\x89PNG\r\n\x1a\n' + if self.raw_bytes: + yield data + else: + yield Event( + content=types.Content( + parts=[types.Part.from_bytes(data=data, mime_type='image/png')] + ), + output='bytes_sent', + ) + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +async def _run_workflow(wf, message='start'): + """Run a Workflow through Runner, return collected events.""" + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + msg = types.Content(parts=[types.Part(text=message)], role='user') + events = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + return events, ss, session + + +def _outputs(events): + """Extract non-None outputs from events.""" + return [e.output for e in events if e.output is not None] + + +def _output_by_node(events): + """Extract (node_name_from_path, output) for child node events.""" + results = [] + for e in events: + if e.output is not None and e.node_info.path and '/' in e.node_info.path: + node_name = e.node_info.path.rsplit('/', 1)[-1] + if '@' in node_name: + node_name = node_name.rsplit('@', 1)[0] + results.append((node_name, e.output)) + return results + + +# --------------------------------------------------------------------------- +# Tests — 1:1 mapping from test_workflow_agent.py +# --------------------------------------------------------------------------- + + +# 1. test_run_async → sequential A→B +@pytest.mark.asyncio +async def test_sequential_two_nodes(): + """Sequential A->B produces both outputs in order. + + Maps to: test_run_async in test_workflow_agent.py. + """ + a = _OutputNode(name='NodeA', value='Hello') + b = _OutputNode(name='NodeB', value='World') + wf = Workflow(name='wf', edges=[(START, a, b)]) + + events, _, _ = await _run_workflow(wf) + + by_node = _output_by_node(events) + assert ('NodeA', 'Hello') in by_node + assert ('NodeB', 'World') in by_node + assert by_node.index(('NodeA', 'Hello')) < by_node.index(('NodeB', 'World')) + + +# 2. test_run_async_with_intermediate_content +@pytest.mark.asyncio +async def test_intermediate_content_before_output(): + """Node yields content events before output. + + Maps to: test_run_async_with_intermediate_content in test_workflow_agent.py. + """ + a = _IntermediateContentNode( + name='NodeA', + contents=[ + types.Content(parts=[types.Part(text='msg1')]), + types.Content(parts=[types.Part(text='msg2')]), + ], + value='A output', + ) + wf = Workflow(name='wf', edges=[(START, a)]) + + events, _, _ = await _run_workflow(wf) + + texts = [ + p.text + for e in events + if e.content and e.content.parts + for p in e.content.parts + if p.text + ] + assert texts.index('msg1') < texts.index('msg2') # also asserts presence + assert 'A output' in _outputs(events) + + +# 3. test_run_async_with_loop_and_break +@pytest.mark.asyncio +async def test_loop_with_conditional_break(): + """Loop iterates 3 times: A,Check repeats, then exits to B. + + Maps to: test_run_async_with_loop_and_break in test_workflow_agent.py. + """ + + class _IncrementingNode(BaseNode): + + model_config = ConfigDict(arbitrary_types_allowed=True) + message: str = '' + _tracker_ref: list = [] + + def __init__(self, *, name: str, message: str, tracker: dict): + super().__init__(name=name) + object.__setattr__(self, 'message', message) + object.__setattr__(self, '_tracker_ref', [tracker]) + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + tracker = self._tracker_ref[0] + count = tracker.get('iteration_count', 0) + 1 + tracker['iteration_count'] = count + yield Event( + output=self.message, + route='continue_loop' if count < 3 else 'exit_loop', + ) + + tracker = {'iteration_count': 0} + node_a = _OutputNode(name='NodeA', value='Looping') + check = _IncrementingNode( + name='CheckNode', message='Checking', tracker=tracker + ) + node_b = _OutputNode(name='NodeB', value='Finished') + wf = Workflow( + name='wf', + edges=[ + (START, node_a, check), + (check, {'continue_loop': node_a, 'exit_loop': node_b}), + ], + ) + + events, _, _ = await _run_workflow(wf) + + assert tracker['iteration_count'] == 3 + by_node = _output_by_node(events) + node_names = [name for name, _ in by_node] + # 3 iterations of (NodeA, CheckNode) then NodeB + assert node_names.count('NodeA') == 3 + assert node_names.count('CheckNode') == 3 + assert 'NodeB' in node_names + + +# 4. test_resume_behavior +@pytest.mark.asyncio +async def test_resume_after_interrupt(): + """Workflow resumes from HITL interrupt and continues execution. + + Maps to: test_resume_behavior in test_workflow_agent.py. + Old test used crash/checkpoint resume. New test uses HITL interrupt/FR. + """ + + class _InterruptOnce(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + fc_id = ctx.state.get('_fc_id') + if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: + ctx.state['_fc_id'] = None + yield 'resumed' + return + + fc_id = f'fc-{uuid.uuid4().hex[:8]}' + ctx.state['_fc_id'] = fc_id + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='approve', args={}, id=fc_id + ) + ) + ] + ), + long_running_tool_ids={fc_id}, + ) + + a = _OutputNode(name='NodeA', value='A') + b = _InterruptOnce(name='NodeB') + c = _OutputNode(name='NodeC', value='C') + wf = Workflow(name='wf', edges=[(START, a, b, c)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: A completes, B interrupts + msg1 = types.Content(parts=[types.Part(text='go')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + # A completed, B interrupted + assert 'A' in [e.output for e in events1 if e.output is not None] + assert any(e.long_running_tool_ids for e in events1) + fc_id = None + for e in events1: + if e.long_running_tool_ids: + fc_id = list(e.long_running_tool_ids)[0] + + # Run 2: resume B, then C runs + msg2 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='approve', id=fc_id, response={'ok': True} + ) + ) + ], + role='user', + ) + events2: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events2.append(event) + + outputs = [e.output for e in events2 if e.output is not None] + assert 'resumed' in outputs + assert 'C' in outputs + + +@pytest.mark.asyncio +async def test_resume_with_schema_validation_failure(): + """Workflow raises ValueError when resume response fails validation.""" + + class _InterruptWithSchema(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + fc_id = ctx.state.get('_fc_id') + if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: + ctx.state['_fc_id'] = None + yield ctx.resume_inputs[fc_id] + return + + fc_id = f'fc-{uuid.uuid4().hex[:8]}' + ctx.state['_fc_id'] = fc_id + from google.adk.events.request_input import RequestInput + + yield RequestInput( + interrupt_id=fc_id, + prompt='Enter an integer', + response_schema={'type': 'integer'}, + ) + + a = _InterruptWithSchema(name='NodeA') + wf = Workflow(name='wf', edges=[(START, a)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg1 = types.Content(parts=[types.Part(text='go')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + fc_id = None + for e in events1: + if e.long_running_tool_ids: + fc_id = list(e.long_running_tool_ids)[0] + + msg2 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='adk_request_input', id=fc_id, response={'result': 'abc'} + ) + ) + ], + role='user', + ) + + with pytest.raises(ValueError, match='Validation failed for interrupt'): + async for _ in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + pass + + +@pytest.mark.asyncio +async def test_resume_with_schema_validation_failure_nested(): + """Workflow raises ValueError when resume response fails validation in nested workflow.""" + + class _InterruptWithSchema(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + fc_id = ctx.state.get('_fc_id') + if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: + ctx.state['_fc_id'] = None + yield ctx.resume_inputs[fc_id] + return + + fc_id = f'fc-{uuid.uuid4().hex[:8]}' + ctx.state['_fc_id'] = fc_id + from google.adk.events.request_input import RequestInput + + yield RequestInput( + interrupt_id=fc_id, + prompt='Enter an integer', + response_schema={'type': 'integer'}, + ) + + inner_wf = Workflow( + name='inner_wf', edges=[(START, _InterruptWithSchema(name='NodeA'))] + ) + outer_wf = Workflow(name='outer_wf', edges=[(START, inner_wf)]) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=outer_wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg1 = types.Content(parts=[types.Part(text='go')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + fc_id = None + for e in events1: + if e.long_running_tool_ids: + fc_id = list(e.long_running_tool_ids)[0] + + msg2 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='adk_request_input', id=fc_id, response={'result': 'abc'} + ) + ) + ], + role='user', + ) + + with pytest.raises(ValueError, match='Validation failed for interrupt'): + async for _ in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + pass + + +@pytest.mark.asyncio +async def test_resume_with_schema_validation_failure_no_rerun(): + """Workflow raises ValueError when resume response fails validation even if rerun_on_resume is False.""" + + class _InterruptWithSchema(BaseNode): + rerun_on_resume: bool = False + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + fc_id = ctx.state.get('_fc_id') + if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: + ctx.state['_fc_id'] = None + yield ctx.resume_inputs[fc_id] + return + + fc_id = f'fc-{uuid.uuid4().hex[:8]}' + ctx.state['_fc_id'] = fc_id + from google.adk.events.request_input import RequestInput + + yield RequestInput( + interrupt_id=fc_id, + prompt='Enter an integer', + response_schema={'type': 'integer'}, + ) + + a = _InterruptWithSchema(name='NodeA') + wf = Workflow(name='wf', edges=[(START, a)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg1 = types.Content(parts=[types.Part(text='go')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + fc_id = None + for e in events1: + if e.long_running_tool_ids: + fc_id = list(e.long_running_tool_ids)[0] + + msg2 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='adk_request_input', id=fc_id, response={'result': 'abc'} + ) + ) + ], + role='user', + ) + + with pytest.raises(ValueError, match='Validation failed for interrupt'): + async for _ in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + pass + + +# 5. test_agent_state_event_recorded +@pytest.mark.asyncio +async def test_internal_interrupt_event_not_persisted(): + """Workflow interrupt event is _adk_internal — not in session. + + Maps to: test_agent_state_event_recorded in test_workflow_agent.py. + Old test verified checkpoint events. New test verifies the workflow's + interrupt event is NOT persisted (child's event is sufficient). + """ + + class _InterruptNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + wf = Workflow(name='wf', edges=[(START, _InterruptNode(name='ask'))]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='go')], role='user') + events: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + # Caller should see the child's interrupt event + assert any(e.long_running_tool_ids for e in events) + + # Session should NOT have the workflow-level interrupt event + updated = await ss.get_session( + app_name='test', user_id='u', session_id=session.id + ) + wf_interrupt_events = [ + e + for e in updated.events + if e.long_running_tool_ids and e.node_info.path == 'wf@1' + ] + assert wf_interrupt_events == [] + # But child's interrupt event SHOULD be in session + child_interrupt_events = [ + e + for e in updated.events + if e.long_running_tool_ids + and e.node_info.path + and e.node_info.path.endswith('ask@1') + ] + assert len(child_interrupt_events) == 1 + + +# 6. test_run_async_with_implicit_graph +@pytest.mark.asyncio +async def test_edge_tuple_syntax(): + """Edges defined via tuples work. + + Maps to: test_run_async_with_implicit_graph in test_workflow_agent.py. + """ + a = _OutputNode(name='NodeA', value='Hello') + b = _OutputNode(name='NodeB', value='World') + wf = Workflow( + name='wf', + edges=[ + (START, a), + (a, b), + ], + ) + + events, _, _ = await _run_workflow(wf) + + outputs = _outputs(events) + assert outputs.index('Hello') < outputs.index( + 'World' + ) # also asserts presence + + +# 7. test_run_async_with_string_start +@pytest.mark.asyncio +async def test_string_start_in_edges(): + """'START' string works as edge source. + + Maps to: test_run_async_with_string_start in test_workflow_agent.py. + """ + a = _OutputNode(name='NodeA', value='Hello') + wf = Workflow(name='wf', edges=[('START', a)]) + + events, _, _ = await _run_workflow(wf) + + assert 'Hello' in _outputs(events) + + +# 8. test_run_async_with_implicit_graph_with_edge_combinations +@pytest.mark.asyncio +async def test_mixed_edge_and_tuple_syntax(): + """Mix of Edge objects and tuple syntax in a 3-node chain. + + Maps to: test_run_async_with_implicit_graph_with_edge_combinations + in test_workflow_agent.py. + """ + from google.adk.workflow._graph import Edge as GraphEdge + + a = _OutputNode(name='NodeA', value='A') + b = _OutputNode(name='NodeB', value='B') + c = _OutputNode(name='NodeC', value='C') + wf = Workflow( + name='wf', + edges=[ + (START, a), + GraphEdge(from_node=a, to_node=b), + (b, c), + ], + ) + + events, _, _ = await _run_workflow(wf) + + by_node = _output_by_node(events) + assert by_node.index(('NodeA', 'A')) < by_node.index( + ('NodeB', 'B') + ) # also asserts presence + assert by_node.index(('NodeB', 'B')) < by_node.index(('NodeC', 'C')) + + +# 9. test_run_async_with_update_state_event +@pytest.mark.asyncio +async def test_state_update_via_event_persisted(): + """State updates via Event(state=...) are persisted to session. + + Maps to: test_run_async_with_update_state_event in test_workflow_agent.py. + """ + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(state={'key1': 'value1'}) + + wf = Workflow(name='wf', edges=[(START, _Node(name='NodeA'))]) + + events, ss, session = await _run_workflow(wf) + updated = await ss.get_session( + app_name='test', user_id='u', session_id=session.id + ) + + assert updated.state.get('key1') == 'value1' + + +# 11. test_run_async_with_raw_output_node +@pytest.mark.asyncio +async def test_raw_output_auto_wrapped(): + """Node yields raw value, auto-wrapped to Event(output=...). + + Maps to: test_run_async_with_raw_output_node in test_workflow_agent.py. + """ + a = _OutputNode(name='NodeA', value='raw_data') + wf = Workflow(name='wf', edges=[(START, a)]) + + events, _, _ = await _run_workflow(wf) + + assert 'raw_data' in _outputs(events) + + +# 12. test_node_output_event_with_content_data +@pytest.mark.asyncio +async def test_content_return_produces_content_event(): + """FunctionNode returning Content yields content event, not output. + + Maps to: test_node_output_event_with_content_data + in test_workflow_agent.py. + """ + + def content_fn() -> types.Content: + return types.Content(parts=[types.Part(text='hello')]) + + wf = Workflow(name='wf', edges=[(START, content_fn)]) + + events, _, _ = await _run_workflow(wf) + + fn_events = [ + e for e in events if e.node_info.path and 'content_fn' in e.node_info.path + ] + assert len(fn_events) == 1 + assert fn_events[0].output is None + assert fn_events[0].content == types.Content(parts=[types.Part(text='hello')]) + + +# 13. test_input_propagation_linear +@pytest.mark.asyncio +async def test_input_propagation_linear(): + """Output of A becomes input to B. + + Maps to: test_input_propagation_linear in test_workflow_agent.py. + """ + a = _OutputNode(name='NodeA', value='from_a') + b = _InputCapturingNode(name='NodeB') + wf = Workflow(name='wf', edges=[(START, a, b)]) + + events, _, _ = await _run_workflow(wf) + + assert b.received_inputs == ['from_a'] + + +# 14. test_input_propagation_fan_in_sequential +@pytest.mark.asyncio +async def test_input_propagation_fan_in(): + """Fan-in with asymmetric branches: C receives from A and B3. + + Maps to: test_input_propagation_fan_in_sequential + in test_workflow_agent.py. + """ + a = _OutputNode(name='NodeA', value='from_a') + b = _OutputNode(name='NodeB', value='from_b') + b2 = _PassthroughNode(name='NodeB2') + b3 = _PassthroughNode(name='NodeB3') + c = _InputCapturingNode(name='NodeC') + wf = Workflow( + name='wf', + edges=[ + (START, a), + (START, b, b2, b3), + (a, c), + (b3, c), + ], + ) + + events, _, _ = await _run_workflow(wf) + + assert Counter(c.received_inputs) == Counter(['from_a', 'from_b']) + + +# 15. test_start_node_receives_user_content +@pytest.mark.asyncio +async def test_start_node_receives_user_content(): + """First node receives user message as input. + + Maps to: test_start_node_receives_user_content + in test_workflow_agent.py. + """ + a = _InputCapturingNode(name='NodeA') + wf = Workflow(name='wf', edges=[(START, a)]) + + events, _, _ = await _run_workflow(wf, message='hello') + + assert len(a.received_inputs) == 1 + assert a.received_inputs[0].parts[0].text == 'hello' + + +# 18. test_wait_for_output_suppresses_trigger + + +@pytest.mark.asyncio +async def test_wait_for_output_suppresses_downstream(): + """wait_for_output=True with no output prevents downstream from running. + + Maps to: test_wait_for_output_suppresses_trigger + in test_workflow_agent.py. + """ + + class _NoOutputNode(BaseNode): + wait_for_output: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(state={'seen': True}) + + blocker = _NoOutputNode(name='blocker') + downstream = _OutputNode(name='downstream', value='should_not_run') + wf = Workflow( + name='wf', + edges=[ + (START, blocker), + (blocker, downstream), + ], + ) + + events, _, _ = await _run_workflow(wf) + + assert 'should_not_run' not in _outputs(events) + + +# 19. test_wait_for_output_retrigger_then_complete +@pytest.mark.asyncio +async def test_wait_for_output_completes_after_all(): + """Gate with wait_for_output opens after 2 triggers, fires downstream. + + Maps to: test_wait_for_output_retrigger_then_complete + in test_workflow_agent.py. + """ + + class _GateNode(BaseNode): + triggers_needed: int = 2 + wait_for_output: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + count = (ctx.state.get(f'{self.name}_count') or 0) + 1 + if count >= self.triggers_needed: + yield Event( + output='gate_open', + state={f'{self.name}_count': None}, + ) + else: + yield Event(state={f'{self.name}_count': count}) + + gate = _GateNode(name='Gate', triggers_needed=2) + a = _OutputNode(name='NodeA', value='A') + b = _OutputNode(name='NodeB', value='B') + downstream = _OutputNode(name='Downstream', value='done') + wf = Workflow( + name='wf', + edges=[ + (START, a, gate, downstream), + (START, b, gate), + ], + ) + + events, _, _ = await _run_workflow(wf) + by_node = _output_by_node(events) + + # A and B run first (parallel), then Gate opens, then Downstream + assert len(by_node) == 4 + first_two = {by_node[0][0], by_node[1][0]} + assert first_two == {'NodeA', 'NodeB'} + assert by_node[2] == ('Gate', 'gate_open') + assert by_node[3] == ('Downstream', 'done') + + +# 25. test_run_async_with_implicit_graph_chain +@pytest.mark.asyncio +async def test_chain_syntax(): + """(START, a, b, c) creates sequential chain producing all outputs. + + Maps to: test_run_async_with_implicit_graph_chain + in test_workflow_agent.py. + """ + a = _OutputNode(name='a', value='A') + b = _OutputNode(name='b', value='B') + c = _OutputNode(name='c', value='C') + wf = Workflow(name='wf', edges=[(START, a, b, c)]) + + events, _, _ = await _run_workflow(wf) + by_node = _output_by_node(events) + + assert [name for name, _ in by_node] == ['a', 'b', 'c'] + assert [val for _, val in by_node] == ['A', 'B', 'C'] + + +# 26. test_run_async_with_implicit_graph_fan_out +@pytest.mark.asyncio +async def test_fan_out(): + """Fan-out to multiple terminals raises ValueError. + + Maps to: test_run_async_with_implicit_graph_fan_out + in test_workflow_agent.py. + """ + a = _OutputNode(name='a', value='A') + b = _InputCapturingNode(name='b') + c = _InputCapturingNode(name='c') + wf = Workflow( + name='wf', + edges=[ + (START, a), + (a, (b, c)), + ], + ) + + with pytest.raises(ValueError, match='multiple terminal nodes'): + await _run_workflow(wf) + + +# 27. test_run_async_with_implicit_graph_fan_in +@pytest.mark.asyncio +async def test_fan_in(): + """((a, b), c) — c triggered by both a and b. + + Maps to: test_run_async_with_implicit_graph_fan_in + in test_workflow_agent.py. + """ + a = _OutputNode(name='a', value='A') + b = _OutputNode(name='b', value='B') + c = _InputCapturingNode(name='c') + wf = Workflow( + name='wf', + edges=[ + (START, (a, b)), + ((a, b), c), + ], + ) + + events, _, _ = await _run_workflow(wf) + + assert Counter(c.received_inputs) == Counter(['A', 'B']) + + +# 28. test_run_async_with_implicit_graph_fan_out_fan_in +@pytest.mark.asyncio +async def test_fan_out_fan_in(): + """S fans out to (A, B), both feed into C. + + Maps to: test_run_async_with_implicit_graph_fan_out_fan_in + in test_workflow_agent.py. + """ + s = _OutputNode(name='s', value='S') + a = _PassthroughNode(name='a') + b = _PassthroughNode(name='b') + c = _InputCapturingNode(name='c') + wf = Workflow( + name='wf', + edges=[ + (START, s), + (s, (a, b), c), + ], + ) + + events, _, _ = await _run_workflow(wf) + + # Both A and B receive S's output, C receives from both + assert Counter(c.received_inputs) == Counter(['S', 'S']) + + +# 29. test_run_async_parallel_nodes_interleaved_events +@pytest.mark.asyncio +async def test_parallel_events_interleaved(): + """Parallel terminal nodes both producing output raises ValueError. + + Maps to: test_run_async_parallel_nodes_interleaved_events + in test_workflow_agent.py. + """ + a = _OutputNode(name='a', value='A') + b = _OutputNode(name='b', value='B') + wf = Workflow( + name='wf', + edges=[ + (START, a), + (START, b), + ], + ) + + with pytest.raises(ValueError, match='multiple terminal nodes'): + await _run_workflow(wf) + + +# 30. test_buffers_events_from_parallel_nodes +@pytest.mark.asyncio +async def test_parallel_events_all_delivered(): + """All events from parallel nodes fan-in to capture node. + + Maps to: test_buffers_events_from_parallel_nodes + in test_workflow_agent.py. + """ + a = _OutputNode(name='a', value='A') + b = _OutputNode(name='b', value='B') + capture = _InputCapturingNode(name='capture') + wf = Workflow( + name='wf', + edges=[ + (START, a), + (START, b), + (a, capture), + (b, capture), + ], + ) + + events, _, _ = await _run_workflow(wf) + + assert Counter(capture.received_inputs) == Counter(['A', 'B']) + + +# 31. test_run_id_uniqueness +@pytest.mark.asyncio +async def test_run_id_unique_per_node(): + """Each node run gets a unique run_id. + + Maps to: test_run_id_uniqueness in test_workflow_agent.py. + """ + a = _OutputNode(name='a', value='A') + b = _OutputNode(name='b', value='B') + wf = Workflow(name='wf', edges=[(START, a, b)]) + + events, _, _ = await _run_workflow(wf) + paths = [e.node_info.path for e in events if e.node_info.path] + + assert len(paths) >= 2 + # paths are unique per node run (because they contain @run_id) + assert len(set(paths)) >= 2 + + +# 32. test_run_id_uniqueness_nested +@pytest.mark.asyncio +async def test_run_id_unique_nested(): + """Nested workflow nodes also get unique IDs. + + Maps to: test_run_id_uniqueness_nested + in test_workflow_agent.py. + """ + inner_a = _OutputNode(name='inner_a', value='IA') + inner = Workflow(name='inner', edges=[(START, inner_a)]) + outer_a = _OutputNode(name='outer_a', value='OA') + wf = Workflow(name='wf', edges=[(START, outer_a, inner)]) + + events, _, _ = await _run_workflow(wf) + paths = [e.node_info.path for e in events if e.node_info.path] + + # paths are unique per node run (because they contain @run_id) + assert len(set(paths)) >= 2 + + +@pytest.mark.asyncio +async def test_run_id_sequential_in_loop(): + """Looping node gets sequential run_ids: 1, 2, 3.""" + tracker = {'count': 0} + + class _LoopNode(BaseNode): + + model_config = ConfigDict(arbitrary_types_allowed=True) + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + tracker['count'] += 1 + yield Event( + output=f'iter-{tracker["count"]}', + route='again' if tracker['count'] < 3 else 'done', + ) + + from google.adk.workflow._graph import Edge as GraphEdge + + loop = _LoopNode(name='loop') + wf = Workflow( + name='wf', + edges=[ + (START, loop), + GraphEdge(from_node=loop, to_node=loop, route='again'), + ], + ) + + events, _, _ = await _run_workflow(wf) + + loop_run_ids = [ + e.node_info.path.split('@')[-1] + for e in events + if e.node_info.path and 'loop@' in e.node_info.path + ] + assert loop_run_ids == ['1', '2', '3'] + + +# 33. test_resume_with_manual_state_verifies_input_persistence +@pytest.mark.asyncio +async def test_resume_downstream_receives_output(): + """After resume, downstream node receives the resumed node's output. + + Maps to: test_resume_with_manual_state_verifies_input_persistence + in test_workflow_agent.py. Old test verified input from checkpoint. + New test verifies output flows to downstream after HITL resume. + """ + + class _InterruptNode(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + + fc_id = ctx.state.get('_fc_id') + if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: + ctx.state['_fc_id'] = None + yield f'response:{ctx.resume_inputs[fc_id]["value"]}' + return + fc_id = f'fc-{uuid.uuid4().hex[:8]}' + ctx.state['_fc_id'] = fc_id + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='get', args={}, id=fc_id + ) + ) + ] + ), + long_running_tool_ids={fc_id}, + ) + + a = _OutputNode(name='NodeA', value='from_a') + b = _InterruptNode(name='NodeB') + c = _InputCapturingNode(name='NodeC') + wf = Workflow(name='wf', edges=[(START, a, b, c)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: A completes, B interrupts + msg1 = types.Content(parts=[types.Part(text='go')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + # A completed, B interrupted + assert 'from_a' in [e.output for e in events1 if e.output is not None] + fc_id = None + for e in events1: + if e.long_running_tool_ids: + fc_id = list(e.long_running_tool_ids)[0] + assert fc_id + + # Run 2: resume B with value, C receives B's output + msg2 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='get', id=fc_id, response={'value': 42} + ) + ) + ], + role='user', + ) + events2: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events2.append(event) + + # NodeC should have captured NodeB's resume output + assert c.received_inputs == ['response:42'] + + +# 34. test_run_async_with_multiple_node_outputs_fails +@pytest.mark.asyncio +async def test_multiple_outputs_rejected(): + """Node yielding two outputs raises error. + + Maps to: test_run_async_with_multiple_node_outputs_fails + in test_workflow_agent.py. + + NodeRunner raises ValueError but Runner swallows it in the + background task. This test is xfail until Runner error propagation + is implemented. + """ + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(output='first') + yield Event(output='second') + + wf = Workflow(name='wf', edges=[(START, _Node(name='a'))]) + + with pytest.raises(ValueError, match='at most one output'): + await _run_workflow(wf) + + +# 38. test_run_async_streaming_behavior +@pytest.mark.asyncio +async def test_streaming_partial_events(): + """Partial events are streamed before final output. + + Maps to: test_run_async_streaming_behavior + in test_workflow_agent.py. + """ + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event( + content=types.Content(parts=[types.Part(text='partial1')]), + partial=True, + ) + yield Event( + content=types.Content(parts=[types.Part(text='partial2')]), + partial=True, + ) + yield Event(output='final') + + wf = Workflow(name='wf', edges=[(START, _Node(name='a'))]) + + events, _, _ = await _run_workflow(wf) + partials = [e for e in events if e.partial] + + assert len(partials) == 2 + assert 'final' in _outputs(events) + + +# 39. test_workflow_agent_unsupported_base_agent_fields +# SKIP — BaseAgent-specific, not applicable to Workflow(BaseNode). + + +# 40. test_node_path_generation +@pytest.mark.asyncio +async def test_node_path_correct(): + """Events have correct node_info.path. + + Maps to: test_node_path_generation in test_workflow_agent.py. + """ + a = _OutputNode(name='NodeA', value='A') + b = _OutputNode(name='NodeB', value='B') + wf = Workflow(name='wf', edges=[(START, a, b)]) + + events, _, _ = await _run_workflow(wf) + paths = [e.node_info.path for e in events if e.node_info.path] + + assert any(p.endswith('NodeA@1') for p in paths) + assert any(p.endswith('NodeB@1') for p in paths) + assert all('None' not in p for p in paths) + + +# --- Additional: function node auto-wrap --- + + +@pytest.mark.asyncio +async def test_function_node_auto_wrap(): + """Callable in edge is auto-wrapped to FunctionNode.""" + + def greet(node_input): + return 'hi' + + wf = Workflow(name='wf', edges=[(START, greet)]) + + events, _, _ = await _run_workflow(wf) + + assert 'hi' in _outputs(events) + + +# --- Additional: empty workflow --- + + +@pytest.mark.asyncio +async def test_empty_workflow(): + """Workflow with no edges produces no output.""" + wf = Workflow(name='wf', edges=[]) + + events, _, _ = await _run_workflow(wf) + + assert _outputs(events) == [] + + +# --------------------------------------------------------------------------- +# use_as_output=True (dynamic output delegation) +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_use_as_output_function_to_function(): + """Node A delegates output to dynamic child B via use_as_output=True. + + B's output event appears; A's duplicate is suppressed. + """ + from google.adk.workflow._function_node import FunctionNode + + def func_b() -> str: + return 'from_b' + + async def func_a(ctx: Context) -> str: + return await ctx.run_node(func_b, use_as_output=True) + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + wf = Workflow(name='wf', edges=[(START, node_a)]) + events, _, _ = await _run_workflow(wf) + + by_node = _output_by_node(events) + # func_b emits output; func_a's duplicate is suppressed. + assert ('func_b', 'from_b') in by_node + assert not any(name == 'func_a' for name, _ in by_node) + + # output_for includes child, parent, and workflow paths. + # func_a is terminal, so its output also represents the workflow's. + output_event = [ + e for e in events if e.node_info.name.split('@')[0] == 'func_b' + ][0] + assert output_event.node_info.output_for == [ + 'wf@1/func_a@1/func_b@1', + 'wf@1/func_a@1', + 'wf@1', + ] + + +@pytest.mark.asyncio +async def test_use_as_output_function_to_workflow(): + """Node A delegates output to a nested Workflow via use_as_output=True. + + The inner Workflow's terminal node output is used as A's output. + """ + from google.adk.workflow._function_node import FunctionNode + + def step_1() -> str: + return 'step_1_done' + + def step_2(node_input: str) -> str: + return f'final:{node_input}' + + inner_wf = Workflow( + name='inner_wf', + edges=[(START, step_1, step_2)], + ) + + async def func_a(ctx: Context): + return await ctx.run_node(inner_wf, use_as_output=True) + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + wf = Workflow(name='wf', edges=[(START, node_a)]) + events, _, _ = await _run_workflow(wf) + + by_node = _output_by_node(events) + # step_2 is the terminal; func_a's duplicate is suppressed. + assert ('step_2', 'final:step_1_done') in by_node + assert not any(name == 'func_a' for name, _ in by_node) + + +@pytest.mark.asyncio +async def test_use_as_output_custom_node(): + """Custom BaseNode delegates output via use_as_output.""" + from google.adk.workflow._function_node import FunctionNode + + def func_b() -> str: + return 'delegated_output' + + class _Delegator(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + await ctx.run_node(func_b, use_as_output=True) + return + yield + + wf = Workflow(name='wf', edges=[(START, _Delegator(name='delegator'))]) + events, _, _ = await _run_workflow(wf) + + by_node = _output_by_node(events) + assert ('func_b', 'delegated_output') in by_node + assert not any(name == 'delegator' for name, _ in by_node) + + +@pytest.mark.asyncio +async def test_use_as_output_nested_delegation(): + """Chained delegation: A → B → C, all use_as_output=True. + + Only C's output event should appear; A and B are suppressed. + """ + from google.adk.workflow._function_node import FunctionNode + + def func_c() -> str: + return 'from_c' + + node_c = FunctionNode(func=func_c) + + async def func_b(ctx: Context) -> str: + return await ctx.run_node(node_c, use_as_output=True) + + node_b = FunctionNode(func=func_b, rerun_on_resume=True) + + async def func_a(ctx: Context) -> str: + return await ctx.run_node(node_b, use_as_output=True) + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + wf = Workflow(name='wf', edges=[(START, node_a)]) + events, _, _ = await _run_workflow(wf) + + by_node = _output_by_node(events) + assert ('func_c', 'from_c') in by_node + assert not any(name in ('func_a', 'func_b') for name, _ in by_node) + + # output_for includes full ancestor chain plus workflow path. + # func_a is terminal, so the chain extends to the workflow. + output_event = [ + e for e in events if e.node_info.name.split('@')[0] == 'func_c' + ][0] + assert output_event.node_info.output_for == [ + 'wf@1/func_a@1/func_b@1/func_c@1', + 'wf@1/func_a@1/func_b@1', + 'wf@1/func_a@1', + 'wf@1', + ] + + +@pytest.mark.asyncio +async def test_use_as_output_with_downstream(): + """Delegated output flows to downstream node via graph edge. + + A delegates to B via use_as_output. downstream is after A and + receives B's output as node_input. + """ + from google.adk.workflow._function_node import FunctionNode + + def func_b() -> str: + return 'from_b' + + async def func_a(ctx: Context) -> str: + return await ctx.run_node(func_b, use_as_output=True) + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + downstream = _InputCapturingNode(name='downstream') + + wf = Workflow(name='wf', edges=[(START, node_a, downstream)]) + events, _, _ = await _run_workflow(wf) + + assert downstream.received_inputs == ['from_b'] + + +@pytest.mark.asyncio +async def test_use_as_output_duplicate_raises(): + """Calling use_as_output=True twice in the same node raises ValueError.""" + from google.adk.workflow._function_node import FunctionNode + + def func_b() -> str: + return 'from_b' + + def func_c() -> str: + return 'from_c' + + async def func_a(ctx: Context): + await ctx.run_node(func_b, use_as_output=True) + await ctx.run_node(func_c, use_as_output=True) + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + wf = Workflow(name='wf', edges=[(START, node_a)]) + + with pytest.raises(ValueError, match='use_as_output'): + await _run_workflow(wf) + + +@pytest.mark.asyncio +async def test_without_use_as_output_parent_emits_duplicate(): + """Without use_as_output, parent re-emits child's output (duplicate).""" + from google.adk.workflow._function_node import FunctionNode + + def func_b() -> str: + return 'from_b' + + node_b = FunctionNode(func=func_b) + + async def func_a(ctx: Context) -> str: + return await ctx.run_node(node_b) + + node_a = FunctionNode(func=func_a, rerun_on_resume=True) + + wf = Workflow(name='wf', edges=[(START, node_a)]) + events, _, _ = await _run_workflow(wf) + + by_node = _output_by_node(events) + # Both func_b AND func_a emit output (duplicate). + assert ('func_b', 'from_b') in by_node + assert ('func_a', 'from_b') in by_node + + # func_b's output_for is just its own path (no delegation). + b_event = [e for e in events if e.node_info.name.split('@')[0] == 'func_b'][0] + assert b_event.node_info.output_for == ['wf@1/func_a@1/func_b@1'] + # func_a is terminal, so its output_for includes the workflow path. + a_event = [ + e + for e in events + if e.node_info.name and e.node_info.name.split('@')[0] == 'func_a' + ][0] + assert a_event.node_info.output_for == ['wf@1/func_a@1', 'wf@1'] + + +@pytest.mark.asyncio +async def test_terminal_node_output_dedup(): + """Terminal node output is not duplicated by the workflow. + + The terminal node's output event includes the workflow path in + output_for, and the workflow does not emit a separate output event. + """ + + def step_a(node_input: str) -> str: + return node_input.upper() + + def step_b(node_input: str) -> str: + return f'final: {node_input}' + + wf = Workflow(name='wf', edges=[(START, step_a, step_b)]) + events, _, _ = await _run_workflow(wf, 'hello') + + output_events = [e for e in events if e.output is not None] + + # step_a is not terminal — its output_for is just its own path. + a_events = [ + e + for e in output_events + if e.node_info.name and e.node_info.name.split('@')[0] == 'step_a' + ] + assert len(a_events) == 1 + assert a_events[0].node_info.output_for == ['wf@1/step_a@1'] + + # step_b is terminal — its output_for includes the workflow path. + b_events = [ + e + for e in output_events + if e.node_info.name and e.node_info.name.split('@')[0] == 'step_b' + ] + assert len(b_events) == 1 + assert b_events[0].node_info.output_for == ['wf@1/step_b@1', 'wf@1'] + assert b_events[0].output == 'final: HELLO' + + # No duplicate output event from the workflow itself. + wf_events = [e for e in output_events if e.node_info.path == 'wf@1'] + assert len(wf_events) == 0 + + +@pytest.mark.asyncio +async def test_terminal_node_output_dedup_nested(): + """Terminal output dedup works for nested workflows. + + Inner workflow's terminal node output propagates to the outer + workflow without duplication. + """ + + def inner_node(node_input: str) -> str: + return node_input.upper() + + inner_wf = Workflow(name='inner', edges=[(START, inner_node)]) + + def outer_node(node_input: str) -> str: + return f'wrapped: {node_input}' + + outer_wf = Workflow(name='outer', edges=[(START, inner_wf, outer_node)]) + events, _, _ = await _run_workflow(outer_wf, 'test') + + output_events = [e for e in events if e.output is not None] + + # inner_node is terminal in inner_wf — includes inner_wf path. + inner_events = [ + e + for e in output_events + if e.node_info.name and e.node_info.name.split('@')[0] == 'inner_node' + ] + assert len(inner_events) == 1 + assert inner_events[0].node_info.output_for == [ + 'outer@1/inner@1/inner_node@1', + 'outer@1/inner@1', + ] + + # outer_node is terminal in outer_wf — includes outer_wf path. + outer_events = [ + e + for e in output_events + if e.node_info.name and e.node_info.name.split('@')[0] == 'outer_node' + ] + assert len(outer_events) == 1 + assert outer_events[0].node_info.output_for == [ + 'outer@1/outer_node@1', + 'outer@1', + ] + assert outer_events[0].output == 'wrapped: TEST' + + # No duplicate output events from the workflows themselves. + wf_output_events = [ + e + for e in output_events + if e.node_info.path in ('outer@1', 'outer@1/inner@1') + ] + assert len(wf_output_events) == 0 + + +# --- wait_for_output + HITL resume --- + + +@pytest.mark.asyncio +async def test_wait_for_output_node_preserves_state_across_resume(): + """Wait-for-output node preserves received triggers across workflow resume. + + Setup: + START -> NodeA (completes) -> Gate (wait_for_output, needs 2 triggers). + START -> NodeB (interrupts) -> Gate. + Act: + - Turn 1: Start workflow. NodeA completes, NodeB interrupts. Gate waits (1/2). + - Turn 2: Resume with NodeB response. NodeB completes, triggers Gate (2/2). + Assert: + - Gate opens in Turn 2 and produces output. + """ + + class _InterruptOnce(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + fc_id = ctx.state.get('_fc_id') + if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: + ctx.state['_fc_id'] = None + yield 'B_done' + return + fc_id = f'fc-{uuid.uuid4().hex[:8]}' + ctx.state['_fc_id'] = fc_id + yield _make_function_call_interrupt(fc_id) + + a = _OutputNode(name='NodeA', value='A') + b = _InterruptOnce(name='NodeB') + gate = JoinNode(name='Gate') + downstream = _OutputNode(name='Downstream', value='done') + wf = Workflow( + name='wf', + edges=[ + (START, a, gate, downstream), + (START, b, gate), + ], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: A completes, B interrupts, Gate triggered once (no output) + msg1 = types.Content(parts=[types.Part(text='go')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + outputs1 = [e.output for e in events1 if e.output is not None] + assert 'A' in outputs1 + assert any(e.long_running_tool_ids for e in events1) + # Gate should NOT have opened (only 1 of 2 triggers received) + assert not any(isinstance(o, dict) and 'NodeA' in o for o in outputs1) + + fc_id = None + for e in events1: + if e.long_running_tool_ids: + fc_id = list(e.long_running_tool_ids)[0] + + # Run 2: resume B → Gate gets 2nd trigger → opens → Downstream runs + msg2 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='approve', id=fc_id, response={'ok': True} + ) + ) + ], + role='user', + ) + events2: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events2.append(event) + + outputs = [e.output for e in events2 if e.output is not None] + assert 'B_done' in outputs + # Gate opened with both inputs collected + gate_output = [o for o in outputs if isinstance(o, dict)] + assert len(gate_output) == 1 + assert 'NodeA' in gate_output[0] + assert 'NodeB' in gate_output[0] + assert 'done' in outputs + + +@pytest.mark.asyncio +async def test_wait_for_output_node_in_loop_generates_unique_paths(): + """Wait-for-output node in loop generates unique paths across iterations. + + Setup: + Workflow with a loop: START -> Process -> [NodeA, NodeB] -> Join -> Handle. + Handle loops back to Process on first iteration, exits on second. + NodeB interrupts on first run of each iteration. + Act: + - Turn 1: Start workflow. NodeA completes, NodeB interrupts. Join waits. + - Turn 2: Resume with NodeB response. Handle loops back. Process runs again. + NodeA completes, NodeB interrupts again. + - Turn 3: Resume with NodeB response again. Join opens. + Assert: + - JoinNode runs with path ending in `Join@2` in the second iteration. + """ + + class _InterruptOnce(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + fc_id = ctx.state.get('_fc_id') + if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: + ctx.state['_fc_id'] = None + yield 'B_done' + return + fc_id = 'fc-interrupt' + ctx.state['_fc_id'] = fc_id + yield _make_function_call_interrupt(fc_id) + + class _HandleNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + # Loop back if this is the first iteration + count = ctx.state.get('loop_count', 0) + 1 + ctx.state['loop_count'] = count + if count == 1: + yield Event(route='loop') + else: + yield Event(route='exit', output='finished') + + process = _PassthroughNode(name='Process') + a = _OutputNode(name='NodeA', value='A') + b = _InterruptOnce(name='NodeB') + join = JoinNode(name='Join') + handle = _HandleNode(name='Handle') + exit_node = _PassthroughNode(name='Exit') + + wf = Workflow( + name='loop_wf', + edges=[ + (START, process), + (process, a), + (process, b), + (a, join), + (b, join), + (join, handle), + (handle, {'loop': process, 'exit': exit_node}), + ], + ) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Turn 1: process runs, A completes, B interrupts, Join waits + msg1 = types.Content(parts=[types.Part(text='go')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + # Verify paths in Turn 1 + join_events1 = [ + e for e in events1 if e.node_info and 'Join' in e.node_info.path + ] + # JoinNode does not yield events until all inputs are collected. + + # Turn 2: Provide response for NodeB (InterruptNode) + msg2 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='approve', id='fc-interrupt', response={'ok': True} + ) + ) + ], + role='user', + ) + + events2: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events2.append(event) + + # Workflow loops back. NodeB interrupts again in the second iteration. + + # Turn 3: Provide response for NodeB again! + events3: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events3.append(event) + + # JoinNode opens in the second iteration and produces output. + + join_events3 = [ + e for e in events3 if e.node_info and 'Join@2' in e.node_info.path + ] + assert len(join_events3) > 0, 'JoinNode should run again in loop with @2' + + +# --- run_id reuse on resume --- + + +@pytest.mark.asyncio +async def test_run_id_reused_on_resume(): + """Resumed node reuses run_id from original interrupted run.""" + + class _InterruptOnce(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + fc_id = ctx.state.get('_fc_id') + if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: + ctx.state['_fc_id'] = None + yield 'resumed' + return + fc_id = str(uuid.uuid4()) + ctx.state['_fc_id'] = fc_id + yield _make_function_call_interrupt(fc_id) + + wf = Workflow( + name='wf', + edges=[(START, _InterruptOnce(name='ask'))], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: interrupts + msg1 = types.Content(parts=[types.Part(text='go')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + fc_id = None + original_run_id = None + for e in events1: + if e.long_running_tool_ids: + fc_id = list(e.long_running_tool_ids)[0] + original_run_id = e.node_info.run_id + + assert fc_id is not None + assert original_run_id is not None + + # Run 2: resume + msg2 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='approve', id=fc_id, response={'ok': True} + ) + ) + ], + role='user', + ) + events2: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events2.append(event) + + # Resumed node should have the same run_id + resumed_events = [ + e + for e in events2 + if e.node_info.path + and e.node_info.path.endswith('ask@1') + and e.output is not None + ] + assert len(resumed_events) == 1 + assert resumed_events[0].node_info.run_id == original_run_id + + +@pytest.mark.asyncio +async def test_route_without_output_triggers_downstream_on_resume(): + """Node with route but no output triggers downstream on resume. + + Setup: + START -> NodeA (yields route='next') -> NodeB (interrupts). + Act: + - Turn 1: Run workflow. NodeA completes with route, NodeB interrupts. + - Turn 2: Resume workflow by resolving NodeB's interrupt. + Assert: + - Turn 1: NodeB was triggered (indicated by interrupt). + - Turn 2: NodeB runs and produces output (proving it was triggered). + """ + + class _TestRouteNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(route='next') + + class _InterruptOnce(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if ctx.resume_inputs and 'fc-123' in ctx.resume_inputs: + yield Event(output='done') + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='approve', args={}, id='fc-123' + ) + ) + ] + ), + long_running_tool_ids={'fc-123'}, + ) + + route_node = _TestRouteNode(name='route_node') + target_node = _InterruptOnce(name='target_node') + wf = Workflow( + name='wf', + edges=[ + (START, route_node), + (route_node, {'next': target_node}), + ], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg1 = types.Content(parts=[types.Part(text='go')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + assert any(e.long_running_tool_ids for e in events1) + + msg2 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='approve', id='fc-123', response={'ok': True} + ) + ) + ], + role='user', + ) + events2: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events2.append(event) + + outputs = [e.output for e in events2 if e.output is not None] + assert 'done' in outputs + + +@pytest.mark.asyncio +async def test_rerun_on_resume_false_preserves_route_on_resume(): + """A rerun_on_resume=False node that sets ctx.route preserves it on resume. + + Setup: + START -> RouteAndInterruptNode (sets ctx.route='go', interrupts) + -> {'go': TargetNode} + Act: + - Turn 1: RouteAndInterruptNode sets route and interrupts. + - Turn 2: Resume by resolving the interrupt. + Assert: + - Turn 2: TargetNode fires (proving the route survived the resume) + and produces output 'reached'. + """ + + class _RouteAndInterruptNode(BaseNode): + """Sets ctx.route directly and interrupts. rerun_on_resume=False.""" + + rerun_on_resume: bool = False + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + ctx.route = 'go' + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='confirm', args={}, id='fc-route-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-route-1'}, + ) + + class _TargetNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(output='reached') + + route_node = _RouteAndInterruptNode(name='route_node') + target_node = _TargetNode(name='target_node') + wf = Workflow( + name='wf', + edges=[ + (START, route_node), + (route_node, {'go': target_node}), + ], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Turn 1: route_node sets route and interrupts. + msg1 = types.Content(parts=[types.Part(text='start')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + assert any(e.long_running_tool_ids for e in events1) + + # Turn 2: resolve the interrupt. + msg2 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='confirm', id='fc-route-1', response={'ok': True} + ) + ) + ], + role='user', + ) + events2: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events2.append(event) + + # target_node should have fired via the 'go' route. + outputs = [e.output for e in events2 if e.output is not None] + assert 'reached' in outputs + + +@pytest.mark.asyncio +async def test_route_and_output_triggers_downstream_on_resume(): + """Node with route and output triggers downstream on resume. + + Setup: + START -> NodeA (yields route='next', output='A') -> NodeB (interrupts). + Act: + - Turn 1: Run workflow. NodeA completes with route and output, NodeB interrupts. + - Turn 2: Resume workflow by resolving NodeB's interrupt. + Assert: + - Turn 1: NodeB was triggered (indicated by interrupt). + - Turn 2: NodeB runs and produces output (proving it was triggered). + """ + + class _RouteAndOutputNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(route='next', output='A') + + class _InterruptOnce(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if ctx.resume_inputs and 'fc-123' in ctx.resume_inputs: + assert node_input == 'A' + yield Event(output='done') + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='approve', args={}, id='fc-123' + ) + ) + ] + ), + long_running_tool_ids={'fc-123'}, + ) + + route_node = _RouteAndOutputNode(name='route_node') + target_node = _InterruptOnce(name='target_node') + wf = Workflow( + name='wf', + edges=[ + (START, route_node), + (route_node, {'next': target_node}), + ], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg1 = types.Content(parts=[types.Part(text='go')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + assert any(e.long_running_tool_ids for e in events1) + + msg2 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='approve', id='fc-123', response={'ok': True} + ) + ) + ], + role='user', + ) + events2: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events2.append(event) + + outputs = [e.output for e in events2 if e.output is not None] + assert 'done' in outputs diff --git a/tests/unittests/workflow/test_workflow_agent_as_node.py b/tests/unittests/workflow/test_workflow_agent_as_node.py new file mode 100644 index 0000000000..bfdc996ca6 --- /dev/null +++ b/tests/unittests/workflow/test_workflow_agent_as_node.py @@ -0,0 +1,104 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for BaseAgent instances used as nodes in a Workflow.""" + +from typing import AsyncGenerator + +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.invocation_context import InvocationContext as BaseInvocationContext +from google.adk.events.event import Event +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.workflow import START +from google.adk.workflow._workflow import Workflow +from google.genai import types +import pytest + +from .workflow_testing_utils import InputCapturingNode +from .workflow_testing_utils import simplify_events_with_node + + +class SimpleAgent(BaseAgent): + """A simple agent for testing.""" + + message: str = '' + + async def _run_async_impl( + self, ctx: BaseInvocationContext + ) -> AsyncGenerator[Event, None]: + """Yields a single event with a message.""" + yield Event( + author=self.name, + invocation_id=ctx.invocation_id, + content=types.Content(parts=[types.Part(text=self.message)]), + ) + + +@pytest.mark.asyncio +async def test_run_async_with_agent_nodes(request: pytest.FixtureRequest): + """BaseAgent nodes emit content events through the workflow.""" + agent_a = SimpleAgent(name='AgentA', message='Hello') + agent_b = SimpleAgent(name='AgentB', message='World') + wf = Workflow( + name='wf_with_agents', + edges=[ + (START, agent_a), + (agent_a, agent_b), + ], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='start')], role='user') + events: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + assert simplify_events_with_node(events) == [ + ('wf_with_agents@1/AgentA@1', 'Hello'), + ('wf_with_agents@1/AgentB@1', 'World'), + ] + + +@pytest.mark.asyncio +async def test_run_async_with_agent_node_piping_data( + request: pytest.FixtureRequest, +): + """AgentNode content is not piped as output to the next node.""" + agent_a = SimpleAgent(name='AgentA', message='Hello') + node_b = InputCapturingNode(name='NodeB') + wf = Workflow( + name='wf_with_agent_piping', + edges=[ + (START, agent_a), + (agent_a, node_b), + ], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='start')], role='user') + async for _ in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + pass + + # AgentNode does not record content as node output, so the next node + # receives None as input. + assert node_b.received_inputs == [None] diff --git a/tests/unittests/workflow/test_workflow_bytes.py b/tests/unittests/workflow/test_workflow_bytes.py new file mode 100644 index 0000000000..bfa8121cc5 --- /dev/null +++ b/tests/unittests/workflow/test_workflow_bytes.py @@ -0,0 +1,137 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for Workflow handling of bytes and serialization.""" + +from __future__ import annotations + +from typing import Any +from typing import AsyncGenerator + +from google.adk.agents.context import Context +from google.adk.events.event import Event +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.workflow import BaseNode +from google.adk.workflow import START +from google.adk.workflow._workflow import Workflow +from google.genai import types +from pydantic import ConfigDict +from pydantic import Field +import pytest + +# --- Helpers --- + + +class _BytesOutputNode(BaseNode): + """Yields bytes content or raw bytes.""" + + raw_bytes: bool = False + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + data = b"\x89PNG\r\n\x1a\n" + if self.raw_bytes: + yield data + else: + yield Event( + content=types.Content( + parts=[types.Part.from_bytes(data=data, mime_type="image/png")] + ), + output="bytes_sent", + ) + + +class _InputCapturingNode(BaseNode): + """Captures node_input for later assertion.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + received_inputs: list[Any] = Field(default_factory=list) + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + self.received_inputs.append(node_input) + yield {"received": node_input} + + +async def _run_workflow(wf, message="start"): + """Run a Workflow through Runner, return collected events.""" + ss = InMemorySessionService() + runner = Runner(app_name="test", node=wf, session_service=ss) + session = await ss.create_session(app_name="test", user_id="u") + msg = types.Content(parts=[types.Part(text=message)], role="user") + events = [] + async for event in runner.run_async( + user_id="u", session_id=session.id, new_message=msg + ): + events.append(event) + return events, ss, session + + +# --- Tests --- + + +@pytest.mark.asyncio +async def test_bytes_in_content_output(): + """Content with bytes propagates to downstream node.""" + a = _BytesOutputNode(name="a", raw_bytes=False) + b = _InputCapturingNode(name="b") + wf = Workflow(name="wf", edges=[(START, a, b)]) + + events, _, _ = await _run_workflow(wf) + + assert b.received_inputs == ["bytes_sent"] + + +@pytest.mark.asyncio +async def test_raw_bytes_output(): + """Raw bytes output propagates to downstream node.""" + a = _BytesOutputNode(name="a", raw_bytes=True) + b = _InputCapturingNode(name="b") + wf = Workflow(name="wf", edges=[(START, a, b)]) + + events, _, _ = await _run_workflow(wf) + + assert len(b.received_inputs) == 1 + assert isinstance(b.received_inputs[0], bytes) + + +@pytest.mark.xfail(reason="Checkpoint/resume not yet in new Workflow.") +@pytest.mark.asyncio +async def test_bytes_in_node_input_serialization(): + """Bytes in node input survive checkpoint/resume.""" + assert False, "TODO" + + +@pytest.mark.xfail(reason="Checkpoint/resume not yet in new Workflow.") +@pytest.mark.asyncio +async def test_bytes_in_typed_model_input(): + """Bytes in Pydantic model input survive round-trip.""" + assert False, "TODO" + + +@pytest.mark.xfail(reason="Checkpoint/resume not yet in new Workflow.") +@pytest.mark.asyncio +async def test_bytes_in_trigger_buffer(): + """Bytes in trigger buffer survive serialization.""" + assert False, "TODO" + + +@pytest.mark.xfail(reason="Checkpoint/resume not yet in new Workflow.") +@pytest.mark.asyncio +async def test_bytes_full_workflow_resume(): + """Full resume with bytes data end-to-end.""" + assert False, "TODO" diff --git a/tests/unittests/workflow/test_workflow_concurrency.py b/tests/unittests/workflow/test_workflow_concurrency.py new file mode 100644 index 0000000000..bd2cf43a4f --- /dev/null +++ b/tests/unittests/workflow/test_workflow_concurrency.py @@ -0,0 +1,132 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +from typing import Any +from typing import AsyncGenerator + +from google.adk.agents.context import Context +from google.adk.apps.app import App +from google.adk.events.event import Event +from google.adk.workflow import BaseNode +from google.adk.workflow import START +from google.adk.workflow._parallel_worker import _ParallelWorker as ParallelWorker +from google.adk.workflow._workflow import Workflow +from pydantic import Field +import pytest +from typing_extensions import override + +from .. import testing_utils +from .workflow_testing_utils import create_parent_invocation_context + + +@pytest.mark.asyncio +async def test_max_concurrency_limits_running_nodes( + request: pytest.FixtureRequest, +): + """Max concurrency limits the number of parallel graph-scheduled nodes. + + Setup: + Workflow with 4 parallel nodes and max_concurrency=2. + Act: + - Start workflow in background. + - Release nodes one by one. + Assert: + - Initially only 2 nodes start. + - Releasing one node allows another to start. + - All nodes eventually complete. + """ + + class ConcurrencyWorkerNode(BaseNode): + """A node that signals when it starts and waits for a signal to finish.""" + + started_event: asyncio.Event + finish_event: asyncio.Event + + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + self.started_event.set() + await self.finish_event.wait() + yield f'{self.name}_done' + + class TerminalNode(BaseNode): + + @override + async def _run_impl( + self, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield 'workflow_done' + + # Given a workflow with 4 parallel nodes and max_concurrency=2 + num_nodes = 4 + max_concurrency = 2 + started_events = [asyncio.Event() for _ in range(num_nodes)] + finish_events = [asyncio.Event() for _ in range(num_nodes)] + + nodes = [ + ConcurrencyWorkerNode( + name=f'Node{i}', + started_event=started_events[i], + finish_event=finish_events[i], + ) + for i in range(num_nodes) + ] + + terminal_node = TerminalNode(name='Terminal') + edges = [(START, tuple(nodes), terminal_node)] + + agent = Workflow( + name='concurrency_agent', + max_concurrency=max_concurrency, + edges=edges, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + + # When the workflow is run in background + async def run_agent(): + return await runner.run_async(testing_utils.get_user_content('start')) + + run_task = asyncio.create_task(run_agent()) + + # Then initially only max_concurrency nodes should start + await asyncio.sleep(0.1) + started_count = sum(1 for e in started_events if e.is_set()) + assert started_count == max_concurrency + + # When one node is released + for i in range(num_nodes): + if started_events[i].is_set(): + finish_events[i].set() + break + + # Then another node should start, bringing total to max_concurrency + 1 + await asyncio.sleep(0.1) + started_count = sum(1 for e in started_events if e.is_set()) + assert started_count == max_concurrency + 1 + + # When all remaining nodes are released + for e in finish_events: + e.set() + + # Then all nodes should eventually complete + await run_task + started_count = sum(1 for e in started_events if e.is_set()) + assert started_count == num_nodes diff --git a/tests/unittests/workflow/test_workflow_dynamic_nodes.py b/tests/unittests/workflow/test_workflow_dynamic_nodes.py new file mode 100644 index 0000000000..8ba3febe74 --- /dev/null +++ b/tests/unittests/workflow/test_workflow_dynamic_nodes.py @@ -0,0 +1,1299 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for dynamic node scheduling in new Workflow. + +Covers the three cases from doc 18 (Dynamic Node Resume via Lazy Scan): +- Case 1: Fresh execution (no prior events) +- Case 2: Completed dedup (return cached output on rerun) +- Case 3: Interrupted resume (rerun with resume_inputs) + +Plus edge cases for multiple dynamic nodes, nested dynamic nodes, +and use_as_output delegation. +""" + +import asyncio +from typing import Any +from typing import AsyncGenerator + +from google.adk.agents.context import Context +from google.adk.events.event import Event +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.workflow import node +from google.adk.workflow import START +from google.adk.workflow._errors import DynamicNodeFailError +from google.adk.workflow._workflow import Workflow +from google.genai import types +import pytest + +# --- Helpers --- + + +async def _run( + runner: Runner, + ss: InMemorySessionService, + session: Any, + message: str, +) -> list[Event]: + """Send a text message and collect events.""" + msg = types.Content(parts=[types.Part(text=message)], role='user') + events: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + return events + + +async def _resume( + runner: Runner, + ss: InMemorySessionService, + session: Any, + fc_id: str, + response: Any, +) -> list[Event]: + """Send a function response and collect events.""" + if not isinstance(response, dict): + response = {'value': response} + msg = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='tool', id=fc_id, response=response + ) + ) + ], + role='user', + ) + events: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + return events + + +def _outputs(events: list[Event]) -> list[Any]: + """Extract non-None outputs.""" + return [e.output for e in events if e.output is not None] + + +def _interrupt_ids(events: list[Event]) -> set[str]: + """Extract interrupt IDs from events.""" + ids: set[str] = set() + for e in events: + if e.long_running_tool_ids: + ids.update(e.long_running_tool_ids) + return ids + + +# ========================================================================= +# Fresh execution (no resume) +# ========================================================================= + + +@pytest.mark.asyncio +async def test_dynamic_node_fresh_execution(): + """Dynamic node runs normally on first invocation. + + Setup: Parent (rerun_on_resume=True) calls ctx.run_node(Child). + Action: Send a text message to trigger the workflow. + Assert: Parent receives Child's output and yields the combined result. + """ + + @node + async def child(*, ctx, node_input): + yield f'child got: {node_input}' + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + result = await ctx.run_node(child, node_input='hello') + yield f'parent got: {result}' + + wf = Workflow(name='wf', edges=[(START, parent)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + events = await _run(runner, ss, session, 'go') + + outputs = _outputs(events) + assert 'parent got: child got: hello' in outputs + + +@pytest.mark.asyncio +async def test_dynamic_node_with_downstream_static(): + """Dynamic child's output flows to a downstream static node. + + Setup: Parent calls ctx.run_node(Child). Parent is followed by + a static After node in the graph. + Action: Send a text message. + Assert: After node receives Parent's output (which includes + Child's result) as node_input. + """ + + @node + async def child(*, ctx, node_input): + yield f'child: {node_input}' + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + result = await ctx.run_node(child, node_input='forwarded') + yield result + + @node + async def after(*, ctx, node_input): + yield f'after: {node_input}' + + wf = Workflow( + name='wf', + edges=[(START, parent, after)], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + events = await _run(runner, ss, session, 'hello') + outputs = _outputs(events) + assert 'after: child: forwarded' in outputs + + +# ========================================================================= +# Single-level resume (interrupt → FR → resume) +# ========================================================================= + + +@pytest.mark.asyncio +async def test_dynamic_node_interrupted_resume(): + """Dynamic child interrupts, then resumes with FR on parent rerun. + + Setup: Parent calls ctx.run_node(Approver). Approver interrupts + with fc-1. + Action: Send FR for fc-1 with {answer: 'yes'}. + Assert: + - Approver resumes and outputs 'approved: yes'. + - Parent yields the final combined result. + """ + + @node(rerun_on_resume=True) + async def approver(*, ctx, node_input): + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield f'approved: {ctx.resume_inputs["fc-1"]["answer"]}' + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='approve', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + result = await ctx.run_node(approver) + yield f'final: {result}' + + wf = Workflow(name='wf', edges=[(START, parent)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: interrupts + events1 = await _run(runner, ss, session, 'go') + assert 'fc-1' in _interrupt_ids(events1) + + # Run 2: resume + events2 = await _resume(runner, ss, session, 'fc-1', {'answer': 'yes'}) + outputs = _outputs(events2) + assert 'final: approved: yes' in outputs + + +@pytest.mark.asyncio +async def test_dynamic_node_completed_dedup_on_resume(): + """Completed dynamic child returns cached output when parent reruns. + + Setup: Parent calls ctx.run_node(Completer) then + ctx.run_node(Interrupter). Completer completes, Interrupter + interrupts with fc-1. + Action: Send FR for fc-1 to resume. + Assert: + - Parent reruns (call_count increments to 2). + - Completer is NOT re-executed (dedup returns cached output). + - Interrupter resumes with the FR response. + - Final output combines both results. + """ + + @node + async def completer(*, ctx, node_input): + yield 'completed_result' + + @node(rerun_on_resume=True) + async def interrupter(*, ctx, node_input): + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield f'resumed: {ctx.resume_inputs["fc-1"]["value"]}' + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + call_count = [0] + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + call_count[0] += 1 + + r1 = await ctx.run_node(completer) + r2 = await ctx.run_node(interrupter) + yield f'{r1} + {r2}' + + wf = Workflow(name='wf', edges=[(START, parent)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: completer completes, interrupter interrupts + events1 = await _run(runner, ss, session, 'go') + assert _interrupt_ids(events1) + assert call_count[0] == 1 + + # Run 2: resume interrupter + events2 = await _resume(runner, ss, session, 'fc-1', 'done') + + # Parent should have rerun (call_count=2). + # Completer should NOT re-execute (dedup returns cached). + # Interrupter resumes with FR. + assert call_count[0] == 2 + outputs = _outputs(events2) + assert 'completed_result + resumed: done' in outputs + + +@pytest.mark.asyncio +async def test_dynamic_node_sequential_interrupts(): + """Sequential dynamic children interrupt one at a time. + + Setup: Parent calls ctx.run_node(a) then ctx.run_node(b). + Both children interrupt, but sequentially — a interrupts first, + parent never reaches b until a is resolved. + Action: Resume a, then b. + Assert: + - Run 1: only fc-a interrupts (parent didn't reach b). + - Run 2 (resume fc-a): a completes, parent continues to b, + b interrupts with fc-b. + - Run 3 (resume fc-b): b completes, parent yields combined + output. + """ + + @node(rerun_on_resume=True) + async def a(*, ctx, node_input): + if ctx.resume_inputs and 'fc-a' in ctx.resume_inputs: + yield f'a: {ctx.resume_inputs["fc-a"]["value"]}' + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-a' + ) + ) + ] + ), + long_running_tool_ids={'fc-a'}, + ) + + @node(rerun_on_resume=True) + async def b(*, ctx, node_input): + if ctx.resume_inputs and 'fc-b' in ctx.resume_inputs: + yield f'b: {ctx.resume_inputs["fc-b"]["value"]}' + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-b' + ) + ) + ] + ), + long_running_tool_ids={'fc-b'}, + ) + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + r1 = await ctx.run_node(a, node_input=node_input) + r2 = await ctx.run_node(b, node_input=node_input) + yield f'{r1} + {r2}' + + wf = Workflow(name='wf', edges=[(START, parent)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: a interrupts, parent never reaches b + events1 = await _run(runner, ss, session, 'go') + ids1 = _interrupt_ids(events1) + assert 'fc-a' in ids1 + assert 'fc-b' not in ids1 + + # Run 2: resume a → a completes, parent reaches b → b interrupts + events2 = await _resume(runner, ss, session, 'fc-a', 'done-a') + ids2 = _interrupt_ids(events2) + assert 'fc-b' in ids2 + + # Run 3: resume b → b completes, parent yields combined output + events3 = await _resume(runner, ss, session, 'fc-b', 'done-b') + outputs = _outputs(events3) + assert 'a: done-a + b: done-b' in outputs + + +@pytest.mark.asyncio +async def test_dynamic_node_run_id_reused_on_resume(): + """Resumed dynamic child reuses run_id from original run. + + Setup: Parent calls ctx.run_node(Interrupter). Interrupter + interrupts with fc-1. + Action: Send FR for fc-1. + Assert: The resumed Interrupter's output event has the same + run_id as the original interrupt event. + """ + + @node(rerun_on_resume=True) + async def interrupter(*, ctx, node_input): + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield 'resumed' + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + result = await ctx.run_node(interrupter) + yield result + + wf = Workflow(name='wf', edges=[(START, parent)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: interrupts + events1 = await _run(runner, ss, session, 'go') + interrupt_event = [e for e in events1 if e.long_running_tool_ids][0] + original_run_id = interrupt_event.node_info.run_id + + # Run 2: resume + events2 = await _resume(runner, ss, session, 'fc-1', 'ok') + resumed_output_events = [ + e + for e in events2 + if e.output == 'resumed' and 'interrupter' in (e.node_info.path or '') + ] + assert len(resumed_output_events) == 1 + assert resumed_output_events[0].node_info.run_id == original_run_id + + +# ========================================================================= +# Nested workflow + dynamic node combinations +# ========================================================================= + + +@pytest.mark.asyncio +async def test_nested_static_workflow_with_dynamic_interrupt(): + """Static sub-workflow's node schedules a dynamic node that interrupts. + + Setup: outer_wf → inner_wf (static). Inside inner_wf, a static + parent node calls ctx.run_node(Approver). Approver interrupts. + Action: Send FR to resume. + Assert: Approver resumes, parent completes, inner_wf completes, + outer_wf completes. + """ + + @node(rerun_on_resume=True) + async def approver(*, ctx, node_input): + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield f'approved: {ctx.resume_inputs["fc-1"]["value"]}' + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + result = await ctx.run_node(approver) + yield f'parent: {result}' + + inner_wf = Workflow( + name='inner_wf', + edges=[(START, parent)], + ) + outer_wf = Workflow( + name='outer_wf', + edges=[(START, inner_wf)], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=outer_wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: dynamic approver interrupts inside inner_wf + events1 = await _run(runner, ss, session, 'go') + assert 'fc-1' in _interrupt_ids(events1) + + # Run 2: resume + events2 = await _resume(runner, ss, session, 'fc-1', 'yes') + outputs = _outputs(events2) + assert 'parent: approved: yes' in outputs + + +@pytest.mark.asyncio +async def test_dynamic_workflow_with_static_interrupt(): + """Dynamic child is a Workflow whose static node interrupts. + + Setup: Parent calls ctx.run_node(inner_wf). inner_wf has a + static Interrupter node that interrupts with fc-1. + Action: Send FR to resume. + Assert: Interrupter resumes, inner_wf completes, parent + receives inner_wf's output. + """ + + @node(rerun_on_resume=True) + async def step(*, ctx, node_input): + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield f'done: {ctx.resume_inputs["fc-1"]["value"]}' + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + inner_wf = Workflow( + name='inner_wf', + edges=[(START, step)], + ) + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + result = await ctx.run_node(inner_wf) + yield f'parent: {result}' + + outer_wf = Workflow( + name='outer_wf', + edges=[(START, parent)], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=outer_wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: inner_wf's static node interrupts + events1 = await _run(runner, ss, session, 'go') + assert 'fc-1' in _interrupt_ids(events1) + + # Run 2: resume + events2 = await _resume(runner, ss, session, 'fc-1', 'ok') + outputs = _outputs(events2) + assert 'parent: done: ok' in outputs + + +@pytest.mark.asyncio +async def test_dynamic_workflow_with_nested_dynamic_interrupt(): + """Dynamic Workflow's inner node schedules another dynamic node. + + Setup: Parent calls ctx.run_node(inner_wf). inner_wf has a + static Orchestrator node that calls ctx.run_node(Approver). + Approver interrupts with fc-1. + Action: Send FR to resume. + Assert: Approver resumes → Orchestrator completes → inner_wf + completes → Parent receives output. Three levels of dynamic + nesting resolved correctly. + """ + + @node(rerun_on_resume=True) + async def approver(*, ctx, node_input): + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield f'approved: {ctx.resume_inputs["fc-1"]["value"]}' + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + @node(rerun_on_resume=True) + async def orch(*, ctx, node_input): + result = await ctx.run_node(approver) + yield f'orch: {result}' + + inner_wf = Workflow( + name='inner_wf', + edges=[(START, orch)], + ) + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + result = await ctx.run_node(inner_wf) + yield f'parent: {result}' + + outer_wf = Workflow( + name='outer_wf', + edges=[(START, parent)], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=outer_wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: deeply nested approver interrupts + events1 = await _run(runner, ss, session, 'go') + assert 'fc-1' in _interrupt_ids(events1) + + # Run 2: resume + events2 = await _resume(runner, ss, session, 'fc-1', 'granted') + outputs = _outputs(events2) + assert 'parent: orch: approved: granted' in outputs + + +# ========================================================================= +# Scoping: parallel parents with same-named dynamic children +# ========================================================================= + + +@pytest.mark.asyncio +async def test_parallel_parents_same_named_dynamic_children(): + """Two static parents schedule dynamic children with the same name. + + Setup: outer_wf fans out to parent_a and parent_b (parallel). + Both call ctx.run_node(Child(name='child')). parent_a's child + completes, parent_b's child interrupts. + Action: Send FR to resume parent_b's child. + Assert: + - parent_a's child and parent_b's child are distinct (scoped + by parent_path: wf/parent_a/child vs wf/parent_b/child). + - On resume, parent_a's child returns cached output (dedup), + parent_b's child resumes with FR. + - Both parents complete. + """ + + @node(rerun_on_resume=True) + async def child(*, ctx, node_input): + if ctx.resume_inputs and 'fc-b' in ctx.resume_inputs: + yield f'resumed: {ctx.resume_inputs["fc-b"]["value"]}' + return + if node_input == 'interrupt': + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-b' + ) + ) + ] + ), + long_running_tool_ids={'fc-b'}, + ) + else: + yield f'child: {node_input}' + + @node(rerun_on_resume=True) + async def parent_a(*, ctx, node_input): + result = await ctx.run_node(child, node_input='complete') + yield f'a: {result}' + + @node(rerun_on_resume=True) + async def parent_b(*, ctx, node_input): + result = await ctx.run_node(child, node_input='interrupt') + yield f'b: {result}' + + from google.adk.workflow import JoinNode + + join = JoinNode(name='join') + wf = Workflow( + name='wf', + edges=[ + (START, parent_a, join), + (START, parent_b, join), + ], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: parent_a completes, parent_b's child interrupts + events1 = await _run(runner, ss, session, 'go') + assert 'fc-b' in _interrupt_ids(events1) + # parent_a should have completed + a_outputs = [ + e.output for e in events1 if e.output and 'a: child' in str(e.output) + ] + assert len(a_outputs) == 1 + + # Run 2: resume parent_b's child + events2 = await _resume(runner, ss, session, 'fc-b', 'done') + outputs = _outputs(events2) + # Both parents completed, join has both results + assert any('b: resumed: done' in str(o) for o in outputs) + + +# ========================================================================= +# use_as_output + interrupt +# ========================================================================= + + +@pytest.mark.asyncio +async def test_dynamic_node_use_as_output_with_interrupt(): + """Dynamic child with use_as_output=True interrupts then resumes. + + Setup: Parent calls ctx.run_node(child, use_as_output=True). + Child interrupts with fc-1. + Action: Send FR for fc-1. + Assert: + - On resume, child resumes and its output becomes the parent's + output (use_as_output delegation). + - The parent's own output event is suppressed. + """ + + @node(rerun_on_resume=True) + async def child(*, ctx, node_input): + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield f'child: {ctx.resume_inputs["fc-1"]["value"]}' + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + result = await ctx.run_node(child, use_as_output=True) + # Set on ctx so orchestrator reads it. _output_delegated + # suppresses the output Event (child already emitted it). + ctx.output = result + yield # keep as async generator + + wf = Workflow( + name='wf', + edges=[(START, parent)], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: child interrupts + events1 = await _run(runner, ss, session, 'go') + assert 'fc-1' in _interrupt_ids(events1) + + # Run 2: resume + events2 = await _resume(runner, ss, session, 'fc-1', 'approved') + outputs = _outputs(events2) + assert 'child: approved' in outputs + # Parent's output should be suppressed (use_as_output) + parent_outputs = [ + e.output + for e in events2 + if e.node_info.path == 'wf/parent' and e.output is not None + ] + assert len(parent_outputs) == 0 + + +# ========================================================================= +# None-output completion after interrupt +# ========================================================================= + + +@pytest.mark.asyncio +@pytest.mark.xfail( + reason='No completion marker event for None output (event design flaw)' +) +async def test_dynamic_node_none_output_not_rerun(): + """Dynamic child that completed with None output is not re-run. + + Setup: Parent calls ctx.run_node(A) then ctx.run_node(B). + A interrupts. On resume, A completes with no output (None). + Parent continues to B, which also interrupts. + Action: Resume B. + Assert: + - On Run 3, A should NOT re-run (it already completed). + - A should return None (cached), B resumes. + - Currently fails because A's None completion leaves no + trace in session events — the lazy scan thinks A still + needs to re-run. + """ + run_count_a = [0] + + @node(rerun_on_resume=True) + async def a(*, ctx, node_input): + run_count_a[0] += 1 + if ctx.resume_inputs and 'fc-a' in ctx.resume_inputs: + # Complete with no output. + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-a' + ) + ) + ] + ), + long_running_tool_ids={'fc-a'}, + ) + + @node(rerun_on_resume=True) + async def b(*, ctx, node_input): + if ctx.resume_inputs and 'fc-b' in ctx.resume_inputs: + yield f'b: {ctx.resume_inputs["fc-b"]["value"]}' + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-b' + ) + ) + ] + ), + long_running_tool_ids={'fc-b'}, + ) + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + await ctx.run_node(a) + result = await ctx.run_node(b) + yield f'done: {result}' + + wf = Workflow(name='wf', edges=[(START, parent)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: A interrupts + events1 = await _run(runner, ss, session, 'go') + assert 'fc-a' in _interrupt_ids(events1) + assert run_count_a[0] == 1 + + # Run 2: resume A → A completes (None), parent reaches B → B interrupts + events2 = await _resume(runner, ss, session, 'fc-a', 'ok') + assert 'fc-b' in _interrupt_ids(events2) + assert run_count_a[0] == 2 # A re-ran once for resume + + # Run 3: resume B → A should NOT re-run (already completed) + events3 = await _resume(runner, ss, session, 'fc-b', 'done') + assert run_count_a[0] == 2 # A should NOT have run again + outputs = _outputs(events3) + assert any('done:' in str(o) for o in outputs) + + +# ========================================================================= +# rerun_on_resume=False for dynamic node +# ========================================================================= + + +@pytest.mark.asyncio +async def test_dynamic_node_rerun_on_resume_false(): + """Dynamic child with rerun_on_resume=False auto-completes on resume. + + Setup: Parent calls ctx.run_node(child). Child has + rerun_on_resume=False and interrupts with fc-1. + Action: Send FR for fc-1. + Assert: + - Child does NOT re-execute _run_impl. + - Child auto-completes with the FR response as output. + - Parent receives the auto-completed output. + """ + run_count = [0] + + @node(rerun_on_resume=False) + async def child(*, ctx, node_input): + run_count[0] += 1 + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + result = await ctx.run_node(child) + yield f'parent: {result}' + + wf = Workflow( + name='wf', + edges=[(START, parent)], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: child interrupts + events1 = await _run(runner, ss, session, 'go') + assert 'fc-1' in _interrupt_ids(events1) + assert run_count[0] == 1 + + # Run 2: resume + events2 = await _resume(runner, ss, session, 'fc-1', {'answer': 42}) + + # Child should NOT have re-executed (run_count stays 1). + assert run_count[0] == 1 + # Parent receives the FR response as child's output (unwrapped). + outputs = _outputs(events2) + assert "parent: {'answer': 42}" in outputs + + +# ========================================================================= +# Sequential run_id +# ========================================================================= + + +@pytest.mark.asyncio +async def test_dynamic_nodes_get_run_id_one(): + """Each distinct dynamic child gets run_id '1' for its first run.""" + + @node + async def step_a(*, ctx, node_input): + yield f'child: {node_input}' + + @node + async def step_b(*, ctx, node_input): + yield f'child: {node_input}' + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + a = await ctx.run_node(step_a, node_input='x') + b = await ctx.run_node(step_b, node_input='y') + yield f'{a},{b}' + + wf = Workflow(name='wf', edges=[(START, parent)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + events = await _run(runner, ss, session, 'go') + + child_events = [ + (e.node_name, e.node_info.path.split('@')[-1]) + for e in events + if e.output is not None + and e.node_name + and e.node_name.startswith('step_') + ] + # Each dynamic child is a distinct path, each gets run_id '1'. + assert child_events == [('step_a', '1'), ('step_b', '1')] + + +@pytest.mark.asyncio +async def test_dynamic_node_keeps_run_id_on_resume(): + """A dynamic node that interrupts and resumes keeps the same run_id.""" + + @node(rerun_on_resume=True) + async def approver(*, ctx, node_input): + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + yield f'approved: {ctx.resume_inputs["fc-1"]["answer"]}' + return + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='approve', args={}, id='fc-1' + ) + ) + ] + ), + long_running_tool_ids={'fc-1'}, + ) + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + result = await ctx.run_node(approver) + yield f'final: {result}' + + wf = Workflow(name='wf', edges=[(START, parent)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: child interrupts. + events1 = await _run(runner, ss, session, 'go') + approver_run_ids_1 = [ + e.node_info.path.split('@')[-1] + for e in events1 + if e.node_info.path and 'approver@' in e.node_info.path + ] + + # Run 2: resume with function response. + events2 = await _resume(runner, ss, session, 'fc-1', {'answer': 'yes'}) + approver_run_ids_2 = [ + e.node_info.path.split('@')[-1] + for e in events2 + if e.node_info.path and 'approver@' in e.node_info.path + ] + + # Same run_id across interrupt and resume. + assert approver_run_ids_1 + assert approver_run_ids_2 + assert approver_run_ids_1[0] == approver_run_ids_2[0] + + +# ========================================================================= +# Custom run_id +# ========================================================================= + + +@pytest.mark.asyncio +async def test_custom_run_id_used_on_events(): + """ctx.run_node(run_id=...) sets the custom run_id on child events.""" + + @node + async def child(*, ctx, node_input): + yield f'done: {node_input}' + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + result = await ctx.run_node( + child, node_input='hello', run_id='my-custom-id' + ) + yield result + + wf = Workflow(name='wf', edges=[(START, parent)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + events = await _run(runner, ss, session, 'go') + + child_events = [ + e + for e in events + if e.node_info and e.node_info.path and 'child' in e.node_info.path + ] + assert child_events + assert all( + e.node_info.path.split('@')[-1] == 'my-custom-id' for e in child_events + ) + + +# ========================================================================= +# Failure handling in dynamic nodes +# ========================================================================= + + +@pytest.mark.asyncio +async def test_dynamic_node_failure_handling(): + """Dynamic node throws exception; parent catches it and continues.""" + + @node + async def failing_node(*, ctx, node_input): + if node_input == 'fail': + raise ValueError('Intentional Failure') + yield f'Processed {node_input}' + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + results = [] + try: + await ctx.run_node(failing_node, node_input='fail') + except DynamicNodeFailError as e: + results.append(f'Caught: {str(e.error)}') + + res = await ctx.run_node(failing_node, node_input='work') + results.append(f'Success: {res}') + yield results + + wf = Workflow(name='wf', edges=[(START, parent)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + events = await _run(runner, ss, session, 'go') + outputs = _outputs(events) + + # Find the list output from parent + list_outputs = [o for o in outputs if isinstance(o, list)] + assert len(list_outputs) == 1 + results = list_outputs[0] + assert 'Caught: Intentional Failure' in results + assert 'Success: Processed work' in results + + +@pytest.mark.asyncio +async def test_workflow_resume_does_not_rerun_completed_llm_agent(): + """Completed LlmAgent node is not rerun upon workflow resumption. + + Setup: Workflow with LlmAgent node and an interrupting node. + Act: + - Run 1: Start workflow, LlmAgent completes, workflow interrupts. + - Run 2: Resume workflow by resolving interrupt. + Assert: + - LlmAgent does not run again in Run 2. + """ + from google.adk.agents.llm_agent import LlmAgent + + from tests.unittests import testing_utils + + # Given a workflow with an LlmAgent and a mock model + mock_model = testing_utils.MockModel.create( + responses=['LLM output content', 'Duplicate run output'] + ) + + agent = LlmAgent(name='my_agent', model=mock_model) + + @node + async def interrupt_node(*, ctx, node_input): + event = Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='tool', id='interrupt_1', args={} + ) + ) + ] + ) + ) + event.long_running_tool_ids = {'interrupt_1'} + yield event + yield f'Resumed with {node_input}' + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + res = await ctx.run_node(agent, node_input='go') + res2 = await ctx.run_node(interrupt_node, node_input=res) + yield res2 + + wf = Workflow(name='wf', edges=[(START, parent)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # When the workflow is run until it interrupts + await _run(runner, ss, session, 'go') + + session = await ss.get_session( + app_name='test', user_id='u', session_id=session.id + ) + + agent_events = [ + e for e in session.events if e.node_info.name == 'my_agent' and e.content + ] + assert len(agent_events) > 0 + agent_event = agent_events[-1] + + # Verify that runners.py cleared the output + assert agent_event.output is None + + # When the workflow is resumed by resolving the interrupt + resume_events = await _resume( + runner, ss, session, fc_id='interrupt_1', response='done' + ) + + # Then the LlmAgent should not run again + agent_runs_again = [ + e for e in resume_events if e.node_info.name == 'my_agent' and e.content + ] + assert ( + len(agent_runs_again) == 0 + ), 'Expected LlmAgent to NOT run again, but it did!' + + +# ========================================================================= +# Parallel execution of dynamic nodes +# ========================================================================= + + +@pytest.mark.asyncio +async def test_dynamic_node_parallel_execution(): + """Three parallel ctx.run_node calls via asyncio.gather return ordered results.""" + + @node + async def echo_node(*, ctx, node_input): + yield node_input + + @node(rerun_on_resume=True) + async def parent_node(*, ctx, node_input): + tasks = [ctx.run_node(echo_node, node_input=f'call_{i}') for i in range(3)] + results = await asyncio.gather(*tasks) + yield results + + wf = Workflow(name='wf', edges=[(START, parent_node)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + events = await _run(runner, ss, session, 'go') + outputs = _outputs(events) + + # Find the list output from parent + list_outputs = [o for o in outputs if isinstance(o, list)] + assert len(list_outputs) == 1 + results = list_outputs[0] + assert results == ['call_0', 'call_1', 'call_2'] + + +@pytest.mark.asyncio +async def test_inner_llm_agent_node_input_survives_tool_round_trip(): + """Inner LlmAgent's node_input reaches every LLM request across a tool round trip. + + Setup: Workflow with a single dynamic node whose body invokes an inner + LlmAgent. The agent's mock model emits a function_call on the first + turn and final text on the second turn. + Act: Run the workflow once; the dynamic node passes USER_PHRASE to the + inner agent. + Assert: + - The mock model is called exactly twice (pre- and post-tool). + - USER_PHRASE appears in the user-role text of both LLM requests. + - The second request contains both function_call and function_response + (proving a real tool round trip occurred). + """ + from google.adk.agents.llm_agent import LlmAgent + from google.adk.tools import FunctionTool + + from tests.unittests import testing_utils + + USER_PHRASE = 'lookup price for token MARKER-7Z9' + + def lookup_price(token: str) -> dict: + return {'price': '$9.99'} + + def _user_texts(req) -> list[str]: + texts: list[str] = [] + for content in req.contents or []: + if content.role != 'user': + continue + for part in content.parts or []: + if part.text and not part.text.startswith('For context:'): + texts.append(part.text) + return texts + + def _part_kinds(req) -> list[str]: + kinds: list[str] = [] + for content in req.contents or []: + for part in content.parts or []: + if part.function_call: + kinds.append('function_call') + elif part.function_response: + kinds.append('function_response') + else: + kinds.append('text') + return kinds + + mock_model = testing_utils.MockModel.create( + responses=[ + [ + types.Part( + function_call=types.FunctionCall( + id='fc1', + name='lookup_price', + args={'token': 'MARKER-7Z9'}, + ) + ) + ], + 'The price is $9.99.', + ] + ) + + inner_agent = LlmAgent( + name='inner_agent', + model=mock_model, + tools=[FunctionTool(lookup_price)], + ) + + @node(rerun_on_resume=True) + async def parent(*, ctx, node_input): + yield await ctx.run_node(inner_agent, node_input=USER_PHRASE) + + wf = Workflow(name='wf', edges=[(START, parent)]) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # When the workflow runs end-to-end through the tool round trip + await _run(runner, ss, session, 'go') + + # Then the model is invoked exactly twice + assert len(mock_model.requests) == 2 + + # And USER_PHRASE survives into both LLM requests + assert any(USER_PHRASE in t for t in _user_texts(mock_model.requests[0])) + assert any( + USER_PHRASE in t for t in _user_texts(mock_model.requests[1]) + ), 'original node_input was dropped from the second LLM request' + + # And the second request reflects a real tool round trip + second_request_kinds = _part_kinds(mock_model.requests[1]) + assert 'function_call' in second_request_kinds + assert 'function_response' in second_request_kinds diff --git a/tests/unittests/workflow/test_workflow_failures.py b/tests/unittests/workflow/test_workflow_failures.py new file mode 100644 index 0000000000..46c2d188ab --- /dev/null +++ b/tests/unittests/workflow/test_workflow_failures.py @@ -0,0 +1,1070 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for Workflow error handling, graceful shutdown, and retry logic.""" + +import asyncio +from typing import Any +from typing import AsyncGenerator +from unittest import mock + +from google.adk.agents.context import Context +from google.adk.apps.app import App +from google.adk.events.event import Event +# Added for the moved test +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.workflow import BaseNode +from google.adk.workflow import Edge +from google.adk.workflow import START +from google.adk.workflow._graph import Graph +from google.adk.workflow._node import node +from google.adk.workflow._node import Node +from google.adk.workflow._node_status import NodeStatus +from google.adk.workflow._retry_config import RetryConfig +from google.adk.workflow._workflow import Workflow +from google.genai import types +from pydantic import ConfigDict +from pydantic import Field +import pytest +from typing_extensions import override + +from .. import testing_utils +from .workflow_testing_utils import create_parent_invocation_context +from .workflow_testing_utils import simplify_events_with_node +from .workflow_testing_utils import TestingNode + + +class CustomError(Exception): + """A custom error for testing.""" + + +class CustomRetryableError(Exception): + """A custom error meant to be retried.""" + + +class CustomNonRetryableError(Exception): + """A custom error not meant to be retried.""" + + +class _FlakyNode(BaseNode): + model_config = ConfigDict(arbitrary_types_allowed=True) + + message: str = Field(default='') + succeed_on_iteration: int = Field(default=0) + tracker: dict[str, Any] = Field(default_factory=dict) + exception_to_raise: Exception = Field(...) + + @override + async def run( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + iteration_count = self.tracker.get('iteration_count', 0) + 1 + self.tracker['iteration_count'] = iteration_count + self.tracker.setdefault('attempt_counts', []).append(ctx.attempt_count) + + if iteration_count < self.succeed_on_iteration: + raise self.exception_to_raise + + yield Event( + output=self.message, + ) + + +async def _run_workflow(wf, message='start'): + """Run a Workflow through Runner, return collected events.""" + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + msg = types.Content(parts=[types.Part(text=message)], role='user') + events = [] + try: + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + except CustomError: + pass + return events, ss, session + + +# --- Tests originally in test_workflow_agent_failures.py --- + + +@pytest.mark.asyncio +async def test_retry_on_matching_exception(request: pytest.FixtureRequest): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=3, + tracker=tracker, + exception_to_raise=CustomRetryableError('Simulated failure'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=['CustomRetryableError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + agent = Workflow( + name='test_workflow_agent_retry', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_retry@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_workflow_agent_retry@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_workflow_agent_retry@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 3 + + +@pytest.mark.asyncio +async def test_no_retry_on_non_matching_exception( + request: pytest.FixtureRequest, +): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=CustomNonRetryableError('Unexpected failure'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=['CustomRetryableError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + agent = Workflow( + name='test_workflow_agent_no_retry', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + + with pytest.raises(CustomNonRetryableError, match='Unexpected failure'): + await runner.run_async(testing_utils.get_user_content('start')) + + events = runner.session.events + + assert simplify_events_with_node(events) == [ + ('user', 'start'), + ( + 'test_workflow_agent_no_retry@1/NodeA@1', + {'output': 'Executing A'}, + ), + ] + + +@pytest.mark.asyncio +async def test_retry_on_all_exceptions_if_not_specified( + request: pytest.FixtureRequest, +): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=ValueError('Any failure'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=None, + ), + ) + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + ], + ) + agent = Workflow( + name='test_workflow_agent_retry_all', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_retry_all@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_workflow_agent_retry_all@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ] + + +@pytest.mark.asyncio +async def test_attempt_count_populated_correctly( + request: pytest.FixtureRequest, +): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=3, + tracker=tracker, + exception_to_raise=CustomRetryableError('Simulated failure'), + retry_config=RetryConfig( + initial_delay=0.0, exceptions=['CustomRetryableError'] + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + agent = Workflow( + name='test_retry_count_populated_correctly', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + assert simplify_events_with_node(events) == [ + ( + 'test_retry_count_populated_correctly@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_retry_count_populated_correctly@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_retry_count_populated_correctly@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 3 + assert flaky_node_in_agent.tracker['attempt_counts'] == [1, 2, 3] + + +@pytest.mark.asyncio +async def test_retry_max_attempts_exceeded( + request: pytest.FixtureRequest, +): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=5, + tracker=tracker, + exception_to_raise=CustomRetryableError('Persisted failure'), + retry_config=RetryConfig( + initial_delay=0.0, + max_attempts=3, + exceptions=['CustomRetryableError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + agent = Workflow( + name='test_workflow_agent_max_attempts', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + + with pytest.raises(CustomRetryableError, match='Persisted failure'): + await runner.run_async(testing_utils.get_user_content('start')) + + events = runner.session.events + + assert simplify_events_with_node(events) == [ + ('user', 'start'), + ( + 'test_workflow_agent_max_attempts@1/NodeA@1', + {'output': 'Executing A'}, + ), + ] + + +@pytest.mark.asyncio +async def test_fails_without_retry_config( + request: pytest.FixtureRequest, +): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=ValueError('Any failure'), + retry_config=None, + ) + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + ], + ) + agent = Workflow( + name='test_workflow_agent_fails_without_retry_config', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(ValueError, match='Any failure'): + await runner.run_async(testing_utils.get_user_content('start')) + events = runner.session.events + + assert simplify_events_with_node(events) == [ + ('user', 'start'), + ( + 'test_workflow_agent_fails_without_retry_config@1/NodeA@1', + {'output': 'Executing A'}, + ), + ] + + +@pytest.mark.asyncio +async def test_retries_with_empty_retry_config( + request: pytest.FixtureRequest, +): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=ValueError('Another failure'), + retry_config=RetryConfig(), + ) + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + ], + ) + agent = Workflow( + name='test_workflow_agent_retries_with_empty_retry_config', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_retries_with_empty_retry_config@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_workflow_agent_retries_with_empty_retry_config@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ] + + +@pytest.mark.asyncio +async def test_retry_with_delay(request: pytest.FixtureRequest): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=CustomRetryableError('Sleep test failure'), + retry_config=RetryConfig( + initial_delay=5.0, + max_attempts=3, + jitter=0.0, + exceptions=['CustomRetryableError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + agent = Workflow( + name='test_workflow_agent_retry_delay', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + + with mock.patch.object( + asyncio, 'sleep', new_callable=mock.AsyncMock + ) as mock_sleep: + events = await runner.run_async(testing_utils.get_user_content('start')) + mock_sleep.assert_any_await(5.0) + + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_retry_delay@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_workflow_agent_retry_delay@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_workflow_agent_retry_delay@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + + +@pytest.mark.asyncio +async def test_retry_with_backoff_and_jitter(request: pytest.FixtureRequest): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=4, + tracker=tracker, + exception_to_raise=CustomRetryableError('Backoff test failure'), + retry_config=RetryConfig( + initial_delay=2.0, + max_attempts=5, + backoff_factor=3.0, + jitter=0.0, + exceptions=['CustomRetryableError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + agent = Workflow( + name='test_workflow_agent_retry_backoff', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + + with mock.patch('asyncio.sleep', new_callable=mock.AsyncMock) as mock_sleep: + events = await runner.run_async(testing_utils.get_user_content('start')) + mock_sleep.assert_has_awaits( + [mock.call(2.0), mock.call(6.0), mock.call(18.0)] + ) + + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_retry_backoff@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_workflow_agent_retry_backoff@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_workflow_agent_retry_backoff@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + + +@pytest.mark.asyncio +async def test_retry_with_jitter(request: pytest.FixtureRequest): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=CustomRetryableError('Jitter test failure'), + retry_config=RetryConfig( + initial_delay=4.0, + max_attempts=3, + backoff_factor=1.0, + jitter=0.5, + exceptions=['CustomRetryableError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + agent = Workflow( + name='test_workflow_agent_retry_jitter', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + + with ( + mock.patch('asyncio.sleep', new_callable=mock.AsyncMock) as mock_sleep, + mock.patch('random.uniform', return_value=-1.0) as mock_random, + ): + events = await runner.run_async(testing_utils.get_user_content('start')) + mock_sleep.assert_any_await(3.0) + mock_random.assert_called_once_with(-2.0, 2.0) + + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_retry_jitter@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_workflow_agent_retry_jitter@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_workflow_agent_retry_jitter@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + + +@pytest.mark.asyncio +async def test_retry_with_exception_classes(request: pytest.FixtureRequest): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=3, + tracker=tracker, + exception_to_raise=CustomRetryableError('Simulated failure'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=[CustomRetryableError], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + agent = Workflow( + name='test_retry_exception_classes', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + assert simplify_events_with_node(events) == [ + ( + 'test_retry_exception_classes@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_retry_exception_classes@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_retry_exception_classes@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + + +@pytest.mark.asyncio +async def test_retry_with_mixed_exception_types(request: pytest.FixtureRequest): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=2, + tracker=tracker, + exception_to_raise=CustomRetryableError('Simulated failure'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=[CustomRetryableError, 'ValueError'], + ), + ) + node_c = TestingNode(name='NodeC', output='Executing C') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + Edge(from_node=flaky_node, to_node=node_c), + ], + ) + agent = Workflow( + name='test_retry_mixed_exceptions', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + assert simplify_events_with_node(events) == [ + ( + 'test_retry_mixed_exceptions@1/NodeA@1', + {'output': 'Executing A'}, + ), + ( + 'test_retry_mixed_exceptions@1/FlakyNode@1', + {'output': 'Executing B'}, + ), + ( + 'test_retry_mixed_exceptions@1/NodeC@1', + {'output': 'Executing C'}, + ), + ] + + +@pytest.mark.asyncio +async def test_retry_exception_class_no_match(request: pytest.FixtureRequest): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=3, + tracker=tracker, + exception_to_raise=CustomNonRetryableError('Unexpected failure'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=[CustomRetryableError], + ), + ) + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + ], + ) + agent = Workflow( + name='test_retry_exception_class_no_match', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + + with pytest.raises(CustomNonRetryableError, match='Unexpected failure'): + await runner.run_async(testing_utils.get_user_content('start')) + + flaky_node_in_agent = next( + n for n in agent.graph.nodes if n.name == 'FlakyNode' + ) + assert flaky_node_in_agent.tracker['iteration_count'] == 1 + + +def test_retry_config_rejects_invalid_exception_types(): + with pytest.raises(ValueError, match='exception class names'): + RetryConfig(exceptions=[42]) + + +def test_retry_config_normalizes_classes_to_strings(): + config = RetryConfig(exceptions=[ValueError, 'KeyError']) + assert config.exceptions == ['ValueError', 'KeyError'] + + +@pytest.mark.asyncio +async def test_node_cancellation_on_sibling_failure( + request: pytest.FixtureRequest, +): + slow_node_started = False + slow_node_cancelled = False + + async def slow_node(): + nonlocal slow_node_started, slow_node_cancelled + slow_node_started = True + try: + await asyncio.sleep(10) + except asyncio.CancelledError: + slow_node_cancelled = True + raise + yield 'Slow' + + async def fail_node(): + await asyncio.sleep(0.1) + raise ValueError('Fail') + + agent = Workflow( + name='test_workflow_cancellation_sibling', + edges=[ + (START, slow_node), + (START, fail_node), + ], + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(ValueError, match='Fail'): + await runner.run_async(testing_utils.get_user_content('start')) + + assert slow_node_started is True + assert slow_node_cancelled is True + + +@pytest.mark.asyncio +async def test_parallel_worker_cancellation_on_sibling_failure( + request: pytest.FixtureRequest, +): + slow_node_started = False + slow_node_cancelled = False + + async def slow_node_impl(ctx: Context, node_input: Any): + nonlocal slow_node_started, slow_node_cancelled + slow_node_started = True + try: + await asyncio.sleep(10) + except asyncio.CancelledError: + slow_node_cancelled = True + raise + yield f'Slow {node_input}' + + async def fail_node(): + await asyncio.sleep(0.1) + raise ValueError('Fail') + + node_parallel = node( + slow_node_impl, name='node_parallel', parallel_worker=True + ) + + agent = Workflow( + name='test_workflow_parallel_cancellation_sibling', + edges=[ + (START, node_parallel), + (START, fail_node), + ], + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(ValueError, match='Fail'): + await runner.run_async(testing_utils.get_user_content('start')) + + assert slow_node_started is True + assert slow_node_cancelled is True + + +@pytest.mark.asyncio +async def test_parallel_worker_cancellation_on_worker_failure( + request: pytest.FixtureRequest, +): + slow_worker_started = False + slow_worker_cancelled = False + + async def worker_node_impl(ctx: Context, node_input: Any): + nonlocal slow_worker_started, slow_worker_cancelled + if node_input == 'fail': + await asyncio.sleep(0.1) + raise ValueError('Worker Fail') + else: + slow_worker_started = True + try: + await asyncio.sleep(10) + except asyncio.CancelledError: + slow_worker_cancelled = True + raise + yield f'Success {node_input}' + + from tests.unittests.workflow.workflow_testing_utils import TestingNode + + node_list = TestingNode(name='NodeList', output=['fail', 'slow']) + node_parallel = node( + worker_node_impl, name='node_parallel', parallel_worker=True + ) + + agent = Workflow( + name='test_workflow_parallel_cancellation_worker', + edges=[ + (START, node_list), + (node_list, node_parallel), + ], + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(ValueError, match='Worker Fail'): + await runner.run_async(testing_utils.get_user_content('start')) + + assert slow_worker_started is True + assert slow_worker_cancelled is True + + +@pytest.mark.asyncio +async def test_nested_workflow_cancellation_on_sibling_failure( + request: pytest.FixtureRequest, +): + inner_node_started = False + inner_node_cancelled = False + + async def inner_slow_node(): + nonlocal inner_node_started, inner_node_cancelled + inner_node_started = True + try: + await asyncio.sleep(10) + except asyncio.CancelledError: + inner_node_cancelled = True + raise + yield 'Inner Slow' + + inner_agent = Workflow( + name='inner_workflow', + edges=[ + (START, inner_slow_node), + ], + ) + + async def fail_node(): + await asyncio.sleep(0.1) + raise ValueError('Fail') + + outer_agent = Workflow( + name='outer_workflow', + edges=[ + (START, inner_agent), + (START, fail_node), + ], + ) + + app = App(name=request.function.__name__, root_agent=outer_agent) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(ValueError, match='Fail'): + await runner.run_async(testing_utils.get_user_content('start')) + + assert inner_node_started is True + assert inner_node_cancelled is True + + +@pytest.mark.asyncio +async def test_error_event_emitted_on_failure( + request: pytest.FixtureRequest, +): + tracker = {'iteration_count': 0} + node_a = TestingNode(name='NodeA', output='Executing A') + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Executing B', + succeed_on_iteration=999, + tracker=tracker, + exception_to_raise=ValueError('Something went wrong'), + retry_config=None, + ) + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=flaky_node), + ], + ) + agent = Workflow( + name='test_error_event', + graph=graph, + ) + + ctx = await create_parent_invocation_context( + request.function.__name__, agent, resumable=True + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(ValueError, match='Something went wrong'): + await runner.run_async(testing_utils.get_user_content('start')) + events = runner.session.events + + error_events = [ + e + for e in events + if isinstance(e, Event) + and e.error_code is not None + and e.node_name == 'FlakyNode' + ] + assert len(error_events) == 1 + assert error_events[0].error_code == 'ValueError' + assert error_events[0].error_message == 'Something went wrong' + + +@pytest.mark.asyncio +async def test_error_event_emitted_on_each_retry( + request: pytest.FixtureRequest, +): + tracker = {'iteration_count': 0} + + flaky_node = _FlakyNode( + name='FlakyNode', + message='Success', + succeed_on_iteration=3, + tracker=tracker, + exception_to_raise=CustomRetryableError('Transient error'), + retry_config=RetryConfig( + initial_delay=0.0, + exceptions=['CustomRetryableError'], + ), + ) + graph = Graph( + edges=[ + Edge(from_node=START, to_node=flaky_node), + ], + ) + agent = Workflow( + name='test_error_event_retry', + graph=graph, + ) + + ctx = await create_parent_invocation_context( + request.function.__name__, agent, resumable=True + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + error_events = [ + e + for e in events + if isinstance(e, Event) + and e.error_code is not None + and e.node_name == 'FlakyNode' + ] + assert len(error_events) == 2 + for err in error_events: + assert err.error_code == 'CustomRetryableError' + assert err.error_message == 'Transient error' + + assert simplify_events_with_node(events) == [ + ( + 'test_error_event_retry@1/FlakyNode@1', + {'output': 'Success'}, + ), + ] + + +# --- Moved from test_workflow_failure.py --- + + +@pytest.mark.asyncio +async def test_workflow_returns_normally_on_node_failure(): + """Workflow returns normally when a node fails, without duplicate error events.""" + + @node() + def failing_node(ctx: Context): + raise CustomError('Node failed') + yield 'output' + + wf = Workflow( + name='test_error_workflow', + edges=[ + (START, failing_node), + ], + ) + + events, ss, session = await _run_workflow(wf) + + error_events = [ + e + for e in events + if isinstance(e, Event) and e.error_code == 'CustomError' + ] + assert len(error_events) == 1 + assert error_events[0].error_message == 'Node failed' + + workflow_error_events = [ + e + for e in events + if isinstance(e, Event) + and e.error_code is not None + and e.node_info + and e.node_info.path == 'test_error_workflow@1' + ] + assert len(workflow_error_events) == 0 diff --git a/tests/unittests/workflow/test_workflow_function_tool_as_node.py b/tests/unittests/workflow/test_workflow_function_tool_as_node.py new file mode 100644 index 0000000000..6a165a7ccf --- /dev/null +++ b/tests/unittests/workflow/test_workflow_function_tool_as_node.py @@ -0,0 +1,75 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for FunctionTool nodes in a Workflow.""" + +from google.adk.events.event import Event +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.tools.function_tool import FunctionTool +from google.adk.workflow import START +from google.adk.workflow._workflow import Workflow +from google.genai import types +import pytest + +from .workflow_testing_utils import simplify_events_with_node + + +def _produce_input() -> None: + """Absorbs user content so downstream ToolNodes receive None.""" + return None + + +def _func_a() -> dict[str, str]: + """Returns a value from function A.""" + return {'val': 'Hello'} + + +def _func_b(val: str) -> str: + """Returns a value incorporating input from A.""" + return f'{val}_world' + + +@pytest.mark.asyncio +async def test_run_async_with_function_tools(): + """FunctionTool output is piped as input to the next FunctionTool.""" + tool_a = FunctionTool(_func_a) + tool_b = FunctionTool(_func_b) + wf = Workflow( + name='wf_with_tools', + edges=[ + (START, _produce_input, tool_a, tool_b), + ], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='start')], role='user') + events: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + assert simplify_events_with_node(events) == [ + ( + 'wf_with_tools@1/_func_a@1', + {'output': {'val': 'Hello'}}, + ), + ( + 'wf_with_tools@1/_func_b@1', + {'output': 'Hello_world'}, + ), + ] diff --git a/tests/unittests/workflow/test_workflow_hitl.py b/tests/unittests/workflow/test_workflow_hitl.py new file mode 100644 index 0000000000..8a2558b153 --- /dev/null +++ b/tests/unittests/workflow/test_workflow_hitl.py @@ -0,0 +1,2152 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Testings for the Workflow HITL scenarios.""" + +import asyncio +import copy +from typing import Any +from typing import AsyncGenerator +from unittest import mock + +from google.adk.agents.context import Context +from google.adk.agents.llm_agent import LlmAgent +from google.adk.apps.app import App +from google.adk.apps.app import ResumabilityConfig +from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService +from google.adk.events.event import Event +from google.adk.events.request_input import RequestInput +from google.adk.memory.in_memory_memory_service import InMemoryMemoryService +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.tools.long_running_tool import LongRunningFunctionTool +from google.adk.workflow import BaseNode +from google.adk.workflow import Edge +from google.adk.workflow import node +from google.adk.workflow import START +from google.adk.workflow._node_status import NodeStatus +from google.adk.workflow._workflow import Workflow +from google.adk.workflow.utils._rehydration_utils import _wrap_response +from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_response +from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids +from google.adk.workflow.utils._workflow_hitl_utils import REQUEST_CREDENTIAL_FUNCTION_CALL_NAME +from google.adk.workflow.utils._workflow_hitl_utils import REQUEST_INPUT_FUNCTION_CALL_NAME +from google.genai import types +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import Field +import pytest +from typing_extensions import override + +from . import workflow_testing_utils +from .. import testing_utils +from .workflow_testing_utils import InputCapturingNode +from .workflow_testing_utils import RequestInputNode + +ANY = mock.ANY + + +class _TestingNode(BaseNode): + """A node that produces a simple message.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + name: str = Field(default='') + message: str = Field(default='') + delay: float = Field(default=0) + + @override + def get_name(self) -> str: + return self.name + + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + if self.delay > 0: + await asyncio.sleep(self.delay) + yield Event(output=self.message) + + +def long_running_tool_func(): + """A test tool that simulates a long-running operation.""" + return None + + +@pytest.mark.parametrize( + 'resumable', + [ + pytest.param( + False, marks=pytest.mark.xfail(reason='Fails in non-resumable mode') + ), + pytest.param( + True, marks=pytest.mark.xfail(reason='Resumability broken in V2') + ), + ], +) +@pytest.mark.asyncio +async def test_workflow_pause_and_resume( + request: pytest.FixtureRequest, + resumable: bool, +): + """Tests that a workflow can pause and resume. + + This test uses LlmAgent with LongRunningFunctionTool. + """ + node_a = _TestingNode(name='NodeA', message='Executing A') + + node_b = LlmAgent( + name='NodeB_agent', + model=testing_utils.MockModel.create( + responses=[ + types.Part.from_function_call( + name='long_running_tool_func', + args={}, + ), + types.Part.from_text(text='LLM response after tool'), + ] + ), + tools=[LongRunningFunctionTool(func=long_running_tool_func)], + ) + node_c = _TestingNode(name='NodeC', message='Executing C') + agent = Workflow( + name='test_workflow_agent_hitl', + edges=[ + (START, node_a), + (node_a, node_b), + (node_b, node_c), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # First run: should pause on the long-running function call. + user_event = testing_utils.get_user_content('start workflow') + events1 = await runner.run_async(user_event) + + invocation_id = events1[0].invocation_id + fc_event = workflow_testing_utils.find_function_call_event( + events1, 'long_running_tool_func' + ) + function_call_id = fc_event.content.parts[0].function_call.id + + simplified_events1 = ( + workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events1), + ) + ) + + # Filter to outer workflow state checkpoint events only (LlmAgent as Mesh + # emits internal state events that are implementation details). + outer_state_events1 = [ + e + for e in simplified_events1 + if e[0] == 'test_workflow_agent_hitl' + and isinstance(e[1], dict) + and 'nodes' in e[1] + ] + + # Verify the outer workflow saw: NodeB_agent (interrupted). + if resumable: + assert outer_state_events1[-1] == ( + 'test_workflow_agent_hitl', + { + 'nodes': { + 'NodeA': {'status': NodeStatus.COMPLETED.value}, + 'NodeB_agent': { + 'status': NodeStatus.WAITING.value, + 'interrupts': [function_call_id], + }, + }, + }, + ) + + tool_response = testing_utils.UserContent( + types.Part( + function_response=types.FunctionResponse( + id=function_call_id, + name='long_running_tool_func', + response={'result': 'Final tool output'}, + ) + ) + ) + + # Resume with tool output. + # In resumable mode, reuse the invocation_id so agent state is loaded. + # In non-resumable mode, use a new invocation so state is reconstructed + # from session events. + events2 = await runner.run_async( + new_message=tool_response, + invocation_id=invocation_id, + ) + + simplified_events2 = ( + workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events2), + include_resume_inputs=True, + ) + ) + + # Filter to outer workflow state checkpoint events only. + outer_state_events2 = [ + e + for e in simplified_events2 + if e[0] == 'test_workflow_agent_hitl' + and isinstance(e[1], dict) + and 'nodes' in e[1] + ] + + # Verify NodeB_agent resumed, completed, and NodeC ran. + if resumable: + assert outer_state_events2[-1] == ( + 'test_workflow_agent_hitl', + { + 'nodes': { + 'NodeA': {'status': NodeStatus.COMPLETED.value}, + 'NodeB_agent': {'status': NodeStatus.COMPLETED.value}, + 'NodeC': {'status': NodeStatus.COMPLETED.value}, + } + }, + ) + # Verify end_of_agent was emitted. + end_events = [ + e + for e in simplified_events2 + if e[0] == 'test_workflow_agent_hitl' + and e[1] == testing_utils.END_OF_AGENT + ] + assert len(end_events) == 1 + + +@pytest.mark.xfail(reason='Resumability broken in V2') +@pytest.mark.asyncio +async def test_workflow_interrupt_allows_parallel_execution( + request: pytest.FixtureRequest, +): + """Tests that if one node is interrupted, parallel nodes can execute. + + This test uses LlmAgent with LongRunningFunctionTool, which requires + resumability to preserve the LLM's conversation state across interrupts. + """ + node_a = LlmAgent( + name='NodeA', + model=testing_utils.MockModel.create( + responses=[ + types.Part.from_function_call( + name='long_running_tool_func', + args={}, + ), + ] + ), + tools=[LongRunningFunctionTool(func=long_running_tool_func)], + ) + node_b = _TestingNode(name='NodeB', message='Executing B', delay=0.5) + agent = Workflow( + name='test_workflow_agent_parallel_interrupt', + edges=[ + (START, node_a), + (START, node_b), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + user_event = testing_utils.get_user_content('start workflow') + events = await runner.run_async(user_event) + fc_event = workflow_testing_utils.find_function_call_event( + events, 'long_running_tool_func' + ) + function_call_id = fc_event.content.parts[0].function_call.id + + simplified = workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events) + ) + # Filter to outer workflow state checkpoint events only (LlmAgent as Mesh + # emits internal state events that are implementation details). + outer_state = [ + e + for e in simplified + if e[0] == 'test_workflow_agent_parallel_interrupt' + and isinstance(e[1], dict) + and 'nodes' in e[1] + ] + + # Verify final state: NodeA interrupted, NodeB completed. + assert outer_state[-1] == ( + 'test_workflow_agent_parallel_interrupt', + { + 'nodes': { + 'NodeA': { + 'status': NodeStatus.WAITING.value, + 'interrupts': [function_call_id], + }, + 'NodeB': {'status': NodeStatus.COMPLETED.value}, + }, + }, + ) + + +@pytest.mark.parametrize( + 'resumable', + [ + False, + pytest.param( + True, marks=pytest.mark.xfail(reason='Resumability broken in V2') + ), + ], +) +@pytest.mark.asyncio +async def test_workflow_request_input_resume( + request: pytest.FixtureRequest, resumable: bool +): + """Tests resume with RequestInputEvent.""" + + class UserDetails(BaseModel): + name: str + age: int + + node_a = RequestInputNode( + name='NodeA_input', + message='Please provide user details.', + response_schema=UserDetails.model_json_schema(), + ) + node_b = _TestingNode(name='NodeB', message='Received user details') + agent = Workflow( + name='test_workflow_agent_input_schema', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_b), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run and expect RequestInputEvent + user_event = testing_utils.get_user_content('start workflow') + events1 = await runner.run_async(user_event) + + request_input_event = workflow_testing_utils.find_function_call_event( + events1, REQUEST_INPUT_FUNCTION_CALL_NAME + ) + assert request_input_event is not None + args = request_input_event.content.parts[0].function_call.args + assert args['message'] == 'Please provide user details.' + assert args['response_schema'] == { + 'properties': { + 'name': {'title': 'Name', 'type': 'string'}, + 'age': {'title': 'Age', 'type': 'integer'}, + }, + 'required': ['name', 'age'], + 'title': 'UserDetails', + 'type': 'object', + } + interrupt_id = get_request_input_interrupt_ids(request_input_event)[0] + invocation_id = request_input_event.invocation_id + + simplified_events1 = ( + workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events1) + ) + ) + expected_events1 = [ + ( + 'test_workflow_agent_input_schema', + { + 'nodes': { + 'NodeA_input': {'status': NodeStatus.RUNNING.value}, + } + }, + ), + ( + 'test_workflow_agent_input_schema@1/NodeA_input@1', + types.Part( + function_call=types.FunctionCall( + name=REQUEST_INPUT_FUNCTION_CALL_NAME, + args={ + 'interruptId': interrupt_id, + 'message': 'Please provide user details.', + 'payload': None, + 'response_schema': { + 'properties': { + 'name': {'title': 'Name', 'type': 'string'}, + 'age': {'title': 'Age', 'type': 'integer'}, + }, + 'required': ['name', 'age'], + 'title': 'UserDetails', + 'type': 'object', + }, + }, + ) + ), + ), + ( + 'test_workflow_agent_input_schema', + { + 'nodes': { + 'NodeA_input': { + 'status': NodeStatus.WAITING.value, + 'interrupts': [interrupt_id], + }, + }, + }, + ), + ] + if resumable: + assert simplified_events1 == expected_events1 + else: + assert simplified_events1 == ( + workflow_testing_utils.strip_checkpoint_events(expected_events1) + ) + + # Resume with user input + user_input = create_request_input_response( + interrupt_id, {'name': 'John', 'age': 30} + ) + events2 = await runner.run_async( + new_message=testing_utils.UserContent(user_input), + invocation_id=invocation_id, + ) + simplified_events2 = ( + workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events2) + ) + ) + expected_events2 = [ + ( + 'test_workflow_agent_input_schema@1/NodeA_input@1', + {'output': {'age': 30, 'name': 'John'}}, + ), + ( + 'test_workflow_agent_input_schema', + { + 'nodes': { + 'NodeA_input': {'status': NodeStatus.COMPLETED.value}, + 'NodeB': { + 'status': NodeStatus.RUNNING.value, + }, + } + }, + ), + ( + 'test_workflow_agent_input_schema@1/NodeB@1', + { + 'output': 'Received user details', + }, + ), + ( + 'test_workflow_agent_input_schema', + { + 'nodes': { + 'NodeA_input': {'status': NodeStatus.COMPLETED.value}, + 'NodeB': {'status': NodeStatus.COMPLETED.value}, + } + }, + ), + ('test_workflow_agent_input_schema', testing_utils.END_OF_AGENT), + ] + if resumable: + assert simplified_events2 == expected_events2 + else: + # In V2 non-resumable mode, NodeA_input is skipped and does not yield output again. + # So we filter out its output event. + expected_non_resumable = [ + e + for e in expected_events2 + if not (e[0].split('/')[-1].split('@')[0] == 'NodeA_input') + ] + expected_non_resumable = workflow_testing_utils.strip_checkpoint_events( + expected_non_resumable + ) + assert simplified_events2 == expected_non_resumable + + +@pytest.mark.asyncio +async def test_workflow_allows_mixing_output_and_request_input( + request: pytest.FixtureRequest, +): + """Tests that yielding both output and RequestInput is allowed in V2.""" + + class _YieldOutputAndRequestInputNode(BaseNode): + """A node that yields output and requests input.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + name: str = Field(default='') + + def __init__(self, *, name: str): + super().__init__() + object.__setattr__(self, 'name', name) + + @override + def get_name(self) -> str: + return self.name + + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + yield Event(output='output 1') + yield RequestInput(interrupt_id='req1') + + node_a = _YieldOutputAndRequestInputNode(name='NodeA') + node_b = InputCapturingNode(name='NodeB') + agent = Workflow( + name='test_agent', + edges=[ + (START, node_a), + (node_a, node_b), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + + events = await runner.run_async(testing_utils.get_user_content('start')) + simplified = workflow_testing_utils.simplify_events_with_node_and_agent_state( + events + ) + + # In V2, mixing output and interrupts is ALLOWED. + # The node yields the output event and then the RequestInput event. + assert len(simplified) == 2 + assert simplified[0] == ( + 'test_agent@1/NodeA@1', + {'output': 'output 1'}, + ) + assert simplified[1][0] == 'test_agent@1/NodeA@1' + assert simplified[1][1].function_call.name == 'adk_request_input' + assert simplified[1][1].function_call.args['interruptId'] == 'req1' + + +@pytest.mark.parametrize( + 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] +) +@pytest.mark.asyncio +async def test_workflow_rerun_on_resume( + request: pytest.FixtureRequest, resumable: bool +): + """Tests node requests input and reruns itself upon resume.""" + + class _RerunNode(BaseNode): + model_config = ConfigDict(arbitrary_types_allowed=True) + rerun_on_resume: bool = Field(default=True) + name: str = Field(default='') + + def __init__(self, *, name: str): + super().__init__() + object.__setattr__(self, 'name', name) + + @override + def get_name(self) -> str: + return self.name + + @override + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if 'count' not in ctx.session.state: + ctx.session.state['count'] = 0 + + approval = None + if ctx.session.state['count'] == 0: + if resume_input := ctx.resume_inputs.get('ask_approval'): + ctx.session.state['count'] = 1 + approval = resume_input['approved'] + else: + yield RequestInput( + message='Needs approval', interrupt_id='ask_approval' + ) + return + yield Event(output={'approval': approval}) + + node_a = _RerunNode(name='NodeA') + agent = Workflow( + name='test_agent', + edges=[Edge(from_node=START, to_node=node_a)], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: node requests input + events1 = await runner.run_async(testing_utils.get_user_content('start')) + simplified_events1 = ( + workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events1), + ) + ) + req_events = workflow_testing_utils.get_request_input_events(events1) + assert len(req_events) == 1 + interrupt_id1 = get_request_input_interrupt_ids(req_events[0])[0] + invocation_id = events1[0].invocation_id + + if resumable: + assert simplified_events1[-1] == ( + 'test_agent', + { + 'nodes': { + 'NodeA': { + 'status': NodeStatus.WAITING.value, + 'interrupts': [interrupt_id1], + }, + }, + }, + ) + + # Run 2: provide input, node reruns and completes + events2 = await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response(interrupt_id1, {'approved': True}) + ), + invocation_id=invocation_id, + ) + simplified_events2 = ( + workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events2), + include_resume_inputs=True, + ) + ) + + expected_events2 = [ + ( + 'test_agent', + { + 'nodes': { + 'NodeA': { + 'status': NodeStatus.RUNNING.value, + 'resume_inputs': {interrupt_id1: {'approved': True}}, + }, + } + }, + ), + ( + 'test_agent@1/NodeA@1', + { + 'output': {'approval': True}, + }, + ), + ( + 'test_agent', + { + 'nodes': { + 'NodeA': {'status': NodeStatus.COMPLETED.value}, + } + }, + ), + ('test_agent', testing_utils.END_OF_AGENT), + ] + if resumable: + assert simplified_events2 == expected_events2 + else: + assert simplified_events2 == ( + workflow_testing_utils.strip_checkpoint_events(expected_events2) + ) + + +@pytest.mark.parametrize( + 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] +) +@pytest.mark.asyncio +async def test_workflow_rerun_with_multiple_inputs( + request: pytest.FixtureRequest, + resumable: bool, +): + """Tests node with rerun_on_resume=True requests multiple inputs and resumed one by one.""" + + class _RerunNodeWithTwoInputs(BaseNode): + model_config = ConfigDict(arbitrary_types_allowed=True) + rerun_on_resume: bool = Field(default=True) + name: str = Field(default='') + + def __init__(self, *, name: str): + super().__init__() + object.__setattr__(self, 'name', name) + + @override + def get_name(self) -> str: + return self.name + + @override + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if resume_input := ctx.resume_inputs.get('req1'): + yield Event(state={'input1': resume_input['text']}) + if resume_input := ctx.resume_inputs.get('req2'): + yield Event(state={'input2': resume_input['text']}) + + if 'input1' not in ctx.state and 'req1' not in ctx.resume_inputs: + yield RequestInput(message='input 1', interrupt_id='req1') + return + + if 'input2' not in ctx.state and 'req2' not in ctx.resume_inputs: + yield RequestInput(message='input 2', interrupt_id='req2') + return + + input1 = ctx.resume_inputs['req1']['text'] + input2 = ctx.resume_inputs['req2']['text'] + yield Event( + output={ + 'input1': input1, + 'input2': input2, + }, + ) + + node_a = _RerunNodeWithTwoInputs(name='NodeA') + agent = Workflow( + name='test_agent', + edges=[Edge(from_node=START, to_node=node_a)], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: node requests 1st input + events1 = await runner.run_async(testing_utils.get_user_content('start')) + simplified_events1 = ( + workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events1), + ) + ) + req_events1 = workflow_testing_utils.get_request_input_events(events1) + assert len(req_events1) == 1 + interrupt_id1 = get_request_input_interrupt_ids(req_events1[0])[0] + assert interrupt_id1 == 'req1' + invocation_id = events1[0].invocation_id + if resumable: + assert simplified_events1[-1] == ( + 'test_agent', + { + 'nodes': { + 'NodeA': { + 'status': NodeStatus.WAITING.value, + 'interrupts': [interrupt_id1], + }, + }, + }, + ) + + # Run 2: provide 1st input, node reruns and requests 2nd input + events2 = await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response(interrupt_id1, {'text': 'response 1'}) + ), + invocation_id=invocation_id, + ) + assert all( + e.invocation_id == invocation_id for e in events2 if e.invocation_id + ) + simplified_events2 = ( + workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events2), + include_resume_inputs=True, + ) + ) + req_events2 = workflow_testing_utils.get_request_input_events(events2) + assert len(req_events2) == 1 + interrupt_id2 = get_request_input_interrupt_ids(req_events2[0])[0] + assert interrupt_id2 == 'req2' + + expected_events2 = [ + ( + 'test_agent', + { + 'nodes': { + 'NodeA': { + 'status': NodeStatus.RUNNING.value, + 'resume_inputs': {interrupt_id1: {'text': 'response 1'}}, + }, + } + }, + ), + ( + 'test_agent@1/NodeA@1', + types.Part( + function_call=types.FunctionCall( + name=REQUEST_INPUT_FUNCTION_CALL_NAME, + args={ + 'interruptId': 'req2', + 'message': 'input 2', + 'payload': None, + 'response_schema': None, + }, + ) + ), + ), + ( + 'test_agent', + { + 'nodes': { + 'NodeA': { + 'status': NodeStatus.WAITING.value, + 'interrupts': [interrupt_id2], + 'resume_inputs': {interrupt_id1: {'text': 'response 1'}}, + }, + }, + }, + ), + ] + if resumable: + assert simplified_events2 == expected_events2 + else: + assert simplified_events2 == ( + workflow_testing_utils.strip_checkpoint_events(expected_events2) + ) + + # Run 3: provide 2nd input, node reruns and completes + events3 = await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response(interrupt_id2, {'text': 'response 2'}) + ), + invocation_id=invocation_id, + ) + assert all( + e.invocation_id == invocation_id for e in events3 if e.invocation_id + ) + simplified_events3 = ( + workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events3), + include_resume_inputs=True, + ) + ) + + expected_events3 = [ + ( + 'test_agent', + { + 'nodes': { + 'NodeA': { + 'status': NodeStatus.RUNNING.value, + 'resume_inputs': { + interrupt_id1: {'text': 'response 1'}, + interrupt_id2: {'text': 'response 2'}, + }, + }, + } + }, + ), + ( + 'test_agent@1/NodeA@1', + { + 'output': {'input1': 'response 1', 'input2': 'response 2'}, + }, + ), + ( + 'test_agent', + { + 'nodes': { + 'NodeA': {'status': NodeStatus.COMPLETED.value}, + } + }, + ), + ('test_agent', testing_utils.END_OF_AGENT), + ] + if resumable: + assert simplified_events3 == expected_events3 + else: + assert simplified_events3 == ( + workflow_testing_utils.strip_checkpoint_events(expected_events3) + ) + + +class _MultiHitlRerunNode(BaseNode): + model_config = ConfigDict(arbitrary_types_allowed=True) + + rerun_on_resume: bool = Field(default=True) + name: str = Field(default='') + + def __init__(self, *, name: str): + super().__init__() + object.__setattr__(self, 'name', name) + + @override + def get_name(self) -> str: + return self.name + + @override + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if not ctx.resume_inputs.get('req1'): + yield RequestInput(interrupt_id='req1', message='request 1') + return + if not ctx.resume_inputs.get('req2'): + yield RequestInput(interrupt_id='req2', message='request 2') + return + yield Event(output='final_output') + + +@pytest.mark.parametrize( + 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] +) +@pytest.mark.asyncio +async def test_rerun_with_multiple_hitl_and_outputs( + request: pytest.FixtureRequest, + resumable: bool, +): + """Tests that a re-runnable node with multiple HITL accumulates outputs.""" + node_a = _MultiHitlRerunNode(name='NodeA') + node_b = InputCapturingNode(name='NodeB') + agent = Workflow( + name='test_agent_multi_hitl', + edges=[ + (START, node_a), + (node_a, node_b), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + session_service = InMemorySessionService() + artifact_service = InMemoryArtifactService() + memory_service = InMemoryMemoryService() + runner1 = Runner( + app=app, + session_service=session_service, + artifact_service=artifact_service, + memory_service=memory_service, + ) + runner2 = Runner( + app=app, + session_service=session_service, + artifact_service=artifact_service, + memory_service=memory_service, + ) + runner3 = Runner( + app=app, + session_service=session_service, + artifact_service=artifact_service, + memory_service=memory_service, + ) + session = await session_service.create_session( + app_name=app.name, user_id='test_user' + ) + + async def collect_events(agen): + events = [] + async for e in agen: + events.append(e) + return events + + # Run 1: node requests input1 + events1 = await collect_events( + runner1.run_async( + user_id=session.user_id, + session_id=session.id, + new_message=testing_utils.get_user_content('start'), + ) + ) + req_events1 = workflow_testing_utils.get_request_input_events(events1) + assert len(req_events1) == 1 + assert get_request_input_interrupt_ids(req_events1[0])[0] == 'req1' + invocation_id = events1[0].invocation_id + + # Run 2: provide input1, node requests input2. + events2 = await collect_events( + runner2.run_async( + user_id=session.user_id, + session_id=session.id, + new_message=testing_utils.UserContent( + create_request_input_response('req1', {'text': 'response 1'}) + ), + invocation_id=invocation_id if resumable else None, + ) + ) + req_events2 = workflow_testing_utils.get_request_input_events(events2) + assert len(req_events2) == 1 + assert get_request_input_interrupt_ids(req_events2[0])[0] == 'req2' + + # Run 3: provide input2, node yields final output and completes. + await collect_events( + runner3.run_async( + user_id=session.user_id, + session_id=session.id, + new_message=testing_utils.UserContent( + create_request_input_response('req2', {'text': 'response 2'}) + ), + invocation_id=invocation_id if resumable else None, + ) + ) + + assert node_b.received_inputs == ['final_output'] + + +@pytest.mark.parametrize( + 'resumable', + [ + False, + pytest.param( + True, marks=pytest.mark.xfail(reason='Resumability broken in V2') + ), + ], +) +@pytest.mark.asyncio +async def test_rerun_on_resume_waits_for_all_interrupts( + request: pytest.FixtureRequest, + resumable: bool, +): + """Tests that a rerun_on_resume node is not rerun until all pending interrupts are resolved.""" + + class _SimultaneousInputsNode(BaseNode): + """A node that requests multiple inputs simultaneously.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + rerun_on_resume: bool = Field(default=True) + name: str = Field(default='') + + def __init__(self, *, name: str): + super().__init__() + object.__setattr__(self, 'name', name) + + @override + def get_name(self) -> str: + return self.name + + @override + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if resume_input := ctx.resume_inputs.get('req1'): + yield Event(state={'input1': resume_input['text']}) + if resume_input := ctx.resume_inputs.get('req2'): + yield Event(state={'input2': resume_input['text']}) + + have_req1 = 'input1' in ctx.state or 'req1' in ctx.resume_inputs + have_req2 = 'input2' in ctx.state or 'req2' in ctx.resume_inputs + + if not have_req1 or not have_req2: + if not have_req1: + yield RequestInput(interrupt_id='req1', message='input 1') + if not have_req2: + yield RequestInput(interrupt_id='req2', message='input 2') + return + + val1 = ctx.state.get('input1') or ctx.resume_inputs['req1']['text'] + val2 = ctx.state.get('input2') or ctx.resume_inputs['req2']['text'] + + yield Event( + output={ + 'input1': val1, + 'input2': val2, + }, + ) + + node_a = _SimultaneousInputsNode(name='NodeA') + agent = Workflow( + name='test_agent', + edges=[Edge(from_node=START, to_node=node_a)], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: node requests both inputs simultaneously. + events1 = await runner.run_async(testing_utils.get_user_content('start')) + simplified1 = ( + workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events1), + include_resume_inputs=True, + ) + ) + req_events1 = workflow_testing_utils.get_request_input_events(events1) + assert len(req_events1) == 2 + interrupt_ids = [] + for e in req_events1: + interrupt_ids.extend(get_request_input_interrupt_ids(e)) + assert set(interrupt_ids) == {'req1', 'req2'} + invocation_id = events1[0].invocation_id + + # Final checkpoint should show WAITING with both interrupt_ids. + if resumable: + final_state1 = simplified1[-1][1] + assert final_state1['nodes']['NodeA']['status'] == ( + NodeStatus.WAITING.value + ) + assert set(final_state1['nodes']['NodeA']['interrupts']) == { + 'req1', + 'req2', + } + + # Run 2: provide only req1 — node should stay WAITING, NOT rerun. + events2 = await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response('req1', {'text': 'response 1'}) + ), + invocation_id=invocation_id, + ) + simplified2 = ( + workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events2), + include_resume_inputs=True, + ) + ) + + # Node should remain WAITING with req2 still pending. + # resume_inputs should accumulate req1's response. + if resumable: + final_state2 = simplified2[-1][1] + assert final_state2['nodes']['NodeA']['status'] == ( + NodeStatus.WAITING.value + ) + assert final_state2['nodes']['NodeA']['interrupts'] == ['req2'] + assert final_state2['nodes']['NodeA']['resume_inputs'] == { + 'req1': {'text': 'response 1'}, + } + + # The node should NOT have produced any RequestInput or data output in resumable mode. + # In non-resumable mode, it re-yields the pending interrupt 'req2'. + req_events2 = workflow_testing_utils.get_request_input_events(events2) + if resumable: + assert len(req_events2) == 0 + else: + assert len(req_events2) == 1 + assert get_request_input_interrupt_ids(req_events2[0]) == ['req2'] + + # Run 3: provide req2 — now all interrupts resolved, node should rerun. + events3 = await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response('req2', {'text': 'response 2'}) + ), + invocation_id=invocation_id, + ) + simplified3 = ( + workflow_testing_utils.simplify_events_with_node_and_agent_state( + copy.deepcopy(events3), + include_resume_inputs=True, + ) + ) + + # Node should have rerun and completed with both responses. + # Last event is END_OF_AGENT, second-to-last is the final agent state. + if resumable: + final_state3 = simplified3[-2][1] + assert final_state3['nodes']['NodeA']['status'] == ( + NodeStatus.COMPLETED.value + ) + + # Check the node produced the expected output (exclude workflow output). + data_events = [ + e + for e in events3 + if hasattr(e, 'node_info') + and e.output is not None + and isinstance(e.output, dict) + and e.node_info.path.startswith(agent.name) + ] + assert len(data_events) == 1 + assert data_events[0].output == { + 'input1': 'response 1', + 'input2': 'response 2', + } + + +# --------------------------------------------------------------------------- +# unwrap_response tests +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize( + 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] +) +@pytest.mark.asyncio +async def test_wrapped_response_unwrapped_for_node( + request: pytest.FixtureRequest, resumable: bool +): + """Wrapped {"result": value} is unwrapped so the node receives the value.""" + from google.adk.workflow import FunctionNode + + def my_node(): + return RequestInput(interrupt_id='ask1', message='Give me data') + + node_a = FunctionNode(func=my_node) + node_b = InputCapturingNode(name='NodeB') + app = App( + name=request.function.__name__, + root_agent=Workflow( + name='test_agent', + edges=[(START, node_a), (node_a, node_b)], + ), + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + events1 = await runner.run_async(testing_utils.get_user_content('go')) + req_events = workflow_testing_utils.get_request_input_events(events1) + assert len(req_events) == 1 + interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] + invocation_id = events1[0].invocation_id + + # Resume with a wrapped response (simulates adk web after rewrapping). + await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response( + interrupt_id, + _wrap_response('hello world'), + ) + ), + invocation_id=invocation_id, + ) + + # NodeB should receive the plain string, not {"result": "hello world"}. + assert node_b.received_inputs == ['hello world'] + + +@pytest.mark.parametrize( + 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] +) +@pytest.mark.asyncio +async def test_dict_response_not_unwrapped( + request: pytest.FixtureRequest, resumable: bool +): + """A dict response without single "result" key passes through unchanged.""" + from google.adk.workflow import FunctionNode + + def my_node(): + return RequestInput(interrupt_id='ask1', message='Give me data') + + node_a = FunctionNode(func=my_node) + node_b = InputCapturingNode(name='NodeB') + app = App( + name=request.function.__name__, + root_agent=Workflow( + name='test_agent', + edges=[(START, node_a), (node_a, node_b)], + ), + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + events1 = await runner.run_async(testing_utils.get_user_content('go')) + req_events = workflow_testing_utils.get_request_input_events(events1) + assert len(req_events) == 1 + interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] + invocation_id = events1[0].invocation_id + + # Resume with a raw dict (programmatic API or adk web with JSON dict input). + raw_dict = {'name': 'John', 'age': 30} + await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response(interrupt_id, raw_dict) + ), + invocation_id=invocation_id, + ) + + # NodeB should receive the dict as-is. + assert node_b.received_inputs == [{'name': 'John', 'age': 30}] + + +@pytest.mark.parametrize('resumable', [False, True]) +@pytest.mark.asyncio +async def test_request_input_rerun_with_same_interrupt_id( + request: pytest.FixtureRequest, resumable: bool +): + """Reusing the same interrupt_id across loop iterations works. + + Regression test: state reconstruction matched FCs and FRs by set + membership, so a previous FR with the same ID made the current + interrupt appear "already resolved", causing the workflow to + restart from scratch instead of resuming. + """ + + @node(rerun_on_resume=True) + def review(ctx: Context): + resume = ctx.resume_inputs.get('review') + if not resume: + yield RequestInput( + interrupt_id='review', + message='Approve or revise?', + ) + return + if resume == 'approve': + yield Event(output='approved', route='approved') + else: + yield Event(route='revise') + + def process(): + return 'draft' + + capture = InputCapturingNode(name='capture') + agent = Workflow( + name='test_rerun_same_id', + edges=[ + (START, process, review), + (review, {'revise': process, 'approved': capture}), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Turn 1: start → process → review → interrupt + events1 = await runner.run_async(testing_utils.get_user_content('go')) + req1 = workflow_testing_utils.get_request_input_events(events1) + assert len(req1) == 1 + assert 'review@1' in req1[0].node_info.path + inv_id = events1[0].invocation_id + + # Turn 2: revise → process reruns → review reruns → interrupt again + events2 = await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response('review', {'result': 'revise'}) + ), + invocation_id=inv_id, + ) + req2 = workflow_testing_utils.get_request_input_events(events2) + assert len(req2) == 1, 'Expected second interrupt after revise' + assert 'review@2' in req2[0].node_info.path + inv_id = events2[0].invocation_id + + # Turn 3: approve → should complete, not loop + events3 = await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response('review', {'result': 'approve'}) + ), + invocation_id=inv_id, + ) + req3 = workflow_testing_utils.get_request_input_events(events3) + assert len(req3) == 0, 'Should not interrupt again after approve' + assert capture.received_inputs == ['approved'] + + +# --------------------------------------------------------------------------- +# auth_config tests +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize( + 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] +) +@pytest.mark.asyncio +async def test_function_node_auth_config( + request: pytest.FixtureRequest, resumable: bool +): + """FunctionNode with auth_config pauses for auth, then runs after creds.""" + from fastapi.openapi.models import APIKey + from fastapi.openapi.models import APIKeyIn + from google.adk.auth.auth_credential import AuthCredential + from google.adk.auth.auth_credential import AuthCredentialTypes + from google.adk.auth.auth_tool import AuthConfig + from google.adk.workflow import FunctionNode + + auth_config = AuthConfig( + auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), + raw_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.API_KEY, + api_key='placeholder', + ), + credential_key='test_api_key', + ) + + call_count = 0 + received_cred = None + + def do_work(ctx: Context): + nonlocal call_count, received_cred + call_count += 1 + received_cred = ctx.get_auth_response(auth_config) + return {'result': 'authed'} + + node_a = FunctionNode( + func=do_work, auth_config=auth_config, rerun_on_resume=True + ) + node_b = InputCapturingNode(name='NodeB') + app = App( + name=request.function.__name__, + root_agent=Workflow( + name='test_agent', + edges=[(START, node_a), (node_a, node_b)], + ), + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: should pause for auth. + events1 = await runner.run_async(testing_utils.get_user_content('go')) + + auth_fc_events = workflow_testing_utils.get_auth_request_events(events1) + assert len(auth_fc_events) == 1 + fc = auth_fc_events[0].content.parts[0].function_call + auth_fc_id = fc.id + invocation_id = events1[0].invocation_id + assert call_count == 0 + + # Run 2: provide auth credential — node should execute. + auth_response = AuthConfig( + auth_scheme=auth_config.auth_scheme, + raw_auth_credential=auth_config.raw_auth_credential, + exchanged_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.API_KEY, + api_key='real_api_key_123', + ), + credential_key='test_api_key', + ) + + resume_part = types.Part( + function_response=types.FunctionResponse( + id=auth_fc_id, + name=REQUEST_CREDENTIAL_FUNCTION_CALL_NAME, + response=auth_response.model_dump(exclude_none=True, by_alias=True), + ) + ) + await runner.run_async( + new_message=testing_utils.UserContent(resume_part), + invocation_id=invocation_id, + ) + + assert call_count == 1 + assert received_cred is not None + assert received_cred.api_key == 'real_api_key_123' + assert node_b.received_inputs == [{'result': 'authed'}] + + +@pytest.mark.parametrize( + 'resumable', [False, pytest.param(True, marks=pytest.mark.xfail)] +) +@pytest.mark.asyncio +async def test_second_auth_node_skips_auth_when_credential_exists( + request: pytest.FixtureRequest, resumable: bool +): + """Second FunctionNode with same credential_key skips auth if cred already stored.""" + from fastapi.openapi.models import APIKey + from fastapi.openapi.models import APIKeyIn + from google.adk.auth.auth_credential import AuthCredential + from google.adk.auth.auth_credential import AuthCredentialTypes + from google.adk.auth.auth_tool import AuthConfig + + auth_config = AuthConfig( + auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), + raw_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.API_KEY, + api_key='placeholder', + ), + credential_key='shared_key', + ) + + call_log = [] + + @node(auth_config=auth_config, rerun_on_resume=True) + def first_task(): + call_log.append('first') + return {'status': 'done'} + + @node(auth_config=auth_config, rerun_on_resume=True) + def second_task(): + call_log.append('second') + return {'status': 'done'} + + node_a = first_task + node_b = second_task + sink = InputCapturingNode(name='sink') + + app = App( + name=request.function.__name__, + root_agent=Workflow( + name='test_agent', + edges=[(START, node_a), (node_a, node_b), (node_b, sink)], + ), + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: node_a pauses for auth. + events1 = await runner.run_async(testing_utils.get_user_content('go')) + auth_fc_events = workflow_testing_utils.get_auth_request_events(events1) + assert len(auth_fc_events) == 1 + fc = auth_fc_events[0].content.parts[0].function_call + auth_fc_id = fc.id + invocation_id = events1[0].invocation_id + assert not call_log + + # Run 2: provide credential — node_a runs, node_b should skip auth and run too. + auth_response = AuthConfig( + auth_scheme=auth_config.auth_scheme, + raw_auth_credential=auth_config.raw_auth_credential, + exchanged_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.API_KEY, + api_key='the_real_key', + ), + credential_key='shared_key', + ) + resume_part = types.Part( + function_response=types.FunctionResponse( + id=auth_fc_id, + name=REQUEST_CREDENTIAL_FUNCTION_CALL_NAME, + response=auth_response.model_dump(exclude_none=True, by_alias=True), + ) + ) + await runner.run_async( + new_message=testing_utils.UserContent(resume_part), + invocation_id=invocation_id, + ) + + # Both nodes ran — node_b did NOT pause for a second auth request. + assert call_log == ['first', 'second'] + assert sink.received_inputs == [{'status': 'done'}] + + +# --- Tests for input/triggered_by restoration on resume --- + + +class _InputCapturingRerunNode(BaseNode): + """A rerun_on_resume node that captures node_input and triggered_by.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + rerun_on_resume: bool = Field(default=True) + captured_inputs: list[Any] = Field(default_factory=list) + + @override + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + self.captured_inputs.append(node_input) + + if resume_input := ctx.resume_inputs.get('approval'): + yield Event(output={'approved': resume_input}) + else: + yield RequestInput(message='Need approval', interrupt_id='approval') + + +@pytest.mark.parametrize( + 'resumable', + [ + pytest.param( + False, + marks=pytest.mark.xfail(reason='Fails in non-resumable mode'), + ), + True, + ], +) +@pytest.mark.asyncio +async def test_resume_preserves_node_input( + request: pytest.FixtureRequest, resumable: bool +): + """After resume, a rerun node receives the predecessor's output as input.""" + node_a = _TestingNode(name='NodeA', message='output_from_a') + node_b = _InputCapturingRerunNode(name='NodeB') + node_c = InputCapturingNode(name='NodeC') + + agent = Workflow( + name='test_agent', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_b), + Edge(from_node=node_b, to_node=node_c), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: NodeA completes, NodeB interrupts. + events1 = await runner.run_async(testing_utils.get_user_content('go')) + invocation_id = events1[0].invocation_id + req_events = workflow_testing_utils.get_request_input_events(events1) + assert len(req_events) == 1 + interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] + + # First run should have received NodeA's output. + assert len(node_b.captured_inputs) == 1 + assert node_b.captured_inputs[0] == 'output_from_a' + + # Run 2: resume with approval. + events2 = await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response(interrupt_id, {'yes': True}) + ), + invocation_id=invocation_id, + ) + + # Second run (rerun on resume) should also receive NodeA's output. + assert len(node_b.captured_inputs) == 2 + assert node_b.captured_inputs[1] == 'output_from_a' + + # NodeC should have received NodeB's output. + assert len(node_c.received_inputs) == 1 + assert node_c.received_inputs[0] == {'approved': {'yes': True}} + + +@pytest.mark.parametrize( + 'resumable', + [ + pytest.param( + False, + marks=pytest.mark.xfail(reason='Fails in non-resumable mode'), + ), + True, + ], +) +@pytest.mark.asyncio +async def test_resume_preserves_input_from_start( + request: pytest.FixtureRequest, resumable: bool +): + """After resume, a node directly after START receives workflow input.""" + node_a = _InputCapturingRerunNode(name='NodeA') + + agent = Workflow( + name='test_agent', + edges=[Edge(from_node=START, to_node=node_a)], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: NodeA interrupts. + events1 = await runner.run_async(testing_utils.get_user_content('hello')) + invocation_id = events1[0].invocation_id + req_events = workflow_testing_utils.get_request_input_events(events1) + assert len(req_events) == 1 + interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] + + # First run: triggered_by should be START. + assert len(node_a.captured_inputs) == 1 + + # Run 2: resume. + await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response(interrupt_id, {'ok': True}) + ), + invocation_id=invocation_id, + ) + + # Second run: triggered_by should still be START. + assert len(node_a.captured_inputs) == 2 + + +@pytest.mark.parametrize( + 'resumable', + [ + pytest.param( + False, + marks=pytest.mark.xfail(reason='Fails in non-resumable mode'), + ), + True, + ], +) +@pytest.mark.asyncio +async def test_resume_fan_in_both_predecessors_completed( + request: pytest.FixtureRequest, resumable: bool +): + """Fan-in: node C has two predecessors (A, B) that both completed. + + After resume, _find_predecessor_input should pick one of the available + predecessor outputs for C. + """ + node_a = _TestingNode(name='NodeA', message='output_from_a') + node_b = _TestingNode(name='NodeB', message='output_from_b') + node_c = _InputCapturingRerunNode(name='NodeC') + + agent = Workflow( + name='test_agent', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=START, to_node=node_b), + Edge(from_node=node_a, to_node=node_c), + Edge(from_node=node_b, to_node=node_c), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: A and B complete, C interrupts. + events1 = await runner.run_async(testing_utils.get_user_content('go')) + invocation_id = events1[0].invocation_id + + # C should have been triggered twice (once per predecessor). + req_events = workflow_testing_utils.get_request_input_events(events1) + assert len(req_events) >= 1 + interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] + + # First run: C's input should come from one of its predecessors. + assert len(node_c.captured_inputs) >= 1 + assert node_c.captured_inputs[0] in ('output_from_a', 'output_from_b') + + # Run 2: resume with approval. + events2 = await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response(interrupt_id, {'yes': True}) + ), + invocation_id=invocation_id, + ) + + # After resume, C should again receive a valid predecessor output. + assert len(node_c.captured_inputs) >= 2 + assert node_c.captured_inputs[-1] in ('output_from_a', 'output_from_b') + + +@pytest.mark.parametrize( + 'resumable', + [ + pytest.param( + False, + marks=pytest.mark.xfail(reason='Fails in non-resumable mode'), + ), + True, + ], +) +@pytest.mark.asyncio +async def test_resume_loop_receives_latest_input( + request: pytest.FixtureRequest, resumable: bool +): + """Loop: START -> A -> B --(loop)--> A. + + On the first iteration A receives START input and interrupts. + After resume, A completes and triggers B. B routes back to A. + On the loop-back iteration, A should receive B's output (not START + input) and run_id should increment. + + Captures: + [0] = first run (START input, interrupts) + [1] = rerun on resume (START input, completes with approval) + [2] = loop-back from B (B's output, interrupts again) + """ + from google.adk.workflow._graph import Edge as GraphEdge + + class _RoutingNode(BaseNode): + """A node that produces output with a route.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + route: str = Field(default='') + message: str = Field(default='') + + @override + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(output=self.message, route=self.route) + + node_a = _InputCapturingRerunNode(name='NodeA') + node_b = _RoutingNode(name='NodeB', message='output_from_b', route='loop') + + agent = Workflow( + name='test_agent', + edges=[ + Edge(from_node=START, to_node=node_a), + Edge(from_node=node_a, to_node=node_b), + GraphEdge(from_node=node_b, to_node=node_a, route='loop'), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: A interrupts on first iteration. + events1 = await runner.run_async(testing_utils.get_user_content('hello')) + invocation_id = events1[0].invocation_id + req_events = workflow_testing_utils.get_request_input_events(events1) + assert len(req_events) == 1 + interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] + + # First iteration: triggered by START. + assert len(node_a.captured_inputs) == 1 + + # Run 2: resume A -> A completes -> B fires -> B routes 'loop' -> A runs again. + events2 = await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response(interrupt_id, {'ok': True}) + ), + invocation_id=invocation_id, + ) + + # Three captures: first run, rerun on resume, loop-back from B. + assert len(node_a.captured_inputs) == 3 + + # Capture[1] = rerun on resume, still triggered by START. + + # Capture[2] = loop-back from B with B's output. + assert node_a.captured_inputs[2] == 'output_from_b' + + # run_id should have incremented (visible in event paths). + node_a_paths = [ + e.node_info.path + for e in events1 + events2 + if e.node_info and e.node_info.path and 'NodeA@' in e.node_info.path + ] + run_ids = sorted({p.split('NodeA@')[1].split('/')[0] for p in node_a_paths}) + assert len(run_ids) >= 2, f'Expected multiple run_ids, got {run_ids}' + + +@pytest.mark.asyncio +async def test_multiple_invocations_isolation(request: pytest.FixtureRequest): + """Verify that a new invocation ignores events from a previous invocation.""" + + class CounterNode(BaseNode): + name: str = Field(default='counter_node') + run_count: int = Field(default=0) + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + self.run_count += 1 + yield f'Run {self.run_count}' + + node_a = CounterNode() + wf = Workflow(name='wf', edges=[(START, node_a)]) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Invocation 1 + msg1 = types.Content(parts=[types.Part(text='go 1')], role='user') + events1 = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + assert node_a.run_count == 1 + + # Invocation 2 (New invocation in SAME session) + msg2 = types.Content(parts=[types.Part(text='go 2')], role='user') + events2 = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events2.append(event) + + # If isolation works, CounterNode should run AGAIN! + assert node_a.run_count == 2 + + +@pytest.mark.asyncio +async def test_multiple_pending_interrupts_isolation( + request: pytest.FixtureRequest, +): + """Verify that responding to one interrupt resumes its specific invocation and ignores others.""" + + class InterruptNode(BaseNode): + name: str = Field(default='interrupt_node') + rerun_on_resume: bool = Field(default=True) + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + text = node_input.parts[0].text if node_input else '' + if ctx.resume_inputs and 'req1' in ctx.resume_inputs: + yield Event(output=f"Resumed 1: {ctx.resume_inputs['req1']['ans']}") + return + if ctx.resume_inputs and 'req2' in ctx.resume_inputs: + yield Event(output=f"Resumed 2: {ctx.resume_inputs['req2']['ans']}") + return + + fc_id = 'req1' if '1' in text else 'req2' + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name=REQUEST_INPUT_FUNCTION_CALL_NAME, + args={ + 'interruptId': fc_id, + 'message': f'input {fc_id}', + }, + id=fc_id, + ) + ) + ] + ), + long_running_tool_ids={fc_id}, + ) + return + + node = InterruptNode() + wf = Workflow(name='wf', edges=[(START, node)]) + + runner = testing_utils.InMemoryRunner(node=wf) + + # Invocation 1: yields req1 + events1 = await runner.run_async('go 1') + + # Find the function call ID generated for req1 + fc_event = workflow_testing_utils.find_function_call_event( + events1, REQUEST_INPUT_FUNCTION_CALL_NAME + ) + function_call_id = fc_event.content.parts[0].function_call.id + + # Invocation 2: yields req2 (New run, same session) + events2 = await runner.run_async('go 2') + + # Invocation 3: respond to req1 + msg3 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name=REQUEST_INPUT_FUNCTION_CALL_NAME, + id=function_call_id, + response={'ans': 'val1'}, + ) + ) + ], + role='user', + ) + events3 = await runner.run_async(msg3) + + # Verify that Invocation 1 resumed and produced output + outputs3 = [e.output for e in events3 if e.output is not None] + assert 'Resumed 1: val1' in outputs3 + + +@pytest.mark.parametrize('resumable', [False, True]) +@pytest.mark.asyncio +async def test_parallel_nodes_trigger_same_hitl_node( + request: pytest.FixtureRequest, resumable: bool +): + """Tests that two nodes running in parallel can trigger the same node with HITL.""" + + @node(rerun_on_resume=True) + def node_c(ctx: Context, node_input: Any): + interrupt_id = f'req_c_{node_input}' + if interrupt_id not in ctx.resume_inputs: + yield RequestInput(interrupt_id=interrupt_id, message='input for c') + return + yield Event( + output=f"c_{node_input}_{ctx.resume_inputs[interrupt_id]['text']}" + ) + + def node_a(): + return 'from_a' + + def node_b(): + return 'from_b' + + agent = Workflow( + name='test_parallel_hitl', + edges=[ + (START, (node_a, node_b), node_c), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=( + ResumabilityConfig(is_resumable=True) if resumable else None + ), + ) + + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: should pause on first branch that triggers NodeC + events1 = await runner.run_async(testing_utils.get_user_content('start')) + req_events1 = workflow_testing_utils.get_request_input_events(events1) + assert len(req_events1) == 1 + + from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids + + interrupt_id_1 = get_request_input_interrupt_ids(req_events1[0])[0] + # The first trigger for node_c would be from node_a + assert interrupt_id_1 == 'req_c_from_a' + + invocation_id = events1[0].invocation_id + + # Run 2: resume first interrupt. This should complete node_c for 'from_a', + # and then allow the buffered trigger from 'node_b' to be processed, + # yielding the second interrupt. + events2 = await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response(interrupt_id_1, {'text': 'response a'}) + ), + invocation_id=invocation_id, + ) + + req_events2 = workflow_testing_utils.get_request_input_events(events2) + assert len(req_events2) == 1 + interrupt_id_2 = get_request_input_interrupt_ids(req_events2[0])[0] + assert interrupt_id_2 == 'req_c_from_b' + + outputs2 = workflow_testing_utils.get_outputs(events2) + assert 'c_from_a_response a' in outputs2 + + # Run 3: resume second interrupt. This should complete node_c for 'from_b'. + events3 = await runner.run_async( + new_message=testing_utils.UserContent( + create_request_input_response(interrupt_id_2, {'text': 'response b'}) + ), + invocation_id=invocation_id, + ) + outputs3 = workflow_testing_utils.get_outputs(events3) + assert 'c_from_b_response b' in outputs3 + + +@pytest.mark.asyncio +async def test_trigger_buffer_insertion_order_deterministic( + request: pytest.FixtureRequest, +): + """Tests that trigger buffer processes triggers in arrival order.""" + from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids + from google.genai import types + + @node(rerun_on_resume=True) + def node_d(ctx: Context, node_input: Any): + interrupt_id = f'req_d_{node_input}' + if interrupt_id not in ctx.resume_inputs: + yield RequestInput(interrupt_id=interrupt_id, message='input for d') + return + yield Event(output=f'd_done_{node_input}') + + @node(rerun_on_resume=True) + def node_e(ctx: Context, node_input: Any): + interrupt_id = f'req_e_{node_input}' + if interrupt_id not in ctx.resume_inputs: + yield RequestInput(interrupt_id=interrupt_id, message='input for e') + return + yield Event(output=f'e_done_{node_input}') + + def source_a(): + return 'from_a' + + def source_b(): + return 'from_b' + + agent = Workflow( + name='test_trigger_order', + max_concurrency=1, + edges=[ + # Start node_d and node_e to make them busy (WAITING) + (START, node_d), + (START, node_e), + # Then source_a and source_b run and trigger them again + (START, source_a, node_d), + (START, source_b, node_e), + ], + ) + + app_instance = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + + runner = testing_utils.InMemoryRunner(app=app_instance) + + # Run 1: all start, node_d and node_e become WAITING. + # source_a and source_b complete and buffer triggers. + events1 = await runner.run_async(testing_utils.get_user_content('start')) + req_events1 = workflow_testing_utils.get_request_input_events(events1) + + # There should be 2 interrupts (from the initial START edges) + assert len(req_events1) == 2 + + interrupt_ids = [] + for e in req_events1: + interrupt_ids.extend(get_request_input_interrupt_ids(e)) + + id_d = next(id for id in interrupt_ids if 'req_d' in id) + id_e = next(id for id in interrupt_ids if 'req_e' in id) + + invocation_id = events1[0].invocation_id + + # Run 2: We resolve BOTH initial interrupts. + # This frees up node_d and node_e. + # _schedule_ready_nodes will process the buffered triggers. + # Since trigger for node_d was buffered first, and max_concurrency=1, + # only node_d will be picked up! + msg = types.Content( + parts=[ + create_request_input_response(id_d, {'text': 'resolved d'}), + create_request_input_response(id_e, {'text': 'resolved e'}), + ], + role='user', + ) + + events2 = await runner.run_async( + new_message=msg, + invocation_id=invocation_id, + ) + + req_events2 = workflow_testing_utils.get_request_input_events(events2) + # Both interrupts are returned sequentially because yielding an interrupt frees the concurrency slot. + assert len(req_events2) == 2 + interrupt_id_2_first = get_request_input_interrupt_ids(req_events2[0])[0] + interrupt_id_2_second = get_request_input_interrupt_ids(req_events2[1])[0] + # We assert that the FIRST trigger (for from_a) was processed FIRST! + assert interrupt_id_2_first == 'req_d_from_a' + assert interrupt_id_2_second == 'req_e_from_b' diff --git a/tests/unittests/workflow/test_workflow_live.py b/tests/unittests/workflow/test_workflow_live.py new file mode 100644 index 0000000000..697b5775ef --- /dev/null +++ b/tests/unittests/workflow/test_workflow_live.py @@ -0,0 +1,672 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +from typing import Any +from typing import AsyncGenerator + +from google.adk.agents.context import Context +from google.adk.agents.live_request_queue import LiveRequestQueue +from google.adk.agents.llm_agent import LlmAgent +from google.adk.events.event import Event +from google.adk.models.llm_response import LlmResponse +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.workflow._base_node import BaseNode +from google.adk.workflow._base_node import START +from google.adk.workflow._workflow import Workflow +from google.genai import types +import pytest + +from . import testing_utils + +# --- Mock Nodes and Agents for Testing Live Mode Design --- + + +class _MockNonLiveNode(BaseNode): + """A standard non-live node whose signature does NOT accept live_request_queue.""" + + called: bool = False + actual_input: Any = None + + def __init__(self, *, name: str): + super().__init__(name=name) + + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + self.called = True + self.actual_input = node_input + yield Event(output=f"{self.name}_output") + + +class _ConstantNode(BaseNode): + """A node that outputs a constant value.""" + + output_value: Any = None + + def __init__(self, *, name: str, output_value: Any): + super().__init__(name=name) + self.output_value = output_value + + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + yield Event(output=self.output_value) + + +class _DynamicLiveSchedulerNode(BaseNode): + """A node that dynamically schedules a child live node using ctx.run_node().""" + + child_node: BaseNode | None = None + child_output: Any = None + + def __init__(self, *, name: str, child_node: BaseNode): + super().__init__(name=name, rerun_on_resume=True) + self.child_node = child_node + + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + if self.child_node: + self.child_output = await ctx.run_node( + self.child_node, node_input=node_input + ) + yield Event(output=f"{self.name}_output") + + +# --- Live Workflow Unit Tests (TDD) --- + + +@pytest.mark.xfail( + strict=True, + reason=( + "mode='task' workflow graph nodes temporarily disabled; re-enable " + "when scheduler preserves originating node_input on resume." + ), +) +@pytest.mark.asyncio +async def test_hybrid_live_non_live_nodes(): + """CUJ 1: A workflow has hybrid live & non-live nodes.""" + mock_model1 = testing_utils.MockModel.create( + responses=[ + LlmResponse( + content=testing_utils.ModelContent( + [types.Part.from_text(text="Acknowledged: node1_start")] + ) + ), + LlmResponse( + content=testing_utils.ModelContent( + [types.Part.from_text(text="Acknowledged: node1_end")] + ) + ), + LlmResponse( + content=testing_utils.ModelContent([ + types.Part.from_function_call( + name="finish_task", + args={"result": "LiveNode1_output"}, + ) + ]) + ), + ] + ) + live_node1 = LlmAgent( + name="LiveNode1", + model=mock_model1, + mode="task", + instruction="Handle live interaction 1.", + ) + non_live_node = _MockNonLiveNode(name="NonLiveNode") + mock_model2 = testing_utils.MockModel.create( + responses=[ + LlmResponse( + content=testing_utils.ModelContent( + [types.Part.from_text(text="Acknowledged: node2_start")] + ) + ), + LlmResponse( + content=testing_utils.ModelContent( + [types.Part.from_text(text="Acknowledged: node2_end")] + ) + ), + LlmResponse( + content=testing_utils.ModelContent([ + types.Part.from_function_call( + name="finish_task", + args={"result": "LiveNode2_output"}, + ) + ]) + ), + ] + ) + live_node2 = LlmAgent( + name="LiveNode2", + model=mock_model2, + mode="task", + instruction="Handle live interaction 2.", + ) + + wf = Workflow( + name="hybrid_workflow", + edges=[ + (START, live_node1), + (live_node1, non_live_node), + (non_live_node, live_node2), + ], + ) + + live_queue = LiveRequestQueue() + + # Pre-seed first live node's requests + live_queue.send_realtime( + types.Blob(data=b"node1_start", mime_type="audio/pcm") + ) + live_queue.send_realtime(types.Blob(data=b"node1_end", mime_type="audio/pcm")) + + ss = InMemorySessionService() + runner = Runner(app_name=wf.name, node=wf, session_service=ss) + session = await ss.create_session(app_name=wf.name, user_id="u") + + events = [] + async for event in runner.run_live( + user_id="u", + session_id=session.id, + live_request_queue=live_queue, + run_config=testing_utils.RunConfig( + get_session_config={"state_delta": {"__START__": "start_input"}} + ), + ): + events.append(event) + if event.output == "NonLiveNode_output": + # First live node and non-live node completed! Now feed the second live node's requests: + live_queue.send_realtime( + types.Blob(data=b"node2_start", mime_type="audio/pcm") + ) + live_queue.send_realtime( + types.Blob(data=b"node2_end", mime_type="audio/pcm") + ) + + # 1. Assert exact outputs sequence + outputs = [e.output for e in events if e.output is not None] + assert outputs == [ + {"result": "LiveNode1_output"}, + "NonLiveNode_output", + {"result": "LiveNode2_output"}, + ] + assert non_live_node.actual_input == {"result": "LiveNode1_output"} + + # 2. Assert intermediate content events (conversational turns) + content_texts = [ + p.text + for e in events + if e.content and e.content.parts and e.output is None + for p in e.content.parts + if p.text + ] + assert content_texts == [ + "Acknowledged: node1_start", + "Acknowledged: node1_end", + "Acknowledged: node2_start", + "Acknowledged: node2_end", + ] + + # 3. Assert live requests fed to the models + assert [b.data for b in mock_model1.live_blobs] == [ + b"node1_start", + b"node1_end", + ] + assert [b.data for b in mock_model2.live_blobs] == [ + b"node2_start", + b"node2_end", + ] + + +@pytest.mark.xfail( + strict=True, + reason=( + "mode='task' workflow graph nodes temporarily disabled; re-enable " + "when scheduler preserves originating node_input on resume." + ), +) +@pytest.mark.asyncio +async def test_nested_workflow_has_live_node(): + """CUJ 2: A nested workflow has a live node.""" + mock_model = testing_utils.MockModel.create( + responses=[ + LlmResponse( + content=testing_utils.ModelContent( + [types.Part.from_text(text="Acknowledged: inner_start")] + ) + ), + LlmResponse( + content=testing_utils.ModelContent( + [types.Part.from_text(text="Acknowledged: inner_end")] + ) + ), + LlmResponse( + content=testing_utils.ModelContent([ + types.Part.from_function_call( + name="finish_task", + args={"result": "InnerLiveNode_output"}, + ) + ]) + ), + ] + ) + live_node = LlmAgent( + name="InnerLiveNode", + model=mock_model, + mode="task", + instruction="Handle inner live interaction.", + ) + inner_wf = Workflow(name="inner_wf", edges=[(START, live_node)]) + outer_wf = Workflow(name="outer_wf", edges=[(START, inner_wf)]) + + live_queue = LiveRequestQueue() + live_queue.send_realtime( + types.Blob(data=b"inner_start", mime_type="audio/pcm") + ) + live_queue.send_realtime(types.Blob(data=b"inner_end", mime_type="audio/pcm")) + + ss = InMemorySessionService() + runner = Runner(app_name=outer_wf.name, node=outer_wf, session_service=ss) + session = await ss.create_session(app_name=outer_wf.name, user_id="u") + + events = [] + async for event in runner.run_live( + user_id="u", + session_id=session.id, + live_request_queue=live_queue, + run_config=testing_utils.RunConfig( + get_session_config={"state_delta": {"__START__": "start_input"}} + ), + ): + events.append(event) + + # Assert exact outputs sequence + outputs = [e.output for e in events if e.output is not None] + assert outputs == [{"result": "InnerLiveNode_output"}] + + # Assert content events + content_texts = [ + p.text + for e in events + if e.content and e.content.parts and e.output is None + for p in e.content.parts + if p.text + ] + assert content_texts == [ + "Acknowledged: inner_start", + "Acknowledged: inner_end", + ] + assert [b.data for b in mock_model.live_blobs] == [ + b"inner_start", + b"inner_end", + ] + + +@pytest.mark.xfail( + strict=True, + reason=( + "mode='task' workflow graph nodes temporarily disabled; re-enable " + "when scheduler preserves originating node_input on resume." + ), +) +@pytest.mark.asyncio +async def test_nested_live_node_and_outer_live_node(): + """CUJ 3: A nested workflow has live node & outer workflow then has a live node.""" + mock_model_inner = testing_utils.MockModel.create( + responses=[ + LlmResponse( + content=testing_utils.ModelContent( + [types.Part.from_text(text="Acknowledged: inner_start")] + ) + ), + LlmResponse( + content=testing_utils.ModelContent( + [types.Part.from_text(text="Acknowledged: inner_end")] + ) + ), + LlmResponse( + content=testing_utils.ModelContent([ + types.Part.from_function_call( + name="finish_task", + args={"result": "InnerLiveNode_output"}, + ) + ]) + ), + ] + ) + inner_live = LlmAgent( + name="InnerLiveNode", + model=mock_model_inner, + mode="task", + instruction="Handle inner live interaction.", + ) + inner_wf = Workflow(name="inner_wf", edges=[(START, inner_live)]) + + mock_model_outer = testing_utils.MockModel.create( + responses=[ + LlmResponse( + content=testing_utils.ModelContent( + [types.Part.from_text(text="Acknowledged: outer_start")] + ) + ), + LlmResponse( + content=testing_utils.ModelContent( + [types.Part.from_text(text="Acknowledged: outer_end")] + ) + ), + LlmResponse( + content=testing_utils.ModelContent([ + types.Part.from_function_call( + name="finish_task", + args={"result": "OuterLiveNode_output"}, + ) + ]) + ), + ] + ) + outer_live = LlmAgent( + name="OuterLiveNode", + model=mock_model_outer, + mode="task", + instruction="Handle outer live interaction.", + ) + prep_node = _ConstantNode(name="PrepNode", output_value="prep_output") + + wf = Workflow( + name="nested_sequential_live", + edges=[ + (START, inner_wf), + (inner_wf, prep_node), + (prep_node, outer_live), + ], + ) + + live_queue = LiveRequestQueue() + live_queue.send_realtime( + types.Blob(data=b"inner_start", mime_type="audio/pcm") + ) + live_queue.send_realtime(types.Blob(data=b"inner_end", mime_type="audio/pcm")) + + ss = InMemorySessionService() + runner = Runner(app_name=wf.name, node=wf, session_service=ss) + session = await ss.create_session(app_name=wf.name, user_id="u") + + events = [] + async for event in runner.run_live( + user_id="u", + session_id=session.id, + live_request_queue=live_queue, + run_config=testing_utils.RunConfig( + get_session_config={"state_delta": {"__START__": "start_input"}} + ), + ): + events.append(event) + if event.output == "prep_output": + # Inner live node and prep node completed! Feed outer node's requests: + live_queue.send_realtime( + types.Blob(data=b"outer_start", mime_type="audio/pcm") + ) + live_queue.send_realtime( + types.Blob(data=b"outer_end", mime_type="audio/pcm") + ) + + # Assert exact outputs sequence + outputs = [e.output for e in events if e.output is not None] + assert outputs == [ + {"result": "InnerLiveNode_output"}, + "prep_output", + {"result": "OuterLiveNode_output"}, + ] + + # Assert content events + content_texts = [ + p.text + for e in events + if e.content and e.content.parts and e.output is None + for p in e.content.parts + if p.text + ] + assert content_texts == [ + "Acknowledged: inner_start", + "Acknowledged: inner_end", + "Acknowledged: outer_start", + "Acknowledged: outer_end", + ] + assert [b.data for b in mock_model_inner.live_blobs] == [ + b"inner_start", + b"inner_end", + ] + assert [b.data for b in mock_model_outer.live_blobs] == [ + b"outer_start", + b"outer_end", + ] + + +@pytest.mark.asyncio +async def test_dynamic_node_scheduling_of_live_node(): + """CUJ 4: A node in workflow dynamically schedules a live node using ctx.run_node().""" + mock_model = testing_utils.MockModel.create( + responses=[ + LlmResponse( + content=testing_utils.ModelContent( + [types.Part.from_text(text="Acknowledged: dynamic_start")] + ) + ), + LlmResponse( + content=testing_utils.ModelContent( + [types.Part.from_text(text="Acknowledged: dynamic_end")] + ) + ), + LlmResponse( + content=testing_utils.ModelContent([ + types.Part.from_function_call( + name="finish_task", + args={"result": "DynamicLiveNode_output"}, + ) + ]) + ), + ] + ) + live_node = LlmAgent( + name="DynamicLiveNode", + model=mock_model, + mode="task", + instruction="Handle dynamic live interaction.", + ) + scheduler_node = _DynamicLiveSchedulerNode( + name="SchedulerNode", child_node=live_node + ) + + wf = Workflow(name="dynamic_wf", edges=[(START, scheduler_node)]) + + live_queue = LiveRequestQueue() + live_queue.send_realtime( + types.Blob(data=b"dynamic_start", mime_type="audio/pcm") + ) + live_queue.send_realtime( + types.Blob(data=b"dynamic_end", mime_type="audio/pcm") + ) + + ss = InMemorySessionService() + runner = Runner(app_name=wf.name, node=wf, session_service=ss) + session = await ss.create_session(app_name=wf.name, user_id="u") + + events = [] + async for event in runner.run_live( + user_id="u", + session_id=session.id, + live_request_queue=live_queue, + run_config=testing_utils.RunConfig( + get_session_config={"state_delta": {"__START__": "start_input"}} + ), + ): + events.append(event) + + # Assert exact outputs sequence + outputs = [e.output for e in events if e.output is not None] + assert outputs == [ + {"result": "DynamicLiveNode_output"}, + "SchedulerNode_output", + ] + assert scheduler_node.child_output == {"result": "DynamicLiveNode_output"} + + # Assert content events + content_texts = [ + p.text + for e in events + if e.content and e.content.parts and e.output is None + for p in e.content.parts + if p.text + ] + assert content_texts == [ + "Acknowledged: dynamic_start", + "Acknowledged: dynamic_end", + ] + assert [b.data for b in mock_model.live_blobs] == [ + b"dynamic_start", + b"dynamic_end", + ] + + +@pytest.mark.xfail( + strict=True, + reason=( + "mode='task' workflow graph nodes temporarily disabled; re-enable " + "when scheduler preserves originating node_input on resume." + ), +) +@pytest.mark.asyncio +async def test_live_node_output_passed_to_downstream(): + """CUJ 5: Dedicated test verifying output of a live node is passed to the next node.""" + mock_model = testing_utils.MockModel.create( + responses=[ + LlmResponse( + content=testing_utils.ModelContent([ + types.Part.from_function_call( + name="finish_task", + args={"result": "LiveNode_output"}, + ) + ]) + ), + ] + ) + live_node = LlmAgent( + name="LiveNode", + model=mock_model, + mode="task", + instruction="Handle live interaction.", + ) + non_live_node = _MockNonLiveNode(name="NonLiveNode") + + wf = Workflow( + name="dataflow_workflow", + edges=[ + (START, live_node), + (live_node, non_live_node), + ], + ) + + live_queue = LiveRequestQueue() + live_queue.send_realtime(types.Blob(data=b"start_msg", mime_type="audio/pcm")) + live_queue.send_realtime(types.Blob(data=b"end_msg", mime_type="audio/pcm")) + + ss = InMemorySessionService() + runner = Runner(app_name=wf.name, node=wf, session_service=ss) + session = await ss.create_session(app_name=wf.name, user_id="u") + + events = [] + async for event in runner.run_live( + user_id="u", + session_id=session.id, + live_request_queue=live_queue, + run_config=testing_utils.RunConfig( + get_session_config={"state_delta": {"__START__": "start_input"}} + ), + ): + events.append(event) + + outputs = [e.output for e in events if e.output is not None] + assert outputs == [{"result": "LiveNode_output"}, "NonLiveNode_output"] + assert non_live_node.actual_input == { + "result": "LiveNode_output" + }, "The downstream node must receive the live node's exact output" + assert [b.data for b in mock_model.live_blobs] == [b"start_msg", b"end_msg"] + + +@pytest.mark.asyncio +async def test_single_turn_agent_runs_as_non_live_in_live_session(): + """CUJ 6: A single_turn LlmAgent in a live session runs as non-live and consumes node_input.""" + mock_model = testing_utils.MockModel.create( + responses=[ + "SingleTurn_output", + ] + ) + prep_node = _ConstantNode( + name="ConstantNode", output_value="initial_text_input" + ) + single_turn_node = LlmAgent( + name="SingleTurnNode", + model=mock_model, + mode="single_turn", + instruction="Summarize the input.", + ) + capture = _MockNonLiveNode(name="capture") + + wf = Workflow( + name="single_turn_live_wf", + edges=[ + (START, prep_node), + (prep_node, single_turn_node), + (single_turn_node, capture), + ], + ) + + live_queue = LiveRequestQueue() + live_queue.send_realtime( + types.Blob(data=b"ignored_audio", mime_type="audio/pcm") + ) + + ss = InMemorySessionService() + runner = Runner(app_name=wf.name, node=wf, session_service=ss) + session = await ss.create_session(app_name=wf.name, user_id="u") + + events = [] + async for event in runner.run_live( + user_id="u", + session_id=session.id, + live_request_queue=live_queue, + ): + events.append(event) + + outputs = [e.output for e in events if e.output is not None] + assert outputs == ["initial_text_input", "capture_output"] + assert capture.actual_input == "SingleTurn_output" + # Verify that the model received the initial_text_input (node_input) and NOT the live queue audio + assert len(mock_model.requests) == 1 + assert ( + mock_model.requests[0].contents[0].parts[0].text == "initial_text_input" + ) + assert mock_model.live_blobs == [] diff --git a/tests/unittests/workflow/test_workflow_llm_agent_interruptions.py b/tests/unittests/workflow/test_workflow_llm_agent_interruptions.py new file mode 100644 index 0000000000..fca4477b59 --- /dev/null +++ b/tests/unittests/workflow/test_workflow_llm_agent_interruptions.py @@ -0,0 +1,887 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import asyncio +import copy +from typing import Any +from typing import AsyncGenerator + +from google.adk.agents import LlmAgent +from google.adk.agents.context import Context +from google.adk.agents.invocation_context import InvocationContext +from google.adk.agents.run_config import RunConfig +from google.adk.apps.app import App +from google.adk.events.event import Event +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.sessions.session import Session +from google.adk.tools.long_running_tool import LongRunningFunctionTool +from google.adk.tools.tool_context import ToolContext +from google.adk.workflow import Edge +from google.adk.workflow import START +from google.adk.workflow._workflow import Workflow +from google.genai import types +import pytest + +from tests.unittests import testing_utils +from tests.unittests.workflow import workflow_testing_utils + + +def long_running_tool_func(): + """A test tool that simulates a long-running operation.""" + return None + + +@pytest.mark.asyncio +async def test_workflow_pause_and_resume_simple( + request: pytest.FixtureRequest, +): + """Tests that a workflow can pause and resume with a single LlmAgent node.""" + + mock_model = testing_utils.MockModel.create( + responses=[ + types.Part.from_function_call( + name='long_running_tool_func', + args={}, + ), + types.Part.from_text(text='LLM response after tool'), + ] + ) + + # 1. Create agent with LRO tool + node_a = LlmAgent( + name='my_agent', + model=mock_model, + tools=[LongRunningFunctionTool(func=long_running_tool_func)], + ) + + # 2. Create workflow with single node + wf = Workflow( + name='test_workflow_hitl', + edges=[ + (START, node_a), + ], + ) + + app = App( + name=request.function.__name__, + root_agent=wf, + ) + runner = testing_utils.InMemoryRunner(app=app) + + # 3. First run: should pause on the long-running function call. + user_event = testing_utils.get_user_content('start workflow') + events1 = await runner.run_async(user_event) + + # Verify it paused on LRO + assert any(e.long_running_tool_ids for e in events1) + + invocation_id = events1[0].invocation_id + fc_event = workflow_testing_utils.find_function_call_event( + events1, 'long_running_tool_func' + ) + assert fc_event is not None + function_call_id = fc_event.content.parts[0].function_call.id + + # 4. Prepare resume message + tool_response = testing_utils.UserContent( + types.Part( + function_response=types.FunctionResponse( + id=function_call_id, + name='long_running_tool_func', + response={'result': 'Final tool output'}, + ) + ) + ) + + # 5. Resume with tool output. + events2 = await runner.run_async( + new_message=tool_response, + invocation_id=invocation_id, + ) + + # 6. Verify completion + content_texts = [ + p.text + for e in events2 + if e.content and e.content.parts + for p in e.content.parts + if p.text + ] + + assert any('LLM response after tool' in t for t in content_texts) + + +@pytest.mark.xfail( + strict=True, + reason=( + "mode='task' workflow graph nodes temporarily disabled; re-enable " + 'when scheduler preserves originating node_input on resume.' + ), +) +@pytest.mark.asyncio +async def test_workflow_pause_and_resume_task_mode( + request: pytest.FixtureRequest, +): + """Tests that a workflow can pause and resume with a single LlmAgent node in task mode.""" + + mock_model = testing_utils.MockModel.create( + responses=[ + types.Part.from_function_call( + name='long_running_tool_func', + args={}, + ), + types.Part.from_text(text='LLM response after tool in task mode'), + ] + ) + + # 1. Create agent with LRO tool and mode='task' + node_a = LlmAgent( + name='my_task_agent', + model=mock_model, + tools=[LongRunningFunctionTool(func=long_running_tool_func)], + mode='task', + ) + + # 2. Create workflow with single node + wf = Workflow( + name='test_workflow_task_hitl', + edges=[ + (START, node_a), + ], + ) + + app = App( + name=request.function.__name__, + root_agent=wf, + ) + runner = testing_utils.InMemoryRunner(app=app) + + # 3. First run: should pause on the long-running function call. + user_event = testing_utils.get_user_content('start workflow') + events1 = await runner.run_async(user_event) + + # Verify it paused on LRO + assert any(e.long_running_tool_ids for e in events1) + + invocation_id = events1[0].invocation_id + fc_event = workflow_testing_utils.find_function_call_event( + events1, 'long_running_tool_func' + ) + assert fc_event is not None + function_call_id = fc_event.content.parts[0].function_call.id + + # 4. Prepare resume message + tool_response = testing_utils.UserContent( + types.Part( + function_response=types.FunctionResponse( + id=function_call_id, + name='long_running_tool_func', + response={'result': 'Final tool output'}, + ) + ) + ) + + # 5. Resume with tool output. + events2 = await runner.run_async( + new_message=tool_response, + invocation_id=invocation_id, + ) + + # 6. Verify completion + content_texts = [ + p.text + for e in events2 + if e.content and e.content.parts + for p in e.content.parts + if p.text + ] + + assert any('LLM response after tool in task mode' in t for t in content_texts) + + +@pytest.mark.asyncio +async def test_workflow_pause_and_resume_tool_confirmation( + request: pytest.FixtureRequest, +): + """Tests that a workflow can pause and resume with a tool requiring confirmation. + + Setup: Workflow with a single LlmAgent node having a tool requiring confirmation. + Act: + - Run 1: Start workflow, tool requests confirmation. + - Run 2: Send confirmation response. + Assert: + - Run 1: Workflow pauses and yields confirmation request. + - Run 2: Workflow resumes and completes with LLM response. + """ + from google.adk.flows.llm_flows.functions import REQUEST_CONFIRMATION_FUNCTION_CALL_NAME + from google.adk.tools.function_tool import FunctionTool + + # Given a tool that requires confirmation and a mock model + def _simple_tool_func(): + return {'result': 'tool executed'} + + mock_model = testing_utils.MockModel.create( + responses=[ + types.Part.from_function_call( + name='_simple_tool_func', + args={}, + ), + types.Part.from_text(text='LLM response after confirmation'), + ] + ) + + node_a = LlmAgent( + name='my_agent', + model=mock_model, + tools=[FunctionTool(func=_simple_tool_func, require_confirmation=True)], + ) + + wf = Workflow( + name='test_workflow_confirmation', + edges=[(START, node_a)], + ) + + app = App( + name=request.function.__name__, + root_agent=wf, + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When the workflow is started + user_event = testing_utils.get_user_content('start workflow') + events1 = await runner.run_async(user_event) + + # Then it should request confirmation + fc_event = None + for e in events1: + if e.content and e.content.parts: + for p in e.content.parts: + if ( + p.function_call + and p.function_call.name == REQUEST_CONFIRMATION_FUNCTION_CALL_NAME + ): + fc_event = e + break + + assert fc_event is not None, 'Did not find confirmation request event' + + ask_for_confirmation_function_call_id = fc_event.content.parts[ + 0 + ].function_call.id + invocation_id = events1[0].invocation_id + + # When the user confirms the tool call + user_confirmation = testing_utils.UserContent( + types.Part( + function_response=types.FunctionResponse( + id=ask_for_confirmation_function_call_id, + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + response={'confirmed': True}, + ) + ) + ) + + events2 = await runner.run_async( + new_message=user_confirmation, + invocation_id=invocation_id, + ) + + # Then the workflow completes with the LLM response + content_texts = [ + p.text + for e in events2 + if e.content and e.content.parts + for p in e.content.parts + if p.text + ] + + assert any('LLM response after confirmation' in t for t in content_texts) + + +@pytest.mark.asyncio +async def test_workflow_pause_and_resume_auth_node( + request: pytest.FixtureRequest, +): + """Workflow pauses on missing credentials and resumes when provided. + + Setup: Workflow with a single node requiring auth. + Act: + - Run 1: Start workflow without credentials. + - Run 2: Provide credentials via FunctionResponse. + Assert: + - Run 1: Workflow returns adk_request_credential request. + - Run 2: Workflow completes and yields event with credential. + """ + from fastapi.openapi.models import APIKey + from fastapi.openapi.models import APIKeyIn + from google.adk.auth.auth_credential import AuthCredential + from google.adk.auth.auth_credential import AuthCredentialTypes + from google.adk.auth.auth_tool import AuthConfig + from google.adk.workflow import FunctionNode + + # Given a workflow with a node requiring auth + auth_config = AuthConfig( + auth_scheme=APIKey(**{'in': APIKeyIn.header, 'name': 'X-Api-Key'}), + credential_key='my_key', + ) + + def fetch_weather(ctx): + cred = ctx.get_auth_response(auth_config) + api_key = cred.api_key if cred else 'unknown' + from google.adk import Event + + yield Event(message=f'authed with {api_key}') + + node_a = FunctionNode( + func=fetch_weather, auth_config=auth_config, rerun_on_resume=True + ) + + wf = Workflow( + name='test_workflow_auth_node', + edges=[(START, node_a)], + ) + + app = App( + name=request.function.__name__, + root_agent=wf, + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When the workflow is started without credentials + events1 = await runner.run_async(testing_utils.get_user_content('start')) + + # Then it should pause and request credentials + auth_fc_events = [ + e + for e in events1 + if e.content + and e.content.parts + and e.content.parts[0].function_call + and e.content.parts[0].function_call.name == 'adk_request_credential' + ] + assert len(auth_fc_events) == 1 + auth_fc_id = auth_fc_events[0].content.parts[0].function_call.id + invocation_id = events1[0].invocation_id + + # When the user provides the credentials + auth_response = AuthConfig( + auth_scheme=auth_config.auth_scheme, + credential_key=auth_config.credential_key, + exchanged_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.API_KEY, + api_key='secret_key', + ), + ) + + user_credential_response = testing_utils.UserContent( + types.Part( + function_response=types.FunctionResponse( + id=auth_fc_id, + name='adk_request_credential', + response=auth_response.model_dump( + exclude_none=True, by_alias=True + ), + ), + ), + ) + + # When the workflow is resumed + events2 = await runner.run_async( + new_message=user_credential_response, + invocation_id=invocation_id, + ) + + # Then the workflow should resume and complete + content_texts = [ + p.text + for e in events2 + if e.content and e.content.parts + for p in e.content.parts + if p.text + ] + assert any('authed with secret_key' in t for t in content_texts) + + +@pytest.mark.xfail( + strict=True, + reason=( + "mode='task' workflow graph nodes temporarily disabled; re-enable " + 'when scheduler preserves originating node_input on resume.' + ), +) +@pytest.mark.asyncio +async def test_workflow_pause_and_resume_parent_interruption( + request: pytest.FixtureRequest, +): + """Tests multi-agent workflow where parent produces an interruption.""" + + # Child agent (does nothing special) + child_agent = LlmAgent( + name='child_agent', + model=testing_utils.MockModel.create( + responses=[ + types.Part.from_function_call( + name='finish_task', + args={'result': 'Child done'}, + ) + ] + ), + mode='task', + ) + + # Parent agent calls LRO tool first, then delegates to child + fc = types.Part.from_function_call(name='long_running_tool_func', args={}) + call_child = types.Part.from_function_call( + name='child_agent', + args={'request': 'Start child task'}, + ) + + parent_model = testing_utils.MockModel.create( + responses=[ + fc, # First call LRO + call_child, # Then call child + 'Parent all done', # Finally finish + ] + ) + + parent_agent = LlmAgent( + name='parent_agent', + model=parent_model, + tools=[ + LongRunningFunctionTool(func=long_running_tool_func), + ], + sub_agents=[child_agent], + mode='task', + ) + + wf = Workflow( + name='test_workflow_parent_hitl', + edges=[ + (START, parent_agent), + ], + ) + + app = App( + name=request.function.__name__, + root_agent=wf, + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: Should pause on LRO + events1 = await runner.run_async(testing_utils.get_user_content('start')) + assert any(e.long_running_tool_ids for e in events1) + + invocation_id = events1[0].invocation_id + fc_event = workflow_testing_utils.find_function_call_event( + events1, 'long_running_tool_func' + ) + assert fc_event is not None + function_call_id = fc_event.content.parts[0].function_call.id + + # Resume with tool output + tool_response = testing_utils.UserContent( + types.Part( + function_response=types.FunctionResponse( + id=function_call_id, + name='long_running_tool_func', + response={'result': 'LRO done'}, + ) + ) + ) + + events2 = await runner.run_async( + new_message=tool_response, + invocation_id=invocation_id, + ) + + # Verify completion + content_texts = [ + p.text + for e in events2 + if e.content and e.content.parts + for p in e.content.parts + if p.text + ] + assert any('Parent all done' in t for t in content_texts) + + +@pytest.mark.xfail(reason='Task agents cannot have sub-agents in workflow') +@pytest.mark.asyncio +async def test_workflow_pause_and_resume_child_interruption( + request: pytest.FixtureRequest, +): + """Tests multi-agent workflow where child produces an interruption.""" + + # Child agent calls LRO tool + fc = types.Part.from_function_call(name='long_running_tool_func', args={}) + child_model = testing_utils.MockModel.create( + responses=[ + fc, + types.Part.from_function_call( + name='finish_task', + args={'result': 'Child done after tool'}, + ), + ] + ) + + child_agent = LlmAgent( + name='child_agent', + model=child_model, + tools=[LongRunningFunctionTool(func=long_running_tool_func)], + mode='task', + ) + + # Parent agent delegates to child first + call_child = types.Part.from_function_call( + name='child_agent', + args={'request': 'Start child task'}, + ) + parent_model = testing_utils.MockModel.create( + responses=[ + call_child, + call_child, + 'Parent all done', + ] + ) + + parent_agent = LlmAgent( + name='parent_agent', + model=parent_model, + sub_agents=[child_agent], + mode='task', + ) + + wf = Workflow( + name='test_workflow_child_hitl', + edges=[ + (START, parent_agent), + ], + ) + + app = App( + name=request.function.__name__, + root_agent=wf, + ) + runner = testing_utils.InMemoryRunner(app=app) + + # Run 1: Should enter parent, then child, then child pauses on LRO! + events1 = await runner.run_async(testing_utils.get_user_content('start')) + assert any( + p.function_call and p.function_call.name == 'child_agent' + for e in events1 + if e.content + for p in e.content.parts + ) + + invocation_id = events1[0].invocation_id + fc_event = workflow_testing_utils.find_function_call_event( + events1, 'long_running_tool_func' + ) + assert fc_event is not None + function_call_id = fc_event.content.parts[0].function_call.id + + # Resume with tool output + tool_response = testing_utils.UserContent( + types.Part( + function_response=types.FunctionResponse( + id=function_call_id, + name='long_running_tool_func', + response={'result': 'LRO done'}, + ) + ) + ) + + events2 = await runner.run_async( + new_message=tool_response, + invocation_id=invocation_id, + ) + + # Verify completion + content_texts = [ + p.text + for e in events2 + if e.content and e.content.parts + for p in e.content.parts + if p.text + ] + assert any('Parent all done' in t for t in content_texts) + + +def _append_function_response( + session, invocation_id, branch, fc_id, func_name, response +): + """Helper to append a FunctionResponse event to a session.""" + session.events.append( + Event( + invocation_id=invocation_id, + author='user', + branch=branch, + content=types.Content( + role='user', + parts=[ + types.Part( + function_response=types.FunctionResponse( + id=fc_id, + name=func_name, + response=response, + ) + ) + ], + ), + ) + ) + + +@pytest.mark.asyncio +async def test_workflow_resume_inputs_fallback_branch(monkeypatch): + """Resume inputs find function name in a different branch. + + Setup: Session contains a FunctionCall in branch_A. + Act: Run the wrapper with resume_inputs for that FunctionCall in branch_B. + Assert: The wrapper successfully finds the function name and completes. + """ + + # Arrange + mock_model = testing_utils.MockModel.create( + responses=[types.Part.from_text(text='I am done')] + ) + agent = LlmAgent(name='test_agent', model=mock_model) + + # Create a dummy context and session + + session = Session(id='test_session', appName='test_app', userId='test_user') + # Add an event with function call in branch 'branch_A' + session.events.append( + Event( + invocation_id='test_inv', + branch='branch_A', + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + id='fc_123', + name='my_target_func', + args={}, + ) + ) + ] + ), + ) + ) + + # Create invocation context with branch 'branch_B' + + session_service = InMemorySessionService() + + ic = InvocationContext( + session=session, + branch='branch_B', + session_service=session_service, + invocation_id='test_inv', + run_config=RunConfig(), + agent=agent, + ) + + # Create context with resume_inputs + ctx = Context( + ic, + node_path='test_agent', + run_id='1', + resume_inputs={'fc_123': {'result': 'ok'}}, + ) + + # Mock prepare functions + class DummyAgentCtx: + + def __init__(self, ic): + self._ic = ic + + def get_invocation_context(self): + return self._ic + + from google.adk.workflow import _llm_agent_wrapper + + monkeypatch.setattr( + _llm_agent_wrapper, + 'prepare_llm_agent_context', + lambda a, c: DummyAgentCtx(ic), + ) + monkeypatch.setattr( + _llm_agent_wrapper, 'prepare_llm_agent_input', lambda a, c, i: None + ) + + # Simulate Runner adding the event to the correct branch! + _append_function_response( + session, + invocation_id='test_inv', + branch='branch_A', + fc_id='fc_123', + func_name='my_target_func', + response={'result': 'ok'}, + ) + + # Act - Run the function directly + from google.adk.workflow._llm_agent_wrapper import run_llm_agent_as_node + + gen = run_llm_agent_as_node(agent, ctx=ctx, node_input='start') + try: + await gen.__anext__() + except StopAsyncIteration: + pass + + # Assert - Verify that the event is there with correct branch + # Initial events had 1 item + 1 simulated by Runner = 2! + assert len(session.events) == 2 + event = session.events[-1] # The newly injected event! + assert ( + event.branch == 'branch_A' + ) # Injected in the branch where call was made! + assert event.content.parts[0].function_response.name == 'my_target_func' + + +@pytest.mark.asyncio +async def test_workflow_resume_inputs_multiple_branches(monkeypatch): + """Resume inputs handle multiple items targeting different branches. + + Setup: Session contains FunctionCalls in branch_A and branch_B. + Act: Run the wrapper with resume_inputs for both in branch_C. + Assert: The wrapper successfully finds function names for both. + """ + + # Arrange + mock_model = testing_utils.MockModel.create( + responses=[types.Part.from_text(text='I am done')] + ) + agent = LlmAgent(name='test_agent', model=mock_model) + + session = Session(id='test_session', appName='test_app', userId='test_user') + + # Add event 1 in branch_A + session.events.append( + Event( + invocation_id='test_inv', + branch='branch_A', + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + id='fc_A', + name='func_A', + args={}, + ) + ) + ] + ), + ) + ) + + # Add event 2 in branch_B + session.events.append( + Event( + invocation_id='test_inv', + branch='branch_B', + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + id='fc_B', + name='func_B', + args={}, + ) + ) + ] + ), + ) + ) + + session_service = InMemorySessionService() + + # Current branch is branch_C + ic = InvocationContext( + session=session, + branch='branch_C', + session_service=session_service, + invocation_id='test_inv', + run_config=RunConfig(), + agent=agent, + ) + + ctx = Context( + ic, + node_path='test_agent', + run_id='1', + resume_inputs={'fc_A': {'result': 'ok_A'}, 'fc_B': {'result': 'ok_B'}}, + ) + + class DummyAgentCtx: + + def __init__(self, ic): + self._ic = ic + + def get_invocation_context(self): + return self._ic + + from google.adk.workflow import _llm_agent_wrapper + + monkeypatch.setattr( + _llm_agent_wrapper, + 'prepare_llm_agent_context', + lambda a, c: DummyAgentCtx(ic), + ) + monkeypatch.setattr( + _llm_agent_wrapper, 'prepare_llm_agent_input', lambda a, c, i: None + ) + + # Simulate Runner adding the events to the correct branches! + _append_function_response( + session, + invocation_id='test_inv', + branch='branch_A', + fc_id='fc_A', + func_name='func_A', + response={'result': 'ok_A'}, + ) + _append_function_response( + session, + invocation_id='test_inv', + branch='branch_B', + fc_id='fc_B', + func_name='func_B', + response={'result': 'ok_B'}, + ) + + # Act - Run the function directly + from google.adk.workflow._llm_agent_wrapper import run_llm_agent_as_node + + gen = run_llm_agent_as_node(agent, ctx=ctx, node_input='start') + try: + await gen.__anext__() + except StopAsyncIteration: + pass + + # Assert - Verify that the events are there with correct branches + # Initial events had 2 items + 2 simulated by Runner = 4! + assert len(session.events) == 4 + + # Check both exist in the injected events + injected_events = session.events[2:] + branches = [e.branch for e in injected_events] + names = [e.content.parts[0].function_response.name for e in injected_events] + + assert 'branch_A' in branches + assert 'branch_B' in branches + assert 'func_A' in names + assert 'func_B' in names diff --git a/tests/unittests/workflow/test_workflow_nested.py b/tests/unittests/workflow/test_workflow_nested.py new file mode 100644 index 0000000000..8be4b48420 --- /dev/null +++ b/tests/unittests/workflow/test_workflow_nested.py @@ -0,0 +1,1161 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +from typing import Any +from typing import AsyncGenerator +import uuid + +from google.adk.agents.context import Context +from google.adk.agents.llm_agent import LlmAgent +from google.adk.apps.app import App +from google.adk.events.event import Event +from google.adk.events.request_input import RequestInput +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.tools.long_running_tool import LongRunningFunctionTool +from google.adk.workflow import BaseNode +from google.adk.workflow import JoinNode +from google.adk.workflow._base_node import START +from google.adk.workflow._node_status import NodeStatus +from google.adk.workflow._workflow import Workflow +from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_response +from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids +from google.adk.workflow.utils._workflow_hitl_utils import has_request_input_function_call +from google.genai import types +from pydantic import ConfigDict +from pydantic import Field +import pytest +from typing_extensions import override + +from .. import testing_utils +from .workflow_testing_utils import find_function_call_event +from .workflow_testing_utils import InputCapturingNode +from .workflow_testing_utils import RequestInputNode +from .workflow_testing_utils import simplify_events_with_node +from .workflow_testing_utils import TestingNode + + +def long_running_tool_func(): + """A test tool that simulates a long-running operation.""" + return None + + +@pytest.mark.asyncio +async def test_nested_workflow_as_node(request: pytest.FixtureRequest): + """Tests that a Workflow can be used as a node in another Workflow.""" + + async def nested_func(node_input: types.Content): + return 'I am nested' + + nested_agent = Workflow( + name='nested_agent', + edges=[('START', nested_func)], + ) + + async def output_func(node_input: str): + return 'I am outer' + + outer_agent = Workflow( + name='outer_agent', + edges=[('START', nested_agent), (nested_agent, output_func)], + ) + + app = App( + name=request.function.__name__, + root_agent=outer_agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('hello')) + + simplified_events = simplify_events_with_node(events) + assert simplified_events == [ + ( + 'outer_agent@1/nested_agent@1/nested_func@1', + { + 'output': 'I am nested', + }, + ), + ( + 'outer_agent@1/output_func@1', + { + 'output': 'I am outer', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_nested_workflow_with_join_node( + request: pytest.FixtureRequest, +): + """Tests that a nested Workflow with JoinNode works correctly.""" + + async def nested_node_a(): + return {'a': 1} + + async def nested_node_b(): + return {'b': 2} + + async def nested_node_c(): + return {'c': 3} + + nested_join_node = JoinNode(name='nested_join') + + nested_agent = Workflow( + name='nested_agent', + edges=[ + ('START', nested_node_a), + ('START', nested_node_c), + (nested_node_a, nested_join_node), + (nested_node_c, nested_node_b), + (nested_node_b, nested_join_node), + ], + ) + + async def output_func(node_input: dict): + return ( + 'Joined output:' + f' a={node_input["nested_node_a"]["a"]},' + f' b={node_input["nested_node_b"]["b"]}' + ) + + outer_agent = Workflow( + name='outer_agent', + edges=[('START', nested_agent), (nested_agent, output_func)], + ) + + app = App( + name=request.function.__name__, + root_agent=outer_agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('hello')) + + simplified_events = simplify_events_with_node(events) + assert sorted(simplified_events[0:2], key=lambda x: x[0]) == [ + ( + 'outer_agent@1/nested_agent@1/nested_node_a@1', + {'output': {'a': 1}}, + ), + ( + 'outer_agent@1/nested_agent@1/nested_node_c@1', + {'output': {'c': 3}}, + ), + ] + assert simplified_events[2:] == [ + ( + 'outer_agent@1/nested_agent@1/nested_node_b@1', + {'output': {'b': 2}}, + ), + ( + 'outer_agent@1/nested_agent@1/nested_join@1', + { + 'output': {'nested_node_a': {'a': 1}, 'nested_node_b': {'b': 2}}, + }, + ), + ( + 'outer_agent@1/output_func@1', + { + 'output': 'Joined output: a=1, b=2', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_nested_workflow_updates_state_outer_reads( + request: pytest.FixtureRequest, +): + """Tests that outer workflow can read state updated by nested workflow.""" + + async def nested_state_updater(ctx: Context): + yield Event( + state={'my_key': 'my_value'}, + ) + yield 'nested agent finished' + + nested_agent = Workflow( + name='nested_agent', + edges=[('START', nested_state_updater)], + ) + + def outer_state_reader(my_key: str, node_input: str): + return f'Nested agent output: {node_input}, state value: {my_key}' + + outer_agent = Workflow( + name='outer_agent', + edges=[('START', nested_agent), (nested_agent, outer_state_reader)], + ) + + app = App( + name=request.function.__name__, + root_agent=outer_agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('hello')) + + simplified_events = simplify_events_with_node(events) + assert simplified_events == [ + ( + 'outer_agent@1/nested_agent@1/nested_state_updater@1', + { + 'output': 'nested agent finished', + }, + ), + ( + 'outer_agent@1/outer_state_reader@1', + { + 'output': ( + 'Nested agent output: nested agent finished, state value:' + ' my_value' + ), + }, + ), + ] + + +@pytest.mark.asyncio +async def test_nested_workflow_intermediate_nodes( + request: pytest.FixtureRequest, +): + """Tests that only the final output of a nested workflow is passed to the outer workflow.""" + + node_a = TestingNode(name='NodeA', output='Inner Intermediate') + node_b = TestingNode(name='NodeB', output='Inner Final') + + nested_agent = Workflow( + name='nested_agent', + edges=[ + ('START', node_a), + (node_a, node_b), + ], + ) + + output_node = InputCapturingNode(name='OutputNode') + + outer_agent = Workflow( + name='outer_agent', + edges=[ + ('START', nested_agent), + (nested_agent, output_node), + ], + ) + + app = App( + name=request.function.__name__, + root_agent=outer_agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + assert output_node.received_inputs == ['Inner Final'] + + simplified_events = simplify_events_with_node(events) + assert simplified_events == [ + ( + 'outer_agent@1/nested_agent@1/NodeA@1', + {'output': 'Inner Intermediate'}, + ), + ( + 'outer_agent@1/nested_agent@1/NodeB@1', + {'output': 'Inner Final'}, + ), + ( + 'outer_agent@1/OutputNode@1', + {'output': {'received': 'Inner Final'}}, + ), + ] + + +@pytest.mark.asyncio +async def test_nested_workflow_with_hitl(request: pytest.FixtureRequest): + """Tests that a nested Workflow with HITL works correctly.""" + # Given: A nested workflow with an LLM agent that calls a long running tool + llm_agent = LlmAgent( + name='llm_agent', + model=testing_utils.MockModel.create( + responses=[ + types.Part.from_function_call( + name='long_running_tool_func', + args={}, + ), + types.Part.from_text(text='LLM response after tool'), + ] + ), + tools=[LongRunningFunctionTool(func=long_running_tool_func)], + ) + + nested_agent = Workflow( + name='nested_agent', + edges=[('START', llm_agent)], + ) + + async def output_func(node_input: Any): + return 'I am outer' + + outer_agent = Workflow( + name='outer_agent', + edges=[('START', nested_agent), (nested_agent, output_func)], + ) + + app = App( + name=request.function.__name__, + root_agent=outer_agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When: Starting the workflow + user_event = testing_utils.get_user_content('start workflow') + events1 = await runner.run_async(user_event) + + # Then: It should yield a FunctionCall event and wait for tool execution + ev = find_function_call_event(events1, 'long_running_tool_func') + assert ev is not None + function_call_id = ev.content.parts[0].function_call.id + + simplified_events1 = simplify_events_with_node(events1) + assert simplified_events1 == [ + ( + 'outer_agent@1/nested_agent@1/llm_agent@1', + types.Part.from_function_call(name='long_running_tool_func', args={}), + ), + ] + + tool_response = testing_utils.UserContent( + types.Part( + function_response=types.FunctionResponse( + id=function_call_id, + name='long_running_tool_func', + response={'result': 'Final tool output'}, + ) + ) + ) + + invocation_id = events1[0].invocation_id + events2 = await runner.run_async( + new_message=tool_response, + invocation_id=invocation_id, + ) + + simplified_events2 = simplify_events_with_node(events2) + assert simplified_events2 == [ + ('outer_agent@1/nested_agent@1/llm_agent@1', 'LLM response after tool'), + ( + 'outer_agent@1/output_func@1', + {'output': 'I am outer'}, + ), + ] + + +@pytest.mark.asyncio +async def test_nested_workflow_with_request_input_event_hitl( + request: pytest.FixtureRequest, +): + """Nested workflow correctly propagates RequestInput and resumes. + + Setup: outer_agent -> nested_agent -> node_hitl. + Act: + - Run 1: start workflow, node_hitl yields RequestInput. + - Run 2: resume with user response. + Assert: + - Run 1: returns RequestInput event. + - Run 2: node_hitl receives input and completes. + """ + + class NodeHitl(BaseNode): + model_config = ConfigDict(arbitrary_types_allowed=True) + rerun_on_resume: bool = Field(default=True) + name: str = Field(default='node_hitl') + + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + if resume_input := ctx.resume_inputs.get('request_input'): + yield f'Resumed with user input: {resume_input}' + else: + yield RequestInput( + message='requesting input via RequestInputEvent', + interrupt_id='request_input', + ) + + # Given: A nested workflow where the inner node requests input + node_hitl_instance = NodeHitl() + + nested_agent = Workflow( + name='nested_agent', + edges=[('START', node_hitl_instance)], + ) + + async def output_func(): + return 'I am outer' + + outer_agent = Workflow( + name='outer_agent', + edges=[('START', nested_agent), (nested_agent, output_func)], + ) + + app = App( + name=request.function.__name__, + root_agent=outer_agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When: Starting the workflow + user_event = testing_utils.get_user_content('start workflow') + events1 = await runner.run_async(user_event) + + # Then: It should yield a RequestInput event + req_events = [e for e in events1 if has_request_input_function_call(e)] + assert req_events + interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] + assert interrupt_id == 'request_input' + + simplified_events1 = simplify_events_with_node(events1) + assert simplified_events1 == [ + ( + 'outer_agent@1/nested_agent@1/node_hitl@1', + testing_utils.simplify_content(copy.deepcopy(req_events[0].content)), + ), + ] + + # When: Resuming with user response + hitl_response = types.Content( + parts=[ + create_request_input_response( + interrupt_id, {'response': 'user input for hitl'} + ) + ], + role='user', + ) + + invocation_id = events1[0].invocation_id + events2 = await runner.run_async( + new_message=hitl_response, + invocation_id=invocation_id, + ) + + # Then: It should complete and pass output to the outer workflow + simplified_events2 = simplify_events_with_node(events2) + assert simplified_events2 == [ + ( + 'outer_agent@1/nested_agent@1/node_hitl@1', + { + 'output': ( + "Resumed with user input: {'response': 'user input for hitl'}" + ), + }, + ), + ( + 'outer_agent@1/output_func@1', + {'output': 'I am outer'}, + ), + ] + + +@pytest.mark.asyncio +async def test_nested_agent_with_request_input_piped_to_next_node( + request: pytest.FixtureRequest, +): + """Tests that user response to RequestInput in nested agent is piped to next node.""" + ask_user = RequestInputNode( + name='ask_user', + message='Please provide input', + ) + capture_node = InputCapturingNode(name='capture_node') + + sub_agent = Workflow( + name='sub_agent', + edges=[ + ('START', ask_user), + (ask_user, capture_node), + ], + ) + + root_agent = Workflow( + name='root_agent', + edges=[('START', sub_agent)], + ) + + app = App( + name=request.function.__name__, + root_agent=root_agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + + user_event = testing_utils.get_user_content('start workflow') + events1 = await runner.run_async(user_event) + + req_events = [e for e in events1 if has_request_input_function_call(e)] + assert req_events + interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] + assert interrupt_id + hitl_response_payload = {'response': 'user input for hitl'} + hitl_response = types.Content( + parts=[ + create_request_input_response(interrupt_id, hitl_response_payload) + ], + role='user', + ) + + invocation_id = events1[0].invocation_id + await runner.run_async( + new_message=hitl_response, + invocation_id=invocation_id, + ) + + assert capture_node.received_inputs == [hitl_response_payload] + + +@pytest.mark.asyncio +async def test_nested_workflow_chain_input_propagation( + request: pytest.FixtureRequest, +): + + async def create_output_a(): + return 'output of A' + + nested_agent_a = Workflow( + name='nested_agent_a', + edges=[('START', create_output_a)], + ) + + capture_node_b = InputCapturingNode(name='capture_node_b') + nested_agent_b = Workflow( + name='nested_agent_b', + edges=[('START', capture_node_b)], + ) + + outer_agent = Workflow( + name='outer_agent', + edges=[ + ('START', nested_agent_a), + (nested_agent_a, nested_agent_b), + ], + ) + + app = App( + name=request.function.__name__, + root_agent=outer_agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + await runner.run_async(testing_utils.get_user_content('hello')) + + assert capture_node_b.received_inputs == ['output of A'] + + +@pytest.mark.asyncio +async def test_nested_workflow_with_tool_calls( + request: pytest.FixtureRequest, +): + """Tests that a nested Workflow works correctly with two tool calls.""" + tool_call_count = 0 + + def simple_tool() -> str: + nonlocal tool_call_count + tool_call_count += 1 + return f'Tool output {tool_call_count}' + + # Given: A nested workflow where the inner node calls a tool + llm_agent = LlmAgent( + name='llm_agent', + model=testing_utils.MockModel.create( + responses=[ + types.Part.from_function_call( + name='simple_tool', + args={}, + ), + types.Part.from_text(text='LLM response after tools'), + ] + ), + tools=[simple_tool], + ) + + nested_agent = Workflow( + name='nested_agent', + edges=[('START', llm_agent)], + ) + + async def output_func(): + return 'I am outer' + + outer_agent = Workflow( + name='outer_agent', + edges=[ + ('START', nested_agent), + (nested_agent, output_func), + ], + ) + + app = App( + name=request.function.__name__, + root_agent=outer_agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When: Starting the workflow + user_event = testing_utils.get_user_content('start workflow') + events = await runner.run_async(user_event) + + # Then: It should call the tool and yield events + assert tool_call_count == 1 + + simplified_events = simplify_events_with_node(events) + + # Extract the dynamically generated function_call_id from events. + ev = find_function_call_event(events, 'simple_tool') + assert ev is not None + function_call_id = ev.content.parts[0].function_call.id + + assert simplified_events == [ + ( + 'outer_agent@1/nested_agent@1/llm_agent@1', + types.Part.from_function_call(name='simple_tool', args={}), + ), + ( + 'outer_agent@1/nested_agent@1/llm_agent@1', + types.Part( + function_response=types.FunctionResponse( + name='simple_tool', + response={'result': 'Tool output 1'}, + ) + ), + ), + ('outer_agent@1/nested_agent@1/llm_agent@1', 'LLM response after tools'), + ( + 'outer_agent@1/output_func@1', + { + 'output': 'I am outer', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_three_level_nested_workflow(request: pytest.FixtureRequest): + """Tests a 3-level nested Workflow structure.""" + + async def inner_func(): + return 'I am inner' + + inner_agent = Workflow( + name='inner_agent', + edges=[('START', inner_func)], + ) + + async def middle_func(): + return 'I am middle' + + middle_agent = Workflow( + name='middle_agent', + edges=[('START', inner_agent), (inner_agent, middle_func)], + ) + + async def outer_func(): + return 'I am outer' + + outer_agent = Workflow( + name='outer_agent', + edges=[('START', middle_agent), (middle_agent, outer_func)], + ) + + app = App( + name=request.function.__name__, + root_agent=outer_agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('hello')) + + simplified_events = simplify_events_with_node(events) + assert simplified_events == [ + ( + 'outer_agent@1/middle_agent@1/inner_agent@1/inner_func@1', + { + 'output': 'I am inner', + }, + ), + ( + 'outer_agent@1/middle_agent@1/middle_func@1', + { + 'output': 'I am middle', + }, + ), + ( + 'outer_agent@1/outer_func@1', + { + 'output': 'I am outer', + }, + ), + ] + + +@pytest.mark.asyncio +async def test_duplicate_grandchild_workflow_names( + request: pytest.FixtureRequest, +): + """Tests that grandchild workflow agents with same name can coexist.""" + + # Given: A workflow hierarchy where grandchild workflows have the same name + async def grandchild_func(): + return 'I am grandchild' + + grandchild_agent = Workflow( + name='grandchild', + edges=[('START', grandchild_func)], + ) + + child1_agent = Workflow( + name='child1', + edges=[('START', copy.deepcopy(grandchild_agent))], + ) + + child2_agent = Workflow( + name='child2', + edges=[('START', copy.deepcopy(grandchild_agent))], + ) + + root_agent = Workflow( + name='root', + edges=[('START', child1_agent), (child1_agent, child2_agent)], + ) + + app = App( + name=request.function.__name__, + root_agent=root_agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + # When: Starting the workflow + user_content = testing_utils.get_user_content('hello') + events = await runner.run_async(user_content) + + # Then: It should execute both grandchildren successfully + simplified_events = simplify_events_with_node(events) + assert simplified_events == [ + ( + 'root@1/child1@1/grandchild@1/grandchild_func@1', + {'output': 'I am grandchild'}, + ), + ( + 'root@1/child2@1/grandchild@1/grandchild_func@1', + {'output': 'I am grandchild'}, + ), + ] + + +@pytest.mark.asyncio +async def test_duplicate_name_in_ancestral_path( + request: pytest.FixtureRequest, +): + """Tests that agent with same name can exist in ancestral path (A->B->A).""" + + async def func_a(): + return 'I am A' + + agent_a_child = Workflow( + name='A', + edges=[('START', func_a)], + ) + + agent_b = Workflow( + name='B', + edges=[('START', agent_a_child)], + ) + + agent_a_root = Workflow( + name='A', + edges=[('START', agent_b)], + ) + + app = App( + name=request.function.__name__, + root_agent=agent_a_root, + ) + runner = testing_utils.InMemoryRunner(app=app) + user_content = testing_utils.get_user_content('hello') + events = await runner.run_async(user_content) + + simplified_events = simplify_events_with_node(events) + assert simplified_events == [ + ( + 'A@1/B@1/A@1/func_a@1', + {'output': 'I am A'}, + ), + ] + + +# --- Helpers moved from test_workflow.py --- + + +class _OutputNode(BaseNode): + """Yields a fixed output value.""" + + value: Any = None + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield self.value + + +class _InputCapturingNode(BaseNode): + """Captures node_input for later assertion.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + received_inputs: list[Any] = Field(default_factory=list) + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + self.received_inputs.append(node_input) + yield {'received': node_input} + + +async def _run_workflow(wf, message='start'): + """Run a Workflow through Runner, return collected events.""" + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + msg = types.Content(parts=[types.Part(text=message)], role='user') + events = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + return events, ss, session + + +def _outputs(events): + """Extract non-None outputs from events.""" + return [e.output for e in events if e.output is not None] + + +def _output_by_node(events): + """Extract (node_name_from_path, output) for child node events.""" + results = [] + for e in events: + if e.output is not None and e.node_info.path and '/' in e.node_info.path: + node_name = e.node_info.path.rsplit('/', 1)[-1] + if '@' in node_name: + node_name = node_name.rsplit('@', 1)[0] + results.append((node_name, e.output)) + return results + + +# --- Tests moved from test_workflow.py --- + + +@pytest.mark.asyncio +async def test_nested_workflow_completes(): + """Inner workflow runs to completion, outer continues downstream.""" + inner_node = _OutputNode(name='inner_node', value='inner_result') + inner_wf = Workflow(name='inner_wf', edges=[(START, inner_node)]) + before = _OutputNode(name='before', value='before_result') + after = _InputCapturingNode(name='after') + wf = Workflow(name='wf', edges=[(START, before, inner_wf, after)]) + + events, _, _ = await _run_workflow(wf) + + by_node = _output_by_node(events) + assert ('before', 'before_result') in by_node + assert ('inner_node', 'inner_result') in by_node + assert after.received_inputs == ['inner_result'] + + +@pytest.mark.asyncio +async def test_nested_workflow_event_author(): + """Events are authored by the nearest orchestrator (workflow/agent). + + Setup: outer_wf → inner_wf → inner_node. + Assert: + - inner_node's events are authored by inner_wf (nearest). + - outer_wf's direct children are authored by outer_wf. + - inner_wf overrides the author for its subtree. + """ + inner_node = _OutputNode(name='inner_node', value='inner_result') + inner_wf = Workflow(name='inner_wf', edges=[(START, inner_node)]) + outer_node = _OutputNode(name='outer_node', value='outer_result') + wf = Workflow( + name='outer_wf', + edges=[(START, outer_node, inner_wf)], + ) + + events, _, _ = await _run_workflow(wf) + + # outer_node's events authored by outer_wf (nearest orchestrator). + outer_events = [ + e for e in events if e.node_info.path == 'outer_wf@1/outer_node@1' + ] + assert outer_events + assert all(e.author == 'outer_wf' for e in outer_events) + + # inner_node's events authored by inner_wf (nearest orchestrator), + # NOT outer_wf. + inner_events = [ + e + for e in events + if e.node_info.path == 'outer_wf@1/inner_wf@1/inner_node@1' + ] + assert inner_events + assert all(e.author == 'inner_wf' for e in inner_events) + + +@pytest.mark.asyncio +async def test_nested_workflow_interrupt_and_resume(): + """Inner workflow child interrupts, outer resumes on FR.""" + + class _InterruptNode(BaseNode): + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + fc_id = ctx.state.get('_nested_fc') + if fc_id and ctx.resume_inputs and fc_id in ctx.resume_inputs: + ctx.state['_nested_fc'] = None + response = ctx.resume_inputs[fc_id]['answer'] + yield f'approved:{response}' + return + fc_id = f'fc-{uuid.uuid4().hex[:8]}' + ctx.state['_nested_fc'] = fc_id + yield Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name='inner_tool', args={}, id=fc_id + ) + ) + ] + ), + long_running_tool_ids={fc_id}, + ) + + inner_wf = Workflow( + name='inner_wf', + edges=[(START, _InterruptNode(name='approval'))], + ) + before = _OutputNode(name='before', value='before_result') + after = _InputCapturingNode(name='after') + wf = Workflow( + name='wf', + edges=[(START, before, inner_wf, after)], + ) + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: before completes, inner_wf/approval interrupts + msg1 = types.Content(parts=[types.Part(text='go')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + # Should have interrupt from inner's child + interrupt_events = [e for e in events1 if e.long_running_tool_ids] + assert len(interrupt_events) == 1 + assert interrupt_events[0].long_running_tool_ids is not None + fc_id = list(interrupt_events[0].long_running_tool_ids)[0] + + # Workflow-level interrupt events should NOT be persisted + # (they're _adk_internal). Only the leaf child's event at + # 'wf/inner_wf/approval' should have interrupt ids in session. + updated_session = await ss.get_session( + app_name='test', user_id='u', session_id=session.id + ) + assert updated_session is not None + wf_interrupt_events = [ + e + for e in updated_session.events + if e.long_running_tool_ids and e.node_info.path in ('wf', 'wf/inner_wf') + ] + assert wf_interrupt_events == [] + + # Run 2: resume + msg2 = types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='inner_tool', + id=fc_id, + response={'answer': 'yes'}, + ) + ) + ], + role='user', + ) + events2: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events2.append(event) + + # Inner resumed, after should receive inner's output + outputs = [e.output for e in events2 if e.output is not None] + assert 'approved:yes' in outputs + assert after.received_inputs == ['approved:yes'] + + +@pytest.mark.asyncio +async def test_nested_workflow_partial_resume(): + """Partial FR re-runs nested Workflow, resolved child completes while unresolved stays interrupted. + + Setup: outer_wf → inner_wf → (child_a, child_b) → join. + Both children interrupt on first run. + Act: + - Run 2: resolve only child_a's FR. + - Run 3: resolve child_b's FR. + Assert: + - Run 2: child_a produces output, invocation still interrupted. + - Run 3: child_b produces output, join completes, no interrupts. + """ + + class _InterruptOnce(BaseNode): + """Interrupts on first run, yields resume response on second.""" + + rerun_on_resume: bool = True + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + fc_id = f'fc-{self.name}' + if ctx.resume_inputs and fc_id in ctx.resume_inputs: + yield f'{self.name}:{ctx.resume_inputs[fc_id]}' + return + yield RequestInput(interrupt_id=fc_id) + + child_a = _InterruptOnce(name='child_a') + child_b = _InterruptOnce(name='child_b') + join = JoinNode(name='join', wait_for_output=True) + + inner_wf = Workflow( + name='inner_wf', + edges=[ + (START, child_a), + (START, child_b), + (child_a, join), + (child_b, join), + ], + ) + + outer_wf = Workflow( + name='outer', + edges=[(START, inner_wf)], + ) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=outer_wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Run 1: both children interrupt + msg1 = types.Content(parts=[types.Part(text='go')], role='user') + events1: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg1 + ): + events1.append(event) + + interrupt_ids = set() + for e in events1: + if e.long_running_tool_ids: + interrupt_ids.update(e.long_running_tool_ids) + assert 'fc-child_a' in interrupt_ids + assert 'fc-child_b' in interrupt_ids + + # Run 2: resolve only child_a + msg2 = types.Content( + parts=[create_request_input_response('fc-child_a', {'v': 'a'})], + role='user', + ) + events2: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg2 + ): + events2.append(event) + + # child_a should have produced output + child_a_outputs = [ + e.output + for e in events2 + if e.node_info.path and 'child_a' in e.node_info.path and e.output + ] + assert any('child_a:' in str(o) for o in child_a_outputs) + + # Run 3: resolve child_b → join completes, workflow finishes + msg3 = types.Content( + parts=[create_request_input_response('fc-child_b', {'v': 'b'})], + role='user', + ) + events3: list[Event] = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg3 + ): + events3.append(event) + + # child_b should have produced output + child_b_outputs = [ + e.output + for e in events3 + if e.node_info.path and 'child_b' in e.node_info.path and e.output + ] + assert any('child_b:' in str(o) for o in child_b_outputs) + + # join should have completed (no more interrupts) + final_interrupts = set() + for e in events3: + if e.long_running_tool_ids: + final_interrupts.update(e.long_running_tool_ids) + assert not final_interrupts + + +@pytest.mark.asyncio +async def test_scan_child_events_ignores_descendant_run_id_resets(): + """_scan_child_events only resets run_id from direct child events.""" + from unittest.mock import MagicMock + + from google.adk.events.event import Event + from google.adk.events.event import NodeInfo + + # We create a Workflow instance to test its private method _scan_child_events. + wf = Workflow(name='wf', edges=[]) + + # Given a direct child event and a descendant event. + event1 = Event( + author='node', + node_info=NodeInfo(path='wf@1/child@1', run_id='1'), + invocation_id='test_inv', + ) + event2 = Event( + author='node', + node_info=NodeInfo(path='wf@1/child@1/grandchild@2', run_id='2'), + invocation_id='test_inv', + ) + + ctx = MagicMock() + ctx._invocation_context = MagicMock() + ctx._invocation_context.invocation_id = 'test_inv' + ctx._invocation_context.session = MagicMock() + ctx._invocation_context.session.events = [event1, event2] + # _scan_child_events reads ctx.node_path to determine the base workflow path. + ctx.node_path = 'wf@1' + + children = wf._scan_child_events(ctx) + + # Assert child 'child' run_id remains '1' (not '2' from the descendant). + assert children[0]['child@1'].run_id == '1' diff --git a/tests/unittests/workflow/test_workflow_node.py b/tests/unittests/workflow/test_workflow_node.py new file mode 100644 index 0000000000..1a81dbf86d --- /dev/null +++ b/tests/unittests/workflow/test_workflow_node.py @@ -0,0 +1,321 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for @node decorator and behavior.""" + +from __future__ import annotations + +from unittest import mock + +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.llm_agent import LlmAgent +from google.adk.apps import App +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.tools.base_tool import BaseTool +from google.adk.workflow import FunctionNode +from google.adk.workflow import START +from google.adk.workflow._base_node import BaseNode +from google.adk.workflow._node import node +from google.adk.workflow._node import Node +from google.adk.workflow._parallel_worker import _ParallelWorker as ParallelWorker +from google.adk.workflow._retry_config import RetryConfig +from google.adk.workflow._tool_node import _ToolNode as ToolNode +from google.adk.workflow._workflow import Workflow +from google.genai import types +import pytest + +from .. import testing_utils + +ANY = mock.ANY + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +async def _run_workflow(wf, message="start"): + """Run a Workflow through Runner, return collected events.""" + ss = InMemorySessionService() + runner = Runner(app_name="test", node=wf, session_service=ss) + session = await ss.create_session(app_name="test", user_id="u") + msg = types.Content(parts=[types.Part(text=message)], role="user") + events = [] + async for event in runner.run_async( + user_id="u", session_id=session.id, new_message=msg + ): + events.append(event) + return events, ss, session + + +def _output_by_node(events): + """Extract (node_name_from_path, output) for child node events.""" + results = [] + for e in events: + if e.output is not None and e.node_info.path and "/" in e.node_info.path: + node_name = e.node_info.path.rsplit("/", 1)[-1] + if "@" in node_name: + node_name = node_name.rsplit("@", 1)[0] + results.append((node_name, e.output)) + return results + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_node_decorator(): + """Tests that @node decorator can wrap a function and override its name.""" + + @node(name="decorated_node") + def my_func(): + return "Hello from decorated_func" + + assert my_func.name == "decorated_node" + + wf = Workflow( + name="test_agent", + edges=[ + (START, my_func), + ], + ) + events, _, _ = await _run_workflow(wf) + + by_node = _output_by_node(events) + assert ("decorated_node", "Hello from decorated_func") in by_node + + +def test_node_parallel_worker_instance(): + """Tests that node() can wrap a node in ParallelWorker.""" + + @node(parallel_worker=True) + def my_func(node_input): + return node_input + + assert isinstance(my_func, ParallelWorker) + assert my_func.name == "my_func" + + def other_func(x): + return x + + parallel_node = node(other_func, parallel_worker=True) + assert isinstance(parallel_node, ParallelWorker) + assert parallel_node.name == "other_func" + + +@pytest.mark.asyncio +async def test_node_parallel_worker_execution(): + """Tests that a node with parallel_worker=True correctly processes inputs.""" + + @node(parallel_worker=True) + async def my_func(node_input): + return node_input * 2 + + async def producer_func() -> list[int]: + return [1, 2, 3] + + wf = Workflow( + name="test_agent", + edges=[ + (START, producer_func), + (producer_func, my_func), + ], + ) + events, _, _ = await _run_workflow(wf) + + by_node = _output_by_node(events) + assert ("producer_func", [1, 2, 3]) in by_node + assert ("my_func", [2, 4, 6]) in by_node + + +def test_node_decorator_rerun_on_resume(): + """Tests that @node decorator can override rerun_on_resume.""" + + @node(name="decorated_node", rerun_on_resume=True) + def my_func(): + return "Hello from decorated_func" + + assert isinstance(my_func, FunctionNode) + assert my_func.rerun_on_resume + + @node() + def my_func2(): + return "Hello from decorated_func2" + + assert isinstance(my_func2, FunctionNode) + assert not my_func2.rerun_on_resume + + +def test_node_function_with_base_node(): + """Tests that node() function returns a copied node when given a BaseNode.""" + + @node(name="original") + def original(): + pass + + wrapped = node(original, name="overridden", rerun_on_resume=True) + + assert isinstance(wrapped, FunctionNode) + assert wrapped is not original + assert wrapped.name == "overridden" + assert wrapped.rerun_on_resume + + +class MyTool(BaseTool): + name = "tool" + description = "desc" + + async def _run_async_impl(self): + return "done" + + +def test_node_no_unnecessary_wrap(): + """Tests that node() does not wrap LlmAgent, Agent, Tool, or func in OverridingNode.""" + + llm_agent = LlmAgent(name="llm") + llm_node = node(llm_agent, name="overridden_llm") + + assert isinstance(llm_node, LlmAgent) + assert llm_node.name == "overridden_llm" + assert llm_node.mode == "single_turn" + + agent = BaseAgent(name="agent") + agent_node_inst = node(agent, name="overridden_agent", rerun_on_resume=True) + assert isinstance(agent_node_inst, BaseAgent) + assert agent_node_inst.name == "overridden_agent" + assert agent_node_inst.rerun_on_resume + + tool_inst = MyTool(name="tool", description="desc") + t_node = node(tool_inst, name="overridden_tool") + assert isinstance(t_node, ToolNode) + assert t_node.name == "overridden_tool" + + def my_func(): + pass + + f_node = node(my_func, name="overridden_func", rerun_on_resume=True) + assert isinstance(f_node, FunctionNode) + assert f_node.name == "overridden_func" + assert f_node.rerun_on_resume + + +class StatefulTool(BaseTool): + """A tool that modifies state via tool_context.""" + + async def run_async(self, *, args, tool_context): + tool_context.state["tool_key"] = "tool_value" + tool_context.state["tool_count"] = 10 + return {"status": "ok"} + + +from .workflow_testing_utils import simplify_events_with_node + + +@pytest.mark.asyncio +async def test_tool_node_state_delta(): + """Tests that state set via tool_context.state in ToolNode is persisted.""" + + tool_node = ToolNode( + tool=StatefulTool(name="stateful_tool", description="Sets state values"), + ) + + def read_state(tool_key: str, tool_count: int) -> str: + return f"tool_key={tool_key}, tool_count={tool_count}" + + def start_node(): + return {} + + wf = Workflow( + name="test_tool_node_state_delta", + edges=[ + (START, start_node), + (start_node, tool_node), + (tool_node, read_state), + ], + ) + + events, _, _ = await _run_workflow(wf) + + simplified = simplify_events_with_node( + events, include_workflow_output=True, include_state_delta=True + ) + + assert ( + "test_tool_node_state_delta@1/stateful_tool@1", + {"output": {"status": "ok"}}, + ) in [(e[0], {"output": e[1].get("output")}) for e in simplified] + + assert ( + "test_tool_node_state_delta@1/read_state@1", + { + "output": "tool_key=tool_value, tool_count=10", + }, + ) in [(e[0], {"output": e[1].get("output")}) for e in simplified] + + +class _CustomNode(Node): + custom_val: str = "hello" + rerun_on_resume: bool = True + + async def run_node_impl(self, *, ctx, node_input): + yield f"subclass: {self.custom_val} -> {node_input}" + + +def test_node_subclassing_model_copy_preserves_identity(): + """Tests that Node.model_copy preserves the subclass class identity.""" + node_inst = _CustomNode( + name="subclass", parallel_worker=True, custom_val="barrier" + ) + assert node_inst.parallel_worker is True + + cloned = node_inst.model_copy() + assert isinstance(cloned, _CustomNode) + assert cloned.custom_val == "barrier" + assert cloned.parallel_worker is True + assert isinstance(cloned._inner_node, ParallelWorker) + # Confirm inner node wraps a clone of _CustomNode preserving identity! + assert isinstance(cloned._inner_node._node, _CustomNode) + assert cloned._inner_node._node.custom_val == "barrier" + assert cloned._inner_node._node.parallel_worker is False + + +@pytest.mark.asyncio +async def test_node_subclassing_execution_with_parallel_worker(): + """Tests that a subclassed Node with parallel_worker=True executes successfully.""" + subclass_node = _CustomNode( + name="subclass", parallel_worker=True, custom_val="workflow" + ) + + async def producer(): + return ["input1", "input2"] + + wf = Workflow( + name="test_agent", + edges=[ + (START, producer), + (producer, subclass_node), + ], + ) + + events, _, _ = await _run_workflow(wf) + by_node = _output_by_node(events) + + assert ("producer", ["input1", "input2"]) in by_node + assert ( + "subclass", + ["subclass: workflow -> input1", "subclass: workflow -> input2"], + ) in by_node diff --git a/tests/unittests/workflow/test_workflow_node_timeout.py b/tests/unittests/workflow/test_workflow_node_timeout.py new file mode 100644 index 0000000000..dc1d9be6e9 --- /dev/null +++ b/tests/unittests/workflow/test_workflow_node_timeout.py @@ -0,0 +1,204 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for node timeout behavior.""" + +from __future__ import annotations + +import asyncio + +from google.adk.apps import App +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.workflow import START +from google.adk.workflow._errors import NodeTimeoutError +from google.adk.workflow._node import node +from google.adk.workflow._retry_config import RetryConfig +from google.adk.workflow._workflow import Workflow +from google.genai import types +import pytest + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +async def _run_workflow(wf, message='start'): + """Run a Workflow through Runner, return collected events.""" + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + + session = await ss.create_session(app_name='test', user_id='u') + msg = types.Content(parts=[types.Part(text=message)], role='user') + events = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + return events, ss, session + + +def _output_by_node(events): + """Extract (node_name_from_path, output) for child node events.""" + results = [] + for e in events: + if e.output is not None and e.node_info.path and '/' in e.node_info.path: + node_name = e.node_info.path.rsplit('/', 1)[-1] + if '@' in node_name: + node_name = node_name.rsplit('@', 1)[0] + results.append((node_name, e.output)) + return results + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_node_completes_within_timeout(): + """A node that finishes before the timeout should succeed normally.""" + + @node(timeout=5.0) + async def my_slow_node(): + await asyncio.sleep(0.01) + return 'done' + + wf = Workflow( + name='test_workflow', + edges=[ + (START, my_slow_node), + ], + ) + events, _, _ = await _run_workflow(wf) + by_node = _output_by_node(events) + + assert ('my_slow_node', 'done') in by_node + + +@pytest.mark.asyncio +async def test_node_exceeds_timeout(): + """A node that exceeds its timeout should fail.""" + + from google.adk.workflow import FunctionNode + + async def raw_slow_func(): + await asyncio.sleep(1.0) + return 'done' + + my_too_slow_node = FunctionNode( + name='my_too_slow_node', func=raw_slow_func, timeout=0.05 + ) + + wf = Workflow( + name='test_workflow', + edges=[ + (START, my_too_slow_node), + ], + ) + with pytest.raises(NodeTimeoutError) as exc_info: + await _run_workflow(wf) + + assert 'my_too_slow_node' in str(exc_info.value) + + +@pytest.mark.asyncio +async def test_node_no_timeout(): + """A node with timeout=None should run without any time limit.""" + + @node(timeout=None) + async def my_no_timeout_node(): + await asyncio.sleep(0.01) + return 'done' + + wf = Workflow( + name='test_workflow', + edges=[ + (START, my_no_timeout_node), + ], + ) + events, _, _ = await _run_workflow(wf) + by_node = _output_by_node(events) + + assert ('my_no_timeout_node', 'done') in by_node + + +@pytest.mark.asyncio +async def test_node_timeout_with_retry(): + """A timed-out node should be retried if retry_config is set.""" + run_count = 0 + + @node( + timeout=0.05, + retry_config=RetryConfig(max_attempts=3, initial_delay=0.0, jitter=0.0), + ) + async def node_a(): + nonlocal run_count + run_count += 1 + if run_count == 1: + await asyncio.sleep(1.0) + return 'success' + + wf = Workflow( + name='test_workflow', + edges=[ + (START, node_a), + ], + ) + events, _, _ = await _run_workflow(wf) + + by_node = _output_by_node(events) + # Verify that the final result was successfully obtained. + assert ('node_a', 'success') in by_node + + # Verify that the node was actually executed more than once (i.e., retried). + assert run_count == 2, f'Expected run_count == 2, got {run_count}' + + +@pytest.mark.asyncio +async def test_nested_workflow_timeout(): + """A nested workflow that exceeds its timeout in the outer workflow should fail. + + Setup: outer_wf -> inner_wf -> slow_node. inner_wf has timeout=0.05. + Act: Run the outer workflow. + Assert: Execution raises NodeTimeoutError referencing inner_wf. + """ + import sys + + if sys.version_info < (3, 11): + pytest.skip('asyncio.timeout requires Python 3.11+') + + # Given an outer workflow containing a slow inner workflow with a timeout + @node() + async def slow_node(): + await asyncio.sleep(1.0) + return 'done' + + inner_wf = Workflow( + name='inner_wf', + edges=[(START, slow_node)], + timeout=0.05, + ) + + outer_wf = Workflow( + name='outer_wf', + edges=[(START, inner_wf)], + ) + + # When the outer workflow is executed + # Then it should raise NodeTimeoutError referencing the inner workflow + with pytest.raises(NodeTimeoutError) as exc_info: + await _run_workflow(outer_wf) + + assert 'inner_wf' in str(exc_info.value) diff --git a/tests/unittests/workflow/test_workflow_output_deduplication.py b/tests/unittests/workflow/test_workflow_output_deduplication.py new file mode 100644 index 0000000000..22ca7440a1 --- /dev/null +++ b/tests/unittests/workflow/test_workflow_output_deduplication.py @@ -0,0 +1,161 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for nested workflow output event deduplication. + +Verifies that nested workflows produce only leaf terminal events and +resolve output via terminal path resolution from the graph structure. +""" + +from typing import Any + +from google.adk.apps.app import App +from google.adk.events.event import Event +from google.adk.workflow._workflow import Workflow +import pytest + +from . import testing_utils + + +def _is_checkpoint(event: Event) -> bool: + """Returns True if event is an agent state checkpoint or end_of_agent.""" + if event.actions.agent_state is not None: + return True + if event.actions.end_of_agent: + return True + return False + + +def _output_events(events: list[Event]) -> list[Event]: + """Returns only events with output data (not checkpoint/state).""" + return [e for e in events if not _is_checkpoint(e) and e.output is not None] + + +async def test_two_level_nesting_deduplicates( + request, +): + """Two-level nesting emits only the leaf's output event, not finalize events. + + Setup: outer → inner → leaf. + Assert: exactly 1 output event from 'outer/inner/leaf', no + duplicate finalize events from inner or outer. + """ + + async def leaf(node_input: Any): + return 'leaf_data' + + inner = Workflow(name='inner', edges=[('START', leaf)]) + outer = Workflow(name='outer', edges=[('START', inner)]) + + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('hi')) + out_events = _output_events(events) + + assert len(out_events) == 1 + assert out_events[0].output == 'leaf_data' + assert out_events[0].node_info.path == 'outer@1/inner@1/leaf@1' + + +async def test_nested_with_output_schema_validates_at_read_time( + request, +): + """Nested workflow with output_schema validates without emitting extra events. + + Setup: outer → inner(output_schema=str) → leaf. + Assert: 1 output event with validated data, no extra finalize event. + """ + + async def leaf(node_input: Any): + return 'raw_data' + + inner = Workflow( + name='inner', + edges=[('START', leaf)], + output_schema=str, + ) + outer = Workflow(name='outer', edges=[('START', inner)]) + + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('hi')) + out_events = _output_events(events) + + assert len(out_events) == 1 + assert out_events[0].output == 'raw_data' + + +async def test_multiple_terminals_in_nested_workflow_raises( + request, +): + """Fan-out with no join raises ValueError for multiple terminal outputs. + + Setup: outer → inner → (branch_a, branch_b). + Assert: ValueError because inner has two terminal nodes producing output. + """ + + async def branch_a(node_input: Any): + return 'a_out' + + async def branch_b(node_input: Any): + return 'b_out' + + inner = Workflow( + name='inner', + edges=[('START', (branch_a, branch_b))], + ) + outer = Workflow(name='outer', edges=[('START', inner)]) + + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + + with pytest.raises(ValueError, match='multiple terminal nodes'): + await runner.run_async(testing_utils.get_user_content('hi')) + + +async def test_non_terminal_output_not_exposed_as_workflow_output( + request, +): + """Downstream node receives terminal output, not intermediate node output. + + Setup: outer → inner(step_a → step_b) → consume. + Assert: consume receives step_b's 'final' (terminal), not step_a's + 'intermediate'. + """ + + async def step_a(node_input: Any): + return 'intermediate' + + async def step_b(node_input: str): + return 'final' + + inner = Workflow(name='inner', edges=[('START', step_a, step_b)]) + + async def consume(node_input: str): + return f'got: {node_input}' + + outer = Workflow(name='outer', edges=[('START', inner, consume)]) + + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('hi')) + out_events = _output_events(events) + + consume_events = [ + e + for e in out_events + if e.node_info.name and e.node_info.name.split('@')[0] == 'consume' + ] + assert len(consume_events) == 1 + assert consume_events[0].output == 'got: final' diff --git a/tests/unittests/workflow/test_workflow_parallel_worker.py b/tests/unittests/workflow/test_workflow_parallel_worker.py new file mode 100644 index 0000000000..baad9c7a44 --- /dev/null +++ b/tests/unittests/workflow/test_workflow_parallel_worker.py @@ -0,0 +1,1092 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +from typing import Any +from typing import AsyncGenerator + +from google.adk.agents.context import Context +from google.adk.apps.app import App +from google.adk.apps.app import ResumabilityConfig +from google.adk.events.event import Event +from google.adk.workflow import BaseNode +from google.adk.workflow import START +from google.adk.workflow._node import node +from google.adk.workflow._parallel_worker import _ParallelWorker as ParallelWorker +from google.adk.workflow._workflow import Workflow +from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids +from google.adk.workflow.utils._workflow_hitl_utils import has_request_input_function_call +from google.genai import types +from pydantic import ConfigDict +from pydantic import Field +import pytest +from typing_extensions import override + +from . import testing_utils +from .workflow_testing_utils import simplify_events_with_node + + +class _ProducerNode(BaseNode): + """A node that produces a list of items.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + items: list[Any] = Field(default_factory=list) + name: str = Field(default='Producer') + + def __init__(self, items: list[Any], name: str = 'Producer'): + super().__init__() + object.__setattr__(self, 'items', items) + object.__setattr__(self, 'name', name) + + @override + async def run( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(output=self.items) + + +class _SingleItemProducerNode(BaseNode): + """A node that produces a single item.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + item: Any = None + name: str = Field(default='Producer') + + def __init__(self, item: Any, name: str = 'Producer'): + super().__init__() + object.__setattr__(self, 'item', item) + object.__setattr__(self, 'name', name) + + @override + async def run( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield Event(output=self.item) + + +class _WorkerNode(BaseNode): + """A node that processes an item, with an optional delay.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + name: str = Field(default='Worker') + + def __init__(self, name: str = 'Worker'): + super().__init__() + object.__setattr__(self, 'name', name) + + @override + async def run( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if isinstance(node_input, dict) and 'delay' in node_input: + await asyncio.sleep(node_input['delay']) + val = node_input['val'] + else: + val = node_input + yield Event(output=f'{val}_processed') + + +@pytest.mark.asyncio +async def test_parallel_worker_processes_list_ordered( + request: pytest.FixtureRequest, +): + """ParallelWorker processes a list of items and returns ordered results.""" + # Given a workflow with a producer and a parallel worker. + # Delays are used to ensure deterministic output order and prevent race conditions in event ordering. + items = [{'val': 'item1', 'delay': 0}, {'val': 'item2', 'delay': 0.1}] + node_a = _ProducerNode(items=items, name='NodeA') + worker = ParallelWorker(node=_WorkerNode(name='Worker')) + + agent = Workflow( + name='test_agent', + edges=[ + (START, node_a), + (node_a, worker), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When the workflow is run + events = await runner.run_async(testing_utils.get_user_content('start')) + + # Then results should be ordered and match expected events + simplified_events = simplify_events_with_node(events) + + assert simplified_events == [ + ( + 'test_agent@1/NodeA@1', + { + 'output': [ + {'val': 'item1', 'delay': 0}, + {'val': 'item2', 'delay': 0.1}, + ], + }, + ), + ( + 'test_agent@1/Worker@1/Worker@1', + {'output': 'item1_processed'}, + ), + ( + 'test_agent@1/Worker@1/Worker@2', + {'output': 'item2_processed'}, + ), + ( + 'test_agent@1/Worker@1', + { + 'output': ['item1_processed', 'item2_processed'], + }, + ), + ] + + +@pytest.mark.asyncio +async def test_parallel_worker_with_empty_input_returns_empty_list( + request: pytest.FixtureRequest, +): + """ParallelWorker with empty input returns an empty list.""" + # Given a workflow with a producer yielding empty list + items = [] + node_a = _ProducerNode(items=items, name='NodeA') + worker = ParallelWorker(node=_WorkerNode(name='Worker')) + + agent = Workflow( + name='test_empty_agent', + edges=[ + (START, node_a), + (node_a, worker), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When the workflow is run + events = await runner.run_async(testing_utils.get_user_content('start')) + + # Then output aggregator should return empty list + simplified_events = simplify_events_with_node(events) + + assert simplified_events == [ + ( + 'test_empty_agent@1/NodeA@1', + { + 'output': [], + }, + ), + ( + 'test_empty_agent@1/Worker@1', + { + 'output': [], + }, + ), + ] + + +@pytest.mark.asyncio +async def test_parallel_worker_wraps_single_item_in_list( + request: pytest.FixtureRequest, +): + """ParallelWorker wraps a single non-list item into a one-element list.""" + # Given a workflow with a producer yielding a single item (not a list) + item = {'val': 'item1', 'delay': 0} + node_a = _SingleItemProducerNode(item=item, name='NodeA') + worker = ParallelWorker(node=_WorkerNode(name='Worker')) + + agent = Workflow( + name='test_single_item_agent', + edges=[ + (START, node_a), + (node_a, worker), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When the workflow is run + events = await runner.run_async(testing_utils.get_user_content('start')) + + # Then it should be wrapped and processed as a single-element list + simplified_events = simplify_events_with_node(events) + + assert simplified_events == [ + ( + 'test_single_item_agent@1/NodeA@1', + { + 'output': {'val': 'item1', 'delay': 0}, + }, + ), + ( + 'test_single_item_agent@1/Worker@1/Worker@1', + {'output': 'item1_processed'}, + ), + ( + 'test_single_item_agent@1/Worker@1', + { + 'output': ['item1_processed'], + }, + ), + ] + + +async def _worker_func(node_input: dict[str, Any]) -> AsyncGenerator[Any, None]: + if isinstance(node_input, dict) and 'delay' in node_input: + await asyncio.sleep(node_input['delay']) + val = node_input['val'] + else: + val = node_input + yield f'{val}_processed' + + +@pytest.mark.asyncio +async def test_parallel_worker_accepts_plain_function( + request: pytest.FixtureRequest, +): + """ParallelWorker accepts a plain function as the wrapped node.""" + # Given a workflow with a producer and a parallel worker wrapping a function + items = [{'val': 'item1', 'delay': 0}, {'val': 'item2', 'delay': 0.1}] + node_a = _ProducerNode(items=items, name='NodeA') + worker = ParallelWorker(node=_worker_func) + + agent = Workflow( + name='test_agent', + edges=[ + (START, node_a), + (node_a, worker), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When the workflow is run + events = await runner.run_async(testing_utils.get_user_content('start')) + + # Then it should process items correctly + simplified_events = simplify_events_with_node(events) + + assert simplified_events == [ + ( + 'test_agent@1/NodeA@1', + { + 'output': [ + {'val': 'item1', 'delay': 0}, + {'val': 'item2', 'delay': 0.1}, + ], + }, + ), + ( + 'test_agent@1/_worker_func@1/_worker_func@1', + { + 'output': 'item1_processed', + }, + ), + ( + 'test_agent@1/_worker_func@1/_worker_func@2', + { + 'output': 'item2_processed', + }, + ), + ( + 'test_agent@1/_worker_func@1', + { + 'output': ['item1_processed', 'item2_processed'], + }, + ), + ] + + +@pytest.mark.asyncio +async def test_parallel_worker_failure_propagates_and_cancels_others( + request: pytest.FixtureRequest, +): + """One worker failure cancels remaining workers and propagates the exception. + + Setup: 3 items — task-1 completes fast, task-2 fails after delay, + task-3 is slow. + Assert: + - task-1 finishes before the failure. + - task-2's ValueError propagates to the runner. + - task-3 is cancelled (never finishes). + """ + # Given a worker that fails on task-2 + items = ['task-1', 'task-2', 'task-3'] + node_a = _ProducerNode(items=items, name='NodeA') + + tracker = {} + task_3_done_cancelled = False + + async def _worker_failable_func(node_input: str) -> AsyncGenerator[Any, None]: + if node_input == 'task-1': + yield f'{node_input}_processed' + elif node_input == 'task-2': + await asyncio.sleep(0.05) + raise ValueError(f'{node_input} failed') + elif node_input == 'task-3': + try: + await asyncio.sleep(0.1) + except asyncio.CancelledError: + nonlocal task_3_done_cancelled + task_3_done_cancelled = True + raise + yield f'{node_input}_processed' + + tracker[node_input] = True + + worker = ParallelWorker(node=_worker_failable_func) + + agent = Workflow( + name='test_agent_fail', + edges=[ + (START, node_a), + (node_a, worker), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + events = [] + + # When running the agent, expect it to raise the worker exception + with pytest.raises(ValueError, match='task-2 failed'): + async for event in runner.runner.run_async( + user_id=runner.session.user_id, + session_id=runner.session.id, + new_message=testing_utils.get_user_content('start'), + ): + events.append(event) + + # Then assert that the error was captured in an event and state is correct + assert any( + event.error_code == 'ValueError' + and event.error_message == 'task-2 failed' + for event in events + ) + assert tracker == {'task-1': True} + assert task_3_done_cancelled + + simplified_events = simplify_events_with_node(events) + + assert simplified_events == [ + ( + 'test_agent_fail@1/NodeA@1', + { + 'output': ['task-1', 'task-2', 'task-3'], + }, + ), + ( + 'test_agent_fail@1/_worker_failable_func@1/_worker_failable_func@1', + { + 'output': 'task-1_processed', + }, + ), + ] + + +class _HitlWorkerNode(BaseNode): + """A worker node that can request human input.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + rerun_on_resume: bool = Field(default=True) + name: str = Field(default='Worker') + + def __init__(self, name: str = 'Worker'): + super().__init__() + object.__setattr__(self, 'name', name) + + @override + def get_name(self) -> str: + return self.name + + @override + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + val = node_input['val'] + ask = node_input['ask'] + + if ask: + interrupt_id = f'req_{val}' + if resume_input := ctx.resume_inputs.get(interrupt_id): + yield Event(output=f"{val}_{resume_input['text']}") + else: + yield RequestInput( + interrupt_id=interrupt_id, message=f'Input for {val}' + ) + else: + yield Event(output=f'{val}_processed') + + +@pytest.mark.asyncio +@pytest.mark.xfail(reason='ctx.run_node needs barrier for parallel HITL') +async def test_parallel_worker_pauses_for_human_input( + request: pytest.FixtureRequest, +): + """Worker requesting input pauses the workflow; resume completes all workers. + + Setup: 2 items — item1 completes, item2 requests input. + Act: + - Run 1: item1 completes, item2 interrupts. + - Run 2: resume item2 with FR. + Assert: + - Run 1: item1 output emitted, RequestInput for item2. + - Run 2: item2 output emitted, parent returns full list. + """ + # Given a workflow with a worker that requests input for item2 + items = [{'val': 'item1', 'ask': False}, {'val': 'item2', 'ask': True}] + node_a = _ProducerNode(items=items, name='NodeA') + worker = ParallelWorker(node=_HitlWorkerNode(name='Worker')) + + agent = Workflow( + name='parallel_worker_hitl_agent', + edges=[ + (START, node_a), + (node_a, worker), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When the workflow is run for the first time + events1 = await runner.run_async(testing_utils.get_user_content('start')) + + # Then item1 should complete and item2 should interrupt + req_events = [e for e in events1 if has_request_input_function_call(e)] + assert len(req_events) == 1 + interrupt_id = get_request_input_interrupt_ids(req_events[0])[0] + assert interrupt_id == 'req_item2' + invocation_id = events1[0].invocation_id + + simplified_events1 = simplify_events_with_node(events1) + assert simplified_events1 == [ + ( + 'parallel_worker_hitl_agent@1/NodeA@1', + { + 'output': [ + {'val': 'item1', 'ask': False}, + {'val': 'item2', 'ask': True}, + ], + }, + ), + ( + 'parallel_worker_hitl_agent@1/Worker@1', + {'output': 'item1_processed'}, + ), + ( + 'parallel_worker_hitl_agent', + testing_utils.simplify_content(req_events[0].content), + ), + ] + + # When resuming with human input for item2 + user_input = types.Part( + function_response=types.FunctionResponse( + id=interrupt_id, + name='user_input', + response={'text': 'resumed'}, + ) + ) + events2 = await runner.run_async( + new_message=testing_utils.UserContent(user_input), + invocation_id=invocation_id, + ) + + # Then item2 should complete and the full list should be returned + simplified_events2 = simplify_events_with_node(events2) + + assert simplified_events2 == [ + ( + 'parallel_worker_hitl_agent@1/Worker@1', + {'output': 'item2_resumed'}, + ), + ( + 'parallel_worker_hitl_agent@1/Worker@1', + { + 'output': ['item1_processed', 'item2_resumed'], + }, + ), + ] + + +class _AsyncWorkerNode(BaseNode): + """A worker node that waits for an asyncio event before processing an item.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + name: str = Field(default='Worker') + events: dict[str, asyncio.Event] = Field(default_factory=dict) + + def __init__( + self, + name: str = 'Worker', + events: dict[str, asyncio.Event] | None = None, + ): + super().__init__() + object.__setattr__(self, 'name', name) + object.__setattr__(self, 'events', events or {}) + + @override + def get_name(self) -> str: + return self.name + + @override + async def run( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if node_input in self.events: + await self.events[node_input].wait() + yield Event(output=f'{node_input}_res') + + +@pytest.mark.asyncio +async def test_parallel_worker_preserves_input_order_regardless_of_completion_order( + request: pytest.FixtureRequest, +): + """Final output list preserves input order regardless of worker completion order.""" + # Given items and events to control completion order + item1 = 'item1' + item2 = 'item2' + events_map = { + item1: asyncio.Event(), + item2: asyncio.Event(), + } + + node_a = _ProducerNode(items=[item1, item2], name='NodeA') + worker = ParallelWorker( + node=_AsyncWorkerNode(name='Worker', events=events_map) + ) + + agent = Workflow( + name='out_of_order_agent', + edges=[ + (START, node_a), + (node_a, worker), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When running the workflow (starting in background) + run_task = asyncio.create_task( + runner.run_async(testing_utils.get_user_content('start')) + ) + + # Allow the runner to reach the wait point. + await asyncio.sleep(0.1) + + # Finish item2 first + events_map[item2].set() + await asyncio.sleep(0.1) + + # Finish item1 second + events_map[item1].set() + + events = await run_task + + # Then output should preserve input order + simplified_events = simplify_events_with_node(events) + + assert simplified_events == [ + ( + 'out_of_order_agent@1/NodeA@1', + {'output': [item1, item2]}, + ), + ( + 'out_of_order_agent@1/Worker@1/Worker@2', + {'output': 'item2_res'}, + ), + ( + 'out_of_order_agent@1/Worker@1/Worker@1', + {'output': 'item1_res'}, + ), + ( + 'out_of_order_agent@1/Worker@1', + {'output': ['item1_res', 'item2_res']}, + ), + ] + + +@pytest.mark.asyncio +async def test_parallel_worker_can_wrap_nested_workflow( + request: pytest.FixtureRequest, +): + """Nested Workflow wrapped in ParallelWorker processes items through its graph.""" + # Given a workflow wrapping a nested workflow in ParallelWorker + items = ['item1', 'item2'] + node_a = _ProducerNode(items=items, name='NodeA') + + async def worker_func(node_input: Any): + return f'{node_input}_processed' + + nested_agent = Workflow( + name='nested_agent', + edges=[(START, worker_func)], + ) + + parallel_nested = node(nested_agent, parallel_worker=True) + + outer_agent = Workflow( + name='outer_agent', + edges=[ + (START, node_a), + (node_a, parallel_nested), + ], + ) + app = App( + name=request.function.__name__, + root_agent=outer_agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When the workflow is run + events = await runner.run_async(testing_utils.get_user_content('start')) + + # Then results should be processed by the nested workflow + simplified_events = simplify_events_with_node(events) + + assert simplified_events == [ + ( + 'outer_agent@1/NodeA@1', + { + 'output': ['item1', 'item2'], + }, + ), + ( + 'outer_agent@1/nested_agent@1/nested_agent@1/worker_func@1', + {'output': 'item1_processed'}, + ), + ( + 'outer_agent@1/nested_agent@1/nested_agent@2/worker_func@1', + {'output': 'item2_processed'}, + ), + ( + 'outer_agent@1/nested_agent@1', + { + 'output': [ + 'item1_processed', + 'item2_processed', + ], + }, + ), + ] + + +@pytest.mark.asyncio +@pytest.mark.xfail(reason='New Workflow has no parallel_worker field') +async def test_workflow_auto_wraps_parallel_worker_when_flag_set( + request: pytest.FixtureRequest, +): + """Workflow with parallel_worker=True auto-wraps in ParallelWorker.""" + + # Given a nested workflow with parallel_worker=True + async def producer_func(): + return ['item1', 'item2'] + + async def worker_func(node_input: Any): + return f'{node_input}_processed' + + nested_agent = Workflow( + name='nested_agent', + edges=[('START', worker_func)], + parallel_worker=True, + ) + + outer_agent = Workflow( + name='outer_agent', + edges=[ + ('START', producer_func), + (producer_func, nested_agent), + ], + ) + + app = App( + name=request.function.__name__, + root_agent=outer_agent, + ) + runner = testing_utils.InMemoryRunner(app=app) + + # When the workflow is run + events = await runner.run_async(testing_utils.get_user_content('start')) + + # Then it should process items in parallel + simplified_events = simplify_events_with_node(events) + + assert simplified_events == [ + ( + 'outer_agent@1/producer_func@1', + { + 'output': ['item1', 'item2'], + }, + ), + ( + 'nested_agent@1/worker_func@1', + {'output': 'item1_processed'}, + ), + ( + 'nested_agent@1/worker_func@1', + {'output': 'item2_processed'}, + ), + ( + 'outer_agent@1/nested_agent@1', + { + 'output': [ + 'item1_processed', + 'item2_processed', + ], + }, + ), + ] + + +@pytest.mark.asyncio +async def test_parallel_worker_limits_concurrency( + request: pytest.FixtureRequest, +): + """max_concurrency limits the number of concurrent workers at any time.""" + # Given items and events to control concurrency + items = ['item1', 'item2', 'item3', 'item4'] + started_events = {item: asyncio.Event() for item in items} + finish_events = {item: asyncio.Event() for item in items} + + async def _concurrency_worker_func( + node_input: str, + ) -> AsyncGenerator[Any, None]: + started_events[node_input].set() + await finish_events[node_input].wait() + yield f'{node_input}_processed' + + node_a = _ProducerNode(items=items, name='NodeA') + worker = ParallelWorker(node=_concurrency_worker_func, max_concurrency=2) + + agent = Workflow( + name='max_concurrency_agent', + edges=[ + (START, node_a), + (node_a, worker), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + events = [] + + async def _run_agent(): + async for event in runner.runner.run_async( + user_id=runner.session.user_id, + session_id=runner.session.id, + new_message=testing_utils.get_user_content('start'), + ): + events.append(event) + + # When running the agent (starting in background) + run_task = asyncio.create_task(_run_agent()) + + # Then verify that initially only two workers are started + await asyncio.gather( + started_events['item1'].wait(), + started_events['item2'].wait(), + ) + + assert started_events['item1'].is_set() + assert started_events['item2'].is_set() + assert not started_events['item3'].is_set() + assert not started_events['item4'].is_set() + + # Signal second worker to finish + finish_events['item2'].set() + + # Check that the next worker (third one) is scheduled + await started_events['item3'].wait() + assert started_events['item3'].is_set() + assert not started_events['item4'].is_set() + + # Signal the third worker to be finished. Check 4th worker is scheduled + finish_events['item3'].set() + await started_events['item4'].wait() + assert started_events['item4'].is_set() + + # Finish all workers, and assert the workflow finishes + finish_events['item1'].set() + finish_events['item4'].set() + + await run_task + + simplified_events = simplify_events_with_node(events) + + assert simplified_events == [ + ( + 'max_concurrency_agent@1/NodeA@1', + {'output': items}, + ), + ( + 'max_concurrency_agent@1/_concurrency_worker_func@1/_concurrency_worker_func@2', + { + 'output': 'item2_processed', + }, + ), + ( + 'max_concurrency_agent@1/_concurrency_worker_func@1/_concurrency_worker_func@3', + { + 'output': 'item3_processed', + }, + ), + ( + 'max_concurrency_agent@1/_concurrency_worker_func@1/_concurrency_worker_func@1', + { + 'output': 'item1_processed', + }, + ), + ( + 'max_concurrency_agent@1/_concurrency_worker_func@1/_concurrency_worker_func@4', + { + 'output': 'item4_processed', + }, + ), + ( + 'max_concurrency_agent@1/_concurrency_worker_func@1', + { + 'output': [ + 'item1_processed', + 'item2_processed', + 'item3_processed', + 'item4_processed', + ], + }, + ), + ] + + +@pytest.mark.asyncio +@pytest.mark.skip(reason='Hangs: ctx.run_node needs barrier for parallel HITL') +async def test_parallel_worker_hitl_respects_concurrency_limits( + request: pytest.FixtureRequest, +): + """HITL resume under max_concurrency schedules next worker after resolution. + + Setup: 3 items, max_concurrency=2. item1 waits, item2 does HITL, + item3 does HITL. + Act: + - Run 1: item1 and item2 start. item2 interrupts. Signal item1 to finish. + - Run 2: resume item2. item3 starts and interrupts. + - Run 3: resume item3. All complete. + Assert: + - Run 1: item2 RequestInput, item1 output. + - Run 2: item2 output, item3 RequestInput. + - Run 3: item3 output, parent returns full list. + """ + # Given items and events to control concurrency and HITL + items = [ + {'val': 'item1', 'ask': False}, + {'val': 'item2', 'ask': True}, + {'val': 'item3', 'ask': True}, + ] + started_events = {item['val']: asyncio.Event() for item in items} + finish_events = {item['val']: asyncio.Event() for item in items} + + @node(name='Worker', rerun_on_resume=True) + async def hitl_concurrency_worker( + ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + val = node_input['val'] + ask = node_input['ask'] + + started_events[val].set() + + if ask: + interrupt_id = f'req_{val}' + if resume_input := ctx.resume_inputs.get(interrupt_id): + yield Event(output=f"{val}_{resume_input['text']}") + else: + yield RequestInput( + interrupt_id=interrupt_id, message=f'Input for {val}' + ) + else: + await finish_events[val].wait() + yield Event(output=f'{val}_processed') + + node_a = _ProducerNode(items=items, name='NodeA') + worker = ParallelWorker(node=hitl_concurrency_worker, max_concurrency=2) + + agent = Workflow( + name='max_concurrency_hitl_agent', + edges=[ + (START, node_a), + (node_a, worker), + ], + ) + app = App( + name=request.function.__name__, + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + runner = testing_utils.InMemoryRunner(app=app) + + events = [] + + # When running the agent for the first time + run_task = asyncio.create_task( + runner.run_async(testing_utils.get_user_content('start')) + ) + + # Then Node 1 and Node 2 should start + await asyncio.gather( + started_events['item1'].wait(), + started_events['item2'].wait(), + ) + + assert started_events['item1'].is_set() + assert started_events['item2'].is_set() + assert not started_events['item3'].is_set() + + # Signal node 1 to finish + finish_events['item1'].set() + + events1 = await run_task + events.extend(events1) + + req_events = [e for e in events1 if has_request_input_function_call(e)] + assert len(req_events) == 1 + interrupt_id_2 = get_request_input_interrupt_ids(req_events[0])[0] + assert interrupt_id_2 == 'req_item2' + invocation_id_1 = events1[0].invocation_id + + simplified_events1 = simplify_events_with_node(events1) + assert simplified_events1 == [ + ( + 'max_concurrency_hitl_agent@1/NodeA@1', + { + 'output': items, + }, + ), + ( + 'max_concurrency_hitl_agent', + testing_utils.simplify_content(req_events[0].content), + ), + ( + 'max_concurrency_hitl_agent@1/Worker__0@1', + {'output': 'item1_processed'}, + ), + ] + + # When resuming Node 2 + user_input_2 = types.Part( + function_response=types.FunctionResponse( + id=interrupt_id_2, + name='user_input', + response={'text': 'resumed'}, + ) + ) + + run_task_2 = asyncio.create_task( + runner.run_async( + new_message=testing_utils.UserContent(user_input_2), + invocation_id=invocation_id_1, + ) + ) + + # Then node 3 should start and yield RequestInput + await asyncio.sleep(0.1) + await started_events['item3'].wait() + assert started_events['item3'].is_set() + + events2 = await run_task_2 + events.extend(events2) + + req_events_2 = [e for e in events2 if has_request_input_function_call(e)] + assert len(req_events_2) == 1 + interrupt_id_3 = get_request_input_interrupt_ids(req_events_2[0])[0] + assert interrupt_id_3 == 'req_item3' + invocation_id_2 = events2[0].invocation_id + + simplified_events2 = simplify_events_with_node(events2) + assert simplified_events2 == [ + ( + 'max_concurrency_hitl_agent@1/Worker__1@1', + {'output': 'item2_resumed'}, + ), + ( + 'max_concurrency_hitl_agent', + testing_utils.simplify_content(req_events_2[0].content), + ), + ] + + # When resuming Node 3 + user_input_3 = types.Part( + function_response=types.FunctionResponse( + id=interrupt_id_3, + name='user_input', + response={'text': 'resumed'}, + ) + ) + + run_task_3 = asyncio.create_task( + runner.run_async( + new_message=testing_utils.UserContent(user_input_3), + invocation_id=invocation_id_2, + ) + ) + + events3 = await run_task_3 + events.extend(events3) + + # Then all should complete + simplified_events3 = simplify_events_with_node(events3) + + assert simplified_events3 == [ + ( + 'max_concurrency_hitl_agent@1/Worker__2@1', + {'output': 'item3_resumed'}, + ), + ( + 'max_concurrency_hitl_agent@1/Worker@1', + { + 'output': ['item1_processed', 'item2_resumed', 'item3_resumed'], + }, + ), + ] diff --git a/tests/unittests/workflow/test_workflow_routes.py b/tests/unittests/workflow/test_workflow_routes.py new file mode 100644 index 0000000000..c3869223d1 --- /dev/null +++ b/tests/unittests/workflow/test_workflow_routes.py @@ -0,0 +1,654 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Testings for the Workflow routes.""" + +from typing import Any +from typing import Dict + +from google.adk.agents.context import Context +from google.adk.apps.app import App +from google.adk.workflow import Edge +from google.adk.workflow import START +from google.adk.workflow._graph import DEFAULT_ROUTE +from google.adk.workflow._graph import Graph +from google.adk.workflow._join_node import JoinNode +from google.adk.workflow._workflow import Workflow +import pytest + +from .. import testing_utils +from .workflow_testing_utils import create_parent_invocation_context +from .workflow_testing_utils import simplify_events_with_node +from .workflow_testing_utils import TestingNode + + +@pytest.mark.asyncio +async def test_run_async_with_edge_routes(request: pytest.FixtureRequest): + route_holder = {'route': 'route_b'} + + def dynamic_router(ctx: Context, node_input: Any): + return route_holder['route'] + + node_a = TestingNode(name='NodeA', output='A', route=dynamic_router) + node_b = TestingNode(name='NodeB', output='B') + node_c = TestingNode(name='NodeC', output='C') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge( + from_node=node_a, + to_node=node_b, + route='route_b', + ), + Edge( + from_node=node_a, + to_node=node_c, + route='route_c', + ), + ], + ) + agent = Workflow( + name='test_workflow_agent', + graph=graph, + ) + + # Test case for route_b + route_holder['route'] = 'route_b' + app = App(name=request.function.__name__ + '_b', root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events_b = await runner.run_async(testing_utils.get_user_content('start')) + assert simplify_events_with_node(events_b) == [ + ('test_workflow_agent@1/NodeA@1', {'output': 'A'}), + ('test_workflow_agent@1/NodeB@1', {'output': 'B'}), + ] + + # Test case for route_c + route_holder['route'] = 'route_c' + app_c = App(name=request.function.__name__ + '_c', root_agent=agent) + runner_c = testing_utils.InMemoryRunner(app=app_c) + events_c = await runner_c.run_async(testing_utils.get_user_content('start')) + assert simplify_events_with_node(events_c) == [ + ('test_workflow_agent@1/NodeA@1', {'output': 'A'}), + ('test_workflow_agent@1/NodeC@1', {'output': 'C'}), + ] + + +@pytest.mark.asyncio +async def test_output_route_int(request: pytest.FixtureRequest): + node_a = TestingNode(name='NodeA', route=1) + node_b = TestingNode(name='NodeB', output='B') + node_c = TestingNode(name='NodeC', output='C') + agent = Workflow( + name='test_workflow_agent_route_int', + edges=[ + (START, node_a), + (node_a, {1: node_b, 2: node_c}), + ], + ) + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_route_int@1/NodeA@1', + {'output': None}, + ), + ( + 'test_workflow_agent_route_int@1/NodeB@1', + {'output': 'B'}, + ), + ] + + +@pytest.mark.asyncio +async def test_output_route_bool(request: pytest.FixtureRequest): + node_a = TestingNode(name='NodeA', route=True) + node_b = TestingNode(name='NodeB', output='B') + node_c = TestingNode(name='NodeC', output='C') + agent = Workflow( + name='test_workflow_agent_route_bool', + edges=[ + (START, node_a), + (node_a, {True: node_b, False: node_c}), + ], + ) + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_route_bool@1/NodeA@1', + {'output': None}, + ), + ( + 'test_workflow_agent_route_bool@1/NodeB@1', + {'output': 'B'}, + ), + ] + + +@pytest.mark.asyncio +async def test_output_route_no_data(request: pytest.FixtureRequest): + node_a = TestingNode(name='NodeA', route='route_b') + node_b = TestingNode(name='NodeB', output='B') + node_c = TestingNode(name='NodeC', output='C') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge( + from_node=node_a, + to_node=node_b, + route='route_b', + ), + Edge( + from_node=node_a, + to_node=node_c, + route='route_c', + ), + ], + ) + agent = Workflow( + name='test_workflow_agent_route_no_data', + graph=graph, + ) + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + assert simplify_events_with_node(events) == [ + ( + 'test_workflow_agent_route_no_data@1/NodeA@1', + {'output': None}, + ), + ( + 'test_workflow_agent_route_no_data@1/NodeB@1', + {'output': 'B'}, + ), + ] + + +@pytest.mark.asyncio +async def test_run_async_with_list_of_routes(request: pytest.FixtureRequest): + node_a = TestingNode(name='NodeA', output='A', route=['route_b', 'route_c']) + node_b = TestingNode(name='NodeB', output='B') + node_c = TestingNode(name='NodeC', output='C') + node_d = TestingNode(name='NodeD', output='D') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge( + from_node=node_a, + to_node=node_b, + route='route_b', + ), + Edge( + from_node=node_a, + to_node=node_c, + route='route_c', + ), + Edge( + from_node=node_a, + to_node=node_d, + route='route_d', + ), + ], + ) + agent = Workflow( + name='test_workflow_agent_list_routes', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + simplified_events = simplify_events_with_node(events) + + assert len(simplified_events) == 3 + assert simplified_events[0] == ( + 'test_workflow_agent_list_routes@1/NodeA@1', + {'output': 'A'}, + ) + + # Check that the other two events are from NodeB and NodeC, in any order. + other_events = simplified_events[1:] + expected_other_events = [ + ( + 'test_workflow_agent_list_routes@1/NodeB@1', + {'output': 'B'}, + ), + ( + 'test_workflow_agent_list_routes@1/NodeC@1', + {'output': 'C'}, + ), + ] + assert len(other_events) == len(expected_other_events) + assert all(item in other_events for item in expected_other_events) + + +@pytest.mark.asyncio +async def test_run_async_with_default_route(request: pytest.FixtureRequest): + node_a = TestingNode(name='NodeA', output='A', route='unmatched_route') + node_b = TestingNode(name='NodeB', output='B') + node_c = TestingNode(name='NodeC', output='C') + node_d = TestingNode(name='NodeD', output='D') + + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge( + from_node=node_a, + to_node=node_b, + route='route_b', + ), + # This edge has the DEFAULT_ROUTE tag. + Edge( + from_node=node_a, + to_node=node_c, + route=DEFAULT_ROUTE, + ), + # This edge has no route tag, so it should always be triggered. + Edge( + from_node=node_a, + to_node=node_d, + ), + ], + ) + agent = Workflow( + name='test_workflow_agent_default_route', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + simplified_events = simplify_events_with_node(events) + + assert len(simplified_events) == 3 + assert simplified_events[0] == ( + 'test_workflow_agent_default_route@1/NodeA@1', + {'output': 'A'}, + ) + + # Check that NodeC (default route) and NodeD (untagged) are triggered. + other_events = simplified_events[1:] + expected_other_events = [ + ( + 'test_workflow_agent_default_route@1/NodeC@1', + {'output': 'C'}, + ), + ( + 'test_workflow_agent_default_route@1/NodeD@1', + {'output': 'D'}, + ), + ] + assert len(other_events) == len(expected_other_events) + assert all(item in other_events for item in expected_other_events) + + +@pytest.mark.asyncio +async def test_run_async_default_route_not_triggered_if_match( + request: pytest.FixtureRequest, +): + node_a = TestingNode(name='NodeA', output='A', route='route_b') + node_b = TestingNode(name='NodeB', output='B') + node_c = TestingNode(name='NodeC', output='C') + + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge( + from_node=node_a, + to_node=node_b, + route='route_b', + ), + # This edge has the DEFAULT_ROUTE tag. + Edge( + from_node=node_a, + to_node=node_c, + route=DEFAULT_ROUTE, + ), + ], + ) + agent = Workflow( + name='test_workflow_agent_default_route_not_triggered', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + simplified_events = simplify_events_with_node(events) + + assert simplified_events == [ + ( + 'test_workflow_agent_default_route_not_triggered@1/NodeA@1', + {'output': 'A'}, + ), + ( + 'test_workflow_agent_default_route_not_triggered@1/NodeB@1', + {'output': 'B'}, + ), + ] + + +@pytest.mark.asyncio +async def test_run_async_with_untagged_edges(request: pytest.FixtureRequest): + node_a = TestingNode(name='NodeA', output='A', route='route_b') + node_b = TestingNode(name='NodeB', output='B') + node_c = TestingNode(name='NodeC', output='C') + node_d = TestingNode(name='NodeD', output='D') + graph = Graph( + edges=[ + Edge(from_node=START, to_node=node_a), + Edge( + from_node=node_a, + to_node=node_b, + route='route_b', + ), + Edge( + from_node=node_a, + to_node=node_c, + route='route_c', + ), + # This edge has no route tag, so it should always be triggered. + Edge( + from_node=node_a, + to_node=node_d, + ), + ], + ) + agent = Workflow( + name='test_workflow_agent_untagged_edges', + graph=graph, + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + simplified_events = simplify_events_with_node(events) + + assert len(simplified_events) == 3 + assert simplified_events[0] == ( + 'test_workflow_agent_untagged_edges@1/NodeA@1', + {'output': 'A'}, + ) + + # Check that NodeB and NodeD are triggered. + other_events = simplified_events[1:] + expected_other_events = [ + ( + 'test_workflow_agent_untagged_edges@1/NodeB@1', + {'output': 'B'}, + ), + ( + 'test_workflow_agent_untagged_edges@1/NodeD@1', + {'output': 'D'}, + ), + ] + assert len(other_events) == len(expected_other_events) + assert all(item in other_events for item in expected_other_events) + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'emitted_route, expected_target', + [ + ('route_a', 'Target'), + ('route_b', 'Target'), + ('route_c', 'Other'), + ], + ids=['route_a_matches_list', 'route_b_matches_list', 'route_c_single'], +) +async def test_edge_with_multiple_routes( + request: pytest.FixtureRequest, emitted_route, expected_target +): + """Tests that an edge with a list of routes matches any of them.""" + node_router = TestingNode(name='Router', output='R', route=emitted_route) + node_target = TestingNode(name='Target', output='T') + node_other = TestingNode(name='Other', output='O') + + agent = Workflow( + name='test_multi_route', + edges=[ + (START, node_router), + Edge( + from_node=node_router, + to_node=node_target, + route=['route_a', 'route_b'], + ), + (node_router, {'route_c': node_other}), + ], + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + assert simplify_events_with_node(events) == [ + ('test_multi_route@1/Router@1', {'output': 'R'}), + ( + f'test_multi_route@1/{expected_target}@1', + { + 'output': 'T' if expected_target == 'Target' else 'O', + }, + ), + ] + + +# --- Routing map integration tests --- + + +@pytest.mark.asyncio +async def test_routing_map_with_default_route( + request: pytest.FixtureRequest, +): + """Tests that DEFAULT_ROUTE works as a fallback in routing maps.""" + node_a = TestingNode(name='NodeA', output='A', route='unmatched_route') + node_b = TestingNode(name='NodeB', output='B') + node_c = TestingNode(name='NodeC', output='C') + + agent = Workflow( + name='test_routing_map_default', + edges=[ + (START, node_a), + (node_a, {'route_b': node_b, DEFAULT_ROUTE: node_c}), + ], + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + assert simplify_events_with_node(events) == [ + ( + 'test_routing_map_default@1/NodeA@1', + {'output': 'A'}, + ), + ( + 'test_routing_map_default@1/NodeC@1', + {'output': 'C'}, + ), + ] + + +@pytest.mark.asyncio +async def test_routing_map_mixed_with_other_formats( + request: pytest.FixtureRequest, +): + """Tests that routing maps coexist with tuples and Edge objects.""" + node_a = TestingNode(name='NodeA', output='A', route='route_b') + node_b = TestingNode(name='NodeB', output='B') + node_c = TestingNode(name='NodeC', output='C') + node_d = TestingNode(name='NodeD', output='D') + + agent = Workflow( + name='test_routing_map_mixed', + edges=[ + (START, node_a), + (node_a, {'route_b': node_b, 'route_c': node_c}), + (node_b, node_d), # unconditional 2-tuple + Edge(from_node=node_c, to_node=node_d), # Edge object + ], + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + assert simplify_events_with_node(events) == [ + ( + 'test_routing_map_mixed@1/NodeA@1', + {'output': 'A'}, + ), + ( + 'test_routing_map_mixed@1/NodeB@1', + {'output': 'B'}, + ), + ( + 'test_routing_map_mixed@1/NodeD@1', + {'output': 'D'}, + ), + ] + + +@pytest.mark.asyncio +async def test_routing_map_fan_out_runs_both_targets( + request: pytest.FixtureRequest, +): + """Tests that fan-out in routing maps triggers both targets at runtime.""" + node_a = TestingNode(name='NodeA', output='A', route='route_x') + node_b = TestingNode(name='NodeB', output='B') + node_c = TestingNode(name='NodeC', output='C') + gate = JoinNode(name='Gate') + + agent = Workflow( + name='test_routing_map_fan_out', + edges=[ + (START, node_a), + (node_a, {'route_x': (node_b, node_c)}), + (node_b, gate), + (node_c, gate), + ], + ) + + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + simplified = simplify_events_with_node(events) + + # NodeB and NodeC should both be triggered, in any order. + # Gate node also produces output combining the two. + outputs = [ + e + for e in simplified + if isinstance(e[1], dict) and e[1].get('output') is not None + ] + + assert len(outputs) == 4 + assert outputs[0] == ( + 'test_routing_map_fan_out@1/NodeA@1', + {'output': 'A'}, + ) + + # Gate should be last + assert outputs[-1] == ( + 'test_routing_map_fan_out@1/Gate@1', + {'output': {'NodeB': 'B', 'NodeC': 'C'}}, + ) + + other = outputs[1:3] + expected = [ + ( + 'test_routing_map_fan_out@1/NodeB@1', + {'output': 'B'}, + ), + ( + 'test_routing_map_fan_out@1/NodeC@1', + {'output': 'C'}, + ), + ] + assert len(other) == len(expected) + assert all(item in other for item in expected) + + +@pytest.mark.asyncio +async def test_fan_in_with_route(request: pytest.FixtureRequest): + """Fan-in with conditional routes — both route to same target.""" + a = TestingNode(name='a', output='A', route='route1') + b = TestingNode(name='b', output='B', route='route1') + c = TestingNode(name='c', output='C') + wf = Workflow( + name='wf', + edges=[ + (START, a), + (START, b), + ((a, b), {'route1': c}), + ], + ) + + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + simplified = simplify_events_with_node(events) + + # 'c' should receive from both 'a' and 'b' and run twice. + c_events = [e for e in simplified if e[0].split('/')[-1].split('@')[0] == 'c'] + assert len(c_events) == 2 + + +@pytest.mark.asyncio +async def test_fan_out_with_route(request: pytest.FixtureRequest): + """Fan-out via route to multiple terminals raises ValueError.""" + router = TestingNode(name='r', output='R', route='route1') + b = TestingNode(name='b', output='B') + c = TestingNode(name='c', output='C') + wf = Workflow( + name='wf', + edges=[ + (START, router), + (router, {'route1': (b, c)}), + ], + ) + + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + + with pytest.raises(ValueError, match='multiple terminal nodes'): + await runner.run_async(testing_utils.get_user_content('start')) + + +@pytest.mark.asyncio +async def test_fan_in_out_with_route(request: pytest.FixtureRequest): + """Fan-in/out with routes to multiple terminals raises ValueError.""" + a = TestingNode(name='a', output='A', route='route1') + b = TestingNode(name='b', output='B', route='route1') + c = TestingNode(name='c', output='C') + d = TestingNode(name='d', output='D') + wf = Workflow( + name='wf', + edges=[ + (START, a), + (START, b), + ((a, b), {'route1': (c, d)}), + ], + ) + + app = App(name=request.function.__name__, root_agent=wf) + runner = testing_utils.InMemoryRunner(app=app) + + with pytest.raises(ValueError, match='multiple terminal nodes'): + await runner.run_async(testing_utils.get_user_content('start')) diff --git a/tests/unittests/workflow/test_workflow_schema.py b/tests/unittests/workflow/test_workflow_schema.py new file mode 100644 index 0000000000..5fdfc706ff --- /dev/null +++ b/tests/unittests/workflow/test_workflow_schema.py @@ -0,0 +1,842 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for Workflow schema validation (input_schema, output_schema).""" + +from __future__ import annotations + +from google.adk.apps.app import App +from google.adk.events.event import Event +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.workflow import BaseNode +from google.adk.workflow import JoinNode +from google.adk.workflow import START +from google.adk.workflow._workflow import Workflow +from google.genai import types +from pydantic import BaseModel +import pytest + +from .. import testing_utils +from .workflow_testing_utils import create_parent_invocation_context + + +class _OutputModel(BaseModel): + name: str + value: int + + +class _OtherModel(BaseModel): + name: str + value: int + extra: str = 'default' + + +@pytest.mark.asyncio +async def test_workflow_output_schema_validates_terminal( + request: pytest.FixtureRequest, +): + """Workflow.output_schema validates when downstream reads the output.""" + + def produce() -> dict: + return {'name': 'result', 'value': 10} + + def consume(node_input: dict) -> str: + return f"got {node_input['name']}" + + inner = Workflow( + name='wf', + edges=[(START, produce)], + output_schema=_OutputModel, + ) + outer = Workflow( + name='outer', + edges=[(START, inner, consume)], + ) + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'got result' for e in data_events) + + +@pytest.mark.asyncio +async def test_workflow_output_schema_rejects_invalid( + request: pytest.FixtureRequest, +): + """Workflow.output_schema rejects invalid output when downstream reads.""" + + def produce_bad() -> dict: + return {'wrong_field': 'oops'} + + def consume(node_input: dict) -> str: + return 'should not reach' + + inner = Workflow( + name='wf', + edges=[(START, produce_bad)], + output_schema=_OutputModel, + ) + outer = Workflow( + name='outer', + edges=[(START, inner, consume)], + ) + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(ValueError): + await runner.run_async(testing_utils.get_user_content('start')) + + +@pytest.mark.asyncio +async def test_workflow_output_schema_coerces_defaults( + request: pytest.FixtureRequest, +): + """Workflow.output_schema coerces terminal output (fills defaults).""" + + def produce() -> dict: + return {'name': 'x', 'value': 1} + + def consume(node_input: dict) -> dict: + return node_input + + inner = Workflow( + name='wf', + edges=[(START, produce)], + output_schema=_OtherModel, + ) + outer = Workflow( + name='outer', + edges=[(START, inner, consume)], + ) + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + data_events = [e for e in events if isinstance(e, Event) and e.output] + consume_events = [e for e in data_events if e.node_info.name == 'consume'] + assert len(consume_events) == 1 + assert consume_events[0].output == { + 'name': 'x', + 'value': 1, + 'extra': 'default', + } + + +@pytest.mark.asyncio +async def test_nested_workflow_output_schema( + request: pytest.FixtureRequest, +): + """Nested workflow's output_schema validates before passing to parent.""" + + def inner_produce() -> dict: + return {'name': 'inner', 'value': 3} + + inner_workflow = Workflow( + name='inner_wf', + edges=[(START, inner_produce)], + output_schema=_OutputModel, + ) + + def outer_consume(node_input: dict) -> str: + return f"got {node_input['name']}" + + outer_workflow = Workflow( + name='outer_wf', + edges=[ + (START, inner_workflow), + (inner_workflow, outer_consume), + ], + ) + app = App(name=request.function.__name__, root_agent=outer_workflow) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'got inner' for e in data_events) + + +@pytest.mark.asyncio +async def test_workflow_output_schema_validates_multiple_terminals( + request: pytest.FixtureRequest, +): + """Each terminal output is validated when downstream reads.""" + + class _JoinedModel(BaseModel): + branch_a: _OtherModel + branch_b: _OtherModel + + def branch_a() -> dict: + return {'name': 'from_a', 'value': 1} + + def branch_b() -> dict: + return {'name': 'from_b', 'value': 2} + + join = JoinNode(name='join') + + inner = Workflow( + name='wf', + edges=[ + (START, branch_a), + (START, branch_b), + (branch_a, join), + (branch_b, join), + ], + output_schema=_JoinedModel, + ) + + def consume(node_input: dict) -> dict: + return node_input + + outer = Workflow( + name='outer', + edges=[(START, inner, consume)], + ) + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + consume_events = [ + e + for e in events + if isinstance(e, Event) and e.output and e.node_info.name == 'consume' + ] + assert len(consume_events) == 1 + + # Both terminal outputs should have 'extra' filled by _OtherModel default. + output = consume_events[0].output + assert output['branch_a'] == { + 'name': 'from_a', + 'value': 1, + 'extra': 'default', + } + assert output['branch_b'] == { + 'name': 'from_b', + 'value': 2, + 'extra': 'default', + } + + +@pytest.mark.asyncio +async def test_workflow_output_schema_rejects_invalid_among_multiple_terminals( + request: pytest.FixtureRequest, +): + """One invalid terminal among multiple raises validation error.""" + + class _JoinedModel(BaseModel): + branch_good: _OutputModel + branch_bad: _OutputModel + + def branch_good() -> dict: + return {'name': 'ok', 'value': 1} + + def branch_bad() -> dict: + return {'wrong_field': 'oops'} + + join = JoinNode(name='join') + + inner = Workflow( + name='wf', + edges=[ + (START, branch_good), + (START, branch_bad), + (branch_good, join), + (branch_bad, join), + ], + output_schema=_JoinedModel, + ) + + def consume(node_input: dict) -> str: + return 'should not reach' + + outer = Workflow( + name='outer', + edges=[(START, inner, consume)], + ) + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(ValueError): + await runner.run_async(testing_utils.get_user_content('start')) + + +# ── Primitive and generic type output_schema ───────────────────────── + + +@pytest.mark.asyncio +async def test_workflow_output_schema_int_coerces( + request: pytest.FixtureRequest, +): + """Workflow output_schema=int coerces string to int at read time.""" + + def produce() -> str: + return '42' + + def consume(node_input: int) -> int: + return node_input + + inner = Workflow( + name='wf', + edges=[(START, produce)], + output_schema=int, + ) + outer = Workflow(name='outer', edges=[(START, inner, consume)]) + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + consume_events = [ + e + for e in events + if isinstance(e, Event) + and e.output is not None + and e.node_info.name == 'consume' + ] + assert len(consume_events) == 1 + assert consume_events[0].output == 42 + + +@pytest.mark.asyncio +async def test_workflow_output_schema_int_rejects_invalid( + request: pytest.FixtureRequest, +): + """Workflow output_schema=int rejects non-coercible value at read time.""" + + def produce() -> dict: + return {'key': 'value'} + + def consume(node_input: int) -> int: + return node_input + + inner = Workflow( + name='wf', + edges=[(START, produce)], + output_schema=int, + ) + outer = Workflow(name='outer', edges=[(START, inner, consume)]) + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(ValueError): + await runner.run_async(testing_utils.get_user_content('start')) + + +@pytest.mark.asyncio +async def test_workflow_output_schema_list_of_str( + request: pytest.FixtureRequest, +): + """Workflow output_schema=list[str] validates list output at read time.""" + + def produce() -> list: + return ['a', 'b', 'c'] + + def consume(node_input: list) -> list: + return node_input + + inner = Workflow( + name='wf', + edges=[(START, produce)], + output_schema=list[str], + ) + outer = Workflow(name='outer', edges=[(START, inner, consume)]) + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + consume_events = [ + e + for e in events + if isinstance(e, Event) + and e.output is not None + and e.node_info.name == 'consume' + ] + assert len(consume_events) == 1 + assert consume_events[0].output == ['a', 'b', 'c'] + + +@pytest.mark.asyncio +async def test_workflow_output_schema_list_of_basemodel( + request: pytest.FixtureRequest, +): + """Workflow output_schema=list[BaseModel] validates and serializes.""" + + def produce() -> list: + return [ + {'name': 'x', 'value': 1}, + {'name': 'y', 'value': 2}, + ] + + def consume(node_input: list) -> list: + return node_input + + inner = Workflow( + name='wf', + edges=[(START, produce)], + output_schema=list[_OutputModel], + ) + outer = Workflow(name='outer', edges=[(START, inner, consume)]) + app = App(name=request.function.__name__, root_agent=outer) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + consume_events = [ + e + for e in events + if isinstance(e, Event) + and e.output is not None + and e.node_info.name == 'consume' + ] + assert len(consume_events) == 1 + assert consume_events[0].output == [ + {'name': 'x', 'value': 1}, + {'name': 'y', 'value': 2}, + ] + + +# ── End-to-end: input_schema + output_schema combined ────────────── + + +class _TaskOutput(BaseModel): + result: str + score: int + + +class _ReviewResult(BaseModel): + result: str + score: int + reviewer: str = 'auto' + + +@pytest.mark.asyncio +async def test_e2e_input_and_output_schema_pipeline( + request: pytest.FixtureRequest, +): + """output_schema on producer + input_schema on consumer validates both.""" + + def produce() -> _TaskOutput: + return {'result': 'done', 'score': 88} + + def consume(node_input: _TaskOutput) -> str: + return f'result={node_input.result}, score={node_input.score}' + + agent = Workflow( + name='wf', + edges=[(START, produce), (produce, consume)], + ) + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'result=done, score=88' for e in data_events) + + +@pytest.mark.asyncio +async def test_e2e_output_schema_fails_before_input_schema( + request: pytest.FixtureRequest, +): + """Producer output_schema failure prevents consumer from running.""" + + def produce_bad() -> _TaskOutput: + return {'wrong': 'shape'} + + def consume(node_input: _TaskOutput) -> str: + return 'should not reach' + + agent = Workflow( + name='wf', + edges=[(START, produce_bad), (produce_bad, consume)], + ) + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + with pytest.raises(ValueError): + await runner.run_async(testing_utils.get_user_content('start')) + + +@pytest.mark.asyncio +async def test_e2e_fan_out_join_with_schemas( + request: pytest.FixtureRequest, +): + """Fan-out -> join -> consume with input/output schemas.""" + + class _JoinedResult(BaseModel): + analyzer: dict + summarizer: dict + + def analyzer() -> _TaskOutput: + return {'result': 'analysis complete', 'score': 92} + + def summarizer() -> _TaskOutput: + return {'result': 'summary complete', 'score': 78} + + join = JoinNode(name='join') + + def reviewer(node_input: dict) -> _ReviewResult: + a = node_input['analyzer'] + s = node_input['summarizer'] + return { + 'result': f"{a['result']} + {s['result']}", + 'score': (a['score'] + s['score']) // 2, + } + + agent = Workflow( + name='wf', + edges=[ + (START, analyzer), + (START, summarizer), + (analyzer, join), + (summarizer, join), + (join, reviewer), + ], + ) + app = App(name=request.function.__name__, root_agent=agent) + runner = testing_utils.InMemoryRunner(app=app) + events = await runner.run_async(testing_utils.get_user_content('start')) + + terminal = [ + e + for e in events + if isinstance(e, Event) + and e.output is not None + and e.node_info.name == 'reviewer' + ] + assert len(terminal) == 1 + assert terminal[0].output == { + 'result': 'analysis complete + summary complete', + 'score': 85, + 'reviewer': 'auto', + } + assert 'wf' in terminal[0].node_info.path + assert 'reviewer' in terminal[0].node_info.path + + +@pytest.mark.asyncio +async def test_start_node_with_str_input_schema(): + """input_schema=str parses user text.""" + + class _AssertingNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + assert node_input == 'hello' + yield 'done' + + node = _AssertingNode(name='node', input_schema=str) + wf = Workflow(name='wf', edges=[(START, node)]) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='hello')], role='user') + events = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'done' for e in data_events) + + +@pytest.mark.asyncio +async def test_start_node_with_int_input_schema(): + """input_schema=int parses user text to int.""" + + class _AssertingNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + assert node_input == 42 + yield 'done' + + node = _AssertingNode(name='node', input_schema=int) + wf = Workflow(name='wf', edges=[(START, node)]) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='42')], role='user') + events = [] + + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'done' for e in data_events) + + +@pytest.mark.asyncio +async def test_start_node_with_int_list_input_schema(): + """input_schema=list[int] parses JSON list.""" + + class _AssertingNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + assert node_input == [1, 2, 3] + yield 'done' + + node = _AssertingNode(name='node', input_schema=list[int]) + wf = Workflow(name='wf', edges=[(START, node)]) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='[1, 2, 3]')], role='user') + events = [] + + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'done' for e in data_events) + + +@pytest.mark.asyncio +async def test_start_node_with_invalid_input_schema(): + """Invalid input against schema raises error.""" + + class _MyModel(BaseModel): + age: int + + class _AssertingNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield 'done' + + node = _AssertingNode(name='node', input_schema=_MyModel) + wf = Workflow(name='wf', edges=[(START, node)]) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + # Pass invalid input (Content instead of dict with age) + msg = types.Content(parts=[types.Part(text='hello')], role='user') + + # We expect it to raise ValidationError + from pydantic import ValidationError + + with pytest.raises(ValidationError): + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + pass + + +@pytest.mark.asyncio +async def test_start_node_receives_parsed_user_content_with_schema(): + """Parsed input replaces raw Content for first node.""" + + class _AssertingNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + assert isinstance(node_input, str) + assert node_input == 'hello' + yield 'done' + + node = _AssertingNode(name='node', input_schema=str) + wf = Workflow(name='wf', edges=[(START, node)]) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='hello')], role='user') + events = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert any(e.output == 'done' for e in data_events) + + +@pytest.mark.asyncio +async def test_workflow_with_invalid_output_schema(): + """Workflow raises ValidationError if terminal output doesn't match output_schema.""" + + from pydantic import ValidationError + + class _MyModel(BaseModel): + name: str + + class _MyNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield {'age': 10} + + node = _MyNode(name='node') + wf = Workflow(name='wf', edges=[(START, node)], output_schema=_MyModel) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='hello')], role='user') + + with pytest.raises(ValidationError): + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + pass + + +@pytest.mark.asyncio +async def test_node_returns_content_json_parsed(): + """Node output as types.Content containing JSON is parsed if output_schema is defined.""" + + class _MyModel(BaseModel): + name: str + age: int + + class _MyNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield types.Content( + parts=[types.Part(text='{"name": "Alice", "age": 30}')] + ) + + node = _MyNode(name='node', output_schema=_MyModel) + wf = Workflow(name='wf', edges=[(START, node)]) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='hello')], role='user') + events = [] + + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + data_events = [e for e in events if isinstance(e, Event) and e.output] + + assert len(data_events) == 1 + assert data_events[0].output == {'name': 'Alice', 'age': 30} + + +@pytest.mark.asyncio +async def test_node_returns_raw_string_not_parsed(): + """Node output as raw JSON string is NOT parsed if output_schema is defined.""" + from pydantic import ValidationError + + class _MyModel(BaseModel): + name: str + age: int + + class _MyNode(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + # This should fail validation because it's a string, not a dict/model + yield '{"name": "Alice", "age": 30}' + + node = _MyNode(name='node', output_schema=_MyModel) + wf = Workflow(name='wf', edges=[(START, node)]) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='hello')], role='user') + + with pytest.raises(ValidationError): + async for _ in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + pass + + +@pytest.mark.asyncio +async def test_output_schema_enforced_by_runtime_without_manual_validation(): + """Runtime enforces output_schema even when _run_impl doesn't call _validate_output_data.""" + from pydantic import ValidationError + + class _MyModel(BaseModel): + name: str + age: int + + class _NaiveNode(BaseNode): + """Node that yields raw data without any manual validation.""" + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield {'color': 'red'} # Does NOT match _MyModel + + node = _NaiveNode(name='node', output_schema=_MyModel) + wf = Workflow(name='wf', edges=[(START, node)]) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='hello')], role='user') + + with pytest.raises(ValidationError): + async for _ in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + pass + + +@pytest.mark.asyncio +async def test_output_schema_enforced_for_valid_raw_yield(): + """Runtime validates and coerces valid raw yields against output_schema.""" + + class _MyModel(BaseModel): + name: str + age: int + + class _NaiveNode(BaseNode): + """Node that yields valid raw data without manual validation.""" + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + yield {'name': 'Alice', 'age': 30} + + node = _NaiveNode(name='node', output_schema=_MyModel) + wf = Workflow(name='wf', edges=[(START, node)]) + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=wf, session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + msg = types.Content(parts=[types.Part(text='hello')], role='user') + events = [] + + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + + data_events = [e for e in events if isinstance(e, Event) and e.output] + assert len(data_events) == 1 + assert data_events[0].output == {'name': 'Alice', 'age': 30} diff --git a/tests/unittests/workflow/testing_utils.py b/tests/unittests/workflow/testing_utils.py new file mode 100644 index 0000000000..c9894b1e86 --- /dev/null +++ b/tests/unittests/workflow/testing_utils.py @@ -0,0 +1,507 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import contextlib +import copy +from typing import Any +from typing import AsyncGenerator +from typing import Generator +from typing import Optional + +from google.adk.agents.context import Context as WorkflowContext +from google.adk.agents.invocation_context import InvocationContext as BaseInvocationContext +from google.adk.agents.live_request_queue import LiveRequestQueue +from google.adk.agents.llm_agent import Agent +from google.adk.agents.llm_agent import LlmAgent +from google.adk.agents.run_config import RunConfig +from google.adk.apps.app import App +from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService +from google.adk.events.event import Event +from google.adk.memory.in_memory_memory_service import InMemoryMemoryService +from google.adk.models.base_llm import BaseLlm +from google.adk.models.base_llm_connection import BaseLlmConnection +from google.adk.models.llm_request import LlmRequest +from google.adk.models.llm_response import LlmResponse +from google.adk.plugins.base_plugin import BasePlugin +from google.adk.plugins.plugin_manager import PluginManager +from google.adk.runners import InMemoryRunner as AfInMemoryRunner +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.sessions.session import Session +from google.adk.utils.context_utils import Aclosing +from google.genai import types +from google.genai.types import Part +from typing_extensions import override + + +def create_test_agent(name: str = 'test_agent') -> LlmAgent: + """Create a simple test agent for use in unit tests. + + Args: + name: The name of the test agent. + + Returns: + A configured LlmAgent instance suitable for testing. + """ + return LlmAgent(name=name) + + +class UserContent(types.Content): + + def __init__(self, text_or_part: str): + parts = [ + types.Part.from_text(text=text_or_part) + if isinstance(text_or_part, str) + else text_or_part + ] + super().__init__(role='user', parts=parts) + + +class ModelContent(types.Content): + + def __init__(self, parts: list[types.Part]): + super().__init__(role='model', parts=parts) + + +async def create_invocation_context( + agent: Agent, + user_content: str = '', + run_config: RunConfig = None, + plugins: list[BasePlugin] = [], +): + invocation_id = 'test_id' + artifact_service = InMemoryArtifactService() + session_service = InMemorySessionService() + memory_service = InMemoryMemoryService() + invocation_context = BaseInvocationContext( + artifact_service=artifact_service, + session_service=session_service, + memory_service=memory_service, + plugin_manager=PluginManager(plugins=plugins), + invocation_id=invocation_id, + agent=agent, + session=await session_service.create_session( + app_name='test_app', user_id='test_user' + ), + user_content=types.Content( + role='user', parts=[types.Part.from_text(text=user_content)] + ), + run_config=run_config or RunConfig(), + ) + if user_content: + append_user_content( + invocation_context, [types.Part.from_text(text=user_content)] + ) + return invocation_context + + +async def create_workflow_context( + agent, + user_content='', +) -> WorkflowContext: + """Create a WorkflowContext for isolated node testing. + + Constructs the minimal InvocationContext and wraps it in a + WorkflowContext so that individual nodes can be tested in + isolation without running the full _SingleLlmAgent pipeline. + """ + invocation_context = await create_invocation_context(agent, user_content) + return WorkflowContext( + invocation_context=invocation_context, + node_path='test', + run_id='test-execution', + ) + + +def append_user_content( + invocation_context: BaseInvocationContext, parts: list[types.Part] +) -> Event: + session = invocation_context.session + event = Event( + invocation_id=invocation_context.invocation_id, + author='user', + content=types.Content(role='user', parts=parts), + ) + session.events.append(event) + return event + + +# Extracts the contents from the events and transform them into a list of +# (author, simplified_content) tuples. +def simplify_events(events: list[Event]) -> list[tuple[str, types.Part]]: + res = [] + for event in events: + if event.content: + author = event.author + res.append((author, simplify_content(event.content))) + return res + + +END_OF_AGENT = 'end_of_agent' + + +# Extracts the contents from the events and transform them into a list of +# (author, simplified_content OR AgentState OR "end_of_agent") tuples. +# +# Could be used to compare events for testing resumability. +def simplify_resumable_app_events( + events: list[Event], +) -> list[(str, types.Part | str)]: + results = [] + for event in events: + if event.content: + results.append((event.author, simplify_content(event.content))) + elif event.actions.end_of_agent: + results.append((event.author, END_OF_AGENT)) + elif event.actions.agent_state is not None: + agent_state = event.actions.agent_state + if isinstance(agent_state, dict): + nodes = agent_state.get('nodes', {}) + agent_state = { + 'node_states': { + node_name: node_state.get('status') + for node_name, node_state in nodes.items() + } + } + results.append((event.author, agent_state)) + return results + + +# Simplifies the contents into a list of (author, simplified_content) tuples. +def simplify_contents(contents: list[types.Content]) -> list[(str, types.Part)]: + return [(content.role, simplify_content(content)) for content in contents] + + +# Simplifies the content so it's easier to assert. +# - If there is only one part, return part +# - If the only part is pure text, return stripped_text +# - If there are multiple parts, return parts +# - remove function_call_id if it exists +def simplify_content( + content: types.Content, +) -> str | types.Part | list[types.Part]: + content = copy.deepcopy(content) + for part in content.parts: + if part.function_call and part.function_call.id: + part.function_call.id = None + if part.function_response and part.function_response.id: + part.function_response.id = None + if len(content.parts) == 1: + if content.parts[0].text: + return content.parts[0].text.strip() + else: + return content.parts[0] + return content.parts + + +def get_user_content(message: types.ContentUnion) -> types.Content: + return message if isinstance(message, types.Content) else UserContent(message) + + +class TestInMemoryRunner(AfInMemoryRunner): + """InMemoryRunner that is tailored for tests, features async run method. + + app_name is hardcoded as InMemoryRunner in the parent class. + """ + + async def run_async_with_new_session( + self, new_message: types.ContentUnion + ) -> list[Event]: + + collected_events: list[Event] = [] + async for event in self.run_async_with_new_session_agen(new_message): + collected_events.append(event) + + return collected_events + + async def run_async_with_new_session_agen( + self, new_message: types.ContentUnion + ) -> AsyncGenerator[Event, None]: + session = await self.session_service.create_session( + app_name='InMemoryRunner', user_id='test_user' + ) + agen = self.run_async( + user_id=session.user_id, + session_id=session.id, + new_message=get_user_content(new_message), + ) + async with Aclosing(agen): + async for event in agen: + yield event + + +class InMemoryRunner: + """InMemoryRunner that is tailored for tests.""" + + def __init__( + self, + root_agent: Optional[Agent | LlmAgent] = None, + response_modalities: list[str] = None, + plugins: list[BasePlugin] = [], + app: Optional[App] = None, + node: Any = None, + ): + """Initializes the InMemoryRunner. + + Args: + root_agent: The root agent to run, won't be used if app is provided. + response_modalities: The response modalities of the runner. + plugins: The plugins to use in the runner, won't be used if app is + provided. + app: The app to use in the runner. + node: The root node to run. + """ + self._app = app + if node: + self.app_name = node.name + self.root_agent = None + self.runner = Runner( + node=node, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + plugins=plugins, + ) + elif not app: + self.app_name = 'test_app' + self.root_agent = root_agent + self.runner = Runner( + app_name='test_app', + agent=root_agent, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + plugins=plugins, + ) + else: + self.app_name = app.name + self.root_agent = app.root_agent + self.runner = Runner( + app=app, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + ) + self.session_id = None + + @property + def session(self) -> Session: + if not self.session_id: + session = self.runner.session_service.create_session_sync( + app_name=self.app_name, user_id='test_user' + ) + self.session_id = session.id + return session + return self.runner.session_service.get_session_sync( + app_name=self.app_name, user_id='test_user', session_id=self.session_id + ) + + def run(self, new_message: types.ContentUnion) -> list[Event]: + return list( + self.runner.run( + user_id=self.session.user_id, + session_id=self.session.id, + new_message=get_user_content(new_message), + ) + ) + + @property + def is_resumable(self) -> bool: + """Returns whether the app is configured for resumable HITL.""" + if hasattr(self, '_app') and self._app: + cfg = getattr(self._app, 'resumability_config', None) + return cfg is not None and cfg.is_resumable + return False + + async def run_async( + self, + new_message: Optional[types.ContentUnion] = None, + invocation_id: Optional[str] = None, + ) -> list[Event]: + # For non-resumable apps, don't reuse invocation_id on resume. + # State reconstruction relies on scanning events from *previous* + # invocations, so the resume call must get a fresh invocation_id. + if invocation_id and not self.is_resumable: + invocation_id = None + events = [] + async for event in self.runner.run_async( + user_id=self.session.user_id, + session_id=self.session.id, + invocation_id=invocation_id, + new_message=get_user_content(new_message) if new_message else None, + ): + events.append(event) + return events + + def run_live( + self, live_request_queue: LiveRequestQueue, run_config: RunConfig = None + ) -> list[Event]: + collected_responses = [] + + async def consume_responses(session: Session): + run_res = self.runner.run_live( + session=session, + live_request_queue=live_request_queue, + run_config=run_config or RunConfig(), + ) + + async for response in run_res: + collected_responses.append(response) + # When we have enough response, we should return + if len(collected_responses) >= 1: + return + + try: + session = self.session + asyncio.run(consume_responses(session)) + except asyncio.TimeoutError: + print('Returning any partial results collected so far.') + + return collected_responses + + +class MockModel(BaseLlm): + model: str = 'mock' + + requests: list[LlmRequest] = [] + live_blobs: list[types.Blob] = [] + live_contents: list[types.Content] = [] + responses: list[LlmResponse] + error: Exception | None = None + response_index: int = -1 + + # Whether the mock model should wait for realtime input (blobs or content) + # to be sent before yielding pre-defined responses in live mode. + wait_for_realtime_input: bool = False + + @classmethod + def create( + cls, + responses: ( + list[types.Part] + | list[LlmResponse] + | list[str] + | list[list[types.Part]] + ), + error: Exception | None = None, + wait_for_realtime_input: bool = False, + ): + if error and not responses: + return cls( + responses=[], + error=error, + wait_for_realtime_input=wait_for_realtime_input, + ) + if not responses: + return cls(responses=[], wait_for_realtime_input=wait_for_realtime_input) + elif isinstance(responses[0], LlmResponse): + # responses is list[LlmResponse] + return cls( + responses=responses, wait_for_realtime_input=wait_for_realtime_input + ) + else: + responses = [ + LlmResponse(content=ModelContent(item)) + if isinstance(item, list) and isinstance(item[0], types.Part) + # responses is list[list[Part]] + else LlmResponse( + content=ModelContent( + # responses is list[str] or list[Part] + [Part(text=item) if isinstance(item, str) else item] + ) + ) + for item in responses + if item + ] + + return cls( + responses=responses, wait_for_realtime_input=wait_for_realtime_input + ) + + @classmethod + @override + def supported_models(cls) -> list[str]: + return ['mock'] + + def generate_content( + self, llm_request: LlmRequest, stream: bool = False + ) -> Generator[LlmResponse, None, None]: + if self.error is not None: + raise self.error + # Increasement of the index has to happen before the yield. + self.response_index += 1 + self.requests.append(llm_request) + # yield LlmResponse(content=self.responses[self.response_index]) + yield self.responses[self.response_index] + + @override + async def generate_content_async( + self, llm_request: LlmRequest, stream: bool = False + ) -> AsyncGenerator[LlmResponse, None]: + if self.error is not None: + raise self.error + # Increasement of the index has to happen before the yield. + self.response_index += 1 + self.requests.append(llm_request) + yield self.responses[self.response_index] + + @contextlib.asynccontextmanager + async def connect(self, llm_request: LlmRequest) -> BaseLlmConnection: + """Creates a live connection to the LLM.""" + self.requests.append(llm_request) + yield MockLlmConnection( + self.responses, + self, + wait_for_realtime_input=self.wait_for_realtime_input, + ) + + +class MockLlmConnection(BaseLlmConnection): + + def __init__( + self, + llm_responses: list[LlmResponse], + mock_model: MockModel, + wait_for_realtime_input: bool = False, + ): + self.llm_responses = llm_responses + self.mock_model = mock_model + self.wait_for_realtime_input = wait_for_realtime_input + self._input_event = asyncio.Event() + + async def send_history(self, history: list[types.Content]): + pass + + async def send_content(self, content: types.Content): + self.mock_model.live_contents.append(content) + self._input_event.set() + + async def send(self, data): + pass + + async def send_realtime(self, blob: types.Blob): + self.mock_model.live_blobs.append(blob) + self._input_event.set() + + async def receive(self) -> AsyncGenerator[LlmResponse, None]: + """Yield each of the pre-defined LlmResponses.""" + if self.wait_for_realtime_input: + await self._input_event.wait() + + for response in self.llm_responses: + yield response + + async def close(self): + pass diff --git a/tests/unittests/workflow/utils/__init__.py b/tests/unittests/workflow/utils/__init__.py new file mode 100644 index 0000000000..58d482ea38 --- /dev/null +++ b/tests/unittests/workflow/utils/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/unittests/workflow/utils/test_rehydration_utils.py b/tests/unittests/workflow/utils/test_rehydration_utils.py new file mode 100644 index 0000000000..37405960db --- /dev/null +++ b/tests/unittests/workflow/utils/test_rehydration_utils.py @@ -0,0 +1,309 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.events.event import Event +from google.adk.events.event import NodeInfo +from google.adk.events.request_input import RequestInput +from google.adk.workflow.utils._rehydration_utils import _ChildScanState +from google.adk.workflow.utils._rehydration_utils import _reconstruct_node_states +from google.adk.workflow.utils._rehydration_utils import _unwrap_response +from google.adk.workflow.utils._rehydration_utils import _validate_resume_response +from google.adk.workflow.utils._rehydration_utils import _wrap_response +from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_event +from google.genai import types +from pydantic import BaseModel +import pytest + +# --- _wrap_response --- + + +class TestWrapResponse: + + def test_dict_returned_as_is(self): + d = {"foo": "bar"} + assert _wrap_response(d) is d + + def test_string_wrapped(self): + assert _wrap_response("hello") == {"result": "hello"} + + def test_int_wrapped(self): + assert _wrap_response(42) == {"result": 42} + + def test_none_wrapped(self): + assert _wrap_response(None) == {"result": None} + + def test_list_wrapped(self): + assert _wrap_response([1, 2]) == {"result": [1, 2]} + + +# --- _unwrap_response --- + + +class TestUnwrapResponse: + + def test_single_result_key_string(self): + assert _unwrap_response({"result": "hello"}) == "hello" + + def test_single_result_key_int(self): + assert _unwrap_response({"result": 42}) == 42 + + def test_single_result_key_none(self): + assert _unwrap_response({"result": None}) is None + + def test_dict_without_result_key_unchanged(self): + d = {"foo": "bar"} + assert _unwrap_response(d) == {"foo": "bar"} + + def test_dict_with_multiple_keys_unchanged(self): + d = {"result": "x", "other": "y"} + assert _unwrap_response(d) == {"result": "x", "other": "y"} + + def test_non_dict_unchanged(self): + assert _unwrap_response("hello") == "hello" + assert _unwrap_response(42) == 42 + assert _unwrap_response(None) is None + + def test_json_string_parsed_to_dict(self): + """Web frontend sends {"result": '{"approved": false}'}.""" + assert _unwrap_response({"result": '{"approved": false}'}) == { + "approved": False + } + + def test_json_string_parsed_to_list(self): + assert _unwrap_response({"result": "[1, 2, 3]"}) == [1, 2, 3] + + def test_json_string_parsed_to_number(self): + assert _unwrap_response({"result": "42"}) == 42 + + def test_json_string_parsed_to_bool(self): + assert _unwrap_response({"result": "true"}) is True + + def test_non_json_string_stays_string(self): + assert _unwrap_response({"result": "plain text"}) == "plain text" + + def test_roundtrip_wrap_unwrap_string(self): + assert _unwrap_response(_wrap_response("hello")) == "hello" + + def test_roundtrip_wrap_unwrap_dict(self): + """Dicts are not wrapped, so unwrap is a no-op.""" + d = {"foo": "bar"} + assert _unwrap_response(_wrap_response(d)) == d + + +# --- _validate_resume_response --- + + +class TestValidateResumeResponse: + + def test_none_schema_returns_data(self): + assert _validate_resume_response("hello", None) == "hello" + + def test_str_to_int_coercion(self): + assert _validate_resume_response("42", {"type": "integer"}) == 42 + + def test_str_to_float_coercion(self): + assert _validate_resume_response("42.5", {"type": "number"}) == 42.5 + + def test_str_to_bool_true(self): + assert _validate_resume_response("true", {"type": "boolean"}) is True + assert _validate_resume_response("1", {"type": "boolean"}) is True + + def test_str_to_bool_false(self): + assert _validate_resume_response("false", {"type": "boolean"}) is False + assert _validate_resume_response("0", {"type": "boolean"}) is False + + def test_invalid_coercion_raises_value_error(self): + with pytest.raises(ValueError): + _validate_resume_response("abc", {"type": "integer"}) + + def test_object_schema_validates_dict_type(self): + schema = {"type": "object"} + assert _validate_resume_response({"name": "Alice"}, schema) == { + "name": "Alice" + } + + with pytest.raises(ValueError, match="Failed to coerce data to object"): + _validate_resume_response("not a dict", schema) + + def test_array_schema_validates_list_type(self): + schema = {"type": "array"} + assert _validate_resume_response([1, 2], schema) == [1, 2] + + with pytest.raises(ValueError, match="Failed to coerce data to array"): + _validate_resume_response("not a list", schema) + + def test_pydantic_type_validation(self): + class User(BaseModel): + name: str + age: int + + assert _validate_resume_response( + {"name": "Alice", "age": 30}, User + ) == User(name="Alice", age=30) + + +# --- _reconstruct_node_states --- + + +class TestScanNodeEvents: + + def test_scan_empty_events(self): + results = _reconstruct_node_states([], "/wf@1", invocation_id="test_id") + assert results == {} + + def test_scan_direct_child_output(self): + event = Event( + node_info=NodeInfo(path="/wf@1/node_a@1"), + output="node_a output", + invocation_id="test_id", + ) + results = _reconstruct_node_states( + [event], "/wf@1", invocation_id="test_id", group_by_direct_child=True + ) + + assert "node_a@1" in results + assert results["node_a@1"].output == "node_a output" + assert results["node_a@1"].run_id == "1" + + def test_scan_message_as_output(self): + content = types.Content(parts=[types.Part(text="hello")]) + event = Event( + node_info=NodeInfo(path="/wf@1/node_a@1"), + content=content, + invocation_id="test_id", + ) + event.node_info.message_as_output = True + + results = _reconstruct_node_states( + [event], "/wf@1", invocation_id="test_id", group_by_direct_child=True + ) + + assert "node_a@1" in results + assert results["node_a@1"].output == content + + def test_scan_descendant_interrupts(self): + event = Event( + node_info=NodeInfo(path="/wf@1/node_a@1/sub_node@1"), + long_running_tool_ids={"interrupt-1"}, + invocation_id="test_id", + ) + results = _reconstruct_node_states( + [event], "/wf@1", invocation_id="test_id", group_by_direct_child=True + ) + + assert "node_a@1" in results + assert "interrupt-1" in results["node_a@1"].interrupt_ids + + def test_scan_resolve_interrupts(self): + event_int = Event( + node_info=NodeInfo(path="/wf@1/node_a@1"), + long_running_tool_ids={"interrupt-1"}, + invocation_id="test_id", + ) + event_fr = Event( + author="user", + content=types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + id="interrupt-1", + name="adk_request_input", + response={"result": "user answer"}, + ) + ) + ] + ), + invocation_id="test_id", + ) + + # Act + results = _reconstruct_node_states( + [event_int, event_fr], + "/wf@1", + invocation_id="test_id", + group_by_direct_child=True, + ) + + # Assert + assert "node_a@1" in results + assert "interrupt-1" in results["node_a@1"].resolved_ids + assert ( + results["node_a@1"].resolved_responses["interrupt-1"] == "user answer" + ) + + def test_scan_matches_specific_node_path_without_child_grouping(self): + """Scanning matches events for a specific node path when not grouping by direct child.""" + event = Event( + node_info=NodeInfo(path="/wf@1/node_a@1"), + output="node_a output", + invocation_id="test_id", + ) + + # Act + results = _reconstruct_node_states( + [event], + "/wf@1/node_a@1", + invocation_id="test_id", + group_by_direct_child=False, + ) + + # Assert + assert "/wf@1/node_a@1" in results + assert results["/wf@1/node_a@1"].output == "node_a output" + + def test_scan_validates_and_coerces_response_against_schema(self): + """Scanning validates and coerces user response data against the provided schema.""" + + class MySchema(BaseModel): + count: int + + ri = RequestInput( + interrupt_id="interrupt-1", + response_schema=MySchema, + ) + event_int = create_request_input_event(ri) + event_int.node_info = NodeInfo(path="/wf@1/node_a@1") + event_int.invocation_id = "test_id" + + event_fr = Event( + author="user", + content=types.Content( + parts=[ + types.Part( + function_response=types.FunctionResponse( + id="interrupt-1", + name="adk_request_input", + response={"result": '{"count": "42"}'}, + ) + ) + ] + ), + invocation_id="test_id", + ) + + # Act + results = _reconstruct_node_states( + [event_int, event_fr], + "/wf@1", + invocation_id="test_id", + group_by_direct_child=True, + ) + + # Assert + assert "node_a@1" in results + assert results["node_a@1"].resolved_responses["interrupt-1"] == { + "count": 42 + } diff --git a/tests/unittests/workflow/utils/test_replay_interceptor.py b/tests/unittests/workflow/utils/test_replay_interceptor.py new file mode 100644 index 0000000000..edd9a737b0 --- /dev/null +++ b/tests/unittests/workflow/utils/test_replay_interceptor.py @@ -0,0 +1,209 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for ReplayInterceptor. + +Verifies that ReplayInterceptor correctly checks and manages workflow resumption +replay interception. +""" + +from unittest.mock import MagicMock + +from google.adk.agents.context import Context +from google.adk.workflow._base_node import BaseNode +from google.adk.workflow._dynamic_node_scheduler import DynamicNodeRun +from google.adk.workflow._node_state import NodeState +from google.adk.workflow._node_status import NodeStatus +from google.adk.workflow.utils._rehydration_utils import _ChildScanState +from google.adk.workflow.utils._replay_interceptor import check_interception +import pytest + + +def _make_parent_ctx(): + ctx = MagicMock(spec=Context) + ctx._invocation_context = MagicMock() + ctx.resume_inputs = {} + return ctx + + +def test_same_turn_completed(): + """Same-turn completed run intercepts and returns cached output.""" + # Given a same-turn completed run + run = DynamicNodeRun( + state=NodeState(status=NodeStatus.COMPLETED), + output='cached-out', + transfer_to_agent='target-agent', + ) + ctx = _make_parent_ctx() + + # When checked + result = check_interception( + node_path='wf/node@1', + node=BaseNode(name='node'), + current_run=run, + curr_parent_ctx=ctx, + ) + + # Then it intercepts with cached results + assert not result.should_run + assert result.output == 'cached-out' + assert result.transfer_to_agent == 'target-agent' + + +def test_same_turn_waiting(): + """Same-turn waiting run intercepts and returns unresolved interrupts.""" + # Given a same-turn waiting run + run = DynamicNodeRun( + state=NodeState(status=NodeStatus.WAITING, interrupts=['fc-1']), + ) + ctx = _make_parent_ctx() + + # When checked + result = check_interception( + node_path='wf/node@1', + node=BaseNode(name='node'), + current_run=run, + curr_parent_ctx=ctx, + ) + + # Then it intercepts and keeps waiting + assert not result.should_run + assert result.interrupts == {'fc-1'} + + +def test_cross_turn_unresolved_interrupts_no_rerun(): + """Cross-turn unresolved interrupts keep waiting without rerun.""" + # Given unresolved interrupts and node without rerun_on_resume + recovered = _ChildScanState( + run_id='1', + interrupt_ids={'fc-1', 'fc-2'}, + resolved_ids={'fc-1'}, + ) + node = BaseNode(name='node', rerun_on_resume=False) + ctx = _make_parent_ctx() + + # When checked + result = check_interception( + node_path='wf/node@1', + node=node, + recovered=recovered, + curr_parent_ctx=ctx, + ) + + # Then it stays waiting on unresolved interrupts + assert not result.should_run + assert result.interrupts == {'fc-2'} + + +def test_cross_turn_unresolved_interrupts_rerun(): + """Cross-turn unresolved interrupts with rerun resolves progress and reruns.""" + # Given unresolved interrupts and node with rerun_on_resume + recovered = _ChildScanState( + run_id='1', + interrupt_ids={'fc-1', 'fc-2'}, + resolved_ids={'fc-1'}, + resolved_responses={'fc-1': 'ans'}, + ) + node = BaseNode(name='node', rerun_on_resume=True) + ctx = _make_parent_ctx() + + # When checked + result = check_interception( + node_path='wf/node@1', + node=node, + recovered=recovered, + curr_parent_ctx=ctx, + ) + + # Then it reruns with partial resolved inputs + assert result.should_run + assert result.resume_inputs == {'fc-1': 'ans'} + + +def test_cross_turn_completed(): + """Cross-turn completed run fast-forwards output and route.""" + # Given a completed run from history + recovered = _ChildScanState( + run_id='1', + output='past-out', + route='route-a', + ) + node = BaseNode(name='node') + ctx = _make_parent_ctx() + + # When checked + result = check_interception( + node_path='wf/node@1', + node=node, + recovered=recovered, + curr_parent_ctx=ctx, + ) + + # Then it fast-forwards with cached output and route + assert not result.should_run + assert result.output == 'past-out' + assert result.route == 'route-a' + + +def test_cross_turn_all_resolved_no_rerun(): + """Cross-turn all resolved run without rerun auto-completes with responses.""" + # Given all resolved interrupts and node without rerun_on_resume + recovered = _ChildScanState( + run_id='1', + interrupt_ids={'fc-1'}, + resolved_ids={'fc-1'}, + resolved_responses={'fc-1': 'ans'}, + ) + node = BaseNode(name='node', rerun_on_resume=False) + ctx = _make_parent_ctx() + ctx.resume_inputs = { + 'fc-1': {'result': 'ans'} + } # Simulate FunctionResponse dict + + # When checked + result = check_interception( + node_path='wf/node@1', + node=node, + recovered=recovered, + curr_parent_ctx=ctx, + ) + + # Then it auto-completes + assert not result.should_run + assert result.output == 'ans' + + +def test_cross_turn_all_resolved_rerun(): + """Cross-turn all resolved run with rerun triggers rerun with responses.""" + # Given all resolved interrupts and node with rerun_on_resume + recovered = _ChildScanState( + run_id='1', + interrupt_ids={'fc-1'}, + resolved_ids={'fc-1'}, + resolved_responses={'fc-1': 'ans'}, + ) + node = BaseNode(name='node', rerun_on_resume=True) + ctx = _make_parent_ctx() + + # When checked + result = check_interception( + node_path='wf/node@1', + node=node, + recovered=recovered, + curr_parent_ctx=ctx, + ) + + # Then it reruns + assert result.should_run + assert result.resume_inputs == {'fc-1': 'ans'} diff --git a/tests/unittests/workflow/utils/test_replay_sequence_barrier.py b/tests/unittests/workflow/utils/test_replay_sequence_barrier.py new file mode 100644 index 0000000000..2cb9008e2d --- /dev/null +++ b/tests/unittests/workflow/utils/test_replay_sequence_barrier.py @@ -0,0 +1,96 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for ReplaySequenceBarrier.""" + +from __future__ import annotations + +import asyncio + +from google.adk.workflow.utils._replay_sequence_barrier import ReplaySequenceBarrier +import pytest + + +@pytest.mark.asyncio +async def test_barrier_initialization(): + """Verifies that barrier initializes sequence index and sets the first event.""" + # Given a chronological sequence of completions + sequence = ['NodeA@1', 'NodeB@1'] + + # When barrier is created + barrier = ReplaySequenceBarrier(sequence) + + # Then state is correctly set + assert barrier.sequence == sequence + assert barrier.current_index == 0 + assert len(barrier.events) == 2 + assert barrier.events['NodeA@1'].is_set() + assert not barrier.events['NodeB@1'].is_set() + + +@pytest.mark.asyncio +async def test_barrier_wait_blocks_and_unblocks(): + """Verifies that wait blocks on subsequent keys and is unblocked by advance.""" + sequence = ['NodeA@1', 'NodeB@1'] + barrier = ReplaySequenceBarrier(sequence) + + # When first key waits, it completes instantly + await barrier.wait('NodeA@1') + + # When second key waits, it blocks + b_completed = False + + async def wait_b(): + nonlocal b_completed + await barrier.wait('NodeB@1') + b_completed = True + + task = asyncio.create_task(wait_b()) + await asyncio.sleep(0.05) + assert not b_completed # Still blocked + + # When first key advances the sequence + barrier.check_and_advance('NodeA@1') + + # Then index progresses and second event is released + await task + assert b_completed + assert barrier.current_index == 1 + assert barrier.events['NodeB@1'].is_set() + + +def test_barrier_advance_out_of_order_ignored(): + """Verifies that out-of-order advance calls are ignored and do not progress index.""" + sequence = ['NodeA@1', 'NodeB@1'] + barrier = ReplaySequenceBarrier(sequence) + + # When second key tries to advance out of order + barrier.check_and_advance('NodeB@1') + + # Then state remains unchanged + assert barrier.current_index == 0 + assert not barrier.events['NodeB@1'].is_set() + + +@pytest.mark.asyncio +async def test_barrier_wait_non_existent_key(): + """Verifies that waiting on a key not in sequence does not block.""" + sequence = ['NodeA@1'] + barrier = ReplaySequenceBarrier(sequence) + + # When a key not in sequence waits, it passes instantly + await barrier.wait('NonExistent@1') + + # No blocks, successfully completes! + assert True diff --git a/tests/unittests/workflow/utils/test_retry_utils.py b/tests/unittests/workflow/utils/test_retry_utils.py new file mode 100644 index 0000000000..3685139c42 --- /dev/null +++ b/tests/unittests/workflow/utils/test_retry_utils.py @@ -0,0 +1,70 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.workflow._node_state import NodeState +from google.adk.workflow._retry_config import RetryConfig +from google.adk.workflow.utils._retry_utils import _get_retry_delay +import pytest + + +class TestGetRetryDelay: + + def test_returns_default_delay_without_config(self): + """Returns default delay of 1.0 second when config is missing.""" + state = NodeState(attempt_count=1) + + result = _get_retry_delay(None, state) + + assert result == 1.0 + + def test_returns_initial_delay_on_first_failure(self): + """Returns initial delay on the first failure attempt.""" + config = RetryConfig(initial_delay=2.0, jitter=0.0) + state = NodeState(attempt_count=1) + + result = _get_retry_delay(config, state) + + assert result == 2.0 + + def test_applies_exponential_backoff(self): + """Applies exponential backoff for subsequent attempts.""" + config = RetryConfig(initial_delay=2.0, backoff_factor=2.0, jitter=0.0) + state = NodeState(attempt_count=2) + + result = _get_retry_delay(config, state) + + assert result == 4.0 + + def test_caps_at_max_delay(self): + """Caps calculated delay at the specified maximum delay.""" + config = RetryConfig( + initial_delay=2.0, backoff_factor=10.0, max_delay=15.0, jitter=0.0 + ) + state = NodeState(attempt_count=2) + + result = _get_retry_delay(config, state) + + assert result == 15.0 + + def test_adds_jitter_when_enabled(self): + """Adds random jitter to the calculated delay.""" + config = RetryConfig(initial_delay=10.0, backoff_factor=1.0, jitter=0.5) + state = NodeState(attempt_count=1) + + delays = [_get_retry_delay(config, state) for _ in range(10)] + + assert all(5.0 <= d <= 15.0 for d in delays) + assert len(set(delays)) > 1 diff --git a/tests/unittests/workflow/utils/test_transfer_utils.py b/tests/unittests/workflow/utils/test_transfer_utils.py new file mode 100644 index 0000000000..4fa6278da0 --- /dev/null +++ b/tests/unittests/workflow/utils/test_transfer_utils.py @@ -0,0 +1,188 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for agent transfer utilities.""" + +from __future__ import annotations + +from unittest.mock import MagicMock + +from google.adk.agents.llm_agent import LlmAgent +from google.adk.workflow.utils._transfer_utils import resolve_and_derive_transfer_context +import pytest + + +def test_resolve_and_derive_transfer_context_raises_value_error_on_self_transfer(): + """resolve_and_derive_transfer_context raises ValueError when target is the current agent.""" + # Arrange + current = LlmAgent(name='current') + root = LlmAgent(name='root', sub_agents=[current]) + + # Act & Assert + with pytest.raises(ValueError, match='cannot transfer to itself'): + resolve_and_derive_transfer_context( + 'current', current, root, MagicMock(), None + ) + + +def test_resolve_and_derive_transfer_context_returns_child_context(): + """resolve_and_derive_transfer_context returns current context as parent context for CHILD transfers.""" + # Arrange + target = LlmAgent(name='target') + current = LlmAgent(name='current', sub_agents=[target]) + root = LlmAgent(name='root', sub_agents=[current]) + + curr_ctx = MagicMock() + + # Act + resolved_agent, parent_ctx = resolve_and_derive_transfer_context( + 'target', current, root, curr_ctx, None + ) + + # Assert + assert resolved_agent is target + assert parent_ctx is curr_ctx + + +def test_resolve_and_derive_transfer_context_returns_sibling_context(): + """resolve_and_derive_transfer_context returns parent context for SIBLING transfers.""" + # Arrange + current = LlmAgent(name='current') + target = LlmAgent(name='target') + root = LlmAgent(name='root', sub_agents=[current, target]) + + parent_ctx = MagicMock() + + # Act + resolved_agent, derived_ctx = resolve_and_derive_transfer_context( + 'target', current, root, MagicMock(), parent_ctx + ) + + # Assert + assert resolved_agent is target + assert derived_ctx is parent_ctx + + +def test_resolve_and_derive_transfer_context_climbs_parent_context(): + """resolve_and_derive_transfer_context climbs context chain to find the target parent's parent context.""" + # Arrange + root_ctx = MagicMock() + root_ctx.node = MagicMock() + root_ctx.node.name = 'root' + root_ctx.parent_ctx = MagicMock() + root_ctx.parent_ctx.node = None + root_ctx.parent_ctx.parent_ctx = None + + child_ctx = MagicMock() + child_ctx.node = MagicMock() + child_ctx.node.name = 'child' + child_ctx.parent_ctx = root_ctx + + # Target is 'root', current is 'child' + child = LlmAgent(name='child') + root = LlmAgent(name='root', sub_agents=[child]) + child.parent_agent = root + + # Act + resolved_agent, derived_ctx = resolve_and_derive_transfer_context( + 'root', child, root, child_ctx, None + ) + + # Assert + assert resolved_agent is root + assert derived_ctx is root_ctx.parent_ctx + + +def test_resolve_and_derive_transfer_context_returns_root_context_when_parent_bypassed(): + """resolve_and_derive_transfer_context returns root context for PARENT transfers when parent was bypassed.""" + # Arrange + root_ctx = MagicMock() + root_ctx.node = None + root_ctx.parent_ctx = None + + child_ctx = MagicMock() + child_ctx.node = MagicMock() + child_ctx.node.name = 'child' + child_ctx.parent_ctx = root_ctx + + # Target is 'root', current is 'child' + child = LlmAgent(name='child') + root = LlmAgent(name='root', sub_agents=[child]) + child.parent_agent = root + + # Act + resolved_agent, derived_ctx = resolve_and_derive_transfer_context( + 'root', child, root, child_ctx, None + ) + + # Assert + assert resolved_agent is root + assert derived_ctx is root_ctx + + +def test_resolve_and_derive_transfer_context_returns_none_when_agent_not_found(): + """resolve_and_derive_transfer_context returns (None, None) when target agent is not found.""" + # Arrange + current = LlmAgent(name='current') + root = LlmAgent(name='root', sub_agents=[current]) + + # Act + resolved_agent, derived_ctx = resolve_and_derive_transfer_context( + 'target', current, root, MagicMock(), None + ) + + # Assert + assert resolved_agent is None + assert derived_ctx is None + + +def test_resolve_and_derive_transfer_context_returns_target_and_none_when_no_relationship(): + """resolve_and_derive_transfer_context returns (target_agent, None) for unrelated transfers.""" + # Arrange + current = LlmAgent(name='current') + target = LlmAgent(name='target') + root1 = LlmAgent(name='root1', sub_agents=[current]) + root2 = LlmAgent(name='root2', sub_agents=[target]) + + # Act + resolved_agent, derived_ctx = resolve_and_derive_transfer_context( + 'target', current, root2, MagicMock(), None + ) + + # Assert + assert resolved_agent is target + assert derived_ctx is None + + +def test_resolve_and_derive_transfer_context_works_with_cloned_agents(): + """resolve_and_derive_transfer_context works correctly when the current agent is cloned (name-based matching).""" + # Arrange + target = LlmAgent(name='target') + current = LlmAgent(name='current', sub_agents=[target]) + root = LlmAgent(name='root', sub_agents=[current]) + + cloned_current = current.clone() + assert cloned_current is not current + assert cloned_current.name == current.name + + curr_ctx = MagicMock() + + # Act + resolved_agent, derived_ctx = resolve_and_derive_transfer_context( + 'target', cloned_current, root, curr_ctx, None + ) + + # Assert + assert resolved_agent is target + assert derived_ctx is curr_ctx diff --git a/tests/unittests/workflow/utils/test_workflow_graph_utils.py b/tests/unittests/workflow/utils/test_workflow_graph_utils.py new file mode 100644 index 0000000000..f4c2c81318 --- /dev/null +++ b/tests/unittests/workflow/utils/test_workflow_graph_utils.py @@ -0,0 +1,119 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.tools.base_tool import BaseTool +from google.adk.workflow._base_node import BaseNode +from google.adk.workflow._base_node import START +from google.adk.workflow._function_node import FunctionNode +from google.adk.workflow._tool_node import _ToolNode +from google.adk.workflow.utils._workflow_graph_utils import build_node +from google.adk.workflow.utils._workflow_graph_utils import is_node_like +import pytest + + +class TestIsNodeLike: + + def test_returns_true_for_base_node(self): + """is_node_like returns True for BaseNode instances.""" + + class DummyNode(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield node_input + + node = DummyNode(name="test") + + assert is_node_like(node) is True + + def test_returns_true_for_base_tool(self): + """is_node_like returns True for BaseTool instances.""" + + class DummyTool(BaseTool): + + def execute(self, **kwargs): + return "done" + + tool = DummyTool(name="test", description="test") + + assert is_node_like(tool) is True + + def test_returns_true_for_callable(self): + """is_node_like returns True for callables.""" + + def my_func(): + pass + + assert is_node_like(my_func) is True + + def test_returns_true_for_start_string(self): + """is_node_like returns True for 'START' string.""" + assert is_node_like("START") is True + + def test_returns_false_for_invalid_types(self): + """is_node_like returns False for invalid types.""" + assert is_node_like(123) is False + assert is_node_like("NOT_START") is False + + +class TestBuildNode: + + def test_returns_start_when_node_like_is_start(self): + """build_node returns START sentinel when input is 'START'.""" + assert build_node("START") == START + + def test_returns_copy_of_base_node_with_overrides(self): + """build_node returns a copy of BaseNode with provided overrides.""" + + class DummyNode(BaseNode): + + async def _run_impl(self, *, ctx, node_input): + yield node_input + + node = DummyNode(name="original") + + built = build_node(node, name="new_name") + + assert built != node + assert built.name == "new_name" + + def test_returns_tool_node_for_base_tool(self): + """build_node wraps BaseTool in a _ToolNode.""" + + class DummyTool(BaseTool): + + def execute(self, **kwargs): + return "done" + + tool = DummyTool(name="test", description="test") + + built = build_node(tool) + + assert isinstance(built, _ToolNode) + + def test_returns_function_node_for_callable(self): + """build_node wraps callable in a FunctionNode.""" + + def my_func(x): + return x + + built = build_node(my_func) + + assert isinstance(built, FunctionNode) + + def test_raises_value_error_for_invalid_type(self): + """build_node raises ValueError for invalid types.""" + with pytest.raises(ValueError, match="Invalid node type"): + build_node(123) diff --git a/tests/unittests/workflow/utils/test_workflow_hitl_utils.py b/tests/unittests/workflow/utils/test_workflow_hitl_utils.py new file mode 100644 index 0000000000..fcccb4e75a --- /dev/null +++ b/tests/unittests/workflow/utils/test_workflow_hitl_utils.py @@ -0,0 +1,175 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.events.event import Event +from google.adk.events.event import NodeInfo +from google.adk.events.request_input import RequestInput +from google.adk.workflow.utils._rehydration_utils import _ChildScanState +from google.adk.workflow.utils._workflow_hitl_utils import create_auth_request_event +from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_event +from google.adk.workflow.utils._workflow_hitl_utils import create_request_input_response +from google.adk.workflow.utils._workflow_hitl_utils import get_request_input_interrupt_ids +from google.adk.workflow.utils._workflow_hitl_utils import has_request_input_function_call +from google.adk.workflow.utils._workflow_hitl_utils import REQUEST_CREDENTIAL_FUNCTION_CALL_NAME +from google.genai import types + +# --- create_request_input_event --- + + +class TestCreateRequestInputEvent: + + def test_basic_event(self): + ri = RequestInput( + interrupt_id="test-id", + message="Please approve", + ) + event = create_request_input_event(ri) + + assert event.long_running_tool_ids == {"test-id"} + assert event.content is not None + fc = event.content.parts[0].function_call + assert fc.name == "adk_request_input" + assert fc.id == "test-id" + assert fc.args["message"] == "Please approve" + + def test_with_payload(self): + ri = RequestInput( + interrupt_id="id-1", + payload={"key": "value"}, + ) + event = create_request_input_event(ri) + fc = event.content.parts[0].function_call + assert fc.args["payload"] == {"key": "value"} + + def test_with_response_schema(self): + from pydantic import BaseModel + + class MySchema(BaseModel): + approved: bool + + ri = RequestInput( + interrupt_id="id-2", + response_schema=MySchema, + ) + event = create_request_input_event(ri) + fc = event.content.parts[0].function_call + schema = fc.args["response_schema"] + assert "approved" in schema["properties"] + assert schema["properties"]["approved"]["type"] == "boolean" + + +# --- has_request_input_function_call --- + + +class TestHasRequestInputFunctionCall: + + def test_true_for_request_input_event(self): + event = create_request_input_event( + RequestInput(interrupt_id="id-1", message="test") + ) + assert has_request_input_function_call(event) is True + + def test_false_for_empty_event(self): + assert has_request_input_function_call(Event()) is False + + def test_false_for_non_request_input(self): + from google.genai import types + + event = Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall(name="other_tool", args={}) + ) + ] + ) + ) + assert has_request_input_function_call(event) is False + + +# --- create_request_input_response --- + + +class TestCreateRequestInputResponse: + + def test_creates_function_response_part(self): + part = create_request_input_response("id-1", {"approved": True}) + assert part.function_response.id == "id-1" + assert part.function_response.name == "adk_request_input" + assert part.function_response.response == {"approved": True} + + +# --- get_request_input_interrupt_ids --- + + +class TestGetRequestInputInterruptIds: + + def test_extracts_ids(self): + event = create_request_input_event( + RequestInput(interrupt_id="id-1", message="test") + ) + assert get_request_input_interrupt_ids(event) == ["id-1"] + + def test_empty_for_no_function_calls(self): + assert get_request_input_interrupt_ids(Event()) == [] + + def test_empty_for_non_request_input(self): + from google.genai import types + + event = Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name="other_tool", args={}, id="id-1" + ) + ) + ] + ) + ) + assert get_request_input_interrupt_ids(event) == [] + + +# --- create_auth_request_event --- + + +class TestCreateAuthRequestEvent: + + def test_creates_credential_request(self): + from fastapi.openapi.models import APIKey + from fastapi.openapi.models import APIKeyIn + from google.adk.auth.auth_credential import AuthCredential + from google.adk.auth.auth_credential import AuthCredentialTypes + from google.adk.auth.auth_tool import AuthConfig + + auth_config = AuthConfig( + auth_scheme=APIKey(**{"in": APIKeyIn.header, "name": "X-Api-Key"}), + raw_auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.API_KEY, + api_key="test_key", + ), + credential_key="test_cred", + ) + event = create_auth_request_event(auth_config, "auth-id-1") + + assert event.long_running_tool_ids is not None + fc = event.content.parts[0].function_call + assert fc.name == REQUEST_CREDENTIAL_FUNCTION_CALL_NAME + assert fc.id == "auth-id-1" + assert "authConfig" in fc.args + + +# diff --git a/tests/unittests/workflow/workflow_testing_utils.py b/tests/unittests/workflow/workflow_testing_utils.py new file mode 100644 index 0000000000..6163609f1a --- /dev/null +++ b/tests/unittests/workflow/workflow_testing_utils.py @@ -0,0 +1,399 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Testing utils for the Workflow.""" + +import copy +import inspect +from typing import Any +from typing import AsyncGenerator +from typing import Callable +from typing import List +from typing import Optional + +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.context import Context +from google.adk.agents.invocation_context import InvocationContext +from google.adk.agents.invocation_context import InvocationContext as BaseInvocationContext +from google.adk.apps.app import ResumabilityConfig +from google.adk.events.event import Event +from google.adk.events.request_input import RequestInput +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.workflow import BaseNode +from google.adk.workflow._graph import RouteValue +from google.adk.workflow.utils._workflow_hitl_utils import has_auth_request_function_call +from google.adk.workflow.utils._workflow_hitl_utils import has_request_input_function_call +from google.genai import types +from pydantic import ConfigDict +from pydantic import Field +from typing_extensions import override + +from .testing_utils import END_OF_AGENT +from .testing_utils import simplify_content + + +async def run_workflow(wf, message='start'): + """Run a Workflow through Runner, return collected events.""" + ss = InMemorySessionService() + runner = Runner(app_name=wf.name, node=wf, session_service=ss) + session = await ss.create_session(app_name=wf.name, user_id='u') + msg = types.Content(parts=[types.Part(text=message)], role='user') + events = [] + async for event in runner.run_async( + user_id='u', session_id=session.id, new_message=msg + ): + events.append(event) + return events, ss, session + + +# Emulates a node that outputs an Event & a route. +# If output is not None, the output is set as the data field in the event. +# If route is not None, the route is set in the node output event. +# The route can be set without the output. This means didn't produce any output +# but wants to signal a route to take. +class TestingNode(BaseNode): + model_config = ConfigDict(arbitrary_types_allowed=True) + + output: Optional[Any] = None + route: ( + RouteValue | list[RouteValue] | Callable[[Context, Any], Any] | None + ) = None + received_inputs: List[Any] = Field(default_factory=list) + + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + if self.output is not None or self.route is not None: + route = None + if callable(self.route): + if inspect.iscoroutinefunction(self.route): + route = await self.route(ctx, node_input) + else: + route = self.route(ctx, node_input) + else: + route = self.route + + self.received_inputs.append(node_input) + yield Event( + output=self.output, + route=route, + ) + + +class TestingNodeWithIntermediateContent(BaseNode): + model_config = ConfigDict(arbitrary_types_allowed=True) + + intermediate_content: list[types.Content] = Field(default_factory=list) + output: Optional[Any] = None + route: Optional[str] = None + + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + for content in self.intermediate_content: + yield Event( + author=self.name, + invocation_id=ctx.invocation_id, + content=content, + ) + + if self.output is not None: + yield Event( + output=self.output, + route=self.route, + ) + + +class InputCapturingNode(BaseNode): + """A node that captures the inputs it receives.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + received_inputs: List[Any] = Field(default_factory=list) + + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + self.received_inputs.append(node_input) + yield Event( + output={'received': node_input}, + ) + + +class RequestInputNode(BaseNode): + """A simple node that requests input from the user.""" + + model_config = ConfigDict(arbitrary_types_allowed=True) + + message: str = Field(default='') + response_schema: Optional[dict[str, Any]] = None + + @override + async def _run_impl( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + yield RequestInput( + message=self.message, + response_schema=self.response_schema, + ) + + +async def create_parent_invocation_context( + test_name: str, agent: BaseAgent, resumable: bool = False +) -> InvocationContext: + session_service = InMemorySessionService() + session = await session_service.create_session( + app_name='test_app', user_id='test_user' + ) + return InvocationContext( + invocation_id=f'{test_name}_invocation_id', + agent=agent, + session=session, + session_service=session_service, + resumability_config=ResumabilityConfig(is_resumable=resumable), + ) + + +def simplify_event_with_node( + event: Event, + include_state_delta: bool = False, +) -> Any | None: + if isinstance(event, Event): + if ( + 'output' not in event.model_fields_set + and not (include_state_delta and event.actions.state_delta) + and not event.content + ): + return None + + # If the event has content, return the simplified content. + if event.content: + return simplify_content(event.content) + + simplified_event = {} + + # Also simplify event.output if it contains Content. + # The tests assume that Content found in event data should be simplified + # (IDs stripped) just like event.content. This ensures consistent + # assertion behavior. + output = event.output + if isinstance(output, types.Content): + output = copy.deepcopy(output) + for part in output.parts: + if part.function_call and part.function_call.id: + part.function_call.id = None + if part.function_response and part.function_response.id: + part.function_response.id = None + simplified_event['output'] = output + + if include_state_delta and event.actions.state_delta: + simplified_event['state_delta'] = event.actions.state_delta + + return simplified_event + elif event.content: + return simplify_content(event.content) + + +def simplify_events_with_node( + events: list[Event], + *, + include_state_delta: bool = False, + include_workflow_output: bool = False, +) -> list[tuple[str, Any]]: + results = [] + + # Second pass: Simplify events + for event in events: + # Optionally skip top-level workflow output events (events emitted + # by the Workflow in _finalize_workflow). These events have a + # top-level node_path (no '/' separator) and carry output data. + if ( + not include_workflow_output + and isinstance(event, Event) + and event.output is not None + and '/' not in (event.node_info.path or '') + ): + continue + + simplified_event = simplify_event_with_node(event, include_state_delta) + if simplified_event: + # Map the author to the source node name if it exists. + if hasattr(event, 'node_info') and event.node_info.path: + author = event.node_info.path + else: + author = event.author + results.append((author, simplified_event)) + return results + + +def simplify_events_with_node_and_agent_state( + events: list[Event], + *, + include_state_delta: bool = False, + include_inputs_and_triggers: bool = False, + include_resume_inputs: bool = False, + include_workflow_output: bool = False, +): + fields_to_exclude = {'run_id'} + if not include_inputs_and_triggers: + fields_to_exclude.add('input') + if not include_resume_inputs: + fields_to_exclude.add('resume_inputs') + + results = [] + + for event in events: + # Optionally skip top-level workflow output events. + if ( + not include_workflow_output + and isinstance(event, Event) + and event.output is not None + and '/' not in (event.node_info.path or '') + ): + continue + simplified_event = simplify_event_with_node(event, include_state_delta) + + # Map the author to the source node name if it exists. + if hasattr(event, 'node_info') and event.node_info.path: + author = event.node_info.path + else: + author = event.author + + if simplified_event: + results.append((author, simplified_event)) + elif event.actions.end_of_agent: + results.append((author, END_OF_AGENT)) + elif event.actions.agent_state is not None: + agent_state = event.actions.agent_state + nodes = agent_state.get('nodes', {}) + simplified_nodes = {} + for node_name, node_state in nodes.items(): + simplified_nodes[node_name] = { + k: v + for k, v in node_state.items() + if k not in fields_to_exclude + and (k != 'interrupts' or v) # Exclude empty interrupts + and (k != 'resume_inputs' or v) # Exclude empty resume_inputs + } + results.append((author, {'nodes': simplified_nodes})) + return results + + +def get_request_input_events(events: list[Any]) -> list[Any]: + """Returns a list of request input events from the given list of events.""" + return [e for e in events if has_request_input_function_call(e)] + + +def get_auth_request_events(events: list[Any]) -> list[Any]: + """Returns a list of auth credential request events from the given list.""" + return [e for e in events if has_auth_request_function_call(e)] + + +def get_output_events(events: list[Any], output: Any = None) -> list[Any]: + """Returns a list of events that have output populated.""" + return [ + e + for e in events + if isinstance(e, Event) + and e.output is not None + and (output is None or e.output == output) + ] + + +def get_outputs(events: list[Event]) -> list[Any]: + """Extracts output values from events, skipping non-output events.""" + return [ + e.output for e in events if isinstance(e, Event) and e.output is not None + ] + + +def strip_checkpoint_events( + simplified_events: list[tuple[str, Any]], +) -> list[tuple[str, Any]]: + """Strips agent_state checkpoint and end_of_agent events. + + In non-resumable mode, the workflow does not emit checkpoint events + or end_of_agent events. Use this to derive the expected simplified + output for non-resumable tests from the resumable expected output. + """ + return [ + (author, data) + for author, data in simplified_events + if not (isinstance(data, dict) and 'nodes' in data) + and data != END_OF_AGENT + ] + + +def find_function_call_event( + events: list[Any], name: str | None = None +) -> Any | None: + """Finds the first event containing a function call.""" + for e in events: + if hasattr(e, 'content') and e.content and e.content.parts: + for part in e.content.parts: + if part.function_call: + if name is None or part.function_call.name == name: + return e + return None + + +class CustomRetryableError(Exception): + """A custom error meant to be retried.""" + + +class CustomNonRetryableError(Exception): + """A custom error not meant to be retried.""" + + +class _FlakyNode(BaseNode): + model_config = ConfigDict(arbitrary_types_allowed=True) + + message: str = Field(default='') + succeed_on_iteration: int = Field(default=0) + tracker: dict[str, Any] = Field(default_factory=dict) + exception_to_raise: Exception = Field(...) + + @override + async def run( + self, + *, + ctx: Context, + node_input: Any, + ) -> AsyncGenerator[Any, None]: + iteration_count = self.tracker.get('iteration_count', 0) + 1 + self.tracker['iteration_count'] = iteration_count + self.tracker.setdefault('attempt_counts', []).append(ctx.attempt_count) + + if iteration_count < self.succeed_on_iteration: + raise self.exception_to_raise + + yield Event( + output=self.message, + ) diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000000..b24ce38b6a --- /dev/null +++ b/tox.ini @@ -0,0 +1,10 @@ +[tox] +envlist = py310, py311, py312, py313, py314 +skipsdist = True + +[testenv] +description = Run unit tests +runner = uv-venv-lock-runner +extras = test +commands = + pytest tests/unittests From 1ff53421dc90917a35ca06b60d0bc75ee9abfa45 Mon Sep 17 00:00:00 2001 From: Xuan Yang Date: Tue, 2 Jun 2026 11:18:28 -0700 Subject: [PATCH 44/94] fix: Disable JSON_SCHEMA_FOR_FUNC_DECL by default Co-authored-by: Xuan Yang PiperOrigin-RevId: 925473877 --- contributing/samples/tools/pydantic_argument/agent.py | 7 +++++++ src/google/adk/features/_feature_registry.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/contributing/samples/tools/pydantic_argument/agent.py b/contributing/samples/tools/pydantic_argument/agent.py index 97a763f375..a9c6cd14a2 100644 --- a/contributing/samples/tools/pydantic_argument/agent.py +++ b/contributing/samples/tools/pydantic_argument/agent.py @@ -18,9 +18,16 @@ from typing import Union from google.adk.agents.llm_agent import Agent +from google.adk.features import FeatureName +from google.adk.features import override_feature_enabled from google.adk.tools.function_tool import FunctionTool import pydantic +override_feature_enabled( + FeatureName.JSON_SCHEMA_FOR_FUNC_DECL, + True, +) + class UserProfile(pydantic.BaseModel): """A user's profile information.""" diff --git a/src/google/adk/features/_feature_registry.py b/src/google/adk/features/_feature_registry.py index d155e3b7ac..75fa16994e 100644 --- a/src/google/adk/features/_feature_registry.py +++ b/src/google/adk/features/_feature_registry.py @@ -135,7 +135,7 @@ class FeatureConfig: FeatureStage.EXPERIMENTAL, default_on=True ), FeatureName.JSON_SCHEMA_FOR_FUNC_DECL: FeatureConfig( - FeatureStage.EXPERIMENTAL, default_on=True + FeatureStage.EXPERIMENTAL, default_on=False ), FeatureName._MCP_GRACEFUL_ERROR_HANDLING: FeatureConfig( FeatureStage.EXPERIMENTAL, default_on=True From 05635a2bd71a7318d697b1257a8be6fc8ec44224 Mon Sep 17 00:00:00 2001 From: George Weale Date: Tue, 2 Jun 2026 11:53:12 -0700 Subject: [PATCH 45/94] fix: guard peer agent mode access in agent transfer _get_transfer_targets read peer_agent.mode directly while iterating the parent's sub_agents. mode only exists on LlmAgent, so a peer that is a plain BaseAgent subclass raised AttributeError and broke transfer_to_agent. Mirror the hasattr guard already used in the sub_agents branch. Co-authored-by: George Weale PiperOrigin-RevId: 925495789 --- .../adk/flows/llm_flows/agent_transfer.py | 5 +- ...test_agent_transfer_system_instructions.py | 46 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/google/adk/flows/llm_flows/agent_transfer.py b/src/google/adk/flows/llm_flows/agent_transfer.py index f4c68671db..050f2ae8a3 100644 --- a/src/google/adk/flows/llm_flows/agent_transfer.py +++ b/src/google/adk/flows/llm_flows/agent_transfer.py @@ -193,7 +193,10 @@ def _get_transfer_targets(agent: LlmAgent) -> list[BaseAgent]: peer_agent for peer_agent in agent.parent_agent.sub_agents if peer_agent.name != agent.name - and peer_agent.mode not in ('single_turn', 'task') + and ( + not hasattr(peer_agent, 'mode') + or peer_agent.mode not in ('single_turn', 'task') + ) ]) return result diff --git a/tests/unittests/flows/llm_flows/test_agent_transfer_system_instructions.py b/tests/unittests/flows/llm_flows/test_agent_transfer_system_instructions.py index 3f590a2197..42ef44e1a1 100644 --- a/tests/unittests/flows/llm_flows/test_agent_transfer_system_instructions.py +++ b/tests/unittests/flows/llm_flows/test_agent_transfer_system_instructions.py @@ -19,9 +19,13 @@ implementation. """ +from typing import AsyncGenerator + +from google.adk.agents.base_agent import BaseAgent from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import Agent from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService +from google.adk.events.event import Event from google.adk.flows.llm_flows import agent_transfer from google.adk.memory.in_memory_memory_service import InMemoryMemoryService from google.adk.models.llm_request import LlmRequest @@ -34,6 +38,15 @@ from ... import testing_utils +class _NonLlmAgent(BaseAgent): + """A minimal BaseAgent subclass that, like any non-LlmAgent, has no `mode`.""" + + async def _run_async_impl( + self, ctx: InvocationContext + ) -> AsyncGenerator[Event, None]: + yield Event(author=self.name, invocation_id=ctx.invocation_id) + + async def create_test_invocation_context(agent: Agent) -> InvocationContext: """Helper to create constructed InvocationContext.""" session_service = InMemorySessionService() @@ -296,3 +309,36 @@ async def test_agent_transfer_no_instructions_when_no_transfer_targets(): instructions = llm_request.config.system_instruction or '' assert '**NOTE**:' not in instructions assert 'transfer_to_agent' not in instructions + + +@pytest.mark.asyncio +async def test_agent_transfer_with_non_llm_peer_agent(): + """Peer agents that are not LlmAgents (no `mode`) must not break transfer.""" + mockModel = testing_utils.MockModel.create(responses=[]) + + non_llm_peer = _NonLlmAgent( + name='non_llm_peer', description='A non-LlmAgent peer' + ) + parent_agent = Agent( + name='parent_agent', + model=mockModel, + sub_agents=[non_llm_peer], + description='Parent agent', + ) + main_agent = Agent( + name='main_agent', + model=mockModel, + parent_agent=parent_agent, + description='Main agent', + ) + + invocation_context = await create_test_invocation_context(main_agent) + llm_request = LlmRequest() + + async for _ in agent_transfer.request_processor.run_async( + invocation_context, llm_request + ): + pass + + instructions = llm_request.config.system_instruction + assert 'non_llm_peer' in instructions From 72e0a74a0b1d02ac28e7f7d7bb02bc1325f2c5ef Mon Sep 17 00:00:00 2001 From: Haiyuan Cao Date: Tue, 2 Jun 2026 12:47:30 -0700 Subject: [PATCH 46/94] feat(plugins): drop-event observability, cross-region writes, and no duplicate OTel spans Three related reliability/observability fixes to the BigQuery Agent Analytics plugin. 1. Dropped-event observability. BigQuery logging is best-effort: events are dropped when the in-memory queue overflows or a write ultimately fails, and only a log line records the loss. Track dropped rows in BatchProcessor by reason (queue_full, arrow_prep_failed, retry_exhausted, non_retryable, unexpected_error), include the running total in each drop log line, and expose the counts via BatchProcessor.get_drop_stats()/dropped_event_count and an aggregating BigQueryAgentAnalyticsPlugin.get_drop_stats() so a host can poll them and export to its own monitoring. 2. Cross-region Storage Write API routing. The AppendRows streaming RPC does not auto-populate the request-routing header, so writes to a dataset outside the US multiregion could fail with a "session not found" / stream-not-found error and silently drop every row. Set x-goog-request-params: write_stream= on the append_rows call so the request reaches the region that owns the write stream. US-multiregion behavior is unchanged. 3. Stop exporting plugin-owned OTel spans. When Agent Engine telemetry is enabled (GOOGLE_CLOUD_AGENT_ENGINE_ENABLE_TELEMETRY=true) with Cloud Trace export on the global tracer provider, the plugin's ID-carrier spans were exported alongside the framework's real spans, producing a duplicate span for every instrumented operation. The plugin now tracks span_id / trace_id on its own contextvar stack without creating OTel spans; trace_id is inherited from the ambient span, so BigQuery rows still join to Cloud Trace by trace_id and the LLM/tool span_id-sharing contracts are preserved. All paths covered by unit tests. Co-authored-by: Haiyuan Cao PiperOrigin-RevId: 925523903 --- .../bigquery_agent_analytics_plugin.py | 269 ++++++---- .../test_bigquery_agent_analytics_plugin.py | 464 +++++++++++++++--- 2 files changed, 574 insertions(+), 159 deletions(-) diff --git a/src/google/adk/plugins/bigquery_agent_analytics_plugin.py b/src/google/adk/plugins/bigquery_agent_analytics_plugin.py index 90bd50628c..5ebc31d3e2 100644 --- a/src/google/adk/plugins/bigquery_agent_analytics_plugin.py +++ b/src/google/adk/plugins/bigquery_agent_analytics_plugin.py @@ -634,20 +634,35 @@ class BigQueryLoggerConfig: @dataclass class _SpanRecord: - """A single record on the unified span stack. - - Consolidates span, id, ownership, and timing into one object - so all stacks stay in sync by construction. - - Note: The plugin intentionally does NOT attach its spans to the - ambient OTel context (no ``context.attach``). This prevents the - plugin from corrupting the framework's span hierarchy when an - external OTel exporter (e.g. ``opentelemetry-instrumentation-vertexai``) - is active. See https://github.com/google/adk-python/issues/4561. + """A single record on the BQAA plugin's internal span stack. + + Stores the IDs and timing the plugin needs to populate BigQuery + ``span_id`` / ``parent_span_id`` / ``trace_id`` / ``latency_ms`` + columns. Crucially, no OpenTelemetry ``Span`` object is held. + + Background — prior approach and the bug it caused: + The previous implementation created real OTel spans via + ``tracer.start_span(...)`` purely as ID carriers. When the host + application has an OTel exporter configured (notably Agent Engine + with ``GOOGLE_CLOUD_AGENT_ENGINE_ENABLE_TELEMETRY=true``), those + plugin-owned spans were exported to Cloud Trace alongside the + framework's real spans — producing a duplicate-span view for + every BQAA-instrumented operation. See haiyuan-eng-google/BQAA-SDK#94. + + The plugin already tracked all parent / child relationships on + this internal stack, so the OTel span object was incidental to + correctness. We now store ``trace_id`` directly on each record + (inherited from the ambient OTel span when present, generated + otherwise) and skip span creation entirely. Cross-system + correlation with Cloud Trace still works via ``trace_id`` + inheritance. + + ``attach_current_span`` (which observes the ambient span without + owning one) is unaffected by this change. """ - span: trace.Span span_id: str + trace_id: str owns_span: bool start_time_ns: int first_token_time: Optional[float] = None @@ -689,17 +704,16 @@ def init_trace(callback_context: CallbackContext) -> None: @staticmethod def get_trace_id(callback_context: CallbackContext) -> Optional[str]: - """Gets the trace ID from the current span or invocation_id.""" + """Gets the trace ID from the current span stack or invocation_id.""" records = _span_records_ctx.get() if records: - current_span = records[-1].span - if current_span.get_span_context().is_valid: - return format(current_span.get_span_context().trace_id, "032x") + return records[-1].trace_id - # Fallback to OTel context - current_span = trace.get_current_span() - if current_span.get_span_context().is_valid: - return format(current_span.get_span_context().trace_id, "032x") + # Fallback to ambient OTel context (e.g. callbacks fired before + # any plugin span was pushed). + ambient_ctx = trace.get_current_span().get_span_context() + if ambient_ctx.is_valid: + return format(ambient_ctx.trace_id, "032x") return callback_context.invocation_id @@ -708,47 +722,48 @@ def push_span( callback_context: CallbackContext, span_name: Optional[str] = "adk-span", ) -> str: - """Starts a new span and pushes it onto the stack. - - The span is created but NOT attached to the ambient OTel context, - so it cannot corrupt the framework's own span hierarchy. The - plugin tracks span_id / parent_span_id internally via its own - contextvar stack. - - If OTel is not configured (returning non-recording spans), a UUID - fallback is generated to ensure span_id and parent_span_id are - populated in BigQuery logs. + """Pushes a BQAA-internal span record onto the stack. + + No OpenTelemetry span is created — see ``_SpanRecord`` for + background. The record carries everything the plugin needs to + populate BigQuery columns: + + * ``span_id`` — newly generated 16-hex string. + * ``trace_id`` — inherited by precedence: + 1. Top of the existing internal stack (keeps every push + within an invocation under one trace_id). + 2. Ambient OTel span when valid (e.g. the framework's Runner + span, or an Agent Engine root span) — keeps BigQuery rows + joinable to Cloud Trace via the shared ``trace_id``. + 3. A fresh 32-hex value (no ambient context, e.g. unit tests + or non-OTel runtimes). + * ``start_time_ns`` — for the eventual ``latency_ms`` on pop. + + ``span_name`` is preserved on the signature for API stability but + is no longer used (no OTel span name is set). """ + del span_name # No-op: kept for API stability; no OTel span is created. TraceManager.init_trace(callback_context) - # Create the span without attaching it to the ambient context. - # This avoids re-parenting framework spans like ``call_llm`` - # or ``execute_tool``. See #4561. - # - # If the internal stack already has a span, create the new span - # as a child so it shares the same trace_id. Without this, each - # ``start_span`` would be an independent root with its own - # trace_id — causing trace_id fracture (see #4645). records = TraceManager._get_records() - parent_ctx = None - if records and records[-1].span.get_span_context().is_valid: - parent_ctx = trace.set_span_in_context(records[-1].span) - span = tracer.start_span(span_name, context=parent_ctx) - - if span.get_span_context().is_valid: - span_id_str = format(span.get_span_context().span_id, "016x") + if records: + trace_id = records[-1].trace_id else: - span_id_str = uuid.uuid4().hex + ambient_ctx = trace.get_current_span().get_span_context() + if ambient_ctx.is_valid: + trace_id = format(ambient_ctx.trace_id, "032x") + else: + trace_id = uuid.uuid4().hex # 32 hex chars + + span_id_str = uuid.uuid4().hex[:16] record = _SpanRecord( - span=span, span_id=span_id_str, + trace_id=trace_id, owns_span=True, start_time_ns=time.time_ns(), ) - - new_records = list(records) + [record] - _span_records_ctx.set(new_records) + _span_records_ctx.set(list(records) + [record]) return span_id_str @@ -756,30 +771,31 @@ def push_span( def attach_current_span( callback_context: CallbackContext, ) -> str: - """Records the current OTel span on the stack without owning it. + """Records the ambient OTel span's IDs on the stack without owning it. - The span is NOT re-attached to the ambient context; it is only - tracked internally for span_id / parent_span_id resolution. + No OTel span is created or attached. This path captures the + ambient span's ``trace_id`` / ``span_id`` so plugin-emitted + BigQuery rows correlate with whatever Cloud Trace / external + exporter the host is already running. """ TraceManager.init_trace(callback_context) - span = trace.get_current_span() - - if span.get_span_context().is_valid: - span_id_str = format(span.get_span_context().span_id, "016x") + ambient_ctx = trace.get_current_span().get_span_context() + if ambient_ctx.is_valid: + span_id_str = format(ambient_ctx.span_id, "016x") + trace_id = format(ambient_ctx.trace_id, "032x") else: - span_id_str = uuid.uuid4().hex + span_id_str = uuid.uuid4().hex[:16] + trace_id = uuid.uuid4().hex record = _SpanRecord( - span=span, span_id=span_id_str, + trace_id=trace_id, owns_span=False, start_time_ns=time.time_ns(), ) - records = TraceManager._get_records() - new_records = list(records) + [record] - _span_records_ctx.set(new_records) + _span_records_ctx.set(list(records) + [record]) return span_id_str @@ -828,10 +844,10 @@ def ensure_invocation_span( @staticmethod def pop_span() -> tuple[Optional[str], Optional[int]]: - """Ends the current span and pops it from the stack. + """Pops the top span record from the internal stack. - No ambient OTel context is detached because we never attached - one in the first place (see ``push_span``). + Returns ``(span_id, duration_ms)``. No OTel span is ended + because the plugin no longer creates one (see ``_SpanRecord``). """ records = _span_records_ctx.get() if not records: @@ -841,29 +857,13 @@ def pop_span() -> tuple[Optional[str], Optional[int]]: record = new_records.pop() _span_records_ctx.set(new_records) - # Calculate duration - duration_ms = None - otel_start = getattr(record.span, "start_time", None) - if isinstance(otel_start, (int, float)) and otel_start: - duration_ms = int((time.time_ns() - otel_start) / 1_000_000) - else: - duration_ms = int((time.time_ns() - record.start_time_ns) / 1_000_000) - - if record.owns_span: - record.span.end() - + duration_ms = int((time.time_ns() - record.start_time_ns) / 1_000_000) return record.span_id, duration_ms @staticmethod def clear_stack() -> None: """Clears all span records. Safety net for cross-invocation cleanup.""" - records = _span_records_ctx.get() - if records: - # End any owned spans to avoid OTel resource leaks. - for record in reversed(records): - if record.owns_span: - record.span.end() - _span_records_ctx.set([]) + _span_records_ctx.set([]) @staticmethod def get_current_span_and_parent() -> tuple[Optional[str], Optional[str]]: @@ -894,19 +894,11 @@ def get_root_agent_name() -> Optional[str]: @staticmethod def get_start_time(span_id: str) -> Optional[float]: - """Gets start time of a span by ID.""" + """Gets start time of a span by ID (seconds since epoch).""" records = _span_records_ctx.get() if records: for record in reversed(records): if record.span_id == span_id: - # Try OTel span start_time first - otel_start = getattr(record.span, "start_time", None) - if ( - record.span.get_span_context().is_valid - and isinstance(otel_start, (int, float)) - and otel_start - ): - return otel_start / 1_000_000_000.0 return record.start_time_ns / 1_000_000_000.0 return None @@ -982,6 +974,19 @@ def __init__( self._batch_processor_task: Optional[asyncio.Task] = None self._shutdown = False + # Running tally of events/rows dropped without ever being written, keyed by + # reason. Logging every drop is the only existing signal that data was lost, + # and those logs are easy to miss at volume; these counters let a host poll + # get_drop_stats() and export the loss to its own monitoring before it shows + # up as missing rows downstream. + self._dropped: dict[str, int] = { + "queue_full": 0, + "arrow_prep_failed": 0, + "retry_exhausted": 0, + "non_retryable": 0, + "unexpected_error": 0, + } + async def flush(self) -> None: """Flushes the queue by waiting for it to be empty.""" if self._queue.empty(): @@ -1003,7 +1008,35 @@ async def append(self, row: dict[str, Any]) -> None: try: self._queue.put_nowait(row) except asyncio.QueueFull: - logger.warning("BigQuery log queue full, dropping event.") + self._dropped["queue_full"] += 1 + logger.warning( + "BigQuery log queue full, dropping event. Total events dropped" + " (queue full): %s", + self._dropped["queue_full"], + ) + + def get_drop_stats(self) -> dict[str, int]: + """Returns a snapshot of dropped-row counts keyed by reason. + + Dropped rows are logged best-effort and never written, so these counters + are the canonical signal that data was lost. Reasons: + + ``queue_full``: the in-memory queue was full when the event arrived. + ``arrow_prep_failed``: the batch could not be serialized to Arrow. + ``retry_exhausted``: the write failed after exhausting all retries. + ``non_retryable``: BigQuery returned a non-retryable error (e.g. a + schema mismatch). + ``unexpected_error``: an unexpected exception aborted the write. + + Returns: + A copy of the per-reason drop counters. + """ + return dict(self._dropped) + + @property + def dropped_event_count(self) -> int: + """Total rows dropped without being written, across all reasons.""" + return sum(self._dropped.values()) def _prepare_arrow_batch(self, rows: list[dict[str, Any]]) -> pa.RecordBatch: """Prepares a PyArrow RecordBatch from a list of rows. @@ -1159,8 +1192,13 @@ async def _write_rows_with_retry(self, rows: list[dict[str, Any]]) -> None: req.arrow_rows.writer_schema.serialized_schema = serialized_schema req.arrow_rows.rows.serialized_record_batch = serialized_batch except Exception as e: + self._dropped["arrow_prep_failed"] += len(rows) logger.error( - "Failed to prepare Arrow batch (Data Loss): %s", e, exc_info=True + "Failed to prepare Arrow batch (Data Loss): %s. Total rows dropped" + " (arrow prep failed): %s", + e, + self._dropped["arrow_prep_failed"], + exc_info=True, ) return @@ -1171,7 +1209,21 @@ async def requests_iter(): yield req async def perform_write(): - responses = await self.write_client.append_rows(requests_iter()) + # The AppendRows streaming RPC does not auto-populate the + # request-routing header, so writes to any region other than + # the US multiregion fail with a "session not found" / + # stream-not-found error. Set the routing header explicitly + # (same as google.cloud.bigquery_storage_v1.writer) so the + # request reaches the region that owns the write stream. + responses = await self.write_client.append_rows( + requests_iter(), + metadata=( + ( + "x-goog-request-params", + f"write_stream={self.write_stream}", + ), + ), + ) async for response in responses: error = getattr(response, "error", None) error_code = getattr(error, "code", None) @@ -1202,6 +1254,7 @@ async def perform_write(): for row_error in row_errors: logger.error("Row error details: %s", row_error) logger.error("Row content causing error: %s", rows) + self._dropped["non_retryable"] += len(rows) return return @@ -1216,10 +1269,13 @@ async def perform_write(): ) as e: attempt += 1 if attempt > self.retry_config.max_retries: + self._dropped["retry_exhausted"] += len(rows) logger.error( - "BigQuery Batch Dropped after %s attempts. Last error: %s", + "BigQuery Batch Dropped after %s attempts. Last error: %s." + " Total rows dropped (retry exhausted): %s", self.retry_config.max_retries + 1, e, + self._dropped["retry_exhausted"], ) return @@ -1236,9 +1292,12 @@ async def perform_write(): await asyncio.sleep(sleep_time) delay *= self.retry_config.multiplier except Exception as e: + self._dropped["unexpected_error"] += len(rows) logger.error( - "Unexpected BigQuery Write API error (Dropping batch): %s", + "Unexpected BigQuery Write API error (Dropping batch): %s." + " Total rows dropped (unexpected error): %s", e, + self._dropped["unexpected_error"], exc_info=True, ) return @@ -2194,6 +2253,24 @@ async def flush(self) -> None: # No running loop or other issue pass + def get_drop_stats(self) -> dict[str, int]: + """Returns dropped-row counts aggregated across all event loops. + + Events are dropped best-effort (queue overflow, write failures), so the + loss is otherwise only visible in logs. Export these counters to your + monitoring to detect data loss before it surfaces as missing rows. See + BatchProcessor.get_drop_stats for the meaning of each reason. + + Returns: + Per-reason drop counts summed over every active loop's processor. + Empty if no processor has been created yet. + """ + totals: dict[str, int] = {} + for state in list(self._loop_state_by_loop.values()): + for reason, count in state.batch_processor.get_drop_stats().items(): + totals[reason] = totals.get(reason, 0) + count + return totals + async def _lazy_setup(self, **kwargs) -> None: """Performs lazy initialization of BigQuery clients and resources.""" if self._started: diff --git a/tests/unittests/plugins/test_bigquery_agent_analytics_plugin.py b/tests/unittests/plugins/test_bigquery_agent_analytics_plugin.py index c6d47539d1..d265f605dd 100644 --- a/tests/unittests/plugins/test_bigquery_agent_analytics_plugin.py +++ b/tests/unittests/plugins/test_bigquery_agent_analytics_plugin.py @@ -635,6 +635,55 @@ async def test_event_denylist( await asyncio.sleep(0.01) mock_write_client.append_rows.assert_called_once() + @pytest.mark.asyncio + async def test_append_rows_sets_regional_routing_header( + self, + mock_write_client, + callback_context, + mock_auth_default, + mock_bq_client, + mock_to_arrow_schema, + dummy_arrow_schema, + mock_asyncio_to_thread, + ): + """Regression test for cross-region writes (issue #262). + + The Storage Write API streaming AppendRows RPC does not + auto-populate the request-routing header, so writes to a dataset + outside the US multiregion (e.g. northamerica-northeast1) fail with + a "session not found" / stream-not-found error unless the header is + set explicitly. Assert the header is passed to append_rows so the + request reaches the region that owns the write stream. + """ + _ = mock_auth_default + _ = mock_bq_client + config = bigquery_agent_analytics_plugin.BigQueryLoggerConfig() + async with managed_plugin( + PROJECT_ID, + DATASET_ID, + table_id=TABLE_ID, + config=config, + location="northamerica-northeast1", + ) as plugin: + await plugin._ensure_started() + mock_write_client.append_rows.reset_mock() + llm_request = llm_request_lib.LlmRequest( + model="gemini-pro", + contents=[types.Content(parts=[types.Part(text="Prompt")])], + ) + bigquery_agent_analytics_plugin.TraceManager.push_span(callback_context) + await plugin.before_model_callback( + callback_context=callback_context, llm_request=llm_request + ) + await asyncio.sleep(0.01) # Allow background task to run + mock_write_client.append_rows.assert_called_once() + metadata = mock_write_client.append_rows.call_args.kwargs.get("metadata") + assert metadata is not None, "append_rows must receive routing metadata" + assert ( + "x-goog-request-params", + f"write_stream={DEFAULT_STREAM_NAME}", + ) in tuple(metadata) + @pytest.mark.asyncio async def test_content_formatter( self, @@ -2225,53 +2274,56 @@ class LocalIncident: assert content_json["result"]["kpi_missed"][0]["kpi"] == "latency" @pytest.mark.asyncio - async def test_otel_integration( + async def test_push_pop_does_not_call_tracer_start_span( self, callback_context, ): - """Verifies OpenTelemetry integration in TraceManager.""" - # Mock the tracer and span + """Regression guard for the duplicate-Cloud-Trace bug (issue #94). + + The plugin must NOT call ``tracer.start_span(...)`` from + ``push_span`` / ``pop_span``. Any owned OTel span goes through + the globally configured exporter (e.g. Cloud Trace via Agent + Engine telemetry) and surfaces as a duplicate span next to the + framework's real one. The plugin's internal stack is sufficient + for ``span_id`` / ``parent_span_id`` / ``trace_id`` resolution + without creating an exportable span. + """ mock_tracer = mock.Mock() - mock_span = mock.Mock() - mock_context = mock.Mock() - # Setup mock IDs (128-bit trace_id, 64-bit span_id) - trace_id_int = 0x12345678123456781234567812345678 - span_id_int = 0x1234567812345678 - mock_context.trace_id = trace_id_int - mock_context.span_id = span_id_int - mock_context.is_valid = True - mock_span.get_span_context.return_value = mock_context - mock_span.start_time = 1234567890000000000 # Mock start time in ns - mock_tracer.start_span.return_value = mock_span - # Patch the global tracer in the plugin module with mock.patch( - "google.adk.plugins.bigquery_agent_analytics_plugin.tracer", mock_tracer + "google.adk.plugins.bigquery_agent_analytics_plugin.tracer", + mock_tracer, ): - # Test push_span span_id = bigquery_agent_analytics_plugin.TraceManager.push_span( callback_context, "test_span" ) - mock_tracer.start_span.assert_called_with("test_span", context=None) - assert span_id == format(span_id_int, "016x") - # Test get_trace_id - # We need to mock trace.get_current_span() to return our mock span - # because push_span calls trace.attach(), which affects the global context - with mock.patch( - "opentelemetry.trace.get_current_span", return_value=mock_span - ): - trace_id = bigquery_agent_analytics_plugin.TraceManager.get_trace_id( - callback_context - ) - assert trace_id == format(trace_id_int, "032x") - # Test pop_span - # pop_span calls span.end() - bigquery_agent_analytics_plugin.TraceManager.pop_span() - mock_span.end.assert_called_once() + assert isinstance(span_id, str) and len(span_id) == 16 + + trace_id = bigquery_agent_analytics_plugin.TraceManager.get_trace_id( + callback_context + ) + assert isinstance(trace_id, str) and len(trace_id) == 32 + + popped_span_id, _duration_ms = ( + bigquery_agent_analytics_plugin.TraceManager.pop_span() + ) + assert popped_span_id == span_id + + mock_tracer.start_span.assert_not_called() @pytest.mark.asyncio - async def test_otel_integration_real_provider(self, callback_context): - """Verifies TraceManager with a real OpenTelemetry TracerProvider.""" - # Setup OTEL with in-memory exporter + async def test_push_pop_does_not_export_spans_through_real_provider( + self, callback_context + ): + """End-to-end regression guard against #94 with a real OTel + + provider + in-memory exporter. + + Wires an ``InMemorySpanExporter`` to a real ``TracerProvider``, + drives a push/pop cycle through ``TraceManager``, and asserts + that **zero** spans were exported. Pre-fix behavior was to + export one span per push/pop pair — visible to Cloud Trace as + duplicate spans alongside the framework's real ones. + """ # pylint: disable=g-import-not-at-top from opentelemetry.sdk import trace as trace_sdk from opentelemetry.sdk.trace import export as trace_export @@ -2280,36 +2332,188 @@ async def test_otel_integration_real_provider(self, callback_context): # pylint: enable=g-import-not-at-top provider = trace_sdk.TracerProvider() exporter = in_memory_span_exporter.InMemorySpanExporter() - processor = trace_export.SimpleSpanProcessor(exporter) - provider.add_span_processor(processor) - tracer = provider.get_tracer("test_tracer") - # Patch the global tracer in the plugin module + provider.add_span_processor(trace_export.SimpleSpanProcessor(exporter)) + real_tracer = provider.get_tracer("test_tracer") + with mock.patch( - "google.adk.plugins.bigquery_agent_analytics_plugin.tracer", tracer + "google.adk.plugins.bigquery_agent_analytics_plugin.tracer", + real_tracer, ): - # 1. Start a span span_id = bigquery_agent_analytics_plugin.TraceManager.push_span( callback_context, "test_span" ) - # Verify a span was started but not ended - current_spans = exporter.get_finished_spans() - assert not current_spans - # Verify we can retrieve the trace ID + assert exporter.get_finished_spans() == () + trace_id = bigquery_agent_analytics_plugin.TraceManager.get_trace_id( callback_context ) - assert trace_id is not None - # 2. End the span + assert trace_id is not None and len(trace_id) == 32 + popped_span_id, _ = ( bigquery_agent_analytics_plugin.TraceManager.pop_span() ) assert popped_span_id == span_id - # Verify span is now finished and exported - finished_spans = exporter.get_finished_spans() - assert len(finished_spans) == 1 - assert finished_spans[0].name == "test_span" - assert format(finished_spans[0].context.span_id, "016x") == span_id - assert format(finished_spans[0].context.trace_id, "032x") == trace_id + + assert exporter.get_finished_spans() == (), ( + "Plugin must not export OTel spans; any owned span would" + " surface as a duplicate in Cloud Trace alongside the" + " framework's real spans (issue #94)." + ) + + provider.shutdown() + + @pytest.mark.asyncio + async def test_push_span_inherits_ambient_trace_id(self, callback_context): + """When the host has an ambient OTel span (e.g. + + Agent Engine's Runner span), the plugin's ``trace_id`` MUST inherit from it + so BigQuery rows correlate with the host's Cloud Trace entries via a shared + ``trace_id``. + """ + # pylint: disable=g-import-not-at-top + from opentelemetry import trace as otel_trace + from opentelemetry.sdk import trace as trace_sdk + + # pylint: enable=g-import-not-at-top + provider = trace_sdk.TracerProvider() + host_tracer = provider.get_tracer("host_tracer") + + # Clear any state on the plugin's contextvar stack. + bigquery_agent_analytics_plugin._span_records_ctx.set(None) + + with host_tracer.start_as_current_span("ambient-host-span") as host_span: + expected_trace_id = format(host_span.get_span_context().trace_id, "032x") + + # Plugin pushes its first internal span inside the ambient span. + bigquery_agent_analytics_plugin.TraceManager.push_span( + callback_context, "bqaa-span" + ) + + plugin_trace_id = ( + bigquery_agent_analytics_plugin.TraceManager.get_trace_id( + callback_context + ) + ) + assert plugin_trace_id == expected_trace_id, ( + "Plugin must inherit ambient trace_id so BigQuery rows join" + " to Cloud Trace via the same trace_id" + ) + + # Nested plugin push also stays under the ambient trace_id. + bigquery_agent_analytics_plugin.TraceManager.push_span( + callback_context, "bqaa-nested" + ) + assert ( + bigquery_agent_analytics_plugin.TraceManager.get_trace_id( + callback_context + ) + == expected_trace_id + ) + + bigquery_agent_analytics_plugin.TraceManager.clear_stack() + provider.shutdown() + del otel_trace # unused; imported for symmetry with provider setup + + @pytest.mark.asyncio + async def test_llm_request_response_share_span_id_contract( + self, callback_context + ): + """Lifecycle contract: ``LLM_REQUEST`` and ``LLM_RESPONSE`` for the + + same model call share one ``span_id`` and one ``trace_id``. + + Models the structural pattern the real callbacks use: + * ``before_model_callback`` calls ``push_span(...)`` and writes + ``LLM_REQUEST`` with the returned ``span_id``. + * ``after_model_callback`` calls ``get_current_span_id()`` / + ``pop_span()`` and writes ``LLM_RESPONSE`` with the same + ``span_id``. + + A future change must not split this pair onto two different + ``span_id``s — that would break the documented BigQuery query + shape and the BQAA join contract. + """ + bigquery_agent_analytics_plugin._span_records_ctx.set(None) + TM = bigquery_agent_analytics_plugin.TraceManager + + # before_model_callback path. + pushed_span_id = TM.push_span(callback_context, "llm_request") + request_trace_id = TM.get_trace_id(callback_context) + + # after_model_callback (final chunk) path. + response_top_of_stack = TM.get_current_span_id() + popped_span_id, _duration_ms = TM.pop_span() + response_trace_id = TM.get_trace_id(callback_context) + + assert response_top_of_stack == pushed_span_id + assert popped_span_id == pushed_span_id + # trace_id resolved on the response side may have to fall back + # past the now-empty stack — but if it does resolve, it must + # match what the request observed. An empty-stack fallback to + # invocation_id is acceptable here; what we are guarding against + # is the *pair* drifting onto two structurally different ids. + if response_trace_id is not None and len(response_trace_id) == 32: + assert response_trace_id == request_trace_id + + @pytest.mark.asyncio + async def test_tool_starting_completed_share_span_id_contract( + self, callback_context + ): + """Lifecycle contract: ``TOOL_STARTING`` and ``TOOL_COMPLETED`` for + + the same tool call share one ``span_id``. + + Same shape as the LLM pair above — push on before, pop on after, + same id on both sides. + """ + bigquery_agent_analytics_plugin._span_records_ctx.set(None) + TM = bigquery_agent_analytics_plugin.TraceManager + + # before_tool_callback path. + pushed_span_id = TM.push_span(callback_context, "tool") + starting_trace_id = TM.get_trace_id(callback_context) + + # after_tool_callback path. + popped_span_id, _duration_ms = TM.pop_span() + + assert popped_span_id == pushed_span_id + assert isinstance(starting_trace_id, str) and len(starting_trace_id) == 32 + + @pytest.mark.asyncio + async def test_streaming_llm_response_shares_span_id_until_final_contract( + self, callback_context + ): + """Streaming-response contract. + + On a streaming LLM call, ``after_model_callback`` is fired once + per partial chunk *plus* once for the final chunk. Partial fires + do NOT pop the span (see ``after_model_callback:3354-3363``) — + they only read ``get_current_span_id()`` and record first-token + timing. Only the final fire calls ``pop_span()``. + + All resulting ``LLM_RESPONSE`` rows therefore share one + ``span_id`` (the same as the paired ``LLM_REQUEST``). A future + change must not "dedupe" the partial rows by switching to a fresh + span id per chunk — those rows are real and intentional. + """ + bigquery_agent_analytics_plugin._span_records_ctx.set(None) + TM = bigquery_agent_analytics_plugin.TraceManager + + pushed_span_id = TM.push_span(callback_context, "llm_request") + + # Simulate three partial chunks: each callback observes the same + # span_id at top of stack and does NOT pop. + for _ in range(3): + assert TM.get_current_span_id() == pushed_span_id + + # Final chunk: pop_span returns the same id and a populated + # latency. + popped_span_id, duration_ms = TM.pop_span() + assert popped_span_id == pushed_span_id + assert duration_ms is not None and duration_ms >= 0 + + # Stack must be empty after the final chunk. + assert TM.get_current_span_id() is None @pytest.mark.asyncio async def test_keyword_identifiers_emission_default( @@ -5853,8 +6057,10 @@ async def test_trace_id_continuity_no_ambient_span(self, callback_context): TM = bigquery_agent_analytics_plugin.TraceManager - # Create a real TracerProvider and patch the plugin's module-level - # tracer so push_span creates valid spans with proper trace_ids. + # Wire a real TracerProvider with an in-memory exporter so we can + # also assert the plugin path does NOT export anything through it. + # (push_span no longer creates OTel spans — see _SpanRecord; the + # exporter is here as a regression guard, not a span source.) exporter = InMemorySpanExporter() provider = SdkProvider() provider.add_span_processor(SimpleSpanProcessor(exporter)) @@ -6176,8 +6382,11 @@ async def test_starting_completed_same_span_with_ambient( assert len(agent_starting) == 1 assert len(agent_completed) == 1 - # Both events must share the same span_id (the ambient - # invoke_agent span) — no plugin-synthetic override. + # Both events must share the same span_id (the plugin-internal + # agent span pushed by before_agent_callback and popped by + # after_agent_callback). The lifecycle-pair invariant holds + # regardless of whether the id comes from a plugin-minted hex + # string or an ambient OTel span. assert agent_starting[0]["span_id"] == agent_completed[0]["span_id"] assert ( agent_starting[0]["parent_span_id"] @@ -6362,8 +6571,17 @@ def test_ensure_invocation_span_clears_stale_records(self, callback_context): provider.shutdown() - def test_clear_stack_ends_owned_spans(self, callback_context): - """clear_stack() ends all owned spans.""" + def test_clear_stack_does_not_export_spans(self, callback_context): + """``clear_stack()`` clears the internal records but does NOT + + export any OTel spans (issue #94 regression guard). + + Pre-fix, ``clear_stack()`` called ``record.span.end()`` for every + owned record, which delivered the now-finished span to whatever + exporter the host had wired — duplicating it next to the + framework's real span in Cloud Trace. Post-fix the plugin owns + no OTel span at all; ``clear_stack()`` only resets the contextvar. + """ from opentelemetry.sdk.trace import TracerProvider as SdkProvider from opentelemetry.sdk.trace.export import SimpleSpanProcessor from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter @@ -6384,6 +6602,8 @@ def test_clear_stack_ends_owned_spans(self, callback_context): records = list(bigquery_agent_analytics_plugin._span_records_ctx.get()) assert all(r.owns_span for r in records) + # No exported spans yet (the plugin never creates any). + assert exporter.get_finished_spans() == () TM.clear_stack() @@ -6391,9 +6611,12 @@ def test_clear_stack_ends_owned_spans(self, callback_context): result = bigquery_agent_analytics_plugin._span_records_ctx.get() assert result == [] - # Both owned spans should have been ended (exported). - exported = exporter.get_finished_spans() - assert len(exported) == 2 + # Still no exported spans — the regression guard for #94. + assert exporter.get_finished_spans() == (), ( + "clear_stack() must not export OTel spans; any owned span" + " would surface as a duplicate in Cloud Trace alongside the" + " framework's real spans (issue #94)." + ) provider.shutdown() @@ -7787,3 +8010,118 @@ async def test_skips_executable_code_only_events( ) await asyncio.sleep(0.05) assert mock_write_client.append_rows.call_count == 0 + + +class TestDropStats: + """Tests that dropped events are counted and exposed via get_drop_stats.""" + + def _make_processor( + self, arrow_schema, *, queue_max_size=10, retry_config=None + ): + """Builds a BatchProcessor with a mock write client (writer not started).""" + return bigquery_agent_analytics_plugin.BatchProcessor( + write_client=mock.MagicMock(), + arrow_schema=arrow_schema, + write_stream=DEFAULT_STREAM_NAME, + batch_size=1, + flush_interval=1.0, + retry_config=( + retry_config or bigquery_agent_analytics_plugin.RetryConfig() + ), + queue_max_size=queue_max_size, + shutdown_timeout=10.0, + ) + + def _stub_arrow_prep(self, bp): + """Stubs Arrow serialization so write tests need no real row schema.""" + fake_batch = mock.MagicMock() + fake_batch.serialize.return_value.to_pybytes.return_value = b"batch" + bp._prepare_arrow_batch = mock.MagicMock(return_value=fake_batch) + + @pytest.mark.asyncio + async def test_queue_full_drops_are_counted(self, dummy_arrow_schema): + # Writer is not started, so a size-1 queue fills after one append and the + # next two appends overflow and are dropped. + bp = self._make_processor(dummy_arrow_schema, queue_max_size=1) + await bp.append({"event": 0}) + await bp.append({"event": 1}) + await bp.append({"event": 2}) + assert bp.get_drop_stats()["queue_full"] == 2 + assert bp.dropped_event_count == 2 + + @pytest.mark.asyncio + async def test_retry_exhaustion_drops_are_counted(self, dummy_arrow_schema): + # max_retries=0 with zero delay drops on the first failure without sleeping. + retry_config = bigquery_agent_analytics_plugin.RetryConfig( + max_retries=0, initial_delay=0.0, multiplier=1.0, max_delay=0.0 + ) + bp = self._make_processor(dummy_arrow_schema, retry_config=retry_config) + self._stub_arrow_prep(bp) + + async def fake_append_rows(requests, **kwargs): + del requests, kwargs + resp = mock.MagicMock() + resp.row_errors = [] + resp.error = mock.MagicMock() + resp.error.code = bigquery_agent_analytics_plugin._GRPC_UNAVAILABLE + resp.error.message = "unavailable" + return _async_gen(resp) + + bp.write_client.append_rows.side_effect = fake_append_rows + + await bp._write_rows_with_retry([{"a": 1}, {"a": 2}]) + + assert bp.get_drop_stats()["retry_exhausted"] == 2 + assert bp.dropped_event_count == 2 + + @pytest.mark.asyncio + async def test_non_retryable_drops_are_counted(self, dummy_arrow_schema): + bp = self._make_processor(dummy_arrow_schema) + self._stub_arrow_prep(bp) + + async def fake_append_rows(requests, **kwargs): + del requests, kwargs + resp = mock.MagicMock() + resp.row_errors = [] + resp.error = mock.MagicMock() + resp.error.code = 3 # INVALID_ARGUMENT, non-retryable. + resp.error.message = "bad request" + return _async_gen(resp) + + bp.write_client.append_rows.side_effect = fake_append_rows + + await bp._write_rows_with_retry([{"a": 1}]) + + assert bp.get_drop_stats()["non_retryable"] == 1 + assert bp.dropped_event_count == 1 + + def test_plugin_get_drop_stats_aggregates_across_loops( + self, dummy_arrow_schema + ): + plugin = bigquery_agent_analytics_plugin.BigQueryAgentAnalyticsPlugin( + project_id=PROJECT_ID, dataset_id=DATASET_ID, table_id=TABLE_ID + ) + bp1 = self._make_processor(dummy_arrow_schema) + bp2 = self._make_processor(dummy_arrow_schema) + bp1._dropped["queue_full"] = 3 + bp1._dropped["retry_exhausted"] = 1 + bp2._dropped["queue_full"] = 4 + loop1 = mock.MagicMock(spec=asyncio.AbstractEventLoop) + loop2 = mock.MagicMock(spec=asyncio.AbstractEventLoop) + plugin._loop_state_by_loop[loop1] = ( + bigquery_agent_analytics_plugin._LoopState(mock.MagicMock(), bp1) + ) + plugin._loop_state_by_loop[loop2] = ( + bigquery_agent_analytics_plugin._LoopState(mock.MagicMock(), bp2) + ) + + stats = plugin.get_drop_stats() + + assert stats["queue_full"] == 7 + assert stats["retry_exhausted"] == 1 + + def test_plugin_get_drop_stats_empty_without_processor(self): + plugin = bigquery_agent_analytics_plugin.BigQueryAgentAnalyticsPlugin( + project_id=PROJECT_ID, dataset_id=DATASET_ID, table_id=TABLE_ID + ) + assert plugin.get_drop_stats() == {} From db6cc52245e27ba4a915810f83f14a39aeac8e2f Mon Sep 17 00:00:00 2001 From: George Weale Date: Tue, 2 Jun 2026 14:08:36 -0700 Subject: [PATCH 47/94] fix: populate user_content in resumed invocations Co-authored-by: George Weale PiperOrigin-RevId: 925569534 --- src/google/adk/runners.py | 22 ++++--- tests/unittests/runners/test_runner_node.py | 66 +++++++++++++++++++++ 2 files changed, 80 insertions(+), 8 deletions(-) diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index d0fe96c87b..573edecb6b 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -459,6 +459,7 @@ async def _run_node_async( *, user_id: str, session_id: str, + invocation_id: Optional[str] = None, new_message: Optional[types.Content] = None, state_delta: Optional[dict[str, Any]] = None, run_config: Optional[RunConfig] = None, @@ -481,11 +482,10 @@ async def _run_node_async( resume_inputs = self._extract_resume_inputs(new_message) self._validate_new_message(new_message, resume_inputs) - invocation_id = ( - self._resolve_invocation_id_from_fr(session, new_message) - if new_message - else None - ) + if not invocation_id and new_message: + invocation_id = self._resolve_invocation_id_from_fr( + session, new_message + ) ic = self._new_invocation_context( session, @@ -496,12 +496,16 @@ async def _run_node_async( ic._event_queue = asyncio.Queue() # 2. Append user message to session and resolve node_input - if resume_inputs: - # Resume: find original user message, use as node_input + node_input = None + if resume_inputs or invocation_id: + # Resume: recover the original user content. new_message here is a + # function response (or None), so it can't populate user_content. node_input = self._find_original_user_content( ic.session, ic.invocation_id ) - else: + if node_input: + ic.user_content = node_input + if not node_input: # Fresh: use user message as node_input node_input = new_message @@ -1019,6 +1023,7 @@ async def run_async( self._run_node_async( user_id=user_id, session_id=session_id, + invocation_id=invocation_id, new_message=new_message, state_delta=state_delta, run_config=run_config, @@ -1039,6 +1044,7 @@ async def run_async( self._run_node_async( user_id=user_id, session_id=session_id, + invocation_id=invocation_id, new_message=new_message, state_delta=state_delta, run_config=run_config, diff --git a/tests/unittests/runners/test_runner_node.py b/tests/unittests/runners/test_runner_node.py index 5abdfee529..7758fbc02d 100644 --- a/tests/unittests/runners/test_runner_node.py +++ b/tests/unittests/runners/test_runner_node.py @@ -476,6 +476,72 @@ async def _run_impl( assert 'original:my original input' in outputs +@pytest.mark.asyncio +async def test_resume_populates_invocation_user_content(): + """On resume via a function response, ic.user_content is the original turn.""" + seen: list[Any] = [] + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + if ctx.resume_inputs and 'fc-1' in ctx.resume_inputs: + user_content = ctx.get_invocation_context().user_content + seen.append(user_content.parts[0].text if user_content else None) + yield 'resumed' + return + yield _make_interrupt_event(fc_name='tool') + + await _run_two_turns( + _Node(name='node'), + 'remember me', + _make_resume_message(fc_name='tool', response={'v': 1}), + ) + + assert seen == ['remember me'] + + +@pytest.mark.asyncio +async def test_resume_by_invocation_id_populates_user_content(): + """Resuming by invocation_id alone recovers the original user_content.""" + seen: list[Any] = [] + + class _Node(BaseNode): + + async def _run_impl( + self, *, ctx: Context, node_input: Any + ) -> AsyncGenerator[Any, None]: + user_content = ctx.get_invocation_context().user_content + seen.append(user_content.parts[0].text if user_content else None) + yield _make_interrupt_event(fc_name='tool') + + ss = InMemorySessionService() + runner = Runner(app_name='test', node=_Node(name='node'), session_service=ss) + session = await ss.create_session(app_name='test', user_id='u') + + async for _ in runner.run_async( + user_id='u', + session_id=session.id, + new_message=types.Content( + parts=[types.Part(text='original text')], role='user' + ), + ): + pass + + updated = await ss.get_session( + app_name='test', user_id='u', session_id=session.id + ) + invocation_id = updated.events[0].invocation_id + + async for _ in runner.run_async( + user_id='u', session_id=session.id, invocation_id=invocation_id + ): + pass + + assert seen == ['original text', 'original text'] + + @pytest.mark.asyncio async def test_plain_text_does_not_trigger_resume(): """Sending plain text (no FR) starts fresh, does not enter resume path.""" From ef196133469d06207d0ee41ce93e8372cfba3995 Mon Sep 17 00:00:00 2001 From: Shangjie Chen Date: Tue, 2 Jun 2026 18:36:03 -0700 Subject: [PATCH 48/94] chore: Add cli, integrations, and skills to GitHub issue triaging rubric Co-authored-by: Shangjie Chen PiperOrigin-RevId: 925699220 --- .../samples/adk_team/adk_triaging_agent/agent.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/contributing/samples/adk_team/adk_triaging_agent/agent.py b/contributing/samples/adk_team/adk_triaging_agent/agent.py index 22c75ca5d6..09eb728d97 100644 --- a/contributing/samples/adk_team/adk_triaging_agent/agent.py +++ b/contributing/samples/adk_team/adk_triaging_agent/agent.py @@ -29,13 +29,16 @@ "agent engine": "yeesian", "auth": "xuanyang15", "bq": "shobsi", + "cli": "wyf7107", "core": "Jacksunwei", "documentation": "joefernandez", "eval": "ankursharmas", + "integrations": "wukath", "live": "wuliang229", "mcp": "wukath", "models": "xuanyang15", "services": "DeanChensj", + "skills": "wukath", "tools": "xuanyang15", "tracing": "mhenc", "web": "wyf7107", @@ -63,8 +66,13 @@ - "live": Streaming, bidi, audio, or Gemini Live configuration. - "models": Non-Gemini model adapters (LiteLLM, Ollama, OpenAI, etc.). - "tracing": Telemetry, observability, structured logs, or spans. + - "cli": ADK CLI commands (e.g., create, deploy, eval) and CLI tools. + - "skills": GCP Skills Registry (`GCPSkillRegistry`), skill prompt models, + and dynamic skill toolsets. + - "integrations": Third-party integrations (e.g., CrewAI, LangChain, + Slack) excluding BigQuery. - "core": Core ADK runtime (Agent definitions, Runner, planners, - thinking config, CLI commands, GlobalInstructionPlugin, CPU usage, or + thinking config, GlobalInstructionPlugin, CPU usage, or general orchestration including agent transfer for multi-agents system). Default to "core" when the topic is about ADK behavior and no other label is a better fit. From 750ea83af6080ac22d4d1bbbb1e4bda3c74cb36d Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Wed, 3 Jun 2026 12:09:55 -0700 Subject: [PATCH 49/94] fix(runners): fall back to root agent when a resumed call author is not in the tree `Runner._find_agent_to_run` is annotated `-> BaseAgent` and documents that it "falls back to root agent if no suitable agents are found". But on a resumable resume from a function response it returned `root_agent.find_agent(event.author)` unconditionally, and `find_agent` returns `None` when `event.author` is not a node in the agent tree (host integrations commonly hydrate resumed or external events with `author='user'`). That `None` then flowed into `build_node(agent_to_run)` in `run_async`, raising `ValueError: Invalid node type: `. Fix: in the resumable branch, only short-circuit when `find_agent` resolves the author; otherwise fall through to the existing event scan and root-agent fallback. This matches the non-resumable branch (which already logs and falls back to root for unknown authors) and the method's documented contract, so the change only turns a guaranteed crash into the documented fallback. Add a regression test. PiperOrigin-RevId: 926184221 --- src/google/adk/runners.py | 10 +- tests/unittests/test_runners.py | 879 ++++++++++++++++++-------------- 2 files changed, 493 insertions(+), 396 deletions(-) diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index 573edecb6b..5b2f23fec7 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -1728,7 +1728,15 @@ def _find_agent_to_run( # shouldn't trap the next turn on that same agent if it's not transferable. # Falling through allows it to return to root. if event and event.author and is_resumable: - return root_agent.find_agent(event.author) + # `find_agent` returns None when the author does not correspond to any + # agent in the current hierarchy (e.g. the author is "user" or a stale or + # foreign agent name carried over from a previous turn/session). Returning + # None here would propagate to `build_node`, raising a confusing + # "Invalid node type: " error. Fall through to the + # event-scan logic below (which ultimately falls back to the root agent) + # whenever the author cannot be resolved. + if (resumed_agent := root_agent.find_agent(event.author)) is not None: + return resumed_agent def _event_filter(event: Event) -> bool: """Filters out user-authored events and agent state change events.""" diff --git a/tests/unittests/test_runners.py b/tests/unittests/test_runners.py index 5636bc294a..a658cb0f62 100644 --- a/tests/unittests/test_runners.py +++ b/tests/unittests/test_runners.py @@ -220,6 +220,369 @@ def setup_method(self): artifact_service=self.artifact_service, ) + def test_find_agent_to_run_with_function_response_scenario(self): + """Test finding agent when last event is function response.""" + # Create a function call from sub_agent1 + function_call = types.FunctionCall(id="func_123", name="test_func", args={}) + function_response = types.FunctionResponse( + id="func_123", name="test_func", response={} + ) + + call_event = Event( + invocation_id="inv1", + author="sub_agent1", + content=types.Content( + role="model", parts=[types.Part(function_call=function_call)] + ), + ) + + response_event = Event( + invocation_id="inv2", + author="user", + content=types.Content( + role="user", parts=[types.Part(function_response=function_response)] + ), + ) + + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[call_event, response_event], + ) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.sub_agent1 + + def test_find_agent_to_run_returns_root_agent_when_no_events(self): + """Test that root agent is returned when session has no non-user events.""" + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[ + Event( + invocation_id="inv1", + author="user", + content=types.Content( + role="user", parts=[types.Part(text="Hello")] + ), + ) + ], + ) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.root_agent + + def test_find_agent_to_run_returns_root_agent_when_found_in_events(self): + """Test that root agent is returned when it's found in session events.""" + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[ + Event( + invocation_id="inv1", + author="root_agent", + content=types.Content( + role="model", parts=[types.Part(text="Root response")] + ), + ) + ], + ) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.root_agent + + def test_find_agent_to_run_returns_transferable_sub_agent(self): + """Test that transferable sub agent is returned when found.""" + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[ + Event( + invocation_id="inv1", + author="sub_agent1", + content=types.Content( + role="model", parts=[types.Part(text="Sub agent response")] + ), + ) + ], + ) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.sub_agent1 + + def test_find_agent_to_run_skips_non_transferable_agent(self): + """Test that non-transferable agent is skipped and root agent is returned.""" + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[ + Event( + invocation_id="inv1", + author="non_transferable", + content=types.Content( + role="model", + parts=[types.Part(text="Non-transferable response")], + ), + ) + ], + ) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.root_agent + + def test_find_agent_to_run_skips_unknown_agent(self): + """Test that unknown agent is skipped and root agent is returned.""" + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[ + Event( + invocation_id="inv1", + author="unknown_agent", + content=types.Content( + role="model", + parts=[types.Part(text="Unknown agent response")], + ), + ), + Event( + invocation_id="inv2", + author="root_agent", + content=types.Content( + role="model", parts=[types.Part(text="Root response")] + ), + ), + ], + ) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.root_agent + + def test_find_agent_to_run_function_response_takes_precedence(self): + """Test that function response scenario takes precedence over other logic.""" + # Create a function call from sub_agent2 + function_call = types.FunctionCall(id="func_456", name="test_func", args={}) + function_response = types.FunctionResponse( + id="func_456", name="test_func", response={} + ) + + call_event = Event( + invocation_id="inv1", + author="sub_agent2", + content=types.Content( + role="model", parts=[types.Part(function_call=function_call)] + ), + ) + + # Add another event from root_agent + root_event = Event( + invocation_id="inv2", + author="root_agent", + content=types.Content( + role="model", parts=[types.Part(text="Root response")] + ), + ) + + response_event = Event( + invocation_id="inv3", + author="user", + content=types.Content( + role="user", parts=[types.Part(function_response=function_response)] + ), + ) + + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[call_event, root_event, response_event], + ) + + # Function-response routing only applies when resumability is enabled. + self.runner.resumability_config = ResumabilityConfig(is_resumable=True) + + # Should return sub_agent2 due to function response, not root_agent + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.sub_agent2 + + def test_find_agent_to_run_skips_function_response_when_not_resumable(self): + """Test that function response scenario is skipped when not resumable.""" + function_call = types.FunctionCall(id="func_456", name="test_func", args={}) + function_response = types.FunctionResponse( + id="func_456", name="test_func", response={} + ) + + call_event = Event( + invocation_id="inv1", + author="non_transferable", + content=types.Content( + role="model", parts=[types.Part(function_call=function_call)] + ), + ) + + response_event = Event( + invocation_id="inv2", + author="user", + content=types.Content( + role="user", parts=[types.Part(function_response=function_response)] + ), + ) + + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[call_event, response_event], + ) + + self.runner.resumability_config = ResumabilityConfig(is_resumable=False) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.root_agent + + def test_find_agent_to_run_uses_function_response_when_resumable(self): + """Test that function response scenario is used when resumable.""" + function_call = types.FunctionCall(id="func_456", name="test_func", args={}) + function_response = types.FunctionResponse( + id="func_456", name="test_func", response={} + ) + + call_event = Event( + invocation_id="inv1", + author="non_transferable", + content=types.Content( + role="model", parts=[types.Part(function_call=function_call)] + ), + ) + + response_event = Event( + invocation_id="inv2", + author="user", + content=types.Content( + role="user", parts=[types.Part(function_response=function_response)] + ), + ) + + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[call_event, response_event], + ) + + self.runner.resumability_config = ResumabilityConfig(is_resumable=True) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.non_transferable_agent + + def test_find_agent_to_run_resumable_unknown_function_call_author_falls_back( + self, + ): + """Resumable routing must not return None for an unknown call author. + + When the matching function-call event is authored by something that is not + an agent in the current hierarchy (e.g. "user", or a stale/foreign agent + name carried over from a previous turn/session), `find_agent` returns None. + Previously this None propagated to `build_node`, raising a confusing + "Invalid node type: " error. We now fall through to the + root agent instead. + """ + function_call = types.FunctionCall(id="func_456", name="test_func", args={}) + function_response = types.FunctionResponse( + id="func_456", name="test_func", response={} + ) + + # The function call is authored by "user", which is not an agent name. + call_event = Event( + invocation_id="inv1", + author="user", + content=types.Content( + role="model", parts=[types.Part(function_call=function_call)] + ), + ) + + response_event = Event( + invocation_id="inv2", + author="user", + content=types.Content( + role="user", parts=[types.Part(function_response=function_response)] + ), + ) + + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[call_event, response_event], + ) + + self.runner.resumability_config = ResumabilityConfig(is_resumable=True) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.root_agent + + def test_find_agent_to_run_resumable_stale_function_call_author_falls_back( + self, + ): + """Resumable routing falls back to root for a stale/foreign call author.""" + function_call = types.FunctionCall(id="func_789", name="test_func", args={}) + function_response = types.FunctionResponse( + id="func_789", name="test_func", response={} + ) + + # The function call is authored by an agent that is not in the hierarchy. + call_event = Event( + invocation_id="inv1", + author="agent_from_a_previous_session", + content=types.Content( + role="model", parts=[types.Part(function_call=function_call)] + ), + ) + + response_event = Event( + invocation_id="inv2", + author="user", + content=types.Content( + role="user", parts=[types.Part(function_response=function_response)] + ), + ) + + session = Session( + id="test_session", + user_id="test_user", + app_name="test_app", + events=[call_event, response_event], + ) + + self.runner.resumability_config = ResumabilityConfig(is_resumable=True) + + result = self.runner._find_agent_to_run(session, self.root_agent) + assert result == self.root_agent + + def test_is_transferable_across_agent_tree_with_llm_agent(self): + """Test _is_transferable_across_agent_tree with LLM agent.""" + result = self.runner._is_transferable_across_agent_tree(self.sub_agent1) + assert result is True + + def test_is_transferable_across_agent_tree_with_non_transferable_agent(self): + """Test _is_transferable_across_agent_tree with non-transferable agent.""" + result = self.runner._is_transferable_across_agent_tree( + self.non_transferable_agent + ) + assert result is False + + def test_is_transferable_across_agent_tree_with_non_llm_agent(self): + """Test _is_transferable_across_agent_tree with non-LLM agent.""" + non_llm_agent = MockAgent("non_llm_agent") + # MockAgent inherits from BaseAgent, not LlmAgent, so it should return False + result = self.runner._is_transferable_across_agent_tree(non_llm_agent) + assert result is False + @pytest.mark.asyncio async def test_session_not_found_message_includes_alignment_hint(): @@ -349,423 +712,147 @@ async def test_run_live_auto_create_session(): ) event = await agen.__anext__() - await agen.aclose() - - assert event.author == "live_agent" - assert event.content.parts[0].text == "live hello" - - # Session should have been created automatically. - session = await session_service.get_session( - app_name="live_app", user_id="user", session_id="missing" - ) - assert session is not None - - -@pytest.mark.asyncio -async def test_run_live_persists_event_callback_modifications(): - """run_live should persist the same event it streams after callback changes.""" - session_service = InMemorySessionService() - artifact_service = InMemoryArtifactService() - plugin = MockPlugin() - plugin.enable_event_callback = True - runner = Runner( - app_name="live_app", - agent=MockLiveAgent("live_agent"), - session_service=session_service, - artifact_service=artifact_service, - plugins=[plugin], - ) - await session_service.create_session( - app_name="live_app", user_id="user", session_id="live_session" - ) - - from google.adk.agents.live_request_queue import LiveRequestQueue - - live_queue = LiveRequestQueue() - agen = runner.run_live( - user_id="user", - session_id="live_session", - live_request_queue=live_queue, - ) - - streamed_event = await agen.__anext__() - await agen.aclose() - - session = await session_service.get_session( - app_name="live_app", user_id="user", session_id="live_session" - ) - persisted_event = session.events[0] - - assert streamed_event.author == "live_agent" - assert streamed_event.invocation_id - assert streamed_event.content.parts[0].text == ( - MockPlugin.ON_EVENT_CALLBACK_MSG - ) - assert streamed_event.custom_metadata == MockPlugin.ON_EVENT_CALLBACK_METADATA - - assert persisted_event.id == streamed_event.id - assert persisted_event.timestamp == streamed_event.timestamp - assert persisted_event.author == streamed_event.author - assert persisted_event.invocation_id == streamed_event.invocation_id - assert persisted_event.content.parts[0].text == ( - MockPlugin.ON_EVENT_CALLBACK_MSG - ) - assert ( - persisted_event.custom_metadata == MockPlugin.ON_EVENT_CALLBACK_METADATA - ) - - -@pytest.mark.asyncio -async def test_runner_allows_nested_agent_directories(tmp_path, monkeypatch): - project_root = tmp_path / "workspace" - agent_dir = project_root / "agents" / "examples" / "hello_world" - agent_dir.mkdir(parents=True) - # Make package structure importable. - for pkg_dir in [ - project_root / "agents", - project_root / "agents" / "examples", - agent_dir, - ]: - (pkg_dir / "__init__.py").write_text("", encoding="utf-8") - # Extra directories that previously confused origin inference, e.g. virtualenv. - (project_root / "agents" / ".venv").mkdir() - - agent_source = textwrap.dedent("""\ - from google.adk.events.event import Event - from google.adk.agents.base_agent import BaseAgent - from google.genai import types - - - class SimpleAgent(BaseAgent): - - def __init__(self): - super().__init__(name='simplest_agent', sub_agents=[]) - - async def _run_async_impl(self, invocation_context): - yield Event( - invocation_id=invocation_context.invocation_id, - author=self.name, - content=types.Content( - role='model', - parts=[types.Part(text='hello from nested')], - ), - ) - - - root_agent = SimpleAgent() - """) - (agent_dir / "agent.py").write_text(agent_source, encoding="utf-8") - - monkeypatch.chdir(project_root) - loader = AgentLoader(agents_dir="agents/examples") - loaded_agent = loader.load_agent("hello_world") - - assert isinstance(loaded_agent, BaseAgent) - session_service = InMemorySessionService() - artifact_service = InMemoryArtifactService() - runner = Runner( - app_name="hello_world", - agent=loaded_agent, - session_service=session_service, - artifact_service=artifact_service, - ) - assert runner._app_name_alignment_hint is None - - session = await session_service.create_session( - app_name="hello_world", - user_id="user", - ) - agen = runner.run_async( - user_id=session.user_id, - session_id=session.id, - new_message=types.Content( - role="user", - parts=[types.Part(text="hi")], - ), - ) - event = await agen.__anext__() - await agen.aclose() - - assert event.author == "simplest_agent" - assert event.content - assert event.content.parts - assert event.content.parts[0].text == "hello from nested" - - def test_find_agent_to_run_with_function_response_scenario(self): - """Test finding agent when last event is function response.""" - # Create a function call from sub_agent1 - function_call = types.FunctionCall(id="func_123", name="test_func", args={}) - function_response = types.FunctionResponse( - id="func_123", name="test_func", response={} - ) - - call_event = Event( - invocation_id="inv1", - author="sub_agent1", - content=types.Content( - role="model", parts=[types.Part(function_call=function_call)] - ), - ) - - response_event = Event( - invocation_id="inv2", - author="user", - content=types.Content( - role="user", parts=[types.Part(function_response=function_response)] - ), - ) - - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[call_event, response_event], - ) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.sub_agent1 - - def test_find_agent_to_run_returns_root_agent_when_no_events(self): - """Test that root agent is returned when session has no non-user events.""" - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[ - Event( - invocation_id="inv1", - author="user", - content=types.Content( - role="user", parts=[types.Part(text="Hello")] - ), - ) - ], - ) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.root_agent - - def test_find_agent_to_run_returns_root_agent_when_found_in_events(self): - """Test that root agent is returned when it's found in session events.""" - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[ - Event( - invocation_id="inv1", - author="root_agent", - content=types.Content( - role="model", parts=[types.Part(text="Root response")] - ), - ) - ], - ) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.root_agent - - def test_find_agent_to_run_returns_transferable_sub_agent(self): - """Test that transferable sub agent is returned when found.""" - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[ - Event( - invocation_id="inv1", - author="sub_agent1", - content=types.Content( - role="model", parts=[types.Part(text="Sub agent response")] - ), - ) - ], - ) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.sub_agent1 - - def test_find_agent_to_run_skips_non_transferable_agent(self): - """Test that non-transferable agent is skipped and root agent is returned.""" - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[ - Event( - invocation_id="inv1", - author="non_transferable", - content=types.Content( - role="model", - parts=[types.Part(text="Non-transferable response")], - ), - ) - ], - ) - - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.root_agent + await agen.aclose() - def test_find_agent_to_run_skips_unknown_agent(self): - """Test that unknown agent is skipped and root agent is returned.""" - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[ - Event( - invocation_id="inv1", - author="unknown_agent", - content=types.Content( - role="model", - parts=[types.Part(text="Unknown agent response")], - ), - ), - Event( - invocation_id="inv2", - author="root_agent", - content=types.Content( - role="model", parts=[types.Part(text="Root response")] - ), - ), - ], - ) + assert event.author == "live_agent" + assert event.content.parts[0].text == "live hello" - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.root_agent + # Session should have been created automatically. + session = await session_service.get_session( + app_name="live_app", user_id="user", session_id="missing" + ) + assert session is not None - def test_find_agent_to_run_function_response_takes_precedence(self): - """Test that function response scenario takes precedence over other logic.""" - # Create a function call from sub_agent2 - function_call = types.FunctionCall(id="func_456", name="test_func", args={}) - function_response = types.FunctionResponse( - id="func_456", name="test_func", response={} - ) - call_event = Event( - invocation_id="inv1", - author="sub_agent2", - content=types.Content( - role="model", parts=[types.Part(function_call=function_call)] - ), - ) +@pytest.mark.asyncio +async def test_run_live_persists_event_callback_modifications(): + """run_live should persist the same event it streams after callback changes.""" + session_service = InMemorySessionService() + artifact_service = InMemoryArtifactService() + plugin = MockPlugin() + plugin.enable_event_callback = True + runner = Runner( + app_name="live_app", + agent=MockLiveAgent("live_agent"), + session_service=session_service, + artifact_service=artifact_service, + plugins=[plugin], + ) + await session_service.create_session( + app_name="live_app", user_id="user", session_id="live_session" + ) - # Add another event from root_agent - root_event = Event( - invocation_id="inv2", - author="root_agent", - content=types.Content( - role="model", parts=[types.Part(text="Root response")] - ), - ) + from google.adk.agents.live_request_queue import LiveRequestQueue - response_event = Event( - invocation_id="inv3", - author="user", - content=types.Content( - role="user", parts=[types.Part(function_response=function_response)] - ), - ) + live_queue = LiveRequestQueue() + agen = runner.run_live( + user_id="user", + session_id="live_session", + live_request_queue=live_queue, + ) - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[call_event, root_event, response_event], - ) + streamed_event = await agen.__anext__() + await agen.aclose() - # Should return sub_agent2 due to function response, not root_agent - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.sub_agent2 + session = await session_service.get_session( + app_name="live_app", user_id="user", session_id="live_session" + ) + persisted_event = session.events[0] - def test_find_agent_to_run_skips_function_response_when_not_resumable(self): - """Test that function response scenario is skipped when not resumable.""" - function_call = types.FunctionCall(id="func_456", name="test_func", args={}) - function_response = types.FunctionResponse( - id="func_456", name="test_func", response={} - ) + assert streamed_event.author == "live_agent" + assert streamed_event.invocation_id + assert streamed_event.content.parts[0].text == ( + MockPlugin.ON_EVENT_CALLBACK_MSG + ) + assert streamed_event.custom_metadata == MockPlugin.ON_EVENT_CALLBACK_METADATA - call_event = Event( - invocation_id="inv1", - author="non_transferable", - content=types.Content( - role="model", parts=[types.Part(function_call=function_call)] - ), - ) + assert persisted_event.id == streamed_event.id + assert persisted_event.timestamp == streamed_event.timestamp + assert persisted_event.author == streamed_event.author + assert persisted_event.invocation_id == streamed_event.invocation_id + assert persisted_event.content.parts[0].text == ( + MockPlugin.ON_EVENT_CALLBACK_MSG + ) + assert ( + persisted_event.custom_metadata == MockPlugin.ON_EVENT_CALLBACK_METADATA + ) - response_event = Event( - invocation_id="inv2", - author="user", - content=types.Content( - role="user", parts=[types.Part(function_response=function_response)] - ), - ) - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[call_event, response_event], - ) +@pytest.mark.asyncio +async def test_runner_allows_nested_agent_directories(tmp_path, monkeypatch): + project_root = tmp_path / "workspace" + agent_dir = project_root / "agents" / "examples" / "hello_world" + agent_dir.mkdir(parents=True) + # Make package structure importable. + for pkg_dir in [ + project_root / "agents", + project_root / "agents" / "examples", + agent_dir, + ]: + (pkg_dir / "__init__.py").write_text("", encoding="utf-8") + # Extra directories that previously confused origin inference, e.g. virtualenv. + (project_root / "agents" / ".venv").mkdir() - self.runner.resumability_config = ResumabilityConfig(is_resumable=False) + agent_source = textwrap.dedent("""\ + from google.adk.events.event import Event + from google.adk.agents.base_agent import BaseAgent + from google.genai import types - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.root_agent - def test_find_agent_to_run_uses_function_response_when_resumable(self): - """Test that function response scenario is used when resumable.""" - function_call = types.FunctionCall(id="func_456", name="test_func", args={}) - function_response = types.FunctionResponse( - id="func_456", name="test_func", response={} - ) + class SimpleAgent(BaseAgent): - call_event = Event( - invocation_id="inv1", - author="non_transferable", - content=types.Content( - role="model", parts=[types.Part(function_call=function_call)] - ), - ) + def __init__(self): + super().__init__(name='simplest_agent', sub_agents=[]) - response_event = Event( - invocation_id="inv2", - author="user", - content=types.Content( - role="user", parts=[types.Part(function_response=function_response)] - ), - ) + async def _run_async_impl(self, invocation_context): + yield Event( + invocation_id=invocation_context.invocation_id, + author=self.name, + content=types.Content( + role='model', + parts=[types.Part(text='hello from nested')], + ), + ) - session = Session( - id="test_session", - user_id="test_user", - app_name="test_app", - events=[call_event, response_event], - ) - self.runner.resumability_config = ResumabilityConfig(is_resumable=True) + root_agent = SimpleAgent() + """) + (agent_dir / "agent.py").write_text(agent_source, encoding="utf-8") - result = self.runner._find_agent_to_run(session, self.root_agent) - assert result == self.non_transferable_agent + monkeypatch.chdir(project_root) + loader = AgentLoader(agents_dir="agents/examples") + loaded_agent = loader.load_agent("hello_world") - def test_is_transferable_across_agent_tree_with_llm_agent(self): - """Test _is_transferable_across_agent_tree with LLM agent.""" - result = self.runner._is_transferable_across_agent_tree(self.sub_agent1) - assert result is True + assert isinstance(loaded_agent, BaseAgent) + session_service = InMemorySessionService() + artifact_service = InMemoryArtifactService() + runner = Runner( + app_name="hello_world", + agent=loaded_agent, + session_service=session_service, + artifact_service=artifact_service, + ) + assert runner._app_name_alignment_hint is None - def test_is_transferable_across_agent_tree_with_non_transferable_agent(self): - """Test _is_transferable_across_agent_tree with non-transferable agent.""" - result = self.runner._is_transferable_across_agent_tree( - self.non_transferable_agent - ) - assert result is False + session = await session_service.create_session( + app_name="hello_world", + user_id="user", + ) + agen = runner.run_async( + user_id=session.user_id, + session_id=session.id, + new_message=types.Content( + role="user", + parts=[types.Part(text="hi")], + ), + ) + event = await agen.__anext__() + await agen.aclose() - def test_is_transferable_across_agent_tree_with_non_llm_agent(self): - """Test _is_transferable_across_agent_tree with non-LLM agent.""" - non_llm_agent = MockAgent("non_llm_agent") - # MockAgent inherits from BaseAgent, not LlmAgent, so it should return False - result = self.runner._is_transferable_across_agent_tree(non_llm_agent) - assert result is False + assert event.author == "simplest_agent" + assert event.content + assert event.content.parts + assert event.content.parts[0].text == "hello from nested" @pytest.mark.asyncio @@ -1153,7 +1240,9 @@ def test_runner_realistic_cache_config_scenario(self): """Test realistic scenario with production-like cache config.""" # Production cache config production_cache_config = ContextCacheConfig( - cache_intervals=30, ttl_seconds=14400, min_tokens=4096 # 4 hours + cache_intervals=30, + ttl_seconds=14400, + min_tokens=4096, # 4 hours ) app = App( From 7fd75b2bbcb9e767fc90fd5cd69a93fd055b8eff Mon Sep 17 00:00:00 2001 From: Tongzhou Jiang Date: Wed, 3 Jun 2026 14:45:26 -0700 Subject: [PATCH 50/94] feat: Distinguish between input-required and auth-required states in A2A to ADK conversion PiperOrigin-RevId: 926278332 --- src/google/adk/a2a/converters/to_adk_event.py | 49 ++++++++++++------- src/google/adk/agents/remote_a2a_agent.py | 24 +++++---- tests/unittests/a2a/converters/test_to_adk.py | 44 +++++++++++++++++ 3 files changed, 91 insertions(+), 26 deletions(-) diff --git a/src/google/adk/a2a/converters/to_adk_event.py b/src/google/adk/a2a/converters/to_adk_event.py index eab89c20f5..a28330a19b 100644 --- a/src/google/adk/a2a/converters/to_adk_event.py +++ b/src/google/adk/a2a/converters/to_adk_event.py @@ -46,6 +46,9 @@ MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT = ( "mock_function_call_for_required_user_input" ) +MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH = ( + "mock_function_call_for_required_user_auth" +) A2AMessageToEventConverter = Callable[ [ @@ -289,24 +292,36 @@ def _create_mock_function_call_for_required_user_input( This solution allows to unblock the A2A integration with non-ADK agents from ADK side by replacing the last text part with a synthetic function call. All - other parts are preserved. + other parts are preserved. The args key used on the synthetic function call + differs depending on whether the task is in input-required or auth-required + state, so downstream consumers can distinguish between the two. """ - if ( - state == TaskState.input_required or state == TaskState.auth_required - ) and (not long_running_function_ids or len(long_running_function_ids) == 0): - # Find the last text part from the bottom to replace it with a function call. - # In case of input-required events, the LLM should stop the production of other parts. - for i in range(len(output_parts) - 1, -1, -1): - if output_parts[i].text: - function_call = genai_types.FunctionCall( - id=str(uuid.uuid4()), - name=MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT, - args={"input_required": output_parts[i].text}, - ) - long_running_function_ids = set() - long_running_function_ids.add(function_call.id) - output_parts[i] = genai_types.Part(function_call=function_call) - break + if long_running_function_ids: + return output_parts, long_running_function_ids + + if state == TaskState.input_required: + args_key = "input_required" + function_name = MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT + elif state == TaskState.auth_required: + args_key = "auth_required" + function_name = MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH + else: + return output_parts, long_running_function_ids + + # Find the last text part from the bottom to replace it with a function call. + # In case of input-required / auth-required events, the LLM should stop the + # production of other parts. + for i in range(len(output_parts) - 1, -1, -1): + if output_parts[i].text: + function_call = genai_types.FunctionCall( + id=str(uuid.uuid4()), + name=function_name, + args={args_key: output_parts[i].text}, + ) + long_running_function_ids = set() + long_running_function_ids.add(function_call.id) + output_parts[i] = genai_types.Part(function_call=function_call) + break return output_parts, long_running_function_ids diff --git a/src/google/adk/agents/remote_a2a_agent.py b/src/google/adk/agents/remote_a2a_agent.py index 495a715d76..dbbc30558f 100644 --- a/src/google/adk/agents/remote_a2a_agent.py +++ b/src/google/adk/agents/remote_a2a_agent.py @@ -66,6 +66,7 @@ from ..a2a.converters.part_converter import convert_genai_part_to_a2a_part from ..a2a.converters.part_converter import GenAIPartToA2APartConverter from ..a2a.converters.to_adk_event import _create_mock_function_call_for_required_user_input +from ..a2a.converters.to_adk_event import MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH from ..a2a.converters.to_adk_event import MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT from ..a2a.converters.utils import _get_adk_metadata_key from ..a2a.experimental import a2a_experimental @@ -380,23 +381,28 @@ def _create_a2a_request_for_user_function_response( event = ctx.session.events[-1] # If the user function_response replies to a function_call for non-ADK - # input-required events (fc.name = MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT), - # the function_response part is replaced with text extracted from the - # function response. - # The implementation is based on the assumption that the user function_response - # event will contain a function_response with the name - # MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT and the response will - # contain a "result" field with the user input as a string text. + # input-required / auth-required events (fc.name in + # {MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT, + # MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH}), the function_response part + # is replaced with text extracted from the function response. + # The implementation is based on the assumption that the user + # function_response event will contain a function_response with one of + # those names and the response will contain a "result" field with the user + # input as a string text. + mock_function_call_names = { + MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT, + MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH, + } mock_function_call = [ fc for fc in function_call_event.get_function_calls() - if fc.name == MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT + if fc.name in mock_function_call_names ] if mock_function_call: new_parts = [] for function_response in event.get_function_responses(): if ( - function_response.name == MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT + function_response.name in mock_function_call_names and function_response.response and "result" in function_response.response ): diff --git a/tests/unittests/a2a/converters/test_to_adk.py b/tests/unittests/a2a/converters/test_to_adk.py index 3ab60f097d..1e23af7a1b 100644 --- a/tests/unittests/a2a/converters/test_to_adk.py +++ b/tests/unittests/a2a/converters/test_to_adk.py @@ -30,6 +30,7 @@ from google.adk.a2a.converters.to_adk_event import convert_a2a_message_to_event from google.adk.a2a.converters.to_adk_event import convert_a2a_status_update_to_event from google.adk.a2a.converters.to_adk_event import convert_a2a_task_to_event +from google.adk.a2a.converters.to_adk_event import MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH from google.adk.a2a.converters.to_adk_event import MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_INPUT from google.adk.a2a.converters.utils import _get_adk_metadata_key from google.adk.agents.invocation_context import InvocationContext @@ -340,6 +341,49 @@ def test_convert_a2a_task_to_event_merges_status_and_artifact_actions(self): == "need input" ) + def test_convert_a2a_task_to_event_auth_required_uses_auth_args_key(self): + """Test auth-required state populates the function call with auth args.""" + a2a_part = Mock(spec=A2APart) + a2a_part.root = Mock(spec=TextPart) + a2a_part.root.metadata = {} + task = Task( + id="task-1", + context_id="context-1", + kind="task", + status=TaskStatus( + state=TaskState.auth_required, + timestamp="now", + message=Message( + message_id="m1", + role="agent", + parts=[a2a_part], + ), + ), + ) + + mock_genai_part = genai_types.Part.from_text(text="need auth") + + event = convert_a2a_task_to_event( + task, + author="test-author", + invocation_context=self.mock_context, + part_converter=Mock(return_value=[mock_genai_part]), + ) + + assert event is not None + assert event.content is not None + assert ( + event.content.parts[0].function_call.name + == MOCK_FUNCTION_CALL_FOR_REQUIRED_USER_AUTH + ) + # auth_required state should populate the auth_required arg key, not + # input_required. + assert ( + event.content.parts[0].function_call.args["auth_required"] + == "need auth" + ) + assert "input_required" not in event.content.parts[0].function_call.args + def test_convert_a2a_task_to_event_multiple_parts_replaces_last_text(self): """Test converting A2A task with multiple text parts, only replacing the last text.""" part1 = Mock(spec=A2APart) From a1b7a4b7e03df4e333b3a956dea71106e26aa906 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Thu, 4 Jun 2026 11:53:50 -0700 Subject: [PATCH 51/94] feat: Preserved A2A message metadata field into ADK event PiperOrigin-RevId: 926808937 --- .../adk/a2a/converters/part_converter.py | 106 ++++++++++++------ .../a2a/converters/test_part_converter.py | 46 ++++++++ .../unittests/agents/test_remote_a2a_agent.py | 2 + 3 files changed, 119 insertions(+), 35 deletions(-) diff --git a/src/google/adk/a2a/converters/part_converter.py b/src/google/adk/a2a/converters/part_converter.py index cb7eb688cd..94122c20ba 100644 --- a/src/google/adk/a2a/converters/part_converter.py +++ b/src/google/adk/a2a/converters/part_converter.py @@ -64,7 +64,9 @@ def convert_a2a_part_to_genai_part( thought = None if part.metadata: thought = part.metadata.get(_get_adk_metadata_key('thought')) - return genai_types.Part(text=part.text, thought=thought) + return genai_types.Part( + text=part.text, thought=thought, part_metadata=part.metadata + ) if isinstance(part, a2a_types.FilePart): if isinstance(part.file, a2a_types.FileWithUri): @@ -73,7 +75,8 @@ def convert_a2a_part_to_genai_part( file_uri=part.file.uri, mime_type=part.file.mime_type, display_name=part.file.name, - ) + ), + part_metadata=part.metadata, ) elif isinstance(part.file, a2a_types.FileWithBytes): @@ -82,7 +85,8 @@ def convert_a2a_part_to_genai_part( data=base64.b64decode(part.file.bytes), mime_type=part.file.mime_type, display_name=part.file.name, - ) + ), + part_metadata=part.metadata, ) else: logger.warning( @@ -126,6 +130,7 @@ def convert_a2a_part_to_genai_part( part.data, by_alias=True ), thought_signature=thought_signature, + part_metadata=part.metadata, ) if ( part.metadata[_get_adk_metadata_key(A2A_DATA_PART_METADATA_TYPE_KEY)] @@ -134,7 +139,8 @@ def convert_a2a_part_to_genai_part( return genai_types.Part( function_response=genai_types.FunctionResponse.model_validate( part.data, by_alias=True - ) + ), + part_metadata=part.metadata, ) if ( part.metadata[_get_adk_metadata_key(A2A_DATA_PART_METADATA_TYPE_KEY)] @@ -143,7 +149,8 @@ def convert_a2a_part_to_genai_part( return genai_types.Part( code_execution_result=genai_types.CodeExecutionResult.model_validate( part.data, by_alias=True - ) + ), + part_metadata=part.metadata, ) if ( part.metadata[_get_adk_metadata_key(A2A_DATA_PART_METADATA_TYPE_KEY)] @@ -152,7 +159,8 @@ def convert_a2a_part_to_genai_part( return genai_types.Part( executable_code=genai_types.ExecutableCode.model_validate( part.data, by_alias=True - ) + ), + part_metadata=part.metadata, ) return genai_types.Part( inline_data=genai_types.Blob( @@ -162,7 +170,8 @@ def convert_a2a_part_to_genai_part( ) + A2A_DATA_PART_END_TAG, mime_type=A2A_DATA_PART_TEXT_MIME_TYPE, - ) + ), + part_metadata=part.metadata, ) logger.warning( @@ -179,22 +188,34 @@ def convert_genai_part_to_a2a_part( ) -> Optional[a2a_types.Part]: """Convert a Google GenAI Part to an A2A Part.""" + def add_metadata_to_a2a_part( + a2a_part: a2a_types.Part, + metadata: dict[str, Any], + ) -> None: + """Adds metadata to an A2A part.""" + if a2a_part.metadata is None: + a2a_part.metadata = {} + a2a_part.metadata.update(metadata) + if part.text is not None: a2a_part = a2a_types.TextPart(text=part.text) if part.thought is not None: a2a_part.metadata = {_get_adk_metadata_key('thought'): part.thought} + if part.part_metadata: + add_metadata_to_a2a_part(a2a_part, part.part_metadata) return a2a_types.Part(root=a2a_part) if part.file_data: - return a2a_types.Part( - root=a2a_types.FilePart( - file=a2a_types.FileWithUri( - uri=part.file_data.file_uri, - mime_type=part.file_data.mime_type, - name=part.file_data.display_name, - ) + a2a_part = a2a_types.FilePart( + file=a2a_types.FileWithUri( + uri=part.file_data.file_uri, + mime_type=part.file_data.mime_type, + name=part.file_data.display_name, ) ) + if part.part_metadata: + add_metadata_to_a2a_part(a2a_part, part.part_metadata) + return a2a_types.Part(root=a2a_part) if part.inline_data: if ( @@ -203,13 +224,14 @@ def convert_genai_part_to_a2a_part( and part.inline_data.data.startswith(A2A_DATA_PART_START_TAG) and part.inline_data.data.endswith(A2A_DATA_PART_END_TAG) ): - return a2a_types.Part( - root=a2a_types.DataPart.model_validate_json( - part.inline_data.data[ - len(A2A_DATA_PART_START_TAG) : -len(A2A_DATA_PART_END_TAG) - ] - ) + a2a_part = a2a_types.DataPart.model_validate_json( + part.inline_data.data[ + len(A2A_DATA_PART_START_TAG) : -len(A2A_DATA_PART_END_TAG) + ] ) + if part.part_metadata: + add_metadata_to_a2a_part(a2a_part, part.part_metadata) + return a2a_types.Part(root=a2a_part) # The default case for inline_data is to convert it to FileWithBytes. a2a_part = a2a_types.FilePart( file=a2a_types.FileWithBytes( @@ -226,6 +248,9 @@ def convert_genai_part_to_a2a_part( ): part.video_metadata.model_dump(by_alias=True, exclude_none=True) } + if part.part_metadata: + add_metadata_to_a2a_part(a2a_part, part.part_metadata) + return a2a_types.Part(root=a2a_part) # Convert the funcall and function response to A2A DataPart. @@ -244,6 +269,8 @@ def convert_genai_part_to_a2a_part( fc_metadata[_get_adk_metadata_key('thought_signature')] = ( base64.b64encode(part.thought_signature).decode('utf-8') ) + if part.part_metadata: + fc_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.function_call.model_dump( @@ -254,44 +281,53 @@ def convert_genai_part_to_a2a_part( ) if part.function_response: + fr_metadata = { + _get_adk_metadata_key( + A2A_DATA_PART_METADATA_TYPE_KEY + ): A2A_DATA_PART_METADATA_TYPE_FUNCTION_RESPONSE + } + if part.part_metadata: + fr_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.function_response.model_dump( by_alias=True, exclude_none=True ), - metadata={ - _get_adk_metadata_key( - A2A_DATA_PART_METADATA_TYPE_KEY - ): A2A_DATA_PART_METADATA_TYPE_FUNCTION_RESPONSE - }, + metadata=fr_metadata, ) ) if part.code_execution_result: + cer_metadata = { + _get_adk_metadata_key( + A2A_DATA_PART_METADATA_TYPE_KEY + ): A2A_DATA_PART_METADATA_TYPE_CODE_EXECUTION_RESULT + } + if part.part_metadata: + cer_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.code_execution_result.model_dump( by_alias=True, exclude_none=True ), - metadata={ - _get_adk_metadata_key( - A2A_DATA_PART_METADATA_TYPE_KEY - ): A2A_DATA_PART_METADATA_TYPE_CODE_EXECUTION_RESULT - }, + metadata=cer_metadata, ) ) if part.executable_code: + ec_metadata = { + _get_adk_metadata_key( + A2A_DATA_PART_METADATA_TYPE_KEY + ): A2A_DATA_PART_METADATA_TYPE_EXECUTABLE_CODE + } + if part.part_metadata: + ec_metadata.update(part.part_metadata) return a2a_types.Part( root=a2a_types.DataPart( data=part.executable_code.model_dump( by_alias=True, exclude_none=True ), - metadata={ - _get_adk_metadata_key( - A2A_DATA_PART_METADATA_TYPE_KEY - ): A2A_DATA_PART_METADATA_TYPE_EXECUTABLE_CODE - }, + metadata=ec_metadata, ) ) diff --git a/tests/unittests/a2a/converters/test_part_converter.py b/tests/unittests/a2a/converters/test_part_converter.py index f921b7e061..842c550dea 100644 --- a/tests/unittests/a2a/converters/test_part_converter.py +++ b/tests/unittests/a2a/converters/test_part_converter.py @@ -739,6 +739,52 @@ def test_data_part_with_mime_type_metadata_round_trip(self): # The 'mime_type' key in the metadata should be preserved as is assert result_a2a_part.root.metadata == metadata + def test_text_part_metadata_round_trip(self): + """Test round-trip conversion for text parts with metadata.""" + # Arrange + metadata = {"key1": "value1", "key2": "value2"} + a2a_part = a2a_types.Part( + root=a2a_types.TextPart(text="some text", metadata=metadata) + ) + + # Act + genai_part = convert_a2a_part_to_genai_part(a2a_part) + result_a2a_part = convert_genai_part_to_a2a_part(genai_part) + + # Assert + assert result_a2a_part is not None + assert isinstance(result_a2a_part, a2a_types.Part) + assert isinstance(result_a2a_part.root, a2a_types.TextPart) + assert result_a2a_part.root.text == "some text" + assert result_a2a_part.root.metadata == metadata + + def test_file_part_metadata_round_trip(self): + """Test round-trip conversion for file parts with metadata.""" + # Arrange + metadata = {"key1": "value1"} + a2a_part = a2a_types.Part( + root=a2a_types.FilePart( + file=a2a_types.FileWithUri( + uri="gs://bucket/file.txt", + mime_type="text/plain", + name="my_file.txt", + ), + metadata=metadata, + ) + ) + + # Act + genai_part = convert_a2a_part_to_genai_part(a2a_part) + result_a2a_part = convert_genai_part_to_a2a_part(genai_part) + + # Assert + assert result_a2a_part is not None + assert isinstance(result_a2a_part, a2a_types.Part) + assert isinstance(result_a2a_part.root, a2a_types.FilePart) + assert isinstance(result_a2a_part.root.file, a2a_types.FileWithUri) + assert result_a2a_part.root.file.uri == "gs://bucket/file.txt" + assert result_a2a_part.root.metadata == metadata + class TestEdgeCases: """Test cases for edge cases and error conditions.""" diff --git a/tests/unittests/agents/test_remote_a2a_agent.py b/tests/unittests/agents/test_remote_a2a_agent.py index 073ad36d9f..8a38e452b2 100644 --- a/tests/unittests/agents/test_remote_a2a_agent.py +++ b/tests/unittests/agents/test_remote_a2a_agent.py @@ -2539,6 +2539,7 @@ async def test_full_workflow_with_direct_agent_card(self): # Mock session with text event mock_part = Mock() mock_part.text = "Hello world" + mock_part.part_metadata = None mock_content = Mock() mock_content.parts = [mock_part] @@ -2636,6 +2637,7 @@ async def test_full_workflow_with_direct_agent_card_and_factory(self): # Mock session with text event mock_part = Mock() mock_part.text = "Hello world" + mock_part.part_metadata = {"test": "part_metadata"} mock_content = Mock() mock_content.parts = [mock_part] From 061d20c6d9260cb12319fa5ffadff895e46e8b7e Mon Sep 17 00:00:00 2001 From: George Weale Date: Thu, 4 Jun 2026 12:43:34 -0700 Subject: [PATCH 52/94] fix: scope telemetry metric assertions to the test's own agent test_metrics reads a process-global meter provider, so a leaked agent invocation from an earlier test can add a stray data point and trip the len() assertions (flaky on python 3.10). Filter extracted points to the agent under test. Co-authored-by: George Weale PiperOrigin-RevId: 926834215 --- tests/unittests/telemetry/test_functional.py | 23 ++++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/tests/unittests/telemetry/test_functional.py b/tests/unittests/telemetry/test_functional.py index f42242f787..99895eb7c7 100644 --- a/tests/unittests/telemetry/test_functional.py +++ b/tests/unittests/telemetry/test_functional.py @@ -212,13 +212,18 @@ class MetricPoint: def _extract_metrics( - metrics_list: Sequence[Metric], name: str + metrics_list: Sequence[Metric], name: str, agent_name: str | None = None ) -> list[MetricPoint]: m = next((m for m in metrics_list if m.name == name), None) if not m: return [] points = [] for dp in m.data.data_points: + if ( + agent_name is not None + and dp.attributes.get("gen_ai.agent.name") != agent_name + ): + continue value = None if hasattr(dp, "sum"): value = dp.sum @@ -300,7 +305,7 @@ async def generate_random_number(): assert len(scope_metrics) > 0 metrics_list = scope_metrics[0].metrics got_invocation = _extract_metrics( - metrics_list, "gen_ai.agent.invocation.duration" + metrics_list, "gen_ai.agent.invocation.duration", "complex_agent" ) assert len(got_invocation) == 1 for p in got_invocation: @@ -315,7 +320,7 @@ async def generate_random_number(): ] assert got_invocation == want_invocation got_tool_exec = _extract_metrics( - metrics_list, "gen_ai.tool.execution.duration" + metrics_list, "gen_ai.tool.execution.duration", "complex_agent" ) assert len(got_tool_exec) == 2 for p in got_tool_exec: @@ -339,7 +344,9 @@ async def generate_random_number(): got_tool_exec.sort(key=lambda p: p.attributes.get("gen_ai.tool.name", "")) want_tool_exec.sort(key=lambda p: p.attributes.get("gen_ai.tool.name", "")) assert got_tool_exec == want_tool_exec - got_steps = _extract_metrics(metrics_list, "gen_ai.agent.workflow.steps") + got_steps = _extract_metrics( + metrics_list, "gen_ai.agent.workflow.steps", "complex_agent" + ) assert len(got_steps) == 1 want_steps = [ # (tool call + result) x 2 + text response = 5 steps @@ -348,7 +355,7 @@ async def generate_random_number(): assert got_steps == want_steps got_client_duration = _extract_metrics( - metrics_list, "gen_ai.client.operation.duration" + metrics_list, "gen_ai.client.operation.duration", "complex_agent" ) assert len(got_client_duration) == 1 for p in got_client_duration: @@ -368,7 +375,7 @@ async def generate_random_number(): assert got_client_duration == want_client_duration got_client_tokens = _extract_metrics( - metrics_list, "gen_ai.client.token.usage" + metrics_list, "gen_ai.client.token.usage", "complex_agent" ) assert len(got_client_tokens) == 2 want_client_tokens = [ @@ -435,7 +442,9 @@ async def failing_tool(): metrics_list = metrics_data.resource_metrics[0].scope_metrics[0].metrics # Verify Tool Execution Duration - got = _extract_metrics(metrics_list, "gen_ai.tool.execution.duration") + got = _extract_metrics( + metrics_list, "gen_ai.tool.execution.duration", "error_agent" + ) assert len(got) == 2 for p in got: p.value = None From 8b564f502ee5649c62fc54343868df7999f218f3 Mon Sep 17 00:00:00 2001 From: George Weale Date: Thu, 4 Jun 2026 13:36:57 -0700 Subject: [PATCH 53/94] fix: block path traversal in Agent Builder file tools Constrain resolved file paths to the project root so the write, read, and delete tools cannot escape it via `..` segments or absolute paths. Co-authored-by: George Weale PiperOrigin-RevId: 926861123 --- .../utils/resolve_root_directory.py | 36 +++-- .../test_adk_web_server_import_isolation.py | 50 +++++++ .../cli/test_resolve_root_directory.py | 140 ++++++++++++++++++ 3 files changed, 213 insertions(+), 13 deletions(-) create mode 100644 tests/unittests/cli/test_adk_web_server_import_isolation.py create mode 100644 tests/unittests/cli/test_resolve_root_directory.py diff --git a/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py b/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py index ca7398733f..09027fa44b 100644 --- a/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py +++ b/src/google/adk/cli/built_in_agents/utils/resolve_root_directory.py @@ -42,33 +42,43 @@ def resolve_file_path( working_directory: Working directory to use as base (defaults to cwd) Returns: - Resolved absolute Path object + Resolved absolute Path object, guaranteed to be within the root directory. + + Raises: + ValueError: If ``file_path`` resolves outside the root directory, e.g. via + ``..`` traversal or an absolute path pointing outside the root. """ normalized_path = sanitize_generated_file_path(file_path) file_path_obj = Path(normalized_path) - # If already absolute, use as-is - if file_path_obj.is_absolute(): - return file_path_obj - # Get root directory from session state, default to "./" root_directory = "./" if session_state and "root_directory" in session_state: root_directory = session_state["root_directory"] - # Use the same resolution logic as the main function root_path_obj = Path(root_directory) - if root_path_obj.is_absolute(): resolved_root = root_path_obj + elif working_directory: + resolved_root = Path(working_directory) / root_directory else: - if working_directory: - resolved_root = Path(working_directory) / root_directory - else: - resolved_root = Path(os.getcwd()) / root_directory + resolved_root = Path(os.getcwd()) / root_directory + resolved_root = resolved_root.resolve() - # Resolve file path relative to root directory - return resolved_root / file_path_obj + if file_path_obj.is_absolute(): + candidate = file_path_obj.resolve() + else: + candidate = (resolved_root / file_path_obj).resolve() + + # Keep the resolved path within the root to block path-traversal escapes. + try: + candidate.relative_to(resolved_root) + except ValueError as exc: + raise ValueError( + f"File path {file_path!r} resolves outside the root directory" + f" {resolved_root}." + ) from exc + return candidate def resolve_file_paths( diff --git a/tests/unittests/cli/test_adk_web_server_import_isolation.py b/tests/unittests/cli/test_adk_web_server_import_isolation.py new file mode 100644 index 0000000000..8134330403 --- /dev/null +++ b/tests/unittests/cli/test_adk_web_server_import_isolation.py @@ -0,0 +1,50 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Import-isolation guard for adk_web_server. + +Importing ``adk_web_server`` must not eagerly pull in the Agent Builder agent +stack. Doing so reaches ``google.adk.agents`` at import time and breaks +downstream consumers that import ``adk_web_server`` while ``google.adk.agents`` +is still initializing. +""" + +from __future__ import annotations + +import subprocess +import sys + + +def test_importing_adk_web_server_does_not_import_agent_builder(): + # Run in a fresh interpreter so the check is not polluted by modules that + # other tests already imported into sys.modules. + code = ( + "import google.adk.cli.adk_web_server\n" + "import sys\n" + "forbidden = [\n" + " 'google.adk.cli.built_in_agents.agent',\n" + " 'google.adk.cli.built_in_agents.adk_agent_builder_assistant',\n" + "]\n" + "loaded = [name for name in forbidden if name in sys.modules]\n" + "assert not loaded, loaded\n" + ) + + result = subprocess.run( + [sys.executable, "-c", code], + capture_output=True, + text=True, + check=False, + ) + + assert result.returncode == 0, result.stderr diff --git a/tests/unittests/cli/test_resolve_root_directory.py b/tests/unittests/cli/test_resolve_root_directory.py new file mode 100644 index 0000000000..b442be8cbe --- /dev/null +++ b/tests/unittests/cli/test_resolve_root_directory.py @@ -0,0 +1,140 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Path-traversal containment tests for Agent Builder file tools.""" + +from __future__ import annotations + +import os +from pathlib import Path +from unittest import mock + +from google.adk.cli.built_in_agents.tools.delete_files import delete_files +from google.adk.cli.built_in_agents.tools.read_files import read_files +from google.adk.cli.built_in_agents.tools.write_files import write_files +from google.adk.cli.built_in_agents.utils.resolve_root_directory import resolve_file_path +import pytest + + +def _tool_context(root: Path) -> mock.MagicMock: + tool_context = mock.MagicMock() + tool_context._invocation_context.session.state = {"root_directory": str(root)} + return tool_context + + +def test_resolve_file_path_allows_path_within_root(tmp_path): + resolved = resolve_file_path( + "sub/dir/file.txt", {"root_directory": str(tmp_path)} + ) + assert resolved == (tmp_path / "sub" / "dir" / "file.txt").resolve() + + +def test_resolve_file_path_allows_dot(tmp_path): + resolved = resolve_file_path(".", {"root_directory": str(tmp_path)}) + assert resolved == tmp_path.resolve() + + +def test_resolve_file_path_allows_interior_dotdot_within_root(tmp_path): + resolved = resolve_file_path( + "sub/../file.txt", {"root_directory": str(tmp_path)} + ) + assert resolved == (tmp_path / "file.txt").resolve() + + +def test_resolve_file_path_allows_absolute_within_root(tmp_path): + target = tmp_path / "nested" / "ok.txt" + resolved = resolve_file_path(str(target), {"root_directory": str(tmp_path)}) + assert resolved == target.resolve() + + +def test_resolve_file_path_rejects_relative_traversal(tmp_path): + with pytest.raises(ValueError): + resolve_file_path("../../escape.txt", {"root_directory": str(tmp_path)}) + + +def test_resolve_file_path_rejects_absolute_outside_root(tmp_path): + with pytest.raises(ValueError): + resolve_file_path("/etc/passwd", {"root_directory": str(tmp_path)}) + + +async def test_write_files_blocks_relative_traversal( + tmp_path, tmp_path_factory +): + outside = tmp_path_factory.mktemp("outside") + payload = os.path.relpath(outside / "pwned.txt", tmp_path) + + result = await write_files( + files={payload: "PWNED"}, tool_context=_tool_context(tmp_path) + ) + + assert not result["success"] + assert not (outside / "pwned.txt").exists() + + +async def test_write_files_blocks_absolute_outside_root( + tmp_path, tmp_path_factory +): + outside = tmp_path_factory.mktemp("outside") + target = outside / "abs.txt" + + result = await write_files( + files={str(target): "PWNED"}, tool_context=_tool_context(tmp_path) + ) + + assert not result["success"] + assert not target.exists() + + +async def test_write_files_allows_path_within_root(tmp_path): + result = await write_files( + files={"sub/ok.txt": "hello"}, tool_context=_tool_context(tmp_path) + ) + + assert result["success"] + assert (tmp_path / "sub" / "ok.txt").read_text() == "hello" + + +async def test_read_files_blocks_relative_traversal(tmp_path, tmp_path_factory): + outside = tmp_path_factory.mktemp("outside") + secret = outside / "secret.txt" + secret.write_text("TOKEN=abc") + payload = os.path.relpath(secret, tmp_path) + + result = await read_files( + file_paths=[payload], tool_context=_tool_context(tmp_path) + ) + + assert not result["success"] + assert all( + "TOKEN=abc" not in info.get("content", "") + for info in result["files"].values() + ) + + +async def test_delete_files_blocks_relative_traversal( + tmp_path, tmp_path_factory +): + outside = tmp_path_factory.mktemp("outside") + victim = outside / "victim.txt" + victim.write_text("bye") + payload = os.path.relpath(victim, tmp_path) + + result = await delete_files( + file_paths=[payload], + tool_context=_tool_context(tmp_path), + confirm_deletion=True, + ) + + assert not result["success"] + assert victim.exists() From 56f5641f3e48490e2370f9b3515d2ab696f26f8f Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Thu, 4 Jun 2026 15:13:42 -0700 Subject: [PATCH 54/94] fix: Disable JSON_SCHEMA_FOR_FUNC_DECL by default PiperOrigin-RevId: 926912698 --- contributing/samples/tools/pydantic_argument/agent.py | 7 ------- src/google/adk/features/_feature_registry.py | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/contributing/samples/tools/pydantic_argument/agent.py b/contributing/samples/tools/pydantic_argument/agent.py index a9c6cd14a2..97a763f375 100644 --- a/contributing/samples/tools/pydantic_argument/agent.py +++ b/contributing/samples/tools/pydantic_argument/agent.py @@ -18,16 +18,9 @@ from typing import Union from google.adk.agents.llm_agent import Agent -from google.adk.features import FeatureName -from google.adk.features import override_feature_enabled from google.adk.tools.function_tool import FunctionTool import pydantic -override_feature_enabled( - FeatureName.JSON_SCHEMA_FOR_FUNC_DECL, - True, -) - class UserProfile(pydantic.BaseModel): """A user's profile information.""" diff --git a/src/google/adk/features/_feature_registry.py b/src/google/adk/features/_feature_registry.py index 75fa16994e..d155e3b7ac 100644 --- a/src/google/adk/features/_feature_registry.py +++ b/src/google/adk/features/_feature_registry.py @@ -135,7 +135,7 @@ class FeatureConfig: FeatureStage.EXPERIMENTAL, default_on=True ), FeatureName.JSON_SCHEMA_FOR_FUNC_DECL: FeatureConfig( - FeatureStage.EXPERIMENTAL, default_on=False + FeatureStage.EXPERIMENTAL, default_on=True ), FeatureName._MCP_GRACEFUL_ERROR_HANDLING: FeatureConfig( FeatureStage.EXPERIMENTAL, default_on=True From 913385852bcf3d7de254c3258890be738ab10011 Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Fri, 5 Jun 2026 10:53:34 -0700 Subject: [PATCH 55/94] feat: Add sample agent demonstrating 2LO, 3LO, and API Key auth via GcpAuthProvider PiperOrigin-RevId: 927379549 --- .../samples/integrations/gcp_auth/README.md | 113 ++++ .../samples/integrations/gcp_auth/agent.py | 166 +++++ .../integrations/gcp_auth/client/index.html | 566 ++++++++++++++++++ .../integrations/gcp_auth/client/main.py | 122 ++++ .../gcp_auth/client/requirements.txt | 4 + 5 files changed, 971 insertions(+) create mode 100644 contributing/samples/integrations/gcp_auth/README.md create mode 100644 contributing/samples/integrations/gcp_auth/agent.py create mode 100644 contributing/samples/integrations/gcp_auth/client/index.html create mode 100644 contributing/samples/integrations/gcp_auth/client/main.py create mode 100644 contributing/samples/integrations/gcp_auth/client/requirements.txt diff --git a/contributing/samples/integrations/gcp_auth/README.md b/contributing/samples/integrations/gcp_auth/README.md new file mode 100644 index 0000000000..0bdcea16f0 --- /dev/null +++ b/contributing/samples/integrations/gcp_auth/README.md @@ -0,0 +1,113 @@ +# GCP Auth Sample + +Demonstrates the use of Agent Identity auth manager with an agent that queries +Spotify and Google Maps using auth providers. + +Use `adk web` to run API key and 2-legged oauth flows, while use the included +custom agent web client to run 3-legged oauth flows. + +## Setup + +### 1. Activate environment + +```bash +cd adk-python +python3 -m venv .venv +source .venv/bin/activate +``` + +### 2. Install dependencies + +```bash +pip install "google-adk[agent-identity]" +``` + +### 3. Authenticate your environment + +```bash +gcloud auth application-default login +export GOOGLE_CLOUD_PROJECT="YOUR_GOOGLE_CLOUD_PROJECT" +gcloud auth application-default set-quota-project $GOOGLE_CLOUD_PROJECT +``` + +### 4. Create auth providers + +Refer to the [public documentation](https://cloud.google.com/iam/docs/manage-auth-providers) to create the following Agent Identity auth providers. + +> **Note:** +> The identity running the agent (via Application Default Credentials) must have +> the necessary [permissions](https://docs.cloud.google.com/iam/docs/roles-permissions/iamconnectors#iamconnectors.user) +> to retrieve credentials from these connectors. Ensure your account has the +> necessary role to access these resources. + +```bash +export GOOGLE_CLOUD_LOCATION="YOUR_GOOGLE_CLOUD_LOCATION" +export MAPS_API_AUTH_PROVIDER_ID="YOUR_MAPS_API_AUTH_PROVIDER_ID" +export SPOTIFY_2LO_AUTH_PROVIDER_ID="YOUR_SPOTIFY_2LO_AUTH_PROVIDER_ID" +export SPOTIFY_3LO_AUTH_PROVIDER_ID="YOUR_SPOTIFY_3LO_AUTH_PROVIDER_ID" + +gcloud alpha agent-identity connectors create $MAPS_API_AUTH_PROVIDER_ID \ + --project=$GOOGLE_CLOUD_PROJECT \ + --location=$GOOGLE_CLOUD_LOCATION \ + --api-key=YOUR_API_KEY + +gcloud alpha agent-identity connectors create $SPOTIFY_2LO_AUTH_PROVIDER_ID \ + --project=$GOOGLE_CLOUD_PROJECT \ + --location=$GOOGLE_CLOUD_LOCATION \ + --two-legged-oauth-client-id=OAUTH_CLIENT_ID \ + --two-legged-oauth-client-secret=OAUTH_CLIENT_SECRET \ + --two-legged-oauth-token-endpoint=OAUTH_TOKEN_ENDPOINT + +gcloud alpha agent-identity connectors create $SPOTIFY_3LO_AUTH_PROVIDER_ID \ + --project=$GOOGLE_CLOUD_PROJECT \ + --location=$GOOGLE_CLOUD_LOCATION \ + --three-legged-oauth-client-id=OAUTH_CLIENT_ID \ + --three-legged-oauth-client-secret=OAUTH_CLIENT_SECRET \ + --three-legged-oauth-authorization-url=AUTHORIZATION_URL \ + --three-legged-oauth-token-url=TOKEN_URL \ + --allowed-scopes=ALLOWED_SCOPES +``` + +### 5. Test API key and 2LO auth provider using ADK web client + +```bash +adk web contributing/samples +``` + +- On the ADK web UI, select the agent named `gcp_auth` from the dropdown. +- Sample queries to try: + - API key (Google Maps tool): "What is the current weather in New York?" + - 2LO key (Spotify tool): "Tell me about the song: Waving Flag" + +### 6. Test 3LO auth provider using custom web client + +> **Note:** If the agent backend is running on a different port or host other +> than `localhost:8000`, please set the `AGENT_BACKEND_URL` environment variable +> before starting the client (e.g., +> `export AGENT_BACKEND_URL="http://localhost:9000"`). + +- In a separate shell, activate environment + +```bash +cd adk-python +python3 -m venv .venv +source .venv/bin/activate +``` + +- Navigate to the client directory and install dependencies + +```bash +cd contributing/samples/gcp_auth/client +pip install -r requirements.txt +``` + +- Start the client application + +```bash +uvicorn main:app --port 8080 --reload +``` + +- Open `http://localhost:8080`. (**Note:** You must use `localhost` and not `127.0.0.1`, as the OAuth redirect URL specifically requires it.) +- On the login screen, enter an arbitrary user ID (e.g. test_user123). +- Sample queries to try: + - 3LO key (Spotify tool): "What are my private Spotify playlists?" diff --git a/contributing/samples/integrations/gcp_auth/agent.py b/contributing/samples/integrations/gcp_auth/agent.py new file mode 100644 index 0000000000..9d34687076 --- /dev/null +++ b/contributing/samples/integrations/gcp_auth/agent.py @@ -0,0 +1,166 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os + +from google.adk.agents import Agent +from google.adk.apps import App +from google.adk.auth.auth_credential import AuthCredential +from google.adk.auth.auth_tool import AuthConfig +from google.adk.auth.credential_manager import CredentialManager +from google.adk.integrations.agent_identity import GcpAuthProvider +from google.adk.integrations.agent_identity import GcpAuthProviderScheme +from google.adk.tools.authenticated_function_tool import AuthenticatedFunctionTool +from google.adk.tools.mcp_tool.mcp_session_manager import StreamableHTTPConnectionParams +from google.adk.tools.mcp_tool.mcp_toolset import McpToolset +import httpx + +PROJECT_ID = os.environ.get("GOOGLE_CLOUD_PROJECT") +LOCATION = os.environ.get("GOOGLE_CLOUD_LOCATION") +MAPS_API_AUTH_PROVIDER_ID = os.environ.get("MAPS_API_AUTH_PROVIDER_ID") +SPOTIFY_2LO_AUTH_PROVIDER_ID = os.environ.get("SPOTIFY_2LO_AUTH_PROVIDER_ID") +SPOTIFY_3LO_AUTH_PROVIDER_ID = os.environ.get("SPOTIFY_3LO_AUTH_PROVIDER_ID") + +MAPS_API_AUTH_PROVIDER = f"projects/{PROJECT_ID}/locations/{LOCATION}/connectors/{MAPS_API_AUTH_PROVIDER_ID}" +SPOTIFY_2LO_AUTH_PROVIDER = f"projects/{PROJECT_ID}/locations/{LOCATION}/connectors/{SPOTIFY_2LO_AUTH_PROVIDER_ID}" +SPOTIFY_3LO_AUTH_PROVIDER = f"projects/{PROJECT_ID}/locations/{LOCATION}/connectors/{SPOTIFY_3LO_AUTH_PROVIDER_ID}" + +MAPS_MCP_ENDPOINT = "https://mapstools.googleapis.com/mcp" +CONTINUE_URI = "http://localhost:8080/commit" +MODEL = "gemini-2.5-flash" + + +async def spotify_search_track( + credential: AuthCredential, query: str +) -> str | list: + """Searches for a track on Spotify and returns its details.""" + headers = {} + if http := credential.http: + if http.scheme and http.credentials and (token := http.credentials.token): + headers["Authorization"] = f"{http.scheme.title()} {token}" + if http.additional_headers: + headers.update(http.additional_headers) + + if not headers: + return "Error: No authentication token available." + + async with httpx.AsyncClient() as client: + response = await client.get( + "https://api.spotify.com/v1/search", + headers=headers, + params={"q": query, "type": "track", "limit": 1}, + ) + + if response.status_code != 200: + return f"Error from Spotify API: {response.status_code} - {response.text}" + + data = response.json() + items = data.get("tracks", {}).get("items", []) + + if not items: + return f"No track found for query '{query}'." + + return items + + +async def spotify_get_playlists(credential: AuthCredential) -> str | list: + """Fetches the current user's private playlists on Spotify.""" + headers = {} + if http := credential.http: + if http.scheme and http.credentials and (token := http.credentials.token): + headers["Authorization"] = f"{http.scheme.title()} {token}" + if http.additional_headers: + headers.update(http.additional_headers) + + if not headers: + return "Error: No authentication token available." + + async with httpx.AsyncClient() as client: + response = await client.get( + "https://api.spotify.com/v1/me/playlists", + headers=headers, + params={"limit": 10}, + ) + + if response.status_code != 200: + return f"Error from Spotify API: {response.status_code} - {response.text}" + + data = response.json() + items = data.get("items", []) + + if not items: + return "No playlists found for the current user." + + # Extract useful information + return [ + { + "name": item.get("name"), + "public": item.get("public"), + "total_tracks": item.get("tracks", {}).get("total"), + } + for item in items + if item + ] + + +spotify_auth_config_2lo = AuthConfig( + auth_scheme=GcpAuthProviderScheme(name=SPOTIFY_2LO_AUTH_PROVIDER) +) +spotify_search_track_tool = AuthenticatedFunctionTool( + func=spotify_search_track, + auth_config=spotify_auth_config_2lo, +) + +spotify_auth_config_3lo = AuthConfig( + auth_scheme=GcpAuthProviderScheme( + name=SPOTIFY_3LO_AUTH_PROVIDER, + scopes=["playlist-read-private"], + continue_uri=CONTINUE_URI, + ) +) +spotify_get_playlist_tool = AuthenticatedFunctionTool( + func=spotify_get_playlists, + auth_config=spotify_auth_config_3lo, +) + +maps_tools = McpToolset( + connection_params=StreamableHTTPConnectionParams(url=MAPS_MCP_ENDPOINT), + auth_scheme=GcpAuthProviderScheme(name=MAPS_API_AUTH_PROVIDER), + errlog=None, # Required for agent freezing (pickling) +) + +CredentialManager.register_auth_provider(GcpAuthProvider()) + +root_agent = Agent( + name="gcp_auth_agent", + model=MODEL, + instruction=( + "You are a Spotify and Google Maps assistant. Use your tools to " + "search for track details, fetch the user's private playlists, " + "and look up locations. Keep responses concise, friendly, and " + "emoji-filled!" + ), + tools=[ + spotify_search_track_tool, + spotify_get_playlist_tool, + maps_tools, + ], +) + +app = App( + name="gcp_auth", + root_agent=root_agent, +) diff --git a/contributing/samples/integrations/gcp_auth/client/index.html b/contributing/samples/integrations/gcp_auth/client/index.html new file mode 100644 index 0000000000..5e3c5b2b62 --- /dev/null +++ b/contributing/samples/integrations/gcp_auth/client/index.html @@ -0,0 +1,566 @@ + + + + Gcp Auth demo + + + + + + + + + + + + +
            +
            +

            Welcome

            +

            + Please enter your User ID to continue. +

            + + +
            +
            + + + + + + + + + diff --git a/contributing/samples/integrations/gcp_auth/client/main.py b/contributing/samples/integrations/gcp_auth/client/main.py new file mode 100644 index 0000000000..9d2deabd04 --- /dev/null +++ b/contributing/samples/integrations/gcp_auth/client/main.py @@ -0,0 +1,122 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import json +import logging +import os +import sys + +from fastapi import FastAPI +from fastapi import Request +from fastapi.responses import HTMLResponse +from fastapi.responses import StreamingResponse +import httpx + +logging.basicConfig( + level=logging.INFO, stream=sys.stdout, format="%(levelname)s: %(message)s" +) +logger = logging.getLogger("google_adk." + __name__) + +app = FastAPI() + +AGENT_URL = os.environ.get("AGENT_BACKEND_URL", "http://localhost:8000") + + +@app.get("/") +def ui(): + with open("index.html", "r") as f: + return HTMLResponse(content=f.read()) + + +@app.post("/chat") +async def chat(request: Request): + data = await request.json() + message = data.get("message") + function_response = data.get("function_response") + + app_name = "gcp_auth" + user_id = data.get("user_id", "test_user") + session_id = data.get("session_id", "default_session_id") + + payload = { + "appName": app_name, + "userId": user_id, + "sessionId": session_id, + "streaming": True, + } + + if message: + payload["newMessage"] = { + "role": "user", + "parts": [{"text": message}], + } + elif function_response: + payload["newMessage"] = { + "role": "user", + "parts": [{"functionResponse": function_response}], + } + + # Ensure the session exists before we try to continue it via /run_sse + async def proxy_stream(): + async with httpx.AsyncClient(timeout=120.0) as client: + # Attempt to create the session (ignoring if it already exists or fails quietly) + await client.post( + f"{AGENT_URL}/apps/{app_name}/users/{user_id}/sessions/{session_id}" + ) + + async with client.stream( + "POST", f"{AGENT_URL}/run_sse", json=payload + ) as r: + if r.status_code != 200: + err = await r.aread() + yield f"data: {json.dumps({'error': err.decode()})}\n\n" + return + + async for line in r.aiter_lines(): + if line: + yield f"data: {line}\n\n" if line.startswith("{") else f"{line}\n\n" + + return StreamingResponse(proxy_stream(), media_type="text/event-stream") + + +@app.api_route("/commit", methods=["GET"]) +async def commit(request: Request): + connector = request.query_params.get("connector_name") + payload = { + "userId": request.cookies.get("user_id"), + "userIdValidationState": request.query_params.get( + "user_id_validation_state" + ), + "consentNonce": request.cookies.get("consent_nonce"), + } + + url = f"https://iamconnectorcredentials.googleapis.com/v1alpha/{connector}/credentials:finalize" + try: + async with httpx.AsyncClient(timeout=30.0) as client: + resp = await client.post(url, json=payload) + resp.raise_for_status() + except httpx.HTTPError as e: + err_text = e.response.text if hasattr(e, "response") else str(e) + status = e.response.status_code if hasattr(e, "response") else 500 + logger.error(f"Commit failed: {err_text}") + return HTMLResponse(err_text, status_code=status) + + return HTMLResponse(""" + +

            Success. You can close this window.

            + """) diff --git a/contributing/samples/integrations/gcp_auth/client/requirements.txt b/contributing/samples/integrations/gcp_auth/client/requirements.txt new file mode 100644 index 0000000000..5339a4b149 --- /dev/null +++ b/contributing/samples/integrations/gcp_auth/client/requirements.txt @@ -0,0 +1,4 @@ +fastapi +uvicorn +httpx +google-auth From 428e7899d7225f8d2ad6dd1d2f9a7654d5de507a Mon Sep 17 00:00:00 2001 From: Yifan Wang Date: Fri, 5 Jun 2026 11:48:10 -0700 Subject: [PATCH 56/94] fix(workflow): Resolve raw Content output crash on rehydration Port of GitHub PR: https://github.com/google/adk-python/pull/5909 Centralizes text extraction and schema validation for rehydrated output via a shared helper `extract_text_from_content`. If a stored output fails validation against the node's schema due to schema drift, gracefully fallback to parsing unvalidated JSON to avoid blocking resumption, rather than crashing. Co-authored-by: Yifan Wang PiperOrigin-RevId: 927408084 --- src/google/adk/utils/content_utils.py | 7 ++ src/google/adk/workflow/_base_node.py | 5 +- .../adk/workflow/utils/_rehydration_utils.py | 51 ++++++++++++ .../adk/workflow/utils/_replay_interceptor.py | 3 +- .../workflow/utils/test_rehydration_utils.py | 80 +++++++++++++++++++ 5 files changed, 143 insertions(+), 3 deletions(-) diff --git a/src/google/adk/utils/content_utils.py b/src/google/adk/utils/content_utils.py index 6755662481..344970ec65 100644 --- a/src/google/adk/utils/content_utils.py +++ b/src/google/adk/utils/content_utils.py @@ -36,3 +36,10 @@ def filter_audio_parts(content: types.Content) -> types.Content | None: if not filtered_parts: return None return types.Content(role=content.role, parts=filtered_parts) + + +def extract_text_from_content(content: types.Content | None) -> str: + """Extracts text from a Content object, filtering out thoughts.""" + if not content or not content.parts: + return '' + return ''.join(p.text for p in content.parts if p.text and not p.thought) diff --git a/src/google/adk/workflow/_base_node.py b/src/google/adk/workflow/_base_node.py index 9aba09be5b..3347dc2b90 100644 --- a/src/google/adk/workflow/_base_node.py +++ b/src/google/adk/workflow/_base_node.py @@ -28,6 +28,7 @@ from pydantic import ValidationError from ..utils._schema_utils import SchemaType +from ..utils.content_utils import extract_text_from_content from ._retry_config import RetryConfig if TYPE_CHECKING: @@ -143,7 +144,7 @@ def _validate_input_data(self, data: Any) -> Any: """Validates data against input_schema if set.""" if self.input_schema and isinstance(data, types.Content): # Extract text from Content (e.g. user input from START node). - text = ''.join(part.text for part in data.parts if part.text) + text = extract_text_from_content(data) if self.input_schema is str: return text # If schema is defined, try to parse the text as JSON. @@ -168,7 +169,7 @@ def _validate_output_data(self, data: Any) -> Any: except ValidationError as e: # 2. If failed, try to parse JSON ONLY if it's Content if isinstance(data, types.Content): - text = ''.join(part.text for part in data.parts if part.text) + text = extract_text_from_content(data) if self.output_schema is str: return text if text.strip(): diff --git a/src/google/adk/workflow/utils/_rehydration_utils.py b/src/google/adk/workflow/utils/_rehydration_utils.py index 0e84e98e01..a7e5da442e 100644 --- a/src/google/adk/workflow/utils/_rehydration_utils.py +++ b/src/google/adk/workflow/utils/_rehydration_utils.py @@ -20,8 +20,11 @@ from dataclasses import dataclass from dataclasses import field import json +import logging from typing import Any +from typing import TYPE_CHECKING +from google.genai import types from pydantic import TypeAdapter from pydantic import ValidationError @@ -29,6 +32,11 @@ from ...events.event import Event from ._workflow_hitl_utils import REQUEST_INPUT_FUNCTION_CALL_NAME +if TYPE_CHECKING: + from .._base_node import BaseNode + +logger = logging.getLogger('google_adk.' + __name__) + _RESULT_KEY = 'result' @@ -96,6 +104,49 @@ def _extract_schema_from_event(event: Event, interrupt_id: str) -> Any | None: return None +def _process_rehydrated_output(node: BaseNode, output: Any) -> Any: + """Process rehydrated output from event.content using the node's output schema. + + Protects type consistency between fresh runs and rehydrated runs by + properly respecting output schemas, handling model reasoning thought + blocks, and ensuring raw strings are returned when no output schema is + configured. + """ + if not isinstance(output, types.Content): + return output + + from google.adk.utils.content_utils import extract_text_from_content + + text = extract_text_from_content(output).strip() + + if not text: + return None + + if node.output_schema: + if node.output_schema is str: + return text + try: + validated = TypeAdapter(node.output_schema).validate_json(text) + return node._to_serializable(validated) + except ValidationError as e: + # Fallback to unvalidated JSON parsing on validation failure + # to prevent blocking resumption on schema drift. + try: + parsed = json.loads(text) + logger.warning( + 'Validation failed for rehydrated output against schema: %s. ' + 'Falling back to unvalidated JSON output to allow resumption.', + e, + ) + return parsed + except ValueError: + raise ValueError( + f'Validation failed for rehydrated output against schema: {e}' + ) from e + else: + return text + + def _validate_resume_response(response_data: Any, schema: Any) -> Any: """Validates and coerces resume response data against a schema. diff --git a/src/google/adk/workflow/utils/_replay_interceptor.py b/src/google/adk/workflow/utils/_replay_interceptor.py index 5c424ac17a..5e41728988 100644 --- a/src/google/adk/workflow/utils/_replay_interceptor.py +++ b/src/google/adk/workflow/utils/_replay_interceptor.py @@ -27,6 +27,7 @@ from .._node_state import NodeState from .._node_status import NodeStatus from ._rehydration_utils import _ChildScanState +from ._rehydration_utils import _process_rehydrated_output if TYPE_CHECKING: from .._dynamic_node_scheduler import DynamicNodeRun @@ -112,7 +113,7 @@ def check_interception( ): # Case 3: Cross-turn successfully completed in a prior turn (fast-forward). # Bypass execution completely and return the cached output and route. - output = recovered.output + output = _process_rehydrated_output(node, recovered.output) route = recovered.route elif recovered.interrupt_ids: diff --git a/tests/unittests/workflow/utils/test_rehydration_utils.py b/tests/unittests/workflow/utils/test_rehydration_utils.py index 37405960db..1cb7155328 100644 --- a/tests/unittests/workflow/utils/test_rehydration_utils.py +++ b/tests/unittests/workflow/utils/test_rehydration_utils.py @@ -17,7 +17,9 @@ from google.adk.events.event import Event from google.adk.events.event import NodeInfo from google.adk.events.request_input import RequestInput +from google.adk.workflow._base_node import BaseNode from google.adk.workflow.utils._rehydration_utils import _ChildScanState +from google.adk.workflow.utils._rehydration_utils import _process_rehydrated_output from google.adk.workflow.utils._rehydration_utils import _reconstruct_node_states from google.adk.workflow.utils._rehydration_utils import _unwrap_response from google.adk.workflow.utils._rehydration_utils import _validate_resume_response @@ -103,6 +105,84 @@ def test_roundtrip_wrap_unwrap_dict(self): assert _unwrap_response(_wrap_response(d)) == d +# --- _process_rehydrated_output --- + + +class TestProcessRehydratedOutput: + + def test_extracts_plain_text_without_schema(self): + node = BaseNode(name="dummy") + content = types.Content(parts=[types.Part(text="hello world")]) + assert _process_rehydrated_output(node, content) == "hello world" + + def test_returns_plain_text_even_if_json_when_no_schema(self): + node = BaseNode(name="dummy") + content = types.Content(parts=[types.Part(text='{"foo": "bar"}')]) + assert _process_rehydrated_output(node, content) == '{"foo": "bar"}' + + def test_parses_json_text_with_output_schema(self): + class MySchema(BaseModel): + foo: str + + node = BaseNode(name="dummy", output_schema=MySchema) + content = types.Content(parts=[types.Part(text='{"foo": "bar"}')]) + assert _process_rehydrated_output(node, content) == {"foo": "bar"} + + def test_joins_multiple_parts(self): + node = BaseNode(name="dummy") + content = types.Content( + parts=[types.Part(text="hello "), types.Part(text="world")] + ) + assert _process_rehydrated_output(node, content) == "hello world" + + def test_filters_thought_parts(self): + class MySchema(BaseModel): + answer: int + + node = BaseNode(name="dummy", output_schema=MySchema) + content = types.Content( + parts=[ + types.Part(text="thinking...", thought=True), + types.Part(text='{"answer": 42}'), + ] + ) + assert _process_rehydrated_output(node, content) == {"answer": 42} + + def test_returns_none_for_empty_text(self): + node = BaseNode(name="dummy") + content = types.Content(parts=[types.Part(text=" ")]) + assert _process_rehydrated_output(node, content) is None + + def test_gracefully_falls_back_on_schema_mismatch(self, caplog): + class MySchema(BaseModel): + foo: str + bar: int # Required field that is missing in the stored output + + node = BaseNode(name="dummy", output_schema=MySchema) + content = types.Content(parts=[types.Part(text='{"foo": "only"}')]) + + # Should NOT raise ValueError, but fallback to unvalidated parsed dict + res = _process_rehydrated_output(node, content) + assert res == {"foo": "only"} + assert ( + "Validation failed for rehydrated output against schema" in caplog.text + ) + + def test_raises_value_error_if_not_valid_json_on_schema_mismatch(self): + class MySchema(BaseModel): + foo: str + + node = BaseNode(name="dummy", output_schema=MySchema) + content = types.Content(parts=[types.Part(text="invalid json")]) + + # Should raise ValueError because it's not valid JSON + with pytest.raises( + ValueError, + match="Validation failed for rehydrated output against schema", + ): + _process_rehydrated_output(node, content) + + # --- _validate_resume_response --- From 2ad20057b00e5cd6895f160f1d4d6b43e3c0dfcf Mon Sep 17 00:00:00 2001 From: Yifan Wang Date: Fri, 5 Jun 2026 11:55:15 -0700 Subject: [PATCH 57/94] test(events): add unit tests for Event helper methods Port of GitHub PR: https://github.com/google/adk-python/pull/5948 Adds unit tests for Event class helper methods: - is_final_response() - get_function_calls() - get_function_responses() - has_trailing_code_execution_result() - automatic ID generation Co-authored-by: Yifan Wang PiperOrigin-RevId: 927411791 --- tests/unittests/events/test_event.py | 191 +++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 tests/unittests/events/test_event.py diff --git a/tests/unittests/events/test_event.py b/tests/unittests/events/test_event.py new file mode 100644 index 0000000000..9b136c914c --- /dev/null +++ b/tests/unittests/events/test_event.py @@ -0,0 +1,191 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +"""Unit tests for the helper methods on the Event class.""" + +from google.adk.events.event import Event +from google.adk.events.event_actions import EventActions +from google.genai import types +import pytest + + +def _text_part(text: str = 'hello') -> types.Part: + return types.Part(text=text) + + +def _function_call_part(name: str = 'my_func') -> types.Part: + return types.Part(function_call=types.FunctionCall(name=name, args={'x': 1})) + + +def _function_response_part(name: str = 'my_func') -> types.Part: + return types.Part( + function_response=types.FunctionResponse(name=name, response={'y': 2}) + ) + + +def _code_execution_result_part(output: str = '42') -> types.Part: + return types.Part( + code_execution_result=types.CodeExecutionResult( + outcome=types.Outcome.OUTCOME_OK, output=output + ) + ) + + +def _event(parts: list[types.Part] | None = None, **kwargs) -> Event: + content = ( + types.Content(role='model', parts=parts) if parts is not None else None + ) + return Event(author='agent', content=content, **kwargs) + + +# --- is_final_response ------------------------------------------------------- + + +def test_is_final_response_plain_text_event_is_final(): + event = _event(parts=[_text_part()]) + assert event.is_final_response() is True + + +def test_is_final_response_empty_event_is_final(): + event = _event() + assert event.is_final_response() is True + + +def test_is_final_response_with_function_call_is_not_final(): + event = _event(parts=[_text_part(), _function_call_part()]) + assert event.is_final_response() is False + + +def test_is_final_response_with_function_response_is_not_final(): + event = _event(parts=[_function_response_part()]) + assert event.is_final_response() is False + + +def test_is_final_response_partial_event_is_not_final(): + event = _event(parts=[_text_part()], partial=True) + assert event.is_final_response() is False + + +def test_is_final_response_with_trailing_code_result_is_not_final(): + event = _event(parts=[_text_part(), _code_execution_result_part()]) + assert event.is_final_response() is False + + +def test_is_final_response_skip_summarization_overrides_function_response(): + event = _event( + parts=[_function_response_part()], + actions=EventActions(skip_summarization=True), + ) + assert event.is_final_response() is True + + +def test_is_final_response_long_running_tool_ids_overrides_function_call(): + event = _event( + parts=[_function_call_part()], long_running_tool_ids={'tool-1'} + ) + assert event.is_final_response() is True + + +# --- get_function_calls ------------------------------------------------------ + + +def test_get_function_calls_returns_calls_in_order(): + event = _event( + parts=[ + _text_part(), + _function_call_part('first'), + _function_response_part(), + _function_call_part('second'), + ] + ) + assert [call.name for call in event.get_function_calls()] == [ + 'first', + 'second', + ] + + +def test_get_function_calls_no_content_returns_empty(): + assert _event().get_function_calls() == [] + + +def test_get_function_calls_empty_parts_returns_empty(): + assert _event(parts=[]).get_function_calls() == [] + + +def test_get_function_calls_text_only_returns_empty(): + assert _event(parts=[_text_part()]).get_function_calls() == [] + + +# --- get_function_responses -------------------------------------------------- + + +def test_get_function_responses_returns_responses_in_order(): + event = _event( + parts=[ + _function_response_part('first'), + _text_part(), + _function_call_part(), + _function_response_part('second'), + ] + ) + assert [resp.name for resp in event.get_function_responses()] == [ + 'first', + 'second', + ] + + +def test_get_function_responses_no_content_returns_empty(): + assert _event().get_function_responses() == [] + + +def test_get_function_responses_empty_parts_returns_empty(): + assert _event(parts=[]).get_function_responses() == [] + + +# --- has_trailing_code_execution_result -------------------------------------- + + +def test_has_trailing_code_execution_result_true_when_last(): + event = _event(parts=[_text_part(), _code_execution_result_part()]) + assert event.has_trailing_code_execution_result() is True + + +def test_has_trailing_code_execution_result_false_when_not_last(): + event = _event(parts=[_code_execution_result_part(), _text_part()]) + assert event.has_trailing_code_execution_result() is False + + +def test_has_trailing_code_execution_result_false_no_content(): + assert _event().has_trailing_code_execution_result() is False + + +def test_has_trailing_code_execution_result_false_empty_parts(): + assert _event(parts=[]).has_trailing_code_execution_result() is False + + +# --- id generation (model_post_init) ----------------------------------------- + + +def test_event_id_auto_assigned_when_missing(): + assert _event().id != '' + + +def test_event_ids_are_unique(): + assert _event().id != _event().id + + +def test_event_id_preserved_when_provided(): + assert _event(id='fixed-id').id == 'fixed-id' From 8befdb88be8fa3e5485cd7bac813f9ea1ac26862 Mon Sep 17 00:00:00 2001 From: Yifan Wang Date: Fri, 5 Jun 2026 11:55:37 -0700 Subject: [PATCH 58/94] fix(streaming): Ensure final partial=False frame is always yielded The StreamingResponseAggregator.close() method previously returned None if it didn't accumulate text or parts, such as for safety blocks or pure function calls. This caused clients (e.g., Vertex AI Reasoning Engine) to hang indefinitely waiting for a partial=False termination frame, and caused loops to break prematurely. This fix ensures close() always returns a final LlmResponse(partial=False) as long as a response exists, carrying over any error_code, error_message, and usage_metadata, regardless of whether PROGRESSIVE_SSE_STREAMING is enabled. Added parameterized unit tests to verify behavior across both streaming modes. Fixes #3754 Co-authored-by: Yifan Wang PiperOrigin-RevId: 927411984 --- src/google/adk/utils/streaming_utils.py | 98 +++++++-------- tests/unittests/utils/test_streaming_utils.py | 117 +++++++++++++++--- 2 files changed, 148 insertions(+), 67 deletions(-) diff --git a/src/google/adk/utils/streaming_utils.py b/src/google/adk/utils/streaming_utils.py index af6957b8fe..dbb056c212 100644 --- a/src/google/adk/utils/streaming_utils.py +++ b/src/google/adk/utils/streaming_utils.py @@ -349,61 +349,61 @@ def close(self) -> Optional[LlmResponse]: Returns: The aggregated LlmResponse. """ + if not self._response: + return None + + candidate = ( + self._response.candidates[0] if self._response.candidates else None + ) + + finish_reason = self._finish_reason + if not finish_reason and candidate: + finish_reason = candidate.finish_reason + + error_code = None + error_message = None + if finish_reason and finish_reason != types.FinishReason.STOP: + error_code = finish_reason + error_message = candidate.finish_message if candidate else None + elif not candidate and self._response.prompt_feedback: + error_code = self._response.prompt_feedback.block_reason + error_message = self._response.prompt_feedback.block_reason_message + # ========== Progressive SSE Streaming (new feature) ========== if is_feature_enabled(FeatureName.PROGRESSIVE_SSE_STREAMING): - # Always generate final aggregated response in progressive mode - if self._response and self._response.candidates: - # Flush any remaining buffers to complete the sequence - self._flush_text_buffer_to_sequence() - self._flush_function_call_to_sequence() - - # Use the parts sequence which preserves original ordering - final_parts = self._parts_sequence - - if final_parts: - candidate = self._response.candidates[0] - finish_reason = self._finish_reason or candidate.finish_reason - - return LlmResponse( - content=types.ModelContent(parts=final_parts), - grounding_metadata=self._grounding_metadata, - citation_metadata=self._citation_metadata, - error_code=None - if finish_reason == types.FinishReason.STOP - else finish_reason, - error_message=None - if finish_reason == types.FinishReason.STOP - else candidate.finish_message, - usage_metadata=self._usage_metadata, - finish_reason=finish_reason, - partial=False, - ) - - return None + self._flush_text_buffer_to_sequence() + self._flush_function_call_to_sequence() + + final_parts = self._parts_sequence + content = types.ModelContent(parts=final_parts) if final_parts else None - # ========== Non-Progressive SSE Streaming (old behavior) ========== - if ( - (self._text or self._thought_text) - and self._response - and self._response.candidates - ): - parts = [] - if self._thought_text: - parts.append(types.Part(text=self._thought_text, thought=True)) - if self._text: - parts.append(types.Part.from_text(text=self._text)) - candidate = self._response.candidates[0] return LlmResponse( - content=types.ModelContent(parts=parts), + content=content, grounding_metadata=self._grounding_metadata, citation_metadata=self._citation_metadata, - error_code=None - if candidate.finish_reason == types.FinishReason.STOP - else candidate.finish_reason, - error_message=None - if candidate.finish_reason == types.FinishReason.STOP - else candidate.finish_message, + error_code=error_code, + error_message=error_message, usage_metadata=self._usage_metadata, + finish_reason=finish_reason, + partial=False, ) - return None + # ========== Non-Progressive SSE Streaming (old behavior) ========== + parts = [] + if self._thought_text: + parts.append(types.Part(text=self._thought_text, thought=True)) + if self._text: + parts.append(types.Part.from_text(text=self._text)) + content = types.ModelContent(parts=parts) if parts else None + + return LlmResponse( + content=content, + grounding_metadata=self._grounding_metadata, + citation_metadata=self._citation_metadata, + error_code=error_code, + error_message=error_message, + usage_metadata=self._usage_metadata, + finish_reason=finish_reason, + partial=False, + ) + diff --git a/tests/unittests/utils/test_streaming_utils.py b/tests/unittests/utils/test_streaming_utils.py index 6b68789bf0..f61de7d74d 100644 --- a/tests/unittests/utils/test_streaming_utils.py +++ b/tests/unittests/utils/test_streaming_utils.py @@ -184,25 +184,106 @@ async def test_close_with_error(self): assert closed_response.error_message == "Recitation error" @pytest.mark.asyncio - async def test_process_response_with_none_content(self): - """Test that StreamingResponseAggregator handles content=None.""" - aggregator = streaming_utils.StreamingResponseAggregator() - response = types.GenerateContentResponse( - candidates=[ - types.Candidate( - content=types.Content(parts=[]), - finish_reason=types.FinishReason.STOP, - ) - ] - ) - results = [] - async for r in aggregator.process_response(response): - results.append(r) - assert len(results) == 1 - assert results[0].content is not None + @pytest.mark.parametrize("use_progressive_sse", [True, False]) + async def test_empty_content_produces_empty_final_frame( + self, use_progressive_sse + ): + """A candidate with an empty parts list produces an empty final frame.""" + with temporary_feature_override( + FeatureName.PROGRESSIVE_SSE_STREAMING, use_progressive_sse + ): + aggregator = streaming_utils.StreamingResponseAggregator() + response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=types.Content(parts=[]), + finish_reason=types.FinishReason.STOP, + ) + ] + ) + results = [] + async for r in aggregator.process_response(response): + results.append(r) + closed_response = aggregator.close() + + assert len(results) == 1 + assert results[0].content is not None + assert closed_response is not None + assert closed_response.partial is False + assert closed_response.content is None + assert closed_response.finish_reason == types.FinishReason.STOP + + @pytest.mark.asyncio + @pytest.mark.parametrize("use_progressive_sse", [True, False]) + async def test_prompt_feedback_block_returns_error_frame( + self, use_progressive_sse + ): + """A prompt-level safety block produces a final frame with the error code.""" + with temporary_feature_override( + FeatureName.PROGRESSIVE_SSE_STREAMING, use_progressive_sse + ): + aggregator = streaming_utils.StreamingResponseAggregator() + response = types.GenerateContentResponse( + prompt_feedback=types.GenerateContentResponsePromptFeedback( + block_reason=types.BlockedReason.SAFETY, + block_reason_message="Blocked by safety", + ) + ) + results = [] + async for r in aggregator.process_response(response): + results.append(r) + closed_response = aggregator.close() + + assert len(results) == 1 + assert closed_response is not None + assert closed_response.partial is False + assert closed_response.error_code == types.BlockedReason.SAFETY + assert closed_response.error_message == "Blocked by safety" + assert closed_response.content is None + + @pytest.mark.asyncio + @pytest.mark.parametrize("use_progressive_sse", [True, False]) + async def test_pure_function_call_behavior_differs_by_mode( + self, use_progressive_sse + ): + """A pure function call yields the part in progressive mode and an empty frame otherwise.""" + with temporary_feature_override( + FeatureName.PROGRESSIVE_SSE_STREAMING, use_progressive_sse + ): + aggregator = streaming_utils.StreamingResponseAggregator() + response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name="my_tool", + args={"x": 1}, + ) + ) + ] + ), + finish_reason=types.FinishReason.STOP, + ) + ] + ) + + results = [] + async for r in aggregator.process_response(response): + results.append(r) + closed_response = aggregator.close() + + assert closed_response is not None + assert closed_response.partial is False + + if use_progressive_sse: + assert closed_response.content is not None + assert len(closed_response.content.parts) == 1 + assert closed_response.content.parts[0].function_call.name == "my_tool" + else: + assert closed_response.content is None - closed_response = aggregator.close() - assert closed_response is None @pytest.mark.asyncio @pytest.mark.parametrize( From 1d055e333a5deff1fa0c9f4d25265e5a3cbf0de2 Mon Sep 17 00:00:00 2001 From: Yifan Wang Date: Fri, 5 Jun 2026 12:32:50 -0700 Subject: [PATCH 59/94] fix(migration): restrict unpickling of v0 actions blobs Port of GitHub PR: 9db48ce9 Restrict unpickling of v0 actions blobs during session migration to prevent unsafe deserialization. Add --allow-unsafe-unpickling option to allow unsafe unpickling for trusted databases. Co-authored-by: Yifan Wang PiperOrigin-RevId: 927430066 --- src/google/adk/cli/cli_tools_click.py | 22 +- .../migrate_from_sqlalchemy_pickle.py | 151 ++++++++- .../sessions/migration/migration_runner.py | 18 +- .../cli/utils/test_cli_tools_click.py | 47 +++ .../sessions/migration/test_migration.py | 310 ++++++++++++++++++ 5 files changed, 533 insertions(+), 15 deletions(-) diff --git a/src/google/adk/cli/cli_tools_click.py b/src/google/adk/cli/cli_tools_click.py index c6a71175a1..39b49ee32a 100644 --- a/src/google/adk/cli/cli_tools_click.py +++ b/src/google/adk/cli/cli_tools_click.py @@ -2205,15 +2205,33 @@ def migrate(): default="INFO", help="Optional. Set the logging level", ) +@click.option( # type: ignore[untyped-decorator] + "--allow-unsafe-unpickling", + "--allow_unsafe_unpickling", + is_flag=True, + default=False, + help=( + "Optional. Allow unsafe pickle loading for trusted legacy session" + " databases." + ), +) def cli_migrate_session( - *, source_db_url: str, dest_db_url: str, log_level: str + *, + source_db_url: str, + dest_db_url: str, + log_level: str, + allow_unsafe_unpickling: bool, ): """Migrates a session database to the latest schema version.""" logs.setup_adk_logger(getattr(logging, log_level.upper())) try: from ..sessions.migration import migration_runner - migration_runner.upgrade(source_db_url, dest_db_url) + migration_runner.upgrade( + source_db_url, + dest_db_url, + allow_unsafe_unpickling=allow_unsafe_unpickling, + ) click.secho("Migration check and upgrade process finished.", fg="green") except Exception as e: click.secho(f"Migration failed: {e}", fg="red", err=True) diff --git a/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py b/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py index a6d1ad2a78..1b15a5ce11 100644 --- a/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py +++ b/src/google/adk/sessions/migration/migrate_from_sqlalchemy_pickle.py @@ -18,6 +18,7 @@ import argparse from datetime import datetime from datetime import timezone +import io import json import logging import pickle @@ -37,6 +38,93 @@ logger = logging.getLogger("google_adk." + __name__) +_ALLOWED_PICKLE_GLOBALS = { + # Basic types/containers + ("builtins", "dict"), + ("builtins", "list"), + ("builtins", "set"), + ("builtins", "tuple"), + ("builtins", "str"), + ("builtins", "bytes"), + ("builtins", "bytearray"), + ("builtins", "int"), + ("builtins", "float"), + ("builtins", "bool"), + ("datetime", "datetime"), + ("datetime", "timedelta"), + ("datetime", "timezone"), + # Expected pickled payload for v0 session schema events. + ("fastapi.openapi.models", "APIKey"), + ("fastapi.openapi.models", "APIKeyIn"), + ("fastapi.openapi.models", "HTTPBase"), + ("fastapi.openapi.models", "HTTPBearer"), + ("fastapi.openapi.models", "OAuth2"), + ("fastapi.openapi.models", "OAuthFlow"), + ("fastapi.openapi.models", "OAuthFlowAuthorizationCode"), + ("fastapi.openapi.models", "OAuthFlowClientCredentials"), + ("fastapi.openapi.models", "OAuthFlowImplicit"), + ("fastapi.openapi.models", "OAuthFlowPassword"), + ("fastapi.openapi.models", "OAuthFlows"), + ("fastapi.openapi.models", "OpenIdConnect"), + ("fastapi.openapi.models", "SecurityBase"), + ("fastapi.openapi.models", "SecurityScheme"), + ("fastapi.openapi.models", "SecuritySchemeType"), + ("google.adk.auth.auth_credential", "AuthCredential"), + ("google.adk.auth.auth_credential", "AuthCredentialTypes"), + ("google.adk.auth.auth_credential", "HttpAuth"), + ("google.adk.auth.auth_credential", "HttpCredentials"), + ("google.adk.auth.auth_credential", "OAuth2Auth"), + ("google.adk.auth.auth_credential", "ServiceAccountCredential"), + ("google.adk.auth.auth_schemes", "CustomAuthScheme"), + ("google.adk.auth.auth_schemes", "ExtendedOAuth2"), + ("google.adk.auth.auth_schemes", "OAuthGrantType"), + ("google.adk.auth.auth_schemes", "OpenIdConnectWithConfig"), + ("google.adk.auth.auth_tool", "AuthConfig"), + ("google.adk.events.event_actions", "EventActions"), + ("google.adk.events.event_actions", "EventCompaction"), + ("google.adk.events.ui_widget", "UiWidget"), + ("google.adk.tools.tool_confirmation", "ToolConfirmation"), + ("google.genai.types", "Blob"), + ("google.genai.types", "CodeExecutionResult"), + ("google.genai.types", "Content"), + ("google.genai.types", "ExecutableCode"), + ("google.genai.types", "FileData"), + ("google.genai.types", "FunctionCall"), + ("google.genai.types", "FunctionResponse"), + ("google.genai.types", "FunctionResponseBlob"), + ("google.genai.types", "FunctionResponseFileData"), + ("google.genai.types", "FunctionResponsePart"), + ("google.genai.types", "Part"), + ("google.genai.types", "PartMediaResolution"), + ("google.genai.types", "VideoMetadata"), +} + + +class _RestrictedUnpickler(pickle.Unpickler): + """Restricted unpickler for migrating legacy v0 schema actions. + + The v0 session schema stored `EventActions` as a pickled blob. During + migration we treat the raw bytes read from the source DB as untrusted input + and only allow the minimum set of safe globals needed to reconstruct + `EventActions`. + """ + + def find_class(self, module: str, name: str) -> Any: # noqa: ANN001 + if (module, name) in _ALLOWED_PICKLE_GLOBALS: + return super().find_class(module, name) + raise pickle.UnpicklingError( + f"Blocked global during migration unpickle: {module}.{name}" + ) + + +def _restricted_pickle_loads( + data: bytes, *, allow_unsafe_unpickling: bool = False +) -> Any: + """Load a pickle payload using the restricted unpickler by default.""" + if allow_unsafe_unpickling: + return pickle.loads(data) + return _RestrictedUnpickler(io.BytesIO(data)).load() + def _to_datetime_obj(val: Any) -> datetime | Any: """Converts string to datetime if needed.""" @@ -51,7 +139,9 @@ def _to_datetime_obj(val: Any) -> datetime | Any: return val -def _row_to_event(row: dict) -> Event: +def _row_to_event( + row: dict[str, Any], *, allow_unsafe_unpickling: bool = False +) -> Event: """Converts event row (dict) to event object, handling missing columns and deserializing.""" actions_val = row.get("actions") @@ -59,7 +149,9 @@ def _row_to_event(row: dict) -> Event: if actions_val is not None: try: if isinstance(actions_val, bytes): - actions = pickle.loads(actions_val) + actions = _restricted_pickle_loads( + actions_val, allow_unsafe_unpickling=allow_unsafe_unpickling + ) else: # for spanner - it might return object directly actions = actions_val except Exception as e: @@ -75,8 +167,7 @@ def _row_to_event(row: dict) -> Event: else: actions = EventActions() - def _safe_json_load(val): - data = None + def _safe_json_load(val: Any) -> dict[str, Any] | None: if isinstance(val, str): try: data = json.loads(val) @@ -84,8 +175,17 @@ def _safe_json_load(val): logger.warning(f"Failed to decode JSON for event {row.get('id')}") return None elif isinstance(val, dict): - data = val # for postgres JSONB - return data + return val # for postgres JSONB + else: + return None + + if isinstance(data, dict): + return data + logger.warning( + f"Expected JSON object for event {row.get('id')}, got" + f" {type(data).__name__}." + ) + return None content_dict = _safe_json_load(row.get("content")) grounding_metadata_dict = _safe_json_load(row.get("grounding_metadata")) @@ -147,23 +247,31 @@ def _safe_json_load(val): ) -def _get_state_dict(state_val: Any) -> dict: +def _get_state_dict(state_val: Any) -> dict[str, Any]: """Safely load dict from JSON string or return dict if already dict.""" if isinstance(state_val, dict): return state_val if isinstance(state_val, str): try: - return json.loads(state_val) + data = json.loads(state_val) except json.JSONDecodeError: logger.warning( "Failed to parse state JSON string, defaulting to empty dict." ) return {} + if isinstance(data, dict): + return data + logger.warning("State JSON was not an object, defaulting to empty dict.") + return {} return {} # --- Migration Logic --- -def migrate(source_db_url: str, dest_db_url: str): +def migrate( + source_db_url: str, + dest_db_url: str, + allow_unsafe_unpickling: bool = False, +) -> None: """Migrates data from old pickle schema to new JSON schema.""" # Convert async driver URLs to sync URLs for SQLAlchemy's synchronous engine. # This allows users to provide URLs like 'postgresql+asyncpg://...' and have @@ -172,6 +280,11 @@ def migrate(source_db_url: str, dest_db_url: str): dest_sync_url = _schema_check_utils.to_sync_url(dest_db_url) logger.info(f"Connecting to source database: {source_db_url}") + if allow_unsafe_unpickling: + logger.warning( + "Unsafe pickle migration mode is enabled. Only use this with a trusted" + " source database." + ) try: source_engine = create_engine(source_sync_url) SourceSession = sessionmaker(bind=source_engine) @@ -265,7 +378,10 @@ def migrate(source_db_url: str, dest_db_url: str): text("SELECT * FROM events") ).mappings(): try: - event_obj = _row_to_event(dict(row)) + event_obj = _row_to_event( + dict(row), + allow_unsafe_unpickling=allow_unsafe_unpickling, + ) new_event = v1.StorageEvent( id=event_obj.id, app_name=row["app_name"], @@ -309,9 +425,22 @@ def migrate(source_db_url: str, dest_db_url: str): required=True, help="SQLAlchemy URL of destination database", ) + parser.add_argument( + "--allow_unsafe_unpickling", + "--allow-unsafe-unpickling", + action="store_true", + help=( + "Allow legacy pickle payloads to use Python's unsafe pickle loader." + " Only use this with a trusted source database." + ), + ) args = parser.parse_args() try: - migrate(args.source_db_url, args.dest_db_url) + migrate( + args.source_db_url, + args.dest_db_url, + allow_unsafe_unpickling=args.allow_unsafe_unpickling, + ) except Exception as e: logger.error(f"Migration failed: {e}") sys.exit(1) diff --git a/src/google/adk/sessions/migration/migration_runner.py b/src/google/adk/sessions/migration/migration_runner.py index c46bab2179..1290ee67fc 100644 --- a/src/google/adk/sessions/migration/migration_runner.py +++ b/src/google/adk/sessions/migration/migration_runner.py @@ -42,7 +42,11 @@ LATEST_VERSION = _schema_check_utils.LATEST_SCHEMA_VERSION -def upgrade(source_db_url: str, dest_db_url: str): +def upgrade( + source_db_url: str, + dest_db_url: str, + allow_unsafe_unpickling: bool = False, +) -> None: """Migrates a database from its current version to the latest version. If the source database schema is older than the latest version, this @@ -61,6 +65,9 @@ def upgrade(source_db_url: str, dest_db_url: str): source_db_url: The SQLAlchemy URL of the database to migrate from. dest_db_url: The SQLAlchemy URL of the database to migrate to. This must be different from source_db_url. + allow_unsafe_unpickling: If true, use Python's unsafe pickle loader for the + legacy pickle migration step. Only use this with a trusted source + database. Raises: RuntimeError: If source_db_url and dest_db_url are the same, or if no @@ -113,7 +120,14 @@ def upgrade(source_db_url: str, dest_db_url: str): logger.info( f"Migrating from {in_url} to {out_url} (schema v{end_version})..." ) - migrate_func(in_url, out_url) + if migrate_func is migrate_from_sqlalchemy_pickle.migrate: + migrate_func( + in_url, + out_url, + allow_unsafe_unpickling=allow_unsafe_unpickling, + ) + else: + migrate_func(in_url, out_url) logger.info("Finished migration step to schema %s.", end_version) # The output of this step becomes the input for the next step. in_url = out_url diff --git a/tests/unittests/cli/utils/test_cli_tools_click.py b/tests/unittests/cli/utils/test_cli_tools_click.py index 4f77a71f16..43b0e8c169 100644 --- a/tests/unittests/cli/utils/test_cli_tools_click.py +++ b/tests/unittests/cli/utils/test_cli_tools_click.py @@ -1193,6 +1193,53 @@ def test_cli_web_passes_service_uris( assert called_kwargs.get("memory_service_uri") == "rag://mycorpus" +@pytest.mark.parametrize( + "flag", + ["--allow-unsafe-unpickling", "--allow_unsafe_unpickling"], +) +def test_cli_migrate_session_allows_unsafe_unpickling_flag( + monkeypatch: pytest.MonkeyPatch, flag: str +) -> None: + calls: list[dict[str, Any]] = [] + + def fake_upgrade( + source_db_url: str, + dest_db_url: str, + *, + allow_unsafe_unpickling: bool = False, + ) -> None: + calls.append({ + "source_db_url": source_db_url, + "dest_db_url": dest_db_url, + "allow_unsafe_unpickling": allow_unsafe_unpickling, + }) + + monkeypatch.setattr( + "google.adk.sessions.migration.migration_runner.upgrade", + fake_upgrade, + ) + + result = CliRunner().invoke( + cli_tools_click.main, + [ + "migrate", + "session", + "--source_db_url", + "sqlite:///source.db", + "--dest_db_url", + "sqlite:///dest.db", + flag, + ], + ) + + assert result.exit_code == 0, (result.output, repr(result.exception)) + assert calls == [{ + "source_db_url": "sqlite:///source.db", + "dest_db_url": "sqlite:///dest.db", + "allow_unsafe_unpickling": True, + }] + + def test_cli_eval_with_eval_set_file_path( mock_load_eval_set_from_file, mock_get_root_agent, diff --git a/tests/unittests/sessions/migration/test_migration.py b/tests/unittests/sessions/migration/test_migration.py index 5d9c207f20..9f54a2e0ac 100644 --- a/tests/unittests/sessions/migration/test_migration.py +++ b/tests/unittests/sessions/migration/test_migration.py @@ -17,14 +17,23 @@ from datetime import datetime from datetime import timezone +import os +import pickle +from fastapi.openapi.models import HTTPBearer +from google.adk.auth.auth_tool import AuthConfig from google.adk.events.event_actions import EventActions +from google.adk.events.event_actions import EventCompaction +from google.adk.events.ui_widget import UiWidget from google.adk.sessions.migration import _schema_check_utils from google.adk.sessions.migration import migrate_from_sqlalchemy_pickle as mfsp from google.adk.sessions.schemas import v0 from google.adk.sessions.schemas import v1 +from google.adk.tools.tool_confirmation import ToolConfirmation +from google.genai import types import pytest from sqlalchemy import create_engine +from sqlalchemy import text from sqlalchemy.orm import sessionmaker @@ -184,6 +193,307 @@ def test_migrate_from_sqlalchemy_pickle(tmp_path): dest_session.close() +def test_migrate_from_sqlalchemy_pickle_preserves_safe_actions_pickle(tmp_path): + """Migration should preserve normal v0 EventActions pickle payloads.""" + source_db_path = tmp_path / "source_pickle_safe_actions.db" + dest_db_path = tmp_path / "dest_json_safe_actions.db" + source_db_url = f"sqlite:///{source_db_path}" + dest_db_url = f"sqlite:///{dest_db_path}" + + source_engine = create_engine(source_db_url) + v0.Base.metadata.create_all(source_engine) + SourceSession = sessionmaker(bind=source_engine) + + now = datetime.now(timezone.utc) + with SourceSession() as source_session: + source_session.add( + v0.StorageSession( + app_name="app1", + user_id="user1", + id="session1", + state={}, + create_time=now, + update_time=now, + ) + ) + source_session.commit() + + actions = EventActions( + state_delta={"skey": "updated"}, + artifact_delta={"artifact.txt": 2}, + ) + source_session.add( + v0.StorageEvent( + id="event1", + app_name="app1", + user_id="user1", + session_id="session1", + invocation_id="invoke1", + author="user", + actions=actions, + timestamp=now, + ) + ) + source_session.commit() + + mfsp.migrate(source_db_url, dest_db_url) + + dest_engine = create_engine(dest_db_url) + DestSession = sessionmaker(bind=dest_engine) + with DestSession() as dest_session: + event_res = dest_session.query(v1.StorageEvent).first() + assert event_res is not None + assert event_res.event_data["actions"]["state_delta"] == {"skey": "updated"} + assert event_res.event_data["actions"]["artifact_delta"] == { + "artifact.txt": 2 + } + + +def test_migrate_from_sqlalchemy_pickle_preserves_nested_safe_actions_pickle( + tmp_path, +): + """Migration should allow standard nested EventActions models.""" + source_db_path = tmp_path / "source_pickle_nested_actions.db" + dest_db_path = tmp_path / "dest_json_nested_actions.db" + source_db_url = f"sqlite:///{source_db_path}" + dest_db_url = f"sqlite:///{dest_db_path}" + + source_engine = create_engine(source_db_url) + v0.Base.metadata.create_all(source_engine) + SourceSession = sessionmaker(bind=source_engine) + + now = datetime.now(timezone.utc) + with SourceSession() as source_session: + source_session.add( + v0.StorageSession( + app_name="app1", + user_id="user1", + id="session1", + state={}, + create_time=now, + update_time=now, + ) + ) + source_session.commit() + + actions = EventActions( + requested_auth_configs={ + "fc-auth": AuthConfig(auth_scheme=HTTPBearer()) + }, + requested_tool_confirmations={ + "fc-confirm": ToolConfirmation(hint="Authorize execution?") + }, + compaction=EventCompaction( + start_timestamp=1.0, + end_timestamp=2.0, + compacted_content=types.Content( + parts=[types.Part(text="summary")], + role="model", + ), + ), + ) + source_session.add( + v0.StorageEvent( + id="event1", + app_name="app1", + user_id="user1", + session_id="session1", + invocation_id="invoke1", + author="user", + actions=actions, + timestamp=now, + ) + ) + source_session.commit() + + mfsp.migrate(source_db_url, dest_db_url) + + dest_engine = create_engine(dest_db_url) + DestSession = sessionmaker(bind=dest_engine) + with DestSession() as dest_session: + event_res = dest_session.query(v1.StorageEvent).first() + assert event_res is not None + actions_data = event_res.event_data["actions"] + assert "fc-auth" in actions_data["requested_auth_configs"] + assert ( + actions_data["requested_tool_confirmations"]["fc-confirm"]["hint"] + == "Authorize execution?" + ) + assert ( + actions_data["compaction"]["compacted_content"]["parts"][0]["text"] + == "summary" + ) + + +def test_restricted_actions_unpickler_allows_datetime_state_delta(): + """Standard timestamp objects in action deltas should migrate by default.""" + last_seen = datetime(2026, 1, 1, 12, 30, tzinfo=timezone.utc) + actions = EventActions(state_delta={"last_seen": last_seen}) + + loaded_actions = mfsp._restricted_pickle_loads(pickle.dumps(actions)) + + assert isinstance(loaded_actions, EventActions) + assert loaded_actions.state_delta["last_seen"] == last_seen + + +def test_restricted_actions_unpickler_allows_ui_widgets(): + """Standard UI widget action metadata should migrate by default.""" + actions = EventActions( + render_ui_widgets=[ + UiWidget( + id="widget-1", + provider="mcp", + payload={"resource_uri": "ui://widget"}, + ) + ] + ) + + loaded_actions = mfsp._restricted_pickle_loads(pickle.dumps(actions)) + + assert isinstance(loaded_actions, EventActions) + assert loaded_actions.render_ui_widgets == actions.render_ui_widgets + + +def test_migrate_from_sqlalchemy_pickle_ignores_non_object_json_fields(): + """Event JSON model fields should only decode object payloads.""" + event = mfsp._row_to_event({ + "id": "event-list-content", + "invocation_id": "invoke1", + "author": "user", + "timestamp": datetime(2026, 1, 1, tzinfo=timezone.utc), + "content": "[1, 2, 3]", + }) + + assert event.content is None + + +def test_migrate_from_sqlalchemy_pickle_blocks_unsafe_actions_pickle( + tmp_path, monkeypatch +): + """Migration should not execute arbitrary globals from a pickled actions blob.""" + monkeypatch.delenv("ADK_MIGRATION_PICKLE_RCE", raising=False) + + source_db_path = tmp_path / "source_pickle_unsafe_actions.db" + dest_db_path = tmp_path / "dest_json_unsafe_actions.db" + source_db_url = f"sqlite:///{source_db_path}" + dest_db_url = f"sqlite:///{dest_db_path}" + + source_engine = create_engine(source_db_url) + v0.Base.metadata.create_all(source_engine) + SourceSession = sessionmaker(bind=source_engine) + + # Populate source DB with a valid session row to satisfy the FK constraint, + # then insert a malicious pickled actions blob directly as raw bytes. + now = datetime.now(timezone.utc) + with SourceSession() as source_session: + source_session.add( + v0.StorageSession( + app_name="app1", + user_id="user1", + id="session1", + state={}, + create_time=now, + update_time=now, + ) + ) + source_session.commit() + + class Evil: + + def __reduce__(self): + # This is intentionally non-destructive: it only sets an env var. + return ( + exec, + ("import os; os.environ['ADK_MIGRATION_PICKLE_RCE']='1'",), + ) + + source_session.execute( + text( + "INSERT INTO events (id, app_name, user_id, session_id," + " invocation_id, author, actions, timestamp) VALUES (:id," + " :app_name, :user_id, :session_id, :invocation_id, :author," + " :actions, :timestamp)" + ), + { + "id": "event1", + "app_name": "app1", + "user_id": "user1", + "session_id": "session1", + "invocation_id": "invoke1", + "author": "user", + "actions": pickle.dumps(Evil()), + "timestamp": now, + }, + ) + source_session.commit() + + mfsp.migrate(source_db_url, dest_db_url) + + assert os.environ.get("ADK_MIGRATION_PICKLE_RCE") is None + + +def test_migrate_from_sqlalchemy_pickle_allows_unsafe_actions_pickle_when_opted_in( + tmp_path, monkeypatch +): + """Unsafe pickle loading should require an explicit migration opt-in.""" + monkeypatch.delenv("ADK_MIGRATION_PICKLE_RCE", raising=False) + + source_db_path = tmp_path / "source_pickle_unsafe_opt_in_actions.db" + dest_db_path = tmp_path / "dest_json_unsafe_opt_in_actions.db" + source_db_url = f"sqlite:///{source_db_path}" + dest_db_url = f"sqlite:///{dest_db_path}" + + source_engine = create_engine(source_db_url) + v0.Base.metadata.create_all(source_engine) + SourceSession = sessionmaker(bind=source_engine) + + now = datetime.now(timezone.utc) + with SourceSession() as source_session: + source_session.add( + v0.StorageSession( + app_name="app1", + user_id="user1", + id="session1", + state={}, + create_time=now, + update_time=now, + ) + ) + source_session.commit() + + class Evil: + + def __reduce__(self): + return ( + exec, + ("import os; os.environ['ADK_MIGRATION_PICKLE_RCE']='1'",), + ) + + source_session.execute( + text( + "INSERT INTO events (id, app_name, user_id, session_id," + " invocation_id, author, actions, timestamp) VALUES (:id," + " :app_name, :user_id, :session_id, :invocation_id, :author," + " :actions, :timestamp)" + ), + { + "id": "event1", + "app_name": "app1", + "user_id": "user1", + "session_id": "session1", + "invocation_id": "invoke1", + "author": "user", + "actions": pickle.dumps(Evil()), + "timestamp": now, + }, + ) + source_session.commit() + + mfsp.migrate(source_db_url, dest_db_url, allow_unsafe_unpickling=True) + + assert os.environ.get("ADK_MIGRATION_PICKLE_RCE") == "1" + + def test_migrate_from_sqlalchemy_pickle_with_async_driver_urls(tmp_path): """Tests that migration works with async driver URLs (fixes issue #4176). From 5b06baf5c1e777aa1acae6dfd0ddcdfde92c056c Mon Sep 17 00:00:00 2001 From: Google Team Member Date: Fri, 5 Jun 2026 12:34:18 -0700 Subject: [PATCH 60/94] fix: retry TypeAdapter creation without config if it fails PiperOrigin-RevId: 927430716 --- .../adk/tools/_function_tool_declarations.py | 19 ++++++++++++++---- tests/unittests/tools/BUILD | 9 +++++++++ .../tools/test_function_tool_declarations.py | 20 +++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/google/adk/tools/_function_tool_declarations.py b/src/google/adk/tools/_function_tool_declarations.py index 971cdc093a..a835cd899e 100644 --- a/src/google/adk/tools/_function_tool_declarations.py +++ b/src/google/adk/tools/_function_tool_declarations.py @@ -162,10 +162,21 @@ def _build_response_json_schema( return_annotation = type_args[0] try: - adapter = pydantic.TypeAdapter( - return_annotation, - config=pydantic.ConfigDict(arbitrary_types_allowed=True), - ) + try: + adapter = pydantic.TypeAdapter( + return_annotation, + config=pydantic.ConfigDict(arbitrary_types_allowed=True), + ) + except pydantic.PydanticUserError as e: + # If it failed, maybe it was because of the config argument (e.g. for dataclasses). + # Retry without config. + logging.debug( + 'Failed to build schema with config, retrying without config for' + ' %s: %s', + func.__name__, + e, + ) + adapter = pydantic.TypeAdapter(return_annotation) return adapter.json_schema() except Exception: logging.warning( diff --git a/tests/unittests/tools/BUILD b/tests/unittests/tools/BUILD index 48c28cb449..039b934104 100644 --- a/tests/unittests/tools/BUILD +++ b/tests/unittests/tools/BUILD @@ -44,3 +44,12 @@ pytest_test( "//third_party/py/pytest_asyncio", ], ) + +pytest_test( + name = "test_function_tool_declarations", + srcs = ["test_function_tool_declarations.py"], + deps = [ + "//third_party/py/absl/testing:parameterized", + "//third_party/py/google/adk", + ], +) diff --git a/tests/unittests/tools/test_function_tool_declarations.py b/tests/unittests/tools/test_function_tool_declarations.py index b7046d344c..1efa438f33 100644 --- a/tests/unittests/tools/test_function_tool_declarations.py +++ b/tests/unittests/tools/test_function_tool_declarations.py @@ -21,6 +21,7 @@ from __future__ import annotations from collections.abc import Sequence +import dataclasses from enum import Enum from typing import Any from typing import AsyncGenerator @@ -76,6 +77,13 @@ class Window: height: int +@dataclasses.dataclass +class StandardReturnDataclass: + """A standard library dataclass for testing.""" + + status: str + + class TestBasicTypes(parameterized.TestCase): """Tests for basic Python types.""" @@ -618,6 +626,18 @@ def save_addresses(addresses: list[Address]) -> int: }, ) + def test_returns_standard_dataclass(self): + """Test function that returns a standard library dataclass.""" + + def get_status() -> StandardReturnDataclass: + return StandardReturnDataclass(status="ok") + + decl = build_function_declaration_with_json_schema(get_status) + + self.assertIsNotNone(decl.response_json_schema) + self.assertEqual(decl.response_json_schema["type"], "object") + self.assertIn("status", decl.response_json_schema["properties"]) + class TestSpecialCases(parameterized.TestCase): """Tests for special cases and edge cases.""" From cd507c1522f2a51e26af8c28fdb6c78277d9a0fe Mon Sep 17 00:00:00 2001 From: Yifan Wang Date: Fri, 5 Jun 2026 12:47:51 -0700 Subject: [PATCH 61/94] feat: include thoughts and tool calls in compaction summaries Port of GitHub PR: bdb55826 The compaction summarizer fed only message text to the LLM, dropping agent thoughts and tool calls/responses. Include them, skip a prior compaction's own thought, and reiterate the user request in the default prompt to reduce drift. Co-authored-by: Yifan Wang PiperOrigin-RevId: 927437249 --- src/google/adk/apps/llm_event_summarizer.py | 54 ++++++++++--- .../apps/test_llm_event_summarizer.py | 80 ++++++++++++++++++- 2 files changed, 120 insertions(+), 14 deletions(-) diff --git a/src/google/adk/apps/llm_event_summarizer.py b/src/google/adk/apps/llm_event_summarizer.py index 28cbea4adf..5bb7275232 100644 --- a/src/google/adk/apps/llm_event_summarizer.py +++ b/src/google/adk/apps/llm_event_summarizer.py @@ -47,13 +47,19 @@ class LlmEventSummarizer(BaseEventsSummarizer): """ _DEFAULT_PROMPT_TEMPLATE = ( - 'The following is a conversation history between a user and an AI' - ' agent. Please summarize the conversation, focusing on key' - ' information and decisions made, as well as any unresolved' + 'The following is a conversation history between a user and an AI agent.' + ' It may or may not start from a compacted history. Please identify and' + ' reiterate the user request, summarize the context so far, focusing on' + ' key decisions made and information obtained, as well as any unresolved' ' questions or tasks. The summary should be concise and capture the' - ' essence of the interaction.\\n\\n{conversation_history}' + ' essence of the interaction.\n\n{conversation_history}' ) + # Tool call args and responses can be large (e.g. search results). Cap how + # much of each is rendered so compaction does not inflate the very context + # it exists to shrink. + _MAX_TOOL_CONTENT_CHARS = 2000 + def __init__( self, llm: BaseLlm, @@ -71,14 +77,42 @@ def __init__( self._prompt_template = prompt_template or self._DEFAULT_PROMPT_TEMPLATE def _format_events_for_prompt(self, events: list[Event]) -> str: - """Formats a list of events into a string for the LLM prompt.""" + """Formats events into prompt text, including thoughts and tool calls. + + Thoughts carry the agent's analysis of tool responses, and tool calls and + responses carry the evidence retrieved so far, so all three are included. + Thoughts emitted by a compaction event are skipped so a prior summary's + reasoning does not leak into the next summary. + """ formatted_history = [] for event in events: - if event.content and event.content.parts: - for part in event.content.parts: - if part.text: - formatted_history.append(f'{event.author}: {part.text}') - return '\\n'.join(formatted_history) + if not (event.content and event.content.parts): + continue + is_compaction = bool(event.actions and event.actions.compaction) + for part in event.content.parts: + if part.thought and part.text: + if not is_compaction: + formatted_history.append(f'{event.author} (thought): {part.text}') + elif part.text: + formatted_history.append(f'{event.author}: {part.text}') + if part.function_call: + args = self._truncate(str(part.function_call.args)) + formatted_history.append( + f'{event.author} called tool: {part.function_call.name}({args})' + ) + if part.function_response: + response = self._truncate(str(part.function_response.response)) + formatted_history.append( + f'Tool response from {part.function_response.name}: {response}' + ) + return '\n'.join(formatted_history) + + def _truncate(self, text: str) -> str: + """Caps `text` at the tool-content limit, marking dropped characters.""" + limit = self._MAX_TOOL_CONTENT_CHARS + if len(text) <= limit: + return text + return f'{text[:limit]}... [truncated {len(text) - limit} chars]' async def maybe_summarize_events( self, *, events: list[Event] diff --git a/tests/unittests/apps/test_llm_event_summarizer.py b/tests/unittests/apps/test_llm_event_summarizer.py index 75401cedda..3ce7c6ddf2 100644 --- a/tests/unittests/apps/test_llm_event_summarizer.py +++ b/tests/unittests/apps/test_llm_event_summarizer.py @@ -54,7 +54,7 @@ async def test_maybe_compact_events_success(self): self._create_event(1.0, 'Hello', 'user'), self._create_event(2.0, 'Hi there!', 'model'), ] - expected_conversation_history = 'user: Hello\\nmodel: Hi there!' + expected_conversation_history = 'user: Hello\nmodel: Hi there!' expected_prompt = self.compactor._DEFAULT_PROMPT_TEMPLATE.format( conversation_history=expected_conversation_history ) @@ -162,7 +162,7 @@ def test_format_events_for_prompt(self): parts=[ Part( function_call=FunctionCall( - id='call_1', name='tool', args={} + id='call_1', name='tool', args={'q': 'x'} ) ) ] @@ -186,8 +186,80 @@ def test_format_events_for_prompt(self): ), ] expected_formatted_history = ( - 'user: User says...\\nmodel: Model replies...\\nuser: Another user' - ' input\\nmodel: More model text' + 'user: User says...\nmodel: Model replies...\nuser: Another user' + ' input\nmodel: More model text\nmodel called tool:' + " tool({'q': 'x'})\nTool response from tool: {'result': 'done'}" ) formatted_history = self.compactor._format_events_for_prompt(events) self.assertEqual(formatted_history, expected_formatted_history) + + def test_format_events_for_prompt_includes_thoughts(self): + events = [ + self._create_event(1.0, 'What is the weather?', 'user'), + Event( + timestamp=2.0, + author='model', + content=Content( + parts=[ + Part(text='Let me check the tool output.', thought=True), + Part(text='It is sunny.'), + ] + ), + ), + ] + expected_formatted_history = ( + 'user: What is the weather?\nmodel (thought): Let me check the tool' + ' output.\nmodel: It is sunny.' + ) + formatted_history = self.compactor._format_events_for_prompt(events) + self.assertEqual(formatted_history, expected_formatted_history) + + def test_format_events_for_prompt_skips_compaction_event_thought(self): + events = [ + Event( + timestamp=1.0, + author='model', + content=Content( + parts=[ + Part(text='Stale summarizer reasoning.', thought=True), + Part(text='Prior summary.'), + ] + ), + actions=EventActions( + compaction=EventCompaction( + start_timestamp=0.0, + end_timestamp=1.0, + compacted_content=Content(parts=[Part(text='Prior')]), + ) + ), + ), + self._create_event(2.0, 'New user input', 'user'), + ] + expected_formatted_history = 'model: Prior summary.\nuser: New user input' + formatted_history = self.compactor._format_events_for_prompt(events) + self.assertEqual(formatted_history, expected_formatted_history) + + def test_format_events_for_prompt_truncates_large_tool_response(self): + limit = self.compactor._MAX_TOOL_CONTENT_CHARS + large_value = 'x' * (limit + 500) + events = [ + Event( + timestamp=1.0, + author='model', + content=Content( + parts=[ + Part( + function_response=FunctionResponse( + id='call_1', + name='search', + response={'data': large_value}, + ) + ) + ] + ), + ), + ] + formatted_history = self.compactor._format_events_for_prompt(events) + self.assertIn('Tool response from search:', formatted_history) + self.assertIn('... [truncated', formatted_history) + self.assertLess(len(formatted_history), len(large_value)) From 7e0c7e0814cb3b0ccd3f168d6197f47b97c0c62e Mon Sep 17 00:00:00 2001 From: Yifan Wang Date: Fri, 5 Jun 2026 12:55:52 -0700 Subject: [PATCH 62/94] fix: allow internal builder assistant app name Port of GitHub PR: https://github.com/google/adk-python/pull/5918 Allows special agent names starting with "__" (e.g. "__adk_agent_builder_assistant") by wrapping them with App.model_construct instead of App constructor which validates name. Co-authored-by: Yifan Wang PiperOrigin-RevId: 927441017 --- src/google/adk/cli/api_server.py | 30 ++++++++++++++++-------- tests/unittests/cli/test_fast_api.py | 34 ++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/src/google/adk/cli/api_server.py b/src/google/adk/cli/api_server.py index 6ad354a344..4b41b4bfeb 100644 --- a/src/google/adk/cli/api_server.py +++ b/src/google/adk/cli/api_server.py @@ -680,6 +680,24 @@ def _maybe_add_bq_plugin(plugins: list[BasePlugin]) -> list[BasePlugin]: ) return plugins + def _wrap_loaded_agent( + app_name: str, + agent_or_app: Any, + plugins: list[BasePlugin], + ) -> App: + if app_name.startswith("__"): + # AgentLoader validates special agents before they reach this point. + return App.model_construct( + name=app_name, + root_agent=agent_or_app, + plugins=plugins, + ) + return App( + name=app_name, + root_agent=agent_or_app, + plugins=plugins, + ) + if isinstance(agent_or_app, App): # Combine existing plugins with extra plugins plugins = _maybe_add_bq_plugin( @@ -689,17 +707,11 @@ def _maybe_add_bq_plugin(plugins: list[BasePlugin]) -> list[BasePlugin]: agentic_app = agent_or_app elif isinstance(agent_or_app, BaseAgent): plugins = _maybe_add_bq_plugin(extra_plugins_instances) - agentic_app = App( - name=app_name, - root_agent=agent_or_app, - plugins=plugins, - ) + agentic_app = _wrap_loaded_agent(app_name, agent_or_app, plugins) else: # BaseNode (non-agent) - agentic_app = App( - name=app_name, - root_agent=agent_or_app, - plugins=extra_plugins_instances, + agentic_app = _wrap_loaded_agent( + app_name, agent_or_app, extra_plugins_instances ) # If the root agent was loaded from YAML, we treat it as being from Visual Builder diff --git a/tests/unittests/cli/test_fast_api.py b/tests/unittests/cli/test_fast_api.py index b00dd118d2..a6d1170e57 100755 --- a/tests/unittests/cli/test_fast_api.py +++ b/tests/unittests/cli/test_fast_api.py @@ -644,6 +644,40 @@ def test_agent_with_bigquery_analytics_plugin( assert getattr(runner.app, "_is_visual_builder_app", False) is True +def test_get_runner_async_accepts_internal_special_agent_name( + tmp_path, + mock_session_service, + mock_artifact_service, + mock_memory_service, + mock_agent_loader, + mock_eval_sets_manager, + mock_eval_set_results_manager, +): + from google.adk.cli.adk_web_server import AdkWebServer + + special_app_name = "__adk_agent_builder_assistant" + special_agent = DummyAgent(name="agent_builder_assistant") + mock_agent_loader.load_agent = MagicMock(return_value=special_agent) + + adk_web_server = AdkWebServer( + agent_loader=mock_agent_loader, + session_service=mock_session_service, + memory_service=mock_memory_service, + artifact_service=mock_artifact_service, + credential_service=MagicMock(), + eval_sets_manager=mock_eval_sets_manager, + eval_set_results_manager=mock_eval_set_results_manager, + agents_dir=str(tmp_path), + ) + + runner = asyncio.run(adk_web_server.get_runner_async(special_app_name)) + + assert runner.app.name == special_app_name + assert runner.app.root_agent is special_agent + mock_agent_loader.load_agent.assert_called_once_with(special_app_name) + + + @pytest.fixture def test_app( mock_session_service, From 50d00d2cfef56edc40ee10546c3d8473c9b67e1b Mon Sep 17 00:00:00 2001 From: Yifan Wang Date: Fri, 5 Jun 2026 12:55:59 -0700 Subject: [PATCH 63/94] chore: update adk web, support a2ui and fix thought part Co-authored-by: Yifan Wang PiperOrigin-RevId: 927441067 --- src/google/adk/cli/browser/chunk-3YZ77ADE.js | 4 +- src/google/adk/cli/browser/chunk-B2DSW4QB.js | 2 +- src/google/adk/cli/browser/chunk-BDIW4D5I.js | 2 +- src/google/adk/cli/browser/chunk-NALL4A3P.js | 10 +- src/google/adk/cli/browser/chunk-QGHEW6NO.js | 2 +- src/google/adk/cli/browser/chunk-S22PTQH2.js | 2 +- src/google/adk/cli/browser/chunk-T2UY75BD.js | 2 +- src/google/adk/cli/browser/chunk-W7PRDKNL.js | 4 +- src/google/adk/cli/browser/chunk-YVVLWU7S.js | 32 +- src/google/adk/cli/browser/index.html | 966 +++- src/google/adk/cli/browser/main-3CUQG2IN.js | 4196 ++++++++++++++++++ src/google/adk/cli/browser/main-LMS5QHZN.js | 4177 ----------------- src/google/adk/cli/browser/prism-dark.css | 1 - src/google/adk/cli/browser/prism-light.css | 1 - 14 files changed, 5186 insertions(+), 4215 deletions(-) create mode 100644 src/google/adk/cli/browser/main-3CUQG2IN.js delete mode 100644 src/google/adk/cli/browser/main-LMS5QHZN.js delete mode 100644 src/google/adk/cli/browser/prism-dark.css delete mode 100644 src/google/adk/cli/browser/prism-light.css diff --git a/src/google/adk/cli/browser/chunk-3YZ77ADE.js b/src/google/adk/cli/browser/chunk-3YZ77ADE.js index 3253c2d891..08b10f4c24 100644 --- a/src/google/adk/cli/browser/chunk-3YZ77ADE.js +++ b/src/google/adk/cli/browser/chunk-3YZ77ADE.js @@ -16,10 +16,10 @@ import{a as Ke}from"./chunk-DMWOYWYQ.js";import{a as je}from"./chunk-T3Q3QCCV.js stroke-dasharray: 8; } .node-icon-text { - display: flex; + display: flex; align-items: center; } - + .node-icon-text > div { color: #fff; margin: 1px; diff --git a/src/google/adk/cli/browser/chunk-B2DSW4QB.js b/src/google/adk/cli/browser/chunk-B2DSW4QB.js index b05d08635a..43d0ec93ef 100644 --- a/src/google/adk/cli/browser/chunk-B2DSW4QB.js +++ b/src/google/adk/cli/browser/chunk-B2DSW4QB.js @@ -6,7 +6,7 @@ import{g as e}from"./chunk-JRNAXTJ7.js";var l=e(()=>` overflow: visible; vertical-align: -0.125em; } - + .node .label-icon path { fill: currentColor; stroke: revert; diff --git a/src/google/adk/cli/browser/chunk-BDIW4D5I.js b/src/google/adk/cli/browser/chunk-BDIW4D5I.js index 07519d00bd..0dbe5bd4a3 100644 --- a/src/google/adk/cli/browser/chunk-BDIW4D5I.js +++ b/src/google/adk/cli/browser/chunk-BDIW4D5I.js @@ -1,5 +1,5 @@ import{a as re}from"./chunk-DMWOYWYQ.js";import{a as se}from"./chunk-T3Q3QCCV.js";import{a as ae}from"./chunk-4R6SYGKS.js";import"./chunk-NQKWI5EB.js";import"./chunk-WR6HISGZ.js";import"./chunk-I4UDKKN5.js";import"./chunk-2DLZXFEQ.js";import"./chunk-JNY2YWG7.js";import"./chunk-XULIXUQL.js";import"./chunk-3NJNOY56.js";import"./chunk-NALL4A3P.js";import{f as Q,l as ee,m as te}from"./chunk-WBLSVR3V.js";import"./chunk-GP6TCC26.js";import{A as j,M as C,R as F,S as K,T as Y,U as Z,V as U,W as V,X as J,aa as X,r as z}from"./chunk-QFMJV7VH.js";import{a as S,g as l,i as u}from"./chunk-JRNAXTJ7.js";import"./chunk-ASJUXEUE.js";import"./chunk-EGBSMT36.js";import{a as I,b as _,j as N}from"./chunk-RMXJBC7V.js";var x={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4},me=z.gitGraph,M=l(()=>ee(I(I({},me),j().gitGraph)),"getConfig"),n=new ae(()=>{let r=M(),e=r.mainBranchName,a=r.mainBranchOrder;return{mainBranchName:e,commits:new Map,head:null,branchConfig:new Map([[e,{name:e,order:a}]]),branches:new Map([[e,null]]),currBranch:e,direction:"LR",seq:0,options:{}}});function A(){return Q({length:7})}l(A,"getID");function ce(r,e){let a=Object.create(null);return r.reduce((o,t)=>{let s=e(t);return a[s]||(a[s]=!0,o.push(t)),o},[])}l(ce,"uniqBy");var pe=l(function(r){n.records.direction=r},"setDirection"),ge=l(function(r){u.debug("options str",r),r=r?.trim(),r=r||"{}";try{n.records.options=JSON.parse(r)}catch(e){u.error("error while parsing gitGraph options",e.message)}},"setOptions"),fe=l(function(){return n.records.options},"getOptions"),ye=l(function(r){let e=r.msg,a=r.id,o=r.type,t=r.tags;u.info("commit",e,a,o,t),u.debug("Entering commit:",e,a,o,t);let s=M();a=C.sanitizeText(a,s),e=C.sanitizeText(e,s),t=t?.map(d=>C.sanitizeText(d,s));let h={id:a||n.records.seq+"-"+A(),message:e,seq:n.records.seq++,type:o??x.NORMAL,tags:t??[],parents:n.records.head==null?[]:[n.records.head.id],branch:n.records.currBranch};n.records.head=h,u.info("main branch",s.mainBranchName),n.records.commits.has(h.id)&&u.warn(`Commit ID ${h.id} already exists`),n.records.commits.set(h.id,h),n.records.branches.set(n.records.currBranch,h.id),u.debug("in pushCommit "+h.id)},"commit"),$e=l(function(r){let e=r.name,a=r.order;if(e=C.sanitizeText(e,M()),n.records.branches.has(e))throw new Error(`Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout ${e}")`);n.records.branches.set(e,n.records.head!=null?n.records.head.id:null),n.records.branchConfig.set(e,{name:e,order:a}),ne(e),u.debug("in createBranch")},"branch"),xe=l(r=>{let e=r.branch,a=r.id,o=r.type,t=r.tags,s=M();e=C.sanitizeText(e,s),a&&(a=C.sanitizeText(a,s));let h=n.records.branches.get(n.records.currBranch),d=n.records.branches.get(e),c=h?n.records.commits.get(h):void 0,m=d?n.records.commits.get(d):void 0;if(c&&m&&c.branch===e)throw new Error(`Cannot merge branch '${e}' into itself.`);if(n.records.currBranch===e){let i=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},i}if(c===void 0||!c){let i=new Error(`Incorrect usage of "merge". Current branch (${n.records.currBranch})has no commits`);throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["commit"]},i}if(!n.records.branches.has(e)){let i=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") does not exist");throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:[`branch ${e}`]},i}if(m===void 0||!m){let i=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") has no commits");throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:['"commit"']},i}if(c===m){let i=new Error('Incorrect usage of "merge". Both branches have same head');throw i.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},i}if(a&&n.records.commits.has(a)){let i=new Error('Incorrect usage of "merge". Commit with id:'+a+" already exists, use different custom id");throw i.hash={text:`merge ${e} ${a} ${o} ${t?.join(" ")}`,token:`merge ${e} ${a} ${o} ${t?.join(" ")}`,expected:[`merge ${e} ${a}_UNIQUE ${o} ${t?.join(" ")}`]},i}let p=d||"",f={id:a||`${n.records.seq}-${A()}`,message:`merged branch ${e} into ${n.records.currBranch}`,seq:n.records.seq++,parents:n.records.head==null?[]:[n.records.head.id,p],branch:n.records.currBranch,type:x.MERGE,customType:o,customId:!!a,tags:t??[]};n.records.head=f,n.records.commits.set(f.id,f),n.records.branches.set(n.records.currBranch,f.id),u.debug(n.records.branches),u.debug("in mergeBranch")},"merge"),ue=l(function(r){let e=r.id,a=r.targetId,o=r.tags,t=r.parent;u.debug("Entering cherryPick:",e,a,o);let s=M();if(e=C.sanitizeText(e,s),a=C.sanitizeText(a,s),o=o?.map(c=>C.sanitizeText(c,s)),t=C.sanitizeText(t,s),!e||!n.records.commits.has(e)){let c=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw c.hash={text:`cherryPick ${e} ${a}`,token:`cherryPick ${e} ${a}`,expected:["cherry-pick abc"]},c}let h=n.records.commits.get(e);if(h===void 0||!h)throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');if(t&&!(Array.isArray(h.parents)&&h.parents.includes(t)))throw new Error("Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.");let d=h.branch;if(h.type===x.MERGE&&!t)throw new Error("Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.");if(!a||!n.records.commits.has(a)){if(d===n.records.currBranch){let f=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw f.hash={text:`cherryPick ${e} ${a}`,token:`cherryPick ${e} ${a}`,expected:["cherry-pick abc"]},f}let c=n.records.branches.get(n.records.currBranch);if(c===void 0||!c){let f=new Error(`Incorrect usage of "cherry-pick". Current branch (${n.records.currBranch})has no commits`);throw f.hash={text:`cherryPick ${e} ${a}`,token:`cherryPick ${e} ${a}`,expected:["cherry-pick abc"]},f}let m=n.records.commits.get(c);if(m===void 0||!m){let f=new Error(`Incorrect usage of "cherry-pick". Current branch (${n.records.currBranch})has no commits`);throw f.hash={text:`cherryPick ${e} ${a}`,token:`cherryPick ${e} ${a}`,expected:["cherry-pick abc"]},f}let p={id:n.records.seq+"-"+A(),message:`cherry-picked ${h?.message} into ${n.records.currBranch}`,seq:n.records.seq++,parents:n.records.head==null?[]:[n.records.head.id,h.id],branch:n.records.currBranch,type:x.CHERRY_PICK,tags:o?o.filter(Boolean):[`cherry-pick:${h.id}${h.type===x.MERGE?`|parent:${t}`:""}`]};n.records.head=p,n.records.commits.set(p.id,p),n.records.branches.set(n.records.currBranch,p.id),u.debug(n.records.branches),u.debug("in cherryPick")}},"cherryPick"),ne=l(function(r){if(r=C.sanitizeText(r,M()),n.records.branches.has(r)){n.records.currBranch=r;let e=n.records.branches.get(n.records.currBranch);e===void 0||!e?n.records.head=null:n.records.head=n.records.commits.get(e)??null}else{let e=new Error(`Trying to checkout branch which is not yet created. (Help try using "branch ${r}")`);throw e.hash={text:`checkout ${r}`,token:`checkout ${r}`,expected:[`branch ${r}`]},e}},"checkout");function W(r,e,a){let o=r.indexOf(e);o===-1?r.push(a):r.splice(o,1,a)}l(W,"upsert");function H(r){let e=r.reduce((t,s)=>t.seq>s.seq?t:s,r[0]),a="";r.forEach(function(t){t===e?a+=" *":a+=" |"});let o=[a,e.id,e.seq];for(let t in n.records.branches)n.records.branches.get(t)===e.id&&o.push(t);if(u.debug(o.join(" ")),e.parents&&e.parents.length==2&&e.parents[0]&&e.parents[1]){let t=n.records.commits.get(e.parents[0]);W(r,e,t),e.parents[1]&&r.push(n.records.commits.get(e.parents[1]))}else{if(e.parents.length==0)return;if(e.parents[0]){let t=n.records.commits.get(e.parents[0]);W(r,e,t)}}r=ce(r,t=>t.id),H(r)}l(H,"prettyPrintCommitHistory");var be=l(function(){u.debug(n.records.commits);let r=ie()[0];H([r])},"prettyPrint"),we=l(function(){n.reset(),F()},"clear"),Ce=l(function(){return[...n.records.branchConfig.values()].map((e,a)=>e.order!==null&&e.order!==void 0?e:_(I({},e),{order:parseFloat(`0.${a}`)})).sort((e,a)=>(e.order??0)-(a.order??0)).map(({name:e})=>({name:e}))},"getBranchesAsObjArray"),Be=l(function(){return n.records.branches},"getBranches"),ve=l(function(){return n.records.commits},"getCommits"),ie=l(function(){let r=[...n.records.commits.values()];return r.forEach(function(e){u.debug(e.id)}),r.sort((e,a)=>e.seq-a.seq),r},"getCommitsArray"),ke=l(function(){return n.records.currBranch},"getCurrentBranch"),Te=l(function(){return n.records.direction},"getDirection"),Ee=l(function(){return n.records.head},"getHead"),de={commitType:x,getConfig:M,setDirection:pe,setOptions:ge,getOptions:fe,commit:ye,branch:$e,merge:xe,cherryPick:ue,checkout:ne,prettyPrint:be,clear:we,getBranchesAsObjArray:Ce,getBranches:Be,getCommits:ve,getCommitsArray:ie,getCurrentBranch:ke,getDirection:Te,getHead:Ee,setAccTitle:K,getAccTitle:Y,getAccDescription:U,setAccDescription:Z,setDiagramTitle:V,getDiagramTitle:J},Le=l((r,e)=>{re(r,e),r.dir&&e.setDirection(r.dir);for(let a of r.statements)Me(a,e)},"populate"),Me=l((r,e)=>{let o={Commit:l(t=>e.commit(Pe(t)),"Commit"),Branch:l(t=>e.branch(Re(t)),"Branch"),Merge:l(t=>e.merge(Oe(t)),"Merge"),Checkout:l(t=>e.checkout(Ie(t)),"Checkout"),CherryPicking:l(t=>e.cherryPick(qe(t)),"CherryPicking")}[r.$type];o?o(r):u.error(`Unknown statement type: ${r.$type}`)},"parseStatement"),Pe=l(r=>({id:r.id,msg:r.message??"",type:r.type!==void 0?x[r.type]:x.NORMAL,tags:r.tags??void 0}),"parseCommit"),Re=l(r=>({name:r.name,order:r.order??0}),"parseBranch"),Oe=l(r=>({branch:r.branch,id:r.id??"",type:r.type!==void 0?x[r.type]:void 0,tags:r.tags??void 0}),"parseMerge"),Ie=l(r=>r.branch,"parseCheckout"),qe=l(r=>({id:r.id,targetId:"",tags:r.tags?.length===0?void 0:r.tags,parent:r.parent}),"parseCherryPicking"),Ge={parse:l(r=>N(null,null,function*(){let e=yield se("gitGraph",r);u.debug(e),Le(e,de)}),"parse")},T=10,E=40,B=4,v=2,L=8,b=new Map,w=new Map,q=30,P=new Map,G=[],k=0,$="LR",Ae=l(()=>{b.clear(),w.clear(),P.clear(),k=0,G=[],$="LR"},"clear"),he=l(r=>{let e=document.createElementNS("http://www.w3.org/2000/svg","text");return(typeof r=="string"?r.split(/\\n|\n|/gi):r).forEach(o=>{let t=document.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),t.setAttribute("dy","1em"),t.setAttribute("x","0"),t.setAttribute("class","row"),t.textContent=o.trim(),e.appendChild(t)}),e},"drawText"),le=l(r=>{let e,a,o;return $==="BT"?(a=l((t,s)=>t<=s,"comparisonFunc"),o=1/0):(a=l((t,s)=>t>=s,"comparisonFunc"),o=0),r.forEach(t=>{let s=$==="TB"||$=="BT"?w.get(t)?.y:w.get(t)?.x;s!==void 0&&a(s,o)&&(e=t,o=s)}),e},"findClosestParent"),De=l(r=>{let e="",a=1/0;return r.forEach(o=>{let t=w.get(o).y;t<=a&&(e=o,a=t)}),e||void 0},"findClosestParentBT"),We=l((r,e,a)=>{let o=a,t=a,s=[];r.forEach(h=>{let d=e.get(h);if(!d)throw new Error(`Commit not found for key ${h}`);d.parents.length?(o=_e(d),t=Math.max(o,t)):s.push(d),Ne(d,o)}),o=t,s.forEach(h=>{Se(h,o,a)}),r.forEach(h=>{let d=e.get(h);if(d?.parents.length){let c=De(d.parents);o=w.get(c).y-E,o<=t&&(t=o);let m=b.get(d.branch).pos,p=o-T;w.set(d.id,{x:m,y:p})}})},"setParallelBTPos"),He=l(r=>{let e=le(r.parents.filter(o=>o!==null));if(!e)throw new Error(`Closest parent not found for commit ${r.id}`);let a=w.get(e)?.y;if(a===void 0)throw new Error(`Closest parent position not found for commit ${r.id}`);return a},"findClosestParentPos"),_e=l(r=>He(r)+E,"calculateCommitPosition"),Ne=l((r,e)=>{let a=b.get(r.branch);if(!a)throw new Error(`Branch not found for commit ${r.id}`);let o=a.pos,t=e+T;return w.set(r.id,{x:o,y:t}),{x:o,y:t}},"setCommitPosition"),Se=l((r,e,a)=>{let o=b.get(r.branch);if(!o)throw new Error(`Branch not found for commit ${r.id}`);let t=e+a,s=o.pos;w.set(r.id,{x:s,y:t})},"setRootPosition"),ze=l((r,e,a,o,t,s)=>{if(s===x.HIGHLIGHT)r.append("rect").attr("x",a.x-10).attr("y",a.y-10).attr("width",20).attr("height",20).attr("class",`commit ${e.id} commit-highlight${t%L} ${o}-outer`),r.append("rect").attr("x",a.x-6).attr("y",a.y-6).attr("width",12).attr("height",12).attr("class",`commit ${e.id} commit${t%L} ${o}-inner`);else if(s===x.CHERRY_PICK)r.append("circle").attr("cx",a.x).attr("cy",a.y).attr("r",10).attr("class",`commit ${e.id} ${o}`),r.append("circle").attr("cx",a.x-3).attr("cy",a.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${o}`),r.append("circle").attr("cx",a.x+3).attr("cy",a.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${o}`),r.append("line").attr("x1",a.x+3).attr("y1",a.y+1).attr("x2",a.x).attr("y2",a.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${o}`),r.append("line").attr("x1",a.x-3).attr("y1",a.y+1).attr("x2",a.x).attr("y2",a.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${o}`);else{let h=r.append("circle");if(h.attr("cx",a.x),h.attr("cy",a.y),h.attr("r",e.type===x.MERGE?9:10),h.attr("class",`commit ${e.id} commit${t%L}`),s===x.MERGE){let d=r.append("circle");d.attr("cx",a.x),d.attr("cy",a.y),d.attr("r",6),d.attr("class",`commit ${o} ${e.id} commit${t%L}`)}s===x.REVERSE&&r.append("path").attr("d",`M ${a.x-5},${a.y-5}L${a.x+5},${a.y+5}M${a.x-5},${a.y+5}L${a.x+5},${a.y-5}`).attr("class",`commit ${o} ${e.id} commit${t%L}`)}},"drawCommitBullet"),je=l((r,e,a,o,t)=>{if(e.type!==x.CHERRY_PICK&&(e.customId&&e.type===x.MERGE||e.type!==x.MERGE)&&t.showCommitLabel){let s=r.append("g"),h=s.insert("rect").attr("class","commit-label-bkg"),d=s.append("text").attr("x",o).attr("y",a.y+25).attr("class","commit-label").text(e.id),c=d.node()?.getBBox();if(c&&(h.attr("x",a.posWithOffset-c.width/2-v).attr("y",a.y+13.5).attr("width",c.width+2*v).attr("height",c.height+2*v),$==="TB"||$==="BT"?(h.attr("x",a.x-(c.width+4*B+5)).attr("y",a.y-12),d.attr("x",a.x-(c.width+4*B)).attr("y",a.y+c.height-12)):d.attr("x",a.posWithOffset-c.width/2),t.rotateCommitLabel))if($==="TB"||$==="BT")d.attr("transform","rotate(-45, "+a.x+", "+a.y+")"),h.attr("transform","rotate(-45, "+a.x+", "+a.y+")");else{let m=-7.5-(c.width+10)/25*9.5,p=10+c.width/25*8.5;s.attr("transform","translate("+m+", "+p+") rotate(-45, "+o+", "+a.y+")")}}},"drawCommitLabel"),Fe=l((r,e,a,o)=>{if(e.tags.length>0){let t=0,s=0,h=0,d=[];for(let c of e.tags.reverse()){let m=r.insert("polygon"),p=r.append("circle"),f=r.append("text").attr("y",a.y-16-t).attr("class","tag-label").text(c),i=f.node()?.getBBox();if(!i)throw new Error("Tag bbox not found");s=Math.max(s,i.width),h=Math.max(h,i.height),f.attr("x",a.posWithOffset-i.width/2),d.push({tag:f,hole:p,rect:m,yOffset:t}),t+=20}for(let{tag:c,hole:m,rect:p,yOffset:f}of d){let i=h/2,y=a.y-19.2-f;if(p.attr("class","tag-label-bkg").attr("points",` - ${o-s/2-B/2},${y+v} + ${o-s/2-B/2},${y+v} ${o-s/2-B/2},${y-v} ${a.posWithOffset-s/2-B},${y-i-v} ${a.posWithOffset+s/2+B},${y-i-v} diff --git a/src/google/adk/cli/browser/chunk-NALL4A3P.js b/src/google/adk/cli/browser/chunk-NALL4A3P.js index 54e9eec1d7..8970e67502 100644 --- a/src/google/adk/cli/browser/chunk-NALL4A3P.js +++ b/src/google/adk/cli/browser/chunk-NALL4A3P.js @@ -6,7 +6,7 @@ import{A as q,B as mt,C as Ce,D as Pe,E as hu,G as Z,I as tr,J as $t,M as qh,O a ${JSON.stringify(Object.fromEntries(n))}`));return}let s=parseInt(i);if(isNaN(s)){this.fireError(new Error(`Content-Length value must be a number. Got ${i}`));return}this.nextMessageLength=s}let r=this.buffer.tryReadBody(this.nextMessageLength);if(r===void 0){this.setPartialMessageTimer();return}this.clearPartialMessageTimer(),this.nextMessageLength=-1,this.readSemaphore.lock(()=>P(this,null,function*(){let n=this.options.contentDecoder!==void 0?yield this.options.contentDecoder.decode(r):r,i=yield this.options.contentTypeDecoder.decode(n,this.options);this.callback(i)})).catch(n=>{this.fireError(n)})}}catch(r){this.fireError(r)}}clearPartialMessageTimer(){this.partialMessageTimer&&(this.partialMessageTimer.dispose(),this.partialMessageTimer=void 0)}setPartialMessageTimer(){this.clearPartialMessageTimer(),!(this._partialMessageTimeout<=0)&&(this.partialMessageTimer=(0,Ep.default)().timer.setTimeout((e,r)=>{this.partialMessageTimer=void 0,e===this.messageToken&&(this.firePartialMessage({messageToken:e,waitingTime:r}),this.setPartialMessageTimer())},this._partialMessageTimeout,this.messageToken,this._partialMessageTimeout))}};vn.ReadableStreamMessageReader=$p});var Ry=X(En=>{"use strict";Object.defineProperty(En,"__esModule",{value:!0});En.WriteableStreamMessageWriter=En.AbstractMessageWriter=En.MessageWriter=void 0;var my=Rn(),fo=ls(),r$=xp(),gy=ci(),n$="Content-Length: ",yy=`\r `,Ty;(function(t){function e(r){let n=r;return n&&fo.func(n.dispose)&&fo.func(n.onClose)&&fo.func(n.onError)&&fo.func(n.write)}t.is=e})(Ty||(En.MessageWriter=Ty={}));var Al=class{constructor(){this.errorEmitter=new gy.Emitter,this.closeEmitter=new gy.Emitter}dispose(){this.errorEmitter.dispose(),this.closeEmitter.dispose()}get onError(){return this.errorEmitter.event}fireError(e,r,n){this.errorEmitter.fire([this.asError(e),r,n])}get onClose(){return this.closeEmitter.event}fireClose(){this.closeEmitter.fire(void 0)}asError(e){return e instanceof Error?e:new Error(`Writer received error. Reason: ${fo.string(e.message)?e.message:"unknown"}`)}};En.AbstractMessageWriter=Al;var Sp;(function(t){function e(r){return r===void 0||typeof r=="string"?{charset:r??"utf-8",contentTypeEncoder:(0,my.default)().applicationJson.encoder}:{charset:r.charset??"utf-8",contentEncoder:r.contentEncoder,contentTypeEncoder:r.contentTypeEncoder??(0,my.default)().applicationJson.encoder}}t.fromOptions=e})(Sp||(Sp={}));var kp=class extends Al{constructor(e,r){super(),this.writable=e,this.options=Sp.fromOptions(r),this.errorCount=0,this.writeSemaphore=new r$.Semaphore(1),this.writable.onError(n=>this.fireError(n)),this.writable.onClose(()=>this.fireClose())}write(e){return P(this,null,function*(){return this.writeSemaphore.lock(()=>P(this,null,function*(){return this.options.contentTypeEncoder.encode(e,this.options).then(n=>this.options.contentEncoder!==void 0?this.options.contentEncoder.encode(n):n).then(n=>{let i=[];return i.push(n$,n.byteLength.toString(),yy),i.push(yy),this.doWrite(e,i,n)},n=>{throw this.fireError(n),n})}))})}doWrite(e,r,n){return P(this,null,function*(){try{return yield this.writable.write(r.join(""),"ascii"),this.writable.write(n)}catch(i){return this.handleError(i,e),Promise.reject(i)}})}handleError(e,r){this.errorCount++,this.fireError(e,r,this.errorCount)}end(){this.writable.end()}};En.WriteableStreamMessageWriter=kp});var xy=X($l=>{"use strict";Object.defineProperty($l,"__esModule",{value:!0});$l.AbstractMessageBuffer=void 0;var i$=13,s$=10,a$=`\r `,Np=class{constructor(e="utf-8"){this._encoding=e,this._chunks=[],this._totalLength=0}get encoding(){return this._encoding}append(e){let r=typeof e=="string"?this.fromString(e,this._encoding):e;this._chunks.push(r),this._totalLength+=r.byteLength}tryReadHeaders(e=!1){if(this._chunks.length===0)return;let r=0,n=0,i=0,s=0;e:for(;nthis._totalLength)throw new Error("Cannot read so many bytes!");if(this._chunks[0].byteLength===e){let s=this._chunks[0];return this._chunks.shift(),this._totalLength-=e,this.asNative(s)}if(this._chunks[0].byteLength>e){let s=this._chunks[0],a=this.asNative(s,e);return this._chunks[0]=s.slice(e),this._totalLength-=e,a}let r=this.allocNative(e),n=0,i=0;for(;e>0;){let s=this._chunks[i];if(s.byteLength>e){let a=s.slice(0,e);r.set(a,n),n+=e,this._chunks[i]=s.slice(e),this._totalLength-=e,e-=e}else r.set(s,n),n+=s.byteLength,this._chunks.shift(),this._totalLength-=s.byteLength,e-=s.byteLength}return r}};$l.AbstractMessageBuffer=Np});var Sy=X(J=>{"use strict";Object.defineProperty(J,"__esModule",{value:!0});J.createMessageConnection=J.ConnectionOptions=J.MessageStrategy=J.CancellationStrategy=J.CancellationSenderStrategy=J.CancellationReceiverStrategy=J.RequestCancellationReceiverStrategy=J.IdCancellationReceiverStrategy=J.ConnectionStrategy=J.ConnectionError=J.ConnectionErrors=J.LogTraceNotification=J.SetTraceNotification=J.TraceFormat=J.TraceValues=J.Trace=J.NullLogger=J.ProgressType=J.ProgressToken=void 0;var vy=Rn(),Fe=ls(),K=dp(),Ey=hp(),po=ci(),Cp=Ka(),go;(function(t){t.type=new K.NotificationType("$/cancelRequest")})(go||(go={}));var wp;(function(t){function e(r){return typeof r=="string"||typeof r=="number"}t.is=e})(wp||(J.ProgressToken=wp={}));var ho;(function(t){t.type=new K.NotificationType("$/progress")})(ho||(ho={}));var Ip=class{constructor(){}};J.ProgressType=Ip;var _p;(function(t){function e(r){return Fe.func(r)}t.is=e})(_p||(_p={}));J.NullLogger=Object.freeze({error:()=>{},warn:()=>{},info:()=>{},log:()=>{}});var fe=(function(t){return t[t.Off=0]="Off",t[t.Messages=1]="Messages",t[t.Compact=2]="Compact",t[t.Verbose=3]="Verbose",t})(fe||(J.Trace=fe={})),Ay=(function(t){return t.Off="off",t.Messages="messages",t.Compact="compact",t.Verbose="verbose",t})(Ay||(J.TraceValues=Ay={}));(function(t){function e(n){if(!Fe.string(n))return t.Off;switch(n=n.toLowerCase(),n){case"off":return t.Off;case"messages":return t.Messages;case"compact":return t.Compact;case"verbose":return t.Verbose;default:return t.Off}}t.fromString=e;function r(n){switch(n){case t.Off:return"off";case t.Messages:return"messages";case t.Compact:return"compact";case t.Verbose:return"verbose";default:return"off"}}t.toString=r})(fe||(J.Trace=fe={}));var Wt=(function(t){return t.Text="text",t.JSON="json",t})(Wt||(J.TraceFormat=Wt={}));(function(t){function e(r){return Fe.string(r)?(r=r.toLowerCase(),r==="json"?t.JSON:t.Text):t.Text}t.fromString=e})(Wt||(J.TraceFormat=Wt={}));var bp;(function(t){t.type=new K.NotificationType("$/setTrace")})(bp||(J.SetTraceNotification=bp={}));var Sl;(function(t){t.type=new K.NotificationType("$/logTrace")})(Sl||(J.LogTraceNotification=Sl={}));var mo=(function(t){return t[t.Closed=1]="Closed",t[t.Disposed=2]="Disposed",t[t.AlreadyListening=3]="AlreadyListening",t})(mo||(J.ConnectionErrors=mo={})),xs=class t extends Error{constructor(e,r){super(r),this.code=e,Object.setPrototypeOf(this,t.prototype)}};J.ConnectionError=xs;var Pp;(function(t){function e(r){let n=r;return n&&Fe.func(n.cancelUndispatched)}t.is=e})(Pp||(J.ConnectionStrategy=Pp={}));var kl;(function(t){function e(r){let n=r;return n&&(n.kind===void 0||n.kind==="id")&&Fe.func(n.createCancellationTokenSource)&&(n.dispose===void 0||Fe.func(n.dispose))}t.is=e})(kl||(J.IdCancellationReceiverStrategy=kl={}));var Op;(function(t){function e(r){let n=r;return n&&n.kind==="request"&&Fe.func(n.createCancellationTokenSource)&&(n.dispose===void 0||Fe.func(n.dispose))}t.is=e})(Op||(J.RequestCancellationReceiverStrategy=Op={}));var Nl;(function(t){t.Message=Object.freeze({createCancellationTokenSource(r){return new Cp.CancellationTokenSource}});function e(r){return kl.is(r)||Op.is(r)}t.is=e})(Nl||(J.CancellationReceiverStrategy=Nl={}));var Cl;(function(t){t.Message=Object.freeze({sendCancellation(r,n){return r.sendNotification(go.type,{id:n})},cleanup(r){}});function e(r){let n=r;return n&&Fe.func(n.sendCancellation)&&Fe.func(n.cleanup)}t.is=e})(Cl||(J.CancellationSenderStrategy=Cl={}));var wl;(function(t){t.Message=Object.freeze({receiver:Nl.Message,sender:Cl.Message});function e(r){let n=r;return n&&Nl.is(n.receiver)&&Cl.is(n.sender)}t.is=e})(wl||(J.CancellationStrategy=wl={}));var Il;(function(t){function e(r){let n=r;return n&&Fe.func(n.handleMessage)}t.is=e})(Il||(J.MessageStrategy=Il={}));var $y;(function(t){function e(r){let n=r;return n&&(wl.is(n.cancellationStrategy)||Pp.is(n.connectionStrategy)||Il.is(n.messageStrategy))}t.is=e})($y||(J.ConnectionOptions=$y={}));var kr=(function(t){return t[t.New=1]="New",t[t.Listening=2]="Listening",t[t.Closed=3]="Closed",t[t.Disposed=4]="Disposed",t})(kr||{});function o$(t,e,r,n){let i=r!==void 0?r:J.NullLogger,s=0,a=0,o=0,c="2.0",l,u=new Map,p,h=new Map,g=new Map,C,k=new Ey.LinkedMap,G=new Map,M=new Set,b=new Map,E=fe.Off,H=Wt.Text,F,ye=kr.New,dr=new po.Emitter,Je=new po.Emitter,Qt=new po.Emitter,Kt=new po.Emitter,$=new po.Emitter,y=n&&n.cancellationStrategy?n.cancellationStrategy:wl.Message;function L(d){if(d===null)throw new Error("Can't send requests with id null since the response can't be correlated.");return"req-"+d.toString()}function O(d){return d===null?"res-unknown-"+(++o).toString():"res-"+d.toString()}function T(){return"not-"+(++a).toString()}function x(d,v){K.Message.isRequest(v)?d.set(L(v.id),v):K.Message.isResponse(v)?d.set(O(v.id),v):d.set(T(),v)}function A(d){}function _(){return ye===kr.Listening}function U(){return ye===kr.Closed}function N(){return ye===kr.Disposed}function Y(){(ye===kr.New||ye===kr.Listening)&&(ye=kr.Closed,Je.fire(void 0))}function Q(d){dr.fire([d,void 0,void 0])}function de(d){dr.fire(d)}t.onClose(Y),t.onError(Q),e.onClose(Y),e.onError(de);function ue(){C||k.size===0||(C=(0,vy.default)().timer.setImmediate(()=>{C=void 0,We()}))}function ve(d){K.Message.isRequest(d)?ot(d):K.Message.isNotification(d)?pr(d):K.Message.isResponse(d)?_t(d):Zt(d)}function We(){if(k.size===0)return;let d=k.shift();try{let v=n?.messageStrategy;Il.is(v)?v.handleMessage(d,ve):ve(d)}finally{ue()}}let js=d=>{try{if(K.Message.isNotification(d)&&d.method===go.type.method){let v=d.params.id,w=L(v),z=k.get(w);if(K.Message.isRequest(z)){let Te=n?.connectionStrategy,Ge=Te&&Te.cancelUndispatched?Te.cancelUndispatched(z,A):void 0;if(Ge&&(Ge.error!==void 0||Ge.result!==void 0)){k.delete(w),b.delete(v),Ge.id=z.id,Do(Ge,d.method,Date.now()),e.write(Ge).catch(()=>i.error("Sending response for canceled message failed."));return}}let ke=b.get(v);if(ke!==void 0){ke.cancel(),uu(d);return}else M.add(v)}x(k,d)}finally{ue()}};function ot(d){if(N())return;function v(oe,be,me){let Qe={jsonrpc:c,id:d.id};oe instanceof K.ResponseError?Qe.error=oe.toJson():Qe.result=oe===void 0?null:oe,Do(Qe,be,me),e.write(Qe).catch(()=>i.error("Sending response failed."))}function w(oe,be,me){let Qe={jsonrpc:c,id:d.id,error:oe.toJson()};Do(Qe,be,me),e.write(Qe).catch(()=>i.error("Sending response failed."))}function z(oe,be,me){oe===void 0&&(oe=null);let Qe={jsonrpc:c,id:d.id,result:oe};Do(Qe,be,me),e.write(Qe).catch(()=>i.error("Sending response failed."))}Qx(d);let ke=u.get(d.method),Te,Ge;ke&&(Te=ke.type,Ge=ke.handler);let je=Date.now();if(Ge||l){let oe=d.id??String(Date.now()),be=kl.is(y.receiver)?y.receiver.createCancellationTokenSource(oe):y.receiver.createCancellationTokenSource(d);d.id!==null&&M.has(d.id)&&be.cancel(),d.id!==null&&b.set(oe,be);try{let me;if(Ge)if(d.params===void 0){if(Te!==void 0&&Te.numberOfParams!==0){w(new K.ResponseError(K.ErrorCodes.InvalidParams,`Request ${d.method} defines ${Te.numberOfParams} params but received none.`),d.method,je);return}me=Ge(be.token)}else if(Array.isArray(d.params)){if(Te!==void 0&&Te.parameterStructures===K.ParameterStructures.byName){w(new K.ResponseError(K.ErrorCodes.InvalidParams,`Request ${d.method} defines parameters by name but received parameters by position`),d.method,je);return}me=Ge(...d.params,be.token)}else{if(Te!==void 0&&Te.parameterStructures===K.ParameterStructures.byPosition){w(new K.ResponseError(K.ErrorCodes.InvalidParams,`Request ${d.method} defines parameters by position but received parameters by name`),d.method,je);return}me=Ge(d.params,be.token)}else l&&(me=l(d.method,d.params,be.token));let Qe=me;me?Qe.then?Qe.then(Et=>{b.delete(oe),v(Et,d.method,je)},Et=>{b.delete(oe),Et instanceof K.ResponseError?w(Et,d.method,je):Et&&Fe.string(Et.message)?w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed with message: ${Et.message}`),d.method,je):w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed unexpectedly without providing any details.`),d.method,je)}):(b.delete(oe),v(me,d.method,je)):(b.delete(oe),z(me,d.method,je))}catch(me){b.delete(oe),me instanceof K.ResponseError?v(me,d.method,je):me&&Fe.string(me.message)?w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed with message: ${me.message}`),d.method,je):w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed unexpectedly without providing any details.`),d.method,je)}}else w(new K.ResponseError(K.ErrorCodes.MethodNotFound,`Unhandled method ${d.method}`),d.method,je)}function _t(d){if(!N())if(d.id===null)d.error?i.error(`Received response message without id: Error is: +${u}`);let h=u.substr(0,p),g=u.substr(p+1).trim();o.set(e?h.toLowerCase():h,g)}return o}tryReadBody(e){if(!(this._totalLengththis._totalLength)throw new Error("Cannot read so many bytes!");if(this._chunks[0].byteLength===e){let s=this._chunks[0];return this._chunks.shift(),this._totalLength-=e,this.asNative(s)}if(this._chunks[0].byteLength>e){let s=this._chunks[0],a=this.asNative(s,e);return this._chunks[0]=s.slice(e),this._totalLength-=e,a}let r=this.allocNative(e),n=0,i=0;for(;e>0;){let s=this._chunks[i];if(s.byteLength>e){let a=s.slice(0,e);r.set(a,n),n+=e,this._chunks[i]=s.slice(e),this._totalLength-=e,e-=e}else r.set(s,n),n+=s.byteLength,this._chunks.shift(),this._totalLength-=s.byteLength,e-=s.byteLength}return r}};$l.AbstractMessageBuffer=Np});var Sy=X(J=>{"use strict";Object.defineProperty(J,"__esModule",{value:!0});J.createMessageConnection=J.ConnectionOptions=J.MessageStrategy=J.CancellationStrategy=J.CancellationSenderStrategy=J.CancellationReceiverStrategy=J.RequestCancellationReceiverStrategy=J.IdCancellationReceiverStrategy=J.ConnectionStrategy=J.ConnectionError=J.ConnectionErrors=J.LogTraceNotification=J.SetTraceNotification=J.TraceFormat=J.TraceValues=J.Trace=J.NullLogger=J.ProgressType=J.ProgressToken=void 0;var vy=Rn(),Fe=ls(),K=dp(),Ey=hp(),po=ci(),Cp=Ka(),go;(function(t){t.type=new K.NotificationType("$/cancelRequest")})(go||(go={}));var wp;(function(t){function e(r){return typeof r=="string"||typeof r=="number"}t.is=e})(wp||(J.ProgressToken=wp={}));var ho;(function(t){t.type=new K.NotificationType("$/progress")})(ho||(ho={}));var Ip=class{constructor(){}};J.ProgressType=Ip;var _p;(function(t){function e(r){return Fe.func(r)}t.is=e})(_p||(_p={}));J.NullLogger=Object.freeze({error:()=>{},warn:()=>{},info:()=>{},log:()=>{}});var fe=(function(t){return t[t.Off=0]="Off",t[t.Messages=1]="Messages",t[t.Compact=2]="Compact",t[t.Verbose=3]="Verbose",t})(fe||(J.Trace=fe={})),Ay=(function(t){return t.Off="off",t.Messages="messages",t.Compact="compact",t.Verbose="verbose",t})(Ay||(J.TraceValues=Ay={}));(function(t){function e(n){if(!Fe.string(n))return t.Off;switch(n=n.toLowerCase(),n){case"off":return t.Off;case"messages":return t.Messages;case"compact":return t.Compact;case"verbose":return t.Verbose;default:return t.Off}}t.fromString=e;function r(n){switch(n){case t.Off:return"off";case t.Messages:return"messages";case t.Compact:return"compact";case t.Verbose:return"verbose";default:return"off"}}t.toString=r})(fe||(J.Trace=fe={}));var Wt=(function(t){return t.Text="text",t.JSON="json",t})(Wt||(J.TraceFormat=Wt={}));(function(t){function e(r){return Fe.string(r)?(r=r.toLowerCase(),r==="json"?t.JSON:t.Text):t.Text}t.fromString=e})(Wt||(J.TraceFormat=Wt={}));var bp;(function(t){t.type=new K.NotificationType("$/setTrace")})(bp||(J.SetTraceNotification=bp={}));var Sl;(function(t){t.type=new K.NotificationType("$/logTrace")})(Sl||(J.LogTraceNotification=Sl={}));var mo=(function(t){return t[t.Closed=1]="Closed",t[t.Disposed=2]="Disposed",t[t.AlreadyListening=3]="AlreadyListening",t})(mo||(J.ConnectionErrors=mo={})),xs=class t extends Error{constructor(e,r){super(r),this.code=e,Object.setPrototypeOf(this,t.prototype)}};J.ConnectionError=xs;var Pp;(function(t){function e(r){let n=r;return n&&Fe.func(n.cancelUndispatched)}t.is=e})(Pp||(J.ConnectionStrategy=Pp={}));var kl;(function(t){function e(r){let n=r;return n&&(n.kind===void 0||n.kind==="id")&&Fe.func(n.createCancellationTokenSource)&&(n.dispose===void 0||Fe.func(n.dispose))}t.is=e})(kl||(J.IdCancellationReceiverStrategy=kl={}));var Op;(function(t){function e(r){let n=r;return n&&n.kind==="request"&&Fe.func(n.createCancellationTokenSource)&&(n.dispose===void 0||Fe.func(n.dispose))}t.is=e})(Op||(J.RequestCancellationReceiverStrategy=Op={}));var Nl;(function(t){t.Message=Object.freeze({createCancellationTokenSource(r){return new Cp.CancellationTokenSource}});function e(r){return kl.is(r)||Op.is(r)}t.is=e})(Nl||(J.CancellationReceiverStrategy=Nl={}));var Cl;(function(t){t.Message=Object.freeze({sendCancellation(r,n){return r.sendNotification(go.type,{id:n})},cleanup(r){}});function e(r){let n=r;return n&&Fe.func(n.sendCancellation)&&Fe.func(n.cleanup)}t.is=e})(Cl||(J.CancellationSenderStrategy=Cl={}));var wl;(function(t){t.Message=Object.freeze({receiver:Nl.Message,sender:Cl.Message});function e(r){let n=r;return n&&Nl.is(n.receiver)&&Cl.is(n.sender)}t.is=e})(wl||(J.CancellationStrategy=wl={}));var Il;(function(t){function e(r){let n=r;return n&&Fe.func(n.handleMessage)}t.is=e})(Il||(J.MessageStrategy=Il={}));var $y;(function(t){function e(r){let n=r;return n&&(wl.is(n.cancellationStrategy)||Pp.is(n.connectionStrategy)||Il.is(n.messageStrategy))}t.is=e})($y||(J.ConnectionOptions=$y={}));var kr=(function(t){return t[t.New=1]="New",t[t.Listening=2]="Listening",t[t.Closed=3]="Closed",t[t.Disposed=4]="Disposed",t})(kr||{});function o$(t,e,r,n){let i=r!==void 0?r:J.NullLogger,s=0,a=0,o=0,c="2.0",l,u=new Map,p,h=new Map,g=new Map,C,k=new Ey.LinkedMap,G=new Map,M=new Set,b=new Map,E=fe.Off,H=Wt.Text,F,ye=kr.New,dr=new po.Emitter,Je=new po.Emitter,Qt=new po.Emitter,Kt=new po.Emitter,$=new po.Emitter,y=n&&n.cancellationStrategy?n.cancellationStrategy:wl.Message;function L(d){if(d===null)throw new Error("Can't send requests with id null since the response can't be correlated.");return"req-"+d.toString()}function O(d){return d===null?"res-unknown-"+(++o).toString():"res-"+d.toString()}function T(){return"not-"+(++a).toString()}function x(d,v){K.Message.isRequest(v)?d.set(L(v.id),v):K.Message.isResponse(v)?d.set(O(v.id),v):d.set(T(),v)}function A(d){}function _(){return ye===kr.Listening}function U(){return ye===kr.Closed}function N(){return ye===kr.Disposed}function Y(){(ye===kr.New||ye===kr.Listening)&&(ye=kr.Closed,Je.fire(void 0))}function Q(d){dr.fire([d,void 0,void 0])}function de(d){dr.fire(d)}t.onClose(Y),t.onError(Q),e.onClose(Y),e.onError(de);function ue(){C||k.size===0||(C=(0,vy.default)().timer.setImmediate(()=>{C=void 0,We()}))}function ve(d){K.Message.isRequest(d)?ot(d):K.Message.isNotification(d)?pr(d):K.Message.isResponse(d)?_t(d):Zt(d)}function We(){if(k.size===0)return;let d=k.shift();try{let v=n?.messageStrategy;Il.is(v)?v.handleMessage(d,ve):ve(d)}finally{ue()}}let js=d=>{try{if(K.Message.isNotification(d)&&d.method===go.type.method){let v=d.params.id,w=L(v),z=k.get(w);if(K.Message.isRequest(z)){let Te=n?.connectionStrategy,Ge=Te&&Te.cancelUndispatched?Te.cancelUndispatched(z,A):void 0;if(Ge&&(Ge.error!==void 0||Ge.result!==void 0)){k.delete(w),b.delete(v),Ge.id=z.id,Do(Ge,d.method,Date.now()),e.write(Ge).catch(()=>i.error("Sending response for canceled message failed."));return}}let ke=b.get(v);if(ke!==void 0){ke.cancel(),uu(d);return}else M.add(v)}x(k,d)}finally{ue()}};function ot(d){if(N())return;function v(oe,be,me){let Qe={jsonrpc:c,id:d.id};oe instanceof K.ResponseError?Qe.error=oe.toJson():Qe.result=oe===void 0?null:oe,Do(Qe,be,me),e.write(Qe).catch(()=>i.error("Sending response failed."))}function w(oe,be,me){let Qe={jsonrpc:c,id:d.id,error:oe.toJson()};Do(Qe,be,me),e.write(Qe).catch(()=>i.error("Sending response failed."))}function z(oe,be,me){oe===void 0&&(oe=null);let Qe={jsonrpc:c,id:d.id,result:oe};Do(Qe,be,me),e.write(Qe).catch(()=>i.error("Sending response failed."))}Qx(d);let ke=u.get(d.method),Te,Ge;ke&&(Te=ke.type,Ge=ke.handler);let je=Date.now();if(Ge||l){let oe=d.id??String(Date.now()),be=kl.is(y.receiver)?y.receiver.createCancellationTokenSource(oe):y.receiver.createCancellationTokenSource(d);d.id!==null&&M.has(d.id)&&be.cancel(),d.id!==null&&b.set(oe,be);try{let me;if(Ge)if(d.params===void 0){if(Te!==void 0&&Te.numberOfParams!==0){w(new K.ResponseError(K.ErrorCodes.InvalidParams,`Request ${d.method} defines ${Te.numberOfParams} params but received none.`),d.method,je);return}me=Ge(be.token)}else if(Array.isArray(d.params)){if(Te!==void 0&&Te.parameterStructures===K.ParameterStructures.byName){w(new K.ResponseError(K.ErrorCodes.InvalidParams,`Request ${d.method} defines parameters by name but received parameters by position`),d.method,je);return}me=Ge(...d.params,be.token)}else{if(Te!==void 0&&Te.parameterStructures===K.ParameterStructures.byPosition){w(new K.ResponseError(K.ErrorCodes.InvalidParams,`Request ${d.method} defines parameters by position but received parameters by name`),d.method,je);return}me=Ge(d.params,be.token)}else l&&(me=l(d.method,d.params,be.token));let Qe=me;me?Qe.then?Qe.then(Et=>{b.delete(oe),v(Et,d.method,je)},Et=>{b.delete(oe),Et instanceof K.ResponseError?w(Et,d.method,je):Et&&Fe.string(Et.message)?w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed with message: ${Et.message}`),d.method,je):w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed unexpectedly without providing any details.`),d.method,je)}):(b.delete(oe),v(me,d.method,je)):(b.delete(oe),z(me,d.method,je))}catch(me){b.delete(oe),me instanceof K.ResponseError?v(me,d.method,je):me&&Fe.string(me.message)?w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed with message: ${me.message}`),d.method,je):w(new K.ResponseError(K.ErrorCodes.InternalError,`Request ${d.method} failed unexpectedly without providing any details.`),d.method,je)}}else w(new K.ResponseError(K.ErrorCodes.MethodNotFound,`Unhandled method ${d.method}`),d.method,je)}function _t(d){if(!N())if(d.id===null)d.error?i.error(`Received response message without id: Error is: ${JSON.stringify(d.error,void 0,4)}`):i.error("Received response message without id. No further error information provided.");else{let v=d.id,w=G.get(v);if(Zx(d,w),w!==void 0){G.delete(v);try{if(d.error){let z=d.error;w.reject(new K.ResponseError(z.code,z.message,z.data))}else if(d.result!==void 0)w.resolve(d.result);else throw new Error("Should never happen.")}catch(z){z.message?i.error(`Response handler '${w.method}' failed with message: ${z.message}`):i.error(`Response handler '${w.method}' failed unexpectedly.`)}}}}function pr(d){if(N())return;let v,w;if(d.method===go.type.method){let z=d.params.id;M.delete(z),uu(d);return}else{let z=h.get(d.method);z&&(w=z.handler,v=z.type)}if(w||p)try{if(uu(d),w)if(d.params===void 0)v!==void 0&&v.numberOfParams!==0&&v.parameterStructures!==K.ParameterStructures.byName&&i.error(`Notification ${d.method} defines ${v.numberOfParams} params but received none.`),w();else if(Array.isArray(d.params)){let z=d.params;d.method===ho.type.method&&z.length===2&&wp.is(z[0])?w({token:z[0],value:z[1]}):(v!==void 0&&(v.parameterStructures===K.ParameterStructures.byName&&i.error(`Notification ${d.method} defines parameters by name but received parameters by position`),v.numberOfParams!==d.params.length&&i.error(`Notification ${d.method} defines ${v.numberOfParams} params but received ${z.length} arguments`)),w(...z))}else v!==void 0&&v.parameterStructures===K.ParameterStructures.byPosition&&i.error(`Notification ${d.method} defines parameters by position but received parameters by name`),w(d.params);else p&&p(d.method,d.params)}catch(z){z.message?i.error(`Notification handler '${d.method}' failed with message: ${z.message}`):i.error(`Notification handler '${d.method}' failed unexpectedly.`)}else Qt.fire(d)}function Zt(d){if(!d){i.error("Received empty message.");return}i.error(`Received message which is neither a response nor a notification message: ${JSON.stringify(d,null,4)}`);let v=d;if(Fe.string(v.id)||Fe.number(v.id)){let w=v.id,z=G.get(w);z&&z.reject(new Error("The received response has neither a result nor an error property."))}}function ft(d){if(d!=null)switch(E){case fe.Verbose:return JSON.stringify(d,null,4);case fe.Compact:return JSON.stringify(d);default:return}}function Bs(d){if(!(E===fe.Off||!F))if(H===Wt.Text){let v;(E===fe.Verbose||E===fe.Compact)&&d.params&&(v=`Params: ${ft(d.params)} @@ -72,7 +72,7 @@ See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e. `,type:Le.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),n}function gm(t,e,r){let n=[],i=!1,s=Or(Ve(Ce(t.modes))),a=In(s,c=>c[Qn]===He.NA),o=vm(r);return e&&D(a,c=>{let l=xm(c,o);if(l!==!1){let p={message:yE(c,l),type:l.issue,tokenType:c};n.push(p)}else q(c,"LINE_BREAKS")?c.LINE_BREAKS===!0&&(i=!0):yc(o,c.PATTERN)&&(i=!0)}),e&&!i&&n.push({message:`Warning: No LINE_BREAKS Found. This Lexer has been defined to track line and column information, But none of the Token Types can be identified as matching a line terminator. - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS for details.`,type:Le.NO_LINE_BREAKS_FLAGS}),n}function ym(t){let e={},r=Pr(t);return D(r,n=>{let i=t[n];if(Ze(i))e[n]=[];else throw Error("non exhaustive match")}),e}function Tm(t){let e=t.PATTERN;if(tr(e))return!1;if(mr(e))return!0;if(q(e,"exec"))return!0;if(mt(e))return!1;throw Error("non exhaustive match")}function gE(t){return mt(t)&&t.length===1?t.charCodeAt(0):!1}var Rm={test:function(t){let e=t.length;for(let r=this.lastIndex;r Token Type Root cause: ${e.errMsg}. @@ -95,8 +95,8 @@ ${I(l,(h,g)=>` ${g+1}. ${h}`).join(` but found: '`+pt(e).image+"'";if(r)return i+r+a;{let c=`expecting at least one iteration which starts with one of these possible Token sequences:: <${I(t,l=>`[${I(l,u=>Vr(u)).join(",")}]`).join(" ,")}>`;return i+c+a}}};Object.freeze(Hr);var Lm={buildRuleNotFoundError(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- inside top level rule: ->`+t.name+"<-"}},cr={buildDuplicateFoundError(t,e){function r(u){return u instanceof te?u.terminalType.name:u instanceof pe?u.nonTerminalName:""}let n=t.name,i=pt(e),s=i.idx,a=Ot(i),o=r(i),c=s>0,l=`->${a}${c?s:""}<- ${o?`with argument: ->${o}<-`:""} - appears more than once (${e.length} times) in the top level rule: ->${n}<-. - For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + appears more than once (${e.length} times) in the top level rule: ->${n}<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES `;return l=l.replace(/[ \t]+/g," "),l=l.replace(/\s\s+/g,` `),l},buildNamespaceConflictError(t){return`Namespace conflict found in grammar. The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${t.name}>. @@ -117,7 +117,7 @@ Only the last alternative may be an empty alternative.`},buildTooManyAlternative inside <${t.topLevelRule.name}> Rule. has ${t.alternation.definition.length+1} alternatives.`},buildLeftRecursionError(t){let e=t.topLevelRule.name,r=I(t.leftRecursionPath,s=>s.name),n=`${e} --> ${r.concat([e]).join(" --> ")}`;return`Left Recursion found in grammar. rule: <${e}> can be invoked from itself (directly or indirectly) -without consuming any Tokens. The grammar path that causes this is: +without consuming any Tokens. The grammar path that causes this is: ${n} To fix this refactor your grammar to remove the left recursion. see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError(t){return"deprecated"},buildDuplicateRuleNameError(t){let e;return t.topLevelRule instanceof Nt?e=t.topLevelRule.name:e=t.topLevelRule,`Duplicate definition, rule: ->${e}<- is already defined in the grammar: ->${t.grammarName}<-`}};function Dm(t,e){let r=new gf(t,e);return r.resolveRefs(),r.errors}var gf=class extends Ct{constructor(e,r){super(),this.nameToTopRule=e,this.errMsgProvider=r,this.errors=[]}resolveRefs(){D(Ce(this.nameToTopRule),e=>{this.currTopLevel=e,e.accept(this)})}visitNonTerminal(e){let r=this.nameToTopRule[e.nonTerminalName];if(r)e.referencedRule=r;else{let n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:n,type:it.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}};var yf=class extends jr{constructor(e,r){super(),this.topProd=e,this.path=r,this.possibleTokTypes=[],this.nextProductionName="",this.nextProductionOccurrence=0,this.found=!1,this.isAtEndOfPath=!1}startWalking(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=Ne(this.path.ruleStack).reverse(),this.occurrenceStack=Ne(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes}walk(e,r=[]){this.found||super.walk(e,r)}walkProdRef(e,r,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){let i=r.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,i)}}updateExpectedNext(){Z(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}},xc=class extends yf{constructor(e,r){super(e,r),this.path=r,this.nextTerminalName="",this.nextTerminalOccurrence=0,this.nextTerminalName=this.path.lastTok.name,this.nextTerminalOccurrence=this.path.lastTokOccurrence}walkTerminal(e,r,n){if(this.isAtEndOfPath&&e.terminalType.name===this.nextTerminalName&&e.idx===this.nextTerminalOccurrence&&!this.found){let i=r.concat(n),s=new Ee({definition:i});this.possibleTokTypes=Jn(s),this.found=!0}}},Bi=class extends jr{constructor(e,r){super(),this.topRule=e,this.occurrence=r,this.result={token:void 0,occurrence:void 0,isEndOfRule:void 0}}startWalking(){return this.walk(this.topRule),this.result}},vc=class extends Bi{walkMany(e,r,n){if(e.idx===this.occurrence){let i=pt(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof te&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkMany(e,r,n)}},va=class extends Bi{walkManySep(e,r,n){if(e.idx===this.occurrence){let i=pt(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof te&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkManySep(e,r,n)}},Ec=class extends Bi{walkAtLeastOne(e,r,n){if(e.idx===this.occurrence){let i=pt(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof te&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOne(e,r,n)}},Ea=class extends Bi{walkAtLeastOneSep(e,r,n){if(e.idx===this.occurrence){let i=pt(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof te&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOneSep(e,r,n)}};function Ac(t,e,r=[]){r=Ne(r);let n=[],i=0;function s(o){return o.concat(Ke(t,i+1))}function a(o){let c=Ac(s(o),e,r);return n.concat(c)}for(;r.length{Z(c.definition)===!1&&(n=a(c.definition))}),n;if(o instanceof te)r.push(o.terminalType);else throw Error("non exhaustive match")}i++}return n.push({partialPath:r,suffixDef:Ke(t,i)}),n}function $c(t,e,r,n){let i="EXIT_NONE_TERMINAL",s=[i],a="EXIT_ALTERNATIVE",o=!1,c=e.length,l=c-n-1,u=[],p=[];for(p.push({idx:-1,def:t,ruleStack:[],occurrenceStack:[]});!Z(p);){let h=p.pop();if(h===a){o&&gr(p).idx<=l&&p.pop();continue}let g=h.def,C=h.idx,k=h.ruleStack,G=h.occurrenceStack;if(Z(g))continue;let M=g[0];if(M===i){let b={idx:C,def:Ke(g),ruleStack:tn(k),occurrenceStack:tn(G)};p.push(b)}else if(M instanceof te)if(C=0;b--){let E=M.definition[b],H={idx:C,def:E.definition.concat(Ke(g)),ruleStack:k,occurrenceStack:G};p.push(H),p.push(a)}else if(M instanceof Ee)p.push({idx:C,def:M.definition.concat(Ke(g)),ruleStack:k,occurrenceStack:G});else if(M instanceof Nt)p.push(NE(M,C,k,G));else throw Error("non exhaustive match")}return u}function NE(t,e,r,n){let i=Ne(r);i.push(t.name);let s=Ne(n);return s.push(1),{idx:e,def:t.definition,ruleStack:i,occurrenceStack:s}}var De=(function(t){return t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION",t})(De||{});function Aa(t){if(t instanceof he||t==="Option")return De.OPTION;if(t instanceof se||t==="Repetition")return De.REPETITION;if(t instanceof Ae||t==="RepetitionMandatory")return De.REPETITION_MANDATORY;if(t instanceof $e||t==="RepetitionMandatoryWithSeparator")return De.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof Re||t==="RepetitionWithSeparator")return De.REPETITION_WITH_SEPARATOR;if(t instanceof xe||t==="Alternation")return De.ALTERNATION;throw Error("non exhaustive match")}function kc(t){let{occurrence:e,rule:r,prodType:n,maxLookahead:i}=t,s=Aa(n);return s===De.ALTERNATION?Wi(e,r,i):Vi(e,r,s,i)}function Fm(t,e,r,n,i,s){let a=Wi(t,e,r),o=Bm(a)?zi:Br;return s(a,n,o,i)}function Gm(t,e,r,n,i,s){let a=Vi(t,e,i,r),o=Bm(a)?zi:Br;return s(a[0],o,n)}function Um(t,e,r,n){let i=t.length,s=At(t,a=>At(a,o=>o.length===1));if(e)return function(a){let o=I(a,c=>c.GATE);for(let c=0;cVe(c)),o=Ue(a,(c,l,u)=>(D(l,p=>{q(c,p.tokenTypeIdx)||(c[p.tokenTypeIdx]=u),D(p.categoryMatches,h=>{q(c,h)||(c[h]=u)})}),c),{});return function(){let c=this.LA(1);return o[c.tokenTypeIdx]}}else return function(){for(let a=0;as.length===1),i=t.length;if(n&&!r){let s=Ve(t);if(s.length===1&&Z(s[0].categoryMatches)){let o=s[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===o}}else{let a=Ue(s,(o,c,l)=>(o[c.tokenTypeIdx]=!0,D(c.categoryMatches,u=>{o[u]=!0}),o),[]);return function(){let o=this.LA(1);return a[o.tokenTypeIdx]===!0}}}else return function(){e:for(let s=0;sAc([a],1)),n=Mm(r.length),i=I(r,a=>{let o={};return D(a,c=>{let l=Tf(c.partialPath);D(l,u=>{o[u]=!0})}),o}),s=r;for(let a=1;a<=e;a++){let o=s;s=Mm(o.length);for(let c=0;c{let M=Tf(G.partialPath);D(M,b=>{i[c][b]=!0})})}}}}return n}function Wi(t,e,r,n){let i=new Sc(t,De.ALTERNATION,n);return e.accept(i),zm(i.result,r)}function Vi(t,e,r,n){let i=new Sc(t,r);e.accept(i);let s=i.result,o=new Rf(e,t,r).startWalking(),c=new Ee({definition:s}),l=new Ee({definition:o});return zm([c,l],n)}function Nc(t,e){e:for(let r=0;r{let i=e[n];return r===i||i.categoryMatchesMap[r.tokenTypeIdx]})}function Bm(t){return At(t,e=>At(e,r=>At(r,n=>Z(n.categoryMatches))))}function Wm(t){let e=t.lookaheadStrategy.validate({rules:t.rules,tokenTypes:t.tokenTypes,grammarName:t.grammarName});return I(e,r=>Object.assign({type:it.CUSTOM_LOOKAHEAD_VALIDATION},r))}function Vm(t,e,r,n){let i=ht(t,c=>wE(c,r)),s=LE(t,e,r),a=ht(t,c=>bE(c,r)),o=ht(t,c=>_E(c,t,n,r));return i.concat(s,a,o)}function wE(t,e){let r=new xf;t.accept(r);let n=r.allProductions,i=Uh(n,IE),s=Gt(i,o=>o.length>1);return I(Ce(s),o=>{let c=pt(o),l=e.buildDuplicateFoundError(t,o),u=Ot(c),p={message:l,type:it.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:u,occurrence:c.idx},h=Km(c);return h&&(p.parameter=h),p})}function IE(t){return`${Ot(t)}_#_${t.idx}_#_${Km(t)}`}function Km(t){return t instanceof te?t.terminalType.name:t instanceof pe?t.nonTerminalName:""}var xf=class extends Ct{constructor(){super(...arguments),this.allProductions=[]}visitNonTerminal(e){this.allProductions.push(e)}visitOption(e){this.allProductions.push(e)}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}visitAlternation(e){this.allProductions.push(e)}visitTerminal(e){this.allProductions.push(e)}};function _E(t,e,r,n){let i=[];if(Ue(e,(a,o)=>o.name===t.name?a+1:a,0)>1){let a=n.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});i.push({message:a,type:it.DUPLICATE_RULE_NAME,ruleName:t.name})}return i}function Hm(t,e,r){let n=[],i;return Pe(e,t)||(i=`Invalid rule override, rule: ->${t}<- cannot be overridden in the grammar: ->${r}<-as it is not defined in any of the super grammars `,n.push({message:i,type:it.INVALID_RULE_OVERRIDE,ruleName:t})),n}function Ef(t,e,r,n=[]){let i=[],s=Cc(e.definition);if(Z(s))return[];{let a=t.name;Pe(s,t)&&i.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:n}),type:it.LEFT_RECURSION,ruleName:a});let c=wn(s,n.concat([t])),l=ht(c,u=>{let p=Ne(n);return p.push(u),Ef(t,u,r,p)});return i.concat(l)}}function Cc(t){let e=[];if(Z(t))return e;let r=pt(t);if(r instanceof pe)e.push(r.referencedRule);else if(r instanceof Ee||r instanceof he||r instanceof Ae||r instanceof $e||r instanceof Re||r instanceof se)e=e.concat(Cc(r.definition));else if(r instanceof xe)e=Ve(I(r.definition,s=>Cc(s.definition)));else if(!(r instanceof te))throw Error("non exhaustive match");let n=Xn(r),i=t.length>1;if(n&&i){let s=Ke(t);return e.concat(Cc(s))}else return e}var $a=class extends Ct{constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}};function Ym(t,e){let r=new $a;t.accept(r);let n=r.alternations;return ht(n,s=>{let a=tn(s.definition);return ht(a,(o,c)=>{let l=$c([o],[],Br,1);return Z(l)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:s,emptyChoiceIdx:c}),type:it.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:s.idx,alternative:c+1}]:[]})})}function Xm(t,e,r){let n=new $a;t.accept(n);let i=n.alternations;return i=In(i,a=>a.ignoreAmbiguities===!0),ht(i,a=>{let o=a.idx,c=a.maxLookahead||e,l=Wi(o,t,c,a),u=PE(l,a,t,r),p=OE(l,a,t,r);return u.concat(p)})}var vf=class extends Ct{constructor(){super(...arguments),this.allProductions=[]}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}};function bE(t,e){let r=new $a;t.accept(r);let n=r.alternations;return ht(n,s=>s.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:s}),type:it.TOO_MANY_ALTS,ruleName:t.name,occurrence:s.idx}]:[])}function Jm(t,e,r){let n=[];return D(t,i=>{let s=new vf;i.accept(s);let a=s.allProductions;D(a,o=>{let c=Aa(o),l=o.maxLookahead||e,u=o.idx,h=Vi(u,i,c,l)[0];if(Z(Ve(h))){let g=r.buildEmptyRepetitionError({topLevelRule:i,repetition:o});n.push({message:g,type:it.NO_NON_EMPTY_LOOKAHEAD,ruleName:i.name})}})}),n}function PE(t,e,r,n){let i=[],s=Ue(t,(o,c,l)=>(e.definition[l].ignoreAmbiguities===!0||D(c,u=>{let p=[l];D(t,(h,g)=>{l!==g&&Nc(h,u)&&e.definition[g].ignoreAmbiguities!==!0&&p.push(g)}),p.length>1&&!Nc(i,u)&&(i.push(u),o.push({alts:p,path:u}))}),o),[]);return I(s,o=>{let c=I(o.alts,u=>u+1);return{message:n.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:c,prefixPath:o.path}),type:it.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:o.alts}})}function OE(t,e,r,n){let i=Ue(t,(a,o,c)=>{let l=I(o,u=>({idx:c,path:u}));return a.concat(l)},[]);return Or(ht(i,a=>{if(e.definition[a.idx].ignoreAmbiguities===!0)return[];let c=a.idx,l=a.path,u=ct(i,h=>e.definition[h.idx].ignoreAmbiguities!==!0&&h.idx{let g=[h.idx+1,c+1],C=e.idx===0?"":e.idx;return{message:n.buildAlternationPrefixAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:g,prefixPath:h.path}),type:it.AMBIGUOUS_PREFIX_ALTS,ruleName:r.name,occurrence:C,alternatives:g}})}))}function LE(t,e,r){let n=[],i=I(e,s=>s.name);return D(t,s=>{let a=s.name;if(Pe(i,a)){let o=r.buildNamespaceConflictError(s);n.push({message:o,type:it.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:a})}}),n}function Qm(t){let e=Ks(t,{errMsgProvider:Lm}),r={};return D(t.rules,n=>{r[n.name]=n}),Dm(r,e.errMsgProvider)}function Zm(t){return t=Ks(t,{errMsgProvider:cr}),Vm(t.rules,t.tokenTypes,t.errMsgProvider,t.grammarName)}var eg="MismatchedTokenException",tg="NoViableAltException",rg="EarlyExitException",ng="NotAllInputParsedException",ig=[eg,tg,rg,ng];Object.freeze(ig);function gn(t){return Pe(ig,t.name)}var Ki=class extends Error{constructor(e,r){super(e),this.token=r,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},Zn=class extends Ki{constructor(e,r,n){super(e,r),this.previousToken=n,this.name=eg}},Sa=class extends Ki{constructor(e,r,n){super(e,r),this.previousToken=n,this.name=tg}},ka=class extends Ki{constructor(e,r){super(e,r),this.name=ng}},Na=class extends Ki{constructor(e,r,n){super(e,r),this.previousToken=n,this.name=rg}};var Af={},Sf="InRuleRecoveryException",$f=class extends Error{constructor(e){super(e),this.name=Sf}},wc=class{initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=q(e,"recoveryEnabled")?e.recoveryEnabled:wt.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=DE)}getTokenToInsert(e){let r=Kr(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,r,n,i){let s=this.findReSyncTokenType(),a=this.exportLexerState(),o=[],c=!1,l=this.LA(1),u=this.LA(1),p=()=>{let h=this.LA(0),g=this.errorMessageProvider.buildMismatchTokenMessage({expected:i,actual:l,previous:h,ruleName:this.getCurrRuleFullName()}),C=new Zn(g,l,this.LA(0));C.resyncedTokens=tn(o),this.SAVE_ERROR(C)};for(;!c;)if(this.tokenMatcher(u,i)){p();return}else if(n.call(this)){p(),e.apply(this,r);return}else this.tokenMatcher(u,s)?c=!0:(u=this.SKIP_TOKEN(),this.addToResyncTokens(u,o));this.importLexerState(a)}shouldInRepetitionRecoveryBeTried(e,r,n){return!(n===!1||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))}getFollowsForInRuleRecovery(e,r){let n=this.getCurrentGrammarPath(e,r);return this.getNextPossibleTokenTypes(n)}tryInRuleRecovery(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r))return this.getTokenToInsert(e);if(this.canRecoverWithSingleTokenDeletion(e)){let n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new $f("sad sad panda")}canPerformInRuleRecovery(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,r){if(!this.canTokenTypeBeInsertedInRecovery(e)||Z(r))return!1;let n=this.LA(1);return Lr(r,s=>this.tokenMatcher(n,s))!==void 0}canRecoverWithSingleTokenDeletion(e){return this.canTokenTypeBeDeletedInRecovery(e)?this.tokenMatcher(this.LA(2),e):!1}isInCurrentRuleReSyncSet(e){let r=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(r);return Pe(n,e)}findReSyncTokenType(){let e=this.flattenFollowSet(),r=this.LA(1),n=2;for(;;){let i=Lr(e,s=>xa(r,s));if(i!==void 0)return i;r=this.LA(n),n++}}getCurrFollowKey(){if(this.RULE_STACK.length===1)return Af;let e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){let e=this.RULE_STACK,r=this.RULE_OCCURRENCE_STACK;return I(e,(n,i)=>i===0?Af:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:r[i],inRule:this.shortRuleNameToFullName(e[i-1])})}flattenFollowSet(){let e=I(this.buildFullFollowKeyStack(),r=>this.getFollowSetFromFollowKey(r));return Ve(e)}getFollowSetFromFollowKey(e){if(e===Af)return[Bt];let r=e.ruleName+e.idxInCallingRule+hc+e.inRule;return this.resyncFollows[r]}addToResyncTokens(e,r){return this.tokenMatcher(e,Bt)||r.push(e),r}reSyncTo(e){let r=[],n=this.LA(1);for(;this.tokenMatcher(n,e)===!1;)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,r);return tn(r)}attemptInRepetitionRecovery(e,r,n,i,s,a,o){}getCurrentGrammarPath(e,r){let n=this.getHumanReadableRuleStack(),i=Ne(this.RULE_OCCURRENCE_STACK);return{ruleStack:n,occurrenceStack:i,lastTok:e,lastTokOccurrence:r}}getHumanReadableRuleStack(){return I(this.RULE_STACK,e=>this.shortRuleNameToFullName(e))}};function DE(t,e,r,n,i,s,a){let o=this.getKeyForAutomaticLookahead(n,i),c=this.firstAfterRepMap[o];if(c===void 0){let h=this.getCurrRuleFullName(),g=this.getGAstProductions()[h];c=new s(g,i).startWalking(),this.firstAfterRepMap[o]=c}let l=c.token,u=c.occurrence,p=c.isEndOfRule;this.RULE_STACK.length===1&&p&&l===void 0&&(l=Bt,u=1),!(l===void 0||u===void 0)&&this.shouldInRepetitionRecoveryBeTried(l,u,a)&&this.tryInRepetitionRecovery(t,e,r,l)}function Ic(t,e,r){return r|e|t}var Yr=class{constructor(e){var r;this.maxLookahead=(r=e?.maxLookahead)!==null&&r!==void 0?r:wt.maxLookahead}validate(e){let r=this.validateNoLeftRecursion(e.rules);if(Z(r)){let n=this.validateEmptyOrAlternatives(e.rules),i=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),s=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...r,...n,...i,...s]}return r}validateNoLeftRecursion(e){return ht(e,r=>Ef(r,r,cr))}validateEmptyOrAlternatives(e){return ht(e,r=>Ym(r,cr))}validateAmbiguousAlternationAlternatives(e,r){return ht(e,n=>Xm(n,r,cr))}validateSomeNonEmptyLookaheadPath(e,r){return Jm(e,r,cr)}buildLookaheadForAlternation(e){return Fm(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,Um)}buildLookaheadForOptional(e){return Gm(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,Aa(e.prodType),qm)}};var bc=class{initLooksAhead(e){this.dynamicTokensEnabled=q(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:wt.dynamicTokensEnabled,this.maxLookahead=q(e,"maxLookahead")?e.maxLookahead:wt.maxLookahead,this.lookaheadStrategy=q(e,"lookaheadStrategy")?e.lookaheadStrategy:new Yr({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){D(e,r=>{this.TRACE_INIT(`${r.name} Rule Lookahead`,()=>{let{alternation:n,repetition:i,option:s,repetitionMandatory:a,repetitionMandatoryWithSeparator:o,repetitionWithSeparator:c}=ME(r);D(n,l=>{let u=l.idx===0?"":l.idx;this.TRACE_INIT(`${Ot(l)}${u}`,()=>{let p=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:l.idx,rule:r,maxLookahead:l.maxLookahead||this.maxLookahead,hasPredicates:l.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),h=Ic(this.fullRuleNameToShort[r.name],256,l.idx);this.setLaFuncCache(h,p)})}),D(i,l=>{this.computeLookaheadFunc(r,l.idx,768,"Repetition",l.maxLookahead,Ot(l))}),D(s,l=>{this.computeLookaheadFunc(r,l.idx,512,"Option",l.maxLookahead,Ot(l))}),D(a,l=>{this.computeLookaheadFunc(r,l.idx,1024,"RepetitionMandatory",l.maxLookahead,Ot(l))}),D(o,l=>{this.computeLookaheadFunc(r,l.idx,1536,"RepetitionMandatoryWithSeparator",l.maxLookahead,Ot(l))}),D(c,l=>{this.computeLookaheadFunc(r,l.idx,1280,"RepetitionWithSeparator",l.maxLookahead,Ot(l))})})})}computeLookaheadFunc(e,r,n,i,s,a){this.TRACE_INIT(`${a}${r===0?"":r}`,()=>{let o=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:r,rule:e,maxLookahead:s||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:i}),c=Ic(this.fullRuleNameToShort[e.name],n,r);this.setLaFuncCache(c,o)})}getKeyForAutomaticLookahead(e,r){let n=this.getLastExplicitRuleShortName();return Ic(n,e,r)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,r){this.lookAheadFuncsCache.set(e,r)}},kf=class extends Ct{constructor(){super(...arguments),this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}reset(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}visitOption(e){this.dslMethods.option.push(e)}visitRepetitionWithSeparator(e){this.dslMethods.repetitionWithSeparator.push(e)}visitRepetitionMandatory(e){this.dslMethods.repetitionMandatory.push(e)}visitRepetitionMandatoryWithSeparator(e){this.dslMethods.repetitionMandatoryWithSeparator.push(e)}visitRepetition(e){this.dslMethods.repetition.push(e)}visitAlternation(e){this.dslMethods.alternation.push(e)}},_c=new kf;function ME(t){_c.reset(),t.accept(_c);let e=_c.dslMethods;return _c.reset(),e}function wf(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffseta.msg);throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>: diff --git a/src/google/adk/cli/browser/chunk-QGHEW6NO.js b/src/google/adk/cli/browser/chunk-QGHEW6NO.js index 0ee96c53ab..82b5b010fa 100644 --- a/src/google/adk/cli/browser/chunk-QGHEW6NO.js +++ b/src/google/adk/cli/browser/chunk-QGHEW6NO.js @@ -57,7 +57,7 @@ Expecting `+se.join(", ")+", got '"+(this.terminals_[f]||f)+"'":fe="Parse error stroke: ${t.lineColor} !important; stroke-width: 1; } - + .edgeLabel { background-color: ${t.edgeLabelBackground}; } diff --git a/src/google/adk/cli/browser/chunk-S22PTQH2.js b/src/google/adk/cli/browser/chunk-S22PTQH2.js index fad4a761c9..3bea5f3ccf 100644 --- a/src/google/adk/cli/browser/chunk-S22PTQH2.js +++ b/src/google/adk/cli/browser/chunk-S22PTQH2.js @@ -25,7 +25,7 @@ Expecting `+ye.join(", ")+", got '"+(this.terminals_[y]||y)+"'":qe="Parse error stroke: ${e.requirementBorderColor}; stroke-width: ${e.requirementBorderSize}; } - + .reqTitle, .reqLabel{ fill: ${e.requirementTextColor}; } diff --git a/src/google/adk/cli/browser/chunk-T2UY75BD.js b/src/google/adk/cli/browser/chunk-T2UY75BD.js index 3e9e5540d2..63a477b5e3 100644 --- a/src/google/adk/cli/browser/chunk-T2UY75BD.js +++ b/src/google/adk/cli/browser/chunk-T2UY75BD.js @@ -20,7 +20,7 @@ Expecting `+vt.join(", ")+", got '"+(this.terminals_[J]||J)+"'":Zt="Parse error .actor-line { stroke: ${e.actorLineColor}; } - + .innerArc { stroke-width: 1.5; stroke-dasharray: none; diff --git a/src/google/adk/cli/browser/chunk-W7PRDKNL.js b/src/google/adk/cli/browser/chunk-W7PRDKNL.js index 90526eb2a2..6db8bd616f 100644 --- a/src/google/adk/cli/browser/chunk-W7PRDKNL.js +++ b/src/google/adk/cli/browser/chunk-W7PRDKNL.js @@ -7,7 +7,7 @@ import{a as At,b as Ot}from"./chunk-DRBE27N3.js";import{a as w}from"./chunk-PRKF a${l},${r} 0,0,0 0,${o} l${-g},0`,"createCylinderPathD"),Ce=b((y,t,g,o,l,r)=>[`M${y},${t}`,`M${y+g},${t}`,`a${l},${r} 0,0,0 0,${-o}`,`l${-g},0`,`a${l},${r} 0,0,0 0,${o}`,`l${g},0`].join(" "),"createOuterCylinderPathD"),Pe=b((y,t,g,o,l,r)=>[`M${y+g/2},${-o/2}`,`a${l},${r} 0,0,0 0,${o}`].join(" "),"createInnerCylinderPathD");function Fs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f,halfPadding:a}=yield O(y,t,T(t)),c=t.look==="neo"?a*2:a,s=r.height+c,e=s/2,i=e/(2.5+s/50),h=r.width+i+c,{cssStyles:n}=t,p;if(t.look==="handDrawn"){let u=w.svg(l),m=Ce(0,0,h,s,i,e),d=Pe(0,0,h,s,i,e),x=u.path(m,N(t,{})),D=u.path(d,N(t,{fill:"none"}));p=l.insert(()=>D,":first-child"),p=l.insert(()=>x,":first-child"),p.attr("class","basic label-container"),n&&p.attr("style",n)}else{let u=Me(0,0,h,s,i,e);p=l.insert("path",":first-child").attr("d",u).attr("class","basic label-container").attr("style",st(n)).attr("style",o),p.attr("class","basic label-container"),n&&p.selectAll("path").attr("style",n),o&&p.selectAll("path").attr("style",o)}return p.attr("label-offset-x",i),p.attr("transform",`translate(${-h/2}, ${s/2} )`),f.attr("transform",`translate(${-(r.width/2)-i-(r.x-(r.left??0))}, ${-(r.height/2)-(r.y-(r.top??0))})`),A(t,p),t.intersect=function(u){let m=P.rect(t,u),d=m.y-(t.y??0);if(e!=0&&(Math.abs(d)<(t.height??0)/2||Math.abs(d)==(t.height??0)/2&&Math.abs(m.x-(t.x??0))>(t.width??0)/2-i)){let x=i*i*(1-d*d/(e*e));x!=0&&(x=Math.sqrt(Math.abs(x))),x=i-x,u.x-(t.x??0)>0&&(x=-x),m.x+=x}return m},l})}b(Fs,"tiltedCylinder");function Gs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=r.width+t.padding,a=r.height+t.padding,c=[{x:-3*a/6,y:0},{x:f+3*a/6,y:0},{x:f,y:-a},{x:0,y:-a}],s,{cssStyles:e}=t;if(t.look==="handDrawn"){let i=w.svg(l),h=N(t,{}),n=z(c),p=i.path(n,h);s=l.insert(()=>p,":first-child").attr("transform",`translate(${-f/2}, ${a/2})`),e&&s.attr("style",e)}else s=ht(l,f,a,c);return o&&s.attr("style",o),t.width=f,t.height=a,A(t,s),t.intersect=function(i){return P.polygon(t,c,i)},l})}b(Gs,"trapezoid");function zs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=60,a=20,c=Math.max(f,r.width+(t.padding??0)*2,t?.width??0),s=Math.max(a,r.height+(t.padding??0)*2,t?.height??0),{cssStyles:e}=t,i=w.svg(l),h=N(t,{});t.look!=="handDrawn"&&(h.roughness=0,h.fillStyle="solid");let n=[{x:-c/2*.8,y:-s/2},{x:c/2*.8,y:-s/2},{x:c/2,y:-s/2*.6},{x:c/2,y:s/2},{x:-c/2,y:s/2},{x:-c/2,y:-s/2*.6}],p=z(n),u=i.path(p,h),m=l.insert(()=>u,":first-child");return m.attr("class","basic label-container"),e&&t.look!=="handDrawn"&&m.selectChildren("path").attr("style",e),o&&t.look!=="handDrawn"&&m.selectChildren("path").attr("style",o),A(t,m),t.intersect=function(d){return P.polygon(t,n,d)},l})}b(zs,"trapezoidalPentagon");function Vs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=t.useHtmlLabels||it(U()),c=r.width+(t.padding??0),s=c+r.height,e=c+r.height,i=[{x:0,y:0},{x:e,y:0},{x:e/2,y:-s}],{cssStyles:h}=t,n=w.svg(l),p=N(t,{});t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let u=z(i),m=n.path(u,p),d=l.insert(()=>m,":first-child").attr("transform",`translate(${-s/2}, ${s/2})`);return h&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",h),o&&t.look!=="handDrawn"&&d.selectChildren("path").attr("style",o),t.width=c,t.height=s,A(t,d),f.attr("transform",`translate(${-r.width/2-(r.x-(r.left??0))}, ${s/2-(r.height+(t.padding??0)/(a?2:1)-(r.y-(r.top??0)))})`),t.intersect=function(x){return Z.info("Triangle intersect",t,i,x),P.polygon(t,i,x)},l})}b(Vs,"triangle");function Zs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=c/8,e=c+s,{cssStyles:i}=t,n=70-a,p=n>0?n/2:0,u=w.svg(l),m=N(t,{});t.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let d=[{x:-a/2-p,y:e/2},...ft(-a/2-p,e/2,a/2+p,e/2,s,.8),{x:a/2+p,y:-e/2},{x:-a/2-p,y:-e/2}],x=z(d),D=u.path(x,m),S=l.insert(()=>D,":first-child");return S.attr("class","basic label-container"),i&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",i),o&&t.look!=="handDrawn"&&S.selectAll("path").attr("style",o),S.attr("transform",`translate(0,${-s/2})`),f.attr("transform",`translate(${-a/2+(t.padding??0)-(r.x-(r.left??0))},${-c/2+(t.padding??0)-s-(r.y-(r.top??0))})`),A(t,S),t.intersect=function($){return P.polygon(t,d,$)},l})}b(Zs,"waveEdgedRectangle");function Js(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r}=yield O(y,t,T(t)),f=100,a=50,c=Math.max(r.width+(t.padding??0)*2,t?.width??0),s=Math.max(r.height+(t.padding??0)*2,t?.height??0),e=c/s,i=c,h=s;i>h*e?h=i/e:i=h*e,i=Math.max(i,f),h=Math.max(h,a);let n=Math.min(h*.2,h/4),p=h+n*2,{cssStyles:u}=t,m=w.svg(l),d=N(t,{});t.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let x=[{x:-i/2,y:p/2},...ft(-i/2,p/2,i/2,p/2,n,1),{x:i/2,y:-p/2},...ft(i/2,-p/2,-i/2,-p/2,n,-1)],D=z(x),S=m.path(D,d),$=l.insert(()=>S,":first-child");return $.attr("class","basic label-container"),u&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",u),o&&t.look!=="handDrawn"&&$.selectAll("path").attr("style",o),A(t,$),t.intersect=function(v){return P.polygon(t,x,v)},l})}b(Js,"waveRectangle");function Qs(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,label:f}=yield O(y,t,T(t)),a=Math.max(r.width+(t.padding??0)*2,t?.width??0),c=Math.max(r.height+(t.padding??0)*2,t?.height??0),s=5,e=-a/2,i=-c/2,{cssStyles:h}=t,n=w.svg(l),p=N(t,{}),u=[{x:e-s,y:i-s},{x:e-s,y:i+c},{x:e+a,y:i+c},{x:e+a,y:i-s}],m=`M${e-s},${i-s} L${e+a},${i-s} L${e+a},${i+c} L${e-s},${i+c} L${e-s},${i-s} M${e-s},${i} L${e+a},${i} - M${e},${i-s} L${e},${i+c}`;t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let d=n.path(m,p),x=l.insert(()=>d,":first-child");return x.attr("transform",`translate(${s/2}, ${s/2})`),x.attr("class","basic label-container"),h&&t.look!=="handDrawn"&&x.selectAll("path").attr("style",h),o&&t.look!=="handDrawn"&&x.selectAll("path").attr("style",o),f.attr("transform",`translate(${-(r.width/2)+s/2-(r.x-(r.left??0))}, ${-(r.height/2)+s/2-(r.y-(r.top??0))})`),A(t,x),t.intersect=function(D){return P.polygon(t,u,D)},l})}b(Qs,"windowPane");function Et(y,t){return C(this,null,function*(){let g=t;if(g.alias&&(t.label=g.alias),t.look==="handDrawn"){let{themeVariables:G}=dt(),{background:J}=G,et=rt(tt({},t),{id:t.id+"-background",look:"default",cssStyles:["stroke: none",`fill: ${J}`]});yield Et(y,et)}let o=dt();t.useHtmlLabels=o.htmlLabels;let l=o.er?.diagramPadding??10,r=o.er?.entityPadding??6,{cssStyles:f}=t,{labelStyles:a,nodeStyles:c}=R(t);if(g.attributes.length===0&&t.label){let G={rx:0,ry:0,labelPaddingX:l,labelPaddingY:l*1.5,classes:""};wt(t.label,o)+G.labelPaddingX*20){let G=i.width+l*2-(u+m+d+x);u+=G/$,m+=G/$,d>0&&(d+=G/$),x>0&&(x+=G/$)}let B=u+m+d+x,k=w.svg(e),M=N(t,{});t.look!=="handDrawn"&&(M.roughness=0,M.fillStyle="solid");let I=0;p.length>0&&(I=p.reduce((G,J)=>G+(J?.rowHeight??0),0));let Y=Math.max(v.width+l*2,t?.width||0,B),V=Math.max((I??0)+i.height,t?.height||0),q=-Y/2,W=-V/2;e.selectAll("g:not(:first-child)").each((G,J,et)=>{let at=Q(et[J]),pt=at.attr("transform"),gt=0,Tt=0;if(pt){let Ct=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(pt);Ct&&(gt=parseFloat(Ct[1]),Tt=parseFloat(Ct[2]),at.attr("class").includes("attribute-name")?gt+=u:at.attr("class").includes("attribute-keys")?gt+=u+m:at.attr("class").includes("attribute-comment")&&(gt+=u+m+d))}at.attr("transform",`translate(${q+l/2+gt}, ${Tt+W+i.height+r/2})`)}),e.select(".name").attr("transform","translate("+-i.width/2+", "+(W+r/2)+")");let j=k.rectangle(q,W,Y,V,M),L=e.insert(()=>j,":first-child").attr("style",f.join("")),{themeVariables:F}=dt(),{rowEven:_,rowOdd:H,nodeBorder:X}=F;n.push(0);for(let[G,J]of p.entries()){let at=(G+1)%2===0&&J.yOffset!==0,pt=k.rectangle(q,i.height+W+J?.yOffset,Y,J?.rowHeight,rt(tt({},M),{fill:at?_:H,stroke:X}));e.insert(()=>pt,"g.label").attr("style",f.join("")).attr("class",`row-rect-${at?"even":"odd"}`)}let E=k.line(q,i.height+W,Y+q,i.height+W,M);e.insert(()=>E).attr("class","divider"),E=k.line(u+q,i.height+W,u+q,V+W,M),e.insert(()=>E).attr("class","divider"),D&&(E=k.line(u+m+q,i.height+W,u+m+q,V+W,M),e.insert(()=>E).attr("class","divider")),S&&(E=k.line(u+m+d+q,i.height+W,u+m+d+q,V+W,M),e.insert(()=>E).attr("class","divider"));for(let G of n)E=k.line(q,i.height+W+G,Y+q,i.height+W+G,M),e.insert(()=>E).attr("class","divider");if(A(t,L),c&&t.look!=="handDrawn"){let J=c.split(";")?.filter(et=>et.includes("stroke"))?.map(et=>`${et}`).join("; ");e.selectAll("path").attr("style",J??""),e.selectAll(".row-rect-even path").attr("style",c)}return t.intersect=function(G){return P.rect(t,G)},e})}b(Et,"erBox");function mt(a,c,s){return C(this,arguments,function*(y,t,g,o=0,l=0,r=[],f=""){let e=y.insert("g").attr("class",`label ${r.join(" ")}`).attr("transform",`translate(${o}, ${l})`).attr("style",f);t!==Nt(t)&&(t=Nt(t),t=t.replaceAll("<","<").replaceAll(">",">"));let i=e.node().appendChild(yield nt(e,t,{width:wt(t,g)+100,style:f,useHtmlLabels:g.htmlLabels},g));if(t.includes("<")||t.includes(">")){let n=i.children[0];for(n.textContent=n.textContent.replaceAll("<","<").replaceAll(">",">");n.childNodes[0];)n=n.childNodes[0],n.textContent=n.textContent.replaceAll("<","<").replaceAll(">",">")}let h=i.getBBox();if(ut(g.htmlLabels)){let n=i.children[0];n.style.textAlign="start";let p=Q(i);h=n.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}return h})}b(mt,"addText");function Us(r,f,a,c){return C(this,arguments,function*(y,t,g,o,l=g.class.padding??12){let s=o?0:3,e=y.insert("g").attr("class",T(t)).attr("id",t.domId||t.id),i=null,h=null,n=null,p=null,u=0,m=0,d=0;if(i=e.insert("g").attr("class","annotation-group text"),t.annotations.length>0){let v=t.annotations[0];yield vt(i,{text:`\xAB${v}\xBB`},0),u=i.node().getBBox().height}h=e.insert("g").attr("class","label-group text"),yield vt(h,t,0,["font-weight: bolder"]);let x=h.node().getBBox();m=x.height,n=e.insert("g").attr("class","members-group text");let D=0;for(let v of t.members){let B=yield vt(n,v,D,[v.parseClassifier()]);D+=B+s}d=n.node().getBBox().height,d<=0&&(d=l/2),p=e.insert("g").attr("class","methods-group text");let S=0;for(let v of t.methods){let B=yield vt(p,v,S,[v.parseClassifier()]);S+=B+s}let $=e.node().getBBox();if(i!==null){let v=i.node().getBBox();i.attr("transform",`translate(${-v.width/2})`)}return h.attr("transform",`translate(${-x.width/2}, ${u})`),$=e.node().getBBox(),n.attr("transform",`translate(0, ${u+m+l*2})`),$=e.node().getBBox(),p.attr("transform",`translate(0, ${u+m+(d?d+l*4:l*2)})`),$=e.node().getBBox(),{shapeSvg:e,bbox:$}})}b(Us,"textHelper");function vt(l,r,f){return C(this,arguments,function*(y,t,g,o=[]){let a=y.insert("g").attr("class","label").attr("style",o.join("; ")),c=dt(),s="useHtmlLabels"in t?t.useHtmlLabels:ut(c.htmlLabels)??!0,e="";"text"in t?e=t.text:e=t.label,!s&&e.startsWith("\\")&&(e=e.substring(1)),_t(e)&&(s=!0);let i=yield nt(a,Rt(bt(e)),{width:wt(e,c)+50,classes:"markdown-node-label",useHtmlLabels:s},c),h,n=1;if(s){let p=i.children[0],u=Q(i);n=p.innerHTML.split("
            ").length,p.innerHTML.includes("")&&(n+=p.innerHTML.split("").length-1);let m=p.getElementsByTagName("img");if(m){let d=e.replace(/]*>/g,"").trim()==="";yield Promise.all([...m].map(x=>new Promise(D=>{function S(){if(x.style.display="flex",x.style.flexDirection="column",d){let $=c.fontSize?.toString()??window.getComputedStyle(document.body).fontSize,B=parseInt($,10)*5+"px";x.style.minWidth=B,x.style.maxWidth=B}else x.style.width="100%";D(x)}b(S,"setupImage"),setTimeout(()=>{x.complete&&S()}),x.addEventListener("error",S),x.addEventListener("load",S)})))}h=p.getBoundingClientRect(),u.attr("width",h.width),u.attr("height",h.height)}else{o.includes("font-weight: bolder")&&Q(i).selectAll("tspan").attr("font-weight",""),n=i.children.length;let p=i.children[0];(i.textContent===""||i.textContent.includes(">"))&&(p.textContent=e[0]+e.substring(1).replaceAll(">",">").replaceAll("<","<").trim(),e[1]===" "&&(p.textContent=p.textContent[0]+" "+p.textContent.substring(1))),p.textContent==="undefined"&&(p.textContent=""),h=i.getBBox()}return a.attr("transform","translate(0,"+(-h.height/(2*n)+g)+")"),h.height})}b(vt,"addText");function Ks(y,t){return C(this,null,function*(){let g=U(),o=g.class.padding??12,l=o,r=t.useHtmlLabels??ut(g.htmlLabels)??!0,f=t;f.annotations=f.annotations??[],f.members=f.members??[],f.methods=f.methods??[];let{shapeSvg:a,bbox:c}=yield Us(y,t,g,r,l),{labelStyles:s,nodeStyles:e}=R(t);t.labelStyle=s,t.cssStyles=f.styles||"";let i=f.styles?.join(";")||e||"";t.cssStyles||(t.cssStyles=i.replaceAll("!important","").split(";"));let h=f.members.length===0&&f.methods.length===0&&!g.class?.hideEmptyMembersBox,n=w.svg(a),p=N(t,{});t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let u=c.width,m=c.height;f.members.length===0&&f.methods.length===0?m+=l:f.members.length>0&&f.methods.length===0&&(m+=l*2);let d=-u/2,x=-m/2,D=n.rectangle(d-o,x-o-(h?o:f.members.length===0&&f.methods.length===0?-o/2:0),u+2*o,m+2*o+(h?o*2:f.members.length===0&&f.methods.length===0?-o:0),p),S=a.insert(()=>D,":first-child");S.attr("class","basic label-container");let $=S.node().getBBox();a.selectAll(".text").each((M,I,Y)=>{let V=Q(Y[I]),q=V.attr("transform"),W=0;if(q){let _=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(q);_&&(W=parseFloat(_[2]))}let j=W+x+o-(h?o:f.members.length===0&&f.methods.length===0?-o/2:0);r||(j-=4);let L=d;(V.attr("class").includes("label-group")||V.attr("class").includes("annotation-group"))&&(L=-V.node()?.getBBox().width/2||0,a.selectAll("text").each(function(F,_,H){window.getComputedStyle(H[_]).textAnchor==="middle"&&(L=0)})),V.attr("transform",`translate(${L}, ${j})`)});let v=a.select(".annotation-group").node().getBBox().height-(h?o/2:0)||0,B=a.select(".label-group").node().getBBox().height-(h?o/2:0)||0,k=a.select(".members-group").node().getBBox().height-(h?o/2:0)||0;if(f.members.length>0||f.methods.length>0||h){let M=n.line($.x,v+B+x+o,$.x+$.width,v+B+x+o,p);a.insert(()=>M).attr("class","divider").attr("style",i)}if(h||f.members.length>0||f.methods.length>0){let M=n.line($.x,v+B+k+x+l*2+o,$.x+$.width,v+B+k+x+o+l*2,p);a.insert(()=>M).attr("class","divider").attr("style",i)}if(f.look!=="handDrawn"&&a.selectAll("path").attr("style",i),S.select(":nth-child(2)").attr("style",i),a.selectAll(".divider").select("path").attr("style",i),t.labelStyle?a.selectAll("span").attr("style",t.labelStyle):a.selectAll("span").attr("style",i),!r){let M=RegExp(/color\s*:\s*([^;]*)/),I=M.exec(i);if(I){let Y=I[0].replace("color","fill");a.selectAll("tspan").attr("style",Y)}else if(s){let Y=M.exec(s);if(Y){let V=Y[0].replace("color","fill");a.selectAll("tspan").attr("style",V)}}}return A(t,S),t.intersect=function(M){return P.rect(t,M)},a})}b(Ks,"classBox");function te(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let l=t,r=t,f=20,a=20,c="verifyMethod"in t,s=T(t),e=y.insert("g").attr("class",s).attr("id",t.domId??t.id),i;c?i=yield lt(e,`<<${l.type}>>`,0,t.labelStyle):i=yield lt(e,"<<Element>>",0,t.labelStyle);let h=i,n=yield lt(e,l.name,h,t.labelStyle+"; font-weight: bold;");if(h+=n+a,c){let v=yield lt(e,`${l.requirementId?`ID: ${l.requirementId}`:""}`,h,t.labelStyle);h+=v;let B=yield lt(e,`${l.text?`Text: ${l.text}`:""}`,h,t.labelStyle);h+=B;let k=yield lt(e,`${l.risk?`Risk: ${l.risk}`:""}`,h,t.labelStyle);h+=k,yield lt(e,`${l.verifyMethod?`Verification: ${l.verifyMethod}`:""}`,h,t.labelStyle)}else{let v=yield lt(e,`${r.type?`Type: ${r.type}`:""}`,h,t.labelStyle);h+=v,yield lt(e,`${r.docRef?`Doc Ref: ${r.docRef}`:""}`,h,t.labelStyle)}let p=(e.node()?.getBBox().width??200)+f,u=(e.node()?.getBBox().height??200)+f,m=-p/2,d=-u/2,x=w.svg(e),D=N(t,{});t.look!=="handDrawn"&&(D.roughness=0,D.fillStyle="solid");let S=x.rectangle(m,d,p,u,D),$=e.insert(()=>S,":first-child");if($.attr("class","basic label-container").attr("style",o),e.selectAll(".label").each((v,B,k)=>{let M=Q(k[B]),I=M.attr("transform"),Y=0,V=0;if(I){let L=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(I);L&&(Y=parseFloat(L[1]),V=parseFloat(L[2]))}let q=V-u/2,W=m+f/2;(B===0||B===1)&&(W=Y),M.attr("transform",`translate(${W}, ${q+f})`)}),h>i+n+a){let v=x.line(m,d+i+n+a,m+p,d+i+n+a,D);e.insert(()=>v).attr("style",o)}return A(t,$),t.intersect=function(v){return P.rect(t,v)},e})}b(te,"requirementBox");function lt(y,t,g,o=""){return C(this,null,function*(){if(t==="")return 0;let l=y.insert("g").attr("class","label").attr("style",o),r=U(),f=r.htmlLabels??!0,a=yield nt(l,Rt(bt(t)),{width:wt(t,r)+50,classes:"markdown-node-label",useHtmlLabels:f,style:o},r),c;if(f){let s=a.children[0],e=Q(a);c=s.getBoundingClientRect(),e.attr("width",c.width),e.attr("height",c.height)}else{let s=a.children[0];for(let e of s.children)e.textContent=e.textContent.replaceAll(">",">").replaceAll("<","<"),o&&e.setAttribute("style",o);c=a.getBBox(),c.height+=6}return l.attr("transform",`translate(${-c.width/2},${-c.height/2+g})`),c.height})}b(lt,"addText");var Ne=b(y=>{switch(y){case"Very High":return"red";case"High":return"orange";case"Medium":return null;case"Low":return"blue";case"Very Low":return"lightblue"}},"colorFromPriority");function se(o,l,r){return C(this,arguments,function*(y,t,{config:g}){let{labelStyles:f,nodeStyles:a}=R(t);t.labelStyle=f||"";let c=10,s=t.width;t.width=(t.width??200)-10;let{shapeSvg:e,bbox:i,label:h}=yield O(y,t,T(t)),n=t.padding||10,p="",u;"ticket"in t&&t.ticket&&g?.kanban?.ticketBaseUrl&&(p=g?.kanban?.ticketBaseUrl.replace("#TICKET#",t.ticket),u=e.insert("svg:a",":first-child").attr("class","kanban-ticket-link").attr("xlink:href",p).attr("target","_blank"));let m={useHtmlLabels:t.useHtmlLabels,labelStyle:t.labelStyle||"",width:t.width,img:t.img,padding:t.padding||8,centerLabel:!1},d,x;u?{label:d,bbox:x}=yield Lt(u,"ticket"in t&&t.ticket||"",m):{label:d,bbox:x}=yield Lt(e,"ticket"in t&&t.ticket||"",m);let{label:D,bbox:S}=yield Lt(e,"assigned"in t&&t.assigned||"",m);t.width=s;let $=10,v=t?.width||0,B=Math.max(x.height,S.height)/2,k=Math.max(i.height+$*2,t?.height||0)+B,M=-v/2,I=-k/2;h.attr("transform","translate("+(n-v/2)+", "+(-B-i.height/2)+")"),d.attr("transform","translate("+(n-v/2)+", "+(-B+i.height/2)+")"),D.attr("transform","translate("+(n+v/2-S.width-2*c)+", "+(-B+i.height/2)+")");let Y,{rx:V,ry:q}=t,{cssStyles:W}=t;if(t.look==="handDrawn"){let j=w.svg(e),L=N(t,{}),F=V||q?j.path(yt(M,I,v,k,V||0),L):j.rectangle(M,I,v,k,L);Y=e.insert(()=>F,":first-child"),Y.attr("class","basic label-container").attr("style",W||null)}else{Y=e.insert("rect",":first-child"),Y.attr("class","basic label-container __APA__").attr("style",a).attr("rx",V??5).attr("ry",q??5).attr("x",M).attr("y",I).attr("width",v).attr("height",k);let j="priority"in t&&t.priority;if(j){let L=e.append("line"),F=M+2,_=I+Math.floor((V??0)/2),H=I+k-Math.floor((V??0)/2);L.attr("x1",F).attr("y1",_).attr("x2",F).attr("y2",H).attr("stroke-width","4").attr("stroke",Ne(j))}}return A(t,Y),t.height=k,t.intersect=function(j){return P.rect(t,j)},e})}b(se,"kanbanItem");function ee(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,halfPadding:f,label:a}=yield O(y,t,T(t)),c=r.width+10*f,s=r.height+8*f,e=.15*c,{cssStyles:i}=t,h=r.width+20,n=r.height+20,p=Math.max(c,h),u=Math.max(s,n);a.attr("transform",`translate(${-r.width/2}, ${-r.height/2})`);let m,d=`M0 0 + M${e},${i-s} L${e},${i+c}`;t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let d=n.path(m,p),x=l.insert(()=>d,":first-child");return x.attr("transform",`translate(${s/2}, ${s/2})`),x.attr("class","basic label-container"),h&&t.look!=="handDrawn"&&x.selectAll("path").attr("style",h),o&&t.look!=="handDrawn"&&x.selectAll("path").attr("style",o),f.attr("transform",`translate(${-(r.width/2)+s/2-(r.x-(r.left??0))}, ${-(r.height/2)+s/2-(r.y-(r.top??0))})`),A(t,x),t.intersect=function(D){return P.polygon(t,u,D)},l})}b(Qs,"windowPane");function Et(y,t){return C(this,null,function*(){let g=t;if(g.alias&&(t.label=g.alias),t.look==="handDrawn"){let{themeVariables:G}=dt(),{background:J}=G,et=rt(tt({},t),{id:t.id+"-background",look:"default",cssStyles:["stroke: none",`fill: ${J}`]});yield Et(y,et)}let o=dt();t.useHtmlLabels=o.htmlLabels;let l=o.er?.diagramPadding??10,r=o.er?.entityPadding??6,{cssStyles:f}=t,{labelStyles:a,nodeStyles:c}=R(t);if(g.attributes.length===0&&t.label){let G={rx:0,ry:0,labelPaddingX:l,labelPaddingY:l*1.5,classes:""};wt(t.label,o)+G.labelPaddingX*20){let G=i.width+l*2-(u+m+d+x);u+=G/$,m+=G/$,d>0&&(d+=G/$),x>0&&(x+=G/$)}let B=u+m+d+x,k=w.svg(e),M=N(t,{});t.look!=="handDrawn"&&(M.roughness=0,M.fillStyle="solid");let I=0;p.length>0&&(I=p.reduce((G,J)=>G+(J?.rowHeight??0),0));let Y=Math.max(v.width+l*2,t?.width||0,B),V=Math.max((I??0)+i.height,t?.height||0),q=-Y/2,W=-V/2;e.selectAll("g:not(:first-child)").each((G,J,et)=>{let at=Q(et[J]),pt=at.attr("transform"),gt=0,Tt=0;if(pt){let Ct=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(pt);Ct&&(gt=parseFloat(Ct[1]),Tt=parseFloat(Ct[2]),at.attr("class").includes("attribute-name")?gt+=u:at.attr("class").includes("attribute-keys")?gt+=u+m:at.attr("class").includes("attribute-comment")&&(gt+=u+m+d))}at.attr("transform",`translate(${q+l/2+gt}, ${Tt+W+i.height+r/2})`)}),e.select(".name").attr("transform","translate("+-i.width/2+", "+(W+r/2)+")");let j=k.rectangle(q,W,Y,V,M),L=e.insert(()=>j,":first-child").attr("style",f.join("")),{themeVariables:F}=dt(),{rowEven:_,rowOdd:H,nodeBorder:X}=F;n.push(0);for(let[G,J]of p.entries()){let at=(G+1)%2===0&&J.yOffset!==0,pt=k.rectangle(q,i.height+W+J?.yOffset,Y,J?.rowHeight,rt(tt({},M),{fill:at?_:H,stroke:X}));e.insert(()=>pt,"g.label").attr("style",f.join("")).attr("class",`row-rect-${at?"even":"odd"}`)}let E=k.line(q,i.height+W,Y+q,i.height+W,M);e.insert(()=>E).attr("class","divider"),E=k.line(u+q,i.height+W,u+q,V+W,M),e.insert(()=>E).attr("class","divider"),D&&(E=k.line(u+m+q,i.height+W,u+m+q,V+W,M),e.insert(()=>E).attr("class","divider")),S&&(E=k.line(u+m+d+q,i.height+W,u+m+d+q,V+W,M),e.insert(()=>E).attr("class","divider"));for(let G of n)E=k.line(q,i.height+W+G,Y+q,i.height+W+G,M),e.insert(()=>E).attr("class","divider");if(A(t,L),c&&t.look!=="handDrawn"){let J=c.split(";")?.filter(et=>et.includes("stroke"))?.map(et=>`${et}`).join("; ");e.selectAll("path").attr("style",J??""),e.selectAll(".row-rect-even path").attr("style",c)}return t.intersect=function(G){return P.rect(t,G)},e})}b(Et,"erBox");function mt(a,c,s){return C(this,arguments,function*(y,t,g,o=0,l=0,r=[],f=""){let e=y.insert("g").attr("class",`label ${r.join(" ")}`).attr("transform",`translate(${o}, ${l})`).attr("style",f);t!==Nt(t)&&(t=Nt(t),t=t.replaceAll("<","<").replaceAll(">",">"));let i=e.node().appendChild(yield nt(e,t,{width:wt(t,g)+100,style:f,useHtmlLabels:g.htmlLabels},g));if(t.includes("<")||t.includes(">")){let n=i.children[0];for(n.textContent=n.textContent.replaceAll("<","<").replaceAll(">",">");n.childNodes[0];)n=n.childNodes[0],n.textContent=n.textContent.replaceAll("<","<").replaceAll(">",">")}let h=i.getBBox();if(ut(g.htmlLabels)){let n=i.children[0];n.style.textAlign="start";let p=Q(i);h=n.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}return h})}b(mt,"addText");function Us(r,f,a,c){return C(this,arguments,function*(y,t,g,o,l=g.class.padding??12){let s=o?0:3,e=y.insert("g").attr("class",T(t)).attr("id",t.domId||t.id),i=null,h=null,n=null,p=null,u=0,m=0,d=0;if(i=e.insert("g").attr("class","annotation-group text"),t.annotations.length>0){let v=t.annotations[0];yield vt(i,{text:`\xAB${v}\xBB`},0),u=i.node().getBBox().height}h=e.insert("g").attr("class","label-group text"),yield vt(h,t,0,["font-weight: bolder"]);let x=h.node().getBBox();m=x.height,n=e.insert("g").attr("class","members-group text");let D=0;for(let v of t.members){let B=yield vt(n,v,D,[v.parseClassifier()]);D+=B+s}d=n.node().getBBox().height,d<=0&&(d=l/2),p=e.insert("g").attr("class","methods-group text");let S=0;for(let v of t.methods){let B=yield vt(p,v,S,[v.parseClassifier()]);S+=B+s}let $=e.node().getBBox();if(i!==null){let v=i.node().getBBox();i.attr("transform",`translate(${-v.width/2})`)}return h.attr("transform",`translate(${-x.width/2}, ${u})`),$=e.node().getBBox(),n.attr("transform",`translate(0, ${u+m+l*2})`),$=e.node().getBBox(),p.attr("transform",`translate(0, ${u+m+(d?d+l*4:l*2)})`),$=e.node().getBBox(),{shapeSvg:e,bbox:$}})}b(Us,"textHelper");function vt(l,r,f){return C(this,arguments,function*(y,t,g,o=[]){let a=y.insert("g").attr("class","label").attr("style",o.join("; ")),c=dt(),s="useHtmlLabels"in t?t.useHtmlLabels:ut(c.htmlLabels)??!0,e="";"text"in t?e=t.text:e=t.label,!s&&e.startsWith("\\")&&(e=e.substring(1)),_t(e)&&(s=!0);let i=yield nt(a,Rt(bt(e)),{width:wt(e,c)+50,classes:"markdown-node-label",useHtmlLabels:s},c),h,n=1;if(s){let p=i.children[0],u=Q(i);n=p.innerHTML.split("
            ").length,p.innerHTML.includes("")&&(n+=p.innerHTML.split("").length-1);let m=p.getElementsByTagName("img");if(m){let d=e.replace(/]*>/g,"").trim()==="";yield Promise.all([...m].map(x=>new Promise(D=>{function S(){if(x.style.display="flex",x.style.flexDirection="column",d){let $=c.fontSize?.toString()??window.getComputedStyle(document.body).fontSize,B=parseInt($,10)*5+"px";x.style.minWidth=B,x.style.maxWidth=B}else x.style.width="100%";D(x)}b(S,"setupImage"),setTimeout(()=>{x.complete&&S()}),x.addEventListener("error",S),x.addEventListener("load",S)})))}h=p.getBoundingClientRect(),u.attr("width",h.width),u.attr("height",h.height)}else{o.includes("font-weight: bolder")&&Q(i).selectAll("tspan").attr("font-weight",""),n=i.children.length;let p=i.children[0];(i.textContent===""||i.textContent.includes(">"))&&(p.textContent=e[0]+e.substring(1).replaceAll(">",">").replaceAll("<","<").trim(),e[1]===" "&&(p.textContent=p.textContent[0]+" "+p.textContent.substring(1))),p.textContent==="undefined"&&(p.textContent=""),h=i.getBBox()}return a.attr("transform","translate(0,"+(-h.height/(2*n)+g)+")"),h.height})}b(vt,"addText");function Ks(y,t){return C(this,null,function*(){let g=U(),o=g.class.padding??12,l=o,r=t.useHtmlLabels??ut(g.htmlLabels)??!0,f=t;f.annotations=f.annotations??[],f.members=f.members??[],f.methods=f.methods??[];let{shapeSvg:a,bbox:c}=yield Us(y,t,g,r,l),{labelStyles:s,nodeStyles:e}=R(t);t.labelStyle=s,t.cssStyles=f.styles||"";let i=f.styles?.join(";")||e||"";t.cssStyles||(t.cssStyles=i.replaceAll("!important","").split(";"));let h=f.members.length===0&&f.methods.length===0&&!g.class?.hideEmptyMembersBox,n=w.svg(a),p=N(t,{});t.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let u=c.width,m=c.height;f.members.length===0&&f.methods.length===0?m+=l:f.members.length>0&&f.methods.length===0&&(m+=l*2);let d=-u/2,x=-m/2,D=n.rectangle(d-o,x-o-(h?o:f.members.length===0&&f.methods.length===0?-o/2:0),u+2*o,m+2*o+(h?o*2:f.members.length===0&&f.methods.length===0?-o:0),p),S=a.insert(()=>D,":first-child");S.attr("class","basic label-container");let $=S.node().getBBox();a.selectAll(".text").each((M,I,Y)=>{let V=Q(Y[I]),q=V.attr("transform"),W=0;if(q){let _=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(q);_&&(W=parseFloat(_[2]))}let j=W+x+o-(h?o:f.members.length===0&&f.methods.length===0?-o/2:0);r||(j-=4);let L=d;(V.attr("class").includes("label-group")||V.attr("class").includes("annotation-group"))&&(L=-V.node()?.getBBox().width/2||0,a.selectAll("text").each(function(F,_,H){window.getComputedStyle(H[_]).textAnchor==="middle"&&(L=0)})),V.attr("transform",`translate(${L}, ${j})`)});let v=a.select(".annotation-group").node().getBBox().height-(h?o/2:0)||0,B=a.select(".label-group").node().getBBox().height-(h?o/2:0)||0,k=a.select(".members-group").node().getBBox().height-(h?o/2:0)||0;if(f.members.length>0||f.methods.length>0||h){let M=n.line($.x,v+B+x+o,$.x+$.width,v+B+x+o,p);a.insert(()=>M).attr("class","divider").attr("style",i)}if(h||f.members.length>0||f.methods.length>0){let M=n.line($.x,v+B+k+x+l*2+o,$.x+$.width,v+B+k+x+o+l*2,p);a.insert(()=>M).attr("class","divider").attr("style",i)}if(f.look!=="handDrawn"&&a.selectAll("path").attr("style",i),S.select(":nth-child(2)").attr("style",i),a.selectAll(".divider").select("path").attr("style",i),t.labelStyle?a.selectAll("span").attr("style",t.labelStyle):a.selectAll("span").attr("style",i),!r){let M=RegExp(/color\s*:\s*([^;]*)/),I=M.exec(i);if(I){let Y=I[0].replace("color","fill");a.selectAll("tspan").attr("style",Y)}else if(s){let Y=M.exec(s);if(Y){let V=Y[0].replace("color","fill");a.selectAll("tspan").attr("style",V)}}}return A(t,S),t.intersect=function(M){return P.rect(t,M)},a})}b(Ks,"classBox");function te(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let l=t,r=t,f=20,a=20,c="verifyMethod"in t,s=T(t),e=y.insert("g").attr("class",s).attr("id",t.domId??t.id),i;c?i=yield lt(e,`<<${l.type}>>`,0,t.labelStyle):i=yield lt(e,"<<Element>>",0,t.labelStyle);let h=i,n=yield lt(e,l.name,h,t.labelStyle+"; font-weight: bold;");if(h+=n+a,c){let v=yield lt(e,`${l.requirementId?`ID: ${l.requirementId}`:""}`,h,t.labelStyle);h+=v;let B=yield lt(e,`${l.text?`Text: ${l.text}`:""}`,h,t.labelStyle);h+=B;let k=yield lt(e,`${l.risk?`Risk: ${l.risk}`:""}`,h,t.labelStyle);h+=k,yield lt(e,`${l.verifyMethod?`Verification: ${l.verifyMethod}`:""}`,h,t.labelStyle)}else{let v=yield lt(e,`${r.type?`Type: ${r.type}`:""}`,h,t.labelStyle);h+=v,yield lt(e,`${r.docRef?`Doc Ref: ${r.docRef}`:""}`,h,t.labelStyle)}let p=(e.node()?.getBBox().width??200)+f,u=(e.node()?.getBBox().height??200)+f,m=-p/2,d=-u/2,x=w.svg(e),D=N(t,{});t.look!=="handDrawn"&&(D.roughness=0,D.fillStyle="solid");let S=x.rectangle(m,d,p,u,D),$=e.insert(()=>S,":first-child");if($.attr("class","basic label-container").attr("style",o),e.selectAll(".label").each((v,B,k)=>{let M=Q(k[B]),I=M.attr("transform"),Y=0,V=0;if(I){let L=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(I);L&&(Y=parseFloat(L[1]),V=parseFloat(L[2]))}let q=V-u/2,W=m+f/2;(B===0||B===1)&&(W=Y),M.attr("transform",`translate(${W}, ${q+f})`)}),h>i+n+a){let v=x.line(m,d+i+n+a,m+p,d+i+n+a,D);e.insert(()=>v).attr("style",o)}return A(t,$),t.intersect=function(v){return P.rect(t,v)},e})}b(te,"requirementBox");function lt(y,t,g,o=""){return C(this,null,function*(){if(t==="")return 0;let l=y.insert("g").attr("class","label").attr("style",o),r=U(),f=r.htmlLabels??!0,a=yield nt(l,Rt(bt(t)),{width:wt(t,r)+50,classes:"markdown-node-label",useHtmlLabels:f,style:o},r),c;if(f){let s=a.children[0],e=Q(a);c=s.getBoundingClientRect(),e.attr("width",c.width),e.attr("height",c.height)}else{let s=a.children[0];for(let e of s.children)e.textContent=e.textContent.replaceAll(">",">").replaceAll("<","<"),o&&e.setAttribute("style",o);c=a.getBBox(),c.height+=6}return l.attr("transform",`translate(${-c.width/2},${-c.height/2+g})`),c.height})}b(lt,"addText");var Ne=b(y=>{switch(y){case"Very High":return"red";case"High":return"orange";case"Medium":return null;case"Low":return"blue";case"Very Low":return"lightblue"}},"colorFromPriority");function se(o,l,r){return C(this,arguments,function*(y,t,{config:g}){let{labelStyles:f,nodeStyles:a}=R(t);t.labelStyle=f||"";let c=10,s=t.width;t.width=(t.width??200)-10;let{shapeSvg:e,bbox:i,label:h}=yield O(y,t,T(t)),n=t.padding||10,p="",u;"ticket"in t&&t.ticket&&g?.kanban?.ticketBaseUrl&&(p=g?.kanban?.ticketBaseUrl.replace("#TICKET#",t.ticket),u=e.insert("svg:a",":first-child").attr("class","kanban-ticket-link").attr("xlink:href",p).attr("target","_blank"));let m={useHtmlLabels:t.useHtmlLabels,labelStyle:t.labelStyle||"",width:t.width,img:t.img,padding:t.padding||8,centerLabel:!1},d,x;u?{label:d,bbox:x}=yield Lt(u,"ticket"in t&&t.ticket||"",m):{label:d,bbox:x}=yield Lt(e,"ticket"in t&&t.ticket||"",m);let{label:D,bbox:S}=yield Lt(e,"assigned"in t&&t.assigned||"",m);t.width=s;let $=10,v=t?.width||0,B=Math.max(x.height,S.height)/2,k=Math.max(i.height+$*2,t?.height||0)+B,M=-v/2,I=-k/2;h.attr("transform","translate("+(n-v/2)+", "+(-B-i.height/2)+")"),d.attr("transform","translate("+(n-v/2)+", "+(-B+i.height/2)+")"),D.attr("transform","translate("+(n+v/2-S.width-2*c)+", "+(-B+i.height/2)+")");let Y,{rx:V,ry:q}=t,{cssStyles:W}=t;if(t.look==="handDrawn"){let j=w.svg(e),L=N(t,{}),F=V||q?j.path(yt(M,I,v,k,V||0),L):j.rectangle(M,I,v,k,L);Y=e.insert(()=>F,":first-child"),Y.attr("class","basic label-container").attr("style",W||null)}else{Y=e.insert("rect",":first-child"),Y.attr("class","basic label-container __APA__").attr("style",a).attr("rx",V??5).attr("ry",q??5).attr("x",M).attr("y",I).attr("width",v).attr("height",k);let j="priority"in t&&t.priority;if(j){let L=e.append("line"),F=M+2,_=I+Math.floor((V??0)/2),H=I+k-Math.floor((V??0)/2);L.attr("x1",F).attr("y1",_).attr("x2",F).attr("y2",H).attr("stroke-width","4").attr("stroke",Ne(j))}}return A(t,Y),t.height=k,t.intersect=function(j){return P.rect(t,j)},e})}b(se,"kanbanItem");function ee(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,halfPadding:f,label:a}=yield O(y,t,T(t)),c=r.width+10*f,s=r.height+8*f,e=.15*c,{cssStyles:i}=t,h=r.width+20,n=r.height+20,p=Math.max(c,h),u=Math.max(s,n);a.attr("transform",`translate(${-r.width/2}, ${-r.height/2})`);let m,d=`M0 0 a${e},${e} 1 0,0 ${p*.25},${-1*u*.1} a${e},${e} 1 0,0 ${p*.25},0 a${e},${e} 1 0,0 ${p*.25},0 @@ -25,7 +25,7 @@ import{a as At,b as Ot}from"./chunk-DRBE27N3.js";import{a as w}from"./chunk-PRKF a${e},${e} 1 0,0 ${-1*p*.1},${-1*u*.33} a${e*.8},${e*.8} 1 0,0 0,${-1*u*.34} a${e},${e} 1 0,0 ${p*.1},${-1*u*.33} - H0 V0 Z`;if(t.look==="handDrawn"){let x=w.svg(l),D=N(t,{}),S=x.path(d,D);m=l.insert(()=>S,":first-child"),m.attr("class","basic label-container").attr("style",st(i))}else m=l.insert("path",":first-child").attr("class","basic label-container").attr("style",o).attr("d",d);return m.attr("transform",`translate(${-p/2}, ${-u/2})`),A(t,m),t.calcIntersect=function(x,D){return P.rect(x,D)},t.intersect=function(x){return Z.info("Bang intersect",t,x),P.rect(t,x)},l})}b(ee,"bang");function ae(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,halfPadding:f,label:a}=yield O(y,t,T(t)),c=r.width+2*f,s=r.height+2*f,e=.15*c,i=.25*c,h=.35*c,n=.2*c,{cssStyles:p}=t,u,m=`M0 0 + H0 V0 Z`;if(t.look==="handDrawn"){let x=w.svg(l),D=N(t,{}),S=x.path(d,D);m=l.insert(()=>S,":first-child"),m.attr("class","basic label-container").attr("style",st(i))}else m=l.insert("path",":first-child").attr("class","basic label-container").attr("style",o).attr("d",d);return m.attr("transform",`translate(${-p/2}, ${-u/2})`),A(t,m),t.calcIntersect=function(x,D){return P.rect(x,D)},t.intersect=function(x){return Z.info("Bang intersect",t,x),P.rect(t,x)},l})}b(ee,"bang");function ae(y,t){return C(this,null,function*(){let{labelStyles:g,nodeStyles:o}=R(t);t.labelStyle=g;let{shapeSvg:l,bbox:r,halfPadding:f,label:a}=yield O(y,t,T(t)),c=r.width+2*f,s=r.height+2*f,e=.15*c,i=.25*c,h=.35*c,n=.2*c,{cssStyles:p}=t,u,m=`M0 0 a${e},${e} 0 0,1 ${c*.25},${-1*c*.1} a${h},${h} 1 0,1 ${c*.4},${-1*c*.1} a${i},${i} 1 0,1 ${c*.35},${c*.2} diff --git a/src/google/adk/cli/browser/chunk-YVVLWU7S.js b/src/google/adk/cli/browser/chunk-YVVLWU7S.js index 203c8675f1..cc35b07e1f 100644 --- a/src/google/adk/cli/browser/chunk-YVVLWU7S.js +++ b/src/google/adk/cli/browser/chunk-YVVLWU7S.js @@ -33,10 +33,10 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho vec2 v = ab*vec2(-cs.y,cs.x); w = w + dot(p-u,v)/(dot(p-u,u)+dot(v,v)); } - + // compute final point and distance float d = length(p-ab*vec2(cos(w),sin(w))); - + // return signed distance return (dot(p/ab,p/ab)>1.0) ? d : -d; } @@ -45,16 +45,16 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho uniform mat3 uPanZoomMatrix; uniform int uAtlasSize; - + // instanced in vec2 aPosition; // a vertex from the unit square - + in mat3 aTransform; // used to transform verticies, eg into a bounding box in int aVertType; // the type of thing we are rendering // the z-index that is output when using picking mode in vec4 aIndex; - + // For textures in int aAtlasId; // which shader unit/atlas to use in vec4 aTex; // x/y/w/h of texture in atlas @@ -74,7 +74,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho out vec4 vColor; out vec2 vPosition; // flat values are not interpolated - flat out int vAtlasId; + flat out int vAtlasId; flat out int vVertType; flat out vec2 vTopRight; flat out vec2 vBotLeft; @@ -82,7 +82,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho flat out vec4 vBorderColor; flat out vec2 vBorderWidth; flat out vec4 vIndex; - + void main(void) { int vid = gl_VertexID; vec2 position = aPosition; // TODO make this a vec3, simplifies some code below @@ -105,7 +105,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); } - else if(aVertType == `).concat(Gt," || aVertType == ").concat(pa,` + else if(aVertType == `).concat(Gt," || aVertType == ").concat(pa,` || aVertType == `).concat(sn," || aVertType == ").concat(ga,`) { // simple shapes // the bounding box is needed by the fragment shader @@ -135,7 +135,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho gl_Position = vec4(uPanZoomMatrix * vec3(point, 1.0), 1.0); vColor = aColor; - } + } else if(aVertType == `).concat(Xl,`) { vec2 pointA = aPointAPointB.xy; vec2 pointB = aPointAPointB.zw; @@ -184,7 +184,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho } vColor = aColor; - } + } else if(aVertType == `).concat(Ts,` && vid < 3) { // massage the first triangle into an edge arrow if(vid == 0) @@ -236,16 +236,16 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho `).concat(vm,` vec4 blend(vec4 top, vec4 bot) { // blend colors with premultiplied alpha - return vec4( + return vec4( top.rgb + (bot.rgb * (1.0 - top.a)), - top.a + (bot.a * (1.0 - top.a)) + top.a + (bot.a * (1.0 - top.a)) ); } vec4 distInterp(vec4 cA, vec4 cB, float d) { // interpolate color using Signed Distance // scale to the zoom level so that borders don't look blurry when zoomed in // note 1.5 is an aribitrary value chosen because it looks good - return mix(cA, cB, 1.0 - smoothstep(0.0, 1.5 / uZoom, abs(d))); + return mix(cA, cB, 1.0 - smoothstep(0.0, 1.5 / uZoom, abs(d))); } void main(void) { @@ -253,7 +253,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho // look up the texel from the texture unit `).concat(i.map(function(u){return"if(vAtlasId == ".concat(u,") outColor = texture(uTexture").concat(u,", vTexCoord);")}).join(` else `),` - } + } else if(vVertType == `).concat(Ts,`) { // mimics how canvas renderer uses context.globalCompositeOperation = 'destination-out'; outColor = blend(vColor, uBGColor); @@ -262,7 +262,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho else if(vVertType == `).concat(Gt,` && vBorderWidth == vec2(0.0)) { // simple rectangle with no border outColor = vColor; // unit square is already transformed to the rectangle, nothing else needs to be done } - else if(vVertType == `).concat(Gt," || vVertType == ").concat(pa,` + else if(vVertType == `).concat(Gt," || vVertType == ").concat(pa,` || vVertType == `).concat(sn," || vVertType == ").concat(ga,`) { // use SDF float outerBorder = vBorderWidth[0]; @@ -297,7 +297,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho vec4 outerColor = outerBorder == 0.0 ? vec4(0) : vBorderColor; vec4 innerBorderColor = blend(vBorderColor, vColor); outColor = distInterp(innerBorderColor, outerColor, d); - } + } else { vec4 outerColor; if(innerBorder == 0.0 && outerBorder == 0.0) { diff --git a/src/google/adk/cli/browser/index.html b/src/google/adk/cli/browser/index.html index a6c9b379f8..059998a4c2 100644 --- a/src/google/adk/cli/browser/index.html +++ b/src/google/adk/cli/browser/index.html @@ -23,17 +23,971 @@ - - + +